From cd94f17c0c9af392761a91a28f747df671f43488 Mon Sep 17 00:00:00 2001 From: Charles Xie Date: Thu, 26 Oct 2023 09:06:23 -0400 Subject: [PATCH] Updates --- asset-manifest.json | 6 +++--- index.html | 2 +- .../js/{main.d3157261.chunk.js => main.c62f7be7.chunk.js} | 4 ++-- ...ain.d3157261.chunk.js.map => main.c62f7be7.chunk.js.map} | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename static/js/{main.d3157261.chunk.js => main.c62f7be7.chunk.js} (81%) rename static/js/{main.d3157261.chunk.js.map => main.c62f7be7.chunk.js.map} (56%) diff --git a/asset-manifest.json b/asset-manifest.json index 37c6408c3..e930d1891 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "/aladdin/static/css/main.c1ee157d.chunk.css", - "main.js": "/aladdin/static/js/main.d3157261.chunk.js", - "main.js.map": "/aladdin/static/js/main.d3157261.chunk.js.map", + "main.js": "/aladdin/static/js/main.c62f7be7.chunk.js", + "main.js.map": "/aladdin/static/js/main.c62f7be7.chunk.js.map", "runtime-main.js": "/aladdin/static/js/runtime-main.b3c25317.js", "runtime-main.js.map": "/aladdin/static/js/runtime-main.b3c25317.js.map", "static/css/2.447301e6.chunk.css": "/aladdin/static/css/2.447301e6.chunk.css", @@ -203,6 +203,6 @@ "static/css/2.447301e6.chunk.css", "static/js/2.663ef815.chunk.js", "static/css/main.c1ee157d.chunk.css", - "static/js/main.d3157261.chunk.js" + "static/js/main.c62f7be7.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 9e4e81a5b..a906f5760 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Aladdin
\ No newline at end of file +Aladdin
\ No newline at end of file diff --git a/static/js/main.d3157261.chunk.js b/static/js/main.c62f7be7.chunk.js similarity index 81% rename from static/js/main.d3157261.chunk.js rename to static/js/main.c62f7be7.chunk.js index bea525d63..cd0654ebe 100644 --- a/static/js/main.d3157261.chunk.js +++ b/static/js/main.c62f7be7.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonpaladdin=this.webpackJsonpaladdin||[]).push([[0],{421:function(e){e.exports=JSON.parse('{"docid":"pSdH5rJWovu8hchgLSnsqT","time":"02/02/2023 12:24 pm","timestamp":1675358675337,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"timesPerHour":20,"date":"1/22/2022 10:15:00 AM","longitude":-71.3488548,"name":"default","address":"Natick, MA","ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"orthographic":false,"cameraZoom":28.63945562104857},"elements":[{"cy":1.9385448115528998,"name":"June","type":"Human","cz":1.1465644746167777e-15,"normal":[0,1,0],"cx":-2.72710574788732,"selected":false,"id":"8si9AKQwGf4sYiD91xfFr6","rotation":[0,0,0],"parentId":"Ground"}],"view":{"mapWeatherStations":false,"showGroundPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"groundPanelY":0,"yearlyLightSensorPanelY":0,"axes":true,"showHeliodonPanel":true,"showWeatherPanel":false,"dailyLightSensorPanelY":0,"mapType":"roadmap","groundImage":false,"autoRotate":false,"dailyLightSensorPanelX":0,"showYearlyLightSensorPanel":false,"weatherPanelY":0,"heliodonPanelX":-6,"showStickyNotePanel":true,"groundColor":"#16cda5","weatherPanelX":0,"heliodonPanelY":9,"groundPanelX":0,"shadowEnabled":true,"theme":"Default","heliodon":true,"stickyNotePanelY":0,"yearlyLightSensorPanelX":0,"showDailyLightSensorPanel":false,"mapZoom":16,"stickyNotePanelX":0,"cameraPosition":[-2.2645315712935465,-19.016408185270922,3.0537676736998205],"panCenter":[1.9284721678646957,1.0746189678250615,2.420128405670479],"orthographic":false,"enableRotate":true,"cameraZoom":24.55475326309651,"showInstructionPanel":false,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999799],"panCenter2D":[0,0,0],"showSunAngles":true,"stickyNotePanelRect":{"x":-5,"y":-2,"width":309,"height":64}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Sun angles relative to the ground"]}')},422:function(e){e.exports=JSON.parse('{"docid":"aLZxDeCyLDDueFWdBcXne3","time":"02/02/2023 12:27 pm","timestamp":1675358863088,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":0,"timesPerHour":6,"date":"9/22/2022, 3:00:00 PM","longitude":-71.3488548,"name":"default","address":"","ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"orthographic":false,"cameraZoom":28.63945562104857,"noAnimationForSensorDataCollection":true},"elements":[{"cy":-3.793749931074972,"name":"Jeanette","type":"Human","cz":0,"normal":[0,1,0],"cx":-1.8371287635005462,"selected":false,"id":"8si9AKQwGf4sYiD91xfFr6","rotation":[0,0,0],"parentId":"Ground","lx":0.4,"ly":0.6,"lz":1.62},{"type":"Foundation","cx":-0.02034256309656146,"cy":-0.0945631153454527,"cz":0.05,"lx":4.039349774896637,"ly":4.009416382499952,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"vtjS16tFJ2nQYaRPqaTXtD","textureType":"Foundation Texture #2"},{"type":"Sensor","cx":0.24583065540477922,"cy":-0.24570551313996075,"cz":0.5000000074505806,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vtjS16tFJ2nQYaRPqaTXtD","foundationId":"vtjS16tFJ2nQYaRPqaTXtD","id":"1RgbN67ETfax1aEC4UN1sd","selected":false}],"view":{"mapWeatherStations":false,"showGroundPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"groundPanelY":0,"yearlyLightSensorPanelY":5,"axes":true,"showHeliodonPanel":true,"showWeatherPanel":false,"dailyLightSensorPanelY":203,"mapType":"roadmap","groundImage":false,"autoRotate":false,"dailyLightSensorPanelX":-31,"showYearlyLightSensorPanel":true,"weatherPanelY":0,"heliodonPanelX":-5,"showStickyNotePanel":true,"groundColor":"#16cda5","weatherPanelX":0,"heliodonPanelY":4,"groundPanelX":0,"shadowEnabled":true,"theme":"Default","heliodon":true,"stickyNotePanelY":0,"yearlyLightSensorPanelX":-1,"showDailyLightSensorPanel":false,"mapZoom":16,"stickyNotePanelX":0,"cameraPosition":[14.252594110627898,-20.834202556609767,6.804345920821559],"panCenter":[0,0,0],"orthographic":false,"enableRotate":true,"cameraZoom":58.72652247402654,"showInstructionPanel":false,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999795],"panCenter2D":[0,0,0],"showSunAngles":true,"stickyNotePanelRect":{"x":1204,"y":154,"width":595,"height":199},"yearlyLightSensorPanelRect":{"x":-1284,"y":2,"width":600,"height":500},"yearlyLightSensorPanelShowDaylight":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["The solar radiation at different locations of the Earth in different seasons is largely responsible for local climate. Overall, every place on the Earth has about the same hours of daylight in total (ideally 12\xd7365=4,380 hours), regardless of where it is. However, the distribution throughout the year is vastly different, resulting in large temperature variations across the globe. You can change the latitude to investigate these relationships. Make sure to refresh the graph after changing any variables."]}')},423:function(e){e.exports=JSON.parse('{"docid":"3DwyXjJjUExjZ1f5APPdnu","time":"11/13/2022 04:59 pm","timestamp":1668376781695,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"date":"6/22/2022 1:00:00 PM","timesPerHour":6,"address":"Natick, MA","latitude":42.2844063,"longitude":-71.3488548,"name":"default","orthographic":false,"cameraZoom":35,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"noAnimationForSensorDataCollection":true,"noAnimationForHeatmapSimulation":true},"elements":[{"selected":false,"cz":-0.00999999999999913,"cx":-0.2955982837076121,"type":"Human","id":"3NsNQgPftGsbYSoSRa2zV4","normal":[0,1,0],"cy":3.9255960830681698,"name":"Jack","rotation":[0,0,0],"parentId":"Ground","lx":0.42,"ly":0.42,"lz":1.8},{"selected":false,"cy":4.081504375344256,"name":"Jacqueline","rotation":[0,0,0],"normal":[0,1,0],"id":"xaNFgEDtpNwZNyUWnndg4x","cz":-0.009999999999999095,"type":"Human","cx":2.399220108700476,"parentId":"Ground","lx":0.43,"ly":0.6,"lz":1.78},{"cx":0.20566332108722207,"color":"gray","cz":2,"type":"Cuboid","lz":4,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":3.646712311386908,"cy":0.10935014088128625,"rotation":[0,0,0],"lx":2.2290047878920136,"id":"2QtCNEmEF6Mcs3vbbR96ZT","selected":false,"parentId":"Ground"},{"ly":0.1,"selected":false,"type":"Sensor","showLabel":true,"normal":[0,0,1],"lz":0.01,"rotation":[0,0,0],"lx":0.1,"cz":0.5,"cx":0.03109721392634064,"cy":0.16878784903489202,"id":"iqgmPt2Nm3r4bW8A7g6DJy","label":"Top","parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"label":"North","rotation":[0,0,0],"ly":0.1,"normal":[0,1,0],"cy":0.4999999988722325,"type":"Sensor","showLabel":true,"selected":false,"id":"soQWet6PH9YYEVPLyKPtZ1","cz":-0.036155842645941405,"lx":0.1,"lz":0.01,"cx":-0.0014535790327764226,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"normal":[1,0,0],"cz":0.012842850721372034,"cy":-0.02894757303561696,"ly":0.1,"lz":0.01,"label":"East","id":"g3pxtSA3CsXPiogBgtEeYs","lx":0.1,"showLabel":true,"rotation":[0,0,0],"type":"Sensor","cx":0.5000000161579515,"selected":false,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"lz":0.01,"showLabel":true,"rotation":[0,0,0],"cy":-0.4999999988722335,"selected":false,"id":"1GCXGRbm6nuTH23uA8Yngz","cx":0.028086152131634783,"normal":[0,-1,0],"cz":-0.16060425332465766,"ly":0.1,"type":"Sensor","label":"South","lx":0.1,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"selected":false,"ly":0.1,"normal":[-1,0,0],"rotation":[0,0,0],"id":"9Aqk7YM1qj7eBSDfhRzr51","cy":-0.0010171489984738787,"label":"West","cz":0.04694614030299604,"cx":-0.5000000161579532,"type":"Sensor","showLabel":true,"lz":0.01,"lx":0.1,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"}],"view":{"showDailyLightSensorPanel":true,"showYearlyLightSensorPanel":false,"autoRotate":false,"showGroundPanel":false,"yearlyLightSensorPanelY":70,"stickyNotePanelX":6,"mapType":"roadmap","weatherPanelY":0,"shadowEnabled":true,"theme":"Default","stickyNotePanelY":0,"mapWeatherStations":false,"groundColor":"#16cda5","heliodon":true,"dailyLightSensorPanelX":-19,"axes":true,"showWeatherPanel":false,"dailyLightSensorPanelY":15,"mapTilt":0,"heliodonPanelX":-1235,"groundPanelY":0,"heliodonPanelY":7,"groundImage":false,"mapZoom":16,"showStickyNotePanel":true,"groundPanelX":0,"weatherPanelX":0,"yearlyLightSensorPanelX":-905,"showHeliodonPanel":false,"cameraPosition":[11.69562560736218,15.284097405092108,4.526997191755329],"panCenter":[-2.432389491951708,0.8034413072625061,1.0138875329134873],"orthographic":false,"enableRotate":true,"cameraZoom":28.63945562104857,"cameraPosition2D":[0,-0.00004000177797536253,39.99999999997991],"panCenter2D":[0,0,0],"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar radiation to a box\\n\\nThis model shows the solar radiation the five sides (top, west, east, south, and north sides) of a box receives. There is a sensor on each side. Analyze the daily and annual sensor data to compare the solar radiation the five sides receive.\\n\\nYou can also change the day and the location to investigate the dependency of the results on these factors. "]}')},424:function(e){e.exports=JSON.parse('{"docid":"9q5sS1hxGDArNFtMUxxGLt","time":"02/02/2023 12:31 pm","timestamp":1675359088220,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"timesPerHour":20,"date":"2/22/2022 9:45:00 AM","longitude":-71.3488548,"name":"default","address":"Natick, MA","ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"orthographic":false,"cameraZoom":28.63945562104857},"elements":[{"cy":0.9214233571448283,"name":"Jaya","type":"Human","cz":0.05000000074505806,"normal":[0,1,0],"cx":-2.0622287048965853,"selected":false,"id":"8si9AKQwGf4sYiD91xfFr6","rotation":[0,0,0],"parentId":"73EHGXQZFsvacbt1n2ck3h","lx":0.6,"ly":0.42,"lz":1.55},{"rotation":[0,0,0],"normal":[0,0,1],"lx":8.151162622676603,"ly":6.576493454880806,"id":"73EHGXQZFsvacbt1n2ck3h","selected":false,"cz":0.05,"cy":1.1027590009475272,"cx":-0.9582675975183035,"lz":0.1,"type":"Foundation","parentId":"Ground"},{"poleSpacing":2,"label":"Solar Panel","showLabel":false,"lx":0.99,"drawSunBeam":true,"type":"Solar Panel","trackerType":"None","relativeAzimuth":0,"lz":0.05,"normal":[0,0,1],"cy":-0.16505049820470327,"cx":0.11464240173253676,"cz":0.5000000074505806,"poleRadius":0.05,"ly":1.65,"poleHeight":0,"rotation":[0,0,0],"selected":false,"orientation":"Portrait","tiltAngle":0,"id":"5QH64n4W7t2nwnWmzmGyMg","parentId":"73EHGXQZFsvacbt1n2ck3h","foundationId":"73EHGXQZFsvacbt1n2ck3h","pvModelName":"SPR-X21-335-BLK"},{"lz":0.01,"ly":0.1,"cx":0.1375052960984675,"showLabel":false,"id":"vPAwDhHdD9bH57J7RhabCf","cy":0.12369628620569162,"selected":false,"cz":0.5000000074505806,"type":"Sensor","normal":[0,0,1],"lx":0.1,"rotation":[0,0,0],"parentId":"73EHGXQZFsvacbt1n2ck3h","foundationId":"73EHGXQZFsvacbt1n2ck3h"}],"view":{"mapWeatherStations":false,"showGroundPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"groundPanelY":0,"yearlyLightSensorPanelY":0,"axes":true,"showHeliodonPanel":true,"showWeatherPanel":false,"dailyLightSensorPanelY":0,"mapType":"roadmap","groundImage":false,"autoRotate":false,"dailyLightSensorPanelX":0,"showYearlyLightSensorPanel":false,"weatherPanelY":0,"heliodonPanelX":-6,"showStickyNotePanel":true,"groundColor":"#68ccca","weatherPanelX":0,"heliodonPanelY":9,"groundPanelX":0,"shadowEnabled":true,"theme":"Default","heliodon":true,"stickyNotePanelY":0,"yearlyLightSensorPanelX":0,"showDailyLightSensorPanel":false,"mapZoom":16,"stickyNotePanelX":0,"cameraPosition":[-5.789682038682944,18.727459047471708,4.434763103599393],"panCenter":[-1.75129140268729,-0.10770909213304464,1.3605382204171563],"orthographic":false,"enableRotate":true,"cameraZoom":24.55475326309651,"showInstructionPanel":false,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999799],"panCenter2D":[0,0,0],"stickyNotePanelRect":{"x":0,"y":0,"width":473,"height":61}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Test if the sun beam aligns with the heliodon correctly"]}')},425:function(e){e.exports=JSON.parse('{"docid":"a23ZVUe81EjtB3oPinKZm4","time":"02/02/2023 12:19 pm","timestamp":1675358372271,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2775281,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3468091,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA, USA","date":"6/15/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.0145505850910366,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground","color":"#999999"},{"rotation":[0,0,0],"normal":[0,0,1],"showLabel":true,"label":"Monocrystalline","cy":-0.27899190547936026,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"cz":0.5000000074505806,"type":"Solar Panel","id":"c2J7QZr1z68dpk33yTT2Sd","orientation":"Landscape","cx":0.008285803864999835,"relativeAzimuth":0,"trackerType":"None","poleSpacing":3,"selected":false,"lz":0.046,"lx":17.138,"poleHeight":1,"drawSunBeam":false,"ly":2.092,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X21-335-BLK"},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":1.984,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":true,"label":"Polycrystalline","tiltAngle":0.5235987755982988,"poleSpacing":3,"rotation":[0,0,0],"lx":17.712,"selected":false,"orientation":"Landscape","cx":0.0011144506933526612,"relativeAzimuth":0,"cy":0.010234323153061437,"poleHeight":1,"drawSunBeam":false,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-355P-FG"},{"poleRadius":0.05,"type":"Solar Panel","lx":18.081,"lz":0.046,"relativeAzimuth":0,"drawSunBeam":false,"rotation":[0,0,0],"ly":2.464,"normal":[0,0,1],"poleSpacing":3,"cx":0.003982991962011493,"trackerType":"None","cy":0.32738584282585487,"label":"Thin Film","cz":0.5000000074506161,"orientation":"Landscape","showLabel":true,"selected":false,"poleHeight":1,"tiltAngle":0.5235987755982988,"id":"mAv2C19w4RJA4u6knYxU3u","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"FS-6430"},{"type":"Human","name":"Justin","cx":-0.6422253837185492,"cy":-6.097930974223568,"cz":0.05000000074505806,"lx":0.6,"lz":1.755,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmVJY65HF3sgVftctUAMHa","selected":false,"ly":0.42}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Forest","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[6.231682260523529,-11.839635427091224,3.4189848625017474],"panCenter":[1.5940644020050898,-0.07013351095627554,0.6762754823912617],"orthographic":false,"enableRotate":true,"cameraZoom":37.01235612443422,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.1982070075600382,150],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"waterSurface":false,"showMapPanel":false,"mapPanelX":175,"mapPanelY":53,"weatherPanelRect":{"x":696,"y":52,"width":500,"height":500},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-2,"y":0,"width":200,"height":65}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar panel types"]}')},426:function(e){e.exports=JSON.parse('{"docid":"wFMNzt7sPEDjKGAPcESDBP","time":"08/30/2023 08:36 am","timestamp":1693399003790,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.3600825,"pvGridCellSize":0.25,"timesPerHour":1,"longitude":-71.0588801,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Boston, MA, USA","date":"6/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"countryCode":"US"},"elements":[{"cy":-0.033179790625714745,"normal":[0,0,1],"lz":0.1,"ly":16.949918527981186,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.017129111403884067,"cz":0.05,"rotation":[0,0,0],"lx":37.87324352407775,"selected":false,"parentId":"Ground","color":"#16a5a5","label":""},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":2.132,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":true,"label":"E-W","tiltAngle":1.5707963267948966,"poleSpacing":2.1,"rotation":[0,0,0],"lx":10.48,"selected":false,"orientation":"Portrait","cx":-0.20024728670215317,"relativeAzimuth":-1.5707963267948966,"cy":-0.0004001413797904696,"poleHeight":2,"drawSunBeam":false,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS3W-420MB-AG","dailyYield":27.769005901292118},{"type":"Human","name":"Justin","cx":-0.8077148464578228,"cy":-2.467214041682034,"cz":0.05000000074505895,"lx":0.6,"lz":1.755,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmVJY65HF3sgVftctUAMHa","selected":false,"ly":0.42},{"type":"Solar Panel","pvModelName":"CS3W-420MB-AG","cx":0.19919037937422715,"cy":-0.0004001413797904696,"cz":0.5000000074505806,"lx":10.48,"ly":2.132,"lz":0.046,"trackerType":"None","tiltAngle":-1.5707963267948966,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":2,"poleSpacing":2.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Foundation","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oQUmi4HfhmDhT2fedCAHBP","selected":false,"dailyYield":17.55726336493663,"label":"N-S"}],"sceneRadius":24,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Mountain","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-939,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":49,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":true,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[9.42333778357062,-26.00860153882541,4.957120957652498],"panCenter":[9.680010046024961,1.8911434375133904,3.488277959545367],"orthographic":false,"enableRotate":true,"cameraZoom":19.000000000000004,"showInstructionPanel":false,"cameraPosition2D":[6.40968432574854,1.6481778498093007,150],"panCenter2D":[6.40968432574854,1.649178227254012,0.0000023981152496769078],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"waterSurface":false,"showMapPanel":false,"mapPanelX":39,"mapPanelY":49,"weatherPanelRect":{"x":696,"y":52,"width":500,"height":500},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-2,"y":0,"width":200,"height":65},"navigationView":false},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":["Bifacial solar panels"],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},427:function(e){e.exports=JSON.parse('{"docid":"fXAaqcjQbaBomkkTcKkuR5","time":"08/31/2023 10:18 am","timestamp":1693491481113,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.3600825,"pvGridCellSize":0.25,"timesPerHour":1,"longitude":-71.0588801,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Boston, MA, USA","date":"6/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"countryCode":"US","daysPerYear":12},"elements":[{"cy":-0.033179790625714745,"normal":[0,0,1],"lz":0.1,"ly":16.949918527981186,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.017129111403884067,"cz":0.05,"rotation":[0,0,0],"lx":37.87324352407775,"selected":false,"parentId":"Ground","color":"#666666","label":""},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":2.132,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":true,"label":"Bifacial","tiltAngle":0.6981317007977318,"poleSpacing":3,"rotation":[0,0,0],"lx":11.528,"selected":false,"orientation":"Portrait","cx":-0.20024728670215317,"relativeAzimuth":0,"cy":-0.0004001413797904696,"poleHeight":1.5,"drawSunBeam":false,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS3W-445MB-AG","dailyYield":8.868699562970985,"yearlyYield":7933.919486524438},{"type":"Human","name":"Justin","cx":-0.8077148464578228,"cy":-2.467214041682034,"cz":0.05000000074505895,"lx":0.6,"lz":1.755,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmVJY65HF3sgVftctUAMHa","selected":false,"ly":0.42},{"type":"Solar Panel","pvModelName":"CS3W-440MS","cx":0.19919037937422715,"cy":-0.0004001413797904696,"cz":0.5000000074505806,"lx":11.528,"ly":2.108,"lz":0.046,"trackerType":"None","tiltAngle":0.6981317007977318,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.5,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Foundation","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oQUmi4HfhmDhT2fedCAHBP","selected":false,"dailyYield":6.700357358830137,"label":"Monofacial","yearlyYield":6331.051197253751,"drawSunBeam":false}],"sceneRadius":24,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Mountain","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-939,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":true,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":49,"groundColor":"#194d33","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[21.044833876539915,-19.158030778662997,1.9640239249677898],"panCenter":[8.779754971790968,7.5724725159534465,1.9640239249677898],"orthographic":false,"enableRotate":true,"cameraZoom":19.000000000000004,"showInstructionPanel":false,"cameraPosition2D":[6.40968432574854,1.6481778498093007,150],"panCenter2D":[6.40968432574854,1.649178227254012,0.0000023981152496769078],"dailyPvYieldPanelRect":{"x":-1103,"y":47,"width":600,"height":400},"waterSurface":false,"showMapPanel":false,"mapPanelX":39,"mapPanelY":49,"weatherPanelRect":{"x":696,"y":52,"width":500,"height":500},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-2,"y":0,"width":265,"height":96},"navigationView":false,"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":true,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":["Comparing the annual outputs of bifacial and monofacial solar panels"],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},428:function(e){e.exports=JSON.parse('{"docid":"mxcpjFL7wwjT6kUG3dgBwT","time":"02/04/2023 01:21 pm","timestamp":1675534888279,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"3/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":true,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":true,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":true,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.25,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":3.22609431418537,"leftJoints":["1k67G1W1gvb3E7EbmbG1h1"],"rightJoints":["uytQSeUom5oDsFC3PKa7q8"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"u1AdedeCmmKa3QYfwjJ4ya","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":3.22609431418537,"rightRoofHeight":3.22609431418537,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.22609431418537,"rightTopPartialHeight":3.22609431418537},{"type":"Window","cx":-0.25833333333333336,"cy":-1.3376344861350336e-15,"cz":-0.08,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8KuTFKVbnS9JsUhgiz6ayk","parentId":"u1AdedeCmmKa3QYfwjJ4ya","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.26666666666666666,"cy":-1.1010413489448665e-14,"cz":-0.08,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2ddK5UqQWy74ghKtND3in4","parentId":"u1AdedeCmmKa3QYfwjJ4ya","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3.22609431418537,"leftJoints":["tKvexMf8zrvPgydcZb5VYA"],"rightJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"1k67G1W1gvb3E7EbmbG1h1","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":3.22609431418537,"rightRoofHeight":3.22609431418537,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.22609431418537,"rightTopPartialHeight":3.22609431418537},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3.22609431418537,"leftJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"rightJoints":["tKvexMf8zrvPgydcZb5VYA"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"uytQSeUom5oDsFC3PKa7q8","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":3.22609431418537,"rightRoofHeight":3.22609431418537,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.22609431418537,"rightTopPartialHeight":3.22609431418537},{"type":"Window","cx":0.3466666666666667,"cy":0,"cz":-0.059131688577327556,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ffkLQGy3NT64UfpCw11G41","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.10666666666666667,"cy":0,"cz":-0.059131688577327556,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gNMVvT81stFdLZCLrqUQZf","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.13333333333333333,"cy":0,"cz":-0.059131688577327556,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tVsnXCNKFAXpT1tvrhqYrT","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.36000000000000004,"cy":0,"cz":-0.059131688577327556,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5bfnZWdB6epkk2c8Lmex9Z","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3.22609431418537,"leftJoints":["uytQSeUom5oDsFC3PKa7q8"],"rightJoints":["1k67G1W1gvb3E7EbmbG1h1"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"tKvexMf8zrvPgydcZb5VYA","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":3.22609431418537,"rightRoofHeight":3.22609431418537,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.22609431418537,"rightTopPartialHeight":3.22609431418537},{"type":"Window","cx":-0.375,"cy":0,"cz":0,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aScdMHKjqapGhvxSXnrdVS","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.25,"cy":0,"cz":0,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"94qFJLPpyieU8kH3r8ea1u","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.24999999999999992,"cy":0,"cz":0,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hqJtpQuGAWonh9XMck7DkQ","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.37499999999999994,"cy":0,"cz":0,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iepBWG7Nk7RRKfgVSDffBC","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-0.07737809374999927,"cy":-0.08634488504745477,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.08065235785463425,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["tKvexMf8zrvPgydcZb5VYA"],"textureType":"Roof Texture Default","color":"#666666","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"45NB7k7GYboywbxoXsYHLH","leftRidgeLength":3,"rightRidgeLength":3,"label":"","rise":1.3492858897703286,"ceiling":false},{"type":"Door","cx":0.00416666666666667,"cy":0,"cz":-0.125,"lx":0.24166666666666667,"ly":0,"lz":0.75,"textureType":"Door Texture #5","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"bm1UTSxwjiN1iZGr4Z4Fm6","doorType":"Default","archHeight":1,"filled":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.045101456155734465,"cy":-0.1728550176508481,"cz":3.912059639775531,"lx":1.558,"ly":1.046,"lz":0.046,"showLabel":true,"normal":[0,-0.26053732960492465,0.9654637745054627],"rotation":[0.26357871191724236,0,0],"color":"#fff","parentType":"Roof","parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"hggpkWHD6D2DWRepcABzSN","selected":false,"dailyYield":1.1606630204047466,"yearlyYield":14.01350339573908,"label":"S","labelSize":0.4},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.04923325035798107,"cy":0.23033266020936075,"cz":4.048748074874304,"lx":1.558,"ly":1.046,"lz":0.046,"showLabel":true,"normal":[1.836536775249149e-17,0.26053732960492476,0.9654637745054627],"rotation":[0.2635787119172426,0,3.141592653589793],"color":"#fff","parentType":"Roof","parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"3AjZD5PGir6Pw6qNxAXT2v","selected":false,"dailyYield":0.7689476441385455,"yearlyYield":9.02911259075203,"label":"N","labelSize":0.4},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.23435630964973508,"cy":0.03020266603782977,"cz":3.927707691404531,"lx":1.558,"ly":1.046,"lz":0.046,"showLabel":true,"normal":[-0.3976643293667701,3.3320459964913965e-17,0.9175309701308599],"rotation":[0.4089698333626983,0,4.71238898038469],"color":"#fff","parentType":"Roof","parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"dfe7nQ9k8jDK91KdkmUEv6","selected":false,"dailyYield":0.9541736397038687,"yearlyYield":11.32280863910204,"label":"W","labelSize":0.4},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.3049880725182647,"cy":0.048385609165732826,"cz":3.978511539183477,"lx":1.558,"ly":1.046,"lz":0.046,"showLabel":true,"normal":[0.39766432936677054,-1.33281839859656e-16,0.9175309701308599],"rotation":[0.40896983336269876,0,1.5707963267948961],"color":"#fff","parentType":"Roof","parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"1dU1iCu9PPq5BqZD1KErE7","selected":false,"dailyYield":0.9576426115274149,"yearlyYield":11.37252332042091,"label":"E","labelSize":0.4},{"type":"Sensor","cx":0.057157621054107106,"cy":0.14033655142046375,"cz":4.4036437311884296,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0,0.2605373296049247,0.9654637745054626],"rotation":[0.2635787119172426,0,3.141592653589793],"parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"mKDuzWBHjARCKjue8riAq8","selected":false,"label":"N"},{"type":"Sensor","cx":0.05632462642172124,"cy":-0.03881517090426316,"cz":4.440639819780413,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0,-0.26053732960492465,0.9654637745054627],"rotation":[0.26357871191724236,0,0],"parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"qMhiLQRXRChHGtKoRd73LF","selected":false,"label":"S"},{"type":"Sensor","cx":0.25193424207044157,"cy":0.045340891802389115,"cz":4.396078903758752,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0.39766432936677054,-1.33281839859656e-16,0.9175309701308599],"rotation":[0.40896983336269876,0,1.5707963267948961],"parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"3DwwhpFKYxSqcDS4CihiGw","selected":false,"label":"E"},{"type":"Sensor","cx":-0.1790489651075926,"cy":0.040907220548995316,"cz":4.363011644147998,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[-0.3976643293667701,3.3320459964913965e-17,0.9175309701308599],"rotation":[0.4089698333626983,0,4.71238898038469],"parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"72Y7F2N3gynqymAnAg1DcZ","selected":false,"label":"W"}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[3.096291394829855,-4.886200526627762,20.956812400919997],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.847108697996333,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":true,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.5949692122407761,0.408443644397781,1.6485310965583475],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":4,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"dailyPvYieldPanelRect":{"x":-25,"y":27,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyLightSensorPanelRect":{"x":-1275,"y":17,"width":600,"height":360},"stickyNotePanelRect":{"x":-4,"y":-3,"width":303,"height":64}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar panels on different sides of a roof"]}')},429:function(e){e.exports=JSON.parse('{"docid":"4FPGPRyja1jZsFg1c9iXEn","time":"02/19/2023 11:51 am","timestamp":1676825516232,"userid":"HPwaZxo6jaPjQcD6cBGUWPpQkVw2","owner":null,"email":null,"world":{"pvGridCellSize":0.5,"sutGridCellSize":1,"noAnimationForHeatmapSimulation":false,"latitude":42.30152633098348,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"name":"default","highestTemperatureTimeInMinutes":900,"daysPerYear":12,"date":"5/1/2023, 8:30:00 AM","sutDaysPerYear":4,"timesPerHour":4,"cspTimesPerHour":4,"ground":{"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05},"cspGridCellSize":0.5,"noAnimationForSolarUpdraftTowerSimulation":false,"noAnimationForSolarPanelSimulation":false,"dustLoss":0.05,"sutTimesPerHour":4,"address":"Quincy, MA, USA","cspDaysPerYear":4,"diurnalTemperatureModel":1,"solarRadiationHeatmapGridCellSize":1.5,"noAnimationForThermalSimulation":false,"airAttenuationCoefficient":0.01,"noAnimationForSensorDataCollection":false,"airConvectiveCoefficient":5,"longitude":-71.04686341053608},"elements":[{"solarUpdraftTower":{},"textureType":"No Foundation Texture","lx":212.5285321639104,"rotation":[0,0,0],"solarPowerTower":{},"cx":-10.534022898559044,"id":"m2Y8UkiEpzxPgEaP4XFVt6","cz":0.05,"ly":289.40841858160877,"cy":-5.174607839650079,"lz":0.1,"hvacSystem":{"thermostatSetpoint":20},"parentId":"Ground","solarAbsorberPipe":{},"type":"Foundation","normal":[0,0,1],"color":"#808080","selected":false},{"lz":0.4,"cx":0,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","cy":0,"vertices":[{"y":-0.015548960261952672,"x":-0.13409964163315105},{"x":0.1599785198430574,"y":0.4768347813665486},{"y":0.4768347813665486,"x":0.3034886626434471},{"x":0.34113066731240177,"y":0.43191556283201865},{"x":0.3764200466895468,"y":0.41463894031873794},{"y":0.35762608602491147,"x":0.37406742139773713},{"x":0.2917255361843988,"y":0.23496206618061816},{"y":0.1710385628814794,"x":0.2987834120598278},{"x":0.2799624097253504,"y":0.11402570858765293},{"y":0.006910649005312299,"x":0.22585202801372808},{"x":0.1529206439676284,"y":-0.04146389403187379},{"y":-0.06219584104781069,"x":0.1458627680921994},{"y":-0.06565116555046684,"x":0.09175238638057703},{"y":-0.08292778806374758,"x":0.06587350817067068},{"x":-0.08234188521333836,"y":-0.08292778806374758}],"ly":0.4,"lx":0.4,"color":"#ffffff","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","id":"5DXDSqQGwG9HHBGtTSMivo","type":"Polygon","filled":true,"lineColor":"#b3b3b3","rotation":[0,0,0],"selectedIndex":10,"normal":[0,0,1],"opacity":0,"selected":false,"cz":0},{"rotation":[0,0,0],"showLabel":false,"poleRadius":0.05,"poleSpacing":3,"trackerType":"None","referenceId":"5DXDSqQGwG9HHBGtTSMivo","id":"39YHB9jsen7civ3YRJKQCC","cy":-0.06921706043720798,"drawSunBeam":false,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","frameColor":"white","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","orientation":"Portrait","normal":[0,0,1],"color":"#fff","selected":false,"relativeAzimuth":0,"type":"Solar Panel","cx":-0.0044720631905931785,"poleHeight":1,"tiltAngle":0.5235987755982988,"lx":31.744,"pvModelName":"CS6X-355P-FG","lz":0.006,"cz":0.1,"ly":3.936},{"normal":[0,0,1],"tiltAngle":0.5235987755982988,"cy":-0.04416595779295089,"lx":50.592,"cz":0.1,"rotation":[0,0,0],"drawSunBeam":false,"poleRadius":0.05,"orientation":"Portrait","lz":0.006,"type":"Solar Panel","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","selected":false,"trackerType":"None","referenceId":"5DXDSqQGwG9HHBGtTSMivo","ly":3.936,"id":"wRpEM8qhuhZqcTqN2dpgxk","cx":0.020668929177468376,"pvModelName":"CS6X-355P-FG","showLabel":false,"color":"#fff","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"frameColor":"white","poleSpacing":3,"poleHeight":1},{"pvModelName":"CS6X-355P-FG","trackerType":"None","tiltAngle":0.5235987755982988,"selected":false,"color":"#fff","poleSpacing":3,"orientation":"Portrait","frameColor":"white","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","drawSunBeam":false,"cy":-0.019114855148693807,"relativeAzimuth":0,"showLabel":false,"cx":0.026370111541441255,"normal":[0,0,1],"cz":0.1,"lz":0.006,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","rotation":[0,0,0],"poleRadius":0.05,"type":"Solar Panel","ly":3.936,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","poleHeight":1,"id":"tD1s9u51ND5RmtjGVXGCLf","lx":61.504},{"cz":0.1,"tiltAngle":0.5235987755982988,"frameColor":"white","id":"uqbw8SLNidH2HVf3A3aEpb","poleHeight":1,"pvModelName":"CS6X-355P-FG","lx":68.448,"relativeAzimuth":0,"showLabel":false,"type":"Solar Panel","lz":0.006,"drawSunBeam":false,"poleRadius":0.05,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","selected":false,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","cy":0.005936247495563277,"rotation":[0,0,0],"ly":3.936,"trackerType":"None","orientation":"Portrait","color":"#fff","cx":0.04797937239367053,"poleSpacing":3,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1]},{"frameColor":"white","cz":0.1,"trackerType":"None","type":"Solar Panel","ly":3.936,"id":"abu8rTHpebENbtwLNiH7VV","selected":false,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"tiltAngle":0.5235987755982988,"drawSunBeam":true,"pvModelName":"CS6X-355P-FG","lz":0.006,"cx":0.06772862843868938,"color":"#fff","showLabel":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1],"relativeAzimuth":0,"cy":0.03098735013982036,"poleSpacing":3,"orientation":"Portrait","rotation":[0,0,0],"lx":68.448,"poleRadius":0.05},{"drawSunBeam":false,"cx":0.0815369877932561,"poleHeight":1,"lx":68.448,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","trackerType":"None","cy":0.056038452784077444,"id":"nZ63hCPNboQvjJjFBKXPux","pvModelName":"CS6X-355P-FG","tiltAngle":0.5235987755982988,"selected":false,"normal":[0,0,1],"cz":0.1,"showLabel":false,"relativeAzimuth":0,"ly":3.936,"rotation":[0,0,0],"frameColor":"white","poleSpacing":3,"color":"#fff","orientation":"Portrait","poleRadius":0.05,"lz":0.006,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","referenceId":"5DXDSqQGwG9HHBGtTSMivo","type":"Solar Panel"},{"lz":0.006,"cy":0.08108955542833453,"poleRadius":0.05,"trackerType":"None","poleHeight":1,"cx":0.09534534714782292,"cz":0.1,"normal":[0,0,1],"relativeAzimuth":0,"frameColor":"white","id":"hif4KqE4YP3kUVrrgkfMhx","ly":3.936,"showLabel":false,"lx":67.456,"orientation":"Portrait","selected":false,"color":"#fff","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","drawSunBeam":false,"tiltAngle":0.5235987755982988,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","pvModelName":"CS6X-355P-FG","poleSpacing":3,"rotation":[0,0,0],"referenceId":"5DXDSqQGwG9HHBGtTSMivo","type":"Solar Panel"},{"relativeAzimuth":0,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","selected":false,"tiltAngle":0.5235987755982988,"ly":3.936,"cy":0.10614065807259161,"orientation":"Portrait","color":"#fff","cx":0.1091537065023897,"trackerType":"None","showLabel":false,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":67.456,"poleRadius":0.05,"pvModelName":"CS6X-355P-FG","rotation":[0,0,0],"poleSpacing":3,"lz":0.006,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"cz":0.1,"id":"qfhB3DdpB1gYjw25yY8eTt","frameColor":"white","normal":[0,0,1],"drawSunBeam":false,"type":"Solar Panel"},{"cz":0.1,"rotation":[0,0,0],"id":"oKCroDuPSw8Jz4hpytmpuV","tiltAngle":0.5235987755982988,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","lz":0.006,"relativeAzimuth":0,"poleSpacing":3,"pvModelName":"CS6X-355P-FG","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1],"selected":false,"ly":3.936,"type":"Solar Panel","color":"#fff","frameColor":"white","trackerType":"None","poleRadius":0.05,"poleHeight":1,"lx":65.472,"cx":0.12116209363369557,"drawSunBeam":false,"orientation":"Portrait","cy":0.13119176071684868,"showLabel":false},{"lz":0.006,"drawSunBeam":false,"selected":false,"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.13277794649991534,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"id":"mHK7aYVb1Wk6EsoKnJgiKD","relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"color":"#fff","frameColor":"white","trackerType":"None","tiltAngle":0.5235987755982988,"cz":0.1,"poleSpacing":3,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","referenceId":"5DXDSqQGwG9HHBGtTSMivo","showLabel":false,"normal":[0,0,1],"cy":0.15624286336110577,"rotation":[0,0,0],"ly":3.936,"lx":64.48},{"poleSpacing":3,"cx":0.14138598430837385,"frameColor":"white","id":"9pHe3mAgmKZtQtjzLXxdYX","rotation":[0,0,0],"poleHeight":1,"pvModelName":"CS6X-355P-FG","color":"#fff","orientation":"Portrait","cy":0.18129396600536285,"normal":[0,0,1],"drawSunBeam":false,"lz":0.006,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","trackerType":"None","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"lx":61.504,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"cz":0.1,"tiltAngle":0.5235987755982988,"showLabel":false,"type":"Solar Panel","ly":3.936,"selected":false},{"cy":0.20634506864961993,"showLabel":false,"poleRadius":0.05,"selected":false,"ly":3.936,"frameColor":"white","cz":0.1,"type":"Solar Panel","relativeAzimuth":0,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","rotation":[0,0,0],"normal":[0,0,1],"poleSpacing":3,"color":"#fff","trackerType":"None","pvModelName":"CS6X-355P-FG","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","id":"wxnBoqUDaxFyzEJ8C9neNT","drawSunBeam":false,"lx":57.536,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","orientation":"Portrait","lz":0.006,"cx":0.14748395783026924,"poleHeight":1,"tiltAngle":0.5235987755982988},{"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"selected":false,"rotation":[0,0,0],"frameColor":"white","poleSpacing":3,"relativeAzimuth":0,"cz":0.1,"tiltAngle":0.5235987755982988,"normal":[0,0,1],"cx":0.1535819313521647,"lz":0.006,"id":"wFKvkQ1Z8bZ4V5gp8W9qaV","type":"Solar Panel","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":54.56,"trackerType":"None","orientation":"Portrait","color":"#fff","poleRadius":0.05,"cy":0.23139617129387702,"showLabel":false,"ly":3.936,"pvModelName":"CS6X-355P-FG","drawSunBeam":false,"referenceId":"5DXDSqQGwG9HHBGtTSMivo"},{"referenceId":"5DXDSqQGwG9HHBGtTSMivo","selected":false,"relativeAzimuth":0,"rotation":[0,0,0],"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","tiltAngle":0.5235987755982988,"poleRadius":0.05,"lx":54.56,"lz":0.006,"showLabel":false,"normal":[0,0,1],"poleHeight":1,"trackerType":"None","color":"#fff","type":"Solar Panel","frameColor":"white","pvModelName":"CS6X-355P-FG","drawSunBeam":false,"cz":0.1,"id":"5UEd5WPYGM3mteKkUdGC5b","ly":3.936,"cy":0.2564472739381341,"orientation":"Portrait","cx":0.1650931283901031,"poleSpacing":3},{"lx":54.56,"poleSpacing":3,"color":"#fff","rotation":[0,0,0],"normal":[0,0,1],"selected":false,"pvModelName":"CS6X-355P-FG","drawSunBeam":false,"poleRadius":0.05,"cz":0.1,"poleHeight":1,"trackerType":"None","orientation":"Portrait","cx":0.18098221432743639,"lz":0.006,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","frameColor":"white","cy":0.2814983765823912,"tiltAngle":0.5235987755982988,"id":"2svrFi8xQmtUMBe5ZAK81o","showLabel":false,"ly":3.936,"type":"Solar Panel","referenceId":"5DXDSqQGwG9HHBGtTSMivo","relativeAzimuth":0,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6"},{"cx":0.19687130026476962,"cy":0.30654947922664827,"poleRadius":0.05,"rotation":[0,0,0],"poleHeight":1,"selected":false,"showLabel":false,"lz":0.006,"type":"Solar Panel","normal":[0,0,1],"id":"bGivs5Yuda48gHtDd1BsdF","poleSpacing":3,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":55.552,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","frameColor":"white","pvModelName":"CS6X-355P-FG","referenceId":"5DXDSqQGwG9HHBGtTSMivo","drawSunBeam":false,"ly":3.936,"relativeAzimuth":0,"color":"#fff","orientation":"Portrait","cz":0.1,"tiltAngle":0.5235987755982988,"trackerType":"None"},{"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","orientation":"Portrait","selected":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lz":0.006,"pvModelName":"CS6X-355P-FG","relativeAzimuth":0,"cz":0.1,"showLabel":false,"lx":55.552,"frameColor":"white","poleSpacing":3,"poleRadius":0.05,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","poleHeight":1,"tiltAngle":0.5235987755982988,"rotation":[0,0,0],"cy":0.33160058187090535,"type":"Solar Panel","normal":[0,0,1],"color":"#fff","id":"jm8EQPxBbaiTMXoQiF7CER","ly":3.936,"trackerType":"None","cx":0.21276038620210297,"drawSunBeam":false},{"poleSpacing":3,"frameColor":"white","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","rotation":[0,0,0],"lz":0.006,"lx":55.552,"id":"8a4sJM8CzcwGaTVPbJ3rEU","color":"#fff","trackerType":"None","relativeAzimuth":0,"ly":3.936,"poleHeight":1,"pvModelName":"CS6X-355P-FG","type":"Solar Panel","cz":0.1,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1],"referenceId":"5DXDSqQGwG9HHBGtTSMivo","showLabel":false,"cy":0.35665168451516244,"poleRadius":0.05,"cx":0.232198442985121,"selected":false,"drawSunBeam":false,"orientation":"Portrait","tiltAngle":0.5235987755982988},{"selected":false,"drawSunBeam":false,"ly":3.936,"showLabel":false,"orientation":"Portrait","color":"#fff","poleHeight":1,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":52.576,"frameColor":"white","type":"Solar Panel","cz":0.1,"poleSpacing":3,"tiltAngle":0.5235987755982988,"normal":[0,0,1],"referenceId":"5DXDSqQGwG9HHBGtTSMivo","trackerType":"None","cy":0.3817027871594195,"id":"mSAWD32s6rcXazrWTV4Xv5","cx":0.24019624331923956,"rotation":[0,0,0],"relativeAzimuth":0,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lz":0.006,"poleRadius":0.05,"pvModelName":"CS6X-355P-FG"},{"poleRadius":0.05,"selected":false,"normal":[0,0,1],"id":"5LQqmcsTvpZmQs4iTqrCGu","cy":0.4067538898036766,"lz":0.006,"orientation":"Portrait","rotation":[0,0,0],"lx":49.6,"ly":3.936,"drawSunBeam":false,"showLabel":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"cx":0.248194043653358,"cz":0.1,"type":"Solar Panel","color":"#fff","poleSpacing":3,"trackerType":"None","pvModelName":"CS6X-355P-FG","frameColor":"white","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","tiltAngle":0.5235987755982988,"poleHeight":1,"referenceId":"5DXDSqQGwG9HHBGtTSMivo"},{"frameColor":"white","cx":0.23674454976762427,"ly":3.936,"poleSpacing":3,"poleHeight":1,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","trackerType":"None","tiltAngle":0.5235987755982988,"drawSunBeam":false,"relativeAzimuth":0,"rotation":[0,0,0],"showLabel":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":38.688,"poleRadius":0.05,"pvModelName":"CS6X-355P-FG","cz":0.1,"type":"Solar Panel","referenceId":"5DXDSqQGwG9HHBGtTSMivo","color":"#fff","orientation":"Portrait","cy":0.4318049924479337,"lz":0.006,"selected":false,"id":"32Cg2tC6n7DHigNkVxdrgt","normal":[0,0,1]},{"relativeAzimuth":0,"tiltAngle":0.5235987755982988,"id":"sqjEqAoMgMpxq5BxsJh969","cx":0.23372915722930276,"cy":0.4568560950921907,"type":"Solar Panel","frameColor":"white","referenceId":"5DXDSqQGwG9HHBGtTSMivo","ly":3.936,"drawSunBeam":false,"pvModelName":"CS6X-355P-FG","lz":0.006,"poleRadius":0.05,"color":"#fff","orientation":"Portrait","lx":30.752,"cz":0.1,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1],"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleSpacing":3,"showLabel":false,"rotation":[0,0,0],"selected":false,"trackerType":"None","poleHeight":1},{"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","selectedIndex":0,"lx":0.4,"normal":[0,0,1],"lz":0.4,"ly":0.4,"opacity":0,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","id":"i53LLgEmjv9V4sT2Bw7T8V","cy":0,"rotation":[0,0,0],"color":"#ffffff","vertices":[{"x":-0.37171479610592745,"y":-0.45264750984795554},{"y":-0.41291127806740985,"x":-0.37171479610592745},{"x":-0.35759904435506945,"y":-0.3887240065488168},{"x":-0.3975936743158338,"y":-0.3749027085381922},{"x":-0.38818317314859513,"y":-0.3144345297417096},{"x":-0.4164146766503111,"y":-0.27815362246382},{"x":-0.37877267198135645,"y":-0.13821298010624597},{"y":-0.07083415230445106,"x":-0.35759904435506945},{"y":-0.07083415230445106,"x":-0.2093836509710604},{"y":-0.25569401319655505,"x":0.0799892599215287},{"y":-0.3679920595328799,"x":0.061168257587051356},{"y":-0.4025453045594414,"x":0.01646837704266767},{"x":-0.07763663462971902,"y":-0.43364322508334674},{"y":-0.45437517209928363,"x":-0.11057338871505437}],"cz":0,"cx":0,"selected":false,"filled":true,"lineColor":"#999999","type":"Polygon"},{"type":"Solar Panel","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","relativeAzimuth":0,"color":"#fff","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","pvModelName":"CS6X-355P-FG","poleHeight":1,"poleSpacing":3,"rotation":[0,0,0],"frameColor":"white","id":"rjtxU5WsNM51KRLNQSNjpi","trackerType":"None","cz":0.1,"tiltAngle":0.5235987755982988,"selected":false,"orientation":"Portrait","normal":[0,0,1],"cy":-0.44066444447274405,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"drawSunBeam":false,"lz":0.006,"showLabel":false,"lx":54.56,"ly":3.936,"cx":-0.23295381956127093},{"orientation":"Portrait","cy":-0.41561334182848697,"id":"r4etahi9gw6GJxHew37bNn","poleHeight":1,"poleSpacing":3,"lx":67.456,"cx":-0.20254012539999636,"normal":[0,0,1],"selected":false,"frameColor":"white","lz":0.006,"drawSunBeam":false,"relativeAzimuth":0,"showLabel":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","type":"Solar Panel","ly":3.936,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","cz":0.1,"pvModelName":"CS6X-355P-FG","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"trackerType":"None","rotation":[0,0,0],"tiltAngle":0.5235987755982988,"color":"#fff"},{"poleSpacing":3,"trackerType":"None","frameColor":"white","lx":78.368,"normal":[0,0,1],"poleHeight":1,"cz":0.1,"orientation":"Portrait","showLabel":false,"cy":-0.3905622391842299,"tiltAngle":0.5235987755982988,"cx":-0.16654214275360996,"poleRadius":0.05,"color":"#fff","selected":false,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"rotation":[0,0,0],"drawSunBeam":false,"id":"oPaST5wTNmvuMg4irNTNvF","ly":3.936,"pvModelName":"CS6X-355P-FG","lz":0.006,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","type":"Solar Panel"},{"poleHeight":1,"relativeAzimuth":0,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","ly":3.936,"type":"Solar Panel","id":"fF8k5yd2hu4Rwpr6gbrW2i","normal":[0,0,1],"tiltAngle":0.5235987755982988,"cy":-0.3655111365399728,"poleRadius":0.05,"poleSpacing":3,"selected":false,"lx":92.256,"drawSunBeam":false,"frameColor":"white","cz":0.1,"showLabel":false,"lz":0.006,"trackerType":"None","pvModelName":"CS6X-355P-FG","rotation":[0,0,0],"orientation":"Portrait","color":"#fff","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","cx":-0.16834099366066035},{"pvModelName":"CS6X-355P-FG","color":"#fff","normal":[0,0,1],"poleSpacing":3,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","selected":false,"cz":0.1,"orientation":"Portrait","showLabel":false,"cx":-0.16377492283812295,"trackerType":"None","frameColor":"white","lz":0.006,"lx":93.248,"ly":3.936,"rotation":[0,0,0],"poleHeight":1,"id":"vR22Q3vueKbYiqVBv8D26g","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"drawSunBeam":false,"tiltAngle":0.5235987755982988,"type":"Solar Panel","poleRadius":0.05,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","cy":-0.3404600338957157},{"pvModelName":"CS6X-355P-FG","poleSpacing":3,"cx":-0.1597263390941956,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","cz":0.1,"poleRadius":0.05,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","tiltAngle":0.5235987755982988,"showLabel":false,"selected":false,"rotation":[0,0,0],"relativeAzimuth":0,"cy":-0.31540893125145864,"id":"fHL4NPe6GsTPPqRFeNWFSj","color":"#fff","poleHeight":1,"trackerType":"None","drawSunBeam":false,"type":"Solar Panel","frameColor":"white","ly":3.936,"orientation":"Portrait","lx":93.248,"lz":0.006,"normal":[0,0,1]},{"showLabel":false,"drawSunBeam":false,"trackerType":"None","lx":97.216,"cy":-0.29035782860720155,"poleSpacing":3,"poleHeight":1,"rotation":[0,0,0],"pvModelName":"CS6X-355P-FG","ly":3.936,"orientation":"Portrait","relativeAzimuth":0,"selected":false,"lz":0.006,"cz":0.1,"type":"Solar Panel","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","frameColor":"white","tiltAngle":0.5235987755982988,"color":"#fff","poleRadius":0.05,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","cx":-0.16533131631908343,"normal":[0,0,1],"id":"wo99UxfjEn2Sft7C8epu1F"},{"cy":-0.26530672596294447,"poleSpacing":3,"color":"#fff","trackerType":"None","cz":0.1,"lz":0.006,"tiltAngle":0.5235987755982988,"rotation":[0,0,0],"poleRadius":0.05,"ly":3.936,"cx":-0.16654823110912362,"selected":false,"frameColor":"white","id":"atncuqMmE5QUMBXmuECL7c","normal":[0,0,1],"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"orientation":"Portrait","relativeAzimuth":0,"drawSunBeam":false,"pvModelName":"CS6X-355P-FG","type":"Solar Panel","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":100.192,"showLabel":false},{"lz":0.006,"orientation":"Portrait","lx":92.256,"cy":-0.24025562331868738,"selected":false,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","ly":3.936,"color":"#fff","drawSunBeam":false,"type":"Solar Panel","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"tiltAngle":0.5235987755982988,"pvModelName":"CS6X-355P-FG","frameColor":"white","poleSpacing":3,"showLabel":false,"rotation":[0,0,0],"trackerType":"None","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"normal":[0,0,1],"id":"pRs6eMcbHHwteicGZNiUf4","cx":-0.17740291781012096,"relativeAzimuth":0,"cz":0.1},{"type":"Solar Panel","color":"#fff","frameColor":"white","normal":[0,0,1],"poleRadius":0.05,"tiltAngle":0.5235987755982988,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"lz":0.006,"pvModelName":"CS6X-355P-FG","ly":3.936,"drawSunBeam":false,"poleHeight":1,"id":"oTDhH5JF9kfv5Xuz6jEMoT","rotation":[0,0,0],"showLabel":false,"selected":false,"cy":-0.2152045206744303,"cz":0.1,"orientation":"Portrait","trackerType":"None","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","cx":-0.1936407690619649,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":82.336,"poleSpacing":3},{"tiltAngle":0.5235987755982988,"relativeAzimuth":0,"trackerType":"None","showLabel":false,"lz":0.006,"normal":[0,0,1],"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","selected":false,"ly":3.936,"orientation":"Portrait","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","drawSunBeam":false,"cx":-0.2098786203138088,"color":"#fff","pvModelName":"CS6X-355P-FG","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"cz":0.1,"cy":-0.19015341803017322,"lx":72.416,"id":"vTDkEMLLiFSDFeVQ9M7gEq","rotation":[0,0,0],"type":"Solar Panel","poleSpacing":3,"frameColor":"white","poleHeight":1},{"lx":63.488,"drawSunBeam":false,"poleHeight":1,"cx":-0.22611647156565276,"poleRadius":0.05,"lz":0.006,"selected":false,"poleSpacing":3,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","trackerType":"None","tiltAngle":0.5235987755982988,"orientation":"Portrait","ly":3.936,"showLabel":false,"relativeAzimuth":0,"rotation":[0,0,0],"pvModelName":"CS6X-355P-FG","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","type":"Solar Panel","color":"#fff","frameColor":"white","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","cy":-0.16510231538591613,"cz":0.1,"id":"ddcikvHRjDyv431v3iHzR9","normal":[0,0,1]},{"cy":-0.14005121274165905,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","poleRadius":0.05,"frameColor":"white","color":"#fff","trackerType":"None","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","selected":false,"ly":3.936,"poleHeight":1,"tiltAngle":0.5235987755982988,"type":"Solar Panel","cx":-0.2423189775828182,"lx":53.568,"normal":[0,0,1],"showLabel":false,"relativeAzimuth":0,"rotation":[0,0,0],"drawSunBeam":false,"poleSpacing":3,"id":"kzwB7XdQnSLaWv37UNBRHE","pvModelName":"CS6X-355P-FG","lz":0.006,"cz":0.1,"orientation":"Portrait"},{"relativeAzimuth":0,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"trackerType":"None","orientation":"Portrait","drawSunBeam":false,"poleSpacing":3,"cx":-0.25798989752621326,"selected":false,"lx":43.647999999999996,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","pvModelName":"CS6X-355P-FG","cz":0.1,"ly":3.936,"rotation":[0,0,0],"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","type":"Solar Panel","color":"#fff","normal":[0,0,1],"showLabel":false,"id":"iSBjaL3vNJSWkMSnEcxexJ","cy":-0.11500011009740196,"frameColor":"white","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lz":0.006,"poleHeight":1},{"pvModelName":"CS6X-355P-FG","selected":false,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","rotation":[0,0,0],"drawSunBeam":false,"cy":-0.08994900745314488,"cz":0.1,"id":"inhpfuX2LqrdYubxNoTMKi","trackerType":"None","lz":0.006,"poleRadius":0.05,"frameColor":"white","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"poleSpacing":3,"showLabel":false,"type":"Solar Panel","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":33.728,"ly":3.936,"normal":[0,0,1],"poleHeight":1,"orientation":"Portrait","cx":-0.2736608174696083,"color":"#fff"},{"type":"Foundation","cx":130.77937125760448,"cy":3.87684921362672,"cz":0.05,"lx":56.64628450306867,"ly":56.97569559573312,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"#808080","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"nCbdmnahzfS1w9hiPKySNL","label":"Rainbow Swash","labelSize":4,"labelHeight":50,"showLabel":true,"labelFontSize":50,"labelColor":"black"},{"type":"Wall","cx":-14.049964379597128,"cy":20.03116873649283,"cz":0,"lx":6.020797289396148,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.8682349942715186,"leftPoint":[-11.799964379597128,22.03116873649283,0.1],"rightPoint":[-16.299964379597128,18.03116873649283,0.1],"leftJoints":["eJTbEVraxbUMqMs6Np8NKF"],"rightJoints":["hXhPy1xFEnY2hwUty4JKnh"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"dg44T4UU4svJo7xChjjMQJ","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-18.049964379597128,"cy":15.53116873649283,"cz":0,"lx":6.103277807866851,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.101663015995481,"leftPoint":[-16.299964379597128,18.03116873649283,0.1],"rightPoint":[-19.799964379597128,13.03116873649283,0.1],"leftJoints":["dg44T4UU4svJo7xChjjMQJ"],"rightJoints":["r6mVuTRZiSA9BuDPhjz2Lp"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"hXhPy1xFEnY2hwUty4JKnh","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-20.799964379597128,"cy":10.28116873649283,"cz":0,"lx":5.852349955359813,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.363617976800782,"leftPoint":[-19.799964379597128,13.03116873649283,0.1],"rightPoint":[-21.799964379597128,7.53116873649283,0.1],"leftJoints":["hXhPy1xFEnY2hwUty4JKnh"],"rightJoints":["7XqqJhYujD5LNMbkq5uwj5"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"r6mVuTRZiSA9BuDPhjz2Lp","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-22.149964379597122,"cy":4.63116873649283,"cz":0,"lx":5.842088667591412,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.592280244817776,"leftPoint":[-21.799964379597128,7.53116873649283,0.1],"rightPoint":[-22.49996437959713,1.7311687364928305,0.1],"leftJoints":["r6mVuTRZiSA9BuDPhjz2Lp"],"rightJoints":["f9fikVMDyJeGH7jFyXZWwX"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"7XqqJhYujD5LNMbkq5uwj5","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-22.44996437959712,"cy":-0.7688312635071695,"cz":0,"lx":5.000999900019995,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.7323863143578375,"leftPoint":[-22.499964379597117,1.7311687364928305,0.1],"rightPoint":[-22.399964379597122,-3.2688312635071703,0.1],"leftJoints":["7XqqJhYujD5LNMbkq5uwj5"],"rightJoints":["xuvvfjRXMWdjTE7V8yHHHs"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"f9fikVMDyJeGH7jFyXZWwX","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-21.549964379597128,"cy":-6.568831263507171,"cz":0,"lx":6.815423684555494,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.964484961052763,"leftPoint":[-22.399964379597122,-3.2688312635071703,0.1],"rightPoint":[-20.699964379597134,-9.86883126350717,0.1],"leftJoints":["f9fikVMDyJeGH7jFyXZWwX"],"rightJoints":["up3mEwP5XpBuhYU31R9sSn"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"xuvvfjRXMWdjTE7V8yHHHs","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-19.49996437959713,"cy":-11.918831263507169,"cz":0,"lx":4.750789408087882,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":5.241978579166767,"leftPoint":[-20.699964379597134,-9.86883126350717,0.1],"rightPoint":[-18.299964379597128,-13.96883126350717,0.1],"leftJoints":["xuvvfjRXMWdjTE7V8yHHHs"],"rightJoints":["3RcJPAXuGxFdfSHj5R15Et"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"up3mEwP5XpBuhYU31R9sSn","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-16.549964379597128,"cy":-16.46883126350717,"cz":0,"lx":6.103277807866851,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":5.323114944773899,"leftPoint":[-18.299964379597128,-13.96883126350717,0.1],"rightPoint":[-14.799964379597128,-18.96883126350717,0.1],"leftJoints":["up3mEwP5XpBuhYU31R9sSn"],"rightJoints":["5CVoJKJNEiwZKYgJZcNSFi"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"3RcJPAXuGxFdfSHj5R15Et","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-11.749964379597131,"cy":-20.51883126350717,"cz":0,"lx":6.842514157822414,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":5.81300184353285,"leftPoint":[-14.799964379597142,-18.96883126350717,0.1],"rightPoint":[-8.699964379597134,-22.06883126350717,0.1],"leftJoints":["3RcJPAXuGxFdfSHj5R15Et"],"rightJoints":["jBn8o6CDfAHiZEGaPT1dBH"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"5CVoJKJNEiwZKYgJZcNSFi","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-5.699964379597134,"cy":-22.868831263507175,"cz":0,"lx":6.209669878504014,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":6.022582915432245,"leftPoint":[-8.699964379597134,-22.068831263507175,0.1],"rightPoint":[-2.6999643795971338,-23.668831263507172,0.1],"leftJoints":["5CVoJKJNEiwZKYgJZcNSFi"],"rightJoints":["7WeEQ5XGbSwarbCtZLcy3v"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"jBn8o6CDfAHiZEGaPT1dBH","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":0.20003562040287193,"cy":-23.918831263507172,"cz":0,"lx":5.82151183113116,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":6.197191015985346,"leftPoint":[-2.6999643795971338,-23.668831263507172,0.1],"rightPoint":[3.1000356204028776,-24.168831263507172,0.1],"leftJoints":["jBn8o6CDfAHiZEGaPT1dBH"],"rightJoints":["v7jn11zR2wYLhDxejpfXGD"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"7WeEQ5XGbSwarbCtZLcy3v","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":5.250035620402855,"cy":-23.36883126350717,"cz":0,"lx":4.588027898781775,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.35621965539615097,"leftPoint":[3.1000356204028776,-24.168831263507172,0.1],"rightPoint":[7.400035620402861,-22.56883126350717,0.1],"leftJoints":["7WeEQ5XGbSwarbCtZLcy3v"],"rightJoints":["ijnWnJpBMsWV74W4WWEWNB"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"v7jn11zR2wYLhDxejpfXGD","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":8.800035620402866,"cy":-22.01883126350717,"cz":0,"lx":3.008321791298265,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.3743336160075845,"leftPoint":[7.400035620402861,-22.56883126350717,0.1],"rightPoint":[10.200035620402872,-21.46883126350717,0.1],"leftJoints":["v7jn11zR2wYLhDxejpfXGD"],"rightJoints":["crmfHAnSRdMR5VgizUq9LM"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"ijnWnJpBMsWV74W4WWEWNB","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":11.450035620402872,"cy":-20.71883126350717,"cz":0,"lx":2.9154759474226504,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.5404195002705842,"leftPoint":[10.200035620402872,-21.46883126350717,0.1],"rightPoint":[12.700035620402872,-19.96883126350717,0.1],"leftJoints":["ijnWnJpBMsWV74W4WWEWNB"],"rightJoints":["8PdqQxoo78gsSMQ7Gk5KLR"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"crmfHAnSRdMR5VgizUq9LM","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":13.950035620402872,"cy":-18.96883126350717,"cz":0,"lx":3.2015621187164243,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.6747409422235527,"leftPoint":[12.700035620402872,-19.96883126350717,0.1],"rightPoint":[15.200035620402872,-17.96883126350717,0.1],"leftJoints":["crmfHAnSRdMR5VgizUq9LM"],"rightJoints":["6qpKnQqjrecVz81WJpLQT3"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"8PdqQxoo78gsSMQ7Gk5KLR","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":16.450035620402872,"cy":-16.96883126350717,"cz":0,"lx":3.2015621187164243,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.6747409422235527,"leftPoint":[15.200035620402872,-17.96883126350717,0.1],"rightPoint":[17.700035620402872,-15.96883126350717,0.1],"leftJoints":["8PdqQxoo78gsSMQ7Gk5KLR"],"rightJoints":["hELSBxVzGyyQWpXPyvjTHw"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"6qpKnQqjrecVz81WJpLQT3","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":18.700035620402872,"cy":-14.96883126350717,"cz":0,"lx":2.8284271247461903,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.7853981633974483,"leftPoint":[17.700035620402872,-15.96883126350717,0.1],"rightPoint":[19.700035620402872,-13.96883126350717,0.1],"leftJoints":["6qpKnQqjrecVz81WJpLQT3"],"rightJoints":["4fB42Goo94xeF9fnshTMSp"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"hELSBxVzGyyQWpXPyvjTHw","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":20.700035620402872,"cy":-12.71883126350717,"cz":0,"lx":3.2015621187164243,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.8960553845713439,"leftPoint":[19.700035620402872,-13.96883126350717,0.1],"rightPoint":[21.700035620402872,-11.46883126350717,0.1],"leftJoints":["hELSBxVzGyyQWpXPyvjTHw"],"rightJoints":["43JV1qpPY5ifjyLwezRVA6"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"4fB42Goo94xeF9fnshTMSp","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":23.200035620402872,"cy":-8.71883126350717,"cz":0,"lx":6.264982043070834,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.0714496051147666,"leftPoint":[21.700035620402872,-11.46883126350717,0.1],"rightPoint":[24.700035620402872,-5.96883126350717,0.1],"leftJoints":["4fB42Goo94xeF9fnshTMSp"],"rightJoints":["4w2rHft9nRb3VsBiJ3yDka"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"43JV1qpPY5ifjyLwezRVA6","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":25.200035620402872,"cy":-3.9688312635071696,"cz":0,"lx":4.123105625617661,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.3258176636680326,"leftPoint":[24.700035620402872,-5.96883126350717,0.1],"rightPoint":[25.700035620402872,-1.9688312635071696,0.1],"leftJoints":["43JV1qpPY5ifjyLwezRVA6"],"rightJoints":["drEpxmzAKwiqtosy39e6Vr"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"4w2rHft9nRb3VsBiJ3yDka","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":25.700035620402872,"cy":0.031168736492830362,"cz":0,"lx":4,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.5707963267948966,"leftPoint":[25.700035620402872,-1.9688312635071696,0.1],"rightPoint":[25.700035620402872,2.0311687364928304,0.1],"leftJoints":["4w2rHft9nRb3VsBiJ3yDka"],"rightJoints":["doFL6ojJQmnX4K2WrFghMW"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"drEpxmzAKwiqtosy39e6Vr","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":25.700035620402872,"cy":3.7811687364928304,"cz":0,"lx":3.5,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.5707963267948966,"leftPoint":[25.700035620402872,2.0311687364928304,0.1],"rightPoint":[25.700035620402872,5.53116873649283,0.1],"leftJoints":["drEpxmzAKwiqtosy39e6Vr"],"rightJoints":["p64ZbjyJXwL2QB5NtHDbAL"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"doFL6ojJQmnX4K2WrFghMW","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":25.200035620402872,"cy":7.53116873649283,"cz":0,"lx":4.123105625617661,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.8157749899217608,"leftPoint":[25.700035620402872,5.53116873649283,0.1],"rightPoint":[24.700035620402872,9.53116873649283,0.1],"leftJoints":["doFL6ojJQmnX4K2WrFghMW"],"rightJoints":["2ovFHEfiXwzvGxgJdZVohF"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"p64ZbjyJXwL2QB5NtHDbAL","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":23.950035620402872,"cy":11.28116873649283,"cz":0,"lx":3.8078865529319543,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.9756881130799802,"leftPoint":[24.700035620402872,9.53116873649283,0.1],"rightPoint":[23.200035620402872,13.03116873649283,0.1],"leftJoints":["p64ZbjyJXwL2QB5NtHDbAL"],"rightJoints":["4FRjmDxxDfS6r8HLMLZ4VF"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"2ovFHEfiXwzvGxgJdZVohF","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":22.450035620402872,"cy":14.53116873649283,"cz":0,"lx":3.3541019662496847,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.0344439357957027,"leftPoint":[23.200035620402872,13.03116873649283,0.1],"rightPoint":[21.700035620402872,16.03116873649283,0.1],"leftJoints":["2ovFHEfiXwzvGxgJdZVohF"],"rightJoints":["ce3qFMioJ6iam6f3Ps6XMK"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"4FRjmDxxDfS6r8HLMLZ4VF","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":20.700035620402872,"cy":17.03116873649283,"cz":0,"lx":2.8284271247461903,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.356194490192345,"leftPoint":[21.700035620402872,16.03116873649283,0.1],"rightPoint":[19.700035620402872,18.03116873649283,0.1],"leftJoints":["4FRjmDxxDfS6r8HLMLZ4VF"],"rightJoints":["hMHLjh9gVUXjqtgU6m8bRM"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"ce3qFMioJ6iam6f3Ps6XMK","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":18.700035620402872,"cy":19.28116873649283,"cz":0,"lx":3.2015621187164243,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.2455372690184494,"leftPoint":[19.700035620402872,18.03116873649283,0.1],"rightPoint":[17.700035620402872,20.53116873649283,0.1],"leftJoints":["ce3qFMioJ6iam6f3Ps6XMK"],"rightJoints":["abAkJXmsmcg5ajbzQfYkR5"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"hMHLjh9gVUXjqtgU6m8bRM","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":16.450035620402872,"cy":21.28116873649283,"cz":0,"lx":2.9154759474226504,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.601173153319209,"leftPoint":[17.700035620402872,20.53116873649283,0.1],"rightPoint":[15.200035620402872,22.03116873649283,0.1],"leftJoints":["hMHLjh9gVUXjqtgU6m8bRM"],"rightJoints":["ksNDjPcxBviiRDPqzCkcR3"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"abAkJXmsmcg5ajbzQfYkR5","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":12.700035620402872,"cy":23.53116873649283,"cz":0,"lx":5.830951894845301,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.601173153319209,"leftPoint":[15.200035620402872,22.03116873649283,0.1],"rightPoint":[10.200035620402872,25.03116873649283,0.1],"leftJoints":["abAkJXmsmcg5ajbzQfYkR5"],"rightJoints":["2G6Ycemoq6UcAJEBxk2txa"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"ksNDjPcxBviiRDPqzCkcR3","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":7.750035620402883,"cy":25.58116873649283,"cz":0,"lx":5.021951811795889,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.9207638838604444,"leftPoint":[10.200035620402872,25.03116873649283,0.1],"rightPoint":[5.300035620402866,26.131168736492832,0.1],"leftJoints":["ksNDjPcxBviiRDPqzCkcR3"],"rightJoints":["aaWFv2WxaeMYVbeK6B3njf"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"2G6Ycemoq6UcAJEBxk2txa","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-9.799964379597128,"cy":22.78116873649283,"cz":0,"lx":4.272001872658765,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.5003633238603653,"leftPoint":[-7.799964379597128,23.53116873649283,0.1],"rightPoint":[-11.799964379597128,22.03116873649283,0.1],"leftJoints":["wcz96GJreptw2HHTTyJGnx"],"rightJoints":["dg44T4UU4svJo7xChjjMQJ"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"eJTbEVraxbUMqMs6Np8NKF","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-6.049964379597128,"cy":24.28116873649283,"cz":0,"lx":3.8078865529319543,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.5464844398748765,"leftPoint":[-4.299964379597128,25.03116873649283,0.1],"rightPoint":[-7.799964379597128,23.53116873649283,0.1],"leftJoints":["2B4JavsLMUjzTvW2zcVwEQ"],"rightJoints":["eJTbEVraxbUMqMs6Np8NKF"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"wcz96GJreptw2HHTTyJGnx","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-2.799964379597128,"cy":25.53116873649283,"cz":0,"lx":3.1622776601683795,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.4633432079864352,"leftPoint":[-1.299964379597128,26.03116873649283,0.1],"rightPoint":[-4.299964379597128,25.03116873649283,0.1],"leftJoints":["aaWFv2WxaeMYVbeK6B3njf"],"rightJoints":["wcz96GJreptw2HHTTyJGnx"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"2B4JavsLMUjzTvW2zcVwEQ","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":2.000035620402855,"cy":26.08116873649283,"cz":0,"lx":6.600757532283728,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.156743009464563,"leftPoint":[5.300035620402866,26.131168736492832,0.1],"rightPoint":[-1.2999643795971565,26.03116873649283,0.1],"leftJoints":["2G6Ycemoq6UcAJEBxk2txa"],"rightJoints":["2B4JavsLMUjzTvW2zcVwEQ"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"aaWFv2WxaeMYVbeK6B3njf","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.2,"rValue":2,"color":"#ffffff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["ksNDjPcxBviiRDPqzCkcR3","2G6Ycemoq6UcAJEBxk2txa","aaWFv2WxaeMYVbeK6B3njf","2B4JavsLMUjzTvW2zcVwEQ","wcz96GJreptw2HHTTyJGnx","eJTbEVraxbUMqMs6Np8NKF","dg44T4UU4svJo7xChjjMQJ","hXhPy1xFEnY2hwUty4JKnh","r6mVuTRZiSA9BuDPhjz2Lp","7XqqJhYujD5LNMbkq5uwj5","f9fikVMDyJeGH7jFyXZWwX","xuvvfjRXMWdjTE7V8yHHHs","up3mEwP5XpBuhYU31R9sSn","3RcJPAXuGxFdfSHj5R15Et","5CVoJKJNEiwZKYgJZcNSFi","jBn8o6CDfAHiZEGaPT1dBH","7WeEQ5XGbSwarbCtZLcy3v","v7jn11zR2wYLhDxejpfXGD","ijnWnJpBMsWV74W4WWEWNB","crmfHAnSRdMR5VgizUq9LM","8PdqQxoo78gsSMQ7Gk5KLR","6qpKnQqjrecVz81WJpLQT3","hELSBxVzGyyQWpXPyvjTHw","4fB42Goo94xeF9fnshTMSp","43JV1qpPY5ifjyLwezRVA6","4w2rHft9nRb3VsBiJ3yDka","drEpxmzAKwiqtosy39e6Vr","doFL6ojJQmnX4K2WrFghMW","p64ZbjyJXwL2QB5NtHDbAL","2ovFHEfiXwzvGxgJdZVohF","4FRjmDxxDfS6r8HLMLZ4VF","ce3qFMioJ6iam6f3Ps6XMK","hMHLjh9gVUXjqtgU6m8bRM","abAkJXmsmcg5ajbzQfYkR5"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"eNawNU6nX2MwYS8vPdrDfM"}],"view":{"yearlyLightSensorPanelShowDaylight":false,"showYearlyParabolicDishYieldPanel":false,"showSunAngles":false,"showDailyFresnelReflectorYieldPanel":false,"groundPanelY":0,"waterSurface":false,"solarRadiationHeatMapMaxValue":6,"yearlyParabolicDishYieldPanelRect":{"y":0,"x":0,"width":600,"height":400},"showHeliodonPanel":false,"showDailyLightSensorPanel":false,"yearlyPvYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"heatFluxWidth":0.5,"heliodon":false,"panCenter2D":[131.8325577738685,6.979070650641251,0.000006979380865863898],"cameraPosition":[103.91363351545266,-170.19097104218287,181.31250975423077],"mapZoom":17,"showSiteInfoPanel":true,"yearlyUpdraftTowerYieldPanelRect":{"y":0,"x":0,"height":400,"width":600},"windowShininess":200,"dailyUpdraftTowerYieldPanelRect":{"width":640,"x":0,"height":550,"y":0},"showYearlyLightSensorPanel":false,"weatherPanelX":0,"mapType":"hybrid","heliodonPanelY":0,"ambientLightIntensity":0.1,"weatherPanelRect":{"height":500,"width":500,"y":0,"x":0},"cameraPosition2D":[131.8325577738685,6.978920643967857,150],"yearlyHeliostatYieldPanelRect":{"y":0,"height":400,"width":600,"x":0},"heatFluxScaleFactor":20,"showMapPanel":false,"dailyLightSensorPanelRect":{"width":600,"height":360,"x":0,"y":0},"yearlyLightSensorPanelRect":{"width":600,"height":500,"y":0,"x":0},"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showDailyParabolicTroughYieldPanel":false,"groundPanelX":0,"mapPanelY":0,"stickyNotePanelX":6,"axes":true,"showElevationAngle":true,"dailyBuildingEnergyPanelRect":{"x":0,"width":600,"y":0,"height":400},"showYearlyBuildingEnergyPanel":false,"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"mapPanelX":0,"autoRotate":false,"cameraZoom":11.974738784767572,"showDailyHeliostatYieldPanel":false,"yearlyFresnelReflectorYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"stickyNotePanelRect":{"height":300,"y":0,"width":400,"x":0},"showStickyNotePanel":false,"dailyHeliostatYieldPanelRect":{"width":600,"height":400,"y":0,"x":0},"showZenithAngle":true,"dailyParabolicTroughYieldPanelRect":{"height":400,"y":0,"x":0,"width":600},"showEvolutionPanel":false,"solarPanelShininess":100,"showDailyPvYieldPanel":false,"stickyNotePanelY":0,"diurnalTemperaturePanelRect":{"width":600,"height":400,"x":0,"y":0},"dailyLightSensorPanelY":162,"showYearlyPvYieldPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"height":400,"width":600},"yearlyLightSensorPanelShowClearness":false,"shadowEnabled":true,"showGroundPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"showDiurnalTemperaturePanel":false,"showYearlyUpdraftTowerYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDesignInfoPanel":true,"showWeatherPanel":false,"yearlyParabolicTroughYieldPanelRect":{"height":400,"x":0,"y":0,"width":600},"heliodonPanelX":0,"yearlyLightSensorPanelX":0,"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"showInstructionPanel":true,"panCenter":[45.46506493212769,-44.02353583672552,0],"solarRadiationHeatMapReflectionOnly":false,"groundColor":"#16A5A5","showEconomicsPanel":false,"evolutionPanelRect":{"width":640,"height":400,"x":0,"y":0},"directLightIntensity":1,"groundImage":true,"dailyPvYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"theme":"Default","mapWeatherStations":false,"showDailyUpdraftTowerYieldPanel":false,"yearlyLightSensorPanelY":0,"dailyFresnelReflectorYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"dailyLightSensorPanelX":-1275,"heatFluxColor":"gray","mapTilt":0,"showYearlyHeliostatYieldPanel":false,"enableRotate":true,"orthographic":false,"showAzimuthAngle":true,"weatherPanelY":0,"showDailyBuildingEnergyPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"interRowSpacing":7.25,"margin":2,"pvModelName":"CS6X-355P-FG","rowsPerRack":2,"rowAxis":"Left-Right","orientation":"Portrait","poleHeight":1,"poleSpacing":3,"tiltAngle":0.5235987755982988},"solarPanelArrayLayoutConstraints":{"maximumInterRowSpacing":10,"orientation":"Landscape","maximumRowsPerRack":6,"minimumInterRowSpacing":2,"minimumRowsPerRack":1,"poleSpacing":5,"minimumTiltAngle":-1.5707963267948966,"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","poleHeight":1,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"maximumGenerations":5,"crossoverRate":0.5,"populationSize":20,"convergenceThreshold":0.01,"searchMethod":1,"localSearchRadius":0.1,"selectionRate":0.5,"selectionMethod":1,"objectiveFunctionType":1,"problem":"Solar Panel Tilt Angle","mutationRate":0.1},"particleSwarmOptimizationParams":{"objectiveFunctionType":1,"convergenceThreshold":0.01,"swarmSize":20,"socialCoefficient":0.1,"vmax":0.01,"maximumSteps":5,"problem":"Solar Panel Tilt Angle","localSearchRadius":0.1,"inertia":0.8,"searchMethod":1,"cognitiveCoefficient":0.1}},"economicsParams":{"operationalCostPerUnit":0.15,"electricitySellingPrice":0.25,"projectLifeSpan":25},"notes":[]}')},430:function(e){e.exports=JSON.parse('{"docid":"fxMgHdY9nZbP8YEqb9fZ1w","time":"02/06/2023 03:46 pm","timestamp":1675716393386,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"date":"5/10/2021, 12:00:00 PM","ground":{"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05},"address":"Orlando, FL, USA","latitude":28.373886495744546,"cameraZoom":28.63945562104857,"name":"default","timesPerHour":1,"longitude":-81.5624358808899,"orthographic":false,"solarRadiationHeatmapGridCellSize":5,"pvGridCellSize":1},"elements":[{"type":"Foundation","cx":3.6287395608159727,"ly":283.0666063211208,"rotation":[0,0,-0.25695756630108585],"solarPowerTower":{},"id":"qKhYC3p1wiYeGuqWSSHJ89","color":"#999999","normal":[0,0,1],"cy":-13.583365825686094,"lx":337.3327572637294,"parentId":"Ground","lz":0.1,"solarUpdraftTower":{},"cz":0.05,"selected":false,"solarAbsorberPipe":{}},{"filled":true,"selectedIndex":37,"id":"gxiitHUfviQVqFAUKnd2B7","cz":0,"cx":0,"lz":0.4,"cy":0,"lx":0.4,"selected":false,"color":"white","type":"Polygon","parentId":"qKhYC3p1wiYeGuqWSSHJ89","normal":[0,0,1],"vertices":[{"x":-0.21350077712137278,"y":-0.42075759570318405},{"x":-0.2787182797987076,"y":-0.3183082097551242},{"x":-0.30984481516743556,"y":-0.20702698019085236},{"x":-0.3083625991974962,"y":-0.09044664445685331},{"x":-0.27865660234861234,"y":0.00706547489296964},{"x":-0.33053416129649227,"y":-0.01236458106269687},{"x":-0.37203620845479624,"y":-0.008831843616212049},{"x":-0.4120560396431608,"y":0.017663687232424098},{"x":-0.45504030277140417,"y":0.07065474892969639},{"x":-0.4846846221701927,"y":0.14660860402912002},{"x":-0.4802379742603744,"y":0.23492704019124053},{"x":-0.4594869506812224,"y":0.29145083933499766},{"x":-0.42094933546279734,"y":0.3409091635857851},{"x":-0.37500064039467507,"y":0.3762365380506333},{"x":-0.3379452411461894,"y":0.3886011191133302},{"x":-0.27717438637867287,"y":0.3886011191133302},{"x":-0.23270790728049007,"y":0.3691710631576637},{"x":-0.19713472400194382,"y":0.3373764261393003},{"x":-0.17193705251297356,"y":0.29851631422796726},{"x":-0.1467393810240033,"y":0.24022614636096776},{"x":-0.14525716505406386,"y":0.1784032410474834},{"x":-0.1585971087835187,"y":0.1236458106269687},{"x":-0.12450614147491189,"y":0.13601039168966556},{"x":-0.07855744640678965,"y":0.1625059225383017},{"x":0.004446647909818281,"y":0.1625059225383017},{"x":0.05187755894787995,"y":0.14130949785939279},{"x":0.08152187834666849,"y":0.12011307318048388},{"x":0.07411079849697136,"y":0.1607395538150593},{"x":0.06966415058715308,"y":0.22079609040530124},{"x":0.08448631028654735,"y":0.28261899571878557},{"x":0.12154170953503303,"y":0.3391427948625427},{"x":0.18972364415224668,"y":0.3903674878365726},{"x":0.27569217040873345,"y":0.3903674878365726},{"x":0.315712001597098,"y":0.3656383257111788},{"x":0.37203620845479624,"y":0.3161800014603914},{"x":0.40464495979346365,"y":0.2472916212539374},{"x":0.4090916077032819,"y":0.17487050360099857},{"x":0.39575166397382705,"y":0.09891664850157496},{"x":0.36758956054497793,"y":0.04945832425078748},{"x":0.3112653536872797,"y":0.00176636872324241},{"x":0.26976330652897573,"y":-0.017663687232424098},{"x":0.21936796355103522,"y":-0.017663687232424098},{"x":0.19417029206206496,"y":-0.01236458106269687},{"x":0.22677904340073238,"y":-0.10951486084102942},{"x":0.22671736595063713,"y":-0.22645703614651888},{"x":0.1852153187923332,"y":-0.3465701093270028},{"x":0.10968398177551761,"y":-0.4468912869803297},{"x":0.004446647909818281,"y":-0.49105050506139},{"x":-0.07559301446691079,"y":-0.49281687378463235},{"x":-0.14457773451918945,"y":-0.46315044506100184}],"ly":0.4,"rotation":[0,0,-0.25695756630108585],"foundationId":"qKhYC3p1wiYeGuqWSSHJ89","opacity":0},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.037616685320439464,"cy":-0.48857758884885055,"cz":0.1,"lx":28.799999999999997,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"kWpkpkWKF1uWgdwJ2NZefx","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":42.076837683556896},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.0372083877509681,"cy":-0.4744466390629113,"cz":0.1,"lx":50.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"dK6YzfpNPfiWaeFn2QffwS","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":73.63446594622458},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03654996905677188,"cy":-0.460315689276972,"cz":0.1,"lx":73.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2YnbhMS1ahtpsDUt83Kmqa","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":106.94529577904046},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.031199169405290578,"cy":-0.4461847394910327,"cz":0.1,"lx":92.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"rZ6mfN6qq8rs7avswS9pu2","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":134.99652090141174},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03621493966368436,"cy":-0.43205378970509345,"cz":0.1,"lx":104.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"nsxJE4hnqqqbojxtQF5XmZ","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":152.52853660289378},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04202884346728941,"cy":-0.41792283991915413,"cz":0.1,"lx":115.19999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"65qqYMw5kK9P2gpyyLouG5","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":168.30735073422758},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04120703986508323,"cy":-0.40379189013321487,"cz":0.1,"lx":122.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2sNWVSiGrgGLPazQHQc81Q","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":178.8265601551169},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04038523626287707,"cy":-0.3896609403472756,"cz":0.1,"lx":128.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"cnEFmUzsqP1tLRHrUQvSwW","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":187.59256800585786},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03956343266067097,"cy":-0.3755299905613363,"cz":0.1,"lx":135.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"98MNypEPPBsYie5TNeQKR6","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":198.11177742674707},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03874162905846479,"cy":-0.36139904077539703,"cz":0.1,"lx":141.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"xb5Buj7cVMwRPovXehf8wX","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":206.87778527748813},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.037919825456258605,"cy":-0.34726809098945777,"cz":0.1,"lx":148.79999999999998,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"9cdDw2HjNqp1VMPzxiNCdw","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":217.39699469837734},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.039402378999016274,"cy":-0.33313714120351845,"cz":0.1,"lx":153.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"8zxNS5x3yVnoFnibsJjUwa","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":224.4098009789702},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04145884091268481,"cy":-0.3190061914175792,"cz":0.1,"lx":158.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2RRuCpeWAGmBTfC2dhxMwq","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":231.422607259563},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04149659769772568,"cy":-0.3048752416316399,"cz":0.1,"lx":162,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"iv6ViUw3EJjpR2TGVGwYEb","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":236.68221197000761},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04103158876597998,"cy":-0.2907442918457006,"cz":0.1,"lx":164.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"fW2H3FSf6TjWNbMrKb1Lkt","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":240.18861511030403},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.040566579834234257,"cy":-0.2766133420597614,"cz":0.1,"lx":168,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2t1Xvha9SQuwVN7KfkUeiy","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":245.44821982074862},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04010157090248856,"cy":-0.2624823922738221,"cz":0.1,"lx":170.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"8iBoV7XvdfudFjFhHgKqTa","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":248.95462296104498},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.039636561970742834,"cy":-0.2483514424878828,"cz":0.1,"lx":174,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"wYMRLZC1rubPv5oYgrbkPg","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":254.21422767148965},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03917155303899711,"cy":-0.2342204927019435,"cz":0.1,"lx":176.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"tdEaYaSRTP4xPW2tL6xYLX","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":257.7206308117861},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.0394392928303727,"cy":-0.22008954291600424,"cz":0.1,"lx":178.79999999999998,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"5M1u3s5y7Yg9TFyx3QAJka","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":261.2270339520825},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04141185432912459,"cy":-0.20595859313006498,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"hiA62xMKPaFVvMB4EbNPY4","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04144393579015737,"cy":-0.19182764334412566,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"b54t9D1QjNBLmMTU63QWVT","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04135037805808456,"cy":-0.1776966935581864,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"d1YSCd8j3DVVmp36H3tHZz","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04125682032601172,"cy":-0.16356574377224714,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"1ysUo9HPCMC5bpSzendt1P","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04116326259393882,"cy":-0.14943479398630782,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2GwbaiKPvFUtnmPT96gojn","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04106970486186601,"cy":-0.13530384420036856,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jfCpXtMzyB64DGxKrDZTJ5","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04097614712979322,"cy":-0.1211728944144293,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"49X8WCb1TJhiSctnjKxN4r","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04165455280196828,"cy":-0.10704194462849004,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"9EUafkcKKdEjXyJwgKUn9F","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04393626708296591,"cy":-0.09291099484255072,"cz":0.1,"lx":177.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"83ZWm7TJF8qdoueqVfWe1p","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":259.47383238193424},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04420570767416232,"cy":-0.07878004505661146,"cz":0.1,"lx":175.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"iEjavascg418skk9iKNiXc","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":255.9674292416379},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04442483385188012,"cy":-0.0646490952706722,"cz":0.1,"lx":171.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"mEQPpZurmPLPYfvHBtjBp8","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":250.7078245311932},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04464396002959792,"cy":-0.05051814548473288,"cz":0.1,"lx":169.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jXz3fip3tXcdriBZEWDqpy","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":247.20142139089677},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04486308620731577,"cy":-0.03638719569879362,"cz":0.1,"lx":165.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"eqHXHHJiV6yMbr5L1r1Ld7","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":241.9418166804522},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04508221238503357,"cy":-0.022256245912854355,"cz":0.1,"lx":162,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"nX2ypmuMKZwqMh2zBmNNcy","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":236.68221197000761},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.340155090410463,"cy":-0.008125296126915038,"cz":0.1,"lx":9.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"wnN4Cfoo6RAEcvrqb2PcCi","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":14.025612561185637},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.0008397564506628652,"cy":-0.008125296126915038,"cz":0.1,"lx":192,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"41tmtPqEDkBjyum5o2HyTb","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":280.51225122371267},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.33919569243719283,"cy":0.006005653659024224,"cz":0.1,"lx":34.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"nUZy35meWUt3qFXdKcjG8T","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":50.84284553429793},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.01707173035142423,"cy":0.006005653659024224,"cz":0.1,"lx":199.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"42nshWJYmviEWoTkQyU4n7","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":291.0314606446019},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.040942647871871296,"cy":0.02013660344496354,"cz":0.1,"lx":249.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"woLsJFnRDToiWqRHeJaj7e","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":364.6659265908265},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03832955601375582,"cy":0.03426755323090275,"cz":0.1,"lx":259.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"co9GdUpZDxCi3rLez9eaX9","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":378.6915391520121},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03571646415564039,"cy":0.048398503016842065,"cz":0.1,"lx":268.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jbUV2vPsguy1CptC637MTc","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":392.7171517131978},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03645227851214608,"cy":0.06252945280278138,"cz":0.1,"lx":276,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"qkmUJNGwXdSLVnfZeY68uS","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":403.2363611340871},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03734260936957107,"cy":0.07666040258872059,"cz":0.1,"lx":282,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"6iGc4xFsJd9M2yj74iPeRR","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":412.00236898482797},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03607706284374246,"cy":0.0907913523746599,"cz":0.1,"lx":286.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"omBvXRQwdAtvY6W2nJwnSu","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":419.0151752654209},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.035576630292429856,"cy":0.10492230216059922,"cz":0.1,"lx":290.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"86V9dMayifHM3TKqinFVHY","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":424.27477997586544},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.19735877990437656,"cy":0.11905325194653843,"cz":0.1,"lx":186,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"hbiQ95FcNxgSx4s8JJpjr7","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":271.7462433729717},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.24049456177332856,"cy":0.11905325194653843,"cz":0.1,"lx":106.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"nhNSmKpJTEt2hyfDoJmW3v","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":156.03493974319017},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31770381965182604,"cy":0.13318420173247775,"cz":0.1,"lx":108,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"phxBsJWZVwgu5cw4g8V4wY","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":157.78814131333837},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03308870698607633,"cy":0.13318420173247775,"cz":0.1,"lx":62.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"tuJ1gTPzUhawyfMHxKao6u","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":91.16648164770662},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.24046099085550587,"cy":0.13318420173247775,"cz":0.1,"lx":108,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jtBNT6PcfTMUK2qEAoEKzy","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":157.78814131333837},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31874014769682496,"cy":0.14731515151841706,"cz":0.1,"lx":110.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"3Kj2UQDiRgd2551SXnotBs","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":161.29454445363484},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.033764879795220165,"cy":0.14731515151841706,"cz":0.1,"lx":44.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"39FZrG2AvYzTH8N4iEhi3W","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":64.86845809548358},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.24041303240147344,"cy":0.14731515151841706,"cz":0.1,"lx":109.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"oK7nq2Fur7VVa6ALjsnPy9","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":159.5413428834866},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3169744670961393,"cy":0.16144610130435627,"cz":0.1,"lx":111.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"fnB5YFmLgA7bBpseBoJH8k","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":163.04774602378293},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.036255002624718397,"cy":0.16144610130435627,"cz":0.1,"lx":31.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"dZPmGJSNE99kF5mskFBu8m","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":45.58324082385331},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.240365073947441,"cy":0.16144610130435627,"cz":0.1,"lx":111.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"xdu2VhAyxp7GHG6GkN2Rak","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":163.04774602378293},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3148974522014887,"cy":0.1755770510902956,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"g7Pg4uWoBiYjTsLY8RraRJ","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.24100628905692523,"cy":0.1755770510902956,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"hDztK9BKaGUf2AywiKnX14","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31399347805252253,"cy":0.1897080008762349,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"qRpgEphc3gwtfun3kDAQ8w","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2402168091310728,"cy":0.1897080008762349,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"vc7S9aQUn3Nxbw9os9915M","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31380714233058726,"cy":0.2038389506621741,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"kRsxFHjzWbANb66JdKxPEn","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23925985477458384,"cy":0.2038389506621741,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"p7ZRVtya7nPesW49gxfWje","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.313620806608652,"cy":0.21796990044811343,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"mwBcFhJw4XwTYpgx3t8Kq4","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.238302900418095,"cy":0.21796990044811343,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"6LEGw3yDjniXRNLBc3hQEt","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31343447088671683,"cy":0.23210085023405264,"cz":0.1,"lx":111.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"wQatxUrP1g2jmJrfUibX2C","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":163.04774602378293},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23916510110353983,"cy":0.23210085023405264,"cz":0.1,"lx":111.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"6yT9UzJjZp1c4agfQAh2Za","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":163.04774602378293},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3127806949383655,"cy":0.24623180001999195,"cz":0.1,"lx":109.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2sWWpxqpZqAXKAZerDK9Cn","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":159.5413428834866},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2402069428031286,"cy":0.24623180001999195,"cz":0.1,"lx":110.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"teapWmNzVUv7LoUgjnLHJu","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":161.29454445363484},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3132410802017558,"cy":0.26036274980593127,"cz":0.1,"lx":105.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"aGUWAZyZhfeCxcewvQ7kQ9","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":154.281738173042},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2385564165948445,"cy":0.26036274980593127,"cz":0.1,"lx":106.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"pKCiy2oM8YqTjYeCwFccee","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":156.03493974319017},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3137014654651461,"cy":0.2744936995918705,"cz":0.1,"lx":102,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"mtSGfTvotfJZuE5rKNWHKD","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":149.02213346259734},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2369058903865603,"cy":0.2744936995918705,"cz":0.1,"lx":103.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"25YjZ6eNgXEZMpGdn5MeCJ","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":150.77533503274557},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3141618507285363,"cy":0.2886246493778098,"cz":0.1,"lx":97.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"3QmRQECQLpN1r5BFbEnPZu","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":142.0093271820046},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23694469336187218,"cy":0.2886246493778098,"cz":0.1,"lx":98.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"7fQN2CLRbYff7Kgk1L8AFk","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":143.76252875215275},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3125435243418768,"cy":0.3027555991637491,"cz":0.1,"lx":91.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2sok3ZhMGD367xZKYFitkd","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":133.24331933126356},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23823213095114654,"cy":0.3027555991637491,"cz":0.1,"lx":93.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"knqe8wxaNzdbbkkGeV6nft","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":136.74972247155998},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3116195455554211,"cy":0.3168865489496883,"cz":0.1,"lx":85.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"sJtpFF4zqnp47K3f8FHJoz","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":124.4773114805225},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23857920295070112,"cy":0.3168865489496883,"cz":0.1,"lx":87.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"eenbnKZSxHXg341eYvv6YL","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":127.98371462081894},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31069556676896537,"cy":0.33101749873562764,"cz":0.1,"lx":78,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"rnrxkB2JpncBeLWxT29QJC","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":113.9581020596333},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23516481259137628,"cy":0.33101749873562764,"cz":0.1,"lx":79.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"cZtPSF2YivPA1jCjxoWje1","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":115.7113036297815},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31044025346401344,"cy":0.34514844852156695,"cz":0.1,"lx":68.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"rJSTWke3wchC8uFSfcSzQ1","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":99.93248949844762},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23449459815656987,"cy":0.34514844852156695,"cz":0.1,"lx":68.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"6Hp4zwmET4Ch6ZFmL8mGpC","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":99.93248949844762},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3091556662900659,"cy":0.35927939830750616,"cz":0.1,"lx":56.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"fJ8958fxoKHVFgspEjynzP","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":82.40047379696561},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2358526876659724,"cy":0.35927939830750616,"cz":0.1,"lx":56.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"1CoiFcccuM9VRQ7ukyN4aa","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":82.40047379696561},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31159009373160274,"cy":0.3734103480934455,"cz":0.1,"lx":43.199999999999996,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jzJ71uWBpujykTfLckxzbh","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":63.11525652533535},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23483923162347198,"cy":0.3734103480934455,"cz":0.1,"lx":43.199999999999996,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"qYWcALWx8U3KNV1wk9Ec8j","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":63.11525652533535}],"view":{"showWeatherPanel":false,"weatherPanelY":0,"showDesignInfoPanel":true,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelY":0,"showStickyNotePanel":false,"showInfoPanel":true,"panCenter2D":[39.10459750703379,-60.079467366675814,-0.00006008213787399433],"shadowEnabled":true,"stickyNotePanelY":0,"theme":"Default","autoRotate":false,"cameraPosition2D":[39.10459750703379,-60.079617373283014,150],"showYearlyPvYieldPanel":false,"showDailyLightSensorPanel":false,"heliodonPanelX":-6,"showGroundPanel":false,"dailyLightSensorPanelX":0,"cameraZoom":4.904200711979575,"showDailyPvYieldPanel":false,"cameraPosition":[94.96625797546166,-156.07916973403763,226.41931192253614],"weatherPanelX":0,"showInstructionPanel":true,"groundPanelY":0,"mapTilt":0,"groundColor":"#16a5a5","panCenter":[21.38313493992602,-35.00376702263927,0],"showMapPanel":false,"enableRotate":true,"heliodon":false,"groundImage":true,"dailyLightSensorPanelY":0,"mapZoom":17,"showYearlyLightSensorPanel":false,"dailyPvYieldPanelX":0,"groundPanelX":0,"heliodonPanelY":9,"mapType":"hybrid","mapWeatherStations":false,"axes":true,"orthographic":false,"stickyNotePanelX":0,"showHeliodonPanel":false,"yearlyLightSensorPanelX":0,"solarPanelShininess":0,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showEconomicsPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"rowAxis":"Left-Right","tiltAngle":0.5235987755982988,"poleHeight":2,"poleSpacing":3,"orientation":"Landscape","rowsPerRack":4,"interRowSpacing":4,"pvModelName":"FS-495"},"solarPanelArrayLayoutConstraints":{"orientation":"Landscape","maximumTiltAngle":1.5707963267948966,"minimumInterRowSpacing":2,"minimumTiltAngle":-1.5707963267948966,"pvModelName":"CS6X-355P-FG","maximumRowsPerRack":6,"minimumRowsPerRack":1,"rowAxis":"Left-Right","poleHeight":1,"poleSpacing":5,"maximumInterRowSpacing":10},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"mutationRate":0.1,"localSearchRadius":0.1,"crossoverRate":0.5,"convergenceThreshold":0.01,"maximumGenerations":5,"searchMethod":1,"populationSize":20,"selectionRate":0.5,"selectionMethod":1,"objectiveFunctionType":1,"problem":"Solar Panel Tilt Angle"},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"inertia":0.8,"convergenceThreshold":0.01,"swarmSize":20,"searchMethod":1,"socialCoefficient":0.1,"cognitiveCoefficient":0.1,"localSearchRadius":0.1,"vmax":0.01,"maximumSteps":5}},"economicsParams":{"operationalCostPerUnit":0.15,"projectLifeSpan":25,"electricitySellingPrice":0.4},"notes":[]}')},431:function(e){e.exports=JSON.parse('{"docid":"j9Q8R8iNXqFBaujVRfHNC2","time":"05/18/2022 02:05 pm","timestamp":1652897143355,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":35.81284404374666,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-78.7501240418377,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"2401 Trenton Rd, Raleigh, NC 27607, USA","date":"4/15/2022 10:15:00 AM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.10173433320329936,"normal":[0,0,1],"lz":0.1,"ly":51.9907667035674,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.005905293451752419,"cz":0.05,"rotation":[0,0,0],"lx":75.61279135922823,"selected":false,"parentId":"Ground","locked":true},{"poleRadius":0.05,"type":"Solar Panel","lx":1.984,"lz":0.046,"relativeAzimuth":0,"drawSunBeam":false,"rotation":[0,0,0],"ly":21.648,"normal":[0,0,1],"poleSpacing":3,"cx":0.08211037572567748,"trackerType":"HSAT","cy":0.2234368441602269,"label":"Row3","cz":0.5000000074506161,"orientation":"Portrait","showLabel":false,"selected":false,"poleHeight":1,"tiltAngle":0,"id":"mAv2C19w4RJA4u6knYxU3u","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-355P-FG"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.16248436170569222,"cy":0.2234368441602269,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bLn1japfJEgTKBPWbNzur1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.23879905546449415,"cy":0.2246175890711455,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xrAXVLJvJZKmHgq57E2MQB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.31836118300026617,"cy":0.2233645095937837,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tRW2bpMcmbgt4enWCcDP51","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.39629959364755313,"cy":0.22343686243351435,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tJsi7hiees32d12b6mBMhW","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.47586172118332537,"cy":0.22461757079785805,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5KhMg2uodxoo1Z4XL87XGA","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0025482481899054073,"cy":0.22225611752259564,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"26aZGW371fb7o1PfURQ3zg","selected":false,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.07457830401313895,"cy":0.2246175890711455,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wUt5FR6ocPi4PpiJnSm7dt","selected":false,"drawSunBeam":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.15495228999315366,"cy":0.2210754091582519,"cz":0.5000000074506517,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9KjddEKBMzvacaiu1qXZ6p","selected":false,"drawSunBeam":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23532627597316833,"cy":0.22107540915833737,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v1S992hiHrrXWRFsDpx8ie","selected":false,"drawSunBeam":false},{"type":"Cuboid","cx":-32.63845852923165,"cy":15.792302218810745,"cz":1.2553344031996811,"lx":5.133059413294499,"ly":13.392050108713438,"lz":2.5106688063993623,"color":"gray","normal":[0,0,1],"rotation":[0,0,0],"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","id":"1x2m4C7FHzAwDkHxXXdvsn","selected":false,"locked":true},{"type":"Human","name":"Jack","cx":-28.54553838833994,"cy":11.2385720166683,"cz":0,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.8},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.46971942316836673,"cy":-0.2583893879929419,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5MXRMjMkweGaqcjbtGi5WU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3904301692588086,"cy":-0.2623054559086292,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9xkDVHA2779LgaH8YdZCmx","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3131409153492504,"cy":-0.26022152382431646,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mN37zmeNfQecDk9remsomw","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23385166143969227,"cy":-0.26413759174000373,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e3Pif4TuZ9DpVbtnBEVtva","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.15456240753013412,"cy":-0.260053659655691,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g39HnTg7UwuA8CBPjuTqTF","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.07527315362057596,"cy":-0.25996972757137826,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oFMzredZvfguD3UXAtxX6K","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.004016100288982194,"cy":-0.25988579548706553,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2ABmv4sfkBHxsAyYodagum","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.08330535419854035,"cy":-0.2618018634027528,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k577u5kHuxBEHJLmRQtnAz","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1625946081080985,"cy":-0.26371793131844007,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w4he3pd3YzeFnd3X45S2gw","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.24188386201765666,"cy":-0.26163399923412733,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pyLs3bLikRTcZrrF7e1TcH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3167669019313885,"cy":-0.25817391579286053,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6wAigPY54YvU4hpiRBKYf4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.39751068943275564,"cy":-0.26121089229567773,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iTsCanVgttoMHWKMPD8d5z","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4775584098004903,"cy":-0.2553834493088245,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o5ef4DVoUQeG4ovcxCKPpK","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":20,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":true,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[31.151690262644525,60.08959522074622,31.574651861408782],"panCenter":[5.074127461000436,15.829331204955876,0],"orthographic":false,"enableRotate":true,"cameraZoom":19,"showInstructionPanel":true,"showMapPanel":false,"cameraPosition2D":[8.577303319163851,-9.663080657094188,49.999990336648274],"panCenter2D":[8.577303319163851,-9.663030654871722,-0.000009663320744681337],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},432:function(e){e.exports=JSON.parse('{"docid":"axSGqNWcpePCTLspRawDR9","time":"05/18/2022 12:07 pm","timestamp":1652890029091,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":34.661401193155264,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-118.08438229389954,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"3782 E Ave L, Lancaster, CA 93535, USA","date":"3/30/2022 11:30:00 AM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Approximate","daysPerYear":4},"elements":[{"cy":0.07254451818739938,"normal":[0,0,1],"lz":0.1,"ly":81.92819197480188,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.08412023344924435,"cz":0.05,"rotation":[0,0,0],"lx":82.66288858793011,"selected":false,"parentId":"Ground","textureType":"No Foundation Texture","locked":true},{"type":"Human","name":"Jack","cx":49.29766862442634,"cy":-12.729504090108108,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rrK38LJKu6CVWVjf2zV1b2","selected":false,"ly":0.45},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"AADAT","relativeAzimuth":0,"tiltAngle":0,"orientation":"Portrait","drawSunBeam":false,"poleHeight":1.2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2518807579243098,"cy":0.010250386487824486,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5786gicyfJksUGkwhvexAb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25427388005268026,"cy":-0.04395224581399519,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k9w88akkXvyeym1nEoJCjH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2566670021810507,"cy":-0.09815487811581487,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i4BrqTV8VhJzUFMcA4xEMs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2530944088658749,"cy":-0.1536069244602506,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vcRG9TH79RxwCJhnX4D2hp","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25192019869553334,"cy":-0.21079873518169914,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rtH2MUzGv2KfYvP1V1Rm6A","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.19991063417063695,"cy":-0.18536196640558186,"cz":0.5000000074506517,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wv9ywiGPQRmqsVCgAzNiwq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19064139133153096,"cy":0.15891530324997943,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ucdEe1iLcEHHhf7vQqUUBk","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10269156717338637,"cy":-0.12788362495230762,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iRH83oBMSFMwbXKKj29Qwe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10314333812802398,"cy":-0.013487174391434594,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eQKzkcGn74q7YicXK2W4tT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15886708542833353,"cy":0.12620926239733848,"cz":0.5000000074506517,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dDRJL26Ytf5c8uDCiZ3aXx","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15339180094769295,"cy":0.06763384458981574,"cz":0.5000000074506517,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5VPk2zFGHCYnEvmb4Swkfx","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1533504351516886,"cy":0.011186366145812043,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mWLpnzd5GQucX4FdT7Xfxt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1555155212376684,"cy":0.24112965852461848,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8fafEASeWSKzVyfD9jxhX3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1589318952851763,"cy":0.18059187676792832,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8oEiCQAuNSHPSDiR6LUNbE","selected":false,"drawSunBeam":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25484854246591865,"cy":0.06997519331444636,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hS7hPBhsXEFxoPaaW27Bei","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.058180152618152965,"cy":0.12709108304539296,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eBcpt1Wt3T5EkddP5aWE5r","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09325025604322237,"cy":0.0983124515002669,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rVyrwEiwe9ZPbBS99cPzQZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14277629723213114,"cy":0.015285529455875321,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sFJojw9tEoGQyahPFbrMGm","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04294631891940937,"cy":0.06901057210886578,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ekjGZoifbx54ZxvxR9nd4Y","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2920444708915642,"cy":0.04225008319918739,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3BDM99QnBLCJL4C6i8MSSs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2886934107606972,"cy":0.09972897002350474,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gEHyNnwSt5QbZ5cmLo61av","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05646578271859648,"cy":0.06997519331444636,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t5wJr6yXENMUDnfPe9dKk2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.041385173102717936,"cy":0.12610163574289743,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qXjk7hou8dch4h29ZdrRwv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1923023384210398,"cy":0.10145193857791704,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hyHFcJjhpxKcY4WiqVxvnY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1895020308870361,"cy":0.043602527595053696,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fYZ6sBUNi7ENt9JGidVuq8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0896200750136689,"cy":0.15848596846951796,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bnwN7888LrQM7dC3CaukC4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25776231965010593,"cy":0.12762742673544877,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dMTxMasD2j1rCN41KmcoKf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2045542377026502,"cy":0.09879647040569517,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jK4TDxAWQQmZt76MiUgYBj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0915388849864329,"cy":0.04212814396977042,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4AZoM6mfHgnqyYfm1FKGHz","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1422836298066917,"cy":0.07046201484554855,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2LodiR2ATEwXvrSF5QtqFJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0422721424424923,"cy":0.011806515962473143,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cQzP6z5hZLemyfnuj3n9Dm","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.006994600101448293,"cy":0.04312289956203308,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oz6Y5UFdG5kpKdrsZGPPHy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.006994600101448293,"cy":0.10028772676757898,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jDhoFMd3Yqniw6HmXCK6PZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10700608746564778,"cy":0.09929355585965646,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9uyqQ937ezx3VdDJUFfzMi","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1065134200402084,"cy":0.04361998501599436,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8GgRE418BL6BVETxL6mwZ7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05527600779451013,"cy":0.011806515962473143,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xu2mR289eySb3y2d1ZZWgf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2060322399789683,"cy":0.044117070469955603,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u558xjFbFWRjTHBfoZjc3B","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20553957255352892,"cy":-0.013047756735590265,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"st7NYqMPZnkacwsV9fNrTW","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15578016258414895,"cy":-0.04436414033515022,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1H39aeiRM4xc1iUZYtAB8W","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05626134264538889,"cy":-0.04386705488118897,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"66Y2RUGQAkcJg6mWe5jRG5","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10552808518932955,"cy":-0.07319509666490383,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8mkhtM6wG9Afn5AsZkJC3p","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10865037816756891,"cy":0.21407673957857115,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmpLZMvpnpGmUxvk5iTgP1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10865037816756891,"cy":0.15762154422622862,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ngNMpaj8EwRBxMeWvoeXys","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057634016263961675,"cy":0.18418869498027218,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"giC1j5cUtWifw2JwH5a5bP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.007440498907186952,"cy":0.15762154422622862,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rs1mymysHmGoDcaan4oDsB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04193017390275545,"cy":0.18584914190239984,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uPnwAA4FcFWHA7FqJJGQae","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2065688792406212,"cy":0.1567913207651648,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6KPu6mNrxywNai4UXzGBJ5","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2567623965973961,"cy":0.18501891844133603,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1n372FWqJ9pVPw4eSXYmPV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2065688792406212,"cy":0.21490696303963497,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gi6tkDKs6NtgCMAAReWJAR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.004971965266689796,"cy":-0.01340448875292641,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pLi7ggTT3PqwKQBJVjuniN","selected":false,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14231720861630498,"cy":0.12856372308899353,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iXLnMRMrRjtjArqFQVcTD3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24023570968935748,"cy":0.06961785735345952,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9g2NFucTWZE9VvPJ1U9fnX","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24270424332985463,"cy":0.12607305270580196,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e6vsB5ZrLgyMEs8nt19DUv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09459222490002743,"cy":-0.012574265291862577,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hQr9Fef5Fh7zxEbLkL1VMo","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04357586299642019,"cy":-0.04329253335122541,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fJiHeWQvfcH93LJDacJ5U2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.006617654360354536,"cy":-0.06985968410526895,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"av2DnyKiv87Tdt3JFpxyHB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2057460346937889,"cy":-0.07068990756633277,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tzhyrWaP1ZqrN4rpJQBLcB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15390682824334934,"cy":-0.1005779521646317,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3nRRF2j6QrScDDkbrs6m4a","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20327750105329176,"cy":-0.1296357733018668,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7y7rBQL5vGHMt8ZANGKmdr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15472967279018185,"cy":-0.15703314751697414,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cN1AzorJdqMR2VPo9KVZma","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.055165482623464525,"cy":-0.10306862254782327,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dfu9LFXVjUWPvnPcDkjy6R","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1390685759174889,"cy":0.1852541725070993,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rxx1fqNmXiDTg1ZhJ1QnGn","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09067926762777045,"cy":0.21416267146874132,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8SRi5DvvrpV4dNgiTvJ9Je","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.00800945322626064,"cy":0.21480508255677777,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"266hnZ1rnYA5XLvbZ8txcr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04147760940199774,"cy":0.24037406770776895,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7vBjqcNWEe5WcN3ZPbNV6e","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.058580287492818954,"cy":0.24037406770776895,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"syucoPsRr3v2eHQaYYfqug","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.007769636725919854,"cy":0.27113384694018494,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kWziiofHHGucoQrSYimggR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057016882853837374,"cy":0.2987387770205583,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"idtAosKbm3W95AtcEbYCdb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10782753362073655,"cy":0.2695564223641636,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6xoYbDnXopc3sxqZhRMx2C","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10860279827645342,"cy":0.32854167949809765,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bpjusQDMhzuD6wY6N7LYpe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1592693110228126,"cy":0.35588539966209315,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tX9ZhVSGraSP2oyuKxZRks","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15691272903460993,"cy":0.30000910193566754,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n7JZKTvm9Z74h9Q2sTZDE3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20875753277507064,"cy":0.272665381771672,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"edXx1WDDhJHy3n7mzY55eB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20522265979276647,"cy":0.3297305368965322,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpFtUM9gLUrhBCuhPrUxch","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20757924178096934,"cy":0.3867956920213924,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pezhDsUoQ6nUspAa69MKkr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2570674635332272,"cy":0.41413941218538786,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oM9xei2CxtE8z6PBbtfg9f","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25588917253912563,"cy":0.3546965422636585,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"boLotmiivinNNHWUkJNPK1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2570674635332272,"cy":0.30000910193566754,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gy1y7cW6cjooGgNpDRcVqF","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25588917253912563,"cy":0.2405662320139381,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xnSPHfaBhXAD7ssnz5CFcM","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":0.07055962403779206,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"khKhaS8ssRAseSkBgDXTD4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":0.012305611514497291,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4Z7xaYhMGZDK551XajN4xD","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":-0.012660393852629088,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w29qA4SyEe8XYJFPW7NZFY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14237318346714029,"cy":-0.04238182881349372,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xtibwmyRkGDZD1aXvyKhQs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09170667072078098,"cy":-0.07210326377435848,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1PogYHu7FjwwFaSG7CbAN4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.042218448968523115,"cy":-0.10063584133678857,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iPqMK3ttEsCxnPof1ShTJR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.00726977278373475,"cy":-0.12441298930548035,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9GmoNmHrHgvD95Qd2V3rCJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.056757994535992624,"cy":-0.1588898538600834,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kuKrRiiiHZzLJDtmorgeuP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10388963430004787,"cy":-0.18623357402407878,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dNLLoyzyJAC4ab9yNV49YW","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1545561470464073,"cy":-0.21357729418807436,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2K3F8F31VVhyhEKnxs3Erf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2016877868104623,"cy":-0.24092101435206986,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fDAsp6SESYssbfVnpQgG3D","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2511760085627201,"cy":-0.2718313067113691,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2zKUQEiEH6NvsSMtHEjR6F","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3030208123031809,"cy":-0.1850447166256443,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w9y4ucdHTVjss2inC3NCUr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3013169393640835,"cy":-0.23950929397792342,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rbco6Y3hA3xGnGqyMDpR5N","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3013169393640835,"cy":-0.3006836542668394,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3ULG8zNaZ7DoT4B28Qot6U","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3013169393640835,"cy":-0.1276476065924771,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3AUeCn3oqRmECRW8VZWFNk","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30218309151864386,"cy":-0.07084284346705509,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aQpjCoWjLCxvJeQv5oUMVb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3013169393640835,"cy":-0.01403808034163304,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vBbWMduvCeR6vTDiguHAbY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30304924367320435,"cy":0.04364060221648771,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"okZoQ3ysJTWRd5qkZTjBii","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30304924367320435,"cy":0.0986975264765121,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vb4fTp2UdSaTbvLvi9dHuG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30478154798232504,"cy":0.15725012846733166,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8wtcFzrh2coJE8Az2epH5T","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30478154798232504,"cy":0.21405489159275365,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cV7ZMqR486KK5uKiKyHsbD","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30478154798232504,"cy":0.26911181585277805,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6NYbyBHAQVquv8YKDCR6oa","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30629425197116866,"cy":0.3273569087969701,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"snK592eqLd3gtZUGisH7Bi","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3052840147301011,"cy":0.3874954089039585,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k347z912Q33SPm4HjDf6Ts","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30526315555234357,"cy":0.4432203131739659,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fbe5VKYd1udpQPzu38HQ7E","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2511760085627201,"cy":-0.324141032242491,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"swtWVRnxgYawbA874SNx1j","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2994859393208767,"cy":-0.35505132460179034,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5S3HYU2UW8isQw3SzAvJM6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3489741610731348,"cy":-0.32889646183622934,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5JQUVSMiMnHRjQS21Wnniz","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3489741610731348,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2KniKkjJuWzm1bjpPzKSFN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":-0.2111995793912052,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wwTA44T8asPKftHuSv9Kxj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.35133074306133744,"cy":-0.15294556686791044,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t3E52wZbbHnADbh2UbMakk","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3501524520672361,"cy":-0.09825812653991937,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"va5gGZiucR3BZro2UmUfwP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":-0.04000411401662455,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bH3pA8zNDVqLrfvegAx9xh","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.012305611514497309,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"juS4o8FwY72f2ZGpUyJTFT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.07174848143622668,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mWzf3i5nYWUXB7AZpupMGw","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.12643592176421772,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w3LD5JnAsnpX4oBsSFDj3R","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.1823122194906433,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aYmwXUwtmrJa7BKf4smZKd","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3548656160436416,"cy":0.24294394681080725,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hsDudJG9V3zUGU3c9JEDW1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3536873250495403,"cy":0.30000910193566743,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"93uFEA1egTtZQgpK4YcPrJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.35707425706052764,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u3Q4mYsqDTVks8sDVy3DEP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3548656160436416,"cy":0.4153282695838226,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6riq3e9uC7h5gp6Zomw7hq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2896595577298127,"cy":-0.015038108649498227,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rPCnFh8P3Fbb8rP7NJpXsJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":-0.04238182881349376,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jzhnP1nX9SurbY1UtSQfGN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":-0.0697255489774893,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pY9hiMs2za6x5s29sH6TC2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":-0.10182469873522315,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7QH8sk9RVXWAVfxVKeVt7q","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09406325270898373,"cy":-0.12679070410234947,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sGHLds88BbZkPQYtZDaLUx","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04339673996262456,"cy":-0.1588898538600833,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"99eVg8SaLEcFCJMaPWXD8n","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.00726977278373475,"cy":-0.18504471662564428,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"71eWvY68edyj2BgXY8WQ4o","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05440141254779,"cy":-0.21357729418807442,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7cCL63qwoUHSbtu2cHebcT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10506792529414916,"cy":-0.24329872914893902,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qibcJYeM1UJiSYmvPBWTJW","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15219956505820442,"cy":-0.27183130671136924,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"94NK21a9LTKKEhFcnnw4vS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20286607780456356,"cy":-0.2991750268753647,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ctBifLhmGgP5j5rfZjUDLe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3489741610731348,"cy":-0.384772759562655,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6eG7N9xmRDsFuyZqn8egmG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20875753277507064,"cy":0.4438608471462526,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fmhVUSuHzAWRC1bU9xS2gN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15691272903460993,"cy":0.41176169738851875,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sakLKAcwmQ8kEENPFgVJs7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10978108927055467,"cy":0.3832291198260886,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3rzPNvgYH4pwdLcevFMKV3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057936285530094174,"cy":0.3535076848652239,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1iMnenTQz4wtpVYNe7J99s","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0037348998014306895,"cy":0.32854167949809754,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o6xmo5Pn4wef9kZe2C6xqZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.042218448968523115,"cy":0.2964425297403637,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1Hb1yh1DVHfQP14FUSJEpj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09406325270898373,"cy":0.2714765243732374,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fWLDpBHepwmvJCiLxMU4RS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":0.24056623201393804,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cWx48TmtxbDy2rScmVSy7R","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":0.21678908404524636,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bFFj7b63cxrmzb377KjU2M","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":0.18706764908438164,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mAx1Vzsd2drZJEgWexVM84","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2896595577298127,"cy":0.15734621412351696,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"46a2ja51RhKgBss3KCVLnt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":0.12762477916265227,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tUaAfUGCxujqu9Y3vxe3yK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3909925832225313,"cy":0.09909220160022218,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7a2AMmJ4fbqLMH45H2iCNA","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43930251398068787,"cy":0.07174848143622668,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kkUqgHLFPwyrfMCV6mKfD5","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.38981429222842984,"cy":0.04321590387379655,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gAiz2xxrUp1UfsRWXcBSLS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.013494468912931856,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dMdBxe5wEMLJ9PEggVeAu9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.03868357598621893,"cy":0.3558853996620931,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gxnEnb3NzQY8Ge8Jm8SA7f","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.011982936760140374,"cy":0.3867956920213924,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sybUdESzHSnVaXwGfuQ7wf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057936285530094174,"cy":0.4129505547869533,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aPHnrEqwvsnVWtCHhtBxTy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10742450728235205,"cy":0.4438608471462526,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wxemx2DoJf46iBNpWXybjK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08935008873257824,"cy":0.32973053689653214,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kTFnxGqojRvyWxfgRvtskF","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":0.30000910193566743,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mzpfv3SH2Wnh3egtjjBKvT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":0.27028766697480283,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ncPJvuiPcTCVtFi2He6gAs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23899304498345342,"cy":0.24056623201393804,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6uuRE7GHEcAEe4K7GVHngk","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":0.21441136924837714,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wHfsLSo1vVCiKJ3F2NUC8n","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":0.1823122194906433,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ebXYmm7boDVkw8327EMtzH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":0.1549684993266478,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rsxKthqzEDpLfcWrcWU6dN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.436945931992485,"cy":0.12524706436578312,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pryGHMWa1mhgMofvvUeLdo","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4416590959688905,"cy":0.013494468912931856,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3FLYvn8ndZAh8K2QPPyYxf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":-0.016226966047932775,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a8jMxMQHGxEvruq2J4uUU2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4404808049747891,"cy":-0.044759543610362974,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dVQN7Pi8ydDNrsoiF2hfZe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":-0.04238182881349376,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qAgJ475UJeJY7FPcGEdpNY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.39217087421663255,"cy":-0.0721032637743584,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dpAxQujNQAySa9aSeZdEoX","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29083784872391416,"cy":-0.07091440637592385,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bYHHa97S8RXp19NoqTvPJr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2378147539893521,"cy":-0.10182469873522315,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6SeEC7fQCdKXPjZxSsdZm8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":-0.127979561500784,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aRFAARutT3NYzQH7JngjR9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14237318346714029,"cy":-0.15770099646164876,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pgXWnPt5iKo75wpgk8bAas","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08817179773847693,"cy":-0.18623357402407884,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vfvvk63mRwsRQ13tLkM2Wu","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04339673996262456,"cy":-0.21476615158650897,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4VAyz7v3pJ4ecCEvKkELct","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0049131907955319975,"cy":-0.23973215695363526,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rXXDtaCQ441CBebznnvwVP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05204483055958712,"cy":-0.26826473451606536,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8GbJtcsWZn3sFCVai2uXdu","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10506792529414916,"cy":-0.2991750268753647,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tkJiqSfGcrwkF7R5W6oWrR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1545561470464073,"cy":-0.32770760443779473,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mjVgFDC3MuuSbrQiLz8beg","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20050949581636093,"cy":-0.35386246720335574,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eZQnyiKuHTgpriho1XTkFq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25235429955682165,"cy":-0.3871504743595241,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nnhD5KcBckk4FAXqgrJz1m","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30184252130907957,"cy":-0.4121164797266506,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vddHcoVWtVSFne7zHaZDoV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.041040157974421676,"cy":0.4129505547869533,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nthJ9ZXFLF4YVLkK6FJg3G","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09052837972667965,"cy":0.38560683462295775,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pHpx6NN38VbLKsAdjvQq5X","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":0.3535076848652239,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tReNdr6BMknW3pKaaKgT2r","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":0.3321082516934013,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pky3qKmcQv6goYMFfPrQyu","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2378147539893521,"cy":0.30000910193566743,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9Gh4oxs7xr6bu526hDNvv2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":0.2714765243732374,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fxzu2mix8VrfcwwGyVpWmZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.24175508941237273,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e8sL54r9712juxaxDn8oSw","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":0.21441136924837714,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kNyq87ppcAxC6iAJLfFYPn","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":0.18706764908438164,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h3uTywdm7RShuhnZCn9reC","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09052837972667965,"cy":0.4426719897478181,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pJncozy6Rz8EfewNTzBV9a","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":0.41413941218538786,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vvMUbsrcSiSjwP7Y5tU1LL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.18832653223709409,"cy":0.3867956920213924,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1G8NT1Zoz87anyKBPQsHLd","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":0.3558853996620931,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i9YQqnCZv92BFJFHn7cCiB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":0.3261639647012283,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s3UMZ6yA8AhemDugYV8vL9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.29882024453723294,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iE5KVmshBFmCedVRvmAraQ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.387457710240227,"cy":0.2714765243732374,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nSoRZ2ohopc3Uk2eEhsaXz","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":0.23937737461550349,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tRnf3HbPJnHGQc3C1tHrm4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":0.3000091019356675,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5GNzWP1xJUZHh9KT6YRFV6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.387457710240227,"cy":0.32973053689653226,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gYVeyGSA6dumwRgt46oGj8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.3558853996620931,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3SLWKQyMH3qNnSL8cb6Mxe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":0.3856068346229578,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o1MFq3LbkcxftPFeSVY2YQ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24017133597755486,"cy":0.4177059843806916,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1x2T8djMTuLWynXEnNgMbT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":0.44267198974781796,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ccqgw8SRNmHVUFFbXRyYT9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2896595577298127,"cy":0.4450497045446872,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"m1JXedMn92Urk8nE9oPJHC","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.4141394121853879,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o67PeKaAkvwQrD7JVLdGYg","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3862794192461258,"cy":0.3844179772245232,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bkfCZxyk73k4a4vrgwaj4L","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43930251398068787,"cy":0.35469654226365854,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vrgCite9XpUW1Cq3PuWhba","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":0.4188948417791262,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cRNc4mNhvgSvQLUkp5faWt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.38981429222842984,"cy":0.4438608471462525,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5xRxzmnaiMp3ypfUVQBWr3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.010804645766038935,"cy":0.4438608471462525,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5CzxLZbvH5PomobdfeXNZp","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.44029427495094886,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9h3yDXtr329orX1FLE5i63","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4031755468017982,"cy":0.3844179772245232,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7nTZRLPEdEtBjmsWCnB26y","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4514854775599548,"cy":0.4165171269822571,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"abEAsj1hGeo63K5YHetkKr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4055321287900009,"cy":0.32973053689653226,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hsqeY3fPZZkvqziKNEVVas","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45502035054225903,"cy":0.3582631144589623,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dCHY6fHL88UK5U5JeNTwME","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43930251398068787,"cy":0.4723934247086827,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8a2tR8FURhfjJTiYpNfCzv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4404808049747891,"cy":-0.10063584133678853,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3TNP5AjyGeTgzNXWzYVznQ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.38510112825202436,"cy":-0.12560184670391483,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"saWHMFZynA21qy5pjZ1rg3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3367911974938678,"cy":-0.09825812653991942,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vYyqsMkXopji3o4ewZDzXj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4404808049747891,"cy":-0.15770099646164878,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bDcv52Ek3SJZueMz72m1rB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":-0.18266700182877516,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pg6C9LvjyDQAKpVjTFWKhm","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3426826524643748,"cy":-0.15413442426634502,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7xxy5WMi2eRmAFJQd4PEpL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":-0.13035727629765329,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bKrn5V4VqTw7TEK7QKYeA1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43930251398068787,"cy":-0.21476615158650897,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s6CxUXipAWMWAd8W2jdPk2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.387457710240227,"cy":-0.2385432995552006,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7pEWxcY19Ng2hczQx4C5sh","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":-0.21238843678963976,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rqhBmqo9RCaSK9b3hCeo3X","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29083784872391416,"cy":-0.18385585922720973,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nbbJ9oZ8jEaCweY8WgVHtK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24017133597755486,"cy":-0.15532328166477963,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5DwWFBTuxqVLf5FzhT7Udm","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.18950482323119552,"cy":-0.18266700182877507,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n5ksBwaEKwnY1T4um6u5YV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":-0.21595500898494352,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oRnvwa7g1CtYiocfQSv6ZH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09288496171488242,"cy":-0.2421098717505044,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"szeJxCXxaL2e3RjfwM8x47","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04339673996262456,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hFu14KzwBM87w56f6Cwr48","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0037348998014306895,"cy":-0.29798616947693,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sQMsnkxn9T5AgrjfJHH51n","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05557970354189131,"cy":-0.3277076044377948,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7GDJiXyhG6C4hNkW9Y5KQ1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10624621628825073,"cy":-0.3562401820002249,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kRdHgfFG6booP82zfM58L5","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15337785605230575,"cy":-0.3835839021642204,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5bnXwcCDLMuTi7NBVNs9wq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2016877868104623,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2cSu4Me9dQhmQX73fnfjcT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25235429955682165,"cy":-0.4406490572890806,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"epJz3sQxCaTSmtVk8L41pY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4416590959688905,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u5wXENdced4NnZ2UpBvdUR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.38981429222842984,"cy":-0.29798616947693,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2dN8txQPwqUuXJ6MvLow8v","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aCzYNDZyfJEdri5oFDAX1A","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29201613971801543,"cy":-0.2421098717505044,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xw95hcJakBfeUDzB5drZTb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2378147539893521,"cy":-0.21357729418807436,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7aFDGFAZUmGKJWfMUn4u8W","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":-0.2385432995552006,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wYpaiw5NjZeqmt9x2asvgE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":-0.2742090215082384,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bSFykzxR6KFC6U5RmABfAo","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09052837972667965,"cy":-0.29798616947693,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"td3wNUExEJkcF3U68VMTCS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04457503095672587,"cy":-0.3300853192346639,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gqiho9LGuhUyb3Qus7okQR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2931944307121169,"cy":-0.295608454680061,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kqCmYed2jAt9y67YpwCDE9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23899304498345342,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dgxBqcP8E136o93HKbnb5Y","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.436945931992485,"cy":-0.3277076044377948,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"d8xVLuSbdR3ZcdTaGVf3kE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":-0.3574290393986594,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mE2ubFBooCHdCnyZX6Q2fn","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.34150436147027335,"cy":-0.3300853192346639,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rNH5NZ3ioMN6XFUt4UpHjp","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":-0.384772759562655,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ov1As6JoGWeAANi2w4bAzb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.387457710240227,"cy":-0.413305337125085,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9AGm3XGuztXYa4ZvvUC2qU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.44283738696299196,"cy":-0.4454044868828189,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"whp3eTFpZtyHh6MmQTeqsP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":-0.384772759562655,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2tivptcQ7UJFtBc3QNMdjZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29083784872391416,"cy":-0.3538624672033556,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8BKcu35Qa4TPVNvr9QNtYS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24017133597755486,"cy":-0.32889646183622934,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s8GdNU4Xh5bDiYNyPpM5c2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":-0.295608454680061,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"geLZV2TE4SAkBTxY2H7z9C","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":-0.3277076044377948,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cR5NttdPtQtKZ2QuGZ4cGY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09406325270898373,"cy":-0.3586178967970941,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kb64JmF4g2VHNUXt8PGp8P","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":-0.35505132460179034,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ohyVoqyh1fSJAZvoWLa7xg","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23899304498345342,"cy":-0.3883393317579587,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mam3m1MFMR6QYaVhMhUf61","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29083784872391416,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9otfxK8a8saUXNrV48ac1S","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3450392344525775,"cy":-0.4430267720859498,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3FE8UkdGNZdxozENEdAKLF","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2896595577298127,"cy":-0.4679927774530761,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1itKaxAe6PPjB36Ct9WPbt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24017133597755486,"cy":-0.4418379146875151,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mEwqoN1Hgzq1sZEWWYtYiS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mvPqyD2QhB4pgXGsya35Az","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":-0.3859616169610895,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"icedHX9AjRRV6K9qLRi8h8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09052837972667965,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ixMrfpnNCx2pzdbjNDcETK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04693161294492862,"cy":-0.38239504476578573,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fJa1KgR4efS7rdWz3c5ws6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":-0.4418379146875151,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"niDVT6JMXYiQ1MfkaVXBh2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":-0.4679927774530761,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9WTjUWsouqRDt3WAX9og5p","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09406325270898373,"cy":-0.46680392005464155,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gJWF9BbGWqJ5RiBTFKBvEy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04339673996262456,"cy":-0.4418379146875151,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8vSWbpHRJezXwxg2bzLK15","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.001378317813227938,"cy":-0.35505132460179034,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"89LTrNQMYLBWkUr8q3zs78","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0025566088073292518,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mG1153YuBpGiUTcG3cLKhu","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.053223121553688676,"cy":-0.38715047435952415,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nzaobVxpQX5ZDLxNtod1tq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10388963430004787,"cy":-0.41092762232821595,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"prucxap8in3eRt1hXbqSZc","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.050866539565485806,"cy":-0.4430267720859498,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o6dCXRccq7VrMuTGUAMf1h","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0037348998014306895,"cy":-0.46918163485151065,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1CeJhTWdV6HVNMGZiebhVN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10271134330594656,"cy":-0.46918163485151065,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iuVig88Eryb498jb2o9hv6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15691272903460993,"cy":-0.4430267720859498,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pDU7v3xRa7tyafHMTVQfHP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.19815291382815808,"cy":-0.4703704922499454,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"igDxZaX9vHP2AWnmuk7rbE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30302081230318084,"cy":-0.46680392005464155,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hpSEihRmM4bWqGtADkL3iV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3501524520672361,"cy":-0.4418379146875151,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k6hVcQ4HsjPmK2AMBXFwSG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":0.471204567310248,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pQWMSf63o2UZvbixbJ7x3a","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.47001570991181346,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iHs7hh1fgkTvcFjQGp6vdU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2511760085627201,"cy":0.471204567310248,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ikwnSMkfVme9m36c4fdgzZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15337785605230575,"cy":0.4688268525133789,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3BVEG2ZatFh5rurg1BfDQ1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057936285530094174,"cy":0.4688268525133789,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5TTwQeht2y67yFHpDwk7SG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.042218448968523115,"cy":0.471204567310248,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qt4yLExJpLTBowT6VPA2t7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14472976545534302,"cy":0.4688268525133789,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wtXgsveFPNuvG8yagrGhjX","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":0.4664491377165097,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jCucxgVjuLNfUB5GcZ3GBJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.34150436147027335,"cy":0.47001570991181346,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bvUs4vNUy7rjJ8wRozhXzH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.2702876669748028,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"21jCj69kYjWbi43ijo148n","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.21084479705307344,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"autBoAyzdvNAZVDtBQh6h3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.1537796419282132,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"opKFYN72H4nWcaRQ2QPip7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3996406738194939,"cy":0.10028105899865679,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"66RKD94s3WovZtoVdR4EhK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.04083818907692739,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t1o1k82fPneidh8LG91KZ3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40199725580769696,"cy":-0.016226966047932775,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q8YoP7VA8Cq7aoqvmhWueh","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3996406738194939,"cy":-0.07091440637592385,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"d6BxohUXx7jMxtc9jXais2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40081896481359536,"cy":-0.12679070410234947,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"akDuRhxwpxoj2z33rJUgJh","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.18266700182877507,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hzYm1dhZ9LLt7sqemmYCDs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.2409210143520699,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ocH8rQddgtgbqC8pcEacuE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.2991750268753647,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uF9F47Z6PqiJhWoStgn2uS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.3574290393986595,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"92fYhQy7HvXbtXrCyTCqTH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.4097387649297813,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kUJd8a2SHxduSfAvQGLQfS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3996406738194939,"cy":-0.4703704922499452,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9XaXTUvPm9yFtUaW2Ye2sL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45502035054225903,"cy":0.30119795933410204,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cg7BBRL4WcDqB8yp1B7o8a","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.452663768554056,"cy":0.24294394681080725,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pAcNoDp7ir4EWPT9j9kq1e","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4514854775599548,"cy":0.1870676490843817,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8nXK8m2dvdiFfCKeR9nLWj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.452663768554056,"cy":0.12762477916265233,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eP1EoT59gCuUXxYM4EXHzS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.452663768554056,"cy":0.07055962403779206,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1gjtQCskcuhbhwoNpKGBt7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":0.012305611514497309,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jimkC6zfk4aDVcsqbirSS1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.44677231358354924,"cy":-0.04238182881349376,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vvgZbtsp1caVNW8tZNWHgJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":-0.09706926914148485,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uAVWMCSJd4PAg19UJ7o6xs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45266376855405616,"cy":-0.15888985386008334,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ncdztpRTU1hDfYCvqpzcT2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4467723135835491,"cy":-0.21595500898494358,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bRuvkqPWMiR7YmistgDHNL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":-0.26945359191449997,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5qeiecJQD6oAbtikN5hs7G","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4491288955717519,"cy":-0.3265187470393602,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"acpCXRHPZv9nQZjdjiSrj1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":-0.38358390216422034,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"c6tcyDJgJPeoowWMPezdUA","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4491288955717519,"cy":-0.4406490572890806,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3tXdUQvFc2DWP68yZ3S37u","selected":false}],"view":{"yearlyPvYieldPanelX":-1278,"autoRotate":false,"mapZoom":20,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":47,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-284,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":164,"groundColor":"#68ccca","groundPanelY":0,"groundImage":true,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[54.58775332762295,-93.02576361051297,20.93606976764628],"panCenter":[14.588117257653206,-3.3871234541530884,0],"orthographic":false,"enableRotate":true,"cameraZoom":10.266841665590098,"showInstructionPanel":true,"cameraPosition2D":[2.3674379904539022,-0.42904140754321896,47.99999957096287],"panCenter2D":[2.3674379904539022,-0.428993405410401,3.192361204877974e-7],"showEvolutionPanel":false,"solarRadiationHeatMapMaxValue":8,"evolutionPanelX":-3,"evolutionPanelY":5,"showEconomicsPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":520,"height":318},"showMapPanel":false},"evolutionMethod":2,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"notes":[]}')},433:function(e){e.exports=JSON.parse('{"docid":"9J5vzBxZ8UEKUiQGnyPEwk","time":"02/03/2023 10:36 am","timestamp":1675438564802,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":true,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"52 Grove St, Lexington, MA 02420, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.473578752859865,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":true,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.23642289182585},"elements":[{"type":"Foundation","cx":0.18907611516527822,"cy":-1.4953477366662633,"cz":0.05,"lx":142.99409463043497,"ly":14.49686547290569,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.17972820802569928],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"f1wuYrFxWZKMD6aZyPACDm","locked":true},{"type":"Wall","cx":0.1229949609826312,"cy":-0.09586926546103025,"cz":0,"lx":141.43921506444258,"ly":0.3,"lz":5,"relativeAngle":0.013431200616335025,"leftPoint":[-70.59023385930746,-1.045689943643172,0.1],"rightPoint":[70.83622378127272,0.853951412721111,0.1],"leftJoints":[],"rightJoints":[],"textureType":"Wall Texture #9","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0.17972820802569928],"parentId":"f1wuYrFxWZKMD6aZyPACDm","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"2yrSxZa8P37K2Wabhhsob6","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"color":"#999999","fill":"Full","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.4638388297765159,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0],"color":"#fff","parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"6TnNeQH6erPu8fzCqspsQz","selected":false,"dailyYield":6.733366737790442},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4638388297765159,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"gu6EsH65oiQstx8yYjxsYM","selected":false,"color":"#fff","dailyYield":3.991431891754075},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4638388297765159,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"94hqXM6tCStbzXuLLtVMBy","selected":false,"color":"#fff","dailyYield":3.989257482553087},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4072774299104671,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"aS89FFbHtiL5JbmajBYETF","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4072774299104671,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"iMsrFuB8C7dYwSkPYpkRyx","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4072774299104671,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"djV64xj6hwTLYAQB2N8zw1","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.35071603004441837,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"casseicLyjsxNGnJT7DvaK","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.35071603004441837,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"ufBkyVjzMhQN4mEaVXo3EK","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.35071603004441837,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"rG69gXx8zf5z7bd3jLid7p","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.2941546301783697,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"4mhiWnxVt3aSMz3WDvtVwo","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.2941546301783697,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"cfXV4fZanitQvrNsdxnjDu","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.2941546301783697,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"afxfcWAVeGHfrBf7ddtQkK","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.23759323031232094,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"taypcJAabEnqBDqf3KAcsA","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.23759323031232094,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"5VSFMaiUtr3ASxPZrLPaqP","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.23759323031232094,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"khqKJ2jxRFmMw5yFH4HvBM","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.18103183044627222,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"45VggV1fJxeJNM36B2hiQt","selected":false,"color":"#fff","drawSunBeam":true,"dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.18103183044627222,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"soXBAY8jJsisj3Xad7rpuD","selected":false,"color":"#fff","dailyYield":3.880541409581155,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.18103183044627222,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"sR2RBNakCEySyoLGEeeZb7","selected":false,"color":"#fff","dailyYield":3.8640428284166424,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.12447043058022349,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"iwZXtRNQgv7fvMRfiFZxuv","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.12447043058022349,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"wUSzVi6q69sDd7Y3RV7XDc","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.12447043058022349,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"g8656tJazY4VvwetGnGz1R","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.06790903071417476,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"1BNASUXS635gRH1Xg45X8c","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.06790903071417476,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"jqyPzfhR61a76okfZpf812","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.06790903071417476,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"gxBypDUjEGfJT4aJY4HKEm","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.011347630848126027,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"tzyoRV5o5Rf6T7A6oU6yFQ","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.011347630848126027,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"jGQqULp9xXooyUSarLteE1","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.011347630848126027,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"c5nbEjzq2Budgo4DrHmjRz","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0452137690179227,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"7DRo8NdVHyNoN6SCtArVVd","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0452137690179227,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"rq26S8tSgsT11vC4noGToG","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0452137690179227,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"4ZMNCLswMsFA8KarYUVw1G","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.10177516888397144,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"22DFqVGzrGpriDvT6ouxg7","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.10177516888397144,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"vvfCJue14aYCZ2L5rcpewf","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.10177516888397144,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"hhenx4zMnvUHuryKk9FFB8","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.15833656875002017,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"tNCMqiL9tn5diapj3smKL9","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.15833656875002017,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"3GsZ7gQePP2KmUhz3ysWpz","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.15833656875002017,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"qBPNAAa4HnjwBJ2TFMVzhv","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.21489796861606889,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"raUT5Fe7Z4gk2QVK2yVSap","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.21489796861606889,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"18BeCBetcY2SnC96NdiyGR","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.21489796861606889,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"jJw5xahWNQv9BKodgpDQUR","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.27145936848211766,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"1MiLx5fG5sgnXzzKVfatuF","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.27145936848211766,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"giGW7icqfR8Ad9ukdMMaHX","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.27145936848211766,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"bYrSiMQSXtGa7p4zv5yDGZ","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3280207683481664,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"vcPTnmFnHZYKsoYKkBcskf","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3280207683481664,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"cAD7dLSqyYRtYyQsTG2mbb","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3280207683481664,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"rTvMYE5Z5kwPgoWKh4kLzb","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3845821682142151,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"k4ZudXKEZmAmfbUvaCp3Dp","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3845821682142151,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"8hVfJjo52dDJLo4AfmT3HK","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3845821682142151,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"9g31dfD7wp3rjSRfYLZJ2z","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.44114356808026384,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"sxZHfHVk2n5kbhzY3hT2zd","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.44114356808026384,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"nA54BbzpGLqh5sWi7osbnq","selected":false,"color":"#fff","dailyYield":4.024242246107118},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.44114356808026384,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"vtRkLNQDgqTSNAh2My5c9Y","selected":false,"color":"#fff","dailyYield":4.009918074143593}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-17.282790575888168,5.440474449160031,0.0000036906384867201037],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-17.282790575888168,5.440324442496329,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":19,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-42.77632157556409,-34.119265652337766,20.000447749982982],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":true,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":6.470670899474179,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-26.714608093209538,-11.412788709722923,0.2632378650359435],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":4.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":413,"height":68}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["A proposed solar noise barrier in Lexington, MA"]}')},434:function(e){e.exports=JSON.parse('{"docid":"mETyjNhcSpLHUreuu362jG","time":"02/03/2023 10:33 am","timestamp":1675438394402,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"9/22/2022 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":true,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"S H St, Bakersfield, CA 93313, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":35.2397498816683,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-119.02084409607578},"elements":[{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"121ogbDPhqFdjF1EqsotWr","foundationId":"121ogbDPhqFdjF1EqsotWr","id":"bXdahMaM63p5YKq5iW5dkA","selected":false},{"type":"Foundation","cx":-0.355148183178954,"cy":-68.66520831611422,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"121ogbDPhqFdjF1EqsotWr","selected":false,"textureType":"Foundation Texture #5"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"e1EQqVFfXevnZt4eaeuVPE","foundationId":"e1EQqVFfXevnZt4eaeuVPE","id":"kGbBKyVArnRt64dJUZUHXo","selected":false},{"type":"Foundation","cx":-6.512082441645507,"cy":-68.66019836570281,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"e1EQqVFfXevnZt4eaeuVPE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5AYGqMpb7MY45GfUGrAPx7","foundationId":"5AYGqMpb7MY45GfUGrAPx7","id":"pHgsi4FBAPcCENbBFq8nJi","selected":false},{"type":"Foundation","cx":5.789049041421398,"cy":-68.36660414055642,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"5AYGqMpb7MY45GfUGrAPx7","selected":false},{"type":"Human","name":"Jack","cx":1.2131787149033482,"cy":-5.683681388279453,"cz":0.300000011920929,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"5AYGqMpb7MY45GfUGrAPx7","id":"echEghBkfqunhtqJQz95fM","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1207079978734572,"cy":-0.004668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xgFeRbJGihUVnyEf5m22ib","foundationId":"xgFeRbJGihUVnyEf5m22ib","id":"1ZYTz63nWtEEsbRNhgdFaw","selected":false},{"type":"Foundation","cx":5.809815585913138,"cy":-54.46106108413,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"xgFeRbJGihUVnyEf5m22ib","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nAmb8PRM1R6jeNzPW5C8VV","foundationId":"nAmb8PRM1R6jeNzPW5C8VV","id":"4zJUqXV3Fnf2nuwbpsMiXs","selected":false},{"type":"Foundation","cx":5.7835484198244025,"cy":-40.561453025263894,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nAmb8PRM1R6jeNzPW5C8VV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"2Jpks6qcta7oxTq8g15yvM","foundationId":"2Jpks6qcta7oxTq8g15yvM","id":"nTqyuFThYbp62RDDvj69Tn","selected":false},{"type":"Foundation","cx":5.765589353420241,"cy":-26.70562418723046,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"2Jpks6qcta7oxTq8g15yvM","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4XXqf2vXZ7ZFawMdYuzXJR","foundationId":"4XXqf2vXZ7ZFawMdYuzXJR","id":"8xX37o12HQw79GgWaPoJra","selected":false},{"type":"Foundation","cx":5.7629992141008515,"cy":-12.846184608655223,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4XXqf2vXZ7ZFawMdYuzXJR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nhfGp8zoAtBhBtTRQS5X4A","foundationId":"nhfGp8zoAtBhBtTRQS5X4A","id":"xtX3Yeicb1xmckA4hRhAbT","selected":false},{"type":"Foundation","cx":-0.3660148444167448,"cy":-54.735545319487315,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nhfGp8zoAtBhBtTRQS5X4A","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ibdbY4z7waLLai5mudLon8","foundationId":"ibdbY4z7waLLai5mudLon8","id":"uUyvA9DB8ymLg6XLaLfYFQ","selected":false},{"type":"Foundation","cx":-0.35970964251660265,"cy":-40.85602650039143,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ibdbY4z7waLLai5mudLon8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vXadeokGJ9NmeA6ewhjvBy","foundationId":"vXadeokGJ9NmeA6ewhjvBy","id":"ippQMjL5WuoRmncEHb3ng3","selected":false},{"type":"Foundation","cx":-0.35809920705666,"cy":-27.00228253941227,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vXadeokGJ9NmeA6ewhjvBy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"j9vK8NMr2vp4GiSK1DtxRq","foundationId":"j9vK8NMr2vp4GiSK1DtxRq","id":"ntm7qPuXg8vaHHDMEfMv14","selected":false},{"type":"Foundation","cx":-0.35734216826093124,"cy":-13.132067218686498,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"j9vK8NMr2vp4GiSK1DtxRq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"2WSX6m9s99dM4WhZbyuvff","foundationId":"2WSX6m9s99dM4WhZbyuvff","id":"gkBV2ZfxJtfhuZjj7rHAoZ","selected":false},{"type":"Foundation","cx":-0.3463719972166439,"cy":0.7317163979243815,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"2WSX6m9s99dM4WhZbyuvff","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eLNa4YNCioCE3UNDGya3Up","foundationId":"eLNa4YNCioCE3UNDGya3Up","id":"rWFuzCeuZszy77yBB8jveg","selected":false},{"type":"Foundation","cx":-0.3586608333447727,"cy":14.590396355482044,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eLNa4YNCioCE3UNDGya3Up","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o1CCZc1sDeTQWrwG46TfNN","foundationId":"o1CCZc1sDeTQWrwG46TfNN","id":"qShFLxfnobEyyoPeMTASuG","selected":false},{"type":"Foundation","cx":-0.3518720954179425,"cy":28.454375484604732,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"o1CCZc1sDeTQWrwG46TfNN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"u1RK5NeNA9j7qFSmCR8hid","foundationId":"u1RK5NeNA9j7qFSmCR8hid","id":"rCYT7zsMynuWwB4Gj2Fsd3","selected":false},{"type":"Foundation","cx":-0.35131046912982616,"cy":42.32211519647182,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"u1RK5NeNA9j7qFSmCR8hid","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h9eRaQKsYCgZDNL6TBSdkG","foundationId":"h9eRaQKsYCgZDNL6TBSdkG","id":"iciTKiFoWiSSRXfRV2jKAY","selected":false},{"type":"Foundation","cx":-0.35806918169835766,"cy":56.17571570619225,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"h9eRaQKsYCgZDNL6TBSdkG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gdwqBp4tF8xLp9yJkFqCx6","foundationId":"gdwqBp4tF8xLp9yJkFqCx6","id":"88NfQv74cDhjrzSepw9B7g","selected":false},{"type":"Foundation","cx":-0.3684777264545248,"cy":70.01231995987031,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gdwqBp4tF8xLp9yJkFqCx6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"16YsecagZdQFboT8cHk3zY","foundationId":"16YsecagZdQFboT8cHk3zY","id":"uWF3E9dPiegXh2L5b6Vsn8","selected":false},{"type":"Foundation","cx":5.774616554678275,"cy":1.0295178181583675,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"16YsecagZdQFboT8cHk3zY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gdCn75FBte524E9epTDvqA","foundationId":"gdCn75FBte524E9epTDvqA","id":"tFCws2tPQDLM5HKxxJGgWv","selected":false},{"type":"Foundation","cx":5.773867010320257,"cy":14.885614964778393,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gdCn75FBte524E9epTDvqA","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"qLVXWryBBGmRgAroLqVwdi","foundationId":"qLVXWryBBGmRgAroLqVwdi","id":"ud1b2bEhTi9i92Q8c8D373","selected":false},{"type":"Foundation","cx":5.778389095695882,"cy":28.74465191336493,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qLVXWryBBGmRgAroLqVwdi","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bVwMiP2aUzVjjeaX792zXn","foundationId":"bVwMiP2aUzVjjeaX792zXn","id":"c9QcDJ4K8yR1ng4dRJ4D4t","selected":false},{"type":"Foundation","cx":5.784822839568983,"cy":42.61795388645869,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"bVwMiP2aUzVjjeaX792zXn","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nW5ArCP1HhxjesUyKCR3at","foundationId":"nW5ArCP1HhxjesUyKCR3at","id":"gxJYgTJqcdLmnzufEv3zS9","selected":false},{"type":"Foundation","cx":5.772865019410357,"cy":56.469133301847506,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nW5ArCP1HhxjesUyKCR3at","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ez9S4TjyRrt69CUc8NCPjT","foundationId":"ez9S4TjyRrt69CUc8NCPjT","id":"715S84avByaQTs2A6QaRyi","selected":false},{"type":"Foundation","cx":5.767433266447149,"cy":70.31691119865602,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ez9S4TjyRrt69CUc8NCPjT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k7PuJZ5ck1CDCnF49AEbze","foundationId":"k7PuJZ5ck1CDCnF49AEbze","id":"rBjhWRGRVr5rhJmJ7ZHt5W","selected":false},{"type":"Foundation","cx":-6.527392714190696,"cy":-54.732229116611116,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"k7PuJZ5ck1CDCnF49AEbze","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rU3754fwdgKoDWv2zoFH3R","foundationId":"rU3754fwdgKoDWv2zoFH3R","id":"1Wbh9tZMmYnYRWgQs2oxcg","selected":false},{"type":"Foundation","cx":-6.534711172615536,"cy":-40.8521892213242,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"rU3754fwdgKoDWv2zoFH3R","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmvt2utUNYmiSjixPNE6cB","foundationId":"rmvt2utUNYmiSjixPNE6cB","id":"hgGCNRfRRjgNRbKehkHZRR","selected":false},{"type":"Foundation","cx":-6.531475518119176,"cy":-27.005759344492336,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"rmvt2utUNYmiSjixPNE6cB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5D8LWb5KSCQa5CzJgeqTzQ","foundationId":"5D8LWb5KSCQa5CzJgeqTzQ","id":"4q6sn5L82weCVDGzpuu2sX","selected":false},{"type":"Foundation","cx":-6.531475518119178,"cy":-13.125523095938771,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"5D8LWb5KSCQa5CzJgeqTzQ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kvv1recmXZdZQMtZey2snR","foundationId":"kvv1recmXZdZQMtZey2snR","id":"iy2Xwp5VW7Kj9siFtt7QWd","selected":false},{"type":"Foundation","cx":-6.508807101463274,"cy":0.7373815692707449,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"kvv1recmXZdZQMtZey2snR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xb3DDtTRb2xE4U4z4K1hXE","foundationId":"xb3DDtTRb2xE4U4z4K1hXE","id":"nMuKPt4koMQGztfZfy8jfD","selected":false},{"type":"Foundation","cx":-6.5258084139552,"cy":14.606283609496337,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"xb3DDtTRb2xE4U4z4K1hXE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gwy36bVzcps8LsRhJTof4Q","foundationId":"gwy36bVzcps8LsRhJTof4Q","id":"i67r94XMRFM3jCvyxogFNy","selected":false},{"type":"Foundation","cx":-6.511475518119177,"cy":28.4721869622139,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gwy36bVzcps8LsRhJTof4Q","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7zg5mcdSFwxHKAWZT3Ek6v","foundationId":"7zg5mcdSFwxHKAWZT3Ek6v","id":"eRWg2zs6foonE5xuNEVRz9","selected":false},{"type":"Foundation","cx":-6.511051943403113,"cy":42.34375751909987,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7zg5mcdSFwxHKAWZT3Ek6v","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"suByeHBWYCe52G1Gv4ZeSU","foundationId":"suByeHBWYCe52G1Gv4ZeSU","id":"phLDTcCNd2W2ZnrjoTkBjB","selected":false},{"type":"Foundation","cx":-6.52880710146327,"cy":56.18132525099307,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"suByeHBWYCe52G1Gv4ZeSU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jfGqSpqYfY4BpzvBjow99u","foundationId":"jfGqSpqYfY4BpzvBjow99u","id":"shmgnG7kSY3iWfHSTksGd3","selected":false},{"type":"Foundation","cx":-6.53447420562725,"cy":70.03322597872673,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jfGqSpqYfY4BpzvBjow99u","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[7.48786322173483,69.21304781831628,0.00006921612429673364],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[7.48786322173483,69.2130278174273,20.000069216086263],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":19,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[14.98566534119282,-94.01207606498471,5.484037741591015],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":true,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":38.96037486782548,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-22.269354989815284,10.551050181634587,0.4104687909980791],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":366,"height":67}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["A proposed solar canal in California"]}')},435:function(e){e.exports=JSON.parse('{"docid":"vhboPhKYLs7YFW4GNHvu35","time":"02/02/2023 05:12 pm","timestamp":1675375965968,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"timesPerHour":4,"address":"Natick, MA","name":"default","longitude":-71.3488548,"latitude":42.2844063,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"date":"8/22/2022, 2:00:00 PM","orthographic":false,"cameraZoom":43.16939043526371},"elements":[{"lz":0.1,"rotation":[0,0,0],"normal":[0,0,1],"cy":0.03672476718970863,"id":"iGgGyZAWhJDDrqTBSuKY6v","ly":10.412088787523913,"type":"Foundation","cx":-0.02675735166375759,"selected":false,"cz":0.05,"lx":16.616755394628733,"parentId":"Ground"},{"lz":0.046,"selected":false,"cz":0.5000000074505984,"relativeAzimuth":1.5707963267948966,"cy":-0.10449299890247031,"cx":-0.4024621157154061,"poleRadius":0.05,"showLabel":true,"lx":1.046,"label":"VSAT","tiltAngle":0.5235987755982988,"poleSpacing":3,"rotation":[0,0,0],"poleHeight":1,"trackerType":"VSAT","drawSunBeam":true,"orientation":"Portrait","ly":1.558,"type":"Solar Panel","id":"dnMAS4xYMUhcSByeLwN5TX","normal":[0,0,1],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.9974383842410144},{"ly":1.558,"drawSunBeam":true,"selected":false,"normal":[0,0,1],"id":"wc8yTNk8bcNL8vA26NKhEp","tiltAngle":0,"poleRadius":0.05,"poleHeight":1,"rotation":[0,0,0],"type":"Solar Panel","lz":0.046,"trackerType":"HSAT","lx":1.046,"label":"HSAT","cz":0.5000000074505762,"showLabel":true,"cx":0.13515302447733513,"poleSpacing":3,"relativeAzimuth":0,"cy":-0.10573019166804135,"orientation":"Portrait","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":2.073422461213974},{"lx":1.046,"poleSpacing":3,"rotation":[0,0,0],"orientation":"Portrait","poleHeight":1,"showLabel":true,"tiltAngle":0.5235987755982988,"normal":[0,0,1],"selected":false,"label":"AADAT","lz":0.046,"drawSunBeam":true,"id":"r18XcJKcSLBW2tCEW6s74k","relativeAzimuth":0,"cy":-0.09709770433882582,"type":"Solar Panel","trackerType":"AADAT","poleRadius":0.05,"cx":-0.13700106436587867,"ly":1.558,"cz":0.5000000074505806,"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":2.215778465205723},{"tiltAngle":0.5235987755982988,"normal":[0,0,1],"rotation":[0,0,0],"lz":0.046,"poleSpacing":3,"selected":false,"cy":-0.11542091451120043,"drawSunBeam":true,"poleHeight":1,"lx":1.046,"relativeAzimuth":0,"trackerType":"None","cx":0.4032836323996918,"showLabel":true,"id":"u4LjNU3fd3PVZ6QAX6aug1","ly":1.558,"poleRadius":0.05,"label":"Fixed","orientation":"Portrait","cz":0.5000000074506161,"type":"Solar Panel","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.590603475645371}],"view":{"weatherPanelX":0,"heliodonPanelY":314,"showStickyNotePanel":true,"dailyPvYieldPanelX":4,"weatherPanelY":0,"dailyLightSensorPanelY":525,"mapZoom":16,"showHeliodonPanel":true,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":-1204,"theme":"Default","autoRotate":false,"groundColor":"#16a5a5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":true,"mapWeatherStations":false,"dailyPvYieldPanelY":1,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":-1277,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[12.032136043105444,-19.275007353612423,7.568306918458618],"panCenter":[0,0,0],"orthographic":false,"enableRotate":true,"cameraZoom":41.01092091350052,"stickyNotePanelX":5,"stickyNotePanelY":2,"cameraPosition2D":[0,-0.00004000177797536253,39.99999999997981],"panCenter2D":[0,0,0],"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar trackers\\n\\nAs the sun moves across the sky, solar panels do not always face the sun. Solar trackers allow them to follow the sun like sunflowers to maximize their outputs. This model compares the outputs of solar panels driven by the horizontal single-axis tracker (HSAT), the vertical single-axis tracker (VSAT), and the altazimuth dual-axis trackers (AADAT), as well as that of a fixed solar panel. You can also animate the movement of the sun to see how the solar panels follow it."]}')},436:function(e){e.exports=JSON.parse('{"docid":"stLbuVGfE2K8DrmoYsFg9w","time":"02/04/2023 02:04 pm","timestamp":1675537455512,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":14.613120903558068,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.06554753263096413,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-7.418371930827338,"type":"Foundation","solarPowerTower":{},"lx":18.159918676696766,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":4,"roofId":"pNA4YvnHKpbgLLZoVdn8iH","ly":0.3,"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[6.699943397855505,5.67322456909281,0.1],"type":"Wall","rightRoofHeight":4,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.6999433978555056,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.6732245690928105,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.699943397855504,"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"cy":0.6732245690928105,"leftRoofHeight":4,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":4,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":4,"roofId":"pNA4YvnHKpbgLLZoVdn8iH","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"lx":10,"windows":[],"lz":4,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"pNA4YvnHKpbgLLZoVdn8iH","selected":false,"cy":0.6732245690928105,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4,"ly":0.3,"cx":-5.300056602144494,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"showLabel":false,"cx":0.6999433978555061,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-4.3267754309071895,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"pNA4YvnHKpbgLLZoVdn8iH","leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"ly":0.3,"lz":4,"leftRoofHeight":4,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4,"lx":12,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,6],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,6],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Foundation","cx":-18.384386246268818,"cy":-7.395598164511793,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"pNA4YvnHKpbgLLZoVdn8iH","leftRidgeLength":6,"rightRidgeLength":6,"rise":2,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2,"ceiling":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["1k67G1W1gvb3E7EbmbG1h1"],"rightJoints":["uytQSeUom5oDsFC3PKa7q8"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u1AdedeCmmKa3QYfwjJ4ya","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["tKvexMf8zrvPgydcZb5VYA"],"rightJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1k67G1W1gvb3E7EbmbG1h1","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"rightJoints":["tKvexMf8zrvPgydcZb5VYA"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uytQSeUom5oDsFC3PKa7q8","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["uytQSeUom5oDsFC3PKa7q8"],"rightJoints":["1k67G1W1gvb3E7EbmbG1h1"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tKvexMf8zrvPgydcZb5VYA","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Foundation","cx":18.191904297849153,"cy":-7.416985047669567,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["tKvexMf8zrvPgydcZb5VYA"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"45NB7k7GYboywbxoXsYHLH","leftRidgeLength":3,"rightRidgeLength":3,"rise":2,"ceiling":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":5,"leftJoints":["xyaukKZz7A3TN7punm6ojQ"],"rightJoints":["t8gz6AKc17wrcW6oGcJkRc"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tjjt6SvCacxyrjW8mL7Kcd","parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","roofId":"hajPbexieJRPqTV4EDojfw","leftRoofHeight":5,"rightRoofHeight":5,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":5,"leftJoints":["eyn92Pbtw4rxGsusMErN7b"],"rightJoints":["tjjt6SvCacxyrjW8mL7Kcd"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xyaukKZz7A3TN7punm6ojQ","parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","roofId":"hajPbexieJRPqTV4EDojfw","leftRoofHeight":5,"rightRoofHeight":5,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":5,"leftJoints":["tjjt6SvCacxyrjW8mL7Kcd"],"rightJoints":["eyn92Pbtw4rxGsusMErN7b"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"t8gz6AKc17wrcW6oGcJkRc","parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","roofId":"hajPbexieJRPqTV4EDojfw","leftRoofHeight":5,"rightRoofHeight":5,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":5,"leftJoints":["t8gz6AKc17wrcW6oGcJkRc"],"rightJoints":["xyaukKZz7A3TN7punm6ojQ"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eyn92Pbtw4rxGsusMErN7b","parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","roofId":"hajPbexieJRPqTV4EDojfw","leftRoofHeight":5,"rightRoofHeight":5,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Foundation","cx":-18.349437375856816,"cy":7.358577960859719,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fWm5hggYktD39sKer9AZNn","selected":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["7pDL5vuaWkaSp6xPdGtoFv"],"rightJoints":["jRzTPUopsCw4wfe1XwNMiY"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ak7Cpd4phQ5SWBAYKo1UCe","parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","roofId":"jKe65v2XQs93jh4Da9kMiu","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["f2RfmPbQBbQQB9B9qxgaGp"],"rightJoints":["ak7Cpd4phQ5SWBAYKo1UCe"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7pDL5vuaWkaSp6xPdGtoFv","parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","roofId":"jKe65v2XQs93jh4Da9kMiu","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["ak7Cpd4phQ5SWBAYKo1UCe"],"rightJoints":["f2RfmPbQBbQQB9B9qxgaGp"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jRzTPUopsCw4wfe1XwNMiY","parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","roofId":"jKe65v2XQs93jh4Da9kMiu","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["jRzTPUopsCw4wfe1XwNMiY"],"rightJoints":["7pDL5vuaWkaSp6xPdGtoFv"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"f2RfmPbQBbQQB9B9qxgaGp","parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","roofId":"jKe65v2XQs93jh4Da9kMiu","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Foundation","cx":18.357286683609985,"cy":7.35579151072247,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"w5VAS3XZUgKoYjMsuPJ9cq","selected":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":3,"leftJoints":["3nk4fctTxNug3tQ2458FKw"],"rightJoints":["dc91yXxYZexfAFXVg2fpn6"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pwXdeCrfH255xyNxeKZFmq","parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","roofId":"ptuJ1uXn6Mmb8yfPchYi2c","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3,"leftJoints":["m39f5UsRB2FwBXUr7e5PvG"],"rightJoints":["pwXdeCrfH255xyNxeKZFmq"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3nk4fctTxNug3tQ2458FKw","parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","roofId":"ptuJ1uXn6Mmb8yfPchYi2c","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,6.780964087966274],"selected":false,"centerLeftRoofHeight":[-0.35,4.890482043983138],"centerRightRoofHeight":[0.35,4.890482043983138],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3,"leftJoints":["pwXdeCrfH255xyNxeKZFmq"],"rightJoints":["m39f5UsRB2FwBXUr7e5PvG"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dc91yXxYZexfAFXVg2fpn6","parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","roofId":"ptuJ1uXn6Mmb8yfPchYi2c","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,6.780964087966274],"selected":false,"centerLeftRoofHeight":[-0.35,4.890482043983138],"centerRightRoofHeight":[0.35,4.890482043983138],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3,"leftJoints":["dc91yXxYZexfAFXVg2fpn6"],"rightJoints":["3nk4fctTxNug3tQ2458FKw"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"m39f5UsRB2FwBXUr7e5PvG","parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","roofId":"ptuJ1uXn6Mmb8yfPchYi2c","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Foundation","cx":-0.2822234132630961,"cy":-22.249672711420477,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"d6fjBvqj48Q3knutrPvQzj","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","wallsId":["xyaukKZz7A3TN7punm6ojQ","tjjt6SvCacxyrjW8mL7Kcd","t8gz6AKc17wrcW6oGcJkRc","eyn92Pbtw4rxGsusMErN7b"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","id":"hajPbexieJRPqTV4EDojfw","rise":0,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","wallsId":["f2RfmPbQBbQQB9B9qxgaGp","7pDL5vuaWkaSp6xPdGtoFv","ak7Cpd4phQ5SWBAYKo1UCe","jRzTPUopsCw4wfe1XwNMiY"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","id":"jKe65v2XQs93jh4Da9kMiu","rise":3.592861140197524,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gambrel","wallsId":["m39f5UsRB2FwBXUr7e5PvG"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","id":"ptuJ1uXn6Mmb8yfPchYi2c","rise":3.7809640879662743,"ceiling":false,"frontRidgePoint":[0.35,0.5],"backRidgePoint":[0.35,0.5],"topRidgePoint":[0,1]},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":3,"leftJoints":["ixC5APwNiRHyp3q8fcpSip"],"rightJoints":["8hSDdsDC58WwCVch1EWVeh"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ozFwLmFwWhU6vEeaiRMgLF","parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","roofId":"nUUEKM9A4b42WTe8cCbmi9","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3,"leftJoints":["qjuHirmyC29jd4cf1J7Ub1"],"rightJoints":["ozFwLmFwWhU6vEeaiRMgLF"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ixC5APwNiRHyp3q8fcpSip","parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","roofId":"nUUEKM9A4b42WTe8cCbmi9","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3,"leftJoints":["ozFwLmFwWhU6vEeaiRMgLF"],"rightJoints":["qjuHirmyC29jd4cf1J7Ub1"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8hSDdsDC58WwCVch1EWVeh","parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","roofId":"nUUEKM9A4b42WTe8cCbmi9","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3,"leftJoints":["8hSDdsDC58WwCVch1EWVeh"],"rightJoints":["ixC5APwNiRHyp3q8fcpSip"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qjuHirmyC29jd4cf1J7Ub1","parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","roofId":"nUUEKM9A4b42WTe8cCbmi9","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Foundation","cx":18.14821865757634,"cy":-22.28587145270979,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"upLMjkz3yhg33F3y5iosoh","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","wallsId":["qjuHirmyC29jd4cf1J7Ub1"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","id":"nUUEKM9A4b42WTe8cCbmi9","rise":2.4252724498654796,"ceiling":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":3,"leftJoints":["igxQHaerDScxsfB5TgVZU4"],"rightJoints":["fisK6kExsrNY6Pqi3iQHme"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3gfx2QQjNJN8MdstGfbwGN","parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofId":"ue2dCEQjJdM2ogHcYaDLus","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3,"leftJoints":["ayZDPKzE28H2j3EL6h6FST"],"rightJoints":["3gfx2QQjNJN8MdstGfbwGN"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"igxQHaerDScxsfB5TgVZU4","parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofId":"ue2dCEQjJdM2ogHcYaDLus","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0.15368124011044487,5.976337025346289],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3,"leftJoints":["3gfx2QQjNJN8MdstGfbwGN"],"rightJoints":["ayZDPKzE28H2j3EL6h6FST"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fisK6kExsrNY6Pqi3iQHme","parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofId":"ue2dCEQjJdM2ogHcYaDLus","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[-0.15368124011044487,5.976337025346289],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3,"leftJoints":["fisK6kExsrNY6Pqi3iQHme"],"rightJoints":["igxQHaerDScxsfB5TgVZU4"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ayZDPKzE28H2j3EL6h6FST","parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofId":"ue2dCEQjJdM2ogHcYaDLus","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"id":"ue2dCEQjJdM2ogHcYaDLus","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofType":"Gable","textureType":"Roof Texture Default","thickness":0.2,"wallsId":["ayZDPKzE28H2j3EL6h6FST"],"ridgeLeftPoint":[-0.15368124011044487,1],"ridgeRightPoint":[0.15368124011044487,1],"selected":false,"rise":2.9763370253462886,"ceiling":false},{"type":"Foundation","cx":-18.3917853849947,"cy":-22.23021238337839,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"8FvPN2owsgTQ83kbYPEi1w","selected":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":5.846129172584467,"leftJoints":["7uVMbtndXyFhLg9N8igxZL"],"rightJoints":["satrCacXQzxtUPDa8WeKn7"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uNqL4MKdnpapHVSi9J1K8T","parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofId":"iNBeHL8TpJ75nDzdH6Ar6c","leftRoofHeight":5.846129172584467,"rightRoofHeight":5.846129172584467,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.846129172584467,"rightTopPartialHeight":5.846129172584467},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3,"leftJoints":["5u61LU9xBr7HzdGUCwG4J6"],"rightJoints":["uNqL4MKdnpapHVSi9J1K8T"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7uVMbtndXyFhLg9N8igxZL","parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofId":"iNBeHL8TpJ75nDzdH6Ar6c","leftRoofHeight":3,"rightRoofHeight":5.846129172584467,"centerRoofHeight":[0.5,5.846129172584467],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3,"leftJoints":["uNqL4MKdnpapHVSi9J1K8T"],"rightJoints":["5u61LU9xBr7HzdGUCwG4J6"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"satrCacXQzxtUPDa8WeKn7","parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofId":"iNBeHL8TpJ75nDzdH6Ar6c","leftRoofHeight":5.846129172584467,"rightRoofHeight":3,"centerRoofHeight":[-0.5,5.846129172584467],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3,"leftJoints":["satrCacXQzxtUPDa8WeKn7"],"rightJoints":["7uVMbtndXyFhLg9N8igxZL"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5u61LU9xBr7HzdGUCwG4J6","parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofId":"iNBeHL8TpJ75nDzdH6Ar6c","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"id":"iNBeHL8TpJ75nDzdH6Ar6c","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofType":"Gable","textureType":"Roof Texture Default","thickness":0.2,"wallsId":["5u61LU9xBr7HzdGUCwG4J6"],"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":0.04736842105263009,"cy":7.4416382171024535,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"e6BPbJvDHWVEFn61HvpPWK","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.052631578947368425,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.052631578947368425,-0.000020000888987681265,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-28.363486288062674,-49.79716924665453,24.823194309796552],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":15.47561875,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-6.81693136261614,-15.495725419499871,0],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},437:function(e){e.exports=JSON.parse('{"docid":"9gaZVfxNNTHLmXcZPRJRXw","time":"09/23/2023 09:34 AM","timestamp":1695476069953,"userid":null,"owner":null,"email":null,"world":{"latitude":42.52092349999999,"address":"Leominster State Forest, Leominster, MA 01420, USA","name":"default","airAttenuationCoefficient":0.01,"ground":{"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3},"dustLoss":0.05,"cspGridCellSize":0.5,"cspDaysPerYear":4,"discretization":"Approximate","daysPerYear":12,"cspTimesPerHour":4,"pvGridCellSize":0.5,"timesPerHour":1,"noAnimationForHeatmapSimulation":false,"date":"6/22/2022, 10:00:00 AM","solarRadiationHeatmapGridCellSize":0.25,"solarPanelVisibilityGridCellSize":0.2,"noAnimationForSensorDataCollection":false,"longitude":-71.8384068,"noAnimationForSolarPanelSimulation":false},"elements":[{"parentId":"Ground","selected":false,"cy":0.8212100903152009,"id":"m7AH7DcnoGzAq9kryBy4RS","type":"Foundation","ly":10.473983232081025,"cx":-0.22738864151314608,"lz":0.07401736805849783,"hvacSystem":{"temperatureThreshold":3,"thermostatSetpoint":20,"id":"A"},"locked":true,"rotation":[0,0,0],"cz":0.05,"enableGroupMaster":true,"solarAbsorberPipe":{},"solarUpdraftTower":{},"lx":13.564552414056891,"solarPowerTower":{},"normal":[0,0,1]},{"fill":"Full","structureColor":"white","type":"Wall","rightPoint":[-5.457020109151015,3.478026472724187,0.1],"cx":0.5429798908489842,"opacity":0,"locked":true,"showLabel":false,"relativeAngle":3.141592653589793,"lz":3.700868402924892,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":3.478026472724187,"ly":0.3,"leftTopPartialHeight":3.700868402924892,"leftPoint":[6.542979890848985,3.478026472724187,0.1],"lx":12,"leftUnfilledHeight":0.5,"textureType":"Wall Texture Default","cz":0,"color":"white","normal":[0,0,1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"eavesLength":0.2,"parentId":"m7AH7DcnoGzAq9kryBy4RS","parapet":{"parapetHeight":1,"display":false,"copingsWidth":0.5,"color":"white","textureType":"No Wall Texture","copingsHeight":0.1},"rightUnfilledHeight":0.5,"windows":[],"rightTopPartialHeight":3.700868402924892,"structureSpacing":2,"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"selected":false,"leftRoofHeight":3.700868402924892,"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","roofId":"nbw17kYeUHp1aouuScuF3Y","wallStructure":"Default","structureWidth":0.1,"rightRoofHeight":3.700868402924892},{"rightPoint":[6.542979890848985,3.478026472724187,0.1],"structureSpacing":2,"relativeAngle":1.5707963267948966,"wallStructure":"Default","cz":1.2992388529678256,"opacity":0.5,"textureType":"Wall Texture Default","eavesLength":0.2,"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","locked":true,"selected":false,"leftRoofHeight":3.700868402924892,"ly":0.3,"parapet":{"copingsHeight":0.1,"textureType":"No Wall Texture","copingsWidth":0.5,"color":"white","parapetHeight":1,"display":false},"windows":[],"cx":6.542979890848985,"color":"white","structureColor":"white","showLabel":false,"rightRoofHeight":3.7008684029248915,"structureWidth":0.1,"leftTopPartialHeight":3.700868402924892,"parentId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"rotation":[0,0,0],"fill":"Full","rightTopPartialHeight":3.700868402924892,"centerRoofHeight":[-0.022465454047944533,5.827600046994059],"lx":7.5,"lz":3.700868402924892,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"id":"8XDG3EHsQoX26MhuzwMYUM","leftPoint":[6.542979890848985,-4.021973527275812,0.1],"cy":-0.27197352727581237,"type":"Wall","roofId":"nbw17kYeUHp1aouuScuF3Y"},{"parentId":"m7AH7DcnoGzAq9kryBy4RS","locked":true,"cy":-0.27197352727581237,"rightTopPartialHeight":3.700868402924892,"id":"skm8dNPSkFaVkoUwiPNfq1","centerRoofHeight":[0.022465454047944533,5.827600046994059],"rightPoint":[-5.457020109151015,-4.021973527275812,0.1],"roofId":"nbw17kYeUHp1aouuScuF3Y","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"wallStructure":"Default","rotation":[0,0,0],"showLabel":false,"cz":2.586710917765224,"structureColor":"white","structureSpacing":2,"selected":false,"leftRoofHeight":3.700868402924892,"eavesLength":0.2,"opacity":0.5,"color":"white","rightRoofHeight":3.7008684029248915,"leftTopPartialHeight":3.700868402924892,"textureType":"Wall Texture Default","cx":-5.457020109151015,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"type":"Wall","parapet":{"copingsHeight":0.1,"textureType":"No Wall Texture","display":false,"color":"white","parapetHeight":1,"copingsWidth":0.5},"lz":3.700868402924892,"lx":7.5,"relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.457020109151015,3.478026472724187,0.1],"structureWidth":0.1,"windows":[],"normal":[0,0,1],"fill":"Full","ly":0.3},{"selected":false,"textureType":"Wall Texture Default","cx":0.5429798908489842,"parapet":{"copingsHeight":0.1,"parapetHeight":1,"copingsWidth":0.5,"color":"white","textureType":"No Wall Texture","display":false},"rotation":[0,0,0],"locked":true,"showLabel":false,"rightTopPartialHeight":3.700868402924892,"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"eavesLength":0.2,"windows":[],"normal":[0,0,1],"structureColor":"white","roofId":"nbw17kYeUHp1aouuScuF3Y","parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cV8MyCuhWAsvEyyFuVqVqg","leftPoint":[-5.457020109151015,-4.021973527275812,0.1],"leftUnfilledHeight":0.5,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":-4.021973527275812,"structureSpacing":2,"structureWidth":0.1,"lx":12,"relativeAngle":0,"color":"white","wallStructure":"Default","rightRoofHeight":3.700868402924892,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.700868402924892,"type":"Wall","fill":"Full","lz":3.700868402924892,"opacity":0,"leftRoofHeight":3.700868402924892,"ly":0.3,"rightPoint":[6.542979890848985,-4.021973527275812,0.1],"cz":2.4938633836176103,"leftJoints":["skm8dNPSkFaVkoUwiPNfq1"]},{"ly":8.209748806830484,"normal":[0,0,1],"cy":-1.588798589487019,"hvacSystem":{"id":"A","temperatureThreshold":3,"thermostatSetpoint":20},"selected":false,"id":"8fpWrU7qVyVgipB7LtABom","solarPowerTower":{},"solarAbsorberPipe":{},"lz":0.07401736805849783,"cx":0.3444310502028619,"type":"Foundation","lx":9.082946486026735,"solarUpdraftTower":{},"rotation":[0,0,0],"cz":0.05,"locked":true,"parentId":"Ground"},{"structureWidth":0.1,"leftRoofHeight":5.712225310760859,"rightPoint":[-3.263274891520475,1.612200631492839,0],"roofId":"bMyAZV3jeEtHec1SxNb6X8","type":"Wall","fill":"Empty","leftTopPartialHeight":5.234219703671004,"leftUnfilledHeight":4.805475873448939,"cx":-0.034941558187143285,"leftPoint":[3.193391775146188,1.612200631492839,0],"structureSpacing":2,"rightRoofHeight":5.712225310760859,"locked":true,"lz":5.234219703671004,"rotation":[0,0,0],"leftJoints":["4Q8KDQDxyuamkEtRJU3paR"],"rightUnfilledHeight":4.805475873448939,"wallStructure":"Default","windows":[],"parapet":{"textureType":"No Wall Texture","display":false,"copingsHeight":0.1,"parapetHeight":1,"color":"white","copingsWidth":0.5},"opacity":0.5,"textureType":"Wall Texture Default","ly":0.3,"id":"bKLMq3WjuxRcsMDb5d4Xo1","cy":1.612200631492839,"lx":6.4566666666666634,"normal":[0,0,1],"color":"white","parentId":"8fpWrU7qVyVgipB7LtABom","relativeAngle":3.141592653589793,"foundationId":"8fpWrU7qVyVgipB7LtABom","showLabel":false,"rightTopPartialHeight":5.234219703671004,"structureColor":"white","selected":false,"cz":3.903941909848086,"eavesLength":0,"rightJoints":["1ATAe6P2KAHKLDSDfpVro9"]},{"color":"white","rightPoint":[3.1933917751461904,1.612200631492839,0],"parentId":"8fpWrU7qVyVgipB7LtABom","opacity":0.5,"rightRoofHeight":5.712225310760859,"structureColor":"white","roofId":"bMyAZV3jeEtHec1SxNb6X8","parapet":{"parapetHeight":1,"textureType":"No Wall Texture","copingsWidth":0.5,"color":"white","copingsHeight":0.1,"display":false},"showLabel":false,"cx":3.193391775146189,"eavesLength":0.1,"id":"4Q8KDQDxyuamkEtRJU3paR","type":"Wall","textureType":"Wall Texture Default","centerRoofHeight":[0.5,5.712225310760859],"leftJoints":["7xigJB2WiCCrREDc2Ja3YN"],"lz":6.136322990957498,"rightJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"cz":3.068161495478749,"leftTopPartialHeight":5.234219703671004,"structureWidth":0.1,"rotation":[0,0,0],"ly":0.3,"locked":false,"leftRoofHeight":5.234219703671004,"structureSpacing":2,"foundationId":"8fpWrU7qVyVgipB7LtABom","windows":[],"rightTopPartialHeight":5.760851132763845,"leftUnfilledHeight":3.5697809504114297,"leftPoint":[3.193391775146188,-1.1632293875304307,0],"selected":false,"wallStructure":"Default","lx":2.7754300190232697,"normal":[0,0,1],"relativeAngle":1.570796326794896,"fill":"Partial","rightUnfilledHeight":5.234219703671004,"cy":0.22448562198120414},{"rightTopPartialHeight":5.234219703671004,"id":"1ATAe6P2KAHKLDSDfpVro9","parentId":"8fpWrU7qVyVgipB7LtABom","leftJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"showLabel":false,"locked":false,"cy":0.22448562198120414,"normal":[0,0,1],"leftRoofHeight":5.712225310760859,"centerRoofHeight":[-0.5,5.712225310760859],"lz":6.232580143918559,"leftTopPartialHeight":5.822758282488435,"leftPoint":[-3.263274891520475,1.612200631492839,0],"opacity":0.5,"rightUnfilledHeight":3.5697809504114297,"rotation":[0,0,0],"rightRoofHeight":5.234219703671004,"structureSpacing":2,"lx":2.7754300190232697,"structureColor":"white","rightJoints":["7xigJB2WiCCrREDc2Ja3YN"],"foundationId":"8fpWrU7qVyVgipB7LtABom","eavesLength":0.1,"rightPoint":[-3.263274891520475,-1.1632293875304307,0],"wallStructure":"Default","ly":0.3,"parapet":{"display":false,"copingsHeight":0.1,"parapetHeight":1,"copingsWidth":0.5,"textureType":"No Wall Texture","color":"white"},"type":"Wall","structureWidth":0.1,"roofId":"bMyAZV3jeEtHec1SxNb6X8","fill":"Partial","color":"white","cz":3.1162900719592797,"leftUnfilledHeight":5.234219703671004,"relativeAngle":-1.5707963267948966,"selected":false,"windows":[],"cx":-3.263274891520475,"textureType":"Wall Texture Default"},{"locked":true,"ceiling":false,"cz":0,"rotation":[0,0,0],"textureType":"Roof Texture Default","rise":2.126731644069167,"selected":false,"normal":[0,0,1],"color":"#666666","ly":0,"showLabel":false,"lz":0,"cx":0,"roofType":"Gable","ridgeRightPoint":[-0.022465454047944533,1],"cy":0,"type":"Roof","lx":0,"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nbw17kYeUHp1aouuScuF3Y","ridgeLeftPoint":[0.022465454047944533,1],"wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"thickness":0.2,"foundationId":"m7AH7DcnoGzAq9kryBy4RS"},{"leftTopPartialHeight":5.234219703671004,"showLabel":false,"windows":[],"roofId":"bMyAZV3jeEtHec1SxNb6X8","opacity":0.5,"parentId":"8fpWrU7qVyVgipB7LtABom","rightJoints":["4Q8KDQDxyuamkEtRJU3paR"],"structureWidth":0.1,"selected":false,"locked":true,"leftUnfilledHeight":3.5697809504114297,"color":"white","ly":0.3,"normal":[0,0,1],"structureColor":"white","id":"7xigJB2WiCCrREDc2Ja3YN","rightRoofHeight":5.234219703671004,"rightPoint":[3.193391775146188,-1.1632293875304307,0],"lz":5.234219703671004,"cx":-0.034941558187143285,"lx":6.4566666666666634,"leftJoints":["1ATAe6P2KAHKLDSDfpVro9"],"cy":-1.1632293875304307,"leftRoofHeight":5.234219703671004,"leftPoint":[-3.263274891520475,-1.1632293875304307,0],"wallStructure":"Default","fill":"Partial","foundationId":"8fpWrU7qVyVgipB7LtABom","parapet":{"parapetHeight":1,"display":false,"color":"white","copingsHeight":0.1,"textureType":"No Wall Texture","copingsWidth":0.5},"rightTopPartialHeight":5.234219703671004,"textureType":"Wall Texture Default","eavesLength":0.4,"rightUnfilledHeight":3.5697809504114297,"relativeAngle":0,"rotation":[0,0,0],"cz":3.535805069111796,"type":"Wall","structureSpacing":2},{"color":"#666666","showLabel":false,"locked":true,"ridgeLeftPoint":[-0.5,1],"id":"bMyAZV3jeEtHec1SxNb6X8","thickness":0.1,"roofType":"Gable","cy":0,"ceiling":false,"textureType":"Roof Texture Default","foundationId":"8fpWrU7qVyVgipB7LtABom","ly":0,"lx":0,"rotation":[0,0,0],"cx":0,"normal":[0,0,1],"parentId":"8fpWrU7qVyVgipB7LtABom","rise":0.4780056070898553,"lz":0,"selected":false,"ridgeRightPoint":[0.5,1],"type":"Roof","wallsId":["7xigJB2WiCCrREDc2Ja3YN"],"cz":0},{"color":"#ffffff","frameWidth":0.05,"normal":[0,0,1],"id":"kT8BzEWny2ZAvkGr4E4KEf","showLabel":false,"mullionSpacing":0.5,"locked":true,"rotation":[0,0,0],"mullionColor":"white","cz":0.4037254895427074,"type":"Window","mullion":true,"windowType":"Default","cy":0.1,"selected":false,"tint":"#73D8FF","mullionWidth":0.06,"ly":0.3,"lz":0.14780124246219536,"frame":true,"opacity":0.5,"shutter":{"color":"#4d4d4d","width":0.3,"showRight":true,"showLeft":true},"lx":0.15384615384615385,"archHeight":1,"parentId":"7xigJB2WiCCrREDc2Ja3YN","cx":-0.23283427981414576,"foundationId":"8fpWrU7qVyVgipB7LtABom"},{"opacity":0.5,"mullionSpacing":0.5,"rotation":[0,0,0],"windowType":"Default","frameWidth":0.05,"foundationId":"8fpWrU7qVyVgipB7LtABom","mullion":true,"ly":0.3,"mullionColor":"white","color":"#ffffff","tint":"#73D8FF","cy":0.1,"cz":0.4037254895427074,"locked":true,"parentId":"7xigJB2WiCCrREDc2Ja3YN","id":"7u1AuHohJXNKKJPafwNUFQ","lz":0.14780124246219536,"archHeight":1,"frame":true,"normal":[0,0,1],"cx":0.23180175529168826,"mullionWidth":0.06,"lx":0.15384615384615385,"type":"Window","selected":false,"shutter":{"width":0.3,"showLeft":true,"color":"#4d4d4d","showRight":true}},{"id":"3KgcTmNBqtYJcCny8HxQyQ","selected":false,"locked":true,"type":"Foundation","cx":6.813410596867628,"solarPowerTower":{},"normal":[0,0,1],"solarUpdraftTower":{},"lx":3.6868215598526417,"cz":0.05,"solarAbsorberPipe":{},"parentId":"Ground","cy":0.16141466329287235,"notBuilding":true,"rotation":[0,0,0],"lz":0.07401736805849783,"ly":2.3229214459557985},{"eavesLength":0.3,"opacity":0.5,"parapet":{"display":false,"copingsHeight":0.1,"textureType":"No Wall Texture","copingsWidth":0.5,"parapetHeight":1,"color":"white"},"leftTopPartialHeight":6.661563125264805,"windows":[],"selected":false,"leftPoint":[0.9885216091721372,0.8698262658360515,0.1],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","fill":"Full","cz":0,"normal":[0,0,1],"ly":0.2,"rightJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"rightUnfilledHeight":0.5,"rotation":[0,0,0],"wallStructure":"Default","rightTopPartialHeight":6.661563125264805,"showLabel":false,"leftJoints":["h8DQWwUSgNc283RWhcM3B1"],"cx":0.23852160917213716,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","rightPoint":[-0.5114783908278628,0.8698262658360515,0.1],"leftUnfilledHeight":0.5,"lx":1.5,"locked":true,"id":"5eUwuiBwfGoNEpcHG5kHqK","structureSpacing":2,"cy":0.8698262658360515,"relativeAngle":3.141592653589793,"type":"Wall","structureColor":"white","lz":6.661563125264805,"textureType":"Wall Texture #3","structureWidth":0.1},{"normal":[0,0,1],"type":"Wall","rightJoints":["qQNV4qND1aDjEtJsd6HVio"],"opacity":0.5,"eavesLength":0.3,"textureType":"Wall Texture #3","leftPoint":[-0.5114783908278628,0.8698262658360516,0],"rightUnfilledHeight":1.5096768753682475,"cy":0.11982626583605155,"rotation":[0,0,0],"lx":1.5,"id":"hbU2xUbmKEDDXYDMWnjjCc","lz":6.661563125264805,"rightTopPartialHeight":6.661563125264805,"windows":[],"relativeAngle":4.71238898038469,"structureSpacing":2,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","selected":false,"cx":-0.5114783908278628,"rightPoint":[-0.5114783908278628,-0.6301737341639485,0],"locked":true,"showLabel":false,"structureColor":"white","parentId":"3KgcTmNBqtYJcCny8HxQyQ","structureWidth":0.1,"fill":"Partial","ly":0.2,"leftUnfilledHeight":1.5096768753682475,"wallStructure":"Default","leftTopPartialHeight":6.661563125264805,"cz":0,"parapet":{"copingsHeight":0.1,"copingsWidth":0.5,"parapetHeight":1,"textureType":"No Wall Texture","display":false,"color":"white"},"leftJoints":["5eUwuiBwfGoNEpcHG5kHqK"]},{"cz":0,"lz":6.661563125264805,"rotation":[0,0,0],"textureType":"Wall Texture #3","cy":-0.6301737341639485,"rightPoint":[0.9885216091721372,-0.6301737341639485,0.1],"normal":[0,0,1],"structureSpacing":2,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","selected":false,"leftUnfilledHeight":0.5,"leftTopPartialHeight":6.661563125264805,"leftJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"copingsWidth":0.5,"textureType":"No Wall Texture"},"cx":0.23852160917213716,"structureWidth":0.1,"type":"Wall","rightJoints":["h8DQWwUSgNc283RWhcM3B1"],"leftPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"rightTopPartialHeight":6.661563125264805,"windows":[],"relativeAngle":0,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","lx":1.5,"ly":0.2,"structureColor":"white","fill":"Full","id":"qQNV4qND1aDjEtJsd6HVio","opacity":0.5,"rightUnfilledHeight":0.5,"showLabel":false,"eavesLength":0.3,"wallStructure":"Default","locked":true},{"id":"h8DQWwUSgNc283RWhcM3B1","textureType":"Wall Texture #3","rotation":[0,0,0],"opacity":0.5,"ly":0.2,"selected":false,"lz":6.661563125264805,"leftJoints":["qQNV4qND1aDjEtJsd6HVio"],"cy":0.1198262658360515,"fill":"Full","parapet":{"display":false,"copingsWidth":0.5,"parapetHeight":1,"textureType":"No Wall Texture","color":"white","copingsHeight":0.1},"relativeAngle":1.5707963267948966,"locked":true,"cx":0.9885216091721372,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","structureWidth":0.1,"rightTopPartialHeight":6.661563125264805,"rightUnfilledHeight":0.5,"rightJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"lx":1.5,"type":"Wall","cz":0,"leftTopPartialHeight":6.661563125264805,"eavesLength":0.3,"windows":[],"leftPoint":[0.9885216091721372,-0.6301737341639485,0.1],"leftUnfilledHeight":0.5,"wallStructure":"Default","structureColor":"white","showLabel":false,"structureSpacing":2,"rightPoint":[0.9885216091721372,0.8698262658360515,0.1],"normal":[0,0,1]},{"mullionColor":"white","windowType":"Default","cy":0,"cz":0,"frame":true,"ly":0.3,"cx":-0.375,"locked":true,"id":"wpUTVyngSAjDJDRdEV1NA6","shutter":{"color":"#4d4d4d","showRight":true,"width":0.25,"showLeft":true},"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","frameWidth":0.05,"type":"Window","tint":"#73D8FF","mullionSpacing":0.7,"mullion":true,"color":"#ffffff","archHeight":1,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","lz":0.44384979425833565,"lx":0.08333333333333333,"selected":false,"mullionWidth":0.06,"rotation":[0,0,0],"normal":[0,0,1],"opacity":0.5},{"locked":true,"archHeight":1,"cx":-0.20833333333333334,"lx":0.08333333333333333,"cy":0.1,"cz":-0.005759415706553773,"mullionColor":"white","mullionSpacing":0.7,"shutter":{"showRight":true,"color":"#4d4d4d","showLeft":true,"width":0.25},"frameWidth":0.05,"mullionWidth":0.06,"lz":0.44384979425833565,"mullion":true,"opacity":0.5,"color":"#ffffff","parentId":"cV8MyCuhWAsvEyyFuVqVqg","normal":[0,0,1],"type":"Window","frame":true,"tint":"#73D8FF","windowType":"Default","rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","ly":0.3,"id":"5ncRWHnRQyocXJujBx5jNE","selected":false},{"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","ly":0.3,"mullionSpacing":0.7,"windowType":"Default","mullionWidth":0.06,"mullionColor":"white","id":"piUU3YZv2L1Zvedb6EFfFm","lz":0.44384979425833565,"rotation":[0,0,0],"selected":false,"locked":true,"mullion":true,"cx":0.19999999999999998,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"archHeight":1,"type":"Window","frame":true,"shutter":{"width":0.25,"color":"#4d4d4d","showLeft":true,"showRight":true},"cz":-0.005759415706553773,"color":"#ffffff","normal":[0,0,1],"frameWidth":0.05,"tint":"#73D8FF","opacity":0.5},{"cx":0.37499999999999994,"lx":0.08333333333333333,"shutter":{"width":0.25,"showLeft":true,"showRight":true,"color":"#4d4d4d"},"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"mullionWidth":0.06,"mullionSpacing":0.7,"normal":[0,0,1],"lz":0.44384979425833565,"ly":0.3,"selected":false,"frameWidth":0.05,"opacity":0.5,"mullion":true,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","id":"upiLr8uqx55GDieKSLsjPj","frame":true,"cy":0,"cz":0,"archHeight":1,"type":"Window","color":"#ffffff","locked":true,"mullionColor":"white","tint":"#73D8FF","windowType":"Default"},{"mullionSpacing":0.7,"tint":"#73D8FF","type":"Window","id":"d9R7TXr9G1aG6bGwu14v9k","frameWidth":0.05,"lx":0.13333333333333333,"cx":0.3466666666666667,"windowType":"Default","mullion":true,"mullionColor":"white","archHeight":1,"cy":0,"normal":[0,0,1],"ly":0.3,"locked":true,"rotation":[0,0,0],"lz":0.3942112571821837,"selected":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","parentId":"skm8dNPSkFaVkoUwiPNfq1","mullionWidth":0.06,"frame":true,"opacity":0.5,"cz":-0.05913168857732756,"showLabel":false,"shutter":{"showRight":true,"color":"#4d4d4d","showLeft":true,"width":0.25},"color":"#ffffff"},{"tint":"#73D8FF","mullion":true,"normal":[0,0,1],"opacity":0.5,"lz":0.3942112571821837,"selected":false,"shutter":{"showLeft":true,"width":0.25,"color":"#4d4d4d","showRight":true},"cz":0.5913168857732756,"type":"Window","mullionWidth":0.06,"mullionSpacing":0.7,"mullionColor":"white","windowType":"Default","ly":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","frame":true,"parentId":"skm8dNPSkFaVkoUwiPNfq1","frameWidth":0.05,"locked":true,"id":"9k4wgdGyyHM5BC1r2nJbQH","archHeight":1,"rotation":[0,0,0],"color":"#ffffff","cy":0,"cx":0,"lx":0.13333333333333333},{"mullionColor":"white","cx":0,"cz":-0.05913168857732756,"type":"Window","lx":0.13333333333333333,"rotation":[0,0,0],"windowType":"Default","color":"#ffffff","parentId":"skm8dNPSkFaVkoUwiPNfq1","ly":0.3,"shutter":{"showLeft":true,"showRight":true,"width":0.25,"color":"#4d4d4d"},"foundationId":"m7AH7DcnoGzAq9kryBy4RS","archHeight":1,"cy":0,"mullionSpacing":0.7,"lz":0.3942112571821837,"id":"rgPxjoaTPqdF2tQvSYYJxX","frameWidth":0.05,"selected":false,"tint":"#73D8FF","opacity":0.5,"locked":true,"frame":true,"mullionWidth":0.06,"normal":[0,0,1],"mullion":true},{"mullionColor":"white","cz":-0.05913168857732756,"normal":[0,0,1],"frame":true,"windowType":"Default","opacity":0.5,"ly":0.3,"mullionWidth":0.06,"cx":-0.3333333333333333,"color":"#ffffff","lz":0.3942112571821837,"lx":0.13333333333333333,"mullionSpacing":0.7,"cy":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","rotation":[0,0,0],"id":"85T9TwcUR7am6Rcbs7Fcvu","type":"Window","selected":false,"frameWidth":0.05,"locked":true,"mullion":true,"parentId":"skm8dNPSkFaVkoUwiPNfq1","archHeight":1,"shutter":{"width":0.25,"showRight":true,"color":"#4d4d4d","showLeft":true}},{"lx":0.544,"lz":1.68,"cz":0.03700868412852199,"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","type":"Human","cy":-3.5804269948570657,"ly":0.544,"locked":true,"normal":[0,1,0],"id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"cx":-0.09889479147539992,"name":"Judd"},{"locked":true,"lx":7.849178627898182,"cz":0,"id":"t5Aj8tjjpqVaLaB3uEqfR8","cy":-3.6653094140688935,"rotation":[0,0,0],"type":"Tree","normal":[0,1,0],"lz":8.26765132308192,"parentId":"Ground","selected":false,"cx":11.305837530144139,"name":"Magnolia"},{"parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","type":"Window","foundationId":"m7AH7DcnoGzAq9kryBy4RS","mullionSpacing":0.7,"archHeight":1,"selected":false,"lz":0.3942112571821837,"lx":0.13333333333333333,"windowType":"Default","rotation":[0,0,0],"shutter":{"width":0.25,"showRight":true,"showLeft":true,"color":"#4d4d4d"},"ly":0.3,"cz":-0.08,"locked":true,"cx":-0.25833333333333336,"frame":true,"color":"#ffffff","frameWidth":0.05,"mullionWidth":0.06,"id":"dGQYRX5aMuZKouydnVo1zc","mullionColor":"white","mullion":true,"normal":[0,0,1],"tint":"#73D8FF","cy":-1.3376344861350336e-15,"opacity":0.5},{"foundationId":"m7AH7DcnoGzAq9kryBy4RS","ly":0.3,"color":"#ffffff","mullion":true,"frame":true,"normal":[0,0,1],"mullionWidth":0.06,"rotation":[0,0,0],"type":"Window","selected":false,"lx":0.13333333333333333,"mullionColor":"white","tint":"#73D8FF","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","locked":true,"windowType":"Default","shutter":{"showRight":true,"showLeft":true,"width":0.25,"color":"#4d4d4d"},"frameWidth":0.05,"archHeight":1,"cx":0.26666666666666666,"cz":-0.08,"mullionSpacing":0.7,"opacity":0.5,"cy":-1.1010413489448665e-14,"id":"cni5XLCGZ7vNfLqxjgsnua","lz":0.3942112571821837},{"lx":0.10833333333333332,"color":"white","showLabel":false,"textureType":"Door Texture Default","lz":0.716165481422614,"normal":[0,1,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","filled":true,"type":"Door","locked":true,"doorType":"Default","ly":0,"selected":false,"archHeight":1,"cy":0,"cz":-0.14191725928869298,"rotation":[0,0,0],"opacity":1,"id":"j9wJCoWK33fz7y9VeMvYET","cx":0.004166666666666666},{"id":"hDyRWYv3zznENZxyb7giJb","parentId":"Ground","selected":false,"ly":0.43,"name":"Jess","cy":-3.1477838439296697,"rotation":[0,0,0],"type":"Human","locked":true,"cx":10.043178984637636,"cz":0,"lz":1.5,"normal":[0,1,0],"lx":0.43},{"lx":1,"id":"rQBZjpiN17FBa7zVGS29EM","name":"Hosta","locked":true,"parentId":"Ground","rotation":[0,0,0],"cx":-4.865498633056688,"cz":4.440892098500626e-16,"cy":-5.35511145051621,"type":"Flower","lz":0.7,"selected":false,"normal":[0,1,0]},{"cx":-5.913277609806336,"parentId":"Ground","rotation":[0,0,0],"normal":[0,1,0],"lz":0.7,"cy":-5.374330832155909,"type":"Flower","lx":1,"name":"Hosta","cz":0,"locked":true,"id":"gc42wB2NVDE3XxmJXbCjzF","selected":false},{"parentId":"Ground","selected":false,"normal":[0,1,0],"id":"vUf5PGrUMVgXbqYPHJhogg","cz":0,"type":"Flower","locked":true,"rotation":[0,0,0],"cy":-5.032667389054726,"name":"Hosta","cx":5.365516144068206,"lz":0.7,"lx":1},{"type":"Flower","cz":0,"lx":1,"selected":false,"normal":[0,1,0],"locked":true,"id":"nQJ3744KdWm46uETjWgCgh","name":"Hosta","cy":-5.0400985854852,"lz":0.7,"parentId":"Ground","rotation":[0,0,0],"cx":6.451426749352761},{"normal":[0,1,0],"lx":0.4,"name":"Bellflower","selected":false,"type":"Flower","cx":10.305907483983008,"lz":0.8,"locked":true,"cz":-4.440892098500626e-16,"rotation":[0,0,0],"parentId":"Ground","cy":-4.741244078804888,"id":"v55S46CRAfNBqtvC7SejWL"},{"type":"Flower","selected":false,"locked":true,"cz":0,"rotation":[0,0,0],"lz":0.8,"name":"Bellflower","cx":10.64587810641245,"normal":[0,1,0],"lx":0.4,"cy":-5.149011385356842,"parentId":"Ground","id":"cjq5zpMwEQ68Pvr3BHuvAN"},{"locked":true,"lx":0.4,"selected":false,"id":"bq7T5SUabm6WYJRf7MELsr","type":"Flower","parentId":"Ground","cz":0,"cy":-5.113715548843749,"name":"Bellflower","normal":[0,1,0],"lz":0.8,"rotation":[0,0,0],"cx":11.069278217326396},{"parentId":"Ground","selected":false,"rotation":[0,0,0],"cz":0,"type":"Flower","name":"Bellflower","id":"kGacG4GbyL6sr53BA3szew","lx":0.4,"cx":10.087718880149556,"normal":[0,0,1],"cy":-5.171937637087455,"locked":true,"lz":0.8},{"rotation":[0,0,0],"parentId":"Ground","cz":0,"id":"3mzXsN58FdxQCLpv8kVCYw","normal":[0,0,1],"selected":false,"name":"Bellflower","locked":true,"cx":11.337264912334188,"lx":0.4,"type":"Flower","lz":0.8,"cy":-4.906129973770318},{"rotation":[0,0,0],"normal":[0,0,1],"cy":-3.991597909938303,"cz":0,"name":"Bellflower","locked":true,"lz":0.8,"type":"Flower","lx":0.4,"id":"acUhTF9RVe5riGAE9cfhJn","cx":10.431075288929677,"parentId":"Ground","selected":false},{"name":"Bellflower","id":"ooTJkhwo3iWiDqyRe6jwef","cx":9.86441386534317,"cy":-4.67810479084557,"parentId":"Ground","normal":[0,0,1],"selected":false,"lx":0.4,"locked":true,"rotation":[0,0,0],"cz":-8.881784197001252e-16,"type":"Flower","lz":0.8},{"lz":0.5,"rotation":[0,0,0],"name":"White Flower","selected":false,"type":"Flower","cz":0,"lx":0.8,"id":"p8SDFTinzKkCMVNKYGXSQU","cx":9.406250442154278,"normal":[0,1,0],"locked":true,"cy":-4.8162245440076354,"parentId":"Ground"},{"cz":0,"selected":false,"cx":9.924833666037356,"type":"Flower","rotation":[0,0,0],"locked":true,"name":"White Flower","cy":-5.548260780564018,"parentId":"Ground","lz":0.5,"lx":0.8,"normal":[0,0,1],"id":"vXr6WeGdxpL14pfLB8tAGS"},{"normal":[0,1,0],"rotation":[0,0,0],"lz":2,"selected":false,"cz":0.03700868412863657,"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.8637473869150567,"locked":true,"lx":1,"id":"8jaD71ndVi3Pxu67kBrHve","name":"Tall Bush","type":"Flower","cy":-5.021658074995834},{"normal":[0,0,1],"cx":1.960367825542456,"lz":2,"name":"Tall Bush","locked":true,"cz":0.03700868412852288,"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"xu93thGDcf75KxzfVpckCK","lx":1,"rotation":[0,0,0],"cy":-5.044972777905908,"selected":false,"type":"Flower"},{"rotation":[0,0,0],"id":"aPfi6ru8UEQvmRY7YmRfhQ","selected":false,"lx":2,"cx":-2.974917470063473,"name":"Hydrangea","parentId":"m7AH7DcnoGzAq9kryBy4RS","type":"Flower","lz":1.5,"locked":true,"cy":-4.971526921550339,"cz":0.03700868412852377,"normal":[0,0,1]},{"cx":2.9943532379673203,"lx":2,"rotation":[0,0,0],"selected":false,"cz":0.03700868412852288,"name":"Hydrangea","type":"Flower","parentId":"8fpWrU7qVyVgipB7LtABom","normal":[0,0,1],"id":"p12f94kQKCXpPNEEPe9ktz","cy":-2.3800793411851497,"locked":true,"lz":1.5},{"parentId":"Ground","cz":4.440892098500626e-16,"cx":-8.658559512721883,"id":"8MCf8WzkvdtkVT9MPmDy4G","cy":0.2268652768492938,"rotation":[0,0,0],"normal":[0,0,1],"lx":5.410682322966088,"locked":true,"type":"Tree","selected":false,"lz":5.9930306282885,"name":"Magnolia"},{"name":"Yellow Flower","type":"Flower","locked":true,"rotation":[0,0,0],"cy":-3.717743510806919,"id":"kwZdR8kant3eBoLCjjUQCJ","lx":2,"selected":false,"normal":[0,0,1],"lz":1.4,"cx":-8.813697651847779,"parentId":"Ground","cz":-4.440892098500626e-16},{"lx":1,"parentId":"Ground","lz":0.7,"rotation":[0,0,0],"cx":-9.660182286895216,"selected":false,"cy":-0.10473626441648776,"type":"Flower","cz":0,"locked":true,"normal":[0,0,1],"name":"Hosta","id":"hM4s39UWZUWNoUSUMHrmbJ"},{"lz":0.7,"id":"nQgYQhsWvwPQorjAb4dSNv","rotation":[0,0,0],"selected":false,"locked":true,"cz":0,"cx":-9.04189556545002,"cy":-0.8584081924043119,"lx":1,"name":"Hosta","type":"Flower","normal":[0,0,1],"parentId":"Ground"},{"selectedIndex":1,"noOutline":true,"lx":0.4,"id":"eYBEchBwdGr5aCP6pHEkhr","vertices":[{"x":-0.04166666666666669,"y":-0.13775856472283443},{"y":-0.00265513883370061,"x":-0.04166666666666669},{"x":0.041666666666666616,"y":-0.00265513883370061},{"x":0.041666666666666616,"y":-0.13775856472283443}],"text":"175","opacity":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","fontSize":0.3,"cy":-0.2942089556230589,"rotation":[0,0,0],"ly":0.4,"selected":false,"normal":[0,0,1],"fontStrokeWidth":0.01,"cz":0,"parentType":"Wall","lz":0.4,"fontColor":"gold","parentId":"cV8MyCuhWAsvEyyFuVqVqg","filled":true,"type":"Polygon","locked":true,"cx":-0.00213352886578518,"color":"#ffffff"},{"lx":0.10666666666666667,"locked":true,"parentId":"8XDG3EHsQoX26MhuzwMYUM","normal":[0,1,0],"type":"Door","cz":-0.3986137684780472,"lineWidth":0.2,"doorType":"Default","textureType":"Door Texture #8","uValue":10,"color":"#ffffff","rotation":[0,0,0],"selected":false,"archHeight":1,"ly":0,"lz":0.20277246304390567,"interior":true,"filled":false,"id":"d48TNpLXWZQD5hZa4SumwF","showLabel":false,"lineColor":"#000000","foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.013333333333333334,"cy":0},{"type":"Window","color":"#ffffff","empty":true,"opacity":0.5,"normal":[0,-1,0],"parentType":"Roof","lx":6.2858321442603895,"rotation":[0.535854716076799,0,0],"lineColor":"#000000","lz":2.946512926202779,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","frame":true,"ly":0.2,"cz":4.9719401800066105,"showLabel":false,"cy":-2.2182418146601295,"windowType":"Default","sillWidth":0,"mullionSpacing":0.5,"frameWidth":0.1,"mullion":false,"locked":true,"uValue":2,"selected":false,"mullionColor":"#ffffff","interior":true,"cx":0.546396492045166,"tint":"#73D8FF","archHeight":1,"id":"qbq4krxSBYqvGnjWC2BaZ6","shutter":{"showRight":false,"color":"grey","showLeft":false,"width":0.5},"parentId":"nbw17kYeUHp1aouuScuF3Y","lineWidth":0.2,"mullionWidth":0.06}],"sceneRadius":19,"view":{"visibilityResultsPanelY":0,"showSunAngles":false,"showYearlyBuildingEnergyPanel":false,"yearlyPvYieldPanelY":0,"mapWeatherStations":false,"enableRotate":true,"showYearlyHeliostatYieldPanel":false,"heatFluxScaleFactor":5,"dailyParabolicTroughYieldPanelY":0,"dailyBuildingEnergyPanelRect":{"y":237,"height":360,"x":-520,"width":600},"yearlyParabolicTroughYieldPanelY":0,"showDesignInfoPanel":false,"cameraPosition":[-8.799358255746082,-16.959783561056284,1.954611653271045],"yearlyPvYieldPanelX":0,"yearlyHeliostatYieldPanelY":0,"mapPanelY":0,"showYearlyFresnelReflectorYieldPanel":false,"solarRadiationHeatMapReflectionOnly":false,"stickyNotePanelY":0,"cameraZoom":38.96037486782549,"autoRotate":false,"yearlyBuildingEnergyPanelRect":{"height":400,"x":-78,"y":157,"width":600},"showSolarPanelVisibilityResultsPanel":false,"yearlyParabolicDishYieldPanelX":0,"mapTilt":0,"weatherPanelX":0,"theme":"Hill","yearlyHeliostatYieldPanelX":0,"showMapPanel":false,"groundColor":"forestgreen","dailyFresnelReflectorYieldPanelX":0,"dailyPvYieldPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"dailyHeliostatYieldPanelX":0,"showDailyHeliostatYieldPanel":false,"ambientLightIntensity":0.2,"axes":true,"solarRadiationHeatMapMaxValue":5,"directLightIntensity":2,"groundImage":false,"mapPanelX":0,"showWeatherPanel":false,"showYearlyParabolicDishYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":0,"showHeliodonPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"dailyPvYieldPanelX":0,"showYearlyParabolicTroughYieldPanel":false,"mapZoom":18,"heliodonPanelY":0,"dailyFresnelReflectorYieldPanelY":0,"dailyLightSensorPanelY":0,"yearlyParabolicDishYieldPanelY":0,"weatherPanelY":0,"mapType":"roadmap","yearlyFresnelReflectorYieldPanelY":0,"showDailyBuildingEnergyPanel":false,"showDailyParabolicTroughYieldPanel":false,"heliodonPanelX":0,"visibilityResultsPanelX":0,"showDailyFresnelReflectorYieldPanel":false,"stickyNotePanelX":0,"orthographic":false,"yearlyParabolicTroughYieldPanelX":0,"showStickyNotePanel":false,"showDailyPvYieldPanel":false,"dailyLightSensorPanelX":0,"showDailyParabolicDishYieldPanel":false,"heliodon":false,"cameraPosition2D":[0.3385955283596493,-0.9616823668411001,150],"showYearlyPvYieldPanel":false,"navigationView":false,"panCenter":[-1.2725556781216778,-2.9298638165589974,1.954611653271045],"panCenter2D":[0.3385955283596493,-0.960681989394115,-9.84385140521351e-7],"showInstructionPanel":true,"dailyHeliostatYieldPanelY":0,"yearlyLightSensorPanelY":0,"dailyParabolicDishYieldPanelX":0,"yearlyLightSensorPanelX":0,"showSiteInfoPanel":true,"showDailyLightSensorPanel":false},"graphState":{"yearlyHeliostatIndividualOutputs":false,"dailyPvIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"poleSpacing":3,"interRowSpacing":2,"tiltAngle":0,"orientation":"Landscape","poleHeight":1,"rowAxis":"Zonal","rowsPerRack":1,"pvModelName":"SPR-X21-335-BLK"},"solarPanelArrayLayoutConstraints":{"maximumTiltAngle":1.5707963267948966,"maximumInterRowSpacing":10,"minimumTiltAngle":-1.5707963267948966,"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","poleSpacing":5,"poleHeight":1,"minimumInterRowSpacing":2,"maximumRowsPerRack":6,"minimumRowsPerRack":1},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"mutationRate":0.1,"localSearchRadius":0.1,"populationSize":20,"selectionMethod":1,"crossoverRate":0.5,"convergenceThreshold":0.01,"searchMethod":1,"selectionRate":0.5,"problem":"Solar Panel Tilt Angle","maximumGenerations":5,"objectiveFunctionType":1},"particleSwarmOptimizationParams":{"convergenceThreshold":0.01,"searchMethod":1,"localSearchRadius":0.1,"vmax":0.01,"maximumSteps":5,"problem":"Solar Panel Tilt Angle","swarmSize":20,"cognitiveCoefficient":0.1,"inertia":0.8,"objectiveFunctionType":1,"socialCoefficient":0.1}},"economicsParams":{"projectLifeSpan":25,"operationalCostPerUnit":0.15,"electricitySellingPrice":0.25},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":[],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},438:function(e){e.exports=JSON.parse('{"docid":"4MEDLVu1wYqsKgVHnu73g2","time":"06/19/2023 12:53 pm","timestamp":1687193611217,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"10/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":11.161213715568111,"solarUpdraftTower":{},"parentId":"Ground","cx":0.43688740998646924,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.6256010051791083,"type":"Foundation","solarPowerTower":{},"lx":15.01849429025864,"lz":0.15,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.075,"enableGroupMaster":true,"color":"#999999","locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":0,"lx":12,"relativeAngle":3.141592653589793,"lz":4.0189625473598385,"roofId":"78T3MkimgRTSnmRTMhRnJm","ly":0.1,"rightPoint":[-6.121296160650631,3.6736355578602797,0.15],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"No Wall Texture","leftPoint":[5.878703839349369,3.6736355578602797,0.15],"type":"Wall","rightRoofHeight":4.0189625473598385,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4.0189625473598385,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.12129616065063109,"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":3.6736355578602797,"color":"#ffffff","studWidth":0.1,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":5.878703839349369,"leftPoint":[5.878703839349369,-3.8263644421397207,0.15],"cy":-0.07636444213971982,"leftRoofHeight":4.0189625473598385,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[5.878703839349369,3.6736355578602797,0.15],"ly":0.1,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":7.5,"normal":[0,0,1],"lz":4.0189625473598385,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":1.2992388529678256,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","rightRoofHeight":4.0189625473598385,"roofId":"78T3MkimgRTSnmRTMhRnJm","color":"#ffffff","studWidth":0.1,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"lx":7.5,"lz":4.0189625473598385,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"78T3MkimgRTSnmRTMhRnJm","selected":false,"cy":-0.07636444213971982,"cz":2.586710917765224,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-6.121296160650631,-3.8263644421397207,0.15],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"No Wall Texture","rightRoofHeight":4.0189625473598385,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-6.121296160650631,3.6736355578602797,0.15],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4.0189625473598385,"ly":0.1,"cx":-6.121296160650631,"color":"#ffffff","studWidth":0.1,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"showLabel":false,"cx":-0.12129616065063109,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[5.878703839349369,-3.8263644421397207,0.15],"cz":2.4938633836176103,"textureType":"No Wall Texture","cy":-3.8263644421397207,"id":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"78T3MkimgRTSnmRTMhRnJm","leftPoint":[-6.121296160650631,-3.8263644421397207,0.15],"normal":[0,0,1],"ly":0.1,"lz":4.0189625473598385,"leftRoofHeight":4.0189625473598385,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4.0189625473598385,"lx":12,"color":"#ffffff","studWidth":0.1,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Window","showLabel":false,"ly":0.3,"lz":0.44384979425833565,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#009ce0","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.09751468078404088,"selected":false,"cx":-0.375,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#009ce0","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.09751468078404088,"normal":[0,0,1],"cx":-0.20833333333333334,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.20833333333333334,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#009ce0","cz":-0.09751468078404088,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0.3,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.375,"cy":0.1,"cz":-0.09751468078404088,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#009ce0","selected":false,"ly":0.3,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"lz":0.3942112571821837,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#009ce0","lx":0.13333333333333333,"cx":0.3333333333333333,"cz":-0.0726954122459649,"ly":0.3,"showLabel":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.3333333333333333,"rotation":[0,0,0],"type":"Window","lz":0.3942112571821837,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":-0.0726954122459649,"lx":0.13333333333333333,"color":"#009ce0","cy":0.1,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.18779489182743653,"lx":0.16666666666666666,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #6","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"huHgxbUk5nxatnYiuq2HhR","locked":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Door","cx":-0.006666666666666672,"cy":0,"cz":-0.18779489182743653,"lx":0.2,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #4","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"eBQam4YYdXWFEi5iDbVQ4t","locked":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Human","name":"Judd","cx":-1.6517669050671016,"cy":-5.151915789984621,"cz":0,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fPgwwBmXz2LWV9vPRMmqzu","selected":false,"ly":0.544,"locked":false,"flip":true},{"type":"Window","cx":0,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"mullionSpacing":1,"color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"id":"6fPaBMTjYg9NPR7fFaHY6L","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"selected":false,"locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Tree","name":"Maple","cx":11.865118463765427,"cy":-5.577986315935053,"cz":8.881784197001252e-16,"lx":16.05619920115618,"lz":13.259443372641188,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fvxLBBmjibSLAyfoLcbVjh","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-3.0750695946303814,"cy":-4.227743581523945,"cz":0,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"c6WoCyEbuQkywzSj8xtBF2","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":2.0998220675663912,"cy":5.661327124584192,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"2agGn2N16sYDjc7TtzRo77","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-1.443673320056662,"cy":5.538396761407162,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"817xHue6rUfnaS7Rb7KYEp","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":3.7512645617671208,"cy":-4.363148504838203,"cz":0,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"gonFzZtq1wiiYeCU4hrBiQ","selected":false,"locked":false},{"type":"Tree","name":"Oak","cx":-12.252366424027322,"cy":-4.618748106171015,"cz":0,"lx":8.855861155358149,"lz":12.194962084865425,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qpT1N3VZfjdrNWS4GttCXC","selected":false,"locked":false},{"type":"Human","name":"Jena","cx":0.8275383928823183,"cy":-9.624350207348813,"cz":0,"lx":0.695,"ly":0.695,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"gqeggrZFS756iNyQUnbtUf","selected":false,"locked":false,"flip":true},{"type":"Tree","name":"Elm","cx":13.111399109297015,"cy":-1.1973027476553462,"cz":0,"lx":10.046562775206576,"lz":8.109426488433453,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"rAcrYXcgzcVotvfd1MPBUS","selected":false,"locked":false,"flip":true},{"type":"Wall","cx":-2.2052541270362322,"cy":0.8790814624363403,"cz":3.903941909848086,"lx":1.6301713902021722,"ly":0.1,"lz":7.36138516954615,"leftJoints":["7th3drNVpuY5AYVdUWYMmr"],"rightJoints":["4phTBDkfBQXjkb4Rk7FnE9"],"leftPoint":[-1.3901684319351464,0.8790814624363403,0.13318518579593203],"rightPoint":[-3.020339822137318,0.8790814624363402,0.13318518579593203],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#c45100","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"nKrKhaZnvb6NWdN1cuPNPQ","parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","studWidth":0.1,"roofId":"a4xCB5WuiLgF5jeoo2tZKb","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.991111147755922,"rightTopPartialHeight":7.991111147755922,"leftRoofHeight":7.36138516954615,"rightRoofHeight":7.36138516954615},{"type":"Wall","cx":-1.390168431935146,"cy":0.1417655180283693,"cz":3.5644394786617815,"lx":1.4746318888159395,"ly":0.1,"lz":7.36138516954615,"leftJoints":["kWszqFPBGdK8r8abVTohoG"],"rightJoints":["nKrKhaZnvb6NWdN1cuPNPQ"],"leftPoint":[-1.390168431935146,-0.5955504263796001,0.13318518579593203],"rightPoint":[-1.3901684319351464,0.8790814624363403,0.13318518579593203],"relativeAngle":1.570796326794897,"textureType":"No Wall Texture","color":"#c45100","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"7th3drNVpuY5AYVdUWYMmr","parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","studWidth":0.1,"roofId":"a4xCB5WuiLgF5jeoo2tZKb","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.991111147755922,"rightTopPartialHeight":7.991111147755922,"leftRoofHeight":7.36138516954615,"rightRoofHeight":7.36138516954615},{"type":"Wall","cx":-3.020339822137318,"cy":0.14176551802837095,"cz":3.660138480027889,"lx":1.4746318888159395,"ly":0.1,"lz":7.36138516954615,"leftJoints":["nKrKhaZnvb6NWdN1cuPNPQ"],"rightJoints":["kWszqFPBGdK8r8abVTohoG"],"leftPoint":[-3.020339822137318,0.8790814624363402,0.13318518579593203],"rightPoint":[-3.020339822137318,-0.5955504263796002,0.13318518579593203],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#c45100","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"4phTBDkfBQXjkb4Rk7FnE9","parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","studWidth":0.1,"roofId":"a4xCB5WuiLgF5jeoo2tZKb","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.991111147755922,"rightTopPartialHeight":7.991111147755922,"leftRoofHeight":7.36138516954615,"rightRoofHeight":7.36138516954615},{"type":"Wall","cx":-2.2052541270362322,"cy":-0.5955504263796001,"cz":3.535805069111796,"lx":1.6301713902021722,"ly":0.1,"lz":7.36138516954615,"leftJoints":["4phTBDkfBQXjkb4Rk7FnE9"],"rightJoints":["7th3drNVpuY5AYVdUWYMmr"],"leftPoint":[-3.020339822137318,-0.5955504263796002,0.13318518579593203],"rightPoint":[-1.390168431935146,-0.5955504263796001,0.13318518579593203],"relativeAngle":0,"textureType":"No Wall Texture","color":"#c45100","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"kWszqFPBGdK8r8abVTohoG","parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","studWidth":0.1,"roofId":"a4xCB5WuiLgF5jeoo2tZKb","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.991111147755922,"rightTopPartialHeight":7.991111147755922,"leftRoofHeight":7.36138516954615,"rightRoofHeight":7.36138516954615},{"type":"Foundation","cx":0.3077078971226189,"cy":3.0276471134665144,"cz":0.05,"lx":6.050585488591402,"ly":1.8221381985905813,"lz":0.13318518579593203,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tn6VdYYXt613XceYDyUpJ9","selected":false,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Tree","name":"Elm","cx":20.67846328505893,"cy":-9.20268218529909,"cz":0,"lx":12.433839488245253,"lz":9.836057268637402,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"6U6bXmGtKfkYqAs2kythZy","selected":false,"locked":false},{"type":"Tree","name":"Oak","flip":true,"cx":-10.79612992548108,"cy":-0.5136286397841126,"cz":0,"lx":8.855861155358149,"lz":10.429490037118851,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"kMBedsoq9QVDjasDrQWT4V","selected":false,"locked":false},{"type":"Window","cx":-0.012652630358459416,"cy":0.3,"cz":-0.43145161207114374,"lx":0.7034406025498919,"ly":0.1,"lz":0.1120689672961754,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"4phTBDkfBQXjkb4Rk7FnE9","foundationId":"tn6VdYYXt613XceYDyUpJ9","id":"j6NUHZizYhFTiAyWQhXoD9","locked":false},{"type":"Polygon","cx":0.07638982322958343,"cy":-0.25928828992332453,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.08333333333333336,"y":-0.3349639302840458},{"x":-0.08333333333333336,"y":-0.21055371393891886},{"x":0.08333333333333327,"y":-0.21055371393891886},{"x":0.08333333333333327,"y":-0.3349639302840458}],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":2,"id":"riLcPLsK7W8zeEnjZw8gRf","text":"1776","fontSize":0.3,"fontColor":"gold","opacity":0,"noOutline":true,"fontStrokeWidth":0.01,"locked":false},{"type":"Foundation","cx":0.33379757598519466,"cy":-2.7971719396742896,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"qGYqGFx5QHvCYMPqUamwtg","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["fHfbtb59n24haPtRTBRcYJ"],"rightJoints":["1jiwH1dGqmJCE577Ac4BpJ"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oQTYhBNys7ET4C3deVBZ5Q","parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"rYxSTT1cUyicscf7Y4FuC6","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["5nN1y4Kn3NGWF4MsuL2gGg"],"rightJoints":["oQTYhBNys7ET4C3deVBZ5Q"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fHfbtb59n24haPtRTBRcYJ","parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"rYxSTT1cUyicscf7Y4FuC6","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["oQTYhBNys7ET4C3deVBZ5Q"],"rightJoints":["5nN1y4Kn3NGWF4MsuL2gGg"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1jiwH1dGqmJCE577Ac4BpJ","parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"rYxSTT1cUyicscf7Y4FuC6","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["1jiwH1dGqmJCE577Ac4BpJ"],"rightJoints":["fHfbtb59n24haPtRTBRcYJ"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5nN1y4Kn3NGWF4MsuL2gGg","parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"rYxSTT1cUyicscf7Y4FuC6","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-4.860154921480787e-17,"cy":0.1,"cz":0.3666666666666667,"lx":0.7004221405870003,"ly":0.1,"lz":0.2333333333333334,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mLmsMTSYV91NUMvpsqsFiG","parentId":"5nN1y4Kn3NGWF4MsuL2gGg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"rYxSTT1cUyicscf7Y4FuC6","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["1jiwH1dGqmJCE577Ac4BpJ"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.27,"thickness":0.1,"rValue":2,"color":"#4d4d4d","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["7th3drNVpuY5AYVdUWYMmr","nKrKhaZnvb6NWdN1cuPNPQ","4phTBDkfBQXjkb4Rk7FnE9","kWszqFPBGdK8r8abVTohoG"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","id":"a4xCB5WuiLgF5jeoo2tZKb","locked":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.4627363727730651,"lx":0.6781353418329732,"ly":0.1,"lz":0.04949944589233271,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"7th3drNVpuY5AYVdUWYMmr","foundationId":"tn6VdYYXt613XceYDyUpJ9","id":"bgYTJi5DzEFJGVCo57XuYk","locked":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.4627363727730651,"lx":0.6134324317125827,"ly":0.1,"lz":0.04949944589233271,"uValue":2,"mullion":true,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ooToYHmPZvhwYzrAb3RyWE","parentId":"nKrKhaZnvb6NWdN1cuPNPQ","foundationId":"tn6VdYYXt613XceYDyUpJ9","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.4627363727730651,"lx":0.6781353418329732,"ly":0.1,"lz":0.04949944589233271,"uValue":2,"mullion":true,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gozabRkLLupzqY7JtKZ5DU","parentId":"4phTBDkfBQXjkb4Rk7FnE9","foundationId":"tn6VdYYXt613XceYDyUpJ9","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Window","cx":0.03235145506019523,"cy":0.3,"cz":0.4627363727730651,"lx":0.6781353418329732,"ly":0.1,"lz":0.04949944589233271,"uValue":2,"mullion":true,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"suAHKZgUHocvdJbxFoH78W","parentId":"kWszqFPBGdK8r8abVTohoG","foundationId":"tn6VdYYXt613XceYDyUpJ9","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Foundation","cx":3.2150216052788303,"cy":-2.8132764716626193,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"gh4c13r9yNg7ppA3VVwrX8","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["9qfdnpKV9WxuYmpphDkmD4"],"rightJoints":["j9Z8EowBvMVCM2dwgKYy1y"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"trW1X3K7auhSfAooobgEiw","parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"685MKS7u6S8wM1nxD2jLoc","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["3x1iWRnJVD2nF7eUVd16Wm"],"rightJoints":["trW1X3K7auhSfAooobgEiw"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9qfdnpKV9WxuYmpphDkmD4","parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"685MKS7u6S8wM1nxD2jLoc","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["trW1X3K7auhSfAooobgEiw"],"rightJoints":["3x1iWRnJVD2nF7eUVd16Wm"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j9Z8EowBvMVCM2dwgKYy1y","parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"685MKS7u6S8wM1nxD2jLoc","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["j9Z8EowBvMVCM2dwgKYy1y"],"rightJoints":["9qfdnpKV9WxuYmpphDkmD4"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3x1iWRnJVD2nF7eUVd16Wm","parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"685MKS7u6S8wM1nxD2jLoc","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-4.860154921480787e-17,"cy":0.1,"cz":0.3666666666666667,"lx":0.7004221405870003,"ly":0.1,"lz":0.2333333333333334,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6LzR6eV1uwci9irbGqdmsg","parentId":"3x1iWRnJVD2nF7eUVd16Wm","foundationId":"gh4c13r9yNg7ppA3VVwrX8","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"685MKS7u6S8wM1nxD2jLoc","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["j9Z8EowBvMVCM2dwgKYy1y"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Foundation","cx":-4.860568941525044,"cy":0.763315834515849,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"js7EaM7SDLKEtCc7cBhAUc","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["tJ9GgBix3PLQrNArenRuzc"],"rightJoints":["mnsM5PmgqiqpCUSahppEQQ"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"4oWBJBVuW5ddc3zLD4mbeh","parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bz1WrgXhu5EcEAR9GxS6yF","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["41NvU5MXffjBBr51nmDdGG"],"rightJoints":["4oWBJBVuW5ddc3zLD4mbeh"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"tJ9GgBix3PLQrNArenRuzc","parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bz1WrgXhu5EcEAR9GxS6yF","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["4oWBJBVuW5ddc3zLD4mbeh"],"rightJoints":["41NvU5MXffjBBr51nmDdGG"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"mnsM5PmgqiqpCUSahppEQQ","parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bz1WrgXhu5EcEAR9GxS6yF","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["mnsM5PmgqiqpCUSahppEQQ"],"rightJoints":["tJ9GgBix3PLQrNArenRuzc"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"41NvU5MXffjBBr51nmDdGG","parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bz1WrgXhu5EcEAR9GxS6yF","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-0.0038568156424866754,"cy":0.3,"cz":0.4134081675516749,"lx":0.692708509302027,"ly":0.1,"lz":0.1601496684366832,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9EeeFoACPVE8MLe3zorx4K","parentId":"41NvU5MXffjBBr51nmDdGG","foundationId":"js7EaM7SDLKEtCc7cBhAUc","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"bz1WrgXhu5EcEAR9GxS6yF","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["mnsM5PmgqiqpCUSahppEQQ"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Mansard","roofStructure":"Default","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"ridgeWidth":1.783225650631956,"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"78T3MkimgRTSnmRTMhRnJm","locked":false,"rise":2.3357705249971685,"ceiling":false},{"type":"Foundation","cx":5.500184342397144,"cy":0.616975206751395,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"f7TRNhRrBM6HewS6E1guoW","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["rRB8ra1Qwyw4iiHGHnpVZi"],"rightJoints":["1hwtcWgsscfNjYqgnjhvtn"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"pNGTThD5hH42KcpY4sRcaQ","parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"hWL7sH8U7YoQ4wHgsqH7VK","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["eqjL2dbMLsHLvayC5LyFuv"],"rightJoints":["pNGTThD5hH42KcpY4sRcaQ"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"rRB8ra1Qwyw4iiHGHnpVZi","parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"hWL7sH8U7YoQ4wHgsqH7VK","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["pNGTThD5hH42KcpY4sRcaQ"],"rightJoints":["eqjL2dbMLsHLvayC5LyFuv"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"1hwtcWgsscfNjYqgnjhvtn","parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"hWL7sH8U7YoQ4wHgsqH7VK","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["1hwtcWgsscfNjYqgnjhvtn"],"rightJoints":["rRB8ra1Qwyw4iiHGHnpVZi"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"eqjL2dbMLsHLvayC5LyFuv","parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"hWL7sH8U7YoQ4wHgsqH7VK","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-0.0038568156424866754,"cy":0.3,"cz":0.4134081675516749,"lx":0.692708509302027,"ly":0.1,"lz":0.1601496684366832,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mDEuMJDYX8TiA5aadxRnBu","parentId":"eqjL2dbMLsHLvayC5LyFuv","foundationId":"f7TRNhRrBM6HewS6E1guoW","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"hWL7sH8U7YoQ4wHgsqH7VK","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["1hwtcWgsscfNjYqgnjhvtn"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Window","cx":-2.9061219154167555,"cy":-3.497482825893301,"cz":5.031519407546503,"lx":1.300297700517698,"ly":0.1,"lz":1.9655762500908776,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[1.1621842141674956,0,0],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"dqF6aB1PLVLHAKyQxUkNWg","locked":false,"interior":true,"empty":true},{"type":"Window","cx":-0.13217799837949085,"cy":-3.466819756320384,"cz":5.102337732905447,"lx":1.0067165265651998,"ly":0.1,"lz":2.114356430670708,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[1.1621842141674956,0,0],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"s7X1mdRRoj7fgg7jLfkGQy","locked":false,"interior":true,"empty":true,"polygonTop":[0.013284896561776944,0.31018938223150583]},{"type":"Window","cx":2.7465783818144205,"cy":-3.5046143246410884,"cz":5.015048753901841,"lx":1.1969599659290129,"ly":0.1,"lz":1.7862306602865088,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[1.1621842141674958,0,0],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"4ExkckYEtLvi3sMjGcHsBj","locked":false,"interior":true,"empty":true},{"type":"Window","cx":-5.33506170232176,"cy":0.09994590152917182,"cz":5.333416244357606,"lx":1.2282372453539805,"ly":0.1,"lz":1.511969232086556,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.9962527086505618,0,4.71238898038469],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"gFPFPr9Hy5FNU5ri2g3ZMj","locked":false,"interior":true,"empty":true},{"type":"Window","cx":5.09996147816442,"cy":-0.02661611464564695,"cz":5.321843608513025,"lx":1.1961819365662594,"ly":0.1,"lz":1.1993416949141293,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.9962527086505618,0,1.5707963267948966],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"hYKzofeHiHD2fL3mK24K6U","locked":false,"interior":true,"empty":true},{"type":"Foundation","cx":-2.443546493608035,"cy":-2.7953215648047354,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"k5csVFnyrpYrBkQNWDouaF","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["hhfft6jEyF5V7W3kNGR7VB"],"rightJoints":["vuuABxxTWnhAaFBLMw5wsz"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uTXQVHi382ou2WhVmDTfzD","parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"3dnKtcKTXnG1eDaqcB1sdk","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["4fS3C4uw4LVSpSngSsA7dR"],"rightJoints":["uTXQVHi382ou2WhVmDTfzD"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hhfft6jEyF5V7W3kNGR7VB","parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"3dnKtcKTXnG1eDaqcB1sdk","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["uTXQVHi382ou2WhVmDTfzD"],"rightJoints":["4fS3C4uw4LVSpSngSsA7dR"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vuuABxxTWnhAaFBLMw5wsz","parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"3dnKtcKTXnG1eDaqcB1sdk","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["vuuABxxTWnhAaFBLMw5wsz"],"rightJoints":["hhfft6jEyF5V7W3kNGR7VB"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4fS3C4uw4LVSpSngSsA7dR","parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"3dnKtcKTXnG1eDaqcB1sdk","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-4.860154921480787e-17,"cy":0.1,"cz":0.3666666666666667,"lx":0.7004221405870003,"ly":0.1,"lz":0.2333333333333334,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bKJgLy3t9PMmV69scLag6y","parentId":"4fS3C4uw4LVSpSngSsA7dR","foundationId":"k5csVFnyrpYrBkQNWDouaF","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"3dnKtcKTXnG1eDaqcB1sdk","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["vuuABxxTWnhAaFBLMw5wsz"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Window","cx":-0.2967756977486685,"cy":0.20088911106289942,"cz":6.454733072357007,"lx":1.191642955374655,"ly":0.1,"lz":1.1555332790892452,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"iuNzbNXdWiXkLCQooXhnqK"}],"sceneRadius":34,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[1.5484163619340843,0.44578561471726313,8.140182408063113e-8],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[1.5484163619340843,0.4447852372714149,150],"theme":"Rural","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-8.484010006399412,-18.277620093544904,3.817556225217015],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":50.3506522061685,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#3a8569","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[2.1400728033642977,-1.125989332642603,3.1050102010198306],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":6},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},439:function(e){e.exports=JSON.parse('{"docid":"g9RKpzrgbWbsC1dbkpX9ZS","time":"06/17/2023 02:55 pm","timestamp":1687028106173,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jaye","cx":-1.2513719184514027,"cy":-6.372159113081112,"cz":0.03284187614917711,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.55,"locked":true},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":6,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":6,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":6,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":6,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2kwhV9PqZtFtk8RVLFx83","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qpEwqVCd2BoFtSevFQh92k","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":0.5149353122311684,"cy":0.036172415190780516,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":true,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Door","cx":0,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"textureType":"Door Texture #3","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"sXi8n3YHx4BKsSMSv4hsZ3","locked":true,"doorType":"Default","archHeight":1,"filled":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":true,"rise":2.2458395786002807,"ceiling":false},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5CaMQ21unMpwofCSBHFHKy","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p9ZFePdMbr5NJNutJpztLz","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"onfGgeAsDqrPXW9qAoSbJh","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916777,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mM8yRHvdQcQxaerLVfTrHK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"reViENhjL3rZ1iP9Y6KZQV","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dKNjnS17wjTVoaiN1bY7jW","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bJfKVxMyGkSvssMyjbaW7W","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u4p2yGTyGA3NaJrURgo1aw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"swiJmUxEJ9JBgVoJXFiWMw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dJpqWBHMDhQTd71cTnXaW4","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j5a1DqXozDg23XnZHUwT3y","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wdagFqacKyLy9R8i7SRZPq","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fY9urdYNGp76qQUc5TkF8d","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kwvhmrhVppPu21YKVKixoa","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nZtTu7kGPQBjfFfeNj7L7w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"433Qj5XWec6xkx6KMSVinb","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tPa2K6uLM9bNJjLjnApS5w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cAQmf2baCS5Y2WWh241r8n","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jena","cx":0.012588972336459392,"cy":14.712453241561741,"cz":0,"lx":0.695,"ly":0.695,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"5FVsreGyGxfLQLGYPuw8VY","selected":false,"locked":true},{"type":"Wall","cx":-1.183865369768545,"cy":0.5782456514167715,"cz":2.2408122612280286,"lx":1.1862232825779104,"ly":0.1,"lz":9.575974551005562,"leftJoints":["pw9wMqrj3Enw2zC5Tgk6yR"],"rightJoints":["dMssi4ADwUhxkBhQ377g3E"],"leftPoint":[-0.59075372847959,0.5782456514167715,0],"rightPoint":[-1.7769770110575003,0.5782456514167715,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #3","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"id":"5koEPnk7n6ka7L389qtGvZ","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-0.59075372847959,"cy":0.043861762748918204,"cz":2.2301039869226305,"lx":1.0687677773357067,"ly":0.1,"lz":9.575974551005562,"leftJoints":["sW8KRkVjiejYRvNZCfXEAP"],"rightJoints":["5koEPnk7n6ka7L389qtGvZ"],"leftPoint":[-0.59075372847959,-0.4905221259189351,0],"rightPoint":[-0.59075372847959,0.5782456514167715,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #3","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"id":"pw9wMqrj3Enw2zC5Tgk6yR","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-1.7769770110575003,"cy":0.043861762748918204,"cz":2.228839888904333,"lx":1.0687677773357067,"ly":0.1,"lz":9.575974551005562,"leftJoints":["5koEPnk7n6ka7L389qtGvZ"],"rightJoints":["sW8KRkVjiejYRvNZCfXEAP"],"leftPoint":[-1.7769770110575003,0.5782456514167715,0],"rightPoint":[-1.7769770110575003,-0.4905221259189351,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #3","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"id":"dMssi4ADwUhxkBhQ377g3E","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-1.183865369768545,"cy":-0.4905221259189351,"cz":2.268765007024547,"lx":1.1862232825779104,"ly":0.1,"lz":9.575974551005562,"leftJoints":["dMssi4ADwUhxkBhQ377g3E"],"rightJoints":["pw9wMqrj3Enw2zC5Tgk6yR"],"leftPoint":[-1.7769770110575003,-0.4905221259189351,0],"rightPoint":[-0.59075372847959,-0.4905221259189351,0],"relativeAngle":0,"textureType":"Wall Texture #3","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"id":"sW8KRkVjiejYRvNZCfXEAP","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Foundation","cx":-6.963047317091872,"cy":9.305275463657257,"cz":0.05,"lx":3.9991959519547824,"ly":1.4273945635779641,"lz":0.11969968188756955,"normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qEHo3z28Ar77Wu5WGXMk73","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":0.8037383988388016,"cy":5.7479913822261075,"cz":1.2963049013988683,"lx":2.4667544114619777,"ly":0.1,"lz":2.5926098027977367,"leftJoints":["cRF4aFTgNdpMTdmopKNDYe"],"rightJoints":["maCaKmF7W1UtJB4NhBQsX3"],"leftPoint":[2.03711560456979,5.747991382226106,0.06568375039354474],"rightPoint":[-0.4296388068921875,5.747991382226109,0.06568375039354474],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"id":"qA9MpNw8bZfY7qVfr846Q8","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"gJReW7hpA5RV4sDmYkftax","selected":false,"leftRoofHeight":2.5926098027977367,"rightRoofHeight":2.5926098027977367,"locked":true,"structureSpacing":3,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5926098027977367,"rightTopPartialHeight":2.5926098027977367},{"type":"Wall","cx":2.037115604569791,"cy":-0.0267801106673915,"cz":1.2963049013988683,"lx":11.549542985787003,"ly":0.3,"lz":2.5926098027977367,"leftJoints":["5ExmWkfAba5nuC3xfHo5vU"],"rightJoints":["qA9MpNw8bZfY7qVfr846Q8"],"leftPoint":[2.0371156045697902,-5.801551603560892,0.06568375039354474],"rightPoint":[2.03711560456979,5.747991382226106,0.06568375039354474],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"id":"cRF4aFTgNdpMTdmopKNDYe","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Stud","opacity":0,"roofId":"gJReW7hpA5RV4sDmYkftax","selected":false,"leftRoofHeight":2.5926098027977367,"rightRoofHeight":2.5926098027977367,"locked":true,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5926098027977367,"rightTopPartialHeight":2.5926098027977367},{"type":"Wall","cx":-0.4296388068921877,"cy":-0.026780110667392,"cz":1.2963049013988683,"lx":11.549542985787003,"ly":0.1,"lz":2.5,"leftJoints":["qA9MpNw8bZfY7qVfr846Q8"],"rightJoints":["5ExmWkfAba5nuC3xfHo5vU"],"leftPoint":[-0.4296388068921875,5.747991382226109,0.06568375039354474],"rightPoint":[-0.4296388068921875,-5.801551603560892,0.06568375039354474],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"id":"maCaKmF7W1UtJB4NhBQsX3","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"gJReW7hpA5RV4sDmYkftax","selected":false,"leftRoofHeight":2.5926098027977367,"rightRoofHeight":2.5926098027977367,"locked":true,"structureSpacing":3,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"type":"Wall","cx":0.8037383988388016,"cy":-5.801551603560892,"cz":1.2963049013988683,"lx":2.46675441146198,"ly":0.1,"lz":2.5926098027977367,"leftJoints":["maCaKmF7W1UtJB4NhBQsX3"],"rightJoints":["cRF4aFTgNdpMTdmopKNDYe"],"leftPoint":[-0.4296388068921875,-5.801551603560892,0.06568375039354474],"rightPoint":[2.0371156045697902,-5.801551603560892,0.06568375039354474],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"id":"5ExmWkfAba5nuC3xfHo5vU","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"gJReW7hpA5RV4sDmYkftax","selected":false,"leftRoofHeight":2.5926098027977367,"rightRoofHeight":2.5926098027977367,"locked":true,"structureSpacing":3,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5926098027977367,"rightTopPartialHeight":2.5926098027977367},{"type":"Foundation","cx":4.89676730184058,"cy":-5.153959605268503,"cz":0.05,"lx":4.932837807071785,"ly":16.292262691376934,"lz":0.06568375039354474,"normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"myXiyVt2NURPnPChDUSnvF","selected":false,"locked":true,"notBuilding":true},{"type":"Tree","name":"Maple","cx":-9.524500304672243,"cy":13.709596046858643,"cz":0,"lx":10.834343460246352,"lz":10.259018050875072,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"nHGsDGLUFhyht1nKkbShZS","selected":false,"locked":true},{"type":"Tree","name":"Maple","cx":-6.796534185824541,"cy":18.258777569256825,"cz":0,"lx":15.381033043650339,"lz":12.882589649504101,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"pYVQihimDYo3cuWwFUxGRV","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-2.2262641238571375,"cy":-0.2694473112048733,"cz":0.03284187614917755,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","id":"pv5MXJzN7e4QwMAqb7AK2K","selected":false,"locked":true},{"type":"Flower","name":"Spirea","cx":-2.2467598257077848,"cy":3.412268957127143,"cz":0.03284187614917755,"lx":1.8,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","id":"evYRkJazdBwJn4ArepyeZH","selected":false,"locked":true},{"type":"Flower","name":"Spirea","cx":-2.3118748580987036,"cy":-3.753623714118395,"cz":0.03284187614917755,"lx":1.8,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","id":"mr1vQH3R9jwp2hzXcmJrDH","selected":false,"locked":true},{"type":"Wall","cx":0.06987760561132239,"cy":2.6725668112376275,"cz":2.2408122612280286,"lx":10.248709902558403,"ly":0.3,"lz":6,"leftJoints":["a5m5AvsmWigFtneecAXGMn"],"rightJoints":["6PzfAQV8su7Enkckc6tSx8"],"leftPoint":[5.194232556890523,2.672566811237627,0],"rightPoint":[-5.054477345667879,2.672566811237628,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"id":"82amhDo89t4LPzjbshEmmD","parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofId":"wFnXk782R98H6AT2RALp7W","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":5.1942325568905225,"cy":-0.06239106653992166,"cz":2.2301039869226305,"lx":5.4699157555551,"ly":0.3,"lz":6,"leftJoints":["xvDTHckT6Jh3sPEoBy9XsM"],"rightJoints":["82amhDo89t4LPzjbshEmmD"],"leftPoint":[5.194232556890521,-2.7973489443174713,0],"rightPoint":[5.194232556890523,2.672566811237628,0],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"id":"a5m5AvsmWigFtneecAXGMn","parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofId":"wFnXk782R98H6AT2RALp7W","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5.858178072916449,"rightUnfilledHeight":5.858178072916449,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-5.054477345667879,"cy":-0.06239106653992166,"cz":2.228839888904333,"lx":5.4699157555551,"ly":0.3,"lz":6,"leftJoints":["82amhDo89t4LPzjbshEmmD"],"rightJoints":["xvDTHckT6Jh3sPEoBy9XsM"],"leftPoint":[-5.054477345667878,2.672566811237628,0],"rightPoint":[-5.054477345667879,-2.7973489443174713,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"id":"6PzfAQV8su7Enkckc6tSx8","parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofId":"wFnXk782R98H6AT2RALp7W","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.2742272581577952,"cy":0.1,"cz":-0.29166666666666663,"lx":0.1828181721051967,"ly":0.3,"lz":0.24999999999999992,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hskMbJc7MNggWVyJxXeWfq","parentId":"6PzfAQV8su7Enkckc6tSx8","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.27422725815779514,"cy":0.1,"cz":-0.29166666666666663,"lx":0.18281817210519707,"ly":0.3,"lz":0.24999999999999992,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"t4tAXhCx5djrNJxXHT3ypA","parentId":"6PzfAQV8su7Enkckc6tSx8","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27422725815779525,"cy":0.1,"cz":0.2916666666666666,"lx":0.1828181721051968,"ly":0.3,"lz":0.24999999999999986,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gDRnUAXHHxbgJda5pCBAaH","parentId":"6PzfAQV8su7Enkckc6tSx8","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2742272581577952,"cy":0.1,"cz":0.2916666666666666,"lx":0.1828181721051969,"ly":0.3,"lz":0.24999999999999986,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jQdaLqe6Gc7eF6ukLyTX2V","parentId":"6PzfAQV8su7Enkckc6tSx8","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.06987760561132239,"cy":-2.7973489443174713,"cz":2.268765007024547,"lx":10.248709902558403,"ly":0.3,"lz":6,"leftJoints":["6PzfAQV8su7Enkckc6tSx8"],"rightJoints":["a5m5AvsmWigFtneecAXGMn"],"leftPoint":[-5.054477345667879,-2.7973489443174713,0],"rightPoint":[5.194232556890523,-2.7973489443174713,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"id":"xvDTHckT6Jh3sPEoBy9XsM","parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofId":"wFnXk782R98H6AT2RALp7W","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"id":"wFnXk782R98H6AT2RALp7W","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofType":"Gable","textureType":"Roof Texture Default","thickness":0.1,"wallsId":["xvDTHckT6Jh3sPEoBy9XsM"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":true,"rise":2.2458395786002807,"ceiling":false},{"type":"Foundation","cx":-2.6332068809886726,"cy":4.093457334157864,"cz":0.05,"lx":13.955747653843215,"ly":7.879103027392385,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"8JaqTz5HE2vZh6f1qWauFD","selected":false,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Window","cx":0.2439331412216011,"cy":0.1,"cz":0.29742868877631434,"lx":0.09757325648864049,"ly":0.3,"lz":0.23847595578070466,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"a18ekWsi3At6CyxwfsEfLY","parentId":"82amhDo89t4LPzjbshEmmD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2439331412216011,"cy":0.1,"cz":-0.20257131122368566,"lx":0.09757325648864049,"ly":0.3,"lz":0.23847595578070466,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ewmHx8vQmQCZbH72jjrubL","parentId":"82amhDo89t4LPzjbshEmmD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.1951465129772808,"cy":0.1,"cz":0.29742868877631434,"lx":0.09757325648864049,"ly":0.3,"lz":0.23847595578070466,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p47WFW8gx3h8pL5rWPaE9A","parentId":"xvDTHckT6Jh3sPEoBy9XsM","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.1951465129772808,"cy":0.1,"cz":-0.28590464455701897,"lx":0.09757325648864049,"ly":0.3,"lz":0.23847595578070466,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dKSHyHzpuwjQ6u42WTMQwe","parentId":"xvDTHckT6Jh3sPEoBy9XsM","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"locked":true,"windowType":"Default","archHeight":1},{"type":"Tree","name":"Maple","flip":true,"cx":-10.024831295895067,"cy":-6.947888024156535,"cz":3.552713678800501e-15,"lx":9.499179837441329,"lz":8.91889941652548,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"17x5uLRhSti25y9wnQAD3e","selected":false,"locked":true},{"type":"Tree","name":"Maple","flip":true,"cx":7.8517108982888875,"cy":-13.70932723423602,"cz":0,"lx":10.834343460246352,"lz":10.259018050875072,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"e2bctFXk26F3cCpiZ3zcBD","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","cx":9.46029508775506,"cy":4.366435707994473,"cz":0,"lx":2,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rjMRf1bvBNLgz5CfSBmVBH","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","flip":true,"cx":6.596349525650214,"cy":7.3019799091519495,"cz":0,"lx":2,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"4nuj6tR4dp4bVWBFmJcLMX","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","flip":true,"cx":12.109444732702052,"cy":1.502490145889622,"cz":0,"lx":2,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"coNQQ9v27FUH4psYEEKrzU","selected":false,"locked":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.004578461502795039,"cy":-0.18228950583714837,"cz":7.217657963251398,"lx":10.906,"ly":5.23,"lz":0.046,"showLabel":false,"normal":[0,-0.4097333676171505,0.9122053318530369],"rotation":[0.4221617487320859,0,0],"color":"#fff","parentType":"Roof","parentId":"1iq4TPqH8xr1w2VxMAh8MU","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"e4qFnFipJKb5qm8a1HUcvh","selected":false,"locked":true},{"type":"Human","name":"June","cx":5.394006234886843,"cy":5.908204264429319,"cz":0.05000000074505806,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"tW2AiaFFEyE2Ns8f1NeVn4","selected":false,"ly":0.65,"locked":true},{"type":"Tree","name":"Maple","flip":true,"cx":-5.079938766417403,"cy":-11.600796953463268,"cz":8.881784197001252e-16,"lx":9.499179837441329,"lz":8.91889941652548,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"sFTDyq1WHUnyaCtK8Et8T3","selected":false,"locked":true},{"type":"Wall","cx":-0.5668843269198223,"cy":3.3269838316456033,"cz":2.2408122612280286,"lx":3.1143702580201373,"ly":0.1,"lz":2.5,"leftJoints":["5JFnb9etkW9gKawcVectpr"],"rightJoints":["4EuwNxKwuEQyYWKDv2pmPC"],"leftPoint":[0.9903008020902468,3.3269838316456037,0.06568375039354474],"rightPoint":[-2.1240694559298916,3.3269838316456037,0.06568375039354474],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"id":"vN4erE1LRomCSRmHUxy4kc","parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","wallStructure":"Stud","structureSpacing":3,"structureColor":"white","structureWidth":0.16,"opacity":0,"roofId":"niExsBvaYVQdEU42Cfexz9","selected":false,"leftRoofHeight":2.5,"rightRoofHeight":2.5,"locked":true,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"type":"Wall","cx":0.9903008020902477,"cy":0.19539461285221188,"cz":2.2301039869226305,"lx":6.263178437586782,"ly":0.1,"lz":2.5,"leftJoints":["oDVTwfwNuCQjh6t1rv6GNB"],"rightJoints":["vN4erE1LRomCSRmHUxy4kc"],"leftPoint":[0.9903008020902475,-2.936194605941179,0.06568375039354474],"rightPoint":[0.9903008020902482,3.326983831645603,0.06568375039354474],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"id":"5JFnb9etkW9gKawcVectpr","parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","wallStructure":"Stud","structureSpacing":3,"structureColor":"white","structureWidth":0.16,"opacity":0,"roofId":"niExsBvaYVQdEU42Cfexz9","selected":false,"leftRoofHeight":2.5,"rightRoofHeight":2.5,"locked":true,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"type":"Wall","cx":-2.1240694559298916,"cy":0.19539461285221216,"cz":2.228839888904333,"lx":6.263178437586782,"ly":0.3,"lz":2.5,"leftJoints":["vN4erE1LRomCSRmHUxy4kc"],"rightJoints":["oDVTwfwNuCQjh6t1rv6GNB"],"leftPoint":[-2.1240694559298916,3.3269838316456037,0.06568375039354474],"rightPoint":[-2.1240694559298934,-2.9361946059411803,0.06568375039354474],"relativeAngle":-1.570796326794897,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"id":"4EuwNxKwuEQyYWKDv2pmPC","parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","wallStructure":"Stud","structureSpacing":3,"structureColor":"white","structureWidth":0.2,"opacity":0,"roofId":"niExsBvaYVQdEU42Cfexz9","selected":false,"leftRoofHeight":2.5,"rightRoofHeight":2.5,"locked":true,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"type":"Wall","cx":-0.5668843269198227,"cy":-2.9361946059411808,"cz":2.268765007024547,"lx":3.11437025802014,"ly":0.3,"lz":2.5,"leftJoints":["4EuwNxKwuEQyYWKDv2pmPC"],"rightJoints":["5JFnb9etkW9gKawcVectpr"],"leftPoint":[-2.1240694559298934,-2.9361946059411803,0.06568375039354474],"rightPoint":[0.9903008020902475,-2.936194605941179,0.06568375039354474],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"id":"oDVTwfwNuCQjh6t1rv6GNB","parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","wallStructure":"Pillar","structureSpacing":3,"structureColor":"white","structureWidth":0.2,"opacity":0,"roofId":"niExsBvaYVQdEU42Cfexz9","selected":false,"leftRoofHeight":2.5,"rightRoofHeight":2.5,"locked":true,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"id":"niExsBvaYVQdEU42Cfexz9","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture Default","thickness":0.1,"wallsId":["oDVTwfwNuCQjh6t1rv6GNB"],"rightRidgeLength":1.3155130008385778,"leftRidgeLength":1.2587510331302654,"selected":false,"locked":true,"rise":0,"ceiling":false},{"type":"Foundation","cx":-0.26272797008951887,"cy":8.1604401446677,"cz":0.05,"lx":5.309542023727572,"ly":8.144294099873703,"lz":0.06568375039354474,"normal":[0,0,1],"rotation":[0,0,0.692197581340951],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hGX3VDUCbUqQb4byUBd7zY","selected":false,"locked":true,"notBuilding":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Hip","roofStructure":"Default","wallsId":["5ExmWkfAba5nuC3xfHo5vU"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","id":"gJReW7hpA5RV4sDmYkftax","leftRidgeLength":-1.2155130008385777,"rightRidgeLength":1.3155130008385778,"locked":true,"rise":1.3681252475370629,"ceiling":false},{"type":"Polygon","cx":0.04278236969738311,"cy":-0.2560980400226438,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.08333333333333333,"y":-0.4166666666666667},{"x":-0.08333333333333333,"y":-0.25},{"x":0.08333333333333333,"y":-0.25},{"x":0.08333333333333333,"y":-0.4166666666666667}],"parentId":"beHqET5NN8aNdsuBncMpY7","parentType":"Wall","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"filled":true,"selectedIndex":1,"id":"ikVqMPzpwnqJzyuQKJnm3R","text":"1204","fontColor":"gold","fontSize":0.6,"fontStrokeWidth":0.01,"noOutline":true,"opacity":0,"locked":true},{"type":"Door","cx":-0.020833333333333332,"cy":0,"cz":-0.041666666666666664,"lx":0.2916666666666667,"ly":0,"lz":0.9166666666666666,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"n3r5S7QrbxSVjZ7xS5KyLu","locked":true,"interior":true},{"type":"Door","cx":-0.2792719769465921,"cy":0,"cz":-0.024999999999999984,"lx":0.36339744091590337,"ly":0,"lz":0.9500000000000001,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"82amhDo89t4LPzjbshEmmD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","id":"igRWHnMRS6fxTHqNXYPWef","locked":true,"interior":true},{"type":"Door","cx":0.2792719769465921,"cy":0,"cz":-0.024999999999999984,"lx":0.36339744091590337,"ly":0,"lz":0.9500000000000001,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"xvDTHckT6Jh3sPEoBy9XsM","foundationId":"8JaqTz5HE2vZh6f1qWauFD","id":"qMCLuvG8BqaZaKpZzUtedz","locked":true,"interior":true},{"type":"Window","cx":3.404624864058591,"cy":2.7885016621952796,"cz":6.004798871333477,"lx":3.4895626397811177,"ly":0.1,"lz":0.17796770265695697,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6875112116901372,0,3.141592653589793],"parentId":"wFnXk782R98H6AT2RALp7W","parentType":"Roof","foundationId":"8JaqTz5HE2vZh6f1qWauFD","id":"7jkKGZrNg3fgmgiepuiVd6","polygonTop":[-0.4938087607108084,3.421264074035363],"locked":true},{"type":"Window","cx":3.296162482623047,"cy":-2.8950100151340963,"cz":6.019804579108658,"lx":3.6646685608352865,"ly":0.1,"lz":0.1258033813461092,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6875112116901371,0,-2.220446049250313e-16],"parentId":"wFnXk782R98H6AT2RALp7W","parentType":"Roof","foundationId":"8JaqTz5HE2vZh6f1qWauFD","id":"8TA7azNRBiNJHZ7UE6h9mn","polygonTop":[0.4950567748754359,3.3542143495155483],"locked":true},{"type":"Window","cx":0.1444278091371094,"cy":4.845674679128341,"cz":6.11808489875612,"lx":5.117648906007396,"ly":0.1,"lz":0.03540983073830939,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.4221617487320861,0,3.141592653589793],"parentId":"1iq4TPqH8xr1w2VxMAh8MU","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"tR6G6HakBCyhofJHaGkXmp","polygonTop":[0.01012300685908669,5.088349513682089],"locked":true}],"sceneRadius":32,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.504837297056488,2.0699150930784547,0.000003503755702267236],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.504837297056488,2.0689147156290253,150],"theme":"Forest","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[25.3008289766012,0.2505638757784885,4.9037705563101905],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":43.16939043526372,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-1.0370877496821287,2.0688812675610166,1.5303345515052023],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},440:function(e){e.exports=JSON.parse('{"docid":"vK6VS27r7ebuK4Vrn5FXEP","time":"06/15/2023 09:51 am","timestamp":1686837060482,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"10/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":10.473983232081025,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.22738864151314608,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.8212100903152013,"type":"Foundation","solarPowerTower":{},"lx":13.564552414056891,"lz":1.5,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.75,"enableGroupMaster":false,"color":"#999999","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":0,"lx":12,"relativeAngle":3.141592653589793,"lz":4.0189625473598385,"roofId":"nbw17kYeUHp1aouuScuF3Y","ly":0.3,"rightPoint":[-5.457020109151015,3.478026472724187,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture #10","leftPoint":[6.542979890848985,3.478026472724187,0.1],"type":"Wall","rightRoofHeight":4.0189625473598385,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4.0189625473598385,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.5429798908489842,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":3.478026472724187,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.542979890848985,"leftPoint":[6.542979890848985,-4.021973527275812,0.1],"cy":-0.27197352727581237,"leftRoofHeight":4.0189625473598385,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.542979890848985,3.478026472724187,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":7.5,"normal":[0,0,1],"lz":4.0189625473598385,"centerRoofHeight":[-0.022465454047944533,6.807600955038734],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":1.2992388529678256,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #10","rightRoofHeight":4.0189625473598385,"roofId":"nbw17kYeUHp1aouuScuF3Y","color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"lx":7.5,"windows":[],"lz":4.0189625473598385,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"nbw17kYeUHp1aouuScuF3Y","selected":false,"cy":-0.27197352727581237,"cz":2.586710917765224,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0.022465454047944533,6.807600955038734],"rightPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture #10","rightRoofHeight":4.0189625473598385,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.457020109151015,3.478026472724187,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4.0189625473598385,"ly":0.3,"cx":-5.457020109151015,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"showLabel":false,"cx":0.5429798908489842,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.542979890848985,-4.021973527275812,0.1],"cz":2.4938633836176103,"textureType":"Wall Texture #10","cy":-4.021973527275812,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"nbw17kYeUHp1aouuScuF3Y","leftPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"ly":0.3,"lz":4.0189625473598385,"leftRoofHeight":4.0189625473598385,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4.0189625473598385,"lx":12,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.05,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Foundation","ly":9.25428200301757,"lz":1.5,"rotation":[0,0,0],"cz":0.75,"cx":-3.7362314250129023,"lx":6.612524274166,"parentId":"Ground","solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"solarUpdraftTower":{},"normal":[0,0,1],"cy":-1.5723524020196393,"id":"8fpWrU7qVyVgipB7LtABom","color":"#999999","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"showLabel":false,"cz":3.903941909848086,"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","lz":6,"ly":0.1,"leftRoofHeight":6,"relativeAngle":3.141592653589793,"rightRoofHeight":6,"leftJoints":["4Q8KDQDxyuamkEtRJU3paR"],"lx":1.1421683491180719,"windows":[],"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"rightJoints":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Wall Texture #10","cx":-0.03446770657950715,"leftPoint":[0.5366164679795284,1.8199505814331163,1.5],"type":"Wall","rightPoint":[-0.6055518811385436,1.8199505814331163,1.5],"id":"bKLMq3WjuxRcsMDb5d4Xo1","cy":1.8199505814331163,"normal":[0,0,1],"selected":false,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","centerRoofHeight":[0,6.823266113240277],"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.034605844072436,"rightUnfilledHeight":4.034605844072436,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"normal":[0,0,1],"leftJoints":["7xigJB2WiCCrREDc2Ja3YN"],"lz":6,"selected":false,"ly":0.1,"cz":3.5644394786617815,"id":"4Q8KDQDxyuamkEtRJU3paR","rotation":[0,0,0],"cy":0.25713866261073326,"rightJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"leftPoint":[0.5366164679795284,-1.3056732562116498,1.5],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","textureType":"Wall Texture #10","cx":0.5366164679795284,"showLabel":false,"leftRoofHeight":6,"foundationId":"8fpWrU7qVyVgipB7LtABom","relativeAngle":1.5707963267948966,"windows":[],"rightRoofHeight":6,"type":"Wall","parentId":"8fpWrU7qVyVgipB7LtABom","rightPoint":[0.5366164679795289,1.8199505814331163,1.5],"lx":3.125623837644766,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.299511925163531,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightJoints":["7xigJB2WiCCrREDc2Ja3YN"],"parentId":"8fpWrU7qVyVgipB7LtABom","showLabel":false,"leftRoofHeight":6,"selected":false,"id":"1ATAe6P2KAHKLDSDfpVro9","leftJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"textureType":"Wall Texture #10","cx":-0.6055518811385436,"rightPoint":[-0.6055518811385436,-1.3056732562116498,1.5],"lz":6,"relativeAngle":-1.5707963267948966,"normal":[0,0,1],"type":"Wall","cz":3.660138480027889,"rotation":[0,0,0],"leftPoint":[-0.6055518811385436,1.8199505814331163,1.5],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","foundationId":"8fpWrU7qVyVgipB7LtABom","lx":3.125623837644766,"cy":0.25713866261073326,"windows":[],"ly":0.1,"rightRoofHeight":6,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6,"rightUnfilledHeight":4.0310074855252225,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"ly":0,"cx":0,"type":"Roof","thickness":0.1,"ridgeLeftPoint":[0.022465454047944533,1],"textureType":"Roof Texture #7","showLabel":false,"lz":0,"normal":[0,0,1],"ridgeRightPoint":[-0.022465454047944533,1],"wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"selected":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0,"roofType":"Gable","id":"nbw17kYeUHp1aouuScuF3Y","parentId":"m7AH7DcnoGzAq9kryBy4RS","cz":0,"rotation":[0,0,0],"lx":0,"color":"#666666","locked":true,"rise":2.7886384076788957,"ceiling":true},{"rightPoint":[0.5366164679795284,-1.3056732562116498,1.5],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","selected":false,"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"cx":-0.03446770657950715,"ly":0.1,"relativeAngle":0,"cz":3.535805069111796,"rightJoints":["4Q8KDQDxyuamkEtRJU3paR"],"leftRoofHeight":6,"rightRoofHeight":6,"id":"7xigJB2WiCCrREDc2Ja3YN","normal":[0,0,1],"leftPoint":[-0.6055518811385436,-1.3056732562116498,1.5],"type":"Wall","cy":-1.3056732562116498,"leftJoints":["1ATAe6P2KAHKLDSDfpVro9"],"lz":6,"windows":[],"showLabel":false,"textureType":"Wall Texture #10","lx":1.1421683491180719,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","centerRoofHeight":[0,6.823266113240277],"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.9620846370965292,"rightUnfilledHeight":3.9620846370965292,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"normal":[0,0,1],"rotation":[0,0,0],"lz":1.5,"cz":0.75,"solarPowerTower":{},"parentId":"Ground","ly":2.3229214459557985,"lx":3.6868215598526417,"cx":6.212507460282481,"solarUpdraftTower":{},"cy":0.2598608554811861,"solarAbsorberPipe":{},"id":"3KgcTmNBqtYJcCny8HxQyQ","type":"Foundation","selected":false,"color":"#999999","locked":true,"notBuilding":true},{"id":"5eUwuiBwfGoNEpcHG5kHqK","lx":1.5,"leftJoints":["h8DQWwUSgNc283RWhcM3B1"],"rightPoint":[-0.5114783908278628,0.8698262658360515,0.1],"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftPoint":[0.9885216091721372,0.8698262658360515,0.1],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","textureType":"Wall Texture #3","cz":0,"cx":0.23852160917213716,"selected":false,"rotation":[0,0,0],"windows":[],"normal":[0,0,1],"ly":0.2,"lz":7.729424429660076,"showLabel":false,"cy":0.8698262658360515,"rightJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"type":"Wall","relativeAngle":3.141592653589793,"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.729424429660076,"rightTopPartialHeight":7.729424429660076},{"type":"Wall","leftPoint":[-0.5114783908278628,0.8698262658360515,0.1],"rotation":[0,0,0],"cy":0.1198262658360515,"lz":7.729424429660076,"textureType":"Wall Texture #3","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","ly":0.2,"rightJoints":["qQNV4qND1aDjEtJsd6HVio"],"lx":1.4999999999999998,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","windows":[],"selected":false,"leftJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"showLabel":false,"id":"hbU2xUbmKEDDXYDMWnjjCc","relativeAngle":4.71238898038469,"rightPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"normal":[0,0,1],"cz":0,"cx":-0.5114783908278628,"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.729424429660076,"rightTopPartialHeight":7.729424429660076},{"leftPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"cy":-0.6301737341639485,"rightJoints":["h8DQWwUSgNc283RWhcM3B1"],"rightPoint":[0.9885216091721372,-0.6301737341639485,0.1],"cz":0,"windows":[],"lz":7.729424429660076,"selected":false,"rotation":[0,0,0],"ly":0.2,"relativeAngle":0,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","normal":[0,0,1],"leftJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"textureType":"Wall Texture #3","parentId":"3KgcTmNBqtYJcCny8HxQyQ","lx":1.5,"showLabel":false,"cx":0.23852160917213716,"type":"Wall","id":"qQNV4qND1aDjEtJsd6HVio","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.729424429660076,"rightTopPartialHeight":7.729424429660076},{"id":"h8DQWwUSgNc283RWhcM3B1","type":"Wall","relativeAngle":1.5707963267948966,"normal":[0,0,1],"windows":[],"leftPoint":[0.9885216091721372,-0.6301737341639485,0.1],"cz":0,"rightJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"selected":false,"textureType":"Wall Texture #3","ly":0.2,"cx":0.9885216091721372,"lx":1.5,"cy":0.1198262658360515,"rightPoint":[0.9885216091721372,0.8698262658360515,0.1],"showLabel":false,"lz":7.729424429660076,"rotation":[0,0,0],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftJoints":["qQNV4qND1aDjEtJsd6HVio"],"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.729424429660076,"rightTopPartialHeight":7.729424429660076},{"type":"Window","showLabel":false,"ly":0.3,"lz":0.44384979425833565,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#4d4d4d","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.09751468078404088,"selected":false,"cx":-0.375,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#4d4d4d","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.09751468078404088,"normal":[0,0,1],"cx":-0.20833333333333334,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.20833333333333334,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#4d4d4d","cz":-0.09751468078404088,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0.3,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.375,"cy":0.1,"cz":-0.09751468078404088,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#4d4d4d","selected":false,"ly":0.3,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"lz":0.3942112571821837,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#4d4d4d","lx":0.13333333333333333,"cx":0.3333333333333333,"cz":-0.0726954122459649,"ly":0.3,"showLabel":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0.3,"selected":false,"type":"Window","foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0.1,"cz":0.7732940589008983,"id":"9k4wgdGyyHM5BC1r2nJbQH","lx":0.13333333333333333,"color":"#4d4d4d","lz":0.3942112571821837,"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","rotation":[0,0,0],"cx":0.01333333333333333,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.3333333333333333,"rotation":[0,0,0],"type":"Window","lz":0.3942112571821837,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":-0.0726954122459649,"lx":0.13333333333333333,"color":"#4d4d4d","cy":0.1,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.18779489182743653,"lx":0.16666666666666666,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #5","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"huHgxbUk5nxatnYiuq2HhR","locked":true,"doorType":"Default","archHeight":1,"filled":true,"frameColor":"#4d4d4d"},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Roof Texture #7","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"7MxSmgNk4kQf8eNqmnwjMJ","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":true,"rise":0.823266113240277,"ceiling":false},{"type":"Window","cx":-9.720309842961575e-17,"cy":0.1,"cz":0.3833333333333333,"lx":0.700422140587,"ly":0.3,"lz":0.26666666666666666,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7xigJB2WiCCrREDc2Ja3YN","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"bKSng9YxxhEwLmca6q52t4","shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.18779489182743653,"lx":0.13333333333333333,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #4","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"eBQam4YYdXWFEi5iDbVQ4t","locked":true,"doorType":"Default","archHeight":1,"filled":true,"frameColor":"#4d4d4d"},{"type":"Human","name":"Julia","cx":-4.0546196737223905,"cy":-5.207889624542965,"cz":0.75,"lx":0.43,"lz":1.71,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"havSSZEB6mAoQ1s57LQVxN","selected":false,"ly":0.43,"locked":true},{"type":"Human","name":"Jeanette","cx":0.2766717538290546,"cy":-0.6581153273582476,"cz":0.21150016667646382,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cv6ws4fhTJwK38XNPpn7tw","id":"fPgwwBmXz2LWV9vPRMmqzu","selected":false,"ly":0.4,"locked":true,"flip":true},{"type":"Wall","cx":-0.006181075141490355,"cy":1.8156223325109586,"cz":3.903941909848086,"lx":1.1421683491180719,"ly":0.1,"lz":6,"leftJoints":["t6JjtmZmPqJRVZKJkbyzJi"],"rightJoints":["qnrZVcXW7sGmWiL5DxCcpP"],"leftPoint":[0.5649030994175456,1.8156223325109586,0],"rightPoint":[-0.5772652497005263,1.8156223325109586,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"34NjUPzx48JorZ5wqGUvgg","parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","studWidth":0.1,"roofId":"6XqoQpBQebVdBqY1vwaPk1","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.823266113240277],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.090518331707904,"rightUnfilledHeight":4.090518331707904,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":0.5649030994175457,"cy":0.2528104136885755,"cz":3.5644394786617815,"lx":3.125623837644766,"ly":0.1,"lz":6,"leftJoints":["i4xUARQgNSf52ouooVSiS9"],"rightJoints":["34NjUPzx48JorZ5wqGUvgg"],"leftPoint":[0.5649030994175456,-1.3100015051338076,0],"rightPoint":[0.5649030994175459,1.8156223325109586,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"t6JjtmZmPqJRVZKJkbyzJi","parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","studWidth":0.1,"roofId":"6XqoQpBQebVdBqY1vwaPk1","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.028013889590567,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-0.5772652497005263,"cy":0.2528104136885755,"cz":3.660138480027889,"lx":3.125623837644766,"ly":0.1,"lz":6,"leftJoints":["34NjUPzx48JorZ5wqGUvgg"],"rightJoints":["i4xUARQgNSf52ouooVSiS9"],"leftPoint":[-0.5772652497005263,1.8156223325109586,0],"rightPoint":[-0.5772652497005263,-1.3100015051338076,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qnrZVcXW7sGmWiL5DxCcpP","parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","studWidth":0.1,"roofId":"6XqoQpBQebVdBqY1vwaPk1","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6,"rightUnfilledHeight":4.1364823542733955,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-0.006181075141490355,"cy":-1.3100015051338076,"cz":3.535805069111796,"lx":1.1421683491180719,"ly":0.1,"lz":6,"leftJoints":["qnrZVcXW7sGmWiL5DxCcpP"],"rightJoints":["t6JjtmZmPqJRVZKJkbyzJi"],"leftPoint":[-0.5772652497005263,-1.3100015051338076,0],"rightPoint":[0.5649030994175456,-1.3100015051338076,0],"relativeAngle":0,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"i4xUARQgNSf52ouooVSiS9","parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","studWidth":0.1,"roofId":"6XqoQpBQebVdBqY1vwaPk1","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.823266113240277],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.7865681839342544,"rightUnfilledHeight":3.7865681839342544,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-9.720309842961575e-17,"cy":0.1,"cz":0.3833333333333333,"lx":0.700422140587,"ly":0.3,"lz":0.26666666666666666,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"cwyjixUkvZfY5coPeNcNNJ","parentId":"i4xUARQgNSf52ouooVSiS9","foundationId":"av7Scm9oWip67CGVAb3HwH","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"id":"6XqoQpBQebVdBqY1vwaPk1","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","roofType":"Gable","textureType":"Roof Texture #7","thickness":0.1,"wallsId":["qnrZVcXW7sGmWiL5DxCcpP"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":true,"rise":0.823266113240277,"ceiling":false},{"type":"Foundation","cx":0.24223269105650805,"cy":-1.5680241530974817,"cz":0.75,"lx":1.6067507475074267,"ly":9.245625505173257,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"av7Scm9oWip67CGVAb3HwH","selected":false,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","cx":-0.6856567353991228,"cy":2.1936412961014904,"cz":3.903941909848086,"lx":1.1421683491180716,"ly":0.1,"lz":6,"leftJoints":["v49PfQ59VkByq57ohKX9uA"],"rightJoints":["eq4bXeL88bLi2xVeWkyogN"],"leftPoint":[-0.11457256084008716,2.1936412961014904,1.5],"rightPoint":[-1.2567409099581588,2.1936412961014904,1.5],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j2TVMgjH32U1V7YuWfrYce","parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","studWidth":0.1,"roofId":"o79bdk9md4xmEmamE9jZDk","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.823266113240277],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.114887562223342,"rightUnfilledHeight":4.114887562223342,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-0.11457256084008716,"cy":0.6308293772791074,"cz":3.5644394786617815,"lx":3.125623837644766,"ly":0.1,"lz":6,"leftJoints":["dofmNpVnoyUD6poUbEH92H"],"rightJoints":["j2TVMgjH32U1V7YuWfrYce"],"leftPoint":[-0.11457256084008716,-0.9319825415432756,1.5],"rightPoint":[-0.11457256084008716,2.1936412961014904,1.5],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"v49PfQ59VkByq57ohKX9uA","parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","studWidth":0.1,"roofId":"o79bdk9md4xmEmamE9jZDk","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.062467969251437,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-1.2567409099581588,"cy":0.6308293772791074,"cz":3.660138480027889,"lx":3.125623837644766,"ly":0.1,"lz":6,"leftJoints":["j2TVMgjH32U1V7YuWfrYce"],"rightJoints":["dofmNpVnoyUD6poUbEH92H"],"leftPoint":[-1.2567409099581588,2.1936412961014904,1.5],"rightPoint":[-1.2567409099581588,-0.9319825415432756,1.5],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eq4bXeL88bLi2xVeWkyogN","parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","studWidth":0.1,"roofId":"o79bdk9md4xmEmamE9jZDk","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6,"rightUnfilledHeight":4.049169946024193,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-0.6856567353991228,"cy":-0.9319825415432756,"cz":3.535805069111796,"lx":1.1421683491180716,"ly":0.1,"lz":6,"leftJoints":["eq4bXeL88bLi2xVeWkyogN"],"rightJoints":["v49PfQ59VkByq57ohKX9uA"],"leftPoint":[-1.2567409099581588,-0.9319825415432756,1.5],"rightPoint":[-0.11457256084008716,-0.9319825415432756,1.5],"relativeAngle":0,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dofmNpVnoyUD6poUbEH92H","parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","studWidth":0.1,"roofId":"o79bdk9md4xmEmamE9jZDk","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.823266113240277],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.9479613094983987,"rightUnfilledHeight":3.9479613094983987,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-9.720309842961575e-17,"cy":0.1,"cz":0.3833333333333333,"lx":0.700422140587,"ly":0.3,"lz":0.26666666666666666,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"3EDLJ75vzk99MpdxpHr4hh","parentId":"dofmNpVnoyUD6poUbEH92H","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"id":"o79bdk9md4xmEmamE9jZDk","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","roofType":"Gable","textureType":"Roof Texture #7","thickness":0.1,"wallsId":["eq4bXeL88bLi2xVeWkyogN"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":true,"rise":0.823266113240277,"ceiling":false},{"type":"Foundation","cx":5.151890032982978,"cy":-1.8906835088164353,"cz":0.75,"lx":2.7786220563926096,"ly":10.001663432354322,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jkuhEvcKWfSvDRMRBsqBXk","selected":false,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","cx":-0.0729406966879953,"cy":2.9131022913654188,"cz":0,"lx":8.077654819551407,"ly":0.3,"lz":4.0189625473598385,"leftJoints":["5qopMgXVhuWqLTTbgdg2C8"],"rightJoints":["tQatQTQ6mQZuwKjoqupSL4"],"leftPoint":[3.965886713087709,2.9131022913654188,0.1],"rightPoint":[-4.111768106463698,2.9131022913654188,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2QkXRbu2NTc1FDQpK7icS4","parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","studWidth":0.1,"roofId":"uvH1MqzefQ1iAsExpBtN4M","selected":false,"leftRoofHeight":4.0189625473598385,"rightRoofHeight":4.0189625473598385,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","cx":3.965886713087709,"cy":-0.1655182683590748,"cz":1.2992388529678256,"lx":6.157241119448987,"ly":0.3,"lz":4.0189625473598385,"leftJoints":["1ep2Qk4inm58Y7PxoRguRG"],"rightJoints":["2QkXRbu2NTc1FDQpK7icS4"],"leftPoint":[3.965886713087709,-3.2441388280835683,0.1],"rightPoint":[3.965886713087709,2.9131022913654188,0.1],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5qopMgXVhuWqLTTbgdg2C8","parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","studWidth":0.1,"roofId":"uvH1MqzefQ1iAsExpBtN4M","selected":false,"leftRoofHeight":4.0189625473598385,"rightRoofHeight":4.0189625473598385,"centerRoofHeight":[-0.022465454047944533,6.384556049599329],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","cx":-4.111768106463698,"cy":-0.1655182683590748,"cz":2.586710917765224,"lx":6.157241119448987,"ly":0.3,"lz":4.0189625473598385,"leftJoints":["2QkXRbu2NTc1FDQpK7icS4"],"rightJoints":["1ep2Qk4inm58Y7PxoRguRG"],"leftPoint":[-4.111768106463698,2.9131022913654188,0.1],"rightPoint":[-4.111768106463698,-3.2441388280835683,0.1],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tQatQTQ6mQZuwKjoqupSL4","parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","studWidth":0.1,"roofId":"uvH1MqzefQ1iAsExpBtN4M","selected":false,"leftRoofHeight":4.0189625473598385,"rightRoofHeight":4.0189625473598385,"centerRoofHeight":[0.022465454047944533,6.384556049599329],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","cx":-0.0729406966879953,"cy":-3.2441388280835683,"cz":2.4938633836176103,"lx":8.077654819551407,"ly":0.3,"lz":4.0189625473598385,"leftJoints":["tQatQTQ6mQZuwKjoqupSL4"],"rightJoints":["5qopMgXVhuWqLTTbgdg2C8"],"leftPoint":[-4.111768106463698,-3.2441388280835683,0.1],"rightPoint":[3.965886713087709,-3.2441388280835683,0.1],"relativeAngle":0,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1ep2Qk4inm58Y7PxoRguRG","parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","studWidth":0.1,"roofId":"uvH1MqzefQ1iAsExpBtN4M","selected":false,"leftRoofHeight":4.0189625473598385,"rightRoofHeight":4.0189625473598385,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"id":"uvH1MqzefQ1iAsExpBtN4M","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,0],"parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","roofType":"Gable","textureType":"Roof Texture #7","thickness":0.1,"wallsId":["1ep2Qk4inm58Y7PxoRguRG"],"ridgeLeftPoint":[0.022465454047944533,1],"ridgeRightPoint":[-0.022465454047944533,1],"selected":false,"locked":true,"rise":2.3655935022394905,"ceiling":false},{"type":"Foundation","cx":10.465737313188763,"cy":0.5916447850218542,"cz":0.05,"lx":10.00769643062065,"ly":8.714303918225442,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ifK63owceWoNBq3LMhjcHs","selected":false,"locked":true,"notBuilding":true},{"type":"Door","cx":0,"cy":0,"cz":-0.12558978365487306,"lx":0.7427898485433437,"ly":0,"lz":0.7488204326902539,"textureType":"Door Texture #9","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1ep2Qk4inm58Y7PxoRguRG","foundationId":"ifK63owceWoNBq3LMhjcHs","id":"eL15oTbziWLZJbMNpssTck","locked":true,"doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"6fPaBMTjYg9NPR7fFaHY6L","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.16546497475722394,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"mrb9waVHrsnfat2WgDHgMt","parentId":"2QkXRbu2NTc1FDQpK7icS4","foundationId":"ifK63owceWoNBq3LMhjcHs","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.26782910355972656,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"2H38SarX7MqKe9NrSJLU3c","parentId":"2QkXRbu2NTc1FDQpK7icS4","foundationId":"ifK63owceWoNBq3LMhjcHs","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03248208022392633,"cy":0.1,"cz":0.6842561898981983,"lx":0.1624104011196317,"ly":0.3,"lz":0.3732306490353806,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"i3Tn7iQFeRuNXmrH6GPDQq","parentId":"5qopMgXVhuWqLTTbgdg2C8","foundationId":"ifK63owceWoNBq3LMhjcHs","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Cuboid","cx":2.2577642180173108,"cy":-5.6453790558022865,"cz":0.1,"lx":3,"ly":1.3162306313801917,"lz":0.2,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"9Wze4XMmA39XWNbYe6ckwa","locked":true},{"type":"Cuboid","cx":2.2976038416189706,"cy":-5.4405702290503335,"cz":0.2,"lx":3,"ly":1.3162306313801917,"lz":0.4,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"cGSH1ASJyBhQtxEpSahrE8","selected":false,"locked":true},{"type":"Cuboid","cx":2.3365648968920367,"cy":-5.154286927831944,"cz":0.3,"lx":3,"ly":1.3162306313801917,"lz":0.6,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"cv6ws4fhTJwK38XNPpn7tw","selected":false,"locked":true},{"type":"Cuboid","cx":2.507062522396451,"cy":-4.8455157683194425,"cz":0.4,"lx":3,"ly":1.3162306313801917,"lz":0.8,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"ri6K8Qk4KK99vNANoaSiXZ","selected":false,"locked":true},{"type":"Cuboid","cx":2.4248821063155837,"cy":-4.531133253293998,"cz":0.5,"lx":3,"ly":1.3162306313801917,"lz":1,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"2Gn8chyesHppiqqGTQZT8a","selected":false,"locked":true},{"type":"Cuboid","cx":2.533917032120782,"cy":-4.195225691908959,"cz":0.6,"lx":3,"ly":1.3162306313801917,"lz":1.2,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"ehfdKqFJbYRYgEacHfcSrM","selected":false,"locked":true},{"type":"Wall","cx":0.0857963607111687,"cy":-0.2904374094354525,"cz":1.150915251216218,"lx":2.404566605355184,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-1.116486941966424,-0.2904374094354525,1.5],"rightPoint":[1.2880796633887615,-0.2904374094354525,1.5],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"4JmE6VzFyWnD6MemgeMrqW","parentId":"daUcFc6UnVMEpiH1CZh8Ax","foundationId":"daUcFc6UnVMEpiH1CZh8Ax","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"locked":true,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":5.066690845229112,"cy":-5.858628346969445,"cz":0.75,"lx":2.8024103470983674,"ly":0.5858813368700218,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"daUcFc6UnVMEpiH1CZh8Ax","selected":false,"locked":true},{"type":"Wall","cx":-0.010162937707880904,"cy":-0.27969729189333203,"cz":1.150915251216218,"lx":2.7842161072229072,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-1.4022709913193345,-0.27969729189333203,0],"rightPoint":[1.3819451159035727,-0.27969729189333203,0],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"vcvEWpSiXZ5AtQHJNQyqhY","parentId":"65TcBaUghe9ngQtPh9tufn","foundationId":"65TcBaUghe9ngQtPh9tufn","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":6.152095245348214,"cy":-4.760328635056652,"cz":0.75,"lx":2.915478093095909,"ly":0.7794205585653092,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"65TcBaUghe9ngQtPh9tufn","selected":false,"locked":true},{"type":"Wall","cx":-0.276566476107305,"cy":0.5996488777144623,"cz":1.150915251216218,"lx":11.731055226486902,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-6.142094089350756,0.5996488777144623,0],"rightPoint":[5.588961137136146,0.5996488777144623,0],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"k8e5KBsuGXsXGc26TdAWYM","parentId":"csYashxN5k4v6auFhKNgfA","foundationId":"csYashxN5k4v6auFhKNgfA","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":-7.493205467286131,"cy":-0.5191007727531233,"cz":0.75,"lx":12.992980587303297,"ly":1.782214080949399,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"csYashxN5k4v6auFhKNgfA","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":-0.22003149528798988,"cy":0.772395685760463,"cz":1.150915251216218,"lx":1.9858951415309851,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-1.2129790660534816,0.7723956857604638,1.5],"rightPoint":[0.7729160754775029,0.7723956857604621,1.5],"relativeAngle":-1.0062975645253129e-15,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"sY5yERTXjEfiYz5tbFrJmk","parentId":"kzThvJkRFm5Ya2iKooXQMF","foundationId":"kzThvJkRFm5Ya2iKooXQMF","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":4.743113555100415,"cy":-4.918499332768188,"cz":0.75,"lx":2.567636418672608,"ly":1.9347230107434228,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"kzThvJkRFm5Ya2iKooXQMF","selected":false,"locked":true},{"type":"Wall","cx":-0.059861706164943095,"cy":0.5378886591540968,"cz":1.150915251216218,"lx":1.9858951415309851,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-1.0528092769304358,0.5378886591540978,1.5],"rightPoint":[0.9330858646005495,0.5378886591540958,1.5],"relativeAngle":-1.0062975645253129e-15,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"8BecBzK2CPYixjaNncu9H5","parentId":"gwSpq2qFCkfhWVsvJnM5AE","foundationId":"gwSpq2qFCkfhWVsvJnM5AE","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":0.42575056512061704,"cy":-5.140654078880996,"cz":0.75,"lx":2.247296840426521,"ly":1.4657089575306883,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gwSpq2qFCkfhWVsvJnM5AE","selected":false,"locked":true},{"type":"Foundation","cx":-2.9112882100701762,"cy":-6.403418415150944,"cz":0.75,"lx":8.173695480475347,"ly":1.3650515213739076,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jWpuB3xMuZWn7633AcTjQQ","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":-0.02566265362821607,"cy":0.20995571674405689,"cz":1.150915251216218,"lx":7.716839583972954,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-3.884082445614693,0.20995571674405689,1.5],"rightPoint":[3.8327571383582604,0.20995571674405689,1.5],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"pSkQGB7bArPhyBetUXPGRv","parentId":"jWpuB3xMuZWn7633AcTjQQ","foundationId":"jWpuB3xMuZWn7633AcTjQQ","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Tree","name":"Maple","cx":17.67275693788636,"cy":1.4450419691745573,"cz":0,"lx":7.6312730174756584,"lz":11.401453020556955,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fvxLBBmjibSLAyfoLcbVjh","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-5.066992481792914,"cy":-7.730957758574714,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9CLZuQC6xH4DGcZvLruk4s","selected":false,"locked":true,"flip":true},{"type":"Flower","name":"Yellow Flower","cx":-3.066992481792914,"cy":-7.730957758574714,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"c6WoCyEbuQkywzSj8xtBF2","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-1.066992481792914,"cy":-7.730957758574714,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"2agGn2N16sYDjc7TtzRo77","selected":false,"locked":true,"flip":true},{"type":"Flower","name":"Yellow Flower","cx":-7.120054695086734,"cy":-7.839525295949519,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"817xHue6rUfnaS7Rb7KYEp","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":5.193738527580392,"cy":-7.522536559524424,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"gonFzZtq1wiiYeCU4hrBiQ","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","cx":4.348603816989412,"cy":-3.7966311920217564,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ifK63owceWoNBq3LMhjcHs","id":"3BJtmEHpbtqcXXRrfQPwwr","selected":false,"locked":true},{"type":"Tree","name":"Oak","cx":-10.77654007007384,"cy":-2.788234414080616,"cz":0,"lx":8.855861155358149,"lz":10.429490037118851,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qpT1N3VZfjdrNWS4GttCXC","selected":false,"locked":true},{"type":"Human","name":"Jess","cx":2.2752160006176823,"cy":-7.071591540443462,"cz":0,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"gqeggrZFS756iNyQUnbtUf","selected":false,"locked":true},{"type":"Human","name":"Jacob","cx":0.3503088352536956,"cy":-2.663378139781919,"cz":0.75,"lx":0.8,"ly":0.8,"lz":1.82,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","id":"gesRfpbEyibu8BUu8qDy6K","selected":false,"locked":true},{"type":"Tree","name":"Elm","cx":18.756466652215924,"cy":-2.7486876275390486,"cz":0,"lx":10.046562775206576,"lz":8.109426488433453,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"rAcrYXcgzcVotvfd1MPBUS","selected":false,"locked":true},{"type":"Human","name":"James","cx":8.507664798169325,"cy":-5.727708445895644,"cz":0,"lx":0.472,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"73Mqjiw5uA1adJ6VuCj1Hf","selected":false,"locked":true,"ly":0.472},{"type":"Window","cx":0,"cy":0.3,"cz":-0.4375948219942384,"lx":0.5999999999999999,"ly":0.2,"lz":0.09893520815024884,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#ffffff","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"hbU2xUbmKEDDXYDMWnjjCc","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","id":"uREiM8jYGDR4pHGhExSRue","locked":true},{"type":"Window","cx":4.705024136514664,"cy":-2.6459148350408155,"cz":5.1903908249340365,"lx":1.017838969182642,"ly":0.1,"lz":2.4409651392693985,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"awVnqCCaufqdGFN22hhzCh","polygonTop":[-0.004246287687605959,1.3860496223503058],"locked":true},{"type":"Window","cx":-3.539719570796281,"cy":-2.6129313680432986,"cz":5.216072446970213,"lx":1.0219090902157242,"ly":0.1,"lz":2.605748416583291,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"beXK9hhAUyaFYx6f7DgTpY","polygonTop":[-0.009615353578652338,1.2933689118390408],"locked":true},{"type":"Window","cx":0.46569240547031454,"cy":-2.6095553790950374,"cz":5.2187010630636665,"lx":1.0033772100904075,"ly":0.1,"lz":2.5243075624407934,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"1fevDj1GsBSq5dNg5cXjnX","polygonTop":[-0.0091530130675596,1.325340055666175],"locked":true}],"sceneRadius":30,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-1.2466960461719456,-2.0265671834489423,-0.000001924388015203177],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-1.2466960461719456,-2.027567560894961,150],"theme":"Mountain","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[15.555852980703822,-18.310792933314314,3.245069996575005],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":53.00068653280895,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#3a8569","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[3.1288754420913087,4.629680469479072,3.245069996575005],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},441:function(e){e.exports=JSON.parse('{"docid":"9jsoUmZjFa6HRMNbZRgLRS","time":"02/04/2023 12:38 pm","timestamp":1675532324876,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Santa Fe, NM, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":35.6869752,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-105.937799},"elements":[{"type":"Human","name":"Jack","cx":8.588979243554906,"cy":-11.560427912321174,"cz":0.041681792587043624,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"nxTJLHqZjgyqZrkQWWFYNc","selected":false,"ly":0.42},{"type":"Wall","cx":4.753050582030476,"cy":10.626899890630142,"cz":0,"lx":9.506101164060953,"ly":0.3,"lz":3,"leftJoints":["n33KXHECHwqKVeBnmXbdJd"],"rightJoints":["6eXPAWMW3HwxTSXj1rA53P"],"leftPoint":[9.506101164060953,10.626899890630142,0],"rightPoint":[0,10.626899890630142,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"a4Bg19CP2z1jtLJFY16BxW","parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","roofId":"7doUCjB7UiFLbUyVdhSHA4","selected":false,"leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":9.506101164060953,"cy":7.9701749179726065,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"leftJoints":["beJH9KRXtDcaa6m4RL93xX"],"rightJoints":["a4Bg19CP2z1jtLJFY16BxW"],"leftPoint":[9.506101164060953,5.313449945315071,0],"rightPoint":[9.506101164060953,10.626899890630142,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"n33KXHECHwqKVeBnmXbdJd","parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","roofId":"7doUCjB7UiFLbUyVdhSHA4","selected":false,"leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0,"cy":8.855749908858451,"cz":0,"lx":3.542299963543381,"ly":0.3,"lz":3,"leftJoints":["a4Bg19CP2z1jtLJFY16BxW"],"rightJoints":["4SGmtgxinTGHnoFQ6qdAaP"],"leftPoint":[0,10.626899890630142,0],"rightPoint":[0,7.084599927086761,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"6eXPAWMW3HwxTSXj1rA53P","parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","roofId":"7doUCjB7UiFLbUyVdhSHA4","selected":false,"leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-4.27774552382743,"cy":7.084599927086761,"cz":0,"lx":8.55549104765486,"ly":0.3,"lz":3,"leftJoints":["6eXPAWMW3HwxTSXj1rA53P"],"rightJoints":["6iedjZED9QspL73RvXyJ4d"],"leftPoint":[0,7.084599927086761,0],"rightPoint":[-8.55549104765486,7.084599927086761,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"4SGmtgxinTGHnoFQ6qdAaP","parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","roofId":"7doUCjB7UiFLbUyVdhSHA4","selected":false,"leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Foundation","cx":-0.9875375953656599,"cy":0.44615496717367314,"cz":0.05,"lx":40.39365311700692,"ly":26.5055971077695,"lz":0.08336358648077638,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7ZHXRj1w61cveRC3gvedyo","selected":false,"enableGroupMaster":true},{"type":"Wall","cx":-8.961026955741858,"cy":7.857997137758722,"cz":0,"lx":3.615158317694301,"ly":0.3,"lz":5,"leftJoints":["xuK1PJLtnxrY5qEw5Jrz2o"],"rightJoints":["hCvpR7Qt8oZW3kx27Ef8k6"],"leftPoint":[-7.1534477968947074,7.857997137758721,0],"rightPoint":[-10.768606114589009,7.857997137758723,0],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"uDQQEBasztVc5Fw2jHnuGP","parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","roofId":"7C84Wu1AsADHbFygjWBmQ9","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-7.197945741195914,"cy":10.175838580765596,"cz":0,"lx":4.636537079315653,"ly":0.3,"lz":5,"leftJoints":["vsD1vwp8qSW44JbcubZkXV"],"rightJoints":["uDQQEBasztVc5Fw2jHnuGP"],"leftPoint":[-7.242443685497121,12.493680023772473,0],"rightPoint":[-7.1534477968947074,7.857997137758721,0],"relativeAngle":-1.5516006743615667,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"xuK1PJLtnxrY5qEw5Jrz2o","parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","roofId":"7C84Wu1AsADHbFygjWBmQ9","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-10.768606114589009,"cy":5.3615068621475075,"cz":0,"lx":4.992980551222431,"ly":0.3,"lz":5,"leftJoints":["uDQQEBasztVc5Fw2jHnuGP"],"rightJoints":["uATyhCzseLrePeH6qe33SW"],"leftPoint":[-10.768606114589009,7.857997137758723,0],"rightPoint":[-10.768606114589009,2.865016586536292,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"hCvpR7Qt8oZW3kx27Ef8k6","parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","roofId":"7C84Wu1AsADHbFygjWBmQ9","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-8.961026955741858,"cy":2.865016586536292,"cz":0,"lx":3.615158317694301,"ly":0.3,"lz":5,"leftJoints":["hCvpR7Qt8oZW3kx27Ef8k6"],"rightJoints":["tqM54puNK2eFNMyoRHbgSP"],"leftPoint":[-10.768606114589009,2.865016586536292,0],"rightPoint":[-7.1534477968947074,2.865016586536292,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"uATyhCzseLrePeH6qe33SW","parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","roofId":"7C84Wu1AsADHbFygjWBmQ9","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Foundation","cx":-0.46263679223863563,"cy":1.9526278259940124,"cz":0.05,"lx":26.17077502865179,"ly":28.364342258415146,"lz":0.08336358648077638,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"g8MxeMM8L2RM1xR4mKCqRr","selected":false,"enableGroupMaster":false},{"type":"Wall","cx":-8.55549104765486,"cy":8.41296241341553,"cz":0,"lx":2.6567249726575364,"ly":0.3,"lz":3,"relativeAngle":1.5707963267948966,"leftPoint":[-8.55549104765486,7.084599927086761,0],"rightPoint":[-8.55549104765486,9.741324899744297,0],"leftJoints":["4SGmtgxinTGHnoFQ6qdAaP"],"rightJoints":["hDtjiJL8L1n4uHmeabkB4U"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"6iedjZED9QspL73RvXyJ4d","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-12.35793151327924,"cy":9.741324899744297,"cz":0,"lx":7.604880931248763,"ly":0.3,"lz":3,"relativeAngle":3.141592653589793,"leftPoint":[-8.55549104765486,9.741324899744297,0],"rightPoint":[-16.160371978903623,9.741324899744297,0],"leftJoints":["6iedjZED9QspL73RvXyJ4d"],"rightJoints":["e6DZMEDS2hLL8irgctx6vS"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"hDtjiJL8L1n4uHmeabkB4U","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-16.160371978903623,"cy":7.527387422529684,"cz":0,"lx":4.427874954429226,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[-16.160371978903623,9.741324899744297,0],"rightPoint":[-16.160371978903623,5.313449945315071,0],"leftJoints":["hDtjiJL8L1n4uHmeabkB4U"],"rightJoints":["7s9AjDXhyZFDC86cd8GCyQ"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"e6DZMEDS2hLL8irgctx6vS","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-17.586287153512764,"cy":5.313449945315071,"cz":0,"lx":2.8518303492182824,"ly":0.3,"lz":3,"relativeAngle":3.141592653589793,"leftPoint":[-16.160371978903623,5.313449945315071,0],"rightPoint":[-19.012202328121905,5.313449945315071,0],"leftJoints":["e6DZMEDS2hLL8irgctx6vS"],"rightJoints":["a5EWedAAgHioHmzEA7mZco"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"7s9AjDXhyZFDC86cd8GCyQ","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-19.012202328121905,"cy":0.4427874954429223,"cz":0,"lx":9.741324899744297,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[-19.012202328121905,5.313449945315071,0],"rightPoint":[-19.012202328121905,-4.427874954429226,0],"leftJoints":["7s9AjDXhyZFDC86cd8GCyQ"],"rightJoints":["qL7VdZTbY3pmPL7NfVed4R"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"a5EWedAAgHioHmzEA7mZco","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-16.160371978903623,"cy":-4.427874954429226,"cz":0,"lx":5.7036606984365665,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[-19.012202328121905,-4.427874954429226,0],"rightPoint":[-13.308541629685338,-4.427874954429226,0],"leftJoints":["a5EWedAAgHioHmzEA7mZco"],"rightJoints":["fn57GZtoH28juoAimKo6sD"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"qL7VdZTbY3pmPL7NfVed4R","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-13.308541629685338,"cy":-7.084599927086762,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[-13.308541629685338,-4.427874954429226,0],"rightPoint":[-13.308541629685338,-9.741324899744297,0],"leftJoints":["qL7VdZTbY3pmPL7NfVed4R"],"rightJoints":["9SBa3hK2RVhjPz2Nqh1iCG"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"fn57GZtoH28juoAimKo6sD","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-9.030796105857908,"cy":-9.741324899744297,"cz":0,"lx":8.555491047654861,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[-13.308541629685338,-9.741324899744297,0],"rightPoint":[-4.753050582030476,-9.741324899744297,0],"leftJoints":["fn57GZtoH28juoAimKo6sD"],"rightJoints":["iYnhW4g6qEKdNus5mK9fsA"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"9SBa3hK2RVhjPz2Nqh1iCG","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-4.753050582030476,"cy":-7.084599927086762,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"relativeAngle":1.5707963267948966,"leftPoint":[-4.753050582030476,-9.741324899744297,0],"rightPoint":[-4.753050582030476,-4.427874954429226,0],"leftJoints":["9SBa3hK2RVhjPz2Nqh1iCG"],"rightJoints":["6pHr36CrawF8YcpXm7jL2B"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"iYnhW4g6qEKdNus5mK9fsA","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-0.4753050582030476,"cy":-4.427874954429226,"cz":0,"lx":8.555491047654858,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[-4.753050582030476,-4.427874954429226,0],"rightPoint":[3.802440465624381,-4.427874954429226,0],"leftJoints":["iYnhW4g6qEKdNus5mK9fsA"],"rightJoints":["danskvNGt22kxxX25ZKZed"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"6pHr36CrawF8YcpXm7jL2B","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":3.802440465624381,"cy":-7.084599927086762,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[3.802440465624381,-4.427874954429226,0],"rightPoint":[3.802440465624381,-9.741324899744297,0],"leftJoints":["6pHr36CrawF8YcpXm7jL2B"],"rightJoints":["wg6dFewM89iG6naCdP3n3V"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"danskvNGt22kxxX25ZKZed","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":8.55549104765486,"cy":-9.741324899744297,"cz":0,"lx":9.506101164060958,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[3.802440465624381,-9.741324899744297,0],"rightPoint":[13.308541629685338,-9.741324899744297,0],"leftJoints":["danskvNGt22kxxX25ZKZed"],"rightJoints":["rpaC6fdHvBmen4T9c95DSG"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"wg6dFewM89iG6naCdP3n3V","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":13.308541629685338,"cy":-7.084599927086762,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"relativeAngle":1.5707963267948966,"leftPoint":[13.308541629685338,-9.741324899744297,0],"rightPoint":[13.308541629685338,-4.427874954429226,0],"leftJoints":["wg6dFewM89iG6naCdP3n3V"],"rightJoints":["pHPE8SbRWTKrpBzChi8YzX"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"rpaC6fdHvBmen4T9c95DSG","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":15.685066920700574,"cy":-4.427874954429226,"cz":0,"lx":4.753050582030474,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[13.308541629685338,-4.427874954429226,0],"rightPoint":[18.061592211715812,-4.427874954429226,0],"leftJoints":["rpaC6fdHvBmen4T9c95DSG"],"rightJoints":["hoTvGY2rqMy7seoYfMRRTd"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"pHPE8SbRWTKrpBzChi8YzX","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":18.061592211715812,"cy":2.6567249726575355,"cz":0,"lx":14.169199854173524,"ly":0.3,"lz":3,"relativeAngle":1.5707963267948966,"leftPoint":[18.061592211715812,-4.427874954429226,0],"rightPoint":[18.061592211715812,9.741324899744297,0],"leftJoints":["pHPE8SbRWTKrpBzChi8YzX"],"rightJoints":["j5t6bBkxWAT3r9CjT4GP8B"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"hoTvGY2rqMy7seoYfMRRTd","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":15.685066920700574,"cy":9.741324899744297,"cz":0,"lx":4.753050582030474,"ly":0.3,"lz":3,"relativeAngle":3.141592653589793,"leftPoint":[18.061592211715812,9.741324899744297,0],"rightPoint":[13.308541629685338,9.741324899744297,0],"leftJoints":["hoTvGY2rqMy7seoYfMRRTd"],"rightJoints":["9M2paYYKiDyFzdP7AKGC3T"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"j5t6bBkxWAT3r9CjT4GP8B","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":13.308541629685338,"cy":7.527387422529684,"cz":0,"lx":4.427874954429226,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[13.308541629685338,9.741324899744297,0],"rightPoint":[13.308541629685338,5.313449945315071,0],"leftJoints":["j5t6bBkxWAT3r9CjT4GP8B"],"rightJoints":["beJH9KRXtDcaa6m4RL93xX"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"9M2paYYKiDyFzdP7AKGC3T","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":11.407321396873146,"cy":5.313449945315071,"cz":0,"lx":3.802440465624386,"ly":0.3,"lz":3,"relativeAngle":3.141592653589793,"leftPoint":[13.308541629685338,5.313449945315071,0],"rightPoint":[9.506101164060953,5.313449945315071,0],"leftJoints":["9M2paYYKiDyFzdP7AKGC3T"],"rightJoints":["n33KXHECHwqKVeBnmXbdJd"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"beJH9KRXtDcaa6m4RL93xX","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["danskvNGt22kxxX25ZKZed","wg6dFewM89iG6naCdP3n3V","rpaC6fdHvBmen4T9c95DSG","pHPE8SbRWTKrpBzChi8YzX","hoTvGY2rqMy7seoYfMRRTd","j5t6bBkxWAT3r9CjT4GP8B","9M2paYYKiDyFzdP7AKGC3T","beJH9KRXtDcaa6m4RL93xX","n33KXHECHwqKVeBnmXbdJd","a4Bg19CP2z1jtLJFY16BxW","6eXPAWMW3HwxTSXj1rA53P","4SGmtgxinTGHnoFQ6qdAaP","6iedjZED9QspL73RvXyJ4d","hDtjiJL8L1n4uHmeabkB4U","e6DZMEDS2hLL8irgctx6vS","7s9AjDXhyZFDC86cd8GCyQ","a5EWedAAgHioHmzEA7mZco","qL7VdZTbY3pmPL7NfVed4R","fn57GZtoH28juoAimKo6sD","9SBa3hK2RVhjPz2Nqh1iCG","iYnhW4g6qEKdNus5mK9fsA","6pHr36CrawF8YcpXm7jL2B"],"textureType":"No Roof Texture","color":"#df9b6c","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"7doUCjB7UiFLbUyVdhSHA4","sideColor":"#df9b6c","rise":0,"ceiling":false},{"type":"Wall","cx":-7.1534477968947074,"cy":-0.13077174419716386,"cz":0,"lx":5.991576661466917,"ly":0.3,"lz":5,"relativeAngle":-1.5707963267948966,"leftPoint":[-7.1534477968947074,2.8650165865362944,0],"rightPoint":[-7.1534477968947074,-3.126560074930622,0],"leftJoints":["uATyhCzseLrePeH6qe33SW"],"rightJoints":["7vyLAK1d3g1q4PaUuuH3M8"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"tqM54puNK2eFNMyoRHbgSP","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-4.143736556044865,"cy":12.493680023772473,"cz":0,"lx":6.197414258904514,"ly":0.3,"lz":5,"relativeAngle":3.141592653589793,"leftPoint":[-1.0450294265926074,12.493680023772473,0],"rightPoint":[-7.242443685497122,12.493680023772473,0],"leftJoints":["qEF7XtXZnzW6BxWMfbdwQU"],"rightJoints":["xuK1PJLtnxrY5qEw5Jrz2o"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"vsD1vwp8qSW44JbcubZkXV","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-1.0450294265926074,"cy":10.746136830844623,"cz":0,"lx":3.4950863858557017,"ly":0.3,"lz":5,"relativeAngle":1.5707963267948966,"leftPoint":[-1.0450294265926074,8.998593637916771,0],"rightPoint":[-1.0450294265926074,12.493680023772473,0],"leftJoints":["dYJeyws9qM6CyNBpAFDT4C"],"rightJoints":["vsD1vwp8qSW44JbcubZkXV"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"qEF7XtXZnzW6BxWMfbdwQU","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":1.537226514617607,"cy":8.998593637916771,"cz":0,"lx":5.164511882420429,"ly":0.3,"lz":5,"relativeAngle":3.141592653589793,"leftPoint":[4.119482455827821,8.998593637916771,0],"rightPoint":[-1.0450294265926074,8.998593637916771,0],"leftJoints":["xnWNtThasHmB5nj7DTLwTx"],"rightJoints":["qEF7XtXZnzW6BxWMfbdwQU"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"dYJeyws9qM6CyNBpAFDT4C","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":4.163980400129028,"cy":6.930401222471017,"cz":0,"lx":4.137342110270493,"ly":0.3,"lz":5,"relativeAngle":1.5923083871193127,"leftPoint":[4.208478344430235,4.862208807025264,0],"rightPoint":[4.119482455827821,8.998593637916771,0],"leftJoints":["e1bkiT8KZb5kq2EZtd6xkx"],"rightJoints":["dYJeyws9qM6CyNBpAFDT4C"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"xnWNtThasHmB5nj7DTLwTx","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":7.565411068003514,"cy":4.862208807025264,"cz":0,"lx":6.713865447146558,"ly":0.3,"lz":5,"relativeAngle":3.141592653589793,"leftPoint":[10.922343791576793,4.862208807025264,0],"rightPoint":[4.208478344430235,4.862208807025264,0],"leftJoints":["rBwg9zRDQVA6MAAvxTQwmb"],"rightJoints":["xnWNtThasHmB5nj7DTLwTx"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"e1bkiT8KZb5kq2EZtd6xkx","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":10.922343791576793,"cy":1.8664204762918066,"cz":0,"lx":5.991576661466915,"ly":0.3,"lz":5,"relativeAngle":1.5707963267948966,"leftPoint":[10.922343791576793,-1.1293678544416508,0],"rightPoint":[10.922343791576793,4.862208807025264,0],"leftJoints":["aEZwzvFgCTEAmsGj6SSh6G"],"rightJoints":["e1bkiT8KZb5kq2EZtd6xkx"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"rBwg9zRDQVA6MAAvxTQwmb","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":5.499606315035343,"cy":-1.1293678544416508,"cz":0,"lx":10.8454749530829,"ly":0.3,"lz":5,"relativeAngle":0,"leftPoint":[0.07686883849389224,-1.1293678544416508,0],"rightPoint":[10.922343791576793,-1.1293678544416508,0],"leftJoints":["jFwtQp4MdbPXqJBW5eWb7h"],"rightJoints":["rBwg9zRDQVA6MAAvxTQwmb"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"aEZwzvFgCTEAmsGj6SSh6G","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":0.07686883849389224,"cy":-2.1279639646861366,"cz":0,"lx":1.9971922204889714,"ly":0.3,"lz":5,"relativeAngle":1.5707963267948966,"leftPoint":[0.07686883849389224,-3.126560074930622,0],"rightPoint":[0.07686883849389224,-1.1293678544416508,0],"leftJoints":["7vyLAK1d3g1q4PaUuuH3M8"],"rightJoints":["aEZwzvFgCTEAmsGj6SSh6G"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"jFwtQp4MdbPXqJBW5eWb7h","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-3.5382894792004076,"cy":-3.126560074930622,"cz":0,"lx":7.2303166353886,"ly":0.3,"lz":5,"relativeAngle":0,"leftPoint":[-7.1534477968947074,-3.126560074930622,0],"rightPoint":[0.07686883849389224,-3.126560074930622,0],"leftJoints":["tqM54puNK2eFNMyoRHbgSP"],"rightJoints":["jFwtQp4MdbPXqJBW5eWb7h"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"7vyLAK1d3g1q4PaUuuH3M8","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["rBwg9zRDQVA6MAAvxTQwmb","e1bkiT8KZb5kq2EZtd6xkx","xnWNtThasHmB5nj7DTLwTx","dYJeyws9qM6CyNBpAFDT4C","qEF7XtXZnzW6BxWMfbdwQU","vsD1vwp8qSW44JbcubZkXV","xuK1PJLtnxrY5qEw5Jrz2o","uDQQEBasztVc5Fw2jHnuGP","hCvpR7Qt8oZW3kx27Ef8k6","uATyhCzseLrePeH6qe33SW","tqM54puNK2eFNMyoRHbgSP","7vyLAK1d3g1q4PaUuuH3M8","jFwtQp4MdbPXqJBW5eWb7h","aEZwzvFgCTEAmsGj6SSh6G"],"textureType":"No Roof Texture","color":"#df9b6c","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"7C84Wu1AsADHbFygjWBmQ9","sideColor":"#df9b6c","rise":0,"ceiling":false},{"type":"Wall","cx":-4.345096487504885,"cy":5.984852164118302,"cz":0,"lx":4,"ly":0.3,"lz":7,"leftJoints":["rHJy1GYK2qvXJVNLZqp4wD"],"rightJoints":["nps5Vjk1xXh8tbJUyypnno"],"leftPoint":[-2.345096487504885,5.984852164118302,0.08336358648077638],"rightPoint":[-6.345096487504885,5.984852164118302,0.08336358648077638],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"a7asXFjrAC6qt3AiY1YGsD","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":-4.345096487504885,"cy":-0.015147835881696992,"cz":0,"lx":4,"ly":0.3,"lz":7,"leftJoints":["nps5Vjk1xXh8tbJUyypnno"],"rightJoints":["xkqwYwVjduojn9HfSnXbKM"],"leftPoint":[-6.345096487504885,-0.015147835881696992,0.08336358648077638],"rightPoint":[-2.345096487504885,-0.015147835881696992,0.08336358648077638],"relativeAngle":0,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"cpDb3yAZ18RsXbHAuAXABX","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":-2.345096487504885,"cy":-2.765147835881696,"cz":0,"lx":5.500000000000002,"ly":0.3,"lz":7,"leftJoints":["cpDb3yAZ18RsXbHAuAXABX"],"rightJoints":["hzXfdodMPgDwURK77F9MeV"],"leftPoint":[-2.345096487504885,-0.015147835881695215,0.08336358648077638],"rightPoint":[-2.345096487504885,-5.515147835881697,0.08336358648077638],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"xkqwYwVjduojn9HfSnXbKM","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":-2.345096487504885,"cy":7.984852164118302,"cz":0,"lx":4,"ly":0.3,"lz":7,"leftJoints":["r2R5PZ9UN3GkeiaDktnAeY"],"rightJoints":["a7asXFjrAC6qt3AiY1YGsD"],"leftPoint":[-2.345096487504885,9.984852164118301,0.08336358648077638],"rightPoint":[-2.345096487504885,5.984852164118302,0.08336358648077638],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"rHJy1GYK2qvXJVNLZqp4wD","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":2.654903512495115,"cy":7.984852164118302,"cz":0,"lx":4,"ly":0.3,"lz":7,"leftJoints":["67wPdhvoUHXR7PuJh6jwmB"],"rightJoints":["r2R5PZ9UN3GkeiaDktnAeY"],"leftPoint":[2.654903512495115,5.984852164118302,0.08336358648077638],"rightPoint":[2.654903512495115,9.984852164118301,0.08336358648077638],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"658TiH6xarPxo2CoZwhF5b","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":6.654903512495115,"cy":5.984852164118302,"cz":0,"lx":8,"ly":0.3,"lz":7,"leftJoints":["41c9AtTSXggfJV4XdiEcAE"],"rightJoints":["658TiH6xarPxo2CoZwhF5b"],"leftPoint":[10.654903512495114,5.984852164118302,0.08336358648077638],"rightPoint":[2.654903512495115,5.984852164118306,0.08336358648077638],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"67wPdhvoUHXR7PuJh6jwmB","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":10.654903512495114,"cy":2.984852164118302,"cz":0,"lx":6,"ly":0.3,"lz":7,"leftJoints":["5oTqiHKufLbh4Es8MKzkGe"],"rightJoints":["67wPdhvoUHXR7PuJh6jwmB"],"leftPoint":[10.654903512495114,-0.015147835881696103,0.08336358648077638],"rightPoint":[10.654903512495114,5.984852164118302,0.08336358648077638],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"41c9AtTSXggfJV4XdiEcAE","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":6.904903512495115,"cy":-0.015147835881696992,"cz":0,"lx":7.5,"ly":0.3,"lz":7,"leftJoints":["f8PnD7wEXwH2ygFbDasoV3"],"rightJoints":["41c9AtTSXggfJV4XdiEcAE"],"leftPoint":[3.154903512495115,-0.015147835881696992,0.08336358648077638],"rightPoint":[10.654903512495114,-0.015147835881696992,0.08336358648077638],"relativeAngle":0,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"5oTqiHKufLbh4Es8MKzkGe","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":3.154903512495115,"cy":-2.765147835881697,"cz":0,"lx":5.5,"ly":0.3,"lz":7,"leftJoints":["hzXfdodMPgDwURK77F9MeV"],"rightJoints":["5oTqiHKufLbh4Es8MKzkGe"],"leftPoint":[3.154903512495115,-5.515147835881696,0.08336358648077638],"rightPoint":[3.154903512495115,-0.015147835881696992,0.08336358648077638],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"f8PnD7wEXwH2ygFbDasoV3","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":0.4049035124951148,"cy":-5.515147835881698,"cz":0,"lx":5.5,"ly":0.3,"lz":7,"leftJoints":["xkqwYwVjduojn9HfSnXbKM"],"rightJoints":["f8PnD7wEXwH2ygFbDasoV3"],"leftPoint":[-2.345096487504885,-5.515147835881698,0.08336358648077638],"rightPoint":[3.154903512495115,-5.515147835881697,0.08336358648077638],"relativeAngle":0,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"hzXfdodMPgDwURK77F9MeV","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Foundation","cx":2.433419492707406,"cy":5.124042977542905,"cz":0.05,"lx":23.540246238854113,"ly":24.334046586651752,"lz":0.08336358648077638,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dwSg9LvrTwKhMcJFZMtZSx","selected":false,"enableGroupMaster":false},{"type":"Wall","cx":-6.345096487504885,"cy":2.984852164118302,"cz":0,"lx":6,"ly":0.3,"lz":7,"leftJoints":["a7asXFjrAC6qt3AiY1YGsD"],"rightJoints":["cpDb3yAZ18RsXbHAuAXABX"],"leftPoint":[-6.345096487504885,5.984852164118302,0.08336358648077638],"rightPoint":[-6.345096487504885,-0.015147835881696992,0.08336358648077638],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"nps5Vjk1xXh8tbJUyypnno","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":0.1549035124951148,"cy":9.984852164118301,"cz":0,"lx":5,"ly":0.3,"lz":7,"leftJoints":["658TiH6xarPxo2CoZwhF5b"],"rightJoints":["rHJy1GYK2qvXJVNLZqp4wD"],"leftPoint":[2.654903512495115,9.984852164118301,0.08336358648077638],"rightPoint":[-2.345096487504885,9.984852164118301,0.08336358648077638],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"r2R5PZ9UN3GkeiaDktnAeY","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","selected":false,"roofId":"qpPuzrLkb9c5N87uABuvRn","leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["a7asXFjrAC6qt3AiY1YGsD","nps5Vjk1xXh8tbJUyypnno","cpDb3yAZ18RsXbHAuAXABX","xkqwYwVjduojn9HfSnXbKM","hzXfdodMPgDwURK77F9MeV","f8PnD7wEXwH2ygFbDasoV3","5oTqiHKufLbh4Es8MKzkGe","41c9AtTSXggfJV4XdiEcAE","67wPdhvoUHXR7PuJh6jwmB","658TiH6xarPxo2CoZwhF5b","r2R5PZ9UN3GkeiaDktnAeY","rHJy1GYK2qvXJVNLZqp4wD"],"textureType":"No Roof Texture","color":"#df9b6c","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"qpPuzrLkb9c5N87uABuvRn","sideColor":"#df9b6c","rise":0,"ceiling":false},{"type":"Door","cx":0.02629889958936659,"cy":0,"cz":-0.08333333333333333,"lx":0.2629889958936659,"ly":0,"lz":0.8333333333333334,"textureType":"Door Texture #7","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"wg6dFewM89iG6naCdP3n3V","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"eh8QYUJbECtJYcGAUmmcbF","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.34188569466176566,"cy":0.1,"cz":0.08333333333333333,"lx":0.05259779917873318,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"wg6dFewM89iG6naCdP3n3V","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"k4NKNGGqdN9XJAC7JngQKc","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.34188569466176566,"cy":0.1,"cz":0.08333333333333333,"lx":0.05259779917873318,"ly":0.3,"lz":0.5,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gndjHJZsJ4fAEbUPhoMN8f","parentId":"wg6dFewM89iG6naCdP3n3V","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15779339753619967,"cy":0.1,"cz":-3.700743415417188e-17,"lx":0.10519559835746636,"ly":0.3,"lz":0.6666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pHPE8SbRWTKrpBzChi8YzX","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"uLMRWieC9yGWXYyj2feHNa","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20745979403699807,"cy":0.1,"cz":0.3,"lx":0.04610217645266624,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"aEZwzvFgCTEAmsGj6SSh6G","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"7ptZfruK52YBWvj7ntVHnR","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.39186849984766303,"cy":0.1,"cz":0.3,"lx":0.04610217645266624,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"aEZwzvFgCTEAmsGj6SSh6G","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"bLbWhQE8kcWeWpvQFXbQ5a","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03333333333333333,"cy":0.1,"cz":0.14285714285714285,"lx":0.06666666666666667,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"5oTqiHKufLbh4Es8MKzkGe","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"9a7QJYQGFkQBwdFtnhaCnM","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3,"cy":0.1,"cz":0.14285714285714285,"lx":0.06666666666666667,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"5oTqiHKufLbh4Es8MKzkGe","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"vi8Yq5gBqJoW5tPeYhBH7B","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3803429557344965,"cy":0.1,"cz":0.3,"lx":0.06915326467899936,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7vyLAK1d3g1q4PaUuuH3M8","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"kizJtpXqJWR6KCL438E5YJ","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2272727272727271,"cy":0.1,"cz":0.07142857142857142,"lx":0.09090909090909062,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hzXfdodMPgDwURK77F9MeV","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"g2MyW88G8QaeW7ivhwR2tv","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jess","cx":4.690272477111533,"cy":13.3005830342772,"cz":0.03336358582743005,"lx":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","id":"nTe63y4NHf8RrpW2eucqBC","selected":false,"ly":0.43},{"type":"Window","cx":-0.3418856946617659,"cy":0.1,"cz":-0.08333333333333333,"lx":0.05259779917873321,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"a4Bg19CP2z1jtLJFY16BxW","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"qJGbm5uGmW4X697uskEVvs","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Door","cx":-0.13149449794683302,"cy":0,"cz":-0.08333333333333333,"lx":0.1577933975361996,"ly":0,"lz":0.8333333333333334,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"a4Bg19CP2z1jtLJFY16BxW","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"w281yvi8VG2acGPfsqs5DF","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0.07889669876809982,"cy":0.1,"cz":-0.08333333333333333,"lx":0.05259779917873321,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"a4Bg19CP2z1jtLJFY16BxW","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"mWxzJt7m7UWEJMmH3QHQEB","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3418856946617659,"cy":0.1,"cz":-0.08333333333333333,"lx":0.05259779917873321,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"a4Bg19CP2z1jtLJFY16BxW","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"7u2aKRK5YJxj5G4bJhfnuN","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.28237583077258077,"cy":0.1,"cz":-0.25,"lx":0.08067880879216593,"ly":0.3,"lz":0.3,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vsD1vwp8qSW44JbcubZkXV","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"kJNAK2vsWPzsnxXo8yU2jJ","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.28237583077258077,"cy":0.1,"cz":0.25,"lx":0.08067880879216593,"ly":0.3,"lz":0.3,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vsD1vwp8qSW44JbcubZkXV","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"3xBVGhYk5CECo9wX6WccRP","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.28237583077258077,"cy":0.1,"cz":0.25,"lx":0.08067880879216593,"ly":0.3,"lz":0.3,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vsD1vwp8qSW44JbcubZkXV","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"vLYAPPmtNdR8BBv2dwnaPC","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.28237583077258077,"cy":0.1,"cz":-0.25,"lx":0.08067880879216593,"ly":0.3,"lz":0.3,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vsD1vwp8qSW44JbcubZkXV","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"kx7Jk3snYCbpQRqNSTwx7i","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.33885099692709686,"cy":0.1,"cz":0.3,"lx":0.0968145705505991,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"dYJeyws9qM6CyNBpAFDT4C","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"hFnZkVdXVk7kt7HuJ5EXTA","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Door","cx":0.2904437116517973,"cy":0,"cz":-0.3,"lx":0.1936291411011982,"ly":0,"lz":0.4,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dYJeyws9qM6CyNBpAFDT4C","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"hXTygNgpyWv5Q8SdkdwrBN","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0.24203642637649775,"cy":0.1,"cz":0.3,"lx":0.0968145705505991,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"dYJeyws9qM6CyNBpAFDT4C","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"42F92bD3A47C9HfuQN7TKE","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.31558679507239956,"cy":0.1,"cz":0.24999999999999997,"lx":0.21039119671493278,"ly":0.3,"lz":0.1666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"j5t6bBkxWAT3r9CjT4GP8B","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"qxRE8qmG9xHbjtVsaCxYsE","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.29586262038037425,"cy":0.1,"cz":-0.08333333333333333,"lx":0.06574724897341651,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hDtjiJL8L1n4uHmeabkB4U","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"9sATuUB81PmwXpthc9oUjo","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29586262038037425,"cy":0.1,"cz":-0.08333333333333333,"lx":0.06574724897341651,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hDtjiJL8L1n4uHmeabkB4U","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"wmRa6rPywUr54Esr4Sk1n4","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15,"cy":0.1,"cz":0.35714285714285715,"lx":0.1,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"r2R5PZ9UN3GkeiaDktnAeY","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"akprzo3hHBejx7HCAVwmQ4","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.25,"cy":0.1,"cz":0.35714285714285715,"lx":0.1,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"r2R5PZ9UN3GkeiaDktnAeY","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"kHdEwJHqbM3B6pBPMdhSph","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.28125,"cy":0.1,"cz":0.35714285714285715,"lx":0.0625,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"67wPdhvoUHXR7PuJh6jwmB","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"gSzMdys25c7EFmVM4PPcqc","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.09375,"cy":0.1,"cz":0.35714285714285715,"lx":0.0625,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"67wPdhvoUHXR7PuJh6jwmB","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"osJn4P5UR44EiHtzsfapPV","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.33512735959822765,"cy":0.1,"cz":0.3,"lx":0.07447274657738392,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"e1bkiT8KZb5kq2EZtd6xkx","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"iYjDfcWBcotpYGf1tfdYtt","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.03723637328869196,"cy":0.1,"cz":0.3,"lx":0.07447274657738392,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"e1bkiT8KZb5kq2EZtd6xkx","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"1DVcZmp9unvFUD3kth4Ldt","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.33512735959822765,"cy":0.1,"cz":0.3,"lx":0.07447274657738392,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"e1bkiT8KZb5kq2EZtd6xkx","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"iDftHFSTHkqwMVnS3owrRR","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.16666666666666666,"lx":0.2629889958936657,"ly":0,"lz":0.6666666666666666,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beJH9KRXtDcaa6m4RL93xX","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"eAWyKBNd38qS1dYBuKrkj6","doorType":"Default","archHeight":1,"filled":true},{"type":"Flower","name":"Cactus Combo 1","cx":15.634548540985584,"cy":11.876139460714374,"cz":0.04168179258704141,"lx":2,"lz":2.35,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"wmzcYA53yLxrPfQ5v68p4e","selected":false},{"type":"Flower","name":"Cactus Combo 2","cx":18.898648680314054,"cy":11.25310807141135,"cz":0.041681792587041855,"lx":2,"lz":2.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"ekW7n1M2LiXzN32pweKLPt","selected":false},{"type":"Flower","name":"Cactus Combo 4","cx":-9.952276659759775,"cy":12.90502413689002,"cz":0.04168179258704274,"lx":2,"lz":2.69,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","id":"kyZxhbtBH6PAgp5K6MDu9p","selected":false},{"type":"Flower","name":"Cactus Combo 3","cx":-16.70983030604646,"cy":11.722560280813752,"cz":0.041681792587040974,"lx":2,"lz":2.45,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"a9ApdGiziGdUumhgusYw2u","selected":false},{"type":"Human","name":"Jamelia","cx":-0.9137087061647211,"cy":10.928006147996442,"cz":0.041681792587041855,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"5QNe3ntzVQvFEHnDW2YJBn","selected":false,"ly":0.65},{"type":"Human","name":"Juro","cx":12.272662858917183,"cy":8.898453665685638,"cz":0.041681792587041855,"lx":0.494,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"jrkJAJRrbJ8LDAxvtvH9ym","selected":false,"ly":0.494},{"type":"Flower","name":"Cactus Combo 2","cx":15.729057510724607,"cy":-7.680209466829874,"cz":0.041681792587040974,"lx":2,"lz":2.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"bWKYur6DnwP6mEaL7fWHC5","selected":false},{"type":"Flower","name":"Cactus Combo 1","cx":5.786476089599912,"cy":-6.442673510815909,"cz":0.04168179258704363,"lx":2,"lz":2.35,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dwSg9LvrTwKhMcJFZMtZSx","id":"3ao3ZpduETphLg6cc8LUjj","selected":false},{"type":"Flower","name":"Cactus Combo 4","cx":-10.111033648495354,"cy":-7.125989728474186,"cz":0.04168179258704363,"lx":2,"lz":2.69,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dwSg9LvrTwKhMcJFZMtZSx","id":"uqTpdoF6iAUdixG8SfEgJj","selected":false},{"type":"Window","cx":-0.31558679507239945,"cy":0.1,"cz":0.24999999999999997,"lx":0.21039119671493292,"ly":0.3,"lz":0.1666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"j5t6bBkxWAT3r9CjT4GP8B","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"ibgD6gwHyvXo2UA5ceSEVw","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jiya","cx":10.698394787136534,"cy":11.589493889667297,"cz":0.03336358582743005,"lx":0.6,"lz":1.74,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"mMaWsSyXEBfBHccaGNhNaS","selected":false,"ly":0.6},{"type":"Human","name":"John","cx":8.199832055622817,"cy":11.636996804402608,"cz":0.033363585827429154,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"48yGEsfjgkFf6JxD4AfTys","selected":false,"ly":0.6},{"type":"Window","cx":-0.4058097887797344,"cy":0.1,"cz":0.24999999999999997,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"aPAj9pnBrDVWusPRcoZUdo","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2999463656198036,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bhkdQB672T3sQvxXuVmHrR","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.19408294245987287,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hBEhSqRgj9NSNQa4oM7xNt","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.08821951929994218,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tB2iwRfd3qTWeCsYv7HiuW","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.44109759649971125,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5RkPZYVo3GN5X19Bn6Yr4D","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3705219810597575,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"59NsagWft1p9bwUyWDUzrn","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2999463656198037,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"77AhVqY63vBnmESEhniVsa","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Cuboid","cx":-14.789681570981625,"cy":-12.821724309505734,"cz":1.3499532304431159,"lx":3.0361328512402026,"ly":2.0173847404410545,"lz":2.6999064608862318,"color":"#df9b6c","faceColors":["#df9b6c","#df9b6c","#df9b6c","#df9b6c","#df9b6c","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.0555294187969286],"parentId":"Ground","selected":false,"id":"8afBb85AbBXxrUxc1UJNK2"},{"type":"Tree","name":"Coconut","cx":10.01957056934475,"cy":-11.043888206723011,"cz":0,"lx":4.98455928150696,"lz":7.122482384126237,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"gHPxDQkjKxPPpDTbnNBT1s","selected":false},{"type":"Tree","name":"Coconut","cx":19.62542663178017,"cy":-0.8605656311368737,"cz":0.041681792587041855,"lx":4.98455928150696,"lz":7.122482384126237,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"ojssPm5w3H8Z5YiH8zAEzJ","selected":false},{"type":"Tree","name":"Coconut","cx":-5.921845166656402,"cy":-20.83835275090669,"cz":-8.881784197001252e-16,"lx":4.98455928150696,"lz":7.122482384126237,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"hiyUWsAKxmKF4tZmUy3NkH","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-12.5485886969171,-8.79449187461802,-0.000008794882783709357],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-12.5485886969171,-8.794641881286468,150],"theme":"Dune","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-9.661868463308164,-30.326442140062476,3.3023821453989806],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":37.01235612443423,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#999999","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.5760093837906188,2.4983076358188625,2.2700206595855397],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},442:function(e){e.exports=JSON.parse('{"docid":"ioJu36TzRMhQVBC6fnqBek","time":"07/20/2023 06:11 pm","timestamp":1689891095940,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"diurnalTemperatureModel":1,"longitude":-71.3488548,"sutDaysPerYear":4,"daysPerYear":4,"solarPanelVisibilityGridCellSize":0.2,"sutGridCellSize":1,"noAnimationForSensorDataCollection":false,"latitude":42.2844063,"address":"Natick, MA","discretization":"Approximate","solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2023, 12:00:00 PM","pvGridCellSize":0.5,"cspGridCellSize":0.5,"airAttenuationCoefficient":0.01,"noAnimationForThermalSimulation":false,"highestTemperatureTimeInMinutes":900,"noAnimationForSolarPanelSimulation":false,"sutTimesPerHour":1,"noAnimationForSolarUpdraftTowerSimulation":false,"timesPerHour":1,"cspTimesPerHour":1,"ground":{"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05},"dustLoss":0.05,"name":"default","countryCode":"US","cspDaysPerYear":4,"noAnimationForHeatmapSimulation":false,"airConvectiveCoefficient":5},"elements":[{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":9.90269213865045,"solarUpdraftTower":{},"ly":19.683075461124755,"lz":0.1,"parentId":"Ground","cx":-9.113689833217686,"cy":0.18995426124406656,"cz":0.05,"textureType":"No Foundation Texture","id":"9i1GeRaoeMfYcFyEXeESac","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["vGUT3JZv2v5bPwGYFugWY9"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["v2X26dL66tDwT3FmUa4dJm"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":19.021724129735727,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"emaK2k9UPEiLxchx8wQAVR","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"9QENUE5u5vX4ytePVUekD6","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[4.927202561127663,9.208552266536293,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":4.927202561127659,"cy":-0.3023097983315708,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[4.927202561127656,-9.813171863199434,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":1.5707963267948963,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["aR3TKXZKTA3DjkwyAfcrsN"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["9QENUE5u5vX4ytePVUekD6"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":9.871623613893995,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,5],"roofId":"emaK2k9UPEiLxchx8wQAVR","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"vGUT3JZv2v5bPwGYFugWY9","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-4.944421052766332,9.208552266536286,0],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":-0.008609245819334532,"cy":9.208552266536289,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[4.927202561127663,9.208552266536293,0],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":3.1415926535897936,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["v2X26dL66tDwT3FmUa4dJm"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["vGUT3JZv2v5bPwGYFugWY9"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":19.02172412973572,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"emaK2k9UPEiLxchx8wQAVR","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"aR3TKXZKTA3DjkwyAfcrsN","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-4.944421052766332,-9.813171863199434,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":-4.944421052766332,"cy":-0.30230979833157434,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-4.944421052766332,9.208552266536286,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":-1.5707963267948968,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["9QENUE5u5vX4ytePVUekD6"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["aR3TKXZKTA3DjkwyAfcrsN"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":9.871623613893986,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,5],"roofId":"emaK2k9UPEiLxchx8wQAVR","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"v2X26dL66tDwT3FmUa4dJm","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[4.927202561127656,-9.813171863199434,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":-0.008609245819338085,"cy":-9.813171863199434,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-4.94442105276633,-9.813171863199434,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":0,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"color":"#808080","thickness":0.2,"ridgeRightPoint":[0,1],"sideColor":"#ffffff","ridgeLeftPoint":[0,1],"type":"Roof","lx":0,"ly":0,"lz":2,"lineWidth":0.2,"showLabel":false,"wallsId":["9QENUE5u5vX4ytePVUekD6"],"textureType":"Roof Texture Default","id":"emaK2k9UPEiLxchx8wQAVR","selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":0,"cy":0,"cz":0,"rise":2},{"color":"#ffffff","type":"Window","lx":0.147367402963575,"ly":0.3,"tint":"#73D8FF","lz":0.5426870588204226,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"dYhfccPnbEuiEAJoeaQBDj","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"v2X26dL66tDwT3FmUa4dJm","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.2701735720998875,"cy":0.3,"cz":0.0904478431367371,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.147367402963575,"ly":0.3,"tint":"#73D8FF","lz":0.5426870588204226,"windowType":"Default","empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"5nVnggQ1j1y4LhusK3QQ9N","selected":false,"normal":[0,0,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,-1,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","uValue":2,"parentId":"v2X26dL66tDwT3FmUa4dJm","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.22105110444536252,"cy":0.3,"cz":0.0904478431367371,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.06896551724137932,"ly":0.3,"tint":"#73D8FF","lz":0.3333333333333333,"windowType":"Arched","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"iAAMojVW9SfERJgsNR5wGg","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"v2X26dL66tDwT3FmUa4dJm","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.014639709033835343,"cy":0.3,"cz":0.1951247058802817,"opacity":0.5,"frame":true},{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":5.121405440544657,"solarUpdraftTower":{},"ly":23.331989134689955,"lz":0.1,"parentId":"Ground","notBuilding":true,"cx":7.117139637555678,"cy":-2.1402534531496054,"cz":0.05,"textureType":"Foundation Texture #7","id":"6oJTxTDspAfmbzbkSwgLzM","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["u8cZQ8gw5Uc65jmC4AaB7d"],"structureSpacing":3.1,"structureColor":"white","rightRoofHeight":3,"leftJoints":["naij9irGfPKDF6gEc7Zkzp"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":6.120671841837397,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"wBHkiU6oo5drdfZkAFGFfz","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"hbDCpCYC3ZLecZSkhJS1EQ","leftRoofHeight":3,"structureWidth":0.2,"eavesLength":0.3,"selected":false,"rightPoint":[2.559407991260085,2.8016570371963034,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":2.559407991260085,"cy":-0.25867888372239545,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[2.559407991260085,-3.3190148046410934,0.1],"wallStructure":"Pillar","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":1.5707963267948966,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":27.903855171778083,"solarUpdraftTower":{},"ly":11.561493647400244,"lz":0.1,"parentId":"Ground","cx":-0.6894829517342327,"cy":3.639827040053712,"cz":0.05,"textureType":"No Foundation Texture","id":"4CT3RC8YfvAiLoXMz31PEP","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["1Zay38AwfKg5VsDAT4PNTX"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["9BgkixvH2fS92Toh4D28v5"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":21.991286967543367,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"qmUXXfVhmamGoX7fipyTJo","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"kqp9pSQMqPyRJVqLaTvTUF","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0,"selected":false,"rightPoint":[-8.140917668430362,5.750753387493409,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":2.8547258153413235,"cy":5.750753387493408,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[13.850369299113007,5.750753387493406,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":3.141592653589793,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["kqp9pSQMqPyRJVqLaTvTUF"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["oNGhacA1yDo6pQ4NiWd8Nw"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":11.392654386409493,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,5],"roofId":"qmUXXfVhmamGoX7fipyTJo","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"9BgkixvH2fS92Toh4D28v5","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[13.850369299113007,5.750753387493413,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":13.850369299113007,"cy":0.05442619428866724,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[13.850369299113007,-5.641900998916079,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":1.5707963267948966,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"normal":[0,1,0],"cx":0.12009022039087736,"cy":-3.0450806858488395,"cz":0.05000000074505806,"rotation":[0,0,0],"name":"Jamelia","id":"uRMwVbiJoYLhXPAzZaiS71","type":"Human","lx":0.65,"lz":1.8,"parentId":"6oJTxTDspAfmbzbkSwgLzM","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["oNGhacA1yDo6pQ4NiWd8Nw"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":2.999999999999999,"leftJoints":["kqp9pSQMqPyRJVqLaTvTUF"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":11.392654386409477,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[-5.551115123125783e-17,5],"roofId":"qmUXXfVhmamGoX7fipyTJo","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"1Zay38AwfKg5VsDAT4PNTX","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-8.140917668430362,-5.64190099891607,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Empty","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":-8.140917668430362,"cy":0.05442619428866813,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-8.140917668430362,5.750753387493406,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":-1.5707963267948966,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["9BgkixvH2fS92Toh4D28v5"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["1Zay38AwfKg5VsDAT4PNTX"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":21.991286967543363,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"qmUXXfVhmamGoX7fipyTJo","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"oNGhacA1yDo6pQ4NiWd8Nw","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[13.850369299113007,-5.641900998916079,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":2.8547258153413235,"cy":-5.641900998916076,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-8.140917668430362,-5.641900998916072,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":-3.231019343291642e-16,"opacity":0.5,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"color":"#808080","thickness":0.2,"ridgeRightPoint":[0,1],"sideColor":"#ffffff","ridgeLeftPoint":[0,1],"type":"Roof","lx":0,"ly":0,"lz":2,"lineWidth":0.2,"showLabel":false,"wallsId":["kqp9pSQMqPyRJVqLaTvTUF"],"textureType":"Roof Texture Default","id":"qmUXXfVhmamGoX7fipyTJo","selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":0,"cy":0,"cz":0,"rise":2},{"normal":[0,1,0],"color":"#ffffff","rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","doorType":"Default","filled":true,"lineColor":"#000000","type":"Door","lx":0.10630984247920754,"uValue":1,"ly":0,"lz":0.8333333333333334,"lineWidth":0.2,"showLabel":false,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","interior":false,"cx":0.2232506692063359,"cy":0,"cz":-0.08333333333333333,"archHeight":1,"textureType":"Door Texture #13","id":"j64mXBpPWycvnXkBDtiDas","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["gjog834aLNPzVBFGgmeHKa"],"structureSpacing":3.1,"structureColor":"white","rightRoofHeight":3,"leftJoints":["hbDCpCYC3ZLecZSkhJS1EQ"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":5.029686673364193,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,4.0028493376063965],"roofId":"wBHkiU6oo5drdfZkAFGFfz","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"u8cZQ8gw5Uc65jmC4AaB7d","leftRoofHeight":3,"structureWidth":0.2,"eavesLength":0.3,"selected":false,"rightPoint":[-2.470278682104108,2.8016570371963034,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Empty","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":0.04456465457798853,"cy":2.8016570371963034,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[2.559407991260085,2.8016570371963034,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":3.141592653589793,"opacity":0.5,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["naij9irGfPKDF6gEc7Zkzp"],"structureSpacing":3.1,"structureColor":"white","rightRoofHeight":3,"leftJoints":["u8cZQ8gw5Uc65jmC4AaB7d"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":6.120671841837397,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"wBHkiU6oo5drdfZkAFGFfz","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"gjog834aLNPzVBFGgmeHKa","leftRoofHeight":3,"structureWidth":0.2,"eavesLength":0.3,"selected":false,"rightPoint":[-2.470278682104108,-3.3190148046410934,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":-2.470278682104108,"cy":-0.25867888372239545,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-2.470278682104108,2.8016570371963034,0.1],"wallStructure":"Pillar","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":-1.5707963267948966,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["hbDCpCYC3ZLecZSkhJS1EQ"],"structureSpacing":3.1,"structureColor":"white","rightRoofHeight":3,"leftJoints":["gjog834aLNPzVBFGgmeHKa"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":5.029686673364193,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,4.0028493376063965],"roofId":"wBHkiU6oo5drdfZkAFGFfz","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"naij9irGfPKDF6gEc7Zkzp","leftRoofHeight":3,"structureWidth":0.2,"eavesLength":0.3,"selected":false,"rightPoint":[2.559407991260085,-3.3190148046410934,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Empty","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":0.04456465457798853,"cy":-3.3190148046410934,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-2.470278682104108,-3.3190148046410934,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":0,"opacity":0.5,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"color":"#808080","thickness":0.15,"ridgeRightPoint":[0,1],"sideColor":"#ffffff","ridgeLeftPoint":[0,1],"type":"Roof","lx":0,"ly":0,"lz":0,"lineWidth":0.2,"showLabel":false,"wallsId":["gjog834aLNPzVBFGgmeHKa"],"textureType":"Roof Texture Default","id":"wBHkiU6oo5drdfZkAFGFfz","selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","lineColor":"#000000","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":0,"cy":0,"cz":0,"rise":1.0028493376063965},{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":2.728592264047313,"solarUpdraftTower":{},"ly":4.662886212525777,"lz":0.1,"parentId":"Ground","notBuilding":true,"cx":3.15486402400506,"cy":5.558911086166162,"cz":0.05,"textureType":"No Foundation Texture","id":"cnVE9qA8tGVxx7Twx9YQ7v","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["pXM26q1VjfYYDMxhYfN2o9"],"structureSpacing":2,"structureColor":"white","leftJoints":["oQPmsDKPXogP77dA6oQjhK"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":1,"ly":0.2,"lz":6,"lineWidth":0.2,"showLabel":false,"volumetricHeatCapacity":0.5,"textureType":"Wall Texture #3","studColor":"#ffffff","id":"o5Yf7XQHbF4kHVdq79cdp9","structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-0.8117707735928041,-0.1460542118582815,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"cnVE9qA8tGVxx7Twx9YQ7v","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"cnVE9qA8tGVxx7Twx9YQ7v","cx":-0.31177077359280414,"cy":-0.1460542118582815,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[0.18822922640719586,-0.1460542118582815,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":3.141592653589793,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["o5Yf7XQHbF4kHVdq79cdp9"],"structureSpacing":2,"structureColor":"white","leftJoints":["xuRnyn33hSpjc1EP64SqoP"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":1,"ly":0.2,"lz":6,"lineWidth":0.2,"showLabel":false,"volumetricHeatCapacity":0.5,"textureType":"Wall Texture #3","studColor":"#ffffff","id":"oQPmsDKPXogP77dA6oQjhK","structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[0.18822922640719586,-0.1460542118582815,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"cnVE9qA8tGVxx7Twx9YQ7v","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"cnVE9qA8tGVxx7Twx9YQ7v","cx":0.18822922640719586,"cy":-0.6460542118582815,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[0.18822922640719586,-1.1460542118582815,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":1.5707963267948966,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["xuRnyn33hSpjc1EP64SqoP"],"structureSpacing":2,"structureColor":"white","leftJoints":["o5Yf7XQHbF4kHVdq79cdp9"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":1,"ly":0.2,"lz":6,"lineWidth":0.2,"showLabel":false,"volumetricHeatCapacity":0.5,"textureType":"Wall Texture #3","studColor":"#ffffff","id":"pXM26q1VjfYYDMxhYfN2o9","structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-0.8117707735928041,-1.1460542118582815,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"cnVE9qA8tGVxx7Twx9YQ7v","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"cnVE9qA8tGVxx7Twx9YQ7v","cx":-0.8117707735928041,"cy":-0.6460542118582815,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-0.8117707735928041,-0.1460542118582815,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":4.71238898038469,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["oQPmsDKPXogP77dA6oQjhK"],"structureSpacing":2,"structureColor":"white","leftJoints":["pXM26q1VjfYYDMxhYfN2o9"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":1,"ly":0.2,"lz":6,"lineWidth":0.2,"showLabel":false,"volumetricHeatCapacity":0.5,"textureType":"Wall Texture #3","studColor":"#ffffff","id":"xuRnyn33hSpjc1EP64SqoP","structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[0.18822922640719586,-1.1460542118582815,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"cnVE9qA8tGVxx7Twx9YQ7v","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"cnVE9qA8tGVxx7Twx9YQ7v","cx":-0.31177077359280414,"cy":-1.1460542118582815,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-0.8117707735928041,-1.1460542118582815,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":0,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"color":"#ffffff","type":"Window","lx":0.04252393699168303,"ly":0.3,"tint":"#73D8FF","lz":0.5,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"aZQsp9KnrVqmk4eAwe1NCt","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.20610080510533202,"cy":0.3,"cz":0.08333333333333333,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.0865221828476419,"ly":0.3,"tint":"#73D8FF","lz":0.5,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"wi1NteLea8pGYc59N8ZyTs","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.09315657273688317,"cy":0.3,"cz":0.08333333333333333,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.04252393699168303,"ly":0.3,"tint":"#73D8FF","lz":0.5,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"tpCHwLeKKFgUw5FY2DKdy1","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.021261968495841516,"cy":0.3,"cz":0.08333333333333333,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.04252393699168303,"ly":0.3,"tint":"#73D8FF","lz":0.3333333333333333,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"1NPtUozjvhjcbUekBxsSNW","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.40397740142098876,"cy":0.3,"cz":0.16666666666666666,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.04632014812218899,"ly":0.3,"tint":"#73D8FF","lz":0.3333333333333333,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"ptRhzHtPCd3TfYdEbPj837","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"9QENUE5u5vX4ytePVUekD6","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.29226874611722437,"cy":0.3,"cz":0.16666666666666666,"opacity":0.5,"frame":true},{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":3.215640251525082,"solarUpdraftTower":{},"ly":7.683856697227261,"lz":0.1,"parentId":"Ground","cx":13.747250889007532,"cy":3.741208118171845,"cz":0.05,"textureType":"No Foundation Texture","id":"4SCfFQkEiBbVWLNY4GZGRU","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["c1xKbTDTkdNMKPxFGbq5sJ"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["4HHRdJpRSx8pifjYvsDdM4"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":2.1985623896518645,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"iQYyB4WDCVVmrDF6P2RGEj","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"u8nK8tuuo6DkzwQEivraoQ","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-0.6112818815298553,3.4762421347806844,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":0.4879993132960756,"cy":3.4762421347806844,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[1.5872805081220083,3.4762421347806844,0.1],"wallStructure":"Default","leftTopPartialHeight":5.5,"studSpacing":2,"relativeAngle":3.141592653589793,"opacity":0,"rightTopPartialHeight":5.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["u8nK8tuuo6DkzwQEivraoQ"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["bxY2NeBNcbCbVPsugfGXTE"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":7.103113702900762,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,4.5],"roofId":"iQYyB4WDCVVmrDF6P2RGEj","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"4HHRdJpRSx8pifjYvsDdM4","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[1.5872805081220083,3.4762421347806844,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":1.5872805081220083,"cy":-0.07531471666969658,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[1.5872805081220083,-3.6268715681200776,0.1],"wallStructure":"Default","leftTopPartialHeight":5.5,"studSpacing":2,"relativeAngle":1.5707963267948966,"opacity":0,"rightTopPartialHeight":5.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["bxY2NeBNcbCbVPsugfGXTE"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["u8nK8tuuo6DkzwQEivraoQ"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":7.103113702900762,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,4.5],"roofId":"iQYyB4WDCVVmrDF6P2RGEj","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"c1xKbTDTkdNMKPxFGbq5sJ","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-0.6112818815298553,-3.6268715681200776,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Empty","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":-0.6112818815298553,"cy":-0.07531471666969658,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-0.6112818815298553,3.4762421347806844,0.1],"wallStructure":"Default","leftTopPartialHeight":5.5,"studSpacing":2,"relativeAngle":-1.5707963267948966,"opacity":0,"rightTopPartialHeight":5.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["4HHRdJpRSx8pifjYvsDdM4"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["c1xKbTDTkdNMKPxFGbq5sJ"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":2.1985623896518645,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"iQYyB4WDCVVmrDF6P2RGEj","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"bxY2NeBNcbCbVPsugfGXTE","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[1.5872805081220083,-3.6268715681200776,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":0.4879993132960756,"cy":-3.6268715681200776,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-0.6112818815298553,-3.6268715681200776,0.1],"wallStructure":"Default","leftTopPartialHeight":5.5,"studSpacing":2,"relativeAngle":0,"opacity":0,"rightTopPartialHeight":5.5,"unfilledHeight":0.5},{"color":"#808080","thickness":0.2,"ridgeRightPoint":[0,1],"sideColor":"#ffffff","ridgeLeftPoint":[0,1],"type":"Roof","lx":0,"ly":0,"lz":0,"lineWidth":0.2,"showLabel":false,"wallsId":["bxY2NeBNcbCbVPsugfGXTE"],"textureType":"Roof Texture Default","id":"iQYyB4WDCVVmrDF6P2RGEj","selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","lineColor":"#000000","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":0,"cy":0,"cz":0,"rise":1.5},{"color":"#ffffff","type":"Window","lx":0.4656293560221584,"ly":0.3,"tint":"#73D8FF","lz":0.3333333333333333,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"ur2wu1GbyFVp7FmPxNNmBM","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","lineColor":"#000000","uValue":2,"parentId":"bxY2NeBNcbCbVPsugfGXTE","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":1.2923810799929613e-17,"cy":0.3,"cz":0.16666666666666666,"opacity":0.5,"frame":true},{"normal":[0,1,0],"cx":-13.100619706718579,"cy":-10.982350587612038,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"bzsGApekhuYxympNeW6JVx","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-11.532994972828238,"cy":-10.945183221755485,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"2y8Zm1vaLLzKLCLA5bR7oe","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-9.926022363688986,"cy":-10.929829923112186,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"dJtXdJrD6NpPxoMSTaJY7n","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-8.252046390037505,"cy":-10.833715328006154,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"fZeGKA8vqbSdnXefKUgP6u","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-6.596249922214839,"cy":-10.835475782121927,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"mDpx3QUsXGWznsz7rRMSdN","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-4.903997368711945,"cy":-10.880752447262477,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"7unbM9cBoPXu92FcGyHWjG","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-8.971390493828297,"cy":-12.01356765080397,"cz":0,"rotation":[0,0,0],"name":"Jacob","id":"9sZwMtiyANKZHbqdhvGUp9","type":"Human","lx":0.8,"lz":1.82,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-2.805525594551304,"cy":-3.0636427589221107,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"kdDbY49KBpLT6Gh4XRcuXV","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-0.8228472548979603,"cy":-2.9603397088144945,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"cPktsh6MkPkQgTpcfsZ264","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":1.2205615754221601,"cy":-3.0452854714079365,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"pfPsSh1hnCKWYj3B8ZGyhC","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":3.188130988912686,"cy":-3.1336708109310862,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"oKGQ71oyUFnUv3h2wpjctG","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.49096591590788,"cy":-2.9417670536643996,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"tAkXUbnTXQQEkhtjgkeL9a","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":12.439980874103988,"cy":-2.958114538663313,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"3uPL624aQAssRbe8u5vNsL","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.227119582351997,"cy":-6.718823701549967,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"pp9vMNnF3gKDKwKACrCtWt","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.248202396665872,"cy":-7.3829856427934075,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"6HCPw6bEmxM9XBoyEFYsXx","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.29608623259089,"cy":-8.067012538431428,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"s9pXmqBnLJggJVDKmKrsUe","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.253112052389068,"cy":-8.783230589194178,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"nmZQCDYhSZSpTJn766vY6J","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.284683512589031,"cy":-9.514835126828089,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"qTPuqJ4Ppz1TkNvBeQyqFz","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.071297430185469,"cy":-6.519410387949039,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"5pk9bJdBfyK4bpLi5BT6NM","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.062267589853372,"cy":-7.196223132026073,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"r8K8yWqHuFGizynm6ddenB","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.097400993990563,"cy":-7.971209786072892,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"oG3QSnZ1Uk7vjSTdBJ8fXN","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.06700296171534,"cy":-8.729909052223485,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"tkRzfWzEvDw14BTf7giDeA","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.080379345721328,"cy":-9.557453473585836,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"sCmW6UrmvwLKnfPLkgt286","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.299044056096119,"cy":-10.313859849129921,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"qigHYFtupbrFesxkd37Zht","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.075030547693563,"cy":-10.331325702253856,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"wWEyHg1cJDBq1b3EMERb9A","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.309032427615859,"cy":-11.091835373694485,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"1kA9AC2Guwj5iAhcjXubxK","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.099628606942899,"cy":-11.10977466594735,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"6Lxn24pDS3Drayq29WyoKf","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.385872466836958,"cy":-11.910915656038041,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"qrcVRZNMH5ehQ4r36RBqU6","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.130718482167884,"cy":-11.91928566361417,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"89M11hZpqVtWuZCYDG5EYF","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.426502126657067,"cy":-12.641489645575502,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"edL3BFi1bTcY7m6rb8Z692","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.128599191487156,"cy":-12.753156162180996,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"33TVUhPCYQMxWUT6sdBkTj","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.438104647827676,"cy":-13.391380274386641,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"ddTatvjn8PZnpa5P7wkL8k","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.094734752772371,"cy":-13.540199425804733,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"mx6oiu2CpUQHto7UPZUVNA","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":15.223771494752249,"cy":-1.1686190396344398,"cz":0,"rotation":[0,0,0],"name":"Hibiscus","id":"bEZvtj2vhcueHdhStZq3zG","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":16.813831408618693,"cy":4.533595612460387,"cz":0,"rotation":[0,0,0],"name":"Hibiscus","id":"rHgigsbmBipXpU5L23ADrP","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":16.761059861350283,"cy":2.526606100917273,"cz":0,"rotation":[0,0,0],"name":"Hibiscus","id":"5sKnhXEkZrDN45g6Hkv3Dr","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":16.735563289446127,"cy":6.631805912715191,"cz":-1.7763568394002505e-15,"rotation":[0,0,0],"name":"Hibiscus","id":"2NraLHQLDf7r45LZpKeZWV","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":16.65137747037868,"cy":0.5295700067482301,"cz":0,"rotation":[0,0,0],"name":"Hibiscus","id":"ssqX4qu1eL82YUJ4MAMBZc","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"color":"#ffffff","polygonTop":[0,1.5],"type":"Window","lx":0.6144309976040727,"ly":0.3,"tint":"#73D8FF","lz":0.9666666666666667,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"hNQ7uh7EgAer8x5yJgdejy","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"9BgkixvH2fS92Toh4D28v5","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-1.9490155445241313e-17,"cy":0.3,"cz":0.01666666666666668,"opacity":0.5,"frame":false},{"color":"#ffffff","type":"Window","lx":1.0259623193904517,"ly":0.2,"tint":"#73D8FF","lz":0.9973447889836972,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"pEKTeVcdGPeo8QaTuPfNZn","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.33765748962314723,0,3.141592653589793],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"qmUXXfVhmamGoX7fipyTJo","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":3.271837805703635,"cy":1.2022574325146156,"cz":4.796992518408978,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[0.02198232342893128,5.239274910393489],"type":"Window","lx":11.521452745175713,"ly":0.2,"tint":"#73D8FF","lz":0.028013650400663493,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"ve3NZruBvxPhuGrwYfJYbD","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.3849826581688516,0,1.5707963267948961],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"emaK2k9UPEiLxchx8wQAVR","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":5.086744147605803,"cy":3.321831955890855,"cz":3.135353456445162,"opacity":0.5,"frame":false},{"color":"#ffffff","type":"Window","lx":0.5841143520475517,"ly":0.3,"tint":"#73D8FF","lz":0.9333333333333332,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"xcpQhvE8H4jY1XBufEziCv","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"9QENUE5u5vX4ytePVUekD6","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.1869142359643362,"cy":0.3,"cz":0,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[-0.5,6.225749243067175],"type":"Window","lx":4.529358401864285,"ly":0.2,"tint":"#73D8FF","lz":0.0014510101332386256,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"qco3N3M7pEccTSX4FnzmmB","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.33765748962314746,0,-4.440892098500626e-16],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"qmUXXfVhmamGoX7fipyTJo","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-6.038377742510676,"cy":-5.937820865703974,"cz":3.0961015205935123,"opacity":0.5,"frame":false},{"color":"#ffffff","type":"Window","lx":0.17714486148633357,"ly":0.3,"tint":"#73D8FF","lz":0.9333333333333332,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"1u4CPXmzZ7U8AD1aJnrxtZ","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.40688031378480977,"cy":0.3,"cz":0,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[0.5,5.545977124465995],"type":"Window","lx":4.431361564126709,"ly":0.2,"tint":"#73D8FF","lz":0.05655021663112993,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"hxMturJGqg8nQWYw3248Zf","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.33765748962314746,0,3.141592653589793],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"qmUXXfVhmamGoX7fipyTJo","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-6.124998499042543,"cy":5.680878658133054,"cz":3.224533256953256,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.19988113884645106,"ly":0.3,"tint":"#73D8FF","lz":0.9333333333333332,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"rm6Z987XxKrWApL3xoegwQ","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"kqp9pSQMqPyRJVqLaTvTUF","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.3955121751047511,"cy":0.3,"cz":0,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[0.5,2.9702881561464394],"type":"Window","lx":3.157582763484352,"ly":0.15,"tint":"#73D8FF","lz":0.021976494720977846,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"pqpP8EKpYsZ86BiFVEHhxo","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.3794473874556583,0,1.5707963267948966],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","lineColor":"#000000","uValue":2,"parentId":"wBHkiU6oo5drdfZkAFGFfz","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":2.8491029983508964,"cy":1.4398333849785727,"cz":3.034477716074278,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[-0.5,2.8179589134876353],"type":"Window","lx":3.322490733590821,"ly":0.15,"tint":"#73D8FF","lz":0.016499091866733075,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"7zkZZCYRrhEu3epYoe3VVL","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.3794473874556583,0,4.71238898038469],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","lineColor":"#000000","uValue":2,"parentId":"wBHkiU6oo5drdfZkAFGFfz","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-2.759910269509251,"cy":1.377735998361726,"cz":3.034503006074985,"opacity":0.5,"frame":false},{"normal":[0,1,0],"cx":19.682640887226967,"cy":1.7189056044242683,"cz":0,"rotation":[0,0,0],"name":"Apple","id":"7Fb312hzxWdTnmmZmzJ1Ub","type":"Tree","lx":5.1836671993460035,"lz":5.934335930936695,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-17.761844408107656,"cy":-14.105635188228664,"cz":0,"rotation":[0,0,0],"name":"Elm","id":"7o7bNqKzFGLaB6T7op3udd","type":"Tree","lx":15.71602183123487,"lz":16.55887991319796,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":0.7478699234997297,"cy":-12.856360711077464,"cz":1.7763568394002505e-15,"rotation":[0,0,0],"name":"Joel","id":"68Win1DRWqT8VnsTwHRtwy","type":"Human","lx":1.8,"lz":1.75,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-0.11804362509319688,"cy":-9.517368667682085,"cz":0,"rotation":[0,0,0],"name":"Jacqueline","id":"n6cjamzJLc5nH9PXsech9s","type":"Human","lx":0.43,"lz":1.78,"parentId":"Ground","selected":false}],"sceneRadius":32,"view":{"showDailyLightSensorPanel":false,"yearlyPvYieldPanelY":0,"yearlyHeliostatYieldPanelY":0,"windowShininess":200,"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"dailyLightSensorPanelY":0,"heatFluxWidth":0.5,"showEvolutionPanel":false,"shadowEnabled":true,"theme":"Rural","dailyFresnelReflectorYieldPanelRect":{"width":600,"y":0,"x":0,"height":400},"showDailyParabolicTroughYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelY":0,"dailyLightSensorPanelRect":{"x":0,"height":360,"y":0,"width":600},"yearlyFresnelReflectorYieldPanelX":0,"dailyParabolicDishYieldPanelRect":{"height":400,"x":0,"y":0,"width":600},"dailyParabolicDishYieldPanelX":0,"dailyParabolicTroughYieldPanelRect":{"width":600,"height":400,"x":0,"y":0},"yearlyLightSensorPanelRect":{"width":600,"height":500,"x":0,"y":0},"showDailyFresnelReflectorYieldPanel":false,"weatherPanelRect":{"x":0,"width":500,"y":0,"height":500},"showWeatherPanel":false,"showDailyHeliostatYieldPanel":false,"stickyNotePanelX":0,"weatherPanelX":0,"showDailyBuildingEnergyPanel":false,"showYearlyUpdraftTowerYieldPanel":false,"yearlyHeliostatYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"evolutionPanelRect":{"x":0,"width":640,"y":0,"height":400},"waterSurface":false,"showYearlyPvYieldPanel":false,"weatherPanelY":0,"groundImage":false,"dailyParabolicDishYieldPanelY":0,"solarPanelShininess":100,"directLightIntensity":1,"solarRadiationHeatMapMaxValue":5,"heliodon":false,"mapPanelX":0,"showEconomicsPanel":false,"showStickyNotePanel":false,"showYearlyLightSensorPanel":false,"mapPanelY":0,"heliodonPanelX":0,"showDesignInfoPanel":true,"showHeliodonPanel":false,"yearlyFresnelReflectorYieldPanelY":0,"dailyPvYieldPanelY":0,"dailyPvYieldPanelX":0,"groundColor":"#194d33","showMapPanel":false,"autoRotate":false,"heatFluxScaleFactor":20,"dailyFresnelReflectorYieldPanelX":0,"showAzimuthAngle":true,"yearlyUpdraftTowerYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"dailyParabolicTroughYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"dailyFresnelReflectorYieldPanelY":0,"yearlyLightSensorPanelY":0,"showZenithAngle":true,"heliodonPanelY":0,"dailyUpdraftTowerYieldPanelRect":{"height":550,"width":640,"x":0,"y":0},"yearlyParabolicTroughYieldPanelX":0,"orthographic":false,"showDailyUpdraftTowerYieldPanel":false,"mapZoom":18,"mapWeatherStations":false,"showYearlyParabolicTroughYieldPanel":false,"cameraPosition":[18.00443196668519,-27.247214599490015,4.125039875772188],"dailyHeliostatYieldPanelX":0,"enableRotate":true,"dailyHeliostatYieldPanelY":0,"showSolarPanelVisibilityResultsPanel":false,"showInstructionPanel":true,"yearlyPvYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"showSiteInfoPanel":true,"dailyLightSensorPanelX":0,"panCenter2D":[4.576706139296041,-7.605431240841252,-0.000007651462374536784],"showDailyParabolicDishYieldPanel":false,"ambientLightIntensity":0.1,"yearlyLightSensorPanelShowDaylight":false,"showElevationAngle":true,"showYearlyBuildingEnergyPanel":false,"cameraZoom":37.01235612443423,"showDailyPvYieldPanel":false,"diurnalTemperaturePanelRect":{"height":400,"width":600,"y":0,"x":0},"cameraPosition2D":[4.576706139296041,-7.606431618292216,150],"yearlyHeliostatYieldPanelX":0,"showSunAngles":false,"showYearlyParabolicDishYieldPanel":false,"solarRadiationHeatMapReflectionOnly":false,"yearlyFresnelReflectorYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"yearlyBuildingEnergyPanelRect":{"height":400,"x":0,"width":600,"y":0},"dailyPvYieldPanelRect":{"height":400,"width":600,"x":0,"y":0},"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelRect":{"x":0,"width":600,"y":0,"height":400},"axes":false,"dailyBuildingEnergyPanelRect":{"width":600,"x":-10,"y":-2,"height":400},"yearlyLightSensorPanelShowClearness":false,"heatFluxColor":"gray","showDiurnalTemperaturePanel":false,"yearlyPvYieldPanelX":0,"stickyNotePanelRect":{"height":300,"y":0,"width":400,"x":0},"showYearlyHeliostatYieldPanel":false,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"panCenter":[-2.2871814685183796,5.668685587288812,3.578971879440754],"yearlyParabolicDishYieldPanelRect":{"x":0,"height":400,"y":0,"width":600},"visibilityResultsPanelRect":{"x":0,"height":470,"width":600,"y":0},"yearlyParabolicDishYieldPanelY":0,"mapType":"roadmap","groundImageType":"roadmap","yearlyLightSensorPanelX":0,"mapTilt":0},"graphState":{"dailyPvIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"poleSpacing":3,"interRowSpacing":2,"rowAxis":"Zonal","tiltAngle":0,"rowsPerRack":1,"poleHeight":1,"orientation":"Landscape","pvModelName":"SPR-X21-335-BLK"},"solarPanelArrayLayoutConstraints":{"rowAxis":"Zonal","minimumTiltAngle":-1.5707963267948966,"pvModelName":"CS6X-355P-FG","maximumInterRowSpacing":10,"poleSpacing":5,"poleHeight":1,"orientation":"Landscape","maximumRowsPerRack":6,"minimumRowsPerRack":1,"maximumTiltAngle":1.5707963267948966,"minimumInterRowSpacing":2},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"inertia":0.8,"convergenceThreshold":0.01,"swarmSize":20,"socialCoefficient":0.1,"cognitiveCoefficient":0.1,"localSearchRadius":0.1,"searchMethod":1,"maximumSteps":5,"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"vmax":0.01},"geneticAlgorithmParams":{"objectiveFunctionType":1,"mutationRate":0.1,"convergenceThreshold":0.01,"selectionRate":0.5,"localSearchRadius":0.1,"problem":"Solar Panel Tilt Angle","maximumGenerations":5,"selectionMethod":1,"searchMethod":1,"crossoverRate":0.5,"populationSize":20}},"economicsParams":{"projectLifeSpan":25,"operationalCostPerUnit":0.15,"electricitySellingPrice":0.25},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":[]}')},443:function(e){e.exports=JSON.parse('{"docid":"2dxtGmCKtazgz4ZZyFZJZt","time":"08/09/2023 10:14 am","timestamp":1691590469988,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":0.13929493819855354,"cy":6.605812086773116,"cz":2.2408122612280286,"lx":13.774073361922072,"ly":0.3,"lz":4.406268181656478,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[7.026331619159589,6.605812086773116,1],"rightPoint":[-6.747741742762483,6.605812086773116,1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #2","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"mMQKmyWeVTYGQZt5Pwr8i7","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.06250000000000006,"lx":0.0708994221944815,"ly":0.3,"lz":0.3750000000000001,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729104,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Wall","cx":7.026331619159589,"cy":1.082477095396415,"cz":2.2301039869226305,"lx":11.046669982753404,"ly":0.3,"lz":4.406268181656478,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[7.0263316191595875,-4.440857895980288,1],"rightPoint":[7.026331619159591,6.605812086773116,1],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture #2","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"mMQKmyWeVTYGQZt5Pwr8i7","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-6.747741742762481,"cy":1.082477095396415,"cz":2.228839888904333,"lx":11.046669982753404,"ly":0.3,"lz":4.406268181656478,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-6.747741742762481,6.605812086773116,1],"rightPoint":[-6.747741742762483,-4.440857895980288,1],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture #2","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"mMQKmyWeVTYGQZt5Pwr8i7","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.13929493819855443,"cy":-4.440857895980288,"cz":2.268765007024547,"lx":13.774073361922074,"ly":0.3,"lz":4.406268181656478,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-6.747741742762483,-4.440857895980288,1],"rightPoint":[7.026331619159591,-4.440857895980288,1],"relativeAngle":0,"textureType":"Wall Texture #2","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"mMQKmyWeVTYGQZt5Pwr8i7","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.39930090798010054,"cy":0.1,"cz":0,"lx":0.072600165087291,"ly":0.3,"lz":0.75,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"29QuQvndX2M7Sq4iEkq1Xz","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.217800495261873,"cy":0.1,"cz":0,"lx":0.072600165087291,"ly":0.3,"lz":0.75,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4LUVPCUMNMxJkqRL8wFtEe","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.217800495261873,"cy":0.1,"cz":0,"lx":0.072600165087291,"ly":0.3,"lz":0.75,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9FGAjvvq6tsggdPdWysCTK","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":0,"lx":0.072600165087291,"ly":0.3,"lz":0.75,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ucbeQgKEoSy9dHSmSFvaic","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.0625,"lx":0.217800495261873,"ly":0,"lz":0.875,"color":"white","textureType":"Door Texture #5","normal":[0,1,0],"rotation":[0,0,0],"id":"wzic8VHyh9MpPw339UYDy4","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Foundation","cx":-0.10211164866366573,"cy":-1.0707408518635368,"cz":0.5,"lx":19.70489075906007,"ly":14.114227282188692,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":false,"color":"#ffffff","hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"notBuilding":false},{"type":"Human","name":"Jeanette","cx":0.14801233194486496,"cy":-8.06976158791596,"cz":0.550000011920929,"lx":0.4,"ly":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dR4uPsfmhQVuGb7SK23oGM","id":"wnofb4XeX3vKmPtas3Qz87","selected":false},{"type":"Wall","cx":-0.011858550160528447,"cy":7.221609932314045,"cz":2.2408122612280286,"lx":17.504258260617593,"ly":0.1,"lz":3.738081358463903,"leftJoints":["13CFTeuFCTc4YUCeVPJLjR"],"rightJoints":["7hhgnkf2gpmkfhuWn7XUeP"],"leftPoint":[8.740270580148266,7.221609932314045,1.1],"rightPoint":[-8.763987680469327,7.221609932314045,1.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"noYCZko5xXDdVcHWBtGenP","parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","wallStructure":"Stud","structureSpacing":2.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"1YZMDHP4rjNjWTDSh913J6","selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.738081358463903,"rightTopPartialHeight":3.738081358463903},{"type":"Wall","cx":8.740270580148266,"cy":-1.182787584171602,"cz":2.2301039869226305,"lx":16.808795032971297,"ly":0.1,"lz":3.738081358463903,"leftJoints":["59rdAGCDJqPHgoGBDNRR6Q"],"rightJoints":["noYCZko5xXDdVcHWBtGenP"],"leftPoint":[8.740270580148266,-9.587185100657251,1.1],"rightPoint":[8.74027058014827,7.221609932314045,1.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"13CFTeuFCTc4YUCeVPJLjR","parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","wallStructure":"Stud","structureSpacing":2.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"1YZMDHP4rjNjWTDSh913J6","selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.738081358463903,"rightTopPartialHeight":3.738081358463903},{"type":"Wall","cx":-8.763987680469327,"cy":-1.182787584171602,"cz":2.228839888904333,"lx":16.808795032971297,"ly":0.1,"lz":3.738081358463903,"leftJoints":["noYCZko5xXDdVcHWBtGenP"],"rightJoints":["59rdAGCDJqPHgoGBDNRR6Q"],"leftPoint":[-8.763987680469324,7.221609932314045,1.1],"rightPoint":[-8.763987680469327,-9.587185100657251,1.1],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7hhgnkf2gpmkfhuWn7XUeP","parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","wallStructure":"Stud","structureSpacing":2.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"1YZMDHP4rjNjWTDSh913J6","selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.738081358463903,"rightTopPartialHeight":3.738081358463903},{"type":"Wall","cx":-0.01185855016052667,"cy":-9.587185100657251,"cz":2.268765007024547,"lx":17.504258260617597,"ly":0.1,"lz":3.738081358463903,"leftJoints":["7hhgnkf2gpmkfhuWn7XUeP"],"rightJoints":["13CFTeuFCTc4YUCeVPJLjR"],"leftPoint":[-8.763987680469327,-9.587185100657251,1.1],"rightPoint":[8.74027058014827,-9.587185100657251,1.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"59rdAGCDJqPHgoGBDNRR6Q","parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","wallStructure":"Stud","structureSpacing":2.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"1YZMDHP4rjNjWTDSh913J6","selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.738081358463903,"rightTopPartialHeight":3.738081358463903},{"id":"1YZMDHP4rjNjWTDSh913J6","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #1","thickness":0.2,"wallsId":["59rdAGCDJqPHgoGBDNRR6Q"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":1.3622814256430873,"ceiling":false},{"type":"Foundation","cx":0.04811947352688506,"cy":1.0979918791395855,"cz":0.55,"lx":22.625453690958146,"ly":19.31036432995692,"lz":1.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dR4uPsfmhQVuGb7SK23oGM","selected":false,"color":"#ffffff","notBuilding":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","roofStructure":"Default","wallsId":["roDDPncXBpNgmNum9aUaov"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"mMQKmyWeVTYGQZt5Pwr8i7","leftRidgeLength":3.4435183404805185,"rightRidgeLength":3.4435183404805185,"rise":2.6086446360194486,"ceiling":false},{"type":"Foundation","cx":-4.821425474895643,"cy":-8.879390234274549,"cz":0.5,"lx":7.794523521725198,"ly":3.265167760947254,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"836Y3qvzoPStkTCKiU6Zim","color":"#ffffff","textureType":"Foundation Texture #4","notBuilding":true},{"type":"Wall","cx":-0.14626729738059208,"cy":0.5024705864032608,"cz":1.0309059401885354,"lx":7.5,"ly":0.1,"lz":1.0618118803770709,"relativeAngle":0,"leftPoint":[-3.896267297380592,0.5024705864032608,1],"rightPoint":[3.603732702619408,0.5024705864032608,1],"leftJoints":[],"rightJoints":[],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"836Y3qvzoPStkTCKiU6Zim","foundationId":"836Y3qvzoPStkTCKiU6Zim","id":"e64Qztsfyr4zQmZk97hBnb","wallStructure":"Stud","opacity":0,"structureColor":"white","structureSpacing":0.3,"structureWidth":0.05,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Wall","cx":-0.0005250650359469589,"cy":0.5000831632035059,"cz":1.0309059401885354,"lx":7.5,"ly":0.1,"lz":1.0618118803770709,"leftJoints":[],"rightJoints":[],"leftPoint":[-3.750525065035947,0.5000831632035059,1],"rightPoint":[3.749474934964052,0.5000831632035059,1],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"efngrMnFf6NGDKsBgosZFy","parentId":"aiFpq1ExRSUpbVmoio8kUd","foundationId":"aiFpq1ExRSUpbVmoio8kUd","wallStructure":"Stud","structureSpacing":0.3,"structureColor":"white","structureWidth":0.05,"opacity":0,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Foundation","cx":5.053596159844837,"cy":-8.881777657474304,"cz":0.5,"lx":8.105470562568627,"ly":3.2603929145477437,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","textureType":"Foundation Texture #4","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"aiFpq1ExRSUpbVmoio8kUd","selected":false,"notBuilding":true},{"type":"Wall","cx":-0.17954580261008696,"cy":-0.4621199267349816,"cz":1.0309059401885354,"lx":16.799999999999997,"ly":0.1,"lz":1.0618118803770709,"leftJoints":[],"rightJoints":[],"leftPoint":[-8.579545802610086,-0.4621199267349803,1],"rightPoint":[8.22045419738991,-0.46211992673498287,1],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"sDWXonkZUyEPkgjChPFW25","parentId":"tQpZNWS9qUQiRVZS8oj4Qc","foundationId":"tQpZNWS9qUQiRVZS8oj4Qc","wallStructure":"Stud","structureSpacing":0.3,"structureColor":"white","structureWidth":0.05,"opacity":0,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Foundation","cx":8.34010119848655,"cy":0.21478440141855337,"cz":0.5,"lx":17.56747060893107,"ly":1.582487181459217,"lz":1,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tQpZNWS9qUQiRVZS8oj4Qc","selected":false,"notBuilding":true},{"type":"Wall","cx":0.17386663993795157,"cy":-0.45093322724616236,"cz":1.0309059401885354,"lx":16.799999999999997,"ly":0.1,"lz":1.0618118803770709,"leftJoints":[],"rightJoints":[],"leftPoint":[-8.226133360062049,-0.45093322724616186,1],"rightPoint":[8.57386663993795,-0.45093322724616464,1],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"1pz8zDt3tLxwV81bEJHYGM","parentId":"3kLgJo385s42rfmZRWwy75","foundationId":"3kLgJo385s42rfmZRWwy75","wallStructure":"Stud","structureSpacing":0.3,"structureColor":"white","structureWidth":0.05,"opacity":0,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Foundation","cx":-8.212637572768045,"cy":0.13836840972225417,"cz":0.5,"lx":17.178828934275355,"ly":1.6048605804368434,"lz":1,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3kLgJo385s42rfmZRWwy75","selected":false,"notBuilding":true},{"type":"Wall","cx":-0.09999999999999787,"cy":1.3322676295501878e-15,"cz":1.0309059401885354,"lx":16.799999999999997,"ly":0.1,"lz":1.0618118803770709,"leftJoints":[],"rightJoints":[],"leftPoint":[-8.499999999999996,2.6645352591003757e-15,0],"rightPoint":[8.3,0,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"is5SYj452p8YfTVgmaU6zM","parentId":"n2K3pFpV1Cjm6AUAgZRCTf","foundationId":"n2K3pFpV1Cjm6AUAgZRCTf","wallStructure":"Stud","structureSpacing":0.3,"structureColor":"white","structureWidth":0.05,"opacity":0,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Foundation","cx":0.3262876024341112,"cy":8.30924735716035,"cz":0.5,"lx":17.72656221415125,"ly":2.5067270349291775,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"n2K3pFpV1Cjm6AUAgZRCTf","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.012664813117774204,"cy":-9.507612927983782,"cz":0.05,"lx":2,"ly":2,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cTpXWFzNLufQycEffsJdCb","color":"#ffffff","enableGroupMaster":false,"notBuilding":true},{"type":"Foundation","cx":0.011699082173905834,"cy":-10.207612261814711,"cz":0.1,"lx":0.2,"ly":2,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"8rgH1Z1kSv9eGuQwDGDKs1","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.011975005300725344,"cy":-10.007612452148733,"cz":0.15,"lx":0.2,"ly":2,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ovbGxMS1g4Zg4nuB4TQqeX","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.01225092842754491,"cy":-9.807612642482752,"cz":0.2,"lx":0.2,"ly":2,"lz":0.4,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mVnVWTdw8vPyh7LrycmxnQ","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.012526851554364421,"cy":-9.607612832816773,"cz":0.25,"lx":0.2,"ly":2,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"wUNxCTFzJEgfzKSgjrd9z5","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.012802774681183987,"cy":-9.407613023150793,"cz":0.3,"lx":0.2,"ly":2,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"53BxN4TGqhcfN2Yd5k8dup","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.013078697808003498,"cy":-9.207613213484814,"cz":0.35,"lx":0.2,"ly":2,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"meWg2dKv2vnU5j91nQfeeo","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.013354620934823008,"cy":-9.007613403818834,"cz":0.4,"lx":0.2,"ly":2,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3mD1fnxQ9fjW7tjkECGw95","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.013630544061642519,"cy":-8.807613594152855,"cz":0.45,"lx":0.2,"ly":2,"lz":0.9,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cLkWHshGLvdq5XN1PjRi3M","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.013906467188462085,"cy":-8.607613784486874,"cz":0.5,"lx":0.2,"ly":2,"lz":1,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"2wfw4Hci4SimT8xLVSR1qM","selected":false,"notBuilding":true},{"type":"Flower","name":"Tall Bush","cx":-9.817715749800067,"cy":-9.852268243951208,"cz":0,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"hL3pAKVFBPkxjTw9uDE2qM","selected":false},{"type":"Flower","name":"Tall Bush","cx":9.939790338917515,"cy":-9.59379601065341,"cz":0,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9JQTdh1CLGJcq2FEuAr43e","selected":false},{"type":"Tree","name":"Magnolia","cx":-12.382557468618694,"cy":-8.982107454472132,"cz":1.7763568394002505e-15,"lx":7.545471252443165,"lz":10.603223623678987,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mz5Bu6Fc74abemkCjnNzj8","selected":false},{"type":"Tree","name":"Linden","cx":13.009119254200783,"cy":-8.749068294142525,"cz":0,"lx":8.011654641868677,"lz":10.603223623678987,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"vRaDd6Us9GPPs1xWHr35Aq","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-1.6973329547002773,"cy":-0.9810097607697941,"cz":0.4999999999999991,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"836Y3qvzoPStkTCKiU6Zim","id":"uW8r9yxCBYBnbmu4mcD2dK","selected":false},{"type":"Flower","name":"Yellow Flower","cx":2.1540732998146876,"cy":-0.7842673436297751,"cz":0.5,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"836Y3qvzoPStkTCKiU6Zim","id":"7rBvK7XUtGC5sWHZd7QXas","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-2.179727293653672,"cy":-0.7583396115954706,"cz":0.5,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"aiFpq1ExRSUpbVmoio8kUd","id":"a8ojsUZ7mU36ELVrWAE4C8","selected":false},{"type":"Flower","name":"Yellow Flower","cx":1.9219781706072183,"cy":-0.6600952948240391,"cz":0.5,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"aiFpq1ExRSUpbVmoio8kUd","id":"6H6en2GXU1wLSxKHPWsjJ6","selected":false},{"type":"Tree","name":"Apple","cx":13.247382515056007,"cy":-1.2331435918787816,"cz":1.7763568394002505e-15,"lx":6.227742361345067,"lz":6.109070444404363,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"242hfQPKKVCMwkg6guH9SJ","selected":false},{"type":"Tree","name":"Apple","flip":true,"cx":13.169742632007722,"cy":5.190500041503218,"cz":-8.881784197001252e-16,"lx":6.227742361345067,"lz":6.109070444404363,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rfSjqDoXAWcYP1QiJK14Ah","selected":false},{"type":"Tree","name":"Pine","cx":-14.749577815037771,"cy":1.149901818018586,"cz":0,"lx":4.512512815610147,"lz":12.024404332399733,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"fy1FkFpbo7uvywjAGwxRuY","selected":false},{"type":"Tree","name":"Pine","flip":true,"cx":-14.371853116942734,"cy":-0.9634768965176921,"cz":0,"lx":4.512512815610147,"lz":8.962712367303366,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"n1AY9F8phLA3eJfdFeLCVt","selected":false},{"type":"Tree","name":"Pine","flip":true,"cx":-15.240052070171995,"cy":2.549040907949193,"cz":0,"lx":7.596612700375146,"lz":7.787173553198613,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"niwq5q77JDU4G8BQsbgERV","selected":false},{"type":"Tree","name":"Magnolia","flip":true,"cx":-14.127046185685298,"cy":-5.909041660781089,"cz":0,"lx":6.24467494419313,"lz":8.23797178206723,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"svLkeNQopLzpZVKNMw4BPh","selected":false},{"type":"Human","name":"Jeff","cx":0.12654793991771474,"cy":-12.447770037532427,"cz":0,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"ggcEZD7jGqKHjY9sjyW651","selected":false,"ly":0.6},{"type":"Human","name":"Jennifer","cx":-1.02983903936377,"cy":-8.19510646529044,"cz":0.550000011920929,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dR4uPsfmhQVuGb7SK23oGM","id":"9A499PNQRGp7jNr6cuTVMi","selected":false,"ly":0.45},{"type":"Human","name":"Jett","cx":0.945405682980855,"cy":-12.320812786564254,"cz":8.881784197001252e-16,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"xyc9SJrxYKnGoZ1JsnzDHM","selected":false,"ly":0.6},{"type":"Window","cx":-0.016104291229904533,"cy":1.8002134679755866,"cz":4.816843659976703,"lx":6.99919664887142,"ly":0.2,"lz":5.817011327539121,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,3.141592653589793],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"f1J4REo4jQv29PCWE7DY9o"},{"type":"Window","cx":-0.05151161986007091,"cy":-4.040746113044766,"cz":4.837111990518853,"lx":6.999674883388914,"ly":0.2,"lz":5.437430983992275,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,0],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"jvY75c4SHrBZnwZVKousju"},{"type":"Window","cx":5.318722507920985,"cy":4.582891269828743,"cz":4.3657952325816325,"lx":3.467667580770554,"ly":0.2,"lz":0.00531143113289233,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,3.141592653589793],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"sX9UU3kudi5NcAve6pMHjM","polygonTop":[0.4836066024850123,5.296892684036137]},{"type":"Window","cx":-5.343537105869802,"cy":4.545906716881224,"cz":4.3717901143583795,"lx":3.4010319442975763,"ly":0.2,"lz":0.1825055927452041,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,3.141592653589793],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"9u53gJyT1Q25rdtt6maYhC","polygonTop":[-0.5,5.2491187506805534]},{"type":"Window","cx":5.259917043757973,"cy":-6.686746145003361,"cz":4.408217868278964,"lx":3.3609664331480253,"ly":0.2,"lz":0.001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,0],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"uhwFXhZdCJ9WRZodgaGM39","polygonTop":[-0.5,5.167549845268113]},{"type":"Window","cx":-5.283116299901134,"cy":-6.676742962528736,"cz":4.409839299161519,"lx":3.2409329250484538,"ly":0.2,"lz":0.020267481118999123,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,0],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"nDuyUhzJ8jfAMyFVHV4a4b","polygonTop":[0.5,5.127516924065475]},{"type":"Window","cx":-7.026900064701883,"cy":-1.1705448238754261,"cz":4.401906118465314,"lx":10.96491542180579,"ly":0.2,"lz":0.05934796066186738,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.24644748988851184,0,4.71238898038469],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"wCvpMZz8wRo6JLVskJvaxa","polygonTop":[-0.002890307610633155,3.539512596657185]},{"type":"Window","cx":7.048045854571776,"cy":-1.093473652020256,"cz":4.390620355845949,"lx":11.034753536063173,"ly":0.2,"lz":0.001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.24644748988851184,0,1.5707963267948963],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"qgitJao18HGfoWkWAG39gT","polygonTop":[-0.009542098130494085,3.625871533157426]}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.695474665244077,9.454611546562601,0.00000942600132651463],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.695474665244077,9.453611169126416,150],"theme":"Forest","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[9.628275537924297,-25.20157333419027,4.240697142180643],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":27.20748283999615,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.5642366854944917,-0.4056742952770788,2.0409440324131825],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":[],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},444:function(e){e.exports=JSON.parse('{"docid":"5VKCiKrWNQyEtr5YBL2CSv","time":"05/22/2023 10:12 am","timestamp":1684764769331,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"noAnimationForSolarPanelSimulation":false,"latitude":42.2844063,"cspTimesPerHour":4,"timesPerHour":1,"noAnimationForSensorDataCollection":false,"noAnimationForSolarUpdraftTowerSimulation":false,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"sutGridCellSize":1,"longitude":-71.3488548,"airConvectiveCoefficient":5,"name":"default","highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"diurnalTemperatureModel":1,"discretization":"Approximate","address":"Natick, MA","noAnimationForHeatmapSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspDaysPerYear":4,"pvGridCellSize":0.5,"airAttenuationCoefficient":0.01,"sutDaysPerYear":4,"date":"9/22/2022, 10:00:00 AM","cspGridCellSize":0.5,"dustLoss":0.05,"daysPerYear":12},"elements":[{"type":"Foundation","ly":15.634026313844405,"normal":[0,0,1],"parentId":"Ground","cz":0.05,"lz":0.1,"solarPowerTower":{},"cy":-2.0978986591875834,"selected":false,"rotation":[0,0,0],"solarAbsorberPipe":{},"id":"x9h6vgTSQ3QLh48G3oYMPN","lx":31.424087209321772,"cx":0.2605383705139097,"solarUpdraftTower":{},"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"lx":23.5,"normal":[0,0,1],"roofId":"viqYpNieXAmEvy7RzMSU7R","lz":12,"cz":6.08075667710203,"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"gYxC2R3CWviHFfEMyEPT1K","leftPoint":[10.73068954852153,7.564003538648882,0.1],"cx":-1.0193104514784697,"type":"Wall","rightJoints":["gAzos6YN4ZktUEWKP98uBq"],"rotation":[0,0,0],"relativeAngle":3.141592653589793,"leftJoints":["iF8yBnVR7zKfNKiVQ7M1op"],"cy":7.564003538648882,"selected":false,"leftRoofHeight":12,"rightRoofHeight":12,"windows":[],"textureType":"Wall Texture Default","ly":0.3,"showLabel":false,"rightPoint":[-12.76931045147847,7.564003538648882,0.1],"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"lz":12,"ly":0.3,"cz":0,"lx":10.5,"showLabel":false,"normal":[0,0,1],"cx":-12.76931045147847,"textureType":"Wall Texture Default","roofId":"viqYpNieXAmEvy7RzMSU7R","cy":2.3140035386488824,"leftJoints":["gYxC2R3CWviHFfEMyEPT1K"],"rightJoints":["56tPe5zv4S5mhoVrSD2NK7"],"leftRoofHeight":12,"leftPoint":[-12.76931045147847,7.564003538648882,0.1],"relativeAngle":4.71238898038469,"rightRoofHeight":12,"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"gAzos6YN4ZktUEWKP98uBq","selected":false,"windows":[],"type":"Wall","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","rightPoint":[-12.76931045147847,-2.9359964613511176,0.1],"rotation":[0,0,0],"centerRoofHeight":[0,15.934734349134846],"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cy":2.3140035386488824,"cx":10.73068954852153,"leftJoints":["56tPe5zv4S5mhoVrSD2NK7"],"roofId":"viqYpNieXAmEvy7RzMSU7R","parentId":"x9h6vgTSQ3QLh48G3oYMPN","showLabel":false,"lz":12,"cz":2.6457488129010285,"leftRoofHeight":12,"textureType":"Wall Texture Default","leftPoint":[10.73068954852153,-2.9359964613511176,0.1],"id":"iF8yBnVR7zKfNKiVQ7M1op","rightJoints":["gYxC2R3CWviHFfEMyEPT1K"],"rightRoofHeight":12,"selected":false,"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","rotation":[0,0,0],"type":"Wall","ly":0.3,"relativeAngle":1.5707963267948966,"centerRoofHeight":[0,15.934734349134846],"windows":[],"lx":10.5,"normal":[0,0,1],"rightPoint":[10.73068954852153,7.564003538648882,0.1],"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"showLabel":false,"id":"56tPe5zv4S5mhoVrSD2NK7","roofId":"viqYpNieXAmEvy7RzMSU7R","cz":5.720174265006714,"type":"Wall","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","lz":12,"lx":23.5,"leftPoint":[-12.76931045147847,-2.935996461351123,0.1],"cy":-2.9359964613511202,"leftJoints":["gAzos6YN4ZktUEWKP98uBq"],"relativeAngle":2.2676895822130855e-16,"windows":[],"rotation":[0,0,0],"rightRoofHeight":12,"selected":false,"leftRoofHeight":12,"normal":[0,0,1],"ly":0.3,"rightJoints":["iF8yBnVR7zKfNKiVQ7M1op"],"cx":-1.0193104514784697,"rightPoint":[10.73068954852153,-2.9359964613511176,0.1],"textureType":"Wall Texture Default","parentId":"x9h6vgTSQ3QLh48G3oYMPN","color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cy":0.1,"parentId":"56tPe5zv4S5mhoVrSD2NK7","cx":-0.3617021276595745,"lz":0.17636142264118151,"cz":0.28681928867940926,"ly":0.3,"normal":[0,0,1],"color":"#ffffff","id":"etKxgbj2UBmFLsuY4i5CJ9","rotation":[0,0,0],"lx":0.1702127659574468,"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","selected":false,"showLabel":false,"type":"Window","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"ly":0.3,"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","rotation":[0,0,0],"lx":0.1702127659574468,"normal":[0,0,1],"id":"nF2Q5EW3FMMGZXhRHjxAya","cy":0.1,"parentId":"56tPe5zv4S5mhoVrSD2NK7","cx":-0.1276595744680851,"selected":false,"type":"Window","lz":0.17636142264118151,"cz":0.28681928867940926,"color":"#ffffff","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"id":"bpUvKGmm3pbG6LoUQVwyUS","lx":0.1702127659574468,"lz":0.17636142264118151,"cx":0.10638297872340426,"rotation":[0,0,0],"type":"Window","color":"#ffffff","cz":0.28681928867940926,"selected":false,"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","ly":0.3,"cy":0.1,"normal":[0,0,1],"parentId":"56tPe5zv4S5mhoVrSD2NK7","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"cz":0.28681928867940926,"id":"cGXdptrFDNmLCsGiAspsDd","lz":0.17636142264118151,"parentId":"56tPe5zv4S5mhoVrSD2NK7","type":"Window","ly":0.3,"cx":0.3404255319148936,"cy":0.1,"color":"#ffffff","selected":false,"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","lx":0.1702127659574468,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"rotation":[0,0,0],"selected":false,"solarPowerTower":{},"cx":-7.538371501184832,"id":"rzzzSn5cSsCh41KW1dZ8o9","parentId":"Ground","lz":0.1,"lx":21.72063547763523,"cy":0.21534781482795487,"solarUpdraftTower":{},"type":"Foundation","ly":4.31333678945802,"solarAbsorberPipe":{},"cz":0.05,"normal":[0,0,1],"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","normal":[0,0,1],"leftRoofHeight":20,"cx":7.057804014514522,"showLabel":false,"id":"gSgPwypYb2qas3tXnXpzu5","rightPoint":[5.057804014514522,1.9532181864937823,0.1],"cz":0,"selected":false,"relativeAngle":3.141592653589793,"cy":1.9532181864937823,"rightJoints":["ne9d3ykDCR9vMZ2sfPqRBL"],"rotation":[0,0,0],"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","parentId":"rzzzSn5cSsCh41KW1dZ8o9","leftJoints":["5spEvKcr5r35ajFtNP5ug4"],"roofId":"bXyFJNv4LJba2AUhe3ZtVT","rightRoofHeight":20,"windows":[],"leftPoint":[9.057804014514522,1.9532181864937823,0.1],"lz":20,"ly":0.3,"lx":4,"textureType":"Wall Texture Default","color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":13.09781600017236,"rightUnfilledHeight":13.09781600017236,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"leftPoint":[9.057804014514522,-2.0467818135062186,0.1],"cy":-0.04678181350621824,"leftJoints":["iY6iwiFa7FE4A2YwRcXYQX"],"rightPoint":[9.057804014514522,1.9532181864937823,0.1],"rightRoofHeight":20,"lx":4,"cz":0,"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","windows":[],"showLabel":false,"leftRoofHeight":20,"parentId":"rzzzSn5cSsCh41KW1dZ8o9","selected":false,"lz":20,"ly":0.3,"normal":[0,0,1],"type":"Wall","cx":9.057804014514522,"rightJoints":["gSgPwypYb2qas3tXnXpzu5"],"rotation":[0,0,0],"textureType":"Wall Texture Default","id":"5spEvKcr5r35ajFtNP5ug4","roofId":"bXyFJNv4LJba2AUhe3ZtVT","relativeAngle":1.5707963267948966,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":13.10125703573121,"rightUnfilledHeight":13.10125703573121,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","selected":false,"lz":20,"windows":[],"rightJoints":["iY6iwiFa7FE4A2YwRcXYQX"],"lx":4,"leftRoofHeight":20,"cz":0,"rightPoint":[5.057804014514522,-2.0467818135062186,0.1],"type":"Wall","cy":-0.04678181350621824,"roofId":"bXyFJNv4LJba2AUhe3ZtVT","relativeAngle":4.71238898038469,"cx":5.057804014514522,"leftPoint":[5.057804014514522,1.9532181864937823,0.1],"rightRoofHeight":20,"ly":0.3,"rotation":[0,0,0],"parentId":"rzzzSn5cSsCh41KW1dZ8o9","textureType":"Wall Texture Default","showLabel":false,"leftJoints":["gSgPwypYb2qas3tXnXpzu5"],"normal":[0,0,1],"id":"ne9d3ykDCR9vMZ2sfPqRBL","color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":13.104325113888441,"rightUnfilledHeight":13.104325113888441,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"ly":0.3,"windows":[],"rightJoints":["5spEvKcr5r35ajFtNP5ug4"],"lx":4,"relativeAngle":0,"leftPoint":[5.057804014514522,-2.0467818135062186,0.1],"lz":20,"rotation":[0,0,0],"type":"Wall","selected":false,"leftRoofHeight":20,"normal":[0,0,1],"cy":-2.0467818135062186,"rightPoint":[9.057804014514522,-2.0467818135062186,0.1],"rightRoofHeight":20,"showLabel":false,"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","id":"iY6iwiFa7FE4A2YwRcXYQX","leftJoints":["ne9d3ykDCR9vMZ2sfPqRBL"],"cz":0,"parentId":"rzzzSn5cSsCh41KW1dZ8o9","roofId":"bXyFJNv4LJba2AUhe3ZtVT","textureType":"Wall Texture Default","cx":7.057804014514522,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":13.110251380374818,"rightUnfilledHeight":13.110251380374818,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"normal":[0,0,1],"lx":0,"cx":0,"cz":0,"cy":0,"roofType":"Pyramid","ly":0,"lz":0,"showLabel":false,"parentId":"rzzzSn5cSsCh41KW1dZ8o9","rotation":[0,0,0],"textureType":"Roof Texture Default","type":"Roof","thickness":0.1,"wallsId":["5spEvKcr5r35ajFtNP5ug4","gSgPwypYb2qas3tXnXpzu5","ne9d3ykDCR9vMZ2sfPqRBL","iY6iwiFa7FE4A2YwRcXYQX"],"id":"bXyFJNv4LJba2AUhe3ZtVT","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","selected":false,"color":"#4d4d4d","rise":2.4214017411934243,"ceiling":false,"locked":false},{"cy":0.1,"cx":0,"cz":0.375,"lz":0.1,"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","ly":0.3,"id":"f3zJpwNA8T36dWKnnLB2Ue","normal":[0,0,1],"parentId":"iY6iwiFa7FE4A2YwRcXYQX","type":"Window","selected":false,"lx":0.5,"rotation":[0,0,0],"showLabel":false,"color":"#ffffff","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"cz":0.375,"showLabel":false,"normal":[0,0,1],"parentId":"5spEvKcr5r35ajFtNP5ug4","lx":0.5,"ly":0.3,"cx":0,"color":"#ffffff","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","selected":false,"lz":0.1,"type":"Window","rotation":[0,0,0],"id":"vLvEkBDowmVtpuRDtw4SXE","cy":0.1,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cy":0.1,"id":"4R8u4ZpfkjtqDvbjmeT7bf","rotation":[0,0,0],"lz":0.2,"selected":false,"cx":-0.2857142857142857,"cz":-0.3,"showLabel":false,"parentId":"iF8yBnVR7zKfNKiVQ7M1op","normal":[0,0,1],"lx":0.09523809523809523,"color":"#ffffff","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","ly":0.3,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"lx":0.09523809523809523,"type":"Window","parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","showLabel":false,"selected":false,"color":"#ffffff","rotation":[0,0,0],"id":"sknCCjfYvoTnoJodNpouJ1","cy":0.1,"cz":-0.3,"normal":[0,0,1],"cx":0.2857142857142857,"lz":0.2,"ly":0.3,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"lz":0.09999999999999998,"rotation":[0,0,0],"id":"eu9mFgyuKTJ1jH9yK9yLSt","color":"#ffffff","ly":0.3,"cy":0.1,"lx":0.3047619047619048,"type":"Window","cx":0,"cz":-0.09999999999999998,"selected":false,"showLabel":false,"parentId":"iF8yBnVR7zKfNKiVQ7M1op","normal":[0,0,1],"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1.1999999999999997,"locked":false},{"type":"Tree","name":"Oak","cx":23.74199340816881,"cy":10.644500397978508,"cz":0,"lx":20,"lz":24,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"b1PLNbuHYXMSFSk3EuJWpe","selected":false,"locked":false},{"type":"Tree","name":"Elm","cx":-11.169257359842945,"cy":-29.31617204471101,"cz":1.7763568394002505e-15,"lx":20,"lz":20,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"7jf8KwAp3jRyyjP9pa5nD6","selected":false,"locked":false},{"type":"Human","name":"Jack","cx":13.450425292803352,"cy":-0.6851982985911116,"cz":0.05000000074505806,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"fEgQo63aax49KtqEdPTNhE","selected":false,"ly":0.42,"locked":false},{"type":"Human","name":"Jena","cx":15.018980097026159,"cy":12.103463958939685,"cz":3.552713678800501e-15,"lx":0.695,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"4BmWg5mgbRSqHZB7i69JCr","selected":false,"ly":0.695,"locked":false},{"type":"Human","name":"Jeff","cx":17.834834093586977,"cy":-13.833037629725366,"cz":0,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"xix4idJ2qyP21RHv281pxk","selected":false,"ly":0.6,"locked":false},{"type":"Human","name":"Jose","cx":19.855346329668855,"cy":-1.5096947835564674,"cz":0,"lx":2,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"swuHMR6JuNqcRU1q2CGzEB","selected":false,"ly":2,"locked":false},{"type":"Human","name":"June","cx":13.437411824806574,"cy":1.7698691218286662,"cz":0.05000000074505806,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"neJBajzFYG5HwTAskcMmid","selected":false,"ly":0.65,"locked":false},{"type":"Door","cx":1.057355261547768e-17,"cy":0,"cz":-0.325,"lx":0.32380952380952377,"ly":0,"lz":0.35000000000000003,"textureType":"Door Texture #2","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"1cqNEbnbmdgjFsj2KffdDW","color":"white","doorType":"Default","archHeight":1,"filled":true,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-11.283173842293113,"cy":-5.011574326559238,"cz":0.05000000074506161,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"1EBzai8Qd5Jq4dWcsiq8La","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-11.271441109375889,"cy":-7.494044638896808,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"o9s9NrSQqGhb4mKxZK73ZY","selected":false,"locked":false},{"type":"Tree","name":"Maple","cx":-4.545943688973082,"cy":-23.537404195497544,"cz":0,"lx":20,"lz":16.05832090138246,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"gkQDZPnaSVr9iatjDLPxBD","selected":false,"locked":false},{"type":"Tree","name":"Oak","cx":15.895794748349687,"cy":24.757130551972956,"cz":0,"lx":16.237525350473454,"lz":14.730013828864193,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"n7bLUe1p1rbbqq2FsGvzJ1","selected":false,"locked":false},{"type":"Tree","name":"Oak","cx":26.48163780671832,"cy":25.18035168450354,"cz":0,"lx":13.930205088796232,"lz":14.730013828864193,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"64YqofbhUQNT1AUUrbAQFL","selected":false,"flip":true,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.2916666666666667,"lx":0.7619047619047619,"ly":0.3,"lz":0.16666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"2akAYnPawwHe5duAcNSm7B","windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.37500000000000006,"lx":0.5,"ly":0.3,"lz":0.09999999999999991,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ne9d3ykDCR9vMZ2sfPqRBL","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","id":"4xy5bj1K9gsNUeeRqMHQ4T","windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":0.23099428957730517,"cy":6.239081888589501,"cz":0,"lx":20,"ly":0.3,"lz":6.986961603131722,"leftJoints":["t1G4LBkeHJCJQyxbr7ccH4"],"rightJoints":["4QQLfJpksW9car6RpJhBza"],"leftPoint":[10.230994289577309,6.2390818885895,0.1],"rightPoint":[-9.769005710422693,6.2390818885894985,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"nRyok2ppvyvZoipPDTMibS","parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"2edgYQtearj95L9ExcxpR8","selected":false,"leftRoofHeight":6.986961603131722,"rightRoofHeight":6.986961603131722,"fill":"Partial","eavesLength":0,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6.886961603131723,"rightUnfilledHeight":6.886961603131723,"leftTopPartialHeight":6.986961603131722,"rightTopPartialHeight":6.986961603131722},{"type":"Wall","cx":0.23099428957730755,"cy":-3.260918111410499,"cz":0,"lx":20,"ly":0.3,"lz":5,"leftJoints":["4QQLfJpksW9car6RpJhBza"],"rightJoints":["t1G4LBkeHJCJQyxbr7ccH4"],"leftPoint":[-9.769005710422693,-3.260918111410501,0.1],"rightPoint":[10.230994289577309,-3.2609181114104966,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#9f0500","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"9Yk7vG95h8gCN8K81b6QsV","parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"2edgYQtearj95L9ExcxpR8","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Window","cx":-0.35,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2ZFQrnmC5HWZdeWiMJGmRx","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.19999999999999996,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p5XsrFbFiHc5cUtkroJ7bZ","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.04999999999999996,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sYLoiFbgR7dHUeBey4QLWg","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.10000000000000005,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"waQ4yFfcYPcnN877Bomdn5","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25000000000000006,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"i4RR7R41FRkfno1WwtTX7f","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.4,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQwvmPAtL9tsANDrDpmVRC","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":10.230994289577309,"cy":1.4890818885894999,"cz":0,"lx":9.5,"ly":0.3,"lz":5,"leftJoints":["9Yk7vG95h8gCN8K81b6QsV"],"rightJoints":["nRyok2ppvyvZoipPDTMibS"],"leftPoint":[10.230994289577309,-3.2609181114105,0.1],"rightPoint":[10.230994289577309,6.2390818885895,0.1],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#9f0500","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"t1G4LBkeHJCJQyxbr7ccH4","parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"2edgYQtearj95L9ExcxpR8","selected":false,"leftRoofHeight":5,"rightRoofHeight":6.986961603131722,"centerRoofHeight":[0.5,6.986961603131722],"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-9.769005710422693,"cy":1.4890818885894987,"cz":0,"lx":9.5,"ly":0.3,"lz":5,"leftJoints":["nRyok2ppvyvZoipPDTMibS"],"rightJoints":["9Yk7vG95h8gCN8K81b6QsV"],"leftPoint":[-9.769005710422693,6.2390818885894985,0.1],"rightPoint":[-9.769005710422693,-3.260918111410501,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#9f0500","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"4QQLfJpksW9car6RpJhBza","parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"2edgYQtearj95L9ExcxpR8","selected":false,"leftRoofHeight":6.986961603131722,"rightRoofHeight":5,"centerRoofHeight":[-0.5,6.986961603131722],"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"id":"2edgYQtearj95L9ExcxpR8","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","roofType":"Gable","roofStructure":"Default","textureType":"Roof Texture Default","thickness":0.1,"wallsId":["9Yk7vG95h8gCN8K81b6QsV"],"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"selected":false,"rise":0,"ceiling":false,"locked":false},{"type":"Flower","name":"Peony","cx":-7.921494529469528,"cy":-5.703131639854222,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"n7MjXwaqUNnrqr7tttq8Xs","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","flip":true,"cx":-6.921494529469528,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"sV3wDCg6jC5jfbaZPhLEFR","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-5.921494529469528,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"5qYyouDiycvWuJ5qvpfENM","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-4.921494529469526,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"d5qiLf7kCJT5AZq7DadTns","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-3.921494529469527,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"wsrTngfrvFcPA2tZXvJ7x3","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","flip":true,"cx":-2.921494529469527,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"afwAGtRYkrpVQnTg7J7Qth","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-1.921494529469527,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"qcKnQw96DTDSeCGHYqMA48","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-0.9214945294695266,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"waxy4TUCBpoD2cd6LrtnaA","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":0.07850547053047338,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"nvZw8LLJYkjMh1JGkRLD3K","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","flip":true,"cx":1.078505470530473,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"cqsNRo9PPkomK9wdkZupc1","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":2.078505470530473,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"jrx4N63zfhzuthq28WtS35","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":3.0785054705304695,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"mxRRf3jQHxj2YV6RTapCHL","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":4.07850547053047,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"nTZ7SBUGqeqonpnPNpk3oW","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","flip":true,"cx":5.07850547053047,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"3dhHbjvLKuWhGK9UjHE6XT","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":6.07850547053047,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"4GeJePH4hCxCTjZtoXxWto","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":7.07850547053047,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"7FGr3ZNRc8Yr5eCEbRFCP4","selected":false,"locked":false},{"type":"Flower","name":"Peony","cx":8.541770761909182,"cy":-5.4564771733354345,"cz":0.05000000074505895,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"j6RLkdyyrwF7fa2EzQWxLx","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":11.033481724703831,"cy":2.4259920840004234,"cz":0.05000000074505895,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"keYgfjtBV5HoobU1c7o3UJ","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":10.99612420253719,"cy":0.2217548731086052,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"vVnzt8ngpeWWaQC4FjAL4j","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":10.959797795589187,"cy":-1.7573623215975718,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"gZMPqGYEq2m24MmNCDDYiG","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-10.392242624146428,"cy":3.263587702330267,"cz":0.050000000745050954,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"6Ub8pCiCnETjVt5AhwfdTF","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-10.422719499264469,"cy":0.5714316192013018,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"66aAYBuCfd3AhjLpHJLkUu","selected":false,"locked":false},{"type":"Foundation","cx":-0.3396050744252213,"cy":11.51965967612361,"cz":0.05,"lx":27.18366746665238,"ly":13.555523568838572,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cLT8u6hCPgvgGLYpma7b1F","selected":false,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Flower","name":"Hydrangea","cx":-10.300379922837644,"cy":-2.268843152966837,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"ageUa3KUftjZpZZ9K9EjET","selected":false,"locked":false},{"type":"Window","cx":-0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j41VCcj3usY83nb7TyLTSz","parentId":"4QQLfJpksW9car6RpJhBza","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2Gb1qNGA9XYJH1M5ngkWgg","parentId":"4QQLfJpksW9car6RpJhBza","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vi8CDjZJjcyCw9PypDyDTY","parentId":"4QQLfJpksW9car6RpJhBza","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ssGXAAom5GmpQtoTEfxLxY","parentId":"t1G4LBkeHJCJQyxbr7ccH4","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jAMmFqujhajRarjA7EnVcV","parentId":"t1G4LBkeHJCJQyxbr7ccH4","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9iqv8Mygk4XdBQpnv3SnAQ","parentId":"t1G4LBkeHJCJQyxbr7ccH4","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.3404255319148936,"cy":0.1,"cz":0.28681928867940926,"lx":0.1702127659574468,"ly":0.3,"lz":0.17636142264118151,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eBsupuArqkdPqdm1NpNRGG","parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.10638297872340426,"cy":0.1,"cz":0.28681928867940926,"lx":0.1702127659574468,"ly":0.3,"lz":0.17636142264118151,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fCtqDhopDBEzVW7mRyhrYJ","parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.1276595744680851,"cy":0.1,"cz":0.28681928867940926,"lx":0.1702127659574468,"ly":0.3,"lz":0.17636142264118151,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ug8Cox9PN3TyFyQqu1r9qK","parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3617021276595745,"cy":0.1,"cz":0.28681928867940926,"lx":0.1702127659574468,"ly":0.3,"lz":0.17636142264118151,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3BwnkPkWjwJcrrLjwf9GLa","parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":-0.25,"lx":0.09523809523809523,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"whn43FxoK2FiHHEsJEgwx9","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.09523809523809523,"cy":0.1,"cz":-0.25,"lx":0.09523809523809523,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1jBLLRwnh7NZy9MTMYQHt2","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.14285714285714285,"cy":0.1,"cz":-0.25,"lx":0.09523809523809523,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5ttkkqMJXFY2rDGZmC9Lzj","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.38095238095238093,"cy":0.1,"cz":-0.25,"lx":0.09523809523809523,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"k8vEiLRG6xxiXgVTPxWxXM","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.37500000000000006,"lx":0.5,"ly":0.3,"lz":0.09999999999999991,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6YKcvoA3eJ8MWWe5Vsy3eT","parentId":"gSgPwypYb2qas3tXnXpzu5","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["56tPe5zv4S5mhoVrSD2NK7"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"viqYpNieXAmEvy7RzMSU7R","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":3.934734349134846,"ceiling":false,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.2916666666666668,"lx":0.7619047619047619,"ly":0.3,"lz":0.16666666666666638,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rk1VAoH8VnjeXMMcRz8iw6","parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"locked":false},{"type":"Window","cx":-0.004761904761904766,"cy":0.1,"cz":0.6791666666666667,"lx":0.23809523809523808,"ly":0.3,"lz":0.125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cdP2JvFiiD6EFxpYXpURLL","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Window","cx":0.014285714285714277,"cy":0.1,"cz":0.6708333333333334,"lx":0.23809523809523808,"ly":0.3,"lz":0.125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7hN73eLMovYtBF2VxtgwGA","parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Light","decay":2,"distance":10,"intensity":10,"color":"#fe9200","cx":0.32491117851716567,"cy":-0.02051365319438737,"cz":22.47091493193306,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,-0.7710068386722702,0.6368268640066874],"rotation":[0.8804206662401132,0,0],"parentId":"bXyFJNv4LJba2AUhe3ZtVT","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","id":"gnMTcek5K3cRDBprwKnFBZ","selected":false,"inside":false,"locked":false},{"type":"Light","decay":2,"distance":10,"intensity":10,"color":"#fe9200","cx":0.002857142857142857,"cy":0,"cz":-0.0025,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[1,0,0],"rotation":[0,0,0],"parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"dpLuhLSSPa19xJpw2Qffsi","selected":false,"locked":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.38095238095238093,"y":-0.125},{"x":-0.38095238095238093,"y":0},{"x":0.38095238095238093,"y":0},{"x":0.38095238095238093,"y":-0.125}],"parentId":"iF8yBnVR7zKfNKiVQ7M1op","parentType":"Wall","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","selected":false,"filled":true,"selectedIndex":2,"id":"sQ3Tb8iVwJfm4J6HcRtiJG","text":"PARADISE FARM","fontColor":"gold","fontSize":1,"noOutline":true,"opacity":0,"locked":false},{"type":"Door","cx":0.02127659574468085,"cy":0,"cz":-0.2708333333333333,"lx":0.5531914893617021,"ly":0,"lz":0.4583333333333333,"doorType":"Default","filled":false,"archHeight":1,"textureType":"No Door Texture","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"9ANMGsRZBmgfHhV2Q1CDCc","locked":false,"interior":true},{"type":"Door","cx":-0.02127659574468085,"cy":0,"cz":-0.2916666666666667,"lx":0.5531914893617021,"ly":0,"lz":0.4166666666666667,"doorType":"Default","filled":false,"archHeight":1,"textureType":"No Door Texture","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"56tPe5zv4S5mhoVrSD2NK7","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"vap2L1NkxsVcWyXHMxiu2p","locked":false,"interior":true},{"solarPowerTower":{},"lx":29.20195847671534,"parentId":"Ground","id":"46TKaVq8pvU97fq25w6FtQ","cx":1.0262187405527392,"lz":0.1,"cy":-11.383349626055136,"normal":[0,0,1],"solarAbsorberPipe":{},"selected":false,"cz":0.05,"solarUpdraftTower":{},"ly":12.71246047298328,"rotation":[0,0,0],"type":"Foundation","locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"cz":0,"windows":[],"relativeAngle":3.141592653589793,"id":"kDP3sGBycYRfxJNAuZJQCx","normal":[0,0,1],"rightJoints":["6i3LR3TEvtE6sm3KPPvawH"],"ly":0.3,"cx":-1.69761452373917,"rotation":[0,0,0],"foundationId":"46TKaVq8pvU97fq25w6FtQ","roofId":"6c49g876wkgGNVBvgTNf4N","lz":6.986961603131722,"selected":false,"cy":6.34147142267982,"rightRoofHeight":6.986961603131722,"rightPoint":[-11.697614523739169,6.34147142267982,0.1],"textureType":"No Wall Texture","leftRoofHeight":6.986961603131722,"showLabel":false,"leftPoint":[8.302385476260831,6.34147142267982,0.1],"type":"Wall","lx":20,"parentId":"46TKaVq8pvU97fq25w6FtQ","leftJoints":["7N5hq7UW6d1NtoD4SxrS8y"],"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6.175009105936305,"rightUnfilledHeight":6.175009105936305,"leftTopPartialHeight":6.986961603131722,"rightTopPartialHeight":6.986961603131722},{"type":"Wall","lz":5,"foundationId":"46TKaVq8pvU97fq25w6FtQ","normal":[0,0,1],"relativeAngle":0,"showLabel":false,"rightJoints":["7N5hq7UW6d1NtoD4SxrS8y"],"leftJoints":["6i3LR3TEvtE6sm3KPPvawH"],"textureType":"Wall Texture Default","leftPoint":[-11.697614523739169,-3.1585285773201797,0.1],"rightPoint":[8.302385476260831,-3.158528577320176,0.1],"id":"6JeFi4vn6AoV5MBuK71Kj4","windows":[],"roofId":"6c49g876wkgGNVBvgTNf4N","rotation":[0,0,0],"lx":20,"cy":-3.1585285773201797,"leftRoofHeight":5,"rightRoofHeight":5,"cz":0,"ly":0.3,"parentId":"46TKaVq8pvU97fq25w6FtQ","selected":false,"cx":-1.69761452373917,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftJoints":["6JeFi4vn6AoV5MBuK71Kj4"],"cy":1.5914714226798203,"roofId":"6c49g876wkgGNVBvgTNf4N","showLabel":false,"windows":[],"type":"Wall","rightJoints":["kDP3sGBycYRfxJNAuZJQCx"],"leftPoint":[8.302385476260831,-3.1585285773201797,0.1],"relativeAngle":1.5707963267948966,"parentId":"46TKaVq8pvU97fq25w6FtQ","normal":[0,0,1],"selected":false,"rotation":[0,0,0],"leftRoofHeight":5,"centerRoofHeight":[0.5,6.986961603131722],"ly":0.3,"lz":5,"id":"7N5hq7UW6d1NtoD4SxrS8y","rightPoint":[8.302385476260831,6.34147142267982,0.1],"foundationId":"46TKaVq8pvU97fq25w6FtQ","rightRoofHeight":6.986961603131722,"lx":9.5,"cz":0,"textureType":"Wall Texture Default","cx":8.302385476260831,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"foundationId":"46TKaVq8pvU97fq25w6FtQ","cx":-11.697614523739169,"id":"6i3LR3TEvtE6sm3KPPvawH","normal":[0,0,1],"type":"Wall","rotation":[0,0,0],"rightRoofHeight":5,"lz":5,"lx":9.5,"rightJoints":["6JeFi4vn6AoV5MBuK71Kj4"],"cz":0,"textureType":"Wall Texture Default","relativeAngle":4.71238898038469,"leftRoofHeight":6.986961603131722,"windows":[],"leftJoints":["kDP3sGBycYRfxJNAuZJQCx"],"showLabel":false,"ly":0.3,"parentId":"46TKaVq8pvU97fq25w6FtQ","leftPoint":[-11.697614523739169,6.34147142267982,0.1],"centerRoofHeight":[-0.5,6.986961603131722],"selected":false,"roofId":"6c49g876wkgGNVBvgTNf4N","rightPoint":[-11.697614523739169,-3.1585285773201797,0.1],"cy":1.5914714226798203,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cy":0,"parentId":"46TKaVq8pvU97fq25w6FtQ","rotation":[0,0,0],"ridgeRightPoint":[0.5,1],"selected":false,"type":"Roof","thickness":0.1,"lz":0,"lx":0,"roofType":"Gable","foundationId":"46TKaVq8pvU97fq25w6FtQ","normal":[0,0,1],"cz":0,"id":"6c49g876wkgGNVBvgTNf4N","cx":0,"textureType":"Roof Texture Default","wallsId":["6JeFi4vn6AoV5MBuK71Kj4"],"ridgeLeftPoint":[-0.5,1],"ly":0,"showLabel":false,"color":"#4d4d4d","roofStructure":"Default","rise":0,"ceiling":false,"locked":false},{"id":"8bXmzpgr9i9JFo2oBsPwmf","foundationId":"46TKaVq8pvU97fq25w6FtQ","type":"Window","lx":0.1,"selected":false,"rotation":[0,0,0],"cx":-0.35,"parentId":"6JeFi4vn6AoV5MBuK71Kj4","color":"#ffffff","cy":0,"normal":[0,0,1],"lz":0.6,"showLabel":false,"ly":0.3,"cz":-0.1,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"cz":-0.1,"color":"#ffffff","id":"xjhgUKTmXdCae92VivseTy","parentId":"6JeFi4vn6AoV5MBuK71Kj4","cx":-0.19999999999999996,"foundationId":"46TKaVq8pvU97fq25w6FtQ","rotation":[0,0,0],"lx":0.1,"type":"Window","normal":[0,0,1],"selected":false,"ly":0.3,"cy":0,"lz":0.6,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"cz":-0.1,"lz":0.6,"cy":0,"type":"Window","color":"#ffffff","parentId":"6JeFi4vn6AoV5MBuK71Kj4","cx":-0.04999999999999996,"id":"kPfc2HWm4ZV8tdUhXMQ1J6","selected":false,"normal":[0,0,1],"ly":0.3,"foundationId":"46TKaVq8pvU97fq25w6FtQ","lx":0.1,"rotation":[0,0,0],"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"lz":0.6,"ly":0.3,"parentId":"6JeFi4vn6AoV5MBuK71Kj4","lx":0.1,"foundationId":"46TKaVq8pvU97fq25w6FtQ","color":"#ffffff","cy":0,"type":"Window","selected":false,"cz":-0.1,"cx":0.10000000000000005,"id":"msWBbsfJmqRnJLeUcmpcgH","normal":[0,0,1],"rotation":[0,0,0],"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"selected":false,"ly":0.3,"color":"#ffffff","foundationId":"46TKaVq8pvU97fq25w6FtQ","type":"Window","rotation":[0,0,0],"parentId":"6JeFi4vn6AoV5MBuK71Kj4","normal":[0,0,1],"cx":0.25000000000000006,"lx":0.1,"id":"1cwhsRjtvJtmfm2tgLVX5c","cy":0,"cz":-0.1,"lz":0.6,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"normal":[0,0,1],"foundationId":"46TKaVq8pvU97fq25w6FtQ","cz":-0.1,"id":"ji1bstwegM7BG7jKCfjWE9","cx":0.4,"parentId":"6JeFi4vn6AoV5MBuK71Kj4","cy":0,"lx":0.1,"type":"Window","ly":0.3,"selected":false,"lz":0.6,"rotation":[0,0,0],"color":"#ffffff","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"ly":0.3,"type":"Window","rotation":[0,0,0],"cy":0.1,"foundationId":"46TKaVq8pvU97fq25w6FtQ","lz":0.4,"parentId":"7N5hq7UW6d1NtoD4SxrS8y","lx":0.10526315789473684,"cx":-0.2631578947368421,"selected":false,"color":"#ffffff","showLabel":false,"cz":0,"id":"4c1wL2gSvqBAbj5Dt9dzzk","normal":[0,0,1],"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Human","name":"Jess","cx":10.850050894558208,"cy":-3.696870042392426,"cz":0.05000000074505806,"lx":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"pnZ17fTrUAQjd7ZGBi4LZw","selected":false,"ly":0.43,"locked":false},{"type":"Flower","name":"Peony","cx":-9.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"r3HRWGLTLtPMP6QPxaP2u9","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-8.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"eB1sPWxNsgKXNP6CKxK1cQ","selected":false,"flip":true,"locked":false},{"type":"Flower","name":"Hosta","cx":-7.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"pmPLWWXJMx6px3ffjyd7Xf","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-6.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"rFPmR6A2xwJwzhvMRvDbF4","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-5.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"3tR1Hnu1k94fCkXYFdPNCZ","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-4.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"ac3W5UphRDEuZMMMxdg9a8","selected":false,"flip":true,"locked":false},{"type":"Flower","name":"Hosta","cx":-3.8501033427860003,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"3j517SjKVEgfCScaEPmkeg","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-2.8501033427860003,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"vLUgsZC1zUxAvajPJX9oRy","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-1.8501033427860003,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"kb5KssfCiZkY9jQ5M4fg79","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-0.8501033427860003,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"rvgmvqqddGgLnhBVWDH5Yi","selected":false,"flip":true,"locked":false},{"type":"Flower","name":"Hosta","cx":0.1498966572139997,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"whxmnRSL5NJSpdaiWxZBom","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":1.1498966572139997,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"hcWpyraDuh7HTi6CTV9t8w","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":2.1498966572139997,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"k3fvYn4xsoNn35srPUnKcM","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":3.1498966572139997,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"rZdFV48y6NMFUVbnDpaSyZ","selected":false,"flip":true,"locked":false},{"type":"Flower","name":"Hosta","cx":4.149896657214,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"codYgSxPq8Vks6hVgvEgs8","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":5.149896657214,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"bTFFYv3CW8yhDsAPYPTsXV","selected":false,"locked":false},{"type":"Flower","name":"Peony","cx":6.613161948592704,"cy":-5.354087639245112,"cz":0.05000000074505895,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"ctEoy8WqpFPS2x5ac3G3Pw","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":9.10487291138736,"cy":2.5283816180907426,"cz":0.05000000074505895,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"kGH6RHxnnVioxpEWe4i5gm","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":9.067515389220716,"cy":0.32414440719892745,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"q26Eg31XYAcejy2Lefy1u6","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":9.031188982272717,"cy":-1.654972787507253,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"5yYM5vzDCoYXugAds8nGWB","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-11.93283136913118,"cy":-0.5875588698031677,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"phZdGJBNMcagm1hqvjyqar","selected":false,"locked":false},{"type":"Window","cx":0.05263157894736842,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"i7D5ks6qD3vrJhaHoUEn98","parentId":"7N5hq7UW6d1NtoD4SxrS8y","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3684210526315789,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xjbyj3NQZe1tdahps4bSB2","parentId":"7N5hq7UW6d1NtoD4SxrS8y","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xARzngwCEN8qLjikbQKjCx","parentId":"6i3LR3TEvtE6sm3KPPvawH","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jdyY9wswVivifuQfer37rz","parentId":"6i3LR3TEvtE6sm3KPPvawH","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8yDD6Xt5pfo9gxGo7Y9zu8","parentId":"6i3LR3TEvtE6sm3KPPvawH","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false}],"sceneRadius":49,"view":{"yearlyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"diurnalTemperaturePanelX":0,"showInstructionPanel":true,"axes":false,"enableRotate":true,"weatherPanelY":0,"cameraPosition":[39.53930781148676,-18.15711200922334,7.49838766552481],"showYearlyUpdraftTowerYieldPanel":false,"showSunAngles":false,"dailyPvYieldPanelX":0,"dailyHeliostatYieldPanelY":0,"showDailyHeliostatYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"showDailyLightSensorPanel":false,"solarRadiationHeatMapReflectionOnly":false,"autoRotate":false,"showWeatherPanel":false,"yearlyParabolicDishYieldPanelX":0,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelX":0,"yearlyPvYieldPanelX":0,"mapType":"roadmap","visibilityResultsPanelX":0,"heliodonPanelY":0,"showYearlyParabolicTroughYieldPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"dailyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"mapPanelX":0,"orthographic":false,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelY":0,"showHeliodonPanel":false,"showDailyFresnelReflectorYieldPanel":false,"heliodon":false,"showMapPanel":false,"shadowEnabled":true,"dailyFresnelReflectorYieldPanelY":0,"showYearlyFresnelReflectorYieldPanel":false,"weatherPanelX":0,"yearlyHeliostatYieldPanelX":0,"dailyLightSensorPanelY":0,"showDiurnalTemperaturePanel":false,"showDailyUpdraftTowerYieldPanel":false,"mapPanelY":0,"dailyPvYieldPanelY":0,"showStickyNotePanel":false,"yearlyUpdraftTowerYieldPanelX":0,"yearlyFresnelReflectorYieldPanelX":0,"groundColor":"forestgreen","dailyHeliostatYieldPanelX":0,"stickyNotePanelX":0,"dailyUpdraftTowerYieldPanelY":0,"showElevationAngle":true,"yearlyFresnelReflectorYieldPanelY":0,"showYearlyHeliostatYieldPanel":false,"mapZoom":18,"panCenter":[3.1489910021809835,1.5743732308094776,7.2061184926881126],"visibilityResultsPanelY":0,"showZenithAngle":true,"stickyNotePanelY":0,"showDesignInfoPanel":false,"yearlyPvYieldPanelY":0,"dailyUpdraftTowerYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"showYearlyLightSensorPanel":false,"heliodonPanelX":0,"theme":"Rural","yearlyLightSensorPanelShowDaylight":false,"groundImage":false,"showAzimuthAngle":true,"ambientLightIntensity":0.1,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"showDailyParabolicDishYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"solarRadiationHeatMapMaxValue":5,"showYearlyPvYieldPanel":false,"yearlyLightSensorPanelShowClearness":false,"showSolarPanelVisibilityResultsPanel":false,"diurnalTemperaturePanelY":0,"yearlyHeliostatYieldPanelY":0,"cameraZoom":19,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[9.76105549939355,6.983359177962507,0.0000040802859234775474],"cameraPosition2D":[9.76105549939355,6.983209171299203,150],"yearlyLightSensorPanelX":0,"showDailyParabolicTroughYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},445:function(e){e.exports=JSON.parse('{"docid":"owwsgdXHDbNagWUrRiAo3n","time":"06/18/2023 07:00 pm","timestamp":1687129219076,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Miami, FL, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":25.7616798,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-80.1917902},"elements":[{"ly":21.382516494600992,"solarUpdraftTower":{},"parentId":"Ground","cx":0.12539468533083742,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.14607588848467667,"type":"Foundation","solarPowerTower":{},"lx":18.404896936058655,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"color":"#cccccc","enableGroupMaster":true,"textureType":"Foundation Texture #2","locked":false},{"type":"Human","name":"Jaye","cx":-2.7072108715724905,"cy":5.7390022883526095,"cz":0.05000000074505806,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.55,"locked":false},{"type":"Human","name":"Jess","cx":8.450674550954435,"cy":-2.040964169794302,"cz":0.05000000074505806,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false,"locked":false},{"type":"Wall","cx":-3.3726189887257103,"cy":8.134829504503935,"cz":0,"lx":7.649489274590845,"ly":0.1,"lz":6,"relativeAngle":2.944169982729981,"leftPoint":[0.3775108703190573,7.384697795521461,0.1],"rightPoint":[-7.1227488477704775,8.88496121348641,0],"leftJoints":["fH1Eycb1edh4ewg8cSm7F2"],"rightJoints":["1fNhHihSFWK4q4YFxM4GxP"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"jtB2mK47EhRe9haPUXWpqu","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":3.6275108703190573,"cy":7.384697795521461,"cz":0,"lx":6.5,"ly":0.1,"lz":6,"relativeAngle":3.141592653589793,"leftPoint":[6.877510870319057,7.384697795521461,0.1],"rightPoint":[0.3775108703190573,7.384697795521461,0.1],"leftJoints":["o3wqaqdyzHo4XWGr2xqwut"],"rightJoints":["jtB2mK47EhRe9haPUXWpqu"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"fH1Eycb1edh4ewg8cSm7F2","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":6.877510870319057,"cy":4.634697795521461,"cz":0,"lx":5.499999999999999,"ly":0.1,"lz":6,"relativeAngle":1.5707963267948966,"leftPoint":[6.877510870319057,1.884697795521462,0.1],"rightPoint":[6.877510870319059,7.384697795521461,0.1],"leftJoints":["vGUEcuvyBtUte9nHKMMtRK"],"rightJoints":["fH1Eycb1edh4ewg8cSm7F2"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"o3wqaqdyzHo4XWGr2xqwut","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":3.627703166633557,"cy":1.884697795521462,"cz":0,"lx":6.501153732383853,"ly":0.1,"lz":6,"relativeAngle":0,"leftPoint":[0.3775108703190573,1.884697795521462,0.1],"rightPoint":[6.877895462948057,1.8846977955214619,0],"leftJoints":["jREcPkJHS2ha1J5przL31q"],"rightJoints":["o3wqaqdyzHo4XWGr2xqwut"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"vGUEcuvyBtUte9nHKMMtRK","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-3.3724891296809427,"cy":2.884697795521462,"cz":0,"lx":7.762087348130012,"ly":0.1,"lz":6,"relativeAngle":6.022582915432245,"leftPoint":[-7.122489129680943,3.884697795521462,0.1],"rightPoint":[0.3775108703190573,1.884697795521462,0.1],"leftJoints":["1fNhHihSFWK4q4YFxM4GxP"],"rightJoints":["vGUEcuvyBtUte9nHKMMtRK"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"jREcPkJHS2ha1J5przL31q","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-7.122489129680943,"cy":6.384697795521461,"cz":0,"lx":4.999999999999999,"ly":0.1,"lz":6,"relativeAngle":4.71238898038469,"leftPoint":[-7.122489129680943,8.884697795521461,0.1],"rightPoint":[-7.122489129680943,3.884697795521462,0.1],"leftJoints":["jtB2mK47EhRe9haPUXWpqu"],"rightJoints":["jREcPkJHS2ha1J5przL31q"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"1fNhHihSFWK4q4YFxM4GxP","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Foundation","cx":4.805913157134036,"cy":-3.6653250376384854,"cz":0.2,"lx":4.565495674711998,"ly":6.575538224210636,"lz":0.4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"krZVQGBw1wVwxak2PssY7v","textureType":"Foundation Texture #5","locked":false,"notBuilding":true},{"type":"Foundation","cx":7.301535582510818,"cy":-3.7151297019599916,"cz":0.25,"lx":0.5,"ly":6.504377225831106,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"iv83XEzdWqY6v8XR5AToXK","color":"#ffffff","locked":false,"notBuilding":true},{"type":"Foundation","cx":2.4329687772478152,"cy":-3.7102946606740073,"cz":0.25,"lx":0.5,"ly":6.504377225831106,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cLXoh6MxU5E5Gva8BASQRm","selected":false,"locked":false,"notBuilding":true},{"type":"Foundation","cx":4.862158322186749,"cy":-0.20866405563399004,"cz":0.25,"lx":5.379502342454104,"ly":0.5,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hzhocB2hGXGCFSJk2wnktz","selected":false,"locked":false,"notBuilding":true},{"type":"Foundation","cx":4.862690579253708,"cy":-7.224281838084487,"cz":0.25,"lx":5.379502342454104,"ly":0.5,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gHY8UXkMn58xRtZAJVDtN6","selected":false,"locked":false,"notBuilding":true},{"type":"Foundation","cx":4.866917615138179,"cy":-7.704867444683629,"cz":0.15,"lx":5.379502342454104,"ly":0.5,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3HGisFhi9kVGUkmKRBhKms","selected":false,"locked":false,"notBuilding":true},{"type":"Window","cx":-3.416070845000482e-17,"cy":0.1,"cz":0.29166666666666663,"lx":0.9230769230769231,"ly":0.3,"lz":0.25000000000000006,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vGUEcuvyBtUte9nHKMMtRK","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"jrakT4hmGTpA5xVoQK7Sx3","locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.000040953643875444483,"cy":0.3,"cz":-0.2833333333333333,"lx":0.9229950157891724,"ly":0.3,"lz":0.39999999999999997,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vGUEcuvyBtUte9nHKMMtRK","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"e19pGWtpLkqWbfXdnaZhjy","locked":false,"frame":true,"frameWidth":0.1,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1,"sillWidth":0},{"type":"Window","cx":-0.2898704818803739,"cy":0.1,"cz":0.29166666666666663,"lx":0.19324698792024925,"ly":0.3,"lz":0.24999999999999992,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"jREcPkJHS2ha1J5przL31q","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"sovEYSXhGEu5Ldj2kgneVg","locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.2254548192402908,"cy":0.1,"cz":0.2916666666666667,"lx":0.19324698792024925,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gFuo9DkFa685GcUxuiuYb8","parentId":"jREcPkJHS2ha1J5przL31q","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2898704818803739,"cy":0.1,"cz":-0.2083333333333333,"lx":0.19324698792024925,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hhZYVdjTizeYL1gPxKSz9p","parentId":"jREcPkJHS2ha1J5przL31q","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.2254548192402908,"cy":0.1,"cz":-0.2083333333333333,"lx":0.19324698792024925,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"28zX4FcaMGFduU6Aof316p","parentId":"jREcPkJHS2ha1J5przL31q","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0033765060398756046,"cy":0.1,"cz":0.29166666666666663,"lx":0.793246987920249,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4MrXBjecJdLy1tjgTVbQVw","parentId":"1fNhHihSFWK4q4YFxM4GxP","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0033765060398756046,"cy":0.1,"cz":-0.20833333333333334,"lx":0.793246987920249,"ly":0.3,"lz":0.25,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"paKeNYdxXEhDFWLKsseJA5","parentId":"1fNhHihSFWK4q4YFxM4GxP","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.29468156152921643,"cy":0.1,"cz":0.29166666666666663,"lx":0.19713085278206485,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u1u3AjVrK7HHdWWARHUbKE","parentId":"jtB2mK47EhRe9haPUXWpqu","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16292275379321294,"cy":0.1,"cz":0.2916666666666667,"lx":0.19713085278206485,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"srk5mHASnPgAUpjbT9uftd","parentId":"jtB2mK47EhRe9haPUXWpqu","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.29468156152921643,"cy":0.1,"cz":-0.2083333333333333,"lx":0.19713085278206485,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tuZbwGt7CbT6QqTZ4sKjKB","parentId":"jtB2mK47EhRe9haPUXWpqu","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16292275379321294,"cy":0.1,"cz":-0.2083333333333333,"lx":0.19713085278206485,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fVyFjpBszkzEvddzxZF4cN","parentId":"jtB2mK47EhRe9haPUXWpqu","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.2139500417756478,"cy":0.1,"cz":0.2916666666666667,"lx":0.27405392970514175,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jgsYPqkQbCLB7nSKYoTQz1","parentId":"fH1Eycb1edh4ewg8cSm7F2","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["jtB2mK47EhRe9haPUXWpqu","1fNhHihSFWK4q4YFxM4GxP","jREcPkJHS2ha1J5przL31q","vGUEcuvyBtUte9nHKMMtRK","o3wqaqdyzHo4XWGr2xqwut","fH1Eycb1edh4ewg8cSm7F2"],"textureType":"No Roof Texture","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"5PVMZuTRFmTCfk2YbWKwPq","locked":false,"rise":0,"ceiling":false},{"type":"Window","cx":0.2139500417756478,"cy":0.1,"cz":-0.2083333333333333,"lx":0.27405392970514175,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iYZGRCyiCoyTmxb2iW91K5","parentId":"fH1Eycb1edh4ewg8cSm7F2","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.24758841976281373,"cy":0.1,"cz":-0.2083333333333333,"lx":0.27405392970514175,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3hXTrx5RjPnoyDuFRCWL2w","parentId":"fH1Eycb1edh4ewg8cSm7F2","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.24758841976281373,"cy":0.1,"cz":0.2916666666666667,"lx":0.27405392970514175,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7TekVwAyTBKGDMvDso7KwN","parentId":"fH1Eycb1edh4ewg8cSm7F2","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.22727272727272732,"cy":0.1,"cz":0.2916666666666667,"lx":0.27272727272727276,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ky3TVidbZJNxBmsHW5p4aV","parentId":"o3wqaqdyzHo4XWGr2xqwut","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.22727272727272732,"cy":0.1,"cz":0.2916666666666667,"lx":0.27272727272727276,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6T5fUwPHMtaFTnJUZ9FeNm","parentId":"o3wqaqdyzHo4XWGr2xqwut","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.22727272727272732,"cy":0.1,"cz":-0.20833333333333334,"lx":0.27272727272727276,"ly":0.3,"lz":0.25,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uH3BNCdk4hWNuoStiax9Mc","parentId":"o3wqaqdyzHo4XWGr2xqwut","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.22727272727272732,"cy":0.1,"cz":-0.20833333333333334,"lx":0.27272727272727276,"ly":0.3,"lz":0.25,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4JcJH5e4rWagE4s7pxc2vr","parentId":"o3wqaqdyzHo4XWGr2xqwut","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Tree","name":"Coconut","cx":-3.5174202973352635,"cy":-5.952506495142959,"cz":0.050000000745058504,"lx":3.421252972867562,"lz":5.8824455683270385,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"r4PU1mJTsD7Dm4DCSTQbEk","selected":false,"locked":false},{"type":"Tree","name":"Coconut","flip":true,"cx":-4.056727114780923,"cy":-6.820925912328164,"cz":0.05000000074505806,"lx":3.421252972867562,"lz":3.7067838832176516,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qYjmrdb86SDT3egVhi2Ddg","selected":false,"locked":false},{"type":"Tree","name":"Coconut","flip":true,"cx":-3.058157215251919,"cy":-5.348879217798858,"cz":0.05000000074505806,"lx":2.0761240579059335,"lz":3.468323603426934,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7qTMbix1j6GoFy9o8Dge8Q","selected":false,"locked":false},{"type":"Tree","name":"Pine","flip":true,"cx":-6.654527859836286,"cy":-7.991796862008116,"cz":0.05000000074505806,"lx":2.811171334227782,"lz":5.2304806796050185,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"hgWXQayK9bDxaZTKFMFyaj","selected":false,"locked":false},{"type":"Tree","name":"Pine","flip":false,"cx":-6.145316897074318,"cy":-8.056698018196002,"cz":0.050000000745058504,"lx":2.1110953047223546,"lz":3.545986285890324,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5NPZQ3kADKqz5pZRjy2r8m","selected":false,"locked":false},{"type":"Flower","name":"Spirea","cx":8.102181299831539,"cy":4.045842994396765,"cz":0.05000000074505806,"lx":1.8,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"taF3ALjLpVssdzRj5rkAQQ","selected":false,"locked":false},{"type":"Flower","name":"Spirea","cx":-5.879762709897744,"cy":1.4043677766482918,"cz":0.05000000074502964,"lx":1.8,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"j5yY2k9GT68hDzGzo8g4X5","selected":false,"locked":false},{"type":"Flower","name":"Spirea","cx":-8.163745041032497,"cy":5.853168143382562,"cz":0.05000000074505806,"lx":1.8,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"wQLFTPCoFnPyshTWJztWv8","selected":false,"locked":false},{"type":"Flower","name":"Spirea","cx":-2.279762709897744,"cy":1.4043677766482918,"cz":0.05000000074502964,"lx":1.8,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8nf4FW7PRbc5MHE74z6k6X","selected":false,"locked":false},{"type":"Flower","name":"Boxwood","cx":8.755439698619178,"cy":-3.801559677962663,"cz":0.050000000745058504,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3Me2yqTX69xpAQdJimGv6J","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-3.7656917519971405,"cy":-7.189954744763735,"cz":0.050000000745057616,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"b8dhYx3mLo55GMwpAMANF4","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-2.9954361886672194,"cy":-6.017555062549365,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"aD6qe37bZZVXu7NhL9YCyw","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-2.5427971092417136,"cy":-4.3436146516258916,"cz":0.05000000074505717,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"6Z7HQYvZ4Ls1JaGM7AfPk1","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-5.573500548190964,"cy":-8.097341718681303,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"igiDoKTCbe5rQ5p9LftFTF","selected":false,"locked":false},{"type":"Human","name":"Judd","cx":7.8538131049134385,"cy":-5.07106737312789,"cz":0.05000000074505828,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3PTeJ2nnhnU1658gE9hwVj","selected":false,"locked":false,"ly":0.544},{"type":"Human","name":"Jeff","cx":1.3294328409358478,"cy":0.0073529482213468,"cz":0.1500000059604645,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3HGisFhi9kVGUkmKRBhKms","id":"vmxzjFWTAjwTqms6QcsEP3","selected":false,"locked":false,"ly":0.6},{"type":"Human","name":"Jamelia","flip":true,"cx":8.040674150226515,"cy":-6.334084712275156,"cz":0.05000000074505806,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5Qsgp8Gq1Jr7PUZmxevYZR","selected":false,"locked":false,"ly":0.65},{"type":"Human","name":"Jennifer","cx":-0.9884229521541545,"cy":3.585869160830872,"cz":0.05000000074505806,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"sjU37oco1BJnmRhataWCxf","selected":false,"ly":0.45},{"type":"Tree","name":"Fan Palm","cx":-3.0053849919153564,"cy":-3.8414595688219437,"cz":0.05000000074505806,"lx":3.3292228289929944,"lz":4.535630581080736,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"72iSoNbD98zvpFJ2Q1mmkB","selected":false},{"type":"Flower","name":"Hosta","flip":true,"cx":-3.557645718087297,"cy":-6.494909623054461,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"fixSsPsLT9YGgQ2atTquS7","selected":false},{"type":"Flower","name":"Hosta","cx":-2.8775394857306047,"cy":-4.995547826339774,"cz":0.05000000074505717,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rGgsLECHRG1JrsuPt4Zkbs","selected":false},{"type":"Flower","name":"Hosta","flip":true,"cx":-2.6007319365603525,"cy":-5.483479639543539,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"2RrpkK93q9tXhZRqF6FvrT","selected":false},{"type":"Flower","name":"Hosta","flip":true,"cx":-2.14120900487017,"cy":-4.690834516460342,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"eXNFmUTqaatU1h8XmR1dnP","selected":false},{"type":"Flower","name":"Hosta","cx":-2.251092230304847,"cy":-3.591429672886945,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"ro5BfNTKQSaGfLx4eKBnio","selected":false},{"type":"Light","decay":2,"distance":6,"intensity":8,"color":"#009ce0","cx":-0.0668233149685919,"cy":0.05804493333085005,"cz":0.500000007450585,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"hjub9esH6NqUMrKoM4qiEZ","selected":false},{"type":"Light","decay":2,"distance":6,"intensity":8,"color":"#009ce0","cx":0.4297365503834882,"cy":-0.1789222334700641,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"6aGXSJXX1kvmEvo5FpXMaw","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":8,"color":"#fe9200","cx":0.0692403262735466,"cy":0.2196827525166444,"cz":6.2,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5PVMZuTRFmTCfk2YbWKwPq","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"432pe1oLqRcmTRcAYqgtqG","selected":false,"inside":true},{"type":"Light","decay":2,"distance":6,"intensity":8,"color":"#fe9200","cx":-0.17601132104075962,"cy":-0.3273891737363795,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"iMv2LJEW81uJy7BUGUKL83","selected":false},{"type":"Polygon","cx":-0.020412282064186955,"cy":-0.023334577896438075,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.03636363636363637,"y":-0.08333333333333333},{"x":-0.1272727272727273,"y":-0.08333333333333333},{"x":-0.05454545454545455,"y":-0.03333333333333333},{"x":-0.09090909090909093,"y":0.049999999999999996},{"x":0,"y":0},{"x":0.09090909090909093,"y":0.049999999999999996},{"x":0.05454545454545455,"y":-0.03333333333333333},{"x":0.1272727272727273,"y":-0.08333333333333333},{"x":0.03636363636363637,"y":-0.08333333333333333},{"x":0,"y":-0.16666666666666666}],"parentId":"o3wqaqdyzHo4XWGr2xqwut","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":1,"id":"bM2XuLbGojMjjtTq6QbXqK","lineColor":"#4d4d4d","noOutline":false,"text":"26","fontSize":0.3,"fontColor":"gold","fontOutlineWidth":0.01,"lineWidth":1}],"sceneRadius":14,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0.7599467981478756,-5.067346033277178,-0.000005027848075881249],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0.7599467981478756,-5.067496039946536,150],"theme":"Rural","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[15.236325505747509,-7.86777235732635,2.457105139993579],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":75.89554049207442,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-1.6563214275080296,1.8214306688802133,2.457105139993578],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},446:function(e){e.exports=JSON.parse('{"docid":"hPTJuLgPgoJuMRXMJ2VDBS","time":"06/15/2023 03:10 pm","timestamp":1686856228122,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"5/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":10.473983232081025,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.22738864151314608,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.8212100903152009,"type":"Foundation","solarPowerTower":{},"lx":13.564552414056891,"lz":0.08037925094719676,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"enableGroupMaster":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":0,"lx":12,"relativeAngle":3.141592653589793,"lz":4.0189625473598385,"roofId":"nbw17kYeUHp1aouuScuF3Y","ly":0.3,"rightPoint":[-5.457020109151015,3.478026472724187,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[6.542979890848985,3.478026472724187,0.1],"type":"Wall","rightRoofHeight":4.0189625473598385,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4.0189625473598385,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.5429798908489842,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":3.478026472724187,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385,"locked":true},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.542979890848985,"leftPoint":[6.542979890848985,-4.021973527275812,0.1],"cy":-0.27197352727581237,"leftRoofHeight":4.0189625473598385,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.542979890848985,3.478026472724187,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":7.5,"normal":[0,0,1],"lz":4.0189625473598385,"centerRoofHeight":[-0.022465454047944533,6.807600955038734],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":1.2992388529678256,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","rightRoofHeight":4.0189625473598385,"roofId":"nbw17kYeUHp1aouuScuF3Y","color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385,"locked":true},{"lx":7.5,"windows":[],"lz":4.0189625473598385,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"nbw17kYeUHp1aouuScuF3Y","selected":false,"cy":-0.27197352727581237,"cz":2.586710917765224,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0.022465454047944533,6.807600955038734],"rightPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4.0189625473598385,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.457020109151015,3.478026472724187,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4.0189625473598385,"ly":0.3,"cx":-5.457020109151015,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385,"locked":true},{"showLabel":false,"cx":0.5429798908489842,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.542979890848985,-4.021973527275812,0.1],"cz":2.4938633836176103,"textureType":"Wall Texture Default","cy":-4.021973527275812,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"nbw17kYeUHp1aouuScuF3Y","leftPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"ly":0.3,"lz":4.0189625473598385,"leftRoofHeight":4.0189625473598385,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4.0189625473598385,"lx":12,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385,"locked":true},{"type":"Foundation","ly":9.17890503672627,"lz":0.06478560897373455,"rotation":[0,0,0],"cz":0.05,"cx":-3.0123969578104886,"lx":2.997193198016322,"parentId":"Ground","solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"solarUpdraftTower":{},"normal":[0,0,1],"cy":-1.5649990896825194,"id":"8fpWrU7qVyVgipB7LtABom","hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"showLabel":false,"cz":3.903941909848086,"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","lz":5.674455425565713,"ly":0.3,"leftRoofHeight":5.674455425565713,"relativeAngle":3.141592653589793,"rightRoofHeight":5.674455425565713,"leftJoints":["4Q8KDQDxyuamkEtRJU3paR"],"lx":2.13057265557637,"windows":[],"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"rightJoints":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Wall Texture Default","cx":-0.011530025051640469,"leftPoint":[1.0537563027365446,1.8025200094198752,0],"type":"Wall","rightPoint":[-1.0768163528398256,1.8025200094198752,0],"id":"bKLMq3WjuxRcsMDb5d4Xo1","cy":1.8025200094198752,"normal":[0,0,1],"selected":false,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","centerRoofHeight":[0,6.808247394681429],"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.9689600797771365,"rightUnfilledHeight":3.9689600797771365,"leftTopPartialHeight":5.674455425565713,"rightTopPartialHeight":5.674455425565713,"locked":true},{"normal":[0,0,1],"leftJoints":["7xigJB2WiCCrREDc2Ja3YN"],"lz":5.674455425565713,"selected":false,"ly":0.3,"cz":3.5644394786617815,"id":"4Q8KDQDxyuamkEtRJU3paR","rotation":[0,0,0],"cy":0.250986023416642,"rightJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"leftPoint":[1.0537563027365446,-1.3005479625865912,0],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","textureType":"Wall Texture Default","cx":1.053756302736545,"showLabel":false,"leftRoofHeight":5.674455425565713,"foundationId":"8fpWrU7qVyVgipB7LtABom","relativeAngle":1.5707963267948963,"windows":[],"rightRoofHeight":5.674455425565713,"type":"Wall","parentId":"8fpWrU7qVyVgipB7LtABom","rightPoint":[1.0537563027365453,1.8025200094198752,0],"lx":3.1030679720064667,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.020600140222275,"rightUnfilledHeight":4.020600140222275,"leftTopPartialHeight":5.674455425565713,"rightTopPartialHeight":5.674455425565713,"locked":true},{"rightJoints":["7xigJB2WiCCrREDc2Ja3YN"],"parentId":"8fpWrU7qVyVgipB7LtABom","showLabel":false,"leftRoofHeight":5.674455425565713,"selected":false,"id":"1ATAe6P2KAHKLDSDfpVro9","leftJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"textureType":"Wall Texture Default","cx":-1.0768163528398256,"rightPoint":[-1.0768163528398256,-1.3005479625865912,0],"lz":5.674455425565713,"relativeAngle":-1.5707963267948966,"normal":[0,0,1],"type":"Wall","cz":3.660138480027889,"rotation":[0,0,0],"leftPoint":[-1.0768163528398256,1.8025200094198752,0],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","foundationId":"8fpWrU7qVyVgipB7LtABom","lx":3.1030679720064667,"cy":0.250986023416642,"windows":[],"ly":0.3,"rightRoofHeight":5.674455425565713,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5.674455425565713,"rightUnfilledHeight":3.92594971520268,"leftTopPartialHeight":5.674455425565713,"rightTopPartialHeight":5.674455425565713,"locked":true},{"ly":0,"cx":0,"type":"Roof","thickness":0.1,"ridgeLeftPoint":[0.022465454047944533,1],"textureType":"Roof Texture #1","showLabel":false,"lz":0,"normal":[0,0,1],"ridgeRightPoint":[-0.022465454047944533,1],"wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"selected":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0,"roofType":"Gable","id":"nbw17kYeUHp1aouuScuF3Y","parentId":"m7AH7DcnoGzAq9kryBy4RS","cz":0,"rotation":[0,0,0],"lx":0,"color":"#666666","rise":2.7886384076788957,"ceiling":true,"locked":true},{"rightPoint":[1.0537563027365446,-1.3005479625865912,0],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","selected":false,"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"cx":-0.011530025051640469,"ly":0.3,"relativeAngle":0,"cz":3.535805069111796,"rightJoints":["4Q8KDQDxyuamkEtRJU3paR"],"leftRoofHeight":5.674455425565713,"rightRoofHeight":5.674455425565713,"id":"7xigJB2WiCCrREDc2Ja3YN","normal":[0,0,1],"leftPoint":[-1.0768163528398256,-1.3005479625865912,0],"type":"Wall","cy":-1.3005479625865912,"leftJoints":["1ATAe6P2KAHKLDSDfpVro9"],"lz":5.674455425565713,"windows":[],"showLabel":false,"textureType":"Wall Texture Default","lx":2.13057265557637,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","centerRoofHeight":[0,6.808247394681429],"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.143662209927734,"rightUnfilledHeight":4.143662209927734,"leftTopPartialHeight":5.674455425565713,"rightTopPartialHeight":5.674455425565713,"locked":true},{"normal":[0,0,1],"rotation":[0,0,0],"lz":0.08037925094719676,"cz":0.05,"solarPowerTower":{},"parentId":"Ground","ly":2.3229214459557985,"lx":3.6868215598526417,"cx":6.688554173396975,"solarUpdraftTower":{},"cy":0.40327666182062216,"solarAbsorberPipe":{},"id":"3KgcTmNBqtYJcCny8HxQyQ","type":"Foundation","selected":false,"notBuilding":true,"locked":true},{"id":"5eUwuiBwfGoNEpcHG5kHqK","lx":1.5,"leftJoints":["h8DQWwUSgNc283RWhcM3B1"],"rightPoint":[-0.5114783908278628,0.8698262658360515,0.1],"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftPoint":[0.9885216091721372,0.8698262658360515,0.1],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","textureType":"Wall Texture #3","cz":0,"cx":0.23852160917213716,"selected":false,"rotation":[0,0,0],"windows":[],"normal":[0,0,1],"ly":0.2,"lz":7.234132585247709,"showLabel":false,"cy":0.8698262658360515,"rightJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"type":"Wall","relativeAngle":3.141592653589793,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.234132585247709,"rightTopPartialHeight":7.234132585247709,"locked":true},{"type":"Wall","leftPoint":[-0.5114783908278628,0.8698262658360515,0.1],"rotation":[0,0,0],"cy":0.1198262658360515,"lz":7.234132585247709,"textureType":"Wall Texture #3","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","ly":0.2,"rightJoints":["qQNV4qND1aDjEtJsd6HVio"],"lx":1.4999999999999998,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","windows":[],"selected":false,"leftJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"showLabel":false,"id":"hbU2xUbmKEDDXYDMWnjjCc","relativeAngle":4.71238898038469,"rightPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"normal":[0,0,1],"cz":0,"cx":-0.5114783908278628,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.234132585247709,"rightTopPartialHeight":7.234132585247709,"locked":true},{"leftPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"cy":-0.6301737341639485,"rightJoints":["h8DQWwUSgNc283RWhcM3B1"],"rightPoint":[0.9885216091721372,-0.6301737341639485,0.1],"cz":0,"windows":[],"lz":7.234132585247709,"selected":false,"rotation":[0,0,0],"ly":0.2,"relativeAngle":0,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","normal":[0,0,1],"leftJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"textureType":"Wall Texture #3","parentId":"3KgcTmNBqtYJcCny8HxQyQ","lx":1.5,"showLabel":false,"cx":0.23852160917213716,"type":"Wall","id":"qQNV4qND1aDjEtJsd6HVio","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.234132585247709,"rightTopPartialHeight":7.234132585247709,"locked":true},{"id":"h8DQWwUSgNc283RWhcM3B1","type":"Wall","relativeAngle":1.5707963267948966,"normal":[0,0,1],"windows":[],"leftPoint":[0.9885216091721372,-0.6301737341639485,0.1],"cz":0,"rightJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"selected":false,"textureType":"Wall Texture #3","ly":0.2,"cx":0.9885216091721372,"lx":1.5,"cy":0.1198262658360515,"rightPoint":[0.9885216091721372,0.8698262658360515,0.1],"showLabel":false,"lz":7.234132585247709,"rotation":[0,0,0],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftJoints":["qQNV4qND1aDjEtJsd6HVio"],"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.234132585247709,"rightTopPartialHeight":7.234132585247709,"locked":true},{"type":"Window","showLabel":false,"ly":0.3,"lz":0.44384979425833565,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.09751468078404088,"selected":false,"cx":-0.4166666666666667,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","frame":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.1219248971291678,"normal":[0,0,1],"cx":-0.25,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"cx":0.25,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#ffffff","cz":-0.1219248971291678,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0.3,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":1,"shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.4166666666666667,"cy":0.1,"cz":-0.09751468078404088,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0.3,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","frame":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"lz":0.3942112571821837,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#ffffff","lx":0.13333333333333333,"cx":0.3333333333333333,"cz":-0.09710562859109184,"ly":0.3,"showLabel":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"ly":0.3,"selected":false,"type":"Window","foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0,"cz":0.5913168857732756,"id":"9k4wgdGyyHM5BC1r2nJbQH","lx":0.13333333333333333,"color":"#ffffff","lz":0.3942112571821837,"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","rotation":[0,0,0],"cx":0,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"ly":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.3333333333333333,"rotation":[0,0,0],"type":"Window","lz":0.3942112571821837,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":-0.09710562859109184,"lx":0.13333333333333333,"color":"#ffffff","cy":0.1,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Tree","name":"Pine","cx":11.005948677853029,"cy":-1.394052607962342,"cz":3.552713678800501e-15,"lx":6.452035166159083,"lz":9.139816695798023,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"t5Aj8tjjpqVaLaB3uEqfR8","selected":false,"locked":true},{"type":"Window","cx":-0.25833333333333336,"cy":-1.3376344861350336e-15,"cz":-0.08,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.26666666666666666,"cy":-1.1010413489448665e-14,"cz":-0.08,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Wall","cx":-0.15054541065002525,"cy":1.76763937363111,"cz":3.903941909848086,"lx":7.859980732011655,"ly":0.1,"lz":3.8503419054045027,"leftJoints":["qdWCAVU64LNURAh8wmzrJW"],"rightJoints":["5SVe8cv2nsyRKR6jszXPqq"],"leftPoint":[3.779444955355803,1.76763937363111,0.06056023612846141],"rightPoint":[-4.08053577665585,1.76763937363111,0.06056023612846141],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eYz6mrLsdVMWcgpJiTXXtH","parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofId":"9SPVWHTRZMkvFFbvi4Y4dK","leftRoofHeight":3.8503419054045027,"rightRoofHeight":3.8503419054045027,"selected":false,"studWidth":0.1,"studColor":"white","opacity":0,"wallStructure":"Stud","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.8503419054045027,"rightTopPartialHeight":3.8503419054045027,"locked":true},{"type":"Wall","cx":3.779444955355803,"cy":0.10818511446824708,"cz":3.5644394786617815,"lx":3.3189085183257268,"ly":0.1,"lz":3.442308777851562,"leftJoints":["9YsY5P23SDcYcTLJeEGMo8"],"rightJoints":["eYz6mrLsdVMWcgpJiTXXtH"],"leftPoint":[3.779444955355803,-1.5512691446946167,0.06056023612846141],"rightPoint":[3.779444955355805,1.76763937363111,0.06056023612846141],"relativeAngle":1.570796326794896,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qdWCAVU64LNURAh8wmzrJW","parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofId":"9SPVWHTRZMkvFFbvi4Y4dK","leftRoofHeight":3.442308777851562,"rightRoofHeight":3.8503419054045027,"centerRoofHeight":[0.5,3.8503419054045027],"selected":false,"studWidth":0.1,"wallStructure":"Stud","opacity":0.25,"studSpacing":1.6,"studColor":"white","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.442308777851562,"rightTopPartialHeight":3.442308777851562,"locked":true},{"type":"Wall","cx":-4.08053577665585,"cy":0.10818511446824708,"cz":3.660138480027889,"lx":3.3189085183257268,"ly":0.1,"lz":3.442308777851562,"leftJoints":["eYz6mrLsdVMWcgpJiTXXtH"],"rightJoints":["9YsY5P23SDcYcTLJeEGMo8"],"leftPoint":[-4.08053577665585,1.76763937363111,0.06056023612846141],"rightPoint":[-4.08053577665585,-1.5512691446946167,0.06056023612846141],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5SVe8cv2nsyRKR6jszXPqq","parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofId":"9SPVWHTRZMkvFFbvi4Y4dK","leftRoofHeight":3.8503419054045027,"rightRoofHeight":3.442308777851562,"centerRoofHeight":[-0.5,3.8503419054045027],"selected":false,"wallStructure":"Stud","opacity":0.25,"studWidth":0.1,"studSpacing":1.6,"studColor":"white","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.442308777851562,"rightTopPartialHeight":3.442308777851562,"locked":true},{"type":"Wall","cx":-0.15054541065002525,"cy":-1.5512691446946167,"cz":3.535805069111796,"lx":7.859980732011655,"ly":0.1,"lz":3.442308777851562,"leftJoints":["5SVe8cv2nsyRKR6jszXPqq"],"rightJoints":["qdWCAVU64LNURAh8wmzrJW"],"leftPoint":[-4.08053577665585,-1.5512691446946167,0.06056023612846141],"rightPoint":[3.779444955355803,-1.5512691446946167,0.06056023612846141],"relativeAngle":0,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9YsY5P23SDcYcTLJeEGMo8","parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofId":"9SPVWHTRZMkvFFbvi4Y4dK","leftRoofHeight":3.442308777851562,"rightRoofHeight":3.442308777851562,"selected":false,"studWidth":0.1,"wallStructure":"Stud","opacity":0.25,"studColor":"white","studSpacing":2,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.442308777851562,"rightTopPartialHeight":3.442308777851562,"locked":true},{"id":"9SPVWHTRZMkvFFbvi4Y4dK","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.1,"wallsId":["9YsY5P23SDcYcTLJeEGMo8"],"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"selected":false,"translucent":true,"rafterSpacing":2,"roofStructure":"Rafter","rise":0,"ceiling":false,"locked":true},{"type":"Foundation","cx":0.4816835699661557,"cy":-4.8267180085139945,"cz":0.05,"lx":9.870953390145004,"ly":4.194004820393555,"lz":0.04867786417191091,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"91GS1aZ3DbZBjAVtatsatL","selected":false,"notBuilding":true,"locked":true},{"type":"Door","cx":0,"cy":0,"cz":-0.2,"lx":0.25,"ly":0,"lz":0.6,"textureType":"Door Texture #6","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"huHgxbUk5nxatnYiuq2HhR","doorType":"Default","archHeight":1,"filled":true,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"7MxSmgNk4kQf8eNqmnwjMJ","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":1.1337919691157152,"ceiling":false,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.46576840681624293,"lx":0.34364727930476036,"ly":0.3,"lz":0.15525613560541424,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7xigJB2WiCCrREDc2Ja3YN","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"bKSng9YxxhEwLmca6q52t4","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"frameWidth":0.06,"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1,"locked":true},{"type":"Wall","cx":-0.011530025051640469,"cy":1.8025200094198752,"cz":3.903941909848086,"lx":2.13057265557637,"ly":0.3,"lz":5.665479357106698,"leftJoints":["gjFo4dGKiFsEAtvgC2uCdo"],"rightJoints":["28JZn5ZqftnjWtvDA7sVWD"],"leftPoint":[1.0537563027365446,1.8025200094198752,0],"rightPoint":[-1.0768163528398256,1.8025200094198752,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3J2f3hD7LiPYocNLAGAHn1","parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofId":"rEidR5TzysvNG1rgGa79ag","leftRoofHeight":5.665479357106698,"rightRoofHeight":5.665479357106698,"centerRoofHeight":[0,6.765479357106699],"selected":false,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.17087314092728,"rightUnfilledHeight":4.17087314092728,"leftTopPartialHeight":5.665479357106698,"rightTopPartialHeight":5.665479357106698,"locked":true},{"type":"Wall","cx":1.053756302736545,"cy":0.250986023416642,"cz":3.5644394786617815,"lx":3.1030679720064667,"ly":0.3,"lz":5.665479357106698,"leftJoints":["fWZF78k9YENmcxHia3M4iF"],"rightJoints":["3J2f3hD7LiPYocNLAGAHn1"],"leftPoint":[1.0537563027365446,-1.3005479625865912,0],"rightPoint":[1.0537563027365453,1.8025200094198752,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gjFo4dGKiFsEAtvgC2uCdo","parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofId":"rEidR5TzysvNG1rgGa79ag","leftRoofHeight":5.665479357106698,"rightRoofHeight":5.665479357106698,"selected":false,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.2501718067420615,"rightUnfilledHeight":5.665479357106698,"leftTopPartialHeight":5.665479357106698,"rightTopPartialHeight":5.665479357106698,"locked":true},{"type":"Wall","cx":-1.0768163528398256,"cy":0.250986023416642,"cz":3.660138480027889,"lx":3.1030679720064667,"ly":0.3,"lz":5.665479357106698,"leftJoints":["3J2f3hD7LiPYocNLAGAHn1"],"rightJoints":["fWZF78k9YENmcxHia3M4iF"],"leftPoint":[-1.0768163528398256,1.8025200094198752,0],"rightPoint":[-1.0768163528398256,-1.3005479625865912,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"28JZn5ZqftnjWtvDA7sVWD","parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofId":"rEidR5TzysvNG1rgGa79ag","leftRoofHeight":5.665479357106698,"rightRoofHeight":5.665479357106698,"selected":false,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.112382106286621,"rightUnfilledHeight":4.112382106286621,"leftTopPartialHeight":5.665479357106698,"rightTopPartialHeight":5.665479357106698,"locked":true},{"type":"Wall","cx":-0.011530025051640469,"cy":-1.3005479625865912,"cz":3.535805069111796,"lx":2.13057265557637,"ly":0.3,"lz":5.665479357106698,"leftJoints":["28JZn5ZqftnjWtvDA7sVWD"],"rightJoints":["gjFo4dGKiFsEAtvgC2uCdo"],"leftPoint":[-1.0768163528398256,-1.3005479625865912,0],"rightPoint":[1.0537563027365446,-1.3005479625865912,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fWZF78k9YENmcxHia3M4iF","parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofId":"rEidR5TzysvNG1rgGa79ag","leftRoofHeight":5.665479357106698,"rightRoofHeight":5.665479357106698,"centerRoofHeight":[0,6.765479357106699],"selected":false,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.243512040075365,"rightUnfilledHeight":4.243512040075365,"leftTopPartialHeight":5.665479357106698,"rightTopPartialHeight":5.665479357106698,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.46576840681624293,"lx":0.34364727930476036,"ly":0.3,"lz":0.15525613560541424,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gAS9MDKRJP4JWvfqrqBKdy","parentId":"fWZF78k9YENmcxHia3M4iF","foundationId":"nu2sn9efF1AHCFrvuV5ULi","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.06,"windowType":"Default","archHeight":1,"locked":true},{"id":"rEidR5TzysvNG1rgGa79ag","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.1,"wallsId":["28JZn5ZqftnjWtvDA7sVWD"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rise":1.1,"ceiling":false,"locked":true},{"type":"Foundation","cx":3.6575623433664717,"cy":-1.54061534072674,"cz":0.05,"lx":2.997193198016322,"ly":9.17890503672627,"lz":0.06468312864431171,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nu2sn9efF1AHCFrvuV5ULi","selected":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"type":"Door","cx":0,"cy":0,"cz":-0.18779489182743653,"lx":0.13333333333333333,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #1","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"eBQam4YYdXWFEi5iDbVQ4t","doorType":"Default","archHeight":1,"filled":true,"locked":true},{"type":"Tree","name":"Apple","cx":-8.870480061609383,"cy":-0.6721812852789775,"cz":0,"lx":4.272747980812545,"lz":4.234704800641296,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"oGL2siNwwXoicUvtQoHfi3","selected":false,"locked":true},{"type":"Human","name":"Jamelia","cx":0.5077215094390786,"cy":-5.182357959116953,"cz":0,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"havSSZEB6mAoQ1s57LQVxN","selected":false,"ly":0.65,"locked":true},{"type":"Human","name":"Jack","cx":-7.974613533200657,"cy":-4.521571410086505,"cz":8.881784197001252e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fPgwwBmXz2LWV9vPRMmqzu","selected":false,"ly":0.42,"locked":true},{"type":"Flower","name":"Hosta","cx":-6.306441231413446,"cy":-4.762303364786677,"cz":4.440892098500626e-16,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"1cAkMnRPZL6fG1dhWuUn14","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":6.169203623475488,"cy":-5.72637309429814,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"htN99q9wA5PLZNcJh1UgLF","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-5.061905234310647,"cy":-5.806918097592128,"cz":-1.7763568394002505e-15,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"j1Fmf7QNoHATgNqGSJnptk","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":5.621277500928149,"cy":-6.190060319204097,"cz":-8.881784197001252e-16,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"b8aTi9NKLHSRuN9DAY2Dvd","selected":false,"locked":true},{"type":"Flower","name":"Tall Bush","cx":5.615846305114406,"cy":-5.453095801875909,"cz":0.040189623832702644,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"84bbtLrAVMTpW8zhkv6ac6","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":6.558445661570947,"cy":-5.148346193790616,"cz":0,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7PKC5BECKBBX3d4Za7d4Du","selected":false,"locked":true},{"type":"Flower","name":"Red Rose","cx":-5.407028367581802,"cy":-5.549301025270703,"cz":0,"lx":0.5,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"s9wwdrqZHX68urRnmZ9bDp","selected":false,"locked":true},{"type":"Flower","name":"Tall Bush","cx":-4.834800784349908,"cy":-4.621520750635222,"cz":0,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"vKDYbBm1LFSeCRbRGxpJzR","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":-5.746710484862029,"cy":-5.268820363710504,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qrfLBQvCQkPzUhnUEFDgC1","selected":false,"locked":true},{"type":"Flower","name":"Red Rose","cx":5.955104289170869,"cy":-5.9761317798049545,"cz":0,"lx":0.5,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"daEJUZv3vgUrqorbyNtAdL","selected":false,"locked":true},{"type":"Flower","name":"Red Rose","cx":6.380681139084028,"cy":-5.4372416572511035,"cz":0,"lx":0.5,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"oCHH6YeZ2ebkct1XeVw26T","selected":false,"locked":true},{"type":"Flower","name":"Red Rose","cx":-6.0720221613270775,"cy":-5.14772584317228,"cz":0,"lx":0.5,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"kAuo84ejkCrSVu9PCaPugg","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":1.6210802629879084,"cy":-8.23340133659074,"cz":0,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"kmbR9RJMfaDSwNReuSKCjQ","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":3.611880585955519,"cy":-8.204961331976918,"cz":0,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"8bs3duj4DEPj8B5fQB6m61","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-0.5688000922764606,"cy":-8.261841341204562,"cz":0,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"xiFfAWcKYuiBh744RUaZyc","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-2.844000461382297,"cy":-8.261841341204562,"cz":0,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"wV1JQBxQxSUBFz9dC7xrav","selected":false,"locked":true},{"type":"Tree","name":"Pine","cx":11.504343484441804,"cy":-0.763939147024864,"cz":0,"lx":5.1791034594942555,"lz":5.428693136268209,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"iVXpvVvo7CVsBLdZiLcmV8","selected":false,"flip":true,"locked":true},{"type":"Tree","name":"Pine","cx":14.030494530217624,"cy":0.04081963902747532,"cz":0,"lx":4.05233280460769,"lz":7.181542362302404,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wTP4kg9xyU48nnBEmn3ppV","selected":false,"locked":true},{"type":"Foundation","cx":0.30925292274615623,"cy":-1.2101326772862784,"cz":0.05,"lx":6.745176508169567,"ly":8.157824691427903,"lz":0.0627727643414778,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"j26S3yBrW81Hpmua4v9rbN","selected":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"type":"Wall","cx":0.0036303018672041443,"cy":1.418731310908802,"cz":3.903941909848086,"lx":6.727305402522589,"ly":0.3,"lz":6.620718306713466,"leftJoints":["9SCrAqQSk4xVacCdSJE3pn"],"rightJoints":["8Vadn4BSVDAC5WjSkKfgzz"],"leftPoint":[3.367283003128499,1.418731310908802,0],"rightPoint":[-3.3600223993940905,1.418731310908802,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5AKBX2BV6amQvk312dBM8B","parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","studWidth":0.1,"roofId":"vKXQiCBzbfpPSTJ27J8jBB","selected":false,"leftRoofHeight":6.620718306713466,"rightRoofHeight":6.620718306713466,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.324926656434854,"rightUnfilledHeight":4.324926656434854,"leftTopPartialHeight":6.620718306713466,"rightTopPartialHeight":6.620718306713466,"locked":true},{"type":"Wall","cx":3.3672830031285006,"cy":-0.062237916432278606,"cz":3.5644394786617815,"lx":2.961938454682161,"ly":0.3,"lz":5.64147421981503,"leftJoints":["dTWEdcfdTXFV5sEPVRd8z5"],"rightJoints":["5AKBX2BV6amQvk312dBM8B"],"leftPoint":[3.367283003128499,-1.5432071437733592,0],"rightPoint":[3.367283003128503,1.418731310908802,0],"relativeAngle":1.5707963267948952,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9SCrAqQSk4xVacCdSJE3pn","parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","studWidth":0.1,"roofId":"vKXQiCBzbfpPSTJ27J8jBB","selected":false,"leftRoofHeight":5.64147421981503,"rightRoofHeight":6.620718306713466,"centerRoofHeight":[0.5,6.620718306713466],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.092459386252685,"rightUnfilledHeight":4.092459386252685,"leftTopPartialHeight":5.64147421981503,"rightTopPartialHeight":5.64147421981503,"locked":true},{"type":"Wall","cx":-3.3600223993940905,"cy":-0.062237916432278606,"cz":3.660138480027889,"lx":2.961938454682161,"ly":0.3,"lz":5.64147421981503,"leftJoints":["5AKBX2BV6amQvk312dBM8B"],"rightJoints":["dTWEdcfdTXFV5sEPVRd8z5"],"leftPoint":[-3.3600223993940905,1.418731310908802,0],"rightPoint":[-3.3600223993940905,-1.5432071437733592,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8Vadn4BSVDAC5WjSkKfgzz","parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","studWidth":0.1,"roofId":"vKXQiCBzbfpPSTJ27J8jBB","selected":false,"leftRoofHeight":6.620718306713466,"rightRoofHeight":5.64147421981503,"centerRoofHeight":[-0.5,6.620718306713466],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.9233710526843555,"rightUnfilledHeight":3.9233710526843555,"leftTopPartialHeight":5.64147421981503,"rightTopPartialHeight":5.64147421981503,"locked":true},{"type":"Wall","cx":0.0036303018672041443,"cy":-1.5432071437733592,"cz":3.535805069111796,"lx":6.727305402522589,"ly":0.3,"lz":5.64147421981503,"leftJoints":["8Vadn4BSVDAC5WjSkKfgzz"],"rightJoints":["9SCrAqQSk4xVacCdSJE3pn"],"leftPoint":[-3.3600223993940905,-1.5432071437733592,0],"rightPoint":[3.367283003128499,-1.5432071437733592,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dTWEdcfdTXFV5sEPVRd8z5","parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","studWidth":0.1,"roofId":"vKXQiCBzbfpPSTJ27J8jBB","selected":false,"leftRoofHeight":5.64147421981503,"rightRoofHeight":5.64147421981503,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.163695339993486,"rightUnfilledHeight":4.163695339993486,"leftTopPartialHeight":5.64147421981503,"rightTopPartialHeight":5.64147421981503,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","roofStructure":"Default","wallsId":["dTWEdcfdTXFV5sEPVRd8z5"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"vKXQiCBzbfpPSTJ27J8jBB","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"rise":0,"ceiling":false,"locked":true},{"type":"Window","cx":0,"cy":0.3,"cz":0.40953276837441766,"lx":0.44594377993825984,"ly":0.3,"lz":0.14548273694573843,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"dTWEdcfdTXFV5sEPVRd8z5","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"r1RG4byiDKweDnNzMe6Uqt","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.31833333333333336,"cy":0.1,"cz":-0.12239672405306627,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nkKGWu3sRWjy8kWKFV8wES","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.30833333333333335,"cy":0.1,"cz":-0.09751468078404088,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e4784e1QWCibptuMbZE3Fb","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.4506499123046388,"cy":-2.253829215918892,"cz":5.495676945306635,"lx":6.517117804983129,"ly":0.1,"lz":3.1452722458300313,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"miUkiQAMUrUH9VdizU1QHd","locked":true},{"type":"Window","cx":-0.040529886594876885,"cy":0.3,"cz":0.36293328834815236,"lx":0.6611308564654793,"ly":0.3,"lz":0.23883190909923116,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"28JZn5ZqftnjWtvDA7sVWD","parentType":"Wall","foundationId":"nu2sn9efF1AHCFrvuV5ULi","id":"xq6zsNgL6KPAX41MXZ3EbC","locked":true},{"type":"Window","cx":0.02441680094832896,"cy":0.3,"cz":0.35427189383741103,"lx":0.6933570277585752,"ly":0.3,"lz":0.2562105393925967,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"4Q8KDQDxyuamkEtRJU3paR","parentType":"Wall","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"qcnFPvRmcmP1h3bepT45qh","locked":true},{"type":"Window","cx":4.296638448514275,"cy":-2.708258875969741,"cz":5.141848441701093,"lx":0.8645085564531798,"ly":0.1,"lz":1.937214690596396,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"cMbDioVwT4kfspCSxauDDf","polygonTop":[-0.5,1.125032012484936],"locked":true},{"type":"Window","cx":-3.3098661063241783,"cy":-2.738630134883686,"cz":5.118200739891894,"lx":0.6049071605861784,"ly":0.1,"lz":2.2332848397709752,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"vbnhFbrJ9782uVqEAWSbqW","polygonTop":[0.5,0.9018556681153167],"locked":true},{"type":"Window","cx":1.0937607455840728,"cy":0.6467227885963354,"cz":5.73187840674332,"lx":2.4176106129913375,"ly":0.1,"lz":0.16460115006383247,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8165400713416964,0,1.5707963267948963],"parentId":"7MxSmgNk4kQf8eNqmnwjMJ","parentType":"Roof","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"wCFZjtmrD2b8mTn1f1qano","polygonTop":[0.5,1.0560439311761334],"locked":true},{"type":"Window","cx":-1.0462741509941371,"cy":1.4199114403224693,"cz":5.8069617126253155,"lx":0.9242462576351369,"ly":0.1,"lz":0.1721360167476046,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8165400713416961,0,4.71238898038469],"parentId":"7MxSmgNk4kQf8eNqmnwjMJ","parentType":"Roof","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"kdtAstd8jE9ACZ3TfHUAZb","polygonTop":[-0.5,0.99155281262393],"locked":true},{"type":"Window","cx":-1.1170172726431056,"cy":0.5138568052522039,"cz":5.723968440623406,"lx":2.596092763357134,"ly":0.1,"lz":0.082389128100567,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8014286985579611,0,4.71238898038469],"parentId":"rEidR5TzysvNG1rgGa79ag","parentType":"Roof","foundationId":"nu2sn9efF1AHCFrvuV5ULi","id":"7Y1EoQrhcqZsSLDF4LmMiA","polygonTop":[-0.5,1.2214855671184548],"locked":true},{"type":"Window","cx":1.0534033913747818,"cy":1.2212640151421539,"cz":5.765843768521558,"lx":1.130053534424075,"ly":0.1,"lz":0.020226846288053643,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8014286985579612,0,1.5707963267948963],"parentId":"rEidR5TzysvNG1rgGa79ag","parentType":"Roof","foundationId":"nu2sn9efF1AHCFrvuV5ULi","id":"x4QzPw1xK8z1dYWnRSPfDD","polygonTop":[0.5,1.214791037762756],"locked":true},{"type":"Window","cx":0.428377511975304,"cy":0.3,"cz":0.36902546903156846,"lx":0.11351539072017484,"ly":0.3,"lz":0.22649733563143687,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"dTWEdcfdTXFV5sEPVRd8z5","parentType":"Wall","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"rGAmTgsinEVfLmLsgxtKCo","locked":true},{"type":"Window","cx":-0.428377511975304,"cy":0.3,"cz":0.3671875531695516,"lx":0.11351539072017484,"ly":0.3,"lz":0.2228215039074031,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"dTWEdcfdTXFV5sEPVRd8z5","parentType":"Wall","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"tcZghwrXjxrMrPYG8qWmMK","locked":true},{"type":"Window","cx":-2.887838483851968,"cy":-1.5429231830507752,"cz":5.741568099840816,"lx":1.1156980571027848,"ly":0.1,"lz":0.006652456667148232,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3192968291527907,0,0],"parentId":"vKXQiCBzbfpPSTJ27J8jBB","parentType":"Roof","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"iAta14nH255gL4E1skBYr2","polygonTop":[-0.5,3.135049288439095],"locked":true},{"type":"Window","cx":2.9643296778973105,"cy":-1.5489835426240144,"cz":5.739564489243441,"lx":0.977937957633503,"ly":0.1,"lz":0.09523764867628905,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3192968291527907,0,0],"parentId":"vKXQiCBzbfpPSTJ27J8jBB","parentType":"Roof","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"p89tc6ji5qG8UFCeVeXzs6","polygonTop":[0.5,3.0552575653113068],"locked":true}],"sceneRadius":20,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.94522901824079,-1.0741381728239148,-0.00000107590488899985],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.94522901824079,-1.075138550271241,150],"theme":"Forest","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-4.574738869546006,-17.12597647560641,2.6902980037557214],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":45.44146361606706,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#3a8569","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.8575132784294428,-0.32342939215259475,2.6902980037557214],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},447:function(e){e.exports=JSON.parse('{"docid":"tn5NXrCgVkn7A5sexifmrP","time":"02/04/2023 01:00 pm","timestamp":1675533609468,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"6/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"M4J3+GMR, Rue de La Kasbah, Kairouan, Tunisia","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":35.6813583,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.25,"name":"default","longitude":10.1041467},"elements":[{"type":"Wall","cx":-1.5357911804424789,"cy":-8.147946678658776,"cz":2.268765007024547,"lx":41.99999999999999,"ly":0.5,"lz":10,"leftJoints":["pV4i6Rv9Vpys7aXEi9nnh4"],"rightJoints":["m87y7C5QvZwH9XgiqzyDsg"],"leftPoint":[-22.535791180442477,-8.147946678658771,0.25],"rightPoint":[19.464208819557516,-8.147946678658784,0.25],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tKvexMf8zrvPgydcZb5VYA","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"q6GhCTYocV8Du6Z7WCqnGz","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"leftRoofHeight":10,"rightRoofHeight":10,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Foundation","cx":1.290269817272435,"cy":-3.5970579374045144,"cz":0.125,"lx":65.10485687395563,"ly":44.85538565072669,"lz":0.25,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"color":"#999999"},{"type":"Wall","cx":19.46420881955751,"cy":2.1020533213412156,"cz":0,"lx":20.5,"ly":0.5,"lz":10,"relativeAngle":1.5707963267948966,"leftPoint":[19.464208819557516,-8.147946678658784,0.25],"rightPoint":[19.46420881955751,12.352053321341215,0.25],"leftJoints":["tKvexMf8zrvPgydcZb5VYA"],"rightJoints":["3u1tb8n3XMJZXYU3udLNqv"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"m87y7C5QvZwH9XgiqzyDsg","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"q6GhCTYocV8Du6Z7WCqnGz","leftRoofHeight":10,"rightRoofHeight":10,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-1.5357911804424824,"cy":12.352053321341218,"cz":0,"lx":42,"ly":0.5,"lz":10,"relativeAngle":3.141592653589793,"leftPoint":[19.464208819557516,12.352053321341216,0.25],"rightPoint":[-22.535791180442484,12.35205332134122,0.25],"leftJoints":["m87y7C5QvZwH9XgiqzyDsg"],"rightJoints":["pV4i6Rv9Vpys7aXEi9nnh4"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"3u1tb8n3XMJZXYU3udLNqv","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"q6GhCTYocV8Du6Z7WCqnGz","leftRoofHeight":10,"rightRoofHeight":10,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-22.535791180442498,"cy":2.1020533213412165,"cz":0,"lx":20.500000000000007,"ly":0.5,"lz":10,"relativeAngle":4.712388980384689,"leftPoint":[-22.535791180442484,12.35205332134122,0.25],"rightPoint":[-22.535791180442505,-8.147946678658787,0.25],"leftJoints":["3u1tb8n3XMJZXYU3udLNqv"],"rightJoints":["tKvexMf8zrvPgydcZb5VYA"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"pV4i6Rv9Vpys7aXEi9nnh4","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"q6GhCTYocV8Du6Z7WCqnGz","leftRoofHeight":10,"rightRoofHeight":10,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Human","name":"Jaah","cx":-20.815616879711254,"cy":-18.576078606733773,"cz":0.125,"lx":0.74,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"oS4Uf1aJoiB2V9pQqWTsVG","selected":false,"ly":0.74},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.5,"roofType":"Pyramid","roofStructure":"Default","wallsId":["3u1tb8n3XMJZXYU3udLNqv","pV4i6Rv9Vpys7aXEi9nnh4","tKvexMf8zrvPgydcZb5VYA","m87y7C5QvZwH9XgiqzyDsg"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"q6GhCTYocV8Du6Z7WCqnGz","sideColor":"#ffffff","rise":0,"ceiling":false},{"type":"Door","cx":-0.4107142857142858,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"doorType":"Arched","archHeight":1,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"jXmzH2ciK425Fb6dH2EkVp","filled":false},{"type":"Door","cx":-0.3214285714285715,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"3Ypjy6UAE7xHgadjTDfe2a","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":-0.2321428571428572,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"mMiEmbz3vkGVE8tUbXxgNQ","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":-0.1428571428571429,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"tPuRheQMuGYu1gmyqi6c4s","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":-0.0535714285714286,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"qCzzF9bXjrUUQcTszp1SPS","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.0357142857142857,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"r6qnpYnu8yvZzEEeE2fqps","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.125,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"bYotwM3kh8YucfABgu8Eot","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.2142857142857143,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"bH3GWXsdZcQF9JUubCPadp","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.3035714285714286,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"hgaMdHTtMAFGSJgPw6fbgW","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.3928571428571429,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"tcvaKKEqJwZ2KN8UScxvAs","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Wall","cx":-2.0348646464512568,"cy":-10.275504500010312,"cz":2.268765007024547,"lx":38.88254641036014,"ly":0.5,"lz":16,"leftJoints":["iC5vVUbJMtmDkNzYUxBZPA"],"rightJoints":["mM4PcE69DPCUHMXtdYUR1q"],"leftPoint":[-21.47613785163133,-10.275504500010307,0.1],"rightPoint":[17.406408558728813,-10.275504500010317,0.1],"relativeAngle":-2.741111892188643e-16,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tHwdHqDmQXFhmVBYpGMk1M","parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"wyopmFLrEU8Q6F3Eo2E8qH","leftRoofHeight":16,"rightRoofHeight":16,"selected":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"type":"Wall","cx":17.406408558728813,"cy":-1.3101914721012853,"cz":0,"lx":17.930626055818067,"ly":0.5,"lz":16,"leftJoints":["tHwdHqDmQXFhmVBYpGMk1M"],"rightJoints":[],"leftPoint":[17.406408558728813,-10.275504500010317,0.1],"rightPoint":[17.406408558728806,7.655121555807748,0.1],"relativeAngle":1.5707963267948972,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mM4PcE69DPCUHMXtdYUR1q","parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"wyopmFLrEU8Q6F3Eo2E8qH","leftRoofHeight":16,"rightRoofHeight":16,"selected":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"type":"Wall","cx":-21.476137851631343,"cy":-1.310191472101287,"cz":0,"lx":17.930626055818067,"ly":0.5,"lz":16,"leftJoints":[],"rightJoints":["tHwdHqDmQXFhmVBYpGMk1M"],"leftPoint":[-21.476137851631336,7.655121555807748,0.1],"rightPoint":[-21.47613785163135,-10.275504500010321,0.1],"relativeAngle":-1.5707963267948977,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iC5vVUbJMtmDkNzYUxBZPA","parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"wyopmFLrEU8Q6F3Eo2E8qH","leftRoofHeight":16,"rightRoofHeight":16,"selected":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"id":"wyopmFLrEU8Q6F3Eo2E8qH","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.5,"wallsId":["iC5vVUbJMtmDkNzYUxBZPA","tHwdHqDmQXFhmVBYpGMk1M","mM4PcE69DPCUHMXtdYUR1q"],"selected":false,"sideColor":"#ffffff","rise":0,"ceiling":false},{"type":"Foundation","cx":1.7183157358311596,"cy":-0.28833946443478364,"cz":0.05,"lx":53.43283132966065,"ly":36.15762103719206,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hNbyNzvcTVK1vEJxa83hcL","selected":false,"color":"#999999"},{"type":"Window","cx":-0.4346423153885066,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tq5v5MiQZt5qstbgFWnvG5","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.32662469854639264,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tnAiVDN8QFPpM8tgevRmcN","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.21860708170427864,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3nMYyTwN3Em3zi1cHJC4sf","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.1105894648621647,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cCAyiJ9wpmzcPpyPdhfiCf","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.0025718480200507404,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eez2P3itr5bZkDqccZV8JD","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.10544576882206322,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kUi59wGAijZzpxe2ea5yGk","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.21346338566417716,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5BkQRXptjCjpMLBbuit7LG","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.32148100250629114,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wW8MUuXM3xqHEL2sbQVtzB","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.42949861934840516,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ccgRRcvFN2ruATRvwGX84y","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":-0.39880952380952384,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"i5fduT9idUyGfEykeAwxhP","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":-0.30952380952380953,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"fRizbSvKJ8g4Q7BkTDodnJ","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":-0.22023809523809523,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"e1sFSDmTNZ4sZ9Y1VTweWG","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":-0.13095238095238093,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"4JvvxD5ReU3HCb3rrCJfqu","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":-0.04166666666666664,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"rxe4vXzmMs9ks1UPKMsMHJ","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.047619047619047644,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"qM4GDTxt6ZN2Tk8zN9epmX","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.13690476190476195,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"gWzssvMidARJ4cQ7NE4iEX","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.22619047619047625,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"wVBpJ6rUX7jujyXvbCDuGG","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.3154761904761905,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"rywUBEaEaD2kzBC78kTd66","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.4047619047619048,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"4sh9rckArBRiLDTvRhk9XE","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.21875,"lx":0.951583767418624,"ly":0,"lz":0.5625,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","id":"4yyor28faKUByr4PZBcCtd"},{"type":"Wall","cx":-2.0348646464512603,"cy":7.655121555807748,"cz":0,"lx":38.88254641036015,"ly":0.5,"lz":16,"leftJoints":["mM4PcE69DPCUHMXtdYUR1q"],"rightJoints":["iC5vVUbJMtmDkNzYUxBZPA"],"leftPoint":[17.406408558728813,7.655121555807748,0.1],"rightPoint":[-21.476137851631336,7.655121555807748,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2mZ55xAX1KuR3Q2dngP1w","parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"wyopmFLrEU8Q6F3Eo2E8qH","leftRoofHeight":16,"rightRoofHeight":16,"selected":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"type":"Window","cx":-0.43652041374223555,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"u5zqDbkaAjTXDXvkwuoihC","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3285027969001216,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kKyDa7cDgjAnQgNANR1HWe","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.22048518005800757,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nw4CtWvmwcVC5Xe1THkFLF","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.11246756321589363,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"x6kokyu7Qezd9q5C3o2tsm","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.00444994637377967,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fnjqZxGUX54z9mXbXLiiRE","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.10356767046833429,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tdwDQUv17oBgAFyg3P4xM6","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.21158528731044823,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hUp1krohSEg7azNVaFn5Vi","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3196029041525622,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rnUJCj9zp9Q9MtSBUyxpSr","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.42762052099467623,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bDgdCWe9fUHArD8KxnxhgG","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":-0.006429620050125837,"cy":0,"cz":-0.21875,"lx":0.9387245273183722,"ly":0,"lz":0.5625,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","id":"mwADv6B5ue7JfsfTJPh6bK"},{"type":"Foundation","cx":27.211897808892417,"cy":-2.277125937112275,"cz":0.1,"lx":7.862239275491355,"ly":8.18645532809304,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jo2xWjh3Cc1HQacSqq3RwZ","enableGroupMaster":true},{"type":"Wall","cx":-0.20148632007026634,"cy":1.8550497672374595,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":30,"relativeAngle":3.1415926535897927,"leftPoint":[0.6411062725223289,1.8550497672374595],"rightPoint":[-1.0440789126628616,1.85504976723746],"leftJoints":["npFbHBHE2K2JqNLhKJ6X3t"],"rightJoints":["cJ3MHxSdHF6NBdtBsFYUrC"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"63M4Ay9XbnqNvAk8QywH63","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4836133028186254,"cy":1.4489577998324776,"cz":0,"lx":1.19683109271183,"ly":0.3,"lz":30,"relativeAngle":-2.3957214089984347,"leftPoint":[-1.0440789126628616,1.85504976723746],"rightPoint":[-1.9231476929743891,1.0428658324274953],"leftJoints":["63M4Ay9XbnqNvAk8QywH63"],"rightJoints":["pkGthR3DucyAx4LwcC1Kdd"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"cJ3MHxSdHF6NBdtBsFYUrC","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.9231476929743891,"cy":0.20030911625962777,"cz":0,"lx":1.685113432335735,"ly":0.3,"lz":30,"relativeAngle":-1.5707963267948966,"leftPoint":[-1.9231476929743891,1.0428658324274953],"rightPoint":[-1.9231476929743891,-0.6422475999082398],"leftJoints":["cJ3MHxSdHF6NBdtBsFYUrC"],"rightJoints":["myGwrCaTTUQ5A7LpQkLGdD"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"pkGthR3DucyAx4LwcC1Kdd","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4836133028186254,"cy":-1.0787123486711252,"cz":0,"lx":1.2388574688675817,"ly":0.3,"lz":30,"relativeAngle":-0.7818940174543654,"leftPoint":[-1.9231476929743891,-0.6422475999082398],"rightPoint":[-1.0440789126628616,-1.5151770974340102],"leftJoints":["pkGthR3DucyAx4LwcC1Kdd"],"rightJoints":["167KXvNm8cDcHPx8xW946K"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"myGwrCaTTUQ5A7LpQkLGdD","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-0.20148632007026634,"cy":-1.5151770974340102,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":30,"relativeAngle":0,"leftPoint":[-1.0440789126628616,-1.5151770974340102],"rightPoint":[0.6411062725223289,-1.5151770974340102],"leftJoints":["myGwrCaTTUQ5A7LpQkLGdD"],"rightJoints":["4N88hDYexmoMCfgkuoD5Rh"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"167KXvNm8cDcHPx8xW946K","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.0624025688186265,"cy":1.433771409153526,"cz":0,"lx":1.1915805038063918,"ly":0.3,"lz":30,"relativeAngle":2.356215779952568,"leftPoint":[1.483698865114924,1.0124930510695922],"rightPoint":[0.6411062725223289,1.85504976723746],"leftJoints":["2Ew2MEjMkmHhJiQ9oqAGU2"],"rightJoints":["63M4Ay9XbnqNvAk8QywH63"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"npFbHBHE2K2JqNLhKJ6X3t","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.483698865114924,"cy":0.16993633490172466,"cz":0,"lx":1.6851134323357353,"ly":0.3,"lz":30,"relativeAngle":1.5707963267948966,"leftPoint":[1.483698865114924,-0.6726203812661429],"rightPoint":[1.483698865114924,1.0124930510695922],"leftJoints":["4N88hDYexmoMCfgkuoD5Rh"],"rightJoints":["npFbHBHE2K2JqNLhKJ6X3t"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"2Ew2MEjMkmHhJiQ9oqAGU2","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.0626642442323444,"cy":-1.0937037083639525,"cz":0,"lx":1.192226389921747,"ly":0.3,"lz":30,"relativeAngle":0.7852978318515466,"leftPoint":[0.6411062725223289,-1.5151770974340102],"rightPoint":[1.4842222159423528,-0.6722303192938943],"leftJoints":["167KXvNm8cDcHPx8xW946K"],"rightJoints":["2Ew2MEjMkmHhJiQ9oqAGU2"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"4N88hDYexmoMCfgkuoD5Rh","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-0.7345405315369007,"cy":2.2012354524785778,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":20,"leftJoints":["oNTQ9kGJLR6NE6X37waKe5"],"rightJoints":["p8peNzDRqcaFDtvEdTohPZ"],"leftPoint":[0.10805206105569454,2.2012354524785778,0.1],"rightPoint":[-1.577133124129496,2.201235452478578,0.1],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adnnHLPEXD64e7HP26zx36","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.0166675142852597,"cy":1.795143485073596,"cz":0,"lx":1.19683109271183,"ly":0.3,"lz":20,"leftJoints":["adnnHLPEXD64e7HP26zx36"],"rightJoints":["pvG7hHR36xfJmEyp1eS9YY"],"leftPoint":[-1.577133124129496,2.201235452478578,0.1],"rightPoint":[-2.4562019044410235,1.3890515176686136,0.1],"relativeAngle":-2.3957214089984347,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p8peNzDRqcaFDtvEdTohPZ","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.4562019044410235,"cy":0.546494801500746,"cz":0,"lx":1.685113432335735,"ly":0.3,"lz":20,"leftJoints":["p8peNzDRqcaFDtvEdTohPZ"],"rightJoints":["ewYXhBGEZue5LMkkkDNb2N"],"leftPoint":[-2.4562019044410235,1.3890515176686136,0.1],"rightPoint":[-2.4562019044410235,-0.2960619146671215,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pvG7hHR36xfJmEyp1eS9YY","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.0166675142852597,"cy":-0.7325266634300069,"cz":0,"lx":1.2388574688675817,"ly":0.3,"lz":20,"leftJoints":["pvG7hHR36xfJmEyp1eS9YY"],"rightJoints":["5TCNcDuH6LTN7MuR8NFXaf"],"leftPoint":[-2.4562019044410235,-0.2960619146671215,0.1],"rightPoint":[-1.577133124129496,-1.1689914121928924,0.1],"relativeAngle":-0.7818940174543654,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ewYXhBGEZue5LMkkkDNb2N","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-0.7345405315369007,"cy":-1.1689914121928924,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":20,"leftJoints":["ewYXhBGEZue5LMkkkDNb2N"],"rightJoints":["jF6FEFY4L9ZBSgjp7949eF"],"leftPoint":[-1.577133124129496,-1.1689914121928924,0.1],"rightPoint":[0.10805206105569454,-1.1689914121928924,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5TCNcDuH6LTN7MuR8NFXaf","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.5293483573519921,"cy":1.7799570943946443,"cz":0,"lx":1.1915805038063918,"ly":0.3,"lz":20,"leftJoints":["b3SjNidDoApoDQgAZjBhRR"],"rightJoints":["adnnHLPEXD64e7HP26zx36"],"leftPoint":[0.9506446536482898,1.3586787363107105,0.1],"rightPoint":[0.10805206105569454,2.201235452478578,0.1],"relativeAngle":2.356215779952568,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oNTQ9kGJLR6NE6X37waKe5","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.9506446536482898,"cy":0.5161220201428429,"cz":0,"lx":1.6851134323357353,"ly":0.3,"lz":20,"leftJoints":["jF6FEFY4L9ZBSgjp7949eF"],"rightJoints":["oNTQ9kGJLR6NE6X37waKe5"],"leftPoint":[0.9506446536482898,-0.3264346960250246,0.1],"rightPoint":[0.9506446536482898,1.3586787363107105,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"b3SjNidDoApoDQgAZjBhRR","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.5296100327657101,"cy":-0.7475180231228342,"cz":0,"lx":1.192226389921747,"ly":0.3,"lz":20,"leftJoints":["5TCNcDuH6LTN7MuR8NFXaf"],"rightJoints":["b3SjNidDoApoDQgAZjBhRR"],"leftPoint":[0.10805206105569454,-1.1689914121928924,0.1],"rightPoint":[0.9511680044757185,-0.32604463405277606,0.1],"relativeAngle":0.7852978318515466,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jF6FEFY4L9ZBSgjp7949eF","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Foundation","cx":27.7105671464116,"cy":-2.6420189029493315,"cz":0.05,"lx":4.989784328698819,"ly":4.552797399247233,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"idmo7S3eXBpD6VWYDG7diy","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["4N88hDYexmoMCfgkuoD5Rh","2Ew2MEjMkmHhJiQ9oqAGU2","npFbHBHE2K2JqNLhKJ6X3t","63M4Ay9XbnqNvAk8QywH63","cJ3MHxSdHF6NBdtBsFYUrC","pkGthR3DucyAx4LwcC1Kdd","myGwrCaTTUQ5A7LpQkLGdD","167KXvNm8cDcHPx8xW946K"],"textureType":"No Roof Texture","color":"#ffffff","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"ask5m4JZ2uoEk2cEnnLbsK","rise":0,"ceiling":false},{"type":"Wall","cx":-0.6463414312406925,"cy":1.7491373104519843,"cz":0,"lx":1.4245403393373886,"ly":0.3,"lz":40,"leftJoints":["p9FmVKK28qciXfgD3M1K6V"],"rightJoints":["nApCmMqRMThE5A5HdfM3dh"],"leftPoint":[0.06592873842799918,1.7491373104519834,0.1],"rightPoint":[-1.3586116009093843,1.7491373104519843,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fRXGTknc5ZYRa28V8BWwuh","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-1.7301639233528903,"cy":1.4187885996411662,"cz":0,"lx":0.9943468188665976,"ly":0.3,"lz":40,"leftJoints":["fRXGTknc5ZYRa28V8BWwuh"],"rightJoints":["4KAheoavQjSxkpwUJhTcg7"],"leftPoint":[-1.3586116009093843,1.7491373104519843,0.1],"rightPoint":[-2.1017162457963963,1.0884398888303481,0.1],"relativeAngle":-2.4148300779771343,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nApCmMqRMThE5A5HdfM3dh","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-2.1017162457963963,"cy":0.4030347409529105,"cz":0,"lx":1.370810295754875,"ly":0.3,"lz":40,"leftJoints":["nApCmMqRMThE5A5HdfM3dh"],"rightJoints":["6UtLwWPfxSz1Nn8LJyUZiD"],"leftPoint":[-2.1017162457963963,1.0884398888303481,0.1],"rightPoint":[-2.1017162457963963,-0.2823704069245272,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4KAheoavQjSxkpwUJhTcg7","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-1.7301639233528903,"cy":-0.6374268439911468,"cz":0,"lx":1.0278447388893002,"ly":0.3,"lz":40,"leftJoints":["4KAheoavQjSxkpwUJhTcg7"],"rightJoints":["ppMSBZRCq12eT8z3NB6hMS"],"leftPoint":[-2.1017162457963963,-0.2823704069245272,0.1],"rightPoint":[-1.3586116009093843,-0.9924832810577664,0.1],"relativeAngle":-0.7626994937110066,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6UtLwWPfxSz1Nn8LJyUZiD","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-0.6463414312406925,"cy":-0.9924832810577664,"cz":0,"lx":1.4245403393373886,"ly":0.3,"lz":40,"leftJoints":["6UtLwWPfxSz1Nn8LJyUZiD"],"rightJoints":["dQ7dD99j57UBUw5JhK5Ym8"],"leftPoint":[-1.3586116009093843,-0.9924832810577664,0.1],"rightPoint":[0.06592873842799918,-0.9924832810577664,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ppMSBZRCq12eT8z3NB6hMS","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.4220638232623486,"cy":1.4064347365132654,"cz":0,"lx":0.9884882454216453,"ly":0.3,"lz":40,"leftJoints":["iNFasQAxKLM2g211nuNb2z"],"rightJoints":["fRXGTknc5ZYRa28V8BWwuh"],"leftPoint":[0.778198908096698,1.0637321625745466,0.1],"rightPoint":[0.06592873842799918,1.7491373104519843,0.1],"relativeAngle":2.375413341461377,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p9FmVKK28qciXfgD3M1K6V","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.778198908096698,"cy":0.37832701469710894,"cz":0,"lx":1.3708102957548751,"ly":0.3,"lz":40,"leftJoints":["dQ7dD99j57UBUw5JhK5Ym8"],"rightJoints":["p9FmVKK28qciXfgD3M1K6V"],"leftPoint":[0.778198908096698,-0.3070781331803287,0.1],"rightPoint":[0.778198908096698,1.0637321625745466,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iNFasQAxKLM2g211nuNb2z","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.4222850257663353,"cy":-0.6496220528239478,"cz":0,"lx":0.9890270478638401,"ly":0.3,"lz":40,"leftJoints":["ppMSBZRCq12eT8z3NB6hMS"],"rightJoints":["iNFasQAxKLM2g211nuNb2z"],"leftPoint":[0.06592873842799918,-0.9924832810577664,0.1],"rightPoint":[0.7786413131046714,-0.3067608245901292,0.1],"relativeAngle":0.7661003289655364,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dQ7dD99j57UBUw5JhK5Ym8","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Foundation","cx":27.6576948812141,"cy":-2.506928881033054,"cz":0.05,"lx":4.268844692534827,"ly":3.6205625940120694,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nSuM9UkMkLHBgCAuUp64m1","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["p9FmVKK28qciXfgD3M1K6V","fRXGTknc5ZYRa28V8BWwuh","nApCmMqRMThE5A5HdfM3dh","4KAheoavQjSxkpwUJhTcg7","6UtLwWPfxSz1Nn8LJyUZiD","ppMSBZRCq12eT8z3NB6hMS","dQ7dD99j57UBUw5JhK5Ym8","iNFasQAxKLM2g211nuNb2z"],"textureType":"No Roof Texture","color":"#ffffff","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","id":"8T3htfZzkyzGKAg9MjWEi4","rise":13.522672727906091,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["b3SjNidDoApoDQgAZjBhRR","oNTQ9kGJLR6NE6X37waKe5","adnnHLPEXD64e7HP26zx36","p8peNzDRqcaFDtvEdTohPZ","pvG7hHR36xfJmEyp1eS9YY","ewYXhBGEZue5LMkkkDNb2N","5TCNcDuH6LTN7MuR8NFXaf","jF6FEFY4L9ZBSgjp7949eF"],"textureType":"No Roof Texture","color":"#ffffff","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","id":"dyG5Lv9BjBabdoCAJRrzex","rise":0,"ceiling":false},{"type":"Wall","cx":-0.7345405315369007,"cy":2.2012354524785778,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":20,"leftJoints":["wt8f2UuyWEu5744tfT81tN"],"rightJoints":["mUct1Mv8YXbfrstcjehPpa"],"leftPoint":[0.10805206105569454,2.2012354524785778,0.1],"rightPoint":[-1.577133124129496,2.201235452478578,0.1],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1A1n4avbSRXWKghQMw9QmS","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.0166675142852597,"cy":1.795143485073596,"cz":0,"lx":1.19683109271183,"ly":0.3,"lz":20,"leftJoints":["1A1n4avbSRXWKghQMw9QmS"],"rightJoints":["5WJdP5E99dMPaLFTQ6cg6Q"],"leftPoint":[-1.577133124129496,2.201235452478578,0.1],"rightPoint":[-2.4562019044410235,1.3890515176686136,0.1],"relativeAngle":-2.3957214089984347,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mUct1Mv8YXbfrstcjehPpa","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.4562019044410235,"cy":0.546494801500746,"cz":0,"lx":1.685113432335735,"ly":0.3,"lz":20,"leftJoints":["mUct1Mv8YXbfrstcjehPpa"],"rightJoints":["trsYgSjY5YRLrdedvaJSHE"],"leftPoint":[-2.4562019044410235,1.3890515176686136,0.1],"rightPoint":[-2.4562019044410235,-0.2960619146671215,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5WJdP5E99dMPaLFTQ6cg6Q","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.0166675142852597,"cy":-0.7325266634300069,"cz":0,"lx":1.2388574688675817,"ly":0.3,"lz":20,"leftJoints":["5WJdP5E99dMPaLFTQ6cg6Q"],"rightJoints":["1XHXV2QxJeTydiieFTLRAN"],"leftPoint":[-2.4562019044410235,-0.2960619146671215,0.1],"rightPoint":[-1.577133124129496,-1.1689914121928924,0.1],"relativeAngle":-0.7818940174543654,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"trsYgSjY5YRLrdedvaJSHE","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-0.7345405315369007,"cy":-1.1689914121928924,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":20,"leftJoints":["trsYgSjY5YRLrdedvaJSHE"],"rightJoints":["e41wz75u2ryRdJixSo4bbC"],"leftPoint":[-1.577133124129496,-1.1689914121928924,0.1],"rightPoint":[0.10805206105569454,-1.1689914121928924,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1XHXV2QxJeTydiieFTLRAN","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.5293483573519921,"cy":1.7799570943946443,"cz":0,"lx":1.1915805038063918,"ly":0.3,"lz":20,"leftJoints":["rwkRVKiYfYKkrL5fSm48ht"],"rightJoints":["1A1n4avbSRXWKghQMw9QmS"],"leftPoint":[0.9506446536482898,1.3586787363107105,0.1],"rightPoint":[0.10805206105569454,2.201235452478578,0.1],"relativeAngle":2.356215779952568,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wt8f2UuyWEu5744tfT81tN","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.9506446536482898,"cy":0.5161220201428429,"cz":0,"lx":1.6851134323357353,"ly":0.3,"lz":20,"leftJoints":["e41wz75u2ryRdJixSo4bbC"],"rightJoints":["wt8f2UuyWEu5744tfT81tN"],"leftPoint":[0.9506446536482898,-0.3264346960250246,0.1],"rightPoint":[0.9506446536482898,1.3586787363107105,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rwkRVKiYfYKkrL5fSm48ht","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.5296100327657101,"cy":-0.7475180231228342,"cz":0,"lx":1.192226389921747,"ly":0.3,"lz":20,"leftJoints":["1XHXV2QxJeTydiieFTLRAN"],"rightJoints":["rwkRVKiYfYKkrL5fSm48ht"],"leftPoint":[0.10805206105569454,-1.1689914121928924,0.1],"rightPoint":[0.9511680044757185,-0.32604463405277606,0.1],"relativeAngle":0.7852978318515466,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e41wz75u2ryRdJixSo4bbC","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"id":"oxncVFS4dMKc2b6nwpauSP","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":1,"wallsId":["rwkRVKiYfYKkrL5fSm48ht","wt8f2UuyWEu5744tfT81tN","1A1n4avbSRXWKghQMw9QmS","mUct1Mv8YXbfrstcjehPpa","5WJdP5E99dMPaLFTQ6cg6Q","trsYgSjY5YRLrdedvaJSHE","1XHXV2QxJeTydiieFTLRAN","e41wz75u2ryRdJixSo4bbC"],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":-26.000122008937623,"cy":-2.4456470612698347,"cz":0.05,"lx":4.989784328698819,"ly":4.552797399247233,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9CoHzygyKEYpDGTpmZP3qF","selected":false},{"type":"Wall","cx":-0.20148632007026634,"cy":1.8550497672374595,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":30,"leftJoints":["rGMwJ6KNdYyNwmQKhW2Nh4"],"rightJoints":["oRNf7bY3AJx3zVpaTdb4zu"],"leftPoint":[0.6411062725223289,1.8550497672374595],"rightPoint":[-1.0440789126628616,1.85504976723746],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9GySPDZNNZvFp6JaddRiDB","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4836133028186254,"cy":1.4489577998324776,"cz":0,"lx":1.19683109271183,"ly":0.3,"lz":30,"leftJoints":["9GySPDZNNZvFp6JaddRiDB"],"rightJoints":["4nY35MHMDAs2QdKy4qH4ya"],"leftPoint":[-1.0440789126628616,1.85504976723746],"rightPoint":[-1.9231476929743891,1.0428658324274953],"relativeAngle":-2.3957214089984347,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oRNf7bY3AJx3zVpaTdb4zu","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.9231476929743891,"cy":0.20030911625962777,"cz":0,"lx":1.685113432335735,"ly":0.3,"lz":30,"leftJoints":["oRNf7bY3AJx3zVpaTdb4zu"],"rightJoints":["wYoS3whcRTi53dM2ct7qM2"],"leftPoint":[-1.9231476929743891,1.0428658324274953],"rightPoint":[-1.9231476929743891,-0.6422475999082398],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4nY35MHMDAs2QdKy4qH4ya","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4836133028186254,"cy":-1.0787123486711252,"cz":0,"lx":1.2388574688675817,"ly":0.3,"lz":30,"leftJoints":["4nY35MHMDAs2QdKy4qH4ya"],"rightJoints":["mCZwmWyb4fsNj2wmYQBvsz"],"leftPoint":[-1.9231476929743891,-0.6422475999082398],"rightPoint":[-1.0440789126628616,-1.5151770974340102],"relativeAngle":-0.7818940174543654,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wYoS3whcRTi53dM2ct7qM2","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-0.20148632007026634,"cy":-1.5151770974340102,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":30,"leftJoints":["wYoS3whcRTi53dM2ct7qM2"],"rightJoints":["5kERhDJVYnRwidcZHzNwPz"],"leftPoint":[-1.0440789126628616,-1.5151770974340102],"rightPoint":[0.6411062725223289,-1.5151770974340102],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mCZwmWyb4fsNj2wmYQBvsz","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.0624025688186265,"cy":1.433771409153526,"cz":0,"lx":1.1915805038063918,"ly":0.3,"lz":30,"leftJoints":["6prLNGnRe7BKvuxjsqwhNV"],"rightJoints":["9GySPDZNNZvFp6JaddRiDB"],"leftPoint":[1.483698865114924,1.0124930510695922],"rightPoint":[0.6411062725223289,1.85504976723746],"relativeAngle":2.356215779952568,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rGMwJ6KNdYyNwmQKhW2Nh4","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.483698865114924,"cy":0.16993633490172466,"cz":0,"lx":1.6851134323357353,"ly":0.3,"lz":30,"leftJoints":["5kERhDJVYnRwidcZHzNwPz"],"rightJoints":["rGMwJ6KNdYyNwmQKhW2Nh4"],"leftPoint":[1.483698865114924,-0.6726203812661429],"rightPoint":[1.483698865114924,1.0124930510695922],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6prLNGnRe7BKvuxjsqwhNV","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.0626642442323444,"cy":-1.0937037083639525,"cz":0,"lx":1.192226389921747,"ly":0.3,"lz":30,"leftJoints":["mCZwmWyb4fsNj2wmYQBvsz"],"rightJoints":["6prLNGnRe7BKvuxjsqwhNV"],"leftPoint":[0.6411062725223289,-1.5151770974340102],"rightPoint":[1.4842222159423528,-0.6722303192938943],"relativeAngle":0.7852978318515466,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5kERhDJVYnRwidcZHzNwPz","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"id":"uMr4G8iwQhvVEE8TbWYbgJ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":1,"wallsId":["5kERhDJVYnRwidcZHzNwPz","6prLNGnRe7BKvuxjsqwhNV","rGMwJ6KNdYyNwmQKhW2Nh4","9GySPDZNNZvFp6JaddRiDB","oRNf7bY3AJx3zVpaTdb4zu","4nY35MHMDAs2QdKy4qH4ya","wYoS3whcRTi53dM2ct7qM2","mCZwmWyb4fsNj2wmYQBvsz"],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":-26.499667294833905,"cy":-2.142020498769739,"cz":0.1,"lx":7.862239275491355,"ly":8.18645532809304,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1oxk3P52oSn4HGaJ5d21cE","selected":false,"enableGroupMaster":true},{"type":"Wall","cx":-0.6463414312406925,"cy":1.7491373104519843,"cz":0,"lx":1.4245403393373886,"ly":0.3,"lz":40,"leftJoints":["mMt5DmNXZy5oG4vq89vafC"],"rightJoints":["4p4RhAQUE1YZ6FvTNz5vv4"],"leftPoint":[0.06592873842799918,1.7491373104519834,0.1],"rightPoint":[-1.3586116009093843,1.7491373104519843,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nr2YdH7dGwCs9FLqqqGjFg","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-1.7301639233528903,"cy":1.4187885996411662,"cz":0,"lx":0.9943468188665976,"ly":0.3,"lz":40,"leftJoints":["nr2YdH7dGwCs9FLqqqGjFg"],"rightJoints":["mLwkBCLjpPZP6KYK5Bt7J8"],"leftPoint":[-1.3586116009093843,1.7491373104519843,0.1],"rightPoint":[-2.1017162457963963,1.0884398888303481,0.1],"relativeAngle":-2.4148300779771343,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4p4RhAQUE1YZ6FvTNz5vv4","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-2.1017162457963963,"cy":0.4030347409529105,"cz":0,"lx":1.370810295754875,"ly":0.3,"lz":40,"leftJoints":["4p4RhAQUE1YZ6FvTNz5vv4"],"rightJoints":["7uWfnz1ukohHZ8q7Z4KWAP"],"leftPoint":[-2.1017162457963963,1.0884398888303481,0.1],"rightPoint":[-2.1017162457963963,-0.2823704069245272,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mLwkBCLjpPZP6KYK5Bt7J8","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-1.7301639233528903,"cy":-0.6374268439911468,"cz":0,"lx":1.0278447388893002,"ly":0.3,"lz":40,"leftJoints":["mLwkBCLjpPZP6KYK5Bt7J8"],"rightJoints":["wynoJj85BW9QJZxa23rRom"],"leftPoint":[-2.1017162457963963,-0.2823704069245272,0.1],"rightPoint":[-1.3586116009093843,-0.9924832810577664,0.1],"relativeAngle":-0.7626994937110066,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7uWfnz1ukohHZ8q7Z4KWAP","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-0.6463414312406925,"cy":-0.9924832810577664,"cz":0,"lx":1.4245403393373886,"ly":0.3,"lz":40,"leftJoints":["7uWfnz1ukohHZ8q7Z4KWAP"],"rightJoints":["kCyrQp6qPZF1NC78PVWkyR"],"leftPoint":[-1.3586116009093843,-0.9924832810577664,0.1],"rightPoint":[0.06592873842799918,-0.9924832810577664,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wynoJj85BW9QJZxa23rRom","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.4220638232623486,"cy":1.4064347365132654,"cz":0,"lx":0.9884882454216453,"ly":0.3,"lz":40,"leftJoints":["ho9ZWX9Y7gps9CuiwCZxjF"],"rightJoints":["nr2YdH7dGwCs9FLqqqGjFg"],"leftPoint":[0.778198908096698,1.0637321625745466,0.1],"rightPoint":[0.06592873842799918,1.7491373104519843,0.1],"relativeAngle":2.375413341461377,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mMt5DmNXZy5oG4vq89vafC","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.778198908096698,"cy":0.37832701469710894,"cz":0,"lx":1.3708102957548751,"ly":0.3,"lz":40,"leftJoints":["kCyrQp6qPZF1NC78PVWkyR"],"rightJoints":["mMt5DmNXZy5oG4vq89vafC"],"leftPoint":[0.778198908096698,-0.3070781331803287,0.1],"rightPoint":[0.778198908096698,1.0637321625745466,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ho9ZWX9Y7gps9CuiwCZxjF","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.4222850257663353,"cy":-0.6496220528239478,"cz":0,"lx":0.9890270478638401,"ly":0.3,"lz":40,"leftJoints":["wynoJj85BW9QJZxa23rRom"],"rightJoints":["ho9ZWX9Y7gps9CuiwCZxjF"],"leftPoint":[0.06592873842799918,-0.9924832810577664,0.1],"rightPoint":[0.7786413131046714,-0.3067608245901292,0.1],"relativeAngle":0.7661003289655364,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kCyrQp6qPZF1NC78PVWkyR","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"id":"eGKywH11tWPx9igpC5XjNU","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["mMt5DmNXZy5oG4vq89vafC","nr2YdH7dGwCs9FLqqqGjFg","4p4RhAQUE1YZ6FvTNz5vv4","mLwkBCLjpPZP6KYK5Bt7J8","7uWfnz1ukohHZ8q7Z4KWAP","wynoJj85BW9QJZxa23rRom","kCyrQp6qPZF1NC78PVWkyR","ho9ZWX9Y7gps9CuiwCZxjF"],"selected":false,"rise":13.522672727906091,"ceiling":false},{"type":"Foundation","cx":-26.07251778331903,"cy":-2.351761746510464,"cz":0.05,"lx":4.268844692534827,"ly":3.6205625940120694,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9Y1kU3q99HMAW1GDxevTYM","selected":false},{"type":"Wall","cx":-0.9902356029479495,"cy":-11.912514576226425,"cz":2.268765007024547,"lx":36.926563179741635,"ly":0.5,"lz":17,"leftJoints":["rmJMuUkEt1MeMCUMuSJyMP"],"rightJoints":["phirdj4sqaQKeToCxzfiMH"],"leftPoint":[-19.45351719281877,-11.912514576226423,0.1],"rightPoint":[17.47304598692287,-11.912514576226428,0.1],"relativeAngle":-1.4431536702349665e-16,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"i77w1Es8Z5SjkjpQ5nMhD5","parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"vL7dGWufEhTghRwUx8yTvj","leftRoofHeight":17,"rightRoofHeight":17,"selected":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Door","cx":0,"cy":0,"cz":-0.21875,"lx":0.951583767418624,"ly":0,"lz":0.5625,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"mWaGM2hsTBxoCRqCfarD1y","parentId":"i77w1Es8Z5SjkjpQ5nMhD5","foundationId":"tLnj42ybzfx7UvcxHnYBsE","selected":false},{"type":"Wall","cx":17.47304598692286,"cy":-4.836753855231592,"cz":0,"lx":14.151521441989672,"ly":0.5,"lz":17,"leftJoints":["i77w1Es8Z5SjkjpQ5nMhD5"],"rightJoints":[],"leftPoint":[17.47304598692287,-11.912514576226428,0.1],"rightPoint":[17.473045986922852,2.239006865763245,0.1],"relativeAngle":1.570796326794898,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"phirdj4sqaQKeToCxzfiMH","parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"vL7dGWufEhTghRwUx8yTvj","leftRoofHeight":17,"rightRoofHeight":17,"selected":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-19.453517192818786,"cy":-4.836753855231592,"cz":0,"lx":14.151521441989672,"ly":0.5,"lz":17,"leftJoints":[],"rightJoints":["i77w1Es8Z5SjkjpQ5nMhD5"],"leftPoint":[-19.453517192818783,2.239006865763245,0.1],"rightPoint":[-19.45351719281879,-11.912514576226428,0.1],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rmJMuUkEt1MeMCUMuSJyMP","parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"vL7dGWufEhTghRwUx8yTvj","leftRoofHeight":17,"rightRoofHeight":17,"selected":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-0.9902356029479567,"cy":2.239006865763245,"cz":0,"lx":36.92656317974165,"ly":0.5,"lz":17,"leftJoints":["phirdj4sqaQKeToCxzfiMH"],"rightJoints":["rmJMuUkEt1MeMCUMuSJyMP"],"leftPoint":[17.47304598692287,2.239006865763245,0.1],"rightPoint":[-19.453517192818783,2.239006865763245,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eKjiWm3px73qKLcoG9tGHu","parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":null,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Door","cx":-0.006429620050125837,"cy":0,"cz":-0.21875,"lx":0.9387245273183722,"ly":0,"lz":0.5625,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"dhr8kv5642kt62iFhTt4ta","parentId":"eKjiWm3px73qKLcoG9tGHu","foundationId":"tLnj42ybzfx7UvcxHnYBsE","selected":false},{"type":"Foundation","cx":0.9431450312565914,"cy":3.149229192376307,"cz":0.05,"lx":41.18193719933953,"ly":25.196736647897943,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tLnj42ybzfx7UvcxHnYBsE","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Mansard","roofStructure":"Default","wallsId":["phirdj4sqaQKeToCxzfiMH"],"ridgeWidth":2.66901172469158,"textureType":"No Roof Texture","color":"#ffffff","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","id":"vL7dGWufEhTghRwUx8yTvj","rise":1.907584707016376,"ceiling":false},{"type":"Human","name":"Jiya","cx":-18.787647876406897,"cy":-18.538338993489504,"cz":0.125,"lx":0.6,"ly":0.6,"lz":1.74,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"muPJhyAEwPwvd29CyHNPTv","selected":false},{"type":"Tree","name":"Coconut","cx":24.642500087694035,"cy":-15.595852113993274,"cz":0.12499999999999645,"lx":7.10302446035018,"lz":11.247303362702601,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"fjFxbSnebLaGdvEjgFeKBY","selected":false},{"type":"Tree","name":"Coconut","cx":21.66117439174871,"cy":-16.376771590483912,"cz":0.125,"lx":4.8301750266215455,"lz":7.467800914861559,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"fJBtdZnifxUnAi1A2mQVwv","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[13.204078062477329,8.198113820431859,0.000008738290977654438],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[13.204078062477329,8.197963813764718,150],"theme":"Dune","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":19,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[40.16161458870258,-83.52840108412623,20.640119356575983],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":12.604988194492185,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#8c9763","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[3.0849566827898878,4.932309755028921,20.640119356575976],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":2.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"dailyPvYieldPanelRect":{"x":-4,"y":10,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyLightSensorPanelRect":{"x":-1254,"y":272,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},448:function(e){e.exports=JSON.parse('{"docid":"kfhYJJUbjvMzonQRyiPc3j","time":"02/03/2023 08:07 pm","timestamp":1675472845072,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 9:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":17.756863619774798,"solarUpdraftTower":{},"parentId":"Ground","cx":-2.4293224579513826,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.4049185488212945,"type":"Foundation","solarPowerTower":{},"lx":35.28188764969263,"lz":1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.5,"textureType":"Foundation Texture #2","enableGroupMaster":true,"color":"#ffffff"},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":24.269954502361394,"relativeAngle":3.141592653589793,"lz":6,"roofId":"eX962ry384m9Aq9zJiKfY6","ly":0.3,"rightPoint":[-9.99610487226133,4.83201801478668,1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture #4","leftPoint":[14.27384963010006,4.832018014786678,1],"type":"Wall","rightRoofHeight":6,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":6,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":2.1388723789193644,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":4.83201801478668,"color":"#ffffff","opacity":0,"wallStructure":"Default","studSpacing":100,"studColor":"#666666","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":14.273849630100056,"leftPoint":[14.273849630100056,-5.54086475965909,1],"cy":-0.35442337243620514,"leftRoofHeight":6,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[14.27384963010006,4.83201801478668,1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10.37288277444577,"normal":[0,0,1],"lz":6,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture #4","rightRoofHeight":6,"roofId":"eX962ry384m9Aq9zJiKfY6","color":"#ffffff","opacity":0,"wallStructure":"Default","studSpacing":100,"studColor":"#666666","centerRoofHeight":[0,9],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"lx":10.37288277444577,"windows":[],"lz":6,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"eX962ry384m9Aq9zJiKfY6","selected":false,"cy":-0.35442337243620514,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-9.99610487226133,-5.54086475965909,1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture #4","rightRoofHeight":6,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":-1.5707963267948968,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-9.99610487226133,4.83201801478668,1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":6,"ly":0.3,"cx":-9.99610487226133,"color":"#ffffff","opacity":0,"wallStructure":"Default","studSpacing":100,"studColor":"#666666","centerRoofHeight":[0,9],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"showLabel":false,"cx":2.1388723789193644,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[14.27384963010006,-5.54086475965909,1],"cz":2.268765007024547,"textureType":"Wall Texture #4","cy":-5.54086475965909,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"eX962ry384m9Aq9zJiKfY6","leftPoint":[-9.99610487226133,-5.54086475965909,1],"normal":[0,0,1],"ly":0.3,"lz":6,"leftRoofHeight":6,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":6,"lx":24.269954502361394,"color":"#ffffff","wallStructure":"Default","opacity":0,"studSpacing":100,"studColor":"#666666","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-1.8995410156020984,"cy":1.1382243316181326,"cz":2.2408122612280286,"lx":3.053187061305774,"ly":0.2,"lz":12.024186118737006,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[-0.37294748494921137,1.1382243316181326,0.07664429931579812],"rightPoint":[-3.4261345462549855,1.1382243316181326,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.37294748494921137,"cy":-0.10216350253359563,"cz":1.9496749649980285,"lx":2.4807756683034574,"ly":0.2,"lz":12.024186118737006,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[-0.37294748494921315,-1.3425513366853248,0.07664429931579812],"rightPoint":[-0.37294748494921137,1.1382243316181326,0.07664429931579812],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"wallStructure":"Default","opacity":0.5,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-3.4261345462549855,"cy":-0.10216350253359563,"cz":2.228839888904333,"lx":2.4807756683034574,"ly":0.2,"lz":12.024186118737006,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-3.4261345462549855,1.1382243316181326,0.07664429931579812],"rightPoint":[-3.4261345462549855,-1.3425513366853248,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-1.8995410156020984,"cy":-1.3425513366853248,"cz":2.268765007024547,"lx":3.053187061305774,"ly":0.2,"lz":12.024186118737006,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-3.4261345462549855,-1.3425513366853248,0.07664429931579812],"rightPoint":[-0.37294748494921137,-1.3425513366853248,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Foundation","cx":14.094080413269129,"cy":0.15570536150984227,"cz":0.05,"lx":8.775727447038646,"ly":4.909042441548677,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":false,"color":"#ffffff"},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.15,"roofType":"Pyramid","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7","pPpJHGJ2bGVqLdA1FpXi4V","giYTP9Qg6uJ3yfkS1RoDqG","2RETAxyRMzZBEQkBGms56R"],"textureType":"Roof Texture #7","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"u1sPtasg3hWUinAjQbYwBP","sideColor":"#4d4d4d","rise":2.0481021935471038,"ceiling":false},{"type":"Window","cx":0.0021539197282083927,"cy":0.1,"cz":0.3488182697258943,"lx":0.5686474602805061,"ly":0.2,"lz":0.18392000793749944,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"62Gv8U29wFJyJf1vgeLMyo","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1},{"type":"Wall","cx":-0.20317717304724836,"cy":0.8008815905246398,"cz":2.2408122612280286,"lx":1.7317721396367636,"ly":0.2,"lz":12.024186118737006,"leftJoints":["dzLroXC8UBmujXxPj58BnJ"],"rightJoints":["2AP7zuBsHXSx9vjaaQ41Sa"],"leftPoint":[0.6627088967711334,0.8008815905246398,0],"rightPoint":[-1.0690632428656301,0.8008815905246398,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9CKGzf7taYbb5TxpshE7KA","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"14aRqq6MKm9VsEB7xehwCw","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.6627088967711334,"cy":0.06442649426996133,"cz":2.2301039869226305,"lx":1.472910192509357,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gH8a7zMeyH4srn6fpqovLp"],"rightJoints":["9CKGzf7taYbb5TxpshE7KA"],"leftPoint":[0.6627088967711331,-0.6720286019847171,0],"rightPoint":[0.6627088967711336,0.8008815905246398,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dzLroXC8UBmujXxPj58BnJ","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","wallStructure":"Default","opacity":0.5,"roofId":"14aRqq6MKm9VsEB7xehwCw","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"selected":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-1.0690632428656301,"cy":0.06442649426996133,"cz":2.228839888904333,"lx":1.472910192509357,"ly":0.2,"lz":12.024186118737006,"leftJoints":["9CKGzf7taYbb5TxpshE7KA"],"rightJoints":["gH8a7zMeyH4srn6fpqovLp"],"leftPoint":[-1.0690632428656301,0.8008815905246398,0],"rightPoint":[-1.0690632428656301,-0.6720286019847171,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2AP7zuBsHXSx9vjaaQ41Sa","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"14aRqq6MKm9VsEB7xehwCw","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.20317717304724825,"cy":-0.6720286019847171,"cz":2.268765007024547,"lx":1.7317721396367638,"ly":0.2,"lz":12.024186118737006,"leftJoints":["2AP7zuBsHXSx9vjaaQ41Sa"],"rightJoints":["dzLroXC8UBmujXxPj58BnJ"],"leftPoint":[-1.0690632428656301,-0.6720286019847171,0],"rightPoint":[0.6627088967711336,-0.6720286019847171,0],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gH8a7zMeyH4srn6fpqovLp","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"14aRqq6MKm9VsEB7xehwCw","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"14aRqq6MKm9VsEB7xehwCw","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #7","thickness":0.15,"wallsId":["gH8a7zMeyH4srn6fpqovLp","dzLroXC8UBmujXxPj58BnJ","9CKGzf7taYbb5TxpshE7KA","2AP7zuBsHXSx9vjaaQ41Sa"],"selected":false,"sideColor":"#4d4d4d","rise":7.313111372629006,"ceiling":false},{"type":"Foundation","cx":12.425615366004104,"cy":0.028931059233684664,"cz":0.05,"lx":3.229114860580372,"ly":2.221848349715204,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7jmzUaUYBWVbxJMLM3ukrN","selected":false},{"type":"Human","name":"Jaye","cx":16.450422145232615,"cy":-0.22113841806491535,"cz":0.5,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"iDEwVvzHLgt4QuBLaRKJtz","selected":false,"ly":0.55},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"Roof Texture #7","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"eX962ry384m9Aq9zJiKfY6","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"sideColor":"#4d4d4d","rise":3,"ceiling":false},{"type":"Door","cx":-8.950612010673349e-17,"cy":0,"cz":-0.3331657120178574,"lx":0.8061994583201278,"ly":0,"lz":0.3336685759642853,"textureType":"Door Texture #5","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"ekcJVu2iDNfD8vCRPJWcfY","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.3856208622982074,"cy":0.1,"cz":-0.16666666666666666,"lx":0.09640521557455185,"ly":0.3,"lz":0.3333333333333333,"mullionWidth":0.08,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"9oFXDcsdcyJ89HEsb2DDAG","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.24101303893637963,"cy":0.1,"cz":-0.16666666666666666,"lx":0.09640521557455185,"ly":0.3,"lz":0.3333333333333333,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ssU5SYZXCGdgbbL6FKEC5P","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.24101303893637963,"cy":0.1,"cz":-0.16666666666666666,"lx":0.09640521557455185,"ly":0.3,"lz":0.3333333333333333,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fptVfz87nopSTdqFchXqam","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3856208622982074,"cy":0.1,"cz":-0.16666666666666666,"lx":0.09640521557455185,"ly":0.3,"lz":0.3333333333333333,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dBjY8chWcXqTSEjTPuyYBe","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.24101303893637963,"cy":0.1,"cz":0.375,"lx":0.09640521557455185,"ly":0.3,"lz":0.4166666666666667,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"ukFf3NbtSoWEm19XdABfLF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.24101303893637963,"cy":0.1,"cz":0.375,"lx":0.09640521557455185,"ly":0.3,"lz":0.4166666666666667,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e66yZnH635KK4nUZeZJouj","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.004820260778727587,"cy":0.1,"cz":0.5500000000000002,"lx":0.1253267802469174,"ly":0.3,"lz":0.6999999999999998,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8FUv4v48DhXb1UYjQUTX7D","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.2892156467236556,"cy":0.1,"cz":0,"lx":0.1928104311491037,"ly":0.3,"lz":0.5,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5yZFsPzLz262PvuKKqo6BT","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.2892156467236556,"cy":0.1,"cz":0,"lx":0.1928104311491037,"ly":0.3,"lz":0.5,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pRx46Qg86s1FgV9Tkkwhkb","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.2916666666666667,"lx":0.13496730180437258,"ly":0,"lz":0.4166666666666667,"textureType":"Door Texture #2","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"3Zxx9R9RT39QbRUhwQji79","doorType":"Default","archHeight":1,"filled":true},{"type":"Cuboid","cx":15.482678805847527,"cy":0.03501810630543489,"cz":0.5,"lx":0.5,"ly":3,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"7HoCBk9FUvPFeTLHCCJTNC"},{"type":"Cuboid","cx":15.982678805847527,"cy":0.03501810630543489,"cz":0.4,"lx":0.5,"ly":3,"lz":0.8,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"wT8Ce4Jri1xraPwAe1CNeM","selected":false},{"type":"Cuboid","cx":16.482678805847527,"cy":0.03501810630543489,"cz":0.3,"lx":0.5,"ly":3,"lz":0.6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"kygu5kCeJayDbMCovLE74e","selected":false},{"type":"Cuboid","cx":16.982678805847527,"cy":0.03501810630543489,"cz":0.2,"lx":0.5,"ly":3,"lz":0.4,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"x3KMwKP4LZeaVL1t9Sa9pC","selected":false},{"type":"Cuboid","cx":16.454615930533183,"cy":-1.723835668236857,"cz":0.5,"lx":2.5,"ly":0.5,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"dCP1VYfhvq16F8TKTUaTJy","selected":false},{"type":"Cuboid","cx":16.45823999757701,"cy":1.798322131122021,"cz":0.5,"lx":2.5,"ly":0.5,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7CauidfWWfvxRjMT2AFDZ7","selected":false},{"type":"Human","name":"Jamelia","cx":-0.11177369144009575,"cy":0.35103184354339856,"cz":0.10000000149011612,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"grVotAf51uhbEVGMStvWX3","id":"aT4DrrYnjHCzoD1VbK7qaQ","selected":false,"ly":0.65},{"type":"Tree","name":"Spruce","cx":-9.332343084456326,"cy":-7.670721874044395,"cz":0.49999999999999645,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"efGrH4MExjf1MncqygtFYz","selected":false},{"type":"Tree","name":"Spruce","cx":-2.4224793125813298,"cy":-7.597212684981861,"cz":0.49999999999999645,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"mVFRaCS8mpYH1fWycvYh2A","selected":false},{"type":"Tree","name":"Spruce","cx":5.7002860788249174,"cy":-7.486948901388057,"cz":0.5,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"76Tg87omCPA31TcVqXcmTm","selected":false},{"type":"Tree","name":"Spruce","cx":12.904186606949914,"cy":-7.413439712325518,"cz":0.49999999999999645,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9tspspKKMvyRj8ZAXB1S5M","selected":false},{"type":"Tree","name":"Spruce","cx":-9.185324706331325,"cy":6.884097560337873,"cz":0.49999999999999645,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jB2hT6s8JMuu4hvTQGpet3","selected":false},{"type":"Tree","name":"Spruce","cx":5.884059051481165,"cy":6.773833776744068,"cz":0.5,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"4721EtxPvv42oUzmx3KVyF","selected":false},{"type":"Tree","name":"Spruce","cx":-1.9163053006129438,"cy":6.972061722697195,"cz":0.5,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5JeYYLhDB98wnUERTPXwhK","selected":false},{"type":"Tree","name":"Spruce","cx":12.830677417887415,"cy":6.810588371275337,"cz":0.5,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"muLKxWCdfcK2eTHLBsDxzY","selected":false},{"type":"Cuboid","cx":17.482678805847527,"cy":0.03501810630543489,"cz":0.1,"lx":0.5,"ly":3,"lz":0.2,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"grVotAf51uhbEVGMStvWX3","selected":false},{"type":"Flower","name":"White Flower","cx":15.126182941215411,"cy":2.0688216490527616,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"oTAnTfR89oZPsyKVkbpY4L","selected":false},{"type":"Flower","name":"White Flower","cx":15.15556957531615,"cy":3.2795889445752495,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"i17rLiCzdL5NmRJGR4y1CS","selected":false},{"type":"Flower","name":"White Flower","cx":15.217151871229412,"cy":4.479113375165792,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cH33zk4JiguncGCgw5dgge","selected":false},{"type":"Flower","name":"White Flower","cx":15.072373579996741,"cy":-2.4484335890262776,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"w8aD5THe2gjzneE5VAcSXT","selected":false},{"type":"Flower","name":"White Flower","cx":15.073985679510187,"cy":-3.688355208079927,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"onzxSqcVAm3FyLWanpmjH2","selected":false},{"type":"Flower","name":"White Flower","cx":15.176965591305198,"cy":-5.044043742265718,"cz":0.4999999999999991,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"j3jTvCkw7njipy5x4UrSpB","selected":false},{"type":"Flower","name":"Hibiscus","cx":15.090503333801388,"cy":2.6795845901554154,"cz":0.5,"lx":2,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"gQ7GqXx4tKL7uBJwLrMcA6","selected":false},{"type":"Flower","name":"Hibiscus","cx":15.11041357320055,"cy":3.9081085710241874,"cz":0.4999999999999991,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"6HJcrgKqYqvU7BYpYwf1Se","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.913002609189407,"cy":-3.0774482324317782,"cz":0.5000000000000009,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vyshpZCEierrdgAyXaBcst","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.941871873418721,"cy":-4.383327895714419,"cz":0.5,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kAeRGtsWdmxUoAQPB5P6KJ","selected":false},{"type":"Human","name":"Jade","cx":16.85821378704074,"cy":-2.487104433327495,"cz":0.5,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5quA9K9PbuFux9inPinoZp","selected":false,"ly":0.48},{"type":"Human","name":"Jett","cx":-0.04509947681173543,"cy":-0.12777417813363456,"cz":0.300000011920929,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"kygu5kCeJayDbMCovLE74e","id":"qNbt2kqLcnpAuYiCzMr8qu","selected":false,"ly":0.6},{"type":"Human","name":"Jedi","cx":16.573220428178367,"cy":-1.1124659446434038,"cz":0.5,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"gHn3DWePGHkUPuTQBYNFA7","selected":false,"ly":0.56},{"type":"Human","name":"Jennifer","cx":16.90812280276899,"cy":1.1730238573514669,"cz":0.5,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"pkNrn5a7PGHK1vUXoNbNtp","selected":false,"ly":0.45},{"type":"Window","cx":-0.37082887811447396,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qS8bPerGLqgrEhg3VdRMna","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.24721925207631612,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nmpua75umkgQmm3afavHG4","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.12360962603815825,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fN2d9MiAtthczP5v35Bn9Z","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-4.0245584642661925e-16,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rt5vtqFNGBs4uVevaa5SHr","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.12360962603815745,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iqKTDEyqgoDU5cgt71CFea","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.24721925207631532,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vHTxpdJckKKr3ePx8aFQpY","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3708288781144731,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7MSjvWxXyqcQDbp8fs3ZDw","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.37082887811447396,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5vsADBuvCZtK48YRH9MYR9","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.24721925207631612,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"d6tpsz63SWdyNJ6pv74f1S","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.12360962603815825,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qLXWzVH589njSMD4htbaDZ","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-4.0245584642661925e-16,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rLKBLFR9JVQSkBFbLvtmjw","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.12360962603815745,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3VPrjTctjaZkp9jMcnmk9K","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.24721925207631532,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jXBTXx15DGSCH8grL279or","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3708288781144731,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"58KzRG1iYAZNHC4ZV2DbrP","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[5.218957131029783,0.6180582017777921,6.180856740847945e-7],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[5.218957131029783,0.6180382008888045,150],"theme":"Mountain","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[22.977248222176474,21.907448743442465,8.268031438861318],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":47.83311959586008,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#696635","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-3.993253335690816,-7.535606531970473,7.708620369560713],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},449:function(e){e.exports=JSON.parse('{"docid":"u1WXQV62cNL8GXN8gP2Uro","time":"02/03/2023 08:06 pm","timestamp":1675472763047,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"4/22/2022, 7:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":-0.3764576456166644,"cy":0.7527432813254578,"cz":2.2408122612280286,"lx":2.8256001957793133,"ly":0.2,"lz":17.11162413698611,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[1.0363424522729936,0.7527432813254578,0.07664429931579812],"rightPoint":[-1.7892577435063188,0.7527432813254578,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"aAQtPcYcdvnjKLxjxpN6fj","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"opacity":0.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":1.03634245227299,"cy":-0.6129469247080586,"cz":1.9496749649980285,"lx":2.7313804120670326,"ly":0.2,"lz":17.11162413698611,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[1.03634245227299,-1.9786371307415749,0.07664429931579812],"rightPoint":[1.0363424522729936,0.7527432813254578,0.07664429931579812],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"aAQtPcYcdvnjKLxjxpN6fj","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"wallStructure":"Default","opacity":0.5,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":-1.7892577435063188,"cy":-0.6129469247080586,"cz":2.228839888904333,"lx":2.7313804120670326,"ly":0.2,"lz":17.11162413698611,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-1.7892577435063188,0.7527432813254578,0.07664429931579812],"rightPoint":[-1.7892577435063188,-1.9786371307415749,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"aAQtPcYcdvnjKLxjxpN6fj","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"opacity":0.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":-0.3764576456166644,"cy":-1.9786371307415749,"cz":2.268765007024547,"lx":2.8256001957793133,"ly":0.2,"lz":17.11162413698611,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-1.7892577435063188,-1.9786371307415749,0.07664429931579812],"rightPoint":[1.0363424522729936,-1.9786371307415749,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"aAQtPcYcdvnjKLxjxpN6fj","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"opacity":0.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Foundation","cx":9.88256564470575,"cy":-18.302742621755318,"cz":0.05,"lx":5.358597805586726,"ly":4.404021553494953,"lz":0.10907253340755482,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":false,"color":"#ffffff","locked":false},{"type":"Wall","cx":-0.5591812718525784,"cy":10.613663444712508,"cz":2.2408122612280286,"lx":1.7651178031601384,"ly":0.2,"lz":17.11162413698611,"leftJoints":["dzLroXC8UBmujXxPj58BnJ"],"rightJoints":["2AP7zuBsHXSx9vjaaQ41Sa"],"leftPoint":[0.32337762972749395,10.613663444712508,0.09656797003029352],"rightPoint":[-1.4417401734326472,10.613663444712508,0.09656797003029352],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,2.576026974436725],"id":"9CKGzf7taYbb5TxpshE7KA","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"uGKYfaStAHZiUBuVtKS6dW","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"selected":false,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":0.32337762972749395,"cy":9.751643903669297,"cz":2.2301039869226305,"lx":1.7240390820864182,"ly":0.2,"lz":17.11162413698611,"leftJoints":["gH8a7zMeyH4srn6fpqovLp"],"rightJoints":["9CKGzf7taYbb5TxpshE7KA"],"leftPoint":[0.32337762972749395,8.889624362626087,0.09656797003029352],"rightPoint":[0.32337762972749395,10.613663444712508,0.09656797003029352],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,2.576026974436725],"id":"dzLroXC8UBmujXxPj58BnJ","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","wallStructure":"Default","opacity":0.5,"roofId":"uGKYfaStAHZiUBuVtKS6dW","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"selected":false,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":-1.4417401734326472,"cy":9.751643903669297,"cz":2.228839888904333,"lx":1.7240390820864182,"ly":0.2,"lz":17.11162413698611,"leftJoints":["9CKGzf7taYbb5TxpshE7KA"],"rightJoints":["gH8a7zMeyH4srn6fpqovLp"],"leftPoint":[-1.4417401734326472,10.613663444712508,0.09656797003029352],"rightPoint":[-1.4417401734326472,8.889624362626087,0.09656797003029352],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,2.576026974436725],"id":"2AP7zuBsHXSx9vjaaQ41Sa","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"uGKYfaStAHZiUBuVtKS6dW","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"selected":false,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":-0.5591812718525784,"cy":8.889624362626087,"cz":2.268765007024547,"lx":1.7651178031601384,"ly":0.2,"lz":17.11162413698611,"leftJoints":["2AP7zuBsHXSx9vjaaQ41Sa"],"rightJoints":["dzLroXC8UBmujXxPj58BnJ"],"leftPoint":[-1.4417401734326472,8.889624362626087,0.09656797003029352],"rightPoint":[0.32337762972749395,8.889624362626087,0.09656797003029352],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,2.576026974436725],"id":"gH8a7zMeyH4srn6fpqovLp","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"uGKYfaStAHZiUBuVtKS6dW","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"selected":false,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Foundation","cx":14.958059471973794,"cy":-10.376627749775599,"cz":0.05,"lx":3.9130970991852903,"ly":26.13645284205659,"lz":0.10907253340755482,"normal":[0,0,1],"rotation":[0,0,2.576026974436725],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7jmzUaUYBWVbxJMLM3ukrN","selected":false,"enableGroupMaster":false,"color":"#ffffff","locked":false},{"type":"Foundation","cx":7.577351540057415,"cy":-22.562392942244166,"cz":0.05,"lx":53.002191940731585,"ly":17.343791633088202,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3JxHzzEsV9Da6tuGXPViKy","color":"#ffffff","locked":false},{"type":"Wall","cx":0,"cy":6.071605429917916,"cz":0,"lx":41.97190103136961,"ly":0.3,"lz":10,"relativeAngle":3.141592653589793,"leftPoint":[20.985950515684806,6.071605429917916,0],"rightPoint":[-20.985950515684806,6.071605429917916,0],"leftJoints":["4R59jrQvJmq95aQT2Dv649"],"rightJoints":["iLwQ5UBgBL3sonqBcqFoC5"],"textureType":"Wall Texture #8","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"eaUtdoPPg5CEenHZ1cZ7yL","color":"white","roofId":"3pZdU1AL5k6hknNK4gDLPK","leftRoofHeight":10,"rightRoofHeight":10,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-20.985950515684806,"cy":-0.25298355957991303,"cz":0,"lx":12.64917797899566,"ly":0.3,"lz":10,"relativeAngle":-1.5707963267948966,"leftPoint":[-20.985950515684806,6.071605429917916,0],"rightPoint":[-20.985950515684806,-6.577572549077742,0],"leftJoints":["eaUtdoPPg5CEenHZ1cZ7yL"],"rightJoints":["puEFSm14QZKVxz67Z67N16"],"textureType":"Wall Texture #8","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"iLwQ5UBgBL3sonqBcqFoC5","color":"white","roofId":"3pZdU1AL5k6hknNK4gDLPK","leftRoofHeight":10,"rightRoofHeight":10,"centerRoofHeight":[0,13.341587920831635],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":0,"cy":-6.577572549077742,"cz":0,"lx":41.97190103136961,"ly":0.3,"lz":10,"relativeAngle":0,"leftPoint":[-20.985950515684806,-6.577572549077742,0],"rightPoint":[20.985950515684806,-6.577572549077742,0],"leftJoints":["iLwQ5UBgBL3sonqBcqFoC5"],"rightJoints":["4R59jrQvJmq95aQT2Dv649"],"textureType":"Wall Texture #8","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"puEFSm14QZKVxz67Z67N16","color":"white","roofId":"3pZdU1AL5k6hknNK4gDLPK","leftRoofHeight":10,"rightRoofHeight":10,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":20.985950515684806,"cy":-0.25298355957991303,"cz":0,"lx":12.64917797899566,"ly":0.3,"lz":10,"relativeAngle":1.5707963267948966,"leftPoint":[20.985950515684806,-6.577572549077742,0],"rightPoint":[20.985950515684806,6.071605429917916,0],"leftJoints":["puEFSm14QZKVxz67Z67N16"],"rightJoints":["eaUtdoPPg5CEenHZ1cZ7yL"],"textureType":"Wall Texture #8","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"4R59jrQvJmq95aQT2Dv649","color":"white","roofId":"3pZdU1AL5k6hknNK4gDLPK","leftRoofHeight":10,"rightRoofHeight":10,"centerRoofHeight":[0,13.341587920831635],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["9CKGzf7taYbb5TxpshE7KA","2AP7zuBsHXSx9vjaaQ41Sa","gH8a7zMeyH4srn6fpqovLp","dzLroXC8UBmujXxPj58BnJ"],"textureType":"Roof Texture #5","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,2.576026974436725],"parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","id":"uGKYfaStAHZiUBuVtKS6dW","locked":false,"rise":8.555812068493054,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["2RETAxyRMzZBEQkBGms56R","beHqET5NN8aNdsuBncMpY7","pPpJHGJ2bGVqLdA1FpXi4V","giYTP9Qg6uJ3yfkS1RoDqG"],"textureType":"Roof Texture #5","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"aAQtPcYcdvnjKLxjxpN6fj","locked":false,"rise":1.975489281315383,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Gable","roofStructure":"Default","wallsId":["eaUtdoPPg5CEenHZ1cZ7yL"],"textureType":"Roof Texture #5","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"3pZdU1AL5k6hknNK4gDLPK","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":false,"rise":3.3415879208316355,"ceiling":false},{"type":"Human","name":"Jack","cx":24.03461056644682,"cy":-0.9488790909164386,"cz":0.10000000149011613,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,1.0052306476418282],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"3LWACNGJBDVRSGmB2iRsbK","selected":false,"locked":false,"ly":0.42},{"type":"Wall","cx":0,"cy":6,"cz":0,"lx":27,"ly":0.3,"lz":10,"leftJoints":["bJ26Y2Ztj2wnvSCwMVZbSj"],"rightJoints":["iwUy27fkuqc81ipg2dgQZa"],"leftPoint":[13.5,6,0],"rightPoint":[-13.5,6,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"id":"agFV6snz1JdtWvd4JR2cDW","parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofId":"cHg19Gk5NDmFTLbhEqkpEc","selected":false,"leftRoofHeight":10,"rightRoofHeight":10,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-13.5,"cy":-0.25,"cz":0,"lx":12.5,"ly":0.3,"lz":10,"leftJoints":["agFV6snz1JdtWvd4JR2cDW"],"rightJoints":["c7vcy9r1yDujdJxgxp5TzY"],"leftPoint":[-13.499999999999998,6,0],"rightPoint":[-13.5,-6.5,0],"relativeAngle":4.71238898038469,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"id":"iwUy27fkuqc81ipg2dgQZa","parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofId":"cHg19Gk5NDmFTLbhEqkpEc","selected":false,"leftRoofHeight":10,"rightRoofHeight":10,"centerRoofHeight":[0,13.341587920831635],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":0,"cy":-6.5,"cz":0,"lx":27,"ly":0.3,"lz":10,"leftJoints":["iwUy27fkuqc81ipg2dgQZa"],"rightJoints":["bJ26Y2Ztj2wnvSCwMVZbSj"],"leftPoint":[-13.5,-6.5,0],"rightPoint":[13.5,-6.5,0],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"id":"c7vcy9r1yDujdJxgxp5TzY","parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofId":"cHg19Gk5NDmFTLbhEqkpEc","selected":false,"leftRoofHeight":10,"rightRoofHeight":10,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":13.5,"cy":-0.25,"cz":0,"lx":12.5,"ly":0.3,"lz":10,"leftJoints":["c7vcy9r1yDujdJxgxp5TzY"],"rightJoints":["agFV6snz1JdtWvd4JR2cDW"],"leftPoint":[13.5,-6.5,0],"rightPoint":[13.5,6,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"id":"bJ26Y2Ztj2wnvSCwMVZbSj","parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofId":"cHg19Gk5NDmFTLbhEqkpEc","selected":false,"leftRoofHeight":10,"rightRoofHeight":10,"centerRoofHeight":[0,13.341587920831635],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"id":"cHg19Gk5NDmFTLbhEqkpEc","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofType":"Gable","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["agFV6snz1JdtWvd4JR2cDW"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false,"rise":3.3415879208316355,"ceiling":false},{"type":"Foundation","cx":10.745099874695102,"cy":-19.099061544436797,"cz":0.05,"lx":34.0956484513338,"ly":17.139247765633556,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"aXmgoxjAJPULF92Dwj9wXo","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["rbfyBq5mDVjxhT7cHiZa6r"],"rightJoints":["evmZhzFqQUpVbc7Pz1QgMJ"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"wnNdNWw7uCJtb791q2h2kv","parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","opacity":0.5,"roofId":"xgcfKKQgeBMWdofPE3DXN2","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["tFV6qvitr5PH2Ab2oo3oSn"],"rightJoints":["wnNdNWw7uCJtb791q2h2kv"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"rbfyBq5mDVjxhT7cHiZa6r","parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","wallStructure":"Default","opacity":0.5,"roofId":"xgcfKKQgeBMWdofPE3DXN2","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["wnNdNWw7uCJtb791q2h2kv"],"rightJoints":["tFV6qvitr5PH2Ab2oo3oSn"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"evmZhzFqQUpVbc7Pz1QgMJ","parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","opacity":0.5,"roofId":"xgcfKKQgeBMWdofPE3DXN2","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["evmZhzFqQUpVbc7Pz1QgMJ"],"rightJoints":["rbfyBq5mDVjxhT7cHiZa6r"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"tFV6qvitr5PH2Ab2oo3oSn","parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","opacity":0.5,"roofId":"xgcfKKQgeBMWdofPE3DXN2","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"xgcfKKQgeBMWdofPE3DXN2","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["wnNdNWw7uCJtb791q2h2kv","evmZhzFqQUpVbc7Pz1QgMJ","tFV6qvitr5PH2Ab2oo3oSn","rbfyBq5mDVjxhT7cHiZa6r"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":-10.384377691463378,"cy":-33.417453285003795,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gddwwsiW9SAwt9BDP8qhGA","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["juENJWiqAWw4xaJKCkBnBu"],"rightJoints":["kR4ctZiA4puw1EFB5KiG5E"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"b44mniuvoz9x2PrRVmaHR2","parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","opacity":0.5,"roofId":"xvCWqbtBHhPfDxKkaUCj1N","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gmYm1iNZTPrTFyvZ3zM6wc"],"rightJoints":["b44mniuvoz9x2PrRVmaHR2"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"juENJWiqAWw4xaJKCkBnBu","parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","wallStructure":"Default","opacity":0.5,"roofId":"xvCWqbtBHhPfDxKkaUCj1N","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["b44mniuvoz9x2PrRVmaHR2"],"rightJoints":["gmYm1iNZTPrTFyvZ3zM6wc"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"kR4ctZiA4puw1EFB5KiG5E","parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","opacity":0.5,"roofId":"xvCWqbtBHhPfDxKkaUCj1N","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kR4ctZiA4puw1EFB5KiG5E"],"rightJoints":["juENJWiqAWw4xaJKCkBnBu"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"gmYm1iNZTPrTFyvZ3zM6wc","parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","opacity":0.5,"roofId":"xvCWqbtBHhPfDxKkaUCj1N","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"xvCWqbtBHhPfDxKkaUCj1N","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["b44mniuvoz9x2PrRVmaHR2","kR4ctZiA4puw1EFB5KiG5E","gmYm1iNZTPrTFyvZ3zM6wc","juENJWiqAWw4xaJKCkBnBu"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":-8.002707095672621,"cy":-29.66519620128789,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eTTCEUsedrFiMVxzGXSPUk","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["r3gZsm5d2NUURkeJvNjoh1"],"rightJoints":["6gbdPzRZhLL2pFKuqZLzc7"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"h6RcENRcyV9RrecCDiFvpW","parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","opacity":0.5,"roofId":"6gwGsxKD4B1rm1H1Vk3Ngq","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["oFJo6fvJ5KGuFkZ1uaJYjz"],"rightJoints":["h6RcENRcyV9RrecCDiFvpW"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"r3gZsm5d2NUURkeJvNjoh1","parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","wallStructure":"Default","opacity":0.5,"roofId":"6gwGsxKD4B1rm1H1Vk3Ngq","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["h6RcENRcyV9RrecCDiFvpW"],"rightJoints":["oFJo6fvJ5KGuFkZ1uaJYjz"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"6gbdPzRZhLL2pFKuqZLzc7","parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","opacity":0.5,"roofId":"6gwGsxKD4B1rm1H1Vk3Ngq","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["6gbdPzRZhLL2pFKuqZLzc7"],"rightJoints":["r3gZsm5d2NUURkeJvNjoh1"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"oFJo6fvJ5KGuFkZ1uaJYjz","parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","opacity":0.5,"roofId":"6gwGsxKD4B1rm1H1Vk3Ngq","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"6gwGsxKD4B1rm1H1Vk3Ngq","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["h6RcENRcyV9RrecCDiFvpW","6gbdPzRZhLL2pFKuqZLzc7","oFJo6fvJ5KGuFkZ1uaJYjz","r3gZsm5d2NUURkeJvNjoh1"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":-5.621036499881868,"cy":-25.912939117571987,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dry3LvTbwVtZ9zC2iXiS6E","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["tuFkkTxMLGJupvdG99JJmE"],"rightJoints":["dCPkgeninMwV2CefSv8Tyh"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"5VMupGYdfv6eXLkphmN6Sb","parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","opacity":0.5,"roofId":"vWxd63CkWo4geKwK32Aif7","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["f9C4rqMCfriiBEp6cWZTjf"],"rightJoints":["5VMupGYdfv6eXLkphmN6Sb"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"tuFkkTxMLGJupvdG99JJmE","parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","wallStructure":"Default","opacity":0.5,"roofId":"vWxd63CkWo4geKwK32Aif7","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["5VMupGYdfv6eXLkphmN6Sb"],"rightJoints":["f9C4rqMCfriiBEp6cWZTjf"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"dCPkgeninMwV2CefSv8Tyh","parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","opacity":0.5,"roofId":"vWxd63CkWo4geKwK32Aif7","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["dCPkgeninMwV2CefSv8Tyh"],"rightJoints":["tuFkkTxMLGJupvdG99JJmE"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"f9C4rqMCfriiBEp6cWZTjf","parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","opacity":0.5,"roofId":"vWxd63CkWo4geKwK32Aif7","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"vWxd63CkWo4geKwK32Aif7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["5VMupGYdfv6eXLkphmN6Sb","dCPkgeninMwV2CefSv8Tyh","f9C4rqMCfriiBEp6cWZTjf","tuFkkTxMLGJupvdG99JJmE"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":-3.2393659040911107,"cy":-22.16068203385608,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"teEJ9AmuMs6M9VZiHzT62s","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gwHuE3q3o7hQafGJcQ7Ldx"],"rightJoints":["1LixWzKAyzhWp6KyjXV5K9"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"8ATi9fhnsoTYgrRebeda98","parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","opacity":0.5,"roofId":"2igmnqP4fQU8AfDDqEEHxR","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["9xBo23SsCzdw2nMz6XkrRK"],"rightJoints":["8ATi9fhnsoTYgrRebeda98"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"gwHuE3q3o7hQafGJcQ7Ldx","parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","wallStructure":"Default","opacity":0.5,"roofId":"2igmnqP4fQU8AfDDqEEHxR","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["8ATi9fhnsoTYgrRebeda98"],"rightJoints":["9xBo23SsCzdw2nMz6XkrRK"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"1LixWzKAyzhWp6KyjXV5K9","parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","opacity":0.5,"roofId":"2igmnqP4fQU8AfDDqEEHxR","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["1LixWzKAyzhWp6KyjXV5K9"],"rightJoints":["gwHuE3q3o7hQafGJcQ7Ldx"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"9xBo23SsCzdw2nMz6XkrRK","parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","opacity":0.5,"roofId":"2igmnqP4fQU8AfDDqEEHxR","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"2igmnqP4fQU8AfDDqEEHxR","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["8ATi9fhnsoTYgrRebeda98","1LixWzKAyzhWp6KyjXV5K9","9xBo23SsCzdw2nMz6XkrRK","gwHuE3q3o7hQafGJcQ7Ldx"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":5.878850875181692,"cy":-43.63794559714253,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"w1GQJoXwTctyFPQTHvbCSJ","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gVQBUETgtMy9wnJS5MyAwR"],"rightJoints":["kZ3yx1o3MpryY5DEwAHRSu"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"mVXKFfUbKmFXpx4p6d1mu7","parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","opacity":0.5,"roofId":"d2Rg3hSVCMgqwYgvySw6Ve","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["uXfDQAFqu42CBoR6RERDEE"],"rightJoints":["mVXKFfUbKmFXpx4p6d1mu7"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"gVQBUETgtMy9wnJS5MyAwR","parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","wallStructure":"Default","opacity":0.5,"roofId":"d2Rg3hSVCMgqwYgvySw6Ve","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["mVXKFfUbKmFXpx4p6d1mu7"],"rightJoints":["uXfDQAFqu42CBoR6RERDEE"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"kZ3yx1o3MpryY5DEwAHRSu","parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","opacity":0.5,"roofId":"d2Rg3hSVCMgqwYgvySw6Ve","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kZ3yx1o3MpryY5DEwAHRSu"],"rightJoints":["gVQBUETgtMy9wnJS5MyAwR"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"uXfDQAFqu42CBoR6RERDEE","parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","opacity":0.5,"roofId":"d2Rg3hSVCMgqwYgvySw6Ve","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"d2Rg3hSVCMgqwYgvySw6Ve","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["mVXKFfUbKmFXpx4p6d1mu7","kZ3yx1o3MpryY5DEwAHRSu","uXfDQAFqu42CBoR6RERDEE","gVQBUETgtMy9wnJS5MyAwR"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":8.26052147097245,"cy":-39.88568851342663,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qFjTDh4kdKUejoECGaAtFF","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["4U2FUn1XmkrEQUaPmhvyyA"],"rightJoints":["jPqCvMBCkPVvRbVHByK9Sd"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"5zbGDbw5ZL64ZnafnWAddf","parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","opacity":0.5,"roofId":"efiH48pXLfRzfiE8Wi1bdv","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["jsjvgQe8PDECuTtUpZqqPx"],"rightJoints":["5zbGDbw5ZL64ZnafnWAddf"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"4U2FUn1XmkrEQUaPmhvyyA","parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","wallStructure":"Default","opacity":0.5,"roofId":"efiH48pXLfRzfiE8Wi1bdv","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["5zbGDbw5ZL64ZnafnWAddf"],"rightJoints":["jsjvgQe8PDECuTtUpZqqPx"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"jPqCvMBCkPVvRbVHByK9Sd","parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","opacity":0.5,"roofId":"efiH48pXLfRzfiE8Wi1bdv","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["jPqCvMBCkPVvRbVHByK9Sd"],"rightJoints":["4U2FUn1XmkrEQUaPmhvyyA"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"jsjvgQe8PDECuTtUpZqqPx","parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","opacity":0.5,"roofId":"efiH48pXLfRzfiE8Wi1bdv","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"efiH48pXLfRzfiE8Wi1bdv","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["5zbGDbw5ZL64ZnafnWAddf","jPqCvMBCkPVvRbVHByK9Sd","jsjvgQe8PDECuTtUpZqqPx","4U2FUn1XmkrEQUaPmhvyyA"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":10.6421920667632,"cy":-36.13343142971072,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eawHcqEx4ydgKwpfjVv9RR","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kzoM97zxdWMYoEvnY6njBU"],"rightJoints":["hCESxuxDssAckoNt8Ysqfa"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"hjQtHP6wU1C98tsKp38NFc","parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","opacity":0.5,"roofId":"fyUg5zq8ntfBYqeveZG1Mz","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["rpsA3uefMnrgXZ2ssSvfxV"],"rightJoints":["hjQtHP6wU1C98tsKp38NFc"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"kzoM97zxdWMYoEvnY6njBU","parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","wallStructure":"Default","opacity":0.5,"roofId":"fyUg5zq8ntfBYqeveZG1Mz","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["hjQtHP6wU1C98tsKp38NFc"],"rightJoints":["rpsA3uefMnrgXZ2ssSvfxV"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"hCESxuxDssAckoNt8Ysqfa","parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","opacity":0.5,"roofId":"fyUg5zq8ntfBYqeveZG1Mz","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["hCESxuxDssAckoNt8Ysqfa"],"rightJoints":["kzoM97zxdWMYoEvnY6njBU"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"rpsA3uefMnrgXZ2ssSvfxV","parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","opacity":0.5,"roofId":"fyUg5zq8ntfBYqeveZG1Mz","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"fyUg5zq8ntfBYqeveZG1Mz","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["hjQtHP6wU1C98tsKp38NFc","hCESxuxDssAckoNt8Ysqfa","rpsA3uefMnrgXZ2ssSvfxV","kzoM97zxdWMYoEvnY6njBU"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":13.023862662553956,"cy":-32.381174345994815,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"g52oWNGab2d5tJm7ExTD79","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["vpoRybfzCjbHDw4Zf7t8V7"],"rightJoints":["pWk5x2zZNk49mb2AbHyPt9"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"85JuGPRhVTskx5HKKPLWZJ","parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","opacity":0.5,"roofId":"uzoWkkSM6BdFkW3tQ9QEeP","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["a723GZeeHDaeGxxKov9kNA"],"rightJoints":["85JuGPRhVTskx5HKKPLWZJ"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"vpoRybfzCjbHDw4Zf7t8V7","parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","wallStructure":"Default","opacity":0.5,"roofId":"uzoWkkSM6BdFkW3tQ9QEeP","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["85JuGPRhVTskx5HKKPLWZJ"],"rightJoints":["a723GZeeHDaeGxxKov9kNA"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"pWk5x2zZNk49mb2AbHyPt9","parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","opacity":0.5,"roofId":"uzoWkkSM6BdFkW3tQ9QEeP","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["pWk5x2zZNk49mb2AbHyPt9"],"rightJoints":["vpoRybfzCjbHDw4Zf7t8V7"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"a723GZeeHDaeGxxKov9kNA","parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","opacity":0.5,"roofId":"uzoWkkSM6BdFkW3tQ9QEeP","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"uzoWkkSM6BdFkW3tQ9QEeP","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["85JuGPRhVTskx5HKKPLWZJ","pWk5x2zZNk49mb2AbHyPt9","a723GZeeHDaeGxxKov9kNA","vpoRybfzCjbHDw4Zf7t8V7"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":23.539261545507316,"cy":-15.785608947862563,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"e3sKy7gdQ45ovgtshJNKSh","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["ucyqM28VHCejiYXSBRU74w"],"rightJoints":["wCoXQcNBi6mJ5wS4Y6r4VL"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"mRLpMEwUpk6b3VqzxYNaep","parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","opacity":0.5,"roofId":"4sAKtdpUfojEauuc9xKUx9","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["oqTZ9Y5zqDf3qpPSoAsnfq"],"rightJoints":["mRLpMEwUpk6b3VqzxYNaep"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"ucyqM28VHCejiYXSBRU74w","parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","wallStructure":"Default","opacity":0.5,"roofId":"4sAKtdpUfojEauuc9xKUx9","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["mRLpMEwUpk6b3VqzxYNaep"],"rightJoints":["oqTZ9Y5zqDf3qpPSoAsnfq"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"wCoXQcNBi6mJ5wS4Y6r4VL","parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","opacity":0.5,"roofId":"4sAKtdpUfojEauuc9xKUx9","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["wCoXQcNBi6mJ5wS4Y6r4VL"],"rightJoints":["ucyqM28VHCejiYXSBRU74w"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"oqTZ9Y5zqDf3qpPSoAsnfq","parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","opacity":0.5,"roofId":"4sAKtdpUfojEauuc9xKUx9","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"4sAKtdpUfojEauuc9xKUx9","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["mRLpMEwUpk6b3VqzxYNaep","wCoXQcNBi6mJ5wS4Y6r4VL","oqTZ9Y5zqDf3qpPSoAsnfq","ucyqM28VHCejiYXSBRU74w"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":7.4047851687956925,"cy":-5.505166586090663,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9NZEpPcimoPFTA7fAmDMQW","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kfCkPxHEQXF9CME4mp5rfJ"],"rightJoints":["m1iEhgTKYmokoNeBfUn1Zw"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"kywCD23ffmYn7n35c65bvN","parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","opacity":0.5,"roofId":"uZ3WYfpisjGExUNhqUQ6GJ","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["5nYLFT5aCGPe4ESsdg7FAP"],"rightJoints":["kywCD23ffmYn7n35c65bvN"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"kfCkPxHEQXF9CME4mp5rfJ","parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","wallStructure":"Default","opacity":0.5,"roofId":"uZ3WYfpisjGExUNhqUQ6GJ","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kywCD23ffmYn7n35c65bvN"],"rightJoints":["5nYLFT5aCGPe4ESsdg7FAP"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"m1iEhgTKYmokoNeBfUn1Zw","parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","opacity":0.5,"roofId":"uZ3WYfpisjGExUNhqUQ6GJ","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["m1iEhgTKYmokoNeBfUn1Zw"],"rightJoints":["kfCkPxHEQXF9CME4mp5rfJ"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"5nYLFT5aCGPe4ESsdg7FAP","parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","opacity":0.5,"roofId":"uZ3WYfpisjGExUNhqUQ6GJ","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"uZ3WYfpisjGExUNhqUQ6GJ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["kywCD23ffmYn7n35c65bvN","m1iEhgTKYmokoNeBfUn1Zw","5nYLFT5aCGPe4ESsdg7FAP","kfCkPxHEQXF9CME4mp5rfJ"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":25.920932141298064,"cy":-12.03335186414666,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"aU7wo9HzTSBezmB9xaSNVe","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["3Yw9eyhMVgXRzWxARHi4qj"],"rightJoints":["gLQjrbahvSyZbT7mE7nLTs"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"tsTPsXh1D4u1sYk5kevjpw","parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","opacity":0.5,"roofId":"t86AYAH7J8wQCFq8cXiLAx","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["eve2xjCEYcENW3bQKBtFbH"],"rightJoints":["tsTPsXh1D4u1sYk5kevjpw"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"3Yw9eyhMVgXRzWxARHi4qj","parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","wallStructure":"Default","opacity":0.5,"roofId":"t86AYAH7J8wQCFq8cXiLAx","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["tsTPsXh1D4u1sYk5kevjpw"],"rightJoints":["eve2xjCEYcENW3bQKBtFbH"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"gLQjrbahvSyZbT7mE7nLTs","parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","opacity":0.5,"roofId":"t86AYAH7J8wQCFq8cXiLAx","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gLQjrbahvSyZbT7mE7nLTs"],"rightJoints":["3Yw9eyhMVgXRzWxARHi4qj"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"eve2xjCEYcENW3bQKBtFbH","parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","opacity":0.5,"roofId":"t86AYAH7J8wQCFq8cXiLAx","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"t86AYAH7J8wQCFq8cXiLAx","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["tsTPsXh1D4u1sYk5kevjpw","gLQjrbahvSyZbT7mE7nLTs","eve2xjCEYcENW3bQKBtFbH","3Yw9eyhMVgXRzWxARHi4qj"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":9.786455764586453,"cy":-1.752909502374763,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7JsauhgC1ELukuq9oR7WP3","selected":false,"locked":false},{"type":"Wall","cx":1.1857370908139018,"cy":9.993801958880498,"cz":0,"lx":39.97362197823709,"ly":0.3,"lz":4.929284805861828,"leftJoints":["7ZPYuSaC3udPdFwLBc9LcF"],"rightJoints":["dHQToxKir9k3FNNhxE7P9U"],"leftPoint":[21.172548079932447,9.993801958880498,0.049292848058618284],"rightPoint":[-18.80107389830464,9.993801958880498,0.049292848058618284],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"bMP8c52yyd4ARJDKPf1aWM","parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofId":"vQHPZRPjRtVs3kCxxrFEVN","selected":false,"leftRoofHeight":4.929284805861828,"rightRoofHeight":4.929284805861828,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.929284805861828,"rightTopPartialHeight":4.929284805861828},{"type":"Wall","cx":-18.80107389830464,"cy":0.044516399695865516,"cz":0,"lx":19.89857111836926,"ly":0.3,"lz":4.929284805861828,"leftJoints":["bMP8c52yyd4ARJDKPf1aWM"],"rightJoints":["7MR7F47mpBryE1Ejti6rUy"],"leftPoint":[-18.80107389830464,9.993801958880498,0.049292848058618284],"rightPoint":[-18.80107389830464,-9.904769159488765,0.049292848058618284],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"dHQToxKir9k3FNNhxE7P9U","parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofId":"vQHPZRPjRtVs3kCxxrFEVN","selected":false,"leftRoofHeight":4.929284805861828,"rightRoofHeight":4.929284805861828,"centerRoofHeight":[0,8.270872726693463],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.929284805861828,"rightTopPartialHeight":4.929284805861828},{"type":"Wall","cx":1.1857370908139018,"cy":-9.904769159488765,"cz":0,"lx":39.97362197823709,"ly":0.3,"lz":4.929284805861828,"leftJoints":["dHQToxKir9k3FNNhxE7P9U"],"rightJoints":["7ZPYuSaC3udPdFwLBc9LcF"],"leftPoint":[-18.80107389830464,-9.904769159488765,0.049292848058618284],"rightPoint":[21.172548079932447,-9.904769159488765,0.049292848058618284],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"7MR7F47mpBryE1Ejti6rUy","parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofId":"vQHPZRPjRtVs3kCxxrFEVN","selected":false,"leftRoofHeight":4.929284805861828,"rightRoofHeight":4.929284805861828,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.929284805861828,"rightTopPartialHeight":4.929284805861828},{"type":"Wall","cx":21.172548079932447,"cy":0.044516399695865516,"cz":0,"lx":19.89857111836926,"ly":0.3,"lz":4.929284805861828,"leftJoints":["7MR7F47mpBryE1Ejti6rUy"],"rightJoints":["bMP8c52yyd4ARJDKPf1aWM"],"leftPoint":[21.172548079932447,-9.904769159488765,0.049292848058618284],"rightPoint":[21.172548079932447,9.993801958880498,0.049292848058618284],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"7ZPYuSaC3udPdFwLBc9LcF","parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofId":"vQHPZRPjRtVs3kCxxrFEVN","selected":false,"leftRoofHeight":4.929284805861828,"rightRoofHeight":4.929284805861828,"centerRoofHeight":[0,8.270872726693463],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.929284805861828,"rightTopPartialHeight":4.929284805861828},{"id":"vQHPZRPjRtVs3kCxxrFEVN","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofType":"Gable","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["bMP8c52yyd4ARJDKPf1aWM"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false,"rise":3.3415879208316355,"ceiling":false},{"type":"Foundation","cx":7.4620263843372925,"cy":-23.808571879858576,"cz":0.1,"lx":57.05667537827628,"ly":36.07153705363366,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","textureType":"Foundation Texture #2","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"rmtVJVWrnHvQEaqLr1b9Tf","selected":false,"enableGroupMaster":true,"locked":false},{"type":"Door","cx":0.019764130160484145,"cy":0,"cz":-0.35,"lx":0.3557543428887146,"ly":0,"lz":0.3,"textureType":"Door Texture #7","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"4R59jrQvJmq95aQT2Dv649","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"5i5aw65ViZQJ6ANMtaYEt3","locked":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.3162260825677463,"cy":0.1,"cz":4.4408920985006264e-17,"lx":0.1581130412838731,"ly":0.3,"lz":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4R59jrQvJmq95aQT2Dv649","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"gAXs9sJoJF81X2Sdijoe3o","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.35575434288871466,"cy":0.1,"cz":4.4408920985006264e-17,"lx":0.15811304128387302,"ly":0.3,"lz":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4R59jrQvJmq95aQT2Dv649","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"agk3V1PDaTw1t7ybFJCTUJ","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.019764130160484145,"cy":0.1,"cz":0.1625,"lx":0.3557543428887146,"ly":0.3,"lz":0.575,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4R59jrQvJmq95aQT2Dv649","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"mnCW9Hm1zy48vmk8GxhHip","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":2.25},{"type":"Window","cx":0.2939438414261553,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"dJzbjbMH3V7vVry4QUZJ1h","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.36899333285410985,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aVMji7S1iMqS6e5iGevjST","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.4440428242820644,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4xnBXKk3mzEiVTEU1sUo9z","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.4440428242820644,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vGt71VZQKGWWqARuxaBuHk","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.36899333285410985,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"nQw98VMPrH5pKkcEzYqYAr","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.2939438414261553,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"oDAHJqV8nu3rm8iXJXkjDo","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.21889434999820076,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"dQtpLnqk4XU6QXdnZwYZ3y","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.1438448585702462,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"fnp6cZDYtVkBgXyRLqoy4k","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.4440428242820644,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"taL5VcYj3uWGDL8xr44zFA","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.36899333285410985,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"36eQAALv2V7tE2Nitdg2Z9","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.2939438414261553,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"j19CocmDx5qUxbi12esWTq","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.1438448585702462,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aNTKQXqg4KFQWerkNfvi67","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.21889434999820076,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"7wkeWMuadLGRRHvrhXkgXu","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.2939438414261553,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"pP3XvCSY89vtf8Jf82MA2Q","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.36899333285410985,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"o5mLe8ag3RmgrS6cYio7c2","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.4440428242820644,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"sJP9KeY4DvXEbM21cwfCL6","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.4,"cy":0.1,"cz":0.025,"lx":0.08,"ly":0.3,"lz":0.85,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"faxjoAqSZje6BEDac2ztM3","parentId":"bJ26Y2Ztj2wnvSCwMVZbSj","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.125,"lx":0.16,"ly":0.3,"lz":1.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2KQEWZui5HypVTjznRgV1e","parentId":"bJ26Y2Ztj2wnvSCwMVZbSj","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.4,"cy":0.1,"cz":0.025,"lx":0.08,"ly":0.3,"lz":0.85,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vmXEoXgzaz3BcPRdhwTBNF","parentId":"bJ26Y2Ztj2wnvSCwMVZbSj","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.4,"cy":0.1,"cz":0.025,"lx":0.08,"ly":0.3,"lz":0.85,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jgVVfzMun1U9KUtjVLXpLW","parentId":"iwUy27fkuqc81ipg2dgQZa","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4,"cy":0.1,"cz":0.025,"lx":0.08,"ly":0.3,"lz":0.85,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"7LVpvnWs9aYvqrDqGeRFsz","parentId":"iwUy27fkuqc81ipg2dgQZa","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0040000000000000036,"cy":0.1,"cz":0.14500000000000002,"lx":0.2,"ly":0.3,"lz":1.05,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"kUvJ29KgoC2Mx2n6oquM7i","parentId":"iwUy27fkuqc81ipg2dgQZa","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Human","name":"Jade","cx":24.498922181392803,"cy":0.35278398935384025,"cz":0.10000000149011613,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,1.0052306476418282],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"8oCpJQ69v59EaR16ZevwwH","selected":false,"locked":false,"ly":0.48},{"type":"Human","name":"Jennifer","cx":24.15853922395012,"cy":-4.360566668970516,"cz":0.10000000149011613,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"23pVVVaYxcEWbusAdT9bp6","selected":false,"locked":false,"ly":0.45},{"type":"Human","name":"Jeanette","cx":23.512736665641548,"cy":-5.246201365995199,"cz":0.1000000014901179,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"vLrAF4TXaJsxUnvTqvZyhr","selected":false,"locked":false,"ly":0.4},{"type":"Human","name":"Judd","cx":23.688249777842685,"cy":-7.134597873618337,"cz":0.10000000149011613,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"72RNARnNBupWUTwLyPFi2x","selected":false,"locked":false,"ly":0.544},{"type":"Flower","name":"Hydrangea","cx":14.106133352222937,"cy":-12.792118753025974,"cz":0.1000000014901179,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"hxA3iWj7PVq4oxfYivWPDZ","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":16.106133352222937,"cy":-12.792118753025974,"cz":0.1000000014901179,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"em4eb843STnngTiG8Pq4ZG","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":18.106133352222937,"cy":-12.792118753025974,"cz":0.1000000014901179,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"xn9oq6YLSQoRDx2Th897Ey","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":20.106133352222937,"cy":-12.792118753025974,"cz":0.1000000014901179,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"n5Xm3uZ3yogruAzMr3ekgG","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":12.711504093322223,"cy":12.55312249061943,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"vGSyjGNkAKGrDeLZUtMvLb","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":15.040744575677394,"cy":12.500852726588041,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"xdceQ9SQzswYkrUwEtMzsR","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":17.31542920437773,"cy":12.41395471892114,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"1diZFF1KGB7XeeLHtoXNtr","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":19.66459729675223,"cy":12.4508690521801,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"4Rb2MRXZ3tKBv37PWSvEzQ","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-17.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"vhFQBJS6Fh7bkaVvXfo1NR","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-15.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"dFZa68UKB2fanAfPxKpSfp","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-13.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"u1q3FxnjwFSpD8qDLT3jLw","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-11.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"i63WTBeMTnSDnxeSuJpFZf","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-9.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"xiSxNNSCHQvhBkz8weBtDU","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-7.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"1urqV2akP9gK1CshpjMiad","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-5.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"iBL1h5VnnSJTEgMS6joQZh","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-3.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"rr534i2kNra6AbjGze6tbb","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-17.839350032255844,"cy":12.586893239928504,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"gbD24xDaa2k33ZoxvEb6oz","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-15.787787005334005,"cy":12.526983753449453,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"uBAQNvAScFhk39Y9iwCNjY","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-13.758974118534871,"cy":12.689520734967552,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"kPa2FJR2pvHaWxWxA6FLVw","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-11.91848248954889,"cy":12.495637874367116,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"qCbupam4PMgJ8bX3HzPiMM","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-9.771115833391356,"cy":12.37809450353804,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"uMoz3GQoaHbHMecPfBqzkq","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-7.782512420623269,"cy":12.558430909387932,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"uKXc9jut6dFoRru4RQMPUM","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-5.490189984387705,"cy":12.433086575302662,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"iWmJ1E8vNxV24C2rg3YseQ","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-2.9411297348927254,"cy":12.354975599770267,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"gTnMje1b6tBrp8YWHbFCqb","selected":false,"locked":false},{"type":"Tree","name":"Magnolia","cx":23.96071696630824,"cy":-44.82446487452612,"cz":0,"lx":7.42077263012308,"lz":11.136257929861511,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"1WJdNkrobPPSWfLEoaVoK7","selected":false,"locked":false,"flip":true},{"type":"Tree","name":"Magnolia","cx":33.556040711677696,"cy":-28.810119661301552,"cz":0,"lx":7.42077263012308,"lz":11.136257929861511,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9PY4aB8JZi8u5zBp4N8KWJ","selected":false,"locked":false},{"type":"Tree","name":"Magnolia","cx":-6.440436625289015,"cy":-3.053996336525085,"cz":0,"lx":7.42077263012308,"lz":11.136257929861511,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"4GFXCjc87cvCMmXmHyPFgU","selected":false,"locked":false},{"type":"Tree","name":"Magnolia","cx":-11.363079989838765,"cy":-10.70167442074012,"cz":0,"lx":7.42077263012308,"lz":11.136257929861511,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"mnYhfWGZdarqEGdoNy3nZY","selected":false,"locked":false,"flip":true},{"type":"Human","name":"Jaye","cx":-9.814032718831394,"cy":-16.689844349152544,"cz":0.10000000149011702,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"2reV16jkVqXG2TtRUqYKXY","selected":false,"locked":false,"ly":0.55},{"type":"Window","cx":-0.3931201493034107,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"w43ATGzZw2efL2uLDpm4P8","parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2859055631297533,"cy":0.1,"cz":0.32499999999999996,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"iZNLiBj11xETGpzE6fwM9U","parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.17869097695609581,"cy":0.1,"cz":0.32500000000000007,"lx":0.02382546359414602,"ly":0.3,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"9AjuE6mwgTZmX4VvbqAs3y","parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.08338912257951141,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"fJi9i8gEPxfpsgBYXywEnj","parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.07147639078243827,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"925Dk6Ft7JiUDRySfQMrYy","parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.17869097695609581,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"a4xwf7BynvydJnSiBM877Z","parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2859055631297533,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"ozvNDrL6sKDfgo668mHjk9","parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3931201493034107,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"q6g4rybSU63f4mHggAAJRU","parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.28590556312975324,"cy":0.1,"cz":0.32500000000000007,"lx":0.023825463594146105,"ly":0.3,"lz":0.25000000000000017,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"2rTqwrtxBDgy6QaZefzNsm","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3931201493034107,"cy":0.1,"cz":0.325,"lx":0.023825463594146105,"ly":0.3,"lz":0.25,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"bLab7Y2bZ3ran5xf7gqkpy","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3931201493034107,"cy":0.1,"cz":0.325,"lx":0.023825463594146105,"ly":0.3,"lz":0.25,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"6BiRTS7hCwUwcWSrYNnhUQ","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.28590556312975324,"cy":0.1,"cz":0.325,"lx":0.023825463594146147,"ly":0.3,"lz":0.25,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"7unzgHw9BGUs7eL9a5oKXh","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-3.510814778537278e-17,"cy":0.1,"cz":0.125,"lx":0.23716956192580982,"ly":0.3,"lz":1.05,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iLwQ5UBgBL3sonqBcqFoC5","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"jbGnjsCChKRb1kQuYrUT5d","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Human","name":"Jocelyn","cx":-19.644729072809923,"cy":-15.043092228016992,"cz":0.10000000149011702,"lx":0.4,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"mDGKhZ6QHKAjKHhMgj8e9r","selected":false,"locked":false,"ly":0.4},{"type":"Human","name":"Jedi","cx":-21.40281107675301,"cy":-11.905580437823337,"cz":0.10000000149011613,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"kKfw47d3CRnoAajE5xamBN","selected":false,"ly":0.56,"locked":false},{"type":"Human","name":"Joey","cx":-10.626252329426645,"cy":-15.36971947531225,"cz":0.10000000149011525,"lx":0.462,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"w9rWjW5nMD7ysqTc51hQsW","selected":false,"ly":0.462,"locked":false},{"type":"Tree","name":"Linden","cx":-28.5283374786377,"cy":2.5670594706748773,"cz":0.09215714161556932,"lx":12.56599065387215,"lz":17.875438659167433,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"8QYb3yiDqtDAebwAsHj1PL","selected":false,"locked":false},{"type":"Tree","name":"Linden","flip":true,"cx":-1.0744344498561738,"cy":-55.986059359035295,"cz":0,"lx":7.368180679718989,"lz":10.847055184453376,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mxWw8g34JBPawafnUyy3eX","selected":false,"locked":false},{"type":"Tree","name":"Linden","flip":false,"cx":-8.805777739086423,"cy":-50.96204115065417,"cz":0,"lx":9.893561641812246,"lz":10.847055184453376,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"hfHvh9t2Cet9WXvsjAPh7t","selected":false,"locked":false},{"type":"Window","cx":-1.375205378309486e-16,"cy":0.1,"cz":0.3652487893589756,"lx":0.353907110246429,"ly":0.2,"lz":0.08765970944615396,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":0.8,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73d8ff","tint":"#009ce0","opacity":0.9,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"2Ly2StWGBYNwBSYafFGNuR","windowType":"Default","archHeight":1},{"type":"Window","cx":-3.2517565688624697e-16,"cy":0.1,"cz":0.36524878935897553,"lx":0.36611524179571514,"ly":0.2,"lz":0.08765970944615402,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":0.8,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73d8ff","tint":"#009ce0","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"v2e9bxX15mdBzVMafhi23N","windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3652487893589755,"lx":0.35390711024642874,"ly":0.2,"lz":0.08765970944615412,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":0.8,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73d8ff","tint":"#009ce0","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"nRNf4jj3t7m3SLG7DzYeL9","windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3652487893589755,"lx":0.36611524179571453,"ly":0.2,"lz":0.08765970944615412,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":0.8,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73d8ff","tint":"#009ce0","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"rE6cHpj3a1a3s58XNqPkDx","windowType":"Default","archHeight":1}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[21.8332121686219,1.6957671677596553,0.0000071623250231361926],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[21.8332121686219,1.6956171610724768,150],"theme":"Lake","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[31.117746115680333,-61.74530628577921,6.635303925622853],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":11.97473878476758,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#696635","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[8.743444485308892,-20.90776182518235,5.656639637187283],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},450:function(e){e.exports=JSON.parse('{"docid":"rb7ptdm5a1RqrxS7efVQBm","time":"05/10/2023 10:24 am","timestamp":1683728645588,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":2,"date":"4/22/2022, 4:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":22.123368787949577,"solarUpdraftTower":{},"parentId":"Ground","cx":31.92543795669036,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":2.1656113002014568,"type":"Foundation","solarPowerTower":{},"lx":21.251959060399457,"lz":0.5,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.25,"textureType":"No Foundation Texture","enableGroupMaster":false,"color":"#999999","locked":false},{"type":"Human","name":"Jack","cx":-2.477311032723648,"cy":-35.3224465130531,"cz":0.300000011920929,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","id":"bxVgnTyTS3rQB9DZjweZGa","selected":false,"ly":0.42,"locked":false},{"type":"Wall","cx":-4.882174640318183,"cy":3.2723372961326387,"cz":0,"lx":2.2370509461013435,"ly":0.1,"lz":61,"relativeAngle":4.301576093475627,"leftPoint":[-4.435486222481405,4.29779752999532,0.5],"rightPoint":[-5.328863058154962,2.2468770622699576,0.5],"leftJoints":["twZXBhJnLkQAfkhcdZPvcE"],"rightJoints":["6BBNNShnXYdN4Fo6vrLZgS"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"pqrUfkTtDCPWZgLQ2ZZY2x","roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-5.328863058154962,"cy":0.9968770622699568,"cz":0,"lx":2.5,"ly":0.1,"lz":61,"relativeAngle":4.71238898038469,"leftPoint":[-5.328863058154962,2.2468770622699568,0.5],"rightPoint":[-5.328863058154962,-0.25312293773004324,0.5],"leftJoints":["pqrUfkTtDCPWZgLQ2ZZY2x"],"rightJoints":[],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"6BBNNShnXYdN4Fo6vrLZgS","roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-3.685486222481405,"cy":5.04779752999532,"cz":0,"lx":2.1213203435596424,"ly":0.1,"lz":61,"leftJoints":["o7owRXdGmtoUmGe7aMBfwD"],"rightJoints":["pqrUfkTtDCPWZgLQ2ZZY2x"],"leftPoint":[-2.935486222481405,5.79779752999532,0.5],"rightPoint":[-4.435486222481405,4.29779752999532,0.5],"relativeAngle":3.9269908169872414,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"twZXBhJnLkQAfkhcdZPvcE","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-1.935486222481405,"cy":6.29779752999532,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["7oCL7hfQ9Q5pKtbUKfbhxC"],"rightJoints":["twZXBhJnLkQAfkhcdZPvcE"],"leftPoint":[-0.9354862224814049,6.79779752999532,0.5],"rightPoint":[-2.935486222481405,5.79779752999532,0.5],"relativeAngle":3.6052402625905993,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"o7owRXdGmtoUmGe7aMBfwD","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":0.31451377751859866,"cy":6.797797529995318,"cz":0,"lx":2.5,"ly":0.1,"lz":61,"leftJoints":["9Qfx6trBssgAGuZJMWpoN4"],"rightJoints":["o7owRXdGmtoUmGe7aMBfwD"],"leftPoint":[1.5645137775185987,6.79779752999532,0.5],"rightPoint":[-0.9354862224814049,6.797797529995316,0.5],"relativeAngle":3.141592653589795,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"7oCL7hfQ9Q5pKtbUKfbhxC","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.5645137775185987,"cy":6.29779752999532,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["nXkkPMC5GnQsGGo6pXGf1J"],"rightJoints":["7oCL7hfQ9Q5pKtbUKfbhxC"],"leftPoint":[3.5645137775185987,5.79779752999532,0.5],"rightPoint":[1.5645137775185987,6.79779752999532,0.5],"relativeAngle":2.677945044588988,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"9Qfx6trBssgAGuZJMWpoN4","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.314513777518599,"cy":5.04779752999532,"cz":0,"lx":2.1213203435596424,"ly":0.1,"lz":61,"leftJoints":["ukLTgjquG74WrHxQMTeCGR"],"rightJoints":["9Qfx6trBssgAGuZJMWpoN4"],"leftPoint":[5.064513777518599,4.29779752999532,0.5],"rightPoint":[3.5645137775185987,5.79779752999532,0.5],"relativeAngle":2.356194490192344,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"nXkkPMC5GnQsGGo6pXGf1J","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.564513777518599,"cy":3.2977975299953197,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["ieCZYgGYnWFZFTUUeDJ4Kc"],"rightJoints":["nXkkPMC5GnQsGGo6pXGf1J"],"leftPoint":[6.064513777518599,2.2977975299953197,0.5],"rightPoint":[5.064513777518599,4.29779752999532,0.5],"relativeAngle":2.0344439357957036,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ukLTgjquG74WrHxQMTeCGR","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":6.064513777518599,"cy":1.0477975299953193,"cz":0,"lx":2.5,"ly":0.1,"lz":61,"leftJoints":["1mFHht66LtQmGXw2uwQpTW"],"rightJoints":["ukLTgjquG74WrHxQMTeCGR"],"leftPoint":[6.064513777518599,-0.20220247000468072,0.5],"rightPoint":[6.064513777518599,2.2977975299953197,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ieCZYgGYnWFZFTUUeDJ4Kc","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-4.882174640318183,"cy":-1.2276627038673618,"cz":0,"lx":2.144069307100406,"ly":0.1,"lz":61,"leftJoints":[],"rightJoints":["ne25yHm9jCD9Vx7iYW9GUg"],"leftPoint":[-5.328863058154958,-0.2531229377300428,0.5],"rightPoint":[-4.435486222481405,-2.2022024700046807,0.5],"relativeAngle":5.142171914901031,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"rnDe8ZUbiedJjvYKnAx9vs","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.564513777518599,"cy":-1.2022024700046807,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["hDTYb7CsL6KjhaG3K3ZaEb"],"rightJoints":["ieCZYgGYnWFZFTUUeDJ4Kc"],"leftPoint":[5.064513777518599,-2.2022024700046807,0.5],"rightPoint":[6.064513777518599,-0.20220247000468072,0.5],"relativeAngle":1.1071487177940904,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"1mFHht66LtQmGXw2uwQpTW","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.314513777518599,"cy":-2.9522024700046807,"cz":0,"lx":2.1213203435596424,"ly":0.1,"lz":61,"leftJoints":["ngivbbtv3RRgTjMZ9HM5iJ"],"rightJoints":["1mFHht66LtQmGXw2uwQpTW"],"leftPoint":[3.5645137775185987,-3.7022024700046807,0.5],"rightPoint":[5.064513777518599,-2.2022024700046807,0.5],"relativeAngle":0.7853981633974483,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"hDTYb7CsL6KjhaG3K3ZaEb","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.5645137775185987,"cy":-4.20220247000468,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["2sbTRgNVHvPNpK2pDRUNQN"],"rightJoints":["hDTYb7CsL6KjhaG3K3ZaEb"],"leftPoint":[1.5645137775185987,-4.70220247000468,0.5],"rightPoint":[3.5645137775185987,-3.7022024700046807,0.5],"relativeAngle":0.46364760900080615,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ngivbbtv3RRgTjMZ9HM5iJ","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":0.31451377751859866,"cy":-4.70220247000468,"cz":0,"lx":2.5,"ly":0.1,"lz":61,"leftJoints":["7kjEcCQNbaUjRAbeSyBXZx"],"rightJoints":["ngivbbtv3RRgTjMZ9HM5iJ"],"leftPoint":[-0.9354862224814049,-4.70220247000468,0.5],"rightPoint":[1.5645137775185987,-4.70220247000468,0.5],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"2sbTRgNVHvPNpK2pDRUNQN","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-1.935486222481405,"cy":-4.202202470004682,"cz":0,"lx":2.2360679774997907,"ly":0.1,"lz":61,"leftJoints":["ne25yHm9jCD9Vx7iYW9GUg"],"rightJoints":["2sbTRgNVHvPNpK2pDRUNQN"],"leftPoint":[-2.935486222481405,-3.7022024700046807,0.5],"rightPoint":[-0.9354862224814049,-4.702202470004682,0.5],"relativeAngle":5.819537698178779,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"7kjEcCQNbaUjRAbeSyBXZx","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-3.685486222481405,"cy":-2.9522024700046807,"cz":0,"lx":2.1213203435596424,"ly":0.1,"lz":61,"leftJoints":["rnDe8ZUbiedJjvYKnAx9vs"],"rightJoints":["7kjEcCQNbaUjRAbeSyBXZx"],"leftPoint":[-4.435486222481405,-2.2022024700046807,0.5],"rightPoint":[-2.935486222481405,-3.7022024700046807,0.5],"relativeAngle":5.497787143782138,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ne25yHm9jCD9Vx7iYW9GUg","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-0.316601796041418,"cy":-12.89173870425908,"cz":2.2408122612280286,"lx":16.92215779250457,"ly":0.1,"lz":60,"leftJoints":["55SwaH9QxLHmcgrnQzAWTs"],"rightJoints":["ho8wYRGhLSJb2djJKqwSe1"],"leftPoint":[8.144477100210871,-12.89173870425908],"rightPoint":[-8.7776806922937,-12.89173870425908],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rCFFBj6A2tyxuTVf5rPe81","parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"j7icsPbRmrKngzuxfnJULB","leftRoofHeight":60,"rightRoofHeight":60,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":59.5,"rightTopPartialHeight":59.5},{"type":"Wall","cx":8.144477100210871,"cy":-21.23052296081884,"cz":2.2301039869226305,"lx":16.677568513119517,"ly":0.1,"lz":60,"leftJoints":["szxkDJ4zvsmCjRAjDwr4oT"],"rightJoints":["rCFFBj6A2tyxuTVf5rPe81"],"leftPoint":[8.144477100210871,-29.569307217378597],"rightPoint":[8.144477100210871,-12.891738704259076],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"55SwaH9QxLHmcgrnQzAWTs","parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"j7icsPbRmrKngzuxfnJULB","leftRoofHeight":60,"rightRoofHeight":60,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":59.5,"rightTopPartialHeight":59.5},{"type":"Wall","cx":-8.777680692293703,"cy":-21.230522960818842,"cz":28.5009781424094,"lx":16.67756851311951,"ly":0.1,"lz":60,"leftJoints":["rCFFBj6A2tyxuTVf5rPe81"],"rightJoints":["szxkDJ4zvsmCjRAjDwr4oT"],"leftPoint":[-8.777680692293707,-12.891738704259083],"rightPoint":[-8.7776806922937,-29.569307217378597],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ho8wYRGhLSJb2djJKqwSe1","parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"j7icsPbRmrKngzuxfnJULB","leftRoofHeight":60,"rightRoofHeight":60,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":59.5,"rightTopPartialHeight":59.5},{"type":"Wall","cx":-0.316601796041418,"cy":-29.569307217378597,"cz":2.268765007024547,"lx":16.92215779250457,"ly":0.1,"lz":60,"leftJoints":["ho8wYRGhLSJb2djJKqwSe1"],"rightJoints":["55SwaH9QxLHmcgrnQzAWTs"],"leftPoint":[-8.7776806922937,-29.569307217378597],"rightPoint":[8.144477100210871,-29.569307217378597],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"szxkDJ4zvsmCjRAjDwr4oT","parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"j7icsPbRmrKngzuxfnJULB","leftRoofHeight":60,"rightRoofHeight":60,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":59.5,"rightTopPartialHeight":59.5},{"type":"Foundation","cx":32.336232202320254,"cy":24.075169100408157,"cz":0.3,"lx":47.66882528133987,"ly":92.1673445682163,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"d5JiHWyULwssBmiBFfBkPJ","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["vHsRxkqZrsLbc2Cw1mShNh"],"rightJoints":["wC1WzjegFNTFT2ZnHmoM1U"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"q4Q62RYECS7ssEQGWwMQaR","parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"7wW1vUuiQtQZyEVQ52AYZr","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":61,"leftJoints":["3apukdsSG9Q7tUtWvyHP14"],"rightJoints":["q4Q62RYECS7ssEQGWwMQaR"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"vHsRxkqZrsLbc2Cw1mShNh","parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"7wW1vUuiQtQZyEVQ52AYZr","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":61,"leftJoints":["q4Q62RYECS7ssEQGWwMQaR"],"rightJoints":["3apukdsSG9Q7tUtWvyHP14"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"wC1WzjegFNTFT2ZnHmoM1U","parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"7wW1vUuiQtQZyEVQ52AYZr","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["wC1WzjegFNTFT2ZnHmoM1U"],"rightJoints":["vHsRxkqZrsLbc2Cw1mShNh"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"3apukdsSG9Q7tUtWvyHP14","parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"7wW1vUuiQtQZyEVQ52AYZr","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Foundation","cx":42.906117156706635,"cy":9.533578534694202,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6Vzmg1uXrJSEjXjuXeqZxb","selected":false,"locked":false},{"type":"Wall","cx":-2.059761729325267,"cy":3.0551015103684858,"cz":2.2408122612280286,"lx":20.586914175189918,"ly":0.1,"lz":40,"leftJoints":["vFwZn47p27JhuJCUwo66PB"],"rightJoints":["jz5YKDY6NpWFeAzmZZgmMG"],"leftPoint":[8.233695358269692,3.0551015103684858,0.5],"rightPoint":[-12.353218816920226,3.0551015103684858,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eQty63hcTNfqGkZ1bn9pou","parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eiNiz47nydELtmQT3Y9tQx","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":39.5,"rightTopPartialHeight":39.5},{"type":"Wall","cx":8.233695358269692,"cy":-7.284137744601432,"cz":2.2301039869226305,"lx":20.678478509939843,"ly":0.1,"lz":40,"leftJoints":["tF3vwD5MeKKihs6KSsJULW"],"rightJoints":["eQty63hcTNfqGkZ1bn9pou"],"leftPoint":[8.233695358269692,-17.623376999571356,0.5],"rightPoint":[8.233695358269692,3.0551015103684858,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"vFwZn47p27JhuJCUwo66PB","parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eiNiz47nydELtmQT3Y9tQx","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":39.5,"rightTopPartialHeight":39.5},{"type":"Wall","cx":-12.353218816920233,"cy":-7.2841377446014395,"cz":2.228839888904333,"lx":20.678478509939836,"ly":0.1,"lz":40,"leftJoints":["eQty63hcTNfqGkZ1bn9pou"],"rightJoints":["tF3vwD5MeKKihs6KSsJULW"],"leftPoint":[-12.353218816920233,3.0551015103684787,0.5],"rightPoint":[-12.353218816920226,-17.623376999571356,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jz5YKDY6NpWFeAzmZZgmMG","parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eiNiz47nydELtmQT3Y9tQx","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":39.5,"rightTopPartialHeight":39.5},{"type":"Wall","cx":-2.059761729325267,"cy":-17.623376999571356,"cz":1.780425728663789,"lx":20.586914175189918,"ly":0.1,"lz":40,"leftJoints":["jz5YKDY6NpWFeAzmZZgmMG"],"rightJoints":["vFwZn47p27JhuJCUwo66PB"],"leftPoint":[-12.353218816920226,-17.623376999571356,0.5],"rightPoint":[8.233695358269692,-17.623376999571356,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"tF3vwD5MeKKihs6KSsJULW","parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eiNiz47nydELtmQT3Y9tQx","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":39.5,"rightTopPartialHeight":39.5},{"type":"Foundation","cx":34.184931916240686,"cy":9.996162357092924,"cz":0.25,"lx":28.142586741754783,"ly":39.057935888273825,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fD1unP99uJ2AUvKzSqaqv1","selected":false,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["ho8wYRGhLSJb2djJKqwSe1","szxkDJ4zvsmCjRAjDwr4oT","55SwaH9QxLHmcgrnQzAWTs","rCFFBj6A2tyxuTVf5rPe81"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"j7icsPbRmrKngzuxfnJULB","locked":false,"sideColor":"#8f6767","rise":0,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["tF3vwD5MeKKihs6KSsJULW","vFwZn47p27JhuJCUwo66PB","eQty63hcTNfqGkZ1bn9pou","jz5YKDY6NpWFeAzmZZgmMG"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"eiNiz47nydELtmQT3Y9tQx","locked":false,"sideColor":"#8f6767","rise":0,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["rnDe8ZUbiedJjvYKnAx9vs","ne25yHm9jCD9Vx7iYW9GUg","7kjEcCQNbaUjRAbeSyBXZx","2sbTRgNVHvPNpK2pDRUNQN","ngivbbtv3RRgTjMZ9HM5iJ","hDTYb7CsL6KjhaG3K3ZaEb","1mFHht66LtQmGXw2uwQpTW","ieCZYgGYnWFZFTUUeDJ4Kc","ukLTgjquG74WrHxQMTeCGR","nXkkPMC5GnQsGGo6pXGf1J","9Qfx6trBssgAGuZJMWpoN4","7oCL7hfQ9Q5pKtbUKfbhxC","o7owRXdGmtoUmGe7aMBfwD","twZXBhJnLkQAfkhcdZPvcE","pqrUfkTtDCPWZgLQ2ZZY2x","6BBNNShnXYdN4Fo6vrLZgS"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"6muwd4sKetNydriFdTdYo3","locked":false,"sideColor":"#8f6767","rise":40.65606181416068,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["vHsRxkqZrsLbc2Cw1mShNh","q4Q62RYECS7ssEQGWwMQaR","wC1WzjegFNTFT2ZnHmoM1U","3apukdsSG9Q7tUtWvyHP14"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","id":"7wW1vUuiQtQZyEVQ52AYZr","locked":false,"sideColor":"#8f6767","rise":7.2788709521325785,"ceiling":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["b5Ed9Q8H2ZuAnTPt364rFi"],"rightJoints":["iPw21WkbFfNGs2GducHHkL"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"ogWsiwSVu2siW9Ju34ZuiD","parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"qwYLFbE4ymUU5tBty522Jg","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":61,"leftJoints":["we96ZZsqRukzrDQLzGsXgd"],"rightJoints":["ogWsiwSVu2siW9Ju34ZuiD"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"b5Ed9Q8H2ZuAnTPt364rFi","parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"qwYLFbE4ymUU5tBty522Jg","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":61,"leftJoints":["ogWsiwSVu2siW9Ju34ZuiD"],"rightJoints":["we96ZZsqRukzrDQLzGsXgd"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"iPw21WkbFfNGs2GducHHkL","parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"qwYLFbE4ymUU5tBty522Jg","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["iPw21WkbFfNGs2GducHHkL"],"rightJoints":["b5Ed9Q8H2ZuAnTPt364rFi"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"we96ZZsqRukzrDQLzGsXgd","parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"qwYLFbE4ymUU5tBty522Jg","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"id":"qwYLFbE4ymUU5tBty522Jg","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["b5Ed9Q8H2ZuAnTPt364rFi","ogWsiwSVu2siW9Ju34ZuiD","iPw21WkbFfNGs2GducHHkL","we96ZZsqRukzrDQLzGsXgd"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":7.2788709521325785,"ceiling":false},{"type":"Foundation","cx":42.92006579798169,"cy":-3.82074241486986,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"kGDsncg3szoccDkShD216f","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["pGdyGz8Q2yqRKAUSe2WBaZ"],"rightJoints":["gqtNTDTyYXafiDYDAD7TP5"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"13XtQDNCzy1wcfpbyh4hjG","parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"unGGRxk8aAPx1RGgoMUHuG","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":61,"leftJoints":["appL8aespWEHwPfTvg3Tnj"],"rightJoints":["13XtQDNCzy1wcfpbyh4hjG"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pGdyGz8Q2yqRKAUSe2WBaZ","parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"unGGRxk8aAPx1RGgoMUHuG","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":61,"leftJoints":["13XtQDNCzy1wcfpbyh4hjG"],"rightJoints":["appL8aespWEHwPfTvg3Tnj"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"gqtNTDTyYXafiDYDAD7TP5","parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"unGGRxk8aAPx1RGgoMUHuG","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["gqtNTDTyYXafiDYDAD7TP5"],"rightJoints":["pGdyGz8Q2yqRKAUSe2WBaZ"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"appL8aespWEHwPfTvg3Tnj","parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"unGGRxk8aAPx1RGgoMUHuG","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"id":"unGGRxk8aAPx1RGgoMUHuG","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["pGdyGz8Q2yqRKAUSe2WBaZ","13XtQDNCzy1wcfpbyh4hjG","gqtNTDTyYXafiDYDAD7TP5","appL8aespWEHwPfTvg3Tnj"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":7.2788709521325785,"ceiling":false},{"type":"Foundation","cx":21.16852585877021,"cy":-3.78771116486994,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"wVk1Prn3hdhvpUZ9PYFEqC","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["fBMuUvUm2XHqZj1rfF2pKe"],"rightJoints":["fFbhZTcnWojs6r2gfNC8Ac"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iqStzfwWhLGQQWnV7zYbVJ","parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"64chsWYaQ1WXbJzrruvsSA","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":61,"leftJoints":["fSWzmQwwSCpa4XTiCWadFJ"],"rightJoints":["iqStzfwWhLGQQWnV7zYbVJ"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fBMuUvUm2XHqZj1rfF2pKe","parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"64chsWYaQ1WXbJzrruvsSA","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":61,"leftJoints":["iqStzfwWhLGQQWnV7zYbVJ"],"rightJoints":["fSWzmQwwSCpa4XTiCWadFJ"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fFbhZTcnWojs6r2gfNC8Ac","parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"64chsWYaQ1WXbJzrruvsSA","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["fFbhZTcnWojs6r2gfNC8Ac"],"rightJoints":["fBMuUvUm2XHqZj1rfF2pKe"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fSWzmQwwSCpa4XTiCWadFJ","parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"64chsWYaQ1WXbJzrruvsSA","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"id":"64chsWYaQ1WXbJzrruvsSA","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["fBMuUvUm2XHqZj1rfF2pKe","iqStzfwWhLGQQWnV7zYbVJ","fFbhZTcnWojs6r2gfNC8Ac","fSWzmQwwSCpa4XTiCWadFJ"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":7.2788709521325785,"ceiling":false},{"type":"Foundation","cx":21.217344626106712,"cy":9.487929780449239,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"sTdmJHCeaF7fiC4wxraQvH","selected":false,"locked":false},{"type":"Foundation","cx":46.44079504193018,"cy":-6.9607153899841805,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nBfQ1VbpB9H4ysCzMtCuPy","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["n8WrLFfhmR5MpuvGmKysZG"],"rightJoints":["dbVfVNYCWAroMTmBEqYeR4"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"wq86d5bWa3b2DNCBna4CeP","parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"3cC18p4o27We9TRzUXcjvJ","leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":41,"leftJoints":["jKVT2MfeRaz2it59upaJsG"],"rightJoints":["wq86d5bWa3b2DNCBna4CeP"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"n8WrLFfhmR5MpuvGmKysZG","parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"3cC18p4o27We9TRzUXcjvJ","leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":41,"leftJoints":["wq86d5bWa3b2DNCBna4CeP"],"rightJoints":["jKVT2MfeRaz2it59upaJsG"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"dbVfVNYCWAroMTmBEqYeR4","parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"3cC18p4o27We9TRzUXcjvJ","leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["dbVfVNYCWAroMTmBEqYeR4"],"rightJoints":["n8WrLFfhmR5MpuvGmKysZG"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"jKVT2MfeRaz2it59upaJsG","parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"3cC18p4o27We9TRzUXcjvJ","leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["jKVT2MfeRaz2it59upaJsG","n8WrLFfhmR5MpuvGmKysZG","wq86d5bWa3b2DNCBna4CeP","dbVfVNYCWAroMTmBEqYeR4"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","id":"3cC18p4o27We9TRzUXcjvJ","locked":false,"sideColor":"#8f6767","rise":9.911111547438225,"ceiling":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["fGunkFZDLaHCN1Y4VqozG5"],"rightJoints":["xgMnQPMYvVygU1qre3rtoQ"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"ic7X4VUc5364fhg7VH2Xt9","parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"iaC7gjXpRF8sDNrzMuoLvf","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":41,"leftJoints":["cVUWnxaNHTTX4XSarmyvut"],"rightJoints":["ic7X4VUc5364fhg7VH2Xt9"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"fGunkFZDLaHCN1Y4VqozG5","parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"iaC7gjXpRF8sDNrzMuoLvf","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":41,"leftJoints":["ic7X4VUc5364fhg7VH2Xt9"],"rightJoints":["cVUWnxaNHTTX4XSarmyvut"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"xgMnQPMYvVygU1qre3rtoQ","parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"iaC7gjXpRF8sDNrzMuoLvf","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["xgMnQPMYvVygU1qre3rtoQ"],"rightJoints":["fGunkFZDLaHCN1Y4VqozG5"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"cVUWnxaNHTTX4XSarmyvut","parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"iaC7gjXpRF8sDNrzMuoLvf","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"id":"iaC7gjXpRF8sDNrzMuoLvf","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["cVUWnxaNHTTX4XSarmyvut","fGunkFZDLaHCN1Y4VqozG5","ic7X4VUc5364fhg7VH2Xt9","xgMnQPMYvVygU1qre3rtoQ"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":9.911111547438225,"ceiling":false},{"type":"Foundation","cx":46.31802127561469,"cy":12.684398904718867,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"sfGQk2YxLGeUhSygxuNcnp","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["gh1M1f9qhMGoNQ2Sc4Z2Dn"],"rightJoints":["pnLNuXyTY2gSJ1DpTuU4uT"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"5gcHNbuEXkTtST9vsf3C1N","parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"49DYNSJM4mb3Amf9zEcSuy","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":41,"leftJoints":["eHHmL4t3wnDWyiwmvPPcdG"],"rightJoints":["5gcHNbuEXkTtST9vsf3C1N"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"gh1M1f9qhMGoNQ2Sc4Z2Dn","parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"49DYNSJM4mb3Amf9zEcSuy","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":41,"leftJoints":["5gcHNbuEXkTtST9vsf3C1N"],"rightJoints":["eHHmL4t3wnDWyiwmvPPcdG"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pnLNuXyTY2gSJ1DpTuU4uT","parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"49DYNSJM4mb3Amf9zEcSuy","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["pnLNuXyTY2gSJ1DpTuU4uT"],"rightJoints":["gh1M1f9qhMGoNQ2Sc4Z2Dn"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eHHmL4t3wnDWyiwmvPPcdG","parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"49DYNSJM4mb3Amf9zEcSuy","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"id":"49DYNSJM4mb3Amf9zEcSuy","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["eHHmL4t3wnDWyiwmvPPcdG","gh1M1f9qhMGoNQ2Sc4Z2Dn","5gcHNbuEXkTtST9vsf3C1N","pnLNuXyTY2gSJ1DpTuU4uT"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":9.911111547438225,"ceiling":false},{"type":"Foundation","cx":17.617416680668534,"cy":-7.081676620216011,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"j4PeEevBuviMj9ySaHCvmk","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["8RHz5EYxWVxY6Jt5vozUe7"],"rightJoints":["2uW5rRCde8ts2eAbydroXA"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qovzxCb6vspTrPrifJg8FE","parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"dU22xraE7fkaQeudtQezPj","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":41,"leftJoints":["iYVes92EX4HBiJvFdVLp4v"],"rightJoints":["qovzxCb6vspTrPrifJg8FE"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8RHz5EYxWVxY6Jt5vozUe7","parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"dU22xraE7fkaQeudtQezPj","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":41,"leftJoints":["qovzxCb6vspTrPrifJg8FE"],"rightJoints":["iYVes92EX4HBiJvFdVLp4v"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2uW5rRCde8ts2eAbydroXA","parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"dU22xraE7fkaQeudtQezPj","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["2uW5rRCde8ts2eAbydroXA"],"rightJoints":["8RHz5EYxWVxY6Jt5vozUe7"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iYVes92EX4HBiJvFdVLp4v","parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"dU22xraE7fkaQeudtQezPj","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"id":"dU22xraE7fkaQeudtQezPj","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["iYVes92EX4HBiJvFdVLp4v","8RHz5EYxWVxY6Jt5vozUe7","qovzxCb6vspTrPrifJg8FE","2uW5rRCde8ts2eAbydroXA"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":9.911111547438225,"ceiling":false},{"type":"Foundation","cx":17.73320615435275,"cy":12.716218116632643,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6e1LBCH7kdPkaD1nyNXGTx","selected":false,"locked":false},{"type":"Foundation","cx":31.837120136953352,"cy":34.21863076373691,"cz":0.25,"lx":18.498978574883413,"ly":60.60688660259319,"lz":0.2496942045301915,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"inhpub3MTpu4G1VDDvBtem","selected":false,"locked":false},{"type":"Wall","cx":0.2345130342804871,"cy":27.168552176842663,"cz":2.2408122612280286,"lx":16.254908005168197,"ly":0.1,"lz":19.97553636241532,"leftJoints":["t9LGJeHDCScMaYt1JPTD25"],"rightJoints":["8ygPss7hAjTnN2gdGp6ttV"],"leftPoint":[8.361967036864586,27.168552176842663,0],"rightPoint":[-7.892940968303612,27.168552176842663,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kCsahZfC53mhXpdE7TMKTD","parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"sygn3Sh4dUutUeoxP6LrDr","selected":false,"leftRoofHeight":19.97553636241532,"rightRoofHeight":19.97553636241532,"centerRoofHeight":[0,34.46430883284354],"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":19.47553636241532,"rightTopPartialHeight":19.47553636241532},{"type":"Wall","cx":8.361967036864586,"cy":0.8572306983972329,"cz":2.2301039869226305,"lx":52.62264295689086,"ly":0.1,"lz":19.97553636241532,"leftJoints":["rzCwiAsS4K7UKzev4QiQCA"],"rightJoints":["kCsahZfC53mhXpdE7TMKTD"],"leftPoint":[8.361967036864586,-25.454090780048197,0],"rightPoint":[8.361967036864586,27.168552176842663,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"t9LGJeHDCScMaYt1JPTD25","parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"sygn3Sh4dUutUeoxP6LrDr","selected":false,"leftRoofHeight":19.97553636241532,"rightRoofHeight":19.97553636241532,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":19.47553636241532,"rightTopPartialHeight":19.47553636241532},{"type":"Wall","cx":-7.8929409683036145,"cy":0.8572306983972151,"cz":2.228839888904333,"lx":52.62264295689083,"ly":0.1,"lz":19.97553636241532,"leftJoints":["kCsahZfC53mhXpdE7TMKTD"],"rightJoints":["rzCwiAsS4K7UKzev4QiQCA"],"leftPoint":[-7.892940968303616,27.168552176842628,0],"rightPoint":[-7.892940968303612,-25.454090780048197,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8ygPss7hAjTnN2gdGp6ttV","parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"sygn3Sh4dUutUeoxP6LrDr","selected":false,"leftRoofHeight":19.97553636241532,"rightRoofHeight":19.97553636241532,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":19.47553636241532,"rightTopPartialHeight":19.47553636241532},{"type":"Wall","cx":0.2345130342804871,"cy":-25.454090780048197,"cz":2.268765007024547,"lx":16.254908005168197,"ly":0.1,"lz":19.97553636241532,"leftJoints":["8ygPss7hAjTnN2gdGp6ttV"],"rightJoints":["t9LGJeHDCScMaYt1JPTD25"],"leftPoint":[-7.892940968303612,-25.454090780048197,0],"rightPoint":[8.361967036864586,-25.454090780048197,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rzCwiAsS4K7UKzev4QiQCA","parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"sygn3Sh4dUutUeoxP6LrDr","selected":false,"leftRoofHeight":19.97553636241532,"rightRoofHeight":19.97553636241532,"centerRoofHeight":[0,34.46430883284354],"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":19.47553636241532,"rightTopPartialHeight":19.47553636241532},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Gable","roofStructure":"Default","wallsId":["t9LGJeHDCScMaYt1JPTD25"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","id":"sygn3Sh4dUutUeoxP6LrDr","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":false,"sideColor":"#8f6767","rise":14.488772470428223,"ceiling":false},{"type":"Foundation","cx":42.906117156706635,"cy":9.533578534694202,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3sLwhEgNEsXYeDRotu6V2t","selected":false,"locked":false},{"type":"Foundation","cx":42.92006579798169,"cy":-3.82074241486986,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"bJWxUcmXbPhwpSEfhKNUR9","selected":false,"locked":false},{"type":"Foundation","cx":21.16852585877021,"cy":-3.78771116486994,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"d25rEMwrJ6RN3MFRjbRPz1","selected":false,"locked":false},{"type":"Foundation","cx":21.217344626106712,"cy":9.487929780449239,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cErd2SqgLThpK4vJfhjWqd","selected":false,"locked":false},{"type":"Foundation","cx":46.740795041930184,"cy":-3.860715389984191,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vmAPnWwpqkdy6LbCoBx7XJ","selected":false,"locked":false},{"type":"Foundation","cx":46.718021275614696,"cy":9.584398904718878,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"igvTSt7WASqgGBPhrg13mS","selected":false,"locked":false},{"type":"Foundation","cx":17.31741668066853,"cy":-3.7816766202160212,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35UveCxDtSq3bRxo63iNA8","selected":false,"locked":false},{"type":"Foundation","cx":17.333206154352744,"cy":9.516218116632654,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hcQws7c356C61b1Zdukfsh","selected":false,"locked":false},{"type":"Wall","cx":0.08759481901403955,"cy":0.48701542341002635,"cz":0,"lx":0.7619228017884919,"ly":0.1,"lz":30.522600729435336,"leftJoints":["xjtDHvujcFtzK6uxUtDUQW"],"rightJoints":["pvCLq35sk3nh5kUAUegEwu"],"leftPoint":[0.23742845459659656,0.8372745712126496,0],"rightPoint":[-0.06223881656851746,0.13675627560740305,0],"relativeAngle":-1.9750187634646525,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"eZcF1TXGmmHdWSo1nGEuPP","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-0.06223881656851746,"cy":-0.29019732073449356,"cz":0,"lx":0.8539071926837931,"ly":0.1,"lz":30.522600729435336,"leftJoints":["eZcF1TXGmmHdWSo1nGEuPP"],"rightJoints":[],"leftPoint":[-0.06223881656851746,0.13675627560740305,0],"rightPoint":[-0.06223881656851746,-0.7171509170763901,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"pvCLq35sk3nh5kUAUegEwu","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":0.48900253218546175,"cy":1.0934467290177876,"cz":0,"lx":0.7180910553661809,"ly":0.1,"lz":30.522600729435336,"leftJoints":["1n1zoL6MhaLiDGbiwa1f2P"],"rightJoints":["eZcF1TXGmmHdWSo1nGEuPP"],"leftPoint":[0.7405766097743269,1.3496188868229255,0],"rightPoint":[0.23742845459659656,0.8372745712126496,0],"relativeAngle":-2.3471388749896596,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"xjtDHvujcFtzK6uxUtDUQW","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":1.0760087132261462,"cy":1.520400325359684,"cz":0,"lx":0.7528107219608302,"ly":0.1,"lz":30.522600729435336,"leftJoints":["mriUigHEL4wunXM4kHrR6L"],"rightJoints":["xjtDHvujcFtzK6uxUtDUQW"],"leftPoint":[1.4114408166779655,1.6911817638964426,0],"rightPoint":[0.7405766097743269,1.3496188868229255,0],"relativeAngle":-2.6706609040195843,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"1n1zoL6MhaLiDGbiwa1f2P","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":1.8307309459927419,"cy":1.6911817638964426,"cz":0,"lx":0.8385802586295528,"ly":0.1,"lz":30.522600729435336,"leftJoints":["swhHhwagxik9xtVxu4wfTo"],"rightJoints":["1n1zoL6MhaLiDGbiwa1f2P"],"leftPoint":[2.2500210753075183,1.6911817638964426,0],"rightPoint":[1.4114408166779655,1.6911817638964426,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"mriUigHEL4wunXM4kHrR6L","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":2.5854531787593378,"cy":1.520400325359684,"cz":0,"lx":0.7528107219608307,"ly":0.1,"lz":30.522600729435336,"leftJoints":["hi3umDHUNXmBT4vcsRpTQy"],"rightJoints":["mriUigHEL4wunXM4kHrR6L"],"leftPoint":[2.9208852822111573,1.3496188868229255,0],"rightPoint":[2.2500210753075183,1.6911817638964426,0],"relativeAngle":2.6706609040195843,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"swhHhwagxik9xtVxu4wfTo","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.172459359800022,"cy":1.0934467290177876,"cz":0,"lx":0.7180910553661805,"ly":0.1,"lz":30.522600729435336,"leftJoints":["dRRWEjS64akBN9tsLF4oVT"],"rightJoints":["swhHhwagxik9xtVxu4wfTo"],"leftPoint":[3.424033437388887,0.8372745712126496,0],"rightPoint":[2.9208852822111573,1.3496188868229255,0],"relativeAngle":2.347138874989659,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"hi3umDHUNXmBT4vcsRpTQy","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.5917494891147967,"cy":0.4957116941391323,"cz":0,"lx":0.7610358020520893,"ly":0.1,"lz":30.522600729435336,"leftJoints":["uQk2JFg84bBpGZQkpPmwje"],"rightJoints":["hi3umDHUNXmBT4vcsRpTQy"],"leftPoint":[3.7594655408407065,0.15414881706561503,0],"rightPoint":[3.424033437388887,0.8372745712126496,0],"relativeAngle":2.027238521722415,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"dRRWEjS64akBN9tsLF4oVT","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.7594655408407065,"cy":-0.2728047792762874,"cz":0,"lx":0.8539071926838048,"ly":0.1,"lz":30.522600729435336,"leftJoints":["muL5NfgYyKhfqV3h7fsQsn"],"rightJoints":["dRRWEjS64akBN9tsLF4oVT"],"leftPoint":[3.7594655408407065,-0.6997583756181898,0],"rightPoint":[3.7594655408407065,0.15414881706561503,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"uQk2JFg84bBpGZQkpPmwje","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":0.08759481901404094,"cy":-1.0500175234208071,"cz":0,"lx":0.7300693007410605,"ly":0.1,"lz":30.522600729435336,"leftJoints":[],"rightJoints":["7EX6pFLmgKqJLtfcWEpofK"],"leftPoint":[-0.06223881656851469,-0.7171509170763901,0],"rightPoint":[0.23742845459659656,-1.3828841297652243,0],"relativeAngle":-1.147833323399613,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"5WHTbyH9BzzN64KTDCgoMv","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.5917494891147967,"cy":-1.041321252691707,"cz":0,"lx":0.7610358020520893,"ly":0.1,"lz":30.522600729435336,"leftJoints":["oikWBJjQhAPNedPGNcE3gc"],"rightJoints":["uQk2JFg84bBpGZQkpPmwje"],"leftPoint":[3.424033437388887,-1.3828841297652243,0],"rightPoint":[3.7594655408407065,-0.6997583756181898,0],"relativeAngle":1.1143541318673784,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"muL5NfgYyKhfqV3h7fsQsn","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.172459359800022,"cy":-1.6390562875703623,"cz":0,"lx":0.7180910553661803,"ly":0.1,"lz":30.522600729435336,"leftJoints":["i4ifyJQtiXdLMSDpWxEVF4"],"rightJoints":["muL5NfgYyKhfqV3h7fsQsn"],"leftPoint":[2.9208852822111573,-1.8952284453755002,0],"rightPoint":[3.424033437388887,-1.3828841297652243,0],"relativeAngle":0.7944537786001341,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"oikWBJjQhAPNedPGNcE3gc","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":2.5854531787593378,"cy":-2.0660098839122587,"cz":0,"lx":0.7528107219608308,"ly":0.1,"lz":30.522600729435336,"leftJoints":["wop6FQVjsmsgGpEYiRnuWv"],"rightJoints":["oikWBJjQhAPNedPGNcE3gc"],"leftPoint":[2.2500210753075183,-2.2367913224490175,0],"rightPoint":[2.9208852822111573,-1.8952284453755002,0],"relativeAngle":0.47093174957020895,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"i4ifyJQtiXdLMSDpWxEVF4","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":1.8307309459927419,"cy":-2.2367913224490175,"cz":0,"lx":0.8385802586295528,"ly":0.1,"lz":30.522600729435336,"leftJoints":["xvpmoVyQtt5PQRMqAmpsxP"],"rightJoints":["i4ifyJQtiXdLMSDpWxEVF4"],"leftPoint":[1.4114408166779655,-2.2367913224490175,0],"rightPoint":[2.2500210753075183,-2.2367913224490175,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"wop6FQVjsmsgGpEYiRnuWv","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":1.0760087132261462,"cy":-2.0660098839122587,"cz":0,"lx":0.7528107219608304,"ly":0.1,"lz":30.522600729435336,"leftJoints":["7EX6pFLmgKqJLtfcWEpofK"],"rightJoints":["wop6FQVjsmsgGpEYiRnuWv"],"leftPoint":[0.7405766097743269,-1.8952284453755002,0],"rightPoint":[1.4114408166779655,-2.2367913224490175,0],"relativeAngle":-0.4709317495702092,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"xvpmoVyQtt5PQRMqAmpsxP","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":0.48900253218546175,"cy":-1.6390562875703623,"cz":0,"lx":0.7180910553661808,"ly":0.1,"lz":30.522600729435336,"leftJoints":["5WHTbyH9BzzN64KTDCgoMv"],"rightJoints":["xvpmoVyQtt5PQRMqAmpsxP"],"leftPoint":[0.23742845459659656,-1.3828841297652243,0],"rightPoint":[0.7405766097743269,-1.8952284453755002,0],"relativeAngle":-0.7944537786001334,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"7EX6pFLmgKqJLtfcWEpofK","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"id":"hYevMRVtvGbUbiRqk1nUc8","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["5WHTbyH9BzzN64KTDCgoMv","7EX6pFLmgKqJLtfcWEpofK","xvpmoVyQtt5PQRMqAmpsxP","wop6FQVjsmsgGpEYiRnuWv","i4ifyJQtiXdLMSDpWxEVF4","oikWBJjQhAPNedPGNcE3gc","muL5NfgYyKhfqV3h7fsQsn","uQk2JFg84bBpGZQkpPmwje","dRRWEjS64akBN9tsLF4oVT","hi3umDHUNXmBT4vcsRpTQy","swhHhwagxik9xtVxu4wfTo","mriUigHEL4wunXM4kHrR6L","1n1zoL6MhaLiDGbiwa1f2P","xjtDHvujcFtzK6uxUtDUQW","eZcF1TXGmmHdWSo1nGEuPP","pvCLq35sk3nh5kUAUegEwu"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":20.34309413089949,"ceiling":false},{"type":"Foundation","cx":22.101836585291686,"cy":59.66510601397874,"cz":0.25,"lx":10.346352433552571,"ly":7.249184290263735,"lz":0.25018525188061747,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nzCkjYnVxyaDzHFwCDNifn","selected":false,"locked":false},{"type":"Wall","cx":0.29316921930580264,"cy":25.564628992279733,"cz":2.2408122612280286,"lx":20.32057068547883,"ly":0.1,"lz":11.54977608077218,"leftJoints":["s1xEbSBtShW5kWkbmjYKyT"],"rightJoints":["kdHDzULPWJfMLCpsjYsWA1"],"leftPoint":[10.453454562045218,25.564628992279733,0],"rightPoint":[-9.867116123433613,25.564628992279733,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"6NAiyB2LDnaumetDroz2SP","parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"43U2Bn5NdVK18XM6yHM246","selected":false,"leftRoofHeight":11.54977608077218,"rightRoofHeight":11.54977608077218,"centerRoofHeight":[0,17.846156119433356],"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.04977608077218,"rightTopPartialHeight":11.04977608077218},{"type":"Wall","cx":10.453454562045218,"cy":0.806623209903595,"cz":2.2301039869226305,"lx":49.516011564752276,"ly":0.1,"lz":11.54977608077218,"leftJoints":["4soX2cVpCLxg8TgMMdUsVJ"],"rightJoints":["6NAiyB2LDnaumetDroz2SP"],"leftPoint":[10.453454562045218,-23.951382572472543,0],"rightPoint":[10.453454562045218,25.564628992279733,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s1xEbSBtShW5kWkbmjYKyT","parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"43U2Bn5NdVK18XM6yHM246","selected":false,"leftRoofHeight":11.54977608077218,"rightRoofHeight":11.54977608077218,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.04977608077218,"rightTopPartialHeight":11.04977608077218},{"type":"Wall","cx":-9.867116123433618,"cy":0.806623209903579,"cz":2.228839888904333,"lx":49.51601156475225,"ly":0.1,"lz":11.54977608077218,"leftJoints":["6NAiyB2LDnaumetDroz2SP"],"rightJoints":["4soX2cVpCLxg8TgMMdUsVJ"],"leftPoint":[-9.867116123433622,25.5646289922797,0],"rightPoint":[-9.867116123433613,-23.951382572472543,0],"relativeAngle":-1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kdHDzULPWJfMLCpsjYsWA1","parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"43U2Bn5NdVK18XM6yHM246","selected":false,"leftRoofHeight":11.54977608077218,"rightRoofHeight":11.54977608077218,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.04977608077218,"rightTopPartialHeight":11.04977608077218},{"type":"Wall","cx":0.29316921930580264,"cy":-23.951382572472543,"cz":2.268765007024547,"lx":20.32057068547883,"ly":0.1,"lz":11.54977608077218,"leftJoints":["kdHDzULPWJfMLCpsjYsWA1"],"rightJoints":["s1xEbSBtShW5kWkbmjYKyT"],"leftPoint":[-9.867116123433613,-23.951382572472543,0],"rightPoint":[10.453454562045218,-23.951382572472543,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4soX2cVpCLxg8TgMMdUsVJ","parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"43U2Bn5NdVK18XM6yHM246","selected":false,"leftRoofHeight":11.54977608077218,"rightRoofHeight":11.54977608077218,"centerRoofHeight":[0,17.846156119433356],"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.04977608077218,"rightTopPartialHeight":11.04977608077218},{"id":"43U2Bn5NdVK18XM6yHM246","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["s1xEbSBtShW5kWkbmjYKyT"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false,"sideColor":"#8f6767","rise":6.296380038661177,"ceiling":false},{"type":"Foundation","cx":31.800913861014813,"cy":36.46175047854304,"cz":0.25,"lx":23.12592612769986,"ly":57.028897244406764,"lz":0.14437220100965228,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tRJdenhEy35bKxtqwaV7mW","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["rY4g4se9c9Ac81ycfZ2psF"],"rightJoints":["edLYKiK67rcWj7yEjSg5Gw"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"m2HcdaunRK2mJDqZ6u7zB2","parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"b6WgrEhvmm5vBfQ5hvUoV7","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["hnGSq9jjoBBqypZ4j6i4tD"],"rightJoints":["m2HcdaunRK2mJDqZ6u7zB2"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rY4g4se9c9Ac81ycfZ2psF","parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"b6WgrEhvmm5vBfQ5hvUoV7","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["m2HcdaunRK2mJDqZ6u7zB2"],"rightJoints":["hnGSq9jjoBBqypZ4j6i4tD"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"edLYKiK67rcWj7yEjSg5Gw","parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"b6WgrEhvmm5vBfQ5hvUoV7","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["edLYKiK67rcWj7yEjSg5Gw"],"rightJoints":["rY4g4se9c9Ac81ycfZ2psF"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"hnGSq9jjoBBqypZ4j6i4tD","parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"b6WgrEhvmm5vBfQ5hvUoV7","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"b6WgrEhvmm5vBfQ5hvUoV7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["hnGSq9jjoBBqypZ4j6i4tD","rY4g4se9c9Ac81ycfZ2psF","m2HcdaunRK2mJDqZ6u7zB2","edLYKiK67rcWj7yEjSg5Gw"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.0572589693394,"cy":29.64082269160803,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4eW2GX1ScRsXHpNggfMAh6","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["iDdbvKHdvp7bwG9TRH7Z1s"],"rightJoints":["qCdtrWKEz7G85zz6r7u1bg"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4SRnxg5YyewBKp25hu7pX6","parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"w76LBs2JwDTGkqjmZCF8cs","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["o3YcepgLVkYe1C12rYuUcN"],"rightJoints":["4SRnxg5YyewBKp25hu7pX6"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iDdbvKHdvp7bwG9TRH7Z1s","parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"w76LBs2JwDTGkqjmZCF8cs","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["4SRnxg5YyewBKp25hu7pX6"],"rightJoints":["o3YcepgLVkYe1C12rYuUcN"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qCdtrWKEz7G85zz6r7u1bg","parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"w76LBs2JwDTGkqjmZCF8cs","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["qCdtrWKEz7G85zz6r7u1bg"],"rightJoints":["iDdbvKHdvp7bwG9TRH7Z1s"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"o3YcepgLVkYe1C12rYuUcN","parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"w76LBs2JwDTGkqjmZCF8cs","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"w76LBs2JwDTGkqjmZCF8cs","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["o3YcepgLVkYe1C12rYuUcN","iDdbvKHdvp7bwG9TRH7Z1s","4SRnxg5YyewBKp25hu7pX6","qCdtrWKEz7G85zz6r7u1bg"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.12041686407624,"cy":21.776349007392366,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4grymoAeE1wyKWf6d9SvGL","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["pqDxrgVJyRAZkmJDZW8KxP"],"rightJoints":["5YtUmRWQdNuxWqery1ymqA"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wgaVoeaxZnDaQiMJmkWwKa","parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"ccBdYpfsEntnyimCgAGbFH","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["osM7biMJmfhnN53neDAWtn"],"rightJoints":["wgaVoeaxZnDaQiMJmkWwKa"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pqDxrgVJyRAZkmJDZW8KxP","parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"ccBdYpfsEntnyimCgAGbFH","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["wgaVoeaxZnDaQiMJmkWwKa"],"rightJoints":["osM7biMJmfhnN53neDAWtn"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"5YtUmRWQdNuxWqery1ymqA","parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"ccBdYpfsEntnyimCgAGbFH","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["5YtUmRWQdNuxWqery1ymqA"],"rightJoints":["pqDxrgVJyRAZkmJDZW8KxP"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"osM7biMJmfhnN53neDAWtn","parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"ccBdYpfsEntnyimCgAGbFH","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"ccBdYpfsEntnyimCgAGbFH","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["osM7biMJmfhnN53neDAWtn","pqDxrgVJyRAZkmJDZW8KxP","wgaVoeaxZnDaQiMJmkWwKa","5YtUmRWQdNuxWqery1ymqA"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.12041686407624,"cy":38.27619910075263,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qEkR58t9MVxKb9UtTzLoRJ","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["aWFGP4t67ffRZBsCFNikXA"],"rightJoints":["2uYJDU198peC8Tg5ojQxP4"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iWxYLc7ffDzpRdJiYsnbXJ","parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eQ7btevxK7r8DzoyTEdTxn","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["1Q3HJwHJv2PVY4SzR42Cjo"],"rightJoints":["iWxYLc7ffDzpRdJiYsnbXJ"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"aWFGP4t67ffRZBsCFNikXA","parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eQ7btevxK7r8DzoyTEdTxn","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["iWxYLc7ffDzpRdJiYsnbXJ"],"rightJoints":["1Q3HJwHJv2PVY4SzR42Cjo"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2uYJDU198peC8Tg5ojQxP4","parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eQ7btevxK7r8DzoyTEdTxn","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["2uYJDU198peC8Tg5ojQxP4"],"rightJoints":["aWFGP4t67ffRZBsCFNikXA"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"1Q3HJwHJv2PVY4SzR42Cjo","parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eQ7btevxK7r8DzoyTEdTxn","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"eQ7btevxK7r8DzoyTEdTxn","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["1Q3HJwHJv2PVY4SzR42Cjo","aWFGP4t67ffRZBsCFNikXA","iWxYLc7ffDzpRdJiYsnbXJ","2uYJDU198peC8Tg5ojQxP4"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.12041686407624,"cy":46.27619910075262,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"61X5NKPMEEPTLmE48XtBWW","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["fY4i2vP6PHczLiFYJKL6Wv"],"rightJoints":["idjrGY3KVjR98yX9Yu1Ra6"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eMNaM3G63snsMKbM8u6oYY","parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"tuJvTy5gsauq5Hd2q2TrvG","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["amBCThLtBnL1J1PMrwDbZv"],"rightJoints":["eMNaM3G63snsMKbM8u6oYY"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fY4i2vP6PHczLiFYJKL6Wv","parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"tuJvTy5gsauq5Hd2q2TrvG","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["eMNaM3G63snsMKbM8u6oYY"],"rightJoints":["amBCThLtBnL1J1PMrwDbZv"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"idjrGY3KVjR98yX9Yu1Ra6","parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"tuJvTy5gsauq5Hd2q2TrvG","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["idjrGY3KVjR98yX9Yu1Ra6"],"rightJoints":["fY4i2vP6PHczLiFYJKL6Wv"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"amBCThLtBnL1J1PMrwDbZv","parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"tuJvTy5gsauq5Hd2q2TrvG","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"tuJvTy5gsauq5Hd2q2TrvG","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["amBCThLtBnL1J1PMrwDbZv","fY4i2vP6PHczLiFYJKL6Wv","eMNaM3G63snsMKbM8u6oYY","idjrGY3KVjR98yX9Yu1Ra6"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.070416864076236,"cy":54.22634900740702,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gJWB97wg6zgCYzFdGJY5ps","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["6pg1zB89qcq9dmq7s1ptPG"],"rightJoints":["q4CuysQYWEW74wVhnGoz38"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"vbW8e5Fx8RtgYAGG2GpRxh","parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"vKsXGsPSDc5jtGNVG5pT4h","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["27GGc5fv8LG1vuW4Uncogs"],"rightJoints":["vbW8e5Fx8RtgYAGG2GpRxh"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"6pg1zB89qcq9dmq7s1ptPG","parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"vKsXGsPSDc5jtGNVG5pT4h","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["vbW8e5Fx8RtgYAGG2GpRxh"],"rightJoints":["27GGc5fv8LG1vuW4Uncogs"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"q4CuysQYWEW74wVhnGoz38","parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"vKsXGsPSDc5jtGNVG5pT4h","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["q4CuysQYWEW74wVhnGoz38"],"rightJoints":["6pg1zB89qcq9dmq7s1ptPG"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"27GGc5fv8LG1vuW4Uncogs","parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"vKsXGsPSDc5jtGNVG5pT4h","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"vKsXGsPSDc5jtGNVG5pT4h","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["27GGc5fv8LG1vuW4Uncogs","6pg1zB89qcq9dmq7s1ptPG","vbW8e5Fx8RtgYAGG2GpRxh","q4CuysQYWEW74wVhnGoz38"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.02516540226579,"cy":13.71724930866217,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"amG9BsG4REBbTJiqZddZRf","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["pNFepfvePvMvRyTFP4sbzs"],"rightJoints":["kf6UY9oxBvAS9oizmQi2UF"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"49srqvHCqp7LPpHj4YFmnX","parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"585fnALdAC34mNZDfmGzpR","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["qjgvxRHbZgjaPsgRgW2rKY"],"rightJoints":["49srqvHCqp7LPpHj4YFmnX"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pNFepfvePvMvRyTFP4sbzs","parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"585fnALdAC34mNZDfmGzpR","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["49srqvHCqp7LPpHj4YFmnX"],"rightJoints":["qjgvxRHbZgjaPsgRgW2rKY"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kf6UY9oxBvAS9oizmQi2UF","parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"585fnALdAC34mNZDfmGzpR","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["kf6UY9oxBvAS9oizmQi2UF"],"rightJoints":["pNFepfvePvMvRyTFP4sbzs"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qjgvxRHbZgjaPsgRgW2rKY","parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"585fnALdAC34mNZDfmGzpR","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"585fnALdAC34mNZDfmGzpR","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["qjgvxRHbZgjaPsgRgW2rKY","pNFepfvePvMvRyTFP4sbzs","49srqvHCqp7LPpHj4YFmnX","kf6UY9oxBvAS9oizmQi2UF"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.108670143366425,"cy":21.75623548237505,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ijj9XtQP41yWeKSFtsH9KG","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["4FTkcMtCn8GmJne1UmBSnm"],"rightJoints":["1fYMNpakzjWFH4TGNYecnG"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"1P5iFtakfLrTXAgXy2xEwu","parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"5jHjwRti8g6gjQYwYNaqMu","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["8SkMwYmnPtJVtGW2vvZau2"],"rightJoints":["1P5iFtakfLrTXAgXy2xEwu"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4FTkcMtCn8GmJne1UmBSnm","parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"5jHjwRti8g6gjQYwYNaqMu","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["1P5iFtakfLrTXAgXy2xEwu"],"rightJoints":["8SkMwYmnPtJVtGW2vvZau2"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"1fYMNpakzjWFH4TGNYecnG","parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"5jHjwRti8g6gjQYwYNaqMu","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["1fYMNpakzjWFH4TGNYecnG"],"rightJoints":["4FTkcMtCn8GmJne1UmBSnm"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8SkMwYmnPtJVtGW2vvZau2","parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"5jHjwRti8g6gjQYwYNaqMu","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"5jHjwRti8g6gjQYwYNaqMu","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["8SkMwYmnPtJVtGW2vvZau2","4FTkcMtCn8GmJne1UmBSnm","1P5iFtakfLrTXAgXy2xEwu","1fYMNpakzjWFH4TGNYecnG"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.06868414507791,"cy":13.792917787121219,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tsSkKMSbzvsCzXJnVjuqkh","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["eKwrTnqzoru7h1ejKJfQMg"],"rightJoints":["aepE6idhiAJ636esCgz28B"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"sduDhLeTnLnC5gSRR1knQa","parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"gdKEp1z3y4ryc7dvjnUqEa","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["rD8sjfgNgEk8eR9fGvg7qv"],"rightJoints":["sduDhLeTnLnC5gSRR1knQa"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eKwrTnqzoru7h1ejKJfQMg","parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"gdKEp1z3y4ryc7dvjnUqEa","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["sduDhLeTnLnC5gSRR1knQa"],"rightJoints":["rD8sjfgNgEk8eR9fGvg7qv"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"aepE6idhiAJ636esCgz28B","parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"gdKEp1z3y4ryc7dvjnUqEa","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["aepE6idhiAJ636esCgz28B"],"rightJoints":["eKwrTnqzoru7h1ejKJfQMg"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rD8sjfgNgEk8eR9fGvg7qv","parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"gdKEp1z3y4ryc7dvjnUqEa","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"gdKEp1z3y4ryc7dvjnUqEa","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["rD8sjfgNgEk8eR9fGvg7qv","eKwrTnqzoru7h1ejKJfQMg","sduDhLeTnLnC5gSRR1knQa","aepE6idhiAJ636esCgz28B"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.029331020077915,"cy":30.2047466933794,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"c5x1qZw1vbVMAajuz84fbo","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["rmuH4rirvchW582N8rYFag"],"rightJoints":["uW9vVgQVERMAHeNEoWkYEh"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"uUKBr4jcQhby6GvNzKqUHH","parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"rTW8jYbcN9iKLUvtZVEcCq","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["wbwhMTBcYQcbgteFUcRUx7"],"rightJoints":["uUKBr4jcQhby6GvNzKqUHH"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rmuH4rirvchW582N8rYFag","parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"rTW8jYbcN9iKLUvtZVEcCq","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["uUKBr4jcQhby6GvNzKqUHH"],"rightJoints":["wbwhMTBcYQcbgteFUcRUx7"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"uW9vVgQVERMAHeNEoWkYEh","parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"rTW8jYbcN9iKLUvtZVEcCq","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["uW9vVgQVERMAHeNEoWkYEh"],"rightJoints":["rmuH4rirvchW582N8rYFag"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wbwhMTBcYQcbgteFUcRUx7","parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"rTW8jYbcN9iKLUvtZVEcCq","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"rTW8jYbcN9iKLUvtZVEcCq","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["wbwhMTBcYQcbgteFUcRUx7","rmuH4rirvchW582N8rYFag","uUKBr4jcQhby6GvNzKqUHH","uW9vVgQVERMAHeNEoWkYEh"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.063453741288843,"cy":38.34103797920378,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"8naBHyvVijZuabFdbTKFpX","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["ash2NaiDiFh6y8HJuTzbUe"],"rightJoints":["rQ2xEkb62W6Hz14LruJt4U"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ui6xC8viC2GKhF7W4v6W1c","parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"aSwgfRaBWT4x8pjZRpNseg","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["4a5mwkpfWp9Ti3rrftjFDZ"],"rightJoints":["ui6xC8viC2GKhF7W4v6W1c"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ash2NaiDiFh6y8HJuTzbUe","parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"aSwgfRaBWT4x8pjZRpNseg","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["ui6xC8viC2GKhF7W4v6W1c"],"rightJoints":["4a5mwkpfWp9Ti3rrftjFDZ"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rQ2xEkb62W6Hz14LruJt4U","parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"aSwgfRaBWT4x8pjZRpNseg","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["rQ2xEkb62W6Hz14LruJt4U"],"rightJoints":["ash2NaiDiFh6y8HJuTzbUe"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4a5mwkpfWp9Ti3rrftjFDZ","parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"aSwgfRaBWT4x8pjZRpNseg","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"aSwgfRaBWT4x8pjZRpNseg","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["4a5mwkpfWp9Ti3rrftjFDZ","ash2NaiDiFh6y8HJuTzbUe","ui6xC8viC2GKhF7W4v6W1c","rQ2xEkb62W6Hz14LruJt4U"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.082728428788844,"cy":46.363924541707796,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"pea8XwQNq3CzMWjVuAMDFt","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["9KWwq22ziFFGjGozMGZDJy"],"rightJoints":["axJwDxU9qufHCzbi6cJjRE"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2xmth77a7rM6NqB4LYTVg3","parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"wmVcJCTPwpivZkJBd9PRUz","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["47gofCM28sUzgssGChu6rj"],"rightJoints":["2xmth77a7rM6NqB4LYTVg3"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"9KWwq22ziFFGjGozMGZDJy","parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"wmVcJCTPwpivZkJBd9PRUz","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["2xmth77a7rM6NqB4LYTVg3"],"rightJoints":["47gofCM28sUzgssGChu6rj"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"axJwDxU9qufHCzbi6cJjRE","parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"wmVcJCTPwpivZkJBd9PRUz","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["axJwDxU9qufHCzbi6cJjRE"],"rightJoints":["9KWwq22ziFFGjGozMGZDJy"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"47gofCM28sUzgssGChu6rj","parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"wmVcJCTPwpivZkJBd9PRUz","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"wmVcJCTPwpivZkJBd9PRUz","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["47gofCM28sUzgssGChu6rj","9KWwq22ziFFGjGozMGZDJy","2xmth77a7rM6NqB4LYTVg3","axJwDxU9qufHCzbi6cJjRE"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.06830096335861,"cy":54.39520622164741,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3FFY4h4Y53Ud4TwY2XAm3b","selected":false,"locked":false},{"type":"Wall","cx":-4.287405180985958,"cy":0.6870154234100241,"cz":0,"lx":0.7619228017884919,"ly":0.1,"lz":30.522600729435336,"leftJoints":["eyhcnsCSVemrG9SDzg4nJ2"],"rightJoints":["bHsvKPqQBPZPeMWXAxFnQa"],"leftPoint":[-4.137571545403402,1.0372745712126488,0.25018525188061747],"rightPoint":[-4.437238816568516,0.3367562756073994,0.25018525188061747],"relativeAngle":-1.9750187634646525,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"aU3ZWFitC4Fgrww9n7FaQe","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-4.437238816568516,"cy":-0.0901973207344966,"cz":0,"lx":0.8539071926837931,"ly":0.1,"lz":30.522600729435336,"leftJoints":["aU3ZWFitC4Fgrww9n7FaQe"],"rightJoints":[],"leftPoint":[-4.437238816568516,0.3367562756073994,0.25018525188061747],"rightPoint":[-4.437238816568516,-0.5171509170763926,0.25018525188061747],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"bHsvKPqQBPZPeMWXAxFnQa","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-3.8859974678145366,"cy":1.2934467290177807,"cz":0,"lx":0.7180910553661809,"ly":0.1,"lz":30.522600729435336,"leftJoints":["xcRtMosaXc2kjoRaazGNSd"],"rightJoints":["aU3ZWFitC4Fgrww9n7FaQe"],"leftPoint":[-3.6344233902256713,1.5496188868229197,0.25018525188061747],"rightPoint":[-4.137571545403402,1.0372745712126488,0.25018525188061747],"relativeAngle":-2.3471388749896596,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eyhcnsCSVemrG9SDzg4nJ2","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-3.298991286773852,"cy":1.7204003253596767,"cz":0,"lx":0.7528107219608302,"ly":0.1,"lz":30.522600729435336,"leftJoints":["fsM3HFbdwGctcxehK1sWSn"],"rightJoints":["eyhcnsCSVemrG9SDzg4nJ2"],"leftPoint":[-2.9635591833220327,1.8911817638964408,0.25018525188061747],"rightPoint":[-3.6344233902256713,1.5496188868229197,0.25018525188061747],"relativeAngle":-2.6706609040195843,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xcRtMosaXc2kjoRaazGNSd","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-2.5442690540072563,"cy":1.8911817638964408,"cz":0,"lx":0.8385802586295528,"ly":0.1,"lz":30.522600729435336,"leftJoints":["6XgmyJyqgEv5ifchExpE81"],"rightJoints":["xcRtMosaXc2kjoRaazGNSd"],"leftPoint":[-2.12497892469248,1.8911817638964408,0.25018525188061747],"rightPoint":[-2.9635591833220327,1.8911817638964408,0.25018525188061747],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fsM3HFbdwGctcxehK1sWSn","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-1.7895468212406604,"cy":1.7204003253596767,"cz":0,"lx":0.7528107219608307,"ly":0.1,"lz":30.522600729435336,"leftJoints":["fYWGXixdnmhXJQ9obJmEx4"],"rightJoints":["fsM3HFbdwGctcxehK1sWSn"],"leftPoint":[-1.454114717788841,1.5496188868229197,0.25018525188061747],"rightPoint":[-2.12497892469248,1.8911817638964408,0.25018525188061747],"relativeAngle":2.6706609040195843,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"6XgmyJyqgEv5ifchExpE81","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-1.202540640199976,"cy":1.2934467290177807,"cz":0,"lx":0.7180910553661805,"ly":0.1,"lz":30.522600729435336,"leftJoints":["4GwFXBtR54ZnyGA71jYYZc"],"rightJoints":["6XgmyJyqgEv5ifchExpE81"],"leftPoint":[-0.9509665626111112,1.0372745712126488,0.25018525188061747],"rightPoint":[-1.454114717788841,1.5496188868229197,0.25018525188061747],"relativeAngle":2.347138874989659,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fYWGXixdnmhXJQ9obJmEx4","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-0.7832505108852015,"cy":0.6957116941391277,"cz":0,"lx":0.7610358020520893,"ly":0.1,"lz":30.522600729435336,"leftJoints":["eBehuFBXFQvHTyVLAdaGdf"],"rightJoints":["fYWGXixdnmhXJQ9obJmEx4"],"leftPoint":[-0.6155344591592917,0.35414881706561374,0.25018525188061747],"rightPoint":[-0.9509665626111112,1.0372745712126488,0.25018525188061747],"relativeAngle":2.027238521722415,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4GwFXBtR54ZnyGA71jYYZc","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-0.6155344591592917,"cy":-0.07280477927628937,"cz":0,"lx":0.8539071926838048,"ly":0.1,"lz":30.522600729435336,"leftJoints":["d7o4BGzTN8VdkyE1cWq7ia"],"rightJoints":["4GwFXBtR54ZnyGA71jYYZc"],"leftPoint":[-0.6155344591592917,-0.4997583756181925,0.25018525188061747],"rightPoint":[-0.6155344591592917,0.35414881706561374,0.25018525188061747],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eBehuFBXFQvHTyVLAdaGdf","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-4.2874051809859575,"cy":-0.85001752342081,"cz":0,"lx":0.7300693007410605,"ly":0.1,"lz":30.522600729435336,"leftJoints":[],"rightJoints":["71Xv23m81dcuvYBk8UDpg2"],"leftPoint":[-4.437238816568513,-0.5171509170763926,0.25018525188061747],"rightPoint":[-4.137571545403402,-1.1828841297652275,0.25018525188061747],"relativeAngle":-1.147833323399613,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xewwKY8wmraW5H3W8KA3XV","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-0.7832505108852015,"cy":-0.8413212526917135,"cz":0,"lx":0.7610358020520893,"ly":0.1,"lz":30.522600729435336,"leftJoints":["gKowPySkxP5QDpYS45Ky87"],"rightJoints":["eBehuFBXFQvHTyVLAdaGdf"],"leftPoint":[-0.9509665626111112,-1.1828841297652275,0.25018525188061747],"rightPoint":[-0.6155344591592917,-0.4997583756181925,0.25018525188061747],"relativeAngle":1.1143541318673784,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"d7o4BGzTN8VdkyE1cWq7ia","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-1.202540640199976,"cy":-1.4390562875703665,"cz":0,"lx":0.7180910553661803,"ly":0.1,"lz":30.522600729435336,"leftJoints":["w2pokb3YWg3yZ7YCCbdX1w"],"rightJoints":["d7o4BGzTN8VdkyE1cWq7ia"],"leftPoint":[-1.454114717788841,-1.6952284453755055,0.25018525188061747],"rightPoint":[-0.9509665626111112,-1.1828841297652275,0.25018525188061747],"relativeAngle":0.7944537786001341,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"gKowPySkxP5QDpYS45Ky87","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-1.7895468212406604,"cy":-1.8660098839122625,"cz":0,"lx":0.7528107219608308,"ly":0.1,"lz":30.522600729435336,"leftJoints":["6uEEWTZCV76LChiCEwjXou"],"rightJoints":["gKowPySkxP5QDpYS45Ky87"],"leftPoint":[-2.12497892469248,-2.0367913224490195,0.25018525188061747],"rightPoint":[-1.454114717788841,-1.6952284453755055,0.25018525188061747],"relativeAngle":0.47093174957020895,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"w2pokb3YWg3yZ7YCCbdX1w","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-2.5442690540072563,"cy":-2.0367913224490195,"cz":0,"lx":0.8385802586295528,"ly":0.1,"lz":30.522600729435336,"leftJoints":["t5GH8Xd8h7kQ1uXXK7nK76"],"rightJoints":["w2pokb3YWg3yZ7YCCbdX1w"],"leftPoint":[-2.9635591833220327,-2.0367913224490195,0.25018525188061747],"rightPoint":[-2.12497892469248,-2.0367913224490195,0.25018525188061747],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"6uEEWTZCV76LChiCEwjXou","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-3.298991286773852,"cy":-1.8660098839122625,"cz":0,"lx":0.7528107219608304,"ly":0.1,"lz":30.522600729435336,"leftJoints":["71Xv23m81dcuvYBk8UDpg2"],"rightJoints":["6uEEWTZCV76LChiCEwjXou"],"leftPoint":[-3.6344233902256713,-1.6952284453755055,0.25018525188061747],"rightPoint":[-2.9635591833220327,-2.0367913224490195,0.25018525188061747],"relativeAngle":-0.4709317495702092,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"t5GH8Xd8h7kQ1uXXK7nK76","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-3.8859974678145366,"cy":-1.4390562875703665,"cz":0,"lx":0.7180910553661808,"ly":0.1,"lz":30.522600729435336,"leftJoints":["xewwKY8wmraW5H3W8KA3XV"],"rightJoints":["t5GH8Xd8h7kQ1uXXK7nK76"],"leftPoint":[-4.137571545403402,-1.1828841297652275,0.25018525188061747],"rightPoint":[-3.6344233902256713,-1.6952284453755055,0.25018525188061747],"relativeAngle":-0.7944537786001334,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"71Xv23m81dcuvYBk8UDpg2","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"id":"fvYFb2pAnenzxFGy1hd1nC","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["xewwKY8wmraW5H3W8KA3XV","71Xv23m81dcuvYBk8UDpg2","t5GH8Xd8h7kQ1uXXK7nK76","6uEEWTZCV76LChiCEwjXou","w2pokb3YWg3yZ7YCCbdX1w","gKowPySkxP5QDpYS45Ky87","d7o4BGzTN8VdkyE1cWq7ia","eBehuFBXFQvHTyVLAdaGdf","4GwFXBtR54ZnyGA71jYYZc","fYWGXixdnmhXJQ9obJmEx4","6XgmyJyqgEv5ifchExpE81","fsM3HFbdwGctcxehK1sWSn","xcRtMosaXc2kjoRaazGNSd","eyhcnsCSVemrG9SDzg4nJ2","aU3ZWFitC4Fgrww9n7FaQe","bHsvKPqQBPZPeMWXAxFnQa"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":20.34309413089949,"ceiling":false},{"type":"Foundation","cx":42.75366036851538,"cy":59.539698159110614,"cz":0.25,"lx":10.249999999999995,"ly":6.800000000000001,"lz":0.25018525188061747,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"h1eHzifF9EYnFRDPhVNFMh","selected":false,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.8009797439083822,"lx":0.12303976124405665,"ly":0.3,"lz":0.500612339942739,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"kCsahZfC53mhXpdE7TMKTD","foundationId":"inhpub3MTpu4G1VDDvBtem","id":"n1xfWKYM49Ta9i1jvUnSdx","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3030361779763614,"lx":0.14763364899706352,"ly":0.3,"lz":1.1255629467693422,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","id":"t1uT7pQu9MoDXHdkcvNfZV","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.3813869265757474,"cy":0.1,"cz":0.10822720642012906,"lx":0.07381682449853176,"ly":0.3,"lz":0.7359450036568776,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","id":"oHgCutzcC6esppUpaCZhxo","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jaye","cx":-3.1586003174219464,"cy":42.50138216080711,"cz":0.300000011920929,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","id":"gGGvteApaSqA4rn3D5Jbp6","selected":false,"locked":false,"ly":0.55},{"type":"Window","cx":-0.20914766941250665,"cy":0.1,"cz":0.10822720642012906,"lx":0.07381682449853176,"ly":0.3,"lz":0.7359450036568776,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"qRAtVr3qjJXnPZvCynZgyN","parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20914766941250665,"cy":0.1,"cz":0.10822720642012906,"lx":0.07381682449853176,"ly":0.3,"lz":0.7359450036568776,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"k25WWUL3hGYFBBRg8XmfZg","parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3813869265757474,"cy":0.1,"cz":0.10822720642012906,"lx":0.07381682449853176,"ly":0.3,"lz":0.7359450036568776,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"xpvMVVPvYfJtfXdZGuJKJ7","parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3420580759264758,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","id":"9MktNmqdZdUjgUT3J7mmKP","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.1805306511834178,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"5VB6B3ApC4i4eK9yQ41MtE","parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.019003226440359768,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"wzeRPHbDL7fX7eVg8JovP1","parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.15202581152287814,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"gajXEi8SYukHS1ccyswRmf","parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.3135532362659362,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"8XYd7CxYiMzmhMgtNcF9hb","parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.30405162304575645,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"iXrcQAXko5wJpsX8sJ8oxo","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.14252419830269836,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"dP8bg5cpSmNTjTSvLF6GmF","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.028504839660539658,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"nEjY9Gpj1vzDHW816Q21tM","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.17102903796323798,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"gFdP6DrScRCmNaddZ5LxW9","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.34205807592647597,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"qYRq9Vy4HqB8CxTJbdKN9R","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.40390975298658544,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"7Lt4nrPUnVMu764fCtZmnY","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jamelia","cx":15.537054538671264,"cy":-5.629500472027733,"cz":0.30000001192093256,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","id":"8dBf5N1hG2GfhtqSBisTkY","selected":false,"locked":false,"ly":0.65},{"type":"Window","cx":-0.23224810796728662,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"j9LyHn7BbYyr1sVT3bpcdF","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.07068420677265246,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"f2jDtPu32L3psHVPyQZste","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.10097743824664636,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"ojDrT4TtdCUuT741f3Cvkd","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.26254133944128055,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"r25WWueVXf7KAQQ6LVAkkh","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.26254133944128066,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"881QknQ9aYiDKonXA8GnKw","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.10097743824664644,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"6AJhEo3V3och7gTNYqoNM9","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06058646294798784,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"fL6TEjx55ZJKxKH9q12vGC","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23224810796728676,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"51kmNRrRmSEhwTtk8tqNeL","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.40390975298658566,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"fXSwM2zT4Nfs9fKB83zeeM","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3157345459686911,"cy":0.1,"cz":0.1625,"lx":0.09714909106728957,"ly":0.3,"lz":0.65,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"mrwfYRsQYZsxgg3XbWQ1C9","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-5.39285788621555e-18,"cy":0.1,"cz":0.1625,"lx":0.09714909106728957,"ly":0.3,"lz":0.65,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"bbxD9VsSepsiYkXX43SgSR","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.3157345459686911,"cy":0.1,"cz":0.1625,"lx":0.09714909106728957,"ly":0.3,"lz":0.65,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"7a1XMVdYNgeWFuGynLbyj6","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Door","cx":0.024287272766822392,"cy":0,"cz":-0.45,"lx":0.24287272766822393,"ly":0,"lz":0.1,"textureType":"Door Texture #5","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"bWWJD1gFk9dmFyj6UtBgyw","locked":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.3157345459686911,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"4S2resCtMssVYmHmddP2zN","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-5.39285788621555e-18,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"sBu7pLatsE56Y6wmZEVsrW","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.17001090936775676,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"pKcG4z62TKd9yDYm6HvFre","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.17001090936775676,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"94jWNmV88zyuJzH2jKEhjS","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.31573454596869105,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"qLUGPVCbRRso5wPajMPhB9","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jeff","cx":-15.661746199983284,"cy":-22.272680701572895,"cz":0.30000001192093256,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","id":"ePaWVnF4Nn4YocprHwRiBU","selected":false,"locked":false,"ly":0.6},{"type":"Window","cx":0.029547059313054503,"cy":0.1,"cz":0.3333333333333333,"lx":0.35456471175665405,"ly":0.3,"lz":0.21666666666666667,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"szxkDJ4zvsmCjRAjDwr4oT","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"mP3Am8ZtiUAtGfBZJbxuUF","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.2659770155408789,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"dJZj2sUCxXenPrW2Jawxrw","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09671891474213778,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"ta3rrvA6SZ71h7JpdQ8H9v","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07253918605660334,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"ka6Tnds7o2rpeQbTUL5XNR","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2659770155408789,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"3AmRpUZe9Zieufb9NFpKUe","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2659770155408789,"cy":0.1,"cz":-0.15625,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"9wNFWndGsb6CZofrG9Fupa","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09671891474213778,"cy":0.1,"cz":-0.15625,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"ss9gxEkgAKKu97XBUXNM54","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07253918605660334,"cy":0.1,"cz":-0.15625,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"u7JMjGgg9RrLGWHEohLHUW","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2659770155408789,"cy":0.1,"cz":-0.15625,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"seZJReiTn7AB935XPj7nmi","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.29015674422641347,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"j44vXPNj93wPQunzLh8T1Q","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09671891474213784,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"shnTbDVozQrbvzKdN1MMK9","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0967189147421378,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"33HVy94BzEoDPXtrspXujk","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29015674422641347,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"j4J8y7JeZK4qxfinaK39hR","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.29015674422641347,"cy":0.1,"cz":-0.16875,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"cRf1jRTwuR2e4zLg6vFDLv","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09671891474213784,"cy":0.1,"cz":-0.16875,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"vkoYTRq9mT4PwEwXPraM2s","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0967189147421378,"cy":0.1,"cz":-0.16875,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"mwATeDbSxAHev6LkxaPgTD","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3143364729119479,"cy":0.1,"cz":-0.16875,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"foK7LkvSM2WCizQJfUWA13","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.029980389503821973,"cy":0.1,"cz":0.3416666666666667,"lx":0.4796862320611516,"ly":0.1,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"ho8wYRGhLSJb2djJKqwSe1","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"kNDuFavJnC2DWCruSM8Yz5","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.04497058425573294,"cy":0.1,"cz":0.3416666666666667,"lx":0.5096666215649733,"ly":0.1,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"55SwaH9QxLHmcgrnQzAWTs","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"1zwyQ7SmozfQ7SawBNjqnG","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.029547059313054503,"cy":0.1,"cz":0.3416666666666667,"lx":0.47275294900887205,"ly":0.1,"lz":0.21666666666666667,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"rCFFBj6A2tyxuTVf5rPe81","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"pNX7KUpUJwgYkqu5xoyYFx","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1}],"sceneRadius":88,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[53.57176406047198,16.258735969028876,-0.000005704638955527846],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[53.57176406047198,16.25858596239243,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-85.36846751108261,-76.3704417077798,98.31866395924627],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":11.3760018455292,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[59.19446663129345,19.785139016084358,32.12480868336017],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},451:function(e){e.exports=JSON.parse('{"docid":"e5Mx3kDX6jj2XdEqyRiZ5Z","time":"06/12/2023 05:06 pm","timestamp":1686603965753,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jedi","cx":-0.35404550237608445,"cy":-9.031512450493677,"cz":-4.440892098500626e-16,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.56,"locked":true},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":6,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":6,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":6,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":6,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2kwhV9PqZtFtk8RVLFx83","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qpEwqVCd2BoFtSevFQh92k","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Foundation","cx":0.005791011935526669,"cy":0.058297538110867464,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":true,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Door","cx":0.00416666666666667,"cy":0,"cz":-0.27499999999999997,"lx":0.125,"ly":0,"lz":0.45,"textureType":"Door Texture #15","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"sXi8n3YHx4BKsSMSv4hsZ3","doorType":"Arched","archHeight":1,"filled":true,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2.2458395786002807,"ceiling":true,"locked":true},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5CaMQ21unMpwofCSBHFHKy","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p9ZFePdMbr5NJNutJpztLz","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"onfGgeAsDqrPXW9qAoSbJh","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mM8yRHvdQcQxaerLVfTrHK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"reViENhjL3rZ1iP9Y6KZQV","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dKNjnS17wjTVoaiN1bY7jW","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vXvgSmG1wzCSFmLFyHD3px","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bJfKVxMyGkSvssMyjbaW7W","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u4p2yGTyGA3NaJrURgo1aw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"swiJmUxEJ9JBgVoJXFiWMw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dJpqWBHMDhQTd71cTnXaW4","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j5a1DqXozDg23XnZHUwT3y","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wdagFqacKyLy9R8i7SRZPq","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tJCV3miBMBbJoQ5KVL5GnC","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nRhC43dgJ576icoywiE43t","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fY9urdYNGp76qQUc5TkF8d","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kwvhmrhVppPu21YKVKixoa","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nZtTu7kGPQBjfFfeNj7L7w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"433Qj5XWec6xkx6KMSVinb","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tPa2K6uLM9bNJjLjnApS5w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cAQmf2baCS5Y2WWh241r8n","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Human","name":"Jess","cx":-7.267359835478274,"cy":-5.46716265973663,"cz":0.05000000074505806,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"5FVsreGyGxfLQLGYPuw8VY","selected":false,"locked":true},{"type":"Wall","cx":0.030224599657563633,"cy":2.181664431199555,"cz":2.2408122612280286,"lx":4.432938866484924,"ly":0.3,"lz":2.43795716101014,"leftJoints":["6q7e31mDw8dyN76mepj8pf"],"rightJoints":["91j8TFnFqna2wESTuPP4Kp"],"leftPoint":[2.2466940329000256,2.181664431199555,0],"rightPoint":[-2.1862448335848983,2.181664431199555,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ej8aZCWbLXMBpE4Cdavwp6","parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","roofId":"soVsWFGXbdhR2HYVAwuauC","selected":false,"leftRoofHeight":3.9650570060090606,"rightRoofHeight":2.43795716101014,"centerRoofHeight":[-0.5,3.9650570060090606],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.43795716101014,"rightTopPartialHeight":2.43795716101014},{"type":"Wall","cx":2.2466940329000256,"cy":-0.05093095151911964,"cz":2.2301039869226305,"lx":4.46519076543735,"ly":0.3,"lz":3.9650570060090606,"leftJoints":["oNnwF78XTbjrii9WEpinq5"],"rightJoints":["ej8aZCWbLXMBpE4Cdavwp6"],"leftPoint":[2.246694032900025,-2.2835263342377945,0],"rightPoint":[2.2466940329000264,2.181664431199555,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6q7e31mDw8dyN76mepj8pf","parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","roofId":"soVsWFGXbdhR2HYVAwuauC","selected":false,"leftRoofHeight":3.9650570060090606,"rightRoofHeight":3.9650570060090606,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.2233373091364115,"rightUnfilledHeight":3.2233373091364115,"leftTopPartialHeight":3.9650570060090606,"rightTopPartialHeight":3.9650570060090606},{"type":"Wall","cx":-2.1862448335848983,"cy":-0.05093095151911964,"cz":2.228839888904333,"lx":4.46519076543735,"ly":0.3,"lz":2.43795716101014,"leftJoints":["ej8aZCWbLXMBpE4Cdavwp6"],"rightJoints":["oNnwF78XTbjrii9WEpinq5"],"leftPoint":[-2.1862448335848983,2.181664431199555,0],"rightPoint":[-2.1862448335848983,-2.2835263342377945,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"91j8TFnFqna2wESTuPP4Kp","parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","roofId":"soVsWFGXbdhR2HYVAwuauC","selected":false,"leftRoofHeight":2.43795716101014,"rightRoofHeight":2.43795716101014,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.43795716101014,"rightTopPartialHeight":2.43795716101014},{"type":"Wall","cx":0.030224599657564077,"cy":-2.2835263342377945,"cz":2.268765007024547,"lx":4.432938866484925,"ly":0.3,"lz":2.43795716101014,"leftJoints":["91j8TFnFqna2wESTuPP4Kp"],"rightJoints":["6q7e31mDw8dyN76mepj8pf"],"leftPoint":[-2.1862448335848983,-2.2835263342377945,0],"rightPoint":[2.2466940329000264,-2.2835263342377945,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oNnwF78XTbjrii9WEpinq5","parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","roofId":"soVsWFGXbdhR2HYVAwuauC","selected":false,"leftRoofHeight":2.43795716101014,"rightRoofHeight":3.9650570060090606,"centerRoofHeight":[0.5,3.9650570060090606],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.43795716101014,"rightTopPartialHeight":2.43795716101014},{"type":"Foundation","cx":-8.111049740764729,"cy":0.08239268090626156,"cz":0.05,"lx":6.036367189018974,"ly":6.431853734147982,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7pHjvqBpPz7sYq5ET1nnMX","selected":false,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","roofStructure":"Default","wallsId":["6q7e31mDw8dyN76mepj8pf"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","id":"soVsWFGXbdhR2HYVAwuauC","ridgeLeftPoint":[0.5,1],"ridgeRightPoint":[-0.5,1],"rise":0,"ceiling":false,"locked":true},{"type":"Window","cx":-0.11279199083484595,"cy":0.1,"cz":0.10254486994201946,"lx":0.2255839816696919,"ly":0.3,"lz":0.6152692196521174,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aS26toPbuxFA4EAg6ptRCD","parentId":"oNnwF78XTbjrii9WEpinq5","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.08281474884461537,"lx":0.671863792073878,"ly":0.3,"lz":0.6547294618469256,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oy9eXMTPrwyNzvomHovfsD","parentId":"91j8TFnFqna2wESTuPP4Kp","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"#73d8ff","width":0.25},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.11279199083484595,"cy":0.1,"cz":0.10254486994201946,"lx":0.2255839816696919,"ly":0.3,"lz":0.6152692196521174,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4mXMxYJnZGCrX3QZdFQHGr","parentId":"ej8aZCWbLXMBpE4Cdavwp6","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Wall","cx":-0.8322807242725112,"cy":1.200921695970016,"cz":2.2408122612280286,"lx":0.8544333532350403,"ly":0.15,"lz":9.575974551005562,"leftJoints":["pw9wMqrj3Enw2zC5Tgk6yR"],"rightJoints":["dMssi4ADwUhxkBhQ377g3E"],"leftPoint":[-0.4050640476549914,1.200921695970016,0.11969968188756955],"rightPoint":[-1.259497400890032,1.200921695970016,0.11969968188756955],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #3","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5koEPnk7n6ka7L389qtGvZ","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-0.4050640476549914,"cy":0.14277050874931954,"cz":2.2301039869226305,"lx":2.1163023744413962,"ly":0.15,"lz":9.575974551005562,"leftJoints":["sW8KRkVjiejYRvNZCfXEAP"],"rightJoints":["5koEPnk7n6ka7L389qtGvZ"],"leftPoint":[-0.4050640476549914,-0.9153806784713785,0.11969968188756955],"rightPoint":[-0.4050640476549914,1.200921695970016,0.11969968188756955],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #3","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pw9wMqrj3Enw2zC5Tgk6yR","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-1.259497400890032,"cy":0.14277050874931954,"cz":2.228839888904333,"lx":2.1163023744413962,"ly":0.15,"lz":9.575974551005562,"leftJoints":["5koEPnk7n6ka7L389qtGvZ"],"rightJoints":["sW8KRkVjiejYRvNZCfXEAP"],"leftPoint":[-1.259497400890032,1.200921695970016,0.11969968188756955],"rightPoint":[-1.259497400890032,-0.9153806784713785,0.11969968188756955],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #3","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dMssi4ADwUhxkBhQ377g3E","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-0.8322807242725112,"cy":-0.9153806784713785,"cz":2.268765007024547,"lx":0.8544333532350405,"ly":0.15,"lz":9.575974551005562,"leftJoints":["dMssi4ADwUhxkBhQ377g3E"],"rightJoints":["pw9wMqrj3Enw2zC5Tgk6yR"],"leftPoint":[-1.259497400890032,-0.9153806784713785,0.11969968188756955],"rightPoint":[-0.4050640476549914,-0.9153806784713785,0.11969968188756955],"relativeAngle":0,"textureType":"Wall Texture #3","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sW8KRkVjiejYRvNZCfXEAP","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Foundation","cx":7.486416419884205,"cy":-0.2409139792702466,"cz":0.05,"lx":2.839701333763733,"ly":2.938267885749648,"lz":0.11969968188756955,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qEHo3z28Ar77Wu5WGXMk73","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":8.075263543932596,"cy":-0.6884958197811117,"cz":0.5701039576976044,"lx":5.507966558248896,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":["mqNMzZ6M874kpGr6Eb5P4b"],"leftPoint":[8.075263543932598,2.065487459343336,0],"rightPoint":[8.075263543932595,-3.4424790989055594,0],"relativeAngle":-1.5707963267948974,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pTqaBUKRmjPL9fsFDPBYdH","parentId":"eUQQcfUyWDHA7KoGuDBRyw","foundationId":"eUQQcfUyWDHA7KoGuDBRyw","wallStructure":"Stud","opacity":0,"roofId":null,"selected":false,"structureSpacing":0.25,"structureWidth":0.02,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-8.075263543932598,"cy":-0.6884958197811117,"cz":2.228839888904333,"lx":5.507966558248896,"ly":0.1,"lz":1,"leftJoints":["txrhd5ZN1ZaUi7X6CidW39"],"rightJoints":[],"leftPoint":[-8.075263543932598,-3.4424790989055594,0],"rightPoint":[-8.075263543932598,2.065487459343336,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1eZoH5UbMqtXnnStv5oPMy","parentId":"eUQQcfUyWDHA7KoGuDBRyw","foundationId":"eUQQcfUyWDHA7KoGuDBRyw","wallStructure":"Stud","opacity":0,"roofId":null,"selected":false,"structureSpacing":0.25,"structureWidth":0.02,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-3.545116350166421,"cy":-3.4494515352900414,"cz":0.6126379187745709,"lx":9.060305118936492,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":["1eZoH5UbMqtXnnStv5oPMy"],"leftPoint":[0.9850308435997561,-3.4564239716745235,0],"rightPoint":[-8.075263543932598,-3.4424790989055594,0],"relativeAngle":3.140053535636089,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"txrhd5ZN1ZaUi7X6CidW39","parentId":"eUQQcfUyWDHA7KoGuDBRyw","foundationId":"eUQQcfUyWDHA7KoGuDBRyw","wallStructure":"Stud","opacity":0,"roofId":null,"selected":false,"structureSpacing":0.25,"structureWidth":0.02,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Foundation","cx":-2.1373102684560767,"cy":-4.085170940145713,"cz":0.05,"lx":19.693313015419633,"ly":8.765160185704904,"lz":0.06568375039354474,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eUQQcfUyWDHA7KoGuDBRyw","selected":false,"locked":true,"enableGroupMaster":false,"notBuilding":true},{"type":"Wall","cx":5.761435748265872,"cy":-3.449451535290042,"cz":0.5701039576976044,"lx":4.6276766018679725,"ly":0.1,"lz":1,"leftJoints":["pTqaBUKRmjPL9fsFDPBYdH"],"rightJoints":[],"leftPoint":[8.075263543932598,-3.4424790989055603,0],"rightPoint":[3.4476079525991463,-3.4564239716745235,0],"relativeAngle":-3.1385792853117462,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mqNMzZ6M874kpGr6Eb5P4b","parentId":"eUQQcfUyWDHA7KoGuDBRyw","foundationId":"eUQQcfUyWDHA7KoGuDBRyw","wallStructure":"Stud","opacity":0,"selected":false,"structureSpacing":0.25,"structureWidth":0.02,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Tree","name":"Elm","cx":12.193483954680035,"cy":-3.450559107713003,"cz":8.881784197001252e-16,"lx":8.182228289296598,"lz":10.259018050875072,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"nHGsDGLUFhyht1nKkbShZS","selected":false,"locked":true},{"type":"Tree","name":"Maple","cx":-14.053228627664431,"cy":-3.1648808638293726,"cz":0,"lx":7.51702234293303,"lz":8.935898046217556,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"pYVQihimDYo3cuWwFUxGRV","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":3.290712882109931,"cy":-6.730243806005441,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"pv5MXJzN7e4QwMAqb7AK2K","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-3.2352418118616306,"cy":-6.686295545696994,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"evYRkJazdBwJn4ArepyeZH","selected":false,"locked":true},{"type":"Flower","name":"Spirea","cx":-5.425159494402423,"cy":-6.686295545696994,"cz":0.05000000074505806,"lx":1.8,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"mr1vQH3R9jwp2hzXcmJrDH","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-7.004918274330166,"cy":-0.19566971843541836,"cz":0.03284187614917755,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"qPgjnRK2xBNDKQYWaqPEJW","selected":false,"locked":true},{"type":"Flower","name":"Boxwood","cx":-9.151037603220141,"cy":-3.889330876320888,"cz":0.03284187614917755,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"m8cKNBQB4gUpU1aJMFZzhU","selected":false,"locked":true},{"type":"Flower","name":"Boxwood","cx":9.13503616494302,"cy":-3.964216287045085,"cz":0.032841876149175775,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"tncEiBTcdo5sNQWHKbsyh2","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-7.661893579092403,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"3vTcKnJjhDrau5WtHq6mBt","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-6.661893579092403,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"sDmTVeVfizELxSDFfm4Uea","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-5.661893579092403,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"g823QGzRg2L3V2cZr4aRxd","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-4.661893579092403,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"hHUhERpDDMaotPBoVG69kS","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-3.6618935790924034,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"kHQDrKatqtEmBRsqGsesEx","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-2.6618935790924034,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"tZShdZCdNYPMDRYqULaCBd","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-1.6618935790924034,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"7t2HS7jELVuWTJ8wEd6GU6","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-0.6618935790924034,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"2CQpgvbKEJRX6BS4JzKyeA","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":0.33810642090759657,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"j13bnHy89XjWxoKTXY11wT","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":3.9884684920246123,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"jGj2jbHeSWSMLQ4R6813YK","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":4.988468492024612,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"2Fq3eCF7Cmj4HXLnWJj5XE","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":5.988468492024612,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"3ykQAwfp6KeX9fEn2PpH4T","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":6.988468492024612,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"e26QSrjZiynidud1nyPf16","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":7.988468492024612,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"aZdoik5bFQJGAW29Jo71RA","selected":false,"locked":true},{"type":"Light","decay":2,"distance":10,"intensity":10,"color":"#fe9200","cx":-0.15060725129335759,"cy":-0.0069023347929206705,"cz":8.339264661200525,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0.4097333676171505,0.9122053318530369],"rotation":[0.4221617487320859,0,3.141592653589793],"parentId":"1iq4TPqH8xr1w2VxMAh8MU","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"gsaoCVaDLKgne3oCcDZ5e9","selected":false,"inside":true,"locked":true},{"type":"Light","decay":2,"distance":6,"intensity":8,"color":"#fe9200","cx":0.004999999999999995,"cy":0,"cz":-0.02333333333333333,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"eS9BNDuHjJf4dGFLVwhXwG","selected":false,"locked":true},{"type":"Door","cx":-0.01000000000000002,"cy":0,"cz":-0.21666666666666667,"lx":0.42000000000000004,"ly":0,"lz":0.5666666666666667,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"jbVYfDfRVVQDSMqv6ux2rr","locked":true,"interior":true},{"type":"Foundation","cx":0.0987039168470164,"cy":-6.316994564085812,"cz":0.05,"lx":3.2352197337597937,"ly":4.369968224342228,"lz":0.06568375039354474,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"myXiyVt2NURPnPChDUSnvF","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":0.016199018084092187,"cy":1.482279391694321,"cz":2.2408122612280286,"lx":2.375854690465504,"ly":0.3,"lz":3.2841875196772365,"leftJoints":["cRF4aFTgNdpMTdmopKNDYe"],"rightJoints":["maCaKmF7W1UtJB4NhBQsX3"],"leftPoint":[1.204126363316844,1.482279391694321,0],"rightPoint":[-1.1717283271486596,1.482279391694321,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qA9MpNw8bZfY7qVfr846Q8","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Stud","opacity":0,"roofId":"kL2csyDhpYU6Tdyq5APXiG","selected":false,"leftRoofHeight":3.2841875196772365,"rightRoofHeight":3.2841875196772365,"centerRoofHeight":[0,3.837098172113132],"structureSpacing":1000,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.2841875196772365,"rightTopPartialHeight":3.2841875196772365},{"type":"Wall","cx":1.2041263633168442,"cy":-0.03460380925524109,"cz":0.9803491274068566,"lx":3.0337664018991246,"ly":0.3,"lz":3.2841875196772365,"leftJoints":["5ExmWkfAba5nuC3xfHo5vU"],"rightJoints":["qA9MpNw8bZfY7qVfr846Q8"],"leftPoint":[1.204126363316844,-1.5514870102048033,0],"rightPoint":[1.2041263633168446,1.482279391694321,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cRF4aFTgNdpMTdmopKNDYe","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"kL2csyDhpYU6Tdyq5APXiG","selected":false,"leftRoofHeight":3.2841875196772365,"rightRoofHeight":3.2841875196772365,"structureSpacing":1000,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.2841875196772365,"rightTopPartialHeight":3.2841875196772365},{"type":"Wall","cx":-1.1717283271486596,"cy":-0.03460380925524109,"cz":2.228839888904333,"lx":3.0337664018991246,"ly":0.3,"lz":3.2841875196772365,"leftJoints":["qA9MpNw8bZfY7qVfr846Q8"],"rightJoints":["5ExmWkfAba5nuC3xfHo5vU"],"leftPoint":[-1.1717283271486596,1.482279391694321,0],"rightPoint":[-1.1717283271486596,-1.5514870102048033,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"maCaKmF7W1UtJB4NhBQsX3","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"kL2csyDhpYU6Tdyq5APXiG","selected":false,"leftRoofHeight":3.2841875196772365,"rightRoofHeight":3.2841875196772365,"structureSpacing":1000,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.2841875196772365,"rightTopPartialHeight":3.2841875196772365},{"type":"Wall","cx":0.01619901808409252,"cy":-1.5514870102048033,"cz":2.268765007024547,"lx":2.3758546904655042,"ly":0.3,"lz":3.2841875196772365,"leftJoints":["maCaKmF7W1UtJB4NhBQsX3"],"rightJoints":["cRF4aFTgNdpMTdmopKNDYe"],"leftPoint":[-1.1717283271486596,-1.5514870102048033,0],"rightPoint":[1.2041263633168446,-1.5514870102048033,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5ExmWkfAba5nuC3xfHo5vU","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Default","opacity":0,"roofId":"kL2csyDhpYU6Tdyq5APXiG","selected":false,"leftRoofHeight":3.2841875196772365,"rightRoofHeight":3.2841875196772365,"centerRoofHeight":[0,3.837098172113132],"structureSpacing":1000,"structureWidth":0.2,"structureColor":"white","fill":"Partial","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.110608215274513,"rightUnfilledHeight":3.110608215274513,"leftTopPartialHeight":3.2841875196772365,"rightTopPartialHeight":3.2841875196772365},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","roofStructure":"Default","wallsId":["maCaKmF7W1UtJB4NhBQsX3"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","id":"kL2csyDhpYU6Tdyq5APXiG","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":0.5529106524358953,"ceiling":false,"locked":true},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.21045058100840097,"y":-0.6089786250075502},{"x":-0.21045058100840097,"y":-0.4567339687556626},{"x":0.21045058100840097,"y":-0.4567339687556626},{"x":0.21045058100840097,"y":-0.6089786250075502}],"parentId":"5ExmWkfAba5nuC3xfHo5vU","parentType":"Wall","foundationId":"myXiyVt2NURPnPChDUSnvF","selected":false,"filled":true,"selectedIndex":2,"id":"19jcnLnazAo68d9SCy19QV","noOutline":true,"text":"26","fontSize":0.35,"fontColor":"gold","locked":true},{"type":"Door","cx":-0.05,"cy":0,"cz":-0.4583333333333333,"lx":0.1,"ly":0,"lz":0.08333333333333333,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"3zkRmLGDcsm6tCGsvCTs4B","interior":true,"frameColor":"#4d4d4d","locked":true}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-7.862597366276697,1.7514757983201874,0.0000017661570980830242],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-7.862597366276697,1.7504754208759876,150],"theme":"Mountain","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-6.838817312607155,-22.7607406255055,2.6094586494143144],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":30.146795390577452,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.07649922483275468,1.5616450860400017,2.4309145652183837],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},452:function(e){e.exports=JSON.parse('{"docid":"bdxRpN9LUZ1jTZzjLf3j79","time":"08/16/2023 09:04 am","timestamp":1692191055280,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 1:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":15.82679166341284,"solarUpdraftTower":{},"parentId":"Ground","cx":-8.9649429178124,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.5215353669749065,"type":"Foundation","solarPowerTower":{},"lx":19.683950802792882,"lz":0.08304003951954272,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.04152001975977136,"enableGroupMaster":true,"textureType":"Foundation Texture #4","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":3.3216015807817088,"roofId":"sfGxVh6UQ5Rh5eXQutdage","ly":0.3,"rightPoint":[-6.139317409562167,6.280059949020198,0.08304003951954272],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[5.860682590437832,6.280059949020198,0.08304003951954272],"type":"Wall","rightRoofHeight":3.3216015807817088,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":3.3216015807817088,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.13931740956216743,"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":6.280059949020198,"color":"#f44e3b","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.3216015807817088,"rightTopPartialHeight":3.3216015807817088},{"type":"Wall","parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":5.860682590437831,"leftPoint":[5.860682590437829,-3.719940050979802,0.08304003951954272],"cy":1.2800599490201985,"leftRoofHeight":3.3216015807817088,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[5.860682590437833,6.280059949020198,0.08304003951954272],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":3.3216015807817088,"centerRoofHeight":[0,6.6432031615634175],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":3.3216015807817083,"roofId":"sfGxVh6UQ5Rh5eXQutdage","centerLeftRoofHeight":[-0.35,4.982402371172563],"centerRightRoofHeight":[0.35,4.982402371172564],"color":"#f44e3b","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.3216015807817088,"rightTopPartialHeight":3.3216015807817088},{"lx":10,"lz":3.3216015807817088,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"sfGxVh6UQ5Rh5eXQutdage","selected":false,"cy":1.2800599490201985,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0,6.6432031615634175],"rightPoint":[-6.139317409562167,-3.719940050979802,0.08304003951954272],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":3.3216015807817083,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-6.139317409562166,6.280059949020198,0.08304003951954272],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":3.3216015807817088,"ly":0.3,"cx":-6.139317409562167,"centerLeftRoofHeight":[-0.35,4.982402371172563],"centerRightRoofHeight":[0.35,4.982402371172564],"color":"#f44e3b","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.3216015807817088,"rightTopPartialHeight":3.3216015807817088},{"showLabel":false,"cx":-0.13931740956216743,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[5.860682590437833,-3.719940050979802,0.08304003951954272],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-3.719940050979802,"id":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"sfGxVh6UQ5Rh5eXQutdage","leftPoint":[-6.139317409562167,-3.719940050979802,0.08304003951954272],"normal":[0,0,1],"ly":0.3,"lz":3.3216015807817088,"leftRoofHeight":3.3216015807817088,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":3.3216015807817088,"lx":12,"color":"#f44e3b","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.3216015807817088,"rightTopPartialHeight":3.3216015807817088},{"type":"Window","showLabel":false,"ly":0,"lz":0.44384979425833565,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.07139510364251808,"selected":false,"cx":-0.4166666666666667,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.07139510364251808,"normal":[0,0,1],"cx":-0.225,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0,"lz":0.44384979425833565,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.20833333333333334,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#ffffff","cz":-0.07139510364251808,"cy":0.3,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.4166666666666667,"cy":0.1,"cz":-0.07139510364251808,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Joan","cx":-9.748795495187615,"cy":-11.885843529724642,"cz":0,"lx":1.7,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":1.7,"locked":true},{"type":"Tree","name":"Magnolia","flip":true,"cx":2.83831023868078,"cy":0.3026770951383977,"cz":0,"lx":4.909285741329502,"lz":7.047282022546526,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"t5Aj8tjjpqVaLaB3uEqfR8","selected":false,"locked":true},{"type":"Window","cx":-0.2916666666666667,"cy":-1.3376344861350336e-15,"cz":0,"lx":0.08333333333333333,"ly":0,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2916666666666667,"cy":-1.1010413489448665e-14,"cz":0,"lx":0.08333333333333333,"ly":0,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"roofType":"Gambrel","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"Roof Texture #1","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"sfGxVh6UQ5Rh5eXQutdage","color":"#666666","thickness":0.15,"locked":true,"rise":3.3216015807817088,"ceiling":false,"frontRidgePoint":[0.35,0.5],"backRidgePoint":[0.35,0.5],"topRidgePoint":[0,1]},{"type":"Wall","cx":-0.17032995035379805,"cy":2.9140760690705836,"cz":2.2408122612280286,"lx":4,"ly":0.3,"lz":3.45,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[1.829670049646202,2.914076069070582,0.08304003951954272],"rightPoint":[-2.170329950353798,2.9140760690705845,0.08304003951954272],"relativeAngle":3.1415926535897922,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"p1WWYMY9TmVyswdgfSEZfZ","leftRoofHeight":3.45,"rightRoofHeight":3.4499999999999993,"centerRoofHeight":[0,6.716478772745814],"centerLeftRoofHeight":[-0.35,5.083239386372908],"centerRightRoofHeight":[0.35,5.083239386372907],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.35,"rightUnfilledHeight":3.35,"leftTopPartialHeight":3.45,"rightTopPartialHeight":3.45},{"type":"Wall","cx":1.829670049646202,"cy":-0.3359239309294191,"cz":2.2301039869226305,"lx":6.500000000000001,"ly":0.3,"lz":3.45,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[1.8296700496462002,-3.5859239309294173,0.08304003951954272],"rightPoint":[1.8296700496462037,2.914076069070582,0.08304003951954272],"relativeAngle":1.5707963267948957,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"p1WWYMY9TmVyswdgfSEZfZ","leftRoofHeight":3.45,"rightRoofHeight":3.45,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.0873856802470327,"rightUnfilledHeight":2.3262939270695226,"leftTopPartialHeight":3.45,"rightTopPartialHeight":3.45},{"type":"Wall","cx":-2.170329950353798,"cy":-0.3359239309294191,"cz":2.228839888904333,"lx":6.5,"ly":0.3,"lz":3.45,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-2.170329950353798,2.914076069070582,0.08304003951954272],"rightPoint":[-2.170329950353798,-3.5859239309294173,0.08304003951954272],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"p1WWYMY9TmVyswdgfSEZfZ","leftRoofHeight":3.45,"rightRoofHeight":3.45,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.1078217002230364,"rightUnfilledHeight":2.2273879622936055,"leftTopPartialHeight":3.45,"rightTopPartialHeight":3.45},{"type":"Wall","cx":-0.17032995035379805,"cy":-3.5859239309294173,"cz":2.268765007024547,"lx":3.9999999999999982,"ly":0.3,"lz":3.45,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-2.170329950353798,-3.5859239309294173,0.08304003951954272],"rightPoint":[1.8296700496462002,-3.5859239309294173,0.08304003951954272],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"p1WWYMY9TmVyswdgfSEZfZ","leftRoofHeight":3.45,"rightRoofHeight":3.450000000000001,"centerRoofHeight":[0,6.716478772745814],"centerLeftRoofHeight":[-0.35,5.083239386372908],"centerRightRoofHeight":[0.35000000000000003,5.083239386372907],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.45,"rightTopPartialHeight":3.45},{"type":"Foundation","cx":-8.995176289846825,"cy":-2.548120633774467,"cz":0.04152001975977136,"lx":7.238675704625617,"ly":10.649205015118838,"lz":0.08304003951954272,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"textureType":"No Foundation Texture","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Human","name":"Joel","cx":-7.789004610682257,"cy":-12.04210360652551,"cz":8.881784197001252e-16,"lx":1.8,"ly":1.8,"lz":1.75,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false,"locked":true},{"type":"Window","cx":0,"cy":0.3,"cz":0.8730728022225684,"lx":0.4000000000000002,"ly":0.3,"lz":0.5419072565519394,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"9sxNKgBrTJz5rbuB2EAigV","mullionSpacing":0.56,"shutter":{"showLeft":false,"showRight":false,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":0.8,"empty":false},{"type":"Door","cx":-0.012500000000000002,"cy":0,"cz":-0.0693642478160203,"lx":0.225,"ly":0,"lz":0.8612715043679594,"textureType":"Door Texture Default","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"3ToGStSrcyguQUUqJUFhxz","locked":true,"doorType":"Default","archHeight":1,"filled":false,"interior":true},{"type":"Window","cx":-0.3,"cy":0,"cz":0,"lx":0.10000000000000002,"ly":0,"lz":0.5000000000000001,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"qoQarTFv95tVF8owcPVUFr","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.35,"cy":0,"cz":0,"lx":0.1,"ly":0,"lz":0.5,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"gFrpbUVsUk5Cyw1YgAc3Su","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0,"cz":1.1,"lx":0.1,"ly":0,"lz":0.5,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"g7oggQtbGLCJnWDBEWrL6f","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.25,"cy":0,"cz":0,"lx":0.1,"ly":0,"lz":0.5,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"9KXbYufDZik3nedxtSG2Wa","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3,"cy":1.1102230246251565e-15,"cz":0,"lx":0.1,"ly":0,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hP5LnWCZSyCWuh6LURpM1g","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.5000000000000002,"ly":0,"lz":0.75,"textureType":"Door Texture #2","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"xfiB1ehYmvvHX7d6tsihDv","locked":true,"doorType":"Default","archHeight":1,"filled":true},{"type":"Foundation","cx":-13.194524944705082,"cy":-3.7517234810804703,"cz":0.05,"lx":4.724839965236282,"ly":9.227617734475299,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vQQ15yke8RSPKZiM6iV1gf","textureType":"Foundation Texture #1","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","cx":-1.1428938383677334,"cy":2.0741127418694787,"cz":0,"lx":4.5,"ly":0.3,"lz":5.812802766367991,"relativeAngle":4.71238898038469,"leftPoint":[-1.1428938383677334,4.324112741869479,0.1],"rightPoint":[-1.1428938383677334,-0.1758872581305213,0.1],"leftJoints":["9UyBScab4vxjAdrfwjXhxP"],"rightJoints":["6U3sDe4yzT2QH8iRY62SdZ"],"textureType":"Wall Texture Default","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"1F9rbQh1mAYkQprzoxJ12Q","color":"#f44e3b","roofId":"9Jb55MpdEHfaQRtH1w8w7c","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5.812802766367991,"rightUnfilledHeight":3.4823963079433295,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":0.1071061616322666,"cy":4.324112741869479,"cz":0,"lx":2.5,"ly":0.3,"lz":5.812802766367991,"relativeAngle":3.141592653589793,"leftPoint":[1.3571061616322666,4.324112741869479,0.1],"rightPoint":[-1.1428938383677334,4.324112741869479,0.1],"leftJoints":["vy2WJt6CvVCYvqCPAeFYe5"],"rightJoints":["1F9rbQh1mAYkQprzoxJ12Q"],"textureType":"Wall Texture Default","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"9UyBScab4vxjAdrfwjXhxP","color":"#f44e3b","roofId":"9Jb55MpdEHfaQRtH1w8w7c","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"centerRoofHeight":[0,6.662549619276321],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.238894569131756,"rightUnfilledHeight":4.238894569131756,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":1.3571061616322666,"cy":2.0741127418694787,"cz":0,"lx":4.5,"ly":0.3,"lz":5.812802766367991,"relativeAngle":1.5707963267948966,"leftPoint":[1.3571061616322666,-0.1758872581305213,0.1],"rightPoint":[1.3571061616322666,4.324112741869479,0.1],"leftJoints":["6U3sDe4yzT2QH8iRY62SdZ"],"rightJoints":["9UyBScab4vxjAdrfwjXhxP"],"textureType":"Wall Texture Default","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"vy2WJt6CvVCYvqCPAeFYe5","color":"#f44e3b","roofId":"9Jb55MpdEHfaQRtH1w8w7c","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.596810400573552,"rightUnfilledHeight":5.812802766367991,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":0.1071061616322666,"cy":-0.1758872581305213,"cz":0,"lx":2.5,"ly":0.3,"lz":5.812802766367991,"relativeAngle":0,"leftPoint":[-1.1428938383677334,-0.1758872581305213,0.1],"rightPoint":[1.3571061616322666,-0.1758872581305213,0.1],"leftJoints":["1F9rbQh1mAYkQprzoxJ12Q"],"rightJoints":["vy2WJt6CvVCYvqCPAeFYe5"],"textureType":"Wall Texture Default","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"6U3sDe4yzT2QH8iRY62SdZ","color":"#f44e3b","roofId":"9Jb55MpdEHfaQRtH1w8w7c","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"centerRoofHeight":[0,6.662549619276321],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.6595021394542453,"rightUnfilledHeight":3.6595021394542453,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["1F9rbQh1mAYkQprzoxJ12Q"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"9Jb55MpdEHfaQRtH1w8w7c","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":true,"rise":0.8497468529083303,"ceiling":false},{"type":"Wall","cx":-1.1202290403576152,"cy":2.071621897384918,"cz":0,"lx":4.5,"ly":0.3,"lz":5.812802766367991,"leftJoints":["1nb1rRhk5XTwkqRDvamK5g"],"rightJoints":["3LCPjAAvYioWiSGfdrWDra"],"leftPoint":[-1.1202290403576152,4.321621897384919,0.1],"rightPoint":[-1.1202290403576152,-0.17837810261508213,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"bpwfKUJNQLVoQQHt2xqi72","parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"roofId":"3RtfyZgDoXZ3wGixrorVUM","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5.812802766367991,"rightUnfilledHeight":3.2790718567695616,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":0.12977095964238483,"cy":4.321621897384919,"cz":0,"lx":2.5,"ly":0.3,"lz":5.812802766367991,"leftJoints":["mMwirEeb4r8mhYQ7E9qdX2"],"rightJoints":["bpwfKUJNQLVoQQHt2xqi72"],"leftPoint":[1.3797709596423848,4.321621897384919,0.1],"rightPoint":[-1.1202290403576152,4.321621897384919,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"1nb1rRhk5XTwkqRDvamK5g","parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"roofId":"3RtfyZgDoXZ3wGixrorVUM","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"centerRoofHeight":[0,6.6628027663679905],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.6979530221307058,"rightUnfilledHeight":3.6979530221307058,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":1.3797709596423848,"cy":2.071621897384918,"cz":0,"lx":4.5,"ly":0.3,"lz":5.812802766367991,"leftJoints":["3LCPjAAvYioWiSGfdrWDra"],"rightJoints":["1nb1rRhk5XTwkqRDvamK5g"],"leftPoint":[1.3797709596423848,-0.17837810261508213,0.1],"rightPoint":[1.3797709596423848,4.321621897384919,0.1],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"mMwirEeb4r8mhYQ7E9qdX2","parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"roofId":"3RtfyZgDoXZ3wGixrorVUM","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.3444620413364214,"rightUnfilledHeight":5.812802766367991,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":0.12977095964238483,"cy":-0.17837810261508213,"cz":0,"lx":2.5,"ly":0.3,"lz":5.812802766367991,"leftJoints":["bpwfKUJNQLVoQQHt2xqi72"],"rightJoints":["mMwirEeb4r8mhYQ7E9qdX2"],"leftPoint":[-1.1202290403576152,-0.17837810261508213,0.1],"rightPoint":[1.3797709596423848,-0.17837810261508213,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"3LCPjAAvYioWiSGfdrWDra","parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"roofId":"3RtfyZgDoXZ3wGixrorVUM","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"centerRoofHeight":[0,6.6628027663679905],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.203916013233736,"rightUnfilledHeight":3.203916013233736,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Foundation","cx":-5.154384285489001,"cy":-3.843449030047704,"cz":0.05,"lx":5.245611715983199,"ly":9.222636045506174,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"textureType":"Foundation Texture #1","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["bpwfKUJNQLVoQQHt2xqi72"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","id":"3RtfyZgDoXZ3wGixrorVUM","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":true,"rise":0.85,"ceiling":false},{"type":"Window","cx":0.019999999999999997,"cy":0.1,"cz":0.35266980188300795,"lx":0.44000000000000006,"ly":0.3,"lz":0.22364426460873682,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"3LCPjAAvYioWiSGfdrWDra","foundationId":"mJVE3dD5FuAaHn4NaQUVru","id":"nEpoC7XwMto4CjwuGq3WQ5","mullionSpacing":0.6,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3607208764315504,"lx":0.4,"ly":0.3,"lz":0.24194892545145757,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6U3sDe4yzT2QH8iRY62SdZ","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"izgEX4RP4fMzobDmWztBrf","mullionSpacing":0.6,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-9.128472071553885,"cy":-5.731921555180726,"cz":0.05,"lx":10.661429059004004,"ly":5.310443804879643,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jjxHg8QgQHBYMPjmTLKh9Y","textureType":"No Foundation Texture","locked":true,"notBuilding":true},{"type":"Wall","cx":-3.055204431580803,"cy":-1.835109259524482,"cz":0,"lx":1.8466260644079497,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-3.9785174637847778,-1.8351092595244811,0.1],"rightPoint":[-2.131891399376828,-1.835109259524483,0.1],"relativeAngle":6.283185307179585,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"wyasgQhDU8TZWAHXXtnR4J","parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.3,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-3.9785174637847778,"cy":-0.160751432682531,"cz":0.5175200861571223,"lx":3.3487156536839,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-3.9785174637847796,1.513606394159419,0.1],"rightPoint":[-3.9785174637847778,-1.8351092595244811,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"6Hv4mJv5hCRGAqNa8Wf45B","parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.3,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.7895023054362934,"rightTopPartialHeight":0.7895023054362934},{"type":"Wall","cx":3.9728241996527984,"cy":-0.16075143268253278,"cz":0.5732895465300347,"lx":3.3487156536839007,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[3.9728241996527993,-1.835109259524483,0.1],"rightPoint":[3.9728241996527984,1.5136063941594173,0.1],"relativeAngle":1.570796326794897,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"1fR31M3LuxWCDraA3p4mZU","parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.3,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.847582665593212,"rightTopPartialHeight":0.847582665593212},{"type":"Wall","cx":2.997153367934011,"cy":-1.835109259524483,"cz":0,"lx":1.951341663437577,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[2.0214825362152222,-1.835109259524483,0.1],"rightPoint":[3.9728241996527993,-1.835109259524483,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"iUM2Ms6kj53m7TzQjPhH62","parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.3,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Foundation","cx":-1.6211500807426074,"cy":0.8631023553389863,"cz":0.05,"lx":4.818228793661425,"ly":2.663944474302019,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1tKxhv9RZ3WGSr4yfyFtGe","textureType":"No Foundation Texture","locked":true,"notBuilding":true},{"type":"Wall","cx":-0.7514450867052019,"cy":0.5637297015144593,"cz":0,"lx":1.5028901734104034,"ly":0.25,"lz":9,"relativeAngle":3.141592653589793,"leftPoint":[-2.6696692384049984e-16,0.5637297015144593,0],"rightPoint":[-1.5028901734104037,0.5637297015144593,0],"leftJoints":["188rdr57sdmGcfGiDQEznS"],"rightJoints":["t7nvzQnWvPgJFKi8qM2KJ2"],"textureType":"Wall Texture #3","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","foundationId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"nzDmLXy4XJEJgippavtWPK","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":0.00011804109969691571,"cy":-0.1412546603508431,"cz":0,"lx":1.4099687434951584,"ly":0.25,"lz":9,"relativeAngle":1.5709637646913654,"leftPoint":[0.00023608219939409838,-0.8462390222161456,0],"rightPoint":[-2.6696692384049984e-16,0.5637297015144593,0],"leftJoints":["bKLADc1rtEXxLWJ2wpXCyG"],"rightJoints":["nzDmLXy4XJEJgippavtWPK"],"textureType":"Wall Texture #3","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","foundationId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"188rdr57sdmGcfGiDQEznS","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-1.5028901734104037,"cy":-0.14093242537861483,"cz":0,"lx":1.4093242537861483,"ly":0.25,"lz":9,"relativeAngle":-1.5707963267948966,"leftPoint":[-1.5028901734104037,0.5637297015144593,0],"rightPoint":[-1.5028901734104037,-0.845594552271689,0],"leftJoints":["nzDmLXy4XJEJgippavtWPK"],"rightJoints":["bKLADc1rtEXxLWJ2wpXCyG"],"textureType":"Wall Texture #3","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","foundationId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"t7nvzQnWvPgJFKi8qM2KJ2","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.7702585421996653,"rightUnfilledHeight":3.7702585421996653,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-0.7513270456055048,"cy":-0.8459167872439173,"cz":0,"lx":1.5031263937690138,"ly":0.25,"lz":9,"relativeAngle":-0.0004287530089774864,"leftPoint":[-1.5028901734104037,-0.845594552271689,0],"rightPoint":[0.00023608219939409838,-0.8462390222161456,0],"leftJoints":["t7nvzQnWvPgJFKi8qM2KJ2"],"rightJoints":["188rdr57sdmGcfGiDQEznS"],"textureType":"Wall Texture #3","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","foundationId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"bKLADc1rtEXxLWJ2wpXCyG","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Tree","name":"Dogwood","flip":true,"cx":-17.829756210687247,"cy":-6.178261442103567,"cz":0,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"sgSHG9SfkfzrTceiA5T19b","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":-14.43393823103578,"cy":-4.956583187921545,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fwbwXjTKB4ejYpnXGBAaQt","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":-4.4821432852704675,"cy":0.4495990226501192,"cz":0.05999999865889549,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"24FmLU3mJkXNY53JzrL5Dt","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":-4.910500041352744,"cy":0.9540476712796391,"cz":0.05999999865889549,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"reEeBmqCcbQu2EtMT38ywZ","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":4.9562085665626325,"cy":1.0667527129983299,"cz":0.05999999865889549,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"o3P5EpuHXdx6pH3hYkfv1R","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":4.317403660851184,"cy":0.4787676966756642,"cz":0.05999999865889727,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"3LVtMLU8sBDE9SYSdKtA6S","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":5.530912218683256,"cy":1.5116578930650046,"cz":0.05999999865889549,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"2Y1swCnkjr3jQPeteyJshF","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":4.806452300697741,"cy":1.744166442984243,"cz":0.05999999865889727,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"8t9PQbZw572ixzdS9MRLLW","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":4.291768127996638,"cy":1.3247562673381097,"cz":0.05999999865889549,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"4JVL5x9cWyH4LksfSY1fX3","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":4.661246706636892,"cy":1.5508003603072646,"cz":0.05999999865889549,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"nGnmCTUqQFz7isWWpWK3Mz","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":-0.33218746630730145,"cy":-0.5494864663355421,"cz":0.05000000074505895,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","id":"gZ9m1tT2VUgZsBDcfZh8HW","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":-4.244159478853515,"cy":1.7707434623377676,"cz":0.05999999865889549,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"9SxVYH5WbgA3HtDCqqfPhx","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":-4.802140374248943,"cy":1.496640607591619,"cz":0.05999999865889549,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"bJusUpxFXhNuVLWkwSgPDp","selected":false,"locked":true},{"type":"Flower","name":"Boxwood","flip":true,"cx":-4.49997835962516,"cy":-1.1855861204384208,"cz":0.06,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"abgyaezp654EktrPW99LBw","selected":false,"locked":true},{"type":"Flower","name":"Boxwood","cx":4.432083177417134,"cy":-1.2772922274665977,"cz":0.06,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"7MNjP1XvBJBd9d5PFunfnH","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","flip":true,"cx":-7.116951685811008,"cy":3.638352633555244,"cz":0.04152001813054085,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"1FPVPX2cPwyJtX2iR6TB6X","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":1.182265720860439,"cy":-0.23022475718108382,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"qbSQDtvRnmoWesph95KY9z","selected":false,"locked":true},{"type":"Human","name":"Jade","cx":-3.033395250022613,"cy":-0.5816610420513619,"cz":0.05999999865889549,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"mtu9ruoaP4m3bTDiUvwuGN","selected":false,"ly":0.48,"locked":true,"flip":true},{"type":"Human","name":"Jose","cx":-16.76731141531199,"cy":-10.548882253809875,"cz":-1.7763568394002505e-15,"lx":2,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"96NHdfhp3jEHitMi3f3E5K","selected":false,"ly":2,"locked":true,"flip":true},{"type":"Flower","name":"Hibiscus","cx":-7.181651324625273,"cy":-1.60099461837087,"cz":0.04152001813054085,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"dVDLRSyAD2wDbGWk4knF4E","selected":false,"locked":true},{"type":"Tree","name":"Magnolia","cx":1.620258691481478,"cy":-5.240948297707899,"cz":4.440892098500626e-16,"lx":5.556994802603297,"lz":7.996988894474121,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"oELXz144CkaWe2X3qoRnK8","selected":false,"locked":true},{"type":"Human","name":"Jaye","cx":-1.4302201700943762,"cy":-2.031152248382565,"cz":0.04943574334705669,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"gr5QDB4cbkGum8zoHp2N7d","selected":false,"locked":true,"ly":0.55},{"type":"Tree","name":"Dogwood","cx":-8.836300989612065,"cy":6.666048417776266,"cz":0.0415200181305444,"lx":3,"lz":4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tirzAP1CYKccDFYsQijz2n","selected":false,"locked":true},{"type":"Window","cx":-0.008333333333333331,"cy":0.1,"cz":-0.009152330421360376,"lx":0.08333333333333333,"ly":0.3,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.9,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n8fVvNLwh7c4hGNqS46E2j","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"selected":false,"windowType":"Default","archHeight":1,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gambrel","roofStructure":"Default","wallsId":["2RETAxyRMzZBEQkBGms56R"],"textureType":"Roof Texture #1","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"p1WWYMY9TmVyswdgfSEZfZ","rise":3.266478772745814,"ceiling":false,"frontRidgePoint":[0.35,0.5],"backRidgePoint":[0.35,0.5],"topRidgePoint":[0,1],"locked":true},{"type":"Window","cx":-4.213281959601948,"cy":-2.634538118666024,"cz":4.673359172167364,"lx":2.1500259275083913,"ly":0.15,"lz":1.2358639032447665,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"bAFTA4vJ8U4gd3hFz74r7X","locked":true,"interior":true,"empty":true},{"type":"Window","cx":-4.195476233446163,"cy":-1.505374843371567,"cz":5.4714739316244385,"lx":2.170306524786385,"ly":0.15,"lz":1.415052250899271,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.4430521468850588,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"5CQw4ehLx6bYSBiyfowUgp","locked":true,"interior":true,"empty":true,"polygonTop":[0.041335690072458735,2.1804081724852833]},{"type":"Window","cx":3.9865243272197457,"cy":-2.690596399748453,"cz":4.611291413814264,"lx":2.264658675515979,"ly":0.15,"lz":1.4006562758537777,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"73WXvEpNVy6WMicsQVtM4K","locked":true,"interior":true,"empty":true},{"type":"Window","cx":4.003502641451691,"cy":-1.5436235422141884,"cz":5.453324368976082,"lx":2.2758545278519184,"ly":0.15,"lz":1.4725562648663195,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.4430521468850588,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"6sSeyqhkrkXd9xruJTto55","locked":true,"interior":true,"polygonTop":[-0.03456014333676215,2.044626136017569],"empty":true},{"type":"Window","cx":-0.14301293626591338,"cy":-3.0760156278277453,"cz":4.184555041396983,"lx":2.492322842531612,"ly":0.15,"lz":2.5010692402560784,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"roHftPtnfwZguzJ6CGy1u1","locked":true,"interior":true},{"type":"Door","cx":-0.1269230769230768,"cy":0,"cz":-0.032608695652173926,"lx":0.7153846153846152,"ly":0,"lz":0.9347826086956521,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"mjYXviVCxSp5wKZomZ1KXX","interior":true,"locked":true},{"type":"Door","cx":0.12692307692307694,"cy":0,"cz":-0.032608695652173926,"lx":0.7153846153846154,"ly":0,"lz":0.9347826086956521,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"gVuhwxMRjqj8Y5dEW4h6yb","locked":true,"interior":true},{"type":"Window","cx":-0.18164384373242548,"cy":-2.1763353010978204,"cz":5.153093457763647,"lx":2.4530899553344963,"ly":0.15,"lz":0.021492949604609426,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.4430521468850588,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"8dL9pADpGdb8uz3jgoQ35W","locked":true,"interior":true,"polygonTop":[-0.02050328365131785,3.3532324030149554]},{"type":"Window","cx":1.445462406762685,"cy":-3.8750343198078783,"cz":3.2998811246118693,"lx":0.6642965558015783,"ly":0.15,"lz":0.13029717559155046,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"qWHrnb8KKMoQRor3JnSQFU","polygonTop":[-0.5,2.3784236921544717],"interior":true,"empty":true,"locked":true},{"type":"Window","cx":-1.8155222162706668,"cy":-3.9009770076057917,"cz":3.2711573670121106,"lx":0.6830097672938518,"ly":0.15,"lz":0.037173765084373096,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"cCVV5LBTueLCRBh8Qiucqm","polygonTop":[0.5,2.451948768657457],"interior":true,"empty":true,"locked":true},{"type":"Window","cx":-1.1953590455988037,"cy":3.710975210631405,"cz":5.8617143628039825,"lx":1.3882703649523895,"ly":0.1,"lz":0.05964604677957688,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5971766580926772,0,4.71238898038469],"parentId":"3RtfyZgDoXZ3wGixrorVUM","parentType":"Roof","foundationId":"mJVE3dD5FuAaHn4NaQUVru","id":"uj3hhpNKwSAcHZfWCq9Luv","interior":true,"empty":true,"polygonTop":[-0.5,1.197404893567288],"locked":true},{"type":"Door","cx":0,"cy":0,"cz":-0.40052979348664974,"lx":0.1,"ly":0,"lz":0.19894041302670049,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"onpRTR6aYFESxEyAVVtKxv","locked":true,"interior":true},{"type":"Window","cx":1.4673866142968786,"cy":3.7373739092900653,"cz":5.853224121202935,"lx":1.2289614765652717,"ly":0.1,"lz":0.027992846261972834,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5971766580926772,0,1.5707963267948966],"parentId":"3RtfyZgDoXZ3wGixrorVUM","parentType":"Roof","foundationId":"mJVE3dD5FuAaHn4NaQUVru","id":"x86g7FJRWVhpFuUj55vS2u","polygonTop":[0.5,1.2696169168418234],"empty":true,"interior":true,"locked":true},{"type":"Window","cx":-1.8854196712406885,"cy":1.377621465687576,"cz":4.325544482383382,"lx":3.1362291179665966,"ly":0.1,"lz":1.8233213544103637,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.218733394523589,0,-1.5707963267948966],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"mX7yGqS9yHFcCXD3HzPsqo","interior":true,"empty":true,"locked":true},{"type":"Window","cx":1.57237554916422,"cy":1.3657152285229026,"cz":4.2503725201405285,"lx":3.1993051559264813,"ly":0.1,"lz":1.9446887668441453,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.2187333945235876,0,1.5707963267948963],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"7HdybnBrpZ9pZKTsQWmnxm","interior":true,"empty":true,"locked":true},{"type":"Window","cx":1.1953670575332103,"cy":1.4635343025462166,"cz":5.223257241936748,"lx":2.975761109246804,"ly":0.1,"lz":0.0858565540829778,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8621416327956242,0,1.5707963267948963],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"fq4riipVcz1YXRCRFinfh9","polygonTop":[0.5,1.8067884811337014],"empty":true,"interior":true,"locked":true},{"type":"Window","cx":-1.5078124165602862,"cy":1.6184244215922492,"cz":5.256172313894667,"lx":2.757238648211566,"ly":0.1,"lz":0.157707537509605,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8621416327956238,0,4.71238898038469],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"8uYxv4QmwRV4QGvGAmTGjh","interior":true,"empty":true,"polygonTop":[-0.5,1.6411153230617954],"locked":true},{"type":"Window","cx":1.9241586401335837,"cy":-1.0071004651436564,"cz":3.2927958540885793,"lx":1.433257415263137,"ly":0.1,"lz":0.013334330641535795,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.2187333945235888,0,1.570796326794896],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"eKtQtrVKNAyECAnnFakYcM","interior":true,"empty":true,"polygonTop":[0.5,1.8703231446359028],"locked":true},{"type":"Window","cx":-2.1759330536672916,"cy":-0.9097092686724473,"cz":3.5347479849708097,"lx":1.401447790844605,"ly":0.1,"lz":0.1563290290003139,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.218733394523589,0,-1.5707963267948966],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"bscMEhqajcMX1VR8jmUamz","interior":true,"polygonTop":[-0.5,1.6499601679714657],"locked":true},{"type":"Window","cx":-1.1488249093401395,"cy":3.6694840938188165,"cz":5.908770839253448,"lx":1.465482126287153,"ly":0.1,"lz":0.011624696831896512,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5970381619598664,0,4.71238898038469],"parentId":"9Jb55MpdEHfaQRtH1w8w7c","parentType":"Roof","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"voXoMmK9hgrALZQEVrCQw5","interior":true,"polygonTop":[-0.5,1.1791221277328057],"locked":true},{"type":"Window","cx":1.4545359523843153,"cy":3.6687614111197395,"cz":5.846570239911134,"lx":1.494871028893363,"ly":0.1,"lz":0.000005533992709237107,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5970381619598664,0,1.5707963267948966],"parentId":"9Jb55MpdEHfaQRtH1w8w7c","parentType":"Roof","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"njHN3bGKJaNcsPt3zqUDGM","polygonTop":[0.5,1.3683506058769899],"locked":true},{"type":"Foundation","cx":-9.019380791884265,"cy":-6.4970289405032915,"cz":0.06,"lx":13.017853790376485,"ly":4.062304674420269,"lz":0.12,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"#808080","textureType":"Foundation Texture #2","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"irBooVothSqri1n99D7Wzu","notBuilding":true,"locked":true},{"type":"Wall","cx":-0.002846632065990562,"cy":1.5136063941594182,"cz":0,"lx":7.951341663437577,"ly":0.3,"lz":3.12,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"rValue":2,"fill":"Empty","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.6465790930600694,"rightTopPartialHeight":0.6465790930600694,"relativeAngle":3.141592653589793,"leftPoint":[3.9728241996527984,1.5136063941594173,0.1],"rightPoint":[-3.9785174637847796,1.513606394159419,0.1],"leftJoints":["kGep2Ez1jSGfeVaiQD6Nk1"],"rightJoints":["jQqGH4ZZuR2sJEjqAtaMdR"],"textureType":"Wall Texture Default","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"rTXZg1jcKPDTpopSQL5CRv","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vFgo3dzFcDvifutsURLSxs","leftRoofHeight":3.12,"rightRoofHeight":3.12,"locked":true},{"type":"Wall","cx":3.9728241996527984,"cy":-0.16075143268253278,"cz":0,"lx":3.3487156536839007,"ly":0.3,"lz":3.12,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.3,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.6465790930600694,"rightTopPartialHeight":0.6465790930600694,"relativeAngle":1.570796326794897,"leftPoint":[3.9728241996527993,-1.835109259524483,0.1],"rightPoint":[3.9728241996527984,1.5136063941594173,0.1],"leftJoints":["keZvZnZ8iUxAQcoKMHvMJB"],"rightJoints":["rTXZg1jcKPDTpopSQL5CRv"],"textureType":"Wall Texture Default","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"kGep2Ez1jSGfeVaiQD6Nk1","structureSpacing":1.7,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vFgo3dzFcDvifutsURLSxs","leftRoofHeight":3.12,"rightRoofHeight":3.12,"locked":true},{"type":"Wall","cx":-3.9785174637847778,"cy":-0.160751432682531,"cz":0,"lx":3.3487156536839,"ly":0.3,"lz":3.12,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.3,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.6465790930600694,"rightTopPartialHeight":0.6465790930600694,"relativeAngle":4.71238898038469,"leftPoint":[-3.9785174637847796,1.513606394159419,0.1],"rightPoint":[-3.9785174637847778,-1.8351092595244811,0.1],"leftJoints":["rTXZg1jcKPDTpopSQL5CRv"],"rightJoints":["keZvZnZ8iUxAQcoKMHvMJB"],"textureType":"Wall Texture Default","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"jQqGH4ZZuR2sJEjqAtaMdR","structureSpacing":1.7,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vFgo3dzFcDvifutsURLSxs","leftRoofHeight":3.12,"rightRoofHeight":3.12,"locked":true},{"type":"Wall","cx":-0.0028466320659887856,"cy":-1.835109259524482,"cz":0,"lx":7.951341663437577,"ly":0.3,"lz":3.12,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.3,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.6465790930600694,"rightTopPartialHeight":0.6465790930600694,"relativeAngle":0,"leftPoint":[-3.9785174637847778,-1.8351092595244811,0.1],"rightPoint":[3.9728241996527993,-1.835109259524483,0.1],"leftJoints":["jQqGH4ZZuR2sJEjqAtaMdR"],"rightJoints":["kGep2Ez1jSGfeVaiQD6Nk1"],"textureType":"Wall Texture Default","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"keZvZnZ8iUxAQcoKMHvMJB","structureSpacing":1.95,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vFgo3dzFcDvifutsURLSxs","leftRoofHeight":3.12,"rightRoofHeight":3.12,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.5816829802762808,"thickness":0.1,"rValue":2,"color":"#454769","sideColor":"#ffffff","textureType":"Roof Texture #1","roofType":"Hip","roofStructure":"Default","wallsId":["kGep2Ez1jSGfeVaiQD6Nk1"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"vFgo3dzFcDvifutsURLSxs","leftRidgeLength":-1.5743578268419502,"rightRidgeLength":1.6693578268419502,"locked":true},{"type":"Window","cx":1.8566011256825674,"cy":0.6599329242183138,"cz":3.5487146962420235,"lx":1.5566850872614637,"ly":0.1,"lz":0.002654387077510697,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.13521473007536366,0,1.5707963267948968],"parentId":"vFgo3dzFcDvifutsURLSxs","parentType":"Roof","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"rihytw1YgyZTRTywNknqYW","polygonTop":[0.5,1.775657673942406],"locked":true},{"type":"Window","cx":-1.819837767636188,"cy":0.6880180791747286,"cz":3.5544907008722126,"lx":1.5263724499901699,"ly":0.1,"lz":0.026357656056318596,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.13521473007536366,0,-1.5707963267948961],"parentId":"vFgo3dzFcDvifutsURLSxs","parentType":"Roof","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"stDHx7ttyun3AsgaRa1QHp","polygonTop":[-0.5,1.8110420094651125],"locked":true},{"type":"Window","cx":0.020163528741469428,"cy":-0.10759934471036203,"cz":3.552336576069286,"lx":3.53497207600787,"ly":0.1,"lz":0.05477306389188632,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16246888891658018,0,-4.440892098500626e-16],"parentId":"vFgo3dzFcDvifutsURLSxs","parentType":"Roof","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"tDydDDQ3yMKBMmcqedWGby","polygonTop":[0.0030579922127344215,1.4843446624982513],"locked":true}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[1.8840441516195205,0.5644717303985555,0.0000011143112580395247],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[1.8840441516195205,0.5634713529449765,150],"theme":"Rural","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-12.358378063755914,-20.87295700480061,2.7360078726027206],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":24.554753263096522,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-7.660890412118296,2.6592379428106594,2.7360078726027206],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5,"navigationView":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":[],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},453:function(e){e.exports=JSON.parse('{"docid":"rrmoe4xsE37DPN5LvoSX2L","time":"08/09/2023 10:13 am","timestamp":1691590424058,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"4/22/2022, 1:30:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":0.06979666348441205,"cy":3.6828701050775523,"cz":2.5,"lx":10.751033569310817,"ly":0.3,"lz":4.88805324936884,"leftJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"rightJoints":["11Ltx28CSTVpm6gjZuBH9w"],"leftPoint":[5.445313448139821,3.682870105077552,0.1],"rightPoint":[-5.305720121170997,3.682870105077553,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n8LvMVp1hZ7BptmwrWpcMT","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"hg8eUTjrNzo4UYNKSxj3Pu","selected":false,"leftRoofHeight":4.88805324936884,"rightRoofHeight":4.88805324936884,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.002373687472664,"rightUnfilledHeight":4.002373687472664,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Wall","cx":5.445313448139816,"cy":0.4275597826751323,"cz":2.2301039869226305,"lx":6.510620644804842,"ly":0.3,"lz":4.88805324936884,"leftJoints":["hndwqtrrygFvfqvBJrvZYu"],"rightJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"leftPoint":[5.445313448139813,-2.8277505397272886,0.1],"rightPoint":[5.445313448139821,3.682870105077553,0.1],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e5r2Cqz5K28ewHbKWcFnYZ","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"hg8eUTjrNzo4UYNKSxj3Pu","selected":false,"leftRoofHeight":4.88805324936884,"rightRoofHeight":4.88805324936884,"centerRoofHeight":[0,7.235780632005643],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5,"rightUnfilledHeight":5,"leftTopPartialHeight":5,"rightTopPartialHeight":5,"locked":false,"openToOutside":false},{"type":"Wall","cx":-5.305720121170997,"cy":0.4275597826751323,"cz":2.228839888904333,"lx":6.510620644804842,"ly":0.3,"lz":4.88805324936884,"leftJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"rightJoints":["hndwqtrrygFvfqvBJrvZYu"],"leftPoint":[-5.305720121170997,3.682870105077553,0.1],"rightPoint":[-5.305720121170997,-2.8277505397272886,0.1],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"11Ltx28CSTVpm6gjZuBH9w","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"hg8eUTjrNzo4UYNKSxj3Pu","selected":false,"leftRoofHeight":4.88805324936884,"rightRoofHeight":4.88805324936884,"centerRoofHeight":[0,7.235780632005643],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5,"rightUnfilledHeight":5,"leftTopPartialHeight":5,"rightTopPartialHeight":5,"locked":false,"openToOutside":false},{"type":"Wall","cx":0.06979666348441205,"cy":-2.8277505397272886,"cz":2.268765007024547,"lx":10.751033569310817,"ly":0.3,"lz":4.88805324936884,"leftJoints":["11Ltx28CSTVpm6gjZuBH9w"],"rightJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"leftPoint":[-5.305720121170997,-2.8277505397272886,0.1],"rightPoint":[5.445313448139821,-2.8277505397272886,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hndwqtrrygFvfqvBJrvZYu","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"hg8eUTjrNzo4UYNKSxj3Pu","selected":false,"leftRoofHeight":4.88805324936884,"rightRoofHeight":4.88805324936884,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.224276701112264,"rightUnfilledHeight":4.224276701112264,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false,"openToOutside":false},{"type":"Foundation","cx":0.3157662585983827,"cy":-0.49838170379810354,"cz":0.05,"lx":15.656066884011606,"ly":12.596965835422395,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Human","name":"June","cx":-2.4661903240728087,"cy":-9.006462311217309,"cz":0,"lx":0.65,"ly":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qPhtowBuGGDfEAuEFNhxwt","selected":false,"locked":false},{"type":"Wall","cx":0.14686719191865327,"cy":5.522679083865754,"cz":2.2408122612280286,"lx":13.78718704575697,"ly":0.3,"lz":4.061910717171535,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[7.040460714797138,5.522679083865754,0.12],"rightPoint":[-6.746726330959832,5.522679083865754,0.12],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.06250000000000006,"lx":0.0708994221944815,"ly":0.3,"lz":0.3750000000000001,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729104,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":7.040460714797138,"cy":0.02164780187261517,"cz":2.2301039869226305,"lx":11.002062563986277,"ly":0.3,"lz":4.061910717171535,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[7.040460714797138,-5.479383480120523,0.12],"rightPoint":[7.04046071479714,5.522679083865754,0.12],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":-6.746726330959831,"cy":0.02164780187261517,"cz":2.228839888904333,"lx":11.002062563986277,"ly":0.3,"lz":4.061910717171535,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-6.74672633095983,5.522679083865754,0.12],"rightPoint":[-6.746726330959832,-5.479383480120523,0.12],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":0.14686719191865416,"cy":-5.479383480120523,"cz":2.268765007024547,"lx":13.787187045756973,"ly":0.3,"lz":4.061910717171535,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-6.746726330959832,-5.479383480120523,0.12],"rightPoint":[7.04046071479714,-5.479383480120523,0.12],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.39930090798010054,"cy":0.1,"cz":-0.0484624485645839,"lx":0.072600165087291,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"29QuQvndX2M7Sq4iEkq1Xz","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.21716749210312172,"cy":0.1,"cz":-0.0484624485645839,"lx":0.0738661714047936,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4LUVPCUMNMxJkqRL8wFtEe","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25410057780551853,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"9FGAjvvq6tsggdPdWysCTK","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":-0.06249999999999989,"lx":0.072600165087291,"ly":0.3,"lz":0.3749999999999998,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"ucbeQgKEoSy9dHSmSFvaic","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":0.014266831753957678,"cy":0,"cz":-0.1875,"lx":0.26186699684124864,"ly":0,"lz":0.625,"color":"#73d8ff","textureType":"Door Texture #6","normal":[0,1,0],"rotation":[0,0,0],"id":"wzic8VHyh9MpPw339UYDy4","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"doorType":"Default","archHeight":1,"filled":true,"locked":false},{"id":"22qg2ZvB7t4cVkS2ppWUue","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["roDDPncXBpNgmNum9aUaov"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":2.0309553585857674,"ceiling":false,"locked":false},{"type":"Foundation","cx":0.19669830531017318,"cy":-0.08496072357293061,"cz":0.06,"lx":17.736587385560814,"ly":14.112977894531522,"lz":0.12,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":false,"enableGroupMaster":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Window","cx":0.1816870865194007,"cy":1.506541025906793,"cz":5.744650351161887,"lx":6.810433848205276,"ly":0.2,"lz":3.1501122272271536,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"nRJKnWqaTZMRXNYjQYBBN4","interior":true,"empty":true,"locked":false},{"type":"Window","cx":-4.204012569268376,"cy":2.9463024154168345,"cz":5.213097091560926,"lx":1.8793730345291677,"ly":0.2,"lz":0.10394989944101299,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"dyzgwSBWzQe7d2Mdh1AuFs","interior":true,"polygonTop":[-0.4945055117340491,2.9817139947018276],"empty":true,"locked":false},{"type":"Window","cx":4.5669067733435496,"cy":2.98476727058541,"cz":5.198896044572235,"lx":1.8476822467087874,"ly":0.2,"lz":0.0009475429668261212,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"uhbKNy7GzaCLkkjREuNwq9","polygonTop":[0.5,3.054344986803331],"interior":true,"empty":true,"locked":false},{"type":"Window","cx":0.13914271249375698,"cy":-1.4674024209486225,"cz":5.7431156063968745,"lx":6.808872300840532,"ly":0.2,"lz":3.162055053995225,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"fRAXriArpJwz8vt5qFbBr8","interior":true,"empty":true,"locked":false},{"type":"Window","cx":-4.236438960455537,"cy":-2.8956049895712455,"cz":5.215829810116305,"lx":1.8110462507584613,"ly":0.2,"lz":0.11218491449779774,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100747,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"d2W6C8E4fV5E9D474375zw","empty":true,"interior":true,"polygonTop":[0.4883725105977682,2.9617114188962397],"locked":false},{"type":"Window","cx":4.521733506737581,"cy":-2.9083363875263974,"cz":5.211129436754687,"lx":1.8533938312525375,"ly":0.2,"lz":0.0727447886791959,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"hZSdDLaVahbQNDSPFMa22P","polygonTop":[-0.5,2.97886505236164],"interior":true,"empty":true,"locked":false},{"type":"Window","cx":5.579385297453698,"cy":0.038450512915636725,"cz":5.156923892280704,"lx":5.893522919746983,"ly":0.2,"lz":0.06575238683701148,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.518907643929702,0,1.5707963267948963],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"whfKWvVSZ8Zpig8MXVtDnn","polygonTop":[-0.004256210920065387,2.2474023195155906],"interior":true,"empty":true,"locked":false},{"id":"hg8eUTjrNzo4UYNKSxj3Pu","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":3.810423621996117,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofType":"Gable","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["hndwqtrrygFvfqvBJrvZYu"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rise":2.3477273826368026,"ceiling":false,"locked":false},{"type":"Window","cx":-5.210239899855391,"cy":0.02428974701914899,"cz":5.199992048011484,"lx":5.892196685663338,"ly":0.2,"lz":0.03913490008238186,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.518907643929702,0,4.71238898038469],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"nSDYeeSFt1TkoA9AsVzFvv","polygonTop":[-0.006026915919198358,2.136722376968723],"interior":true,"empty":true,"locked":false},{"type":"Window","cx":0.0041783865768951906,"cy":0.3,"cz":0.7431852609403766,"lx":0.151429262766099,"ly":0.3,"lz":0.2863705218807532,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"e5r2Cqz5K28ewHbKWcFnYZ","parentType":"Wall","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"2Z4ZTK92xYT6s7pAjiT6th","locked":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.7391715106470117,"lx":0.15978603591988938,"ly":0.3,"lz":0.27834302129402333,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"11Ltx28CSTVpm6gjZuBH9w","parentType":"Wall","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"cAmpTqjyXxbvZVGVCwC6f3","locked":false}],"sceneRadius":12,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[3.13462208385991,0.12570156647960654,-6.336761576329169e-7],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[3.13462208385991,0.12470118903347407,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[12.594616653747995,-17.492939317320165,4.593155797112493],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":15.475618750000006,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.1945052133063472,0.596243023398342,1.0070484500451025],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":240,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":["Dutch gable roof"],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},454:function(e){e.exports=JSON.parse('{"docid":"iRonP6f82ihBcmjezX6Awd","time":"03/20/2023 10:32 pm","timestamp":1679365946442,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":-0.48795103908913395,"cy":4.769352133858485,"cz":2.2408122612280286,"lx":9.470897735981776,"ly":0.3,"lz":1,"leftJoints":["vKjEHsN5hVHi8S9tPzBesN"],"rightJoints":["eTKLP2TockjZDP1RLDKvpj"],"leftPoint":[4.247497828901754,4.769352133858485,0],"rightPoint":[-5.223399907080022,4.769352133858485,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"o6RrXLKTD62SEJEe7jE1pv","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":1,"rightRoofHeight":1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"centerRoofHeight":[0,9.714205250083014],"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":4.2474978289017535,"cy":0.49244353247458017,"cz":2.2301039869226305,"lx":8.55381720276781,"ly":0.3,"lz":1,"leftJoints":["gTaSzURYtieAPQn32pwAn4"],"rightJoints":["o6RrXLKTD62SEJEe7jE1pv"],"leftPoint":[4.247497828901752,-3.7844650689093244,0],"rightPoint":[4.247497828901756,4.769352133858485,0],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"vKjEHsN5hVHi8S9tPzBesN","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":1,"rightRoofHeight":1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-5.2233999070800206,"cy":0.4924435324745795,"cz":2.228839888904333,"lx":8.55381720276781,"ly":0.3,"lz":1,"leftJoints":["o6RrXLKTD62SEJEe7jE1pv"],"rightJoints":["gTaSzURYtieAPQn32pwAn4"],"leftPoint":[-5.2233999070800206,4.769352133858485,0],"rightPoint":[-5.223399907080021,-3.7844650689093258,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"eTKLP2TockjZDP1RLDKvpj","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":1,"rightRoofHeight":1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-0.48795103908913307,"cy":-3.7844650689093253,"cz":2.4372288712998555,"lx":9.470897735981776,"ly":0.3,"lz":1,"leftJoints":["eTKLP2TockjZDP1RLDKvpj"],"rightJoints":["vKjEHsN5hVHi8S9tPzBesN"],"leftPoint":[-5.223399907080021,-3.7844650689093258,0],"rightPoint":[4.247497828901755,-3.7844650689093244,0],"relativeAngle":1.4066962464272472e-16,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"gTaSzURYtieAPQn32pwAn4","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":1,"rightRoofHeight":1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"centerRoofHeight":[0,9.714205250083014],"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Foundation","cx":-0.7626979834308516,"cy":-10.359931683120488,"cz":0.05,"lx":12.251810254872597,"ly":12.332955581960839,"lz":0.1167755799390626,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"enableGroupMaster":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.3,"roofType":"Gable","roofStructure":"Default","wallsId":["eTKLP2TockjZDP1RLDKvpj"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"hV2AZhwpKM9xyypcH54NGK","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":8.714205250083014,"ceiling":false},{"type":"Human","name":"Jaye","cx":-0.5647094530410346,"cy":5.465061158668581,"cz":0.058387789875268936,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","id":"tnC2iecYMhdN7XDrxXs4UT","selected":false,"ly":0.55},{"type":"Window","cx":-0.21478352854197222,"cy":0.1,"cz":1.25,"lx":0.21478352854197222,"ly":0.3,"lz":1.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"cikc5XBeHvW1ZWaYYBURtq","windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":5,"lx":0.21478352854197222,"ly":0.3,"lz":3,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"hzyxe6XmNqQVYTMPwT86gP","windowType":"Default","archHeight":1},{"type":"Window","cx":0.21478352854197222,"cy":0.1,"cz":1.25,"lx":0.21478352854197222,"ly":0.3,"lz":1.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"poKYkVbAKiojUgyQBBM5eo","windowType":"Default","archHeight":1},{"type":"Window","cx":0.010739176427098599,"cy":0.1,"cz":4.8,"lx":0.21478352854197225,"ly":0.3,"lz":3,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"k65HqyHnfGZzC6XJ1tz5nf","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.21478352854197227,"cy":0.1,"cz":1.25,"lx":0.21478352854197227,"ly":0.3,"lz":1.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"iUS6mBnScixGHK4jiNa74q","windowType":"Default","archHeight":1},{"type":"Window","cx":0.21478352854197227,"cy":0.1,"cz":1.25,"lx":0.21478352854197227,"ly":0.3,"lz":1.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"gpSRstNVjjcombQpjx6cCS","windowType":"Default","archHeight":1},{"type":"Wall","cx":0.16127924019256784,"cy":2.332251732154486,"cz":2.2408122612280286,"lx":3.686932704592566,"ly":0.3,"lz":3.091798357527264,"leftJoints":["auhnwnZuvqZga1NwTs4Qh6"],"rightJoints":["fbEWRqBAdexGf2BAr7KyDh"],"leftPoint":[2.004745592488851,2.3322517321544853,0.09026163656372185],"rightPoint":[-1.6821871121037153,2.332251732154486,0.09026163656372185],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"kopxVibcARqNdAWExZTDft","parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"nRVwf4unMrCTvV163G9mW8","selected":false,"leftRoofHeight":4.183499794647806,"rightRoofHeight":3.091798357527264,"centerRoofHeight":[-0.5,4.183499794647806],"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.091798357527264,"rightTopPartialHeight":3.091798357527264},{"type":"Wall","cx":2.0047455924888506,"cy":0.21993436134309594,"cz":2.2301039869226305,"lx":4.224634741622781,"ly":0.3,"lz":4.183499794647806,"leftJoints":["7WK6nSdGpz8Z5ugN4DQqPL"],"rightJoints":["kopxVibcARqNdAWExZTDft"],"leftPoint":[2.0047455924888493,-1.8923830094682954,0.09026163656372185],"rightPoint":[2.004745592488852,2.3322517321544853,0.09026163656372185],"relativeAngle":1.5707963267948961,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"auhnwnZuvqZga1NwTs4Qh6","parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"nRVwf4unMrCTvV163G9mW8","selected":false,"leftRoofHeight":4.183499794647806,"rightRoofHeight":4.183499794647806,"fill":"Partial","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.5178364017567816,"rightUnfilledHeight":3.5178364017567816,"leftTopPartialHeight":4.183499794647806,"rightTopPartialHeight":4.183499794647806},{"type":"Wall","cx":-1.6821871121037146,"cy":0.2199343613430946,"cz":2.228839888904333,"lx":4.224634741622782,"ly":0.3,"lz":3.091798357527264,"leftJoints":["kopxVibcARqNdAWExZTDft"],"rightJoints":["7WK6nSdGpz8Z5ugN4DQqPL"],"leftPoint":[-1.6821871121037144,2.332251732154486,0.09026163656372185],"rightPoint":[-1.682187112103714,-1.892383009468295,0.09026163656372185],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"fbEWRqBAdexGf2BAr7KyDh","parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"nRVwf4unMrCTvV163G9mW8","selected":false,"leftRoofHeight":3.091798357527264,"rightRoofHeight":3.091798357527264,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.091798357527264,"rightTopPartialHeight":3.091798357527264},{"type":"Wall","cx":0.16127924019256823,"cy":-1.8923830094682952,"cz":2.4372288712998555,"lx":3.686932704592566,"ly":0.3,"lz":3.091798357527264,"leftJoints":["fbEWRqBAdexGf2BAr7KyDh"],"rightJoints":["auhnwnZuvqZga1NwTs4Qh6"],"leftPoint":[-1.682187112103714,-1.892383009468295,0.09026163656372185],"rightPoint":[2.004745592488851,-1.8923830094682954,0.09026163656372185],"relativeAngle":1.8067425368120646e-16,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"7WK6nSdGpz8Z5ugN4DQqPL","parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"nRVwf4unMrCTvV163G9mW8","selected":false,"leftRoofHeight":3.091798357527264,"rightRoofHeight":4.183499794647806,"centerRoofHeight":[0.5,4.183499794647806],"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.091798357527264,"rightTopPartialHeight":3.091798357527264},{"type":"Foundation","cx":4.882244941296917,"cy":-10.70091032804037,"cz":0.05,"lx":5.471984286386839,"ly":6.044552967256032,"lz":0.09026163656372185,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"oabGyAr3D6hSmpBhWPDGqF","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","roofStructure":"Default","wallsId":["fbEWRqBAdexGf2BAr7KyDh"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","id":"nRVwf4unMrCTvV163G9mW8","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"rise":0,"ceiling":false},{"type":"Door","cx":-0.01183534271196981,"cy":0,"cz":-0.15296909264162628,"lx":0.4024016522069765,"ly":0,"lz":0.6940618147167474,"textureType":"Door Texture #2","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbEWRqBAdexGf2BAr7KyDh","foundationId":"oabGyAr3D6hSmpBhWPDGqF","id":"nthEKWrtxGs4PSrCWi5GEG","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0.27122816718470794,"cy":0.1,"cz":0,"lx":0.27122816718470794,"ly":0.3,"lz":0.6468727157224915,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kopxVibcARqNdAWExZTDft","foundationId":"oabGyAr3D6hSmpBhWPDGqF","id":"wKDeRMv3UEU8mXGaoDUiWs","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27122816718470794,"cy":0.1,"cz":0,"lx":0.27122816718470794,"ly":0.3,"lz":0.6468727157224915,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7WK6nSdGpz8Z5ugN4DQqPL","foundationId":"oabGyAr3D6hSmpBhWPDGqF","id":"42U3kN4qWYuxhLNDbwxXrd","windowType":"Default","archHeight":1}],"sceneRadius":21,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.6516049999999995,-8.063611874995965,-0.00000806397029662998],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.6516049999999995,-8.063761881663362,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[13.842271241738974,-28.65293514275273,4.026963629011761],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":37.01235612443423,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-1.977021416592465,-10.783837041816236,3.5213876845072543],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["A-frame house"]}')},455:function(e){e.exports=JSON.parse('{"docid":"bm2bMMbAcph5HBEqZHjndk","time":"03/20/2023 11:03 am","timestamp":1679324587911,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":0.016921335908854303,"cy":4.063374076185866,"cz":2.2408122612280286,"lx":9.470897735981776,"ly":0.3,"lz":8,"leftJoints":["vKjEHsN5hVHi8S9tPzBesN"],"rightJoints":["eTKLP2TockjZDP1RLDKvpj"],"leftPoint":[4.752370203899743,4.063374076185865,0.1167755799390626],"rightPoint":[-4.718527532082034,4.063374076185867,0.1167755799390626],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffd99a","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"o6RrXLKTD62SEJEe7jE1pv","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"centerRoofHeight":[0,14],"fill":"Full","eavesLength":0.5,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":4.752370203899742,"cy":-0.2135345251980382,"cz":2.2301039869226305,"lx":8.55381720276781,"ly":0.3,"lz":8,"leftJoints":["gTaSzURYtieAPQn32pwAn4"],"rightJoints":["o6RrXLKTD62SEJEe7jE1pv"],"leftPoint":[4.75237020389974,-4.490443126581943,0.1167755799390626],"rightPoint":[4.752370203899745,4.063374076185865,0.1167755799390626],"relativeAngle":1.5707963267948961,"textureType":"No Wall Texture","color":"#ffd99a","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"vKjEHsN5hVHi8S9tPzBesN","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-4.718527532082032,"cy":-0.2135345251980388,"cz":2.228839888904333,"lx":8.55381720276781,"ly":0.3,"lz":8,"leftJoints":["o6RrXLKTD62SEJEe7jE1pv"],"rightJoints":["gTaSzURYtieAPQn32pwAn4"],"leftPoint":[-4.718527532082033,4.063374076185867,0.1167755799390626],"rightPoint":[-4.718527532082033,-4.490443126581945,0.1167755799390626],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#ffd99a","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"eTKLP2TockjZDP1RLDKvpj","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":0.016921335908855254,"cy":-4.490443126581944,"cz":2.4372288712998555,"lx":9.470897735981776,"ly":0.3,"lz":8,"leftJoints":["eTKLP2TockjZDP1RLDKvpj"],"rightJoints":["vKjEHsN5hVHi8S9tPzBesN"],"leftPoint":[-4.718527532082033,-4.490443126581945,0.1167755799390626],"rightPoint":[4.752370203899743,-4.490443126581943,0.1167755799390626],"relativeAngle":1.4066962464272472e-16,"textureType":"No Wall Texture","color":"#ffd99a","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"gTaSzURYtieAPQn32pwAn4","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"centerRoofHeight":[0,14],"fill":"Full","eavesLength":0.5,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Foundation","cx":0.06778462234397686,"cy":0.11229032412929119,"cz":0.05,"lx":13.261555004868576,"ly":13.821828446550082,"lz":0.1167755799390626,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"enableGroupMaster":true,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.3,"roofType":"Gable","roofStructure":"Default","wallsId":["eTKLP2TockjZDP1RLDKvpj"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"hV2AZhwpKM9xyypcH54NGK","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":6,"ceiling":false,"sideColor":"#4d4d4d","locked":true},{"type":"Human","name":"Jaye","cx":-5.524403634250389,"cy":5.933912667936443,"cz":0.058387789875268936,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","id":"tnC2iecYMhdN7XDrxXs4UT","selected":false,"ly":0.55,"locked":true},{"type":"Polygon","cx":0.00031866172024926434,"cy":-1.0502280057835613,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":0.00006828465433912113,"y":-0.982449115782449},{"x":0,"y":-1.25},{"x":0,"y":-0.875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"filled":true,"selectedIndex":2,"id":"xmTq7nGfL5qqQp8gvXDYM6","lineColor":"#4d4d4d","lineWidth":2,"locked":true},{"type":"Polygon","cx":0.14078214869407168,"cy":-0.7541666666666667,"cz":0.6437310349973828,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.26396652880138444,"y":-0.875},{"x":0,"y":-0.875},{"x":0.15837991728083065,"y":-0.5125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"kxt6Srxx1T2g9dM5Cj9xjQ","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.09047767660927532,"cy":-5.921189464667502e-15,"cz":0.6771072607245675,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0,"y":-0.875},{"x":-0.26396652880138444,"y":-0.875},{"x":-0.15837991728083065,"y":-0.5125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"oepTS5ZaT38ze93aEUFXCf","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.3273184957137167,"cy":-0.35,"cz":-0.1473145782594516,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.49625707414660275,"y":-0.5},{"x":0.15837991728083065,"y":-0.5},{"x":0.15837991728083065,"y":-0.1875},{"x":0.49625707414660275,"y":-0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"6GCp4VpMJ4zaYZryasBb12","selected":false,"selectedIndex":1,"locked":true},{"type":"Window","cx":0,"cy":0.3,"cz":0.35,"lx":0.21117322304110756,"ly":0.3,"lz":0.24999999999999994,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":0.8499999999999999,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"cPiRHW6SZVJYmoL6piX4rh","locked":true},{"type":"Window","cx":-0.322039165137689,"cy":0.3,"cz":0.35,"lx":0.26396652880138444,"ly":0.3,"lz":0.25,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"oKk1wpnrjFtx7ZScLUWdKG","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3257820909910863,"cy":0.3,"cz":0.35000000000000003,"lx":0.26396652880138444,"ly":0.3,"lz":0.24999999999999994,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"vm61bCHu5wJTneq9mSRG3v","locked":true},{"type":"Polygon","cx":-0.32731849571371674,"cy":-0.34375,"cz":0.07091220488250127,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15837991728083065,"y":-0.5},{"x":-0.49625707414660275,"y":-0.5},{"x":-0.49625707414660275,"y":-0.1875},{"x":-0.15837991728083065,"y":-0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"a2uJiAM1SwWygA7Xks25tx","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.009700144501707204,"cy":0,"cz":0.07091220488250127,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.15837991728083065,"y":-0.5},{"x":-0.15837991728083065,"y":-0.5},{"x":-0.15837991728083065,"y":-0.1875},{"x":0.15837991728083065,"y":-0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"okpxRdBH9UmPzQeBnPqHvV","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.43994421466897404,"cy":-0.10416666666666667,"cz":-0.0908057613542031,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.47513975184249196,"y":-0.125},{"x":0.4223464460822151,"y":-0.125},{"x":0.47513975184249196,"y":-0.0625}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"gnnDsq9utfqbvsSLW4Vsui","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.31675983456166135,"cy":-0.10416666666666667,"cz":-0.0908057613542031,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.4223464460822151,"y":-0.125},{"x":0.3167598345616613,"y":-0.125},{"x":0.3695531403219382,"y":-0.0625}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"daBi7jdbhLYUKfawDVZbRF","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.26396652880138444,"cy":-0.14583333333333334,"cz":0.09889005465479705,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.3167598345616613,"y":-0.125},{"x":0.26396652880138444,"y":-0.1875},{"x":0.21117322304110756,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"83Jx4Wfx1CTQe5o1dVj7Gt","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":-0.31823715865388064,"cy":0,"cz":-0.06254223609465975,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.4223464460822151,"y":-0.125},{"x":0.3695531403219382,"y":-0.1875},{"x":0.3167598345616613,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"2P1Z36zj1PZrLZ5WtCuQLU","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":-0.1528231574478215,"cy":0,"cz":-0.07973264486359,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.47513975184249196,"y":-0.1875},{"x":0.4223464460822151,"y":-0.125},{"x":0.47513975184249196,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"c8iKMXwV5TTJS5y7LAm16z","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.26396652880138444,"cy":-0.10416666666666667,"cz":-0.0264570438192977,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.3167598345616613,"y":-0.125},{"x":0.26396652880138444,"y":-0.0625},{"x":0.21117322304110756,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"4EQtRFUvGwquz82cAGupQx","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":-0.0984129795658402,"cy":0,"cz":0.0741183552861776,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.21117322304110756,"y":-0.125},{"x":0.15837991728083065,"y":-0.1875},{"x":0.10558661152055378,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"keytXy7yjTuyQvCHx43FMf","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":-0.08043767629130923,"cy":-1.1842378929335004e-14,"cz":0.053462400842831936,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.15837991728083065,"y":-0.0625},{"x":0.21117322304110756,"y":-0.125},{"x":0.10558661152055378,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"vcfgXdnGFRF224UmF7C68T","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.05586281472424893,"cy":0,"cz":-0.06415089633102461,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.10558661152055378,"y":-0.125},{"x":0.05279330576027689,"y":-0.1875},{"x":0,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"6L9YHg5xYnPV5wP7pRzMPQ","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.04508436921887703,"cy":-1.1842378929335004e-14,"cz":-0.07958364344414548,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.10558661152055378,"y":-0.125},{"x":0.05279330576027689,"y":-0.0625},{"x":0,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"vFWJZ8BRQAYJsb48YWUz6j","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.12944043805698166,"cy":0,"cz":-0.044015079009130986,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0,"y":-0.125},{"x":-0.05279330576027689,"y":-0.1875},{"x":-0.10558661152055378,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"c9pAfjjQXFGB9FrY3fPcgo","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.1360791344719124,"cy":0,"cz":-0.002668588802964056,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.05279330576027689,"y":-0.0625},{"x":0,"y":-0.125},{"x":-0.10558661152055378,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8hMi9wi8eWGAVCFdCrrHxf","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.1504887203711347,"cy":1.1842378929335004e-14,"cz":-0.03387070431424388,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.10558661152055378,"y":-0.125},{"x":-0.15837991728083065,"y":-0.1875},{"x":-0.21117322304110756,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"1vmj7VNyMLhdjUdvzKBed1","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.2027600334109868,"cy":1.1842378929335004e-14,"cz":-0.02143305207869428,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15837991728083065,"y":-0.0625},{"x":-0.10558661152055378,"y":-0.125},{"x":-0.21117322304110756,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"ffiDmHRPrs2dDPEPn4TWqL","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.3241256214430625,"cy":-1.1842378929335004e-14,"cz":-0.01780218811727341,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.21117322304110756,"y":-0.125},{"x":-0.26396652880138444,"y":-0.1875},{"x":-0.3167598345616613,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"wcidSWb2sESnViCDPV9mWc","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.25617993668706274,"cy":0,"cz":-0.01786081434302994,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.21117322304110756,"y":-0.125},{"x":-0.26396652880138444,"y":-0.0625},{"x":-0.3167598345616613,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"feb2PRU5xBgnQQYi5Q5HxG","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.15105849038732078,"cy":0,"cz":-0.11142936913498758,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.3167598345616613,"y":-0.125},{"x":-0.3695531403219382,"y":-0.1875},{"x":-0.4223464460822151,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8YCxSmg5F51AUWFz5Z7Mcz","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.2903850025394723,"cy":0,"cz":-0.05931035952397312,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.3167598345616613,"y":-0.125},{"x":-0.4223464460822151,"y":-0.125},{"x":-0.3695531403219382,"y":-0.0625}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"br3QNNryqRA4C5JyMif58B","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.2709208200589227,"cy":0,"cz":-0.12433060024345055,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.4223464460822151,"y":-0.125},{"x":-0.47513975184249196,"y":-0.125},{"x":-0.47513975184249196,"y":-0.0625}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"qua38i78SB79351oS944na","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.26414949628329426,"cy":0,"cz":-0.11662195581661955,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.4223464460822151,"y":-0.125},{"x":-0.47513975184249196,"y":-0.1875},{"x":-0.47513975184249196,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"vmDWdbEKBTn6Q3L3pv8qqU","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":-0.1231126961021224,"cy":0,"cz":-0.16413364186630847,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.4968716360356549,"y":0.1875},{"x":0.4968716360356549,"y":-0.0625},{"x":0.15899447916988277,"y":-0.0625},{"x":0.15899447916988277,"y":0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8PUhoaNcXfpHS24ebeEAKM","selected":false,"selectedIndex":3,"locked":true},{"type":"Polygon","cx":0.17939465541008254,"cy":1.1842378929335004e-14,"cz":-0.09134585167481035,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.15837991728083065,"y":0.1875},{"x":0.15837991728083065,"y":-0.0625},{"x":-0.15837991728083065,"y":-0.0625},{"x":-0.15837991728083065,"y":0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"bcXX5tcf3D2wVveoEkcL6f","selected":false,"selectedIndex":3,"locked":true},{"type":"Polygon","cx":0.27093529163208646,"cy":0,"cz":-0.23361707380435942,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15837991728083065,"y":0.1875},{"x":-0.15837991728083065,"y":-0.0625},{"x":-0.49625707414660275,"y":-0.0625},{"x":-0.49625707414660275,"y":0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"6s38KEz9j6GBtEC98qn52U","selected":false,"selectedIndex":3,"locked":true},{"type":"Window","cx":-0.32016770221099033,"cy":0.3,"cz":-0.05625,"lx":0.2677094546547817,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"o7JmF1iLCdGFdtbRj8czNQ","locked":true},{"type":"Window","cx":0.005279330576027693,"cy":0.3,"cz":-0.056249999999999994,"lx":0.22173188419316292,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"gnKEFjjyTpc69CbNkzsSnb","locked":true},{"type":"Window","cx":0.33106142156711393,"cy":0.3,"cz":-0.05624999999999997,"lx":0.25340786764932904,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"itZnbX7dvNW4uttWy8xqNF","locked":true},{"type":"Polygon","cx":0.3273184957137167,"cy":0.2791666666666667,"cz":-0.3574546006707193,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.49625707414660275,"y":0.225},{"x":0.3273184957137167,"y":0.3625},{"x":0.15837991728083065,"y":0.225}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"eM6FR2jokXDXXNuqEbWW5t","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.3273184957137167,"cy":0.45416666666666666,"cz":-0.38841568779580643,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.32793305760276886,"y":0.35833333333333334},{"x":0.15899447916988282,"y":0.49583333333333335},{"x":0.49687163603565493,"y":0.49583333333333335}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"xbCXMjDGmXXmNhu45xKrKU","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.02549879326087855,"cy":-1.1842378929335004e-14,"cz":-0.30729230835255206,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.15837991728083065,"y":0.225},{"x":0,"y":0.3625},{"x":-0.15837991728083065,"y":0.225}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"5HQ6TVrPFFjZ9n9pMNCaPw","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.17764937225875113,"cy":1.1842378929335004e-14,"cz":-0.38532011935953503,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15837991728083065,"y":0.225},{"x":-0.32670393382466456,"y":0.35833333333333334},{"x":-0.49625707414660275,"y":0.225}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"6xMKYrX7YfEEQhYDvJGbXj","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.028297592880302983,"cy":0,"cz":-0.4292130777977021,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.32670393382466456,"y":0.35833333333333334},{"x":-0.4956425122575506,"y":0.49583333333333335},{"x":-0.1577653553917785,"y":0.49583333333333335}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"aC5hTZ2mJqEmuJzedm4MJc","selected":false,"locked":true},{"type":"Polygon","cx":-0.0752822112279152,"cy":0,"cz":-0.43162058966296696,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0,"y":0.3625},{"x":-0.14782125612877528,"y":0.5},{"x":0.15899447916988285,"y":0.49583333333333335}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"g4vxfHB2tWhootScoBEJAy","selected":false,"selectedIndex":0,"locked":true},{"type":"Window","cx":-0.15837991728083065,"cy":0.3,"cz":-0.36250000000000004,"lx":0.08446928921644303,"ly":0.3,"lz":0.10000000000000003,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"aTgEN9mCRYp5yq7d1z5C9J","locked":true},{"type":"Window","cx":0.16893857843288604,"cy":0.3,"cz":-0.3625,"lx":0.08446928921644302,"ly":0.3,"lz":0.09999999999999998,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"iJhjRtnwcwPom4AbAof7TY","locked":true},{"type":"Window","cx":0,"cy":0.3,"cz":0.625,"lx":0.10558661152055378,"ly":0.3,"lz":0.125,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"eM9DBHVTV9qvEYGB1GSGT4","locked":true},{"type":"Window","cx":-0.2850838511054952,"cy":0.3,"cz":0.625,"lx":0.10558661152055378,"ly":0.3,"lz":0.125,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"xktqPqwH68DsLhhed5NdpJ","locked":true},{"type":"Window","cx":0.3167598345616613,"cy":0.3,"cz":0.625,"lx":0.10558661152055378,"ly":0.3,"lz":0.125,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"smfVPdpD4AJjru3d9qbPFB","locked":true},{"type":"Polygon","cx":0.33203141791512314,"cy":-0.34064625850340136,"cz":0.0816606073539844,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.5026995431476631,"y":-0.4875},{"x":0.16366961869923916,"y":-0.5},{"x":0.16366961869923916,"y":-0.1875},{"x":0.5026995431476631,"y":-0.1875}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"7P3jamWRpmTThzKQQchxem","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.08095645236308847,"cy":1.1472304587793285e-14,"cz":0.024081550771485216,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.11690687049945654,"y":-0.4875},{"x":-0.15197893164929352,"y":-0.4875},{"x":-0.15197893164929352,"y":-0.1875},{"x":0.11690687049945654,"y":-0.1875}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"hti4VWVrfMLPFRbMnZuXCh","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":-0.06332927122552619,"cy":3.7007434154171886e-16,"cz":0.11866929892518252,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.19874167984907612,"y":-0.5},{"x":-0.49524132235097623,"y":-0.4844583756672448},{"x":-0.4910088560977175,"y":-0.1875},{"x":-0.19874167984907612,"y":-0.1875}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"fK55YfVyK24HbKmqkoFvX8","selected":false,"selectedIndex":0,"locked":true},{"type":"Window","cx":-0.3273392373984783,"cy":0.3,"cz":0.34375,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"7uoagXVHHDZRJe6yfz87Uy","locked":true},{"type":"Window","cx":0.02338137409989131,"cy":0.3,"cz":0.34375,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"2eFNdjG8a6PPPeWCyHvJZF","locked":true},{"type":"Window","cx":0.3435254963995652,"cy":0.3,"cz":0.34375,"lx":0.10251664030184776,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"pVvTiVPrSp7DHLhNTLPbpw","locked":true},{"type":"Polygon","cx":0.11417019715816792,"cy":-0.03691339676553812,"cz":-0.01732802673536704,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.334513812493377,"y":-0.1887668131742859},{"x":0.11690687049945654,"y":-0.1875},{"x":0,"y":0.2},{"x":0.5026995431476631,"y":0.2}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"ncvU41deRZgttbWEevak9W","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.23813144459901245,"cy":-1.2582527612418442e-14,"cz":-0.15608783217541283,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15197893164929352,"y":-0.1875},{"x":-0.33902992444842395,"y":-0.1875},{"x":-0.5026995431476631,"y":0.2},{"x":-0.011690687049945655,"y":0.2}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"nUnv6wAVCPmYj3Aresrcpk","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":-0.13062766511807228,"cy":-2.590520390792032e-15,"cz":-0.22842446371425668,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.49818343119261616,"y":0.1987331868257141},{"x":0.15301751728589502,"y":0.20325890158694568},{"x":0.15345728483965818,"y":0.49941339676553814},{"x":0.49818343119261616,"y":0.49873318682571405}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8Kz8otpe54cGwNRpjbBHbb","selected":false,"locked":true},{"type":"Polygon","cx":0.08870702581035714,"cy":1.1657341758564144e-14,"cz":-0.3327175444793864,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.1564950436043405,"y":0.19873318682571411},{"x":-0.5016609575110615,"y":0.2032589015869457},{"x":-0.5012211899572985,"y":0.49941339676553814},{"x":-0.1564950436043405,"y":0.4987331868257141}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"wG7R1sDD8K7WPRvoZtoyJw","selected":false,"locked":true},{"type":"Window","cx":-0.23381374099891308,"cy":0.3,"cz":0.0062500000000000056,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"pHH5nsCFYVbtKpFCrTf3Ws","locked":true},{"type":"Window","cx":0.25134977157383154,"cy":0.3,"cz":0.0062500000000000056,"lx":0.1285975575494022,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"cwAvtz8KzMtAWzktGpFNXr","locked":true},{"type":"Polygon","cx":0.3974833596981522,"cy":-0.3,"cz":0.15250947773144075,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.5026995431476631,"y":-0.4875},{"x":0.29226717624864135,"y":-0.4875},{"x":0.29226717624864135,"y":-0.1125},{"x":0.5026995431476631,"y":-0.1125}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"h2haDNadyPJVsXHUBM7goT","selected":false,"selectedIndex":2,"locked":false},{"type":"Polygon","cx":0.2062582639639952,"cy":0,"cz":0.09819258432246669,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.29352549639956527,"y":-0.4875},{"x":-0.503957863298587,"y":-0.4875},{"x":-0.503957863298587,"y":-0.1125},{"x":-0.29352549639956527,"y":-0.1125}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"qNhdQA6nMEubq6HrA8GQ56","selected":false},{"type":"Polygon","cx":-0.00041944005030796134,"cy":-0.2375,"cz":0.11572778700091202,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.001258320150923864,"y":-0.4875},{"x":-0.29226717624864135,"y":-0.1125},{"x":0,"y":-0.1125},{"x":0.29226717624864135,"y":-0.1125}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"7xfb1T386qUxDL13U5ur56","selected":false,"selectedIndex":2},{"type":"Window","cx":0,"cy":0.3,"cz":0.25625,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,-1,0],"rotation":[0,0,0],"id":"61722s3ZSQeHug5MRWQdpi","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3947838165504891,"cy":0.3,"cz":0.25625,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,-1,0],"rotation":[0,0,0],"id":"16SX2hn6bjPsYFGUZ6H1HJ","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3947838165504891,"cy":0.3,"cz":0.25625,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,-1,0],"rotation":[0,0,0],"id":"rxzF9abntmscS3LgzGNTHv","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Polygon","cx":0.26762748199782616,"cy":0.07499999999999998,"cz":-0.20483915447539497,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.4137610701221468,"y":-0.10625000000000001},{"x":0.12149389387350548,"y":-0.10625000000000001},{"x":0.12149389387350548,"y":0.25625},{"x":0.4137610701221468,"y":0.25625}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"4a4kmf2AVjLH4xqmTBj5qm","selected":false,"selectedIndex":3},{"type":"Polygon","cx":0.2640836675523676,"cy":0,"cz":-0.07455503736820074,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.1357012212252989,"y":-0.10625000000000001},{"x":-0.4279683974739402,"y":-0.10625000000000001},{"x":-0.4279683974739402,"y":0.25625},{"x":-0.1357012212252989,"y":0.25625}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"nzNaoQaRpK6d7hEi9ZXqqA","selected":false},{"type":"Polygon","cx":-0.00800080807265061,"cy":-3.076242964065538e-15,"cz":-0.3451540701116582,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.5026995431476631,"y":0.2625},{"x":-0.49994974836164874,"y":0.2579458713508321},{"x":-0.49994974836164874,"y":0.49544587135083207},{"x":0.5026995431476631,"y":0.5}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"eVuLrSaB1RiWnm1kdJDxE3","selected":false,"selectedIndex":3},{"type":"Window","cx":-0.25719511509880444,"cy":0.3,"cz":-0.06875,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"srgUpVRNxrAgJWbybn588q","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.29226717624864135,"cy":0.3,"cz":-0.06875,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"98pLU7aQ4axthpXWXa3LR2","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Polygon","cx":0.004459000607667748,"cy":5.782411586589357e-17,"cz":-0.07786416501615101,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.25719511509880444,"y":0.2625},{"x":-0.29226717624864135,"y":0.2625},{"x":-0.29226717624864135,"y":0.5},{"x":0.25719511509880444,"y":0.5}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"oMeHBYv8MZowW2UjWYNbTs","selected":false,"selectedIndex":3}],"sceneRadius":18,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.5736443737686907,-8.024644919181295,-0.000008025001608758962],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.5736443737686907,-8.024794925856764,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[10.811404848456696,-24.22563598939458,8.16030935368929],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[2.4887069683147542,-4.392139935230605,6.944093833347563],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["A half-timbered house"]}')},456:function(e){e.exports=JSON.parse('{"docid":"u6V16ot91aBGkUfNPgtKBw","time":"06/13/2023 10:40 am","timestamp":1686667251444,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.3,"date":"4/22/2022, 1:30:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"John","cx":-3.628595765451405,"cy":-5.965837088553536,"cz":0.075,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","id":"qPhtowBuGGDfEAuEFNhxwt","selected":false,"locked":false},{"type":"Wall","cx":0.10471070913816627,"cy":6.876571226527738,"cz":2.2408122612280286,"lx":13.774073361922072,"ly":0.3,"lz":4.1,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[6.991747390099202,6.876571226527738,0.1],"rightPoint":[-6.78232597182287,6.876571226527738,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"leftRoofHeight":4.1,"rightRoofHeight":4.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.0625,"lx":0.0708994221944815,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":6.991747390099202,"cy":1.3532362351510367,"cz":2.2301039869226305,"lx":11.046669982753404,"ly":0.3,"lz":4.1,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[6.9917473900992,-4.1700987562256655,0.1],"rightPoint":[6.991747390099204,6.876571226527738,0.1],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"leftRoofHeight":4.1,"rightRoofHeight":4.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":-6.782325971822869,"cy":1.3532362351510367,"cz":2.228839888904333,"lx":11.046669982753404,"ly":0.3,"lz":4.1,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-6.782325971822869,6.876571226527738,0.1],"rightPoint":[-6.78232597182287,-4.1700987562256655,0.1],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"leftRoofHeight":4.1,"rightRoofHeight":4.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.0625,"lx":0.09052501808791685,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":0.10471070913816716,"cy":-4.1700987562256655,"cz":2.268765007024547,"lx":13.774073361922074,"ly":0.3,"lz":4.1,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-6.78232597182287,-4.1700987562256655,0.1],"rightPoint":[6.991747390099204,-4.1700987562256655,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"leftRoofHeight":4.1,"rightRoofHeight":4.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.3993009079801005,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729113,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"29QuQvndX2M7Sq4iEkq1Xz","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.25410057780551853,"cy":0.1,"cz":-0.062499999999999944,"lx":0.072600165087291,"ly":0.3,"lz":0.3749999999999999,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4LUVPCUMNMxJkqRL8wFtEe","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.217800495261873,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"9FGAjvvq6tsggdPdWysCTK","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ucbeQgKEoSy9dHSmSFvaic","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":-0.02203325078968787,"cy":0,"cz":-0.1875,"lx":0.18926683175395775,"ly":0,"lz":0.625,"color":"white","textureType":"Door Texture #7","normal":[0,1,0],"rotation":[0,0,0],"id":"wzic8VHyh9MpPw339UYDy4","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"doorType":"Default","archHeight":1,"filled":true,"locked":false},{"id":"22qg2ZvB7t4cVkS2ppWUue","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["roDDPncXBpNgmNum9aUaov"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":2,"ceiling":false,"locked":false},{"type":"Foundation","cx":-11.627490246197299,"cy":0.3947804481181869,"cz":0.075,"lx":19.77405921718084,"ly":14.655745561697936,"lz":0.15,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":false,"enableGroupMaster":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Foundation","cx":-11.621608440780687,"cy":1.9572753540307968,"cz":0.05,"lx":16.830274696272348,"ly":15.08817119873108,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1hsdTDJQtP791cvdCX88pM","selected":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":false},{"type":"Wall","cx":0.08541275905423218,"cy":3.142987766593968,"cz":2.2408122612280286,"lx":10.982816484532037,"ly":0.3,"lz":5.1,"leftJoints":["oqmTcCR15WVtwsqrWdL4GC"],"rightJoints":["1pdrgHKxCmzDRjbnSqoG6g"],"leftPoint":[5.57682100132025,3.142987766593967,0],"rightPoint":[-5.405995483211786,3.142987766593969,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pbycx2vwYmMhSjRe9GEQ9K","parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","selected":false,"roofId":"1ruH3RPfFc3ThJYcd2omkK","leftRoofHeight":5.1,"rightRoofHeight":5.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.423886716391337,"rightUnfilledHeight":4.423886716391337,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Wall","cx":5.576821001320248,"cy":-0.20560385518737068,"cz":2.2301039869226305,"lx":6.697183243562679,"ly":0.3,"lz":5.1,"leftJoints":["gCfAqTHxYsKYYxNWYw9TWQ"],"rightJoints":["pbycx2vwYmMhSjRe9GEQ9K"],"leftPoint":[5.576821001320245,-3.5541954769687103,0],"rightPoint":[5.57682100132025,3.142987766593969,0],"relativeAngle":1.570796326794896,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oqmTcCR15WVtwsqrWdL4GC","parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","selected":false,"roofId":"1ruH3RPfFc3ThJYcd2omkK","leftRoofHeight":5.1,"rightRoofHeight":5.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.137593329953601,"rightUnfilledHeight":4.137593329953601,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Wall","cx":-5.405995483211786,"cy":-0.20560385518737068,"cz":2.228839888904333,"lx":6.697183243562679,"ly":0.3,"lz":5.1,"leftJoints":["pbycx2vwYmMhSjRe9GEQ9K"],"rightJoints":["gCfAqTHxYsKYYxNWYw9TWQ"],"leftPoint":[-5.405995483211786,3.142987766593969,0],"rightPoint":[-5.405995483211786,-3.5541954769687103,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1pdrgHKxCmzDRjbnSqoG6g","parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","selected":false,"roofId":"1ruH3RPfFc3ThJYcd2omkK","leftRoofHeight":5.1,"rightRoofHeight":5.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.005808068482516,"rightUnfilledHeight":4.005808068482516,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Wall","cx":0.08541275905423218,"cy":-3.5541954769687103,"cz":2.268765007024547,"lx":10.982816484532037,"ly":0.3,"lz":5.1,"leftJoints":["1pdrgHKxCmzDRjbnSqoG6g"],"rightJoints":["oqmTcCR15WVtwsqrWdL4GC"],"leftPoint":[-5.405995483211786,-3.5541954769687103,0],"rightPoint":[5.57682100132025,-3.5541954769687103,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gCfAqTHxYsKYYxNWYw9TWQ","parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","selected":false,"roofId":"1ruH3RPfFc3ThJYcd2omkK","leftRoofHeight":5.1,"rightRoofHeight":5.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.950942062075448,"rightUnfilledHeight":3.950942062075448,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","roofStructure":"Default","wallsId":["pbycx2vwYmMhSjRe9GEQ9K"],"textureType":"Roof Texture #2","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","id":"1ruH3RPfFc3ThJYcd2omkK","leftRidgeLength":3.201607189072456,"rightRidgeLength":3.144275873016056,"rise":3.3,"ceiling":false,"locked":false},{"type":"Human","name":"Jett","cx":3.45311660764904,"cy":-5.539983726654682,"cz":0,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"ngMWYAz5cg4LmcZtkKGH5w","selected":false,"locked":false},{"type":"Wall","cx":-0.5646884076429224,"cy":5.154362868463492,"cz":2.2408122612280286,"lx":12.155877698025375,"ly":0.3,"lz":4,"leftJoints":["63yNZT5sk98atsFEx8NvNs"],"rightJoints":["jQsmtVwKhe4n3CrR6jXs3q"],"leftPoint":[5.513250441369763,5.154362868463492,0.15],"rightPoint":[-6.642627256655608,5.154362868463492,0.15],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mzpK9wLgMhYvSmDqWB4w5a","parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofId":"4gpAeqULbxkTE3NVbw47eo","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.06250000000000006,"lx":0.0708994221944815,"ly":0.3,"lz":0.3750000000000001,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4wXNeeycaqHL9B1R9qUX1E","parentId":"mzpK9wLgMhYvSmDqWB4w5a","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729104,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"mt3NkwPRVR29Vv4nC9yzZx","parentId":"mzpK9wLgMhYvSmDqWB4w5a","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"a4kNY3m4aqY6M343x3uLZh","parentId":"mzpK9wLgMhYvSmDqWB4w5a","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":5.513250441369763,"cy":0.8650317721032894,"cz":2.2301039869226305,"lx":8.578662192720406,"ly":0.3,"lz":4,"leftJoints":["7AAP4SGnSJct2FC9Zr7dc4"],"rightJoints":["mzpK9wLgMhYvSmDqWB4w5a"],"leftPoint":[5.513250441369756,-3.424299324256914,0.15],"rightPoint":[5.513250441369763,5.154362868463492,0.15],"relativeAngle":1.570796326794896,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"63yNZT5sk98atsFEx8NvNs","parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofId":"4gpAeqULbxkTE3NVbw47eo","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jbtNFjUNQaHTwUPP6Cgyx7","parentId":"63yNZT5sk98atsFEx8NvNs","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ig1Epmrjnd2PJxhzkNaQVQ","parentId":"63yNZT5sk98atsFEx8NvNs","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"f3BCsz5GQBEYy4XiqRBqZE","parentId":"63yNZT5sk98atsFEx8NvNs","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":-6.642627256655608,"cy":0.8650317721032894,"cz":2.228839888904333,"lx":8.578662192720406,"ly":0.3,"lz":4,"leftJoints":["mzpK9wLgMhYvSmDqWB4w5a"],"rightJoints":["7AAP4SGnSJct2FC9Zr7dc4"],"leftPoint":[-6.642627256655608,5.154362868463492,0.15],"rightPoint":[-6.642627256655608,-3.424299324256914,0.15],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jQsmtVwKhe4n3CrR6jXs3q","parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofId":"4gpAeqULbxkTE3NVbw47eo","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"cWeaG9uSw8kJfhXamtKBxr","parentId":"jQsmtVwKhe4n3CrR6jXs3q","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"nxekbBrmyzGrPUF9ezKfwT","parentId":"jQsmtVwKhe4n3CrR6jXs3q","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"e67VWqxp9LA175MVc6hEpX","parentId":"jQsmtVwKhe4n3CrR6jXs3q","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":-0.5646884076429224,"cy":-3.424299324256914,"cz":2.268765007024547,"lx":12.155877698025375,"ly":0.3,"lz":4,"leftJoints":["jQsmtVwKhe4n3CrR6jXs3q"],"rightJoints":["63yNZT5sk98atsFEx8NvNs"],"leftPoint":[-6.642627256655608,-3.424299324256914,0.15],"rightPoint":[5.513250441369763,-3.424299324256914,0.15],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7AAP4SGnSJct2FC9Zr7dc4","parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofId":"4gpAeqULbxkTE3NVbw47eo","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.39930090798010054,"cy":0.1,"cz":-0.0484624485645839,"lx":0.072600165087291,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"3CK46FAqDU4yiw68e68gyB","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.21716749210312172,"cy":0.1,"cz":-0.0484624485645839,"lx":0.0738661714047936,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"b4tHm9uwSzreh4oUqoA1iA","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25410057780551853,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"i6yCtjaey6bF3bxgioyozq","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":-0.06249999999999989,"lx":0.072600165087291,"ly":0.3,"lz":0.3749999999999998,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jfHaiksBWSL7KRtRUTCNe2","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":0.02056618256702364,"cy":0,"cz":-0.1875,"lx":0.2056618256702355,"ly":0,"lz":0.625,"color":"white","textureType":"Door Texture #7","normal":[0,1,0],"rotation":[0,0,0],"id":"srJTCNtCygPjzCukKAxRUa","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","selected":false,"doorType":"Default","archHeight":1,"filled":true,"locked":false},{"id":"4gpAeqULbxkTE3NVbw47eo","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["7AAP4SGnSJct2FC9Zr7dc4"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":3.3,"ceiling":false,"locked":false},{"type":"Foundation","cx":12.400385994458517,"cy":1.2287983710659756,"cz":0.075,"lx":14.955401155218322,"ly":11.516608009620233,"lz":0.15,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"oWDryEiqPVRjWJgYF9QDux","selected":false,"notBuilding":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"B"},"locked":false},{"type":"Wall","cx":1.5103273766750398,"cy":6.063064855929808,"cz":2.2408122612280286,"lx":13.774073361922072,"ly":0.3,"lz":4,"leftJoints":["tBjXFzHUauAuKRcxtaPG1e"],"rightJoints":["4SzYT1f9J8muRMTnAg2SJH"],"leftPoint":[8.397364057636077,6.063064855929808,0.25],"rightPoint":[-5.376709304285996,6.063064855929808,0.25],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dwbAGuCethnJoxAoWyoGv2","parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","wallStructure":"Pillar","opacity":0,"roofId":"uJkcA94q1VPrPcTVWbwGvS","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"structureSpacing":2.3,"structureWidth":0.25,"structureColor":"#ffffff","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Wall","cx":8.397364057636077,"cy":0.5397298645531063,"cz":2.2301039869226305,"lx":11.046669982753404,"ly":0.3,"lz":4,"leftJoints":["jXXAZGYK8JJ2UA3NqYndxp"],"rightJoints":["dwbAGuCethnJoxAoWyoGv2"],"leftPoint":[8.397364057636073,-4.983605126823596,0.25],"rightPoint":[8.397364057636077,6.063064855929808,0.25],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tBjXFzHUauAuKRcxtaPG1e","parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","wallStructure":"Pillar","structureSpacing":2.3,"opacity":0,"roofId":"uJkcA94q1VPrPcTVWbwGvS","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"structureWidth":0.25,"structureColor":"#ffffff","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Wall","cx":-5.376709304285995,"cy":0.5397298645531063,"cz":2.228839888904333,"lx":11.046669982753404,"ly":0.3,"lz":4,"leftJoints":["dwbAGuCethnJoxAoWyoGv2"],"rightJoints":["jXXAZGYK8JJ2UA3NqYndxp"],"leftPoint":[-5.376709304285995,6.063064855929808,0.25],"rightPoint":[-5.376709304285996,-4.983605126823596,0.25],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4SzYT1f9J8muRMTnAg2SJH","parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","wallStructure":"Pillar","opacity":0,"roofId":"uJkcA94q1VPrPcTVWbwGvS","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"structureSpacing":2.3,"structureWidth":0.25,"structureColor":"#ffffff","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Wall","cx":1.5103273766750416,"cy":-4.983605126823596,"cz":2.268765007024547,"lx":13.774073361922074,"ly":0.3,"lz":4,"leftJoints":["4SzYT1f9J8muRMTnAg2SJH"],"rightJoints":["tBjXFzHUauAuKRcxtaPG1e"],"leftPoint":[-5.376709304285996,-4.983605126823596,0.25],"rightPoint":[8.397364057636077,-4.983605126823596,0.25],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jXXAZGYK8JJ2UA3NqYndxp","parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","wallStructure":"Pillar","opacity":0,"roofId":"uJkcA94q1VPrPcTVWbwGvS","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"structureSpacing":2.3,"structureWidth":0.25,"structureColor":"#ffffff","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"id":"uJkcA94q1VPrPcTVWbwGvS","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["jXXAZGYK8JJ2UA3NqYndxp"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":1.5269644430820746,"ceiling":false,"locked":false},{"type":"Foundation","cx":10.37396266274916,"cy":1.4954382308468475,"cz":0.125,"lx":16.96282588210709,"ly":13.050086329642726,"lz":0.25,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"s1ySBq5Hp2XQRHXHYFr7Ei","selected":false,"enableGroupMaster":true,"notBuilding":true,"locked":false},{"type":"Window","cx":0.07884126244762069,"cy":-0.4199549792627557,"cz":5.657927332967425,"lx":6.879964200295598,"ly":0.2,"lz":3.6298042832326978,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"5qeCesjRK72iMFt1u6qiC3","interior":true,"empty":true,"locked":false},{"type":"Window","cx":4.6299611623937915,"cy":-1.9963568795412103,"cz":5.087112090821291,"lx":1.9473454718410252,"ly":0.2,"lz":0.2766726175398978,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"aGpcgzxVmKxBSPh9yRzTLJ","interior":true,"empty":true,"polygonTop":[-0.5,3.2251316092291917],"locked":false},{"type":"Window","cx":-4.39419016648573,"cy":-2.002733503950701,"cz":5.084803114661254,"lx":1.92547283639216,"ly":0.2,"lz":0.24728723598247773,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.34741346419269825,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"osBXWJHBmx9hpwyQUwqfsK","polygonTop":[0.46902792604716753,3.180338239963955],"locked":false},{"type":"Window","cx":0.11638811342117883,"cy":3.157291970642662,"cz":5.646751287652042,"lx":6.9955661140483585,"ly":0.2,"lz":3.5587869628599558,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"4W4UVMV7FW5xPQu2hjVR4Y","locked":false},{"type":"Window","cx":4.590702645311016,"cy":4.683424214953679,"cz":5.094138691568809,"lx":1.7954404068830758,"ly":0.2,"lz":0.26778946663296593,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"jJTqLy3iA2qbmapg7Zub8Z","polygonTop":[0.5,3.0683555686449475],"locked":false},{"type":"Window","cx":-4.415927568932208,"cy":4.63032056148964,"cz":5.113367528330277,"lx":1.7975728034829963,"ly":0.2,"lz":0.3359502694894871,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"m5979bvktsFocL1GPG4weA","polygonTop":[-0.4957280589496637,2.9554677254634854],"locked":false},{"type":"Window","cx":5.504236899323556,"cy":1.3302889338668908,"cz":5.19822982033263,"lx":5.612135328984845,"ly":0.2,"lz":0.3020024535761091,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5129779343199241,0,1.5707963267948963],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"uyC7NDy7e1ziZpNPzq7VwJ","polygonTop":[0.009359362140956982,1.9288870310031725],"locked":false},{"type":"Window","cx":-5.3990349070202655,"cy":1.2828552303810974,"cz":5.1395256307270145,"lx":6.2123129373580515,"ly":0.2,"lz":0.000006294722086474765,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5129779343199243,0,4.71238898038469],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"wfuMCkccoofFa3YJZeQXjY","polygonTop":[-0.008473558583168532,2.320323655487881],"locked":false},{"type":"Window","cx":1.5099442103574612,"cy":2.197100019877415,"cz":5.268772915652224,"lx":6.866771854005096,"ly":0.2,"lz":3.3727323067547332,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.26972023694331404,0,3.141592653589793],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"jKvUBT3s3eyiNHv6xMyWAB","locked":false},{"type":"Window","cx":1.5105405746812384,"cy":-1.0648474200330473,"cz":5.283367872610519,"lx":6.865526912026976,"ly":0.2,"lz":3.1583095363910174,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.2697202369433138,0,0],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"nehwkAn747SbcH197nfAym","locked":false},{"type":"Window","cx":6.847328996169246,"cy":0.5571537124890757,"cz":4.912671214877417,"lx":5.747166362942518,"ly":0.2,"lz":0.07159007097595167,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.4061405868341845,0,1.5707963267948963],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"vzRJC7dg8gVnPCKJ8nK1uw","polygonTop":[0.0029237138437357584,1.8546622388485283],"locked":false},{"type":"Window","cx":-3.913630166662161,"cy":0.5040604017480659,"cz":4.875275785658461,"lx":6.025884701181912,"ly":0.2,"lz":0.016127155846384855,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.4061405868341845,0,4.71238898038469],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"kwCF77vQKSWqB9vJyLsGEC","polygonTop":[-0.002404697670111075,1.990469286566286],"locked":false},{"type":"Window","cx":5.8964025615822475,"cy":3.6476180468177413,"cz":4.867767100389265,"lx":1.6622791380927708,"ly":0.2,"lz":0.4588203236729191,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.26972023694331404,0,3.141592653589793],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"41o33Gu8Z1ZgNh7JnbXzVZ","polygonTop":[0.5,2.796622713087028],"locked":false},{"type":"Window","cx":-2.855581425025988,"cy":3.549188813296429,"cz":4.894978547817588,"lx":1.5556391784234185,"ly":0.2,"lz":0.4903348709835801,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.26972023694331404,0,3.141592653589793],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"gfa6RMCw76XaAmQeeHFmdc","polygonTop":[-0.5,2.5684727779282683],"locked":false},{"type":"Window","cx":-2.7969890059844267,"cy":-2.384701698791339,"cz":4.918484960952953,"lx":1.5043468507143833,"ly":0.2,"lz":0.30588110911202415,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.2697202369433138,0,0],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"neBTigCnPfsLosQzW9yEzs","polygonTop":[0.5,2.6873784768414724],"locked":false},{"type":"Window","cx":5.895662984214205,"cy":-2.416289985539417,"cz":4.90975215898503,"lx":1.579400635678578,"ly":0.2,"lz":0.3714274801752112,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.2697202369433138,0,0],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"4LmavYSaxJMdhHeDjENvmB","polygonTop":[-0.5,2.6218328392217303],"locked":false}],"sceneRadius":27,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.6328594466581806,4.6052145632619785,0.000004606954980926815],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.6328594466581806,4.6042141858164145,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-24.900270995188162,-22.88331862075037,5.458927240534251],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":43.16939043526372,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-0.17215904908430746,3.1094271606158492,2.035326701937142],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":334,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Combination roof vs. bonnet roof"]}')},457:function(e){e.exports=JSON.parse('{"docid":"eUyyJJc59Won933XJe19sV","time":"06/17/2023 01:41 pm","timestamp":1687023666114,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 9:15:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jeff","cx":2.849872692474971,"cy":-6.695477959956797,"cz":1.05,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.6,"locked":true},{"type":"Wall","cx":0.40535681744352425,"cy":5.410198334546533,"cz":2.2408122612280286,"lx":6.331471207996493,"ly":0.3,"lz":8.5,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[3.571092421441771,5.410198334546532,2.1],"rightPoint":[-2.760378786554723,5.410198334546534,2.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"9DRBXRS4our7656cx2vwpG","leftRoofHeight":8.5,"rightRoofHeight":8.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8.5,"rightTopPartialHeight":8.5},{"type":"Wall","cx":3.57109242144177,"cy":-0.3506001740764093,"cz":2.2301039869226305,"lx":11.521597017245886,"ly":0.3,"lz":6.067100850480004,"leftJoints":["8VKLBEAuMJxaXGp1WaM9mU"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[3.57109242144177,-6.1113986826993525,2.1],"rightPoint":[3.571092421441772,5.410198334546534,2.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"9DRBXRS4our7656cx2vwpG","leftRoofHeight":7,"rightRoofHeight":8.5,"centerRoofHeight":[-0.19251847682880624,6.3652370979872765],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6.067100850480004,"rightTopPartialHeight":6.067100850480004},{"type":"Wall","cx":-2.7603787865547225,"cy":-0.3506001740764093,"cz":2.228839888904333,"lx":11.521597017245886,"ly":0.3,"lz":6.067100850480004,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["8VKLBEAuMJxaXGp1WaM9mU"],"leftPoint":[-2.760378786554722,5.410198334546534,2.1],"rightPoint":[-2.760378786554723,-6.1113986826993525,2.1],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"9DRBXRS4our7656cx2vwpG","leftRoofHeight":8.5,"rightRoofHeight":7,"centerRoofHeight":[0.19251847682880624,6.3652370979872765],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6.067100850480004,"rightTopPartialHeight":6.067100850480004},{"type":"Foundation","cx":-0.33784337005620096,"cy":1.3319211806243931,"cz":1.05,"lx":15.0489874276124,"ly":21.361755748126203,"lz":2.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":true,"color":"#b3b3b3","locked":true},{"type":"Wall","cx":0.40535681744352337,"cy":-6.1113986826993525,"cz":3.5404855174251457,"lx":6.3314712079964925,"ly":0.3,"lz":7,"relativeAngle":0,"leftPoint":[-2.760378786554723,-6.1113986826993525,2.1],"rightPoint":[3.57109242144177,-6.1113986826993525,2.1],"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"8VKLBEAuMJxaXGp1WaM9mU","roofId":"9DRBXRS4our7656cx2vwpG","leftRoofHeight":7,"rightRoofHeight":7,"color":"#999999","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["8VKLBEAuMJxaXGp1WaM9mU"],"textureType":"No Roof Texture","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"9DRBXRS4our7656cx2vwpG","ridgeLeftPoint":[0.19251847682880624,1],"ridgeRightPoint":[-0.19251847682880624,1],"locked":true,"sideColor":"#999999","rise":-2.1347629020127235,"ceiling":false},{"type":"Wall","cx":0.7846470380907851,"cy":6.144582715914701,"cz":2.2408122612280286,"lx":8.239996514218573,"ly":0.1,"lz":2.458799038921556,"leftJoints":["awarKnJ5NQrzVL6xf3jKDE"],"rightJoints":["c43fWPvXTFz63buLF7EQiF"],"leftPoint":[4.904645295200071,6.1445827159147,0.038162668507384964],"rightPoint":[-3.3353512190185017,6.144582715914702,0.038162668507384964],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s2FCVLdwmxK7ScMqTWFnPt","parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","wallStructure":"Stud","opacity":0,"roofId":"5By6QsyR9XJzwW57eFw7Rg","selected":false,"leftRoofHeight":2.458799038921556,"rightRoofHeight":2.458799038921556,"structureSpacing":2.1,"structureWidth":0.2,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.458799038921556,"rightTopPartialHeight":2.458799038921556},{"type":"Wall","cx":4.904645295200071,"cy":-0.6338350568557676,"cz":2.2301039869226305,"lx":13.55683554554094,"ly":0.1,"lz":2.458799038921556,"leftJoints":["jCtJVX5GRr3k9vybapQgGf"],"rightJoints":["s2FCVLdwmxK7ScMqTWFnPt"],"leftPoint":[4.904645295200069,-7.4122528296262375,0.038162668507384964],"rightPoint":[4.904645295200073,6.144582715914702,0.038162668507384964],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"awarKnJ5NQrzVL6xf3jKDE","parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","wallStructure":"Stud","opacity":0,"roofId":"5By6QsyR9XJzwW57eFw7Rg","selected":false,"leftRoofHeight":2.458799038921556,"rightRoofHeight":2.458799038921556,"structureSpacing":1.93,"structureWidth":0.2,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.458799038921556,"rightTopPartialHeight":2.458799038921556},{"type":"Wall","cx":-3.335351219018501,"cy":-0.6338350568557676,"cz":2.228839888904333,"lx":13.55683554554094,"ly":0.1,"lz":2.458799038921556,"leftJoints":["s2FCVLdwmxK7ScMqTWFnPt"],"rightJoints":["jCtJVX5GRr3k9vybapQgGf"],"leftPoint":[-3.3353512190185,6.144582715914702,0.038162668507384964],"rightPoint":[-3.3353512190185017,-7.4122528296262375,0.038162668507384964],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"c43fWPvXTFz63buLF7EQiF","parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","wallStructure":"Stud","opacity":0,"roofId":"5By6QsyR9XJzwW57eFw7Rg","selected":false,"leftRoofHeight":2.458799038921556,"rightRoofHeight":2.458799038921556,"structureSpacing":1.93,"structureWidth":0.2,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.458799038921556,"rightTopPartialHeight":2.458799038921556},{"type":"Wall","cx":0.7846470380907842,"cy":-7.4122528296262375,"cz":3.5404855174251457,"lx":8.239996514218571,"ly":0.1,"lz":2.458799038921556,"leftJoints":["c43fWPvXTFz63buLF7EQiF"],"rightJoints":["awarKnJ5NQrzVL6xf3jKDE"],"leftPoint":[-3.3353512190185017,-7.4122528296262375,0.038162668507384964],"rightPoint":[4.904645295200069,-7.4122528296262375,0.038162668507384964],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"jCtJVX5GRr3k9vybapQgGf","parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","wallStructure":"Stud","opacity":0,"roofId":"5By6QsyR9XJzwW57eFw7Rg","selected":false,"leftRoofHeight":2.458799038921556,"rightRoofHeight":2.458799038921556,"structureSpacing":2.1,"structureWidth":0.2,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.458799038921556,"rightTopPartialHeight":2.458799038921556},{"type":"Foundation","cx":-0.7344091119928784,"cy":1.2827917090727918,"cz":1,"lx":11.86176666643788,"ly":16.71773862227102,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"oR9dfJF3BCFMyFyFLPCHa7","selected":false,"locked":true,"notBuilding":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","roofStructure":"Default","wallsId":["jCtJVX5GRr3k9vybapQgGf"],"ridgeWidth":0.5,"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","id":"5By6QsyR9XJzwW57eFw7Rg","locked":true,"rise":0,"ceiling":false},{"type":"Wall","cx":-0.039595288973048426,"cy":5.505906418342898,"cz":2.2408122612280286,"lx":8.1086978625349,"ly":0.1,"lz":3.7968822453017803,"leftJoints":["cSVfkr5b26MSCjvZV6AAuA"],"rightJoints":["39y7xTS1S7F7jiBBvyvPxR"],"leftPoint":[4.0147536422944015,5.505906418342896,0],"rightPoint":[-4.093944220240498,5.5059064183429,0],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hq7PgWBkRgswjhv5arBsam","parentId":"5Ds4Da2scUYHkUksNyQ1xG","foundationId":"5Ds4Da2scUYHkUksNyQ1xG","wallStructure":"Pillar","opacity":0,"roofId":null,"selected":false,"structureSpacing":2.1,"structureWidth":0.08,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.7968822453017803,"rightTopPartialHeight":3.7968822453017803},{"type":"Wall","cx":4.0147536422944015,"cy":-1.1596625117163346,"cz":2.2301039869226305,"lx":13.33113786011847,"ly":0.1,"lz":3.7968822453017803,"leftJoints":["8K2s8ExFq4TG2csG9MWdsp"],"rightJoints":["hq7PgWBkRgswjhv5arBsam"],"leftPoint":[4.0147536422944,-7.8252314417755695,0],"rightPoint":[4.014753642294403,5.5059064183429,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cSVfkr5b26MSCjvZV6AAuA","parentId":"5Ds4Da2scUYHkUksNyQ1xG","foundationId":"5Ds4Da2scUYHkUksNyQ1xG","wallStructure":"Pillar","opacity":0,"roofId":null,"selected":false,"structureSpacing":1.93,"structureWidth":0.08,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.7968822453017803,"rightTopPartialHeight":3.7968822453017803},{"type":"Wall","cx":-4.093944220240498,"cy":-1.1596625117163346,"cz":2.228839888904333,"lx":13.33113786011847,"ly":0.1,"lz":3.7968822453017803,"leftJoints":["hq7PgWBkRgswjhv5arBsam"],"rightJoints":["8K2s8ExFq4TG2csG9MWdsp"],"leftPoint":[-4.093944220240498,5.5059064183429,0],"rightPoint":[-4.093944220240498,-7.8252314417755695,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"39y7xTS1S7F7jiBBvyvPxR","parentId":"5Ds4Da2scUYHkUksNyQ1xG","foundationId":"5Ds4Da2scUYHkUksNyQ1xG","wallStructure":"Pillar","opacity":0,"roofId":null,"selected":false,"structureSpacing":1.93,"structureWidth":0.08,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.7968822453017803,"rightTopPartialHeight":3.7968822453017803},{"type":"Wall","cx":-0.039595288973049314,"cy":-7.8252314417755695,"cz":3.5404855174251457,"lx":8.108697862534898,"ly":0.1,"lz":3.7968822453017803,"leftJoints":["39y7xTS1S7F7jiBBvyvPxR"],"rightJoints":["cSVfkr5b26MSCjvZV6AAuA"],"leftPoint":[-4.093944220240498,-7.8252314417755695,0],"rightPoint":[4.0147536422944,-7.8252314417755695,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"8K2s8ExFq4TG2csG9MWdsp","parentId":"5Ds4Da2scUYHkUksNyQ1xG","foundationId":"5Ds4Da2scUYHkUksNyQ1xG","wallStructure":"Pillar","opacity":0,"roofId":null,"selected":false,"structureSpacing":2.1,"structureWidth":0.08,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.7968822453017803,"rightTopPartialHeight":3.7968822453017803},{"type":"Foundation","cx":0.04362302366466242,"cy":1.823303235241708,"cz":1,"lx":8.30081773193631,"ly":17.094708951250738,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"5Ds4Da2scUYHkUksNyQ1xG","selected":false,"enableGroupMaster":false,"locked":true,"notBuilding":true},{"type":"Window","cx":-0.25419587257395015,"cy":0.1,"cz":-0.30201296045936715,"lx":0.24801117503166498,"ly":0.3,"lz":0.33556995606596346,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1d7mvhUrBc4LPBEQXecARp","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.34717409348831374,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"ir7hkL6jERL1qMTc1icTaU","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2603805701162353,"cy":0.1,"cz":-0.30201296045936715,"lx":0.2603805701162353,"ly":0.3,"lz":0.33556995606596346,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"r88YNaDvQ5vy3aH4s6woYs","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"u5euGVsx1U7wCryJGvzaQB","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.34717409348831374,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"cSXg7ALAMVJuBAwSqm3fTC","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.23691176200967903,"cy":0.1,"cz":0.23120466954884986,"lx":0.15794117467311936,"ly":0.3,"lz":0.39473351804515744,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8VKLBEAuMJxaXGp1WaM9mU","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"4BaNwdGRdaXZpb72VCDgor","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.23120466954884986,"lx":0.15794117467311936,"ly":0.3,"lz":0.39473351804515744,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rbG9cs5DUMxXisr5wn3eQo","parentId":"8VKLBEAuMJxaXGp1WaM9mU","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23691176200967903,"cy":0.1,"cz":0.23120466954884986,"lx":0.15794117467311936,"ly":0.3,"lz":0.39473351804515744,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mFoP4r2Wu3pQmWdjtsWy3S","parentId":"8VKLBEAuMJxaXGp1WaM9mU","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.34717409348831374,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"augNejin4JPCekoKKnTYSv","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.029411764705882353,"lx":0.15794117467311933,"ly":0.3,"lz":0.17647058823529413,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"5B4h5oeHnYU5wJtaewHXT5","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8361znRuvUkFVaeSdoo5N8","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.34717409348831374,"cy":0.1,"cz":0.24723505294647058,"lx":0.17358704674415687,"ly":0.3,"lz":0.32964673726196053,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oqGE4Pc7gaUxrzp2HEspd6","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jett","cx":3.30154460456002,"cy":-9.422479646769895,"cz":1.05,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"rw9LaiB1TVsCjU7r3gxtva","selected":false,"ly":0.6,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-1.3048004341950468,"cy":-9.630820519777313,"cz":1.05,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"eSJdzinPpHu96SbrVMAjVK","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":6.510735678336653,"cy":-3.1958389696925,"cz":1.05,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"5HazbJmLvszfXVAspqP44n","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":6.4905736887835115,"cy":3.679225460437303,"cz":1.05,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"ksxkAyWQERG2x1K1PGLm2t","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-5.9613745486693706,"cy":-2.773042180475202,"cz":1.05,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"iMujo9QXGncnBDqpZ8cWcv","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-6.2101179268188,"cy":3.9102946709381,"cz":1.05,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"6cWk3x2UFqbqvZgzUcoLmx","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":1.8508428108951245,"cy":-9.658677131415082,"cz":1.05,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"tgueUXSjzrifiN4jQuumWf","selected":false,"locked":true},{"type":"Tree","name":"Apple","cx":6.0352995723203975,"cy":9.024257786663838,"cz":1.0499999523162848,"lx":4.174402972815023,"lz":5.46894817384739,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"aKSdbZwyPvicQCB2BLjJKk","selected":false,"locked":true},{"type":"Tree","name":"Apple","cx":-5.904244061298131,"cy":8.73412818752091,"cz":1.049999952316284,"lx":4.174402972815023,"lz":5.46894817384739,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"izwDJguiBhY5ey4Ujd2R3z","selected":false,"locked":true},{"type":"Human","name":"Jena","cx":4.50924100032713,"cy":-0.042568091946864506,"cz":1.05,"lx":0.695,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"q9UXGHJuymt18ppM1rZtbi","selected":false,"ly":0.695,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.38235294117647056,"lx":0.15794117467311933,"ly":0.3,"lz":0.17647058823529413,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fpLqjLTr3asSNu2fh1ZJCm","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true,"windowType":"Default","archHeight":1},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.02669213223982052,"cy":0.08291430106063127,"cz":7.726383223578941,"lx":6.232,"ly":8.368,"lz":0.046,"showLabel":false,"normal":[0,-0.2584595890813664,0.9660220705614811],"rotation":[0.2614272700856308,0,0],"color":"#fff","parentType":"Roof","parentId":"9DRBXRS4our7656cx2vwpG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"n5j4iVNJbtpUNbLaMZkvDP","selected":false,"locked":true},{"type":"Light","decay":2,"distance":8,"intensity":8,"color":"#fe9200","cx":0.05226827991600305,"cy":-0.11746474188720647,"cz":6.581147613067356,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,-0.2584595890813664,0.9660220705614811],"rotation":[0.2614272700856308,0,0],"parentId":"9DRBXRS4our7656cx2vwpG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"uKAsAnFBRgrMiaDDwGrZbd","selected":false,"inside":true,"locked":true},{"type":"Light","decay":2,"distance":8,"intensity":8,"color":"#fe9200","cx":0.04809382562376093,"cy":0.17196359453393734,"cz":8.23533076857283,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[-6.262269137366339e-17,-0.2584595890813664,0.9660220705614811],"rotation":[0.2614272700856308,0,-4.440892098500626e-16],"parentId":"9DRBXRS4our7656cx2vwpG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"ndNwjPHJBZn5L5PwwRPXWh","selected":false,"inside":true,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":5,"color":"#7b64ff","cx":0.4038813832551331,"cy":-0.018771346923666346,"cz":0.4999999772934685,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"eKvvAN4QXDBPjUP3YttScs","selected":false,"locked":true},{"type":"Light","decay":2,"distance":8,"intensity":5,"color":"#f44e3b","cx":0.03479011577552929,"cy":0.29915344735612687,"cz":8.962264816189862,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[-6.262269137366339e-17,-0.2584595890813664,0.9660220705614811],"rotation":[0.2614272700856308,0,-4.440892098500626e-16],"parentId":"9DRBXRS4our7656cx2vwpG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"j4JYudDCjzNXq8FDPWZEem","selected":false,"inside":true,"locked":true},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.39094575141857246,"y":-0.6076345062918038},{"x":-0.3475489897325333,"y":-0.5252228219763136},{"x":-0.30415222804649406,"y":-0.6076345062918038},{"x":-0.3475489897325333,"y":-0.690046190607294}],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","parentType":"Wall","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"filled":true,"selectedIndex":0,"id":"it9MDEMzBf4jYFMwSdWCYB","text":"LAKE INN","fontSize":0.6,"fontColor":"white","noOutline":true,"opacity":0,"fontStrokeWidth":0.01,"locked":true}],"sceneRadius":16,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[1.9823782654476845,7.984103859589565,0.000007948413777907035],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[1.9823782654476845,7.983103482143546,150],"theme":"Mountain","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[26.70929607950559,3.177981670849796,5.962891433031834],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":13.966745921875,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"forestgreen","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.21820041958429523,2.945228709202592,5.9628914330318326],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":true,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},458:function(e){e.exports=JSON.parse('{"docid":"9oLedt6KSdnvU6ReLpvofe","time":"06/12/2023 10:14 am","timestamp":1686579271051,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":14.613120903558068,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.19344523437500172,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.036317022980521335,"type":"Foundation","solarPowerTower":{},"lx":18.159918676696766,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"label":"Box Gable","labelHeight":8,"labelSize":0.5,"showLabel":true},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":4,"roofId":"pNA4YvnHKpbgLLZoVdn8iH","ly":0.3,"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[6.699943397855505,5.67322456909281,0.1],"type":"Wall","rightRoofHeight":4,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.6999433978555056,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.6732245690928105,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.699943397855504,"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"cy":0.6732245690928105,"leftRoofHeight":4,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":4,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":4,"roofId":"pNA4YvnHKpbgLLZoVdn8iH","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"lx":10,"windows":[],"lz":4,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"pNA4YvnHKpbgLLZoVdn8iH","selected":false,"cy":0.6732245690928105,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4,"ly":0.3,"cx":-5.300056602144494,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"showLabel":false,"cx":0.6999433978555061,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-4.3267754309071895,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"pNA4YvnHKpbgLLZoVdn8iH","leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"ly":0.3,"lz":4,"leftRoofHeight":4,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4,"lx":12,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","showLabel":false,"ly":0,"lz":0.4719248971291678,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":0.014037551435416101,"selected":false,"cx":-0.4166666666666667,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":0.014037551435416101,"normal":[0,0,1],"cx":-0.25,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0,"lz":0.4719248971291678,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.24999999999999997,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333326,"color":"#ffffff","cz":0.014037551435416101,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0,"selected":false,"lz":0.4719248971291678,"type":"Window","mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.4166666666666667,"cy":0.1,"cz":0.014037551435416101,"lz":0.4719248971291678,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333341,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"lz":0.5,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#ffffff","lx":0.1,"cx":0.35,"cz":0,"ly":0,"showLabel":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"selected":false,"cz":-0.003118658584209677,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","type":"Window","normal":[0,0,1],"id":"rgPxjoaTPqdF2tQvSYYJxX","lx":0.15000000000000005,"ly":0,"color":"#ffffff","parentId":"skm8dNPSkFaVkoUwiPNfq1","lz":0.5062373171684194,"cy":0.1,"cx":0.025000000000000022,"rotation":[0,0,0],"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.32500000000000007,"rotation":[0,0,0],"type":"Window","lz":0.5,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":0,"lx":0.1499999999999999,"color":"#ffffff","cy":0.1,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jamelia","cx":1.1862593917325661,"cy":-5.878603983923892,"cz":0.05000000074505806,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.65},{"type":"Door","cx":-0.007175044455080826,"cy":0,"cz":-0.10574881686604092,"lx":0.24768342224349496,"ly":0,"lz":0.7885023662679181,"textureType":"Door Texture #5","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"j9wJCoWK33fz7y9VeMvYET","doorType":"Default","archHeight":1,"filled":true},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,6],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,6],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.25,"cy":0.1,"cz":0,"lx":0.1,"ly":0.3,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mN8bzYoiQHnqnz3EdnMx5V","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.009999999999999998,"cy":0.1,"cz":0.65,"lx":0.1,"ly":0.3,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tykEvHMLKUG24aenygTKer","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.25,"cy":0.1,"cz":0,"lx":0.1,"ly":0.3,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ptjuJgnSZ9BGF41zQTa7NN","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2kwhV9PqZtFtk8RVLFx83","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.25,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qpEwqVCd2BoFtSevFQh92k","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.25,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qH7TW5xv9LhkiifYBpFnzX","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kGJQ1siixMwoWrD3EUKKJK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-18.764187734374996,"cy":0.14106107076947794,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"label":"Open Gable","showLabel":true,"labelHeight":7,"labelSize":0.5},{"type":"Door","cx":0,"cy":0,"cz":-0.1,"lx":0.25,"ly":0,"lz":0.8,"textureType":"Door Texture #5","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"sXi8n3YHx4BKsSMSv4hsZ3","doorType":"Default","archHeight":1,"filled":true},{"type":"Human","name":"Jess","cx":-3.1725018437499966,"cy":-6.753630704470966,"cz":0.05000000074505806,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"textureType":"Roof Texture #1","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"pNA4YvnHKpbgLLZoVdn8iH","leftRidgeLength":6,"rightRidgeLength":6,"rise":2,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture #1","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2,"ceiling":false},{"type":"Human","name":"Jeanette","cx":7.621742234374995,"cy":-6.466760136609153,"cz":0.05000000074505806,"lx":0.4,"ly":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"oRmXPWxcNMFxgsrsxonDon","selected":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["1k67G1W1gvb3E7EbmbG1h1"],"rightJoints":["uytQSeUom5oDsFC3PKa7q8"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u1AdedeCmmKa3QYfwjJ4ya","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["tKvexMf8zrvPgydcZb5VYA"],"rightJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1k67G1W1gvb3E7EbmbG1h1","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"rightJoints":["tKvexMf8zrvPgydcZb5VYA"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uytQSeUom5oDsFC3PKa7q8","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.36,"cy":0.1,"cz":-0.003118658584209677,"lx":0.12000000000000002,"ly":0.3,"lz":0.5062373171684194,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ffkLQGy3NT64UfpCw11G41","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.05,"cy":0.1,"cz":-0.003118658584209677,"lx":0.1,"ly":0.3,"lz":0.5062373171684194,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gNMVvT81stFdLZCLrqUQZf","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3366666666666666,"cy":0.1,"cz":0,"lx":0.12666666666666676,"ly":0.3,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5bfnZWdB6epkk2c8Lmex9Z","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["uytQSeUom5oDsFC3PKa7q8"],"rightJoints":["1k67G1W1gvb3E7EbmbG1h1"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tKvexMf8zrvPgydcZb5VYA","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.375,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aScdMHKjqapGhvxSXnrdVS","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"94qFJLPpyieU8kH3r8ea1u","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hqJtpQuGAWonh9XMck7DkQ","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.375,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iepBWG7Nk7RRKfgVSDffBC","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":18.4159863125,"cy":-0.013675215842332555,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"label":"Hip","showLabel":true,"labelHeight":8,"labelSize":0.5},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["tKvexMf8zrvPgydcZb5VYA"],"textureType":"Roof Texture #1","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"45NB7k7GYboywbxoXsYHLH","leftRidgeLength":3,"rightRidgeLength":3,"rise":2,"ceiling":false},{"type":"Door","cx":0.00416666666666667,"cy":0,"cz":-0.125,"lx":0.24166666666666667,"ly":0,"lz":0.75,"textureType":"Door Texture #5","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"bm1UTSxwjiN1iZGr4Z4Fm6","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.35000000000000014,"cy":0.1,"cz":0.014037551435416087,"lx":0.10000000000000027,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vA6adyEkDTr58b4mpzEs5P","parentId":"1k67G1W1gvb3E7EbmbG1h1","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":1.3322676295501878e-16,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000027,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"twnicRfRAP53B9K6S8CVFm","parentId":"1k67G1W1gvb3E7EbmbG1h1","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.35000000000000014,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000027,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oxmJ7ohqmjFLB5ye4yGS6E","parentId":"1k67G1W1gvb3E7EbmbG1h1","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3500000000000001,"cy":0.1,"cz":0.01403755143541606,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jsRnsGzxKw3CunZjMYneFD","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8d9L17Wt7kc8NaHb7DZkQA","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3500000000000001,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hVKNWxqP1tH67cRypCiM18","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.29999999999999993,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hHA24TY61rX4piy7chXHsW","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":0.6390375514354161,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sFXKinS1ygh3aQAbgbsfyW","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3000000000000001,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n9vgLXoYa2nNMGT5JFGz9k","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1}],"sceneRadius":35,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,19.999999999989587],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-28.254159564913593,-27.690636175073536,3.1442036565521727],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.847108697996333,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-2.0057889063141925,7.911051887878871,2.2071518984525413],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":288,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Gable roof vs. hip roof"]}')},459:function(e){e.exports=JSON.parse('{"docid":"jBRvLNoGNN2puEDd9PXycz","time":"06/10/2023 06:24 pm","timestamp":1686435869581,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jedi","cx":6.331304507164129,"cy":-1.3012531601465285,"cz":0.05,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.56,"locked":false},{"type":"Wall","cx":0.2181336152654918,"cy":3.890044719861693,"cz":2.2408122612280286,"lx":19.557378002954934,"ly":0.3,"lz":4.671023197562504,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[9.996822616742959,3.890044719861693,0.1167755799390626],"rightPoint":[-9.560555386211975,3.890044719861694,0.1167755799390626],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":9.996822616742957,"cy":0.3560826328024773,"cz":2.2301039869226305,"lx":7.067924174118433,"ly":0.3,"lz":4.671023197562504,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[9.996822616742953,-3.177879454256739,0.1167755799390626],"rightPoint":[9.99682261674296,3.890044719861694,0.1167755799390626],"relativeAngle":1.5707963267948957,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[0,6.671023197562504],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":-9.560555386211973,"cy":0.3560826328024773,"cz":2.228839888904333,"lx":7.067924174118433,"ly":0.3,"lz":4.671023197562504,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-9.560555386211973,3.890044719861694,0.1167755799390626],"rightPoint":[-9.560555386211975,-3.177879454256739,0.1167755799390626],"relativeAngle":-1.570796326794897,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[0,6.671023197562504],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":0.2181336152654927,"cy":-3.177879454256739,"cz":2.268765007024547,"lx":19.557378002954934,"ly":0.3,"lz":4.671023197562504,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-9.560555386211975,-3.177879454256739,0.1167755799390626],"rightPoint":[9.99682261674296,-3.177879454256739,0.1167755799390626],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Foundation","cx":0,"cy":1.7959453873000797,"cz":0.05,"lx":20.027750617523758,"ly":10.567937825052699,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":true,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture #1","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2,"ceiling":false,"locked":false},{"type":"Wall","cx":0.48326494323250757,"cy":3.5008921737627774,"cz":2.2408122612280286,"lx":9.311701011603256,"ly":0.3,"lz":4.671023197562504,"leftJoints":["vKjEHsN5hVHi8S9tPzBesN"],"rightJoints":["eTKLP2TockjZDP1RLDKvpj"],"leftPoint":[5.1391154490341355,3.500892173762777,0.1167755799390626],"rightPoint":[-4.172585562569121,3.5008921737627787,0.1167755799390626],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"o6RrXLKTD62SEJEe7jE1pv","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":5.139115449034135,"cy":-0.014752489141851436,"cz":2.2301039869226305,"lx":7.03128932580926,"ly":0.3,"lz":4.671023197562504,"leftJoints":["gTaSzURYtieAPQn32pwAn4"],"rightJoints":["o6RrXLKTD62SEJEe7jE1pv"],"leftPoint":[5.139115449034133,-3.530397152046481,0.1167755799390626],"rightPoint":[5.139115449034136,3.500892173762778,0.1167755799390626],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"vKjEHsN5hVHi8S9tPzBesN","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[0,6.671023197562504],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":-4.17258556256912,"cy":-0.01475248914185131,"cz":2.228839888904333,"lx":7.03128932580926,"ly":0.3,"lz":4.671023197562504,"leftJoints":["o6RrXLKTD62SEJEe7jE1pv"],"rightJoints":["gTaSzURYtieAPQn32pwAn4"],"leftPoint":[-4.17258556256912,3.5008921737627787,0.1167755799390626],"rightPoint":[-4.172585562569121,-3.530397152046481,0.1167755799390626],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"eTKLP2TockjZDP1RLDKvpj","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[0,6.671023197562504],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.571023197562504,"rightUnfilledHeight":4.571023197562504,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":0.483264943232508,"cy":-3.530397152046481,"cz":2.268765007024547,"lx":9.311701011603258,"ly":0.3,"lz":4.671023197562504,"leftJoints":["eTKLP2TockjZDP1RLDKvpj"],"rightJoints":["vKjEHsN5hVHi8S9tPzBesN"],"leftPoint":[-4.172585562569121,-3.530397152046481,0.1167755799390626],"rightPoint":[5.139115449034136,-3.530397152046481,0.1167755799390626],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"gTaSzURYtieAPQn32pwAn4","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"id":"atFqzWxSt7aWP6ZqiaDGq7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.2,"wallsId":["gTaSzURYtieAPQn32pwAn4"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rise":2,"ceiling":false,"locked":false},{"type":"Foundation","cx":0.23126993902249376,"cy":-2.0229770702149175,"cz":0.05,"lx":14.211391813883525,"ly":9.298675779004126,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"enableGroupMaster":true},{"type":"Window","cx":-0.2844428535544314,"cy":0.1,"cz":-0.16056439205683565,"lx":0.14222142677721564,"ly":0.3,"lz":0.3211287841136713,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"aZCLoUJL2oqSdY1EPAoZaK","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2844428535544314,"cy":0.1,"cz":-0.16056439205683565,"lx":0.1422214267772157,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"7tBrMVcDfPB8c8BZciVReg","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":0.007111071338860792,"cy":0,"cz":-0.25,"lx":0.21333214016582355,"ly":0,"lz":0.5,"color":"white","textureType":"Door Texture #4","normal":[0,1,0],"rotation":[0,0,0],"id":"7U3cffozoc4HtMQf5rGEzr","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"doorType":"Default","archHeight":1,"filled":true,"locked":false},{"type":"Window","cx":-0.2844428535544314,"cy":0.1,"cz":0.37465024813261655,"lx":0.14222142677721564,"ly":0.3,"lz":0.3211287841136713,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"kXNUWsGU11pAFUKwvU2cgP","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":7.894875130155282e-18,"cy":0.1,"cz":0.37465024813261655,"lx":0.1422214267772157,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2TxqL85a1LDTfDpUNCK9gm","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2844428535544315,"cy":0.1,"cz":0.37465024813261655,"lx":0.14222142677721583,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"e7mrU2eTyTJt6DPomDBhWs","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.37587117494845146,"cy":0.1,"cz":0.26760732009472615,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136712,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4UxKztqar6qH3CTGZ9qgY9","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.05369588213549307,"cy":0.1,"cz":0.2676073200947262,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136712,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tQ1H6t36xF8x6Jq7rqyTYA","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.37587117494845146,"cy":0.1,"cz":-0.1605643920568356,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136712,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2o6zHemGFi14KgXdJ3iuht","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.05369588213549307,"cy":0.1,"cz":-0.1605643920568356,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136712,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"bNFvbn2V5MqizQvTWS1gF8","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.007074212847824756,"cy":0.1,"cz":0.717187617853866,"lx":0.1273358312608462,"ly":0.3,"lz":0.14986009925304675,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tnV8oAWfG9ER3isiJKzp3v","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.28037933545424537,"cy":0.1,"cz":0.3211287841136713,"lx":0.13630590003900364,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"d65ECu9HpsufqejE9JE6SQ","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2814150068377438,"cy":0.1,"cz":0.3211287841136713,"lx":0.1445912711069909,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"6kdvjn4UXHVDJzSZhf4B4J","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.2829685139129914,"cy":0.1,"cz":-0.21408585607578087,"lx":0.1414842569564957,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"eVWLBrjytjaXb5Ykbr5VPD","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2814150068377438,"cy":0.1,"cz":-0.21408585607578087,"lx":0.14459127110699085,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2ZfkAgSXYQx6P4m4xidDeL","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.053695882135493055,"cy":0.1,"cz":0.2676073200947261,"lx":0.10739176427098611,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"oEw7Y1dUnZ4auXTsBwuqSe","parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3758711749484514,"cy":0.1,"cz":0.2676073200947261,"lx":0.10739176427098611,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4g5mEoLtYLy6qSqMvwrtZa","parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.053695882135493055,"cy":0.1,"cz":-0.16056439205683565,"lx":0.10739176427098611,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4SFYRMATJPbJgwPmaVx1ZQ","parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3758711749484514,"cy":0.1,"cz":-0.16056439205683565,"lx":0.10739176427098611,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vJzKtUzUWEXsGn9NbVuYJR","parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.2829685139129914,"cy":0.1,"cz":-0.21408585607578084,"lx":0.14148425695649575,"ly":0.3,"lz":0.21408585607578082,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"6K9qDfssYi3YmZcNiGxeFD","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2829685139129914,"cy":0.1,"cz":-0.21408585607578087,"lx":0.1414842569564957,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aFbFpSbkdAr9vNaBtR39Zj","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.7171876178538659,"lx":0.1414842569564957,"ly":0.3,"lz":0.14986009925304655,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"gTVRT9iKwSKBHrZBxbTWqP","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25565799256140304,"cy":0.1,"cz":0.32112878411367124,"lx":0.051131598512280566,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"nyFPVXnTmHtF1thRj3voUP","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25565799256140304,"cy":0.1,"cz":-0.21408585607578087,"lx":0.051131598512280566,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"44QoRqthuL83hLzEWvpPy4","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.40905278809824486,"cy":0.1,"cz":-0.21408585607578087,"lx":0.051131598512280566,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"eL8eT9b15BPwUEoDRzrTes","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.40905278809824486,"cy":0.1,"cz":0.32112878411367124,"lx":0.051131598512280566,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"ik59hsieStesGBV1HN1iPA","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.28555769237173745,"cy":0.1,"cz":0.21408585607578087,"lx":0.13630590003900364,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jzPeoP6c34HMtziwDKHv3a","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.28037933545424537,"cy":0.1,"cz":0.21408585607578087,"lx":0.13630590003900364,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jsfEyvAHdrSn2vaQ4ia3zy","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.25565799256140304,"cy":0.1,"cz":0.3211287841136713,"lx":0.05113159851228061,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"1RhUm2Y2uUHcxK5xvxbogA","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.40905278809824486,"cy":0.1,"cz":0.3211287841136713,"lx":0.05113159851228061,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"5ZJyH8rrUf7HJAQnM2bWVm","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.40905278809824486,"cy":0.1,"cz":-0.21408585607578087,"lx":0.05113159851228061,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"nw3rdMtcMqRG4LGoRcBsfK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.25565799256140304,"cy":0.1,"cz":-0.21408585607578087,"lx":0.05113159851228061,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vmF1fcU9LPrzoGvKVJXeJJ","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":-1.1353495590844666e-17,"cy":0,"cz":-0.04661843672800818,"lx":0.35792118958596425,"ly":0,"lz":0.9067631265439836,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"4u2Lemg9g24YVU44Rt2Xic","interior":true,"locked":false},{"type":"Window","cx":0.025565799256140304,"cy":0.3,"cz":0.05352146401894522,"lx":0.10226319702456121,"ly":0.3,"lz":0.5352146401894522,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"bqg8AAYEpwNKgztwidBiEk","locked":false},{"type":"Window","cx":0.4720595639184657,"cy":-3.3684520937463995,"cz":4.763171084384773,"lx":6.938544523756692,"ly":0.2,"lz":0.00409574132092067,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.2,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5149965428074765,0,-2.220446049250313e-16],"parentId":"1iq4TPqH8xr1w2VxMAh8MU","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"aGPExW23jA85jXEJyeCpz1","interior":true,"empty":true,"polygonTop":[-0.035382757507848805,4.273887307898969],"locked":false},{"type":"Window","cx":-2.6203952752607758,"cy":3.667558239043421,"cz":4.776209255164273,"lx":3.171105348094547,"ly":0.2,"lz":0.017651285838173516,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.2,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5172270860325816,0,3.141592653589793],"parentId":"atFqzWxSt7aWP6ZqiaDGq7","parentType":"Roof","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"72o3pTJwsE9dUcnRyyjnEw","interior":true,"polygonTop":[0.5,4.226955821233187],"empty":true,"locked":false},{"type":"Window","cx":-2.693211019665715,"cy":-3.6869046603465847,"cz":4.781988313035353,"lx":2.9580970480479842,"ly":0.2,"lz":0.09882178864870414,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.2,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5172270860325816,0,0],"parentId":"atFqzWxSt7aWP6ZqiaDGq7","parentType":"Roof","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"uPuuLDNiMgZBsKvCnm6tSV","polygonTop":[-0.5,4.164786986092855],"interior":true,"empty":true,"locked":false},{"type":"Door","cx":-0.3090654703490424,"cy":0,"cz":-0.014505558316641022,"lx":0.3603907064477181,"ly":0,"lz":0.9709888833667178,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8s4tEpToJXwoUEYbHRBASE","interior":true,"locked":false},{"type":"Door","cx":0.3060665281723105,"cy":0,"cz":-0.014505558316641022,"lx":0.3543928220942542,"ly":0,"lz":0.9709888833667178,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"kP69Q4f2kGriQePVP8M1cp","locked":false,"interior":true}],"sceneRadius":13,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.2194678710540945,-0.08163623568179776,-2.1779207174878058e-7],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.2194678710540945,-0.08263661312798706,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-0.0825236074539012,-21.73896740327531,3.532398591116602],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":33.40365140230189,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[0.5164600410339055,-0.2045268879302931,3.380292682783385],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":256,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Gable-and-valley roof"]}')},460:function(e){e.exports=JSON.parse('{"docid":"xtKNTywwk7s3D5dx9fE6NJ","time":"06/12/2023 10:07 am","timestamp":1686578834737,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jocelyn","cx":7.030735525496638,"cy":-10.425839702214304,"cz":0,"lx":0.4,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.4},{"type":"Wall","cx":0.19888873388653605,"cy":5.462586096288465,"cz":2.2408122612280286,"lx":9.311701011603256,"ly":0.3,"lz":4.671023197562504,"leftJoints":["vKjEHsN5hVHi8S9tPzBesN"],"rightJoints":["eTKLP2TockjZDP1RLDKvpj"],"leftPoint":[4.854739239688164,5.462586096288464,0.1167755799390626],"rightPoint":[-4.4569617719150925,5.462586096288466,0.1167755799390626],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"o6RrXLKTD62SEJEe7jE1pv","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504},{"type":"Wall","cx":4.854739239688163,"cy":1.9469414333838355,"cz":2.2301039869226305,"lx":7.03128932580926,"ly":0.3,"lz":4.671023197562504,"leftJoints":["gTaSzURYtieAPQn32pwAn4"],"rightJoints":["o6RrXLKTD62SEJEe7jE1pv"],"leftPoint":[4.854739239688161,-1.5687032295207934,0.1167755799390626],"rightPoint":[4.854739239688166,5.462586096288464,0.1167755799390626],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"vKjEHsN5hVHi8S9tPzBesN","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":7.104360278230817,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[-0.5,7.104360278230817],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504},{"type":"Wall","cx":-4.456961771915092,"cy":1.9469414333838349,"cz":2.228839888904333,"lx":7.03128932580926,"ly":0.3,"lz":4.671023197562504,"leftJoints":["o6RrXLKTD62SEJEe7jE1pv"],"rightJoints":["gTaSzURYtieAPQn32pwAn4"],"leftPoint":[-4.456961771915091,5.462586096288466,0.1167755799390626],"rightPoint":[-4.456961771915092,-1.568703229520794,0.1167755799390626],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"eTKLP2TockjZDP1RLDKvpj","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":7.104360278230817,"centerRoofHeight":[0.5,7.104360278230817],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504},{"type":"Wall","cx":0.1988887338865364,"cy":-1.5687032295207946,"cz":2.268765007024547,"lx":9.311701011603258,"ly":0.3,"lz":7.104360278230817,"leftJoints":["eTKLP2TockjZDP1RLDKvpj"],"rightJoints":["vKjEHsN5hVHi8S9tPzBesN"],"leftPoint":[-4.456961771915092,-1.568703229520794,0.1167755799390626],"rightPoint":[4.854739239688165,-1.5687032295207934,0.1167755799390626],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"gTaSzURYtieAPQn32pwAn4","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":7.104360278230817,"rightRoofHeight":7.104360278230817,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.104360278230817,"rightTopPartialHeight":7.104360278230817},{"id":"atFqzWxSt7aWP6ZqiaDGq7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.2,"wallsId":["gTaSzURYtieAPQn32pwAn4"],"ridgeLeftPoint":[0.5,1],"ridgeRightPoint":[-0.5,1],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":-0.18703080111903558,"cy":-9.915377662073155,"cz":0.05,"lx":13.403144619496231,"ly":13.222063624055503,"lz":0.1167755799390626,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"enableGroupMaster":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","cx":0.35217238415000696,"cy":2.6927731238245474,"cz":2.2408122612280286,"lx":8.76701829919503,"ly":0.3,"lz":2.6726233773992516,"leftJoints":["v7ziTUW2TZM5T4TwmNAdjJ"],"rightJoints":["vhCUXkYA9VDRSco52tUYkV"],"leftPoint":[4.735681533747522,2.692773123824547,0.0668155844349813],"rightPoint":[-4.031336765447508,2.692773123824548,0.0668155844349813],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gG5CjV1FxMvKL6tHfFayym","parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofId":"jVi4m1ThhBLxMFASq2GS9v","selected":false,"leftRoofHeight":2.6726233773992516,"rightRoofHeight":2.6726233773992516,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.6726233773992516,"rightTopPartialHeight":2.6726233773992516},{"type":"Wall","cx":4.735681533747522,"cy":0.48062987575342486,"cz":2.2301039869226305,"lx":4.424286496142247,"ly":0.3,"lz":2.6726233773992516,"leftJoints":["eTtjCc8c1PMfKVHADbJHAr"],"rightJoints":["gG5CjV1FxMvKL6tHfFayym"],"leftPoint":[4.73568153374752,-1.731513372317698,0.0668155844349813],"rightPoint":[4.735681533747522,2.692773123824548,0.0668155844349813],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"v7ziTUW2TZM5T4TwmNAdjJ","parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofId":"jVi4m1ThhBLxMFASq2GS9v","selected":false,"leftRoofHeight":4.738508482435636,"rightRoofHeight":2.6726233773992516,"centerRoofHeight":[-0.5,4.738508482435636],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.6726233773992516,"rightTopPartialHeight":2.6726233773992516},{"type":"Wall","cx":-4.031336765447506,"cy":0.48062987575342486,"cz":2.228839888904333,"lx":4.424286496142247,"ly":0.3,"lz":2.6726233773992516,"leftJoints":["gG5CjV1FxMvKL6tHfFayym"],"rightJoints":["eTtjCc8c1PMfKVHADbJHAr"],"leftPoint":[-4.031336765447506,2.692773123824548,0.0668155844349813],"rightPoint":[-4.031336765447508,-1.731513372317698,0.0668155844349813],"relativeAngle":-1.5707963267948972,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vhCUXkYA9VDRSco52tUYkV","parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofId":"jVi4m1ThhBLxMFASq2GS9v","selected":false,"leftRoofHeight":2.6726233773992516,"rightRoofHeight":4.738508482435636,"centerRoofHeight":[0.5,4.738508482435636],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.6726233773992516,"rightTopPartialHeight":2.6726233773992516},{"type":"Wall","cx":0.35217238415000696,"cy":-1.731513372317698,"cz":2.268765007024547,"lx":8.76701829919503,"ly":0.3,"lz":4.738508482435636,"leftJoints":["vhCUXkYA9VDRSco52tUYkV"],"rightJoints":["v7ziTUW2TZM5T4TwmNAdjJ"],"leftPoint":[-4.031336765447508,-1.731513372317698,0.0668155844349813],"rightPoint":[4.735681533747522,-1.731513372317698,0.0668155844349813],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eTtjCc8c1PMfKVHADbJHAr","parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofId":"jVi4m1ThhBLxMFASq2GS9v","selected":false,"leftRoofHeight":4.738508482435636,"rightRoofHeight":4.738508482435636,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.273631578164477,"rightUnfilledHeight":4.273631578164477,"leftTopPartialHeight":4.738508482435636,"rightTopPartialHeight":4.738508482435636},{"id":"jVi4m1ThhBLxMFASq2GS9v","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.2,"wallsId":["eTtjCc8c1PMfKVHADbJHAr"],"ridgeLeftPoint":[0.5,1],"ridgeRightPoint":[-0.5,1],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":-0.7467654326238933,"cy":-6.853383216679946,"cz":0.05,"lx":11.313197651444508,"ly":6.0997112704854475,"lz":0.0668155844349813,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6YXGTgZyXDxpnnbdLfyv5j","selected":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Door","cx":-0.05369588213549307,"cy":0,"cz":-0.25,"lx":0.15034846997938056,"ly":0,"lz":0.5,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"91pkNVx7ajPdGc4gqpa6PF","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.32217529281295837,"cy":0.1,"cz":-0.16056439205683565,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136713,"shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"7ha8A9howKC84aYKTw9eqN","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.26847941067746534,"cy":0.1,"cz":-0.16056439205683565,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"8VBQnA65eh5k5Uw55HF1Cb","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.32217529281295837,"cy":0.1,"cz":0.32112878411367135,"lx":0.10739176427098608,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"un8y8e9JpPi1naZZMpwMVZ","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.05369588213549307,"cy":0.1,"cz":0.32112878411367135,"lx":0.10739176427098614,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"v1BvsJ4T7JhsFhezNhcX4K","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.26847941067746534,"cy":0.1,"cz":0.32112878411367135,"lx":0.10739176427098614,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"soGnwUqCB3auZqHEHNS1LQ","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-1.2546916046160377e-17,"cy":0.1,"cz":0.18708210226259175,"lx":0.22602514572054705,"ly":0.3,"lz":0.7483284090503667,"shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vhCUXkYA9VDRSco52tUYkV","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","id":"aRTYiMKpbFtXogCmbdfpaN","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2844428535544314,"cy":0.1,"cz":-0.16056439205683565,"lx":0.1422214267772157,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"m5qoAfq3cFT2Jt7voLAZVP","parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2844428535544314,"cy":0.1,"cz":-0.16056439205683565,"lx":0.1422214267772157,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aF1Pnz747SfgYcvKbrSeaH","parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.01710957989146351,"cy":0.1,"cz":0.05948559174013301,"lx":0.39922353080081546,"ly":0.3,"lz":0.7041900664751375,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"gG5CjV1FxMvKL6tHfFayym","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","id":"uicWDWWbqUVhqeZaftrgmK","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-1.0037532836928301e-16,"cy":0.1,"cz":0.07392401455912316,"lx":0.22602514572054688,"ly":0.3,"lz":0.6753132208371573,"shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"v7ziTUW2TZM5T4TwmNAdjJ","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","id":"pVu2one7ax8iwQZsAqqvKk","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.03555535669430392,"cy":0.1,"cz":-0.05352146401894522,"lx":0.21333214016582355,"ly":0.3,"lz":0.5352146401894522,"shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"sTNhou8URmxdSewCTJQCAy","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3518965680359005,"lx":0.8591341141678889,"ly":0.3,"lz":0.14075862721436017,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"kVcMN888wkNzdrNFsdAiaM","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0.053695882135493055,"cy":0,"cz":-0.25,"lx":0.42956705708394444,"ly":0,"lz":0.5,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"wpqi2Ry4DwtfWLp7rkgBQh"},{"type":"Door","cx":0,"cy":0,"cz":-0.1796206863928199,"lx":0.8591341141678889,"ly":0,"lz":0.6407586272143603,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"nnyBHsqWtA9kbVTgYsewZw","interior":true}],"sceneRadius":21,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.6516049999999995,-8.08817077589694,-0.00000806397029662998],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.6516049999999995,-8.089170775904988,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[16.59744270375234,-0.7176337384414646,3.223728034339639],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":37.01235612443423,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.4383511164484704,-7.6519084348386786,3.2237280343396377],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Clerestory roof"]}')},461:function(e){e.exports=JSON.parse('{"docid":"4aDAL58XHFYL5qfHvxH7ag","time":"03/21/2023 09:15 am","timestamp":1679404555806,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 1:30:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":-1.5970326990453252,"cy":4.004815564210436,"cz":2.2408122612280286,"lx":6.360799275911862,"ly":0.3,"lz":7.5,"leftJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"rightJoints":["11Ltx28CSTVpm6gjZuBH9w"],"leftPoint":[1.5833669389106055,4.004815564210436,0.12302997096647357],"rightPoint":[-4.777432337001256,4.004815564210436,0.12302997096647357],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n8LvMVp1hZ7BptmwrWpcMT","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"bdD5ztB6YGXg4uAZiGZwDr","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":1.5833669389106042,"cy":0.7942223442409677,"cz":2.2301039869226305,"lx":6.421186439938938,"ly":0.3,"lz":7.5,"leftJoints":["hndwqtrrygFvfqvBJrvZYu"],"rightJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"leftPoint":[1.5833669389106024,-2.4163708757285014,0.12302997096647357],"rightPoint":[1.5833669389106055,4.004815564210436,0.12302997096647357],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e5r2Cqz5K28ewHbKWcFnYZ","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"bdD5ztB6YGXg4uAZiGZwDr","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-4.777432337001256,"cy":0.7942223442409677,"cz":2.228839888904333,"lx":6.421186439938938,"ly":0.3,"lz":7.5,"leftJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"rightJoints":["hndwqtrrygFvfqvBJrvZYu"],"leftPoint":[-4.777432337001256,4.004815564210436,0.12302997096647357],"rightPoint":[-4.777432337001256,-2.4163708757285014,0.12302997096647357],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"11Ltx28CSTVpm6gjZuBH9w","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"bdD5ztB6YGXg4uAZiGZwDr","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-1.5970326990453252,"cy":-2.4163708757285014,"cz":2.268765007024547,"lx":6.360799275911862,"ly":0.3,"lz":7.5,"leftJoints":["11Ltx28CSTVpm6gjZuBH9w"],"rightJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"leftPoint":[-4.777432337001256,-2.4163708757285014,0.12302997096647357],"rightPoint":[1.5833669389106055,-2.4163708757285014,0.12302997096647357],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hndwqtrrygFvfqvBJrvZYu","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"bdD5ztB6YGXg4uAZiGZwDr","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Foundation","cx":1.5369607065875481,"cy":-0.7337478948430647,"cz":0.05,"lx":9.90872374106268,"ly":8.491876915965634,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"locked":false},{"type":"Wall","cx":0.19112531149657697,"cy":5.620514141149594,"cz":2.2408122612280286,"lx":11.291398093915323,"ly":0.3,"lz":4,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[5.836824358454238,5.620514141149594,0.1],"rightPoint":[-5.454573735461085,5.620514141149594,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.06250000000000006,"lx":0.0708994221944815,"ly":0.3,"lz":0.3750000000000001,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729104,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":5.836824358454238,"cy":-0.00995475119942446,"cz":2.2301039869226305,"lx":11.260937784698037,"ly":0.3,"lz":4,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[5.836824358454236,-5.640423643548443,0.1],"rightPoint":[5.83682435845424,5.620514141149594,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-5.454573735461083,"cy":-0.00995475119942446,"cz":2.228839888904333,"lx":11.260937784698037,"ly":0.3,"lz":4,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-5.454573735461083,5.620514141149594,0.1],"rightPoint":[-5.454573735461085,-5.640423643548443,0.1],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.1911253114965783,"cy":-5.640423643548443,"cz":2.268765007024547,"lx":11.291398093915324,"ly":0.3,"lz":4,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-5.454573735461085,-5.640423643548443,0.1],"rightPoint":[5.83682435845424,-5.640423643548443,0.1],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.3949264794283293,"cy":0.1,"cz":-0.0625,"lx":0.08134902219083363,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"29QuQvndX2M7Sq4iEkq1Xz","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.21716749210312172,"cy":0.1,"cz":-0.0484624485645839,"lx":0.0738661714047936,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4LUVPCUMNMxJkqRL8wFtEe","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.21342606671010173,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"9FGAjvvq6tsggdPdWysCTK","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":-0.06249999999999989,"lx":0.072600165087291,"ly":0.3,"lz":0.3749999999999998,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"ucbeQgKEoSy9dHSmSFvaic","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-0.16683617706583842,"cy":0.10266831665150722,"cz":0.06,"lx":14.604582269301902,"ly":13.013221811141948,"lz":0.12,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":false,"enableGroupMaster":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","roofStructure":"Default","wallsId":["roDDPncXBpNgmNum9aUaov"],"ridgeWidth":2.741183421535105,"textureType":"Roof Texture #2","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"wCPmoV4VwkScF5K7cf32UD","rise":2,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["e5r2Cqz5K28ewHbKWcFnYZ","n8LvMVp1hZ7BptmwrWpcMT","11Ltx28CSTVpm6gjZuBH9w","hndwqtrrygFvfqvBJrvZYu"],"textureType":"Roof Texture #2","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"bdD5ztB6YGXg4uAZiGZwDr","rise":2.399521849228247,"ceiling":false},{"type":"Window","cx":-0.23360168934983674,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"jA4MqD7ALHMKTSCdEzWHix","windowType":"Default","archHeight":1},{"type":"Window","cx":0.2336016893498367,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3LT1rVtnjso2jP6z4TaDHZ","parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.23729790815292326,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ckaBeGV6Ni9NQ3te3EiN3g","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.22990547054675017,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fEDLXuYBqFYJiCkBziofUB","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.23360168934983674,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"v9cnm7VWZ62giNve9jyv7m","parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2336016893498367,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qVLTtiLnxXpR5yqcHhSa9e","parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.23729790815292326,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"meXeAm7nDdwTPRbzo9vVFs","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.22990547054675017,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qJBjFd5e5FHkdYG6fhgp91","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Julia","cx":0.2781860356360548,"cy":-5.386859602824218,"cz":0.05999999865889549,"lx":0.43,"lz":1.71,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","id":"jiceWNCXNG4mowM8Y1pnuj","selected":false,"ly":0.43},{"type":"Door","cx":0,"cy":0,"cz":-0.1875,"lx":0.17712598416645625,"ly":0,"lz":0.625,"doorType":"Arched","archHeight":1,"textureType":"No Door Texture","color":"#73d8ff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"fTMHecXmkxoFyi5nVgZruF","filled":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.04428149604161406,"y":-0.35},{"x":-0.06199409445825968,"y":-0.3},{"x":-0.06199409445825968,"y":-0.25},{"x":-0.04428149604161406,"y":-0.2},{"x":0.05142883345662218,"y":-0.20084745762711861},{"x":0.07085039366658251,"y":-0.25},{"x":0.07085039366658251,"y":-0.3},{"x":0.05313779524993687,"y":-0.35}],"parentId":"roDDPncXBpNgmNum9aUaov","parentType":"Wall","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":true,"selectedIndex":1,"id":"pTMN5Rfce2g9VdNDy1KZ2d","text":"DEPOT","fontSize":0.3,"fontColor":"gold"},{"type":"Door","cx":0,"cy":0,"cz":-0.31666666666666665,"lx":0.31146891913311564,"ly":0,"lz":0.36666666666666664,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"trSHy7vD1sqEajCH8ej493"},{"type":"Door","cx":0,"cy":0,"cz":-0.31666666666666665,"lx":0.31146891913311564,"ly":0,"lz":0.36666666666666664,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"cf7HkkLcbaZLJwzCBfEgBH"}],"sceneRadius":10,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-7.335485572988376,-17.642820069421862,3.809724387059762],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":35.161738318212514,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.3277453693129069,-0.2039271051931454,3.5347379885285575],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Monitor roof"]}')},462:function(e){e.exports=JSON.parse('{"docid":"sXLwKRDpQ3Uupy3LJSKC7z","time":"06/12/2023 10:27 am","timestamp":1686580058007,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"June","cx":2.0733747451945757,"cy":-6.061881854428435,"cz":0.05000000074505806,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.65},{"type":"Wall","cx":0.6394231663265257,"cy":5.872000955672556,"cz":2.2408122612280286,"lx":10.96242641823205,"ly":0.3,"lz":5.158338809071295,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.120636375442551,5.872000955672555,0],"rightPoint":[-4.8417900427894995,5.872000955672556,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Wall","cx":6.12063637544255,"cy":0.696812767580496,"cz":2.2301039869226305,"lx":10.35037637618412,"ly":0.3,"lz":5.158338809071295,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.120636375442548,-4.478375420511564,0],"rightPoint":[6.120636375442552,5.872000955672556,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"centerRoofHeight":[0,7.404178387671576],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Wall","cx":-4.8417900427894995,"cy":0.696812767580496,"cz":2.228839888904333,"lx":10.35037637618412,"ly":0.3,"lz":5.158338809071295,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-4.841790042789499,5.872000955672556,0],"rightPoint":[-4.8417900427894995,-4.478375420511564,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"centerRoofHeight":[0,7.404178387671576],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Wall","cx":0.6394231663265262,"cy":-4.478375420511564,"cz":2.268765007024547,"lx":10.962426418232052,"ly":0.3,"lz":5.158338809071295,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-4.8417900427894995,-4.478375420511564,0],"rightPoint":[6.120636375442552,-4.478375420511564,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.4104930631521381,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004747,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2kwhV9PqZtFtk8RVLFx83","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-11.865426237722085,"cy":-0.3020514645326293,"cz":0.05,"lx":16.58973102119719,"ly":15.125130138250977,"lz":0.0859723134845216,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"label":"Colonial","labelHeight":9,"labelSize":0.5,"showLabel":true},{"type":"Door","cx":-0.022805170175118798,"cy":0,"cz":-0.25,"lx":0.1368310210507128,"ly":0,"lz":0.5,"textureType":"Door Texture #1","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"sXi8n3YHx4BKsSMSv4hsZ3","doorType":"Default","archHeight":1,"filled":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.15,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture #2","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2.2458395786002807,"ceiling":false},{"type":"Window","cx":0.228051701751188,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p9ZFePdMbr5NJNutJpztLz","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.41049306315213846,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047536,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"onfGgeAsDqrPXW9qAoSbJh","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.228051701751188,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047519,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mM8yRHvdQcQxaerLVfTrHK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.228051701751188,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047519,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"reViENhjL3rZ1iP9Y6KZQV","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4104930631521384,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047512,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dKNjnS17wjTVoaiN1bY7jW","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.289844532311202,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373401,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bJfKVxMyGkSvssMyjbaW7W","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.289844532311202,"cy":0.1,"cz":-0.24232607555784985,"lx":0.09661484410373396,"ly":0,"lz":0.2907912906694198,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u4p2yGTyGA3NaJrURgo1aw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2880871761594032,"cy":0.1,"cz":0.24232607555784988,"lx":0.10012955640733165,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"swiJmUxEJ9JBgVoJXFiWMw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.289844532311202,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373405,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dJpqWBHMDhQTd71cTnXaW4","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31927238245166323,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004752,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j5a1DqXozDg23XnZHUwT3y","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31927238245166323,"cy":0.1,"cz":0.24232607555784988,"lx":0.0912206807004752,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wdagFqacKyLy9R8i7SRZPq","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.045610340350237685,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047537,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tJCV3miBMBbJoQ5KVL5GnC","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0456103403502376,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004752,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nRhC43dgJ576icoywiE43t","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3648827228019008,"cy":0.1,"cz":0.24232607555784988,"lx":0.0912206807004752,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fY9urdYNGp76qQUc5TkF8d","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3677465315760693,"cy":0.1,"cz":-0.24232607555784988,"lx":0.08549306315213832,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kwvhmrhVppPu21YKVKixoa","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3381519543630691,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373387,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nZtTu7kGPQBjfFfeNj7L7w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3381519543630691,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373387,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"433Qj5XWec6xkx6KMSVinb","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3381519543630691,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373387,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tPa2K6uLM9bNJjLjnApS5w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3381519543630691,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373387,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cAQmf2baCS5Y2WWh241r8n","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.228051701751188,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1fmjy8Zg2jNAAXJDNAtxtX","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4104930631521384,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vxHToBs6fvSBn4dmam1NPh","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Juro","cx":-1.8455745212476522,"cy":-6.047134973310751,"cz":0.042986158281564275,"lx":0.494,"ly":0.494,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"hszWAAkWMHNQoK3CMWw8fv","id":"pBBZ6mrTSk6FLL8v8uuPYG","selected":false},{"type":"Wall","cx":0.6394231663265257,"cy":5.872000955672556,"cz":2.2408122612280286,"lx":10.96242641823205,"ly":0.3,"lz":5.158338809071295,"leftJoints":["sLjmied5ovE5nNuq6aFYPi"],"rightJoints":["723nwVCZT2zzcwYqNJCWVS"],"leftPoint":[6.120636375442551,5.872000955672555,0],"rightPoint":[-4.8417900427894995,5.872000955672556,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"iwGA1TfwpSpggq8C9JfAoJ","parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"wqXe9pYmicSvR7iYewPLF7","selected":false,"leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.31927238245166323,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004752,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cXa45JVn2G9m2N2fUuSH2s","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31927238245166323,"cy":0.1,"cz":0.24232607555784988,"lx":0.0912206807004752,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iJdJ7WAwuh83JHVXJKYXzH","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.045610340350237685,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047537,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dkUReYpnmAcqhYPPyQxoRH","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0456103403502376,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004752,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aFrtgne6bioyotbdk5S8KN","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3648827228019008,"cy":0.1,"cz":0.24232607555784988,"lx":0.0912206807004752,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aEweEoYSW7Np4EVuX2Fdsb","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3677465315760693,"cy":0.1,"cz":-0.24232607555784988,"lx":0.08549306315213832,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4xUmcM8pypieKfKsDMRcGC","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":6.12063637544255,"cy":0.696812767580496,"cz":2.2301039869226305,"lx":10.35037637618412,"ly":0.3,"lz":5.158338809071295,"leftJoints":["hZoCtb7QW6TLTCnow7LXWA"],"rightJoints":["iwGA1TfwpSpggq8C9JfAoJ"],"leftPoint":[6.120636375442548,-4.478375420511564,0],"rightPoint":[6.120636375442552,5.872000955672556,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"sLjmied5ovE5nNuq6aFYPi","parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"wqXe9pYmicSvR7iYewPLF7","selected":false,"leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"centerRoofHeight":[0.17663019315906894,8.721280120974388],"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.3381519543630691,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373387,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5cz4chLixfxh7WLLDakTKw","parentId":"sLjmied5ovE5nNuq6aFYPi","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3381519543630691,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373387,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nGCDuaQuHsagkRRXKZrc7L","parentId":"sLjmied5ovE5nNuq6aFYPi","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3381519543630691,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373387,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8t3b9gLTjPqXrVKA67DgG7","parentId":"sLjmied5ovE5nNuq6aFYPi","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3381519543630691,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373387,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pVYrF6C2mmp9q8PmrhehV8","parentId":"sLjmied5ovE5nNuq6aFYPi","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-4.8417900427894995,"cy":0.696812767580496,"cz":2.228839888904333,"lx":10.35037637618412,"ly":0.3,"lz":5.158338809071295,"leftJoints":["iwGA1TfwpSpggq8C9JfAoJ"],"rightJoints":["hZoCtb7QW6TLTCnow7LXWA"],"leftPoint":[-4.841790042789499,5.872000955672556,0],"rightPoint":[-4.8417900427894995,-4.478375420511564,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"723nwVCZT2zzcwYqNJCWVS","parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"wqXe9pYmicSvR7iYewPLF7","selected":false,"leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"centerRoofHeight":[-0.17663019315906894,8.721280120974388],"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.289844532311202,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373401,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bCczr2bfNJ9hHru5dKivtn","parentId":"723nwVCZT2zzcwYqNJCWVS","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.289844532311202,"cy":0.1,"cz":-0.24232607555784985,"lx":0.09661484410373396,"ly":0.3,"lz":0.2907912906694198,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8hu972Coyp2SdPeApdzUcM","parentId":"723nwVCZT2zzcwYqNJCWVS","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2880871761594032,"cy":0.1,"cz":0.24232607555784988,"lx":0.10012955640733165,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"stJETXTgkaem9cnthaz7DF","parentId":"723nwVCZT2zzcwYqNJCWVS","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.289844532311202,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373405,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8uMuJn7ATgkV1KuyvniGpN","parentId":"723nwVCZT2zzcwYqNJCWVS","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6394231663265262,"cy":-4.478375420511564,"cz":2.268765007024547,"lx":10.962426418232052,"ly":0.3,"lz":5.158338809071295,"leftJoints":["723nwVCZT2zzcwYqNJCWVS"],"rightJoints":["sLjmied5ovE5nNuq6aFYPi"],"leftPoint":[-4.8417900427894995,-4.478375420511564,0],"rightPoint":[6.120636375442552,-4.478375420511564,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"hZoCtb7QW6TLTCnow7LXWA","parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"wqXe9pYmicSvR7iYewPLF7","selected":false,"leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.4104930631521381,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004747,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hQMgr7y3LyHNDTRRkE594t","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Door","cx":-0.022805170175118798,"cy":0,"cz":-0.25,"lx":0.1368310210507128,"ly":0,"lz":0.5,"color":"white","textureType":"Door Texture #1","normal":[0,1,0],"rotation":[0,0,0],"id":"qph4faDddEH8gdVzH6ivZr","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","selected":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0.228051701751188,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n6cw2a16gnaNtUX8qEggGq","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.41049306315213846,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047536,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tPpwv4eAJzufaa29tD1UJG","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.228051701751188,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vTVeGVzfHjGyBh4GUdsJTK","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.228051701751188,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"88gwLvpD9kwfDsBZHSLpf2","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4104930631521384,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047512,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"taea46Jq5kmPKnsEuNdHWM","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.228051701751188,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s6dPHQVJrM3Acf87nyeVab","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4104930631521384,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j8XTJHQPmBNW4amR5ZNmdA","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"id":"wqXe9pYmicSvR7iYewPLF7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","roofType":"Gable","textureType":"Roof Texture #2","thickness":0.15,"wallsId":["hZoCtb7QW6TLTCnow7LXWA"],"ridgeLeftPoint":[-0.17663019315906894,1],"ridgeRightPoint":[0.17663019315906894,1],"selected":false,"rise":3.562941311903093,"ceiling":false},{"type":"Foundation","cx":11.036197795997648,"cy":-0.3904739664770651,"cz":0.05,"lx":16.58973102119719,"ly":15.125130138250977,"lz":0.0859723134845216,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hszWAAkWMHNQoK3CMWw8fv","selected":false,"showLabel":true,"label":"Saltbox","labelHeight":9,"labelSize":0.5}],"sceneRadius":25,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,19.9999999999895],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-21.088801690415984,-18.193636596891952,4.218925791626301],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":17.147500000000004,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"forestgreen","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-1.8484762737245803,-0.01599768987763376,3.116362939071387],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":234,"height":61}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Colonial vs. saltbox"]}')},463:function(e){e.exports=JSON.parse('{"docid":"kZU7r98YD2swbMpBZrHNnd","time":"06/12/2023 10:32 am","timestamp":1686580347333,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022 10:15:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":14.613120903558068,"solarUpdraftTower":{},"parentId":"Ground","cx":-9.804203725230073,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.08530001295248146,"type":"Foundation","solarPowerTower":{},"lx":18.159918676696766,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"label":"Gambrel ","labelHeight":9,"labelSize":0.5,"showLabel":true},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":4,"roofId":"sfGxVh6UQ5Rh5eXQutdage","ly":0.3,"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[6.699943397855505,5.67322456909281,0.1],"type":"Wall","rightRoofHeight":4,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.6999433978555056,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.6732245690928105,"color":"#f44e3b","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.699943397855504,"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"cy":0.6732245690928105,"leftRoofHeight":4,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":4,"centerRoofHeight":[0,8],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":4,"roofId":"sfGxVh6UQ5Rh5eXQutdage","centerLeftRoofHeight":[-0.35,6],"centerRightRoofHeight":[0.35,6],"color":"#f44e3b","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"lx":10,"windows":[],"lz":4,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"sfGxVh6UQ5Rh5eXQutdage","selected":false,"cy":0.6732245690928105,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0,8],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4,"ly":0.3,"cx":-5.300056602144494,"centerLeftRoofHeight":[-0.35,6],"centerRightRoofHeight":[0.35,6],"color":"#f44e3b","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"showLabel":false,"cx":0.6999433978555061,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-4.3267754309071895,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"sfGxVh6UQ5Rh5eXQutdage","leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"ly":0.3,"lz":4,"leftRoofHeight":4,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4,"lx":12,"color":"#f44e3b","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","showLabel":false,"ly":0,"lz":0.375,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.0625,"selected":false,"cx":-0.375,"normal":[0,0,1],"lx":0.08333333333333333,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.06249999999999989,"normal":[0,0,1],"cx":-0.20833333333333334,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0,"lz":0.3749999999999998,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.20833333333333337,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333341,"color":"#ffffff","cz":-0.0625,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0,"selected":false,"lz":0.375,"type":"Window","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.375,"cy":0.1,"cz":-0.06250000000000006,"lz":0.3749999999999999,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333341,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"lz":0.375,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#ffffff","lx":0.1,"cx":0.3,"cz":-0.0625,"ly":0,"showLabel":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0,"selected":false,"type":"Window","foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0.1,"cz":-0.0625,"id":"9k4wgdGyyHM5BC1r2nJbQH","lx":0.1,"color":"#ffffff","lz":0.375,"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","rotation":[0,0,0],"cx":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.3,"rotation":[0,0,0],"type":"Window","lz":0.375,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":-0.0625,"lx":0.09999999999999995,"color":"#ffffff","cy":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0,"lz":0.375,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0,"lz":0.375,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.1875,"lx":0.16666666666666666,"ly":0,"lz":0.625,"textureType":"Door Texture #6","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"j9wJCoWK33fz7y9VeMvYET","color":"white","doorType":"Default","archHeight":1,"filled":true},{"type":"Roof","thickness":0.2,"cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"roofType":"Gambrel","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"Roof Texture #1","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"sfGxVh6UQ5Rh5eXQutdage","color":"#666666","rise":4,"ceiling":false,"frontRidgePoint":[0.35,0.5],"backRidgePoint":[0.35,0.5],"topRidgePoint":[0,1]},{"type":"Human","name":"Jeanette","cx":0.21229430424866003,"cy":-5.637713455371184,"cz":0.05000000074505806,"lx":0.4,"ly":0.4,"lz":1.62,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false},{"type":"Window","cx":-0.3500000000000001,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xvSfp96ouDUqqhbUKFAfvN","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uMr1zC8iUpUcFHuHfA3LNb","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3500000000000001,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nTJAtH1bkusjTMRvTpeUq1","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":0.9375,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wJizEa8fmJx3s6DnYFJCaB","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":0.9375,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fcbYfWunuYUDKu74uGTtE2","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.041666666666666664,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e5UwypTCfHps6bAP47dvKX","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["aJzBKycDgPV2XFyreGUWbN"],"rightJoints":["q3QyrcfYtaEUJUy3dDMe3o"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"ajX6DE1iwh52m5aYDEnUZw","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"mV7ZzdDseX98dNDS9YnHz7","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"f27adUV1mvqbvyHKYmSuV2","parentId":"ajX6DE1iwh52m5aYDEnUZw","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tWZGLDh66KAhJVvZqAMQj9","parentId":"ajX6DE1iwh52m5aYDEnUZw","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.041666666666666664,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mpyjLbrKcGFUF8TjcaBsHx","parentId":"ajX6DE1iwh52m5aYDEnUZw","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["vZvx6xJpNjwVutXgBYTqDu"],"rightJoints":["ajX6DE1iwh52m5aYDEnUZw"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"aJzBKycDgPV2XFyreGUWbN","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"mV7ZzdDseX98dNDS9YnHz7","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.3500000000000001,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wAVcmtVfsGGWzQD4FYwZNW","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u5BLpPtdFZZZhqt5769cX6","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3500000000000001,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3kDRvtG74CSaYS7Hdz4Zf9","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["ajX6DE1iwh52m5aYDEnUZw"],"rightJoints":["vZvx6xJpNjwVutXgBYTqDu"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"q3QyrcfYtaEUJUy3dDMe3o","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"mV7ZzdDseX98dNDS9YnHz7","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.3,"cy":0.1,"cz":-0.0625,"lx":0.1,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gyFrbE3iZarFXfLEH1H67R","parentId":"q3QyrcfYtaEUJUy3dDMe3o","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.1,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"unBvd3fv6vjx3w5z7xjUYQ","parentId":"q3QyrcfYtaEUJUy3dDMe3o","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3,"cy":0.1,"cz":-0.0625,"lx":0.09999999999999995,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"a5UaEaWbJaymLnXeqKPnVG","parentId":"q3QyrcfYtaEUJUy3dDMe3o","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["q3QyrcfYtaEUJUy3dDMe3o"],"rightJoints":["aJzBKycDgPV2XFyreGUWbN"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"vZvx6xJpNjwVutXgBYTqDu","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"mV7ZzdDseX98dNDS9YnHz7","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.375,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2GCuByhTAXSLeW2Qg1rbmy","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":-0.06249999999999989,"lx":0.08333333333333333,"ly":0.3,"lz":0.3749999999999998,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jqoCSv6SGc3CUNj2d3NntP","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20833333333333337,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333341,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fHoEdLPaiDXqCueBgeDdLS","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.375,"cy":0.1,"cz":-0.06250000000000006,"lx":0.08333333333333341,"ly":0.3,"lz":0.3749999999999999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cDtJU4W55HjRmy9cDhmm6R","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.1875,"lx":0.16666666666666666,"ly":0,"lz":0.625,"color":"white","textureType":"Door Texture #6","normal":[0,1,0],"rotation":[0,0,0],"id":"9M7tkz3sEgnV2Z9JRHNunf","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","selected":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Human","name":"Jett","cx":0.21229430424866003,"cy":-5.637713455371184,"cz":0.05000000074505806,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"fbbzRkZEo4AnT3QEsWR9oP","selected":false},{"type":"Foundation","cx":10.097000941178736,"cy":0.15684188850117087,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hM4gzHVfAcT1HDeDhXqfQE","selected":false,"label":"Mansard","labelHeight":9,"labelSize":0.5,"showLabel":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","roofStructure":"Default","wallsId":["vZvx6xJpNjwVutXgBYTqDu"],"ridgeWidth":1.3796830302831236,"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","id":"mV7ZzdDseX98dNDS9YnHz7","rise":2.8592746089260386,"ceiling":false},{"type":"Window","cx":-1.7044433380331139,"cy":-4.015924463712854,"cz":5.284591699130502,"lx":1,"ly":0.2,"lz":1.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.2587938987974363,0,0],"parentId":"mV7ZzdDseX98dNDS9YnHz7","parentType":"Roof","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","id":"cH5YJR4J6bQYpX3WB9k67N"},{"type":"Window","cx":-2.7018576414835405,"cy":-1.2664219595013968,"cz":7.091630555089024,"lx":1,"ly":0.2,"lz":1.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.519146114246523,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"1DzhW8vmdxVB9mcmU4b6BC"},{"type":"Window","cx":4.341146883752691,"cy":-1.251091065564622,"cz":7.1103910909217225,"lx":1,"ly":0.2,"lz":1.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.519146114246523,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"8aBtPjYUmoaUgGD59eww1P"},{"type":"Window","cx":3.2042827482748226,"cy":-4.014959357661002,"cz":5.287583934394446,"lx":1,"ly":0.2,"lz":1.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.2587938987974363,0,0],"parentId":"mV7ZzdDseX98dNDS9YnHz7","parentType":"Roof","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","id":"g7sgiaMwM5so3QfreNjMbC"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-21.571150309425594,-21.972462076133603,4.616004408449201],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":31.733468832186787,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.5906667798973315,5.766093748984623,2.3165783316967063],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":318,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Gambrel roof vs. mansard roof"]}')},464:function(e){e.exports=JSON.parse('{"docid":"qbfYd6J3bjVQWhg6gmeyL9","time":"03/21/2023 09:11 am","timestamp":1679404281857,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"7/22/2022, 5:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"1600 Pennsylvania Avenue NW, Washington, DC 20500, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":38.8976763,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-77.0365298,"airConvectiveCoefficient":5,"diurnalTemperatureModel":1,"highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"sutDaysPerYear":4,"sutGridCellSize":1,"noAnimationForSolarUpdraftTowerSimulation":false},"elements":[{"type":"Foundation","cx":2.437186281961438,"cy":4.616260107535155,"cz":0.15,"lx":74.26384799474762,"ly":70.57289198325788,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3Qmj2gXj2Lmc28MbpT7BdQ","enableGroupMaster":true,"locked":false,"textureType":"Foundation Texture #4"},{"type":"Wall","cx":-27.296564319985823,"cy":-3.2481977926108314,"cz":0,"lx":27,"ly":0.8,"lz":15,"relativeAngle":4.71238898038469,"leftPoint":[-27.296564319985823,10.251802207389169,0.25],"rightPoint":[-27.296564319985823,-16.74819779261083,0.25],"leftJoints":["jF3H99H3SvFmx1EtcFgSUR"],"rightJoints":["qEgP3g76n6YGpTNdaUNRJ5"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"u5UupDCTgXC6oFiX9y4uby","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-1.7965643199858263,"cy":10.251802207389169,"cz":0,"lx":51,"ly":0.8,"lz":15,"relativeAngle":3.141592653589793,"leftPoint":[23.703435680014174,10.251802207389169,0.25],"rightPoint":[-27.296564319985823,10.251802207389169,0.25],"leftJoints":["pkajzTvgP9i43n8Xx6zTrw"],"rightJoints":["u5UupDCTgXC6oFiX9y4uby"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"jF3H99H3SvFmx1EtcFgSUR","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":23.703435680014174,"cy":-2.7481977926108314,"cz":0,"lx":26,"ly":0.8,"lz":15,"relativeAngle":1.5707963267948966,"leftPoint":[23.703435680014174,-15.748197792610831,0.25],"rightPoint":[23.703435680014174,10.251802207389169,0.25],"leftJoints":["vsV2452bmxt8JnQXXqBe5N"],"rightJoints":["jF3H99H3SvFmx1EtcFgSUR"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"pkajzTvgP9i43n8Xx6zTrw","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-19.046564319985826,"cy":-16.74819779261083,"cz":3.733120462951788,"lx":16.5,"ly":0.8,"lz":15,"relativeAngle":0,"leftPoint":[-27.296564319985823,-16.74819779261083,0.25],"rightPoint":[-10.796564319985826,-16.74819779261083,0.25],"leftJoints":["u5UupDCTgXC6oFiX9y4uby"],"rightJoints":["oHVfosgpAEPgTvFqa59jhu"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"qEgP3g76n6YGpTNdaUNRJ5","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":15.453435680014174,"cy":-15.748197792610831,"cz":0,"lx":16.5,"ly":0.8,"lz":15,"relativeAngle":0,"leftPoint":[7.203435680014174,-15.748197792610831,0.25],"rightPoint":[23.703435680014174,-15.748197792610831,0.25],"leftJoints":["3nWwhqzYyg3BoBTyzmSgQv"],"rightJoints":["pkajzTvgP9i43n8Xx6zTrw"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"vsV2452bmxt8JnQXXqBe5N","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":6.953435680014174,"cy":-16.74819779261083,"cz":0,"lx":2.0615528128088303,"ly":0.8,"lz":15,"relativeAngle":1.3258176636680323,"leftPoint":[6.703435680014174,-17.74819779261083,0.25],"rightPoint":[7.203435680014174,-15.748197792610831,0.25],"leftJoints":["juEYyWFfCjJDE4b169Lr6e"],"rightJoints":["vsV2452bmxt8JnQXXqBe5N"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"3nWwhqzYyg3BoBTyzmSgQv","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-10.546564319985826,"cy":-17.49819779261083,"cz":0,"lx":1.5811388300841898,"ly":0.8,"lz":15,"relativeAngle":5.034139534781332,"leftPoint":[-10.796564319985826,-16.74819779261083,0.25],"rightPoint":[-10.296564319985826,-18.24819779261083,0.25],"leftJoints":["qEgP3g76n6YGpTNdaUNRJ5"],"rightJoints":["7KCjLbvxBFDXSftkUZDS2v"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"oHVfosgpAEPgTvFqa59jhu","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-9.546564319985826,"cy":-19.24819779261083,"cz":0,"lx":2.5,"ly":0.8,"lz":15,"relativeAngle":5.355890089177974,"leftPoint":[-10.296564319985826,-18.24819779261083,0.25],"rightPoint":[-8.796564319985826,-20.24819779261083,0.25],"leftJoints":["oHVfosgpAEPgTvFqa59jhu"],"rightJoints":["oSmqM3WG97smXJFvN7dA25"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"7KCjLbvxBFDXSftkUZDS2v","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-8.046564319985826,"cy":-20.99819779261083,"cz":0,"lx":2.1213203435596424,"ly":0.8,"lz":15,"relativeAngle":5.497787143782137,"leftPoint":[-8.796564319985826,-20.24819779261083,0.25],"rightPoint":[-7.296564319985826,-21.74819779261083,0.25],"leftJoints":["7KCjLbvxBFDXSftkUZDS2v"],"rightJoints":["6BCCjk22xgQQ9jwAeGEMpR"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"oSmqM3WG97smXJFvN7dA25","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-6.546564319985826,"cy":-22.24819779261083,"cz":0,"lx":1.8027756377319946,"ly":0.8,"lz":15,"relativeAngle":5.6951827036320175,"leftPoint":[-7.296564319985826,-21.74819779261083,0.25],"rightPoint":[-5.796564319985826,-22.74819779261083,0.25],"leftJoints":["oSmqM3WG97smXJFvN7dA25"],"rightJoints":["mrpM4sL27ca3MHv3JwptDB"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"6BCCjk22xgQQ9jwAeGEMpR","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-4.796564319985826,"cy":-23.24819779261083,"cz":0,"lx":2.23606797749979,"ly":0.8,"lz":15,"relativeAngle":5.81953769817878,"leftPoint":[-5.796564319985826,-22.74819779261083,0.25],"rightPoint":[-3.7965643199858263,-23.74819779261083,0.25],"leftJoints":["6BCCjk22xgQQ9jwAeGEMpR"],"rightJoints":["onQ3RZrBRz8TRewvvY3dTV"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"mrpM4sL27ca3MHv3JwptDB","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-2.7965643199858263,"cy":-23.74819779261083,"cz":0,"lx":1.9999999999999998,"ly":0.8,"lz":15,"relativeAngle":0,"leftPoint":[-3.7965643199858263,-23.74819779261083,0.25],"rightPoint":[-1.7965643199858263,-23.74819779261083,0.25],"leftJoints":["mrpM4sL27ca3MHv3JwptDB"],"rightJoints":["cKAWjnd2X23kJ1QdKrzyaP"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"onQ3RZrBRz8TRewvvY3dTV","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureWidth":0.7,"structureSpacing":5,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-0.7965643199858263,"cy":-23.49819779261083,"cz":0,"lx":2.0615528128088303,"ly":0.8,"lz":15,"relativeAngle":0.24497866312686423,"leftPoint":[-1.7965643199858263,-23.74819779261083,0.25],"rightPoint":[0.20343568001417367,-23.24819779261083,0.25],"leftJoints":["onQ3RZrBRz8TRewvvY3dTV"],"rightJoints":["ksg7ADGGcB7LaHQWR2gDoP"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"cKAWjnd2X23kJ1QdKrzyaP","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":0.9534356800141737,"cy":-22.99819779261083,"cz":0,"lx":1.5811388300841898,"ly":0.8,"lz":15,"relativeAngle":0.32175055439664213,"leftPoint":[0.20343568001417367,-23.24819779261083,0.25],"rightPoint":[1.7034356800141737,-22.74819779261083,0.25],"leftJoints":["cKAWjnd2X23kJ1QdKrzyaP"],"rightJoints":["tjit5nfeyfk7MgJnZwEuUo"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"ksg7ADGGcB7LaHQWR2gDoP","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":2.4534356800141737,"cy":-22.24819779261083,"cz":0,"lx":1.8027756377319946,"ly":0.8,"lz":15,"relativeAngle":0.588002603547567,"leftPoint":[1.7034356800141737,-22.74819779261083,0.25],"rightPoint":[3.2034356800141737,-21.74819779261083,0.25],"leftJoints":["ksg7ADGGcB7LaHQWR2gDoP"],"rightJoints":["2aizppjx7nR9dWK7oFqe3X"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"tjit5nfeyfk7MgJnZwEuUo","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":3.9534356800141737,"cy":-21.24819779261083,"cz":0,"lx":1.8027756377319946,"ly":0.8,"lz":15,"relativeAngle":0.588002603547567,"leftPoint":[3.2034356800141737,-21.74819779261083,0.25],"rightPoint":[4.703435680014174,-20.74819779261083,0.25],"leftJoints":["tjit5nfeyfk7MgJnZwEuUo"],"rightJoints":["8ocZPrJmGusu3tZWJzWvDk"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"2aizppjx7nR9dWK7oFqe3X","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":5.203435680014174,"cy":-20.24819779261083,"cz":0,"lx":1.4142135623730951,"ly":0.8,"lz":15,"relativeAngle":0.7853981633974483,"leftPoint":[4.703435680014174,-20.74819779261083,0.25],"rightPoint":[5.703435680014174,-19.74819779261083,0.25],"leftJoints":["2aizppjx7nR9dWK7oFqe3X"],"rightJoints":["juEYyWFfCjJDE4b169Lr6e"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"8ocZPrJmGusu3tZWJzWvDk","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":6.203435680014174,"cy":-18.74819779261083,"cz":0,"lx":2.23606797749979,"ly":0.8,"lz":15,"relativeAngle":1.1071487177940904,"leftPoint":[5.703435680014174,-19.74819779261083,0.25],"rightPoint":[6.703435680014174,-17.74819779261083,0.25],"leftJoints":["8ocZPrJmGusu3tZWJzWvDk"],"rightJoints":["3nWwhqzYyg3BoBTyzmSgQv"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"juEYyWFfCjJDE4b169Lr6e","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["oHVfosgpAEPgTvFqa59jhu","7KCjLbvxBFDXSftkUZDS2v","oSmqM3WG97smXJFvN7dA25","6BCCjk22xgQQ9jwAeGEMpR","mrpM4sL27ca3MHv3JwptDB","onQ3RZrBRz8TRewvvY3dTV","cKAWjnd2X23kJ1QdKrzyaP","ksg7ADGGcB7LaHQWR2gDoP","tjit5nfeyfk7MgJnZwEuUo","2aizppjx7nR9dWK7oFqe3X","8ocZPrJmGusu3tZWJzWvDk","juEYyWFfCjJDE4b169Lr6e","3nWwhqzYyg3BoBTyzmSgQv","vsV2452bmxt8JnQXXqBe5N","pkajzTvgP9i43n8Xx6zTrw","jF3H99H3SvFmx1EtcFgSUR","u5UupDCTgXC6oFiX9y4uby","qEgP3g76n6YGpTNdaUNRJ5"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"kKLW3PicqjFWjN5PqUDTTj","locked":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":1.202928279289015,"cy":-0.8889074596387783,"cz":0.1,"lx":64.84314999489811,"ly":43.56565669817109,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"b7DVyKfyTBHZGANbVbGoYG","locked":false},{"type":"Wall","cx":-0.1363522997348845,"cy":12.047335526575006,"cz":0,"lx":44,"ly":0.3,"lz":17,"relativeAngle":3.141592653589793,"leftPoint":[21.863647700265116,12.047335526575006,0.2],"rightPoint":[-22.136352299734884,12.04733552657501,0.2],"leftJoints":["sEoC32EE5BhvottJbmBN7P"],"rightJoints":["r8Aw9XiLCw9kPKUMgd3t6u"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"gtmtUrJvJf5sJGi7m3ucvT","roofId":"dnGfHzSjH6Qt6pNJ8jFJUj","leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":16.110000000000003,"rightUnfilledHeight":16.110000000000003,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-21.886352299734884,"cy":2.5473355265750053,"cz":0,"lx":19.00657780874821,"ly":0.3,"lz":17,"relativeAngle":4.738698697637612,"leftPoint":[-22.136352299734884,12.047335526575006,0.2],"rightPoint":[-21.636352299734884,-6.952664473424995,0.2],"leftJoints":["gtmtUrJvJf5sJGi7m3ucvT"],"rightJoints":["rxcHxAK8KNRZb3EZ7ovrqm"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"r8Aw9XiLCw9kPKUMgd3t6u","roofId":"dnGfHzSjH6Qt6pNJ8jFJUj","leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":16.110000000000003,"rightUnfilledHeight":16.110000000000003,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":0.1136477002651155,"cy":-6.952664473424995,"cz":0,"lx":43.5,"ly":0.3,"lz":17,"relativeAngle":0,"leftPoint":[-21.636352299734884,-6.952664473424995,0.2],"rightPoint":[21.863647700265116,-6.952664473424995,0.2],"leftJoints":["r8Aw9XiLCw9kPKUMgd3t6u"],"rightJoints":["sEoC32EE5BhvottJbmBN7P"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"rxcHxAK8KNRZb3EZ7ovrqm","roofId":"dnGfHzSjH6Qt6pNJ8jFJUj","leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":16.014014541320304,"rightUnfilledHeight":16.014014541320304,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":21.863647700265116,"cy":2.5473355265750053,"cz":0,"lx":19,"ly":0.3,"lz":17,"relativeAngle":1.5707963267948966,"leftPoint":[21.863647700265116,-6.952664473424995,0.2],"rightPoint":[21.863647700265116,12.047335526575006,0.2],"leftJoints":["rxcHxAK8KNRZb3EZ7ovrqm"],"rightJoints":["gtmtUrJvJf5sJGi7m3ucvT"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"sEoC32EE5BhvottJbmBN7P","roofId":"dnGfHzSjH6Qt6pNJ8jFJUj","leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":16.110000000000003,"rightUnfilledHeight":16.110000000000003,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","roofStructure":"Default","wallsId":["rxcHxAK8KNRZb3EZ7ovrqm"],"ridgeWidth":1.6897028772572007,"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"dnGfHzSjH6Qt6pNJ8jFJUj","locked":false,"rise":1.1924072822886274,"ceiling":false},{"type":"Foundation","cx":2.0776940726226174,"cy":18.14658482221914,"cz":0.1,"lx":23.456509054864263,"ly":24.556989889910795,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"sQbhet5xpiSK5NzTWtub4a","locked":false},{"type":"Wall","cx":-8.831120616583963,"cy":0.3221979196479152,"cz":0,"lx":17.297870029495435,"ly":0.5,"lz":15,"relativeAngle":-1.5707963267948966,"leftPoint":[-8.831120616583963,8.971132934395634,0],"rightPoint":[-8.831120616583963,-8.326737095099803,0],"leftJoints":["7QCAeFgCM4uwoEq1rdWfs2"],"rightJoints":["ue429MHHFRd7tE3xfNNNHx"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"8kN3EwUCnSjrTbu7YtQvQY","roofId":"89u35YTLctNXWRDNsxwcpj","wallStructure":"Pillar","opacity":0,"structureSpacing":6,"structureWidth":1,"structureColor":"white","locked":false,"leftRoofHeight":15,"rightRoofHeight":15,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-1.165400792362441,"cy":8.971132934395634,"cz":0,"lx":15.331439648443038,"ly":0.8,"lz":15,"relativeAngle":3.141592653589793,"leftPoint":[6.500319031859077,8.971132934395634,0],"rightPoint":[-8.83112061658396,8.971132934395634,0],"leftJoints":["cCcLVBABwpzcuXp9FsPst3"],"rightJoints":["8kN3EwUCnSjrTbu7YtQvQY"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"7QCAeFgCM4uwoEq1rdWfs2","roofId":"89u35YTLctNXWRDNsxwcpj","wallStructure":"Pillar","opacity":0,"structureSpacing":5.6,"structureWidth":1,"structureColor":"white","locked":false,"leftRoofHeight":15,"rightRoofHeight":15,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":6.500319031859077,"cy":0.3221979196479152,"cz":0,"lx":17.297870029495435,"ly":0.5,"lz":15,"relativeAngle":1.5707963267948966,"leftPoint":[6.500319031859077,-8.326737095099803,0],"rightPoint":[6.500319031859077,8.971132934395634,0],"leftJoints":["ue429MHHFRd7tE3xfNNNHx"],"rightJoints":["7QCAeFgCM4uwoEq1rdWfs2"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"cCcLVBABwpzcuXp9FsPst3","roofId":"89u35YTLctNXWRDNsxwcpj","wallStructure":"Pillar","opacity":0,"structureSpacing":6,"structureWidth":1,"structureColor":"white","locked":false,"leftRoofHeight":15,"rightRoofHeight":15,"fill":"Full","eavesLength":0.6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-1.1654007923624428,"cy":-8.326737095099803,"cz":0,"lx":15.331439648443041,"ly":0.5,"lz":15,"relativeAngle":0,"leftPoint":[-8.831120616583963,-8.326737095099803,0],"rightPoint":[6.500319031859077,-8.326737095099803,0],"leftJoints":["8kN3EwUCnSjrTbu7YtQvQY"],"rightJoints":["cCcLVBABwpzcuXp9FsPst3"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"ue429MHHFRd7tE3xfNNNHx","roofId":"89u35YTLctNXWRDNsxwcpj","structureSpacing":5.6,"structureWidth":1,"wallStructure":"Default","structureColor":"white","opacity":0.5,"locked":false,"leftRoofHeight":15,"rightRoofHeight":15,"fill":"Full","eavesLength":0.6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-1.459252183107493,"cy":4.715511268475593,"cz":0,"lx":8.560946140897292,"ly":0.3,"lz":17,"leftJoints":["gpDtE9g3zjB5xUcdy4p2bn"],"rightJoints":["ozPT6yyjumU6Hv81G3owfN"],"leftPoint":[2.821220887341153,4.715511268475593,0],"rightPoint":[-5.739725253556139,4.715511268475594,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"cGxpdDXk7BPKiVfi6VxNx9","parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofId":"3DT5vkx2wE8Avqo6NjE3qK","selected":false,"leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-5.691083514119223,"cy":1.2695607261280444,"cz":0,"lx":6.89258765896258,"ly":0.3,"lz":17,"leftJoints":["cGxpdDXk7BPKiVfi6VxNx9"],"rightJoints":["2zvZ3adRvEkJq9fVPEEKKi"],"leftPoint":[-5.739725253556139,4.715511268475593,0],"rightPoint":[-5.642441774682306,-2.1763898162195043,0],"relativeAngle":-1.5566816409948834,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ozPT6yyjumU6Hv81G3owfN","parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofId":"3DT5vkx2wE8Avqo6NjE3qK","selected":false,"leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-1.4106104436705764,"cy":-2.1763898162195043,"cz":0,"lx":8.46366266202346,"ly":0.3,"lz":17,"leftJoints":["ozPT6yyjumU6Hv81G3owfN"],"rightJoints":["gpDtE9g3zjB5xUcdy4p2bn"],"leftPoint":[-5.642441774682306,-2.1763898162195043,0],"rightPoint":[2.821220887341153,-2.1763898162195043,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"2zvZ3adRvEkJq9fVPEEKKi","parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofId":"3DT5vkx2wE8Avqo6NjE3qK","selected":false,"leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":2.821220887341153,"cy":1.2695607261280444,"cz":0,"lx":6.891901084695098,"ly":0.3,"lz":17,"leftJoints":["2zvZ3adRvEkJq9fVPEEKKi"],"rightJoints":["cGxpdDXk7BPKiVfi6VxNx9"],"leftPoint":[2.821220887341153,-2.1763898162195043,0],"rightPoint":[2.821220887341153,4.715511268475593,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"gpDtE9g3zjB5xUcdy4p2bn","parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofId":"3DT5vkx2wE8Avqo6NjE3qK","selected":false,"leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"id":"3DT5vkx2wE8Avqo6NjE3qK","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofType":"Mansard","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["2zvZ3adRvEkJq9fVPEEKKi"],"ridgeWidth":1.6897028772572007,"selected":false,"locked":false,"rise":1.1924072822886274,"ceiling":false},{"type":"Foundation","cx":2.1156734519362868,"cy":-14.279123441940943,"cz":0.1,"lx":15.481779487215247,"ly":15.111518843057006,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cyVPK1qLJT1KbaGL6qLYHA","selected":false,"locked":false},{"type":"Window","cx":-0.2878787878787879,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#b3b3b3","normal":[0,0,1],"rotation":[0,0,0],"parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"5TpJDxszAzRvyQ2NqfKkn9","opacity":0.5,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.045454545454545456,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"isnfsXJ1sYeWDDj1v3HAcy","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19696969696969696,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rjznXiHLyLsFZBtBqoe6me","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4393939393939394,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hRT3G1Qxj9ddwfGbVmjK67","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.4090909090909091,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4FZyv3iFANwURNdtJmSf5k","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16666666666666666,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9XgeyGKZ17bF6hmvudf1pb","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07575757575757576,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tmSZBUv79gGQEmqdHUeNBv","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3181818181818182,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hpKyGgh393UrDCYt2TFEPH","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2878787878787879,"cy":0.3,"cz":-0.15,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4AD8LAo94avXAwRxmXoTW5","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.045454545454545456,"cy":0.3,"cz":-0.15,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"o746xoPC2dwGtGgutFsDXX","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19696969696969696,"cy":0.3,"cz":-0.15,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"c53UUVUecAFBsz89jbxVYA","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4393939393939394,"cy":0.3,"cz":-0.15,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bpg8E63ShDakBXvmrGVvhc","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jedi","cx":10.792902287976906,"cy":-24.111012140339845,"cz":0.15000000596046095,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"jXBttvkEdJUcgsQyoxkJyY","selected":false,"ly":0.56,"locked":false},{"type":"Window","cx":-0.4090909090909091,"cy":0.3,"cz":-0.11666666666666667,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9D4XHpdhCgSutX6wu9btGJ","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16666666666666666,"cy":0.3,"cz":-0.11666666666666667,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gWSjVYZUm8Qw4rZTGCdJqU","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07575757575757576,"cy":0.3,"cz":-0.11666666666666667,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ssjJa1pfa5qX67vq3t3ms4","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3181818181818182,"cy":0.3,"cz":-0.11666666666666667,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cm6JHszxRa71LB4AL9o4hM","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.45098039215686275,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eGFMPp63uaJ8Z6dEip1wCT","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3627450980392157,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6g1oBhU14hr3mTV912e9dM","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2647058823529411,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nAfcKafQoUyknKRwU7zYyz","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.17647058823529407,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jdht2qsNqNvtRuTiSrxhRn","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.45098039215686275,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sMRK1zZtDamAUaaju5kzEB","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3627450980392157,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ivaEUPDqF8h1KuwffoQE9v","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2647058823529412,"cy":0.3,"cz":-0.15,"lx":0.03921568627450977,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qoUC82g8EKd6aX4rrRhS51","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.17647058823529407,"cy":0.3,"cz":-0.15,"lx":0.03921568627450987,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9G3Na6w4LghC1tGJcYYMQX","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.46078431372549017,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9zGVUoYGVo2E4qf9ZuPkby","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.37254901960784315,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pErJmrncghcaMqwr5VCYq6","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2843137254901961,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bNA5NJ5jM3rqPHYpWU9YvX","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19607843137254904,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u6JmSSS7MnsTc3abTnBiZB","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19607843137254902,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fnbrpCKzRDKtbEzFZ8278Y","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.28431372549019607,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iNCEukMLjXLvD5gbDy1xJM","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.37254901960784315,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"amzAdeamET282epqcjwyww","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.46078431372549017,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bRsXBDeYfSso6tiCqiYCUp","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3149455302863263,"cy":0.1,"cz":-0.0125,"lx":0.29836944974494073,"ly":0.5,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.8,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#b3b3b3","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7QCAeFgCM4uwoEq1rdWfs2","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"x7JsEH8PfGjJ373jxu2nH9","opacity":0,"frame":true,"locked":false,"mullionColor":"white","frameWidth":0.2,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.008288040270692798,"cy":0.1,"cz":-0.0125,"lx":0.21548904703801275,"ly":0.5,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fN7U27jHhJwVAWntrzsr1D","parentId":"7QCAeFgCM4uwoEq1rdWfs2","foundationId":"sQbhet5xpiSK5NzTWtub4a","tint":"#b3b3b3","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":false,"frameWidth":0.2,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3149455302863263,"cy":0.1,"cz":-0.0125,"lx":0.29836944974494073,"ly":0.5,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bmDtwgfufE5e4Kne2LhHZq","parentId":"7QCAeFgCM4uwoEq1rdWfs2","foundationId":"sQbhet5xpiSK5NzTWtub4a","tint":"#b3b3b3","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":false,"frameWidth":0.2,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.07843137254901958,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ascuFaQMJxzrhtJHSRpvZ2","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.107843137254902,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rSoHzPCUdtqVH7c8BRWJ1V","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0784313725490196,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tFJRnNLL8FhvzRjVcGz5Fk","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0196078431372549,"cy":0.3,"cz":-0.2833333333333333,"lx":0.0784313725490196,"ly":0.3,"lz":0.36666666666666664,"mullion":true,"mullionWidth":0.06,"mullionSpacing":5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"668rcrJyE6W7MNd2pYWoAp","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Arched","archHeight":2,"sillWidth":0},{"type":"Window","cx":0.10784313725490197,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bdPS759a6fLQqu4V2o4qtx","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Joey","cx":9.115387825475082,"cy":-24.651217406554846,"cz":0.15,"lx":0.462,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"ouHmzt9Us42w5bHjR9ZvBW","selected":false,"ly":0.462,"locked":false},{"type":"Tree","name":"Elm","cx":24.68149666528604,"cy":30.40624439575707,"cz":0.1500000059604645,"lx":12.225521614749255,"lz":8.985934888591816,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"iyZFP8cWUDsX2VGyUoGTxq","selected":false,"locked":false},{"type":"Tree","name":"Maple","cx":-33.168239841792456,"cy":33.081643759613165,"cz":0.15000000596046628,"lx":21.067617771997934,"lz":15.677323900388549,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"q5tey4s1a5vXUiiDEyFkaC","selected":false,"flip":true,"locked":false},{"type":"Tree","name":"Oak","cx":27.369492357164148,"cy":-25.522008177846573,"cz":0.1500000059604645,"lx":10.7323110159116,"lz":14.464681446457563,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"n1sQ5fcUd75QzX2Y353uNT","selected":false,"locked":false},{"type":"Tree","name":"Oak","flip":true,"cx":31.990594871051,"cy":-29.99931442147024,"cz":0.15,"lx":10.7323110159116,"lz":11.586410893659473,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"1i15CUF6r9qjPL7U2Lb6eo","selected":false,"locked":false},{"type":"Tree","name":"Oak","cx":30.9837315091143,"cy":-18.406933063455,"cz":0.15,"lx":10.7323110159116,"lz":11.586410893659473,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"tcFvkUdRjNo8qiDvEShvKP","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":12.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"tm3GiScxVp1WgzmWsLgusP","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":14.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"f2DSzggaELKVYDnQ3jkH8J","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":16.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"8NTkXiYEAz7nkqKvjnXpTs","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":18.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"5hte45etpHBPzUjLVr5M8S","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":20.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"k5NSyhh1vTCW6anr3Bnxxm","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-24.199104717917777,"cy":-19.89755183152851,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"jKAUFtG6mCpk1VKUFLbArj","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-21.70602992567401,"cy":-19.842150169478614,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"38XrzKeRncZdskEKuyybVH","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-19.37916011957982,"cy":-19.78674850742873,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"imTCPSHK1nyiQfLEdYvRSi","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-17.163093637585362,"cy":-19.78674850742873,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"mhx7saLxNPZ36vhhBgjpsi","selected":false,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Hip","roofStructure":"Default","wallsId":["8kN3EwUCnSjrTbu7YtQvQY"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"89u35YTLctNXWRDNsxwcpj","leftRidgeLength":8.635242091739931,"rightRidgeLength":10.319579264913394,"rise":3.229240477888453,"ceiling":false},{"type":"Foundation","cx":0.6163744974611483,"cy":18.71649900037034,"cz":0.5,"lx":50.85545052514254,"ly":17.97168247424439,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"#ffffff","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ustJbtTQJEeCkyVnXGayK2"},{"type":"Human","name":"Jamelia","cx":1.3448042201833577,"cy":2.8336636548560605,"cz":0.5000000000000009,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ustJbtTQJEeCkyVnXGayK2","id":"pAQhAzdRtcSEf5g4XYdKtM","selected":false,"ly":0.65},{"type":"Human","name":"Jaye","cx":4.47029660144684,"cy":5.02316777071092,"cz":0.5000000000000009,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ustJbtTQJEeCkyVnXGayK2","id":"dbe6vr9MpeAutqWYghGDv5","selected":false,"ly":0.55},{"type":"Light","decay":2,"distance":10,"intensity":10,"color":"#ff0000","cx":-0.021931798388491356,"cy":-0.31746447944889156,"cz":0.5000000198682151,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"eK4rrZPqmi6q4jMkoXNFpz","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":5,"color":"#0000ff","cx":0.15060856519114013,"cy":-0.2699408955339268,"cz":0.5000000198682151,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"fHCHUCQJQtBzqC5JVjvrVV","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":5,"color":"#0000ff","cx":-0.18847671202407354,"cy":-0.26968211451709273,"cz":0.5000000198682151,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"rLc1ZCGs7ugmXpxAb6kueG","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":5,"color":"#0000ff","cx":0.267273996418672,"cy":-0.2667264794936538,"cz":0.5000000198682121,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"tFz5GHQqyyVVxh25czH4Em","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":5,"color":"#0000ff","cx":-0.34024773885085746,"cy":-0.26354534234637206,"cz":0.5000000198682151,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"etKXiduEZtGdENpo2GRtJg","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":9,"color":"#ff00ff","cx":-0.02474975458211863,"cy":0.12239922347312886,"cz":0.49999999999999645,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ustJbtTQJEeCkyVnXGayK2","foundationId":"ustJbtTQJEeCkyVnXGayK2","id":"iPzFJUPPfWj6iSKXbVujiL","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-14.836223831491182,"cy":-19.73134684537884,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"dqcT5qczxNqZJ7sXcMUU2L","selected":false},{"type":"Polygon","cx":0.1374437866453651,"cy":-0.12111426497213049,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.526127233622693,"y":-0.4433333333333333},{"x":-0.526127233622693,"y":-0.3566666666666667},{"x":0.46529955659029343,"y":-0.3566666666666667},{"x":0.46529955659029343,"y":-0.4433333333333333}],"parentId":"7QCAeFgCM4uwoEq1rdWfs2","parentType":"Wall","foundationId":"sQbhet5xpiSK5NzTWtub4a","selected":false,"filled":true,"selectedIndex":2,"id":"2qLCC51p5mx8fVpgQpr3Zc","noOutline":true,"lineColor":"#808080","textureType":"No Polygon Texture","text":"1600","fontSize":0.6,"fontColor":"gray"}],"sceneRadius":60,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.371875648214528,21.08668963398181,0.000029433785846390654],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.371875648214528,21.086539627316288,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":19,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-18.776334866989732,67.71900500088384,8.029479005212822],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.01,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":18.05,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16A5A5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-2.188721381754669,0.6407899994531973,8.029479005212822],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showAzimuthAngle":true,"showElevationAngle":true,"showZenithAngle":true,"waterSurface":false,"solarPanelShiness":100,"windowShiness":200,"showDiurnalTemperaturePanel":false,"showEconomicsPanel":false,"showDailyUpdraftTowerYieldPanel":false,"showYearlyUpdraftTowerYieldPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"yearlyLightSensorPanelShowDaylight":false,"yearlyLightSensorPanelShowClearness":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400},"directLightIntensity":0.5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},465:function(e){e.exports=JSON.parse('{"docid":"iYCTJTjPxpfAmYmA6nDmNN","time":"06/18/2023 07:55 pm","timestamp":1687132511108,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarPanelVisibilityGridCellSize":0.2,"longitude":34.54995193372956,"diurnalTemperatureModel":1,"cspDaysPerYear":4,"discretization":"Approximate","solarRadiationHeatmapGridCellSize":0.5,"noAnimationForHeatmapSimulation":false,"dustLoss":0.05,"pvGridCellSize":0.5,"airAttenuationCoefficient":0.01,"date":"3/22/2023, 12:00:00 PM","ground":{"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05},"address":"Kocavilayet, 2929. Sk. No:1, 33110 Yeni\u015fehir/Mersin, T\xfcrkiye","timesPerHour":1,"cspGridCellSize":0.5,"daysPerYear":12,"sutTimesPerHour":1,"noAnimationForSolarPanelSimulation":false,"sutDaysPerYear":4,"countryCode":"TR","noAnimationForSolarUpdraftTowerSimulation":false,"latitude":36.81233464724704,"name":"default","sutGridCellSize":1,"highestTemperatureTimeInMinutes":900,"noAnimationForThermalSimulation":false,"airConvectiveCoefficient":5,"noAnimationForSensorDataCollection":false,"cspTimesPerHour":1},"elements":[{"cy":-2.235554730854802,"solarUpdraftTower":{},"normal":[0,0,1],"cz":0.05,"id":"2XGmuwQrQtDPGFB7FUq4gK","solarPowerTower":{},"solarAbsorberPipe":{},"lx":58.35972106577608,"rotation":[0,0,0.7770359328652141],"parentId":"Ground","textureType":"No Foundation Texture","selected":false,"type":"Foundation","cx":-2.210236108673694,"ly":32.834680769300704,"color":"#808080","hvacSystem":{"thermostatSetpoint":20,"id":"A"},"lz":0.1,"locked":true},{"normal":[0,0,1],"roofId":"byzwW7Db61R9EfVcvoWVQ9","studColor":"#ffffff","leftJoints":["vqP69iA4TuZd8ZEvPBLjzU"],"rightRoofHeight":11.5,"relativeAngle":3.141592653589793,"structureColor":"white","volumetricHeatCapacity":0.5,"lineWidth":0.2,"opacity":0.5,"textureType":"No Wall Texture","windows":[],"fill":"Full","cx":1.1731464688636888,"color":"#e9d8ba","studWidth":0.1,"ly":0.3,"leftRoofHeight":11.5,"lz":11.5,"type":"Wall","rightJoints":["6bfpYPQw2M5RbKRsLfDauC"],"studSpacing":2,"structureSpacing":2,"id":"r7FDtsVF9isPsPhYMJtzMf","showLabel":false,"parentId":"2XGmuwQrQtDPGFB7FUq4gK","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","structureWidth":0.1,"lineColor":"#000000","eavesLength":-0.05,"unfilledHeight":0.5,"lx":39,"rotation":[0,0,0],"rValue":2,"rightPoint":[-18.326853531136305,8.729078401244518,0.1],"cy":8.729078401244518,"cz":0,"selected":false,"leftPoint":[20.673146468863685,8.729078401244516,0.1],"wallStructure":"Default","parapet":{"display":true,"color":"#e9d8ba","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.5,"rightTopPartialHeight":11.5,"locked":true},{"volumetricHeatCapacity":0.5,"wallStructure":"Default","lx":17.000000000000004,"rotation":[0,0,0],"opacity":0.5,"studColor":"#ffffff","ly":0.3,"type":"Wall","fill":"Full","rightJoints":["r7FDtsVF9isPsPhYMJtzMf"],"normal":[0,0,1],"rightRoofHeight":11.5,"lineColor":"#000000","lineWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","structureWidth":0.1,"centerRoofHeight":[0,12.780523500160847],"id":"vqP69iA4TuZd8ZEvPBLjzU","selected":false,"leftPoint":[20.67314646886369,-8.27092159875549,0.1],"roofId":"byzwW7Db61R9EfVcvoWVQ9","color":"#e9d8ba","studSpacing":2,"structureSpacing":2,"cz":0,"windows":[],"structureColor":"white","cy":0.22907840124451972,"rValue":2,"leftJoints":["jE7DwieCwvfvkHcN1Bkpu2"],"cx":20.673146468863674,"leftRoofHeight":11.5,"parentId":"2XGmuwQrQtDPGFB7FUq4gK","rightPoint":[20.673146468863685,8.729078401244516,0.1],"studWidth":0.1,"showLabel":false,"unfilledHeight":0.5,"eavesLength":0,"lz":11.5,"textureType":"No Wall Texture","relativeAngle":1.5707963267948966,"parapet":{"display":false,"color":"#e9d8ba","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.5,"rightTopPartialHeight":11.5,"locked":true},{"leftJoints":["6bfpYPQw2M5RbKRsLfDauC"],"parentId":"2XGmuwQrQtDPGFB7FUq4gK","studColor":"#ffffff","cz":0,"relativeAngle":0,"wallStructure":"Default","showLabel":false,"lineWidth":0.2,"leftRoofHeight":11.5,"ly":0.3,"type":"Wall","structureColor":"white","color":"#e9d8ba","fill":"Full","lineColor":"#000000","textureType":"No Wall Texture","roofId":"byzwW7Db61R9EfVcvoWVQ9","lz":11.5,"unfilledHeight":0.5,"normal":[0,0,1],"selected":false,"cy":-8.270921598755486,"volumetricHeatCapacity":0.5,"structureSpacing":2,"windows":[],"lx":38.99999999999999,"studWidth":0.1,"rightPoint":[20.673146468863674,-8.27092159875548,0.1],"eavesLength":-0.1,"rightRoofHeight":11.5,"opacity":0.5,"leftPoint":[-18.326853531136308,-8.27092159875549,0.1],"structureWidth":0.1,"rightJoints":["vqP69iA4TuZd8ZEvPBLjzU"],"cx":1.1731464688636861,"rValue":2,"id":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","rotation":[0,0,0],"studSpacing":2,"parapet":{"display":true,"color":"#e9d8ba","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.5,"rightTopPartialHeight":11.5,"locked":true},{"rightJoints":["jE7DwieCwvfvkHcN1Bkpu2"],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","centerRoofHeight":[0,12.780523500160847],"leftPoint":[-18.326853531136305,8.729078401244518,0.1],"windows":[],"studSpacing":2,"lineColor":"#000000","structureWidth":0.1,"structureSpacing":2,"textureType":"No Wall Texture","rightPoint":[-18.326853531136308,-8.27092159875549,0.1],"rotation":[0,0,0],"lx":17.00000000000001,"lz":11.5,"cx":-18.326853531136308,"eavesLength":0,"opacity":0.5,"id":"6bfpYPQw2M5RbKRsLfDauC","wallStructure":"Default","studWidth":0.1,"structureColor":"white","leftRoofHeight":11.5,"selected":false,"rightRoofHeight":11.5,"showLabel":false,"type":"Wall","roofId":"byzwW7Db61R9EfVcvoWVQ9","ly":0.3,"leftJoints":["r7FDtsVF9isPsPhYMJtzMf"],"lineWidth":0.2,"volumetricHeatCapacity":0.5,"color":"#e9d8ba","relativeAngle":4.71238898038469,"cy":0.22907840124450551,"studColor":"#ffffff","parentId":"2XGmuwQrQtDPGFB7FUq4gK","unfilledHeight":0.5,"normal":[0,0,1],"fill":"Full","cz":0,"rValue":2,"parapet":{"display":false,"color":"#e9d8ba","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.5,"rightTopPartialHeight":11.5,"locked":true},{"color":"#808080","type":"Foundation","solarAbsorberPipe":{},"id":"j3n8P4y4kG4w4nSZiAf6rj","solarUpdraftTower":{},"lx":8.996965797517845,"selected":false,"cx":15.96321224800585,"lz":0.12,"hvacSystem":{"thermostatSetpoint":20,"id":"A"},"solarPowerTower":{},"parentId":"Ground","cz":0.06,"rotation":[0,0,0.7770359328652141],"cy":7.538802967801969,"normal":[0,0,1],"rValue":2,"ly":17.6681425475643,"textureType":"No Foundation Texture","locked":true},{"id":"vEPKSnunpPsGKUDNJaGnTR","fill":"Full","color":"#c1bdb4","unfilledHeight":0.5,"normal":[0,0,1],"eavesLength":0,"leftJoints":["1QnZb7zSPuvyzTVeC8AkVL"],"volumetricHeatCapacity":0.5,"ly":0.3,"lz":13,"selected":false,"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","opacity":0.5,"cx":2.550655474633215,"rightJoints":["iYLfpK8sAzBxMk4mz1BXiS"],"cy":0.09368069935964818,"parentId":"j3n8P4y4kG4w4nSZiAf6rj","textureType":"Wall Texture Default","structureWidth":0.1,"lx":9.499999999999998,"rightPoint":[2.5506554746332153,4.843680699359649,0.12],"relativeAngle":1.5707963267948963,"structureColor":"white","cz":0,"wallStructure":"Default","type":"Wall","rotation":[0,0,0],"leftPoint":[2.550655474633213,-4.656319300640349,0.12],"structureSpacing":2,"rValue":2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"9wUwTaeJ4rHLbRCsFJ3NXZ","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"lx":4.500000000000002,"wallStructure":"Default","ly":0.3,"normal":[0,0,1],"rightPoint":[2.550655474633216,-4.656319300640352,0.12],"type":"Wall","fill":"Full","structureSpacing":2,"color":"#c1bdb4","cx":0.3006554746332153,"relativeAngle":6.283185307179585,"unfilledHeight":0.5,"textureType":"Wall Texture Default","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","leftPoint":[-1.9493445253667843,-4.656319300640349,0.12],"rightJoints":["vEPKSnunpPsGKUDNJaGnTR"],"lz":13,"id":"1QnZb7zSPuvyzTVeC8AkVL","cz":0,"volumetricHeatCapacity":0.5,"structureColor":"white","rValue":2,"leftJoints":["joaXtauLNr5aPP2tqqpryi"],"opacity":0.5,"selected":false,"parentId":"j3n8P4y4kG4w4nSZiAf6rj","rotation":[0,0,0],"structureWidth":0.1,"eavesLength":0,"cy":-4.65631930064035,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"9wUwTaeJ4rHLbRCsFJ3NXZ","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"opacity":0.5,"eavesLength":0,"normal":[0,0,1],"lz":13,"structureColor":"white","volumetricHeatCapacity":0.5,"cy":0.09368069935964818,"structureWidth":0.1,"fill":"Full","ly":0.3,"unfilledHeight":0.5,"selected":false,"color":"#c1bdb4","rightPoint":[-1.9493445253667818,-4.656319300640352,0.12],"parentId":"j3n8P4y4kG4w4nSZiAf6rj","structureSpacing":2,"cx":-1.9493445253667832,"id":"joaXtauLNr5aPP2tqqpryi","leftJoints":["iYLfpK8sAzBxMk4mz1BXiS"],"wallStructure":"Default","leftPoint":[-1.9493445253667834,4.843680699359648,0.12],"lx":9.5,"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","cz":0,"textureType":"Wall Texture Default","type":"Wall","rotation":[0,0,0],"rightJoints":["1QnZb7zSPuvyzTVeC8AkVL"],"relativeAngle":4.71238898038469,"rValue":2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"9wUwTaeJ4rHLbRCsFJ3NXZ","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"id":"iYLfpK8sAzBxMk4mz1BXiS","studColor":"#ffffff","ly":0.3,"fill":"Full","unfilledHeight":0.5,"studSpacing":2,"leftPoint":[2.5506554746332153,4.843680699359649,0.12],"color":"#c1bdb4","rotation":[0,0,0],"type":"Wall","wallStructure":"Default","lx":4.499999999999998,"lineWidth":0.2,"rightPoint":[-1.949344525366782,4.843680699359645,0.12],"showLabel":false,"studWidth":0.1,"structureSpacing":2,"textureType":"Wall Texture Default","structureWidth":0.1,"normal":[0,0,1],"cy":4.8436806993596475,"lz":13,"cx":0.30065547463321707,"opacity":0.5,"rValue":2,"parentId":"j3n8P4y4kG4w4nSZiAf6rj","structureColor":"white","leftJoints":["vEPKSnunpPsGKUDNJaGnTR"],"windows":[],"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","cz":0,"rightJoints":["joaXtauLNr5aPP2tqqpryi"],"relativeAngle":3.1415926535897936,"volumetricHeatCapacity":0.5,"eavesLength":0,"selected":false,"lineColor":"#000000","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"9wUwTaeJ4rHLbRCsFJ3NXZ","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"volumetricHeatCapacity":0.5,"selected":false,"opacity":0.5,"normal":[0,0,1],"wallStructure":"Default","rightJoints":["gZiomgVxY3vk4YfQ9Jjh6B"],"id":"sCZzaqpAQeUmKwng1WHaCF","foundationId":"o2WibZi2fR7HySSdFgPoda","lx":9.499999999999998,"color":"#c1bdb4","parentId":"o2WibZi2fR7HySSdFgPoda","cx":2.550655474633215,"ly":0.3,"unfilledHeight":0.5,"textureType":"Wall Texture Default","eavesLength":0,"leftPoint":[2.550655474633213,-4.656319300640349,0.12],"relativeAngle":1.5707963267948963,"cy":0.09368069935964818,"fill":"Full","structureSpacing":2,"rightPoint":[2.5506554746332153,4.843680699359649,0.12],"structureWidth":0.1,"leftJoints":["tJ6f61zEL1oQGpeeCnFH2S"],"type":"Wall","rValue":2,"cz":0,"structureColor":"white","rotation":[0,0,0],"lz":13,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"rdXcWwV3c9y2W6N9aNo82Z","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"cz":0,"selected":false,"leftPoint":[-1.9493445253667843,-4.656319300640349,0.12],"cx":0.3006554746332153,"normal":[0,0,1],"lz":13,"cy":-4.65631930064035,"rightJoints":["sCZzaqpAQeUmKwng1WHaCF"],"rightPoint":[2.550655474633216,-4.656319300640352,0.12],"fill":"Full","structureColor":"white","opacity":0.5,"unfilledHeight":0.5,"rotation":[0,0,0],"textureType":"Wall Texture Default","rValue":2,"ly":0.3,"volumetricHeatCapacity":0.5,"lx":4.500000000000002,"color":"#c1bdb4","eavesLength":0,"id":"tJ6f61zEL1oQGpeeCnFH2S","structureSpacing":2,"leftJoints":["eZza9yCuyFywaPPzJVe5tY"],"foundationId":"o2WibZi2fR7HySSdFgPoda","wallStructure":"Default","relativeAngle":6.283185307179585,"type":"Wall","structureWidth":0.1,"parentId":"o2WibZi2fR7HySSdFgPoda","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"rdXcWwV3c9y2W6N9aNo82Z","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"type":"Wall","opacity":0.5,"structureSpacing":2,"wallStructure":"Default","parentId":"o2WibZi2fR7HySSdFgPoda","relativeAngle":4.71238898038469,"id":"eZza9yCuyFywaPPzJVe5tY","textureType":"Wall Texture Default","cx":-1.9493445253667832,"structureWidth":0.1,"normal":[0,0,1],"volumetricHeatCapacity":0.5,"lx":9.5,"lz":13,"fill":"Full","structureColor":"white","foundationId":"o2WibZi2fR7HySSdFgPoda","rotation":[0,0,0],"ly":0.3,"leftPoint":[-1.9493445253667834,4.843680699359648,0.12],"rightPoint":[-1.9493445253667818,-4.656319300640352,0.12],"color":"#c1bdb4","rValue":2,"cz":0,"rightJoints":["tJ6f61zEL1oQGpeeCnFH2S"],"eavesLength":0,"cy":0.09368069935964818,"selected":false,"leftJoints":["gZiomgVxY3vk4YfQ9Jjh6B"],"unfilledHeight":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"rdXcWwV3c9y2W6N9aNo82Z","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"normal":[0,0,1],"unfilledHeight":0.5,"selected":false,"rotation":[0,0,0],"structureColor":"white","leftJoints":["sCZzaqpAQeUmKwng1WHaCF"],"parentId":"o2WibZi2fR7HySSdFgPoda","structureWidth":0.1,"relativeAngle":3.1415926535897936,"wallStructure":"Default","rValue":2,"ly":0.3,"lz":13,"leftPoint":[2.5506554746332153,4.843680699359649,0.12],"volumetricHeatCapacity":0.5,"cx":0.30065547463321707,"type":"Wall","fill":"Full","eavesLength":0,"id":"gZiomgVxY3vk4YfQ9Jjh6B","rightJoints":["eZza9yCuyFywaPPzJVe5tY"],"cy":4.8436806993596475,"rightPoint":[-1.949344525366782,4.843680699359645,0.12],"textureType":"Wall Texture Default","foundationId":"o2WibZi2fR7HySSdFgPoda","structureSpacing":2,"opacity":0.5,"lx":4.499999999999998,"color":"#c1bdb4","cz":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"rdXcWwV3c9y2W6N9aNo82Z","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"solarUpdraftTower":{},"rotation":[0,0,0.7770359328652141],"cz":0.06,"ly":17.6681425475643,"type":"Foundation","hvacSystem":{"thermostatSetpoint":20,"id":"A"},"lx":8.996965797517845,"textureType":"No Foundation Texture","color":"#808080","lz":0.12,"id":"o2WibZi2fR7HySSdFgPoda","solarAbsorberPipe":{},"rValue":2,"parentId":"Ground","solarPowerTower":{},"cy":-19.27217037701027,"cx":-11.087826553311125,"normal":[0,0,1],"selected":false,"locked":true},{"ly":0.3,"foundationId":"hLsewK7zX5Mau5SErFyCiz","unfilledHeight":0.5,"opacity":0.5,"structureWidth":0.1,"rightJoints":["kFKM2qRJFmWx323z2hBCra"],"wallStructure":"Default","rightPoint":[2.5506554746332153,4.843680699359649,0.12],"relativeAngle":1.5707963267948963,"volumetricHeatCapacity":0.5,"cz":0,"rValue":2,"fill":"Full","selected":false,"eavesLength":0,"normal":[0,0,1],"lx":9.499999999999998,"cy":0.09368069935964818,"parentId":"hLsewK7zX5Mau5SErFyCiz","rotation":[0,0,0],"leftPoint":[2.550655474633213,-4.656319300640349,0.12],"structureSpacing":2,"structureColor":"white","type":"Wall","id":"gv3LzTTefsaZrtK8Lzx2bM","textureType":"Wall Texture Default","color":"#c1bdb4","lz":13,"leftJoints":["i7SnyGKg3wpYfMg2Ck4kpZ"],"cx":2.550655474633215,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"3gdGvLfCvyTnvdRCWnC9h9","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"fill":"Full","rotation":[0,0,0],"normal":[0,0,1],"ly":0.3,"cz":0,"textureType":"Wall Texture Default","wallStructure":"Default","rValue":2,"id":"i7SnyGKg3wpYfMg2Ck4kpZ","relativeAngle":6.283185307179585,"leftJoints":["5KcXyJ1kNDvp5rTZsShAbX"],"cx":0.3006554746332153,"foundationId":"hLsewK7zX5Mau5SErFyCiz","color":"#c1bdb4","structureSpacing":2,"lz":13,"rightPoint":[2.550655474633216,-4.656319300640352,0.12],"leftPoint":[-1.9493445253667843,-4.656319300640349,0.12],"type":"Wall","opacity":0.5,"structureColor":"white","rightJoints":["gv3LzTTefsaZrtK8Lzx2bM"],"lx":4.500000000000002,"eavesLength":0,"unfilledHeight":0.5,"selected":false,"parentId":"hLsewK7zX5Mau5SErFyCiz","volumetricHeatCapacity":0.5,"structureWidth":0.1,"cy":-4.65631930064035,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"3gdGvLfCvyTnvdRCWnC9h9","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"rightJoints":["i7SnyGKg3wpYfMg2Ck4kpZ"],"fill":"Full","volumetricHeatCapacity":0.5,"structureColor":"white","rightPoint":[-1.9493445253667818,-4.656319300640352,0.12],"parentId":"hLsewK7zX5Mau5SErFyCiz","leftJoints":["kFKM2qRJFmWx323z2hBCra"],"opacity":0.5,"wallStructure":"Default","unfilledHeight":0.5,"normal":[0,0,1],"structureWidth":0.1,"leftPoint":[-1.9493445253667834,4.843680699359648,0.12],"textureType":"Wall Texture Default","eavesLength":0,"ly":0.3,"type":"Wall","lx":9.5,"selected":false,"relativeAngle":4.71238898038469,"id":"5KcXyJ1kNDvp5rTZsShAbX","cy":0.09368069935964818,"cz":0,"foundationId":"hLsewK7zX5Mau5SErFyCiz","color":"#c1bdb4","lz":13,"cx":-1.9493445253667832,"rValue":2,"structureSpacing":2,"rotation":[0,0,0],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"3gdGvLfCvyTnvdRCWnC9h9","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"type":"Wall","eavesLength":0,"rightPoint":[-1.949344525366782,4.843680699359645,0.12],"leftJoints":["gv3LzTTefsaZrtK8Lzx2bM"],"unfilledHeight":0.5,"cz":0,"cx":0.30065547463321707,"textureType":"Wall Texture Default","normal":[0,0,1],"structureColor":"white","color":"#c1bdb4","foundationId":"hLsewK7zX5Mau5SErFyCiz","rotation":[0,0,0],"rValue":2,"lz":13,"fill":"Full","lx":4.499999999999998,"cy":4.8436806993596475,"relativeAngle":3.1415926535897936,"id":"kFKM2qRJFmWx323z2hBCra","ly":0.3,"structureWidth":0.1,"wallStructure":"Default","opacity":0.5,"parentId":"hLsewK7zX5Mau5SErFyCiz","structureSpacing":2,"volumetricHeatCapacity":0.5,"rightJoints":["5KcXyJ1kNDvp5rTZsShAbX"],"selected":false,"leftPoint":[2.5506554746332153,4.843680699359649,0.12],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"3gdGvLfCvyTnvdRCWnC9h9","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"cy":-10.703769932796098,"rValue":2,"solarPowerTower":{},"textureType":"No Foundation Texture","lx":8.996965797517845,"cx":-19.60349962700186,"rotation":[0,0,0.7770359328652141],"hvacSystem":{"thermostatSetpoint":20,"id":"A"},"ly":17.6681425475643,"solarUpdraftTower":{},"lz":0.12,"id":"hLsewK7zX5Mau5SErFyCiz","color":"#808080","selected":false,"cz":0.06,"solarAbsorberPipe":{},"parentId":"Ground","normal":[0,0,1],"type":"Foundation","locked":true},{"leftPoint":[2.550655474633213,-4.656319300640349,0.12],"relativeAngle":1.5707963267948963,"unfilledHeight":0.5,"leftJoints":["dMQfydvLoQmsUVh8GcfQWg"],"wallStructure":"Default","structureSpacing":2,"cz":0,"color":"#c1bdb4","type":"Wall","cx":2.550655474633215,"structureWidth":0.1,"normal":[0,0,1],"rotation":[0,0,0],"cy":0.09368069935964818,"selected":false,"id":"3WQQwDXPDfYCATy53ts83F","ly":0.3,"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","rightPoint":[2.5506554746332153,4.843680699359649,0.12],"textureType":"Wall Texture Default","volumetricHeatCapacity":0.5,"opacity":0.5,"structureColor":"white","lz":13,"rValue":2,"eavesLength":0,"rightJoints":["16SbPgFqDMyVbV8UtDHAYk"],"lx":9.499999999999998,"parentId":"x4oU2GYmkiSMe4Z8gg6K3C","fill":"Full","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"q8ctEFdUTArcnVXRSQ323h","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"rightJoints":["3WQQwDXPDfYCATy53ts83F"],"type":"Wall","relativeAngle":6.283185307179585,"textureType":"Wall Texture Default","eavesLength":0,"lz":13,"id":"dMQfydvLoQmsUVh8GcfQWg","parentId":"x4oU2GYmkiSMe4Z8gg6K3C","lx":4.500000000000002,"fill":"Full","structureColor":"white","color":"#c1bdb4","unfilledHeight":0.5,"ly":0.3,"cy":-4.65631930064035,"selected":false,"leftPoint":[-1.9493445253667843,-4.656319300640349,0.12],"leftJoints":["kmaifBj79SDvw8jCqEakPi"],"rotation":[0,0,0],"opacity":0.5,"normal":[0,0,1],"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","volumetricHeatCapacity":0.5,"rightPoint":[2.550655474633216,-4.656319300640352,0.12],"cx":0.3006554746332153,"rValue":2,"structureSpacing":2,"structureWidth":0.1,"cz":0,"wallStructure":"Default","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"q8ctEFdUTArcnVXRSQ323h","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"structureColor":"white","wallStructure":"Default","volumetricHeatCapacity":0.5,"normal":[0,0,1],"type":"Wall","rightPoint":[-1.9493445253667818,-4.656319300640352,0.12],"rightJoints":["dMQfydvLoQmsUVh8GcfQWg"],"leftJoints":["16SbPgFqDMyVbV8UtDHAYk"],"cy":0.09368069935964818,"parentId":"x4oU2GYmkiSMe4Z8gg6K3C","leftPoint":[-1.9493445253667834,4.843680699359648,0.12],"lx":9.5,"rValue":2,"ly":0.3,"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","id":"kmaifBj79SDvw8jCqEakPi","lz":13,"structureWidth":0.1,"opacity":0.5,"color":"#c1bdb4","cx":-1.9493445253667832,"relativeAngle":4.71238898038469,"structureSpacing":2,"eavesLength":0,"textureType":"Wall Texture Default","fill":"Full","cz":0,"unfilledHeight":0.5,"selected":false,"rotation":[0,0,0],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"q8ctEFdUTArcnVXRSQ323h","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"volumetricHeatCapacity":0.5,"wallStructure":"Default","rotation":[0,0,0],"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","lz":13,"parentId":"x4oU2GYmkiSMe4Z8gg6K3C","cx":0.30065547463321707,"rightJoints":["kmaifBj79SDvw8jCqEakPi"],"leftJoints":["3WQQwDXPDfYCATy53ts83F"],"unfilledHeight":0.5,"opacity":0.5,"cy":4.8436806993596475,"selected":false,"textureType":"Wall Texture Default","structureSpacing":2,"fill":"Full","type":"Wall","ly":0.3,"rValue":2,"normal":[0,0,1],"relativeAngle":3.1415926535897936,"structureWidth":0.1,"lx":4.499999999999998,"id":"16SbPgFqDMyVbV8UtDHAYk","leftPoint":[2.5506554746332153,4.843680699359649,0.12],"structureColor":"white","eavesLength":0,"rightPoint":[-1.949344525366782,4.843680699359645,0.12],"cz":0,"color":"#c1bdb4","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"q8ctEFdUTArcnVXRSQ323h","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"solarAbsorberPipe":{},"textureType":"No Foundation Texture","rotation":[0,0,0.7770359328652141],"rValue":2,"type":"Foundation","selected":false,"hvacSystem":{"thermostatSetpoint":20,"id":"A"},"lz":0.12,"ly":17.6681425475643,"lx":8.996965797517845,"normal":[0,0,1],"solarUpdraftTower":{},"parentId":"Ground","solarPowerTower":{},"color":"#808080","id":"x4oU2GYmkiSMe4Z8gg6K3C","cz":0.06,"cx":7.698794351508976,"cy":16.007045037404467,"locked":true},{"lz":13,"leftJoints":["aMAoC9G4MpUPGJVmt36yfP"],"wallStructure":"Default","rotation":[0,0,0],"structureColor":"white","selected":false,"relativeAngle":1.5707963267948961,"cz":0,"rightJoints":["iVn6mF9eoYKrYt3EzDy2TC"],"id":"u1GLQPod2yRsFy4dWHVdVa","rightPoint":[2.8178761000817967,3.2189656143947305,0],"parentId":"oGfdqtfZrLhGvZskoNeDFJ","lx":6.3134164357268086,"type":"Wall","volumetricHeatCapacity":0.5,"cy":0.062257396531326226,"foundationId":"oGfdqtfZrLhGvZskoNeDFJ","ly":0.3,"opacity":0.5,"fill":"Full","eavesLength":0,"structureWidth":0.1,"normal":[0,0,1],"structureSpacing":2,"unfilledHeight":0.5,"color":"#c1bdb4","rValue":2,"cx":2.8178761000817953,"leftPoint":[2.817876100081794,-3.094450821332078,0],"textureType":"Wall Texture Default","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"ips8v5W6dhiA81cAxrdErd","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"parentId":"oGfdqtfZrLhGvZskoNeDFJ","rightJoints":["u1GLQPod2yRsFy4dWHVdVa"],"structureColor":"white","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","volumetricHeatCapacity":0.5,"leftJoints":["eTsfM9k5RPHprx93KkShya"],"opacity":0.5,"structureWidth":0.1,"lx":4.971444625304221,"unfilledHeight":0.5,"structureSpacing":2,"textureType":"No Wall Texture","cy":-3.094450821332079,"cx":0.33215378742968693,"fill":"Full","color":"#c1bdb4","cz":0,"rotation":[0,0,0],"normal":[0,0,1],"leftPoint":[-2.1535685252224237,-3.094450821332078,0],"lz":13,"wallStructure":"Default","type":"Wall","selected":false,"id":"aMAoC9G4MpUPGJVmt36yfP","rValue":2,"ly":0.3,"eavesLength":0,"relativeAngle":-4.466400043859356e-16,"rightPoint":[2.8178761000817976,-3.0944508213320803,0],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"ips8v5W6dhiA81cAxrdErd","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"color":"#c1bdb4","cz":0,"selected":false,"rightPoint":[-2.153568525222421,-3.0944508213320803,0],"leftPoint":[-2.153568525222423,3.21896561439473,0],"structureColor":"white","lx":6.31341643572681,"lz":13,"volumetricHeatCapacity":0.5,"normal":[0,0,1],"cx":-2.153568525222422,"relativeAngle":-1.5707963267948963,"structureSpacing":2,"eavesLength":0,"structureWidth":0.1,"rValue":2,"leftJoints":["iVn6mF9eoYKrYt3EzDy2TC"],"foundationId":"oGfdqtfZrLhGvZskoNeDFJ","cy":0.06225739653132489,"parentId":"oGfdqtfZrLhGvZskoNeDFJ","ly":0.3,"rightJoints":["aMAoC9G4MpUPGJVmt36yfP"],"type":"Wall","unfilledHeight":0.5,"textureType":"Wall Texture Default","rotation":[0,0,0],"id":"eTsfM9k5RPHprx93KkShya","fill":"Full","opacity":0.5,"wallStructure":"Default","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"ips8v5W6dhiA81cAxrdErd","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"parentId":"oGfdqtfZrLhGvZskoNeDFJ","structureWidth":0.1,"foundationId":"oGfdqtfZrLhGvZskoNeDFJ","relativeAngle":-3.1415926535897927,"textureType":"Wall Texture Default","structureColor":"white","volumetricHeatCapacity":0.5,"color":"#c1bdb4","rightJoints":["eTsfM9k5RPHprx93KkShya"],"wallStructure":"Default","structureSpacing":2,"rotation":[0,0,0],"leftPoint":[2.8178761000817967,3.2189656143947305,0],"ly":0.3,"rightPoint":[-2.1535685252224215,3.2189656143947274,0],"unfilledHeight":0.5,"opacity":0.5,"fill":"Full","lx":4.971444625304218,"type":"Wall","id":"iVn6mF9eoYKrYt3EzDy2TC","leftJoints":["u1GLQPod2yRsFy4dWHVdVa"],"lz":13,"eavesLength":0,"cz":0,"cx":0.3321537874296876,"rValue":2,"selected":false,"cy":3.2189656143947287,"normal":[0,0,1],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"ips8v5W6dhiA81cAxrdErd","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"textureType":"No Foundation Texture","solarAbsorberPipe":{},"parentId":"Ground","hvacSystem":{"thermostatSetpoint":20,"id":"A"},"type":"Foundation","lz":0.12,"normal":[0,0,1],"cx":-6.658209585503492,"solarPowerTower":{},"cz":0.06,"cy":2.9554447902666663,"rotation":[0,0,0.7770359328652141],"rValue":2,"selected":false,"ly":11.741720163005958,"lx":9.93953716847022,"id":"oGfdqtfZrLhGvZskoNeDFJ","solarUpdraftTower":{},"color":"#808080","locked":true},{"normal":[0,0,1],"lz":0,"selected":false,"ceiling":false,"sideColor":"#ffffff","ridgeRightPoint":[0,1],"type":"Roof","showLabel":false,"rValue":2,"id":"byzwW7Db61R9EfVcvoWVQ9","parentId":"2XGmuwQrQtDPGFB7FUq4gK","cx":0,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","textureType":"No Roof Texture","rotation":[0,0,0],"ly":0,"roofStructure":"Default","roofType":"Gable","ridgeLeftPoint":[0,1],"lx":0,"thickness":0.2,"lineColor":"#000000","cy":0,"cz":0,"wallsId":["jE7DwieCwvfvkHcN1Bkpu2"],"rise":1.2805235001608466,"color":"#73d8ff","lineWidth":0.2,"locked":true},{"textureType":"No Wall Texture","selected":false,"roofId":"tR8bCboRhW3wJCicDgK2jW","leftPoint":[6.104959873734063,-3.546673308869522,0.12],"structureColor":"white","rightRoofHeight":12.5,"id":"nkv63w7AFXpTDVXgNtZaZp","opacity":0,"rotation":[0,0,0],"leftJoints":["1G9FW32uCMUYbXB7bybpze"],"volumetricHeatCapacity":0.5,"lx":4.998533544552693,"wallStructure":"Default","unfilledHeight":3.8747450187684356,"cy":-1.0474065365931762,"cz":0,"parentId":"uj4Qq2BojpeyU8mLo7xk7N","foundationId":"uj4Qq2BojpeyU8mLo7xk7N","eavesLength":0,"fill":"Partial","cx":6.104959873734066,"ly":0.3,"structureSpacing":2,"type":"Wall","normal":[0,0,1],"rightJoints":[],"rValue":2,"color":"#4d4d4d","leftRoofHeight":12.5,"rightPoint":[6.104959873734069,1.4518602356831711,0.12],"lz":12.5,"structureWidth":0.1,"relativeAngle":1.5707963267948952,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.8747450187684356,"rightUnfilledHeight":3.8747450187684356,"leftTopPartialHeight":12.5,"rightTopPartialHeight":12.5,"locked":true},{"selected":false,"leftPoint":[-6.476087156413756,-3.5466733088695213,0.12],"fill":"Partial","structureSpacing":2,"ly":0.3,"roofId":"tR8bCboRhW3wJCicDgK2jW","structureWidth":0.1,"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","normal":[0,0,1],"lx":12.581047030147829,"structureColor":"white","unfilledHeight":3.877447716243144,"cy":-3.5466733088695213,"color":"#4d4d4d","wallStructure":"Default","type":"Wall","rotation":[0,0,0],"textureType":"No Wall Texture","rightPoint":[6.104959873734072,-3.546673308869523,0.12],"relativeAngle":-1.4119308473639638e-16,"id":"1G9FW32uCMUYbXB7bybpze","leftJoints":["9ULQ17PCkbiQTAk5KCBQqS"],"cx":-0.18556364133984293,"rValue":2,"cz":0,"eavesLength":0,"rightJoints":["nkv63w7AFXpTDVXgNtZaZp"],"lz":12.5,"opacity":0.5,"leftRoofHeight":12.5,"rightRoofHeight":12.5,"parentId":"uj4Qq2BojpeyU8mLo7xk7N","volumetricHeatCapacity":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.877447716243144,"rightUnfilledHeight":3.877447716243144,"leftTopPartialHeight":12.5,"rightTopPartialHeight":12.5,"locked":true},{"structureColor":"white","leftPoint":[-6.4760871564137545,1.4518602356831711,0.12],"selected":false,"color":"#4d4d4d","leftRoofHeight":12.5,"lz":12.5,"parentId":"uj4Qq2BojpeyU8mLo7xk7N","structureWidth":0.1,"fill":"Partial","roofId":"tR8bCboRhW3wJCicDgK2jW","textureType":"No Wall Texture","unfilledHeight":3.8825262761296813,"cy":-1.0474065365931766,"lx":4.998533544552695,"cz":0,"structureSpacing":2,"eavesLength":0,"volumetricHeatCapacity":0.5,"wallStructure":"Default","foundationId":"uj4Qq2BojpeyU8mLo7xk7N","rotation":[0,0,0],"leftJoints":[],"rightPoint":[-6.476087156413749,-3.546673308869523,0.12],"type":"Wall","id":"9ULQ17PCkbiQTAk5KCBQqS","rightJoints":["1G9FW32uCMUYbXB7bybpze"],"opacity":0.5,"relativeAngle":-1.5707963267948957,"cx":-6.476087156413751,"rightRoofHeight":12.5,"ly":0.3,"rValue":2,"normal":[0,0,1],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.8825262761296813,"rightUnfilledHeight":3.8825262761296813,"leftTopPartialHeight":12.5,"rightTopPartialHeight":12.5,"locked":true},{"ly":7.102899659180595,"parentId":"Ground","rValue":2,"solarPowerTower":{},"color":"#808080","textureType":"No Foundation Texture","hvacSystem":{"thermostatSetpoint":20},"rotation":[0,0,0.7770359328652141],"cz":0.06,"lx":13.160581645410465,"solarUpdraftTower":{},"type":"Foundation","cy":-7.71612929167876,"solarAbsorberPipe":{},"cx":5.571147308635517,"id":"uj4Qq2BojpeyU8mLo7xk7N","normal":[0,0,1],"selected":false,"lz":0.12,"notBuilding":false,"locked":true},{"rValue":2,"ly":0,"ceiling":false,"lx":0,"sideColor":"#ffffff","cz":0,"lineWidth":0.2,"cx":0,"normal":[0,0,1],"lineColor":"#000000","showLabel":false,"wallsId":["nkv63w7AFXpTDVXgNtZaZp","9ULQ17PCkbiQTAk5KCBQqS","1G9FW32uCMUYbXB7bybpze"],"type":"Roof","rotation":[0,0,0],"textureType":"No Roof Texture","roofStructure":"Default","roofType":"Pyramid","thickness":0.1,"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","cy":0,"lz":0,"selected":false,"color":"#73d8ff","id":"tR8bCboRhW3wJCicDgK2jW","rise":0,"parentId":"uj4Qq2BojpeyU8mLo7xk7N","locked":true},{"mullionWidth":0.06,"frame":true,"type":"Window","shutter":{"color":"grey","showLeft":false,"showRight":false,"width":0.5},"rotation":[0,0,0],"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","selected":false,"sillWidth":0,"lineColor":"#000000","uValue":2,"normal":[0,-1,0],"mullionColor":"#4d4d4d","archHeight":1,"frameWidth":0.2,"showLabel":false,"lineWidth":0.2,"lx":0.3333333333333332,"tint":"#0062b1","cx":-0.011111111111111117,"cz":-0.041666666666666664,"id":"wqLLY7STGwviPzesQo2Pm3","cy":0.3,"color":"#ffffff","opacity":0.5,"ly":0.3,"windowType":"Default","mullionSpacing":2,"mullion":true,"lz":0.75,"parentId":"1QnZb7zSPuvyzTVeC8AkVL","locked":true},{"tint":"#0062b1","frame":true,"selected":false,"ly":0.3,"cz":-0.041666666666666664,"foundationId":"o2WibZi2fR7HySSdFgPoda","rotation":[0,0,0],"archHeight":1,"sillWidth":0,"windowType":"Default","cy":0.3,"parentId":"tJ6f61zEL1oQGpeeCnFH2S","cx":-0.011111111111111117,"id":"qUkb8xmoiBdjkzRWtig4SU","shutter":{"color":"grey","showLeft":false,"width":0.5,"showRight":false},"normal":[0,0,1],"color":"#ffffff","mullionWidth":0.06,"lx":0.3333333333333332,"mullion":true,"lz":0.75,"type":"Window","frameWidth":0.2,"mullionSpacing":2,"opacity":0.5,"uValue":2,"mullionColor":"#4d4d4d","locked":true},{"lz":0.48,"rotation":[0,0,0],"tint":"#315f6f","mullionWidth":0.05,"parentId":"1G9FW32uCMUYbXB7bybpze","ly":0.3,"cz":0.12,"type":"Window","mullionColor":"#666666","shutter":{"width":0.5,"color":"grey","showLeft":false,"showRight":false},"lineWidth":0.2,"windowType":"Default","sillWidth":0,"opacity":0.9,"lx":0.8743310452334228,"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","normal":[0,-1,0],"frame":true,"mullionSpacing":1,"mullion":true,"showLabel":false,"uValue":2,"cy":0.3,"cx":0,"color":"#ffffff","lineColor":"#000000","frameWidth":0.05,"id":"otfRaWBjxDE3hRYtq3HZ4m","archHeight":1,"selected":false,"locked":true},{"windowType":"Default","ly":0.3,"archHeight":1,"lz":0.14285714285714282,"selected":false,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","frame":true,"cy":0.3,"lineWidth":0.2,"lx":0.05384615384615385,"frameWidth":0.2,"lineColor":"#000000","cx":0.19358974358974362,"tint":"#b3b3b3","opacity":0.9,"mullionWidth":0.1,"cz":0.23291925465838512,"rotation":[0,0,0],"mullionSpacing":1.25,"type":"Window","mullionColor":"#ffffff","sillWidth":0,"normal":[0,-1,0],"showLabel":false,"id":"d7WscaF1Qtzp9YhmRPKdMx","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","color":"#ffffff","uValue":2,"mullion":true,"shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"locked":true},{"cx":0.2576923076923078,"frameWidth":0.2,"lx":0.05384615384615385,"tint":"#b3b3b3","opacity":0.9,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"sillWidth":0,"color":"#ffffff","lz":0.14285714285714282,"mullionColor":"#ffffff","mullionSpacing":1.25,"selected":false,"rotation":[0,0,0],"cy":0.3,"mullion":true,"ly":0.3,"normal":[0,0,1],"parentId":"jE7DwieCwvfvkHcN1Bkpu2","archHeight":1,"cz":0.23291925465838512,"mullionWidth":0.1,"type":"Window","id":"phyxK6dSx3mzB64HK7tbQq","windowType":"Default","frame":true,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"locked":true},{"color":"#ffffff","mullion":true,"lx":0.0538461538461538,"rotation":[0,0,0],"opacity":0.9,"windowType":"Default","cy":0.3,"ly":0.3,"type":"Window","uValue":2,"cx":0.3217948717948719,"frame":true,"cz":0.23291925465838512,"mullionSpacing":1.25,"shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"selected":false,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","frameWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","archHeight":1,"mullionColor":"#ffffff","lz":0.14285714285714282,"tint":"#b3b3b3","sillWidth":0,"mullionWidth":0.1,"normal":[0,0,1],"id":"rUCAQoA9pCTnCsyUCwQKsz","locked":true},{"lz":0.14285714285714285,"rotation":[0,0,0],"sillWidth":0,"windowType":"Default","frame":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cy":0.3,"mullionSpacing":1.25,"opacity":0.9,"ly":0.3,"uValue":2,"mullionColor":"#ffffff","color":"#ffffff","archHeight":1,"type":"Window","id":"cVhfCa3Uxnnwwat44DMDUA","mullionWidth":0.1,"cx":0.3910256410256411,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"mullion":true,"selected":false,"normal":[0,0,1],"lx":0.06410256410256411,"frameWidth":0.2,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","tint":"#b3b3b3","cz":0.23291925465838512,"locked":true},{"frame":true,"shutter":{"width":0.5,"showLeft":false,"showRight":false,"color":"grey"},"cx":0.1948717948717949,"color":"#ffffff","frameWidth":0.2,"mullion":true,"ly":0.3,"archHeight":1,"rotation":[0,0,0],"tint":"#b3b3b3","opacity":0.9,"mullionColor":"#ffffff","lx":0.056410256410256404,"id":"bNXPgPwYdtaKzeyyFztb1n","normal":[0,0,1],"sillWidth":0,"cz":-0.02795031055900621,"windowType":"Default","mullionWidth":0.1,"lz":0.14285714285714285,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"jE7DwieCwvfvkHcN1Bkpu2","selected":false,"type":"Window","cy":0.3,"mullionSpacing":1.25,"uValue":2,"locked":true},{"mullionWidth":0.1,"tint":"#b3b3b3","shutter":{"width":0.5,"showLeft":false,"color":"grey","showRight":false},"lz":0.14285714285714282,"cy":0.3,"uValue":2,"mullionSpacing":1.25,"sillWidth":0,"cx":0.20512820512820518,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","lx":0.03589743589743587,"rotation":[0,0,0],"selected":false,"type":"Window","archHeight":1,"mullionColor":"#ffffff","normal":[0,0,1],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"id":"3VvDJnQdsED8fAouDPT9yF","frameWidth":0.2,"ly":0.3,"windowType":"Default","frame":true,"color":"#ffffff","cz":-0.2888198757763975,"mullion":true,"locked":true},{"cz":-0.02795031055900621,"ly":0.3,"shutter":{"color":"grey","showRight":false,"width":0.5,"showLeft":false},"id":"kaF2HtrRicfNAq1W9doyfR","tint":"#b3b3b3","cy":0.3,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"jE7DwieCwvfvkHcN1Bkpu2","mullionSpacing":1.25,"normal":[0,0,1],"mullionWidth":0.1,"windowType":"Default","sillWidth":0,"type":"Window","rotation":[0,0,0],"uValue":2,"color":"#ffffff","archHeight":1,"mullion":true,"lz":0.14285714285714285,"frame":true,"selected":false,"lx":0.05384615384615385,"frameWidth":0.2,"cx":0.2576923076923078,"opacity":0.9,"mullionColor":"#ffffff","locked":true},{"parentId":"jE7DwieCwvfvkHcN1Bkpu2","mullionWidth":0.1,"mullionColor":"#ffffff","tint":"#b3b3b3","color":"#ffffff","cy":0.3,"lx":0.0538461538461538,"cx":0.3217948717948719,"frameWidth":0.2,"windowType":"Default","mullionSpacing":1.25,"opacity":0.9,"ly":0.3,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"rotation":[0,0,0],"type":"Window","id":"2pB9fvP8ZeUqogmRwvUTce","sillWidth":0,"normal":[0,0,1],"archHeight":1,"selected":false,"uValue":2,"lz":0.14285714285714285,"frame":true,"mullion":true,"cz":-0.02795031055900621,"locked":true},{"sillWidth":0,"frame":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionSpacing":1.25,"windowType":"Default","uValue":2,"lz":0.14285714285714285,"rotation":[0,0,0],"tint":"#b3b3b3","shutter":{"showLeft":false,"color":"grey","showRight":false,"width":0.5},"color":"#ffffff","parentId":"jE7DwieCwvfvkHcN1Bkpu2","id":"nTCU2PDq5uNAZg9zRpPCHX","archHeight":1,"opacity":0.9,"cx":0.3910256410256411,"mullionColor":"#ffffff","type":"Window","normal":[0,0,1],"cy":0.3,"mullion":true,"frameWidth":0.2,"selected":false,"lx":0.06410256410256411,"ly":0.3,"mullionWidth":0.1,"cz":-0.02795031055900621,"locked":true},{"frame":true,"archHeight":1,"normal":[0,0,1],"mullionColor":"#ffffff","cz":-0.2888198757763975,"windowType":"Default","mullionSpacing":1.25,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","cx":0.258974358974359,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionWidth":0.1,"uValue":2,"selected":false,"shutter":{"color":"grey","showLeft":false,"showRight":false,"width":0.5},"lx":0.056410256410256404,"sillWidth":0,"cy":0.3,"opacity":0.9,"type":"Window","ly":0.3,"lz":0.14285714285714282,"rotation":[0,0,0],"tint":"#b3b3b3","mullion":true,"frameWidth":0.2,"id":"1GzMSiwb36TFB48v2QYryB","color":"#ffffff","locked":true},{"id":"ayHDGxuZiXFZRCb6xwiWDe","lx":0.0538461538461538,"type":"Window","parentId":"jE7DwieCwvfvkHcN1Bkpu2","ly":0.3,"shutter":{"showLeft":false,"color":"grey","showRight":false,"width":0.5},"selected":false,"frame":true,"frameWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cz":-0.2888198757763975,"mullionColor":"#ffffff","mullionWidth":0.1,"archHeight":1,"tint":"#b3b3b3","windowType":"Default","color":"#ffffff","uValue":2,"normal":[0,0,1],"lz":0.14285714285714282,"mullion":true,"sillWidth":0,"cx":0.3217948717948719,"rotation":[0,0,0],"mullionSpacing":1.25,"opacity":0.9,"cy":0.3,"locked":true},{"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","normal":[0,0,1],"opacity":0.9,"cy":0.3,"tint":"#b3b3b3","rotation":[0,0,0],"frame":true,"lx":0.06410256410256411,"ly":0.3,"mullionWidth":0.1,"frameWidth":0.2,"mullionSpacing":1.25,"mullion":true,"sillWidth":0,"selected":false,"id":"mPyFc6BaTuwYm116awk4nS","lz":0.14285714285714285,"mullionColor":"#ffffff","uValue":2,"windowType":"Default","color":"#ffffff","cx":0.3910256410256411,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","archHeight":1,"cz":-0.2888198757763975,"type":"Window","shutter":{"showRight":false,"width":0.5,"showLeft":false,"color":"grey"},"locked":true},{"ly":0.3,"lz":4.070845481097757,"structureSpacing":4,"rotation":[0,0,0],"fill":"Full","textureType":"No Wall Texture","cy":-2.5093852454781445,"leftJoints":[],"structureWidth":0.5,"foundationId":"8DwiqAmnDYU6meyiSHFYvg","cz":2.0354227405488783,"volumetricHeatCapacity":0.5,"rValue":2,"id":"bwWCUGgxViKGTAu9eHo4CU","normal":[0,0,1],"cx":0.13591177848864566,"rightPoint":[5.998472224148425,-2.5093852454781453,0.2],"wallStructure":"Pillar","structureColor":"#4d4d4d","unfilledHeight":0.5,"type":"Wall","relativeAngle":-1.5150008736501291e-16,"lx":11.725120891319554,"selected":false,"eavesLength":0.3,"color":"#4d4d4d","leftPoint":[-5.726648667171128,-2.5093852454781445,0.2],"rightJoints":[],"parentId":"8DwiqAmnDYU6meyiSHFYvg","opacity":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.070845481097757,"rightTopPartialHeight":4.070845481097757,"locked":true},{"type":"Foundation","cy":-7.844584975085767,"textureType":"No Foundation Texture","ly":9.133282463061267,"cz":0.1,"normal":[0,0,1],"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"rotation":[0,0,0.7770359328652141],"lz":0.2,"solarAbsorberPipe":{},"parentId":"Ground","cx":5.386211591704882,"rValue":2,"color":"#e9d8ba","solarUpdraftTower":{},"id":"8DwiqAmnDYU6meyiSHFYvg","selected":false,"lx":13.077027743266148,"notBuilding":true,"locked":true},{"cz":0.23291925465838512,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"ly":0.3,"id":"46EurDPfGoJsechaGfz85S","cy":0.3,"mullionColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"tint":"#b3b3b3","mullionWidth":0.1,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"color":"#ffffff","opacity":0.9,"type":"Window","lx":0.051282051282051294,"selected":false,"mullionSpacing":1.25,"archHeight":1,"mullion":true,"windowType":"Default","sillWidth":0,"frame":true,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","lz":0.14285714285714285,"cx":-0.19230769230769235,"frameWidth":0.2,"locked":true},{"selected":false,"cy":0.3,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"mullion":true,"lz":0.14285714285714285,"archHeight":1,"opacity":0.9,"rotation":[0,0,0],"parentId":"jE7DwieCwvfvkHcN1Bkpu2","mullionSpacing":1.25,"lx":0.06410256410256411,"ly":0.3,"mullionColor":"#ffffff","windowType":"Default","frameWidth":0.2,"uValue":2,"normal":[0,0,1],"cx":-0.3910256410256411,"sillWidth":0,"type":"Window","tint":"#b3b3b3","color":"#ffffff","id":"izxRQkWui4YmZiY96HksMX","cz":0.23291925465838512,"frame":true,"mullionWidth":0.1,"locked":true},{"mullionSpacing":1.25,"uValue":2,"archHeight":1,"cy":0.3,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","cz":0.23291925465838512,"mullionWidth":0.1,"windowType":"Default","type":"Window","tint":"#b3b3b3","shutter":{"color":"grey","showLeft":false,"showRight":false,"width":0.5},"cx":-0.3217948717948719,"color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullion":true,"lx":0.0538461538461538,"normal":[0,0,1],"selected":false,"ly":0.3,"sillWidth":0,"frame":true,"opacity":0.9,"frameWidth":0.2,"mullionColor":"#ffffff","lz":0.14285714285714282,"id":"cx5YNYxji3cWvUe2vzHp8r","rotation":[0,0,0],"locked":true},{"frame":true,"selected":false,"shutter":{"showRight":false,"width":0.5,"showLeft":false,"color":"grey"},"sillWidth":0,"frameWidth":0.2,"mullionWidth":0.1,"cz":0.23291925465838512,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"jE7DwieCwvfvkHcN1Bkpu2","color":"#ffffff","opacity":0.9,"type":"Window","lz":0.14285714285714282,"normal":[0,0,1],"mullionSpacing":1.25,"uValue":2,"mullion":true,"id":"v7KHWrJEpTEx5wKqo46MKC","mullionColor":"#ffffff","windowType":"Default","ly":0.3,"cx":-0.25512820512820517,"rotation":[0,0,0],"cy":0.3,"archHeight":1,"tint":"#b3b3b3","lx":0.05897435897435896,"locked":true},{"uValue":2,"frameWidth":0.2,"normal":[0,0,1],"mullionSpacing":1.25,"cx":-0.3884615384615385,"selected":false,"lx":0.06923076923076922,"ly":0.3,"rotation":[0,0,0],"cz":-0.2888198757763975,"mullion":true,"lz":0.14285714285714282,"opacity":0.9,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","archHeight":1,"mullionColor":"#ffffff","windowType":"Default","shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"type":"Window","sillWidth":0,"mullionWidth":0.1,"color":"#ffffff","tint":"#b3b3b3","id":"aq2YNCbxikYtSJvwjUbALP","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","frame":true,"cy":0.3,"locked":true},{"tint":"#b3b3b3","ly":0.3,"id":"nMhMe9155kYQJYGKXKtDJE","mullion":true,"rotation":[0,0,0],"frameWidth":0.2,"archHeight":1,"lz":0.14285714285714282,"color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","selected":false,"frame":true,"cx":-0.3192307692307694,"sillWidth":0,"mullionWidth":0.1,"normal":[0,0,1],"cy":0.3,"opacity":0.9,"shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"cz":-0.2888198757763975,"type":"Window","lx":0.05384615384615394,"uValue":2,"mullionSpacing":1.25,"windowType":"Default","mullionColor":"#ffffff","parentId":"jE7DwieCwvfvkHcN1Bkpu2","locked":true},{"lx":0.05384615384615385,"opacity":0.9,"mullionWidth":0.1,"type":"Window","sillWidth":0,"ly":0.3,"uValue":2,"shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"mullionColor":"#ffffff","cz":-0.2888198757763975,"cx":-0.25512820512820517,"normal":[0,0,1],"selected":false,"id":"9uThAQakWzLaaAnEDxEbHb","mullion":true,"color":"#ffffff","windowType":"Default","lz":0.14285714285714282,"frame":true,"rotation":[0,0,0],"cy":0.3,"mullionSpacing":1.25,"archHeight":1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","frameWidth":0.2,"tint":"#b3b3b3","parentId":"jE7DwieCwvfvkHcN1Bkpu2","locked":true},{"windowType":"Default","opacity":0.9,"mullionSpacing":1.25,"mullionWidth":0.1,"lz":0.14285714285714285,"cx":-0.19230769230769235,"cy":0.3,"id":"8fuBFjedq9njRTLoxtn8EP","lx":0.051282051282051294,"uValue":2,"frame":true,"sillWidth":0,"mullion":true,"frameWidth":0.2,"archHeight":1,"cz":-0.2888198757763975,"selected":false,"normal":[0,0,1],"ly":0.3,"rotation":[0,0,0],"type":"Window","parentId":"jE7DwieCwvfvkHcN1Bkpu2","color":"#ffffff","shutter":{"showRight":false,"showLeft":false,"color":"grey","width":0.5},"tint":"#b3b3b3","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionColor":"#ffffff","locked":true},{"mullionSpacing":1.25,"cx":-0.3884615384615385,"cy":0.3,"mullionWidth":0.1,"mullion":true,"color":"#ffffff","type":"Window","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionColor":"#ffffff","cz":-0.02795031055900621,"lz":0.14285714285714285,"tint":"#b3b3b3","frameWidth":0.2,"sillWidth":0,"selected":false,"uValue":2,"rotation":[0,0,0],"normal":[0,0,1],"ly":0.3,"archHeight":1,"shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"frame":true,"lx":0.06923076923076922,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","opacity":0.9,"windowType":"Default","id":"djvC79sCMpkHHpaVqyVdW8","locked":true},{"uValue":2,"lz":0.14285714285714285,"type":"Window","id":"eZg5T5d6C7sKQSaPhcKxw6","ly":0.3,"frameWidth":0.2,"frame":true,"cy":0.3,"windowType":"Default","shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"selected":false,"sillWidth":0,"lx":0.056410256410256446,"mullion":true,"mullionWidth":0.1,"normal":[0,0,1],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cx":-0.31794871794871804,"archHeight":1,"mullionColor":"#ffffff","tint":"#b3b3b3","color":"#ffffff","rotation":[0,0,0],"mullionSpacing":1.25,"cz":-0.02795031055900621,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","opacity":0.9,"locked":true},{"lx":0.056410256410256404,"normal":[0,0,1],"mullion":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionWidth":0.1,"frameWidth":0.2,"archHeight":1,"cz":-0.02795031055900621,"cy":0.3,"opacity":0.9,"ly":0.3,"windowType":"Default","frame":true,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","cx":-0.2538461538461539,"selected":false,"rotation":[0,0,0],"color":"#ffffff","uValue":2,"id":"8xJvoQv2PELZbsAu7THviM","type":"Window","mullionColor":"#ffffff","mullionSpacing":1.25,"lz":0.14285714285714285,"tint":"#b3b3b3","shutter":{"showLeft":false,"width":0.5,"showRight":false,"color":"grey"},"sillWidth":0,"locked":true},{"mullionColor":"#ffffff","shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"windowType":"Default","normal":[0,0,1],"mullionWidth":0.1,"lz":0.14285714285714285,"cy":0.3,"type":"Window","rotation":[0,0,0],"opacity":0.9,"id":"6253HwoM7vYHZDUNYjsTgU","selected":false,"frame":true,"ly":0.3,"lx":0.051282051282051294,"archHeight":1,"mullion":true,"cx":-0.19230769230769235,"tint":"#b3b3b3","frameWidth":0.2,"color":"#ffffff","uValue":2,"cz":-0.02795031055900621,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"jE7DwieCwvfvkHcN1Bkpu2","sillWidth":0,"mullionSpacing":1.25,"locked":true},{"mullionColor":"#4d4d4d","rotation":[0,0,0],"mullionWidth":0.06,"frameWidth":0.2,"opacity":0.5,"cz":-0.041666666666666664,"lx":0.11695906432748526,"shutter":{"showRight":false,"width":0.5,"showLeft":false,"color":"grey"},"parentId":"vEPKSnunpPsGKUDNJaGnTR","archHeight":1,"ly":0.3,"cy":0.3,"type":"Window","color":"#ffffff","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","frame":true,"mullionSpacing":2,"cx":0.11111111111111106,"uValue":2,"selected":false,"windowType":"Default","id":"gcLhGQTVxE2fJnMpRDahoq","tint":"#0062b1","mullion":true,"normal":[0,0,1],"lz":0.75,"sillWidth":0,"locked":true},{"frame":true,"rotation":[0,0,0],"mullionColor":"#4d4d4d","shutter":{"width":0.5,"showLeft":false,"showRight":false,"color":"grey"},"cx":0.3216374269005848,"frameWidth":0.2,"parentId":"vEPKSnunpPsGKUDNJaGnTR","archHeight":1,"ly":0.3,"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","opacity":0.5,"mullion":true,"lz":0.75,"id":"sP3EuQN5nUzkBPzPZicBDL","mullionWidth":0.06,"lx":0.11695906432748526,"windowType":"Default","uValue":2,"sillWidth":0,"selected":false,"type":"Window","mullionSpacing":2,"cy":0.3,"normal":[0,0,1],"tint":"#0062b1","cz":-0.041666666666666664,"color":"#ffffff","locked":true},{"parentId":"3WQQwDXPDfYCATy53ts83F","cx":-0.3099415204678364,"rotation":[0,0,0],"uValue":2,"lz":0.75,"type":"Window","opacity":0.5,"selected":false,"normal":[0,0,1],"mullionSpacing":2,"mullionColor":"#4d4d4d","cy":0.3,"lx":0.11695906432748526,"sillWidth":0,"archHeight":1,"mullionWidth":0.06,"frame":true,"ly":0.3,"tint":"#0062b1","id":"a9iz7tks9oLk2eTwA9Yde3","foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","shutter":{"showRight":false,"width":0.5,"color":"grey","showLeft":false},"mullion":true,"frameWidth":0.2,"windowType":"Default","color":"#ffffff","cz":-0.041666666666666664,"locked":true},{"color":"#ffffff","cx":-0.09941520467836266,"normal":[0,0,1],"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","rotation":[0,0,0],"mullionColor":"#4d4d4d","cz":-0.041666666666666664,"archHeight":1,"sillWidth":0,"mullionWidth":0.06,"windowType":"Default","shutter":{"color":"grey","showRight":false,"showLeft":false,"width":0.5},"type":"Window","mullionSpacing":2,"parentId":"3WQQwDXPDfYCATy53ts83F","cy":0.3,"selected":false,"mullion":true,"opacity":0.5,"lz":0.75,"id":"s7untaE7NYoTEH5Xxqu7vu","uValue":2,"ly":0.3,"lx":0.11695906432748526,"tint":"#0062b1","frameWidth":0.2,"frame":true,"locked":true},{"cz":-0.041666666666666664,"normal":[0,0,1],"sillWidth":0,"windowType":"Default","color":"#ffffff","mullionColor":"#4d4d4d","parentId":"eZza9yCuyFywaPPzJVe5tY","tint":"#0062b1","frameWidth":0.2,"type":"Window","lz":0.75,"id":"4J5xN82Vi7ATj7FHVXK9fT","foundationId":"o2WibZi2fR7HySSdFgPoda","rotation":[0,0,0],"frame":true,"cx":-0.30994152046783635,"mullionSpacing":2,"uValue":2,"ly":0.3,"opacity":0.5,"lx":0.11695906432748526,"selected":false,"mullionWidth":0.06,"cy":0.3,"archHeight":1,"shutter":{"color":"grey","showRight":false,"showLeft":false,"width":0.5},"mullion":true,"locked":true},{"parentId":"eZza9yCuyFywaPPzJVe5tY","uValue":2,"cx":-0.09941520467836262,"mullionSpacing":2,"lz":0.75,"normal":[0,0,1],"frameWidth":0.2,"cz":-0.041666666666666664,"tint":"#0062b1","ly":0.3,"rotation":[0,0,0],"cy":0.3,"mullionWidth":0.06,"type":"Window","opacity":0.5,"selected":false,"frame":true,"foundationId":"o2WibZi2fR7HySSdFgPoda","archHeight":1,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"sillWidth":0,"color":"#ffffff","windowType":"Default","mullion":true,"mullionColor":"#4d4d4d","lx":0.11695906432748526,"id":"215xeoB94LfwSgY9VkRb9T","locked":true},{"archHeight":1,"lx":0.11695906432748526,"id":"ddfjZo324XGZQ4fjUcBn6X","sillWidth":0,"mullionWidth":0.06,"ly":0.3,"opacity":0.5,"type":"Window","mullionSpacing":2,"windowType":"Default","color":"#ffffff","foundationId":"hLsewK7zX5Mau5SErFyCiz","normal":[0,0,1],"uValue":2,"frameWidth":0.2,"parentId":"5KcXyJ1kNDvp5rTZsShAbX","mullionColor":"#4d4d4d","rotation":[0,0,0],"cz":-0.041666666666666664,"cy":0.3,"shutter":{"showLeft":false,"width":0.5,"color":"grey","showRight":false},"mullion":true,"cx":0.3216374269005847,"selected":false,"tint":"#0062b1","lz":0.75,"frame":true,"locked":true},{"normal":[0,0,1],"foundationId":"hLsewK7zX5Mau5SErFyCiz","lz":0.75,"windowType":"Default","archHeight":1,"parentId":"5KcXyJ1kNDvp5rTZsShAbX","lx":0.11695906432748526,"uValue":2,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"type":"Window","mullionColor":"#4d4d4d","opacity":0.5,"mullionWidth":0.06,"frameWidth":0.2,"cx":0.11111111111111105,"cz":-0.041666666666666664,"id":"rw5R1u3LjL3kSbDYXLqpep","tint":"#0062b1","frame":true,"sillWidth":0,"cy":0.3,"color":"#ffffff","ly":0.3,"rotation":[0,0,0],"mullion":true,"selected":false,"mullionSpacing":2,"locked":true},{"id":"u7vgLv3TfTJ9G6m9VRJXKE","cy":-8.330957372051333,"type":"Cuboid","selected":false,"cz":0.6,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","ly":4.416238472006233,"rotation":[0,0,0.7770205829878756],"cx":6.1134856174136125,"lx":12.5,"color":"#e9d8ba","lz":1.2,"normal":[0,0,1],"faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"locked":true},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"color":"#e9d8ba","rotation":[0,0,0.7770205829878756],"ly":0.3,"parentId":"Ground","type":"Cuboid","cx":7.775993069912096,"cz":0.5,"lz":1,"cy":-9.982710148514444,"normal":[0,0,1],"id":"xwTCcYWFUqCHdfYgjwLPzr","selected":false,"lx":12.5,"locked":true},{"cy":-10.222251297562046,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lx":12.5,"color":"#e9d8ba","cz":0.4,"rotation":[0,0,0.7770205829878756],"cx":7.97917394469156,"type":"Cuboid","id":"4ahnYxjJA1TN7cwGSyLftT","lz":0.8,"normal":[0,0,1],"parentId":"Ground","ly":0.3,"selected":false,"faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"locked":true},{"parentId":"Ground","selected":false,"faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"cz":0.3,"id":"axXhhxk8aLaskye6X7yAxR","cy":-10.456557176149813,"color":"#e9d8ba","rotation":[0,0,0.7770205829878756],"cx":8.172887209710508,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","normal":[0,0,1],"ly":0.3,"lx":12.5,"lz":0.6,"locked":true},{"color":"#e9d8ba","ly":0.3,"cz":0.2,"parentId":"Ground","lz":0.4,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"k4MhMFRn1raEXYc4ftU5Lc","faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"type":"Cuboid","cx":8.377329978512003,"selected":false,"rotation":[0,0,0.7770205829878756],"normal":[0,0,1],"lx":12.5,"cy":-10.669908202265143,"locked":true},{"sillWidth":0,"color":"#ffffff","lz":0.14285714285714285,"shutter":{"showLeft":false,"width":0.5,"color":"grey","showRight":false},"normal":[0,0,1],"cy":0.3,"id":"aAHxe5UAeWUHZvvacf7DLX","frame":true,"opacity":0.9,"windowType":"Default","mullionColor":"#ffffff","frameWidth":0.2,"mullionWidth":0.05,"cx":-0.3782051282051282,"lx":0.03846153846153847,"archHeight":1,"mullion":true,"parentId":"r7FDtsVF9isPsPhYMJtzMf","ly":0.3,"type":"Window","cz":-0.30952380952380953,"selected":false,"mullionSpacing":1,"uValue":2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","rotation":[0,0,0],"tint":"#b3b3b3","locked":true},{"archHeight":1,"windowType":"Default","frame":true,"normal":[0,0,1],"color":"#ffffff","cy":0.3,"tint":"#b3b3b3","ly":0.3,"parentId":"r7FDtsVF9isPsPhYMJtzMf","mullionWidth":0.05,"shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"id":"o3uqUfUSMsh6mPJ8kZKe6V","rotation":[0,0,0],"mullion":true,"selected":false,"lx":0.03846153846153847,"uValue":2,"mullionSpacing":1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","sillWidth":0,"frameWidth":0.2,"type":"Window","lz":0.14285714285714285,"mullionColor":"#ffffff","opacity":0.9,"cx":-0.3782051282051282,"cz":0.2619047619047619,"locked":true},{"sillWidth":0,"frame":true,"tint":"#b3b3b3","mullion":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"id":"ftqkfAje9vSURSKAfdGfkb","frameWidth":0.2,"cy":0.1,"lz":0.14285714285714285,"ly":0.3,"shutter":{"showLeft":false,"color":"grey","width":0.5,"showRight":false},"lx":0.03846153846153847,"mullionColor":"#ffffff","cz":0.2619047619047619,"mullionSpacing":1,"color":"#ffffff","mullionWidth":0.05,"normal":[0,0,1],"uValue":2,"type":"Window","parentId":"r7FDtsVF9isPsPhYMJtzMf","selected":false,"cx":-0.3205128205128205,"rotation":[0,0,0],"archHeight":1,"windowType":"Default","locked":true},{"mullionWidth":0.05,"opacity":0.9,"mullionColor":"#ffffff","type":"Window","parentId":"r7FDtsVF9isPsPhYMJtzMf","mullion":true,"selected":false,"uValue":2,"color":"#ffffff","cz":0.2619047619047619,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionSpacing":1,"ly":0.3,"cx":-0.26282051282051283,"lz":0.14285714285714285,"rotation":[0,0,0],"windowType":"Default","sillWidth":0,"normal":[0,0,1],"lx":0.03846153846153847,"frameWidth":0.2,"frame":true,"id":"47o8tVpT7No3q7ScC7ayfT","archHeight":1,"shutter":{"showRight":false,"width":0.5,"color":"grey","showLeft":false},"cy":0.1,"tint":"#b3b3b3","locked":true},{"id":"e9WgXpqUMuc4bjKV6V5giQ","cz":0.2619047619047619,"lx":0.03846153846153847,"type":"Window","cy":0.1,"tint":"#b3b3b3","frameWidth":0.2,"uValue":2,"sillWidth":0,"mullionWidth":0.05,"rotation":[0,0,0],"mullionSpacing":1,"ly":0.3,"shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"normal":[0,0,1],"mullionColor":"#ffffff","opacity":0.9,"cx":-0.2051282051282051,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","color":"#ffffff","windowType":"Default","lz":0.14285714285714285,"parentId":"r7FDtsVF9isPsPhYMJtzMf","archHeight":1,"selected":false,"frame":true,"mullion":true,"locked":true},{"lz":0.14285714285714285,"ly":0.3,"archHeight":1,"cz":0.2619047619047619,"mullionWidth":0.05,"tint":"#b3b3b3","shutter":{"showRight":false,"width":0.5,"showLeft":false,"color":"grey"},"mullionSpacing":1,"normal":[0,0,1],"cx":-0.14743589743589736,"id":"vWfatFM987X7DVksHURHa2","mullion":true,"rotation":[0,0,0],"opacity":0.9,"lx":0.03846153846153847,"mullionColor":"#ffffff","cy":0.1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"sillWidth":0,"type":"Window","frame":true,"windowType":"Default","selected":false,"parentId":"r7FDtsVF9isPsPhYMJtzMf","frameWidth":0.2,"color":"#ffffff","locked":true},{"frameWidth":0.2,"type":"Window","frame":true,"mullionWidth":0.05,"parentId":"r7FDtsVF9isPsPhYMJtzMf","id":"1JBYjadgjTeQWv6jrVmNzf","cz":0.2619047619047619,"normal":[0,0,1],"cy":0.1,"cx":-0.08974358974358965,"rotation":[0,0,0],"tint":"#b3b3b3","windowType":"Default","mullion":true,"ly":0.3,"uValue":2,"archHeight":1,"lx":0.03846153846153847,"lz":0.14285714285714285,"mullionColor":"#ffffff","color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionSpacing":1,"sillWidth":0,"opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"width":0.5,"color":"grey"},"selected":false,"locked":true},{"mullionSpacing":1,"selected":false,"tint":"#b3b3b3","frameWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","color":"#ffffff","uValue":2,"ly":0.3,"opacity":0.9,"frame":true,"type":"Window","shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"parentId":"r7FDtsVF9isPsPhYMJtzMf","archHeight":1,"sillWidth":0,"cy":0.1,"cz":-0.30952380952380953,"rotation":[0,0,0],"lz":0.14285714285714285,"id":"cfj3pRCVpZMJFi4BqedUfe","mullion":true,"normal":[0,0,1],"mullionWidth":0.05,"cx":-0.3205128205128205,"windowType":"Default","mullionColor":"#ffffff","lx":0.03846153846153847,"locked":true},{"mullionColor":"#ffffff","lz":0.14285714285714285,"cy":0.1,"shutter":{"color":"grey","showLeft":false,"width":0.5,"showRight":false},"cz":-0.30952380952380953,"tint":"#b3b3b3","uValue":2,"color":"#ffffff","mullionWidth":0.05,"id":"mdRuaw8QhYk6E15WXmfncN","normal":[0,0,1],"frameWidth":0.2,"ly":0.3,"frame":true,"lx":0.03846153846153847,"selected":false,"mullionSpacing":1,"windowType":"Default","cx":-0.26282051282051283,"parentId":"r7FDtsVF9isPsPhYMJtzMf","mullion":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","rotation":[0,0,0],"type":"Window","archHeight":1,"opacity":0.9,"sillWidth":0,"locked":true},{"tint":"#b3b3b3","frameWidth":0.2,"uValue":2,"id":"55aZ17NQmYsZjj65tA9N6c","type":"Window","cy":0.1,"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","color":"#ffffff","normal":[0,0,1],"mullion":true,"shutter":{"showRight":false,"color":"grey","showLeft":false,"width":0.5},"mullionColor":"#ffffff","cx":-0.2051282051282051,"windowType":"Default","cz":-0.30952380952380953,"lz":0.14285714285714285,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","selected":false,"opacity":0.9,"archHeight":1,"lx":0.03846153846153847,"mullionSpacing":1,"mullionWidth":0.05,"frame":true,"ly":0.3,"sillWidth":0,"locked":true},{"type":"Window","ly":0.3,"windowType":"Default","cz":-0.30952380952380953,"sillWidth":0,"frameWidth":0.2,"lz":0.14285714285714285,"archHeight":1,"normal":[0,0,1],"color":"#ffffff","selected":false,"lx":0.03846153846153847,"tint":"#b3b3b3","cx":-0.14743589743589736,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionWidth":0.05,"id":"1z5sb7DiDiWaTZ6WSGSBgP","shutter":{"showLeft":false,"showRight":false,"width":0.5,"color":"grey"},"mullionSpacing":1,"opacity":0.9,"rotation":[0,0,0],"mullionColor":"#ffffff","frame":true,"cy":0.1,"mullion":true,"uValue":2,"parentId":"r7FDtsVF9isPsPhYMJtzMf","locked":true},{"mullion":true,"cx":-0.08974358974358965,"tint":"#b3b3b3","mullionSpacing":1,"normal":[0,0,1],"sillWidth":0,"lz":0.14285714285714285,"archHeight":1,"rotation":[0,0,0],"lx":0.03846153846153847,"frameWidth":0.2,"color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"ly":0.3,"type":"Window","selected":false,"id":"1VhTxbHHBGndaZD6vgtVKW","frame":true,"opacity":0.9,"mullionColor":"#ffffff","mullionWidth":0.05,"cz":-0.30952380952380953,"parentId":"r7FDtsVF9isPsPhYMJtzMf","cy":0.1,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"windowType":"Default","locked":true},{"lx":0.03846153846153847,"tint":"#b3b3b3","shutter":{"showRight":false,"showLeft":false,"width":0.5,"color":"grey"},"type":"Window","frame":true,"mullionSpacing":1,"archHeight":1,"sillWidth":0,"cy":0.3,"opacity":0.9,"id":"xmoWZwUhtR6SFNiGKtxr1m","mullionWidth":0.05,"color":"#ffffff","rotation":[0,0,0],"mullionColor":"#ffffff","lz":0.14285714285714285,"normal":[0,0,1],"cx":-0.3782051282051282,"parentId":"r7FDtsVF9isPsPhYMJtzMf","selected":false,"windowType":"Default","uValue":2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","ly":0.3,"mullion":true,"frameWidth":0.2,"cz":-0.023809523809523808,"locked":true},{"archHeight":1,"cy":0.1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"r7FDtsVF9isPsPhYMJtzMf","lz":0.14285714285714285,"ly":0.3,"shutter":{"showLeft":false,"width":0.5,"showRight":false,"color":"grey"},"mullionSpacing":1,"lx":0.03846153846153847,"selected":false,"cx":-0.3205128205128205,"id":"dmo2H1zYKT8Yb8BFyJx3Gz","cz":-0.023809523809523808,"tint":"#b3b3b3","mullionWidth":0.05,"normal":[0,0,1],"rotation":[0,0,0],"frame":true,"color":"#ffffff","type":"Window","frameWidth":0.2,"uValue":2,"mullion":true,"mullionColor":"#ffffff","windowType":"Default","opacity":0.9,"sillWidth":0,"locked":true},{"normal":[0,0,1],"tint":"#b3b3b3","mullionWidth":0.05,"mullion":true,"frame":true,"uValue":2,"type":"Window","rotation":[0,0,0],"mullionColor":"#ffffff","mullionSpacing":1,"opacity":0.9,"frameWidth":0.2,"ly":0.3,"parentId":"r7FDtsVF9isPsPhYMJtzMf","shutter":{"showLeft":false,"showRight":false,"width":0.5,"color":"grey"},"windowType":"Default","lz":0.14285714285714285,"cy":0.1,"sillWidth":0,"selected":false,"cz":-0.023809523809523808,"archHeight":1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","lx":0.03846153846153847,"cx":-0.26282051282051283,"id":"ifqLCE1HzUvw6zh9hXdDbd","color":"#ffffff","locked":true},{"shutter":{"color":"grey","showRight":false,"showLeft":false,"width":0.5},"cx":-0.2051282051282051,"parentId":"r7FDtsVF9isPsPhYMJtzMf","uValue":2,"ly":0.3,"normal":[0,0,1],"cz":-0.023809523809523808,"mullionWidth":0.05,"frame":true,"sillWidth":0,"id":"gA23Z9tUz7wPHpEvmsKQF9","windowType":"Default","mullion":true,"lx":0.03846153846153847,"opacity":0.9,"type":"Window","archHeight":1,"lz":0.14285714285714285,"rotation":[0,0,0],"selected":false,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","frameWidth":0.2,"mullionSpacing":1,"mullionColor":"#ffffff","tint":"#b3b3b3","color":"#ffffff","cy":0.1,"locked":true},{"type":"Window","frame":true,"selected":false,"uValue":2,"rotation":[0,0,0],"mullionSpacing":1,"lx":0.03846153846153847,"id":"g26wC9moZKAAzi72Vpxkja","mullionColor":"#ffffff","color":"#ffffff","windowType":"Default","cy":0.1,"parentId":"r7FDtsVF9isPsPhYMJtzMf","cz":-0.023809523809523808,"sillWidth":0,"ly":0.3,"lz":0.14285714285714285,"cx":-0.14743589743589736,"tint":"#b3b3b3","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"frameWidth":0.2,"normal":[0,0,1],"archHeight":1,"mullionWidth":0.05,"mullion":true,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"locked":true},{"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"color":"#ffffff","parentId":"r7FDtsVF9isPsPhYMJtzMf","id":"t5oxzLUUWgsBQiTqMqndt1","cz":-0.023809523809523808,"sillWidth":0,"uValue":2,"ly":0.3,"shutter":{"showRight":false,"color":"grey","showLeft":false,"width":0.5},"rotation":[0,0,0],"selected":false,"mullionWidth":0.05,"cx":-0.08974358974358965,"windowType":"Default","mullion":true,"mullionColor":"#ffffff","type":"Window","normal":[0,0,1],"cy":0.1,"tint":"#b3b3b3","mullionSpacing":1,"frameWidth":0.2,"frame":true,"archHeight":1,"lx":0.03846153846153847,"lz":0.14285714285714285,"locked":true},{"mullionWidth":0.05,"cx":0.10897435897435898,"uValue":2,"selected":false,"frameWidth":0.2,"lz":0.14285714285714285,"type":"Window","id":"9Xa2jX1sxCcJu9Qb6YPC2s","mullionColor":"#ffffff","opacity":0.9,"sillWidth":0,"lx":0.03846153846153847,"parentId":"r7FDtsVF9isPsPhYMJtzMf","archHeight":1,"color":"#ffffff","normal":[0,0,1],"windowType":"Default","rotation":[0,0,0],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","frame":true,"cy":0.3,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"mullion":true,"mullionSpacing":1,"cz":-0.30952380952380953,"tint":"#b3b3b3","ly":0.3,"locked":true},{"uValue":2,"frame":true,"mullionColor":"#ffffff","cy":0.1,"sillWidth":0,"frameWidth":0.2,"ly":0.3,"shutter":{"width":0.5,"showLeft":false,"color":"grey","showRight":false},"cz":-0.30952380952380953,"id":"jAuZTLVVKe7wAQ3T71wGgZ","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionWidth":0.05,"parentId":"r7FDtsVF9isPsPhYMJtzMf","selected":false,"opacity":0.9,"windowType":"Default","mullionSpacing":1,"archHeight":1,"normal":[0,0,1],"mullion":true,"rotation":[0,0,0],"lx":0.03846153846153847,"type":"Window","tint":"#b3b3b3","cx":0.16666666666666669,"lz":0.14285714285714285,"color":"#ffffff","locked":true},{"mullionSpacing":1,"selected":false,"opacity":0.9,"windowType":"Default","type":"Window","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cx":0.22435897435897442,"archHeight":1,"sillWidth":0,"mullion":true,"tint":"#b3b3b3","lz":0.14285714285714285,"frameWidth":0.2,"normal":[0,0,1],"ly":0.3,"mullionWidth":0.05,"cz":-0.30952380952380953,"id":"vENyYLo9ct8hNwWCaxGgh9","lx":0.03846153846153847,"parentId":"r7FDtsVF9isPsPhYMJtzMf","frame":true,"shutter":{"color":"grey","showLeft":false,"width":0.5,"showRight":false},"mullionColor":"#ffffff","color":"#ffffff","cy":0.1,"rotation":[0,0,0],"uValue":2,"locked":true},{"selected":false,"color":"#ffffff","sillWidth":0,"uValue":2,"cz":-0.30952380952380953,"shutter":{"color":"grey","showRight":false,"width":0.5,"showLeft":false},"frame":true,"mullion":true,"mullionSpacing":1,"mullionWidth":0.05,"normal":[0,0,1],"parentId":"r7FDtsVF9isPsPhYMJtzMf","id":"q7q4AW6uBwbJ6Cu8CRiTjs","type":"Window","tint":"#b3b3b3","ly":0.3,"frameWidth":0.2,"cy":0.1,"lz":0.14285714285714285,"rotation":[0,0,0],"cx":0.2820512820512821,"lx":0.03846153846153847,"mullionColor":"#ffffff","windowType":"Default","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","archHeight":1,"opacity":0.9,"locked":true},{"tint":"#b3b3b3","archHeight":1,"mullion":true,"cx":0.33974358974358976,"rotation":[0,0,0],"lx":0.03846153846153847,"windowType":"Default","mullionSpacing":1,"type":"Window","uValue":2,"cy":0.1,"id":"93xJt2nF5KXFmbdPTBkxxA","shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"mullionWidth":0.05,"sillWidth":0,"ly":0.3,"color":"#ffffff","cz":-0.30952380952380953,"frameWidth":0.2,"mullionColor":"#ffffff","frame":true,"lz":0.14285714285714285,"opacity":0.9,"normal":[0,0,1],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","selected":false,"parentId":"r7FDtsVF9isPsPhYMJtzMf","locked":true},{"normal":[0,0,1],"mullionWidth":0.05,"parentId":"r7FDtsVF9isPsPhYMJtzMf","lz":0.14285714285714285,"selected":false,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","type":"Window","id":"rqxKsXtJSfhtmcVetqkrnQ","windowType":"Default","cz":-0.30952380952380953,"frameWidth":0.2,"lx":0.03846153846153847,"ly":0.3,"mullion":true,"archHeight":1,"frame":true,"sillWidth":0,"opacity":0.9,"uValue":2,"cy":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"rotation":[0,0,0],"cx":0.3974358974358974,"color":"#ffffff","mullionSpacing":1,"mullionColor":"#ffffff","tint":"#b3b3b3","locked":true},{"shutter":{"width":0.5,"color":"grey","showLeft":false,"showRight":false},"color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","type":"Window","windowType":"Default","normal":[0,0,1],"parentId":"r7FDtsVF9isPsPhYMJtzMf","rotation":[0,0,0],"mullionSpacing":1,"lz":0.14285714285714285,"mullionColor":"#ffffff","archHeight":1,"mullion":true,"sillWidth":0,"opacity":0.9,"mullionWidth":0.05,"cy":0.3,"cz":-0.023809523809523808,"lx":0.03846153846153847,"ly":0.3,"tint":"#b3b3b3","selected":false,"cx":0.10897435897435898,"id":"t5xKggUuuYXpJByLpjQCCN","frameWidth":0.2,"uValue":2,"frame":true,"locked":true},{"color":"#ffffff","id":"3mgduhR1rZfiGxV9DxMKKp","selected":false,"cz":-0.023809523809523808,"tint":"#b3b3b3","frame":true,"mullionColor":"#ffffff","frameWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"r7FDtsVF9isPsPhYMJtzMf","mullion":true,"windowType":"Default","ly":0.3,"mullionWidth":0.05,"uValue":2,"lx":0.03846153846153847,"mullionSpacing":1,"lz":0.14285714285714285,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"sillWidth":0,"cx":0.16666666666666669,"shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"cy":0.1,"opacity":0.9,"archHeight":1,"locked":true},{"sillWidth":0,"windowType":"Default","mullionWidth":0.05,"uValue":2,"mullionSpacing":1,"id":"3iPxQ9YQqC9r3Ge6DJC5HU","selected":false,"opacity":0.9,"parentId":"r7FDtsVF9isPsPhYMJtzMf","shutter":{"color":"grey","showRight":false,"width":0.5,"showLeft":false},"frame":true,"type":"Window","cy":0.1,"mullion":true,"ly":0.3,"rotation":[0,0,0],"tint":"#b3b3b3","lx":0.03846153846153847,"color":"#ffffff","archHeight":1,"normal":[0,0,1],"frameWidth":0.2,"cz":-0.023809523809523808,"cx":0.22435897435897442,"lz":0.14285714285714285,"mullionColor":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","locked":true},{"opacity":0.9,"cy":0.1,"normal":[0,0,1],"frameWidth":0.2,"id":"76oBAJjEY5VErwpM1BxmpH","parentId":"r7FDtsVF9isPsPhYMJtzMf","mullionSpacing":1,"lz":0.14285714285714285,"ly":0.3,"frame":true,"mullionColor":"#ffffff","cx":0.2820512820512821,"sillWidth":0,"lx":0.03846153846153847,"mullion":true,"uValue":2,"archHeight":1,"rotation":[0,0,0],"type":"Window","tint":"#b3b3b3","selected":false,"color":"#ffffff","shutter":{"color":"grey","showRight":false,"width":0.5,"showLeft":false},"windowType":"Default","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cz":-0.023809523809523808,"mullionWidth":0.05,"locked":true},{"archHeight":1,"ly":0.3,"mullionColor":"#ffffff","mullion":true,"selected":false,"mullionWidth":0.05,"sillWidth":0,"shutter":{"width":0.5,"showLeft":false,"showRight":false,"color":"grey"},"cx":0.33974358974358976,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","tint":"#b3b3b3","rotation":[0,0,0],"frameWidth":0.2,"type":"Window","color":"#ffffff","cy":0.1,"cz":-0.023809523809523808,"opacity":0.9,"parentId":"r7FDtsVF9isPsPhYMJtzMf","lx":0.03846153846153847,"lz":0.14285714285714285,"frame":true,"uValue":2,"id":"pPk6b2pTiBVzv3KLBQxRSg","windowType":"Default","mullionSpacing":1,"normal":[0,0,1],"locked":true},{"cy":0.1,"frame":true,"windowType":"Default","parentId":"r7FDtsVF9isPsPhYMJtzMf","sillWidth":0,"selected":false,"normal":[0,0,1],"archHeight":1,"mullionWidth":0.05,"shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"ly":0.3,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","type":"Window","rotation":[0,0,0],"lx":0.03846153846153847,"mullionSpacing":1,"tint":"#b3b3b3","color":"#ffffff","opacity":0.9,"lz":0.14285714285714285,"cz":-0.023809523809523808,"uValue":2,"mullionColor":"#ffffff","mullion":true,"id":"dDqdERBwZJGfHxCAxg8mQc","cx":0.3974358974358974,"frameWidth":0.2,"locked":true},{"sillWidth":0,"mullionWidth":0.05,"id":"g49obECC2D5AhNaQXqvDPp","frame":true,"mullionColor":"#ffffff","mullionSpacing":1,"lz":0.14285714285714285,"windowType":"Default","opacity":0.9,"normal":[0,0,1],"type":"Window","cx":0.10897435897435898,"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","lx":0.03846153846153847,"shutter":{"showLeft":false,"width":0.5,"color":"grey","showRight":false},"mullion":true,"cy":0.3,"color":"#ffffff","frameWidth":0.2,"archHeight":1,"uValue":2,"ly":0.3,"cz":0.2619047619047619,"selected":false,"tint":"#b3b3b3","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","locked":true},{"mullionSpacing":1,"color":"#ffffff","parentId":"r7FDtsVF9isPsPhYMJtzMf","frameWidth":0.2,"lx":0.03846153846153847,"type":"Window","rotation":[0,0,0],"lz":0.14285714285714285,"uValue":2,"frame":true,"id":"n8XDBwufcE9UWBEg19yPpi","opacity":0.9,"normal":[0,0,1],"mullionColor":"#ffffff","ly":0.3,"tint":"#b3b3b3","archHeight":1,"windowType":"Default","cy":0.1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"cz":0.2619047619047619,"selected":false,"cx":0.16666666666666669,"mullion":true,"mullionWidth":0.05,"sillWidth":0,"locked":true},{"parentId":"r7FDtsVF9isPsPhYMJtzMf","color":"#ffffff","frame":true,"lx":0.03846153846153847,"normal":[0,0,1],"mullionWidth":0.05,"shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"mullion":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"cz":0.2619047619047619,"sillWidth":0,"cx":0.22435897435897442,"lz":0.14285714285714285,"archHeight":1,"type":"Window","cy":0.1,"mullionSpacing":1,"selected":false,"mullionColor":"#ffffff","rotation":[0,0,0],"ly":0.3,"windowType":"Default","tint":"#b3b3b3","id":"b5uBoVa6wo8VKkGWVcCau1","frameWidth":0.2,"opacity":0.9,"locked":true},{"color":"#ffffff","lx":0.03846153846153847,"cy":0.1,"type":"Window","opacity":0.9,"sillWidth":0,"frame":true,"mullionWidth":0.05,"selected":false,"rotation":[0,0,0],"id":"nwmp8tgXJE3t7ELMTsmseA","normal":[0,0,1],"windowType":"Default","lz":0.14285714285714285,"cx":0.2820512820512821,"shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"mullion":true,"ly":0.3,"tint":"#b3b3b3","frameWidth":0.2,"cz":0.2619047619047619,"archHeight":1,"mullionSpacing":1,"uValue":2,"parentId":"r7FDtsVF9isPsPhYMJtzMf","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionColor":"#ffffff","locked":true},{"id":"72vvSwRX9xusD4gBvjme4x","rotation":[0,0,0],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"frame":true,"windowType":"Default","mullionWidth":0.05,"cy":0.1,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"sillWidth":0,"normal":[0,0,1],"cz":0.2619047619047619,"archHeight":1,"frameWidth":0.2,"type":"Window","mullion":true,"tint":"#b3b3b3","uValue":2,"lx":0.03846153846153847,"selected":false,"color":"#ffffff","cx":0.33974358974358976,"ly":0.3,"lz":0.14285714285714285,"parentId":"r7FDtsVF9isPsPhYMJtzMf","mullionColor":"#ffffff","mullionSpacing":1,"locked":true},{"cy":0.1,"normal":[0,0,1],"tint":"#b3b3b3","frame":true,"frameWidth":0.2,"lz":0.14285714285714285,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"sillWidth":0,"cx":0.3974358974358974,"type":"Window","archHeight":1,"windowType":"Default","lx":0.03846153846153847,"parentId":"r7FDtsVF9isPsPhYMJtzMf","mullionWidth":0.05,"id":"nfohs2Unqz45ioM4iNmfos","cz":0.2619047619047619,"mullionSpacing":1,"mullion":true,"selected":false,"ly":0.3,"mullionColor":"#ffffff","opacity":0.9,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"color":"#ffffff","rotation":[0,0,0],"locked":true},{"lz":0.75,"type":"Window","uValue":2,"frameWidth":0.2,"shutter":{"showRight":false,"showLeft":false,"width":0.5,"color":"grey"},"windowType":"Default","frame":true,"mullionColor":"#ffffff","rotation":[0,0,0],"selected":false,"cy":0.3,"foundationId":"hLsewK7zX5Mau5SErFyCiz","opacity":0.5,"lx":0.22222222222222213,"mullionWidth":0.06,"ly":0.3,"tint":"#0062b1","mullionSpacing":5,"id":"nCv1Ny793c5HrEnfGj93XH","archHeight":1,"cx":-8.635067969306777e-17,"sillWidth":0,"normal":[0,0,1],"mullion":true,"cz":-0.041666666666666664,"color":"#ffffff","parentId":"kFKM2qRJFmWx323z2hBCra","locked":true},{"opacity":0.5,"sillWidth":0,"uValue":2,"tint":"#0062b1","ly":0.3,"type":"Window","cy":0.3,"cz":-0.041666666666666664,"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","frame":true,"windowType":"Default","archHeight":1,"mullionWidth":0.06,"lz":0.75,"cx":-8.635067969306777e-17,"mullionColor":"#ffffff","rotation":[0,0,0],"id":"5HaXS5141hpZmmNQTR28pq","color":"#ffffff","mullionSpacing":5,"frameWidth":0.2,"mullion":true,"lx":0.22222222222222213,"normal":[0,0,1],"shutter":{"color":"grey","showRight":false,"showLeft":false,"width":0.5},"parentId":"16SbPgFqDMyVbV8UtDHAYk","selected":false,"locked":true},{"windowType":"Default","rotation":[0,0,0],"frame":true,"lz":0.75,"ly":0.3,"cy":0.3,"mullionColor":"#ffffff","opacity":0.5,"id":"rkqdUY1fH4ETNHTSNuscn1","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","color":"#ffffff","cx":0.01053672324504819,"mullionWidth":0.06,"sillWidth":0,"selected":false,"frameWidth":0.2,"mullion":true,"normal":[0,0,1],"shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"tint":"#0062b1","cz":-0.041666666666666664,"uValue":2,"parentId":"iVn6mF9eoYKrYt3EzDy2TC","type":"Window","archHeight":1,"lx":0.22222222222222213,"mullionSpacing":5,"locked":true},{"doorType":"Default","rotation":[0,0,0],"frameColor":"#ffffff","id":"nCMdK2uZjAQvbd9xNjWLHp","filled":true,"cz":-0.33695652173913043,"type":"Door","ly":0,"lz":0.32608695652173914,"normal":[0,0,1],"lx":0.053846153846153856,"opacity":0.5,"archHeight":1,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","selected":false,"textureType":"Door Texture Default","cx":0.012820512820512824,"color":"#009ce0","uValue":1,"cy":0,"locked":true},{"type":"Human","rotation":[0,0,0],"lz":1.8,"selected":false,"cy":-0.1500000059604638,"name":"Jack","cz":0.30360914351979496,"normal":[0,1,0],"id":"3ZDfWfiHz4RyG9jjRaKJMd","parentId":"4ahnYxjJA1TN7cwGSyLftT","lx":0.42,"cx":-3.810198255647766,"locked":true},{"selected":false,"parentId":"u7vgLv3TfTJ9G6m9VRJXKE","rotation":[0,0,0],"id":"kNqFk1V3FLs1ySbp9WvM5C","cx":0.5509936852391848,"lx":0.48,"lz":1.6,"cz":0.6000000238418579,"type":"Human","normal":[0,1,0],"cy":-1.9056488848059487,"name":"Jade","locked":true},{"type":"Human","selected":false,"name":"James","normal":[0,1,0],"cx":13.796503677890236,"lx":0.472,"cy":-14.701093907978901,"cz":0,"rotation":[0,0,0],"lz":1.75,"parentId":"Ground","id":"hEkECi6wTCQNNwcMymHKtW","locked":true},{"normal":[0,1,0],"cz":0,"name":"Jacqueline","lz":1.78,"lx":0.43,"parentId":"Ground","id":"jkiLfuhPDQMUuLpfWnf96a","rotation":[0,0,0],"cx":14.379527131239326,"type":"Human","cy":-14.104111051733407,"selected":false,"locked":true},{"uValue":2,"ly":0.3,"cy":0.3,"cz":-0.44989648033126295,"lineColor":"#000000","mullionWidth":0.1,"archHeight":1,"mullion":true,"mullionColor":"#ffffff","parentId":"jE7DwieCwvfvkHcN1Bkpu2","lx":0.025641025641025647,"sillWidth":0,"selected":false,"opacity":0.5,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","windowType":"Default","cx":-0.3974358974358975,"id":"ey7NEkHJkJr31HLTbvLk1h","frame":true,"normal":[0,-1,0],"lineWidth":0.2,"showLabel":false,"lz":0.047619047619047616,"tint":"#b3b3b3","mullionSpacing":1.25,"rotation":[0,0,0],"frameWidth":0.05,"color":"#ffffff","type":"Window","shutter":{"showRight":false,"color":"grey","showLeft":false,"width":0.5},"locked":true},{"windowType":"Default","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cz":-0.44989648033126295,"cx":-0.3205128205128206,"cy":0.3,"uValue":2,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"type":"Window","sillWidth":0,"mullionWidth":0.1,"mullionColor":"#ffffff","archHeight":1,"frame":true,"ly":0.3,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","opacity":0.5,"tint":"#b3b3b3","rotation":[0,0,0],"lx":0.025641025641025647,"frameWidth":0.05,"mullionSpacing":1.25,"selected":false,"color":"#ffffff","normal":[0,-1,0],"mullion":true,"lz":0.047619047619047616,"id":"tBwi3AxHXayUK8gVkMaxbE","locked":true},{"opacity":0.5,"mullionWidth":0.1,"type":"Window","normal":[0,-1,0],"archHeight":1,"lz":0.047619047619047616,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cz":-0.44989648033126295,"lx":0.025641025641025647,"frame":true,"shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"uValue":2,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","rotation":[0,0,0],"mullionSpacing":1.25,"ly":0.3,"frameWidth":0.05,"tint":"#b3b3b3","cx":-0.25641025641025644,"cy":0.3,"sillWidth":0,"selected":false,"id":"aaeq11aoNBxT8ngMjW1MD1","windowType":"Default","mullion":true,"color":"#ffffff","mullionColor":"#ffffff","locked":true},{"mullionColor":"#ffffff","lz":0.047619047619047616,"cx":-0.19230769230769235,"uValue":2,"sillWidth":0,"id":"tQRNuUci7nDK7JtFR1J9hs","opacity":0.5,"mullion":true,"cz":-0.44989648033126295,"windowType":"Default","lx":0.025641025641025647,"selected":false,"color":"#ffffff","shutter":{"showRight":false,"width":0.5,"color":"grey","showLeft":false},"parentId":"jE7DwieCwvfvkHcN1Bkpu2","archHeight":1,"tint":"#b3b3b3","frameWidth":0.05,"type":"Window","rotation":[0,0,0],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","ly":0.3,"frame":true,"normal":[0,-1,0],"mullionWidth":0.1,"cy":0.3,"mullionSpacing":1.25,"locked":true},{"mullionWidth":0.15,"lz":0.2260869565217391,"lx":0.12564102564102567,"uValue":2,"shutter":{"width":0.5,"color":"grey","showLeft":false,"showRight":false},"sillWidth":0,"lineColor":"#000000","cy":0.3,"showLabel":false,"mullionSpacing":1.75,"lineWidth":0.2,"selected":false,"color":"#ffffff","ly":0.3,"windowType":"Default","type":"Window","tint":"#009ce0","frame":false,"cz":-0.28695652173913044,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cx":-0.07820512820512822,"mullionColor":"#ffffff","archHeight":1,"opacity":0.5,"rotation":[0,0,0],"mullion":true,"normal":[0,-1,0],"frameWidth":0.1,"id":"noDtXCs5Fto2dPjMS4sHTG","locked":true},{"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.5,"id":"32Mm6Utbug2woUysRGXDB7","frameWidth":0.1,"mullionWidth":0.15,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","shutter":{"width":0.5,"color":"grey","showLeft":false,"showRight":false},"mullion":true,"mullionColor":"#ffffff","type":"Window","frame":false,"selected":false,"windowType":"Default","cy":0.3,"ly":0.3,"normal":[0,0,1],"cz":-0.29130434782608694,"tint":"#009ce0","color":"#ffffff","lx":0.1230769230769231,"rotation":[0,0,0],"uValue":2,"cx":0.10256410256410259,"archHeight":1,"sillWidth":0,"mullionSpacing":1.75,"lz":0.21739130434782608,"locked":true},{"lineColor":"#e9d8ba","color":"#e9d8ba","cz":0,"ly":0.4,"parentType":"Wall","vertices":[{"x":-0.5007532349973239,"y":-0.44799999999999995},{"x":-0.5007532349973239,"y":-0.376},{"y":-0.376,"x":0.5007532349973239},{"y":-0.44,"x":0.5007532349973239}],"id":"aJWE2MtRWkR9GDyeWR1Gxe","filled":true,"selected":false,"cy":-0.4400430854049809,"type":"Polygon","selectedIndex":0,"normal":[0,0,1],"lx":0.4,"lz":0.4,"cx":0.15819596410925735,"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","parentId":"1G9FW32uCMUYbXB7bybpze","noOutline":true,"rotation":[0,0,0],"locked":true},{"filled":true,"ly":0.4,"cz":0,"cy":0,"vertices":[{"x":-0.5001466885671803,"y":-0.44},{"y":-0.376,"x":-0.5001466885671803},{"y":-0.376,"x":0.4601349534818058},{"y":-0.44,"x":0.5001466885671803}],"lx":0.4,"noOutline":true,"cx":0,"parentId":"9ULQ17PCkbiQTAk5KCBQqS","type":"Polygon","id":"cAXqDBJufU2L5v4YCuvU4k","color":"#e9d8ba","lz":0.4,"selected":false,"selectedIndex":3,"parentType":"Wall","lineColor":"#e9d8ba","rotation":[0,0,0],"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","normal":[0,0,1],"locked":true},{"selected":false,"opacity":0,"text":"YENISEHIR BELEDIYESI BILIM SANAT MERKEZI","noOutline":true,"cy":0,"fontColor":"gold","cz":0,"normal":[0,0,1],"cx":0,"rotation":[0,0,0],"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","color":"#ffffff","selectedIndex":3,"lx":0.4,"type":"Polygon","ly":0.4,"fontSize":0.5,"filled":true,"parentType":"Wall","parentId":"1G9FW32uCMUYbXB7bybpze","vertices":[{"x":-0.47819624166517993,"y":0.14},{"x":-0.47819624166517993,"y":0.18000000000000002},{"y":0.18000000000000002,"x":0.47561944404400847},{"x":0.47561944404400847,"y":0.14}],"id":"ddNUh9NWyq7jo9Hii6cxUy","lz":0.4,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["vEPKSnunpPsGKUDNJaGnTR","iYLfpK8sAzBxMk4mz1BXiS","joaXtauLNr5aPP2tqqpryi","1QnZb7zSPuvyzTVeC8AkVL"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"j3n8P4y4kG4w4nSZiAf6rj","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","id":"9wUwTaeJ4rHLbRCsFJ3NXZ","locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["16SbPgFqDMyVbV8UtDHAYk","kmaifBj79SDvw8jCqEakPi","dMQfydvLoQmsUVh8GcfQWg","3WQQwDXPDfYCATy53ts83F"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"x4oU2GYmkiSMe4Z8gg6K3C","foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","id":"q8ctEFdUTArcnVXRSQ323h","locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["tJ6f61zEL1oQGpeeCnFH2S","sCZzaqpAQeUmKwng1WHaCF","gZiomgVxY3vk4YfQ9Jjh6B","eZza9yCuyFywaPPzJVe5tY"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o2WibZi2fR7HySSdFgPoda","foundationId":"o2WibZi2fR7HySSdFgPoda","id":"rdXcWwV3c9y2W6N9aNo82Z","locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["5KcXyJ1kNDvp5rTZsShAbX","i7SnyGKg3wpYfMg2Ck4kpZ","gv3LzTTefsaZrtK8Lzx2bM","kFKM2qRJFmWx323z2hBCra"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"hLsewK7zX5Mau5SErFyCiz","foundationId":"hLsewK7zX5Mau5SErFyCiz","id":"3gdGvLfCvyTnvdRCWnC9h9","locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["eTsfM9k5RPHprx93KkShya","aMAoC9G4MpUPGJVmt36yfP","u1GLQPod2yRsFy4dWHVdVa","iVn6mF9eoYKrYt3EzDy2TC"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"oGfdqtfZrLhGvZskoNeDFJ","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","id":"ips8v5W6dhiA81cAxrdErd","locked":true},{"type":"Foundation","cx":2.2717235438998022,"cy":-13.70952380378541,"cz":0.05,"lx":0.7913071632562995,"ly":6.7897393900555105,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.7770205829878756],"parentId":"Ground","selected":false,"color":"#808080","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"mjxy5YL3EoKusPrE4miGfp","notBuilding":true,"locked":true},{"type":"Wall","cx":-0.20459827817487655,"cy":-1.7122028473101976,"cz":0,"lx":1.6908062651709903,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"relativeAngle":-1.5707963267948972,"leftPoint":[-0.20459827817487616,-0.8667997147247025,0],"rightPoint":[-0.20459827817487694,-2.5576059798956927,0],"leftJoints":["9LP2kDJGn2neiYDzDX66JW"],"rightJoints":["kVBpA22r7rMwMak56bdzNG"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"kAomEduDnbZXe9fMR2J4vS","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vX75xVcns2UiTk795WQxu9","leftRoofHeight":1.4200281664406509,"rightRoofHeight":0.8626045741320808,"centerRoofHeight":[-0.5,1.9880394330169113],"locked":true},{"type":"Wall","cx":0.011903976174146291,"cy":-2.5576059798956923,"cz":1.5186399018658703,"lx":0.43300450869804646,"ly":0.3,"lz":0.8626045741320808,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.0372798037317406,"rightTopPartialHeight":3.0372798037317406,"relativeAngle":3.0767985154612743e-15,"leftPoint":[-0.20459827817487694,-2.5576059798956927,0],"rightPoint":[0.22840623052316952,-2.5576059798956914,0],"leftJoints":["kAomEduDnbZXe9fMR2J4vS"],"rightJoints":["xrMk4ZTC1gwLZELF3Hm4PW"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"kVBpA22r7rMwMak56bdzNG","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vX75xVcns2UiTk795WQxu9","leftRoofHeight":0.8626045741320808,"rightRoofHeight":0.8626045741320808,"locked":true},{"type":"Wall","cx":0.22840623052316894,"cy":-1.7122028473101973,"cz":0,"lx":1.690806265170988,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"relativeAngle":1.5707963267948974,"leftPoint":[0.22840623052316952,-2.5576059798956914,0],"rightPoint":[0.22840623052316833,-0.8667997147247033,0],"leftJoints":["kVBpA22r7rMwMak56bdzNG"],"rightJoints":["9LP2kDJGn2neiYDzDX66JW"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"xrMk4ZTC1gwLZELF3Hm4PW","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vX75xVcns2UiTk795WQxu9","leftRoofHeight":0.8626045741320808,"rightRoofHeight":1.4200281664406509,"centerRoofHeight":[0.5,1.9880394330169113],"locked":true},{"type":"Wall","cx":0.011903976174146083,"cy":-0.8667997147247029,"cz":0,"lx":0.4330045086980445,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"relativeAngle":3.1415926535897913,"leftPoint":[0.22840623052316833,-0.8667997147247033,0],"rightPoint":[-0.20459827817487616,-0.8667997147247025,0],"leftJoints":["xrMk4ZTC1gwLZELF3Hm4PW"],"rightJoints":["kAomEduDnbZXe9fMR2J4vS"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"9LP2kDJGn2neiYDzDX66JW","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vX75xVcns2UiTk795WQxu9","leftRoofHeight":1.9880394330169113,"rightRoofHeight":1.9880394330169113,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.5680112665762603,"thickness":0.1,"rValue":2,"color":"#ffffff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Gable","roofStructure":"Default","wallsId":["kVBpA22r7rMwMak56bdzNG"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"vX75xVcns2UiTk795WQxu9","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"locked":true},{"type":"Wall","cx":-0.20459827817487508,"cy":1.0250055239867875,"cz":0,"lx":3.7836104774229744,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"relativeAngle":-1.5707963267948963,"leftPoint":[-0.20459827817487566,2.9168107626982747,0],"rightPoint":[-0.20459827817487453,-0.8667997147247,0],"leftJoints":["hb7Tux4vCn6v5A6JnAifhr"],"rightJoints":["ji3RWSoHzqrqxaW2CNta4W"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"wwL7bfAKTRXceXoVXbnQe9","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"sFQv2f1u7oD1ozyFQA6CvB","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"locked":true},{"type":"Wall","cx":-0.005847552410961521,"cy":2.9252948707181776,"cz":0,"lx":0.3978634493419871,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"relativeAngle":-3.09893137333499,"leftPoint":[0.19290317335295262,2.93377897873808,0],"rightPoint":[-0.20459827817487566,2.9168107626982747,0],"leftJoints":["33r7faucqj1HNFffUsMqbr"],"rightJoints":["wwL7bfAKTRXceXoVXbnQe9"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"hb7Tux4vCn6v5A6JnAifhr","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"sFQv2f1u7oD1ozyFQA6CvB","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"locked":true},{"type":"Wall","cx":0.21065470193806246,"cy":1.0334896320066904,"cz":0,"lx":3.800744515522147,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"relativeAngle":1.580137542273405,"leftPoint":[0.22840623052317233,-0.8667997147246993,0],"rightPoint":[0.19290317335295262,2.93377897873808,0],"leftJoints":["ji3RWSoHzqrqxaW2CNta4W"],"rightJoints":["hb7Tux4vCn6v5A6JnAifhr"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"33r7faucqj1HNFffUsMqbr","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"sFQv2f1u7oD1ozyFQA6CvB","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"locked":true},{"type":"Wall","cx":0.011903976174146083,"cy":-0.8667997147247029,"cz":0,"lx":0.4330045086980445,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"relativeAngle":-1.7947991340190846e-15,"leftPoint":[-0.20459827817487616,-0.8667997147247025,0],"rightPoint":[0.22840623052316833,-0.8667997147247033,0],"leftJoints":["wwL7bfAKTRXceXoVXbnQe9"],"rightJoints":["33r7faucqj1HNFffUsMqbr"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"ji3RWSoHzqrqxaW2CNta4W","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"sFQv2f1u7oD1ozyFQA6CvB","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.1,"rValue":2,"color":"#ffffff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["ji3RWSoHzqrqxaW2CNta4W","33r7faucqj1HNFffUsMqbr","hb7Tux4vCn6v5A6JnAifhr","wwL7bfAKTRXceXoVXbnQe9"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"sFQv2f1u7oD1ozyFQA6CvB","locked":true},{"type":"Wall","cx":-0.20459827817487655,"cy":-1.7122028473101976,"cz":0,"lx":1.6908062651709903,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"leftJoints":["kQgqBbuoJMHBFT8g1JN1tC"],"rightJoints":["3c6cWYJDLKfbWoov8rSetU"],"leftPoint":[-0.20459827817487616,-0.8667997147247025,0],"rightPoint":[-0.20459827817487694,-2.5576059798956927,0],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"hQDTYviozPxCLRiuoq8YbP","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bi1wbzAS6GmbpEfuCH6pB4","leftRoofHeight":1.4200281664406509,"rightRoofHeight":0.8626045741320808,"centerRoofHeight":[-0.5,1.9880394330169113],"selected":false,"locked":true},{"type":"Wall","cx":0.011903976174146291,"cy":-2.5576059798956923,"cz":1.5186399018658703,"lx":0.43300450869804646,"ly":0.3,"lz":0.8626045741320808,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.0372798037317406,"rightTopPartialHeight":3.0372798037317406,"leftJoints":["hQDTYviozPxCLRiuoq8YbP"],"rightJoints":["3SCoUPNSFfffHGPmvk8DUC"],"leftPoint":[-0.20459827817487694,-2.5576059798956927,0],"rightPoint":[0.22840623052316952,-2.5576059798956914,0],"relativeAngle":3.0767985154612743e-15,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"3c6cWYJDLKfbWoov8rSetU","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bi1wbzAS6GmbpEfuCH6pB4","leftRoofHeight":0.8626045741320808,"rightRoofHeight":0.8626045741320808,"selected":false,"locked":true},{"type":"Wall","cx":0.22840623052316894,"cy":-1.7122028473101973,"cz":0,"lx":1.690806265170988,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"leftJoints":["3c6cWYJDLKfbWoov8rSetU"],"rightJoints":["kQgqBbuoJMHBFT8g1JN1tC"],"leftPoint":[0.22840623052316952,-2.5576059798956914,0],"rightPoint":[0.22840623052316833,-0.8667997147247033,0],"relativeAngle":1.5707963267948974,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"3SCoUPNSFfffHGPmvk8DUC","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bi1wbzAS6GmbpEfuCH6pB4","leftRoofHeight":0.8626045741320808,"rightRoofHeight":1.4200281664406509,"centerRoofHeight":[0.5,1.9880394330169113],"selected":false,"locked":true},{"type":"Wall","cx":0.011903976174146083,"cy":-0.8667997147247029,"cz":0,"lx":0.4330045086980445,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"leftJoints":["3SCoUPNSFfffHGPmvk8DUC"],"rightJoints":["hQDTYviozPxCLRiuoq8YbP"],"leftPoint":[0.22840623052316833,-0.8667997147247033,0],"rightPoint":[-0.20459827817487616,-0.8667997147247025,0],"relativeAngle":3.1415926535897913,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"kQgqBbuoJMHBFT8g1JN1tC","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bi1wbzAS6GmbpEfuCH6pB4","leftRoofHeight":1.9880394330169113,"rightRoofHeight":1.9880394330169113,"selected":false,"locked":true},{"id":"bi1wbzAS6GmbpEfuCH6pB4","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.5680112665762603,"color":"#ffffff","rValue":2,"ceilingRValue":2,"sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["3c6cWYJDLKfbWoov8rSetU"],"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"selected":false,"locked":true},{"type":"Wall","cx":-0.20459827817487508,"cy":1.0250055239867875,"cz":0,"lx":3.7836104774229744,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"leftJoints":["oo7zYTZq5M8KXcmw8fK7tD"],"rightJoints":["ij5SdFExjnoBJBDeaF2ioW"],"leftPoint":[-0.20459827817487566,2.9168107626982747,0],"rightPoint":[-0.20459827817487453,-0.8667997147247,0],"relativeAngle":-1.5707963267948963,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"uizhgrZpeyc2KYB1TvZ5Nf","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8m9Vi16SPU3YiAzGyrbieq","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"selected":false,"locked":true},{"type":"Wall","cx":-0.005847552410961521,"cy":2.9252948707181776,"cz":0,"lx":0.3978634493419871,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"leftJoints":["mgWkbY4DegHxFAvRa9Bw4F"],"rightJoints":["uizhgrZpeyc2KYB1TvZ5Nf"],"leftPoint":[0.19290317335295262,2.93377897873808,0],"rightPoint":[-0.20459827817487566,2.9168107626982747,0],"relativeAngle":-3.09893137333499,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"oo7zYTZq5M8KXcmw8fK7tD","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8m9Vi16SPU3YiAzGyrbieq","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"selected":false,"locked":true},{"type":"Wall","cx":0.21065470193806246,"cy":1.0334896320066904,"cz":0,"lx":3.800744515522147,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"leftJoints":["ij5SdFExjnoBJBDeaF2ioW"],"rightJoints":["oo7zYTZq5M8KXcmw8fK7tD"],"leftPoint":[0.22840623052317233,-0.8667997147246993,0],"rightPoint":[0.19290317335295262,2.93377897873808,0],"relativeAngle":1.580137542273405,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"mgWkbY4DegHxFAvRa9Bw4F","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8m9Vi16SPU3YiAzGyrbieq","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"selected":false,"locked":true},{"type":"Wall","cx":0.011903976174146083,"cy":-0.8667997147247029,"cz":0,"lx":0.4330045086980445,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"leftJoints":["uizhgrZpeyc2KYB1TvZ5Nf"],"rightJoints":["mgWkbY4DegHxFAvRa9Bw4F"],"leftPoint":[-0.20459827817487616,-0.8667997147247025,0],"rightPoint":[0.22840623052316833,-0.8667997147247033,0],"relativeAngle":-1.7947991340190846e-15,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"ij5SdFExjnoBJBDeaF2ioW","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8m9Vi16SPU3YiAzGyrbieq","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"selected":false,"locked":true},{"id":"8m9Vi16SPU3YiAzGyrbieq","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"color":"#ffffff","rValue":2,"ceilingRValue":2,"sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["ij5SdFExjnoBJBDeaF2ioW","mgWkbY4DegHxFAvRa9Bw4F","oo7zYTZq5M8KXcmw8fK7tD","uizhgrZpeyc2KYB1TvZ5Nf"],"selected":false,"locked":true},{"type":"Foundation","cx":11.311392901943481,"cy":-4.7142040538495555,"cz":0.05,"lx":0.7913071632562995,"ly":6.7897393900555105,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.7770205829878756],"parentId":"Ground","color":"#808080","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"rValue":2,"id":"qRkMdipDNgMrnuysUddPgu","selected":false,"notBuilding":true,"locked":true},{"type":"Door","cx":-0.11315789473684208,"cy":0,"cz":-0.06153846153846153,"lx":0.6894736842105263,"ly":0,"lz":0.8769230769230769,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"joaXtauLNr5aPP2tqqpryi","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","id":"keZr7qBSZM6JD1wUNN3RrV","interior":true,"locked":true},{"type":"Door","cx":0.12368421052631581,"cy":0,"cz":-0.06538461538461539,"lx":0.668421052631579,"ly":0,"lz":0.8692307692307693,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"kmaifBj79SDvw8jCqEakPi","foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","id":"vp6vHpvNfTH54o1tThWij3","interior":true,"locked":true},{"type":"Door","cx":-0.2611111111111111,"cy":0,"cz":-0.030769230769230764,"lx":0.3000000000000001,"ly":0,"lz":0.9384615384615385,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dMQfydvLoQmsUVh8GcfQWg","foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","id":"b4ReFVnndEjjEwadJrJfnm","interior":true,"locked":true},{"type":"Door","cx":0.2277777777777778,"cy":0,"cz":-0.03461538461538463,"lx":0.3666666666666666,"ly":0,"lz":0.9307692307692308,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iYLfpK8sAzBxMk4mz1BXiS","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","id":"wa145FYVqDahTu1KJYV3LK","interior":true,"locked":true},{"type":"Door","cx":0.12368421052631574,"cy":0,"cz":-0.06538461538461539,"lx":0.6684210526315789,"ly":0,"lz":0.8692307692307693,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"sCZzaqpAQeUmKwng1WHaCF","foundationId":"o2WibZi2fR7HySSdFgPoda","id":"1r7udrYyCT7hkUCv5siuDw","locked":true},{"type":"Door","cx":-0.12368421052631574,"cy":0,"cz":-0.06538461538461539,"lx":0.6684210526315789,"ly":0,"lz":0.8692307692307693,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gv3LzTTefsaZrtK8Lzx2bM","foundationId":"hLsewK7zX5Mau5SErFyCiz","id":"vASnwHDvzPR9avU565RVbd","locked":true},{"type":"Door","cx":0.26111111111111107,"cy":0,"cz":-0.042307692307692296,"lx":0.29999999999999993,"ly":0,"lz":0.9153846153846155,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"i7SnyGKg3wpYfMg2Ck4kpZ","foundationId":"hLsewK7zX5Mau5SErFyCiz","id":"ewo4SkBBdDL4Dgy9tWDw9P","locked":true},{"type":"Door","cx":-0.26111111111111107,"cy":0,"cz":-0.042307692307692296,"lx":0.2999999999999998,"ly":0,"lz":0.9153846153846155,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gZiomgVxY3vk4YfQ9Jjh6B","foundationId":"o2WibZi2fR7HySSdFgPoda","id":"7HwzJtGpVjcSG4pVEZX7yq","locked":true},{"type":"Door","cx":-0.10744643820625929,"cy":0,"cz":-0.06153846153846153,"lx":0.6583928464374896,"ly":0,"lz":0.8769230769230769,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"u1GLQPod2yRsFy4dWHVdVa","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","id":"kmWJjPpjeytKavWK96TyyH","locked":true},{"type":"Door","cx":4.4664000438593557e-17,"cy":0,"cz":-0.038461538461538464,"lx":0.8390809794142997,"ly":0,"lz":0.9230769230769231,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"aMAoC9G4MpUPGJVmt36yfP","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","id":"hMEcTxQ4NT4QbuYeBXMCEV","locked":true},{"type":"Door","cx":0.13912500749375725,"cy":0,"cz":-0.06153846153846153,"lx":0.5950357078624938,"ly":0,"lz":0.8769230769230769,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"eTsfM9k5RPHprx93KkShya","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","id":"vbLxh8TTREuj8zv66LqoAM","locked":true},{"type":"Door","cx":-0.2823529411764706,"cy":0,"cz":-0.010869565217391304,"lx":0.38823529411764707,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"vqP69iA4TuZd8ZEvPBLjzU","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"vbUoZmBsuZRXzK6QXsDYtV","locked":true},{"type":"Door","cx":0.2823529411764706,"cy":0,"cz":-0.010869565217391304,"lx":0.38823529411764707,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"vqP69iA4TuZd8ZEvPBLjzU","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"fknzp5TF4y6Z2JezdMmUnw","locked":true},{"type":"Door","cx":-0.46282051282051284,"cy":0,"cz":-0.004347826086956506,"lx":0.053846153846153884,"ly":0,"lz":0.991304347826087,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"62KCpUdkhCRr3ExkPE3Sd1","locked":true},{"type":"Door","cx":0.458974358974359,"cy":0,"cz":-0.004347826086956506,"lx":0.061538461538461424,"ly":0,"lz":0.991304347826087,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"oHCJ27NVx4XbdXZVcpvNo5","locked":true},{"type":"Door","cx":-0.4615384615384616,"cy":0,"cz":-0.004347826086956506,"lx":0.056410256410256404,"ly":0,"lz":0.991304347826087,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"3deR2pFWoANWBbeogtfdY4","locked":true},{"type":"Door","cx":0.2823529411764706,"cy":0,"cz":-0.0017278291556811246,"lx":0.3882352941176471,"ly":0,"lz":0.9965443416886377,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6bfpYPQw2M5RbKRsLfDauC","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"nAw5K9QrWgALjVNPKgbC1o","locked":true},{"type":"Door","cx":-0.2823529411764706,"cy":0,"cz":-0.010869565217391304,"lx":0.3882352941176471,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6bfpYPQw2M5RbKRsLfDauC","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"kNSEPx2oK4SSg7KeM6Ty8x","locked":true},{"type":"Door","cx":0.46282051282051284,"cy":0,"cz":-0.010869565217391304,"lx":0.053846153846153884,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"5UP5zCx3iEA1h5gxGrabow","locked":true},{"type":"Door","cx":0.00641025641025641,"cy":0,"cz":-0.010869565217391304,"lx":0.11538461538461539,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"nd9aBdZVvLyLxm6LSWmReW","locked":true},{"type":"Window","cx":19.271100620021265,"cy":-4.54768812158822,"cz":12.260904466364499,"lx":2.748705948983199,"ly":0.2,"lz":6.901186917106701,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.14952541119872453,0,2.220446049250313e-16],"parentId":"byzwW7Db61R9EfVcvoWVQ9","parentType":"Roof","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"5kDW9Ug8bkdf5i9qjLd7bj","locked":true},{"type":"Window","cx":19.227858803067697,"cy":4.981211897402677,"cz":12.264615427486488,"lx":2.8786302292092456,"ly":0.2,"lz":6.844179828287683,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.14952541119872476,0,3.141592653589793],"parentId":"byzwW7Db61R9EfVcvoWVQ9","parentType":"Roof","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"oxL6YVVCiXau1r4WQuSjxn","locked":true},{"type":"Window","cx":-17.18252886122661,"cy":-4.622268332707515,"cz":12.249668970719181,"lx":2.2316030028692726,"ly":0.2,"lz":6.893564122242849,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.14952541119872476,0,2.220446049250313e-16],"parentId":"byzwW7Db61R9EfVcvoWVQ9","parentType":"Roof","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"rqUXFDFwX2z3bbGtXfBcfd","locked":true},{"type":"Window","cx":-17.11075110661269,"cy":5.168142143612845,"cz":12.236454418879077,"lx":2.3271871087906195,"ly":0.2,"lz":6.844860410467514,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.1495254111987243,0,3.1415926535897936],"parentId":"byzwW7Db61R9EfVcvoWVQ9","parentType":"Roof","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"qAswaYhvWDiHawY6iYvLWG","locked":true}],"sceneRadius":90,"view":{"yearlyLightSensorPanelRect":{"height":500,"width":600,"x":0,"y":0},"showYearlyParabolicDishYieldPanel":false,"showDesignInfoPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"showInstructionPanel":true,"dailyParabolicTroughYieldPanelRect":{"height":400,"x":0,"width":600,"y":0},"dailyPvYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"yearlyLightSensorPanelShowDaylight":false,"cameraPosition":[28.761610676892403,-33.63667545263391,8.036616917846569],"yearlyPvYieldPanelX":0,"showDailyHeliostatYieldPanel":false,"solarRadiationHeatMapMaxValue":3,"showDailyPvYieldPanel":false,"showSunAngles":false,"yearlyParabolicDishYieldPanelY":0,"showYearlyPvYieldPanel":false,"yearlyParabolicDishYieldPanelRect":{"width":600,"y":0,"height":400,"x":0},"mapZoom":19,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"yearlyPvYieldPanelY":0,"dailyHeliostatYieldPanelY":0,"showYearlyBuildingEnergyPanel":false,"mapWeatherStations":false,"stickyNotePanelX":0,"dailyPvYieldPanelY":0,"dailyFresnelReflectorYieldPanelY":0,"yearlyHeliostatYieldPanelX":0,"cameraZoom":18.050000000000008,"yearlyParabolicTroughYieldPanelY":0,"yearlyPvYieldPanelRect":{"width":600,"height":400,"x":0,"y":0},"theme":"Default","dailyLightSensorPanelRect":{"height":360,"y":0,"width":600,"x":0},"dailyFresnelReflectorYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"heatFluxColor":"gray","showYearlyFresnelReflectorYieldPanel":false,"solarPanelShininess":100,"mapType":"roadmap","yearlyParabolicTroughYieldPanelX":0,"cameraPosition2D":[9.356963094823977,-6.143696261834446,150],"showDailyLightSensorPanel":false,"weatherPanelX":0,"yearlyFresnelReflectorYieldPanelX":0,"visibilityResultsPanelRect":{"x":0,"height":470,"y":0,"width":600},"showDailyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelRect":{"width":600,"height":400,"y":0,"x":0},"showHeliodonPanel":false,"windowShininess":200,"yearlyLightSensorPanelY":0,"dailyParabolicDishYieldPanelY":0,"panCenter2D":[9.356963094823977,-6.142695884375581,-0.000007053447453632921],"dailyHeliostatYieldPanelX":0,"showWeatherPanel":false,"heliodonPanelY":0,"yearlyParabolicDishYieldPanelX":0,"mapPanelX":0,"dailyPvYieldPanelX":0,"weatherPanelY":0,"showMapPanel":false,"stickyNotePanelY":0,"yearlyHeliostatYieldPanelY":0,"groundImage":true,"dailyHeliostatYieldPanelRect":{"y":0,"x":0,"height":400,"width":600},"panCenter":[-1.9927664106999077,1.50952086360681,5.064941130407551],"showYearlyLightSensorPanel":false,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"ambientLightIntensity":0.1,"showSolarPanelVisibilityResultsPanel":false,"mapPanelY":0,"dailyParabolicDishYieldPanelX":0,"orthographic":false,"showElevationAngle":true,"dailyParabolicTroughYieldPanelY":0,"axes":true,"showStickyNotePanel":false,"heliodon":false,"yearlyLightSensorPanelShowClearness":false,"yearlyLightSensorPanelX":0,"dailyUpdraftTowerYieldPanelRect":{"height":550,"y":0,"x":0,"width":640},"yearlyFresnelReflectorYieldPanelY":0,"mapTilt":0,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelX":0,"showDailyFresnelReflectorYieldPanel":false,"showEconomicsPanel":false,"showAzimuthAngle":true,"dailyLightSensorPanelY":0,"showDailyUpdraftTowerYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"enableRotate":true,"diurnalTemperaturePanelRect":{"width":600,"x":0,"y":0,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"waterSurface":false,"showZenithAngle":true,"evolutionPanelRect":{"y":0,"width":640,"height":400,"x":0},"showYearlyUpdraftTowerYieldPanel":false,"shadowEnabled":true,"yearlyFresnelReflectorYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"yearlyHeliostatYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"showDiurnalTemperaturePanel":false,"autoRotate":false,"solarRadiationHeatMapReflectionOnly":false,"heliodonPanelX":0,"groundColor":"#16A5A5","heatFluxScaleFactor":20,"heatFluxWidth":0.5,"showSiteInfoPanel":true,"dailyFresnelReflectorYieldPanelX":0,"yearlyUpdraftTowerYieldPanelRect":{"height":400,"x":0,"y":0,"width":600},"weatherPanelRect":{"width":500,"height":500,"x":0,"y":0},"visibilityResultsPanelX":0,"showDailyParabolicTroughYieldPanel":false,"showEvolutionPanel":false,"showYearlyHeliostatYieldPanel":false,"groundImageType":"roadmap"},"graphState":{"dailyParabolicTroughIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyPvIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"rowsPerRack":1,"tiltAngle":0,"poleHeight":1,"rowAxis":"Zonal","orientation":"Landscape","pvModelName":"SPR-X21-335-BLK","interRowSpacing":2,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"maximumInterRowSpacing":10,"pvModelName":"CS6X-355P-FG","minimumTiltAngle":-1.5707963267948966,"poleHeight":1,"rowAxis":"Zonal","maximumRowsPerRack":6,"poleSpacing":5,"minimumInterRowSpacing":2,"maximumTiltAngle":1.5707963267948966,"minimumRowsPerRack":1,"orientation":"Landscape"},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"objectiveFunctionType":1,"inertia":0.8,"searchMethod":1,"maximumSteps":5,"vmax":0.01,"cognitiveCoefficient":0.1,"swarmSize":20,"socialCoefficient":0.1,"convergenceThreshold":0.01,"problem":"Solar Panel Tilt Angle","localSearchRadius":0.1},"geneticAlgorithmParams":{"convergenceThreshold":0.01,"problem":"Solar Panel Tilt Angle","mutationRate":0.1,"maximumGenerations":5,"selectionMethod":1,"localSearchRadius":0.1,"searchMethod":1,"populationSize":20,"crossoverRate":0.5,"objectiveFunctionType":1,"selectionRate":0.5}},"economicsParams":{"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15,"projectLifeSpan":25},"modelType":"School Building","modelAuthor":"The Architect","modelLabel":"Yeni\u015fehir Belediyesi Bilim ve Sanat Merkezi","modelDescription":"Mersin Yeni\u015fehir Belediyesi B\u0130LSEM","notes":[]}')},466:function(e){e.exports=JSON.parse('{"docid":"tM5fjWZLVef6uQTttZQufM","time":"11/13/2022 07:15 pm","timestamp":1668384959038,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"6/22/2022 4:00:00 PM","longitude":-110.9747108,"latitude":32.2226066,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Tucson, AZ, USA","timesPerHour":20,"orthographic":false,"cameraZoom":15.475618749999999,"solarRadiationHeatmapGridCellSize":2,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cz":0.10000000074506517,"id":"2gPWTJVs8iqE6rVTtrnnd8","name":"Julio","normal":[0,1,0],"cy":-19.528888002511724,"type":"Human","cx":13.490029797984572,"rotation":[0,0,0],"selected":false,"parentId":"Ground","lx":0.5,"ly":0.42,"lz":1.76},{"ly":17.026616933032848,"cy":-19.859023165912554,"cz":0.05,"lz":0.1,"selected":false,"lx":36.16252356452459,"type":"Foundation","id":"dqxcN6K9GVQLtZRykzonbS","cx":0.03966683604024013,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #2"},{"normal":[0,0,1],"type":"Tree","rotation":[0,0,0],"lx":4,"cx":-23.993252440580314,"id":"ibv7qyFAZNTUiSKfRnG81J","cz":-8.881784197001252e-16,"selected":false,"cy":-7.809220875702906,"lz":10,"name":"Birch","parentId":"Ground"},{"selected":false,"poleSpacing":4,"lz":0.046,"cy":-0.023651645489680885,"drawSunBeam":true,"poleRadius":0.05,"label":"Solar Panel","ly":3.12,"lx":20.99,"rotation":[0,0,0],"type":"Solar Panel","tiltAngle":0.05235987755982989,"poleHeight":2.5,"normal":[0,0,1],"orientation":"Portrait","cz":0.5000000074505628,"relativeAzimuth":0,"cx":-0.14046178216409752,"showLabel":false,"id":"kLwberNeAuQDEs45xghUMw","trackerType":"None","parentId":"dqxcN6K9GVQLtZRykzonbS","foundationId":"dqxcN6K9GVQLtZRykzonbS","pvModelName":"SPR-X21-335-BLK"},{"id":"5wtQcSRJfXRx7dRi95EJjx","cy":-17.66536908075935,"type":"Human","rotation":[0,0,0],"cz":0.10000000074505806,"selected":false,"cx":7.100228690010481,"normal":[0,1,0],"name":"Jade","parentId":"Ground","lx":0.48,"ly":0.48,"lz":1.6},{"cx":-23.340488252107782,"cz":0,"id":"tJeB5NfeXNiu4x7bJzUo9c","selected":false,"rotation":[0,0,0],"lz":4.164962493910564,"name":"Apple","normal":[0,0,1],"type":"Tree","lx":4.059299397551073,"cy":-22.87864367350907,"parentId":"Ground"},{"type":"Human","name":"Jedi","id":"wizaQCLaDPXxAgvgzpYzE5","cy":-26.52645438589241,"rotation":[0,0,0],"cx":-20.391856797710087,"selected":false,"cz":-7.105427357601002e-15,"normal":[0,1,0],"parentId":"Ground","lx":0.56,"ly":0.56,"lz":1.75},{"name":"Jocelyn","rotation":[0,0,0],"cz":-9.833932535276902e-15,"cx":-5.594678028642042,"type":"Human","normal":[0,1,0],"id":"8gaXxvd41d1wtkBveac2iT","cy":-24.46034584888105,"selected":false,"parentId":"Ground","lx":0.4,"ly":0.6,"lz":1.72},{"selected":false,"rotation":[0,0,0],"id":"tSCfpjZEaf2LdYnKVymp8f","cx":-24.035139369880795,"cy":-11.60375573934435,"normal":[0,1,0],"cz":8.881784197001252e-16,"name":"Judd","type":"Human","parentId":"Ground","lx":0.544,"ly":0.544,"lz":1.68},{"type":"Human","cy":-26.346953604384606,"name":"Jeff","normal":[0,1,0],"selected":false,"cx":-14.95104385552803,"cz":0.10000000074506517,"rotation":[0,0,0],"id":"649JwdxAWZ8uAmjtuwCu7m","parentId":"Ground","lx":0.6,"ly":0.6,"lz":1.65},{"id":"v8yuSV55idFvdSiztzVfkc","cz":0.10000000074506517,"type":"Human","normal":[0,1,0],"selected":false,"cy":-25.080741421179635,"cx":-1.3149126517891083,"rotation":[0,0,0],"name":"Joey","parentId":"Ground","lx":0.462,"ly":0.695,"lz":1.72},{"type":"Tree","name":"Linden","cx":30.437792865488664,"cy":-17.386067284775812,"cz":-7.105427357601002e-15,"lx":23,"lz":17,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rWrzivW4afibFuZheu2ZqV","selected":false},{"type":"Tree","name":"Birch","cx":-23.798739662505156,"cy":3.0810007914333255,"cz":0,"lx":4,"lz":10,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rd1CFzdzbUa21QJwgHv8cP","selected":false},{"type":"Cuboid","cx":-0.09692665761748831,"cy":-0.09694518863336476,"cz":10.01793918410506,"lx":36.06261166884342,"ly":21.672025065737824,"lz":18.410192174768163,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["Facade #10","Facade #10","Facade #10","Facade #10","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"aj9AkMLHmiC7fiuGVPs4H7","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-12.88108244582257,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"oHeGQDazJuZsZxKRzGGPDD","selected":false},{"type":"Flower","name":"Hydrangea","cx":-10.88108244582257,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"n7tcVJNYuVeGnjeGQXZtpb","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-8.88108244582257,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"jY9Y4Lm3QMDVY6ThY32QL6","selected":false},{"type":"Flower","name":"Hydrangea","cx":-6.881082445822569,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"ijsBYLU6Xgn2UahtDbM3ax","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-4.881082445822569,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"aMGVaSDxGidE4hAekjvzp1","selected":false},{"type":"Flower","name":"Hydrangea","cx":-2.8810824458225692,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"jNS7CLQtTgERjMBryrJy3f","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-0.8810824458225692,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"m5iTV6jNY7ctTerZ1zT3mN","selected":false},{"type":"Flower","name":"Hydrangea","cx":1.1189175541774308,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"obmBrYQNng1HztDQMhFTdF","selected":false},{"type":"Flower","name":"Yellow Flower","cx":3.1189175541774308,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"bX5gWjKNUmXEpNE3CSVo5i","selected":false},{"type":"Flower","name":"Hydrangea","cx":5.118917554177431,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"e1T6XS94X1vuZYnmBeSzv3","selected":false},{"type":"Tree","name":"Birch","cx":-23.930414200652432,"cy":-2.885662218323219,"cz":8.881784197001252e-16,"lx":4,"lz":10,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"jDrfaAvoEqu7y5suMRTWYc","selected":false}],"view":{"shadowEnabled":true,"showYearlyLightSensorPanel":false,"showStickyNotePanel":false,"mapTilt":0,"showSiteInfoPanel":true,"showHeliodonPanel":false,"stickyNotePanelX":6,"groundColor":"forestgreen","showWeatherPanel":false,"showDailyLightSensorPanel":false,"heliodonPanelX":-1235,"weatherPanelX":0,"groundImage":false,"autoRotate":false,"axes":true,"weatherPanelY":0,"groundPanelX":0,"theme":"Forest","mapWeatherStations":false,"mapType":"roadmap","yearlyLightSensorPanelY":70,"mapZoom":16,"stickyNotePanelY":0,"showGroundPanel":false,"heliodonPanelY":7,"yearlyLightSensorPanelX":-905,"dailyLightSensorPanelY":15,"heliodon":false,"dailyLightSensorPanelX":-19,"groundPanelY":0,"showMapPanel":false,"cameraPosition":[-16.291066490441285,-43.009068926241156,5.496187293258948],"panCenter":[2.1268141574348576,-9.161736732265924,5.496187293258948],"orthographic":false,"enableRotate":true,"cameraZoom":12.604988194492185,"showInstructionPanel":true,"cameraPosition2D":[4.203619393633803,-8.791827721460434,49.9999912078788],"panCenter2D":[4.203619393633803,-8.791777719248431,0.0000016660811664248792]},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[""]}')},467:function(e){e.exports=JSON.parse('{"docid":"i1UYg29b6kEuhDLMCMNpP5","time":"11/13/2022 07:17 pm","timestamp":1668385042826,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"longitude":-71.0588801,"timesPerHour":20,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"name":"default","orthographic":false,"date":"6/22/2022 2:00:00 PM","latitude":42.3600825,"address":"Boston, MA, USA","cameraZoom":15.475618749999999,"solarRadiationHeatmapGridCellSize":2,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"selected":false,"cz":8.856282232714092,"faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"ly":33.93664889246779,"rotation":[0,0,-0.0032691065367469463],"parentId":"Ground","color":"#ffffff","locked":true,"textureTypes":["Facade #6","Facade #6","Facade #6","Facade #6","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"lx":13.425069388064955,"cx":-6.488470028429835,"lz":17.712564465428184,"type":"Cuboid","cy":0.019620316414646233,"id":"aj9AkMLHmiC7fiuGVPs4H7"},{"ly":21.367362944163304,"parentId":"Ground","textureType":"Foundation Texture #5","id":"nkyNmQGMpysyBAzvoXacg4","normal":[0,0,1],"cz":0.15,"cy":-0.6842314918166474,"rotation":[0,0,0],"locked":true,"selected":false,"cx":7.741690731109698,"lx":8.748703583308991,"type":"Foundation","lz":0.3},{"cz":0.10000000074505806,"normal":[0,1,0],"cx":8.66688372110198,"cy":-13.746548548931791,"type":"Human","parentId":"Ground","rotation":[0,0,0],"id":"4Vzhap6VgrCQ5NTbMiLqko","name":"Jacqueline","selected":false,"lx":0.43,"ly":0.6,"lz":1.78},{"lz":18,"id":"68fHvB4gguggDahyWhJ4SX","rotation":[0,0,0],"locked":true,"parentId":"Ground","type":"Tree","normal":[0,1,0],"lx":20,"cz":0.10000000074505806,"cx":13.623011710923919,"selected":false,"name":"Oak","cy":12.95292752972638},{"textureType":"Foundation Texture #1","rotation":[0,0,0],"normal":[0,0,1],"id":"mB2npz1re5TLiTmp6dijK4","selected":false,"cz":0.25,"parentId":"Ground","lz":0.5,"cy":-0.6991379361374314,"locked":true,"lx":0.5880095062712664,"type":"Foundation","ly":22.361419422277052,"cx":12.378216846473736},{"textureType":"Foundation Texture #1","lz":0.5,"lx":8.699592487769063,"cx":7.739060103053577,"normal":[0,0,1],"id":"6VQra4naAQFjguzsdBbGzc","selected":false,"ly":0.5266260617381799,"locked":true,"cz":0.25,"rotation":[0,0,0],"parentId":"Ground","cy":-11.625239464321695,"type":"Foundation"},{"cx":7.752694722563858,"parentId":"Ground","cz":0.25,"lz":0.5,"normal":[0,0,1],"id":"56rJdSeQkFjNtFMq7H6UpX","textureType":"Foundation Texture #1","lx":8.679570997286799,"type":"Foundation","selected":false,"rotation":[0,0,0],"cy":10.194687286684449,"ly":0.5386483210241274},{"id":"eU9g8aGc26unxecmNefMbn","locked":true,"cx":3.0473373691290284,"lz":0.5,"type":"Foundation","normal":[0,0,1],"cz":0.25,"parentId":"Ground","selected":false,"rotation":[0,0,0],"ly":22.40023737998388,"lx":0.7052822924117278,"textureType":"Foundation Texture #1","cy":-0.7141009093628288},{"parentId":"Ground","type":"Human","normal":[0,1,0],"selected":false,"cy":-13.302409805647457,"name":"June","id":"sRkZkptRmoDxYpUWxicUE2","cx":10.066230625457528,"cz":0.10000000074505806,"rotation":[0,0,0],"lx":0.65,"ly":0.65,"lz":1.85},{"type":"Human","id":"27tFcVkJUEjzAmNC6yi8q6","name":"Jedi","cy":-17.39224604987067,"rotation":[0,0,0],"parentId":"Ground","cx":11.172877256337918,"cz":0.10000000074505806,"normal":[0,1,0],"selected":false,"lx":0.56,"ly":0.56,"lz":1.75},{"cx":14.572429350273456,"cz":0.10000000074505762,"rotation":[0,0,0],"cy":-12.024223980842134,"selected":false,"normal":[0,1,0],"name":"Jose","parentId":"Ground","type":"Human","id":"h7GsvzmZmQv6Lgxa5TK46V","lx":2,"ly":2,"lz":1.6},{"lx":5,"parentId":"Ground","id":"at3dF6SQoavQM2mWXfaQoH","cz":0.10000000074505895,"rotation":[0,0,0],"cy":21.229675112263504,"normal":[0,1,0],"type":"Tree","cx":1.973403675763489,"locked":true,"lz":12,"name":"Pine","selected":false},{"textureType":"Foundation Texture #2","id":"6gVMaHq7VLa19eqMVECxpG","ly":52.39119915791477,"cz":0.05,"selected":false,"cx":-0.6875232985680384,"parentId":"Ground","locked":true,"type":"Foundation","rotation":[0,0,0],"cy":2.56875991707771,"normal":[0,0,1],"lz":0.1,"lx":37.85599614878349},{"cx":7.643885747803793,"selected":false,"locked":true,"id":"h8TwAvSyLwtPBvqze5mwzf","lz":9,"type":"Tree","cy":-21.507259849637833,"parentId":"Ground","rotation":[0,0,0],"cz":0.10000000074505762,"name":"Maple","lx":7,"normal":[0,1,0]},{"parentId":"Ground","lx":6,"locked":true,"type":"Tree","rotation":[0,0,0],"normal":[0,0,1],"cy":-20.556927102277076,"lz":7,"cz":0.10000000074505762,"id":"ujafmePw8rQZjxB8qy62oa","name":"Maple","selected":false,"cx":12.405622304747324},{"selected":false,"parentId":"Ground","id":"ckD1BgrHEqvMdo9aEBaYXU","type":"Human","rotation":[0,0,0],"normal":[0,1,0],"cy":-14.554057740143271,"name":"Jaya","cz":0.10000000074505806,"cx":5.006550016327088,"lx":0.6,"ly":0.6,"lz":1.55},{"rotation":[0,0,0],"name":"Judd","cy":-15.073100073321267,"cx":12.689715112185674,"parentId":"Ground","type":"Human","cz":0.1000000007450585,"normal":[0,1,0],"selected":false,"id":"npocC3zf2QhLeKj6LeXJvL","lx":0.544,"ly":0.544,"lz":1.68},{"cy":0.5804724345884147,"rotation":[0,0,0],"lz":19.49711020919501,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"cz":9.748555104597505,"color":"gray","cx":-2.205872934036133,"locked":true,"ly":0.8534746756143718,"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","lx":0.828070336814001,"id":"gdcpJkZkVZXJHaDmRtpFtw","selected":false},{"normal":[0,0,1],"cz":10.253341514775366,"color":"gray","parentId":"Ground","lz":20.506683029550732,"type":"Cuboid","selected":false,"id":"wJkGWJoWEXDPm4p9rWMB3a","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,0],"ly":0.8534746756143718,"faceColors":["gray","gray","gray","gray","gray","gray"],"cx":-2.105385998729491,"lx":0.828070336814001,"cy":2.869274580105114,"locked":true},{"ly":34.489830484403164,"cx":-6.481696563939499,"type":"Foundation","parentId":"Ground","lz":0.3,"cz":0.15,"rotation":[0,0,0],"id":"38Wmw6REgfAAEs5HtLXUmy","selected":false,"normal":[0,0,1],"cy":0.05822819825317893,"locked":true,"color":"#666666","lx":13.764674737343674},{"relativeAzimuth":0,"tiltAngle":0.42308540045443915,"poleSpacing":3,"cx":0.39547991802521515,"cz":0.5000000074505806,"lz":0.046,"id":"2BhUXhGXtbxsUZ6RL3rXMW","trackerType":"None","orientation":"Portrait","pvModelName":"SPR-X21-335-BLK","showLabel":false,"lx":1.046,"type":"Solar Panel","foundationId":"6gVMaHq7VLa19eqMVECxpG","poleHeight":2.6,"cy":0.0004767391535806561,"normal":[0,0,1],"selected":false,"ly":1.558,"drawSunBeam":false,"rotation":[0,0,0],"poleRadius":0.05,"parentId":"6gVMaHq7VLa19eqMVECxpG"},{"type":"Flower","name":"Boxwood","cx":14.589782607955689,"cy":-5.22248370768526,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"6LyjhRYrjyMM94sWFxmsqL","selected":false},{"type":"Flower","name":"Boxwood","cx":14.487482209296324,"cy":-7.284306500015294,"cz":0.05000000074505628,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"cAUoEVfsJryF5CiN2bA6FF","selected":false},{"type":"Flower","name":"Boxwood","cx":14.656720218433037,"cy":-3.0619235461512933,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"14ZankHi6YjP8eUwRAzc99","selected":false},{"type":"Flower","name":"Boxwood","cx":14.649968347802723,"cy":-0.5953981727630122,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"cKDzu7CNMKytpxg8x9M4vH","selected":false},{"type":"Flower","name":"Boxwood","cx":14.465946083296767,"cy":2.3705809858943816,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"2nJegakb4Q3dsnpjrnazGL","selected":false},{"type":"Flower","name":"Boxwood","cx":14.535486123826292,"cy":5.258763702004629,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"puhTw5YZiZX1mZayPv7eKr","selected":false},{"type":"Flower","name":"Boxwood","cx":14.562074464646393,"cy":-9.421018376024211,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"3aFBjoFzTN38LjxnNVca94","selected":false},{"type":"Flower","name":"Boxwood","cx":14.48848671206672,"cy":-11.828589152852121,"cz":0.050000000745059836,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"ksddQtWpUymEExWqGah9pg","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.602082126220235,"cy":-10.642654606813768,"cz":0.05000000074505628,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"ftch5sGAxD2dLW85VDsCvD","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.574840162280765,"cy":-13.130340588937553,"cz":0.05000000074506161,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"oVgmk99C2S2KZF2CFR1hGP","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.575588404543318,"cy":-8.21343708444617,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"9uo3Ts1QDRhb3aomxt4V2f","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.557819941105063,"cy":-6.106389769612514,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"agCMuQbpTFk2RqkwtebyV4","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.556683398866188,"cy":-4.0576139533384525,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"aFUE71bDFA2LjkNkJFEuii","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.64239387314273,"cy":-1.7994645182621838,"cz":0.050000000745059836,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"4Z9VuhUNw8DYwRbkqYhoHB","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.529383383564124,"cy":0.8679517875801537,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"nf7V66G4i2YFWuJXZENckj","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.581939017157946,"cy":3.902214931587771,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"kKWrifvQ6fGtZhJmgPvL5X","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.45704330414372,"cy":6.704146476013747,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"aL2Uhpp8HT6eUfWcMrtxWr","selected":false},{"type":"Flower","name":"Tall Bush","cx":-8.820527407137332,"cy":-21.01555787918438,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"czSxXH8n5KnbYhnZp9414E","selected":false},{"type":"Flower","name":"Tall Bush","cx":-5.64492924344334,"cy":-20.928730058607652,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"12s9PdvNM6rnixcYtcjVJm","selected":false},{"type":"Flower","name":"Tall Bush","cx":-2.4233695148043557,"cy":-21.043064672162302,"cz":0.05000000074506161,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"fnbqxsK1LLgKaQxJEJtzGY","selected":false},{"type":"Flower","name":"Tall Bush","cx":0.44859084832241436,"cy":-21.025210125432253,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"5HDDx2HYGe5rU4vkYUjLkn","selected":false},{"type":"Flower","name":"Tall Bush","cx":-11.802690551407991,"cy":-21.134263522232033,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"ii2AHuBu7eNYp9zExhjpBk","selected":false},{"type":"Flower","name":"Hosta","cx":13.888302021073589,"cy":-23.07433161468632,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"ry52Vu3ZtWa5Z5S4Cv3Fns","selected":false},{"type":"Flower","name":"Hosta","cx":13.000536079398454,"cy":-23.90262067298287,"cz":0.05000000074505895,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"2KvsyZDeNBQ15oEbTBWXTQ","selected":false},{"type":"Flower","name":"Hosta","cx":12.99992231969237,"cy":-22.436277503833722,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"sBdHaZQt67kBAXxPrttrkC","selected":false},{"type":"Flower","name":"Hosta","cx":7.96155182885969,"cy":-24.919269939427444,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"rErTYG7fvCUCgbP8phnFpb","selected":false},{"type":"Flower","name":"Hosta","cx":8.302339884724876,"cy":-23.511029051299055,"cz":0.05000000074506161,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"qREs5pGeMh2bn8266bra52","selected":false},{"type":"Flower","name":"Hosta","cx":12.046100627532674,"cy":-23.058422241294327,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"cFutgv9ep2vsCmwtcQ32FT","selected":false},{"type":"Flower","name":"Hosta","cx":7.459817492896914,"cy":-23.89304923816075,"cz":0.050000000745059836,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"meCdn2mUx41JAdUmabe62e","selected":false},{"type":"Flower","name":"Hosta","cx":8.773287043648144,"cy":-24.33842489149061,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"1zHSSdp6WfVgSDgmVd5A2g","selected":false},{"type":"Flower","name":"Peony","cx":15.825630097786828,"cy":-25.16699394950085,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"xi2HuxsfZQnvPjTKPQxrbF","selected":false},{"type":"Flower","name":"Peony","cx":16.48091229260942,"cy":-24.316745367707185,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"2Ake4uxrZPD3VybPtfduv3","selected":false},{"type":"Flower","name":"Peony","cx":16.886960727664686,"cy":-25.34224361063938,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"4obU3fsBjpjfoLx69cK5C6","selected":false}],"view":{"heliodonPanelY":7,"heliodon":false,"stickyNotePanelX":6,"showHeliodonPanel":false,"yearlyLightSensorPanelX":-905,"enableRotate":true,"dailyLightSensorPanelY":15,"mapZoom":16,"weatherPanelY":0,"cameraZoom":15.47561875,"groundPanelX":0,"showSiteInfoPanel":true,"showYearlyPvYieldPanel":false,"stickyNotePanelY":0,"yearlyLightSensorPanelY":70,"showYearlyLightSensorPanel":false,"axes":true,"orthographic":false,"showWeatherPanel":false,"cameraPosition":[31.71971744843037,-16.83871990124489,7.439938736584827],"mapTilt":0,"showMapPanel":false,"autoRotate":false,"groundPanelY":0,"mapWeatherStations":false,"showGroundPanel":false,"groundColor":"forestgreen","panCenter":[-1.577685546422091,0.586908253253759,7.439938736584823],"showInstructionPanel":true,"heliodonPanelX":-1235,"dailyLightSensorPanelX":-19,"shadowEnabled":true,"showStickyNotePanel":false,"showDailyPvYieldPanel":false,"groundImage":false,"mapType":"roadmap","showDailyLightSensorPanel":false,"theme":"Forest","weatherPanelX":0,"cameraPosition2D":[0.8790434579553117,3.516123829597026,50.00000351630349],"panCenter2D":[0.8790434579553117,3.5161738318194917,0.0000035163301233325335]},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[""]}')},468:function(e){e.exports=JSON.parse('{"docid":"pxi9S4wGaGxiW2Q28M7prc","time":"06/18/2023 07:07 pm","timestamp":1687129633099,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 1:30:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Miami, FL, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":25.7616798,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-80.1917902},"elements":[{"type":"Wall","cx":-0.5738138595304036,"cy":4.010364625861682,"cz":2.2408122612280286,"lx":18.01575243966671,"ly":0.3,"lz":9,"leftJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"rightJoints":["11Ltx28CSTVpm6gjZuBH9w"],"leftPoint":[8.434062360302951,4.010364625861682,0.1],"rightPoint":[-9.581690079363758,4.010364625861682,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n8LvMVp1hZ7BptmwrWpcMT","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"cgHKR8ai6snf9XinDUWwjd","selected":false,"leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.633496307266332,"rightUnfilledHeight":4.633496307266332,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":8.434062360302947,"cy":0.16844568443230257,"cz":2.2301039869226305,"lx":7.683837882858757,"ly":0.3,"lz":9,"leftJoints":["hndwqtrrygFvfqvBJrvZYu"],"rightJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"leftPoint":[8.434062360302942,-3.673473256997076,0.1],"rightPoint":[8.434062360302951,4.010364625861682,0.1],"relativeAngle":1.5707963267948957,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e5r2Cqz5K28ewHbKWcFnYZ","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"cgHKR8ai6snf9XinDUWwjd","selected":false,"leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.81107858935271,"rightUnfilledHeight":4.81107858935271,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-9.581690079363758,"cy":0.16844568443230257,"cz":2.228839888904333,"lx":7.683837882858757,"ly":0.3,"lz":9,"leftJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"rightJoints":["hndwqtrrygFvfqvBJrvZYu"],"leftPoint":[-9.581690079363758,4.010364625861682,0.1],"rightPoint":[-9.581690079363758,-3.673473256997076,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"11Ltx28CSTVpm6gjZuBH9w","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"cgHKR8ai6snf9XinDUWwjd","selected":false,"leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.538993236656353,"rightUnfilledHeight":4.538993236656353,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-0.5738138595304036,"cy":-3.673473256997076,"cz":2.268765007024547,"lx":18.01575243966671,"ly":0.3,"lz":9,"leftJoints":["11Ltx28CSTVpm6gjZuBH9w"],"rightJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"leftPoint":[-9.581690079363758,-3.673473256997076,0.1],"rightPoint":[8.434062360302951,-3.673473256997076,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hndwqtrrygFvfqvBJrvZYu","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"cgHKR8ai6snf9XinDUWwjd","selected":false,"leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Foundation","cx":1.328107295365207,"cy":-2.32341538525935,"cz":0.05,"lx":20.16561856842383,"ly":11.725607943394946,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"locked":true},{"type":"Wall","cx":0.31845175389180724,"cy":5.51114190784781,"cz":2.2408122612280286,"lx":18.813654239419552,"ly":0.3,"lz":4.56796601625556,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[9.725278873601583,5.51114190784781,0],"rightPoint":[-9.088375365817969,5.51114190784781,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4.56796601625556,"rightRoofHeight":4.56796601625556,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.56796601625556,"rightTopPartialHeight":4.56796601625556},{"type":"Wall","cx":9.725278873601583,"cy":-0.00976103700472608,"cz":2.2301039869226305,"lx":11.04180588970507,"ly":0.3,"lz":4.56796601625556,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[9.72527887360158,-5.530663981857262,0],"rightPoint":[9.725278873601587,5.51114190784781,0],"relativeAngle":1.570796326794896,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4.56796601625556,"rightRoofHeight":4.56796601625556,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.56796601625556,"rightTopPartialHeight":4.56796601625556},{"type":"Wall","cx":-9.088375365817967,"cy":-0.00976103700472608,"cz":2.228839888904333,"lx":11.04180588970507,"ly":0.3,"lz":4.56796601625556,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-9.088375365817964,5.51114190784781,0],"rightPoint":[-9.088375365817969,-5.530663981857262,0],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4.56796601625556,"rightRoofHeight":4.56796601625556,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.56796601625556,"rightTopPartialHeight":4.56796601625556},{"type":"Wall","cx":0.318451753891809,"cy":-5.530663981857262,"cz":2.268765007024547,"lx":18.813654239419556,"ly":0.3,"lz":4.56796601625556,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-9.088375365817969,-5.530663981857262,0],"rightPoint":[9.725278873601587,-5.530663981857262,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4.56796601625556,"rightRoofHeight":4.56796601625556,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.56796601625556,"rightTopPartialHeight":4.56796601625556},{"type":"Foundation","cx":0.4107313024346143,"cy":-1.9585431776860986,"cz":0.06,"lx":24.334060214728257,"ly":12.759991395526452,"lz":0.1370389804876668,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":true,"enableGroupMaster":true,"notBuilding":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Mansard","roofStructure":"Default","wallsId":["roDDPncXBpNgmNum9aUaov"],"ridgeWidth":0.5,"textureType":"No Roof Texture","color":"#f44e3b","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"wCPmoV4VwkScF5K7cf32UD","rise":0.3478700995805717,"ceiling":false,"locked":true},{"type":"Door","cx":-0.13288221247108084,"cy":0,"cz":-0.14054209286568672,"lx":0.2126115399537293,"ly":0,"lz":0.7189158142686265,"doorType":"Arched","archHeight":1.5,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"fTMHecXmkxoFyi5nVgZruF","filled":false,"locked":true},{"type":"Door","cx":0.10630576997686465,"cy":0,"cz":-0.14054209286568672,"lx":0.21261153995372933,"ly":0,"lz":0.7189158142686265,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1.429004247968055,"normal":[0,1,0],"rotation":[0,0,0],"id":"thTY63emBWLui9mLZFtB5x","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":false,"locked":true},{"type":"Door","cx":-0.3587819736719182,"cy":0,"cz":-0.14054209286568672,"lx":0.18603509745951316,"ly":0,"lz":0.7189158142686265,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1.5,"normal":[0,0,1],"rotation":[0,0,0],"id":"r7aX4f3HRkVXuNQaRxbPi1","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":false,"locked":true},{"type":"Door","cx":0.3454937524248102,"cy":0,"cz":-0.14054209286568672,"lx":0.21261153995372936,"ly":0,"lz":0.7189158142686265,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1.5000000000000002,"normal":[0,1,0],"rotation":[0,0,0],"id":"h7dwAP8dsZbfjhXMRt294q","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":false,"locked":true},{"type":"Window","cx":-0.34549375242481023,"cy":0.1,"cz":0,"lx":0.05315288498843229,"ly":0.3,"lz":0.4378316285372531,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.13288221247108084,"cy":0.3,"cz":0,"lx":0.05315288498843234,"ly":0.3,"lz":0.4378316285372531,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.13288221247108084,"cy":0.3,"cz":0,"lx":0.05315288498843232,"ly":0.3,"lz":0.4378316285372531,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Door","cx":-0.3746721111208206,"cy":0,"cz":-0.3611111111111111,"lx":0.08326046913796013,"ly":0,"lz":0.2777777777777778,"doorType":"Default","archHeight":1,"textureType":"Door Texture #1","color":"#73d8ff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"ecLTLgAm2MxZyZRCJTtQKo","filled":true,"locked":true},{"type":"Door","cx":-0.15264419341959357,"cy":0,"cz":-0.3611111111111111,"lx":0.08326046913796013,"ly":0,"lz":0.2777777777777778,"color":"#73d8ff","textureType":"Door Texture #1","doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"bEeuNKM57K5x42NhRniwi6","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"filled":true,"locked":true},{"type":"Door","cx":0.12489070370694019,"cy":0,"cz":-0.3611111111111111,"lx":0.08326046913796013,"ly":0,"lz":0.2777777777777778,"color":"#73d8ff","textureType":"Door Texture #1","doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"qEKCQ7EzsMMEDG8bv8fsum","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"filled":true,"locked":true},{"type":"Door","cx":0.3746721111208206,"cy":0,"cz":-0.3611111111111111,"lx":0.08326046913796013,"ly":0,"lz":0.2777777777777778,"color":"#73d8ff","textureType":"Door Texture #1","doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"8wkxpiMCThpy9pWENNkhKk","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"filled":true,"locked":true},{"type":"Window","cx":-0.3746721111208206,"cy":0.1,"cz":0.25,"lx":0.08326046913796013,"ly":0.3,"lz":0.2777777777777778,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"9Wg9qQLxZfpvdDjZ2VpjsU","locked":true},{"type":"Window","cx":-0.12489070370694019,"cy":0.3,"cz":0.25,"lx":0.08326046913796013,"ly":0.3,"lz":0.2777777777777778,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rj3NsBy5xBcFQpgf9yTyXN","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.12489070370694019,"cy":0.3,"cz":0.25,"lx":0.08326046913796013,"ly":0.3,"lz":0.2777777777777778,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hdSr1YZAyCNR6oUkaHZMAg","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3746721111208206,"cy":0.3,"cz":0.25,"lx":0.08326046913796013,"ly":0.3,"lz":0.2777777777777778,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"asxeUzs2NaJ78jjx63TyyC","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.5},"selected":false,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Hip","roofStructure":"Default","wallsId":["hndwqtrrygFvfqvBJrvZYu"],"textureType":"No Roof Texture","color":"#f44e3b","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"cgHKR8ai6snf9XinDUWwjd","leftRidgeLength":4.503938109916677,"rightRidgeLength":4.503938109916677,"rise":2.5896529887286306,"ceiling":false,"locked":true},{"type":"Human","name":"Jeanette","cx":0.8591126899329264,"cy":-9.396182210960866,"cz":0,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"85Scr5g8mYtCpbKgKe9vrB","selected":false,"flip":true,"ly":0.4,"locked":true},{"type":"Human","name":"Jacob","cx":-0.10555204032261312,"cy":-9.416124087799197,"cz":0,"lx":0.8,"lz":1.82,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"3vrVERckAPTLoMt9TNeS2S","selected":false,"ly":0.8,"locked":true},{"type":"Window","cx":0.34549375242481023,"cy":0.3,"cz":0,"lx":0.05315288498843234,"ly":0.3,"lz":0.4378316285372531,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"cspu4NZcKs2zheso8YnaAG","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3607953662644939,"cy":0.3,"cz":0.2884716244387647,"lx":0.05550697942530675,"ly":0.3,"lz":0.20083452890024844,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"vDt9VGvnvU9vePAfrLQMYJ","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.16652093827592027,"cy":0.3,"cz":0.2884716244387647,"lx":0.05550697942530675,"ly":0.3,"lz":0.20083452890024844,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"hYQQWiCSxQgqR2XiFwQcHB","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1387674485632669,"cy":0.3,"cz":0.2884716244387647,"lx":0.05550697942530675,"ly":0.3,"lz":0.20083452890024844,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"hgcEVbECbXF3rdyRi8jL7y","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3885488559771473,"cy":0.3,"cz":0.2884716244387647,"lx":0.05550697942530675,"ly":0.3,"lz":0.20083452890024844,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"ih1JWVrGZLFL47MHERTzyn","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1952149463416227,"cy":0.1,"cz":0.2777777777777778,"lx":0.13014329756108178,"ly":0.3,"lz":0.2222222222222222,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"uACfjsfx3oFuHFL2K4wn6s","parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1952149463416227,"cy":0.1,"cz":0.2777777777777778,"lx":0.13014329756108178,"ly":0.3,"lz":0.2222222222222222,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"jUW859PMX9WssNh7ajd7bW","parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.26028659512216357,"cy":0.1,"cz":0.2777777777777779,"lx":0.13014329756108178,"ly":0.3,"lz":0.22222222222222243,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"9GK118ZSrqGs81r2c9DmJ9","parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.26028659512216357,"cy":0.3,"cz":0.2777777777777777,"lx":0.13014329756108178,"ly":0.3,"lz":0.22222222222222243,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"qMSMFHr6W7JY5LW4w6QRRk","parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Tree","name":"Coconut","cx":-13.833956304562825,"cy":-5.734368757546395,"cz":0,"lx":10.296431730851847,"lz":14.247937869417774,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"dhdL6enwuq52BCva98npwA","selected":false,"locked":true},{"type":"Tree","name":"Coconut","cx":-16.03648257210165,"cy":-7.577405253611644,"cz":-8.881784197001252e-16,"lx":6.4568591564721105,"lz":8.433084547651115,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"oX2XaCFnUgccQdVNREDqjW","selected":false,"locked":true},{"type":"Tree","name":"Fan Palm","cx":15.143629921921018,"cy":-10.9460234939345,"cz":0,"lx":5.636076310522914,"lz":7.988346597759666,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"gbweDZRVxLwqky2axf7Y8q","selected":false,"locked":true},{"type":"Tree","name":"Fan Palm","cx":14.372021459439786,"cy":-8.787207002242742,"cz":0,"lx":6.791895714508713,"lz":10.21869909939493,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"sf29WMk4BaTsfLzkZNmVzH","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":2.428817756541367,"cy":-10.484144416604128,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9DZLwc5PTpq9K9kFVPWuDb","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-1.9808700560460073,"cy":-10.456723771199588,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"tbLKA9nAkR1p2Y51NnR7Hz","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-6.50706138180835,"cy":-10.311129925272937,"cz":-8.881784197001252e-16,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mwwbjydsGANpRKQR1fPW3q","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":6.571598639052613,"cy":-10.492326870561346,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"c8AcvQkEYah3BNHFPjZ6U4","selected":false,"locked":true},{"type":"Polygon","cx":0.039567390445074416,"cy":-0.26884665270178654,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.18603509745951316,"y":-0.4378316285372531},{"x":-0.18603509745951316,"y":-0.21891581426862655},{"x":0.23918798244794548,"y":-0.21891581426862655},{"x":0.2395673904450744,"y":-0.46884665270178655}],"parentId":"roDDPncXBpNgmNum9aUaov","parentType":"Wall","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":true,"selectedIndex":0,"id":"jaEQvTPeDh2m31LB8RsyFG","text":"SPANISH TAVERN","fontSize":0.7,"fontColor":"gold","fontOutlineColor":"red","fontOutlineWidth":0.05,"noOutline":true,"opacity":0}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0.12159863905262133,-1.1671768638939548,-0.0000012172309664404964],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0.12159863905262133,-1.1673268705613518,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-7.450909722303011,-23.613178769130574,4.500139724117738],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":20.00000000000001,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[1.616638405874658,1.2781230776372128,4.313092868911078],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},469:function(e){e.exports=JSON.parse('{"docid":"8zyJg4GHQPZX9C7UX4st8J","time":"03/18/2023 08:26 pm","timestamp":1679185608583,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"12/22/2022, 8:15:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Honolulu, HI, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":21.3098845,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-157.8581401},"elements":[{"ly":16.927339965869773,"solarUpdraftTower":{},"parentId":"Ground","cx":-10.030961003153333,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":25.06053757796986,"type":"Foundation","solarPowerTower":{},"lx":36.13676163604105,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,-0.7727629180414017],"cz":0.05},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":25.078696453594382,"relativeAngle":3.141592653589793,"lz":30,"roofId":"1rg4qXk51s2D35ph8XqwbD","ly":0.1,"rightPoint":[-7.080024662598481,7.041260263727929,0],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,-0.7727629180414017],"textureType":"No Wall Texture","leftPoint":[17.998671790995903,7.041260263727929,0],"type":"Wall","normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":5.459323564198711,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":7.041260263727929,"color":"#ffffe0","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":17.998671790995893,"leftPoint":[17.99867179099588,-4.904184303905874,0],"cy":1.0685379799110275,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[17.998671790995903,7.041260263727929,0],"ly":0.1,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":11.945444567633803,"normal":[0,0,1],"lz":30,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,-0.7727629180414017],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948946,"textureType":"No Wall Texture","roofId":"1rg4qXk51s2D35ph8XqwbD","color":"#ffffe0","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"lx":11.945444567633803,"windows":[],"lz":30,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"1rg4qXk51s2D35ph8XqwbD","selected":false,"cy":1.0685379799110275,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-7.080024662598481,-4.904184303905874,0],"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"textureType":"No Wall Texture","parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":-1.5707963267948966,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-7.080024662598481,7.041260263727929,0],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","ly":0.1,"cx":-7.080024662598481,"color":"#ffffe0","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"showLabel":false,"cx":5.459323564198711,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[17.998671790995903,-4.904184303905874,0],"cz":2.268765007024547,"textureType":"No Wall Texture","cy":-4.904184303905874,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"1rg4qXk51s2D35ph8XqwbD","leftPoint":[-7.080024662598481,-4.904184303905874,0],"normal":[0,0,1],"ly":0.1,"lz":30,"relativeAngle":0,"rotation":[0,0,-0.7727629180414017],"lx":25.078696453594382,"color":"#ffffe0","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":7.840470874398735,"cy":5.490428888324286,"cz":2.2408122612280286,"lx":16.75500291983642,"ly":0.1,"lz":40,"leftJoints":["aJzBKycDgPV2XFyreGUWbN"],"rightJoints":["q3QyrcfYtaEUJUy3dDMe3o"],"leftPoint":[16.217972334316947,5.490428888324284,0.1],"rightPoint":[-0.5370305855194735,5.490428888324285,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"ajX6DE1iwh52m5aYDEnUZw","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gvRT2kUN1YoGCZrBAosc54","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":16.217972334316944,"cy":-4.464643680942036,"cz":19.195539088325102,"lx":19.91014513853265,"ly":0.1,"lz":40,"leftJoints":["vZvx6xJpNjwVutXgBYTqDu"],"rightJoints":["ajX6DE1iwh52m5aYDEnUZw"],"leftPoint":[16.21797233431694,-14.41971625020836,0.1],"rightPoint":[16.217972334316947,5.490428888324284,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"aJzBKycDgPV2XFyreGUWbN","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gvRT2kUN1YoGCZrBAosc54","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Window","cx":-0.3867375122795052,"cy":0.1,"cz":0.10625,"lx":0.22099286415971733,"ly":0.3,"lz":0.7125,"mullion":true,"mullionWidth":0.06,"mullionSpacing":3,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wAVcmtVfsGGWzQD4FYwZNW","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.44375,"lx":0.47714368398120766,"ly":0.3,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"u5BLpPtdFZZZhqt5769cX6","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.44375,"lx":0.10045130189078055,"ly":0.3,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3kDRvtG74CSaYS7Hdz4Zf9","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-0.537030585519473,"cy":-4.46464368094204,"cz":2.228839888904333,"lx":19.91014513853265,"ly":0.1,"lz":40,"leftJoints":["ajX6DE1iwh52m5aYDEnUZw"],"rightJoints":["vZvx6xJpNjwVutXgBYTqDu"],"leftPoint":[-0.5370305855194735,5.490428888324285,0.1],"rightPoint":[-0.5370305855194752,-14.419716250208367,0.1],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"q3QyrcfYtaEUJUy3dDMe3o","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gvRT2kUN1YoGCZrBAosc54","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":7.840470874398735,"cy":-14.419716250208364,"cz":11.720703078908016,"lx":16.75500291983642,"ly":0.1,"lz":40,"leftJoints":["q3QyrcfYtaEUJUy3dDMe3o"],"rightJoints":["aJzBKycDgPV2XFyreGUWbN"],"leftPoint":[-0.5370305855194752,-14.419716250208367,0.1],"rightPoint":[16.21797233431694,-14.41971625020836,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"vZvx6xJpNjwVutXgBYTqDu","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gvRT2kUN1YoGCZrBAosc54","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.44375,"lx":0.4774693289088429,"ly":0.3,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jqoCSv6SGc3CUNj2d3NntP","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3879438297384349,"cy":0.1,"cz":0.44375,"lx":0.11936733222721073,"ly":0.3,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fHoEdLPaiDXqCueBgeDdLS","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.36813175214922683,"cy":0.1,"cz":0.10500000000000001,"lx":0.24254861996467425,"ly":0.3,"lz":0.7150000000000001,"mullion":true,"mullionWidth":0.06,"mullionSpacing":3,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"cDtJU4W55HjRmy9cDhmm6R","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jett","cx":22.405208091244,"cy":-4.9072672102145285,"cz":0.07500000298023225,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"fbbzRkZEo4AnT3QEsWR9oP","selected":false},{"type":"Foundation","cx":9.883909213954574,"cy":18.92966595365953,"cz":0.075,"lx":78.43901005555475,"ly":71.09926407060658,"lz":0.15,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hM4gzHVfAcT1HDeDhXqfQE","selected":false,"locked":false,"enableGroupMaster":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["q3QyrcfYtaEUJUy3dDMe3o","vZvx6xJpNjwVutXgBYTqDu","aJzBKycDgPV2XFyreGUWbN","ajX6DE1iwh52m5aYDEnUZw"],"textureType":"No Roof Texture","color":"#666666","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","id":"gvRT2kUN1YoGCZrBAosc54","locked":false,"sideColor":"#666666","rise":0,"ceiling":false},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.3,"lz":0.04999999999999994,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#999999","tint":"#009ce0","opacity":0.9,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"hXDYrzLkVvDyB5XjtNmnpF","locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.36875,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"rG1B3YDka8evv1iRX84o9o","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.2937500000000002,"lx":0.4774693289088429,"ly":0.1,"lz":0.037499999999999645,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3UNoma1dXsmygDK7CEMoeK","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.21875,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sd3EQKPdzkdU4oHrJHF6z6","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.14375,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tdS8P8P3u1nFnMkc5rhziK","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.06875,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fot8pwtoi6ibSjPGupS1qv","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":-0.00625,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"6EhGwMTuUYnqbTApuPextU","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":-0.08125,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mQ1vMy6wk1K8zQ4XW25Pa4","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":-0.15625,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"xeQKnySzuUrMzG5a16tLkb","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":-0.23125,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5XDU9fVCRxTJLcDoUD9Lh9","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["8XDG3EHsQoX26MhuzwMYUM","2u4Fe7xnA6kkXXVGrQ4eyJ","skm8dNPSkFaVkoUwiPNfq1","cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"No Roof Texture","color":"#666666","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"1rg4qXk51s2D35ph8XqwbD","sideColor":"#666666","rise":0,"ceiling":false},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"veFj2RPH9FK5Ao9iDG2JPQ","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sjoT9VNZjDkgezWwtsvX1H","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"c3CrejqQvGUvB3tz2qUtSs","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"54CDd5MyTY1sZku1AxjXiV","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bnfcGzXENjbkzh9kkmgCt1","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"hLoimJgy8UQ7UMWdnPWQDr","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"7HFCb3ZQu4czKjDhFmnHch","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"qWx6AJBVMGYPJ4Ho1LMQem","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9CtXe67uSkntiJK3PdfzmF","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jmVdqwU3fqhEGk97aQXYEX","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wdnnALggwiP7UHfVhF7SWW","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9qSb4G4eXKMLNk6b2Mnxjd","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fbXTujX2nC1dnrTNLQQaH2","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"kPmU38jjwSfUUZCv9WNCNC","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"miYw9uqZnfLViAeihqKiQU","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mdv9UVbG7EBitFdaYUkjsg","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"urvoEGE7cTq18MHrjMtEta","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aG4F7poaBiKo4FnvkesMid","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"dpGTcBMRjsfms2X9nZ4kXB","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"r72et61W5MhwpaYEF75Lh8","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"kfBYaXYAWc8NFLir41LMUf","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sZ9pExZ3wnnmg8ersouQqR","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"hsgq2SXxdCMQRiXuigpEnf","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4cJ8Pgng6fBXRTX8WcXQVg","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bsGPA2UqEVe6SNCXBuagSF","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"qoRwFevwZ3YYSnDdJLoDqH","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4WEcGq6tGKDXcjGfvF3Tqi","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ofgYdgnyE5KuECDZGdmjFD","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pHYCjB2xdehwowhrgYcS5c","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3Q2Wqp4rsyN89CVgnpPKCM","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"oVMnTwRZ8JUb44CXEkjBYL","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"awSE1XUqEZc7Ryyr6ZQ76Y","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"rVMR7tb7kXRnjoKHu2uyrZ","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ktvktsYRNrNC4YQGJQ65Vk","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mDgZnRfoyVP2YKQSiG96yP","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"rZqeq8wo58QSrFmB3rpFBD","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"kQER8EGDmLkbzKEnbH9AdE","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pHvp5WhRnmKrP1SER1BBPx","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aZrgq675xDvSLbDtUdwQsY","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jKtw1tdxJxcJphjEsWRmNW","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jgu4jSQaAhhuBZyZoH81Vw","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gL3MbkYAkwWqHwKNVFfvjX","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"43vK33D69FP5XTqiRyn5ZC","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5CKwKV9BkacegVoEPzvmNN","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"6dszW4NvJ7dea2hEqvWvWt","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5wUE7YuTr5FaL5BKb5taCi","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gUSBkoburdStT335zZGKSH","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"qaz6Ru4mqUG7iJ4Ycd7F9n","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aC9jXjoijXwkzJe9GEmTWi","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"w4NVxvubCEgR8AigUi47sf","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"c2FMW9zjWRExPvuVGBX4HW","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"66P3KrsZHSZo36fXBYj8qX","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"kNFB5Lqn3mkhGj4vWLcpup","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"egzr7tMm23v6EusXDcg5hk","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fg88qYi3xQqiUry3XoMG94","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3879438297384349,"cy":0.1,"cz":0.36875,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tfzr5KT4W9PhBL9cJ8zsaA","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":0.29375,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"i6H6Xevamb9d4oXjeQCCVQ","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":0.21875,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5XFRaVZReMkHmTkTRTsRuW","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":0.14375,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"57X6pPozmTcJNsHjWMZ2XK","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":0.06875,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8bZz4FqqQe2bdV4WSMC6jm","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.39520439262152746,"cy":0.1,"cz":-0.006462001517518967,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gFyWDsDvxmZLpfKAZSAYx5","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":-0.08125,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aEb8cJ6YhMAb9KuP8VjgKP","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":-0.15625,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"vWo8aVFrScBkGwhkRkYbFw","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":-0.23125,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ukpSgR2RV34eo2XfZVmUQx","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.36875,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"12QeRFNV1Hc4sRbkxeVHBz","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.29375,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aEhEPB9abuMwcNR6YEDDzo","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.21875,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bahcDPtF8RkBJeqyW4uoBW","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.14375,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"j8CVLpwpSN8q6CwaZNU8f2","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.06875,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"xaiGSGs8MoAP2yqunEFz1t","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":-0.00625,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"2mWxcnyFJtKcRwpimCotCD","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":-0.08125,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"7fehkUWZ89tU27wVPAaQiD","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":-0.15625,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"cLjpkvrCHbUZQvi2ugMz7m","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":-0.23125,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"775gLWKQ2CDxL24uAyMuJh","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.36875,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sG6LtKnafZHdzPAsvV8PYJ","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.29375,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3JLF3stSYMjoSYPebvZ4PV","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.21875,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"hs4CReuowYw4vhbQaajr1c","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.14375,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"7q37MBnhP8o81q6wk5b4ev","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.06875,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fYYQri43bTWAWzKm8CTjgx","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":-0.00625,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"vVphvZY7TyNxocgdqGbqJG","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":-0.08125,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"1x6vFAj3oANsndJiQWQqch","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":-0.15625,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"amqZLKSwPYeveasoE38xPf","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":-0.23125,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8pqGLYqiyyd3o5U4oTyKWQ","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-0.6029509196285296,"cy":4.363723699614781,"cz":2.2408122612280286,"lx":38.83648396698225,"ly":0.1,"lz":8,"leftJoints":["buJzWWqdvseWMEsfiYMLMP"],"rightJoints":["8SHv6CAA9xkRcfdve2aKJD"],"leftPoint":[18.815291063862595,4.363723699614781,0.02095211693261273],"rightPoint":[-20.021192903119655,4.363723699614781,0.02095211693261273],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"pbHN78JfkaYPi761T2RspW","parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pHTF23CfLXLueNE1tagt35","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":18.815291063862578,"cy":2.495382831879124,"cz":2.2301039869226305,"lx":3.736681735471314,"ly":0.1,"lz":8,"leftJoints":["cthH5Q4t9AqYehpe6ssXrf"],"rightJoints":["pbHN78JfkaYPi761T2RspW"],"leftPoint":[18.815291063862563,0.627041964143467,0.02095211693261273],"rightPoint":[18.815291063862595,4.363723699614781,0.02095211693261273],"relativeAngle":1.5707963267948881,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"buJzWWqdvseWMEsfiYMLMP","parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pHTF23CfLXLueNE1tagt35","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-20.021192903119655,"cy":2.495382831879124,"cz":2.228839888904333,"lx":3.736681735471314,"ly":0.1,"lz":8,"leftJoints":["pbHN78JfkaYPi761T2RspW"],"rightJoints":["cthH5Q4t9AqYehpe6ssXrf"],"leftPoint":[-20.021192903119655,4.363723699614781,0.02095211693261273],"rightPoint":[-20.021192903119655,0.627041964143467,0.02095211693261273],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"8SHv6CAA9xkRcfdve2aKJD","parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pHTF23CfLXLueNE1tagt35","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-0.6029509196285296,"cy":0.627041964143467,"cz":2.268765007024547,"lx":38.83648396698225,"ly":0.1,"lz":8,"leftJoints":["8SHv6CAA9xkRcfdve2aKJD"],"rightJoints":["buJzWWqdvseWMEsfiYMLMP"],"leftPoint":[-20.021192903119655,0.627041964143467,0.02095211693261273],"rightPoint":[18.815291063862595,0.627041964143467,0.02095211693261273],"relativeAngle":0,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"cthH5Q4t9AqYehpe6ssXrf","parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pHTF23CfLXLueNE1tagt35","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"id":"pHTF23CfLXLueNE1tagt35","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["buJzWWqdvseWMEsfiYMLMP","pbHN78JfkaYPi761T2RspW","8SHv6CAA9xkRcfdve2aKJD","cthH5Q4t9AqYehpe6ssXrf"],"selected":false,"sideColor":"#666666","rise":0,"ceiling":false},{"type":"Foundation","cx":-2.457987770512858,"cy":8.5745044622651,"cz":0.05,"lx":43.13213840818644,"ly":9.617341850294016,"lz":0.02095211693261273,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qxAJALKsgHR99QXiiey2Jy","selected":false},{"type":"Window","cx":0.23817810098010178,"cy":0.1,"cz":-0.03125,"lx":0.5021051858499441,"ly":0.1,"lz":0.8125,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#999999","tint":"#4d4d4d","opacity":0.9,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","id":"wvo4rWSpdYajq7orMpbxwv","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.1094331815313981,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#999999","tint":"#4d4d4d","opacity":0.9,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","id":"7yzuNTr1nHZ9M3xoVT6avS","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.4570444640428979,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5QTwW8m9wGX6HGnbLPxKyJ","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.39910925029098127,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"hs42cyfWo4jmy3NRKUXRUF","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3411740365390646,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"xwaNrD73kLoXPJvKgQmEMf","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2832388227871479,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5fsUwbpNYhCT9veH1pJuBb","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.22530360903523122,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"67uFrhX3jmZgG5Uwx5UZkn","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16736839528331454,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9c8dBuEjRjp1p1S8dhEcnt","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-1.4056682810734662,"cy":6.875194394376913,"cz":2.2408122612280286,"lx":25.078696453594382,"ly":0.1,"lz":30,"leftJoints":["dzHmrowq7VzT13tXyJ2UqF"],"rightJoints":["pHKTjESURrdXxEMpYFEvmj"],"leftPoint":[11.133679945723728,6.875194394376912,0.1],"rightPoint":[-13.945016507870662,6.875194394376912,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"sVQKrHhSTfNeVTVVzVgh8h","parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"njRXPjHAzFuEQzFQaKio93","selected":false,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":11.13367994572371,"cy":0.9024721105600149,"cz":2.2301039869226305,"lx":11.945444567633803,"ly":0.1,"lz":30,"leftJoints":["knjx4z8fKUVQF38Tr2D5YR"],"rightJoints":["sVQKrHhSTfNeVTVVzVgh8h"],"leftPoint":[11.1336799457237,-5.070250173256886,0.1],"rightPoint":[11.133679945723728,6.875194394376912,0.1],"relativeAngle":1.5707963267948946,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"dzHmrowq7VzT13tXyJ2UqF","parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"njRXPjHAzFuEQzFQaKio93","selected":false,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-13.945016507870664,"cy":0.9024721105600122,"cz":2.228839888904333,"lx":11.945444567633803,"ly":0.1,"lz":30,"leftJoints":["sVQKrHhSTfNeVTVVzVgh8h"],"rightJoints":["knjx4z8fKUVQF38Tr2D5YR"],"leftPoint":[-13.945016507870662,6.875194394376912,0.1],"rightPoint":[-13.945016507870662,-5.070250173256887,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"pHKTjESURrdXxEMpYFEvmj","parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"njRXPjHAzFuEQzFQaKio93","selected":false,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4056682810734649,"cy":-5.0702501732568885,"cz":2.268765007024547,"lx":25.078696453594382,"ly":0.1,"lz":30,"leftJoints":["pHKTjESURrdXxEMpYFEvmj"],"rightJoints":["dzHmrowq7VzT13tXyJ2UqF"],"leftPoint":[-13.945016507870662,-5.070250173256887,0.1],"rightPoint":[11.13367994572373,-5.070250173256887,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"knjx4z8fKUVQF38Tr2D5YR","parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"njRXPjHAzFuEQzFQaKio93","selected":false,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"uJ5VXB9mJCHeVMURUphT8T","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wnK1hkWv21nCd1Utptm2Ei","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pEvywZty9TJkaURwjtVySg","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tWq4HyTuGAuAN6dd6GPS2N","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"24XsGn6puXsJxiC1CXzcBv","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pkcczmXvVUiEdpQApgmexY","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sa92opTQVGVahjcKdrQYNu","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"75MHEhXJJecJXb1MEFATcp","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"6nqrXQt9q6iMswTzGidgHb","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"b1foK7N1uzozAzTNBXGmZB","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"nJJ7PvwzGmhWVcxY9bet36","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"vj5w5TDBurYnrHfJcc9FLw","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"qYve9T714wdvYeg4ZURztj","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"u95CGNREXr1JhsDomK6oUP","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"h31BtoerjLiQ4Ph2duYsTc","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9dxvQwRi6mWsaWRPC67F9D","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"rjRNUHYRmb3eWDV9hgNPgk","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9S42HWD1ZPYw28WUgncNJg","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"6z3whdKeQxDdJsZmhQ5kkh","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"oJTfPHNAtBzrf2iJENqHK6","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"31jBrsSiuVnoBUL9zp8ca6","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4MbQ64c8HUZrvfYs3kgE6b","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8EW5KxGCVAJwrRFzn2isg8","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pFyHWVuvzXQH1TQ1JhYRAx","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8AjjyhHzBJtzfxgCpuWX7d","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"s1sVDPm2cHt3fumjgcwoek","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wvpWMkzuKAKaviPUsqwQGa","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4inH8BAKWrcqZKNbaRb4ZX","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fsV7H7ZmN4jx2WUQX2f5zs","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"55E9hvsT1rzmJ6fT3m6NcG","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"uKLeQgpSELANVT2TRKNsAf","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"nY9NDsN8rJhMi99gzYKtWJ","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5uo11zCRNj9YohSCdvoz6U","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"1Kr3EHJrBneewC46BaE2Ph","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ov5R5oyJBGiQGjspTURXyd","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jaeqZUoGssJAoAxW2E91xj","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"dYrh6yCuHp4rN3uYNhLJPq","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"eJmoE9srUeuBcYJBZHqYQ6","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wniuB8XsQisBLpGGqQxkBF","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"o4XtWQqdKQ78Q8CKjzjKHW","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"7s5FfAfve61p7zKukxPALw","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8gF1BVyyyBHomFZH7wzdah","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"e8uDpgzMYfsmnhjaNLhBhr","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fzA8v8aP7HzsfsJ5jvVku9","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gPBz88neav7bwpPYBatUzf","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bLjvQy84YUL9NshZ2ECHsZ","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wy5NXYh5x3qLXD7T41WQtG","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"urCTjPq8RemHnQPB5atkfH","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ijGpbm5vZNXcurEfDWRTEi","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gFaxtGtjGoAmXwz4kcD2mV","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"eNkrUnU9y5cm2pN62nhxuL","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5xow2hbgFrKWpxhPpsF2oG","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ittnJX2spdpmthzEKvTSta","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"h4grVoSbeCwgTF2pxNsMb8","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"cSY4kfnQdndkFPFy82Fgbc","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tXgqNm5fVVjFB6dfyXDq3i","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"id":"njRXPjHAzFuEQzFQaKio93","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":1,"wallsId":["dzHmrowq7VzT13tXyJ2UqF","sVQKrHhSTfNeVTVVzVgh8h","pHKTjESURrdXxEMpYFEvmj","knjx4z8fKUVQF38Tr2D5YR"],"selected":false,"sideColor":"#666666","rise":0,"ceiling":false},{"type":"Foundation","cx":31.408586983997502,"cy":25.06147299717385,"cz":0.05,"lx":29.014724156297994,"ly":16.595208227167745,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"bPEF7Uhqc8jpoTSmhKDVeo","selected":false},{"type":"Wall","cx":-2.172089616054159,"cy":4.269527680689553,"cz":2.2408122612280286,"lx":38.83648396698225,"ly":0.1,"lz":8,"leftJoints":["sR2ork3jG2mR5nZkK6KFeD"],"rightJoints":["wRcqTTshgLb8rN6th4Gpqm"],"leftPoint":[17.246152367436963,4.269527680689554,0.02095211693261273],"rightPoint":[-21.590331599545284,4.2695276806895555,0.02095211693261273],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"k9HzM68Yarpc7nfmHcL8RX","parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pZTS1LtmxQ4iRLvvo2k6FG","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":17.24615236743695,"cy":2.4011868129538962,"cz":2.2301039869226305,"lx":3.736681735471314,"ly":0.1,"lz":8,"leftJoints":["3VZZxMzA1BHxrWmzs6HKLa"],"rightJoints":["k9HzM68Yarpc7nfmHcL8RX"],"leftPoint":[17.246152367436935,0.532845945218239,0.02095211693261273],"rightPoint":[17.246152367436963,4.269527680689554,0.02095211693261273],"relativeAngle":1.5707963267948881,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"sR2ork3jG2mR5nZkK6KFeD","parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pZTS1LtmxQ4iRLvvo2k6FG","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-21.590331599545284,"cy":2.4011868129538976,"cz":2.228839888904333,"lx":3.736681735471314,"ly":0.1,"lz":8,"leftJoints":["k9HzM68Yarpc7nfmHcL8RX"],"rightJoints":["3VZZxMzA1BHxrWmzs6HKLa"],"leftPoint":[-21.590331599545284,4.2695276806895555,0.02095211693261273],"rightPoint":[-21.590331599545284,0.5328459452182401,0.02095211693261273],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"wRcqTTshgLb8rN6th4Gpqm","parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pZTS1LtmxQ4iRLvvo2k6FG","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-2.1720896160541585,"cy":0.5328459452182414,"cz":0.5,"lx":38.83648396698225,"ly":0.1,"lz":8,"leftJoints":["wRcqTTshgLb8rN6th4Gpqm"],"rightJoints":["sR2ork3jG2mR5nZkK6KFeD"],"leftPoint":[-21.590331599545284,0.5328459452182401,0.02095211693261273],"rightPoint":[17.246152367436963,0.532845945218239,0.02095211693261273],"relativeAngle":0,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"3VZZxMzA1BHxrWmzs6HKLa","parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pZTS1LtmxQ4iRLvvo2k6FG","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Window","cx":-0.1094331815313981,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5Fjqy9y1YfpweWd3F1suvT","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.32829954459419425,"cy":0.1,"cz":-0.03125,"lx":0.3218622986217591,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"75HCZhhPHELWXwGW5h2WPD","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"id":"pZTS1LtmxQ4iRLvvo2k6FG","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["sR2ork3jG2mR5nZkK6KFeD","k9HzM68Yarpc7nfmHcL8RX","wRcqTTshgLb8rN6th4Gpqm","3VZZxMzA1BHxrWmzs6HKLa"],"selected":false,"sideColor":"#666666","rise":0,"ceiling":false},{"type":"Foundation","cx":27.68901540648673,"cy":11.617892532194158,"cz":0.05,"lx":46.2704158010377,"ly":9.428949812443559,"lz":0.02095211693261273,"normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mEAgnYYx5Vpv2wQEcaoDS8","selected":false},{"type":"Window","cx":-0.05149796777948146,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"woWw7XGUm4xqUAFSTaxp7s","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.006437245972435182,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"p72g5k8odqsgTDtjZrUT8a","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06437245972435182,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pRepfQdGpU9sdbgLJsfdTe","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.12230767347626846,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5oab4a82csybhPKBpwXVfB","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.1802428872281851,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"buq5YaVMEosHyRoKSUbsVt","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23817810098010178,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"efAnUu4mYbWRhdGHs3mZi9","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29611331473201846,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jyJM6MGuMRcai6pbrb3Cin","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.35404852848393514,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5cDm82FkWrYhcDPVSU84Ve","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4119837422358518,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mC7TrBSkmqNWk58epxFszN","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.46991895598776845,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"eAGg5HRuXspYe6baEw1Pd4","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Tree","name":"Coconut","cx":29.772169703668084,"cy":3.13936308626816,"cz":0.075,"lx":14.520625349385156,"lz":15.546086109013482,"normal":[0,1,0],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"awZFHKX9S4YwAMjbSq1yte","selected":false},{"type":"Tree","name":"Coconut","flip":true,"cx":29.969020753546168,"cy":-14.890022732958304,"cz":0.075,"lx":11.801916444038328,"lz":14.712241097320083,"normal":[0,1,0],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"oXudTEZFdmZo2c8EsbRpo1","selected":false},{"type":"Tree","name":"Coconut","cx":30.340707732263212,"cy":22.863697403310276,"cz":0.075,"lx":11.799635641951403,"lz":18.03518550107995,"normal":[0,1,0],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"1PFc7JhaMeKKaCbh4JY7pw","selected":false},{"type":"Tree","name":"Coconut","flip":true,"cx":-5.622533214526047,"cy":-26.68161954425443,"cz":0.075,"lx":11.801916444038328,"lz":17.69875674824313,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"ghtAJzyWZvFaBBUqp1aRCj","selected":false},{"type":"Tree","name":"Coconut","flip":false,"cx":10.296218935380278,"cy":-27.603318709603634,"cz":0.075,"lx":8.431050051779376,"lz":14.44899202269211,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"g6oua2UeBCgiNbB146Y9vt","selected":false},{"type":"Tree","name":"Coconut","flip":true,"cx":25.84939972102471,"cy":-26.971930698353695,"cz":0.075,"lx":11.801916444038328,"lz":17.69875674824313,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"qX2bGrx3fNBzBZKpMfQVvM","selected":false},{"type":"Tree","name":"Coconut","flip":false,"cx":-20.99614909921928,"cy":-27.25943651847644,"cz":0.075,"lx":10.446668331936932,"lz":15.66063540678114,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"vbLVgvpnWHhnRd9uUf7sV8","selected":false},{"type":"Human","name":"Jacqueline","cx":16.26014984241543,"cy":-19.603129566992923,"cz":0.075,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"1k2jiRJ9Za2yVNkgRYdhKs","selected":false,"ly":0.43},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":0.27624108019964655,"y":-0.5},{"x":0.27624108019964655,"y":-0.4625},{"x":0.5022565094539028,"y":-0.4625},{"x":0.5022565094539028,"y":-0.5}],"parentId":"aJzBKycDgPV2XFyreGUWbN","parentType":"Wall","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","selected":false,"filled":true,"selectedIndex":0,"id":"hvwazXjoHjWT4TxByg9aJo","text":"OCEANIC","fontColor":"red","fontSize":1,"noOutline":true,"opacity":0}],"sceneRadius":90,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[20.405612129997095,28.227763446481866,0.000028229018151188892],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[20.405612129997095,28.22761343981447,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[37.702769068930394,-75.97521031128004,17.83040709876231],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":7.547072050706145,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[15.19436480647435,27.872451314228233,14.077650267491105],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"directLightIntensity":2},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},470:function(e){e.exports=JSON.parse('{"docid":"iTjDf3ar2Wi1xMDNhVPun5","time":"02/03/2023 08:02 pm","timestamp":1675472536455,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"daysPerYear":4,"noAnimationForSolarPanelSimulation":true,"longitude":-73.177891,"sutTimesPerHour":4,"noAnimationForSolarUpdraftTowerSimulation":false,"diurnalTemperatureModel":1,"discretization":"Approximate","sutDaysPerYear":4,"sutGridCellSize":1,"cspTimesPerHour":4,"highestTemperatureTimeInMinutes":900,"pvGridCellSize":0.5,"noAnimationForSensorDataCollection":false,"name":"default","cspGridCellSize":0.5,"dustLoss":0.05,"solarRadiationHeatmapGridCellSize":5,"latitude":44.454924,"cspDaysPerYear":4,"date":"5/22/2022, 1:00:00 PM","address":"550 Dorset St, South Burlington, VT 05403, USA","ground":{"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3},"airAttenuationCoefficient":0.01,"solarPanelVisibilityGridCellSize":0.2,"timesPerHour":2,"airConvectiveCoefficient":5,"noAnimationForHeatmapSimulation":true},"elements":[{"rotation":[0,0,0.11344640137963143],"lx":42.0955259862511,"cy":-46.54215234653224,"type":"Cuboid","ly":34.92675303840907,"id":"qsPqX4eMRADWLb6uFzZyu3","cz":6.5,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","locked":true,"selected":false,"cx":1.8084891171279258,"color":"#e27300","lz":13,"faceColors":["#e27300","#e27300","#e27300","#e27300","#d0d7da","gray"],"normal":[0,0,1]},{"rotation":[0,0,0.11344640137963143],"type":"Cuboid","ly":3.86445911605994,"faceColors":["#e27300","#e27300","#e27300","#e27300","#eff3f4","gray"],"id":"15SnZzWbRga2YXQjrHrMoH","locked":true,"parentId":"Ground","cx":23.280210785776593,"color":"#e27300","cz":3.5,"selected":false,"normal":[0,0,1],"lz":7,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":-63.54853637545297,"lx":12.707438928677645},{"cx":-33.686845121145325,"ly":21.436523356683622,"id":"jeaVPPnZw5Ed7yuuYuFjT4","cz":3.5,"color":"#e27300","locked":true,"lx":60,"parentId":"Ground","type":"Cuboid","selected":false,"cy":5.924352450279141,"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","Facade #1","Facade #1","No Facade Texture","No Facade Texture"],"lz":7,"rotation":[0,0,-0.22689280275926285],"faceColors":["#e27300","#e27300","#e27300","#e27300","#dadedf","gray"]},{"locked":true,"lz":7,"selected":false,"rotation":[0,0,0.47123889803846897],"lx":70,"faceColors":["#e27300","#e27300","#e27300","#e27300","#dadedf","gray"],"ly":22.005759208164513,"parentId":"Ground","cy":16.732974312474486,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"w8SzPJTBSBctdCdhPMiQ8Y","color":"#e27300","type":"Cuboid","normal":[0,0,1],"cx":34.50919214417893,"cz":3.5},{"lz":0.1,"normal":[0,0,1],"locked":true,"type":"Foundation","cz":0.05,"ly":33.24144899129459,"rotation":[0,0,0.11344640137963143],"parentId":"Ground","selected":false,"cy":6.225878764069708,"solarUpdraftTower":{},"solarAbsorberPipe":{},"id":"pAENrJmYZCM1ckJVXJhbjf","cx":-3.0110805900742577,"solarPowerTower":{},"lx":33.143096812026116},{"cy":13,"rotation":[0,0,0],"leftRoofHeight":8,"id":"etH6khoAQcue7DhdL3hKE4","windows":[],"type":"Wall","leftPoint":[7.5,12,0],"lineWidth":0.2,"leftJoints":["8bjxpu3YEF3xWPcrbQwkhJ"],"ly":0.3,"rightJoints":["kDgsBFAdDRYMKBfw4NrZmC"],"color":"#e27300","lx":8.24621125123532,"relativeAngle":2.896613990462928,"normal":[0,0,1],"showLabel":false,"lz":8,"cx":3.5000000000000004,"textureType":"Wall Texture Default","rightPoint":[-0.49999999999999944,14,0],"lineColor":"black","roofId":"k6bth8F9WX1VG1Z9xWAtQv","selected":false,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","rightRoofHeight":8,"parentId":"pAENrJmYZCM1ckJVXJhbjf","locked":true,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"relativeAngle":1.9379701606131157,"rightJoints":["etH6khoAQcue7DhdL3hKE4"],"cx":10,"lx":13.928388277184117,"leftPoint":[12.5,-1,0],"normal":[0,0,1],"id":"8bjxpu3YEF3xWPcrbQwkhJ","roofId":"k6bth8F9WX1VG1Z9xWAtQv","type":"Wall","rightPoint":[7.5,11.999999999999998,0],"lineColor":"black","textureType":"Wall Texture Default","leftJoints":["78z2ecrQQgcHrHfygTZ9jK"],"leftRoofHeight":8,"rightRoofHeight":8,"showLabel":false,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","cy":5.499999999999999,"color":"#e27300","lz":8,"cz":0,"windows":[],"selected":false,"rotation":[0,0,0],"locked":true,"ly":0.3,"parentId":"pAENrJmYZCM1ckJVXJhbjf","lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"lineWidth":0.2,"normal":[0,0,1],"selected":false,"cx":11.75,"rightPoint":[12.5,-1,0],"rightJoints":["8bjxpu3YEF3xWPcrbQwkhJ"],"id":"78z2ecrQQgcHrHfygTZ9jK","rotation":[0,0,0],"textureType":"Wall Texture Default","leftJoints":["mDkaCjWbyiM41dnmEVWdxy"],"parentId":"pAENrJmYZCM1ckJVXJhbjf","windows":[],"leftPoint":[11,-10.5,0],"leftRoofHeight":8,"lx":9.617692030835672,"lineColor":"black","lz":8,"color":"#e27300","foundationId":"pAENrJmYZCM1ckJVXJhbjf","locked":true,"showLabel":false,"roofId":"k6bth8F9WX1VG1Z9xWAtQv","relativeAngle":1.4141944498128813,"rightRoofHeight":8,"ly":0.3,"cz":0,"type":"Wall","cy":-5.75,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"rotation":[0,0,0],"relativeAngle":3.402195045337134,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","cx":-4.249999999999999,"cy":13,"color":"#e27300","lineWidth":0.2,"lineColor":"black","showLabel":false,"textureType":"Wall Texture Default","rightJoints":["hK2wY1qjEVKHhT5eT1oyYc"],"locked":true,"windows":[],"rightPoint":[-8,12,0],"lz":8,"id":"kDgsBFAdDRYMKBfw4NrZmC","type":"Wall","leftJoints":["etH6khoAQcue7DhdL3hKE4"],"lx":7.762087348130014,"ly":0.3,"rightRoofHeight":8,"selected":false,"parentId":"pAENrJmYZCM1ckJVXJhbjf","cz":0,"leftPoint":[-0.49999999999999856,14,0],"leftRoofHeight":8,"roofId":"k6bth8F9WX1VG1Z9xWAtQv","normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"ly":0.3,"locked":true,"showLabel":false,"leftRoofHeight":8,"cx":-9.75,"rightRoofHeight":8,"rotation":[0,0,0],"id":"hK2wY1qjEVKHhT5eT1oyYc","leftJoints":["kDgsBFAdDRYMKBfw4NrZmC"],"cz":0,"relativeAngle":4.375714160997962,"leftPoint":[-8.000000000000002,11.999999999999998,0],"normal":[0,0,1],"textureType":"Wall Texture Default","cy":6.999999999999999,"lz":8,"windows":[],"foundationId":"pAENrJmYZCM1ckJVXJhbjf","rightJoints":["b4LV4TTeCfWqyehosbTDfi"],"lx":10.594810050208544,"rightPoint":[-11.5,2,0],"color":"#e27300","selected":false,"type":"Wall","parentId":"pAENrJmYZCM1ckJVXJhbjf","roofId":"k6bth8F9WX1VG1Z9xWAtQv","lineWidth":0.2,"lineColor":"black","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"lineColor":"black","roofId":"k6bth8F9WX1VG1Z9xWAtQv","normal":[0,0,1],"rightRoofHeight":8,"lz":8,"cy":-12.749999999999998,"ly":0.3,"id":"mDkaCjWbyiM41dnmEVWdxy","leftPoint":[1,-15,0],"lx":10.965856099730656,"textureType":"Wall Texture Default","type":"Wall","showLabel":false,"rightPoint":[11,-10.499999999999996,0],"rightJoints":["78z2ecrQQgcHrHfygTZ9jK"],"lineWidth":0.2,"selected":false,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","rotation":[0,0,0],"color":"#e27300","cx":6,"relativeAngle":0.4228539261329409,"locked":true,"parentId":"pAENrJmYZCM1ckJVXJhbjf","windows":[],"cz":0,"leftJoints":["2og8Xo997HNRwLdj5mnKCf"],"leftRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"normal":[0,0,1],"leftPoint":[-11.499999999999998,2,0],"rightRoofHeight":8,"leftJoints":["hK2wY1qjEVKHhT5eT1oyYc"],"parentId":"pAENrJmYZCM1ckJVXJhbjf","lx":12.257650672131263,"type":"Wall","selected":false,"lz":8,"cx":-10.25,"relativeAngle":4.917784369574457,"id":"b4LV4TTeCfWqyehosbTDfi","rightJoints":["2og8Xo997HNRwLdj5mnKCf"],"leftRoofHeight":8,"rightPoint":[-9,-10,0],"color":"#e27300","foundationId":"pAENrJmYZCM1ckJVXJhbjf","ly":0.3,"cz":0,"rotation":[0,0,0],"showLabel":false,"locked":true,"cy":-4,"lineColor":"black","roofId":"k6bth8F9WX1VG1Z9xWAtQv","windows":[],"textureType":"Wall Texture Default","lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"ly":0.3,"leftPoint":[-8.999999999999996,-9.999999999999996,0],"foundationId":"pAENrJmYZCM1ckJVXJhbjf","rotation":[0,0,0],"cz":0,"textureType":"Wall Texture Default","lx":11.180339887498947,"roofId":"k6bth8F9WX1VG1Z9xWAtQv","rightJoints":["mDkaCjWbyiM41dnmEVWdxy"],"showLabel":false,"id":"2og8Xo997HNRwLdj5mnKCf","lineWidth":0.2,"lz":8,"windows":[],"normal":[0,0,1],"parentId":"pAENrJmYZCM1ckJVXJhbjf","selected":false,"cy":-12.499999999999998,"locked":true,"leftJoints":["b4LV4TTeCfWqyehosbTDfi"],"color":"#e27300","cx":-3.9999999999999982,"lineColor":"black","rightPoint":[1,-15,0],"relativeAngle":5.81953769817878,"leftRoofHeight":8,"type":"Wall","rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"cz":0,"locked":true,"selected":false,"cx":0,"type":"Roof","id":"k6bth8F9WX1VG1Z9xWAtQv","wallsId":["8bjxpu3YEF3xWPcrbQwkhJ","etH6khoAQcue7DhdL3hKE4","kDgsBFAdDRYMKBfw4NrZmC","hK2wY1qjEVKHhT5eT1oyYc","b4LV4TTeCfWqyehosbTDfi","2og8Xo997HNRwLdj5mnKCf","mDkaCjWbyiM41dnmEVWdxy","78z2ecrQQgcHrHfygTZ9jK"],"textureType":"No Roof Texture","thickness":0.2,"showLabel":false,"lineWidth":0.2,"lineColor":"black","normal":[0,0,1],"roofType":"Pyramid","lx":0,"color":"#bbc0c4","parentId":"pAENrJmYZCM1ckJVXJhbjf","rotation":[0,0,0],"ly":0,"cy":0,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","lz":0,"sideColor":"#bbc0c4","rise":0,"ceiling":false},{"id":"bJhvoWT5frHADN5rpErFAp","type":"Foundation","solarUpdraftTower":{},"parentId":"Ground","solarAbsorberPipe":{},"locked":true,"ly":20.929643657953434,"cx":-14.3191636352593,"lx":30.96479094015392,"lz":0.1,"normal":[0,0,1],"solarPowerTower":{},"cy":-19.246790495991178,"selected":false,"cz":0.05,"rotation":[0,0,0.11344640137963143]},{"showLabel":false,"selected":false,"leftJoints":["u3McT1xxp22V2ArAdyDW3J"],"windows":[],"textureType":"Wall Texture Default","foundationId":"bJhvoWT5frHADN5rpErFAp","rotation":[0,0,0],"normal":[0,0,1],"lz":12,"relativeAngle":2.8068558162729786,"id":"wERFjjYFCWERMhNEB9iuoK","cz":0,"type":"Wall","lineWidth":0.2,"leftRoofHeight":12,"locked":true,"parentId":"bJhvoWT5frHADN5rpErFAp","color":"#e27300","ly":0.3,"rightRoofHeight":12,"lineColor":"black","leftPoint":[12.5,5.5,0],"cx":6.75,"rightPoint":[0.9999999999999996,9.5,0],"rightJoints":["7dQxN3e4X8QdrAXYYEN8WG"],"cy":7.5,"roofId":"nGgWDMiF4t3mFWmEvV3G6V","lx":12.175795661885921,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"color":"#e27300","leftJoints":["pcWBDfha4S8aWQ8R18i4nV"],"foundationId":"bJhvoWT5frHADN5rpErFAp","rotation":[0,0,0],"lz":12,"id":"u3McT1xxp22V2ArAdyDW3J","parentId":"bJhvoWT5frHADN5rpErFAp","lineColor":"black","cz":0,"cy":-4.440892098500626e-16,"leftRoofHeight":12,"relativeAngle":1.5707963267948966,"lx":11,"selected":false,"locked":true,"ly":0.3,"rightRoofHeight":12,"textureType":"Wall Texture Default","roofId":"nGgWDMiF4t3mFWmEvV3G6V","windows":[],"normal":[0,0,1],"leftPoint":[12.5,-5.5,0],"type":"Wall","rightJoints":["wERFjjYFCWERMhNEB9iuoK"],"showLabel":false,"cx":12.5,"rightPoint":[12.5,5.499999999999999,0],"lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"normal":[0,0,1],"lineWidth":0.2,"lx":11.067971810589325,"windows":[],"selected":false,"textureType":"Wall Texture Default","cx":7.249999999999998,"rightPoint":[12.499999999999996,-5.499999999999999,0],"cz":0,"id":"pcWBDfha4S8aWQ8R18i4nV","showLabel":false,"relativeAngle":0.32175055439664213,"parentId":"bJhvoWT5frHADN5rpErFAp","leftPoint":[2,-9,0],"rightRoofHeight":12,"rightJoints":["u3McT1xxp22V2ArAdyDW3J"],"foundationId":"bJhvoWT5frHADN5rpErFAp","lineColor":"black","leftRoofHeight":12,"roofId":"nGgWDMiF4t3mFWmEvV3G6V","rotation":[0,0,0],"color":"#e27300","type":"Wall","ly":0.3,"cy":-7.25,"leftJoints":["6ue5PfovkzS53Qu47dbJ2S"],"lz":12,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"windows":[],"leftJoints":["wERFjjYFCWERMhNEB9iuoK"],"roofId":"nGgWDMiF4t3mFWmEvV3G6V","showLabel":false,"cx":-5.5,"relativeAngle":3.541833310623767,"normal":[0,0,1],"rightRoofHeight":12,"lz":12,"leftPoint":[0.9999999999999996,9.5,0],"parentId":"bJhvoWT5frHADN5rpErFAp","locked":true,"lineColor":"black","id":"7dQxN3e4X8QdrAXYYEN8WG","rightPoint":[-12,4,0],"rightJoints":["1kwWJQEGgHXq1W18rzcYh4"],"lineWidth":0.2,"selected":false,"rotation":[0,0,0],"lx":14.115594213493104,"cy":6.75,"foundationId":"bJhvoWT5frHADN5rpErFAp","color":"#e27300","leftRoofHeight":12,"cz":0,"ly":0.3,"type":"Wall","textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cz":0,"foundationId":"bJhvoWT5frHADN5rpErFAp","leftJoints":["7dQxN3e4X8QdrAXYYEN8WG"],"windows":[],"leftRoofHeight":12,"normal":[0,0,1],"selected":false,"roofId":"nGgWDMiF4t3mFWmEvV3G6V","rightRoofHeight":12,"relativeAngle":4.71238898038469,"cx":-12,"color":"#e27300","parentId":"bJhvoWT5frHADN5rpErFAp","id":"1kwWJQEGgHXq1W18rzcYh4","lx":8.499999999999998,"textureType":"Wall Texture Default","type":"Wall","locked":true,"lineWidth":0.2,"rightJoints":["6ue5PfovkzS53Qu47dbJ2S"],"showLabel":false,"lineColor":"black","rotation":[0,0,0],"leftPoint":[-11.999999999999998,3.9999999999999982,0],"lz":12,"cy":-0.2500000000000009,"rightPoint":[-12,-4.5,0],"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cx":-4.999999999999997,"lx":14.705441169852739,"windows":[],"lz":12,"rightPoint":[2,-9,0],"locked":true,"ly":0.3,"rotation":[0,0,0],"lineWidth":0.2,"normal":[0,0,1],"color":"#e27300","roofId":"nGgWDMiF4t3mFWmEvV3G6V","id":"6ue5PfovkzS53Qu47dbJ2S","leftPoint":[-11.999999999999995,-4.499999999999997,0],"textureType":"Wall Texture Default","rightRoofHeight":12,"foundationId":"bJhvoWT5frHADN5rpErFAp","showLabel":false,"leftRoofHeight":12,"lineColor":"black","cy":-6.749999999999998,"leftJoints":["1kwWJQEGgHXq1W18rzcYh4"],"parentId":"bJhvoWT5frHADN5rpErFAp","relativeAngle":5.972187026574045,"cz":0,"type":"Wall","rightJoints":["pcWBDfha4S8aWQ8R18i4nV"],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"roofType":"Pyramid","lx":0,"lz":0,"foundationId":"bJhvoWT5frHADN5rpErFAp","ly":0,"normal":[0,0,1],"showLabel":false,"lineWidth":0.2,"id":"nGgWDMiF4t3mFWmEvV3G6V","locked":true,"cz":0,"lineColor":"black","selected":false,"color":"#bbc0c4","type":"Roof","cy":0,"textureType":"No Roof Texture","rotation":[0,0,0],"thickness":0.2,"wallsId":["7dQxN3e4X8QdrAXYYEN8WG","1kwWJQEGgHXq1W18rzcYh4","6ue5PfovkzS53Qu47dbJ2S","pcWBDfha4S8aWQ8R18i4nV","u3McT1xxp22V2ArAdyDW3J","wERFjjYFCWERMhNEB9iuoK"],"cx":0,"parentId":"bJhvoWT5frHADN5rpErFAp","sideColor":"#bbc0c4","rise":0,"ceiling":false},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.22689280275926285],"lz":7,"selected":false,"cx":-16.084384276720815,"color":"#e27300","cy":15.36794895618929,"faceColors":["#e27300","#e27300","#e27300","#e27300","#f9fdfe","gray"],"cz":3.5,"parentId":"Ground","locked":true,"normal":[0,0,1],"type":"Cuboid","ly":4.781704008793219,"lx":6.529460998348136,"id":"gNV64yHSX1cBB43cygkyfk"},{"parentId":"Ground","ly":4.94412378095928,"rotation":[0,0,0.47123889803846897],"cy":18.145923422735436,"type":"Cuboid","locked":true,"normal":[0,0,1],"faceColors":["#e27300","#e27300","#e27300","#e27300","#f9fdfe","gray"],"lx":7.636154465642389,"cz":3.5,"lz":7,"selected":false,"color":"#e27300","id":"91GnsPRwrk88qGT8VmRMYg","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":8.05053425462394},{"solarPowerTower":{},"cy":33.364915793093175,"parentId":"Ground","id":"1nEGYML9Y5W4dWVRK3n5WW","locked":true,"selected":false,"cx":-5.596972605764655,"ly":39.876530801142074,"lx":39.61249197494745,"solarUpdraftTower":{},"rotation":[0,0,0.11344640137963143],"cz":0.05,"type":"Foundation","normal":[0,0,1],"lz":0.1,"solarAbsorberPipe":{}},{"color":"#e27300","relativeAngle":3.141592653589793,"parentId":"1nEGYML9Y5W4dWVRK3n5WW","lx":38.5,"rightPoint":[-19.489993841129074,18.992592968189904,0.1],"showLabel":false,"roofId":"vaDVUZ1uyEALYaHTbs211h","selected":false,"windows":[],"lz":7,"leftPoint":[19.010006158870922,18.992592968189896,0.1],"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","normal":[0,0,1],"lineWidth":0.2,"rotation":[0,0,0],"leftRoofHeight":7,"id":"97HokqKu917DTkAssZGbhE","type":"Wall","cz":0,"locked":true,"textureType":"Wall Texture Default","cy":18.992592968189904,"cx":-0.23999384112907807,"leftJoints":["2QQRWDofKjHid4D3rHXvwX"],"ly":0.3,"rightJoints":["fPtvUV7Bzhezt9xwDuPEmF"],"lineColor":"black","rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","windows":[],"lz":7,"rightJoints":["97HokqKu917DTkAssZGbhE"],"relativeAngle":1.5707963267948966,"rightRoofHeight":7,"showLabel":false,"selected":false,"parentId":"1nEGYML9Y5W4dWVRK3n5WW","cy":3.7425929681898977,"leftRoofHeight":7,"normal":[0,0,1],"locked":true,"id":"2QQRWDofKjHid4D3rHXvwX","lineColor":"black","textureType":"Wall Texture Default","ly":0.3,"roofId":"vaDVUZ1uyEALYaHTbs211h","leftPoint":[19.010006158870922,-11.507407031810096,0.1],"rotation":[0,0,0],"cz":0,"leftJoints":["v4k1Tt2DPV8adpDFKC5P12"],"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","lx":30.499999999999996,"cx":19.01000615887092,"color":"#e27300","rightPoint":[19.010006158870922,18.992592968189896,0.1],"lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"id":"fPtvUV7Bzhezt9xwDuPEmF","textureType":"Wall Texture Default","foundationId":"1nEGYML9Y5W4dWVRK3n5WW","leftJoints":["97HokqKu917DTkAssZGbhE"],"ly":0.3,"parentId":"1nEGYML9Y5W4dWVRK3n5WW","lineWidth":0.2,"leftPoint":[-19.489993841129067,18.992592968189896,0],"windows":[],"leftRoofHeight":7,"cz":0,"cy":3.746296484094948,"roofId":"vaDVUZ1uyEALYaHTbs211h","locked":true,"rotation":[0,0,0],"rightJoints":["ebWW9yh8D9FYjir4ozAvaz"],"selected":false,"lx":30.492594609952747,"rightPoint":[-19.5,-11.5,0],"rightRoofHeight":7,"relativeAngle":4.712060829921323,"lineColor":"black","showLabel":false,"normal":[0,0,1],"lz":7,"color":"#e27300","cx":-19.49499692056453,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"parentId":"1nEGYML9Y5W4dWVRK3n5WW","leftJoints":["fPtvUV7Bzhezt9xwDuPEmF"],"lineWidth":0.2,"textureType":"Wall Texture Default","leftPoint":[-19.5,-11.499999999999991,0],"cx":-10,"color":"#e27300","normal":[0,0,1],"cy":-14.999999999999996,"locked":true,"rightJoints":["v4k1Tt2DPV8adpDFKC5P12"],"selected":false,"leftRoofHeight":7,"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","lx":20.24845673131659,"windows":[],"relativeAngle":5.930194919352675,"rotation":[0,0,0],"roofId":"vaDVUZ1uyEALYaHTbs211h","showLabel":false,"rightRoofHeight":7,"id":"ebWW9yh8D9FYjir4ozAvaz","rightPoint":[-0.5,-18.5,0],"ly":0.3,"cz":0,"lz":7,"lineColor":"black","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","rightJoints":["2QQRWDofKjHid4D3rHXvwX"],"leftRoofHeight":7,"leftJoints":["ebWW9yh8D9FYjir4ozAvaz"],"cy":-15.003703515905048,"cx":9.255003079435461,"roofId":"vaDVUZ1uyEALYaHTbs211h","showLabel":false,"color":"#e27300","lineWidth":0.2,"relativeAngle":0.3441478196335668,"lx":20.725267108965333,"selected":false,"textureType":"Wall Texture Default","rightRoofHeight":7,"parentId":"1nEGYML9Y5W4dWVRK3n5WW","locked":true,"normal":[0,0,1],"lineColor":"black","rightPoint":[19.010006158870922,-11.507407031810095,0],"lz":7,"ly":0.3,"id":"v4k1Tt2DPV8adpDFKC5P12","cz":0,"rotation":[0,0,0],"windows":[],"leftPoint":[-0.5,-18.5,0],"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cy":-16.63156986902993,"lz":5,"lx":8.20544233607179,"id":"x3h1GsQhgRmq3SsscYfmB3","faceColors":["#e27300","#e27300","#e27300","#e27300","#eff3f4","gray"],"color":"#e27300","type":"Cuboid","locked":true,"normal":[0,0,1],"parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":11.4641129152687,"selected":false,"cx":16.793944749049793,"cz":2.5,"rotation":[0,0,0.11344640137963143]},{"lz":6.5,"ly":9.79284174487727,"color":"#e27300","selected":false,"faceColors":["#e27300","#e27300","#e27300","#e27300","#cbced4","gray"],"normal":[0,0,1],"rotation":[0,0,0.11344640137963143],"cx":18.04602799184764,"cy":-5.757381561584599,"lx":13.705205912378894,"id":"pawpCxDgzEqhYUsyrbWbDa","parentId":"Ground","locked":true,"cz":3.25,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid"},{"cz":0.05,"selected":false,"cy":-71.07055697625319,"id":"jqbU6DNc1hw25bSjkKpMiq","parentId":"Ground","ly":19.18495691494635,"solarPowerTower":{},"rotation":[0,0,0.47123889803846897],"lz":0.1,"solarUpdraftTower":{},"locked":true,"type":"Foundation","lx":30.387424337601402,"normal":[0,0,1],"solarAbsorberPipe":{},"cx":-4.462146546381112},{"textureType":"Wall Texture Default","ly":0.3,"relativeAngle":3.1415926535897927,"roofId":"nbhyUPhsFS3FWduEBX5mR4","normal":[0,0,1],"locked":true,"leftPoint":[14.911466700814316,8.908511607852175,0.1],"lineColor":"black","windows":[],"type":"Wall","leftRoofHeight":9,"selected":false,"id":"t45ndcq7s2gwo2wADp4LvF","lz":9,"rightRoofHeight":9,"rightJoints":["96Vsi7iFvTbA9KnjAiCzjC"],"cz":0,"lx":19.999999999999996,"rightPoint":[-5.088533299185682,8.908511607852187,0.1],"rotation":[0,0,0],"showLabel":false,"parentId":"jqbU6DNc1hw25bSjkKpMiq","leftJoints":["aUxdFcbeJNrCyc15FmwGK7"],"foundationId":"jqbU6DNc1hw25bSjkKpMiq","cx":4.911466700814314,"cy":8.908511607852173,"color":"#e27300","lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"lineWidth":0.2,"windows":[],"roofId":"nbhyUPhsFS3FWduEBX5mR4","id":"2Q9JHTpdQziYaq1i4YVAfD","cy":-9.591488392147804,"selected":false,"textureType":"Wall Texture Default","parentId":"jqbU6DNc1hw25bSjkKpMiq","leftRoofHeight":9,"ly":0.3,"rightJoints":["aUxdFcbeJNrCyc15FmwGK7"],"lz":9,"cz":0,"leftPoint":[-14.588533299185684,-9.591488392147816,0.1],"normal":[0,0,1],"rightRoofHeight":9,"lineColor":"black","showLabel":false,"rightPoint":[7.411466700814323,-9.591488392147804,0.1],"rotation":[0,0,0],"foundationId":"jqbU6DNc1hw25bSjkKpMiq","relativeAngle":0,"cx":-3.588533299185679,"color":"#e27300","type":"Wall","locked":true,"leftJoints":["fjtHDsHPyFgzX4a1QCnEg1"],"lx":22.000000000000007,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"lz":9,"leftJoints":["2Q9JHTpdQziYaq1i4YVAfD"],"cy":-0.34148839214781823,"lineWidth":0.2,"locked":true,"selected":false,"rightPoint":[14.911466700814314,8.90851160785218,0.1],"relativeAngle":1.1856388204314217,"cz":0,"leftRoofHeight":9,"lx":19.962464777677127,"parentId":"jqbU6DNc1hw25bSjkKpMiq","rightJoints":["t45ndcq7s2gwo2wADp4LvF"],"cx":11.161466700814309,"normal":[0,0,1],"roofId":"nbhyUPhsFS3FWduEBX5mR4","lineColor":"black","foundationId":"jqbU6DNc1hw25bSjkKpMiq","id":"aUxdFcbeJNrCyc15FmwGK7","color":"#e27300","textureType":"Wall Texture Default","rightRoofHeight":9,"ly":0.3,"rotation":[0,0,0],"type":"Wall","showLabel":false,"leftPoint":[7.411466700814304,-9.59148839214781,0.1],"windows":[],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"cx":-2.2158130411354513,"lx":3.4859481923608877,"ly":4.275960039070249,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"nypM3mdmViZReBeYosY2yV","cz":6,"cy":-27.62799047977582,"faceColors":["#808080","#808080","#808080","#808080","#ffffff","gray"],"lz":12,"type":"Cuboid","parentId":"Ground","normal":[0,0,1],"color":"#808080","rotation":[0,0,0.11344640137963143],"locked":true,"selected":false},{"type":"Wall","lx":13.499999999999998,"foundationId":"jqbU6DNc1hw25bSjkKpMiq","selected":false,"locked":true,"normal":[0,0,1],"leftPoint":[-14.588533299185688,3.9085116078521778,0.1],"cx":-14.588533299185682,"lineWidth":0.2,"textureType":"Wall Texture Default","leftRoofHeight":9,"relativeAngle":4.71238898038469,"color":"#e27300","rightJoints":["2Q9JHTpdQziYaq1i4YVAfD"],"showLabel":false,"windows":[],"lineColor":"black","leftJoints":["iik8XWaEN3wPnYJVvNUf8N"],"cz":0,"cy":-2.841488392147814,"id":"fjtHDsHPyFgzX4a1QCnEg1","parentId":"jqbU6DNc1hw25bSjkKpMiq","ly":0.3,"lz":9,"roofId":"nbhyUPhsFS3FWduEBX5mR4","rightRoofHeight":9,"rightPoint":[-14.588533299185684,-9.591488392147816,0.1],"rotation":[0,0,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"showLabel":false,"rightPoint":[-14.588533299185688,3.9085116078521778,0.1],"rightRoofHeight":9,"lineColor":"black","cx":-9.838533299185684,"relativeAngle":3.1415926535897936,"foundationId":"jqbU6DNc1hw25bSjkKpMiq","windows":[],"type":"Wall","parentId":"jqbU6DNc1hw25bSjkKpMiq","id":"iik8XWaEN3wPnYJVvNUf8N","roofId":"nbhyUPhsFS3FWduEBX5mR4","rightJoints":["fjtHDsHPyFgzX4a1QCnEg1"],"leftRoofHeight":9,"cy":3.9085116078521835,"lx":9.500000000000002,"locked":true,"textureType":"Wall Texture Default","normal":[0,0,1],"lz":9,"leftJoints":["96Vsi7iFvTbA9KnjAiCzjC"],"selected":false,"cz":0,"leftPoint":[-5.088533299185688,3.908511607852178,0.1],"lineWidth":0.2,"color":"#e27300","rotation":[0,0,0],"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"textureType":"Wall Texture Default","selected":false,"rotation":[0,0,0],"showLabel":false,"lineColor":"black","roofId":"nbhyUPhsFS3FWduEBX5mR4","leftPoint":[-5.088533299185681,8.908511607852187,0.1],"cx":-5.088533299185681,"lx":5.000000000000002,"type":"Wall","rightJoints":["iik8XWaEN3wPnYJVvNUf8N"],"windows":[],"lz":9,"locked":true,"leftRoofHeight":9,"rightRoofHeight":9,"ly":0.3,"parentId":"jqbU6DNc1hw25bSjkKpMiq","rightPoint":[-5.088533299185688,3.908511607852178,0.1],"cy":6.408511607852189,"normal":[0,0,1],"color":"#e27300","leftJoints":["t45ndcq7s2gwo2wADp4LvF"],"relativeAngle":4.71238898038469,"foundationId":"jqbU6DNc1hw25bSjkKpMiq","cz":0,"lineWidth":0.2,"id":"96Vsi7iFvTbA9KnjAiCzjC","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"ly":18.600818138777164,"normal":[0,0,1],"lz":7,"id":"9ZkQyqaEmTeYEWHbrCFRQb","type":"Cuboid","cx":-21.473353217856005,"cz":3.5,"lx":28.43689133843813,"cy":-80.03483805963909,"selected":false,"faceColors":["#e27300","#e27300","#e27300","#e27300","#a0a8a1","gray"],"rotation":[0,0,0.47123889803846897],"parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"#e27300","locked":true},{"lineColor":"black","foundationId":"jqbU6DNc1hw25bSjkKpMiq","cz":0,"roofType":"Pyramid","locked":true,"lz":0,"normal":[0,0,1],"id":"nbhyUPhsFS3FWduEBX5mR4","cy":0,"cx":0,"type":"Roof","ly":0,"lineWidth":0.2,"color":"#a0a8a1","selected":false,"wallsId":["t45ndcq7s2gwo2wADp4LvF","96Vsi7iFvTbA9KnjAiCzjC","iik8XWaEN3wPnYJVvNUf8N","fjtHDsHPyFgzX4a1QCnEg1","2Q9JHTpdQziYaq1i4YVAfD","aUxdFcbeJNrCyc15FmwGK7"],"showLabel":false,"lx":0,"textureType":"No Roof Texture","thickness":0.2,"parentId":"jqbU6DNc1hw25bSjkKpMiq","rotation":[0,0,0],"sideColor":"#a0a8a1","rise":0,"ceiling":false},{"rotation":[0,0,0.11344640137963143],"lx":33.330266968334364,"parentId":"Ground","locked":true,"selected":false,"cy":-18.068839609848254,"color":"#e27300","id":"u9fp9k5YxThQWCBpcjSypa","ly":24.01347765210959,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"lz":7,"faceColors":["#e27300","#e27300","#e27300","#e27300","#dadedf","gray"],"cz":3.5,"cx":-3.833297199689312,"type":"Cuboid"},{"parentId":"Ground","lx":6.254852089156679,"color":"#e27300","lz":6,"cy":-14.332630086328715,"rotation":[0,0,0.11344640137963143],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":8.529051468761843,"cz":3,"cx":23.820970949615347,"normal":[0,0,1],"id":"g3WSwwiWWgknhD1TsV34bi","locked":true,"type":"Cuboid","faceColors":["#e27300","#e27300","#e27300","#e27300","#eff3f4","gray"],"selected":false},{"selected":false,"parentId":"Ground","rotation":[0,0,0.11344640137963143],"lx":138.78684366347608,"solarAbsorberPipe":{},"cz":0.05,"textureType":"Foundation Texture #1","lz":0.1,"id":"reBHg6Exy2MChwcxtr3gj7","locked":true,"color":"#808080","cx":-1.8708371231135246,"solarUpdraftTower":{},"type":"Foundation","ly":56.63391373000898,"cy":89.14969979439752,"solarPowerTower":{},"normal":[0,0,1]},{"color":"#808080","cz":0.05,"solarPowerTower":{},"textureType":"Foundation Texture #1","locked":true,"ly":114.12479182802815,"id":"36nmeGQGETdJPm5rWVVRjJ","solarUpdraftTower":{},"lx":42.16787694736764,"lz":0.1,"normal":[0,0,1],"solarAbsorberPipe":{},"selected":false,"cy":-148.8692182215829,"parentId":"Ground","rotation":[0,0,0.11344640137963143],"type":"Foundation","cx":-28.614737300680485},{"id":"bFksCZzoXd93c7MyivmV9K","faceColors":["gray","gray","gray","gray","gray","gray"],"ly":5.781774626442493,"rotation":[0,0,0.11344640137963143],"cx":-8.05557182480289,"normal":[0,0,1],"parentId":"Ground","color":"gray","cy":28.559956693666173,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":true,"selected":false,"cz":4.5,"lz":9,"lx":2.7809448048857632,"type":"Cuboid"},{"id":"4uGXxDXoTLYvikq5fUL9dt","normal":[0,0,1],"parentId":"Ground","cz":4.5,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":38.25979783456656,"lx":2.7809448048857632,"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":9,"selected":false,"locked":true,"rotation":[0,0,0.11344640137963143],"cx":-6.727695250737455,"type":"Cuboid","color":"gray","ly":5.781774626442493},{"type":"Tree","lx":10,"selected":false,"name":"Magnolia","cz":0,"locked":true,"id":"xmEmwPRar8iA32AgGqBDZo","cy":44.65483300272308,"rotation":[0,0,0],"parentId":"Ground","cx":15.962764438139406,"normal":[0,1,0],"lz":10},{"cx":4.786319195449075,"name":"Magnolia","lz":10,"id":"2N9b6wPaP7vTT6v2GfUvci","cy":57.504795212360165,"selected":false,"rotation":[0,0,0],"parentId":"Ground","type":"Tree","locked":true,"lx":10,"normal":[0,0,1],"cz":0},{"cz":0,"id":"tQuBdxiCZwsv3tPttqZcge","locked":true,"type":"Tree","lz":10,"parentId":"Ground","lx":10,"cx":-37.72446755161796,"name":"Magnolia","rotation":[0,0,0],"selected":false,"cy":24.20884875644974,"normal":[0,0,1]},{"rotation":[0,0,0],"locked":true,"normal":[0,0,1],"parentId":"Ground","cz":0,"cy":27.53619242162998,"name":"Magnolia","type":"Tree","lx":10,"cx":-56.12589485999845,"id":"sBLygdm7dv2Y53q9fnNST7","selected":false,"lz":10},{"ly":1,"type":"Cuboid","id":"dHHanjftUrSruBnauGJSLy","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","cx":-5.870064866540858,"lx":2,"normal":[0,0,1],"lz":9,"cy":15.318325135239354,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,0.11344640137963143],"selected":false,"locked":true,"cz":4.5},{"id":"9vxhEg5mY7bnj3mASyLPuq","cz":4.5,"lx":1.5,"ly":1,"cx":-3.8512872137145457,"normal":[0,0,1],"type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"locked":true,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":11.777212358373532,"lz":9,"rotation":[0,0,0.11344640137963143],"parentId":"Ground","selected":false,"color":"gray"},{"cz":4.5,"cy":15.693005652428699,"normal":[0,0,1],"cx":-2.6936903398761203,"selected":false,"locked":true,"lz":9,"rotation":[0,0,0.11344640137963143],"color":"gray","ly":1,"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","id":"hvuDpXrEgC1sbzpcoS3Pv5","lx":2,"type":"Cuboid"},{"cz":4.5,"id":"xtuommaSLMKZrejRaGGfMk","faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"lz":9,"type":"Cuboid","cx":6.443464344950151,"locked":true,"cy":6.860194005695455,"color":"gray","parentId":"Ground","rotation":[0,0,0.47123889803846897],"selected":false,"lx":1,"ly":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"color":"gray","ly":2,"parentId":"Ground","normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":8,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"sJYEUPNTzxmWik8iqk2zs1","cy":25.83184970998569,"locked":true,"cz":4,"selected":false,"rotation":[0,0,0.47123889803846897],"type":"Cuboid","lx":2,"cx":46.69245220859119},{"cz":4,"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":8,"cx":57.51703501824526,"lx":2,"locked":true,"selected":false,"color":"gray","ly":2,"parentId":"Ground","type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":32.45468730038977,"rotation":[0,0,0.47123889803846897],"id":"bbqihnnqHMG2BadQAqxu4w","normal":[0,0,1]},{"id":"25nzwRphH2HZWasHbdyR9H","rotation":[0,0,0.47123889803846897],"cz":4,"cx":9.64097434426713,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"lz":8,"ly":2,"selected":false,"color":"gray","locked":true,"type":"Cuboid","cy":14.625073334021367,"lx":2,"parentId":"Ground"},{"locked":true,"ly":3.023435418581383,"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"color":"gray","normal":[0,0,1],"lz":8,"id":"auEsiwZVDg1BpD4SLuxEMu","cz":4,"selected":false,"cx":13.735991450729825,"rotation":[0,0,0.47123889803846897],"parentId":"Ground","lx":1.956376737761125,"cy":11.519743764909009},{"cx":8.737674718750876,"lz":8,"selected":false,"lx":1.6103314300645608,"color":"gray","cz":4,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"locked":true,"ly":6.078985704618435,"rotation":[0,0,0.47123889803846897],"cy":10.874631022787334,"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","id":"hVeFrmw4X6UXNLJxSgFFTX"},{"lz":8,"cy":9.924339607771106,"type":"Cuboid","lx":4.469059126518252,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"cz":4,"parentId":"Ground","ly":2.3777908106308545,"locked":true,"cx":10.942483109442229,"selected":false,"id":"meaBMTA4CLhnmmXQkVUk4b","color":"gray","rotation":[0,0,0.47123889803846897],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"rotation":[0,0,-0.22689280275926285],"id":"uaSYyvLxcyJGUeppQk2fkP","normal":[0,0,1],"locked":true,"faceColors":["gray","gray","gray","gray","gray","gray"],"color":"gray","cx":-58.373259464283144,"selected":false,"ly":1,"cz":4,"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lx":1,"parentId":"Ground","cy":19.91282275388616,"lz":8},{"lx":1,"parentId":"Ground","locked":true,"ly":1,"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"cx":-18.92226089346107,"rotation":[0,0,-0.22689280275926285],"type":"Cuboid","cz":4,"color":"gray","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"aSJgYXr93BZfEPKkAwN8r7","lz":8,"normal":[0,0,1],"cy":-0.6960334472303071},{"locked":true,"lx":2.0388988979736835,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.22689280275926285],"id":"vUyZDk5YRtPiBnYt1snpgt","selected":false,"cy":10.353201903334014,"color":"gray","ly":2.0216903725484365,"normal":[0,0,1],"type":"Cuboid","cx":-16.847254368208766,"parentId":"Ground","lz":8,"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":4},{"type":"Cuboid","cy":11.088622268912289,"cz":4,"rotation":[0,0,-0.22689280275926285],"ly":2.9540425209021324,"id":"dfGLJ9Zv1uAnvCfrcBHsCt","locked":true,"lz":8,"parentId":"Ground","color":"gray","cx":-14.705676459927645,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"lx":1.7677570935590694,"selected":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":7.5,"selected":false,"cz":3.75,"lx":0.9904096888649759,"type":"Cuboid","color":"gray","cy":-4.822954202789914,"parentId":"Ground","locked":true,"id":"n5nBWKF2pcd87Hywxr4MmX","cx":19.016528568953923,"normal":[0,0,1],"ly":1.9410657757772696,"rotation":[0,0,0.11344640137963143],"faceColors":["gray","gray","gray","gray","gray","gray"]},{"type":"Cuboid","ly":1,"cx":22.516067022100426,"color":"gray","parentId":"Ground","cz":3.5,"locked":true,"selected":false,"lx":1,"lz":7,"rotation":[0,0,0.11344640137963143],"id":"oDooft2rdfK7T7GeS22TTX","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"cy":-11.05785927501001},{"rotation":[0,0,0.11344640137963143],"type":"Cuboid","selected":false,"lz":6,"locked":true,"lx":1,"parentId":"Ground","ly":1,"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"id":"5MNhY3je6nxRhgVTaQd4XD","cx":17.344429933105552,"cy":-13.822777502645632,"cz":3},{"rotation":[0,0,0.11344640137963143],"id":"hTpGn7Ld64gegWm4tEbZhj","normal":[0,0,1],"lz":6,"locked":true,"cz":3,"lx":1,"type":"Cuboid","ly":1,"selected":false,"cx":13.157095779673083,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":-14.697109758746397,"faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground","color":"gray"},{"type":"Cuboid","parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":-6.445109761249004,"rotation":[0,0,0.11344640137963143],"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":4.5,"locked":true,"cx":-1.5852019434320317,"ly":1,"selected":false,"normal":[0,0,1],"lz":9,"id":"rq5RGqs3gD3vGibJBsqSoL","color":"gray","lx":1},{"lx":1,"parentId":"Ground","rotation":[0,0,0.11344640137963143],"normal":[0,0,1],"type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"gray","locked":true,"selected":false,"cx":1.8238223447270574,"id":"pVxtrZrVGwkvEXjPsLSV95","cz":4,"ly":1,"cy":-11.816737963378758,"lz":8},{"selected":false,"ly":1.3665925830167867,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"rotation":[0,0,0.11344640137963143],"cz":6.5,"lz":13,"id":"kfMaGeiQgdSFzmbpVf6zVf","cx":-10.111227834366188,"type":"Cuboid","lx":1.8193596961081897,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"gray","locked":true,"cy":-15.497913514100716},{"color":"gray","lx":1,"type":"Cuboid","cy":-27.533957889184162,"cz":6.5,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,0.11344640137963143],"selected":false,"lz":13,"id":"bkDAE3FxXTUCR13vm7LnmF","locked":true,"normal":[0,0,1],"ly":1,"cx":-2.3075258042202},{"normal":[0,0,1],"selected":false,"locked":true,"cx":-15.307775607494396,"lx":2.5676889546751847,"color":"gray","ly":1.3662836019362639,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,0.11344640137963143],"parentId":"Ground","type":"Cuboid","cz":6.5,"lz":13,"cy":-18.40230760434186,"id":"aQcL3piZZWLrX5Ud8AM8Ke"},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"selected":false,"id":"i4oTzKRpveYkgD2Hd8SNHf","faceColors":["gray","gray","gray","gray","gray","gray"],"ly":1,"lz":14,"color":"gray","lx":1,"parentId":"Ground","cy":-29.315479380504186,"rotation":[0,0,0.11344640137963143],"cx":16.7566929241104,"cz":7,"type":"Cuboid","normal":[0,0,1],"locked":true},{"ly":1,"normal":[0,0,1],"cx":19.914283665719672,"cy":-44.497740663585425,"lz":14,"lx":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,0.11344640137963143],"id":"ah9bKoBGUiMWeHKfdxzpi9","cz":7,"color":"gray","type":"Cuboid","locked":true,"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground"},{"lz":14,"normal":[0,0,1],"locked":true,"id":"vBZ2DA9y9KYiCwgzGpLfFD","color":"gray","lx":1,"rotation":[0,0,0.11344640137963143],"cz":7,"cy":-47.62693833888401,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","selected":false,"ly":1,"cx":20.25452350291907},{"cy":-38.0401954851006,"type":"Cuboid","lx":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"ly":1,"rotation":[0,0,0.11344640137963143],"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":7,"locked":true,"id":"2jpUuL1gcsjduHrhm3n43t","selected":false,"parentId":"Ground","cx":-17.59480337417267,"color":"gray","lz":14},{"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"ly":1,"cy":-50.768525050448105,"lz":14,"lx":1,"id":"doc8sxSmKeL7RKrAnLUcoL","selected":false,"type":"Cuboid","cx":-16.679482324891723,"locked":true,"color":"gray","rotation":[0,0,0.11344640137963143],"parentId":"Ground","cz":7},{"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"selected":false,"id":"us3zCoK5ewuBS6QTdVwh5n","cz":7,"ly":1,"lx":1,"normal":[0,0,1],"color":"gray","locked":true,"lz":14,"rotation":[0,0,0.11344640137963143],"cy":-63.79092407456009,"cx":-15.262534505030402,"parentId":"Ground"},{"faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,0.47123889803846897],"lz":10,"normal":[0,0,1],"lx":1,"type":"Cuboid","cy":-67.46996837049493,"id":"t959VVjipFtQcWvuiVz2K9","parentId":"Ground","cx":-4.425598860553924,"cz":5,"color":"gray","selected":false,"ly":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":true},{"ly":1,"lx":1,"locked":true,"type":"Cuboid","rotation":[0,0,0.47123889803846897],"cx":-3.1466144543948023,"normal":[0,0,1],"color":"gray","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":10,"cy":-66.65602476858759,"selected":false,"id":"qhPJYtSXY5a7RZFHnh9sXY","faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground","cz":5},{"cx":-6.364270455130605,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"lz":10,"ly":1,"locked":true,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"lx":1,"color":"gray","type":"Cuboid","selected":false,"id":"uHN4GMMVvGcf6APcCUZnSj","cy":-75.21381547306636,"rotation":[0,0,0.47123889803846897],"cz":5},{"ly":1,"cy":-83.03785791923461,"rotation":[0,0,0.47123889803846897],"locked":true,"lx":1,"normal":[0,0,1],"color":"gray","lz":8,"selected":false,"cx":-23.111777972260608,"id":"vtCxYC9fd4ntw6fFZCahnk","faceColors":["gray","gray","gray","gray","gray","gray"],"cz":4,"parentId":"Ground","type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"locked":true,"lz":10,"lx":1,"rotation":[0,0,0.47123889803846897],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":1,"color":"gray","type":"Cuboid","cy":-79.50076914190635,"cx":-14.662733157197128,"cz":5,"id":"hZWUtVcu3jjMB9HKr9R8ro","normal":[0,0,1],"parentId":"Ground"},{"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":true,"lx":1,"ly":1,"cz":4,"normal":[0,0,1],"color":"gray","rotation":[0,0,0.47123889803846897],"cy":-84.70748291923546,"id":"iw4xNrSMGDSZJUGzJ8pTqm","cx":-28.436527972260606,"lz":8,"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground"},{"type":"Cuboid","cz":4,"locked":true,"lz":8,"ly":1,"id":"iLtZHkfUgxkgeqhAZivYfe","cx":-30.88874837783922,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"selected":false,"cy":-84.0342920377216,"normal":[0,0,1],"parentId":"Ground","rotation":[0,0,0.47123889803846897],"lx":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"selected":false,"lz":8,"parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-13.782520236054552,"rotation":[0,0,0.47123889803846897],"type":"Cuboid","lx":1,"cz":4,"id":"ssCGfzEitaxtFqQF7Ga8kZ","color":"gray","ly":1,"normal":[0,0,1],"cy":-67.47809368871428,"faceColors":["gray","gray","gray","gray","gray","gray"],"locked":true},{"selected":false,"color":"#f9fdfe","ly":0,"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","lz":0,"lx":0,"lineColor":"black","textureType":"No Roof Texture","rotation":[0,0,0],"parentId":"1nEGYML9Y5W4dWVRK3n5WW","roofType":"Pyramid","wallsId":["97HokqKu917DTkAssZGbhE","fPtvUV7Bzhezt9xwDuPEmF","ebWW9yh8D9FYjir4ozAvaz","v4k1Tt2DPV8adpDFKC5P12","2QQRWDofKjHid4D3rHXvwX"],"locked":true,"type":"Roof","cx":0,"showLabel":false,"lineWidth":0.2,"thickness":0.2,"normal":[0,0,1],"cz":0,"cy":0,"id":"vaDVUZ1uyEALYaHTbs211h","sideColor":"#f9fdfe","rise":0,"ceiling":false},{"selected":false,"lz":0.4,"filled":false,"id":"fdazNUtKFoSEAPgq9CQJES","type":"Polygon","locked":true,"cx":0,"parentId":"qsPqX4eMRADWLb6uFzZyu3","color":"#d0d7da","selectedIndex":3,"foundationId":"qsPqX4eMRADWLb6uFzZyu3","cz":0,"rotation":[0,0,0.11344640137963143],"normal":[0,0,1],"vertices":[{"x":-0.3919656451231681,"y":-0.44378588479022363},{"x":-0.3919656451231681,"y":0.4581015584931341},{"y":0.4581015584931341,"x":0.3563324046574256},{"y":-0.44378588479022363,"x":0.3563324046574256}],"cy":0,"ly":0.4,"lx":0.4,"lineColor":"#ffffff","lineStyle":2},{"type":"Polygon","cz":0,"lx":0.4,"selected":false,"color":"#dadedf","normal":[0,0,1],"lz":0.4,"filled":false,"locked":true,"parentId":"jeaVPPnZw5Ed7yuuYuFjT4","ly":0.4,"cy":0,"selectedIndex":5,"rotation":[0,0,-0.22689280275926285],"id":"4bjxP3DGK4dodwicaeMGrq","vertices":[{"x":-0.4583333333333333,"y":-0.41984420002481043},{"x":-0.4583333333333333,"y":0.2798961333498736},{"y":0.2798961333498736,"x":-0.4083333333333333},{"x":-0.4083333333333333,"y":0.41984420002481043},{"x":0.20833333333333334,"y":0.41984420002481043},{"y":-0.41984420002481043,"x":0.20833333333333334}],"cx":0,"foundationId":"jeaVPPnZw5Ed7yuuYuFjT4","lineStyle":2,"lineColor":"#ffffff"},{"type":"Tree","name":"Magnolia","cx":-42.801241972409024,"cy":-41.7007983662498,"cz":0,"lx":9.278019576062961,"lz":8.643797542596442,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"g1FsRLcUZdSt9Q2DU31zPA","selected":false,"locked":true},{"type":"Tree","name":"Magnolia","cx":-59.8787215366302,"cy":-50.66068977312313,"cz":-7.105427357601002e-15,"lx":9.278019576062961,"lz":11.78149367100265,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"krmMVWEiKsnePivMXL7Nes","selected":false,"locked":true},{"type":"Tree","name":"Magnolia","cx":-51.87839388003734,"cy":-62.51980907480443,"cz":0,"lx":6.499371428507982,"lz":7.082169014620417,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"rW1c33rx65WFpCNTzaAbaM","selected":false,"locked":true}],"view":{"showDailyLightSensorPanel":false,"yearlyHeliostatYieldPanelY":0,"yearlyFresnelReflectorYieldPanelY":0,"showInstructionPanel":false,"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelX":0,"panCenter2D":[-38.51386717609555,9.861822957610682,-0.00020795605672141833],"dailyPvYieldPanelRect":{"height":400,"width":600,"x":0,"y":0},"panCenter":[-7.484723712513362,-24.66583880095733,0.1225204207961253],"showMapPanel":false,"groundColor":"#16a5a5","yearlyFresnelReflectorYieldPanelRect":{"x":0,"width":600,"y":0,"height":400},"yearlyPvYieldPanelY":0,"mapWeatherStations":false,"visibilityResultsPanelX":0,"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400},"stickyNotePanelRect":{"width":269,"y":0,"x":-3,"height":87},"cameraPosition2D":[-38.51386717609555,9.861802956721695,19.99979204387911],"showYearlyParabolicTroughYieldPanel":false,"showEvolutionPanel":false,"showHeliodonPanel":false,"theme":"Default","showYearlyParabolicDishYieldPanel":false,"mapPanelX":0,"showDailyFresnelReflectorYieldPanel":false,"dailyLightSensorPanelX":0,"dailyParabolicDishYieldPanelX":0,"heliodon":false,"dailyPvYieldPanelX":0,"dailyFresnelReflectorYieldPanelRect":{"y":0,"height":400,"x":0,"width":600},"axes":true,"mapTilt":0,"dailyFresnelReflectorYieldPanelX":0,"showEconomicsPanel":false,"dailyParabolicTroughYieldPanelY":0,"dailyLightSensorPanelY":0,"visibilityResultsPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"showYearlyFresnelReflectorYieldPanel":false,"yearlyLightSensorPanelRect":{"height":500,"y":0,"x":0,"width":600},"dailyParabolicDishYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"showDesignInfoPanel":true,"yearlyUpdraftTowerYieldPanelRect":{"y":0,"height":400,"x":0,"width":600},"yearlyPvYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"yearlyParabolicDishYieldPanelX":0,"solarRadiationHeatMapReflectionOnly":false,"showZenithAngle":true,"groundImage":true,"showYearlyLightSensorPanel":false,"mapZoom":17,"yearlyFresnelReflectorYieldPanelX":0,"visibilityResultsPanelRect":{"width":600,"x":0,"y":0,"height":470},"showStickyNotePanel":true,"yearlyLightSensorPanelShowClearness":false,"showElevationAngle":true,"weatherPanelY":0,"yearlyLightSensorPanelShowDaylight":false,"yearlyLightSensorPanelY":0,"mapType":"hybrid","showYearlyPvYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"yearlyPvYieldPanelX":0,"diurnalTemperaturePanelRect":{"width":600,"x":0,"y":0,"height":400},"dailyHeliostatYieldPanelX":0,"heliodonPanelX":0,"showYearlyHeliostatYieldPanel":false,"yearlyParabolicTroughYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"dailyHeliostatYieldPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"stickyNotePanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelRect":{"height":400,"x":0,"width":600,"y":0},"orthographic":false,"cameraPosition":[35.702709576196014,-94.16775966891016,142.42515130862242],"showDailyUpdraftTowerYieldPanel":false,"showDailyPvYieldPanel":false,"enableRotate":true,"showYearlyUpdraftTowerYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showDailyParabolicTroughYieldPanel":false,"dailyFresnelReflectorYieldPanelY":0,"showWeatherPanel":false,"yearlyLightSensorPanelX":0,"mapPanelY":0,"dailyHeliostatYieldPanelRect":{"height":400,"width":600,"x":0,"y":0},"autoRotate":false,"dailyParabolicDishYieldPanelY":0,"cameraZoom":22.160664819944596,"showAzimuthAngle":true,"weatherPanelRect":{"y":0,"x":0,"height":500,"width":500},"showSunAngles":false,"dailyLightSensorPanelRect":{"x":0,"width":600,"height":360,"y":0},"heliodonPanelY":0,"showSolarPanelVisibilityResultsPanel":false,"showDailyHeliostatYieldPanel":false,"shadowEnabled":true,"dailyUpdraftTowerYieldPanelRect":{"x":0,"width":640,"height":550,"y":0},"dailyPvYieldPanelY":0,"showDiurnalTemperaturePanel":false,"weatherPanelX":0,"ambientLightIntensity":0.1,"solarRadiationHeatMapMaxValue":5,"stickyNotePanelX":0,"showSiteInfoPanel":true,"yearlyHeliostatYieldPanelRect":{"width":600,"x":0,"y":0,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"rowAxis":"Left-Right","interRowSpacing":2,"tiltAngle":0,"poleSpacing":3,"rowsPerRack":1,"poleHeight":1,"pvModelName":"SPR-X21-335-BLK","orientation":"Landscape"},"solarPanelArrayLayoutConstraints":{"maximumTiltAngle":1.5707963267948966,"minimumRowsPerRack":1,"rowAxis":"Left-Right","orientation":"Landscape","maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumInterRowSpacing":10,"minimumInterRowSpacing":2,"poleSpacing":5,"poleHeight":1,"pvModelName":"CS6X-355P-FG"},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"vmax":0.01,"localSearchRadius":0.1,"inertia":0.8,"searchMethod":1,"maximumSteps":5,"objectiveFunctionType":1,"problem":"Solar Panel Tilt Angle","socialCoefficient":0.1,"convergenceThreshold":0.01,"cognitiveCoefficient":0.1,"swarmSize":20},"geneticAlgorithmParams":{"localSearchRadius":0.1,"maximumGenerations":5,"mutationRate":0.1,"problem":"Solar Panel Tilt Angle","selectionRate":0.5,"populationSize":20,"objectiveFunctionType":1,"searchMethod":1,"convergenceThreshold":0.01,"selectionMethod":1,"crossoverRate":0.5}},"economicsParams":{"electricitySellingPrice":0.25,"projectLifeSpan":25,"operationalCostPerUnit":0.15},"notes":["South Burlington High School\\nVermont, USA"]}')},471:function(e){e.exports=JSON.parse('{"docid":"dWgDnPJDqR9XymfxSQN7WJ","time":"02/03/2023 07:56 pm","timestamp":1675472176562,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"pvGridCellSize":0.5,"timesPerHour":2,"latitude":33.225546302957646,"longitude":-105.74311446654394,"daysPerYear":4,"airAttenuationCoefficient":0.01,"solarPanelVisibilityGridCellSize":0.2,"cspDaysPerYear":4,"sutGridCellSize":1,"diurnalTemperatureModel":1,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"noAnimationForSolarPanelSimulation":false,"noAnimationForSolarUpdraftTowerSimulation":false,"name":"default","highestTemperatureTimeInMinutes":900,"noAnimationForSensorDataCollection":false,"cspGridCellSize":0.5,"cspTimesPerHour":4,"sutDaysPerYear":4,"airConvectiveCoefficient":5,"dustLoss":0.05,"address":"249 White Mountain Dr, Mescalero, NM 88340, USA","sutTimesPerHour":4,"discretization":"Approximate","noAnimationForHeatmapSimulation":false,"date":"Wed Jun 22 2022 12:00:00 GMT-0400 (Eastern Daylight Time)","solarRadiationHeatmapGridCellSize":10},"elements":[{"cx":36.04364346579838,"color":"#808080","normal":[0,0,1],"id":"aXWETyunkqtQVNXGWr9VZd","solarPowerTower":{},"solarAbsorberPipe":{},"lx":65.26457989390352,"rotation":[0,0,-0.41015237421866746],"ly":29.235638926118842,"cz":0.5,"solarUpdraftTower":{},"cy":-20.683265041734174,"parentId":"Ground","locked":false,"type":"Foundation","lz":1,"selected":false},{"type":"Wall","parentId":"aXWETyunkqtQVNXGWr9VZd","locked":false,"leftJoints":["7a9g1bU6Fq192u17jYzUVQ"],"windows":[],"normal":[0,0,1],"rightPoint":[-30.895924961184342,13.06099510897374,1],"leftPoint":[32.60407503881567,13.060995108973744,1],"id":"qmFzWJnLZGgtRZtU4NCV2i","rightJoints":["8UV181m3Qgm4gVeHjN6o1N"],"leftRoofHeight":5,"color":"white","cx":0.8540750388156599,"foundationId":"aXWETyunkqtQVNXGWr9VZd","lineColor":"black","cz":0,"lz":5,"rotation":[0,0,-0.41015237421866746],"selected":false,"textureType":"Wall Texture Default","showLabel":false,"cy":13.060995108973737,"roofId":"adpYUuHEY6XwTLGq9piRR2","ly":0.3,"lx":63.5,"relativeAngle":3.141592653589793,"rightRoofHeight":5,"lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"lineWidth":0.2,"windows":[],"cy":-0.1890048910262596,"color":"white","showLabel":false,"rightJoints":["qmFzWJnLZGgtRZtU4NCV2i"],"normal":[0,0,1],"lineColor":"black","textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"roofId":"adpYUuHEY6XwTLGq9piRR2","lz":5,"locked":false,"cx":32.604075038815665,"lx":26.500000000000004,"ly":0.3,"selected":false,"leftPoint":[32.604075038815665,-13.439004891026256,1],"parentId":"aXWETyunkqtQVNXGWr9VZd","rightPoint":[32.60407503881566,13.060995108973742,1],"leftRoofHeight":5,"type":"Wall","rightRoofHeight":5,"foundationId":"aXWETyunkqtQVNXGWr9VZd","leftJoints":["cqVaqhkF9cafDk3CujuxhA"],"cz":0,"relativeAngle":1.5707963267948966,"id":"7a9g1bU6Fq192u17jYzUVQ","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cx":0.8540750388156644,"windows":[],"leftPoint":[-30.895924961184335,-13.439004891026261,1],"rightRoofHeight":5,"showLabel":false,"selected":false,"type":"Wall","leftJoints":["8UV181m3Qgm4gVeHjN6o1N"],"rightPoint":[32.604075038815665,-13.439004891026256,1],"cz":0,"ly":0.3,"parentId":"aXWETyunkqtQVNXGWr9VZd","relativeAngle":0,"id":"cqVaqhkF9cafDk3CujuxhA","roofId":"adpYUuHEY6XwTLGq9piRR2","rightJoints":["7a9g1bU6Fq192u17jYzUVQ"],"lx":63.50000000000001,"textureType":"Wall Texture Default","lineWidth":0.2,"cy":-13.439004891026254,"lineColor":"black","lz":5,"rotation":[0,0,-0.41015237421866746],"leftRoofHeight":5,"locked":false,"normal":[0,0,1],"foundationId":"aXWETyunkqtQVNXGWr9VZd","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cy":-0.18900489102626317,"leftRoofHeight":5,"lz":5,"textureType":"Wall Texture Default","leftPoint":[-30.895924961184342,13.06099510897374,1],"relativeAngle":4.71238898038469,"cz":0,"rightJoints":["cqVaqhkF9cafDk3CujuxhA"],"selected":false,"foundationId":"aXWETyunkqtQVNXGWr9VZd","lx":26.50000000000001,"parentId":"aXWETyunkqtQVNXGWr9VZd","rotation":[0,0,-0.41015237421866746],"rightPoint":[-30.89592496118435,-13.439004891026267,1],"color":"white","type":"Wall","normal":[0,0,1],"rightRoofHeight":5,"leftJoints":["qmFzWJnLZGgtRZtU4NCV2i"],"cx":-30.895924961184342,"windows":[],"roofId":"adpYUuHEY6XwTLGq9piRR2","ly":0.3,"lineWidth":0.2,"id":"8UV181m3Qgm4gVeHjN6o1N","locked":false,"lineColor":"black","showLabel":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"lz":1,"solarAbsorberPipe":{},"cz":0.5,"ly":4.206012254646608,"type":"Foundation","rotation":[0,0,-0.41015237421866746],"lx":31.26437853168839,"normal":[0,0,1],"solarUpdraftTower":{},"cx":-2.5548208091674596,"selected":false,"parentId":"Ground","cy":-104.18033992817378,"solarPowerTower":{},"locked":false,"id":"67y6tGP5Z273J9KfaZt2qW"},{"color":"white","ly":0.3,"normal":[0,0,1],"windows":[],"leftPoint":[-2.1622916607695264,-2.0529036258004845,0],"rightPoint":[-2.1622916607695246,1.9676858128519996,0],"rightRoofHeight":6,"roofId":"vamU7TTNZeBARJChC8HbPy","rightJoints":["vyB1xaFqKE2eYECPWHSjtt"],"lineColor":"black","showLabel":false,"type":"Wall","parentId":"67y6tGP5Z273J9KfaZt2qW","cz":0,"id":"vVaHoupmNeeUhBf8aEhNwN","cy":-0.042608906474242425,"foundationId":"67y6tGP5Z273J9KfaZt2qW","lineWidth":0.2,"textureType":"Wall Texture Default","leftJoints":["c2T86bj1Ndr1wBUNfBDMTd"],"cx":-2.1622916607695255,"relativeAngle":1.5707963267948961,"rotation":[0,0,-0.41015237421866746],"selected":false,"centerRoofHeight":[0,6.274887651356121],"lz":6,"lx":4.020589438652484,"leftRoofHeight":6,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"cy":-2.0529036258004867,"relativeAngle":5.681468402920898e-16,"selected":false,"normal":[0,0,1],"lz":6,"parentId":"67y6tGP5Z273J9KfaZt2qW","windows":[],"ly":0.3,"textureType":"Wall Texture Default","leftJoints":["42wy1mrJXkRG5d8TpG2sXB"],"roofId":"vamU7TTNZeBARJChC8HbPy","cz":0,"leftPoint":[-9.97874294335964,-2.052903625800489,0],"lineWidth":0.2,"id":"c2T86bj1Ndr1wBUNfBDMTd","rightRoofHeight":6,"color":"white","locked":false,"cx":-6.070517302064583,"lineColor":"black","lx":7.816451282590114,"type":"Wall","rotation":[0,0,-0.41015237421866746],"rightPoint":[-2.1622916607695264,-2.0529036258004845,0],"rightJoints":["vVaHoupmNeeUhBf8aEhNwN"],"showLabel":false,"foundationId":"67y6tGP5Z273J9KfaZt2qW","leftRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"showLabel":false,"lineWidth":0.2,"lx":4.020589438652497,"cy":-0.042608906474240316,"color":"white","lineColor":"black","leftJoints":["vyB1xaFqKE2eYECPWHSjtt"],"id":"42wy1mrJXkRG5d8TpG2sXB","leftPoint":[-9.978742943359647,1.9676858128520083,0],"ly":0.3,"cz":0,"parentId":"67y6tGP5Z273J9KfaZt2qW","rightRoofHeight":6,"lz":6,"type":"Wall","cx":-9.978742943359643,"relativeAngle":-1.5707963267948948,"foundationId":"67y6tGP5Z273J9KfaZt2qW","normal":[0,0,1],"rightJoints":["c2T86bj1Ndr1wBUNfBDMTd"],"textureType":"Wall Texture Default","locked":false,"selected":false,"centerRoofHeight":[0,6.274887651356121],"windows":[],"roofId":"vamU7TTNZeBARJChC8HbPy","leftRoofHeight":6,"rightPoint":[-9.97874294335964,-2.052903625800489,0],"rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightRoofHeight":6,"id":"vyB1xaFqKE2eYECPWHSjtt","textureType":"Wall Texture Default","lx":7.816451282590123,"leftRoofHeight":6,"color":"white","selected":false,"roofId":"vamU7TTNZeBARJChC8HbPy","showLabel":false,"cz":3.7151685093329987,"cx":-6.0705173020645855,"rotation":[0,0,-0.41015237421866746],"type":"Wall","rightPoint":[-9.978742943359647,1.9676858128520083,0],"ly":0.3,"lineWidth":0.2,"windows":[],"parentId":"67y6tGP5Z273J9KfaZt2qW","foundationId":"67y6tGP5Z273J9KfaZt2qW","leftJoints":["vVaHoupmNeeUhBf8aEhNwN"],"cy":1.9676858128520038,"locked":false,"relativeAngle":3.1415926535897922,"rightJoints":["42wy1mrJXkRG5d8TpG2sXB"],"leftPoint":[-2.1622916607695246,1.9676858128519996,0],"lineColor":"black","lz":6,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"cz":0.5,"id":"vr622m4sUbseJrnaD3qEiM","cx":-34.35924569376295,"rotation":[0,0,-0.41015237421866746],"solarAbsorberPipe":{},"lz":1,"normal":[0,0,1],"solarPowerTower":{},"selected":false,"lx":9.87769053193653,"ly":13.609083182601537,"solarUpdraftTower":{},"locked":false,"parentId":"Ground","type":"Foundation","cy":-110.59011455401989},{"leftJoints":["mMXGrqXV1RkkkiT4sMy7uW"],"lineWidth":0.2,"cz":0,"rightRoofHeight":5.5,"rightPoint":[-3.499999999999999,5.5,0],"cy":5.5,"relativeAngle":3.141592653589793,"color":"white","roofId":"2v86EFgUZGnV81678JbvWF","locked":false,"windows":[],"leftPoint":[3.5,5.5,0],"lz":5.5,"selected":false,"type":"Wall","normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","showLabel":false,"id":"3XaMSJRAJ16nXkn1WKx9DA","lx":6.999999999999999,"foundationId":"vr622m4sUbseJrnaD3qEiM","ly":0.3,"rightJoints":["fgcrmKBkK397YQPfDfJ1C1"],"parentId":"vr622m4sUbseJrnaD3qEiM","leftRoofHeight":5.5,"lineColor":"black","cx":4.440892098500626e-16,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"rightJoints":["3XaMSJRAJ16nXkn1WKx9DA"],"lx":6.000000000000007,"windows":[],"rotation":[0,0,-0.41015237421866746],"locked":false,"normal":[0,0,1],"lineColor":"black","showLabel":false,"leftJoints":["gphnEpjKALdRhPrtitPn39"],"lz":5.5,"rightRoofHeight":5.5,"selected":false,"foundationId":"vr622m4sUbseJrnaD3qEiM","leftRoofHeight":5.5,"parentId":"vr622m4sUbseJrnaD3qEiM","ly":0.3,"lineWidth":0.2,"cy":2.5000000000000036,"id":"mMXGrqXV1RkkkiT4sMy7uW","rightPoint":[3.499999999999996,5.500000000000007,0],"cz":0,"textureType":"Wall Texture Default","leftPoint":[3.5,-0.5,0],"relativeAngle":1.5707963267948974,"type":"Wall","roofId":"2v86EFgUZGnV81678JbvWF","cx":3.4999999999999982,"color":"white","centerRoofHeight":[0.5,5.5],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"selected":false,"type":"Wall","windows":[],"leftPoint":[-3.499999999999999,5.5,0],"parentId":"vr622m4sUbseJrnaD3qEiM","normal":[0,0,1],"rightRoofHeight":5.5,"color":"white","lineWidth":0.2,"cz":0,"rotation":[0,0,-0.41015237421866746],"lz":5.5,"lineColor":"black","lx":6,"leftRoofHeight":5.5,"centerRoofHeight":[-0.5,5.5],"cy":2.5,"foundationId":"vr622m4sUbseJrnaD3qEiM","relativeAngle":4.71238898038469,"roofId":"2v86EFgUZGnV81678JbvWF","rightJoints":["gphnEpjKALdRhPrtitPn39"],"locked":false,"cx":-3.4999999999999996,"textureType":"Wall Texture Default","leftJoints":["3XaMSJRAJ16nXkn1WKx9DA"],"ly":0.3,"id":"fgcrmKBkK397YQPfDfJ1C1","showLabel":false,"rightPoint":[-3.5,-0.5,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"lz":5.5,"leftPoint":[-3.500000000000002,-0.5000000000000027,0],"foundationId":"vr622m4sUbseJrnaD3qEiM","cy":-0.5000000000000013,"cx":-1.1102230246251565e-15,"rightPoint":[3.5,-0.5,0],"type":"Wall","locked":false,"rotation":[0,0,-0.41015237421866746],"color":"white","rightRoofHeight":5.5,"parentId":"vr622m4sUbseJrnaD3qEiM","showLabel":false,"lx":7.000000000000002,"lineColor":"black","id":"gphnEpjKALdRhPrtitPn39","selected":false,"rightJoints":["mMXGrqXV1RkkkiT4sMy7uW"],"relativeAngle":3.806478941571964e-16,"lineWidth":0.2,"roofId":"2v86EFgUZGnV81678JbvWF","ly":0.3,"leftRoofHeight":5.5,"normal":[0,0,1],"textureType":"Wall Texture Default","leftJoints":["fgcrmKBkK397YQPfDfJ1C1"],"windows":[],"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"normal":[0,0,1],"lz":0,"selected":false,"lineWidth":0.2,"lineColor":"black","ridgeLeftPoint":[-0.5,1],"roofType":"Gable","rotation":[0,0,-0.41015237421866746],"ridgeRightPoint":[0.5,1],"color":"#ffffff","wallsId":["gphnEpjKALdRhPrtitPn39"],"foundationId":"vr622m4sUbseJrnaD3qEiM","showLabel":false,"lx":0,"ly":0,"type":"Roof","id":"2v86EFgUZGnV81678JbvWF","cy":0,"textureType":"No Roof Texture","parentId":"vr622m4sUbseJrnaD3qEiM","locked":false,"thickness":0.2,"cz":0,"cx":0,"rise":0,"ceiling":false},{"faceColors":["#808080","#808080","#808080","#808080","gray","gray"],"type":"Cuboid","normal":[0,0,1],"lz":10,"color":"#808080","rotation":[0,0,-0.41015237421866746],"id":"tJwtVMueteLadJkjPMvgHJ","ly":5.2309404248682405,"lx":17.77873962075454,"parentId":"Ground","cy":-91.40202421369783,"selected":false,"cx":-30.993558257452644,"cz":5,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false},{"normal":[0,0,1],"locked":false,"cy":-78.92340302016538,"type":"Cuboid","color":"gray","lx":1.0334892378492886,"id":"bsLSWBxdTE3mxEDuQuAp85","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"selected":false,"lz":10,"parentId":"Ground","ly":1.0961848981988211,"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":5,"rotation":[0,0,-0.41015237421866746],"cx":-51.860873283037826},{"cx":-50.86971253877132,"cy":-76.80735590147192,"color":"gray","parentId":"Ground","selected":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.41015237421866746],"lz":10,"ly":1.0961848981988211,"cz":5,"faceColors":["gray","gray","gray","gray","gray","gray"],"id":"iiF3WkKwiFkKBVE2vpXCby","lx":1.0334892378492886,"normal":[0,0,1],"locked":false,"type":"Cuboid"},{"cx":-40.795288101438004,"normal":[0,0,1],"selected":false,"cy":-87.54304825772702,"faceColors":["gray","gray","gray","gray","gray","gray"],"ly":1.57584749281375,"cz":5,"type":"Cuboid","locked":false,"id":"fxmDEQJYBtbGKzqxLPsYbc","rotation":[0,0,-0.41015237421866746],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":10,"parentId":"Ground","color":"gray","lx":2.5033124327375345},{"cx":-65.84838339559631,"parentId":"Ground","id":"gEHbpQXkCu9RtbMyy3Xryz","solarPowerTower":{},"cz":0.5,"type":"Foundation","lz":1,"locked":false,"normal":[0,0,1],"solarUpdraftTower":{},"lx":23.72966343486742,"rotation":[0,0,-0.41015237421866746],"solarAbsorberPipe":{},"selected":false,"ly":44.45702535517728,"cy":23.93484529988586},{"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","cz":0,"type":"Wall","lineWidth":0.2,"rightJoints":["e5up5WS9fCbKNmdUhKFsh6"],"ly":0.3,"parentId":"gEHbpQXkCu9RtbMyy3Xryz","leftJoints":["wxDvuiUvYK71aR1xZ9r86C"],"cx":6.378439777987635,"windows":[],"roofId":"8JTXb2hRmgAaiTxMs35gh1","rightRoofHeight":5,"leftRoofHeight":5,"leftPoint":[6.378439777987634,-14.93662498464927,0],"normal":[0,0,1],"locked":false,"rotation":[0,0,-0.41015237421866746],"selected":false,"color":"white","rightPoint":[6.378439777987638,13.906512916742425,0],"relativeAngle":1.5707963267948966,"lz":5,"showLabel":false,"lineColor":"black","lx":28.843137901391696,"id":"pk5HH5mW7Fkgf2nUSMZyW9","textureType":"Wall Texture Default","cy":-0.5150560339534227,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cz":0,"locked":false,"relativeAngle":0,"selected":false,"rightRoofHeight":5,"color":"white","lineColor":"black","lx":6.909976426153277,"ly":0.3,"textureType":"Wall Texture Default","windows":[],"leftPoint":[-0.5315366481656362,-14.93662498464927,0],"lz":5,"rightJoints":["pk5HH5mW7Fkgf2nUSMZyW9"],"type":"Wall","cx":2.9234515649110024,"rightPoint":[6.378439777987641,-14.93662498464927,0],"leftRoofHeight":5,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","showLabel":false,"rotation":[0,0,-0.41015237421866746],"roofId":"8JTXb2hRmgAaiTxMs35gh1","normal":[0,0,1],"leftJoints":["jmovDX25miN2VZhEhqh9uy"],"cy":-14.93662498464927,"lineWidth":0.2,"parentId":"gEHbpQXkCu9RtbMyy3Xryz","id":"wxDvuiUvYK71aR1xZ9r86C","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rightJoints":["ncaNE7qPYcxTMDrSjrKjqC"],"type":"Wall","lz":5,"rightRoofHeight":5,"cy":13.906512916742425,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","selected":false,"cx":2.923451564911001,"lx":6.909976426153274,"cz":0,"lineWidth":0.2,"id":"e5up5WS9fCbKNmdUhKFsh6","leftJoints":["pk5HH5mW7Fkgf2nUSMZyW9"],"locked":false,"lineColor":"black","showLabel":false,"leftRoofHeight":5,"ly":0.3,"leftPoint":[6.378439777987638,13.906512916742425,0],"color":"white","roofId":"8JTXb2hRmgAaiTxMs35gh1","parentId":"gEHbpQXkCu9RtbMyy3Xryz","textureType":"Wall Texture Default","rightPoint":[-0.5315366481656362,13.906512916742425,0],"rotation":[0,0,-0.41015237421866746],"relativeAngle":3.141592653589793,"windows":[],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"ly":0.3,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"parentId":"gEHbpQXkCu9RtbMyy3Xryz","id":"ncaNE7qPYcxTMDrSjrKjqC","rightJoints":["4z9pAxyVBGgvcBfL2oBkTg"],"lineColor":"black","color":"white","type":"Wall","cy":11.331232746975312,"locked":false,"windows":[],"rightPoint":[-2.6576832408281814,8.755952577208193,0],"lz":5,"roofId":"8JTXb2hRmgAaiTxMs35gh1","leftJoints":["e5up5WS9fCbKNmdUhKFsh6"],"selected":false,"lx":5.572142419633009,"leftPoint":[-0.5315366481656337,13.90651291674243,0],"relativeAngle":-1.962287472589105,"leftRoofHeight":5,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","showLabel":false,"cz":0,"textureType":"Wall Texture Default","lineWidth":0.2,"rightRoofHeight":5,"cx":-1.5946099444969075,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftPoint":[-2.6576832408281814,-10.301120679068463,0],"lineColor":"black","id":"jmovDX25miN2VZhEhqh9uy","leftJoints":["vmWMc4Nmqnx9AxgePRvtFK"],"rightRoofHeight":5,"ly":0.3,"cz":0,"windows":[],"relativeAngle":-1.1407594566434893,"parentId":"gEHbpQXkCu9RtbMyy3Xryz","leftRoofHeight":5,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","lz":5,"showLabel":false,"color":"white","cy":-12.618872831858864,"roofId":"8JTXb2hRmgAaiTxMs35gh1","lx":5.0998430858751655,"cx":-1.5946099444969064,"lineWidth":0.2,"type":"Wall","normal":[0,0,1],"locked":false,"rightPoint":[-0.5315366481656315,-14.936624984649265,0],"selected":false,"rightJoints":["wxDvuiUvYK71aR1xZ9r86C"],"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"lineColor":"black","type":"Wall","leftPoint":[-2.657683240828184,8.75595257720819,0],"rightRoofHeight":5,"leftRoofHeight":5,"rotation":[0,0,-0.41015237421866746],"color":"white","normal":[0,0,1],"ly":0.3,"textureType":"Wall Texture Default","parentId":"gEHbpQXkCu9RtbMyy3Xryz","cz":0,"lz":5,"showLabel":false,"rightPoint":[-3.720756537159453,3.0903362037205393,0],"relativeAngle":-1.756275603957499,"cx":-3.1892198889938186,"leftJoints":["ncaNE7qPYcxTMDrSjrKjqC"],"roofId":"8JTXb2hRmgAaiTxMs35gh1","lineWidth":0.2,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","windows":[],"lx":5.764489025482136,"id":"4z9pAxyVBGgvcBfL2oBkTg","selected":false,"rightJoints":["9Zt1Jh2MmnkaBKaBtYD19E"],"locked":false,"cy":5.923144390464365,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftPoint":[-3.720756537159453,-3.605392237673962,0],"roofId":"8JTXb2hRmgAaiTxMs35gh1","parentId":"gEHbpQXkCu9RtbMyy3Xryz","showLabel":false,"leftRoofHeight":5,"cx":-3.1892198889938137,"leftJoints":["9Zt1Jh2MmnkaBKaBtYD19E"],"type":"Wall","cy":-6.953256458371211,"windows":[],"color":"white","rightRoofHeight":5,"rightJoints":["jmovDX25miN2VZhEhqh9uy"],"textureType":"Wall Texture Default","lx":6.779594692477702,"lz":5,"rightPoint":[-2.6576832408281743,-10.30112067906846,0],"relativeAngle":-1.4133416859659305,"lineColor":"black","id":"vmWMc4Nmqnx9AxgePRvtFK","ly":0.3,"rotation":[0,0,-0.41015237421866746],"lineWidth":0.2,"locked":false,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","cz":0,"normal":[0,0,1],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"showLabel":false,"lz":5,"type":"Wall","leftJoints":["4z9pAxyVBGgvcBfL2oBkTg"],"relativeAngle":-1.5707963267948966,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"selected":false,"lineColor":"black","rightJoints":["vmWMc4Nmqnx9AxgePRvtFK"],"windows":[],"color":"white","ly":0.3,"roofId":"8JTXb2hRmgAaiTxMs35gh1","parentId":"gEHbpQXkCu9RtbMyy3Xryz","rightRoofHeight":5,"id":"9Zt1Jh2MmnkaBKaBtYD19E","leftPoint":[-3.720756537159453,3.0903362037205393,0],"lineWidth":0.2,"lx":6.695728441394501,"rightPoint":[-3.720756537159453,-3.605392237673962,0],"cy":-0.25752801697671135,"cz":0,"leftRoofHeight":5,"locked":false,"cx":-3.720756537159453,"textureType":"Wall Texture Default","foundationId":"gEHbpQXkCu9RtbMyy3Xryz","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"normal":[0,0,1],"type":"Foundation","solarPowerTower":{},"cz":0.5,"parentId":"Ground","lx":60.173882739434646,"solarAbsorberPipe":{},"id":"iUb7PSjszf44Zg2YisnC92","rotation":[0,0,-0.41015237421866746],"locked":false,"ly":39.103180000408386,"selected":false,"cy":-92.19721962691857,"cx":-31.79924395729909,"lz":1,"solarUpdraftTower":{}},{"cy":-0.32818957860566655,"normal":[0,0,1],"relativeAngle":1.5707963267948966,"rightPoint":[29.377149084975663,17.921810421394337,1],"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":5,"type":"Wall","locked":false,"cz":0,"roofId":"sYHDayEkzyov7moz6ZSxMu","lx":36.5,"selected":false,"leftPoint":[29.377149084975656,-18.57818957860566,1],"parentId":"iUb7PSjszf44Zg2YisnC92","id":"8M5AjFRvfsj1XtZsKZtgrR","leftJoints":["vBUTysuRjhgkSBTqe4LbYB"],"cx":29.37714908497567,"ly":0.3,"rightJoints":["fof9eWFH74VGAR5Qpn7HGe"],"color":"white","foundationId":"iUb7PSjszf44Zg2YisnC92","textureType":"Wall Texture Default","lz":5,"leftRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rightRoofHeight":5,"ly":0.3,"cy":-18.328189578605663,"lz":5,"locked":false,"cx":0.3771490849756667,"cz":0,"leftPoint":[-28.622850915024337,-18.07818957860566,1],"parentId":"iUb7PSjszf44Zg2YisnC92","color":"white","lx":58.00215513237418,"id":"vBUTysuRjhgkSBTqe4LbYB","selected":false,"normal":[0,0,1],"textureType":"Wall Texture Default","type":"Wall","relativeAngle":6.27456483106745,"leftRoofHeight":5,"leftJoints":["nSEqG4yU7gG9aGhAQPfSs7"],"rightJoints":["8M5AjFRvfsj1XtZsKZtgrR"],"rotation":[0,0,-0.41015237421866746],"rightPoint":[29.37714908497567,-18.578189578605652,1],"foundationId":"iUb7PSjszf44Zg2YisnC92","roofId":"sYHDayEkzyov7moz6ZSxMu","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"roofId":"sYHDayEkzyov7moz6ZSxMu","selected":false,"color":"white","cz":0,"relativeAngle":4.726276976315656,"type":"Wall","rightPoint":[-28.622850915024348,-18.078189578605663,1],"parentId":"iUb7PSjszf44Zg2YisnC92","cy":-0.07818957860566123,"rightRoofHeight":5,"lx":36.003472054789384,"foundationId":"iUb7PSjszf44Zg2YisnC92","locked":false,"ly":0.3,"rightJoints":["vBUTysuRjhgkSBTqe4LbYB"],"textureType":"Wall Texture Default","leftJoints":["fof9eWFH74VGAR5Qpn7HGe"],"rotation":[0,0,-0.41015237421866746],"leftPoint":[-29.122850915024344,17.921810421394333,1],"lz":5,"cx":-28.87285091502434,"id":"nSEqG4yU7gG9aGhAQPfSs7","leftRoofHeight":5,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"foundationId":"iUb7PSjszf44Zg2YisnC92","cz":0,"lx":58.50000000000001,"color":"white","leftRoofHeight":5,"leftPoint":[29.377149084975663,17.921810421394337,1],"rightPoint":[-29.122850915024344,17.921810421394333,1],"rightRoofHeight":5,"type":"Wall","leftJoints":["8M5AjFRvfsj1XtZsKZtgrR"],"cx":0.12714908497566135,"cy":17.921810421394333,"roofId":"sYHDayEkzyov7moz6ZSxMu","selected":false,"id":"fof9eWFH74VGAR5Qpn7HGe","lz":5,"relativeAngle":3.141592653589793,"locked":false,"ly":0.3,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"parentId":"iUb7PSjszf44Zg2YisnC92","rightJoints":["nSEqG4yU7gG9aGhAQPfSs7"],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"ridgeLeftPoint":[0,1],"wallsId":["vyB1xaFqKE2eYECPWHSjtt"],"selected":false,"lineColor":"black","thickness":0.2,"textureType":"No Roof Texture","cy":0,"locked":false,"lx":0,"foundationId":"67y6tGP5Z273J9KfaZt2qW","type":"Roof","id":"vamU7TTNZeBARJChC8HbPy","ridgeRightPoint":[0,1],"showLabel":false,"cz":0,"lineWidth":0.2,"lz":0,"cx":0,"parentId":"67y6tGP5Z273J9KfaZt2qW","ly":0,"color":"#ffffff","roofType":"Gable","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"rise":0.2748876513561207,"ceiling":false},{"rotation":[0,0,-0.41015237421866746],"color":"white","leftJoints":["aAXg3DaZ5U93pUr6mT9qRa"],"rightPoint":[21.241978419322884,-31.078254176042062,1],"relativeAngle":-8.350902447731317e-16,"cz":0,"lz":6,"normal":[0,0,1],"leftPoint":[-21.300892857609153,-31.07825417604202,1],"rightJoints":["eVDG7gqXM3uLaHhJS5k6Fh"],"textureType":"Wall Texture Default","cx":-0.02945721914313104,"cy":-31.078254176042037,"selected":false,"lx":42.54287127693204,"type":"Wall","roofId":"a67eFG3dY8EiYs3GWgTwsF","id":"eH6hFH3ypVjToGKtFHdgq1","ly":0.3,"parentId":"un11oZ7V5tAhWhFKuL8M5Q","locked":false,"foundationId":"un11oZ7V5tAhWhFKuL8M5Q","leftRoofHeight":6,"rightRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"leftJoints":["eH6hFH3ypVjToGKtFHdgq1"],"cx":21.241978419322905,"textureType":"Wall Texture Default","type":"Wall","parentId":"un11oZ7V5tAhWhFKuL8M5Q","lx":60.8712338982037,"locked":false,"roofId":"a67eFG3dY8EiYs3GWgTwsF","id":"eVDG7gqXM3uLaHhJS5k6Fh","foundationId":"un11oZ7V5tAhWhFKuL8M5Q","selected":false,"lz":6,"cz":0,"rightPoint":[21.241978419322912,29.792979722161636,1],"leftPoint":[21.241978419322884,-31.078254176042062,1],"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":6,"leftRoofHeight":6,"ly":0.3,"rightJoints":["n7z5CC6u32wsAzBksvYYPh"],"color":"white","relativeAngle":1.5707963267948961,"normal":[0,0,1],"cy":-0.6426372269402103,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","id":"n7z5CC6u32wsAzBksvYYPh","cz":0,"cx":-0.029457219143118607,"color":"white","foundationId":"un11oZ7V5tAhWhFKuL8M5Q","leftPoint":[21.241978419322912,29.792979722161636,1],"rightPoint":[-21.300892857609156,29.792979722161586,1],"rightJoints":["aAXg3DaZ5U93pUr6mT9qRa"],"lx":42.542871276932075,"lz":6,"locked":false,"rightRoofHeight":6,"selected":false,"ly":0.3,"cy":29.792979722161608,"relativeAngle":-3.1415926535897922,"textureType":"Wall Texture Default","leftRoofHeight":6,"normal":[0,0,1],"leftJoints":["eVDG7gqXM3uLaHhJS5k6Fh"],"rotation":[0,0,-0.41015237421866746],"roofId":"a67eFG3dY8EiYs3GWgTwsF","parentId":"un11oZ7V5tAhWhFKuL8M5Q","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"parentId":"un11oZ7V5tAhWhFKuL8M5Q","textureType":"Wall Texture Default","cy":-0.6426372269402094,"cx":-21.300892857609156,"ly":0.3,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.5707963267948966,"lx":60.87123389820361,"leftPoint":[-21.300892857609156,29.792979722161586,1],"rightPoint":[-21.300892857609153,-31.07825417604202,1],"selected":false,"leftRoofHeight":6,"locked":false,"rightJoints":["eH6hFH3ypVjToGKtFHdgq1"],"rightRoofHeight":6,"foundationId":"un11oZ7V5tAhWhFKuL8M5Q","id":"aAXg3DaZ5U93pUr6mT9qRa","cz":0,"color":"white","lz":6,"type":"Wall","roofId":"a67eFG3dY8EiYs3GWgTwsF","leftJoints":["n7z5CC6u32wsAzBksvYYPh"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"solarUpdraftTower":{},"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"solarPowerTower":{},"selected":false,"cy":87.53589386962994,"lz":1,"cz":0.5,"type":"Foundation","id":"un11oZ7V5tAhWhFKuL8M5Q","locked":false,"normal":[0,0,1],"cx":45.25333009420649,"solarAbsorberPipe":{},"lx":43.198179226129824,"ly":63.27584645952004},{"rightJoints":["e9GuUTJEvD6Q7osTyxTwrk"],"color":"white","lx":52.85122191172576,"rightRoofHeight":10,"ly":0.3,"lz":10,"leftRoofHeight":10,"cx":-1.8343056423094959,"locked":false,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"relativeAngle":3.141592653589793,"leftJoints":["3Yax97DpPm9sAXkyokJjCv"],"type":"Wall","parentId":"pdEGhJFD3W3BmcX1EPbyWH","foundationId":"pdEGhJFD3W3BmcX1EPbyWH","cz":0,"cy":17.27662252082144,"leftPoint":[24.59130531355338,17.276622520821444,1],"id":"2zTB9zP2crzAGhXAKtKuuQ","rightPoint":[-28.259916598172374,17.276622520821448,1],"selected":false,"textureType":"Wall Texture Default","roofId":"u17BQ8h2PCTPBYHjaSoxnN","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rightRoofHeight":10,"rightPoint":[24.591305313553377,17.276622520821448,1],"leftJoints":["9QvBYUfBnBzYQEjDjyYwwJ"],"rightJoints":["2zTB9zP2crzAGhXAKtKuuQ"],"cx":24.591305313553377,"normal":[0,0,1],"foundationId":"pdEGhJFD3W3BmcX1EPbyWH","id":"3Yax97DpPm9sAXkyokJjCv","type":"Wall","locked":false,"lx":33.26826380090492,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"textureType":"Wall Texture Default","color":"white","relativeAngle":1.5707963267948968,"lz":10,"leftPoint":[24.591305313553377,-15.991641280083474,1],"selected":false,"parentId":"pdEGhJFD3W3BmcX1EPbyWH","roofId":"u17BQ8h2PCTPBYHjaSoxnN","leftRoofHeight":10,"cz":0,"cy":0.6424906203689869,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"roofId":"u17BQ8h2PCTPBYHjaSoxnN","rightRoofHeight":10,"normal":[0,0,1],"cy":-15.99164128008347,"rotation":[0,0,-0.41015237421866746],"rightPoint":[24.59130531355339,-15.99164128008347,1],"relativeAngle":1.3444206397855422e-16,"leftJoints":["e9GuUTJEvD6Q7osTyxTwrk"],"leftRoofHeight":10,"textureType":"Wall Texture Default","lz":10,"foundationId":"pdEGhJFD3W3BmcX1EPbyWH","leftPoint":[-28.259916598172378,-15.991641280083478,1],"cx":-1.8343056423094914,"ly":0.3,"parentId":"pdEGhJFD3W3BmcX1EPbyWH","id":"9QvBYUfBnBzYQEjDjyYwwJ","cz":0,"rightJoints":["3Yax97DpPm9sAXkyokJjCv"],"selected":false,"type":"Wall","locked":false,"color":"white","lx":52.85122191172576,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lx":33.268263800904926,"roofId":"u17BQ8h2PCTPBYHjaSoxnN","locked":false,"color":"white","lz":10,"leftPoint":[-28.259916598172374,17.276622520821448,1],"cz":0,"cx":-28.259916598172378,"foundationId":"pdEGhJFD3W3BmcX1EPbyWH","rightRoofHeight":10,"rightJoints":["9QvBYUfBnBzYQEjDjyYwwJ"],"rightPoint":[-28.25991659817238,-15.991641280083474,1],"leftJoints":["2zTB9zP2crzAGhXAKtKuuQ"],"rotation":[0,0,-0.41015237421866746],"cy":0.6424906203689869,"parentId":"pdEGhJFD3W3BmcX1EPbyWH","leftRoofHeight":10,"selected":false,"id":"e9GuUTJEvD6Q7osTyxTwrk","ly":0.3,"textureType":"Wall Texture Default","normal":[0,0,1],"type":"Wall","relativeAngle":-1.5707963267948968,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"ly":35.70031798940237,"cy":9.0346445367948,"cx":-34.76955763240692,"solarPowerTower":{},"id":"pdEGhJFD3W3BmcX1EPbyWH","solarUpdraftTower":{},"lz":1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"parentId":"Ground","type":"Foundation","color":"#808080","lx":61.18626972549096,"rotation":[0,0,-0.41015237421866746],"locked":false,"cz":0.5},{"ly":0.3,"rightJoints":["uSo7fsB5ruR2pmb3hS5LJZ"],"roofId":"iLELU7fMnA7QkYUmgQBEWM","rightPoint":[-11.5,12.5,0],"selected":false,"normal":[0,0,1],"type":"Wall","rotation":[0,0,-0.41015237421866746],"leftRoofHeight":5,"color":"white","rightRoofHeight":5,"locked":false,"leftJoints":["9NzKjLTF3oM85YSQpL4gnd"],"relativeAngle":1.5707963267948961,"lz":5,"cx":-11.5,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","cz":0,"lx":4.5000000000000036,"cy":10.249999999999998,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","textureType":"Wall Texture Default","id":"qVHFnW8AAY4XUoieeiErxH","leftPoint":[-11.500000000000002,7.9999999999999964,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cy":-3.699284342853991,"cz":0,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","id":"o6KGNbWFg87od5BX9EpsTo","leftRoofHeight":5,"rightJoints":["9NzKjLTF3oM85YSQpL4gnd"],"lz":5,"normal":[0,0,1],"roofId":"iLELU7fMnA7QkYUmgQBEWM","rightPoint":[19,8,0],"type":"Wall","rightRoofHeight":5,"lx":23.399166797479726,"locked":false,"leftJoints":["2TSEdoLpnDva8vLd5CzUbS"],"relativeAngle":1.577946340946004,"selected":false,"textureType":"Wall Texture Default","cx":19.08365147411056,"color":"white","rotation":[0,0,-0.41015237421866746],"ly":0.3,"leftPoint":[19.167302948221124,-15.398568685707982,0],"parentId":"5Ccs4YQJG3fyuyHdGw79zD","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"roofId":"iLELU7fMnA7QkYUmgQBEWM","id":"2TSEdoLpnDva8vLd5CzUbS","rightRoofHeight":5,"locked":false,"normal":[0,0,1],"cy":-15.449284342853987,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","rotation":[0,0,-0.41015237421866746],"leftPoint":[-17.5,-15.5,0],"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","ly":0.3,"rightPoint":[19.16730294822113,-15.398568685707975,0],"selected":false,"rightJoints":["o6KGNbWFg87od5BX9EpsTo"],"leftJoints":["g6f1sfDxicEvG7uLqaixdo"],"relativeAngle":0.0027662535123536003,"type":"Wall","cx":0.8336514741105656,"lz":5,"textureType":"Wall Texture Default","leftRoofHeight":5,"lx":36.667443240675304,"color":"white","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftJoints":["susL6EqdzG6nqxMNGZaDXi"],"rightPoint":[-17.5,-15.5,0],"rotation":[0,0,-0.41015237421866746],"ly":0.3,"leftRoofHeight":5,"selected":false,"color":"white","foundationId":"5Ccs4YQJG3fyuyHdGw79zD","id":"g6f1sfDxicEvG7uLqaixdo","parentId":"5Ccs4YQJG3fyuyHdGw79zD","lx":12.5,"textureType":"Wall Texture Default","locked":false,"rightJoints":["2TSEdoLpnDva8vLd5CzUbS"],"cy":-9.25,"type":"Wall","leftPoint":[-17.5,-3,0],"roofId":"iLELU7fMnA7QkYUmgQBEWM","rightRoofHeight":5,"lz":5,"relativeAngle":4.71238898038469,"cx":-17.5,"cz":0,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cz":0.5,"ly":46.30008176444467,"color":"#808080","selected":false,"solarUpdraftTower":{},"locked":false,"solarAbsorberPipe":{},"type":"Foundation","cy":36.64822593291561,"id":"5Ccs4YQJG3fyuyHdGw79zD","rotation":[0,0,-0.41015237421866746],"cx":-16.881510447516995,"lx":50.75601134711293,"parentId":"Ground","lz":1,"normal":[0,0,1],"solarPowerTower":{}},{"type":"Wall","foundationId":"bEJsUFdHaD6DHGcx6x8yR6","rightPoint":[-13.223409044384212,13.466478685194005,1],"rightJoints":["wv4UgZqFkoaJSym14cGEUi"],"ly":0.3,"rightRoofHeight":10,"roofId":"gTmk5BL11HKrSyJkFQtskK","locked":false,"normal":[0,0,1],"cx":2.2442947755447555,"leftRoofHeight":10,"relativeAngle":3.141592653589793,"cy":13.466478685194003,"cz":0,"rotation":[0,0,-0.41015237421866746],"parentId":"bEJsUFdHaD6DHGcx6x8yR6","color":"white","id":"3VxH8hmRUhtWZN2xHFt4SG","selected":false,"textureType":"Wall Texture Default","leftJoints":["xrxYGVSxLCof2hSDyYDBhi"],"leftPoint":[17.711998595473723,13.466478685193998,1],"lz":10,"lx":30.935407639857935,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"leftPoint":[17.71199859547372,-9.01511632562459,1],"color":"white","lz":10,"foundationId":"bEJsUFdHaD6DHGcx6x8yR6","rotation":[0,0,-0.41015237421866746],"cy":2.2256811797847043,"lx":22.481595010818598,"leftJoints":["arZ3wqpChkyUrckbL7omCG"],"roofId":"gTmk5BL11HKrSyJkFQtskK","textureType":"Wall Texture Default","locked":false,"cx":17.71199859547372,"rightPoint":[17.711998595473712,13.466478685194001,1],"parentId":"bEJsUFdHaD6DHGcx6x8yR6","leftRoofHeight":10,"ly":0.3,"type":"Wall","normal":[0,0,1],"id":"xrxYGVSxLCof2hSDyYDBhi","relativeAngle":1.570796326794897,"selected":false,"rightJoints":["3VxH8hmRUhtWZN2xHFt4SG"],"rightRoofHeight":10,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"foundationId":"bEJsUFdHaD6DHGcx6x8yR6","textureType":"Wall Texture Default","parentId":"bEJsUFdHaD6DHGcx6x8yR6","cy":-9.015116325624591,"type":"Wall","roofId":"gTmk5BL11HKrSyJkFQtskK","locked":false,"selected":false,"relativeAngle":5.742147832930279e-17,"lx":30.935407639857935,"id":"arZ3wqpChkyUrckbL7omCG","rightPoint":[17.711998595473727,-9.015116325624586,1],"normal":[0,0,1],"leftRoofHeight":10,"leftPoint":[-13.223409044384207,-9.015116325624595,1],"cx":2.244294775544758,"ly":0.3,"cz":0,"lz":10,"rightRoofHeight":10,"rotation":[0,0,-0.41015237421866746],"leftJoints":["wv4UgZqFkoaJSym14cGEUi"],"color":"white","rightJoints":["xrxYGVSxLCof2hSDyYDBhi"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rotation":[0,0,-0.41015237421866746],"selected":false,"leftPoint":[-13.223409044384212,13.466478685194005,1],"lx":22.4815950108186,"cz":0,"locked":false,"leftRoofHeight":10,"foundationId":"bEJsUFdHaD6DHGcx6x8yR6","type":"Wall","parentId":"bEJsUFdHaD6DHGcx6x8yR6","rightPoint":[-13.223409044384217,-9.0151163256246,1],"ly":0.3,"leftJoints":["3VxH8hmRUhtWZN2xHFt4SG"],"rightRoofHeight":10,"relativeAngle":-1.5707963267948968,"cx":-13.22340904438421,"id":"wv4UgZqFkoaJSym14cGEUi","roofId":"gTmk5BL11HKrSyJkFQtskK","cy":2.225681179784705,"normal":[0,0,1],"textureType":"Wall Texture Default","rightJoints":["arZ3wqpChkyUrckbL7omCG"],"color":"white","lz":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lx":38.16899134770527,"locked":false,"type":"Foundation","cz":0.5,"ly":29.987807733938208,"solarAbsorberPipe":{},"solarUpdraftTower":{},"solarPowerTower":{},"parentId":"Ground","cx":-9.057642071147427,"rotation":[0,0,-0.41015237421866746],"color":"#808080","id":"bEJsUFdHaD6DHGcx6x8yR6","normal":[0,0,1],"cy":51.32581716422129,"lz":1,"selected":false},{"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","rightRoofHeight":5,"rotation":[0,0,-0.41015237421866746],"leftRoofHeight":5,"lx":19.88616352810249,"selected":false,"rightJoints":["bQ2Kx7puBgpzyzLtLqMSws"],"normal":[0,0,1],"ly":0.3,"cz":0,"color":"white","leftJoints":["oiFAJnXcnAH7zdnComwnZ7"],"roofId":"1qyyipEsGS2s5T9XgP6Hmh","id":"wQJum4dZFQ5ppcaqoirdh1","rightPoint":[-8.228455824549409,10.031147764731335,1],"lz":5,"locked":false,"cx":1.7146259395018353,"textureType":"Wall Texture Default","relativeAngle":3.141592653589793,"parentId":"wBnvyTf1aAJoT1h5Lem3nN","type":"Wall","cy":10.03114776473134,"leftPoint":[11.657707703553081,10.031147764731333,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"locked":false,"cz":0,"roofId":"1qyyipEsGS2s5T9XgP6Hmh","type":"Wall","color":"white","selected":false,"parentId":"wBnvyTf1aAJoT1h5Lem3nN","leftPoint":[11.657707703553083,-7.894846587717293,1],"ly":0.3,"rightRoofHeight":5,"relativeAngle":1.5707963267948972,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","lx":17.92599435244863,"leftRoofHeight":5,"leftJoints":["cEMfGqLjg1Ef23MmrZJMBi"],"id":"oiFAJnXcnAH7zdnComwnZ7","cy":1.0681505885070242,"lz":5,"rightJoints":["wQJum4dZFQ5ppcaqoirdh1"],"textureType":"Wall Texture Default","cx":11.657707703553074,"rightPoint":[11.657707703553076,10.03114776473133,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rotation":[0,0,-0.41015237421866746],"locked":false,"relativeAngle":8.932627134891857e-17,"lz":5,"ly":0.3,"cy":-7.894846587717294,"lx":19.886163528102486,"selected":false,"leftRoofHeight":5,"rightJoints":["oiFAJnXcnAH7zdnComwnZ7"],"roofId":"1qyyipEsGS2s5T9XgP6Hmh","color":"white","normal":[0,0,1],"parentId":"wBnvyTf1aAJoT1h5Lem3nN","rightRoofHeight":5,"cx":1.714625939501836,"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","rightPoint":[11.657707703553083,-7.894846587717293,1],"type":"Wall","leftJoints":["bQ2Kx7puBgpzyzLtLqMSws"],"id":"cEMfGqLjg1Ef23MmrZJMBi","cz":0,"leftPoint":[-8.22845582454941,-7.894846587717293,1],"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","rightRoofHeight":5,"selected":false,"cx":-8.228455824549414,"locked":false,"cz":0,"color":"white","roofId":"1qyyipEsGS2s5T9XgP6Hmh","rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.5707963267948968,"rightJoints":["cEMfGqLjg1Ef23MmrZJMBi"],"type":"Wall","leftJoints":["wQJum4dZFQ5ppcaqoirdh1"],"lx":17.925994352448633,"cy":1.0681505885070197,"leftPoint":[-8.228455824549409,10.031147764731335,1],"id":"bQ2Kx7puBgpzyzLtLqMSws","parentId":"wBnvyTf1aAJoT1h5Lem3nN","ly":0.3,"normal":[0,0,1],"textureType":"Wall Texture Default","rightPoint":[-8.22845582454941,-7.894846587717293,1],"leftRoofHeight":5,"lz":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"id":"wBnvyTf1aAJoT1h5Lem3nN","type":"Foundation","solarAbsorberPipe":{},"ly":25.324222344655617,"cx":-30.225503309474327,"solarPowerTower":{},"cz":0.5,"lz":1,"normal":[0,0,1],"locked":false,"lx":23.992259398375765,"color":"#808080","solarUpdraftTower":{},"cy":64.37240201413404,"selected":false},{"selected":false,"color":"white","rightRoofHeight":5,"ly":0.3,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","id":"9NzKjLTF3oM85YSQpL4gnd","cy":7.999999999999999,"cz":0,"leftJoints":["o6KGNbWFg87od5BX9EpsTo"],"lx":30.5,"leftRoofHeight":5,"showLabel":false,"lineColor":"black","leftPoint":[19,7.999999999999998,0],"locked":false,"lz":5,"cx":3.75,"normal":[0,0,1],"rightJoints":["qVHFnW8AAY4XUoieeiErxH"],"lineWidth":0.2,"rightPoint":[-11.5,8,0],"roofId":"iLELU7fMnA7QkYUmgQBEWM","type":"Wall","foundationId":"5Ccs4YQJG3fyuyHdGw79zD","relativeAngle":3.141592653589793,"rotation":[0,0,-0.41015237421866746],"windows":[],"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rightJoints":["4HqBTHcSgWW5QKhSZyPhns"],"selected":false,"rightRoofHeight":5,"id":"uSo7fsB5ruR2pmb3hS5LJZ","leftPoint":[-11.5,12.499999999999998,0],"leftRoofHeight":5,"lz":5,"relativeAngle":3.141592653589793,"showLabel":false,"lx":12,"cz":0,"textureType":"Wall Texture Default","foundationId":"5Ccs4YQJG3fyuyHdGw79zD","leftJoints":["qVHFnW8AAY4XUoieeiErxH"],"locked":false,"roofId":"iLELU7fMnA7QkYUmgQBEWM","cx":-17.5,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","lineWidth":0.2,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"cy":12.5,"normal":[0,0,1],"type":"Wall","rightPoint":[-23.5,12.5,0],"lineColor":"black","windows":[],"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"locked":false,"lx":15.5,"rightRoofHeight":5,"leftRoofHeight":5,"showLabel":false,"relativeAngle":4.71238898038469,"cy":4.75,"cz":0,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","color":"white","cx":-23.5,"textureType":"Wall Texture Default","leftPoint":[-23.5,12.5,0],"rotation":[0,0,-0.41015237421866746],"lineWidth":0.2,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","ly":0.3,"rightJoints":["susL6EqdzG6nqxMNGZaDXi"],"type":"Wall","roofId":"iLELU7fMnA7QkYUmgQBEWM","lz":5,"lineColor":"black","id":"4HqBTHcSgWW5QKhSZyPhns","normal":[0,0,1],"selected":false,"windows":[],"leftJoints":["uSo7fsB5ruR2pmb3hS5LJZ"],"rightPoint":[-23.5,-3,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"selected":false,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","id":"susL6EqdzG6nqxMNGZaDXi","color":"white","cy":-3.000000000000001,"cz":0,"rotation":[0,0,-0.41015237421866746],"rightPoint":[-17.5,-3,0],"leftRoofHeight":5,"lz":5,"leftJoints":["4HqBTHcSgWW5QKhSZyPhns"],"parentId":"5Ccs4YQJG3fyuyHdGw79zD","normal":[0,0,1],"textureType":"Wall Texture Default","locked":false,"ly":0.3,"lx":6,"leftPoint":[-23.5,-3.0000000000000018,0],"lineColor":"black","lineWidth":0.2,"showLabel":false,"rightJoints":["g6f1sfDxicEvG7uLqaixdo"],"windows":[],"roofId":"iLELU7fMnA7QkYUmgQBEWM","relativeAngle":2.9605947323337506e-16,"cx":-20.5,"type":"Wall","rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"relativeAngle":3.141592653589793,"color":"white","leftPoint":[14.941525004458317,12.56263735597024,1],"cy":12.562637355970242,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","leftRoofHeight":12,"rightPoint":[-13.249437673269998,12.562637355970246,1],"cx":0.8460436655941601,"rotation":[0,0,-0.41015237421866746],"cz":0,"selected":false,"rightJoints":["1RLyYLqhL7EB8W88F1YjMf"],"leftJoints":["8SK72dWsX2KdwBhjqAJrHR"],"normal":[0,0,1],"type":"Wall","lz":12,"roofId":"g8pgyA4zcrzdfdvNphwHQy","textureType":"Wall Texture Default","rightRoofHeight":12,"lx":28.190962677728308,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","ly":0.3,"locked":false,"id":"eAv1PVUtpNQ3MSDZw48MQs","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"normal":[0,0,1],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","rightJoints":["eAv1PVUtpNQ3MSDZw48MQs"],"locked":false,"rightRoofHeight":12,"lx":23.84442368092651,"leftRoofHeight":12,"ly":0.3,"relativeAngle":1.573797223078846,"type":"Wall","foundationId":"9VLFJ7oUEizHpLYBMkGrSR","roofId":"g8pgyA4zcrzdfdvNphwHQy","id":"8SK72dWsX2KdwBhjqAJrHR","cz":0,"color":"white","cx":14.977302271968785,"rotation":[0,0,-0.41015237421866746],"leftJoints":["feUXDC3dk8QN3nPhgvxRs7"],"selected":false,"leftPoint":[15.013079539479259,-11.281678961006573,1],"lz":12,"cy":0.6404791974818389,"rightPoint":[14.941525004458313,12.562637355970246,1],"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"parentId":"9VLFJ7oUEizHpLYBMkGrSR","locked":false,"id":"mJUeyE2zphErZr6GzDs3tZ","color":"white","leftJoints":["1RLyYLqhL7EB8W88F1YjMf"],"rotation":[0,0,-0.41015237421866746],"lz":12,"lx":10.00000000000001,"rightRoofHeight":12,"roofId":"g8pgyA4zcrzdfdvNphwHQy","cz":0,"rightJoints":["j1cSjqWhsVxayuMSQv24u3"],"leftPoint":[-13.48692046052075,-20.78167896100656,1],"selected":false,"textureType":"Wall Texture Default","leftRoofHeight":12,"rightPoint":[-3.4869204605207464,-20.78167896100657,1],"ly":0.3,"relativeAngle":6.2831853071795845,"cy":-20.781678961006566,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","type":"Wall","normal":[0,0,1],"cx":-8.486920460520746,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"rightJoints":["mJUeyE2zphErZr6GzDs3tZ"],"rightPoint":[-13.486920460520746,-20.78167896100657,1],"roofId":"g8pgyA4zcrzdfdvNphwHQy","locked":false,"textureType":"Wall Texture Default","ly":0.3,"rotation":[0,0,-0.41015237421866746],"leftRoofHeight":12,"type":"Wall","normal":[0,0,1],"cy":-4.109520802518161,"rightRoofHeight":12,"lz":12,"selected":false,"leftJoints":["eAv1PVUtpNQ3MSDZw48MQs"],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","relativeAngle":4.705266963855983,"cx":-13.36817906689537,"lx":33.345161998719504,"id":"1RLyYLqhL7EB8W88F1YjMf","cz":0,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","leftPoint":[-13.249437673270002,12.562637355970253,1],"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"selected":false,"solarUpdraftTower":{},"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","solarPowerTower":{},"normal":[0,0,1],"cy":-20.68271396979996,"id":"9VLFJ7oUEizHpLYBMkGrSR","type":"Foundation","cz":0.5,"lz":1,"lx":37.181112111986096,"color":"#808080","cx":-37.24334643439944,"locked":false,"ly":48.16142132853967,"solarAbsorberPipe":{}},{"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":10,"leftJoints":["2EixC2HpxvUhCDPQSQd8uE"],"roofId":"teQS3ohvRHqAbgCQQahyC6","ly":0.3,"leftPoint":[22.429243972447885,21.46242092084928,1],"type":"Wall","normal":[0,0,1],"selected":false,"lz":10,"lx":44.9605119434254,"rightPoint":[-22.53126797097753,21.462420920849283,1],"foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","cx":-0.05101199926482192,"id":"c79sKVUHUztGcC5p3emVv9","color":"white","locked":false,"cy":21.46242092084928,"cz":0,"leftRoofHeight":10,"relativeAngle":3.141592653589793,"parentId":"tjMZKt5v9D1sx6sc6Xyaq2","textureType":"Wall Texture Default","rightJoints":["rAsfTcgvLcTeECYxyTewjt"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"roofId":"teQS3ohvRHqAbgCQQahyC6","cx":22.42924397244788,"lz":10,"cz":0,"rotation":[0,0,-0.41015237421866746],"foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","type":"Wall","relativeAngle":1.5707963267948968,"rightPoint":[22.429243972447868,21.46242092084928,1],"normal":[0,0,1],"id":"2EixC2HpxvUhCDPQSQd8uE","locked":false,"parentId":"tjMZKt5v9D1sx6sc6Xyaq2","leftRoofHeight":10,"lx":42.36942370339931,"rightJoints":["c79sKVUHUztGcC5p3emVv9"],"ly":0.3,"leftJoints":["hxjd42T86KZffMsDx5Lnqd"],"leftPoint":[22.42924397244787,-20.907002782550034,1],"selected":false,"rightRoofHeight":10,"cy":0.27770906914962534,"textureType":"Wall Texture Default","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"cz":0,"locked":false,"leftPoint":[-22.531267970977524,-20.90700278255003,1],"roofId":"teQS3ohvRHqAbgCQQahyC6","lz":10,"rightRoofHeight":10,"leftJoints":["rAsfTcgvLcTeECYxyTewjt"],"relativeAngle":1.5803706520383676e-16,"rotation":[0,0,-0.41015237421866746],"cy":-20.907002782550027,"selected":false,"lx":44.9605119434254,"textureType":"Wall Texture Default","cx":-0.05101199926482192,"leftRoofHeight":10,"type":"Wall","rightPoint":[22.429243972447882,-20.907002782550023,1],"color":"white","ly":0.3,"rightJoints":["2EixC2HpxvUhCDPQSQd8uE"],"id":"hxjd42T86KZffMsDx5Lnqd","parentId":"tjMZKt5v9D1sx6sc6Xyaq2","foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"normal":[0,0,1],"ly":0.3,"locked":false,"cx":-22.531267970977524,"leftRoofHeight":10,"parentId":"tjMZKt5v9D1sx6sc6Xyaq2","color":"white","relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","selected":false,"type":"Wall","lz":10,"rightRoofHeight":10,"id":"rAsfTcgvLcTeECYxyTewjt","cz":0,"cy":0.27770906914962445,"rightPoint":[-22.53126797097753,-20.90700278255004,1],"leftJoints":["c79sKVUHUztGcC5p3emVv9"],"rightJoints":["hxjd42T86KZffMsDx5Lnqd"],"leftPoint":[-22.53126797097753,21.462420920849283,1],"rotation":[0,0,-0.41015237421866746],"foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","roofId":"teQS3ohvRHqAbgCQQahyC6","lx":42.36942370339932,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"cz":0.5,"id":"tjMZKt5v9D1sx6sc6Xyaq2","lx":46.90554216771846,"cy":18.6131690650482,"locked":false,"color":"#808080","solarPowerTower":{},"selected":false,"rotation":[0,0,-0.41015237421866746],"lz":1,"parentId":"Ground","ly":43.713031743362755,"cx":59.64808106801135,"solarUpdraftTower":{},"type":"Foundation","solarAbsorberPipe":{},"normal":[0,0,1]},{"leftJoints":["1nApY26ge55fxfDJGTDRg7"],"color":"white","relativeAngle":3.141592653589793,"normal":[0,0,1],"selected":false,"leftPoint":[23.979857556057137,22.372040279665153,1],"cy":22.37204027966516,"cx":0.07009613256013125,"leftRoofHeight":10,"rightPoint":[-23.83966529093686,22.372040279665164,1],"lz":10,"foundationId":"2LZNQJZFPrCxZzv5NuwumV","cz":0,"rightJoints":["rZvSe3ehuF6gYShWHjg7Kt"],"ly":0.3,"locked":false,"parentId":"2LZNQJZFPrCxZzv5NuwumV","rightRoofHeight":10,"roofId":"9TF7gEynqtnsWJGidoBUNq","id":"hcTBY8guDEpwEg5jtYtD3H","rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","lx":47.81952284699399,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rotation":[0,0,-0.41015237421866746],"roofId":"9TF7gEynqtnsWJGidoBUNq","selected":false,"foundationId":"2LZNQJZFPrCxZzv5NuwumV","locked":false,"rightRoofHeight":10,"textureType":"Wall Texture Default","parentId":"2LZNQJZFPrCxZzv5NuwumV","leftRoofHeight":10,"rightPoint":[23.979857556057127,22.37204027966517,1],"relativeAngle":1.5707963267948966,"rightJoints":["hcTBY8guDEpwEg5jtYtD3H"],"id":"1nApY26ge55fxfDJGTDRg7","lx":42.78808681818175,"cy":0.9779968705742945,"cz":0,"leftJoints":["4gP6SGPKJj7CUqEnRFmQ9x"],"color":"white","leftPoint":[23.979857556057127,-20.41604653851659,1],"type":"Wall","normal":[0,0,1],"ly":0.3,"cx":23.979857556057123,"lz":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"cz":0,"id":"4gP6SGPKJj7CUqEnRFmQ9x","cy":-20.416046538516596,"color":"white","locked":false,"relativeAngle":3.714710506593678e-16,"leftJoints":["rZvSe3ehuF6gYShWHjg7Kt"],"rightPoint":[23.979857556057144,-20.41604653851658,1],"lx":47.819522846994,"selected":false,"ly":0.3,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"parentId":"2LZNQJZFPrCxZzv5NuwumV","foundationId":"2LZNQJZFPrCxZzv5NuwumV","cx":0.07009613256014546,"lz":10,"leftRoofHeight":10,"type":"Wall","rightJoints":["1nApY26ge55fxfDJGTDRg7"],"roofId":"9TF7gEynqtnsWJGidoBUNq","leftPoint":[-23.83966529093686,-20.416046538516596,1],"rightRoofHeight":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lz":10,"normal":[0,0,1],"locked":false,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":10,"rightPoint":[-23.839665290936864,-20.416046538516596,1],"leftJoints":["hcTBY8guDEpwEg5jtYtD3H"],"roofId":"9TF7gEynqtnsWJGidoBUNq","cx":-23.839665290936868,"rightJoints":["4gP6SGPKJj7CUqEnRFmQ9x"],"leftPoint":[-23.83966529093686,22.372040279665164,1],"cy":0.9779968705742856,"relativeAngle":-1.5707963267948968,"id":"rZvSe3ehuF6gYShWHjg7Kt","ly":0.3,"selected":false,"parentId":"2LZNQJZFPrCxZzv5NuwumV","color":"white","lx":42.78808681818176,"textureType":"Wall Texture Default","type":"Wall","foundationId":"2LZNQJZFPrCxZzv5NuwumV","cz":0,"leftRoofHeight":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"locked":false,"solarAbsorberPipe":{},"rotation":[0,0,-0.41015237421866746],"cz":0.5,"color":"#808080","lx":52.581175557196865,"solarUpdraftTower":{},"ly":46.345317346771616,"lz":1,"id":"2LZNQJZFPrCxZzv5NuwumV","selected":false,"type":"Foundation","cy":-66.29767782769949,"solarPowerTower":{},"normal":[0,0,1],"cx":24.045330033541646,"parentId":"Ground"},{"textureType":"Wall Texture Default","lineColor":"black","leftPoint":[-3.4869204605207464,-20.78167896100657,1],"ly":0.3,"rightRoofHeight":12,"roofId":"g8pgyA4zcrzdfdvNphwHQy","lz":12,"rightPoint":[8.51307953947926,-14.281678961006572,1],"lineWidth":0.2,"relativeAngle":0.4964227534048815,"locked":false,"type":"Wall","cx":2.5130795394792607,"windows":[],"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","color":"white","id":"j1cSjqWhsVxayuMSQv24u3","showLabel":false,"selected":false,"lx":13.647344063956183,"normal":[0,0,1],"cz":0,"cy":-17.531678961006573,"leftJoints":["mJUeyE2zphErZr6GzDs3tZ"],"leftRoofHeight":12,"rotation":[0,0,-0.41015237421866746],"rightJoints":["svVfgRXxxLmkheyww2W4ad"],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"leftPoint":[8.513079539479259,-11.281678961006572,1],"roofId":"g8pgyA4zcrzdfdvNphwHQy","cz":0,"id":"feUXDC3dk8QN3nPhgvxRs7","selected":false,"textureType":"Wall Texture Default","cx":11.763079539479257,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","rightPoint":[15.013079539479259,-11.281678961006573,1],"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","leftRoofHeight":12,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"type":"Wall","lz":12,"leftJoints":["svVfgRXxxLmkheyww2W4ad"],"lineColor":"black","windows":[],"cy":-11.28167896100657,"normal":[0,0,1],"rightJoints":["8SK72dWsX2KdwBhjqAJrHR"],"relativeAngle":0,"lineWidth":0.2,"rightRoofHeight":12,"color":"white","showLabel":false,"locked":false,"lx":6.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"ly":0.3,"textureType":"Wall Texture Default","foundationId":"9VLFJ7oUEizHpLYBMkGrSR","roofId":"g8pgyA4zcrzdfdvNphwHQy","relativeAngle":1.5707963267948974,"lineWidth":0.2,"selected":false,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","rotation":[0,0,-0.41015237421866746],"windows":[],"lx":3.000000000000001,"showLabel":false,"type":"Wall","color":"white","lineColor":"black","normal":[0,0,1],"leftRoofHeight":12,"rightJoints":["feUXDC3dk8QN3nPhgvxRs7"],"lz":12,"locked":false,"cx":8.513079539479259,"cz":0,"cy":-12.78167896100657,"rightPoint":[8.513079539479259,-11.281678961006572,1],"rightRoofHeight":12,"leftJoints":["j1cSjqWhsVxayuMSQv24u3"],"id":"svVfgRXxxLmkheyww2W4ad","leftPoint":[8.51307953947926,-14.281678961006572,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"type":"Wall","color":"white","relativeAngle":3.1415926535897927,"normal":[0,0,1],"locked":false,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":5,"lx":8.873370500562523,"roofId":"iCAiZhiTVrLLqoQWH1g8xu","rightPoint":[-4.33188166169194,11.821078427256497,0],"id":"1k4PTfybuAQ33E2nttLT4d","rightJoints":["dqGGsMEnQRvAtVj8JUXBJ1"],"lz":5,"ly":0.3,"leftRoofHeight":5,"cx":0.10480358858932037,"cy":11.821078427256495,"leftPoint":[4.541488838870581,11.821078427256491,0],"cz":0,"selected":false,"textureType":"Wall Texture Default","parentId":"m4iUcU4yAYwkvkodEmkEet","foundationId":"m4iUcU4yAYwkvkodEmkEet","leftJoints":["annVBiZ5xysQxyv34DuQgv"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cz":0,"foundationId":"m4iUcU4yAYwkvkodEmkEet","textureType":"Wall Texture Default","leftRoofHeight":5,"type":"Wall","id":"annVBiZ5xysQxyv34DuQgv","rotation":[0,0,-0.41015237421866746],"selected":false,"color":"white","cy":-0.7092647056353876,"cx":4.541488838870581,"ly":0.3,"parentId":"m4iUcU4yAYwkvkodEmkEet","normal":[0,0,1],"roofId":"iCAiZhiTVrLLqoQWH1g8xu","locked":false,"rightRoofHeight":5,"lz":5,"rightPoint":[4.541488838870581,11.821078427256495,0],"leftJoints":["fE5GSES3t1e72zkQ5eaMtN"],"rightJoints":["1k4PTfybuAQ33E2nttLT4d"],"leftPoint":[4.541488838870581,-13.23960783852727,0],"relativeAngle":1.5707963267948966,"lx":25.060686265783765,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"relativeAngle":4.003792784912203e-16,"cy":-13.239607838527268,"rightPoint":[4.541488838870582,-13.239607838527267,0],"locked":false,"rightRoofHeight":5,"id":"fE5GSES3t1e72zkQ5eaMtN","leftRoofHeight":5,"leftJoints":["dqGGsMEnQRvAtVj8JUXBJ1"],"rightJoints":["annVBiZ5xysQxyv34DuQgv"],"type":"Wall","cx":0.10480358858932082,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"leftPoint":[-4.33188166169194,-13.23960783852727,0],"foundationId":"m4iUcU4yAYwkvkodEmkEet","ly":0.3,"lx":8.873370500562523,"lz":5,"roofId":"iCAiZhiTVrLLqoQWH1g8xu","parentId":"m4iUcU4yAYwkvkodEmkEet","color":"white","selected":false,"textureType":"Wall Texture Default","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftPoint":[-4.33188166169194,11.821078427256497,0],"rightRoofHeight":5,"cz":0,"cy":-0.7092647056353867,"foundationId":"m4iUcU4yAYwkvkodEmkEet","color":"white","rotation":[0,0,-0.41015237421866746],"roofId":"iCAiZhiTVrLLqoQWH1g8xu","leftJoints":["1k4PTfybuAQ33E2nttLT4d"],"lz":5,"textureType":"Wall Texture Default","lx":25.060686265783765,"leftRoofHeight":5,"cx":-4.33188166169194,"locked":false,"id":"dqGGsMEnQRvAtVj8JUXBJ1","selected":false,"parentId":"m4iUcU4yAYwkvkodEmkEet","rightPoint":[-4.33188166169194,-13.23960783852727,0],"normal":[0,0,1],"ly":0.3,"type":"Wall","relativeAngle":-1.5707963267948966,"rightJoints":["fE5GSES3t1e72zkQ5eaMtN"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rotation":[0,0,-0.41015237421866746],"selected":false,"lx":12.02609775935612,"parentId":"Ground","solarAbsorberPipe":{},"solarPowerTower":{},"normal":[0,0,1],"cz":0.5,"locked":false,"lz":1,"ly":39.808565196188674,"type":"Foundation","solarUpdraftTower":{},"cx":-53.11572356309672,"id":"m4iUcU4yAYwkvkodEmkEet","color":"#808080","cy":-13.056870681152052},{"cx":-2.4577065861477623,"leftPoint":[4.807994986966596,2.7315947133271403,0],"leftJoints":["cTujmRqECeyH6sGwqfoDEM"],"type":"Wall","id":"91sCr2ydHgygQWRuaJ5N1C","relativeAngle":-3.141592653589793,"cy":2.7315947133271394,"ly":0.3,"parentId":"bkH7VRrzUTdvxfSm8xVMfT","rotation":[0,0,-0.41015237421866746],"locked":false,"lx":14.531403146228717,"rightPoint":[-9.72340815926212,2.7315947133271385,0],"rightJoints":["jhMUxbjEpDbcfFhgvBAFQj"],"normal":[0,0,1],"textureType":"Wall Texture Default","selected":false,"cz":0,"roofId":"vRe6nzFrDCWVtSCu332MH4","foundationId":"bkH7VRrzUTdvxfSm8xVMfT","leftRoofHeight":16,"color":"white","lz":16,"rightRoofHeight":16,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"parentId":"bkH7VRrzUTdvxfSm8xVMfT","selected":false,"rightJoints":["91sCr2ydHgygQWRuaJ5N1C"],"color":"white","lz":16,"leftRoofHeight":16,"roofId":"vRe6nzFrDCWVtSCu332MH4","rightPoint":[4.807994986966594,2.7315947133271434,0],"lx":5.477642221583295,"ly":0.3,"type":"Wall","centerRoofHeight":[0,17.3393317550628],"foundationId":"bkH7VRrzUTdvxfSm8xVMfT","leftPoint":[4.807994986966587,-2.746047508256152,0],"leftJoints":["9qVmVQPuu4fH6aAQqyfjRg"],"id":"cTujmRqECeyH6sGwqfoDEM","textureType":"Wall Texture Default","locked":false,"cy":-0.007226397464504375,"cz":0,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"relativeAngle":1.5707963267948952,"rightRoofHeight":16,"cx":4.80799498696659,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"type":"Wall","leftPoint":[-9.723408159262116,-2.7460475082561513,0],"selected":false,"foundationId":"bkH7VRrzUTdvxfSm8xVMfT","color":"white","normal":[0,0,1],"leftRoofHeight":16,"rotation":[0,0,-0.41015237421866746],"leftJoints":["jhMUxbjEpDbcfFhgvBAFQj"],"rightRoofHeight":16,"parentId":"bkH7VRrzUTdvxfSm8xVMfT","roofId":"vRe6nzFrDCWVtSCu332MH4","locked":false,"id":"9qVmVQPuu4fH6aAQqyfjRg","rightJoints":["cTujmRqECeyH6sGwqfoDEM"],"textureType":"Wall Texture Default","cx":-2.4577065861477636,"lz":16,"cz":0,"relativeAngle":-1.5280327900245335e-16,"lx":14.531403146228705,"rightPoint":[4.807994986966588,-2.7460475082561535,0],"cy":-2.7460475082561526,"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"lz":16,"cy":-0.007226397464506373,"selected":false,"id":"jhMUxbjEpDbcfFhgvBAFQj","roofId":"vRe6nzFrDCWVtSCu332MH4","normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"type":"Wall","parentId":"bkH7VRrzUTdvxfSm8xVMfT","color":"white","textureType":"Wall Texture Default","cz":0,"rightJoints":["9qVmVQPuu4fH6aAQqyfjRg"],"leftPoint":[-9.72340815926212,2.7315947133271385,0],"leftJoints":["91sCr2ydHgygQWRuaJ5N1C"],"lx":5.47764222158329,"cx":-9.723408159262117,"relativeAngle":-1.5707963267948957,"ly":0.3,"leftRoofHeight":16,"foundationId":"bkH7VRrzUTdvxfSm8xVMfT","centerRoofHeight":[0,17.3393317550628],"rightPoint":[-9.723408159262116,-2.7460475082561513,0],"rightRoofHeight":16,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"cz":0.5,"lz":1,"cx":78.75570287833209,"selected":false,"color":"#808080","solarPowerTower":{},"cy":10.912053869608645,"solarUpdraftTower":{},"id":"bkH7VRrzUTdvxfSm8xVMfT","normal":[0,0,1],"parentId":"Ground","ly":5.705242176061485,"type":"Foundation","rotation":[0,0,-0.41015237421866746],"solarAbsorberPipe":{},"lx":20.778562085655192,"locked":false},{"rotation":[0,0,-0.41015237421866746],"selected":false,"normal":[0,0,1],"color":"white","rightRoofHeight":11,"type":"Wall","rightPoint":[-10.286622985342673,4.983310762184353,0],"leftRoofHeight":11,"cz":0,"textureType":"Wall Texture Default","locked":false,"parentId":"qJBTbMiP4tUMstkk4bQqAp","cx":0.8987861583692425,"id":"oNZPm4ForjT1jLCRGXT8ae","leftPoint":[12.084195302081158,4.983310762184358,0],"foundationId":"qJBTbMiP4tUMstkk4bQqAp","lz":11,"cy":4.983310762184356,"roofId":"tLNDomb3SubspErPERhojH","ly":0.3,"lx":22.37081828742383,"rightJoints":["twTFceoz8nr7JM6esRsvns"],"leftJoints":["8Pn1CKwtmisKkjic3nAhPK"],"relativeAngle":-3.141592653589793,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lz":11,"leftRoofHeight":11,"parentId":"qJBTbMiP4tUMstkk4bQqAp","rotation":[0,0,-0.41015237421866746],"lx":9.215971205723465,"relativeAngle":1.5707963267948954,"locked":false,"rightPoint":[12.084195302081158,4.98331076218436,0],"roofId":"tLNDomb3SubspErPERhojH","cy":0.3753251593226281,"color":"white","rightRoofHeight":11,"type":"Wall","leftPoint":[12.084195302081147,-4.232660443539104,0],"normal":[0,0,1],"foundationId":"qJBTbMiP4tUMstkk4bQqAp","id":"8Pn1CKwtmisKkjic3nAhPK","centerRoofHeight":[0,12.111126896848333],"selected":false,"ly":0.3,"leftJoints":["2nMWmvd9mtkAxjJG8mCTx2"],"cz":0,"rightJoints":["oNZPm4ForjT1jLCRGXT8ae"],"textureType":"Wall Texture Default","cx":12.084195302081152,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"locked":false,"rightJoints":["8Pn1CKwtmisKkjic3nAhPK"],"leftPoint":[-10.286622985342662,-4.2326604435391,0],"rightRoofHeight":11,"foundationId":"qJBTbMiP4tUMstkk4bQqAp","type":"Wall","selected":false,"roofId":"tLNDomb3SubspErPERhojH","rightPoint":[12.084195302081158,-4.2326604435391,0],"leftRoofHeight":11,"ly":0.3,"cx":0.8987861583692478,"lz":11,"leftJoints":["twTFceoz8nr7JM6esRsvns"],"relativeAngle":0,"normal":[0,0,1],"textureType":"Wall Texture Default","color":"white","parentId":"qJBTbMiP4tUMstkk4bQqAp","cy":-4.2326604435391,"lx":22.37081828742382,"cz":0,"rotation":[0,0,-0.41015237421866746],"id":"2nMWmvd9mtkAxjJG8mCTx2","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"ly":0.3,"leftPoint":[-10.286622985342673,4.983310762184353,0],"cx":-10.286622985342667,"normal":[0,0,1],"leftJoints":["oNZPm4ForjT1jLCRGXT8ae"],"cy":0.3753251593226268,"lx":9.215971205723452,"rightPoint":[-10.286622985342662,-4.2326604435391,0],"locked":false,"cz":0,"lz":11,"rotation":[0,0,-0.41015237421866746],"centerRoofHeight":[0,12.111126896848333],"type":"Wall","foundationId":"qJBTbMiP4tUMstkk4bQqAp","leftRoofHeight":11,"roofId":"tLNDomb3SubspErPERhojH","color":"white","selected":false,"id":"twTFceoz8nr7JM6esRsvns","rightJoints":["2nMWmvd9mtkAxjJG8mCTx2"],"parentId":"qJBTbMiP4tUMstkk4bQqAp","rightRoofHeight":11,"textureType":"Wall Texture Default","relativeAngle":-1.5707963267948954,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"solarPowerTower":{},"selected":false,"normal":[0,0,1],"lx":29.0500894298776,"id":"qJBTbMiP4tUMstkk4bQqAp","color":"#808080","cz":0.5,"solarUpdraftTower":{},"lz":1,"parentId":"Ground","locked":false,"ly":13.367138022352988,"cy":28.71057712188597,"solarAbsorberPipe":{},"rotation":[0,0,-0.41015237421866746],"type":"Foundation","cx":36.57481860706345},{"ly":0.3,"cy":2.971894027777658,"textureType":"Wall Texture Default","selected":false,"leftPoint":[12.422123880582443,2.9718940277776653,1],"rightJoints":["nNQo9acqRqKRWfE4a1RvLy"],"normal":[0,0,1],"type":"Wall","foundationId":"64tiQZ7Po62MhdtE1e44n9","cz":0,"rotation":[0,0,-0.41015237421866746],"id":"5QyDHSHQi5g83yTByESY7g","color":"white","rightPoint":[7.6013879231388755,2.9718940277776573,1],"locked":false,"lz":13,"cx":10.011755901860653,"lx":4.8207359574435635,"relativeAngle":-3.1415926535897922,"leftJoints":["2DDFqyaAZAAuWTVgy7UTYL"],"parentId":"64tiQZ7Po62MhdtE1e44n9","roofId":"oTjPo4r99EKfdasnxT3n5a","leftRoofHeight":13,"rightRoofHeight":13,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"parentId":"64tiQZ7Po62MhdtE1e44n9","leftPoint":[12.422123880582435,-2.1178940951050267,1],"leftJoints":["7JuGqBdByKra32qVf2wuMP"],"cz":0,"locked":false,"ly":0.3,"foundationId":"64tiQZ7Po62MhdtE1e44n9","color":"white","rotation":[0,0,-0.41015237421866746],"selected":false,"lz":13,"cy":0.42699996633631887,"leftRoofHeight":13,"cx":12.422123880582438,"lx":5.089788122882689,"normal":[0,0,1],"relativeAngle":1.570796326794896,"roofId":"oTjPo4r99EKfdasnxT3n5a","rightJoints":["5QyDHSHQi5g83yTByESY7g"],"type":"Wall","rightRoofHeight":13,"rightPoint":[12.422123880582443,2.9718940277776653,1],"id":"2DDFqyaAZAAuWTVgy7UTYL","textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"foundationId":"64tiQZ7Po62MhdtE1e44n9","id":"7JuGqBdByKra32qVf2wuMP","textureType":"Wall Texture Default","rightPoint":[12.422123880582431,-2.1178940951050196,1],"lx":4.820735957443555,"leftRoofHeight":13,"roofId":"oTjPo4r99EKfdasnxT3n5a","ly":0.3,"selected":false,"lz":13,"leftJoints":["nNQo9acqRqKRWfE4a1RvLy"],"cx":10.011755901860655,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":13,"rightJoints":["2DDFqyaAZAAuWTVgy7UTYL"],"leftPoint":[7.601387923138878,-2.1178940951050227,1],"relativeAngle":6.448443757120744e-16,"cy":-2.117894095105022,"locked":false,"normal":[0,0,1],"color":"white","parentId":"64tiQZ7Po62MhdtE1e44n9","cz":0,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"id":"nNQo9acqRqKRWfE4a1RvLy","foundationId":"64tiQZ7Po62MhdtE1e44n9","textureType":"Wall Texture Default","roofId":"oTjPo4r99EKfdasnxT3n5a","rotation":[0,0,-0.41015237421866746],"leftRoofHeight":13,"color":"white","parentId":"64tiQZ7Po62MhdtE1e44n9","ly":0.3,"cz":0,"relativeAngle":-1.5707963267948963,"leftPoint":[7.6013879231388755,2.9718940277776573,1],"rightRoofHeight":13,"cx":7.601387923138877,"normal":[0,0,1],"rightJoints":["7JuGqBdByKra32qVf2wuMP"],"type":"Wall","lx":5.089788122882682,"rightPoint":[7.601387923138878,-2.1178940951050227,1],"selected":false,"locked":false,"lz":13,"leftJoints":["5QyDHSHQi5g83yTByESY7g"],"cy":0.4269999663363171,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"selected":false,"ly":6.942959260815169,"parentId":"Ground","lz":1,"id":"64tiQZ7Po62MhdtE1e44n9","solarUpdraftTower":{},"cy":28.3064695776253,"locked":false,"color":"#808080","cx":24.870540041807864,"lx":25.896215586399297,"rotation":[0,0,-0.41015237421866746],"solarPowerTower":{},"normal":[0,0,1],"solarAbsorberPipe":{},"type":"Foundation","cz":0.5},{"color":"white","lx":6.102875967687821,"lz":11,"rightJoints":["ufN8sfE783eMNceqzrR88z"],"cz":0,"relativeAngle":-3.1415926535897927,"cy":3.4313212286858255,"textureType":"Wall Texture Default","roofId":"fS4RCk5GfqcPBkrsfQqupD","leftJoints":["pzCu78KeKhhbMuf9rgBh5L"],"selected":false,"leftPoint":[3.0844752908601185,3.4313212286858272,0],"foundationId":"kqR5p2bajX4NMTBq55qbCM","locked":false,"parentId":"kqR5p2bajX4NMTBq55qbCM","ly":0.3,"id":"4CXQZA8oGxMYG5uuTdJH4z","rightPoint":[-3.018400676827702,3.431321228685824,0],"cx":0.03303730701620822,"leftRoofHeight":11,"normal":[0,0,1],"rightRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"leftPoint":[3.0844752908601167,-6.300430996731014,0],"cx":3.0844752908601176,"normal":[0,0,1],"foundationId":"kqR5p2bajX4NMTBq55qbCM","cy":-1.4345548840225932,"color":"white","id":"pzCu78KeKhhbMuf9rgBh5L","rightRoofHeight":11,"cz":0,"rightPoint":[3.0844752908601185,3.4313212286858272,0],"centerRoofHeight":[-0.5,11],"rotation":[0,0,-0.41015237421866746],"lz":11,"relativeAngle":1.5707963267948963,"leftRoofHeight":11,"textureType":"Wall Texture Default","selected":false,"locked":false,"ly":0.3,"parentId":"kqR5p2bajX4NMTBq55qbCM","type":"Wall","roofId":"fS4RCk5GfqcPBkrsfQqupD","leftJoints":["kQ44ExCwR71BEyjwkSCp38"],"rightJoints":["4CXQZA8oGxMYG5uuTdJH4z"],"lx":9.731752225416841,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"foundationId":"kqR5p2bajX4NMTBq55qbCM","textureType":"Wall Texture Default","relativeAngle":-5.821376180034847e-16,"rightPoint":[3.0844752908601167,-6.300430996731014,0],"id":"kQ44ExCwR71BEyjwkSCp38","normal":[0,0,1],"roofId":"fS4RCk5GfqcPBkrsfQqupD","rightJoints":["pzCu78KeKhhbMuf9rgBh5L"],"rightRoofHeight":11,"cy":-6.300430996731012,"lx":6.102875967687822,"selected":false,"color":"white","ly":0.3,"leftJoints":["ufN8sfE783eMNceqzrR88z"],"cz":0,"leftPoint":[-3.018400676827706,-6.30043099673101,0],"parentId":"kqR5p2bajX4NMTBq55qbCM","leftRoofHeight":11,"type":"Wall","lz":11,"rotation":[0,0,-0.41015237421866746],"cx":0.03303730701620533,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cz":0,"lz":11,"rightPoint":[-3.018400676827706,-6.30043099673101,0],"parentId":"kqR5p2bajX4NMTBq55qbCM","rightJoints":["kQ44ExCwR71BEyjwkSCp38"],"cx":-3.018400676827704,"leftRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.5707963267948972,"selected":false,"cy":-1.434554884022593,"foundationId":"kqR5p2bajX4NMTBq55qbCM","color":"white","rightRoofHeight":11,"locked":false,"leftJoints":["4CXQZA8oGxMYG5uuTdJH4z"],"lx":9.731752225416834,"id":"ufN8sfE783eMNceqzrR88z","normal":[0,0,1],"centerRoofHeight":[0.5,11],"leftPoint":[-3.018400676827702,3.431321228685824,0],"textureType":"Wall Texture Default","ly":0.3,"type":"Wall","roofId":"fS4RCk5GfqcPBkrsfQqupD","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Foundation","ly":13.304430432789896,"selected":false,"color":"#808080","solarPowerTower":{},"locked":false,"normal":[0,0,1],"cy":32.738819911856226,"cz":0.5,"solarAbsorberPipe":{},"id":"kqR5p2bajX4NMTBq55qbCM","cx":72.31692383934994,"rotation":[0,0,-0.41015237421866746],"lx":7.252592961439527,"parentId":"Ground","solarUpdraftTower":{},"lz":1},{"rightJoints":["9YnLeekp8YrBjSwNEVxSmp"],"roofId":"wrKEiNvyDQopU6C5MqvRMM","cy":7.3527391531452935,"leftPoint":[5.468301535132202,7.352739153145294,1],"id":"2qkVxdRDddbpLN4sHJK2gE","relativeAngle":3.141592653589793,"leftRoofHeight":4,"parentId":"98vBSiAe7BeqTZRNu482vh","rightRoofHeight":4,"cx":-0.9755536194629697,"leftJoints":["gz2Gm7sAdANkmLzo5wFbxx"],"color":"white","lz":4,"rotation":[0,0,-0.41015237421866746],"rightPoint":[-7.419408774058143,7.352739153145295,1],"lx":12.887710309190346,"foundationId":"98vBSiAe7BeqTZRNu482vh","normal":[0,0,1],"type":"Wall","locked":false,"selected":false,"cz":0,"ly":0.3,"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"cz":0,"roofId":"wrKEiNvyDQopU6C5MqvRMM","leftPoint":[5.468301535132206,-7.370642577725551,1],"centerRoofHeight":[0,6],"foundationId":"98vBSiAe7BeqTZRNu482vh","id":"gz2Gm7sAdANkmLzo5wFbxx","normal":[0,0,1],"rightJoints":["2qkVxdRDddbpLN4sHJK2gE"],"type":"Wall","leftRoofHeight":4,"textureType":"Wall Texture Default","lz":4,"relativeAngle":1.5707963267948963,"selected":false,"rightPoint":[5.4683015351322,7.352739153145298,1],"cy":-0.008951712290128144,"locked":false,"leftJoints":["vha1dDK5ppjp6f9bgr45uq"],"color":"white","cx":5.468301535132204,"rightRoofHeight":4,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"parentId":"98vBSiAe7BeqTZRNu482vh","lx":14.723381730870852,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"leftJoints":["9YnLeekp8YrBjSwNEVxSmp"],"id":"vha1dDK5ppjp6f9bgr45uq","relativeAngle":2.756667859198411e-16,"cz":0,"color":"white","leftRoofHeight":4,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"lz":4,"textureType":"Wall Texture Default","cy":-7.370642577725552,"leftPoint":[-7.4194087740581365,-7.370642577725553,1],"locked":false,"cx":-0.9755536194629646,"rightJoints":["gz2Gm7sAdANkmLzo5wFbxx"],"parentId":"98vBSiAe7BeqTZRNu482vh","roofId":"wrKEiNvyDQopU6C5MqvRMM","normal":[0,0,1],"type":"Wall","selected":false,"rightPoint":[5.468301535132206,-7.370642577725551,1],"rightRoofHeight":4,"lx":12.887710309190334,"foundationId":"98vBSiAe7BeqTZRNu482vh","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.5707963267948961,"centerRoofHeight":[0,6],"foundationId":"98vBSiAe7BeqTZRNu482vh","ly":0.3,"cx":-7.419408774058138,"textureType":"Wall Texture Default","lz":4,"cy":-0.008951712290129699,"leftPoint":[-7.419408774058143,7.352739153145295,1],"id":"9YnLeekp8YrBjSwNEVxSmp","cz":0,"color":"white","rightPoint":[-7.4194087740581365,-7.370642577725553,1],"lx":14.723381730870852,"roofId":"wrKEiNvyDQopU6C5MqvRMM","rightRoofHeight":4,"normal":[0,0,1],"leftJoints":["2qkVxdRDddbpLN4sHJK2gE"],"rightJoints":["vha1dDK5ppjp6f9bgr45uq"],"type":"Wall","locked":false,"selected":false,"parentId":"98vBSiAe7BeqTZRNu482vh","leftRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"cz":0.5,"type":"Foundation","color":"#808080","id":"98vBSiAe7BeqTZRNu482vh","solarAbsorberPipe":{},"solarPowerTower":{},"rotation":[0,0,-0.41015237421866746],"lx":15.543629167882932,"cy":-34.03935192999712,"cx":66.44654466726774,"normal":[0,0,1],"locked":false,"parentId":"Ground","solarUpdraftTower":{},"lz":1,"selected":false,"ly":16.051182282542253},{"relativeAngle":-3.141592653589792,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":10,"id":"7zFHG6rEsyAEeiBjZ3Fqiv","cz":0,"roofId":"52yUcWyJUbmGw2PC5d5KiK","textureType":"Wall Texture Default","cy":2.3029070359201342,"cx":-2.061194479172505,"lx":4.563843535322344,"leftPoint":[0.2207272884886666,2.302907035920138,0],"color":"white","locked":false,"leftRoofHeight":10,"selected":false,"normal":[0,0,1],"lz":10,"type":"Wall","rightPoint":[-4.343116246833677,2.3029070359201307,0],"parentId":"tafet8SHZ3Nd8kXyfeZ9FR","ly":0.3,"rightJoints":["sfm78zxYm2PZeqMiLJ7sRS"],"leftJoints":["qEu4R9jBDYekHJdsyGPkHu"],"foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rightRoofHeight":10,"cx":0.2207272884886636,"lz":10,"normal":[0,0,1],"relativeAngle":1.5707963267948952,"locked":false,"cy":0.09783532837621656,"lx":4.410143415087843,"rightJoints":["7zFHG6rEsyAEeiBjZ3Fqiv"],"type":"Wall","selected":false,"ly":0.3,"leftRoofHeight":10,"cz":0,"textureType":"Wall Texture Default","id":"qEu4R9jBDYekHJdsyGPkHu","rotation":[0,0,-0.41015237421866746],"rightPoint":[0.2207272884886666,2.302907035920138,0],"parentId":"tafet8SHZ3Nd8kXyfeZ9FR","leftPoint":[0.2207272884886606,-2.1072363791677047,0],"foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","leftJoints":["k13k8dUZo1jLk9Pubbz3Yu"],"color":"white","roofId":"52yUcWyJUbmGw2PC5d5KiK","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rightJoints":["qEu4R9jBDYekHJdsyGPkHu"],"leftPoint":[-4.34311624683366,-2.1072363791677042,0],"rightPoint":[0.2207272884886606,-2.1072363791677047,0],"rightRoofHeight":10,"id":"k13k8dUZo1jLk9Pubbz3Yu","ly":0.3,"leftRoofHeight":10,"cz":0,"leftJoints":["sfm78zxYm2PZeqMiLJ7sRS"],"lx":4.563843535322321,"color":"white","locked":false,"parentId":"tafet8SHZ3Nd8kXyfeZ9FR","foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","textureType":"Wall Texture Default","type":"Wall","selected":false,"relativeAngle":-9.730596730869277e-17,"rotation":[0,0,-0.41015237421866746],"roofId":"52yUcWyJUbmGw2PC5d5KiK","cy":-2.1072363791677047,"normal":[0,0,1],"cx":-2.0611944791725,"lz":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"leftRoofHeight":10,"relativeAngle":-1.5707963267948928,"cx":-4.343116246833668,"rightRoofHeight":10,"ly":0.3,"parentId":"tafet8SHZ3Nd8kXyfeZ9FR","locked":false,"roofId":"52yUcWyJUbmGw2PC5d5KiK","leftJoints":["7zFHG6rEsyAEeiBjZ3Fqiv"],"leftPoint":[-4.343116246833677,2.3029070359201307,0],"lx":4.410143415087835,"rightJoints":["k13k8dUZo1jLk9Pubbz3Yu"],"type":"Wall","lz":10,"foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","color":"white","selected":false,"textureType":"Wall Texture Default","rightPoint":[-4.34311624683366,-2.1072363791677042,0],"rotation":[0,0,-0.41015237421866746],"cz":0,"id":"sfm78zxYm2PZeqMiLJ7sRS","normal":[0,0,1],"cy":0.09783532837621323,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"solarUpdraftTower":{},"solarAbsorberPipe":{},"color":"#808080","ly":4.607404636305792,"cy":-35.24749355392174,"locked":false,"type":"Foundation","cx":69.68931082715157,"cz":0.5,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"solarPowerTower":{},"selected":false,"parentId":"Ground","lx":8.9358229854864,"id":"tafet8SHZ3Nd8kXyfeZ9FR","lz":1},{"color":"white","relativeAngle":3.141592653589793,"rightRoofHeight":5.25,"id":"vG7sqxy4RdGecDZ8BgqUDU","lx":9.337227070632437,"rotation":[0,0,-0.41015237421866746],"rightJoints":["9cZUThxWj1ikMEGtxc3eiz"],"lz":5.25,"leftJoints":["3JjPc2Pp9fAroM9UdivE1u"],"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","parentId":"a7Ykq8sCMoZy5zM2ybNhKs","normal":[0,0,1],"textureType":"Wall Texture Default","cy":3.3516986330408542,"rightPoint":[-4.747688161235284,3.351698633040855,0],"leftRoofHeight":5.25,"cz":0,"cx":-0.07907462591906578,"leftPoint":[4.589538909397152,3.3516986330408534,0],"roofId":"qYDMJTekV8NWHzzCiVYwcs","ly":0.3,"centerRoofHeight":[0,6.225217409690371],"type":"Wall","selected":false,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"leftRoofHeight":5.25,"normal":[0,0,1],"rightPoint":[4.589538909397152,3.3516986330408534,0],"lx":6.320731749368616,"cz":0,"locked":false,"rightJoints":["vG7sqxy4RdGecDZ8BgqUDU"],"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","rightRoofHeight":5.25,"type":"Wall","selected":false,"relativeAngle":1.5707963267948961,"color":"white","rotation":[0,0,-0.41015237421866746],"cy":0.19133275835654517,"lz":5.25,"id":"3JjPc2Pp9fAroM9UdivE1u","roofId":"qYDMJTekV8NWHzzCiVYwcs","leftPoint":[4.58953890939715,-2.969033116327763,0],"parentId":"a7Ykq8sCMoZy5zM2ybNhKs","leftJoints":["cABST71Bn78stcfTw5z7y2"],"cx":4.589538909397151,"textureType":"Wall Texture Default","ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"textureType":"Wall Texture Default","cz":0,"leftRoofHeight":5.25,"cy":-2.969033116327763,"locked":false,"roofId":"qYDMJTekV8NWHzzCiVYwcs","ly":0.3,"parentId":"a7Ykq8sCMoZy5zM2ybNhKs","rightPoint":[4.58953890939715,-2.969033116327763,0],"cx":-0.07907462591906667,"rightRoofHeight":5.25,"lz":5.25,"relativeAngle":-4.756114491922529e-17,"selected":false,"type":"Wall","normal":[0,0,1],"color":"white","leftJoints":["9cZUThxWj1ikMEGtxc3eiz"],"rightJoints":["3JjPc2Pp9fAroM9UdivE1u"],"centerRoofHeight":[0,6.225217409690371],"rotation":[0,0,-0.41015237421866746],"leftPoint":[-4.747688161235283,-2.9690331163277626,0],"id":"cABST71Bn78stcfTw5z7y2","lx":9.337227070632434,"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"rotation":[0,0,-0.41015237421866746],"color":"white","selected":false,"locked":false,"ly":0.3,"relativeAngle":-1.5707963267948966,"leftPoint":[-4.747688161235284,3.351698633040855,0],"lz":5.25,"roofId":"qYDMJTekV8NWHzzCiVYwcs","parentId":"a7Ykq8sCMoZy5zM2ybNhKs","cy":0.19133275835654628,"rightJoints":["cABST71Bn78stcfTw5z7y2"],"cx":-4.747688161235283,"lx":6.320731749368617,"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","textureType":"Wall Texture Default","leftJoints":["vG7sqxy4RdGecDZ8BgqUDU"],"type":"Wall","rightPoint":[-4.747688161235283,-2.9690331163277626,0],"rightRoofHeight":5.25,"leftRoofHeight":5.25,"cz":0,"id":"9cZUThxWj1ikMEGtxc3eiz","normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"color":"#808080","solarPowerTower":{},"type":"Foundation","locked":false,"selected":false,"lx":10.667610013832563,"solarAbsorberPipe":{},"parentId":"Ground","normal":[0,0,1],"cx":35.81768474812716,"rotation":[0,0,-0.41015237421866746],"cy":-31.968353023498793,"solarUpdraftTower":{},"cz":0.5,"id":"a7Ykq8sCMoZy5zM2ybNhKs","lz":1,"ly":10.658064363814518},{"locked":false,"id":"a6q6Txnypc9iPjohNf43CB","leftPoint":[4.779738528665165,10.937352047913798,1],"cx":0.395865158322978,"leftJoints":["4RfjPoTAycowc8B5SwzkpM"],"rightJoints":["jWqRj42hxzMWofSpUH42dz"],"rotation":[0,0,-0.41015237421866746],"parentId":"uBZaguS4Mp4iydQBE88CA1","selected":false,"rightPoint":[-3.9880082120192073,10.937352047913798,1],"foundationId":"uBZaguS4Mp4iydQBE88CA1","leftRoofHeight":10,"lz":10,"ly":0.3,"cz":0,"color":"white","normal":[0,0,1],"rightRoofHeight":10,"roofId":"jSo2aHHx58NTeAQuDZodmY","type":"Wall","lx":8.767746740684375,"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","cy":10.937352047913794,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"leftPoint":[4.779738528665165,3.130296275146503,1],"normal":[0,0,1],"roofId":"jSo2aHHx58NTeAQuDZodmY","rightJoints":["a6q6Txnypc9iPjohNf43CB"],"rotation":[0,0,-0.41015237421866746],"ly":0.3,"relativeAngle":1.5707963267948963,"cz":0,"id":"4RfjPoTAycowc8B5SwzkpM","parentId":"uBZaguS4Mp4iydQBE88CA1","cx":4.779738528665163,"locked":false,"textureType":"Wall Texture Default","leftJoints":["nRLvRbWCCyQkZn2SaeWzhR"],"rightPoint":[4.779738528665165,10.937352047913798,1],"foundationId":"uBZaguS4Mp4iydQBE88CA1","selected":false,"lx":7.807055772767293,"lz":10,"leftRoofHeight":10,"rightRoofHeight":10,"cy":7.033824161530151,"color":"white","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rotation":[0,0,-0.41015237421866746],"leftRoofHeight":10,"cz":0,"lx":8.767746740684375,"cx":0.3958651583229764,"rightJoints":["4RfjPoTAycowc8B5SwzkpM"],"type":"Wall","cy":3.130296275146505,"foundationId":"uBZaguS4Mp4iydQBE88CA1","ly":0.3,"rightRoofHeight":10,"id":"nRLvRbWCCyQkZn2SaeWzhR","parentId":"uBZaguS4Mp4iydQBE88CA1","rightPoint":[4.779738528665165,3.130296275146503,1],"lz":10,"normal":[0,0,1],"textureType":"Wall Texture Default","color":"white","relativeAngle":3.0390194173108526e-16,"locked":false,"leftPoint":[-3.9880082120192113,3.1302962751465033,1],"roofId":"jSo2aHHx58NTeAQuDZodmY","leftJoints":["jWqRj42hxzMWofSpUH42dz"],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lz":10,"relativeAngle":-1.5707963267948968,"cy":7.03382416153015,"parentId":"uBZaguS4Mp4iydQBE88CA1","rightPoint":[-3.9880082120192113,3.1302962751465033,1],"ly":0.3,"lx":7.807055772767296,"roofId":"jSo2aHHx58NTeAQuDZodmY","cx":-3.988008212019209,"color":"white","foundationId":"uBZaguS4Mp4iydQBE88CA1","leftPoint":[-3.9880082120192073,10.937352047913798,1],"rightJoints":["nRLvRbWCCyQkZn2SaeWzhR"],"selected":false,"cz":0,"leftRoofHeight":10,"rightRoofHeight":10,"leftJoints":["a6q6Txnypc9iPjohNf43CB"],"type":"Wall","locked":false,"textureType":"Wall Texture Default","normal":[0,0,1],"id":"jWqRj42hxzMWofSpUH42dz","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"ly":26.759313634558907,"cy":-19.722143796679788,"cz":0.5,"lx":9.74476233969461,"solarAbsorberPipe":{},"locked":false,"selected":false,"parentId":"Ground","normal":[0,0,1],"color":"#808080","type":"Foundation","id":"uBZaguS4Mp4iydQBE88CA1","cx":17.121825988451324,"solarPowerTower":{},"solarUpdraftTower":{},"rotation":[0,0,-0.41015237421866746],"lz":1},{"leftJoints":["ngPHRhypQfV68DYtm6sZvW"],"cz":0,"leftRoofHeight":10,"parentId":"rQh2s1iBHWvFGFdzViXEe2","rotation":[0,0,-0.41015237421866746],"cx":-0.4824098277040898,"leftPoint":[12.274733699058217,12.570550728118558,1],"locked":false,"rightJoints":["sbPEhSxLJ7xiM71jhPJUkw"],"textureType":"Wall Texture Default","roofId":"tN1a6B1uCvjUWCkBQctrVG","color":"white","selected":false,"lz":10,"cy":12.570550728118565,"ly":0.3,"relativeAngle":3.141592653589793,"foundationId":"rQh2s1iBHWvFGFdzViXEe2","id":"b12LAtSYTNxCwTbH7iRFmz","rightRoofHeight":10,"rightPoint":[-13.239553354466391,12.570550728118558,1],"lx":25.51428705352461,"type":"Wall","normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"leftPoint":[12.274733699058213,-12.675216149553869,1],"normal":[0,0,1],"leftJoints":["2z5tfxd1xStwLEwGZ1Enk7"],"locked":false,"rightPoint":[12.274733699058217,12.570550728118558,1],"foundationId":"rQh2s1iBHWvFGFdzViXEe2","relativeAngle":1.5707963267948966,"ly":0.3,"lz":10,"lx":25.245766877672445,"cz":0,"roofId":"tN1a6B1uCvjUWCkBQctrVG","selected":false,"cy":-0.05233271071766232,"rightRoofHeight":10,"rotation":[0,0,-0.41015237421866746],"parentId":"rQh2s1iBHWvFGFdzViXEe2","cx":12.274733699058219,"id":"ngPHRhypQfV68DYtm6sZvW","color":"white","leftRoofHeight":10,"textureType":"Wall Texture Default","rightJoints":["b12LAtSYTNxCwTbH7iRFmz"],"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"roofId":"tN1a6B1uCvjUWCkBQctrVG","rightPoint":[12.274733699058219,-12.675216149553865,1],"color":"white","foundationId":"rQh2s1iBHWvFGFdzViXEe2","lx":25.514287053524612,"cz":0,"leftPoint":[-13.239553354466391,-12.675216149553885,1],"leftJoints":["sbPEhSxLJ7xiM71jhPJUkw"],"selected":false,"id":"2z5tfxd1xStwLEwGZ1Enk7","parentId":"rQh2s1iBHWvFGFdzViXEe2","normal":[0,0,1],"rightJoints":["ngPHRhypQfV68DYtm6sZvW"],"rightRoofHeight":10,"leftRoofHeight":10,"type":"Wall","ly":0.3,"relativeAngle":3.4811022461136335e-16,"rotation":[0,0,-0.41015237421866746],"lz":10,"cy":-12.675216149553874,"locked":false,"textureType":"Wall Texture Default","cx":-0.4824098277040827,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"ly":0.3,"selected":false,"roofId":"tN1a6B1uCvjUWCkBQctrVG","cz":0,"leftJoints":["b12LAtSYTNxCwTbH7iRFmz"],"lz":10,"cx":-13.239553354466391,"locked":false,"foundationId":"rQh2s1iBHWvFGFdzViXEe2","lx":25.245766877672445,"id":"sbPEhSxLJ7xiM71jhPJUkw","rightJoints":["2z5tfxd1xStwLEwGZ1Enk7"],"textureType":"Wall Texture Default","leftRoofHeight":10,"relativeAngle":-1.5707963267948968,"rightRoofHeight":10,"rightPoint":[-13.239553354466395,-12.675216149553886,1],"cy":-0.05233271071766321,"rotation":[0,0,-0.41015237421866746],"type":"Wall","normal":[0,0,1],"color":"white","parentId":"rQh2s1iBHWvFGFdzViXEe2","leftPoint":[-13.239553354466391,12.570550728118558,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lx":27.015265076182526,"solarPowerTower":{},"id":"rQh2s1iBHWvFGFdzViXEe2","lz":1,"rotation":[0,0,-0.41015237421866746],"cy":-75.35128568516778,"normal":[0,0,1],"cx":46.98901169365807,"cz":0.5,"solarUpdraftTower":{},"parentId":"Ground","selected":false,"type":"Foundation","locked":false,"color":"#808080","ly":28.698582154704336,"solarAbsorberPipe":{}},{"leftPoint":[3.881236454413665,2.590871964313816,0],"rotation":[0,0,-0.41015237421866746],"lx":13.122757014665611,"cz":0,"roofId":"mgoQMGVeVMwiZzvh6DtsHC","textureType":"Wall Texture Default","parentId":"kLLR11PM8xK326yQ5QVzHF","cx":-2.68014205291914,"leftRoofHeight":16,"cy":2.590871964313818,"locked":false,"id":"gs8TZionAFZcvbLtmKeykq","normal":[0,0,1],"relativeAngle":3.141592653589793,"foundationId":"kLLR11PM8xK326yQ5QVzHF","lz":16,"ly":0.3,"rightRoofHeight":16,"color":"white","selected":false,"type":"Wall","rightJoints":["9qCk45C9zpiC2iX7xDbSMH"],"leftJoints":["rohGrk56Rmwrds2U1CuXPp"],"rightPoint":[-9.241520560251946,2.59087196431382,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"rightRoofHeight":16,"cx":3.881236454413662,"rotation":[0,0,-0.41015237421866746],"leftJoints":["3d9FbdLzNegyUKLjvqVp9P"],"centerRoofHeight":[0,17.714737050020105],"roofId":"mgoQMGVeVMwiZzvh6DtsHC","color":"white","id":"rohGrk56Rmwrds2U1CuXPp","selected":false,"rightJoints":["gs8TZionAFZcvbLtmKeykq"],"foundationId":"kLLR11PM8xK326yQ5QVzHF","textureType":"Wall Texture Default","locked":false,"type":"Wall","leftPoint":[3.8812364544136595,-2.6095545856794877,0],"lx":5.200426549993304,"cy":-0.009341310682835946,"normal":[0,0,1],"lz":16,"parentId":"kLLR11PM8xK326yQ5QVzHF","ly":0.3,"cz":0,"leftRoofHeight":16,"relativeAngle":1.5707963267948957,"rightPoint":[3.881236454413665,2.590871964313816,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"locked":false,"parentId":"kLLR11PM8xK326yQ5QVzHF","foundationId":"kLLR11PM8xK326yQ5QVzHF","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"textureType":"Wall Texture Default","cx":-2.6801420529191438,"leftJoints":["9qCk45C9zpiC2iX7xDbSMH"],"cy":-2.6095545856794904,"color":"white","leftRoofHeight":16,"ly":0.3,"relativeAngle":4.0609381948055113e-16,"leftPoint":[-9.241520560251947,-2.609554585679493,0],"rightJoints":["rohGrk56Rmwrds2U1CuXPp"],"type":"Wall","selected":false,"id":"3d9FbdLzNegyUKLjvqVp9P","rightPoint":[3.8812364544136595,-2.6095545856794877,0],"roofId":"mgoQMGVeVMwiZzvh6DtsHC","cz":0,"lz":16,"rightRoofHeight":16,"lx":13.122757014665607,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"cx":-9.241520560251946,"cz":0,"roofId":"mgoQMGVeVMwiZzvh6DtsHC","lz":16,"relativeAngle":-1.570796326794897,"cy":-0.009341310682836612,"normal":[0,0,1],"foundationId":"kLLR11PM8xK326yQ5QVzHF","parentId":"kLLR11PM8xK326yQ5QVzHF","rotation":[0,0,-0.41015237421866746],"lx":5.200426549993313,"color":"white","leftJoints":["gs8TZionAFZcvbLtmKeykq"],"locked":false,"leftPoint":[-9.241520560251946,2.59087196431382,0],"id":"9qCk45C9zpiC2iX7xDbSMH","rightRoofHeight":16,"ly":0.3,"centerRoofHeight":[0,17.714737050020105],"selected":false,"rightJoints":["3d9FbdLzNegyUKLjvqVp9P"],"leftRoofHeight":16,"rightPoint":[-9.241520560251947,-2.609554585679493,0],"textureType":"Wall Texture Default","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"rotation":[0,0,-0.41015237421866746],"cy":-78.99513775014256,"color":"#808080","solarUpdraftTower":{},"lz":1,"selected":false,"parentId":"Ground","cz":0.5,"cx":57.21273152304917,"locked":false,"solarAbsorberPipe":{},"solarPowerTower":{},"type":"Foundation","normal":[0,0,1],"id":"kLLR11PM8xK326yQ5QVzHF","lx":20.705717238442087,"ly":5.889181614425833},{"parentId":"x5CDMTRHrHH6ChAJLKJCrV","cz":0,"rightRoofHeight":11,"lx":21.722848351168093,"id":"6V62Zt3rayMTYsccknpXaH","lz":11,"ly":0.3,"leftRoofHeight":11,"cx":4.010629943427583,"type":"Wall","locked":false,"cy":4.151117918815318,"leftPoint":[14.87205411901163,4.151117918815315,0],"selected":false,"relativeAngle":3.1415926535897927,"roofId":"5Fxdv1WWmCMeawRz9mKuqV","textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"leftJoints":["9wfJs9iCWUXsCC7X64D8Nb"],"color":"white","rightPoint":[-6.8507942321564625,4.151117918815323,0],"normal":[0,0,1],"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","rightJoints":["qD9BfhCuxt9GxywQHZujJQ"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cz":0,"roofId":"5Fxdv1WWmCMeawRz9mKuqV","parentId":"x5CDMTRHrHH6ChAJLKJCrV","textureType":"Wall Texture Default","lx":8.340566324530702,"rightPoint":[14.87205411901163,4.151117918815315,0],"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","locked":false,"cx":14.872054119011626,"normal":[0,0,1],"leftPoint":[14.872054119011624,-4.189448405715386,0],"color":"white","rightRoofHeight":11,"rightJoints":["6V62Zt3rayMTYsccknpXaH"],"cy":-0.019165243450035785,"ly":0.3,"centerRoofHeight":[0,12.060818180566665],"leftJoints":["eVyuLptBvR2cKWFWdRTpDm"],"leftRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"selected":false,"type":"Wall","lz":11,"id":"9wfJs9iCWUXsCC7X64D8Nb","relativeAngle":1.570796326794896,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"id":"eVyuLptBvR2cKWFWdRTpDm","leftJoints":["qD9BfhCuxt9GxywQHZujJQ"],"lz":11,"leftRoofHeight":11,"cx":4.010629943427585,"textureType":"Wall Texture Default","cz":0,"selected":false,"rightPoint":[14.872054119011624,-4.189448405715386,0],"parentId":"x5CDMTRHrHH6ChAJLKJCrV","type":"Wall","color":"white","ly":0.3,"rightJoints":["9wfJs9iCWUXsCC7X64D8Nb"],"cy":-4.189448405715389,"leftPoint":[-6.850794232156455,-4.189448405715391,0],"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","rightRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"relativeAngle":2.0443415277360858e-16,"roofId":"5Fxdv1WWmCMeawRz9mKuqV","lx":21.72284835116808,"normal":[0,0,1],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"leftJoints":["6V62Zt3rayMTYsccknpXaH"],"centerRoofHeight":[0,12.060818180566665],"locked":false,"rightPoint":[-6.850794232156455,-4.189448405715391,0],"type":"Wall","rightJoints":["eVyuLptBvR2cKWFWdRTpDm"],"parentId":"x5CDMTRHrHH6ChAJLKJCrV","cy":-0.01916524345003401,"lz":11,"leftRoofHeight":11,"rightRoofHeight":11,"relativeAngle":-1.5707963267948957,"color":"white","cz":0,"id":"qD9BfhCuxt9GxywQHZujJQ","lx":8.340566324530712,"roofId":"5Fxdv1WWmCMeawRz9mKuqV","cx":-6.850794232156459,"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","ly":0.3,"leftPoint":[-6.8507942321564625,4.151117918815323,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Foundation","solarPowerTower":{},"rotation":[0,0,-0.41015237421866746],"selected":false,"locked":false,"lx":30.492817584324445,"id":"x5CDMTRHrHH6ChAJLKJCrV","lz":1,"cx":-2.6987520128351328,"normal":[0,0,1],"cz":0.5,"ly":8.387848050211689,"solarAbsorberPipe":{},"solarUpdraftTower":{},"cy":-53.16373671637722,"color":"#808080","parentId":"Ground"},{"type":"Wall","textureType":"Wall Texture Default","lx":5.147994804936703,"rotation":[0,0,-0.41015237421866746],"lz":13,"ly":0.3,"cy":3.5419213517865673,"leftJoints":["xqjrhteUBJfNDcJWuHnvRu"],"leftRoofHeight":13,"rightRoofHeight":13,"rightJoints":["qY5WoPV6F2CGJU6Z5GgH9A"],"normal":[0,0,1],"locked":false,"cx":1.9334943095461699,"id":"5TCp2VzUPYtC3wHFFUhMZA","relativeAngle":3.1415926535897922,"leftPoint":[4.507491712014521,3.5419213517865646,0],"cz":0,"foundationId":"niHTxZ4PaRwa8PCQj9YtSY","roofId":"15884yYUHNT5NwXMKhmRGP","color":"white","selected":false,"rightPoint":[-0.6405030929221814,3.54192135178657,0],"parentId":"niHTxZ4PaRwa8PCQj9YtSY","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"type":"Wall","id":"xqjrhteUBJfNDcJWuHnvRu","roofId":"15884yYUHNT5NwXMKhmRGP","foundationId":"niHTxZ4PaRwa8PCQj9YtSY","lx":7.024418192306677,"lz":13,"relativeAngle":1.5707963267948963,"rightJoints":["5TCp2VzUPYtC3wHFFUhMZA"],"selected":false,"textureType":"Wall Texture Default","cx":4.50749171201452,"parentId":"niHTxZ4PaRwa8PCQj9YtSY","leftRoofHeight":13,"rightRoofHeight":13,"cy":0.029712255633226103,"ly":0.3,"color":"white","normal":[0,0,1],"leftPoint":[4.507491712014519,-3.4824968405201124,0],"rightPoint":[4.507491712014521,3.5419213517865646,0],"rotation":[0,0,-0.41015237421866746],"cz":0,"locked":false,"leftJoints":["nW4zHPMqaoecHBwBCyEqwh"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"cx":1.9334943095461696,"lz":13,"lx":5.147994804936699,"roofId":"15884yYUHNT5NwXMKhmRGP","color":"white","ly":0.3,"foundationId":"niHTxZ4PaRwa8PCQj9YtSY","leftPoint":[-0.6405030929221798,-3.482496840520119,0],"type":"Wall","parentId":"niHTxZ4PaRwa8PCQj9YtSY","leftRoofHeight":13,"textureType":"Wall Texture Default","cz":0,"rotation":[0,0,-0.41015237421866746],"rightPoint":[4.507491712014519,-3.4824968405201124,0],"leftJoints":["qY5WoPV6F2CGJU6Z5GgH9A"],"selected":false,"cy":-3.482496840520116,"id":"nW4zHPMqaoecHBwBCyEqwh","locked":false,"normal":[0,0,1],"rightRoofHeight":13,"relativeAngle":1.293967534963907e-15,"rightJoints":["xqjrhteUBJfNDcJWuHnvRu"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"textureType":"Wall Texture Default","ly":0.3,"foundationId":"niHTxZ4PaRwa8PCQj9YtSY","id":"qY5WoPV6F2CGJU6Z5GgH9A","cy":0.029712255633225437,"leftJoints":["5TCp2VzUPYtC3wHFFUhMZA"],"relativeAngle":-1.5707963267948963,"leftPoint":[-0.6405030929221814,3.54192135178657,0],"leftRoofHeight":13,"cz":0,"roofId":"15884yYUHNT5NwXMKhmRGP","rightRoofHeight":13,"selected":false,"normal":[0,0,1],"cx":-0.6405030929221807,"lz":13,"rotation":[0,0,-0.41015237421866746],"rightJoints":["nW4zHPMqaoecHBwBCyEqwh"],"lx":7.024418192306689,"rightPoint":[-0.6405030929221798,-3.482496840520119,0],"parentId":"niHTxZ4PaRwa8PCQj9YtSY","type":"Wall","locked":false,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"solarAbsorberPipe":{},"cy":-49.221657555965606,"ly":7.870086564093848,"cz":0.5,"type":"Foundation","solarPowerTower":{},"locked":false,"rotation":[0,0,-0.41015237421866746],"solarUpdraftTower":{},"normal":[0,0,1],"lz":1,"id":"niHTxZ4PaRwa8PCQj9YtSY","parentId":"Ground","color":"#808080","selected":false,"lx":9.19241650107572,"cx":0.2960050895698132},{"leftJoints":["pBQFic2TqVJyDdJyEaBVof"],"cy":6.111068939289358,"rightJoints":["w8GFYP8jB1EG2YVL6appCT"],"rightRoofHeight":20,"locked":false,"type":"Wall","rotation":[0,0,-0.41015237421866746],"cx":-6.699754362236526,"foundationId":"jH5z454ciczrceJTNes5b4","relativeAngle":-3.1415926535897927,"color":"white","lz":20,"rightPoint":[-16.136312320425503,6.1110689392893525,1],"cz":0,"leftPoint":[2.7368035959524555,6.111068939289361,1],"parentId":"jH5z454ciczrceJTNes5b4","id":"tq43NPQgXhkeNmwFteVBqx","lx":18.873115916377962,"roofId":"aqd47NYJ1Q6UzcCmxxcoXQ","ly":0.3,"textureType":"Wall Texture Default","normal":[0,0,1],"leftRoofHeight":20,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"normal":[0,0,1],"leftJoints":["4ocNasurxu3LhLKonWAKWR"],"lz":20,"rightRoofHeight":20,"locked":false,"foundationId":"jH5z454ciczrceJTNes5b4","cy":-0.01768597422249274,"rotation":[0,0,-0.41015237421866746],"relativeAngle":1.5707963267948966,"selected":false,"cx":2.736803595952447,"id":"pBQFic2TqVJyDdJyEaBVof","rightPoint":[2.7368035959524555,6.111068939289361,1],"cz":0,"color":"white","type":"Wall","lx":12.257509827023695,"roofId":"aqd47NYJ1Q6UzcCmxxcoXQ","textureType":"Wall Texture Default","ly":0.3,"rightJoints":["tq43NPQgXhkeNmwFteVBqx"],"parentId":"jH5z454ciczrceJTNes5b4","leftRoofHeight":20,"leftPoint":[2.7368035959524515,-6.146440887734339,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"selected":false,"rightJoints":["pBQFic2TqVJyDdJyEaBVof"],"leftJoints":["w8GFYP8jB1EG2YVL6appCT"],"lz":20,"lx":18.873115916377927,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"id":"4ocNasurxu3LhLKonWAKWR","locked":false,"foundationId":"jH5z454ciczrceJTNes5b4","leftRoofHeight":20,"type":"Wall","cy":-6.146440887734334,"normal":[0,0,1],"cx":-6.69975436223651,"rightRoofHeight":20,"ly":0.3,"parentId":"jH5z454ciczrceJTNes5b4","cz":0,"color":"white","relativeAngle":-7.059076177209601e-16,"roofId":"aqd47NYJ1Q6UzcCmxxcoXQ","rightPoint":[2.736803595952453,-6.146440887734342,1],"leftPoint":[-16.13631232042547,-6.146440887734327,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"rotation":[0,0,-0.41015237421866746],"rightPoint":[-16.13631232042547,-6.146440887734327,1],"ly":0.3,"parentId":"jH5z454ciczrceJTNes5b4","textureType":"Wall Texture Default","id":"w8GFYP8jB1EG2YVL6appCT","relativeAngle":-1.5707963267948937,"type":"Wall","lz":20,"locked":false,"leftJoints":["tq43NPQgXhkeNmwFteVBqx"],"leftPoint":[-16.136312320425503,6.1110689392893525,1],"foundationId":"jH5z454ciczrceJTNes5b4","cz":0,"roofId":"aqd47NYJ1Q6UzcCmxxcoXQ","rightRoofHeight":20,"color":"white","cx":-16.13631232042549,"cy":-0.017685974222486855,"lx":12.257509827023679,"leftRoofHeight":20,"rightJoints":["4ocNasurxu3LhLKonWAKWR"],"normal":[0,0,1],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"locked":false,"color":"#808080","lx":39.42410417793452,"cx":66.63950557888982,"ly":15.35325958544188,"rotation":[0,0,-0.41015237421866746],"type":"Foundation","selected":false,"lz":1,"parentId":"Ground","normal":[0,0,1],"solarPowerTower":{},"cy":16.298608230784698,"id":"jH5z454ciczrceJTNes5b4","solarAbsorberPipe":{},"solarUpdraftTower":{},"cz":0.5},{"type":"Wall","relativeAngle":3.141592653589793,"cy":1.981243048009849,"foundationId":"n59KTNFiEAdewYQ4UeZKU4","locked":false,"parentId":"n59KTNFiEAdewYQ4UeZKU4","leftRoofHeight":4,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"roofId":"rSsa8T9bULkoQ2pinqnr8i","leftPoint":[0.9304202110555404,1.981243048009849,0],"color":"white","rightRoofHeight":4,"cz":0,"cx":-2.0589287667673153,"id":"v3VJnU8TGf45Uue1UFcxRK","lx":5.9786979556457105,"centerRoofHeight":[0,4.977141261476465],"normal":[0,0,1],"rightPoint":[-5.0482777445901705,1.981243048009849,0],"leftJoints":["usXjKxe48EnDWZT6Frh4Pq"],"selected":false,"ly":0.3,"lz":4,"rightJoints":["oB5VoQWfR3kmSWtghKT8LL"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"leftJoints":["8m4LSxdnyZTCo1Q3CX64h7"],"rightPoint":[0.9304202110555404,1.981243048009849,0],"cx":0.9304202110555421,"leftPoint":[0.9304202110555437,-1.9726241537665505,0],"color":"white","rotation":[0,0,-0.41015237421866746],"leftRoofHeight":4,"foundationId":"n59KTNFiEAdewYQ4UeZKU4","cy":0.004309447121649268,"lx":3.9538672017764,"locked":false,"id":"usXjKxe48EnDWZT6Frh4Pq","selected":false,"ly":0.3,"rightRoofHeight":4,"rightJoints":["v3VJnU8TGf45Uue1UFcxRK"],"textureType":"Wall Texture Default","parentId":"n59KTNFiEAdewYQ4UeZKU4","roofId":"rSsa8T9bULkoQ2pinqnr8i","normal":[0,0,1],"type":"Wall","relativeAngle":1.5707963267948977,"cz":0,"lz":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"cx":-2.058928766767304,"cz":0,"leftRoofHeight":4,"lx":5.978697955645695,"rightJoints":["usXjKxe48EnDWZT6Frh4Pq"],"centerRoofHeight":[0,4.977141261476465],"leftJoints":["oB5VoQWfR3kmSWtghKT8LL"],"foundationId":"n59KTNFiEAdewYQ4UeZKU4","id":"8m4LSxdnyZTCo1Q3CX64h7","rightRoofHeight":4,"rightPoint":[0.9304202110555437,-1.9726241537665505,0],"roofId":"rSsa8T9bULkoQ2pinqnr8i","cy":-1.9726241537665496,"textureType":"Wall Texture Default","locked":false,"normal":[0,0,1],"type":"Wall","rotation":[0,0,-0.41015237421866746],"selected":false,"ly":0.3,"relativeAngle":-2.971143303405775e-16,"color":"white","parentId":"n59KTNFiEAdewYQ4UeZKU4","lz":4,"leftPoint":[-5.048277744590152,-1.9726241537665488,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"locked":false,"rightJoints":["8m4LSxdnyZTCo1Q3CX64h7"],"lz":4,"leftJoints":["v3VJnU8TGf45Uue1UFcxRK"],"color":"white","type":"Wall","textureType":"Wall Texture Default","cz":0,"parentId":"n59KTNFiEAdewYQ4UeZKU4","selected":false,"id":"oB5VoQWfR3kmSWtghKT8LL","rotation":[0,0,-0.41015237421866746],"cy":0.004309447121650156,"leftPoint":[-5.0482777445901705,1.981243048009849,0],"leftRoofHeight":4,"lx":3.953867201776398,"rightPoint":[-5.048277744590152,-1.9726241537665488,0],"normal":[0,0,1],"rightRoofHeight":4,"ly":0.3,"cx":-5.048277744590161,"relativeAngle":-1.570796326794892,"roofId":"rSsa8T9bULkoQ2pinqnr8i","foundationId":"n59KTNFiEAdewYQ4UeZKU4","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"solarUpdraftTower":{},"normal":[0,0,1],"color":"#808080","lz":1,"cz":0.5,"lx":10.423522474713057,"ly":4.1286288557387945,"locked":false,"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"solarPowerTower":{},"id":"n59KTNFiEAdewYQ4UeZKU4","cy":-40.804555672678404,"type":"Foundation","cx":68.39138539021306,"selected":false,"solarAbsorberPipe":{}},{"locked":false,"selected":false,"lx":5.9786979556457105,"ly":0.3,"rightPoint":[-5.0482777445901705,1.981243048009849,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"lz":4,"foundationId":"5YuxWSX2uVTCHuPGAXXubi","leftRoofHeight":4,"roofId":"1E1bgqioi9tFqyckxVRysA","leftJoints":["c7E26TQsGBwiEUQ4ooLDKK"],"color":"white","normal":[0,0,1],"relativeAngle":3.141592653589793,"type":"Wall","id":"ccjpL8TWCg1zhnSiXXyUiu","cx":-2.0589287667673153,"rightJoints":["ar4bhGtUec9qTkqAxEbkF4"],"rotation":[0,0,-0.41015237421866746],"parentId":"5YuxWSX2uVTCHuPGAXXubi","cz":0,"centerRoofHeight":[0,4.788751523933837],"leftPoint":[0.9304202110555404,1.981243048009849,0],"cy":1.981243048009849,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"parentId":"5YuxWSX2uVTCHuPGAXXubi","lz":4,"rightRoofHeight":4,"roofId":"1E1bgqioi9tFqyckxVRysA","cy":0.004309447121649268,"foundationId":"5YuxWSX2uVTCHuPGAXXubi","normal":[0,0,1],"type":"Wall","locked":false,"rotation":[0,0,-0.41015237421866746],"leftJoints":["nxEr9eKy7xre7xajGyT8qN"],"selected":false,"ly":0.3,"relativeAngle":1.5707963267948977,"rightPoint":[0.9304202110555404,1.981243048009849,0],"rightJoints":["ccjpL8TWCg1zhnSiXXyUiu"],"leftPoint":[0.9304202110555437,-1.9726241537665505,0],"id":"c7E26TQsGBwiEUQ4ooLDKK","cz":0,"cx":0.9304202110555421,"lx":3.9538672017764,"textureType":"Wall Texture Default","color":"white","leftRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"cz":0,"relativeAngle":-2.971143303405775e-16,"textureType":"Wall Texture Default","normal":[0,0,1],"color":"white","parentId":"5YuxWSX2uVTCHuPGAXXubi","leftJoints":["ar4bhGtUec9qTkqAxEbkF4"],"leftPoint":[-5.048277744590152,-1.9726241537665488,0],"centerRoofHeight":[0,4.788751523933837],"lx":5.978697955645695,"leftRoofHeight":4,"cx":-2.058928766767304,"locked":false,"ly":0.3,"rightPoint":[0.9304202110555437,-1.9726241537665505,0],"id":"nxEr9eKy7xre7xajGyT8qN","type":"Wall","cy":-1.9726241537665496,"rightRoofHeight":4,"lz":4,"foundationId":"5YuxWSX2uVTCHuPGAXXubi","selected":false,"rightJoints":["c7E26TQsGBwiEUQ4ooLDKK"],"roofId":"1E1bgqioi9tFqyckxVRysA","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"locked":false,"ly":0.3,"parentId":"5YuxWSX2uVTCHuPGAXXubi","normal":[0,0,1],"textureType":"Wall Texture Default","lx":3.953867201776398,"cy":0.004309447121650156,"lz":4,"selected":false,"leftPoint":[-5.0482777445901705,1.981243048009849,0],"leftRoofHeight":4,"rightPoint":[-5.048277744590152,-1.9726241537665488,0],"rightJoints":["nxEr9eKy7xre7xajGyT8qN"],"rightRoofHeight":4,"relativeAngle":-1.570796326794892,"color":"white","roofId":"1E1bgqioi9tFqyckxVRysA","leftJoints":["ccjpL8TWCg1zhnSiXXyUiu"],"id":"ar4bhGtUec9qTkqAxEbkF4","foundationId":"5YuxWSX2uVTCHuPGAXXubi","cx":-5.048277744590161,"rotation":[0,0,-0.41015237421866746],"type":"Wall","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"lz":1,"selected":false,"solarAbsorberPipe":{},"cz":0.5,"locked":false,"type":"Foundation","normal":[0,0,1],"solarPowerTower":{},"id":"5YuxWSX2uVTCHuPGAXXubi","cy":-30.912868668016095,"cx":72.70720165765073,"solarUpdraftTower":{},"ly":4.1286288557387945,"parentId":"Ground","color":"#808080","lx":10.423522474713057,"rotation":[0,0,-0.41015237421866746]},{"textureType":"Wall Texture Default","cx":0.01121512740181907,"rightPoint":[-3.072511420947951,1.3672430244223959,0],"cy":1.3672430244223936,"id":"6QCJ15fiFxBVfmQVYdq3Tt","relativeAngle":3.1415926535897927,"normal":[0,0,1],"selected":false,"leftJoints":["hKcyiMXDvquM1MhoYuTSwv"],"leftRoofHeight":11,"cz":0,"rightJoints":["xaCgBVBkCeg8kpZex83ZSB"],"lz":11,"type":"Wall","lx":6.167453096699541,"locked":false,"leftPoint":[3.0949416757515893,1.3672430244223912,0],"ly":0.3,"foundationId":"jsSCnAypzh29RxPH7MED73","rotation":[0,0,-0.41015237421866746],"roofId":"g5QrsNM3GmBsG5THTKDrtm","parentId":"jsSCnAypzh29RxPH7MED73","color":"white","rightRoofHeight":11,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":7.1624734368285194,"leftRoofHeight":11,"rightPoint":[3.0949416757515893,1.3672430244223912,0],"foundationId":"jsSCnAypzh29RxPH7MED73","cz":0,"cx":3.0949416757515884,"ly":0.3,"rightJoints":["6QCJ15fiFxBVfmQVYdq3Tt"],"normal":[0,0,1],"textureType":"Wall Texture Default","rightRoofHeight":11,"leftPoint":[3.094941675751588,-5.795230412406128,0],"type":"Wall","id":"hKcyiMXDvquM1MhoYuTSwv","roofId":"g5QrsNM3GmBsG5THTKDrtm","locked":false,"cy":-2.2139936939918683,"color":"white","rotation":[0,0,-0.41015237421866746],"parentId":"jsSCnAypzh29RxPH7MED73","relativeAngle":1.5707963267948963,"selected":false,"lz":11,"leftJoints":["eS1W5AA2DGWiYaV8ifzzrj"],"centerRoofHeight":[-0.5,11],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"leftJoints":["xaCgBVBkCeg8kpZex83ZSB"],"cz":0,"rotation":[0,0,-0.41015237421866746],"relativeAngle":0,"textureType":"Wall Texture Default","cy":-5.795230412406128,"rightPoint":[3.094941675751588,-5.795230412406128,0],"lx":6.167453096699535,"parentId":"jsSCnAypzh29RxPH7MED73","id":"eS1W5AA2DGWiYaV8ifzzrj","foundationId":"jsSCnAypzh29RxPH7MED73","locked":false,"rightJoints":["hKcyiMXDvquM1MhoYuTSwv"],"ly":0.3,"rightRoofHeight":11,"color":"white","leftPoint":[-3.0725114209479467,-5.795230412406128,0],"leftRoofHeight":11,"roofId":"g5QrsNM3GmBsG5THTKDrtm","cx":0.011215127401820624,"type":"Wall","lz":11,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"roofId":"g5QrsNM3GmBsG5THTKDrtm","cz":0,"leftRoofHeight":11,"type":"Wall","cy":-2.213993693991866,"parentId":"jsSCnAypzh29RxPH7MED73","rotation":[0,0,-0.41015237421866746],"rightJoints":["eS1W5AA2DGWiYaV8ifzzrj"],"textureType":"Wall Texture Default","id":"xaCgBVBkCeg8kpZex83ZSB","lx":7.162473436828524,"cx":-3.072511420947949,"leftJoints":["6QCJ15fiFxBVfmQVYdq3Tt"],"lz":11,"ly":0.3,"locked":false,"rightPoint":[-3.0725114209479467,-5.795230412406128,0],"foundationId":"jsSCnAypzh29RxPH7MED73","normal":[0,0,1],"color":"white","centerRoofHeight":[0.5,11],"rightRoofHeight":11,"leftPoint":[-3.072511420947951,1.3672430244223959,0],"relativeAngle":-1.570796326794896,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"locked":false,"solarPowerTower":{},"selected":false,"solarUpdraftTower":{},"cz":0.5,"solarAbsorberPipe":{},"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"ly":12.02473099186649,"cy":-50.437956729618975,"lx":6.9193101388799265,"lz":1,"parentId":"Ground","color":"#808080","type":"Foundation","cx":40.2572441035554,"id":"jsSCnAypzh29RxPH7MED73"},{"cy":0,"wallsId":["91sCr2ydHgygQWRuaJ5N1C"],"lz":0,"type":"Roof","id":"vRe6nzFrDCWVtSCu332MH4","textureType":"No Roof Texture","showLabel":false,"rotation":[0,0,0],"lineWidth":0.2,"ridgeLeftPoint":[0,1],"cz":0,"normal":[0,0,1],"roofType":"Gable","cx":0,"ly":0,"thickness":0.2,"locked":false,"lx":0,"parentId":"bkH7VRrzUTdvxfSm8xVMfT","foundationId":"bkH7VRrzUTdvxfSm8xVMfT","ridgeRightPoint":[0,1],"lineColor":"black","selected":false,"color":"#ffffff","rise":1.3393317550628012,"ceiling":false},{"cz":0,"lz":0,"id":"fS4RCk5GfqcPBkrsfQqupD","ly":0,"selected":false,"ridgeLeftPoint":[-0.5,1],"normal":[0,0,1],"showLabel":false,"cy":0,"color":"#ffffff","type":"Roof","foundationId":"kqR5p2bajX4NMTBq55qbCM","rotation":[0,0,0],"locked":false,"lineColor":"black","textureType":"No Roof Texture","lineWidth":0.2,"lx":0,"ridgeRightPoint":[0.5,1],"cx":0,"thickness":0.2,"wallsId":["4CXQZA8oGxMYG5uuTdJH4z"],"roofType":"Gable","parentId":"kqR5p2bajX4NMTBq55qbCM","rise":0,"ceiling":false},{"showLabel":false,"rotation":[0,0,0],"cy":0,"wallsId":["oB5VoQWfR3kmSWtghKT8LL"],"thickness":0.2,"lz":0,"foundationId":"n59KTNFiEAdewYQ4UeZKU4","lineColor":"black","cz":0,"textureType":"No Roof Texture","cx":0,"type":"Roof","ly":0,"roofType":"Gable","lineWidth":0.2,"selected":false,"ridgeRightPoint":[0,1],"color":"#ffffff","ridgeLeftPoint":[0,1],"parentId":"n59KTNFiEAdewYQ4UeZKU4","normal":[0,0,1],"locked":false,"lx":0,"id":"rSsa8T9bULkoQ2pinqnr8i","rise":0.977141261476465,"ceiling":false},{"parentId":"b7G57PTXunVqeHXzCWeuRF","rightJoints":["dpZWnBXJifWNeSxPnXSh11"],"ly":0.3,"cx":0.22353744000734044,"lz":10,"normal":[0,0,1],"leftPoint":[8.53481429529893,4.284875927504061,1],"rightRoofHeight":10,"foundationId":"b7G57PTXunVqeHXzCWeuRF","textureType":"Wall Texture Default","rightPoint":[-8.087739415284249,4.284875927504063,1],"leftJoints":["6fcDhLeskSsK9vgEVSS72V"],"locked":false,"relativeAngle":3.141592653589793,"lx":16.622553710583173,"type":"Wall","roofId":"5AL2YmNDuGkeP7qZ5AC7iV","color":"white","id":"kj6mwcCRjjAjkZKNVLpD6Q","rotation":[0,0,-0.41015237421866746],"cy":4.2848759275040615,"leftRoofHeight":10,"selected":false,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"normal":[0,0,1],"id":"6fcDhLeskSsK9vgEVSS72V","locked":false,"roofId":"5AL2YmNDuGkeP7qZ5AC7iV","rotation":[0,0,-0.41015237421866746],"cx":8.534814295298915,"lz":10,"leftJoints":["eJ8JK9wm6JNigJXLFxHXZv"],"rightJoints":["kj6mwcCRjjAjkZKNVLpD6Q"],"leftPoint":[8.534814295298911,-8.242350712076524,1],"leftRoofHeight":10,"textureType":"Wall Texture Default","rightRoofHeight":10,"cz":0,"cy":-1.978737392286233,"selected":false,"foundationId":"b7G57PTXunVqeHXzCWeuRF","parentId":"b7G57PTXunVqeHXzCWeuRF","lx":12.527226639580588,"ly":0.3,"rightPoint":[8.53481429529893,4.284875927504061,1],"relativeAngle":1.5707963267948954,"color":"white","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"ly":0.3,"id":"eJ8JK9wm6JNigJXLFxHXZv","rightPoint":[8.534814295298911,-8.242350712076524,1],"rightJoints":["6fcDhLeskSsK9vgEVSS72V"],"leftRoofHeight":10,"cz":0,"cx":0.22353744000733222,"locked":false,"rightRoofHeight":10,"leftJoints":["dpZWnBXJifWNeSxPnXSh11"],"leftPoint":[-8.087739415284243,-8.24235071207653,1],"parentId":"b7G57PTXunVqeHXzCWeuRF","lz":10,"lx":16.622553710583155,"cy":-8.242350712076528,"color":"white","relativeAngle":2.1372851251721804e-16,"textureType":"Wall Texture Default","selected":false,"rotation":[0,0,-0.41015237421866746],"type":"Wall","normal":[0,0,1],"roofId":"5AL2YmNDuGkeP7qZ5AC7iV","foundationId":"b7G57PTXunVqeHXzCWeuRF","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"textureType":"Wall Texture Default","cz":0,"ly":0.3,"relativeAngle":-1.5707963267948966,"selected":false,"color":"white","cy":-1.9787373922862332,"leftPoint":[-8.087739415284249,4.284875927504063,1],"lx":12.527226639580594,"lz":10,"parentId":"b7G57PTXunVqeHXzCWeuRF","leftJoints":["kj6mwcCRjjAjkZKNVLpD6Q"],"locked":false,"foundationId":"b7G57PTXunVqeHXzCWeuRF","roofId":"5AL2YmNDuGkeP7qZ5AC7iV","rightRoofHeight":10,"rightPoint":[-8.087739415284243,-8.24235071207653,1],"id":"dpZWnBXJifWNeSxPnXSh11","normal":[0,0,1],"cx":-8.087739415284243,"rightJoints":["eJ8JK9wm6JNigJXLFxHXZv"],"rotation":[0,0,-0.41015237421866746],"type":"Wall","leftRoofHeight":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"id":"b7G57PTXunVqeHXzCWeuRF","cz":0.5,"color":"#808080","parentId":"Ground","locked":false,"cx":39.84041470102862,"solarPowerTower":{},"type":"Foundation","selected":false,"rotation":[0,0,-0.41015237421866746],"solarAbsorberPipe":{},"lx":18.262342237511447,"solarUpdraftTower":{},"cy":-19.957109308878913,"ly":25.839391461953184,"lz":1,"normal":[0,0,1]},{"wallsId":["nRLvRbWCCyQkZn2SaeWzhR","4RfjPoTAycowc8B5SwzkpM","a6q6Txnypc9iPjohNf43CB","jWqRj42hxzMWofSpUH42dz"],"lx":0,"cz":0,"cx":0,"thickness":0.2,"id":"jSo2aHHx58NTeAQuDZodmY","type":"Roof","showLabel":false,"locked":false,"roofType":"Pyramid","lz":0,"ly":0,"foundationId":"uBZaguS4Mp4iydQBE88CA1","color":"#ffffff","lineWidth":0.2,"cy":0,"parentId":"uBZaguS4Mp4iydQBE88CA1","normal":[0,0,1],"rotation":[0,0,0],"textureType":"No Roof Texture","lineColor":"black","selected":false,"rise":1.4201872195519947,"ceiling":false},{"lx":0,"selected":false,"parentId":"niHTxZ4PaRwa8PCQj9YtSY","foundationId":"niHTxZ4PaRwa8PCQj9YtSY","wallsId":["nW4zHPMqaoecHBwBCyEqwh","xqjrhteUBJfNDcJWuHnvRu","5TCp2VzUPYtC3wHFFUhMZA","qY5WoPV6F2CGJU6Z5GgH9A"],"cx":0,"showLabel":false,"rotation":[0,0,0],"cz":0,"normal":[0,0,1],"roofType":"Pyramid","lz":0,"locked":false,"lineColor":"black","thickness":0.2,"cy":0,"ly":0,"id":"15884yYUHNT5NwXMKhmRGP","color":"#ffffff","textureType":"No Roof Texture","type":"Roof","lineWidth":0.2,"rise":2,"ceiling":false},{"locked":false,"lx":0,"textureType":"No Roof Texture","normal":[0,0,1],"thickness":0.2,"lineWidth":0.2,"cy":0,"ridgeRightPoint":[0,1],"parentId":"x5CDMTRHrHH6ChAJLKJCrV","cx":0,"wallsId":["6V62Zt3rayMTYsccknpXaH"],"showLabel":false,"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","lz":0,"selected":false,"ly":0,"ridgeLeftPoint":[0,1],"lineColor":"black","cz":0,"id":"5Fxdv1WWmCMeawRz9mKuqV","type":"Roof","color":"#ffffff","rotation":[0,0,0],"roofType":"Gable","rise":1.060818180566665,"ceiling":false},{"showLabel":false,"ly":0,"color":"#ffffff","rotation":[0,0,0],"roofType":"Pyramid","cx":0,"lineWidth":0.2,"thickness":0.2,"textureType":"No Roof Texture","locked":false,"wallsId":["5QyDHSHQi5g83yTByESY7g","nNQo9acqRqKRWfE4a1RvLy","7JuGqBdByKra32qVf2wuMP","2DDFqyaAZAAuWTVgy7UTYL"],"lx":0,"selected":false,"lz":0,"parentId":"64tiQZ7Po62MhdtE1e44n9","cy":0,"cz":0,"normal":[0,0,1],"foundationId":"64tiQZ7Po62MhdtE1e44n9","lineColor":"black","type":"Roof","id":"oTjPo4r99EKfdasnxT3n5a","rise":2,"ceiling":false},{"cz":0,"ly":0,"color":"#ffffff","showLabel":false,"type":"Roof","wallsId":["oNZPm4ForjT1jLCRGXT8ae"],"locked":false,"lineWidth":0.2,"ridgeRightPoint":[0,1],"textureType":"No Roof Texture","cy":0,"thickness":0.2,"lz":0,"rotation":[0,0,0],"parentId":"qJBTbMiP4tUMstkk4bQqAp","normal":[0,0,1],"cx":0,"id":"tLNDomb3SubspErPERhojH","lx":0,"lineColor":"black","selected":false,"ridgeLeftPoint":[0,1],"foundationId":"qJBTbMiP4tUMstkk4bQqAp","roofType":"Gable","rise":1.111126896848333,"ceiling":false},{"color":"#ffffff","normal":[0,0,1],"thickness":0.2,"ridgeRightPoint":[0,1],"lz":0,"roofType":"Gable","ly":0,"type":"Roof","lineColor":"black","showLabel":false,"id":"1E1bgqioi9tFqyckxVRysA","parentId":"5YuxWSX2uVTCHuPGAXXubi","ridgeLeftPoint":[0,1],"foundationId":"5YuxWSX2uVTCHuPGAXXubi","locked":false,"cz":0,"selected":false,"lx":0,"textureType":"No Roof Texture","cy":0,"lineWidth":0.2,"wallsId":["ar4bhGtUec9qTkqAxEbkF4"],"rotation":[0,0,0],"cx":0,"rise":0.7887515239338372,"ceiling":false},{"cy":0.22491740558796045,"rightPoint":[-7.989846773884258,0.2249174055879637,1],"roofId":"7MHnZ8shY1nNWWHte69oqs","lx":16.622553710583173,"selected":false,"locked":false,"type":"Wall","parentId":"jXMhg2wW7AzS5RR8DVRgQA","rightJoints":["bBRKF8cuUabp5jr721b2aF"],"leftRoofHeight":20,"rotation":[0,0,-0.41015237421866746],"lz":20,"relativeAngle":3.141592653589793,"leftJoints":["monXTa8uPTJhzhXCcFVkHQ"],"cx":0.3214300814073309,"rightRoofHeight":20,"cz":0,"normal":[0,0,1],"color":"white","foundationId":"jXMhg2wW7AzS5RR8DVRgQA","id":"abgP23xfq9mn6fXM5eixEU","leftPoint":[8.63270693669892,0.22491740558795703,1],"ly":0.3,"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"normal":[0,0,1],"locked":false,"parentId":"jXMhg2wW7AzS5RR8DVRgQA","rightPoint":[8.63270693669892,0.22491740558795703,1],"leftPoint":[8.6327069366989,-12.302309233992622,1],"id":"monXTa8uPTJhzhXCcFVkHQ","cx":8.632706936698906,"cy":-6.038695914202334,"textureType":"Wall Texture Default","leftJoints":["1sWH6Vf283ZQdSSFT642nh"],"color":"white","foundationId":"jXMhg2wW7AzS5RR8DVRgQA","rightRoofHeight":20,"leftRoofHeight":20,"cz":0,"lx":12.527226639580588,"selected":false,"ly":0.3,"relativeAngle":1.5707963267948954,"rightJoints":["abgP23xfq9mn6fXM5eixEU"],"type":"Wall","lz":20,"roofId":"7MHnZ8shY1nNWWHte69oqs","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"rightPoint":[8.6327069366989,-12.302309233992622,1],"roofId":"7MHnZ8shY1nNWWHte69oqs","ly":0.3,"lx":16.622553710583155,"relativeAngle":2.1372851251721804e-16,"rotation":[0,0,-0.41015237421866746],"lz":20,"leftJoints":["bBRKF8cuUabp5jr721b2aF"],"normal":[0,0,1],"foundationId":"jXMhg2wW7AzS5RR8DVRgQA","leftPoint":[-7.989846773884253,-12.302309233992618,1],"cz":0,"id":"1sWH6Vf283ZQdSSFT642nh","rightJoints":["monXTa8uPTJhzhXCcFVkHQ"],"selected":false,"parentId":"jXMhg2wW7AzS5RR8DVRgQA","color":"white","cx":0.321430081407323,"textureType":"Wall Texture Default","type":"Wall","leftRoofHeight":20,"locked":false,"cy":-12.302309233992629,"rightRoofHeight":20,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"lx":12.527226639580594,"leftRoofHeight":20,"color":"white","normal":[0,0,1],"leftJoints":["abgP23xfq9mn6fXM5eixEU"],"cz":0,"ly":0.3,"selected":false,"rightPoint":[-7.989846773884253,-12.302309233992618,1],"cy":-6.038695914202334,"leftPoint":[-7.989846773884258,0.2249174055879637,1],"locked":false,"id":"bBRKF8cuUabp5jr721b2aF","rightJoints":["1sWH6Vf283ZQdSSFT642nh"],"relativeAngle":-1.5707963267948966,"foundationId":"jXMhg2wW7AzS5RR8DVRgQA","cx":-7.989846773884254,"parentId":"jXMhg2wW7AzS5RR8DVRgQA","textureType":"Wall Texture Default","roofId":"7MHnZ8shY1nNWWHte69oqs","lz":20,"type":"Wall","rightRoofHeight":20,"rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Foundation","cy":-59.32802731716726,"color":"#808080","solarUpdraftTower":{},"parentId":"Ground","solarPowerTower":{},"rotation":[0,0,-0.41015237421866746],"lz":1,"solarAbsorberPipe":{},"normal":[0,0,1],"ly":33.95930850578536,"lx":18.06655695471146,"selected":false,"cz":0.5,"id":"jXMhg2wW7AzS5RR8DVRgQA","locked":false,"cx":27.648877509882105},{"parentId":"Ground","color":"gray","cx":-21.42383933703887,"cy":-95.95694272842316,"ly":1.57584749281375,"id":"fskGS47Z1ZNZV2kamP1tSH","normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":10,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cz":5,"locked":false,"selected":false,"type":"Cuboid","lx":2.5033124327375345,"rotation":[0,0,-0.41015237421866746]},{"color":"white","lx":3.975737139849098,"foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","id":"mCTHFTsPbL7uxKLV7Fs7gC","locked":false,"cx":11.798791107427842,"leftRoofHeight":6,"rightRoofHeight":6,"leftJoints":["fAYf9rMtUxbvaurL2KcLtn"],"centerRoofHeight":[0,6.274887651356121],"lz":6,"leftPoint":[11.798791107427842,-1.9873220704176595,0],"textureType":"Wall Texture Default","ly":0.3,"cy":0.000546499506889564,"cz":0,"relativeAngle":1.5707963267948961,"type":"Wall","selected":false,"rightPoint":[11.798791107427844,1.9884150694314386,0],"roofId":"rxThm84RhChdhdNYSFFbG6","parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","rotation":[0,0,-0.41015237421866746],"rightJoints":["htbHSZNyQhmtqy5XzNBo85"],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"cy":-1.9873220704176617,"id":"fAYf9rMtUxbvaurL2KcLtn","relativeAngle":5.312979959407059e-16,"cz":0,"parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","rightPoint":[11.798791107427842,-1.9873220704176595,0],"leftRoofHeight":6,"leftJoints":["21bSs7TaWmDDwyZwkVPp3m"],"color":"white","lx":7.940642588168972,"roofId":"rxThm84RhChdhdNYSFFbG6","cx":7.828469813343356,"locked":false,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"type":"Wall","ly":0.3,"lz":6,"rightRoofHeight":6,"leftPoint":[3.858148519258871,-1.9873220704176637,0],"textureType":"Wall Texture Default","rightJoints":["mCTHFTsPbL7uxKLV7Fs7gC"],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightRoofHeight":6,"ly":0.3,"roofId":"rxThm84RhChdhdNYSFFbG6","normal":[0,0,1],"leftJoints":["htbHSZNyQhmtqy5XzNBo85"],"leftRoofHeight":6,"textureType":"Wall Texture Default","cx":3.8581485192588696,"locked":false,"lz":6,"rotation":[0,0,-0.41015237421866746],"centerRoofHeight":[0,6.274887651356121],"lx":3.975737139849111,"selected":false,"leftPoint":[3.858148519258868,1.9884150694314473,0],"id":"21bSs7TaWmDDwyZwkVPp3m","color":"white","cy":0.0005464995068917844,"parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","rightJoints":["fAYf9rMtUxbvaurL2KcLtn"],"rightPoint":[3.858148519258871,-1.9873220704176637,0],"relativeAngle":-1.570796326794896,"foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","type":"Wall","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","roofId":"rxThm84RhChdhdNYSFFbG6","color":"white","selected":false,"ly":0.3,"parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","leftRoofHeight":6,"type":"Wall","leftPoint":[11.798791107427844,1.9884150694314386,0],"rightPoint":[3.858148519258868,1.9884150694314473,0],"cx":7.8284698133433555,"cz":3.7151685093329987,"textureType":"Wall Texture Default","relativeAngle":3.1415926535897922,"leftJoints":["mCTHFTsPbL7uxKLV7Fs7gC"],"id":"htbHSZNyQhmtqy5XzNBo85","rightJoints":["21bSs7TaWmDDwyZwkVPp3m"],"locked":false,"rotation":[0,0,-0.41015237421866746],"lx":7.940642588168976,"normal":[0,0,1],"rightRoofHeight":6,"cy":1.988415069431443,"lz":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"textureType":"No Roof Texture","ridgeLeftPoint":[0,1],"cx":0,"rotation":[0,0,-0.41015237421866746],"selected":false,"ridgeRightPoint":[0,1],"ly":0,"lz":0,"cz":0,"locked":false,"foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","lx":0,"roofType":"Gable","type":"Roof","id":"rxThm84RhChdhdNYSFFbG6","wallsId":["htbHSZNyQhmtqy5XzNBo85"],"parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","normal":[0,0,1],"color":"#ffffff","cy":0,"thickness":0.2,"rise":0.2748876513561207,"ceiling":false},{"type":"Foundation","locked":false,"cy":-78.52468836433339,"lx":29.579193784185183,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"selected":false,"cx":-61.66430487227184,"cz":0.5,"solarAbsorberPipe":{},"lz":1,"solarPowerTower":{},"parentId":"Ground","solarUpdraftTower":{},"ly":4.244451594984441,"id":"jYmTgt5Yh5kp4YxeQ9xdGS"},{"normal":[0,0,1],"parentId":"2LZNQJZFPrCxZzv5NuwumV","rightRidgeLength":1.461737872145095,"selected":false,"color":"#ffffff","locked":false,"cy":0,"textureType":"No Roof Texture","lineColor":"black","lineWidth":0.2,"id":"9TF7gEynqtnsWJGidoBUNq","wallsId":["hcTBY8guDEpwEg5jtYtD3H"],"rotation":[0,0,0],"showLabel":false,"roofType":"Hip","leftRidgeLength":1.7970131018338904,"thickness":0.2,"foundationId":"2LZNQJZFPrCxZzv5NuwumV","lz":0,"cx":0,"ly":0,"lx":0,"type":"Roof","cz":0,"rise":5,"ceiling":false},{"selected":false,"id":"tN1a6B1uCvjUWCkBQctrVG","rotation":[0,0,0],"lineColor":"black","lineWidth":0.2,"ly":0,"cz":0,"roofType":"Hip","cy":0,"textureType":"No Roof Texture","leftRidgeLength":0.059768175058504625,"showLabel":false,"locked":false,"wallsId":["b12LAtSYTNxCwTbH7iRFmz"],"cx":0,"thickness":0.2,"normal":[0,0,1],"foundationId":"rQh2s1iBHWvFGFdzViXEe2","lz":0,"lx":0,"parentId":"rQh2s1iBHWvFGFdzViXEe2","color":"#ffffff","rightRidgeLength":12.757143526762304,"type":"Roof","rise":2.8291651006338494,"ceiling":false},{"ly":0,"lineColor":"black","thickness":0.2,"cz":0,"type":"Roof","wallsId":["gs8TZionAFZcvbLtmKeykq"],"lineWidth":0.2,"parentId":"kLLR11PM8xK326yQ5QVzHF","roofType":"Gable","cx":0,"showLabel":false,"id":"mgoQMGVeVMwiZzvh6DtsHC","ridgeLeftPoint":[0,1],"cy":0,"ridgeRightPoint":[0,1],"lx":0,"textureType":"No Roof Texture","foundationId":"kLLR11PM8xK326yQ5QVzHF","color":"#ffffff","selected":false,"locked":false,"rotation":[0,0,0],"normal":[0,0,1],"lz":0,"rise":1.714737050020105,"ceiling":false},{"normal":[0,0,1],"type":"Roof","lz":0,"cx":0,"rotation":[0,0,0],"rightRidgeLength":1.354315870345922,"wallsId":["c79sKVUHUztGcC5p3emVv9"],"lx":0,"lineWidth":0.2,"thickness":0.2,"leftRidgeLength":1.2176583991481174,"cy":0,"selected":false,"textureType":"No Roof Texture","foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","showLabel":false,"cz":0,"color":"#ffffff","parentId":"tjMZKt5v9D1sx6sc6Xyaq2","locked":false,"roofType":"Hip","id":"teQS3ohvRHqAbgCQQahyC6","lineColor":"black","ly":0,"rise":5,"ceiling":false},{"ly":5.984113255877874,"color":"gray","normal":[0,0,1],"parentId":"Ground","cy":111.66856512870567,"cx":55.88269693007359,"selected":false,"lx":21.294854568920073,"id":"3PRatafdc5GGL7xWYLxLQt","rotation":[0,0,-0.41015237421866746],"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":4.25,"lz":8.5},{"rightRoofHeight":12,"cx":0.017113708955167617,"relativeAngle":3.141592653589793,"lx":12.131551303286216,"leftJoints":["snwHy88SCLUgp9tM1ts1kV"],"rightPoint":[-6.04866194268794,-9.49210668858673,1],"rightJoints":["fgVtymGrmdEZZzZZ3mW69b"],"selected":false,"foundationId":"4p3AerfQErrh3N7JyKd7PA","color":"white","cy":-9.49210668858672,"ly":0.3,"locked":false,"type":"Wall","roofId":"ui47bC2XPhcG14b6RPgvMq","leftPoint":[6.082889360598275,-9.492106688586723,1],"id":"pJZasFocQxwotbLjPFqJsC","normal":[0,0,1],"lz":12,"parentId":"4p3AerfQErrh3N7JyKd7PA","cz":0,"leftRoofHeight":12,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cy":-19.44706205065753,"leftPoint":[6.082889360598278,-29.402017412728345,1],"color":"white","rightJoints":["pJZasFocQxwotbLjPFqJsC"],"locked":false,"relativeAngle":1.5707963267948963,"parentId":"4p3AerfQErrh3N7JyKd7PA","type":"Wall","selected":false,"leftRoofHeight":12,"normal":[0,0,1],"rightRoofHeight":12,"lx":19.90991072414161,"cx":6.08288936059827,"lz":12,"foundationId":"4p3AerfQErrh3N7JyKd7PA","ly":0.3,"textureType":"Wall Texture Default","roofId":"ui47bC2XPhcG14b6RPgvMq","id":"snwHy88SCLUgp9tM1ts1kV","cz":0,"rightPoint":[6.082889360598275,-9.492106688586723,1],"rotation":[0,0,-0.41015237421866746],"leftJoints":["9RBn6VqRCqHmHYTVsG2Hbq"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cx":0.017113708955172058,"lz":12,"rightJoints":["snwHy88SCLUgp9tM1ts1kV"],"leftRoofHeight":12,"type":"Wall","selected":false,"locked":false,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","ly":0.3,"rightPoint":[6.082889360598278,-29.402017412728345,1],"roofId":"ui47bC2XPhcG14b6RPgvMq","id":"9RBn6VqRCqHmHYTVsG2Hbq","lx":12.131551303286194,"leftJoints":["fgVtymGrmdEZZzZZ3mW69b"],"rightRoofHeight":12,"parentId":"4p3AerfQErrh3N7JyKd7PA","normal":[0,0,1],"cy":-29.40201741272834,"leftPoint":[-6.048661942687922,-29.402017412728334,1],"relativeAngle":-1.757094500109714e-15,"cz":0,"color":"white","foundationId":"4p3AerfQErrh3N7JyKd7PA","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cz":0,"rightRoofHeight":12,"color":"white","type":"Wall","id":"fgVtymGrmdEZZzZZ3mW69b","cy":-19.447062050657532,"leftJoints":["pJZasFocQxwotbLjPFqJsC"],"rightPoint":[-6.048661942687922,-29.402017412728334,1],"roofId":"ui47bC2XPhcG14b6RPgvMq","leftPoint":[-6.04866194268794,-9.49210668858673,1],"relativeAngle":-1.5707963267948957,"parentId":"4p3AerfQErrh3N7JyKd7PA","lz":12,"foundationId":"4p3AerfQErrh3N7JyKd7PA","leftRoofHeight":12,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"lx":19.909910724141604,"selected":false,"locked":false,"normal":[0,0,1],"rightJoints":["9RBn6VqRCqHmHYTVsG2Hbq"],"textureType":"Wall Texture Default","cx":-6.048661942687932,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"solarPowerTower":{},"selected":false,"cy":106.34352672553437,"locked":false,"cx":54.33030410078149,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"parentId":"Ground","lz":1,"ly":63.77501586798267,"color":"#808080","lx":12.35095202063562,"solarAbsorberPipe":{},"solarUpdraftTower":{},"id":"4p3AerfQErrh3N7JyKd7PA","cz":0.5,"type":"Foundation"},{"rotation":[0,0,-0.41015237421866746],"lz":6,"normal":[0,0,1],"locked":false,"centerRoofHeight":[0,6.440750059917652],"id":"irVUAZaEWhGKYr7twduXEh","cy":6.530855931908157,"leftPoint":[2.9112812141567144,6.530855931908155,1],"roofId":"ngj1wMdEusAUmYWeWEqzyw","type":"Wall","rightRoofHeight":6,"cz":0,"rightJoints":["8yAv4GumHgHAy2fR9bygQz"],"foundationId":"gszYxD4CuGX1qrhwnFgJQu","lx":6.102875967687821,"parentId":"gszYxD4CuGX1qrhwnFgJQu","cx":-0.14015676968719282,"ly":0.3,"leftRoofHeight":6,"rightPoint":[-3.191594753531113,6.530855931908152,1],"selected":false,"textureType":"Wall Texture Default","color":"white","leftJoints":["gr56ivVG6p8ierekWDUK1u"],"relativeAngle":-3.1415926535897927,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"parentId":"gszYxD4CuGX1qrhwnFgJQu","color":"white","foundationId":"gszYxD4CuGX1qrhwnFgJQu","normal":[0,0,1],"locked":false,"cx":2.9112812141567126,"ly":0.3,"cz":0,"selected":false,"rotation":[0,0,-0.41015237421866746],"id":"gr56ivVG6p8ierekWDUK1u","textureType":"Wall Texture Default","rightJoints":["irVUAZaEWhGKYr7twduXEh"],"lx":9.731752225416841,"cy":1.6649798191997407,"rightPoint":[2.9112812141567144,6.530855931908155,1],"lz":6,"leftPoint":[2.911281214156714,-3.2008962935086798,1],"type":"Wall","relativeAngle":1.5707963267948963,"rightRoofHeight":6,"leftJoints":["1K6LZYJR4J6iMfrED26Yxe"],"roofId":"ngj1wMdEusAUmYWeWEqzyw","leftRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"selected":false,"roofId":"ngj1wMdEusAUmYWeWEqzyw","lz":6,"rightJoints":["gr56ivVG6p8ierekWDUK1u"],"centerRoofHeight":[0,6.440750059917652],"leftPoint":[-3.191594753531113,-3.2008962935086824,1],"leftJoints":["8yAv4GumHgHAy2fR9bygQz"],"rightPoint":[2.911281214156714,-3.2008962935086798,1],"cz":0,"rightRoofHeight":6,"type":"Wall","relativeAngle":-5.821376180034847e-16,"locked":false,"id":"1K6LZYJR4J6iMfrED26Yxe","parentId":"gszYxD4CuGX1qrhwnFgJQu","color":"white","normal":[0,0,1],"cx":-0.14015676968720614,"cy":-3.200896293508684,"leftRoofHeight":6,"foundationId":"gszYxD4CuGX1qrhwnFgJQu","rotation":[0,0,-0.41015237421866746],"lx":6.102875967687822,"textureType":"Wall Texture Default","ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightJoints":["1K6LZYJR4J6iMfrED26Yxe"],"leftPoint":[-3.191594753531113,6.530855931908152,1],"relativeAngle":-1.5707963267948972,"id":"8yAv4GumHgHAy2fR9bygQz","selected":false,"lx":9.731752225416834,"type":"Wall","foundationId":"gszYxD4CuGX1qrhwnFgJQu","leftJoints":["irVUAZaEWhGKYr7twduXEh"],"normal":[0,0,1],"parentId":"gszYxD4CuGX1qrhwnFgJQu","lz":6,"locked":false,"rotation":[0,0,-0.41015237421866746],"cy":1.664979819199738,"color":"white","cx":-3.191594753531114,"ly":0.3,"leftRoofHeight":6,"rightPoint":[-3.191594753531113,-3.2008962935086824,1],"roofId":"ngj1wMdEusAUmYWeWEqzyw","cz":0,"rightRoofHeight":6,"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"locked":false,"selected":false,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","color":"#808080","cx":24.599288579767826,"solarAbsorberPipe":{},"cy":62.32717346646996,"type":"Foundation","solarPowerTower":{},"lx":7.149369527041389,"normal":[0,0,1],"ly":13.668965778073638,"lz":1,"cz":0.5,"solarUpdraftTower":{},"id":"gszYxD4CuGX1qrhwnFgJQu"},{"type":"Roof","ridgeLeftPoint":[0,1],"ly":0,"id":"ngj1wMdEusAUmYWeWEqzyw","locked":false,"foundationId":"gszYxD4CuGX1qrhwnFgJQu","lineColor":"black","selected":false,"lx":0,"thickness":0.2,"rotation":[0,0,0],"wallsId":["gr56ivVG6p8ierekWDUK1u"],"cx":0,"showLabel":false,"lineWidth":0.2,"ridgeRightPoint":[0,1],"color":"#ffffff","textureType":"No Roof Texture","roofType":"Gable","cz":0,"parentId":"gszYxD4CuGX1qrhwnFgJQu","cy":0,"normal":[0,0,1],"lz":0,"rise":0.4407500599176517,"ceiling":false},{"selected":false,"lz":0.1,"color":"#68ccca","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"type":"Foundation","cy":80.9376872016833,"lx":46.93960391347784,"id":"pzqyJ9AXZR9mJxEtKDPKGG","solarUpdraftTower":{},"cx":111.01126755807289,"ly":67.71063906268108,"locked":false,"solarAbsorberPipe":{},"parentId":"Ground","cz":0.05,"solarPowerTower":{}},{"leftJoints":["bmKncuas6bZ1hnGH6qyHKX"],"roofId":"gVgDeNYsXdGDefJV1YRGoa","selected":false,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","locked":false,"cx":-0.14015676968719282,"relativeAngle":-3.1415926535897927,"normal":[0,0,1],"lx":6.102875967687821,"id":"8kwuUQ3tQhRzvqUiLnSjD4","type":"Wall","centerRoofHeight":[0,6.440750059917652],"cz":0,"foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","parentId":"uLUbMGL5dFfRU3Jy3CBsF5","lz":6,"rightPoint":[-3.191594753531113,6.530855931908152,1],"rightJoints":["gDyesAJb6hCZTAKFF2wVoZ"],"color":"white","cy":6.530855931908157,"leftPoint":[2.9112812141567144,6.530855931908155,1],"rightRoofHeight":6,"leftRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"cz":0,"textureType":"Wall Texture Default","selected":false,"type":"Wall","roofId":"gVgDeNYsXdGDefJV1YRGoa","id":"bmKncuas6bZ1hnGH6qyHKX","leftPoint":[2.911281214156714,-3.2008962935086798,1],"rightRoofHeight":6,"relativeAngle":1.5707963267948963,"lz":6,"parentId":"uLUbMGL5dFfRU3Jy3CBsF5","rightJoints":["8kwuUQ3tQhRzvqUiLnSjD4"],"foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","locked":false,"rotation":[0,0,-0.41015237421866746],"rightPoint":[2.9112812141567144,6.530855931908155,1],"leftJoints":["vWXBFGVtdF9Zkw4WgrWQbB"],"normal":[0,0,1],"cx":2.9112812141567126,"cy":1.6649798191997407,"color":"white","leftRoofHeight":6,"ly":0.3,"lx":9.731752225416841,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightRoofHeight":6,"leftJoints":["gDyesAJb6hCZTAKFF2wVoZ"],"lx":6.102875967687822,"rightJoints":["bmKncuas6bZ1hnGH6qyHKX"],"locked":false,"parentId":"uLUbMGL5dFfRU3Jy3CBsF5","cz":0,"type":"Wall","centerRoofHeight":[0,6.440750059917652],"relativeAngle":-5.821376180034847e-16,"leftRoofHeight":6,"id":"vWXBFGVtdF9Zkw4WgrWQbB","textureType":"Wall Texture Default","color":"white","lz":6,"cy":-3.200896293508684,"cx":-0.14015676968720614,"selected":false,"leftPoint":[-3.191594753531113,-3.2008962935086824,1],"rotation":[0,0,-0.41015237421866746],"foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","ly":0.3,"normal":[0,0,1],"rightPoint":[2.911281214156714,-3.2008962935086798,1],"roofId":"gVgDeNYsXdGDefJV1YRGoa","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"relativeAngle":-1.5707963267948972,"locked":false,"cy":1.664979819199738,"leftJoints":["8kwuUQ3tQhRzvqUiLnSjD4"],"textureType":"Wall Texture Default","selected":false,"lz":6,"lx":9.731752225416834,"color":"white","type":"Wall","foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","parentId":"uLUbMGL5dFfRU3Jy3CBsF5","rotation":[0,0,-0.41015237421866746],"rightJoints":["vWXBFGVtdF9Zkw4WgrWQbB"],"cz":0,"rightRoofHeight":6,"leftRoofHeight":6,"roofId":"gVgDeNYsXdGDefJV1YRGoa","cx":-3.191594753531114,"id":"gDyesAJb6hCZTAKFF2wVoZ","normal":[0,0,1],"leftPoint":[-3.191594753531113,6.530855931908152,1],"ly":0.3,"rightPoint":[-3.191594753531113,-3.2008962935086824,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"ridgeRightPoint":[0,1],"wallsId":["bmKncuas6bZ1hnGH6qyHKX"],"selected":false,"ridgeLeftPoint":[0,1],"ly":0,"parentId":"uLUbMGL5dFfRU3Jy3CBsF5","normal":[0,0,1],"cz":0,"textureType":"No Roof Texture","foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","color":"#ffffff","cy":0,"cx":0,"lz":0,"thickness":0.2,"rotation":[0,0,0],"id":"gVgDeNYsXdGDefJV1YRGoa","locked":false,"type":"Roof","lx":0,"roofType":"Gable","rise":0.4407500599176517,"ceiling":false},{"lz":1,"lx":7.149369527041389,"color":"#808080","cx":41.18797801355477,"locked":false,"selected":false,"id":"uLUbMGL5dFfRU3Jy3CBsF5","normal":[0,0,1],"ly":13.668965778073638,"parentId":"Ground","solarUpdraftTower":{},"solarPowerTower":{},"type":"Foundation","cz":0.5,"solarAbsorberPipe":{},"rotation":[0,0,-0.41015237421866746],"cy":55.159515522512336},{"selected":false,"normal":[0,0,1],"centerRoofHeight":[-0.5,7],"locked":false,"lz":7,"rotation":[0,0,-0.41015237421866746],"rightJoints":["no8zN9dyqYE4qeuVrW3Heo"],"parentId":"vwL7hNDotVD3LxBD3WrfUq","leftJoints":["nxkAimjB2HNyGqmHN18F5b"],"id":"ra9rKcRfAsQu21a3r6cLBQ","leftPoint":[6.466711798346411,2.6318665263706373,0],"rightPoint":[1.0790317820948425,2.631866526370637,0],"leftRoofHeight":7,"foundationId":"vwL7hNDotVD3LxBD3WrfUq","cy":2.6318665263706373,"cx":3.772871790220627,"rightRoofHeight":7,"textureType":"Wall Texture Default","ly":0.3,"relativeAngle":-3.141592653589793,"lx":5.387680016251569,"color":"white","roofId":"48YD9h2WBNi7Es8vvJXW3G","type":"Wall","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"parentId":"vwL7hNDotVD3LxBD3WrfUq","rotation":[0,0,-0.41015237421866746],"lz":7,"roofId":"48YD9h2WBNi7Es8vvJXW3G","leftJoints":["33Vec12THAd4u8Vna3kAPR"],"rightJoints":["ra9rKcRfAsQu21a3r6cLBQ"],"id":"nxkAimjB2HNyGqmHN18F5b","color":"white","cx":6.466711798346411,"locked":false,"leftRoofHeight":7,"selected":false,"rightPoint":[6.466711798346411,2.6318665263706373,0],"normal":[0,0,1],"relativeAngle":1.5707963267948966,"type":"Wall","lx":5.401219763739984,"cz":0,"leftPoint":[6.466711798346411,-2.769353237369347,0],"cy":-0.06874335549935484,"ly":0.3,"textureType":"Wall Texture Default","foundationId":"vwL7hNDotVD3LxBD3WrfUq","rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"relativeAngle":-1.2364019629334816e-15,"lz":7,"ly":0.3,"cz":0,"leftJoints":["no8zN9dyqYE4qeuVrW3Heo"],"rightPoint":[6.466711798346411,-2.769353237369347,0],"cx":3.772871790220624,"cy":-2.7693532373693435,"leftPoint":[1.0790317820948367,-2.7693532373693404,0],"foundationId":"vwL7hNDotVD3LxBD3WrfUq","lx":5.387680016251575,"color":"white","locked":false,"leftRoofHeight":7,"type":"Wall","rightJoints":["nxkAimjB2HNyGqmHN18F5b"],"parentId":"vwL7hNDotVD3LxBD3WrfUq","textureType":"Wall Texture Default","selected":false,"roofId":"48YD9h2WBNi7Es8vvJXW3G","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"rightRoofHeight":7,"id":"33Vec12THAd4u8Vna3kAPR","centerRoofHeight":[0.5,7],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"lx":5.401219763739977,"rotation":[0,0,-0.41015237421866746],"cz":2.7786330947701083,"color":"white","normal":[0,0,1],"roofId":"48YD9h2WBNi7Es8vvJXW3G","rightPoint":[1.0790317820948367,-2.7693532373693404,0],"cy":-0.06874335549935173,"leftPoint":[1.0790317820948425,2.631866526370637,0],"id":"no8zN9dyqYE4qeuVrW3Heo","lz":7,"relativeAngle":-1.570796326794898,"textureType":"Wall Texture Default","selected":false,"rightRoofHeight":7,"leftRoofHeight":7,"locked":false,"foundationId":"vwL7hNDotVD3LxBD3WrfUq","ly":0.3,"rightJoints":["33Vec12THAd4u8Vna3kAPR"],"parentId":"vwL7hNDotVD3LxBD3WrfUq","type":"Wall","leftJoints":["ra9rKcRfAsQu21a3r6cLBQ"],"cx":1.0790317820948396,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"cy":84.30176551679384,"type":"Foundation","rotation":[0,0,-0.41015237421866746],"solarUpdraftTower":{},"parentId":"Ground","ly":5.568881804752381,"cz":0.5,"cx":19.50958427736446,"locked":false,"lx":13.89007394070906,"normal":[0,0,1],"id":"vwL7hNDotVD3LxBD3WrfUq","lz":1,"color":"#808080"},{"leftPoint":[-0.7148597809579893,2.6859428300134063,1],"rightJoints":["fc3SxNnr1T2obwWNDrRWPq"],"selected":false,"parentId":"4UZo2BLYXGN9cd3hbyQ45x","leftJoints":["fHApw3eZ3j52e3Ze4hhzaH"],"color":"white","lx":5.387680016251569,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"ly":0.3,"rightRoofHeight":7,"cz":0,"lz":7,"roofId":"8gnJuvioHBpuV9PnGGyNAB","id":"94d3RXBRBLR2SMUq5fQJtk","cy":2.685942830013403,"rightPoint":[-6.102539797209565,2.6859428300134014,1],"foundationId":"4UZo2BLYXGN9cd3hbyQ45x","relativeAngle":-3.141592653589793,"cx":-3.4086997890837694,"type":"Wall","centerRoofHeight":[0.5,7],"leftRoofHeight":7,"textureType":"Wall Texture Default","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"id":"fHApw3eZ3j52e3Ze4hhzaH","lx":5.401219763739984,"ly":0.3,"locked":false,"rotation":[0,0,-0.41015237421866746],"cz":0,"selected":false,"leftPoint":[-0.7148597809579927,-2.7152769337265767,1],"lz":7,"relativeAngle":1.5707963267948966,"rightRoofHeight":7,"leftRoofHeight":7,"leftJoints":["qCUxDe7bDY8tYgH1joCgeh"],"textureType":"Wall Texture Default","foundationId":"4UZo2BLYXGN9cd3hbyQ45x","cx":-0.7148597809579962,"rightJoints":["94d3RXBRBLR2SMUq5fQJtk"],"parentId":"4UZo2BLYXGN9cd3hbyQ45x","rightPoint":[-0.7148597809579893,2.6859428300134063,1],"cy":-0.014667051856591229,"normal":[0,0,1],"type":"Wall","roofId":"8gnJuvioHBpuV9PnGGyNAB","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"id":"qCUxDe7bDY8tYgH1joCgeh","relativeAngle":-1.2364019629334816e-15,"textureType":"Wall Texture Default","rightPoint":[-0.7148597809579927,-2.7152769337265767,1],"lx":5.387680016251575,"cz":0,"color":"white","rotation":[0,0,-0.41015237421866746],"leftPoint":[-6.102539797209571,-2.7152769337265754,1],"parentId":"4UZo2BLYXGN9cd3hbyQ45x","foundationId":"4UZo2BLYXGN9cd3hbyQ45x","rightJoints":["fHApw3eZ3j52e3Ze4hhzaH"],"leftRoofHeight":7,"roofId":"8gnJuvioHBpuV9PnGGyNAB","normal":[0,0,1],"cx":-3.4086997890837756,"rightRoofHeight":7,"cy":-2.715276933726573,"leftJoints":["fc3SxNnr1T2obwWNDrRWPq"],"type":"Wall","selected":false,"ly":0.3,"locked":false,"lz":7,"centerRoofHeight":[-0.5,7],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cy":-0.014667051856584123,"id":"fc3SxNnr1T2obwWNDrRWPq","roofId":"8gnJuvioHBpuV9PnGGyNAB","ly":0.3,"foundationId":"4UZo2BLYXGN9cd3hbyQ45x","leftRoofHeight":7,"selected":false,"rightRoofHeight":7,"rightJoints":["qCUxDe7bDY8tYgH1joCgeh"],"color":"white","cx":-6.102539797209562,"parentId":"4UZo2BLYXGN9cd3hbyQ45x","textureType":"Wall Texture Default","leftPoint":[-6.102539797209565,2.6859428300134014,1],"lz":7,"rotation":[0,0,-0.41015237421866746],"locked":false,"rightPoint":[-6.102539797209571,-2.7152769337265754,1],"lx":5.401219763739977,"normal":[0,0,1],"cz":0,"type":"Wall","relativeAngle":-1.570796326794898,"leftJoints":["94d3RXBRBLR2SMUq5fQJtk"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"id":"4UZo2BLYXGN9cd3hbyQ45x","cz":0.5,"solarUpdraftTower":{},"cx":60.22394051332042,"ly":5.482519143209589,"normal":[0,0,1],"color":"#808080","parentId":"Ground","lz":1,"type":"Foundation","solarPowerTower":{},"solarAbsorberPipe":{},"cy":66.89544628344375,"rotation":[0,0,-0.41015237421866746],"locked":false,"selected":false,"lx":12.981345567934609},{"ridgeRightPoint":[0.5,1],"ly":0,"wallsId":["no8zN9dyqYE4qeuVrW3Heo"],"lz":0,"cz":0,"thickness":0.2,"color":"#ffffff","showLabel":false,"lineWidth":0.2,"selected":false,"textureType":"No Roof Texture","foundationId":"vwL7hNDotVD3LxBD3WrfUq","rotation":[0,0,0],"id":"48YD9h2WBNi7Es8vvJXW3G","lineColor":"black","type":"Roof","parentId":"vwL7hNDotVD3LxBD3WrfUq","cx":0,"locked":false,"cy":0,"roofType":"Gable","lx":0,"normal":[0,0,1],"ridgeLeftPoint":[-0.5,1],"rise":0,"ceiling":false},{"cz":0,"lineWidth":0.2,"color":"#ffffff","foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","parentId":"tafet8SHZ3Nd8kXyfeZ9FR","normal":[0,0,1],"id":"52yUcWyJUbmGw2PC5d5KiK","wallsId":["k13k8dUZo1jLk9Pubbz3Yu","qEu4R9jBDYekHJdsyGPkHu","7zFHG6rEsyAEeiBjZ3Fqiv","sfm78zxYm2PZeqMiLJ7sRS"],"lx":0,"locked":false,"selected":false,"showLabel":false,"cy":0,"ly":0,"textureType":"No Roof Texture","type":"Roof","rotation":[0,0,0],"cx":0,"lineColor":"black","lz":0,"thickness":0.2,"roofType":"Pyramid","rise":1.0848601282561745,"ceiling":false},{"type":"Roof","wallsId":["vha1dDK5ppjp6f9bgr45uq"],"ridgeRightPoint":[0,1],"color":"#ffffff","rotation":[0,0,0],"lineColor":"black","ridgeLeftPoint":[0,1],"cz":0,"cx":0,"normal":[0,0,1],"selected":false,"roofType":"Gable","lz":0,"thickness":0.2,"lineWidth":0.2,"ly":0,"id":"wrKEiNvyDQopU6C5MqvRMM","locked":false,"foundationId":"98vBSiAe7BeqTZRNu482vh","textureType":"No Roof Texture","lx":0,"parentId":"98vBSiAe7BeqTZRNu482vh","cy":0,"showLabel":false,"rise":2,"ceiling":false},{"cy":0,"selected":false,"type":"Roof","leftRidgeLength":15.875000000000002,"lx":0,"cx":0,"locked":false,"id":"adpYUuHEY6XwTLGq9piRR2","normal":[0,0,1],"wallsId":["cqVaqhkF9cafDk3CujuxhA"],"cz":0,"parentId":"aXWETyunkqtQVNXGWr9VZd","showLabel":false,"rightRidgeLength":15.875000000000002,"color":"#ffffff","rotation":[0,0,0],"textureType":"No Roof Texture","foundationId":"aXWETyunkqtQVNXGWr9VZd","roofType":"Hip","lineWidth":0.2,"ly":0,"lineColor":"black","thickness":0.2,"lz":0,"rise":2.5,"ceiling":false},{"cx":40.42324164440271,"lx":46.50473526306251,"type":"Foundation","id":"gg3wfWZaPNSy6E85uMZYRf","solarAbsorberPipe":{},"ly":57.10448987141375,"color":"#68ccca","cy":-138.0841490094463,"solarPowerTower":{},"cz":0.05,"locked":false,"selected":false,"lz":0.1,"parentId":"Ground","solarUpdraftTower":{},"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746]},{"solarAbsorberPipe":{},"ly":57.28147044148081,"parentId":"Ground","color":"#68ccca","cx":-134.9224921942922,"cz":0.05,"locked":false,"rotation":[0,0,-0.41015237421866746],"lz":0.1,"cy":-67.94969279046406,"normal":[0,0,1],"solarUpdraftTower":{},"type":"Foundation","solarPowerTower":{},"lx":59.55306513135086,"selected":false,"id":"a6rvHmP4DDMyxBjdX22svj"},{"id":"aNDJu4drMr2fEx1r8tHjj6","cy":18.299607948404756,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"color":"gray","parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":3.834587966975077,"rotation":[0,0,-0.41015237421866746],"lx":7.294777414475799,"cx":-55.05079468229798,"selected":false,"locked":false,"cz":6,"lz":12,"type":"Cuboid"},{"lx":7.294777414475799,"ly":3.834587966975077,"lz":12,"cx":-33.5448212615926,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"cy":8.863867840093441,"type":"Cuboid","selected":false,"color":"gray","id":"qPJRFLTr5yqpFjK2r5qNtK","locked":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","cz":6},{"lx":7.294777414475799,"parentId":"Ground","selected":false,"cx":-26.791783116976674,"color":"gray","cz":6,"faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,-0.41015237421866746],"locked":false,"id":"foA7zzY5fzm5ppKLNPgcZM","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","ly":3.834587966975077,"normal":[0,0,1],"cy":5.910492232229722,"lz":12},{"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-50.198042271889335,"parentId":"Ground","ly":1.4387765101632088,"cy":16.15769091498796,"color":"gray","normal":[0,0,1],"locked":false,"lz":12,"type":"Cuboid","lx":3.0374945193791563,"cz":6,"rotation":[0,0,-0.41015237421866746],"id":"jcVSu4BB2otpgDQ9Uss6dk"},{"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"id":"dvQtFmgsNmd5tYGN78K2eR","type":"Cuboid","lx":3.0374945193791563,"cx":-38.46497607487548,"lz":12,"selected":false,"locked":false,"parentId":"Ground","color":"gray","cy":11.032940387603501,"rotation":[0,0,-0.41015237421866746],"cz":6,"ly":1.4387765101632088},{"locked":false,"selected":false,"id":"qHYYLt5NNn8YrtX4BAqtZt","cz":6,"cx":-21.68767431477416,"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":12,"lx":3.0374945193791563,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":1.4387765101632088,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","type":"Cuboid","normal":[0,0,1],"cy":3.88590550753401,"color":"gray"},{"id":"t1b6qVRBDTKtM9evc3a38G","rotation":[0,0,-0.41015237421866746],"cy":22.859143113805672,"cz":4,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"parentId":"Ground","lz":8,"type":"Cuboid","ly":4.854618540394783,"color":"gray","lx":3.504189768701392,"cx":-62.133323117727784,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false,"selected":false},{"type":"Cuboid","cz":5,"parentId":"Ground","ly":3.834587966975077,"cx":-1.671845448850263,"rotation":[0,0,-0.41015237421866746],"cy":36.05441660008029,"lx":7.294777414475799,"color":"gray","lz":10,"selected":false,"id":"ewVvbjdsVwbRqgEtvCq5hs","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"locked":false,"normal":[0,0,1]},{"ly":0.3,"leftJoints":["nM3F4oVEiNnPXXKHuymBW8"],"leftRoofHeight":5,"textureType":"Wall Texture Default","cx":1.4377006720631131,"cz":0,"color":"white","rightJoints":["pVB4qAvwgYktWUYmnpXrvd"],"locked":false,"id":"fVkwHoLMqjGDdZWbofbtKG","foundationId":"51jEtCS88nBPdVJc1fit8Y","roofId":"79Z3Q6kmRSdUu2gZAfxqYU","leftPoint":[16.8234405859108,5.91199411832761,0],"relativeAngle":-3.141592653589793,"lz":5,"normal":[0,0,1],"selected":false,"cy":5.911994118327609,"rightRoofHeight":5,"type":"Wall","lx":30.771479827695373,"rightPoint":[-13.948039241784572,5.911994118327607,0],"parentId":"51jEtCS88nBPdVJc1fit8Y","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"locked":false,"rightJoints":["fVkwHoLMqjGDdZWbofbtKG"],"cz":0,"leftPoint":[16.823440585910813,-5.705218022759548,0],"rightPoint":[16.8234405859108,5.91199411832761,0],"selected":false,"color":"white","cx":16.823440585910806,"lx":11.617212141087158,"leftRoofHeight":5,"normal":[0,0,1],"id":"nM3F4oVEiNnPXXKHuymBW8","textureType":"Wall Texture Default","foundationId":"51jEtCS88nBPdVJc1fit8Y","parentId":"51jEtCS88nBPdVJc1fit8Y","rightRoofHeight":5,"rotation":[0,0,-0.41015237421866746],"type":"Wall","lz":5,"roofId":"79Z3Q6kmRSdUu2gZAfxqYU","ly":0.3,"cy":0.10338804778403077,"leftJoints":["hjhpbBLzTxiFBJngNEFjyo"],"relativeAngle":1.570796326794898,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftPoint":[-13.94803924178457,-5.705218022759548,0],"selected":false,"normal":[0,0,1],"type":"Wall","leftRoofHeight":5,"roofId":"79Z3Q6kmRSdUu2gZAfxqYU","foundationId":"51jEtCS88nBPdVJc1fit8Y","cy":-5.705218022759548,"locked":false,"rightPoint":[16.823440585910813,-5.705218022759548,0],"rightRoofHeight":5,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"cz":0,"cx":1.4377006720631211,"rightJoints":["nM3F4oVEiNnPXXKHuymBW8"],"textureType":"Wall Texture Default","lx":30.771479827695384,"color":"white","relativeAngle":0,"lz":5,"leftJoints":["pVB4qAvwgYktWUYmnpXrvd"],"id":"hjhpbBLzTxiFBJngNEFjyo","parentId":"51jEtCS88nBPdVJc1fit8Y","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"locked":false,"cx":-13.94803924178457,"rightJoints":["hjhpbBLzTxiFBJngNEFjyo"],"lx":11.617212141087155,"rightPoint":[-13.94803924178457,-5.705218022759548,0],"leftRoofHeight":5,"id":"pVB4qAvwgYktWUYmnpXrvd","roofId":"79Z3Q6kmRSdUu2gZAfxqYU","cy":0.10338804778402944,"type":"Wall","selected":false,"rightRoofHeight":5,"leftPoint":[-13.948039241784572,5.911994118327607,0],"relativeAngle":-1.5707963267948966,"color":"white","foundationId":"51jEtCS88nBPdVJc1fit8Y","normal":[0,0,1],"leftJoints":["fVkwHoLMqjGDdZWbofbtKG"],"textureType":"Wall Texture Default","lz":5,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"parentId":"51jEtCS88nBPdVJc1fit8Y","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cz":0.5,"locked":false,"id":"51jEtCS88nBPdVJc1fit8Y","cx":-48.38996233223847,"rotation":[0,0,-0.41015237421866746],"cy":-47.44094494420046,"type":"Foundation","solarUpdraftTower":{},"solarAbsorberPipe":{},"color":"#808080","ly":12.435067202411405,"parentId":"Ground","selected":false,"lx":39.55613553448626,"solarPowerTower":{},"lz":1,"normal":[0,0,1]},{"relativeAngle":1.5696801656994488,"lx":11.718328338430736,"lz":12,"color":"white","id":"axApxDk7fg6kdu31qZJjpa","leftRoofHeight":12,"selected":false,"locked":false,"rightPoint":[15.013079539479257,-11.281678961006579,0],"textureType":"Wall Texture Default","rightRoofHeight":12,"showLabel":false,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","cy":-17.14083948050329,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","roofId":"8jjNTNMVuPtviaQ4z8aUBg","type":"Wall","leftPoint":[15,-23,0],"rotation":[0,0,0],"ly":0.3,"lineWidth":0.2,"normal":[0,0,1],"cx":15.006539769739629,"cz":0,"rightJoints":[],"leftJoints":["qPSY4fD3E14vaHrFvAVhoM"],"lineColor":"black","windows":[],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"showLabel":false,"rotation":[0,0,0],"lineWidth":0.2,"relativeAngle":0,"type":"Wall","normal":[0,0,1],"cx":0.75,"lz":12,"lineColor":"black","rightRoofHeight":12,"lx":28.5,"leftPoint":[-13.5,-23,0],"windows":[],"leftJoints":["qfMw91HFwbo5hsC2LrExL9"],"locked":false,"roofId":"8jjNTNMVuPtviaQ4z8aUBg","id":"qPSY4fD3E14vaHrFvAVhoM","cz":0,"leftRoofHeight":12,"ly":0.3,"rightJoints":["axApxDk7fg6kdu31qZJjpa"],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","textureType":"Wall Texture Default","color":"white","rightPoint":[15,-22.999999999999993,0],"cy":-22.999999999999996,"selected":false,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"type":"Wall","leftRoofHeight":12,"leftJoints":[],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","normal":[0,0,1],"roofId":"8jjNTNMVuPtviaQ4z8aUBg","windows":[],"lineColor":"black","locked":false,"showLabel":false,"rotation":[0,0,0],"leftPoint":[-13.486920460520745,-20.781678961006566,0],"cx":-13.493460230260371,"cy":-21.89083948050328,"rightRoofHeight":12,"lz":12,"rightPoint":[-13.5,-23,0],"rightJoints":["qPSY4fD3E14vaHrFvAVhoM"],"selected":false,"lx":2.2183595980800535,"color":"white","id":"qfMw91HFwbo5hsC2LrExL9","lineWidth":0.2,"relativeAngle":4.706492905071611,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","ly":0.3,"textureType":"Wall Texture Default","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","type":"Cuboid","rotation":[0,0,-0.41015237421866746],"lz":15,"locked":false,"color":"gray","selected":false,"cx":-36.56959623779416,"cz":7.5,"id":"tweiiVLhdx6oBWEnEtnipE","faceColors":["gray","gray","gray","gray","gray","gray"],"ly":3.089724753674105,"cy":-41.66817975093342,"lx":9.664636900370548},{"selected":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.41015237421866746],"lx":5.865449300431789,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"type":"Cuboid","parentId":"Ground","id":"rsUvVCPdmqPJntvXeM2GVb","cx":-44.38865117345025,"locked":false,"cz":7.5,"ly":1.5650109734892819,"lz":15,"color":"gray","cy":-40.96079721670519},{"lx":3.0249690735409964,"cx":-28.99251915905568,"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"type":"Cuboid","cz":7.5,"color":"gray","locked":false,"lz":15,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"selected":false,"ly":2.6391120002649107,"id":"fkBTP56VVn81KwB625hk51","cy":-31.500761697700995,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1]},{"color":"gray","type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"ly":1.012024715192918,"parentId":"Ground","selected":false,"cx":-55.01870252082621,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"sd5KLhyrNizECe9gb6KsQr","lz":15,"lx":1.0626113345203119,"cz":7.5,"locked":false,"rotation":[0,0,-0.41015237421866746],"cy":-33.468482869791565},{"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"locked":false,"cx":-31.1067471882413,"lx":1.4142777966890399,"parentId":"Ground","selected":false,"id":"uMjoRxmZFJiEozXunGCtEk","cz":7.5,"cy":-28.926011393490615,"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":15,"color":"gray","rotation":[0,0,-0.41015237421866746],"ly":1.5089496296253628},{"cz":7.5,"color":"gray","lz":15,"lx":1.4142777966890399,"cy":-19.94113390915151,"type":"Cuboid","selected":false,"id":"vnrmWArXJmER4412akTEze","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"ly":1.5089496296253628,"cx":-27.239009141660663,"locked":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground","rotation":[0,0,-0.41015237421866746]},{"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"cx":-26.10325222179982,"cz":7.5,"ly":2.6391120002649107,"cy":-24.7401297358751,"selected":false,"locked":false,"lz":15,"lx":3.0249690735409964,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","color":"gray","id":"sgZFM1eyn2EqyhNUVokoxt"},{"cy":-45.1003153467037,"lz":15,"ly":1.012024715192918,"normal":[0,0,1],"cx":-34.012367343427655,"parentId":"Ground","cz":7.5,"type":"Cuboid","lx":1.0626113345203119,"selected":false,"locked":false,"rotation":[0,0,-0.41015237421866746],"id":"t9SieBbjr7gB8ZfmMfPkkv","color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"cz":6,"type":"Cuboid","normal":[0,0,1],"cy":2.6351006761143005,"locked":false,"parentId":"Ground","cx":-57.48268699848795,"lx":1.921551368829732,"faceColors":["gray","gray","gray","gray","gray","gray"],"ly":1.170092177740421,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":12,"id":"f6gjMamZeJ9AforAMb7sba","selected":false,"color":"gray","rotation":[0,0,-0.41015237421866746]},{"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"cz":6,"ly":1.170092177740421,"cx":-46.79299933184681,"type":"Cuboid","parentId":"Ground","cy":32.079219880108276,"color":"gray","lx":1.921551368829732,"lz":12,"selected":false,"locked":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"id":"uZN8yxuazrtq9vtfvNYjW8","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"selected":false,"id":"kCUndw17uk69evYZvDbpA3","locked":false,"lx":3.8078632615679346,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":17.85994953380947,"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"ly":1.8431797229103413,"faceColors":["gray","gray","gray","gray","gray","gray"],"type":"Cuboid","normal":[0,0,1],"lz":12,"color":"gray","cx":-15.533010162096012,"cz":6},{"selected":false,"cz":6,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","cy":23.773736942115185,"ly":1.8431797229103413,"color":"gray","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false,"lx":3.8078632615679346,"id":"c5CHPFsUadwXiYeCQ5kL3M","type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"lz":12,"cx":-29.102366745520293},{"faceColors":["gray","gray","gray","gray","gray","gray"],"type":"Cuboid","selected":false,"cy":19.328580088899457,"ly":1.5089496296253628,"cz":5,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false,"cx":-6.919453557487373,"normal":[0,0,1],"color":"gray","parentId":"Ground","id":"qMykCJZ7DBxwNpVWKYScqJ","lz":10,"rotation":[0,0,-0.41015237421866746],"lx":1.4142777966890399},{"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"cy":22.10130410795824,"selected":false,"parentId":"Ground","type":"Cuboid","ly":1.5089496296253628,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":10,"rotation":[0,0,-0.41015237421866746],"id":"mSqbavJzutA9zhAu8xE3xS","normal":[0,0,1],"cz":5,"lx":1.4142777966890399,"locked":false,"cx":-5.974746211405201},{"lx":1.4142777966890399,"id":"pyDFzHD4KAB1BNqMnzD6wS","type":"Cuboid","lz":10,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":1.5089496296253628,"cz":5,"cy":46.28392644240339,"color":"gray","selected":false,"locked":false,"cx":-22.974716021978587,"faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","normal":[0,0,1]},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"gray","normal":[0,0,1],"lz":10,"id":"3niC4znTpJLi9xPdZ3J3mi","locked":false,"ly":1.5089496296253628,"type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"cx":-19.844681452337475,"cz":5,"lx":1.4142777966890399,"cy":44.91410182205283,"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"selected":false},{"id":"kmb6FinDNPjHaUSx4hWkRY","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"cz":6,"lx":2.409551412544647,"cx":0.8488303977586087,"ly":2.2160601102189608,"cy":59.792631721777234,"selected":false,"type":"Cuboid","lz":12,"color":"gray","locked":false},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"cy":64.33483423541351,"normal":[0,0,1],"lx":2.815013454740496,"selected":false,"parentId":"Ground","id":"jdUgLxxS7aoo8G5FKM1bpd","color":"gray","locked":false,"lz":12,"cx":-10.431764953695687,"type":"Cuboid","rotation":[0,0,-0.41015237421866746],"cz":6,"ly":3.1077135053990776},{"cx":-28.610884157233254,"cy":60.58459939907478,"color":"gray","selected":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cz":4,"id":"mQbRKyuR5iBvfSyrTNXPkk","type":"Cuboid","locked":false,"normal":[0,0,1],"lx":2.5003437899627516,"parentId":"Ground","lz":8,"ly":6.3419454417230305,"rotation":[0,0,-0.41015237421866746],"faceColors":["gray","gray","gray","gray","gray","gray"]},{"lz":8,"rotation":[0,0,-0.41015237421866746],"id":"bK5YCpcen6fCBKp3RRNqEh","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","selected":false,"color":"gray","cy":68.11631889207206,"faceColors":["gray","gray","gray","gray","gray","gray"],"locked":false,"lx":1.9416600589072726,"ly":1.989767039492348,"type":"Cuboid","cx":-36.29885094967864,"cz":4,"normal":[0,0,1]},{"normal":[0,0,1],"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"lz":8,"type":"Cuboid","ly":1.989767039492348,"rotation":[0,0,-0.41015237421866746],"cx":-38.338758743868084,"selected":false,"color":"gray","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cz":4,"cy":63.07951549965926,"locked":false,"lx":1.9416600589072726,"id":"jmsNe53MLv3GKAG45iZZhS"},{"locked":false,"showLabel":false,"thickness":0.2,"type":"Roof","normal":[0,0,1],"color":"#ffffff","cz":0,"parentId":"pdEGhJFD3W3BmcX1EPbyWH","roofType":"Pyramid","lz":0,"lx":0,"selected":false,"id":"u17BQ8h2PCTPBYHjaSoxnN","lineWidth":0.2,"cx":0,"lineColor":"black","foundationId":"pdEGhJFD3W3BmcX1EPbyWH","wallsId":["9QvBYUfBnBzYQEjDjyYwwJ","3Yax97DpPm9sAXkyokJjCv","2zTB9zP2crzAGhXAKtKuuQ","e9GuUTJEvD6Q7osTyxTwrk"],"cy":0,"textureType":"No Roof Texture","ly":0,"rotation":[0,0,0],"rise":0,"ceiling":false},{"lz":0,"lineWidth":0.2,"color":"#ffffff","selected":false,"rotation":[0,0,0],"cy":0,"cz":0,"type":"Roof","textureType":"No Roof Texture","foundationId":"gEHbpQXkCu9RtbMyy3Xryz","parentId":"gEHbpQXkCu9RtbMyy3Xryz","roofType":"Pyramid","showLabel":false,"lx":0,"id":"8JTXb2hRmgAaiTxMs35gh1","ly":0,"normal":[0,0,1],"thickness":0.2,"locked":false,"wallsId":["e5up5WS9fCbKNmdUhKFsh6","ncaNE7qPYcxTMDrSjrKjqC","4z9pAxyVBGgvcBfL2oBkTg","9Zt1Jh2MmnkaBKaBtYD19E","vmWMc4Nmqnx9AxgePRvtFK","jmovDX25miN2VZhEhqh9uy","wxDvuiUvYK71aR1xZ9r86C","pk5HH5mW7Fkgf2nUSMZyW9"],"lineColor":"black","cx":0,"rise":0,"ceiling":false},{"lz":0,"showLabel":false,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","id":"iLELU7fMnA7QkYUmgQBEWM","lineWidth":0.2,"textureType":"No Roof Texture","locked":false,"cy":0,"selected":false,"type":"Roof","lineColor":"black","cx":0,"normal":[0,0,1],"roofType":"Pyramid","rotation":[0,0,0],"thickness":0.2,"color":"#ffffff","ly":0,"wallsId":["2TSEdoLpnDva8vLd5CzUbS","o6KGNbWFg87od5BX9EpsTo","9NzKjLTF3oM85YSQpL4gnd","qVHFnW8AAY4XUoieeiErxH","uSo7fsB5ruR2pmb3hS5LJZ","4HqBTHcSgWW5QKhSZyPhns","susL6EqdzG6nqxMNGZaDXi","g6f1sfDxicEvG7uLqaixdo"],"cz":0,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","lx":0,"rise":0,"ceiling":false},{"normal":[0,0,1],"textureType":"No Roof Texture","selected":false,"thickness":0.2,"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","showLabel":false,"lineColor":"black","color":"#ffffff","wallsId":["cEMfGqLjg1Ef23MmrZJMBi","oiFAJnXcnAH7zdnComwnZ7","wQJum4dZFQ5ppcaqoirdh1","bQ2Kx7puBgpzyzLtLqMSws"],"locked":false,"type":"Roof","lineWidth":0.2,"lz":0,"roofType":"Pyramid","cy":0,"cz":0,"parentId":"wBnvyTf1aAJoT1h5Lem3nN","lx":0,"cx":0,"rotation":[0,0,0],"ly":0,"id":"1qyyipEsGS2s5T9XgP6Hmh","rise":0,"ceiling":false},{"color":"#ffffff","roofType":"Pyramid","foundationId":"bEJsUFdHaD6DHGcx6x8yR6","wallsId":["arZ3wqpChkyUrckbL7omCG","xrxYGVSxLCof2hSDyYDBhi","3VxH8hmRUhtWZN2xHFt4SG","wv4UgZqFkoaJSym14cGEUi"],"id":"gTmk5BL11HKrSyJkFQtskK","cy":0,"locked":false,"cz":0,"thickness":0.2,"parentId":"bEJsUFdHaD6DHGcx6x8yR6","lineColor":"black","lineWidth":0.2,"normal":[0,0,1],"rotation":[0,0,0],"lz":0,"showLabel":false,"selected":false,"ly":0,"textureType":"No Roof Texture","type":"Roof","lx":0,"cx":0,"rise":0,"ceiling":false},{"locked":false,"wallsId":["hjhpbBLzTxiFBJngNEFjyo","nM3F4oVEiNnPXXKHuymBW8","fVkwHoLMqjGDdZWbofbtKG","pVB4qAvwgYktWUYmnpXrvd"],"showLabel":false,"roofType":"Pyramid","parentId":"51jEtCS88nBPdVJc1fit8Y","textureType":"No Roof Texture","foundationId":"51jEtCS88nBPdVJc1fit8Y","color":"#ffffff","type":"Roof","ly":0,"cy":0,"lineColor":"black","lz":0,"thickness":0.2,"lx":0,"cx":0,"rotation":[0,0,0],"normal":[0,0,1],"cz":0,"selected":false,"id":"79Z3Q6kmRSdUu2gZAfxqYU","lineWidth":0.2,"rise":0,"ceiling":false},{"roofType":"Pyramid","lineColor":"black","wallsId":["mJUeyE2zphErZr6GzDs3tZ","j1cSjqWhsVxayuMSQv24u3","svVfgRXxxLmkheyww2W4ad","feUXDC3dk8QN3nPhgvxRs7","8SK72dWsX2KdwBhjqAJrHR","eAv1PVUtpNQ3MSDZw48MQs","1RLyYLqhL7EB8W88F1YjMf"],"id":"g8pgyA4zcrzdfdvNphwHQy","lx":0,"cz":0,"textureType":"No Roof Texture","showLabel":false,"rotation":[0,0,0],"cy":0,"cx":0,"locked":false,"type":"Roof","thickness":0.2,"ly":0,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","normal":[0,0,1],"selected":false,"lineWidth":0.2,"color":"#ffffff","lz":0,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","rise":0,"ceiling":false},{"roofType":"Pyramid","selected":false,"locked":false,"textureType":"No Roof Texture","parentId":"9VLFJ7oUEizHpLYBMkGrSR","rotation":[0,0,0],"color":"#ffffff","type":"Roof","foundationId":"9VLFJ7oUEizHpLYBMkGrSR","lineColor":"black","lz":0,"normal":[0,0,1],"cz":0,"cy":0,"ly":0,"showLabel":false,"id":"8jjNTNMVuPtviaQ4z8aUBg","wallsId":["qfMw91HFwbo5hsC2LrExL9","qPSY4fD3E14vaHrFvAVhoM","axApxDk7fg6kdu31qZJjpa"],"thickness":0.2,"lx":0,"cx":0,"lineWidth":0.2,"rise":0,"ceiling":false},{"lx":0,"rotation":[0,0,0],"parentId":"m4iUcU4yAYwkvkodEmkEet","lineColor":"black","selected":false,"thickness":0.2,"textureType":"No Roof Texture","cz":0,"color":"#ffffff","ly":0,"id":"iCAiZhiTVrLLqoQWH1g8xu","cy":0,"showLabel":false,"cx":0,"lineWidth":0.2,"foundationId":"m4iUcU4yAYwkvkodEmkEet","roofType":"Pyramid","normal":[0,0,1],"wallsId":["dqGGsMEnQRvAtVj8JUXBJ1","fE5GSES3t1e72zkQ5eaMtN","annVBiZ5xysQxyv34DuQgv","1k4PTfybuAQ33E2nttLT4d"],"lz":0,"locked":false,"type":"Roof","rise":0,"ceiling":false},{"cx":3.772871790220627,"centerRoofHeight":[-0.5,7],"ly":0.3,"rightJoints":["mr118MYyqYHattPXCpoynG"],"relativeAngle":-3.141592653589793,"foundationId":"eP5t9YkC32dmeRk87x14Ko","rightPoint":[1.0790317820948425,2.631866526370637,0],"cz":0,"lx":5.387680016251569,"normal":[0,0,1],"type":"Wall","rotation":[0,0,-0.41015237421866746],"leftPoint":[6.466711798346411,2.6318665263706373,0],"locked":false,"lz":7,"selected":false,"leftRoofHeight":7,"color":"white","parentId":"eP5t9YkC32dmeRk87x14Ko","id":"xhZR7k2DmmA9LNkxhevkLf","rightRoofHeight":7,"textureType":"Wall Texture Default","roofId":"iM8xLCCHLJSTRMvV2ytbGw","cy":2.6318665263706373,"leftJoints":["hKD2n49XvVQhMiQhxLTwnG"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"textureType":"Wall Texture Default","roofId":"iM8xLCCHLJSTRMvV2ytbGw","color":"white","rightRoofHeight":7,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"leftRoofHeight":7,"selected":false,"cy":-0.06874335549935484,"parentId":"eP5t9YkC32dmeRk87x14Ko","leftPoint":[6.466711798346411,-2.769353237369347,0],"cx":6.466711798346411,"rightJoints":["xhZR7k2DmmA9LNkxhevkLf"],"rightPoint":[6.466711798346411,2.6318665263706373,0],"type":"Wall","lx":5.401219763739984,"locked":false,"lz":7,"relativeAngle":1.5707963267948966,"id":"hKD2n49XvVQhMiQhxLTwnG","foundationId":"eP5t9YkC32dmeRk87x14Ko","leftJoints":["tY9ds8odUyLmWNVGbRfRZS"],"ly":0.3,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"foundationId":"eP5t9YkC32dmeRk87x14Ko","leftRoofHeight":7,"textureType":"Wall Texture Default","lx":5.387680016251575,"leftPoint":[1.0790317820948367,-2.7693532373693404,0],"color":"white","parentId":"eP5t9YkC32dmeRk87x14Ko","centerRoofHeight":[0.5,7],"roofId":"iM8xLCCHLJSTRMvV2ytbGw","ly":0.3,"rightRoofHeight":7,"selected":false,"locked":false,"rightJoints":["hKD2n49XvVQhMiQhxLTwnG"],"cy":-2.7693532373693435,"rightPoint":[6.466711798346411,-2.769353237369347,0],"lz":7,"type":"Wall","relativeAngle":-1.2364019629334816e-15,"id":"tY9ds8odUyLmWNVGbRfRZS","cx":3.772871790220624,"leftJoints":["mr118MYyqYHattPXCpoynG"],"rotation":[0,0,-0.41015237421866746],"cz":2.59868595123194,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"lx":5.401219763739977,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"locked":false,"leftJoints":["xhZR7k2DmmA9LNkxhevkLf"],"parentId":"eP5t9YkC32dmeRk87x14Ko","foundationId":"eP5t9YkC32dmeRk87x14Ko","rightJoints":["tY9ds8odUyLmWNVGbRfRZS"],"cx":1.0790317820948396,"id":"mr118MYyqYHattPXCpoynG","selected":false,"relativeAngle":-1.570796326794898,"roofId":"iM8xLCCHLJSTRMvV2ytbGw","leftPoint":[1.0790317820948425,2.631866526370637,0],"color":"white","type":"Wall","textureType":"Wall Texture Default","cz":2.8306092473007007,"leftRoofHeight":7,"rightPoint":[1.0790317820948367,-2.7693532373693404,0],"rightRoofHeight":7,"lz":7,"normal":[0,0,1],"cy":-0.06874335549935173,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"color":"#808080","parentId":"Ground","type":"Foundation","lx":13.89007394070906,"cy":96.06999769870255,"id":"eP5t9YkC32dmeRk87x14Ko","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"solarPowerTower":{},"solarUpdraftTower":{},"ly":5.568881804752381,"solarAbsorberPipe":{},"cx":24.454109298590414,"cz":0.5,"selected":false,"lz":1,"locked":false},{"selected":false,"leftJoints":["1wfGxoDf2D4xggTqqerw35"],"rightRoofHeight":7,"cx":3.772871790220627,"leftRoofHeight":7,"color":"white","textureType":"Wall Texture Default","locked":false,"leftPoint":[6.466711798346411,2.6318665263706373,0],"lz":7,"lx":5.387680016251569,"parentId":"jxVQ73S6zAeTM6FAnyQm16","id":"dGhfzR7o1S6iaLXRYQQHpz","foundationId":"jxVQ73S6zAeTM6FAnyQm16","type":"Wall","normal":[0,0,1],"ly":0.3,"rightPoint":[1.0790317820948425,2.631866526370637,0],"cy":2.6318665263706373,"cz":0,"relativeAngle":-3.141592653589793,"centerRoofHeight":[-0.5,7],"rightJoints":["qauPnugYuuS7RLZjxeEFyH"],"roofId":"9Di2gUsu4cUvfnKcucwxcz","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"rightJoints":["dGhfzR7o1S6iaLXRYQQHpz"],"rightRoofHeight":7,"textureType":"Wall Texture Default","roofId":"9Di2gUsu4cUvfnKcucwxcz","type":"Wall","rotation":[0,0,-0.41015237421866746],"color":"white","foundationId":"jxVQ73S6zAeTM6FAnyQm16","cx":6.466711798346411,"id":"1wfGxoDf2D4xggTqqerw35","locked":false,"normal":[0,0,1],"relativeAngle":1.5707963267948966,"lx":5.401219763739984,"leftPoint":[6.466711798346411,-2.769353237369347,0],"lz":7,"rightPoint":[6.466711798346411,2.6318665263706373,0],"leftJoints":["6DTGHsEWy1Mj5z5EBJ8m4A"],"ly":0.3,"cz":0,"cy":-0.06874335549935484,"parentId":"jxVQ73S6zAeTM6FAnyQm16","selected":false,"leftRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"color":"white","rightPoint":[6.466711798346411,-2.769353237369347,0],"normal":[0,0,1],"selected":false,"roofId":"9Di2gUsu4cUvfnKcucwxcz","rightRoofHeight":7,"cy":-2.7693532373693435,"lz":7,"cx":3.772871790220624,"parentId":"jxVQ73S6zAeTM6FAnyQm16","leftPoint":[1.0790317820948367,-2.7693532373693404,0],"ly":0.3,"foundationId":"jxVQ73S6zAeTM6FAnyQm16","textureType":"Wall Texture Default","leftRoofHeight":7,"rightJoints":["1wfGxoDf2D4xggTqqerw35"],"rotation":[0,0,-0.41015237421866746],"cz":0,"locked":false,"lx":5.387680016251575,"id":"6DTGHsEWy1Mj5z5EBJ8m4A","relativeAngle":-1.2364019629334816e-15,"type":"Wall","centerRoofHeight":[0.5,7],"leftJoints":["qauPnugYuuS7RLZjxeEFyH"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"ly":0.3,"lx":5.401219763739977,"rotation":[0,0,-0.41015237421866746],"roofId":"9Di2gUsu4cUvfnKcucwxcz","leftPoint":[1.0790317820948425,2.631866526370637,0],"rightRoofHeight":7,"color":"white","textureType":"Wall Texture Default","foundationId":"jxVQ73S6zAeTM6FAnyQm16","leftRoofHeight":7,"locked":false,"type":"Wall","cz":0,"leftJoints":["dGhfzR7o1S6iaLXRYQQHpz"],"rightPoint":[1.0790317820948367,-2.7693532373693404,0],"parentId":"jxVQ73S6zAeTM6FAnyQm16","normal":[0,0,1],"cx":1.0790317820948396,"lz":7,"rightJoints":["6DTGHsEWy1Mj5z5EBJ8m4A"],"relativeAngle":-1.570796326794898,"cy":-0.06874335549935173,"id":"qauPnugYuuS7RLZjxeEFyH","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"solarUpdraftTower":{},"lz":1,"parentId":"Ground","solarAbsorberPipe":{},"normal":[0,0,1],"solarPowerTower":{},"id":"jxVQ73S6zAeTM6FAnyQm16","selected":false,"ly":5.568881804752381,"type":"Foundation","lx":13.89007394070906,"cz":0.5,"locked":false,"color":"#808080","cx":29.2866477996762,"rotation":[0,0,-0.41015237421866746],"cy":107.44244234980054},{"rotation":[0,0,-0.41015237421866746],"cz":0,"rightPoint":[1.0790317820948425,2.631866526370637,0],"selected":false,"color":"white","foundationId":"rDKG6AKNM5QvYPq1qfdTX1","lx":5.387680016251569,"rightRoofHeight":7,"relativeAngle":-3.141592653589793,"roofId":"gRx8iaGJs1z3AUhQF6eqGJ","normal":[0,0,1],"leftJoints":["iTrgk5UiyKug74tDSksgxe"],"ly":0.3,"locked":false,"leftPoint":[6.466711798346411,2.6318665263706373,0],"id":"nxbMX3EChmn9CzTV7CdW2h","cx":3.772871790220627,"rightJoints":["ehEH19eZNtirzGTfRqW3Hp"],"leftRoofHeight":7,"cy":2.6318665263706373,"parentId":"rDKG6AKNM5QvYPq1qfdTX1","textureType":"Wall Texture Default","lz":7,"centerRoofHeight":[-0.5,7],"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"lz":7,"rightJoints":["nxbMX3EChmn9CzTV7CdW2h"],"rightRoofHeight":7,"ly":0.3,"color":"white","rotation":[0,0,-0.41015237421866746],"cy":-0.06874335549935484,"foundationId":"rDKG6AKNM5QvYPq1qfdTX1","roofId":"gRx8iaGJs1z3AUhQF6eqGJ","rightPoint":[6.466711798346411,2.6318665263706373,0],"selected":false,"parentId":"rDKG6AKNM5QvYPq1qfdTX1","id":"iTrgk5UiyKug74tDSksgxe","cx":6.466711798346411,"cz":0,"normal":[0,0,1],"relativeAngle":1.5707963267948966,"leftRoofHeight":7,"textureType":"Wall Texture Default","lx":5.401219763739984,"type":"Wall","leftJoints":["97QKa6yKUz1mJAvuAaYQi5"],"leftPoint":[6.466711798346411,-2.769353237369347,0],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","rightRoofHeight":7,"locked":false,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","ly":0.3,"relativeAngle":-1.2364019629334816e-15,"centerRoofHeight":[0.5,7],"cx":3.772871790220624,"roofId":"gRx8iaGJs1z3AUhQF6eqGJ","rightPoint":[6.466711798346411,-2.769353237369347,0],"foundationId":"rDKG6AKNM5QvYPq1qfdTX1","leftJoints":["ehEH19eZNtirzGTfRqW3Hp"],"id":"97QKa6yKUz1mJAvuAaYQi5","leftPoint":[1.0790317820948367,-2.7693532373693404,0],"leftRoofHeight":7,"cz":0,"color":"white","selected":false,"lz":7,"lx":5.387680016251575,"cy":-2.7693532373693435,"normal":[0,0,1],"rightJoints":["iTrgk5UiyKug74tDSksgxe"],"parentId":"rDKG6AKNM5QvYPq1qfdTX1","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"rightPoint":[1.0790317820948367,-2.7693532373693404,0],"foundationId":"rDKG6AKNM5QvYPq1qfdTX1","normal":[0,0,1],"color":"white","cx":1.0790317820948396,"parentId":"rDKG6AKNM5QvYPq1qfdTX1","cy":-0.06874335549935173,"leftPoint":[1.0790317820948425,2.631866526370637,0],"leftRoofHeight":7,"locked":false,"lz":7,"leftJoints":["nxbMX3EChmn9CzTV7CdW2h"],"roofId":"gRx8iaGJs1z3AUhQF6eqGJ","ly":0.3,"type":"Wall","selected":false,"rotation":[0,0,-0.41015237421866746],"cz":0,"textureType":"Wall Texture Default","id":"ehEH19eZNtirzGTfRqW3Hp","lx":5.401219763739977,"relativeAngle":-1.570796326794898,"rightRoofHeight":7,"rightJoints":["97QKa6yKUz1mJAvuAaYQi5"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cx":34.55424337004162,"solarAbsorberPipe":{},"type":"Foundation","rotation":[0,0,-0.41015237421866746],"locked":false,"cz":0.5,"parentId":"Ground","solarPowerTower":{},"normal":[0,0,1],"ly":5.568881804752381,"cy":118.62202333064985,"lx":13.89007394070906,"solarUpdraftTower":{},"selected":false,"color":"#808080","lz":1,"id":"rDKG6AKNM5QvYPq1qfdTX1"},{"wallsId":["mr118MYyqYHattPXCpoynG"],"lz":0,"lineWidth":0.2,"textureType":"No Roof Texture","locked":false,"ridgeLeftPoint":[-0.5,1],"thickness":0.2,"cx":0,"rotation":[0,0,0],"id":"iM8xLCCHLJSTRMvV2ytbGw","foundationId":"eP5t9YkC32dmeRk87x14Ko","selected":false,"ly":0,"color":"#ffffff","cz":0,"parentId":"eP5t9YkC32dmeRk87x14Ko","ridgeRightPoint":[0.5,1],"lineColor":"black","showLabel":false,"type":"Roof","lx":0,"roofType":"Gable","normal":[0,0,1],"cy":0,"rise":0,"ceiling":false},{"ly":0,"type":"Roof","thickness":0.2,"lz":0,"wallsId":["qauPnugYuuS7RLZjxeEFyH"],"color":"#ffffff","selected":false,"ridgeRightPoint":[0.5,1],"lx":0,"ridgeLeftPoint":[-0.5,1],"normal":[0,0,1],"lineColor":"black","rotation":[0,0,0],"roofType":"Gable","locked":false,"cy":0,"parentId":"jxVQ73S6zAeTM6FAnyQm16","cz":0,"textureType":"No Roof Texture","showLabel":false,"foundationId":"jxVQ73S6zAeTM6FAnyQm16","id":"9Di2gUsu4cUvfnKcucwxcz","cx":0,"lineWidth":0.2,"rise":0,"ceiling":false},{"ly":0,"lineWidth":0.2,"cx":0,"type":"Roof","textureType":"No Roof Texture","ridgeLeftPoint":[-0.5,1],"showLabel":false,"selected":false,"cz":0,"wallsId":["ehEH19eZNtirzGTfRqW3Hp"],"rotation":[0,0,0],"lineColor":"black","color":"#ffffff","lx":0,"id":"gRx8iaGJs1z3AUhQF6eqGJ","thickness":0.2,"normal":[0,0,1],"ridgeRightPoint":[0.5,1],"parentId":"rDKG6AKNM5QvYPq1qfdTX1","locked":false,"roofType":"Gable","cy":0,"lz":0,"foundationId":"rDKG6AKNM5QvYPq1qfdTX1","rise":0,"ceiling":false},{"lx":5.387680016251569,"cz":0,"rightRoofHeight":7,"ly":0.3,"parentId":"jYYkxDDGtpRKpj5cDaSAyU","leftPoint":[-0.7148597809579893,2.6859428300134063,1],"leftJoints":["dn61jbg36CDKXJ7atWKcPL"],"normal":[0,0,1],"rightPoint":[-6.102539797209565,2.6859428300134014,1],"roofId":"8851rT9wqqajnoeFBmiUjQ","color":"white","locked":false,"selected":false,"rightJoints":["81VpPXebFdckLDhrYfjNw4"],"cy":2.685942830013403,"type":"Wall","leftRoofHeight":7,"id":"sksYhYD2dNixUEPNYJqc76","rotation":[0,0,-0.41015237421866746],"centerRoofHeight":[0.5,7],"relativeAngle":-3.141592653589793,"textureType":"Wall Texture Default","lz":7,"foundationId":"jYYkxDDGtpRKpj5cDaSAyU","cx":-3.4086997890837694,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"locked":false,"cy":-0.014667051856591229,"roofId":"8851rT9wqqajnoeFBmiUjQ","leftRoofHeight":7,"rightRoofHeight":7,"parentId":"jYYkxDDGtpRKpj5cDaSAyU","selected":false,"lz":7,"textureType":"Wall Texture Default","type":"Wall","color":"white","foundationId":"jYYkxDDGtpRKpj5cDaSAyU","leftPoint":[-0.7148597809579927,-2.7152769337265767,1],"rotation":[0,0,-0.41015237421866746],"id":"dn61jbg36CDKXJ7atWKcPL","normal":[0,0,1],"leftJoints":["x33tCm8G91uhrEhqZh7Sgp"],"cx":-0.7148597809579962,"rightPoint":[-0.7148597809579893,2.6859428300134063,1],"ly":0.3,"lx":5.401219763739984,"rightJoints":["sksYhYD2dNixUEPNYJqc76"],"relativeAngle":1.5707963267948966,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"ly":0.3,"locked":false,"rightPoint":[-0.7148597809579927,-2.7152769337265767,1],"rightJoints":["dn61jbg36CDKXJ7atWKcPL"],"id":"x33tCm8G91uhrEhqZh7Sgp","normal":[0,0,1],"lx":5.387680016251575,"roofId":"8851rT9wqqajnoeFBmiUjQ","lz":7,"rotation":[0,0,-0.41015237421866746],"parentId":"jYYkxDDGtpRKpj5cDaSAyU","relativeAngle":-1.2364019629334816e-15,"textureType":"Wall Texture Default","centerRoofHeight":[-0.5,7],"rightRoofHeight":7,"cx":-3.4086997890837756,"leftPoint":[-6.102539797209571,-2.7152769337265754,1],"cz":0,"type":"Wall","color":"white","foundationId":"jYYkxDDGtpRKpj5cDaSAyU","selected":false,"leftJoints":["81VpPXebFdckLDhrYfjNw4"],"leftRoofHeight":7,"cy":-2.715276933726573,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cy":-0.014667051856584123,"normal":[0,0,1],"leftPoint":[-6.102539797209565,2.6859428300134014,1],"rightJoints":["x33tCm8G91uhrEhqZh7Sgp"],"locked":false,"cz":0,"cx":-6.102539797209562,"lz":7,"id":"81VpPXebFdckLDhrYfjNw4","rightRoofHeight":7,"selected":false,"lx":5.401219763739977,"foundationId":"jYYkxDDGtpRKpj5cDaSAyU","roofId":"8851rT9wqqajnoeFBmiUjQ","type":"Wall","color":"white","ly":0.3,"rightPoint":[-6.102539797209571,-2.7152769337265754,1],"parentId":"jYYkxDDGtpRKpj5cDaSAyU","leftRoofHeight":7,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","relativeAngle":-1.570796326794898,"leftJoints":["sksYhYD2dNixUEPNYJqc76"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Foundation","color":"#808080","cy":78.31845915827158,"solarAbsorberPipe":{},"solarPowerTower":{},"cz":0.5,"locked":false,"ly":5.482519143209589,"normal":[0,0,1],"lz":1,"selected":false,"id":"jYYkxDDGtpRKpj5cDaSAyU","solarUpdraftTower":{},"lx":12.981345567934609,"cx":65.13740167211039,"parentId":"Ground","rotation":[0,0,-0.41015237421866746]},{"rotation":[0,0,-0.41015237421866746],"relativeAngle":-3.141592653589793,"cx":-3.4086997890837694,"cy":2.685942830013403,"rightJoints":["5BVMmeTYtWaRrB3p7N2yex"],"textureType":"Wall Texture Default","cz":0,"lx":5.387680016251569,"type":"Wall","roofId":"uhbPwQthVjoBQGqRB2bxwD","leftJoints":["nU3buhZij6ruFmt78QqHPt"],"id":"xbje76bhjMGZA3Mc8s8cWN","ly":0.3,"parentId":"dTyQpKfdgEv9kGBprmTD5p","leftRoofHeight":7,"foundationId":"dTyQpKfdgEv9kGBprmTD5p","color":"white","rightPoint":[-6.102539797209565,2.6859428300134014,1],"leftPoint":[-0.7148597809579893,2.6859428300134063,1],"locked":false,"centerRoofHeight":[0.5,7],"rightRoofHeight":7,"lz":7,"selected":false,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cz":0,"roofId":"uhbPwQthVjoBQGqRB2bxwD","cy":-0.014667051856591229,"leftRoofHeight":7,"rotation":[0,0,-0.41015237421866746],"selected":false,"textureType":"Wall Texture Default","relativeAngle":1.5707963267948966,"leftJoints":["dwNyLyogzdW8eZvvnJWmaJ"],"rightJoints":["xbje76bhjMGZA3Mc8s8cWN"],"locked":false,"foundationId":"dTyQpKfdgEv9kGBprmTD5p","lz":7,"rightRoofHeight":7,"color":"white","lx":5.401219763739984,"id":"nU3buhZij6ruFmt78QqHPt","ly":0.3,"leftPoint":[-0.7148597809579927,-2.7152769337265767,1],"cx":-0.7148597809579962,"parentId":"dTyQpKfdgEv9kGBprmTD5p","normal":[0,0,1],"type":"Wall","rightPoint":[-0.7148597809579893,2.6859428300134063,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"textureType":"Wall Texture Default","type":"Wall","leftPoint":[-6.102539797209571,-2.7152769337265754,1],"foundationId":"dTyQpKfdgEv9kGBprmTD5p","roofId":"uhbPwQthVjoBQGqRB2bxwD","cz":0,"rightJoints":["nU3buhZij6ruFmt78QqHPt"],"ly":0.3,"relativeAngle":-1.2364019629334816e-15,"rightRoofHeight":7,"cy":-2.715276933726573,"selected":false,"id":"dwNyLyogzdW8eZvvnJWmaJ","locked":false,"cx":-3.4086997890837756,"rotation":[0,0,-0.41015237421866746],"rightPoint":[-0.7148597809579927,-2.7152769337265767,1],"lx":5.387680016251575,"color":"white","normal":[0,0,1],"leftJoints":["5BVMmeTYtWaRrB3p7N2yex"],"centerRoofHeight":[-0.5,7],"parentId":"dTyQpKfdgEv9kGBprmTD5p","leftRoofHeight":7,"lz":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"leftPoint":[-6.102539797209565,2.6859428300134014,1],"selected":false,"color":"white","type":"Wall","textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"leftRoofHeight":7,"lz":7,"cx":-6.102539797209562,"leftJoints":["xbje76bhjMGZA3Mc8s8cWN"],"relativeAngle":-1.570796326794898,"id":"5BVMmeTYtWaRrB3p7N2yex","ly":0.3,"roofId":"uhbPwQthVjoBQGqRB2bxwD","rightRoofHeight":7,"cz":0,"cy":-0.014667051856584123,"rightJoints":["dwNyLyogzdW8eZvvnJWmaJ"],"lx":5.401219763739977,"locked":false,"parentId":"dTyQpKfdgEv9kGBprmTD5p","foundationId":"dTyQpKfdgEv9kGBprmTD5p","rightPoint":[-6.102539797209571,-2.7152769337265754,1],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"normal":[0,0,1],"cy":89.91033144595889,"solarPowerTower":{},"id":"dTyQpKfdgEv9kGBprmTD5p","parentId":"Ground","solarUpdraftTower":{},"locked":false,"type":"Foundation","cx":70.15208193257892,"color":"#808080","ly":5.482519143209589,"cz":0.5,"solarAbsorberPipe":{},"lz":1,"lx":12.981345567934609,"rotation":[0,0,-0.41015237421866746],"selected":false},{"leftPoint":[-0.7148597809579893,2.6859428300134063,1],"selected":false,"normal":[0,0,1],"relativeAngle":-3.141592653589793,"cz":0,"rightRoofHeight":7,"ly":0.3,"parentId":"7tr4anbazuvTAtnbTpqU9w","type":"Wall","centerRoofHeight":[0.5,7],"leftRoofHeight":7,"color":"white","locked":false,"textureType":"Wall Texture Default","rightPoint":[-6.102539797209565,2.6859428300134014,1],"lx":5.387680016251569,"rightJoints":["cK1cR6gMr6BKG2p5YWPAbz"],"rotation":[0,0,-0.41015237421866746],"roofId":"4YikGAD8ELjnqVycqWQnqk","lz":7,"id":"7R7xQ85xB9XpqZUteZ3rjG","cy":2.685942830013403,"foundationId":"7tr4anbazuvTAtnbTpqU9w","cx":-3.4086997890837694,"leftJoints":["fb2EVpNYy9jyY5yAermefj"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cz":0,"rotation":[0,0,-0.41015237421866746],"type":"Wall","relativeAngle":1.5707963267948966,"leftRoofHeight":7,"rightPoint":[-0.7148597809579893,2.6859428300134063,1],"rightRoofHeight":7,"rightJoints":["7R7xQ85xB9XpqZUteZ3rjG"],"textureType":"Wall Texture Default","leftJoints":["kYSMKReMjdXaFQpkHynQU8"],"lx":5.401219763739984,"ly":0.3,"locked":false,"parentId":"7tr4anbazuvTAtnbTpqU9w","foundationId":"7tr4anbazuvTAtnbTpqU9w","selected":false,"id":"fb2EVpNYy9jyY5yAermefj","leftPoint":[-0.7148597809579927,-2.7152769337265767,1],"cx":-0.7148597809579962,"normal":[0,0,1],"cy":-0.014667051856591229,"lz":7,"roofId":"4YikGAD8ELjnqVycqWQnqk","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"color":"white","cz":0,"normal":[0,0,1],"leftJoints":["cK1cR6gMr6BKG2p5YWPAbz"],"ly":0.3,"lz":7,"textureType":"Wall Texture Default","leftRoofHeight":7,"lx":5.387680016251575,"rightJoints":["fb2EVpNYy9jyY5yAermefj"],"cx":-3.4086997890837756,"rightRoofHeight":7,"selected":false,"rightPoint":[-0.7148597809579927,-2.7152769337265767,1],"type":"Wall","foundationId":"7tr4anbazuvTAtnbTpqU9w","cy":-2.715276933726573,"id":"kYSMKReMjdXaFQpkHynQU8","centerRoofHeight":[-0.5,7],"relativeAngle":-1.2364019629334816e-15,"rotation":[0,0,-0.41015237421866746],"parentId":"7tr4anbazuvTAtnbTpqU9w","leftPoint":[-6.102539797209571,-2.7152769337265754,1],"locked":false,"roofId":"4YikGAD8ELjnqVycqWQnqk","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"lx":5.401219763739977,"ly":0.3,"cz":0,"rightPoint":[-6.102539797209571,-2.7152769337265754,1],"parentId":"7tr4anbazuvTAtnbTpqU9w","leftRoofHeight":7,"color":"white","rightRoofHeight":7,"cx":-6.102539797209562,"leftJoints":["7R7xQ85xB9XpqZUteZ3rjG"],"locked":false,"type":"Wall","lz":7,"normal":[0,0,1],"selected":false,"leftPoint":[-6.102539797209565,2.6859428300134014,1],"roofId":"4YikGAD8ELjnqVycqWQnqk","rightJoints":["kYSMKReMjdXaFQpkHynQU8"],"foundationId":"7tr4anbazuvTAtnbTpqU9w","id":"cK1cR6gMr6BKG2p5YWPAbz","cy":-0.014667051856584123,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.570796326794898,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"selected":false,"solarPowerTower":{},"cz":0.5,"cx":75.10959011141287,"type":"Foundation","solarAbsorberPipe":{},"cy":101.13287550232491,"ly":5.482519143209589,"lx":12.981345567934609,"solarUpdraftTower":{},"id":"7tr4anbazuvTAtnbTpqU9w","locked":false,"lz":1,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","color":"#808080","normal":[0,0,1]},{"lz":0,"textureType":"No Roof Texture","foundationId":"un11oZ7V5tAhWhFKuL8M5Q","cy":0,"lineColor":"black","lineWidth":0.2,"lx":0,"wallsId":["eVDG7gqXM3uLaHhJS5k6Fh"],"ly":0,"rightRidgeLength":15.217808474550925,"selected":false,"type":"Roof","rotation":[0,0,0],"color":"#ffffff","cz":0,"thickness":0.2,"roofType":"Hip","showLabel":false,"normal":[0,0,1],"leftRidgeLength":15.217808474550925,"cx":0,"locked":false,"parentId":"un11oZ7V5tAhWhFKuL8M5Q","id":"a67eFG3dY8EiYs3GWgTwsF","rise":3,"ceiling":false},{"selected":false,"type":"Roof","cy":0,"lz":0,"cz":0,"lineWidth":0.2,"wallsId":["fHApw3eZ3j52e3Ze4hhzaH"],"color":"#ffffff","ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"foundationId":"4UZo2BLYXGN9cd3hbyQ45x","lx":0,"showLabel":false,"lineColor":"black","rotation":[0,0,0],"thickness":0.2,"roofType":"Gable","id":"8gnJuvioHBpuV9PnGGyNAB","ly":0,"locked":false,"textureType":"No Roof Texture","parentId":"4UZo2BLYXGN9cd3hbyQ45x","cx":0,"normal":[0,0,1],"rise":0,"ceiling":false},{"ly":0,"lineWidth":0.2,"thickness":0.2,"ridgeRightPoint":[0.5,1],"rotation":[0,0,0],"selected":false,"lz":0,"id":"8851rT9wqqajnoeFBmiUjQ","lineColor":"black","wallsId":["dn61jbg36CDKXJ7atWKcPL"],"ridgeLeftPoint":[-0.5,1],"cz":0,"cy":0,"foundationId":"jYYkxDDGtpRKpj5cDaSAyU","lx":0,"parentId":"jYYkxDDGtpRKpj5cDaSAyU","showLabel":false,"normal":[0,0,1],"cx":0,"roofType":"Gable","color":"#ffffff","textureType":"No Roof Texture","locked":false,"type":"Roof","rise":0,"ceiling":false},{"textureType":"No Roof Texture","lx":0,"parentId":"dTyQpKfdgEv9kGBprmTD5p","color":"#ffffff","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"lz":0,"thickness":0.2,"type":"Roof","selected":false,"showLabel":false,"cz":0,"wallsId":["nU3buhZij6ruFmt78QqHPt"],"rotation":[0,0,0],"lineWidth":0.2,"foundationId":"dTyQpKfdgEv9kGBprmTD5p","cy":0,"id":"uhbPwQthVjoBQGqRB2bxwD","lineColor":"black","ly":0,"locked":false,"normal":[0,0,1],"cx":0,"roofType":"Gable","rise":0,"ceiling":false},{"showLabel":false,"normal":[0,0,1],"parentId":"7tr4anbazuvTAtnbTpqU9w","lz":0,"lineWidth":0.2,"rotation":[0,0,0],"ly":0,"id":"4YikGAD8ELjnqVycqWQnqk","textureType":"No Roof Texture","cz":0,"roofType":"Gable","lineColor":"black","foundationId":"7tr4anbazuvTAtnbTpqU9w","lx":0,"wallsId":["fb2EVpNYy9jyY5yAermefj"],"cy":0,"cx":0,"color":"#ffffff","locked":false,"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"thickness":0.2,"type":"Roof","selected":false,"rise":0,"ceiling":false},{"lineColor":"black","thickness":0.2,"id":"sYHDayEkzyov7moz6ZSxMu","wallsId":["vBUTysuRjhgkSBTqe4LbYB"],"foundationId":"iUb7PSjszf44Zg2YisnC92","rightRidgeLength":10.468639728099076,"cy":0,"leftRidgeLength":10.502576741045827,"locked":false,"color":"#ffffff","parentId":"iUb7PSjszf44Zg2YisnC92","lz":0,"showLabel":false,"cx":0,"roofType":"Hip","normal":[0,0,1],"cz":0,"lx":0,"selected":false,"type":"Roof","textureType":"No Roof Texture","lineWidth":0.2,"ly":0,"rotation":[0,0,0],"rise":2.5,"ceiling":false},{"normal":[0,0,1],"cx":4.440892098500626e-16,"type":"Wall","ly":0.3,"relativeAngle":3.141592653589793,"rightPoint":[-3.499999999999999,5.5,0],"rotation":[0,0,-0.41015237421866746],"leftPoint":[3.5,5.5,0],"color":"white","lx":6.999999999999999,"rightRoofHeight":5.5,"lz":5.5,"locked":false,"selected":false,"leftRoofHeight":5.5,"textureType":"Wall Texture Default","roofId":"ta7dJGh8vLPXrt6JV7RiRA","cy":5.5,"id":"qefHhW7RphUHeDq16TbXhE","parentId":"rQHuxdXYQbCuq9CeyutKyt","foundationId":"rQHuxdXYQbCuq9CeyutKyt","leftJoints":["6ooz87ACe4edwrDbgzxpbv"],"rightJoints":["havXcoauCS81jHQUuLqvuh"],"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"cx":3.4999999999999982,"foundationId":"rQHuxdXYQbCuq9CeyutKyt","parentId":"rQHuxdXYQbCuq9CeyutKyt","rightPoint":[3.499999999999996,5.500000000000007,0],"lz":5.5,"relativeAngle":1.5707963267948974,"leftRoofHeight":5.5,"locked":false,"color":"white","leftPoint":[3.5,-0.5,0],"rotation":[0,0,-0.41015237421866746],"type":"Wall","roofId":"ta7dJGh8vLPXrt6JV7RiRA","leftJoints":["mr4zR49hytzuJEADGRBy6h"],"selected":false,"centerRoofHeight":[0.5,5.5],"normal":[0,0,1],"cy":2.5000000000000036,"id":"6ooz87ACe4edwrDbgzxpbv","ly":0.3,"lx":6.000000000000007,"textureType":"Wall Texture Default","rightJoints":["qefHhW7RphUHeDq16TbXhE"],"cz":0,"rightRoofHeight":5.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"roofId":"ta7dJGh8vLPXrt6JV7RiRA","rotation":[0,0,-0.41015237421866746],"leftPoint":[-3.499999999999999,5.5,0],"rightJoints":["mr4zR49hytzuJEADGRBy6h"],"color":"white","leftRoofHeight":5.5,"foundationId":"rQHuxdXYQbCuq9CeyutKyt","leftJoints":["qefHhW7RphUHeDq16TbXhE"],"rightRoofHeight":5.5,"lx":6,"relativeAngle":4.71238898038469,"cx":-3.4999999999999996,"cz":0,"normal":[0,0,1],"id":"havXcoauCS81jHQUuLqvuh","ly":0.3,"rightPoint":[-3.5,-0.5,0],"textureType":"Wall Texture Default","cy":2.5,"locked":false,"selected":false,"type":"Wall","lz":5.5,"centerRoofHeight":[-0.5,5.5],"parentId":"rQHuxdXYQbCuq9CeyutKyt","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"textureType":"Wall Texture Default","foundationId":"rQHuxdXYQbCuq9CeyutKyt","locked":false,"leftJoints":["havXcoauCS81jHQUuLqvuh"],"rightJoints":["6ooz87ACe4edwrDbgzxpbv"],"relativeAngle":3.806478941571964e-16,"rightPoint":[3.5,-0.5,0],"color":"white","rightRoofHeight":5.5,"leftRoofHeight":5.5,"leftPoint":[-3.500000000000002,-0.5000000000000027,0],"id":"mr4zR49hytzuJEADGRBy6h","ly":0.3,"lx":7.000000000000002,"type":"Wall","roofId":"ta7dJGh8vLPXrt6JV7RiRA","cx":-1.1102230246251565e-15,"cy":-0.5000000000000013,"normal":[0,0,1],"selected":false,"lz":5.5,"cz":0,"rotation":[0,0,-0.41015237421866746],"parentId":"rQHuxdXYQbCuq9CeyutKyt","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"color":"#ffffff","normal":[0,0,1],"textureType":"No Roof Texture","id":"ta7dJGh8vLPXrt6JV7RiRA","thickness":0.2,"cy":0,"foundationId":"rQHuxdXYQbCuq9CeyutKyt","selected":false,"locked":false,"ridgeRightPoint":[0.5,1],"roofType":"Gable","wallsId":["mr4zR49hytzuJEADGRBy6h"],"rotation":[0,0,-0.41015237421866746],"ly":0,"cz":0,"ridgeLeftPoint":[-0.5,1],"lx":0,"type":"Roof","cx":0,"lz":0,"parentId":"rQHuxdXYQbCuq9CeyutKyt","rise":0,"ceiling":false},{"locked":false,"solarAbsorberPipe":{},"lz":1,"ly":13.609083182601537,"cz":0.5,"type":"Foundation","id":"rQHuxdXYQbCuq9CeyutKyt","cx":-44.11791038753842,"normal":[0,0,1],"lx":9.87769053193653,"solarUpdraftTower":{},"selected":false,"cy":-106.22676257052163,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","solarPowerTower":{}},{"id":"i5GKt7QSXzDRXB7dcnVBLM","locked":false,"rotation":[0,0,2.731440279371126],"leftPoint":[3.5,5.5,0],"ly":0.3,"cy":5.5,"leftJoints":["m2eA6TxbykTmNtzzk3kJAi"],"relativeAngle":3.141592653589793,"parentId":"i7ztNW6L7rJRDK1bHdkfyV","textureType":"Wall Texture Default","cz":0,"rightPoint":[-3.499999999999999,5.5,0],"selected":false,"lz":5.5,"rightJoints":["sPS51DdhZZB8Z5PdWKEDt2"],"normal":[0,0,1],"foundationId":"i7ztNW6L7rJRDK1bHdkfyV","leftRoofHeight":5.5,"color":"white","type":"Wall","roofId":"r5b5XcBuiD8AujQ1MGfNH3","lx":6.999999999999999,"rightRoofHeight":5.5,"cx":4.440892098500626e-16,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"centerRoofHeight":[0.5,5.5],"roofId":"r5b5XcBuiD8AujQ1MGfNH3","rotation":[0,0,2.731440279371126],"foundationId":"i7ztNW6L7rJRDK1bHdkfyV","cz":0,"relativeAngle":1.5707963267948974,"color":"white","cx":3.4999999999999982,"id":"m2eA6TxbykTmNtzzk3kJAi","leftJoints":["oH8d6S7hYF3gtbhBgwNM9N"],"rightPoint":[3.499999999999996,5.500000000000007,0],"leftPoint":[3.5,-0.5,0],"lx":6.000000000000007,"locked":false,"rightJoints":["i5GKt7QSXzDRXB7dcnVBLM"],"normal":[0,0,1],"parentId":"i7ztNW6L7rJRDK1bHdkfyV","cy":2.5000000000000036,"textureType":"Wall Texture Default","ly":0.3,"rightRoofHeight":5.5,"selected":false,"lz":5.5,"leftRoofHeight":5.5,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"normal":[0,0,1],"rightJoints":["oH8d6S7hYF3gtbhBgwNM9N"],"relativeAngle":4.71238898038469,"leftPoint":[-3.499999999999999,5.5,0],"leftRoofHeight":5.5,"leftJoints":["i5GKt7QSXzDRXB7dcnVBLM"],"color":"white","selected":false,"lz":5.5,"locked":false,"rightRoofHeight":5.5,"cy":2.5,"cx":-3.4999999999999996,"type":"Wall","cz":0,"id":"sPS51DdhZZB8Z5PdWKEDt2","rightPoint":[-3.5,-0.5,0],"textureType":"Wall Texture Default","foundationId":"i7ztNW6L7rJRDK1bHdkfyV","roofId":"r5b5XcBuiD8AujQ1MGfNH3","parentId":"i7ztNW6L7rJRDK1bHdkfyV","ly":0.3,"centerRoofHeight":[-0.5,5.5],"rotation":[0,0,2.731440279371126],"lx":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"locked":false,"id":"oH8d6S7hYF3gtbhBgwNM9N","type":"Wall","leftJoints":["sPS51DdhZZB8Z5PdWKEDt2"],"rightPoint":[3.5,-0.5,0],"rotation":[0,0,2.731440279371126],"cx":-1.1102230246251565e-15,"color":"white","rightJoints":["m2eA6TxbykTmNtzzk3kJAi"],"roofId":"r5b5XcBuiD8AujQ1MGfNH3","foundationId":"i7ztNW6L7rJRDK1bHdkfyV","lx":7.000000000000002,"leftRoofHeight":5.5,"textureType":"Wall Texture Default","parentId":"i7ztNW6L7rJRDK1bHdkfyV","rightRoofHeight":5.5,"leftPoint":[-3.500000000000002,-0.5000000000000027,0],"cy":-0.5000000000000013,"cz":0,"selected":false,"lz":5.5,"relativeAngle":3.806478941571964e-16,"ly":0.3,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"parentId":"i7ztNW6L7rJRDK1bHdkfyV","selected":false,"thickness":0.2,"cy":0,"type":"Roof","foundationId":"i7ztNW6L7rJRDK1bHdkfyV","id":"r5b5XcBuiD8AujQ1MGfNH3","roofType":"Gable","lx":0,"wallsId":["oH8d6S7hYF3gtbhBgwNM9N"],"normal":[0,0,1],"ridgeRightPoint":[0.5,1],"color":"#ffffff","cz":0,"ly":0,"rotation":[0,0,2.731440279371126],"ridgeLeftPoint":[-0.5,1],"cx":0,"locked":false,"lz":0,"textureType":"No Roof Texture","rise":0,"ceiling":false},{"solarAbsorberPipe":{},"rotation":[0,0,2.731440279371126],"id":"i7ztNW6L7rJRDK1bHdkfyV","cy":-73.67535448644264,"lx":9.87769053193653,"normal":[0,0,1],"locked":false,"solarPowerTower":{},"selected":false,"cx":-30.629562336104748,"ly":13.609083182601537,"parentId":"Ground","solarUpdraftTower":{},"type":"Foundation","lz":1,"cz":0.5},{"rotation":[0,0,2.731440279371126],"leftRoofHeight":5.5,"foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","color":"white","parentId":"hSQpUbAbHNwPXWwTfmLQQ9","cz":0,"normal":[0,0,1],"selected":false,"cy":5.5,"relativeAngle":3.141592653589793,"roofId":"runBfYomSfd687Gchj63SZ","leftPoint":[3.5,5.5,0],"leftJoints":["ubJ5Kh7Kzh6DiRySw16dSF"],"locked":false,"rightJoints":["96zUdoDkw4WNfs9uwWoQAg"],"lx":6.999999999999999,"ly":0.3,"rightRoofHeight":5.5,"cx":4.440892098500626e-16,"lz":5.5,"rightPoint":[-3.499999999999999,5.5,0],"id":"3poxNxgtfpKbeLU5s5wzoP","textureType":"Wall Texture Default","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","parentId":"hSQpUbAbHNwPXWwTfmLQQ9","rightPoint":[3.499999999999996,5.500000000000007,0],"color":"white","id":"ubJ5Kh7Kzh6DiRySw16dSF","leftRoofHeight":5.5,"relativeAngle":1.5707963267948974,"normal":[0,0,1],"cx":3.4999999999999982,"roofId":"runBfYomSfd687Gchj63SZ","rotation":[0,0,2.731440279371126],"cz":0,"rightRoofHeight":5.5,"lx":6.000000000000007,"selected":false,"locked":false,"centerRoofHeight":[0.5,5.5],"ly":0.3,"leftPoint":[3.5,-0.5,0],"textureType":"Wall Texture Default","rightJoints":["3poxNxgtfpKbeLU5s5wzoP"],"leftJoints":["5n3uXwW2AJxGx3HRvGRLXX"],"cy":2.5000000000000036,"lz":5.5,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"id":"96zUdoDkw4WNfs9uwWoQAg","rightJoints":["5n3uXwW2AJxGx3HRvGRLXX"],"centerRoofHeight":[-0.5,5.5],"foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","locked":false,"type":"Wall","ly":0.3,"relativeAngle":4.71238898038469,"parentId":"hSQpUbAbHNwPXWwTfmLQQ9","leftRoofHeight":5.5,"roofId":"runBfYomSfd687Gchj63SZ","textureType":"Wall Texture Default","normal":[0,0,1],"cy":2.5,"rightPoint":[-3.5,-0.5,0],"rightRoofHeight":5.5,"lx":6,"rotation":[0,0,2.731440279371126],"cx":-3.4999999999999996,"selected":false,"color":"white","leftPoint":[-3.499999999999999,5.5,0],"leftJoints":["3poxNxgtfpKbeLU5s5wzoP"],"lz":5.5,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"selected":false,"parentId":"hSQpUbAbHNwPXWwTfmLQQ9","color":"white","leftJoints":["96zUdoDkw4WNfs9uwWoQAg"],"cy":-0.5000000000000013,"lz":5.5,"textureType":"Wall Texture Default","relativeAngle":3.806478941571964e-16,"type":"Wall","leftPoint":[-3.500000000000002,-0.5000000000000027,0],"lx":7.000000000000002,"leftRoofHeight":5.5,"roofId":"runBfYomSfd687Gchj63SZ","cx":-1.1102230246251565e-15,"rightJoints":["ubJ5Kh7Kzh6DiRySw16dSF"],"rotation":[0,0,2.731440279371126],"id":"5n3uXwW2AJxGx3HRvGRLXX","rightRoofHeight":5.5,"locked":false,"cz":0,"rightPoint":[3.5,-0.5,0],"foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","ly":0.3,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"parentId":"hSQpUbAbHNwPXWwTfmLQQ9","cy":0,"ly":0,"textureType":"No Roof Texture","lz":0,"rotation":[0,0,2.731440279371126],"ridgeRightPoint":[0.5,1],"locked":false,"type":"Roof","foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","roofType":"Gable","thickness":0.2,"color":"#ffffff","id":"runBfYomSfd687Gchj63SZ","selected":false,"wallsId":["5n3uXwW2AJxGx3HRvGRLXX"],"normal":[0,0,1],"cz":0,"ridgeLeftPoint":[-0.5,1],"cx":0,"lx":0,"rise":0,"ceiling":false},{"solarAbsorberPipe":{},"type":"Foundation","rotation":[0,0,2.731440279371126],"selected":false,"solarUpdraftTower":{},"cx":-20.62568109333218,"lz":1,"id":"hSQpUbAbHNwPXWwTfmLQQ9","ly":13.609083182601537,"cy":-78.08358970074559,"locked":false,"parentId":"Ground","lx":9.87769053193653,"cz":0.5,"normal":[0,0,1],"solarPowerTower":{}},{"id":"g5QrsNM3GmBsG5THTKDrtm","lx":0,"lz":0,"locked":false,"color":"#ffffff","parentId":"jsSCnAypzh29RxPH7MED73","thickness":0.2,"showLabel":false,"cx":0,"textureType":"No Roof Texture","ridgeLeftPoint":[-0.5,1],"rotation":[0,0,0],"cy":0,"lineColor":"black","roofType":"Gable","normal":[0,0,1],"type":"Roof","selected":false,"wallsId":["6QCJ15fiFxBVfmQVYdq3Tt"],"ly":0,"ridgeRightPoint":[0.5,1],"cz":0,"lineWidth":0.2,"foundationId":"jsSCnAypzh29RxPH7MED73","rise":0,"ceiling":false},{"locked":false,"ly":0.3,"lz":11,"rightRoofHeight":11,"textureType":"Wall Texture Default","cy":1.3672430244223936,"cz":0,"selected":false,"roofId":"vSTpyGi1WSV73vjm9ifaVF","type":"Wall","color":"white","leftRoofHeight":11,"rightJoints":["6h7WjPWFBQymjBKRVYEU1F"],"relativeAngle":3.1415926535897927,"normal":[0,0,1],"foundationId":"tL1dWhNk5SYJrYMJekBQPT","leftPoint":[3.0949416757515893,1.3672430244223912,0],"parentId":"tL1dWhNk5SYJrYMJekBQPT","rotation":[0,0,-0.41015237421866746],"leftJoints":["884js7wUi92VZEx6c9MoMb"],"lx":6.167453096699541,"id":"sjiccDfBPmjs7njCd2f7Zn","rightPoint":[-3.072511420947951,1.3672430244223959,0],"cx":0.01121512740181907,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":7.1624734368285194,"type":"Wall","ly":0.3,"textureType":"Wall Texture Default","foundationId":"tL1dWhNk5SYJrYMJekBQPT","leftJoints":["bbdCECR63r6BPqRgAaaEkx"],"rotation":[0,0,-0.41015237421866746],"centerRoofHeight":[-0.5,11],"cz":0,"roofId":"vSTpyGi1WSV73vjm9ifaVF","rightPoint":[3.0949416757515893,1.3672430244223912,0],"leftPoint":[3.094941675751588,-5.795230412406128,0],"cx":3.0949416757515884,"rightRoofHeight":11,"rightJoints":["sjiccDfBPmjs7njCd2f7Zn"],"color":"white","normal":[0,0,1],"leftRoofHeight":11,"parentId":"tL1dWhNk5SYJrYMJekBQPT","relativeAngle":1.5707963267948963,"selected":false,"id":"884js7wUi92VZEx6c9MoMb","cy":-2.2139936939918683,"lz":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"rightPoint":[3.094941675751588,-5.795230412406128,0],"leftRoofHeight":11,"selected":false,"id":"bbdCECR63r6BPqRgAaaEkx","rightJoints":["884js7wUi92VZEx6c9MoMb"],"rightRoofHeight":11,"cx":0.011215127401820624,"parentId":"tL1dWhNk5SYJrYMJekBQPT","relativeAngle":0,"cz":0,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","cy":-5.795230412406128,"color":"white","lz":11,"leftJoints":["6h7WjPWFBQymjBKRVYEU1F"],"locked":false,"roofId":"vSTpyGi1WSV73vjm9ifaVF","type":"Wall","leftPoint":[-3.0725114209479467,-5.795230412406128,0],"foundationId":"tL1dWhNk5SYJrYMJekBQPT","lx":6.167453096699535,"normal":[0,0,1],"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"rightPoint":[-3.0725114209479467,-5.795230412406128,0],"locked":false,"rightRoofHeight":11,"normal":[0,0,1],"selected":false,"relativeAngle":-1.570796326794896,"color":"white","lx":7.162473436828524,"type":"Wall","rotation":[0,0,-0.41015237421866746],"cx":-3.072511420947949,"leftPoint":[-3.072511420947951,1.3672430244223959,0],"ly":0.3,"foundationId":"tL1dWhNk5SYJrYMJekBQPT","textureType":"Wall Texture Default","id":"6h7WjPWFBQymjBKRVYEU1F","cz":0,"centerRoofHeight":[0.5,11],"lz":11,"leftRoofHeight":11,"rightJoints":["bbdCECR63r6BPqRgAaaEkx"],"parentId":"tL1dWhNk5SYJrYMJekBQPT","cy":-2.213993693991866,"roofId":"vSTpyGi1WSV73vjm9ifaVF","leftJoints":["sjiccDfBPmjs7njCd2f7Zn"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"foundationId":"tL1dWhNk5SYJrYMJekBQPT","cz":0,"textureType":"No Roof Texture","lz":0,"lx":0,"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"rotation":[0,0,0],"cy":0,"type":"Roof","selected":false,"cx":0,"ly":0,"thickness":0.2,"wallsId":["sjiccDfBPmjs7njCd2f7Zn"],"id":"vSTpyGi1WSV73vjm9ifaVF","parentId":"tL1dWhNk5SYJrYMJekBQPT","color":"#ffffff","roofType":"Gable","locked":false,"normal":[0,0,1],"rise":0,"ceiling":false},{"cy":-47.30267633910208,"color":"#808080","rotation":[0,0,-0.41015237421866746],"parentId":"Ground","cx":33.062760716057014,"lz":1,"solarUpdraftTower":{},"ly":12.02473099186649,"solarAbsorberPipe":{},"normal":[0,0,1],"lx":6.9193101388799265,"locked":false,"selected":false,"cz":0.5,"id":"tL1dWhNk5SYJrYMJekBQPT","solarPowerTower":{},"type":"Foundation"},{"textureType":"Wall Texture Default","normal":[0,0,1],"locked":false,"cz":0,"lz":11,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"parentId":"fHceZhM7YfHkRpJA2Esq6q","leftJoints":["bsAJpLn9jN322sM8DpUqNT"],"color":"white","rightRoofHeight":11,"rightJoints":["9zXV5uFN4dSMYxBWBituAB"],"foundationId":"fHceZhM7YfHkRpJA2Esq6q","relativeAngle":3.1415926535897927,"roofId":"uKCQp7m7UvcYMBhFBR8GT7","cx":0.01121512740181907,"lx":6.167453096699541,"leftRoofHeight":11,"leftPoint":[3.0949416757515893,1.3672430244223912,0],"rightPoint":[-3.072511420947951,1.3672430244223959,0],"id":"jDBrbsB7AgYxXtiw7hRkBD","selected":false,"cy":1.3672430244223936,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cx":3.0949416757515884,"relativeAngle":1.5707963267948963,"centerRoofHeight":[-0.5,11],"parentId":"fHceZhM7YfHkRpJA2Esq6q","cy":-2.2139936939918683,"normal":[0,0,1],"rightPoint":[3.0949416757515893,1.3672430244223912,0],"color":"white","textureType":"Wall Texture Default","roofId":"uKCQp7m7UvcYMBhFBR8GT7","leftPoint":[3.094941675751588,-5.795230412406128,0],"ly":0.3,"leftJoints":["qjfMazdqWCR3Emu8xMPVFZ"],"lx":7.1624734368285194,"foundationId":"fHceZhM7YfHkRpJA2Esq6q","selected":false,"rightRoofHeight":11,"locked":false,"leftRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"rightJoints":["jDBrbsB7AgYxXtiw7hRkBD"],"lz":11,"cz":0,"type":"Wall","id":"bsAJpLn9jN322sM8DpUqNT","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":6.167453096699535,"leftJoints":["9zXV5uFN4dSMYxBWBituAB"],"relativeAngle":0,"color":"white","rightRoofHeight":11,"normal":[0,0,1],"id":"qjfMazdqWCR3Emu8xMPVFZ","ly":0.3,"lz":11,"cx":0.011215127401820624,"rightPoint":[3.094941675751588,-5.795230412406128,0],"roofId":"uKCQp7m7UvcYMBhFBR8GT7","textureType":"Wall Texture Default","type":"Wall","selected":false,"cy":-5.795230412406128,"parentId":"fHceZhM7YfHkRpJA2Esq6q","leftRoofHeight":11,"locked":false,"leftPoint":[-3.0725114209479467,-5.795230412406128,0],"rotation":[0,0,-0.41015237421866746],"cz":0,"rightJoints":["bsAJpLn9jN322sM8DpUqNT"],"foundationId":"fHceZhM7YfHkRpJA2Esq6q","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cy":-2.213993693991866,"parentId":"fHceZhM7YfHkRpJA2Esq6q","rightPoint":[-3.0725114209479467,-5.795230412406128,0],"id":"9zXV5uFN4dSMYxBWBituAB","leftPoint":[-3.072511420947951,1.3672430244223959,0],"lx":7.162473436828524,"locked":false,"rightJoints":["qjfMazdqWCR3Emu8xMPVFZ"],"centerRoofHeight":[0.5,11],"selected":false,"color":"white","textureType":"Wall Texture Default","cz":0,"leftRoofHeight":11,"cx":-3.072511420947949,"leftJoints":["jDBrbsB7AgYxXtiw7hRkBD"],"foundationId":"fHceZhM7YfHkRpJA2Esq6q","ly":0.3,"roofId":"uKCQp7m7UvcYMBhFBR8GT7","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"rightRoofHeight":11,"lz":11,"type":"Wall","relativeAngle":-1.570796326794896,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":0,"cz":0,"thickness":0.2,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"ly":0,"selected":false,"parentId":"fHceZhM7YfHkRpJA2Esq6q","wallsId":["jDBrbsB7AgYxXtiw7hRkBD"],"textureType":"No Roof Texture","foundationId":"fHceZhM7YfHkRpJA2Esq6q","cy":0,"roofType":"Gable","id":"uKCQp7m7UvcYMBhFBR8GT7","color":"#ffffff","type":"Roof","locked":false,"cx":0,"rotation":[0,0,0],"lz":0,"normal":[0,0,1],"rise":0,"ceiling":false},{"type":"Foundation","selected":false,"cz":0.5,"lx":6.9193101388799265,"parentId":"Ground","cx":25.793727800925453,"solarPowerTower":{},"ly":12.02473099186649,"color":"#808080","solarUpdraftTower":{},"lz":1,"solarAbsorberPipe":{},"id":"fHceZhM7YfHkRpJA2Esq6q","normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"cy":-44.150742219854976,"locked":false},{"id":"eDUMHr2NcH2Gn7xk4o7aw9","cy":1.3672430244223936,"textureType":"Wall Texture Default","lx":6.167453096699541,"relativeAngle":3.1415926535897927,"rotation":[0,0,2.731440279371126],"rightJoints":["dBRLXzBSe497rzH2ZCcM82"],"roofId":"4m5SMiyzXUqv7MDwHxMrqg","type":"Wall","normal":[0,0,1],"parentId":"fs8r4ERWJ4tuBZW1NUtMpb","lz":11,"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","rightRoofHeight":11,"cz":0,"ly":0.3,"cx":0.01121512740181907,"leftRoofHeight":11,"rightPoint":[-3.072511420947951,1.3672430244223959,0],"color":"white","leftJoints":["6ev87RFfruvs5gvArbaReo"],"selected":false,"leftPoint":[3.0949416757515893,1.3672430244223912,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":7.1624734368285194,"cy":-2.2139936939918683,"normal":[0,0,1],"rightJoints":["eDUMHr2NcH2Gn7xk4o7aw9"],"rightPoint":[3.0949416757515893,1.3672430244223912,0],"rotation":[0,0,2.731440279371126],"relativeAngle":1.5707963267948963,"lz":11,"selected":false,"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","type":"Wall","roofId":"4m5SMiyzXUqv7MDwHxMrqg","leftJoints":["wYP5AC8pKwpu2zvkHKJuyw"],"parentId":"fs8r4ERWJ4tuBZW1NUtMpb","centerRoofHeight":[-0.5,11],"color":"white","textureType":"Wall Texture Default","leftRoofHeight":11,"cx":3.0949416757515884,"cz":0,"leftPoint":[3.094941675751588,-5.795230412406128,0],"id":"6ev87RFfruvs5gvArbaReo","ly":0.3,"rightRoofHeight":11,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cx":0.011215127401820624,"color":"white","parentId":"fs8r4ERWJ4tuBZW1NUtMpb","relativeAngle":0,"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","id":"wYP5AC8pKwpu2zvkHKJuyw","selected":false,"lx":6.167453096699535,"type":"Wall","rightPoint":[3.094941675751588,-5.795230412406128,0],"lz":11,"rightRoofHeight":11,"normal":[0,0,1],"leftRoofHeight":11,"rightJoints":["6ev87RFfruvs5gvArbaReo"],"cy":-5.795230412406128,"rotation":[0,0,2.731440279371126],"textureType":"Wall Texture Default","cz":0,"roofId":"4m5SMiyzXUqv7MDwHxMrqg","leftPoint":[-3.0725114209479467,-5.795230412406128,0],"leftJoints":["dBRLXzBSe497rzH2ZCcM82"],"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"rightJoints":["wYP5AC8pKwpu2zvkHKJuyw"],"textureType":"Wall Texture Default","lz":11,"cy":-2.213993693991866,"roofId":"4m5SMiyzXUqv7MDwHxMrqg","cz":0,"rightPoint":[-3.0725114209479467,-5.795230412406128,0],"ly":0.3,"relativeAngle":-1.570796326794896,"type":"Wall","lx":7.162473436828524,"rightRoofHeight":11,"centerRoofHeight":[0.5,11],"color":"white","rotation":[0,0,2.731440279371126],"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","leftRoofHeight":11,"cx":-3.072511420947949,"leftPoint":[-3.072511420947951,1.3672430244223959,0],"normal":[0,0,1],"parentId":"fs8r4ERWJ4tuBZW1NUtMpb","id":"dBRLXzBSe497rzH2ZCcM82","selected":false,"leftJoints":["eDUMHr2NcH2Gn7xk4o7aw9"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Roof","id":"4m5SMiyzXUqv7MDwHxMrqg","lz":0,"cy":0,"lx":0,"ridgeRightPoint":[0.5,1],"normal":[0,0,1],"cz":0,"wallsId":["eDUMHr2NcH2Gn7xk4o7aw9"],"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","roofType":"Gable","thickness":0.2,"textureType":"No Roof Texture","ridgeLeftPoint":[-0.5,1],"selected":false,"parentId":"fs8r4ERWJ4tuBZW1NUtMpb","color":"#ffffff","ly":0,"cx":0,"rotation":[0,0,2.731440279371126],"rise":0,"ceiling":false},{"cy":-87.33804902014363,"parentId":"Ground","id":"fs8r4ERWJ4tuBZW1NUtMpb","lz":1,"solarAbsorberPipe":{},"selected":false,"type":"Foundation","solarUpdraftTower":{},"color":"#808080","cx":24.611820076821594,"normal":[0,0,1],"ly":12.02473099186649,"rotation":[0,0,2.731440279371126],"lx":6.9193101388799265,"cz":0.5,"solarPowerTower":{}},{"type":"Wall","foundationId":"jj54TnbPPLQx19RofY6bBx","color":"white","relativeAngle":3.1415926535897927,"leftRoofHeight":11,"textureType":"Wall Texture Default","leftPoint":[3.0949416757515893,1.3672430244223912,0],"leftJoints":["a4sxwAfDyYN2ctPYayZ8Rp"],"lx":6.167453096699541,"rightJoints":["jpAZ9atyqHZpxDMMXDH32S"],"lz":11,"rightPoint":[-3.072511420947951,1.3672430244223959,0],"id":"eHL2VLecmq9sobBZmGw45i","ly":0.3,"normal":[0,0,1],"roofId":"aNwaGHwp5cd46aLgfhTdkk","rotation":[0,0,2.731440279371126],"rightRoofHeight":11,"cx":0.01121512740181907,"cz":0,"selected":false,"cy":1.3672430244223936,"parentId":"jj54TnbPPLQx19RofY6bBx","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"textureType":"Wall Texture Default","normal":[0,0,1],"centerRoofHeight":[-0.5,11],"parentId":"jj54TnbPPLQx19RofY6bBx","cz":0,"leftRoofHeight":11,"rotation":[0,0,2.731440279371126],"selected":false,"id":"a4sxwAfDyYN2ctPYayZ8Rp","foundationId":"jj54TnbPPLQx19RofY6bBx","ly":0.3,"leftJoints":["ntgMQTFPjEa6eGdeyqZWjE"],"cy":-2.2139936939918683,"rightPoint":[3.0949416757515893,1.3672430244223912,0],"roofId":"aNwaGHwp5cd46aLgfhTdkk","lz":11,"color":"white","lx":7.1624734368285194,"cx":3.0949416757515884,"leftPoint":[3.094941675751588,-5.795230412406128,0],"rightRoofHeight":11,"rightJoints":["eHL2VLecmq9sobBZmGw45i"],"relativeAngle":1.5707963267948963,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"leftPoint":[-3.0725114209479467,-5.795230412406128,0],"type":"Wall","rightPoint":[3.094941675751588,-5.795230412406128,0],"roofId":"aNwaGHwp5cd46aLgfhTdkk","lz":11,"rotation":[0,0,2.731440279371126],"rightJoints":["a4sxwAfDyYN2ctPYayZ8Rp"],"leftRoofHeight":11,"cy":-5.795230412406128,"leftJoints":["jpAZ9atyqHZpxDMMXDH32S"],"cz":0,"relativeAngle":0,"foundationId":"jj54TnbPPLQx19RofY6bBx","color":"white","cx":0.011215127401820624,"normal":[0,0,1],"rightRoofHeight":11,"ly":0.3,"lx":6.167453096699535,"selected":false,"textureType":"Wall Texture Default","id":"ntgMQTFPjEa6eGdeyqZWjE","parentId":"jj54TnbPPLQx19RofY6bBx","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"color":"white","rightJoints":["ntgMQTFPjEa6eGdeyqZWjE"],"ly":0.3,"type":"Wall","cy":-2.213993693991866,"selected":false,"rotation":[0,0,2.731440279371126],"normal":[0,0,1],"lz":11,"leftRoofHeight":11,"textureType":"Wall Texture Default","leftJoints":["eHL2VLecmq9sobBZmGw45i"],"roofId":"aNwaGHwp5cd46aLgfhTdkk","centerRoofHeight":[0.5,11],"rightRoofHeight":11,"id":"jpAZ9atyqHZpxDMMXDH32S","leftPoint":[-3.072511420947951,1.3672430244223959,0],"relativeAngle":-1.570796326794896,"foundationId":"jj54TnbPPLQx19RofY6bBx","rightPoint":[-3.0725114209479467,-5.795230412406128,0],"parentId":"jj54TnbPPLQx19RofY6bBx","cz":0,"cx":-3.072511420947949,"lx":7.162473436828524,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":0,"color":"#ffffff","normal":[0,0,1],"thickness":0.2,"wallsId":["eHL2VLecmq9sobBZmGw45i"],"ridgeRightPoint":[0.5,1],"textureType":"No Roof Texture","cy":0,"foundationId":"jj54TnbPPLQx19RofY6bBx","cx":0,"ridgeLeftPoint":[-0.5,1],"rotation":[0,0,2.731440279371126],"selected":false,"id":"aNwaGHwp5cd46aLgfhTdkk","parentId":"jj54TnbPPLQx19RofY6bBx","roofType":"Gable","lz":0,"ly":0,"type":"Roof","cz":0,"rise":0,"ceiling":false},{"color":"#808080","selected":false,"lx":6.9193101388799265,"lz":1,"type":"Foundation","cz":0.5,"solarPowerTower":{},"solarUpdraftTower":{},"ly":12.02473099186649,"parentId":"Ground","normal":[0,0,1],"solarAbsorberPipe":{},"cy":-83.96400506720003,"id":"jj54TnbPPLQx19RofY6bBx","rotation":[0,0,2.731440279371126],"cx":16.965503952859194},{"color":"white","leftJoints":["1grZuTdR63nsQE356nWnzd"],"type":"Wall","ly":0.3,"rightJoints":["273cTJKK381CJaxKCfBNJW"],"cz":0,"roofId":"5kL2iBLvr52ipCNA3bs5cq","rightPoint":[-3.072511420947951,1.3672430244223959,0],"rotation":[0,0,2.731440279371126],"lz":11,"lx":6.167453096699541,"parentId":"7sPS9WfdHAu8wqjpcnPHgs","leftRoofHeight":11,"cy":1.3672430244223936,"textureType":"Wall Texture Default","normal":[0,0,1],"relativeAngle":3.1415926535897927,"foundationId":"7sPS9WfdHAu8wqjpcnPHgs","selected":false,"cx":0.01121512740181907,"leftPoint":[3.0949416757515893,1.3672430244223912,0],"rightRoofHeight":11,"id":"qgRfDLTUB6zC4mGwstgdHV","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"relativeAngle":1.5707963267948963,"rightJoints":["qgRfDLTUB6zC4mGwstgdHV"],"leftJoints":["s1pLuQJKHQfm1KbkXQK17L"],"color":"white","rightRoofHeight":11,"ly":0.3,"leftRoofHeight":11,"lz":11,"id":"1grZuTdR63nsQE356nWnzd","parentId":"7sPS9WfdHAu8wqjpcnPHgs","roofId":"5kL2iBLvr52ipCNA3bs5cq","normal":[0,0,1],"lx":7.1624734368285194,"leftPoint":[3.094941675751588,-5.795230412406128,0],"centerRoofHeight":[-0.5,11],"foundationId":"7sPS9WfdHAu8wqjpcnPHgs","cz":0,"textureType":"Wall Texture Default","rotation":[0,0,2.731440279371126],"type":"Wall","selected":false,"rightPoint":[3.0949416757515893,1.3672430244223912,0],"cy":-2.2139936939918683,"cx":3.0949416757515884,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"color":"white","cx":0.011215127401820624,"normal":[0,0,1],"textureType":"Wall Texture Default","cz":0,"type":"Wall","ly":0.3,"lz":11,"rightJoints":["1grZuTdR63nsQE356nWnzd"],"foundationId":"7sPS9WfdHAu8wqjpcnPHgs","rotation":[0,0,2.731440279371126],"cy":-5.795230412406128,"leftPoint":[-3.0725114209479467,-5.795230412406128,0],"rightRoofHeight":11,"parentId":"7sPS9WfdHAu8wqjpcnPHgs","lx":6.167453096699535,"leftRoofHeight":11,"roofId":"5kL2iBLvr52ipCNA3bs5cq","rightPoint":[3.094941675751588,-5.795230412406128,0],"leftJoints":["273cTJKK381CJaxKCfBNJW"],"id":"s1pLuQJKHQfm1KbkXQK17L","relativeAngle":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lz":11,"rightPoint":[-3.0725114209479467,-5.795230412406128,0],"normal":[0,0,1],"type":"Wall","rotation":[0,0,2.731440279371126],"textureType":"Wall Texture Default","lx":7.162473436828524,"selected":false,"cx":-3.072511420947949,"relativeAngle":-1.570796326794896,"parentId":"7sPS9WfdHAu8wqjpcnPHgs","cy":-2.213993693991866,"cz":0,"color":"white","foundationId":"7sPS9WfdHAu8wqjpcnPHgs","id":"273cTJKK381CJaxKCfBNJW","rightJoints":["s1pLuQJKHQfm1KbkXQK17L"],"rightRoofHeight":11,"leftRoofHeight":11,"leftPoint":[-3.072511420947951,1.3672430244223959,0],"ly":0.3,"roofId":"5kL2iBLvr52ipCNA3bs5cq","centerRoofHeight":[0.5,11],"leftJoints":["qgRfDLTUB6zC4mGwstgdHV"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"ridgeRightPoint":[0.5,1],"type":"Roof","cx":0,"wallsId":["qgRfDLTUB6zC4mGwstgdHV"],"ly":0,"cz":0,"thickness":0.2,"normal":[0,0,1],"rotation":[0,0,2.731440279371126],"color":"#ffffff","lx":0,"roofType":"Gable","lz":0,"textureType":"No Roof Texture","cy":0,"id":"5kL2iBLvr52ipCNA3bs5cq","parentId":"7sPS9WfdHAu8wqjpcnPHgs","ridgeLeftPoint":[-0.5,1],"foundationId":"7sPS9WfdHAu8wqjpcnPHgs","rise":0,"ceiling":false},{"selected":false,"ly":12.02473099186649,"parentId":"Ground","cx":8.897542847512511,"lz":1,"solarPowerTower":{},"rotation":[0,0,2.731440279371126],"solarUpdraftTower":{},"solarAbsorberPipe":{},"color":"#808080","normal":[0,0,1],"cz":0.5,"cy":-80.50493585333112,"type":"Foundation","id":"7sPS9WfdHAu8wqjpcnPHgs","lx":6.9193101388799265},{"wallsId":["3JjPc2Pp9fAroM9UdivE1u"],"lx":0,"color":"#ffffff","rotation":[0,0,0],"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","showLabel":false,"textureType":"No Roof Texture","lz":0,"id":"qYDMJTekV8NWHzzCiVYwcs","type":"Roof","ridgeRightPoint":[0,1],"normal":[0,0,1],"lineColor":"black","roofType":"Gable","cx":0,"thickness":0.2,"cy":0,"parentId":"a7Ykq8sCMoZy5zM2ybNhKs","ly":0,"ridgeLeftPoint":[0,1],"cz":0,"selected":false,"lineWidth":0.2,"rise":0.9752174096903712,"ceiling":false},{"lx":9.337227070632437,"rightPoint":[-4.747688161235284,3.351698633040855,0],"lz":5.25,"rightJoints":["aS3LNujiVdR6Qawgwx71Xp"],"leftJoints":["b5WAAJ2sso2rc9V8yZ7iom"],"parentId":"b9sLhFsxP7jM5xLzyG2m8E","textureType":"Wall Texture Default","normal":[0,0,1],"type":"Wall","leftRoofHeight":5.25,"selected":false,"cz":0,"relativeAngle":3.141592653589793,"leftPoint":[4.589538909397152,3.3516986330408534,0],"color":"white","ly":0.3,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":5.25,"centerRoofHeight":[0,6.225217409690371],"roofId":"e9ZJ6jf8buNcpSGMCbcrrA","cx":-0.07907462591906578,"cy":3.3516986330408542,"foundationId":"b9sLhFsxP7jM5xLzyG2m8E","id":"bCNGD8BAzXepM4A7Cp5qfr","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"leftRoofHeight":5.25,"relativeAngle":1.5707963267948961,"lx":6.320731749368616,"color":"white","leftPoint":[4.58953890939715,-2.969033116327763,0],"cy":0.19133275835654517,"ly":0.3,"id":"b5WAAJ2sso2rc9V8yZ7iom","normal":[0,0,1],"type":"Wall","foundationId":"b9sLhFsxP7jM5xLzyG2m8E","rightPoint":[4.589538909397152,3.3516986330408534,0],"rotation":[0,0,-0.41015237421866746],"rightJoints":["bCNGD8BAzXepM4A7Cp5qfr"],"lz":5.25,"leftJoints":["9sNfcLVjGqnn14Dpdib7wD"],"rightRoofHeight":5.25,"roofId":"e9ZJ6jf8buNcpSGMCbcrrA","textureType":"Wall Texture Default","selected":false,"parentId":"b9sLhFsxP7jM5xLzyG2m8E","cz":0,"cx":4.589538909397151,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"rightPoint":[4.58953890939715,-2.969033116327763,0],"rotation":[0,0,-0.41015237421866746],"ly":0.3,"lx":9.337227070632434,"cy":-2.969033116327763,"type":"Wall","lz":5.25,"leftRoofHeight":5.25,"roofId":"e9ZJ6jf8buNcpSGMCbcrrA","leftPoint":[-4.747688161235283,-2.9690331163277626,0],"id":"9sNfcLVjGqnn14Dpdib7wD","centerRoofHeight":[0,6.225217409690371],"foundationId":"b9sLhFsxP7jM5xLzyG2m8E","selected":false,"textureType":"Wall Texture Default","cx":-0.07907462591906667,"parentId":"b9sLhFsxP7jM5xLzyG2m8E","cz":0,"relativeAngle":-4.756114491922529e-17,"leftJoints":["aS3LNujiVdR6Qawgwx71Xp"],"rightJoints":["b5WAAJ2sso2rc9V8yZ7iom"],"color":"white","rightRoofHeight":5.25,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"leftRoofHeight":5.25,"selected":false,"textureType":"Wall Texture Default","roofId":"e9ZJ6jf8buNcpSGMCbcrrA","rightPoint":[-4.747688161235283,-2.9690331163277626,0],"relativeAngle":-1.5707963267948966,"rightRoofHeight":5.25,"foundationId":"b9sLhFsxP7jM5xLzyG2m8E","lx":6.320731749368617,"color":"white","rightJoints":["9sNfcLVjGqnn14Dpdib7wD"],"parentId":"b9sLhFsxP7jM5xLzyG2m8E","id":"aS3LNujiVdR6Qawgwx71Xp","type":"Wall","normal":[0,0,1],"leftPoint":[-4.747688161235284,3.351698633040855,0],"rotation":[0,0,-0.41015237421866746],"leftJoints":["bCNGD8BAzXepM4A7Cp5qfr"],"cz":0,"ly":0.3,"cy":0.19133275835654628,"cx":-4.747688161235283,"lz":5.25,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"parentId":"b9sLhFsxP7jM5xLzyG2m8E","thickness":0.2,"ly":0,"roofType":"Gable","normal":[0,0,1],"wallsId":["b5WAAJ2sso2rc9V8yZ7iom"],"cy":0,"cz":0,"id":"e9ZJ6jf8buNcpSGMCbcrrA","ridgeRightPoint":[0,1],"foundationId":"b9sLhFsxP7jM5xLzyG2m8E","ridgeLeftPoint":[0,1],"cx":0,"rotation":[0,0,0],"selected":false,"textureType":"No Roof Texture","type":"Roof","color":"#ffffff","lz":0,"lx":0,"rise":0.9752174096903712,"ceiling":false},{"selected":false,"solarUpdraftTower":{},"lz":1,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"solarPowerTower":{},"lx":10.667610013832563,"solarAbsorberPipe":{},"color":"#808080","ly":10.658064363814518,"cz":0.5,"type":"Foundation","cx":15.65777292096255,"id":"b9sLhFsxP7jM5xLzyG2m8E","cy":-23.209117764580718,"parentId":"Ground"},{"lz":5.25,"foundationId":"gcZv1t7Cby2WKRNnett3ui","rightPoint":[-4.747688161235284,3.351698633040855,0],"leftPoint":[4.589538909397152,3.3516986330408534,0],"parentId":"gcZv1t7Cby2WKRNnett3ui","relativeAngle":3.141592653589793,"cz":0,"leftJoints":["aTEF4j2yHMBMrPfT9T9EdT"],"rightRoofHeight":5.25,"selected":false,"ly":0.3,"type":"Wall","lx":9.337227070632437,"cy":3.3516986330408542,"textureType":"Wall Texture Default","cx":-0.07907462591906578,"centerRoofHeight":[0,6.225217409690371],"color":"white","id":"9dJMCWVZ7AkDBVYRwiBuju","leftRoofHeight":5.25,"rightJoints":["q6CqZkkwBK9C5a7FRZGdjh"],"normal":[0,0,1],"rotation":[0,0,2.731440279371126],"roofId":"jRbh8euqUSp75DJHpm8gNn","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"normal":[0,0,1],"relativeAngle":1.5707963267948961,"rightRoofHeight":5.25,"rightJoints":["9dJMCWVZ7AkDBVYRwiBuju"],"ly":0.3,"rightPoint":[4.589538909397152,3.3516986330408534,0],"leftRoofHeight":5.25,"leftJoints":["hKTWU47gri3P24HLwd9scm"],"color":"white","lx":6.320731749368616,"selected":false,"rotation":[0,0,2.731440279371126],"cy":0.19133275835654517,"cz":0,"parentId":"gcZv1t7Cby2WKRNnett3ui","roofId":"jRbh8euqUSp75DJHpm8gNn","textureType":"Wall Texture Default","foundationId":"gcZv1t7Cby2WKRNnett3ui","cx":4.589538909397151,"leftPoint":[4.58953890939715,-2.969033116327763,0],"id":"aTEF4j2yHMBMrPfT9T9EdT","type":"Wall","lz":5.25,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"cz":0,"lx":9.337227070632434,"relativeAngle":-4.756114491922529e-17,"rightJoints":["aTEF4j2yHMBMrPfT9T9EdT"],"leftRoofHeight":5.25,"parentId":"gcZv1t7Cby2WKRNnett3ui","rotation":[0,0,2.731440279371126],"cy":-2.969033116327763,"textureType":"Wall Texture Default","centerRoofHeight":[0,6.225217409690371],"cx":-0.07907462591906667,"leftJoints":["q6CqZkkwBK9C5a7FRZGdjh"],"roofId":"jRbh8euqUSp75DJHpm8gNn","color":"white","rightPoint":[4.58953890939715,-2.969033116327763,0],"leftPoint":[-4.747688161235283,-2.9690331163277626,0],"id":"hKTWU47gri3P24HLwd9scm","selected":false,"ly":0.3,"foundationId":"gcZv1t7Cby2WKRNnett3ui","rightRoofHeight":5.25,"normal":[0,0,1],"type":"Wall","lz":5.25,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"rightJoints":["hKTWU47gri3P24HLwd9scm"],"textureType":"Wall Texture Default","roofId":"jRbh8euqUSp75DJHpm8gNn","id":"q6CqZkkwBK9C5a7FRZGdjh","lx":6.320731749368617,"selected":false,"rotation":[0,0,2.731440279371126],"ly":0.3,"cz":0,"cy":0.19133275835654628,"rightRoofHeight":5.25,"color":"white","normal":[0,0,1],"leftJoints":["9dJMCWVZ7AkDBVYRwiBuju"],"leftRoofHeight":5.25,"relativeAngle":-1.5707963267948966,"lz":5.25,"foundationId":"gcZv1t7Cby2WKRNnett3ui","rightPoint":[-4.747688161235283,-2.9690331163277626,0],"type":"Wall","cx":-4.747688161235283,"leftPoint":[-4.747688161235284,3.351698633040855,0],"parentId":"gcZv1t7Cby2WKRNnett3ui","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"wallsId":["aTEF4j2yHMBMrPfT9T9EdT"],"cy":0,"selected":false,"roofType":"Gable","textureType":"No Roof Texture","cx":0,"color":"#ffffff","ridgeLeftPoint":[0,1],"lz":0,"rotation":[0,0,2.731440279371126],"lx":0,"parentId":"gcZv1t7Cby2WKRNnett3ui","thickness":0.2,"foundationId":"gcZv1t7Cby2WKRNnett3ui","normal":[0,0,1],"ridgeRightPoint":[0,1],"ly":0,"id":"jRbh8euqUSp75DJHpm8gNn","cz":0,"type":"Roof","rise":0.9752174096903712,"ceiling":false},{"solarAbsorberPipe":{},"id":"gcZv1t7Cby2WKRNnett3ui","rotation":[0,0,2.731440279371126],"parentId":"Ground","normal":[0,0,1],"color":"#808080","cx":23.588922199683385,"cy":-4.2358171284989465,"ly":10.658064363814518,"type":"Foundation","lz":1,"solarPowerTower":{},"cz":0.5,"solarUpdraftTower":{},"selected":false,"lx":10.667610013832563},{"roofId":"dzARxJ53WwFwsNrhuBLzWG","ly":0.3,"selected":false,"normal":[0,0,1],"type":"Wall","rotation":[0,0,2.731440279371126],"rightRoofHeight":5.25,"lx":9.337227070632437,"lz":5.25,"id":"uBjSfWV5MAS9vnKb4XPdfP","relativeAngle":3.141592653589793,"centerRoofHeight":[0,6.225217409690371],"cy":3.3516986330408542,"rightPoint":[-4.747688161235284,3.351698633040855,0],"rightJoints":["uR2W8UpidEKJWdspykk1aw"],"foundationId":"ceA38nUA7SQynuTCNKi2BV","textureType":"Wall Texture Default","parentId":"ceA38nUA7SQynuTCNKi2BV","cx":-0.07907462591906578,"color":"white","leftPoint":[4.589538909397152,3.3516986330408534,0],"leftRoofHeight":5.25,"leftJoints":["paBZJ3XFdCVFNJ8PkS5wvw"],"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"cy":0.19133275835654517,"foundationId":"ceA38nUA7SQynuTCNKi2BV","relativeAngle":1.5707963267948961,"leftRoofHeight":5.25,"rightPoint":[4.589538909397152,3.3516986330408534,0],"ly":0.3,"textureType":"Wall Texture Default","rotation":[0,0,2.731440279371126],"cx":4.589538909397151,"lx":6.320731749368616,"normal":[0,0,1],"leftPoint":[4.58953890939715,-2.969033116327763,0],"lz":5.25,"rightRoofHeight":5.25,"cz":0,"parentId":"ceA38nUA7SQynuTCNKi2BV","roofId":"dzARxJ53WwFwsNrhuBLzWG","rightJoints":["uBjSfWV5MAS9vnKb4XPdfP"],"leftJoints":["hwrPdC7kZvm4PMhTtpv3Cf"],"selected":false,"color":"white","type":"Wall","id":"paBZJ3XFdCVFNJ8PkS5wvw","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"cz":0,"selected":false,"ly":0.3,"id":"hwrPdC7kZvm4PMhTtpv3Cf","leftRoofHeight":5.25,"leftJoints":["uR2W8UpidEKJWdspykk1aw"],"rightPoint":[4.58953890939715,-2.969033116327763,0],"rightRoofHeight":5.25,"cy":-2.969033116327763,"lx":9.337227070632434,"color":"white","normal":[0,0,1],"textureType":"Wall Texture Default","type":"Wall","cx":-0.07907462591906667,"rotation":[0,0,2.731440279371126],"parentId":"ceA38nUA7SQynuTCNKi2BV","relativeAngle":-4.756114491922529e-17,"roofId":"dzARxJ53WwFwsNrhuBLzWG","leftPoint":[-4.747688161235283,-2.9690331163277626,0],"lz":5.25,"foundationId":"ceA38nUA7SQynuTCNKi2BV","centerRoofHeight":[0,6.225217409690371],"rightJoints":["paBZJ3XFdCVFNJ8PkS5wvw"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"leftRoofHeight":5.25,"type":"Wall","roofId":"dzARxJ53WwFwsNrhuBLzWG","leftJoints":["uBjSfWV5MAS9vnKb4XPdfP"],"leftPoint":[-4.747688161235284,3.351698633040855,0],"rightJoints":["hwrPdC7kZvm4PMhTtpv3Cf"],"normal":[0,0,1],"foundationId":"ceA38nUA7SQynuTCNKi2BV","selected":false,"id":"uR2W8UpidEKJWdspykk1aw","parentId":"ceA38nUA7SQynuTCNKi2BV","rotation":[0,0,2.731440279371126],"cy":0.19133275835654628,"textureType":"Wall Texture Default","ly":0.3,"lx":6.320731749368617,"cx":-4.747688161235283,"color":"white","lz":5.25,"relativeAngle":-1.5707963267948966,"rightRoofHeight":5.25,"rightPoint":[-4.747688161235283,-2.9690331163277626,0],"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"type":"Roof","normal":[0,0,1],"cx":0,"rotation":[0,0,2.731440279371126],"foundationId":"ceA38nUA7SQynuTCNKi2BV","lx":0,"parentId":"ceA38nUA7SQynuTCNKi2BV","ridgeRightPoint":[0,1],"color":"#ffffff","ly":0,"selected":false,"thickness":0.2,"roofType":"Gable","cz":0,"id":"dzARxJ53WwFwsNrhuBLzWG","textureType":"No Roof Texture","wallsId":["paBZJ3XFdCVFNJ8PkS5wvw"],"lz":0,"ridgeLeftPoint":[0,1],"cy":0,"rise":0.9752174096903712,"ceiling":false},{"rotation":[0,0,2.731440279371126],"solarPowerTower":{},"selected":false,"type":"Foundation","ly":10.658064363814518,"normal":[0,0,1],"solarUpdraftTower":{},"cy":-13.20207722402062,"solarAbsorberPipe":{},"cx":44.31026086081932,"color":"#808080","cz":0.5,"lx":10.667610013832563,"id":"ceA38nUA7SQynuTCNKi2BV","parentId":"Ground","lz":1},{"rightRoofHeight":11,"foundationId":"88UbNAdWUbzJHGAmrqJWPn","rightJoints":["mqAaf5QtrdpibBSarUk9qt"],"relativeAngle":-3.1415926535897927,"textureType":"Wall Texture Default","type":"Wall","lz":11,"color":"white","cx":0.03303730701620822,"id":"ovU5BwtCwgHA5UHHhibxpu","roofId":"wSxYARgs9umEJRG8XyZbKH","leftPoint":[3.0844752908601185,3.4313212286858272,0],"selected":false,"parentId":"88UbNAdWUbzJHGAmrqJWPn","ly":0.3,"leftRoofHeight":11,"leftJoints":["bWeTZ14zUp93sauz9hT9ba"],"rotation":[0,0,-0.41015237421866746],"lx":6.102875967687821,"normal":[0,0,1],"rightPoint":[-3.018400676827702,3.431321228685824,0],"cy":3.4313212286858255,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lz":11,"rightJoints":["ovU5BwtCwgHA5UHHhibxpu"],"color":"white","foundationId":"88UbNAdWUbzJHGAmrqJWPn","parentId":"88UbNAdWUbzJHGAmrqJWPn","relativeAngle":1.5707963267948963,"rightPoint":[3.0844752908601185,3.4313212286858272,0],"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"cy":-1.4345548840225932,"roofId":"wSxYARgs9umEJRG8XyZbKH","type":"Wall","leftJoints":["8kMoucgjs3KynPyoZExz4J"],"ly":0.3,"rightRoofHeight":11,"leftRoofHeight":11,"lx":9.731752225416841,"leftPoint":[3.0844752908601167,-6.300430996731014,0],"selected":false,"cz":0,"normal":[0,0,1],"id":"bWeTZ14zUp93sauz9hT9ba","cx":3.0844752908601176,"centerRoofHeight":[-0.5,11],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cy":-6.300430996731012,"cx":0.03303730701620533,"leftRoofHeight":11,"relativeAngle":-5.821376180034847e-16,"selected":false,"rotation":[0,0,-0.41015237421866746],"leftJoints":["mqAaf5QtrdpibBSarUk9qt"],"leftPoint":[-3.018400676827706,-6.30043099673101,0],"foundationId":"88UbNAdWUbzJHGAmrqJWPn","id":"8kMoucgjs3KynPyoZExz4J","type":"Wall","rightPoint":[3.0844752908601167,-6.300430996731014,0],"normal":[0,0,1],"textureType":"Wall Texture Default","color":"white","roofId":"wSxYARgs9umEJRG8XyZbKH","cz":0,"lx":6.102875967687822,"rightJoints":["bWeTZ14zUp93sauz9hT9ba"],"parentId":"88UbNAdWUbzJHGAmrqJWPn","ly":0.3,"lz":11,"rightRoofHeight":11,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"rightPoint":[-3.018400676827706,-6.30043099673101,0],"id":"mqAaf5QtrdpibBSarUk9qt","centerRoofHeight":[0.5,11],"leftPoint":[-3.018400676827702,3.431321228685824,0],"rotation":[0,0,-0.41015237421866746],"cy":-1.434554884022593,"rightRoofHeight":11,"color":"white","foundationId":"88UbNAdWUbzJHGAmrqJWPn","cz":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rightJoints":["8kMoucgjs3KynPyoZExz4J"],"lz":11,"leftRoofHeight":11,"ly":0.3,"roofId":"wSxYARgs9umEJRG8XyZbKH","parentId":"88UbNAdWUbzJHGAmrqJWPn","cx":-3.018400676827704,"lx":9.731752225416834,"type":"Wall","relativeAngle":-1.5707963267948972,"leftJoints":["ovU5BwtCwgHA5UHHhibxpu"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":0,"cx":0,"wallsId":["ovU5BwtCwgHA5UHHhibxpu"],"lz":0,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"rotation":[0,0,0],"ly":0,"type":"Roof","normal":[0,0,1],"cz":0,"textureType":"No Roof Texture","id":"wSxYARgs9umEJRG8XyZbKH","selected":false,"roofType":"Gable","thickness":0.2,"parentId":"88UbNAdWUbzJHGAmrqJWPn","color":"#ffffff","cy":0,"foundationId":"88UbNAdWUbzJHGAmrqJWPn","rise":0,"ceiling":false},{"normal":[0,0,1],"type":"Foundation","id":"88UbNAdWUbzJHGAmrqJWPn","solarAbsorberPipe":{},"lx":7.252592961439527,"cx":62.080046007118426,"ly":13.304430432789896,"lz":1,"selected":false,"solarPowerTower":{},"solarUpdraftTower":{},"cy":37.19900910209601,"color":"#808080","rotation":[0,0,-0.41015237421866746],"cz":0.5,"parentId":"Ground"},{"rightRoofHeight":11,"relativeAngle":-3.1415926535897927,"selected":false,"rotation":[0,0,2.731440279371126],"cz":0,"leftPoint":[3.0844752908601185,3.4313212286858272,0],"textureType":"Wall Texture Default","cy":3.4313212286858255,"normal":[0,0,1],"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","cx":0.03303730701620822,"type":"Wall","rightJoints":["rYV5p6RL3LBPRMKrDscX3e"],"id":"dat7BcuHkXNM7uDy6XoM77","parentId":"3GmVD3k9gEdK1KyAQNL7Qd","leftJoints":["imJTFiGu5qfL7Sh3jfMjyP"],"rightPoint":[-3.018400676827702,3.431321228685824,0],"leftRoofHeight":11,"lx":6.102875967687821,"ly":0.3,"lz":11,"roofId":"vqk2MvDnMGXjNatJWKEZ3Q","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"centerRoofHeight":[-0.5,11],"lz":11,"rightPoint":[3.0844752908601185,3.4313212286858272,0],"lx":9.731752225416841,"rightJoints":["dat7BcuHkXNM7uDy6XoM77"],"id":"imJTFiGu5qfL7Sh3jfMjyP","ly":0.3,"leftJoints":["rmxwktmu6mngA8cW2oTqim"],"textureType":"Wall Texture Default","cz":0,"selected":false,"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","roofId":"vqk2MvDnMGXjNatJWKEZ3Q","leftPoint":[3.0844752908601167,-6.300430996731014,0],"type":"Wall","cy":-1.4345548840225932,"leftRoofHeight":11,"relativeAngle":1.5707963267948963,"rightRoofHeight":11,"color":"white","parentId":"3GmVD3k9gEdK1KyAQNL7Qd","normal":[0,0,1],"cx":3.0844752908601176,"rotation":[0,0,2.731440279371126],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"normal":[0,0,1],"color":"white","rightRoofHeight":11,"rotation":[0,0,2.731440279371126],"rightPoint":[3.0844752908601167,-6.300430996731014,0],"leftPoint":[-3.018400676827706,-6.30043099673101,0],"parentId":"3GmVD3k9gEdK1KyAQNL7Qd","ly":0.3,"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","rightJoints":["imJTFiGu5qfL7Sh3jfMjyP"],"id":"rmxwktmu6mngA8cW2oTqim","lz":11,"cx":0.03303730701620533,"cy":-6.300430996731012,"cz":0,"lx":6.102875967687822,"relativeAngle":-5.821376180034847e-16,"leftRoofHeight":11,"textureType":"Wall Texture Default","roofId":"vqk2MvDnMGXjNatJWKEZ3Q","leftJoints":["rYV5p6RL3LBPRMKrDscX3e"],"type":"Wall","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"leftRoofHeight":11,"cx":-3.018400676827704,"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","cz":0,"lx":9.731752225416834,"normal":[0,0,1],"type":"Wall","selected":false,"centerRoofHeight":[0.5,11],"color":"white","leftPoint":[-3.018400676827702,3.431321228685824,0],"relativeAngle":-1.5707963267948972,"id":"rYV5p6RL3LBPRMKrDscX3e","roofId":"vqk2MvDnMGXjNatJWKEZ3Q","ly":0.3,"textureType":"Wall Texture Default","leftJoints":["dat7BcuHkXNM7uDy6XoM77"],"rightPoint":[-3.018400676827706,-6.30043099673101,0],"parentId":"3GmVD3k9gEdK1KyAQNL7Qd","rightRoofHeight":11,"rotation":[0,0,2.731440279371126],"cy":-1.434554884022593,"lz":11,"rightJoints":["rmxwktmu6mngA8cW2oTqim"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"textureType":"No Roof Texture","cx":0,"roofType":"Gable","lx":0,"ly":0,"wallsId":["dat7BcuHkXNM7uDy6XoM77"],"normal":[0,0,1],"color":"#ffffff","ridgeRightPoint":[0.5,1],"thickness":0.2,"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","type":"Roof","cy":0,"rotation":[0,0,2.731440279371126],"selected":false,"lz":0,"id":"vqk2MvDnMGXjNatJWKEZ3Q","cz":0,"ridgeLeftPoint":[-0.5,1],"parentId":"3GmVD3k9gEdK1KyAQNL7Qd","rise":0,"ceiling":false},{"color":"#808080","ly":13.304430432789896,"normal":[0,0,1],"lx":7.252592961439527,"solarUpdraftTower":{},"cy":0.39963845763658945,"lz":1,"cx":57.679815811211355,"type":"Foundation","solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"id":"3GmVD3k9gEdK1KyAQNL7Qd","parentId":"Ground","cz":0.5,"rotation":[0,0,2.731440279371126]},{"rightRoofHeight":11,"lz":11,"normal":[0,0,1],"foundationId":"oYDvciacfdn2FyG6Pct5UQ","textureType":"Wall Texture Default","leftJoints":["uuKuNJNLJkLuMtyKwwLbpZ"],"color":"white","rotation":[0,0,2.731440279371126],"id":"36dnW2hrDUevTFeF7RsSFs","rightPoint":[-3.018400676827702,3.431321228685824,0],"selected":false,"rightJoints":["doa2HGm3D8izkEMMPgsx7E"],"cx":0.03303730701620822,"parentId":"oYDvciacfdn2FyG6Pct5UQ","cy":3.4313212286858255,"leftPoint":[3.0844752908601185,3.4313212286858272,0],"cz":0,"roofId":"jTzPENUqMsb7iHTtwq7yKs","relativeAngle":-3.1415926535897927,"lx":6.102875967687821,"ly":0.3,"leftRoofHeight":11,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lz":11,"relativeAngle":1.5707963267948963,"foundationId":"oYDvciacfdn2FyG6Pct5UQ","normal":[0,0,1],"ly":0.3,"parentId":"oYDvciacfdn2FyG6Pct5UQ","cx":3.0844752908601176,"leftRoofHeight":11,"rotation":[0,0,2.731440279371126],"leftPoint":[3.0844752908601167,-6.300430996731014,0],"type":"Wall","cy":-1.4345548840225932,"rightPoint":[3.0844752908601185,3.4313212286858272,0],"rightJoints":["36dnW2hrDUevTFeF7RsSFs"],"textureType":"Wall Texture Default","lx":9.731752225416841,"roofId":"jTzPENUqMsb7iHTtwq7yKs","centerRoofHeight":[-0.5,11],"leftJoints":["vqh1RPWSMZerDaWxLP3Y4Z"],"id":"uuKuNJNLJkLuMtyKwwLbpZ","rightRoofHeight":11,"selected":false,"color":"white","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","rotation":[0,0,2.731440279371126],"color":"white","leftPoint":[-3.018400676827706,-6.30043099673101,0],"normal":[0,0,1],"parentId":"oYDvciacfdn2FyG6Pct5UQ","rightRoofHeight":11,"selected":false,"leftRoofHeight":11,"roofId":"jTzPENUqMsb7iHTtwq7yKs","leftJoints":["doa2HGm3D8izkEMMPgsx7E"],"rightPoint":[3.0844752908601167,-6.300430996731014,0],"ly":0.3,"textureType":"Wall Texture Default","cy":-6.300430996731012,"rightJoints":["uuKuNJNLJkLuMtyKwwLbpZ"],"cz":0,"lz":11,"relativeAngle":-5.821376180034847e-16,"lx":6.102875967687822,"foundationId":"oYDvciacfdn2FyG6Pct5UQ","cx":0.03303730701620533,"id":"vqh1RPWSMZerDaWxLP3Y4Z","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"cz":0,"ly":0.3,"type":"Wall","cx":-3.018400676827704,"centerRoofHeight":[0.5,11],"normal":[0,0,1],"lx":9.731752225416834,"color":"white","relativeAngle":-1.5707963267948972,"leftJoints":["36dnW2hrDUevTFeF7RsSFs"],"lz":11,"id":"doa2HGm3D8izkEMMPgsx7E","rightJoints":["vqh1RPWSMZerDaWxLP3Y4Z"],"leftPoint":[-3.018400676827702,3.431321228685824,0],"parentId":"oYDvciacfdn2FyG6Pct5UQ","leftRoofHeight":11,"rightRoofHeight":11,"foundationId":"oYDvciacfdn2FyG6Pct5UQ","cy":-1.434554884022593,"rotation":[0,0,2.731440279371126],"rightPoint":[-3.018400676827706,-6.30043099673101,0],"roofId":"jTzPENUqMsb7iHTtwq7yKs","textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":0,"foundationId":"oYDvciacfdn2FyG6Pct5UQ","ridgeLeftPoint":[-0.5,1],"cx":0,"parentId":"oYDvciacfdn2FyG6Pct5UQ","normal":[0,0,1],"lz":0,"wallsId":["36dnW2hrDUevTFeF7RsSFs"],"ly":0,"cy":0,"rotation":[0,0,2.731440279371126],"id":"jTzPENUqMsb7iHTtwq7yKs","color":"#ffffff","type":"Roof","roofType":"Gable","textureType":"No Roof Texture","ridgeRightPoint":[0.5,1],"cz":0,"selected":false,"thickness":0.2,"rise":0,"ceiling":false},{"normal":[0,0,1],"cx":47.576205150745,"id":"oYDvciacfdn2FyG6Pct5UQ","solarAbsorberPipe":{},"cz":0.5,"cy":4.8155054973730085,"color":"#808080","lz":1,"type":"Foundation","lx":7.252592961439527,"parentId":"Ground","solarUpdraftTower":{},"ly":13.304430432789896,"rotation":[0,0,2.731440279371126],"selected":false,"solarPowerTower":{}},{"normal":[0,0,1],"wallsId":["1sWH6Vf283ZQdSSFT642nh","monXTa8uPTJhzhXCcFVkHQ","abgP23xfq9mn6fXM5eixEU","bBRKF8cuUabp5jr721b2aF"],"roofType":"Pyramid","rotation":[0,0,0],"lineWidth":0.2,"showLabel":false,"lz":0,"lineColor":"black","id":"7MHnZ8shY1nNWWHte69oqs","cz":0,"type":"Roof","textureType":"No Roof Texture","selected":false,"parentId":"jXMhg2wW7AzS5RR8DVRgQA","cx":0,"thickness":0.2,"foundationId":"jXMhg2wW7AzS5RR8DVRgQA","lx":0,"ly":0,"cy":0,"color":"#ffffff","rise":0,"ceiling":false},{"cy":0,"selected":false,"wallsId":["eJ8JK9wm6JNigJXLFxHXZv","6fcDhLeskSsK9vgEVSS72V","kj6mwcCRjjAjkZKNVLpD6Q","dpZWnBXJifWNeSxPnXSh11"],"cz":0,"showLabel":false,"id":"5AL2YmNDuGkeP7qZ5AC7iV","foundationId":"b7G57PTXunVqeHXzCWeuRF","type":"Roof","parentId":"b7G57PTXunVqeHXzCWeuRF","roofType":"Pyramid","thickness":0.2,"rotation":[0,0,0],"color":"#ffffff","lineColor":"black","lz":0,"cx":0,"textureType":"No Roof Texture","lineWidth":0.2,"normal":[0,0,1],"ly":0,"lx":0,"rise":0,"ceiling":false},{"cz":0,"color":"#ffffff","textureType":"No Roof Texture","lz":0,"rotation":[0,0,0],"cx":0,"normal":[0,0,1],"lx":0,"lineColor":"black","cy":0,"roofType":"Pyramid","thickness":0.2,"id":"aqd47NYJ1Q6UzcCmxxcoXQ","selected":false,"wallsId":["4ocNasurxu3LhLKonWAKWR","pBQFic2TqVJyDdJyEaBVof","tq43NPQgXhkeNmwFteVBqx","w8GFYP8jB1EG2YVL6appCT"],"ly":0,"parentId":"jH5z454ciczrceJTNes5b4","type":"Roof","foundationId":"jH5z454ciczrceJTNes5b4","lineWidth":0.2,"showLabel":false,"rise":0,"ceiling":false},{"rotation":[0,0,0],"ly":0,"textureType":"No Roof Texture","cx":0,"cy":0,"cz":0,"showLabel":false,"normal":[0,0,1],"wallsId":["9RBn6VqRCqHmHYTVsG2Hbq","snwHy88SCLUgp9tM1ts1kV","pJZasFocQxwotbLjPFqJsC","fgVtymGrmdEZZzZZ3mW69b"],"lineWidth":0.2,"lx":0,"roofType":"Pyramid","type":"Roof","foundationId":"4p3AerfQErrh3N7JyKd7PA","id":"ui47bC2XPhcG14b6RPgvMq","color":"#ffffff","parentId":"4p3AerfQErrh3N7JyKd7PA","lineColor":"black","selected":false,"thickness":0.2,"lz":0,"rise":0,"ceiling":false}],"view":{"dailyUpdraftTowerYieldPanelRect":{"x":0,"height":550,"y":0,"width":640},"dailyParabolicDishYieldPanelX":0,"visibilityResultsPanelY":0,"showDesignInfoPanel":true,"mapPanelY":0,"dailyParabolicTroughYieldPanelRect":{"height":400,"x":0,"width":600,"y":0},"showSunAngles":false,"stickyNotePanelY":0,"autoRotate":false,"weatherPanelY":0,"dailyLightSensorPanelRect":{"y":0,"height":360,"width":600,"x":0},"groundColor":"forestgreen","enableRotate":true,"showElevationAngle":true,"yearlyPvYieldPanelY":0,"panCenter2D":[68.43396623741017,108.77453989719173,0.00001332276757861851],"showMapPanel":false,"heliodonPanelY":0,"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"weatherPanelX":0,"solarRadiationHeatMapMaxValue":5,"dailyPvYieldPanelY":0,"showInstructionPanel":false,"yearlyPvYieldPanelRect":{"width":600,"y":86,"x":-326,"height":400},"yearlyLightSensorPanelShowClearness":false,"cameraZoom":25.847108697996326,"showSolarPanelVisibilityResultsPanel":false,"mapType":"hybrid","showYearlyParabolicTroughYieldPanel":false,"heliodonPanelX":0,"showYearlyHeliostatYieldPanel":false,"axes":true,"showDailyHeliostatYieldPanel":false,"yearlyFresnelReflectorYieldPanelRect":{"width":600,"y":0,"x":0,"height":400},"showHeliodonPanel":false,"dailyLightSensorPanelX":0,"dailyFresnelReflectorYieldPanelY":0,"yearlyPvYieldPanelX":0,"showZenithAngle":true,"heliodon":false,"dailyHeliostatYieldPanelX":0,"orthographic":false,"showDailyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"y":0,"width":236,"x":0,"height":87},"yearlyLightSensorPanelY":0,"groundImage":true,"yearlyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"showWeatherPanel":false,"yearlyParabolicTroughYieldPanelY":0,"dailyPvYieldPanelX":0,"showYearlyPvYieldPanel":false,"dailyFresnelReflectorYieldPanelX":0,"weatherPanelRect":{"y":0,"height":500,"width":500,"x":0},"evolutionPanelRect":{"y":0,"x":0,"width":640,"height":400},"showDailyUpdraftTowerYieldPanel":false,"showAzimuthAngle":true,"showEvolutionPanel":false,"yearlyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"ambientLightIntensity":0.1,"dailyFresnelReflectorYieldPanelRect":{"y":0,"height":400,"x":0,"width":600},"yearlyLightSensorPanelX":0,"showEconomicsPanel":false,"dailyParabolicDishYieldPanelRect":{"width":600,"x":0,"y":0,"height":400},"stickyNotePanelX":0,"showDiurnalTemperaturePanel":false,"yearlyFresnelReflectorYieldPanelX":0,"panCenter":[38.386200794550874,-23.3410033657338,0.000026460494326568842],"showStickyNotePanel":true,"showDailyParabolicDishYieldPanel":false,"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"shadowEnabled":false,"mapZoom":17,"showYearlyFresnelReflectorYieldPanel":false,"yearlyLightSensorPanelShowDaylight":false,"showYearlyUpdraftTowerYieldPanel":false,"showDailyLightSensorPanel":false,"dailyHeliostatYieldPanelY":0,"yearlyParabolicTroughYieldPanelRect":{"height":400,"width":600,"x":0,"y":0},"yearlyFresnelReflectorYieldPanelY":0,"diurnalTemperaturePanelRect":{"y":0,"width":600,"height":400,"x":0},"theme":"Default","dailyLightSensorPanelY":0,"visibilityResultsPanelRect":{"x":0,"height":470,"width":600,"y":0},"yearlyLightSensorPanelRect":{"height":500,"y":0,"x":0,"width":600},"showSiteInfoPanel":true,"visibilityResultsPanelX":0,"mapTilt":0,"solarRadiationHeatMapReflectionOnly":false,"cameraPosition":[79.58351721186,-134.3931242110791,147.3552432306341],"showYearlyLightSensorPanel":false,"dailyParabolicTroughYieldPanelX":0,"yearlyHeliostatYieldPanelX":0,"yearlyParabolicDishYieldPanelRect":{"width":600,"y":0,"height":400,"x":0},"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicTroughYieldPanelY":0,"dailyPvYieldPanelRect":{"width":600,"height":400,"y":0,"x":0},"cameraPosition2D":[68.43396623741017,108.77451989630273,20.00001332267289],"dailyParabolicDishYieldPanelY":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"interRowSpacing":2,"rowAxis":"Left-Right","pvModelName":"SPR-X21-335-BLK","tiltAngle":0,"poleSpacing":3,"orientation":"Landscape","poleHeight":1,"rowsPerRack":1},"solarPanelArrayLayoutConstraints":{"rowAxis":"Left-Right","poleHeight":1,"minimumTiltAngle":-1.5707963267948966,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"maximumInterRowSpacing":10,"minimumInterRowSpacing":2,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","poleSpacing":5,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"localSearchRadius":0.1,"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"maximumGenerations":5,"selectionMethod":1,"searchMethod":1,"mutationRate":0.1,"selectionRate":0.5,"convergenceThreshold":0.01,"crossoverRate":0.5,"populationSize":20},"particleSwarmOptimizationParams":{"vmax":0.01,"inertia":0.8,"objectiveFunctionType":1,"searchMethod":1,"cognitiveCoefficient":0.1,"problem":"Solar Panel Tilt Angle","socialCoefficient":0.1,"localSearchRadius":0.1,"maximumSteps":5,"swarmSize":20,"convergenceThreshold":0.01}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Mescalero Apache School\\nNew Mexico, USA"]}')},472:function(e){e.exports=JSON.parse('{"docid":"oRJVoBEAs85sQVTxz3G3Aa","timestamp":1643138671495,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"9/22/2021 11:00:00 AM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":2},"elements":[{"type":"Foundation","cx":-9.55171908313751,"cy":-18.19491515601114,"cz":0.05,"lx":69.0515968638667,"ly":71.26044576002357,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-1.017744597267026],"parentId":"Ground","id":"9zunWg9vgE2EXQf2GAGvHJ","selected":false,"textureType":"Foundation Texture #2"},{"type":"Tree","name":"Maple","cx":3.2728380906673773,"cy":2.018552619631127,"cz":0.05000000074505806,"lx":9.63205225658289,"lz":12.42213702192784,"normal":[0,0,1],"rotation":[0,0,0.4041452104082131],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"e4UGoSP6vMmKtTpaK7Xx7e","selected":false,"showModel":false},{"type":"Human","name":"Jack","cx":9.261208020051818,"cy":17.4519165226371,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0.4041452104082131],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"aqHPhgdskHU47w7A1JoYUH","selected":false,"ly":0.6},{"type":"Tree","name":"Maple","cx":-2.759236366671214,"cy":-6.100345712463374,"cz":0.05000000074505806,"lx":15.662386774550322,"lz":17.814185690323082,"normal":[0,0,1],"rotation":[0,0,0.5235987755982988],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"quQsvQqGqFo233Raf5MV2q","selected":false},{"type":"Cuboid","cx":-9.798880015116119,"cy":-4.358075047463568,"cz":9.736603648251254,"lx":19.17702564125724,"ly":13.830784586479455,"lz":19.47320729650251,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,3.141592653589793],"parentId":"Ground","selected":false,"id":"u8URHSH38BdLFefR2kpArP"},{"type":"Tree","name":"Spruce","cx":8.846757081366217,"cy":8.465966186158635,"cz":0.05000000074505806,"lx":4.201867761608678,"lz":9.066423414956883,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"8nmhqhdJRjPhvXmqRWtXWS","selected":false,"showModel":false},{"type":"Cuboid","cx":3.3849893009151506,"cy":3.1596268234618305,"cz":4.774411049933112,"lx":17.91634633119275,"ly":6.319724352083252,"lz":9.548822099866223,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.8378964730477152],"parentId":"Ground","id":"w6fsWnZq8bBGBS5PxduXBK","selected":false},{"type":"Cuboid","cx":0.8301123283897702,"cy":-13.282792837220546,"cz":5.471867705312628,"lx":5.668418559135588,"ly":9.979432490224614,"lz":10.943735410625257,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.7040209346650892],"parentId":"Ground","selected":false,"id":"e4j7PfDmVs1dovQBZBQ3BT"},{"type":"Cuboid","cx":3.6644340063361565,"cy":-4.8364998865196736,"cz":2,"lx":4.840425768432099,"ly":20.8513404243441,"lz":4,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"qfz89eHJ88Lg9JCyH53fc9"},{"type":"Cuboid","cx":-4.166247795353307,"cy":-32.1603428429262,"cz":2.63479238812298,"lx":11.313153894671187,"ly":12.684919468119116,"lz":5.26958477624596,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.2580366898458273],"parentId":"Ground","selected":false,"id":"nNjg1Ffg3pm4CdyzNQdiW9"},{"type":"Cuboid","cx":-4.400070852285921,"cy":-32.71929138984055,"cz":13.65810647211173,"lx":3.1252453327696883,"ly":3.149430446459918,"lz":27.31621294422346,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.7128704595183226],"parentId":"Ground","selected":false,"id":"ofBXHyPsTmNpJVcNoCo9j5"},{"type":"Cuboid","cx":-20.05284620919852,"cy":-31.1598203541727,"cz":4.6920942485939525,"lx":14.24559815125088,"ly":10.643905820516908,"lz":9.384188497187905,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.2728352410356374],"parentId":"Ground","selected":false,"id":"aZcQCi1W1twRBtwgJgUoeW"},{"type":"Tree","name":"Oak","cx":19.63141428747889,"cy":-14.555088162280029,"cz":0.05000000074505806,"lx":16.244539454462206,"lz":17.937149329522143,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"hP32y2WeaoShZAgJcL2phB","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[53.96406310906323,-63.55404886182046,17.26191308801079],"panCenter":[-14.409899112760232,-10.942953787224548,3.8259899066863428],"orthographic":false,"enableRotate":true,"cameraZoom":15.47561875,"showInstructionPanel":true,"cameraPosition2D":[4.361874143686572,3.699796590309034,48.00000369998439],"panCenter2D":[4.361874143686572,3.699844592441852,0.000004448257642288249],"showHeatmap":false,"showSolarRadiationHeatmap":false,"showSunAngles":false,"solarRadiationHeatMapMaxValue":4.5},"notes":[]}')},473:function(e){e.exports=JSON.parse('{"docid":"gj8mmfSE6fqAAUtvXZYGkb","time":"03/19/2023 02:00 pm","timestamp":1679248844823,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":14.613120903558068,"solarUpdraftTower":{},"parentId":"Ground","cx":-2.6557701490344776,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.09987728198946044,"type":"Foundation","solarPowerTower":{},"lx":18.159918676696766,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":3,"roofId":"vyQyu3QobXjxj1jDvhJ4sy","ly":0.3,"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"No Wall Texture","leftPoint":[6.699943397855505,5.67322456909281,0.1],"type":"Wall","rightRoofHeight":3,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":3,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.6999433978555056,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.6732245690928105,"color":"#ffffff","opacity":0.4,"wallStructure":"Stud","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.699943397855504,"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"cy":0.6732245690928105,"leftRoofHeight":3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":3,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","rightRoofHeight":3,"roofId":"vyQyu3QobXjxj1jDvhJ4sy","color":"#ffffff","opacity":0.4,"wallStructure":"Stud","centerRoofHeight":[0,4.790804943100949],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"lx":10,"windows":[],"lz":3,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"vyQyu3QobXjxj1jDvhJ4sy","selected":false,"cy":0.6732245690928105,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"No Wall Texture","rightRoofHeight":3,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":3,"ly":0.3,"cx":-5.300056602144494,"color":"#ffffff","opacity":0.4,"wallStructure":"Stud","centerRoofHeight":[0,4.790804943100949],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"showLabel":false,"cx":0.6999433978555061,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"cz":2.268765007024547,"textureType":"No Wall Texture","cy":-4.3267754309071895,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"vyQyu3QobXjxj1jDvhJ4sy","leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"ly":0.3,"lz":3,"leftRoofHeight":3,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":3,"lx":12,"color":"#ffffff","wallStructure":"Stud","opacity":0.4,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Human","name":"James","cx":-1.8741011733558182,"cy":-5.8416164272427595,"cz":0.05000000074505806,"lx":0.472,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.472},{"type":"Human","name":"Jess","cx":-4.0157582744754965,"cy":3.8617380009978506,"cz":0.050000000745058504,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Gable","roofStructure":"Rafter","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"vyQyu3QobXjxj1jDvhJ4sy","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":1.790804943100949,"ceiling":false},{"type":"Flower","name":"White Flower","cx":-4.1342434171004925,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"46aifVnH3B74BwVSi3Crxq","selected":false},{"type":"Flower","name":"White Flower","cx":-3.3342434171004927,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"i8U6G9JyPpL2hbWBs7vVz6","selected":false},{"type":"Flower","name":"White Flower","cx":-2.534243417100493,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"ugPMRjEYo4WRamJ9tFewHm","selected":false},{"type":"Flower","name":"White Flower","cx":-1.7342434171004928,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cXWM3Js8Lp8DUZByf9ySVZ","selected":false},{"type":"Flower","name":"White Flower","cx":-0.9342434171004927,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tWw7iszMWHGh94zWUms3bX","selected":false},{"type":"Flower","name":"White Flower","cx":-0.1342434171004927,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"wFi9RKANUcSDb8JEQtDAEk","selected":false},{"type":"Flower","name":"White Flower","cx":0.6657565828995073,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"bgwNTPoMCs4Wi6VnCqioA2","selected":false},{"type":"Flower","name":"White Flower","cx":1.4657565828995074,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"m6nguuL3Zz24UD89QncVq3","selected":false},{"type":"Flower","name":"White Flower","cx":2.2657565828995074,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kGhztdakMGZm6mkLawDRht","selected":false},{"type":"Flower","name":"White Flower","cx":3.0657565828995077,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"t89aQNRve3pcY6QfBoyCYo","selected":false},{"type":"Flower","name":"White Flower","cx":3.8657565828995075,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"2bSs9uZqzgsXpzetM5AmxD","selected":false},{"type":"Flower","name":"White Flower","cx":4.665756582899507,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7CEvARocUnJdE2SHZcDU2V","selected":false},{"type":"Flower","name":"White Flower","cx":5.465756582899507,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rYZJ2mHmESXni5V1aVa46t","selected":false},{"type":"Flower","name":"White Flower","cx":-4.2619057070341295,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"m4JAZDAnBR2QnoTX6gwxgv","selected":false},{"type":"Flower","name":"White Flower","cx":-3.4619057070341297,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7nhnwoJ8FbP4fj9ZXLrfye","selected":false},{"type":"Flower","name":"White Flower","cx":-2.66190570703413,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"uFsFHipxUMRX5aHpDNiLzw","selected":false},{"type":"Flower","name":"White Flower","cx":-1.8619057070341298,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"mJ6VdUdVpFHoDMvk5CifrP","selected":false},{"type":"Flower","name":"White Flower","cx":-1.0619057070341298,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"ebBzNYMUnf5tyqviBfW44K","selected":false},{"type":"Flower","name":"White Flower","cx":-0.26190570703412974,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7qGERbKCYNJZY5SktqYFGH","selected":false},{"type":"Flower","name":"White Flower","cx":0.5380942929658703,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"oAb4tA3ghqD5MVLjvE2JNB","selected":false},{"type":"Flower","name":"White Flower","cx":1.3380942929658703,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"anEdC4mKjKpYkWwwTugQd7","selected":false},{"type":"Flower","name":"White Flower","cx":2.1380942929658704,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3WdeMit6SeG4bqra8yJxnB","selected":false},{"type":"Flower","name":"White Flower","cx":2.9380942929658707,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jnmEfnMgUaJK9NwsWsV3gH","selected":false},{"type":"Flower","name":"White Flower","cx":3.7380942929658705,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8471n9p1MKM4v5HYVYNnbf","selected":false},{"type":"Flower","name":"White Flower","cx":4.53809429296587,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jRVVQvkLQEJFVGW7n4JcjX","selected":false},{"type":"Flower","name":"White Flower","cx":5.33809429296587,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"n9PiSuToBHaHcJ2hu8PhVa","selected":false},{"type":"Flower","name":"White Flower","cx":-4.344446260163467,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5GRQttXkMVj9MJmJA2sCTw","selected":false},{"type":"Flower","name":"White Flower","cx":-3.5444462601634674,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"79Mv3qBTpXEHM1FaDfaYXS","selected":false},{"type":"Flower","name":"White Flower","cx":-2.7444462601634676,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8XAz3reTAfJSVRX2DdJvMN","selected":false},{"type":"Flower","name":"White Flower","cx":-1.9444462601634676,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"hGDaJZoqkJU6bVFNwzDKgn","selected":false},{"type":"Flower","name":"White Flower","cx":-1.1444462601634675,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cWsLs9ePKWKWrV1Akhn42n","selected":false},{"type":"Flower","name":"White Flower","cx":-0.34444626016346747,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8NgHbW2QgN3CvEsxHivBg6","selected":false},{"type":"Flower","name":"White Flower","cx":0.4555537398365326,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7ogG3q6XsVTY3wSGV7BrEK","selected":false},{"type":"Flower","name":"White Flower","cx":1.2555537398365326,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"aTLKeq862hXuydUnDnRufZ","selected":false},{"type":"Flower","name":"White Flower","cx":2.0555537398365327,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"4SotanHYdz7BmHuHEsRU5J","selected":false},{"type":"Flower","name":"White Flower","cx":2.855553739836533,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"o98emba7AiB167tGV4Un8g","selected":false},{"type":"Flower","name":"White Flower","cx":3.6555537398365328,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"1ExTvAYZaKio5wNoaShuZo","selected":false},{"type":"Flower","name":"White Flower","cx":4.455553739836533,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"t3oYKCD7r8u33GMpXr8wwr","selected":false},{"type":"Flower","name":"White Flower","cx":5.255553739836532,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5jPVxqN2CvnEkeYz4QQra5","selected":false},{"type":"Flower","name":"White Flower","cx":-4.391533387874089,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"of1adpyZeoRS8fTjGoytf1","selected":false},{"type":"Flower","name":"White Flower","cx":-3.5915333878740894,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9ncNDKqkLLMu7d9PUN7oUA","selected":false},{"type":"Flower","name":"White Flower","cx":-2.7915333878740896,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"u3zUSyPymxJB7HgazzqLzv","selected":false},{"type":"Flower","name":"White Flower","cx":-1.9915333878740895,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"dHPhWCEiz1y9PnXZp83MpE","selected":false},{"type":"Flower","name":"White Flower","cx":-1.1915333878740895,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"bg6PZWwTrwwre4jiKxe7uX","selected":false},{"type":"Flower","name":"White Flower","cx":-0.3915333878740894,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5F7K7QFnfwHKfd4Lfw728p","selected":false},{"type":"Flower","name":"White Flower","cx":0.4084666121259106,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"532gMLAZ5tcLjzMQisipSa","selected":false},{"type":"Flower","name":"White Flower","cx":1.2084666121259107,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"v3gFFnUntYFxM9Nx5RWfik","selected":false},{"type":"Flower","name":"White Flower","cx":2.0084666121259107,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"s6dpt2XkDQfRw5bGeX1H1V","selected":false},{"type":"Flower","name":"White Flower","cx":2.808466612125911,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"uw1Jz6HvycMidfXokrAzFQ","selected":false},{"type":"Flower","name":"White Flower","cx":3.608466612125911,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"n7ppnA9LyoWRWkVHPMq965","selected":false},{"type":"Flower","name":"White Flower","cx":4.408466612125911,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"r4x3CD3uiRipJcivNwW5MN","selected":false},{"type":"Flower","name":"White Flower","cx":5.2084666121259104,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7eEgZikopFnYDrozpMnbVk","selected":false},{"type":"Flower","name":"Sunflower","cx":-4.481342001872006,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9P5CuiQ2MG15JKupLj1B6D","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.4813420018720063,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"meDHz6sDDGj4eDAWvaf1Jc","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.4813420018720063,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"sRFj36qrZLXFZTDMQ6mpD9","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.4813420018720063,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qNZvKMkFPtUNCcEgL1huNh","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.48134200187200626,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kcPXW35rZZAsL5WiiAk3hw","selected":false},{"type":"Flower","name":"Sunflower","cx":0.5186579981279937,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"feWWMNFMFvQ8cSM14BMp8t","selected":false},{"type":"Flower","name":"Sunflower","cx":1.5186579981279937,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"msFwckWagge9gpLdQeS4JJ","selected":false},{"type":"Flower","name":"Sunflower","cx":2.5186579981279937,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"dogJzpvueZ1anaBAZ7muH8","selected":false},{"type":"Flower","name":"Sunflower","cx":3.5186579981279937,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cYZoVFdifJsko9MEehFjtS","selected":false},{"type":"Flower","name":"Sunflower","cx":-4.24189898255945,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"s25usGNmQJ66fR5yXuRGGo","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.2418989825594497,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"pzBtEERtTPkBv9CsHDmZDu","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.2418989825594497,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"m5X7sdToMdq8xEefEwxLCK","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.2418989825594497,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"f4inpmtrAzszkJUhzYSUye","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.24189898255944975,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"f4ThsERMjZf2AhEJ56hsa6","selected":false},{"type":"Flower","name":"Sunflower","cx":0.7581010174405503,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"16shGo6CLCNPBSgnunhAkS","selected":false},{"type":"Flower","name":"Sunflower","cx":1.7581010174405503,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7vYNCNRBverkM51mspnoUJ","selected":false},{"type":"Flower","name":"Sunflower","cx":2.7581010174405503,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"voHLpW8Gd4XA3Ceg6Xbe7t","selected":false},{"type":"Flower","name":"Sunflower","cx":3.7581010174405503,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"u6Ue6tXWzkHCodK9XZEU2L","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.9022248766799255,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"c6JNqxEgYvWDCRJawdShSj","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.9022248766799255,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"oaSKDixHoDBGhRmyNSQzgw","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.9022248766799255,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vrts4rUEEsRTQs9sGjhPQA","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.9022248766799255,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3pYKWqcAmjBuuNuny7rpoV","selected":false},{"type":"Flower","name":"Sunflower","cx":0.09777512332007454,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"1S6ZgxRm2LWmGc9KQsgDFh","selected":false},{"type":"Flower","name":"Sunflower","cx":1.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"opQ4ZLwfvkzg5Vxfj8cfQA","selected":false},{"type":"Flower","name":"Sunflower","cx":2.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nkbv83UnHqmfM7bAwa33Pe","selected":false},{"type":"Flower","name":"Sunflower","cx":3.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"mN9mTCijKK38jmTnqKHee1","selected":false},{"type":"Flower","name":"Sunflower","cx":4.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"dArQ57WQgeQivghvFz6Pkf","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.660995740108657,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"v7PVJmCSxV3Mzkp3DvmbxL","selected":false},{"type":"Flower","name":"Sunflower","cx":5.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"h4XguGKN7sgDCDuSE5McKM","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.660995740108657,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"wSmuS2APtdqz8q7JGKKASr","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.6609957401086568,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nhuLvBuF9q3oVKsH9nQgoj","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.6609957401086568,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"gyN8wLEyhGu5icXFxTanDS","selected":false},{"type":"Flower","name":"Sunflower","cx":0.3390042598913432,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3Hxo93yvCk6bL25Z1j69hy","selected":false},{"type":"Flower","name":"Sunflower","cx":1.3390042598913432,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"6CEP9TkxfGsqwqefDYN2m3","selected":false},{"type":"Flower","name":"Sunflower","cx":2.339004259891343,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tKziXd6bAbZhg1ZHtHCDYk","selected":false},{"type":"Flower","name":"Sunflower","cx":3.339004259891343,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"i75ADLAQar36M93rinkuBn","selected":false},{"type":"Flower","name":"Sunflower","cx":4.339004259891343,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9aKZZrCwftw93k2j9EUPft","selected":false},{"type":"Flower","name":"Sunflower","cx":5.339004259891343,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jtbnWz1TtfVCGS6GFT7cd5","selected":false},{"type":"Flower","name":"Sunflower","cx":4.700456042537368,"cy":2.0818781692863544,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kpaDqAs7RHDDcutq6peJfx","selected":false},{"type":"Flower","name":"Sunflower","cx":4.834015330936817,"cy":4.861450972934322,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"n1pT9mZTaMUzmHpcczyBaV","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.3045300953024963,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"k1bygQU9gmbRLruK4LkufJ","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.3045300953024963,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"1Qg8EAesLQmApEi3SoVr2L","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.3045300953024963,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"pX7RzZXzs2a2wB6ikN7nMV","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.3045300953024963,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"4n5Yx4e8sgXGuByhj8k1fL","selected":false},{"type":"Flower","name":"Sunflower","cx":0.6954699046975037,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vHXKNqVUezGNFoAwcMvXfT","selected":false},{"type":"Flower","name":"Sunflower","cx":1.6954699046975037,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qESmtL2sTn5MoKqcsafYq5","selected":false},{"type":"Flower","name":"Sunflower","cx":2.6954699046975037,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jzYPMGXoRbfHffj27jjLk1","selected":false},{"type":"Flower","name":"Sunflower","cx":3.6954699046975037,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qbv7JX9QpCnKwVvTQzv2CK","selected":false},{"type":"Flower","name":"Sunflower","cx":4.695469904697504,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vegPcGL4Si9F7tHaiDew5A","selected":false},{"type":"Flower","name":"Sunflower","cx":5.695469904697504,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nfuYXRCdKKX1yeEVfQ1Q8w","selected":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.19999999999999998,"y":-0.7999999999999999},{"x":-0.19999999999999998,"y":-0.4666666666666666},{"x":0.20000000000000004,"y":-0.4666666666666666},{"x":0.20000000000000004,"y":-0.7999999999999999}],"parentId":"skm8dNPSkFaVkoUwiPNfq1","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":0,"id":"9M33FqMDNgV3pDjYk2UES3","text":"Greenhouse","fontSize":0.5,"fontColor":"gold","fontStrokeWidth":0.01,"noOutline":true,"opacity":0}],"sceneRadius":15,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,19.999999999989587],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-13.969061585407742,-10.143303302147187,2.3881460403679218],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.847108697996333,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-1.0306086242769346,3.0389446343818545,1.3437141951705311],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},474:function(e){e.exports=JSON.parse('{"docid":"pBi5xeMeSVt3pt1S6pNqhP","time":"03/19/2023 01:57 pm","timestamp":1679248653859,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"3019 Jameson Beach Rd, South Lake Tahoe, CA 96150, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":38.9379299,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-120.0387964},"elements":[{"ly":15.823820171875001,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.23635058692870636,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.30044344061775696,"type":"Foundation","solarPowerTower":{},"lx":20.01699292669677,"lz":0.25,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.125,"textureType":"Foundation Texture #2","enableGroupMaster":true},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":4,"roofId":"ddvCooK4VAFN7dUMWPpapB","ly":0.3,"rightPoint":[-6.228593727144493,5.3056786237803095,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[5.771406272855506,5.305678623780308,0.1],"type":"Wall","rightRoofHeight":4,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.22859372714449355,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.3056786237803095,"color":"#ffffff","opacity":0,"wallStructure":"Stud","structureSpacing":100,"structureColor":"#666666","structureWidth":0.1,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.5,"rightTopPartialHeight":3.5},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":5.771406272855505,"leftPoint":[5.771406272855503,-4.6943213762196905,0.1],"cy":0.3056786237803084,"leftRoofHeight":4,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[5.771406272855507,5.3056786237803095,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":4,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":4,"roofId":"ddvCooK4VAFN7dUMWPpapB","color":"#ffffff","opacity":0,"wallStructure":"Stud","structureSpacing":100,"structureColor":"#666666","structureWidth":0.1,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.5,"rightTopPartialHeight":3.5},{"lx":10,"windows":[],"lz":4,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"ddvCooK4VAFN7dUMWPpapB","selected":false,"cy":0.3056786237803084,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-6.228593727144493,-4.6943213762196905,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-6.228593727144492,5.3056786237803095,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4,"ly":0.3,"cx":-6.228593727144493,"color":"#ffffff","opacity":0,"wallStructure":"Stud","structureSpacing":100,"structureColor":"#666666","structureWidth":0.1,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.5,"rightTopPartialHeight":3.5},{"showLabel":false,"cx":-0.2285937271444931,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[5.771406272855507,-4.6943213762196905,0.1],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-4.6943213762196905,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"ddvCooK4VAFN7dUMWPpapB","leftPoint":[-6.228593727144493,-4.6943213762196905,0.1],"normal":[0,0,1],"ly":0.3,"lz":4,"leftRoofHeight":4,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4,"lx":12,"color":"#ffffff","wallStructure":"Stud","opacity":0,"structureSpacing":100,"structureColor":"#666666","structureWidth":0.1,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.5,"rightTopPartialHeight":3.5},{"type":"Human","name":"Jacob","cx":7.289879196764376,"cy":0.9615979280726203,"cz":0.125,"lx":0.8,"lz":1.82,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.8},{"type":"Wall","cx":0.09100362924299155,"cy":1.1882025501879951,"cz":2.2408122612280286,"lx":1.5601883727480157,"ly":0.2,"lz":7.649013269649758,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[0.8710978156169994,1.1882025501879951,0],"rightPoint":[-0.6890905571310163,1.1882025501879951,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":7.649013269649758,"rightRoofHeight":7.649013269649758,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.149013269649758,"rightTopPartialHeight":7.149013269649758},{"type":"Wall","cx":0.8710978156169993,"cy":0.14100043812882335,"cz":2.2301039869226305,"lx":2.0944042241183434,"ly":0.2,"lz":7.649013269649758,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[0.8710978156169991,-0.9062016739303485,0],"rightPoint":[0.8710978156169995,1.1882025501879951,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":7.649013269649758,"rightRoofHeight":7.649013269649758,"wallStructure":"Default","opacity":0.5,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.149013269649758,"rightTopPartialHeight":7.149013269649758},{"type":"Wall","cx":-0.6890905571310162,"cy":0.14100043812882335,"cz":2.228839888904333,"lx":2.0944042241183434,"ly":0.2,"lz":7.649013269649758,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-0.6890905571310162,1.1882025501879951,0],"rightPoint":[-0.6890905571310163,-0.9062016739303485,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":7.649013269649758,"rightRoofHeight":7.649013269649758,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.149013269649758,"rightTopPartialHeight":7.149013269649758},{"type":"Wall","cx":0.0910036292429916,"cy":-0.9062016739303485,"cz":2.268765007024547,"lx":1.5601883727480157,"ly":0.2,"lz":7.649013269649758,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-0.6890905571310163,-0.9062016739303485,0],"rightPoint":[0.8710978156169995,-0.9062016739303485,0],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":7.649013269649758,"rightRoofHeight":7.649013269649758,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.149013269649758,"rightTopPartialHeight":7.149013269649758},{"type":"Foundation","cx":-0.0721809285526831,"cy":-0.11580967162986489,"cz":0.05,"lx":2.3610744974526523,"ly":3.0605782147964087,"lz":0.07649013269649757,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false},{"type":"Human","name":"Jess","cx":-1.0115122224568758,"cy":-3.6651165310105203,"cz":0.125,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.15,"roofType":"Pyramid","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7","pPpJHGJ2bGVqLdA1FpXi4V","giYTP9Qg6uJ3yfkS1RoDqG","2RETAxyRMzZBEQkBGms56R"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"u1sPtasg3hWUinAjQbYwBP","rise":1.3063523363004892,"ceiling":false},{"type":"Window","cx":0.023873137489038417,"cy":0.1,"cz":0.3595234970910072,"lx":0.5252090247588448,"ly":0.2,"lz":0.11766223541160228,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"62Gv8U29wFJyJf1vgeLMyo","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-6.114654382048409,"cy":0.32019837609535623,"cz":0,"lx":9.600000000000001,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-7.214654382048406,-5.779801623904644,0],"rightPoint":[-7.214654382048404,3.820198376095357,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"moXtDnyecvwRem92AzKP6s","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Wall","cx":5.700000000000008,"cy":-2.6500000000000012,"cz":0,"lx":3.5,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[8,-2.5,0],"rightPoint":[8,1,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"n3Fbp8o59RXvpMXPY1s1Sm","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Wall","cx":5.710429595506894,"cy":3.3385814547866905,"cz":0,"lx":3.5,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[7.210429595506889,1.3885814547866906,0],"rightPoint":[7.210429595506889,4.88858145478669,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"vhwBgsvb2XNRoUeLKEqhYZ","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Wall","cx":-0.25,"cy":-4.660000000000009,"cz":0,"lx":11.5,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-6,-7,0],"rightPoint":[5.5,-7,0],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"wSthZNuu3hKxPyS8LHSGvS","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Wall","cx":-0.211862519698188,"cy":5.176033006265223,"cz":0,"lx":11.5,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-8.76186251969819,5.476033006265222,0],"rightPoint":[2.7381374803018104,5.476033006265222,0],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"um8H4fZzRuLbZZ81bgs5nP","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Door","cx":0,"cy":0,"cz":-0.34805186284300194,"lx":0.4774627497807679,"ly":0,"lz":0.3038962743139961,"textureType":"Door Texture #2","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"h5Bd5QDcL7vWMTHPSCDuBD","doorType":"Default","archHeight":1,"filled":true},{"type":"Tree","name":"Fan Palm","cx":2.7985631567413556,"cy":-10.731117262084023,"cz":0,"lx":6.375358320482912,"lz":8.451212523084012,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"iQhcHctqyRJaG4XFZS4XMk","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Hip","roofStructure":"Default","wallsId":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"ddvCooK4VAFN7dUMWPpapB","leftRidgeLength":3,"rightRidgeLength":3,"rise":1.4109420933443069,"ceiling":false},{"type":"Flower","name":"Peony","cx":7.023550381410839,"cy":-3.8877826159721582,"cz":0.12499999999999956,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"hRzYHbdXP7aLP7JcDbRqRR","selected":false},{"type":"Flower","name":"Peony","cx":6.9734776254848185,"cy":-2.9143031643660438,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vMLhayUTUD8aHWGMkGHz6W","selected":false},{"type":"Flower","name":"Peony","cx":6.9889157221008045,"cy":-1.8856467808244108,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"aKoXDkCANHQbTt7sp6H4cD","selected":false},{"type":"Flower","name":"Peony","cx":7.056609460752512,"cy":2.106696532214023,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"drvWi4itbJZhSYfhzMLFUz","selected":false},{"type":"Flower","name":"Peony","cx":7.073130172902122,"cy":3.1951278306332282,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3XQg1jKjV5dafQKCUY9Tom","selected":false},{"type":"Flower","name":"Peony","cx":6.831179450888563,"cy":4.436138900477424,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7ETHmh5VY9WD7DqvsYegAD","selected":false},{"type":"Tree","name":"Fan Palm","cx":-3.064329828704058,"cy":-11.205145732983894,"cz":4.440892098500626e-16,"lx":6.375358320482912,"lz":8.451212523084012,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"stqfKSZKDeaDe1syQCZ2RQ","selected":false},{"type":"Tree","name":"Fan Palm","cx":-10.213746832393127,"cy":-10.383228886165,"cz":-4.440892098500626e-16,"lx":6.375358320482912,"lz":8.451212523084012,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"u5zC3LfHnyukcnd2TZGm5n","selected":false},{"type":"Human","name":"Jade","cx":4.6162547175937405,"cy":0.8236142952720673,"cz":0.125,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kEK1sks1vjBNeG9bYUByB6","selected":false,"ly":0.48},{"type":"Human","name":"Jaye","cx":4.113865624208955,"cy":-0.1569064565752818,"cz":0.125,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jiL3321sgunb78Yp2wx7LZ","selected":false,"ly":0.55},{"type":"Human","name":"Jack","cx":2.270983153500868,"cy":-5.647402265265438,"cz":0.125,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qKXJTHDFWk1Be3UB18FicH","selected":false,"ly":0.42},{"type":"Human","name":"Jeanette","cx":6.811654467665146,"cy":0.3288410550941858,"cz":0.12500000000000044,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jdNC43ZSdnd8zSCxaT42uJ","selected":false,"ly":0.4},{"type":"Human","name":"Jedi","cx":4.3803812097281964,"cy":-6.219962402856187,"cz":0.12500000000000044,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tktL4bCeJqmadSREQxqYZf","selected":false,"ly":0.56},{"type":"Human","name":"Jaah","cx":8.073408817436135,"cy":-2.861373653368049,"cz":0.125,"lx":0.74,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3tNBEAxUt3DLTZFUWrkT43","selected":false,"ly":0.74},{"type":"Human","name":"Jena","cx":5.650342532886793,"cy":-5.869419038331923,"cz":0.125,"lx":0.695,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jbcUSTcV9ETtNTun9qHy9c","selected":false,"ly":0.695},{"type":"Human","name":"Jennifer","cx":6.650342532886793,"cy":-5.869419038331923,"cz":0.125,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"6mEiayfKLXRKd6HoatZeT7","selected":false,"ly":0.45},{"type":"Human","name":"Jeff","cx":8.281124000346418,"cy":-0.21288109922245724,"cz":0.125,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"o9nFAFEjnDEDMLNsibYbMM","selected":false,"ly":0.6},{"type":"Human","name":"Jacqueline","cx":8.774300454275942,"cy":-3.11382005301836,"cz":0.12499999999999956,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9kJpcRTmPtd11noXLWWsGH","selected":false,"ly":0.43},{"type":"Human","name":"Joey","cx":5.394689962250994,"cy":-6.419034150551809,"cz":0.12500000000000044,"lx":0.462,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"wMtjHPExCprVrQ6rgijhKz","selected":false,"ly":0.462},{"type":"Human","name":"Jett","cx":5.607500871784192,"cy":-7.300972318306286,"cz":0.12500000000000044,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tfCgFHPgnZKoKRfd18qKeP","selected":false,"ly":0.6},{"type":"Human","name":"John","cx":7.617007740588695,"cy":-5.315039692166635,"cz":0.125,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3NBaVzParvnoX1VTgD2qhi","selected":false,"ly":0.6},{"type":"Human","name":"Judd","cx":8.557509471799634,"cy":-7.331160131258592,"cz":0.125,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"gM888A8u94AD92SprN4wbj","selected":false,"ly":0.544},{"type":"Human","name":"Joan","cx":5.580895600535009,"cy":10.995552502214208,"cz":0,"lx":1.7,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"1j9fkBAMPQ7exCAX2P7fF1","selected":false,"ly":1.7},{"type":"Human","name":"Joel","cx":6.580895600535009,"cy":10.995552502214208,"cz":0,"lx":1.8,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3SfQXzZu7J7mi1JmUBYxFc","selected":false,"ly":1.8},{"type":"Human","name":"June","cx":9.253027066264448,"cy":-1.8207404946549808,"cz":0.125,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"uiRD36Lx6DhqS1L8GSmo2f","selected":false,"ly":0.65},{"type":"Human","name":"Juro","cx":7.94102921033523,"cy":-5.9229770250984926,"cz":0.12500000000000044,"lx":0.494,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"2LZ8A82RZWiecfd18pDMu3","selected":false,"ly":0.494},{"type":"Human","name":"Jamelia","cx":7.019233078838581,"cy":-6.865958327348711,"cz":0.125,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nArb1Wy1pTTLTAwpfD1gxv","selected":false,"ly":0.65},{"type":"Human","name":"Jiya","cx":6.536125724548311,"cy":-7.090427106555895,"cz":0.125,"lx":0.6,"lz":1.74,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3rhHbB9NPHbS5kJ4toDf75","selected":false,"ly":0.6},{"type":"Human","name":"Jumapili","cx":4.710047052887569,"cy":-7.365082439159079,"cz":0.12500000000000044,"lx":0.75,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"2ydVQyK8TCn9PXCMXcCTEy","selected":false,"ly":0.75},{"type":"Human","name":"James","cx":8.638930109856844,"cy":-4.382295505716076,"cz":0.12500000000000044,"lx":0.472,"ly":0.472,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"ucP3AmMZpFLmiVbQL9CJRg","selected":false},{"type":"Human","name":"Jaya","cx":8.430115188508257,"cy":-4.95104947778114,"cz":0.125,"lx":0.6,"ly":0.6,"lz":1.55,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tSdmVjv6FH3XWNZ5eajwUB","selected":false},{"type":"Human","name":"Jocelyn","cx":9.099153262139186,"cy":1.6734195388718494,"cz":0.125,"lx":0.4,"ly":0.4,"lz":1.72,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"oY9mHLD2TnGtS48tFX7msv","selected":false},{"type":"Human","name":"Julia","cx":8.50369110484068,"cy":-5.75207005231741,"cz":0.125,"lx":0.43,"ly":0.43,"lz":1.71,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"noQp7pbZpEPcCC5Bwy2Ds5","selected":false},{"type":"Human","name":"Julio","cx":6.3276841954899155,"cy":-7.497137528054779,"cz":0.12500000000000044,"lx":0.5,"ly":0.5,"lz":1.76,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"86gZdR7TufwZSuihX2WNJZ","selected":false},{"type":"Human","name":"Jose","cx":4.085694603550463,"cy":-9.392938952651445,"cz":0,"lx":2,"ly":2,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"pTRxrEpSAWLBc3BhSmJurU","selected":false},{"type":"Human","name":"Joseph","cx":4.70285983370786,"cy":-8.668392524889338,"cz":8.881784197001252e-16,"lx":0.6,"ly":0.6,"lz":1.88,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"qx4Vz41aeQtxbcayMgdcfb","selected":false},{"type":"Light","decay":2,"distance":5,"intensity":3,"color":"#ffff99","cx":0.0032094235984929786,"cy":0,"cz":-0.15034969489506517,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[1,-2.220446049250313e-16,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"7ZdVSQw5Udf8Sk6TxfRr7E","selected":false},{"type":"Human","name":"Jill","cx":9.085367232279435,"cy":2.675249483795916,"cz":0.125,"lx":0.42,"ly":0.42,"lz":1.71,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tnutvhGAiQivDEaTbwWokd","selected":false},{"type":"Human","name":"Jane","cx":10.315104916263296,"cy":-5.841074350867604,"cz":0,"lx":0.4,"ly":0.4,"lz":1.67,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"2qCeCbYUD9ZAWR8LaSwSBc","selected":false},{"type":"Human","name":"Judy","cx":8.894992472252287,"cy":-0.05735797632890183,"cz":0.125,"lx":0.41,"ly":0.41,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"evvFN1Y5c55LCjm2Zs4RPR","selected":false},{"type":"Human","name":"Jonathon","cx":7.865481936696703,"cy":-8.800651006432007,"cz":-4.440892098500626e-16,"lx":0.6,"ly":0.6,"lz":1.9,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"cPGv26A3o2hSuwc8DPUQ6y","selected":false},{"type":"Human","name":"Joshua","cx":9.361559767195017,"cy":-2.653290992466755,"cz":0.12499999999999956,"lx":0.5,"ly":0.5,"lz":1.79,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rd5u6niG5wuUyGxwjj9FrQ","selected":false},{"type":"Human","name":"Justin","cx":8.841054844860178,"cy":-3.9407835630247803,"cz":0.125,"lx":0.6,"ly":0.6,"lz":1.755,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nctqWUAWcyYHT4SGzerSs4","selected":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.5,"y":-0.5},{"x":-0.5,"y":-0.25},{"x":0.5,"y":-0.25},{"x":0.5,"y":-0.5}],"parentId":"8XDG3EHsQoX26MhuzwMYUM","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":2,"id":"bcBZb3U93o5F2jxgHWz66U","text":"Welcome to Moosehorn State Park","fontSize":0.5,"fontColor":"gold","fontOutlineColor":"white","fontOutlineWidth":0,"fontStrokeWidth":0.01,"noOutline":false,"textureType":"Polygon Texture #9"}],"sceneRadius":19,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[3.150676678462785,4.331280702823742,0.00000433147322558565],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[3.150676678462785,4.331130696160679,150],"theme":"Lake","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[17.624223636446942,-6.695533088864225,2.329292013297666],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.84710869799634,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.4679506390771288,0.22749806834114614,2.3292876283609285],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},475:function(e){e.exports=JSON.parse('{"docid":"mW1ttJThpPJ2JKrSAT7EUP","time":"02/04/2023 01:03 pm","timestamp":1675533820168,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":31.29833989999999,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":120.58319,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Suzhou, Jiangsu, China","date":"4/22/2022, 3:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Exact","daysPerYear":4},"elements":[{"cy":-0.059966096117782364,"normal":[0,0,1],"lz":0.08187919001653333,"ly":13.340881459022976,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.23469319781280173,"cz":0.05,"rotation":[0,0,0],"lx":13.149110146454165,"selected":false,"parentId":"Ground","locked":false},{"type":"Wall","cx":-5.704543355403865,"cy":0.218424664108547,"cz":0,"lx":5.274193548387098,"ly":0.3,"lz":4,"relativeAngle":-1.5707963267948972,"leftPoint":[-5.704543355403863,2.855521438302096,0.08187919001653333],"rightPoint":[-5.704543355403865,-2.418672110085002,0.08187919001653333],"leftJoints":["phev4gQxjvHYwHg819vEHB"],"rightJoints":["kdCvwj5JgamPrPyPvrdvAm"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4xuyJn2DKfBNBFjKWxSNkV","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-4.031115363517457,"cy":4.320575201742957,"cz":0,"lx":4.448255286649458,"ly":0.3,"lz":4,"relativeAngle":-2.4224905134396697,"leftPoint":[-2.357687371631047,5.785628965183817,0.08187919001653333],"rightPoint":[-5.7045433554038665,2.855521438302096,0.08187919001653333],"leftJoints":["98ta6USvR1CGq17YJbnQS1"],"rightJoints":["4xuyJn2DKfBNBFjKWxSNkV"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"phev4gQxjvHYwHg819vEHB","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-4.031115363517457,"cy":-4.176736626214033,"cz":0,"lx":4.854339125731116,"ly":0.3,"lz":4,"relativeAngle":-0.8100578027781637,"leftPoint":[-5.704543355403865,-2.418672110085002,0.08187919001653333],"rightPoint":[-2.357687371631049,-5.934801142343065,0.08187919001653333],"leftJoints":["4xuyJn2DKfBNBFjKWxSNkV"],"rightJoints":["nw6raZBAGuWkF5ubuLU8xD"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kdCvwj5JgamPrPyPvrdvAm","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":4.33602459591459,"cy":-4.176736626214031,"cz":0,"lx":4.854339125731116,"ly":0.3,"lz":4,"relativeAngle":0.8100578027781632,"leftPoint":[2.66259660402818,-5.934801142343061,0.08187919001653333],"rightPoint":[6.0094525878009994,-2.4186721100849997,0.08187919001653333],"leftJoints":["nw6raZBAGuWkF5ubuLU8xD"],"rightJoints":["iV9VtU8uZo4yDiYJfPcmdy"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"npYCeoFyusHZjnvHSA5MHT","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.15245461619856626,"cy":5.785628965183817,"cz":0,"lx":5.020283975659227,"ly":0.3,"lz":4,"relativeAngle":3.1415926535897927,"leftPoint":[2.66259660402818,5.7856289651838155,0.08187919001653333],"rightPoint":[-2.357687371631047,5.785628965183817,0.08187919001653333],"leftJoints":["p7LQvPgC6EYePDocPwo9xL"],"rightJoints":["phev4gQxjvHYwHg819vEHB"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"98ta6USvR1CGq17YJbnQS1","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.0094525878009994,"cy":0.21842466410854633,"cz":0,"lx":5.274193548387096,"ly":0.3,"lz":4,"relativeAngle":1.5707963267948966,"leftPoint":[6.0094525878009994,-2.418672110085002,0.08187919001653333],"rightPoint":[6.0094525878009994,2.8555214383020946,0.08187919001653333],"leftJoints":["npYCeoFyusHZjnvHSA5MHT"],"rightJoints":["p7LQvPgC6EYePDocPwo9xL"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iV9VtU8uZo4yDiYJfPcmdy","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.1526933276969229,"cy":-5.934801142343063,"cz":0,"lx":5.021429002185668,"ly":0.3,"lz":4,"leftJoints":["kdCvwj5JgamPrPyPvrdvAm"],"rightJoints":["npYCeoFyusHZjnvHSA5MHT"],"leftPoint":[-2.357687371631049,-5.934801142343065,0.08187919001653333],"rightPoint":[2.6630740270248947,-5.934801142343061,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"nw6raZBAGuWkF5ubuLU8xD","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":4.33602459591459,"cy":4.3205752017429555,"cz":0,"lx":4.448255286649457,"ly":0.3,"lz":4,"leftJoints":["iV9VtU8uZo4yDiYJfPcmdy"],"rightJoints":["98ta6USvR1CGq17YJbnQS1"],"leftPoint":[6.0094525878009994,2.8555214383020946,0.08187919001653333],"rightPoint":[2.66259660402818,5.7856289651838155,0.08187919001653333],"relativeAngle":2.4224905134396693,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"p7LQvPgC6EYePDocPwo9xL","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Human","name":"Jack","cx":-4.760459270800288,"cy":-2.5348481679853134,"cz":0.1,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"wvAyR5FHsaRG2ToXMAXh87","selected":false,"ly":0.42,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Mansard","roofStructure":"Default","wallsId":["npYCeoFyusHZjnvHSA5MHT"],"ridgeWidth":1,"textureType":"No Roof Texture","color":"#8e826f","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cqv2PuQ6Ct8FunGC5Rsg5E","locked":false,"rise":1.4151723428443308,"ceiling":false},{"type":"Wall","cx":-4.710361945157022,"cy":1.4641075126787761,"cz":0,"lx":4.0741991827809585,"ly":0.3,"lz":7.5,"leftJoints":["mNbBhBDTayeXWAoDE8ip6A"],"rightJoints":["giioZ24KGCk6oJoadGeQJg"],"leftPoint":[-4.710361945157022,3.5012071040692554,0.08187919001653333],"rightPoint":[-4.7103619451570236,-0.5729920787117029,0.08187919001653333],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"fKn6ccVkMdWqQghcJAFmEQ","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-3.3998110672719446,"cy":4.632929099286187,"cz":0,"lx":3.463142086593125,"ly":0.3,"lz":7.5,"leftJoints":["fPGQ97jmfXKFKCgzdf8tK2"],"rightJoints":["fKn6ccVkMdWqQghcJAFmEQ"],"leftPoint":[-2.0892601893868656,5.7646510945031215,0.08187919001653333],"rightPoint":[-4.7103619451570236,3.5012071040692554,0.08187919001653333],"relativeAngle":-2.429286367572432,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"mNbBhBDTayeXWAoDE8ip6A","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-3.399811067271945,"cy":-1.9310584729720213,"cz":0,"lx":3.774592923611536,"ly":0.3,"lz":7.5,"leftJoints":["fKn6ccVkMdWqQghcJAFmEQ"],"rightJoints":["2Ecm8hWzZfEbStzt675QWs"],"leftPoint":[-4.7103619451570236,-0.5729920787117029,0.08187919001653333],"rightPoint":[-2.089260189386867,-3.2891248672323394,0.08187919001653333],"relativeAngle":-0.8032015766363013,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"giioZ24KGCk6oJoadGeQJg","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":3.152943322153453,"cy":-1.9310584729720182,"cz":0,"lx":3.7745929236115394,"ly":0.3,"lz":7.5,"leftJoints":["2Ecm8hWzZfEbStzt675QWs"],"rightJoints":["dJmNmvxvjdHh3vPxEXp335"],"leftPoint":[1.8423924442683726,-3.289124867232336,0.08187919001653333],"rightPoint":[4.463494200038532,-0.5729920787116995,0.08187919001653333],"relativeAngle":0.8032015766363004,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"oq3EhiCKFwwA92Ur9WnxEC","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-0.12343387255924654,"cy":5.7646510945031215,"cz":0,"lx":3.931652633655238,"ly":0.3,"lz":7.5,"leftJoints":["mPpYQCigCupk4wWxmYLiGt"],"rightJoints":["mNbBhBDTayeXWAoDE8ip6A"],"leftPoint":[1.8423924442683726,5.7646510945031215,0.08187919001653333],"rightPoint":[-2.0892601893868656,5.7646510945031215,0.08187919001653333],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"fPGQ97jmfXKFKCgzdf8tK2","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":4.463494200038532,"cy":1.4641075126787761,"cz":0,"lx":4.0741991827809585,"ly":0.3,"lz":7.5,"leftJoints":["oq3EhiCKFwwA92Ur9WnxEC"],"rightJoints":["mPpYQCigCupk4wWxmYLiGt"],"leftPoint":[4.463494200038532,-0.5729920787117029,0.08187919001653333],"rightPoint":[4.463494200038532,3.5012071040692554,0.08187919001653333],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"dJmNmvxvjdHh3vPxEXp335","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-0.12343387255924654,"cy":-3.289124867232336,"cz":0,"lx":3.931652633655238,"ly":0.3,"lz":7.5,"leftJoints":["giioZ24KGCk6oJoadGeQJg"],"rightJoints":["oq3EhiCKFwwA92Ur9WnxEC"],"leftPoint":[-2.0892601893868656,-3.289124867232336,0.08187919001653333],"rightPoint":[1.8423924442683726,-3.289124867232336,0.08187919001653333],"relativeAngle":0,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"2Ecm8hWzZfEbStzt675QWs","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":3.152943322153453,"cy":4.632929099286187,"cz":0,"lx":3.4631420865931273,"ly":0.3,"lz":7.5,"leftJoints":["dJmNmvxvjdHh3vPxEXp335"],"rightJoints":["fPGQ97jmfXKFKCgzdf8tK2"],"leftPoint":[4.463494200038532,3.5012071040692554,0.08187919001653333],"rightPoint":[1.8423924442683726,5.7646510945031215,0.08187919001653333],"relativeAngle":2.4292863675724323,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"mPpYQCigCupk4wWxmYLiGt","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"id":"56kE8YxGS5vZT15DARe55m","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8e826f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofType":"Mansard","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["oq3EhiCKFwwA92Ur9WnxEC"],"ridgeWidth":1,"selected":false,"locked":false,"rise":1.4151723428443308,"ceiling":false},{"type":"Foundation","cx":0.07312548836645227,"cy":-1.3848958277284682,"cz":0.05,"lx":9.464156224937316,"ly":12.896297667676603,"lz":0.08187919001653333,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eTosNnXwuFCRGqZWfF7TsY","selected":false,"locked":false},{"type":"Wall","cx":-3.4962075675486224,"cy":2.7874111204970315,"cz":0,"lx":2.8892970239124907,"ly":0.3,"lz":11,"leftJoints":["wg8fH2jxgcfzoEQ3iyHRk5"],"rightJoints":["bzdCKkoEsHKfg6PMf8sKa9"],"leftPoint":[-3.4962075675486224,4.232059632453278],"rightPoint":[-3.496207567548624,1.3427626085407864],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"mMPeuLSFxt2hhKw1jzoAXX","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":-2.5042315840033176,"cy":5.0346421390956335,"cz":0,"lx":2.5519835672660642,"ly":0.3,"lz":11,"leftJoints":["5SAdNQtzr2xU5rw3LJPFUt"],"rightJoints":["mMPeuLSFxt2hhKw1jzoAXX"],"leftPoint":[-1.5122556004580119,5.837224645737991],"rightPoint":[-3.496207567548624,4.232059632453278],"relativeAngle":-2.461342900204164,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"wg8fH2jxgcfzoEQ3iyHRk5","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":-2.5042315840033185,"cy":0.3796636005699572,"cz":0,"lx":2.7651951476053704,"ly":0.3,"lz":11,"leftJoints":["mMPeuLSFxt2hhKw1jzoAXX"],"rightJoints":["d6PNwTS2wJV1Koozu7wRCJ"],"leftPoint":[-3.496207567548624,1.3427626085407864],"rightPoint":[-1.5122556004580128,-0.5834354074008719],"relativeAngle":-0.7706289724283263,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"bzdCKkoEsHKfg6PMf8sKa9","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":2.455648333723217,"cy":0.37966360056995985,"cz":0,"lx":2.765195147605374,"ly":0.3,"lz":11,"leftJoints":["d6PNwTS2wJV1Koozu7wRCJ"],"rightJoints":["1cSqXyGASoNdwCM2MQgYAg"],"leftPoint":[1.4636723501779088,-0.5834354074008692],"rightPoint":[3.4476243172685246,1.3427626085407889],"relativeAngle":0.770628972428325,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"tdJA55oXTxjRMFMd2yzHeU","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":-0.024291625140051565,"cy":5.837224645737991,"cz":0,"lx":2.9759279506359206,"ly":0.3,"lz":11,"leftJoints":["5zeSH5hMhT3UJzZ2VMSrtV"],"rightJoints":["wg8fH2jxgcfzoEQ3iyHRk5"],"leftPoint":[1.4636723501779088,5.837224645737991],"rightPoint":[-1.5122556004580119,5.837224645737991],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"5SAdNQtzr2xU5rw3LJPFUt","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":3.4476243172685246,"cy":2.7874111204970315,"cz":0,"lx":2.8892970239124907,"ly":0.3,"lz":11,"leftJoints":["tdJA55oXTxjRMFMd2yzHeU"],"rightJoints":["5zeSH5hMhT3UJzZ2VMSrtV"],"leftPoint":[3.4476243172685246,1.3427626085407864],"rightPoint":[3.4476243172685246,4.232059632453278],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"1cSqXyGASoNdwCM2MQgYAg","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":-0.024291625140051565,"cy":-0.5834354074008692,"cz":0,"lx":2.9759279506359206,"ly":0.3,"lz":11,"leftJoints":["bzdCKkoEsHKfg6PMf8sKa9"],"rightJoints":["tdJA55oXTxjRMFMd2yzHeU"],"leftPoint":[-1.5122556004580119,-0.5834354074008692],"rightPoint":[1.4636723501779088,-0.5834354074008692],"relativeAngle":0,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"d6PNwTS2wJV1Koozu7wRCJ","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":2.455648333723217,"cy":5.0346421390956335,"cz":0,"lx":2.551983567266067,"ly":0.3,"lz":11,"leftJoints":["1cSqXyGASoNdwCM2MQgYAg"],"rightJoints":["5SAdNQtzr2xU5rw3LJPFUt"],"leftPoint":[3.4476243172685246,4.232059632453278],"rightPoint":[1.4636723501779088,5.837224645737991],"relativeAngle":2.4613429002041647,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"5zeSH5hMhT3UJzZ2VMSrtV","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"id":"kXXsWtzhvHq2DAaXZEi8ju","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8e826f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofType":"Mansard","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["tdJA55oXTxjRMFMd2yzHeU"],"ridgeWidth":1,"selected":false,"locked":false,"rise":1.4151723428443308,"ceiling":false},{"type":"Foundation","cx":-0.1382893636180098,"cy":-2.8344198053167737,"cz":0.05,"lx":7.240655122656252,"ly":11.908488628124994,"lz":0.08187919001653333,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"67a4Cj7mTjUcKpS9UXcYMf","selected":false,"locked":false},{"type":"Wall","cx":-2.305386933936208,"cy":3.5406126703672625,"cz":0,"lx":1.8992997541814245,"ly":0.3,"lz":14.5,"leftJoints":["3uhgX6EhXdVFMDgjKuTvWJ"],"rightJoints":["6a5FbNhUegAfkm1WbCa4hr"],"leftPoint":[-2.305386933936208,4.4902625474579745,0.08187919001653333],"rightPoint":[-2.305386933936208,2.59096279327655,0.08187919001653333],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"m9CmZzHka279S6PzqcJDms","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":-1.6457325150805282,"cy":5.017845812508369,"cz":0,"lx":1.6893644412938968,"ly":0.3,"lz":14.5,"leftJoints":["cj1x2iAzLBRGYCY4fbDa9u"],"rightJoints":["m9CmZzHka279S6PzqcJDms"],"leftPoint":[-0.9860780962248481,5.545429077558764,0.08187919001653333],"rightPoint":[-2.305386933936208,4.4902625474579745,0.08187919001653333],"relativeAngle":-2.466981384386693,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"3uhgX6EhXdVFMDgjKuTvWJ","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":-1.6457325150805282,"cy":1.9578628752160765,"cz":0,"lx":1.8286163715377841,"ly":0.3,"lz":14.5,"leftJoints":["m9CmZzHka279S6PzqcJDms"],"rightJoints":["pLBnaJicNdNqvsWh4XB2xC"],"leftPoint":[-2.305386933936208,2.59096279327655,0.08187919001653333],"rightPoint":[-0.9860780962248481,1.3247629571556034,0.08187919001653333],"relativeAngle":-0.7648600253804781,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"6a5FbNhUegAfkm1WbCa4hr","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":1.6525395791978759,"cy":1.9578628752160787,"cz":0,"lx":1.8286163715377868,"ly":0.3,"lz":14.5,"leftJoints":["pLBnaJicNdNqvsWh4XB2xC"],"rightJoints":["x2WKNCsnTm3wuwLHXfgCEX"],"leftPoint":[0.9928851603421944,1.3247629571556052,0.08187919001653333],"rightPoint":[2.312193998053557,2.5909627932765527,0.08187919001653333],"relativeAngle":0.7648600253804773,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"1WEB2uNx8HTmooMiMdCuRb","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":0.0034035320586731643,"cy":5.545429077558764,"cz":0,"lx":1.9789632565670425,"ly":0.3,"lz":14.5,"leftJoints":["caQUPNBf9AQWUAkvEEKBK9"],"rightJoints":["3uhgX6EhXdVFMDgjKuTvWJ"],"leftPoint":[0.9928851603421944,5.545429077558764,0.08187919001653333],"rightPoint":[-0.9860780962248481,5.545429077558764,0.08187919001653333],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"cj1x2iAzLBRGYCY4fbDa9u","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":2.312193998053557,"cy":3.5406126703672625,"cz":0,"lx":1.8992997541814245,"ly":0.3,"lz":14.5,"leftJoints":["1WEB2uNx8HTmooMiMdCuRb"],"rightJoints":["caQUPNBf9AQWUAkvEEKBK9"],"leftPoint":[2.312193998053557,2.59096279327655,0.08187919001653333],"rightPoint":[2.312193998053557,4.4902625474579745,0.08187919001653333],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"x2WKNCsnTm3wuwLHXfgCEX","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":0.0034035320586731643,"cy":1.3247629571556052,"cz":0,"lx":1.9789632565670425,"ly":0.3,"lz":14.5,"leftJoints":["6a5FbNhUegAfkm1WbCa4hr"],"rightJoints":["1WEB2uNx8HTmooMiMdCuRb"],"leftPoint":[-0.9860780962248481,1.3247629571556052,0.08187919001653333],"rightPoint":[0.9928851603421944,1.3247629571556052,0.08187919001653333],"relativeAngle":0,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"pLBnaJicNdNqvsWh4XB2xC","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":1.6525395791978759,"cy":5.017845812508369,"cz":0,"lx":1.6893644412938993,"ly":0.3,"lz":14.5,"leftJoints":["x2WKNCsnTm3wuwLHXfgCEX"],"rightJoints":["cj1x2iAzLBRGYCY4fbDa9u"],"leftPoint":[2.312193998053557,4.4902625474579745,0.08187919001653333],"rightPoint":[0.9928851603421944,5.545429077558764,0.08187919001653333],"relativeAngle":2.4669813843866937,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"caQUPNBf9AQWUAkvEEKBK9","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"id":"pHdzF3ngGjARqDaSnrPCbJ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8e826f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofType":"Mansard","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["1WEB2uNx8HTmooMiMdCuRb"],"ridgeWidth":1,"selected":false,"locked":false,"rise":1.4151723428443308,"ceiling":false},{"type":"Foundation","cx":-0.12202054492778736,"cy":-3.6786752972065244,"cz":0.05,"lx":4.62580908783712,"ly":11.244705561904492,"lz":0.08187919001653333,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mZUacXWS8C3iqt3FX2P392","selected":false,"locked":false},{"type":"Wall","cx":-2.1374696253712813,"cy":0.6843845582744623,"cz":0,"lx":1.3196288700603707,"ly":0.3,"lz":18,"leftJoints":["nDHpcsgkV9peBKJpWVGgfd"],"rightJoints":["k2jx5wJhEXwRbUKXtsBVsi"],"leftPoint":[-2.1374696253712813,1.3441989933046479,0.2],"rightPoint":[-2.1374696253712813,0.02457012324427721,0.2],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"9D7SuFhdAmbL3s4qJSt14J","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":-1.7017113613971415,"cy":1.7107625683214178,"cz":0,"lx":1.1388663119977358,"ly":0.3,"lz":18,"leftJoints":["rhFdf5zdJe6JyTbbEFrxS6"],"rightJoints":["9D7SuFhdAmbL3s4qJSt14J"],"leftPoint":[-1.2659530974230018,2.0773261433381873,0.2],"rightPoint":[-2.1374696253712813,1.3441989933046479,0.2],"relativeAngle":-2.442224676045199,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"nDHpcsgkV9peBKJpWVGgfd","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":-1.7017113613971415,"cy":-0.41530616677584553,"cz":0,"lx":1.2383479561797213,"ly":0.3,"lz":18,"leftJoints":["9D7SuFhdAmbL3s4qJSt14J"],"rightJoints":["k1Zz3xzbmLW17cj6uWBzfc"],"leftPoint":[-2.1374696253712813,0.02457012324427721,0.2],"rightPoint":[-1.2659530974230018,-0.8551824567959683,0.2],"relativeAngle":-0.790101033639045,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"k2jx5wJhEXwRbUKXtsBVsi","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":0.47707995847355766,"cy":-0.4153061667758444,"cz":0,"lx":1.2383479561797235,"ly":0.3,"lz":18,"leftJoints":["k1Zz3xzbmLW17cj6uWBzfc"],"rightJoints":["bQ466SAJMAnn6fakoD16LP"],"leftPoint":[0.041321694499416806,-0.8551824567959676,0.2],"rightPoint":[0.9128382224476985,0.024570123244278763,0.2],"relativeAngle":0.7901010336390442,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"6akTVpZG7AbvMgXaG1q3Nh","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":-0.6123157014617926,"cy":2.0773261433381873,"cz":0,"lx":1.3072747919224188,"ly":0.3,"lz":18,"leftJoints":["cGGqfipx5C3U3jy37qBmH3"],"rightJoints":["nDHpcsgkV9peBKJpWVGgfd"],"leftPoint":[0.041321694499416806,2.0773261433381873,0.2],"rightPoint":[-1.2659530974230018,2.0773261433381873,0.2],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"rhFdf5zdJe6JyTbbEFrxS6","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":0.9128382224476985,"cy":0.6843845582744623,"cz":0,"lx":1.3196288700603707,"ly":0.3,"lz":18,"leftJoints":["6akTVpZG7AbvMgXaG1q3Nh"],"rightJoints":["cGGqfipx5C3U3jy37qBmH3"],"leftPoint":[0.9128382224476985,0.02457012324427721,0.2],"rightPoint":[0.9128382224476985,1.3441989933046479,0.2],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"bQ466SAJMAnn6fakoD16LP","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":-0.6123157014617926,"cy":-0.8551824567959676,"cz":0,"lx":1.3072747919224188,"ly":0.3,"lz":18,"leftJoints":["k2jx5wJhEXwRbUKXtsBVsi"],"rightJoints":["6akTVpZG7AbvMgXaG1q3Nh"],"leftPoint":[-1.2659530974230018,-0.8551824567959676,0.2],"rightPoint":[0.041321694499416806,-0.8551824567959676,0.2],"relativeAngle":0,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"k1Zz3xzbmLW17cj6uWBzfc","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":0.47707995847355766,"cy":1.7107625683214178,"cz":0,"lx":1.1388663119977376,"ly":0.3,"lz":18,"leftJoints":["bQ466SAJMAnn6fakoD16LP"],"rightJoints":["rhFdf5zdJe6JyTbbEFrxS6"],"leftPoint":[0.9128382224476985,1.3441989933046479,0.2],"rightPoint":[0.041321694499416806,2.0773261433381873,0.2],"relativeAngle":2.4422246760452,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"cGGqfipx5C3U3jy37qBmH3","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Foundation","cx":0.5137640713758937,"cy":-0.8247397257024911,"cz":0.1,"lx":17.47075427773578,"ly":17.57589746990512,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"t3DvVsTxEUmLPJ5qyzz1Cq","selected":false,"locked":false,"enableGroupMaster":true},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.3982929957049007,"ly":0.3,"lz":0.75,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nw6raZBAGuWkF5ubuLU8xD","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kJ99yCt5NwrUx6aeyLQD19","opacity":0,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.04022745849176903,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"k1Zz3xzbmLW17cj6uWBzfc","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"2i6NJTsHZcvu5DZpjL2nTf","opacity":0,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.049787851751147326,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"827buPg2up7S5NJpu1bTwc","parentId":"6akTVpZG7AbvMgXaG1q3Nh","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.03092128411947934,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"696xgzPkcYLSq7T7Qw1kVp","parentId":"bQ466SAJMAnn6fakoD16LP","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.03385386298551652,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jCNeHwVCUvbqQjRxPEpVWh","parentId":"k2jx5wJhEXwRbUKXtsBVsi","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.06228256362044849,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"x8xMT8Y3CFHpSTTtRuQJEH","parentId":"cGGqfipx5C3U3jy37qBmH3","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.02834774148633909,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"nppApRrEXRyeUd9vJfwuSz","parentId":"rhFdf5zdJe6JyTbbEFrxS6","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.02951470439825077,"cy":0.1,"cz":0.44184392259435495,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"wGQdjaEJAq274XD4qjARvv","parentId":"nDHpcsgkV9peBKJpWVGgfd","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.02377711455299869,"cy":0.1,"cz":0.4427721444522278,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"bfx8vmpw2KKDieuVcLZMqt","parentId":"9D7SuFhdAmbL3s4qJSt14J","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3333333333333333,"lx":0.2543459692852634,"ly":0.3,"lz":0.2666666666666667,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"b18KSu7muEcNBoRo9BCFtR","parentId":"2Ecm8hWzZfEbStzt675QWs","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.005291630779154989,"cy":0.1,"cz":0.36666666666666664,"lx":0.2543459692852634,"ly":0.3,"lz":0.20000000000000007,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"6ehjjnYKcMRY6uDm39RjZg","parentId":"oq3EhiCKFwwA92Ur9WnxEC","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.00444948057017957,"cy":0.1,"cz":0.36666666666666664,"lx":0.2543459692852634,"ly":0.3,"lz":0.20000000000000007,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"beNSFD5YoXGJs5n6HkCEia","parentId":"dJmNmvxvjdHh3vPxEXp335","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":5.610195147971379e-17,"cy":0.1,"cz":0.3333333333333333,"lx":0.2887551174614818,"ly":0.3,"lz":0.2666666666666667,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"enXaCvRZY1o42EepsmhAcu","parentId":"mPpYQCigCupk4wWxmYLiGt","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3333333333333333,"lx":0.2543459692852634,"ly":0.3,"lz":0.2666666666666667,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"co2nWxWjHSrQ1y3CbewV71","parentId":"fPGQ97jmfXKFKCgzdf8tK2","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3333333333333333,"lx":0.2887551174614821,"ly":0.3,"lz":0.2666666666666667,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"oAJfvW2Atau2PMDooxnZup","parentId":"mNbBhBDTayeXWAoDE8ip6A","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":2.72500919767831e-17,"cy":0.1,"cz":0.33333333333333326,"lx":0.24544700814490417,"ly":0.3,"lz":0.2666666666666668,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"oysyT4xkNku4YbbVaJZRwr","parentId":"fKn6ccVkMdWqQghcJAFmEQ","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3333333333333333,"lx":0.2649292308435736,"ly":0.3,"lz":0.26666666666666666,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tfr35CsQ7uYrvJEbNiSm9Z","parentId":"giioZ24KGCk6oJoadGeQJg","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-2.007494887994791e-17,"cy":0.1,"cz":0.38636363636363646,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aVd2M9mPnyt54bpo1cinGs","parentId":"bzdCKkoEsHKfg6PMf8sKa9","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.01280424424064466,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vEK53nipfn3Fi9zDdjYNwA","parentId":"d6PNwTS2wJV1Koozu7wRCJ","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":2.0074948879947884e-17,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086014,"ly":0.3,"lz":0.1363636363636365,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"7a8LzQgQTZT74cAMqSaHG3","parentId":"tdJA55oXTxjRMFMd2yzHeU","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.007766589935909038,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"m8mvZULmKJiijiJZQ4Ws2p","parentId":"1cSqXyGASoNdwCM2MQgYAg","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.015106961898701282,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2yZN5brch6X6VdX7qusThM","parentId":"5zeSH5hMhT3UJzZ2VMSrtV","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.01280424424064466,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"6wGZka29sHQXPaM4orSj26","parentId":"5SAdNQtzr2xU5rw3LJPFUt","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.015106961898701494,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tFAKFAeYrHzMpedpoQ4z2J","parentId":"wg8fH2jxgcfzoEQ3iyHRk5","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.007766589935909038,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tsfJ1jgF5hbLvum632wKcR","parentId":"mMPeuLSFxt2hhKw1jzoAXX","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"1tp2T4LDRLMNEK26RseK5r","parentId":"pLBnaJicNdNqvsWh4XB2xC","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.020773233582139315,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tgrkWzLGJa5Q9w4cDnLRRp","parentId":"1WEB2uNx8HTmooMiMdCuRb","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.01059737146443586,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"o3JTZDoUCh4i6VTFAXTRi5","parentId":"x2WKNCsnTm3wuwLHXfgCEX","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"86L95Fnu4u89jayQZWX5Xw","parentId":"cj1x2iAzLBRGYCY4fbDa9u","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.043311747423323166,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vNmcUsYJDkYimiCfMHdNFB","parentId":"3uhgX6EhXdVFMDgjKuTvWJ","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.01059737146443586,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"dDi3Fw7AsTes6zvNGEEHiL","parentId":"m9CmZzHka279S6PzqcJDms","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.02077323358213971,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"bAVGu4K7Tu42BYzdxoX44L","parentId":"6a5FbNhUegAfkm1WbCa4hr","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.4120025297364816,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"qGTqwRerdw925V3dp1Zxqj","parentId":"npYCeoFyusHZjnvHSA5MHT","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.3792048929663609,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"76hrnZkDNKTnFBf136Yypd","parentId":"iV9VtU8uZo4yDiYJfPcmdy","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-2.4958617549610238e-17,"cy":0.1,"cz":-0.125,"lx":0.44961448278442956,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4dQWwkYdrjgXGYUZinRtRU","parentId":"p7LQvPgC6EYePDocPwo9xL","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.39838383838383856,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vetMY2wce8PY7wZMnBgYtd","parentId":"98ta6USvR1CGq17YJbnQS1","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.4496144827844295,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"v2Bpx6NQy5wWaCAkP524Kv","parentId":"phev4gQxjvHYwHg819vEHB","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":3.157515024163289e-17,"cy":0.1,"cz":-0.12499999999999994,"lx":0.3792048929663607,"ly":0.3,"lz":0.7499999999999999,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"rDQtPqhJZVdy7Xh7XJRsb3","parentId":"4xuyJn2DKfBNBFjKWxSNkV","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":8.004757157551921e-17,"cy":0.1,"cz":-0.125,"lx":0.4120025297364814,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"e19JPkz5u6tKcbjYUvXegq","parentId":"kdCvwj5JgamPrPyPvrdvAm","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Human","name":"Jacqueline","cx":4.255864387589413,"cy":-6.242196181277151,"cz":0.1,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"wfWT37sYApxTzWzUncAoR9","selected":false,"locked":false,"ly":0.43},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["6akTVpZG7AbvMgXaG1q3Nh","bQ466SAJMAnn6fakoD16LP","cGGqfipx5C3U3jy37qBmH3","rhFdf5zdJe6JyTbbEFrxS6","nDHpcsgkV9peBKJpWVGgfd","9D7SuFhdAmbL3s4qJSt14J","k2jx5wJhEXwRbUKXtsBVsi","k1Zz3xzbmLW17cj6uWBzfc"],"textureType":"No Roof Texture","color":"#8e826f","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"rdzur4ggFrcghzk546PTce","locked":false,"rise":0.7945305564645331,"ceiling":false},{"type":"Tree","name":"Dogwood","cx":7.392171297775102,"cy":7.163513110419622,"cz":0.10000000149011612,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"jBw9RYvUZrnME36Vm8DaPW","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":6.759545239381245,"cy":-2.5910214138353416,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"5kQBFtBdW6bwiFWnzf9wwH","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":6.490113616723971,"cy":3.8154638360153057,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"2GfJNYSop6f5v7xSek1ytE","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":2.508512970788757,"cy":7.348011777521739,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"adVq8AGmfbAWANd1ERqtLC","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-3.329172186785436,"cy":7.377948624483658,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"okSKfXzr6RNLYQU4kZsQEZ","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-7.9394466189209485,"cy":4.054958611710656,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"cbRLDrHAkXSVreLWjbyF5V","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-7.819699231073273,"cy":-2.2317792502923153,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"buHEZW6R7p71SuhwZZJ2PT","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-3.808161738176137,"cy":-6.572622059770561,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"9DD3bFQeXC1bN3n5JNfTHY","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":2.2690181950934063,"cy":-6.572622059770561,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"bnApLQ8V1oJiPKXxDRPxb4","selected":false,"locked":false},{"type":"Tree","name":"Dogwood","cx":7.328345331657704,"cy":-6.931864223313587,"cz":0.10000000149011612,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"g8PvSEYYsCu2XWBqG3iX5a","selected":false,"locked":false},{"type":"Tree","name":"Dogwood","cx":-7.759825537149433,"cy":-6.692369447618235,"cz":0.10000000149011612,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"eFc8WGqQzEfKvVgDn3e4Wq","selected":false,"locked":false},{"type":"Tree","name":"Dogwood","cx":-7.459318010176873,"cy":7.482898989893004,"cz":0.10000000149011612,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"288KLWR7KewUpd13gMeuAi","selected":false,"locked":false},{"type":"Window","cx":0.029596929340897304,"cy":0.1,"cz":0.42068965517241375,"lx":0.5327447281361516,"ly":0.3,"lz":0.11034482758620694,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"caQUPNBf9AQWUAkvEEKBK9","foundationId":"mZUacXWS8C3iqt3FX2P392","id":"g8YUeBMeW1DSqfqrvD7Vbk"},{"type":"Light","decay":2,"distance":10,"intensity":2,"color":"#fe9200","cx":-0.030005590627033965,"cy":-0.4532425907688764,"cz":0.5000000074505895,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"qF9C6U2NXL7yTL6tKt4cmM","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":2,"color":"#7b64ff","cx":0.4305972540929517,"cy":0.06205523390636515,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"c16cf3Q9umV9K4iATpzZdw","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":2,"color":"#68bc00","cx":-0.03448954854070917,"cy":0.43858567895245787,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"kdV7kizuYhPCDkqnpXr6Jf","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":2,"color":"#fa28ff","cx":-0.44220837093921556,"cy":0.040360464163231746,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"pCzfVRHLpKFtr7SXEbAF9q","selected":false}],"view":{"yearlyPvYieldPanelX":-67,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Grassland","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":66,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-13,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[-2.010984368039464,-28.85991180576142,8.94754765614511],"panCenter":[-0.2875344548235237,0.8941760908925925,8.94754765614511],"orthographic":false,"enableRotate":true,"cameraZoom":33.40365140230189,"showInstructionPanel":true,"cameraPosition2D":[0.3578976625538651,1.7782818083550982,150],"panCenter2D":[0.3578976625538651,1.778431815016015,0.000002363573287717466],"showEvolutionPanel":false,"solarRadiationHeatMapMaxValue":6,"evolutionPanelX":-13,"evolutionPanelY":8,"evolutionPanelRect":{"x":0,"y":0,"width":498,"height":340},"waterSurface":false,"showMapPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"selectionMethod":1,"searchMethod":1,"populationSize":30,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},476:function(e){e.exports=JSON.parse('{"docid":"8fjimYdFfmatTLYR2DNXvA","time":"02/04/2023 01:05 pm","timestamp":1675533906512,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"orthographic":false,"noAnimationForSolarPanelSimulation":false,"discretization":"Approximate","cspGridCellSize":0.5,"diurnalTemperatureModel":1,"sutDaysPerYear":4,"address":"Honolulu, HI, USA","sutGridCellSize":1,"solarPanelVisibilityGridCellSize":0.2,"airAttenuationCoefficient":0.01,"longitude":-157.86620385714326,"pvGridCellSize":0.5,"date":"4/22/2022, 10:00:00 AM","noAnimationForSolarUpdraftTowerSimulation":false,"cameraZoom":43.16939043526371,"sutTimesPerHour":4,"daysPerYear":12,"timesPerHour":4,"cspDaysPerYear":4,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"latitude":21.310722676290315,"airConvectiveCoefficient":5,"name":"default","solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"highestTemperatureTimeInMinutes":900,"dustLoss":0.05,"noAnimationForHeatmapSimulation":false,"noAnimationForSensorDataCollection":false},"elements":[{"solarAbsorberPipe":{},"solarPowerTower":{},"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"color":"#009ce0","ly":24.9333515261897,"type":"Foundation","parentId":"Ground","lz":0.1,"selected":false,"cz":0.05,"cx":-0.9759327650956084,"cy":2.7473554645675557,"id":"sfVVGvWfY1uFZBwuAeqDnU","solarUpdraftTower":{},"lx":10.57622536718512,"locked":false,"textureType":"No Foundation Texture"},{"showLabel":false,"cz":0,"drawSunBeam":false,"cx":-0.0173882538930337,"color":"#fff","poleRadius":0.05,"parentId":"sfVVGvWfY1uFZBwuAeqDnU","dailyYield":25.00468094869397,"selected":false,"trackerType":"None","orientation":"Portrait","poleSpacing":3,"lx":6.944,"locked":false,"type":"Solar Panel","rotation":[0,0,1.5707963267948966],"ly":3.936,"pvModelName":"CS6X-355P-FG","relativeAzimuth":0,"poleHeight":1.5,"normal":[0,0,1],"id":"4bpFrEwZJxbfGUTtn9R1sg","lz":0.046,"cy":-0.3535113399890203,"foundationId":"sfVVGvWfY1uFZBwuAeqDnU","tiltAngle":0},{"solarAbsorberPipe":{},"lz":0.1,"solarPowerTower":{},"rotation":[0,0,-0.7853981633974483],"locked":false,"cy":3.3785331461228845,"type":"Foundation","solarUpdraftTower":{},"parentId":"Ground","cz":0.05,"selected":false,"lx":17.522626722458362,"ly":16.217549949540043,"normal":[0,0,1],"color":"#009ce0","id":"c2gz3bi2QzLErUX4XmgVX7","cx":2.825325314034343,"textureType":"No Foundation Texture"},{"ly":0.1,"lz":1.75,"selected":false,"textureType":"No Wall Texture","foundationId":"c2gz3bi2QzLErUX4XmgVX7","lineColor":"black","windows":[],"leftPoint":[-0.41513844869064975,-4.018227675100984,0.1],"id":"iQCq8L9uGMQTqYvdj9Zg8G","leftJoints":["cSJn7k7dHrZvyJZf7rCR3h"],"rotation":[0,0,-0.7853981633974483],"showLabel":false,"cz":0,"rightPoint":[0.08486155130934736,-4.01822767510099,0.1],"lineWidth":0.2,"color":"#ffffff","rightJoints":["8BLfCN1Rb2sjqzL81nEAF1"],"locked":false,"cx":-0.16513844869065064,"lx":0.4999999999999971,"roofId":"95ywic4c9x92ks45ZbwSqV","type":"Wall","rightRoofHeight":1.75,"cy":-4.01822767510099,"leftRoofHeight":1.75,"normal":[0,0,1],"relativeAngle":6.283185307179577,"parentId":"c2gz3bi2QzLErUX4XmgVX7","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"cz":0,"foundationId":"c2gz3bi2QzLErUX4XmgVX7","parentId":"c2gz3bi2QzLErUX4XmgVX7","ly":0.1,"cx":-0.16513844869065064,"textureType":"No Wall Texture","roofId":"95ywic4c9x92ks45ZbwSqV","lx":0.5000000000000003,"locked":false,"rightRoofHeight":1.75,"selected":false,"leftPoint":[0.0848615513093498,2.481772324899016,0.1],"cy":2.481772324899016,"lz":1.75,"lineWidth":0.2,"normal":[0,0,1],"relativeAngle":3.1415926535897922,"rightPoint":[-0.41513844869064953,2.481772324899015,0.1],"leftJoints":["8BLfCN1Rb2sjqzL81nEAF1"],"rotation":[0,0,-0.7853981633974483],"type":"Wall","id":"wXQ7LSxUUW2TWS968Lkeqi","showLabel":false,"leftRoofHeight":1.75,"windows":[],"color":"#ffffff","lineColor":"black","rightJoints":["cSJn7k7dHrZvyJZf7rCR3h"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"leftPoint":[-0.41513844869064953,2.481772324899015,0.1],"locked":false,"lineWidth":0.2,"ly":0.1,"windows":[],"rightRoofHeight":1.75,"color":"#ffffff","leftRoofHeight":1.75,"cx":-0.4151384486906503,"id":"cSJn7k7dHrZvyJZf7rCR3h","lx":6.5,"parentId":"c2gz3bi2QzLErUX4XmgVX7","rightPoint":[-0.41513844869064975,-4.018227675100984,0.1],"rotation":[0,0,-0.7853981633974483],"roofId":"95ywic4c9x92ks45ZbwSqV","cz":0,"textureType":"No Wall Texture","leftJoints":["wXQ7LSxUUW2TWS968Lkeqi"],"selected":false,"foundationId":"c2gz3bi2QzLErUX4XmgVX7","relativeAngle":4.71238898038469,"type":"Wall","cy":-0.7682276751009843,"lz":1.75,"showLabel":false,"lineColor":"black","rightJoints":["iQCq8L9uGMQTqYvdj9Zg8G"],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"locked":false,"selected":false,"type":"Wall","lz":1.75,"leftRoofHeight":1.75,"textureType":"No Wall Texture","id":"8BLfCN1Rb2sjqzL81nEAF1","leftPoint":[0.08486155130935003,-4.0182276751009915,0.1],"cx":0.08486155130935003,"roofId":"95ywic4c9x92ks45ZbwSqV","cz":0,"ly":0.1,"relativeAngle":1.5707963267948966,"color":"#ffffff","foundationId":"c2gz3bi2QzLErUX4XmgVX7","lineColor":"black","rightPoint":[0.0848615513093498,2.481772324899016,0.1],"cy":-0.7682276751009878,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"lx":6.500000000000005,"leftJoints":["iQCq8L9uGMQTqYvdj9Zg8G"],"parentId":"c2gz3bi2QzLErUX4XmgVX7","rightRoofHeight":1.75,"rightJoints":["wXQ7LSxUUW2TWS968Lkeqi"],"windows":[],"lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"normal":[0,0,1],"wallsId":["8BLfCN1Rb2sjqzL81nEAF1"],"cy":0,"rightRidgeLength":-3.1500000000000026,"locked":false,"lz":0,"id":"95ywic4c9x92ks45ZbwSqV","lineColor":"black","selected":false,"lx":0,"textureType":"No Roof Texture","ly":0,"rotation":[0,0,-0.7853981633974483],"lineWidth":0.2,"cz":0,"foundationId":"c2gz3bi2QzLErUX4XmgVX7","color":"#ffffff","parentId":"c2gz3bi2QzLErUX4XmgVX7","showLabel":false,"thickness":0.05,"roofType":"Hip","leftRidgeLength":3.2500000000000027,"cx":0,"type":"Roof","roofStructure":"Default","rise":16.098880019941728,"sideColor":"#ffffff","ceiling":false},{"cz":0,"rotation":[0,0,-0.7853981633974483],"parentId":"mcxY5unDv2pKvQAJXd1qqG","rightPoint":[0.08486155130934736,-4.01822767510099,0.1],"roofId":"7DEvyGzFf8SCPa5eeKTryQ","leftRoofHeight":1.75,"color":"#ffffff","textureType":"No Wall Texture","rightRoofHeight":1.75,"lz":1.75,"selected":false,"foundationId":"mcxY5unDv2pKvQAJXd1qqG","cx":-0.16513844869065064,"ly":0.1,"cy":-4.01822767510099,"rightJoints":["81FqBBm7B8Cgn7RbBDkgTc"],"type":"Wall","leftJoints":["wPbsRDuG2myaDXtTkpKWyU"],"leftPoint":[-0.41513844869064975,-4.018227675100984,0.1],"normal":[0,0,1],"lx":0.4999999999999971,"relativeAngle":6.283185307179577,"id":"jPQHNjKitSZdUXrDLCKowL","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"rightRoofHeight":1.75,"id":"3DG2FvhMwMqXmaiYMPxgiv","cy":2.481772324899016,"color":"#ffffff","rotation":[0,0,-0.7853981633974483],"rightPoint":[-0.41513844869064953,2.481772324899015,0.1],"lx":0.5000000000000003,"selected":false,"roofId":"7DEvyGzFf8SCPa5eeKTryQ","textureType":"No Wall Texture","leftPoint":[0.0848615513093498,2.481772324899016,0.1],"type":"Wall","parentId":"mcxY5unDv2pKvQAJXd1qqG","foundationId":"mcxY5unDv2pKvQAJXd1qqG","lz":1.75,"locked":false,"leftJoints":["81FqBBm7B8Cgn7RbBDkgTc"],"rightJoints":["wPbsRDuG2myaDXtTkpKWyU"],"relativeAngle":3.1415926535897922,"cx":-0.16513844869065064,"leftRoofHeight":1.75,"normal":[0,0,1],"ly":0.1,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"leftPoint":[-0.41513844869064953,2.481772324899015,0.1],"cx":-0.4151384486906503,"foundationId":"mcxY5unDv2pKvQAJXd1qqG","selected":false,"id":"wPbsRDuG2myaDXtTkpKWyU","leftRoofHeight":1.75,"textureType":"No Wall Texture","color":"#ffffff","rotation":[0,0,-0.7853981633974483],"normal":[0,0,1],"rightJoints":["jPQHNjKitSZdUXrDLCKowL"],"cz":0,"locked":false,"type":"Wall","ly":0.1,"roofId":"7DEvyGzFf8SCPa5eeKTryQ","cy":-0.7682276751009843,"rightRoofHeight":1.75,"lz":1.75,"leftJoints":["3DG2FvhMwMqXmaiYMPxgiv"],"lx":6.5,"parentId":"mcxY5unDv2pKvQAJXd1qqG","relativeAngle":4.71238898038469,"rightPoint":[-0.41513844869064975,-4.018227675100984,0.1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"type":"Wall","color":"#ffffff","rightRoofHeight":1.75,"foundationId":"mcxY5unDv2pKvQAJXd1qqG","cx":0.08486155130935003,"cz":0,"leftJoints":["jPQHNjKitSZdUXrDLCKowL"],"rightJoints":["3DG2FvhMwMqXmaiYMPxgiv"],"ly":0.1,"roofId":"7DEvyGzFf8SCPa5eeKTryQ","leftRoofHeight":1.75,"lz":1.75,"id":"81FqBBm7B8Cgn7RbBDkgTc","cy":-0.7682276751009878,"parentId":"mcxY5unDv2pKvQAJXd1qqG","relativeAngle":1.5707963267948966,"rotation":[0,0,-0.7853981633974483],"selected":false,"textureType":"No Wall Texture","locked":false,"rightPoint":[0.0848615513093498,2.481772324899016,0.1],"normal":[0,0,1],"lx":6.500000000000005,"leftPoint":[0.08486155130935003,-4.0182276751009915,0.1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"roofStructure":"Default","textureType":"No Roof Texture","lz":0,"cz":0,"rotation":[0,0,-0.7853981633974483],"foundationId":"mcxY5unDv2pKvQAJXd1qqG","type":"Roof","color":"#ffffff","wallsId":["81FqBBm7B8Cgn7RbBDkgTc"],"lx":0,"cx":0,"leftRidgeLength":3.2500000000000027,"rightRidgeLength":-3.1500000000000026,"id":"7DEvyGzFf8SCPa5eeKTryQ","cy":0,"parentId":"mcxY5unDv2pKvQAJXd1qqG","normal":[0,0,1],"roofType":"Hip","thickness":0.05,"locked":false,"selected":false,"ly":0,"rise":16.098880019941728,"sideColor":"#ffffff","ceiling":false},{"cx":-2.820889718788509,"lx":17.522626722458362,"solarAbsorberPipe":{},"cy":3.1943110177197918,"cz":0.05,"id":"mcxY5unDv2pKvQAJXd1qqG","lz":0.1,"normal":[0,0,1],"solarPowerTower":{},"selected":false,"solarUpdraftTower":{},"type":"Foundation","locked":false,"color":"#009ce0","rotation":[0,0,-0.7853981633974483],"ly":16.217549949540043,"parentId":"Ground","textureType":"No Foundation Texture","enableGroupMaster":true},{"rotation":[0,0,0],"leftJoints":["4jxSnG9vT4aBdW8AckRKYU"],"windows":[],"type":"Wall","lx":12.5,"cx":-3.4999999999999987,"showLabel":false,"rightRoofHeight":1.6,"normal":[0,0,1],"textureType":"No Wall Texture","parentId":"sfVVGvWfY1uFZBwuAeqDnU","ly":0.3,"cy":-0.25,"roofId":"uRtLCjK4u6T6gpiAxaqJ4Y","selected":false,"leftPoint":[-3.4999999999999973,6,0],"relativeAngle":4.71238898038469,"lineColor":"black","locked":false,"rightJoints":["dDiLTvTPyJXZvEWaFVYpwD"],"lz":1.6,"lineWidth":0.2,"leftRoofHeight":1.6,"id":"fx2d8KZ2FbN5HXDjmbeNTq","foundationId":"sfVVGvWfY1uFZBwuAeqDnU","rightPoint":[-3.5,-6.5,0],"cz":0,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.6,"rightTopPartialHeight":1.6},{"roofId":"uRtLCjK4u6T6gpiAxaqJ4Y","locked":false,"cy":-0.25000000000000044,"rightPoint":[2.9999999999999982,5.999999999999999,0],"selected":false,"rightRoofHeight":1.6,"rightJoints":["4jxSnG9vT4aBdW8AckRKYU"],"leftRoofHeight":1.6,"showLabel":false,"ly":0.3,"windows":[],"parentId":"sfVVGvWfY1uFZBwuAeqDnU","rotation":[0,0,0],"cz":0,"textureType":"No Wall Texture","leftJoints":["dDiLTvTPyJXZvEWaFVYpwD"],"leftPoint":[3,-6.5,0],"lx":12.5,"lineWidth":0.2,"lz":1.6,"normal":[0,0,1],"relativeAngle":1.5707963267948966,"cx":2.999999999999999,"foundationId":"sfVVGvWfY1uFZBwuAeqDnU","type":"Wall","lineColor":"black","id":"kgt2xgas1aqzzJdjuE2oTU","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.6,"rightTopPartialHeight":1.6},{"textureType":"No Wall Texture","parentId":"sfVVGvWfY1uFZBwuAeqDnU","selected":false,"leftRoofHeight":1.6,"lz":1.6,"cx":-0.25,"id":"dDiLTvTPyJXZvEWaFVYpwD","leftJoints":["fx2d8KZ2FbN5HXDjmbeNTq"],"cy":-6.5,"relativeAngle":0,"cz":0,"locked":false,"centerRoofHeight":[0,1.6],"lx":6.5,"type":"Wall","showLabel":false,"roofId":"uRtLCjK4u6T6gpiAxaqJ4Y","ly":0.3,"windows":[],"rightPoint":[3,-6.5,0],"lineWidth":0.2,"leftPoint":[-3.5,-6.5,0],"rightRoofHeight":1.6,"rightJoints":["kgt2xgas1aqzzJdjuE2oTU"],"normal":[0,0,1],"lineColor":"black","rotation":[0,0,0],"foundationId":"sfVVGvWfY1uFZBwuAeqDnU","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.6,"rightTopPartialHeight":1.6},{"leftJoints":["kgt2xgas1aqzzJdjuE2oTU"],"windows":[],"ly":0.3,"locked":false,"centerRoofHeight":[0,1.6],"cy":5.999999999999998,"rightPoint":[-3.4999999999999973,5.999999999999998,0],"showLabel":false,"parentId":"sfVVGvWfY1uFZBwuAeqDnU","textureType":"No Wall Texture","rightJoints":["fx2d8KZ2FbN5HXDjmbeNTq"],"foundationId":"sfVVGvWfY1uFZBwuAeqDnU","type":"Wall","id":"4jxSnG9vT4aBdW8AckRKYU","lz":1.6,"leftRoofHeight":1.6,"rightRoofHeight":1.6,"lineWidth":0.2,"rotation":[0,0,0],"roofId":"uRtLCjK4u6T6gpiAxaqJ4Y","lx":6.499999999999996,"leftPoint":[2.9999999999999982,5.999999999999999,0],"relativeAngle":3.141592653589793,"selected":false,"cz":0,"cx":-0.24999999999999956,"normal":[0,0,1],"lineColor":"black","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.6,"rightTopPartialHeight":1.6},{"showLabel":false,"wallsId":["fx2d8KZ2FbN5HXDjmbeNTq"],"roofStructure":"Default","locked":false,"ly":0,"normal":[0,0,1],"color":"#ffffff","foundationId":"sfVVGvWfY1uFZBwuAeqDnU","ridgeLeftPoint":[0,1],"cz":0,"lineWidth":0.2,"rotation":[0,0,0],"parentId":"sfVVGvWfY1uFZBwuAeqDnU","roofType":"Gable","ridgeRightPoint":[0,1],"cx":0,"type":"Roof","cy":0,"lineColor":"black","lx":0,"id":"uRtLCjK4u6T6gpiAxaqJ4Y","thickness":0.4,"selected":false,"lz":0,"textureType":"No Roof Texture","rise":0,"sideColor":"#ffffff","ceiling":false},{"type":"Human","name":"Jeff","cx":-6.502161132128585,"cy":-0.11016766385402654,"cz":0.75,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"nxpfXTi8karHMZTuUfg7ua","id":"uohRAyGkaEQKAWQ4nxXd7n","selected":false,"locked":false,"ly":0.6},{"type":"Cuboid","cx":-1.5500000000000027,"cy":5.125000000000001,"cz":0.75,"lx":23.296674873649543,"ly":1.1460990537871516,"lz":1.5,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"jrdvuWjMZPwKCrsCkYbs2x","locked":false},{"type":"Cuboid","cx":-1.5499999999999994,"cy":-0.12500200000011227,"cz":0.75,"lx":23.296674873649543,"ly":1.1460990537871516,"lz":1.5,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"nxpfXTi8karHMZTuUfg7ua","selected":false,"locked":false},{"type":"Foundation","cx":-6.683083197474398,"cy":-67.2866913326566,"cz":0.15,"lx":40,"ly":40,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ihXBcGst6vfG6pMnKjKmcM","textureType":"Foundation Texture #7","locked":false,"enableGroupMaster":true},{"type":"Foundation","cx":13.760889379859025,"cy":-67.2492084538547,"cz":0.5,"lx":1,"ly":40,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vgW1NebabuY1wd8pyCtxcL","locked":false,"textureType":"Foundation Texture #1","enableGroupMaster":false},{"type":"Foundation","cx":-27.220804284247304,"cy":-67.2105953370125,"cz":0.5,"lx":1,"ly":40,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"erWKhrLkVgeBGrkYbzkvdA","selected":false,"locked":false},{"type":"Foundation","cx":-6.7329733624271535,"cy":-46.77136586096416,"cz":0.5,"lx":42,"ly":1,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9pJgP99aRJ8Ucspa2Xmi3n","selected":false,"locked":false},{"type":"Foundation","cx":-6.740359075877207,"cy":-87.76629626012827,"cz":0.5,"lx":42,"ly":1,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vKsvgYQL3ATsUMrkRxNVtG","selected":false,"locked":false},{"type":"Human","name":"Jack","cx":0.038403051629375184,"cy":-10.6680905961247,"cz":0.49999999999999956,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"vgW1NebabuY1wd8pyCtxcL","id":"ca1o8dHiZMnRxbmGVa2QgH","selected":false,"locked":false,"ly":0.42},{"type":"Human","name":"Judd","cx":12.353179322478177,"cy":5.7758180762563,"cz":0.15,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"aUp3bFMPfhPR555kq4RxtS","selected":false,"locked":false,"ly":0.544},{"type":"Human","name":"Jess","cx":17.33662712955384,"cy":1.475715952229109,"cz":0.1500000059604645,"lx":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"wtw985egzP7m3E2u8Hzcug","selected":false,"locked":false,"ly":0.43},{"type":"Human","name":"Jennifer","cx":18.10291752042776,"cy":-1.7717803444007103,"cz":0.1500000059604645,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"7CidBs9j2hdjoie9s47tSo","selected":false,"locked":false,"ly":0.45},{"type":"Human","name":"Jeanette","cx":16.915296607371396,"cy":-5.742321393879223,"cz":0.15,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"9QoGq38Qc3iCuT9ChxbAyR","selected":false,"locked":false,"ly":0.4},{"type":"Human","name":"Jamelia","cx":17.721133919154003,"cy":-5.518875626742528,"cz":0.15,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"85muF4mPeUfkVQindFk2SC","selected":false,"locked":false,"ly":0.65},{"type":"Human","name":"Jade","cx":0.6415363456979275,"cy":7.410775156216488,"cz":0.1500000059604645,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"jBLqkfTJCSVqqR4CU7nfJ2","selected":false,"locked":false,"ly":0.48},{"type":"Flower","name":"Yellow Flower","cx":18.683881743553787,"cy":18.33607154360658,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"eB4WthSRNZpHrasisKTtYg","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-18.795638463082337,"cy":18.660989204818456,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"h3cqaVZXomQdjmyTbFaSE7","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-16.292595004641754,"cy":-18.43048092235047,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"hEqgADfaTf5Syacb7QRfe6","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":17.686932547560502,"cy":-18.72635054653726,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"dViWZq883MztDQDT9tgFHg","selected":false,"locked":false},{"type":"Tree","name":"Coconut","cx":18.340044767234033,"cy":12.835308413075914,"cz":0.15,"lx":6.929334761971469,"lz":6.813471569919312,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"rK9Z4WmcdLBPe5DdK1mo3L","selected":false,"locked":false},{"type":"Tree","name":"Coconut","cx":18.20400735303405,"cy":4.605044853977084,"cz":0.15,"lx":6.415005134340998,"lz":6.813471569919312,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"ko7TU1v7o4aKNwN5wszk6E","selected":false,"locked":false},{"type":"Tree","name":"Coconut","cx":16.744228490634097,"cy":-4.496771610813894,"cz":0.1500000059604645,"lx":5.516658633108942,"lz":6.813471569919312,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"1zDByoeV2v4opENdb8nE73","selected":false,"locked":false},{"type":"Tree","name":"Coconut","cx":18.06796993883407,"cy":-12.807744163620441,"cz":0.15,"lx":3.7877637261892754,"lz":6.813471569919312,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"5ynw27sYwALgCvbTKBPFuc","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":18.73185271365966,"cy":9.091268351797737,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"5xUkwUkEF3nM4dp1f8ZjGH","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":18.82807405354676,"cy":0.4545102937342307,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"9CUeHAtdXMGrojz43dddm7","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":18.790525833741423,"cy":-8.33811033147611,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"9werjyfGxz2ZnUBAmZUSeP","selected":false,"locked":false},{"type":"Tree","name":"Linden","cx":-13.237896819150908,"cy":7.786733045780586,"cz":0.15,"lx":12.449941214324092,"lz":9.058629663838381,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"9HVmsEYn5NmhERnCHtLeTG","selected":false,"locked":false},{"type":"Human","name":"Jacob","cx":16.698553189544626,"cy":-13.302196684361064,"cz":0.1500000059604645,"lx":0.8,"ly":0.8,"lz":1.82,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"oVwVpc1MsHV8dEBsQ3Qes9","selected":false},{"type":"Human","name":"Jacqueline","cx":16.92629922811857,"cy":-10.360458138569996,"cz":0.1500000059604645,"lx":0.43,"ly":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"go7YPG6xiBGLHMPZz7e4qo","selected":false},{"type":"Flower","name":"Hibiscus","cx":-0.09277991929455354,"cy":0.3164809017961403,"cz":0.15,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"975HgY9tQaZ5QeqbgzHx3y","selected":false},{"type":"Flower","name":"Hibiscus","cx":2.3987692101921008,"cy":0.2735471847110773,"cz":0.1500000059604645,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"edrMt5m6ycQCMvY4tyMhZK","selected":false},{"type":"Tree","name":"Fan Palm","cx":-16.84484975237295,"cy":-12.927386696052167,"cz":0.15,"lx":4.076837194726303,"lz":6.270754609829865,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"pzKai5MWnLpM5xYggPryb1","selected":false},{"type":"Human","name":"Jaye","cx":-0.11721899052498141,"cy":8.102455442033538,"cz":0.1500000059604645,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"o65jp32RsZKq9pnvJ8qjFn","selected":false,"ly":0.55},{"type":"Foundation","cx":-6.355619144447829,"cy":-57.87489141106073,"cz":0.05,"lx":17.250094637989044,"ly":17.442537041091708,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"gray","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"xjGay2mVopjsp4Ndv4B8Eh","enableGroupMaster":true},{"type":"Wall","cx":0.15275097566949114,"cy":7.153909729519647,"cz":0,"lx":6,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":3.141592653589793,"leftPoint":[3.152750975669491,7.153909729519647,0.1],"rightPoint":[-2.847249024330509,7.153909729519647,0.1],"leftJoints":["hqsA2Cy29sRNBoj4v9Cr5r"],"rightJoints":["gQNkn8fsCop5ur3PiXUxVi"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"7T7V4fAArnXnf77GARr48T","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-4.347249024330509,"cy":5.403909729519647,"cz":0,"lx":4.6097722286464435,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":4.003762708257019,"leftPoint":[-2.847249024330509,7.153909729519647,0.1],"rightPoint":[-5.847249024330509,3.653909729519647,0.1],"leftJoints":["7T7V4fAArnXnf77GARr48T"],"rightJoints":["j6xhxcV6gu7NJTE1m7PHjp"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"gQNkn8fsCop5ur3PiXUxVi","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":4.652750975669491,"cy":5.403909729519647,"cz":0,"lx":4.6097722286464435,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":2.279422598922567,"leftPoint":[6.152750975669491,3.653909729519647,0.1],"rightPoint":[3.152750975669491,7.153909729519647,0.1],"leftJoints":["xwZdPNzp8AKwovnxoLD3nU"],"rightJoints":["7T7V4fAArnXnf77GARr48T"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"hqsA2Cy29sRNBoj4v9Cr5r","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.847249024330509,"cy":1.153909729519647,"cz":0,"lx":5,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":4.712388980384691,"leftPoint":[-5.847249024330512,3.653909729519647,0.1],"rightPoint":[-5.847249024330509,-1.346090270480353,0.1],"leftJoints":["gQNkn8fsCop5ur3PiXUxVi"],"rightJoints":["5HfZoyda9UcsGyCP24zQ6f"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"j6xhxcV6gu7NJTE1m7PHjp","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-4.347249024330509,"cy":-3.096090270480353,"cz":0,"lx":4.6097722286464435,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":5.42101525251236,"leftPoint":[-5.847249024330509,-1.346090270480353,0.1],"rightPoint":[-2.847249024330509,-4.846090270480353,0.1],"leftJoints":["j6xhxcV6gu7NJTE1m7PHjp"],"rightJoints":["mDLvATpuRq21i8iZBYi4ta"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"5HfZoyda9UcsGyCP24zQ6f","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.15275097566949114,"cy":-4.846090270480353,"cz":0,"lx":6,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":0,"leftPoint":[-2.847249024330509,-4.846090270480353,0.1],"rightPoint":[3.152750975669491,-4.846090270480353,0.1],"leftJoints":["5HfZoyda9UcsGyCP24zQ6f"],"rightJoints":["23GGGVXLMLhDsJPuc4tWdJ"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"mDLvATpuRq21i8iZBYi4ta","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.152750975669491,"cy":1.153909729519647,"cz":0,"lx":5,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":1.5707963267948966,"leftPoint":[6.152750975669491,-1.346090270480353,0.1],"rightPoint":[6.152750975669491,3.653909729519647,0.1],"leftJoints":["23GGGVXLMLhDsJPuc4tWdJ"],"rightJoints":["hqsA2Cy29sRNBoj4v9Cr5r"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"xwZdPNzp8AKwovnxoLD3nU","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":4.652750975669491,"cy":-3.096090270480353,"cz":0,"lx":4.6097722286464435,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":0.8621700546672264,"leftPoint":[3.152750975669491,-4.846090270480353,0.1],"rightPoint":[6.152750975669491,-1.346090270480353,0.1],"leftJoints":["mDLvATpuRq21i8iZBYi4ta"],"rightJoints":["xwZdPNzp8AKwovnxoLD3nU"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"23GGGVXLMLhDsJPuc4tWdJ","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0,"cy":6.5,"cz":0,"lx":6,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["8FDqLAdw457E2bhA9XTcY8"],"rightJoints":["8RoWdxqFb6i5NdhSc28mnN"],"leftPoint":[3,6.5],"rightPoint":[-3,6.5],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"84MYXJ2PMaqXsehRJzjVQe","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-4.5,"cy":4.75,"cz":0,"lx":4.6097722286464435,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["84MYXJ2PMaqXsehRJzjVQe"],"rightJoints":["pk9TBhq9oWST9hGbLUebt3"],"leftPoint":[-3,6.5],"rightPoint":[-6,3],"relativeAngle":4.003762708257019,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8RoWdxqFb6i5NdhSc28mnN","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":4.5,"cy":4.75,"cz":0,"lx":4.6097722286464435,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["vEPCFaMTtBZuQbmTYF61aY"],"rightJoints":["84MYXJ2PMaqXsehRJzjVQe"],"leftPoint":[6,3],"rightPoint":[3,6.5],"relativeAngle":2.279422598922567,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8FDqLAdw457E2bhA9XTcY8","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-6.000000000000002,"cy":0.5,"cz":0,"lx":5,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["8RoWdxqFb6i5NdhSc28mnN"],"rightJoints":["q546XZV5H6AGWKk4L5mFny"],"leftPoint":[-6.0000000000000036,3],"rightPoint":[-6,-2],"relativeAngle":4.712388980384691,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pk9TBhq9oWST9hGbLUebt3","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-4.5,"cy":-3.75,"cz":0,"lx":4.6097722286464435,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["pk9TBhq9oWST9hGbLUebt3"],"rightJoints":["5MSQKrS7n6GSqPGqdxq5Bj"],"leftPoint":[-6,-2],"rightPoint":[-3,-5.5],"relativeAngle":5.42101525251236,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"q546XZV5H6AGWKk4L5mFny","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-2,"cy":-5.5,"cz":0,"lx":2,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["q546XZV5H6AGWKk4L5mFny"],"rightJoints":[],"leftPoint":[-3,-5.5,0],"rightPoint":[-1,-5.5,0],"relativeAngle":0,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5MSQKrS7n6GSqPGqdxq5Bj","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":6,"cy":0.5,"cz":0,"lx":5,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["hdi4QkYQSUhV3rb5bWoPyE"],"rightJoints":["8FDqLAdw457E2bhA9XTcY8"],"leftPoint":[6,-2],"rightPoint":[6,3],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vEPCFaMTtBZuQbmTYF61aY","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":4.5,"cy":-3.75,"cz":0,"lx":4.6097722286464435,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["vhyVh2ErPYrdrgRVofCLxz"],"rightJoints":["vEPCFaMTtBZuQbmTYF61aY"],"leftPoint":[3,-5.5],"rightPoint":[6,-2],"relativeAngle":0.8621700546672264,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hdi4QkYQSUhV3rb5bWoPyE","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Foundation","cx":-6.206616408300555,"cy":-57.696705992331786,"cz":0.1,"lx":17.55559658932802,"ly":18.75035650013101,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"gray","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"86ArGmhZe3wg69cHFHJhHy","selected":false,"enableGroupMaster":true},{"type":"Wall","cx":2,"cy":-5.5,"cz":0,"lx":2,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":[],"rightJoints":["hdi4QkYQSUhV3rb5bWoPyE"],"leftPoint":[1,-5.5,0],"rightPoint":[3,-5.5,0],"relativeAngle":0,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vhyVh2ErPYrdrgRVofCLxz","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":0,"cy":3.398893115303052,"cz":0,"lx":3.320044158350688,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["rar8H4qGrUVwxrAVMoviFk"],"rightJoints":["oNJ9yc8yVRwjREwej61c5A"],"leftPoint":[1.660022079175344,3.398893115303052,0],"rightPoint":[-1.660022079175344,3.398893115303052,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rp3dXSxQpb7ynasZ6iB6eD","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.110255927874554,"rightUnfilledHeight":4.110255927874554,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-2.490033118763016,"cy":2.483806507336846,"cz":0,"lx":2.470871769976342,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["rp3dXSxQpb7ynasZ6iB6eD"],"rightJoints":["qFqkwR72frMwniMPRhnRWu"],"leftPoint":[-1.660022079175344,3.398893115303052,0],"rightPoint":[-3.320044158350688,1.5687198993706395,0],"relativeAngle":-2.3074818778158113,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oNJ9yc8yVRwjREwej61c5A","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.057580145705773,"rightUnfilledHeight":4.057580145705773,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":2.490033118763016,"cy":2.483806507336846,"cz":0,"lx":2.470871769976342,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["8QpMcXYdcYd52x57cuvRwd"],"rightJoints":["rp3dXSxQpb7ynasZ6iB6eD"],"leftPoint":[3.320044158350688,1.5687198993706395,0],"rightPoint":[1.660022079175344,3.398893115303052,0],"relativeAngle":2.3074818778158113,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rar8H4qGrUVwxrAVMoviFk","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.100659354320178,"rightUnfilledHeight":4.100659354320178,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-3.3200441583506892,"cy":0.2614533165617733,"cz":0,"lx":2.6145331656177326,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["oNJ9yc8yVRwjREwej61c5A"],"rightJoints":["kihCtvbfxzgerRhgdX2mXc"],"leftPoint":[-3.32004415835069,1.5687198993706395,0],"rightPoint":[-3.320044158350688,-1.045813266247093,0],"relativeAngle":-1.5707963267948957,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qFqkwR72frMwniMPRhnRWu","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.079570215122429,"rightUnfilledHeight":4.079570215122429,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-2.490033118763016,"cy":-1.960899874213299,"cz":0,"lx":2.470871769976342,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["qFqkwR72frMwniMPRhnRWu"],"rightJoints":["jVTcP5pBaEuvpEqr3A1SVZ"],"leftPoint":[-3.320044158350688,-1.045813266247093,0],"rightPoint":[-1.660022079175344,-2.8759864821795054,0],"relativeAngle":-0.8341107757739816,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kihCtvbfxzgerRhgdX2mXc","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.134242304497143,"rightUnfilledHeight":4.134242304497143,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":3.320044158350688,"cy":0.2614533165617733,"cz":0,"lx":2.6145331656177326,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["nFBw1TRtTNF6p1WGqWPgfw"],"rightJoints":["rar8H4qGrUVwxrAVMoviFk"],"leftPoint":[3.320044158350688,-1.045813266247093,0],"rightPoint":[3.320044158350688,1.5687198993706395,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8QpMcXYdcYd52x57cuvRwd","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.039195103204583,"rightUnfilledHeight":4.039195103204583,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":2.490033118763016,"cy":-1.960899874213299,"cz":0,"lx":2.470871769976342,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["jVTcP5pBaEuvpEqr3A1SVZ"],"rightJoints":["8QpMcXYdcYd52x57cuvRwd"],"leftPoint":[1.660022079175344,-2.8759864821795054,0],"rightPoint":[3.320044158350688,-1.045813266247093,0],"relativeAngle":0.8341107757739816,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nFBw1TRtTNF6p1WGqWPgfw","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.108930812815814,"rightUnfilledHeight":4.108930812815814,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Foundation","cx":-6.1615980987141725,"cy":-56.93879552861954,"cz":0.05,"lx":9.714225983793291,"ly":9.80468578734971,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"gray","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"n5CRoXkagMPz1MK5uJrLb5","selected":false},{"type":"Wall","cx":0,"cy":-2.8759864821795054,"cz":0,"lx":3.320044158350688,"ly":0.1,"lz":6,"fill":"Partial","relativeAngle":0,"leftPoint":[-1.660022079175344,-2.8759864821795054,0],"rightPoint":[1.660022079175344,-2.8759864821795054,0],"leftJoints":["kihCtvbfxzgerRhgdX2mXc"],"rightJoints":["nFBw1TRtTNF6p1WGqWPgfw"],"textureType":"No Wall Texture","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":0.5,"studWidth":0.1,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"jVTcP5pBaEuvpEqr3A1SVZ","structureSpacing":1,"structureWidth":0.1,"structureColor":"white","roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.015344082405362,"rightUnfilledHeight":4.015344082405362,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.5743098600216179,"thickness":0.1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["qFqkwR72frMwniMPRhnRWu","kihCtvbfxzgerRhgdX2mXc","jVTcP5pBaEuvpEqr3A1SVZ","nFBw1TRtTNF6p1WGqWPgfw","8QpMcXYdcYd52x57cuvRwd","rar8H4qGrUVwxrAVMoviFk","rp3dXSxQpb7ynasZ6iB6eD","oNJ9yc8yVRwjREwej61c5A"],"textureType":"Roof Texture Default","color":"#666666","sideColor":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"smwrqG518CZJrsaW49WWUA","ceiling":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.3499999999999999,"lx":0.7649549167327019,"ly":0.1,"lz":0.19999999999999982,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8QpMcXYdcYd52x57cuvRwd","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"dYYTafeaVyrPGiHr9hT4x7"},{"type":"Window","cx":-6.739866298094781e-16,"cy":0.3,"cz":0.34999999999999987,"lx":0.809430915963378,"ly":0.1,"lz":0.19999999999999973,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rar8H4qGrUVwxrAVMoviFk","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"jZbi6wpUUPGF7S266xXdZb"},{"type":"Window","cx":0,"cy":0.3,"cz":0.3499999999999999,"lx":0.9036024392790976,"ly":0.1,"lz":0.19999999999999982,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rp3dXSxQpb7ynasZ6iB6eD","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"dAbndkGsGZCPSQ6cfeGiaG"},{"type":"Window","cx":-6.290541878221795e-16,"cy":0.3,"cz":0.3499999999999999,"lx":0.8094309159633778,"ly":0.1,"lz":0.19999999999999987,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nFBw1TRtTNF6p1WGqWPgfw","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"kSuLif4Wir4urUXskyaV4U"},{"type":"Window","cx":0,"cy":0.3,"cz":0.3499999999999999,"lx":0.9036024392790976,"ly":0.1,"lz":0.19999999999999982,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jVTcP5pBaEuvpEqr3A1SVZ","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"uzbQK6qBJiZchj62eoVcS2"},{"type":"Window","cx":-6.290541878221795e-16,"cy":0.3,"cz":0.3499999999999999,"lx":0.8094309159633778,"ly":0.1,"lz":0.19999999999999987,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kihCtvbfxzgerRhgdX2mXc","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"qdqEUWrM4pFbL4aKbpxg5S"},{"type":"Window","cx":0,"cy":0.3,"cz":0.3499999999999999,"lx":0.7649549167327019,"ly":0.1,"lz":0.19999999999999982,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"qFqkwR72frMwniMPRhnRWu","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"387ytv7CWaVRo77xEcJ6ve"},{"type":"Window","cx":-5.841217458348811e-16,"cy":0.3,"cz":0.34999999999999987,"lx":0.8094309159633776,"ly":0.1,"lz":0.19999999999999973,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"oNJ9yc8yVRwjREwej61c5A","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"5pj2DDSnCjnbjFqVV7kdtA"},{"type":"Human","name":"Jane","cx":3.736227180070431,"cy":-0.07270961061114178,"cz":0.1500000059604645,"lx":0.4,"ly":0.4,"lz":1.67,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"mXtLTeWPeXbh8ZPv5wFnjK","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1,"thickness":0.1,"roofType":"Mansard","roofStructure":"Default","wallsId":["mDLvATpuRq21i8iZBYi4ta"],"ridgeWidth":2.994634976387277,"textureType":"Roof Texture Default","color":"#666666","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"11NehXdVvEJW3XyYbWtXPQ","ceiling":false}],"view":{"weatherPanelX":0,"cameraZoom":11.974738784767576,"showInstructionPanel":false,"orthographic":false,"showYearlyUpdraftTowerYieldPanel":false,"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"cameraPosition":[2.0567122000034246,-82.20963270587687,2.469053520866666],"showYearlyHeliostatYieldPanel":false,"mapTilt":0,"groundPanelY":0,"heliodonPanelX":0,"showMapPanel":false,"heliodonPanelY":0,"showElevationAngle":true,"solarRadiationHeatMapReflectionOnly":false,"groundImage":false,"mapWeatherStations":false,"showDailyParabolicTroughYieldPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400},"theme":"Default","dailyPvYieldPanelRect":{"height":400,"x":0,"width":600,"y":0},"dailyHeliostatYieldPanelRect":{"height":400,"width":600,"y":0,"x":0},"showDailyLightSensorPanel":false,"yearlyUpdraftTowerYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"groundColor":"#0062b1","showGroundPanel":false,"weatherPanelY":0,"yearlyLightSensorPanelX":0,"showDiurnalTemperaturePanel":false,"showYearlyPvYieldPanel":false,"yearlyLightSensorPanelY":0,"yearlyLightSensorPanelRect":{"y":0,"x":0,"height":500,"width":600},"showDailyParabolicDishYieldPanel":false,"showDailyHeliostatYieldPanel":false,"yearlyLightSensorPanelShowDaylight":false,"autoRotate":false,"dailyParabolicTroughYieldPanelRect":{"width":600,"y":0,"x":0,"height":400},"dailyPvYieldPanelY":1,"yearlyPvYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"mapPanelX":0,"yearlyLightSensorPanelShowClearness":false,"dailyLightSensorPanelX":-1277,"stickyNotePanelX":5,"yearlyFresnelReflectorYieldPanelRect":{"width":600,"y":0,"height":400,"x":0},"visibilityResultsPanelRect":{"width":600,"y":0,"x":0,"height":470},"mapType":"hybrid","yearlyParabolicTroughYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelRect":{"width":600,"x":0,"y":0,"height":400},"showSolarPanelVisibilityResultsPanel":false,"showEvolutionPanel":false,"showDesignInfoPanel":false,"showAzimuthAngle":true,"showYearlyLightSensorPanel":false,"dailyPvYieldPanelX":4,"showSunAngles":false,"stickyNotePanelY":2,"dailyLightSensorPanelRect":{"width":600,"y":0,"x":0,"height":360},"showSiteInfoPanel":true,"mapZoom":17,"shadowEnabled":true,"showStickyNotePanel":false,"showYearlyFresnelReflectorYieldPanel":false,"cameraPosition2D":[35.60900958192718,-37.58389220703244,150],"yearlyParabolicDishYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"showHeliodonPanel":false,"showDailyPvYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showZenithAngle":true,"panCenter":[0,0,0],"showYearlyParabolicTroughYieldPanel":false,"showDailyUpdraftTowerYieldPanel":false,"dailyLightSensorPanelY":525,"axes":false,"dailyUpdraftTowerYieldPanelRect":{"height":550,"x":0,"width":640,"y":0},"enableRotate":true,"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"showSolarRadiationHeatmap":false,"stickyNotePanelRect":{"height":300,"x":0,"y":0,"width":400},"heliodon":false,"weatherPanelRect":{"height":500,"width":500,"x":0,"y":0},"showWeatherPanel":false,"diurnalTemperaturePanelRect":{"height":400,"y":0,"width":600,"x":0},"showEconomicsPanel":false,"mapPanelY":0,"panCenter2D":[35.60900958192718,-37.5837422003028,-0.000044548927895332545],"groundPanelX":0,"showYearlyParabolicDishYieldPanel":false,"waterSurface":true},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"tiltAngle":0,"poleHeight":1,"rowAxis":"Zonal","rowsPerRack":1,"pvModelName":"SPR-X21-335-BLK","interRowSpacing":2,"orientation":"Landscape","poleSpacing":3},"solarPanelArrayLayoutConstraints":{"rowAxis":"Zonal","minimumRowsPerRack":1,"maximumInterRowSpacing":10,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","minimumTiltAngle":-1.5707963267948966,"minimumInterRowSpacing":2,"maximumTiltAngle":1.5707963267948966,"maximumRowsPerRack":6,"poleSpacing":5,"poleHeight":1},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"convergenceThreshold":0.01,"searchMethod":1,"vmax":0.01,"socialCoefficient":0.1,"cognitiveCoefficient":0.1,"objectiveFunctionType":1,"localSearchRadius":0.1,"swarmSize":20,"maximumSteps":5,"problem":"Solar Panel Tilt Angle","inertia":0.8},"geneticAlgorithmParams":{"convergenceThreshold":0.01,"localSearchRadius":0.1,"mutationRate":0.1,"populationSize":20,"searchMethod":1,"problem":"Solar Panel Tilt Angle","selectionRate":0.5,"crossoverRate":0.5,"objectiveFunctionType":1,"selectionMethod":1,"maximumGenerations":5}},"economicsParams":{"projectLifeSpan":25,"operationalCostPerUnit":0.15,"electricitySellingPrice":0.25},"notes":[]}')},477:function(e){e.exports=JSON.parse('{"docid":"aAQ9PBNcxmy54LzwEjDjx6","time":"02/04/2023 01:07 pm","timestamp":1675534023944,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":29.97967840899827,"solarRadiationHeatmapGridCellSize":2,"pvGridCellSize":0.5,"timesPerHour":1,"longitude":31.1328118254,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Unnamed Road, Nazlet El-Semman, Al Haram, Giza Governorate 3512201, Egypt","date":"9/15/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":false,"noAnimationForHeatmapSimulation":false},"elements":[{"cy":1.8727761492415205,"normal":[0,0,1],"lz":0.1,"ly":33.71645112830097,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":3.8026045865356792,"cz":0.05,"rotation":[0,0,0],"lx":37.627215506503944,"selected":false,"parentId":"Ground","color":"#939e68"},{"type":"Human","name":"Jack","cx":-20.29704864931282,"cy":2.5303584520169977,"cz":1.7763568394002505e-15,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"tmVJY65HF3sgVftctUAMHa","selected":false,"ly":0.42},{"type":"Wall","cx":0,"cy":16.296284712012135,"cz":0,"lx":36.37297498962048,"ly":0.3,"lz":0.1,"relativeAngle":3.141592653589793,"leftPoint":[18.18648749481024,16.296284712012135,0],"rightPoint":[-18.18648749481024,16.296284712012135,0],"leftJoints":["x8opa4joDX2ozyr1wxLBFd"],"rightJoints":["cbbyeikFQdrAHuD95BDSGz"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nTB9SvRUJL9zbmnaWUjcpm","roofId":"k5DPAgfcA7iEV8uJMULHoF","leftRoofHeight":0.1,"rightRoofHeight":0.1,"color":"#b07e3d","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":-18.18648749481024,"cy":-1.7763568394002505e-15,"cz":0,"lx":32.59256942402426,"ly":0.3,"lz":0.1,"relativeAngle":-1.5707963267948966,"leftPoint":[-18.18648749481024,16.29628471201213,0],"rightPoint":[-18.18648749481024,-16.296284712012135,0],"leftJoints":["nTB9SvRUJL9zbmnaWUjcpm"],"rightJoints":["h8nRc5JnZSmPUtQYLCpzpo"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cbbyeikFQdrAHuD95BDSGz","roofId":"k5DPAgfcA7iEV8uJMULHoF","leftRoofHeight":0.1,"rightRoofHeight":0.1,"color":"#b07e3d","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":18.18648749481024,"cy":0,"cz":0,"lx":32.59256942402427,"ly":0.3,"lz":0.1,"relativeAngle":1.5707963267948966,"leftPoint":[18.18648749481024,-16.296284712012135,0],"rightPoint":[18.18648749481024,16.296284712012135,0],"leftJoints":["h8nRc5JnZSmPUtQYLCpzpo"],"rightJoints":["nTB9SvRUJL9zbmnaWUjcpm"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"x8opa4joDX2ozyr1wxLBFd","roofId":"k5DPAgfcA7iEV8uJMULHoF","leftRoofHeight":0.1,"rightRoofHeight":0.1,"color":"#b07e3d","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":0,"cy":-16.296284712012135,"cz":0,"lx":36.37297498962048,"ly":0.3,"lz":0.1,"relativeAngle":0,"leftPoint":[-18.18648749481024,-16.296284712012135,0],"rightPoint":[18.18648749481024,-16.296284712012135,0],"leftJoints":["cbbyeikFQdrAHuD95BDSGz"],"rightJoints":["x8opa4joDX2ozyr1wxLBFd"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h8nRc5JnZSmPUtQYLCpzpo","roofId":"k5DPAgfcA7iEV8uJMULHoF","leftRoofHeight":0.1,"rightRoofHeight":0.1,"color":"#b07e3d","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["x8opa4joDX2ozyr1wxLBFd","nTB9SvRUJL9zbmnaWUjcpm","cbbyeikFQdrAHuD95BDSGz","h8nRc5JnZSmPUtQYLCpzpo"],"textureType":"No Roof Texture","color":"#f1bd5f","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k5DPAgfcA7iEV8uJMULHoF","sideColor":"#f1bd5f","rise":23.904675932583867,"ceiling":false},{"type":"Wall","cx":0,"cy":20.99732159077814,"cz":0,"lx":37.31092134412355,"ly":0.3,"lz":0.22250033892788987,"leftJoints":["7WsdqvYxWkA27jvXNo2Mm1"],"rightJoints":["tZM6D9KrMoJw5byU4Mef1i"],"leftPoint":[18.655460672061775,20.99732159077814,0],"rightPoint":[-18.655460672061775,20.99732159077814,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"kfxJiyZVakywzVGMDtjswR","parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofId":"vsaCHfjwMoXqY3LhUh3AYn","selected":false,"leftRoofHeight":0.22250033892788987,"rightRoofHeight":0.22250033892788987,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.22250033892788987,"rightTopPartialHeight":0.22250033892788987},{"type":"Wall","cx":-18.655460672061775,"cy":-1.7763568394002505e-15,"cz":0,"lx":41.99464318155627,"ly":0.3,"lz":0.22250033892788987,"leftJoints":["kfxJiyZVakywzVGMDtjswR"],"rightJoints":["vf6wgmEsbmPCE8KcphJGqP"],"leftPoint":[-18.655460672061775,20.997321590778135,0],"rightPoint":[-18.655460672061775,-20.99732159077814,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"tZM6D9KrMoJw5byU4Mef1i","parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofId":"vsaCHfjwMoXqY3LhUh3AYn","selected":false,"leftRoofHeight":0.22250033892788987,"rightRoofHeight":0.22250033892788987,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.22250033892788987,"rightTopPartialHeight":0.22250033892788987},{"type":"Wall","cx":18.655460672061775,"cy":0,"cz":0,"lx":41.99464318155628,"ly":0.3,"lz":0.22250033892788987,"leftJoints":["vf6wgmEsbmPCE8KcphJGqP"],"rightJoints":["kfxJiyZVakywzVGMDtjswR"],"leftPoint":[18.655460672061775,-20.99732159077814,0],"rightPoint":[18.655460672061775,20.99732159077814,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"7WsdqvYxWkA27jvXNo2Mm1","parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofId":"vsaCHfjwMoXqY3LhUh3AYn","selected":false,"leftRoofHeight":0.22250033892788987,"rightRoofHeight":0.22250033892788987,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.22250033892788987,"rightTopPartialHeight":0.22250033892788987},{"type":"Wall","cx":0,"cy":-20.99732159077814,"cz":0,"lx":37.31092134412355,"ly":0.3,"lz":0.22250033892788987,"leftJoints":["tZM6D9KrMoJw5byU4Mef1i"],"rightJoints":["7WsdqvYxWkA27jvXNo2Mm1"],"leftPoint":[-18.655460672061775,-20.99732159077814,0],"rightPoint":[18.655460672061775,-20.99732159077814,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"vf6wgmEsbmPCE8KcphJGqP","parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofId":"vsaCHfjwMoXqY3LhUh3AYn","selected":false,"leftRoofHeight":0.22250033892788987,"rightRoofHeight":0.22250033892788987,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.22250033892788987,"rightTopPartialHeight":0.22250033892788987},{"id":"vsaCHfjwMoXqY3LhUh3AYn","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#f1bd5f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["7WsdqvYxWkA27jvXNo2Mm1","kfxJiyZVakywzVGMDtjswR","tZM6D9KrMoJw5byU4Mef1i","vf6wgmEsbmPCE8KcphJGqP"],"selected":false,"sideColor":"#f1bd5f","rise":26.582665517432964,"ceiling":false},{"type":"Foundation","cx":12.856852941052583,"cy":43.808036262261155,"cz":0.05,"lx":38.5975048387485,"ly":43.44273432574787,"lz":0.22250033892788987,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#939e68","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7wPQXpdL4AkSgqr5d4ivTf","selected":false},{"type":"Wall","cx":0,"cy":10.377063829820637,"cz":0,"lx":24.393816584690047,"ly":0.3,"lz":0.1,"leftJoints":["c1ip4EoLV1xG5UrcQjKJFf"],"rightJoints":["aXfuVy74x5TuX5PAxrYsmb"],"leftPoint":[12.196908292345023,10.377063829820637,0],"rightPoint":[-12.196908292345023,10.377063829820637,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"6n1nr1JX4st4jvQ9gUV4ia","parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofId":"6Z9o7PiPN8Lg87aGjnheF2","selected":false,"leftRoofHeight":0.1,"rightRoofHeight":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":-12.196908292345023,"cy":0,"cz":0,"lx":20.754127659641274,"ly":0.3,"lz":0.1,"leftJoints":["6n1nr1JX4st4jvQ9gUV4ia"],"rightJoints":["mU8UDvpwYrQexfz1wzirNx"],"leftPoint":[-12.196908292345023,10.377063829820637,0],"rightPoint":[-12.196908292345023,-10.377063829820637,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"aXfuVy74x5TuX5PAxrYsmb","parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofId":"6Z9o7PiPN8Lg87aGjnheF2","selected":false,"leftRoofHeight":0.1,"rightRoofHeight":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":12.196908292345023,"cy":0,"cz":0,"lx":20.754127659641274,"ly":0.3,"lz":0.1,"leftJoints":["mU8UDvpwYrQexfz1wzirNx"],"rightJoints":["6n1nr1JX4st4jvQ9gUV4ia"],"leftPoint":[12.196908292345023,-10.377063829820637,0],"rightPoint":[12.196908292345023,10.377063829820637,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"c1ip4EoLV1xG5UrcQjKJFf","parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofId":"6Z9o7PiPN8Lg87aGjnheF2","selected":false,"leftRoofHeight":0.1,"rightRoofHeight":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":0,"cy":-10.377063829820637,"cz":0,"lx":24.393816584690047,"ly":0.3,"lz":0.1,"leftJoints":["aXfuVy74x5TuX5PAxrYsmb"],"rightJoints":["c1ip4EoLV1xG5UrcQjKJFf"],"leftPoint":[-12.196908292345023,-10.377063829820637,0],"rightPoint":[12.196908292345023,-10.377063829820637,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"mU8UDvpwYrQexfz1wzirNx","parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofId":"6Z9o7PiPN8Lg87aGjnheF2","selected":false,"leftRoofHeight":0.1,"rightRoofHeight":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"id":"6Z9o7PiPN8Lg87aGjnheF2","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#f1bd5f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["c1ip4EoLV1xG5UrcQjKJFf","6n1nr1JX4st4jvQ9gUV4ia","aXfuVy74x5TuX5PAxrYsmb","mU8UDvpwYrQexfz1wzirNx"],"selected":false,"sideColor":"#f1bd5f","rise":16.854120951667817,"ceiling":false},{"type":"Foundation","cx":45.25308331556635,"cy":20.416929673194815,"cz":0.05,"lx":25.23498267381729,"ly":21.469787234111664,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#939e68","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vEZNUjoALqFNdeECwYexcJ","selected":false},{"type":"Human","name":"Jaah","cx":39.44168754364077,"cy":-40.717132307246644,"cz":0,"lx":0.74,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mXBNsLzvysAACaXT4Ret47","selected":false,"ly":0.74},{"type":"Tree","name":"Coconut","cx":42.806669480662926,"cy":-43.46857047024383,"cz":0,"lx":7.465549642203886,"lz":12.033907674351804,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"nN965AFg3yMtHobvcGg5R7","selected":false},{"type":"Tree","name":"Coconut","cx":41.00137659683238,"cy":-40.141651116333534,"cz":0,"lx":5.412336834290683,"lz":8.971899696117683,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"2anvXQ4u2H4Gmk1Wk9rdgM","selected":false},{"type":"Tree","name":"Coconut","cx":45.13152925903263,"cy":-41.184279758308485,"cz":0,"lx":4.120170321128103,"lz":6.431070332387913,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"kUerK8k3CG9QPyDqpE1w3s","selected":false},{"type":"Tree","name":"Coconut","cx":42.724610065173344,"cy":-37.37569784643946,"cz":-8.881784197001252e-16,"lx":5.285861196217217,"lz":7.810076760608297,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"6e2aW2xXuEPds7gKc1zyEZ","selected":false},{"type":"Human","name":"Jiya","cx":38.48713465659762,"cy":-41.18611455055127,"cz":0,"lx":0.6,"lz":1.74,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"waRJTQwVoTc2m73FTmZtku","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Dune","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#fcde9d","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[29.718967845382636,-60.9210785032056,6.195253307893477],"panCenter":[20.220405140712533,12.500928314079184,6.195253307893477],"orthographic":false,"enableRotate":true,"cameraZoom":13.966745921875,"showInstructionPanel":true,"cameraPosition2D":[2.7117906831589016,-0.17118900317690566,150],"panCenter2D":[2.7117906831589016,-0.17103899651007715,5.772019952800763e-7],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"waterSurface":false,"showMapPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},478:function(e){e.exports=JSON.parse('{"docid":"cTcUvKrDVjKVCsa7Bc6eWP","time":"07/11/2023 11:15 am","timestamp":1689088517320,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"date":"5/1/2022, 11:00:00 AM","timesPerHour":1,"noAnimationForHeatmapSimulation":false,"cameraZoom":35.16173831821251,"latitude":20.6834718,"address":"Ch\xedcharo 1, Agua Clara, 20263 Aguascalientes, Ags, Mexico","orthographic":false,"pvGridCellSize":0.5,"noAnimationForSolarPanelSimulation":false,"solarRadiationHeatmapGridCellSize":2,"name":"default","longitude":-88.56849969999999,"countryCode":"MX","ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]}},"elements":[{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,-0.4308260576178866],"type":"Foundation","lx":7.036992589214696,"ly":30.510947098235302,"lz":0.1,"parentId":"Ground","cx":-27.085409900327864,"cy":-75.75391737780706,"cz":0.05,"id":"of4fAMi2p9MKmo6JDUYnfX","locked":false,"selected":false},{"normal":[0,0,1],"enableGroupMaster":true,"color":"#ffffff","rotation":[0,0,-0.4308260576178866],"type":"Cuboid","lx":56,"ly":56,"lz":3,"parentId":"Ground","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-18.375019902136223,"cy":-56.51798491947705,"cz":1.5,"id":"wiH8vD751NzePoNE489Zmz","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":50.63868728162561,"ly":51,"lz":3,"parentId":"wiH8vD751NzePoNE489Zmz","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-0.08666355805458079,"cy":0.07433002082287654,"cz":1.5,"id":"vEE1TP3rTAVaRcwDoKZkXG","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":46,"ly":46,"parentId":"vEE1TP3rTAVaRcwDoKZkXG","lz":3,"faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":0.07205603943225766,"cy":-0.3609974280100564,"cz":1.5,"id":"64zAV4AXgf3acGYiGgbHtk","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":41,"ly":41,"parentId":"64zAV4AXgf3acGYiGgbHtk","lz":3,"faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-0.2179635556946673,"cy":-0.2714914561985524,"cz":1.5,"id":"6tvwCY3BfS5DKToaqrjH6b","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":36,"ly":36,"lz":3,"parentId":"6tvwCY3BfS5DKToaqrjH6b","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":0.20649365162019312,"cy":-0.07640192198699511,"cz":1.5,"id":"w5DovAeNvLxdFUsA55MTUK","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":31,"ly":31,"lz":3,"parentId":"w5DovAeNvLxdFUsA55MTUK","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":0.21796368761107066,"cy":0.27148491092499955,"cz":1.5,"id":"xkbrwv3RHrtDWs4fwBjHcK","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":26,"ly":26,"lz":3,"parentId":"xkbrwv3RHrtDWs4fwBjHcK","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":0.0000012533374448675178,"cy":-0.000002726892110443256,"cz":1.5,"id":"pbMzPvQHYgJQunHq51J49Z","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":21,"ly":21,"lz":3,"parentId":"pbMzPvQHYgJQunHq51J49Z","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-0.07647088824865858,"cy":-0.20646417621273133,"cz":1.5,"id":"mnvyeK5fN3hX9sLjvEKUuf","locked":false,"selected":false,"stackable":true},{"color":"white","rightJoints":["snp41n8epU65cJmpWYe2JY"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.10000000000000142,"leftJoints":["7HaAi9SXBNPgTWdiQyjMiG"],"lx":20.02647993516194,"type":"Wall","ly":0.3,"showLabel":false,"lineWidth":0.2,"lz":0.1,"centerRoofHeight":[-0.5,24.07205708567741],"roofId":"sGVLr2RiApAro2AZTF4Soq","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"25Fv92JqG6V9Az4Vdn87cm","structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.460358901737687,-10.32346519208701,0],"normal":[0,0,1],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","rotation":[0,0,-0.4308260576178866],"lineColor":"black","windows":[],"fill":"Full","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":-3.4603589017376857,"cy":-0.3102252245060395,"wallStructure":"Default","leftPoint":[-3.4603589017376843,9.703014743074931,0],"cz":0,"relativeAngle":-1.5707963267948968,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["25Fv92JqG6V9Az4Vdn87cm"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["nyGwFjAxRx8nejSDNHRuJf"],"type":"Wall","lx":6.747607724168489,"ly":0.3,"lineWidth":0.2,"showLabel":false,"lz":24.07205708567741,"roofId":"sGVLr2RiApAro2AZTF4Soq","textureType":"No Wall Texture","id":"7HaAi9SXBNPgTWdiQyjMiG","leftRoofHeight":24.07205708567741,"structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.4603589017376843,9.703014743074931,0],"normal":[0,0,1],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","rotation":[0,0,-0.4308260576178866],"lineColor":"black","windows":[],"fill":"Full","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":-0.08657971268263398,"cy":9.715917584374791,"cz":0,"wallStructure":"Default","leftPoint":[3.2871994763724164,9.728820425674652,0],"relativeAngle":-3.137768224760869,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":24.07205708567741,"rightTopPartialHeight":24.07205708567741,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["7HaAi9SXBNPgTWdiQyjMiG"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["snp41n8epU65cJmpWYe2JY"],"lx":20.026479935161944,"type":"Wall","ly":0.3,"lz":0.1,"showLabel":false,"lineWidth":0.2,"centerRoofHeight":[0.5,24.07205708567741],"roofId":"sGVLr2RiApAro2AZTF4Soq","textureType":"No Wall Texture","id":"nyGwFjAxRx8nejSDNHRuJf","leftRoofHeight":0.1,"locked":false,"structureWidth":0.1,"eavesLength":0,"selected":false,"rightPoint":[3.2871994763724164,9.728820425674652,0],"normal":[0,0,1],"rotation":[0,0,-0.4308260576178866],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","lineColor":"black","windows":[],"fill":"Full","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":3.2871994763724164,"cy":-0.2844195419063196,"cz":0,"wallStructure":"Default","leftPoint":[3.2871994763724164,-10.297659509487291,0],"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["nyGwFjAxRx8nejSDNHRuJf"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.1,"leftJoints":["25Fv92JqG6V9Az4Vdn87cm"],"lx":6.747607724168491,"type":"Wall","ly":0.3,"lineWidth":0.2,"lz":0.1,"showLabel":false,"roofId":"sGVLr2RiApAro2AZTF4Soq","textureType":"No Wall Texture","id":"snp41n8epU65cJmpWYe2JY","leftRoofHeight":0.1,"structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[3.2871994763724164,-10.297659509487291,0],"normal":[0,0,1],"rotation":[0,0,-0.4308260576178866],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","lineColor":"black","windows":[],"fill":"Full","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":-0.08657971268263531,"cy":-10.310562350787151,"wallStructure":"Default","cz":0,"leftPoint":[-3.460358901737687,-10.32346519208701,0],"relativeAngle":0.003824428828923839,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"sideColor":"#ffffff","ridgeLeftPoint":[-0.5,1],"lx":0,"type":"Roof","ly":0,"lz":0,"lineWidth":0.2,"showLabel":false,"overhang":0,"wallsId":["snp41n8epU65cJmpWYe2JY"],"textureType":"No Roof Texture","id":"sGVLr2RiApAro2AZTF4Soq","locked":false,"selected":false,"normal":[0,0,1],"ceiling":false,"roofStructure":"Default","roofType":"Gable","rotation":[0,0,-0.4308260576178866],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","lineColor":"black","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":0,"cy":0,"cz":0,"rise":0},{"color":"white","rightJoints":["p76sjxtkpQv2qS73PYE2kL"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.10000000000000142,"leftJoints":["6JMAttAcVe64vobp1GLMxZ"],"type":"Wall","lx":20.02647993516194,"ly":0.3,"lz":0.1,"centerRoofHeight":[-0.5,24.07205708567741],"roofId":"okzyGygyV9CuUuCgZJHxtL","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"wqgKTMGphRnmbTc7egg7A4","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[-3.460358901737687,-10.32346519208701,0],"normal":[0,0,1],"rotation":[0,0,-2.001622384412783],"foundationId":"6hcF56jh7q4LNRLycVpoD9","fill":"Full","parentId":"6hcF56jh7q4LNRLycVpoD9","cx":-3.4603589017376857,"cy":-0.3102252245060395,"leftPoint":[-3.4603589017376843,9.703014743074931,0],"wallStructure":"Default","cz":0,"relativeAngle":-1.5707963267948968,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["wqgKTMGphRnmbTc7egg7A4"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["1bHrmE4SnxxPJS3An7ttHy"],"type":"Wall","lx":6.747607724168489,"ly":0.3,"lz":24.07205708567741,"roofId":"okzyGygyV9CuUuCgZJHxtL","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"6JMAttAcVe64vobp1GLMxZ","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[-3.4603589017376843,9.703014743074931,0],"normal":[0,0,1],"rotation":[0,0,-2.001622384412783],"foundationId":"6hcF56jh7q4LNRLycVpoD9","fill":"Full","parentId":"6hcF56jh7q4LNRLycVpoD9","cx":-0.08657971268263398,"cy":9.715917584374791,"wallStructure":"Default","cz":0,"leftPoint":[3.2871994763724164,9.728820425674652,0],"relativeAngle":-3.137768224760869,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":24.07205708567741,"rightTopPartialHeight":24.07205708567741,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["6JMAttAcVe64vobp1GLMxZ"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["p76sjxtkpQv2qS73PYE2kL"],"type":"Wall","lx":20.026479935161944,"ly":0.3,"lz":0.1,"centerRoofHeight":[0.5,24.07205708567741],"roofId":"okzyGygyV9CuUuCgZJHxtL","textureType":"No Wall Texture","leftRoofHeight":0.1,"id":"1bHrmE4SnxxPJS3An7ttHy","structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[3.2871994763724164,9.728820425674652,0],"normal":[0,0,1],"rotation":[0,0,-2.001622384412783],"foundationId":"6hcF56jh7q4LNRLycVpoD9","fill":"Full","parentId":"6hcF56jh7q4LNRLycVpoD9","cx":3.2871994763724164,"cy":-0.2844195419063196,"leftPoint":[3.2871994763724164,-10.297659509487291,0],"wallStructure":"Default","cz":0,"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["1bHrmE4SnxxPJS3An7ttHy"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.1,"leftJoints":["wqgKTMGphRnmbTc7egg7A4"],"type":"Wall","lx":6.747607724168491,"ly":0.3,"lz":0.1,"roofId":"okzyGygyV9CuUuCgZJHxtL","textureType":"No Wall Texture","id":"p76sjxtkpQv2qS73PYE2kL","leftRoofHeight":0.1,"locked":false,"structureWidth":0.1,"eavesLength":0,"selected":false,"rightPoint":[3.2871994763724164,-10.297659509487291,0],"normal":[0,0,1],"foundationId":"6hcF56jh7q4LNRLycVpoD9","rotation":[0,0,-2.001622384412783],"fill":"Full","parentId":"6hcF56jh7q4LNRLycVpoD9","cx":-0.08657971268263531,"cy":-10.310562350787151,"wallStructure":"Default","cz":0,"leftPoint":[-3.460358901737687,-10.32346519208701,0],"relativeAngle":0.003824428828923839,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"sideColor":"#ffffff","ridgeLeftPoint":[-0.5,1],"type":"Roof","lx":0,"ly":0,"lz":0,"wallsId":["p76sjxtkpQv2qS73PYE2kL"],"overhang":0,"textureType":"No Roof Texture","id":"okzyGygyV9CuUuCgZJHxtL","locked":false,"selected":false,"normal":[0,0,1],"ceiling":false,"roofStructure":"Default","roofType":"Gable","foundationId":"6hcF56jh7q4LNRLycVpoD9","rotation":[0,0,-2.001622384412783],"parentId":"6hcF56jh7q4LNRLycVpoD9","cx":0,"cy":0,"cz":0,"rise":0},{"normal":[0,0,1],"solarPowerTower":{},"color":"#ffffff","rotation":[0,0,-2.001622384412783],"solarAbsorberPipe":{},"solarUpdraftTower":{},"type":"Foundation","lx":7.036992589214696,"ly":30.510947098235302,"parentId":"Ground","lz":0.1,"cx":-37.19656198570662,"cy":-48.22218639532002,"cz":0.05,"id":"6hcF56jh7q4LNRLycVpoD9","locked":false,"selected":false},{"color":"white","rightJoints":["6eET4gZfKAok8BawnfpVP5"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.10000000000000142,"leftJoints":["4tcfgq35BNQEAuA7Q4gK2w"],"type":"Wall","lx":20.02647993516194,"ly":0.3,"lz":0.1,"centerRoofHeight":[-0.5,24.07205708567741],"roofId":"u4Mpv2GeNWKchY8947S8v4","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"ewTz3qtVabc3vib1o37RWk","structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.460358901737687,-10.32346519208701,0],"normal":[0,0,1],"rotation":[0,0,1.1399702691770102],"foundationId":"8gpLzgkZ8nK4SDTRc45eLs","fill":"Full","parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":-3.4603589017376857,"cy":-0.3102252245060395,"cz":0,"wallStructure":"Default","leftPoint":[-3.4603589017376843,9.703014743074931,0],"relativeAngle":-1.5707963267948968,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["ewTz3qtVabc3vib1o37RWk"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["vvdQFgS7BMWgSzhZ3WPn3v"],"type":"Wall","lx":6.747607724168489,"ly":0.3,"lz":24.07205708567741,"roofId":"u4Mpv2GeNWKchY8947S8v4","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"4tcfgq35BNQEAuA7Q4gK2w","structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.4603589017376843,9.703014743074931,0],"normal":[0,0,1],"foundationId":"8gpLzgkZ8nK4SDTRc45eLs","rotation":[0,0,1.1399702691770102],"fill":"Full","parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":-0.08657971268263398,"cy":9.715917584374791,"wallStructure":"Default","leftPoint":[3.2871994763724164,9.728820425674652,0],"cz":0,"relativeAngle":-3.137768224760869,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":24.07205708567741,"rightTopPartialHeight":24.07205708567741,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["4tcfgq35BNQEAuA7Q4gK2w"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["6eET4gZfKAok8BawnfpVP5"],"type":"Wall","lx":20.026479935161944,"ly":0.3,"lz":0.1,"centerRoofHeight":[0.5,24.07205708567741],"roofId":"u4Mpv2GeNWKchY8947S8v4","textureType":"No Wall Texture","leftRoofHeight":0.1,"id":"vvdQFgS7BMWgSzhZ3WPn3v","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[3.2871994763724164,9.728820425674652,0],"normal":[0,0,1],"foundationId":"8gpLzgkZ8nK4SDTRc45eLs","rotation":[0,0,1.1399702691770102],"fill":"Full","parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":3.2871994763724164,"cy":-0.2844195419063196,"wallStructure":"Default","leftPoint":[3.2871994763724164,-10.297659509487291,0],"cz":0,"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["vvdQFgS7BMWgSzhZ3WPn3v"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.1,"leftJoints":["ewTz3qtVabc3vib1o37RWk"],"lx":6.747607724168491,"type":"Wall","ly":0.3,"lz":0.1,"roofId":"u4Mpv2GeNWKchY8947S8v4","textureType":"No Wall Texture","leftRoofHeight":0.1,"id":"6eET4gZfKAok8BawnfpVP5","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[3.2871994763724164,-10.297659509487291,0],"normal":[0,0,1],"foundationId":"8gpLzgkZ8nK4SDTRc45eLs","rotation":[0,0,1.1399702691770102],"fill":"Full","parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":-0.08657971268263531,"cy":-10.310562350787151,"leftPoint":[-3.460358901737687,-10.32346519208701,0],"wallStructure":"Default","cz":0,"relativeAngle":0.003824428828923839,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"sideColor":"#ffffff","type":"Roof","lx":0,"ly":0,"lz":0,"overhang":0,"wallsId":["6eET4gZfKAok8BawnfpVP5"],"textureType":"No Roof Texture","id":"u4Mpv2GeNWKchY8947S8v4","locked":false,"selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","foundationId":"8gpLzgkZ8nK4SDTRc45eLs","rotation":[0,0,1.1399702691770102],"parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":0,"cy":0,"cz":0,"rise":0},{"normal":[0,0,1],"solarPowerTower":{},"color":"#ffffff","rotation":[0,0,1.1399702691770102],"solarAbsorberPipe":{},"type":"Foundation","solarUpdraftTower":{},"lx":7.036992589214696,"ly":30.510947098235302,"parentId":"Ground","lz":0.1,"cx":-0.019117338301022357,"cy":-64.89645982858704,"cz":0.05,"id":"8gpLzgkZ8nK4SDTRc45eLs","locked":false,"selected":false},{"color":"white","rightJoints":["2UujwtSnnVJqGDCJ3BBRm9"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.10000000000000142,"leftJoints":["2owQUpRggJZAfJhkbdGdV7"],"type":"Wall","lx":20.02647993516194,"ly":0.3,"lz":0.1,"centerRoofHeight":[-0.5,24.07205708567741],"roofId":"vaffHA2pvgk7DEwhzj6gNE","textureType":"No Wall Texture","id":"1S8fhLLB2Yj68UzfGctHxC","leftRoofHeight":24.07205708567741,"structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.460358901737687,-10.32346519208701,0],"normal":[0,0,1],"rotation":[0,0,-3.5724187112076797],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","fill":"Full","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":-3.4603589017376857,"cy":-0.3102252245060395,"wallStructure":"Default","cz":0,"leftPoint":[-3.4603589017376843,9.703014743074931,0],"relativeAngle":-1.5707963267948968,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["1S8fhLLB2Yj68UzfGctHxC"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["ie77KsfUeoYHMvNbdg5A7r"],"type":"Wall","lx":6.747607724168489,"ly":0.3,"lz":24.07205708567741,"roofId":"vaffHA2pvgk7DEwhzj6gNE","textureType":"No Wall Texture","id":"2owQUpRggJZAfJhkbdGdV7","leftRoofHeight":24.07205708567741,"locked":false,"structureWidth":0.1,"selected":false,"eavesLength":0,"rightPoint":[-3.4603589017376843,9.703014743074931,0],"normal":[0,0,1],"rotation":[0,0,-3.5724187112076797],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","fill":"Full","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":-0.08657971268263398,"cy":9.715917584374791,"cz":0,"leftPoint":[3.2871994763724164,9.728820425674652,0],"wallStructure":"Default","relativeAngle":-3.137768224760869,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":24.07205708567741,"rightTopPartialHeight":24.07205708567741,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["2owQUpRggJZAfJhkbdGdV7"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["2UujwtSnnVJqGDCJ3BBRm9"],"type":"Wall","lx":20.026479935161944,"ly":0.3,"lz":0.1,"centerRoofHeight":[0.5,24.07205708567741],"roofId":"vaffHA2pvgk7DEwhzj6gNE","textureType":"No Wall Texture","leftRoofHeight":0.1,"id":"ie77KsfUeoYHMvNbdg5A7r","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[3.2871994763724164,9.728820425674652,0],"normal":[0,0,1],"rotation":[0,0,-3.5724187112076797],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","fill":"Full","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":3.2871994763724164,"cy":-0.2844195419063196,"wallStructure":"Default","leftPoint":[3.2871994763724164,-10.297659509487291,0],"cz":0,"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["ie77KsfUeoYHMvNbdg5A7r"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.1,"leftJoints":["1S8fhLLB2Yj68UzfGctHxC"],"type":"Wall","lx":6.747607724168491,"ly":0.3,"lz":0.1,"roofId":"vaffHA2pvgk7DEwhzj6gNE","textureType":"No Wall Texture","id":"2UujwtSnnVJqGDCJ3BBRm9","leftRoofHeight":0.1,"structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[3.2871994763724164,-10.297659509487291,0],"normal":[0,0,1],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","rotation":[0,0,-3.5724187112076797],"fill":"Full","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":-0.08657971268263531,"cy":-10.310562350787151,"leftPoint":[-3.460358901737687,-10.32346519208701,0],"cz":0,"wallStructure":"Default","relativeAngle":0.003824428828923839,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"sideColor":"#ffffff","type":"Roof","lx":0,"ly":0,"lz":0,"wallsId":["2UujwtSnnVJqGDCJ3BBRm9"],"overhang":0,"textureType":"No Roof Texture","id":"vaffHA2pvgk7DEwhzj6gNE","locked":false,"selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,-3.5724187112076797],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":0,"cy":0,"cz":0,"rise":0},{"normal":[0,0,1],"solarPowerTower":{},"color":"#ffffff","rotation":[0,0,-3.5724187112076797],"solarAbsorberPipe":{},"type":"Foundation","lx":7.036992589214696,"solarUpdraftTower":{},"ly":30.510947098235302,"parentId":"Ground","lz":0.1,"cx":-9.922732853325604,"cy":-37.99179481559905,"cz":0.05,"id":"hmZjWWeZz4S4GgQzaeEoDs","locked":false,"selected":false},{"color":"white","rightJoints":["w8ioBPnjpEK1kCVPvdyXSf"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":30.5,"leftJoints":["o5TUM6k7TUF5pcoV1nrf3P"],"lx":15.990395824622178,"type":"Wall","ly":0.3,"lz":30.5,"centerRoofHeight":[-0.5,30.5],"roofId":"fpyToZsG3vjeXnpTZcmiFA","textureType":"No Wall Texture","leftRoofHeight":30.5,"id":"9EahYNQZypYcfg5Yptfmkk","locked":false,"structureWidth":0.1,"selected":false,"eavesLength":0.2,"rightPoint":[-8.119283016182168,-17.843264137803672,0.1],"normal":[0,0,1],"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,-3.5724187112076797],"fill":"Full","parentId":"tznSPCJVyf8hCJAPieocy5","cx":-8.119283016182168,"cy":-9.848066225492586,"cz":0,"leftPoint":[-8.119283016182163,-1.852868313181495,0.1],"wallStructure":"Default","relativeAngle":-1.570796326794897,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.5,"rightTopPartialHeight":30.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["9EahYNQZypYcfg5Yptfmkk"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":30.5,"leftJoints":["jbmSv4P2XCW2pGLUzPPdFg"],"lx":15.828210447987294,"type":"Wall","ly":0.3,"lz":30.5,"roofId":"fpyToZsG3vjeXnpTZcmiFA","textureType":"No Wall Texture","id":"o5TUM6k7TUF5pcoV1nrf3P","leftRoofHeight":30.5,"structureWidth":0.1,"locked":false,"eavesLength":0.2,"selected":false,"rightPoint":[-8.119283016182163,-1.852868313181495,0.1],"normal":[0,0,1],"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,-3.5724187112076797],"fill":"Full","parentId":"tznSPCJVyf8hCJAPieocy5","cx":-0.2051844979525692,"cy":-1.8425658765917845,"cz":0,"leftPoint":[7.7089140202770245,-1.8322634400020812,0.1],"wallStructure":"Default","relativeAngle":-3.140290871618499,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.5,"rightTopPartialHeight":30.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["o5TUM6k7TUF5pcoV1nrf3P"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":null,"leftJoints":["w8ioBPnjpEK1kCVPvdyXSf"],"type":"Wall","lx":15.99039582462218,"ly":0.3,"lz":30.5,"centerRoofHeight":[0.4999999999999998,30.5],"roofId":"fpyToZsG3vjeXnpTZcmiFA","textureType":"No Wall Texture","leftRoofHeight":30.5,"id":"jbmSv4P2XCW2pGLUzPPdFg","locked":false,"structureWidth":0.1,"selected":false,"eavesLength":0.2,"rightPoint":[7.7089140202770245,-1.8322634400020812,0.1],"normal":[0,0,1],"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,-3.5724187112076797],"fill":"Full","parentId":"tznSPCJVyf8hCJAPieocy5","cx":7.708914020277024,"cy":-9.827461352313167,"leftPoint":[7.708914020277023,-17.822659264624257,0.1],"wallStructure":"Default","cz":0,"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.5,"rightTopPartialHeight":30.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["jbmSv4P2XCW2pGLUzPPdFg"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":30.5,"leftJoints":["9EahYNQZypYcfg5Yptfmkk"],"lx":15.828210447987301,"type":"Wall","ly":0.3,"lz":30.5,"roofId":"fpyToZsG3vjeXnpTZcmiFA","textureType":"No Wall Texture","id":"w8ioBPnjpEK1kCVPvdyXSf","leftRoofHeight":30.5,"locked":false,"structureWidth":0.1,"selected":false,"eavesLength":0.2,"rightPoint":[7.708914020277023,-17.822659264624257,0.1],"normal":[0,0,1],"rotation":[0,0,-3.5724187112076797],"foundationId":"tznSPCJVyf8hCJAPieocy5","fill":"Full","parentId":"tznSPCJVyf8hCJAPieocy5","cx":-0.20518449795257118,"cy":-17.83296170121396,"leftPoint":[-8.119283016182168,-17.843264137803672,0.1],"cz":0,"wallStructure":"Default","relativeAngle":0.0013017819712943387,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.5,"rightTopPartialHeight":30.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"lx":0,"type":"Roof","ly":0,"lz":0,"wallsId":["w8ioBPnjpEK1kCVPvdyXSf"],"overhang":0.2,"textureType":"No Roof Texture","id":"fpyToZsG3vjeXnpTZcmiFA","locked":false,"selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,-3.5724187112076797],"foundationId":"tznSPCJVyf8hCJAPieocy5","parentId":"tznSPCJVyf8hCJAPieocy5","cx":0,"cy":0,"cz":0,"rise":0},{"normal":[0,0,1],"solarPowerTower":{},"color":"#ffffff","rotation":[0,0,-3.5724187112076797],"solarAbsorberPipe":{},"solarUpdraftTower":{},"type":"Foundation","lx":16.502964739720774,"ly":43.56257699656065,"lz":0.1,"parentId":"Ground","cx":-22.491532647648288,"cy":-65.93307419737648,"cz":0.05,"id":"tznSPCJVyf8hCJAPieocy5","locked":false,"selected":false},{"color":"#73D8FF","lx":0.1263566722575591,"type":"Window","tint":"#73D8FF","ly":0.3,"lineWidth":0.2,"lz":0.08196721311475416,"windowType":"Default","showLabel":false,"mullionSpacing":2,"archHeight":1,"id":"gnr8cDLm7R39CGUTTPWRkH","locked":false,"selected":false,"normal":[0,0,1],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"rotation":[0,0,0],"foundationId":"tznSPCJVyf8hCJAPieocy5","lineColor":"black","parentId":"o5TUM6k7TUF5pcoV1nrf3P","mullionColor":"white","mullion":true,"frameWidth":0.1,"cx":9.819886079874965e-17,"cy":0.1,"cz":0.319672131147541,"opacity":0,"frame":false},{"color":"#73D8FF","type":"Window","lx":0.1263566722575591,"ly":0.3,"tint":"#73D8FF","windowType":"Default","lz":0.08196721311475416,"mullionSpacing":2,"archHeight":1,"id":"kUvytSevD3UrWB3anozSfo","locked":false,"selected":false,"normal":[0,0,1],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"tznSPCJVyf8hCJAPieocy5","parentId":"w8ioBPnjpEK1kCVPvdyXSf","mullionColor":"white","mullion":true,"frameWidth":0.1,"cx":0.031589168064389835,"cy":0.1,"cz":0.319672131147541,"opacity":0,"frame":false},{"color":"#73D8FF","type":"Window","lx":0.1263566722575591,"ly":0.3,"tint":"#73D8FF","lz":0.08196721311475416,"windowType":"Default","mullionSpacing":2,"archHeight":1,"id":"865c35tP58MbX185GC2Zp7","locked":false,"selected":false,"normal":[0,0,1],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,0],"parentId":"9EahYNQZypYcfg5Yptfmkk","mullionColor":"white","mullion":true,"frameWidth":0.1,"cx":0.0006407972856078512,"cy":0.1,"cz":0.319672131147541,"opacity":0,"frame":false},{"color":"#73D8FF","type":"Window","lx":0.1263566722575591,"ly":0.3,"tint":"#73D8FF","windowType":"Default","lz":0.08196721311475416,"mullionSpacing":2,"archHeight":1,"id":"gyCeohTiRvRXSouuRxL1uy","locked":false,"selected":false,"normal":[0,0,1],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,0],"parentId":"jbmSv4P2XCW2pGLUzPPdFg","mullionColor":"white","mullion":true,"frameWidth":0.1,"cx":-0.030627972135977996,"cy":0.1,"cz":0.319672131147541,"opacity":0,"frame":false},{"normal":[0,1,0],"rotation":[0,0,-2.001622384412783],"lx":0.494,"type":"Human","ly":0.494,"lz":1.72,"parentId":"6hcF56jh7q4LNRLycVpoD9","cx":0.6155237368087336,"cy":-13.667323728312198,"cz":0.05000000074505806,"name":"Juro","id":"r66dpfqZ6etskNEDBj8h8E","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,0],"lx":1.7,"type":"Human","ly":1.7,"lz":1.68,"parentId":"Ground","cx":-48.35423161189035,"cy":-82.28031356342372,"cz":0,"name":"Joan","id":"w1GaaLPU8uoPVtySP11CNB","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,0],"type":"Human","lx":1.8,"ly":1.8,"lz":1.75,"parentId":"Ground","cx":-48.773755635528666,"cy":-86.19055704219848,"cz":0,"name":"Joel","id":"hqm4qYUeBiCnkFo8f8K4q3","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"type":"Human","lx":0.42,"ly":0.42,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","lz":1.8,"cx":5.159796472851735,"cy":-2.2075746120889566,"cz":1.5,"name":"Jack","id":"57uEnUU7dx25CfhheTRdsb","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"lx":0.6,"type":"Human","ly":0.6,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","lz":1.88,"cx":9.25006190829934,"cy":6.451678309086552,"cz":1.5,"name":"Joseph","id":"7pCFcU7FA5XV2M6Yw2pNPJ","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"type":"Human","lx":0.6,"ly":0.6,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","lz":1.65,"cx":-0.4372003189144742,"cy":8.19573281933403,"cz":1.5,"name":"Jeff","id":"dJi9Dc4GEuLq5NjFPvHqU9","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"type":"Human","lx":0.695,"ly":0.695,"lz":1.6,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","cx":-8.6401936835747,"cy":0.41444427778789716,"cz":1.5,"name":"Jena","id":"9EHiXxpVGajiXXrSM5hPga","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"lx":0.43,"type":"Human","ly":0.43,"lz":1.5,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","cx":0.007552993564822197,"cy":-8.796578961750832,"cz":1.5,"name":"Jess","id":"7yXJFHLZH8aLmjnxsCJfei","locked":false,"selected":false}],"sceneRadius":117,"view":{"yearlyLightSensorPanelY":0,"weatherPanelY":0,"panCenter2D":[-29.13539419159263,-62.86427427096306,-0.0000621339264290157],"showWeatherPanel":false,"showYearlyPvYieldPanel":false,"showSiteInfoPanel":true,"weatherPanelX":0,"dailyPvYieldPanelY":8,"autoRotate":false,"heliodonPanelY":-33,"showGroundPanel":false,"dailyPvYieldPanelRect":{"width":600,"x":0,"y":0,"height":400},"orthographic":false,"heliodon":false,"groundImage":false,"mapTilt":0,"showInstructionPanel":true,"groundPanelX":0,"cameraPosition2D":[-29.13539419159263,-62.865274648456655,150],"enableRotate":true,"cameraPosition":[13.301447909114042,-125.69517498333751,12.672024693594299],"mapWeatherStations":false,"waterSurface":false,"mapZoom":17,"heliodonPanelX":-1175,"groundPanelY":0,"shadowEnabled":true,"dailyPvYieldPanelX":-3,"panCenter":[-18.660063442267198,-59.376354618489714,6.942819287427842],"showMapPanel":false,"showDailyPvYieldPanel":false,"groundColor":"#68ccca","showHeliodonPanel":false,"yearlyPvYieldPanelY":16,"mapType":"hybrid","yearlyPvYieldPanelX":-25,"cameraZoom":5.839780486775448,"yearlyLightSensorPanelX":0,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showPvDailyYieldPanel":true,"axes":false,"showDesignInfoPanel":true,"dailyLightSensorPanelX":-240,"dailyLightSensorPanelY":232,"theme":"Grassland","groundImageType":"hybrid"},"graphState":{"yearlyHeliostatIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"poleSpacing":3,"rowAxis":"Zonal","tiltAngle":0,"rowsPerRack":1,"pvModelName":"CS6X-355P-FG","poleHeight":1,"orientation":"Landscape","interRowSpacing":2},"solarPanelArrayLayoutConstraints":{"rowAxis":"Zonal","orientation":"Landscape","minimumInterRowSpacing":2,"poleHeight":1,"poleSpacing":5,"minimumRowsPerRack":1,"maximumTiltAngle":1.5707963267948966,"pvModelName":"CS6X-355P-FG","maximumRowsPerRack":6,"maximumInterRowSpacing":10,"minimumTiltAngle":-1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"populationSize":20,"crossoverRate":0.5,"searchMethod":1,"problem":"Solar Panel Tilt Angle","selectionMethod":1,"selectionRate":0.5,"objectiveFunctionType":1,"maximumGenerations":5,"convergenceThreshold":0.01,"mutationRate":0.1,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"vmax":0.01,"inertia":0.8,"objectiveFunctionType":1,"cognitiveCoefficient":0.1,"problem":"Solar Panel Tilt Angle","socialCoefficient":0.1,"localSearchRadius":0.1,"searchMethod":1,"maximumSteps":5,"convergenceThreshold":0.01,"swarmSize":20}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Tourist Attraction","modelAuthor":"The Architect","modelLabel":"Mayan Pyramid","modelDescription":"El templo de Kukulc\xe1n,1\u200b es un edificio prehisp\xe1nico ubicado en la pen\xednsula de Yucat\xe1n, en el actual estado del mismo nombre.","designProjectType":null,"notes":[]}')},479:function(e){e.exports=JSON.parse('{"docid":"h2AeuzPtvyccb7bEaZpofi","time":"02/04/2023 01:10 pm","timestamp":1675534213625,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":5,"date":"6/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Isfahan Province, Esfahan, Enghelab Sq Chahar Bagh e Abbasi St\u060c JMV8+QX8, Iran","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":32.64464465095667,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.25,"name":"default","longitude":51.66765981904907},"elements":[{"type":"Foundation","cx":-24.087406912469724,"cy":-0.9943329859958538,"cz":0.3,"lx":309.0660757142105,"ly":148.37785658395512,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"color":"#4d4d4d","textureType":"Foundation Texture #5","locked":true},{"type":"Wall","cx":153.13833064830163,"cy":4.807832977070984,"cz":0,"lx":15.894482628786152,"ly":1,"lz":4,"relativeAngle":1.6141972072488455,"leftPoint":[153.4831396456019,-3.131924655538281,0.6],"rightPoint":[152.79352165100136,12.747590609680257,0.6],"leftJoints":["fD1UBEgXL6iTqqgsj9fhry"],"rightJoints":["f2zX88pBygszntq4fuFUT5"],"textureType":"No Wall Texture","color":"#dd8c55","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"m87y7C5QvZwH9XgiqzyDsg","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"16a9tkDUC6i3u2A8viWNQi","leftRoofHeight":4,"rightRoofHeight":4,"locked":true,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-152.5559344954129,"cy":3.9555923893088227,"cz":0,"lx":14.231488793574167,"ly":1,"lz":4,"relativeAngle":4.801490183460943,"leftPoint":[-153.1891172963546,11.043109434155966,0.6],"rightPoint":[-151.92275169447117,-3.13192465553829,0.6],"leftJoints":["f2zX88pBygszntq4fuFUT5"],"rightJoints":["fD1UBEgXL6iTqqgsj9fhry"],"textureType":"No Wall Texture","color":"#dd8c55","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"pV4i6Rv9Vpys7aXEi9nnh4","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"16a9tkDUC6i3u2A8viWNQi","leftRoofHeight":4,"rightRoofHeight":4,"locked":true,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.45022052258609563,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kjpqeFXZhizkQQr5Hivm1x","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.42320729123092926,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xihM6sKHtJ56MCcntR5Pn3","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3961940598757629,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"aeHoYndySbPsgXVjUCfHsH","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3691808285205965,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eYyU8ieYT8rZoSrLt7N5sQ","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.34216759716543016,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5g3FeTPUp5Q7UE3xvhA98P","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3151543658102638,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rHjZTUsU1eafkXFHxU1PLK","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2881411344550974,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"7kG8zf5fGdctVHWVtR3gZG","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.26112790309993106,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pyxgv4MkDKunPXUdWXGkeK","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.23411467174476475,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dVAeQcMiSZmruJYZ1yoay8","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.20710144038959846,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2xN7obuKRCafLdBciyJcgU","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.18008820903443218,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hsVmzqgjRUqWu9pUUuohXS","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1530749776792659,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"82FTBR7MFe9VjFyizNpuHe","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1260617463240996,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iyR4AwdTWGGfWcPMw3q9yS","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.09904851496893328,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eUKQkGt2QkcKAQkFbyBd1z","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.07203528361376696,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pXoTt6VKWQ38KsJoNipigS","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.045022052258600634,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"h5HEkcguEMJKHHE9CTcHyU","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.01800882090343431,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3N4zt2BmanxLWvDVeMWxws","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.009004410451732012,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nU4dTNk98whZDM1D6iF1wH","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.036017641806898336,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wn6JZdPWKb4ULL75tPNQNf","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.06303087316206465,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vvkCvyRoLDxmsRByGmpBzy","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.09004410451723098,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2VBpzGbfV2mQWBqheobZU8","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1170573358723973,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6dAY6WFsTirRsXExVou2P4","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1440705672275636,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rhZQSKVeSziHJnsN1wJJXZ","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.17108379858272987,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iRL8ygheAyqnavA7YkPNUy","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.19809702993789616,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iDwqS1ACo3nwFTgu3ZUn9P","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.22511026129306244,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cW4eyEo2JKwejeyCd9U7qY","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.25212349264822875,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5Qe1yDDX9nFGs5zfDrsrCP","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2791367240033951,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"miecWuKrFNJbG2jUsMkGdJ","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3061499553585615,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1MQhMoVtyd649yMzeGnhiz","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.33316318671372785,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"m8pkHXYqCXHkqKvPBAZwqz","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3601764180688942,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wNkx21Xrdez1MeTxYPd4yM","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3871896494240606,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oUMCjti1nCovRzd2744TQ9","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.41420288077922696,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"txUufVQNmXshJWF6xqpWhP","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Wall","cx":-0.19779782267661816,"cy":11.895350021918105,"cz":2.268765007024547,"lx":305.9873863303283,"ly":1,"lz":4,"leftJoints":["m87y7C5QvZwH9XgiqzyDsg"],"rightJoints":["pV4i6Rv9Vpys7aXEi9nnh4"],"leftPoint":[152.79352165100153,12.747590609680286,0.6],"rightPoint":[-153.1891172963546,11.043109434155966,0.6],"relativeAngle":3.1471631119377927,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"id":"f2zX88pBygszntq4fuFUT5","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"16a9tkDUC6i3u2A8viWNQi","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"locked":true,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.45022052258609563,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"saRb1kM5vD2B9Hp74JLvqp","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.42320729123092926,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2bWU8rtwvXjxo9aXzuerLB","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3961940598757629,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eYnezXtfnko5GcAor3MWu7","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3691808285205965,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6tZNzJ3NpgTVHKjGhXk5ij","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.34216759716543016,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qYBjBMG217J5xiN31k1FVh","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3151543658102638,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2ZPzdru18Dd9wbgc6tF8hm","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2881411344550974,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4QFUZqYWR8J1sv6MW3wHQR","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.26112790309993106,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vxc3EcwAgcYTpUmxZr3Nzt","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.23411467174476475,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oVh5ccuC7bRVGc8GT2nG1w","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.20710144038959846,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"syZxWKWMgKJbf9AQLw2DbK","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.18008820903443218,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kbpuGEAsfRXc3aBZ7yLy35","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1530749776792659,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qHCQ6aJqKx2bg8CTfP6ksL","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1260617463240996,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5yhhQGggQJLxrwyLMTZk76","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.09904851496893328,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jbVZKYLq5UCNS54M7MLP7w","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.07203528361376696,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dMS3cANbFbUy72GtNg5nTX","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.045022052258600634,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dQ1L5CXyaRnqFdZmdJ23Mx","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.01800882090343431,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jJzaRsWSkzzXGUbxhM8Tkd","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.009004410451732012,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9CdAzuCiQLeLt1Rpfn5FGg","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.036017641806898336,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iw4U38q8hoNmj83CegVdj8","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.06303087316206465,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1S3q9zUqhnXwjv568RB51K","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.09004410451723098,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vF6KJJ1x1WYqaYRYVSjoYX","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1170573358723973,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fT1RMXQH4BRBFk8RzzEyqB","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1440705672275636,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"uRmEZhdLDsYdKddFP5mnAZ","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.17108379858272987,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qdquxadFLYruszob71gLbV","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.19809702993789616,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8n95WzWt7D23dwMcn7s35V","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.22511026129306244,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oPjFrXfiZkaoXxsWWdGBLk","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.25212349264822875,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vFx9mhnTHbSWtMBawETWGK","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2791367240033951,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"npXN3hv9x7TnSdu9mcCLRN","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3061499553585615,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5sdwP9myEG7quLwU7Xrz47","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.33316318671372785,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jSXDfhhT2GuCgaELbHNqdw","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3601764180688942,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rz4GUsef9nqJhXFRmdEzzD","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3871896494240606,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4bjaEWSRz3V8CCdF71xaCz","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.41420288077922696,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hmfdn7ZwhGKfmSizXsFFVk","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Wall","cx":0.7801939755653722,"cy":-3.1319246555382825,"cz":2.268765007024547,"lx":305.40589134007274,"ly":1,"lz":4,"leftJoints":["pV4i6Rv9Vpys7aXEi9nnh4"],"rightJoints":["m87y7C5QvZwH9XgiqzyDsg"],"leftPoint":[-151.92275169447117,-3.131924655538283,0.6],"rightPoint":[153.4831396456019,-3.131924655538281,0.6],"relativeAngle":-2.6173711784754543e-17,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"id":"fD1UBEgXL6iTqqgsj9fhry","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"16a9tkDUC6i3u2A8viWNQi","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"locked":true,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["f2zX88pBygszntq4fuFUT5","pV4i6Rv9Vpys7aXEi9nnh4","fD1UBEgXL6iTqqgsj9fhry","m87y7C5QvZwH9XgiqzyDsg"],"textureType":"No Roof Texture","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"16a9tkDUC6i3u2A8viWNQi","locked":true,"rise":0,"ceiling":false},{"type":"Wall","cx":152.31464905205874,"cy":-1.0704041763225653,"cz":0,"lx":4.732830401162478,"ly":1,"lz":10,"leftJoints":[],"rightJoints":["9NUyotcWKkPg4jzRyBrCwn"],"leftPoint":[152.6600543110326,-3.411475749046293,0.05688696619531554],"rightPoint":[151.9692437930849,1.2706673964011728,0.05688696619531554],"relativeAngle":1.7172810304491228,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"id":"oQZ4yGirBmQVFQ9YDrVVvp","parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"4UKGcXwxZXJkjRB5gCcWoM","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-153.90823853352632,"cy":-1.321690966858462,"cz":0,"lx":4.36784096744436,"ly":1,"lz":10,"leftJoints":["9NUyotcWKkPg4jzRyBrCwn"],"rightJoints":["2EQtF2szHM14rxHpJcmfUo"],"leftPoint":[-154.54251626713952,0.7680938153293653,0.05688696619531554],"rightPoint":[-153.27396079991317,-3.4114757490462893,0.05688696619531554],"relativeAngle":-1.2761193330736746,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"id":"wUpyWMY54tun2oXCsJoZhL","parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"4UKGcXwxZXJkjRB5gCcWoM","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-1.2866362370273055,"cy":1.0193806058652697,"cz":2.268765007024547,"lx":306.5121720836238,"ly":1,"lz":10,"leftJoints":["oQZ4yGirBmQVFQ9YDrVVvp"],"rightJoints":["wUpyWMY54tun2oXCsJoZhL"],"leftPoint":[151.96924379308496,1.2706673964011799,0.05688696619531554],"rightPoint":[-154.54251626713952,0.7680938153293653,0.05688696619531554],"relativeAngle":-3.13995299992499,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"id":"9NUyotcWKkPg4jzRyBrCwn","parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"4UKGcXwxZXJkjRB5gCcWoM","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-1.1369830444213562,"cy":-3.2057378745231233,"cz":2.268765007024547,"lx":304.27424431214394,"ly":1,"lz":10,"leftJoints":["wUpyWMY54tun2oXCsJoZhL"],"rightJoints":[],"leftPoint":[-153.2739660888427,-3.4114757490462466,0],"rightPoint":[151,-3,0],"relativeAngle":0.0013523191073632186,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"id":"2EQtF2szHM14rxHpJcmfUo","parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","wallStructure":"Stud","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"4UKGcXwxZXJkjRB5gCcWoM","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"id":"4UKGcXwxZXJkjRB5gCcWoM","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["9NUyotcWKkPg4jzRyBrCwn","wUpyWMY54tun2oXCsJoZhL","2EQtF2szHM14rxHpJcmfUo","oQZ4yGirBmQVFQ9YDrVVvp"],"selected":false,"locked":true,"rise":0,"ceiling":false},{"type":"Foundation","cx":-13.437660062457336,"cy":-3.021202416355237,"cz":0.05,"lx":333.3539193128119,"ly":8.472793647667807,"lz":0.05688696619531554,"normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dYN3JG9zLXMcmq6cqLG4jC","selected":false,"locked":true},{"type":"Window","cx":-0.4547943367220286,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","id":"8c427syBcfkzhApjRu7KiG","locked":true},{"type":"Window","cx":-0.4440280432415217,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jdaEWMvReo1Vung8tjzaSx","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4332617497610147,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3B48xu3sHcEjL7mhoaWwHU","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4224954562805078,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5U7EeBcgVpiGapLTZWovwM","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4117291628000008,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jSiSuprvH81cqvi89vBqpb","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4009628693194939,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dchxG8ZAQ9uRfitqDkaXnL","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3901965758389869,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rd3v273iMAtFt31eXrFRnG","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.37943028235848,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nJWwv1LMiSQJXxdLNgDCWR","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.368663988877973,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tEUzEwitdzqR62Z2hEX3qr","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3578976953974661,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"794wiotJYK86u4ytktDe21","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3471314019169591,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5tf1cYsGZGuXZLvqtY3Wus","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3363651084364522,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6wFEvk3pLRAy6sCQxQ4sPQ","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3255988149559452,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vknekJf36fzszYh1h83wqd","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3148325214754383,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"x2iBhPct6yCXXun6vuDJJS","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3040662279949313,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rgbja9QpX2jJYhsCViY2yY","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2932999345144244,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xyNKQPQWThs67xeiTbWtLY","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2825336410339174,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"gbTmncsXqQVmz8SeKbxv3d","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2717673475534105,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9PuDkFfgSLMfPq51XevFh7","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2610010540729035,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"mJGKG5YpTDDj5mzeHuFzCm","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2502347605923966,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8z2YkWvq4poYzmwNCG45JY","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.23946846711188963,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"emAZ74KFMWSta8KaMduCkr","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.22870217363138268,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6Ds8xyAoQtsih1Pj2eDZwi","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.21793588015087573,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"u45SNvprQYGANCPSwBGzLs","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.20716958667036878,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"htZhURdHCCyJ33tqDmC1gT","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.19640329318986183,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wZwEP2ER3Q9obYa3kXhZ7h","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.18563699970935488,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5zNfcKQCEZvh8nJP9dr2G9","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.17487070622884793,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pBLFgbZxEBNSEtSSjunwwQ","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.16410441274834098,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qkAJcZyKCcJsGREUhkQ78i","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.15333811926783403,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bY9FdJE4SUzDC35a2K1Tzi","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.14257182578732708,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"chLpcXJGwNdNfMozdu7hKg","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.13180553230682013,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3v2BjJSxDF6WpC2DEP42PU","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.12103923882631318,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fqLN8nXoQdJLLJXy5Gwq4f","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.11027294534580623,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"21VBTu8WAdnNwf3x8Zhsuu","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.09950665186529928,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ioXeHrGyfepr3g94p8JLrw","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.08874035838479233,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cy797bHB115wX1gZRH3swM","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.07797406490428538,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"avv4wEy6iPL1CGQoPdSWU5","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.06720777142377843,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fJbmZ64QMaPM9EGMmB984H","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.05644147794327148,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dWfjvmrxqx18k2RKjfdiie","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.04567518446276453,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nefVVFfk24vVE2WLuZReQ4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.03490889098225758,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qLr8HKMWcfRHcfPkHfGPHC","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.024142597501750636,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oy13AUfgb8jcwnMbGNC7a4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.013376304021243696,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4oRAMSYUJG1S9YeFQFNThR","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.0026100105407367564,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"gSmzU3p7S4nLpThNjjLpNP","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.005872523716636283,"cy":0.1,"cz":0.215,"lx":0.004567518446267809,"ly":1,"lz":0.41000000000000003,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jVtZiADJWYhT3XDB4vjJJ8","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.01533381192677481,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6CmGH8a9xKQ4kNuHGUMAw4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.02528447711330811,"cy":0.1,"cz":0.205,"lx":0.005546272399057335,"ly":1,"lz":0.39,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"u38CDVSjPJwJgHnw2Y6FBF","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.03327763439428638,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tq3gcRfDVJqb7T6MyBKK2T","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.04404392787479333,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dSNi5FN3jitEZpttkJCZah","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.05481022135530028,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"skDmbyQ9ChWHwFXt4vbpdF","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.06557651483580723,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1TSBXLmviiwznmkhKxY4F2","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.07634280831631418,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vYMMSTxDfPvirbGiiE2UJZ","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.08710910179682113,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rRLUQpqQSTeubCr79bjn8m","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.09787539527732808,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"gcKRcHdNpX9Vtmc6HncwGF","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.10864168875783503,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oeGCBcEftrMH9jXAYtFrCa","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.11940798223834198,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ajECxgC3C6oXv4ciM75edJ","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.13017427571884893,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"g62oxEPuj3wd39vv4EYTgA","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.14094056919935588,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4k8GPkrBb12613smqqyShp","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.15170686267986283,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vBpUF9pHrUiuWZ5eVGTu5p","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.16247315616036978,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hgdBdvabmf6Pd5AVy88Leh","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.17323944964087673,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"mkgCAdDKF5LyXVZDpVipxK","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.18400574312138368,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"352sJZ7Jvw7FRWDNhR3m19","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.19477203660189063,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hTHrpxyWuGhz1duVVa441z","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.20553833008239758,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"icykR9dGdiRBF5wm2ixAXY","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.21630462356290453,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8hHkoZq2YYvcBW78r5hZFt","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.22707091704341148,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"sezgWua2c8TT2rYs9Vc9P3","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.23783721052391843,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wdyWjdXf8jBzBkXxJJiXk1","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.24860350400442538,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wxGSNmdFgrPkRZEQsr8fWa","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.25936979748493233,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kQNmZsKiKnFT7Utyn9jZgh","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2701360909654393,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bANrbxGiy8tnQaAwz7Zyf4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.28090238444594623,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"uLfixFD9ZurMuJqq1YJ517","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2916686779264532,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6ZXh3jYZhqjps3nTnn4kmX","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.30243497140696013,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6tnSUYG5FnRK1A46sJBg1v","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3132012648874671,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"r6eyDw9sk8QzcdPZ55YqR4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.32396755836797403,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dcBrioFfV3SWYJEue4QEz5","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.334733851848481,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qFXxdtGrRR5HpmzE8PG7T1","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.34550014532898793,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"53ERZmvVXVHTHZKdd5jDMd","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3562664388094949,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"d4fFAm5371MeUPa3wg3bvM","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.36703273229000183,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6c7LVC3vg4uwfj3z9fdtvK","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3777990257705088,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qUfYKqrHB4CrQ3N1sLtFtG","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.38856531925101573,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2m5mJjvys8EXj2Dtn5HR6L","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3993316127315227,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nTo2Ea7ixx2Bx6c49MgE5r","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Wall","cx":152.31464905205874,"cy":-1.0704041763225653,"cz":0,"lx":4.732830401162478,"ly":1,"lz":10,"leftJoints":[],"rightJoints":["g3He9XTWe5maiTYrqciaG9"],"leftPoint":[152.6600543110326,-3.411475749046293,0.05688696619531554],"rightPoint":[151.9692437930849,1.2706673964011728,0.05688696619531554],"relativeAngle":1.7172810304491228,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"id":"tTQGq2VqjKpQoZgpEaARbs","parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"9giBMxpAESvroYM29nf3G8","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-153.90823853352632,"cy":-1.321690966858462,"cz":0,"lx":4.36784096744436,"ly":1,"lz":10,"leftJoints":["g3He9XTWe5maiTYrqciaG9"],"rightJoints":["xdCET3deCXRuddujsYebQJ"],"leftPoint":[-154.54251626713952,0.7680938153293653,0.05688696619531554],"rightPoint":[-153.27396079991317,-3.4114757490462893,0.05688696619531554],"relativeAngle":-1.2761193330736746,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"id":"a3Vx8CkX7Gvm3xygEW6suk","parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"9giBMxpAESvroYM29nf3G8","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-1.2866362370273055,"cy":1.0193806058652697,"cz":2.268765007024547,"lx":306.5121720836238,"ly":1,"lz":10,"leftJoints":["tTQGq2VqjKpQoZgpEaARbs"],"rightJoints":["a3Vx8CkX7Gvm3xygEW6suk"],"leftPoint":[151.96924379308496,1.2706673964011799,0.05688696619531554],"rightPoint":[-154.54251626713952,0.7680938153293653,0.05688696619531554],"relativeAngle":-3.13995299992499,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"id":"g3He9XTWe5maiTYrqciaG9","parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"9giBMxpAESvroYM29nf3G8","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Window","cx":-0.0016312565879556264,"cy":0.1,"cz":-0.25,"lx":0.9722289264215535,"ly":1,"lz":0.4,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4TrowgoNHHNXYC8KtY1dtx","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4547943367220286,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iof3BVn3KFMX9V6rxX61FU","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4440280432415217,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oeVswn1FhJvx1f2JWvuaZH","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4332617497610147,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4ZTszhixEz84xXerw82Uo3","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4224954562805078,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1sd89pPPKeQ9FqjTEs4sZF","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4117291628000008,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8s1DLvp5TX82whCzVfdUy4","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4009628693194939,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oXy9DWPm3cMawuws3jF8Dw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3901965758389869,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ggUJnAELkscnr8wCY2e7Xs","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.37943028235848,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8K3TMP2Tgt2RSSJuVqdR4j","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.368663988877973,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2S8f7FahdEW7w7JhfCr366","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3578976953974661,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hhTDcot7DdMSFULh2sdVeZ","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3471314019169591,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2pZvpiD5SsELthkKt5tJ3m","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3363651084364522,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qtThbnZ5JrBKiRkEvfRHrG","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3255988149559452,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fGfPoazDUrc1DSJzSnMpw3","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3148325214754383,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"x3RhjZSxkvWSRpw5djcpHZ","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3040662279949313,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oLkzHPWGqiFTFWraAnDDgS","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2932999345144244,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tjR9qDZMaGrJrWqAX3GTdN","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2825336410339174,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2mkdDg7a8yURhWsybphBX8","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2717673475534105,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"shD7ir3GFfbNG9UMMU6iwe","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2610010540729035,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"afuEQk9zuenrJ8npwWbHHS","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2502347605923966,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bUcm7SdZ4EQSXBzhVjLFu8","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.23946846711188963,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"umh8sJsWFoUPrkMgMwXLJn","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.22870217363138268,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ervRrrNZYFcCz6shRwYQAk","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.21793588015087573,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"aRMEj198niGbhwRDVQV2Km","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.20716958667036878,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"25sJCfiia7r85LY9nqQicw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.19640329318986183,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"73rwFbBokSJRAU9Dv14LUw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.18563699970935488,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9DpFamDpKZuxKGTKjNyYgL","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.17487070622884793,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tMcjE28A6HsCisTEqVEqDz","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.16410441274834098,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5prc1TM3iJvnq2rRv3GjGw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.15333811926783403,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8hZc1y1J1uuiUzd7bn2efy","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.14257182578732708,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"btAxXppEu9xUvRTDmyL6e9","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.13180553230682013,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nk7LwxQwWjfkFkTpnqaBzC","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.12103923882631318,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xqm1C2kjuX1xr87NJG13D1","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.11027294534580623,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tKZW8EpQP3VnR9rHQDUsi7","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.09950665186529928,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cs2PWb768A9N78tdDnfCJe","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.08874035838479233,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"aEp3n5z6CHtBUhs4tf1qQE","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.07797406490428538,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9yP2H7BonttfM9g6obUAWw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.06720777142377843,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"mzzB5cTKaPu2GCcZSHNfoN","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.05644147794327148,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rLsbraJPBqJvE4764xSEve","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.04567518446276453,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vKVhtpqyoaaHZW5MyN6eTB","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.03490889098225758,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jqdKUxQoqH8xWJQ6WhDGVQ","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.024142597501750636,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"7W9Ex51ZfXMaF32tnfWjoG","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.013376304021243696,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cHwdqwmBgx8A17cDpZPPbh","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.0044043927874840355,"cy":0.1,"cz":0.21999999999999997,"lx":0.003588764493510067,"ly":1,"lz":0.42000000000000004,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eJYiY4DxK2CARyVadVVJCx","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.004567518446267871,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9Q9L4KdsCCfLnQFBJuanXE","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.01533381192677481,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3cRXM4bonZuYd9TnGSQqHH","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.026100105407281752,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"97h3j7H6Qh9e6EQaWwwUZs","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.034419514005859485,"cy":0.1,"cz":0.21999999999999997,"lx":0.004893769763858407,"ly":1,"lz":0.42000000000000004,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1tjDay5JXZwfoH1FRqotv8","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.04404392787479333,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"r2NNGxf63r8FosPwJcTE9W","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.05481022135530028,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oAWmRTRvbzDTo9C3MrVKuU","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.06557651483580723,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nxEpnZTwyQv5kRbmcUQT1a","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.07634280831631418,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cxmmFejGDyUJgTvayWAjdb","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.08710910179682113,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rMHepSTZZvbuQwxezFKpdj","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.09787539527732808,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eaxDcJH54ULucXspGZbKty","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.10864168875783503,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iCSFe1wxX4XSin8cB68JeL","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.11940798223834198,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kgoq3WLxjVdPRdaxyzqFVA","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.13017427571884893,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tBR5PErXE7yvYAGPgMqH1D","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.14094056919935588,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iyQuNv6jvRv3GvuS8UwxUv","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.15170686267986283,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xmqsdiGpkMdxiVjXTPaJy1","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.16247315616036978,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"k5yQE7AumptJLR5Hzwy992","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.17323944964087673,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pB3LcGmgHBTuT6LcAoCTvg","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.18400574312138368,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"n43Pd6jLDz3CYkTbCV3gjh","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.19477203660189063,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"trG58x8VeFSbKFAEHY4zJs","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.20553833008239758,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pTcw3Ur3TBnoB59qvLnZju","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.21630462356290453,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cfRJh7295CGWwCnbeA6tL2","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.22707091704341148,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dY8S4UaNAqP39TMFMEg5vp","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.23783721052391843,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iXENQGue8HpDQxMxGep9B7","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.24860350400442538,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wcpBvnsfPogwewn1nqjhP1","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.25936979748493233,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"o9i61J2BnA3F192C23MrBE","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2701360909654393,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"491xMjyUYSkSxP8QumC9Ad","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.28090238444594623,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pSWKk8pafQidxC7vXHaMCo","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2916686779264532,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iTAFmPC5oX6jsetEFccxke","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.30243497140696013,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iz9ye9NbXspk9eitQpzyBB","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3132012648874671,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"gNyXuR9rKr3itGofcKsjEe","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.32396755836797403,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qtDo91vL39Swf6jH2eCN33","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.334733851848481,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jPqnNwwcUAYNf7z6neEUMx","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.34550014532898793,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bEUtkBUPaeHwYUvidNh7L3","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3562664388094949,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ea6qeRQ1FZ5mWCfujb9TRw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.36703273229000183,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wWpVZQ8VDFJormPKS8z6GS","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3777990257705088,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"sxCmsmibuQs3hkEUB7yL2z","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.38856531925101573,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hg7q1GBM4nGGX6iEWCAYQY","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3993316127315227,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tYNYJRyLtFZMp118iLaQYh","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Wall","cx":-1.1369830444213562,"cy":-3.2057378745231233,"cz":2.268765007024547,"lx":304.27424431214394,"ly":1,"lz":10,"leftJoints":["a3Vx8CkX7Gvm3xygEW6suk"],"rightJoints":[],"leftPoint":[-153.2739660888427,-3.4114757490462466,0],"rightPoint":[151,-3,0],"relativeAngle":0.0013523191073632186,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"id":"xdCET3deCXRuddujsYebQJ","parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","wallStructure":"Stud","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"9giBMxpAESvroYM29nf3G8","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"id":"9giBMxpAESvroYM29nf3G8","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["g3He9XTWe5maiTYrqciaG9","a3Vx8CkX7Gvm3xygEW6suk","xdCET3deCXRuddujsYebQJ","tTQGq2VqjKpQoZgpEaARbs"],"selected":false,"locked":true,"rise":0,"ceiling":false},{"type":"Foundation","cx":-26.222816598442076,"cy":-0.9292686291105667,"cz":0.05,"lx":333.3539193128119,"ly":8.472793647667807,"lz":0.05688696619531554,"normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"5wyrw4eyiKGEAMo62i1ana","selected":false,"locked":true},{"type":"Cuboid","cx":-43.176009447245605,"cy":-162.89911470396555,"cz":2.4,"lx":33.24079414212538,"ly":153.39358926336755,"lz":4.8,"color":"gray","faceColors":["gray","gray","gray","gray","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.690700446406907],"parentId":"Ground","selected":false,"id":"u7iJ275LF7PsLiM2u1dVBQ","locked":true},{"type":"Cuboid","cx":-2.8348275713997992,"cy":161.33575348972343,"cz":2.4,"lx":33.24079414212538,"ly":153.39358926336755,"lz":4.8,"color":"gray","faceColors":["gray","gray","gray","gray","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.690700446406907],"parentId":"Ground","id":"wyK5WSj9bXtNuRAF7XgETz","selected":false,"locked":true},{"type":"Human","name":"Jack","cx":-13.867776626070096,"cy":16.44454221560224,"cz":2.4,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"u7iJ275LF7PsLiM2u1dVBQ","id":"3TR4V58Snnnj9e7TpcxNer","selected":false,"locked":true,"ly":0.42},{"type":"Human","name":"Jade","cx":4.361328445266435,"cy":5.283856360212143,"cz":2.4,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"wyK5WSj9bXtNuRAF7XgETz","id":"432YUQhSdAnxi3UMs4gV6j","selected":false,"locked":true,"ly":0.48},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.21759070764863064,"cy":0.09383633281654624,"cz":0.500000019868218,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"nA8YNqGcgNn6n9w5X3BpF9","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.16557346067688847,"cy":0.09106998636897809,"cz":0.5000000198682152,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"wZS6seNSEkCgvazx2SPZ5c","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.11082921515041991,"cy":0.08928793716557112,"cz":0.5000000198682152,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"x3C87W7drRbnUHfAYYiZ6Y","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.05774324107965007,"cy":0.0913178646013816,"cz":0.5000000198682152,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"u6wAPuen9vF2Z3r6jkt6uM","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.005068761768732548,"cy":0.08874894608300367,"cz":0.5000000198682152,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"rL6iysZ9LkBhdnBmy78QpW","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":-0.0491156001466331,"cy":0.09437002382165598,"cz":0.500000019868227,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"rEnSYjbkzp79trJtnUa7Gy","selected":false,"locked":true},{"type":"Window","cx":0.41009790621202963,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pR2ZvfPm33xd32n52fERDG","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.4208641996925366,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"d3taAEWrsfg9pDkNriT6Bf","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.41009790621202963,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jDcqi15keuTdq7ExRrL3UP","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.4208641996925366,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"q63v3RoQgW3e2HtK8UQ7Hm","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":4.636310074930709e-17,"cy":0.1,"cz":-0.275,"lx":0.9689664132456421,"ly":1,"lz":0.45,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rkSn9S8cDboGt5qcUBcvye","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":58,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[110.96343175001607,66.9554559161036,0.0000720622586878184],"yearlyHeliostatYieldPanelY":0,"mapPanelX":197,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[110.96343175001607,66.95530590939957,150],"theme":"Dune","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":17,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-12.806523424789926,-160.05159040218686,14.727641870329451],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":3.3216676797521423,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#fb9e00","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-32.60447516785695,-115.97404775152154,0.3818596975980578],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":2.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"dailyPvYieldPanelRect":{"x":-4,"y":10,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyLightSensorPanelRect":{"x":-1254,"y":272,"width":600,"height":360},"weatherPanelRect":{"x":820,"y":40,"width":500,"height":500},"waterSurface":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},480:function(e){e.exports=JSON.parse('{"docid":"9ZNtij6epEbjFerL3Fki8V","time":"04/30/2023 08:14 pm","timestamp":1682900089813,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2023, 12:00:00 PM","cspTimesPerHour":1,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"countryCode":"US","airConvectiveCoefficient":5,"diurnalTemperatureModel":1,"highestTemperatureTimeInMinutes":900,"sutTimesPerHour":1,"sutDaysPerYear":4,"sutGridCellSize":1,"noAnimationForThermalSimulation":false,"noAnimationForSolarUpdraftTowerSimulation":false},"elements":[{"type":"Cuboid","cx":-0.22430639550810128,"cy":8.947133751823877,"cz":2.401107446167214,"lx":18.902326348374032,"ly":5.3294214620188916,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"stackable":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"m4D9SbEpcsZfFRNzvJTjS5"},{"type":"Cuboid","cx":-0.26822240735293335,"cy":12.103493027949177,"cz":2.839687693194611,"lx":18.984817336850906,"ly":1.06143303468172,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"4w7XR2z9jkkyeZbNjAh92J","selected":false},{"type":"Cuboid","cx":-8.62825556014066,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"8anKqMBmn2tBM3VcbkW2hs","selected":false},{"type":"Cuboid","cx":-5.172802633695682,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"1L5N5fkm9M3irZedu1HDBw","selected":false},{"type":"Cuboid","cx":-1.7173497072507025,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"6oVCjynNCY7nCmhamoZVq2","selected":false},{"type":"Cuboid","cx":1.7381032191942762,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"4zPy6F9nXphm8skTrgCaAW","selected":false},{"type":"Cuboid","cx":5.193556145639255,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"7mvJNbzUwn3qqmU3qEVitc","selected":false},{"type":"Cuboid","cx":8.649009072084235,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"xiYgkAhrbVK6XVAigVSkom","selected":false},{"type":"Human","name":"Jack","cx":-7.801540397849415,"cy":-0.26188830739616975,"cz":2.4011075496673584,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m4D9SbEpcsZfFRNzvJTjS5","id":"8NTe1csuN2SaTMvxbNW9Po","selected":false},{"type":"Cuboid","cx":-3.6145240973701718,"cy":4.206434223281605,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"8JgsqWqgb4cyYSdEJfGwEm","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"8JgsqWqgb4cyYSdEJfGwEm","id":"xeWGgNUm9y6UhkwbSisvQf","selected":false},{"type":"Human","name":"Jeff","cx":-0.06368738371907989,"cy":0.025775270777415926,"cz":0.10000000149011612,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pcfABj9VPodaxzM775mxon","id":"eeqUf4vobbEXfMB8bkzmGM","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"xeWGgNUm9y6UhkwbSisvQf","id":"m74U4PeTm7hTqfFPWnM7zL","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"m74U4PeTm7hTqfFPWnM7zL","id":"wUVjKjRa6pzXyxbMQ53EQM","selected":false},{"type":"Cuboid","cx":-0.019517637205746396,"cy":0.17398583927153197,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"wUVjKjRa6pzXyxbMQ53EQM","id":"d41QGJugD7tGPsTYKGhykU","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"d41QGJugD7tGPsTYKGhykU","id":"ewa94SA8sKbxzN2tE4mB3G","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"ewa94SA8sKbxzN2tE4mB3G","id":"arNH7dUPxXi661cPiribL2","selected":false},{"type":"Cuboid","cx":-0.008006915988230112,"cy":0.5202217706157303,"cz":0.1,"lx":1.5160138319764558,"ly":1.6177944400962208,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"arNH7dUPxXi661cPiribL2","id":"pcfABj9VPodaxzM775mxon","selected":false},{"type":"Cuboid","cx":0.9517371303232212,"cy":-0.1558343454428396,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"stackable":true,"parentId":"pcfABj9VPodaxzM775mxon","id":"vTqu46XuGVTy2QjutgP1cQ","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"vTqu46XuGVTy2QjutgP1cQ","id":"pp1Ttn4SvkyFUYRPxBPiEQ","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pp1Ttn4SvkyFUYRPxBPiEQ","id":"6h2y2J7ocSWWvCr5bRQvWb","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"6h2y2J7ocSWWvCr5bRQvWb","id":"kLMxbeRFakpUXe68rAKa3a","selected":false},{"type":"Cuboid","cx":-0.019517637205746396,"cy":0.17398583927153197,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"kLMxbeRFakpUXe68rAKa3a","id":"ppPnuhTpcUSHXMcpxdAKgq","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"ppPnuhTpcUSHXMcpxdAKgq","id":"awwHf9YjgCzqZ59uSJXvbZ","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"awwHf9YjgCzqZ59uSJXvbZ","id":"kYGd5athrBpPwKUzyL5ypn","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"kYGd5athrBpPwKUzyL5ypn","id":"sNEKpySg3BQ4ga8B5hSXC5","selected":false},{"type":"Cuboid","cx":-1.7208456881689926e-15,"cy":0.2071151324090322,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"sNEKpySg3BQ4ga8B5hSXC5","id":"nfewirQxFL3G5mr1LTKJ4Q","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"nfewirQxFL3G5mr1LTKJ4Q","id":"eyi9c5ZCgCKTVNCEoLFZki","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"eyi9c5ZCgCKTVNCEoLFZki","id":"kDnmDYWAfFojmgmSfVFXVN","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"kDnmDYWAfFojmgmSfVFXVN","id":"6dhMXX3yHamC4VtEy1UWDu","selected":false},{"type":"Cuboid","cx":-0.019517637205746396,"cy":0.17398583927153197,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"6dhMXX3yHamC4VtEy1UWDu","id":"cmC7Vzw8ZucHWUzr8YxLFa","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"cmC7Vzw8ZucHWUzr8YxLFa","id":"9Vw4QTauKAg8QvUaB1Euvx","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"9Vw4QTauKAg8QvUaB1Euvx","id":"pJRDT44anj2xpBPXknWsKw","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pJRDT44anj2xpBPXknWsKw","id":"j38YrARLBzo6erzquVrcVn","selected":false},{"type":"Cuboid","cx":-7.012727351573531,"cy":-0.0019896050851210545,"cz":2.401107446167214,"lx":5.332404162083246,"ly":12.674961304569683,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"q5FjLBSpipgNNVuah4hNZD","selected":false},{"type":"Cuboid","cx":-0.01596259528722399,"cy":0.11880364489857795,"cz":0.05,"lx":31.446492946590087,"ly":34.94910259238378,"lz":0.1,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"stackable":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"azyA8xuS3BmfetgYA2vQmH","enableGroupMaster":true},{"type":"Cuboid","cx":-6.183805959243027,"cy":-11.996720725467824,"cz":2.839687693194611,"lx":7.107385573986727,"ly":1.0946519025967618,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"pvKQ8K8ppq2w8qd94NN9Pq","selected":false},{"type":"Cuboid","cx":-2.6545444189389995,"cy":-0.012665497780197654,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pvKQ8K8ppq2w8qd94NN9Pq","id":"wdxoPVDdzYeWyAYAZzkhtp","selected":false},{"type":"Cuboid","cx":0.8009085075059792,"cy":-0.012665497780197654,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pvKQ8K8ppq2w8qd94NN9Pq","id":"5uJL1EV8MPYeihH3UHzRgB","selected":false},{"type":"Cuboid","cx":-6.259452975235207,"cy":-8.867472080025085,"cz":2.401107446167214,"lx":6.926658110091524,"ly":5.102845526644927,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"fDXXcdBNXgffF1kQT4tCPn","selected":false},{"type":"Cuboid","cx":6.486972303080908,"cy":-0.054704878346608754,"cz":2.401107446167214,"lx":5.332404162083246,"ly":12.674961304569683,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"m4EGzGFe1rC8e8u6MQUpW8","selected":false},{"type":"Cuboid","cx":-10.220230850412868,"cy":-0.014533868827829727,"cz":2.839687693194611,"lx":25.047849285814525,"ly":1.0029193528166587,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"stackable":true,"parentId":"Ground","id":"uqhNMV7mprjgQMdGsRF2QT","selected":false},{"type":"Cuboid","cx":-5.596739585658853,"cy":0.0290609141417434,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"q16v7h71SJ7yFzoy83DaBL","selected":false},{"type":"Cuboid","cx":-2.141286659213871,"cy":0.029060914141743187,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"7o2risK8LTapPsnDGartoZ","selected":false},{"type":"Cuboid","cx":1.3141662672311076,"cy":0.029060914141742975,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"eAM1pw2NKdNfF1gW8XpVih","selected":false},{"type":"Cuboid","cx":4.769619193676086,"cy":0.029060914141742764,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"5cwTU21rFZUwTfiouz5qYe","selected":false},{"type":"Cuboid","cx":8.225072120121062,"cy":0.029060914141749657,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"biVWnambVhBNmbnHk2Wiy3","selected":false},{"type":"Cuboid","cx":11.680525046566043,"cy":0.029060914141751222,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"rSaUgAuDRqbJLQtkpJnJtG","selected":false},{"type":"Cuboid","cx":-8.818019962594427,"cy":0.02514455088051193,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"sMxTWQFpHwxtpEsSHpPYb6","selected":false},{"type":"Cuboid","cx":-2.1412866592138746,"cy":0.0290609141417434,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"eRXqtRB7se3M8GzKXkxUnh","selected":false},{"type":"Cuboid","cx":-11.724426888881109,"cy":0.05789686773779312,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"qLaLq73w7A9ZmbSk84RuGL","selected":false},{"type":"Cuboid","cx":9.685298368001048,"cy":0.0017243180851487239,"cz":2.839687693194611,"lx":25.09195057934765,"ly":0.9927712733989245,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"stackable":true,"parentId":"Ground","id":"irfb2m2puWv6odJ6Jwp6YM","selected":false},{"type":"Cuboid","cx":-5.618790232425412,"cy":-0.03080928172797003,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"sEAcnpxYSig5gpY8iTY3Yy","selected":false},{"type":"Cuboid","cx":-2.163337305980429,"cy":-0.030809281727968464,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"6feu78ouLNMPYNKTLRwvPo","selected":false},{"type":"Cuboid","cx":1.2921156204645494,"cy":-0.030809281727968676,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"6CfBo1pNmDDqH7Mwik6c7H","selected":false},{"type":"Cuboid","cx":4.747568546909526,"cy":-0.030809281727968887,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"isrB6noYi8NEhJRQG8ietf","selected":false},{"type":"Cuboid","cx":8.203021473354507,"cy":-0.030809281727954888,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"dReb13hJ9AJKebwakYRY69","selected":false},{"type":"Cuboid","cx":11.658474399799484,"cy":-0.03080928172794977,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"3eH5ZbQj5WHp7QCzbxMKGz","selected":false},{"type":"Cuboid","cx":-8.840070609360978,"cy":-0.03472564498920451,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"svPiKiErdWciBnFsmqoNKg","selected":false},{"type":"Cuboid","cx":-2.1633373059804324,"cy":-0.030809281727968464,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"aQ3KbWPYnCPqSao4PhCn2t","selected":false},{"type":"Cuboid","cx":-11.746477535647664,"cy":-0.001973328131929355,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"3GXadNYd518rGsiHZnch9r","selected":false},{"type":"Human","name":"Jamelia","cx":-0.09265449725102398,"cy":-11.357307781644565,"cz":0.05000000074505806,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"azyA8xuS3BmfetgYA2vQmH","id":"1JVUnXP3EYNgXEV5Mhij7X","selected":false},{"type":"Cuboid","cx":5.911674805614613,"cy":-8.780289167948837,"cz":2.401107446167214,"lx":6.525003449448929,"ly":4.771919851852802,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"3LriNZQ2FWUrzgTjH1nQGp","selected":false},{"type":"Cuboid","cx":5.6478649104510295,"cy":-12.017787072476704,"cz":2.839687693194611,"lx":7.128069650550036,"ly":1.1096381510921969,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"stackable":true,"parentId":"Ground","id":"qEtCzg44w2EkGdkHGvTyXg","selected":false},{"type":"Cuboid","cx":-2.609503179079046,"cy":0.028969325588168324,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"qEtCzg44w2EkGdkHGvTyXg","id":"54P6ija5X4jX2T74DKWGuo","selected":false},{"type":"Cuboid","cx":0.8459497473659319,"cy":0.0289693255881679,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"qEtCzg44w2EkGdkHGvTyXg","id":"hhTBL9sevUWmS4YHc9UFL2","selected":false},{"type":"Cuboid","cx":5.908936634022203,"cy":-0.011694823916091224,"cz":0.25,"lx":5.894051564987242,"ly":1.0122050011149266,"lz":0.5,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pvKQ8K8ppq2w8qd94NN9Pq","id":"79YR8wYSe1eRRM8AXmk2pi","selected":false}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[3.365731258384917,-4.23743050549221,-0.000004359573758408488],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[3.365731258384917,-4.237580512159635,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-0.8932377675710492,-35.04498361736728,12.916960792715187],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"directLightIntensity":1,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":30.146795390577452,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16A5A5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0,0,0],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":3.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"heatFluxScaleFactor":20,"heatFluxColor":"gray","heatFluxWidth":0.5,"showAzimuthAngle":true,"showElevationAngle":true,"showZenithAngle":true,"groundImageType":"roadmap","waterSurface":false,"solarPanelShininess":100,"windowShininess":200,"showDiurnalTemperaturePanel":false,"showEconomicsPanel":false,"showDailyUpdraftTowerYieldPanel":false,"showYearlyUpdraftTowerYieldPanel":false,"showDailyBuildingEnergyPanel":false,"showYearlyBuildingEnergyPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"yearlyLightSensorPanelShowDaylight":false,"yearlyLightSensorPanelShowClearness":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},481:function(e){e.exports=JSON.parse('{"docid":"ag6x1qqPgPt1AJp2oKoKDF","time":"02/02/2023 08:27 pm","timestamp":1675387657521,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"10/1/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":1,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":5.105053829358722,"normal":[0,0,1],"lz":0.1,"ly":26.301278139506802,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-1.995894425388201,"cz":0.05,"rotation":[0,0,0],"lx":38.854999999999976,"selected":false,"parentId":"Ground"},{"rotation":[0,0,0],"normal":[0,0,1],"showLabel":false,"label":"Row1","cy":-0.39629808463170607,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"cz":0.5000000074505806,"type":"Solar Panel","id":"c2J7QZr1z68dpk33yTT2Sd","orientation":"Landscape","cx":-0.0067633355149074184,"relativeAzimuth":0,"trackerType":"None","poleSpacing":3,"selected":false,"lz":0.046,"lx":31.488,"poleHeight":1,"drawSunBeam":false,"ly":1.984,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-355P-FG"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.006869188501244585,"cy":-0.3009472773624533,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6g9iBRNNW6XDAK9EeP8dnv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0069750414875817505,"cy":-0.20559647009320042,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ec9UdLR1fMcWkEUdiFjUx2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007080894473918917,"cy":-0.11024566282394763,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fQLn5udBainjxVp4XrJMRj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007186747460256083,"cy":-0.014894855554694773,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"p8zx94dUJdEAskSt1PKSVa","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007292600446593249,"cy":0.08045595171455801,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fc9ACQJk2egBLobC44KRz9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007398453432930415,"cy":0.1758067589838109,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k1F8Jw2a6YkaS53ggunuWE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007504306419267581,"cy":0.2711575662530637,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nfKxjTCwPLzpCqrrT4qwQd","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007610159405604748,"cy":0.3665083735223166,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oY8VxSJVvnuAD8XoQBDkh2","selected":false},{"type":"Tree","name":"Spruce","cx":11.921605574611789,"cy":-10.909355003026004,"cz":0,"lx":4.3193414394375225,"lz":9.842530786133311,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"vfBrsVoh8zPsZKEuooN1Mp","selected":false,"showModel":false},{"type":"Tree","name":"Spruce","cx":-2.2808944253881993,"cy":-11.194355003026004,"cz":0,"lx":4.3193414394375225,"lz":10.279562696083193,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"99sYceKNBfrqJSsDa72tLX","selected":false,"showModel":false},{"type":"Human","name":"Joel","cx":-7.8137499999999935,"cy":-0.3139426000311314,"cz":0.05000000074505806,"lx":1,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ipdiy6H5XdiRMv79uDtrRE","id":"obVZfacvimifAis6oD33mX","selected":false,"observer":true,"ly":0.6},{"type":"Tree","name":"Spruce","cx":2.374105574611796,"cy":-10.956855003026007,"cz":0,"lx":4.3193414394375225,"lz":9.842530786133311,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"sCYPQFyb4Ezu7V4j1ddt8r","selected":false,"showModel":false},{"type":"Tree","name":"Spruce","cx":7.029105574611797,"cy":-11.004355003026005,"cz":0,"lx":4.3193414394375225,"lz":8.761424913666062,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"jgqeg8YLSBfHZnbBhuouTU","selected":false,"showModel":false},{"type":"Human","name":"June","cx":7.0000631393125845,"cy":-0.3317126323621302,"cz":0.05000000074505806,"lx":0.4,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ipdiy6H5XdiRMv79uDtrRE","id":"m6FHMxEEVfFM123WLmXjyv","selected":false,"observer":true,"ly":0.4},{"type":"Foundation","cx":-1.9721444253882048,"cy":-14.775412402994869,"cz":0.05,"lx":38.427499999999974,"ly":3.837114799937732,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"ipdiy6H5XdiRMv79uDtrRE","textureType":"Foundation Texture #2"}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":false,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[4.688586933696731,-41.63558463662862,6.94326488693142],"panCenter":[5.94996462578833,-14.876226974643979,5.628671784918282],"orthographic":false,"enableRotate":true,"cameraZoom":21.05263157894738,"showInstructionPanel":false,"cameraPosition2D":[2.659105574611795,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.659105574611795,-0.19805700089319547,5.501827899659354e-7],"showSolarPanelVisibilityResultsPanel":true,"visibilityResultsPanelX":-6,"visibilityResultsPanelY":-1,"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":342,"height":67}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Vegetative buffer to hide solar farms"]}')},482:function(e){e.exports=JSON.parse('{"docid":"8D5YJAWj6vd3LW25Hcokqe","time":"02/02/2023 03:03 pm","timestamp":1675368235538,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"timesPerHour":10,"pvGridCellSize":0.25,"address":"Natick, MA","name":"default","longitude":-71.3488548,"latitude":42.2844063,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"date":"9/22/2022 12:00:00 PM","orthographic":false,"cameraZoom":43.16939043526371,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"lz":0.1,"rotation":[0,0,0],"normal":[0,0,1],"cy":-0.0832752328102914,"id":"iGgGyZAWhJDDrqTBSuKY6v","ly":10.412088787523913,"type":"Foundation","cx":0.013242648336242419,"selected":false,"cz":0.05,"lx":16.616755394628733,"parentId":"Ground"},{"lz":0.046,"selected":false,"cz":0.5000000074505984,"relativeAzimuth":0,"cy":0.010384230278591844,"cx":0.2680462212766878,"poleRadius":0.05,"showLabel":true,"lx":1.046,"label":"60\xb0","tiltAngle":1.0471975511965976,"poleSpacing":3,"rotation":[0,0,0],"poleHeight":1,"trackerType":"None","drawSunBeam":false,"orientation":"Portrait","ly":1.558,"type":"Solar Panel","id":"dnMAS4xYMUhcSByeLwN5TX","normal":[0,0,1],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.3898315956697325},{"ly":1.558,"drawSunBeam":false,"selected":false,"normal":[0,0,1],"id":"wc8yTNk8bcNL8vA26NKhEp","tiltAngle":0.5235987755982988,"poleRadius":0.05,"poleHeight":1,"rotation":[0,0,0],"type":"Solar Panel","lz":0.046,"trackerType":"None","lx":1.046,"label":"30\xb0","cz":0.5000000074505762,"showLabel":true,"cx":0.13277873492805234,"poleSpacing":3,"relativeAzimuth":0,"cy":0.010196717472218795,"orientation":"Portrait","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.3601290996632553},{"lx":1.046,"poleSpacing":3,"rotation":[0,0,0],"orientation":"Portrait","poleHeight":1,"showLabel":true,"tiltAngle":-1.0471975511965976,"normal":[0,0,1],"selected":false,"label":"-60\xb0","lz":0.046,"drawSunBeam":false,"id":"r18XcJKcSLBW2tCEW6s74k","relativeAzimuth":0,"cy":0.003644619198116936,"type":"Solar Panel","trackerType":"None","poleRadius":0.05,"cx":-0.26994946306447615,"ly":1.558,"cz":0.5000000074505806,"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":0.2655114569703831},{"tiltAngle":0,"normal":[0,0,1],"rotation":[0,0,0],"lz":0.046,"poleSpacing":3,"selected":false,"cy":0.010748815746320655,"drawSunBeam":true,"poleHeight":1,"lx":1.046,"relativeAzimuth":0,"trackerType":"None","cx":-0.0014144903672051448,"showLabel":true,"id":"u4LjNU3fd3PVZ6QAX6aug1","ly":1.558,"poleRadius":0.05,"label":"0\xb0","orientation":"Portrait","cz":0.5000000074506161,"type":"Solar Panel","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.055863332406658},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.14083049882259674,"cy":0.007102961069032241,"cz":0.500000007450585,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"sHpER3yfCDZgTy8YcbqJF4","selected":false,"label":"-30\xb0","dailyYield":0.5565058986546524},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3828186339361362,"cy":0.008748911792797884,"cz":0.5000000074505806,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":1.5707963267948966,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"3AQTuKXP5kZ5PgShm7kPSX","selected":false,"label":"90\xb0","dailyYield":1.1380948831431423},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.413167442044193,"cy":0.006734639393330298,"cz":0.5000000074505806,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":-1.5707963267948966,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"8GwG9uCiXmMbkeB4NtFJwK","selected":false,"label":"-90\xb0","dailyYield":0.3371955456546947},{"type":"Human","name":"Jack","cx":-0.6922041428236811,"cy":-4.092105437234061,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","id":"vDEckHeU6T8epe3YRNBYqh","selected":false,"ly":0.6}],"view":{"weatherPanelX":0,"heliodonPanelY":453,"showStickyNotePanel":true,"dailyPvYieldPanelX":4,"weatherPanelY":0,"dailyLightSensorPanelY":525,"mapZoom":16,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":-1244,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":true,"mapWeatherStations":false,"dailyPvYieldPanelY":1,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":-1277,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[8.023018704034044,-16.232959358672062,3.67727930352486],"panCenter":[5.030220047531196,-1.0315498826531624,0.3615371700849206],"orthographic":false,"enableRotate":true,"cameraZoom":53.00068653280895,"stickyNotePanelX":5,"stickyNotePanelY":2,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999796],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":1,"y":4,"width":202,"height":93}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of tilt angles on\\nsolar panel outputs"]}')},483:function(e){e.exports=JSON.parse('{"docid":"44QNMQZiyWYfqFnbbUSraT","time":"02/02/2023 03:04 pm","timestamp":1675368269762,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"timesPerHour":20,"address":"Natick, MA","name":"default","longitude":-71.3488548,"latitude":42.2844063,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"date":"9/22/2021 12:00:00 PM","orthographic":false,"cameraZoom":43.16939043526371,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"lz":0.1,"rotation":[0,0,0],"normal":[0,0,1],"cy":-0.0832752328102914,"id":"iGgGyZAWhJDDrqTBSuKY6v","ly":10.412088787523913,"type":"Foundation","cx":0.013242648336242419,"selected":false,"cz":0.05,"lx":16.616755394628733,"parentId":"Ground"},{"lz":0.046,"selected":false,"cz":0.5000000074505984,"relativeAzimuth":1.0471975511965976,"cy":0.010384230278591844,"cx":0.2680462212766878,"poleRadius":0.05,"showLabel":true,"lx":1.046,"label":"60\xb0","tiltAngle":0.6981317007977318,"poleSpacing":3,"rotation":[0,0,0],"poleHeight":1,"trackerType":"None","drawSunBeam":false,"orientation":"Portrait","ly":1.558,"type":"Solar Panel","id":"dnMAS4xYMUhcSByeLwN5TX","normal":[0,0,1],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.1296025646801735},{"ly":1.558,"drawSunBeam":false,"selected":false,"normal":[0,0,1],"id":"wc8yTNk8bcNL8vA26NKhEp","tiltAngle":0.6981317007977318,"poleRadius":0.05,"poleHeight":1,"rotation":[0,0,0],"type":"Solar Panel","lz":0.046,"trackerType":"None","lx":1.046,"label":"30\xb0","cz":0.5000000074505762,"showLabel":true,"cx":0.13277873492805234,"poleSpacing":3,"relativeAzimuth":0.5235987755982988,"cy":0.010196717472218795,"orientation":"Portrait","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.3296869651923566},{"lx":1.046,"poleSpacing":3,"rotation":[0,0,0],"orientation":"Portrait","poleHeight":1,"showLabel":true,"tiltAngle":0.6981317007977318,"normal":[0,0,1],"selected":false,"label":"-60\xb0","lz":0.046,"drawSunBeam":false,"id":"r18XcJKcSLBW2tCEW6s74k","relativeAzimuth":-1.0471975511965976,"cy":0.003644619198116936,"type":"Solar Panel","trackerType":"None","poleRadius":0.05,"cx":-0.26994946306447615,"ly":1.558,"cz":0.5000000074505806,"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.1539575918080192},{"tiltAngle":0.6981317007977318,"normal":[0,0,1],"rotation":[0,0,0],"lz":0.046,"poleSpacing":3,"selected":false,"cy":0.010748815746320655,"drawSunBeam":true,"poleHeight":1,"lx":1.046,"relativeAzimuth":0,"trackerType":"None","cx":-0.0014144903672051448,"showLabel":true,"id":"u4LjNU3fd3PVZ6QAX6aug1","ly":1.558,"poleRadius":0.05,"label":"0\xb0","orientation":"Portrait","cz":0.5000000074506161,"type":"Solar Panel","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.4023532989786718},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.14083049882259674,"cy":0.007102961069032241,"cz":0.500000007450585,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":0.6981317007977318,"relativeAzimuth":-0.5235987755982988,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"sHpER3yfCDZgTy8YcbqJF4","selected":false,"label":"-30\xb0","dailyYield":1.3216497104200369},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3828186339361362,"cy":0.008748911792797884,"cz":0.5000000074505806,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":0.6981317007977318,"relativeAzimuth":1.5707963267948966,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"3AQTuKXP5kZ5PgShm7kPSX","selected":false,"label":"90\xb0","dailyYield":0.9830976469578562},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.413167442044193,"cy":0.006734639393330298,"cz":0.5000000074505806,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":0.6981317007977318,"relativeAzimuth":-1.5707963267948966,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"8GwG9uCiXmMbkeB4NtFJwK","selected":false,"label":"-90\xb0","dailyYield":0.9777009351289816},{"type":"Human","name":"Jack","cx":-0.6922041428236811,"cy":-4.092105437234061,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","id":"vDEckHeU6T8epe3YRNBYqh","selected":false,"ly":0.6}],"view":{"weatherPanelX":0,"heliodonPanelY":453,"showStickyNotePanel":true,"dailyPvYieldPanelX":4,"weatherPanelY":0,"dailyLightSensorPanelY":525,"mapZoom":16,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":-1244,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":true,"mapWeatherStations":false,"dailyPvYieldPanelY":1,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":-1277,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[3.763670237910374,-16.61721730429299,2.914312591691999],"panCenter":[5.030220047531196,-1.0315498826531624,0.3615371700849206],"orthographic":false,"enableRotate":true,"cameraZoom":53.00068653280895,"stickyNotePanelX":5,"stickyNotePanelY":2,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999796],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":91}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of azimuth on \\nsolar panel outputs"]}')},484:function(e){e.exports=JSON.parse('{"docid":"tKo6pFHzEmKPLUAtFMSXH1","time":"02/03/2023 04:17 pm","timestamp":1675459040307,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"12/22/2022, 10:30:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":32.2226066,"longitude":-110.9747108,"address":"Tucson, AZ, USA","timesPerHour":4,"pvGridCellSize":0.25,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.7,"airAttenuationCoefficient":0.01},"elements":[{"type":"Foundation","cx":-0.14690699678366315,"cy":-7.208163838562541,"cz":0.05,"lx":11.055471871472701,"ly":58.48001412614986,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","selected":false,"id":"4LeRe177Bf56Mb1oae55ip","textureType":"Foundation Texture #1"},{"type":"Human","name":"Jess","cx":1.6319195310451686,"cy":-16.45128807612893,"cz":0,"lx":0.6,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mBHbx3X3c1GbXKCLvDVgzL","selected":false,"ly":0.6},{"type":"Parabolic Trough","cx":-0.23513458174461563,"cy":0.004519902359052559,"cz":0.5000000074505806,"lx":3.5,"ly":50,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"4LeRe177Bf56Mb1oae55ip","foundationId":"4LeRe177Bf56Mb1oae55ip","id":"dcjUqAUQZ4LNafSWu4PepW","selected":false,"dailyYield":147.4722488686051,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","label":"EW2","labelHeight":4,"labelSize":2},{"type":"Parabolic Trough","cx":0.15865672328822894,"cy":0.004519902359052563,"cz":0.5000000074505806,"lx":3.5,"ly":50,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"4LeRe177Bf56Mb1oae55ip","foundationId":"4LeRe177Bf56Mb1oae55ip","id":"pwQnP4mNmxVYhvmGqFmMN2","selected":false,"dailyYield":113.9525242653769,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","drawSunBeam":false,"label":"EW1","labelHeight":4,"labelSize":2},{"type":"Parabolic Trough","cx":-0.19816155489194087,"cy":-0.00935955151513266,"cz":0.5000000074505806,"lx":3.5,"ly":50,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rahZRzHN5oxPmD7yBmrrsA","foundationId":"rahZRzHN5oxPmD7yBmrrsA","id":"anQtntJ2EF1xbdU9j34juv","selected":false,"dailyYield":105.42067563837163,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","drawSunBeam":false,"label":"NS1","labelHeight":4,"labelSize":2},{"type":"Parabolic Trough","cx":0.2505997669563526,"cy":-0.00935955151513266,"cz":0.5000000074505806,"lx":3.5,"ly":50,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rahZRzHN5oxPmD7yBmrrsA","foundationId":"rahZRzHN5oxPmD7yBmrrsA","id":"2kyncnrNRhEC8vcEWLLbSV","selected":false,"dailyYield":105.31845023255819,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","label":"NS2","labelHeight":4,"labelSize":2},{"type":"Foundation","cx":0.359422565830144,"cy":28.716630531767144,"cz":0.05,"lx":9.701256512237665,"ly":56.88650192791737,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","id":"rahZRzHN5oxPmD7yBmrrsA","selected":false},{"type":"Human","name":"Judd","cx":3.796298271490718,"cy":-15.228318565508843,"cz":0,"lx":0.6,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"eN5ri3eDDgFLQmoz3oRMfF","selected":false,"ly":0.6}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":true,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":18,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Desert","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[16.103455794589095,-53.110389552237656,19.628758062026815],"panCenter":[15.024700307415378,0.2771229411200077,1.7412798340419682],"orthographic":false,"enableRotate":true,"cameraZoom":6.470670899474181,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[0,-0.000020000888987681265,150],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":11.5,"showSunAngles":true,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":false,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":1,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":true,"dailyParabolicTroughYieldPanelX":-5,"dailyParabolicTroughYieldPanelY":5,"showYearlyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":336,"height":66}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":true,"yearlyParabolicTroughIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of azimuths of parabolic troughs"]}')},485:function(e){e.exports=JSON.parse('{"docid":"vx1ug6kpDBy3x9Qeuoopbp","time":"02/02/2023 12:05 pm","timestamp":1675357543063,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022, 12:00:00 PM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":32.2226066,"longitude":-110.9747108,"address":"Tucson, AZ, USA","timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.6,"airAttenuationCoefficient":0.01},"elements":[{"type":"Parabolic Trough","cx":0.0029931755117467013,"cy":-0.016245165138677214,"cz":0.5000000074505806,"lx":6,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":4,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rahZRzHN5oxPmD7yBmrrsA","foundationId":"rahZRzHN5oxPmD7yBmrrsA","id":"2kyncnrNRhEC8vcEWLLbSV","selected":false,"dailyYield":233.64209746690477,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","label":"LR=4m","drawSunBeam":true,"locked":false,"labelHeight":5,"labelSize":1},{"type":"Foundation","cx":0.21407524112268916,"cy":-36.149591263989876,"cz":0.05,"lx":12,"ly":35,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"rahZRzHN5oxPmD7yBmrrsA","selected":false},{"type":"Human","name":"Judd","cx":11.353738913610336,"cy":-7.831484265178309,"cz":0,"lx":0.6,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"eN5ri3eDDgFLQmoz3oRMfF","selected":false,"ly":0.6},{"type":"Foundation","cx":-0.00004490043542196287,"cy":-0.25172016696204835,"cz":0.05,"lx":12,"ly":35,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"gZkDqHfktzoy6gJmARmspx","selected":false},{"type":"Parabolic Trough","cx":0.0029931755117467013,"cy":-0.016245165138677214,"cz":0.5000000074505806,"lx":6,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gZkDqHfktzoy6gJmARmspx","foundationId":"gZkDqHfktzoy6gJmARmspx","id":"mBvFg1q8TpWjfngs6RnkZ4","selected":false,"label":"LR=8m","dailyYield":233.64209746690477,"drawSunBeam":true,"locked":false,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelHeight":5,"labelSize":1},{"type":"Parabolic Trough","cx":-0.01770652380020336,"cy":0.008044936654478363,"cz":0.5000000074505806,"lx":6,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":16,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"evP6wn78pnNyKDZXgNgWdE","selected":false,"label":"LR=16m","dailyYield":233.64209746690477,"drawSunBeam":true,"locked":false,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelHeight":5,"labelSize":1},{"type":"Foundation","cx":0.08085129201298358,"cy":35.3877160159791,"cz":0.05,"lx":12,"ly":35,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"cZGzTuNW8Aam7msowwUroB","selected":false}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":true,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":18,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[22.155781466338546,-55.72853752805094,9.397557668970421],"panCenter":[-5.110111828219519,-15.113374046752455,0],"orthographic":false,"enableRotate":true,"cameraZoom":9.753499582310592,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[0,-0.000020000888987681265,19.99999999998951],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":9.5,"showSunAngles":true,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":false,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":1,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":true,"dailyParabolicTroughYieldPanelX":-24,"dailyParabolicTroughYieldPanelY":26,"showYearlyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":355,"height":60}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of latus rectum of parabolic trough"]}')},486:function(e){e.exports=JSON.parse('{"docid":"dvN36C7J8FdfSS21QcUvBx","time":"02/02/2023 05:16 pm","timestamp":1675376211296,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"12/1/2021 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0001687190273044117,"cy":-0.1827633083380377,"cz":0.5000000074505806,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"snQKvKf7xPrhuT28Bo2tYv","selected":false,"dailyYield":7.484195397296324,"label":"L2","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0005055611729018629,"cy":0.005909338720999285,"cz":0.5000000074506161,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"s6gwZqoX59Afjq9iWzuivT","selected":false,"drawSunBeam":false,"dailyYield":7.484195397296324,"label":"L3","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0008424033184993142,"cy":0.19458198578003624,"cz":0.5000000074506517,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pbozwPgQw2bzssDtJKTqSk","selected":false,"dailyYield":7.484195397296324,"label":"L4","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0001681231182930395,"cy":-0.37143595539707464,"cz":0.5000000074505451,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"3nSBw847J9tSxs8CwWughr","selected":false,"label":"L1","dailyYield":13.210165552148743,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640967653,"cy":0.38325463283907324,"cz":0.5000000074506872,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pu9LeYFSmjuxaejn2VSzZ1","selected":false,"dailyYield":7.484195397296324,"label":"L5","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Foundation","cx":10.048739466084358,"cy":0.01420541284211474,"cz":0.05,"lx":18.175146995703113,"ly":15,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7nkGUQpHaM9zN22MJgfSvf","selected":false},{"type":"Human","name":"Jack","cx":-0.1594284211117477,"cy":-6.960741063855943,"cz":-1.7763568394002505e-15,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"d3bJG1MfPQqauwCeM9B8UL","selected":false,"ly":0.6},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.008008869365173981,"cy":-0.18492700121558012,"cz":0.5000000074505806,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"6AH8jB41hnb2DKANJAvRwV","selected":false,"dailyYield":2.263426258433755,"label":"P2","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.008328904339362014,"cy":0.007217978403519174,"cz":0.5000000074506161,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"aB8iEcrZaWTL6xKZKhhAXB","selected":false,"dailyYield":2.2442794871667524,"label":"P3","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.008648939313550047,"cy":0.19936295802261844,"cz":0.5000000074506517,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"2meA9SG5bqFDgzeFyXtF9Q","selected":false,"dailyYield":2.2442794871667524,"label":"P4","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.007688834390985949,"cy":-0.37707198083467935,"cz":0.5000000074505451,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"868aWiBhQX239e6oehaSij","selected":false,"dailyYield":13.21016555214874,"label":"P1","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.00896897428773808,"cy":0.39150793764171776,"cz":0.5000000074506872,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"oBHHZdopRmiffSiEULht6u","selected":false,"dailyYield":2.2442794871667524,"label":"P5","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Foundation","cx":-10.236210959894782,"cy":-0.0034675956445191503,"cz":0.05,"lx":19.1296452086662,"ly":14.728928705271478,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"enRB3aUi95qo1iy8fc8PQq","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#16cda5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":true,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[22.452978407808587,-24.247050313502623,17.045911348582777],"panCenter":[16.676839641041024,0.697317195514167,0.36124976444702794],"orthographic":false,"enableRotate":true,"cameraZoom":33.40365140230188,"showInstructionPanel":false,"cameraPosition2D":[2.651601657211317,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.651601657211317,-0.19805700089319547,5.501827899659354e-7],"solarRadiationHeatMapMaxValue":4.5,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-2,"y":-3,"width":321,"height":84}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of orientation (landscape vs. portrait)\\non outputs of solar panel arrays"]}')},487:function(e){e.exports=JSON.parse('{"docid":"gtXnXouMVM8pMVHsKAhdM3","time":"02/02/2023 12:17 pm","timestamp":1675358247774,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"9/22/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.045715871759253096,"normal":[0,0,1],"lz":0.1,"ly":15,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-10.115014866732034,"cz":0.05,"rotation":[0,0,0],"lx":18.175146995703113,"selected":false,"parentId":"Ground"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640966676,"cy":-0.015945367160926777,"cz":0.5000000074506872,"lx":15.744,"ly":13.888,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.15,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tc8JHQj7hE233H7YfXfbjR","selected":false,"drawSunBeam":false,"label":"Block","dailyYield":103.86651140858137},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0001687190273044117,"cy":-0.1827633083380377,"cz":0.5000000074505806,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"snQKvKf7xPrhuT28Bo2tYv","selected":false,"dailyYield":17.598295752357192,"label":"Row 2"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0005055611729018629,"cy":0.005909338720999285,"cz":0.5000000074506161,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"s6gwZqoX59Afjq9iWzuivT","selected":false,"drawSunBeam":false,"dailyYield":17.598295752357192,"label":"Row 3"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0008424033184993142,"cy":0.19458198578003624,"cz":0.5000000074506517,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pbozwPgQw2bzssDtJKTqSk","selected":false,"dailyYield":17.598295752357192,"label":"Row 4"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0001681231182930395,"cy":-0.37143595539707464,"cz":0.5000000074505451,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"3nSBw847J9tSxs8CwWughr","selected":false,"label":"Row 1","dailyYield":20.418384465308375},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640967653,"cy":0.38325463283907324,"cz":0.5000000074506872,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pu9LeYFSmjuxaejn2VSzZ1","selected":false,"dailyYield":17.598295752357192,"label":"Row 5"},{"type":"Foundation","cx":9.631391045182012,"cy":-0.034724141127635555,"cz":0.05,"lx":18.175146995703113,"ly":15,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7nkGUQpHaM9zN22MJgfSvf","selected":false},{"type":"Human","name":"Jack","cx":-0.1594284211117477,"cy":-6.960741063855943,"cz":-1.7763568394002505e-15,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"d3bJG1MfPQqauwCeM9B8UL","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#16cda5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":true,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[23.00808622059582,-24.680171647342778,15.7199588387956],"panCenter":[15.700578278283736,2.441435258509561,0.07017002569005788],"orthographic":false,"enableRotate":true,"cameraZoom":27.207482839996143,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"solarRadiationHeatMapMaxValue":4.5,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-1,"y":2,"width":200,"height":60}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Tilt or not tilt?"]}')},488:function(e){e.exports=JSON.parse('{"docid":"pbUQyfMqdFM4hGmWGdjXR3","time":"05/21/2023 08:16 pm","timestamp":1684714615826,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":1,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"6/22/2022, 12:00:00\u202fPM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Approximate","daysPerYear":4},"elements":[{"type":"Cuboid","cx":-0.09073244329620422,"cy":-0.08928113742371785,"cz":3,"lx":59.802153799265035,"ly":54.767587001262534,"lz":6,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"parentId":"Ground","selected":false,"id":"pLxvVJ1wH71Yw1QXZXh7Cg"},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"vertices":[{"x":-0.25918798931603854,"y":-0.3104025744206716},{"x":-0.1504962518609256,"y":0},{"x":-0.35951882388998896,"y":0.16433077469329674},{"x":-0.09002353591652279,"y":0.166501344234237},{"x":0,"y":0.4564743741480465},{"x":0.09196993169278787,"y":0.16433077469329674},{"x":0.37624062965231403,"y":0.16433077469329674},{"x":0.15885715474208814,"y":0},{"x":0.25918798931603854,"y":-0.31953206190363254},{"x":0,"y":-0.11868333727849208}],"parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","selected":false,"filled":true,"selectedIndex":6,"id":"rUADzqR9VSPATNniVsn3qE","opacity":0.5},{"type":"Human","name":"Jack","cx":-21.334148117714555,"cy":-20.123968320321495,"cz":3.0000000000000004,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,-0.7853981633974483],"parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"5uAL6fK1eTHonYN5seNqZq","selected":false},{"type":"Human","name":"Jacqueline","cx":23.344921829148568,"cy":-18.543851714098956,"cz":2.9999999999999964,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,-0.7853981633974483],"parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"2Xajuxftni9JrMcjA5JcTZ","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.24400225350210067,"cy":-0.2973806270625913,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"dwDAEsrLknWSJ6wmG84FDe","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.2340673494452827,"cy":-0.2824067173672925,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"rJPYR1ViscGwEao14Ahz8L","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.22413244538846475,"cy":-0.2674328076719938,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"2bryRDHBS2YZ4nXPVH27oM","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.21419754133164678,"cy":-0.25245889797669496,"cz":0.5,"lx":2.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"oKVf1WANEaHoC28aczNAmB","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.2042626372748288,"cy":-0.23748498828139625,"cz":0.5,"lx":2.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"tBCicEZU2wG49eu4i6Kwm3","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.19432773321801083,"cy":-0.22251107858609742,"cz":0.5,"lx":3.5999999999999996,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"evdaFcgrk6M4JJMyu3ZzMq","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.18439282916119284,"cy":-0.2075371688907986,"cz":0.5,"lx":3.5999999999999996,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"1sWb4XgrTSe79TQULsTE5S","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.17445792510437497,"cy":-0.1925632591954998,"cz":0.5,"lx":4.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"mZffYSWU7S8PgHaRpYZeEL","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.16452302104755695,"cy":-0.17758934950020103,"cz":0.5,"lx":4.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"n5a72Z8AZCjsHvJEWEfhFF","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.15458811699073896,"cy":-0.1626154398049022,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"mEyfc6dJNr8NgLtwNYnoHX","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.14465321293392097,"cy":-0.14764153010960349,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"wj2fWqRxszA5Gvokpup7wQ","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.13471830887710307,"cy":-0.13266762041430463,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"bgNCkPikGZjCttLzS6w1Ei","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.12478340482028506,"cy":-0.11769371071900586,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"pzZaWBzWNUPmQr5UmuU4EJ","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.1148485007634671,"cy":-0.1027198010237071,"cz":0.5,"lx":8.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"nvJ2MYXHoiz17urRs5MsVm","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.3462544047278434,"cy":0.14995832880911858,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"dsTi2gBy3qMzkxSzEKBUKt","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.10491359670664915,"cy":-0.08774589132840831,"cz":0.5,"lx":9.6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"1zkzwAySbr3kh67TymqSoa","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.29600197017289004,"cy":0.12090847752330136,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"nNXDQxgbGxZh1trPJqCUdP","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.09497869264983118,"cy":-0.07277198163310952,"cz":0.5,"lx":9.6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"fjd8Qa2TAYrApMxCXDFDpf","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.2457495356179366,"cy":0.0918586262374842,"cz":0.5,"lx":10.799999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"b9qhzTZxDNwEDcF7hiJX4C","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.151763002830166,"cy":0.015054374730769834,"cz":0.5,"lx":21.599999999999998,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"2UFe7VNPDEaGQZvkWVQhfF","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.1330229162480746,"cy":0.020413676435490843,"cz":0.5,"lx":20.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"6azY5mJr9WGW9T4xntRtbV","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.09816732549621686,"cy":0.008176039664707214,"cz":0.5,"lx":24,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"7pB4XFf5JNuyyXs1dscyU9","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.04968850627849703,"cy":-0.01893715486872221,"cz":0.5,"lx":27.599999999999998,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"cw2cYF33vM7nDrUtAQ9PtX","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.0012096870607772334,"cy":-0.0460503494021516,"cz":0.5,"lx":32.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"aZJH3WRjsEN8q1US8B1Lga","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.041725175322164326,"cy":-0.06710995316331908,"cz":0.5,"lx":34.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"viJ9kyaeaMt713J28EcCFK","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.046229595226249795,"cy":-0.046206356470879194,"cz":0.5,"lx":31.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"tyYYXFH1cfiQ3uNpmQwaDs","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.050734015130335264,"cy":-0.02530275977843931,"cz":0.5,"lx":27.599999999999998,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"vP1hAunDAXzhYB1S1HLKVM","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.05523843503442073,"cy":-0.004399163085999424,"cz":0.5,"lx":25.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"u6QjEgQS4SovsxfWiwK9pS","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.05234611465739277,"cy":0.024581126850095093,"cz":0.5,"lx":22.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"46FxqZ3kp4K5aLnSHofoke","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04805120265582289,"cy":0.05509294308926524,"cz":0.5,"lx":21.599999999999998,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"4KWK7RGJeM7J1Y4Bc2BCbo","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04375629065425305,"cy":0.08560475932843534,"cz":0.5,"lx":19.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"9NexZBuAyQshnZjEyJiXpM","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.039461378652683204,"cy":0.11611657556760548,"cz":0.5,"lx":18,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"aQJdFu6WBGKc9yho8AS2xT","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04924988203531412,"cy":0.13125034396973115,"cz":0.5,"lx":18,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"3ogeckCTPTgxjp41JDKuuA","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.05914913042917638,"cy":0.1462631870114971,"cz":0.5,"lx":18,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"m5ZqKSj8PiDLKTSkryPkD4","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.06904837882303859,"cy":0.1612760300532631,"cz":0.5,"lx":19.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"gUD4622TjboopEheHWCtM8","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.14637364805016384,"cy":0.10266464590659576,"cz":0.5,"lx":8.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"3B4tjopc3V8wB73wfk3LgA","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.020601276304081376,"cy":0.23999877236143063,"cz":0.5,"lx":10.799999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"j6oGKhKWfa4g28v4pveBRC","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.16516009271515278,"cy":0.10797332801394043,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"6uMytuxgTByw7WEXjAsAXU","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.017562115186903173,"cy":0.2691394015238318,"cz":0.5,"lx":8.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"2FJtQtosDkuXdtp7KmRoYy","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.18394653738014172,"cy":0.11328201012128505,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"3pFwSbqooyxHrq2Jp4XADp","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.014522954069724847,"cy":0.298280030686233,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"5qdmnpcKFqUM9vXyTX4hi7","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.20273298204513066,"cy":0.11859069222862975,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"tJg3jzMUi1ApjHbbN193Zz","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.011483792952546625,"cy":0.3274206598486342,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"xxk4Md1mJ7NHchtu4BLpwH","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.2215194267101196,"cy":0.12389937433597444,"cz":0.5,"lx":4.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"7NmhiBzuipraDWa3kyetyj","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.008444631835368357,"cy":0.35656128901103534,"cz":0.5,"lx":3.5999999999999996,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"f8qSHhvV7wP4nEzfo6VoDk","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.24030587137510853,"cy":0.12920805644331906,"cz":0.5,"lx":4.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"posdSQ1dJvWZjSpgrNhZeK","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.005405470718190015,"cy":0.3857019181734367,"cz":0.5,"lx":2.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"9riXPgRDkjJzGVegGVgCgw","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.25909231604009747,"cy":0.13451673855066373,"cz":0.5,"lx":3.5999999999999996,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"cHZAxZtQFw1z3WZs51Lb8y","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.0023663096010117777,"cy":0.41484254733583786,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"oe7DbmdHbpatHjToisk5xv","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.2778787607050864,"cy":0.1398254206580084,"cz":0.5,"lx":2.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"wWLocRGwnWkKFGd13Lw2xH","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.0006728515161664303,"cy":0.443983176498239,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"pLYCjrgQcBLecG9n2GBB5R","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.2966652053700753,"cy":0.14513410276535307,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"5cGW4T9ojh23VUkpq6dRc7","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3154516500350642,"cy":0.15044278487269772,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"uZGNbTxhF7wMM1ExYuxSCK","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3342380947000532,"cy":0.15575146698004247,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"hpaMNd5tiDGWpzg7eQxhTm","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false}],"sceneRadius":37,"view":{"yearlyPvYieldPanelX":-1278,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":47,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[43.034934411209356,-77.43728686826599,60.87535152181681],"panCenter":[7.125444398078178,-5.749142987156418,0.5356497726578432],"orthographic":false,"enableRotate":true,"cameraZoom":13.268408625781248,"showInstructionPanel":false,"cameraPosition2D":[5.843642120827252,1.7570601735865479,150],"panCenter2D":[5.843642120827252,1.75721018025187,0.0000026494911975471404],"showEvolutionPanel":false,"solarRadiationHeatMapMaxValue":3.5,"evolutionPanelX":-3,"evolutionPanelY":5,"showEconomicsPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":520,"height":318},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-1,"y":4,"width":378,"height":114},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"solarPanelShininess":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":2,"solarPanelArrayLayoutParams":{"pvModelName":"FS-275","rowAxis":"East-West","orientation":"Landscape","tiltAngle":0.5235987755982988,"rowsPerRack":1,"interRowSpacing":1,"poleHeight":0.3,"poleSpacing":3,"margin":0.2},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Draw a polygon for the solar panel field and\\nthen use the built-in parametric design tool to \\nautomatically layout the array."]}')},489:function(e){e.exports=JSON.parse('{"docid":"6VEXdSdGFhXnQZHfdXvgS7","time":"02/02/2023 05:25 pm","timestamp":1675376741403,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"timesPerHour":20,"address":"Natick, MA","name":"default","longitude":-71.3488548,"latitude":42.2844063,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"date":"9/22/2022 12:00:00 PM","orthographic":false,"cameraZoom":43.16939043526371,"solarRadiationHeatmapGridCellSize":0.5,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"lz":0.1,"rotation":[0,0,0],"normal":[0,0,1],"cy":0.01492842170085762,"id":"iGgGyZAWhJDDrqTBSuKY6v","ly":8.502064537189229,"type":"Foundation","cx":-18.41116088158014,"selected":false,"cz":0.05,"lx":17.842360789303687,"parentId":"Ground"},{"tiltAngle":0.17453292519943295,"normal":[0,0,1],"rotation":[0,0,0],"lz":0.046,"poleSpacing":3,"selected":false,"cy":-0.18343704156525936,"drawSunBeam":false,"poleHeight":3,"lx":15.58,"relativeAzimuth":0,"trackerType":"None","cx":0.0181751573598281,"showLabel":true,"id":"u4LjNU3fd3PVZ6QAX6aug1","ly":3.138,"poleRadius":0.05,"label":"A1","orientation":"Landscape","cz":0.5000000074506161,"type":"Solar Panel","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":35.54542639501863,"labelSize":1,"labelHeight":1},{"type":"Human","name":"Jack","cx":5.0617851423711855,"cy":-3.5130800185994246,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","id":"vDEckHeU6T8epe3YRNBYqh","selected":false,"ly":0.6},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.018913624924680107,"cy":0.17920253753513882,"cz":0.5000000074505806,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":-0.17453292519943295,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"bqrD5jMPaBdy2VU82Pf8jX","selected":false,"dailyYield":27.191418577368122,"drawSunBeam":true,"label":"A2","labelHeight":1,"labelSize":1},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.017803254641984647,"cy":-0.17133196101794607,"cz":0.5000000074506161,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sp1YZua8fLpGUcQPoeBUrY","foundationId":"sp1YZua8fLpGUcQPoeBUrY","id":"jY1SyCfNFUJ6aZrVBG9yei","selected":false,"dailyYield":31.69613876356361,"label":"B1","labelHeight":1,"labelSize":1},{"type":"Human","name":"Jade","cx":-2.04763165702893,"cy":0.5372372205223073,"cz":0.05000000074505717,"lx":0.6,"ly":0.6,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"sp1YZua8fLpGUcQPoeBUrY","id":"bh4ogCSa9KLpabxMXJSMdr","selected":false},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0178798068026682,"cy":0.19617148450633917,"cz":0.5000000074505806,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sp1YZua8fLpGUcQPoeBUrY","foundationId":"sp1YZua8fLpGUcQPoeBUrY","id":"aB8nn17qEG1UkLCBmN3EDg","selected":false,"dailyYield":31.695989795928103,"label":"B2","labelHeight":1,"labelSize":1},{"type":"Foundation","cx":-0.02993684696192045,"cy":-0.07488211918489984,"cz":0.05,"lx":17.842360789303687,"ly":8.502064537189229,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"sp1YZua8fLpGUcQPoeBUrY","selected":false},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.017795422816082346,"cy":-0.17724133449748175,"cz":0.5000000074506161,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":-0.17453292519943295,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t8NKy5QyCsnVgJWSgzdVtp","foundationId":"t8NKy5QyCsnVgJWSgzdVtp","id":"w9uCiRPECzBHx6GziL9u7M","selected":false,"dailyYield":27.191412082396756,"label":"C1","labelHeight":1,"labelSize":1},{"type":"Human","name":"Jett","cx":1.2692636297118085,"cy":0.227513847491835,"cz":0.05000000074505717,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t8NKy5QyCsnVgJWSgzdVtp","id":"icbuTBYKh2PiqbDEDzA6iB","selected":false},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0178798068026682,"cy":0.18617148450633916,"cz":0.5000000074505806,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":0.17453292519943295,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t8NKy5QyCsnVgJWSgzdVtp","foundationId":"t8NKy5QyCsnVgJWSgzdVtp","id":"dFE6Wu3wf499uPuTFXoFR4","selected":false,"dailyYield":35.54528007836568,"label":"C2","labelHeight":1,"labelSize":1},{"type":"Foundation","cx":18.291413493732467,"cy":-0.04494527222298039,"cz":0.05,"lx":17.842360789303687,"ly":8.502064537189229,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"t8NKy5QyCsnVgJWSgzdVtp","selected":false}],"view":{"weatherPanelX":0,"heliodonPanelY":453,"showStickyNotePanel":true,"dailyPvYieldPanelX":4,"weatherPanelY":0,"dailyLightSensorPanelY":525,"mapZoom":16,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":-1244,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":true,"mapWeatherStations":false,"dailyPvYieldPanelY":1,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":-1277,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[21.984836349008607,-27.120112904171,15.351212623628198],"panCenter":[9.268096375789943,3.7277158588340003,2.046834497769918],"orthographic":false,"enableRotate":true,"cameraZoom":84.09478170866971,"stickyNotePanelX":5,"stickyNotePanelY":2,"cameraPosition2D":[15.041522569185233,0.23774787312868362,40.00000029048154],"panCenter2D":[15.041522569185233,0.23778787490665898,2.905048059856975e-7],"showSolarRadiationHeatmap":false,"showDesignInfoPanel":true,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":1,"y":3,"width":229,"height":64}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar canopy design"]}')},490:function(e){e.exports=JSON.parse('{"docid":"cpQtXDN91AWfQ7C3APvJh3","time":"02/03/2023 10:25 am","timestamp":1675437921671,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"airAttenuationCoefficient":0.01,"cspTimesPerHour":4,"timesPerHour":2,"solarPanelVisibilityGridCellSize":0.2,"latitude":44.454924,"noAnimationForSensorDataCollection":false,"noAnimationForSolarUpdraftTowerSimulation":false,"discretization":"Approximate","date":"6/22/2022 3:30:00 PM","highestTemperatureTimeInMinutes":900,"cspDaysPerYear":4,"address":"550 Dorset St, South Burlington, VT 05403, USA","diurnalTemperatureModel":1,"airConvectiveCoefficient":5,"cspGridCellSize":0.5,"noAnimationForSolarPanelSimulation":true,"sutGridCellSize":1,"name":"default","dustLoss":0.05,"sutDaysPerYear":4,"pvGridCellSize":0.5,"noAnimationForHeatmapSimulation":true,"sutTimesPerHour":4,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"daysPerYear":4,"solarRadiationHeatmapGridCellSize":5,"longitude":-73.177891},"elements":[{"type":"Foundation","cx":179.45847099490584,"cy":145.85951451290708,"cz":0.1,"lx":46.64912192730487,"ly":16.598079304638254,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0.1434660645139339],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"73zFNy4Kytq2jGeHP8hybB","locked":true,"enableGroupMaster":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.08726646259971647,"orientation":"Landscape","drawSunBeam":true,"poleHeight":4.8,"poleRadius":0.05,"poleSpacing":5,"cx":0.013487121407959702,"cy":-0.12279534594195182,"cz":0.5000000074505806,"lx":43.624,"ly":11.506,"lz":0.046,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0.1434660645139339],"color":"#fff","parentId":"73zFNy4Kytq2jGeHP8hybB","foundationId":"73zFNy4Kytq2jGeHP8hybB","id":"5B4Rr9X9rqJjgERVH84xem","selected":false,"locked":false},{"type":"Human","name":"Jack","cx":8.339907658116347,"cy":-0.6016935110092154,"cz":0.619724807975928,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dUwnUoWvbFx2hdh7SmwvjQ","id":"e5UykxeUAcAAsmgFcznP9J","selected":false,"locked":false,"ly":0.42},{"type":"Human","name":"Jacqueline","cx":20.54897495598685,"cy":-8.016956409003306,"cz":0.10000000149011612,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"73zFNy4Kytq2jGeHP8hybB","id":"9v3zq1A3MmHnKeqiCTkYcc","selected":false,"locked":false,"ly":0.6},{"type":"Cuboid","cx":178.74973834889272,"cy":151.23959562318993,"cz":3,"lx":12.107420150412665,"ly":3.6361191766113197,"lz":6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","selected":false,"id":"stfeWojM9fq1rRFvV8kFrw","locked":true},{"type":"Cuboid","cx":179.70526882974113,"cy":148.87674866966486,"cz":1.8,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":3.6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"mvQonCDuxqjgZkeWBbRQ73","selected":false,"locked":true},{"type":"Cuboid","cx":179.86870093281857,"cy":147.67018638185647,"cz":1.5,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":3,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"nAoWaWCXnJrVeXtGcCdhsQ","selected":false,"locked":true},{"type":"Cuboid","cx":180.03030758101804,"cy":146.47434150650943,"cz":1.3,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":2.6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"hEEbCeJXouC5MRLwbMLUXU","selected":false,"locked":true},{"type":"Cuboid","cx":180.18731589126733,"cy":145.26767530633435,"cz":1.1,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":2.2,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"ewYiSC3NgUrSGS9bNScvyi","selected":false,"locked":true},{"type":"Cuboid","cx":180.34892253946674,"cy":144.0718304309881,"cz":0.9,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":1.8,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"dUwnUoWvbFx2hdh7SmwvjQ","selected":false,"locked":true},{"type":"Cuboid","cx":180.505930849716,"cy":142.93138721769165,"cz":0.7,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":1.4,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"2wek6yYK17CpmBuG1P6f8D","selected":false,"locked":true},{"type":"Cuboid","cx":180.6629391599653,"cy":141.79094400439524,"cz":0.5,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"cyVdcaHRiaSZbNdcjQVuiw","selected":false,"locked":false},{"type":"Cuboid","cx":180.8270823782518,"cy":140.57464564227953,"cz":0.3,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":0.6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"2io4wkR5VXLTD2R8fop411","selected":false,"locked":false}],"view":{"showYearlyFresnelReflectorYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"showZenithAngle":true,"yearlyPvYieldPanelRect":{"x":0,"height":400,"y":0,"width":600},"showAzimuthAngle":true,"dailyPvYieldPanelRect":{"height":400,"y":0,"x":0,"width":600},"dailyUpdraftTowerYieldPanelRect":{"width":640,"x":0,"y":0,"height":550},"diurnalTemperaturePanelRect":{"width":600,"height":400,"y":0,"x":0},"showHeliodonPanel":false,"weatherPanelX":0,"theme":"Default","enableRotate":true,"dailyFresnelReflectorYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"dailyHeliostatYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"dailyHeliostatYieldPanelY":0,"yearlyHeliostatYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"yearlyLightSensorPanelRect":{"x":0,"width":600,"y":0,"height":500},"yearlyParabolicTroughYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"dailyParabolicDishYieldPanelX":0,"ambientLightIntensity":0.1,"dailyParabolicTroughYieldPanelRect":{"width":600,"y":0,"x":0,"height":400},"yearlyLightSensorPanelShowClearness":false,"mapPanelX":0,"yearlyLightSensorPanelShowDaylight":false,"showDiurnalTemperaturePanel":false,"mapZoom":17,"yearlyPvYieldPanelX":0,"showElevationAngle":true,"showYearlyParabolicDishYieldPanel":false,"dailyLightSensorPanelRect":{"y":0,"height":360,"x":0,"width":600},"evolutionPanelRect":{"y":0,"height":400,"x":0,"width":640},"mapWeatherStations":false,"showDesignInfoPanel":true,"mapPanelY":0,"showDailyParabolicTroughYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"weatherPanelY":0,"showSiteInfoPanel":true,"showYearlyParabolicTroughYieldPanel":false,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"showMapPanel":false,"dailyParabolicTroughYieldPanelY":0,"cameraPosition":[206.67769816695932,120.15082999798835,5.121281605668084],"showYearlyLightSensorPanel":false,"cameraZoom":23.327015599941678,"heliodonPanelY":0,"autoRotate":false,"shadowEnabled":true,"showWeatherPanel":false,"yearlyFresnelReflectorYieldPanelX":0,"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"dailyFresnelReflectorYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyHeliostatYieldPanelY":0,"mapTilt":0,"visibilityResultsPanelRect":{"height":470,"y":0,"width":600,"x":0},"stickyNotePanelRect":{"y":0,"x":0,"height":61,"width":267},"visibilityResultsPanelX":0,"showYearlyUpdraftTowerYieldPanel":false,"showDailyLightSensorPanel":false,"yearlyPvYieldPanelY":0,"dailyLightSensorPanelX":0,"yearlyParabolicTroughYieldPanelX":0,"weatherPanelRect":{"y":0,"height":500,"width":500,"x":0},"panCenter2D":[183.8188163621815,139.3629304846877,-0.00008002863814434504],"dailyParabolicTroughYieldPanelX":0,"showDailyUpdraftTowerYieldPanel":false,"cameraPosition2D":[183.8188163621815,139.36291048379871,19.999919971295522],"showYearlyHeliostatYieldPanel":false,"showEconomicsPanel":false,"heliodonPanelX":0,"yearlyParabolicDishYieldPanelY":0,"showDailyParabolicDishYieldPanel":false,"dailyPvYieldPanelX":0,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelRect":{"x":0,"width":600,"y":0,"height":400},"orthographic":false,"panCenter":[175.21189117230256,159.9366389436321,1.5458921274125108],"dailyPvYieldPanelY":0,"showDailyFresnelReflectorYieldPanel":false,"mapType":"hybrid","groundImage":false,"groundColor":"#16a5a5","showDailyHeliostatYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyFresnelReflectorYieldPanelRect":{"x":0,"width":600,"height":400,"y":0},"showStickyNotePanel":true,"heliodon":false,"dailyLightSensorPanelY":0,"solarRadiationHeatMapReflectionOnly":false,"showEvolutionPanel":false,"showInstructionPanel":false,"showSunAngles":false,"showYearlyPvYieldPanel":false,"dailyHeliostatYieldPanelRect":{"height":400,"x":0,"y":0,"width":600},"yearlyLightSensorPanelX":0,"yearlyFresnelReflectorYieldPanelY":0,"yearlyHeliostatYieldPanelX":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyFresnelReflectorYieldPanelX":0,"axes":false,"visibilityResultsPanelY":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"orientation":"Landscape","interRowSpacing":2,"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","poleSpacing":3,"rowsPerRack":1,"tiltAngle":0,"poleHeight":1},"solarPanelArrayLayoutConstraints":{"maximumTiltAngle":1.5707963267948966,"rowAxis":"Zonal","maximumInterRowSpacing":10,"maximumRowsPerRack":6,"minimumInterRowSpacing":2,"pvModelName":"CS6X-355P-FG","minimumTiltAngle":-1.5707963267948966,"orientation":"Landscape","minimumRowsPerRack":1,"poleSpacing":5,"poleHeight":1},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"objectiveFunctionType":1,"socialCoefficient":0.1,"localSearchRadius":0.1,"vmax":0.01,"swarmSize":20,"problem":"Solar Panel Tilt Angle","maximumSteps":5,"inertia":0.8,"cognitiveCoefficient":0.1,"searchMethod":1,"convergenceThreshold":0.01},"geneticAlgorithmParams":{"maximumGenerations":5,"mutationRate":0.1,"objectiveFunctionType":1,"selectionRate":0.5,"crossoverRate":0.5,"localSearchRadius":0.1,"searchMethod":1,"problem":"Solar Panel Tilt Angle","selectionMethod":1,"populationSize":20,"convergenceThreshold":0.01}},"economicsParams":{"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15,"projectLifeSpan":25},"notes":["Solar canopy over bleachers"]}')},491:function(e){e.exports=JSON.parse('{"docid":"smhvUEBkVkGKNFKH9wXerr","time":"03/19/2023 01:40 pm","timestamp":1679247607363,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022 2:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":3.258836461194841,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.0628073590395834,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":1.7678944590969095,"type":"Foundation","solarPowerTower":{},"lx":10.54713578879197,"lz":0.05733001510678199,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"textureType":"Foundation Texture #2"},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":6.322909236616773,"relativeAngle":3.141592653589793,"lz":2.707750558185909,"roofId":"o9MiaiNtVRQTUvRdiEBPKe","ly":0.1,"rightPoint":[-3.281902734041268,1.0926779224456118,0],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[3.041006502575506,1.0926779224456111,0],"type":"Wall","rightRoofHeight":2.707750558185909,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":2.707750558185909,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.12044811573288094,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":1.0926779224456116,"color":"#ffffff","opacity":0.25,"wallStructure":"Stud","studSpacing":20,"studColor":"#ffffff","studWidth":0.2,"structureSpacing":2.1,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.707750558185909,"rightTopPartialHeight":2.707750558185909},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":3.041006502575505,"leftPoint":[3.041006502575504,-0.9667719612095651,0],"cy":0.06295298061802335,"leftRoofHeight":2.2932006042712794,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[3.041006502575506,1.0926779224456118,0],"ly":0.1,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":2.059449883655177,"normal":[0,0,1],"lz":2.2932006042712794,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948957,"textureType":"Wall Texture Default","rightRoofHeight":2.707750558185909,"roofId":"o9MiaiNtVRQTUvRdiEBPKe","color":"#ffffff","opacity":0.25,"wallStructure":"Stud","studSpacing":100,"studColor":"#ffffff","centerRoofHeight":[0.5,2.707750558185909],"studWidth":0.2,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.2932006042712794,"rightTopPartialHeight":2.2932006042712794},{"lx":2.059449883655177,"windows":[],"lz":2.2932006042712794,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"o9MiaiNtVRQTUvRdiEBPKe","selected":false,"cy":0.06295298061802335,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-3.281902734041268,-0.9667719612095651,0],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":2.2932006042712794,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":-1.5707963267948966,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-3.281902734041268,1.0926779224456118,0],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":2.707750558185909,"ly":0.1,"cx":-3.281902734041268,"color":"#ffffff","opacity":0.25,"wallStructure":"Stud","studSpacing":100,"studColor":"#ffffff","centerRoofHeight":[-0.5,2.707750558185909],"studWidth":0.2,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.2932006042712794,"rightTopPartialHeight":2.2932006042712794},{"showLabel":false,"cx":-0.12044811573288094,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[3.041006502575506,-0.9667719612095651,0],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-0.9667719612095651,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"o9MiaiNtVRQTUvRdiEBPKe","leftPoint":[-3.281902734041268,-0.9667719612095651,0],"normal":[0,0,1],"ly":0.1,"lz":2.2932006042712794,"leftRoofHeight":2.2932006042712794,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":2.2932006042712794,"lx":6.322909236616773,"color":"#ffffff","wallStructure":"Stud","opacity":0,"studSpacing":100,"studColor":"#ffffff","studWidth":0.2,"structureSpacing":2.1,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.2932006042712794,"rightTopPartialHeight":2.2932006042712794},{"type":"Human","name":"Judd","cx":1.633148784510131,"cy":-0.48619735894130045,"cz":0.02866500802338123,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.544},{"type":"Human","name":"Jade","cx":-2.4056687191409836,"cy":-0.7214806671440712,"cz":0.02866500802338123,"lx":0.48,"ly":0.48,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false,"flip":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Gable","roofStructure":"Rafter","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"o9MiaiNtVRQTUvRdiEBPKe","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"rise":0,"ceiling":false},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":true,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.013581557939684385,"cy":0.026013281736561093,"cz":2.5548677739939563,"lx":6.232,"ly":2.092,"lz":0.046,"showLabel":false,"normal":[0,-0.19733348260296196,0.9803364201353465],"rotation":[0.1986371700239986,0,0],"color":"#fff","parentType":"Roof","parentId":"o9MiaiNtVRQTUvRdiEBPKe","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"gcgsZpEBMDbC2MoxXfdQ5z","selected":false},{"type":"Tree","name":"Dogwood","cx":-6.069538614907841,"cy":1.7342109688811949,"cz":0,"lx":2.576376919790349,"lz":3.4569079447673756,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9vtidDnwwZ7MMSCF9kkf1v","selected":false},{"type":"Tree","name":"Magnolia","cx":6.029325159381688,"cy":1.1288413497919034,"cz":0,"lx":5.866636356742361,"lz":7.0242541599963335,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"7y5foXVbpe2pYJ2ZMcNgG1","selected":false},{"type":"Polygon","cx":-0.054330031344316826,"cy":-0.27967892470948996,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.29711331243712213,"y":-0.37645814056822685},{"x":-0.25433003134431686,"y":-0.17645814056822684},{"x":0.14566996865568319,"y":-0.17645814056822684},{"x":0.18845324974848848,"y":-0.37645814056822685}],"parentId":"skm8dNPSkFaVkoUwiPNfq1","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":3,"id":"jFtAKqea5hrJYqvHqsXVig","fontColor":"white","text":"ELM STREET","fontSize":0.2,"noOutline":true,"opacity":0},{"type":"Polygon","cx":-0.03159943058059205,"cy":-5.551115123125783e-16,"cz":0.3151039010139313,"lx":0.4,"ly":0.4,"lz":0.4,"filled":true,"noOutline":true,"color":"#ffffff","opacity":0,"text":"ELM STREET","fontSize":0.2,"fontColor":"white","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.19999999999999996,"y":-0.4200653155418168},{"x":-0.15721671890719469,"y":-0.2200653155418168},{"x":0.24278328109280536,"y":-0.2200653155418168},{"x":0.28556656218561066,"y":-0.4200653155418168}],"parentId":"8XDG3EHsQoX26MhuzwMYUM","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"jgt48M3TDZL99Yra6Kyr5Q","selected":false},{"type":"Human","name":"Julio","cx":0.5178196751817774,"cy":-0.5447731101746882,"cz":0.02866500802338123,"lx":0.5,"lz":1.76,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"q3FndYLdQ24MSDvkeE4ifM","selected":false},{"type":"Human","name":"June","cx":-1.7835969899126987,"cy":-1.0262736798633494,"cz":0.0073300155767722225,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"hpYMNr3jwLZFDdiKVSnVAY","selected":false}],"sceneRadius":11,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,19.999999999989587],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-7.4101525299496,-7.1680457550968235,2.8167371698815544],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.847108697996333,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-0.2469393365439706,2.7582746226325283,1.9240094094942006],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":207,"height":64}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Solar bus stop"]}')},492:function(e){e.exports=JSON.parse('{"docid":"ctNBPhic6sxKfpMZwUSyvY","time":"02/04/2023 01:23 pm","timestamp":1675535030470,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"noAnimationForSolarPanelSimulation":false,"latitude":42.2844063,"cspTimesPerHour":4,"timesPerHour":4,"noAnimationForSensorDataCollection":false,"noAnimationForSolarUpdraftTowerSimulation":false,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"sutGridCellSize":1,"longitude":-71.3488548,"airConvectiveCoefficient":5,"name":"default","highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"diurnalTemperatureModel":1,"discretization":"Approximate","address":"Natick, MA","noAnimationForHeatmapSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspDaysPerYear":4,"pvGridCellSize":0.5,"airAttenuationCoefficient":0.01,"sutDaysPerYear":4,"date":"4/22/2022, 9:00:00 AM","cspGridCellSize":0.5,"dustLoss":0.05,"daysPerYear":12},"elements":[{"type":"Foundation","cx":-0.05000000000000249,"cy":-0.07499999999999751,"cz":0.05,"lx":50,"ly":25,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9VUxbWr6Hk1HaeGiLpEeqj","locked":true},{"type":"Wall","cx":0.25,"cy":10.000000000000002,"cz":0,"lx":43.5,"ly":0.3,"lz":30,"relativeAngle":3.141592653589793,"leftPoint":[22,10,0],"rightPoint":[-21.5,10.000000000000004,0],"leftJoints":["vdPkX7ZYSwK7VW7fzaG511"],"rightJoints":["1pJb5b6kS2mjvFyYw2rr5k"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"nYSb3p1MnuhwNe2u1j3fXF","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":22,"cy":2,"cz":0,"lx":16,"ly":0.3,"lz":30,"relativeAngle":1.5707963267948966,"leftPoint":[22,-6,0],"rightPoint":[22,10,0],"leftJoints":["8ntQ5ns6192qHa3sbwWgfy"],"rightJoints":["nYSb3p1MnuhwNe2u1j3fXF"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"vdPkX7ZYSwK7VW7fzaG511","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-21.5,"cy":2.0000000000000018,"cz":0,"lx":16.000000000000004,"ly":0.3,"lz":30,"relativeAngle":4.71238898038469,"leftPoint":[-21.5,10.000000000000004,0],"rightPoint":[-21.5,-6,0],"leftJoints":["nYSb3p1MnuhwNe2u1j3fXF"],"rightJoints":["nQCZuQBzmXXaGGKFTeJE3m"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1pJb5b6kS2mjvFyYw2rr5k","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-13.25,"cy":-6,"cz":0,"lx":16.5,"ly":0.3,"lz":30,"relativeAngle":0,"leftPoint":[-21.5,-6,0],"rightPoint":[-5,-6,0],"leftJoints":["1pJb5b6kS2mjvFyYw2rr5k"],"rightJoints":["5ZR3fL2v4p4po3VR8oJ6H8"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"nQCZuQBzmXXaGGKFTeJE3m","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":13.5,"cy":-6,"cz":0,"lx":17,"ly":0.3,"lz":30,"relativeAngle":0,"leftPoint":[5,-6,0],"rightPoint":[22,-6,0],"leftJoints":["12rbxrGaa8wVVn4DUNhY7V"],"rightJoints":["vdPkX7ZYSwK7VW7fzaG511"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"8ntQ5ns6192qHa3sbwWgfy","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":5,"cy":-8.5,"cz":0,"lx":5,"ly":0.3,"lz":30,"relativeAngle":1.5707963267948966,"leftPoint":[5,-11,0],"rightPoint":[5,-6,0],"leftJoints":["4gHpGdkzTfd6pDbTqPc7xa"],"rightJoints":["8ntQ5ns6192qHa3sbwWgfy"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"12rbxrGaa8wVVn4DUNhY7V","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-5,"cy":-8.5,"cz":0,"lx":5,"ly":0.3,"lz":30,"relativeAngle":4.71238898038469,"leftPoint":[-5,-6,0],"rightPoint":[-5,-11,0],"leftJoints":["nQCZuQBzmXXaGGKFTeJE3m"],"rightJoints":["4gHpGdkzTfd6pDbTqPc7xa"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"5ZR3fL2v4p4po3VR8oJ6H8","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":0,"cy":-11,"cz":0,"lx":10,"ly":0.3,"lz":30,"relativeAngle":0,"leftPoint":[-5,-11,0],"rightPoint":[5,-11,0],"leftJoints":["5ZR3fL2v4p4po3VR8oJ6H8"],"rightJoints":["12rbxrGaa8wVVn4DUNhY7V"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"4gHpGdkzTfd6pDbTqPc7xa","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Human","name":"Jack","cx":-0.8543093326653608,"cy":-11.792939085977409,"cz":0.05000000074505806,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tYfANfn3oinAT4dW1rRsqr","selected":false,"ly":0.42},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["12rbxrGaa8wVVn4DUNhY7V","8ntQ5ns6192qHa3sbwWgfy","vdPkX7ZYSwK7VW7fzaG511","nYSb3p1MnuhwNe2u1j3fXF","1pJb5b6kS2mjvFyYw2rr5k","nQCZuQBzmXXaGGKFTeJE3m","5ZR3fL2v4p4po3VR8oJ6H8","4gHpGdkzTfd6pDbTqPc7xa"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"a69gMcUNAL6smrEEJWVg5m","rise":0,"ceiling":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Portrait","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3343030303030303,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"color":"#fff","parentType":"Wall","parentId":"nQCZuQBzmXXaGGKFTeJE3m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2tX22vCbk47e7Qb9jmWbuT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.12024242424242425,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"nQCZuQBzmXXaGGKFTeJE3m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rMVZd7mHmDzSsY9qJkKCYE","selected":false,"color":"#fff"},{"type":"Window","cx":-0.10606060606060606,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#999999","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nQCZuQBzmXXaGGKFTeJE3m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"5GSyALrLv2JTFn5Jfts2K9","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3484848484848485,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"iCM8LCxtUc6mLFahJZKXiN","parentId":"nQCZuQBzmXXaGGKFTeJE3m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0016000000000000014,"cy":-2.3684757858670007e-14,"cz":0.056400000000000006,"lx":3.968,"ly":23.616,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"4gHpGdkzTfd6pDbTqPc7xa","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"qfUCcto9FYp97r1bwAkTYw","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.11858823529411765,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8ntQ5ns6192qHa3sbwWgfy","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"15b42ktZHToFGP5MjajP8M","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.352,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"trackerType":"None","tiltAngle":-0.01802584949990571,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8ntQ5ns6192qHa3sbwWgfy","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"3PJY1VV4LwZ339b6deeXfW","selected":false,"color":"#fff"},{"type":"Human","name":"Jane","cx":1.0059834215863663,"cy":-11.909754621259744,"cz":0.05000000074506161,"lx":0.4,"lz":1.67,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"vFaP6sE5CTWHTpkpuqQusz","selected":false,"ly":0.4},{"type":"Window","cx":0.1051693404634581,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bQX8o8NiMvqqkwFqX982ii","parentId":"8ntQ5ns6192qHa3sbwWgfy","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.36541889483065954,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5iqB79CbMKKaHc2jYwiL2n","parentId":"8ntQ5ns6192qHa3sbwWgfy","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3757575757575758,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"h4kTQPqQyQnweHnqPDZiBg","parentId":"4gHpGdkzTfd6pDbTqPc7xa","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3742424242424242,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mDkZKRTvbZchzgdEwuowBS","parentId":"4gHpGdkzTfd6pDbTqPc7xa","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.33049242424242425,"cy":0.3,"cz":0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"vY3gwN3Dc3BUuPz4qtFxKd","parentId":"vdPkX7ZYSwK7VW7fzaG511","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.32575757575757575,"cy":0.3,"cz":0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"1c7fsYtocCSJ8re71u4EMD","parentId":"vdPkX7ZYSwK7VW7fzaG511","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.33049242424242414,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bHLzi4Znc3fVju7nSQfVt1","parentId":"1pJb5b6kS2mjvFyYw2rr5k","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.32575757575757575,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mXRwTS9CG5axkFHpYXQb93","parentId":"1pJb5b6kS2mjvFyYw2rr5k","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":0.44166666666666665,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4jyHDksE16v8MGpAHgZbRq","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0035666924067298844,"cy":0.1,"cz":0.3543373547979109,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fv633U9B6zqzsfkiTeArhy","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":0.2583333333333333,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"oqAP6n2W5ZjTRthjMYEkPV","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":0.1583333333333333,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"cpcc8c1vn5nWiukQ3PxS3f","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":0.058333333333333307,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"x1oydAUUHFagHckinEa19D","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":-0.0416666666666667,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3cgMKo42a4ASQqE8xnVK2P","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":-0.1416666666666667,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"x8WkyGbyAMcWUhHRUjS5gG","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":-0.2416666666666667,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tXGRiJPBepugeH5wctYQEF","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":-0.3416666666666667,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"uHRUBQhmS94JcKPRt7LDmv","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.08726646259971647,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.05,"poleSpacing":3,"cx":0.013173838940837719,"cy":0.0680060264405102,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"color":"#fff","parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gXW6QsEtteXYtodQNf8hx7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.013587479651289406,"cy":-0.039519927704392936,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rR23iB2i6JynSXag96y23e","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.012423446703966497,"cy":-0.14139419142614063,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"jxhCthLZ9Lv87sCrBWn5kx","selected":false,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.012712080197510935,"cy":0.1770912519450651,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rZk9AYLNUc6CbsxJg1HEUU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.012483352791167981,"cy":0.28984082936278965,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"69WEvUFeggtX7SkVeLfN3F","selected":false},{"type":"Flower","name":"Yellow Flower","cx":15.765812910070952,"cy":-8.771551347375933,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"hhZNor6RrsErCXv6N2LCBX","selected":false},{"type":"Flower","name":"Yellow Flower","cx":7.825357530488457,"cy":-8.372047787963048,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1coQpeKubKsF9M826JWhcT","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-7.686841949758485,"cy":-8.502083508685182,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tBw3D4GurLA8jWoFe411qW","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-14.751204802860983,"cy":-8.343574225207504,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"72uapoUNTci2SLYKwgBp8U","selected":false},{"type":"Flower","name":"Boxwood","cx":19.359037887762355,"cy":-9.111613117711592,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"vm54XJx4Xqji3E2uYkM3Bg","selected":false},{"type":"Flower","name":"Boxwood","cx":12.019561876673311,"cy":-8.832301300458631,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"sjqbn1oAGT3nUbPzFZ9yXN","selected":false},{"type":"Flower","name":"Boxwood","cx":-11.235438884150971,"cy":-8.639820120644501,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tQx6MounMWtZzmbZeEtcYq","selected":false},{"type":"Flower","name":"Boxwood","cx":-18.29029667468214,"cy":-7.990154726249322,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1CG9RbukrrdXudKgMY2Jii","selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.425,"lx":0.5,"ly":0,"lz":0.15,"textureType":"Door Texture #6","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"4gHpGdkzTfd6pDbTqPc7xa","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"nJiiCKZsnQ4hdD69NEYwor","doorType":"Default","archHeight":1,"filled":true},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Portrait","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.0010000000000000007,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"showLabel":false,"normal":[-1,1.2246467991473532e-16,0],"rotation":[0,0,0],"color":"#fff","frameColor":"white","parentType":"Wall","parentId":"1pJb5b6kS2mjvFyYw2rr5k","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"uLAs5uL6WLuiZStL3dsozJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0010000000000000009,"cy":2.373101715136272e-14,"cz":0.0074666666666666735,"lx":3.968,"ly":27.552,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[1,0,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"vdPkX7ZYSwK7VW7fzaG511","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"oq1GewTgCJGR8EGbL6DMu7","selected":false,"color":"#fff"}],"view":{"yearlyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"diurnalTemperaturePanelX":0,"showInstructionPanel":false,"axes":true,"enableRotate":true,"weatherPanelY":0,"cameraPosition":[-41.48638943484854,-53.785037218162735,15.500675823090146],"showYearlyUpdraftTowerYieldPanel":false,"showSunAngles":false,"dailyPvYieldPanelX":0,"dailyHeliostatYieldPanelY":0,"showDailyHeliostatYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"showDailyLightSensorPanel":false,"solarRadiationHeatMapReflectionOnly":false,"autoRotate":false,"showWeatherPanel":false,"yearlyParabolicDishYieldPanelX":0,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelX":0,"yearlyPvYieldPanelX":0,"mapType":"roadmap","visibilityResultsPanelX":0,"heliodonPanelY":0,"showYearlyParabolicTroughYieldPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"dailyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"mapPanelX":0,"orthographic":false,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelY":0,"showHeliodonPanel":false,"showDailyFresnelReflectorYieldPanel":false,"heliodon":false,"showMapPanel":false,"shadowEnabled":true,"dailyFresnelReflectorYieldPanelY":0,"showYearlyFresnelReflectorYieldPanel":false,"weatherPanelX":0,"yearlyHeliostatYieldPanelX":0,"dailyLightSensorPanelY":0,"showDiurnalTemperaturePanel":false,"showDailyUpdraftTowerYieldPanel":false,"mapPanelY":0,"dailyPvYieldPanelY":0,"showStickyNotePanel":true,"yearlyUpdraftTowerYieldPanelX":0,"yearlyFresnelReflectorYieldPanelX":0,"groundColor":"#16A5A5","dailyHeliostatYieldPanelX":0,"stickyNotePanelX":0,"dailyUpdraftTowerYieldPanelY":0,"showElevationAngle":true,"yearlyFresnelReflectorYieldPanelY":0,"showYearlyHeliostatYieldPanel":false,"mapZoom":18,"panCenter":[1.9046368072380662,-2.718943908236788,15.500675823090146],"visibilityResultsPanelY":0,"showZenithAngle":true,"stickyNotePanelY":0,"showDesignInfoPanel":true,"yearlyPvYieldPanelY":0,"dailyUpdraftTowerYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"showYearlyLightSensorPanel":false,"heliodonPanelX":0,"theme":"Default","yearlyLightSensorPanelShowDaylight":false,"groundImage":false,"showAzimuthAngle":true,"ambientLightIntensity":0.1,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"showDailyParabolicDishYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"solarRadiationHeatMapMaxValue":3.5,"showYearlyPvYieldPanel":false,"yearlyLightSensorPanelShowClearness":false,"showSolarPanelVisibilityResultsPanel":false,"diurnalTemperaturePanelY":0,"yearlyHeliostatYieldPanelY":0,"cameraZoom":31.733468832186784,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"cameraPosition2D":[0,-0.00015000666739695134,150],"yearlyLightSensorPanelX":0,"showDailyParabolicTroughYieldPanel":false,"waterSurface":false,"showEconomicsPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-3,"y":-2,"width":339,"height":63},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Building-integrated photovoltaics (BIPV)"]}')},493:function(e){e.exports=JSON.parse('{"docid":"m1j5HqK6ztTDmHotnswvhm","time":"03/19/2023 01:23 pm","timestamp":1679246616189,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":2,"date":"6/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":true,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"350 Spelman Ln SW, Atlanta, GA 30314, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":33.74249063340524,"noAnimationForSensorDataCollection":false,"timesPerHour":2,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":true,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-84.41325446099088,"airConvectiveCoefficient":5,"diurnalTemperatureModel":1,"highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"sutDaysPerYear":4,"sutGridCellSize":1,"noAnimationForSolarUpdraftTowerSimulation":false},"elements":[{"type":"Foundation","cx":-4.899281040587393,"cy":-11.584454395492607,"cz":0.05,"lx":65.19262557107372,"ly":131.69230495241158,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.530395639672967],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fAfbfM7oEHfq1VBgchFech","enableGroupMaster":true},{"type":"Wall","cx":4.643026020738638,"cy":58.19197664732871,"cz":0,"lx":39.00320499651278,"ly":0.2,"lz":10,"relativeAngle":3.1544124640626934,"leftPoint":[24.14302602073864,58.441976647328715,0.1],"rightPoint":[-14.856973979261348,57.94197664732871,0.1],"leftJoints":["hZXuadfd8Y2gU3C4iTs3VG"],"rightJoints":["sdKSXeQhAWxE6ifCs1d6RC"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"tysEJM9hUShvginx4rYC7K","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":24.39302602073864,"cy":2.941976647328705,"cz":0,"lx":111.00112612041376,"ly":0.2,"lz":10,"relativeAngle":1.575300800833464,"leftPoint":[24.643026020738645,-52.55802335267129,0.1],"rightPoint":[24.143026020738642,58.4419766473287,0.1],"leftJoints":["njXmWTSZ52XC3BH77kTEtQ"],"rightJoints":["tysEJM9hUShvginx4rYC7K"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"hZXuadfd8Y2gU3C4iTs3VG","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":9.143026020738638,"cy":-52.8080233526713,"cz":0,"lx":31.004031995854984,"ly":0.2,"lz":10,"relativeAngle":0.016127633843636247,"leftPoint":[-6.356973979261358,-53.05802335267129,0.1],"rightPoint":[24.64302602073863,-52.558023352671285,0.1],"leftJoints":["1sYogQ8Va73vub552Dsk1p"],"rightJoints":["hZXuadfd8Y2gU3C4iTs3VG"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"njXmWTSZ52XC3BH77kTEtQ","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-6.356973979261353,"cy":-47.05802335267128,"cz":0,"lx":11.999999999999986,"ly":0.2,"lz":10,"relativeAngle":4.712388980384691,"leftPoint":[-6.356973979261358,-41.05802335267129,0.1],"rightPoint":[-6.356973979261351,-53.058023352671285,0.1],"leftJoints":["dfk6k28j8Rsu1Q1oCp7zKp"],"rightJoints":["njXmWTSZ52XC3BH77kTEtQ"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"1sYogQ8Va73vub552Dsk1p","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-14.606973979261362,"cy":8.441976647328703,"cz":0,"lx":99.0012626182111,"ly":0.2,"lz":10,"relativeAngle":4.717439442493762,"leftPoint":[-14.856973979261348,57.94197664732871,0.1],"rightPoint":[-14.356973979261365,-41.05802335267131,0.1],"leftJoints":["tysEJM9hUShvginx4rYC7K"],"rightJoints":["dfk6k28j8Rsu1Q1oCp7zKp"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"sdKSXeQhAWxE6ifCs1d6RC","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Cuboid","cx":34.8305400791776,"cy":-52.42058894277254,"cz":6,"lx":7.619334475628514,"ly":5.299339135336109,"lz":12,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.5484342228590808],"parentId":"Ground","selected":false,"id":"aLpgA6ukywKpo8YHkCPK9Z"},{"type":"Window","cx":-0.2701985741652489,"cy":0.1,"cz":0.325,"lx":0.44948921683564763,"ly":0.2,"lz":0.15,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"sdKSXeQhAWxE6ifCs1d6RC","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"dXdqLZ7zgTd93oqrXfjWsJ","opacity":0,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-3.58855390814681e-17,"cy":0.1,"cz":-0.4,"lx":0.9898863651661457,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"xi8z9Sz8uH7vazDgmc3RCx","parentId":"sdKSXeQhAWxE6ifCs1d6RC","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jack","cx":0.6384948916889619,"cy":-0.2839733771670918,"cz":5.999999999999999,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"aLpgA6ukywKpo8YHkCPK9Z","id":"ddYtbAhoUpyMoKhVhaAQGE","selected":false,"ly":0.42},{"type":"Window","cx":0,"cy":0.1,"cz":0,"lx":0.9898863651661457,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aziCwtJpaGh65HD2YLn8fS","parentId":"sdKSXeQhAWxE6ifCs1d6RC","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":1.5252168961263317,"cy":51.80939453669954,"cz":0,"lx":20.031488630531463,"ly":0.2,"lz":9,"leftJoints":["kuZyRXr6X1ZZLgvnEdPLQW"],"rightJoints":["nWPXmVRMzHKyjWryQf87JS"],"leftPoint":[11.540961211392062,51.809394536699536,0],"rightPoint":[-8.490527419139399,51.80939453669955,0],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qsREzsezLRHaTka6P3qi8E","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Stud","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":11.7913548192737,"cy":-3.284592727383899,"cz":0,"lx":110.1891125223151,"ly":0.2,"lz":9,"leftJoints":["dkmWHRoyM37TP1ais2mnQQ"],"rightJoints":["qsREzsezLRHaTka6P3qi8E"],"leftPoint":[12.041748427155346,-58.37857999146732,0],"rightPoint":[11.540961211392053,51.80939453669952,0],"relativeAngle":1.5753411400554025,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kuZyRXr6X1ZZLgvnEdPLQW","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Stud","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-3.2436892780431448,"cy":-58.47348142439061,"cz":0,"lx":30.571464611396937,"ly":0.2,"lz":9,"leftJoints":["ihGgAKbhoAEwWeLnpFQBfw"],"rightJoints":["kuZyRXr6X1ZZLgvnEdPLQW"],"leftPoint":[-18.52912698324161,-58.568382857313914,0],"rightPoint":[12.041748427155321,-58.37857999146732,0],"relativeAngle":0.006208537524114639,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"dkmWHRoyM37TP1ais2mnQQ","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Stud","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-18.52912698324161,"cy":-52.1159338984573,"cz":0,"lx":12.904897917713235,"ly":0.2,"lz":9,"leftJoints":["qXr3hrbfNKc7RCzq91xbXK"],"rightJoints":["dkmWHRoyM37TP1ais2mnQQ"],"leftPoint":[-18.52912698324161,-45.66348493960068,0],"rightPoint":[-18.52912698324161,-58.568382857313914,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ihGgAKbhoAEwWeLnpFQBfw","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","studSpacing":200,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-7.989740203376101,"cy":3.1678562314727046,"cz":0,"lx":97.2882323106823,"ly":0.2,"lz":9,"leftJoints":["qsREzsezLRHaTka6P3qi8E"],"rightJoints":["qXr3hrbfNKc7RCzq91xbXK"],"leftPoint":[-8.490527419139399,51.80939453669955,0],"rightPoint":[-7.488952987612803,-45.47368207375414,0],"relativeAngle":-1.5605012263432012,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"nWPXmVRMzHKyjWryQf87JS","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Default","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Foundation","cx":2.6802301363018337,"cy":-0.008091723250991834,"cz":0.075,"lx":47.100258882021336,"ly":155.2816074058604,"lz":0.15,"normal":[0,0,1],"rotation":[0,0,0.530395639672967],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"s7XmQ94X6RJALjEtkckmRw","selected":false},{"type":"Wall","cx":-13.009039985427215,"cy":-45.568583506677385,"cz":0,"lx":11.041805422196214,"ly":0.2,"lz":9,"leftJoints":["nWPXmVRMzHKyjWryQf87JS"],"rightJoints":["ihGgAKbhoAEwWeLnpFQBfw"],"leftPoint":[-7.488952987612821,-45.47368207375409,0],"rightPoint":[-18.52912698324161,-45.66348493960068,0],"relativeAngle":-3.1244023294596825,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qXr3hrbfNKc7RCzq91xbXK","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Stud","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["ihGgAKbhoAEwWeLnpFQBfw","dkmWHRoyM37TP1ais2mnQQ","kuZyRXr6X1ZZLgvnEdPLQW","qsREzsezLRHaTka6P3qi8E","nWPXmVRMzHKyjWryQf87JS","qXr3hrbfNKc7RCzq91xbXK"],"textureType":"No Roof Texture","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"715hHLBU5uPxPmY3VTjteR","sideColor":"#999999","rise":0,"ceiling":false},{"type":"Wall","cx":-10.356973979261362,"cy":-41.05802335267131,"cz":0,"lx":8.000000000000007,"ly":0.2,"lz":10,"leftJoints":["sdKSXeQhAWxE6ifCs1d6RC"],"rightJoints":["1sYogQ8Va73vub552Dsk1p"],"leftPoint":[-14.35697397926136,-41.05802335267131,0.1],"rightPoint":[-6.356973979261358,-41.05802335267129,0.1],"relativeAngle":3.5527136788004978e-15,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"dfk6k28j8Rsu1Q1oCp7zKp","parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","studSpacing":200,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":1.4207056572728782,"cy":46.41750725666692,"cz":0,"lx":18.6588866759028,"ly":0.2,"lz":5.794050119631874,"leftJoints":["jG1casp2JsBCa6isf6jPBp"],"rightJoints":["tYVF4f8huJSYi3SnemH2U3"],"leftPoint":[10.750148995224277,46.417507256666916,0],"rightPoint":[-7.908737680678521,46.41750725666693,0],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"hNWXBkU3b39gF1yUGHaJqP","parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","wallStructure":"Stud","studSpacing":200,"opacity":0,"roofId":"tknPcP8JDek1GProeixsEp","selected":false,"leftRoofHeight":5.794050119631874,"rightRoofHeight":5.794050119631874,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.794050119631874,"rightTopPartialHeight":5.794050119631874},{"type":"Wall","cx":10.983385078673063,"cy":-2.9427598627993987,"cz":0,"lx":98.72163631495759,"ly":0.2,"lz":5.794050119631874,"leftJoints":["iFwuQS6DyWdjrRQbrM6EVe"],"rightJoints":["hNWXBkU3b39gF1yUGHaJqP"],"leftPoint":[11.21662116212185,-52.3030269822657,0],"rightPoint":[10.750148995224274,46.4175072566669,0],"relativeAngle":1.5755214703412732,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jG1casp2JsBCa6isf6jPBp","parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","wallStructure":"Default","studSpacing":200,"opacity":0,"roofId":"tknPcP8JDek1GProeixsEp","selected":false,"leftRoofHeight":9.013429915065354,"rightRoofHeight":5.794050119631874,"centerRoofHeight":[-0.5,9.013429915065354],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.794050119631874,"rightTopPartialHeight":5.794050119631874},{"type":"Wall","cx":2.109769329329133,"cy":-52.165708324365085,"cz":0,"lx":18.215774122254274,"ly":0.2,"lz":9.013429915065354,"leftJoints":["tYVF4f8huJSYi3SnemH2U3"],"rightJoints":["jG1casp2JsBCa6isf6jPBp"],"leftPoint":[-6.997082503463552,-52.028389666464484,0],"rightPoint":[11.216621162121818,-52.30302698226569,0],"relativeAngle":-0.015077466364245784,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iFwuQS6DyWdjrRQbrM6EVe","parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","wallStructure":"Default","studSpacing":200,"opacity":0,"roofId":"tknPcP8JDek1GProeixsEp","selected":false,"leftRoofHeight":9.013429915065354,"rightRoofHeight":9.013429915065354,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.013429915065354,"rightTopPartialHeight":9.013429915065354},{"type":"Wall","cx":-7.452910092071025,"cy":-2.805441204898788,"cz":0,"lx":98.45011800989347,"ly":0.2,"lz":5.794050119631874,"leftJoints":["hNWXBkU3b39gF1yUGHaJqP"],"rightJoints":["iFwuQS6DyWdjrRQbrM6EVe"],"leftPoint":[-7.908737680678497,46.41750725666691,0],"rightPoint":[-6.997082503463552,-52.028389666464484,0],"relativeAngle":-1.5615361224898512,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"tYVF4f8huJSYi3SnemH2U3","parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","wallStructure":"Stud","studSpacing":200,"opacity":0,"roofId":"tknPcP8JDek1GProeixsEp","selected":false,"leftRoofHeight":5.794050119631874,"rightRoofHeight":9.013429915065354,"centerRoofHeight":[0.5,9.013429915065354],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.794050119631874,"rightTopPartialHeight":5.794050119631874},{"type":"Foundation","cx":-16.35434154408445,"cy":-4.658194992756286,"cz":0.1,"lx":43.87284485416718,"ly":139.1211999878274,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0.530395639672967],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"aLEzp9hfrYz6biKQBY4n26","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["iFwuQS6DyWdjrRQbrM6EVe"],"textureType":"No Roof Texture","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","id":"tknPcP8JDek1GProeixsEp","ridgeLeftPoint":[0.5,1],"ridgeRightPoint":[-0.5,1],"sideColor":"#999999","rise":0,"ceiling":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.325,"lx":0.9742789087050032,"ly":0.2,"lz":0.15,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tysEJM9hUShvginx4rYC7K","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"t2Cw4N4TZZkGP5BoLeNcKe","opacity":0,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0019768216134676713,"cy":0.1,"cz":-0.005731530796598517,"lx":0.9782325519319385,"ly":0.2,"lz":0.21146306159319703,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"qwSoMqqWcK4TDa7AjgWqwH","parentId":"tysEJM9hUShvginx4rYC7K","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":4.554386849898802e-17,"cy":0.1,"cz":-0.4,"lx":0.9742789087050032,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"m3ekqWg3Hj5f3LitnJWBy1","parentId":"tysEJM9hUShvginx4rYC7K","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":3.200610482948187e-17,"cy":0.1,"cz":0.325,"lx":0.9729631020395402,"ly":0.2,"lz":0.15,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hZXuadfd8Y2gU3C4iTs3VG","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"gvpuFXmeNDDeRKgSmwP1CZ","opacity":0,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":3.200610482948187e-17,"cy":0.1,"cz":-0.05,"lx":0.9729631020395402,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"eCbjoFBaHQiuQUKYuZoFfR","parentId":"hZXuadfd8Y2gU3C4iTs3VG","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.4,"lx":0.9729631020395402,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jFDknbsuGgwqRxzvsmU4CQ","parentId":"hZXuadfd8Y2gU3C4iTs3VG","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jaye","cx":-17.46381887736557,"cy":-41.9816536072657,"cz":0.05,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","id":"c9HstzWD7XzAFugKNugMuy","selected":false,"ly":0.55},{"type":"Window","cx":-0.45740372646398547,"cy":0.1,"cz":0.25,"lx":0.07195114798309891,"ly":0.2,"lz":0.3888888888888889,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nWPXmVRMzHKyjWryQf87JS","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"wuQewUkoGaBsjuzjt5f5uH","opacity":0,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2.5,"poleRadius":0.05,"poleSpacing":5,"cx":-0.08476384816809007,"cy":0.25788159693893226,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"color":"#fff","parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"vqvQktRu6i8bL8ZiGaoGnt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1615496100848164,"cy":0.25770817536556956,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"wdbtnJ1XkcTwDSb8wiEMKL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08010322022532794,"cy":0.09848093983788882,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"32oGsayzWtjfS2sR392vRy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15821694625943433,"cy":0.09899040837617899,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"e6f94dRNL6XBpsmcrnKDU9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1544950822019521,"cy":-0.05668699528465417,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"wzKUNhsTS2CEWiU4WpUm2j","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08173283819450536,"cy":-0.056114317250364976,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"mKWB3USg3dr53V5yqbCZHD","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08275541478239372,"cy":-0.21595299989492936,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"t9dCrMhmdqRDyewscNhEss","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.060547048383927105,"cy":-0.3528469086181044,"cz":9.2,"lx":27.776,"ly":3.936,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"7UbuZjpocqLztS4V8bYdKv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15077186158226766,"cy":-0.21881896397118786,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"e5YYaGmX4NkSq53yXqBiSb","selected":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.4500000000000003,"y":-0.425},{"x":-0.4500000000000003,"y":-0.17499999999999996},{"x":-0.2833333333333334,"y":-0.17499999999999996},{"x":-0.2833333333333334,"y":-0.425}],"parentId":"1sYogQ8Va73vub552Dsk1p","parentType":"Wall","foundationId":"fAfbfM7oEHfq1VBgchFech","selected":false,"filled":true,"selectedIndex":3,"id":"mMTWwGXVY6tHrH3tFfFj84","text":"P","fontColor":"black","fontOutlineColor":"white","fontOutlineWidth":0.1,"fontSize":2}],"sceneRadius":106,"view":{"dailyPvYieldPanelX":0,"mapPanelY":158,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[16.929262825751,-28.15408933210822,-0.000058144424349073707],"yearlyHeliostatYieldPanelY":0,"mapPanelX":248,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[16.929262825751,-28.154239338775618,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-13.677779559893043,-87.22834473506032,67.89303797087159],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":true,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":9.265824603195062,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16A5A5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[7.0532361348326695,-29.239499866887954,4.7578192072686045],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":7,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":false,"showAzimuthAngle":true,"showElevationAngle":true,"showZenithAngle":true,"solarPanelShiness":100,"windowShiness":200,"showDiurnalTemperaturePanel":false,"showEconomicsPanel":false,"showDailyUpdraftTowerYieldPanel":false,"showYearlyUpdraftTowerYieldPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":353,"height":64},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"yearlyLightSensorPanelShowDaylight":false,"yearlyLightSensorPanelShowClearness":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Hypothetical solar canopies for a garage"]}')},494:function(e){e.exports=JSON.parse('{"docid":"9FwzvKbLoEC3qk3HcYhpK3","time":"02/04/2023 02:19 pm","timestamp":1675538359367,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"noAnimationForSolarPanelSimulation":false,"latitude":37.4924685,"cspTimesPerHour":4,"timesPerHour":4,"noAnimationForSensorDataCollection":false,"noAnimationForSolarUpdraftTowerSimulation":false,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"sutGridCellSize":1,"longitude":-121.944697,"airConvectiveCoefficient":5,"name":"default","highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"diurnalTemperatureModel":1,"discretization":"Approximate","address":"45500 Fremont Blvd, Fremont, CA 94538, USA","noAnimationForHeatmapSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspDaysPerYear":4,"pvGridCellSize":0.5,"airAttenuationCoefficient":0.01,"sutDaysPerYear":4,"date":"1/1/2022, 9:00:00 AM","cspGridCellSize":0.5,"dustLoss":0.05,"daysPerYear":12},"elements":[{"type":"Foundation","cx":-0.08114032291986462,"cy":0.04294942268642887,"cz":0.05,"lx":77.18969112756628,"ly":25.114558892189873,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9VUxbWr6Hk1HaeGiLpEeqj","locked":false},{"type":"Wall","cx":16.394958493767938,"cy":-6.958678279965962,"cz":0,"lx":34.5,"ly":0.3,"lz":20,"relativeAngle":0,"leftPoint":[-0.6550415062320631,-7.358678279965961,0.1],"rightPoint":[33.84495849376793,-7.358678279965961,0.1],"leftJoints":[],"rightJoints":[],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"8BJFAiWAksi5iXqqAXG3m7","wallStructure":"Default","opacity":0,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Solar Panel","pvModelName":"FS-497","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.272463768115942,"cy":0,"cz":0.445,"lx":15.6,"ly":1.2,"lz":0.046,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"color":"#fff","parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wGRXvcE2DsAaZztwb6HksP","selected":false},{"type":"Human","name":"Jedi","cx":25.350323157691225,"cy":-8.982865067578267,"cz":0.05000000074505806,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"iDRReqKwNSn3MdzCD9xntV","selected":false,"ly":0.56},{"type":"Solar Panel","pvModelName":"FS-497","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.23768115942028983,"cy":0,"cz":-0.0050000000000000044,"lx":6,"ly":4.8,"lz":0.046,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"color":"#fff","parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"kDSDBXNMTiTKABtDtEoTPM","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.4463768115942027,"cy":2.960594732333751e-15,"cz":0.17517500000000008,"lx":3.5999999999999996,"ly":9.6,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"3R99UFMtSTu8MpSzhFBEzM","selected":false,"color":"#fff","drawSunBeam":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.3768115942028986,"cy":0,"cz":0.055525000000000005,"lx":1.2,"ly":14.399999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2nC5kmMxK27nhcbuLchKpX","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.24057971014492754,"cy":0,"cz":0.26534999999999986,"lx":6,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2f53rLJkYN28GAXqDH43oC","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.08115942028985497,"cy":0,"cz":-0.03447500000000003,"lx":2.4,"ly":18,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1CLg3vw3R6Mjckp2zLGRcx","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.23768115942028983,"cy":0,"cz":-0.21465000000000006,"lx":8.4,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"3EcpwWTaBMzQ2Wh6WUSfZ2","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.005797101449275342,"cy":0,"cz":0.44517500000000004,"lx":33.6,"ly":1.2,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"afQFwUz294V81V8ekAFzoy","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.38840579710144923,"cy":0,"cz":0.025875000000000446,"lx":4.8,"ly":13.2,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rvr7kALWbgFepgQwhgLdmn","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.47536231884057967,"cy":2.960594732333751e-15,"cz":-0.034299999999999733,"lx":1.2,"ly":18,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"h8Kaodh1qXkhqWggo4XUhx","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.21449275362318843,"cy":0,"cz":0.02570000000000001,"lx":4.8,"ly":13.199999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gb2jcBuVudWuAzaQrnkX6y","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.30144927536231886,"cy":0,"cz":-0.2143,"lx":1.2,"ly":3.599999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"vUqRVHfCe86GnXDtKSxaw8","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.127536231884058,"cy":0,"cz":0.05552500000000036,"lx":1.2,"ly":14.399999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"uSBaFrGbhmQkQMurd3uJ8K","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.01159420289855071,"cy":0,"cz":0.265525,"lx":6,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"n1zXsXRnujYqMASe1WUKNR","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.11594202898550725,"cy":-1.1842378929335004e-14,"cz":0.05535000000000023,"lx":1.2,"ly":14.399999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1bjxTFMmzz4rPmQkK5vxos","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.011594202898550721,"cy":0,"cz":0.025,"lx":6,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"kXtBHayvf3Tvd93XA15jDA","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.005797101449275342,"cy":0,"cz":-0.21447500000000003,"lx":7.199999999999999,"ly":3.599999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"7g2C2UieAJmWoyUM62ZQ2a","selected":false,"color":"#fff"},{"type":"Wall","cx":-17.344845563783142,"cy":-6.9427205539050725,"cz":4.230734017714145,"lx":34.5,"ly":0.3,"lz":20,"leftJoints":["gPxD8gV5byhzgQKdBBgMTy"],"rightJoints":[],"leftPoint":[-34.59484556378314,-6.9427205539050725,0.1],"rightPoint":[-0.09484556378314224,-6.9427205539050725,0.1],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"7cDw6CDEimwyt2K7C9p2yW","parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","wallStructure":"Default","opacity":0,"selected":false,"roofId":"sGiZvGvnHnyEYkatVrLiX7","leftRoofHeight":20,"rightRoofHeight":20,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.255072463768116,"cy":0,"cz":0.265,"lx":6,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wFqugJCgR6UNZP8KrBbWpt","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.35942028985507246,"cy":-1.1842378929335004e-14,"cz":0.05535000000000023,"lx":1.2,"ly":14.399999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"4jWvM8cSUfsXRSp6TmJ2Gg","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.22028985507246376,"cy":0,"cz":0.025174999999999993,"lx":5.999999999999999,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"toAqeegGXNvuKLhennKVzP","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.23768115942028983,"cy":0,"cz":-0.21447500000000003,"lx":7.199999999999998,"ly":3.599999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"saA7QrRCNPT5wTdbHg5J4Z","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.44637681159420284,"cy":-1.1842378929335004e-14,"cz":0.1753500000000002,"lx":2.4,"ly":9.6,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1muJg2Kq7Xbc14wrpktdBf","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.42898550724637674,"cy":0,"cz":-0.21447500000000003,"lx":3.5999999999999996,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"d7sb6VcbzjaYN3rbM9eNEy","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.4463768115942027,"cy":0,"cz":-0.21447500000000003,"lx":3.5999999999999996,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"cog6ySXPfBh8EbJAcymKkb","selected":false,"color":"#fff"},{"type":"Wall","cx":-34.64742278189158,"cy":2.0786397230474662,"cz":0,"lx":18.04302697558712,"ly":0.3,"lz":20,"relativeAngle":4.718216995364466,"leftPoint":[-34.7,11.100000000000001,0],"rightPoint":[-34.59484556378315,-6.942720553905069,0],"leftJoints":["doTJdkASNxSDmLf9c3Pegr"],"rightJoints":["7cDw6CDEimwyt2K7C9p2yW"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gPxD8gV5byhzgQKdBBgMTy","roofId":"sGiZvGvnHnyEYkatVrLiX7","leftRoofHeight":20,"rightRoofHeight":20,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-0.4000000000000057,"cy":11.099999999999998,"cz":0,"lx":68.6,"ly":0.3,"lz":20,"leftJoints":["6iADGugkaqZHafimZHuePH"],"rightJoints":["gPxD8gV5byhzgQKdBBgMTy"],"leftPoint":[33.89999999999999,11.099999999999996,0],"rightPoint":[-34.7,11.100000000000001,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"doTJdkASNxSDmLf9c3Pegr","parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","selected":false,"roofId":"sGiZvGvnHnyEYkatVrLiX7","leftRoofHeight":20,"rightRoofHeight":20,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":33.791618329408095,"cy":2.180852804801064,"cz":0,"lx":17.839611349594517,"ly":0.3,"lz":20,"leftJoints":[],"rightJoints":["doTJdkASNxSDmLf9c3Pegr"],"leftPoint":[33.6832366588162,-6.738294390397874,0],"rightPoint":[33.9,11.100000000000001,0],"relativeAngle":1.5586453515816485,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"6iADGugkaqZHafimZHuePH","parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","selected":false,"roofId":"sGiZvGvnHnyEYkatVrLiX7","leftRoofHeight":20,"rightRoofHeight":20,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Window","cx":0.22463768115942012,"cy":0.1,"cz":0.15000000000000005,"lx":0.4782608695652177,"ly":0.3,"lz":0.6000000000000001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"qQynJ4ikT8Jys2hyueRjYG","opacity":0.9,"mullion":true,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["6iADGugkaqZHafimZHuePH","doTJdkASNxSDmLf9c3Pegr","gPxD8gV5byhzgQKdBBgMTy","7cDw6CDEimwyt2K7C9p2yW"],"textureType":"No Roof Texture","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"sGiZvGvnHnyEYkatVrLiX7","rise":0,"ceiling":false},{"type":"Window","cx":0.22463768115942023,"cy":0.1,"cz":-0.325,"lx":0.4782608695652175,"ly":0.3,"lz":0.3,"mullionWidth":0.1,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jd3R2J1QYzh9JuC9phYqVK","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#009ce0","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.8,"mullion":true,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Joey","cx":27.81441583822325,"cy":-8.684480883806081,"cz":0.05000000074505806,"lx":0.462,"ly":0.462,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"fGLWCfzEic9oaSWyEnfb8i","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.011594202898550683,"cy":-5.921189464667502e-15,"cz":-0.44000000000000006,"lx":32.4,"ly":1.7999999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"n8XPZ6tgzkn2e4GV2EzSXQ","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.30724637681159417,"cy":-5.921189464667502e-15,"cz":-0.44000000000000006,"lx":13.2,"ly":1.7999999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"ekdf8pAm7pTKeoNrT8Tsaw","selected":false,"color":"#fff"},{"type":"Tree","name":"Coconut","cx":-37.29836295160464,"cy":6.720238350736238,"cz":0.05000000074505806,"lx":3.701437012134672,"lz":5.8375624371425605,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"bieAeuuP4wJ8YMzJZ42ius","selected":false},{"type":"Tree","name":"Coconut","cx":-37.9321629780283,"cy":-10.933241760578944,"cz":0.050000000745059836,"lx":3.701437012134672,"lz":5.8375624371425605,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1BTxRyn2gu6uRotoQP2TPa","selected":false},{"type":"Tree","name":"Coconut","cx":36.96142302143514,"cy":-12.152019969014674,"cz":0.05000000074505451,"lx":3.701437012134672,"lz":5.8375624371425605,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"45HuTdkFeGkSbAuGPLxP7t","selected":false},{"type":"Tree","name":"Coconut","cx":37.37981081167908,"cy":8.010864765015526,"cz":0.05000000074505451,"lx":3.701437012134672,"lz":5.8375624371425605,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gQacj5zT5LnDR4eGQGkjvL","selected":false},{"type":"Window","cx":-0.3014492753623188,"cy":0.1,"cz":0.38499999999999995,"lx":0.30724637681159417,"ly":0.3,"lz":0.049999999999999864,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wWxvu5H2MuoVyv6ABdSbEK","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3028985507246377,"cy":0.1,"cz":0.11749999999999998,"lx":0.03188405797101443,"ly":0.3,"lz":0.475,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"eREbGbTDZGJcxYejLHJP9R","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09420289855072465,"cy":0.1,"cz":0.14499999999999996,"lx":0.031884057971014505,"ly":0.3,"lz":0.5399999999999999,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rHF8v4bUPPQWeN1QG5CD8Z","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.010144927536231944,"cy":0.1,"cz":0.38999999999999996,"lx":0.1710144927536233,"ly":0.3,"lz":0.049999999999999954,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1iamFXUWAL4NspqHjRqj9C","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.010144927536231887,"cy":0.1,"cz":0.14499999999999996,"lx":0.16521739130434784,"ly":0.3,"lz":0.06000000000000005,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"kwg8jL3PhhkSHEUBWoJRhB","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.008695652173913031,"cy":0.1,"cz":-0.0975,"lx":0.16811594202898547,"ly":0.3,"lz":0.05500000000000001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"eBcZrL2nPnHJENRw34vkgb","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23768115942028983,"cy":0.1,"cz":0.3849999999999999,"lx":0.2086956521739131,"ly":0.3,"lz":0.05999999999999979,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tNMjGGfcx6yh5WH83NpPfT","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.15072463768115943,"cy":0.1,"cz":0.23249999999999998,"lx":0.0347826086956522,"ly":0.3,"lz":0.23500000000000004,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"cSnVNjSPe2y5ibKDfks9cp","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2565217391304348,"cy":0.1,"cz":0.14500000000000002,"lx":0.17101449275362315,"ly":0.3,"lz":0.049999999999999975,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"oQPXqj5b7fi9mxcYzLVwxU","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23768115942028983,"cy":0.1,"cz":-0.09500000000000001,"lx":0.2086956521739131,"ly":0.3,"lz":0.06000000000000004,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"acu7FEv3n3KgU2sbERHsq8","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.32608695652173914,"cy":0.1,"cz":0.030000000000000006,"lx":0.03188405797101453,"ly":0.3,"lz":0.16999999999999998,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"mwtc1MiJNhvF5Wp2hfBGbo","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3942028985507246,"cy":0.1,"cz":0.14499999999999996,"lx":0.0347826086956522,"ly":0.3,"lz":0.5399999999999999,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"xjxbBTagEoUGRvE4BqcQ8X","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4463768115942029,"cy":0.1,"cz":-0.0975,"lx":0.06376811594202897,"ly":0.3,"lz":0.05500000000000001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gopaxkwtRfTqBUgmdgUeeB","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.44637681159420284,"cy":0.1,"cz":-0.09500000000000001,"lx":0.10434782608695652,"ly":0.3,"lz":0.06000000000000004,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"qtFXnqjWpK5EGFhJVApZG1","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2391304347826087,"cy":0.1,"cz":0.3850000000000001,"lx":0.2405797101449276,"ly":0.3,"lz":0.05999999999999987,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"n3FzBgTqGZAf3tAvrhJnpS","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.34347826086956523,"cy":0.1,"cz":0.11250000000000004,"lx":0.031884057971014484,"ly":0.3,"lz":0.4749999999999999,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wN26cpvDFmXpaVZ9fzFKx6","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.1333333333333334,"cy":0.1,"cz":0.11499999999999999,"lx":0.034782608695652126,"ly":0.3,"lz":0.47000000000000003,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"a6Zd5eVvPewZw6pi9G6fFn","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2391304347826087,"cy":0.1,"cz":0.145,"lx":0.17101449275362318,"ly":0.3,"lz":0.06000000000000001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"jXiZzAe8xydxZFiw3kYxPd","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.010144927536231873,"cy":0.1,"cz":-0.35,"lx":0.9304347826086955,"ly":0.3,"lz":0.09000000000000004,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"kWayuyUJ3NCoJ76cAXXsb2","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30869565217391304,"cy":0.1,"cz":-0.35,"lx":0.37391304347826093,"ly":0.3,"lz":0.08000000000000003,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"4sc4zQh2e4rskEdUjC7bwE","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Flower","name":"Boxwood","cx":-33.25171795779697,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2qoyCTh6RmtgUKGjienf6c","selected":false},{"type":"Flower","name":"Boxwood","cx":-30.051717957796967,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"27S95LNhtfhhNdrfhLb63X","selected":false},{"type":"Flower","name":"Boxwood","cx":-26.851717957796964,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"4EzEYN7UN51NGA1h2gYf6h","selected":false},{"type":"Flower","name":"Boxwood","cx":-23.65171795779696,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"aMDDZrStJb88k8cjNdHTyX","selected":false},{"type":"Flower","name":"Boxwood","cx":-20.45171795779696,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"bmyWAH2NGyagaGJf2zR8wZ","selected":false},{"type":"Flower","name":"Boxwood","cx":-17.251717957796956,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"qjnbGRzmuBcffGRPmRHiD4","selected":false},{"type":"Flower","name":"Boxwood","cx":-14.051717957796956,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2kbr1bEYWRM4qt64AXRioR","selected":false},{"type":"Flower","name":"Boxwood","cx":-10.851717957796957,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wPVJmyDJeSE1u47UPb87pe","selected":false},{"type":"Flower","name":"Boxwood","cx":-7.651717957796958,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"7fEUD44paZGx4eApcgVBdW","selected":false},{"type":"Flower","name":"Boxwood","cx":-4.451717957796959,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"iz1HshbMuyvDyuUFjjNVmm","selected":false},{"type":"Flower","name":"Boxwood","cx":-1.2517179577969584,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1HnQLoEVsBHHwYnQM4daRk","selected":false},{"type":"Flower","name":"Boxwood","cx":1.9482820422030418,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tHugAGpHLnMfQJaJDiLNgW","selected":false},{"type":"Flower","name":"Boxwood","cx":5.148282042203042,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"fNGZwXhHJCEaTdeKtqi7LN","selected":false},{"type":"Flower","name":"Boxwood","cx":8.348282042203042,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"x9veDZdEDkbTP24vXAaH9a","selected":false},{"type":"Flower","name":"Boxwood","cx":11.548282042203041,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"aW9z1qFcCFUJKw1kfwTUs9","selected":false},{"type":"Human","name":"Jack","cx":-36.639233371667494,"cy":-11.25138408484107,"cz":0.05000000074505806,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"bQ8SMNuHJbe3JAwpYi8Bx3","selected":false,"ly":0.42}],"view":{"yearlyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"diurnalTemperaturePanelX":0,"showInstructionPanel":true,"axes":false,"enableRotate":true,"weatherPanelY":0,"cameraPosition":[-38.175932678703475,-44.876912777413864,6.961313205634463],"showYearlyUpdraftTowerYieldPanel":false,"showSunAngles":false,"dailyPvYieldPanelX":0,"dailyHeliostatYieldPanelY":0,"showDailyHeliostatYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"showDailyLightSensorPanel":false,"solarRadiationHeatMapReflectionOnly":false,"autoRotate":false,"showWeatherPanel":false,"yearlyParabolicDishYieldPanelX":0,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelX":0,"yearlyPvYieldPanelX":0,"mapType":"roadmap","visibilityResultsPanelX":0,"heliodonPanelY":0,"showYearlyParabolicTroughYieldPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"dailyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"mapPanelX":0,"orthographic":false,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelY":0,"showHeliodonPanel":false,"showDailyFresnelReflectorYieldPanel":false,"heliodon":false,"showMapPanel":false,"shadowEnabled":true,"dailyFresnelReflectorYieldPanelY":0,"showYearlyFresnelReflectorYieldPanel":false,"weatherPanelX":0,"yearlyHeliostatYieldPanelX":0,"dailyLightSensorPanelY":0,"showDiurnalTemperaturePanel":false,"showDailyUpdraftTowerYieldPanel":false,"mapPanelY":0,"dailyPvYieldPanelY":0,"showStickyNotePanel":false,"yearlyUpdraftTowerYieldPanelX":0,"yearlyFresnelReflectorYieldPanelX":0,"groundColor":"#16A5A5","dailyHeliostatYieldPanelX":0,"stickyNotePanelX":0,"dailyUpdraftTowerYieldPanelY":0,"showElevationAngle":true,"yearlyFresnelReflectorYieldPanelY":0,"showYearlyHeliostatYieldPanel":false,"mapZoom":18,"panCenter":[7.187719821125536,18.770050283059465,6.961313205634463],"visibilityResultsPanelY":0,"showZenithAngle":true,"stickyNotePanelY":0,"showDesignInfoPanel":true,"yearlyPvYieldPanelY":0,"dailyUpdraftTowerYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"showYearlyLightSensorPanel":false,"heliodonPanelX":0,"theme":"Desert","yearlyLightSensorPanelShowDaylight":false,"groundImage":false,"showAzimuthAngle":true,"ambientLightIntensity":0.1,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"showDailyParabolicDishYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"solarRadiationHeatMapMaxValue":5,"showYearlyPvYieldPanel":false,"yearlyLightSensorPanelShowClearness":false,"showSolarPanelVisibilityResultsPanel":false,"diurnalTemperaturePanelY":0,"yearlyHeliostatYieldPanelY":0,"cameraZoom":13.26840862578125,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[21.857600787569247,2.944578579032461,0.0000029447094632855078],"cameraPosition2D":[21.857600787569247,2.944428572365064,150],"yearlyLightSensorPanelX":0,"showDailyParabolicTroughYieldPanel":false,"waterSurface":false,"showEconomicsPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},495:function(e){e.exports=JSON.parse('{"docid":"1VPKxyH9hMKodx5PZBsKF9","time":"02/02/2023 08:19 pm","timestamp":1675387154116,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"9/15/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.0145505850910366,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground","color":"#ffffff"},{"rotation":[0,0,0],"normal":[0,0,1],"showLabel":false,"label":"Row1","cy":-0.38935296591314916,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"cz":0.5000000074505806,"type":"Solar Panel","id":"c2J7QZr1z68dpk33yTT2Sd","orientation":"Landscape","cx":0.01688904665567762,"relativeAzimuth":0,"trackerType":"None","poleSpacing":3,"selected":false,"lz":0.046,"lx":17.138,"poleHeight":1,"drawSunBeam":true,"ly":2.092,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X21-335-BLK"},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":2.092,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":false,"label":"Row2","tiltAngle":0.5235987755982988,"poleSpacing":3,"rotation":[0,0,0],"lx":17.138,"selected":false,"orientation":"Landscape","cx":0.013031122906363104,"relativeAzimuth":0,"cy":-0.18800180696869379,"poleHeight":1,"drawSunBeam":true,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X21-335-BLK"},{"poleRadius":0.05,"type":"Solar Panel","lx":17.138,"lz":0.046,"relativeAzimuth":0,"drawSunBeam":true,"rotation":[0,0,0],"ly":2.092,"normal":[0,0,1],"poleSpacing":3,"cx":0.014926747515468942,"trackerType":"None","cy":0.014703568726943495,"label":"Row3","cz":0.5000000074506161,"orientation":"Landscape","showLabel":false,"selected":false,"poleHeight":1,"tiltAngle":0.5235987755982988,"id":"mAv2C19w4RJA4u6knYxU3u","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X21-335-BLK"},{"orientation":"Landscape","lx":17.138,"showLabel":false,"id":"jLa9TCA6bfQFuaoHYKZtr7","poleHeight":1,"drawSunBeam":true,"cy":0.18975053307599946,"selected":false,"ly":1.596,"label":"Row4","poleSpacing":3,"cx":0.012922602074816969,"type":"Solar Panel","cz":0.5000000074506161,"rotation":[0,0,0],"lz":0.046,"poleRadius":0.05,"trackerType":"None","tiltAngle":0.5235987755982988,"normal":[0,0,1],"relativeAzimuth":0,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X20-250-BLK"},{"tiltAngle":0.5235987755982988,"id":"nWKZve3r4PVxJM4YwShMJW","relativeAzimuth":0,"poleSpacing":3,"poleRadius":0.05,"cx":0.011234729062103974,"poleHeight":1,"type":"Solar Panel","trackerType":"None","label":"Row5","lz":0.046,"normal":[0,0,1],"showLabel":false,"cz":0.5000000074505806,"selected":false,"orientation":"Landscape","lx":17.138,"ly":1.596,"rotation":[0,0,0],"cy":0.35915527919266454,"drawSunBeam":true,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X20-250-BLK"},{"type":"Human","name":"Jack","cx":-8.559844752666184,"cy":-5.056987011387983,"cz":0.05000000074505784,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmVJY65HF3sgVftctUAMHa","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Grassland","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[-10.001667461924015,-11.422813610974892,1.2577590090789499],"panCenter":[0.22138352296916342,-0.3133299860057419,1.2290156417830225],"orthographic":false,"enableRotate":true,"cameraZoom":45.44146361606706,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"waterSurface":true,"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":69}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Floatovoltaics"]}')},496:function(e){e.exports=JSON.parse('{"docid":"nXWtB4rWbhWvkvZtVhSWZF","time":"02/02/2023 08:30 pm","timestamp":1675387805969,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":21.26999081653234,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-157.79987618634874,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"4303 Diamond Head Rd, Honolulu, HI 96816, United States","date":"9/15/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.0145505850910366,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground","textureType":"Foundation Texture #3"},{"rotation":[0,0,0],"normal":[0,0,1],"showLabel":false,"label":"Row1","cy":-0.38935296591314916,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"cz":0.5000000074505806,"type":"Solar Panel","id":"c2J7QZr1z68dpk33yTT2Sd","orientation":"Landscape","cx":0.01688904665567762,"relativeAzimuth":0,"trackerType":"None","poleSpacing":3,"selected":false,"lz":0.046,"lx":17.712,"poleHeight":1,"drawSunBeam":true,"ly":1.984,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-350P-FG"},{"poleRadius":0.05,"type":"Solar Panel","lx":17.712,"lz":0.046,"relativeAzimuth":0,"drawSunBeam":true,"rotation":[0,0,0],"ly":1.984,"normal":[0,0,1],"poleSpacing":3,"cx":0.01109811276060147,"trackerType":"None","cy":-0.00188664318968728,"label":"Row3","cz":0.5000000074506161,"orientation":"Landscape","showLabel":false,"selected":false,"poleHeight":1,"tiltAngle":0.5235987755982988,"id":"mAv2C19w4RJA4u6knYxU3u","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-350P-FG"},{"tiltAngle":0.5235987755982988,"id":"nWKZve3r4PVxJM4YwShMJW","relativeAzimuth":0,"poleSpacing":3,"poleRadius":0.05,"cx":0.011234729062103974,"poleHeight":1,"type":"Solar Panel","trackerType":"None","label":"Row5","lz":0.046,"normal":[0,0,1],"showLabel":false,"cz":0.5000000074505806,"selected":false,"orientation":"Landscape","lx":17.712,"ly":1.984,"rotation":[0,0,0],"cy":0.35915527919266454,"drawSunBeam":true,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-350P-FG"},{"type":"Foundation","cx":0.3190918347725322,"cy":-2.2556492768451117,"cz":0.15,"lx":17.098921077121087,"ly":1.3533895061041852,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gczoe9MamkUMzTbQUC2KQN","textureType":"Foundation Texture #4"},{"type":"Foundation","cx":0.28073712728172673,"cy":2.9801823965779324,"cz":0.15,"lx":17.098921077121087,"ly":1.3533895061041852,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #4","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1Tke71vAoWuRt2r5v2CSYZ","selected":false},{"type":"Tree","name":"Dogwood","cx":7.740549835438854,"cy":0.017840498094405355,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"35HtXQRVRTJqsvcy71eZBd","selected":false},{"type":"Tree","name":"Dogwood","cx":-7.914181447469746,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"fmSSfxugyyXcaFPGp5J2GH","selected":false},{"type":"Tree","name":"Dogwood","cx":-6.507390701525628,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"r1axrjm2UGjTBQPRnRKw1U","selected":false},{"type":"Tree","name":"Dogwood","cx":-5.10059995558151,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"o6SdXUMbUBjNMc2SCs1Pqu","selected":false},{"type":"Tree","name":"Dogwood","cx":-3.693809209637392,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"nkBbAZdoKvnThFLy1td116","selected":false},{"type":"Tree","name":"Dogwood","cx":-2.2870184636932738,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"srkmySETFJsYm7J8quA3u2","selected":false},{"type":"Tree","name":"Dogwood","cx":-0.8802277177491555,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"2kmwtuQn7hFn7tffKEXSXb","selected":false},{"type":"Tree","name":"Dogwood","cx":0.5265630281949627,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"fG9ydmQQYpah6b1GcbZ59Q","selected":false},{"type":"Tree","name":"Dogwood","cx":1.933353774139081,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"cgtEAVRi5nWuhmKxX6g4z5","selected":false},{"type":"Tree","name":"Dogwood","cx":3.340144520083199,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"przZJKcdsmf3AyEn87SwPT","selected":false},{"type":"Tree","name":"Dogwood","cx":4.746935266027317,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"wUrT7zxrNMXpZdhUKyq5x6","selected":false},{"type":"Tree","name":"Dogwood","cx":6.153726011971435,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"wntymhbHuaV7gtGi2EKDo7","selected":false},{"type":"Tree","name":"Dogwood","cx":-7.921728516250141,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"v9KQQQuSFRs8JqvZtTpA91","selected":false},{"type":"Tree","name":"Dogwood","cx":-6.514937770306023,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"i9DpJbmib5K1p7nV3kHbAn","selected":false},{"type":"Tree","name":"Dogwood","cx":-5.108147024361905,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"abX7uxAMQEagSgZXGMDfc4","selected":false},{"type":"Tree","name":"Dogwood","cx":-3.701356278417787,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"8jDYNfHuAJ7p879PSFKFS7","selected":false},{"type":"Tree","name":"Dogwood","cx":-2.294565532473669,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"pFBywXTiVuv1AmsiPtaaxP","selected":false},{"type":"Tree","name":"Dogwood","cx":-0.8877747865295509,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"o4cGsZNPakmckwZS1qrg9m","selected":false},{"type":"Tree","name":"Dogwood","cx":0.5190159594145674,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"34A3P6HT9WYg8AhiSpDvJ2","selected":false},{"type":"Tree","name":"Dogwood","cx":1.9258067053586856,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"fjnQ1uMpj1Uu2GoJFhim85","selected":false},{"type":"Tree","name":"Dogwood","cx":3.332597451302804,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"pPYcKdZTgMJwPHDdttFX1J","selected":false},{"type":"Tree","name":"Dogwood","cx":4.739388197246922,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"f7JCh9VAUmcsaYDVz921MP","selected":false},{"type":"Tree","name":"Dogwood","cx":6.14617894319104,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"dXMAvKBiQuUkM6raCwK6oQ","selected":false},{"type":"Tree","name":"Dogwood","cx":7.552969689135158,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"jLd4TSy4qBALW8xPSrjLrR","selected":false},{"type":"Human","name":"Jack","cx":4.64411436627465,"cy":-1.2366715485892947,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"hYuqwxLBfjhYZrxPJu2S8L","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":21,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[18.48895144187419,-11.785046125916908,7.149509433378907],"panCenter":[-0.011430693478356556,-0.017971518365828498,0],"orthographic":false,"enableRotate":true,"cameraZoom":45.44146361606706,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.2201113364586017,47.99999980190954],"panCenter2D":[2.68477267877577,-0.22006333432578373,5.501827899659354e-7],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showMapPanel":false,"solarRadiationHeatMapMaxValue":4,"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":205,"height":68}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Agrivoltaics"]}')},497:function(e){e.exports=JSON.parse('{"docid":"3kTPvbTLo3JfCvHCNFYb8C","time":"02/02/2023 05:19 pm","timestamp":1675376390119,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"10/01/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0001687190273044117,"cy":-0.1827633083380377,"cz":0.5000000074505806,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"snQKvKf7xPrhuT28Bo2tYv","selected":false,"dailyYield":20.344194814255086,"label":"R22"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0005055611729018629,"cy":0.005909338720999285,"cz":0.5000000074506161,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"s6gwZqoX59Afjq9iWzuivT","selected":false,"drawSunBeam":false,"dailyYield":20.344194814255086,"label":"R23"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0008424033184993142,"cy":0.19458198578003624,"cz":0.5000000074506517,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pbozwPgQw2bzssDtJKTqSk","selected":false,"dailyYield":20.301130494002802,"label":"R24"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0001681231182930395,"cy":-0.37143595539707464,"cz":0.5000000074505451,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"3nSBw847J9tSxs8CwWughr","selected":false,"label":"R21","dailyYield":20.423474876035336},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640967653,"cy":0.38325463283907324,"cz":0.5000000074506872,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pu9LeYFSmjuxaejn2VSzZ1","selected":false,"dailyYield":20.34600992389522,"label":"R25"},{"type":"Foundation","cx":9.631391045182012,"cy":-0.034724141127635555,"cz":0.05,"lx":18.175146995703113,"ly":15,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7nkGUQpHaM9zN22MJgfSvf","selected":false},{"type":"Human","name":"Jack","cx":-0.1594284211117477,"cy":-6.960741063855943,"cz":-1.7763568394002505e-15,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"d3bJG1MfPQqauwCeM9B8UL","selected":false,"ly":0.6},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0001687190273044117,"cy":-0.23276330833803774,"cz":0.5000000074505806,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"oPGVYYGkGqjKAWacgXTr35","selected":false,"dailyYield":11.705639294931665,"label":"R12"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0001681231182930395,"cy":-0.37143595539707464,"cz":0.5000000074505451,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"aiWW32QVkCjCBwtDMtjsXr","selected":false,"dailyYield":20.423474876035336,"label":"R11"},{"type":"Foundation","cx":-9.466959404203182,"cy":-0.00920136097199542,"cz":0.05,"lx":18.175146995703113,"ly":15,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7LGxrgEwehUWBo5dH7C67q","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0005055611729018629,"cy":-0.09409066127900084,"cz":0.5000000074506161,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"gFDw5Wxzxz1fZY32qoSLoy","selected":false,"dailyYield":11.694143838550957,"label":"R13"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0008424033184993142,"cy":0.044581985780036054,"cz":0.5000000074506517,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"3seUSu69aBJbCMJ1QTweLi","selected":false,"dailyYield":11.705639294931665,"label":"R14"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640967656,"cy":0.18325463283907295,"cz":0.5000000074506872,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"hgGFwiEpscwf16U1io4zpD","selected":false,"dailyYield":11.705639294931665,"label":"R15"}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#16cda5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":true,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[24.035965357730035,-22.736672617703796,26.412316296073463],"panCenter":[14.509957884993852,2.01433946065165,2.596734324796276],"orthographic":false,"enableRotate":true,"cameraZoom":27.207482839996143,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"solarRadiationHeatMapMaxValue":4.5,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":253,"height":65}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of interrow spacing"]}')},498:function(e){e.exports=JSON.parse('{"docid":"69tJrD9Uz8P8feZdzUtyXN","time":"05/20/2022 12:16 pm","timestamp":1653063377435,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":37.44574069680563,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-6.249946169311531,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"41800 Sanl\xfacar la Mayor, Seville, Spain","date":"3/22/2022 11:00:00 AM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":5,"cspTimesPerHour":1,"cspGridCellSize":5},"elements":[{"cy":53.463080949514506,"normal":[0,0,1],"lz":0.5,"ly":806.586647395053,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":11.016365885808142,"cz":0.25,"rotation":[0,0,0],"lx":870.6680312936733,"selected":false,"parentId":"Ground","locked":false,"solarPowerTower":{"towerHeight":40,"towerRadious":4}},{"type":"Human","name":"Jack","cx":-19.167451192300774,"cy":-309.3414199054706,"cz":0,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.8},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.0019164258394133288,"cy":-0.4158344145798274,"cz":0,"lx":12,"ly":10,"lz":0.1,"showLabel":false,"label":"4","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":25.59597205852084,"yearlyYield":311.4614380820491,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.007376001317235639,"cy":-0.36554470178529136,"cz":0,"lx":12,"ly":10,"lz":0.1,"showLabel":false,"label":"3","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":28.888231364804646,"yearlyYield":341.6536704139208,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.20537660531292481,"cy":-0.4193704100106933,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"label":"2","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":false,"dailyYield":23.314190283597984,"yearlyYield":285.77957159626914,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.09582112405795708,"cy":-0.4382290523086443,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"label":"1","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":false,"dailyYield":29.108913473883288,"yearlyYield":347.0340046876023,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.054863159129938666,"cy":-0.464159685468327,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kTbu5NQZzH6fiJzt2zLCpV","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.11037999199881661,"cy":-0.46023080165625374,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ugqyZH3Bjuab2xu6Qr2AeU","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.112199850491424,"cy":-0.3934397768510106,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k7rmzdYXVhRoVennqPqJYd","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.11802339766776783,"cy":-0.41308419591137624,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jSyunViQPLX4rv6KUBXXTZ","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.15769631280660995,"cy":-0.4511943688884857,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q1mgBumMQuofVfZ58dfPgn","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.039576347792036205,"cy":-0.442943712883132,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1BaYAuYZtqhDEGCFRqXDcs","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.02792925343934858,"cy":-0.3761526880778888,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4sC4oY8P4gCm2XiADRkgDQ","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.07725856743336128,"cy":-0.42251351706035173,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k2hvdFozuZeFRMXA2gCxru","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.08781374669048435,"cy":-0.3977615490442911,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5gLYoZoHmvvc2dfNpBoMHu","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.10419247312395133,"cy":-0.3682949204537425,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qoUTmK9iTzsVRu26aQmb6S","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1445933316598364,"cy":-0.3553296038739013,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aaDc1Nt2XKdpoCZWcocB2i","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.005363008131016386,"cy":-0.38597489760807163,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bLKFf4eYJctoWDbAWu1oSp","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1314903505130629,"cy":-0.4657312389931562,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"svsNMecQbfU155PmYUZ3Lt","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.12457488824115463,"cy":-0.36004426444838894,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5WMpX8TYy1KfLhVCYdMj1p","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.16424780337999675,"cy":-0.38518912084565715,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rLs3CXHWy1yv3CpNwWpHSg","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.16934340715929755,"cy":-0.4067979818120592,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iYKv2L4bbvL99cSYqy9g78","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.04086139758121251,"cy":-0.3297918590954259,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6h32hqP5LZJr3g6KkvENFf","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.05978792590432987,"cy":-0.38361756732082763,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hJpPNqZeYCYBc9ZnrtL8rd","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.014291463589143885,"cy":-0.3961899955194619,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oKHW4guazpWYWFUbcAtx78","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.015554215689618007,"cy":-0.40483353990602267,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jGpvLznPcPbkxgRNT7LmEG","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.030306218324089352,"cy":-0.40876242371809585,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7v652Vk2Y4W8Ugs74iPYyx","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.18645007698980745,"cy":-0.40994108886171765,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wmMQERU6EmYPAHq1HGq5G1","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1646117750785182,"cy":-0.42172774029793714,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qmEBaJnQ1mYuWRgutUUj45","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.025574586243310056,"cy":-0.3482576130121696,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hgFFjf5NE1fWwscAHtJz9W","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.14677716185096534,"cy":-0.38086734865237665,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5E44DCctaDCtPRiHgiN8Co","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1871780203868504,"cy":-0.38833222789531546,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h3FAf2Pb5iRxcMgjsAapYN","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.2064685204084893,"cy":-0.39697577228187636,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"phQzzL3Mgfme6Exr5WqXA9","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.227942850621257,"cy":-0.40640509343085185,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gSGxJne57KgDvvhX1w8m4S","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.068887218367367,"cy":-0.33686384995715757,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nvkfziKtbczLEbZ9noiReH","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.09873289764612901,"cy":-0.34629317110613306,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e7BrgrYuxziAFGXqE8Paiu","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.04595700136051335,"cy":-0.3631873714980474,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6E7Q93GeP3kP1LK9YLZv9E","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.07815734783531385,"cy":-0.44765837345761983,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nSCCumTcS91dqnMuiik1qm","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.07980636932301162,"cy":-0.37300958102823034,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pmLUXug8LEht87AKuCxfbz","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.2483252657384603,"cy":-0.4201561867731079,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o54KAWAv76mbgsJ1MBkyC5","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.09999564974660309,"cy":-0.4610165784186685,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"f7h8FDUa15ALkGHaRaG5Hv","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.19736922794545209,"cy":-0.4417650477395101,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2waE2goJnuKsD2ZPsCBxqm","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.05542026552207203,"cy":-0.4134770842925835,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w5ovRP3PCZ5upU3ukAjjLY","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.22393916193752067,"cy":-0.43233572659053454,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jLzYFijeuhoktLs4FcLsmr","selected":false,"drawSunBeam":true,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.020285847770397398,"cy":-0.4260495124912175,"cz":0.5000000074506517,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"b3S1EEPjMRL48HLhjJkhr2","selected":false,"drawSunBeam":true,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.08890566178604883,"cy":-0.3231127566149015,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aqxtvZXmbpAutc5KFCX7w3","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.034844715711256906,"cy":-0.3985473258067056,"cz":0.5000000074506517,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qn5fUEqKYEJLMaMGhD5V2c","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1817184449090281,"cy":-0.4291926195408761,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4t86vx9fAWouPiFQswUJGQ","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.073789687453056,"cy":-0.4728032298548879,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rufeUy74dsTyxkeFYKX4qa","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.028850331530003406,"cy":-0.37536691131547417,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6GXoab5MEeebRm4uGu1EG9","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.04030429118907922,"cy":-0.42172774029793714,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w5TEya7XNeGuhPop6Pj6Es","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.11838736936628931,"cy":-0.43272861497174187,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eDoKDbTtFpnA5S8UAeT5JD","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.13840581278497113,"cy":-0.41740596810465674,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bybZmMq5HCRUCdJHjru2JV","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.13513006749827772,"cy":-0.4437294899555085,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hrEeQaibYaP57iKo4xufR4","selected":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.043409199470862934,"cy":-0.38833222820527735,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eMTdANgm4PdxeiHcfwzGxe","selected":false},{"type":"Heliostat","cx":0.05923081951219652,"cy":-0.3989402144978749,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t2umoGg8VspP5qdugHevfe","selected":false},{"type":"Heliostat","cx":0.05959479121071805,"cy":-0.4232992941327282,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xgWhQhAtyB8sh6AEqfnLMB","selected":false},{"type":"Heliostat","cx":0.05886684781367504,"cy":-0.44569393186154516,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4PiJNb4AiKgYWDFqfiLnsX","selected":false},{"type":"Heliostat","cx":0.08325295161461468,"cy":-0.4268352895635941,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uiJMkxjENj2xtf6Ek94NEJ","selected":false},{"type":"Heliostat","cx":0.10472728182738246,"cy":-0.4370503874749841,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xu9CszAWnNUQxfgY6e4BuN","selected":false},{"type":"Heliostat","cx":0.05013152704915935,"cy":-0.37222380457577764,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mNvmxvTfLNasgrJJBceUa2","selected":false},{"type":"Heliostat","cx":0.01773804588074696,"cy":-0.3392211805543633,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mPHMz8Zez8DHnqXVJDdKqX","selected":false},{"type":"Heliostat","cx":-0.11802339766776783,"cy":-0.3368638502671194,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3u148SBduXqFBbKh774JFp","selected":false},{"type":"Heliostat","cx":-0.16570369017408268,"cy":-0.3584727112335216,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dkiRia21pNiw2ZZ9ehmvPz","selected":false},{"type":"Heliostat","cx":-0.20901632229813968,"cy":-0.3702593626697411,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nCzcUVZHj8SBGWmTxeVCdH","selected":false},{"type":"Heliostat","cx":-0.2290347657168215,"cy":-0.37968868381871645,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1A8dsYXQfAQaXjXYHYypfP","selected":false},{"type":"Heliostat","cx":-0.186086105291286,"cy":-0.36318737180800925,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sWF3MtvJScjs42n3JPJzBs","selected":false},{"type":"Heliostat","cx":-0.15988014299773887,"cy":-0.3368638502671194,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qJ6i6BJYiz4BtphokxmqSr","selected":false},{"type":"Heliostat","cx":-0.13767786938792817,"cy":-0.33450651997987546,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8VArq9h668zQsZacfABpJx","selected":false},{"type":"Heliostat","cx":-0.10965204860177363,"cy":-0.3180052079691684,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hDWFzcdWPkLhpNc2qDGY97","selected":false},{"type":"Heliostat","cx":-0.07798651083040421,"cy":-0.3034683378644978,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g3osCpGC4VNFjdLEnR9ssL","selected":false},{"type":"Heliostat","cx":-0.04304522777234147,"cy":-0.29953945405242466,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5bEZH7wqmT7kFk43Sb7TJN","selected":false},{"type":"Heliostat","cx":-0.060515869301372795,"cy":-0.3164336544443391,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5KkN2FL8QnM1J53hB4Xn2H","selected":false},{"type":"Heliostat","cx":-0.02521061454478851,"cy":-0.3168265428255464,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kDCxHQF3XiaNTHNK5V66Ez","selected":false},{"type":"Heliostat","cx":-0.008467916412800107,"cy":-0.3022896727208758,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"crvXHP85BpYy7AfrCdfGqQ","selected":false},{"type":"Heliostat","cx":0.004635064733973385,"cy":-0.32154120340003417,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3MtreSAAK1C6J96mEDGMf5","selected":false},{"type":"Heliostat","cx":-0.012107633398015015,"cy":-0.33332785483625366,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e5jtkdQkg5vLr79YkGmJpg","selected":false},{"type":"Heliostat","cx":0.02574542324821971,"cy":-0.3105403287262294,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1YLAcSLk3xfAp4c5r9jnnW","selected":false},{"type":"Heliostat","cx":0.011550527005881632,"cy":-0.2956105702403515,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w1pjfJGLPZSQFpNzSdhVtD","selected":false},{"type":"Heliostat","cx":0.03520868740977837,"cy":-0.33214918969263163,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4HHLNX7pc8ynVjLa3M1tpQ","selected":false},{"type":"Heliostat","cx":0.045035923269858516,"cy":-0.3510078319905826,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ePKj6YLxFoSXibXbQUndAB","selected":false},{"type":"Heliostat","cx":0.043944008174294044,"cy":-0.3046470030081197,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6nSgZWsKWCHiVuWk3E9WHV","selected":false},{"type":"Heliostat","cx":0.030477055328999,"cy":-0.2865741374725833,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kT5YZAVhbb3hZCQWannx3E","selected":false},{"type":"Heliostat","cx":0.01737407418222549,"cy":-0.2677154951746322,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"giZWyJupVbt7L3N3Exx6KE","selected":false},{"type":"Heliostat","cx":-0.005556142824628219,"cy":-0.2783234814672297,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bzoJ5edfakL2yrcp9BQhB9","selected":false},{"type":"Heliostat","cx":-0.026302529640352984,"cy":-0.2865741374725833,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rKs5TmBLfGe1R4gmQLWbCL","selected":false},{"type":"Heliostat","cx":-0.062335727793980285,"cy":-0.29089590966586376,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2CFM3oUCe7xRVZWhn2bpoF","selected":false},{"type":"Heliostat","cx":-0.09727701085204306,"cy":-0.2999323424308765,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n3zXksYZLyDrdVy3Mr5bjz","selected":false},{"type":"Heliostat","cx":-0.1307624071160199,"cy":-0.3136834357758604,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tKTj5ruzDm2LDUQttBKZuC","selected":false},{"type":"Heliostat","cx":-0.15332865242435212,"cy":-0.30975455196378715,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8Wrax3edyeNcguwLnRGXNE","selected":false},{"type":"Heliostat","cx":-0.11765942596924632,"cy":-0.2912887980470435,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xe4keTpM3Nxqxi8VTBVkBA","selected":false},{"type":"Heliostat","cx":-0.10382850142542982,"cy":-0.2704657138430559,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cu8vDmF3mr6d486SRs8SVM","selected":false},{"type":"Heliostat","cx":-0.08453800140379099,"cy":-0.2779305930859948,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qVS1NQxjbM2xAQU2dHHvRU","selected":false},{"type":"Heliostat","cx":-0.0641555862865877,"cy":-0.2637866113625315,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bdggQyC48dvj95izyNr5AC","selected":false},{"type":"Heliostat","cx":-0.045593029661991816,"cy":-0.27360882089271443,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vPgz2pQL9AveqJGFTntUuC","selected":false},{"type":"Heliostat","cx":-0.02448267114774558,"cy":-0.2598577275504585,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4WD9oiEgpbrtpGdNkRWVx7","selected":false},{"type":"Heliostat","cx":0.054863159129938666,"cy":-0.2763590395611656,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1w2pYGTGqA6behkJEfLcAj","selected":false},{"type":"Heliostat","cx":-0.13949772788053558,"cy":-0.2932532399530801,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n8mK23ihYB6sUrakd88UX1","selected":false},{"type":"Heliostat","cx":-0.17553092603416284,"cy":-0.3140763241570676,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gzBAFojWt7yjzaVPbVngNE","selected":false},{"type":"Heliostat","cx":-0.18353830340163557,"cy":-0.33725673864829914,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qW18dh2SyEZXtSs5ZncgMF","selected":false},{"type":"Heliostat","cx":-0.20610454870996778,"cy":-0.34236428760399423,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1MzjLhQ1k16rfXY1x49HYf","selected":false},{"type":"Heliostat","cx":-0.16570369017408268,"cy":-0.28696702585376305,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"smNLCMky9o9MmdQJkRyv9F","selected":false},{"type":"Heliostat","cx":-0.2516010110251537,"cy":-0.39068955849252135,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nyYdfe47Tnu2fkkQUpKj1e","selected":false},{"type":"Heliostat","cx":0.057410961019589084,"cy":-0.323898533687278,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rZGMeCkjHUbBEScHVmXvBY","selected":false},{"type":"Heliostat","cx":0.0650543666885403,"cy":-0.3466860597973021,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6UVpSPL6NHwkMTGMAGWMbc","selected":false},{"type":"Heliostat","cx":0.06942202707079821,"cy":-0.3675091440012898,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vUjENc3i3UFtAwACin59Nf","selected":false},{"type":"Heliostat","cx":0.09089635728356589,"cy":-0.38793933982407003,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bYd2te8sj3qc6nKgdBwKUp","selected":false},{"type":"Heliostat","cx":0.09053238558504442,"cy":-0.3682949207637044,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"x5qvaDTKu24dWCcZ1x9b4h","selected":false},{"type":"Heliostat","cx":0.0861647252027866,"cy":-0.3459002830348876,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sYrumHzsSzJLGjGWnmW78L","selected":false},{"type":"Heliostat","cx":0.07997720632792127,"cy":-0.32154120340003417,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3atSERmb5y2o1fPkn3U3Sb","selected":false},{"type":"Heliostat","cx":0.06651025348262624,"cy":-0.2967892353839734,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q8fwLHL82vQ4h4iHmsSoAx","selected":false},{"type":"Heliostat","cx":0.09089635728356589,"cy":-0.2963963470027661,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rUX6PqLyYSPibFZmVVGKj1","selected":false},{"type":"Heliostat","cx":0.09853976295251717,"cy":-0.32154120340003417,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a71RHg1a5mbtqFmRR1LeB1","selected":false},{"type":"Heliostat","cx":0.10763905541555435,"cy":-0.34629317141609495,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rCZjDPu6hrV9hwK1sMBx7P","selected":false},{"type":"Heliostat","cx":0.11091480070224773,"cy":-0.37104513943215556,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3YTfKHrGkuKHP7GdujyydA","selected":false},{"type":"Heliostat","cx":0.10982288560668325,"cy":-0.39383266554217977,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kT6EXQ8Utyx3h6apaMYxSG","selected":false},{"type":"Heliostat","cx":0.11091480070224773,"cy":-0.41544152650858196,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nStqgmJn2aLSvqHghG4Pbp","selected":false},{"type":"Heliostat","cx":0.1287494139298006,"cy":-0.421727740607899,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2E7Vc7NyKu7SLYD6MSVgmr","selected":false},{"type":"Heliostat","cx":0.1251096969445857,"cy":-0.44294371319309384,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iJhGibH8hVHt3XFxuZ2EVR","selected":false},{"type":"Heliostat","cx":0.14003253658396672,"cy":-0.4547303646293133,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6ZA3XqcWxDfsN537EKY5vj","selected":false},{"type":"Heliostat","cx":0.14913182904700392,"cy":-0.4311570617568746,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4cKpMCMNmB9Ss7pKbSCSsB","selected":false},{"type":"Heliostat","cx":0.16660247057603533,"cy":-0.4445152667179231,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w54968Xiwo6dPjYZQGbBrb","selected":false},{"type":"Heliostat","cx":0.17278998945090057,"cy":-0.4213348522266917,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6dckGmumPNSkFhq8gMs3qu","selected":false},{"type":"Heliostat","cx":0.1920804894725394,"cy":-0.4354788339501549,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cwVuAxoZiUC1H5Wje2gfod","selected":false},{"type":"Heliostat","cx":0.15095168753961133,"cy":-0.40561931697839915,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ozYpByUV6vBaKhUdY2r3nZ","selected":false},{"type":"Heliostat","cx":0.13238913091501553,"cy":-0.39697577259181077,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3E8kv3kvDQYPCgHGrTc3BH","selected":false},{"type":"Heliostat","cx":0.1316611875179725,"cy":-0.37379535810057923,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"umYgCpqMpXPc71s29rAX3g","selected":false},{"type":"Heliostat","cx":0.1298413290253651,"cy":-0.35022205522814037,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4yFSXLahhMtG3gK56eWGg1","selected":false},{"type":"Heliostat","cx":0.1251096969445857,"cy":-0.327041640736909,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aTpNU9JuuqwPxdobYW4pBR","selected":false},{"type":"Heliostat","cx":0.1174662912756345,"cy":-0.29757501214636045,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gNvHaW33K459kqY9u7BepY","selected":false},{"type":"Heliostat","cx":0.15131565923813287,"cy":-0.35650826932745744,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8qgkQF7DCx79d2LxBy7hix","selected":false},{"type":"Heliostat","cx":0.15167963093665435,"cy":-0.38243890248714013,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mPQfhExNEGN2zwyjRVpTpq","selected":false},{"type":"Heliostat","cx":0.17388190454646504,"cy":-0.39540421906698137,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pDgnwEkgpE6PGtyJCXjDhU","selected":false},{"type":"Heliostat","cx":0.1786135366272444,"cy":-0.3682949207636769,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cRreS1UagGBcRUbiWtwtBd","selected":false},{"type":"Heliostat","cx":0.19535623475923283,"cy":-0.40719087050320085,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s7q7X6xUdhEACPxPGQCEo9","selected":false},{"type":"Heliostat","cx":0.19826800834740468,"cy":-0.3726166929569573,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gFGfHzaaJc5xaE2fHD963c","selected":false},{"type":"Heliostat","cx":0.2153746781779146,"cy":-0.41819174517700564,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nw8E1dCRxuQCPzw91T7NeE","selected":false},{"type":"Heliostat","cx":-0.22794285062125708,"cy":-0.3557224925650703,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jrTEnFovS1iifhRBBxC77v","selected":false},{"type":"Heliostat","cx":-0.27198342614235704,"cy":-0.405226428597192,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1HaVkVgC69Exxa4P4AuMRU","selected":false},{"type":"Heliostat","cx":-0.2483252657384603,"cy":-0.3565082693274851,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qspACkTkjBfrx3FAarHvtL","selected":false},{"type":"Heliostat","cx":-0.23267448270203633,"cy":-0.32979185940538763,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7itXceUu3MAQZY9syuA2us","selected":false},{"type":"Heliostat","cx":-0.21302001098187603,"cy":-0.30739722167657085,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w8VQxzaXGr6shiYCtL94LK","selected":false},{"type":"Heliostat","cx":-0.19045376567354383,"cy":-0.2877528026162052,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mYnEgxKjquMfzKB4NWPwU3","selected":false},{"type":"Heliostat","cx":-0.16424780337999675,"cy":-0.26850127193704687,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e9bXB5WFMrZz7h5xt76LKd","selected":false},{"type":"Heliostat","cx":-0.13804184108644962,"cy":-0.25632173211962017,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gtNeJEcTRyufHLL6AokGYa","selected":false},{"type":"Heliostat","cx":-0.11074396369733809,"cy":-0.2464995225894373,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6fwRxb24K57nabopN8NEmN","selected":false},{"type":"Heliostat","cx":-0.08126225611709761,"cy":-0.23549864791563258,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aUiiaf5Cq9kXkR5KzivtS2","selected":false},{"type":"Heliostat","cx":-0.05141657683833565,"cy":-0.23274842924718137,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wXCs59HycWywP6dVX3RxFD","selected":false},{"type":"Heliostat","cx":-0.023390756052181078,"cy":-0.23156976410080404,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uQNYdG6Cfa2DE4YjEyjiXC","selected":false},{"type":"Heliostat","cx":0.008274781719188292,"cy":-0.2315697641035319,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"obhiNFSAxtYYjH2nQGrkoa","selected":false},{"type":"Heliostat","cx":0.035208687409778276,"cy":-0.2406061968713278,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iY6QUX8HJxFfcjwEAuVe3x","selected":false},{"type":"Heliostat","cx":0.06177862140184686,"cy":-0.24846396449547406,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gxxQzBr3C3fZtBLQB4XzAE","selected":false},{"type":"Heliostat","cx":0.0887125270924369,"cy":-0.26221505783772997,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpt9FEDEbwRR242xB1y6tv","selected":false},{"type":"Heliostat","cx":0.11528246108450549,"cy":-0.2802879233732664,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fPPU5HqYqZdh2QetXJ2p7A","selected":false},{"type":"Heliostat","cx":0.13894062148840217,"cy":-0.2991465656684621,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"esagbCU76EkkhqebaZmmUf","selected":false},{"type":"Heliostat","cx":0.15932303660560546,"cy":-0.31918387311276286,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"prTqpkxvMuTWkeLJ8y2CgD","selected":false},{"type":"Heliostat","cx":0.17970545172280875,"cy":-0.3443287295100309,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u7j14TV18gpXBNzei9H8w2","selected":false},{"type":"Heliostat","cx":0.2022716970311409,"cy":-0.3498291668469332,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5JiM8J57ngXan5UMty5HT8","selected":false},{"type":"Heliostat","cx":0.21937836686165088,"cy":-0.37968868381871645,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uUofaDUcmMKbxLFL1oxkSL","selected":false},{"type":"Heliostat","cx":0.23976078197885417,"cy":-0.38911800496769194,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uJfXK4rjScs7gFncayPnY8","selected":false,"drawSunBeam":true},{"type":"Heliostat","cx":0.22410999894243014,"cy":-0.35611538094627776,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dzS7KY8fPB4mrrF8bFf3Lo","selected":false},{"type":"Heliostat","cx":0.24776815934632693,"cy":-0.36358026018921674,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vNqpyqbCLz9tXo7A7xujcB","selected":false},{"type":"Heliostat","cx":0.26997043295613765,"cy":-0.3726166929569849,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4ko5XUjuP9RKm463DmDooY","selected":false},{"type":"Heliostat","cx":0.1840731121050666,"cy":-0.32468431044969276,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"77xeiEQazj2KRhrDXmVzHK","selected":false},{"type":"Heliostat","cx":0.20554744231783434,"cy":-0.3258629755933147,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pQy87m9iTvmkmNKh4GrwyX","selected":false},{"type":"Heliostat","cx":0.22993354611877403,"cy":-0.3317563013114243,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xeup3LyMyTrCKir2W1QKdM","selected":false},{"type":"Heliostat","cx":0.25468362161823516,"cy":-0.3392211805543633,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qrKKoaqQCswPARya6NG7Vs","selected":false},{"type":"Heliostat","cx":0.27797781032361035,"cy":-0.3423642876040219,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pfjQmBxWC1Ae9mM7CjmUUs","selected":false},{"type":"Heliostat","cx":0.16150686679673432,"cy":-0.2956105702403516,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6aCwPMcxiojnSCdYJ4wNko","selected":false},{"type":"Heliostat","cx":0.1848010555021095,"cy":-0.29875367729001007,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"auwCCmHc32MJvNubS1T1L3","selected":false},{"type":"Heliostat","cx":0.20991510270009217,"cy":-0.2979679005275954,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cb6NtvzZtpvN9xsruY7hxj","selected":false},{"type":"Heliostat","cx":0.18334516870802356,"cy":-0.2696799370806689,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h9tGbEHGsevbnpUXRoj68w","selected":false},{"type":"Heliostat","cx":0.16041495170116993,"cy":-0.2724301557491201,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"woL52bcsabXgpYHzS37qFg","selected":false},{"type":"Heliostat","cx":0.13821267809135915,"cy":-0.2743945976551566,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3nJXEXXtvwSxAapdRK8NEU","selected":false},{"type":"Heliostat","cx":0.11164274409929059,"cy":-0.25592884373841296,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dcTSduTDfjsNkLxPMwiTbk","selected":false},{"type":"Heliostat","cx":0.1320251592164939,"cy":-0.24807107611426668,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sBMKWzPqqAL7Zab4fQ5qqk","selected":false},{"type":"Heliostat","cx":0.156775234715955,"cy":-0.24453508068340082,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uQW7nfUe52sF2ZYqMceBPR","selected":false},{"type":"Heliostat","cx":0.10618316862146829,"cy":-0.23274842924718148,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gDJUNMNv2fBuCXvNz8J9xz","selected":false},{"type":"Heliostat","cx":0.12947735732684348,"cy":-0.22449777324182785,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"d6wJ1UkGVratdvd1YcRyf5","selected":false},{"type":"Heliostat","cx":0.08398089501165754,"cy":-0.2402133084901204,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pnwY9vWpqTutfMQk6qVUEd","selected":false},{"type":"Heliostat","cx":0.07488160254862036,"cy":-0.2170328939961335,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9yJRVguxm2r3mSoLCoLCTo","selected":false},{"type":"Heliostat","cx":0.054135215732895585,"cy":-0.2276408802914864,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bcvVnYRe7XAmehyShvHG4A","selected":false},{"type":"Heliostat","cx":0.09671990445990958,"cy":-0.20838934961232802,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dt7UVCgK4oYcArc7w2oh6S","selected":false},{"type":"Heliostat","cx":-0.2708915110467926,"cy":-0.3631873718080094,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fP7CoUPJXXfAbKaQg7Vxiz","selected":false},{"type":"Heliostat","cx":-0.29382172805364637,"cy":-0.3702593626697411,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q3QCtRsjU5g348zquVGT6U","selected":false},{"type":"Heliostat","cx":-0.3000092469285116,"cy":-0.3459002830348876,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"npmRnivscsJpT65RjQuyWE","selected":false},{"type":"Heliostat","cx":-0.3254872658250157,"cy":-0.350222055228168,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aMe7m5ym2D1ye9JGywHJp4","selected":false},{"type":"Heliostat","cx":-0.3061967658033769,"cy":-0.31643365444433913,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"x6jK1HT196nDZpyUbLsgr1","selected":false},{"type":"Heliostat","cx":-0.28144669030391567,"cy":-0.31289765901347333,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gFEgPjqWAT6jwNBL8DPadb","selected":false},{"type":"Heliostat","cx":-0.27416725633348593,"cy":-0.3372567386483267,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g65dCH4Q2jLJsbDZ61ZYsF","selected":false},{"type":"Heliostat","cx":-0.25087306762811074,"cy":-0.33293496645504633,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eac2nmUN2zb5BwB2jyKPsx","selected":false},{"type":"Heliostat","cx":-0.2559686714074116,"cy":-0.3101474403450222,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2AwKtqmv9rBFEMsfpNMYmE","selected":false},{"type":"Heliostat","cx":-0.2574245582014975,"cy":-0.28500258394775413,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5CasrCRncJRWJd761ErCUY","selected":false},{"type":"Heliostat","cx":-0.23158256760647195,"cy":-0.25828617402565685,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9ZPBVxh6yErf9tk1x8bcei","selected":false},{"type":"Heliostat","cx":-0.23413036949612234,"cy":-0.28382391880413216,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qMvixKdLEKLj2KdxZ4Qc5j","selected":false},{"type":"Heliostat","cx":-0.23303845440055787,"cy":-0.30739722167657096,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vHCBTramJGKkCoc17G8w6M","selected":false},{"type":"Heliostat","cx":-0.21047220909222566,"cy":-0.28539547232896145,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jcFjeFAEwtPS1NdpSqySNN","selected":false},{"type":"Heliostat","cx":-0.2075604355040538,"cy":-0.2598577275504861,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"odG4uWtszFcFLXppnq6LTE","selected":false},{"type":"Heliostat","cx":-0.18572213359276454,"cy":-0.26535816488738845,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aiJA7beNej5o6BHcnWJBqC","selected":false},{"type":"Heliostat","cx":-0.18171844490902817,"cy":-0.23707020113050004,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1VU7yTZrVeHM5DLMgFzzbW","selected":false},{"type":"Heliostat","cx":-0.20464866191588185,"cy":-0.23353420600959607,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uUYHVbTbxr4tecMfV6CqzJ","selected":false},{"type":"Heliostat","cx":-0.15660439771104553,"cy":-0.25042840640151054,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"brUZr84cwNpf9Pv6XatvDd","selected":false},{"type":"Heliostat","cx":-0.13003446371897695,"cy":-0.23707020144046193,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6k3sEssXxYQA6FoYB2hbhc","selected":false},{"type":"Heliostat","cx":-0.10091672783725796,"cy":-0.22567643838544985,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dpK548QXB9AsPut3M9Vcnb","selected":false},{"type":"Heliostat","cx":-0.06961516176441004,"cy":-0.22174755457334913,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rtAwYocNSDA6e4Za64GAHv","selected":false},{"type":"Heliostat","cx":-0.03831359569156213,"cy":-0.21860444752369065,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jkbGDBANcy5EkzJfgAS6kT","selected":false},{"type":"Heliostat","cx":-0.009559831508364626,"cy":-0.21388978694920285,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uiJqTbavrRHEj1q5r4U8Sg","selected":false},{"type":"Heliostat","cx":0.025017479851176642,"cy":-0.21624711723644674,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tuZYTjdonfFPX1bpg7y2ib","selected":false},{"type":"Heliostat","cx":0.04430797987281548,"cy":-0.2056391309438493,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"r4K4Z2bUpqY9FZaarCV1EY","selected":false},{"type":"Heliostat","cx":0.06578231008558323,"cy":-0.19267381436400796,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tJMsMVYvUGopRwcThFGEkr","selected":false},{"type":"Heliostat","cx":0.009730668513274195,"cy":-0.19856714008211768,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1EfzqCs8cXPwvLAwQzbRpo","selected":false},{"type":"Heliostat","cx":-0.025938557941831565,"cy":-0.19660269817608111,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"75CWYjqVhH1TfFGgb42qY2","selected":false},{"type":"Heliostat","cx":0.028657196836391532,"cy":-0.1824587164526178,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tPC5C2vfzREdHf8vqzTMzw","selected":false},{"type":"Heliostat","cx":-0.005920114523149727,"cy":-0.17892272102175202,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9vv8piBWmfsjf8ThwaysgA","selected":false},{"type":"Heliostat","cx":-0.04013345418416953,"cy":-0.17970849778692202,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pLA5NWUpepKR65o6v964r9","selected":false},{"type":"Heliostat","cx":-0.07507473724223238,"cy":-0.1867804886459258,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mUep51aC7r6anQJ2Y69oWq","selected":false},{"type":"Heliostat","cx":-0.10783219010916623,"cy":-0.1950311446512794,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v8aDpwcpvGcDg3v8p4qNKb","selected":false},{"type":"Heliostat","cx":-0.14240950146870754,"cy":-0.2009244703693891,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8BebM2PFswwW6mD8cum1bR","selected":false},{"type":"Heliostat","cx":-0.17407503924007692,"cy":-0.2162471172364743,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6RzznrEY6WFg8gVGqs15oP","selected":false},{"type":"Heliostat","cx":-0.05760409571320095,"cy":-0.19738847493852332,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aLcHwQEUZ4M4zGv7CBgFgZ","selected":false},{"type":"Heliostat","cx":-0.08672183159491996,"cy":-0.20485335418146225,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9oqQfqaBV4xJeZR3tB1T2T","selected":false},{"type":"Heliostat","cx":-0.12093517125593976,"cy":-0.21742578238009624,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5txUysL5P5gEVTjd4qAbBd","selected":false},{"type":"Heliostat","cx":-0.15078085053470172,"cy":-0.22567643838544985,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nxjHGtH2QdDPPuNWARdYaV","selected":false},{"type":"Heliostat","cx":0.08580075350426505,"cy":-0.18324449321506,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3MqWmh3QRvAPZiVFebexdQ","selected":false},{"type":"Heliostat","cx":-0.02266281265513821,"cy":-0.15770674843658467,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5EhLWiwwn5wwEm8Cab5Rch","selected":false},{"type":"Heliostat","cx":-0.1322182939101059,"cy":-0.17381517206608452,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jbXdsdAziZsqZTJyYSaySe","selected":false},{"type":"Heliostat","cx":-0.3302995564539437,"cy":-0.3232776394449547,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pzkMpsvKdJRAhMZuBmbsKe","selected":false},{"type":"Heliostat","cx":-0.2919615095342722,"cy":-0.2642858401101529,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oySBSMeHYHH3hssNqfJFt4","selected":false},{"type":"Heliostat","cx":-0.3097864662694538,"cy":-0.2904751246399958,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpTYVzTYQTHThRcwDXQgp7","selected":false},{"type":"Heliostat","cx":-0.27314627742491365,"cy":-0.24237235713620253,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5jcBZmRyCrqNubtcJcYmJ3","selected":false},{"type":"Heliostat","cx":-0.2508650815059366,"cy":-0.22045887416225235,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ihBmE1AmF8hgbvfU54TBod","selected":false},{"type":"Heliostat","cx":-0.22660333483860592,"cy":-0.20175224235522163,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vNktHzm8eVBrmY9ceJEyKh","selected":false},{"type":"Heliostat","cx":-0.20333186354545205,"cy":-0.1835800857426775,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aXsDLYWFiK5tzWC7G7kV8N","selected":false},{"type":"Heliostat","cx":-0.17659442844267947,"cy":-0.16968373068602616,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wrEAnzFvbwLn8hcqMNt2T6","selected":false},{"type":"Heliostat","cx":-0.15183754408826042,"cy":-0.1589942267962943,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aHFiestWCCRbctVu4eYUBx","selected":false},{"type":"Heliostat","cx":-0.12212928286295759,"cy":-0.14937367329553564,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iQyvk9vYygwnymNpLwA1ob","selected":false},{"type":"Heliostat","cx":-0.09242102163765474,"cy":-0.14349444615618318,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wU6MsDbikDwda4SfGFTpkJ","selected":false},{"type":"Heliostat","cx":-0.06518844884779378,"cy":-0.13761521901683066,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1MMFkArxgEmQhKrKtjXQNe","selected":false},{"type":"Heliostat","cx":-0.03647046299666775,"cy":-0.13547731823888426,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nMNiG48VARtnEA4MPhmCia","selected":false},{"type":"Heliostat","cx":-0.0057719263971881,"cy":-0.13547731823888426,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"juXSYXCPjT1kSTpJyz4PZH","selected":false},{"type":"Heliostat","cx":0.021955784079761214,"cy":-0.1392186446002904,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xm44c3baqJPcnjTqQboEwN","selected":false},{"type":"Heliostat","cx":0.05265432067924076,"cy":-0.1461668221286161,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ez6bNdTTq8NKVxiW1kxkEB","selected":false},{"type":"Heliostat","cx":0.07939175578201328,"cy":-0.15525290043488818,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jAsrrCW77dFgPQqWJowsZq","selected":false},{"type":"Heliostat","cx":0.10563405319769754,"cy":-0.1664768795191066,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6p95wM2zt7dF6VyVSYTa8Y","selected":false},{"type":"Heliostat","cx":0.13286662598755838,"cy":-0.18251113535370433,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"urDco6achFzxwb6nW5NRE4","selected":false},{"type":"Heliostat","cx":0.15811864802906586,"cy":-0.1980109159938155,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nbH94KdABoDtfJEKfjLTiP","selected":false},{"type":"Heliostat","cx":0.18089498163513137,"cy":-0.21244174624495343,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ovcrGPa9SJFbnrGQ2a6DuR","selected":false},{"type":"Heliostat","cx":0.20218590217993174,"cy":-0.23328627882993053,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jA29coTpxRTwbmADu66SZT","selected":false},{"type":"Heliostat","cx":0.2234768227247321,"cy":-0.25626871219285396,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wYgH98FR9WAhRGHRksz5bD","selected":false},{"type":"Heliostat","cx":0.24229205483409053,"cy":-0.2840614223061567,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rvQJA6SbPF1oUJTEumsFBN","selected":false},{"type":"Heliostat","cx":0.26061214925636067,"cy":-0.30757833086356673,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xxokrXE6rBVWV3B4eJnjZt","selected":false},{"type":"Heliostat","cx":0.2848738959236912,"cy":-0.3102507068359997,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sAxtEYsJmsyoXdPfmuc1s8","selected":false},{"type":"Heliostat","cx":0.31161133102646393,"cy":-0.3118541324194594,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8T4wmqCeWkBAqrmuSXUrRA","selected":false},{"type":"Heliostat","cx":0.2932912366041937,"cy":-0.2824579967226693,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ai9GvKeDbhVcVvUsoTBxvk","selected":false},{"type":"Heliostat","cx":0.26655380150142116,"cy":-0.2813890463336962,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oWG4eo4MGzPtqFQEAGgS9P","selected":false},{"type":"Heliostat","cx":0.24823370707915113,"cy":-0.25680318738731295,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uxuSeH1NdDDYDjVawn2W68","selected":false},{"type":"Heliostat","cx":0.22545737347308564,"cy":-0.2290104772740102,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dDuuVxV3oBzq3KrPvkBjRs","selected":false},{"type":"Heliostat","cx":0.20367131524119686,"cy":-0.20816594468903316,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rx1WFJ81DESFNcvGrHsJMP","selected":false},{"type":"Heliostat","cx":0.17990470626095456,"cy":-0.19052826327097566,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7sGn2cqtWU3Mo7BvT3jFuk","selected":false},{"type":"Heliostat","cx":0.15415754653235875,"cy":-0.17075268107497177,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rSmf7fDWBvbLdzxL8Xzz7s","selected":false},{"type":"Heliostat","cx":0.1279152491166746,"cy":-0.1536494748514009,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dADXAPCfntwkJab6qq7kB9","selected":false},{"type":"Heliostat","cx":0.10117781401390209,"cy":-0.14082207018372264,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qou5NZoEiG4Sej8W4a1Evy","selected":false},{"type":"Heliostat","cx":0.07097441510151088,"cy":-0.12959809109950424,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qF5JaFWnyFcKW3nRxNY7TE","selected":false},{"type":"Heliostat","cx":0.040771016189119595,"cy":-0.12158096318220536,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nCPi7SMXhZTpGxpiwtL6iF","selected":false},{"type":"Heliostat","cx":0.009082204215463229,"cy":-0.11730516162631263,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dWzE58GviTnatfkWEWzyMi","selected":false},{"type":"Heliostat","cx":-0.022606607758193117,"cy":-0.11409831045939309,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iRKu923infq42Wt4hBDmAr","selected":false},{"type":"Heliostat","cx":-0.050829455922230794,"cy":-0.11677068643182602,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"r8JJG8wHFXqt3Yp7tKGhqZ","selected":false},{"type":"Heliostat","cx":-0.08251826789588713,"cy":-0.11890858720977243,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g3m5iCgTUTpwZiaw5ii9jU","selected":false},{"type":"Heliostat","cx":-0.11371194218245514,"cy":-0.12532228954361152,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tVUTkzfhBEXpMMHQ6aFPP9","selected":false},{"type":"Heliostat","cx":-0.1429250657206696,"cy":-0.13333941746091038,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jeTo5Man4ER6UL6bLqzkta","selected":false},{"type":"Heliostat","cx":-0.17065277619761887,"cy":-0.14456339654512879,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1uJtuaoB5NwSgpmJn71K67","selected":false},{"type":"Heliostat","cx":-0.19887562436165657,"cy":-0.16006317718799537,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6d39qoKyMNYsyCCMsCYFgb","selected":false},{"type":"Heliostat","cx":-0.2251179217773408,"cy":-0.17716638340883842,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"c47HFaS15SjhNgAVfkMtKh","selected":false},{"type":"Heliostat","cx":-0.2503699438188482,"cy":-0.19373511443792277,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6Fhdsjojq36iUtNfZyfuJE","selected":false},{"type":"Heliostat","cx":-0.27463169048617886,"cy":-0.21618307260635958,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pBiw2NAG9iHHT94xeKa2u3","selected":false},{"type":"Heliostat","cx":-0.29790316177933274,"cy":-0.23969998116376964,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u5PnNPgs1h8UTrfgpBZ8T6","selected":false},{"type":"Heliostat","cx":-0.3172135315757796,"cy":-0.2642858401101529,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rtSVS5mzodLcSXkBDvsbCD","selected":false},{"type":"Heliostat","cx":-0.33602876368513807,"cy":-0.2904751246399958,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2PEu3vmBctRcCsffaLpmHw","selected":false},{"type":"Heliostat","cx":-0.3642516118491758,"cy":-0.2894061742510226,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8DjkoLAZDwTnx8LtXHyg96","selected":false},{"type":"Heliostat","cx":-0.34395096667855213,"cy":-0.2621479393322064,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xggSKm6cv18X25oTxPwZS6","selected":false},{"type":"Heliostat","cx":-0.3241454591950169,"cy":-0.2343552292189037,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"74PzS5xWGKsEmxZBzdP32Z","selected":false},{"type":"Heliostat","cx":-0.3003788502147747,"cy":-0.2103038454670071,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iX6zZTVdQx5UJP9MjNZAnh","selected":false},{"type":"Heliostat","cx":-0.2766122412345324,"cy":-0.18785588729857022,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sbLC2rgU8AGXKtdt3DXoPT","selected":false},{"type":"Heliostat","cx":-0.2503699438188482,"cy":-0.1654079291301334,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4JaLAH32GnHtvkVTVkWkbH","selected":false},{"type":"Heliostat","cx":-0.22412764640316404,"cy":-0.1461668221286161,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ekeh4M3jaMmHQZ3b3gvsRs","selected":false},{"type":"Heliostat","cx":-0.19392424749077278,"cy":-0.13173599187747817,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tkth3AnLMPCi7hv9DghmT5","selected":false},{"type":"Heliostat","cx":-0.16372084857838157,"cy":-0.11623621123736702,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o3q136vYQwnzoP6GsZr4LR","selected":false},{"type":"Heliostat","cx":-0.13401258735307872,"cy":-0.10661565773660836,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7Q5q7ho8EHkiogsarQwdbr","selected":false},{"type":"Heliostat","cx":-0.09836267388271532,"cy":-0.09913300501379609,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jEaDTazLRHkWPu4uHy6TK8","selected":false},{"type":"Heliostat","cx":-0.06914955034450089,"cy":-0.09325377787444358,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4BSC1a2V48rvTMuzLPRYCD","selected":false},{"type":"Heliostat","cx":0.0937507487075764,"cy":-0.11623621123736702,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hj6QoYH2tKJMaowWF4Jso4","selected":false},{"type":"Heliostat","cx":0.05958624829847807,"cy":-0.10394328176690322,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nZGBsGGWLjxKfGS9cc7oqY","selected":false},{"type":"Heliostat","cx":0.026907160950645,"cy":-0.09752957943033631,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8ZY8shpFLkqdci1tNW1GoZ","selected":false},{"type":"Heliostat","cx":0.04869321918253367,"cy":-0.07668504684535922,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pya46vaM37X8xjgxnFRbmD","selected":false},{"type":"Heliostat","cx":0.037305052379500936,"cy":-0.047823386343083335,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sk9aYQ4ZatkgcWnoBw73BS","selected":false},{"type":"Heliostat","cx":0.32316626777261265,"cy":-0.2887703826060557,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v6iF1wnA1zBqaP8XCMzytA","selected":false},{"type":"Heliostat","cx":0.302689663582776,"cy":-0.2521615907181474,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7hRAbWEjhuuAWAcgNF2XiW","selected":false},{"type":"Heliostat","cx":-0.3022663286455178,"cy":-0.036768285775775254,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uosW5t7FWQ4a7eUdsD1TcQ","selected":false},{"type":"Heliostat","cx":0.27316237198008403,"cy":-0.2524973897551937,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4LmAuM9HRhZTEdxYDj2FKM","selected":false},{"type":"Heliostat","cx":0.1526283445468355,"cy":-0.14381713160256596,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hUgdPZt8vUMBFhHDDodoRf","selected":false},{"type":"Heliostat","cx":0.2526006849473534,"cy":-0.22571000218238366,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jj8uZxps5DeUSntdLoNoRc","selected":false},{"type":"Foundation","cx":-10.492368727264438,"cy":-365.24616728285855,"cz":3,"lx":55.33009592617107,"ly":28.860277897658587,"lz":6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarStructure":2,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{"towerHeight":115,"towerRadius":4},"id":"nHq7VyAiKvgNuPDrDMejYk","selected":false},{"type":"Heliostat","cx":-0.033635036707480734,"cy":-0.09478696259320521,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3n8DXtghY7C9fg7wtQN9mm","selected":false},{"type":"Heliostat","cx":-0.0021782029294463968,"cy":-0.09478696259320521,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3HRyeRtdwXWAfFooG7khA8","selected":false},{"type":"Heliostat","cx":-0.018309912559207595,"cy":-0.06910229279682685,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9dMgqBzGAqQQo74ehqtuvW","selected":false},{"type":"Heliostat","cx":-0.05218650278170614,"cy":-0.0712789597287233,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sM7ZRjDyGbb93H3X5XLsiN","selected":false},{"type":"Heliostat","cx":-0.08767626396718083,"cy":-0.07432629343337838,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hGv3aS4uYRq5Hg62cAQgof","selected":false},{"type":"Heliostat","cx":-0.12074626870819129,"cy":-0.07998562745630922,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"knf1JFPLgyb2dGzcbU3Hfe","selected":false},{"type":"Heliostat","cx":-0.15341298070845777,"cy":-0.09173962888855014,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eMVGrjZpnunqsrM98ZgPH2","selected":false},{"type":"Heliostat","cx":-0.07235113981890764,"cy":-0.04428828977320709,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xe6PEzZpz5DHRWEZokrjXg","selected":false},{"type":"Heliostat","cx":-0.055412844707658386,"cy":-0.014685619499415072,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7T7JfLgLbNJk4NRXzvFZJj","selected":false},{"type":"Heliostat","cx":-0.036861378633433015,"cy":-0.040805622682172714,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xyTpPrGnJXHGmcyUmTs8AF","selected":false},{"type":"Heliostat","cx":0.016373263144779018,"cy":-0.07302029327424049,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1ak6Ue1atJ663QehAMdMAS","selected":false},{"type":"Heliostat","cx":0.08412644358977613,"cy":-0.0873862950247572,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gCkqrGtT5r5WgEKYq1za1b","selected":false},{"type":"Heliostat","cx":0.11598657010855452,"cy":-0.09826962968423955,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"huYwsUKyEQrq59ExuTrPfF","selected":false},{"type":"Heliostat","cx":0.12243925396045897,"cy":-0.1265662997988937,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xrCktsCv7shjx1gwsg6JbF","selected":false},{"type":"Heliostat","cx":0.0014456646770545306,"cy":-0.04437383909501622,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wwcyQu2t5aJGnwR9kKd4wM","selected":false},{"type":"Heliostat","cx":-0.10818001791234799,"cy":-0.05010814303981461,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iKhLi69geSKfMMuqgo2q5J","selected":false},{"type":"Heliostat","cx":-0.1453658221387092,"cy":-0.05740634806046707,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pzSKSvuwPWAxvfQT9qwaND","selected":false},{"type":"Heliostat","cx":-0.17892963244691829,"cy":-0.06965690649074628,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eFq75cYfVvsfdd6UUfTojE","selected":false},{"type":"Heliostat","cx":-0.21249344275512747,"cy":-0.0842533165293234,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mrkR4hEhbnkEw1KxqSjipf","selected":false},{"type":"Heliostat","cx":-0.18738095158927312,"cy":-0.1022381789016456,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eA11DgH7cfBxpC8D2vjzCt","selected":false},{"type":"Heliostat","cx":-0.21925449806901132,"cy":-0.11657393876364154,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pehZwiBvURwYNmynuVV2oZ","selected":false},{"type":"Heliostat","cx":-0.2460572530633366,"cy":-0.10145622836371855,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cFxirFbRdujaw5Fc4RE5MD","selected":false},{"type":"Heliostat","cx":-0.25064511202632916,"cy":-0.13481945131527276,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4ypECbseMr3f8LhqjYosMu","selected":false},{"type":"Heliostat","cx":-0.2764820019758139,"cy":-0.15645341619792116,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1cNTjGeFgiYqFUnXdLBRx6","selected":false},{"type":"Heliostat","cx":-0.27696493449823417,"cy":-0.12309019324636697,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cW4SyxcnHNPzxbSE2LWbQ5","selected":false},{"type":"Heliostat","cx":-0.30642381836587107,"cy":-0.14654870938417855,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"17jGJ68AWAZgPARxJ6UPKN","selected":false},{"type":"Heliostat","cx":-0.09514083980700053,"cy":-0.016484269908978957,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k736gpzLunYF9CA2xNNwgF","selected":false},{"type":"Heliostat","cx":-0.13256811029457188,"cy":-0.02508572582617652,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bPf2FbThrjxqWcoYgrYC2A","selected":false},{"type":"Heliostat","cx":-0.015939906130075388,"cy":-0.0141384182951978,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"th3tqLRe84Jqrqfr3ZWX4Z","selected":false},{"type":"Heliostat","cx":0.021245898096285794,"cy":-0.01596296955036091,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"snGFqY54yf3wZYGqvNzdSK","selected":false},{"type":"Heliostat","cx":0.06012196615111797,"cy":-0.021957923674468315,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"p1BLYib9F5TuccAF143Meb","selected":false},{"type":"Heliostat","cx":-0.17023684704335335,"cy":-0.034469132281301135,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eFbcBWFKK11qf1tsDuwKoR","selected":false},{"type":"Heliostat","cx":-0.20790558379213483,"cy":-0.0493261925019151,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"44juECoBc4iyV5WsYrieZZ","selected":false},{"type":"Heliostat","cx":-0.24243525914518455,"cy":-0.06652910433631024,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"abfBabbkXEUrKZnAsNhn3Y","selected":false},{"type":"Heliostat","cx":-0.2759990694533937,"cy":-0.08790241903964963,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eAEEf1jS8EeUmfDXwtgbsh","selected":false},{"type":"Heliostat","cx":-0.3090799472391825,"cy":-0.11214288571263284,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rYpKyT7tWdyjcNbsGsDtpP","selected":false},{"type":"Heliostat","cx":-0.3390217636292396,"cy":-0.13898985418418947,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h7WTnDPjYZa2yv9AbeqYi8","selected":false},{"type":"Heliostat","cx":-0.30346193456733533,"cy":-0.18027347486919182,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tpzWYwzqd7mz7PeBQzCqEF","selected":false},{"type":"Heliostat","cx":-0.3273202794054188,"cy":-0.20565406429518426,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nV956oZbqiSHUewdzFEGwb","selected":false},{"type":"Heliostat","cx":-0.35187017047069313,"cy":-0.23327411749405838,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eotKsPbyYbFr8f4YZHBPV5","selected":false},{"type":"Heliostat","cx":-0.3729623304000133,"cy":-0.26388012239010805,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4xcMmwR2N7YaJDgjrvx9Tg","selected":false},{"type":"Heliostat","cx":-0.38229820446708945,"cy":-0.23140789768332368,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sfWCB3P6rkqZa4YAEd5bcf","selected":false},{"type":"Heliostat","cx":-0.3594771789697922,"cy":-0.200428648825127,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vHAMJhEkjkYLc4RSjerC3B","selected":false},{"type":"Heliostat","cx":-0.3328526492229454,"cy":-0.1713156197776651,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qTSMmo3sfM3tmeNsXwJ95x","selected":false},{"type":"Heliostat","cx":-0.3674299605824867,"cy":-0.16832966808048952,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kijHzENJV8TJe21WNjQuUC","selected":false},{"type":"Heliostat","cx":-0.3916340785341656,"cy":-0.19893567297653922,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"49c4EBZdrrGLx2C1jkrU34","selected":false},{"type":"Heliostat","cx":-0.400278406374051,"cy":-0.16571696034546088,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nmEdqVEsjHqXFAfs271Hv4","selected":false},{"type":"Heliostat","cx":-0.3712334648320363,"cy":-0.13063202790364783,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iXeSufYc6rqYVyGdq4x3at","selected":false},{"type":"Heliostat","cx":-0.2761458585932977,"cy":-0.05187755189064192,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bevRTnppC9h4ebQw9qu31Y","selected":false},{"type":"Heliostat","cx":-0.1969638155799482,"cy":-0.01529964360024112,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"etWFnXE45z2CNE1YXRNVxb","selected":false},{"type":"Heliostat","cx":-0.11501558765783529,"cy":0.010080945825751317,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpZi9pr2vKF4BbVGupqEXc","selected":false},{"type":"Heliostat","cx":-0.40753964175955465,"cy":-0.12764607620647225,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7YdgbS7MbyK8fpmsbE8Fq6","selected":false},{"type":"Heliostat","cx":-0.417912835167417,"cy":-0.0933076316889531,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3mPyk4qt31Y1bUaJMpdRT5","selected":false},{"type":"Heliostat","cx":-0.38056933889911243,"cy":-0.10039926696974508,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"boS825hvqkSAd3EMruDUop","selected":false},{"type":"Heliostat","cx":-0.35532790160664735,"cy":-0.07501867754375265,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6neahnPeogbncgiTuDRsB6","selected":false},{"type":"Heliostat","cx":-0.32870337185980053,"cy":-0.05337052773647434,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6JURGXaMnDK92DSmeMdQDb","selected":false},{"type":"Heliostat","cx":-0.3892136667389977,"cy":-0.06531433452790446,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5mdtK7mbfjWr2ZwvqtMZoW","selected":false},{"type":"Heliostat","cx":-0.3608602714241738,"cy":-0.03956050113976511,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7iLWKe2jZRMk3NyRqmNQUd","selected":false},{"type":"Heliostat","cx":-0.3318153298821592,"cy":-0.018658839259536052,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6ZLXjXtPYgTp5YsiDKt92R","selected":false},{"type":"Heliostat","cx":-0.30346193456733533,"cy":-0.00036988511433561826,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n8SHGbk2vJK2DPuaoNHYXh","selected":false},{"type":"Heliostat","cx":-0.27545431236610685,"cy":-0.0197785711459769,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2SSpgdAk9FyHtarh2kemjh","selected":false},{"type":"Heliostat","cx":-0.427940255461684,"cy":-0.05598323547423079,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cxfJsRXsJGHcRLJiW1ZC4T","selected":false},{"type":"Heliostat","cx":-0.3978579945788831,"cy":-0.026123718502475,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"983fNrC7GvsmHKyDBU7uKS","selected":false},{"type":"Heliostat","cx":-0.3660468681281051,"cy":-0.000743129076482581,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aCoTGoQTygQRfEwZWp9pEu","selected":false},{"type":"Heliostat","cx":-0.24986710196004633,"cy":-0.005222056622245941,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rAPfaS9ZavWB56qRknahL4","selected":false},{"type":"Heliostat","cx":-0.27545431236610685,"cy":0.01642609318227701,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7aTwzASE97BSxQ69zqRKB9","selected":false},{"type":"Heliostat","cx":-0.22013061419084085,"cy":0.007468238090750264,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6d8F7whR2UWQ5Rpw6zgpoS","selected":false},{"type":"Heliostat","cx":-0.24779246327847385,"cy":0.03135585166815488,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gs9ZBEK1748RpsjnfsZckK","selected":false},{"type":"Heliostat","cx":-0.21840174862286374,"cy":0.042926414494710276,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2QLnVz31nbfJHbaqyshx4N","selected":false},{"type":"Heliostat","cx":-0.19316031133039863,"cy":0.019038800917305643,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bT2uoRqcV2JsvxKNXGq7Tp","selected":false},{"type":"Heliostat","cx":-0.16411536978838387,"cy":0.029116387895273214,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wDnu6VsXGRf96DxoNbPRXh","selected":false},{"type":"Heliostat","cx":-0.18797371462646742,"cy":0.052630757510530896,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7fXVXPkHvH4EiWQgs5X5EV","selected":false},{"type":"Heliostat","cx":-0.1578914537436665,"cy":0.06233510052635154,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iVLsKahc6Jz8H79epHER9m","selected":false},{"type":"Heliostat","cx":-0.13472465513277385,"cy":0.03658126713821217,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2W1dZKG5G4kdvvYuTKg6J8","selected":false},{"type":"Heliostat","cx":-0.10637125981794995,"cy":0.041806682608269405,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8RbNvvwi1FQxJhzm68oxMb","selected":false},{"type":"Heliostat","cx":-0.07594322582155359,"cy":0.04628561015403278,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rv9MXPBD3e63TfH2kDubmC","selected":false},{"type":"Heliostat","cx":-0.03064694794055447,"cy":0.016426093179521616,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eoYDEHmumqWS9SMAreWLME","selected":false},{"type":"Heliostat","cx":-0.0451694187115619,"cy":0.04889831788903389,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nisA2ZxiN5cGyrqqmqFcTt","selected":false},{"type":"Heliostat","cx":-0.4355472639607831,"cy":-0.018285595297416656,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9uTLgXRt31u5LbkmoNmmzh","selected":false},{"type":"Heliostat","cx":-0.44280849934628674,"cy":0.024264216387335374,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"arUmBddCd3ZN9RM4YvwTeh","selected":false},{"type":"Heliostat","cx":-0.40096995260124174,"cy":0.009707701863604397,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"voKSeBcj1DBKGLLTkPQVxi","selected":false},{"type":"Heliostat","cx":-0.3681215068096776,"cy":0.038074242986772415,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"55CnZxFzVkzTP2ZZcBc3GF","selected":false},{"type":"Heliostat","cx":-0.4082311879867454,"cy":0.05337724543479727,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"72WvPCXQWgeW6smtGCDqkn","selected":false},{"type":"Heliostat","cx":-0.4500697347317904,"cy":0.06793375995852818,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2C1jZdwUGxFZt8JTCcp2dF","selected":false},{"type":"Heliostat","cx":-0.40892273421393627,"cy":0.097793276930284,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pUaEdfwMSZ7FJNPu8MbTVu","selected":false},{"type":"Heliostat","cx":-0.37192501105922715,"cy":0.07763810297434884,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rqc5Shh25yv3QUcC5PJfr7","selected":false},{"type":"Heliostat","cx":-0.3352730610181133,"cy":0.019412044879425033,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3cBVQbPPnpMt6C62XatwGo","selected":false},{"type":"Heliostat","cx":-0.3058823463625032,"cy":0.03956721883536021,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8B4aaX12Cwz7SWukzQHxfu","selected":false},{"type":"Heliostat","cx":-0.3359646072453042,"cy":0.05897590486975687,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8js9abopRBUDoNq8C8Vkee","selected":false},{"type":"Heliostat","cx":-0.30415348079452614,"cy":0.07726485901222946,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wSFcW9Bi2CEV2NiqkVLGgK","selected":false},{"type":"Heliostat","cx":-0.2761458585932977,"cy":0.05748292901568581,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oEtkxCk7V55pZMXbYEUFoy","selected":false},{"type":"Heliostat","cx":-0.3373476996996858,"cy":0.09891300881948024,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7JVKmoPwsr4YiKcdWdSdzy","selected":false},{"type":"Heliostat","cx":-0.24433473214251972,"cy":0.06979997976653508,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i7yUerNEdQNGoZikCwAKi5","selected":false},{"type":"Heliostat","cx":-0.27234235434374815,"cy":0.09443408127096152,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gK1KuDQ1xA1jepW3pkMSYy","selected":false},{"type":"Heliostat","cx":-0.21321515191893256,"cy":0.08472973825514087,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"b4J6Xf2MrSmiCKmRPp5JwY","selected":false},{"type":"Heliostat","cx":-0.1807124792409637,"cy":0.09406083730881452,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nKkV64v1XzdkrnhFcrMZoK","selected":false},{"type":"Heliostat","cx":-0.24053122789297018,"cy":0.10787086390825154,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xgNnXwqvuHbn1SRpxKx5iF","selected":false},{"type":"Heliostat","cx":-0.14820980656299493,"cy":0.10301869240034127,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h9437PNFcensdgYCPvaUZ9","selected":false},{"type":"Heliostat","cx":-0.12573455417929308,"cy":0.07054646769355681,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mN7BSbm2K54or4ve2veKYY","selected":false},{"type":"Heliostat","cx":-0.09599806641008757,"cy":0.0757718831636141,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vnVRMYugJhGEe7GvuV5yNs","selected":false},{"type":"Heliostat","cx":-0.11466981454423983,"cy":0.1086173518325455,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bccxZepk5qSe634uWX42ei","selected":false},{"type":"Heliostat","cx":-0.061766528164141625,"cy":0.07913107882293664,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i6mjvJmXWoNbbtScNe4jLc","selected":false},{"type":"Heliostat","cx":-0.02995540171336369,"cy":0.07987756674723054,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kgFQrpmB4Uo3QRzYrM9z5D","selected":false},{"type":"Heliostat","cx":-0.016470250283142505,"cy":0.04889831788903389,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i8SzwQJPy7H5YyXTGe1xVc","selected":false},{"type":"Heliostat","cx":-0.0026393257393260423,"cy":0.016426093182249437,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"apvcd8RadTsSXecLmteBdy","selected":false},{"type":"Heliostat","cx":0.015340876167635433,"cy":0.046658854116152185,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"12C7onFbSbSHFPJc8uUrKy","selected":false},{"type":"Heliostat","cx":0.03332107807459691,"cy":0.07539863920146715,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gb2pH6ANCuJC8qsYCvxT6m","selected":false},{"type":"Heliostat","cx":0.0015099516238188731,"cy":0.0757718831636141,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tkeABsZCEiybQvrrxUR8jq","selected":false},{"type":"Heliostat","cx":0.044731590823245536,"cy":0.04329965845682966,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hg9DPmH5cjxeCBJWkCFhVc","selected":false},{"type":"Heliostat","cx":0.06340333895739782,"cy":0.07017322373140988,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oJz5XyB57AT2gBG4awFXj6","selected":false},{"type":"Heliostat","cx":0.05095550686796301,"cy":0.10936383975683939,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tHRNmQUNj6K1TnE56YNmfY","selected":false},{"type":"Heliostat","cx":0.01983592664437585,"cy":0.11197654749186799,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpjExf4xnHsCihbG1Z3uYw","selected":false},{"type":"Heliostat","cx":-0.01301251914718843,"cy":0.11421601126474966,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sBN5FEivyAsVk4UNG51jA7","selected":false},{"type":"Heliostat","cx":-0.04551519182515727,"cy":0.11048357164328021,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8pUZKWg5usB1LmJ4FqHgif","selected":false},{"type":"Heliostat","cx":-0.08147559563908026,"cy":0.1112300595675741,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"23RBiRbrVGDew4P5junKUY","selected":false},{"type":"Heliostat","cx":0.07446807859245108,"cy":0.03732775506247852,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tDUutW1fYKC3zU8km6x7oT","selected":false},{"type":"Heliostat","cx":0.08172931397795467,"cy":0.0033625545071062956,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t5hoPXGgvmAKCC98bFLoS1","selected":false},{"type":"Heliostat","cx":0.07101034745649691,"cy":-0.05411701566352362,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ffh2ust2D3LvEonm64PhVV","selected":false},{"type":"Heliostat","cx":0.09735040458634132,"cy":-0.0309061006268814,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1vWwMCYh2GFGH8H8yyPFj7","selected":false},{"type":"Heliostat","cx":0.10692860717901208,"cy":-0.06523213814288877,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a7CNQPaFqLRU1KsDr6sWL1","selected":false},{"type":"Heliostat","cx":0.13259819012736962,"cy":-0.0433131021386913,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dWyjm3KRE2b2cp2DQn99im","selected":false},{"type":"Heliostat","cx":0.1417932646163335,"cy":-0.07970697324000028,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4BSY8QjyTYnsJg4VvVw4dF","selected":false},{"type":"Heliostat","cx":0.14447516134228128,"cy":-0.11237874388776634,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pWN8hVQSUWP9zSJ9mBA4u6","selected":false},{"type":"Heliostat","cx":0.17282664101658657,"cy":-0.09790390879065478,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vwjTwcPDdQ84YqGSgB7GCM","selected":false},{"type":"Heliostat","cx":0.16899535997951837,"cy":-0.05944220410404414,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2uj8zbaPpR6EuihS2a1eyt","selected":false},{"type":"Heliostat","cx":0.16516407894245005,"cy":-0.027184000173338437,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jTBqs9gubADDLHUczweTht","selected":false},{"type":"Heliostat","cx":0.17704105015736168,"cy":-0.13098924615548113,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9rczuT28G81XBnJWyv8p47","selected":false},{"type":"Heliostat","cx":0.18010607498701633,"cy":-0.1611796165036406,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"c3Mvio8y22xwBSB8LsByak","selected":false},{"type":"Heliostat","cx":0.20424314552054657,"cy":-0.08136124010826916,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ir46DZVbKinR95v215bS7Z","selected":false},{"type":"Heliostat","cx":0.20424314552054657,"cy":-0.11775511120957816,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"njGEA2SJu4eVEC5eQQDDW1","selected":false},{"type":"Heliostat","cx":0.20615878603908072,"cy":-0.1537354155938268,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9KeeMj5e9pcmeJWLsZy8iA","selected":false},{"type":"Heliostat","cx":0.20769129845390802,"cy":-0.18020368548568788,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8fkWUtc7gCzjPcENNAC8Zy","selected":false},{"type":"Heliostat","cx":0.23106211278002461,"cy":-0.2037769883581267,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uuc6jUmEutuWsardRqMkFX","selected":false},{"type":"Heliostat","cx":0.23144524088373142,"cy":-0.172759484578602,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sE5cQvdygFYu5rEEvgstNz","selected":false},{"type":"Heliostat","cx":0.23336088140226557,"cy":-0.1396741472137756,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tBMpyUhxX17cCUPtBhbcxe","selected":false},{"type":"Heliostat","cx":0.23451026571338607,"cy":-0.10493454298070795,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dqzcMfJ4ym9JvrApbs8TiH","selected":false},{"type":"Heliostat","cx":0.239107802957868,"cy":-0.06978137203057995,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9wqmsXX7SDkbVjcEEQp2vy","selected":false},{"type":"Heliostat","cx":0.263628001595105,"cy":-0.1322299463066897,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ca7PcPtrbnFPvGWK55EzEv","selected":false},{"type":"Heliostat","cx":0.26247861728398447,"cy":-0.166555983822697,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8xXw6WsWAYY3TxnJd1hKSR","selected":false},{"type":"Heliostat","cx":0.2574979519357958,"cy":-0.20005488790458376,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tGtL7cXW4ctq2Uq6fzc5Ri","selected":false},{"type":"Heliostat","cx":0.29197948126941037,"cy":-0.15414898231088717,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2r3Fu8Vht4LfDNGkzD7AvK","selected":false},{"type":"Heliostat","cx":0.28814820023234206,"cy":-0.1930242537145581,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uFPPCk3ug65jVcFFKfczUf","selected":false},{"type":"Heliostat","cx":0.2801025100544987,"cy":-0.2236281907770225,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rW95SzX5M1aYg6UfYWzGAM","selected":false},{"type":"Heliostat","cx":0.10462983855677109,"cy":0.02864750662977845,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dRWphEN9DXnANHh3HGV9Tw","selected":false},{"type":"Heliostat","cx":0.09505163596410039,"cy":0.06380067757990648,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"f3KHqcW8BgK3tf3keNrHS8","selected":false},{"type":"Heliostat","cx":0.12646814046806035,"cy":0.055942909955760275,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1mJ8JwzL5NHxUYw6Tb4Etj","selected":false},{"type":"Heliostat","cx":0.13068254960883546,"cy":0.019135472137390887,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3pkNWKyy5jkQRFLV2tqeZu","selected":false},{"type":"Heliostat","cx":0.15635213255719296,"cy":0.04270877500982969,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gMemMLxQbof4Hnm4rEqFfH","selected":false},{"type":"Heliostat","cx":0.1513714672090042,"cy":0.08571971358410398,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pBbkhYbWAwoxYepnBMn2ZE","selected":false},{"type":"Heliostat","cx":0.1820217155055505,"cy":0.07124487848974785,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3PFAWYvLqr3uBjfJT2HqhF","selected":false},{"type":"Heliostat","cx":0.1617159260090886,"cy":0.005901337191487905,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wAsMtRtTkzAZzoJ2RJuqNS","selected":false},{"type":"Heliostat","cx":0.1866192527500325,"cy":0.03030177349804736,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n8Qqyi38hh2Cq2Rg8LRWsK","selected":false},{"type":"Heliostat","cx":0.1881517651648598,"cy":-0.0065056643203219655,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aTmzkSNn2tGVv3B7EjqNq9","selected":false},{"type":"Heliostat","cx":0.21420447621692415,"cy":0.016240505117996153,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oboEC75Sh6grnL1ugtrAZQ","selected":false},{"type":"Heliostat","cx":0.21267196380209683,"cy":0.05635647667009271,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"txMcY9WtX2FmTTTqJTDcKZ","selected":false},{"type":"Heliostat","cx":0.21535386052804464,"cy":-0.01932623254921973,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xeQUeinFn2YWLHA81FyBh1","selected":false},{"type":"Heliostat","cx":0.2433222120986431,"cy":-0.0007157302815049064,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mX9ZXrGRLU9CBRLNchW8ou","selected":false},{"type":"Heliostat","cx":0.2417896996838158,"cy":-0.03628246794869324,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rJwEb8gHQVFi61bjjyYKc7","selected":false},{"type":"Heliostat","cx":0.241406571580109,"cy":0.0398138079904074,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9XuvM5Tt9pWjTTWzyKkrHv","selected":false},{"type":"Heliostat","cx":0.241406571580109,"cy":0.07744837924289738,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3YjVMHkvo8t3pPXSKyVA2j","selected":false},{"type":"Heliostat","cx":0.27205681987665525,"cy":0.05842431025812222,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"c4jmXgazz6s47tNDfcuR2H","selected":false},{"type":"Heliostat","cx":0.27320620418777575,"cy":0.02037617228857191,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fzYUTKuZB2g898qPKopLu6","selected":false},{"type":"Heliostat","cx":0.27090743556553476,"cy":-0.01973979926628006,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ezm9yDFEjEYm2TtNgfysUH","selected":false},{"type":"Heliostat","cx":0.26516051400993235,"cy":-0.053652270065227096,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a8WSwg1KasTJjpUskv4dYS","selected":false},{"type":"Heliostat","cx":0.29044696885458304,"cy":-0.07350347248412291,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ghekwWKHGiE7zrCodtNu1D","selected":false},{"type":"Heliostat","cx":0.2958107623064787,"cy":-0.03876386825105522,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rNNdsfuPqE1EPczC46MeS2","selected":false},{"type":"Heliostat","cx":0.3004082995509606,"cy":0.00011140315261576157,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4Chbg5MtX5989PatXAvQ1e","selected":false},{"type":"Heliostat","cx":0.30423958058802886,"cy":0.0385731078392264,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2W9vhrDsJ8DwZBrvsuaxMH","selected":false},{"type":"Heliostat","cx":0.33450670078086836,"cy":0.012518404664425633,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eRsGbJw5AvY9EH6xgwRHFB","selected":false},{"type":"Heliostat","cx":0.33297418836604104,"cy":-0.023875466436883364,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"83tmu295aDGPuUQDG8irif","selected":false},{"type":"Heliostat","cx":0.32224660146224987,"cy":-0.06399143799173532,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9j8V5Vajb7oyLaPxiuJtfW","selected":false},{"type":"Heliostat","cx":0.31573342369923374,"cy":-0.09831747550774267,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"itsvnfebiYWqAJ69gutWHW","selected":false},{"type":"Heliostat","cx":0.3590268994181054,"cy":-0.05075730304580478,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wz22ek3hjYTur5JCY2Nij9","selected":false},{"type":"Heliostat","cx":0.38929401961094495,"cy":-0.08053410667414851,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2ztRUM2FUvLR438Y5J9EgX","selected":false},{"type":"Heliostat","cx":0.3490655687217279,"cy":-0.08963257444947577,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"471Dah549XrTt5dob8iJnR","selected":false},{"type":"Heliostat","cx":0.37588453598120586,"cy":-0.12023651151194013,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"p1pbcbEdVAG2P5ABxQu5Ke","selected":false},{"type":"Heliostat","cx":0.3402536223364709,"cy":-0.12478574539960376,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"47fgpHN5zioMupSTaZWDSp","selected":false},{"type":"Heliostat","cx":0.3647738209737079,"cy":-0.15249471544264584,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pCDe1bzWHZ6jS57fAK8pwn","selected":false},{"type":"Heliostat","cx":0.3295260354326796,"cy":-0.15828464948149043,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uCcRtCsumKV9DfWxadqTW5","selected":false},{"type":"Heliostat","cx":0.3574943870032782,"cy":-0.19219712028043748,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ayXH3c1sFzNjaSdMZ81p9c","selected":false},{"type":"Heliostat","cx":0.3184153204251815,"cy":-0.18640718624159286,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4evv7fQdgSNSipNwTWwGwC","selected":false},{"type":"Heliostat","cx":0.3437017752698323,"cy":-0.22156035719172085,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rAh8823N9Vwi6vKYFAJd2C","selected":false},{"type":"Heliostat","cx":0.3122852707658723,"cy":-0.22280105734290184,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5PCkHADofgHMwo1pjfyL9y","selected":false},{"type":"Heliostat","cx":0.3333573164697478,"cy":-0.2554728279906679,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3xqoNyUGDK5ydaeVXeiyKG","selected":false},{"type":"Heliostat","cx":0.39810596599620196,"cy":-0.04538093572674829,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aW5zhg7bZS1fUR7XJst2Gi","selected":false},{"type":"Heliostat","cx":0.36630633338853513,"cy":-0.01353629851037508,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gQLhow3fXWpMkfRe8wtCzu","selected":false},{"type":"Heliostat","cx":0.40883355289999307,"cy":-0.007332797754470145,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"knRosv43m5AQ9razdiCqcM","selected":false},{"type":"Heliostat","cx":0.3735857673589649,"cy":0.024511839459175226,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eEqU4FAzLxkJH9Tf34bQUP","selected":false},{"type":"Heliostat","cx":0.3402536223364709,"cy":0.05304794293633799,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hZpNgZfZfytEBxpebNdzEb","selected":false},{"type":"Heliostat","cx":0.3053889648991494,"cy":0.07662124580877676,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6EPw6254wjubgGXjScbc35","selected":false},{"type":"Heliostat","cx":0.27129056366924165,"cy":0.09729958166179327,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"79MBztAVAqPVNos51gf6eg","selected":false},{"type":"Heliostat","cx":0.24293908399493633,"cy":0.11673721736362871,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eXofdMYHTSynXhcqPKpjbV","selected":false},{"type":"Heliostat","cx":0.20960693897244223,"cy":0.09026894747176761,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cj1HzxwMYNjCeedqVrynoE","selected":false},{"type":"Heliostat","cx":0.20769129845390807,"cy":0.13162561917780058,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8SqHt7enenNVrryGKLRHHj","selected":false},{"type":"Heliostat","cx":0.41956113980378434,"cy":0.0365052742539248,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qoiTBXczJ25keVDxYZkuSh","selected":false},{"type":"Heliostat","cx":0.38009894512198106,"cy":0.07000417833581148,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7VCY1aEW3s9HeKvSty5XL2","selected":false},{"type":"Heliostat","cx":0.41956113980378434,"cy":0.088201113886466,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fbUybRMcP7qMoBEYqmnx6h","selected":false},{"type":"Heliostat","cx":0.3444680314772459,"cy":0.0993674152470949,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sxsUBxLvQKPU2sAKzPcwC8","selected":false},{"type":"Heliostat","cx":0.3820145856405152,"cy":0.12335428483659402,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5V4WAQXnKXNyTXXR6qBDXx","selected":false},{"type":"Heliostat","cx":0.3069214773139766,"cy":0.12459498498777499,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"utggTKHEx3AjG5Z1EoMDCs","selected":false},{"type":"Heliostat","cx":0.3452342876846595,"cy":0.14775472114315344,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uPUupWhDTobXtkfAk4CHMp","selected":false},{"type":"Heliostat","cx":0.1758916658462413,"cy":0.10929301645654278,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v4iP1MonNTVEo1nyN2hwab","selected":false},{"type":"Heliostat","cx":0.1410270084089199,"cy":0.12045931781717169,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8V8hDrjxrjeZN3UkWbonBQ","selected":false},{"type":"Heliostat","cx":0.118422450290217,"cy":0.09564531479355189,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bqVYQHX1yQnt7BZjYd9afT","selected":false},{"type":"Heliostat","cx":0.08585656147513654,"cy":0.10308951570063785,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3YF4NAGXk4jm9beYYTb7SN","selected":false},{"type":"Heliostat","cx":0.10999363200866677,"cy":0.12873065215837826,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7s9yjAjPK8QCDpuAxkaDQK","selected":false},{"type":"Heliostat","cx":0.13528008685331744,"cy":0.15892102250378232,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ueGb2uspjMAYZriJiCCScw","selected":false},{"type":"Heliostat","cx":0.17091100049805252,"cy":0.1489954212943344,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kR8wrTUausCmyTieuq4dHH","selected":false},{"type":"Heliostat","cx":0.2735893322914826,"cy":0.14279192053842946,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"m8S6ZiPTBsqdQVioZbCw5M","selected":false},{"type":"Heliostat","cx":0.23719216243933391,"cy":0.16222955624026494,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4MeKS14wCpVzh8CtWpLZum","selected":false},{"type":"Heliostat","cx":0.20117812069089197,"cy":0.17753152477149714,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fCUJrfBrQ7HRvGk8i2jeaR","selected":false},{"type":"Heliostat","cx":0.310752758351045,"cy":0.1696737571473509,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3hbDt2ugbLLKbd29gwYrUC","selected":false},{"type":"Heliostat","cx":0.38546273857387664,"cy":0.17008732386441117,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hvEWWKEMAmdPXEoa4V4QAu","selected":false},{"type":"Heliostat","cx":0.09811666079375506,"cy":0.17091445729853186,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aV6CVn4L6wr2GaKZrT1Vjm","selected":false},{"type":"Heliostat","cx":0.0739795902602248,"cy":0.13658841978252445,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"r3m2DEYQLd3mBwfFtEcVau","selected":false},{"type":"Heliostat","cx":0.0375824204080761,"cy":0.14237835382136915,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e3Lco1rBEM6kMAUmL9NLgr","selected":false},{"type":"Heliostat","cx":0.06248574714901997,"cy":0.1758772579032558,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"18MGWB6ff2CJeKikAUYJnL","selected":false},{"type":"Heliostat","cx":0.0031008910744615347,"cy":0.14610045427766746,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fYFCkzek2ccB6Pe6iDrEb1","selected":false},{"type":"Heliostat","cx":-0.029464997740618924,"cy":0.1469275877090603,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6K52upKmX7aSVP2ujZ9n2m","selected":false},{"type":"Heliostat","cx":-0.06624529569647447,"cy":0.14527332084081898,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5tcTbFYhFAxjhJQRk4KSQo","selected":false},{"type":"Heliostat","cx":0.02685483350428495,"cy":0.18084005850797985,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n61CQiJbnjFcrmJ4Qd5q6E","selected":false},{"type":"Heliostat","cx":-0.013373617384932066,"cy":0.18249432537622118,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rtxr56Ffqv7oisuWAfzE9f","selected":false},{"type":"Heliostat","cx":-0.05015391534078766,"cy":0.18290789209603692,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ssnbBpNmb57x9QcPXWiUPm","selected":false},{"type":"Heliostat","cx":-0.089616110022591,"cy":0.18166719193937264,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"abSokmDd3oxiagFbwYw4gT","selected":false},{"type":"Heliostat","cx":-0.09881118451155492,"cy":0.14320548725548987,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wuQC7dYsNVP7PrDHN1NRGs","selected":false},{"type":"Heliostat","cx":-0.12524702366732607,"cy":0.17753152477149722,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6aJAfZK2dApF6de3TZNo36","selected":false},{"type":"Heliostat","cx":-0.13827337919335825,"cy":0.1365884197825246,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xqsuyu9jqMNNR21mXVQ1a5","selected":false},{"type":"Heliostat","cx":-0.17275490852697287,"cy":0.12997135230955933,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"swiDJhjoNyhP63XMsVg6ur","selected":false},{"type":"Heliostat","cx":-0.16087793731206115,"cy":0.17050089058147164,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aWi6rcrzKqVDW7CfrF1871","selected":false},{"type":"Heliostat","cx":-0.19804136337162356,"cy":0.1618159895232047,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iYUqz4sh2LFY1owPxxLGX1","selected":false},{"type":"Heliostat","cx":-0.23597104563859955,"cy":0.14899542129433452,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vv5n4PmfmBKXSGGNbevTey","selected":false},{"type":"Heliostat","cx":-0.14402030074896066,"cy":0.21144399557044424,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6afKxsaAMJBNRnAKoKzPU4","selected":false},{"type":"Heliostat","cx":-0.18654752026041868,"cy":0.2039997946633583,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1YsLhxgaZg9Q87hZLXmeRs","selected":false},{"type":"Heliostat","cx":-0.22486033063110153,"cy":0.19200635986860873,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2d8xeYnZjcK5AiBTwEWzgx","selected":false},{"type":"Heliostat","cx":-0.1091556433116393,"cy":0.21930176319459052,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vckAj7b593ahoDXTD68N3y","selected":false},{"type":"Heliostat","cx":-0.07045970483724957,"cy":0.22095603006283185,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6pp7NwNe4PgJKBVJsV7dGd","selected":false},{"type":"Heliostat","cx":-0.03214689446656673,"cy":0.22095603006283185,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1pADApoC8hWnpbvYEvM5UA","selected":false},{"type":"Heliostat","cx":0.010763453148598107,"cy":0.2197153299116508,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4PGQjGdFqm6pw32fwJZufu","selected":false},{"type":"Heliostat","cx":0.04831000731186732,"cy":0.21847462976046983,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oR8yoN1AtfF6iLT3X2SqWy","selected":false},{"type":"Heliostat","cx":0.08930471440849803,"cy":0.21061686213632358,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nETqDwZvxQ1dJWeqM7Z2dH","selected":false},{"type":"Heliostat","cx":0.12608501236435357,"cy":0.20151839436099633,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o4tZaxHBZHKFtmG7xSce1i","selected":false},{"type":"Heliostat","cx":0.16363156652762278,"cy":0.19117922643448812,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"csmW9k51tdyoZ24jFE76GS","selected":false},{"type":"Heliostat","cx":0.19543119913528956,"cy":0.22385099708225412,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pBFBKRX26RSYKyWNZJF5qd","selected":false},{"type":"Heliostat","cx":0.23336088140226563,"cy":0.20772189511690126,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vRw1xgf1Qf5Yz5VVToBzXd","selected":false},{"type":"Heliostat","cx":0.2716736917729485,"cy":0.1899385262833071,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rEtpBVboMR7XjEgcux4547","selected":false},{"type":"Heliostat","cx":0.3076877335213904,"cy":0.21888819647753016,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2FCByMFsbYZPgKoVW6ncqW","selected":false},{"type":"Heliostat","cx":0.34791618441060734,"cy":0.19490132688803105,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7CpYfRknsBW7rVbRGTPnhL","selected":false},{"type":"Heliostat","cx":0.3460005438920733,"cy":0.24494289965233088,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dMS3yRiwnF88dhiVtoh9c5","selected":false},{"type":"Heliostat","cx":0.3015576838620812,"cy":0.27223830297831264,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dbBWX8iuPtZmjpKk4PQdKc","selected":false},{"type":"Heliostat","cx":0.26937492315070755,"cy":0.23708513202818465,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dYZSyQzqqkq28acBvqThmF","selected":false},{"type":"Heliostat","cx":0.22838021605407682,"cy":0.2548685008617788,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pQGbd5QAk8pPfgDRf2pnvw","selected":false},{"type":"Heliostat","cx":0.2640111296988119,"cy":0.29002167181190686,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gKRa4wpCCZ2YuQXE517nZ2","selected":false},{"type":"Heliostat","cx":0.21880201346140607,"cy":0.3073914739284407,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uCywX5XZ4CUAJkRyS3FniH","selected":false},{"type":"Heliostat","cx":0.1858529965426188,"cy":0.2709976028271317,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2UPLQMCooiMhFJtDN26CC2","selected":false},{"type":"Heliostat","cx":0.15405336393495203,"cy":0.23584443187700366,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9gstuVGZgNt34bwx4fWbUR","selected":false},{"type":"Heliostat","cx":0.14370890513486767,"cy":0.28423173777306227,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4b4VML3sa7hnY6ghXF3UUH","selected":false},{"type":"Heliostat","cx":0.11229240063090776,"cy":0.24783786667175325,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wgdCGQw8TMgPeJVmJu1z5p","selected":false},{"type":"Heliostat","cx":0.1007985575197029,"cy":0.2896081050948465,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"waxnrKabumqfqY9nszwBCu","selected":false},{"type":"Heliostat","cx":0.0728302059491044,"cy":0.25652276773002014,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sYDz76fyRaQEPaspZ2rJP4","selected":false},{"type":"Heliostat","cx":0.17512540963882764,"cy":0.3206256088743712,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pazgCfCXnKgDa4L3VRZcx5","selected":false},{"type":"Heliostat","cx":0.031452370748766875,"cy":0.2598313014665028,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"r7WAJSEpjF1v6Y8RpDz5PJ","selected":false},{"type":"Heliostat","cx":0.05788820990453806,"cy":0.2991201395872341,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9eZTFADerf4QWheHy8QGKH","selected":false},{"type":"Heliostat","cx":0.011912837459718613,"cy":0.3049100736260787,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sNRuKArsN6PvUBVAmpBhxu","selected":false},{"type":"Heliostat","cx":-0.03214689446656673,"cy":0.30821860736256135,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ofECbbJ9gme6LxsuNXNjgk","selected":false},{"type":"Heliostat","cx":-0.009542336347863806,"cy":0.2635534019200458,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v9J8DuLJH4a96cz44K2xmP","selected":false},{"type":"Heliostat","cx":-0.05206955585932177,"cy":0.26313983520298545,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9a9woYxqpxa3DPpGkexnDn","selected":false},{"type":"Heliostat","cx":-0.07505724208173149,"cy":0.3049100736260787,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"btMDteQZ9ZwHR2ZJEJPqTR","selected":false},{"type":"Heliostat","cx":-0.11835071780060315,"cy":0.30036083973841504,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3R6fjmFqnVAn6gX7NVbg6T","selected":false},{"type":"Heliostat","cx":-0.09344739105965931,"cy":0.2598313014665028,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"biLXxZamzgN1buUB8TsZqZ","selected":false},{"type":"Heliostat","cx":-0.13520835436370363,"cy":0.25445493414471854,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fExb7vHaSjiVqB5MGACC4u","selected":false},{"type":"Heliostat","cx":-0.16241044972688845,"cy":0.2958116058507515,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iAmRb8oDGZX392ae33MR49","selected":false},{"type":"Heliostat","cx":-0.17581993335662746,"cy":0.24783786667175325,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mCVU3AM9GsiHSTf2zAYpNn","selected":false},{"type":"Heliostat","cx":-0.20608705354946694,"cy":0.28423173777306227,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fafqHSKwkZ9Lc6KNcub1iX","selected":false},{"type":"Heliostat","cx":-0.21604838424584447,"cy":0.23832583217936565,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5x5ryjAFNyLBQJSPDZiNxM","selected":false},{"type":"Heliostat","cx":0.25404979900243435,"cy":0.34089037801032746,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hZqvYxemtzLuX56szXzxj2","selected":false},{"type":"Heliostat","cx":0.2092238108687354,"cy":0.35784661340980095,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1xzWMVcb7QUgsZhom23ZBM","selected":false},{"type":"Heliostat","cx":0.16094966980167502,"cy":0.3719078817898521,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9oP1tTsujTz46mZLAksbU8","selected":false},{"type":"Heliostat","cx":0.14600767375710866,"cy":0.4215358878370917,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpxoJLLKw2wmcNRpjJPBjy","selected":false},{"type":"Heliostat","cx":0.09543476406780727,"cy":0.4322886224806602,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mCWXPsVjzjnqeov6whWkEo","selected":false,"drawSunBeam":true},{"type":"Heliostat","cx":0.11420804114944189,"cy":0.38307418315048103,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dk9gN4h4BRr8fGtZgsJuDT","selected":false},{"type":"Heliostat","cx":0.12991629340142186,"cy":0.3313783435179399,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2fgVoHVNeFxumUFrk5quEU","selected":false},{"type":"Heliostat","cx":0.0651676438749678,"cy":0.38969125062344634,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"it8NqwMqJ6jLPQz4dBWJb8","selected":false},{"type":"Heliostat","cx":0.044861854378505865,"cy":0.4393192566706859,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"udHusEwmFchV5kUtJf1ukS","selected":false},{"type":"Heliostat","cx":0.08240840854177511,"cy":0.33799541099090513,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bsUzfzqGGE9YRc9SxnYgmz","selected":false},{"type":"Heliostat","cx":-0.005711055310795511,"cy":0.4422142236901082,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2WagAkKFSQwtBhzW9SCBZ3","selected":false},{"type":"Heliostat","cx":0.01765975901532106,"cy":0.39465405122817027,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s4VCdFSKVUwKw3ks2MUqmg","selected":false},{"type":"Heliostat","cx":0.03796554851178297,"cy":0.3470938787662324,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h4ZiHa7nr4i5m7fVtmuGTu","selected":false},{"type":"Heliostat","cx":-0.009542336347863788,"cy":0.3524702460880167,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5oXHCCp9pagPTxNZv7YAhZ","selected":false},{"type":"Heliostat","cx":-0.0306143820517394,"cy":0.39217265092580833,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ksbrcBfUU1XjRMYnvbmKvL","selected":false},{"type":"Heliostat","cx":-0.057433349311217394,"cy":0.44510919070953053,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pkwk8jYFuWA8JrrVEXSciw","selected":false},{"type":"Heliostat","cx":-0.10800625900051879,"cy":0.4397328233877463,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"myZ6zveEJCX5Y5KUd9UqJc","selected":false},{"type":"Heliostat","cx":-0.08157041984474761,"cy":0.39258621764286866,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8N7G24rjGiwUS1qdSwqWKB","selected":false},{"type":"Heliostat","cx":-0.05321894017044227,"cy":0.34916171235153404,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wnaxBMjLgw16qhsxW87N2s","selected":false},{"type":"Heliostat","cx":-0.1597285530009407,"cy":0.4327021891977206,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tdAXmudejXgsfZaFTCJpea","selected":false},{"type":"Heliostat","cx":-0.12869517660068752,"cy":0.3876234170381447,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2EGGmcigKerWkATYn21Drn","selected":false},{"type":"Heliostat","cx":-0.10072682503008903,"cy":0.3462667453321118,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9JRkgoqFZPzpaDJN7QVEqw","selected":false},{"type":"Heliostat","cx":-0.14746845368232211,"cy":0.3425446448785688,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cemUSZgbciSABHXVUHVMRB","selected":false},{"type":"Heliostat","cx":-0.18118372680852307,"cy":0.38472845001872236,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7Nd9N6VpCiem7PLD9aoKJQ","selected":false},{"type":"Heliostat","cx":-0.22677597114963569,"cy":0.3748028488092745,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o3vFhXc352dZa6eBcXkn8H","selected":false},{"type":"Heliostat","cx":-0.1896125450900733,"cy":0.3330326103861812,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qXuuzbNe6dHacfosrcjkG6","selected":false},{"type":"Heliostat","cx":-0.2401854547793747,"cy":0.32021204215731097,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wvrbYM3ECPeNyPcjQDEFVt","selected":false},{"type":"Heliostat","cx":-0.27275134359445513,"cy":0.3603280137121629,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1fzbQMf2vnYzc5rpFpv9Mm","selected":false},{"type":"Heliostat","cx":-0.2830958023945396,"cy":0.3082186073598336,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vzTr4LtFarEKYTmcYc1SSn","selected":false},{"type":"Heliostat","cx":-0.24669863254239083,"cy":0.2709976028271317,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bQQNRPpyECMqE968rws9s7","selected":false},{"type":"Heliostat","cx":-0.2555105789276479,"cy":0.2234374303651939,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a1ChAzJsqXt2MPj8g71s9i","selected":false},{"type":"Heliostat","cx":-0.28960898015755565,"cy":0.25776346788120114,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ggq4FyzZAgUPjfnxC8sMSU","selected":false},{"type":"Heliostat","cx":-0.2949727736094512,"cy":0.20689476168278068,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2po6rWGbCxwy8HhxH4B5M3","selected":false},{"type":"Heliostat","cx":-0.2624068847943708,"cy":0.17918579163973858,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bdrrNnoWhgNP5mRf3i2NL1","selected":false},{"type":"Heliostat","cx":-0.3256230219059975,"cy":0.2887809716607258,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7YMmZ4VphoH7t76dfCNrKp","selected":false},{"type":"Heliostat","cx":-0.3685333695211623,"cy":0.26727550237358866,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wUtNWA5JuxbJLty1PFij2c","selected":false,"drawSunBeam":true},{"type":"Heliostat","cx":-0.3294543029430657,"cy":0.2370851320281846,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wA8tWR4u3NMA7wqZrTD6LS","selected":false},{"type":"Heliostat","cx":-0.37083213814340327,"cy":0.2184746297604698,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u1tc8oJuXA2enopmwuzjK2","selected":false},{"type":"Heliostat","cx":-0.4110605890326203,"cy":0.19448776017097064,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"98Xke4ooFncN8FqBo7DDy6","selected":false},{"type":"Heliostat","cx":-0.45282155233666466,"cy":0.11466938377832708,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g3sLafsCK4ZvzmX9XjWqLu","selected":false},{"type":"Heliostat","cx":-0.4110605890326203,"cy":0.14858185457727408,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6fL2zFNvEirpGcgDGmSR7Q","selected":false},{"type":"Heliostat","cx":-0.369299625728576,"cy":0.17298229088383354,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1La1dF2UsKPBp333zXfnQM","selected":false},{"type":"Heliostat","cx":-0.3344349682912545,"cy":0.19241992658566903,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ccVk8kW1m7tdavAe7fX2do","selected":false},{"type":"Heliostat","cx":-0.373897162973058,"cy":0.12170001796835267,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7dYAamQSthGA7dsTStGx64","selected":false},{"type":"Heliostat","cx":-0.33520122449866824,"cy":0.14692758770903283,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k7an2wysM5Qh3AkEZpGd37","selected":false},{"type":"Heliostat","cx":-0.30071969516505365,"cy":0.16512452325968727,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qMwJPZfpHaQqaVGyt8my77","selected":false},{"type":"Heliostat","cx":-0.3041678480984151,"cy":0.11880505094893035,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sEhiU97pJ6gWPJXqqojWa4","selected":false},{"type":"Heliostat","cx":-0.2666212939351459,"cy":0.13493415291428323,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rbZK8YX7uyaHE3smRfE1iQ","selected":false},{"type":"Heliostat","cx":-0.20443321752274124,"cy":0.12247070829736166,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5JbmNCtS7jdpAREuUBBsWM","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":false,"theme":"Desert","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#b3b3b3","groundPanelY":0,"groundImage":true,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[106.52962106579803,-544.1172181902157,79.8149873216779],"panCenter":[0.9854234887700954,-25.135454432654125,13.426370895100769],"orthographic":false,"enableRotate":true,"cameraZoom":1.5388995055342627,"showInstructionPanel":true,"showMapPanel":false,"cameraPosition2D":[16.412888127805086,-91.5557196774778,49.9998886695533],"panCenter2D":[16.412888127805086,-91.55566967525533,-0.00011133037453072694],"solarRadiationHeatMapMaxValue":4,"showDailyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},499:function(e){e.exports=JSON.parse('{"docid":"vL1ZUsNydJJmwct15vHcrF","time":"05/19/2022 06:27 pm","timestamp":1652999233628,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022 10:15:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.804781891550604,"longitude":-114.97646752496185,"address":"602 Eldorado Valley Dr, Boulder City, NV 89005, USA","timesPerHour":1,"pvGridCellSize":0.25,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":10,"airAttenuationCoefficient":0.01,"cspGridCellSize":2},"elements":[{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"7L9JEMbgdkHJqyQYNhEPJq","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"irFPLxmMLT6rFDoJKoiKhb","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"8eu7vDhv6KUhHi9npAWqM9","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"qipbq8ah3yAaXFiTtNqwjz","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"8jsKzdYVfC5Vf4Nnu5jMbP","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"9VBTZXtWX26kqjkAsCS6nu","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"aUYdyUNGi8bnHineP3zqz5","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"bEQifGheSWzXErCQEX5jc9","selected":false,"dailyYield":2225.1916629818006},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"r4v1okttD44Z3thaT999zr","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"vbsjU2syn8u3VcPEUEvfUL","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"rS9gedRi7TPFSNSehAoH5T","selected":false,"dailyYield":2184.0618993549374},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"oYPRYVsGHKMvvbMQksPZAx","selected":false,"dailyYield":2167.4086752704884},{"type":"Foundation","cx":-268.72128837305235,"cy":192.4499625139658,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fjnWik4gwK6dVzpp4PS9CN","selected":false},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"somwUXH46rWWj2iEWaBpTH","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"f6fusQGihys5Uk5wRLiqtW","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"xxRJM6MpW6jZoZtDe4gxTL","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"67cNGKEATuXayJC7fa4ov6","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"jTDbg2GsKFSXSL5kfEKwFM","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"otoVZiatBWpjEMBHcFE1vB","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"a61aJ1UFYsWt4ci4mKq9SJ","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"3oeacHzGeVf2rX3iv6QkKf","selected":false,"dailyYield":2183.952515711261},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"j4UdupxMbEhx9RPqd3Kxbe","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"eU127LCRTi1gGCpMprsZjB","selected":false,"dailyYield":2183.9840846216266},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"9dKhxKmMz8HYSCd8thjHfi","selected":false,"dailyYield":2184.0494263190526},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"8niYJz4X5kqK7PxotD8v8w","selected":false,"dailyYield":2184.0217279415574},{"type":"Foundation","cx":-96.65608919286746,"cy":194.42114792003463,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"h3DXKV7Y684i3thRma6wLu","selected":false},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"bzpE1WucZoTcJnrQaFWosk","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"b18nYFHTAeTLPg9V3TAu6r","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"vnJbcrncrmPTTZtSNizQZx","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"uuobSx6wZMqJ4o9dEx6874","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"fkkZPubbk2sVhakgHyJg8p","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"nKo71iVf2HXcRbr4UCGY4B","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"s73CuihHSMyjifPJZbc7fj","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"bPUahAh6uikU5BjNj3PBL4","selected":false,"dailyYield":2184.314471867017},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"uwbEdmDhH9hKvJBzSqoFEi","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"ek8zDL6MWZ5xk3JieUZvVt","selected":false,"dailyYield":2183.9840846216266},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"4f3PT1Wrj5UjbZFwB43q6Q","selected":false,"dailyYield":2184.0494263190526},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"bV9jU3U5EG7hj1ZR9htRmc","selected":false,"dailyYield":2184.0217279415574},{"type":"Foundation","cx":76.81490256290738,"cy":193.91833345117703,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fiH8AWThFS5EVx7AwfngqL","selected":false},{"type":"Parabolic Trough","cx":-0.04454509140457573,"cy":-0.0080567453075295,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"t8xtXgJ4zQkhGJAogmq8d9","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.028178433926039068,"cy":-0.008139307894208355,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"bUFAb96RGW7QwKBQMcxVPN","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.11348203554423389,"cy":-0.009985318932966891,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"6rj3ikzy3Q8n2yfz1CwRXN","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1829903788505871,"cy":-0.009114355848154284,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"1WNeTRgxoSTT2DQJu5yyHb","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.25148985811792923,"cy":-0.010411589149102113,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"cWDWPkRX7GebUfNP1qoDPY","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.3213430444980177,"cy":-0.00840045293698594,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"dC1wGpGBnzJBEAzPE8gK7z","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.38740964968714997,"cy":-0.009828258759322559,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"jLCGM5EGeijybwhJJbzYWo","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.4537412982117307,"cy":-0.010542161670490834,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"fofxsexPNsKCB5DuhFZbhA","selected":false,"dailyYield":2184.249130169591},{"type":"Parabolic Trough","cx":0.09586378956336611,"cy":-0.00872263828398791,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"scR8HVKLnxMfg5qeM5Lugw","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.1635491452006934,"cy":-0.0072948324616512175,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"aJRfgV9p4QZ5EqYhzKMsGH","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.22988079372527398,"cy":-0.0072948324616512175,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"jbKhaZc18QopEFA48QhFGz","selected":false,"dailyYield":2184.0618993549374},{"type":"Parabolic Trough","cx":0.3002735635880945,"cy":-0.008008735372819492,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"gfBbYgpDbuSQ6xjoAfmVTg","selected":false,"dailyYield":2186.5619099124656},{"type":"Foundation","cx":265.415477246936,"cy":192.50545738235357,"cz":0.05,"lx":211.2723746451423,"ly":400.6159826636368,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"v1v8XPTexYoFXFrbQfvcXN","selected":false},{"type":"Parabolic Trough","cx":0.3626690294198999,"cy":-0.005427557483579055,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"kni2ZMXaAJJiwviDVB1raV","selected":false,"dailyYield":2186.372284672933},{"type":"Parabolic Trough","cx":0.4327954824820787,"cy":-0.005427557483579055,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"bETGj1xEbbAb2BVse1AQM2","selected":false,"dailyYield":2207.463112852368},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"s7kVKBTAaDo2hjd87z12j1","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"2TcdonCE1i3zpYReX2SoLR","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"a2NWUVKnwbFux2PYtz5CHH","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"t3XK5N3foFHRBevW4hQYeH","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"gX7yumpKKrmXnqYJweAwxw","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"wydrS5X5dqpbWyrqFYtYX6","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"ko9LprY6zErxhRNVTa6b2k","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"tUbG4wALaTZBXqDzrZWjJa","selected":false,"dailyYield":2225.1916629818006},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"cwror37w56snxd6Cu57GYv","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"djRCaY4JYizuqL9V1t1Ef7","selected":false,"dailyYield":2186.416326619183},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"wUb1oL88fa6vEHWZxPkspJ","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"8CofMvmPY2z5bBHdRWwYyh","selected":false,"dailyYield":2184.2214642544664},{"type":"Foundation","cx":-274.1742441205048,"cy":-205.8730240503783,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"er6dYYMfRpcyAunmGzAVCk","selected":false},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"jrgrdJiY66ubYTKCaCxqTB","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"fs8ejjGyyEChaC8Ehk8T4z","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"wXPY3K4zXtXUdVp4EU5wHC","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"woCUpwEYEVwQQqjCWLCbcb","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"8fA8M4gu6FFx9kstBhM3Gh","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"vdKSaNvMHXQ6c4CUhsUbjJ","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"nfHAWXJBNrnZk4SZXBZRwQ","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"oG9kEtQxTKYAx4RBkRru4e","selected":false,"dailyYield":2200.564116598536},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"eZZfAVvGcJQ4hyoRBRAHxH","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"1fvahJfFg2KKz9NtwScfEZ","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"whVGRaA9vi5x7rhQNFg1yE","selected":false,"dailyYield":2184.0618993549374},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"c9Dk9vaeTmZUcYmk8LG9yA","selected":false,"dailyYield":2184.142140950794},{"type":"Foundation","cx":-99.03928963053315,"cy":-203.22690478352843,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7yEBa2PPK1oKGZhA24cAWz","selected":false},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"9xAb6RCYhCVXhVokdoTNnm","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"mQojvngU3MK9E1WnMgnuYU","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"fdpnWcCJudkZEj98eat8mA","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"eXpPJSpHuPPrV44B7sxjrT","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"bKjSqKtUrMBiHDZpPLvptN","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"bUtfJ12cGNMZZLy3onCpbF","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"1coPe9Q5rGuZ2WSaiij8Le","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"2yk58NVaRPhqHjxMFDwXYo","selected":false,"drawSunBeam":true,"dailyYield":2184.5259546735324},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"6x4yDGfJw4eCZ7ekCPhjNt","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"xvTNCko8YFvfGqK1kgUt12","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"gVdwmaY8duSTrt1vAsGAxn","selected":false,"dailyYield":2184.0618993549374},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"nYEBq3ov1hbfwdFnEPb7Kh","selected":false,"dailyYield":2167.507403284107},{"type":"Foundation","cx":75.63743844199865,"cy":-205.7462806691912,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"k36HZDupiVkAR6X1Ux85J2","selected":false},{"type":"Parabolic Trough","cx":-0.033179547828226484,"cy":-0.00957350532887952,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"ezm6CU1apADueQgyTsSmZn","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.0413587397995383,"cy":-0.009655416682255636,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"kevGPawVmfF7HkTwPXwpqF","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.1038367629054752,"cy":-0.011486866841637427,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"uandqWKZFgnXJhXCrgQ2QQ","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.17507963599701507,"cy":-0.010622773698636264,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"kpSVEzPLMTEAVhEWUE8vrF","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.2452884695865472,"cy":-0.01190977474353469,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"xzPQyiCUDpURAjVcdpLis1","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.3168847910580943,"cy":-0.009914501877400738,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"1oovrq6jnWYwDxtZ3cBFmK","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3846000399791258,"cy":-0.011331045519871718,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"royQeirmSLt4FSVKZM7K9n","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.45258694619787027,"cy":-0.012039317341107171,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"eHq1QWB15jeB3RweUWBig1","selected":false,"dailyYield":2183.9634444947524},{"type":"Parabolic Trough","cx":0.11073313390029775,"cy":-0.01023414590591861,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"bX6TtHS7whnu5gLA4WYDBw","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.18010752800105748,"cy":-0.00881760226344756,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"vfvomP4GJj2bUfaeRmSTnY","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.24809443421980182,"cy":-0.00881760226344756,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"aKsJXH85Pv1TJFkCUcHtaj","selected":false,"dailyYield":2184.074372390822},{"type":"Parabolic Trough","cx":0.3202438040845918,"cy":-0.009525874084683014,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"5d1oEf681m2BEya8bQE3Zu","selected":false,"dailyYield":2186.5619099124656},{"type":"Foundation","cx":260.2382130043768,"cy":-203.83085358802796,"cz":0.05,"lx":206.12858677265922,"ly":403.80106579029473,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tnLBLu28SYP7t6wfKCqrkm","selected":false},{"type":"Parabolic Trough","cx":0.38472948235042653,"cy":-0.006082018282359512,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"35zz9s2izu4bSZ895qaY5m","selected":false,"dailyYield":2186.4500637242113},{"type":"Parabolic Trough","cx":0.45459040213804675,"cy":-0.0025158234685137603,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"8LPfuFyav4kWtBZ6BHp2RQ","selected":false,"dailyYield":2207.323568286619}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":false,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":16,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Desert","autoRotate":false,"groundColor":"#999999","groundPanelY":0,"heliodon":false,"axes":false,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":true,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"hybrid","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[415.56554854788317,378.8681570116889,50.208533152612546],"panCenter":[53.36331727441414,25.641045916575948,4.010932124381785],"orthographic":false,"enableRotate":true,"cameraZoom":1.3888568037446718,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[7.614289529137672,-228.9673229029426,19.999771022501545],"panCenter2D":[7.614289529137672,-228.96730290205363,-0.00022897748026825466],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":5.5,"showSunAngles":true,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":true,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":1,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelX":-5,"dailyParabolicTroughYieldPanelY":5,"showYearlyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},500:function(e){e.exports=JSON.parse('{"docid":"anrFxSGH61K9md1hspSx6c","time":"02/02/2023 12:15 pm","timestamp":1675358110494,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022, 2:30:00 PM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":42.2844063,"longitude":-71.3488548,"address":"Natick, MA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.5},"elements":[{"type":"Foundation","cx":0.08101414969184528,"cy":-0.061088068754476144,"cz":0.05,"lx":30,"ly":30,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"1jWhHcaUD3hYBmq8heF7Mt","textureType":"Foundation Texture #2"},{"type":"Parabolic Dish","reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"latusRectum":15,"relativeAzimuth":0,"tiltAngle":0,"structureType":2,"receiverRadius":0.25,"receiverPoleRadius":0.1,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.0015648838470118183,"cy":0.002268855297546398,"cz":0.5000000074505806,"lx":8,"ly":8,"lz":0.1,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1jWhHcaUD3hYBmq8heF7Mt","foundationId":"1jWhHcaUD3hYBmq8heF7Mt","id":"n6Wes9AHD6Nu1BFW2ixX6c","selected":false,"dailyYield":58.654024482322484},{"type":"Cuboid","cx":-0.0385404512454377,"cy":0.14330355436037368,"cz":0.5,"lx":1.410367011670566,"ly":1.229722993301011,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"wjK4XRngAZ84SKTN23jchz"},{"type":"Human","name":"Judd","cx":1.5445606997476098,"cy":-3.0401084333788013,"cz":0.05000000074505806,"lx":0.6,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1jWhHcaUD3hYBmq8heF7Mt","id":"weMPyi8cZcMft87uExNbWN","selected":false}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":true,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":18,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[-2.420183280635814,-15.878268188373001,3.8943744657694412],"panCenter":[2.874525283798386,1.555148727597212,3.8943744657694412],"orthographic":false,"enableRotate":true,"cameraZoom":31.733468832186784,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[0,-0.000020000888987681265,19.999999999989623],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":5,"showSunAngles":false,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":false,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"showYearlyParabolicTroughYieldPanel":false,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"showDailyParabolicDishYieldPanel":true,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Parabolic dish"]}')},501:function(e){e.exports=JSON.parse('{"docid":"7ug2PMzZs8KHaJfo9T19XG","time":"11/13/2022 05:52 pm","timestamp":1668379966922,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"5/22/2022 11:30:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":40.50104939260215,"longitude":-112.3735469155903,"address":"West Maint. & Supply Road, Tooele, UT 84074, USA","timesPerHour":1,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":5,"cspGridCellSize":1,"cspTimesPerHour":1},"elements":[{"type":"Foundation","cx":-47.0206360597426,"cy":68.67019638501287,"cz":0.05,"lx":46.5768885127422,"ly":135.19445156274705,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"cZGzTuNW8Aam7msowwUroB","selected":false},{"type":"Parabolic Dish","reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"latusRectum":8,"relativeAzimuth":0,"tiltAngle":0,"structureType":1,"receiverRadius":0.2,"receiverPoleRadius":0.05,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.30761593322410435,"cy":0.2695290878919692,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"fopwswffzD41xMfw42A9HH","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.02814798372485404,"cy":0.3300697435564625,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"uhQ2BDDLEGyfXHXM3T8D4J","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.015122118824723977,"cy":0.2725477934518696,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"1hU2B3tRaXiQA6qMShWWWm","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":-0.3100390677195005,"cy":0.3278398594863607,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"iEABxF7nkChkFiL5Znzw6T","selected":false,"dailyYield":55.267670961749594},{"type":"Parabolic Dish","cx":-0.309076286400796,"cy":0.20865185910064502,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"6dujuDwUqfLaFeQofWwJLp","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.30842094785613033,"cy":0.4471386572368095,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"cxNbMe5Q6mxcWpM69s2zVD","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.3641465280539995,"cy":0.44914206870604134,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"nvnv9aQWWLSS8NFmBnHLYH","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.021675504271373644,"cy":0.4499260123244368,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"1XvYz7yo4kDAwFbbyEVu6r","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.3641465280539995,"cy":0.39329601584788454,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"iAqeVhRsv4EEemyXLxRT7n","selected":false,"dailyYield":54.746079474767235},{"type":"Parabolic Dish","cx":-0.31489342730961073,"cy":0.3858168453090086,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"8887sGWkY9DPe6zPB7DCjw","selected":false,"dailyYield":55.365730353380805},{"type":"Parabolic Dish","cx":0.36706723440738265,"cy":0.33342502224319376,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"w4H13nunp4KXu5rLSjHetr","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.021675504271373644,"cy":0.3919490265017887,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"8A9nZ4G6EMbXmR2ypdZPtC","selected":false,"dailyYield":54.566999890968724},{"type":"Parabolic Dish","cx":-0.3119969927541789,"cy":0.15179957105585468,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"9xvM5C54F1GdXuQmPkbXHv","selected":false,"dailyYield":55.20229803399546},{"type":"Parabolic Dish","cx":0.36852758758407417,"cy":0.21317991744049564,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"dWXjd19yWhBU5KYeV4ep7R","selected":false,"dailyYield":54.63098088367212},{"type":"Parabolic Dish","cx":0.36852758758407417,"cy":0.2740571462318198,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"9RH7D4KCkHBkHBB3Jq4YBh","selected":false,"dailyYield":54.43625403546045},{"type":"Parabolic Dish","cx":0.019503178354798405,"cy":0.21317991744049564,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"pPqHXoZxFqCJhooD9iRhGL","selected":false,"drawSunBeam":false,"dailyYield":54.56560795591798},{"type":"Parabolic Dish","cx":0.029710257140191706,"cy":0.151618028448374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"dW2wLBrURiiyxfn6F6TVAM","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.38263449035227737,"cy":0.15356864871672385,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"4FQ9iN4DZGms63ywmg5spd","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.3118902038832707,"cy":0.033930573598891456,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"5oj8TRyAKMqMp8sgE67FVE","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":0.025935666410650624,"cy":0.09374962715399743,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"vmGfUGiMyftJojwfX2GBR5","selected":false,"dailyYield":54.56560795591798},{"type":"Parabolic Dish","cx":-0.3005664316946478,"cy":0.0924492136417643,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"oYSwSfAfrKU47Vyq9eDs5P","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":0.37131071816365446,"cy":0.09570021542996741,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"ngsGcTkVVzJ7SPc4n5EF9z","selected":false,"dailyYield":54.43625403546045},{"type":"Parabolic Dish","cx":0.3788598996227365,"cy":0.036531432615737686,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"3kBsJoTshaWDzS9NKouLiE","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":0.029710257140191706,"cy":0.03523101910350445,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"o4R1QpEifXnNSRVbUJpY2N","selected":false,"dailyYield":54.56560795591798},{"type":"Parabolic Dish","cx":-0.3043410224241887,"cy":-0.03499134254946713,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"wg9A7xFWVB5Q2Pe6NVpsFv","selected":false,"dailyYield":55.333043889503735},{"type":"Parabolic Dish","cx":0.03159755250496232,"cy":-0.03434113579335057,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"nMbKYu7cUV1STfkS1t9GBe","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":0.37131071816365446,"cy":-0.03109010201276759,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"1uAa3xWKSo4ZMy4qgrtWHV","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.30245372705941853,"cy":-0.0954605708683097,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"4W4HyJzntbsbMubTzJ5xuB","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":-0.2949045456003364,"cy":-0.15202852665807323,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"hLUWjDDawa9Bq5bGdgVF6r","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":-0.2967918409651067,"cy":-0.2150985820013824,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"38LakMABYvqqhWZJbnchb8","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.2949045456003364,"cy":-0.2716665697835258,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"qS3hKai5cPy6hqmvjMrrT8","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.03159755250496217,"cy":-0.09285974384384334,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"7N2it6fkLMZs5QL5wVYmmH","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.03159755250496217,"cy":-0.15137835189433643,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"jY7wFhgsoDdty76ov6d7Pd","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":0.03537214323450325,"cy":-0.20924675318871294,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"u2YWuzVpBajQANuw9UfAwL","selected":false,"dailyYield":54.45190129987361},{"type":"Parabolic Dish","cx":0.04292132469358527,"cy":-0.27101636302740917,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"3S1KK6FChNE8gvYazHEnpd","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":0.04103402932881465,"cy":-0.33018517783401885,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"uLmHzExRSUXhHpNKBjVRrt","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3864090810818183,"cy":-0.09285971185146352,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"3cxdvSGi3uCkPtzjoDyARg","selected":false,"dailyYield":54.58264715538189},{"type":"Parabolic Dish","cx":0.38074719498750675,"cy":-0.15332894017030646,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"s6fcxcWAD6NVtUZVHCQQ4L","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.38074719498750675,"cy":-0.21249775497691611,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"bSdLYguwQYmYpDu9RumiMQ","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.38452178571704776,"cy":-0.2697159495151761,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"2fyj3BUAEUoyYeFCWw7srW","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3901836718113594,"cy":-0.3295349710779023,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"sjmKi4AsX1sdYN2tTKwmA4","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":0.051333272176731434,"cy":-0.38693722362249716,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"3uEbgTc72rFmahkwgqJg8W","selected":false,"dailyYield":55.12127784182816},{"type":"Parabolic Dish","cx":0.059035555614381244,"cy":-0.44796941122274353,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"nRqAdpZ4TZQVjnRmHw48uX","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.3902337434333181,"cy":-0.38516817470654796,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"cfsJe9Yug6u3x3oBayEheP","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":0.3902337434333181,"cy":-0.4453158378488198,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"wMxTgYHNjkaxthyYgYTQP9","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"i9fZCix4TrJKhgCcneBYW4","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"n7aRSWWeY5wBNzZ53XV5uA","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"jWLZDGd195KJE8SWN597fk","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"76YP5Bkbjqbnqsg1JSHTGc","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"b9eyjomDdJAvbQ4GXbRhbG","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"9soCdCwnL8Bku7MHtRFFFr","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"tFv5W1XKGRjyGCtxQnPjfn","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"e5TE4DCQ6xiHjtxHX6wtr3","selected":false,"dailyYield":54.63098088367212},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"vsS27cuHcFevK1BdwYeKu3","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"hre13LuXsebRJ1ojBkKSgR","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"xrGCkZHLfRSASP6ZwrmBJr","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"nCfyMKMf1W4ncpysKWy2VY","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"mNMLU3z9EypRpQKmc6xPri","selected":false,"dailyYield":54.53292149204091},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"7g2aMKZxh6mDuScjaSitCf","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"woNtmkrzdE6LQEpkJkkk15","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"gQJWvo8v2H3LF9QwKDg5pS","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"psqWbKt21osCHgusR75ZRM","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"qA6D1GimsUYSX5jHTZtGrL","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"rFR9awpETFNeLqanJsWtLB","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"79pQRAYjXXzrw8FMTxx7da","selected":false,"dailyYield":54.53292149204091},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"j29brne3bouFE3K9xbRzf8","selected":false,"dailyYield":54.37088110770631},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"fEsQhg9meEj7fn6FyQr2kS","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"grDso13WfqFPnwde3tTooZ","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"5znkiYKSLhmEUCEWv7SMww","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"h7EfHGkuVpHhLEE2L8UnPe","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"tWy5pSLVYjou9HU9WNjk3B","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"oMmcyG29c8iK7NppnVHGcx","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"uCXv9kmZSPkBfAiRp688jH","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"2MLMRe971ACXtPr6TKkSZ9","selected":false,"dailyYield":54.45190129987361},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"m63BuQNzvckE5zp32Pnw8p","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"8HmQpAPE5ybDjjJmWPgtJy","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"pofnF8e5Bn6CnkFwwsd2mb","selected":false,"dailyYield":54.663667347549186},{"type":"Foundation","cx":-7.983643923093517,"cy":68.40825112249922,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"p7X7PWYKqawwVRyKWEqpsP","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"1Kr8Pa7CfCGfY9Tn1nbTfC","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"oRpi5CP9ZYynPy6bNyVZvx","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"bnjSVLBE8yuyRmD59Vpj5M","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"mxrBwLk3PBAc6DLtdHY9PG","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tCEaJXp5M1wEhEUpBtW2dn","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"nMM6ewc9ExA5TMPbfnv6Kz","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"n8s1FzD8MfqqBcK6r49KaJ","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"nH9Zop5fMNGnprvUp4Lndb","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"jkAXkFfxDNxSdMms1xtkQh","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"wrcKx46bR9u7RcdSgcckCp","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"wS66DR1C6Yem5chszyHNyX","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"mYGta2zZcv5wvFcomHB8h7","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tK1eBhmW8y1nnsX8W3X9ga","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"8Ci425obALWeV7icrEGMh3","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"3A2AjfypMamwJFRbA3fDpb","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"iWsTN7vg5oFv8hHDnyjZDQ","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"gXTojLu2Qyb637Ho6JL7Kf","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tavpWfYoXMz3qMPdKYuYus","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"vR6bFNvW7QL6DHxH3K21u5","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"jSCfJsog1e1sNpYz5PNhWW","selected":false,"dailyYield":54.615333619258955},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"eUyRyq3GvSH1aXZPres9zE","selected":false,"dailyYield":54.599686354845794},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"rDZgMEP11vSsiXW54EeeEC","selected":false,"dailyYield":54.56699989096873},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"fbaSKG8oqr7FZVwDxb6HR5","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"xAycaD99dwN2jw1eYE8Ajm","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"jgSWeMLe27dY6x2hNzCmsw","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"sgwE3sAhyMWCJxEUC5V8m2","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"hNVN4iBp2cmmnSn75ekkgF","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tWdCrzBigxazk84saCEaTV","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"kQJuw3tnnSYASf2nicv61Q","selected":false,"dailyYield":54.56699989096873},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"qJWMwjmsMFnGLQ7tP8657U","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tsiY8ux1n2J8yeqE2sunzz","selected":false,"dailyYield":54.746079474767235},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"wJKc8tsYNihwhLcJrfyUHp","selected":false,"dailyYield":54.794413203057466},{"type":"Foundation","cx":24.06375725188695,"cy":69.025369785858,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gEQRhWXA3HL6aJzGgTrAzv","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"1tz7amW9Vt4xEPqwef91Qx","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"sqvvuQJTZHqqySn6E4yYzm","selected":false,"dailyYield":54.69635381142626},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"28us4Wgm2qjx3DCcTdFLVV","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"mpqP9TF6Vrg7VCqRfcMiQu","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"f5qiT4VRUPdGpUjZXcsCx4","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"nTXZjqhzJBfTANgYD9vqjQ","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"rgnTEBGw6Vs7Duns1brscG","selected":false,"dailyYield":54.92515905856574},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"tGKA519iyUSWpQ8wVPNFJY","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"36gvqnTqAbkoRPjVMK7ems","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"viuvE72Bw3v6bsArR6wpDL","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"ii2gGoQHtGShTH1opfyXnJ","selected":false,"dailyYield":54.810060467470635},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"wcNvEizmbvgCX8phLyizju","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"jxCiGYqKr7CGg8yTBhpkCm","selected":false,"dailyYield":54.66366734754919},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"aSt2wCgvcriyqmRzVHYc9K","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"b579K6wcGsFkd5krT6NwtR","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"2tXe7mE16iWBsHUwW9t9aQ","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"aEUirhH7z57xAhv18Lb7W8","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"4dXM3M8KmCej1LF8VHJ82Q","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"h15HDWZymQfADqEotRv4LM","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"x3Jjg4ZJhqJ9gBq8UJG8Yi","selected":false,"dailyYield":54.69635381142626},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"qfDWqhtKKj8PExp7dtRJhP","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"dQzc3rdMh6sEoS53j5m6LC","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"dFarDxb3HPmwwaAxStasmq","selected":false,"dailyYield":54.810060467470635},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"gJLG93xPyBxAvQZy1eFr9c","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"5gNcrnds5MDuA88znfoVWr","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"7mL5Pz5pqsdiMAMyaHTbZn","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"3Uic4JFDxCdyp5oDg5ZLjd","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"14ENGCWNQVrrvGhEToEBLF","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"qMfSQPipp6HAYm2FfTRsJk","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"xxoYKaPf4MobsN7VjTosNC","selected":false,"dailyYield":54.810060467470635},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"9MQxESnXS7CKvarDbKvrgD","selected":false,"dailyYield":54.50162696321459},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"cVpFdWbUmKZPYFqiQr279G","selected":false,"dailyYield":54.663667347549186},{"type":"Foundation","cx":59.02948227812328,"cy":69.3080716212459,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4cePh2t5mTkfEKXcWmB48u","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"jesMtDuJVoPzLUmYETT89Y","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"97DnJZE3VTJfvvv6WzSRBx","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"vLPycCjUNJMSVTRtdj87XE","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"jPB61vSkRGEcXezoyJ9S3X","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"jULEb9dCHn3aTywUeHy3Qk","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"9Pa2h5sxqEBhqE3KgZbB6Y","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"se2JtcnQNE96z1Aum4EP1p","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"qfZULw2aGPUTLCVySZhcyp","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"qWNJdtQvxfzJj25Q9ioKpB","selected":false,"dailyYield":54.90951179415258},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"bxmvcGXZuBN8ktU47D4qP6","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"aNn3VE1DQvLpKgE5hUztNH","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"4mrZamvWvRpkYyqFS7RJH7","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"kiUHJLZUPqkGhKHBaWrqz7","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"uGSXR3GUiGp8nT3strVk7J","selected":false,"dailyYield":54.90951179415258},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"a1tN8yxLHdTXbX8ex2fpZB","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"s5oswXys4g8p8gmSXQvhkY","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"3D6zM2RHwSJFo7RfUTRyjT","selected":false,"dailyYield":54.90811985910184},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"cAzviKAUbsLWBdNTADoifP","selected":false,"dailyYield":55.13692510624132},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"ohGxTVAnBTQUju6j187cfL","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"jGoKYV4BSgv6J6296BizzQ","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"pPTV9qje8c7Wfg3GZqDMP2","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"x7uhR1kYgxibupXzAN9oWq","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"inz76DVy6KaN3KVR3CkPpG","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"dY4oZaF8y7JXdRxLLuqg9F","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"gmBkncxUG8PdQJo2VaespL","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"qirhM6vbtt83tpYszhnTaf","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"mRdCjwmZtRhDjNaoHZAsP7","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"bXjnb3U4gRd6Gra55HizMY","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"gTiRGPwLKRdtjktFgKt9hU","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"fFcZ5RiAU7SbEZpodham4W","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"rtWNXEr4TFs128rHeq3GAn","selected":false,"dailyYield":54.94219825802965},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"t2MHCbHPUk4iMrfBGmBEg8","selected":false,"dailyYield":54.99053198631988},{"type":"Foundation","cx":90.89697850456658,"cy":69.75067573550228,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6ufo5pBdzXZ7dduj1GnnjN","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"fBXFhCMe9NByYzvxwGHn6i","selected":false,"dailyYield":55.267670961749594},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"4XR37wV3Mcb5e4xnto9S5W","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"bF47T7o7w6UzeEcadSPaEe","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"vDEGXq7dyykKUFPikw7ZQv","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"ib8cPgm3UdpJKVhC7u74X9","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"fZnwkYdYn246TusSuwFy5d","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"npP5tD7NGDuPXSYzaKJSef","selected":false,"dailyYield":55.31739662509057},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"fyCVrUXjd49v6w3fUmCpmi","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"aEvUZ9jmc1SE9AqaTs83sz","selected":false,"dailyYield":54.40356757158338},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"c1aNagv3k5EwQhxqv1nQKW","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"3NCPuFUbbF4P3Uet9iqrKg","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"6sXkkWHPNQdQZGhmwNLthw","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"dC6pSLCpcbcZtkkLTZbGAP","selected":false,"dailyYield":55.20229803399546},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"sNDitQDQ2BGYEwghGZPxAc","selected":false,"dailyYield":54.40356757158338},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"3AapXAvkjJa5rztXETgT3X","selected":false,"dailyYield":54.58264715538189},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"1sKKkXtyuaMN8kgH5vX2ow","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"pJSWbff7eW8x3ExEm8MBdv","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"j6c75GwBD7xrTUdv8qzwcW","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"2DRktLVHmu4BwC4tYrV1hj","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"nRxkdY7Y2yR2SriqiuWofB","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"x5RkBxY41nZxXDJuxoiDZr","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"pixrQQvfkddWpaEq8muTrJ","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"jnLvvVhZEPeAJ2hpXvtXHJ","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"4xUoTNJFMJTerAQEErQ895","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"rkAQYL64Uuf379mtTX5GQL","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"rSMGuNL6giL7Nj4oWDSndP","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"3mr4Yjw79aApbRSuyrtamK","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"nHYzCZrgSVVxvF52MMmEG2","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"idcvngByfHJwgkBsh65JbP","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"pKoUwgWmomU9tDX1avSdQc","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"7LDpCzc3zBHLv6JhymAwbQ","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"dowp1omeYXWab3j1K1meZc","selected":false,"dailyYield":54.58264715538189},{"type":"Foundation","cx":-136.49179476446375,"cy":-67.2349056273395,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dzMWxWAUm13nPZAnV26ojB","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"dKV8idVwG1PoPzaqAJySn3","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"1ahCnzARH22rtYMg3xC75a","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"bGQnA5qfcBJLc7EFesifJ5","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"6abDjWSHbyPb8tqD7whFWE","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"pMaHgYpvL812956oXKBJ9T","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"vxBLBNexEATeuUVFW6UUb7","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"uEpK7NuFxhDZu1zciefV9E","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"adThs3Jwyt44gCESDNcupo","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"wJBFAEWUBufYWoCYyAAkDL","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"6fBBqnwyNxUJ2Mv27sMzNz","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"xku6MhBdpC6odzRtL5Rhsi","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"dCqY1YvNDa7QjZLsD7an8D","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"6yKCwMuBAuUpAxR3UkM2qV","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"9QuEw2Qd3kdbe2VGUtFG6d","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"fDUJgpBZqufUYAcgUpEYy4","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"7tpsaUo8qyex4qWWrRQa3Y","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"ac73uiJL9mDwp2h2qMBea1","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"pvYusR6DDwKSrhWjzrsGjq","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"fUxcXs6rResj8vGRQz5ADd","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"34XDNLYmgiixgYDTAvdY6U","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"eKnBHRagP12sRw2eHV4EFo","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"cKEXyvhTD3Jnxtg5cg1jRA","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"ngLd2mnBcPdF96nEdG4hH9","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"4YV65NmWmmduXoMXuWXF1E","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"dS2vQTwT6npH9US2Zjk7gd","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"nMbEzttfGVfwZJkAqwxiCa","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"tj5fHasfEFBxmjBHiSYX8G","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"2EuhpNKcNgCnC7mXhnzorq","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"dv9DT41y2eu8dhEh4A3yNF","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"7eHHdrZwkycM3igK47ofVH","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"pCMNdpEm3dUbZoYetGhdYY","selected":false,"dailyYield":54.680706547013095},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"22NmQZ1gAa9u2oawRCihVS","selected":false,"dailyYield":54.696353811426256},{"type":"Foundation","cx":-105.74245630035185,"cy":-67.46785516115864,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"bpYaYqzqY3rwTa3pPHPzsL","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"1D6qDwX2642TSZjwoFxp1o","selected":false,"dailyYield":54.90811985910184},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"79HAKLb1ozK2c7orEPVJkH","selected":false,"dailyYield":54.97349278685597},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"5Vymv5eq4ELiQdmdiH3zah","selected":false,"dailyYield":55.561849136643225},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"pQHHxi2uivDT6Eyv2TuxUD","selected":false,"dailyYield":55.561849136643225},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"wYhFkccfy25pvdRqXmjnun","selected":false,"dailyYield":54.778765938644305},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"aPgo7xUpbQpZnXsiNJF8SA","selected":false,"dailyYield":54.680706547013095},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"rc8sJmCgWcU8UzU4JU3Kw6","selected":false,"dailyYield":55.12127784182816},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"5uahGH6BqWfKU45xu5Z7hc","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"nsB8mr2bSHrM3jbtnehkjJ","selected":false,"dailyYield":54.53431342709166},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"mLbDv1g21nFPG8JjeviDLa","selected":false,"dailyYield":54.9408063229789},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"jkmjUdZvVvxK9WkLnnBg8p","selected":false,"dailyYield":54.9408063229789},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"ouSXNghPew3qYnTQVWfbqs","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"nrR2uHdaQAetCD1csDMzph","selected":false,"dailyYield":54.90811985910183},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"ckYt1vWJgk2MaNakWvCWDB","selected":false,"dailyYield":54.50162696321459},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"1FbV4HWSJjuWDo48s8WtNC","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"pGqN7t92fsi5d33uxuhFsb","selected":false,"dailyYield":54.97349278685597},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"9L7EiSKGotVbt799fBQeRb","selected":false,"dailyYield":54.90811985910183},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"bZ4hdZiNXSoXxokpbfP7nE","selected":false,"dailyYield":54.66366734754919},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"9hsKHsCGSPXrbjVLVZXWCf","selected":false,"dailyYield":55.00617925073305},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"wMRsqsB2mCNkXsKr5ZvPtC","selected":false,"dailyYield":54.9408063229789},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"suUFWEjxFaYuPL9peoDRUZ","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"1br5Ptt8Qo5SkEHqCXrKQH","selected":false,"dailyYield":54.89247259468868},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"xeafcWLVFe1one4Js1pXaR","selected":false,"dailyYield":54.90811985910184},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"3j8HSQdHpYxreAKw5y5Bkz","selected":false,"dailyYield":54.58264715538189},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"bC1ox3NKLCGdZfDSV4qRXK","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"hkihnoDGLJybUfZp35LbaG","selected":false,"dailyYield":54.58264715538189},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"dYLEbK9Ss1w4eXNB1RSBGR","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"ji6Bm928LBgZcFZDw5fDhy","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"gm6jD4HivZTs4uDmzromYL","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"hZR3rVvnhKsbGZa4pLQ11g","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"eyyDyyuNjfTg6Y8wmcxG2q","selected":false,"dailyYield":54.42060677104729},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"7PGJWm4Bn6jqjn5Eb529RY","selected":false,"dailyYield":54.58264715538189},{"type":"Foundation","cx":-69.6352785584022,"cy":-65.93887331983836,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6669FrAcRV3S1zPTB9p18F","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"iS8NizYAfM6n6dgKCGDkwv","selected":false,"dailyYield":54.74468753971649},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"5Ye58UjYKG719ktcep3oWk","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"ukPSHKyKbjrFbSUb7RzBEh","selected":false,"dailyYield":55.463789745012015},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"gCVedoD7SGFMxpqX1BUzZW","selected":false,"dailyYield":55.496476208889085},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"jbPAKMEf4mqFWYPZcJDbNe","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"p7dszGFjLEqeSwRLS7YHf1","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"aT4txGfZfiz8jnLoTt526b","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"sUsodPeEocPvCNDkqZrChb","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"8sk1PSP4vENQgztEKC8ci1","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"wqNWA2TwVSjRxwkYLtZDGZ","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"wH4wDZFpfKNiNZpVSSMhFY","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"oFBt69EzGbvtWDmu6DoojJ","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"kVJKwRjK96o6qVyyzwvEUm","selected":false,"dailyYield":54.679314611962354},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"wBrBDkpM8dEK4tQLmeUW6y","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"oo6K8agu94JQM84kjwrLGA","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"4irYSEA5i5W5Qi3FuQt5ih","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"af8MTE54DUeM1YcvKoYVA6","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"4LjL7VHsRNfpcY2YcLMhwp","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"ourSR4BHMyPDVKp3JHbdTq","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"k7JMDUAGSNprBURCCpXbTb","selected":false,"dailyYield":54.744687539716494},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"rzQQtjfoDHwc96srYFxFk9","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"kbtkW68kECiya1MGK4SY4y","selected":false,"dailyYield":54.66366734754919},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"79XY6D5Gd3dVECNy7jBKbr","selected":false,"dailyYield":54.744687539716494},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"8bnYakac6VrGEmETQMhGbi","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"2tr95qfXgv3jeidzJqoEEV","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"1T5fYcG2xLGDVaN4z2JSWd","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"czRX6XaVxvjtAd645B3nWJ","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"vThmrfLj2hfoaoHNntpY8P","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"mCVKJe8iq8UGLRopTPrpSP","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"kuonS1nfmLfp2iiXTgTfic","selected":false,"dailyYield":54.744687539716494},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"q3pJDWhsopJsaMjH8Z3EdK","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"xdV86xg96dfo2s3n5YjM1n","selected":false,"dailyYield":54.59829441979505},{"type":"Foundation","cx":-37.95414195901416,"cy":-67.00195609352035,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vDDupUZXQLcUBaqR8LHXzz","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"eUEn8apMEdg9tiLabGz99t","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"paR3Ac8yX4Wj7SiJJdFXph","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"2Y1fnFxyWV8UXrjDxD5Hyx","selected":false,"drawSunBeam":true,"dailyYield":55.20229803399546},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"v8QgWidDb6xTCTfyAfsDG2","selected":false,"dailyYield":55.2676709617496},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"ftqZQ7zoxGXDJ4KzFQVvaR","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"2uCAP6MhpPQYVndbGTMe2B","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"8938SbXAZNkxeYq1PAuYkn","selected":false,"dailyYield":54.599686354845794},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"rvoQ2mMYFP66Qhmnt8EKxF","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"f7SvtPUPo466Q4gJ9TnSPn","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"3kyNNxHidQMjQts3HyRhrm","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"pxogXCDeccjCLr1EFcuCgo","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"hBNssdFnqaWt58JWz26Zha","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"heoastLWiYga5S3WuMv9kh","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"aTSKWJPxGZKnFrLPA4VLgM","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"rtnU9Cenb7sZyKwXZGLfCQ","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"2ueZ5Jrv5E5nXkCc6dxQAF","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"jqQxC81KzsmLW8AWVEDxZ5","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"dm73L8CEvXMjt8jmGDoHDz","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"wc6yJGXKbguZXGWm3uUiyz","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"5Mbqu9AgKWy9HDTcgGMTCX","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"vmwgb4DfHsDq31536bgoww","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"2hsXtqWkNaFi1euvqpPnYN","selected":false,"dailyYield":54.56699989096873},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"gCnCmzsBCPWaiJfR4rk7n1","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"mF2657hxSjuxtSYkQnHSaP","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"pdqUKVseiHvsXYpZYBkscF","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"qAF8msFvwwguymfMBR3wwa","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"7n56hxe7QepqRevx5NngGN","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"9P9xnvWAP12WSQGPWr2xtb","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"ejCEMdNfsxgvQCqAEDzhBb","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"ff9EG4MNoewWubqd37E7fM","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"7bnM4YQJTBLfksD89FPHBy","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"t2yUPd5YBp4D1eifVJ5Nzq","selected":false,"dailyYield":54.663667347549186},{"type":"Foundation","cx":-6.040055825807073,"cy":-66.303127392908,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mfej18wHzwCMqBLG9Vysw1","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"qXxaLHK5jDA7AhqzmRAQ66","selected":false,"dailyYield":54.615333619258955},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"rjuAkDcMzUTa9fqXQamSY4","selected":false,"dailyYield":54.566999890968724},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"j87SthvfTm3rDWWm41tUR5","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"uh2HZmC683cEXyJZGLkwBJ","selected":false,"dailyYield":55.30035742562667},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"81esia6veGyAKewVMXNFHX","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"s14QyCHUodJj48ZcvmrHtn","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"87ZJEPRDaSsfRqqgULdNjb","selected":false,"dailyYield":54.48597969880142},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"eJdVsoPdU4es7XLBMBBB1n","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"fhL62UbzsRCcxH8gsKRMND","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"8iHidnxMDDHGCmryeJeacP","selected":false,"dailyYield":54.566999890968724},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"8RJziVcJjiF46EfKhhZeBN","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"hyYrjR5SLCyDEXyYT3xm9u","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"rJnFSCbaHKosPa2KmZE9Bu","selected":false,"dailyYield":54.534313427091654},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"txjJKa7MeCk6ee1keKR2Rt","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"sH5mM8WkA56CcEGporWH7S","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"hscqrLUfgPLdvLYLhecu3y","selected":false,"dailyYield":54.534313427091654},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"veWgK95yByHQ4KaXLUaYWX","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"oXFe1NucST916GSaKbGmVx","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"vyDbfHhDVVzLr6jCioEpsj","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"dyGU6GJcmCDKizMLYr19T4","selected":false,"dailyYield":54.501626963214584},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"v2i5cyjr9QNrJ63D31A2tc","selected":false,"dailyYield":54.51866616267849},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"hpHcG6Em2ns9Vehj3Lz45w","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"tvqvfScTkqwPcBBULnCSx5","selected":false,"dailyYield":54.566999890968724},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"rzPF17veSWTTiShfLGYVnU","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"7WUADDEEsLzZqJqEVL3xoM","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"aMLXH9cc7xjM8uQE7opRzx","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"2jBk9rtEn52EHUGX1e9utM","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"w9pxWfrZ7fBmNWnpSTPcQo","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"5qn6ZfWHFWZniAFZBD5G63","selected":false,"dailyYield":54.599686354845794},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"781z6sw1H3T6mBvH3ivKWb","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"gPpckDefdadY3m2KfYR5uB","selected":false,"dailyYield":54.746079474767235},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"2GF8pwx5gfMGBNrvsV4cmE","selected":false,"dailyYield":54.82709966693454},{"type":"Foundation","cx":24.942232172123894,"cy":-65.13837972381286,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4r9eq18jPmAo6KNP48KE97","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"v8WDAYVaovBCxpzwf6YKeb","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"pCnVs2rYUiypfZGE44GDhJ","selected":false,"dailyYield":54.744687539716494},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"5UiMA8kgZaGL6jjafYMSVr","selected":false,"dailyYield":55.36573035338081},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"dhsidTNuvFYqFyM52G8UzE","selected":false,"dailyYield":55.20229803399546},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"g7Z62RhyigqxTzLzSkQGs3","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"qK59nEiAwb2wPANvX4dXSK","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"r3JeuhY8zBG7SMPQtUacQZ","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"c4ZyVQcaD3vFS8aULE9spN","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"24MgYUmNGEdTzMEVjyvfWF","selected":false,"dailyYield":54.43625403546045},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"h2bAX5kxShkvLfLaLDJQnm","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"wSzqjZ1GP4g9CcLekersFg","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"t1LDu4rZgpXXmkj2eWc9T6","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"19vo4GuhGG7PWJqkt5ZWcD","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"qMnf48SWj4EjJpDb7yeb5y","selected":false,"dailyYield":54.43625403546045},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"qiNpaX9J1nJiB8PCJHwymU","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"rSdy4au4BWa65hP34cwhoZ","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"hPCibkbgsWPQByvQM8s8hM","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"8t16ViMQHmuRQ58XsMeEsu","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"m1UycnGk9QvgoR2crWwbud","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"jVNiFDPeT2ctjGPL4mv22f","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"cSWfM55n5PeKkoqEpPtaHH","selected":false,"dailyYield":54.72904027530333},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"uJwZ7KjG5UFJTZAN98LQcB","selected":false,"dailyYield":54.69635381142626},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"fBg69qhp7ssDM4U3Vakj97","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"dSLRdtVjTfCKhzP9vT6G4u","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"4a2kYuMS6iygwh4hTzF2xm","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"9N9XBekvGdtNubUKdz9bn6","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"tq9YQmjCLAfqC4otgQvkux","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"gfvtY6D8uZN4TPnY24yVxr","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"bPqXD8n7NUMT1fhPbkkkN5","selected":false,"dailyYield":54.72904027530333},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"jZr1iAB28GDzKvvD8ExZeZ","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"dFApM3YHu3Y78M2Xo4kwFU","selected":false,"dailyYield":54.50162696321459},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"rmGs8zD7XyqBcjkDXAjzGQ","selected":false,"dailyYield":54.61533361925896},{"type":"Foundation","cx":60.35056131261639,"cy":-65.60427879145091,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"kduQAydye3uLbFTr64JfDC","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"kv7G6eNq8xQ9gr29A4PgeE","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"1gywdTnVmZkqwtFNXrcTHj","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"5DvXaqZe44KDk9xuKtfUm8","selected":false,"dailyYield":55.365730353380805},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"ixZhNJFXp4ZR66ypWaNH9v","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"4LbWLkGdGxj7kuRG5UeWgn","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"fCdWydwEmsHE8uPjWYkvre","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"537SCeuwcrKy3Yf9ezzr62","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"8iemrXgtr1quNdAfyKBdCA","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"c3kXvdwXEFnYcE9YGUQyxm","selected":false,"dailyYield":54.90951179415258},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"uP29oRRT6aV7MGQx7YvD6o","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"1AcDNXSU7HvWkLg54AmFDz","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"voUCWzXArc2R6oHvJaWZdi","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"oCzzzbWTzWQYAhZxeXvaLR","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"uJ1SiuCEyFqZex6ZUex4r6","selected":false,"dailyYield":54.90951179415258},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"1zp4QY7bN2mj5X1sZr69Xj","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"qpi2nj28QCtj6dALbpHWKm","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"595KUQMKKkRujsK9vxKPHq","selected":false,"dailyYield":54.94080632297891},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"oSWo7sjDPAaDfzLRN5A2vW","selected":false,"dailyYield":55.13692510624132},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"4yJVmHfw54xdbao6TurGH1","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"5AQCSNeCEvo9GSvshqiwuv","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"iFNGVF4BnRB2CiUTeAUcpc","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"uLsXN2FSFMdKv3wb2Xhtda","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"7fwh5kRqQ3ekm4dzKpbxi3","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"kQtV2faB3UjVkaBSkjbaPM","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"5a3j4AZWQSeQLoFe28cTFR","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"nXQKckZPXqHpq5g6AGp4mk","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"49gRZ5Q4VK9aZWKDCVqk5f","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"a6rEesiKY3XGANAtD57SGu","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"mmg6zETUeomJsq2ezeHSSw","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"6JQVhnyM7L2LNEiJt7duty","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"v8HDepiPpBYKNZPDtGgLgR","selected":false,"dailyYield":54.94219825802965},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"kSEgPj4rJC7X5s13VYJGGv","selected":false,"dailyYield":54.99053198631988},{"type":"Foundation","cx":91.09989977672836,"cy":-65.83722832526995,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jQu4gCDNGHwChoQvBCFcvf","selected":false}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":false,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":17,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Desert","autoRotate":false,"groundColor":"#999999","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":true,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"hybrid","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[169.9816352402022,-225.19055272845807,79.13890608436596],"panCenter":[-50.39035725869241,30.655635102579282,0],"orthographic":false,"enableRotate":true,"cameraZoom":4.292775278858744,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[45.20884161437947,-65.0727374045762,19.999927173198625],"panCenter2D":[45.20884161437947,-65.07271740368721,-0.00007282678642197909],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":8,"showSunAngles":false,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":true,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":1,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelX":-34,"dailyParabolicTroughYieldPanelY":188,"showYearlyParabolicTroughYieldPanel":false,"yearlyParabolicTroughYieldPanelX":null,"yearlyParabolicTroughYieldPanelY":null,"showDailyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},502:function(e){e.exports=JSON.parse('{"docid":"cNGvmw7bdpjvKSnH8CxjiH","time":"02/02/2023 02:10 pm","timestamp":1675365059016,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"6/22/2022, 3:30:00 PM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.6869752,"longitude":-105.937799,"address":"Santa Fe, NM, USA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.5},"elements":[{"type":"Foundation","cx":-0.042674723134280335,"cy":-0.130761486142406,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"solarStructure":1,"locked":false,"solarAbsorberPipe":{"absorberHeight":16,"apertureWidth":1},"labelSize":1},{"type":"Fresnel Reflector","reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.05,"cx":-0.02756165965335064,"cy":0.003002736834484595,"cz":0,"lx":2,"ly":30,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"vb4n6chMKJoqTfuUfT9HH9","selected":false,"dailyYield":74.96105824171634,"yearlyYield":2328.274834535053,"label":"8","labelHeight":1,"labelSize":1},{"type":"Human","name":"Jack","cx":-4.020481691228474,"cy":-25.616774473884036,"cz":0,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wt2ieHLPLyg2Q2E8VLix1e","selected":false,"ly":0.6},{"type":"Fresnel Reflector","cx":0.028169913107493977,"cy":0.003853312047257671,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"hqQUyB5jvcbC5wykbyrwVq","selected":false,"drawSunBeam":true,"dailyYield":75.30871550026608,"yearlyYield":2365.489808480604,"label":"9","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.0839014858683386,"cy":0.004703887260030747,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"3QNPRzuCQDcJYCHp3jv7xP","selected":false,"label":"10","dailyYield":74.47712896106862,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.1396330586291832,"cy":0.0055544624728038235,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"7vdajwavThEwB2PVAxNNhu","selected":false,"drawSunBeam":true,"label":"11","dailyYield":72.69243415263071,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.19536463139002783,"cy":0.0064050376855769,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"ca329ZjJaCCUxbohPB9JNR","selected":false,"drawSunBeam":true,"label":"12","dailyYield":71.32847705730514,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.2510962041508724,"cy":0.007255612898349976,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"wH1sLWUJu5DwjfBKCjHRy5","selected":false,"drawSunBeam":true,"label":"13","dailyYield":69.36645769952737,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.30682777691171703,"cy":0.008106188111123052,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"888jdzXbxdzvyBwsKnBVQU","selected":false,"drawSunBeam":true,"label":"14","dailyYield":68.18367399690828,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.36255934967256165,"cy":0.008956763323896128,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"cLuiFeXqEUWZCxdsSWep75","selected":false,"drawSunBeam":true,"label":"15","dailyYield":66.51612857330484,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"2orgkforac6TmBbX5ogLWg","selected":false,"drawSunBeam":true,"label":"16","dailyYield":66.9454970041269,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.08329323241419526,"cy":0.0021521616217115187,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"qkYArzf5uqu6DZf4wA39gd","selected":false,"drawSunBeam":true,"label":"7","dailyYield":74.46542587169182,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.13902480517503987,"cy":0.0013015864089384425,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"gBW2TdctGGDx3xkrVbnnt2","selected":false,"drawSunBeam":true,"label":"6","dailyYield":73.42005146962971,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.1947563779358845,"cy":0.00045101119616536636,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"t8gE1dpvae7236xzWXFCVz","selected":false,"drawSunBeam":true,"label":"5","dailyYield":71.56039677787652,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.25048795069672913,"cy":-0.0003995640166077098,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"jfpJVaw3pqTBMP5EqV8WHg","selected":false,"drawSunBeam":true,"label":"4","dailyYield":69.76216278634425,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.30621952345757375,"cy":-0.001250139229380786,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"cwXPC6JNrmx1jM5HPN3Bnj","selected":false,"drawSunBeam":true,"label":"3","dailyYield":68.34763018099684,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.36195109621841837,"cy":-0.002100714442153862,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"nQed4eP7gteAwQE8ekQJF7","selected":false,"drawSunBeam":true,"label":"2","dailyYield":66.89178735911106,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"gGEdWUHCti1PrRxJ7JDarq","selected":false,"drawSunBeam":true,"label":"1","dailyYield":66.97552153518168,"labelHeight":1,"labelSize":1}],"view":{"orthographic":false,"enableRotate":true,"ambientLightIntensity":0.1,"cameraPosition":[-0.18166570108404656,-45.01608727927176,13.053612747101962],"cameraPosition2D":[0,-0.000020000888987681265,150],"panCenter":[0.5652994261175363,0.42897477312561383,2.1550210855619265],"panCenter2D":[0,0,0],"cameraZoom":17.679830776572036,"axes":true,"solarRadiationHeatMapMaxValue":10,"shadowEnabled":true,"theme":"Default","heliodon":false,"showSunAngles":false,"groundImage":false,"groundColor":"#16cda5","showMapPanel":false,"showHeliodonPanel":false,"showWeatherPanel":false,"showStickyNotePanel":true,"showSiteInfoPanel":true,"showDesignInfoPanel":false,"showInstructionPanel":false,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showDailyPvYieldPanel":false,"showYearlyPvYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"autoRotate":false,"heliodonPanelX":0,"heliodonPanelY":0,"mapPanelX":0,"mapPanelY":0,"weatherPanelX":0,"weatherPanelY":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyLightSensorPanelX":0,"dailyLightSensorPanelY":0,"yearlyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"mapZoom":18,"mapType":"roadmap","mapTilt":0,"mapWeatherStations":false,"showDailyFresnelReflectorYieldPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":-1274,"yearlyFresnelReflectorYieldPanelY":14,"dailyFresnelReflectorYieldPanelX":-19,"dailyFresnelReflectorYieldPanelY":157,"stickyNotePanelRect":{"x":0,"y":0,"width":245,"height":60},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":721,"height":335}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":true,"yearlyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Linear Fresnel reflectors"]}')},503:function(e){e.exports=JSON.parse('{"docid":"msDnM7uBZhbQmJD2hxtJqt","time":"02/03/2023 04:30 pm","timestamp":1675459824362,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"6/22/2022, 12:00:00 PM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.6869752,"longitude":-105.937799,"address":"Santa Fe, NM, USA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.5},"elements":[{"type":"Foundation","cx":0.9362263534654288,"cy":-0.12687492649763793,"cz":0.05,"lx":27,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"locked":false,"solarAbsorberPipe":{"absorberHeight":10}},{"type":"Human","name":"Juro","cx":5.337210314381737,"cy":22.31208205622077,"cz":0,"lx":0.6,"lz":1.9,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wt2ieHLPLyg2Q2E8VLix1e","selected":false,"ly":0.6},{"type":"Fresnel Reflector","cx":-0.35253117677918383,"cy":-0.011856551439747325,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"3QNPRzuCQDcJYCHp3jv7xP","selected":false,"label":"W7","dailyYield":31.890222330203017,"drawSunBeam":true,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.2286832373106403,"cy":-0.011005976226974253,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"7vdajwavThEwB2PVAxNNhu","selected":false,"drawSunBeam":true,"label":"W6","dailyYield":31.891895315467107,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.10483529784209675,"cy":-0.010155401014201173,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"ca329ZjJaCCUxbohPB9JNR","selected":false,"drawSunBeam":true,"label":"W5","dailyYield":31.73416130809442,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.019012641626446784,"cy":-0.009304825801428097,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"wH1sLWUJu5DwjfBKCjHRy5","selected":false,"drawSunBeam":true,"label":"W4","dailyYield":31.73416130809442,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.14286058109499036,"cy":-0.00845425058865502,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"888jdzXbxdzvyBwsKnBVQU","selected":false,"drawSunBeam":true,"label":"W3","dailyYield":31.73416130809442,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.26670852056353395,"cy":-0.007603675375881946,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"cLuiFeXqEUWZCxdsSWep75","selected":false,"drawSunBeam":true,"label":"W2","dailyYield":31.794492804033993,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.3905564600320776,"cy":-0.006753100163108869,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"2orgkforac6TmBbX5ogLWg","selected":false,"drawSunBeam":true,"label":"W1","dailyYield":31.9307477575622,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Foundation","cx":14.471950838588711,"cy":-0.06574070597754514,"cz":0.25,"lx":2.9789007603004762,"ly":40,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"1X6Dcn8HZPSPCzJkugC2rm","selected":false,"locked":false,"solarAbsorberPipe":{"absorberHeight":10}},{"type":"Fresnel Reflector","cx":-0.35253117677918383,"cy":-0.011856551439747325,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"9VYUH8fPAbbYtPyjX2bXhM","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":32.07623689276002,"labelHeight":1,"labelSize":1,"label":"E7"},{"type":"Fresnel Reflector","cx":-0.2286832373106403,"cy":-0.011005976226974253,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"oZQVT7upKS5gxcv41KySPP","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":32.022177742145026,"label":"E6","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.10483529784209675,"cy":-0.010155401014201173,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"fscHgrZH2yNiKzCaZR3ZeJ","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.827123715972846,"label":"E5","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.019012641626446784,"cy":-0.009304825801428097,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"jnn6CBMvkkU1925yAPrHAB","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.827443563442092,"label":"E4","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.14286058109499036,"cy":-0.00845425058865502,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"hJhtsSd1FMChUsTYyy5v9N","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.827443563442092,"labelHeight":1,"labelSize":1,"label":"E3"},{"type":"Fresnel Reflector","cx":0.26670852056353395,"cy":-0.007603675375881946,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"6CbyGsZ43oQRJAfjen8bXu","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.946909343510214,"label":"E2","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.3905564600320776,"cy":-0.006753100163108869,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"rKXjH4ndrtiJLk3pNba97R","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.888037304879255,"label":"E1","labelHeight":1,"labelSize":1},{"type":"Foundation","cx":-0.5305173175473676,"cy":-0.07406922653934842,"cz":0.05,"lx":27,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"uPxivXJTh4z2zMrqhzNvo3","selected":false,"solarAbsorberPipe":{"absorberHeight":10}},{"type":"Foundation","cx":-13.207999911998343,"cy":-0.09629786579027738,"cz":0.25,"lx":2.9789007603004762,"ly":40,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"qFoXmrcbqf43nhfNvsKiMV","selected":false,"solarAbsorberPipe":{"absorberHeight":10}}],"view":{"orthographic":false,"enableRotate":true,"ambientLightIntensity":0.1,"cameraPosition":[-3.9192694742317027,38.575338391462196,5.805467125820184],"cameraPosition2D":[0.0944682441377376,-0.000020000888987681265,150],"panCenter":[-5.512894960875013,0.5401536354068696,3.9025189352350482],"panCenter2D":[0.0944682441377376,0,0],"cameraZoom":14.400332666460274,"axes":true,"solarRadiationHeatMapMaxValue":10,"shadowEnabled":true,"theme":"Default","heliodon":false,"showSunAngles":false,"groundImage":false,"groundColor":"#16cda5","showMapPanel":false,"showHeliodonPanel":false,"showWeatherPanel":false,"showStickyNotePanel":true,"showSiteInfoPanel":true,"showDesignInfoPanel":false,"showInstructionPanel":false,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showDailyPvYieldPanel":false,"showYearlyPvYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"autoRotate":false,"heliodonPanelX":0,"heliodonPanelY":0,"mapPanelX":0,"mapPanelY":0,"weatherPanelX":0,"weatherPanelY":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyLightSensorPanelX":0,"dailyLightSensorPanelY":0,"yearlyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"mapZoom":18,"mapType":"roadmap","mapTilt":0,"mapWeatherStations":false,"showDailyFresnelReflectorYieldPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":-1274,"yearlyFresnelReflectorYieldPanelY":14,"dailyFresnelReflectorYieldPanelX":-19,"dailyFresnelReflectorYieldPanelY":157,"stickyNotePanelRect":{"x":0,"y":0,"width":379,"height":67},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":701,"height":335}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":true,"yearlyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Linear Fresnel reflectors with two absorbers"]}')},504:function(e){e.exports=JSON.parse('{"docid":"91fFrr9emvLvmNx1sW7PMh","time":"02/03/2023 04:20 pm","timestamp":1675459240163,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022, 10:30:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.6869752,"longitude":-105.937799,"address":"Santa Fe, NM, USA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.4},"elements":[{"type":"Human","name":"Jack","cx":-33.39710614584251,"cy":-0.9610066908384169,"cz":0,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wt2ieHLPLyg2Q2E8VLix1e","selected":false,"ly":0.6},{"type":"Foundation","cx":0,"cy":-25.811344633762367,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"dzfAzy3H4GMkDSbVLaRN5i","selected":false,"solarAbsorberPipe":{"absorberHeight":10}},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzfAzy3H4GMkDSbVLaRN5i","foundationId":"dzfAzy3H4GMkDSbVLaRN5i","id":"rBPLpQDftUWGq1uWVpV2JQ","selected":false,"dailyYield":46.64633299683992,"drawSunBeam":true,"label":"Lo2","yearlyYield":547.7275410650782,"labelHeight":4,"labelSize":2},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzfAzy3H4GMkDSbVLaRN5i","foundationId":"dzfAzy3H4GMkDSbVLaRN5i","id":"1FVTFf1Rdrpbt8TCGDL47X","selected":false,"dailyYield":46.68721550672282,"label":"Lo1","drawSunBeam":true,"yearlyYield":547.8648836504849,"labelHeight":4,"labelSize":2},{"type":"Foundation","cx":0.20390682574577923,"cy":26.830878562482944,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"5Xds31NJFC5WSWmddVnFan","selected":false,"solarAbsorberPipe":{"absorberHeight":20}},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5Xds31NJFC5WSWmddVnFan","foundationId":"5Xds31NJFC5WSWmddVnFan","id":"t7wce5cujudUUycMCvBAKg","selected":false,"dailyYield":52.29842954176333,"drawSunBeam":true,"label":"Hi2","labelHeight":4,"labelSize":2},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5Xds31NJFC5WSWmddVnFan","foundationId":"5Xds31NJFC5WSWmddVnFan","id":"pU7aF7BDdSD7JUWEzZrwg7","selected":false,"dailyYield":52.33859564683257,"drawSunBeam":true,"label":"Hi1","labelHeight":4,"labelSize":2}],"view":{"orthographic":false,"enableRotate":true,"ambientLightIntensity":0.1,"cameraPosition":[53.11784569640703,-95.69780414866537,24.112920613071175],"cameraPosition2D":[0,-0.000020000888987681265,19.999999999987022],"panCenter":[0.3487591244720869,-0.08601128946324002,0],"panCenter2D":[0,0,0],"cameraZoom":4.904200711979575,"axes":true,"solarRadiationHeatMapMaxValue":6.5,"shadowEnabled":true,"theme":"Default","heliodon":false,"showSunAngles":false,"groundImage":false,"groundColor":"#16cda5","showMapPanel":false,"showHeliodonPanel":false,"showWeatherPanel":false,"showStickyNotePanel":true,"showSiteInfoPanel":true,"showDesignInfoPanel":false,"showInstructionPanel":false,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showDailyPvYieldPanel":false,"showYearlyPvYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"autoRotate":false,"heliodonPanelX":0,"heliodonPanelY":0,"mapPanelX":0,"mapPanelY":0,"weatherPanelX":0,"weatherPanelY":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyLightSensorPanelX":0,"dailyLightSensorPanelY":0,"yearlyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"mapZoom":18,"mapType":"roadmap","mapTilt":0,"mapWeatherStations":false,"showDailyFresnelReflectorYieldPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":-1274,"yearlyFresnelReflectorYieldPanelY":14,"dailyFresnelReflectorYieldPanelX":-19,"dailyFresnelReflectorYieldPanelY":157,"stickyNotePanelRect":{"x":0,"y":0,"width":404,"height":64},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":true},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of height of absorber pipe for Fresnel reflectors"]}')},505:function(e){e.exports=JSON.parse('{"docid":"vKXC3Vu98tLTj5EYPySBoM","time":"02/03/2023 04:23 pm","timestamp":1675459380199,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022, 11:00:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.6869752,"longitude":-105.937799,"address":"Santa Fe, NM, USA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.4},"elements":[{"type":"Human","name":"June","cx":-33.350601086935164,"cy":22.419888505407727,"cz":1.7763568394002505e-15,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wt2ieHLPLyg2Q2E8VLix1e","selected":false,"ly":0.6},{"type":"Foundation","cx":0,"cy":-25.811344633762367,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"dzfAzy3H4GMkDSbVLaRN5i","selected":false,"solarAbsorberPipe":{"absorberHeight":20}},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzfAzy3H4GMkDSbVLaRN5i","foundationId":"dzfAzy3H4GMkDSbVLaRN5i","id":"rBPLpQDftUWGq1uWVpV2JQ","selected":false,"dailyYield":52.29842954176333,"drawSunBeam":true,"label":"NS-E","yearlyYield":547.7275410650782,"labelHeight":4,"labelSize":2},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzfAzy3H4GMkDSbVLaRN5i","foundationId":"dzfAzy3H4GMkDSbVLaRN5i","id":"1FVTFf1Rdrpbt8TCGDL47X","selected":false,"dailyYield":52.33859564683257,"label":"NS-W","drawSunBeam":true,"yearlyYield":547.8648836504849,"labelHeight":4,"labelSize":2},{"type":"Foundation","cx":0.20390682574577923,"cy":26.830878562482944,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"5Xds31NJFC5WSWmddVnFan","selected":false,"solarAbsorberPipe":{"absorberHeight":20}},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"5Xds31NJFC5WSWmddVnFan","foundationId":"5Xds31NJFC5WSWmddVnFan","id":"t7wce5cujudUUycMCvBAKg","selected":false,"dailyYield":51.241946460146316,"drawSunBeam":true,"label":"EW-N","labelHeight":4,"labelSize":2},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"5Xds31NJFC5WSWmddVnFan","foundationId":"5Xds31NJFC5WSWmddVnFan","id":"pU7aF7BDdSD7JUWEzZrwg7","selected":false,"dailyYield":36.12397534329661,"drawSunBeam":true,"label":"EW-S","labelHeight":4,"labelSize":2}],"view":{"orthographic":false,"enableRotate":true,"ambientLightIntensity":0.1,"cameraPosition":[33.85725619257774,-80.53017579058466,26.560297986535087],"cameraPosition2D":[0,-0.000020000888987681265,19.999999999987022],"panCenter":[0.3777068394391828,-0.13846137164171785,0],"panCenter2D":[0,0,0],"cameraZoom":4.904200711979575,"axes":true,"solarRadiationHeatMapMaxValue":6.5,"shadowEnabled":true,"theme":"Default","heliodon":false,"showSunAngles":false,"groundImage":false,"groundColor":"#16cda5","showMapPanel":false,"showHeliodonPanel":false,"showWeatherPanel":false,"showStickyNotePanel":true,"showSiteInfoPanel":true,"showDesignInfoPanel":false,"showInstructionPanel":false,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showDailyPvYieldPanel":false,"showYearlyPvYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"autoRotate":false,"heliodonPanelX":0,"heliodonPanelY":0,"mapPanelX":0,"mapPanelY":0,"weatherPanelX":0,"weatherPanelY":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyLightSensorPanelX":0,"dailyLightSensorPanelY":0,"yearlyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"mapZoom":18,"mapType":"roadmap","mapTilt":0,"mapWeatherStations":false,"showDailyFresnelReflectorYieldPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":-1274,"yearlyFresnelReflectorYieldPanelY":14,"dailyFresnelReflectorYieldPanelX":-5,"dailyFresnelReflectorYieldPanelY":2,"stickyNotePanelRect":{"x":0,"y":0,"width":362,"height":61},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":true,"yearlyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of azimuths of Fresnel reflectors"]}')},506:function(e){e.exports=JSON.parse('{"docid":"5syPiYyaezKe2cX7XoDs2h","time":"05/07/2023 07:59 pm","timestamp":1683503972972,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":33.4483771,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-112.0740373,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Phoenix, AZ, USA","date":"3/22/2022, 1:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1},"elements":[{"cy":-0.041483328317633114,"normal":[0,0,1],"lz":0.1,"ly":56,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.10913665374106213,"cz":0.05,"rotation":[0,0,0],"lx":48,"selected":false,"parentId":"Ground","solarStructure":2,"locked":true,"solarPowerTower":{"towerHeight":20}},{"type":"Human","name":"Jack","cx":3.2193530626125146,"cy":-2.9734078597551292,"cz":0.05000000074505806,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.8},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":0.0004895609926147317,"cy":-0.20737855784061227,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"label":"S1","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":25.54362655315038,"yearlyYield":311.4614380820491,"labelHeight":2,"labelSize":2},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.000773921356256882,"cy":0.4327509634160523,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"label":"N2","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":28.83063075372236,"yearlyYield":341.6536704139208,"labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.0027886687628078007,"cy":-0.41384481120536054,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"label":"S2","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":true,"dailyYield":23.21442400772718,"yearlyYield":285.77957159626914,"labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.003581112158779376,"cy":0.2256213567639617,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"label":"N1","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":true,"dailyYield":29.15082293688426,"yearlyYield":347.0340046876023,"labelHeight":2,"labelSize":2}],"sceneRadius":35,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#68ccca","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-59.813021886337346,-1.4084528562656211,7.556432837410264],"panCenter":[-1.9086832692892528,-2.9483395065245706,7.55643283741026],"orthographic":false,"enableRotate":true,"cameraZoom":7.169718448170838,"showInstructionPanel":false,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,50.00001246725703],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":8.5,"showDailyHeliostatYieldPanel":true,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelRect":{"x":2,"y":4,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":315,"height":67},"solarRadiationHeatMapReflectionOnly":false},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":true,"yearlyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Cosine efficiency of heliostats"]}')},507:function(e){e.exports=JSON.parse('{"docid":"gHMiemdnJcFMUxpQfVjjPt","time":"05/08/2023 09:52 am","timestamp":1683553944140,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":33.4483771,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-112.0740373,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Phoenix, AZ, USA","date":"3/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1},"elements":[{"cy":-0.1414833283176331,"normal":[0,0,1],"lz":0.1,"ly":100,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.06913665374106212,"cz":0.05,"rotation":[0,0,0],"lx":48,"selected":false,"parentId":"Ground","solarStructure":2,"locked":false,"solarPowerTower":{"towerHeight":20}},{"type":"Human","name":"Jack","cx":3.2193530626125146,"cy":-2.9734078597551292,"cz":0.05000000074505806,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.8},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.1,"cx":0.0016316459694108918,"cy":0.056499757261125036,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":28.86248835017146,"yearlyYield":311.4614380820491,"label":"F","labelHeight":2,"labelSize":2},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.1,"cx":0.001226078643743118,"cy":0.16634053951298922,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":22.075493423258955,"yearlyYield":341.6536704139208,"label":"D","labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.0015794497286664832,"cy":0.22263738972537034,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.1,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":true,"dailyYield":17.32894620185682,"yearlyYield":285.77957159626914,"label":"C","labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.001581112158779376,"cy":0.10634795978781855,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.1,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":true,"dailyYield":21.79675399494804,"yearlyYield":347.0340046876023,"label":"E","labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.0009487537946118556,"cy":0.2775217218176491,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.1,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"orwNVrz2FK5fQamnSTQ7NK","selected":false,"drawSunBeam":true,"label":"B","dailyYield":14.05825681568513,"labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.00207089526046105,"cy":0.32972836846468156,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.1,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7KyZAKPiHLomhbx7U5u64Y","selected":false,"drawSunBeam":true,"label":"A","dailyYield":11.010081200524054,"labelSize":2,"labelHeight":2}],"sceneRadius":63,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-56.03492924888614,-3.1393903550330142,35.62950235618159],"panCenter":[-1.9088390832554354,-2.9523520368213196,7.55643283741026],"orthographic":false,"enableRotate":true,"cameraZoom":10.266841665590098,"showInstructionPanel":false,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,150],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":9,"showDailyHeliostatYieldPanel":true,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelRect":{"x":6,"y":-5,"width":531,"height":342},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":397,"height":62},"solarRadiationHeatMapReflectionOnly":true},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":true,"yearlyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Shadowing and blocking among heliostats"]}')},508:function(e){e.exports=JSON.parse('{"docid":"gtHUqK811PpHW2AhT3pgKh","time":"05/07/2023 08:01 pm","timestamp":1683504079394,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":33.4483771,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-112.0740373,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Phoenix, AZ, USA","date":"3/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1},"elements":[{"cy":0.09432031355470513,"normal":[0,0,1],"lz":0.1,"ly":100,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-23.979659433364148,"cz":0.05,"rotation":[0,0,0],"lx":48,"selected":false,"parentId":"Ground","solarStructure":2,"locked":false,"solarPowerTower":{"towerHeight":10}},{"type":"Human","name":"Jade","cx":3.2193530626125146,"cy":-2.9734078597551292,"cz":0.05000000074505806,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.6},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":0.0016316459694108918,"cy":0.056499757261125036,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":29.12957022220564,"yearlyYield":311.4614380820491,"label":"L6","labelHeight":4,"labelSize":2},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":0.001226078643743118,"cy":0.16634053951298922,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":12.632105204416524,"yearlyYield":341.6536704139208,"label":"L4","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.0015794497286664832,"cy":0.22263738972537034,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":true,"dailyYield":8.640669150547245,"yearlyYield":285.77957159626914,"label":"L3","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.001581112158779376,"cy":0.10634795978781855,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":true,"dailyYield":15.667514658355707,"yearlyYield":347.0340046876023,"label":"L5","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.0009487537946118556,"cy":0.2775217218176491,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"orwNVrz2FK5fQamnSTQ7NK","selected":false,"drawSunBeam":true,"label":"L2","dailyYield":4.958857907473794,"labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.00207089526046105,"cy":0.32972836846468156,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7KyZAKPiHLomhbx7U5u64Y","selected":false,"drawSunBeam":true,"label":"L1","dailyYield":2.355020886123749,"labelHeight":4,"labelSize":2},{"type":"Human","name":"Jack","cx":3.2193530626125146,"cy":-2.9734078597551292,"cz":0.05000000074505806,"lx":0.6,"ly":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"e6VoeQYymGEdypZkwyg1QM","selected":false},{"type":"Heliostat","cx":0.0016316459694108918,"cy":0.056499757261125036,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"j3sWeAPDp1y53hV9TKpY1X","selected":false,"drawSunBeam":true,"dailyYield":28.834554606358278,"label":"H6","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.001226078643743118,"cy":0.16634053951298922,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"txZLYrcQ93XFhrpdAsV7Mp","selected":false,"drawSunBeam":true,"dailyYield":22.049770857324166,"label":"H4","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.0015794497286664832,"cy":0.22263738972537034,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"9uaB6ZaFJqdfwW82X3mBGL","selected":false,"drawSunBeam":true,"dailyYield":17.30899182389923,"label":"H3","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.001581112158779376,"cy":0.10634795978781855,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"wQcg7xgoQBPNeT1VLa2pPS","selected":false,"drawSunBeam":true,"dailyYield":21.74570231867697,"label":"H5","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.0009487537946118556,"cy":0.2775217218176491,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"xcPfzQdhBUHxAytCA4wYay","selected":false,"drawSunBeam":true,"dailyYield":14.042308959831052,"label":"H2","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.00207089526046105,"cy":0.32972836846468156,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"5otXu1RaMdbKFrMqe75zLT","selected":false,"drawSunBeam":true,"dailyYield":10.99900401218998,"label":"H1","labelHeight":4,"labelSize":2},{"type":"Foundation","cx":23.933804465569864,"cy":-0.09788249795398585,"cz":0.05,"lx":48,"ly":100,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarStructure":2,"id":"kyxcYJvhUNP9YHtYNAZTvQ","selected":false,"solarPowerTower":{"towerHeight":20}}],"sceneRadius":63,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-65.26004925031205,-40.981584348790705,10.926967172602236],"panCenter":[-8.555794568197623,-11.649776058982166,4.3178318413222065],"orthographic":false,"enableRotate":true,"cameraZoom":10.266841665590098,"showInstructionPanel":false,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,50.00001246725564],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":6,"showDailyHeliostatYieldPanel":true,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":252,"height":65},"solarRadiationHeatMapReflectionOnly":true},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":true,"yearlyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of tower height"]}')},509:function(e){e.exports=JSON.parse('{"docid":"nAyY3ZutnSxurzmrfiodKh","time":"02/02/2023 02:25 pm","timestamp":1675365924087,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":33.4483771,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-112.0740373,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Phoenix, AZ, USA","date":"6/22/2022, 1:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1},"elements":[{"cy":34.18220646310374,"normal":[0,0,1],"lz":0.5,"ly":87.56100860949408,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":0.8683182685289808,"cz":0.25,"rotation":[0,0,0],"lx":168.62126759233155,"selected":false,"parentId":"Ground","locked":true,"solarPowerTower":{"towerHeight":40}},{"type":"Human","name":"Jamelia","cx":-3.2033162315728436,"cy":-1.3034178512198427,"cz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"eskWrngRsrfsVxitmEFwUG","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.65,"ly":0.42,"lz":1.8},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":0.34571115088529475,"cy":-0.2182979146294524,"cz":0,"lx":6,"ly":8,"lz":0.1,"showLabel":false,"label":"4","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":54.973155818694394,"yearlyYield":311.4614380820491,"towerId":"eskWrngRsrfsVxitmEFwUG"},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":0.1244528472135859,"cy":-0.060705471204835396,"cz":0,"lx":6,"ly":8,"lz":0.1,"showLabel":false,"label":"3","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":54.692955030942635,"yearlyYield":341.6536704139208,"towerId":"eskWrngRsrfsVxitmEFwUG"},{"type":"Heliostat","cx":-0.30243530092478804,"cy":-0.29658463647807665,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"label":"2","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":false,"dailyYield":55.22294044579748,"yearlyYield":285.77957159626914,"towerId":"eskWrngRsrfsVxitmEFwUG"},{"type":"Heliostat","cx":-0.00477734244411093,"cy":-0.22770720532833247,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"label":"1","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":false,"dailyYield":55.6028165469799,"yearlyYield":347.0340046876023,"towerId":"eskWrngRsrfsVxitmEFwUG"},{"type":"Heliostat","cx":0.2323986704109312,"cy":-0.30954026005156543,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kTbu5NQZzH6fiJzt2zLCpV","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":53.246534571972845},{"type":"Heliostat","cx":0.17980321076544034,"cy":-0.22890280592338727,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ugqyZH3Bjuab2xu6Qr2AeU","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":53.9189143477242},{"type":"Heliostat","cx":-0.07007093092536987,"cy":-0.1429741712580097,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k7rmzdYXVhRoVennqPqJYd","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.28401806609266},{"type":"Heliostat","cx":-0.12643026558915396,"cy":-0.19914857752993684,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jSyunViQPLX4rv6KUBXXTZ","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.779971752065364},{"type":"Heliostat","cx":-0.18298718147417048,"cy":-0.27344375998511217,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q1mgBumMQuofVfZ58dfPgn","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.56772790131693},{"type":"Heliostat","cx":0.28321098315789156,"cy":-0.26509916393356936,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1BaYAuYZtqhDEGCFRqXDcs","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.94218222804658},{"type":"Heliostat","cx":0.06201663035944478,"cy":-0.01790276609260683,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4sC4oY8P4gCm2XiADRkgDQ","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.12412968997117},{"type":"Heliostat","cx":-0.005144086859809518,"cy":-0.11674424075888257,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k2hvdFozuZeFRMXA2gCxru","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.06448667864852},{"type":"Heliostat","cx":-0.07326553095576034,"cy":-0.027001203548432953,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5gLYoZoHmvvc2dfNpBoMHu","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.30383700152939},{"type":"Heliostat","cx":-0.13103631875140445,"cy":-0.07211289731219922,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qoUTmK9iTzsVRu26aQmb6S","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.69974218752444},{"type":"Heliostat","cx":-0.1817498408877485,"cy":-0.14097184690480072,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aaDc1Nt2XKdpoCZWcocB2i","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.61502536288546},{"type":"Heliostat","cx":0.18334603588670687,"cy":-0.11254934524412023,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bLKFf4eYJctoWDbAWu1oSp","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.28829012678498},{"type":"Heliostat","cx":0.22982519862747094,"cy":-0.18140829483672175,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"svsNMecQbfU155PmYUZ3Lt","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.28883413506117},{"type":"Heliostat","cx":-0.11063137798263967,"cy":0.05978827549506581,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5WMpX8TYy1KfLhVCYdMj1p","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.62627922938169},{"type":"Heliostat","cx":-0.17545943143758383,"cy":-0.015603192528220722,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rLs3CXHWy1yv3CpNwWpHSg","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.26549812503945},{"type":"Heliostat","cx":-0.24132724425771757,"cy":-0.08265006449996429,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iYKv2L4bbvL99cSYqy9g78","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.848591160974706},{"type":"Heliostat","cx":0.03729458715293578,"cy":0.08164735499997032,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6h32hqP5LZJr3g6KkvENFf","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.08288958631672},{"type":"Heliostat","cx":0.11635572065921955,"cy":0.046540137502459215,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hJpPNqZeYCYBc9ZnrtL8rd","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.96978366441096},{"type":"Heliostat","cx":0.18181232346843626,"cy":-0.01341062139199849,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oKHW4guazpWYWFUbcAtx78","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.07324281354023},{"type":"Heliostat","cx":0.23064844077878674,"cy":-0.07172825838065355,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jGpvLznPcPbkxgRNT7LmEG","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":53.5263467357541},{"type":"Heliostat","cx":0.2818686549678243,"cy":-0.14348403247835934,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7v652Vk2Y4W8Ugs74iPYyx","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.3806127412903},{"type":"Heliostat","cx":-0.3082401794844816,"cy":-0.16518710728023572,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wmMQERU6EmYPAHq1HGq5G1","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.09853407023647},{"type":"Heliostat","cx":-0.24347189333908248,"cy":-0.21316221673228722,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qmEBaJnQ1mYuWRgutUUj45","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.81901883725212},{"type":"Heliostat","cx":-0.00513145231321694,"cy":0.17906460190084825,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hgFFjf5NE1fWwscAHtJz9W","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.9869366347695},{"type":"Heliostat","cx":-0.09086411123830242,"cy":0.16501351230124764,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5E44DCctaDCtPRiHgiN8Co","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.67185579391978},{"type":"Heliostat","cx":-0.17172399438050032,"cy":0.1304794438850842,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h3FAf2Pb5iRxcMgjsAapYN","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.424415155619826},{"type":"Heliostat","cx":-0.24560426470951535,"cy":0.057288487088492074,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"phQzzL3Mgfme6Exr5WqXA9","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.464335531506855},{"type":"Heliostat","cx":-0.3116400576517767,"cy":-0.015193358806695577,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gSGxJne57KgDvvhX1w8m4S","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.33972665483218},{"type":"Heliostat","cx":0.08972170224219679,"cy":0.15564611828308753,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nvkfziKtbczLEbZ9noiReH","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.803611978337365},{"type":"Heliostat","cx":0.171198129873129,"cy":0.11877020207620374,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e7BrgrYuxziAFGXqE8Paiu","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.234951957822524},{"type":"Heliostat","cx":0.23017733494925166,"cy":0.06724953811712991,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6E7Q93GeP3kP1LK9YLZv9E","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.62121496362152},{"type":"Heliostat","cx":0.2879404739413306,"cy":-0.00008679777502193404,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nSCCumTcS91dqnMuiik1qm","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.104806039406704},{"type":"Heliostat","cx":-0.04193210541538864,"cy":0.08393432126519293,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pmLUXug8LEht87AKuCxfbz","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.86211984880036},{"type":"Heliostat","cx":-0.37846374011465295,"cy":-0.11835014001933214,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o54KAWAv76mbgsJ1MBkyC5","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.835251993794415},{"type":"Heliostat","cx":0.34465672899242206,"cy":-0.0914088308517547,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"f7h8FDUa15ALkGHaRaG5Hv","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.60557336298944},{"type":"Heliostat","cx":-0.3756811771658677,"cy":-0.2797037551261536,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2waE2goJnuKsD2ZPsCBxqm","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.239096027800045},{"type":"Heliostat","cx":-0.0055636104805840934,"cy":0.0022188088978148607,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w5ovRP3PCZ5upU3ukAjjLY","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.57798820659272},{"type":"Heliostat","cx":-0.431634308052032,"cy":-0.21576415823811107,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jLzYFijeuhoktLs4FcLsmr","selected":false,"drawSunBeam":true,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.655113036860335},{"type":"Heliostat","cx":0.3946630399862396,"cy":-0.19563113598332482,"cz":0.5000000074506517,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"b3S1EEPjMRL48HLhjJkhr2","selected":false,"drawSunBeam":true,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.25718216433262},{"type":"Heliostat","cx":0.12498761867946595,"cy":-0.17981546405024668,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aqxtvZXmbpAutc5KFCX7w3","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.07130415709169},{"type":"Heliostat","cx":0.07239701626792935,"cy":-0.14059769948158687,"cz":0.5000000074506517,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qn5fUEqKYEJLMaMGhD5V2c","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.18946575400989},{"type":"Heliostat","cx":-0.24287237174377305,"cy":-0.3185781749765691,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4t86vx9fAWouPiFQswUJGQ","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.72330556669799},{"type":"Heliostat","cx":0.18153469158750113,"cy":-0.3291164926045614,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rufeUy74dsTyxkeFYKX4qa","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.045757801118675},{"type":"Heliostat","cx":0.12559565172148782,"cy":-0.27759582864548765,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6GXoab5MEeebRm4uGu1EG9","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.60344034574142},{"type":"Heliostat","cx":0.062360215351212084,"cy":-0.2448099515806225,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w5TEya7XNeGuhPop6Pj6Es","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.12631354865891},{"type":"Heliostat","cx":-0.072015086935624,"cy":-0.24832272412328657,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eDoKDbTtFpnA5S8UAeT5JD","selected":false,"drawSunBeam":true,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.944324146238436},{"type":"Heliostat","cx":-0.12856215984365912,"cy":-0.30569800901213173,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bybZmMq5HCRUCdJHjru2JV","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.723474182002164},{"type":"Foundation","cx":0.18915570284600136,"cy":-14.72071217951015,"cz":2,"lx":10,"ly":10,"lz":4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"eskWrngRsrfsVxitmEFwUG","solarStructure":2,"locked":true,"solarPowerTower":{"towerHeight":40}},{"type":"Human","name":"Jett","cx":-77.63892197350822,"cy":-41.607852899711375,"cz":0.2499999999999991,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"ipe6xTyA51gao39GpL4FGX","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Desert","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#b3b3b3","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-114.20211728357525,-13.511893921234794,7.261369217489994],"panCenter":[-1.8505902264752938,-3.0386998652965884,7.261369217489986],"orthographic":false,"enableRotate":true,"cameraZoom":4.292775278858745,"showInstructionPanel":false,"showMapPanel":false,"cameraPosition2D":[30.004072506948148,24.229268474745034,50.000024229971295],"panCenter2D":[30.004072506948148,24.2293184769675,0.00002423000647812703],"solarRadiationHeatMapMaxValue":10,"showDailyHeliostatYieldPanel":true,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":364,"height":67}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar power tower surrounded by heliostats"]}')},510:function(e){e.exports=JSON.parse('{"docid":"cyN6tPCHQrmsUsTWTWV7Bq","time":"02/01/2023 08:28 pm","timestamp":1675301282345,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"date":"6/22/2022, 12:00:00 PM","timesPerHour":6,"address":"Tucson, AZ, USA","latitude":32.2226066,"longitude":-110.9747108,"name":"default","orthographic":false,"cameraZoom":35,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"noAnimationForSensorDataCollection":true,"noAnimationForHeatmapSimulation":true},"elements":[{"selected":false,"cz":0,"cx":-2.454909082526056,"type":"Human","id":"3NsNQgPftGsbYSoSRa2zV4","normal":[0,1,0],"cy":-1.9037352844719955,"name":"Jaye","rotation":[0,0,0],"parentId":"Ground","lx":0.6,"ly":0.6,"lz":1.65},{"cx":0.20566332108722207,"color":"gray","cz":1.3564241923192988,"type":"Cuboid","lz":2.7128483846385976,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":3.646712311386908,"cy":0.10935014088128625,"rotation":[0,0,0],"lx":2.2290047878920136,"id":"2QtCNEmEF6Mcs3vbbR96ZT","selected":false,"parentId":"Ground"},{"ly":0.1,"selected":false,"type":"Sensor","showLabel":false,"normal":[0,0,1],"lz":0.01,"rotation":[0,0,0],"lx":0.1,"cz":0.5000000000000002,"cx":-0.007027589631907428,"cy":0.03130304552555022,"id":"iqgmPt2Nm3r4bW8A7g6DJy","label":"Predicted (Hor.)","parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"lz":0.01,"showLabel":false,"rotation":[0,0,0],"cy":-0.4999999988722324,"selected":false,"id":"1GCXGRbm6nuTH23uA8Yngz","cx":0.021624712729279145,"normal":[0,-1,0],"cz":0.03360969587566309,"ly":0.1,"type":"Sensor","label":"Predicted (Ver.)","lx":0.1,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"}],"view":{"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":true,"autoRotate":false,"showGroundPanel":false,"yearlyLightSensorPanelY":4,"stickyNotePanelX":6,"mapType":"roadmap","weatherPanelY":0,"shadowEnabled":true,"theme":"Default","stickyNotePanelY":0,"mapWeatherStations":false,"groundColor":"#16cda5","heliodon":false,"dailyLightSensorPanelX":-19,"axes":true,"showWeatherPanel":false,"dailyLightSensorPanelY":15,"mapTilt":0,"heliodonPanelX":-1235,"groundPanelY":0,"heliodonPanelY":7,"groundImage":false,"mapZoom":16,"showStickyNotePanel":true,"groundPanelX":0,"weatherPanelX":0,"yearlyLightSensorPanelX":-8,"showHeliodonPanel":false,"cameraPosition":[8.133880295141486,-8.174433278152733,4.6847078485248606],"panCenter":[4.464757127641991,2.597260416450505,0.5357741885065452],"orthographic":false,"enableRotate":true,"cameraZoom":28.63945562104857,"cameraPosition2D":[0,-0.00004000177797536253,39.99999999997991],"panCenter2D":[0,0,0],"showMapPanel":false,"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"stickyNotePanelRect":{"x":-5,"y":5,"width":339,"height":74}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar radiation: Prediction vs. Measurement"]}')},511:function(e){e.exports=JSON.parse('{"docid":"gbXM1tEmZzS8k1fXMr7e4c","time":"02/04/2023 12:04 pm","timestamp":1675530248432,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"12/22/2023, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Denver, CO, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":39.7392358,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-104.990251,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-0.8479752220394552,"cy":-6.151925396723704,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-0.00341839393728538,"cy":0.6271804028246559,"cz":0.05,"lx":10,"ly":10,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":4},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"","showLabel":false,"labelHeight":8.5,"labelSize":0.8,"rValue":5.283308619189682},{"type":"Wall","cx":-2.220446049250313e-16,"cy":2.5,"cz":2.2408122612280286,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[3.9999999999999996,2.5,0],"rightPoint":[-4,2.5,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":3.999999999999999,"cy":-0.49999999999999956,"cz":2.2301039869226305,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[3.9999999999999982,-3.499999999999999,0],"rightPoint":[4,2.5,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":2.220446049250313e-16,"cy":-3.4999999999999996,"cz":2.268765007024547,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-3.9999999999999996,-3.499999999999999,0],"rightPoint":[4,-3.5,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-4.000000000000001,"cy":-0.49999999999999956,"cz":2.228839888904333,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-4,2.5,0],"rightPoint":[-4.000000000000002,-3.499999999999999,0],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Window","cx":-0.25,"cy":0.3,"cz":0,"lx":0.375,"ly":0.2,"lz":0.7407407407407407,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#cccccc","tint":"#73D8FF","opacity":0.21,"uValue":1.98,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"5cYjXS4vMUpWUASfp6LsaY"},{"type":"Window","cx":0.25,"cy":0.3,"cz":0,"lx":0.375,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"edHVWga9uF8kxRK4efRqds","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj","wugyuZMsPdNUQJ1PdoxEGD","py4fscALBHuoNNVWKoXS9c","xi9Zz1pobWAhkAdtkZFZBZ"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"vBPx8vrh1SNvECDHWBPRBR","volumetricHeatCapacity":0.1,"ceiling":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-5.192350773225651,-4.0711716850268145,-0.000004027338022569633],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-5.192350773225651,-4.071321691694211,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[7.8185785102529906,-10.621731483534056,2.062041901327996],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":453,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":45.441463616067075,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-1194,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.8531721737261184,2.5703581157054773,0.7819560454316943],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-277,"y":233,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":true,"yearlyBuildingEnergyPanelRect":{"x":-2,"y":5,"width":775,"height":342},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-2,"y":0,"width":225,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["BESTEST Case 600"]}')},512:function(e){e.exports=JSON.parse('{"docid":"rSjWfLHkJUuBXYDJVZ7K7Z","time":"02/03/2023 07:07 pm","timestamp":1675469237287,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"12/22/2023, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Denver, CO, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":39.7392358,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-104.990251,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-0.8479752220394552,"cy":-6.151925396723704,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-0.00341839393728538,"cy":0.6271804028246559,"cz":0.05,"lx":10,"ly":8,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":4},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"","showLabel":false,"labelHeight":8.5,"labelSize":0.8,"rValue":5.283308619189682},{"type":"Wall","cx":-2.220446049250313e-16,"cy":2.5,"cz":2.2408122612280286,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[3.9999999999999996,2.5,0],"rightPoint":[-4,2.5,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":3.999999999999999,"cy":-0.49999999999999956,"cz":2.2301039869226305,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[3.9999999999999982,-3.499999999999999,0],"rightPoint":[4,2.5,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":2.220446049250313e-16,"cy":-3.4999999999999996,"cz":2.268765007024547,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-3.9999999999999996,-3.499999999999999,0],"rightPoint":[4,-3.5,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-4.000000000000001,"cy":-0.49999999999999956,"cz":2.228839888904333,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-4,2.5,0],"rightPoint":[-4.000000000000002,-3.499999999999999,0],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Window","cx":-0.25,"cy":0.3,"cz":0,"lx":0.375,"ly":0.2,"lz":0.7407407407407407,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#cccccc","tint":"#73D8FF","opacity":0.21,"uValue":1.98,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"5cYjXS4vMUpWUASfp6LsaY"},{"type":"Window","cx":0.25,"cy":0.3,"cz":0,"lx":0.375,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"edHVWga9uF8kxRK4efRqds","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj","wugyuZMsPdNUQJ1PdoxEGD","py4fscALBHuoNNVWKoXS9c","xi9Zz1pobWAhkAdtkZFZBZ"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"vBPx8vrh1SNvECDHWBPRBR","volumetricHeatCapacity":0.1,"ceiling":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[12.940867975227082,3.763083016970702,0.000003785257595501958],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[12.940867975227082,3.7629330102992693,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[10.826418732519464,-13.023829528886234,2.75514975469418],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":713,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":41.010920913500534,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-1192,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[3.447654823068404,9.854417213021707,0.03152947137006695],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-168,"y":465,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":true,"yearlyBuildingEnergyPanelRect":{"x":-32,"y":11,"width":775,"height":342},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-4,"y":0,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["BESTEST Case 610"]}')},513:function(e){e.exports=JSON.parse('{"docid":"hCJ4qTBLMgzCCrmVBvT6Er","time":"02/04/2023 12:05 pm","timestamp":1675530329920,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"12/22/2023, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Denver, CO, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":39.7392358,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-104.990251,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-0.8479752220394552,"cy":-6.151925396723704,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-0.00341839393728538,"cy":0.6271804028246559,"cz":0.05,"lx":10,"ly":10,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":4},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"","showLabel":false,"labelHeight":8.5,"labelSize":0.8,"rValue":5.283308619189682},{"type":"Wall","cx":-2.220446049250313e-16,"cy":2.5,"cz":2.2408122612280286,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[3.9999999999999996,2.5,0],"rightPoint":[-4,2.5,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":3.999999999999999,"cy":-0.49999999999999956,"cz":2.2301039869226305,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[3.9999999999999982,-3.499999999999999,0],"rightPoint":[4,2.5,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":2.220446049250313e-16,"cy":-3.4999999999999996,"cz":2.268765007024547,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-3.9999999999999996,-3.499999999999999,0],"rightPoint":[4,-3.5,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-4.000000000000001,"cy":-0.49999999999999956,"cz":2.228839888904333,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-4,2.5,0],"rightPoint":[-4.000000000000002,-3.499999999999999,0],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj","wugyuZMsPdNUQJ1PdoxEGD","py4fscALBHuoNNVWKoXS9c","xi9Zz1pobWAhkAdtkZFZBZ"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"vBPx8vrh1SNvECDHWBPRBR","volumetricHeatCapacity":0.1,"ceiling":false},{"type":"Window","cx":0,"cy":0.3,"cz":0,"lx":0.5000000000000001,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kUbRYwVoGDc7GFwgriV2eg","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Window","cx":0,"cy":0.3,"cz":0,"lx":0.5000000000000001,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2bnQyuWKAaZeiivebKX7uN","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-5.192350773225651,-4.0711716850268145,-0.000004027338022569633],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-5.192350773225651,-4.071321691694211,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[11.427289283038643,-11.277019680971108,2.795880222169619],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":453,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":45.441463616067075,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-1194,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.8699123691558452,2.578944652142625,0.7819560454316943],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-277,"y":233,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":true,"yearlyBuildingEnergyPanelRect":{"x":-2,"y":5,"width":775,"height":342},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-5,"y":-2,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["BESTEST Case 620"]}')},514:function(e){e.exports=JSON.parse('{"docid":"67HXdfbAHrwMfJ2uYxYEr9","time":"02/04/2023 12:05 pm","timestamp":1675530342623,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"12/22/2023, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Denver, CO, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":39.7392358,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-104.990251,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-0.8479752220394552,"cy":-6.151925396723704,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-0.00341839393728538,"cy":0.6271804028246559,"cz":0.05,"lx":10,"ly":10,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":4},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"","showLabel":false,"labelHeight":8.5,"labelSize":0.8,"rValue":5.283308619189682},{"type":"Wall","cx":-2.220446049250313e-16,"cy":2.5,"cz":2.2408122612280286,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[3.9999999999999996,2.5,0],"rightPoint":[-4,2.5,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":3.999999999999999,"cy":-0.49999999999999956,"cz":2.2301039869226305,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[3.9999999999999982,-3.499999999999999,0],"rightPoint":[4,2.5,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":2.220446049250313e-16,"cy":-3.4999999999999996,"cz":2.268765007024547,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-3.9999999999999996,-3.499999999999999,0],"rightPoint":[4,-3.5,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-4.000000000000001,"cy":-0.49999999999999956,"cz":2.228839888904333,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-4,2.5,0],"rightPoint":[-4.000000000000002,-3.499999999999999,0],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-0.05384985471511783,"cy":1.4780044124957141,"cz":2.2408122612280286,"lx":1,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":[],"rightJoints":["kFtcq9qJ814nEePHMgSpYL"],"leftPoint":[0.44615014528488217,1.4780044124957141,0.1],"rightPoint":[-0.5538498547151178,1.4780044124957141,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pEW367Y1exs7be2pbQHztg","parentId":"pVKekTH3vBaJDuKFqWJNR3","foundationId":"pVKekTH3vBaJDuKFqWJNR3","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"sEJTDSykek3p5kyccPdUdD","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Foundation","cx":4.561959864141299,"cy":0.16041396503555294,"cz":0.05,"lx":2.922675695011217,"ly":3.0478862418425114,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3},"labelHeight":8.5,"labelSize":0.8,"showLabel":false,"id":"pVKekTH3vBaJDuKFqWJNR3","selected":false,"rValue":5.283308619189682},{"type":"Wall","cx":-0.05384985471511783,"cy":-1.5219955875042859,"cz":2.2408122612280286,"lx":1.004987562112089,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["kFtcq9qJ814nEePHMgSpYL"],"rightJoints":[],"leftPoint":[-0.5538498547151178,-1.5219955875042859,0.1],"rightPoint":[0.44615014528488217,-1.5219955875042859,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"vX5VrXQkMJaYbWcrM1Z6Lz","parentId":"pVKekTH3vBaJDuKFqWJNR3","foundationId":"pVKekTH3vBaJDuKFqWJNR3","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"sEJTDSykek3p5kyccPdUdD","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-0.5538498547151178,"cy":-0.021995587504285874,"cz":0,"lx":2.9999999999999996,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Empty","leftJoints":["pEW367Y1exs7be2pbQHztg"],"rightJoints":["vX5VrXQkMJaYbWcrM1Z6Lz"],"leftPoint":[-0.5538498547151178,1.4780044124957137,0.1],"rightPoint":[-0.5538498547151178,-1.5219955875042859,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kFtcq9qJ814nEePHMgSpYL","parentId":"pVKekTH3vBaJDuKFqWJNR3","foundationId":"pVKekTH3vBaJDuKFqWJNR3","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"sEJTDSykek3p5kyccPdUdD","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["vX5VrXQkMJaYbWcrM1Z6Lz","kFtcq9qJ814nEePHMgSpYL","pEW367Y1exs7be2pbQHztg"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"pVKekTH3vBaJDuKFqWJNR3","foundationId":"pVKekTH3vBaJDuKFqWJNR3","id":"sEJTDSykek3p5kyccPdUdD","ceiling":false},{"type":"Window","cx":0,"cy":0.3,"cz":0,"lx":0.5000000000000001,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jr5eRruUgVNaMyJ4BgMJfz","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Window","cx":0,"cy":0.3,"cz":0,"lx":0.5000000000000001,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"85V2NYuPDyi8cjwzsRQJ5n","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Wall","cx":-0.05384985471511783,"cy":1.4780044124957141,"cz":2.2408122612280286,"lx":1,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":[],"rightJoints":["4vW6e4BZW3jyozPbqjnt5D"],"leftPoint":[0.44615014528488217,1.4780044124957141,0.1],"rightPoint":[-0.5538498547151178,1.4780044124957141,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"wAZYpbu3zMiGQjV2LpAcDG","parentId":"93LBsy6WnVM9PgJ49pUP7g","foundationId":"93LBsy6WnVM9PgJ49pUP7g","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pKTG8B6HTAm7A7dtN3ZbsU","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-0.05384985471511783,"cy":-1.5219955875042859,"cz":2.2408122612280286,"lx":1.004987562112089,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["4vW6e4BZW3jyozPbqjnt5D"],"rightJoints":[],"leftPoint":[-0.5538498547151178,-1.5219955875042859,0.1],"rightPoint":[0.44615014528488217,-1.5219955875042859,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"7vsveQVeKqeZenZ1pDApJC","parentId":"93LBsy6WnVM9PgJ49pUP7g","foundationId":"93LBsy6WnVM9PgJ49pUP7g","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pKTG8B6HTAm7A7dtN3ZbsU","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-0.5538498547151178,"cy":-0.021995587504285874,"cz":0,"lx":2.9999999999999996,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Empty","leftJoints":["wAZYpbu3zMiGQjV2LpAcDG"],"rightJoints":["7vsveQVeKqeZenZ1pDApJC"],"leftPoint":[-0.5538498547151178,1.4780044124957137,0.1],"rightPoint":[-0.5538498547151178,-1.5219955875042859,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"4vW6e4BZW3jyozPbqjnt5D","parentId":"93LBsy6WnVM9PgJ49pUP7g","foundationId":"93LBsy6WnVM9PgJ49pUP7g","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pKTG8B6HTAm7A7dtN3ZbsU","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"id":"pKTG8B6HTAm7A7dtN3ZbsU","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"color":"#4d4d4d","rValue":4,"sideColor":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"93LBsy6WnVM9PgJ49pUP7g","foundationId":"93LBsy6WnVM9PgJ49pUP7g","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["7vsveQVeKqeZenZ1pDApJC","4vW6e4BZW3jyozPbqjnt5D","wAZYpbu3zMiGQjV2LpAcDG"],"selected":false,"ceiling":false},{"type":"Foundation","cx":-4.58324969491131,"cy":0.09837545208621207,"cz":0.05,"lx":2.922675695011217,"ly":3.0478862418425114,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3},"labelHeight":8.5,"labelSize":0.8,"showLabel":false,"id":"93LBsy6WnVM9PgJ49pUP7g","selected":false,"rValue":5.283308619189682},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj","wugyuZMsPdNUQJ1PdoxEGD","py4fscALBHuoNNVWKoXS9c","xi9Zz1pobWAhkAdtkZFZBZ"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"vBPx8vrh1SNvECDHWBPRBR","volumetricHeatCapacity":0.1,"ceiling":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-1.0768229629118022,2.7613875173197986,0.0000027683726328203026],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-1.0768229629118022,2.7612375106561817,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[14.12898513990324,-7.74877596104179,2.534986637546045],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":453,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":75.89554049207445,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-1194,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[4.485245288976777,3.6907945473464463,2.058363039574734],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-1262,"y":232,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":true,"yearlyBuildingEnergyPanelRect":{"x":-32,"y":11,"width":775,"height":342},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-3,"y":-3,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["BESTEST Case 630"]}')},515:function(e){e.exports=JSON.parse('{"docid":"1mt3H85vSeLycnvzEbiGLF","timestamp":1647905546466,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":39.0042841,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-3.3716443,"ground":{"albedo":0.32,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"13200 Manzanares, Ciudad Real, Spain","date":"6/8/2022 2:30:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":2,"sutGridCellSize":5,"diurnalTemperatureModel":2,"highestTemperatureTimeInMinutes":930,"noAnimationForSolarUpdraftTowerSimulation":true,"noAnimationForSensorDataCollection":true,"noAnimationForHeatmapSimulation":false,"airConvectiveCoefficient":10},"elements":[{"cy":0.8227637571854691,"normal":[0,0,1],"lz":0.5,"ly":250,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.8016636577985707,"cz":0.05,"rotation":[0,0,0],"lx":250,"selected":false,"parentId":"Ground","solarReceiverHeight":20,"locked":false,"solarStructure":3,"color":"#cccccc","solarUpdraftTower":{"collectorHeight":2,"collectorRadius":122,"chimneyHeight":195,"chimneyRadius":5,"collectorEmissivity":0.9,"collectorTransmissivity":0.8,"turbineEfficiency":0.3}},{"type":"Sensor","cx":-0.4159783264084858,"cy":0.39987868253676767,"cz":0.5000000074505806,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o2v8sLskiRxHNQMJYgmnf4","selected":false},{"type":"Human","name":"Jack","cx":-101.47750420174262,"cy":106.72814742414681,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"nRWqXrYCJwuMMKPznon3yj","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":50,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":-605,"showGroundPanel":false,"showHeliodonPanel":true,"heliodon":false,"weatherPanelY":53,"heliodonPanelX":-1226,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":60,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-1231,"weatherPanelX":606,"heliodonPanelY":482,"groundColor":"#68ccca","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[-286.26711514248836,-379.63764367710024,88.70698003902253],"panCenter":[31.318634005291777,-33.73977035496972,57.75472306965425],"orthographic":false,"enableRotate":true,"cameraZoom":1.8893648827547527,"showInstructionPanel":true,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,50.00001246725617],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":7,"showDailyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"showDailyUpdraftTowerYieldPanel":true,"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelX":1237,"diurnalTemperaturePanelY":239,"dailyUpdraftTowerYieldPanelX":-3,"dailyUpdraftTowerYieldPanelY":18},"notes":[]}')},516:function(e){e.exports=JSON.parse('{"docid":"snT8RSM4bna2exT4SbrKpx","timestamp":1647994374708,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":25.206789542006906,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":55.273800285141746,"ground":{"albedo":0.32,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Dubai - United Arab Emirates","date":"4/22/2022 1:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":2,"sutGridCellSize":5,"diurnalTemperatureModel":2,"highestTemperatureTimeInMinutes":930,"noAnimationForSolarUpdraftTowerSimulation":true,"noAnimationForSensorDataCollection":true,"noAnimationForHeatmapSimulation":false,"airConvectiveCoefficient":10},"elements":[{"cy":-14.779474133308753,"normal":[0,0,1],"lz":0.5,"ly":264.0330484296776,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-13.154176421163392,"cz":0.05,"rotation":[0,0,0],"lx":454.50633176715684,"selected":false,"parentId":"Ground","solarReceiverHeight":20,"locked":false,"solarStructure":3,"color":"#16a5a5","solarUpdraftTower":{"collectorHeight":2,"collectorRadius":122,"chimneyHeight":195,"chimneyRadius":5,"collectorEmissivity":0.9,"collectorTransmissivity":0.8,"turbineEfficiency":0.3},"textureType":"No Foundation Texture"},{"type":"Sensor","cx":-0.11120328110703694,"cy":0.21015039060624294,"cz":0.5000000074505806,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o2v8sLskiRxHNQMJYgmnf4","selected":false},{"type":"Cuboid","cx":2.1177379727110406,"cy":160.51534566937434,"cz":74.09390657882601,"lx":78.30098332647403,"ly":55.99394288505539,"lz":148.18781315765202,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.025752033646721628],"parentId":"Ground","selected":false,"id":"2EhrboeXntUZKiBN3HjSix"},{"type":"Cuboid","cx":50.66161337498563,"cy":207.36077727687461,"cz":32.43138091159533,"lx":145.9842111895511,"ly":125.02724353031309,"lz":64.86276182319067,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.13048951214355942],"parentId":"Ground","id":"6Xn8R7eKSnxRxHnYpiNTaj","selected":false},{"type":"Cuboid","cx":-72.11151802635683,"cy":193.1105351858589,"cz":37.54389418882869,"lx":180.92996331753585,"ly":104.88750828847839,"lz":75.08778837765738,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.4372817352121965],"parentId":"Ground","id":"qmmFDRVBHd8n28gezjkd3v","selected":false},{"type":"Cuboid","cx":153.53794529088543,"cy":135.2714939761318,"cz":28.458907280218547,"lx":236.41206811774626,"ly":73.3973881158558,"lz":56.917814560437094,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.0889289069735497],"parentId":"Ground","id":"6WFEHvBHfcw1hyoqbdVq2Q","selected":false},{"type":"Cuboid","cx":197.28140665982946,"cy":-49.22558984875294,"cz":23.43801759070747,"lx":72.3188854798575,"ly":208.05225786437427,"lz":46.87603518141494,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.13048951214355942],"parentId":"Ground","id":"wVZSZy2dQew3t36trixDr8","selected":false},{"type":"Cuboid","cx":-201.1839566931086,"cy":103.76736037364329,"cz":23.43801759070747,"lx":180.92996331753585,"ly":104.88750828847839,"lz":46.87603518141494,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.7727363696866378],"parentId":"Ground","id":"1QdVXZ9PmC9w7nnsHyZH8T","selected":false},{"type":"Cuboid","cx":-255.36665065884822,"cy":-36.73723769206747,"cz":18.59922423283554,"lx":225.13779640089743,"ly":104.62558934593119,"lz":37.19844846567108,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,1.5327638573782314],"parentId":"Ground","id":"raZT6wgNraS3Vp9bqR82TD","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":18,"axes":false,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":50,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":-605,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":53,"heliodonPanelX":-1226,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":60,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-1231,"weatherPanelX":606,"heliodonPanelY":482,"groundColor":"#68ccca","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-90.01171835895659,-555.4483085712341,96.07353497556753],"panCenter":[-9.153086630446868,47.334689777283224,96.07353497556753],"orthographic":false,"enableRotate":true,"cameraZoom":1.8893648827547527,"showInstructionPanel":true,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,50.00001246725617],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":5,"showDailyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"showDailyUpdraftTowerYieldPanel":false,"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelX":1237,"diurnalTemperaturePanelY":239,"dailyUpdraftTowerYieldPanelX":-3,"dailyUpdraftTowerYieldPanelY":18},"notes":[]}')},517:function(e){e.exports=JSON.parse('{"docid":"vW4e6RYtysT2Mk4RJsMwWK","timestamp":1647108232108,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"longitude":-110.90092954103089,"solarRadiationHeatmapGridCellSize":1,"discretization":"Approximate","timesPerHour":4,"date":"9/22/2022 1:15:00 PM","name":"default","solarPanelVisibilityGridCellSize":0.2,"airAttenuationCoefficient":0.01,"pvGridCellSize":0.5,"latitude":32.15910168004556,"address":"4346 E Irvington Rd, Tucson, AZ 85714, USA","ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"cspTimesPerHour":4,"cspGridCellSize":1},"elements":[{"textureType":"No Foundation Texture","lz":0.1,"ly":428,"cx":-12.823413575842814,"locked":false,"type":"Foundation","id":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"lx":111.22000916830105,"solarAbsorberPipe":{"absorberHeight":16,"apertureWidth":1},"rotation":[0,0,0],"parentId":"Ground","cz":0.05,"cy":-21.37347182127145,"normal":[0,0,1]},{"reflectance":0.9,"label":"1","absorptance":0.95,"poleHeight":0.2,"selected":false,"drawSunBeam":true,"poleRadius":0.05,"type":"Fresnel Reflector","relativeAzimuth":0,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","parentId":"kxHYpYsUs7XEocuTYAj1Qu","cx":-0.4012211769217936,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","ly":420,"showLabel":false,"cz":0,"dailyYield":148.93207880790618,"cy":0.006680793972906053,"opticalEfficiency":0.7,"moduleLength":20,"lx":2.5,"lz":0.1,"normal":[0,0,1],"tiltAngle":0,"thermalEfficiency":0.3,"rotation":[0,0,0],"id":"gGEdWUHCti1PrRxJ7JDarq"},{"poleRadius":0.05,"rotation":[0,0,0],"relativeAzimuth":0,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"reflectance":0.9,"tiltAngle":0,"cz":0,"cx":-0.3742476132399176,"showLabel":false,"ly":420,"normal":[0,0,1],"poleHeight":0.2,"selected":false,"lz":0.1,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"3xn438z3EMLSwNjb9D63WM","lx":2.5,"type":"Fresnel Reflector","cy":0.006680793972906053,"drawSunBeam":true},{"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"poleHeight":0.2,"id":"bLwgNAfScj3MbJ3LCbgVeJ","cx":0.4118441240173573,"rotation":[0,0,0],"receiverId":"jbxC2ET67y7TWpMwnYUQpG","ly":420,"poleRadius":0.05,"reflectance":0.9,"cy":0.006920168618473448,"tiltAngle":0,"cz":0.5000000074505806,"lz":0.1,"moduleLength":20,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","showLabel":false,"drawSunBeam":true,"normal":[0,0,1],"lx":2.5,"type":"Fresnel Reflector","selected":false},{"lz":0.1,"cy":0.006920164646334277,"cx":0.38874501986607163,"ly":420,"reflectance":0.9,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"n7GLSN9b7KQJT3M3e1Gbd6","lx":2.5,"moduleLength":20,"tiltAngle":0,"normal":[0,0,1],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleHeight":0.2,"cz":0.5000000074506161,"rotation":[0,0,0],"relativeAzimuth":0,"drawSunBeam":true,"selected":false,"poleRadius":0.05,"type":"Fresnel Reflector","showLabel":false},{"selected":false,"parentId":"Ground","type":"Cuboid","color":"gray","cx":-52.4956763602033,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cz":2.295137859741913,"ly":6.761851189958324,"id":"2ef4fdCaFagjkM5oc3rwcu","faceColors":["gray","gray","gray","gray","gray","gray"],"lx":17.519341460326316,"rotation":[0,0,0],"cy":209.0290599516856,"normal":[0,0,1],"lz":4.590275719483826},{"ly":420,"rotation":[0,0,0],"poleHeight":0.2,"lz":0.1,"moduleLength":20,"cz":0.5000000074506517,"id":"8GG67NKVFrvbH3J8prHsci","showLabel":false,"poleRadius":0.05,"selected":false,"reflectance":0.9,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","normal":[0,0,1],"type":"Fresnel Reflector","parentId":"kxHYpYsUs7XEocuTYAj1Qu","tiltAngle":0,"cy":0.006920160674195108,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cx":0.3629408980758779,"relativeAzimuth":0,"drawSunBeam":true,"lx":2.5},{"lx":2.5,"moduleLength":20,"type":"Fresnel Reflector","relativeAzimuth":0,"cy":0.006920156702055938,"poleHeight":0.2,"poleRadius":0.05,"cz":0.5000000074506872,"selected":false,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","normal":[0,0,1],"showLabel":false,"rotation":[0,0,0],"id":"iiCPQvzxSxVKeMzjiCWt4r","drawSunBeam":true,"lz":0.1,"reflectance":0.9,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cx":0.33443175864677654,"ly":420,"tiltAngle":0,"parentId":"kxHYpYsUs7XEocuTYAj1Qu"},{"type":"Fresnel Reflector","normal":[0,0,1],"id":"48A3HEC1e87s6pvydn6P2h","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","ly":420,"poleHeight":0.2,"selected":false,"cx":0.3059226192176751,"rotation":[0,0,0],"tiltAngle":0,"relativeAzimuth":0,"lx":2.5,"cy":0.006920152729916776,"lz":0.1,"moduleLength":20,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleRadius":0.05,"drawSunBeam":true,"cz":0.5000000074507227,"showLabel":false,"reflectance":0.9,"parentId":"kxHYpYsUs7XEocuTYAj1Qu"},{"normal":[0,0,1],"rotation":[0,0,0],"poleHeight":0.2,"type":"Fresnel Reflector","id":"p9gJ8g2kx38fJVQXUT5Mgz","cx":0.27741347978857367,"moduleLength":20,"relativeAzimuth":0,"showLabel":false,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cz":0.5000000074507582,"lx":2.5,"reflectance":0.9,"poleRadius":0.05,"selected":false,"lz":0.1,"ly":420,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","cy":0.0069201487577776055,"tiltAngle":0,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","drawSunBeam":true},{"relativeAzimuth":0,"showLabel":false,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074507938,"selected":false,"normal":[0,0,1],"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0],"moduleLength":20,"poleRadius":0.05,"drawSunBeam":true,"cy":0.006920144785638444,"tiltAngle":0,"id":"nUiryBqcmAQ2AAWDiEELcv","cx":0.24890434035947226,"lz":0.1,"ly":420,"poleHeight":0.2,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","reflectance":0.9,"type":"Fresnel Reflector","lx":2.5},{"ly":420,"reflectance":0.9,"poleRadius":0.05,"showLabel":false,"type":"Fresnel Reflector","relativeAzimuth":0,"normal":[0,0,1],"receiverId":"jbxC2ET67y7TWpMwnYUQpG","parentId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074508293,"poleHeight":0.2,"cx":0.22039520093037082,"selected":false,"tiltAngle":0,"moduleLength":20,"lx":2.5,"rotation":[0,0,0],"cy":0.006920140813499274,"drawSunBeam":true,"lz":0.1,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"c1WTMXLtugeCdJwSfZWMz9"},{"poleHeight":0.2,"ly":420,"lx":2.5,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","showLabel":false,"selected":false,"relativeAzimuth":0,"cz":0.5000000074508648,"drawSunBeam":true,"rotation":[0,0,0],"poleRadius":0.05,"cx":0.1918860615012694,"type":"Fresnel Reflector","lz":0.1,"id":"3Kj4GK5Z8rMjFhG7kwoBBb","tiltAngle":0,"reflectance":0.9,"normal":[0,0,1],"cy":0.006920136841360104,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"receiverId":"jbxC2ET67y7TWpMwnYUQpG"},{"receiverId":"jbxC2ET67y7TWpMwnYUQpG","relativeAzimuth":0,"cx":0.16337692207216795,"tiltAngle":0,"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"poleHeight":0.2,"drawSunBeam":true,"type":"Fresnel Reflector","cz":0.5000000074509003,"poleRadius":0.05,"id":"gRmwqsLeYTEckzUeWsqBhN","showLabel":false,"normal":[0,0,1],"lx":2.5,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"reflectance":0.9,"lz":0.1,"cy":0.006920132869220934,"ly":420},{"cz":0.5000000074509359,"cy":0.006920128897081764,"drawSunBeam":true,"type":"Fresnel Reflector","ly":420,"selected":false,"poleHeight":0.2,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleRadius":0.05,"tiltAngle":0,"cx":0.13486778264306654,"lz":0.1,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","showLabel":false,"id":"joT2iHz7uZVy7UaUNMCzBF","moduleLength":20,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"lx":2.5,"rotation":[0,0,0],"reflectance":0.9,"normal":[0,0,1]},{"normal":[0,0,1],"id":"itX4GCN56fDPamdgJYAmwQ","selected":false,"lx":2.5,"drawSunBeam":true,"showLabel":false,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074509714,"cx":0.10635864321396508,"lz":0.1,"cy":0.006920124924942602,"poleHeight":0.2,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","type":"Fresnel Reflector","rotation":[0,0,0],"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","tiltAngle":0,"poleRadius":0.05,"moduleLength":20,"relativeAzimuth":0,"ly":420,"reflectance":0.9},{"type":"Fresnel Reflector","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","poleHeight":0.2,"cy":0.00692012095280344,"cz":0.5000000074510069,"ly":420,"relativeAzimuth":0,"drawSunBeam":true,"moduleLength":20,"lx":2.5,"showLabel":false,"id":"5e4g29VTk26fuKRVWuNgRz","parentId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0],"cx":0.07784950378486367,"poleRadius":0.05,"lz":0.1,"tiltAngle":0,"reflectance":0.9,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","selected":false,"normal":[0,0,1]},{"id":"sBjhkF3pMtT3cQ3g1UR96e","cz":0.5000000074510424,"cx":0.049340364355762216,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleHeight":0.2,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","type":"Fresnel Reflector","ly":420,"normal":[0,0,1],"showLabel":false,"relativeAzimuth":0,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"lz":0.1,"cy":0.006920116980664271,"reflectance":0.9,"tiltAngle":0,"moduleLength":20,"rotation":[0,0,0],"lx":2.5,"drawSunBeam":true,"poleRadius":0.05},{"poleHeight":0.2,"poleRadius":0.05,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cy":0.0069201130085251,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","lz":0.1,"showLabel":false,"ly":420,"selected":false,"reflectance":0.9,"moduleLength":20,"rotation":[0,0,0],"lx":2.5,"tiltAngle":0,"cz":0.500000007451078,"type":"Fresnel Reflector","normal":[0,0,1],"cx":0.020831224926660816,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"h3TzeZk2YVWTGe9knmBmhc","drawSunBeam":true,"relativeAzimuth":0},{"cy":0.0069201090363859305,"poleRadius":0.05,"drawSunBeam":true,"lx":2.5,"normal":[0,0,1],"tiltAngle":0,"rotation":[0,0,0],"moduleLength":20,"showLabel":false,"poleHeight":0.2,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"selected":false,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","id":"kWfcmDULgEQa34dEtRx2UT","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","ly":420,"reflectance":0.9,"cz":0.5000000074511135,"cx":-0.007677914502440628,"lz":0.1,"type":"Fresnel Reflector"},{"reflectance":0.9,"rotation":[0,0,0],"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","ly":420,"type":"Fresnel Reflector","normal":[0,0,1],"tiltAngle":0,"id":"wQ8RFzz864QiELuFRWM7ge","poleHeight":0.2,"cz":0.500000007451149,"drawSunBeam":true,"cx":-0.03618705393154207,"selected":false,"showLabel":false,"lz":0.1,"cy":0.00692010506424676,"moduleLength":20,"lx":2.5,"poleRadius":0.05,"parentId":"kxHYpYsUs7XEocuTYAj1Qu"},{"poleHeight":0.2,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","parentId":"kxHYpYsUs7XEocuTYAj1Qu","cy":0.006920101092107599,"id":"rCD4HDT8779Y925QdUv6gZ","cx":-0.06469619336064349,"drawSunBeam":true,"selected":false,"lx":2.5,"poleRadius":0.05,"cz":0.5000000074511846,"relativeAzimuth":0,"type":"Fresnel Reflector","normal":[0,0,1],"lz":0.1,"reflectance":0.9,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","tiltAngle":0,"rotation":[0,0,0],"ly":420,"showLabel":false,"moduleLength":20},{"ly":420,"poleHeight":0.2,"normal":[0,0,1],"cx":-0.0932053327897449,"id":"dMUsSHLikspa8gopdzHskY","poleRadius":0.05,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","drawSunBeam":true,"reflectance":0.9,"moduleLength":20,"cy":0.0069200971199684285,"showLabel":false,"tiltAngle":0,"rotation":[0,0,0],"type":"Fresnel Reflector","parentId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","lx":2.5,"cz":0.5000000074512201,"selected":false,"lz":0.1},{"rotation":[0,0,0],"receiverId":"jbxC2ET67y7TWpMwnYUQpG","reflectance":0.9,"type":"Fresnel Reflector","cy":0.006920093147829267,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","lz":0.1,"lx":2.5,"relativeAzimuth":0,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","drawSunBeam":true,"tiltAngle":0,"poleHeight":0.2,"normal":[0,0,1],"selected":false,"moduleLength":20,"cx":-0.12171447221884638,"showLabel":false,"id":"rTyFuBNMkgb6TQ1G9Eh8gm","poleRadius":0.05,"cz":0.5000000074512556,"ly":420},{"poleRadius":0.05,"normal":[0,0,1],"showLabel":false,"cz":0.5000000074512911,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"type":"Fresnel Reflector","selected":false,"rotation":[0,0,0],"tiltAngle":0,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","drawSunBeam":true,"id":"j5bFm4KL8wLSLUYpWvdxLo","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","ly":420,"cx":-0.15022361164794779,"lz":0.1,"cy":0.006920089175690097,"relativeAzimuth":0,"poleHeight":0.2,"lx":2.5,"reflectance":0.9},{"cx":-0.1787327510770492,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","lx":2.5,"drawSunBeam":true,"reflectance":0.9,"tiltAngle":0,"lz":0.1,"cy":0.006920085203550927,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0],"cz":0.5000000074513267,"relativeAzimuth":0,"showLabel":false,"poleRadius":0.05,"selected":false,"type":"Fresnel Reflector","normal":[0,0,1],"id":"4yDr3h7mFtSP1gWovYHUdL","poleHeight":0.2,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","ly":420,"moduleLength":20},{"cy":0.006920081231411757,"id":"cdAqNd7wifCFLgGsKrvuwz","moduleLength":20,"drawSunBeam":true,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","normal":[0,0,1],"poleHeight":0.2,"poleRadius":0.05,"relativeAzimuth":0,"tiltAngle":0,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","lx":2.5,"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"cz":0.5000000074513622,"lz":0.1,"type":"Fresnel Reflector","showLabel":false,"cx":-0.2072418905061506,"reflectance":0.9,"ly":420},{"rotation":[0,0,0],"lz":0.1,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074513977,"moduleLength":20,"reflectance":0.9,"relativeAzimuth":0,"selected":false,"tiltAngle":0,"ly":420,"poleRadius":0.05,"showLabel":false,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","drawSunBeam":true,"poleHeight":0.2,"type":"Fresnel Reflector","cx":-0.23575102993525202,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","normal":[0,0,1],"lx":2.5,"id":"ptAVmbmDJoFnE5rNDPcxp1","cy":0.006920077259272587},{"cx":-0.26426016936435354,"reflectance":0.9,"normal":[0,0,1],"receiverId":"jbxC2ET67y7TWpMwnYUQpG","tiltAngle":0,"type":"Fresnel Reflector","parentId":"kxHYpYsUs7XEocuTYAj1Qu","drawSunBeam":true,"poleRadius":0.05,"poleHeight":0.2,"id":"9PPkqgZe4ooTSBcdbEhq2S","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074514332,"rotation":[0,0,0],"moduleLength":20,"cy":0.006920073287133425,"relativeAzimuth":0,"lz":0.1,"showLabel":false,"selected":false,"lx":2.5,"ly":420},{"lx":2.5,"drawSunBeam":true,"selected":false,"cx":-0.29276930879345486,"poleRadius":0.05,"reflectance":0.9,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cy":0.006920069314994255,"cz":0.5000000074514688,"relativeAzimuth":0,"lz":0.1,"ly":420,"id":"1bynbmDmRsgQT44LeFTqV2","type":"Fresnel Reflector","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0],"tiltAngle":0,"moduleLength":20,"poleHeight":0.2,"normal":[0,0,1],"showLabel":false,"parentId":"kxHYpYsUs7XEocuTYAj1Qu"},{"id":"biqZtWn8yKbuhMZsTFnzzy","poleRadius":0.05,"ly":420,"normal":[0,0,1],"moduleLength":20,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","showLabel":false,"reflectance":0.9,"cy":0.006920065342855094,"poleHeight":0.2,"cx":-0.32127844822255636,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"type":"Fresnel Reflector","rotation":[0,0,0],"lz":0.1,"cz":0.5000000074515043,"lx":2.5,"tiltAngle":0,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"drawSunBeam":true},{"receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleRadius":0.05,"cz":0.5000000074515398,"tiltAngle":0,"drawSunBeam":true,"cx":-0.3497875876516578,"poleHeight":0.2,"ly":420,"lx":2.5,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"showLabel":false,"type":"Fresnel Reflector","reflectance":0.9,"selected":false,"id":"aimBT6csAE8smo4euxDmP5","lz":0.1,"normal":[0,0,1],"relativeAzimuth":0,"cy":0.006920061370715923,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0]},{"solarReceiverTubePoleNumber":20,"type":"Foundation","solarReceiverPipePoleNumber":20,"normal":[0,0,1],"rotation":[0,0,0],"cx":-11.949347995041327,"selected":false,"parentId":"Ground","lz":0.3,"lx":19.21993989325236,"cy":-3.4906385434141205,"id":"jbxC2ET67y7TWpMwnYUQpG","ly":480,"solarStructure":1,"solarReceiver":1,"cz":0.15,"solarAbsorberPipe":{"absorberHeight":30,"apertureWidth":2}}],"view":{"cameraZoom":1.8506178062217107,"yearlyPvYieldPanelX":0,"mapZoom":17,"dailyFresnelReflectorYieldPanelX":-19,"dailyParabolicTroughYieldPanelX":0,"dailyLightSensorPanelX":0,"yearlyParabolicDishYieldPanelX":0,"showDailyFresnelReflectorYieldPanel":false,"enableRotate":true,"panCenter2D":[-6.944992442475207,210.55314744205262,0.00021056250655402935],"showStickyNotePanel":false,"groundColor":"#16cda5","showSunAngles":false,"mapWeatherStations":false,"dailyParabolicTroughYieldPanelY":0,"showDailyParabolicTroughYieldPanel":false,"yearlyLightSensorPanelY":0,"weatherPanelX":0,"yearlyFresnelReflectorYieldPanelY":14,"ambientLightIntensity":0.1,"dailyParabolicDishYieldPanelY":0,"dailyFresnelReflectorYieldPanelY":157,"showWeatherPanel":false,"theme":"Desert","showSolarPanelVisibilityResultsPanel":false,"yearlyLightSensorPanelX":0,"mapPanelX":0,"showYearlyParabolicTroughYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"heliodonPanelY":0,"dailyParabolicDishYieldPanelX":0,"mapType":"hybrid","cameraPosition":[-11.739626637843958,-271.93399896309415,13.091291354471094],"showDesignInfoPanel":true,"autoRotate":false,"panCenter":[-7.09913291540988,-65.13626844138287,2.897505917600467],"yearlyFresnelReflectorYieldPanelX":-1274,"stickyNotePanelX":0,"visibilityResultsPanelX":0,"showYearlyLightSensorPanel":false,"mapTilt":0,"dailyPvYieldPanelY":0,"dailyLightSensorPanelY":0,"solarRadiationHeatMapMaxValue":5,"heliodonPanelX":0,"weatherPanelY":0,"showYearlyParabolicDishYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"dailyPvYieldPanelX":0,"stickyNotePanelY":0,"showDailyParabolicDishYieldPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"heliodon":false,"yearlyParabolicTroughYieldPanelX":0,"yearlyPvYieldPanelY":0,"showSiteInfoPanel":true,"cameraPosition2D":[-6.944992442475207,210.55312744116364,20.00021056248858],"showHeliodonPanel":false,"showYearlyPvYieldPanel":false,"axes":true,"showMapPanel":false,"visibilityResultsPanelY":0,"groundImage":true,"orthographic":false,"showInstructionPanel":true,"showDailyPvYieldPanel":false,"mapPanelY":0,"showYearlyFresnelReflectorYieldPanel":false},"notes":[]}')},518:function(e){e.exports=JSON.parse('{"docid":"hAq2dzLGp1A3Vt7sTTtJuZ","time":"02/03/2023 10:55 am","timestamp":1675439758247,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"3/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Exact","daysPerYear":4},"elements":[{"cy":0.0145505850910366,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0005841111979264266,"cy":-0.00026543983321941996,"cz":0.5000000074505806,"lx":5.952,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7DsYGoVdCY8aoR5rFbLhk4","selected":false,"label":"Angle","dailyYield":8.732880750124766,"yearlyYield":102.12421657496768},{"type":"Human","name":"Jack","cx":5.511511655556145,"cy":-3.5932139876710405,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"ahAnqHX5Nd7eDufkMtRUNs","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-67,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":66,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[9.289940609671005,-7.003850253956084,4.906951597024065],"panCenter":[0.4252296602758445,0.31861282138619734,0.10164740914205853],"orthographic":false,"enableRotate":true,"cameraZoom":45.44146361606706,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,150],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"showEvolutionPanel":true,"solarRadiationHeatMapMaxValue":6,"evolutionPanelX":-13,"evolutionPanelY":8,"evolutionPanelRect":{"x":0,"y":0,"width":498,"height":340},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":279,"height":88}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"selectionMethod":1,"searchMethod":1,"populationSize":30,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Find the optimal tilt angle \\nfor a single row of solar panels"]}')},519:function(e){e.exports=JSON.parse('{"docid":"fuDyjFnfZyxqES42bpME47","time":"02/03/2023 11:00 am","timestamp":1675440031518,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"3/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Exact","daysPerYear":4},"elements":[{"cy":-0.04544941490896341,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground"},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":1.968,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":true,"label":"Row1","tiltAngle":0,"poleSpacing":2,"rotation":[0,0,0],"lx":5.952,"selected":false,"orientation":"Portrait","cx":0.0013098263256093668,"relativeAzimuth":0,"cy":-0.3333857365792726,"poleHeight":1.2,"drawSunBeam":false,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-355P-FG","dailyYield":3.8430599051077174,"yearlyYield":87.98498978626,"labelSize":0.5,"labelHeight":1},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0013098263256093668,"cy":-0.1107906814186029,"cz":0.5000000074505806,"lx":5.952,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qBcTvR11rnyGD32ejzSTUo","selected":false,"dailyYield":3.8430599051077174,"label":"Row2","yearlyYield":88.73443715558736,"labelHeight":1,"labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0012559240227253744,"cy":0.11410898246472086,"cz":0.5000000074505806,"lx":5.952,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7DsYGoVdCY8aoR5rFbLhk4","selected":false,"label":"Row3","dailyYield":3.8430599051077174,"yearlyYield":102.12190598796778,"labelHeight":1,"labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0019112216145152992,"cy":0.33130578714934544,"cz":0.5000000074505806,"lx":5.952,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kKhGuKqmYo8sGFHt2CpVtE","selected":false,"label":"Row4","dailyYield":3.8430599051077174,"yearlyYield":87.95400017679898,"labelHeight":1,"labelSize":0.5},{"type":"Human","name":"Jack","cx":5.511511655556145,"cy":-3.5932139876710405,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"ahAnqHX5Nd7eDufkMtRUNs","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-1274,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":3,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[14.323665130331175,-8.426692001879298,3.5655944521137717],"panCenter":[1.684900046296442,2.3084248015304936,0.043382642438776854],"orthographic":false,"enableRotate":true,"cameraZoom":33.40365140230188,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"showEvolutionPanel":true,"solarRadiationHeatMapMaxValue":6,"evolutionPanelX":3,"evolutionPanelY":4,"evolutionPanelRect":{"x":0,"y":0,"width":565,"height":359},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":322,"height":91}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":2,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":20,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":20,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Find optimal tilt angles \\nfor multiple rows of solar panels"]}')},520:function(e){e.exports=JSON.parse('{"docid":"oAxppoDRPqDySUVvwUxAX9","time":"02/08/2023 12:26 pm","timestamp":1675877184356,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":1,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"3/22/2022, 12:00:00\u202fPM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Approximate","daysPerYear":4},"elements":[{"cy":0.01692723373211437,"normal":[0,0,1],"lz":0.1,"ly":28.838141151400354,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":0.11281543499276836,"cz":0.05,"rotation":[0,0,0],"lx":27.003966694548705,"selected":false,"parentId":"Ground","textureType":"Foundation Texture #2","locked":true},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#68ccca","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.2777369741577272,"y":-0.4507918846693325},{"x":-0.46289495692954535,"y":-0.3294248387968199},{"x":-0.46289495692954535,"y":0.3294248387968199},{"x":-0.2592211758805454,"y":0.46813003407969145},{"x":0.44437915865236355,"y":0.46813003407969145},{"x":0.44437915865236355,"y":-0.4507918846693325},{"x":-0.018515798277181816,"y":-0.4507918846693325},{"x":-0.018515798277181816,"y":-0.20805779292430732},{"x":0.11109478966309089,"y":-0.20805779292430732},{"x":0.11109478966309089,"y":0},{"x":-0.1296105879402727,"y":0},{"x":-0.1296105879402727,"y":-0.4507918846693325}],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"filled":true,"selectedIndex":6,"id":"u4ViXg39ZL8tds2AfD2o6U","textureType":"No Polygon Texture","locked":true},{"type":"Human","name":"Jack","cx":-12.151272035486986,"cy":-13.311260979474763,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"rrK38LJKu6CVWVjf2zV1b2","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-1278,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":47,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[13.612389493613348,-45.59589484534075,13.195602276977187],"panCenter":[14.4714120590319,-3.416758286517111,0],"orthographic":false,"enableRotate":true,"cameraZoom":15.475618750000002,"showInstructionPanel":false,"cameraPosition2D":[4.762164053203386,1.2445149902232375,150],"panCenter2D":[4.762164053203386,1.244664996889924,0.0000020723025878093974],"showEvolutionPanel":true,"solarRadiationHeatMapMaxValue":3.5,"evolutionPanelX":-3,"evolutionPanelY":5,"showEconomicsPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":520,"height":318},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":290,"height":86},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"solarPanelShininess":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":2,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"notes":["Generative design of a solar farm \\nin an arbitrary shape"]}')},521:function(e){e.exports=JSON.parse('{"docid":"wdLWJpkLqaNK26sDZ4kU9P","time":"02/08/2023 12:31 pm","timestamp":1675877477724,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":1,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"3/22/2022, 12:00:00\u202fPM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Approximate","daysPerYear":4},"elements":[{"cy":0.01692723373211437,"normal":[0,0,1],"lz":0.1,"ly":28.838141151400354,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":0.11281543499276836,"cz":0.05,"rotation":[0,0,0],"lx":27.003966694548705,"selected":false,"parentId":"Ground","textureType":"Foundation Texture #2","locked":true},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#68ccca","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.2777369741577272,"y":-0.4507918846693325},{"x":-0.46289495692954535,"y":-0.3294248387968199},{"x":-0.46289495692954535,"y":0.3294248387968199},{"x":-0.2592211758805454,"y":0.46813003407969145},{"x":0.44437915865236355,"y":0.46813003407969145},{"x":0.44437915865236355,"y":-0.4507918846693325},{"x":-0.018515798277181816,"y":-0.4507918846693325},{"x":-0.018515798277181816,"y":-0.20805779292430732},{"x":0.11109478966309089,"y":-0.20805779292430732},{"x":0.11109478966309089,"y":0},{"x":-0.1296105879402727,"y":0},{"x":-0.1296105879402727,"y":-0.4507918846693325}],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"filled":true,"selectedIndex":6,"id":"u4ViXg39ZL8tds2AfD2o6U","textureType":"No Polygon Texture","locked":true},{"type":"Human","name":"Jack","cx":-12.151272035486986,"cy":-13.311260979474763,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"rrK38LJKu6CVWVjf2zV1b2","selected":false,"ly":0.6},{"type":"Cuboid","cx":-0.11397611677121855,"cy":-3.067571806666861,"cz":2,"lx":5.2532346498753135,"ly":4.048511424070542,"lz":4,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"ky59NZpXJyTcUSib43iVfq","locked":true}],"view":{"yearlyPvYieldPanelX":-1278,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":47,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[14.904063706626683,-45.61046168179694,13.166442421440415],"panCenter":[14.528251370304552,-3.4151425205700146,0],"orthographic":false,"enableRotate":true,"cameraZoom":17.147500000000004,"showInstructionPanel":false,"cameraPosition2D":[4.762164053203386,1.2445149902246018,150],"panCenter2D":[4.762164053203386,1.244664996889924,0.0000020723025878093974],"showEvolutionPanel":true,"solarRadiationHeatMapMaxValue":3.5,"evolutionPanelX":-3,"evolutionPanelY":5,"showEconomicsPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":520,"height":318},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":344,"height":83},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"solarPanelShininess":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":3,"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","margin":0},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"notes":["Generative design of a solar farm \\nin an arbitrary shape with a nearby structure"]}')},522:function(e){e.exports=JSON.parse('{"docid":"njsXMFnx8AbzYmZZZSFsP4","time":"02/08/2023 12:40 pm","timestamp":1675878006595,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.58194950125034,"pvGridCellSize":1.5,"timesPerHour":1,"longitude":-71.76008801772156,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"275 Pleasant St, Lunenburg, MA 01462, USA","date":"10/15/2021, 12:00:00\u202fPM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"daysPerYear":4},"elements":[{"cy":-2.2367402479910083,"normal":[0,0,1],"lz":0.1,"ly":269.55803876661787,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":2.681119516922017,"cz":0.05,"rotation":[0,0,0],"lx":132.51400330167655,"selected":false,"parentId":"Ground"},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.4199120685653116,"y":0.07319581727959533},{"x":-0.42368525470067964,"y":0.35513880940011766},{"x":-0.31048967063963856,"y":0.35699369750617377},{"x":-0.19729408657859754,"y":0.4701418719755939},{"x":0.015092744541472141,"y":0.47114157893824127},{"x":0.19997886517450586,"y":0.3116212018174194},{"x":0.23016435425745013,"y":0.06306619560590632},{"x":0.09432965338420088,"y":0.061211307499850244},{"x":0.10187602565493695,"y":0.014839104848448545},{"x":0.19997886517450586,"y":-0.033387985909009224},{"x":0.33581356604775514,"y":-0.03709776212112136},{"x":0.38109179967217155,"y":-0.27637832780235416},{"x":0.45655552237953223,"y":-0.27637832780235416},{"x":0.45655552237953223,"y":-0.408075383332335},{"x":0.29430851855870677,"y":-0.40993027143839106},{"x":0.29430851855870677,"y":-0.4451731454534563},{"x":-0.06414416430125659,"y":-0.4451731454534563},{"x":-0.06791735043662463,"y":-0.4767062432564095},{"x":-0.32449400764165104,"y":-0.4767062432564095},{"x":-0.25280347106965834,"y":-0.3190407542416437},{"x":-0.25657665720502637,"y":-0.16508504143899005},{"x":-0.16602018995619355,"y":-0.16508504143899005},{"x":-0.1633354113602852,"y":-0.09559900037150687},{"x":-0.3029432983689025,"y":-0.0937441122654508},{"x":-0.3406751597225829,"y":0.01940406220396935}],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"filled":true,"selectedIndex":6,"id":"1mf9SJGR5RjzYzk7AYxvf2","lineColor":"#f44e3b","opacity":0.1},{"type":"Cuboid","cx":-27.296734459596976,"cy":-41.20962464677464,"cz":1.25,"lx":5.828598670924802,"ly":8.305908945480084,"lz":2.5,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"55Wp5i8LU9QiCSoSTSkhSV"}],"view":{"yearlyPvYieldPanelX":-1249,"autoRotate":false,"mapZoom":17,"axes":false,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":65,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#68ccca","groundPanelY":0,"groundImage":true,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[145.94862814334945,-106.4764934595526,163.4608323959844],"panCenter":[85.94985190690319,3.43019898834619,0],"orthographic":false,"enableRotate":true,"cameraZoom":9.75349958231059,"showInstructionPanel":true,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"showMapPanel":false,"showEvolutionPanel":true,"showEconomicsPanel":false,"evolutionPanelX":null,"evolutionPanelY":null,"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":6,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"notes":[]}')},523:function(e){e.exports=JSON.parse('{"docid":"qzzjGfFHSUFSwo9GQJs9Mb","time":"02/04/2023 01:27 pm","timestamp":1675535240483,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"S","showLabel":true,"labelHeight":8.5,"labelSize":0.8},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.1133234476758727,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#808080","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#808080","width":0.5},"selected":false},{"type":"Wall","cx":0.10882625565358328,"cy":6.456179282384522,"cz":2.2408122612280286,"lx":15.961175461262725,"ly":0.2,"lz":5.192316659049364,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[8.089413986284946,6.456179282384521,0],"rightPoint":[-7.871761474977779,6.4561792823845225,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":5.192316659049364,"rightRoofHeight":5.192316659049364,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.192316659049364,"rightTopPartialHeight":5.192316659049364},{"type":"Wall","cx":8.089413986284946,"cy":-0.15071949165393628,"cz":2.2301039869226305,"lx":13.213797548076919,"ly":0.2,"lz":5.192316659049364,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[8.089413986284942,-6.757618265692395,0],"rightPoint":[8.089413986284947,6.4561792823845225,0],"relativeAngle":1.5707963267948961,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":5.192316659049364,"rightRoofHeight":5.192316659049364,"centerRoofHeight":[0,8.657123351013743],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.192316659049364,"rightTopPartialHeight":5.192316659049364},{"type":"Wall","cx":-7.871761474977779,"cy":-0.15071949165393628,"cz":2.228839888904333,"lx":13.213797548076919,"ly":0.2,"lz":5.192316659049364,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-7.871761474977778,6.4561792823845225,0],"rightPoint":[-7.871761474977779,-6.757618265692395,0],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":5.192316659049364,"rightRoofHeight":5.192316659049364,"centerRoofHeight":[0,8.657123351013743],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.192316659049364,"rightTopPartialHeight":5.192316659049364},{"type":"Wall","cx":0.10882625565358417,"cy":-6.757618265692395,"cz":2.268765007024547,"lx":15.961175461262727,"ly":0.2,"lz":5.192316659049364,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-7.871761474977779,-6.757618265692395,0],"rightPoint":[8.089413986284947,-6.757618265692395,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":5.192316659049364,"rightRoofHeight":5.192316659049364,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.192316659049364,"rightTopPartialHeight":5.192316659049364},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#808080","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#808080","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.1133234476758727,"ceiling":false},{"type":"Foundation","cx":-13.996646874999989,"cy":0.06415311833261989,"cz":0.05,"lx":21.734456249999983,"ly":19.033724999999986,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"labelHeight":10,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"L","showLabel":true},{"type":"Door","cx":0,"cy":0,"cz":-0.15370387000018937,"lx":0.12530405450738497,"ly":0,"lz":0.6925922599996213,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"tciKLNsRDLeHZNmeb31ucG"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"gLG7BoTZHSewPba87UV4Za"}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-23.305173327292444,-30.91478882666535,7.039269079297642],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[5.635542831447647,8.464690688330043,3.125544256683276],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-2,"y":-2,"width":200,"height":87}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of house size\\n\u623f\u5b50\u5927\u5c0f\u7684\u5f71\u97ff"]}')},524:function(e){e.exports=JSON.parse('{"docid":"6D1PNtCu8dQATzUSZDdPKf","time":"05/22/2023 10:33 am","timestamp":1684766015061,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"SE","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.1133234476758727,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#cccccc","tint":"#009ce0","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#009ce0","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#009ce0","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#009ce0","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.1133234476758727,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"SW","showLabel":true,"color":"#808080"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"3wrKU52naWH6NwzeW6vGwm"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"9C29UNsLxSuEbxTnestrd8"}],"sceneRadius":28,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[3.1651364435149425,-31.942224578560552,3.8771204506826087],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[10.838986266637484,1.4239280652904787,3.8771204506826087],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-5,"y":0,"width":269,"height":92}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of house orientation\\n\u623f\u5c4b\u671d\u5411\u7684\u5f71\u97ff"]}')},525:function(e){e.exports=JSON.parse('{"docid":"gRqNfJd8beo5ietdqmmTM2","time":"05/22/2023 10:35 am","timestamp":1684766140952,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"\ud83d\udc4e","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#cccccc","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":3.5222057461264544,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":3.5222057461264544,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":3.5222057461264544,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":3.5222057461264544,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":3.5222057461264544,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"\ud83d\udc4d","showLabel":true,"color":"#808080"},{"type":"Door","cx":-0.020833333333333332,"cy":0,"cz":-0.125,"lx":0.125,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"vNVpqbsNF7tYjDx7E7kMLR"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"xpWZ6k69MtomLyhCbBynNa"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-18.39191326488849,-28.88082266775545,4.500680104409036],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[9.06975830834568,5.812472797471483,4.500680104409029],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-2,"y":-1,"width":243,"height":90}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of insulation\\n\u623f\u5c4b\u9694\u71b1\u6027\u7684\u5f71\u97ff"]}')},526:function(e){e.exports=JSON.parse('{"docid":"2b6To2exbyQMzsnyC5zQ4h","time":"05/22/2023 10:37 am","timestamp":1684766230048,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":9.345387499999994,"cy":0.10743784147400248,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"B","showLabel":true,"labelHeight":6.5,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Foundation","cx":-9.302518749999996,"cy":0.06403695851719249,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"hvacSystem":{"thermostatSetpoint":20},"label":"A","labelHeight":6.5,"showLabel":true,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"No Roof Texture","color":"#cccccc","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"wqKadTHiLAV8a3mAejBhVp","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"2bkzpWVFhyLy2B93eQe6LC"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2qrmNqnNqMrnaf9yVKwntp","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"hQgFUEAKKCuxnfg7DfAtUD"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3F32WEzwgnaEKesshW1B9d","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"fPNsZAwsuY65jcgPGD7JxY"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"pMhyfs2o4fEnaE7UjB8PVu"}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-12.301199186500163,-22.5861615760567,3.4543056235043506],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[6.0653741729769015,2.261846946588245,3.4543056235043506],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-3,"y":-4,"width":278,"height":87}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of roof color \\n\u5c4b\u9802\u9854\u8272\u7684\u5f71\u97ff"]}')},527:function(e){e.exports=JSON.parse('{"docid":"gyoLQ5RfiYexA7q1ehdofm","time":"05/22/2023 10:45 am","timestamp":1684766701791,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jacqueline","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":9.345387499999994,"cy":0.10743784147400248,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"B","showLabel":true,"labelHeight":7,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"color":"#808080","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Foundation","cx":-9.302518749999996,"cy":0.06403695851719249,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"hvacSystem":{"thermostatSetpoint":20},"label":"A","labelHeight":7,"showLabel":true,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.8,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"No Roof Texture","color":"#808080","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"wqKadTHiLAV8a3mAejBhVp","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"2bkzpWVFhyLy2B93eQe6LC"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2qrmNqnNqMrnaf9yVKwntp","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"hQgFUEAKKCuxnfg7DfAtUD"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3F32WEzwgnaEKesshW1B9d","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"uPY2H1vbzdvDNNQKsQzM2R"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"qj1uppbZ68e6DUdrkgfzdA"}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-11.365944827281202,-27.884282052116806,4.909032289220344],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[8.512452835588759,2.1768673048896354,4.909032289220344],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-1,"y":0,"width":284,"height":88}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of eaves overhang\\n\u5c4b\u7c37\u5ef6\u7533\u9577\u5ea6\u7684\u5f71\u97ff"]}')},528:function(e){e.exports=JSON.parse('{"docid":"iJM88uQ7kfN8BTPGSVD3jV","time":"05/22/2023 10:47 am","timestamp":1684766839823,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"A","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#666666"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.8177645969011635,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#009ce0","opacity":0.65,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#009ce0","opacity":0.65,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#009ce0","opacity":0.35,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#009ce0","opacity":0.35,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.8177645969011635,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"B","showLabel":true,"color":"#666666"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"rRMpmcwQNzvRYmkTWpEhiw"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"jyiupxyxWNzhU4yRrTPHU1"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-16.77287507225449,-24.274336266873924,5.320155603217975],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[10.498836843888402,4.793969537181787,2.890808814152251],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-5,"y":-1,"width":421,"height":65}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of solar heat gain coefficients (SHGC) of windows"]}')},529:function(e){e.exports=JSON.parse('{"docid":"6nLDNj8vM4d4LSQKVT9SXo","time":"05/22/2023 10:49 am","timestamp":1684766960725,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"20\u2103","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#999999"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.641654309594841,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.641654309594841,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":25},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"25\u2103","showLabel":true,"color":"#999999"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"1TYVF9JTXJtxWba41xgetC"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"afEtgeFVMoeDZdyxJU1psm"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-21.828926822512322,-33.873528421784314,4.788669771967834],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[11.438181824994281,-4.700464851624883,4.788669771967831],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-1,"y":0,"width":277,"height":63}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of thermostat setpoint"]}')},530:function(e){e.exports=JSON.parse('{"docid":"uQrNcHUUR7GCUfUbuFogjq","time":"02/04/2023 01:39 pm","timestamp":1675535990373,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"7/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jamelia","cx":-4.3683434199366005,"cy":-14.38651482103353,"cz":0,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.65},{"type":"Foundation","cx":-13.228758971915111,"cy":0.10702186833261693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":5},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"A","showLabel":true,"labelHeight":9,"labelSize":0.8,"color":"#666666"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"6YiUmdowinEDGE2jXwEcty","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":6.0818182264215075,"cy":-0.11406220740522244,"cz":2.2301039869226305,"lx":9.999999999999998,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.0818182264215075,-5.1140622074052215,0.1],"rightPoint":[6.081818226421507,4.885937792594777,0.1],"relativeAngle":1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"6YiUmdowinEDGE2jXwEcty","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.046374836825025],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"6YiUmdowinEDGE2jXwEcty","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.046374836825025],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"6YiUmdowinEDGE2jXwEcty","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.375,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H","uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333337,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Door","cx":0,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #6","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"gLG7BoTZHSewPba87UV4Za","uValue":1.135652},{"type":"Window","cx":-0.16666666666666666,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vLVbxQBoEhW71qxT8m1C96","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.16666666666666666,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"26QzSovJr2WkHKUiErU1ER","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dZ11kEn33ciPLMqva4wYhW","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.16666666666666666,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oEPM7Qer3dagcgAZgTd83X","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.16666666666666666,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nJe6q1fYHpVb61zzuXMiiq","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"atbMWVsRWU1gP4pFd8UmqE","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4Xcrc4Qc969xumwjdaTpEv","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9r471ngxUS5HfZPQXAbspz","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.30833333333333335,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nuMh9HUjsyggQDkK4K4z9r","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5TzjYq921EthYvgGjhkd95","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"i86kfMa5D3a95EHYr74Cik","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.30833333333333335,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fes2JVoykppGjYbeBaK1t6","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.35833333333333334,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hRvyn5tFnyKbZGmExP8ZBN","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.35833333333333334,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fHUqZ9dwKm5QsdBz4rQhkH","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hVPD3ovUCMHizYi7hHMynX","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"92r9RVUcqNvqTSSqzXVWe8","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"88LWhfUeptGcLDGkhffTYu","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jJyncTarX8t32trtWmHYJ8","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tbGfuWPSK8hFimiixh3gnq","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":2.0463748368250254,"thickness":0.2,"rValue":2.8177645969011635,"roofType":"Gable","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj"],"textureType":"Roof Texture Default","color":"#333333","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"6YiUmdowinEDGE2jXwEcty","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"volumetricHeatCapacity":0.2,"ceiling":false},{"type":"Window","cx":0.375,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"uPf27SYtJ3oEqK8uLnnYC4","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"41qtH3jyhy6TAYrTpcQ22r","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"c15PoZLmaL9G5281NC3Bky","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"e8J6XhFvtnTfamsfk7MdQo","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Door","cx":-4.625929269271485e-18,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1.135652,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1Z9wCTEw4evBfgBWBx239G"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["iUbSPuuaLHTe92zf2RbbzH"],"rightJoints":["b2z6LAysW1ypLiK23VhMbQ"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"t5aKJuTWqFhNtovV6QcVDQ","parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"5ujWfCT94pVpZ6u8JCHaJM","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.375,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6XAyQ1Y5un66zE9fws5TBK","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5Fr8WLjKhMXxtEUSo3U3cz","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bFA3kdwdbv23kgNuvqrBLu","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2peuf57tgQn8h8KDddojmU","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pRLjDR4NSZstZSY2CyZhG6","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Door","cx":-4.625929269271485e-18,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"color":"#ffffff","textureType":"Door Texture #1","filled":true,"doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"fRfZQadrT6sohNBtnZQnjD","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","selected":false,"uValue":1.135652},{"type":"Wall","cx":6.0818182264215075,"cy":-0.11406220740522244,"cz":2.2301039869226305,"lx":9.999999999999998,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["t1vsyYVv6oASAroVbtBJh8"],"rightJoints":["t5aKJuTWqFhNtovV6QcVDQ"],"leftPoint":[6.0818182264215075,-5.1140622074052215,0.1],"rightPoint":[6.081818226421507,4.885937792594777,0.1],"relativeAngle":1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"iUbSPuuaLHTe92zf2RbbzH","parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"5ujWfCT94pVpZ6u8JCHaJM","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.046374836825025],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.35833333333333334,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"twjCCVvcJUWUtdX8G6XaEz","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.35833333333333334,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fJ9ef8TPTGwzuoD998nCxH","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"75FMXmZGkavm2QX1w7Rd2n","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"digHAxUKfqtzZ8Hf1JBrDE","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pUavBYiArb55RaZvTqEZ7s","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bMNcD6i8MyPWUstcj4RLAn","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["t5aKJuTWqFhNtovV6QcVDQ"],"rightJoints":["t1vsyYVv6oASAroVbtBJh8"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"b2z6LAysW1ypLiK23VhMbQ","parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"5ujWfCT94pVpZ6u8JCHaJM","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.046374836825025],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":0.3416666666666667,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"7af2qg5wEnfy5x3dVwJDa9","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8pzbRVzHdUJ21tt86EiuYq","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9Rqpx9csAi6gzvsKmMevD7","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"sRtEGAvWiVdZjNF7cbimyK","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cYa823h2xpVhLafAMFJLLp","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eCrrhs7nC8ZLgf3kozqASz","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["b2z6LAysW1ypLiK23VhMbQ"],"rightJoints":["iUbSPuuaLHTe92zf2RbbzH"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"t1vsyYVv6oASAroVbtBJh8","parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"5ujWfCT94pVpZ6u8JCHaJM","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.375,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xoY2sZ3zu3yaqNq4svSL83","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333337,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"shVdFBTLP3GUxKo2h9rQPd","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Door","cx":0,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"color":"#ffffff","textureType":"Door Texture #6","filled":true,"doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"miHyMDSBYSuj5NSFDxZf2d","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","selected":false,"uValue":1.135652},{"type":"Window","cx":-0.16666666666666666,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"izobe4AEhigpZU6WX5N4k5","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.16666666666666666,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"o5YP1zidq8SX6PcUxxaAjL","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4GhJEysBwSqkSWJpqyaJ48","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.16666666666666666,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"aAGJp2q5U3FuWTdYaSVjDf","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.16666666666666666,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"twPsG5mQU2qWwH6PZR3MFv","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1Gwnr8y8qnWjyqse356de2","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"id":"5ujWfCT94pVpZ6u8JCHaJM","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":2.0463748368250254,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","roofType":"Gable","roofStructure":"Default","textureType":"Roof Texture Default","thickness":0.2,"wallsId":["t5aKJuTWqFhNtovV6QcVDQ"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.8177645969011635,"volumetricHeatCapacity":0.2,"ceiling":false},{"type":"Foundation","cx":13.117837499999993,"cy":-0.021318315185384407,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":5},"labelHeight":9,"labelSize":0.8,"showLabel":true,"id":"9Lzok59gfWu44BJHP6NeDv","selected":false,"label":"B","color":"#666666"},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":true,"poleHeight":10,"poleRadius":0.05,"poleSpacing":3,"cx":0.017473997824250177,"cy":-0.1848238594563359,"cz":7.203451961471109,"lx":10.906,"ly":4.184,"lz":0.046,"showLabel":false,"normal":[-2.5496209749856465e-17,-0.3787787636615868,0.9254872490742375],"rotation":[0.38847637916043065,0,-2.220446049250313e-16],"color":"#fff","frameColor":"white","parentType":"Roof","parentId":"5ujWfCT94pVpZ6u8JCHaJM","foundationId":"9Lzok59gfWu44BJHP6NeDv","id":"m7muU5PcHHSqA6qooFMWMX","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-21.205706148898816,-34.501280243521734,7.541149435690317],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[7.9613043217859705,4.9057140700953275,7.541149435690313],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":675,"height":408},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":-1091,"y":218,"width":775,"height":342},"stickyNotePanelRect":{"x":-3,"y":-2,"width":275,"height":63}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of rooftop solar panels"]}')},531:function(e){e.exports=JSON.parse('{"docid":"4VyiQ32UEi5Uhg2actsJ7k","time":"05/22/2023 10:52 am","timestamp":1684767120478,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"7/1/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":9.345387499999994,"cy":0.10743784147400248,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"Uninsulated floor","showLabel":true,"labelHeight":7,"labelSize":0.5,"color":"#808080","rValue":1.7611028730632272},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"color":"#808080","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Foundation","cx":-9.302518749999996,"cy":0.06403695851719249,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"hvacSystem":{"thermostatSetpoint":20},"label":"Insulated floor","labelHeight":7,"showLabel":true,"labelSize":0.5,"color":"#808080","rValue":3.5222057461264544},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"No Roof Texture","color":"#808080","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"wqKadTHiLAV8a3mAejBhVp","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"2bkzpWVFhyLy2B93eQe6LC"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2qrmNqnNqMrnaf9yVKwntp","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"hQgFUEAKKCuxnfg7DfAtUD"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3F32WEzwgnaEKesshW1B9d","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"3uhARcmLhJJ7AF4oGmRXFJ"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"rJ589nLaG9XWmTRZhwLvTz"}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-17.829241192466892,-21.107034059971184,4.718921354569243],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[4.327600264578368,2.7041849125647666,4.718921354569243],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":true,"diurnalTemperaturePanelRect":{"x":-1,"y":1,"width":517,"height":333},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"heatFluxScaleFactor":10,"stickyNotePanelRect":{"x":-2,"y":344,"width":517,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of ground temperature and floor insulation"]}')},532:function(e){e.exports=JSON.parse('{"docid":"gTE5M2QuRpvxtj7gFjQvBp","time":"05/22/2023 10:53 am","timestamp":1684767216212,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"A","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#666666"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.641654309594841,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Tree","name":"Maple","cx":11.597557786217195,"cy":-9.10270743636709,"cz":0,"lx":11.852806241793175,"lz":12.934464914753796,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"o3k54VQM47Q54nSJAwrmEn","selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.641654309594841,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"B","showLabel":true,"color":"#666666"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #14","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"p8R6iYpCmdMa5Cs4zuS1P6"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #14","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"56LE4zBekLnvJc9jFEm7Yu"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-25.541858353538785,-23.926978121750373,5.679305436989464],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[13.47063227815913,1.5150691532035274,5.679305436989461],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-3,"y":-2,"width":203,"height":64}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of trees"]}')},533:function(e){e.exports=JSON.parse('{"docid":"21TNkEaRQtmkMpHquDpRhe","time":"03/21/2023 12:30 pm","timestamp":1679416202848,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"1/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Judd","cx":2.5001103094985826,"cy":-6.058721988130646,"cz":0.030962420627473897,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-10.117024999999996,"cy":0.27838070851727714,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":5},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"No Ceiling","showLabel":true,"labelHeight":6,"labelSize":0.5,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,5.068830689450057],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,5.068830689450057],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":2.068830689450057,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0.08333333333333333,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"hQgFUEAKKCuxnfg7DfAtUD"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0.08333333333333333,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3F32WEzwgnaEKesshW1B9d","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":-0.029166666666666664,"cy":0,"cz":-0.08333333333333333,"lx":0.10833333333333334,"ly":0,"lz":0.8333333333333334,"color":"white","uValue":1.7034779999999998,"textureType":"Door Texture #17","filled":true,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"9j89u3pSufVm3Q5kpF4NcM","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","selected":false},{"type":"Human","name":"Jena","cx":2.5001103094985826,"cy":-6.058721988130646,"cz":0.030962420627473897,"lx":0.695,"ly":0.42,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cfvC81ormzBEgA9Ah4eP3v","id":"34EHkp2Lb8b2vnEKfniznR","selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["rHyZXvwyEPAa7dU7nYmXpR"],"rightJoints":["jvSvdwWqKHJqgaZtgavr3X"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8NQNpFkXNGAXtcTwXhtHNW","parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gCFHHnVKnRgFUFksjrmZCm","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["sb7GHiMmhgNyZJdQ71BL5y"],"rightJoints":["8NQNpFkXNGAXtcTwXhtHNW"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rHyZXvwyEPAa7dU7nYmXpR","parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gCFHHnVKnRgFUFksjrmZCm","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,5.068830689450057],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["8NQNpFkXNGAXtcTwXhtHNW"],"rightJoints":["sb7GHiMmhgNyZJdQ71BL5y"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jvSvdwWqKHJqgaZtgavr3X","parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gCFHHnVKnRgFUFksjrmZCm","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,5.068830689450057],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["jvSvdwWqKHJqgaZtgavr3X"],"rightJoints":["rHyZXvwyEPAa7dU7nYmXpR"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sb7GHiMmhgNyZJdQ71BL5y","parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gCFHHnVKnRgFUFksjrmZCm","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Window","cx":-0.3125,"cy":0.1,"cz":0.08333333333333333,"lx":0.125,"ly":0.2,"lz":0.5,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"q6p3CCHJFvsqrEsXwbRh1R","parentId":"sb7GHiMmhgNyZJdQ71BL5y","foundationId":"cfvC81ormzBEgA9Ah4eP3v","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3125,"cy":0.1,"cz":0.08333333333333333,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"j1XnXywfGpFArNKZPbAhkm","parentId":"sb7GHiMmhgNyZJdQ71BL5y","foundationId":"cfvC81ormzBEgA9Ah4eP3v","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":4.625929269271485e-18,"cy":0,"cz":-0.08333333333333333,"lx":0.10833333333333334,"ly":0,"lz":0.8333333333333334,"color":"white","uValue":1.7034779999999998,"textureType":"Door Texture #17","filled":true,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"6uoZg4uoFLaTiYnPcJZ3V9","parentId":"sb7GHiMmhgNyZJdQ71BL5y","foundationId":"cfvC81ormzBEgA9Ah4eP3v","selected":false},{"id":"gCFHHnVKnRgFUFksjrmZCm","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":true,"rise":2.068830689450057,"color":"#4d4d4d","rValue":1.7611028730632272,"sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["sb7GHiMmhgNyZJdQ71BL5y"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"ceilingRValue":3.5222057461264544},{"type":"Foundation","cx":10.177578528084874,"cy":0.23562811833261754,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#808080","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":5},"labelHeight":6,"labelSize":0.5,"showLabel":true,"id":"cfvC81ormzBEgA9Ah4eP3v","selected":false,"label":"Insulated Ceiling"}],"sceneRadius":23,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0.08573749999997851,4.287065548240426e-8],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,0.08558749333259577,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-19.73331041183491,-15.606053038152623,2.569638957524864],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[3.388120187568702,1.9907625161279443,1.1720990830439746],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":3,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-2,"y":3,"width":510,"height":354},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"heatFluxScaleFactor":2,"stickyNotePanelRect":{"x":-4,"y":2,"width":397,"height":65}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Thermal envelope vs. building envelope"]}')},584:function(e,t,l){},601:function(e,t,l){},791:function(e,t,l){"use strict";l.r(t);var a={};l.r(a),l.d(a,"pvModelName",(function(){return Gl})),l.d(a,"rowAxis",(function(){return Xl})),l.d(a,"rowWidth",(function(){return Bl})),l.d(a,"interRowSpacing",(function(){return Kl})),l.d(a,"margin",(function(){return ql})),l.d(a,"poleHeight",(function(){return Ql})),l.d(a,"poleSpacing",(function(){return Zl})),l.d(a,"tiltAngle",(function(){return _l})),l.d(a,"orientation",(function(){return $l}));var o={};l.r(o),l.d(o,"navigationView",(function(){return ea})),l.d(o,"shadowEnabled",(function(){return ta})),l.d(o,"solarPanelShininess",(function(){return la})),l.d(o,"windowShininess",(function(){return aa})),l.d(o,"heatFluxScaleFactor",(function(){return oa})),l.d(o,"heatFluxColor",(function(){return ia})),l.d(o,"heatFluxWidth",(function(){return ra})),l.d(o,"solarRadiationHeatmapMaxValue",(function(){return na})),l.d(o,"solarRadiationHeatmapReflectionOnly",(function(){return ca})),l.d(o,"axes",(function(){return sa})),l.d(o,"ambientLightIntensity",(function(){return da})),l.d(o,"directLightIntensity",(function(){return ua})),l.d(o,"theme",(function(){return fa})),l.d(o,"showAzimuthAngle",(function(){return ha})),l.d(o,"showElevationAngle",(function(){return pa})),l.d(o,"showZenithAngle",(function(){return ya})),l.d(o,"autoRotate",(function(){return ga})),l.d(o,"groundImage",(function(){return ma})),l.d(o,"groundImageType",(function(){return wa})),l.d(o,"groundColor",(function(){return xa})),l.d(o,"waterSurface",(function(){return va})),l.d(o,"orthographic",(function(){return ba})),l.d(o,"enableRotate",(function(){return Aa})),l.d(o,"cameraPosition",(function(){return Ta})),l.d(o,"cameraPosition2D",(function(){return Pa})),l.d(o,"panCenter",(function(){return Sa})),l.d(o,"panCenter2D",(function(){return ja})),l.d(o,"cameraZoom",(function(){return Ha})),l.d(o,"heliodon",(function(){return za})),l.d(o,"showSunAngles",(function(){return Ra})),l.d(o,"mapZoom",(function(){return Da})),l.d(o,"mapTilt",(function(){return Ma})),l.d(o,"mapType",(function(){return Wa})),l.d(o,"showSiteInfoPanel",(function(){return Ia})),l.d(o,"showDesignInfoPanel",(function(){return Ca})),l.d(o,"showInstructionPanel",(function(){return Oa})),l.d(o,"showHeliodonPanel",(function(){return Fa})),l.d(o,"heliodonPanelX",(function(){return ka})),l.d(o,"heliodonPanelY",(function(){return Ya})),l.d(o,"showMapPanel",(function(){return La})),l.d(o,"mapPanelX",(function(){return Ea})),l.d(o,"mapPanelY",(function(){return Ua})),l.d(o,"showWeatherPanel",(function(){return Na})),l.d(o,"weatherPanelRect",(function(){return Va})),l.d(o,"showDiurnalTemperaturePanel",(function(){return Ja})),l.d(o,"diurnalTemperaturePanelRect",(function(){return Ga})),l.d(o,"showStickyNotePanel",(function(){return Xa})),l.d(o,"stickyNotePanelRect",(function(){return Ba})),l.d(o,"showDailyBuildingEnergyPanel",(function(){return Ka})),l.d(o,"dailyBuildingEnergyPanelRect",(function(){return qa})),l.d(o,"showYearlyBuildingEnergyPanel",(function(){return Qa})),l.d(o,"yearlyBuildingEnergyPanelRect",(function(){return Za})),l.d(o,"showDailyLightSensorPanel",(function(){return _a})),l.d(o,"dailyLightSensorPanelRect",(function(){return $a})),l.d(o,"showYearlyLightSensorPanel",(function(){return eo})),l.d(o,"yearlyLightSensorPanelRect",(function(){return to})),l.d(o,"yearlyLightSensorPanelShowDaylight",(function(){return lo})),l.d(o,"yearlyLightSensorPanelShowClearness",(function(){return ao})),l.d(o,"showDailyPvYieldPanel",(function(){return oo})),l.d(o,"dailyPvYieldPanelRect",(function(){return io})),l.d(o,"showYearlyPvYieldPanel",(function(){return ro})),l.d(o,"yearlyPvYieldPanelRect",(function(){return no})),l.d(o,"showVisibilityResultsPanel",(function(){return co})),l.d(o,"visibilityResultsPanelRect",(function(){return so})),l.d(o,"showDailyParabolicTroughYieldPanel",(function(){return uo})),l.d(o,"dailyParabolicTroughYieldPanelRect",(function(){return fo})),l.d(o,"showYearlyParabolicTroughYieldPanel",(function(){return ho})),l.d(o,"yearlyParabolicTroughYieldPanelRect",(function(){return po})),l.d(o,"showDailyParabolicDishYieldPanel",(function(){return yo})),l.d(o,"dailyParabolicDishYieldPanelRect",(function(){return go})),l.d(o,"showYearlyParabolicDishYieldPanel",(function(){return mo})),l.d(o,"yearlyParabolicDishYieldPanelRect",(function(){return wo})),l.d(o,"showDailyFresnelReflectorYieldPanel",(function(){return xo})),l.d(o,"dailyFresnelReflectorYieldPanelRect",(function(){return vo})),l.d(o,"showYearlyFresnelReflectorYieldPanel",(function(){return bo})),l.d(o,"yearlyFresnelReflectorYieldPanelRect",(function(){return Ao})),l.d(o,"showDailyHeliostatYieldPanel",(function(){return To})),l.d(o,"dailyHeliostatYieldPanelRect",(function(){return Po})),l.d(o,"showYearlyHeliostatYieldPanel",(function(){return So})),l.d(o,"yearlyHeliostatYieldPanelRect",(function(){return jo})),l.d(o,"showDailyUpdraftTowerYieldPanel",(function(){return Ho})),l.d(o,"dailyUpdraftTowerYieldPanelRect",(function(){return zo})),l.d(o,"showYearlyUpdraftTowerYieldPanel",(function(){return Ro})),l.d(o,"yearlyUpdraftTowerYieldPanelRect",(function(){return Do})),l.d(o,"showEvolutionPanel",(function(){return Mo})),l.d(o,"evolutionPanelRect",(function(){return Wo}));var i={};l.r(i),l.d(i,"latitude",(function(){return Io})),l.d(i,"longitude",(function(){return Co})),l.d(i,"date",(function(){return Oo})),l.d(i,"leafDayOfYear1",(function(){return Fo})),l.d(i,"leafDayOfYear2",(function(){return ko})),l.d(i,"ground",(function(){return Yo})),l.d(i,"address",(function(){return Lo})),l.d(i,"countryCode",(function(){return Eo})),l.d(i,"airAttenuationCoefficient",(function(){return Uo})),l.d(i,"airConvectiveCoefficient",(function(){return No})),l.d(i,"timesPerHour",(function(){return Vo})),l.d(i,"daysPerYear",(function(){return Jo})),l.d(i,"monthlyIrradianceLosses",(function(){return Go})),l.d(i,"discretization",(function(){return Xo})),l.d(i,"diurnalTemperatureModel",(function(){return Bo})),l.d(i,"highestTemperatureTimeInMinutes",(function(){return Ko})),l.d(i,"solarRadiationHeatmapGridCellSize",(function(){return qo})),l.d(i,"pvGridCellSize",(function(){return Qo})),l.d(i,"solarPanelVisibilityGridCellSize",(function(){return Zo})),l.d(i,"cspTimesPerHour",(function(){return _o})),l.d(i,"cspDaysPerYear",(function(){return $o})),l.d(i,"cspGridCellSize",(function(){return ei})),l.d(i,"sutTimesPerHour",(function(){return ti})),l.d(i,"sutDaysPerYear",(function(){return li})),l.d(i,"sutGridCellSize",(function(){return ai})),l.d(i,"noAnimationForHeatmapSimulation",(function(){return oi})),l.d(i,"noAnimationForThermalSimulation",(function(){return ii})),l.d(i,"noAnimationForSensorDataCollection",(function(){return ri})),l.d(i,"noAnimationForSolarPanelSimulation",(function(){return ni})),l.d(i,"noAnimationForSolarUpdraftTowerSimulation",(function(){return ci}));var r=l(1),n=l.n(r),c=l(52),s=l.n(c),d=(l(584),l(23)),u=l(4),f=l(2),h=l(8),p=l(130),y=l.n(p),g=l(50),m=l.n(g),w=l(100),x=l.n(w),v=l(235),b=l.n(v),A=l(351),T=l(800),P=l(408);A.a.use(P.a).use(T.a).init({debug:!0,fallbackLng:"en",interpolation:{escapeValue:!1},resources:{en:{translation:{name:{IFI:"Institute for Future Intelligence",Aladdin:"Aladdin",Tagline:"Aladdin: Reimagining Design with Explainable AI \u2014 Institute for Future Intelligence"},cookie:{Statement:"By clicking Accept, you agree to our use of cookies to improve your experience with Aladdin.",Accept:"Accept"},aboutUs:{ProductBroughtToYouBy:"This product is brought to you by",TermsOfService:"Terms of Service",PrivacyPolicy:"Privacy Policy",Software:"Software",Content:"Content",Research:"Research",Support:"Support",Acknowledgment:"Acknowledgment",FundingInformation:"The National Science Foundation (NSF) generously provided funding for the research and development of this product through grants #2105695, #2131097, and #2301164. Any opinions, findings, and conclusions or recommendations expressed in this product, however, are those of the authors and do not necessarily reflect the views of NSF.",Contact:"For more information, please contact Charles Xie (charles@intofuture.org).",Translators:"Translators"},word:{LastUpdate:"Last Update",Small:"Small",Medium:"Medium",Large:"Large",Design:"Design",Information:"Information",Type:"Type",Text:"Text",FontSize:"Font Size",FontColor:"Font Color",Model:"Model",Models:"Models",Upload:"Upload",ClickCount:"Click Count",Share:"Share",AlreadyLike:"Already like",Like:"Like",MustLogInToLike:"Must log in to like",AllRightsReserved:"All Rights Reserved",MeterAbbreviation:"m",Version:"Version",VersionInitial:"V",Options:"Options",Maximum:"Maximum",Minimum:"Minimum",MaximumNumber:"Maximum Number",MinimumNumber:"Minimum Number",MaximumValue:"Maximum Value",MinimumValue:"Minimum Value",Or:"Or",None:"None",High:"High",Partial:"Partial",Teacher:"Teacher",Class:"Class",Total:"Total",Leaderboard:"Leaderboard",Latest:"Latest",Range:"Range",SIUnit:"SI Unit",USUnit:"US Unit",ThermalTransmittance:"Thermal Transmittance",ThermalResistance:"Thermal Resistance",UValue:"U-Value",RValue:"R-Value",VolumetricHeatCapacity:"Volumetric Heat Capacity",BuildingHVACSystem:"Building HVAC System",ThermostatSetpoint:"Thermostat Setpoint",TemperatureToleranceThreshold:"Tolerance Threshold",TemperatureToleranceThresholdExplanation:"Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.",Press:"Press",Open:"Open",Save:"Save",SaveAsImage:"Save as Image",SaveAsCsv:"Save as CSV",Update:"Update",Paste:"Paste",Copy:"Copy",Cut:"Cut",Delete:"Delete",Lock:"Lock",Translucent:"Translucent",Color:"Color",Texture:"Texture",Size:"Size",Thickness:"Thickness",Yes:"Yes",No:"No",OK:"OK",Cancel:"Cancel",Apply:"Apply",Close:"Close",ApplyTo:"Apply to",Run:"Run",Pause:"Pause",Resume:"Resume",Clear:"Clear",Warning:"Warning",Caution:"Caution",Reminder:"Reminder",Length:"Length",Width:"Width",Height:"Height",Radius:"Radius",Angle:"Angle",Azimuth:"Azimuth",Coordinates:"Coordinates",Weather:"Weather",Show:"Show",Animate:"Animate",Date:"Date",Time:"Time",Title:"Title",Owner:"Owner",Action:"Action",Rename:"Rename",Location:"Location",Latitude:"Latitude",Month:"Month",Day:"Day",Hour:"Hour",Daylight:"Daylight",Radiation:"Radiation",Temperature:"Temperature",kWh:"kWh",dollar:"dollar",MeterPerSecond:"m/s",NorthInitial:"N",SouthInitial:"S",EastInitial:"E",WestInitial:"W",Fixed:"Fixed",Elements:"Elements",Energy:"Energy",Unknown:"Unknown",Label:"Label",Description:"Description",NoDescription:"No description",MaximumCharacters:"Maximum characters",Author:"Author",Publisher:"Publisher",Building:"Building",ResidentialBuilding:"Residential Building",CommercialBuilding:"Commercial Building",SchoolBuilding:"School Building",TouristAttraction:"Tourist Attraction",UnderConstruction:"Under Construction",Photovoltaic:"Photovoltaic",Anonymous:"Anonymous",Nickname:"Nickname",Pin:"Pin",Unpin:"Unpin"},shared:{NoTexture:"No Texture",FoundationElement:"Foundation",CuboidElement:"Cuboid",PolygonElement:"Polygon",SensorElement:"Sensor",SolarPanelElement:"Solar Panel",WaterHeaterElement:"Water Heater",ParabolicDishElement:"Parabolic Dish",ParabolicTroughElement:"Parabolic Trough",FresnelReflectorElement:"Fresnel Reflector",HeliostatElement:"Heliostat",WindTurbineElement:"Wind Turbine",LightElement:"Light",ElementLocked:"Locked",ModelType:"Model Type",OutputBreakdown:"Breakdown",MoreResults:"More Results"},message:{ModelNotFound:"Model not found",CannotSignIn:"Cannot sign in",CannotSignOut:"Cannot sign out",YourAccountWasCreated:"Your account was created.",CannotCreateAccount:"Cannot create an account",YourAccountSettingsWereSaved:"Your account settings were saved.",CannotSaveYourAccountSettings:"Cannot save your account settings",CannotSaveYourFileToCloud:"Cannot save your file to the cloud",CannotCreateNewProject:"Cannot create a new project",CannotCreateNewProjectWithoutTitle:"Cannot create a new project without a title",CannotOpenYourProjects:"Cannot open your projects",CannotOpenProject:"Cannot open the project",CannotDeleteProject:"Cannot delete the project",CannotRenameProject:"Cannot rename the project",CannotAddDesignToProject:"Cannot add this design to the project",CannotAddDesignToProjectOwnedByOthers:"Cannot add this design to a project owned by others",DesignRemovedFromProject:"The design was successfully removed from the project",CannotRemoveDesignFromProject:"Cannot remove this design from the project",CannotUpdateProject:"Cannot update the project",CannotFetchProjectData:"Cannot fetch project data",TitleUsedChooseDifferentOne:"This title has been used. Choose a different one",CloudFileWithTitleExistsDoYouWantToOverwrite:"A cloud file with the title exists. Do you want to overwrite it?",CloudFileNotFound:"The cloud file was not found",CannotLoadModelsOnMap:"Cannot load models on map",CannotLoadLeaderboard:"Cannot load leaderboard",CannotPublishModelOnMap:"Cannot publish model on map",CannotLikeModelFromMap:"Cannot like model from map",CannotDeleteModelFromMap:"Cannot delete model from map",ModelDeletedFromMap:"Model is deleted from map",DoYouWantToDeleteModelFromMap:"Do you want to delete the model from map?",CannotOpenCloudFile:"Cannot open the cloud file",CannotReadCloudFile:"Cannot read the cloud file",CannotWriteCloudFile:"Cannot write the cloud file",CloudFileCopied:"Cloud file copied",CannotOpenCloudFolder:"Cannot open your cloud folder",CannotDeleteCloudFile:"Cannot delete the cloud file",CannotRenameCloudFile:"Cannot rename the cloud file",DoYouWantToSaveChanges:"Do you want to save changes?",NotApplicableToSelectedAction:"Not Applicable to Selected Action",ThisElementIsLocked:"This element is locked.",ThisCannotBeUndone:"This cannot be undone.",AzimuthOfNorthIsZero:"Azimuth of north is 0\xb0",CounterclockwiseAzimuthIsPositive:"Counter-clockwise is positive",MoveCancelledBecauseOfOverlap:"Move cancelled because of overlap.",MoveOutsideBoundaryCancelled:"Move outside the boundary cancelled.",RotationCancelledBecauseOfOverlap:"Rotation cancelled because of overlap.",RotationOutsideBoundaryCancelled:"Rotation outside the boundary cancelled.",ResizingCancelledBecauseOfOverlap:"Resizing cancelled because of overlap.",ResizingOutsideBoundaryCancelled:"Resizing outside the boundary cancelled.",CannotPasteOutsideBoundary:"Cannot paste outside the boundary.",CannotPasteBecauseOfOverlap:"Cannot paste because of overlap.",CannotMoveObjectTooFar:"Cannot move object too far.",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"Existing solar panels will be removed before applying the new layout.",DoYouWantToContinue:"Do you want to continue?",SolarPanelsCannotIntersectWithGround:"Solar panels cannot intersect with the ground.",SolarPanelsCannotOverlapWithOneAnother:"Solar panels cannot overlap with one another.",ScreenshotSaved:"A screenshot was saved.",CsvFileSaved:"A CSV file was saved.",SimulationStarted:"Simulation started.",SimulationCompleted:"Simulation completed.",SimulationAborted:"Simulation aborted.",SimulationPaused:"Simulation paused.",CancelSimulation:"Cancel simulation",PauseSimulation:"Pause simulation",ResumeSimulation:"Resume simulation",SimulationWillNotStartDueToErrors:"Simulation will not start due to errors",SimulationWillStartDespiteWarnings:"Simulation will start despite warnings.",EvolutionStarted:"Evolution started.",EvolutionCompleted:"Evolution completed.",EvolutionAborted:"Evolution aborted.",EvolutionPaused:"Evolution paused.",EncounterEvolutionError:"Encountered an evolution error.",CancelEvolution:"Cancel evolution",PauseEvolution:"Pause evolution",ResumeEvolution:"Resume evolution",ConvergenceThresholdHasBeenReached:"The convergence threshold has been reached.",MaximumNumberOfGenerationsHasBeenReached:"The maximum number of generations has been reached.",MaximumNumberOfStepsHasBeenReached:"The maximum number of steps has been reached.",ObjectiveFunctionTypeError:"The current objective function is not supported by this operation. Please start from the menu.",WallsAreNotAtSameHeight:"Walls are not at the same height.",WallsAreNotPerpendicular:"Walls are not perpendicular.",WallsAreNotConnected:"Walls are not connected.",WallsNumberNeedToBeFour:"The number of walls needs to be four.",BuildingContainsEmptyWall:"Building contains one or more empty wall.",BuildingRoofMissing:"Building has a missing roof.",UnknownErrors:"Unknown errors."},menu:{AnalysisOptions:"Analysis Options",option:{GridCellSize:"Grid Cell Size",SamplingFrequency:"Sampling Frequency",TimesPerHour:"Times per Hour",DaysPerYear:"Days per Year"},mainMenu:"Main Menu",cloudMenu:"Cloud Menu",projectSubMenu:"Project",project:{CreateNewProject:"Create New Project",OpenProject:"Open Project",SaveProjectAs:"Save Project As",YouMustLogInToCreateProject:"You must log in to create a new project",YouMustLogInToOpenProject:"You must log in to open a project"},fileSubMenu:"File",file:{CreateNewFile:"Create New File",OpenLocalFile:"Open Local File",SaveAsLocalFile:"Save as Local File",SavingAbortedMustHaveValidFileName:"Saving aborted! You must have a valid file name",OpenCloudFile:"Open Cloud File",SaveCloudFile:"Save Cloud File",SaveAsCloudFile:"Save as Cloud File",SavingAbortedMustHaveValidTitle:"Saving aborted! You must have a valid title for a cloud file",ToSaveYourWorkPleaseSignIn:"To save your work, please sign in.",TakeScreenshot:"Take Screenshot",UseCloudFileName:"Use Cloud File Name",PublishOnModelsMap:"Publish on Models Map",PublishedOnModelsMap:"Your model has been published on the Models Map",UpdatedOnModelsMap:"Your model has been updated on the Models Map",YouMustLogInToPublishYourModel:"You must log in to publish your model",YouCannotPublishAModelThatYouDoNotOwn:"You cannot publish a model that you do not own",YouMustSaveModelOnCloudBeforePublishingIt:"You must save the model on the cloud before publishing it"},editSubMenu:"Edit",edit:{Undo:"Undo",Redo:"Redo"},viewSubMenu:"View",view:{NavigationView:"Navigation View",TwoDimensionalView:"2D View",ResetView:"Reset",ZoomIn:"Zoom In",ZoomOut:"Zoom Out",AutoRotate:"Auto rotate",ShowShadow:"Show Shadow",ShowSurfaceShininess:"Show Surface Shininess",TranslucentFloatingWindows:"Translucent Floating Windows",accessoriesSubMenu:"Accessories",accessories:{SiteInformation:"Site Information",DesignInformation:"Design Information",Instruction:"Instruction",StickyNote:"Sticky Note",Note:"Note"}},settingsSubMenu:"Settings",settings:{WeatherData:"Weather Data",DiurnalTemperature:"Diurnal Temperature",Heliodon:"Heliodon",SunAndTime:"Sun & Time"},benchmarksSubMenu:"Benchmarks",benchmarks:{SolarRadiationPredictionVsMeasurement:"Solar Radiation Prediction vs. Measurement",BESTESTCase600:"Building Energy Simulation Test: BESTEST Case 600",BESTESTCase610:"Building Energy Simulation Test: BESTEST Case 610",BESTESTCase620:"Building Energy Simulation Test: BESTEST Case 620",BESTESTCase630:"Building Energy Simulation Test: BESTEST Case 630"},graph:{LineWidth:"Line Width",SymbolSize:"Symbol Size",BarCategoryGap:"Bar Category Gap",ShowHorizontalGridLines:"Show Horizontal Grid Lines",ShowVerticalGridLines:"Show Vertical Grid Lines"},analysisSubMenu:"Analysis",physicsSubMenu:"Physics",physics:{DailySolarRadiationHeatmap:"Daily Solar Radiation Heatmap",SolarRadiationHeatmapOptions:"Solar Radiation Heatmap Options",SolarRadiationHeatmapGridCellSize:"Solar Radiation Heatmap Grid Cell Size",SolarRadiationHeatmapMaxValue:"Solar Radiation Heatmap Maximum Value",SolarRadiationHeatmapNoAnimation:"No Animation for Static Model",ReflectionHeatmap:"Reflection Heatmap"},sensorSubMenu:"Sensor",sensor:{CollectDailyData:"Collect Daily Data",CollectYearlyData:"Collect Yearly Data",SensorSimulationNoAnimation:"No Animation for Collecting Sensor Data"},buildingSubMenu:"Building",building:{AnalyzeDailyBuildingEnergy:"Analyze Daily Building Energy",AnalyzeYearlyBuildingEnergy:"Analyze Yearly Building Energy",EnergyAnalysisOptions:"Energy Analysis Options",EnergyGridCellSize:"Energy Grid Cell Size",BuildingEnergySimulationNoAnimation:"No Animation for Building Energy Simulation"},solarPanelSubMenu:"Solar Panel",solarPanel:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield",AnalyzeVisibility:"Analyze Visibility",PanelDiscretization:"Panel Discretization",Exact:"Exact",Approximate:"Approximate",EnergyGridCellSize:"Energy Grid Cell Size",VisibilityGridCellSize:"View Factor Grid Cell Size",EnergyAnalysisOptions:"Energy Analysis Options",VisibilityAnalysisOptions:"Visibility Analysis Options",SolarPanelSimulationNoAnimation:"No Animation for Solar Panel Simulation"},parabolicTroughSubMenu:"Parabolic Trough",parabolicTrough:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},parabolicDishSubMenu:"Parabolic Dish",parabolicDish:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},fresnelReflectorSubMenu:"Fresnel Reflector",fresnelReflector:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},heliostatSubMenu:"Heliostat",heliostat:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},solarUpdraftTowerSubMenu:"Solar Updraft Tower",solarUpdraftTower:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield",SolarUpdraftTowerSimulationNoAnimation:"No Animation for Solar Updraft Tower Simulation"},tutorialsSubMenu:"Tutorials",solarEnergyScienceSubMenu:"Solar Science",solarEnergyScienceTutorials:{SunAngles:"Sun Angles Relative to an Observer on the Ground",InsolationAndClimate:"Insolation and Climate",SolarRadiationToBox:"Solar Radiation to a Box"},buildingScienceSubMenu:"Building Science",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"Thermal Envelope vs. Building Envelope",EffectOfSizeOnBuildingEnergy:"Effect of Size on Building Energy",EffectOfOrientationOnBuildingEnergy:"Effect of Orientation on Building Energy",EffectOfInsulationOnBuildingEnergy:"Effect of Insulation on Building Energy",EffectOfRoofColorOnBuildingEnergy:"Effect of Roof Color on Building Energy",EffectOfEavesOverhangLengthOnBuildingEnergy:"Effect of Eaves Overhang Length on Building Energy",EffectOfWindowSHGCOnBuildingEnergy:"Effect of Window Solar Heat Gain on Building Energy",EffectOfThermostatSetpointOnBuildingEnergy:"Effect of Thermostat Setpoint on Building Energy",EffectOfSolarPanelsOnBuildingEnergy:"Effect of Solar Panels on Building Energy",EffectOfGroundTemperatureOnBuildingEnergy:"Effect of Ground Temperature on Building Energy",EffectOfTreesOnBuildingEnergy:"Effect of Trees on Building Energy"},buildingDesignSubMenu:"Building Design",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"Cape Cod Style House with Shed Dormer",MansardRoofWithDormers:"Mansard Roof with Dormers",GableRoofVsHipRoof:"Gable Roof vs. Hip Roof",ColonialVsSaltbox:"Colonial vs. Saltbox",GambrelRoofVsMansardRoof:"Gambrel Roof vs. Mansard Roof",CombinationRoofVsBonnetRoof:"Combination Roof vs. Bonnet Roof",DutchGableRoof:"Dutch Gable Roof",GableAndValleyRoof:"Gable and Valley Roof",ClerestoryRoof:"Clerestory Roof",MonitorRoof:"Monitor Roof",AFrameHouse:"A-Frame House",HalfTimberedHouse:"Half-Timbered House",AllBasicRoofTypes:"All Basic Roof Types"},photovoltaicSolarPowerSubMenu:"Photovoltaic Solar Power",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"Effect of Tilt Angle of a Solar Panel",EffectOfAzimuthOfSolarPanel:"Effect of Azimuth of a Solar Panel",SolarPanelTypes:"Solar Panel Types",VerticalBifacialSolarPanels:"Vertical Bifacial Solar Panels",CompareMonofacialAndBifacialSolarPanels:"Monofacial vs. Bifacial Solar Panels",SolarTrackers:"Solar Trackers",CoveringGroundWithSolarPanels:"Why Just Covering the Ground with Solar Panels is not a Good Idea",InterRowSpacingOfSolarPanelArray:"Effect of Inter-Row Spacing in a Solar Panel Array",EffectOfOrientationOfSolarPanels:"Effect of Orientation of Solar Panels",SolarPanelArrayAutomaticLayout:"Solar Panel Array Automatic Layout"},concentratedSolarPowerSubMenu:"Concentrated Solar Power",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"Effect of Azimuth of a Parabolic Trough",EffectOfLatusRectumOfParabolicTrough:"Effect of Latus Rectum of a Parabolic Trough",FocusSunlightWithParabolicDish:"Focus Sunlight with a Parabolic Dish",LinearFresnelReflectors:"Linear Fresnel Reflectors",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"Effect of Absorber Pipe Height for Linear Fresnel Reflectors",EffectOfAzimuthOfLinearFresnelReflectors:"Effect of Azimuth of Linear Fresnel Reflectors",LinearFresnelReflectorsWithTwoAbsorbers:"Linear Fresnel Reflectors with Two Absorbers",CosineEfficiencyOfHeliostats:"Cosine Efficiency of Heliostats",ShadowingAndBlockingOfHeliostats:"Shadowing and Blocking of Heliostats",EffectSolarPowerTowerHeight:"Effect of Solar Power Tower Height",SolarPowerTower:"Solar Power Tower"},otherTypesOfSolarPowerSubMenu:"Other Types of Solar Power",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"Solar Updraft Tower"},generativeDesignSubMenu:"Generative Design",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Monofacial Solar Panel Array",BifacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Bifacial Solar Panel Array",OutputOfSolarPanelArrayInDifferentPlaces:"The Output of a Solar Panel Array in Different Places",SimpleSolarFarmParetoFront:"The Pareto Front for Designing a Simple Solar Farm"},examplesSubMenu:"Examples",solarEnergySubMenu:"Solar Energy",solarEnergyExamples:{SunBeamAndHeliodon:"Sun Beam and Heliodon",RooftopSolarPanels:"Rooftop Solar Panels",NevadaSolarOneParabolicTroughArray:"Nevada Solar One Parabolic Trough Array",TooeleParabolicDishArray:"Tooele Parabolic Dish Array",PS10SolarPowerTower:"PS10 Solar Power Tower",TucsonLinearFresnelReflectors:"Tucson Linear Fresnel Reflectors",SolarCanopyFormFactors:"Solar Canopy Form Factors",SolarCanopyOverBleachers:"Solar Canopy Over Bleachers",SolarCanopyOverGarage:"Solar Canopy Over Garage",SolarBusStop:"Solar Bus Stop",SolarFacadeTesla:"Tesla Solar Fa\xe7ade",BuildingIntegratedPhotovoltaics:"Building-Integrated Photovoltaics",Floatovoltaics:"Floatovoltaics",Agrivoltaics:"Agrivoltaics",VegetativeBuffer:"Vegetative Buffer",RainbowSwashSolarFarmBostonMA:"Rainbow Swash Solar Farm in Boston, MA",MickeyMouseSolarFarmOrlandoFL:"Mickey Mouse Solar Farm in Orlando, FL",SolarPanelsOverCanalBakersfieldCA:"Hypothetical Solar Panels Over Canal in Bakersfield, CA",SolarNoiseBarrierLexingtonMA:"Hypothetical Solar Noise Barrier in Lexington, MA",HSATSolarTrackersRaleighNC:"Horizontal Single Axis Trackers (HSAT) in Raleigh, NC",AADATSolarTrackersLancasterCA:"Azimuth\u2013Altitude Dual Axis Trackers (AADAT) in Lancaster, CA",SolarUpdraftTowerInCity:"Solar Updraft Tower in City"},builtEnvironmentSubMenu:"Built Environment",residentialBuildingsSubMenu:"Residential Buildings",residentialBuildingExamples:{ColonialHouse:"Colonial House",DutchColonialHouse:"Dutch Colonial House",TShapedHouse:"T-Shaped House",CapeCodHouseWithGarage:"Cape Cod House with Garage",Solarium:"Solarium",Church1:"Church 1",Cathedral1:"Cathedral 1",Cathedral2:"Cathedral 2",Mosque1:"Mosque 1",AdobeTaosHouse:"Adobe Taos House",RanchHouse:"Ranch House",BonnetHouse:"Bonnet House",BarnStyleHouse:"Barn Style House",ModernHouse:"Modern House",ButterflyRoofHouse:"Butterfly Roof House"},commercialBuildingsSubMenu:"Commercial Buildings",commercialBuildingExamples:{WhiteHouse:"White House",BilimMersinTurkiye:"BILIM, Mersin, Turkiye",SpanishStyleHotel:"Spanish Style Hotel",ApartmentBuilding:"Apartment Building",OfficeBuilding:"Office Building",Hotel:"Hotel"},buildingComplexesSubMenu:"Building Complexes",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"South Burlington High School, VT",MescaleroApacheSchoolNewMexico:"Mescalero Apache School, NM"},urbanPlanningSubMenu:"Urban Planning",urbanPlanningExamples:{Heatmap1:"Heatmap"},otherBuildingsSubMenu:"Other Buildings",otherBuildingExamples:{Greenhouse:"Greenhouse",Pavilion:"Pavilion in a Park",OctagonalPagoda:"Octagonal Pagoda",OceanFront:"Ocean Front",EgyptianPyramids:"Egyptian Pyramids",MayanPyramid:"Mayan Pyramid",SiOSePol:"Si-o-se-pol",StackedCuboids:"Stacked Cuboids"},artificialIntelligenceSubMenu:"Artificial Intelligence",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"Optimizing the Tilt Angle of a Solar Panel Row",OptimizingTiltAnglesOfMultipleSolarPanelRows:"Optimizing the Tilt Angles of Multiple Solar Panel Rows",SolarFarmGenerativeDesign:"Solar Farm Generative Design",SolarFarmGenerativeDesignWithBlock:"Solar Farm Generative Design in the Presence of a Block",FitchburgSolarFarmGenerativeDesign:"Fitchburg Solar Farm Generative Design"},languageSubMenu:"Language",publicSubMenu:"Public",ModelsGallery:"Models Gallery",ModelsMap:"Models Map",AboutUs:"About Us"},avatarMenu:{AccountSettings:"Account Settings",PrivacyStatementTitle:"User Privacy Protection Statement",PrivacyStatement:"When you sign in, your Google ID is used to create and access your Aladdin account. Only a random alphanumeric string is stored in our database as a reference. No personally identifiable data such as your name or email is ever gathered. For more information, see our ",SignIn:"Sign In",SignOut:"Sign Out",IfYouAreAStudent:"If you are a student"},skyMenu:{Axes:"Axes",Theme:"Theme",ThemeDefault:"Default",ThemeDesert:"Desert",ThemeDune:"Dune",ThemeForest:"Forest",ThemeGrassland:"Grassland",ThemeHill:"Hill",ThemeLake:"Lake",ThemeMountain:"Mountain",ThemeRural:"Rural",SunlightAttenuationCoefficientInAir:"Sunlight Attenuation Coefficient in Air",ConvectiveCoefficientOfAir:"Convective Coefficient of Air",HighestTemperatureTimeInMinutes:"Highest Temperature Time (Minutes)",SelectSunAnglesToShow:"Select Sun Angles to Show",ShowAzimuthAngle:"Show Azimuth Angle",ShowElevationAngle:"Show Elevation Angle",ShowZenithAngle:"Show Zenith Angle",DirectLightBrightnessAtNoon:"Direct Light Brightness at Noon",AmbientLightBrightnessAtNoon:"Ambient Light Brightness at Noon"},groundMenu:{MonthlyIrradianceLoss:"Monthly Irradiance Loss",Vegetation:"Vegetation",LeafOutDay:"Leaf-Out Day",LeafOffDay:"Leaf-Off Day",Albedo:"Albedo",ImageOnGround:"Image on Ground",WaterSurface:"Water Surface",RemoveAllUnlockedTrees:"Remove All Unlocked Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedPeople:"Remove All Unlocked People",RemoveAllUnlockedFoundations:"Remove All Unlocked Foundations",RemoveAllUnlockedCuboids:"Remove All Unlocked Cuboids",DoYouReallyWantToRemoveAllPeople:"Do you really want to remove all the people who are not locked",DoYouReallyWantToRemoveAllTrees:"Do you really want to remove all the trees that are not locked",DoYouReallyWantToRemoveAllFlowers:"Do you really want to remove all the flowers that are not locked",DoYouReallyWantToRemoveAllSolarPanels:"Do you really want to remove all the solar panels that are not locked",DoYouReallyWantToRemoveAllFoundations:"Do you really want to remove all the foundations that are not locked",DoYouReallyWantToRemoveAllCuboids:"Do you really want to remove all the cuboids that are not locked",LockAllElements:"Lock All Elements",UnlockAllElements:"Unlock All Elements"},labelSubMenu:{Label:"Label",LabelText:"Label Text",LabelHeight:"Label Height",LabelSize:"Label Size",LabelFontSize:"Font Size",LabelColor:"Label Color",KeepShowingLabel:"Keep Showing Label"},foundationMenu:{RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedParabolicTroughs:"Remove All Unlocked Parabolic Troughs",RemoveAllUnlockedParabolicDishes:"Remove All Unlocked Parabolic Dishes",RemoveAllUnlockedFresnelReflectors:"Remove All Unlocked Fresnel Reflectors",RemoveAllUnlockedHeliostats:"Remove All Unlocked Heliostats",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",RemoveAllUnlockedLights:"Remove All Unlocked Lights",RemoveAllUnlockedWalls:"Remove All Unlocked Walls",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",RemoveAllUnlockedPolygons:"Remove All Unlocked Polygons",RemoveAllUnlockedHumans:"Remove All Unlocked Humans",RemoveAllUnlockedTrees:"Remove All Unlocked Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"Racks",Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",SolarPanels:"Solar Panels",SolarPanelArray:"Solar Panel Array",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"Do you really want to remove all the solar panels on this foundation that are not locked",ParabolicTroughs:"Parabolic Troughs",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"Do you really want to remove all the parabolic troughs on this foundation that are not locked",ParabolicDishes:"Parabolic Dishes",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"Do you really want to remove all the parabolic dishes on this foundation that are not locked",FresnelReflectors:"Fresnel Reflectors",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"Do you really want to remove all the Fresnel reflectors on this foundation that are not locked",Heliostats:"Heliostats",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"Do you really want to remove all the heliostats on this foundation that are not locked",Sensors:"Sensors",DoYouReallyWantToRemoveAllSensorsOnFoundation:"Do you really want to remove all the sensors on this foundation that are not locked",Lights:"Lights",DoYouReallyWantToRemoveAllLightsOnFoundation:"Do you really want to remove all the lights on this foundation that are not locked",Walls:"Walls",DoYouReallyWantToRemoveAllWallsOnFoundation:"Do you really want to remove all the walls on this foundation that are not locked",Windows:"Windows",DoYouReallyWantToRemoveAllWindowsOnFoundation:"Do you really want to remove all the windows on this foundation that are not locked",Doors:"Doors",DoYouReallyWantToRemoveAllDoorsOnFoundation:"Do you really want to remove all the doors on this foundation that are not locked",Polygons:"Polygons",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"Do you really want to remove all the polygons on this foundation that are not locked",Humans:"Humans",DoYouReallyWantToRemoveAllHumansOnFoundation:"Do you really want to remove all the humans on this foundation who are not locked",Trees:"Trees",DoYouReallyWantToRemoveAllTreesOnFoundation:"Do you really want to remove all the trees on this foundation that are not locked",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnFoundation:"Do you really want to remove all the flowers on this foundation that are not locked",OnlyThisFoundation:"Only This Foundation",AllConnectedFoundations:"All Connected Foundations",AllSelectedFoundations:"All Selected Foundations",AllFoundations:"All Foundations",AddPolygon:"Add Polygon",SolarStructure:"Solar Structure",GroupMaster:"Group Master",LockAllElementsOnThisFoundation:"Lock All Elements on This Foundation",UnlockAllElementsOnThisFoundation:"Unlock All Elements on This Foundation",GroundFloorRValue:"Ground Floor R-Value",OnlyThisGroundFloor:"Only This Ground Floor",AllGroundFloors:"All Ground Floors"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"Receiver Tower for Heliostats",ReceiverTowerPhysicalProperties:"Physical Properties of Receiver Tower",ReceiverTowerHeight:"Height of Receiver Tower",ReceiverTowerRadius:"Radius of Receiver Tower",ReceiverAbsorptance:"Absorptance of Receiver",ReceiverOpticalEfficiency:"Optical Efficiency of Receiver",ReceiverThermalEfficiency:"Thermal Efficiency of Receiver"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"Absorber Pipe for Fresnel Reflectors",AbsorberPipePhysicalProperties:"Physical Properties of Absorber Pipe",AbsorberHeight:"Height of Absorber Pipe",AbsorberApertureWidth:"Aperture Width of Absorber Pipe",AbsorberPipePoleNumber:"Pole Number for Absorber Pipe",AbsorberAbsorptance:"Absorptance of Absorber",AbsorberOpticalEfficiency:"Optical Efficiency of Absorber",AbsorberThermalEfficiency:"Thermal Efficiency of Absorber"},solarUpdraftTowerMenu:{SolarUpdraftTower:"Solar Updraft Tower",SolarUpdraftTowerPhysicalProperties:"Physical Properties of Solar Updraft Tower",SolarUpdraftTowerChimneyHeight:"Solar Updraft Tower Chimney Height",SolarUpdraftTowerChimneyRadius:"Solar Updraft Tower Chimney Radius",SolarUpdraftTowerCollectorHeight:"Solar Updraft Tower Collector Height",SolarUpdraftTowerCollectorRadius:"Solar Updraft Tower Collector Radius",SolarUpdraftTowerCollectorTransmissivity:"Solar Updraft Tower Collector Transmissivity",SolarUpdraftTowerCollectorEmissivity:"Solar Updraft Tower Collector Emissivity",SolarUpdraftTowerDischargeCoefficient:"Solar Updraft Tower Discharge Coefficient",SolarUpdraftTowerTurbineEfficiency:"Solar Updraft Tower Turbine Efficiency"},cuboidMenu:{Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",RemoveAllUnlockedPolygons:"Remove All Unlocked Polygons",RemoveAllUnlockedHumans:"Remove All Unlocked Humans",RemoveAllUnlockedTrees:"Remove All Unlocked Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"Racks",SolarPanels:"Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"Do you really want to remove all the solar panels on this cuboid that are not locked",Sensors:"Sensors",DoYouReallyWantToRemoveAllSensorsOnCuboid:"Do you really want to remove all the sensors on this cuboid that are not locked",Polygons:"Polygons",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"Do you really want to remove all the polygons on this cuboid that are not locked",Humans:"Humans",DoYouReallyWantToRemoveAllHumansOnCuboid:"Do you really want to remove all the humans on this cuboid who are not locked",Trees:"Trees",DoYouReallyWantToRemoveAllTreesOnCuboid:"Do you really want to remove all the trees on this cuboid that are not locked",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnCuboid:"Do you really want to remove all the flowers on this cuboid that are not locked",OnlyThisCuboid:"Only This Cuboid",AllCuboidsOnSameSurface:"All Cuboids on Same Surface",AllCuboidsAboveSameBase:"All Cuboids Above Same Base",AllSelectedCuboids:"All Selected Cuboids",AllCuboids:"All Cuboids",OnlyThisSide:"Only This Side",AllSidesOfThisCuboid:"All Sides of This Cuboid",AllSidesOfSelectedCuboids:"All Sides of Selected Cuboids",AllSidesOfAllCuboids:"All Sides of All Cuboids",AddPolygon:"Add Polygon",Stackable:"Stackable",GroupMaster:"Group Master"},polygonMenu:{Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",TextBox:"Text Box",FontOutlineColor:"Font Outline Color",FontOutlineWidth:"Font Outline Width",FontStrokeColor:"Font Stroke Color",FontStrokeWidth:"Font Stroke Width",NoOutline:"No Outline",Shiny:"Shiny",Filled:"Filled",FillTexture:"Fill Texture",FillColor:"Fill Color",Opacity:"Opacity",LineColor:"Line Color",LineWidth:"Line Width",LineStyle:"Line Style",SolidLine:"Solid Line",DashedLine:"Dashed Line",DottedLine:"Dotted Line",InsertVertexBeforeIndex:"Insert Vertex Before Index",InsertVertexAfterIndex:"Insert Vertex After Index",DeleteVertex:"Delete Vertex",OnlyThisPolygon:"Only This Polygon",AllPolygonsOnSurface:"All Polygons on the Same Surface",AllPolygonsAboveFoundation:"All Polygons Above Foundation",AllSelectedPolygons:"All Selected Polygons",AllPolygons:"All Polygons",Layout:"Layout",SolarPanelArrayLayout:"Solar Panel Array Layout",SolarPanelArrayLayoutParametricDesign:"Solar Panel Array Layout: Parametric Design",SolarPanelArrayLayoutGenerativeDesign:"Solar Panel Array Layout: Generative Design",SolarPanelArrayModel:"Solar Panel Model",SolarPanelArrayOrientation:"Orientation",SolarPanelArrayTiltAngle:"Tilt Angle",SolarPanelArrayRowWidth:"Row Width",SolarPanelArrayInterRowSpacing:"Inter-Row Spacing",SolarPanelArrayRowSpacing:"Row Spacing",SolarPanelArrayRowAxis:"Row Axis",SolarPanelArrayLeftRightRowAxis:"Left-Right (Relative)",SolarPanelArrayUpDownRowAxis:"Up-Down (Relative)",SolarPanelArrayEastWestRowAxis:"East-West (Absolute)",SolarPanelArrayNorthSouthRowAxis:"North-South (Absolute)",SolarPanelArrayMargin:"Margin",SolarPanelArrayPoleHeight:"Pole Height",SolarPanelArrayPoleSpacing:"Pole Spacing",SolarPanelArrayTotalYearlyCost:"Total Cost",SolarPanelArrayTotalYearlyRevenue:"Total Revenue",SolarPanelArrayTotalYearlyYield:"Total Yield",SolarPanelArrayMeanYearlyYield:"Mean Yield",SolarPanelArrayYearlyProfit:"Profit",LayoutNotAcceptedCheckYourParameters:"This layout is not accepted. Please check your parameters."},optimizationMenu:{Optimization:"Optimization",Parameters:"Parameters",Variables:"Variables",Constants:"Constants",GeneticAlgorithm:"Genetic Algorithm",GeneticAlgorithmSettings:"Genetic Algorithm Settings",ParticleSwarmOptimization:"Particle Swarm Optimization",ParticleSwarmOptimizationSettings:"Particle Swarm Optimization Settings",SolarPanelTiltAngleOptimization:"Solar Panel Tilt Angle Optimization",SolarPanelArrayLayout:"Solar Panel Array Layout",Generation:"Generation",Gene:"Gene",NormalizedVariables:"Normalized Variables",Objective:"Objective",ObjectiveFunctionDailyTotalYield:"Daily Total Yield",ObjectiveFunctionYearlyTotalYield:"Yearly Total Yield",ObjectiveFunctionDailyMeanYield:"Daily Mean Yield",ObjectiveFunctionYearlyMeanYield:"Yearly Mean Yield",ObjectiveFunctionDailyProfit:"Daily Profit",ObjectiveFunctionYearlyProfit:"Yearly Profit",GeneticAlgorithmSelectionMethod:"Genetic Algorithm Selection Method",RouletteWheel:"Roulette Wheel",Tournament:"Tournament",SearchMethod:"Search Method",GlobalSearchUniformSelection:"Global Search Uniform Selection",LocalSearchRandomOptimization:"Local Search Random Optimization",PopulationSize:"Population Size",MaximumGenerations:"Maximum Generations",SelectionRate:"Selection Rate",CrossoverRate:"Crossover Rate",MutationRate:"Mutation Rate",Step:"Step",SwarmSize:"Swarm Size",MaximumSteps:"Maximum Steps",MaximumVelocity:"Maximum Velocity",InertiaWeight:"Inertia Weight",CognitiveCoefficient:"Cognitive Coefficient",SocialCoefficient:"Social Coefficient",ConvergenceThreshold:"Convergence Threshold for Termination",LocalSearchRadius:"Local Search Radius",RowsPerRackRange:"Range for Rows per Rack",TiltAngleRange:"Range for Tilt Angle",InterRowSpacingRange:"Range for Inter-Row Spacing",ClickTargetPolygonToActivate:"Click Target Polygon to Activate",ClickTargetFoundationToActivate:"Click Target Foundation to Activate"},treeMenu:{ShowModel:"Show Model",Flip:"Flip",Type:"Type",Spread:"Spread"},flowerMenu:{Flip:"Flip",Type:"Type",Spread:"Spread"},peopleMenu:{ChangePerson:"Change Person",Flip:"Flip",Observer:"Observer",ViewFromThisPerson:"View from This Person"},lightMenu:{Color:"Color",Intensity:"Intensity",Decay:"Decay",MaximumDistance:"Distance",Inside:"Inside"},solarCollectorMenu:{RelativeAzimuth:"Relative Azimuth",Pole:"Pole",PoleHeight:"Pole Height",PoleRadius:"Pole Radius",ExtraPoleHeight:"Extra Pole Height",ExtraPoleHeightInAdditionToHalfWidth:"Extra Pole Height in Addition to Half Width",DrawSunBeam:"Draw Sun Beam"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"Reflector Reflectance",ReceiverAbsorptance:"Receiver Absorptance",ReflectorOpticalEfficiency:"Reflector Optical Efficiency",ReceiverThermalEfficiency:"Receiver Thermal Efficiency"},solarPanelMenu:{InverterEfficiency:"Inverter Efficiency",InverterEfficiencyExplained:"The efficiency for converting direct current (DC) to alternating current (AC).",DcToAcSizeRatio:"DC-to-AC Size Ratio",DcToAcSizeRatioExplained:"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.",ChangePvModel:"Change PV Model",Orientation:"Orientation",Portrait:"Portrait",Landscape:"Landscape",FrameColor:"Frame Color",Panels:"panels",PanelsWide:"panels wide",PanelsLong:"panels long",TiltAngle:"Tilt Angle",SouthFacingIsPositive:"South facing is positive",Tracker:"Tracker",SolarTrackerFollowsSun:"A tracker follows the sun to increase solar panel outputs.",PoleSpacing:"Pole Spacing",NoTracker:"No Tracker",HorizontalSingleAxisTracker:"Horizontal Single Axis Tracker",VerticalSingleAxisTracker:"Vertical Single Axis Tracker",AltazimuthDualAxisTracker:"Altazimuth Dual Axis Tracker",OnlyThisSolarPanel:"Only This Solar Panel",AllSolarPanelsOnSurface:"All Solar Panels on the Same Surface",AllSolarPanelsAboveFoundation:"All Solar Panels Above the Same Foundation",AllSelectedSolarPanels:"All Selected Solar Panels",AllSolarPanels:"All Solar Panels"},pvModelPanel:{SolarPanelSpecs:"Solar Panel Specs",Model:"Model",PanelSize:"Panel Size",Cells:"Cells",CellType:"Cell Type",Monocrystalline:"Monocrystalline",Polycrystalline:"Polycrystalline",ThinFilm:"Thin Film",Bifacial:"Bifacial",BifacialityFactor:"Bifaciality Factor",Black:"Black",Blue:"Blue",ShadeTolerance:"Shade Tolerance",SolarCellEfficiency:"Solar Cell Efficiency",NominalOperatingCellTemperature:"Nominal Operating Cell Temperature",TemperatureCoefficientOfPmax:"Temperature Coefficient of Pmax"},parabolicTroughMenu:{ModuleLength:"Module Length",Modules:"modules",ModulesLong:"modules long",LatusRectum:"Latus Rectum",OnlyThisParabolicTrough:"Only This Parabolic Trough",AllParabolicTroughsAboveFoundation:"All Parabolic Troughs Above the Same Foundation",AllSelectedParabolicTroughs:"All Selected Parabolic Troughs",AllParabolicTroughs:"All Parabolic Troughs"},fresnelReflectorMenu:{AbsorberPipe:"Absorber Pipe",SelectAbsorberToReflectSunlightTo:"Select Absorber to Reflect Sunlight to",ModuleLength:"Module Length",Modules:"modules",ModulesLong:"modules long",OnlyThisFresnelReflector:"Only This Fresnel Reflector",AllFresnelReflectorsAboveFoundation:"All Fresnel Reflectors Above the Same Foundation",AllSelectedFresnelReflectors:"All Selected Fresnel Reflectors",AllFresnelReflectors:"All Fresnel Reflectors"},heliostatMenu:{Tower:"Tower",SelectTowerToReflectSunlightTo:"Select Tower to Reflect Sunlight to",OnlyThisHeliostat:"Only This Heliostat",AllHeliostatsAboveFoundation:"All Heliostats Above the Same Foundation",AllSelectedHeliostats:"All Selected Heliostats",AllHeliostats:"All Heliostats"},parabolicDishMenu:{ReceiverStructure:"Receiver Structure",CentralPole:"Central Pole",CentralPoleWithTripod:"Central Pole with Tripod",Quadrupod:"Quadrupod",RimDiameter:"Rim Diameter",LatusRectum:"Latus Rectum",ExtraPoleHeightInAdditionToRadius:"Extra Pole Height in Addition to Radius",OnlyThisParabolicDish:"Only This Parabolic Dish",AllParabolicDishesAboveFoundation:"All Parabolic Dishes Above the Same Foundation",AllSelectedParabolicDishes:"All Selected Parabolic Dishes",AllParabolicDishes:"All Parabolic Dishes"},wallMenu:{TextureDefault:"Default",Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",SizeOfWall:"Size of Wall",OnlyThisWall:"Only This Wall",AllConnectedWalls:"All Connected Walls",AllWallsAboveFoundation:"All Walls Above the Same Foundation",AllSelectedWalls:"All Selected Walls",AllWalls:"All Walls",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisWall:"Do you really want to remove all the windows on this wall",Doors:"Doors",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",DoYouReallyWantToRemoveAllDoorsOnThisWall:"Do you really want to remove all the doors on this wall",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"Do you really want to remove all the solar panels on this wall",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisWall:"Do you really want to remove all the sensors on this wall",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisWall:"Do you really want to remove all the lights on this wall",LockAllPolygons:"Lock All Polygons",UnlockAllPolygons:"Unlock All Polygons",RemoveAllUnlockedPolygons:"Remove All Unlocked Polygons",WallStructure:"Wall Structure",DefaultStructure:"Default",StudStructure:"Stud",PillarStructure:"Pillar",Opacity:"Opacity",StructureSpacing:"Structure Spacing",StructureWidth:"Structure Width",StructureThickness:"Structure Thickness",StructureColor:"Structure Color",Color:"Wall Color",Height:"Height",Thickness:"Thickness",Texture:"Texture",AllLightsOnWallInside:"All Lights on Wall Inside",AllLightsOnWallOutside:"All Lights on Wall Outside",Fill:"Fill",Full:"Full",Partial:"Partial",Empty:"Empty",OpenToOutside:"Open to Outside",EavesLength:"Eaves Overhang Length",Parapet:"Parapet",ParapetColor:"Parapet Color",ParapetTexture:"Parapet Texture",ParapetHeight:"Parapet Height",CopingsHeight:"Copings Height",CopingsWidth:"Copings Width"},windowMenu:{OnlyThisWindow:"Only This Window",AllWindowsOnSurface:"All Windows on the Same Surface",AllWindowsAboveFoundation:"All Windows Above the Same Foundation",AllSelectedWindows:"All Selected Windows",AllWindows:"All Windows",Width:"Width",Height:"Height",Setback:"Setback from Exterior Surface",RelativeToWallThickness:"Relative to wall thickness",Mullion:"Mullion",HorizontalMullion:"Horizontal Mullion",VerticalMullion:"Vertical Mullion",MullionWidth:"Mullion Width",HorizontalMullionSpacing:"Horizontal Mullion Spacing",VerticalMullionSpacing:"Vertical Mullion Spacing",MullionColor:"Mullion Color",Tint:"Tint",Opacity:"Opacity",SolarHeatGainCoefficient:"Solar heat gain coefficient (SHGC) = 1 - opacity",Shutter:"Shutter",LeftShutter:"Left Shutter",RightShutter:"Right Shutter",BothShutters:"Both Shutters",ShutterWidth:"Relative Width",ShutterColor:"Shutter Color",Frame:"Frame",FrameWidth:"Frame Width",SillWidth:"Sill Width",Color:"Frame Color",WindowType:"Window Type",Default:"Default",Arched:"Arched",Polygonal:"Polygonal",Interior:"Interior",Empty:"Empty"},roofMenu:{TextureDefault:"Default",Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",OnlyThisRoof:"Only This Roof",AllRoofsAboveFoundation:"All Roofs Above the Same Foundation",AllSelectedRoofs:"All Selected Roofs",AllRoofs:"All Roofs",OnlyThisCeiling:"Only This Ceiling",AllCeilingsAboveFoundation:"All Ceilings Above the Same Foundation",AllCeilings:"All Ceilings",EavesOverhangLength:"Eaves Overhang Length",RafterSpacing:"Rafter Spacing",RafterWidth:"Rafter Width",RafterThickness:"Rafter Thickness",RafterColor:"Rafter Color",RoofColor:"Roof Color",RoofSideColor:"Roof Side Color",GlassTint:"Glass Tint",Opacity:"Opacity",RoofStructure:"Roof Structure",DefaultStructure:"Default",RafterStructure:"Rafter",GlassStructure:"Glass",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"Do you really want to remove all the solar panels on this roof",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"Do you really want to remove all the windows on this roof",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"Do you really want to remove all the sensors on this roof",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisRoof:"Do you really want to remove all the lights on this roof",AllLightsOnRoofInside:"All Lights on Roof Inside",AllLightsOnRoofOutside:"All Lights on Roof Outside",Rise:"Rise",Ceiling:"Ceiling",RoofRValue:"Roof R-Value",CeilingRValue:"Ceiling R-Value"},doorMenu:{TextureDefault:"Default",Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",Texture11:"Texture 11",Texture12:"Texture 12",Texture13:"Texture 13",Texture14:"Texture 14",Texture15:"Texture 15",Texture16:"Texture 16",Texture17:"Texture 17",OnlyThisDoor:"Only This Door",AllDoorsOnWall:"All Doors on the Same Wall",AllDoorsAboveFoundation:"All Doors Above the Same Foundation",AllSelectedDoors:"All Selected Doors",AllDoors:"All Doors",DoorType:"Door Type",Default:"Default",Arched:"Arched",Filled:"Filled",FrameColor:"Frame Color",Interior:"Interior"},siteInfoPanel:{High:"High",Low:"Low"},designInfoPanel:{NumberOfSelectedHeliostats:"Number of selected heliostats",NumberOfSelectedSolarPanels:"Number of selected solar panels",ElectricityGeneratedDailyBySolarPanels:"Electricity generated daily by these solar panels",SceneDiameter:"Scene diameter",BuildingArea:"Building area"},visualizationControlPanel:{ColorContrast:"Color Contrast",FluxScale:"Flux Scale",ClickUpOrDownArrowButtonsToChange:"Click up or down arrow buttons to change"},instructionPanel:{Rotate:"Rotate",DragMouse:"Drag mouse",Zoom:"Zoom",MouseWheelOrKeys:"Rotate mouse wheel or press Ctrl+[ or Ctrl+]",MouseWheelOrKeysMac:"Rotate mouse wheel or press \u2318+[ or \u2318+]",Pan:"Pan",HoldCtrlDragMouse:"Hold Ctrl and drag mouse",HoldMetaDragMouse:"Hold \u2318 and drag mouse",Enter2DMode:"Enter 2D mode",Exit2DMode:"Exit 2D mode",NavigationMode:"Navigation mode",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",MoveForwardBack:"Move forward/back",MoveForwardBackInstruction:"Press W/S",MoveLeftRight:"Move left/right",MoveLeftRightInstruction:"Press A/D",MoveUpDown:"Move up/down",MoveUpDownInstruction:"Press Z/X",Turn:"Turn",TurnInstruction:"Press arrow keys",ResetView:"Reset",AutoRotate:"Auto rotate",StartOrStop:"Press F4 to start or stop"},mapPanel:{ImageOnGround:"Image on Ground",WeatherStations:"Weather Stations",WeatherStationsNote:"Turn this off to speed up",Coordinates:"Coordinates",Zoom:"Zoom"},visibilityPanel:{SolarPanelVisibility:"Solar Panel Visibility",Observer:"Observer",VantagePoint:"Vantage Point",ItemizedVisibilityByFields:"Itemized by Fields",TotalVisibility:"Total"},sensorPanel:{LightSensor:"Light Sensor",WeatherDataFrom:"Weather Data from"},buildingEnergyPanel:{DailyBuildingEnergy:"Daily Building Energy",YearlyBuildingEnergy:"Yearly Building Energy",Heater:"Heater",AC:"AC",SolarPanel:"Solar Panel",Net:"Net"},solarPanelYieldPanel:{SolarPanelDailyYield:"Solar Panel Daily Yield",SolarPanelYearlyYield:"Solar Panel Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualSolarPanels:"Show outputs of individual solar panels",Profit:"Profit",TotalCost:"Total Cost",TotalRevenue:"Total Revenue",TotalYield:"Total Yield",MeanYield:"Mean Yield",ModuleCount:"Module Count"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"Parabolic Trough Daily Yield",ParabolicTroughYearlyYield:"Parabolic Trough Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualParabolicTroughs:"Show outputs of individual parabolic troughs"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"Parabolic Dish Daily Yield",ParabolicDishYearlyYield:"Parabolic Dish Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualParabolicDishes:"Show outputs of individual parabolic dishes"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"Fresnel Reflector Daily Yield",FresnelReflectorYearlyYield:"Fresnel Reflector Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualFresnelReflectors:"Show outputs of individual Fresnel feflectors"},heliostatYieldPanel:{HeliostatDailyYield:"Heliostat Daily Yield",HeliostatYearlyYield:"Heliostat Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualHeliostats:"Show outputs of individual heliostats"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"Solar Updraft Tower Daily Yield",UpdraftTowerYearlyYield:"Solar Updraft Tower Yearly Yield",ChimneyAirTemperature:"Chimney Air Temperature",ChimneyWindSpeed:"Chimney Wind Speed",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualUpdraftTowers:"Show outputs of individual updraft towers"},heliodonPanel:{SunAndTimeSettings:"Sun & Time Settings",SunAngles:"Angles",TwentyFourHours:"24 Hours"},cloudFilePanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyLikes:"My Likes",MyCloudFiles:"My Cloud Files",GenerateLink:"Generate Link",LinkGeneratedInClipBoard:"A link was generated in the clip board",DoYouReallyWantToDelete:"Do you really want to delete",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"If this file has been shared or published, renaming it breaks existing links"},projectListPanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project was generated in the clip board",DoYouReallyWantToDeleteProject:"Do you really want to delete Project",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"If this project has been shared or published, renaming it breaks existing links"},projectPanel:{ProjectSettings:"Project Settings",ThumbnailImageSize:"Thumbnail Image Size",ProjectByOtherPeople:"Project by Other People",Project:"Project",ProjectType:"Type",ProjectDescription:"Description",MakeDescriptionEditable:"Make this description editable",MakeDescriptionNonEditable:"Make this description non-editable",DoubleClickToMakeDescriptionEditable:"Double-click to make this description editable",SolarPanelArray:"Solar Panel Array",CurateCurrentDesign:"Curate current design",UpdateSelectedDesign:"Update selected design",RemoveSelectedDesign:"Remove selected design",ClickToFlipSortingOrder:"Click to flip the sorting order",DesignNotShownInSolutionSpaceClickToShow:"This design is not shown in solution space; click to show",DesignShownInSolutionSpaceClickToHide:"This design is shown in solution space; click to hide",DistributionInSolutionSpace:"Distribution in the Solution Space",ChooseSolutionSpace:"Choose solution space",ChooseDataColoring:"Choose data coloring",SameColorForAllDesigns:"Same color for all designs",OneColorForEachDesign:"One color for each design",SolutionSpaceScreenshot:"Take a screenshot of the solution space",ScatteredPlotScreenshot:"Take a screenshot of the scattered plot",SingleClickToSelectDoubleClickToOpen:"Single-click to select, double-click to open.",SingleClickToDeselectDoubleClickToOpen:"Single-click to deselect, double-click to open.",GenerateScatteredPlot:"Generate Scattered Plot",SelectXAxis:"Select X Axis",SelectYAxis:"Select Y Axis"},accountSettingsPanel:{MyAccountSettings:"My Account Settings",MyID:"My \ud83c\udd94",ClickToCopyMyID:"Click to copy my ID",IDInClipBoard:"Your ID was copied and is ready to paste.",StoreMyNameInMyFilesWhenSaving:"Store my name in my files when saving",DoYouReallyWantToShowYourNameInYourFiles:"Do you really want to show your display name in your files?",SignFileDisclaimer:"If yes, your display name may be seen by anyone who can access your files.",Likes:"Likes",AllPublished:"All Published",PublishedUnderAliases:"Aliases",UserCount:"User Count",SchoolID:"School ID",ClassID:"Class ID"},weatherPanel:{SunshineHours:"Sunshine"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"Select Air Temperature Model",Sinusoidal:"Sinusoidal"},economicsPanel:{EconomicsParameters:"Economics Parameters",ElectricitySellingPrice:"Electricity Selling Price",OperationalCostPerUnit:"Operational Cost per Unit",SellingPrice:"Selling Price",UnitCost:"Unit Cost"},navigationPanel:{NavigationParameters:"Navigation Parameters",MinimumMoveSpeed:"Minimum Move Speed",MinimumTurnSpeed:"Minimum Turn Speed"},yearlyLightSensorPanel:{SkyClearness:"Clearness",ShowDaylightResults:"Show daylight results",ShowSkyClearnessResults:"Show sky clearness results",ShowAverageDailySolarRadiation:"Show average daily solar radiation"},analysisManager:{NoSensorForCollectingData:"There is no sensor for collecting data.",NoSolarPanelForAnalysis:"There is no solar panel for analysis.",NoObserverForVisibilityAnalysis:"There is no observer for visibility analysis.",NoWaterHeaterForAnalysis:"There is no water heater for analysis.",NoParabolicDishForAnalysis:"There is no parabolic dish for analysis.",NoParabolicTroughForAnalysis:"There is no parabolic trough for analysis.",NoFresnelReflectorForAnalysis:"There is no Fresnel reflector for analysis.",NoHeliostatForAnalysis:"There is no heliostat for analysis.",NoSolarUpdraftTowerForAnalysis:"There is no solar updraft tower for analysis.",NoBuildingForAnalysis:"There is no building for analysis."},toolbar:{CloudFile:"Cloud file",Select:"Select",AddFoundation:"Add foundation",AddWall:"Add wall",AddWindow:"Add window",AddDoor:"Add door",AddPyramidRoof:"Add pyramid roof",AddGableRoof:"Add gable roof",AddHipRoof:"Add hip roof",AddGambrelRoof:"Add gambrel roof",AddMansardRoof:"Add Mansard roof",AddCuboid:"Add cuboid",AddSensor:"Add sensor",AddSolarPanel:"Add solar panel",AddWaterHeater:"Add water heater",AddParabolicDish:"Add parabolic dish",AddParabolicTrough:"Add parabolic trough",AddFresnelReflector:"Add Fresnel reflector",AddHeliostat:"Add heliostat",AddWindTurbine:"Add wind turbine",AddLight:"Add light",AddTree:"Add tree",AddFlower:"Add flower",AddPeople:"Add people",DoubleClickToLockThisModeForNextAction:"Double-click to lock this mode for next action",ClickToUnlockThisModeForNextAction:"Click to unlock this mode for next action",ManipulateGroup:"Manipulate a group",ClearScene:"Clear scene",ShowSunAndTimeSettings:"Show sun and time settings",SpatialAnalysisOfEnergy:"Spatial analysis of energy",DoYouReallyWantToClearContent:"Do you really want to clear the content",ClickForMoreButtons:"Click for more buttons",SwitchToAddingFoundation:"Switch to Adding Foundation",SwitchToAddingCuboid:"Switch to Adding Cuboid",SwitchToAddingWall:"Switch to Adding Wall",SwitchToAddingWindow:"Switch to Adding Window",SwitchToAddingDoor:"Switch to Adding Door",SwitchToAddingPyramidRoof:"Switch to Adding Pyramid Roof",SwitchToAddingGableRoof:"Switch to Adding Gable Roof",SwitchToAddingHipRoof:"Switch to Adding Hip Roof",SwitchToAddingGambrelRoof:"Switch to Adding Gambrel Roof",SwitchToAddingMansardRoof:"Switch to Adding Mansard Roof",SwitchToAddingSolarPanel:"Switch to Adding Solar Panel",SwitchToAddingSensor:"Switch to Adding Sensor",SwitchToAddingWaterHeater:"Switch to Adding Water Heater",SwitchToAddingParabolicDish:"Switch to Adding Parabolic Dish",SwitchToAddingParabolicTrough:"Switch to Adding Parabolic Trough",SwitchToAddingFresnelReflector:"Switch to Adding Fresnel Reflector",SwitchToAddingHeliostat:"Switch to Adding Heliostat",SwitchToAddingWindTurbine:"Switch to Adding Wind Turbine",SwitchToAddingLight:"Switch to Adding Light",SwitchToAddingTree:"Switch to Adding Tree",SwitchToAddingFlower:"Switch to Adding Flower",SwitchToAddingPeople:"Switch to Adding People"},tooltip:{gotoIFI:"Go to Institute for Future Intelligence",visitAladdinHomePage:"Visit Aladdin Homepage",clickToOpenMenu:"Click to open main menu",clickToAccessAccountSettings:"Click to access account settings"},tree:{Apple:"Apple",Birch:"Birch",Coconut:"Coconut",Dogwood:"Dogwood",Elm:"Elm",FanPalm:"Fan Palm",Linden:"Linden",Magnolia:"Magnolia",Maple:"Maple",Oak:"Oak",Pine:"Pine",Spruce:"Spruce"},flower:{Bellflower:"Bellflower",Boxwood:"Boxwood",CactusCombo1:"Cactus Combo 1",CactusCombo2:"Cactus Combo 2",CactusCombo3:"Cactus Combo 3",CactusCombo4:"Cactus Combo 4",Hibiscus:"Hibiscus",Hosta:"Hosta",Hydrangea:"Hydrangea",Peony:"Peony",RedRose:"Red Rose",Spirea:"Spirea",Sunflower:"Sunflower",TallBush:"Tall Bush",Tulip:"Tulip",WhiteFlower:"White Flower",YellowFlower:"Yellow Flower"},people:{Jaah:"Jaah",Jack:"Jack",Jacob:"Jacob",Jacqueline:"Jacqueline",Jade:"Jade",Jamelia:"Jamelia",James:"James",Jane:"Jane",Jaya:"Jaya",Jaye:"Jaye",Jeanette:"Jeanette",Jedi:"Jedi",Jeff:"Jeff",Jena:"Jena",Jennifer:"Jennifer",Jess:"Jess",Jett:"Jett",Jill:"Jill",Jiya:"Jiya",Joan:"Joan",Jocelyn:"Jocelyn",Joel:"Joel",Joey:"Joey",John:"John",Jonathon:"Jonathon",Jose:"Jose",Joseph:"Joseph",Joshua:"Joshua",Judd:"Judd",Judy:"Judy",Julia:"Julia",Julio:"Julio",Jumapili:"Jumapili",June:"June",Juro:"Juro",Justin:"Justin"},compass:{N:"N",S:"S",W:"W",E:"E"},month:{January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"},modelsMap:{SearchByPublisher:"Search by publisher",SearchByLabel:"Search by label",MyPublishedModels:"My Published Models",TotalNumberOfUserPublishedModels:"Total number of user-published models",SortFromOldestToNewest:"Sort from oldest to newest",SortFromNewestToOldest:"Sort from newest to oldest",ModelsFoundOnThisSite:"models found on this site",ShowModelsPublishedByThisAuthor:"Show the models published by this author"}}},zh_cn:{translation:{name:{IFI:"\u672a\u6765\u667a\u80fd\u7814\u7a76\u6240",Aladdin:"\u963f\u62c9\u4e01",Tagline:"\u963f\u62c9\u4e01: \u63a2\u7d22\u4eba\u5de5\u667a\u80fd\u65f6\u4ee3\u7684\u8bbe\u8ba1\u8f6f\u4ef6 \u2014 \u672a\u6765\u667a\u80fd\u7814\u7a76\u6240\u7814\u53d1"},cookie:{Statement:"\u58f0\u660e\uff1a\u4e3a\u4e86\u6539\u5584\u60a8\u7684\u7528\u6237\u4f53\u9a8c\uff0c\u963f\u62c9\u4e01\u91c7\u7528cookie\u50a8\u5b58\u5c11\u91cf\u6570\u636e\u3002",Accept:"\u540c\u610f"},aboutUs:{ProductBroughtToYouBy:"\u672a\u6765\u667a\u80fd\u7814\u7a76\u6240\u8363\u8a89\u51fa\u54c1",TermsOfService:"\u670d\u52a1\u6761\u6b3e",PrivacyPolicy:"\u9690\u79c1\u653f\u7b56",Software:"\u8f6f\u4ef6",Content:"\u8bfe\u4ef6",Research:"\u7814\u7a76",Support:"\u670d\u52a1",Acknowledgment:"\u9e23\u8c22",FundingInformation:"\u672c\u4ea7\u54c1\u7684\u7814\u53d1\u627f\u8499\u7f8e\u56fd\u56fd\u5bb6\u79d1\u5b66\u57fa\u91d1\u4f1a\u6177\u6168\u8d44\u52a9\uff08\u9879\u76ee\u53f7#2105695\uff0c#2131097\uff0c#2301164\uff09\u3002\u672c\u4ea7\u54c1\u7684\u4efb\u4f55\u89c2\u70b9\u6216\u7ed3\u8bba\u4ec5\u4ee3\u8868\u521b\u4f5c\u8005\u4e2a\u4eba\u610f\u89c1\u3002",Contact:"\u5982\u60a8\u9700\u8981\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u8054\u7cfb Charles Xie (charles@intofuture.org)\u3002\u6211\u4eec\u4f1a\u5c3d\u5feb\u56de\u590d\u3002",Translators:"\u7ffb\u8bd1"},word:{LastUpdate:"\u4e0a\u4e00\u6b21\u66f4\u65b0",Small:"\u5c0f",Medium:"\u4e2d",Large:"\u5927",Design:"\u8bbe\u8ba1",Information:"\u4fe1\u606f",Type:"\u7c7b\u522b",Text:"\u6587\u5b57",FontSize:"\u5b57\u4f53\u5927\u5c0f",FontColor:"\u5b57\u4f53\u989c\u8272",Model:"\u6a21\u578b",Models:"\u6a21\u578b",Upload:"\u4e0a\u4f20",ClickCount:"\u70b9\u51fb\u6570",Share:"\u5206\u4eab",AlreadyLike:"\u5df2\u70b9\u8d5e",Like:"\u70b9\u8d5e",MustLogInToLike:"\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u70b9\u8d5e",AllRightsReserved:"\u7248\u6743\u6240\u6709",MeterAbbreviation:"\u7c73",Version:"\u7248\u672c",VersionInitial:"\u7248\u672c",Options:"\u9009\u9879",Maximum:"\u6700\u5927",Minimum:"\u6700\u5c0f",MaximumNumber:"\u6700\u591a",MinimumNumber:"\u6700\u5c11",MaximumValue:"\u6700\u5927\u503c",MinimumValue:"\u6700\u5c0f\u503c",Or:"\u6216",None:"\u65e0",High:"\u9ad8",Partial:"\u90e8\u5206",Teacher:"\u8001\u5e08",Class:"\u73ed\u7ea7",Total:"\u603b\u6570",Leaderboard:"\u7528\u6236\u6392\u884c\u699c",Latest:"\u6700\u65b0",Range:"\u8303\u56f4",SIUnit:"\u56fd\u9645\u5355\u4f4d\u5236",USUnit:"\u7f8e\u56fd\u5355\u4f4d\u5236",ThermalTransmittance:"\u70ed\u900f\u8fc7\u7387",ThermalResistance:"\u70ed\u963b",UValue:"U\u503c",RValue:"R\u503c",VolumetricHeatCapacity:"\u5bb9\u79ef\u70ed\u5bb9",BuildingHVACSystem:"\u5efa\u7b51\u7269\u6696\u901a\u7a7a\u8c03\u7cfb\u7edf",ThermostatSetpoint:"\u6052\u6e29\u5668\u8bbe\u5b9a\u503c",TemperatureToleranceThreshold:"\u6e29\u5ea6\u5fcd\u8010\u9608\u503c",TemperatureToleranceThresholdExplanation:"\u5f53\u65e5\u6700\u4f4e\u5916\u9762\u6e29\u5ea6\u9ad8\u4e8e\u6052\u6e29\u5668\u8bbe\u5b9a\u503c\u51cf\u53bb\u6b64\u9608\u503c\uff0c\u6696\u6c14\u4e0d\u5f00\u3002\n\u5f53\u65e5\u6700\u9ad8\u5916\u9762\u6e29\u5ea6\u4f4e\u4e8e\u6052\u6e29\u5668\u8bbe\u5b9a\u503c\u52a0\u4e0a\u6b64\u9608\u503c\uff0c\u7a7a\u8c03\u4e0d\u5f00\u3002",Press:"\u6309",Open:"\u6253\u5f00",Save:"\u4fdd\u5b58",SaveAsImage:"\u4fdd\u5b58\u4e3a\u56fe\u50cf",SaveAsCsv:"\u4fdd\u5b58\u4e3aCSV",Update:"\u5237\u65b0",Paste:"\u7c98\u8d34",Copy:"\u590d\u5236",Cut:"\u526a\u5207",Delete:"\u5220\u9664",Lock:"\u56fa\u5b9a",Translucent:"\u534a\u900f\u660e",Color:"\u989c\u8272",Texture:"\u6750\u8d28",Thickness:"\u539a\u5ea6",Size:"\u5c3a\u5bf8",Yes:"\u662f",No:"\u4e0d",OK:"\u786e\u5b9a",Cancel:"\u53d6\u6d88",Apply:"\u5e94\u7528",Close:"\u5173\u95ed",ApplyTo:"\u9002\u7528\u4e8e",Run:"\u8fd0\u884c",Pause:"\u6682\u505c",Resume:"\u7ee7\u7eed",Clear:"\u6e05\u7a7a",Warning:"\u8b66\u544a",Caution:"\u5c0f\u5fc3",Reminder:"\u63d0\u9192",Length:"\u957f\u5ea6",Width:"\u5bbd\u5ea6",Height:"\u9ad8\u5ea6",Radius:"\u534a\u5f84",Angle:"\u89d2\u5ea6",Azimuth:"\u65b9\u4f4d\u89d2",Coordinates:"\u5750\u6807",Weather:"\u5929\u6c14",Show:"\u663e\u793a",Animate:"\u52a8\u753b",Date:"\u65e5\u671f",Time:"\u65f6\u95f4",Title:"\u6807\u9898",Owner:"\u6240\u6709\u8005",Action:"\u64cd\u4f5c",Rename:"\u6539\u540d",Location:"\u4f4d\u7f6e",Latitude:"\u7eac\u5ea6",Month:"\u6708\u4efd",Day:"\u5929",Hour:"\u5c0f\u65f6",Daylight:"\u767d\u5929\u957f\u5ea6",Radiation:"\u8f90\u5c04",Temperature:"\u6e29\u5ea6",kWh:"\u5343\u74e6\u65f6",dollar:"\u5143",MeterPerSecond:"\u7c73/\u79d2",NorthInitial:"\u5317",SouthInitial:"\u5357",EastInitial:"\u4e1c",WestInitial:"\u897f",Fixed:"\u56fa\u5b9a",Elements:"\u90e8\u4ef6",Energy:"\u80fd\u91cf",Unknown:"\u672a\u77e5",Label:"\u6807\u7b7e",Description:"\u63cf\u8ff0",NoDescription:"\u65e0\u63cf\u8ff0",MaximumCharacters:"\u6700\u591a\u5b57\u7b26\u6570",Author:"\u4f5c\u8005",Publisher:"\u53d1\u5e03\u8005",Building:"\u5efa\u7b51",ResidentialBuilding:"\u4f4f\u5b85\u5efa\u7b51",CommercialBuilding:"\u5546\u7528\u5efa\u7b51",SchoolBuilding:"\u5b66\u6821\u5efa\u7b51",TouristAttraction:"\u65c5\u6e38\u666f\u70b9",UnderConstruction:"\u5728\u5efa",Photovoltaic:"\u5149\u4f0f",Anonymous:"\u65e0\u540d\u6c0f",Nickname:"\u522b\u540d",Pin:"\u7f6e\u9876",Unpin:"\u89e3\u9664\u7f6e\u9876"},shared:{NoTexture:"\u65e0\u6750\u8d28",FoundationElement:"\u5730\u57fa",CuboidElement:"\u957f\u65b9\u4f53",PolygonElement:"\u591a\u8fb9\u5f62",SensorElement:"\u4f20\u611f\u5668",SolarPanelElement:"\u5149\u4f0f\u677f",WaterHeaterElement:"\u592a\u9633\u80fd\u70ed\u6c34\u5668",ParabolicDishElement:"\u629b\u7269\u7ebf\u789f",ParabolicTroughElement:"\u629b\u7269\u7ebf\u69fd",FresnelReflectorElement:"\u83f2\u6d85\u8033\u53cd\u5c04\u955c",HeliostatElement:"\u5b9a\u65e5\u955c",WindTurbineElement:"\u98ce\u529b\u6da1\u8f6e\u673a",LightElement:"\u7535\u706f",ElementLocked:"\u56fa\u5b9a",ModelType:"\u6a21\u578b\u7c7b\u522b",OutputBreakdown:"\u5206\u5217\u53d1\u7535\u91cf",MoreResults:"\u66f4\u591a\u7ed3\u679c"},message:{ModelNotFound:"\u6ca1\u6709\u627e\u5230\u6a21\u578b",CannotSignIn:"\u767b\u5f55\u5931\u8d25",CannotSignOut:"\u9000\u51fa\u5931\u8d25",YourAccountWasCreated:"\u6210\u529f\u5efa\u7acb\u60a8\u7684\u8d26\u53f7\u3002",CannotCreateAccount:"\u65e0\u6cd5\u521b\u5efa\u8d26\u53f7",YourAccountSettingsWereSaved:"\u60a8\u7684\u8d26\u53f7\u8bbe\u5b9a\u5df2\u4fdd\u5b58\u3002",CannotSaveYourAccountSettings:"\u60a8\u7684\u8d26\u53f7\u8bbe\u5b9a\u65e0\u6cd5\u4fdd\u5b58",CannotSaveYourFileToCloud:"\u65e0\u6cd5\u4fdd\u5b58\u60a8\u7684\u6587\u4ef6\u5230\u4e91\u7aef",CannotCreateNewProject:"\u65e0\u6cd5\u521b\u5efa\u65b0\u9879\u76ee",CannotCreateNewProjectWithoutTitle:"\u6ca1\u6709\u6807\u9898, \u65e0\u6cd5\u521b\u5efa\u65b0\u9879\u76ee",CannotOpenYourProjects:"\u65e0\u6cd5\u6253\u5f00\u60a8\u7684\u9879\u76ee\u5217\u8868",CannotOpenProject:"\u65e0\u6cd5\u6253\u5f00\u9879\u76ee",CannotDeleteProject:"\u65e0\u6cd5\u5220\u9664\u9879\u76ee",CannotRenameProject:"\u65e0\u6cd5\u7ed9\u9879\u76ee\u6539\u540d",CannotAddDesignToProject:"\u65e0\u6cd5\u628a\u6b64\u8bbe\u8ba1\u52a0\u5230\u9879\u76ee\u91cc",CannotAddDesignToProjectOwnedByOthers:"\u4e0d\u80fd\u628a\u6b64\u8bbe\u8ba1\u52a0\u5230\u522b\u4eba\u7684\u9879\u76ee\u91cc",DesignRemovedFromProject:"\u8bbe\u8ba1\u88ab\u6210\u529f\u5730\u4ece\u9879\u76ee\u91cc\u5220\u9664",CannotRemoveDesignFromProject:"\u65e0\u6cd5\u628a\u6b64\u8bbe\u8ba1\u4ece\u9879\u76ee\u91cc\u5220\u9664",CannotUpdateProject:"\u65e0\u6cd5\u66f4\u65b0\u9879\u76ee",CannotFetchProjectData:"\u65e0\u6cd5\u53d6\u5f97\u9879\u76ee\u6570\u636e",TitleUsedChooseDifferentOne:"\u6b64\u6807\u9898\u5df2\u7ecf\u88ab\u4f7f\u7528, \u8bf7\u91c7\u7528\u4e0d\u540c\u7684\u6807\u9898",CloudFileWithTitleExistsDoYouWantToOverwrite:"\u4f7f\u7528\u6b64\u6807\u9898\u7684\u4e91\u6587\u4ef6\u5df2\u7ecf\u5b58\u5728\uff0c\u60a8\u786e\u5b9a\u8981\u8986\u76d6\u5b83\u5417\uff1f",CloudFileNotFound:"\u627e\u4e0d\u5230\u6b64\u4e91\u7aef\u6587\u4ef6",CannotLoadModelsOnMap:"\u65e0\u6cd5\u4e0b\u8f7d\u5730\u56fe\u4e0a\u7684\u6a21\u578b",CannotLoadLeaderboard:"\u65e0\u6cd5\u4e0b\u8f7d\u6392\u884c\u699c",CannotPublishModelOnMap:"\u6a21\u578b\u65e0\u6cd5\u53d1\u5e03\u5230\u5730\u56fe\u4e0a",CannotLikeModelFromMap:"\u65e0\u6cd5\u70b9\u8d5e\u5730\u56fe\u4e0a\u7684\u6a21\u578b",CannotDeleteModelFromMap:"\u65e0\u6cd5\u5220\u9664\u5730\u56fe\u4e0a\u7684\u6a21\u578b",ModelDeletedFromMap:"\u6a21\u578b\u5df2\u4ece\u5730\u56fe\u4e0a\u5220\u9664",DoYouWantToDeleteModelFromMap:"\u60a8\u8981\u5220\u9664\u5730\u56fe\u4e0a\u7684\u8fd9\u4e2a\u6a21\u578b\u5417\uff1f",CannotOpenCloudFile:"\u6b64\u4e91\u7aef\u6587\u4ef6\u65e0\u6cd5\u6253\u5f00",CannotReadCloudFile:"\u65e0\u6cd5\u8bfb\u53d6\u6b64\u4e91\u7aef\u6587\u4ef6",CannotWriteCloudFile:"\u65e0\u6cd5\u5b58\u50a8\u6b64\u4e91\u7aef\u6587\u4ef6",CloudFileCopied:"\u62f7\u8d1d\u4e91\u7aef\u6587\u4ef6",CannotOpenCloudFolder:"\u60a8\u7684\u4e91\u7aef\u6587\u4ef6\u5939\u65e0\u6cd5\u6253\u5f00",CannotDeleteCloudFile:"\u65e0\u6cd5\u5220\u9664\u6b64\u4e91\u7aef\u6587\u4ef6",CannotRenameCloudFile:"\u6b64\u4e91\u7aef\u6587\u4ef6\u7684\u540d\u5b57\u65e0\u6cd5\u66f4\u6539",DoYouWantToSaveChanges:"\u60a8\u8981\u4fdd\u5b58\u5f53\u524d\u6587\u4ef6\u5417\uff1f",NotApplicableToSelectedAction:"\u6b64\u503c\u4e0d\u9002\u7528\u4e8e\u5f53\u524d\u9009\u62e9\u8303\u56f4",ThisElementIsLocked:"\u8fd9\u4e2a\u90e8\u4ef6\u88ab\u9501\u5b9a\u3002",ThisCannotBeUndone:"\u8fd9\u4e2a\u64cd\u4f5c\u4e00\u65e6\u6267\u884c\u5c31\u4e0d\u80fd\u64a4\u9500\u3002",AzimuthOfNorthIsZero:"\u6b63\u5317\u7684\u65b9\u4f4d\u89d2\u4e3a\u96f6\u5ea6",CounterclockwiseAzimuthIsPositive:"\u9006\u65f6\u9488\u4e3a\u6b63",MoveCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u53e0\uff0c\u79fb\u52a8\u53d6\u6d88\u3002",MoveOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u79fb\u52a8\u53d6\u6d88\u3002",RotationCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u53e0\uff0c\u65cb\u8f6c\u53d6\u6d88\u3002",RotationOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u65cb\u8f6c\u53d6\u6d88\u3002",ResizingCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u53e0\uff0c\u5c3a\u5bf8\u8c03\u6574\u53d6\u6d88\u3002",ResizingOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u5c3a\u5bf8\u8c03\u6574\u53d6\u6d88\u3002",CannotPasteOutsideBoundary:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u4e0d\u80fd\u590d\u5236\u3002",CannotPasteBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u53e0\uff0c\u4e0d\u80fd\u590d\u5236\u3002",CannotMoveObjectTooFar:"\u4f4d\u7f6e\u592a\u8fdc\uff0c\u79fb\u52a8\u53d6\u6d88\u3002",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"\u91c7\u7528\u65b0\u5e03\u5c40\u4e4b\u524d\u5fc5\u987b\u79fb\u9664\u73b0\u6709\u7684\u5149\u4f0f\u677f\u3002",DoYouWantToContinue:"\u60a8\u60f3\u7ee7\u7eed\u5417\uff1f",SolarPanelsCannotIntersectWithGround:"\u5149\u4f0f\u677f\u4e0d\u80fd\u548c\u5730\u9762\u63a5\u89e6\u3002",SolarPanelsCannotOverlapWithOneAnother:"\u5149\u4f0f\u677f\u4e0d\u80fd\u91cd\u53e0\u3002",ScreenshotSaved:"\u622a\u5c4f\u56fe\u7247\u4fdd\u5b58\u5728\u4e0b\u8f7d\u6587\u4ef6\u5939\u91cc\u3002",CsvFileSaved:"CSV\u4fdd\u5b58\u5728\u4e0b\u8f7d\u6587\u4ef6\u5939\u91cc\u3002",SimulationStarted:"\u6a21\u62df\u5f00\u59cb\u3002",SimulationCompleted:"\u6a21\u62df\u7ed3\u675f\u3002",SimulationAborted:"\u6a21\u62df\u53d6\u6d88\u3002",SimulationPaused:"\u6a21\u62df\u6682\u505c\u3002",CancelSimulation:"\u53d6\u6d88\u6a21\u62df",PauseSimulation:"\u6682\u505c\u6a21\u62df",ResumeSimulation:"\u7ee7\u7eed\u6a21\u62df",SimulationWillNotStartDueToErrors:"\u7531\u4e8e\u9519\u8bef\u6a21\u62df\u65e0\u6cd5\u8fd0\u884c",SimulationWillStartDespiteWarnings:"\u53d1\u73b0\u95ee\u9898\uff0c\u4f46\u6a21\u62df\u4ecd\u7136\u5c06\u8fd0\u884c\u3002",EvolutionStarted:"\u6f14\u5316\u5f00\u59cb\u3002",EvolutionCompleted:"\u6f14\u5316\u7ed3\u675f\u3002",EvolutionAborted:"\u6f14\u5316\u53d6\u6d88\u3002",EvolutionPaused:"\u6f14\u5316\u6682\u505c\u3002",EncounterEvolutionError:"\u6f14\u5316\u51fa\u9519\u3002",CancelEvolution:"\u53d6\u6d88\u6f14\u5316",PauseEvolution:"\u6682\u505c\u6f14\u5316",ResumeEvolution:"\u7ee7\u7eed\u6f14\u5316",ConvergenceThresholdHasBeenReached:"\u6536\u655b\u9608\u503c\u5df2\u8fbe\u5230\u3002",MaximumNumberOfGenerationsHasBeenReached:"\u6700\u5927\u4e16\u4ee3\u6570\u5df2\u8fbe\u5230\u3002",MaximumNumberOfStepsHasBeenReached:"\u6700\u5927\u6b65\u6570\u5df2\u8fbe\u5230\u3002",ObjectiveFunctionTypeError:"\u6b64\u64cd\u4f5c\u4e0d\u652f\u6301\u5f53\u524d\u7684\u76ee\u6807\u51fd\u6570\u3002\u8bf7\u4ece\u83dc\u5355\u542f\u52a8\u6b64\u529f\u80fd\u3002",WallsAreNotAtSameHeight:"\u5899\u4f53\u9ad8\u5ea6\u4e0d\u540c\u3002",WallsAreNotPerpendicular:"\u5899\u4f53\u4e0d\u5782\u76f4\u3002",WallsAreNotConnected:"\u5899\u4f53\u4e0d\u76f8\u8fde\u3002",WallsNumberNeedToBeFour:"\u5899\u4f53\u6570\u91cf\u5fc5\u987b\u4e3a\u56db\u4e2a\u3002",BuildingContainsEmptyWall:"\u5efa\u7b51\u7269\u6709\u7a7a\u5899\u3002",BuildingRoofMissing:"\u5efa\u7b51\u7269\u6ca1\u6709\u5c4b\u9876\u3002",UnknownErrors:"\u672a\u77e5\u9519\u8bef\u3002"},menu:{AnalysisOptions:"\u5206\u6790\u9009\u9879",option:{GridCellSize:"\u8ba1\u7b97\u7f51\u683c\u7684\u5c3a\u5bf8",SamplingFrequency:"\u91c7\u6837\u9891\u7387",TimesPerHour:"\u6bcf\u5c0f\u65f6\u91c7\u6837\u6b21\u6570",DaysPerYear:"\u6bcf\u4e00\u5e74\u91c7\u6837\u5929\u6570"},mainMenu:"\u4e3b\u83dc\u5355",cloudMenu:"\u4e91\u83dc\u5355",projectSubMenu:"\u9879\u76ee",project:{CreateNewProject:"\u521b\u5efa\u65b0\u9879\u76ee",OpenProject:"\u6253\u5f00\u9879\u76ee",SaveProjectAs:"\u53e6\u5b58\u9879\u76ee\u4e3a",YouMustLogInToCreateProject:"\u60a8\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u521b\u5efa\u9879\u76ee",YouMustLogInToOpenProject:"\u60a8\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u6253\u5f00\u9879\u76ee"},fileSubMenu:"\u6587\u4ef6",file:{CreateNewFile:"\u521b\u5efa\u65b0\u6587\u4ef6",OpenLocalFile:"\u6253\u5f00\u672c\u5730\u6587\u4ef6",SaveAsLocalFile:"\u4fdd\u5b58\u4e3a\u672c\u5730\u6587\u4ef6",SavingAbortedMustHaveValidFileName:"\u6587\u4ef6\u540d\u65e0\u6548\uff0c\u4fdd\u5b58\u5931\u8d25",OpenCloudFile:"\u6253\u5f00\u4e91\u7aef\u6587\u4ef6",SaveCloudFile:"\u4fdd\u5b58\u4e91\u7aef\u6587\u4ef6",SaveAsCloudFile:"\u4fdd\u5b58\u4e3a\u4e91\u7aef\u6587\u4ef6",SavingAbortedMustHaveValidTitle:"\u4e91\u7aef\u6587\u4ef6\u540d\u65e0\u6548\uff0c\u4fdd\u5b58\u5931\u8d25",ToSaveYourWorkPleaseSignIn:"\u4e3a\u4e86\u4fdd\u5b58\u60a8\u7684\u4e91\u7aef\u6587\u4ef6\uff0c\u8bf7\u60a8\u5148\u767b\u5f55\u3002",TakeScreenshot:"\u622a\u5c4f",UseCloudFileName:"\u91c7\u7528\u4e91\u7aef\u6587\u4ef6\u540d",PublishOnModelsMap:"\u53d1\u5e03\u5230\u5730\u56fe\u4e0a",PublishedOnModelsMap:"\u60a8\u7684\u6a21\u578b\u6210\u529f\u53d1\u5e03\u5230\u5730\u56fe\u4e0a",UpdatedOnModelsMap:"\u60a8\u7684\u6a21\u578b\u66f4\u65b0\u6210\u529f",YouMustLogInToPublishYourModel:"\u60a8\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u53d1\u5e03\u6a21\u578b",YouCannotPublishAModelThatYouDoNotOwn:"\u60a8\u4e0d\u80fd\u53d1\u5e03\u4ed6\u4eba\u7684\u6a21\u578b",YouMustSaveModelOnCloudBeforePublishingIt:"\u60a8\u5fc5\u987b\u5148\u628a\u6b64\u6a21\u578b\u4fdd\u5b58\u5728\u4e91\u7aef\u624d\u80fd\u53d1\u5e03\u5b83"},editSubMenu:"\u7f16\u8f91",edit:{Undo:"\u64a4\u9500",Redo:"\u91cd\u505a"},viewSubMenu:"\u89c6\u754c",view:{NavigationView:"\u5bfc\u822a\u6a21\u5f0f",TwoDimensionalView:"\u4e8c\u7ef4\u6a21\u5f0f",ResetView:"\u91cd\u7f6e\u89c6\u89d2",ZoomIn:"\u653e\u5927",ZoomOut:"\u7f29\u5c0f",AutoRotate:"\u81ea\u52a8\u65cb\u8f6c",ShowShadow:"\u663e\u793a\u9634\u5f71",ShowSurfaceShininess:"\u663e\u793a\u8868\u9762\u5149\u6cfd",TranslucentFloatingWindows:"\u900f\u660e\u6d6e\u52a8\u7a97\u53e3",accessoriesSubMenu:"\u914d\u4ef6",accessories:{SiteInformation:"\u4f4d\u7f6e\u4fe1\u606f",DesignInformation:"\u8bbe\u8ba1\u4fe1\u606f",Instruction:"\u64cd\u4f5c\u8bf4\u660e",StickyNote:"\u4fbf\u7b7e",Note:"\u4fbf\u7b7e"}},settingsSubMenu:"\u8bbe\u7f6e",settings:{WeatherData:"\u6c14\u8c61\u6570\u636e",DiurnalTemperature:"\u663c\u591c\u6e29\u5ea6",Heliodon:"\u65e5\u5f71\u4eea",SunAndTime:"\u592a\u9633\u548c\u65f6\u95f4"},benchmarksSubMenu:"\u57fa\u51c6",benchmarks:{SolarRadiationPredictionVsMeasurement:"\u592a\u9633\u80fd\u8f90\u5c04\u6a21\u578b\u9884\u6d4b\u548c\u5b9e\u9645\u6d4b\u91cf\u7684\u5bf9\u6bd4",BESTESTCase600:"\u5efa\u7b51\u7269\u80fd\u8017\u6a21\u62df\u6d4b\u8bd5\uff1aBESTEST\u6848\u4f8b600",BESTESTCase610:"\u5efa\u7b51\u7269\u80fd\u8017\u6a21\u62df\u6d4b\u8bd5\uff1aBESTEST\u6848\u4f8b610",BESTESTCase620:"\u5efa\u7b51\u7269\u80fd\u8017\u6a21\u62df\u6d4b\u8bd5\uff1aBESTEST\u6848\u4f8b620",BESTESTCase630:"\u5efa\u7b51\u7269\u80fd\u8017\u6a21\u62df\u6d4b\u8bd5\uff1aBESTEST\u6848\u4f8b630"},graph:{LineWidth:"\u7ebf\u6761\u5bbd\u5ea6",SymbolSize:"\u7b26\u53f7\u5927\u5c0f",BarCategoryGap:"\u76f4\u6761\u95f4\u9699",ShowHorizontalGridLines:"\u663e\u793a\u683c\u5b50\u7684\u6c34\u5e73\u7ebf\u6761",ShowVerticalGridLines:"\u663e\u793a\u683c\u5b50\u7684\u7ad6\u76f4\u7ebf\u6761"},analysisSubMenu:"\u5206\u6790",physicsSubMenu:"\u7269\u7406",physics:{DailySolarRadiationHeatmap:"\u5f53\u65e5\u592a\u9633\u8f90\u5c04\u603b\u91cf\u5206\u5e03\u70ed\u56fe",SolarRadiationHeatmapOptions:"\u592a\u9633\u8f90\u5c04\u70ed\u56fe\u9009\u9879",SolarRadiationHeatmapGridCellSize:"\u592a\u9633\u8f90\u5c04\u70ed\u56fe\u7f51\u683c\u7684\u5c3a\u5bf8",SolarRadiationHeatmapMaxValue:"\u592a\u9633\u8f90\u5c04\u70ed\u56fe\u6700\u5927\u503c",SolarRadiationHeatmapNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b",ReflectionHeatmap:"\u53cd\u5c04\u70ed\u56fe"},sensorSubMenu:"\u4f20\u611f\u5668",sensor:{CollectDailyData:"\u6536\u96c6\u5f53\u5929\u6570\u636e",CollectYearlyData:"\u6536\u96c6\u5168\u5e74\u6570\u636e",SensorSimulationNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b"},buildingSubMenu:"\u5efa\u7b51\u7269",building:{AnalyzeDailyBuildingEnergy:"\u5efa\u7b51\u7269\u5f53\u5929\u80fd\u8017\u5206\u6790",AnalyzeYearlyBuildingEnergy:"\u5efa\u7b51\u7269\u5168\u5e74\u80fd\u8017\u5206\u6790",EnergyAnalysisOptions:"\u80fd\u8017\u5206\u6790\u9009\u9879",EnergyGridCellSize:"\u8ba1\u7b97\u7f51\u683c\u7684\u5c3a\u5bf8",BuildingEnergySimulationNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b"},solarPanelSubMenu:"\u592a\u9633\u80fd\u5149\u4f0f\u677f",solarPanel:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa",AnalyzeVisibility:"\u5206\u6790\u53ef\u89c1\u5ea6",PanelDiscretization:"\u5149\u4f0f\u677f\u79bb\u6563\u5316\u65b9\u6cd5",Exact:"\u51c6\u786e",Approximate:"\u8fd1\u4f3c",EnergyGridCellSize:"\u8ba1\u7b97\u7f51\u683c\u7684\u5c3a\u5bf8",VisibilityGridCellSize:"\u89c6\u754c\u56e0\u5b50\u8ba1\u7b97\u7f51\u683c\u7684\u5c3a\u5bf8",EnergyAnalysisOptions:"\u80fd\u91cf\u5206\u6790\u9009\u9879",VisibilityAnalysisOptions:"\u53ef\u89c1\u5ea6\u5206\u6790\u9009\u9879",SolarPanelSimulationNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b"},parabolicTroughSubMenu:"\u629b\u7269\u7ebf\u69fd",parabolicTrough:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa"},parabolicDishSubMenu:"\u629b\u7269\u7ebf\u789f",parabolicDish:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa"},fresnelReflectorSubMenu:"\u83f2\u6d85\u5c14\u53cd\u5c04\u955c",fresnelReflector:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa"},heliostatSubMenu:"\u5b9a\u65e5\u955c",heliostat:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa"},solarUpdraftTowerSubMenu:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854",solarUpdraftTower:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa",SolarUpdraftTowerSimulationNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b"},tutorialsSubMenu:"\u6559\u7a0b",solarEnergyScienceSubMenu:"\u592a\u9633\u80fd\u79d1\u5b66",solarEnergyScienceTutorials:{SunAngles:"\u592a\u9633\u76f8\u5bf9\u4e8e\u5730\u9762\u89c2\u5bdf\u8005\u7684\u89d2\u5ea6",InsolationAndClimate:"\u592a\u9633\u8f90\u5c04\u548c\u6c14\u5019\u7684\u5173\u7cfb",SolarRadiationToBox:"\u4e00\u4e2a\u957f\u65b9\u4f53\u53d7\u5230\u7684\u592a\u9633\u80fd\u8f90\u5c04\u5206\u6790"},buildingScienceSubMenu:"\u5efa\u7b51\u79d1\u5b66",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"\u623f\u5c4b\u7684\u70ed\u5b66\u5c01\u5957\u548c\u56f4\u62a4\u5c01\u5957",EffectOfSizeOnBuildingEnergy:"\u623f\u5c4b\u5927\u5c0f\u5bf9\u80fd\u8017\u7684\u5f71\u54cd",EffectOfOrientationOnBuildingEnergy:"\u623f\u5c4b\u65b9\u4f4d\u5bf9\u80fd\u8017\u7684\u5f71\u54cd",EffectOfInsulationOnBuildingEnergy:"\u623f\u5c4b\u9694\u70ed\u5bf9\u80fd\u8017\u7684\u5f71\u54cd",EffectOfRoofColorOnBuildingEnergy:"\u5c4b\u9876\u989c\u8272\u5bf9\u5efa\u7b51\u7269\u80fd\u8017\u7684\u5f71\u54cd",EffectOfEavesOverhangLengthOnBuildingEnergy:"\u5c4b\u6a90\u5ef6\u4f38\u957f\u5ea6\u5bf9\u5efa\u7b51\u7269\u80fd\u8017\u7684\u5f71\u54cd",EffectOfWindowSHGCOnBuildingEnergy:"\u7a97\u6237\u592a\u9633\u80fd\u8f93\u5165\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd",EffectOfThermostatSetpointOnBuildingEnergy:"\u6052\u6e29\u5668\u8bbe\u5b9a\u503c\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd",EffectOfSolarPanelsOnBuildingEnergy:"\u5149\u4f0f\u677f\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd",EffectOfGroundTemperatureOnBuildingEnergy:"\u5730\u8868\u6e29\u5ea6\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd",EffectOfTreesOnBuildingEnergy:"\u6811\u836b\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd"},buildingDesignSubMenu:"\u5efa\u7b51\u8bbe\u8ba1",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"\u6709\u68da\u9876\u7a97\u7684\u79d1\u5fb7\u89d2\u98ce\u683c\u7684\u4f4f\u5b85",MansardRoofWithDormers:"\u6709\u5929\u7a97\u7684\u6298\u7ebf\u5c4b\u9876",GableRoofVsHipRoof:"\u53cc\u5761\u5c4b\u9876\u548c\u56db\u5761\u5c4b\u9876\u7684\u5bf9\u6bd4",ColonialVsSaltbox:"\u6b96\u6c11\u5730\u98ce\u683c\u548c\u76d0\u76d2\u98ce\u683c\u7684\u5bf9\u6bd4",GambrelRoofVsMansardRoof:"\u590d\u659c\u5c4b\u9876\u548c\u6298\u7ebf\u5c4b\u9876\u7684\u5bf9\u6bd4",CombinationRoofVsBonnetRoof:"\u7ec4\u5408\u5c4b\u9876\u548c\u5e3d\u6a90\u5c4b\u9876\u7684\u5bf9\u6bd4",DutchGableRoof:"\u8377\u5170\u53cc\u5761\u5c4b\u9876",GableAndValleyRoof:"\u5761\u8c37\u5c4b\u9876",ClerestoryRoof:"\u5929\u7a97\u5c4b\u9876",MonitorRoof:"\u91c7\u5149\u5c4b\u9876",AFrameHouse:"A\u5b57\u5f62\u623f\u5b50",HalfTimberedHouse:"\u534a\u6728\u9aa8\u67b6\u623f\u5b50",AllBasicRoofTypes:"\u6240\u6709\u7684\u57fa\u672c\u5c4b\u9876\u7c7b\u578b"},photovoltaicSolarPowerSubMenu:"\u5149\u4f0f\u53d1\u7535",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"\u5149\u4f0f\u677f\u503e\u659c\u89d2\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",EffectOfAzimuthOfSolarPanel:"\u5149\u4f0f\u677f\u65b9\u4f4d\u89d2\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",SolarPanelTypes:"\u5149\u4f0f\u677f\u7c7b\u578b",VerticalBifacialSolarPanels:"\u7ad6\u76f4\u7684\u53cc\u9762\u5149\u4f0f\u677f",CompareMonofacialAndBifacialSolarPanels:"\u5355\u9762\u5149\u4f0f\u677f\u548c\u53cc\u9762\u5149\u4f0f\u677f\u7684\u5bf9\u6bd4",SolarTrackers:"\u81ea\u52a8\u8ffd\u65e5\u5668",CoveringGroundWithSolarPanels:"\u4e3a\u4ec0\u4e48\u6211\u4eec\u4e0d\u7b80\u5355\u5730\u7528\u5149\u4f0f\u677f\u8986\u76d6\u5730\u9762",InterRowSpacingOfSolarPanelArray:"\u5149\u4f0f\u677f\u9635\u5217\u884c\u95f4\u8ddd\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",EffectOfOrientationOfSolarPanels:"\u5149\u4f0f\u677f\u6392\u5217\u65b9\u5411\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",SolarPanelArrayAutomaticLayout:"\u5149\u4f0f\u677f\u81ea\u52a8\u6392\u5217"},concentratedSolarPowerSubMenu:"\u5149\u70ed\u53d1\u7535",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"\u629b\u7269\u7ebf\u69fd\u65b9\u4f4d\u89d2\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",EffectOfLatusRectumOfParabolicTrough:"\u629b\u7269\u7ebf\u69fd\u901a\u5f84\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",FocusSunlightWithParabolicDish:"\u7528\u629b\u7269\u7ebf\u789f\u805a\u7126\u967d\u5149",LinearFresnelReflectors:"\u7528\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u805a\u7126\u967d\u5149",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"\u5438\u70ed\u7ba1\u7684\u5b89\u88c5\u9ad8\u5ea6\u5bf9\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u53d1\u7535\u91cf\u7684\u5f71\u54cd",EffectOfAzimuthOfLinearFresnelReflectors:"\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u65b9\u4f4d\u89d2\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",LinearFresnelReflectorsWithTwoAbsorbers:"\u914d\u5907\u4e24\u4e2a\u5438\u6536\u7ba1\u7684\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u9635\u5217",CosineEfficiencyOfHeliostats:"\u5b9a\u65e5\u955c\u7684\u4f59\u5f26\u6548\u7387",ShadowingAndBlockingOfHeliostats:"\u5b9a\u65e5\u955c\u7684\u9634\u5f71\u548c\u906e\u6321",EffectSolarPowerTowerHeight:"\u5438\u6536\u5854\u9ad8\u5ea6\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",SolarPowerTower:"\u5854\u5f0f\u5149\u70ed\u53d1\u7535\u7ad9"},otherTypesOfSolarPowerSubMenu:"\u5176\u5b83\u7c7b\u578b\u7684\u592a\u9633\u80fd\u53d1\u7535",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854"},generativeDesignSubMenu:"\u751f\u6210\u5f0f\u8bbe\u8ba1",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"\u5355\u9762\u5149\u4f0f\u677f\u9635\u5217\u7684\u503e\u659c\u89d2",BifacialSolarPanelArrayTiltAngle:"\u53cc\u9762\u5149\u4f0f\u677f\u9635\u5217\u7684\u503e\u659c\u89d2",OutputOfSolarPanelArrayInDifferentPlaces:"\u4e00\u4e2a\u5149\u4f0f\u677f\u9635\u5217\u5728\u4e0d\u540c\u5730\u533a\u7684\u4ea7\u51fa",SimpleSolarFarmParetoFront:"\u7b80\u5355\u592a\u9633\u80fd\u519c\u573a\u8bbe\u8ba1\u7684\u5e15\u7d2f\u6258\u524d\u6cbf"},examplesSubMenu:"\u4f8b\u5b50",solarEnergySubMenu:"\u592a\u9633\u80fd",solarEnergyExamples:{SunBeamAndHeliodon:"\u592a\u9633\u5149\u675f\u548c\u65e5\u5f71\u4eea",RooftopSolarPanels:"\u5c4b\u9876\u5149\u4f0f\u677f",NevadaSolarOneParabolicTroughArray:"\u5185\u534e\u8fbe\u5dde\u592a\u9633\u80fd\u4e00\u53f7\u7684\u629b\u7269\u7ebf\u69fd\u9635\u5217",TooeleParabolicDishArray:"\u72b9\u4ed6\u5dde\u56fe\u57c3\u52d2\u7684\u629b\u7269\u7ebf\u789f\u9635\u5217",PS10SolarPowerTower:"\u897f\u73ed\u7259\u585e\u7ef4\u5229\u4e9a\u7684PS10\u592a\u9633\u80fd\u53d1\u7535\u5854",TucsonLinearFresnelReflectors:"\u4e9a\u5229\u6851\u90a3\u5dde\u56fe\u68ee\u7684\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u9635\u5217",SolarCanopyFormFactors:"\u592a\u9633\u80fd\u5929\u7bf7\u5916\u5f62\u8bbe\u8ba1",SolarCanopyOverBleachers:"\u770b\u53f0\u592a\u9633\u80fd\u5929\u7bf7",SolarCanopyOverGarage:"\u8f66\u5e93\u592a\u9633\u80fd\u5929\u7bf7",SolarBusStop:"\u592a\u9633\u80fd\u5019\u8f66\u4ead",SolarFacadeTesla:"\u7279\u65af\u62c9\u5149\u4f0f\u5899",BuildingIntegratedPhotovoltaics:"\u5efa\u7b51\u6574\u5408\u5149\u4f0f",Floatovoltaics:"\u6d6e\u52a8\u5149\u4f0f",Agrivoltaics:"\u519c\u4e1a\u5149\u4f0f",VegetativeBuffer:"\u592a\u9633\u80fd\u519c\u573a\u7eff\u5316\u5e26",RainbowSwashSolarFarmBostonMA:"\u9a6c\u8428\u8bf8\u585e\u5dde\u6ce2\u58eb\u987f\u5f69\u8679\u6fc0\u6d41\u65c1\u8fb9\u7684\u5149\u4f0f\u677f\u9635\u5217",MickeyMouseSolarFarmOrlandoFL:"\u4f5b\u7f57\u91cc\u8fbe\u5dde\u5965\u5170\u591a\u7684\u7c73\u8001\u9f20\u5f62\u72b6\u5149\u4f0f\u677f\u9635\u5217",SolarPanelsOverCanalBakersfieldCA:"\u52a0\u5229\u798f\u5c3c\u4e9a\u5dde\u8d1d\u514b\u65af\u83f2\u5c14\u5fb7\u704c\u6e89\u6e20\u4e0a\u5047\u60f3\u7684\u5149\u4f0f\u677f\u9635\u5217",SolarNoiseBarrierLexingtonMA:"\u9a6c\u8428\u8bf8\u585e\u5dde\u5217\u514b\u661f\u6566\u9ad8\u901f\u516c\u8def\u566a\u97f3\u5899\u4e0a\u5047\u60f3\u7684\u5149\u4f0f\u677f",HSATSolarTrackersRaleighNC:"\u5317\u5361\u7f57\u6765\u7eb3\u5dde\u7f57\u5229\u7684\u4e00\u4e2a\u6c34\u5e73\u65b9\u5411\u5355\u8f74\u65cb\u8f6c\u8ffd\u65e5\u5149\u4f0f\u677f\u9635\u5217\uff08HSAT\uff09",AADATSolarTrackersLancasterCA:"\u52a0\u5229\u798f\u5c3c\u4e9a\u5dde\u5170\u5f00\u65af\u7279\u7684\u4e00\u4e2a\u53cc\u8f74\u65cb\u8f6c\u8ffd\u65e5\u5149\u4f0f\u677f\u9635\u5217\uff08AADAT\uff09",SolarUpdraftTowerInCity:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u5728\u57ce\u5e02\u4e2d\u7684\u5e94\u7528"},builtEnvironmentSubMenu:"\u5efa\u9020\u73af\u5883",residentialBuildingsSubMenu:"\u4f4f\u5b85\u5efa\u7b51",residentialBuildingExamples:{ColonialHouse:"\u6b96\u6c11\u5730\u98ce\u683c\u7684\u4f4f\u5b85",DutchColonialHouse:"\u8377\u5170\u6b96\u6c11\u5730\u98ce\u683c\u7684\u4f4f\u5b85",TShapedHouse:"T\u5b57\u578b\u623f\u5b50",CapeCodHouseWithGarage:"\u6709\u8f66\u5e93\u7684\u79d1\u5fb7\u89d2\u98ce\u683c\u7684\u4f4f\u5b85",Solarium:"\u6709\u65e5\u5149\u6d74\u5ba4\u7684\u623f\u5b50",Church1:"\u6559\u5802\u4f8b\u4e00",Cathedral1:"\u4e3b\u6559\u5ea7\u5802\u4f8b\u4e00",Cathedral2:"\u4e3b\u6559\u5ea7\u5802\u4f8b\u4e8c",Mosque1:"\u6e05\u771f\u5bfa\u4f8b\u4e00",AdobeTaosHouse:"\u9676\u65af\u571f\u576f\u623f",RanchHouse:"\u7267\u573a\u98ce\u683c\u7684\u4f4f\u5b85",BonnetHouse:"\u6709\u5e3d\u6a90\u5c4b\u9876\u7684\u4f4f\u5b85",BarnStyleHouse:"\u8c37\u4ed3\u5f0f\u98ce\u683c\u7684\u4f4f\u5b85",ModernHouse:"\u73b0\u4ee3\u98ce\u683c\u7684\u4f4f\u5b85",ButterflyRoofHouse:"\u8774\u8776\u578b\u5c4b\u9876\u7684\u4f4f\u5b85"},commercialBuildingsSubMenu:"\u5546\u7528\u5efa\u7b51",commercialBuildingExamples:{WhiteHouse:"\u767d\u5bab",BilimMersinTurkiye:"\u571f\u8033\u5176\u6885\u5c14\u8f9b\u79d1\u5b66\u6559\u80b2\u4e2d\u5fc3",SpanishStyleHotel:"\u897f\u73ed\u7259\u98ce\u683c\u65c5\u9986",ApartmentBuilding:"\u516c\u5bd3\u697c",OfficeBuilding:"\u529e\u516c\u697c",Hotel:"\u65c5\u9986"},buildingComplexesSubMenu:"\u5efa\u7b51\u7fa4",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"\u4f5b\u8499\u7279\u5dde\u5357\u4f2f\u7075\u987f\u9ad8\u4e2d",MescaleroApacheSchoolNewMexico:"\u65b0\u58a8\u897f\u54e5\u5dde\u6885\u65af\u5361\u52d2\u7f57\u963f\u5e15\u5947\u5b66\u6821"},urbanPlanningSubMenu:"\u57ce\u5e02\u89c4\u5212",urbanPlanningExamples:{Heatmap1:"\u70ed\u56fe\u4f8b\u4e00"},otherBuildingsSubMenu:"\u5176\u5b83\u5efa\u7b51",otherBuildingExamples:{Greenhouse:"\u6e29\u5ba4",Pavilion:"\u516c\u56ed\u7684\u4ead\u5b50",OctagonalPagoda:"\u516b\u89d2\u5854",OceanFront:"\u6d77\u8fb9",EgyptianPyramids:"\u57c3\u53ca\u91d1\u5b57\u5854",MayanPyramid:"\u739b\u96c5\u91d1\u5b57\u5854",SiOSePol:"\u4e09\u5341\u4e09\u5b54\u6865",StackedCuboids:"\u5806\u780c\u957f\u65b9\u4f53"},artificialIntelligenceSubMenu:"\u4eba\u5de5\u667a\u80fd",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"\u4f18\u5316\u5355\u6392\u5149\u4f0f\u677f\u7684\u503e\u659c\u89d2",OptimizingTiltAnglesOfMultipleSolarPanelRows:"\u4f18\u5316\u591a\u6392\u5149\u4f0f\u677f\u7684\u503e\u659c\u89d2",SolarFarmGenerativeDesign:"\u751f\u6210\u5f0f\u8bbe\u8ba1\u592a\u9633\u80fd\u519c\u573a",SolarFarmGenerativeDesignWithBlock:"\u751f\u6210\u5f0f\u8bbe\u8ba1\u592a\u9633\u80fd\u519c\u573a\uff1a\u5468\u8fb9\u6709\u5efa\u7b51\u7269\u7684\u60c5\u51b5",FitchburgSolarFarmGenerativeDesign:"\u751f\u6210\u5f0f\u8bbe\u8ba1\u592a\u9633\u80fd\u519c\u573a\uff1a\u771f\u5b9e\u4e16\u754c\u6848\u4f8b"},languageSubMenu:"\u8bed\u8a00",publicSubMenu:"\u516c\u5171",ModelsGallery:"\u6a21\u578b\u753b\u5eca",ModelsMap:"\u6a21\u578b\u5730\u56fe",AboutUs:"\u5173\u4e8e\u6211\u4eec"},avatarMenu:{AccountSettings:"\u8d26\u53f7\u8bbe\u5b9a",PrivacyStatementTitle:"\u7528\u6237\u9690\u79c1\u4fdd\u62a4\u58f0\u660e",PrivacyStatement:"\u767b\u5f55\u9700\u8981\u91c7\u7528\u60a8\u7684\u8c37\u6b4cID\u5efa\u7acb\u6216\u8fdb\u5165\u60a8\u7684\u963f\u62c9\u4e01\u8d26\u6237\u3002 \u6211\u4eec\u53ea\u50a8\u5b58\u4e00\u4e2a\u968f\u673a\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a\u60a8\u7684ID\u3002 \u4efb\u4f55\u5173\u4e8e\u60a8\u7684\u53ef\u8fa8\u8bc6\u7684\u4e2a\u4eba\u4fe1\u606f\u90fd\u6ca1\u6709\u88ab\u6536\u96c6\u3002 \u8be6\u60c5\u8bf7\u53c2\u8003\u6211\u4eec\u7684",SignIn:"\u767b\u5f55",SignOut:"\u9000\u51fa\u8d26\u53f7",IfYouAreAStudent:"\u5982\u679c\u60a8\u662f\u4e00\u4e2a\u5b66\u751f"},skyMenu:{Axes:"\u663e\u793a\u5750\u6807\u8f74",Theme:"\u73af\u5883\u4e3b\u9898",ThemeDefault:"\u9ed8\u8ba4",ThemeDesert:"\u6c99\u6f20",ThemeDune:"\u6c99\u4e18",ThemeForest:"\u68ee\u6797",ThemeGrassland:"\u8349\u539f",ThemeHill:"\u4e18\u9675",ThemeLake:"\u6e56\u6cca",ThemeMountain:"\u5c71\u8109",ThemeRural:"\u7530\u56ed",SunlightAttenuationCoefficientInAir:"\u9633\u5149\u5728\u7a7a\u6c14\u4e2d\u4f20\u64ad\u7684\u8870\u51cf\u7cfb\u6570",ConvectiveCoefficientOfAir:"\u7a7a\u6c14\u5bf9\u6d41\u4f20\u70ed\u7cfb\u6570",HighestTemperatureTimeInMinutes:"\u6700\u9ad8\u6c14\u6e29\u65f6\u95f4(\u5206\u949f)",SelectSunAnglesToShow:"\u9009\u62e9\u592a\u9633\u89d2\u5ea6\u663e\u793a",ShowAzimuthAngle:"\u663e\u793a\u65b9\u4f4d\u89d2",ShowElevationAngle:"\u663e\u793a\u9ad8\u5ea6\u89d2",ShowZenithAngle:"\u663e\u793a\u5929\u9876\u89d2",DirectLightBrightnessAtNoon:"\u6b63\u5348\u76f4\u5c04\u5149\u7167\u5ea6",AmbientLightBrightnessAtNoon:"\u6b63\u5348\u73af\u5883\u5149\u7167\u5ea6"},groundMenu:{MonthlyIrradianceLoss:"\u6708\u4efd\u8f90\u5c04\u5ea6\u635f\u5931\u6bd4",Vegetation:"\u690d\u88ab",LeafOutDay:"\u6811\u53f6\u957f\u51fa\u7684\u65e5\u5b50",LeafOffDay:"\u6811\u53f6\u8131\u843d\u7684\u65e5\u5b50",Albedo:"\u53cd\u7167\u7387",ImageOnGround:"\u5730\u9762\u663e\u793a\u56fe\u50cf",WaterSurface:"\u6c34\u9762",RemoveAllUnlockedTrees:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728",RemoveAllUnlockedFlowers:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedPeople:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedFoundations:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5730\u57fa",RemoveAllUnlockedCuboids:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u957f\u65b9\u4f53",DoYouReallyWantToRemoveAllPeople:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u5417",DoYouReallyWantToRemoveAllTrees:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728\u5417",DoYouReallyWantToRemoveAllFlowers:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u5417",DoYouReallyWantToRemoveAllSolarPanels:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",DoYouReallyWantToRemoveAllFoundations:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5730\u57fa\u5417",DoYouReallyWantToRemoveAllCuboids:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u957f\u65b9\u4f53\u5417",LockAllElements:"\u56fa\u5b9a\u6240\u6709\u7684\u90e8\u4ef6",UnlockAllElements:"\u89e3\u9664\u6240\u6709\u7684\u56fa\u5b9a"},labelSubMenu:{Label:"\u6807\u7b7e",LabelText:"\u6807\u7b7e\u7684\u5185\u5bb9",LabelHeight:"\u6807\u7b7e\u7684\u9ad8\u5ea6",LabelSize:"\u6807\u7b7e\u7684\u5927\u5c0f",LabelFontSize:"\u5b57\u4f53\u7684\u5927\u5c0f",LabelColor:"\u6807\u7b7e\u7684\u989c\u8272",KeepShowingLabel:"\u663e\u793a\u6807\u7b7e"},foundationMenu:{RemoveAllUnlockedSolarPanels:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedParabolicTroughs:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u629b\u7269\u7ebf\u69fd",RemoveAllUnlockedParabolicDishes:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u629b\u7269\u7ebf\u789f",RemoveAllUnlockedFresnelReflectors:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c",RemoveAllUnlockedHeliostats:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5b9a\u65e5\u955c",RemoveAllUnlockedSensors:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668",RemoveAllUnlockedLights:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f",RemoveAllUnlockedWalls:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5899",RemoveAllUnlockedWindows:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6237",RemoveAllUnlockedDoors:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u95e8",RemoveAllUnlockedPolygons:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62",RemoveAllUnlockedHumans:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedTrees:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728",RemoveAllUnlockedFlowers:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",Racks:"\u652f\u67b6",Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",SolarPanels:"\u5149\u4f0f\u677f",SolarPanelArray:"\u5149\u4f0f\u677f\u9635\u5217",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",ParabolicTroughs:"\u629b\u7269\u7ebf\u69fd",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u629b\u7269\u7ebf\u69fd\u5417",ParabolicDishes:"\u629b\u7269\u7ebf\u789f",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u629b\u7269\u7ebf\u789f\u5417",FresnelReflectors:"\u83f2\u6d85\u8033\u53cd\u5c04\u955c",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u5417",Heliostats:"\u5b9a\u65e5\u955c",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5b9a\u65e5\u955c\u5417",Sensors:"\u4f20\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668\u5417",Lights:"\u7535\u706f",DoYouReallyWantToRemoveAllLightsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f\u5417",Walls:"\u5899",DoYouReallyWantToRemoveAllWallsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5899\u5417",Windows:"\u7a97\u6237",DoYouReallyWantToRemoveAllWindowsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6237\u5417",Doors:"\u95e8",DoYouReallyWantToRemoveAllDoorsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u95e8\u5417",Polygons:"\u591a\u8fb9\u5f62",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62\u5417",Humans:"\u4eba\u7269",DoYouReallyWantToRemoveAllHumansOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u5417",Trees:"\u6811\u6728",DoYouReallyWantToRemoveAllTreesOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728\u5417",Flowers:"\u82b1\u8349",DoYouReallyWantToRemoveAllFlowersOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u5417",OnlyThisFoundation:"\u53ea\u8fd9\u5757\u5730\u57fa",AllSelectedFoundations:"\u6240\u6709\u9009\u4e2d\u7684\u5730\u57fa",AllConnectedFoundations:"\u6240\u6709\u76f8\u8fde\u7684\u5730\u57fa",AllFoundations:"\u6240\u6709\u7684\u5730\u57fa",AddPolygon:"\u6dfb\u52a0\u591a\u8fb9\u5f62",SolarStructure:"\u592a\u9633\u80fd\u6784\u578b",GroupMaster:"\u4e3b\u5730\u57fa",LockAllElementsOnThisFoundation:"\u56fa\u5b9a\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u7684\u90e8\u4ef6",UnlockAllElementsOnThisFoundation:"\u89e3\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u7684\u56fa\u5b9a",GroundFloorRValue:"\u5efa\u7b51\u7269\u5730\u677f\u7684R\u503c",OnlyThisGroundFloor:"\u53ea\u8fd9\u4e2a\u5efa\u7b51\u7269\u7684\u5730\u677f",AllGroundFloors:"\u6240\u6709\u5efa\u7b51\u7269\u7684\u5730\u677f"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"\u548c\u5b9a\u65e5\u955c\u914d\u5957\u7684\u5438\u6536\u5854",ReceiverTowerPhysicalProperties:"\u592a\u9633\u80fd\u5438\u6536\u5854\u7684\u7269\u7406\u6027\u8d28",ReceiverTowerHeight:"\u592a\u9633\u80fd\u5438\u6536\u5854\u7684\u9ad8\u5ea6",ReceiverTowerRadius:"\u592a\u9633\u80fd\u5438\u6536\u5854\u7684\u534a\u5f84",ReceiverAbsorptance:"\u592a\u9633\u80fd\u5438\u6536\u5668\u7684\u5438\u6536\u7387",ReceiverOpticalEfficiency:"\u592a\u9633\u80fd\u5438\u6536\u5668\u7684\u5149\u6548\u7387",ReceiverThermalEfficiency:"\u592a\u9633\u80fd\u5438\u6536\u5668\u7684\u70ed\u6548\u7387"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"\u548c\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u914d\u5957\u7684\u5438\u6536\u7ba1",AbsorberPipePhysicalProperties:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u7269\u7406\u6027\u8d28",AbsorberHeight:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u5b89\u88c5\u9ad8\u5ea6",AbsorberApertureWidth:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u5b54\u5f84",AbsorberPipePoleNumber:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u652f\u67f1\u6570\u91cf",AbsorberAbsorptance:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u5438\u6536\u7387",AbsorberOpticalEfficiency:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u5149\u6548\u7387",AbsorberThermalEfficiency:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u70ed\u6548\u7387"},solarUpdraftTowerMenu:{SolarUpdraftTower:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854",SolarUpdraftTowerPhysicalProperties:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u7684\u7269\u7406\u6027\u8d28",SolarUpdraftTowerChimneyHeight:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u70df\u56f1\u7684\u9ad8\u5ea6",SolarUpdraftTowerChimneyRadius:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u70df\u56f1\u7684\u534a\u5f84",SolarUpdraftTowerCollectorHeight:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u96c6\u70ed\u68da\u7684\u9ad8\u5ea6",SolarUpdraftTowerCollectorRadius:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u96c6\u70ed\u68da\u7684\u534a\u5f84",SolarUpdraftTowerCollectorTransmissivity:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u96c6\u70ed\u68da\u7684\u900f\u5c04\u7387",SolarUpdraftTowerCollectorEmissivity:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u96c6\u70ed\u68da\u7684\u53d1\u5c04\u7387",SolarUpdraftTowerDischargeCoefficient:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u7684\u6d41\u91cf\u7cfb\u6570",SolarUpdraftTowerTurbineEfficiency:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u7684\u6da1\u8f6e\u673a\u6548\u7387"},cuboidMenu:{Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedSensors:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668",RemoveAllUnlockedPolygons:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62",RemoveAllUnlockedHumans:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedTrees:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728",RemoveAllUnlockedFlowers:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",Racks:"\u652f\u67b6",SolarPanels:"\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",Sensors:"\u4f20\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668\u5417",Polygons:"\u591a\u8fb9\u5f62",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62\u5417",Humans:"\u4eba\u7269",DoYouReallyWantToRemoveAllHumansOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u5417",Trees:"\u6811\u6728",DoYouReallyWantToRemoveAllTreesOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728\u5417",Flowers:"\u82b1\u8349",DoYouReallyWantToRemoveAllFlowersOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u5417",OnlyThisCuboid:"\u53ea\u8fd9\u4e2a\u957f\u65b9\u4f53",AllCuboidsOnSameSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u957f\u65b9\u4f53",AllCuboidsAboveSameBase:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u957f\u65b9\u4f53",AllSelectedCuboids:"\u6240\u6709\u9009\u4e2d\u7684\u957f\u65b9\u4f53",AllCuboids:"\u6240\u6709\u7684\u957f\u65b9\u4f53",OnlyThisSide:"\u53ea\u8fd9\u4e2a\u8868\u9762",AllSidesOfThisCuboid:"\u8fd9\u4e2a\u957f\u65b9\u4f53\u6240\u6709\u7684\u4fa7\u9762",AllSidesOfSelectedCuboids:"\u6240\u6709\u9009\u4e2d\u957f\u65b9\u4f53\u6240\u6709\u7684\u4fa7\u9762",AllSidesOfAllCuboids:"\u6240\u6709\u7684\u957f\u65b9\u4f53\u6240\u6709\u7684\u4fa7\u9762",AddPolygon:"\u6dfb\u52a0\u591a\u8fb9\u5f62",Stackable:"\u53ef\u5806\u780c",GroupMaster:"\u4e3b\u957f\u65b9\u4f53"},polygonMenu:{Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",TextBox:"\u6587\u5b57\u6846",FontOutlineColor:"\u5b57\u4f53\u8f6e\u5ed3\u989c\u8272",FontOutlineWidth:"\u5b57\u4f53\u8f6e\u5ed3\u7ebf\u5bbd",FontStrokeColor:"\u5b57\u4f53\u63cf\u8fb9\u989c\u8272",FontStrokeWidth:"\u5b57\u4f53\u63cf\u8fb9\u7ebf\u5bbd",NoOutline:"\u65e0\u8f6e\u5ed3\u7ebf",Shiny:"\u5149\u6cfd",Filled:"\u586b\u5145",FillTexture:"\u586b\u5145\u6750\u8d28",FillColor:"\u586b\u5145\u989c\u8272",Opacity:"\u906e\u5149\u5ea6",LineColor:"\u7ebf\u6761\u989c\u8272",LineWidth:"\u7ebf\u6761\u5bbd\u5ea6",LineStyle:"\u7ebf\u6761\u6837\u5f0f",SolidLine:"\u5b9e\u7ebf",DashedLine:"\u865a\u7ebf",DottedLine:"\u70b9\u7ebf",InsertVertexBeforeIndex:"\u524d\u9762\u63d2\u5165\u9876\u70b9",InsertVertexAfterIndex:"\u540e\u9762\u63d2\u5165\u9876\u70b9",DeleteVertex:"\u79fb\u9664\u9876\u70b9",OnlyThisPolygon:"\u53ea\u8fd9\u4e2a\u591a\u8fb9\u5f62",AllPolygonsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u591a\u8fb9\u5f62",AllPolygonsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u591a\u8fb9\u5f62",AllSelectedPolygons:"\u6240\u6709\u9009\u4e2d\u7684\u591a\u8fb9\u5f62",AllPolygons:"\u6240\u6709\u7684\u591a\u8fb9\u5f62",Layout:"\u5e03\u5c40",SolarPanelArrayLayout:"\u5149\u4f0f\u677f\u9635\u5217\u5e03\u5c40",SolarPanelArrayLayoutParametricDesign:"\u5149\u4f0f\u677f\u9635\u5217\u5e03\u5c40\u53c2\u6570\u5316\u8bbe\u8ba1",SolarPanelArrayLayoutGenerativeDesign:"\u5149\u4f0f\u677f\u9635\u5217\u5e03\u5c40\u751f\u6210\u5f0f\u8bbe\u8ba1",SolarPanelArrayModel:"\u5149\u4f0f\u677f\u578b\u53f7",SolarPanelArrayOrientation:"\u6392\u5217\u65b9\u5411",SolarPanelArrayTiltAngle:"\u503e\u659c\u89d2\u5ea6",SolarPanelArrayRowWidth:"\u884c\u5bbd\u5ea6",SolarPanelArrayInterRowSpacing:"\u884c\u95f4\u8ddd",SolarPanelArrayRowSpacing:"\u884c\u95f4\u8ddd",SolarPanelArrayRowAxis:"\u884c\u8f74\u65b9\u5411",SolarPanelArrayLeftRightRowAxis:"\u5de6\u53f3\u65b9\u5411(\u76f8\u5bf9)",SolarPanelArrayUpDownRowAxis:"\u4e0a\u4e0b\u65b9\u5411(\u76f8\u5bf9)",SolarPanelArrayEastWestRowAxis:"\u4e1c\u897f\u65b9\u5411(\u7edd\u5bf9)",SolarPanelArrayNorthSouthRowAxis:"\u5357\u5317\u65b9\u5411(\u7edd\u5bf9)",SolarPanelArrayMargin:"\u8fb9\u7f18\u4f59\u5730",SolarPanelArrayPoleHeight:"\u652f\u67b6\u9ad8\u5ea6",SolarPanelArrayPoleSpacing:"\u652f\u67f1\u95f4\u9694",SolarPanelArrayTotalYearlyCost:"\u5168\u5e74\u603b\u6210\u672c",SolarPanelArrayTotalYearlyRevenue:"\u5168\u5e74\u603b\u6536\u5165",SolarPanelArrayTotalYearlyYield:"\u5168\u5e74\u603b\u53d1\u7535\u91cf",SolarPanelArrayMeanYearlyYield:"\u5e73\u5747\u5e74\u53d1\u7535\u91cf",SolarPanelArrayYearlyProfit:"\u5168\u5e74\u5229\u6da6",LayoutNotAcceptedCheckYourParameters:"\u6055\u4e0d\u80fd\u91c7\u7528\u6b64\u5e03\u5c40\u3002\u8bf7\u68c0\u67e5\u60a8\u7684\u53c2\u6570\u8bbe\u7f6e\u3002"},optimizationMenu:{Optimization:"\u4f18\u5316",Parameters:"\u53c2\u6570",Variables:"\u53d8\u91cf",Constants:"\u5e38\u91cf",GeneticAlgorithm:"\u9057\u4f20\u7b97\u6cd5",GeneticAlgorithmSettings:"\u9057\u4f20\u7b97\u6cd5\u8bbe\u5b9a",ParticleSwarmOptimization:"\u7c92\u5b50\u7fa4\u4f18\u5316",ParticleSwarmOptimizationSettings:"\u7c92\u5b50\u7fa4\u4f18\u5316\u8bbe\u5b9a",SolarPanelTiltAngleOptimization:"\u5149\u4f0f\u677f\u503e\u659c\u89d2\u5ea6\u4f18\u5316",SolarPanelArrayLayout:"\u5149\u4f0f\u677f\u9635\u5217\u5e03\u5c40",Generation:"\u4e16\u4ee3",Gene:"\u57fa\u56e0",NormalizedVariables:"\u6807\u51c6\u5316\u53d8\u91cf",Objective:"\u76ee\u6807\u51fd\u6570",ObjectiveFunctionDailyTotalYield:"\u5f53\u65e5\u603b\u4ea7\u51fa",ObjectiveFunctionYearlyTotalYield:"\u5168\u5e74\u603b\u4ea7\u51fa",ObjectiveFunctionDailyMeanYield:"\u5f53\u65e5\u5e73\u5747\u4ea7\u51fa",ObjectiveFunctionYearlyMeanYield:"\u5168\u5e74\u5e73\u5747\u4ea7\u51fa",ObjectiveFunctionDailyProfit:"\u5f53\u65e5\u5229\u6da6",ObjectiveFunctionYearlyProfit:"\u5168\u5e74\u5229\u6da6",GeneticAlgorithmSelectionMethod:"\u9057\u4f20\u7b97\u6cd5\u9009\u62e9\u65b9\u6cd5",RouletteWheel:"\u8f6e\u76d8\u5236",Tournament:"\u6dd8\u6c70\u5236",SearchMethod:"\u641c\u7d22\u65b9\u6cd5",GlobalSearchUniformSelection:"\u5168\u5c40\u641c\u7d22\u5747\u5300\u53d6\u6837",LocalSearchRandomOptimization:"\u5c40\u90e8\u641c\u7d22\u968f\u673a\u4f18\u5316",PopulationSize:"\u79cd\u7fa4\u4e2a\u4f53\u6570\u76ee",MaximumGenerations:"\u6700\u5927\u4e16\u4ee3\u6570\u76ee",SelectionRate:"\u9009\u62e9\u6982\u7387",CrossoverRate:"\u4ea4\u914d\u6982\u7387",MutationRate:"\u7a81\u53d8\u6982\u7387",Step:"\u6b65\u6570",SwarmSize:"\u7c92\u5b50\u6570\u76ee",MaximumSteps:"\u6700\u5927\u6b65\u6570",MaximumVelocity:"\u6700\u5927\u901f\u5ea6",InertiaWeight:"\u60ef\u6027\u6743\u91cd",CognitiveCoefficient:"\u8ba4\u77e5\u7cfb\u6570",SocialCoefficient:"\u793e\u4f1a\u7cfb\u6570",ConvergenceThreshold:"\u7ec8\u6b62\u6761\u4ef6\u7684\u6536\u655b\u9608\u503c",LocalSearchRadius:"\u5c40\u90e8\u641c\u7d22\u7684\u534a\u5f84",RowsPerRackRange:"\u5355\u4e2a\u652f\u67b6\u4e0a\u5149\u4f0f\u677f\u884c\u6570\u7684\u53d8\u5316\u8303\u56f4",TiltAngleRange:"\u5149\u4f0f\u677f\u503e\u659c\u89d2\u5ea6\u7684\u53d8\u5316\u8303\u56f4",InterRowSpacingRange:"\u5149\u4f0f\u677f\u9635\u5217\u884c\u95f4\u8ddd\u7684\u53d8\u5316\u8303\u56f4",ClickTargetPolygonToActivate:"\u70b9\u51fb\u76ee\u6807\u591a\u8fb9\u5f62\u6fc0\u6d3b",ClickTargetFoundationToActivate:"\u70b9\u51fb\u76ee\u6807\u5730\u57fa\u6fc0\u6d3b"},treeMenu:{ShowModel:"\u663e\u793a\u8fd1\u4f3c\u6a21\u578b",Flip:"\u7ffb\u8f6c",Type:"\u6811\u79cd",Spread:"\u6811\u51a0\u76f4\u5f84"},flowerMenu:{Flip:"\u7ffb\u8f6c",Type:"\u54c1\u79cd",Spread:"\u76f4\u5f84"},peopleMenu:{ChangePerson:"\u6539\u53d8\u4eba\u7269",Flip:"\u8f6c\u8eab",Observer:"\u89c2\u5bdf\u8005",ViewFromThisPerson:"\u89c6\u89d2\u79fb\u5230\u6b64\u4eba\u4f4d\u7f6e"},lightMenu:{Color:"\u989c\u8272",Intensity:"\u4eae\u5ea6",Decay:"\u8870\u51cf",MaximumDistance:"\u6700\u5927\u8ddd\u79bb",Inside:"\u5185\u90e8"},solarCollectorMenu:{RelativeAzimuth:"\u76f8\u5bf9\u65b9\u4f4d\u89d2",Pole:"\u652f\u67f1",PoleHeight:"\u652f\u67f1\u9ad8\u5ea6",PoleRadius:"\u652f\u67f1\u534a\u5f84",ExtraPoleHeight:"\u989d\u5916\u7684\u652f\u67f1\u9ad8\u5ea6",ExtraPoleHeightInAdditionToHalfWidth:"\u5bbd\u5ea6\u4e00\u534a\u989d\u5916\u7684\u652f\u67f1\u9ad8\u5ea6",DrawSunBeam:"\u663e\u793a\u5149\u675f"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"\u53cd\u5c04\u5668\u955c\u9762\u53cd\u5c04\u7387",ReceiverAbsorptance:"\u63a5\u6536\u5668\u5438\u6536\u7387",ReflectorOpticalEfficiency:"\u53cd\u5c04\u5668\u5149\u6548\u7387",ReceiverThermalEfficiency:"\u63a5\u6536\u5668\u70ed\u6548\u7387"},solarPanelMenu:{InverterEfficiency:"\u9006\u53d8\u5668\u6548\u7387",InverterEfficiencyExplained:"\u76f4\u6d41\u7535\u8f6c\u6362\u4e3a\u4ea4\u6d41\u7535\u7684\u6548\u7387\u3002",DcToAcSizeRatio:"\u76f4\u6d41-\u4ea4\u6d41\u5bb9\u91cf\u6bd4\u4f8b",DcToAcSizeRatioExplained:"\u76f4\u6d41\u7535\u5bb9\u91cf\u548c\u4ea4\u6d41\u7535\u5bb9\u91cf\u7684\u6bd4\u4f8b\u3002",ChangePvModel:"\u6539\u53d8\u5149\u4f0f\u677f\u578b\u53f7",Orientation:"\u6392\u5217\u65b9\u5411",Portrait:"\u7eb5\u5411",Landscape:"\u6a6b\u5411",FrameColor:"\u6846\u67b6\u989c\u8272",Panels:"\u5757",PanelsWide:"\u5757\u5149\u4f0f\u677f\u5bbd",PanelsLong:"\u5757\u5149\u4f0f\u677f\u957f",TiltAngle:"\u503e\u659c\u89d2\u5ea6",SouthFacingIsPositive:"\u671d\u5357\u4e3a\u6b63",Tracker:"\u8ffd\u65e5\u7cfb\u7edf",SolarTrackerFollowsSun:"\u8ffd\u65e5\u7cfb\u7edf\u63d0\u9ad8\u5149\u4f0f\u677f\u4ea7\u51fa\u3002",PoleSpacing:"\u652f\u67f1\u95f4\u9694",NoTracker:"\u65e0\u8ffd\u65e5\u7cfb\u7edf",HorizontalSingleAxisTracker:"\u6c34\u5e73\u5355\u8f74\u8ffd\u65e5\u7cfb\u7edf",VerticalSingleAxisTracker:"\u7ad6\u76f4\u5355\u8f74\u8ffd\u65e5\u7cfb\u7edf",AltazimuthDualAxisTracker:"\u5730\u5e73\u53cc\u8f74\u8ffd\u65e5\u7cfb\u7edf",OnlyThisSolarPanel:"\u53ea\u8fd9\u4e2a\u5149\u4f0f\u677f",AllSolarPanelsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u5149\u4f0f\u677f",AllSolarPanelsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5149\u4f0f\u677f",AllSelectedSolarPanels:"\u6240\u6709\u9009\u4e2d\u7684\u5149\u4f0f\u677f",AllSolarPanels:"\u6240\u6709\u7684\u5149\u4f0f\u677f"},pvModelPanel:{SolarPanelSpecs:"\u5149\u4f0f\u677f\u578b\u53f7\u6027\u80fd",Model:"\u578b\u53f7",PanelSize:"\u5c3a\u5bf8",Cells:"\u7535\u6c60\u7d44",CellType:"\u5149\u4f0f\u7535\u6c60\u7c7b\u578b",Monocrystalline:"\u5355\u6676\u7845",Polycrystalline:"\u591a\u6676\u7845",ThinFilm:"\u8584\u819c",Bifacial:"\u53cc\u9762",BifacialityFactor:"\u53cc\u9762\u6027\u56e0\u5b50",Black:"\u9ed1\u8272",Blue:"\u84dd\u8272",ShadeTolerance:"\u9634\u5f71\u8010\u53d7\u5ea6",SolarCellEfficiency:"\u5149\u4f0f\u7535\u6c60\u6548\u7387",NominalOperatingCellTemperature:"\u540d\u4e49\u7535\u6c60\u8fd0\u884c\u6e29\u5ea6",TemperatureCoefficientOfPmax:"Pmax\u6e29\u5ea6\u7cfb\u6570"},parabolicTroughMenu:{ModuleLength:"\u6a21\u5757\u957f\u5ea6",Modules:"\u6a21\u5757",ModulesLong:"\u6a21\u5757\u957f",LatusRectum:"\u901a\u5f84",OnlyThisParabolicTrough:"\u53ea\u8fd9\u4e2a\u629b\u7269\u7ebf\u69fd",AllParabolicTroughsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u629b\u7269\u7ebf\u69fd",AllSelectedParabolicTroughs:"\u6240\u6709\u9009\u4e2d\u7684\u629b\u7269\u7ebf\u69fd",AllParabolicTroughs:"\u6240\u6709\u7684\u629b\u7269\u7ebf\u69fd"},fresnelReflectorMenu:{AbsorberPipe:"\u5438\u6536\u7ba1",SelectAbsorberToReflectSunlightTo:"\u9009\u62e9\u9633\u5149\u53cd\u5c04\u5230\u7684\u5438\u6536\u7ba1",ModuleLength:"\u6a21\u5757\u957f\u5ea6",Modules:"\u6a21\u5757",ModulesLong:"\u6a21\u5757\u957f",OnlyThisFresnelReflector:"\u53ea\u8fd9\u4e2a\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AllFresnelReflectorsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AllSelectedFresnelReflectors:"\u6240\u6709\u9009\u4e2d\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AllFresnelReflectors:"\u6240\u6709\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c"},heliostatMenu:{Tower:"\u5438\u6536\u5854",SelectTowerToReflectSunlightTo:"\u9009\u62e9\u9633\u5149\u53cd\u5c04\u5230\u7684\u5438\u6536\u5854",OnlyThisHeliostat:"\u53ea\u8fd9\u4e2a\u5b9a\u65e5\u955c",AllHeliostatsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5b9a\u65e5\u955c",AllSelectedHeliostats:"\u6240\u6709\u9009\u4e2d\u7684\u5b9a\u65e5\u955c",AllHeliostats:"\u6240\u6709\u7684\u5b9a\u65e5\u955c"},parabolicDishMenu:{ReceiverStructure:"\u63a5\u6536\u5668\u7ed3\u6784",CentralPole:"\u4e2d\u5fc3\u76f4\u67f1",CentralPoleWithTripod:"\u4e09\u811a\u67b6\u548c\u4e2d\u5fc3\u76f4\u67f1",Quadrupod:"\u56db\u811a\u67b6",RimDiameter:"\u5916\u5708\u76f4\u5f84",LatusRectum:"\u901a\u5f84",ExtraPoleHeightInAdditionToRadius:"\u534a\u5f84\u4e4b\u5916\u989d\u5916\u7684\u652f\u67b6\u9ad8\u5ea6",OnlyThisParabolicDish:"\u53ea\u8fd9\u4e2a\u629b\u7269\u7ebf\u789f",AllParabolicDishesAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u629b\u7269\u7ebf\u789f",AllSelectedParabolicDishes:"\u6240\u6709\u9009\u4e2d\u7684\u629b\u7269\u7ebf\u789f",AllParabolicDishes:"\u6240\u6709\u7684\u629b\u7269\u7ebf\u789f"},wallMenu:{TextureDefault:"\u9ed8\u8ba4\u6750\u8d28",Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",SizeOfWall:"\u5899\u7684\u5c3a\u5bf8",OnlyThisWall:"\u53ea\u8fd9\u5835\u5899",AllConnectedWalls:"\u6240\u6709\u8fde\u63a5\u7684\u5899",AllWallsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5899",AllSelectedWalls:"\u6240\u6709\u9009\u4e2d\u7684\u5899",AllWalls:"\u6240\u6709\u7684\u5899",Windows:"\u7a97\u6237",LockAllWindows:"\u56fa\u5b9a\u6240\u6709\u7684\u7a97\u6237",UnlockAllWindows:"\u89e3\u9664\u6240\u6709\u7684\u7a97\u6237\u56fa\u5b9a",RemoveAllUnlockedWindows:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6237",DoYouReallyWantToRemoveAllWindowsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6237\u5417",Doors:"\u95e8",RemoveAllUnlockedDoors:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u95e8",DoYouReallyWantToRemoveAllDoorsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u95e8\u5417",SolarPanels:"\u5149\u4f0f\u677f",LockAllSolarPanels:"\u56fa\u5b9a\u6240\u6709\u7684\u5149\u4f0f\u677f",UnlockAllSolarPanels:"\u89e3\u9664\u6240\u6709\u7684\u5149\u4f0f\u677f\u56fa\u5b9a",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",Sensors:"\u4f20\u611f\u5668",LockAllSensors:"\u56fa\u5b9a\u6240\u6709\u7684\u4f20\u611f\u5668",UnlockAllSensors:"\u89e3\u9664\u6240\u6709\u7684\u4f20\u611f\u5668\u56fa\u5b9a",RemoveAllUnlockedSensors:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668\u5417",Lights:"\u7535\u706f",RemoveAllUnlockedLights:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f",DoYouReallyWantToRemoveAllLightsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f\u5417",LockAllPolygons:"\u56fa\u5b9a\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u7684\u591a\u8fb9\u5f62",UnlockAllPolygons:"\u89e3\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u7684\u591a\u8fb9\u5f62\u56fa\u5b9a",RemoveAllUnlockedPolygons:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62",WallStructure:"\u5899\u7ed3\u6784",DefaultStructure:"\u9ed8\u8ba4",StudStructure:"\u5899\u67f1",PillarStructure:"\u5706\u67f1",Opacity:"\u906e\u5149\u5ea6",StructureSpacing:"\u7ed3\u6784\u95f4\u8ddd",StructureWidth:"\u7ed3\u6784\u5bbd\u5ea6",StructureThickness:"\u7ed3\u6784\u539a\u5ea6",StructureColor:"\u7ed3\u6784\u989c\u8272",Color:"\u7246\u4f53\u989c\u8272",Height:"\u9ad8\u5ea6",Thickness:"\u539a\u5ea6",Texture:"\u6750\u8d28",AllLightsOnWallInside:"\u6240\u6709\u7535\u706f\u5728\u7246\u5185",AllLightsOnWallOutside:"\u6240\u6709\u7535\u706f\u5728\u7246\u5916",Fill:"\u586b\u5145",Full:"\u5168\u90e8",Partial:"\u90e8\u5206",Empty:"\u7a7a\u767d",OpenToOutside:"\u5bf9\u5916\u9762\u5f00\u653e",EavesLength:"\u5c4b\u6a90\u5ef6\u4f38\u957f\u5ea6",Parapet:"\u5973\u5899",ParapetColor:"\u5973\u5899\u989c\u8272",ParapetTexture:"\u5973\u5899\u6750\u8d28",ParapetHeight:"\u5973\u5899\u9ad8\u5ea6",CopingsHeight:"\u9876\u76d6\u9ad8\u5ea6",CopingsWidth:"\u9876\u76d6\u5bbd\u5ea6"},windowMenu:{OnlyThisWindow:"\u53ea\u8fd9\u4e2a\u7a97\u6237",AllWindowsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u7a97\u6237",AllWindowsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u7a97\u6237",AllSelectedWindows:"\u6240\u6709\u9009\u4e2d\u7684\u7a97\u6237",AllWindows:"\u6240\u6709\u7684\u7a97\u6237",Width:"\u5bbd\u5ea6",Height:"\u9ad8\u5ea6",Setback:"\u79bb\u5899\u4f53\u5916\u8868\u9762\u7684\u8ddd\u79bb",RelativeToWallThickness:"\u76f8\u5bf9\u4e8e\u5899\u7684\u539a\u5ea6",Mullion:"\u76f4\u68c2",HorizontalMullion:"\u6c34\u5e73\u7684\u76f4\u68c2",VerticalMullion:"\u7ad6\u76f4\u7684\u76f4\u68c2",MullionWidth:"\u76f4\u68c2\u5bbd\u5ea6",HorizontalMullionSpacing:"\u6c34\u5e73\u76f4\u68c2\u7684\u95f4\u8ddd",VerticalMullionSpacing:"\u7ad6\u76f4\u76f4\u68c2\u7684\u95f4\u8ddd",MullionColor:"\u76f4\u68c2\u989c\u8272",Tint:"\u7740\u8272",Opacity:"\u4e0d\u900f\u660e\u5ea6",SolarHeatGainCoefficient:"\u592a\u9633\u8f90\u5c04\u70ed\u83b7\u53d6\u7cfb\u6570(SHGC) = 1 - \u4e0d\u900f\u660e\u5ea6",Shutter:"\u767e\u53f6\u7a97",LeftShutter:"\u5de6\u4fa7\u767e\u53f6\u7a97",RightShutter:"\u53f3\u4fa7\u767e\u53f6\u7a97",BothShutters:"\u4e24\u4fa7\u767e\u53f6\u7a97",ShutterWidth:"\u76f8\u5bf9\u5bbd\u5ea6",ShutterColor:"\u767e\u53f6\u7a97\u989c\u8272",Frame:"\u8fb9\u6846",FrameWidth:"\u8fb9\u6846\u5bbd\u5ea6",SillWidth:"\u7a97\u53f0\u5bbd\u5ea6",Color:"\u8fb9\u6846\u989c\u8272",WindowType:"\u7a97\u6237\u79cd\u7c7b",Default:"\u9ed8\u8ba4",Arched:"\u62f1\u5f62",Polygonal:"\u591a\u8fb9\u5f62",Interior:"\u5185\u7a97",Empty:"\u7a7a\u767d"},roofMenu:{TextureDefault:"\u9ed8\u8ba4\u6750\u8d28",Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",OnlyThisRoof:"\u53ea\u8fd9\u4e2a\u5c4b\u9876",AllRoofsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5c4b\u9876",AllSelectedRoofs:"\u6240\u6709\u9009\u4e2d\u7684\u5c4b\u9876",AllRoofs:"\u6240\u6709\u7684\u5c4b\u9876",OnlyThisCeiling:"\u53ea\u8fd9\u4e2a\u5929\u82b1\u677f",AllCeilingsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5929\u82b1\u677f",AllCeilings:"\u6240\u6709\u7684\u5929\u82b1\u677f",EavesOverhangLength:"\u5c4b\u6a90\u5ef6\u4f38\u957f\u5ea6",RafterSpacing:"\u5c4b\u693d\u95f4\u8ddd",RafterWidth:"\u5c4b\u693d\u5bbd\u5ea6",RafterThickness:"\u5c4b\u693d\u539a\u5ea6",RafterColor:"\u5c4b\u693d\u989c\u8272",RoofColor:"\u5c4b\u9876\u989c\u8272",RoofSideColor:"\u5c4b\u9876\u4fa7\u9762\u989c\u8272",GlassTint:"\u73bb\u7483\u989c\u8272",Opacity:"\u906e\u5149\u5ea6",RoofStructure:"\u5c4b\u9876\u7ed3\u6784",DefaultStructure:"\u9ed8\u8ba4",RafterStructure:"\u5c4b\u693d",GlassStructure:"\u73bb\u7483",SolarPanels:"\u5149\u4f0f\u677f",LockAllSolarPanels:"\u56fa\u5b9a\u6240\u6709\u7684\u5149\u4f0f\u677f",UnlockAllSolarPanels:"\u89e3\u9664\u6240\u6709\u7684\u5149\u4f0f\u677f\u56fa\u5b9a",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",Windows:"\u5929\u7a97",LockAllWindows:"\u56fa\u5b9a\u6240\u6709\u7684\u5929\u7a97",UnlockAllWindows:"\u89e3\u9664\u6240\u6709\u7684\u5929\u7a97\u56fa\u5b9a",RemoveAllUnlockedWindows:"\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5929\u7a97",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5929\u7a97\u5417",Sensors:"\u4f20\u611f\u5668",LockAllSensors:"\u56fa\u5b9a\u6240\u6709\u7684\u4f20\u611f\u5668",UnlockAllSensors:"\u89e3\u9664\u6240\u6709\u7684\u4f20\u611f\u5668\u56fa\u5b9a",RemoveAllUnlockedSensors:"\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668\u5417",Lights:"\u7535\u706f",RemoveAllUnlockedLights:"\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f",DoYouReallyWantToRemoveAllLightsOnThisRoof:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f\u5417",AllLightsOnRoofInside:"\u6240\u6709\u7535\u706f\u5728\u5c4b\u9876\u5185",AllLightsOnRoofOutside:"\u6240\u6709\u7535\u706f\u5728\u5c4b\u9876\u5916",Rise:"\u76f8\u5bf9\u9ad8\u5ea6",Ceiling:"\u5929\u82b1\u677f",RoofRValue:"\u5c4b\u9876R\u503c",CeilingRValue:"\u5929\u82b1\u677fR\u503c"},doorMenu:{TextureDefault:"\u9ed8\u8ba4\u6750\u8d28",Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",Texture11:"\u5341\u4e00\u53f7\u6750\u8d28",Texture12:"\u5341\u4e8c\u53f7\u6750\u8d28",Texture13:"\u5341\u4e09\u53f7\u6750\u8d28",Texture14:"\u5341\u56db\u53f7\u6750\u8d28",Texture15:"\u5341\u4e94\u53f7\u6750\u8d28",Texture16:"\u5341\u516d\u53f7\u6750\u8d28",Texture17:"\u5341\u4e03\u53f7\u6750\u8d28",OnlyThisDoor:"\u53ea\u8fd9\u4e2a\u95e8",AllDoorsOnWall:"\u540c\u4e00\u9762\u5899\u4e0a\u6240\u6709\u7684\u95e8",AllDoorsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u95e8",AllSelectedDoors:"\u6240\u6709\u9009\u4e2d\u7684\u95e8",AllDoors:"\u6240\u6709\u7684\u95e8",DoorType:"\u95e8\u79cd\u7c7b",Default:"\u9ed8\u8ba4",Arched:"\u62f1\u5f62",Filled:"\u586b\u5145",FrameColor:"\u95e8\u6846\u989c\u8272",Interior:"\u5185\u95e8"},siteInfoPanel:{High:"\u6700\u9ad8\u6e29\u5ea6",Low:"\u6700\u4f4e\u6e29\u5ea6"},designInfoPanel:{NumberOfSelectedHeliostats:"\u9009\u4e2d\u7684\u5b9a\u65e5\u955c\u603b\u6570",NumberOfSelectedSolarPanels:"\u9009\u4e2d\u7684\u5149\u4f0f\u677f\u603b\u6570",ElectricityGeneratedDailyBySolarPanels:"\u8fd9\u4e9b\u5149\u4f0f\u677f\u7684\u65e5\u53d1\u7535\u91cf",SceneDiameter:"\u573a\u666f\u76f4\u5f84",BuildingArea:"\u5efa\u7b51\u9762\u79ef"},visualizationControlPanel:{ColorContrast:"\u70ed\u56fe\u989c\u8272\u5bf9\u6bd4\u5ea6",FluxScale:"\u70ed\u901a\u91cf\u957f\u5ea6",ClickUpOrDownArrowButtonsToChange:"\u70b9\u51fb\u4e0a\u4e0b\u7bad\u5934\u6539\u53d8\u53c2\u6570"},instructionPanel:{Rotate:"\u65cb\u8f6c",DragMouse:"\u62d6\u52a8\u9f20\u6807",Zoom:"\u7f29\u653e",MouseWheelOrKeys:"\u9f20\u6807\u6eda\u8f6e\u6216\u8005Ctrl+[\u548cCtrl+]",MouseWheelOrKeysMac:"\u9f20\u6807\u6eda\u8f6e\u6216\u8005\u2318+[\u548c\u2318+]",Pan:"\u5e73\u79fb",HoldCtrlDragMouse:"\u6309\u4e0bCtrl\u952e\u5e76\u62d6\u52a8\u9f20\u6807",HoldMetaDragMouse:"\u6309\u4e0b\u2318\u952e\u5e76\u62d6\u52a8\u9f20\u6807",Enter2DMode:"\u9032\u5165\u4e8c\u7ef4\u6a21\u5f0f",Exit2DMode:"\u9000\u51fa\u4e8c\u7ef4\u6a21\u5f0f",NavigationMode:"\u5bfc\u822a\u6a21\u5f0f",EnableNavigation:"\u9032\u5165\u5bfc\u822a\u6a21\u5f0f",DisableNavigation:"\u9000\u51fa\u5bfc\u822a\u6a21\u5f0f",MoveForwardBack:"\u524d\u540e\u79fb\u52a8",MoveForwardBackInstruction:"\u6309W/S\u952e",MoveLeftRight:"\u5de6\u53f3\u79fb\u52a8",MoveLeftRightInstruction:"\u6309A/D\u952e",MoveUpDown:"\u4e0a\u4e0b\u79fb\u52a8",MoveUpDownInstruction:"\u6309Z/X\u952e",Turn:"\u62d0\u5f2f",TurnInstruction:"\u6309\u65b9\u5411\u952e",ResetView:"\u91cd\u7f6e\u89c6\u89d2",AutoRotate:"\u81ea\u52a8\u65cb\u8f6c",StartOrStop:"\u6309F4\u952e\u542f\u52a8\u6216\u505c\u6b62"},mapPanel:{ImageOnGround:"\u5730\u9762\u663e\u793a\u56fe\u50cf",WeatherStations:"\u6c14\u8c61\u7ad9",WeatherStationsNote:"\u5173\u95ed\u6b64\u9009\u9879\u4ee5\u63d0\u9ad8\u5730\u56fe\u901f\u5ea6",Coordinates:"\u7ecf\u7eac\u5ea6\u5750\u6807",Zoom:"\u653e\u5927\u7a0b\u5ea6"},visibilityPanel:{SolarPanelVisibility:"\u5149\u4f0f\u677f\u5bf9\u89c2\u5bdf\u8005\u7684\u53ef\u89c1\u5ea6",Observer:"\u89c2\u5bdf\u8005",VantagePoint:"\u89c2\u5bdf\u4f4d\u7f6e",ItemizedVisibilityByFields:"\u6bcf\u4e2a\u573a\u7684\u53ef\u89c1\u5ea6",TotalVisibility:"\u603b\u53ef\u89c1\u5ea6"},sensorPanel:{LightSensor:"\u5149\u4f20\u611f\u5668",WeatherDataFrom:"\u6c14\u8c61\u6570\u636e\u6765\u81ea"},buildingEnergyPanel:{DailyBuildingEnergy:"\u5efa\u7b51\u7269\u65e5\u80fd\u8017",YearlyBuildingEnergy:"\u5efa\u7b51\u7269\u5e74\u80fd\u8017",Heater:"\u6696\u6c14",AC:"\u7a7a\u8c03",SolarPanel:"\u5149\u4f0f",Net:"\u51c0\u80fd\u8017"},solarPanelYieldPanel:{SolarPanelDailyYield:"\u5149\u4f0f\u65e5\u53d1\u7535\u91cf",SolarPanelYearlyYield:"\u5149\u4f0f\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualSolarPanels:"\u663e\u793a\u6bcf\u884c\u5149\u4f0f\u677f\u5355\u72ec\u53d1\u7535\u91cf",Profit:"\u5229\u6da6",TotalCost:"\u603b\u6210\u672c",TotalRevenue:"\u603b\u6536\u5165",TotalYield:"\u603b\u53d1\u7535\u91cf",MeanYield:"\u5e73\u5747\u53d1\u7535\u91cf",ModuleCount:"\u5149\u4f0f\u677f\u603b\u6570"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"\u629b\u7269\u7ebf\u69fd\u65e5\u53d1\u7535\u91cf",ParabolicTroughYearlyYield:"\u629b\u7269\u7ebf\u69fd\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualParabolicTroughs:"\u663e\u793a\u6bcf\u884c\u629b\u7269\u7ebf\u69fd\u5355\u72ec\u53d1\u7535\u91cf"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"\u629b\u7269\u7ebf\u789f\u65e5\u53d1\u7535\u91cf",ParabolicDishYearlyYield:"\u629b\u7269\u7ebf\u789f\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualParabolicDishes:"\u663e\u793a\u6bcf\u4e2a\u629b\u7269\u7ebf\u789f\u5355\u72ec\u53d1\u7535\u91cf"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u65e5\u53d1\u7535\u91cf",FresnelReflectorYearlyYield:"\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualFresnelReflectors:"\u663e\u793a\u6bcf\u4e2a\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u5355\u72ec\u53d1\u7535\u91cf"},heliostatYieldPanel:{HeliostatDailyYield:"\u5b9a\u65e5\u955c\u65e5\u53d1\u7535\u91cf",HeliostatYearlyYield:"\u5b9a\u65e5\u955c\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualHeliostats:"\u663e\u793a\u6bcf\u4e2a\u5b9a\u65e5\u955c\u5355\u72ec\u53d1\u7535\u91cf"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u65e5\u53d1\u7535\u91cf",UpdraftTowerYearlyYield:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u5e74\u53d1\u7535\u91cf",ChimneyAirTemperature:"\u70df\u56f1\u7a7a\u6c14\u6e29\u5ea6",ChimneyWindSpeed:"\u70df\u56f1\u98ce\u901f",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualUpdraftTowers:"\u663e\u793a\u6bcf\u4e2a\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u5355\u72ec\u53d1\u7535\u91cf"},heliodonPanel:{SunAndTimeSettings:"\u592a\u9633\u548c\u65f6\u95f4\u8bbe\u7f6e",SunAngles:"\u89d2\u5ea6",TwentyFourHours:"24\u5c0f\u65f6"},cloudFilePanel:{CopyTitle:"\u62f7\u8d1d\u6807\u9898",TitleCopiedToClipBoard:"\u6807\u9898\u62f7\u8d1d\u5230\u526a\u8d34\u677f",SearchByTitle:"\u6309\u6807\u9898\u641c\u7d22",MyLikes:"\u6211\u559c\u6b22\u7684\u6a21\u578b",MyCloudFiles:"\u6211\u7684\u4e91\u6587\u4ef6",GenerateLink:"\u751f\u6210\u94fe\u63a5",LinkGeneratedInClipBoard:"\u94fe\u63a5\u751f\u6210\u5230\u526a\u8d34\u677f",DoYouReallyWantToDelete:"\u60a8\u786e\u5b9a\u5220\u9664\u6b64\u6587\u4ef6",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"\u5982\u679c\u6b64\u6587\u4ef6\u5df2\u88ab\u5206\u4eab\u6216\u53d1\u5e03, \u6539\u540d\u4f1a\u4f7f\u5df2\u6709\u94fe\u63a5\u5931\u6548"},projectListPanel:{CopyTitle:"\u62f7\u8d1d\u6807\u9898",TitleCopiedToClipBoard:"\u6807\u9898\u62f7\u8d1d\u5230\u526a\u8d34\u677f",SearchByTitle:"\u6309\u6807\u9898\u641c\u7d22",MyProjects:"\u6211\u7684\u9879\u76ee",GenerateProjectLink:"\u751f\u6210\u9879\u76ee\u94fe\u63a5",ProjectLinkGeneratedInClipBoard:"\u9879\u76ee\u94fe\u63a5\u751f\u6210\u5230\u526a\u8d34\u677f",DoYouReallyWantToDeleteProject:"\u60a8\u786e\u5b9a\u5220\u9664\u9879\u76ee",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"\u5982\u679c\u6b64\u9879\u76ee\u5df2\u88ab\u5206\u4eab\u6216\u53d1\u5e03, \u6539\u540d\u4f1a\u4f7f\u5df2\u6709\u94fe\u63a5\u5931\u6548"},projectPanel:{ProjectSettings:"\u9879\u76ee\u8bbe\u5b9a",ThumbnailImageSize:"\u7f29\u7565\u56fe\u5927\u5c0f",ProjectByOtherPeople:"\u522b\u4eba\u7684\u9879\u76ee",Project:"\u9879\u76ee",ProjectType:"\u7c7b\u522b",ProjectDescription:"\u63cf\u8ff0",MakeDescriptionEditable:"\u7f16\u8f91\u63cf\u8ff0",MakeDescriptionNonEditable:"\u4e0d\u7f16\u8f91\u63cf\u8ff0",DoubleClickToMakeDescriptionEditable:"\u53cc\u51fb\u6b64\u63cf\u8ff0\u6fc0\u6d3b\u7f16\u8f91\u529f\u80fd",SolarPanelArray:"\u5149\u4f0f\u677f\u9635\u5217\u8bbe\u8ba1",CurateCurrentDesign:"\u6536\u85cf\u5f53\u524d\u8bbe\u8ba1",UpdateSelectedDesign:"\u66f4\u65b0\u9009\u4e2d\u8bbe\u8ba1",RemoveSelectedDesign:"\u5220\u9664\u9009\u4e2d\u8bbe\u8ba1",ClickToFlipSortingOrder:"\u70b9\u51fb\u9006\u8f6c\u6392\u5e8f\u65b9\u5411",DesignNotShownInSolutionSpaceClickToShow:"\u6b64\u8bbe\u8ba1\u76ee\u524d\u4e0d\u663e\u793a\u5728\u8bbe\u8ba1\u7a7a\u95f4\u5185\uff0c\u70b9\u51fb\u663e\u793a",DesignShownInSolutionSpaceClickToHide:"\u6b64\u8bbe\u8ba1\u76ee\u524d\u663e\u793a\u5728\u8bbe\u8ba1\u7a7a\u95f4\u5185,\u70b9\u51fb\u9690\u85cf",DistributionInSolutionSpace:"\u65b9\u6848\u5728\u8bbe\u8ba1\u7a7a\u95f4\u91cc\u7684\u5206\u5e03",ChooseSolutionSpace:"\u9009\u62e9\u8bbe\u8ba1\u7a7a\u95f4",ChooseDataColoring:"\u9009\u62e9\u6570\u636e\u7740\u8272",SameColorForAllDesigns:"\u6240\u6709\u8bbe\u8ba1\u4e00\u4e2a\u989c\u8272",OneColorForEachDesign:"\u6bcf\u4e2a\u8bbe\u8ba1\u4e00\u4e2a\u989c\u8272",SolutionSpaceScreenshot:"\u8bbe\u8ba1\u7a7a\u95f4\u622a\u56fe",ScatteredPlotScreenshot:"\u6563\u70b9\u56fe\u622a\u56fe",SingleClickToSelectDoubleClickToOpen:"\u5355\u51fb\u9009\u62e9\uff0c\u53cc\u51fb\u6253\u5f00\u3002",SingleClickToDeselectDoubleClickToOpen:"\u5355\u51fb\u53d6\u6d88\u9009\u62e9\uff0c\u53cc\u51fb\u6253\u5f00\u3002",GenerateScatteredPlot:"\u751f\u6210\u6563\u70b9\u56fe",SelectXAxis:"\u9009\u62e9X\u8f74",SelectYAxis:"\u9009\u62e9Y\u8f74"},accountSettingsPanel:{MyAccountSettings:"\u6211\u7684\u8d26\u6237\u8bbe\u5b9a",MyID:"\u6211\u7684\ud83c\udd94",ClickToCopyMyID:"\u70b9\u51fb\u6b64\u5904\u62f7\u8d1d\u6211\u7684ID",IDInClipBoard:"\u60a8\u73b0\u5728\u53ef\u4ee5\u7c98\u8d34ID\u4e86\u3002",StoreMyNameInMyFilesWhenSaving:"\u4fdd\u5b58\u6587\u4ef6\u65f6\u7b7e\u4e0a\u6211\u7684\u5927\u540d",DoYouReallyWantToShowYourNameInYourFiles:"\u60a8\u786e\u5b9a\u5728\u60a8\u7684\u6587\u4ef6\u91cc\u4fdd\u5b58\u60a8\u7684\u5927\u540d\u5417\uff1f",SignFileDisclaimer:"\u5982\u679c\u60a8\u9009\u62e9\u4fdd\u5b58\uff0c\u60a8\u7684\u5927\u540d\u53ef\u80fd\u88ab\u6240\u6709\u6253\u5f00\u60a8\u7684\u6587\u4ef6\u7684\u4eba\u770b\u5230\u3002",Likes:"\u70b9\u8d5e\u603b\u6570",AllPublished:"\u53d1\u5e03\u603b\u6570",PublishedUnderAliases:"\u522b\u540d\u53d1\u5e03",UserCount:"\u7528\u6237\u603b\u6570",SchoolID:"\u5b66\u6821\u7f16\u53f7",ClassID:"\u73ed\u7ea7\u7f16\u53f7"},weatherPanel:{SunshineHours:"\u65e5\u7167\u65f6\u95f4"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"\u9009\u62e9\u6c14\u6e29\u6a21\u578b",Sinusoidal:"\u6b63\u5f26\u51fd\u6570"},economicsPanel:{EconomicsParameters:"\u7ecf\u6d4e\u5b66\u53c2\u6570",ElectricitySellingPrice:"\u9500\u552e\u7535\u4ef7",OperationalCostPerUnit:"\u5355\u4f4d\u8fd0\u884c\u6210\u672c",SellingPrice:"\u9500\u552e\u7535\u4ef7",UnitCost:"\u5355\u4f4d\u6210\u672c"},navigationPanel:{NavigationParameters:"\u5bfc\u822a\u6a21\u5f0f\u53c2\u6570",MinimumMoveSpeed:"\u6700\u5c0f\u79fb\u52a8\u901f\u5ea6",MinimumTurnSpeed:"\u6700\u5c0f\u62d0\u5f2f\u901f\u5ea6"},yearlyLightSensorPanel:{SkyClearness:"\u5929\u7a7a\u6e05\u6670\u5ea6",ShowDaylightResults:"\u663e\u793a\u65e5\u7167\u65f6\u95f4\u7ed3\u679c",ShowSkyClearnessResults:"\u663e\u793a\u5929\u7a7a\u6e05\u6670\u5ea6\u7ed3\u679c",ShowAverageDailySolarRadiation:"\u663e\u793a\u65e5\u5e73\u5747\u8f90\u5c04\u7ed3\u679c"},analysisManager:{NoSensorForCollectingData:"\u6ca1\u6709\u4f20\u611f\u5668\u6536\u96c6\u6570\u636e\u3002",NoSolarPanelForAnalysis:"\u6ca1\u6709\u5149\u4f0f\u677f\u53ef\u4ee5\u5206\u6790\u3002",NoObserverForVisibilityAnalysis:"\u6ca1\u6709\u627e\u5230\u53ef\u89c1\u5ea6\u5206\u6790\u7684\u89c2\u5bdf\u8005\u3002",NoWaterHeaterForAnalysis:"\u6c92\u6709\u592a\u9633\u80fd\u70ed\u6c34\u5668\u53ef\u4ee5\u5206\u6790\u3002",NoParabolicDishForAnalysis:"\u6c92\u6709\u629b\u7269\u7ebf\u789f\u53ef\u4ee5\u5206\u6790\u3002",NoParabolicTroughForAnalysis:"\u6c92\u6709\u629b\u7269\u7ebf\u69fd\u53ef\u4ee5\u5206\u6790\u3002",NoFresnelReflectorForAnalysis:"\u6c92\u6709\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u53ef\u4ee5\u5206\u6790\u3002",NoHeliostatForAnalysis:"\u6c92\u6709\u5b9a\u65e5\u955c\u53ef\u4ee5\u5206\u6790\u3002",NoSolarUpdraftTowerForAnalysis:"\u6c92\u6709\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u53ef\u4ee5\u5206\u6790\u3002",NoBuildingForAnalysis:"\u6c92\u6709\u5efa\u7b51\u7269\u53ef\u4ee5\u5206\u6790\u3002"},toolbar:{CloudFile:"\u4e91\u6587\u4ef6",Select:"\u9009\u62e9",AddFoundation:"\u6dfb\u52a0\u5730\u57fa",AddWall:"\u6dfb\u52a0\u5899\u4f53",AddWindow:"\u6dfb\u52a0\u7a97\u6237",AddDoor:"\u6dfb\u52a0\u95e8",AddPyramidRoof:"\u6dfb\u52a0\u91d1\u5b57\u5854\u5c4b\u9876",AddGableRoof:"\u6dfb\u52a0\u53cc\u5761\u5c4b\u9876",AddHipRoof:"\u6dfb\u52a0\u56db\u5761\u5c4b\u9876",AddGambrelRoof:"\u6dfb\u52a0\u590d\u659c\u5c4b\u9876",AddMansardRoof:"\u6dfb\u52a0\u6298\u7ebf\u5c4b\u9876",AddCuboid:"\u6dfb\u52a0\u957f\u65b9\u4f53",AddSensor:"\u6dfb\u52a0\u4f20\u611f\u5668",AddSolarPanel:"\u6dfb\u52a0\u5149\u4f0f\u677f",AddWaterHeater:"\u6dfb\u52a0\u592a\u9633\u80fd\u70ed\u6c34\u5668",AddParabolicDish:"\u6dfb\u52a0\u629b\u7269\u7ebf\u789f",AddParabolicTrough:"\u6dfb\u52a0\u629b\u7269\u7ebf\u69fd",AddFresnelReflector:"\u6dfb\u52a0\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AddHeliostat:"\u6dfb\u52a0\u5b9a\u65e5\u955c",AddWindTurbine:"\u6dfb\u52a0\u98ce\u529b\u6da1\u8f6e\u673a",AddLight:"\u6dfb\u52a0\u7535\u706f",AddTree:"\u6dfb\u52a0\u6811\u6728",AddFlower:"\u6dfb\u52a0\u82b1\u8349",AddPeople:"\u6dfb\u52a0\u4eba\u7269",DoubleClickToLockThisModeForNextAction:"\u53cc\u51fb\u6309\u94ae\u7ed9\u4e0b\u4e2a\u52a8\u4f5c\u9501\u5b9a\u6b64\u6a21\u5f0f",ClickToUnlockThisModeForNextAction:"\u70b9\u51fb\u6309\u94ae\u8ba9\u52a8\u4f5c\u5b8c\u6210\u5373\u79bb\u5f00\u6b64\u6a21\u5f0f",ManipulateGroup:"\u6574\u4f53\u64cd\u4f5c\u4e00\u4e2a\u7ec4",ClearScene:"\u6e05\u7a7a\u573a\u666f",ShowSunAndTimeSettings:"\u663e\u793a\u592a\u9633\u548c\u65f6\u95f4\u8bbe\u7f6e",SpatialAnalysisOfEnergy:"\u80fd\u91cf\u7684\u7a7a\u95f4\u5206\u6790",DoYouReallyWantToClearContent:"\u60a8\u786e\u5b9a\u6e05\u7a7a\u573a\u666f\u5417",ClickForMoreButtons:"\u70b9\u51fb\u6b64\u5904\u5207\u6362\u5230\u66f4\u591a\u7684\u6309\u94ae\u6a21\u5f0f",SwitchToAddingFoundation:"\u5207\u6362\u5230\u6dfb\u52a0\u5730\u57fa\u6a21\u5f0f",SwitchToAddingCuboid:"\u5207\u6362\u5230\u6dfb\u52a0\u957f\u65b9\u4f53\u6a21\u5f0f",SwitchToAddingWall:"\u5207\u6362\u5230\u6dfb\u52a0\u5899\u4f53\u6a21\u5f0f",SwitchToAddingWindow:"\u5207\u6362\u5230\u6dfb\u52a0\u7a97\u6237\u6a21\u5f0f",SwitchToAddingDoor:"\u5207\u6362\u5230\u6dfb\u52a0\u95e8\u6a21\u5f0f",SwitchToAddingPyramidRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u91d1\u5b57\u5854\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingGableRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u53cc\u5761\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingHipRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u56db\u5761\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingGambrelRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u590d\u659c\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingMansardRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u6298\u7ebf\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingSolarPanel:"\u5207\u6362\u5230\u6dfb\u52a0\u5149\u4f0f\u677f\u6a21\u5f0f",SwitchToAddingSensor:"\u5207\u6362\u5230\u6dfb\u52a0\u4f20\u611f\u5668\u6a21\u5f0f",SwitchToAddingWaterHeater:"\u5207\u6362\u5230\u6dfb\u52a0\u592a\u9633\u80fd\u70ed\u6c34\u5668\u6a21\u5f0f",SwitchToAddingParabolicDish:"\u5207\u6362\u5230\u6dfb\u52a0\u629b\u7269\u7ebf\u789f\u6a21\u5f0f",SwitchToAddingParabolicTrough:"\u5207\u6362\u5230\u6dfb\u52a0\u629b\u7269\u7ebf\u69fd\u6a21\u5f0f",SwitchToAddingFresnelReflector:"\u5207\u6362\u5230\u6dfb\u52a0\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u6a21\u5f0f",SwitchToAddingHeliostat:"\u5207\u6362\u5230\u6dfb\u52a0\u5b9a\u65e5\u955c\u6a21\u5f0f",SwitchToAddingWindTurbine:"\u5207\u6362\u5230\u6dfb\u52a0\u98ce\u529b\u6da1\u8f6e\u673a\u6a21\u5f0f",SwitchToAddingLight:"\u5207\u6362\u5230\u6dfb\u52a0\u7535\u706f\u6a21\u5f0f",SwitchToAddingTree:"\u5207\u6362\u5230\u6dfb\u52a0\u6811\u6728\u6a21\u5f0f",SwitchToAddingFlower:"\u5207\u6362\u5230\u6dfb\u52a0\u82b1\u8349\u6a21\u5f0f",SwitchToAddingPeople:"\u5207\u6362\u5230\u6dfb\u52a0\u4eba\u7269\u6a21\u5f0f"},tooltip:{gotoIFI:"\u8bbf\u95ee\u672a\u6765\u667a\u80fd\u7814\u7a76\u6240",visitAladdinHomePage:"\u8bbf\u95ee\u963f\u62c9\u4e01\u4e3b\u9875",clickToOpenMenu:"\u70b9\u51fb\u6253\u5f00\u4e3b\u83dc\u5355",clickToAccessAccountSettings:"\u70b9\u51fb\u6253\u5f00\u8d26\u53f7\u8bbe\u5b9a"},tree:{Apple:"\u82f9\u679c\u6811",Birch:"\u767d\u6866",Coconut:"\u6930\u5b50\u6811",Dogwood:"\u8331\u8438",Elm:"\u6986\u6811",FanPalm:"\u6247\u53f6\u68d5\u6988",Linden:"\u83e9\u63d0",Magnolia:"\u7389\u5170",Maple:"\u67ab\u6811",Oak:"\u6a61\u6811",Pine:"\u677e\u6811",Spruce:"\u4e91\u6749"},flower:{Bellflower:"\u94c3\u5170",Boxwood:"\u9ec4\u6768",CactusCombo1:"\u4ed9\u4eba\u638c\u7ec4\u5408\u4e00",CactusCombo2:"\u4ed9\u4eba\u638c\u7ec4\u5408\u4e8c",CactusCombo3:"\u4ed9\u4eba\u638c\u7ec4\u5408\u4e09",CactusCombo4:"\u4ed9\u4eba\u638c\u7ec4\u5408\u56db",Hibiscus:"\u6728\u69ff",Hosta:"\u7389\u7c2a",Hydrangea:"\u7ee3\u7403\u82b1",Peony:"\u7261\u4e39",RedRose:"\u7ea2\u73ab\u7470",Spirea:"\u7ee3\u7ebf\u83ca",Sunflower:"\u5411\u65e5\u8475",TallBush:"\u9ad8\u704c\u6728",Tulip:"\u90c1\u91d1\u9999",WhiteFlower:"\u767d\u82b1",YellowFlower:"\u9ec4\u82b1"},people:{Jaah:"\u8d3e\u963f",Jack:"\u6770\u514b",Jacob:"\u96c5\u5404\u5e03",Jacqueline:"\u6770\u594e\u7433",Jade:"\u7f8e\u7389",Jamelia:"\u6d01\u7c73\u8389\u96c5",James:"\u8a79\u59c6\u65af",Jane:"\u7b80",Jaya:"\u4f73\u5a05",Jaye:"\u6770\u4f0a",Jeanette:"\u73cd\u59ae\u7279",Jedi:"\u6770\u8fea",Jeff:"\u6770\u592b",Jena:"\u73cd\u5a1c",Jennifer:"\u73cd\u5c3c\u5f17",Jess:"\u6770\u897f",Jett:"\u6770\u7279",Jill:"\u5409\u5c14",Jiya:"\u5409\u5a05",Joan:"\u743c",Jocelyn:"\u4e54\u65af\u6797",Joel:"\u4e54\u5c14",Joey:"\u4e54\u4f0a",John:"\u7ea6\u7ff0",Jonathon:"\u4e54\u7eb3\u68ee",Jose:"\u4f55\u585e",Joseph:"\u7ea6\u745f\u592b",Joshua:"\u7ea6\u4e66\u4e9a",Judd:"\u8d3e\u5fb7",Judy:"\u6731\u8482",Julia:"\u6731\u8389\u5a05",Julio:"\u80e1\u91cc\u5965",Jumapili:"\u7956\u739b\u5339\u8389",June:"\u51c6\u536b",Juro:"\u6731\u8bfa",Justin:"\u8d3e\u65af\u6c40"},compass:{N:"\u5317",S:"\u5357",W:"\u897f",E:"\u4e1c"},month:{January:"\u4e00\u6708",February:"\u4e8c\u6708",March:"\u4e09\u6708",April:"\u56db\u6708",May:"\u4e94\u6708",June:"\u516d\u6708",July:"\u4e03\u6708",August:"\u516b\u6708",September:"\u4e5d\u6708",October:"\u5341\u6708",November:"\u5341\u4e00\u6708",December:"\u5341\u4e8c\u6708"},modelsMap:{SearchByPublisher:"\u6309\u53d1\u5e03\u8005\u641c\u7d22",SearchByLabel:"\u6309\u6807\u7b7e\u641c\u7d22",MyPublishedModels:"\u6211\u53d1\u5e03\u7684\u6a21\u578b",TotalNumberOfUserPublishedModels:"\u7528\u6237\u53d1\u5e03\u7684\u6a21\u578b\u603b\u6570",SortFromOldestToNewest:"\u4ece\u65e9\u5230\u665a\u6392\u5e8f",SortFromNewestToOldest:"\u4ece\u665a\u5230\u65e9\u6392\u5e8f",ModelsFoundOnThisSite:"\u4e2a\u6a21\u578b\u5728\u6b64\u4f4d\u7f6e",ShowModelsPublishedByThisAuthor:"\u5c55\u793a\u6b64\u7528\u6237\u53d1\u5e03\u7684\u6a21\u578b"}}},zh_tw:{translation:{name:{IFI:"\u672a\u4f86\u667a\u80fd\u7814\u7a76\u6240",Aladdin:"\u963f\u62c9\u4e01",Tagline:"\u963f\u62c9\u4e01: \u63a2\u7d22\u4eba\u5de5\u667a\u6167\u6642\u4ee3\u7684\u8a2d\u8a08\u8edf\u9ad4 \u2014 \u672a\u4f86\u667a\u80fd\u7814\u7a76\u6240\u7814\u767c"},cookie:{Statement:"\u8072\u660e\uff1a\u70ba\u4e86\u6539\u5584\u60a8\u7684\u7528\u6236\u9ad4\u9a57\uff0c\u963f\u62c9\u4e01\u63a1\u7528cookie\u5132\u5b58\u5c11\u91cf\u6578\u64da\u3002",Accept:"\u540c\u610f"},aboutUs:{ProductBroughtToYouBy:"\u672a\u4f86\u667a\u80fd\u7814\u7a76\u6240\u69ae\u8b7d\u51fa\u54c1",TermsOfService:"\u670d\u52d9\u689d\u6b3e",PrivacyPolicy:"\u96b1\u79c1\u653f\u7b56",Software:"\u8edf\u9ad4",Content:"\u8ab2\u4ef6",Research:"\u7814\u7a76",Support:"\u670d\u52d9",Acknowledgment:"\u9cf4\u8b1d",FundingInformation:"\u672c\u7522\u54c1\u7684\u7814\u767c\u627f\u8499\u7f8e\u570b\u570b\u5bb6\u79d1\u5b78\u57fa\u91d1\u6703\u6177\u6168\u8cc7\u52a9\uff08\u9805\u76ee\u865f#2105695\uff0c#2131097\uff0c#2301164\uff09\u3002\u672c\u7522\u54c1\u7684\u4efb\u4f55\u89c0\u9ede\u6216\u7d50\u8ad6\u50c5\u4ee3\u8868\u5275\u4f5c\u8005\u500b\u4eba\u610f\u898b\u3002",Contact:"\u5982\u60a8\u9700\u8981\u66f4\u591a\u8cc7\u8a0a\uff0c\u8acb\u806f\u7e6b Charles Xie (charles@intofuture.org)\u3002\u6211\u5011\u6703\u76e1\u5feb\u56de\u590d\u3002",Translators:"\u7ffb\u8b6f"},word:{LastUpdate:"\u4e0a\u4e00\u6b21\u66f4\u65b0",Small:"\u5c0f",Medium:"\u4e2d",Large:"\u5927",Design:"\u8a2d\u8a08",Information:"\u8cc7\u8a0a",Type:"\u985e\u522b",Text:"\u6587\u5b57",FontSize:"\u5b57\u9ad4\u5927\u5c0f",FontColor:"\u5b57\u9ad4\u984f\u8272",Model:"\u6a21\u578b",Models:"\u6a21\u578b",Upload:"\u4e0a\u50b3",ClickCount:"\u9ede\u64ca\u6578",Share:"\u5206\u4eab",AlreadyLike:"\u5df2\u9ede\u8d0a",Like:"\u9ede\u8d0a",MustLogInToLike:"\u5fc5\u9808\u767b\u9304\u624d\u80fd\u9ede\u8d0a",AllRightsReserved:"\u7248\u6b0a\u6240\u6709",MeterAbbreviation:"\u7c73",Version:"\u7248\u672c",VersionInitial:"\u7248\u672c",Options:"\u9078\u9805",Maximum:"\u6700\u5927",Minimum:"\u6700\u5c0f",MaximumNumber:"\u6700\u591a",MinimumNumber:"\u6700\u5c11",MaximumValue:"\u6700\u5927\u503c",MinimumValue:"\u6700\u5c0f\u503c",Or:"\u6216",None:"\u7121",High:"\u9ad8",Partial:"\u90e8\u5206",Teacher:"\u8001\u5e2b",Class:"\u73ed\u7d1a",Total:"\u7e3d\u6578",Leaderboard:"\u7528\u6236\u6392\u884c\u699c",Latest:"\u6700\u65b0",Range:"\u7bc4\u570d",SIUnit:"\u570b\u969b\u55ae\u4f4d\u5236",USUnit:"\u7f8e\u570b\u55ae\u4f4d\u5236",ThermalTransmittance:"\u71b1\u900f\u904e\u7387",ThermalResistance:"\u71b1\u963b",UValue:"U\u503c",RValue:"R\u503c",VolumetricHeatCapacity:"\u5bb9\u7a4d\u71b1\u5bb9",BuildingHVACSystem:"\u5efa\u7bc9\u7269\u6696\u901a\u7a7a\u8abf\u7cfb\u7d71",ThermostatSetpoint:"\u6046\u6eab\u5668\u8a2d\u5b9a\u503c",TemperatureToleranceThreshold:"\u6eab\u5ea6\u5fcd\u8010\u95be\u503c",TemperatureToleranceThresholdExplanation:"\u7576\u65e5\u6700\u4f4e\u5916\u9762\u6eab\u5ea6\u9ad8\u65bc\u6046\u6eab\u5668\u8a2d\u5b9a\u503c\u6e1b\u53bb\u6b64\u95be\u503c\uff0c\u6696\u6c23\u4e0d\u958b\u3002\n\u7576\u65e5\u6700\u9ad8\u5916\u9762\u6eab\u5ea6\u4f4e\u65bc\u6046\u6eab\u5668\u8a2d\u5b9a\u503c\u52a0\u4e0a\u6b64\u95be\u503c\uff0c\u7a7a\u8abf\u4e0d\u958b\u3002",Press:"\u6309",Open:"\u6253\u958b",Save:"\u4fdd\u5b58",SaveAsImage:"\u4fdd\u5b58\u70ba\u5716\u50cf",SaveAsCsv:"\u4fdd\u5b58\u70baCSV",Update:"\u5237\u65b0",Paste:"\u7c98\u8cbc",Copy:"\u8907\u88fd",Cut:"\u526a\u5207",Delete:"\u5220\u9664",Lock:"\u56fa\u5b9a",Translucent:"\u534a\u900f\u660e",Color:"\u984f\u8272",Texture:"\u6750\u8cea",Thickness:"\u539a\u5ea6",Size:"\u5c3a\u5bf8",Yes:"\u662f",No:"\u4e0d",OK:"\u78ba\u5b9a",Cancel:"\u53d6\u6d88",Apply:"\u61c9\u7528",Close:"\u95dc\u9589",ApplyTo:"\u9069\u7528\u65bc",Run:"\u904b\u884c",Pause:"\u66ab\u505c",Resume:"\u7e7c\u7e8c",Clear:"\u6e05\u7a7a",Warning:"\u8b66\u544a",Caution:"\u5c0f\u5fc3",Reminder:"\u63d0\u9192",Length:"\u9577\u5ea6",Width:"\u5bec\u5ea6",Height:"\u9ad8\u5ea6",Radius:"\u534a\u5f91",Angle:"\u89d2\u5ea6",Azimuth:"\u65b9\u4f4d\u89d2",Coordinates:"\u5750\u6a19",Weather:"\u5929\u6c23",Show:"\u986f\u793a",Animate:"\u52d5\u756b",Date:"\u65e5\u671f",Time:"\u6642\u9593",Title:"\u6a19\u984c",Owner:"\u6240\u6709\u8005",Action:"\u64cd\u4f5c",Rename:"\u6539\u540d",Location:"\u4f4d\u7f6e",Latitude:"\u7def\u5ea6",Month:"\u6708\u4efd",Day:"\u5929",Hour:"\u5c0f\u6642",Daylight:"\u767d\u5929\u9577\u5ea6",Radiation:"\u8f3b\u5c04",Temperature:"\u6e29\u5ea6",kWh:"\u5343\u74e6\u6642",dollar:"\u5143",MeterPerSecond:"\u7c73/\u79d2",NorthInitial:"\u5317",SouthInitial:"\u5357",EastInitial:"\u6771",WestInitial:"\u897f",Fixed:"\u56fa\u5b9a",Elements:"\u90e8\u4ef6",Energy:"\u80fd\u91cf",Unknown:"\u672a\u77e5",Label:"\u6a19\u7c64",Description:"\u63cf\u8ff0",NoDescription:"\u7121\u63cf\u8ff0",MaximumCharacters:"\u6700\u591a\u5b57\u7b26\u6578",Author:"\u4f5c\u8005",Publisher:"\u767c\u5e03\u8005",Building:"\u5efa\u7bc9",ResidentialBuilding:"\u4f4f\u5b85\u5efa\u7bc9",CommercialBuilding:"\u5546\u7528\u5efa\u7bc9",SchoolBuilding:"\u5b78\u6821\u5efa\u7bc9",TouristAttraction:"\u65c5\u904a\u666f\u9ede",UnderConstruction:"\u5728\u5efa",Photovoltaic:"\u5149\u4f0f",Anonymous:"\u7121\u540d\u6c0f",Nickname:"\u522b\u540d",Pin:"\u7f6e\u9802",Unpin:"\u89e3\u9664\u7f6e\u9802"},shared:{NoTexture:"\u7121\u6750\u8cea",FoundationElement:"\u5730\u57fa",CuboidElement:"\u9577\u65b9\u9ad4",PolygonElement:"\u591a\u908a\u5f62",SensorElement:"\u50b3\u611f\u5668",SolarPanelElement:"\u5149\u4f0f\u677f",WaterHeaterElement:"\u592a\u967d\u80fd\u71b1\u6c34\u5668",ParabolicDishElement:"\u62cb\u7269\u7dda\u789f",ParabolicTroughElement:"\u62cb\u7269\u7dda\u69fd",FresnelReflectorElement:"\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",HeliostatElement:"\u5b9a\u65e5\u93e1",WindTurbineElement:"\u98a8\u529b\u6e26\u8f2a\u6a5f",LightElement:"\u96fb\u71c8",ElementLocked:"\u56fa\u5b9a",ModelType:"\u6a21\u578b\u985e\u522b",OutputBreakdown:"\u5206\u5217\u767c\u96fb\u91cf",MoreResults:"\u66f4\u591a\u7d50\u679c"},message:{ModelNotFound:"\u6c92\u6709\u627e\u5230\u6a21\u578b",CannotSignIn:"\u767b\u9304\u5931\u6557",CannotSignOut:"\u9000\u51fa\u5931\u6557",YourAccountWasCreated:"\u6210\u529f\u5efa\u7acb\u60a8\u7684\u8cec\u865f\u3002",CannotCreateAccount:"\u7121\u6cd5\u5275\u5efa\u8cec\u865f",YourAccountSettingsWereSaved:"\u60a8\u7684\u8cec\u865f\u8a2d\u5b9a\u5df2\u4fdd\u5b58\u3002",CannotSaveYourAccountSettings:"\u60a8\u7684\u8cec\u865f\u8a2d\u5b9a\u7121\u6cd5\u4fdd\u5b58",CannotSaveYourFileToCloud:"\u7121\u6cd5\u4fdd\u5b58\u60a8\u7684\u6587\u6a94\u5230\u96f2\u7aef",CannotCreateNewProject:"\u7121\u6cd5\u5275\u5efa\u65b0\u9805\u76ee",CannotCreateNewProjectWithoutTitle:"\u6c92\u6709\u6a19\u984c, \u7121\u6cd5\u5275\u5efa\u65b0\u9805\u76ee",CannotOpenYourProjects:"\u7121\u6cd5\u6253\u958b\u60a8\u7684\u9805\u76ee\u5217\u8868",CannotOpenProject:"\u7121\u6cd5\u6253\u958b\u9805\u76ee",CannotDeleteProject:"\u7121\u6cd5\u522a\u9664\u9805\u76ee",CannotRenameProject:"\u7121\u6cd5\u7d66\u9805\u76ee\u6539\u540d",CannotAddDesignToProject:"\u7121\u6cd5\u628a\u6b64\u8a2d\u8a08\u52a0\u5230\u9805\u76ee\u88e1",CannotAddDesignToProjectOwnedByOthers:"\u4e0d\u80fd\u628a\u6b64\u8a2d\u8a08\u52a0\u5230\u5225\u4eba\u7684\u9805\u76ee\u88e1",DesignRemovedFromProject:"\u8a2d\u8a08\u88ab\u6210\u529f\u5730\u5f9e\u9805\u76ee\u88e1\u522a\u9664",CannotRemoveDesignFromProject:"\u7121\u6cd5\u628a\u6b64\u8a2d\u8a08\u5f9e\u9805\u76ee\u88e1\u522a\u9664",CannotUpdateProject:"\u7121\u6cd5\u66f4\u65b0\u9805\u76ee",CannotFetchProjectData:"\u7121\u6cd5\u53d6\u5f97\u9805\u76ee\u6578\u64da",TitleUsedChooseDifferentOne:"\u6b64\u6a19\u984c\u5df2\u7d93\u88ab\u4f7f\u7528, \u8acb\u63a1\u7528\u4e0d\u540c\u7684\u6a19\u984c",CloudFileWithTitleExistsDoYouWantToOverwrite:"\u4f7f\u7528\u6b64\u6a19\u984c\u7684\u96f2\u6587\u6a94\u5df2\u7d93\u5b58\u5728\uff0c\u60a8\u78ba\u5b9a\u8981\u8986\u84cb\u5b83\u55ce\uff1f",CloudFileNotFound:"\u627e\u4e0d\u5230\u6b64\u4e91\u7aef\u6587\u6a94",CannotLoadModelsOnMap:"\u7121\u6cd5\u4e0b\u8f09\u5730\u5716\u4e0a\u7684\u6a21\u578b",CannotLoadLeaderboard:"\u7121\u6cd5\u4e0b\u8f09\u6392\u884c\u699c",CannotPublishModelOnMap:"\u6a21\u578b\u7121\u6cd5\u767c\u4f48\u5230\u5730\u5716\u4e0a",CannotLikeModelFromMap:"\u7121\u6cd5\u9ede\u8d0a\u5730\u5716\u4e0a\u7684\u6a21\u578b",CannotDeleteModelFromMap:"\u7121\u6cd5\u5220\u9664\u5730\u5716\u4e0a\u7684\u6a21\u578b",ModelDeletedFromMap:"\u6a21\u578b\u5df2\u5f9e\u5730\u5716\u4e0a\u522a\u9664",DoYouWantToDeleteModelFromMap:"\u60a8\u8981\u5220\u9664\u5730\u5716\u4e0a\u7684\u9019\u500b\u6a21\u578b\u55ce\uff1f",CannotOpenCloudFile:"\u6b64\u4e91\u7aef\u6587\u6a94\u7121\u6cd5\u6253\u958b",CannotReadCloudFile:"\u7121\u6cd5\u8b80\u53d6\u6b64\u4e91\u7aef\u6587\u6a94",CannotWriteCloudFile:"\u7121\u6cd5\u5b58\u5132\u6b64\u4e91\u7aef\u6587\u6a94",CloudFileCopied:"\u62f7\u8c9d\u4e91\u7aef\u6587\u6a94",CannotOpenCloudFolder:"\u60a8\u7684\u96f2\u7aef\u6587\u6a94\u593e\u7121\u6cd5\u6253\u958b",CannotDeleteCloudFile:"\u7121\u6cd5\u522a\u9664\u6b64\u4e91\u7aef\u6587\u6a94",CannotRenameCloudFile:"\u6b64\u4e91\u7aef\u6587\u6a94\u7684\u540d\u5b57\u7121\u6cd5\u66f4\u6539",DoYouWantToSaveChanges:"\u60a8\u8981\u4fdd\u5b58\u7576\u524d\u6587\u6a94\u55ce\uff1f",NotApplicableToSelectedAction:"\u6b64\u503c\u4e0d\u9069\u7528\u65bc\u7576\u524d\u9078\u64c7\u7bc4\u570d",ThisElementIsLocked:"\u9019\u500b\u90e8\u4ef6\u88ab\u9396\u5b9a\u3002",ThisCannotBeUndone:"\u9019\u500b\u64cd\u4f5c\u4e00\u65e6\u57f7\u884c\u5c31\u4e0d\u80fd\u64a4\u92b7\u3002",AzimuthOfNorthIsZero:"\u6b63\u5317\u7684\u65b9\u4f4d\u89d2\u70ba\u96f6\u5ea6",CounterclockwiseAzimuthIsPositive:"\u9006\u6642\u91dd\u70ba\u6b63",MoveCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u758a\uff0c\u79fb\u52d5\u53d6\u6d88\u3002",MoveOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u79fb\u52d5\u53d6\u6d88\u3002",RotationCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u758a\uff0c\u65cb\u8f49\u53d6\u6d88\u3002",RotationOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u65cb\u8f49\u53d6\u6d88\u3002",ResizingCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u758a\uff0c\u5c3a\u5bf8\u8abf\u6574\u53d6\u6d88\u3002",ResizingOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u5c3a\u5bf8\u8abf\u6574\u53d6\u6d88\u3002",CannotPasteOutsideBoundary:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u4e0d\u80fd\u8907\u5236\u3002",CannotPasteBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u758a\uff0c\u4e0d\u80fd\u8907\u5236\u3002",CannotMoveObjectTooFar:"\u4f4d\u7f6e\u592a\u9060\uff0c\u79fb\u52d5\u53d6\u6d88\u3002",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"\u63a1\u7528\u65b0\u4f48\u5c40\u4e4b\u524d\u5fc5\u9808\u79fb\u9664\u73fe\u6709\u7684\u5149\u4f0f\u677f\u3002",DoYouWantToContinue:"\u60a8\u60f3\u7e7c\u7e8c\u55ce\uff1f",SolarPanelsCannotIntersectWithGround:"\u5149\u4f0f\u677f\u4e0d\u80fd\u548c\u5730\u9762\u63a5\u89f8\u3002",SolarPanelsCannotOverlapWithOneAnother:"\u5149\u4f0f\u677f\u4e0d\u80fd\u91cd\u758a\u3002",ScreenshotSaved:"\u622a\u5c4f\u5716\u7247\u4fdd\u5b58\u5728\u4e0b\u8f09\u6587\u6a94\u593e\u88e1\u3002",CsvFileSaved:"CSV\u4fdd\u5b58\u5728\u4e0b\u8f09\u6587\u6a94\u593e\u88e1\u3002",SimulationStarted:"\u6a21\u64ec\u958b\u59cb\u3002",SimulationCompleted:"\u6a21\u64ec\u7d50\u675f\u3002",SimulationAborted:"\u6a21\u64ec\u53d6\u6d88\u3002",SimulationPaused:"\u6a21\u64ec\u66ab\u505c\u3002",CancelSimulation:"\u53d6\u6d88\u6a21\u64ec",PauseSimulation:"\u66ab\u505c\u6a21\u64ec",ResumeSimulation:"\u7e7c\u7e8c\u6a21\u64ec",SimulationWillNotStartDueToErrors:"\u7531\u65bc\u932f\u8aa4\u6a21\u64ec\u7121\u6cd5\u904b\u884c",SimulationWillStartDespiteWarnings:"\u767c\u73fe\u554f\u984c\uff0c\u4f46\u6a21\u64ec\u4ecd\u7136\u5c07\u904b\u884c\u3002",EvolutionStarted:"\u6f14\u5316\u958b\u59cb\u3002",EvolutionCompleted:"\u6f14\u5316\u7d50\u675f\u3002",EvolutionAborted:"\u6f14\u5316\u53d6\u6d88\u3002",EvolutionPaused:"\u6f14\u5316\u66ab\u505c\u3002",EncounterEvolutionError:"\u6f14\u5316\u51fa\u932f\u3002",CancelEvolution:"\u53d6\u6d88\u6f14\u5316",PauseEvolution:"\u66ab\u505c\u6f14\u5316",ResumeEvolution:"\u7e7c\u7e8c\u6f14\u5316",ConvergenceThresholdHasBeenReached:"\u6536\u6582\u95be\u503c\u5df2\u9054\u5230\u3002",MaximumNumberOfGenerationsHasBeenReached:"\u6700\u5927\u4e16\u4ee3\u6578\u5df2\u9054\u5230\u3002",MaximumNumberOfStepsHasBeenReached:"\u6700\u5927\u6b65\u6578\u5df2\u9054\u5230\u3002",ObjectiveFunctionTypeError:"\u6b64\u64cd\u4f5c\u4e0d\u652f\u6301\u7576\u524d\u7684\u76ee\u6a19\u51fd\u6578\u3002\u8acb\u5f9e\u83dc\u55ae\u555f\u52d5\u6b64\u529f\u80fd\u3002",WallsAreNotAtSameHeight:"\u58bb\u9ad4\u9ad8\u5ea6\u4e0d\u540c\u3002",WallsAreNotPerpendicular:"\u58bb\u9ad4\u4e0d\u5782\u76f4\u3002",WallsAreNotConnected:"\u58bb\u9ad4\u4e0d\u76f8\u9023\u3002",WallsNumberNeedToBeFour:"\u58bb\u9ad4\u6578\u91cf\u5fc5\u9808\u70ba\u56db\u500b\u3002",BuildingContainsEmptyWall:"\u5efa\u7bc9\u7269\u6709\u7a7a\u7246\u3002",BuildingRoofMissing:"\u5efa\u7bc9\u7269\u6c92\u6709\u5c4b\u9802\u3002",UnknownErrors:"\u672a\u77e5\u932f\u8aa4\u3002"},menu:{AnalysisOptions:"\u5206\u6790\u9078\u9805",option:{GridCellSize:"\u8a08\u7b97\u7db2\u683c\u7684\u5c3a\u5bf8",SamplingFrequency:"\u63a1\u6a23\u983b\u7387",TimesPerHour:"\u6bcf\u5c0f\u6642\u63a1\u6a23\u6b21\u6578",DaysPerYear:"\u6bcf\u4e00\u5e74\u63a1\u6a23\u5929\u6578"},mainMenu:"\u4e3b\u83dc\u55ae",cloudMenu:"\u96f2\u83dc\u55ae",projectSubMenu:"\u9805\u76ee",project:{CreateNewProject:"\u5275\u5efa\u65b0\u9805\u76ee",OpenProject:"\u6253\u958b\u9805\u76ee",SaveProjectAs:"\u53e6\u5b58\u9805\u76ee\u70ba",YouMustLogInToCreateProject:"\u60a8\u5fc5\u9808\u767b\u9304\u624d\u80fd\u5275\u5efa\u9805\u76ee",YouMustLogInToOpenProject:"\u60a8\u5fc5\u9808\u767b\u9304\u624d\u80fd\u6253\u958b\u9805\u76ee"},fileSubMenu:"\u6587\u6a94",file:{CreateNewFile:"\u5275\u5efa\u65b0\u6587\u6a94",OpenLocalFile:"\u6253\u958b\u672c\u5730\u6587\u6a94",SaveAsLocalFile:"\u4fdd\u5b58\u70ba\u672c\u5730\u6587\u6a94",SavingAbortedMustHaveValidFileName:"\u6587\u6a94\u540d\u7121\u6548\uff0c\u4fdd\u5b58\u5931\u6557",OpenCloudFile:"\u6253\u958b\u96f2\u7aef\u6587\u6a94",SaveCloudFile:"\u4fdd\u5b58\u96f2\u7aef\u6587\u6a94",SaveAsCloudFile:"\u4fdd\u5b58\u70ba\u96f2\u7aef\u6587\u6a94",SavingAbortedMustHaveValidTitle:"\u96f2\u7aef\u6587\u6a94\u540d\u7121\u6548\uff0c\u4fdd\u5b58\u5931\u6557",ToSaveYourWorkPleaseSignIn:"\u70ba\u4e86\u4fdd\u5b58\u60a8\u7684\u96f2\u7aef\u6587\u6a94\uff0c\u8acb\u60a8\u5148\u767b\u9304\u3002",TakeScreenshot:"\u622a\u5c4f",UseCloudFileName:"\u63a1\u7528\u96f2\u7aef\u6587\u4ef6\u540d",PublishOnModelsMap:"\u767c\u4f48\u5230\u5730\u5716\u4e0a",PublishedOnModelsMap:"\u60a8\u7684\u6a21\u578b\u6210\u529f\u767c\u4f48\u5230\u5730\u5716\u4e0a",UpdatedOnModelsMap:"\u60a8\u7684\u6a21\u578b\u66f4\u65b0\u6210\u529f",YouMustLogInToPublishYourModel:"\u60a8\u5fc5\u9808\u767b\u9304\u624d\u80fd\u767c\u5e03\u6a21\u578b",YouCannotPublishAModelThatYouDoNotOwn:"\u60a8\u4e0d\u80fd\u767c\u5e03\u4ed6\u4eba\u7684\u6a21\u578b",YouMustSaveModelOnCloudBeforePublishingIt:"\u60a8\u5fc5\u9808\u5148\u628a\u6b64\u6a21\u578b\u4fdd\u5b58\u5728\u96f2\u7aef\u624d\u80fd\u767c\u5e03\u5b83"},editSubMenu:"\u7de8\u8f2f",edit:{Undo:"\u64a4\u92b7",Redo:"\u91cd\u505a"},viewSubMenu:"\u8996\u754c",view:{NavigationView:"\u5c0e\u822a\u6a21\u5f0f",TwoDimensionalView:"\u4e8c\u7dad\u6a21\u5f0f",ResetView:"\u91cd\u7f6e\u8996\u89d2",ZoomIn:"\u653e\u5927",ZoomOut:"\u7e2e\u5c0f",AutoRotate:"\u81ea\u52d5\u65cb\u8f49",ShowShadow:"\u986f\u793a\u9670\u5f71",ShowSurfaceShininess:"\u986f\u793a\u8868\u9762\u5149\u6fa4",TranslucentFloatingWindows:"\u900f\u660e\u6d6e\u52d5\u7a97\u53e3",accessoriesSubMenu:"\u914d\u4ef6",accessories:{SiteInformation:"\u4f4d\u7f6e\u8cc7\u8a0a",DesignInformation:"\u8a2d\u8a08\u8cc7\u8a0a",Instruction:"\u64cd\u4f5c\u8aaa\u660e",StickyNote:"\u4fbf\u7c3d",Note:"\u4fbf\u7c3d"}},settingsSubMenu:"\u8a2d\u7f6e",settings:{WeatherData:"\u6c23\u8c61\u6578\u64da",DiurnalTemperature:"\u665d\u591c\u6eab\u5ea6",Heliodon:"\u65e5\u5f71\u5100",SunAndTime:"\u592a\u967d\u548c\u6642\u9593"},benchmarksSubMenu:"\u57fa\u6e96",benchmarks:{SolarRadiationPredictionVsMeasurement:"\u592a\u967d\u80fd\u8f3b\u5c04\u6a21\u578b\u9810\u6e2c\u548c\u5be6\u969b\u6e2c\u91cf\u7684\u5c0d\u6bd4",BESTESTCase600:"\u5efa\u7bc9\u7269\u80fd\u8017\u6a21\u64ec\u6e2c\u8a66\uff1aBESTEST\u6848\u4f8b600",BESTESTCase610:"\u5efa\u7bc9\u7269\u80fd\u8017\u6a21\u64ec\u6e2c\u8a66\uff1aBESTEST\u6848\u4f8b610",BESTESTCase620:"\u5efa\u7bc9\u7269\u80fd\u8017\u6a21\u64ec\u6e2c\u8a66\uff1aBESTEST\u6848\u4f8b620",BESTESTCase630:"\u5efa\u7bc9\u7269\u80fd\u8017\u6a21\u64ec\u6e2c\u8a66\uff1aBESTEST\u6848\u4f8b630"},graph:{LineWidth:"\u7dda\u689d\u5bec\u5ea6",SymbolSize:"\u7b26\u865f\u5927\u5c0f",BarCategoryGap:"\u76f4\u689d\u9593\u9699",ShowHorizontalGridLines:"\u986f\u793a\u683c\u5b50\u7684\u6c34\u5e73\u7dda\u689d",ShowVerticalGridLines:"\u986f\u793a\u683c\u5b50\u7684\u8c4e\u76f4\u7dda\u689d"},analysisSubMenu:"\u5206\u6790",physicsSubMenu:"\u7269\u7406",physics:{DailySolarRadiationHeatmap:"\u7576\u65e5\u592a\u967d\u8f3b\u5c04\u7e3d\u91cf\u5206\u4f48\u71b1\u5716",SolarRadiationHeatmapOptions:"\u592a\u967d\u8f3b\u5c04\u71b1\u5716\u9078\u9805",SolarRadiationHeatmapGridCellSize:"\u592a\u967d\u8f3b\u5c04\u71b1\u5716\u7db2\u683c\u7684\u5c3a\u5bf8",SolarRadiationHeatmapMaxValue:"\u592a\u967d\u8f3b\u5c04\u71b1\u5716\u6700\u5927\u503c",SolarRadiationHeatmapNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b",ReflectionHeatmap:"\u53cd\u5c04\u71b1\u5716"},sensorSubMenu:"\u50b3\u611f\u5668",sensor:{CollectDailyData:"\u6536\u96c6\u7576\u5929\u6578\u64da",CollectYearlyData:"\u6536\u96c6\u5168\u5e74\u6578\u64da",SensorSimulationNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b"},buildingSubMenu:"\u5efa\u7bc9\u7269",building:{AnalyzeDailyBuildingEnergy:"\u5efa\u7bc9\u7269\u7576\u5929\u80fd\u8017\u5206\u6790",AnalyzeYearlyBuildingEnergy:"\u5efa\u7bc9\u7269\u5168\u5e74\u80fd\u8017\u5206\u6790",EnergyAnalysisOptions:"\u80fd\u8017\u5206\u6790\u9078\u9805",EnergyGridCellSize:"\u8a08\u7b97\u7db2\u683c\u7684\u5c3a\u5bf8",BuildingEnergySimulationNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b"},solarPanelSubMenu:"\u592a\u967d\u80fd\u5149\u4f0f\u677f",solarPanel:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa",AnalyzeVisibility:"\u5206\u6790\u53ef\u898b\u5ea6",PanelDiscretization:"\u5149\u4f0f\u677f\u96e2\u6563\u5316\u65b9\u6cd5",Exact:"\u6e96\u78ba",Approximate:"\u8fd1\u4f3c",EnergyGridCellSize:"\u8a08\u7b97\u7db2\u683c\u7684\u5c3a\u5bf8",VisibilityGridCellSize:"\u8996\u754c\u56e0\u5b50\u8a08\u7b97\u7db2\u683c\u7684\u5c3a\u5bf8",EnergyAnalysisOptions:"\u80fd\u91cf\u5206\u6790\u9078\u9805",VisibilityAnalysisOptions:"\u53ef\u898b\u5ea6\u5206\u6790\u9078\u9805",SolarPanelSimulationNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b"},parabolicTroughSubMenu:"\u62cb\u7269\u7dda\u69fd",parabolicTrough:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa"},parabolicDishSubMenu:"\u62cb\u7269\u7dda\u789f",parabolicDish:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa"},fresnelReflectorSubMenu:"\u83f2\u6d85\u723e\u53cd\u5c04\u93e1",fresnelReflector:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa"},heliostatSubMenu:"\u5b9a\u65e5\u93e1",heliostat:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa"},solarUpdraftTowerSubMenu:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854",solarUpdraftTower:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa",SolarUpdraftTowerSimulationNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b"},tutorialsSubMenu:"\u6559\u7a0b",solarEnergyScienceSubMenu:"\u592a\u967d\u80fd\u79d1\u5b78",solarEnergyScienceTutorials:{SunAngles:"\u592a\u967d\u76f8\u5c0d\u65bc\u5730\u9762\u89c0\u5bdf\u8005\u7684\u89d2\u5ea6",InsolationAndClimate:"\u592a\u967d\u8f3b\u5c04\u548c\u6c23\u5019\u7684\u95dc\u4fc2",SolarRadiationToBox:"\u4e00\u500b\u9577\u65b9\u9ad4\u53d7\u5230\u7684\u592a\u967d\u80fd\u8f3b\u5c04\u5206\u6790"},buildingScienceSubMenu:"\u5efa\u7bc9\u79d1\u5b78",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"\u623f\u5c4b\u7684\u71b1\u5b78\u5c01\u5957\u548c\u570d\u8b77\u5c01\u5957",EffectOfSizeOnBuildingEnergy:"\u623f\u5c4b\u5927\u5c0f\u5c0d\u80fd\u8017\u7684\u5f71\u97ff",EffectOfOrientationOnBuildingEnergy:"\u623f\u5c4b\u65b9\u4f4d\u5c0d\u80fd\u8017\u7684\u5f71\u97ff",EffectOfInsulationOnBuildingEnergy:"\u623f\u5c4b\u9694\u71b1\u5c0d\u80fd\u8017\u7684\u5f71\u97ff",EffectOfRoofColorOnBuildingEnergy:"\u5c4b\u9802\u984f\u8272\u5c0d\u5efa\u7bc9\u7269\u80fd\u8017\u7684\u5f71\u97ff",EffectOfEavesOverhangLengthOnBuildingEnergy:"\u5c4b\u7c37\u5ef6\u4f38\u9577\u5ea6\u5c0d\u5efa\u7bc9\u7269\u80fd\u8017\u7684\u5f71\u97ff",EffectOfWindowSHGCOnBuildingEnergy:"\u7a97\u6236\u592a\u967d\u80fd\u8f38\u5165\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff",EffectOfThermostatSetpointOnBuildingEnergy:"\u6046\u6eab\u5668\u8a2d\u5b9a\u503c\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff",EffectOfSolarPanelsOnBuildingEnergy:"\u5149\u4f0f\u677f\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff",EffectOfGroundTemperatureOnBuildingEnergy:"\u5730\u8868\u6e29\u5ea6\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff",EffectOfTreesOnBuildingEnergy:"\u6a39\u852d\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff"},buildingDesignSubMenu:"\u5efa\u7bc9\u8a2d\u8a08",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"\u6709\u68da\u9802\u7a97\u7684\u79d1\u5fb7\u89d2\u98a8\u683c\u7684\u4f4f\u5b85",MansardRoofWithDormers:"\u6709\u5929\u7a97\u7684\u6298\u7dda\u5c4b\u9802",GableRoofVsHipRoof:"\u96d9\u5761\u5c4b\u9802\u548c\u56db\u5761\u5c4b\u9876\u7684\u5c0d\u6bd4",ColonialVsSaltbox:"\u6b96\u6c11\u5730\u98a8\u683c\u548c\u9e7d\u76d2\u98a8\u683c\u7684\u5c0d\u6bd4",GambrelRoofVsMansardRoof:"\u590d\u659c\u5c4b\u9876\u548c\u6298\u7dda\u5c4b\u9802\u7684\u5c0d\u6bd4",CombinationRoofVsBonnetRoof:"\u7d44\u5408\u5c4b\u9802\u548c\u5e3d\u7c37\u5c4b\u9802\u7684\u5c0d\u6bd4",DutchGableRoof:"\u8377\u862d\u96d9\u5761\u5c4b\u9802",GableAndValleyRoof:"\u5761\u8c37\u5c4b\u9802",ClerestoryRoof:"\u5929\u7a97\u5c4b\u9802",MonitorRoof:"\u63a1\u5149\u5c4b\u9802",AFrameHouse:"A\u5b57\u5f62\u623f\u5b50",HalfTimberedHouse:"\u534a\u6728\u9aa8\u67b6\u623f\u5b50",AllBasicRoofTypes:"\u6240\u6709\u7684\u57fa\u672c\u5c4b\u9802\u985e\u578b"},photovoltaicSolarPowerSubMenu:"\u5149\u4f0f\u767c\u96fb",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"\u5149\u4f0f\u677f\u50be\u659c\u89d2\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",EffectOfAzimuthOfSolarPanel:"\u5149\u4f0f\u677f\u65b9\u4f4d\u89d2\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",SolarPanelTypes:"\u5149\u4f0f\u677f\u985e\u578b",VerticalBifacialSolarPanels:"\u8c4e\u76f4\u7684\u96d9\u9762\u5149\u4f0f\u677f",CompareMonofacialAndBifacialSolarPanels:"\u55ae\u9762\u5149\u4f0f\u677f\u548c\u96d9\u9762\u5149\u4f0f\u677f\u7684\u5c0d\u6bd4",SolarTrackers:"\u81ea\u52d5\u8ffd\u65e5\u5668",CoveringGroundWithSolarPanels:"\u70ba\u4ec0\u9ebc\u6211\u5011\u4e0d\u7c21\u55ae\u5730\u7528\u5149\u4f0f\u677f\u8986\u84cb\u5730\u9762",InterRowSpacingOfSolarPanelArray:"\u5149\u4f0f\u677f\u9663\u5217\u884c\u9593\u8ddd\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",EffectOfOrientationOfSolarPanels:"\u5149\u4f0f\u677f\u6392\u5217\u65b9\u5411\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",SolarPanelArrayAutomaticLayout:"\u5149\u4f0f\u677f\u81ea\u52d5\u6392\u5217"},concentratedSolarPowerSubMenu:"\u5149\u71b1\u767c\u96fb",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"\u62cb\u7269\u7dda\u69fd\u65b9\u4f4d\u89d2\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",EffectOfLatusRectumOfParabolicTrough:"\u62cb\u7269\u7dda\u69fd\u901a\u5f91\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",FocusSunlightWithParabolicDish:"\u7528\u62cb\u7269\u7dda\u789f\u805a\u7126\u9633\u5149",LinearFresnelReflectors:"\u7528\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u805a\u7126\u9633\u5149",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"\u5438\u71b1\u7ba1\u7684\u5b89\u88c5\u9ad8\u5ea6\u5c0d\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u767c\u96fb\u91cf\u7684\u5f71\u97ff",EffectOfAzimuthOfLinearFresnelReflectors:"\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u65b9\u4f4d\u89d2\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",LinearFresnelReflectorsWithTwoAbsorbers:"\u914d\u5099\u5169\u500b\u5438\u6536\u7ba1\u7684\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u9663\u5217",CosineEfficiencyOfHeliostats:"\u5b9a\u65e5\u93e1\u7684\u9918\u5f26\u6548\u7387",ShadowingAndBlockingOfHeliostats:"\u5b9a\u65e5\u93e1\u7684\u9670\u5f71\u548c\u906e\u64cb",EffectSolarPowerTowerHeight:"\u5438\u6536\u5854\u9ad8\u5ea6\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",SolarPowerTower:"\u5854\u5f0f\u5149\u71b1\u767c\u96fb\u7ad9"},otherTypesOfSolarPowerSubMenu:"\u5176\u5b83\u985e\u578b\u7684\u592a\u967d\u80fd\u767c\u96fb",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854"},generativeDesignSubMenu:"\u751f\u6210\u5f0f\u8a2d\u8a08",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"\u55ae\u9762\u5149\u4f0f\u677f\u9663\u5217\u7684\u50be\u659c\u89d2",BifacialSolarPanelArrayTiltAngle:"\u96d9\u9762\u5149\u4f0f\u677f\u9663\u5217\u7684\u50be\u659c\u89d2",OutputOfSolarPanelArrayInDifferentPlaces:"\u4e00\u500b\u5149\u4f0f\u677f\u9663\u5217\u5728\u4e0d\u540c\u5730\u5340\u7684\u7522\u51fa",SimpleSolarFarmParetoFront:"\u7c21\u55ae\u592a\u967d\u80fd\u8fb2\u5834\u8a2d\u8a08\u7684\u5e15\u7d2f\u6258\u524d\u6cbf"},examplesSubMenu:"\u4f8b\u5b50",solarEnergySubMenu:"\u592a\u967d\u80fd",solarEnergyExamples:{SunBeamAndHeliodon:"\u592a\u967d\u5149\u675f\u548c\u65e5\u5f71\u5100",RooftopSolarPanels:"\u5c4b\u9802\u5149\u4f0f\u677f",NevadaSolarOneParabolicTroughArray:"\u5167\u83ef\u9054\u5dde\u592a\u967d\u80fd\u4e00\u865f\u7684\u62cb\u7269\u7dda\u69fd\u9663\u5217",TooeleParabolicDishArray:"\u7336\u4ed6\u5dde\u5716\u57c3\u52d2\u7684\u62cb\u7269\u7dda\u789f\u9663\u5217",PS10SolarPowerTower:"\u897f\u73ed\u7259\u585e\u7dad\u5229\u4e9e\u7684PS10\u592a\u967d\u80fd\u767c\u96fb\u5854",TucsonLinearFresnelReflectors:"\u4e9e\u5229\u6851\u90a3\u5dde\u5716\u68ee\u7684\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u9663\u5217",SolarCanopyFormFactors:"\u592a\u967d\u80fd\u5929\u7bf7\u5916\u5f62\u8a2d\u8a08",SolarCanopyOverBleachers:"\u770b\u53f0\u592a\u967d\u80fd\u5929\u7bf7",SolarCanopyOverGarage:"\u8eca\u5eab\u592a\u967d\u80fd\u5929\u7bf7",SolarBusStop:"\u592a\u967d\u80fd\u5019\u8eca\u4ead",SolarFacadeTesla:"\u7279\u65af\u62c9\u5149\u4f0f\u7246",BuildingIntegratedPhotovoltaics:"\u5efa\u7bc9\u6574\u5408\u5149\u4f0f",Floatovoltaics:"\u6d6e\u52d5\u5149\u4f0f",Agrivoltaics:"\u8fb2\u696d\u5149\u4f0f",VegetativeBuffer:"\u592a\u967d\u80fd\u8fb2\u5834\u7eff\u5316\u5e26",RainbowSwashSolarFarmBostonMA:"\u99ac\u85a9\u8af8\u585e\u5dde\u6ce2\u58eb\u9813\u5f69\u8679\u6fc0\u6d41\u65c1\u908a\u7684\u5149\u4f0f\u677f\u9663\u5217",MickeyMouseSolarFarmOrlandoFL:"\u4f5b\u7f85\u91cc\u9054\u5dde\u5967\u862d\u591a\u7684\u7c73\u8001\u9f20\u5f62\u72c0\u5149\u4f0f\u677f\u9663\u5217",SolarPanelsOverCanalBakersfieldCA:"\u52a0\u5229\u798f\u5c3c\u4e9e\u5dde\u8c9d\u514b\u65af\u83f2\u723e\u5fb7\u704c\u6e89\u6e20\u4e0a\u5047\u60f3\u7684\u5149\u4f0f\u677f\u9663\u5217",SolarNoiseBarrierLexingtonMA:"\u99ac\u85a9\u8af8\u585e\u5dde\u5217\u524b\u661f\u6566\u9ad8\u901f\u516c\u8def\u566a\u97f3\u7246\u4e0a\u5047\u60f3\u7684\u5149\u4f0f\u677f",HSATSolarTrackersRaleighNC:"\u5317\u5361\u7f85\u4f86\u7d0d\u5dde\u7f85\u5229\u7684\u4e00\u500b\u6c34\u5e73\u65b9\u5411\u55ae\u8ef8\u65cb\u8f49\u8ffd\u65e5\u5149\u4f0f\u677f\u9663\u5217\uff08HSAT\uff09",AADATSolarTrackersLancasterCA:"\u52a0\u5229\u798f\u5c3c\u4e9e\u5dde\u862d\u958b\u65af\u7279\u7684\u4e00\u500b\u96d9\u8ef8\u65cb\u8f49\u8ffd\u65e5\u5149\u4f0f\u677f\u9663\u5217\uff08AADAT\uff09",SolarTrackersInRealWorld:"\u6a21\u64ec",SolarUpdraftTowerInCity:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u5728\u57ce\u5e02\u4e2d\u7684\u61c9\u7528"},builtEnvironmentSubMenu:"\u5efa\u9020\u74b0\u5883",residentialBuildingsSubMenu:"\u4f4f\u5b85\u5efa\u7bc9",residentialBuildingExamples:{ColonialHouse:"\u6b96\u6c11\u5730\u98a8\u683c\u7684\u4f4f\u5b85",DutchColonialHouse:"\u8377\u862d\u6b96\u6c11\u5730\u98a8\u683c\u7684\u4f4f\u5b85",TShapedHouse:"T\u5b57\u578b\u623f\u5b50",CapeCodHouseWithGarage:"\u6709\u8eca\u5eab\u7684\u79d1\u5fb7\u89d2\u98a8\u683c\u7684\u4f4f\u5b85",Solarium:"\u6709\u65e5\u5149\u6d74\u5ba4\u7684\u623f\u5b50",Church1:"\u6559\u5802\u4f8b\u4e00",Cathedral1:"\u4e3b\u6559\u5ea7\u5802\u4f8b\u4e00",Cathedral2:"\u4e3b\u6559\u5ea7\u5802\u4f8b\u4e8c",Mosque1:"\u6e05\u771f\u5bfa\u4f8b\u4e00",AdobeTaosHouse:"\u9676\u65af\u571f\u576f\u623f",RanchHouse:"\u7267\u5834\u98a8\u683c\u7684\u4f4f\u5b85",BonnetHouse:"\u6709\u5e3d\u7c37\u5c4b\u9802\u7684\u4f4f\u5b85",BarnStyleHouse:"\u7a40\u5009\u5f0f\u98a8\u683c\u7684\u4f4f\u5b85",ModernHouse:"\u73fe\u4ee3\u98a8\u683c\u7684\u4f4f\u5b85",ButterflyRoofHouse:"\u8774\u8776\u578b\u5c4b\u9802\u7684\u4f4f\u5b85"},commercialBuildingsSubMenu:"\u5546\u7528\u5efa\u7bc9",commercialBuildingExamples:{WhiteHouse:"\u767d\u5bab",BilimMersinTurkiye:"\u571f\u8033\u5176\u6885\u723e\u8f9b\u79d1\u5b78\u6559\u80b2\u4e2d\u5fc3",SpanishStyleHotel:"\u897f\u73ed\u7259\u98a8\u683c\u65c5\u9928",ApartmentBuilding:"\u516c\u5bd3\u6a13",OfficeBuilding:"\u5beb\u5b57\u6a13",Hotel:"\u65c5\u9928"},buildingComplexesSubMenu:"\u5efa\u7bc9\u7fa4",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"\u4f5b\u8499\u7279\u5dde\u5357\u4f2f\u9748\u9813\u9ad8\u4e2d",MescaleroApacheSchoolNewMexico:"\u65b0\u58a8\u897f\u54e5\u5dde\u6885\u65af\u5361\u52d2\u7f85\u963f\u5e15\u5947\u5b78\u6821"},urbanPlanningSubMenu:"\u57ce\u5e02\u898f\u5283",urbanPlanningExamples:{Heatmap1:"\u71b1\u5716\u4f8b\u4e00"},otherBuildingsSubMenu:"\u5176\u5b83\u5efa\u7bc9",otherBuildingExamples:{Greenhouse:"\u6eab\u5ba4",Pavilion:"\u516c\u5712\u7684\u4ead\u5b50",OctagonalPagoda:"\u516b\u89d2\u5854",OceanFront:"\u6d77\u908a",EgyptianPyramids:"\u57c3\u53ca\u91d1\u5b57\u5854",MayanPyramid:"\u746a\u96c5\u91d1\u5b57\u5854",SiOSePol:"\u4e09\u5341\u4e09\u5b54\u6a4b",StackedCuboids:"\u5806\u780c\u9577\u65b9\u9ad4"},artificialIntelligenceSubMenu:"\u4eba\u5de5\u667a\u6167",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"\u512a\u5316\u55ae\u6392\u5149\u4f0f\u677f\u7684\u50be\u659c\u89d2",OptimizingTiltAnglesOfMultipleSolarPanelRows:"\u512a\u5316\u591a\u6392\u5149\u4f0f\u677f\u7684\u50be\u659c\u89d2",SolarFarmGenerativeDesign:"\u751f\u6210\u5f0f\u8a2d\u8a08\u592a\u967d\u80fd\u8fb2\u5834",SolarFarmGenerativeDesignWithBlock:"\u751f\u6210\u5f0f\u8a2d\u8a08\u592a\u967d\u80fd\u8fb2\u5834\uff1a\u5468\u908a\u6709\u5efa\u7bc9\u7269\u7684\u60c5\u6cc1",FitchburgSolarFarmGenerativeDesign:"\u751f\u6210\u5f0f\u8a2d\u8a08\u592a\u967d\u80fd\u8fb2\u5834\uff1a\u771f\u5be6\u4e16\u754c\u6848\u4f8b"},languageSubMenu:"\u8a9e\u8a00",publicSubMenu:"\u516c\u5171",ModelsGallery:"\u6a21\u578b\u756b\u5eca",ModelsMap:"\u6a21\u578b\u5730\u5716",AboutUs:"\u95dc\u65bc\u6211\u5011"},avatarMenu:{AccountSettings:"\u8cec\u865f\u8a2d\u5b9a",PrivacyStatementTitle:"\u7528\u6236\u96b1\u79c1\u6b0a\u4fdd\u8b77\u8072\u660e",PrivacyStatement:"\u767b\u9304\u9700\u8981\u63a1\u7528\u60a8\u7684\u8c37\u6b4cID\u5efa\u7acb\u6216\u9032\u5165\u60a8\u7684\u963f\u62c9\u4e01\u8cec\u6236\u3002 \u6211\u5011\u53ea\u5132\u5b58\u4e00\u500b\u96a8\u6a5f\u7684\u5b57\u7b26\u4e32\u4f5c\u70ba\u60a8\u7684ID\u3002 \u4efb\u4f55\u95dc\u65bc\u60a8\u7684\u53ef\u8fa8\u8b58\u7684\u500b\u4eba\u4fe1\u606f\u90fd\u6c92\u6709\u88ab\u6536\u96c6\u3002 \u8a73\u60c5\u8acb\u53c3\u8003\u6211\u5011\u7684",SignIn:"\u767b\u9304",SignOut:"\u9000\u51fa\u8cec\u865f",IfYouAreAStudent:"\u5982\u679c\u60a8\u662f\u4e00\u500b\u5b78\u751f"},skyMenu:{Axes:"\u986f\u793a\u5750\u6a19\u8ef8",Theme:"\u74b0\u5883\u4e3b\u984c",ThemeDefault:"\u9ed8\u8a8d",ThemeDesert:"\u6c99\u6f20",ThemeDune:"\u6c99\u4e18",ThemeForest:"\u68ee\u6797",ThemeGrassland:"\u8349\u539f",ThemeHill:"\u4e18\u9675",ThemeLake:"\u6e56\u6cca",ThemeMountain:"\u5c71\u8108",ThemeRural:"\u7530\u5712",SunlightAttenuationCoefficientInAir:"\u967d\u5149\u5728\u7a7a\u6c23\u4e2d\u50b3\u64ad\u7684\u8870\u6e1b\u4fc2\u6578",ConvectiveCoefficientOfAir:"\u7a7a\u6c23\u5c0d\u6d41\u50b3\u71b1\u4fc2\u6578",HighestTemperatureTimeInMinutes:"\u6700\u9ad8\u6c23\u6eab\u6642\u9593(\u5206\u9418)",SelectSunAnglesToShow:"\u9078\u64c7\u592a\u967d\u89d2\u5ea6\u986f\u793a",ShowAzimuthAngle:"\u986f\u793a\u65b9\u4f4d\u89d2",ShowElevationAngle:"\u986f\u793a\u9ad8\u5ea6\u89d2",ShowZenithAngle:"\u986f\u793a\u5929\u9802\u89d2",DirectLightBrightnessAtNoon:"\u6b63\u5348\u76f4\u5c04\u5149\u7167\u5ea6",AmbientLightBrightnessAtNoon:"\u6b63\u5348\u74b0\u5883\u5149\u7167\u5ea6"},groundMenu:{MonthlyIrradianceLoss:"\u6708\u4efd\u8f3b\u5c04\u5ea6\u640d\u5931\u6bd4",Vegetation:"\u690d\u88ab",LeafOutDay:"\u6a39\u8449\u9577\u51fa\u7684\u65e5\u5b50",LeafOffDay:"\u6a39\u8449\u812b\u843d\u7684\u65e5\u5b50",Albedo:"\u53cd\u7167\u7387",ImageOnGround:"\u5730\u9762\u986f\u793a\u5716\u50cf",WaterSurface:"\u6c34\u9762",RemoveAllUnlockedTrees:"\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728",RemoveAllUnlockedFlowers:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedPeople:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedFoundations:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5730\u57fa",RemoveAllUnlockedCuboids:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9577\u65b9\u9ad4",DoYouReallyWantToRemoveAllPeople:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u55ce",DoYouReallyWantToRemoveAllTrees:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728\u55ce",DoYouReallyWantToRemoveAllFlowers:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u55ce",DoYouReallyWantToRemoveAllSolarPanels:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",DoYouReallyWantToRemoveAllFoundations:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5730\u57fa\u55ce",DoYouReallyWantToRemoveAllCuboids:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9577\u65b9\u9ad4\u55ce",LockAllElements:"\u56fa\u5b9a\u6240\u6709\u7684\u90e8\u4ef6",UnlockAllElements:"\u89e3\u9664\u6240\u6709\u7684\u56fa\u5b9a"},labelSubMenu:{Label:"\u6a19\u7c64",LabelText:"\u6a19\u7c64\u7684\u5185\u5bb9",LabelHeight:"\u6a19\u7c64\u7684\u9ad8\u5ea6",LabelSize:"\u6a19\u7c64\u7684\u5927\u5c0f",LabelFontSize:"\u5b57\u9ad4\u7684\u5927\u5c0f",LabelColor:"\u6a19\u7c64\u7684\u984f\u8272",KeepShowingLabel:"\u986f\u793a\u6a19\u7c64"},foundationMenu:{RemoveAllUnlockedSolarPanels:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedParabolicTroughs:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u62cb\u7269\u7dda\u69fd",RemoveAllUnlockedParabolicDishes:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u62cb\u7269\u7dda\u789f",RemoveAllUnlockedFresnelReflectors:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",RemoveAllUnlockedHeliostats:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5b9a\u65e5\u93e1",RemoveAllUnlockedSensors:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668",RemoveAllUnlockedLights:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8",RemoveAllUnlockedWalls:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7246",RemoveAllUnlockedWindows:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6236",RemoveAllUnlockedDoors:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9580",RemoveAllUnlockedPolygons:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62",RemoveAllUnlockedHumans:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedTrees:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728",RemoveAllUnlockedFlowers:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",Racks:"\u652f\u67b6",Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",SolarPanels:"\u5149\u4f0f\u677f",SolarPanelArray:"\u5149\u4f0f\u677f\u9663\u5217",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",ParabolicTroughs:"\u62cb\u7269\u7dda\u69fd",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u62cb\u7269\u7dda\u69fd\u55ce",ParabolicDishes:"\u62cb\u7269\u7dda\u789f",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u62cb\u7269\u7dda\u789f\u55ce",FresnelReflectors:"\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u55ce",Heliostats:"\u5b9a\u65e5\u93e1",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5b9a\u65e5\u93e1\u55ce",Sensors:"\u50b3\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668\u55ce",Lights:"\u96fb\u71c8",DoYouReallyWantToRemoveAllLightsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8\u55ce",Walls:"\u7246",DoYouReallyWantToRemoveAllWallsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7246\u55ce",Windows:"\u7a97\u6236",DoYouReallyWantToRemoveAllWindowsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6236\u55ce",Doors:"\u9580",DoYouReallyWantToRemoveAllDoorsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9580\u55ce",Polygons:"\u591a\u908a\u5f62",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62\u55ce",Humans:"\u4eba\u7269",DoYouReallyWantToRemoveAllHumansOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u55ce",Trees:"\u6a39\u6728",DoYouReallyWantToRemoveAllTreesOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728\u55ce",Flowers:"\u82b1\u8349",DoYouReallyWantToRemoveAllFlowersOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u55ce",OnlyThisFoundation:"\u53ea\u9019\u584a\u5730\u57fa",AllConnectedFoundations:"\u6240\u6709\u76f8\u9023\u7684\u5730\u57fa",AllSelectedFoundations:"\u6240\u6709\u9078\u4e2d\u7684\u5730\u57fa",AllFoundations:"\u6240\u6709\u7684\u5730\u57fa",AddPolygon:"\u6dfb\u52a0\u591a\u908a\u5f62",SolarStructure:"\u592a\u967d\u80fd\u69cb\u578b",GroupMaster:"\u4e3b\u5730\u57fa",LockAllElementsOnThisFoundation:"\u56fa\u5b9a\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u7684\u90e8\u4ef6",UnlockAllElementsOnThisFoundation:"\u89e3\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u7684\u56fa\u5b9a",GroundFloorRValue:"\u5efa\u7bc9\u7269\u5730\u677f\u7684R\u503c",OnlyThisGroundFloor:"\u53ea\u9019\u500b\u5efa\u7bc9\u7269\u7684\u5730\u677f",AllGroundFloors:"\u6240\u6709\u5efa\u7bc9\u7269\u7684\u5730\u677f"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"\u548c\u5b9a\u65e5\u93e1\u914d\u5957\u7684\u5438\u6536\u5854",ReceiverTowerPhysicalProperties:"\u592a\u967d\u80fd\u5438\u6536\u5854\u7684\u7269\u7406\u6027\u8cea",ReceiverTowerHeight:"\u592a\u967d\u80fd\u5438\u6536\u5854\u7684\u9ad8\u5ea6",ReceiverTowerRadius:"\u592a\u967d\u80fd\u5438\u6536\u5854\u7684\u534a\u5f91",ReceiverAbsorptance:"\u592a\u967d\u80fd\u5438\u6536\u5668\u7684\u5438\u6536\u7387",ReceiverOpticalEfficiency:"\u592a\u967d\u80fd\u5438\u6536\u5668\u7684\u5149\u6548\u7387",ReceiverThermalEfficiency:"\u592a\u967d\u80fd\u5438\u6536\u5668\u7684\u71b1\u6548\u7387"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"\u548c\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u914d\u5957\u7684\u5438\u6536\u7ba1",AbsorberPipePhysicalProperties:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u7269\u7406\u6027\u8cea",AbsorberHeight:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u5b89\u88c5\u9ad8\u5ea6",AbsorberApertureWidth:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u5b54\u5f91",AbsorberPipePoleNumber:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u652f\u67f1\u6578\u91cf",AbsorberAbsorptance:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u5438\u6536\u7387",AbsorberOpticalEfficiency:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u5149\u6548\u7387",AbsorberThermalEfficiency:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u71b1\u6548\u7387"},solarUpdraftTowerMenu:{SolarUpdraftTower:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854",SolarUpdraftTowerPhysicalProperties:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7684\u7269\u7406\u6027\u8cea",SolarUpdraftTowerChimneyHeight:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7159\u56ea\u7684\u9ad8\u5ea6",SolarUpdraftTowerChimneyRadius:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7159\u56ea\u7684\u534a\u5f91",SolarUpdraftTowerCollectorHeight:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u96c6\u71b1\u68da\u7684\u9ad8\u5ea6",SolarUpdraftTowerCollectorRadius:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u96c6\u71b1\u68da\u7684\u534a\u5f91",SolarUpdraftTowerCollectorTransmissivity:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u96c6\u71b1\u68da\u7684\u900f\u5c04\u7387",SolarUpdraftTowerCollectorEmissivity:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u96c6\u71b1\u68da\u7684\u767c\u5c04\u7387",SolarUpdraftTowerDischargeCoefficient:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7684\u6d41\u91cf\u4fc2\u6578",SolarUpdraftTowerTurbineEfficiency:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7684\u6e26\u8f2a\u6a5f\u6548\u7387"},cuboidMenu:{Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",RemoveAllUnlockedSolarPanels:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedSensors:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668",RemoveAllUnlockedPolygons:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62",RemoveAllUnlockedHumans:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedTrees:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728",RemoveAllUnlockedFlowers:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",Racks:"\u652f\u67b6",SolarPanels:"\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",Sensors:"\u50b3\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668\u55ce",Polygons:"\u591a\u908a\u5f62",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62\u55ce",Humans:"\u4eba\u7269",DoYouReallyWantToRemoveAllHumansOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u55ce",Trees:"\u6a39\u6728",DoYouReallyWantToRemoveAllTreesOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728\u55ce",Flowers:"\u82b1\u8349",DoYouReallyWantToRemoveAllFlowersOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u55ce",OnlyThisCuboid:"\u53ea\u9019\u500b\u9577\u65b9\u9ad4",AllCuboidsOnSameSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u9577\u65b9\u9ad4",AllCuboidsAboveSameBase:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u9577\u65b9\u9ad4",AllSelectedCuboids:"\u6240\u6709\u9078\u4e2d\u7684\u9577\u65b9\u9ad4",AllCuboids:"\u6240\u6709\u7684\u9577\u65b9\u9ad4",OnlyThisSide:"\u53ea\u9019\u500b\u8868\u9762",AllSidesOfThisCuboid:"\u9019\u500b\u9577\u65b9\u9ad4\u6240\u6709\u7684\u5074\u9762",AllSidesOfSelectedCuboids:"\u6240\u6709\u9078\u4e2d\u9577\u65b9\u9ad4\u6240\u6709\u7684\u5074\u9762",AllSidesOfAllCuboids:"\u6240\u6709\u7684\u9577\u65b9\u9ad4\u6240\u6709\u7684\u5074\u9762",AddPolygon:"\u6dfb\u52a0\u591a\u908a\u5f62",Stackable:"\u53ef\u5806\u780c",GroupMaster:"\u4e3b\u9577\u65b9\u9ad4"},polygonMenu:{Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",TextBox:"\u6587\u5b57\u6846",FontOutlineColor:"\u5b57\u9ad4\u8f2a\u5ed3\u984f\u8272",FontOutlineWidth:"\u5b57\u9ad4\u8f2a\u5ed3\u7dda\u5bec",FontStrokeColor:"\u5b57\u9ad4\u63cf\u908a\u984f\u8272",FontStrokeWidth:"\u5b57\u9ad4\u63cf\u908a\u7dda\u5bec",NoOutline:"\u7121\u8f2a\u5ed3\u7dda",Shiny:"\u5149\u6fa4",Filled:"\u586b\u5145",FillTexture:"\u586b\u5145\u6750\u8cea",FillColor:"\u586b\u5145\u984f\u8272",Opacity:"\u906e\u5149\u5ea6",LineColor:"\u7dda\u689d\u984f\u8272",LineWidth:"\u7dda\u689d\u5bec\u5ea6",LineStyle:"\u7dda\u689d\u6a23\u5f0f",SolidLine:"\u5be6\u7dda",DashedLine:"\u865b\u7dda",DottedLine:"\u9ede\u7dda",InsertVertexBeforeIndex:"\u524d\u9762\u63d2\u5165\u9802\u9ede",InsertVertexAfterIndex:"\u5f8c\u9762\u63d2\u5165\u9802\u9ede",DeleteVertex:"\u79fb\u9664\u9802\u9ede",OnlyThisPolygon:"\u53ea\u9019\u500b\u591a\u908a\u5f62",AllPolygonsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u591a\u908a\u5f62",AllPolygonsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u591a\u908a\u5f62",AllSelectedPolygons:"\u6240\u6709\u9078\u4e2d\u7684\u591a\u908a\u5f62",AllPolygons:"\u6240\u6709\u7684\u591a\u908a\u5f62",Layout:"\u4f48\u5c40",SolarPanelArrayLayout:"\u5149\u4f0f\u677f\u9663\u5217\u4f48\u5c40",SolarPanelArrayLayoutParametricDesign:"\u5149\u4f0f\u677f\u9663\u5217\u4f48\u5c40\u53c3\u6578\u5316\u8a2d\u8a08",SolarPanelArrayLayoutGenerativeDesign:"\u5149\u4f0f\u677f\u9663\u5217\u4f48\u5c40\u751f\u6210\u5f0f\u8a2d\u8a08",SolarPanelArrayModel:"\u5149\u4f0f\u677f\u578b\u865f",SolarPanelArrayOrientation:"\u6392\u5217\u65b9\u5411",SolarPanelArrayTiltAngle:"\u50be\u659c\u89d2\u5ea6",SolarPanelArrayRowWidth:"\u884c\u5bec\u5ea6",SolarPanelArrayInterRowSpacing:"\u884c\u9593\u8ddd",SolarPanelArrayRowSpacing:"\u884c\u9593\u8ddd",SolarPanelArrayRowAxis:"\u884c\u8ef8\u65b9\u5411",SolarPanelArrayLeftRightRowAxis:"\u5de6\u53f3\u65b9\u5411(\u76f8\u5c0d)",SolarPanelArrayUpDownRowAxis:"\u4e0a\u4e0b\u65b9\u5411(\u76f8\u5c0d)",SolarPanelArrayEastWestRowAxis:"\u6771\u897f\u65b9\u5411(\u7d55\u5c0d)",SolarPanelArrayNorthSouthRowAxis:"\u5357\u5317\u65b9\u5411(\u7d55\u5c0d)",SolarPanelArrayMargin:"\u908a\u7de3\u9918\u5730",SolarPanelArrayPoleHeight:"\u652f\u67b6\u9ad8\u5ea6",SolarPanelArrayPoleSpacing:"\u652f\u67f1\u9593\u9694",SolarPanelArrayTotalYearlyCost:"\u5168\u5e74\u7e3d\u6210\u672c",SolarPanelArrayTotalYearlyRevenue:"\u5168\u5e74\u7e3d\u6536\u5165",SolarPanelArrayTotalYearlyYield:"\u5168\u5e74\u7e3d\u767c\u96fb\u91cf",SolarPanelArrayMeanYearlyYield:"\u5e73\u5747\u5e74\u767c\u96fb\u91cf",SolarPanelArrayYearlyProfit:"\u5168\u5e74\u5229\u6f64",LayoutNotAcceptedCheckYourParameters:"\u6055\u4e0d\u80fd\u63a1\u7528\u6b64\u4f48\u5c40\u3002\u8acb\u6aa2\u67e5\u60a8\u7684\u53c3\u6578\u8a2d\u7f6e\u3002"},optimizationMenu:{Optimization:"\u512a\u5316",Parameters:"\u53c3\u6578",Variables:"\u8b8a\u91cf",Constants:"\u5e38\u91cf",GeneticAlgorithm:"\u907a\u50b3\u7b97\u6cd5",GeneticAlgorithmSettings:"\u907a\u50b3\u7b97\u6cd5\u8a2d\u5b9a",ParticleSwarmOptimization:"\u7c92\u5b50\u7fa4\u512a\u5316",ParticleSwarmOptimizationSettings:"\u7c92\u5b50\u7fa4\u512a\u5316\u8a2d\u5b9a",SolarPanelTiltAngleOptimization:"\u5149\u4f0f\u677f\u50be\u659c\u89d2\u5ea6\u512a\u5316",SolarPanelArrayLayout:"\u5149\u4f0f\u677f\u9663\u5217\u4f48\u5c40",Generation:"\u4e16\u4ee3",Gene:"\u57fa\u56e0",NormalizedVariables:"\u6a19\u6e96\u5316\u8b8a\u91cf",Objective:"\u76ee\u6a19\u51fd\u6578",ObjectiveFunctionDailyTotalYield:"\u7576\u65e5\u7e3d\u7522\u51fa",ObjectiveFunctionYearlyTotalYield:"\u5168\u5e74\u7e3d\u7522\u51fa",ObjectiveFunctionDailyMeanYield:"\u7576\u65e5\u5e73\u5747\u7522\u51fa",ObjectiveFunctionYearlyMeanYield:"\u5168\u5e74\u5e73\u5747\u7522\u51fa",ObjectiveFunctionDailyProfit:"\u7576\u65e5\u5229\u6f64",ObjectiveFunctionYearlyProfit:"\u5168\u5e74\u5229\u6f64",GeneticAlgorithmSelectionMethod:"\u907a\u50b3\u7b97\u6cd5\u9078\u64c7\u65b9\u6cd5",RouletteWheel:"\u8f2a\u76e4\u5236",Tournament:"\u6dd8\u6c70\u5236",SearchMethod:"\u641c\u7d22\u65b9\u6cd5",GlobalSearchUniformSelection:"\u5168\u5c40\u641c\u7d22\u5747\u52fb\u53d6\u6a23",LocalSearchRandomOptimization:"\u5c40\u90e8\u641c\u7d22\u96a8\u6a5f\u512a\u5316",PopulationSize:"\u7a2e\u7fa4\u500b\u9ad4\u6578\u76ee",MaximumGenerations:"\u6700\u5927\u4e16\u4ee3\u6578\u76ee",SelectionRate:"\u9078\u64c7\u6982\u7387",CrossoverRate:"\u4ea4\u914d\u6982\u7387",MutationRate:"\u7a81\u8b8a\u6982\u7387",Step:"\u6b65\u6578",SwarmSize:"\u7c92\u5b50\u6578\u76ee",MaximumSteps:"\u6700\u5927\u6b65\u6578",MaximumVelocity:"\u6700\u5927\u901f\u5ea6",InertiaWeight:"\u6163\u6027\u6b0a\u91cd",CognitiveCoefficient:"\u8a8d\u77e5\u4fc2\u6578",SocialCoefficient:"\u793e\u6703\u4fc2\u6578",ConvergenceThreshold:"\u7d42\u6b62\u689d\u4ef6\u7684\u6536\u6582\u95be\u503c",LocalSearchRadius:"\u5c40\u90e8\u641c\u7d22\u7684\u534a\u5f91",RowsPerRackRange:"\u55ae\u500b\u652f\u67b6\u4e0a\u5149\u4f0f\u677f\u884c\u6578\u7684\u8b8a\u5316\u7bc4\u570d",TiltAngleRange:"\u5149\u4f0f\u677f\u50be\u659c\u89d2\u5ea6\u7684\u8b8a\u5316\u7bc4\u570d",InterRowSpacingRange:"\u5149\u4f0f\u677f\u9663\u5217\u884c\u9593\u8ddd\u7684\u8b8a\u5316\u7bc4\u570d",ClickTargetPolygonToActivate:"\u9ede\u64ca\u76ee\u6a19\u591a\u908a\u5f62\u6fc0\u6d3b",ClickTargetFoundationToActivate:"\u9ede\u64ca\u76ee\u6a19\u5730\u57fa\u6fc0\u6d3b"},treeMenu:{ShowModel:"\u986f\u793a\u8fd1\u4f3c\u6a21\u578b",Flip:"\u7ffb\u8f49",Type:"\u6a39\u7a2e",Spread:"\u6a39\u51a0\u76f4\u5f91"},flowerMenu:{Flip:"\u7ffb\u8f49",Type:"\u54c1\u7a2e",Spread:"\u76f4\u5f91"},peopleMenu:{ChangePerson:"\u6539\u8b8a\u4eba\u7269",Flip:"\u8f49\u8eab",Observer:"\u89c0\u5bdf\u8005",ViewFromThisPerson:"\u8996\u89d2\u79fb\u5230\u6b64\u4eba\u4f4d\u7f6e"},lightMenu:{Color:"\u984f\u8272",Intensity:"\u4eae\u5ea6",Decay:"\u8870\u51cf",MaximumDistance:"\u6700\u5927\u8ddd\u96e2",Inside:"\u5185\u90e8"},solarCollectorMenu:{RelativeAzimuth:"\u76f8\u5c0d\u65b9\u4f4d\u89d2",Pole:"\u652f\u67f1",PoleHeight:"\u652f\u67f1\u9ad8\u5ea6",PoleRadius:"\u652f\u67f1\u534a\u5f91",ExtraPoleHeight:"\u984d\u5916\u7684\u652f\u67f1\u9ad8\u5ea6",ExtraPoleHeightInAdditionToHalfWidth:"\u5bec\u5ea6\u4e00\u534a\u984d\u5916\u7684\u652f\u67f1\u9ad8\u5ea6",DrawSunBeam:"\u986f\u793a\u5149\u675f"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"\u53cd\u5c04\u5668\u93e1\u9762\u53cd\u5c04\u7387",ReceiverAbsorptance:"\u63a5\u6536\u5668\u5438\u6536\u7387",ReflectorOpticalEfficiency:"\u53cd\u5c04\u5668\u5149\u6548\u7387",ReceiverThermalEfficiency:"\u63a5\u6536\u5668\u71b1\u6548\u7387"},solarPanelMenu:{InverterEfficiency:"\u9006\u8b8a\u5668\u6548\u7387",InverterEfficiencyExplained:"\u76f4\u6d41\u96fb\u8f49\u63db\u70ba\u4ea4\u6d41\u96fb\u7684\u6548\u7387\u3002",DcToAcSizeRatio:"\u76f4\u6d41-\u4ea4\u6d41\u5bb9\u91cf\u6bd4\u4f8b",DcToAcSizeRatioExplained:"\u76f4\u6d41\u96fb\u5bb9\u91cf\u548c\u4ea4\u6d41\u96fb\u5bb9\u91cf\u7684\u6bd4\u4f8b\u3002",ChangePvModel:"\u6539\u8b8a\u5149\u4f0f\u677f\u578b\u865f",Orientation:"\u6392\u5217\u65b9\u5411",Portrait:"\u7e31\u5411",Landscape:"\u6a6b\u5411",FrameColor:"\u6846\u67b6\u984f\u8272",Panels:"\u584a",PanelsWide:"\u584a\u5149\u4f0f\u677f\u5bec",PanelsLong:"\u584a\u5149\u4f0f\u677f\u9577",TiltAngle:"\u50be\u659c\u89d2\u5ea6",SouthFacingIsPositive:"\u671d\u5357\u70ba\u6b63",Tracker:"\u8ffd\u65e5\u7cfb\u7d71",SolarTrackerFollowsSun:"\u8ffd\u65e5\u7cfb\u7d71\u63d0\u9ad8\u5149\u4f0f\u677f\u7522\u51fa\u3002",PoleSpacing:"\u652f\u67f1\u9593\u9694",NoTracker:"\u7121\u8ffd\u65e5\u7cfb\u7d71",HorizontalSingleAxisTracker:"\u6c34\u5e73\u55ae\u8ef8\u8ffd\u65e5\u7cfb\u7d71",VerticalSingleAxisTracker:"\u8c4e\u76f4\u55ae\u8ef8\u8ffd\u65e5\u7cfb\u7d71",AltazimuthDualAxisTracker:"\u5730\u5e73\u96d9\u8ef8\u8ffd\u65e5\u7cfb\u7d71",OnlyThisSolarPanel:"\u53ea\u9019\u500b\u5149\u4f0f\u677f",AllSolarPanelsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u5149\u4f0f\u677f",AllSolarPanelsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5149\u4f0f\u677f",AllSelectedSolarPanels:"\u6240\u6709\u9078\u4e2d\u7684\u5149\u4f0f\u677f",AllSolarPanels:"\u6240\u6709\u7684\u5149\u4f0f\u677f"},pvModelPanel:{SolarPanelSpecs:"\u5149\u4f0f\u677f\u578b\u865f\u6027\u80fd",Model:"\u578b\u865f",PanelSize:"\u5c3a\u5bf8",Cells:"\u96fb\u6c60\u7d44",CellType:"\u5149\u4f0f\u96fb\u6c60\u985e\u578b",Monocrystalline:"\u55ae\u6676\u77fd",Polycrystalline:"\u591a\u6676\u77fd",ThinFilm:"\u8584\u819c",Bifacial:"\u96d9\u9762",BifacialityFactor:"\u96d9\u9762\u6027\u56e0\u5b50",Black:"\u9ed1\u8272",Blue:"\u85cd\u8272",ShadeTolerance:"\u9670\u5f71\u8010\u53d7\u5ea6",SolarCellEfficiency:"\u5149\u4f0f\u96fb\u6c60\u6548\u7387",NominalOperatingCellTemperature:"\u540d\u7fa9\u96fb\u6c60\u904b\u884c\u6eab\u5ea6",TemperatureCoefficientOfPmax:"Pmax\u6eab\u5ea6\u4fc2\u6578"},parabolicTroughMenu:{ModuleLength:"\u6a21\u584a\u9577\u5ea6",Modules:"\u6a21\u584a",ModulesLong:"\u6a21\u584a\u9577",LatusRectum:"\u901a\u5f91",OnlyThisParabolicTrough:"\u53ea\u9019\u500b\u62cb\u7269\u7dda\u69fd",AllParabolicTroughsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u62cb\u7269\u7dda\u69fd",AllSelectedParabolicTroughs:"\u6240\u6709\u9078\u4e2d\u7684\u629b\u7269\u7ebf\u69fd",AllParabolicTroughs:"\u6240\u6709\u7684\u62cb\u7269\u7dda\u69fd"},fresnelReflectorMenu:{AbsorberPipe:"\u5438\u6536\u7ba1",SelectAbsorberToReflectSunlightTo:"\u9078\u64c7\u967d\u5149\u53cd\u5c04\u5230\u7684\u5438\u6536\u7ba1",ModuleLength:"\u6a21\u584a\u9577\u5ea6",Modules:"\u6a21\u584a",ModulesLong:"\u6a21\u584a\u9577",OnlyThisFresnelReflector:"\u53ea\u9019\u500b\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",AllFresnelReflectorsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",AllSelectedFresnelReflectors:"\u6240\u6709\u9078\u4e2d\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AllFresnelReflectors:"\u6240\u6709\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u93e1"},heliostatMenu:{Tower:"\u5438\u6536\u5854",SelectTowerToReflectSunlightTo:"\u9078\u64c7\u967d\u5149\u53cd\u5c04\u5230\u7684\u5438\u6536\u5854",OnlyThisHeliostat:"\u53ea\u9019\u500b\u5b9a\u65e5\u93e1",AllHeliostatsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5b9a\u65e5\u93e1",AllSelectedHeliostats:"\u6240\u6709\u9078\u4e2d\u7684\u5b9a\u65e5\u955c",AllHeliostats:"\u6240\u6709\u7684\u5b9a\u65e5\u93e1"},parabolicDishMenu:{ReceiverStructure:"\u63a5\u6536\u5668\u7d50\u69cb",CentralPole:"\u4e2d\u5fc3\u76f4\u67f1",CentralPoleWithTripod:"\u4e09\u8173\u67b6\u548c\u4e2d\u5fc3\u76f4\u67f1",Quadrupod:"\u56db\u811a\u67b6",RimDiameter:"\u5916\u5708\u76f4\u5f91",LatusRectum:"\u901a\u5f91",ExtraPoleHeightInAdditionToRadius:"\u534a\u5f91\u4e4b\u5916\u984d\u5916\u7684\u652f\u67b6\u9ad8\u5ea6",OnlyThisParabolicDish:"\u53ea\u9019\u500b\u62cb\u7269\u7dda\u789f",AllParabolicDishesAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u62cb\u7269\u7dda\u789f",AllSelectedParabolicDishes:"\u6240\u6709\u9078\u4e2d\u7684\u629b\u7269\u7ebf\u789f",AllParabolicDishes:"\u6240\u6709\u7684\u62cb\u7269\u7dda\u789f"},wallMenu:{TextureDefault:"\u9ed8\u8a8d\u6750\u8cea",Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",SizeOfWall:"\u7246\u7684\u5c3a\u5bf8",OnlyThisWall:"\u53ea\u9019\u5835\u7246",AllConnectedWalls:"\u6240\u6709\u9023\u63a5\u7684\u7246",AllWallsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u7246",AllSelectedWalls:"\u6240\u6709\u9078\u4e2d\u7684\u5899",AllWalls:"\u6240\u6709\u7684\u7246",Windows:"\u7a97\u6236",LockAllWindows:"\u56fa\u5b9a\u6240\u6709\u7684\u7a97\u6236",UnlockAllWindows:"\u89e3\u9664\u6240\u6709\u7684\u7a97\u6236\u56fa\u5b9a",RemoveAllUnlockedWindows:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6236",DoYouReallyWantToRemoveAllWindowsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6236\u55ce",Doors:"\u9580",RemoveAllUnlockedDoors:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9580",DoYouReallyWantToRemoveAllDoorsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9580\u55ce",SolarPanels:"\u5149\u4f0f\u677f",LockAllSolarPanels:"\u56fa\u5b9a\u6240\u6709\u7684\u5149\u4f0f\u677f",UnlockAllSolarPanels:"\u89e3\u9664\u6240\u6709\u7684\u5149\u4f0f\u677f\u56fa\u5b9a",RemoveAllUnlockedSolarPanels:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",Sensors:"\u50b3\u611f\u5668",LockAllSensors:"\u56fa\u5b9a\u6240\u6709\u7684\u50b3\u611f\u5668",UnlockAllSensors:"\u89e3\u9664\u6240\u6709\u7684\u50b3\u611f\u5668\u56fa\u5b9a",RemoveAllUnlockedSensors:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668\u55ce",Lights:"\u96fb\u71c8",RemoveAllUnlockedLights:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8",DoYouReallyWantToRemoveAllLightsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8\u55ce",LockAllPolygons:"\u56fa\u5b9a\u9019\u5835\u7246\u4e0a\u6240\u6709\u7684\u591a\u908a\u5f62",UnlockAllPolygons:"\u89e3\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u7684\u591a\u908a\u5f62\u56fa\u5b9a",RemoveAllUnlockedPolygons:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62",WallStructure:"\u7246\u7d50\u69cb",DefaultStructure:"\u9ed8\u8a8d",StudStructure:"\u7246\u67f1",PillarStructure:"\u5713\u67f1",Opacity:"\u906e\u5149\u5ea6",StructureSpacing:"\u7d50\u69cb\u9593\u8ddd",StructureWidth:"\u7d50\u69cb\u5bec\u5ea6",StructureThickness:"\u7d50\u69cb\u539a\u5ea6",StructureColor:"\u7d50\u69cb\u989c\u8272",Color:"\u7246\u4f53\u989c\u8272",Height:"\u9ad8\u5ea6",Thickness:"\u539a\u5ea6",Texture:"\u6750\u8cea",AllLightsOnWallInside:"\u6240\u6709\u96fb\u71c8\u5728\u7246\u5167",AllLightsOnWallOutside:"\u6240\u6709\u96fb\u71c8\u5728\u7246\u5916",Fill:"\u586b\u5145",Full:"\u5168\u90e8",Partial:"\u90e8\u5206",Empty:"\u7a7a\u767d",OpenToOutside:"\u5c0d\u5916\u9762\u958b\u653e",EavesLength:"\u5c4b\u7c37\u5ef6\u4f38\u9577\u5ea6",Parapet:"\u5973\u7246",ParapetColor:"\u5973\u7246\u989c\u8272",ParapetTexture:"\u5973\u7246\u6750\u8cea",ParapetHeight:"\u5973\u7246\u9ad8\u5ea6",CopingsHeight:"\u9802\u84cb\u9ad8\u5ea6",CopingsWidth:"\u9802\u84cb\u5bec\u5ea6"},windowMenu:{OnlyThisWindow:"\u53ea\u9019\u500b\u7a97\u6236",AllWindowsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u7a97\u6236",AllWindowsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u7a97\u6236",AllSelectedWindows:"\u6240\u6709\u9078\u4e2d\u7684\u7a97\u6237",AllWindows:"\u6240\u6709\u7684\u7a97\u6236",Width:"\u5bec\u5ea6",Height:"\u9ad8\u5ea6",Setback:"\u96e2\u7246\u9ad4\u5916\u8868\u9762\u7684\u8ddd\u96e2",RelativeToWallThickness:"\u76f8\u5c0d\u65bc\u7246\u7684\u539a\u5ea6",Mullion:"\u76f4\u6afa",HorizontalMullion:"\u6c34\u5e73\u7684\u76f4\u6afa",VerticalMullion:"\u8c4e\u76f4\u7684\u76f4\u6afa",MullionWidth:"\u76f4\u6afa\u5bec\u5ea6",HorizontalMullionSpacing:"\u6c34\u5e73\u76f4\u6afa\u7684\u9593\u8ddd",VerticalMullionSpacing:"\u8c4e\u76f4\u76f4\u6afa\u7684\u9593\u8ddd",MullionColor:"\u76f4\u6afa\u989c\u8272",Tint:"\u8457\u8272",Opacity:"\u4e0d\u900f\u660e\u5ea6",SolarHeatGainCoefficient:"\u592a\u967d\u8f3b\u5c04\u71b1\u7372\u53d6\u4fc2\u6578(SHGC) = 1 - \u4e0d\u900f\u660e\u5ea6",Shutter:"\u767e\u8449\u7a97",LeftShutter:"\u5de6\u5074\u767e\u8449\u7a97",RightShutter:"\u53f3\u5074\u767e\u8449\u7a97",BothShutters:"\u5169\u5074\u767e\u8449\u7a97",ShutterWidth:"\u76f8\u5c0d\u5bec\u5ea6",ShutterColor:"\u767e\u8449\u7a97\u984f\u8272",Frame:"\u908a\u6846",FrameWidth:"\u908a\u6846\u5bec\u5ea6",SillWidth:"\u7a97\u53f0\u5bec\u5ea6",Color:"\u908a\u6846\u9854\u8272",WindowType:"\u7a97\u6236\u7a2e\u985e",Default:"\u9ed8\u8a8d",Arched:"\u62f1\u5f62",Polygonal:"\u591a\u908a\u5f62",Interior:"\u5185\u7a97",Empty:"\u7a7a\u767d"},roofMenu:{TextureDefault:"\u9ed8\u8a8d\u6750\u8cea",Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",OnlyThisRoof:"\u53ea\u9019\u500b\u5c4b\u9876",AllRoofsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5c4b\u9876",AllSelectedRoofs:"\u6240\u6709\u9078\u4e2d\u7684\u5c4b\u9876",AllRoofs:"\u6240\u6709\u7684\u5c4b\u9876",OnlyThisCeiling:"\u53ea\u9019\u500b\u5929\u82b1\u677f",AllCeilingsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5929\u82b1\u677f",AllCeilings:"\u6240\u6709\u7684\u5929\u82b1\u677f",EavesOverhangLength:"\u5c4b\u7c37\u5ef6\u4f38\u9577\u5ea6",RafterSpacing:"\u5c4b\u693d\u9593\u8ddd",RafterWidth:"\u5c4b\u693d\u5bec\u5ea6",RafterThickness:"\u5c4b\u693d\u539a\u5ea6",RafterColor:"\u5c4b\u693d\u989c\u8272",RoofColor:"\u5c4b\u9876\u989c\u8272",RoofSideColor:"\u5c4b\u9876\u5074\u9762\u989c\u8272",GlassTint:"\u73bb\u7483\u984f\u8272",Opacity:"\u906e\u5149\u5ea6",RoofStructure:"\u5c4b\u9802\u7d50\u69cb",DefaultStructure:"\u9ed8\u8a8d",RafterStructure:"\u5c4b\u693d",GlassStructure:"\u73bb\u7483",SolarPanels:"\u5149\u4f0f\u677f",LockAllSolarPanels:"\u56fa\u5b9a\u6240\u6709\u7684\u5149\u4f0f\u677f",UnlockAllSolarPanels:"\u89e3\u9664\u6240\u6709\u7684\u5149\u4f0f\u677f\u56fa\u5b9a",RemoveAllUnlockedSolarPanels:"\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",Windows:"\u5929\u7a97",LockAllWindows:"\u56fa\u5b9a\u6240\u6709\u7684\u5929\u7a97",UnlockAllWindows:"\u89e3\u9664\u6240\u6709\u7684\u5929\u7a97\u56fa\u5b9a",RemoveAllUnlockedWindows:"\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5929\u7a97",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5929\u7a97\u55ce",Sensors:"\u50b3\u611f\u5668",LockAllSensors:"\u56fa\u5b9a\u6240\u6709\u7684\u50b3\u611f\u5668",UnlockAllSensors:"\u89e3\u9664\u6240\u6709\u7684\u50b3\u611f\u5668\u56fa\u5b9a",RemoveAllUnlockedSensors:"\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668\u55ce",Lights:"\u96fb\u71c8",RemoveAllUnlockedLights:"\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8",DoYouReallyWantToRemoveAllLightsOnThisRoof:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8\u55ce",AllLightsOnRoofInside:"\u6240\u6709\u96fb\u71c8\u5728\u5c4b\u9802\u5167",AllLightsOnRoofOutside:"\u6240\u6709\u96fb\u71c8\u5728\u5c4b\u9802\u5916",Rise:"\u76f8\u5c0d\u9ad8\u5ea6",Ceiling:"\u5929\u82b1\u677f",RoofRValue:"\u5c4b\u9876R\u503c",CeilingRValue:"\u5929\u82b1\u677fR\u503c"},doorMenu:{TextureDefault:"\u9ed8\u8a8d\u6750\u8cea",Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",Texture11:"\u5341\u4e00\u865f\u6750\u8cea",Texture12:"\u5341\u4e8c\u865f\u6750\u8cea",Texture13:"\u5341\u4e09\u865f\u6750\u8cea",Texture14:"\u5341\u56db\u865f\u6750\u8cea",Texture15:"\u5341\u4e94\u865f\u6750\u8cea",Texture16:"\u5341\u516d\u865f\u6750\u8cea",Texture17:"\u5341\u4e03\u865f\u6750\u8cea",OnlyThisDoor:"\u53ea\u9019\u500b\u9580",AllDoorsOnWall:"\u540c\u4e00\u9762\u7246\u4e0a\u6240\u6709\u7684\u9580",AllDoorsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u9580",AllSelectedDoors:"\u6240\u6709\u9078\u4e2d\u7684\u95e8",AllDoors:"\u6240\u6709\u7684\u9580",DoorType:"\u9580\u7a2e\u985e",Default:"\u9ed8\u8a8d",Arched:"\u62f1\u5f62",Filled:"\u586b\u5145",FrameColor:"\u9580\u6846\u984f\u8272",Interior:"\u5167\u9580"},siteInfoPanel:{High:"\u6700\u9ad8\u6eab\u5ea6",Low:"\u6700\u4f4e\u6e29\u5ea6"},designInfoPanel:{NumberOfSelectedHeliostats:"\u9078\u4e2d\u7684\u5b9a\u65e5\u93e1\u7e3d\u6578",NumberOfSelectedSolarPanels:"\u9078\u4e2d\u7684\u5149\u4f0f\u677f\u7e3d\u6578",ElectricityGeneratedDailyBySolarPanels:"\u9019\u4e9b\u5149\u4f0f\u677f\u7684\u65e5\u767c\u96fb\u91cf",SceneDiameter:"\u5834\u666f\u76f4\u5f91",BuildingArea:"\u5efa\u7bc9\u9762\u7a4d"},visualizationControlPanel:{ColorContrast:"\u71b1\u5716\u984f\u8272\u5c0d\u6bd4\u5ea6",FluxScale:"\u71b1\u901a\u91cf\u9577\u5ea6",ClickUpOrDownArrowButtonsToChange:"\u9ede\u64ca\u4e0a\u4e0b\u7bad\u982d\u6539\u8b8a\u53c3\u6578"},instructionPanel:{Rotate:"\u65cb\u8f49",DragMouse:"\u62d6\u52d5\u6ed1\u9f20",Zoom:"\u7f29\u653e",MouseWheelOrKeys:"\u6ed1\u9f20\u6efe\u8f2a\u6216\u8005Ctrl+[\u548cCtrl+]",MouseWheelOrKeysMac:"\u6ed1\u9f20\u6efe\u8f2a\u6216\u8005\u2318+[\u548c\u2318+]",Pan:"\u5e73\u79fb",HoldCtrlDragMouse:"\u6309\u4e0bCtrl\u9375\u4e26\u62d6\u52d5\u6ed1\u9f20",HoldMetaDragMouse:"\u6309\u4e0b\u2318\u9375\u4e26\u62d6\u52d5\u6ed1\u9f20",Enter2DMode:"\u9032\u5165\u4e8c\u7dad\u6a21\u5f0f",Exit2DMode:"\u9000\u51fa\u4e8c\u7dad\u6a21\u5f0f",NavigationMode:"\u5c0e\u822a\u6a21\u5f0f",EnableNavigation:"\u9032\u5165\u5c0e\u822a\u6a21\u5f0f",DisableNavigation:"\u9000\u51fa\u5c0e\u822a\u6a21\u5f0f",MoveForwardBack:"\u524d\u5f8c\u79fb\u52d5",MoveForwardBackInstruction:"\u6309W/S\u9375",MoveLeftRight:"\u5de6\u53f3\u79fb\u52d5",MoveLeftRightInstruction:"\u6309A/D\u9375",MoveUpDown:"\u4e0a\u4e0b\u79fb\u52d5",MoveUpDownInstruction:"\u6309Z/X\u9375",Turn:"\u62d0\u5f4e",TurnInstruction:"\u6309\u65b9\u5411\u9375",ResetView:"\u91cd\u7f6e\u8996\u89d2",AutoRotate:"\u81ea\u52d5\u65cb\u8f49",StartOrStop:"\u6309F4\u9375\u555f\u52d5\u6216\u505c\u6b62"},mapPanel:{ImageOnGround:"\u5730\u9762\u986f\u793a\u5716\u50cf",WeatherStations:"\u6c23\u8c61\u7ad9",WeatherStationsNote:"\u95dc\u9589\u6b64\u9078\u9805\u4ee5\u63d0\u9ad8\u5730\u5716\u901f\u5ea6",Coordinates:"\u7d93\u7def\u5ea6\u5750\u6a19",Zoom:"\u653e\u5927\u7a0b\u5ea6"},visibilityPanel:{SolarPanelVisibility:"\u5149\u4f0f\u677f\u5c0d\u89c0\u5bdf\u8005\u7684\u53ef\u898b\u5ea6",Observer:"\u89c0\u5bdf\u8005",VantagePoint:"\u89c0\u5bdf\u4f4d\u7f6e",ItemizedVisibilityByFields:"\u6bcf\u500b\u5834\u7684\u53ef\u898b\u5ea6",TotalVisibility:"\u7e3d\u53ef\u898b\u5ea6"},sensorPanel:{LightSensor:"\u5149\u50b3\u611f\u5668",WeatherDataFrom:"\u6c23\u8c61\u6578\u64da\u4f86\u81ea"},buildingEnergyPanel:{DailyBuildingEnergy:"\u5efa\u7bc9\u7269\u65e5\u80fd\u8017",YearlyBuildingEnergy:"\u5efa\u7bc9\u7269\u5e74\u80fd\u8017",Heater:"\u6696\u6c23",AC:"\u7a7a\u8abf",SolarPanel:"\u5149\u4f0f",Net:"\u6de8\u80fd\u8017"},solarPanelYieldPanel:{SolarPanelDailyYield:"\u5149\u4f0f\u65e5\u767c\u96fb\u91cf",SolarPanelYearlyYield:"\u5149\u4f0f\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualSolarPanels:"\u986f\u793a\u6bcf\u884c\u5149\u4f0f\u677f\u55ae\u7368\u767c\u96fb\u91cf",Profit:"\u5229\u6f64",TotalCost:"\u7e3d\u6210\u672c",TotalRevenue:"\u7e3d\u6536\u5165",TotalYield:"\u7e3d\u767c\u96fb\u91cf",MeanYield:"\u5e73\u5747\u767c\u96fb\u91cf",ModuleCount:"\u5149\u4f0f\u677f\u7e3d\u6578"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"\u62cb\u7269\u7dda\u69fd\u65e5\u767c\u96fb\u91cf",ParabolicTroughYearlyYield:"\u62cb\u7269\u7dda\u69fd\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualParabolicTroughs:"\u986f\u793a\u6bcf\u884c\u62cb\u7269\u7dda\u69fd\u55ae\u7368\u767c\u96fb\u91cf"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"\u62cb\u7269\u7dda\u789f\u65e5\u767c\u96fb\u91cf",ParabolicDishYearlyYield:"\u62cb\u7269\u7dda\u789f\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualParabolicDishes:"\u986f\u793a\u6bcf\u500b\u62cb\u7269\u7dda\u789f\u55ae\u7368\u767c\u96fb\u91cf"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u65e5\u767c\u96fb\u91cf",FresnelReflectorYearlyYield:"\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualFresnelReflectors:"\u986f\u793a\u6bcf\u500b\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u55ae\u7368\u767c\u96fb\u91cf"},heliostatYieldPanel:{HeliostatDailyYield:"\u5b9a\u65e5\u93e1\u65e5\u767c\u96fb\u91cf",HeliostatYearlyYield:"\u5b9a\u65e5\u93e1\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualHeliostats:"\u986f\u793a\u6bcf\u500b\u5b9a\u65e5\u93e1\u55ae\u7368\u767c\u96fb\u91cf"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u65e5\u767c\u96fb\u91cf",UpdraftTowerYearlyYield:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u5e74\u767c\u96fb\u91cf",ChimneyAirTemperature:"\u7159\u56ea\u7a7a\u6c23\u6eab\u5ea6",ChimneyWindSpeed:"\u7159\u56ea\u98a8\u901f",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualUpdraftTowers:"\u986f\u793a\u6bcf\u500b\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u55ae\u7368\u767c\u96fb\u91cf"},heliodonPanel:{SunAndTimeSettings:"\u592a\u967d\u548c\u6642\u9593\u8a2d\u7f6e",SunAngles:"\u89d2\u5ea6",TwentyFourHours:"24\u5c0f\u6642"},cloudFilePanel:{CopyTitle:"\u62f7\u8c9d\u6a19\u984c",TitleCopiedToClipBoard:"\u6a19\u984c\u62f7\u8c9d\u5230\u526a\u8cbc\u677f",SearchByTitle:"\u6309\u6a19\u984c\u641c\u7d22",MyLikes:"\u6211\u559c\u6b61\u7684\u6a21\u578b",MyCloudFiles:"\u6211\u7684\u96f2\u6587\u4ef6",GenerateLink:"\u751f\u6210\u93c8\u63a5",LinkGeneratedInClipBoard:"\u93c8\u63a5\u751f\u6210\u5230\u526a\u8cbc\u677f",DoYouReallyWantToDelete:"\u60a8\u78ba\u5b9a\u522a\u9664\u6b64\u6587\u6a94",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"\u5982\u679c\u6b64\u6587\u6a94\u5df2\u88ab\u5206\u4eab\u6216\u767c\u5e03, \u6539\u540d\u6703\u4f7f\u5df2\u6709\u93c8\u63a5\u5931\u6548"},projectListPanel:{CopyTitle:"\u62f7\u8c9d\u6a19\u984c",TitleCopiedToClipBoard:"\u6a19\u984c\u62f7\u8c9d\u5230\u526a\u8cbc\u677f",SearchByTitle:"\u6309\u6a19\u984c\u641c\u7d22",MyProjects:"\u6211\u7684\u9805\u76ee",GenerateProjectLink:"\u751f\u6210\u9805\u76ee\u93c8\u63a5",ProjectLinkGeneratedInClipBoard:"\u9805\u76ee\u93c8\u63a5\u751f\u6210\u5230\u526a\u8cbc\u677f",DoYouReallyWantToDeleteProject:"\u60a8\u78ba\u5b9a\u522a\u9664\u9805\u76ee",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"\u5982\u679c\u6b64\u9805\u76ee\u5df2\u88ab\u5206\u4eab\u6216\u767c\u5e03, \u6539\u540d\u6703\u4f7f\u5df2\u6709\u93c8\u63a5\u5931\u6548"},projectPanel:{ProjectSettings:"\u9805\u76ee\u8a2d\u5b9a",ThumbnailImageSize:"\u7e2e\u7565\u5716\u5927\u5c0f",ProjectByOtherPeople:"\u5225\u4eba\u7684\u9805\u76ee",Project:"\u9805\u76ee",ProjectType:"\u985e\u522b",ProjectDescription:"\u63cf\u8ff0",MakeDescriptionEditable:"\u7de8\u8f2f\u63cf\u8ff0",MakeDescriptionNonEditable:"\u4e0d\u7de8\u8f2f\u63cf\u8ff0",DoubleClickToMakeDescriptionEditable:"\u96d9\u64ca\u6b64\u63cf\u8ff0\u6fc0\u6d3b\u7de8\u8f2f\u529f\u80fd",SolarPanelArray:"\u5149\u4f0f\u677f\u9663\u5217\u8a2d\u8a08",CurateCurrentDesign:"\u6536\u85cf\u7576\u524d\u8a2d\u8a08",UpdateSelectedDesign:"\u66f4\u65b0\u9078\u4e2d\u8a2d\u8a08",RemoveSelectedDesign:"\u522a\u9664\u9078\u4e2d\u8a2d\u8a08",ClickToFlipSortingOrder:"\u9ede\u64ca\u9006\u8f49\u6392\u5e8f\u65b9\u5411",DesignNotShownInSolutionSpaceClickToShow:"\u6b64\u8a2d\u8a08\u76ee\u524d\u4e0d\u986f\u793a\u5728\u8a2d\u8a08\u7a7a\u9593\u5167\uff0c\u9ede\u64ca\u986f\u793a",DesignShownInSolutionSpaceClickToHide:"\u6b64\u8a2d\u8a08\u76ee\u524d\u986f\u793a\u5728\u8a2d\u8a08\u7a7a\u9593\u5167,\u9ede\u64ca\u96b1\u85cf",DistributionInSolutionSpace:"\u65b9\u6848\u5728\u8a2d\u8a08\u7a7a\u9593\u88e1\u7684\u5206\u4f48",ChooseSolutionSpace:"\u9078\u64c7\u8a2d\u8a08\u7a7a\u9593",ChooseDataColoring:"\u9078\u64c7\u6578\u64da\u8457\u8272",SameColorForAllDesigns:"\u6240\u6709\u8a2d\u8a08\u4e00\u500b\u984f\u8272",OneColorForEachDesign:"\u6bcf\u500b\u8a2d\u8a08\u4e00\u500b\u984f\u8272",SolutionSpaceScreenshot:"\u8a2d\u8a08\u7a7a\u9593\u622a\u5716",ScatteredPlotScreenshot:"\u6563\u9ede\u5716\u622a\u5716",SingleClickToSelectDoubleClickToOpen:"\u55ae\u64ca\u9078\u64c7\uff0c\u96d9\u64ca\u6253\u958b\u3002",SingleClickToDeselectDoubleClickToOpen:"\u55ae\u64ca\u53d6\u6d88\u9078\u64c7\uff0c\u96d9\u64ca\u6253\u958b\u3002",GenerateScatteredPlot:"\u751f\u6210\u6563\u9ede\u5716",SelectXAxis:"\u9078\u64c7X\u8ef8",SelectYAxis:"\u9078\u64c7Y\u8ef8"},accountSettingsPanel:{MyAccountSettings:"\u6211\u7684\u8cec\u6236\u8a2d\u5b9a",MyID:"\u6211\u7684\ud83c\udd94",ClickToCopyMyID:"\u9ede\u64ca\u6b64\u8655\u62f7\u8c9d\u6211\u7684ID",IDInClipBoard:"\u60a8\u73fe\u5728\u53ef\u4ee5\u7c98\u8cbcID\u4e86\u3002",StoreMyNameInMyFilesWhenSaving:"\u4fdd\u5b58\u6587\u6a94\u6642\u7c64\u4e0a\u6211\u7684\u5927\u540d",DoYouReallyWantToShowYourNameInYourFiles:"\u60a8\u78ba\u5b9a\u5728\u60a8\u7684\u6587\u6a94\u88e1\u4fdd\u5b58\u60a8\u7684\u5927\u540d\u55ce\uff1f",SignFileDisclaimer:"\u5982\u679c\u60a8\u9078\u64c7\u4fdd\u5b58\uff0c\u60a8\u7684\u5927\u540d\u53ef\u80fd\u88ab\u6240\u6709\u6253\u958b\u60a8\u7684\u6587\u6a94\u7684\u4eba\u770b\u5230\u3002",Likes:"\u9ede\u8d0a\u7e3d\u6578",AllPublished:"\u767c\u4f48\u7e3d\u6578",PublishedUnderAliases:"\u522b\u540d\u767c\u4f48",UserCount:"\u7528\u6236\u7e3d\u6578",SchoolID:"\u5b78\u6821\u7de8\u865f",ClassID:"\u73ed\u7d1a\u7de8\u865f"},weatherPanel:{SunshineHours:"\u65e5\u7167\u6642\u9593"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"\u9078\u64c7\u6c23\u6eab\u6a21\u578b",Sinusoidal:"\u6b63\u5f26\u51fd\u6578"},economicsPanel:{EconomicsParameters:"\u7d93\u6fdf\u5b78\u53c3\u6578",ElectricitySellingPrice:"\u92b7\u552e\u96fb\u50f9",OperationalCostPerUnit:"\u55ae\u4f4d\u904b\u884c\u6210\u672c",SellingPrice:"\u92b7\u552e\u96fb\u50f9",UnitCost:"\u55ae\u4f4d\u6210\u672c"},navigationPanel:{NavigationParameters:"\u5c0e\u822a\u6a21\u5f0f\u53c3\u6578",MinimumMoveSpeed:"\u6700\u5c0f\u79fb\u52d5\u901f\u5ea6",MinimumTurnSpeed:"\u6700\u5c0f\u62d0\u5f4e\u901f\u5ea6"},yearlyLightSensorPanel:{SkyClearness:"\u5929\u7a7a\u6e05\u6670\u5ea6",ShowDaylightResults:"\u986f\u793a\u65e5\u7167\u6642\u9593\u7d50\u679c",ShowSkyClearnessResults:"\u986f\u793a\u5929\u7a7a\u6e05\u6670\u5ea6\u7d50\u679c",ShowAverageDailySolarRadiation:"\u986f\u793a\u65e5\u5e73\u5747\u8f3b\u5c04\u7d50\u679c"},analysisManager:{NoSensorForCollectingData:"\u6c92\u6709\u50b3\u611f\u5668\u6536\u96c6\u6578\u64da\u3002",NoSolarPanelForAnalysis:"\u6c92\u6709\u5149\u4f0f\u677f\u53ef\u4ee5\u5206\u6790\u3002",NoObserverForVisibilityAnalysis:"\u6c92\u6709\u627e\u5230\u53ef\u898b\u5ea6\u5206\u6790\u7684\u89c0\u5bdf\u8005\u3002",NoWaterHeaterForAnalysis:"\u6c92\u6709\u592a\u967d\u80fd\u71b1\u6c34\u5668\u53ef\u4ee5\u5206\u6790\u3002",NoParabolicDishForAnalysis:"\u6c92\u6709\u62cb\u7269\u7dda\u789f\u53ef\u4ee5\u5206\u6790\u3002",NoParabolicTroughForAnalysis:"\u6c92\u6709\u62cb\u7269\u7dda\u69fd\u53ef\u4ee5\u5206\u6790\u3002",NoFresnelReflectorForAnalysis:"\u6c92\u6709\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u53ef\u4ee5\u5206\u6790\u3002",NoHeliostatForAnalysis:"\u6c92\u6709\u5b9a\u65e5\u93e1\u53ef\u4ee5\u5206\u6790\u3002",NoSolarUpdraftTowerForAnalysis:"\u6c92\u6709\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u53ef\u4ee5\u5206\u6790\u3002",NoBuildingForAnalysis:"\u6c92\u6709\u5efa\u7bc9\u7269\u53ef\u4ee5\u5206\u6790\u3002"},toolbar:{CloudFile:"\u96f2\u6587\u6a94",Select:"\u9078\u64c7",AddFoundation:"\u6dfb\u52a0\u5730\u57fa",AddWall:"\u6dfb\u52a0\u7246\u9ad4",AddWindow:"\u6dfb\u52a0\u7a97\u6236",AddDoor:"\u6dfb\u52a0\u9580",AddPyramidRoof:"\u6dfb\u52a0\u91d1\u5b57\u5854\u5c4b\u9802",AddGableRoof:"\u6dfb\u52a0\u96d9\u5761\u5c4b\u9802",AddHipRoof:"\u6dfb\u52a0\u56db\u5761\u5c4b\u9876",AddGambrelRoof:"\u6dfb\u52a0\u590d\u659c\u5c4b\u9876",AddMansardRoof:"\u6dfb\u52a0\u6298\u7dda\u5c4b\u9876",AddCuboid:"\u6dfb\u52a0\u9577\u65b9\u9ad4",AddSensor:"\u6dfb\u52a0\u50b3\u611f\u5668",AddSolarPanel:"\u6dfb\u52a0\u5149\u4f0f\u677f",AddWaterHeater:"\u6dfb\u52a0\u592a\u967d\u80fd\u71b1\u6c34\u5668",AddParabolicDish:"\u6dfb\u52a0\u62cb\u7269\u7dda\u789f",AddParabolicTrough:"\u6dfb\u52a0\u62cb\u7269\u7dda\u69fd",AddFresnelReflector:"\u6dfb\u52a0\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",AddHeliostat:"\u6dfb\u52a0\u5b9a\u65e5\u93e1",AddWindTurbine:"\u6dfb\u52a0\u98a8\u529b\u6e26\u8f2a\u6a5f",AddLight:"\u6dfb\u52a0\u96fb\u71c8",AddTree:"\u6dfb\u52a0\u6a39\u6728",AddFlower:"\u6dfb\u52a0\u82b1\u8349",AddPeople:"\u6dfb\u52a0\u4eba\u7269",DoubleClickToLockThisModeForNextAction:"\u96d9\u64ca\u6309\u9215\u7d66\u4e0b\u500b\u52d5\u4f5c\u9396\u5b9a\u6b64\u6a21\u5f0f",ClickToUnlockThisModeForNextAction:"\u9ede\u64ca\u6309\u9215\u8b93\u52d5\u4f5c\u5b8c\u6210\u5373\u96e2\u958b\u6b64\u6a21\u5f0f",ManipulateGroup:"\u6574\u9ad4\u64cd\u4f5c\u4e00\u500b\u7d44",ClearScene:"\u6e05\u7a7a\u5834\u666f",ShowSunAndTimeSettings:"\u986f\u793a\u592a\u967d\u548c\u6642\u9593\u8a2d\u7f6e",SpatialAnalysisOfEnergy:"\u80fd\u91cf\u7684\u7a7a\u9593\u5206\u6790",DoYouReallyWantToClearContent:"\u60a8\u78ba\u5b9a\u6e05\u7a7a\u5834\u666f\u55ce",ClickForMoreButtons:"\u9ede\u64ca\u6b64\u8655\u5207\u63db\u5230\u66f4\u591a\u7684\u6309\u9215\u6a21\u5f0f",SwitchToAddingFoundation:"\u5207\u63db\u5230\u6dfb\u52a0\u5730\u57fa\u6a21\u5f0f",SwitchToAddingCuboid:"\u5207\u63db\u5230\u6dfb\u52a0\u9577\u65b9\u9ad4\u6a21\u5f0f",SwitchToAddingWall:"\u5207\u63db\u5230\u6dfb\u52a0\u7246\u9ad4\u6a21\u5f0f",SwitchToAddingWindow:"\u5207\u63db\u5230\u6dfb\u52a0\u7a97\u6236\u6a21\u5f0f",SwitchToAddingDoor:"\u5207\u63db\u5230\u6dfb\u52a0\u9580\u6a21\u5f0f",SwitchToAddingPyramidRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u91d1\u5b57\u5854\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingGableRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u96d9\u5761\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingHipRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u56db\u5761\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingGambrelRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u590d\u659c\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingMansardRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u6298\u7dda\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingSolarPanel:"\u5207\u63db\u5230\u6dfb\u52a0\u5149\u4f0f\u677f\u6a21\u5f0f",SwitchToAddingSensor:"\u5207\u63db\u5230\u6dfb\u52a0\u50b3\u611f\u5668\u6a21\u5f0f",SwitchToAddingWaterHeater:"\u5207\u63db\u5230\u6dfb\u52a0\u592a\u967d\u80fd\u71b1\u6c34\u5668\u6a21\u5f0f",SwitchToAddingParabolicDish:"\u5207\u63db\u5230\u6dfb\u52a0\u62cb\u7269\u7dda\u789f\u6a21\u5f0f",SwitchToAddingParabolicTrough:"\u5207\u63db\u5230\u6dfb\u52a0\u62cb\u7269\u7dda\u69fd\u6a21\u5f0f",SwitchToAddingFresnelReflector:"\u5207\u63db\u5230\u6dfb\u52a0\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u6a21\u5f0f",SwitchToAddingHeliostat:"\u5207\u63db\u5230\u6dfb\u52a0\u5b9a\u65e5\u93e1\u6a21\u5f0f",SwitchToAddingWindTurbine:"\u5207\u63db\u5230\u6dfb\u52a0\u98a8\u529b\u6e26\u8f2a\u6a5f\u6a21\u5f0f",SwitchToAddingLight:"\u5207\u63db\u5230\u6dfb\u52a0\u96fb\u71c8\u6a21\u5f0f",SwitchToAddingTree:"\u5207\u63db\u5230\u6dfb\u52a0\u6a39\u6728\u6a21\u5f0f",SwitchToAddingFlower:"\u5207\u63db\u5230\u6dfb\u52a0\u82b1\u8349\u6a21\u5f0f",SwitchToAddingPeople:"\u5207\u63db\u5230\u6dfb\u52a0\u4eba\u7269\u6a21\u5f0f"},tooltip:{gotoIFI:"\u8a2a\u554f\u672a\u4f86\u667a\u80fd\u7814\u7a76\u6240",visitAladdinHomePage:"\u8a2a\u554f\u963f\u62c9\u4e01\u4e3b\u9801",clickToOpenMenu:"\u9ede\u64ca\u6253\u958b\u4e3b\u83dc\u55ae",clickToAccessAccountSettings:"\u9ede\u64ca\u6253\u958b\u8cec\u865f\u8a2d\u5b9a"},tree:{Apple:"\u860b\u679c\u6a39",Birch:"\u767d\u6a3a",Coconut:"\u6930\u5b50\u6a39",Dogwood:"\u8331\u8438",Elm:"\u6986\u6a39",FanPalm:"\u6247\u8449\u68d5\u6ada",Linden:"\u83e9\u63d0",Magnolia:"\u7389\u862d",Maple:"\u6953\u6a39",Oak:"\u6a61\u6a39",Pine:"\u677e\u6a39",Spruce:"\u96f2\u6749"},flower:{Bellflower:"\u9234\u862d",Boxwood:"\u9ec3\u694a",CactusCombo1:"\u4ed9\u4eba\u638c\u7d44\u5408\u4e00",CactusCombo2:"\u4ed9\u4eba\u638c\u7d44\u5408\u4e8c",CactusCombo3:"\u4ed9\u4eba\u638c\u7d44\u5408\u4e09",CactusCombo4:"\u4ed9\u4eba\u638c\u7d44\u5408\u56db",Hibiscus:"\u6728\u69ff",Hosta:"\u7389\u7c2a",Hydrangea:"\u7e61\u7403\u82b1",Peony:"\u7261\u4e39",RedRose:"\u7d05\u73ab\u7470",Spirea:"\u7e61\u7dda\u83ca",Sunflower:"\u5411\u65e5\u8475",TallBush:"\u9ad8\u704c\u6728",Tulip:"\u9b31\u91d1\u9999",WhiteFlower:"\u767d\u82b1",YellowFlower:"\u9ec4\u82b1"},people:{Jaah:"\u8cc8\u963f",Jack:"\u5091\u514b",Jacob:"\u96c5\u5404\u5e03",Jacqueline:"\u6770\u594e\u7433",Jade:"\u7f8e\u7389",Jamelia:"\u6f54\u7c73\u8389\u96c5",James:"\u8a79\u59c6\u65af",Jane:"\u7c21",Jaya:"\u4f73\u5a6d",Jaye:"\u5091\u4f0a",Jeanette:"\u73cd\u59ae\u7279",Jedi:"\u5091\u8fea",Jeff:"\u5091\u592b",Jena:"\u73cd\u5a1c",Jennifer:"\u73cd\u5c3c\u5f17",Jess:"\u5091\u897f",Jett:"\u5091\u7279",Jill:"\u5409\u723e",Jiya:"\u5409\u5a05",Joan:"\u74ca",Jocelyn:"\u55ac\u65af\u6797",Joel:"\u55ac\u723e",Joey:"\u55ac\u4f0a",John:"\u7d04\u7ff0",Jonathon:"\u55ac\u7d0d\u68ee",Jose:"\u4f55\u585e",Joseph:"\u7d04\u745f\u592b",Joshua:"\u7d04\u66f8\u4e9e",Judd:"\u8cc8\u5fb7",Judy:"\u6731\u8482",Julia:"\u6731\u8389\u5a6d",Julio:"\u80e1\u91cc\u5965",Jumapili:"\u7956\u746a\u5339\u8389",June:"\u6e96\u885b",Juro:"\u6731\u8afe",Justin:"\u8cc8\u65af\u6c40"},compass:{N:"\u5317",S:"\u5357",W:"\u897f",E:"\u6771"},month:{January:"\u4e00\u6708",February:"\u4e8c\u6708",March:"\u4e09\u6708",April:"\u56db\u6708",May:"\u4e94\u6708",June:"\u516d\u6708",July:"\u4e03\u6708",August:"\u516b\u6708",September:"\u4e5d\u6708",October:"\u5341\u6708",November:"\u5341\u4e00\u6708",December:"\u5341\u4e8c\u6708"},modelsMap:{SearchByPublisher:"\u6309\u767c\u5e03\u8005\u641c\u7d22",SearchByLabel:"\u6309\u6a19\u7c64\u641c\u7d22",MyPublishedModels:"\u6211\u767c\u5e03\u7684\u6a21\u578b",TotalNumberOfUserPublishedModels:"\u7528\u6236\u767c\u5e03\u7684\u6a21\u578b\u7e3d\u6578",SortFromOldestToNewest:"\u5f9e\u65e9\u5230\u665a\u6392\u5e8f",SortFromNewestToOldest:"\u5f9e\u665a\u5230\u65e9\u6392\u5e8f",ModelsFoundOnThisSite:"\u500b\u6a21\u578b\u5728\u6b64\u4f4d\u7f6e",ShowModelsPublishedByThisAuthor:"\u5c55\u793a\u6b64\u7528\u6236\u767c\u5e03\u7684\u6a21\u578b"}}},es:{translation:{name:{IFI:"Instituto de inteligencia futura",Aladdin:"Aladdin",Tagline:"Aladdin: Reimagining Design with Explainable AI \u2014 Institute for Future Intelligence"},cookie:{Statement:"Clicando Aceptar, autoriza el uso de cookies para mejora la experiencia con Aladdin",Accept:"Aceptar"},aboutUs:{ProductBroughtToYouBy:"Este producto esta hecho por",TermsOfService:"T\xe9rminos de servicio",PrivacyPolicy:"Pol\xedtica de privacidad",Software:"Programa",Content:"Contenido",Research:"Investigaci\xf3n",Support:"Ayuda",Acknowledgment:"Agradecimientos",FundingInformation:"La National Science Foundation (NSF) proporcion\xf3 generosamente fondos para la investigaci\xf3n y el desarrollo de este producto a trav\xe9s de las subvenciones con n\xfamero #2105695, #2131097, y #2301164. Sin embargo, todas las opiniones, hallazgos y conclusiones o recomendaciones expresados en este producto pertenecen a los autores y no reflejan necesariamente los puntos de vista de la NSF.",Contact:"Para m\xe1s informaci\xf3n, por favor contacte con Charles Xie (charles@intofuture.org).",Translators:"Translators"},word:{LastUpdate:"Last Update",Small:"Small",Medium:"Medium",Large:"Large",Design:"Design",Information:"Information",Type:"Type",Text:"Text",FontSize:"Font Size",FontColor:"Font Color",Model:"Model",Models:"Models",Upload:"Upload",ClickCount:"Click Count",Share:"Share",AlreadyLike:"Already like",Like:"Like",MustLogInToLike:"Must log in to like",AllRightsReserved:"Todos los derechos reservados",MeterAbbreviation:"m",Version:"Versi\xf3n",VersionInitial:"V",Options:"Opciones",Maximum:"Maximum",Minimum:"Minimum",MaximumNumber:"N\xfamero m\xe1ximo",MinimumNumber:"Minimum Number",MaximumValue:"Maximum Value",MinimumValue:"Minimum Value",Or:"O",None:"Ninguno",High:"High",Partial:"Partial",Teacher:"Profesor",Class:"Clase",Total:"Total",Leaderboard:"Leaderboard",Latest:"Latest",Range:"Rango",SIUnit:"SI Unit",USUnit:"US Unit",ThermalTransmittance:"Thermal Transmittance",ThermalResistance:"Thermal Resistance",UValue:"U-Value",RValue:"R-Value",VolumetricHeatCapacity:"Volumetric Heat Capacity",BuildingHVACSystem:"Building HVAC System",ThermostatSetpoint:"Thermostat Setpoint",TemperatureToleranceThreshold:"Tolerance Threshold",TemperatureToleranceThresholdExplanation:"Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.",Press:"Press",Open:"Abrir",Save:"Guardar",SaveAsImage:"Guardar como imagen",SaveAsCsv:"Save as CSV",Update:"Actualizar",Paste:"Pegar",Copy:"Copiar",Cut:"Cortar",Delete:"Eliminar",Lock:"Cerrar con llave",Translucent:"Translucent",Color:"Color",Texture:"Textura",Size:"Tama\xf1o",Thickness:"Grosor",Yes:"S\xed",No:"No",OK:"OK",Cancel:"Cancelar",Apply:"Aplicar",Close:"Cerrar",ApplyTo:"Aplicar a",Run:"Run",Pause:"Pause",Resume:"Resume",Clear:"Limpiar",Warning:"Aviso",Caution:"Caution",Reminder:"Reminder",Length:"Longitud",Width:"Ancho",Height:"Altura",Radius:"Radius",Angle:"\xc1ngulo",Azimuth:"Azimut",Coordinates:"Coordinates",Weather:"Tiempo",Show:"Mostrar",Animate:"Animar",Date:"Fecha",Time:"Tiempo",Title:"T\xedtulo",Owner:"Propietario",Action:"Acci\xf3n",Rename:"Renombrar",Location:"Location",Latitude:"Latitud",Month:"Mes",Day:"D\xeda",Hour:"Hora",Daylight:"Luz solar",Radiation:"Radiaci\xf3n",Temperature:"Temperatura",kWh:"kWh",dollar:"dollar",MeterPerSecond:"m/s",NorthInitial:"N",SouthInitial:"S",EastInitial:"E",WestInitial:"O",Fixed:"Fixed",Elements:"Elements",Energy:"Energy",Unknown:"Unknown",Label:"Label",Description:"Description",NoDescription:"No description",MaximumCharacters:"Maximum characters",Author:"Author",Publisher:"Publisher",Building:"Building",ResidentialBuilding:"Residential Building",CommercialBuilding:"Commercial Building",SchoolBuilding:"School Building",TouristAttraction:"Tourist Attraction",UnderConstruction:"Under Construction",Photovoltaic:"Photovoltaic",Anonymous:"Anonymous",Nickname:"Nickname",Pin:"Pin",Unpin:"Unpin"},shared:{NoTexture:"Sin textura",FoundationElement:"Bases",CuboidElement:"Cuboide",PolygonElement:"Pol\xedgon",SensorElement:"Sensor",SolarPanelElement:"Panel solar",WaterHeaterElement:"Water Heater",ParabolicDishElement:"Parabolic Dish",ParabolicTroughElement:"Parabolic Trough",FresnelReflectorElement:"Fresnel Reflector",HeliostatElement:"Heliostat",WindTurbineElement:"Wind Turbine",LightElement:"Light",ElementLocked:"Bloqueado",ModelType:"Model Type",OutputBreakdown:"Breakdown",MoreResults:"More Results"},message:{ModelNotFound:"Model not found",CannotSignIn:"Cannot sign in",CannotSignOut:"Cannot sign out",YourAccountWasCreated:"Your account was created.",CannotCreateAccount:"Cannot create an account",YourAccountSettingsWereSaved:"Your account settings were saved.",CannotSaveYourAccountSettings:"Cannot save your account settings",CannotSaveYourFileToCloud:"Cannot save your file to the cloud",CannotCreateNewProject:"Cannot create a new project",CannotCreateNewProjectWithoutTitle:"Cannot create a new project without a title",CannotOpenYourProjects:"Cannot open your projects",CannotOpenProject:"Cannot open the project",CannotDeleteProject:"Cannot delete the project",CannotRenameProject:"Cannot rename the project",CannotAddDesignToProject:"Cannot add this design to the project",CannotAddDesignToProjectOwnedByOthers:"Cannot add this design to a project owned by others",DesignRemovedFromProject:"The design was successfully removed from the project",CannotRemoveDesignFromProject:"Cannot remove this design from the project",CannotUpdateProject:"Cannot update the project",CannotFetchProjectData:"Cannot fetch project data",TitleUsedChooseDifferentOne:"This title has been used. Choose a different one",CloudFileWithTitleExistsDoYouWantToOverwrite:"A cloud file with the title exists. Do you want to overwrite it?",CloudFileNotFound:"The cloud file was not found",CannotLoadModelsOnMap:"Cannot load models on map",CannotLoadLeaderboard:"Cannot load leaderboard",CannotPublishModelOnMap:"Cannot publish model on map",CannotLikeModelFromMap:"Cannot like model from map",CannotDeleteModelFromMap:"Cannot delete model from map",ModelDeletedFromMap:"Model is deleted from map",DoYouWantToDeleteModelFromMap:"Do you want to delete the model from map?",CannotOpenCloudFile:"Cannot open the cloud file",CannotReadCloudFile:"Cannot read the cloud file",CannotWriteCloudFile:"Cannot write the cloud file",CloudFileCopied:"Cloud file copied",CannotOpenCloudFolder:"Cannot open your cloud folder",CannotDeleteCloudFile:"Cannot delete the cloud file",CannotRenameCloudFile:"Cannot rename the cloud file",DoYouWantToSaveChanges:"\xbfQuieres guardar los cambios?",NotApplicableToSelectedAction:"No se aplica a la acci\xf3n seleccionada",ThisElementIsLocked:"Este elemento est\xe1 bloqueado",ThisCannotBeUndone:"Esto no se puede deshacer",AzimuthOfNorthIsZero:"Azimut del norte es 0\xb0",CounterclockwiseAzimuthIsPositive:"Hacia la izquierda es positivo",MoveCancelledBecauseOfOverlap:"Move cancelled because of overlap.",MoveOutsideBoundaryCancelled:"Move outside the boundary cancelled.",RotationCancelledBecauseOfOverlap:"Rotation cancelled because of overlap.",RotationOutsideBoundaryCancelled:"Rotation outside the boundary cancelled.",ResizingCancelledBecauseOfOverlap:"Resizing cancelled because of overlap.",ResizingOutsideBoundaryCancelled:"Resizing outside the boundary cancelled.",CannotPasteOutsideBoundary:"Cannot paste outside this surface.",CannotPasteBecauseOfOverlap:"Cannot paste because of overlap.",CannotMoveObjectTooFar:"Cannot move object too far.",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"Existing solar panels will be removed before applying the new layout.",DoYouWantToContinue:"Do you want to continue?",SolarPanelsCannotIntersectWithGround:"Solar panels cannot intersect with the ground.",SolarPanelsCannotOverlapWithOneAnother:"Solar panels cannot overlap with one another.",ScreenshotSaved:"A screenshot was saved.",CsvFileSaved:"A CSV file was saved.",SimulationStarted:"Simulation started.",SimulationCompleted:"Simulation completed.",SimulationAborted:"Simulation aborted.",SimulationPaused:"Simulation paused.",CancelSimulation:"Cancel simulation",PauseSimulation:"Pause simulation",ResumeSimulation:"Resume simulation",SimulationWillNotStartDueToErrors:"Simulation will not start due to errors",SimulationWillStartDespiteWarnings:"Simulation will start despite warnings.",EvolutionStarted:"Evolution started.",EvolutionCompleted:"Evolution completed.",EvolutionAborted:"Evolution aborted.",EvolutionPaused:"Evolution paused.",EncounterEvolutionError:"Encountered an evolution error.",CancelEvolution:"Cancel evolution",PauseEvolution:"Pause evolution",ResumeEvolution:"Resume evolution",ConvergenceThresholdHasBeenReached:"The convergence threshold has been reached.",MaximumNumberOfGenerationsHasBeenReached:"The maximum number of generations has been reached.",MaximumNumberOfStepsHasBeenReached:"The maximum number of steps has been reached.",ObjectiveFunctionTypeError:"The current objective function is not supported by this operation. Please start from the menu.",WallsAreNotAtSameHeight:"Walls are not at the same height.",WallsAreNotPerpendicular:"Walls are not perpendicular.",WallsAreNotConnected:"Walls are not connected.",WallsNumberNeedToBeFour:"The number of walls needs to be four.",BuildingContainsEmptyWall:"Building contains one or more empty wall.",BuildingRoofMissing:"Building has a missing roof.",UnknownErrors:"Unknown errors."},menu:{AnalysisOptions:"Analysis Options",option:{GridCellSize:"Grid Cell Size",SamplingFrequency:"Frecuencia de muestreo",TimesPerHour:"Veces per hora",DaysPerYear:"Days per Year"},mainMenu:"Menu principal",cloudMenu:"Men\xfa en la nube",projectSubMenu:"Project",project:{CreateNewProject:"Create New Project",OpenProject:"Open Project",SaveProjectAs:"Save Project As",YouMustLogInToCreateProject:"You must log in to create a new project",YouMustLogInToOpenProject:"You must log in to open a project"},fileSubMenu:"Archivo",file:{CreateNewFile:"Crear nuevo archivo",OpenLocalFile:"Abrir archivo local",SaveAsLocalFile:"Guardar como archivo local",SavingAbortedMustHaveValidFileName:"!Error guardando! Debes tener un nombre de archivo v\xe1lido",OpenCloudFile:"Abrir archivo en la nube",SaveCloudFile:"Guardar archivo en la nube",SaveAsCloudFile:"Guardar como archivo en la nube",SavingAbortedMustHaveValidTitle:"!Error guardando! Debes tener un t\xedtulo v\xe1lido para el archivo en la nube",ToSaveYourWorkPleaseSignIn:"Para guardar tu trabajo, por favor reg\xedstrese.",TakeScreenshot:"Hacer captura de pantalla",UseCloudFileName:"Use Cloud File Name",PublishOnModelsMap:"Publish on Models Map",PublishedOnModelsMap:"Your model has been published on the Models Map",UpdatedOnModelsMap:"Your model has been updated on the Models Map",YouMustLogInToPublishYourModel:"You must log in to publish your model",YouCannotPublishAModelThatYouDoNotOwn:"You cannot publish a model that you do not own",YouMustSaveModelOnCloudBeforePublishingIt:"You must save the model on the cloud before publishing it"},editSubMenu:"Editar",edit:{Undo:"Deshacer",Redo:"Repetir"},viewSubMenu:"Vista",view:{NavigationView:"Navigation View",TwoDimensionalView:"Vista 2D",ResetView:"Resetear",ZoomIn:"Acercar",ZoomOut:"Alejar",AutoRotate:"Auto rotaci\xf3n",ShowShadow:"Mostrar sombra",ShowSurfaceShininess:"Show Surface Shininess",TranslucentFloatingWindows:"Translucent Floating Windows",accessoriesSubMenu:"Accessories",accessories:{SiteInformation:"Informaci\xf3n del sitio",DesignInformation:"Informaci\xf3n de dise\xf1o",Instruction:"Instrucci\xf3n",StickyNote:"Nota adhesiva",Note:"Nota"}},settingsSubMenu:"Settings",settings:{WeatherData:"Datos del tiempo",DiurnalTemperature:"Diurnal Temperature",Heliodon:"Heliodon",SunAndTime:"Sun & Time"},benchmarksSubMenu:"Benchmarks",benchmarks:{SolarRadiationPredictionVsMeasurement:"Solar Radiation Prediction vs. Measurement",BESTESTCase600:"Building Energy Simulation Test: BESTEST Case 600",BESTESTCase610:"Building Energy Simulation Test: BESTEST Case 610",BESTESTCase620:"Building Energy Simulation Test: BESTEST Case 620",BESTESTCase630:"Building Energy Simulation Test: BESTEST Case 630"},graph:{LineWidth:"Line Width",SymbolSize:"Symbol Size",BarCategoryGap:"Bar Category Gap",ShowHorizontalGridLines:"Show Horizontal Grid Lines",ShowVerticalGridLines:"Show Vertical Grid Lines"},analysisSubMenu:"An\xe1lisis",physicsSubMenu:"Physics",physics:{DailySolarRadiationHeatmap:"Daily Solar Radiation Heatmap",SolarRadiationHeatmapOptions:"Solar Radiation Heatmap Options",SolarRadiationHeatmapGridCellSize:"Solar Radiation Heatmap Grid Cell Size",SolarRadiationHeatmapMaxValue:"Solar Radiation Heatmap Maximum Value",SolarRadiationHeatmapNoAnimation:"No Animation for Static Model",ReflectionHeatmap:"Reflection Heatmap"},sensorSubMenu:"Sensores",sensor:{CollectDailyData:"Recoger datos diarios",CollectYearlyData:"Recoger datos anuales",SensorSimulationNoAnimation:"No Animation for Collecting Sensor Data"},buildingSubMenu:"Building",building:{AnalyzeDailyBuildingEnergy:"Analyze Daily Building Energy",AnalyzeYearlyBuildingEnergy:"Analyze Yearly Building Energy",EnergyAnalysisOptions:"Energy Analysis Options",EnergyGridCellSize:"Energy Grid Cell Size",BuildingEnergySimulationNoAnimation:"No Animation for Building Energy Simulation"},solarPanelSubMenu:"Paneles solares",solarPanel:{AnalyzeDailyYield:"Analizar el rendimiento diario",AnalyzeYearlyYield:"Analizar el rendimiento anual",AnalyzeVisibility:"Analyze Visibility",PanelDiscretization:"Discretizaci\xf3n del panel",Exact:"Exacto",Approximate:"Aproximado",EnergyGridCellSize:"Energy Grid Cell Size",VisibilityGridCellSize:"View Factor Grid Cell Size",EnergyAnalysisOptions:"Energy Analysis Options",VisibilityAnalysisOptions:"Visibility Analysis Options",SolarPanelSimulationNoAnimation:"No Animation for Solar Panel Simulation"},parabolicTroughSubMenu:"Parabolic Trough",parabolicTrough:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},parabolicDishSubMenu:"Parabolic Dish",parabolicDish:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},fresnelReflectorSubMenu:"Fresnel Reflector",fresnelReflector:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},heliostatSubMenu:"Heliostat",heliostat:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},solarUpdraftTowerSubMenu:"Solar Updraft Tower",solarUpdraftTower:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield",SolarUpdraftTowerSimulationNoAnimation:"No Animation for Solar Updraft Tower Simulation"},tutorialsSubMenu:"Tutorials",solarEnergyScienceSubMenu:"Solar Science",solarEnergyScienceTutorials:{SunAngles:"\xc1ngulos solares relativos a un observador en el suelo",InsolationAndClimate:"Insolation and Climate",SolarRadiationToBox:"Radiaci\xf3n solar a una caja"},buildingScienceSubMenu:"Building Science",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"Thermal Envelope vs. Building Envelope",EffectOfSizeOnBuildingEnergy:"Effect of Size on Building Energy",EffectOfOrientationOnBuildingEnergy:"Effect of Orientation on Building Energy",EffectOfInsulationOnBuildingEnergy:"Effect of Insulation on Building Energy",EffectOfRoofColorOnBuildingEnergy:"Effect of Roof Color on Building Energy",EffectOfEavesOverhangLengthOnBuildingEnergy:"Effect of Eaves Overhang Length on Building Energy",EffectOfWindowSHGCOnBuildingEnergy:"Effect of Window Solar Heat Gain on Building Energy",EffectOfThermostatSetpointOnBuildingEnergy:"Effect of Thermostat Setpoint on Building Energy",EffectOfSolarPanelsOnBuildingEnergy:"Effect of Solar Panels on Building Energy",EffectOfGroundTemperatureOnBuildingEnergy:"Effect of Ground Temperature on Building Energy",EffectOfTreesOnBuildingEnergy:"Effect of Trees on Building Energy"},buildingDesignSubMenu:"Building Design",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"Cape Cod Style House with Shed Dormer",MansardRoofWithDormers:"Mansard Roof with Dormers",GableRoofVsHipRoof:"Gable Roof vs. Hip Roof",ColonialVsSaltbox:"Colonial vs. Saltbox",GambrelRoofVsMansardRoof:"Gambrel Roof vs. Mansard Roof",CombinationRoofVsBonnetRoof:"Combination Roof vs. Bonnet Roof",DutchGableRoof:"Dutch Gable Roof",GableAndValleyRoof:"Gable and Valley Roof",ClerestoryRoof:"Clerestory Roof",MonitorRoof:"Monitor Roof",AFrameHouse:"A-Frame House",HalfTimberedHouse:"Half-Timbered House",AllBasicRoofTypes:"All Basic Roof Types"},photovoltaicSolarPowerSubMenu:"Photovoltaic Solar Power",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"Effect of Tilt Angle",EffectOfAzimuthOfSolarPanel:"Effect of Azimuth",SolarPanelTypes:"Solar Panel Types",VerticalBifacialSolarPanels:"Vertical Bifacial Solar Panels",CompareMonofacialAndBifacialSolarPanels:"Monofacial vs. Bifacial Solar Panels",SolarTrackers:"Seguidores solares",CoveringGroundWithSolarPanels:"Why Just Covering the Ground with Solar Panels is not a Good Idea",InterRowSpacingOfSolarPanelArray:"Effect of Inter-Row Spacing in a Solar Panel Array",EffectOfOrientationOfSolarPanels:"Effect of Orientation of Solar Panels",SolarPanelArrayAutomaticLayout:"Solar Panel Array Automatic Layout"},concentratedSolarPowerSubMenu:"Concentrated Solar Power",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"Effect of Azimuth of a Parabolic Trough",EffectOfLatusRectumOfParabolicTrough:"Effect of Latus Rectum of a Parabolic Trough",FocusSunlightWithParabolicDish:"Focus Sunlight with a Parabolic Dish",LinearFresnelReflectors:"Linear Fresnel Reflectors",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"Effect of Absorber Pipe Height for Linear Fresnel Reflectors",EffectOfAzimuthOfLinearFresnelReflectors:"Effect of Azimuth of Linear Fresnel Reflectors",LinearFresnelReflectorsWithTwoAbsorbers:"Linear Fresnel Reflectors with Two Absorbers",CosineEfficiencyOfHeliostats:"Cosine Efficiency of Heliostats",ShadowingAndBlockingOfHeliostats:"Shadowing and Blocking of Heliostats",EffectSolarPowerTowerHeight:"Effect of Solar Power Tower Height",SolarPowerTower:"Solar Power Tower"},otherTypesOfSolarPowerSubMenu:"Other Types of Solar Power",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"Solar Updraft Tower"},generativeDesignSubMenu:"Generative Design",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Monofacial Solar Panel Array",BifacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Bifacial Solar Panel Array",OutputOfSolarPanelArrayInDifferentPlaces:"The Output of a Solar Panel Array in Different Places",SimpleSolarFarmParetoFront:"The Pareto Front for Designing a Simple Solar Farm"},examplesSubMenu:"Ejemplos",solarEnergySubMenu:"Energ\xeda Solar",solarEnergyExamples:{SunBeamAndHeliodon:"Rayo de sol y heliodon",RooftopSolarPanels:"Rooftop Solar Panels",NevadaSolarOneParabolicTroughArray:"Nevada Solar One Parabolic Trough Array",TooeleParabolicDishArray:"Tooele Parabolic Dish Array",PS10SolarPowerTower:"PS10 Solar Power Tower",TucsonLinearFresnelReflectors:"Tucson Linear Fresnel Reflectors",SolarCanopyFormFactors:"Solar Canopy Form Factors",SolarCanopyOverBleachers:"Solar Canopy Over Bleachers",SolarCanopyOverGarage:"Solar Canopy Over Garage",SolarBusStop:"Solar Bus Stop",SolarFacadeTesla:"Tesla Solar Fa\xe7ade",BuildingIntegratedPhotovoltaics:"Building-Integrated Photovoltaics",Floatovoltaics:"Floatovoltaics",Agrivoltaics:"Agrivoltaics",VegetativeBuffer:"Vegetative Buffer",RainbowSwashSolarFarmBostonMA:"Rainbow Swash Solar Farm in Boston, MA",MickeyMouseSolarFarmOrlandoFL:"Mickey Mouse Solar Farm in Orlando, FL",SolarPanelsOverCanalBakersfieldCA:"Hypothetical Solar Panels Over Canal in Bakersfield, CA",SolarNoiseBarrierLexingtonMA:"Hypothetical Solar Noise Barrier in Lexington, MA",HSATSolarTrackersRaleighNC:"Horizontal Single Axis Trackers (HSAT) in Raleigh, NC",AADATSolarTrackersLancasterCA:"Azimuth\u2013Altitude Dual Axis Trackers (AADAT) in Lancaster, CA",SolarUpdraftTowerInCity:"Solar Updraft Tower in City"},builtEnvironmentSubMenu:"Built Environment",residentialBuildingsSubMenu:"Residential Buildings",residentialBuildingExamples:{ColonialHouse:"Colonial House",DutchColonialHouse:"Dutch Colonial House",TShapedHouse:"T-Shaped House",CapeCodHouseWithGarage:"Cape Cod House with Garage",Solarium:"Solarium",Church1:"Church 1",Cathedral1:"Cathedral 1",Cathedral2:"Cathedral 2",Mosque1:"Mosque 1",AdobeTaosHouse:"Adobe Taos House",RanchHouse:"Ranch House",BonnetHouse:"Bonnet House",BarnStyleHouse:"Barn Style House",ModernHouse:"Modern House",ButterflyRoofHouse:"Butterfly Roof House"},commercialBuildingsSubMenu:"Commercial Buildings",commercialBuildingExamples:{WhiteHouse:"White House",BilimMersinTurkiye:"BILIM, Mersin, Turkiye",SpanishStyleHotel:"Spanish Style Hotel",ApartmentBuilding:"Apartment Building",OfficeBuilding:"Edificio de oficinas",Hotel:"Hotel"},buildingComplexesSubMenu:"Building Complexes",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"South Burlington High School, VT",MescaleroApacheSchoolNewMexico:"Mescalero Apache School, NM"},urbanPlanningSubMenu:"Urban Planning",urbanPlanningExamples:{Heatmap1:"Heatmap"},otherBuildingsSubMenu:"Other Buildings",otherBuildingExamples:{Greenhouse:"Greenhouse",Pavilion:"Pavilion in a Park",OctagonalPagoda:"Octagonal Pagoda",OceanFront:"Ocean Front",EgyptianPyramids:"Egyptian Pyramids",MayanPyramid:"Mayan Pyramid",SiOSePol:"Si-o-se-pol",StackedCuboids:"Stacked Cuboids"},artificialIntelligenceSubMenu:"Artificial Intelligence",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"Optimizing the Tilt Angle of a Solar Panel Row",OptimizingTiltAnglesOfMultipleSolarPanelRows:"Optimizing the Tilt Angles of Multiple Solar Panel Rows",SolarFarmGenerativeDesign:"Solar Farm Generative Design",SolarFarmGenerativeDesignWithBlock:"Solar Farm Generative Design in the Presence of a Block",FitchburgSolarFarmGenerativeDesign:"Fitchburg Solar Farm Generative Design"},languageSubMenu:"Idioma",publicSubMenu:"Public",ModelsGallery:"Models Gallery",ModelsMap:"Models Map",AboutUs:"Sobre nosotros"},avatarMenu:{AccountSettings:"Configuraciones de la cuenta",PrivacyStatementTitle:"User Privacy Protection Statement",PrivacyStatement:"When you sign in, your Google ID is used to create and access your Aladdin account. Only a random alphanumeric string is stored in our database as a reference. No personally identifiable data such as your name or email is ever gathered. For more information, see our ",SignIn:"Iniciar sesi\xf3n",SignOut:"Desconectar",IfYouAreAStudent:"Si eres un estudiante"},skyMenu:{Axes:"Ejes",Theme:"Tema",ThemeDefault:"Por defecto",ThemeDesert:"Desierto",ThemeDune:"Dune",ThemeForest:"Bosque",ThemeGrassland:"Campo",ThemeHill:"Hill",ThemeLake:"Lake",ThemeMountain:"Mountain",ThemeRural:"Rural",SunlightAttenuationCoefficientInAir:"Sunlight Attenuation Coefficient in Air",ConvectiveCoefficientOfAir:"Convective Coefficient of Air",HighestTemperatureTimeInMinutes:"Highest Temperature Time (Minutes)",SelectSunAnglesToShow:"Select Sun Angles to Show",ShowAzimuthAngle:"Show Azimuth Angle",ShowElevationAngle:"Show Elevation Angle",ShowZenithAngle:"Show Zenith Angle",DirectLightBrightnessAtNoon:"Direct Light Brightness at Noon",AmbientLightBrightnessAtNoon:"Ambient Light Brightness at Noon"},groundMenu:{MonthlyIrradianceLoss:"Monthly Irradiance Loss",Vegetation:"Vegetation",LeafOutDay:"Leaf-Out Day",LeafOffDay:"Leaf-Off Day",Albedo:"Albedo",ImageOnGround:"Imagen en el suelo",WaterSurface:"Water Surface",RemoveAllUnlockedTrees:"Eliminar todos los \xe1rboles",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedPeople:"Eliminar toda la gente",RemoveAllUnlockedFoundations:"Eliminar todos las bases",RemoveAllUnlockedCuboids:"Eliminar todos los cuboides",DoYouReallyWantToRemoveAllPeople:"Est\xe1s seguro que quieres eliminar a toda la gente who are not locked",DoYouReallyWantToRemoveAllTrees:"Est\xe1s seguro que quieres eliminar todos los \xe1rboles that are not locked",DoYouReallyWantToRemoveAllFlowers:"Do you really want to remove all the flowers that are not locked",DoYouReallyWantToRemoveAllSolarPanels:"Do you really want to remove all the solar panels that are not locked",DoYouReallyWantToRemoveAllFoundations:"Est\xe1s seguro que quieres eliminar todas las bases that are not locked",DoYouReallyWantToRemoveAllCuboids:"Est\xe1s seguro que quieres eliminar todos los cuboides that are not locked",LockAllElements:"Lock All Elements",UnlockAllElements:"Unlock All Elements"},labelSubMenu:{Label:"Etiqueta",LabelText:"Label Text",LabelHeight:"Label Height",LabelSize:"Label Size",LabelFontSize:"Font Size",LabelColor:"Label Color",KeepShowingLabel:"Seguir mostrando etiqueta"},foundationMenu:{RemoveAllUnlockedSolarPanels:"Eliminar todos los paneles solares",RemoveAllUnlockedParabolicTroughs:"Remove All Unlocked Parabolic Troughs",RemoveAllUnlockedParabolicDishes:"Remove All Unlocked Parabolic Dishes",RemoveAllUnlockedFresnelReflectors:"Remove All Unlocked Fresnel Reflectors",RemoveAllUnlockedHeliostats:"Remove All Unlocked Heliostats",RemoveAllUnlockedSensors:"Eliminar todos los sensores",RemoveAllUnlockedLights:"Remove All Unlocked Lights",RemoveAllUnlockedWalls:"Eliminar todas las paredes",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",RemoveAllUnlockedPolygons:"Eliminar todos los pol\xedgonos",RemoveAllUnlockedHumans:"Remove All Humans",RemoveAllUnlockedTrees:"Remove All Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"Rejillas",Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",SolarPanels:"Paneles solares",SolarPanelArray:"Solar Panel Array",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"Est\xe1s seguro que quieres eliminar todos los paneles solares en esta base that are not locked",ParabolicTroughs:"Parabolic Troughs",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"Do you really want to remove all the parabolic troughs on this foundation that are not locked",ParabolicDishes:"Parabolic Dishes",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"Do you really want to remove all the parabolic dishes on this foundation that are not locked",FresnelReflectors:"Fresnel Reflectors",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"Do you really want to remove all the Fresnel reflectors on this foundation that are not locked",Heliostats:"Heliostats",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"Do you really want to remove all the heliostats on this foundation that are not locked",Sensors:"Sensores",DoYouReallyWantToRemoveAllSensorsOnFoundation:"Est\xe1s seguro que quieres eliminar todos los sensores de esta base",Lights:"Lights",DoYouReallyWantToRemoveAllLightsOnFoundation:"Do you really want to remove all the lights on this foundation that are not locked",Walls:"Paredes",DoYouReallyWantToRemoveAllWallsOnFoundation:"Est\xe1s seguro que quieres eliminar todas las paredes de esta base that are not locked",Windows:"Windows",DoYouReallyWantToRemoveAllWindowsOnFoundation:"Do you really want to remove all the windows on this foundation that are not locked",Doors:"Doors",DoYouReallyWantToRemoveAllDoorsOnFoundation:"Do you really want to remove all the doors on this foundation that are not locked",Polygons:"Pol\xedgonos",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"Est\xe1s seguro que quieres eliminar todos los pol\xedgonos de esta base that are not locked",Humans:"Humans",DoYouReallyWantToRemoveAllHumansOnFoundation:"Do you really want to remove all the humans on this foundation who are not locked",Trees:"Trees",DoYouReallyWantToRemoveAllTreesOnFoundation:"Do you really want to remove all the trees on this foundation that are not locked",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnFoundation:"Do you really want to remove all the flowers on this foundation that are not locked",OnlyThisFoundation:"Solamente esta base",AllConnectedFoundations:"Todas las bases conectadas",AllSelectedFoundations:"All Selected Foundations",AllFoundations:"Todas las bases",AddPolygon:"A\xf1adir pol\xedgono",SolarStructure:"Solar Structure",GroupMaster:"Group Master",LockAllElementsOnThisFoundation:"Lock All Elements on This Foundation",UnlockAllElementsOnThisFoundation:"Unlock All Elements on This Foundation",GroundFloorRValue:"Ground Floor R-Value",OnlyThisGroundFloor:"Only This Ground Floor",AllGroundFloors:"All Ground Floors"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"Receiver Tower for Heliostats",ReceiverTowerPhysicalProperties:"Physical Properties of Receiver Tower",ReceiverTowerHeight:"Height of Receiver Tower",ReceiverTowerRadius:"Radius of Receiver Tower",ReceiverAbsorptance:"Absorptance of Receiver",ReceiverOpticalEfficiency:"Optical Efficiency of Receiver",ReceiverThermalEfficiency:"Thermal Efficiency of Receiver"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"Absorber Pipe for Fresnel Reflectors",AbsorberPipePhysicalProperties:"Physical Properties of Absorber Pipe",AbsorberHeight:"Height of Absorber Pipe",AbsorberApertureWidth:"Aperture Width of Absorber Pipe",AbsorberPipePoleNumber:"Pole Number for Absorber Pipe",AbsorberAbsorptance:"Absorptance of Absorber",AbsorberOpticalEfficiency:"Optical Efficiency of Absorber",AbsorberThermalEfficiency:"Thermal Efficiency of Absorber"},solarUpdraftTowerMenu:{SolarUpdraftTower:"Solar Updraft Tower",SolarUpdraftTowerPhysicalProperties:"Physical Properties of Solar Updraft Tower",SolarUpdraftTowerChimneyHeight:"Solar Updraft Tower Chimney Height",SolarUpdraftTowerChimneyRadius:"Solar Updraft Tower Chimney Radius",SolarUpdraftTowerCollectorHeight:"Solar Updraft Tower Collector Height",SolarUpdraftTowerCollectorRadius:"Solar Updraft Tower Collector Radius",SolarUpdraftTowerCollectorTransmissivity:"Solar Updraft Tower Collector Transmissivity",SolarUpdraftTowerCollectorEmissivity:"Solar Updraft Tower Collector Emissivity",SolarUpdraftTowerDischargeCoefficient:"Solar Updraft Tower Discharge Coefficient",SolarUpdraftTowerTurbineEfficiency:"Solar Updraft Tower Turbine Efficiency"},cuboidMenu:{Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",RemoveAllUnlockedSolarPanels:"Eliminar todos los paneles solares",RemoveAllUnlockedSensors:"Eliminar todos los sensores",RemoveAllUnlockedPolygons:"Eliminar todos los pol\xedgonos",RemoveAllUnlockedHumans:"Remove All Humans",RemoveAllUnlockedTrees:"Remove All Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"Rejillas",SolarPanels:"Paneles solares",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"Est\xe1s seguro que quieres eliminar todos los paneles solares de este cuboide that are not locked",Sensors:"Sensores",DoYouReallyWantToRemoveAllSensorsOnCuboid:"Est\xe1s seguro que quieres eliminar todos los sensores de este cuboide that are not locked",Polygons:"Pol\xedgonos",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"Est\xe1s seguro que quieres eliminar todos los pol\xedgonos de este cuboide that are not locked",Humans:"Humans",DoYouReallyWantToRemoveAllHumansOnCuboid:"Do you really want to remove all the humans on this cuboid who are not locked",Trees:"Trees",DoYouReallyWantToRemoveAllTreesOnCuboid:"Do you really want to remove all the trees on this cuboid that are not locked",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnCuboid:"Do you really want to remove all the flowers on this cuboid that are not locked",OnlyThisCuboid:"Solamente este cuboide",AllCuboidsOnSameSurface:"All Cuboids on Same Surface",AllCuboidsAboveSameBase:"All Cuboids above Same Base",AllSelectedCuboids:"All Selected Cuboids",AllCuboids:"Todos los cuboides",OnlyThisSide:"Solamente este lado",AllSidesOfThisCuboid:"Todos los lados en este cuboide",AllSidesOfSelectedCuboids:"All Sides of Selected Cuboids",AllSidesOfAllCuboids:"Todos los lados en todos los cuboides",AddPolygon:"A\xf1adir pol\xedgono",Stackable:"Stackable",GroupMaster:"Group Master"},polygonMenu:{Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",TextBox:"Text Box",FontOutlineColor:"Font Outline Color",FontOutlineWidth:"Font Outline Width",FontStrokeColor:"Font Stroke Color",FontStrokeWidth:"Font Stroke Width",NoOutline:"No Outline",Shiny:"Shiny",Filled:"Rellenar",FillTexture:"Rellenar textura",FillColor:"Rellenar color",Opacity:"Opacity",LineColor:"Color de la l\xednea",LineWidth:"Line Width",LineStyle:"Line Style",SolidLine:"Solid Line",DashedLine:"Dashed Line",DottedLine:"Dotted Line",InsertVertexBeforeIndex:"A\xf1adir v\xe9rtice antes del \xedndice",InsertVertexAfterIndex:"A\xf1adir v\xe9rtice despu\xe9s del \xedndice",DeleteVertex:"Eliminar v\xe9rtice",OnlyThisPolygon:"Solamente este pol\xedgono",AllPolygonsOnSurface:"All Polygons on the Same Surface",AllPolygonsAboveFoundation:"Todos los pol\xedgonos sobre la base",AllSelectedPolygons:"All Selected Polygons",AllPolygons:"Todos los pol\xedgonos",Layout:"Layout",SolarPanelArrayLayout:"Solar Panel Array Layout",SolarPanelArrayLayoutParametricDesign:"Solar Panel Array Layout: Parametric Design",SolarPanelArrayLayoutGenerativeDesign:"Solar Panel Array Layout: Generative Design",SolarPanelArrayModel:"Solar Panel Model",SolarPanelArrayOrientation:"Orientation",SolarPanelArrayTiltAngle:"Tilt Angle",SolarPanelArrayRowWidth:"Row Width",SolarPanelArrayInterRowSpacing:"Inter-Row Spacing",SolarPanelArrayRowSpacing:"Row Spacing",SolarPanelArrayRowAxis:"Row Axis",SolarPanelArrayLeftRightRowAxis:"Left-Right (Relative)",SolarPanelArrayUpDownRowAxis:"Up-Down (Relative)",SolarPanelArrayEastWestRowAxis:"East-West (Absolute)",SolarPanelArrayNorthSouthRowAxis:"North-South (Absolute)",SolarPanelArrayMargin:"Margin",SolarPanelArrayPoleHeight:"Pole Height",SolarPanelArrayPoleSpacing:"Pole Spacing",SolarPanelArrayTotalYearlyCost:"Total Cost",SolarPanelArrayTotalYearlyRevenue:"Total Revenue",SolarPanelArrayTotalYearlyYield:"Total Yield",SolarPanelArrayMeanYearlyYield:"Mean Yield",SolarPanelArrayYearlyProfit:"Profit",LayoutNotAcceptedCheckYourParameters:"This layout is not accepted. Please check your parameters."},optimizationMenu:{Optimization:"Optimization",Parameters:"Parameters",Variables:"Variables",Constants:"Constants",GeneticAlgorithm:"Genetic Algorithm",GeneticAlgorithmSettings:"Genetic Algorithm Settings",ParticleSwarmOptimization:"Particle Swarm Optimization",ParticleSwarmOptimizationSettings:"Particle Swarm Optimization Settings",SolarPanelTiltAngleOptimization:"Solar Panel Tilt Angle Optimization",SolarPanelArrayLayout:"Solar Panel Array Layout",Generation:"Generation",Gene:"Gene",NormalizedVariables:"Normalized Variables",Objective:"Objective",ObjectiveFunctionDailyTotalYield:"Daily Total Yield",ObjectiveFunctionYearlyTotalYield:"Yearly Total Yield",ObjectiveFunctionDailyMeanYield:"Daily Mean Yield",ObjectiveFunctionYearlyMeanYield:"Yearly Mean Yield",ObjectiveFunctionDailyProfit:"Daily Profit",ObjectiveFunctionYearlyProfit:"Yearly Profit",GeneticAlgorithmSelectionMethod:"Genetic Algorithm Selection Method",RouletteWheel:"Roulette Wheel",Tournament:"Tournament",SearchMethod:"Search Method",GlobalSearchUniformSelection:"Global Search Uniform Selection",LocalSearchRandomOptimization:"Local Search Random Optimization",PopulationSize:"Population Size",MaximumGenerations:"Maximum Generations",SelectionRate:"Selection Rate",CrossoverRate:"Crossover Rate",MutationRate:"Mutation Rate",Step:"Step",SwarmSize:"Swarm Size",MaximumSteps:"Maximum Steps",MaximumVelocity:"Maximum Velocity",InertiaWeight:"Inertia Weight",CognitiveCoefficient:"Cognitive Coefficient",SocialCoefficient:"Social Coefficient",ConvergenceThreshold:"Convergence Threshold for Termination",LocalSearchRadius:"Local Search Radius",RowsPerRackRange:"Range for Rows per Rack",TiltAngleRange:"Range for Tilt Angle",InterRowSpacingRange:"Range for Inter-Row Spacing",ClickTargetPolygonToActivate:"Click Target Polygon to Activate",ClickTargetFoundationToActivate:"Click Target Foundation to Activate"},treeMenu:{ShowModel:"Mostrar modelo",Flip:"Flip",Type:"Tipo",Spread:"Extender"},flowerMenu:{Flip:"Flip",Type:"Type",Spread:"Spread"},peopleMenu:{ChangePerson:"Cambiar persona",Flip:"Flip",Observer:"Observer",ViewFromThisPerson:"View from This Person"},lightMenu:{Color:"Color",Intensity:"Intensity",Decay:"Decay",MaximumDistance:"Distance",Inside:"Inside"},solarCollectorMenu:{RelativeAzimuth:"Azimut relativa",Pole:"Pole",PoleHeight:"Altura del poste",PoleRadius:"Pole Radius",ExtraPoleHeight:"Extra Pole Height",ExtraPoleHeightInAdditionToHalfWidth:"Extra Pole Height in Addition to Half Width",DrawSunBeam:"Dibujar rayo del sol"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"Reflector Reflectance",ReceiverAbsorptance:"Receiver Absorptance",ReflectorOpticalEfficiency:"Reflector Optical Efficiency",ReceiverThermalEfficiency:"Receiver Thermal Efficiency"},solarPanelMenu:{InverterEfficiency:"Inverter Efficiency",InverterEfficiencyExplained:"The efficiency for converting direct current (DC) to alternating current (AC).",DcToAcSizeRatio:"DC-to-AC Size Ratio",DcToAcSizeRatioExplained:"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.",ChangePvModel:"Cambiar modelo PV",Orientation:"Orientaci\xf3n",Portrait:"Vertical",Landscape:"Horizontal",FrameColor:"Frame Color",Panels:"paneles",PanelsWide:"ancho paneles",PanelsLong:"longitud paneles",TiltAngle:"Inclinar \xe1ngulo",SouthFacingIsPositive:"Orientado al sur es positivo",Tracker:"Seguidor",SolarTrackerFollowsSun:"Un seguidor sigue el sol para incrementar las salidas de los paneles solares",PoleSpacing:"Espaciado entre postes",NoTracker:"Sin seguimiento",HorizontalSingleAxisTracker:"Seguidor horizontal de eje \xfanico",VerticalSingleAxisTracker:"Seguidor vertical de eje \xfanico",AltazimuthDualAxisTracker:"Seguidor de doble eje altazimutal",OnlyThisSolarPanel:"Solamente este panel solar",AllSolarPanelsOnSurface:"Todos los paneles solares en la misma superficie",AllSolarPanelsAboveFoundation:"Todos los paneles solares sobre la misma base",AllSelectedSolarPanels:"All Selected Solar Panels",AllSolarPanels:"Todos los paneles solares"},pvModelPanel:{SolarPanelSpecs:"Especificaciones del panel solar",Model:"Modelo",PanelSize:"Tama\xf1o del panel",Cells:"Celdas",CellType:"Tipo de celda",Monocrystalline:"Monocristalino",Polycrystalline:"Policristalino",ThinFilm:"Pel\xedcula delgada",Bifacial:"Bifacial",BifacialityFactor:"Bifaciality Factor",Black:"Negro",Blue:"Azul",ShadeTolerance:"Tolerancia a la sombra",SolarCellEfficiency:"Eficiencia de la c\xe9lula solar",NominalOperatingCellTemperature:"Temperatura nominal de la celda de funcionamiento",TemperatureCoefficientOfPmax:"Coeficiente de temperatura de Pmax"},parabolicTroughMenu:{ModuleLength:"Module Length",Modules:"modules",ModulesLong:"modules long",LatusRectum:"Latus Rectum",OnlyThisParabolicTrough:"Only This Parabolic Trough",AllParabolicTroughsAboveFoundation:"All Parabolic Troughs Above the Same Foundation",AllSelectedParabolicTroughs:"All Selected Parabolic Troughs",AllParabolicTroughs:"All Parabolic Troughs"},fresnelReflectorMenu:{AbsorberPipe:"Absorber Pipe",SelectAbsorberToReflectSunlightTo:"Select Absorber to Reflect Sunlight to",ModuleLength:"Module Length",Modules:"modules",ModulesLong:"modules long",OnlyThisFresnelReflector:"Only This Fresnel Reflector",AllFresnelReflectorsAboveFoundation:"All Fresnel Reflectors Above the Same Foundation",AllSelectedFresnelReflectors:"All Selected Fresnel Reflectors",AllFresnelReflectors:"All Fresnel Reflectors"},heliostatMenu:{Tower:"Tower",SelectTowerToReflectSunlightTo:"Select Tower to Reflect Sunlight to",OnlyThisHeliostat:"Only This Heliostat",AllHeliostatsAboveFoundation:"All Heliostats Above the Same Foundation",AllSelectedHeliostats:"All Selected Heliostats",AllHeliostats:"All Heliostats"},parabolicDishMenu:{ReceiverStructure:"Receiver Structure",CentralPole:"Central Pole",CentralPoleWithTripod:"Central Pole with Tripod",Quadrupod:"Quadrupod",RimDiameter:"Rim Diameter",LatusRectum:"Latus Rectum",ExtraPoleHeightInAdditionToRadius:"Extra Pole Height in Addition to Radius",OnlyThisParabolicDish:"Only This Parabolic Dish",AllParabolicDishesAboveFoundation:"All Parabolic Dishes Above the Same Foundation",AllSelectedParabolicDishes:"All Selected Parabolic Dishes",AllParabolicDishes:"All Parabolic Dishes"},wallMenu:{TextureDefault:"Por defecto",Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",SizeOfWall:"Tama\xf1o de la pared",OnlyThisWall:"Solamente esta pared",AllConnectedWalls:"All Connected Walls",AllWallsAboveFoundation:"Todas las paredes sobre la misma base",AllSelectedWalls:"All Selected Walls",AllWalls:"Todo paredes",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisWall:"Do you really want to remove all the windows on this wall",Doors:"Doors",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",DoYouReallyWantToRemoveAllDoorsOnThisWall:"Do you really want to remove all the doors on this wall",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"Do you really want to remove all the solar panels on this wall",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisWall:"Do you really want to remove all the sensors on this wall",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisWall:"Do you really want to remove all the lights on this wall",LockAllPolygons:"Lock All Polygons",UnlockAllPolygons:"Unlock All Polygons",RemoveAllUnlockedPolygons:"Eliminar todos los pol\xedgonos",WallStructure:"Wall Structure",DefaultStructure:"Default",StudStructure:"Stud",PillarStructure:"Pillar",Opacity:"Opacity",StructureSpacing:"Structure Spacing",StructureWidth:"Structure Width",StructureThickness:"Structure Thickness",StructureColor:"Structure Color",Color:"Wall Color",Height:"Altura",Thickness:"Thickness",Texture:"Texture",AllLightsOnWallInside:"All Lights on Wall Inside",AllLightsOnWallOutside:"All Lights on Wall Outside",Fill:"Fill",Full:"Full",Partial:"Partial",Empty:"Empty",OpenToOutside:"Open to Outside",EavesLength:"Eaves Overhang Length",Parapet:"Parapet",ParapetColor:"Parapet Color",ParapetTexture:"Parapet Texture",ParapetHeight:"Parapet Height",CopingsHeight:"Copings Height",CopingsWidth:"Copings Width"},windowMenu:{OnlyThisWindow:"Only This Window",AllWindowsOnSurface:"All Windows on the Same Surface",AllWindowsAboveFoundation:"All Windows Above the Same Foundation",AllSelectedWindows:"All Selected Windows",AllWindows:"All Windows",Width:"Ancho",Height:"Altura",Setback:"Setback from Exterior Surface",RelativeToWallThickness:"Relative to wall thickness",Mullion:"Mullion",HorizontalMullion:"Horizontal Mullion",VerticalMullion:"Vertical Mullion",MullionWidth:"Mullion Width",HorizontalMullionSpacing:"Horizontal Mullion Spacing",VerticalMullionSpacing:"Vertical Mullion Spacing",MullionColor:"Mullion Color",Tint:"Tint",Opacity:"Opacity",SolarHeatGainCoefficient:"Solar heat gain coefficient (SHGC) = 1 - opacity",Shutter:"Shutter",LeftShutter:"Left Shutter",RightShutter:"Right Shutter",BothShutters:"Both Shutters",ShutterWidth:"Relative Width",ShutterColor:"Shutter Color",Frame:"Frame",FrameWidth:"Frame Width",SillWidth:"Sill Width",Color:"Frame Color",WindowType:"Window Type",Default:"Default",Arched:"Arched",Polygonal:"Polygonal",Interior:"Interior",Empty:"Empty"},roofMenu:{TextureDefault:"Por defecto",Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",OnlyThisRoof:"Only This Wall",AllRoofsAboveFoundation:"All Walls Above the Same Foundation",AllSelectedRoofs:"All Selected Roofs",AllRoofs:"All Roofs",OnlyThisCeiling:"Only This Ceiling",AllCeilingsAboveFoundation:"All Ceilings Above the Same Foundation",AllCeilings:"All Ceilings",EavesOverhangLength:"Eaves Overhang Length",RafterSpacing:"Rafter Spacing",RafterWidth:"Rafter Width",RafterThickness:"Rafter Thickness",RafterColor:"Rafter Color",RoofColor:"Roof Color",RoofSideColor:"Roof Side Color",GlassTint:"Glass Tint",Opacity:"Opacity",RoofStructure:"Roof Structure",DefaultStructure:"Default",RafterStructure:"Rafter",GlassStructure:"Glass",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"Do you really want to remove all the solar panels on this roof",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"Do you really want to remove all the windows on this roof",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"Do you really want to remove all the sensors on this roof",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisRoof:"Do you really want to remove all the lights on this roof",AllLightsOnRoofInside:"All Lights on Roof Inside",AllLightsOnRoofOutside:"All Lights on Roof Outside",Rise:"Rise",Ceiling:"Ceiling",RoofRValue:"Roof R-Value",CeilingRValue:"Ceiling R-Value"},doorMenu:{TextureDefault:"Por defecto",Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",Texture11:"Textura 11",Texture12:"Textura 12",Texture13:"Textura 13",Texture14:"Textura 14",Texture15:"Textura 15",Texture16:"Textura 16",Texture17:"Textura 17",OnlyThisDoor:"Only This Door",AllDoorsOnWall:"All Doors on the Same Wall",AllDoorsAboveFoundation:"All Doors Above the Same Foundation",AllSelectedDoors:"All Selected Doors",AllDoors:"All Doors",DoorType:"Door Type",Default:"Default",Arched:"Arched",Filled:"Filled",FrameColor:"Frame Color",Interior:"Interior"},siteInfoPanel:{High:"Alto",Low:"Bajo"},designInfoPanel:{NumberOfSelectedHeliostats:"Number of selected heliostats",NumberOfSelectedSolarPanels:"Number of selected solar panels",ElectricityGeneratedDailyBySolarPanels:"Electricity generated daily by these solar panels",SceneDiameter:"Scene diameter",BuildingArea:"Building area"},visualizationControlPanel:{ColorContrast:"Color Contrast",FluxScale:"Flux Scale",ClickUpOrDownArrowButtonsToChange:"Click up or down arrow buttons to change"},instructionPanel:{Rotate:"Rotar",DragMouse:"Arrastrar el rat\xf3n",Zoom:"Zoom",MouseWheelOrKeys:"Girar el mouse o presionar Ctrl+[ o Ctrl+]",MouseWheelOrKeysMac:"Girar el mouse o presionar \u2318+[ o \u2318+]",Pan:"Panor\xe1mica",HoldCtrlDragMouse:"Mantener Ctrl y mover el rat\xf3n",HoldMetaDragMouse:"Hold \u2318 and drag mouse",Enter2DMode:"Enter 2D mode",Exit2DMode:"Exit 2D mode",NavigationMode:"Navigation mode",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",MoveForwardBack:"Move forward/back",MoveForwardBackInstruction:"Press W/S",MoveLeftRight:"Move left/right",MoveLeftRightInstruction:"Press A/D",MoveUpDown:"Move up/down",MoveUpDownInstruction:"Press Z/X",Turn:"Turn",TurnInstruction:"Press arrow keys",ResetView:"Reset",AutoRotate:"Auto rotar",StartOrStop:"Presiona F4 para empezar o parar"},mapPanel:{ImageOnGround:"Imagen en el suelo",WeatherStations:"Weather Stations",WeatherStationsNote:"Turn this off to speed up",Coordinates:"Coordenadas",Zoom:"Zoom"},visibilityPanel:{SolarPanelVisibility:"Solar Panel Visibility",Observer:"Observer",VantagePoint:"Vantage Point",ItemizedVisibilityByFields:"Itemized by Fields",TotalVisibility:"Total"},sensorPanel:{LightSensor:"Sensor de luz",WeatherDataFrom:"Datos metereol\xf3gicos de"},buildingEnergyPanel:{DailyBuildingEnergy:"Daily Building Energy",YearlyBuildingEnergy:"Yearly Building Energy",Heater:"Heater",AC:"AC",SolarPanel:"Solar Panel",Net:"Net"},solarPanelYieldPanel:{SolarPanelDailyYield:"Rendimiento diario del panel solar",SolarPanelYearlyYield:"Rendimiento anual del panel solar",Yield:"Rendimiento",YieldPerHour:"Rendimiento por hora",DailyTotal:"Total diario",YearlyTotal:"Total anual",ShowOutputsOfIndividualSolarPanels:"Mostrar salidas de paneles solares individuales",Profit:"Profit",TotalCost:"Total Cost",TotalRevenue:"Total Revenue",TotalYield:"Total Yield",MeanYield:"Mean Yield",ModuleCount:"Module Count"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"Parabolic Trough Daily Yield",ParabolicTroughYearlyYield:"Parabolic Trough Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualParabolicTroughs:"Show outputs of individual parabolic troughs"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"Parabolic Dish Daily Yield",ParabolicDishYearlyYield:"Parabolic Dish Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualParabolicDishes:"Show outputs of individual parabolic dishes"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"Fresnel Reflector Daily Yield",FresnelReflectorYearlyYield:"Fresnel Reflector Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualFresnelReflectors:"Show outputs of individual Fresnel feflectors"},heliostatYieldPanel:{HeliostatDailyYield:"Heliostat Daily Yield",HeliostatYearlyYield:"Heliostat Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualHeliostats:"Show outputs of individual heliostats"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"Solar Updraft Tower Daily Yield",UpdraftTowerYearlyYield:"Solar Updraft Tower Yearly Yield",ChimneyAirTemperature:"Chimney Air Temperature",ChimneyWindSpeed:"Chimney Wind Speed",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualUpdraftTowers:"Show outputs of individual updraft towers"},heliodonPanel:{SunAndTimeSettings:"Sun & Time Settings",SunAngles:"\xc1ngulos",TwentyFourHours:"24 Hours"},cloudFilePanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyLikes:"My Likes",MyCloudFiles:"Mis archivos en la nube",GenerateLink:"Generar enlace",LinkGeneratedInClipBoard:"Se ha generado un enlace en el portapapeles",DoYouReallyWantToDelete:"Est\xe1s seguro que quieres eliminar",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"If this file has been shared or published, renaming it breaks existing links"},projectListPanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project was generated in the clip board",DoYouReallyWantToDeleteProject:"Do you really want to delete Project",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"If this project has been shared or published, renaming it breaks existing links"},projectPanel:{ProjectSettings:"Project Settings",ThumbnailImageSize:"Thumbnail Image Size",ProjectByOtherPeople:"Project by Other People",Project:"Project",ProjectType:"Type",ProjectDescription:"Description",MakeDescriptionEditable:"Make this description editable",MakeDescriptionNonEditable:"Make this description non-editable",DoubleClickToMakeDescriptionEditable:"Double-click to make this description editable",SolarPanelArray:"Solar Panel Array",CurateCurrentDesign:"Curate current design",UpdateSelectedDesign:"Update selected design",RemoveSelectedDesign:"Remove selected design",ClickToFlipSortingOrder:"Click to flip the sorting order",DesignNotShownInSolutionSpaceClickToShow:"This design is not shown in solution space; click to show",DesignShownInSolutionSpaceClickToHide:"This design is shown in solution space; click to hide",DistributionInSolutionSpace:"Distribution in the Solution Space",ChooseSolutionSpace:"Choose solution space",ChooseDataColoring:"Choose data coloring",SameColorForAllDesigns:"Same color for all designs",OneColorForEachDesign:"One color for each design",SolutionSpaceScreenshot:"Take a screenshot of the solution space",ScatteredPlotScreenshot:"Take a screenshot of the scattered plot",SingleClickToSelectDoubleClickToOpen:"Single-click to select, double-click to open.",SingleClickToDeselectDoubleClickToOpen:"Single-click to deselect, double-click to open.",GenerateScatteredPlot:"Generate Scattered Plot",SelectXAxis:"Select X Axis",SelectYAxis:"Select Y Axis"},accountSettingsPanel:{MyAccountSettings:"Configuraci\xf3n de mi cuenta",MyID:"My \ud83c\udd94",ClickToCopyMyID:"Click to copy my ID",IDInClipBoard:"Your ID was copied and is ready to paste.",StoreMyNameInMyFilesWhenSaving:"Store my name in my files when saving",DoYouReallyWantToShowYourNameInYourFiles:"Do you really want to show your display name in your files?",SignFileDisclaimer:"If yes, your display name may be seen by anyone who can access your files.",Likes:"Likes",AllPublished:"All Published",PublishedUnderAliases:"Aliases",UserCount:"User Count",SchoolID:"School ID",ClassID:"Class ID"},weatherPanel:{SunshineHours:"Luz solar"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"Select Air Temperature Model",Sinusoidal:"Sinusoidal"},economicsPanel:{EconomicsParameters:"Economics Parameters",ElectricitySellingPrice:"Electricity Selling Price",OperationalCostPerUnit:"Operational Cost per Unit",SellingPrice:"Selling Price",UnitCost:"Unit Cost"},navigationPanel:{NavigationParameters:"Navigation Parameters",MinimumMoveSpeed:"Minimum Move Speed",MinimumTurnSpeed:"Minimum Turn Speed"},yearlyLightSensorPanel:{SkyClearness:"Claridad",ShowDaylightResults:"Mostrar resultados de la luz solar",ShowSkyClearnessResults:"Mostrar resultados de claridad del cielo",ShowAverageDailySolarRadiation:"Mostrar la radiaci\xf3n solar diaria promedio"},analysisManager:{NoSensorForCollectingData:"Sin sensor para recopilar datos",NoSolarPanelForAnalysis:"Sin panel solar para el an\xe1lisis",NoObserverForVisibilityAnalysis:"There is no observer for visibility analysis.",NoWaterHeaterForAnalysis:"There is no water heater for analysis.",NoParabolicDishForAnalysis:"There is no parabolic dish for analysis.",NoParabolicTroughForAnalysis:"There is no parabolic trough for analysis.",NoFresnelReflectorForAnalysis:"There is no Fresnel reflector for analysis.",NoHeliostatForAnalysis:"There is no heliostat for analysis.",NoSolarUpdraftTowerForAnalysis:"There is no solar updraft tower for analysis.",NoBuildingForAnalysis:"There is no building for analysis."},toolbar:{CloudFile:"Archivo en la nube",Select:"Seleccionar",AddFoundation:"A\xf1adir base",AddWall:"A\xf1adir pared",AddWindow:"A\xf1adir ventana",AddDoor:"A\xf1adir door",AddPyramidRoof:"Add pyramid roof",AddGableRoof:"Add gable roof",AddHipRoof:"Add hip roof",AddGambrelRoof:"Add gambrel roof",AddMansardRoof:"Add mansard roof",AddCuboid:"A\xf1adir cuboid",AddSensor:"A\xf1adir sensor",AddSolarPanel:"A\xf1adir panel solar",AddWaterHeater:"Add water heater",AddParabolicDish:"Add parabolic dish",AddParabolicTrough:"Add parabolic trough",AddFresnelReflector:"Add Fresnel reflector",AddHeliostat:"Add heliostat",AddWindTurbine:"Add wind turbine",AddLight:"Add light",AddTree:"A\xf1adir \xe1rbol",AddFlower:"Add flower",AddPeople:"A\xf1adir gente",DoubleClickToLockThisModeForNextAction:"Double-click to lock this mode for next action",ClickToUnlockThisModeForNextAction:"Click to unlock this mode for next action",ManipulateGroup:"Manipulate a group",ClearScene:"Clear escena",ShowSunAndTimeSettings:"Show sun and time settings",SpatialAnalysisOfEnergy:"Spatial analysis of energy",DoYouReallyWantToClearContent:"Est\xe1s seguro que quieres borrar el contenido",ClickForMoreButtons:"Click for more buttons",SwitchToAddingFoundation:"Switch to Adding Foundation",SwitchToAddingCuboid:"Switch to Adding Cuboid",SwitchToAddingWall:"Switch to Adding Wall",SwitchToAddingWindow:"Switch to Adding Window",SwitchToAddingDoor:"Switch to Adding Door",SwitchToAddingPyramidRoof:"Switch to Adding Pyramid Roof",SwitchToAddingGableRoof:"Switch to Adding Gable Roof",SwitchToAddingHipRoof:"Switch to Adding Hip Roof",SwitchToAddingGambrelRoof:"Switch to Adding Gambrel Roof",SwitchToAddingMansardRoof:"Switch to Adding Mansard Roof",SwitchToAddingSolarPanel:"Switch to Adding Solar Panel",SwitchToAddingSensor:"Switch to Adding Sensor",SwitchToAddingWaterHeater:"Switch to Adding Water Heater",SwitchToAddingParabolicDish:"Switch to Adding Parabolic Dish",SwitchToAddingParabolicTrough:"Switch to Adding Parabolic Trough",SwitchToAddingFresnelReflector:"Switch to Adding Fresnel Reflector",SwitchToAddingHeliostat:"Switch to Adding Heliostat",SwitchToAddingWindTurbine:"Switch to Adding Wind Turbine",SwitchToAddingLight:"Switch to Adding Light",SwitchToAddingTree:"Switch to Adding Tree",SwitchToAddingFlower:"Switch to Adding Flower",SwitchToAddingPeople:"Switch to Adding People"},tooltip:{gotoIFI:"Ver Institute for Future Intelligence",visitAladdinHomePage:"Visita la p\xe1gina de Aladdin",clickToOpenMenu:"Haz clic para abrir el men\xfa principal",clickToAccessAccountSettings:"Click to access account settings"},tree:{Apple:"Apple",Birch:"Birch",Coconut:"Coconut",Dogwood:"Cerezo silvestre",Elm:"Olmo",FanPalm:"Fan Palm",Linden:"Tilo",Magnolia:"Magnolia",Maple:"Arce",Oak:"Roble",Pine:"Pino",Spruce:"Spruce"},flower:{Bellflower:"Bellflower",Boxwood:"Boxwood",CactusCombo1:"Cactus Combo 1",CactusCombo2:"Cactus Combo 2",CactusCombo3:"Cactus Combo 3",CactusCombo4:"Cactus Combo 4",Hibiscus:"Hibiscus",Hosta:"Hosta",Hydrangea:"Hydrangea",Peony:"Peony",RedRose:"Red Rose",Spirea:"Spirea",Sunflower:"Sunflower",TallBush:"Tall Bush",Tulip:"Tulip",WhiteFlower:"White Flower",YellowFlower:"Yellow Flower"},people:{Jaah:"Jaah",Jack:"Jack",Jacob:"Jacob",Jacqueline:"Jacqueline",Jade:"Jade",Jamelia:"Jamelia",James:"James",Jane:"Jane",Jaya:"Jaya",Jaye:"Jaye",Jeanette:"Jeanette",Jedi:"Jedi",Jeff:"Jeff",Jena:"Jena",Jennifer:"Jennifer",Jess:"Jess",Jett:"Jett",Jill:"Jill",Jiya:"Jiya",Joan:"Joan",Jocelyn:"Jocelyn",Joel:"Joel",Joey:"Joey",John:"John",Jonathon:"Jonathon",Jose:"Jose",Joseph:"Joseph",Joshua:"Joshua",Judd:"Judd",Judy:"Judy",Julia:"Julia",Julio:"Julio",Jumapili:"Jumapili",June:"June",Juro:"Juro",Justin:"Justin"},compass:{N:"N",S:"S",W:"W",E:"E"},month:{January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"},modelsMap:{SearchByPublisher:"Search by publisher",SearchByLabel:"Search by label",MyPublishedModels:"My Published Models",TotalNumberOfUserPublishedModels:"Total number of user-published models",SortFromOldestToNewest:"Sort from oldest to newest",SortFromNewestToOldest:"Sort from newest to oldest",ModelsFoundOnThisSite:"models found on this site",ShowModelsPublishedByThisAuthor:"Show the models published by this author"}}},tr:{translation:{name:{IFI:"Yar\u0131n\u0131n Zekas\u0131 Enstit\xfcs\xfc",Aladdin:"Aladdin",Tagline:"Aladdin: A\xe7\u0131klanabilir Yapay Zeka ile Tasar\u0131m\u0131 Yeniden Hayal Et \u2014 Yar\u0131n\u0131n Zekas\u0131 Enstit\xfcs\xfc"},cookie:{Statement:"Kabul Ete t\u0131klayarak, iyi bir Aladdin deneyimi i\xe7in \xe7erez kullan\u0131m\u0131n\u0131 kabul etmi\u015f olursunuz.",Accept:"Kabul Et"},aboutUs:{ProductBroughtToYouBy:"Geli\u015ftiriciler",TermsOfService:"Hizmet \u015eartlar\u0131",PrivacyPolicy:"Gizlilik Politikas\u0131",Software:"Yaz\u0131l\u0131m",Content:"\u0130\xe7erik",Research:"Ara\u015ft\u0131rma",Support:"Destek",Acknowledgment:"Onay",FundingInformation:"Ulusal Bilim Vakf\u0131 (NSF), #2105695, #2131097, ve #2301164 numaral\u0131 fon destekleriyle mevcut \xfcr\xfcn\xfcn ara\u015ft\u0131rma ve geli\u015ftirme \xe7al\u0131\u015fmalar\u0131na c\xf6mert bir mali kaynak sa\u011flam\u0131\u015ft\u0131r. Bununla birlikte \xfcr\xfcnde ifade edilen herhangi bir g\xf6r\xfc\u015f, bulgu ve sonu\xe7 veya \xf6neri yazarlar\u0131n kendi g\xf6r\xfc\u015fleridir. NSF'nin kurumsal g\xf6r\xfc\u015flerini yans\u0131tmayabilir.",Contact:"Daha fazla bilgi i\xe7in l\xfctfen Charles Xie (charles@intofuture.org) ile ileti\u015fime ge\xe7iniz.",Translators:"\xc7evirmenler"},word:{LastUpdate:"Last Update",Small:"Small",Medium:"Medium",Large:"Large",Design:"Design",Information:"Information",Type:"Type",Text:"Text",FontSize:"Font Size",FontColor:"Font Color",Model:"Model",Models:"Models",Upload:"Upload",ClickCount:"Click Count",Share:"Share",AlreadyLike:"Already like",Like:"Like",MustLogInToLike:"Must log in to like",AllRightsReserved:"T\xfcm Haklar\u0131 Sakl\u0131d\u0131r.",MeterAbbreviation:"m",Version:"S\xfcr\xfcm",VersionInitial:"S",Options:"Se\xe7enekler",Maximum:"Maximum",Minimum:"Minimum",MaximumNumber:"Maksimum Say\u0131",MinimumNumber:"Minimum Say\u0131",MaximumValue:"Maksimum De\u011fer",MinimumValue:"Minimum De\u011fer",Or:"Veya",None:"Hi\xe7biri",High:"Y\xfcksek",Partial:"K\u0131smi",Teacher:"\xd6\u011fretmen",Class:"S\u0131n\u0131f",Total:"Toplam",Leaderboard:"Leaderboard",Latest:"Latest",Range:"Aral\u0131k",SIUnit:"SI Unit",USUnit:"US Unit",ThermalTransmittance:"Thermal Transmittance",ThermalResistance:"Thermal Resistance",UValue:"U-Value",RValue:"R-Value",VolumetricHeatCapacity:"Volumetric Heat Capacity",BuildingHVACSystem:"Building HVAC System",ThermostatSetpoint:"Thermostat Setpoint",TemperatureToleranceThreshold:"Tolerance Threshold",TemperatureToleranceThresholdExplanation:"Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.",Press:"T\u0131kla",Open:"A\xe7",Save:"Kaydet",SaveAsImage:"Resim Olarak Kaydet",SaveAsCsv:"Save as CSV",Update:"G\xfcncelle",Paste:"Yap\u0131\u015ft\u0131r",Copy:"Kopyala",Cut:"Kes",Delete:"Sil",Lock:"Kilitle",Translucent:"Yar\u0131 Saydam",Color:"Renk",Texture:"Doku",Size:"Boyut",Thickness:"Kal\u0131nl\u0131k",Yes:"Evet",No:"Hay\u0131r",OK:"Tamam",Cancel:"\u0130ptal",Apply:"Uygula",Close:"Kapat",ApplyTo:"Uygula",Run:"\xc7al\u0131\u015ft\u0131r",Pause:"Duraklat",Resume:"S\xfcrd\xfcr",Clear:"Temizle",Warning:"Uyar\u0131",Caution:"Caution",Reminder:"Hat\u0131rlat\u0131c\u0131",Length:"Uzunluk",Width:"Geni\u015flik",Height:"Y\xfckseklik",Radius:"Yar\u0131\xe7ap",Angle:"A\xe7\u0131",Azimuth:"Azimut",Coordinates:"Koordinatlar",Weather:"Hava Durumu",Show:"G\xf6ster",Animate:"Oynat",Date:"Tarih",Time:"Saat",Title:"Ba\u015fl\u0131k",Owner:"Sahibi",Action:"Eylem",Rename:"Yeniden Adland\u0131r",Location:"Konum",Latitude:"Enlem",Month:"Ay",Day:"G\xfcn",Hour:"Saat",Daylight:"G\xfcn I\u015f\u0131\u011f\u0131",Radiation:"I\u015f\u0131n\u0131m",Temperature:"S\u0131cakl\u0131k",kWh:"kWh",dollar:"dollar",MeterPerSecond:"m/s",NorthInitial:"N",SouthInitial:"S",EastInitial:"E",WestInitial:"W",Fixed:"Sabit",Elements:"\xd6\u011feler",Energy:"Energy",Unknown:"Unknown",Label:"Label",Description:"Description",NoDescription:"No description",MaximumCharacters:"Maximum characters",Author:"Author",Publisher:"Publisher",Building:"Building",ResidentialBuilding:"Residential Building",CommercialBuilding:"Commercial Building",SchoolBuilding:"School Building",TouristAttraction:"Tourist Attraction",UnderConstruction:"Under Construction",Photovoltaic:"Photovoltaic",Anonymous:"Anonymous",Nickname:"Nickname",Pin:"Pin",Unpin:"Unpin"},shared:{NoTexture:"Doku Yok",FoundationElement:"Temel",CuboidElement:"K\xfcbik",PolygonElement:"Poligon",SensorElement:"Sens\xf6r",SolarPanelElement:"G\xfcne\u015f Paneli",WaterHeaterElement:"Su Is\u0131t\u0131c\u0131",ParabolicDishElement:"Parabolik \xc7anak",ParabolicTroughElement:"Parabolik Oluk",FresnelReflectorElement:"Fresnel Reflekt\xf6r",HeliostatElement:"Heliostat",WindTurbineElement:"Wind Turbine",LightElement:"Light",ElementLocked:"Kilitli",ModelType:"Model Type",OutputBreakdown:"Breakdown",MoreResults:"More Results"},message:{ModelNotFound:"Model not found",CannotSignIn:"Oturum a\xe7\u0131lam\u0131yor",CannotSignOut:"\xc7\u0131k\u0131\u015f yap\u0131lam\u0131yor",YourAccountWasCreated:"Hesab\u0131n\u0131z olu\u015fturuldu",CannotCreateAccount:"Hesap olu\u015fturulam\u0131yor",YourAccountSettingsWereSaved:"Hesap ayarlar\u0131n\u0131z kaydedildi.",CannotSaveYourAccountSettings:"Hesap ayarlar\u0131n\u0131z kaydedilemiyor",CannotSaveYourFileToCloud:"Dosyan\u0131z buluta kaydedilemiyor",CannotCreateNewProject:"Cannot create a new project",CannotCreateNewProjectWithoutTitle:"Cannot create a new project without a title",CannotOpenYourProjects:"Cannot open your projects",CannotOpenProject:"Cannot open the project",CannotDeleteProject:"Cannot delete the project",CannotRenameProject:"Cannot rename the project",CannotAddDesignToProject:"Cannot add this design to the project",CannotAddDesignToProjectOwnedByOthers:"Cannot add this design to a project owned by others",DesignRemovedFromProject:"The design was successfully removed from the project",CannotRemoveDesignFromProject:"Cannot remove this design from the project",CannotUpdateProject:"Cannot update the project",CannotFetchProjectData:"Cannot fetch project data",TitleUsedChooseDifferentOne:"This title has been used. Choose a different one",CloudFileWithTitleExistsDoYouWantToOverwrite:"A cloud file with the title exists. Do you want to overwrite it?",CloudFileNotFound:"Bulut dosyas\u0131 bulunamad\u0131",CannotLoadModelsOnMap:"Cannot load models on map",CannotLoadLeaderboard:"Cannot load leaderboard",CannotPublishModelOnMap:"Cannot publish model on map",CannotLikeModelFromMap:"Cannot like model from map",CannotDeleteModelFromMap:"Cannot delete model from map",ModelDeletedFromMap:"Model is deleted from map",DoYouWantToDeleteModelFromMap:"Do you want to delete the model from map?",CannotOpenCloudFile:"Bulut dosyas\u0131 a\xe7\u0131lam\u0131yor",CannotReadCloudFile:"Cannot read the cloud file",CannotWriteCloudFile:"Cannot write the cloud file",CloudFileCopied:"Cloud file copied",CannotOpenCloudFolder:"Bulut klas\xf6r\xfcn\xfcz a\xe7\u0131lam\u0131yor",CannotDeleteCloudFile:"Bulut dosyas\u0131 silinemiyor",CannotRenameCloudFile:"Bulut dosyas\u0131 yeniden adland\u0131r\u0131lam\u0131yor",DoYouWantToSaveChanges:"De\u011fi\u015fiklikleri kaydetmek istiyor musunuz?",NotApplicableToSelectedAction:"Se\xe7ili eyleme uygulanamaz",ThisElementIsLocked:"Bu \xf6\u011fe kilitli.",ThisCannotBeUndone:"Geri al\u0131namaz.",AzimuthOfNorthIsZero:"Kuzey y\xf6n\xfcn\xfcn azimut a\xe7\u0131s\u0131 0 \xc2\xb0 derecedir.",CounterclockwiseAzimuthIsPositive:"Saat y\xf6n\xfcn\xfcn tersi y\xf6nde azimut a\xe7\u0131s\u0131 pozitiftir.",MoveCancelledBecauseOfOverlap:"\xc7ak\u0131\u015fma nedeniyle ta\u015f\u0131ma iptal edildi.",MoveOutsideBoundaryCancelled:"Alan d\u0131\u015f\u0131na \xe7\u0131kan ta\u015f\u0131ma iptal edildi.",RotationCancelledBecauseOfOverlap:"\xc7ak\u0131\u015fma nedeniyle d\xf6nd\xfcrme iptal edildi.",RotationOutsideBoundaryCancelled:"Alan d\u0131\u015f\u0131 d\xf6nd\xfcrme iptal edildi.",ResizingCancelledBecauseOfOverlap:"\xc7ak\u0131\u015fma nedeniyle yeniden boyutland\u0131rma iptal edildi.",ResizingOutsideBoundaryCancelled:"Alan d\u0131\u015f\u0131nda yeniden boyutland\u0131rma iptal edildi.",CannotPasteOutsideBoundary:"Alan\u0131n d\u0131\u015f\u0131na yap\u0131\u015ft\u0131r\u0131lamaz.",CannotPasteBecauseOfOverlap:"\xc7ak\u0131\u015fma nedeniyle yap\u0131\u015ft\u0131r\u0131lam\u0131yor.",CannotMoveObjectTooFar:"Nesne buraya ta\u015f\u0131namaz.",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"Yeni yerle\u015fim d\xfczeni uygulanmadan \xf6nce mevcut g\xfcne\u015f panelleri kald\u0131r\u0131lacakt\u0131r.",DoYouWantToContinue:"Devam etmek istiyor musunuz?",SolarPanelsCannotIntersectWithGround:"G\xfcne\u015f panelleri zeminle kesi\u015femez.",SolarPanelsCannotOverlapWithOneAnother:"G\xfcne\u015f panelleri birbiriyle \xf6rt\xfc\u015femez.",ScreenshotSaved:"Ekran g\xf6r\xfcnt\xfcs\xfc kaydedildi.",CsvFileSaved:"A CSV file was saved.",SimulationStarted:"Sim\xfclasyon ba\u015flad\u0131.",SimulationCompleted:"Sim\xfclasyon tamamland\u0131.",SimulationAborted:"Sim\xfclasyon iptal edildi.",SimulationPaused:"Sim\xfclasyon duraklat\u0131ld\u0131.",CancelSimulation:"Sim\xfclasyonu iptal et",PauseSimulation:"Sim\xfclasyonu duraklat",ResumeSimulation:"Sim\xfclasyonu devam ettir",SimulationWillNotStartDueToErrors:"Simulation will not start due to errors",SimulationWillStartDespiteWarnings:"Simulation will start despite warnings.",EvolutionStarted:"Evrim ba\u015flad\u0131.",EvolutionCompleted:"Evrim tamamland\u0131.",EvolutionAborted:"Evrim iptal edildi.",EvolutionPaused:"Evrim duraklat\u0131ld\u0131.",EncounterEvolutionError:"Evrim hatas\u0131yla kar\u015f\u0131la\u015f\u0131ld\u0131.",CancelEvolution:"Evrimi iptal et",PauseEvolution:"Evrimi duraklat",ResumeEvolution:"Evrime devam et",ConvergenceThresholdHasBeenReached:"Yak\u0131nsama e\u015fi\u011fine ula\u015f\u0131ld\u0131.",MaximumNumberOfGenerationsHasBeenReached:"Maksimum nesil say\u0131s\u0131na ula\u015f\u0131ld\u0131.",MaximumNumberOfStepsHasBeenReached:"Maksimum ad\u0131m say\u0131s\u0131na ula\u015f\u0131ld\u0131.",ObjectiveFunctionTypeError:"Ge\xe7erli i\u015flev desteklenmiyor. L\xfctfen men\xfcden ba\u015flat\u0131n\u0131z.",WallsAreNotAtSameHeight:"Walls are not at same height.",WallsAreNotPerpendicular:"Walls are not perpendicular.",WallsAreNotConnected:"Walls are not connected.",WallsNumberNeedToBeFour:"The number of walls needs to be four.",BuildingContainsEmptyWall:"Building contains one or more empty wall.",BuildingRoofMissing:"Building has a missing roof.",UnknownErrors:"Unknown errors."},menu:{AnalysisOptions:"Analiz Se\xe7enekleri",option:{GridCellSize:"H\xfccre Boyutu",SamplingFrequency:"\xd6rneklem Frekans\u0131",TimesPerHour:"x 1/saat",DaysPerYear:"G\xfcn Say\u0131s\u0131 / Y\u0131l"},mainMenu:"Ana Men\xfc",cloudMenu:"Bulut Men\xfcs\xfc",projectSubMenu:"Project",project:{CreateNewProject:"Create New Project",OpenProject:"Open Project",SaveProjectAs:"Save Project As",YouMustLogInToCreateProject:"You must log in to create a new project",YouMustLogInToOpenProject:"You must log in to open a project"},fileSubMenu:"Dosya",file:{CreateNewFile:"Yeni Dosya Olu\u015ftur",OpenLocalFile:"Yerel Dosya A\xe7",SaveAsLocalFile:"Yerel Dosya Olarak Kaydet",SavingAbortedMustHaveValidFileName:"Kaydetme iptal edildi! Ge\xe7erli bir dosya ad\u0131 kullan\u0131n\u0131z.",OpenCloudFile:"Bulut Dosyas\u0131 A\xe7",SaveCloudFile:"Bulut Dosyas\u0131n\u0131 Kaydet",SaveAsCloudFile:"Bulut Dosyas\u0131 Olarak Kaydet",SavingAbortedMustHaveValidTitle:"Kaydetme iptal edildi! Dosya ad\u0131 ge\xe7ersiz!",ToSaveYourWorkPleaseSignIn:"\xc7al\u0131\u015fman\u0131z\u0131 kaydetmek i\xe7in l\xfctfen oturum a\xe7\u0131n\u0131z.",TakeScreenshot:"Ekran g\xf6r\xfcnt\xfcs\xfc al",UseCloudFileName:"Bulut Dosya Ad\u0131n\u0131 Kullan",PublishOnModelsMap:"Publish on Models Map",PublishedOnModelsMap:"Your model has been published on the Models Map",UpdatedOnModelsMap:"Your model has been updated on the Models Map",YouMustLogInToPublishYourModel:"You must log in to publish your model",YouCannotPublishAModelThatYouDoNotOwn:"You cannot publish a model that you do not own",YouMustSaveModelOnCloudBeforePublishingIt:"You must save the model on the cloud before publishing it"},editSubMenu:"D\xfczen",edit:{Undo:"Geri Al",Redo:"Yinele"},viewSubMenu:"G\xf6r\xfcn\xfcm",view:{NavigationView:"Navigation View",TwoDimensionalView:"2D",ResetView:"Yenile",ZoomIn:"Yakla\u015f",ZoomOut:"Uzakla\u015f",AutoRotate:"Otomatik D\xf6nd\xfcr",ShowShadow:"G\xf6lge",ShowSurfaceShininess:"Show Surface Shininess",TranslucentFloatingWindows:"Y\xfczer Pencere",accessoriesSubMenu:"Accessories",accessories:{SiteInformation:"Konum Bilgisi",DesignInformation:"Izgara H\xfccre Say\u0131s\u0131",Instruction:"Yard\u0131m",StickyNote:"Notlar",Note:"Notlar"}},settingsSubMenu:"Settings",settings:{WeatherData:"Hava Durumu",DiurnalTemperature:"G\xfcnl\xfck S\u0131cakl\u0131k",Heliodon:"Heliodon",SunAndTime:"G\xfcne\u015f & Zaman"},benchmarksSubMenu:"Deneysel",benchmarks:{SolarRadiationPredictionVsMeasurement:"G\xfcne\u015f I\u015f\u0131n\u0131m Tahmini Vs. \xd6l\xe7\xfcm\xfc ",BESTESTCase600:"Building Energy Simulation Test: BESTEST Case 600",BESTESTCase610:"Building Energy Simulation Test: BESTEST Case 610",BESTESTCase620:"Building Energy Simulation Test: BESTEST Case 620",BESTESTCase630:"Building Energy Simulation Test: BESTEST Case 630"},graph:{LineWidth:"\xc7izgi Kal\u0131nl\u0131\u011f\u0131",SymbolSize:"Sembol Boyutu",BarCategoryGap:"Bar Category Gap",ShowHorizontalGridLines:"Yatay Izgara \xc7izgilerini G\xf6ster",ShowVerticalGridLines:"Dikey Izgara \xc7izgilerini G\xf6ster"},analysisSubMenu:"Analiz",physicsSubMenu:"Fizik",physics:{DailySolarRadiationHeatmap:"G\xfcnl\xfck Is\u0131 Haritas\u0131",SolarRadiationHeatmapOptions:"Is\u0131 Haritas\u0131 Se\xe7enekleri",SolarRadiationHeatmapGridCellSize:"H\xfccre Boyutu",SolarRadiationHeatmapMaxValue:"I\u015f\u0131n\u0131m Maksimum De\u011fer",SolarRadiationHeatmapNoAnimation:"Animasyon Yok",ReflectionHeatmap:"Yans\u0131ma Is\u0131 Haritas\u0131"},sensorSubMenu:"Sens\xf6rler",sensor:{CollectDailyData:"G\xfcnl\xfck Veri Topla",CollectYearlyData:"Y\u0131ll\u0131k Veri Topla",SensorSimulationNoAnimation:"Animasyon Yok"},buildingSubMenu:"Building",building:{AnalyzeDailyBuildingEnergy:"Analyze Daily Building Energy",AnalyzeYearlyBuildingEnergy:"Analyze Yearly Building Energy",EnergyAnalysisOptions:"Energy Analysis Options",EnergyGridCellSize:"Energy Grid Cell Size",BuildingEnergySimulationNoAnimation:"No Animation for Building Energy Simulation"},solarPanelSubMenu:"G\xfcne\u015f Panelleri",solarPanel:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi",AnalyzeVisibility:"G\xf6r\xfcn\xfcm Analizi",PanelDiscretization:"Panel Ayr\u0131kla\u015ft\u0131rma",Exact:"Kesin",Approximate:"\tYakla\u015f\u0131k",EnergyGridCellSize:"H\xfccre Boyutu",VisibilityGridCellSize:"H\xfccre Boyutu",EnergyAnalysisOptions:"Enerji Analiz Se\xe7enekleri",VisibilityAnalysisOptions:"G\xf6r\xfcn\xfcm Analiz Se\xe7enekleri",SolarPanelSimulationNoAnimation:"Animasyon Yok"},parabolicTroughSubMenu:"Parabolik Oluk",parabolicTrough:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi"},parabolicDishSubMenu:"Parabolik \xc7anak",parabolicDish:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi"},fresnelReflectorSubMenu:"Fresnel Yans\u0131t\u0131c\u0131",fresnelReflector:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi"},heliostatSubMenu:"Heliostat",heliostat:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi"},solarUpdraftTowerSubMenu:"Solar Updraft Kulesi",solarUpdraftTower:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi",SolarUpdraftTowerSimulationNoAnimation:"Animasyon Yok"},tutorialsSubMenu:"\xd6\u011frenme Merkezi",solarEnergyScienceSubMenu:"G\xfcne\u015f Bilimi",solarEnergyScienceTutorials:{SunAngles:"G\xf6zlemciye G\xf6re G\xfcne\u015f A\xe7\u0131lar\u0131",InsolationAndClimate:"G\xfcne\u015flenme ve \u0130klim",SolarRadiationToBox:"Kutu G\xfcne\u015f I\u015f\u0131n\u0131m\u0131"},buildingScienceSubMenu:"Building Science",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"Thermal Envelope vs. Building Envelope",EffectOfSizeOnBuildingEnergy:"Effect of Size on Building Energy",EffectOfOrientationOnBuildingEnergy:"Effect of Orientation on Building Energy",EffectOfInsulationOnBuildingEnergy:"Effect of Insulation on Building Energy",EffectOfRoofColorOnBuildingEnergy:"Effect of Roof Color on Building Energy",EffectOfEavesOverhangLengthOnBuildingEnergy:"Effect of Eaves Overhang Length on Building Energy",EffectOfWindowSHGCOnBuildingEnergy:"Effect of Window Solar Heat Gain on Building Energy",EffectOfThermostatSetpointOnBuildingEnergy:"Effect of Thermostat Setpoint on Building Energy",EffectOfSolarPanelsOnBuildingEnergy:"Effect of Solar Panels on Building Energy",EffectOfGroundTemperatureOnBuildingEnergy:"Effect of Ground Temperature on Building Energy",EffectOfTreesOnBuildingEnergy:"Effect of Trees on Building Energy"},buildingDesignSubMenu:"Bina Tasar\u0131m\u0131",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"\xc7at\u0131 Pencereli Cape Cod Evi",MansardRoofWithDormers:"Mansard Roof with Dormers",GableRoofVsHipRoof:"Be\u015fik \xc7at\u0131 vs. K\u0131rma \xc7at\u0131",ColonialVsSaltbox:"Koloni vs. Tuz Kutusu",GambrelRoofVsMansardRoof:"Flemenk \xc7at\u0131 vs. Mansart \xc7at\u0131",CombinationRoofVsBonnetRoof:"Combination Roof vs. Bonnet Roof",DutchGableRoof:"Dutch Gable Roof",GableAndValleyRoof:"Gable and Valley Roof",ClerestoryRoof:"Clerestory Roof",MonitorRoof:"Monitor Roof",AFrameHouse:"A-Frame House",HalfTimberedHouse:"Half-Timbered House",AllBasicRoofTypes:"T\xfcm \xc7at\u0131 Tipleri"},photovoltaicSolarPowerSubMenu:"Fotovoltaik G\xfcne\u015f Enerjisi",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"G\xfcne\u015f Paneli E\u011fim A\xe7\u0131s\u0131 Etkisi",EffectOfAzimuthOfSolarPanel:"G\xfcne\u015f Paneli Azimut A\xe7\u0131s\u0131 Etkisi",SolarPanelTypes:"Solar Panel Types",VerticalBifacialSolarPanels:"Vertical Bifacial Solar Panels",CompareMonofacialAndBifacialSolarPanels:"Monofacial vs. Bifacial Solar Panels",SolarTrackers:"G\xfcne\u015f \u0130zleyiciler",CoveringGroundWithSolarPanels:"Sadece g\xfcne\u015f panellerini kullanarak y\xfczeyi kaplamak neden iyi bir fikir de\u011fildir?",InterRowSpacingOfSolarPanelArray:"G\xfcne\u015f Paneli Dizi Aras\u0131 Bo\u015fluk Etkisi",EffectOfOrientationOfSolarPanels:"G\xfcne\u015f Panelleri Y\xf6n Etkisi",SolarPanelArrayAutomaticLayout:"Solar Panel Array Automatic Layout"},concentratedSolarPowerSubMenu:"Yo\u011funla\u015ft\u0131r\u0131lm\u0131\u015f G\xfcne\u015f Enerjisi",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"Parabolik Oluk Azimut A\xe7\u0131s\u0131 Etkisi",EffectOfLatusRectumOfParabolicTrough:"Parabolik Oluk \xd6zkiri\u015f Etkisi",FocusSunlightWithParabolicDish:"G\xfcne\u015f I\u015f\u0131\u011f\u0131n\u0131 Parabolik \xc7anakla Odaklama",LinearFresnelReflectors:"Do\u011frusal Fresnel Reflekt\xf6rler",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"Do\u011frusal Fresnel Reflekt\xf6rlerde So\u011furucu Boru Y\xfckseklik Etkisi",EffectOfAzimuthOfLinearFresnelReflectors:"Do\u011frusal Fresnel Reflekt\xf6rlerde Azimut A\xe7\u0131s\u0131 Etkisi",LinearFresnelReflectorsWithTwoAbsorbers:"\u0130ki So\u011furuculu Do\u011frusal Fresnel Reflekt\xf6rler",CosineEfficiencyOfHeliostats:"Heliostatlar\u0131n Kosin\xfcs Verimlili\u011fi",ShadowingAndBlockingOfHeliostats:"Heliostatlarda G\xf6lgeleme ve Engellenme",EffectSolarPowerTowerHeight:"G\xfcne\u015f G\xfc\xe7 Kulesi Y\xfckseklik Etkisi",SolarPowerTower:"G\xfcne\u015f G\xfc\xe7 Kulesi"},otherTypesOfSolarPowerSubMenu:"Di\u011fer G\xfcne\u015f G\xfcc\xfc T\xfcrleri",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"Solar Updraft Kulesi"},generativeDesignSubMenu:"Generative Design",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Monofacial Solar Panel Array",BifacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Bifacial Solar Panel Array",OutputOfSolarPanelArrayInDifferentPlaces:"The Output of a Solar Panel Array in Different Places",SimpleSolarFarmParetoFront:"The Pareto Front for Designing a Simple Solar Farm"},examplesSubMenu:"\xd6rnekler",solarEnergySubMenu:"G\xfcne\u015f Enerjisi",solarEnergyExamples:{SunBeamAndHeliodon:"G\xfcne\u015f I\u015f\u0131n\u0131 ve Heliodon",RooftopSolarPanels:"\xc7at\u0131 \xdcst\xfc G\xfcne\u015f Panelleri",NevadaSolarOneParabolicTroughArray:"Nevada Eyaletinde Parabolik Oluk Dizisi",TooeleParabolicDishArray:"Tooele \u015eehrinde Parabolik \xc7anak Dizisi",PS10SolarPowerTower:"PS10 G\xfcne\u015f G\xfc\xe7 Kulesi",TucsonLinearFresnelReflectors:"Tucson \u015eehrinde Do\u011frusal Fresnel Reflekt\xf6rleri",SolarCanopyFormFactors:"Solar G\xf6lgelik Bi\xe7im Etkileri",SolarCanopyOverBleachers:"Tir\xfcb\xfcn \xdczeri Solar G\xf6lgelik",SolarCanopyOverGarage:"Solar Canopy Over Garage",SolarBusStop:"Solar Otob\xfcs Dura\u011f\u0131",SolarFacadeTesla:"Tesla Solar Fa\xe7ade",BuildingIntegratedPhotovoltaics:"Building-Integrated Photovoltaics",Floatovoltaics:"Floatovoltaics",Agrivoltaics:"Agrivoltaics",VegetativeBuffer:"Bitkisel Tampon",RainbowSwashSolarFarmBostonMA:"Rainbow Swash Solar Farm in Boston, MA",MickeyMouseSolarFarmOrlandoFL:"Mickey Mouse Solar Farm in Orlando, FL",SolarPanelsOverCanalBakersfieldCA:"Bakersfield \u015eehrinde Kanal \xdczerindeki Varsay\u0131msal G\xfcne\u015f Panelleri",SolarNoiseBarrierLexingtonMA:"Lexington Kasabas\u0131nda Varsay\u0131msal G\xfcne\u015f G\xfcr\xfclt\xfc Bariyeri",HSATSolarTrackersRaleighNC:"Raleigh \u015eehrinde Yatay Tek Eksenli \u0130zleyiciler (HSAT)",AADATSolarTrackersLancasterCA:"Lancaster \u015eehrinde Azimut\u2013\u0130rtifa \xc7ift Eksenli \u0130zleyiciler (AADAT)",SolarUpdraftTowerInCity:"\u015eehir Solar Updraft Kulesi"},builtEnvironmentSubMenu:"Yap\u0131l\u0131 \xc7evre",residentialBuildingsSubMenu:"Konut in\u015faatlar\u0131",residentialBuildingExamples:{ColonialHouse:"Colonial House",DutchColonialHouse:"Flemenk Koloni Evi",TShapedHouse:"T-Shaped House",CapeCodHouseWithGarage:"Cape Cod House with Garage",Solarium:"Solaryum",Church1:"Kilise 1",Cathedral1:"Cathedral 1",Cathedral2:"Cathedral 2",Mosque1:"Mosque 1",AdobeTaosHouse:"Adobe Taos House",RanchHouse:"Ranch House",BonnetHouse:"Bonnet House",BarnStyleHouse:"\xc7iftlik Evi",ModernHouse:"Modern House",ButterflyRoofHouse:"Butterfly Roof House"},commercialBuildingsSubMenu:"Ticari Binalar",commercialBuildingExamples:{WhiteHouse:"White House",BilimMersinTurkiye:"Yeni\u015fehir Belediyesi Bilim ve Sanat Merkezi",SpanishStyleHotel:"Spanish Style Hotel",ApartmentBuilding:"Apartment Building",OfficeBuilding:"Ofis Binas\u0131",Hotel:"Hotel"},buildingComplexesSubMenu:"Building Complexes",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"G\xfcney Burlington Lisesi",MescaleroApacheSchoolNewMexico:"Mescalero Apache School, NM"},urbanPlanningSubMenu:"\u015eehir Planlamas\u0131",urbanPlanningExamples:{Heatmap1:"Is\u0131 Haritas\u0131"},otherBuildingsSubMenu:"Other Buildings",otherBuildingExamples:{Greenhouse:"Sera",Pavilion:"Park Kamelyas\u0131",OctagonalPagoda:"Octagonal Pagoda",OceanFront:"Ocean Front",EgyptianPyramids:"Egyptian Pyramids",MayanPyramid:"Mayan Pyramid",SiOSePol:"Si-o-se-pol",StackedCuboids:"Stacked Cuboids"},artificialIntelligenceSubMenu:"Yapay Zeka",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"G\xfcne\u015f Paneli S\u0131ra E\u011fim A\xe7\u0131s\u0131 Optimize Etme",OptimizingTiltAnglesOfMultipleSolarPanelRows:"\xc7oklu G\xfcne\u015f Paneli S\u0131ra E\u011fim A\xe7\u0131s\u0131 Optimize Etme",SolarFarmGenerativeDesign:"G\xfcne\u015f Tarlas\u0131 Tasar\u0131m\u0131",SolarFarmGenerativeDesignWithBlock:"Blok Varl\u0131\u011f\u0131nda G\xfcne\u015f Tarlas\u0131 Tasar\u0131m\u0131",FitchburgSolarFarmGenerativeDesign:"Fitchburg G\xfcne\u015f Tarlas\u0131 Tasar\u0131m\u0131"},languageSubMenu:"Dil",publicSubMenu:"Public",ModelsGallery:"Models Gallery",ModelsMap:"Models Map",AboutUs:"Hakk\u0131m\u0131zda"},avatarMenu:{AccountSettings:"Hesap Ayarlar\u0131",PrivacyStatementTitle:"User Privacy Protection Statement",PrivacyStatement:"Oturum a\xe7t\u0131\u011f\u0131n\u0131zda, Aladdin hesab\u0131n\u0131z\u0131 olu\u015fturmak ve hesab\u0131n\u0131za eri\u015fmek i\xe7in Google Kimli\u011finiz kullan\u0131l\u0131r. Veritaban\u0131m\u0131zda referans olarak yaln\u0131zca rastgele bir alfasay\u0131sal dize depolan\u0131r. Ad\u0131n\u0131z veya e-posta adresiniz gibi ki\u015fisel olarak tan\u0131mlanabilir hi\xe7bir veri toplanmaz. Daha fazla bilgi i\xe7in ",SignIn:"Kay\u0131t Ol",SignOut:"Oturum Kapat",IfYouAreAStudent:"E\u011fer \xd6\u011frenciyseniz"},skyMenu:{Axes:"Eksenler",Theme:"Tema",ThemeDefault:"Varsay\u0131lan",ThemeDesert:"\xc7\xf6l",ThemeDune:"Dune",ThemeForest:"Orman",ThemeGrassland:"\xc7ay\u0131r",ThemeHill:"Hill",ThemeLake:"Lake",ThemeMountain:"Mountain",ThemeRural:"Rural",SunlightAttenuationCoefficientInAir:"Havan G\xfcne\u015f I\u015f\u0131\u011f\u0131 Zay\u0131flatma Katsay\u0131s\u0131",ConvectiveCoefficientOfAir:"Havan Is\u0131 \u0130letkenlik Katsay\u0131s\u0131",HighestTemperatureTimeInMinutes:"En Y\xfcksek S\u0131cakl\u0131k S\xfcresi (Dakika)",SelectSunAnglesToShow:"G\xf6sterilecek G\xfcne\u015f A\xe7\u0131lar\u0131n\u0131 Se\xe7in",ShowAzimuthAngle:"Azimut A\xe7\u0131s\u0131n\u0131 G\xf6ster",ShowElevationAngle:"Y\xfckselme A\xe7\u0131s\u0131n\u0131 G\xf6ster",ShowZenithAngle:"Zenit A\xe7\u0131s\u0131n\u0131 G\xf6ster",DirectLightBrightnessAtNoon:"Direct Light Brightness at Noon",AmbientLightBrightnessAtNoon:"Ambient Light Brightness at Noon"},groundMenu:{MonthlyIrradianceLoss:"Monthly Irradiance Loss",Vegetation:"Vegetation",LeafOutDay:"Leaf-Out Day",LeafOffDay:"Leaf-Off Day",Albedo:"Albedo",ImageOnGround:"Yer G\xf6r\xfcnt\xfcs\xfc",WaterSurface:"Water Surface",RemoveAllUnlockedTrees:"T\xfcm A\u011fa\xe7lar\u0131 Kald\u0131r",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedPeople:"T\xfcm Ki\u015fileri Kald\u0131r",RemoveAllUnlockedFoundations:"T\xfcm Temelleri Kald\u0131r",RemoveAllUnlockedCuboids:"T\xfcm K\xfcbikleri Kald\u0131r",DoYouReallyWantToRemoveAllPeople:"T\xfcm Ki\u015fileri Kald\u0131rmak \u0130stiyor Musunuz?",DoYouReallyWantToRemoveAllTrees:"T\xfcm A\u011fa\xe7lar\u0131 Kald\u0131rmak \u0130stiyor Musunuz?",DoYouReallyWantToRemoveAllFlowers:"Do you really want to remove all the flowers that are not locked",DoYouReallyWantToRemoveAllSolarPanels:"Do you really want to remove all the solar panels that are not locked",DoYouReallyWantToRemoveAllFoundations:"T\xfcm Temelleri Kald\u0131rmak \u0130stiyor Musunuz?",DoYouReallyWantToRemoveAllCuboids:"T\xfcm K\xfcbikleri Kald\u0131rmak \u0130stiyor Musunuz?",LockAllElements:"T\xfcm \xd6\u011feleri Kilitle",UnlockAllElements:"T\xfcm \xd6\u011felerin Kilidini A\xe7"},labelSubMenu:{Label:"Etiket",LabelText:"Label Text",LabelHeight:"Label Height",LabelSize:"Label Size",LabelFontSize:"Font Size",LabelColor:"Label Color",KeepShowingLabel:"Etiketi G\xf6stermeye Devam Et"},foundationMenu:{RemoveAllUnlockedSolarPanels:"T\xfcm Kilitlenmemi\u015f G\xfcne\u015f Panellerini Kald\u0131r",RemoveAllUnlockedParabolicTroughs:"T\xfcm Kilitlenmemi\u015f Parabolik Oluklar\u0131 Kald\u0131r",RemoveAllUnlockedParabolicDishes:"T\xfcm Kilitlenmemi\u015f Parabolik \xc7anaklar\u0131 Kald\u0131r",RemoveAllUnlockedFresnelReflectors:"T\xfcm Kilitlenmemi\u015f Fresnel Reflekt\xf6rleri Kald\u0131r",RemoveAllUnlockedHeliostats:"T\xfcm Kilitlenmemi\u015f Heliostatlar\u0131 Kald\u0131r",RemoveAllUnlockedSensors:"T\xfcm Kilitlenmemi\u015f Sens\xf6rleri Kald\u0131r",RemoveAllUnlockedLights:"Remove All Unlocked Lights",RemoveAllUnlockedWalls:"T\xfcm Kilitlenmemi\u015f Duvarlar\u0131 Kald\u0131r",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",RemoveAllUnlockedPolygons:"T\xfcm Kilitlenmemi\u015f \xc7okgenleri Kald\u0131r",RemoveAllUnlockedHumans:"T\xfcm Kilitlenmemi\u015f \u0130nsanlar\u0131 Kald\u0131r",RemoveAllUnlockedTrees:"T\xfcm Kilitlenmemi\u015f A\u011fa\xe7lar\u0131 Kald\u0131r",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"\xc7er\xe7eveler",Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",SolarPanels:"G\xfcne\u015f Panelleri",SolarPanelArray:"Solar Panel Array",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:" Se\xe7ili temel \xfczerindeki t\xfcm g\xfcne\u015f panellerini kald\u0131rmak istiyor musunuz?",ParabolicTroughs:"Parabolik Oluklar",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm parabolik oluklar\u0131 kald\u0131rmak istiyor musunuz?",ParabolicDishes:"Parabolik \xc7anaklar",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm parabolik \xe7anaklar\u0131 kald\u0131rmak istiyor musunuz?",FresnelReflectors:"Fresnel Reflekt\xf6rler",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm Fresnel reflekt\xf6rlerini kald\u0131rmak istiyor musunuz?",Heliostats:"Heliostatlar",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm heliostatlar\u0131 kald\u0131rmak istiyor musunuz?",Sensors:"Sens\xf6rler",DoYouReallyWantToRemoveAllSensorsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm sens\xf6rleri kald\u0131rmak istiyor musunuz?",Lights:"Lights",DoYouReallyWantToRemoveAllLightsOnFoundation:"Do you really want to remove all the lights on this foundation that are not locked",Walls:"Duvarlar",DoYouReallyWantToRemoveAllWallsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm duvarlar\u0131 kald\u0131rmak istiyor musunuz? ",Windows:"Windows",DoYouReallyWantToRemoveAllWindowsOnFoundation:"Do you really want to remove all the windows on this foundation that are not locked",Doors:"Doors",DoYouReallyWantToRemoveAllDoorsOnFoundation:"Do you really want to remove all the doors on this foundation that are not locked",Polygons:"Poligonlar",DoYouReallyWantToRemoveAllPolygonsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm poligonlar\u0131 kald\u0131rmak istiyor musunuz?",Humans:"Ki\u015filer",DoYouReallyWantToRemoveAllHumansOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm insanlar\u0131 kald\u0131rmak istiyor musunuz?",Trees:"A\u011fa\xe7lar",DoYouReallyWantToRemoveAllTreesOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm a\u011fa\xe7lar\u0131 kald\u0131rmak istiyor musunuz?",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnFoundation:"Do you really want to remove all the flowers on this foundation that are not locked",OnlyThisFoundation:"Sadece Se\xe7ili Temel",AllConnectedFoundations:"T\xfcm Ba\u011flant\u0131l\u0131 Temeller",AllSelectedFoundations:"All Selected Foundations",AllFoundations:"T\xfcm Temeller",AddPolygon:"Poligon Ekle",SolarStructure:"Solar Yap\u0131 Se\xe7in",GroupMaster:"Grup Y\xf6neticisi",LockAllElementsOnThisFoundation:" Se\xe7ili temel \xfczerindeki t\xfcm \xf6\u011feleri kilitle",UnlockAllElementsOnThisFoundation:" Se\xe7ili temel \xfczerindeki t\xfcm \xf6\u011felerin kilidini a\xe7",GroundFloorRValue:"Ground Floor R-Value",OnlyThisGroundFloor:"Only This Ground Floor",AllGroundFloors:"All Ground Floors"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"Heliostat Al\u0131c\u0131 Kulesi",ReceiverTowerPhysicalProperties:"Al\u0131c\u0131 Kule Fiziksel \xd6zellikler",ReceiverTowerHeight:"Al\u0131c\u0131 Kule Y\xfckseklik",ReceiverTowerRadius:"Al\u0131c\u0131 Kule Yar\u0131\xe7ap",ReceiverAbsorptance:"Al\u0131c\u0131 Absorbsiyon",ReceiverOpticalEfficiency:"Al\u0131c\u0131 Optik Verim",ReceiverThermalEfficiency:"Al\u0131c\u0131 Termal Verim"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"Fresnel Reflekt\xf6r So\u011furucu Boru",AbsorberPipePhysicalProperties:"So\u011furucu Boru Fiziksel \xd6zellikler",AbsorberHeight:"So\u011furucu Boru Y\xfckseklik",AbsorberApertureWidth:"So\u011furucu boru diyafram geni\u015fli\u011fi",AbsorberPipePoleNumber:"So\u011furucu Boru Say\u0131s\u0131",AbsorberAbsorptance:"So\u011furucu Absorbsiyonu",AbsorberOpticalEfficiency:"So\u011furucu Optik Verimlilik",AbsorberThermalEfficiency:"So\u011furucu Is\u0131l Verimlilik"},solarUpdraftTowerMenu:{SolarUpdraftTower:"Solar Updraft Kulesi",SolarUpdraftTowerPhysicalProperties:"Solar Updraft Kulesi Fiziksel \xd6zellikler",SolarUpdraftTowerChimneyHeight:"Solar Updraft Kulesi Baca Y\xfcksekli\u011fi",SolarUpdraftTowerChimneyRadius:"Solar Updraft Kulesi Baca Yar\u0131\xe7ap\u0131",SolarUpdraftTowerCollectorHeight:"Solar Updraft Kulesi Collector Height",SolarUpdraftTowerCollectorRadius:"Solar Updraft Kulesi Kollekt\xf6r Yar\u0131\xe7ap\u0131",SolarUpdraftTowerCollectorTransmissivity:"Solar Updraft Kulesi Kollekt\xf6r Ge\xe7irgenli\u011fi",SolarUpdraftTowerCollectorEmissivity:"Solar Updraft Kulesi Kollekt\xf6r Emisivite",SolarUpdraftTowerDischargeCoefficient:"Solar Updraft Kulesi De\u015farj Katsay\u0131s\u0131",SolarUpdraftTowerTurbineEfficiency:"Solar Updraft Kulesi T\xfcrbin Verimlili\u011fi"},cuboidMenu:{Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",RemoveAllUnlockedSolarPanels:"T\xfcm Kilitlenmemi\u015f G\xfcne\u015f Panellerini Kald\u0131r",RemoveAllUnlockedSensors:"T\xfcm Kilitlenmemi\u015f Sens\xf6rleri Kald\u0131r",RemoveAllUnlockedPolygons:"T\xfcm Kilitlenmemi\u015f Poligonlar\u0131 Kald\u0131r",RemoveAllUnlockedHumans:"T\xfcm Kilitlenmemi\u015f Ki\u015fileri Kald\u0131r",RemoveAllUnlockedTrees:"T\xfcm Kilitlenmemi\u015f A\u011fa\xe7lar\u0131 Kald\u0131r",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"\xc7er\xe7eveler",SolarPanels:"G\xfcne\u015f Panelleri",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm g\xfcne\u015f panellerini kald\u0131rmak istiyor musunuz?",Sensors:"Sens\xf6rler",DoYouReallyWantToRemoveAllSensorsOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm sens\xf6rleri kald\u0131rmak istiyor musunuz?",Polygons:"Poligonlar",DoYouReallyWantToRemoveAllPolygonsOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm poligonlar\u0131 kald\u0131rmak istiyor musunuz?",Humans:"\u0130nsanlar",DoYouReallyWantToRemoveAllHumansOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm insanlar\u0131 kald\u0131rmak istiyor musunuz?",Trees:"A\u011fa\xe7lar",DoYouReallyWantToRemoveAllTreesOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm a\u011fa\xe7lar\u0131 kald\u0131rmak istiyor musunuz?",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnCuboid:"Do you really want to remove all the flowers on this cuboid that are not locked",OnlyThisCuboid:"Sadece Se\xe7ili K\xfcbik",AllCuboidsOnSameSurface:"All Cuboids on Same Surface",AllCuboidsAboveSameBase:"All Cuboids above Same Base",AllSelectedCuboids:"All Selected Cuboids",AllCuboids:"T\xfcm K\xfcbikler",OnlyThisSide:"Sadece Se\xe7ili Y\xfczey",AllSidesOfThisCuboid:"Se\xe7ili K\xfcbik T\xfcm Y\xfczeyler",AllSidesOfSelectedCuboids:"All Sides of Selected Cuboids",AllSidesOfAllCuboids:"B\xfct\xfcn K\xfcbik Y\xfczeyleri ",AddPolygon:"Poligon Ekle",Stackable:"Stackable",GroupMaster:"Group Master"},polygonMenu:{Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",TextBox:"Text Box",FontOutlineColor:"Font Outline Color",FontOutlineWidth:"Font Outline Width",FontStrokeColor:"Font Stroke Color",FontStrokeWidth:"Font Stroke Width",NoOutline:"No Outline",Shiny:"Shiny",Filled:"Dolgu",FillTexture:"Dolgu Dokusu",FillColor:"Dolgu Rengi",Opacity:"Opakl\u0131k",LineColor:"\xc7izgi Rengi",LineWidth:"\xc7izgi Kal\u0131nl\u0131\u011f\u0131",LineStyle:"\xc7izgi Stili",SolidLine:"D\xfcz \xe7izgi",DashedLine:"Kesik \xe7izgi",DottedLine:"Noktal\u0131 \xe7izgi",InsertVertexBeforeIndex:"\u0130ndeksten \xd6nce Tepe Noktas\u0131 Ekle",InsertVertexAfterIndex:"\u0130ndeksten Sonra Tepe Noktas\u0131 Ekle",DeleteVertex:"Tepe Noktas\u0131 Sil",OnlyThisPolygon:"Sadece Se\xe7ili Poligon",AllPolygonsOnSurface:"T\xfcm Poligonlar Ayn\u0131 Y\xfczeyde",AllPolygonsAboveFoundation:"Temel \xdczerindeki T\xfcm Poligonlar",AllSelectedPolygons:"All Selected Polygons",AllPolygons:"T\xfcm Poligonlar",Layout:"D\xfczen",SolarPanelArrayLayout:"G\xfcne\u015f Paneli Dizi D\xfczeni",SolarPanelArrayLayoutParametricDesign:"G\xfcne\u015f Paneli Dizi D\xfczeni: Parametrik Tasar\u0131m",SolarPanelArrayLayoutGenerativeDesign:"G\xfcne\u015f Paneli Dizi D\xfczeni: \xdcretici Tasar\u0131m",SolarPanelArrayModel:"G\xfcne\u015f Paneli Modeli",SolarPanelArrayOrientation:"Oryantasyon",SolarPanelArrayTiltAngle:"E\u011fim A\xe7\u0131s\u0131",SolarPanelArrayRowWidth:"Dizi S\u0131ra Geni\u015fli\u011fi",SolarPanelArrayInterRowSpacing:"Dizi S\u0131ra Aras\u0131 Bo\u015fluk",SolarPanelArrayRowSpacing:"Row Spacing",SolarPanelArrayRowAxis:"Dizi S\u0131ra Ekseni",SolarPanelArrayLeftRightRowAxis:"Left-Right (Relative)",SolarPanelArrayUpDownRowAxis:"Up-Down (Relative)",SolarPanelArrayEastWestRowAxis:"Do\u011fu-Bat\u0131 (Absolute)",SolarPanelArrayNorthSouthRowAxis:"Kuzey-G\xfcney (Absolute)",SolarPanelArrayMargin:"Margin",SolarPanelArrayPoleHeight:"Direk Y\xfckseklik",SolarPanelArrayPoleSpacing:"Direk Aral\u0131k",SolarPanelArrayTotalYearlyCost:"Total Cost",SolarPanelArrayTotalYearlyRevenue:"Total Revenue",SolarPanelArrayTotalYearlyYield:"Total Yield",SolarPanelArrayMeanYearlyYield:"Mean Yield",SolarPanelArrayYearlyProfit:"Profit",LayoutNotAcceptedCheckYourParameters:"Bu yerle\u015fim d\xfczeni uygulanamaz. L\xfctfen parametrelerinizi kontrol edin."},optimizationMenu:{Optimization:"Optimizasyon",Parameters:"Parametreler",Variables:"De\u011fi\u015fkenler",Constants:"Sabitler",GeneticAlgorithm:"Genetik Algoritma",GeneticAlgorithmSettings:"Genetik Algoritma Ayar\u0131",ParticleSwarmOptimization:"Par\xe7ac\u0131k S\xfcr\xfc Optimizasyon",ParticleSwarmOptimizationSettings:"Par\xe7ac\u0131k S\xfcr\xfc Optimizasyon Ayar\u0131",SolarPanelTiltAngleOptimization:"G\xfcne\u015f Paneli E\u011fim A\xe7\u0131s\u0131 Optimizasyonu",SolarPanelArrayLayout:"G\xfcne\u015f Paneli Dizi D\xfczeni",Generation:"Nesil",Gene:"Gen",NormalizedVariables:"Normalle\u015ftirilmi\u015f De\u011fi\u015fkenler",Objective:"Ama\xe7",ObjectiveFunctionDailyTotalYield:"G\xfcnl\xfck Toplam \xdcretim",ObjectiveFunctionYearlyTotalYield:"Y\u0131ll\u0131k Toplam \xdcretim",ObjectiveFunctionDailyMeanYield:"G\xfcnl\xfck Ortalama \xdcretim",ObjectiveFunctionYearlyMeanYield:"Y\u0131ll\u0131k Ortalama \xdcretim",ObjectiveFunctionDailyProfit:"G\xfcnl\xfck Kazan\xe7",ObjectiveFunctionYearlyProfit:"Y\u0131ll\u0131k Kazan\xe7",GeneticAlgorithmSelectionMethod:"Genetik Algoritma Se\xe7im Y\xf6ntemi",RouletteWheel:"Rulet \xc7ark\u0131",Tournament:"Turnuva",SearchMethod:"Arama Y\xf6ntemi",GlobalSearchUniformSelection:"K\xfcresel Arama Standart Se\xe7im",LocalSearchRandomOptimization:"Yerel Arama Rastgele Optimizasyon",PopulationSize:"Pop\xfclasyon Boyutu",MaximumGenerations:"Maksimum Nesil",SelectionRate:"Se\xe7im Oran\u0131",CrossoverRate:"Ge\xe7i\u015f Oran\u0131",MutationRate:"Mutasyon Oran\u0131",Step:"Ad\u0131m",SwarmSize:"S\xfcr\xfc Boyutu",MaximumSteps:"Maksimum Ad\u0131m",MaximumVelocity:"Maksimum H\u0131z",InertiaWeight:"Atalet A\u011f\u0131rl\u0131\u011f\u0131",CognitiveCoefficient:"Bili\u015fsel Katsay\u0131",SocialCoefficient:"Sosyal Katsay\u0131",ConvergenceThreshold:"Sonland\u0131rma i\xe7in Yak\u0131nsama E\u015fi\u011fi",LocalSearchRadius:"Yerel Arama Yar\u0131\xe7ap\u0131",RowsPerRackRange:"Raf Ba\u015f\u0131na S\u0131ra Aral\u0131\u011f\u0131",TiltAngleRange:"E\u011fim A\xe7\u0131s\u0131 Aral\u0131\u011f\u0131",InterRowSpacingRange:"S\u0131ra Aras\u0131 Aral\u0131k Ranj\u0131",ClickTargetPolygonToActivate:"Etkinle\u015ftirmek i\xe7in Hedef Poligona T\u0131klay\u0131n\u0131z",ClickTargetFoundationToActivate:"Etkinle\u015ftirmek i\xe7in Hedef Temele T\u0131klay\u0131n\u0131z"},treeMenu:{ShowModel:"Modeli G\xf6ster",Flip:"Flip",Type:"T\xfcr",Spread:"Yay\u0131l\u0131m"},flowerMenu:{Flip:"Flip",Type:"Type",Spread:"Spread"},peopleMenu:{ChangePerson:"Ki\u015fi De\u011fi\u015ftir",Flip:"Flip",Observer:"G\xf6zlemci",ViewFromThisPerson:" Se\xe7ili Ki\u015fiye G\xf6re Perspektif"},lightMenu:{Color:"Color",Intensity:"Intensity",Decay:"Decay",MaximumDistance:"Distance",Inside:"Inside"},solarCollectorMenu:{RelativeAzimuth:"G\xf6receli Azimut A\xe7\u0131s\u0131",Pole:"Pole",PoleHeight:"Direk Y\xfcksekli\u011fi",PoleRadius:"Pole Radius",ExtraPoleHeight:"Ekstra Direk Y\xfcksekli\u011fi",ExtraPoleHeightInAdditionToHalfWidth:"Yar\u0131m Geni\u015fli\u011fe Ek Ekstra Direk Y\xfcksekli\u011fi",DrawSunBeam:"G\xfcne\u015f I\u015f\u0131n\u0131 \xc7iz"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"Reflekt\xf6r Yans\u0131ma",ReceiverAbsorptance:"Al\u0131c\u0131 Absorbsiyonu",ReflectorOpticalEfficiency:"Reflekt\xf6r Optik Verimlili\u011fi",ReceiverThermalEfficiency:"Al\u0131c\u0131 Termal Verimlili\u011fi"},solarPanelMenu:{InverterEfficiency:"Inverter Efficiency",InverterEfficiencyExplained:"The efficiency for converting direct current (DC) to alternating current (AC).",DcToAcSizeRatio:"DC-to-AC Size Ratio",DcToAcSizeRatioExplained:"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.",ChangePvModel:"PV Modelini De\u011fi\u015ftir",Orientation:"Oryantasyon",Portrait:"Portre",Landscape:"Peyzaj",FrameColor:"Frame Color",Panels:"Paneller",PanelsWide:"Panel Geni\u015fli\u011fi",PanelsLong:"Panel Uzunlu\u011fu",TiltAngle:"E\u011fim A\xe7\u0131s\u0131",SouthFacingIsPositive:"G\xfcney y\xf6n\xfcnde a\xe7\u0131 pozitiftir.",Tracker:"\u0130zleyici",SolarTrackerFollowsSun:"G\xfcne\u015f paneli verimini art\u0131rmak i\xe7in bir g\xfcne\u015f izleme sistemi g\xfcne\u015fi s\xfcrekli takip eder.",PoleSpacing:"Direk Aral\u0131\u011f\u0131",NoTracker:"\u0130zleme Sistemi Yok",HorizontalSingleAxisTracker:"Yatay Tek Eksenli \u0130zleme Sistemi",VerticalSingleAxisTracker:"Dikey Tek Eksenli \u0130zleme Sistemi",AltazimuthDualAxisTracker:"Altazimut \xc7ift Eksenli \u0130zleme Sistemi",OnlyThisSolarPanel:"Sadece Se\xe7ili G\xfcne\u015f Paneli",AllSolarPanelsOnSurface:"T\xfcm G\xfcne\u015f Panelleri Ayn\u0131 Y\xfczeyde",AllSolarPanelsAboveFoundation:"T\xfcm G\xfcne\u015f Panelleri Ayn\u0131 Temel \xdczerinde",AllSelectedSolarPanels:"All Selected Solar Panels",AllSolarPanels:"T\xfcm G\xfcne\u015f Panelleri"},pvModelPanel:{SolarPanelSpecs:"G\xfcne\u015f Paneli \xd6zellikleri",Model:"Model",PanelSize:"Panel Boyutu",Cells:"H\xfccreler",CellType:"H\xfccre Tipi",Monocrystalline:"Monokristal",Polycrystalline:"Polikristal",ThinFilm:"\u0130nce Katman",Bifacial:"Bifacial",BifacialityFactor:"Bifaciality Factor",Black:"Siyah",Blue:"Mavi",ShadeTolerance:"G\xf6lge Tolerans\u0131",SolarCellEfficiency:"G\xfcne\u015f Pili Verimlili\u011fi",NominalOperatingCellTemperature:"Nominal \xc7al\u0131\u015fma H\xfccresi S\u0131cakl\u0131\u011f\u0131",TemperatureCoefficientOfPmax:"Pmax S\u0131cakl\u0131k Katsay\u0131s\u0131"},parabolicTroughMenu:{ModuleLength:"Mod\xfcl Uzunlu\u011fu",Modules:"Mod\xfcller",ModulesLong:"Mod\xfcllerin Uzunlu\u011fu",LatusRectum:"\xd6zkiri\u015f",OnlyThisParabolicTrough:"Sadece Se\xe7ili Parabolik Oluk",AllParabolicTroughsAboveFoundation:"Ayn\u0131 Temelin \xdczerindeki T\xfcm Parabolik Oluklar",AllSelectedParabolicTroughs:"All Selected Parabolic Troughs",AllParabolicTroughs:"T\xfcm Parabolik Oluklar"},fresnelReflectorMenu:{AbsorberPipe:"So\u011furucu Boru",SelectAbsorberToReflectSunlightTo:"G\xfcne\u015f I\u015f\u0131\u011f\u0131 Yans\u0131t\u0131lacak So\u011furucuyu Se\xe7in",ModuleLength:"Mod\xfcl Uzunlu\u011fu",Modules:"Mod\xfcller",ModulesLong:"Mod\xfcllerin Uzunlu\u011fu",OnlyThisFresnelReflector:"Sadece Se\xe7ili Fresnel Reflekt\xf6r",AllFresnelReflectorsAboveFoundation:"Ayn\u0131 Temel \xdczerindeki T\xfcm Fresnel Reflekt\xf6rler",AllSelectedFresnelReflectors:"All Selected Fresnel Reflectors",AllFresnelReflectors:"T\xfcm Fresnel Reflekt\xf6rler"},heliostatMenu:{Tower:"Kule",SelectTowerToReflectSunlightTo:"G\xfcne\u015f I\u015f\u0131\u011f\u0131 Yans\u0131t\u0131lacak Kuleyi Se\xe7in",OnlyThisHeliostat:"Sadece Se\xe7ili Heliostat",AllHeliostatsAboveFoundation:"Ayn\u0131 Temel \xdczerindeki T\xfcm Heliostatlar",AllSelectedHeliostats:"All Selected Heliostats",AllHeliostats:"T\xfcm Heliostatlar"},parabolicDishMenu:{ReceiverStructure:"Al\u0131c\u0131 Yap\u0131s\u0131",CentralPole:"Merkez Direk",CentralPoleWithTripod:"Tripodlu Merkez Direk",Quadrupod:"D\xf6rt Ayakl\u0131",RimDiameter:"Kasnak \xc7ap\u0131",LatusRectum:"\xd6zkiri\u015f",ExtraPoleHeightInAdditionToRadius:"Yar\u0131\xe7apa Ek Olarak Ekstra Direk Y\xfcksekli\u011fi",OnlyThisParabolicDish:"Sadece Se\xe7ili Parabolik \xc7anak",AllParabolicDishesAboveFoundation:"Ayn\u0131 Temel \xdczerindeki T\xfcm Parabolik \xc7anaklar",AllSelectedParabolicDishes:"All Selected Parabolic Dishes",AllParabolicDishes:"T\xfcm Parabolik \xc7anaklar"},wallMenu:{TextureDefault:"Varsay\u0131lan",Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",SizeOfWall:"Duvar Boyutu",OnlyThisWall:"Sadece Se\xe7ili Duvar",AllConnectedWalls:"All Connected Walls",AllWallsAboveFoundation:" Ayn\u0131 Temel \xdczerindeki T\xfcm Duvarlar",AllSelectedWalls:"All Selected Walls",AllWalls:"T\xfcm Duvarlar",Windows:"Pencereler",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Kilitlenmemi\u015f T\xfcm Pencereleri Kald\u0131r",DoYouReallyWantToRemoveAllWindowsOnThisWall:" Se\xe7ili duvardaki t\xfcm pencereleri kald\u0131rmak istiyor musunuz?",Doors:"Kap\u0131lar",RemoveAllUnlockedDoors:"T\xfcm Kilitlenmemi\u015f Kap\u0131lar\u0131 Kald\u0131r",DoYouReallyWantToRemoveAllDoorsOnThisWall:" Se\xe7ili duvardaki t\xfcm kap\u0131lar\u0131 kald\u0131rmak istiyor musun?",SolarPanels:"G\xfcne\u015f Panelleri",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Kilitlenmemi\u015f T\xfcm G\xfcne\u015f Panellerini Kald\u0131r",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:" Se\xe7ili duvardaki t\xfcm g\xfcne\u015f panellerini kald\u0131rmak istiyor musunuz?",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisWall:"Do you really want to remove all the sensors on this wall",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisWall:"Do you really want to remove all the lights on this wall",LockAllPolygons:"Lock All Polygons",UnlockAllPolygons:"Unlock All Polygons",RemoveAllUnlockedPolygons:"T\xfcm Kilitlenmemi\u015f Poligonlar\u0131 Kald\u0131r",WallStructure:"Duvar Yap\u0131s\u0131",DefaultStructure:"Varsay\u0131lan",StudStructure:"Ah\u015fap Dikme",PillarStructure:"Pillar",Opacity:"Opakl\u0131k",StructureSpacing:"Structure Spacing",StructureWidth:"Structure Width",StructureThickness:"Structure Thickness",StructureColor:"Structure Color",Color:"Wall Color",Height:"Height",Thickness:"Thickness",Texture:"Texture",AllLightsOnWallInside:"All Lights on Wall Inside",AllLightsOnWallOutside:"All Lights on Wall Outside",Fill:"Fill",Full:"Full",Partial:"Partial",Empty:"Empty",OpenToOutside:"Open to Outside",EavesLength:"Eaves Overhang Length",Parapet:"Parapet",ParapetColor:"Parapet Color",ParapetTexture:"Parapet Texture",ParapetHeight:"Parapet Height",CopingsHeight:"Copings Height",CopingsWidth:"Copings Width"},windowMenu:{OnlyThisWindow:"Sadece Bu Pencere",AllWindowsOnSurface:"All Windows on the Same Surface",AllWindowsAboveFoundation:"Ayn\u0131 Temelin \xdczerindeki T\xfcm Pencereler",AllSelectedWindows:"All Selected Windows",AllWindows:"T\xfcm Pencereler",Width:"Geni\u015flik",Height:"Y\xfckseklik",Setback:"Setback from Exterior Surface",RelativeToWallThickness:"Relative to wall thickness",Mullion:"Tiriz",HorizontalMullion:"Horizontal Mullion",VerticalMullion:"Vertical Mullion",MullionWidth:"Tiriz Geni\u015fli\u011fi",HorizontalMullionSpacing:"Horizontal Mullion Spacing",VerticalMullionSpacing:"Vertical Mullion Spacing",MullionColor:"Mullion Color",Tint:"Ton",Opacity:"Opakl\u0131k",SolarHeatGainCoefficient:"Solar heat gain coefficient (SHGC) = 1 - opacity",Shutter:"Kepenk",LeftShutter:"Sol Kepenk",RightShutter:"Sa\u011f Kepenk",BothShutters:"Kepenkler",ShutterWidth:"Geni\u015flik",ShutterColor:"Kepenk Rengi",Frame:"Frame",FrameWidth:"Frame Width",SillWidth:"Sill Width",Color:"Frame Color",WindowType:"Window Type",Default:"Default",Arched:"Arched",Polygonal:"Polygonal",Interior:"Interior",Empty:"Empty"},roofMenu:{TextureDefault:"Varsay\u0131lan",Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",OnlyThisRoof:"Sadece Se\xe7ili \xc7at\u0131",AllRoofsAboveFoundation:"Ayn\u0131 Temelin \xdczerinde T\xfcm \xc7at\u0131lar",AllSelectedRoofs:"All Selected Roofs",AllRoofs:"T\xfcm \xc7at\u0131lar",OnlyThisCeiling:"Only This Ceiling",AllCeilingsAboveFoundation:"All Ceilings Above the Same Foundation",AllCeilings:"All Ceilings",EavesOverhangLength:"Eaves Overhang Length",RafterSpacing:"Mertek Aral\u0131\u011f\u0131",RafterWidth:"Mertek Geni\u015fli\u011fi",RafterThickness:"Mertek Kal\u0131nl\u0131\u011f\u0131",RafterColor:"Mertek Rengi",RoofColor:"\xc7at\u0131 Rengi",RoofSideColor:"Roof Side Color",GlassTint:"Cam Tonu",Opacity:"Opakl\u0131k",RoofStructure:"\xc7at\u0131 Yap\u0131s\u0131",DefaultStructure:"Varsay\u0131lan",RafterStructure:"Mertek",GlassStructure:"Cam",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"Do you really want to remove all the solar panels on this roof",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"Do you really want to remove all the windows on this roof",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"Do you really want to remove all the sensors on this roof",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisRoof:"Do you really want to remove all the lights on this roof",AllLightsOnRoofInside:"All Lights on Roof Inside",AllLightsOnRoofOutside:"All Lights on Roof Outside",Rise:"Rise",Ceiling:"Ceiling",RoofRValue:"Roof R-Value",CeilingRValue:"Ceiling R-Value"},doorMenu:{TextureDefault:"Varsay\u0131lan",Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",Texture11:"Doku 11",Texture12:"Doku 12",Texture13:"Doku 13",Texture14:"Doku 14",Texture15:"Doku 15",Texture16:"Doku 16",Texture17:"Doku 17",OnlyThisDoor:"Sadece Se\xe7ili Kap\u0131",AllDoorsOnWall:"Ayn\u0131 Duvardaki T\xfcm Kap\u0131lar",AllDoorsAboveFoundation:"Ayn\u0131 Temelin \xdcst\xfcndeki T\xfcm Kap\u0131lar",AllSelectedDoors:"All Selected Doors",AllDoors:"T\xfcm Kap\u0131lar",DoorType:"Door Type",Default:"Default",Arched:"Arched",Filled:"Filled",FrameColor:"Frame Color",Interior:"Interior"},siteInfoPanel:{High:"Y\xfcksek",Low:"D\xfc\u015f\xfck"},designInfoPanel:{NumberOfSelectedHeliostats:"Se\xe7ilen heliostat say\u0131s\u0131",NumberOfSelectedSolarPanels:"Se\xe7ilen g\xfcne\u015f paneli say\u0131s\u0131",ElectricityGeneratedDailyBySolarPanels:"G\xfcne\u015f panellerinin g\xfcnl\xfck elektrik \xfcretimi",SceneDiameter:"Scene diameter",BuildingArea:"Building area"},visualizationControlPanel:{ColorContrast:"Renk Kontrast\u0131",FluxScale:"Flux Scale",ClickUpOrDownArrowButtonsToChange:"De\u011fi\u015ftirmek i\xe7in yukar\u0131 veya a\u015fa\u011f\u0131 ok butonlar\u0131na t\u0131klay\u0131n\u0131z"},instructionPanel:{Rotate:"D\xf6nd\xfcrme",DragMouse:"Sol T\u0131k + S\xfcr\xfckle",Zoom:"Yak\u0131nla\u015ft\u0131rma",MouseWheelOrKeys:"Tekerlek veya Ctrl+[ veya Ctrl+]",MouseWheelOrKeysMac:"Tekerlek veya \u2318+[ veya \u2318+]",Pan:"Ekran Kayd\u0131rma",HoldCtrlDragMouse:"Ctrl + S\xfcr\xfckle",HoldMetaDragMouse:"Hold \u2318 and drag mouse",Enter2DMode:"Enter 2D mode",Exit2DMode:"Exit 2D mode",NavigationMode:"Navigation mode",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",MoveForwardBack:"Move forward/back",MoveForwardBackInstruction:"Press W/S",MoveLeftRight:"Move left/right",MoveLeftRightInstruction:"Press A/D",MoveUpDown:"Move up/down",MoveUpDownInstruction:"Press Z/X",Turn:"Turn",TurnInstruction:"Press arrow keys",ResetView:"Yeniden Ba\u015flat",AutoRotate:"Otomatik D\xf6nd\xfcrme",StartOrStop:"Ba\u015flat veya Durdur (F4)"},mapPanel:{ImageOnGround:"Y\xfczey G\xf6r\xfcn\xfcm\xfc",WeatherStations:"Referans",WeatherStationsNote:"Turn this off to speed up",Coordinates:"Koordinatlar",Zoom:"B\xfcy\xfct"},visibilityPanel:{SolarPanelVisibility:"G\xfcne\u015f Paneli G\xf6r\xfcn\xfcm",Observer:"G\xf6zlemci",VantagePoint:"Referans Noktas\u0131",ItemizedVisibilityByFields:"Alana \xd6zel Perspektif",TotalVisibility:"Toplam"},sensorPanel:{LightSensor:"I\u015f\u0131k Sens\xf6r\xfc",WeatherDataFrom:"Hava Durumu"},buildingEnergyPanel:{DailyBuildingEnergy:"Daily Building Energy",YearlyBuildingEnergy:"Yearly Building Energy",Heater:"Heater",AC:"AC",SolarPanel:"Solar Panel",Net:"Net"},solarPanelYieldPanel:{SolarPanelDailyYield:"G\xfcne\u015f Paneli G\xfcnl\xfck \xdcretim",SolarPanelYearlyYield:"G\xfcne\u015f Paneli Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualSolarPanels:"Herbir g\xfcne\u015f panelinin \xfcretimini g\xf6ster",Profit:"Kazan\xe7",TotalCost:"Total Cost",TotalRevenue:"Total Revenue",TotalYield:"Total Yield",MeanYield:"Mean Yield",ModuleCount:"Module Count"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"Parabolik Oluk G\xfcnl\xfck \xdcretim",ParabolicTroughYearlyYield:"Parabolik Oluk Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualParabolicTroughs:"Herbir parabolik olu\u011fun \xfcretimini g\xf6ster"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"Parabolik \xc7anak G\xfcnl\xfck \xdcretim",ParabolicDishYearlyYield:"Parabolik \xc7anak Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualParabolicDishes:"Herbir parabolik \xe7ana\u011f\u0131n \xfcretimini g\xf6ster"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"Fresnel Reflekt\xf6r G\xfcnl\xfck \xdcretim",FresnelReflectorYearlyYield:"Fresnel Reflekt\xf6r Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualFresnelReflectors:"Herbir Fresnel yans\u0131t\u0131c\u0131s\u0131n\u0131n \xfcretimini g\xf6ster"},heliostatYieldPanel:{HeliostatDailyYield:"Heliostat G\xfcnl\xfck \xdcretim",HeliostatYearlyYield:"Heliostat Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualHeliostats:"Herbir heliostat\u0131n \xfcretimini g\xf6ster"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"Solar Updraft Kulesi G\xfcnl\xfck \xdcretimi",UpdraftTowerYearlyYield:"Solar Updraft Kulesi Y\u0131ll\u0131k \xdcretimi",ChimneyAirTemperature:"Baca Hava S\u0131cakl\u0131\u011f\u0131",ChimneyWindSpeed:"Baca R\xfczgar H\u0131z\u0131",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualUpdraftTowers:"Herbir updraft kulesinin \xfcretimini g\xf6ster"},heliodonPanel:{SunAndTimeSettings:"G\xfcne\u015f & Saat Ayarlar\u0131",SunAngles:"A\xe7\u0131lar",TwentyFourHours:"24 Hours"},cloudFilePanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyLikes:"My Likes",MyCloudFiles:"Bulut Dosyalar\u0131m",GenerateLink:"Link Olu\u015ftur",LinkGeneratedInClipBoard:"Klip Panosunda Olu\u015fturulan Link",DoYouReallyWantToDelete:"Ger\xe7ekten silmek istiyor musun?",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"If this file has been shared or published, renaming it breaks existing links"},projectListPanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project was generated in the clip board",DoYouReallyWantToDeleteProject:"Do you really want to delete Project",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"If this project has been shared or published, renaming it breaks existing links"},projectPanel:{ProjectSettings:"Project Settings",ThumbnailImageSize:"Thumbnail Image Size",ProjectByOtherPeople:"Project by Other People",Project:"Project",ProjectType:"Type",ProjectDescription:"Description",MakeDescriptionEditable:"Make this description editable",MakeDescriptionNonEditable:"Make this description non-editable",DoubleClickToMakeDescriptionEditable:"Double-click to make this description editable",SolarPanelArray:"Solar Panel Array",CurateCurrentDesign:"Curate current design",UpdateSelectedDesign:"Update selected design",RemoveSelectedDesign:"Remove selected design",ClickToFlipSortingOrder:"Click to flip the sorting order",DesignNotShownInSolutionSpaceClickToShow:"This design is not shown in solution space; click to show",DesignShownInSolutionSpaceClickToHide:"This design is shown in solution space; click to hide",DistributionInSolutionSpace:"Distribution in the Solution Space",ChooseSolutionSpace:"Choose solution space",ChooseDataColoring:"Choose data coloring",SameColorForAllDesigns:"Same color for all designs",OneColorForEachDesign:"One color for each design",SolutionSpaceScreenshot:"Take a screenshot of the solution space",ScatteredPlotScreenshot:"Take a screenshot of the scattered plot",SingleClickToSelectDoubleClickToOpen:"Single-click to select, double-click to open.",SingleClickToDeselectDoubleClickToOpen:"Single-click to deselect, double-click to open.",GenerateScatteredPlot:"Generate Scattered Plot",SelectXAxis:"Select X Axis",SelectYAxis:"Select Y Axis"},accountSettingsPanel:{MyAccountSettings:"Hesap Ayarlar\u0131m",MyID:"Bilgilerim",ClickToCopyMyID:"Bilgilerinizi kopyalamak i\xe7in t\u0131klay\u0131n",IDInClipBoard:"Ki\u015fisel bilgileriniz kopyaland\u0131 ve yap\u0131\u015ft\u0131rmaya haz\u0131r.",StoreMyNameInMyFilesWhenSaving:"Kaydederken, ad\u0131m\u0131 dosyalar\u0131ma ekle",DoYouReallyWantToShowYourNameInYourFiles:"Dosyalar\u0131n\u0131zda isminizin g\xf6sterilmesini istiyor musunuz?",SignFileDisclaimer:"Evet ise, isiminiz dosyalar\u0131n\u0131za eri\u015fimi olan b\xfct\xfcn ki\u015filer taraf\u0131ndan g\xf6r\xfclebilir.",Likes:"Likes",AllPublished:"All Published",PublishedUnderAliases:"Aliases",UserCount:"Kullan\u0131c\u0131 Say\u0131s\u0131",SchoolID:"Okul",ClassID:"S\u0131n\u0131f"},weatherPanel:{SunshineHours:"G\xfcnd\xfcz Saatleri"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"Model Se\xe7",Sinusoidal:"Sin\xfczoidal"},economicsPanel:{EconomicsParameters:"Ekonomik Parametreler",ElectricitySellingPrice:"Elektrik Sat\u0131\u015f Fiyat\u0131",OperationalCostPerUnit:"Birim Ba\u015f\u0131na \u0130\u015fletme Maliyeti",SellingPrice:"Selling Price",UnitCost:"Unit Cost"},navigationPanel:{NavigationParameters:"Navigation Parameters",MinimumMoveSpeed:"Minimum Move Speed",MinimumTurnSpeed:"Minimum Turn Speed"},yearlyLightSensorPanel:{SkyClearness:"G\xf6ky\xfcz\xfc A\xe7\u0131kl\u0131\u011f\u0131",ShowDaylightResults:"G\xfcn I\u015f\u0131\u011f\u0131 Sonu\xe7lar\u0131n\u0131 G\xf6ster",ShowSkyClearnessResults:"G\xf6ky\xfcz\xfc A\xe7\u0131kl\u0131\u011f\u0131 Sonu\xe7lar\u0131n\u0131 G\xf6ster",ShowAverageDailySolarRadiation:"G\xfcnl\xfck ortalama g\xfcne\u015f I\u015f\u0131n\u0131m\u0131n\u0131 g\xf6ster"},analysisManager:{NoSensorForCollectingData:"Veri toplamak i\xe7in sens\xf6r yok.",NoSolarPanelForAnalysis:"Analiz i\xe7in g\xfcne\u015f paneli yok.",NoObserverForVisibilityAnalysis:"G\xf6r\xfcn\xfcrl\xfck analizi i\xe7in g\xf6zlemci yok.",NoWaterHeaterForAnalysis:"Analiz i\xe7in su \u0131s\u0131t\u0131c\u0131s\u0131 yok",NoParabolicDishForAnalysis:"Analiz i\xe7in parabolik \xe7anak yok",NoParabolicTroughForAnalysis:"Analiz i\xe7in parabolik oluk yok.",NoFresnelReflectorForAnalysis:"Analiz i\xe7in Fresnel reflekt\xf6r\xfc yok.",NoHeliostatForAnalysis:"Analiz i\xe7in heliostat yok.",NoSolarUpdraftTowerForAnalysis:"Analiz i\xe7in Solar Updraft Kulesi yok.",NoBuildingForAnalysis:"There is no building for analysis."},toolbar:{CloudFile:"Bulut Dosyas\u0131",Select:"Se\xe7",AddFoundation:"Temel Ekle",AddWall:"Duvar Ekle",AddWindow:"Pencere Ekle",AddDoor:"Kap\u0131 Ekle",AddPyramidRoof:"Piramit \xc7at\u0131 Ekle",AddGableRoof:"Be\u015fik \xc7at\u0131 Ekle",AddHipRoof:"K\u0131rma \xc7at\u0131 Ekle",AddGambrelRoof:"Flemenk \xc7at\u0131 Ekle",AddMansardRoof:"Mansart \xc7at\u0131 Ekle",AddCuboid:"K\xfcbik Ekle",AddSensor:"Sens\xf6r Ekle",AddSolarPanel:"G\xfcne\u015f Paneli Ekle",AddWaterHeater:"Su Is\u0131t\u0131c\u0131 Ekle",AddParabolicDish:"Parabolik \xc7anak Ekle",AddParabolicTrough:"Parabolik Oluk Ekle",AddFresnelReflector:"Fresnel Reflekt\xf6r\xfc Ekle",AddHeliostat:"Heliostat Ekle",AddWindTurbine:"Add wind turbine",AddLight:"Add light",AddTree:"A\u011fa\xe7 Ekle",AddFlower:"Add flower",AddPeople:"\u0130nsan Ekle",DoubleClickToLockThisModeForNextAction:"Double-click to lock this mode for next action",ClickToUnlockThisModeForNextAction:"Click to unlock this mode for next action",ManipulateGroup:"\xd6l\xe7eklendirme",ClearScene:"Her\u015feyi Sil",ShowSunAndTimeSettings:"G\xfcne\u015f & Zaman Ayarlar\u0131n\u0131 G\xf6ster",SpatialAnalysisOfEnergy:"Spatial analysis of energy",DoYouReallyWantToClearContent:"\u0130\xe7eri\u011fi silmek istiyor musunuz",ClickForMoreButtons:"Daha fazla buton i\xe7in t\u0131klay\u0131n",SwitchToAddingFoundation:"Temel Ekle ",SwitchToAddingCuboid:"K\xfcbik Ekle ",SwitchToAddingWall:"Duvar Ekle",SwitchToAddingWindow:"Pencere Eklemeyi'A\xe7",SwitchToAddingDoor:"Kap\u0131 Ekle",SwitchToAddingPyramidRoof:"Piramit \xc7at\u0131 Ekle",SwitchToAddingGableRoof:"Be\u015fik \xc7at\u0131 Ekle",SwitchToAddingHipRoof:"K\u0131rma \xc7at\u0131 Ekle",SwitchToAddingGambrelRoof:"Flemenk \xc7at\u0131 Ekle",SwitchToAddingMansardRoof:"Mansart \xc7at\u0131 Ekle",SwitchToAddingSolarPanel:"G\xfcne\u015f Paneli Ekle",SwitchToAddingSensor:"Sens\xf6r Ekle",SwitchToAddingWaterHeater:"Su Is\u0131t\u0131c\u0131 Ekle",SwitchToAddingParabolicDish:"Parabolik \xc7anak Ekle",SwitchToAddingParabolicTrough:"Parabolik Oluk Ekle",SwitchToAddingFresnelReflector:"Fresnel Reflekt\xf6r Ekle",SwitchToAddingHeliostat:"Heliostat Ekle",SwitchToAddingWindTurbine:"Switch to Adding Wind Turbine",SwitchToAddingLight:"Switch to Adding Light",SwitchToAddingTree:"A\u011fa\xe7 Ekle",SwitchToAddingFlower:"Switch to Adding Flower",SwitchToAddingPeople:"Ki\u015fi Ekle"},tooltip:{gotoIFI:"Yar\u0131n\u0131n Zekas\u0131 Enstit\xfcs\xfcne Git",visitAladdinHomePage:"Aladdin Ana Sayfas\u0131n\u0131 Ziyaret Edin",clickToOpenMenu:"Ana Men\xfcy\xfc A\xe7mak \u0130\xe7in T\u0131klay\u0131n\u0131z",clickToAccessAccountSettings:"Click to access account settings"},tree:{Apple:"Apple",Birch:"Birch",Coconut:"Coconut",Dogwood:"K\u0131z\u0131lc\u0131k A\u011fac\u0131",Elm:"Karaa\u011fa\xe7",FanPalm:"Fan Palm",Linden:"Ihlamur A\u011fac\u0131",Magnolia:"Magnolia",Maple:"Ak\xe7aa\u011fa\xe7",Oak:"Me\u015fe A\u011fac\u0131",Pine:"\xc7am",Spruce:"Ala\xe7am"},flower:{Bellflower:"Bellflower",Boxwood:"Boxwood",CactusCombo1:"Cactus Combo 1",CactusCombo2:"Cactus Combo 2",CactusCombo3:"Cactus Combo 3",CactusCombo4:"Cactus Combo 4",Hibiscus:"Hibiscus",Hosta:"Hosta",Hydrangea:"Hydrangea",Peony:"Peony",RedRose:"Red Rose",Spirea:"Spirea",Sunflower:"Sunflower",TallBush:"Tall Bush",Tulip:"Tulip",WhiteFlower:"White Flower",YellowFlower:"Yellow Flower"},people:{Jaah:"Ata",Jack:"Mete",Jacob:"Jacob",Jacqueline:"Beril",Jade:"Ece",Jamelia:"Bilge",James:"James",Jane:"Jane",Jaya:"Asya",Jaye:"Aylin",Jeanette:"Jeanette",Jedi:"Alp",Jeff:"Kaya",Jena:"Nehir",Jennifer:"Defne",Jess:"Zeynep",Jett:"Umut",Jill:"Jill",Jiya:"Elif",Joan:"Ezgi",Jocelyn:"Jocelyn",Joel:"Cenk",Joey:"Azra",John:"Can",Jonathon:"Jonathon",Jose:"Mert",Joseph:"Joseph",Joshua:"Joshua",Judd:"Ozan",Judy:"Judy",Julia:"Julia",Julio:"Bulut",Jumapili:"Umay",June:"Naz",Juro:"Efe",Justin:"Justin"},compass:{N:"N",S:"S",W:"W",E:"E"},month:{January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"},modelsMap:{SearchByPublisher:"Search by publisher",SearchByLabel:"Search by label",MyPublishedModels:"My Published Models",TotalNumberOfUserPublishedModels:"Total number of user-published models",SortFromOldestToNewest:"Sort from oldest to newest",SortFromNewestToOldest:"Sort from newest to oldest",ModelsFoundOnThisSite:"models found on this site",ShowModelsPublishedByThisAuthor:"Show the models published by this author"}}},ua:{translation:{name:{IFI:"\u0406\u043d\u0441\u0442\u0438\u0442\u0443\u0442 \u0406\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u041c\u0430\u0439\u0431\u0443\u0442\u043d\u044c\u043e\u0433\u043e",Aladdin:"Aladdin",Tagline:"Aladdin: \u041f\u0435\u0440\u0435\u043e\u0441\u043c\u0438\u0441\u043b\u0435\u043d\u043d\u044f \u0414\u0438\u0437\u0430\u0439\u043d\u0443 \u0437 \u041f\u043e\u044f\u0441\u043d\u044e\u0432\u0430\u043b\u044c\u043d\u0438\u043c \u0428\u0442\u0443\u0447\u043d\u0438\u043c \u0406\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u043e\u043c - \u0406\u043d\u0441\u0442\u0438\u0442\u0443\u0442 \u0406\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u041c\u0430\u0439\u0431\u0443\u0442\u043d\u044c\u043e\u0433\u043e"},cookie:{Statement:"\u041d\u0430\u0442\u0438\u0441\u043d\u0443\u0432\u0448\u0438 \xab\u041f\u0440\u0438\u0439\u043d\u044f\u0442\u0438\xbb, \u0432\u0438 \u043f\u043e\u0433\u043e\u0434\u0436\u0443\u0454\u0442\u0435\u0441\u044f \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f\u043c \u0444\u0430\u0439\u043b\u0456\u0432 cookie \u0434\u043b\u044f \u043f\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044f \u0432\u0430\u0448\u043e\u0433\u043e \u0434\u043e\u0441\u0432\u0456\u0434\u0443 \u0437 Aladdin.",Accept:"\u041f\u0440\u0438\u0439\u043d\u044f\u0442\u0438"},aboutUs:{ProductBroughtToYouBy:"\u0426\u0435\u0439 \u041f\u0440\u043e\u0434\u0443\u043a\u0442 \u0411\u0443\u043b\u043e \u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043e:",TermsOfService:"\u0423\u043c\u043e\u0432\u0438 \u0412\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f",PrivacyPolicy:"\u041f\u043e\u043b\u0456\u0442\u0438\u043a\u0430 \u041a\u043e\u043d\u0444\u0456\u0434\u0435\u043d\u0446\u0456\u0439\u043d\u043e\u0441\u0442\u0456",Software:"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043d\u0435 \u0417\u0430\u0431\u0435\u0437\u043f\u0435\u0447\u0435\u043d\u043d\u044f",Content:"\u041c\u0430\u0442\u0435\u0440\u0456\u0430\u043b\u0438",Research:"\u0414\u043e\u0441\u043b\u0456\u0434\u0436\u0435\u043d\u043d\u044f",Support:"\u041f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0430",Acknowledgment:"\u041f\u043e\u0434\u044f\u043a\u0430",FundingInformation:"\u041d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u0438\u0439 \u041d\u0430\u0443\u043a\u043e\u0432\u0438\u0439 \u0424\u043e\u043d\u0434 (\u041d\u041d\u0424, C\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0456 \u0428\u0442\u0430\u0442\u0438 \u0410\u043c\u0435\u0440\u0438\u043a\u0438) \u043d\u0430\u0434\u0430\u0432 \u0444\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u0443 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u043b\u0456\u0434\u0436\u0435\u043d\u043d\u044f \u0442\u0430 \u0440\u043e\u0437\u0440\u043e\u0431\u043a\u0438 \u0446\u044c\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0443 \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e \u0433\u0440\u0430\u043d\u0442\u0456\u0432 \u21162105695, \u21162131097, \u0442\u0430 \u2116#2301164. \u041e\u0434\u043d\u0430\u043a, \u0431\u0443\u0434\u044c-\u044f\u043a\u0456 \u043f\u043e\u0433\u043b\u044f\u0434\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u0442\u0430 \u0432\u0438\u0441\u043d\u043e\u0432\u043a\u0438, \u0432\u0438\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u0456 \u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0456, \u043d\u0430\u043b\u0435\u0436\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0430\u043c \u0456 \u043c\u043e\u0436\u0443\u0442\u044c \u043d\u0435 \u043f\u043e\u0432\u043d\u0456\u0441\u0442\u044e \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u0438 \u043f\u043e\u0433\u043b\u044f\u0434\u0438 \u041d\u041d\u0424.",Contact:"\u0414\u043b\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0434\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u043e\u0457 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0457, \u0431\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0437\u0432\u0435\u0440\u043d\u0456\u0442\u044c\u0441\u044f \u0434\u043e Charles Xie (charles@intofuture.org).",Translators:"\u041f\u0435\u0440\u0435\u043a\u043b\u0430\u0434"},word:{LastUpdate:"Last Update",Small:"Small",Medium:"Medium",Large:"Large",Design:"Design",Information:"Information",Type:"Type",Text:"\u0422\u0435\u043a\u0441\u0442",FontSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0428\u0440\u0438\u0444\u0442\u0443",FontColor:"\u041a\u043e\u043b\u0456\u0440 \u0428\u0440\u0438\u0444\u0442\u0443",Model:" \u041c\u043e\u0434\u0435\u043b\u044c",Models:"\u041c\u043e\u0434\u0435\u043b\u0456",Upload:"\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438",ClickCount:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u041f\u0456\u0434\u0440\u0430\u0445\u0443\u0432\u0430\u0442\u0438",Share:"\u041f\u043e\u0434\u0456\u043b\u0438\u0442\u0438\u0441\u044c",AlreadyLike:"\u0412\u043f\u043e\u0434\u043e\u0431\u0430\u043d\u043e",Like:"\u0412\u043f\u043e\u0434\u043e\u0431\u0430\u0442\u0438",MustLogInToLike:"\u041f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u0423\u0432\u0456\u0439\u0442\u0438, \u0449\u043e\u0431 \u0412\u043f\u043e\u0434\u043e\u0431\u0430\u0442\u0438",AllRightsReserved:"\u0423\u0441\u0456 \u041f\u0440\u0430\u0432\u0430 \u0417\u0430\u0445\u0438\u0449\u0435\u043d\u043e",MeterAbbreviation:"\u043c",Version:"\u0412\u0435\u0440\u0441\u0456\u044f",VersionInitial:"\u0412",Options:"\u041e\u043f\u0446\u0456\u0457",Maximum:"\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c",Minimum:"\u041c\u0456\u043d\u0456\u043c\u0443\u043c",MaximumNumber:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0435 \u0427\u0438\u0441\u043b\u043e",MinimumNumber:"\u041c\u0456\u043d\u0456\u043c\u0430\u043b\u044c\u043d\u0435 \u0427\u0438\u0441\u043b\u043e",MaximumValue:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0435 \u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f",MinimumValue:"\u041c\u0456\u043d\u0456\u043c\u0430\u043b\u044c\u043d\u0435 \u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f",Or:"\u0410\u0431\u043e",None:"\u0416\u043e\u0434\u0435\u043d",High:"\u0412\u0438\u0441\u043e\u043a\u0438\u0439",Partial:"\u0427\u0430\u0441\u0442\u043a\u043e\u0432\u0438\u0439",Teacher:"\u0412\u0447\u0438\u0442\u0435\u043b\u044c",Class:"\u041a\u043b\u0430\u0441",Total:"\u0412\u0441\u044c\u043e\u0433\u043e",Leaderboard:"\u0422\u0430\u0431\u043b\u0438\u0446\u044f \u041b\u0456\u0434\u0435\u0440\u0456\u0432",Latest:"\u041e\u0441\u0442\u0430\u043d\u043d\u0454",Range:"\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d",SIUnit:"SI \u041e\u0434\u0438\u043d\u0438\u0446\u044f",USUnit:"US \u041e\u0434\u0438\u043d\u0438\u0446\u044f",ThermalTransmittance:"\u0422\u0435\u043f\u043b\u043e\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430",ThermalResistance:"\u0422\u0435\u0440\u043c\u0456\u0447\u043d\u0438\u0439 \u041e\u043f\u0456\u0440",UValue:"U-\u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f",RValue:"R-\u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f",VolumetricHeatCapacity:"\u041e\u0431'\u0454\u043c\u043d\u0430 \u0422\u0435\u043f\u043b\u043e\u0454\u043c\u043d\u0456\u0441\u0442\u044c",BuildingHVACSystem:"\u041f\u043e\u0431\u0443\u0434\u043e\u0432\u0430 \u0421\u0438\u0441\u0442\u0435\u043c\u0438 \u041e\u043f\u0430\u043b\u0435\u043d\u043d\u044f, \u0412\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0456\u0457 \u0442\u0430 \u041a\u043e\u043d\u0434\u0438\u0446\u0456\u044e\u0432\u0430\u043d\u043d\u044f \u041f\u043e\u0432\u0456\u0442\u0440\u044f (\u041e\u0412\u041a)",ThermostatSetpoint:"\u0417\u0430\u0434\u0430\u043d\u0430 \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0422\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u0430",TemperatureToleranceThreshold:"\u041f\u043e\u0440\u043e\u0433\u043e\u0432\u0435 \u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0412\u0456\u0434\u0445\u0438\u043b\u0435\u043d\u043d\u044f \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438",TemperatureToleranceThresholdExplanation:"\u041e\u0431\u0456\u0433\u0440\u0456\u0432\u0430\u0447 \u043d\u0435 \u043f\u0440\u0430\u0446\u044e\u0432\u0430\u0442\u0438\u043c\u0435, \u044f\u043a\u0449\u043e \u043d\u0430\u0439\u043d\u0438\u0436\u0447\u0430 \u0437\u043e\u0432\u043d\u0456\u0448\u043d\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0434\u043d\u044f \u0432\u0438\u0449\u0430 \u0437\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043de, \u044f\u043a\u0449\u043e \u0432\u0456\u0434 \u0437\u0430\u0434\u0430\u043d\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u0432\u0456\u0434\u043d\u044f\u0442\u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f. \u041a\u043e\u043d\u0434\u0438\u0446\u0456\u043e\u043d\u0435\u0440 \u043d\u0435 \u043f\u0440\u0430\u0446\u044e\u0432\u0430\u0442\u0438\u043c\u0435, \u044f\u043a\u0449\u043e \u043d\u0430\u0439\u0432\u0438\u0449\u0430 \u0437\u043e\u0432\u043d\u0456\u0448\u043d\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0434\u043d\u044f \u043d\u0438\u0436\u0447\u0430 \u0437\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u0435, \u044f\u043a\u0449\u043e \u0432\u0456\u0434 \u0437\u0430\u0434\u0430\u043d\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u0432\u0456\u0434\u043d\u044f\u0442\u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f.",Press:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c",Open:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438",Save:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438",SaveAsImage:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u044f\u043a \u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",SaveAsCsv:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u044f\u043a CSV",Update:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438",Paste:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438",Copy:"\u041a\u043e\u043f\u0456\u044e\u0432\u0430\u0442\u0438",Cut:"\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438",Delete:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438",Lock:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438",Translucent:"\u041f\u0456\u0432\u043f\u0440\u043e\u0437\u043e\u0440\u0438\u0439",Color:"\u041a\u043e\u043b\u0456\u0440",Texture:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430",Size:"\u0420\u043e\u0437\u043c\u0456\u0440",Thickness:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430",Yes:"\u0422\u0430\u043a",No:"\u041d\u0456",OK:"\u041e\u041a",Cancel:"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438",Apply:"\u0417\u0430\u0441\u0442\u043e\u0441\u0443\u0432\u0430\u0442\u0438",Close:"\u0417\u0430\u043a\u0440\u0438\u0442\u0438",ApplyTo:"\u0417\u0430\u0441\u0442\u043e\u0441\u0443\u0432\u0430\u0442\u0438 \u0414\u043e",Run:"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438",Pause:"\u041f\u0430\u0443\u0437\u0430",Resume:"\u0412\u0456\u0434\u043d\u043e\u0432\u0438\u0442\u0438",Clear:"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438",Warning:"\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u0436\u0435\u043d\u043d\u044f",Caution:"\u041e\u0431\u0435\u0440\u0435\u0436\u043d\u043e",Reminder:"\u041d\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043d\u043d\u044f",Length:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430",Width:"\u0428\u0438\u0440\u0438\u043d\u0430",Height:"\u0412\u0438\u0441\u043e\u0442\u0430",Radius:"\u0420\u0430\u0434\u0456\u0443\u0441",Angle:"\u041a\u0443\u0442",Azimuth:"\u0410\u0437\u0438\u043c\u0443\u0442",Coordinates:"\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0438",Weather:"\u041f\u043e\u0433\u043e\u0434\u0430",Show:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438",Animate:"\u0410\u043d\u0456\u043c\u0443\u0432\u0430\u0442\u0438",Date:"\u0414\u0430\u0442\u0430",Time:"\u0427\u0430\u0441",Title:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",Owner:"\u0412\u043b\u0430\u0441\u043d\u0438\u043a",Action:"\u0414\u0456\u044f",Rename:"\u041f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438",Location:"\u041c\u0456\u0441\u0446\u0435\u0437\u043d\u0430\u0445\u043e\u0434\u0436\u0435\u043d\u043d\u044f",Latitude:"\u0428\u0438\u0440\u043e\u0442\u0430",Month:"\u041c\u0456\u0441\u044f\u0446\u044c",Day:"\u0414\u0435\u043d\u044c",Hour:"\u0413\u043e\u0434\u0438\u043d\u0430",Daylight:"\u0414\u0435\u043d\u043d\u0435 \u0441\u0432\u0456\u0442\u043b\u043e",Radiation:"\u0420\u0430\u0434\u0456\u0430\u0446\u0456\u0439\u043d\u0435 \u0412\u0438\u043f\u0440\u043e\u043c\u0456\u043d\u044e\u0432\u0430\u043d\u043d\u044f",Temperature:"\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430",kWh:"\u043a\u0412\u0442-\u0433\u043e\u0434",dollar:"\u0434\u043e\u043b\u0430\u0440",MeterPerSecond:"\u043c/\u0441",NorthInitial:"\u041f\u0456\u0432\u043d\u0456\u0447",SouthInitial:"\u041f\u0456\u0432\u0434\u0435\u043d\u044c",EastInitial:"\u0421\u0445\u0456\u0434",WestInitial:"\u0417\u0430\u0445\u0456\u0434",Fixed:"\u0424\u0456\u043a\u0441\u043e\u0432\u0430\u043d\u0438\u0439",Elements:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442\u0438",Energy:"\u0415\u043d\u0435\u0440\u0433\u0456\u044f",Unknown:"\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u043e",Label:"\u041c\u0456\u0442\u043a\u0430",Description:"\u041e\u043f\u0438\u0441",NoDescription:"\u0411\u0435\u0437 \u043e\u043f\u0438\u0441\u0443",MaximumCharacters:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u0456\u0432",Author:"\u0410\u0432\u0442\u043e\u0440",Publisher:"\u0412\u0438\u0434\u0430\u0432\u0435\u0446\u044c",Building:"\u0411\u0443\u0434\u0456\u0432\u043b\u044f",ResidentialBuilding:"\u0416\u0438\u0442\u043b\u043e\u0432\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f",CommercialBuilding:"\u041a\u043e\u043c\u0435\u0440\u0446\u0456\u0439\u043d\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f",SchoolBuilding:"\u0428\u043a\u0456\u043b\u044c\u043d\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f",TouristAttraction:"\u0422\u0443\u0440\u0438\u0441\u0442\u0438\u0447\u043d\u0430 \u0432\u0438\u0437\u043d\u0430\u0447\u043d\u0430 \u043f\u0430\u043c'\u044f\u0442\u043a\u0430",UnderConstruction:"\u0412 \u0441\u0442\u0430\u0434\u0456\u0457 \u0431\u0443\u0434\u0456\u0432\u043d\u0438\u0446\u0442\u0432\u0430",Photovoltaic:"\u0424\u043e\u0442\u043e\u0435\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u043d\u0438\u0439",Anonymous:"\u0410\u043d\u043e\u043d\u0456\u043c\u043d\u0438\u0439",Nickname:"\u041d\u0456\u043a\u043d\u0435\u0439\u043c",Pin:"\u0417\u0430\u043a\u0440\u0456\u043f\u0438\u0442\u0438",Unpin:"\u0412\u0456\u0434\u043a\u0440\u0456\u043f\u0438\u0442\u0438"},shared:{NoTexture:"\u0411\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438",FoundationElement:"\u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442",CuboidElement:"\u041f\u0430\u0440\u0430\u043b\u0435\u043b\u0435\u043f\u0456\u043f\u0435\u0434",PolygonElement:"\u0411\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0438\u043a",SensorElement:"\u0421\u0435\u043d\u0441\u043e\u0440",SolarPanelElement:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c",WaterHeaterElement:"\u0412\u043e\u0434\u043e\u043d\u0430\u0433\u0440\u0456\u0432\u0430\u0447",ParabolicDishElement:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0430 \u0442\u0430\u0440\u0456\u043b\u043a\u0430",ParabolicTroughElement:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",FresnelReflectorElement:"\u0412\u0456\u0434\u0431\u0438\u0432\u0430\u0447 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",HeliostatElement:"\u0413\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442",WindTurbineElement:"\u0412\u0456\u0442\u0440\u043e\u0432\u0430 \u0442\u0443\u0440\u0431\u0456\u043d\u0430",LightElement:"\u0421\u0432\u0456\u0442\u043b\u043e",ElementLocked:"\u0417\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u043e",ModelType:"\u0422\u0438\u043f \u043c\u043e\u0434\u0435\u043b\u0456",OutputBreakdown:"Breakdown",MoreResults:"More Results"},message:{ModelNotFound:"\u041c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e",CannotSignIn:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0443\u0432\u0456\u0439\u0442\u0438",CannotSignOut:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0438\u0439\u0442\u0438",YourAccountWasCreated:"\u0412\u0430\u0448 \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0438\u0441 \u0431\u0443\u0432 \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439",CannotCreateAccount:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0438\u0441",YourAccountSettingsWereSaved:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443 \u0431\u0443\u043b\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0456",CannotSaveYourAccountSettings:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443",CannotSaveYourFileToCloud:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0432\u0430\u0448 \u0444\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",CannotCreateNewProject:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043d\u043e\u0432\u0438\u0439 \u043f\u0440\u043e\u0454\u043a\u0442",CannotCreateNewProjectWithoutTitle:"Cannot create a new project without a title",CannotOpenYourProjects:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0432\u0430\u0448\u0456 \u043f\u0440\u043e\u0454\u043a\u0442\u0438",CannotOpenProject:"Cannot open the project",CannotDeleteProject:"Cannot delete the project",CannotRenameProject:"Cannot rename the project",CannotAddDesignToProject:"Cannot add this design to the project",CannotAddDesignToProjectOwnedByOthers:"Cannot add this design to a project owned by others",DesignRemovedFromProject:"The design was successfully removed from the project",CannotRemoveDesignFromProject:"Cannot remove this design from the project",CannotUpdateProject:"Cannot update the project",CannotFetchProjectData:"Cannot fetch project data",TitleUsedChooseDifferentOne:"\u0426\u044f \u043d\u0430\u0437\u0432\u0430 \u0431\u0443\u043b\u0430 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0430. \u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u0456\u043d\u0448\u0443",CloudFileWithTitleExistsDoYouWantToOverwrite:"\u0425\u043c\u0430\u0440\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u0437 \u0442\u0430\u043a\u043e\u044e \u0436 \u043d\u0430\u0437\u0432\u043e\u044e \u0432\u0436\u0435 \u0456\u0441\u043d\u0443\u0454. \u0412\u0438 \u0445\u043e\u0447\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u0438 \u0439\u043e\u0433\u043e?",CloudFileNotFound:"\u0424\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456 \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e",CannotLoadModelsOnMap:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0456 \u043d\u0430 \u043a\u0430\u0440\u0442\u0443",CannotLoadLeaderboard:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044e \u043b\u0456\u0434\u0435\u0440\u0456\u0432",CannotPublishModelOnMap:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043a\u0430\u0440\u0442\u0456",CannotLikeModelFromMap:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u043e\u0446\u0456\u043d\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437 \u043a\u0430\u0440\u0442\u0438",CannotDeleteModelFromMap:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437 \u043a\u0430\u0440\u0442\u0438",ModelDeletedFromMap:"\u041c\u043e\u0434\u0435\u043b\u044c \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u0430 \u0437 \u043a\u0430\u0440\u0442\u0438",DoYouWantToDeleteModelFromMap:"\u0412\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437 \u043a\u0430\u0440\u0442\u0438?",CannotOpenCloudFile:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0444\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",CannotReadCloudFile:"Cannot read the cloud file",CannotWriteCloudFile:"Cannot write the cloud file",CloudFileCopied:"Cloud file copied",CannotOpenCloudFolder:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u043f\u0430\u043f\u043a\u0443 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",CannotDeleteCloudFile:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0444\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",CannotRenameCloudFile:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438 \u0444\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",DoYouWantToSaveChanges:"\u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0437\u043c\u0456\u043d\u0438?",NotApplicableToSelectedAction:"\u041d\u0435 \u0437\u0430\u0441\u0442\u043e\u0441\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u0434\u043e \u043e\u0431\u0440\u0430\u043d\u043e\u0457 \u0434\u0456\u0457",ThisElementIsLocked:"\u0426\u0435\u0439 \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u0439.",ThisCannotBeUndone:"\u0426\u0435 \u043d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0441\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438.",AzimuthOfNorthIsZero:"\u0410\u0437\u0438\u043c\u0443\u0442 \u043f\u0456\u0432\u043d\u043e\u0447\u0456 \u0434\u043e\u0440\u0456\u0432\u043d\u044e\u0454 0\xb0",CounterclockwiseAzimuthIsPositive:"\u0410\u0437\u0438\u043c\u0443\u0442 \u0454 \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u0438\u043c \u043f\u0440\u043e\u0442\u0438 \u0433\u043e\u0434\u0438\u043d\u043d\u0438\u043a\u043e\u0432\u043e\u0457 \u0441\u0442\u0440\u0456\u043b\u043a\u0438.",MoveCancelledBecauseOfOverlap:"\u041f\u0435\u0440\u0435\u043c\u0456\u0449\u0435\u043d\u043d\u044f \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f.",MoveOutsideBoundaryCancelled:"\u041f\u0435\u0440\u0435\u043c\u0456\u0449\u0435\u043d\u043d\u044f \u0437\u0430 \u043c\u0435\u0436\u0456 \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u043e.",RotationCancelledBecauseOfOverlap:"\u0420\u043e\u0442\u0430\u0446\u0456\u044e \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f.",RotationOutsideBoundaryCancelled:"\u0420\u043e\u0442\u0430\u0446\u0456\u044f \u0437\u0430 \u043c\u0435\u0436\u0456 \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u0430.",ResizingCancelledBecauseOfOverlap:"\u0417\u043c\u0456\u043d\u0430 \u0440\u043e\u0437\u043c\u0456\u0440\u0443 \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f.",ResizingOutsideBoundaryCancelled:"\u0417\u043c\u0456\u043d\u0430 \u0440\u043e\u0437\u043c\u0456\u0440\u0443 \u0437\u0430 \u043c\u0435\u0436\u0456 \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u0430.",CannotPasteOutsideBoundary:"\u041d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0437\u0430 \u043c\u0435\u0436\u0456.",CannotPasteBecauseOfOverlap:"\u041d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f.",CannotMoveObjectTooFar:"\u041d\u0435 \u043c\u043e\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0456\u0441\u0442\u0438\u0442\u0438 \u043e\u0431'\u0454\u043a\u0442 \u0437\u0430\u043d\u0430\u0434\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e.",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"\u0406\u0441\u043d\u0443\u044e\u0447\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u0431\u0443\u0434\u0443\u0442\u044c \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u0456 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0441\u0442\u043e\u0441\u0443\u0432\u0430\u043d\u043d\u044f\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u043a\u0435\u0442\u0443.",DoYouWantToContinue:"\u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438?",SolarPanelsCannotIntersectWithGround:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0435 \u043c\u043e\u0436\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u0442\u0438\u043d\u0430\u0442\u0438\u0441\u044f \u0437 \u0437\u0435\u043c\u043b\u0435\u044e.",SolarPanelsCannotOverlapWithOneAnother:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0435 \u043c\u043e\u0436\u0443\u0442\u044c \u043d\u0430\u043a\u043b\u0430\u0434\u0430\u0442\u0438\u0441\u044f \u043e\u0434\u043d\u0430 \u043d\u0430 \u043e\u0434\u043d\u0443.",ScreenshotSaved:"\u0417\u043d\u0456\u043c\u043e\u043a \u0435\u043a\u0440\u0430\u043d\u0430 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e.",CsvFileSaved:"CSV \u0444\u0430\u0439\u043b \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e.",SimulationStarted:"\u0420\u043e\u0437\u043f\u043e\u0447\u0430\u0442\u043e \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e.",SimulationCompleted:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e.",SimulationAborted:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e \u043f\u0435\u0440\u0435\u0440\u0432\u0430\u043d\u043e.",SimulationPaused:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e \u043f\u0440\u0438\u0437\u0443\u043f\u0438\u043d\u0435\u043d\u043e.",CancelSimulation:"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e",PauseSimulation:"\u041f\u0440\u0438\u0437\u0443\u043f\u0438\u043d\u0438\u0442\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e",ResumeSimulation:"\u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e",SimulationWillNotStartDueToErrors:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044f \u043d\u0435 \u0440\u043e\u0437\u043f\u043e\u0447\u043d\u0435\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043c\u0438\u043b\u043a\u0438",SimulationWillStartDespiteWarnings:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044f \u0440\u043e\u0437\u043f\u043e\u0447\u043d\u0435\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0432\u0430\u0436\u0430\u044e\u0447\u0438 \u043d\u0430 \u043f\u043e\u043f\u0435\u0440\u0435\u0434\u0436\u0435\u043d\u043d\u044f.",EvolutionStarted:"\u0415\u0432\u043e\u043b\u044e\u0446\u0456\u044e \u0440\u043e\u0437\u043f\u043e\u0447\u0430\u0442\u043e.",EvolutionCompleted:"\u0415\u0432\u043e\u043b\u044e\u0446\u0456\u044e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e.",EvolutionAborted:"\u0415\u0432\u043e\u043b\u044e\u0446\u0456\u044e \u043f\u0435\u0440\u0435\u0440\u0432\u0430\u043d\u043e.",EvolutionPaused:"\u0415\u0432\u043e\u043b\u044e\u0446\u0456\u044e \u043f\u0440\u0438\u0437\u0443\u043f\u0438\u043d\u0435\u043d\u043e.",EncounterEvolutionError:"\u0421\u0442\u0430\u043b\u0430\u0441\u044f \u043f\u043e\u043c\u0438\u043b\u043a\u0430 \u0435\u0432\u043e\u043b\u044e\u0446\u0456\u0457.",CancelEvolution:"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0435\u0432\u043e\u043b\u044e\u0446\u0456\u044e",PauseEvolution:"\u041f\u0440\u0438\u0437\u0443\u043f\u0438\u043d\u0438\u0442\u0438 \u0435\u0432\u043e\u043b\u044e\u0446\u0456\u044e",ResumeEvolution:"\u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438 \u0435\u0432\u043e\u043b\u044e\u0446\u0456\u044e",ConvergenceThresholdHasBeenReached:"\u0414\u043e\u0441\u044f\u0433\u043d\u0443\u0442\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0431\u0456\u0436\u043d\u043e\u0441\u0442\u0456.",MaximumNumberOfGenerationsHasBeenReached:"\u0414\u043e\u0441\u044f\u0433\u043d\u0443\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043f\u043e\u043a\u043e\u043b\u0456\u043d\u044c.",MaximumNumberOfStepsHasBeenReached:"\u0414\u043e\u0441\u044f\u0433\u043d\u0443\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043a\u0440\u043e\u043a\u0456\u0432.",ObjectiveFunctionTypeError:"\u041f\u043e\u0442\u043e\u0447\u043d\u0430 \u0446\u0456\u043b\u044c\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0456\u044f \u043d\u0435 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u0454\u0442\u044c\u0441\u044f \u0446\u0456\u0454\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0454\u044e. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0440\u043e\u0437\u043f\u043e\u0447\u043d\u0456\u0442\u044c \u0437 \u043c\u0435\u043d\u044e.",WallsAreNotAtSameHeight:"\u0421\u0442\u0456\u043d\u0438 \u043d\u0435 \u0437\u043d\u0430\u0445\u043e\u0434\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0430\u043a\u043e\u0432\u0456\u0439 \u0432\u0438\u0441\u043e\u0442\u0456.",WallsAreNotPerpendicular:"\u0421\u0442\u0456\u043d\u0438 \u043d\u0435 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u0456.",WallsAreNotConnected:"\u0421\u0442\u0456\u043d\u0438 \u043d\u0435 \u0437'\u0454\u0434\u043d\u0430\u043d\u0456.",WallsNumberNeedToBeFour:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0441\u0442\u0456\u043d \u043c\u0430\u0454 \u0434\u043e\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u0442\u0438 \u0447\u043e\u0442\u0438\u0440\u0438.",BuildingContainsEmptyWall:"\u0411\u0443\u0434\u0456\u0432\u043b\u044f \u043c\u0456\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0430\u0431\u043e \u043a\u0456\u043b\u044c\u043a\u0430 \u043f\u043e\u0440\u043e\u0436\u043d\u0456\u0445 \u0441\u0442\u0456\u043d.",BuildingRoofMissing:"\u0423 \u0431\u0443\u0434\u0456\u0432\u043b\u0456 \u0432\u0456\u0434\u0441\u0443\u0442\u043d\u0456\u0439 \u0434\u0430\u0445.",UnknownErrors:"\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u0456 \u043f\u043e\u043c\u0438\u043b\u043a\u0438."},menu:{AnalysisOptions:"\u041e\u043f\u0446\u0456\u0457 \u0430\u043d\u0430\u043b\u0456\u0437\u0443",option:{GridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0441\u0456\u0442\u043a\u0438",SamplingFrequency:"\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u0432\u0438\u0431\u0456\u0440\u043a\u0438",TimesPerHour:"\u0420\u0430\u0437\u0456\u0432 \u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DaysPerYear:"\u0414\u043d\u0456\u0432 \u043d\u0430 \u0440\u0456\u043a"},mainMenu:"\u0413\u043e\u043b\u043e\u0432\u043d\u0435 \u041c\u0435\u043d\u044e",cloudMenu:"\u041c\u0435\u043d\u044e \u0425\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0421\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0430",projectSubMenu:"\u041f\u0440\u043e\u0454\u043a\u0442",project:{CreateNewProject:"\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u041d\u043e\u0432\u0438\u0439 \u041f\u0440\u043e\u0454\u043a\u0442",OpenProject:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u041f\u0440\u043e\u0454\u043a\u0442",SaveProjectAs:"Save Project As",YouMustLogInToCreateProject:"\u0412\u0438 \u043f\u043e\u0432\u0438\u043d\u043d\u0456 \u0443\u0432\u0456\u0439\u0442\u0438, \u0449\u043e\u0431 \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043d\u043e\u0432\u0438\u0439 \u043f\u0440\u043e\u0454\u043a\u0442",YouMustLogInToOpenProject:"\u0412\u0438 \u043f\u043e\u0432\u0438\u043d\u043d\u0456 \u0443\u0432\u0456\u0439\u0442\u0438, \u0449\u043e\u0431 \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u043f\u0440\u043e\u0454\u043a\u0442"},fileSubMenu:"\u0424\u0430\u0439\u043b",file:{CreateNewFile:"\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043d\u043e\u0432\u0438\u0439",OpenLocalFile:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e",SaveAsLocalFile:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u044f\u043a",SavingAbortedMustHaveValidFileName:"\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u044f \u043f\u0435\u0440\u0435\u0440\u0432\u0430\u043d\u043e! \u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043c\u0430\u0442\u0438 \u0434\u0456\u0439\u0441\u043d\u0435 \u0456\u043c'\u044f \u0444\u0430\u0439\u043b\u0443",OpenCloudFile:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",SaveCloudFile:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",SaveAsCloudFile:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",SavingAbortedMustHaveValidTitle:"\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u044f \u043f\u0435\u0440\u0435\u0440\u0432\u0430\u043d\u043e! \u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043c\u0430\u0442\u0438 \u0434\u0456\u0439\u0441\u043d\u0438\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u043b\u044f \u0445\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0443",ToSaveYourWorkPleaseSignIn:"\u0429\u043e\u0431 \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0432\u0430\u0448\u0443 \u0440\u043e\u0431\u043e\u0442\u0443, \u0431\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0443\u0432\u0456\u0439\u0434\u0456\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.",TakeScreenshot:"\u0417\u0440\u043e\u0431\u0438\u0442\u0438 \u0437\u043d\u0456\u043c\u043e\u043a \u0435\u043a\u0440\u0430\u043d\u0430",UseCloudFileName:"\u0412\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u0456\u043c'\u044f \u0444\u0430\u0439\u043b\u0443 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",PublishOnModelsMap:"\u041e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0456 \u043c\u043e\u0434\u0435\u043b\u0435\u0439",PublishedOnModelsMap:"\u0412\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u043b\u043e \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043a\u0430\u0440\u0442\u0456 \u043c\u043e\u0434\u0435\u043b\u0435\u0439",UpdatedOnModelsMap:"\u0412\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u043b\u0430 \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0456 \u043c\u043e\u0434\u0435\u043b\u0435\u0439",YouMustLogInToPublishYourModel:"\u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u0443\u0432\u0456\u0439\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0449\u043e\u0431 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u0441\u0432\u043e\u044e \u043c\u043e\u0434\u0435\u043b\u044c",YouCannotPublishAModelThatYouDoNotOwn:"\u0412\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c, \u044f\u043a\u043e\u044e \u043d\u0435 \u0432\u043e\u043b\u043e\u0434\u0456\u0454\u0442\u0435",YouMustSaveModelOnCloudBeforePublishingIt:"\u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456 \u043f\u0435\u0440\u0435\u0434 \u0457\u0457 \u043f\u0443\u0431\u043b\u0456\u043a\u0430\u0446\u0456\u0454\u044e"},editSubMenu:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438",edit:{Undo:"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438",Redo:"\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0438"},viewSubMenu:"\u041f\u0435\u0440\u0435\u0433\u043b\u044f\u0434",view:{NavigationView:"Navigation View",TwoDimensionalView:"2D \u0412\u0438\u0433\u043b\u044f\u0434",ResetView:"\u0421\u043a\u0438\u043d\u0443\u0442\u0438",ZoomIn:"\u0417\u0431\u0456\u043b\u044c\u0448\u0438\u0442\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431",ZoomOut:"\u0417\u043c\u0435\u043d\u0448\u0438\u0442\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431",AutoRotate:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0438\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442",ShowShadow:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0442\u0456\u043d\u044c",ShowSurfaceShininess:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0431\u043b\u0438\u0441\u043a \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",TranslucentFloatingWindows:"\u041d\u0430\u043f\u0456\u0432\u043f\u0440\u043e\u0437\u043e\u0440\u0456 \u043f\u043b\u0430\u0432\u0430\u044e\u0447\u0456 \u0432\u0456\u043a\u043d\u0430",accessoriesSubMenu:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438",accessories:{SiteInformation:"\u0406\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u044f \u043f\u0440\u043e \u043c\u0456\u0441\u0446\u0435",DesignInformation:"\u0406\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u044f \u043f\u0440\u043e \u0434\u0438\u0437\u0430\u0439\u043d",Instruction:"\u0406\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0456\u044f",StickyNote:"\u041f\u0440\u0438\u043c\u0456\u0442\u043a\u0430",Note:"\u041f\u0440\u0438\u043c\u0456\u0442\u043a\u0430"}},settingsSubMenu:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f",settings:{WeatherData:"\u0414\u0430\u043d\u0456 \u043f\u0440\u043e \u043f\u043e\u0433\u043e\u0434\u0443",DiurnalTemperature:"\u0414\u043e\u0431\u043e\u0432\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430",Heliodon:"\u0413\u0435\u043b\u0456\u043e\u0434\u043e\u043d",SunAndTime:"\u0421\u043e\u043d\u0446\u0435 \u0442\u0430 \u0447\u0430\u0441"},benchmarksSubMenu:"\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438",benchmarks:{SolarRadiationPredictionVsMeasurement:"\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u0457 \u043f\u043e\u0440\u0456\u0432\u043d\u044f\u043d\u043e \u0437 \u0432\u0438\u043c\u0456\u0440\u044e\u0432\u0430\u043d\u043d\u044f\u043c",BESTESTCase600:"\u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0435\u043d\u0435\u0440\u0433\u043e\u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c: BESTEST Case 600",BESTESTCase610:"\u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0435\u043d\u0435\u0440\u0433\u043e\u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c: BESTEST Case 610",BESTESTCase620:"\u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0435\u043d\u0435\u0440\u0433\u043e\u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c: BESTEST Case 620",BESTESTCase630:"\u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0435\u043d\u0435\u0440\u0433\u043e\u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c: BESTEST Case 630"},graph:{LineWidth:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u043b\u0456\u043d\u0456\u0457",SymbolSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u0443",BarCategoryGap:"\u0412\u0456\u0434\u0441\u0442\u0443\u043f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0456\u0439 \u0441\u0442\u043e\u0432\u043f\u0446\u0456\u0432",ShowHorizontalGridLines:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0456 \u043b\u0456\u043d\u0456\u0457 \u0441\u0456\u0442\u043a\u0438",ShowVerticalGridLines:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0456 \u043b\u0456\u043d\u0456\u0457 \u0441\u0456\u0442\u043a\u0438"},analysisSubMenu:"\u0410\u043d\u0430\u043b\u0456\u0437",physicsSubMenu:"\u0424\u0456\u0437\u0438\u043a\u0430",physics:{DailySolarRadiationHeatmap:"\u0429\u043e\u0434\u0435\u043d\u043d\u0430 \u043a\u0430\u0440\u0442\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u0457",SolarRadiationHeatmapOptions:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u043a\u0430\u0440\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u0457",SolarRadiationHeatmapGridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u0457",SolarRadiationHeatmapMaxValue:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0456",SolarRadiationHeatmapNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0457 \u043c\u043e\u0434\u0435\u043b\u0456",ReflectionHeatmap:"\u041a\u0430\u0440\u0442\u0430 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044c"},sensorSubMenu:"\u0414\u0430\u0442\u0447\u0438\u043a",sensor:{CollectDailyData:"\u0417\u0431\u0438\u0440\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0456 \u0434\u0430\u043d\u0456",CollectYearlyData:"\u0417\u0431\u0438\u0440\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0456 \u0434\u0430\u043d\u0456",SensorSimulationNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0434\u043b\u044f \u0437\u0431\u043e\u0440\u0443 \u0434\u0430\u043d\u0438\u0445 \u0434\u0430\u0442\u0447\u0438\u043a\u0430"},buildingSubMenu:"\u0411\u0443\u0434\u0456\u0432\u043b\u044f",building:{AnalyzeDailyBuildingEnergy:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0443 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",AnalyzeYearlyBuildingEnergy:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0443 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EnergyAnalysisOptions:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0430\u043d\u0430\u043b\u0456\u0437\u0443 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",EnergyGridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0441\u0456\u0442\u043a\u0438",BuildingEnergySimulationNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0441\u0438\u043c\u0443\u043b\u044e\u0432\u0430\u0442\u0438 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456"},solarPanelSubMenu:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c",solarPanel:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeVisibility:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u0456\u0441\u0442\u044c",PanelDiscretization:"\u0414\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0456\u044f \u043f\u0430\u043d\u0435\u043b\u0456",Exact:"\u0422\u043e\u0447\u043d\u0438\u0439",Approximate:"\u041d\u0430\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0439",EnergyGridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0441\u0456\u0442\u043a\u0438 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",VisibilityGridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0441\u0456\u0442\u043a\u0438 \u043a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0456",EnergyAnalysisOptions:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0430\u043d\u0430\u043b\u0456\u0437\u0443 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",VisibilityAnalysisOptions:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0430\u043d\u0430\u043b\u0456\u0437\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0456",SolarPanelSimulationNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u0457 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456"},parabolicTroughSubMenu:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",parabolicTrough:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434"},parabolicDishSubMenu:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0434\u0438\u0441\u043a",parabolicDish:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434"},fresnelReflectorSubMenu:"\u0412\u0456\u0434\u0431\u0438\u0432\u0430\u0447 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",fresnelReflector:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434"},heliostatSubMenu:"\u0413\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442",heliostat:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434"},solarUpdraftTowerSubMenu:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c",solarUpdraftTower:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",SolarUpdraftTowerSimulationNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0441\u0438\u043c\u0443\u043b\u044e\u0432\u0430\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0443 \u0432\u0435\u0436\u0443 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c"},tutorialsSubMenu:"\u041f\u043e\u0441\u0456\u0431\u043d\u0438\u043a\u0438",solarEnergyScienceSubMenu:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u043d\u0430\u0443\u043a\u0430",solarEnergyScienceTutorials:{SunAngles:"\u041a\u0443\u0442\u0438 \u0441\u043e\u043d\u0446\u044f \u0432\u0456\u0434\u043d\u043e\u0441\u043d\u043e \u0441\u043f\u043e\u0441\u0442\u0435\u0440\u0456\u0433\u0430\u0447\u0430 \u043d\u0430 \u0437\u0435\u043c\u043b\u0456",InsolationAndClimate:"\u0406\u043d\u0441\u043e\u043b\u044f\u0446\u0456\u044f \u0442\u0430 \u043a\u043b\u0456\u043c\u0430\u0442",SolarRadiationToBox:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u044f \u0432 \u043a\u043e\u0440\u043e\u0431\u043a\u0443"},buildingScienceSubMenu:"\u041d\u0430\u0443\u043a\u0430 \u043f\u0440\u043e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"\u0422\u0435\u043f\u043b\u043e\u0437\u0430\u0445\u0438\u0441\u043d\u0430 \u043e\u0431\u043e\u043b\u043e\u043d\u043a\u0430 \u043f\u0440\u043e\u0442\u0438 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c\u043d\u043e\u0457 \u043e\u0431\u043e\u043b\u043e\u043d\u043a\u0438",EffectOfSizeOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0440\u043e\u0437\u043c\u0456\u0440\u0443 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfOrientationOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0457 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfInsulationOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0456\u043d\u0441\u043e\u043b\u044f\u0446\u0456\u0457 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfRoofColorOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u043a\u043e\u043b\u044c\u043e\u0440\u0443 \u0434\u0430\u0445\u0443 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfEavesOverhangLengthOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0434\u043e\u0432\u0436\u0438\u043d\u0438 \u0432\u0438\u0441\u0442\u0443\u043f\u0443 \u043a\u0430\u0440\u043d\u0438\u0437\u0443 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfWindowSHGCOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u043a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043f\u043b\u043e\u0437\u0438\u0441\u043a\u0443 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfThermostatSetpointOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0437\u0430\u0434\u0430\u043d\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u043d\u0430 \u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u0456 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfSolarPanelsOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfGroundTemperatureOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u0433\u0440\u0443\u043d\u0442\u0443 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfTreesOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0434\u0435\u0440\u0435\u0432 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456"},buildingDesignSubMenu:"\u0414\u0438\u0437\u0430\u0439\u043d \u0431\u0443\u0434\u0456\u0432\u043b\u0456",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:'\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0441\u0442\u0438\u043b\u0456 \u041a\u0435\u0439\u043f \u041a\u043e\u0434 \u0437 \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0454\u043c \u0442\u0438\u043f\u0443 "\u0448\u0435\u0434-\u0434\u043e\u0440\u043c\u0435\u0440"',MansardRoofWithDormers:"\u041c\u0430\u043d\u0441\u0430\u0440\u0434\u0430 \u0437 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0438\u043c\u0438 \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u044f\u043c\u0438",GableRoofVsHipRoof:"\u0421\u0445\u0438\u043b\u043e\u0432\u0438\u0439 \u0434\u0430\u0445 \u043f\u0440\u043e\u0442\u0438 \u0434\u0432\u043e\u0441\u0445\u0438\u043b\u0438\u0445 \u0434\u0430\u0445\u0456\u0432",ColonialVsSaltbox:"\u041a\u043e\u043b\u043e\u043d\u0456\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u0442\u0438\u043b\u044c \u043f\u0440\u043e\u0442\u0438 \u0441\u0442\u0438\u043b\u044e Saltbox",GambrelRoofVsMansardRoof:"\u041f\u0456\u0432\u0448\u0430\u0440\u043e\u0432\u0438\u0439 \u0434\u0430\u0445 \u043f\u0440\u043e\u0442\u0438 \u043c\u0430\u043d\u0441\u0430\u0440\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0445\u0443",CombinationRoofVsBonnetRoof:"\u041a\u043e\u043c\u0431\u0456\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u0430\u0445 \u043f\u0440\u043e\u0442\u0438 \u043a\u0430\u043f\u043e\u0442\u043d\u043e\u0433\u043e \u0434\u0430\u0445\u0443",DutchGableRoof:"\u0413\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0434\u0430\u0445 \u0437 \u0440\u0438\u043a\u0435\u0442\u043e\u043c",GableAndValleyRoof:"\u0421\u0445\u0438\u043b\u043e\u0432\u0438\u0439 \u0442\u0430 \u0434\u043e\u043b\u0438\u043d\u043d\u0438\u0439 \u0434\u0430\u0445",ClerestoryRoof:"\u041a\u043b\u0435\u0440\u0435\u0441\u0442\u043e\u0440\u043d\u0438\u0439 \u0434\u0430\u0445",MonitorRoof:"\u041c\u043e\u043d\u0456\u0442\u043e\u0440\u043d\u0438\u0439 \u0434\u0430\u0445",AFrameHouse:'\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0444\u043e\u0440\u043c\u0456 \u043b\u0456\u0442\u0435\u0440\u0438 "\u0410"',HalfTimberedHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0437 \u043d\u0430\u043f\u0456\u0432\u0434\u0435\u0440\u0435\u0432'\u044f\u043d\u0438\u043c\u0438 \u0441\u0442\u0456\u043d\u0430\u043c\u0438",AllBasicRoofTypes:"\u0423\u0441\u0456 \u043e\u0441\u043d\u043e\u0432\u043d\u0456 \u0442\u0438\u043f\u0438 \u0434\u0430\u0445\u0456\u0432"},photovoltaicSolarPowerSubMenu:"\u0424\u043e\u0442\u043e\u0435\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u043d\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"\u0412\u043f\u043b\u0438\u0432 \u043a\u0443\u0442\u0430 \u043d\u0430\u0445\u0438\u043b\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",EffectOfAzimuthOfSolarPanel:"\u0412\u043f\u043b\u0438\u0432 \u0430\u0437\u0438\u043c\u0443\u0442\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",SolarPanelTypes:"\u0422\u0438\u043f\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",VerticalBifacialSolarPanels:"Vertical Bifacial Solar Panels",CompareMonofacialAndBifacialSolarPanels:"Monofacial vs. Bifacial Solar Panels",SolarTrackers:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u0442\u0440\u0435\u043a\u0435\u0440\u0438",CoveringGroundWithSolarPanels:"\u0427\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043a\u0440\u0438\u0442\u0442\u044f \u0437\u0435\u043c\u043b\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u044f\u043c\u0438 - \u043d\u0435 \u043d\u0430\u0439\u043a\u0440\u0430\u0449\u0430 \u0456\u0434\u0435\u044f",InterRowSpacingOfSolarPanelArray:"\u0412\u043f\u043b\u0438\u0432 \u043c\u0456\u0436\u0440\u044f\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0443 \u0432 \u043c\u0430\u0441\u0438\u0432\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",EffectOfOrientationOfSolarPanels:"\u0412\u043f\u043b\u0438\u0432 \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0457 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarPanelArrayAutomaticLayout:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0440\u043e\u0437\u043c\u0456\u0449\u0435\u043d\u043d\u044f \u043c\u0430\u0441\u0438\u0432\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439"},concentratedSolarPowerSubMenu:"\u041a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u043e\u0432\u0430\u043d\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"\u0412\u043f\u043b\u0438\u0432 \u0430\u0437\u0438\u043c\u0443\u0442\u0443 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430",EffectOfLatusRectumOfParabolicTrough:"\u0412\u043f\u043b\u0438\u0432 \u043f\u0440\u044f\u043c\u043e\u0457 \u043b\u0456\u043d\u0456\u0457 \u043d\u0430 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",FocusSunlightWithParabolicDish:"\u0424\u043e\u043a\u0443\u0441\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u0441\u0432\u0456\u0442\u043b\u0430 \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0443",LinearFresnelReflectors:"\u041b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"\u0412\u043f\u043b\u0438\u0432 \u0432\u0438\u0441\u043e\u0442\u0438 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u044e\u0447\u043e\u0457 \u0442\u0440\u0443\u0431\u043a\u0438 \u043d\u0430 \u043b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",EffectOfAzimuthOfLinearFresnelReflectors:"\u0412\u043f\u043b\u0438\u0432 \u0430\u0437\u0438\u043c\u0443\u0442\u0443 \u043d\u0430 \u043b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",LinearFresnelReflectorsWithTwoAbsorbers:"\u041b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u0437 \u0434\u0432\u043e\u043c\u0430 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u044e\u0447\u0438\u043c\u0438 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438",CosineEfficiencyOfHeliostats:"\u041a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432",ShadowingAndBlockingOfHeliostats:"\u0417\u0430\u0442\u0456\u043d\u0435\u043d\u043d\u044f \u0442\u0430 \u0431\u043b\u043e\u043a\u0443\u0432\u0430\u043d\u043d\u044f \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432",EffectSolarPowerTowerHeight:"\u0412\u043f\u043b\u0438\u0432 \u0432\u0438\u0441\u043e\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c",SolarPowerTower:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c"},otherTypesOfSolarPowerSubMenu:"\u0406\u043d\u0448\u0456 \u0442\u0438\u043f\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c"},generativeDesignSubMenu:"Generative Design",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Monofacial Solar Panel Array",BifacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Bifacial Solar Panel Array",OutputOfSolarPanelArrayInDifferentPlaces:"The Output of a Solar Panel Array in Different Places",SimpleSolarFarmParetoFront:"The Pareto Front for Designing a Simple Solar Farm"},examplesSubMenu:"\u041f\u0440\u0438\u043a\u043b\u0430\u0434\u0438",solarEnergySubMenu:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f",solarEnergyExamples:{SunBeamAndHeliodon:"\u041f\u0440\u043e\u043c\u0456\u043d\u044c \u0441\u043e\u043d\u0446\u044f \u0442\u0430 \u0433\u0435\u043b\u0456\u043e\u0434\u043e\u043d",RooftopSolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0434\u0430\u0445\u0443",NevadaSolarOneParabolicTroughArray:"\u041c\u0430\u0441\u0438\u0432 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0456\u0432 Nevada Solar One",TooeleParabolicDishArray:"\u041c\u0430\u0441\u0438\u0432 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0442\u0430\u0440\u0456\u043b\u043e\u043a Tooele",PS10SolarPowerTower:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0435\u0442\u0438\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 PS10",TucsonLinearFresnelReflectors:"\u041b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u0432 Tucson",SolarCanopyFormFactors:"\u0424\u043e\u0440\u043c\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u0437\u0438\u0440\u043a\u0456\u0432",SolarCanopyOverBleachers:"\u0421\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u0437\u0438\u0440\u043e\u043a \u043d\u0430\u0434 \u0442\u0440\u0438\u0431\u0443\u043d\u0430\u043c\u0438",SolarCanopyOverGarage:"\u0421\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u0437\u0438\u0440\u043e\u043a \u043d\u0430\u0434 \u0433\u0430\u0440\u0430\u0436\u0435\u043c",SolarBusStop:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u0430 \u0437\u0443\u043f\u0438\u043d\u043a\u0430",SolarFacadeTesla:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0444\u0430\u0441\u0430\u0434\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c Tesla",BuildingIntegratedPhotovoltaics:"\u0412\u0431\u0443\u0434\u043e\u0432\u0430\u043d\u0456 \u0444\u043e\u0442\u043e\u0435\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u043d\u0456 \u0441\u0438\u0441\u0442\u0435\u043c\u0438 \u0432 \u0431\u0443\u0434\u0456\u0432\u043b\u0456",Floatovoltaics:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u043f\u043b\u0430\u0432\u0443\u0447\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445",Agrivoltaics:"\u0410\u0433\u0440\u043e\u0432\u043e\u043b\u044c\u0442\u0430\u0457\u043a\u0430",VegetativeBuffer:"\u0412\u0435\u0433\u0435\u0442\u0430\u0442\u0438\u0432\u043d\u0430 \u0437\u043e\u043d\u0430",RainbowSwashSolarFarmBostonMA:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0444\u0435\u0440\u043c\u0430 Rainbow Swash \u0432 Boston, MA",MickeyMouseSolarFarmOrlandoFL:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0444\u0435\u0440\u043c\u0430 \u041c\u0456\u043a\u043a\u0456 \u041c\u0430\u0443\u0441\u0430 \u0432 Orlando, FL",SolarPanelsOverCanalBakersfieldCA:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430\u0434 \u043a\u0430\u043d\u0430\u043b\u043e\u043c \u0432 Bakersfield, CA",SolarNoiseBarrierLexingtonMA:"\u0421\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u0448\u0443\u043c\u043e\u0432\u0438\u0439 \u0431\u0430\u0440'\u0454\u0440 \u0432 Lexington, MA",HSATSolarTrackersRaleighNC:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u0442\u0440\u0435\u043a\u0435\u0440\u0438 \u0437 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u044e \u0432\u0456\u0441\u0441\u044e \u0432 Raleign, NC",AADATSolarTrackersLancasterCA:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u0442\u0440\u0435\u043a\u0435\u0440\u0438 \u0437 \u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u044e-\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u044e \u0432\u0456\u0441\u0441\u044e \u0432 Lancaster, CA",SolarUpdraftTowerInCity:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c \u0443 \u043c\u0456\u0441\u0442\u0456"},builtEnvironmentSubMenu:"\u0417\u0430\u0431\u0443\u0434\u043e\u0432\u0430\u043d\u0435 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0435",residentialBuildingsSubMenu:"\u0416\u0438\u0442\u043b\u043e\u0432\u0456 \u0431\u0443\u0434\u0456\u0432\u043b\u0456",residentialBuildingExamples:{ColonialHouse:"\u041a\u043e\u043b\u043e\u043d\u0456\u0430\u043b\u044c\u043d\u0438\u0439 \u0431\u0443\u0434\u0438\u043d\u043e\u043a",DutchColonialHouse:"\u0413\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043b\u043e\u043d\u0456\u0430\u043b\u044c\u043d\u0438\u0439 \u0431\u0443\u0434\u0438\u043d\u043e\u043a",TShapedHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0444\u043e\u0440\u043c\u0456 \u043b\u0456\u0442\u0435\u0440\u0438 \u0422",CapeCodHouseWithGarage:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0441\u0442\u0438\u043b\u0456 Cape Cod \u0437 \u0433\u0430\u0440\u0430\u0436\u0435\u043c",Solarium:"\u0421\u043e\u043b\u044f\u0440\u0456\u0439",Church1:"\u0426\u0435\u0440\u043a\u0432\u0430 1",Cathedral1:"\u0421\u043e\u0431\u043e\u0440 1",Cathedral2:"\u0421\u043e\u0431\u043e\u0440 2",Mosque1:"\u041c\u0435\u0447\u0435\u0442\u044c 1",AdobeTaosHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0437 \u0430\u0434\u043e\u0431\u0435 \u0432 \u0441\u0442\u0438\u043b\u0456 Taos",RanchHouse:"Ranch House",BonnetHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0432 \u0441\u0442\u0438\u043b\u0456 Bonnet",BarnStyleHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0441\u0442\u0438\u043b\u0456 \u0430\u043c\u0431\u0430\u0440\u0430",ModernHouse:"\u0421\u0443\u0447\u0430\u0441\u043d\u0438\u0439 \u0431\u0443\u0434\u0438\u043d\u043e\u043a",ButterflyRoofHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0437 \u043c\u0435\u0442\u0435\u043b\u0438\u043a\u043e\u0432\u0438\u043c \u0434\u0430\u0445\u043e\u043c"},commercialBuildingsSubMenu:"\u041a\u043e\u043c\u0435\u0440\u0446\u0456\u0439\u043d\u0456 \u0431\u0443\u0434\u0456\u0432\u043b\u0456",commercialBuildingExamples:{WhiteHouse:"\u0411\u0456\u043b\u0438\u0439 \u0414\u0456\u043c",BilimMersinTurkiye:"Bilim, Mersin, \u0422\u0443\u0440\u0435\u0447\u0447\u0438\u043d\u0430",SpanishStyleHotel:"\u0413\u043e\u0442\u0435\u043b\u044c \u0432 \u0456\u0441\u043f\u0430\u043d\u0441\u044c\u043a\u043e\u043c\u0443 \u0441\u0442\u0438\u043b\u0456",ApartmentBuilding:"\u0411\u0430\u0433\u0430\u0442\u043e\u043a\u0432\u0430\u0440\u0442\u0438\u0440\u043d\u0438\u0439 \u0431\u0443\u0434\u0438\u043d\u043e\u043a",OfficeBuilding:"\u041e\u0444\u0456\u0441\u043d\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f",Hotel:"\u0413\u043e\u0442\u0435\u043b\u044c"},buildingComplexesSubMenu:"\u0411\u0443\u0434\u0456\u0432\u0435\u043b\u044c\u043d\u0456 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0438",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"South Burlington High School, Vermont",MescaleroApacheSchoolNewMexico:"Mescalero Apache School, New Mexico"},urbanPlanningSubMenu:"\u041c\u0456\u0441\u044c\u043a\u0435 \u043f\u043b\u0430\u043d\u0443\u0432\u0430\u043d\u043d\u044f",urbanPlanningExamples:{Heatmap1:"\u0422\u0435\u043f\u043b\u043e\u0432\u0430 \u043a\u0430\u0440\u0442\u0430"},otherBuildingsSubMenu:"\u0406\u043d\u0448\u0456 \u0431\u0443\u0434\u0456\u0432\u043b\u0456",otherBuildingExamples:{Greenhouse:"\u0422\u0435\u043f\u043b\u0438\u0446\u044f",Pavilion:"\u041f\u0430\u0432\u0456\u043b\u044c\u0439\u043e\u043d \u0443 \u043f\u0430\u0440\u043a\u0443",OctagonalPagoda:"\u0412\u043e\u0441\u044c\u043c\u0438\u043a\u0443\u0442\u043d\u0430 \u043f\u0430\u0433\u043e\u0434\u0430",OceanFront:"\u0411\u0443\u0434\u0456\u0432\u043b\u044f \u0431\u0456\u043b\u044f \u043e\u043a\u0435\u0430\u043d\u0443",EgyptianPyramids:"\u0404\u0433\u0438\u043f\u0435\u0442\u0441\u044c\u043a\u0456 \u043f\u0456\u0440\u0430\u043c\u0456\u0434\u0438",MayanPyramid:"\u041f\u0456\u0440\u0430\u043c\u0456\u0434\u0430 \u041c\u0430\u044f",SiOSePol:"Si-O-Se-Pol",StackedCuboids:"\u0421\u0442\u0435\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438"},artificialIntelligenceSubMenu:"\u0428\u0442\u0443\u0447\u043d\u0438\u0439 \u0456\u043d\u0442\u0435\u043b\u0435\u043a\u0442",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f \u043a\u0443\u0442\u0430 \u043d\u0430\u0445\u0438\u043b\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",OptimizingTiltAnglesOfMultipleSolarPanelRows:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f \u043a\u0443\u0442\u0456\u0432 \u043d\u0430\u0445\u0438\u043b\u0443 \u0434\u0435\u043a\u0456\u043b\u044c\u043a\u043e\u0445 \u0440\u044f\u0434\u0456\u0432 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarFarmGenerativeDesign:"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0444\u0435\u0440\u043c\u0438",SolarFarmGenerativeDesignWithBlock:"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0444\u0435\u0440\u043c\u0438 \u0432 \u043f\u0440\u0438\u0441\u0443\u0442\u043d\u043e\u0441\u0442\u0456 \u043f\u0435\u0440\u0435\u0448\u043a\u043e\u0434\u0438",FitchburgSolarFarmGenerativeDesign:"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0444\u0435\u0440\u043c\u0438 \u0443 Fitchburg"},languageSubMenu:"\u041c\u043e\u0432\u0430",publicSubMenu:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u043e\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e",ModelsGallery:"\u0413\u0430\u043b\u0435\u0440\u0435\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439",ModelsMap:"\u041a\u0430\u0440\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439",AboutUs:"\u041f\u0440\u043e \u043d\u0430\u0441"},avatarMenu:{AccountSettings:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443",PrivacyStatementTitle:"User Privacy Protection Statement",PrivacyStatement:"\u041a\u043e\u043b\u0438 \u0432\u0438 \u0443\u0432\u0456\u0439\u0434\u0435\u0442\u0435, \u0432\u0430\u0448 Google ID \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0432\u0430\u0448\u043e\u0433\u043e \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443 Aladdin. \u0412 \u043d\u0430\u0448\u0456\u0439 \u0431\u0430\u0437\u0456 \u0434\u0430\u043d\u0438\u0445 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u0435 \u0432\u0438\u043f\u0430\u0434\u043a\u043e\u0432\u0438\u0439 \u0430\u043b\u0444\u0430\u0432\u0456\u0442\u043d\u043e-\u0446\u0438\u0444\u0440\u043e\u0432\u0438\u0439 \u0440\u044f\u0434\u043e\u043a \u044f\u043a \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f. \u041c\u0438 \u043d\u0456\u043a\u043e\u043b\u0438 \u043d\u0435 \u0437\u0431\u0438\u0440\u0430\u0454\u043c\u043e \u043e\u0441\u043e\u0431\u0438\u0441\u0442\u043e \u0456\u0434\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u043e\u0432\u0430\u043d\u0443 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u044e, \u0442\u0430\u043a\u0443 \u044f\u043a \u0432\u0430\u0448\u0435 \u0456\u043c'\u044f \u0430\u0431\u043e \u0435\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430 \u043f\u043e\u0448\u0442\u0430. \u0414\u043b\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0434\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u043e\u0457 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0457 \u043e\u0437\u043d\u0430\u0439\u043e\u043c\u0442\u0435\u0441\u044c \u0437 \u043d\u0430\u0448\u043e\u044e ",SignIn:"\u0423\u0432\u0456\u0439\u0442\u0438",SignOut:"\u0412\u0438\u0439\u0442\u0438",IfYouAreAStudent:"\u042f\u043a\u0449\u043e \u0432\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442"},skyMenu:{Axes:"\u0412\u0456\u0441\u0456",Theme:"\u0422\u0435\u043c\u0430\u0442\u0438\u043a\u0430",ThemeDefault:"\u0417\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c",ThemeDesert:"\u041f\u0443\u0441\u0442\u0435\u043b\u044f",ThemeDune:"\u0414\u044e\u043d\u0430",ThemeForest:"\u041b\u0456\u0441",ThemeGrassland:"\u0421\u0442\u0435\u043f",ThemeHill:"\u041f\u0430\u0433\u043e\u0440\u0431",ThemeLake:"\u041e\u0437\u0435\u0440\u043e",ThemeMountain:"\u0413\u043e\u0440\u0430",ThemeRural:"\u0421\u0456\u043b\u044c\u0441\u044c\u043a\u0430 \u043c\u0456\u0441\u0446\u0435\u0432\u0456\u0441\u0442\u044c",SunlightAttenuationCoefficientInAir:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u0437\u0430\u0442\u0443\u0445\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u0441\u0432\u0456\u0442\u043b\u0430 \u0443 \u043f\u043e\u0432\u0456\u0442\u0440\u0456",ConvectiveCoefficientOfAir:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u043a\u043e\u043d\u0432\u0435\u043a\u0446\u0456\u0457 \u043f\u043e\u0432\u0456\u0442\u0440\u044f",HighestTemperatureTimeInMinutes:"\u0427\u0430\u0441 \u043d\u0430\u0439\u0432\u0438\u0449\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 (\u0445\u0432\u0438\u043b\u0438\u043d\u0438)",SelectSunAnglesToShow:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043a\u0443\u0442\u0438 \u0441\u043e\u043d\u0446\u044f, \u044f\u043a\u0456 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0438",ShowAzimuthAngle:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0430\u0437\u0438\u043c\u0443\u0442\u043d\u0438\u0439 \u043a\u0443\u0442",ShowElevationAngle:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0432\u0438\u0441\u043e\u0442\u043d\u0438\u0439 \u043a\u0443\u0442",ShowZenithAngle:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0437\u0435\u043d\u0456\u0442\u043d\u0438\u0439 \u043a\u0443\u0442",DirectLightBrightnessAtNoon:"Direct Light Brightness at Noon",AmbientLightBrightnessAtNoon:"Ambient Light Brightness at Noon"},groundMenu:{MonthlyIrradianceLoss:"Monthly Irradiance Loss",Vegetation:"\u0420\u043e\u0441\u043b\u0438\u043d\u043d\u0456\u0441\u0442\u044c",LeafOutDay:"\u0414\u0435\u043d\u044c \u0440\u043e\u0437\u043f\u0443\u0441\u043a\u0430\u043d\u043d\u044f \u043b\u0438\u0441\u0442\u044f",LeafOffDay:"\u0414\u0435\u043d\u044c \u043e\u043f\u0430\u0434\u0430\u043d\u043d\u044f \u043b\u0438\u0441\u0442\u044f",Albedo:"\u0410\u043b\u044c\u0431\u0435\u0434\u043e",ImageOnGround:"\u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",WaterSurface:"\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u044f \u0432\u043e\u0434\u0438",RemoveAllUnlockedTrees:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0435\u0440\u0435\u0432\u0430",RemoveAllUnlockedFlowers:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0432\u0456\u0442\u0438",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedPeople:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043b\u044e\u0434\u0435\u0439",RemoveAllUnlockedFoundations:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0438",RemoveAllUnlockedCuboids:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438",DoYouReallyWantToRemoveAllPeople:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u043b\u044e\u0434\u0435\u0439, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",DoYouReallyWantToRemoveAllTrees:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0435\u0440\u0435\u0432\u0430, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",DoYouReallyWantToRemoveAllFlowers:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u0432\u0456\u0442\u0438, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",DoYouReallyWantToRemoveAllSolarPanels:"Do you really want to remove all the solar panels that are not locked",DoYouReallyWantToRemoveAllFoundations:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0438, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",DoYouReallyWantToRemoveAllCuboids:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",LockAllElements:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438",UnlockAllElements:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438"},labelSubMenu:{Label:"\u041c\u0456\u0442\u043a\u0430",LabelText:"\u0422\u0435\u043a\u0441\u0442 \u043c\u0456\u0442\u043a\u0438",LabelHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u043c\u0456\u0442\u043a\u0438",LabelSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043c\u0456\u0442\u043a\u0438",LabelFontSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443",LabelColor:"\u041a\u043e\u043b\u0456\u0440 \u043c\u0456\u0442\u043a\u0438",KeepShowingLabel:"\u0417\u0430\u043b\u0438\u0448\u0430\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u044e \u043c\u0456\u0442\u043a\u0443"},foundationMenu:{RemoveAllUnlockedSolarPanels:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",RemoveAllUnlockedParabolicTroughs:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438",RemoveAllUnlockedParabolicDishes:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0430\u043d\u0442\u0435\u043d\u0438",RemoveAllUnlockedFresnelReflectors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",RemoveAllUnlockedHeliostats:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438",RemoveAllUnlockedSensors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438",RemoveAllUnlockedLights:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043e\u0441\u0432\u0456\u0442\u043b\u044e\u0432\u0430\u043b\u044c\u043d\u0456 \u043f\u0440\u0438\u043b\u0430\u0434\u0438",RemoveAllUnlockedWalls:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u0442\u0456\u043d\u0438",RemoveAllUnlockedWindows:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0432\u0456\u043a\u043d\u0430",RemoveAllUnlockedDoors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0432\u0435\u0440\u0456",RemoveAllUnlockedPolygons:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",RemoveAllUnlockedHumans:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043b\u044e\u0434\u0435\u0439",RemoveAllUnlockedTrees:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0435\u0440\u0435\u0432\u0430",RemoveAllUnlockedFlowers:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0432\u0456\u0442\u0438",Racks:"\u0421\u0442\u0435\u043b\u0430\u0436\u0456",Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",SolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",SolarPanelArray:"Solar Panel Array",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",ParabolicTroughs:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",ParabolicDishes:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0430\u043d\u0442\u0435\u043d\u0438",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0430\u043d\u0442\u0435\u043d\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",FresnelReflectors:"\u0412\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Heliostats:"\u0413\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Sensors:"\u0414\u0430\u0442\u0447\u0438\u043a\u0438",DoYouReallyWantToRemoveAllSensorsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Lights:"\u0421\u0432\u0456\u0442\u0438\u043b\u044c\u043d\u0438\u043a\u0438",DoYouReallyWantToRemoveAllLightsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0432\u0456\u0442\u0438\u043b\u044c\u043d\u0438\u043a\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Walls:"\u0421\u0442\u0456\u043d\u0438",DoYouReallyWantToRemoveAllWallsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0442\u0456\u043d\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Windows:"\u0412\u0456\u043a\u043d\u0430",DoYouReallyWantToRemoveAllWindowsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Doors:"\u0414\u0432\u0435\u0440\u0456",DoYouReallyWantToRemoveAllDoorsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0432\u0435\u0440\u0456 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Polygons:"\u0411\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0438\u043a\u0438",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0431\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0438\u043a\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Humans:"\u041b\u044e\u0434\u0438",DoYouReallyWantToRemoveAllHumansOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u043b\u044e\u0434\u0435\u0439 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Trees:"\u0414\u0435\u0440\u0435\u0432\u0430",DoYouReallyWantToRemoveAllTreesOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Flowers:"\u041a\u0432\u0456\u0442\u0438",DoYouReallyWantToRemoveAllFlowersOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u0432\u0456\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",OnlyThisFoundation:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442",AllConnectedFoundations:"\u0412\u0441\u0456 \u043f\u043e\u0432\u2019\u044f\u0437\u0430\u043d\u0456 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0438",AllSelectedFoundations:"All Selected Foundations",AllFoundations:"\u0412\u0441\u0456 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0438",AddPolygon:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0431\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0438\u043a",SolarStructure:"\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443",GroupMaster:"\u0413\u0440\u0443\u043f\u043e\u0432\u0438\u0439 \u043c\u0430\u0439\u0441\u0442\u0435\u0440",LockAllElementsOnThisFoundation:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456",UnlockAllElementsOnThisFoundation:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456",GroundFloorRValue:"\u0422\u0435\u043f\u043b\u043e\u043f\u0440\u043e\u0432\u0456\u0434\u043d\u0456\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f \u0446\u043e\u043a\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u0443",OnlyThisGroundFloor:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u043e\u043a\u043e\u043b\u044c\u043d\u0438\u0439 \u043f\u043e\u0432\u0435\u0440\u0445",AllGroundFloors:"\u0412\u0441\u0456 \u0446\u043e\u043a\u043e\u043b\u044c\u043d\u0456 \u043f\u043e\u0432\u0435\u0440\u0445\u0438"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"\u0412\u0435\u0436\u0430 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430 \u0434\u043b\u044f \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432",ReceiverTowerPhysicalProperties:"\u0424\u0456\u0437\u0438\u0447\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u0432\u0435\u0436\u0456 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverTowerHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0432\u0435\u0436\u0456 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverTowerRadius:"\u0420\u0430\u0434\u0456\u0443\u0441 \u0432\u0435\u0436\u0456 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverAbsorptance:"\u041f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverOpticalEfficiency:"\u041e\u043f\u0442\u0438\u0447\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverThermalEfficiency:"\u0422\u0435\u043f\u043b\u043e\u0432\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"\u0422\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u0456\u0434 \u0434\u043b\u044f \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456\u0432 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",AbsorberPipePhysicalProperties:"\u0424\u0456\u0437\u0438\u0447\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u0442\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0442\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberApertureWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u043e\u0442\u0432\u043e\u0440\u0443 \u0442\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberPipePoleNumber:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043f\u043e\u043b\u044e\u0441\u0456\u0432 \u0434\u043b\u044f \u0442\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberAbsorptance:"\u0421\u0438\u043b\u0430 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberOpticalEfficiency:"\u041e\u043f\u0442\u0438\u0447\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u0447\u0430",AbsorberThermalEfficiency:"\u0422\u0435\u043f\u043b\u043e\u0432\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u0447\u0430"},solarUpdraftTowerMenu:{SolarUpdraftTower:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerPhysicalProperties:"\u0424\u0456\u0437\u0438\u0447\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerChimneyHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0434\u0438\u043c\u043e\u0432\u043e\u0457 \u0442\u0440\u0443\u0431\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerChimneyRadius:"\u0420\u0430\u0434\u0456\u0443\u0441 \u0434\u0438\u043c\u043e\u0432\u043e\u0457 \u0442\u0440\u0443\u0431\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerCollectorHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerCollectorRadius:"\u0420\u0430\u0434\u0456\u0443\u0441 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerCollectorTransmissivity:"\u041f\u0440\u043e\u043d\u0438\u043a\u043d\u0456\u0441\u0442\u044c \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerCollectorEmissivity:"\u0412\u0438\u043f\u0440\u043e\u043c\u0456\u043d\u044e\u0432\u0430\u043d\u0456\u0441\u0442\u044c \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerDischargeCoefficient:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u0432\u0438\u043a\u0438\u0434\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerTurbineEfficiency:"\u0415\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u0442\u0443\u0440\u0431\u0456\u043d\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c"},cuboidMenu:{Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",RemoveAllUnlockedSolarPanels:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",RemoveAllUnlockedSensors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438",RemoveAllUnlockedPolygons:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",RemoveAllUnlockedHumans:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043b\u044e\u0434\u0435\u0439",RemoveAllUnlockedTrees:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0435\u0440\u0435\u0432\u0430",RemoveAllUnlockedFlowers:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0432\u0456\u0442\u0438",Racks:"\u0421\u0442\u0456\u0439\u043a\u0438",SolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Sensors:"\u0421\u0435\u043d\u0441\u043e\u0440\u0438",DoYouReallyWantToRemoveAllSensorsOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Polygons:"\u041f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Humans:"\u041b\u044e\u0434\u0438",DoYouReallyWantToRemoveAllHumansOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u043b\u044e\u0434\u0435\u0439 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Trees:"\u0414\u0435\u0440\u0435\u0432\u0430",DoYouReallyWantToRemoveAllTreesOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Flowers:"\u041a\u0432\u0456\u0442\u0438",DoYouReallyWantToRemoveAllFlowersOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u0432\u0456\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",OnlyThisCuboid:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u043a\u0443\u0431\u043e\u0457\u0434",AllCuboidsOnSameSurface:"\u0423\u0441\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438 \u043d\u0430 \u043e\u0434\u043d\u0456\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",AllCuboidsAboveSameBase:"\u0423\u0441\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438 \u043d\u0430\u0434 \u0442\u0456\u0454\u044e \u0436 \u043e\u0441\u043d\u043e\u0432\u043e\u044e",AllSelectedCuboids:"All Selected Cuboids",AllCuboids:"\u0412\u0441\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438",OnlyThisSide:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430",AllSidesOfThisCuboid:"\u0412\u0441\u0456 \u0441\u0442\u043e\u0440\u043e\u043d\u0438 \u0446\u044c\u043e\u0433\u043e \u043a\u0443\u0431\u043e\u0457\u0434\u0430",AllSidesOfSelectedCuboids:"All Sides of Selected Cuboids",AllSidesOfAllCuboids:"\u0412\u0441\u0456 \u0441\u0442\u043e\u0440\u043e\u043d\u0438 \u0432\u0441\u0456\u0445 \u043a\u0443\u0431\u043e\u0457\u0434\u0456\u0432",AddPolygon:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u043e\u043b\u0456\u0433\u043e\u043d",Stackable:"\u0421\u0442\u0435\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u0435",GroupMaster:"\u041c\u0430\u0439\u0441\u0442\u0435\u0440 \u0433\u0440\u0443\u043f\u0438"},polygonMenu:{Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",TextBox:"\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u0435 \u043f\u043e\u043b\u0435",FontOutlineColor:"\u041a\u043e\u043b\u0456\u0440 \u043a\u043e\u043d\u0442\u0443\u0440\u0443 \u0448\u0440\u0438\u0444\u0442\u0443",FontOutlineWidth:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u0443 \u0448\u0440\u0438\u0444\u0442\u0443",FontStrokeColor:"\u041a\u043e\u043b\u0456\u0440 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0448\u0440\u0438\u0444\u0442\u0443",FontStrokeWidth:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0448\u0440\u0438\u0444\u0442\u0443",NoOutline:"\u0411\u0435\u0437 \u043a\u043e\u043d\u0442\u0443\u0440\u0443",Shiny:"\u0411\u043b\u0438\u0441\u043a\u0443\u0447\u0438\u0439",Filled:"\u0417\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u0438\u0439",FillTexture:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0437\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u043d\u044f",FillColor:"\u041a\u043e\u043b\u0456\u0440 \u0437\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u043d\u044f",Opacity:"\u041f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",LineColor:"\u041a\u043e\u043b\u0456\u0440 \u043b\u0456\u043d\u0456\u0457",LineWidth:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u043b\u0456\u043d\u0456\u0457",LineStyle:"\u0421\u0442\u0438\u043b\u044c \u043b\u0456\u043d\u0456\u0457",SolidLine:"\u0421\u0443\u0446\u0456\u043b\u044c\u043d\u0430 \u043b\u0456\u043d\u0456\u044f",DashedLine:"\u041f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u0430 \u043b\u0456\u043d\u0456\u044f",DottedLine:"\u0422\u043e\u0447\u043a\u043e\u0432\u0430 \u043b\u0456\u043d\u0456\u044f",InsertVertexBeforeIndex:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043f\u0435\u0440\u0435\u0434 \u0456\u043d\u0434\u0435\u043a\u0441\u043e\u043c",InsertVertexAfterIndex:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043f\u0456\u0441\u043b\u044f \u0456\u043d\u0434\u0435\u043a\u0441\u0443",DeleteVertex:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0443",OnlyThisPolygon:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u043f\u043e\u043b\u0456\u0433\u043e\u043d",AllPolygonsOnSurface:"\u0412\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438 \u043d\u0430 \u0446\u0456\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",AllPolygonsAboveFoundation:"\u0412\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438 \u0432\u0438\u0449\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0443",AllSelectedPolygons:"All Selected Polygons",AllPolygons:"\u0412\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",Layout:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f",SolarPanelArrayLayout:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarPanelArrayLayoutParametricDesign:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d",SolarPanelArrayLayoutGenerativeDesign:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439: \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d",SolarPanelArrayModel:"\u041c\u043e\u0434\u0435\u043b\u044c \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",SolarPanelArrayOrientation:"\u041e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u044f",SolarPanelArrayTiltAngle:"\u041a\u0443\u0442 \u043d\u0430\u0445\u0438\u043b\u0443",SolarPanelArrayRowWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u044f\u0434\u0443",SolarPanelArrayInterRowSpacing:"\u041c\u0456\u0436\u0440\u044f\u0434\u043a\u043e\u0432\u0438\u0439 \u0456\u043d\u0442\u0435\u0440\u0432\u0430\u043b",SolarPanelArrayRowSpacing:"Row Spacing",SolarPanelArrayRowAxis:"\u0412\u0456\u0441\u044c \u0440\u044f\u0434\u0443",SolarPanelArrayLeftRightRowAxis:"\u041d\u0430\u043b\u0456\u0432\u043e-\u041d\u0430\u043f\u0440\u0430\u0432\u043e (\u0432\u0456\u0434\u043d\u043e\u0441\u043d\u0435)",SolarPanelArrayUpDownRowAxis:"\u0412\u0433\u043e\u0440\u0443-\u0412\u043d\u0438\u0437 (\u0432\u0456\u0434\u043d\u043e\u0441\u043d\u0435)",SolarPanelArrayEastWestRowAxis:"\u0421\u0445\u0456\u0434-\u0417\u0430\u0445\u0456\u0434 (\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0435)",SolarPanelArrayNorthSouthRowAxis:"\u041f\u0456\u0432\u043d\u0456\u0447-\u041f\u0456\u0432\u0434\u0435\u043d\u044c (\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0435)",SolarPanelArrayMargin:"\u0412\u0456\u0434\u0441\u0442\u0443\u043f",SolarPanelArrayPoleHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430",SolarPanelArrayPoleSpacing:"\u0406\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u0456\u0436 \u0441\u0442\u043e\u0432\u043f\u0430\u043c\u0438",SolarPanelArrayTotalYearlyCost:"Total Cost",SolarPanelArrayTotalYearlyRevenue:"Total Revenue",SolarPanelArrayTotalYearlyYield:"Total Yield",SolarPanelArrayMeanYearlyYield:"Mean Yield",SolarPanelArrayYearlyProfit:"Profit",LayoutNotAcceptedCheckYourParameters:"\u0426\u0435 \u0440\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u043d\u0435 \u043f\u0440\u0438\u0439\u043c\u0430\u0454\u0442\u044c\u0441\u044f. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u043f\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0432\u0430\u0448\u0456 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438."},optimizationMenu:{Optimization:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f",Parameters:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438",Variables:"\u0417\u043c\u0456\u043d\u043d\u0456",Constants:"\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438",GeneticAlgorithm:"\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u043d\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c",GeneticAlgorithmSettings:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443",ParticleSwarmOptimization:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f \u0440\u043e\u0454\u043c \u0447\u0430\u0441\u0442\u0438\u043d\u043e\u043a",ParticleSwarmOptimizationSettings:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u0457 \u0440\u043e\u0454\u043c \u0447\u0430\u0441\u0442\u0438\u043d\u043e\u043a",SolarPanelTiltAngleOptimization:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f \u043a\u0443\u0442\u0430 \u043d\u0430\u0445\u0438\u043b\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarPanelArrayLayout:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",Generation:"\u041f\u043e\u043a\u043e\u043b\u0456\u043d\u043d\u044f",Gene:"\u0413\u0435\u043d",NormalizedVariables:"\u041d\u043e\u0440\u043c\u0430\u043b\u0456\u0437\u043e\u0432\u0430\u043d\u0456 \u0437\u043c\u0456\u043d\u043d\u0456",Objective:"\u0426\u0456\u043b\u044c",ObjectiveFunctionDailyTotalYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",ObjectiveFunctionYearlyTotalYield:"\u0429\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",ObjectiveFunctionDailyMeanYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0441\u0435\u0440\u0435\u0434\u043d\u0456\u0439 \u0434\u043e\u0445\u0456\u0434",ObjectiveFunctionYearlyMeanYield:"\u0429\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0441\u0435\u0440\u0435\u0434\u043d\u0456\u0439 \u0434\u043e\u0445\u0456\u0434",ObjectiveFunctionDailyProfit:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u043f\u0440\u0438\u0431\u0443\u0442\u043e\u043a",ObjectiveFunctionYearlyProfit:"\u0429\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u043f\u0440\u0438\u0431\u0443\u0442\u043e\u043a",GeneticAlgorithmSelectionMethod:"\u041c\u0435\u0442\u043e\u0434 \u0432\u0438\u0431\u043e\u0440\u0443 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443",RouletteWheel:"\u0412\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u043d\u0435 \u043a\u043e\u043b\u0435\u0441\u043e",Tournament:"\u0422\u0443\u0440\u043d\u0456\u0440",SearchMethod:"\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u0448\u0443\u043a\u0443",GlobalSearchUniformSelection:"\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0438\u0439 \u043f\u043e\u0448\u0443\u043a \u0437 \u043e\u0434\u043d\u043e\u0440\u0456\u0434\u043d\u0438\u043c \u0432\u0438\u0431\u043e\u0440\u043e\u043c",LocalSearchRandomOptimization:"\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0438\u0439 \u043f\u043e\u0448\u0443\u043a \u0432\u0438\u043f\u0430\u0434\u043a\u043e\u0432\u043e\u0457 \u043e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u0457",PopulationSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044f",MaximumGenerations:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043f\u043e\u043a\u043e\u043b\u0456\u043d\u044c",SelectionRate:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u0432\u0456\u0434\u0431\u043e\u0440\u0443",CrossoverRate:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u0441\u0445\u0440\u0435\u0449\u0443\u0432\u0430\u043d\u043d\u044f",MutationRate:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u043c\u0443\u0442\u0430\u0446\u0456\u0457",Step:"\u041a\u0440\u043e\u043a",SwarmSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0440\u043e\u044e",MaximumSteps:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043a\u0440\u043e\u043a\u0456\u0432",MaximumVelocity:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u0448\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c",InertiaWeight:"\u0412\u0430\u0433\u0430 \u0456\u043d\u0435\u0440\u0446\u0456\u0457",CognitiveCoefficient:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u043a\u043e\u0433\u043d\u0456\u0442\u0438\u0432\u043d\u043e\u0457 \u0444\u0443\u043d\u043a\u0446\u0456\u0457",SocialCoefficient:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u0441\u043e\u0446\u0456\u0430\u043b\u044c\u043d\u043e\u0457 \u0432\u0437\u0430\u0454\u043c\u043e\u0434\u0456\u0457",ConvergenceThreshold:"\u041f\u043e\u0440\u0456\u0433 \u0437\u0431\u0456\u0436\u043d\u043e\u0441\u0442\u0456 \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044f",LocalSearchRadius:"\u0420\u0430\u0434\u0456\u0443\u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0448\u0443\u043a\u0443",RowsPerRackRange:"\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u0440\u044f\u0434\u0456\u0432 \u043d\u0430 \u0441\u0442\u0435\u043b\u0430\u0436",TiltAngleRange:"\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u043a\u0443\u0442\u0430 \u043d\u0430\u0445\u0438\u043b\u0443",InterRowSpacingRange:"\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u043c\u0456\u0436\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0456\u0436\u043a\u0443",ClickTargetPolygonToActivate:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043d\u0430 \u0446\u0456\u043b\u044c\u043e\u0432\u0438\u0439 \u043f\u043e\u043b\u0456\u0433\u043e\u043d \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0456\u0457",ClickTargetFoundationToActivate:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043d\u0430 \u0446\u0456\u043b\u044c\u043e\u0432\u0438\u0439 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0456\u0457"},treeMenu:{ShowModel:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c",Flip:"\u041f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u0438",Type:"\u0422\u0438\u043f",Spread:"\u0420\u043e\u0437\u043f\u043e\u0432\u0441\u044e\u0434\u0436\u0435\u043d\u043d\u044f"},flowerMenu:{Flip:"\u041f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u0438",Type:"\u0422\u0438\u043f",Spread:"\u0420\u043e\u0437\u043f\u043e\u0432\u0441\u044e\u0434\u0436\u0435\u043d\u043d\u044f"},peopleMenu:{ChangePerson:"\u0417\u043c\u0456\u043d\u0438\u0442\u0438 \u043e\u0441\u043e\u0431\u0443",Flip:"\u041f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u0438",Observer:"\u0421\u043f\u043e\u0441\u0442\u0435\u0440\u0456\u0433\u0430\u0447",ViewFromThisPerson:"\u041f\u0435\u0440\u0435\u0433\u043b\u044f\u043d\u0443\u0442\u0438 \u0437 \u0446\u0456\u0454\u0457 \u043e\u0441\u043e\u0431\u0438"},lightMenu:{Color:"\u041a\u043e\u043b\u0456\u0440",Intensity:"\u0406\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u0456\u0441\u0442\u044c",Decay:"\u0417\u0430\u0442\u0443\u0445\u0430\u043d\u043d\u044f",MaximumDistance:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u0432\u0456\u0434\u0441\u0442\u0430\u043d\u044c",Inside:"\u0423\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0456"},solarCollectorMenu:{RelativeAzimuth:"\u0412\u0456\u0434\u043d\u043e\u0441\u043d\u0438\u0439 \u0430\u0437\u0438\u043c\u0443\u0442",Pole:"\u0421\u0442\u043e\u0432\u043f",PoleHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430",PoleRadius:"Pole Radius",ExtraPoleHeight:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0430 \u0432\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430",ExtraPoleHeightInAdditionToHalfWidth:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0430 \u0432\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430 \u043d\u0430 \u0434\u043e\u0434\u0430\u0442\u043e\u043a \u0434\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0438 \u0448\u0438\u0440\u0438\u043d\u0438",DrawSunBeam:"\u041d\u0430\u043c\u0430\u043b\u044e\u0432\u0430\u0442\u0438 \u043f\u0440\u043e\u043c\u0456\u043d\u044c \u0441\u043e\u043d\u0446\u044f"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"\u0412\u0456\u0434\u0431\u0438\u0432\u0430\u043d\u043d\u044f \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430",ReceiverAbsorptance:"\u041f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReflectorOpticalEfficiency:"\u041e\u043f\u0442\u0438\u0447\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430",ReceiverThermalEfficiency:"\u0422\u0435\u043f\u043b\u043e\u0432\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430"},solarPanelMenu:{InverterEfficiency:"Inverter Efficiency",InverterEfficiencyExplained:"The efficiency for converting direct current (DC) to alternating current (AC).",DcToAcSizeRatio:"DC-to-AC Size Ratio",DcToAcSizeRatioExplained:"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.",ChangePvModel:"\u0417\u043c\u0456\u043d\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c",Orientation:"\u041e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u044f",Portrait:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430",Landscape:"\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430",FrameColor:"\u041a\u043e\u043b\u0456\u0440 \u0440\u0430\u043c\u043a\u0438",Panels:"\u043f\u0430\u043d\u0435\u043b\u0456",PanelsWide:"\u043f\u0430\u043d\u0435\u043b\u0456 \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0456",PanelsLong:"\u043f\u0430\u043d\u0435\u043b\u0456 \u043f\u043e \u0434\u043e\u0432\u0436\u0438\u043d\u0456",TiltAngle:"\u041a\u0443\u0442 \u043d\u0430\u0445\u0438\u043b\u0443",SouthFacingIsPositive:"\u041f\u0456\u0432\u0434\u0435\u043d\u044c \u0432\u0432\u0430\u0436\u0430\u0454\u0442\u044c\u0441\u044f \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u0438\u043c",Tracker:"\u0422\u0440\u0435\u043a\u0435\u0440",SolarTrackerFollowsSun:"\u0422\u0440\u0435\u043a\u0435\u0440 \u0441\u043b\u0456\u0434\u043a\u0443\u0454 \u0437\u0430 \u0441\u043e\u043d\u0446\u0435\u043c \u0434\u043b\u044f \u0437\u0431\u0456\u043b\u044c\u0448\u0435\u043d\u043d\u044f \u0432\u0438\u0445\u043e\u0434\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439.",PoleSpacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u0441\u0442\u043e\u0432\u043f\u0430\u043c\u0438",NoTracker:"\u0411\u0435\u0437 \u0442\u0440\u0435\u043a\u0435\u0440\u0430",HorizontalSingleAxisTracker:"\u0422\u0440\u0435\u043a\u0435\u0440 \u0437 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u044e \u043e\u0434\u043d\u043e\u043e\u0441\u0435\u0432\u043e\u044e \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0454\u044e",VerticalSingleAxisTracker:"\u0422\u0440\u0435\u043a\u0435\u0440 \u0437 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u044e \u043e\u0434\u043d\u043e\u043e\u0441\u0435\u0432\u043e\u044e \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0454\u044e",AltazimuthDualAxisTracker:"\u0422\u0440\u0435\u043a\u0435\u0440 \u0437 \u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u043e-\u0430\u043b\u044c\u0442\u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u044e \u0434\u0432\u043e\u043e\u0441\u0435\u0432\u043e\u044e \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0454\u044e",OnlyThisSolarPanel:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c",AllSolarPanelsOnSurface:"\u0412\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u043e\u0434\u043d\u0456\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",AllSolarPanelsAboveFoundation:"\u0412\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430\u0434 \u043e\u0434\u043d\u0456\u0454\u044e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedSolarPanels:"All Selected Solar Panels",AllSolarPanels:"\u0412\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456"},pvModelPanel:{SolarPanelSpecs:"\u0422\u0435\u0445\u043d\u0456\u0447\u043d\u0456 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",Model:"\u041c\u043e\u0434\u0435\u043b\u044c",PanelSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043f\u0430\u043d\u0435\u043b\u0456",Cells:"\u041a\u043e\u043c\u0456\u0440\u043a\u0438",CellType:"\u0422\u0438\u043f \u043a\u043e\u043c\u0456\u0440\u043e\u043a",Monocrystalline:"\u041c\u043e\u043d\u043e\u043a\u0440\u0438\u0441\u0442\u0430\u043b\u0456\u0447\u043d\u0456",Polycrystalline:"\u041f\u043e\u043b\u0456\u043a\u0440\u0438\u0441\u0442\u0430\u043b\u0456\u0447\u043d\u0456",ThinFilm:"\u0422\u043e\u043d\u043a\u043e\u043f\u043b\u0456\u0432\u043a\u043e\u0432\u0456",Bifacial:"Bifacial",BifacialityFactor:"Bifaciality Factor",Black:"\u0427\u043e\u0440\u043d\u0438\u0439",Blue:"\u0421\u0438\u043d\u0456\u0439",ShadeTolerance:"\u0421\u0442\u0456\u0439\u043a\u0456\u0441\u0442\u044c \u0434\u043e \u0437\u0430\u0442\u0456\u043d\u0435\u043d\u043d\u044f",SolarCellEfficiency:"\u0415\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043a\u043e\u043c\u0456\u0440\u043a\u0438",NominalOperatingCellTemperature:"\u041d\u043e\u043c\u0456\u043d\u0430\u043b\u044c\u043d\u0430 \u0440\u043e\u0431\u043e\u0447\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043a\u043e\u043c\u0456\u0440\u043a\u0438",TemperatureCoefficientOfPmax:"\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0439 \u043a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 Pmax"},parabolicTroughMenu:{ModuleLength:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044f",Modules:"\u043c\u043e\u0434\u0443\u043b\u0456",ModulesLong:"\u043c\u043e\u0434\u0443\u043b\u0456\u0432 \u0443 \u0434\u043e\u0432\u0436\u0438\u043d\u0443",LatusRectum:"\u0412\u0435\u043b\u0438\u043a\u0430 \u043f\u0456\u0432\u0432\u0456\u0441\u044c",OnlyThisParabolicTrough:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",AllParabolicTroughsAboveFoundation:"\u0423\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438 \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedParabolicTroughs:"All Selected Parabolic Troughs",AllParabolicTroughs:"\u0423\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438"},fresnelReflectorMenu:{AbsorberPipe:"\u0422\u0440\u0443\u0431\u0430 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",SelectAbsorberToReflectSunlightTo:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u0447, \u0434\u043e \u044f\u043a\u043e\u0433\u043e \u0431\u0443\u0434\u0435 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0442\u0438\u0441\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0435 \u0441\u0432\u0456\u0442\u043b\u043e",ModuleLength:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044f",Modules:"\u043c\u043e\u0434\u0443\u043b\u0456",ModulesLong:"\u043c\u043e\u0434\u0443\u043b\u0456\u0432 \u0443 \u0434\u043e\u0432\u0436\u0438\u043d\u0443",OnlyThisFresnelReflector:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",AllFresnelReflectorsAboveFoundation:"\u0423\u0441\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedFresnelReflectors:"All Selected Fresnel Reflectors",AllFresnelReflectors:"\u0423\u0441\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f"},heliostatMenu:{Tower:"\u0412\u0435\u0436\u0430",SelectTowerToReflectSunlightTo:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u0432\u0435\u0436\u0443, \u0434\u043e \u044f\u043a\u043e\u0457 \u0431\u0443\u0434\u0435 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0442\u0438\u0441\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0435 \u0441\u0432\u0456\u0442\u043b\u043e",OnlyThisHeliostat:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442",AllHeliostatsAboveFoundation:"\u0423\u0441\u0456 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438 \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedHeliostats:"All Selected Heliostats",AllHeliostats:"\u0423\u0441\u0456 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438"},parabolicDishMenu:{ReceiverStructure:"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",CentralPole:"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u0442\u043e\u0432\u043f",CentralPoleWithTripod:"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u0442\u043e\u0432\u043f \u0437 \u0442\u0440\u0438\u043d\u043e\u0433\u043e\u044e",Quadrupod:"\u0427\u043e\u0442\u0438\u0440\u0438\u043d\u043e\u0433\u0430",RimDiameter:"\u0414\u0456\u0430\u043c\u0435\u0442\u0440 \u043e\u0431\u043e\u0434\u0443",LatusRectum:"\u0412\u0435\u043b\u0438\u043a\u0430 \u043f\u0456\u0432\u0432\u0456\u0441\u044c",ExtraPoleHeightInAdditionToRadius:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0430 \u0432\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430 \u043f\u043b\u044e\u0441 \u0440\u0430\u0434\u0456\u0443\u0441",OnlyThisParabolicDish:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0430 \u0442\u0430\u0440\u0456\u043b\u043a\u0430",AllParabolicDishesAboveFoundation:"\u0423\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0442\u0430\u0440\u0456\u043b\u043a\u0438 \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedParabolicDishes:"All Selected Parabolic Dishes",AllParabolicDishes:"\u0423\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0442\u0430\u0440\u0456\u043b\u043a\u0438"},wallMenu:{TextureDefault:"\u0422\u0438\u043f\u043e\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430",Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",SizeOfWall:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0441\u0442\u0456\u043d\u0438",OnlyThisWall:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u0441\u0442\u0456\u043d\u0430",AllConnectedWalls:"\u0412\u0441\u0456 \u043f\u043e\u0432'\u044f\u0437\u0430\u043d\u0456 \u0441\u0442\u0456\u043d\u0438",AllWallsAboveFoundation:"\u0412\u0441\u0456 \u0441\u0442\u0456\u043d\u0438 \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedWalls:"All Selected Walls",AllWalls:"\u0412\u0441\u0456 \u0441\u0442\u0456\u043d\u0438",Windows:"\u0412\u0456\u043a\u043d\u0430",LockAllWindows:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",UnlockAllWindows:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",RemoveAllUnlockedWindows:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0432\u0456\u043a\u043d\u0430",DoYouReallyWantToRemoveAllWindowsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",Doors:"\u0414\u0432\u0435\u0440\u0456",RemoveAllUnlockedDoors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0432\u0435\u0440\u0456",DoYouReallyWantToRemoveAllDoorsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0432\u0435\u0440\u0456 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",SolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",LockAllSolarPanels:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",UnlockAllSolarPanels:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",RemoveAllUnlockedSolarPanels:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",Sensors:"\u0414\u0430\u0442\u0447\u0438\u043a\u0438",LockAllSensors:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438",UnlockAllSensors:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438",RemoveAllUnlockedSensors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438",DoYouReallyWantToRemoveAllSensorsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",Lights:"\u041b\u0430\u043c\u043f\u0438",RemoveAllUnlockedLights:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043b\u0430\u043c\u043f\u0438",DoYouReallyWantToRemoveAllLightsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",LockAllPolygons:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",UnlockAllPolygons:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",RemoveAllUnlockedPolygons:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",WallStructure:"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0456\u043d\u0438",DefaultStructure:"\u0422\u0438\u043f\u043e\u0432\u0430",StudStructure:"\u0421\u0442\u0443\u0434",PillarStructure:"\u041f\u0456\u043b\u0430\u0440",Opacity:"\u041d\u0435\u043f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",StructureSpacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438",StructureWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438",StructureThickness:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438",StructureColor:"\u041a\u043e\u043b\u0456\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438",Color:"\u041a\u043e\u043b\u0456\u0440 \u0441\u0442\u0456\u043d\u0438",Height:"\u0412\u0438\u0441\u043e\u0442\u0430",Thickness:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430",Texture:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430",AllLightsOnWallInside:"\u0412\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u0432\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0456 \u0441\u0442\u0456\u043d\u0438",AllLightsOnWallOutside:"\u0412\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u0437\u0437\u043e\u0432\u043d\u0456 \u0441\u0442\u0456\u043d\u0438",Fill:"\u0417\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u043d\u044f",Full:"\u041f\u043e\u0432\u043d\u0435",Partial:"\u0427\u0430\u0441\u0442\u043a\u043e\u0432\u0435",Empty:"\u041f\u043e\u0440\u043e\u0436\u043d\u0454",OpenToOutside:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0435 \u043d\u0430 \u0437\u043e\u0432\u043d\u0456\u0448\u043d\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443",EavesLength:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430 \u043a\u0430\u0440\u043d\u0438\u0437\u0443",Parapet:"\u041f\u0435\u0440\u0438\u043b\u0430",ParapetColor:"\u041a\u043e\u043b\u0456\u0440 \u043f\u0435\u0440\u0438\u043b",ParapetTexture:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043f\u0435\u0440\u0438\u043b",ParapetHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u043f\u0435\u0440\u0438\u043b",CopingsHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u043f\u0430\u0440\u043a\u0430\u043d\u0443",CopingsWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u043f\u0430\u0440\u043a\u0430\u043d\u0443"},windowMenu:{OnlyThisWindow:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435 \u0432\u0456\u043a\u043d\u043e",AllWindowsOnSurface:"All Windows on the Same Surface",AllWindowsAboveFoundation:"\u0412\u0441\u0456 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430\u0434 \u043e\u0434\u043d\u0456\u0454\u044e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedWindows:"All Selected Windows",AllWindows:"\u0412\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",Width:"\u0428\u0438\u0440\u0438\u043d\u0430",Height:"\u0412\u0438\u0441\u043e\u0442\u0430",Setback:"Setback from Exterior Surface",RelativeToWallThickness:"Relative to wall thickness",Mullion:"\u0420\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u0438\u0439 \u0441\u0442\u043e\u0432\u043f\u0435\u0446\u044c",HorizontalMullion:"Horizontal Mullion",VerticalMullion:"Vertical Mullion",MullionWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u0432\u043f\u0446\u044f",HorizontalMullionSpacing:"Horizontal Mullion Spacing",VerticalMullionSpacing:"Vertical Mullion Spacing",MullionColor:"\u041a\u043e\u043b\u0456\u0440 \u0440\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u0432\u043f\u0446\u044f",Tint:"\u0412\u0456\u0434\u0442\u0456\u043d\u043e\u043a",Opacity:"\u041d\u0435\u043f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",SolarHeatGainCoefficient:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043f\u043b\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f (SHGC) = 1 - \u043d\u0435\u043f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",Shutter:"\u0416\u0430\u043b\u044e\u0437\u0456",LeftShutter:"\u041b\u0456\u0432\u0435 \u0436\u0430\u043b\u044e\u0437\u0456",RightShutter:"\u041f\u0440\u0430\u0432\u0435 \u0436\u0430\u043b\u044e\u0437\u0456",BothShutters:"\u041e\u0431\u0438\u0434\u0432\u0456 \u0436\u0430\u043b\u044e\u0437\u0456",ShutterWidth:"\u0412\u0456\u0434\u043d\u043e\u0441\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430",ShutterColor:"\u041a\u043e\u043b\u0456\u0440 \u0436\u0430\u043b\u044e\u0437\u0456",Frame:"\u0420\u0430\u043c\u043a\u0430",FrameWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u0430\u043c\u043a\u0438",SillWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u043f\u0456\u0434\u0432\u0456\u043a\u043e\u043d\u043d\u044f",Color:"\u041a\u043e\u043b\u0456\u0440 \u0440\u0430\u043c\u043a\u0438",WindowType:"\u0422\u0438\u043f \u0432\u0456\u043a\u043d\u0430",Default:"\u0422\u0438\u043f\u043e\u0432\u0435",Arched:"\u0410\u0440\u043a\u043e\u0432\u0435",Polygonal:"\u0411\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0435",Interior:"\u0406\u043d\u0442\u0435\u0440'\u0454\u0440",Empty:"\u041f\u043e\u0440\u043e\u0436\u043d\u0454"},roofMenu:{TextureDefault:"\u0422\u0438\u043f\u043e\u0432\u0435",Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",OnlyThisRoof:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0434\u0430\u0445",AllRoofsAboveFoundation:"\u0412\u0441\u0456 \u0434\u0430\u0445\u0438 \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedRoofs:"All Selected Roofs",AllRoofs:"\u0412\u0441\u0456 \u0434\u0430\u0445\u0438",OnlyThisCeiling:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u0441\u0442\u0435\u043b\u044f",AllCeilingsAboveFoundation:"\u0412\u0441\u0456 \u0441\u0442\u0435\u043b\u0456 \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllCeilings:"\u0412\u0441\u0456 \u0441\u0442\u0435\u043b\u0456",EavesOverhangLength:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430 \u0432\u0438\u0441\u0442\u0443\u043f\u0443 \u043a\u0430\u0440\u043d\u0438\u0437\u0443",RafterSpacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u0441\u0442\u0440\u043e\u043f\u0438\u043b\u0430\u043c\u0438",RafterWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043f\u0438\u043b\u0430",RafterThickness:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043f\u0438\u043b\u0430",RafterColor:"\u041a\u043e\u043b\u0456\u0440 \u0441\u0442\u0440\u043e\u043f\u0438\u043b\u0430",RoofColor:"\u041a\u043e\u043b\u0456\u0440 \u0434\u0430\u0445\u0443",RoofSideColor:"\u041a\u043e\u043b\u0456\u0440 \u0431\u043e\u043a\u043e\u0432\u043e\u0457 \u0447\u0430\u0441\u0442\u0438\u043d\u0438 \u0434\u0430\u0445\u0443",GlassTint:"\u041a\u043e\u043b\u0456\u0440 \u0441\u043a\u043b\u0430",Opacity:"\u041d\u0435\u043f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",RoofStructure:"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u0445\u0443",DefaultStructure:"\u0422\u0438\u043f\u043e\u0432\u0430",RafterStructure:"\u0421\u0442\u0440\u043e\u043f\u0438\u043b\u043e",GlassStructure:"\u0421\u043a\u043b\u043e",SolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",LockAllSolarPanels:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",UnlockAllSolarPanels:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",RemoveAllUnlockedSolarPanels:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0434\u0430\u0445\u0443",Windows:"\u0412\u0456\u043a\u043d\u0430",LockAllWindows:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",UnlockAllWindows:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",RemoveAllUnlockedWindows:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0432\u0456\u043a\u043d\u0430",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0434\u0430\u0445\u0443",Sensors:"\u0421\u0435\u043d\u0441\u043e\u0440\u0438",LockAllSensors:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438",UnlockAllSensors:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438",RemoveAllUnlockedSensors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0434\u0430\u0445\u0443",Lights:"\u041b\u0430\u043c\u043f\u0438",RemoveAllUnlockedLights:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043b\u0430\u043c\u043f\u0438",DoYouReallyWantToRemoveAllLightsOnThisRoof:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0434\u0430\u0445\u0443",AllLightsOnRoofInside:"\u0412\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u043d\u0430 \u0434\u0430\u0445\u0443 \u0432\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0456",AllLightsOnRoofOutside:"\u0412\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u043d\u0430 \u0434\u0430\u0445\u0443 \u0437\u0437\u043e\u0432\u043d\u0456",Rise:"\u041f\u0456\u0434\u043d\u0456\u043c\u0430\u043d\u043d\u044f",Ceiling:"\u0421\u0442\u0435\u043b\u044f",RoofRValue:"\u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f R \u0434\u043b\u044f \u0434\u0430\u0445\u0443",CeilingRValue:"\u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f R \u0434\u043b\u044f \u0441\u0442\u0435\u043b\u0456"},doorMenu:{TextureDefault:"\u0417\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c",Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",Texture11:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 11",Texture12:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 12",Texture13:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 13",Texture14:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 14",Texture15:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 15",Texture16:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 16",Texture17:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 17",OnlyThisDoor:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0456 \u0434\u0432\u0435\u0440\u0456",AllDoorsOnWall:"\u0412\u0441\u0456 \u0434\u0432\u0435\u0440\u0456 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",AllDoorsAboveFoundation:"\u0412\u0441\u0456 \u0434\u0432\u0435\u0440\u0456 \u043d\u0430\u0434 \u0442\u0438\u043c \u0441\u0430\u043c\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedDoors:"All Selected Doors",AllDoors:"\u0412\u0441\u0456 \u0434\u0432\u0435\u0440\u0456",DoorType:"\u0422\u0438\u043f \u0434\u0432\u0435\u0440\u0435\u0439",Default:"\u0417\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c",Arched:"\u0410\u0440\u043a\u043e\u0432\u0456",Filled:"\u0417\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u0456",FrameColor:"\u041a\u043e\u043b\u0456\u0440 \u0440\u0430\u043c\u043a\u0438",Interior:"\u0406\u043d\u0442\u0435\u0440'\u0454\u0440"},siteInfoPanel:{High:"\u0412\u0438\u0441\u043e\u043a\u043e",Low:"\u041d\u0438\u0437\u044c\u043a\u043e"},designInfoPanel:{NumberOfSelectedHeliostats:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0438\u0431\u0440\u0430\u043d\u0438\u0445 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432",NumberOfSelectedSolarPanels:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0438\u0431\u0440\u0430\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",ElectricityGeneratedDailyBySolarPanels:"\u0415\u043b\u0435\u043a\u0442\u0440\u0438\u043a\u0430, \u0449\u043e \u0433\u0435\u043d\u0435\u0440\u0443\u0454\u0442\u044c\u0441\u044f \u0449\u043e\u0434\u0435\u043d\u043d\u043e \u0446\u0438\u043c\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u044f\u043c\u0438",SceneDiameter:"\u0414\u0456\u0430\u043c\u0435\u0442\u0440 \u0441\u0446\u0435\u043d\u0438",BuildingArea:"\u041f\u043b\u043e\u0449\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u0456"},visualizationControlPanel:{ColorContrast:"\u041a\u043e\u043d\u0442\u0440\u0430\u0441\u0442 \u043a\u043e\u043b\u044c\u043e\u0440\u0443",FluxScale:"\u0428\u043a\u0430\u043b\u0430 \u043f\u043e\u0442\u043e\u043a\u0443",ClickUpOrDownArrowButtonsToChange:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0456 \u0441\u0442\u0440\u0456\u043b\u043a\u0430\u043c\u0438 \u0432\u0433\u043e\u0440\u0443 \u0430\u0431\u043e \u0432\u043d\u0438\u0437 \u0449\u043e\u0431 \u0437\u043c\u0456\u043d\u0438\u0442\u0438"},instructionPanel:{Rotate:"\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438",DragMouse:"\u041f\u0435\u0440\u0435\u0442\u044f\u0433\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e",Zoom:"\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043d\u043d\u044f",MouseWheelOrKeys:"\u041e\u0431\u0435\u0440\u0442\u0430\u0439\u0442\u0435 \u043a\u043e\u043b\u0435\u0441\u043e \u043c\u0438\u0448\u0456 \u0430\u0431\u043e \u043d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c Ctrl+[ \u0430\u0431\u043e Ctrl+]",MouseWheelOrKeysMac:"\u041e\u0431\u0435\u0440\u0442\u0430\u0439\u0442\u0435 \u043a\u043e\u043b\u0435\u0441\u043e \u043c\u0438\u0448\u0456 \u0430\u0431\u043e \u043d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u2318+[ \u0430\u0431\u043e \u2318+]",Pan:"\u041f\u0435\u0440\u0435\u043c\u0456\u0449\u0435\u043d\u043d\u044f",HoldCtrlDragMouse:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0456 \u0443\u0442\u0440\u0438\u043c\u0443\u0439\u0442\u0435 Ctrl, \u043f\u0435\u0440\u0435\u0442\u044f\u0433\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e",HoldMetaDragMouse:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0456 \u0443\u0442\u0440\u0438\u043c\u0443\u0439\u0442\u0435 \u2318, \u043f\u0435\u0440\u0435\u0442\u044f\u0433\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e",Enter2DMode:"\u0412\u0432\u0456\u0439\u0442\u0438 \u0432 2D \u0440\u0435\u0436\u0438\u043c",Exit2DMode:"\u0412\u0438\u0439\u0442\u0438 \u0437 2D \u0440\u0435\u0436\u0438\u043c\u0443",NavigationMode:"\u0420\u0435\u0436\u0438\u043c \u043d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u0457",EnableNavigation:"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438 \u043d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u044e",DisableNavigation:"\u0412\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u043d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u044e",MoveForwardBack:"\u0420\u0443\u0445\u0430\u0442\u0438\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434/\u043d\u0430\u0437\u0430\u0434",MoveForwardBackInstruction:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c W/S",MoveLeftRight:"\u0420\u0443\u0445\u0430\u0442\u0438\u0441\u044f \u0432\u043b\u0456\u0432\u043e/\u0432\u043f\u0440\u0430\u0432\u043e",MoveLeftRightInstruction:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c A/D",MoveUpDown:"\u0420\u0443\u0445\u0430\u0442\u0438\u0441\u044f \u0432\u0433\u043e\u0440\u0443/\u0432\u043d\u0438\u0437",MoveUpDownInstruction:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c Z/X",Turn:"\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438",TurnInstruction:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043a\u043b\u0430\u0432\u0456\u0448\u0456 \u0437\u0456 \u0441\u0442\u0440\u0456\u043b\u043a\u0430\u043c\u0438",ResetView:"\u0421\u043a\u0438\u043d\u0443\u0442\u0438",AutoRotate:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0438\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442",StartOrStop:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c F4, \u0449\u043e\u0431 \u043f\u043e\u0447\u0430\u0442\u0438 \u0430\u0431\u043e \u0437\u0443\u043f\u0438\u043d\u0438\u0442\u0438"},mapPanel:{ImageOnGround:"\u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0430 \u0437\u0435\u043c\u043b\u0456",WeatherStations:"\u041c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0456\u0457",WeatherStationsNote:"\u0412\u0438\u043c\u043a\u043d\u0456\u0442\u044c \u0446\u0435, \u0449\u043e\u0431 \u043f\u0440\u0438\u0441\u043a\u043e\u0440\u0438\u0442\u0438",Coordinates:"\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0438",Zoom:"\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043d\u043d\u044f"},visibilityPanel:{SolarPanelVisibility:"\u0412\u0438\u0434\u0438\u043c\u0456\u0441\u0442\u044c \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",Observer:"\u0421\u043f\u043e\u0441\u0442\u0435\u0440\u0456\u0433\u0430\u0447",VantagePoint:"\u0422\u043e\u0447\u043a\u0430 \u043e\u0433\u043b\u044f\u0434\u0443",ItemizedVisibilityByFields:"\u0420\u043e\u0437\u0433\u043e\u0440\u043d\u0443\u0442\u0438\u0439 \u0437\u0430 \u043f\u043e\u043b\u044f\u043c\u0438",TotalVisibility:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0430 \u0432\u0438\u0434\u0438\u043c\u0456\u0441\u0442\u044c"},sensorPanel:{LightSensor:"\u0414\u0430\u0442\u0447\u0438\u043a \u043e\u0441\u0432\u0456\u0442\u043b\u0435\u043d\u043e\u0441\u0442\u0456",WeatherDataFrom:"\u041c\u0435\u0442\u0435\u043e\u0434\u0430\u043d\u0456 \u0437"},buildingEnergyPanel:{DailyBuildingEnergy:"\u0429\u043e\u0434\u0435\u043d\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f \u0431\u0443\u0434\u0456\u0432\u043b\u0456",YearlyBuildingEnergy:"\u0420\u0456\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f \u0431\u0443\u0434\u0456\u0432\u043b\u0456",Heater:"\u041e\u0431\u0456\u0433\u0440\u0456\u0432\u0430\u0447",AC:"\u041a\u043e\u043d\u0434\u0438\u0446\u0456\u043e\u043d\u0435\u0440",SolarPanel:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c",Net:"\u0412\u0441\u044c\u043e\u0433\u043e"},solarPanelYieldPanel:{SolarPanelDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarPanelYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualSolarPanels:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",Profit:"\u041f\u0440\u0438\u0431\u0443\u0442\u043e\u043a",TotalCost:"Total Cost",TotalRevenue:"Total Revenue",TotalYield:"Total Yield",MeanYield:"Mean Yield",ModuleCount:"Module Count"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0456\u0432",ParabolicTroughYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0456\u0432",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualParabolicTroughs:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0456\u0432"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0442\u0430\u0440\u0456\u043b\u043e\u043a",ParabolicDishYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0442\u0430\u0440\u0456\u043b\u043e\u043a",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualParabolicDishes:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0442\u0430\u0440\u0456\u043b\u043e\u043a"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",FresnelReflectorYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualFresnelReflectors:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456\u0432 \u0424\u0440\u0435\u043d\u0435\u043b\u044f"},heliostatYieldPanel:{HeliostatDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0443",HeliostatYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0443",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualHeliostats:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456",UpdraftTowerYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456",ChimneyAirTemperature:"\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043f\u043e\u0432\u0456\u0442\u0440\u044f \u0443 \u0434\u0438\u043c\u043e\u0432\u0456\u0439 \u0442\u0440\u0443\u0431\u0456",ChimneyWindSpeed:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u0432\u0456\u0442\u0440\u0443 \u0443 \u0434\u0438\u043c\u043e\u0432\u0456\u0439 \u0442\u0440\u0443\u0431\u0456",Yield:"\u0434\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualUpdraftTowers:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u0432\u0435\u0436"},heliodonPanel:{SunAndTimeSettings:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0421\u043e\u043d\u0446\u044f \u0442\u0430 \u0427\u0430\u0441\u0443",SunAngles:"\u041a\u0443\u0442\u0438 \u0421\u043e\u043d\u0446\u044f",TwentyFourHours:"24 \u0413\u043e\u0434\u0438\u043d\u0438"},cloudFilePanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u043d\u0430\u0437\u0432\u043e\u044e",MyLikes:"\u041c\u043e\u0457 \u0432\u043f\u043e\u0434\u043e\u0431\u0430\u043d\u043d\u044f",MyCloudFiles:"\u041c\u043e\u0457 \u0444\u0430\u0439\u043b\u0438 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",GenerateLink:"\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f",LinkGeneratedInClipBoard:"\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u0431\u0443\u043b\u043e \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0442\u0430 \u0441\u043a\u043e\u043f\u0456\u0439\u043e\u0432\u0430\u043d\u043e \u0434\u043e \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0456\u043d\u0443",DoYouReallyWantToDelete:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"\u042f\u043a\u0449\u043e \u0446\u0435\u0439 \u0444\u0430\u0439\u043b \u0431\u0443\u043b\u043e \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u043e \u0430\u0431\u043e \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u043e, \u0437\u043c\u0456\u043d\u0430 \u0439\u043e\u0433\u043e \u043d\u0430\u0437\u0432\u0438 \u043f\u043e\u0440\u0443\u0448\u0438\u0442\u044c \u043d\u0430\u044f\u0432\u043d\u0456 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f"},projectListPanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u043d\u0430\u0437\u0432\u043e\u044e",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project was generated in the clip board",DoYouReallyWantToDeleteProject:"Do you really want to delete Project",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"If this project has been shared or published, renaming it breaks existing links"},projectPanel:{ProjectSettings:"Project Settings",ThumbnailImageSize:"Thumbnail Image Size",ProjectByOtherPeople:"Project by Other People",Project:"Project",ProjectType:"\u0422\u0438\u043f \u043f\u0440\u043e\u0454\u043a\u0442\u0443",ProjectDescription:"Description",MakeDescriptionEditable:"Make this description editable",MakeDescriptionNonEditable:"Make this description non-editable",DoubleClickToMakeDescriptionEditable:"Double-click to make this description editable",SolarPanelArray:"Solar Panel Array",CurateCurrentDesign:"Curate current design",UpdateSelectedDesign:"Update selected design",RemoveSelectedDesign:"Remove selected design",ClickToFlipSortingOrder:"Click to flip the sorting order",DesignNotShownInSolutionSpaceClickToShow:"This design is not shown in solution space; click to show",DesignShownInSolutionSpaceClickToHide:"This design is shown in solution space; click to hide",DistributionInSolutionSpace:"Distribution in the Solution Space",ChooseSolutionSpace:"Choose solution space",ChooseDataColoring:"Choose data coloring",SameColorForAllDesigns:"Same color for all designs",OneColorForEachDesign:"One color for each design",SolutionSpaceScreenshot:"Take a screenshot of the solution space",ScatteredPlotScreenshot:"Take a screenshot of the scattered plot",SingleClickToSelectDoubleClickToOpen:"Single-click to select, double-click to open.",SingleClickToDeselectDoubleClickToOpen:"Single-click to deselect, double-click to open.",GenerateScatteredPlot:"Generate Scattered Plot",SelectXAxis:"Select X Axis",SelectYAxis:"Select Y Axis"},accountSettingsPanel:{MyAccountSettings:"\u041c\u043e\u0457 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443",MyID:"\u041c\u043e\u0454 \ud83c\udd94",ClickToCopyMyID:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c, \u0449\u043e\u0431 \u0441\u043a\u043e\u043f\u0456\u044e\u0432\u0430\u0442\u0438 \u043c\u043e\u0454 ID",IDInClipBoard:"\u0412\u0430\u0448 ID \u0431\u0443\u043b\u043e \u0441\u043a\u043e\u043f\u0456\u0439\u043e\u0432\u0430\u043d\u0435 \u0456 \u0433\u043e\u0442\u043e\u0432\u0435 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438.",StoreMyNameInMyFilesWhenSaving:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043c\u043e\u0454 \u0456\u043c'\u044f \u0432 \u043c\u043e\u0457\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u043f\u0440\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u0456",DoYouReallyWantToShowYourNameInYourFiles:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u0438 \u0432\u0430\u0448\u0435 \u0456\u043c'\u044f \u0432 \u0444\u0430\u0439\u043b\u0430\u0445?",SignFileDisclaimer:"\u042f\u043a\u0449\u043e \u0442\u0430\u043a, \u0432\u0430\u0448\u0435 \u0456\u043c'\u044f \u0437\u043c\u043e\u0436\u0435 \u0431\u0430\u0447\u0438\u0442\u0438 \u0431\u0443\u0434\u044c-\u0445\u0442\u043e, \u0445\u0442\u043e \u043c\u0430\u0442\u0438\u043c\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0432\u0430\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u0456\u0432.",Likes:"\u0412\u043f\u043e\u0434\u043e\u0431\u0430\u043d\u043d\u044f",AllPublished:"\u0423\u0441\u0456 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0456",PublishedUnderAliases:"\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0456\u043c\u0438",UserCount:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432",SchoolID:"ID \u0428\u043a\u043e\u043b\u0438",ClassID:"ID \u041a\u043b\u0430\u0441\u0443"},weatherPanel:{SunshineHours:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u0433\u043e\u0434\u0438\u043d\u0438"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043d\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438",Sinusoidal:"\u0421\u0438\u043d\u0443\u0441\u043e\u0457\u0434\u0430\u043b\u044c\u043d\u0430"},economicsPanel:{EconomicsParameters:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0435\u043a\u043e\u043d\u043e\u043c\u0456\u043a\u0438",ElectricitySellingPrice:"\u0426\u0456\u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u0436\u0443 \u0435\u043b\u0435\u043a\u0442\u0440\u043e\u0435\u043d\u0435\u0440\u0433\u0456\u0457",OperationalCostPerUnit:"\u041e\u043f\u0435\u0440\u0430\u0446\u0456\u0439\u043d\u0456 \u0432\u0438\u0442\u0440\u0430\u0442\u0438 \u0437\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044e",SellingPrice:"Selling Price",UnitCost:"Unit Cost"},navigationPanel:{NavigationParameters:"Navigation Parameters",MinimumMoveSpeed:"Minimum Move Speed",MinimumTurnSpeed:"Minimum Turn Speed"},yearlyLightSensorPanel:{SkyClearness:"\u042f\u0441\u043d\u0456\u0441\u0442\u044c \u043d\u0435\u0431\u0430",ShowDaylightResults:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u0456\u0442\u043b\u0435\u043d\u043d\u044f",ShowSkyClearnessResults:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u044f\u0441\u043d\u043e\u0441\u0442\u0456 \u043d\u0435\u0431\u0430",ShowAverageDailySolarRadiation:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0441\u0435\u0440\u0435\u0434\u043d\u044e \u0449\u043e\u0434\u0435\u043d\u043d\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0443 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u044e"},analysisManager:{NoSensorForCollectingData:"\u041d\u0435\u043c\u0430\u0454 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0434\u043b\u044f \u0437\u0431\u043e\u0440\u0443 \u0434\u0430\u043d\u0438\u0445.",NoSolarPanelForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoObserverForVisibilityAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0441\u043f\u043e\u0441\u0442\u0435\u0440\u0456\u0433\u0430\u0447\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0456.",NoWaterHeaterForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0432\u043e\u0434\u043e\u043d\u0430\u0433\u0440\u0456\u0432\u0430\u0447\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoParabolicDishForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0457 \u0442\u0430\u0440\u0456\u043b\u043a\u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoParabolicTroughForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoFresnelReflectorForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoHeliostatForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoSolarUpdraftTowerForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoBuildingForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0431\u0443\u0434\u0456\u0432\u043b\u0456 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443."},toolbar:{CloudFile:"\u0425\u043c\u0430\u0440\u043d\u0438\u0439 \u0444\u0430\u0439\u043b",Select:"\u0412\u0438\u0431\u0440\u0430\u0442\u0438",AddFoundation:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442",AddWall:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0441\u0442\u0456\u043d\u0443",AddWindow:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0432\u0456\u043a\u043d\u043e",AddDoor:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u0432\u0435\u0440\u0456",AddPyramidRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u0456\u0440\u0430\u043c\u0456\u0434\u0430\u043b\u044c\u043d\u0438\u0439 \u0434\u0430\u0445",AddGableRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0448\u0430\u0442\u0440\u043e\u0432\u0438\u0439 \u0434\u0430\u0445",AddHipRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0447\u043e\u0442\u0438\u0440\u0438\u0445\u0438\u043b\u0438\u0439 \u0434\u0430\u0445",AddGambrelRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u0432\u043e\u0441\u0445\u0438\u043b\u0438\u0439 \u0434\u0430\u0445",AddMansardRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043c\u0430\u043d\u0441\u0430\u0440\u0434\u043d\u0438\u0439 \u0434\u0430\u0445",AddCuboid:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u0440\u044f\u043c\u043e\u043a\u0443\u0442\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0435\u043f\u0456\u043f\u0435\u0434",AddSensor:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u0430\u0442\u0447\u0438\u043a",AddSolarPanel:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0443 \u043f\u0430\u043d\u0435\u043b\u044c",AddWaterHeater:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0432\u043e\u0434\u043e\u043d\u0430\u0433\u0440\u0456\u0432\u0430\u0447",AddParabolicDish:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0443 \u0442\u0430\u0440\u0456\u043b\u043a\u0443",AddParabolicTrough:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",AddFresnelReflector:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",AddHeliostat:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442",AddWindTurbine:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0432\u0456\u0442\u0440\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440",AddLight:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0441\u0432\u0456\u0442\u043b\u043e",AddTree:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u0435\u0440\u0435\u0432\u043e",AddFlower:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043a\u0432\u0456\u0442\u043a\u0443",AddPeople:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043b\u044e\u0434\u0435\u0439",DoubleClickToLockThisModeForNextAction:"\u041f\u043e\u0434\u0432\u0456\u0439\u043d\u0435 \u043a\u043b\u0430\u0446\u0430\u043d\u043d\u044f, \u0449\u043e\u0431 \u0437\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457 \u0434\u0456\u0457",ClickToUnlockThisModeForNextAction:"\u041a\u043b\u0430\u0446\u043d\u0456\u0442\u044c, \u0449\u043e\u0431 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457 \u0434\u0456\u0457",ManipulateGroup:"\u041c\u0430\u043d\u0456\u043f\u0443\u043b\u044e\u0432\u0430\u0442\u0438 \u0433\u0440\u0443\u043f\u043e\u044e",ClearScene:"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0441\u0446\u0435\u043d\u0443",ShowSunAndTimeSettings:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0421\u043e\u043d\u0446\u044f \u0442\u0430 \u0427\u0430\u0441\u0443",SpatialAnalysisOfEnergy:"\u041f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432\u0438\u0439 \u0430\u043d\u0430\u043b\u0456\u0437 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",DoYouReallyWantToClearContent:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0432\u043c\u0456\u0441\u0442",ClickForMoreButtons:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0434\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0438\u0445 \u043a\u043d\u043e\u043f\u043e\u043a",SwitchToAddingFoundation:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0443",SwitchToAddingCuboid:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043f\u0440\u044f\u043c\u043e\u043a\u0443\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0435\u043f\u0456\u043f\u0435\u0434\u0443",SwitchToAddingWall:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0441\u0442\u0456\u043d\u0438",SwitchToAddingWindow:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0432\u0456\u043a\u043d\u0430",SwitchToAddingDoor:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0434\u0432\u0435\u0440\u0435\u0439",SwitchToAddingPyramidRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043f\u0456\u0440\u0430\u043c\u0456\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0430\u0445\u0443",SwitchToAddingGableRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0448\u0430\u0442\u0440\u043e\u0432\u043e\u0433\u043e \u0434\u0430\u0445\u0443",SwitchToAddingHipRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0447\u043e\u0442\u0438\u0440\u0438\u0445\u0438\u043b\u0438\u0439 \u0434\u0430\u0445\u0443",SwitchToAddingGambrelRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0434\u0432\u043e\u0441\u0445\u0438\u043b\u0438\u0439 \u0434\u0430\u0445\u0443",SwitchToAddingMansardRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043c\u0430\u043d\u0441\u0430\u0440\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0445\u0443",SwitchToAddingSolarPanel:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",SwitchToAddingSensor:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430",SwitchToAddingWaterHeater:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0432\u043e\u0434\u043e\u043d\u0430\u0433\u0440\u0456\u0432\u0430\u0447\u0430",SwitchToAddingParabolicDish:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0457 \u0442\u0430\u0440\u0456\u043b\u043a\u0438",SwitchToAddingParabolicTrough:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430",SwitchToAddingFresnelReflector:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",SwitchToAddingHeliostat:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0430",SwitchToAddingWindTurbine:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0432\u0456\u0442\u0440\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430",SwitchToAddingLight:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043e\u0441\u0432\u0456\u0442\u043b\u0435\u043d\u043d\u044f",SwitchToAddingTree:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0434\u0435\u0440\u0435\u0432\u0430",SwitchToAddingFlower:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043a\u0432\u0456\u0442\u043a\u0438",SwitchToAddingPeople:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043b\u044e\u0434\u0435\u0439"},tooltip:{gotoIFI:"\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043e \u0406\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u0443 \u0406\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u041c\u0430\u0439\u0431\u0443\u0442\u043d\u044c\u043e\u0433\u043e",visitAladdinHomePage:"\u0412\u0456\u0434\u0432\u0456\u0434\u0430\u0442\u0438 \u0434\u043e\u043c\u0430\u0448\u043d\u044e \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u0443 Aladdin",clickToOpenMenu:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0441\u0442\u044c, \u0449\u043e\u0431 \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0413\u043e\u043b\u043e\u0432\u043d\u0435 \u041c\u0435\u043d\u044e",clickToAccessAccountSettings:"Click to access account settings"},tree:{Apple:"\u042f\u0431\u043b\u0443\u043d\u044f",Birch:"\u0411\u0435\u0440\u0435\u0437\u0430",Coconut:"\u041a\u043e\u043a\u043e\u0441",Dogwood:"\u0414\u0435\u0440\u0435\u043d",Elm:"\u0412'\u044f\u0437",FanPalm:"\u0412\u0456\u044f\u043b\u044c\u043d\u0430 \u043f\u0430\u043b\u044c\u043c\u0430",Linden:"\u041b\u0438\u043f\u0430",Magnolia:"\u041c\u0430\u0433\u043d\u043e\u043b\u0456\u044f",Maple:"\u041a\u043b\u0435\u043d",Oak:"\u0414\u0443\u0431",Pine:"\u0421\u043e\u0441\u043d\u0430",Spruce:"\u042f\u043b\u0438\u043d\u0430"},flower:{Bellflower:"\u0414\u0437\u0432\u043e\u043d\u0438\u043a",Boxwood:"\u0421\u0430\u043c\u0448\u0438\u0442",CactusCombo1:"\u041a\u0430\u043a\u0442\u0443\u0441 \u041a\u043e\u043c\u0431\u043e 1",CactusCombo2:"\u041a\u0430\u043a\u0442\u0443\u0441 \u041a\u043e\u043c\u0431\u043e 2",CactusCombo3:"\u041a\u0430\u043a\u0442\u0443\u0441 \u041a\u043e\u043c\u0431\u043e 3",CactusCombo4:"\u041a\u0430\u043a\u0442\u0443\u0441 \u041a\u043e\u043c\u0431\u043e 4",Hibiscus:"\u0413\u0456\u0431\u0456\u0441\u043a\u0443\u0441",Hosta:"\u0413\u043e\u0441\u0442\u0430",Hydrangea:"\u0413\u043e\u0440\u0442\u0435\u043d\u0437\u0456\u044f",Peony:"\u041f\u0456\u0432\u043e\u043d\u0456\u044f",RedRose:"\u0427\u0435\u0440\u0432\u043e\u043d\u0430 \u0442\u0440\u043e\u044f\u043d\u0434\u0430",Spirea:"\u0421\u043f\u0456\u0440\u0435\u044f",Sunflower:"\u0421\u043e\u043d\u044f\u0448\u043d\u0438\u043a",TallBush:"\u0412\u0438\u0441\u043e\u043a\u0438\u0439 \u043a\u0443\u0449",Tulip:"\u0422\u044e\u043b\u044c\u043f\u0430\u043d",WhiteFlower:"\u0411\u0456\u043b\u0430 \u043a\u0432\u0456\u0442\u043a\u0430",YellowFlower:"\u0416\u043e\u0432\u0442\u0430 \u043a\u0432\u0456\u0442\u043a\u0430"},people:{Jaah:"\u0410\u0440\u0442\u0435\u043c",Jack:"\u0412\u0456\u0442\u0430\u043b\u0456\u0439",Jacob:"\u042f\u0440\u043e\u0441\u043b\u0430\u0432",Jacqueline:"\u041e\u043b\u0435\u043d\u0430",Jade:"\u041e\u043b\u044c\u0433\u0430",Jamelia:"\u041e\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430",James:"\u0410\u043d\u0434\u0440\u0456\u0439",Jane:"\u0412\u0456\u043a\u0442\u043e\u0440\u0456\u044f",Jaya:"\u0406\u0440\u0438\u043d\u0430",Jaye:"\u041d\u0430\u0437\u0430\u0440",Jeanette:"\u0421\u043e\u043b\u043e\u043c\u0456\u044f",Jedi:"\u0404\u0432\u0433\u0435\u043d",Jeff:"\u041f\u0430\u0432\u043b\u043e",Jena:"\u041b\u044e\u0431\u043e\u0432",Jennifer:"\u0422\u0435\u0442\u044f\u043d\u0430",Jess:"\u0417\u043b\u0430\u0442\u0430",Jett:"\u0421\u0435\u0440\u0433\u0456\u0439",Jill:"\u041d\u0430\u0434\u0456\u044f",Jiya:"\u041c\u0430\u0440\u0438\u043d\u0430",Joan:"\u0406\u0432\u0430\u043d\u043d\u0430",Jocelyn:"\u0410\u043d\u0430\u0441\u0442\u0430\u0441\u0456\u044f",Joel:"\u0412\u043e\u043b\u043e\u0434\u0438\u043c\u0438\u0440",Joey:"\u0412\u0435\u0440\u043e\u043d\u0456\u043a\u0430",John:"\u0406\u0432\u0430\u043d",Jonathon:"\u041f\u0435\u0442\u0440\u043e",Jose:"\u041c\u0438\u043a\u0438\u0442\u0430",Joseph:"\u0412\u0456\u043a\u0442\u043e\u0440",Joshua:"\u041c\u0438\u0445\u0430\u0439\u043b\u043e",Judd:"\u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432",Judy:"\u041c\u0430\u0440\u0456\u044f",Julia:"\u042e\u043b\u0456\u044f",Julio:"\u0414\u043c\u0438\u0442\u0440\u043e",Jumapili:"\u041c\u0430\u0440\u0442\u0430",June:"\u0410\u043d\u043d\u0430",Juro:"\u042e\u0440\u0456\u0439",Justin:"\u0411\u043e\u0433\u0434\u0430\u043d"},compass:{N:"\u041f\u043d",S:"\u041f\u0434",W:"\u0417x",E:"\u0421\u0445"},month:{January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"},modelsMap:{SearchByPublisher:"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u0432\u0438\u0440\u043e\u0431\u043d\u0438\u043a\u043e\u043c",SearchByLabel:"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u043c\u0456\u0442\u043a\u043e\u044e",MyPublishedModels:"\u041c\u043e\u0457 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0456 \u043c\u043e\u0434\u0435\u043b\u0456",TotalNumberOfUserPublishedModels:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0430 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u043c\u0438",SortFromOldestToNewest:"\u0421\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0432\u0456\u0434 \u043d\u0430\u0439\u0434\u0430\u0432\u043d\u0456\u0448\u0438\u0445 \u0434\u043e \u043d\u0430\u0439\u043d\u043e\u0432\u0456\u0448\u0438\u0445",SortFromNewestToOldest:"\u0421\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0432\u0456\u0434 \u043d\u0430\u0439\u043d\u043e\u0432\u0456\u0448\u0438\u0445 \u0434\u043e \u043d\u0430\u0439\u0434\u0430\u0432\u043d\u0456\u0448\u0438\u0445",ModelsFoundOnThisSite:"\u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456",ShowModelsPublishedByThisAuthor:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0456, \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0456 \u0446\u0438\u043c \u0430\u0432\u0442\u043e\u0440\u043e\u043c"}}}}});var S,j,H,z,R,D,M,W,I,C,O,F,k,Y,L,E,U,N,V,J,G,X,B,K,q,Q,Z,_,$,ee,te,le,ae,oe,ie,re,ne,ce,se,de,ue,fe,he,pe,ye,ge,me=A.a,we=l(272),xe=l.n(we),ve=l.p+"static/media/weather.b0a3f5ef.csv",be=l.p+"static/media/solar_radiation_horizontal.38eaf9ed.csv",Ae=l.p+"static/media/solar_radiation_vertical.522681a8.csv",Te=l.p+"static/media/pvmodules.3e173704.csv",Pe=l(71),Se=l(24),je=l(412),He=l(11),ze=l(40),Re=l(15),De=l(16),Me=l(3),We={type:"change"},Ie={type:"start"},Ce={type:"end"},Oe=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a){var o;Object(He.a)(this,l),o=t.call(this),void 0===a&&console.warn('THREE.OrbitControls: The second parameter "domElement" is now mandatory.'),a===document&&console.error('THREE.OrbitControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.'),o.object=e,o.domElement=a,o.domElement.style.touchAction="none",o.enabled=!0,o.target=new Me.Vector3,o.minDistance=0,o.maxDistance=1/0,o.minZoom=0,o.maxZoom=1/0,o.minPolarAngle=0,o.maxPolarAngle=Math.PI,o.minAzimuthAngle=-1/0,o.maxAzimuthAngle=1/0,o.enableDamping=!1,o.dampingFactor=.05,o.enableZoom=!0,o.zoomSpeed=1,o.enableRotate=!0,o.rotateSpeed=1,o.enablePan=!0,o.panSpeed=1,o.screenSpacePanning=!0,o.keyPanSpeed=7,o.autoRotate=!1,o.autoRotateSpeed=2,o.moveSpeed=1,o.turnSpeed=1,o.keys={MOVE_LEFT:"KeyA",MOVE_RIGHT:"KeyD",MOVE_FORWARD:"KeyW",MOVE_BACKWARD:"KeyS",MOVE_UP:"KeyZ",MOVE_DOWN:"KeyX",ROTATE_LEFT:"ArrowLeft",ROTATE_UP:"ArrowUp",ROTATE_RIGHT:"ArrowRight",ROTATE_DOWN:"ArrowDown"},o.mouseButtons={LEFT:Me.MOUSE.ROTATE,MIDDLE:Me.MOUSE.DOLLY,RIGHT:Me.MOUSE.PAN},o.touches={ONE:Me.TOUCH.ROTATE,TWO:Me.TOUCH.DOLLY_PAN},o.target0=o.target.clone(),o.position0=o.object.position.clone(),o.zoom0=o.object.zoom,o._domElementKeyEvents=null,o.getPolarAngle=function(){return s.phi},o.getAzimuthalAngle=function(){return s.theta},o.getDistance=function(){return this.object.position.distanceTo(this.target)},o.listenToKeyEvents=function(e){e.addEventListener("keydown",$),this._domElementKeyEvents=e,S=!1,j=0},o.removeKeyEvents=function(){null!==i._domElementKeyEvents&&i._domElementKeyEvents.removeEventListener("keydown",$)},o.saveState=function(){i.target0.copy(i.target),i.position0.copy(i.object.position),i.zoom0=i.object.zoom},o.reset=function(){i.target.copy(i.target0),i.object.position.copy(i.position0),i.object.zoom=i.zoom0,i.object.updateProjectionMatrix(),i.dispatchEvent(We),i.update(),n=r.NONE},o.update=function(){var t=new Me.Vector3,l=(new Me.Quaternion).setFromUnitVectors(e.up,new Me.Vector3(0,1,0)),a=l.clone().invert(),o=new Me.Vector3,p=new Me.Quaternion,y=2*Math.PI;return function(){var e=i.object.position;t.copy(e).sub(i.target),t.applyQuaternion(l),s.setFromVector3(t),i.autoRotate&&n===r.NONE&&z(2*Math.PI/60/60*i.autoRotateSpeed),i.enableDamping?(s.theta+=d.theta*i.dampingFactor,s.phi+=d.phi*i.dampingFactor):(s.theta+=d.theta,s.phi+=d.phi);var g=i.minAzimuthAngle,m=i.maxAzimuthAngle;return isFinite(g)&&isFinite(m)&&(g<-Math.PI?g+=y:g>Math.PI&&(g-=y),m<-Math.PI?m+=y:m>Math.PI&&(m-=y),s.theta=g<=m?Math.max(g,Math.min(m,s.theta)):s.theta>(g+m)/2?Math.max(g,s.theta):Math.min(m,s.theta)),s.phi=Math.max(i.minPolarAngle,Math.min(i.maxPolarAngle,s.phi)),s.makeSafe(),s.radius*=u,s.radius=Math.max(i.minDistance,Math.min(i.maxDistance,s.radius)),!0===i.enableDamping?i.target.addScaledVector(f,i.dampingFactor):i.target.add(f),t.setFromSpherical(s),t.applyQuaternion(a),e.copy(i.target).add(t),i.object.lookAt(i.target),!0===i.enableDamping?(d.theta*=1-i.dampingFactor,d.phi*=1-i.dampingFactor,f.multiplyScalar(1-i.dampingFactor)):(d.set(0,0,0),f.set(0,0,0)),u=1,!!(h||o.distanceToSquared(i.object.position)>c||8*(1-p.dot(i.object.quaternion))>c)&&(i.dispatchEvent(We),o.copy(i.object.position),p.copy(i.object.quaternion),h=!1,!0)}}(),o.dispose=function(){i.domElement.removeEventListener("contextmenu",ee),i.domElement.removeEventListener("pointerdown",K),i.domElement.removeEventListener("pointercancel",Z),i.domElement.removeEventListener("wheel",_),i.domElement.removeEventListener("pointermove",q),i.domElement.removeEventListener("pointerup",Q),null!==i._domElementKeyEvents&&i._domElementKeyEvents.removeEventListener("keydown",$)};var i=Object(ze.a)(o),r={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},n=r.NONE,c=1e-6,s=new Me.Spherical,d=new Me.Spherical,u=1,f=new Me.Vector3,h=!1,p=new Me.Vector2,y=new Me.Vector2,g=new Me.Vector2,m=new Me.Vector2,w=new Me.Vector2,x=new Me.Vector2,v=new Me.Vector2,b=new Me.Vector2,A=new Me.Vector2,T=[],P={},S=!1,j=0;function H(){return Math.pow(.95,i.zoomSpeed)}function z(e){d.theta-=e}function R(e){d.phi-=e}var D=function(){var e=new Me.Vector3;return function(t,l){e.setFromMatrixColumn(l,0),e.multiplyScalar(-t),f.add(e)}}(),M=function(){var e=new Me.Vector3;return function(t,l){!0===i.screenSpacePanning?e.setFromMatrixColumn(l,1):(e.setFromMatrixColumn(l,0),e.crossVectors(i.object.up,e)),e.multiplyScalar(t),f.add(e)}}(),W=function(){var e=new Me.Vector3;return function(t,l){var a=i.domElement;if(i.object.isPerspectiveCamera){var o=i.object.position;e.copy(o).sub(i.target);var r=e.length();r*=Math.tan(i.object.fov/2*Math.PI/180),D(2*t*r/a.clientHeight,i.object.matrix),M(2*l*r/a.clientHeight,i.object.matrix)}else i.object.isOrthographicCamera?(D(t*(i.object.right-i.object.left)/i.object.zoom/a.clientWidth,i.object.matrix),M(l*(i.object.top-i.object.bottom)/i.object.zoom/a.clientHeight,i.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),i.enablePan=!1)}}(),I=function(){var e=new Me.Vector3;return function(t){var l=i.object;e.setFromMatrixColumn(l.matrix,1),e.multiplyScalar(.1*t),l.position.add(e),l.position.z=Math.max(0,l.position.z),i.dispatchEvent(We),i.dispatchEvent(Ce)}}(),C=function(){var e=new Me.Vector3;return function(t){var l=i.object;e.setFromMatrixColumn(l.matrix,0),e.crossVectors(l.up,e),e.multiplyScalar(.1*t),l.position.add(e),i.dispatchEvent(We),i.dispatchEvent(Ce)}}(),O=function(){var e=new Me.Vector3;return function(t){var l=i.object;e.setFromMatrixColumn(l.matrix,0),e.multiplyScalar(.1*t),l.position.add(e),i.dispatchEvent(We),i.dispatchEvent(Ce)}}(),F=function(){var e=new Me.Euler(0,0,0,"ZXY");return function(t){var l=i.object;e.setFromQuaternion(l.quaternion),Math.abs(Math.abs(e.z-j)-Math.PI)<.01&&(S=!S),S?e.x-=.01*t:e.x+=.01*t,e.x=Math.max(.1,e.x),j=e.z,l.quaternion.setFromEuler(e),i.dispatchEvent(We),i.dispatchEvent(Ce)}}(),k=function(){var e=new Me.Euler(0,0,0,"ZXY");return function(t){var l=i.object;e.setFromQuaternion(l.quaternion),e.z-=.01*t,l.quaternion.setFromEuler(e),i.dispatchEvent(We),i.dispatchEvent(Ce)}}();function Y(e){i.object.isPerspectiveCamera?u/=e:i.object.isOrthographicCamera?(i.object.zoom=Math.max(i.minZoom,Math.min(i.maxZoom,i.object.zoom*e)),i.object.updateProjectionMatrix(),h=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),i.enableZoom=!1)}function L(e){i.object.isPerspectiveCamera?u*=e:i.object.isOrthographicCamera?(i.object.zoom=Math.max(i.minZoom,Math.min(i.maxZoom,i.object.zoom/e)),i.object.updateProjectionMatrix(),h=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),i.enableZoom=!1)}function E(e){p.set(e.clientX,e.clientY)}function U(e){m.set(e.clientX,e.clientY)}function N(){if(1===T.length)p.set(T[0].pageX,T[0].pageY);else{var e=.5*(T[0].pageX+T[1].pageX),t=.5*(T[0].pageY+T[1].pageY);p.set(e,t)}}function V(){if(1===T.length)m.set(T[0].pageX,T[0].pageY);else{var e=.5*(T[0].pageX+T[1].pageX),t=.5*(T[0].pageY+T[1].pageY);m.set(e,t)}}function J(){var e=T[0].pageX-T[1].pageX,t=T[0].pageY-T[1].pageY,l=Math.sqrt(e*e+t*t);v.set(0,l)}function G(e){if(1===T.length)y.set(e.pageX,e.pageY);else{var t=ae(e),l=.5*(e.pageX+t.x),a=.5*(e.pageY+t.y);y.set(l,a)}g.subVectors(y,p).multiplyScalar(i.rotateSpeed);var o=i.domElement;z(2*Math.PI*g.x/o.clientHeight),R(2*Math.PI*g.y/o.clientHeight),p.copy(y)}function X(e){if(1===T.length)w.set(e.pageX,e.pageY);else{var t=ae(e),l=.5*(e.pageX+t.x),a=.5*(e.pageY+t.y);w.set(l,a)}x.subVectors(w,m).multiplyScalar(i.panSpeed),W(x.x,x.y),m.copy(w)}function B(e){var t=ae(e),l=e.pageX-t.x,a=e.pageY-t.y,o=Math.sqrt(l*l+a*a);b.set(0,o),A.set(0,Math.pow(b.y/v.y,i.zoomSpeed)),Y(A.y),v.copy(b)}function K(e){!1!==i.enabled&&(0===T.length&&(i.domElement.setPointerCapture(e.pointerId),i.domElement.addEventListener("pointermove",q),i.domElement.addEventListener("pointerup",Q)),function(e){T.push(e)}(e),"touch"===e.pointerType?function(e){switch(le(e),T.length){case 1:switch(i.touches.ONE){case Me.TOUCH.ROTATE:if(!1===i.enableRotate)return;N(),n=r.TOUCH_ROTATE;break;case Me.TOUCH.PAN:if(!1===i.enablePan)return;V(),n=r.TOUCH_PAN;break;default:n=r.NONE}break;case 2:switch(i.touches.TWO){case Me.TOUCH.DOLLY_PAN:if(!1===i.enableZoom&&!1===i.enablePan)return;i.enableZoom&&J(),i.enablePan&&V(),n=r.TOUCH_DOLLY_PAN;break;case Me.TOUCH.DOLLY_ROTATE:if(!1===i.enableZoom&&!1===i.enableRotate)return;i.enableZoom&&J(),i.enableRotate&&N(),n=r.TOUCH_DOLLY_ROTATE;break;default:n=r.NONE}break;default:n=r.NONE}n!==r.NONE&&i.dispatchEvent(Ie)}(e):function(e){var t;switch(e.button){case 0:t=i.mouseButtons.LEFT;break;case 1:t=i.mouseButtons.MIDDLE;break;case 2:t=i.mouseButtons.RIGHT;break;default:t=-1}switch(t){case Me.MOUSE.DOLLY:if(!1===i.enableZoom)return;!function(e){v.set(e.clientX,e.clientY)}(e),n=r.DOLLY;break;case Me.MOUSE.ROTATE:if(i.object.isOrthographicCamera){if(!1===i.enablePan)return;U(e),n=r.PAN}else if(e.ctrlKey||e.metaKey){if(!1===i.enablePan)return;U(e),n=r.PAN}else{if(!1===i.enableRotate)return;E(e),n=r.ROTATE}break;case Me.MOUSE.PAN:if(e.ctrlKey||e.metaKey){if(!1===i.enableRotate)return;E(e),n=r.ROTATE}else{if(!1===i.enablePan)return;U(e),n=r.PAN}break;default:n=r.NONE}n!==r.NONE&&i.dispatchEvent(Ie)}(e))}function q(e){!1!==i.enabled&&("touch"===e.pointerType?function(e){switch(le(e),n){case r.TOUCH_ROTATE:if(!1===i.enableRotate)return;G(e),i.update();break;case r.TOUCH_PAN:if(!1===i.enablePan)return;X(e),i.update();break;case r.TOUCH_DOLLY_PAN:if(!1===i.enableZoom&&!1===i.enablePan)return;!function(e){i.enableZoom&&B(e),i.enablePan&&X(e)}(e),i.update();break;case r.TOUCH_DOLLY_ROTATE:if(!1===i.enableZoom&&!1===i.enableRotate)return;!function(e){i.enableZoom&&B(e),i.enableRotate&&G(e)}(e),i.update();break;default:n=r.NONE}}(e):function(e){if(!1===i.enabled)return;switch(n){case r.ROTATE:if(!1===i.enableRotate)return;!function(e){y.set(e.clientX,e.clientY),g.subVectors(y,p).multiplyScalar(i.rotateSpeed);var t=i.domElement;z(2*Math.PI*g.x/t.clientHeight),R(2*Math.PI*g.y/t.clientHeight),p.copy(y),i.update()}(e);break;case r.DOLLY:if(!1===i.enableZoom)return;!function(e){b.set(e.clientX,e.clientY),A.subVectors(b,v),A.y>0?Y(H()):A.y<0&&L(H()),v.copy(b),i.update()}(e);break;case r.PAN:if(!1===i.enablePan)return;!function(e){w.set(e.clientX,e.clientY),x.subVectors(w,m).multiplyScalar(i.panSpeed),W(x.x,x.y),m.copy(w),i.update()}(e)}}(e))}function Q(e){te(e),0===T.length&&(i.domElement.releasePointerCapture(e.pointerId),i.domElement.removeEventListener("pointermove",q),i.domElement.removeEventListener("pointerup",Q)),i.dispatchEvent(Ce),n=r.NONE}function Z(e){te(e)}function _(e){!1!==i.enabled&&!1!==i.enableZoom&&n===r.NONE&&(e.preventDefault(),i.dispatchEvent(Ie),function(e){e.deltaY<0?L(H()):e.deltaY>0&&Y(H()),i.update()}(e),i.dispatchEvent(Ce))}function $(e){!1!==i.enabled&&!1!==i.enablePan&&function(e){switch(e.code){case i.keys.MOVE_FORWARD:C(i.moveSpeed);break;case i.keys.MOVE_BACKWARD:C(-i.moveSpeed);break;case i.keys.MOVE_UP:I(i.moveSpeed);break;case i.keys.MOVE_DOWN:I(-i.moveSpeed);break;case i.keys.MOVE_RIGHT:O(i.moveSpeed);break;case i.keys.MOVE_LEFT:O(-i.moveSpeed);break;case i.keys.ROTATE_UP:F(i.turnSpeed);break;case i.keys.ROTATE_DOWN:F(-i.turnSpeed);break;case i.keys.ROTATE_LEFT:k(-i.turnSpeed);break;case i.keys.ROTATE_RIGHT:k(i.turnSpeed)}}(e)}function ee(e){!1!==i.enabled&&e.preventDefault()}function te(e){delete P[e.pointerId];for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:1,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:8,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1;Object(He.a)(this,l),(e=t.call(this)).type="ParabolicCylinderGeometry",e.parameters={semilatusRectum:a,width:o,height:i,widthSegments:r,lengthSegments:n};var c=Object(ze.a)(e);r=Math.floor(r),n=Math.floor(n);var s=[],d=[],u=[],f=[],h=0,p=[],y=i/2,g=0;function m(){for(var e=new Me.Vector3,t=new Me.Vector3,l=0,m=1/r,w=o/a,x=0;x<=n;x++){for(var v=[],b=x/n,A=0;A<=r;A++){var T=A*m-.5,P=T*w;t.x=a*P,t.y=-b*i+y,t.z=a*P*P/2,d.push(t.x,t.y,t.z),e.set(-a*P,0,a).normalize(),u.push(e.x,e.y,e.z),f.push(T- -.5,1-b),v.push(h++)}p.push(v)}for(var S=0;S0&&void 0!==arguments[0]?arguments[0]:1,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:16,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:4;Object(He.a)(this,l),(e=t.call(this)).type="ParaboloidGeometry",e.parameters={semilatusRectum:a,rimRadius:o,radialSegments:i,depthSegments:r},i=Math.max(3,Math.floor(i)),r=Math.max(2,Math.floor(r));for(var n,c,s=0,d=[],u=new Me.Vector3,f=new Me.Vector3,h=new Me.Vector3,p=new Me.Vector3,y=[],g=[],m=[],w=[],x=2*Math.PI,v=o/a,b=1/r,A=0;A<=r;A++){for(var T=[],P=A*b,S=P*v,j=0;j<=i;j++){var H=j/i;n=Math.cos(H*x),c=Math.sin(H*x),u.x=a*n*S,u.y=a*c*S,u.z=a*S*S/2,g.push(u.x,u.y,u.z),h.set(a*c,-a*n,a*S).normalize(),p.set(n,c,0),f.crossVectors(h,p),m.push(f.x,f.y,f.z),w.push(.5*P*n+.5,.5*P*c+.5),T.push(s++)}d.push(T)}for(var z=0;zthis.x&&ethis.y&&t6&&void 0!==arguments[6]?arguments[6]:0,u=arguments.length>7&&void 0!==arguments[7]?arguments[7]:0,f=0;switch(e.type){case V.Cuboid:s=e.id;break;case V.Wall:s=e.parentId,f=e.ly;break;case V.Roof:s=e.parentId,f=e.thickness}var p=Ew.getState().actionState;return{type:V.Window,cx:t,cy:l,cz:a,lx:d,ly:f,lz:u,leftShutter:p.windowShutterLeft,rightShutter:p.windowShutterRight,shutterColor:p.windowShutterColor,shutterWidth:p.windowShutterWidth,horizontalMullion:p.windowHorizontalMullion,verticalMullion:p.windowVerticalMullion,mullionWidth:p.windowMullionWidth,horizontalMullionSpacing:p.windowHorizontalMullionSpacing,verticalMullionSpacing:p.windowVerticalMullionSpacing,mullionColor:p.windowMullionColor,frame:p.windowFrame,frameWidth:p.windowFrameWidth,sillWidth:Vm.isTypeRoof(o)?0:p.windowSillWidth,windowType:p.windowType,empty:p.windowEmpty,interior:p.windowInterior,archHeight:p.windowArchHeight,selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,color:null!==(r=p.windowColor)&&void 0!==r?r:"#ffffff",tint:null!==(n=p.windowTint)&&void 0!==n?n:"#73D8FF",opacity:void 0!==p.windowOpacity?p.windowOpacity:.5,uValue:null!==(c=p.windowUValue)&&void 0!==c?c:.5,normal:[0,-1,0],rotation:i?Object(h.a)(i):[0,0,0],parentId:e.id,parentType:o,foundationId:s,id:m.a.generate()}}},{key:"makeDoor",value:function(e){var t,l,a,o;switch(e.type){case V.Cuboid:o=e.id;break;case V.Wall:o=e.parentId}var i=Ew.getState().actionState;return{type:V.Door,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,doorType:i.doorType,filled:i.doorFilled,interior:i.doorInterior,archHeight:i.doorArchHeight,textureType:null!==(t=i.doorTexture)&&void 0!==t?t:fe.Default,color:null!==(l=i.doorColor)&&void 0!==l?l:"#ffffff",uValue:null!==(a=i.doorUValue)&&void 0!==a?a:.5,selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,1,0],rotation:[0,0,0],parentId:e.id,foundationId:o,id:m.a.generate()}}},{key:"makePyramidRoof",value:function(e,t){var l,a,o,i,r,n,c=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(l=c.roofCeiling)&&void 0!==l&&l,rise:c.roofRise<0?2:c.roofRise,thickness:null!==(a=c.roofThickness)&&void 0!==a?a:.2,rValue:null!==(o=c.roofRValue)&&void 0!==o?o:3,color:null!==(i=c.roofColor)&&void 0!==i?i:"#454769",sideColor:null!==(r=c.roofSideColor)&&void 0!==r?r:"#ffffff",textureType:null!==(n=c.roofTexture)&&void 0!==n?n:he.Default,roofType:It.Pyramid,roofStructure:Ct.Default,wallsId:Object(h.a)(e),selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate()}}},{key:"makeGableRoof",value:function(e,t){var l,a,o,i,r,n,c=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(l=c.roofCeiling)&&void 0!==l&&l,rise:c.roofRise<0?2:c.roofRise,thickness:null!==(a=c.roofThickness)&&void 0!==a?a:.2,rValue:null!==(o=c.roofRValue)&&void 0!==o?o:3,color:null!==(i=c.roofColor)&&void 0!==i?i:"#454769",sideColor:null!==(r=c.roofSideColor)&&void 0!==r?r:"#ffffff",textureType:null!==(n=c.roofTexture)&&void 0!==n?n:he.Default,roofType:It.Gable,roofStructure:Ct.Default,wallsId:Object(h.a)(e),selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate(),ridgeLeftPoint:[0,1],ridgeRightPoint:[0,1]}}},{key:"makeHipRoof",value:function(e,t,l){var a,o,i,r,n,c,s=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(a=s.roofCeiling)&&void 0!==a&&a,rise:s.roofRise<0?2:s.roofRise,thickness:null!==(o=s.roofThickness)&&void 0!==o?o:.2,rValue:null!==(i=s.roofRValue)&&void 0!==i?i:3,color:null!==(r=s.roofColor)&&void 0!==r?r:"#454769",sideColor:null!==(n=s.roofSideColor)&&void 0!==n?n:"#ffffff",textureType:null!==(c=s.roofTexture)&&void 0!==c?c:he.Default,roofType:It.Hip,roofStructure:Ct.Default,wallsId:Object(h.a)(e),selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate(),leftRidgeLength:(null!==l&&void 0!==l?l:2)/2,rightRidgeLength:(null!==l&&void 0!==l?l:2)/2}}},{key:"makeGambrelRoof",value:function(e,t){var l,a,o,i,r,n,c=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(l=c.roofCeiling)&&void 0!==l&&l,rise:c.roofRise<0?2:c.roofRise,thickness:null!==(a=c.roofThickness)&&void 0!==a?a:.2,rValue:null!==(o=c.roofRValue)&&void 0!==o?o:3,color:null!==(i=c.roofColor)&&void 0!==i?i:"#454769",sideColor:null!==(r=c.roofSideColor)&&void 0!==r?r:"#ffffff",textureType:null!==(n=c.roofTexture)&&void 0!==n?n:he.Default,roofType:It.Gambrel,roofStructure:Ct.Default,wallsId:Object(h.a)(e),topRidgePoint:[0,1],frontRidgePoint:[.35,.5],backRidgePoint:[.35,.5],selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate()}}},{key:"makeMansardRoof",value:function(e,t){var l,a,o,i,r,n,c=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(l=c.roofCeiling)&&void 0!==l&&l,rise:c.roofRise<0?2:c.roofRise,thickness:null!==(a=c.roofThickness)&&void 0!==a?a:.2,rValue:null!==(o=c.roofRValue)&&void 0!==o?o:3,color:null!==(i=c.roofColor)&&void 0!==i?i:"#454769",sideColor:null!==(r=c.roofSideColor)&&void 0!==r?r:"#ffffff",textureType:null!==(n=c.roofTexture)&&void 0!==n?n:he.Default,roofType:It.Mansard,roofStructure:Ct.Default,wallsId:Object(h.a)(e),ridgeWidth:1,selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate()}}}]),e}(),Jl=l(839),Gl=function(e){return e.solarPanelArrayLayoutParams.pvModelName},Xl=function(e){return e.solarPanelArrayLayoutParams.rowAxis},Bl=function(e){return e.solarPanelArrayLayoutParams.rowsPerRack},Kl=function(e){return e.solarPanelArrayLayoutParams.interRowSpacing},ql=function(e){return e.solarPanelArrayLayoutParams.margin},Ql=function(e){return e.solarPanelArrayLayoutParams.poleHeight},Zl=function(e){return e.solarPanelArrayLayoutParams.poleSpacing},_l=function(e){return e.solarPanelArrayLayoutParams.tiltAngle},$l=function(e){return e.solarPanelArrayLayoutParams.orientation},ea=function(e){return e.viewState.navigationView},ta=function(e){return e.viewState.shadowEnabled},la=function(e){return e.viewState.solarPanelShininess},aa=function(e){return e.viewState.windowShininess},oa=function(e){return e.viewState.heatFluxScaleFactor},ia=function(e){return e.viewState.heatFluxColor},ra=function(e){return e.viewState.heatFluxWidth},na=function(e){return e.viewState.solarRadiationHeatMapMaxValue},ca=function(e){return e.viewState.solarRadiationHeatMapReflectionOnly},sa=function(e){return e.viewState.axes},da=function(e){return e.viewState.ambientLightIntensity},ua=function(e){return e.viewState.directLightIntensity},fa=function(e){return e.viewState.theme},ha=function(e){return e.viewState.showAzimuthAngle},pa=function(e){return e.viewState.showElevationAngle},ya=function(e){return e.viewState.showZenithAngle},ga=function(e){return e.viewState.autoRotate},ma=function(e){return e.viewState.groundImage},wa=function(e){return e.viewState.groundImageType},xa=function(e){return e.viewState.groundColor},va=function(e){return e.viewState.waterSurface},ba=function(e){return e.viewState.orthographic},Aa=function(e){return e.viewState.enableRotate},Ta=function(e){return e.viewState.cameraPosition},Pa=function(e){return e.viewState.cameraPosition2D},Sa=function(e){return e.viewState.panCenter},ja=function(e){return e.viewState.panCenter2D},Ha=function(e){return e.viewState.cameraZoom},za=function(e){return e.viewState.heliodon},Ra=function(e){return e.viewState.showSunAngles},Da=function(e){return e.viewState.mapZoom},Ma=function(e){return e.viewState.mapTilt},Wa=function(e){return e.viewState.mapType},Ia=function(e){return e.viewState.showSiteInfoPanel},Ca=function(e){return e.viewState.showDesignInfoPanel},Oa=function(e){return e.viewState.showInstructionPanel},Fa=function(e){return e.viewState.showHeliodonPanel},ka=function(e){return e.viewState.heliodonPanelX},Ya=function(e){return e.viewState.heliodonPanelY},La=function(e){return e.viewState.showMapPanel},Ea=function(e){return e.viewState.mapPanelX},Ua=function(e){return e.viewState.mapPanelY},Na=function(e){return e.viewState.showWeatherPanel},Va=function(e){return e.viewState.weatherPanelRect},Ja=function(e){return e.viewState.showDiurnalTemperaturePanel},Ga=function(e){return e.viewState.diurnalTemperaturePanelRect},Xa=function(e){return e.viewState.showStickyNotePanel},Ba=function(e){return e.viewState.stickyNotePanelRect},Ka=function(e){return e.viewState.showDailyBuildingEnergyPanel},qa=function(e){return e.viewState.dailyBuildingEnergyPanelRect},Qa=function(e){return e.viewState.showYearlyBuildingEnergyPanel},Za=function(e){return e.viewState.yearlyBuildingEnergyPanelRect},_a=function(e){return e.viewState.showDailyLightSensorPanel},$a=function(e){return e.viewState.dailyLightSensorPanelRect},eo=function(e){return e.viewState.showYearlyLightSensorPanel},to=function(e){return e.viewState.yearlyLightSensorPanelRect},lo=function(e){return e.viewState.yearlyLightSensorPanelShowDaylight},ao=function(e){return e.viewState.yearlyLightSensorPanelShowClearness},oo=function(e){return e.viewState.showDailyPvYieldPanel},io=function(e){return e.viewState.dailyPvYieldPanelRect},ro=function(e){return e.viewState.showYearlyPvYieldPanel},no=function(e){return e.viewState.yearlyPvYieldPanelRect},co=function(e){return e.viewState.showSolarPanelVisibilityResultsPanel},so=function(e){return e.viewState.visibilityResultsPanelRect},uo=function(e){return e.viewState.showDailyParabolicTroughYieldPanel},fo=function(e){return e.viewState.dailyParabolicTroughYieldPanelRect},ho=function(e){return e.viewState.showYearlyParabolicTroughYieldPanel},po=function(e){return e.viewState.yearlyParabolicTroughYieldPanelRect},yo=function(e){return e.viewState.showDailyParabolicDishYieldPanel},go=function(e){return e.viewState.dailyParabolicDishYieldPanelRect},mo=function(e){return e.viewState.showYearlyParabolicDishYieldPanel},wo=function(e){return e.viewState.yearlyParabolicDishYieldPanelRect},xo=function(e){return e.viewState.showDailyFresnelReflectorYieldPanel},vo=function(e){return e.viewState.dailyFresnelReflectorYieldPanelRect},bo=function(e){return e.viewState.showYearlyFresnelReflectorYieldPanel},Ao=function(e){return e.viewState.yearlyFresnelReflectorYieldPanelRect},To=function(e){return e.viewState.showDailyHeliostatYieldPanel},Po=function(e){return e.viewState.dailyHeliostatYieldPanelRect},So=function(e){return e.viewState.showYearlyHeliostatYieldPanel},jo=function(e){return e.viewState.yearlyHeliostatYieldPanelRect},Ho=function(e){return e.viewState.showDailyUpdraftTowerYieldPanel},zo=function(e){return e.viewState.dailyUpdraftTowerYieldPanelRect},Ro=function(e){return e.viewState.showYearlyUpdraftTowerYieldPanel},Do=function(e){return e.viewState.yearlyUpdraftTowerYieldPanelRect},Mo=function(e){return e.viewState.showEvolutionPanel},Wo=function(e){return e.viewState.evolutionPanelRect},Io=function(e){return e.world.latitude},Co=function(e){return e.world.longitude},Oo=function(e){return e.world.date},Fo=function(e){return e.world.leafDayOfYear1},ko=function(e){return e.world.leafDayOfYear2},Yo=function(e){return e.world.ground},Lo=function(e){return e.world.address},Eo=function(e){return e.world.countryCode},Uo=function(e){return e.world.airAttenuationCoefficient},No=function(e){return e.world.airConvectiveCoefficient},Vo=function(e){return e.world.timesPerHour},Jo=function(e){return e.world.daysPerYear},Go=function(e){return e.world.monthlyIrradianceLosses},Xo=function(e){return e.world.discretization},Bo=function(e){return e.world.diurnalTemperatureModel},Ko=function(e){return e.world.highestTemperatureTimeInMinutes},qo=function(e){return e.world.solarRadiationHeatmapGridCellSize},Qo=function(e){return e.world.pvGridCellSize},Zo=function(e){return e.world.solarPanelVisibilityGridCellSize},_o=function(e){return e.world.cspTimesPerHour},$o=function(e){return e.world.cspDaysPerYear},ei=function(e){return e.world.cspGridCellSize},ti=function(e){return e.world.sutTimesPerHour},li=function(e){return e.world.sutDaysPerYear},ai=function(e){return e.world.sutGridCellSize},oi=function(e){return e.world.noAnimationForHeatmapSimulation},ii=function(e){return e.world.noAnimationForThermalSimulation},ri=function(e){return e.world.noAnimationForSensorDataCollection},ni=function(e){return e.world.noAnimationForSolarPanelSimulation},ci=function(e){return e.world.noAnimationForSolarUpdraftTowerSimulation},si=function(e){return e.set},di=function(e){return e.user},ui=function(e){return e.userCount},fi=function(e){return e.showEconomicsPanel},hi=function(e){return e.showNavigationPanel},pi=function(e){return e.minimumNavigationMoveSpeed},yi=function(e){return e.minimumNavigationTurnSpeed},gi=function(e){return e.navigationMoveSpeed},mi=function(e){return e.navigationTurnSpeed},wi=function(e){return e.getHeatmap},xi=function(e){return e.setHeatmap},vi=function(e){return e.clearHeatmaps},bi=function(e){return e.flagOfDailySimulation},Ai=function(e){return e.hourlyHeatExchangeArrayMap},Ti=function(e){return e.setHourlyHeatExchangeArray},Pi=function(e){return e.hourlySolarHeatGainArrayMap},Si=function(e){return e.setHourlySolarHeatGainArray},ji=function(e){return e.hourlySolarPanelOutputArrayMap},Hi=function(e){return e.setHourlySolarPanelOutputArray},zi=function(e){return e.getRoofSegmentVertices},Ri=function(e){return e.getRoofSegmentVerticesWithoutOverhang},Di=function(e){return e.changed},Mi=function(e){return e.setChanged},Wi=function(e){return e.setSkipChange},Ii=function(e){return e.applyCount},Ci=function(e){return e.setApplyCount},Oi=function(e){return e.revertApply},Fi=function(e){return e.elements},ki=function(e){return e.notes},Yi=function(e){return e.pvModules},Li=function(e){return e.loadPvModules},Ei=function(e){return e.getPvModule},Ui=function(e){return e.floatingWindowOpacity},Ni=function(e){return e.selectedFloatingWindow},Vi=function(e){return e.language},Ji=function(e){return e.locale},Gi=function(e){return e.loggable},Xi=function(e){return e.actionInfo},Bi=function(e){return e.currentUndoable},Ki=function(e){return e.openModelsMap},qi=function(e){return e.modelsMapLatitude},Qi=function(e){return e.modelsMapLongitude},Zi=function(e){return e.modelsMapZoom},_i=function(e){return e.modelsMapTilt},$i=function(e){return e.modelsMapType},er=function(e){return e.modelsMapWeatherStations},tr=function(e){return e.showCloudFileTitleDialog},lr=function(e){return e.showCloudFileTitleDialogFlag},ar=function(e){return e.cloudFile},or=function(e){return e.latestModelSite},ir=function(e){return e.modelSites},rr=function(e){return e.peopleModels},nr=function(e){return e.saveCloudFileFlag},cr=function(e){return e.createProjectFlag},sr=function(e){return e.saveProjectFlag},dr=function(e){return e.curateDesignToProjectFlag},ur=function(e){return e.showProjectsFlag},fr=function(e){return e.updateProjectsFlag},hr=function(e){return e.modelsMapFlag},pr=function(e){return e.leaderboardFlag},yr=function(e){return e.showLeaderboard},gr=function(e){return e.publishOnModelsMapFlag},mr=function(e){return e.listCloudFilesFlag},wr=function(e){return e.localContentToImportAfterCloudFileUpdate},xr=function(e){return e.localFileName},vr=function(e){return e.createNewFileFlag},br=function(e){return e.openLocalFileFlag},Ar=function(e){return e.saveLocalFileDialogVisible},Tr=function(e){return e.fileChanged},Pr=function(e){return e.undoManager},Sr=function(e){return e.addUndoable},jr=function(e){return e.importContent},Hr=function(e){return e.exportContent},zr=function(e){return e.clearContent},Rr=function(e){return e.createEmptyFile},Dr=function(e){return e.aabb},Mr=function(e){return e.animateSun},Wr=function(e){return e.animate24Hours},Ir=function(e){return e.runDailyThermalSimulation},Cr=function(e){return e.pauseDailyThermalSimulation},Or=function(e){return e.runYearlyThermalSimulation},Fr=function(e){return e.pauseYearlyThermalSimulation},kr=function(e){return e.clearDailySimulationResultsFlag},Yr=function(e){return e.clearYearlySimulationResultsFlag},Lr=function(e){return e.runDynamicSimulation},Er=function(e){return e.runStaticSimulation},Ur=function(e){return e.pauseSimulation},Nr=function(e){return e.runEvolution},Vr=function(e){return e.pauseEvolution},Jr=function(e){return e.objectiveEvaluationIndex},Gr=function(e){return e.evolutionMethod},Xr=function(e){return e.updateSceneRadiusFlag},Br=function(e){return e.updateSceneRadius},Kr=function(e){return e.sceneRadius},qr=function(e){return e.cameraDirection},Qr=function(e){return e.getCameraDirection},Zr=function(e){return e.getElementById},_r=function(e){return e.getFoundation},$r=function(e){return e.getParent},en=function(e){return e.getChildren},tn=function(e){return e.getChildrenOfType},ln=function(e){return e.selectedElement},an=function(e){return e.selectedElementIdSet},on=function(e){return e.getSelectedElement},rn=function(e){return e.overlapWithSibling},nn=function(e){return e.selectedSideIndex},cn=function(e){return e.setElementPosition},sn=function(e){return e.setElementSize},dn=function(e){return e.setElementNormal},un=function(e){return e.updateAllElementLocks},fn=function(e){return e.updateElementLockByFoundationId},hn=function(e){return e.updateElementLockByParentId},pn=function(e){return e.updateElementLockById},yn=function(e){return e.updateElementReferenceById},gn=function(e){return e.updateElementLabelById},mn=function(e){return e.updateElementShowLabelById},wn=function(e){return e.updateElementCxById},xn=function(e){return e.updateElementCyById},vn=function(e){return e.updateElementCzById},bn=function(e){return e.updateElementCzForAll},An=function(e){return e.updateElementLxById},Tn=function(e){return e.updateElementLxAboveFoundation},Pn=function(e){return e.updateElementLxForAll},Sn=function(e){return e.updateElementLyById},jn=function(e){return e.updateElementLyAboveFoundation},Hn=function(e){return e.updateElementLyForAll},zn=function(e){return e.updateElementLzById},Rn=function(e){return e.updateElementLzForAll},Dn=function(e){return e.updateElementColorById},Mn=function(e){return e.updateElementColorOnSurface},Wn=function(e){return e.updateElementColorAboveFoundation},In=function(e){return e.updateElementColorForAll},Cn=function(e){return e.updateElementLineColorById},On=function(e){return e.updateElementLineColorOnSurface},Fn=function(e){return e.updateElementLineColorAboveFoundation},kn=function(e){return e.updateElementLineColorForAll},Yn=function(e){return e.updateElementLineWidthById},Ln=function(e){return e.updateElementLineWidthOnSurface},En=function(e){return e.updateElementLineWidthAboveFoundation},Un=function(e){return e.updateElementLineWidthForAll},Nn=function(e){return e.updateElementRotationById},Vn=function(e){return e.updateElementRotationForAll},Jn=function(e){return e.foundationActionScope},Gn=function(e){return e.setFoundationActionScope},Xn=function(e){return e.polygonActionScope},Bn=function(e){return e.setPolygonActionScope},Kn=function(e){return e.updatePolygonVertexPositionById},qn=function(e){return e.updatePolygonVerticesById},Qn=function(e){return e.cuboidActionScope},Zn=function(e){return e.setCuboidActionScope},_n=function(e){return e.solarPanelActionScope},$n=function(e){return e.setSolarPanelActionScope},ec=function(e){return e.updateSolarCollectorDailyYieldById},tc=function(e){return e.updateSolarCollectorYearlyYieldById},lc=function(e){return e.updateSolarPanelTiltAngleById},ac=function(e){return e.updateSolarCollectorDrawSunBeamById},oc=function(e){return e.updateSolarCollectorDrawSunBeamAboveFoundation},ic=function(e){return e.updateSolarCollectorDrawSunBeamForAll},rc=function(e){return e.updateSolarCollectorRelativeAzimuthById},nc=function(e){return e.updateSolarCollectorRelativeAzimuthOnSurface},cc=function(e){return e.updateSolarCollectorRelativeAzimuthAboveFoundation},sc=function(e){return e.updateSolarCollectorRelativeAzimuthForAll},dc=function(e){return e.updateSolarCollectorPoleHeightById},uc=function(e){return e.updateSolarCollectorPoleHeightOnSurface},fc=function(e){return e.updateSolarCollectorPoleHeightAboveFoundation},hc=function(e){return e.updateSolarCollectorPoleHeightForAll},pc=function(e){return e.updateSolarCollectorPoleRadiusById},yc=function(e){return e.updateSolarCollectorPoleRadiusAboveFoundation},gc=function(e){return e.updateSolarCollectorPoleRadiusForAll},mc=function(e){return e.updateCspReflectanceById},wc=function(e){return e.updateCspReflectanceAboveFoundation},xc=function(e){return e.updateCspReflectanceForAll},vc=function(e){return e.updateParabolicCollectorAbsorptanceById},bc=function(e){return e.updateParabolicCollectorAbsorptanceAboveFoundation},Ac=function(e){return e.updateParabolicCollectorAbsorptanceForAll},Tc=function(e){return e.updateParabolicCollectorOpticalEfficiencyById},Pc=function(e){return e.updateParabolicCollectorOpticalEfficiencyAboveFoundation},Sc=function(e){return e.updateParabolicCollectorOpticalEfficiencyForAll},jc=function(e){return e.updateParabolicCollectorThermalEfficiencyById},Hc=function(e){return e.updateParabolicCollectorThermalEfficiencyAboveFoundation},zc=function(e){return e.updateParabolicCollectorThermalEfficiencyForAll},Rc=function(e){return e.parabolicTroughActionScope},Dc=function(e){return e.setParabolicTroughActionScope},Mc=function(e){return e.fresnelReflectorActionScope},Wc=function(e){return e.setFresnelReflectorActionScope},Ic=function(e){return e.heliostatActionScope},Cc=function(e){return e.setHeliostatActionScope},Oc=function(e){return e.updateSolarReceiverById},Fc=function(e){return e.updateSolarReceiverAboveFoundation},kc=function(e){return e.updateSolarReceiverForAll},Yc=function(e){return e.parabolicDishActionScope},Lc=function(e){return e.setParabolicDishActionScope},Ec=function(e){return e.updateParabolaLatusRectumById},Uc=function(e){return e.updateParabolaLatusRectumAboveFoundation},Nc=function(e){return e.updateParabolaLatusRectumForAll},Vc=function(e){return e.updateModuleLengthById},Jc=function(e){return e.updateModuleLengthAboveFoundation},Gc=function(e){return e.updateModuleLengthForAll},Xc=function(e){return e.updateInsideLightById},Bc=function(e){return e.updateInsideLightsByParentId},Kc=function(e){return e.copyElementById},qc=function(e){return e.removeElementById},Qc=function(e){return e.removeElementsByType},Zc=function(e){return e.clearDeletedElements},_c=function(e){return e.countElementsByReferenceId},$c=function(e){return e.removeElementsByReferenceId},es=function(e){return e.removeAllChildElementsByType},ts=function(e){return e.removeAllElementsOnFoundationByType},ls=function(e){return e.pasteElementsToPoint},as=function(e){return e.pasteElementsByKey},os=function(e){return e.elementsToPaste},is=function(e){return e.selectMe},rs=function(e){return e.selectNone},ns=function(e){return e.addElement},cs=function(e){return e.objectTypeToAdd},ss=function(e){return e.actionModeLock},ds=function(e){return e.countElementsByType},us=function(e){return e.countSolarStructuresByType},fs=function(e){return e.countObservers},hs=function(e){return e.countAllOffspringsByTypeAtOnce},ps=function(e){return e.countSolarPanelsOnRack},ys=function(e){return e.selectedElementAngle},gs=function(e){return e.waiting},ms=function(e){return e.simulationInProgress},ws=function(e){return e.simulationPaused},xs=function(e){return e.evolutionInProgress},vs=function(e){return e.evolutionPaused},bs=function(e){return e.contextMenuObjectType},As=function(e){return e.enableFineGrid},Ts=function(e){return e.setEnableFineGrid},Ps=function(e){return e.showCloudFilePanel},Ss=function(e){return e.projectInfo},js=function(e){return e.projectView},Hs=function(e){return e.showProjectListPanel},zs=function(e){return e.showModelsGallery},Rs=function(e){return e.showAccountSettingsPanel},Ds=function(e){return e.showLikesPanel},Ms=function(e){return e.showPublishedModelsPanel},Ws=function(e){return e.weatherData},Is=function(e){return e.loadWeatherData},Cs=function(e){return e.getWeather},Os=function(e){return e.loadHorizontalSolarRadiationData},Fs=function(e){return e.getHorizontalSolarRadiation},ks=function(e){return e.loadVerticalSolarRadiationData},Ys=function(e){return e.getVerticalSolarRadiation},Ls=function(e){return e.getClosestCity},Es=function(e){return e.sunlightDirection},Us=function(e){return e.setSunlightDirection},Ns=function(e){return e.showSolarRadiationHeatmap},Vs=function(e){return e.showHeatFluxes},Js=function(e){return e.runSolarPanelVisibilityAnalysis},Gs=function(e){return e.solarPanelVisibilityResults},Xs=function(e){return e.runDailySimulationForSolarPanels},Bs=function(e){return e.runDailySimulationForSolarPanelsLastStep},Ks=function(e){return e.runYearlySimulationForSolarPanels},qs=function(e){return e.runYearlySimulationForSolarPanelsLastStep},Qs=function(e){return e.pauseDailySimulationForSolarPanels},Zs=function(e){return e.pauseYearlySimulationForSolarPanels},_s=function(e){return e.dailyPvYield},$s=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyPvIndividualOutputs},ed=function(e){return e.setDailyPvYield},td=function(e){return e.yearlyPvYield},ld=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyPvIndividualOutputs},ad=function(e){return e.setYearlyPvYield},od=function(e){return e.solarPanelLabels},id=function(e){return e.setSolarPanelLabels},rd=function(e){return e.setTotalBuildingHeater},nd=function(e){return e.setTotalBuildingAc},cd=function(e){return e.setTotalBuildingSolarPanel},sd=function(e){return e.runDailySimulationForParabolicTroughs},dd=function(e){return e.runYearlySimulationForParabolicTroughs},ud=function(e){return e.pauseDailySimulationForParabolicTroughs},fd=function(e){return e.pauseYearlySimulationForParabolicTroughs},hd=function(e){return e.dailyParabolicTroughYield},pd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyParabolicTroughIndividualOutputs},yd=function(e){return e.setDailyParabolicTroughYield},gd=function(e){return e.yearlyParabolicTroughYield},md=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyParabolicTroughIndividualOutputs},wd=function(e){return e.setYearlyParabolicTroughYield},xd=function(e){return e.parabolicTroughLabels},vd=function(e){return e.setParabolicTroughLabels},bd=function(e){return e.runDailySimulationForFresnelReflectors},Ad=function(e){return e.runYearlySimulationForFresnelReflectors},Td=function(e){return e.pauseDailySimulationForFresnelReflectors},Pd=function(e){return e.pauseYearlySimulationForFresnelReflectors},Sd=function(e){return e.dailyFresnelReflectorYield},jd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyFresnelReflectorIndividualOutputs},Hd=function(e){return e.setDailyFresnelReflectorYield},zd=function(e){return e.yearlyFresnelReflectorYield},Rd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyFresnelReflectorIndividualOutputs},Dd=function(e){return e.setYearlyFresnelReflectorYield},Md=function(e){return e.fresnelReflectorLabels},Wd=function(e){return e.setFresnelReflectorLabels},Id=function(e){return e.runDailySimulationForHeliostats},Cd=function(e){return e.runYearlySimulationForHeliostats},Od=function(e){return e.pauseDailySimulationForHeliostats},Fd=function(e){return e.pauseYearlySimulationForHeliostats},kd=function(e){return e.dailyHeliostatYield},Yd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyHeliostatIndividualOutputs},Ld=function(e){return e.setDailyHeliostatYield},Ed=function(e){return e.yearlyHeliostatYield},Ud=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyHeliostatIndividualOutputs},Nd=function(e){return e.setYearlyHeliostatYield},Vd=function(e){return e.heliostatLabels},Jd=function(e){return e.setHeliostatLabels},Gd=function(e){return e.runDailySimulationForUpdraftTower},Xd=function(e){return e.runYearlySimulationForUpdraftTower},Bd=function(e){return e.pauseDailySimulationForUpdraftTower},Kd=function(e){return e.pauseYearlySimulationForUpdraftTower},qd=function(e){return e.dailyUpdraftTowerResults},Qd=function(e){return e.dailyUpdraftTowerYield},Zd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyUpdraftTowerIndividualOutputs},_d=function(e){return e.setDailyUpdraftTowerResults},$d=function(e){return e.setDailyUpdraftTowerYield},eu=function(e){return e.yearlyUpdraftTowerYield},tu=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyUpdraftTowerIndividualOutputs},lu=function(e){return e.setYearlyUpdraftTowerYield},au=function(e){return e.updraftTowerLabels},ou=function(e){return e.setUpdraftTowerLabels},iu=function(e){return e.runDailySimulationForParabolicDishes},ru=function(e){return e.runYearlySimulationForParabolicDishes},nu=function(e){return e.pauseDailySimulationForParabolicDishes},cu=function(e){return e.pauseYearlySimulationForParabolicDishes},su=function(e){return e.dailyParabolicDishYield},du=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyParabolicDishIndividualOutputs},uu=function(e){return e.setDailyParabolicDishYield},fu=function(e){return e.yearlyParabolicDishYield},hu=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyParabolicDishIndividualOutputs},pu=function(e){return e.setYearlyParabolicDishYield},yu=function(e){return e.parabolicDishLabels},gu=function(e){return e.setParabolicDishLabels},mu=function(e){return e.runDailyLightSensor},wu=function(e){return e.pauseDailyLightSensor},xu=function(e){return e.runYearlyLightSensor},vu=function(e){return e.pauseYearlyLightSensor},bu=function(e){return e.dailyLightSensorData},Au=function(e){return e.setDailyLightSensorData},Tu=function(e){return e.yearlyLightSensorData},Pu=function(e){return e.setYearlyLightSensorData},Su=function(e){return e.sensorLabels},ju=function(e){return e.setSensorLabels},Hu=function(e){return e.hoveredHandle},zu=function(e){return e.moveHandleType},Ru=function(e){return e.resizeHandleType},Du=function(e){return e.getResizeHandlePosition},Mu=function(e){return e.rotateHandleType},Wu=function(e){return e.resizeAnchor},Iu=function(e){return e.isAddingElement},Cu=function(e){return e.addedFoundationId},Ou=function(e){return e.deletedFoundationId},Fu=function(e){return e.addedCuboidId},ku=function(e){return e.deletedCuboidId},Yu=function(e){return e.addedWallId},Lu=function(e){return e.deletedWallId},Eu=function(e){return e.deletedRoofId},Uu=function(e){return e.deletedRoofIdSet},Nu=function(e){return e.autoDeletedRoofIdSet},Vu=function(e){return e.autoDeletedRoofs},Ju=function(e){return e.autoDeletedChild},Gu=function(e){return e.groupActionMode},Xu=function(e){return e.groupActionUpdateFlag},Bu=function(e){return e.addedWindowId},Ku=function(e){return e.addedDoorId},qu=function(e){return e.updateWallMapOnFoundationFlag},Qu=function(e){return e.wallActionScope},Zu=function(e){return e.roofActionScope},_u=function(e){return e.windowActionScope},$u=function(e){return e.doorActionScope},ef=function(e){return e.setRoofActionScope},tf=function(e){return e.updateWallLeftJointsById},lf=function(e){return e.updateWallRightJointsById},af=function(e){return e.updateWallLeftPointById},of=function(e){return e.updateRoofStructureById},rf=function(e){return e.economicsParams},nf=function(e){return e.fittestIndividualResults},cf=function(e){return e.setFittestIndividualResults},sf=function(e){return e.variableLabels},df=function(e){return e.setVariableLabels},uf=function(e){return e.evolutionaryAlgorithmState},ff=function(e){return e.solarPanelArrayLayoutConstraints},hf=function(e){return e.geneticAlgorithmWizardSelectedTab},pf=function(e){return e.particleSwarmOptimizationWizardSelectedTab},yf=function(e){return e.setPrimitiveStore},gf=l(0),mf=n.a.memo((function(e){var t=e.hx,l=e.hy,a=e.hz,i=e.position,n=e.rotation,c=Ew(As),s=Ew(o.groundImage),d=s?"#888888":"#444444",f=Math.max(t,l),h=Object(r.useState)(Math.floor(f/50)+1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(.5),w=Object(u.a)(m,2),x=w[0],v=w[1];Object(r.useEffect)((function(){c?(g((Math.floor(f/25)+1)*gt),v(s?.05:.1)):(g((Math.floor(f/25)+1)*mt),v(5*(s?.05:.1)))}),[c,f]);var b=Object(r.useMemo)((function(){for(var e=[0],l=y;l<=t;l+=y)e.push(l),e.push(-l);return e}),[y,t]),A=Object(r.useMemo)((function(){for(var e=[0],t=y;t<=l;t+=y)e.push(t),e.push(-t);return e}),[y,l]);return Object(gf.jsxs)("group",{position:null!==i&&void 0!==i?i:[0,0,a+.01],rotation:n,children:[b.map((function(e){return Object(gf.jsx)(Jl.a,{points:[[e,-l,0],[e,l,0]],color:d,lineWidth:x,userData:{unintersectable:!0}},e)})),A.map((function(e){return Object(gf.jsx)(Jl.a,{points:[[-t,e,0],[t,e,0]],color:d,lineWidth:x,userData:{unintersectable:!0}},e)}))]})})),wf=function(e){var t=e.x,l=e.z,a=e.handleType,o=e.scale,i=void 0===o?[1,1,1]:o,n=Ew(si),c=Ew(Ru),s=Object(r.useRef)(),d=Object(r.useState)("white"),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(u.a)(i,3),g=y[0],m=y[1],w=y[2];return Object(r.useEffect)((function(){p(c===a?"red":"white")}),[c]),Object(gf.jsx)(Lt.a,{ref:s,name:a,args:[.2*g,.2*m,.2*w],position:[t,0,l],onPointerEnter:function(){p("red"),n((function(e){e.hoveredHandle=a}))},onPointerLeave:function(){null===c&&p("white"),n((function(e){e.hoveredHandle=null}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:h})})},xf=n.a.memo(wf),vf=function(e){var t=e.handleType,l=Ew(zu),a=Object(r.useRef)(),o=Object(r.useState)("white"),i=Object(u.a)(o,2),n=i[0],c=i[1];return Object(r.useEffect)((function(){l===B.Mid?c("red"):c("white")}),[l]),Object(gf.jsx)(Lt.h,{ref:a,name:t,args:[.1,6,6],onPointerEnter:function(){c("red")},onPointerLeave:function(){null===l&&c("white")},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:n})})},bf=n.a.memo(vf),Af=l(166),Tf=y()((function(e,t){return{setPrimitiveStore:function(t,l){e((function(e){void 0!==e[t]?e[t]=l:console.error("key ".concat(t," is not defined in PrimitiveStoreState"))}))},changed:!1,setChanged:function(t){e((function(e){e.changed=t}))},skipChange:!0,setSkipChange:function(t){e((function(e){e.skipChange=t}))},waiting:!1,showEconomicsPanel:!1,showNavigationPanel:!1,saveCloudFileFlag:!1,setSaveCloudFileFlag:function(t){e((function(e){e.saveCloudFileFlag=t}))},listCloudFilesFlag:!1,saveLocalFileDialogVisible:!1,modelsMapFlag:!1,leaderboardFlag:!1,showLeaderboard:!1,publishOnModelsMapFlag:!1,modelsMapWeatherStations:!1,createProjectFlag:!1,saveProjectFlag:!1,curateDesignToProjectFlag:!1,showProjectsFlag:!1,updateProjectsFlag:!1,showProjectListPanel:!1,projectImagesUpdateFlag:!1,projectType:M.SOLAR_PANEL_ARRAY,projectTitle:null,projectDescription:null,userCount:0,showCloudFilePanel:!1,openModelsMap:!1,showModelsGallery:!1,showAccountSettingsPanel:!1,showLikesPanel:!1,showPublishedModelsPanel:!1,animateSun:!1,simulationInProgress:!1,simulationPaused:!1,evolutionInProgress:!1,evolutionPaused:!1,runEvolution:!1,pauseEvolution:!1,objectiveEvaluationIndex:0,runDailyThermalSimulation:!1,pauseDailyThermalSimulation:!1,runYearlyThermalSimulation:!1,pauseYearlyThermalSimulation:!1,clearDailySimulationResultsFlag:!1,clearYearlySimulationResultsFlag:!1,runDynamicSimulation:!1,runStaticSimulation:!1,pauseSimulation:!1,runDailySimulationForParabolicDishes:!1,runYearlySimulationForParabolicDishes:!1,pauseDailySimulationForParabolicDishes:!1,pauseYearlySimulationForParabolicDishes:!1,runDailySimulationForParabolicTroughs:!1,runYearlySimulationForParabolicTroughs:!1,pauseDailySimulationForParabolicTroughs:!1,pauseYearlySimulationForParabolicTroughs:!1,runDailySimulationForFresnelReflectors:!1,runYearlySimulationForFresnelReflectors:!1,pauseDailySimulationForFresnelReflectors:!1,pauseYearlySimulationForFresnelReflectors:!1,runDailySimulationForHeliostats:!1,runYearlySimulationForHeliostats:!1,pauseDailySimulationForHeliostats:!1,pauseYearlySimulationForHeliostats:!1,runSolarPanelVisibilityAnalysis:!1,runDailySimulationForSolarPanels:!1,pauseDailySimulationForSolarPanels:!1,runYearlySimulationForSolarPanels:!1,pauseYearlySimulationForSolarPanels:!1,runDailySimulationForSolarPanelsLastStep:!1,runYearlySimulationForSolarPanelsLastStep:!1,runDailyLightSensor:!1,pauseDailyLightSensor:!1,runYearlyLightSensor:!1,pauseYearlyLightSensor:!1,runDailySimulationForUpdraftTower:!1,runYearlySimulationForUpdraftTower:!1,pauseDailySimulationForUpdraftTower:!1,pauseYearlySimulationForUpdraftTower:!1,flagOfDailySimulation:!1,showSolarRadiationHeatmap:!1,showHeatFluxes:!1,duringCameraInteraction:!1,navigationMoveSpeed:3,navigationTurnSpeed:3,elementBeingCanceledId:null,showWallIntersectionPlaneId:null,oldParentId:null,oldFoundationId:null,selectedElementId:null,foundationMovedFlag:!1,updateFoundationMovedFlag:function(){e((function(e){e.foundationMovedFlag=!e.foundationMovedFlag}))},isCameraUnderGround:!1}})),Pf=y()((function(e,t){return{roofSegmentVerticesMap:new Map,setRoofSegmentVertices:function(t,l){e((function(e){e.roofSegmentVerticesMap.set(t,Object(h.a)(l))}))},getRoofSegmentVertices:function(e){return t().roofSegmentVerticesMap.get(e)},deleteRoofSegmentVertices:function(t){e((function(e){e.roofSegmentVerticesMap.delete(t)}))},roofSegmentVerticesWithoutOverhangMap:new Map,setRoofSegmentVerticesWithoutOverhang:function(t,l){e((function(e){e.roofSegmentVerticesWithoutOverhangMap.set(t,l)}))},getRoofSegmentVerticesWithoutOverhang:function(e){return t().roofSegmentVerticesWithoutOverhangMap.get(e)},deleteRoofSegmentVerticesWithoutOverhang:function(t){e((function(e){e.roofSegmentVerticesWithoutOverhangMap.delete(t)}))},dailyLightSensorData:[],setDailyLightSensorData:function(t){e((function(e){e.dailyLightSensorData=Object(h.a)(t)}))},yearlyLightSensorData:[],setYearlyLightSensorData:function(t){e((function(e){e.yearlyLightSensorData=Object(h.a)(t)}))},sensorLabels:[],setSensorLabels:function(t){e((function(e){e.sensorLabels=Object(h.a)(t)}))},dailyPvYield:[],setDailyPvYield:function(t){e((function(e){e.dailyPvYield=Object(h.a)(t)})),Tf.setState((function(e){e.runEvolution&&e.objectiveEvaluationIndex++}))},sumDailyPvYield:function(){var e,t=0,l=Object(f.a)(this.dailyPvYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},getDailyPvProfit:function(){var e=this.sumDailyPvYield(),t=Tw.countAllSolarPanels();return e*Ew.getState().economicsParams.electricitySellingPrice-t*Ew.getState().economicsParams.operationalCostPerUnit},yearlyPvYield:[],setYearlyPvYield:function(t){e((function(e){e.yearlyPvYield=Object(h.a)(t)})),Tf.setState((function(e){e.runEvolution&&e.objectiveEvaluationIndex++}))},sumYearlyPvYield:function(){var e,t,l,a=0,o=Object(f.a)(this.yearlyPvYield);try{for(o.s();!(l=o.n()).done;){var i=l.value;for(var r in i)i.hasOwnProperty(r)&&"Month"!==r&&(a+=i[r])}}catch(n){o.e(n)}finally{o.f()}return a*(12/(null!==(e=null===(t=Ew.getState().world)||void 0===t?void 0:t.daysPerYear)&&void 0!==e?e:6))},getYearlyPvProfit:function(){var e=Tw.countAllSolarPanels();return this.sumYearlyPvYield()*Ew.getState().economicsParams.electricitySellingPrice-e*Ew.getState().economicsParams.operationalCostPerUnit*365},solarPanelLabels:[],setSolarPanelLabels:function(t){e((function(e){e.solarPanelLabels=Object(h.a)(t)}))},solarPanelVisibilityResults:new Map,setSolarPanelVisibilityResult:function(t,l){e((function(e){e.solarPanelVisibilityResults.set(t,l)}))},clearSolarPanelVisibilityResults:function(){e((function(e){e.solarPanelVisibilityResults=new Map}))},dailyParabolicDishYield:[],setDailyParabolicDishYield:function(t){e((function(e){e.dailyParabolicDishYield=Object(h.a)(t)}))},sumDailyParabolicDishYield:function(){var e,t=0,l=Object(f.a)(this.dailyParabolicDishYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyParabolicDishYield:[],setYearlyParabolicDishYield:function(t){e((function(e){e.yearlyParabolicDishYield=Object(h.a)(t)}))},sumYearlyParabolicDishYield:function(){var e,t=0,l=Object(f.a)(this.yearlyParabolicDishYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},parabolicDishLabels:[],setParabolicDishLabels:function(t){e((function(e){e.parabolicDishLabels=Object(h.a)(t)}))},dailyParabolicTroughYield:[],setDailyParabolicTroughYield:function(t){e((function(e){e.dailyParabolicTroughYield=Object(h.a)(t)}))},sumDailyParabolicTroughYield:function(){var e,t=0,l=Object(f.a)(this.dailyParabolicTroughYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyParabolicTroughYield:[],setYearlyParabolicTroughYield:function(t){e((function(e){e.yearlyParabolicTroughYield=Object(h.a)(t)}))},sumYearlyParabolicTroughYield:function(){var e,t=0,l=Object(f.a)(this.yearlyParabolicTroughYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},parabolicTroughLabels:[],setParabolicTroughLabels:function(t){e((function(e){e.parabolicTroughLabels=Object(h.a)(t)}))},dailyFresnelReflectorYield:[],setDailyFresnelReflectorYield:function(t){e((function(e){e.dailyFresnelReflectorYield=Object(h.a)(t)}))},sumDailyFresnelReflectorYield:function(){var e,t=0,l=Object(f.a)(this.dailyFresnelReflectorYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyFresnelReflectorYield:[],setYearlyFresnelReflectorYield:function(t){e((function(e){e.yearlyFresnelReflectorYield=Object(h.a)(t)}))},sumYearlyFresnelReflectorYield:function(){var e,t=0,l=Object(f.a)(this.yearlyFresnelReflectorYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},fresnelReflectorLabels:[],setFresnelReflectorLabels:function(t){e((function(e){e.fresnelReflectorLabels=Object(h.a)(t)}))},dailyHeliostatYield:[],setDailyHeliostatYield:function(t){e((function(e){e.dailyHeliostatYield=Object(h.a)(t)}))},sumDailyHeliostatYield:function(){var e,t=0,l=Object(f.a)(this.dailyHeliostatYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyHeliostatYield:[],setYearlyHeliostatYield:function(t){e((function(e){e.yearlyHeliostatYield=Object(h.a)(t)}))},sumYearlyHeliostatYield:function(){var e,t=0,l=Object(f.a)(this.yearlyHeliostatYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},heliostatLabels:[],setHeliostatLabels:function(t){e((function(e){e.heliostatLabels=Object(h.a)(t)}))},dailyUpdraftTowerResults:[],dailyUpdraftTowerYield:[],setDailyUpdraftTowerResults:function(t){e((function(e){e.dailyUpdraftTowerResults=Object(h.a)(t)}))},setDailyUpdraftTowerYield:function(t){e((function(e){e.dailyUpdraftTowerYield=Object(h.a)(t)}))},sumDailyUpdraftTowerYield:function(){var e,t=0,l=Object(f.a)(this.dailyUpdraftTowerYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyUpdraftTowerYield:[],setYearlyUpdraftTowerYield:function(t){e((function(e){e.yearlyUpdraftTowerYield=Object(h.a)(t)}))},sumYearlyUpdraftTowerYield:function(){var e,t=0,l=Object(f.a)(this.yearlyUpdraftTowerYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},updraftTowerLabels:[],setUpdraftTowerLabels:function(t){e((function(e){e.updraftTowerLabels=Object(h.a)(t)}))},heatmaps:new Map,setHeatmap:function(t,l){e((function(e){e.heatmaps.set(t,l)}))},getHeatmap:function(e){return t().heatmaps.get(e)},hourlyHeatExchangeArrayMap:new Map,setHourlyHeatExchangeArray:function(t,l){e((function(e){e.hourlyHeatExchangeArrayMap.set(t,l)}))},hourlySolarHeatGainArrayMap:new Map,setHourlySolarHeatGainArray:function(t,l){e((function(e){e.hourlySolarHeatGainArrayMap.set(t,l)}))},hourlySolarPanelOutputArrayMap:new Map,setHourlySolarPanelOutputArray:function(t,l){e((function(e){e.hourlySolarPanelOutputArrayMap.set(t,l)}))},totalBuildingHeater:0,setTotalBuildingHeater:function(t){e((function(e){e.totalBuildingHeater=t}))},totalBuildingAc:0,setTotalBuildingAc:function(t){e((function(e){e.totalBuildingAc=t}))},totalBuildingSolarPanel:0,setTotalBuildingSolarPanel:function(t){e((function(e){e.totalBuildingSolarPanel=t}))},clearHeatmaps:function(){e((function(e){e.heatmaps.clear()}))},clearDataStore:function(){e((function(e){e.heatmaps=new Map,e.hourlyHeatExchangeArrayMap=new Map,e.hourlySolarHeatGainArrayMap=new Map,e.hourlySolarPanelOutputArrayMap=new Map,e.solarPanelVisibilityResults=new Map,e.dailyLightSensorData=[],e.yearlyLightSensorData=[],e.sensorLabels=[],e.dailyPvYield=[],e.yearlyPvYield=[],e.solarPanelLabels=[],e.dailyParabolicDishYield=[],e.yearlyParabolicDishYield=[],e.parabolicDishLabels=[],e.dailyParabolicTroughYield=[],e.yearlyParabolicTroughYield=[],e.parabolicTroughLabels=[],e.dailyFresnelReflectorYield=[],e.yearlyFresnelReflectorYield=[],e.fresnelReflectorLabels=[],e.dailyHeliostatYield=[],e.yearlyHeliostatYield=[],e.heliostatLabels=[],e.dailyUpdraftTowerYield=[],e.dailyUpdraftTowerResults=[],e.yearlyUpdraftTowerYield=[],e.updraftTowerLabels=[]}))},clearRoofVerticesMap:function(){e((function(e){e.roofSegmentVerticesMap.clear(),e.roofSegmentVerticesWithoutOverhangMap.clear()}))}}})),Sf="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEASwzc1iU9gAAABRJREFUCJlj/P//PwMSYGJABaTyAer2AwfmvmPmAAAAAElFTkSuQmCC",jf=l.p+"static/media/roof_01.1418beb1.png",Hf=l.p+"static/media/roof_02.055d6e06.png",zf=l.p+"static/media/roof_03.1d45e089.png",Rf=l.p+"static/media/roof_04.20dee2dd.png",Df=l.p+"static/media/roof_05.34757ec1.png",Mf=l.p+"static/media/roof_06.0fce42da.png",Wf=l.p+"static/media/roof_07.d0b809f8.png",If=new Me.MeshStandardMaterial({color:"white",side:Me.FrontSide}),Cf=n.a.memo((function(e){var t=e.dimension,l=e.mullionData,a=e.shadowEnabled,o=Object(u.a)(t,4),i=o[0],n=(o[1],o[2]),c=o[3],s=Math.min(c,n,i/2),d=l.width,f=l.horizontalMullionSpacing,h=l.verticalMullionSpacing,p=l.color,y=d/2,g=Object(r.useMemo)((function(){return Math.atan2(i/2,s)}),[i,s]),m=Object(r.useMemo)((function(){if(0===s||0===i)return 0;var e=s/2+Math.pow(i,2)/(8*s),t=e-s,l=Math.PI-g,a=Math.pow(t,2),o=Math.pow(e,2),r=a+o-2*a*Math.pow(Math.sin(l),2)-2*t*Math.sqrt((o-a*Math.pow(Math.sin(l),2))*Math.pow(Math.cos(l),2));return Math.sqrt(r)}),[i,s,g]),w=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:p})}),[p]),x=function(e,t){var l=e*t/(i/2),a=l/2+Math.pow(2*t,2)/(8*l),o=Math.acos(Math.min(1,t/a)),r=Math.PI-o,n=new Me.EllipseCurve(0,l-a,a,a,o,r,!1,0).getPoints(24).map((function(e){return new Me.Vector3(e.x,e.y)}));return new Me.CatmullRomCurve3(n)},v=Object(r.useMemo)((function(){var e=[],t=Math.round(i/h)-1;if(t<=0||0===d)return null;var l=i/(t+1),a=l/2;t%2!==0&&(e.push(0),a=l);for(var o=0;o0&&(null===A||void 0===A?void 0:A.map((function(e,t){if(null===e)return null;var l=e.shape,o=e.path;return Object(gf.jsx)(Lt.e,{position:[0,y/2,n/2-s],rotation:[vt,0,0],args:[l,{extrudePath:o,steps:12,bevelEnabled:!1}],castShadow:a,receiveShadow:a,children:w},t)}))),m>0&&Object(gf.jsxs)(gf.Fragment,{children:[T(s,0),T(m,g),T(m,-g)]})]})})),Of=n.a.memo((function(e){var t=e.dimension,l=e.frameData,a=e.shadowEnabled,o=Object(u.a)(t,4),i=o[0],n=(o[1],o[2]),c=o[3],s=i/2,d=Math.min(c,n,s),f=l.color,p=l.width,y=l.sillWidth,g=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:f})}),[f]),m=p/2,w=m/2,x=i+3*p,v=p,b=Object(r.useMemo)((function(){var e=s+p,t=s,l=d+p,a=l/2+Math.pow(2*e,2)/(8*l),o=Math.acos(Math.min(1,e/a)),i=Math.PI-o,r=l-a,n=d,c=n/2+Math.pow(2*t,2)/(8*n),u=Math.acos(Math.min(1,t/c)),f=Math.PI-u,y=n-c,g=new Me.EllipseCurve(0,r,a,a,o,i,!1,0).getPoints(36),m=new Me.EllipseCurve(0,y,c,c,f,u,!0,0).getPoints(36);return new Me.Shape([].concat(Object(h.a)(g),Object(h.a)(m)))}),[c,n,i,p]);return Object(gf.jsxs)("group",{name:"Window Frame Group",position:[0,-w/2,0],children:[d>.1?Object(gf.jsx)(Lt.e,{position:[0,w/2,n/2-d],rotation:[vt,0,0],args:[b,{depth:w,steps:1,bevelEnabled:!1}],castShadow:a,receiveShadow:a,children:g}):Object(gf.jsx)(Lt.a,{position:[0,0,n/2],args:[i+2*p,w,p],castShadow:a,receiveShadow:a,children:g}),Object(gf.jsx)(Lt.a,{position:[-i/2-m,0,-d/2],args:[p,w,n-d],castShadow:a,receiveShadow:a,children:g}),Object(gf.jsx)(Lt.a,{position:[i/2+m,0,-d/2],args:[p,w,n-d],castShadow:a,receiveShadow:a,children:g}),Object(gf.jsx)(Lt.a,{position:[0,0,-n/2-(0===y?0:v/2)],args:0===y?[i+2*p,w,p]:[x,null!==y&&void 0!==y?y:p,v],castShadow:a,receiveShadow:a,children:g})]})})),Ff=n.a.memo((function(e){var t=e.cy,l=e.dimension,a=e.wireframeData,o=e.drawBottom,i=Object(u.a)(l,4),n=i[0],c=(i[1],i[2]),s=i[3],d=a.lineWidth,f=a.lineColor,h=a.selected,p=a.locked,y=a.opacity,g=d/20,m=d/5,w=n/2,x=c/2,v=Math.min(s,c,w),b=function(e,t){var l=e/2+Math.pow(2*t,2)/(8*e),a=Math.acos(Math.min(1,t/l)),o=Math.PI-a,i=new Me.EllipseCurve(0,e-l,l,l,a,o,!1,0).getPoints(24).map((function(e){return new Me.Vector3(e.x,e.y)}));return new Me.CatmullRomCurve3(i)},A=Object(r.useMemo)((function(){return new Me.MeshStandardMaterial({color:f})}),[f]),T=Object(r.useMemo)((function(){return new Me.MeshStandardMaterial({color:yt})}),[]),P=function(e,t){return Object(gf.jsxs)(gf.Fragment,{children:[v>.1?Object(gf.jsx)(Lt.e,{position:[0,0,c/2-v],rotation:[vt,0,0],args:[(l=e,(new Me.Shape).moveTo(0,l).quadraticCurveTo(l,l,l,0).quadraticCurveTo(l,-l,0,-l).quadraticCurveTo(-l,-l,-l,0).quadraticCurveTo(-l,l,0,l)),{extrudePath:b(v,w),steps:24,bevelEnabled:!1}],material:t}):Object(gf.jsx)(Lt.d,{args:[e,e,n,6,1],rotation:[0,0,vt],position:[0,0,x-e/2],material:t}),o&&Object(gf.jsx)(Lt.d,{args:[e,e,n,6,1],rotation:[0,0,vt],position:[0,0,-x],material:t}),Object(gf.jsx)(Lt.d,{args:[e,e,c-v,6,1],rotation:[vt,vt,0],position:[w,0,-v/2],material:t}),Object(gf.jsx)(Lt.d,{args:[e,e,c-v,6,1],rotation:[vt,vt,0],position:[-w,0,-v/2],material:t})]});var l};return Object(gf.jsxs)("group",{name:"Window Wireframe Group",children:[y>0&&Object(gf.jsx)("group",{position:[0,t,0],children:P(g,A)}),p&&h&&P(m,T)]})})),kf=function(e){var t=e.id,l=e.dimension,a=e.position,i=e.mullionData,c=e.frameData,s=e.wireframeData,d=e.leftShutter,f=e.rightShutter,h=e.shutterColor,p=e.shutterWidth,y=e.glassMaterial,g=e.showHeatFluxes,m=e.area,w=e.empty,x=e.interior,v=e.foundation,b=Ew.getState().world,A=Ew(o.heatFluxScaleFactor),T=Ew(o.heatFluxColor),P=Ew(o.heatFluxWidth),S=Ew(o.shadowEnabled),j=Pf(Ai),H=Object(r.useRef)(0),z=Object(r.useRef)(),R=Object(u.a)(l,4),D=R[0],M=R[1],W=R[2],I=R[3],C=Object(u.a)(a,3),O=(C[0],C[1]),F=(C[2],function(e,t){if(I>0){var l=.5*D,a=.5*W,o=Math.min(I,W,l),i=.5*(o+l*l/o);if(Math.abs(e)-a)return!0;var r=t-(W-i-a);return e*e+r*r3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i=new Me.Shape,r=e/2,n=t/2,c=Math.min(l,t,r);if(i.moveTo(a-r,o-n),i.lineTo(a+r,o-n),i.lineTo(a+r,o+n-c),c>.01){var s=c/2+Math.pow(e,2)/(8*c),d=a,u=o+n-s,f=Math.acos(Math.min(1,r/s)),h=Math.PI-f;i.absarc(d,u,s,f,h,!1)}else i.lineTo(a-r,o+n);return i.closePath(),i},Lf=n.a.memo(kf),Ef=new Me.MeshStandardMaterial({color:"white",side:Me.DoubleSide}),Uf=new Me.Euler(0,0,-vt),Nf=n.a.memo((function(e){var t=e.dimension,l=e.polygonTop,a=e.frameData,o=e.shadowEnabled,i=Object(u.a)(t,3),n=i[0],c=(i[1],i[2]),s=Object(u.a)(l,2),d=s[0],f=s[1],h=a.color,p=a.width,y=a.sillWidth,g=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:h})}),[h]),m=n/2,w=c/2,x=p/2/2,v=n+3*p,b=p,A=Object(r.useMemo)((function(){var e=new Me.Vector3(m,-w),t=new Me.Vector3(m,w),l=new Me.Vector3(-m,w),a=new Me.Vector3(-m,-w);return[e,t,new Me.Vector3(d*n,f+w),l,a]}),[m,w,d,f]),T=Object(r.useMemo)((function(){for(var e=[],t=1;t=0;a--){var o=A[a];e.lineTo(o.x,o.y)}return e.closePath(),e}),[A,T]);return Object(gf.jsxs)("group",{name:"Window Frame Group",position:[0,-x/2,0],children:[Object(gf.jsx)(Lt.e,{position:[0,x/2,0],rotation:[vt,0,0],args:[P,{steps:1,depth:x,bevelEnabled:!1}],children:g}),Object(gf.jsx)(Lt.a,{position:[0,0,-c/2-(0===y?0:b/2)],args:0===y?[n+2*p,x,p]:[v,null!==y&&void 0!==y?y:p,b],castShadow:o,receiveShadow:o,children:g})]})})),Vf=function(e){var t=e.id,l=e.dimension,a=e.polygonTop,i=e.position,c=e.glassMaterial,s=e.empty,d=e.interior,f=e.wireframeData,h=e.frameData,p=e.leftShutter,y=e.rightShutter,g=e.shutterColor,m=e.shutterWidth,w=e.area,x=e.showHeatFluxes,v=e.foundation,b=Ew.getState().world,A=Ew(o.heatFluxScaleFactor),T=Ew(o.heatFluxColor),P=Ew(o.heatFluxWidth),S=Pf(Ai),j=Object(r.useRef)(0),H=Object(r.useRef)(),z=Object(u.a)(i,3),R=(z[0],z[1]),D=(z[2],Object(u.a)(l,3)),M=D[0],W=D[1],I=D[2],C=l.map((function(e){return e/2})),O=Object(u.a)(C,3),F=O[0],k=O[1],Y=O[2],L=Object(u.a)(a,2),E=L[0],U=L[1],N=f.lineWidth,V=f.lineColor,J=f.selected,G=f.locked,X=(f.opacity,E*M),B=Math.hypot(U,F-X),K=Math.asin(U/B),q=Math.hypot(U,F+X),Q=-Math.asin(U/q),Z=Ew(o.shadowEnabled),_=function(e,t){var l=.5*M,o=.5*(I+a[1]),i=a[1],r=[{x:-l,y:-o},{x:l,y:-o},{x:l,y:o-i},{x:M*a[0],y:o},{x:-l,y:o-i}];return Tw.isPointInside(e,t,r)},$=Object(r.useMemo)((function(){var e;if(x&&!d&&(!v||!v.notBuilding)){var l=S.get(t);if(l){var o=l.reduce((function(e,t){return e+t}),0);if(0!==w){var i=4*(null!==(e=b.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),r=I+a[1],n=Math.max(2,Math.round(M/i)),c=Math.max(2,Math.round(r/i)),s=M/n,u=r/c,f=o/w*(null!==A&&void 0!==A?A:_e);j.current=f<0?1:0,H.current=Tw.getEuler(Rt,Ht,"YXZ",Math.sign(f)*vt);var h=[],p=a[1]/2;if(f<0)for(var y=0;y1&&void 0!==arguments[1]?arguments[1]:0;return Object(gf.jsx)(Lt.d,{args:[oe,oe,e,3,1],position:[t,ie,0],rotation:[0,0,vt],material:ae})},ne=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return Object(gf.jsx)(Lt.f,{args:[e,W],position:[t,0,0],material:Ef,receiveShadow:Z,castShadow:Z})};return Object(gf.jsxs)(gf.Fragment,{children:[!s&&Object(gf.jsxs)("mesh",{name:"Triangle Glass Plane",position:[0,R,0],rotation:[vt,0,0],children:[Object(gf.jsx)("shapeBufferGeometry",{args:[le]}),c]}),h.showFrame&&Object(gf.jsx)(Nf,{dimension:l,polygonTop:a,frameData:h,shadowEnabled:Z}),Object(gf.jsx)(Cg,{cx:te,lx:ee,lz:I,color:g,showLeft:p,showRight:y,spacing:h.showFrame?h.width/2:0}),Object(gf.jsxs)("group",{position:[0,k,.001-Y],children:[ne(M),re(M)]}),Object(gf.jsxs)("group",{position:[.001-F,k,0],rotation:[0,vt,0],children:[ne(I),re(I)]}),Object(gf.jsxs)("group",{position:[F-.001,k,0],rotation:[0,-vt,0],children:[ne(I),re(I)]}),Object(gf.jsxs)("group",{position:[.001-F,k,Y-.01],rotation:[0,Q,0],children:[ne(q,q/2),re(q,q/2)]}),Object(gf.jsxs)("group",{position:[F-.001,k,Y-.01],rotation:[0,K,0],children:[ne(B,-B/2),re(B,-B/2)]}),$&&$.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==P&&void 0!==P?P:et,color:null!==T&&void 0!==T?T:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:e[j.current].clone().add(new Me.Vector3(0,0===j.current?-.1:.1,0)),args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=H.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==T&&void 0!==T?T:$e})})]},t)}))]})},Jf=function(e,t,l,a){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=new Me.Shape;return r.moveTo(o-e,i-t),r.lineTo(o+e,i-t),r.lineTo(o+e,i+t),r.lineTo(o+l,i+t+a),r.lineTo(o-e,i+t),r.closePath(),r},Gf=n.a.memo(Vf),Xf=function(e){var t=e.id,l=e.index,a=e.foundationModel,i=e.roofType,c=e.segment,s=e.centroid,d=e.thickness,h=e.color,p=e.sideColor,y=e.texture,g=e.heatmap,m=e.windows,w=Ew(tn),x=Tf(Vs),v=Ew(o.heatFluxScaleFactor),b=Ew(o.heatFluxColor),A=Ew(o.heatFluxWidth),T=Pf(Ri),P=Wp(),S=P.transparent,j=P.opacity,H=Object(r.useRef)(0),z=Object(r.useRef)(),R=Object(r.useRef)(),D=Ew.getState().world,M=Pf.getState().hourlyHeatExchangeArrayMap,W=c.points,I=Object(r.useMemo)((function(){if(x){var e=T(t);if(e){var l=[],a=new Me.Vector3(0,0,d+.1);switch(i){case It.Hip:case It.Pyramid:var o,r=Object(f.a)(e);try{for(r.s();!(o=r.n()).done;){var n=o.value,c=[];c.push(n[0].clone().sub(s).add(a)),c.push(n[1].clone().sub(s).add(a)),l.push(c)}}catch(z){r.e(z)}finally{r.f()}break;case It.Mansard:var h,p=Object(f.a)(e.entries());try{for(p.s();!(h=p.n()).done;){var y=Object(u.a)(h.value,2),g=y[0],m=y[1];if(g!==e.length-1){var w=[];w.push(m[0].clone().sub(s).add(a)),w.push(m[1].clone().sub(s).add(a)),l.push(w)}}}catch(z){p.e(z)}finally{p.f()}break;case It.Gambrel:var v,b=Object(f.a)(e.entries());try{for(b.s();!(v=b.n()).done;){var A=Object(u.a)(v.value,2),P=A[0],S=A[1];if(0===P||3===P){var j=[];j.push(S[0].clone().sub(s).add(a)),j.push(S[1].clone().sub(s).add(a)),l.push(j)}var H=[];H.push(S[0].clone().sub(s).add(a)),H.push(S[3].clone().sub(s).add(a)),l.push(H),(H=[]).push(S[1].clone().sub(s).add(a)),H.push(S[2].clone().sub(s).add(a)),l.push(H)}}catch(z){b.e(z)}finally{b.f()}}return l}}}),[x]),C=Object(r.useMemo)((function(){var e;if(x&&(!a||!a.notBuilding)){var o=M.get(t+"-"+l);if(o){var i=o.reduce((function(e,t){return e+t}),0),r=T(t);if(r&&r[l]){var n=Object(u.a)(W,5),c=n[0],d=(n[1],n[2],n[3],n[4].z-c.z),h=r[l].map((function(e){return e.clone().sub(s).add(new Me.Vector3(0,0,d))}));if(h){var p,y=[],g=Object(f.a)(h);try{for(g.s();!(p=g.n()).done;){var m=p.value;y.push({x:m.x,y:m.y})}}catch(ue){g.e(ue)}finally{g.f()}var b=4*(null!==(e=D.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),A=h[0].clone(),P=h[1].clone(),S=h[2].clone(),j=(new Me.Vector3).subVectors(P,A),I=(new Me.Vector3).subVectors(S,A),C=(new Me.Vector3).subVectors(S,P),O=j.length(),F=(new Me.Vector3).crossVectors(I,C).length()/O,k=Math.max(2,Math.floor(O/b)),Y=Math.max(2,Math.floor(F/b));j.normalize(),I.normalize(),C.normalize();var L=(new Me.Vector3).crossVectors(I,C).normalize(),E=j.multiplyScalar(.5*O/k),U=(new Me.Vector3).crossVectors(L,j).normalize().multiplyScalar(.5*F/Y),N=A.clone().add(E).add(U);E.multiplyScalar(2),U.multiplyScalar(2),z.current=L.clone().multiplyScalar(.1);var J=[],G=new Me.Vector3,X=4===h.length?Tw.getTriangleArea(h[0],h[1],h[2])+Tw.getTriangleArea(h[2],h[3],h[0]):Tw.getTriangleArea(h[0],h[1],h[2]);if(0!==X){var B=w(V.Window,t),K=T(t);if(K&&K[l]&&(B=B.filter((function(e){var t=e,a=t.cy+(t.windowType===Yt.Polygonal&&t.polygonTop?t.polygonTop[1]/2:0);return Vm.onSegment(K[l],e.cx,a)}))),B&&B.length>0){var q,Q=Object(f.a)(B);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;X-=Tw.getWindowArea(Z)}}catch(ue){Q.e(ue)}finally{Q.f()}}var _,$=i/X*(null!==v&&void 0!==v?v:_e);H.current=$<0?1:0,R.current=Tw.getEuler(Rt,L,"YXZ",-Math.sign($)*vt);for(var ee=0;ee0){var ae,oe=G.x+s.x,ie=G.y+s.y,re=Object(f.a)(B);try{for(re.s();!(ae=re.n()).done;){var ne=ae.value,ce=Vm.getRelativeWindowVerticesOnRoof(ne),se=Tw.getPoints(ce);if(Tw.isPointInside(oe,ie,se)){_=!1;break}}}catch(ue){re.e(ue)}finally{re.f()}}if(_&&Tw.isPointInside(G.x,G.y,y)){var de=[];$<0?(de.push(G.clone()),de.push(G.clone().add(L.clone().multiplyScalar(-$)))):(de.push(G.clone()),de.push(G.clone().add(L.clone().multiplyScalar($)))),J.push(de)}}return J}}}}}}),[x,v]);return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Bf,{id:t,index:l,segment:c,color:h,sideColor:p,texture:y,heatmap:g,transparent:S,opacity:j,windows:m,centroid:s}),I&&I.map((function(e,t){return Object(gf.jsx)(Jl.a,{points:e,color:"gray",lineWidth:.5,dashed:!0,dashSize:.2,gapSize:.1,receiveShadow:!1,castShadow:!1,name:"Overhang Boundary "+t},t)})),C&&C.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==A&&void 0!==A?A:et,color:null!==b&&void 0!==b?b:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:z.current?e[H.current].clone().add(z.current):e[0],args:[.06,.2,4,1],name:"Normal Vector Arrow Head "+t,rotation:null!==(l=R.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==b&&void 0!==b?b:$e})})]},t)}))]})},Bf=n.a.memo((function(e){var t,l=e.id,a=e.index,i=e.segment,n=e.color,c=e.sideColor,s=e.texture,d=e.heatmap,p=e.transparent,y=e.opacity,g=e.windows,m=e.centroid,w=Ew(o.shadowEnabled),x=Tf(Ns),v=Object(r.useRef)(null),b=i.points,A=x?d:s,T=6===b.length,P=8===b.length,S=Object(r.useMemo)((function(){return g.map((function(e){var t=new Me.Vector3(e.lx,e.lz,2*e.ly),l=new Me.Vector3(e.cx,e.cy,e.cz).sub(m),a=(new Me.Euler).fromArray([].concat(Object(h.a)(e.rotation),["ZXY"]));if(e.windowType===Yt.Polygonal){var o,i=null!==(o=e.polygonTop)&&void 0!==o?o:Fg,r=Object(u.a)(i,2),n=r[0],c=r[1],s=t.x/2,d=t.y/2,f=n*t.x,p=Jf(s,d,f,c),y=new Me.Mesh(new Me.ExtrudeBufferGeometry([p],{steps:1,depth:t.z,bevelEnabled:!1})),g=new Me.Vector3(0,0,-t.z).applyEuler(a);return y.position.copy(l.clone().add(g)),y.rotation.copy(a),y.updateMatrix(),y}if(e.windowType===Yt.Arched){var w=Yf(t.x,t.y,e.archHeight),x=new Me.Mesh(new Me.ExtrudeBufferGeometry([w],{steps:1,depth:t.z,bevelEnabled:!1})),v=new Me.Vector3(0,0,-t.z).applyEuler(a);return x.position.copy(l.clone().add(v)),x.rotation.copy(a),x.updateMatrix(),x}var b=new Me.Mesh(new Me.BoxBufferGeometry(t.x,t.y,t.z));return b.position.copy(l),b.rotation.copy(a),b.updateMatrix(),b}))}),[g,m]),j=null!==(t=z())&&void 0!==t?t:6,H=Object(r.useMemo)((function(){return Array(j).fill(0)}),[j]);if(Object(r.useEffect)((function(){z()}),[]),!T&&!P)return null;function z(){if(v.current&&(T||P)){var e=v.current.geometry;e.index=null,e.clearGroups();var t=[],l=[],a=0,o=0;if(T){var i=b.slice(b.length/2);G(i),x?X():function(e){var t=Object(u.a)(e,3),a=t[0],o=t[1],i=t[2],r=(new Me.Vector3).subVectors(o,a),n=r.length(),c=(new Me.Vector3).subVectors(i,a),s=new Me.Vector2(o.x-a.x,o.y-a.y).length(),d=0,f=r.dot(c)/n,h=r.clone().cross(c).length()/n;l.push(0,0,s,d,f,h)}(i),B(3),G(b.slice(0,b.length/2).reverse()),l.push(0,0,1,0,0,1),B(3),K([[0,1,4,3],[1,2,5,4],[2,0,3,5]])}else{if(!P)throw new Error("segment is neither quad nor tri");var r=b.slice(b.length/2),n=R(r),c=Object(u.a)(n,2),s=c[0],d=c[1];G(s),G(d);var p=Object(u.a)(r,4),y=p[0],m=p[1],w=p[2],A=p[3],j=s[2].equals(A);if(x)X(j);else{var H=(new Me.Vector3).subVectors(m,y),z=(new Me.Vector3).subVectors(w,y),D=(new Me.Vector3).subVectors(A,y),M=new Me.Vector2(m.x-y.x,m.y-y.y).length(),W=M,I=H.dot(z)/M,C=H.clone().cross(z).length()/M,O=H.dot(D)/M,F=H.clone().cross(D).length()/M;j?(l.push(0,0,W,0,O,F),l.push(W,0,I,C,O,F)):(l.push(0,0,W,0,I,C),l.push(0,0,I,C,O,F))}B(6);var k=R(b.slice(0,b.length/2)),Y=Object(u.a)(k,2),L=Y[0],E=Y[1];G(L.reverse()),G(E.reverse()),l.push(0,0,1,0,0,1),l.push(0,1,1,0,1,1),B(6),K([[0,1,5,4],[1,2,6,5],[2,3,7,6],[3,0,4,7]])}if(e.setAttribute("position",new Me.Float32BufferAttribute(t,3)),e.setAttribute("uv",new Me.Float32BufferAttribute(l,2)),e.computeVertexNormals(),e.computeBoundingSphere(),g.length>0){for(var U=[],N=0;N0&&void 0!==arguments[0]&&arguments[0],t=(new Me.Vector3).subVectors(b[1],b[0]),a=t.length();t.normalize();var o=(new Me.Vector3).subVectors(b[2],b[0]);if(T){var i=o.dot(t)/a;l.push(0,0,1,0,i,1)}else if(P){var r=(new Me.Vector3).subVectors(b[3],b[0]),n=r.dot(t)/a,c=o.dot(t)/a;e?(l.push(0,0,1,0,n,1),l.push(1,0,c,1,n,1)):(l.push(0,0,1,0,c,1),l.push(0,0,c,1,n,1))}}function B(t){e.addGroup(a,t,o++),a+=t}function K(e){var a,o=Object(f.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value,r=Object(u.a)(i,4),n=r[0],c=r[1],s=r[2],d=r[3],p=[n,c,d].reduce((function(e,t){return e.concat(b[t].x,b[t].y,b[t].z)}),[]),y=[d,c,s].reduce((function(e,t){return e.concat(b[t].x,b[t].y,b[t].z)}),[]);t.push.apply(t,Object(h.a)(p)),t.push.apply(t,Object(h.a)(y)),l.push(0,0,1,0,0,1),l.push(0,1,1,0,1,1),B(6)}}catch(g){o.e(g)}finally{o.f()}}}function R(e){var t=Object(u.a)(e,4),l=t[0],a=t[1],o=t[2],i=t[3],r=Tw.distanceFromPointToLine2D(i,l,a),n=Tw.distanceFromPointToLine2D(o,l,a),c=[],s=[];return Math.abs(r-n)<.01?l.z>a.z?(c.push(l,a,o),s.push(l,o,i)):(c.push(l,a,i),s.push(a,o,i)):r<=n?(c.push(l,a,i),s.push(a,o,i)):(c.push(l,a,o),s.push(l,o,i)),[c,s]}var D=function(){return Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:A,transparent:p,opacity:y})},M=function(){return Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:n,map:A,transparent:p,opacity:y})},W=function(){return Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:c,transparent:p,opacity:y})},I=w&&!x;return Object(gf.jsx)("mesh",{ref:v,name:"Buffer Roof Segment ".concat(a),uuid:l+"-"+a,userData:{simulation:!0},receiveShadow:I,castShadow:I,frustumCulled:!1,children:H.map((function(e,t){return 0!==t?Object(gf.jsx)(W,{},"side"+t):x?Object(gf.jsx)(D,{},"heatmap"+t):Object(gf.jsx)(M,{},"texture"+t)}))})})),Kf=n.a.memo(Xf),qf=function(e){var t=e.cz,l=e.points,a=new Me.Shape;a.moveTo(l[0].x,l[0].y);var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value,n=r.x,c=r.y;a.lineTo(n,c)}}catch(s){i.e(s)}finally{i.f()}return a.closePath(),Object(gf.jsx)(Lt.e,{scale:.99,position:[0,0,t],args:[a,{steps:1,depth:.1,bevelEnabled:!1}],children:Object(gf.jsx)("meshStandardMaterial",{side:Me.DoubleSide,color:"white"})})},Qf=n.a.memo(qf),Zf=l(88),_f=function(e){return Ew((function(t){return t.selectedElementIdSet.has(e)&&!t.groupActionMode}))},$f=function(){return{lng:Ew(Vi)}},eh=new Me.Vector3,th=new Me.Euler,lh=new Me.Vector3,ah=new Me.Vector3(0,0,1),oh=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor;if(0===t.length)return null;for(var i=[],r=new Me.Vector3(0,0,l),n=0;n0&&a.rightPoint.length>0&&(a.leftPoint[0]!==a.rightPoint[0]||a.leftPoint[1]!==a.rightPoint[1])){var o=[],i=Vm.getWallHeight($,l),r=i.lh,n=i.rh;ee.current||(0===l&&(r=$[0].lz),l===$.length-1&&(n=$[$.length-1].lz));var c=Vm.getIntersectionPoint(ne[(l+ne.length-1)%ne.length].leftPoint,ne[(l+ne.length-1)%ne.length].rightPoint,ne[l].leftPoint,ne[l].rightPoint).setZ(r-t).sub(ie),s=Vm.getIntersectionPoint(ne[l].leftPoint,ne[l].rightPoint,ne[(l+1)%ne.length].leftPoint,ne[(l+1)%ne.length].rightPoint).setZ(n-t).sub(ie),d=new Me.Vector3(a.cx,a.cy).sub(ie.clone().setZ(0)).length();o.push(c,s,lh),o.push(c.clone().add(ce),s.clone().add(ce),lh.clone().add(ce)),e.push({points:o,angle:-a.relativeAngle,length:d})}}if(!ee.current){var u=ne.length-1,f=Vm.getIntersectionPoint(ne[u-1].leftPoint,ne[u-1].rightPoint,ne[u].leftPoint,ne[u].rightPoint).setZ($[$.length-1].lz-t).sub(ie),h=Vm.getIntersectionPoint(ne[u].leftPoint,ne[u].rightPoint,ne[0].leftPoint,ne[0].rightPoint).setZ($[0].lz-t).sub(ie),p=Math.atan2(h.y-f.y,h.x-f.x);p=p>=0?p:(bt+p)%bt;var y=(new Me.Vector3).addVectors(f,h).setZ(0).divideScalar(2).length(),g=[];g.push(f,h,lh),g.push(f.clone().add(ce),h.clone().add(ce),lh.clone().add(ce)),e.push({points:g,angle:-p,length:y})}return e}),[$,oe,w]),de=Object(r.useMemo)((function(){var e=[];if(0===$.length)return e;e.push((new Me.Vector3).fromArray($[0].leftPoint));var t,l=Object(f.a)($);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push((new Me.Vector3).fromArray(a.rightPoint))}}catch(o){l.e(o)}finally{l.f()}return e}),[$]),ue=0;if(l){a=l.cx,i=l.cy,ue=l.rotation[2];var fe=-Math.atan2(k.position.x-a,k.position.y-i)-ue;eh.set(oe.x,oe.y,ae),th.set(-vt,0,fe,"ZXY")}var pe=Ep();Object(r.useEffect)((function(){if(!pe&&(Ew.getState().addedRoofIdSet.has(c)&&$.length>=2&&function(e,t){if(e.length!==t.size)return!0;var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(!t.has(o.id))return!0}}catch(i){a.e(i)}finally{a.f()}return!1}($,Z))){var e=$.map((function(e){return e.id})),t=new Set(e);C((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Roof)i.id===c&&(i.wallsId=e);else if(i.type===V.Wall&&Z.has(i.id)&&!t.has(i.id)){var r=i;r.roofId=null,r.leftRoofHeight=void 0,r.rightRoofHeight=void 0}}}catch(n){o.e(n)}finally{o.f()}})),Ew.getState().deleteAddedRoofId(c)}}),[Z]),Object(r.useEffect)((function(){if($.length>1){if(Ew.getState().addedRoofIdSet.has(c)){for(var e=function(e){C((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===$[e].id&&o.type===V.Wall){var i=o;i.roofId=c,i.leftRoofHeight=void 0,i.rightRoofHeight=void 0;break}}}catch(r){a.e(r)}finally{a.f()}}))},t=0;t<$.length;t++)e(t);Ew.getState().deleteAddedRoofId(c)}}else O(c,!1,!1,!0)}),[$]),Np(l,c,se,ie,ae,w);var ye=function(){if($.length<2)return!1;var e,t=$[0].lz,l=Object(f.a)($);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(Math.abs(a.lz-t)>.01)return!1}}catch(d){l.e(d)}finally{l.f()}var o,i=Object(f.a)(se);try{for(i.s();!(o=i.n()).done;){var r=o.value,n=Object(u.a)(r.points,2),c=n[0],s=n[1];if(Math.abs(c.z)>.01||Math.abs(s.z)>.01)return!1}}catch(d){i.e(d)}finally{i.f()}return!0},me=Object(r.useState)(ye),we=Object(u.a)(me,2),xe=we[0],ve=we[1];Object(r.useEffect)((function(){ve(ye())}),[$,ae]);var be=Tf(Ns),Ae=Ew(o.solarRadiationHeatmapMaxValue),Te=Pf(wi),Pe=Object(r.useState)([]),je=Object(u.a)(Pe,2),He=je[0],ze=je[1],Re=Object(r.useState)(null),De=Object(u.a)(Re,2),We=De[0],Ie=De[1],Ce=Ew(is),Oe=kp(c,ie,se,xe,It.Pyramid);Object(r.useEffect)((function(){if(be)if(xe){var e=Te(c);if(e){var t=Tw.fetchHeatmapTexture(e,null!==Ae&&void 0!==Ae?Ae:5);if(t){var a=Oe();if(a&&a.length>0&&l){var o,i=new Me.Euler(0,0,l.rotation[2],"ZYX"),r=Number.MAX_VALUE,n=Number.MAX_VALUE,s=-Number.MAX_VALUE,d=-Number.MAX_VALUE,u=Object(f.a)(a);try{for(u.s();!(o=u.n()).done;){var h,p=o.value,y=Object(f.a)(p);try{for(y.s();!(h=y.n()).done;){var g=h.value.clone().applyEuler(i);g.x>s&&(s=g.x),g.xd&&(d=g.y),g.y0){var A=[];if(Oe()){for(var T=0;T0&&l.rightPoint.length>0&&(l.leftPoint[0]!==l.rightPoint[0]||l.leftPoint[1]!==l.rightPoint[1])){var a=Vm.getWallHeight($,t),o=a.lh,i=a.rh;ee.current||(0===t&&(o=$[0].lz),t===$.length-1&&(i=$[$.length-1].lz));var r=new Me.Vector3(l.leftPoint[0],l.leftPoint[1],o),n=new Me.Vector3(l.rightPoint[0],l.rightPoint[1],i);e.push([r,n,ie.clone()])}}if(!ee.current){var s=$[0],d=$[$.length-1],u=new Me.Vector3(d.rightPoint[0],d.rightPoint[1],d.lz),h=new Me.Vector3(s.leftPoint[0],s.leftPoint[1],s.lz);e.push([u,h,ie.clone()])}if(xe){var p,y=[],g=Object(f.a)(e);try{for(g.s();!(p=g.n()).done;){var m=p.value;y.push(m[0].clone())}}catch(w){g.e(w)}finally{g.f()}Pf.getState().setRoofSegmentVerticesWithoutOverhang(c,[y])}else Pf.getState().setRoofSegmentVerticesWithoutOverhang(c,e)}));var Fe=Ew((function(e){return e.elements.filter((function(e){return e.parentId===c&&e.type===V.Window}))}),Zf.a),ke=Vp(c,l,ie,se),Ye=d===he.Default||d===he.NoTexture?p:"white";return Object(gf.jsxs)("group",{name:"Pyramid Roof Group ".concat(c),children:[Object(gf.jsx)("group",{name:"Pyramid Roof Segments Group ".concat(c),userData:ke,position:[oe.x,oe.y,ae],onPointerDown:function(e){Ap(e,l.id,c,se,ie)},onPointerMove:function(e){Pp(e,c)},onPointerUp:function(e){Tp(e,t)},onContextMenu:function(e){Sp(e,c)},children:xe?Object(gf.jsx)(Bp,{id:c,foundationModel:l,roofType:P,roofSegments:se,center:ie,thickness:w,lineWidth:b,lineColor:T,sideColor:g,color:Ye,textureType:d,heatmap:We}):Object(gf.jsxs)(gf.Fragment,{children:[se.map((function(e,t){var a=e.points;if(a.length>0){var o=Object(u.a)(a,2),i=o[0],r=o[1];if(i.distanceTo(r)>.1)return Object(gf.jsx)("group",{name:"Roof segment ".concat(t),children:Object(gf.jsx)(Kf,{id:c,index:t,foundationModel:l,roofType:P,segment:e,centroid:ie,thickness:w,color:Ye,sideColor:g,texture:D,heatmap:He&&t0&&Object(gf.jsx)(Qf,{points:de,cz:$[0].lz}),M&&!x&&Object(gf.jsx)(jp,{position:[oe.x,oe.y,ae+w+.15],onPointerDown:function(e){Ce(t.id,e,X.Select),G(!0),Et.getState().setEnableOrbitController(!1),q.current=!0,Q.current=H,C((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=ae+t.thickness}))},onPointerUp:function(){G(!1),Et.getState().setEnableOrbitController(!0)},onPointerOver:function(){C((function(e){e.hoveredHandle=ge.Top,e.selectedElementHeight=ae+t.thickness,e.selectedElementX=oe.x,e.selectedElementY=oe.y}))}}),J&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:B,args:[1e3,100],visible:!1,rotation:th,position:eh,onPointerMove:function(e){if(B.current&&q.current&&l){!function(e){E.x=e.offsetX/Y.domElement.clientWidth*2-1,E.y=-e.offsetY/Y.domElement.clientHeight*2+1,L.setFromCamera(E,k)}(e);var a=L.intersectObjects([B.current]);if(a[0]){var o=a[0].point;if(o.z<.001)return;var i=Math.max(0,o.z-l.lz-.3-le);Ew.getState().updateRoofRiseById(c,i,ae+t.thickness)}}},onPointerUp:function(e){wp(c,Q.current,H),G(!1),Et.getState().setEnableOrbitController(!0),q.current=!1}})]})},rh=n.a.memo(ih,zp),nh=function(e,t,l){var a=l.left,o=l.right,i=l.center,r=l.centerLeft,n=l.centerRight,c=e/2,s=t/2,d=[{x:-c,y:a-s},{x:-c,y:-s},{x:c,y:-s},{x:c,y:o-s}];if(n){var f=Object(u.a)(n,2),h=f[0],p=f[1];d.push({x:h*e,y:p-s})}if(i){var y=Object(u.a)(i,2),g=y[0],m=y[1];d.push({x:g*e,y:m-s})}if(r){var w=Object(u.a)(r,2),x=w[0],v=w[1];d.push({x:x*e,y:v-s})}return d},ch=function(e,t){var l,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Wall&&o.foundationId===t&&e.has(o.id)){var i=e.get(o.id);if(i){var r,n=o,c=nh(n.lx,n.lz,i),s=Object(f.a)(Ew.getState().elements);try{for(s.s();!(r=s.n()).done;){var d=r.value;if(d.parentId===n.id){var h=d.cx,p=d.cz,y=d.lx,g=d.ly,m=d.lz;if(h*=n.lx,p*=n.lz,d.type!==V.SolarPanel?(y*=n.lx,m*=n.lz):m=g,d.type===V.Window&&d.windowType===Yt.Polygonal){var w,x=null!==(w=d.polygonTop)&&void 0!==w?w:Fg,v=Object(u.a)(x,2),b=v[0],A=v[1],T=h+b*y,P=p+m/2+A;if(!Tw.isPointInside(T,P,c))return!1}if(!Tw.isElementInsideWall(new Me.Vector3(h,0,p),y,m,c,d.type===V.Door))return!1}}}catch(S){s.e(S)}finally{s.f()}}}}}catch(S){a.e(S)}finally{a.f()}return!0},sh=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor;if(0===t.length)return null;var i=[],r=new Me.Vector3(0,0,l),n=t[0].points,c=t[1].points,s=t[2].points,d=t[3].points;i.push(c[3],c[0],n[0],n[1],n[2],c[2],s[0],d[0],d[1],s[1],c[3]);var u=Math.abs(n[0].z)<.15,f=Object(gf.jsx)(Jl.a,{points:i,lineWidth:a,color:o}),h=Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:[c[0],c[1]],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[c[2],c[3]],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[s[2],s[3]],lineWidth:a,color:o})]});return Object(gf.jsxs)(gf.Fragment,{children:[f,!u&&h,Object(gf.jsxs)("group",{position:[0,0,l],children:[f,!u&&h]}),Object(gf.jsx)(Jl.a,{points:[n[0],n[0].clone().add(r)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[n[1],n[1].clone().add(r)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[d[0],d[0].clone().add(r)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[d[1],d[1].clone().add(r)],lineWidth:a,color:o})]})})),dh=new Me.Vector3,uh=new Me.Euler,fh=new Me.Vector2,hh=new Me.Vector3(0,0,1),ph=function(e){var t=e.roofModel,l=e.foundationModel,a=t.id,i=t.cx,n=t.cy,c=t.lz,s=t.wallsId,d=t.parentId,p=t.topRidgeLeftPoint,y=t.frontRidgeLeftPoint,g=t.backRidgeLeftPoint,m=t.topRidgePoint,w=t.frontRidgePoint,x=t.backRidgePoint,v=t.textureType,b=t.color,A=void 0===b?"white":b,T=t.sideColor,P=void 0===T?"white":T,S=t.thickness,j=void 0===S?.2:S,H=t.locked,z=t.lineColor,R=void 0===z?"black":z,D=t.lineWidth,M=void 0===D?.2:D,W=t.roofType,I=t.rise,C=void 0===I?c:I,O=t.ceiling,F=void 0!==O&&O;void 0===m&&(m=p?Object(h.a)(p):[0,1]),void 0===w&&(w=y?Object(h.a)(y):[.35,.5]),void 0===x&&(x=g?Object(h.a)(g):[.35,.5]);var k=_f(a),Y=Vm.getWireframetStyle(R,M,k,H),L=Object(u.a)(Y,2);R=L[0],M=L[1];var E=Ew(si),U=Ew(qc),N=Mp(v),J=Object(r.useState)(ge.Null),G=Object(u.a)(J,2),B=G[0],q=G[1],Q=Object(r.useState)(!1),Z=Object(u.a)(Q,2),_=Z[0],$=Z[1],ee=Object(r.useRef)(null),te=Object(Se.f)(),le=te.gl,ae=te.camera,oe=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),ie=Object(r.useMemo)((function(){return new Me.Vector2}),[]),re=Object(r.useRef)([0,0]),ne=Object(r.useRef)(C),ce=Object(r.useRef)(!1),se=C<.01,de=function(e,t,l){E((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&r.type===V.Roof&&r.roofType===It.Gambrel){var n=r;switch(t){case ge.FrontLeft:case ge.FrontRight:n.frontRidgePoint=Object(h.a)(l);break;case ge.TopLeft:case ge.TopRight:n.topRidgePoint=Object(h.a)(l);break;case ge.BackLeft:case ge.BackRight:n.backRidgePoint=Object(h.a)(l)}break}}}catch(c){i.e(c)}finally{i.f()}}))},ue=function(e,t,l,a){var o={name:"Resize Gambrel Roof Ridge",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldVal:Object(h.a)(l),newVal:Object(h.a)(a),type:t,undo:function(){de(o.resizedElementId,o.type,o.oldVal)},redo:function(){de(o.resizedElementId,o.type,o.newVal)}};Ew.getState().addUndoable(o)},fe=function(e,t){$(!0),Et.getState().setEnableOrbitController(!1),dh.set(e.x,e.y,e.z).add(He),l&&t&&uh.set(vt,0,t.relativeAngle,"ZXY")},pe=function(e,t,l){var a=new Me.Vector2(e.cx,e.cy),o=Vm.getComposedWallCenter(t),i=Vm.getComposedWallLength(t),r=new Me.Vector2(o.x,o.y).rotateAround(fh,e.rotation[2]).add(a),n=e.rotation[2]+t.relativeAngle,c=new Me.Vector2(l.x,l.y).sub(r).rotateAround(fh,-n).x/i;return Math.min(Math.abs(c),.5)*(c>=0?1:-1)},ye=function(e,t,l,a){if(!e)return new Me.Vector3;var o=Vm.getComposedWallLength(e),i=new Me.Euler(0,0,e.relativeAngle),r=new Me.Vector3(t*o,0,0),n=je;a&&(n=l*(je-a.lz)+a.lz);var c=Vm.getComposedWallCenter(e);return new Me.Vector3(c.x,c.y,n).add(r.applyEuler(i))},me=function(e,t){var l,a,o=e[t];return 0===t||2===t?(l=o.lz,a=o.lz):1===t?(l=e[0].lz,a=e[2].lz):(l=e[2].lz,a=e[0].lz),{lh:l,rh:a}},we=function(e){return e.id===a&&e.type===V.Roof&&e.roofType===It.Gambrel},xe=function(e,t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value,i=o.start,r=o.end,n=o.k,c=o.b;if(t>=i&&t<=r)return n*t+c}}catch(s){a.e(s)}finally{a.f()}return null},ve=function(e,t,l,a,o,i,r){if(1===l||3===l){for(var n=3===l,c=me(t,l),s=n?o:r,d=function(e,t,l,a,o,i,r,n){var c=e[t],s=me(e,t),d=s.lh,u=s.rh,f=(new Me.Vector3).subVectors(c.leftPoint,c.rightPoint).length(),h=f/2,p=function(e){return e*f+h},y=function(e,t){return e*(l-t)+t},g=[new Me.Vector2(p(-i[0]),y(i[1],a)),new Me.Vector2(p(r[0]),l),new Me.Vector2(p(n[0]),y(n[1],o)),new Me.Vector2(f,u)];return g.map((function(e,t){return function(e,t){var l=t.x-e.x,a=(t.y-e.y)/l,o=e.y-a*e.x;return{start:e.x,end:t.x,k:a,b:o}}(0===t?new Me.Vector2(0,d):g[t-1],e)}))}(t,l,a,c.lh,c.rh,n?r:o,n?i:[-i[0],i[1]],s),u=d.slice(1).map((function(e){return e.start})),f=t[l],p=f.wallsId.reduce((function(e,t){var l=Ew.getState().elements.find((function(e){return e.id===t}));return l?[].concat(Object(h.a)(e),[l.lx+e[e.length-1]]):e}),[0]),y=0;y=w&&j<=x){var H=(j-T)/A,z=xe(d,j);null!==z&&(0===S?P.centerLeft=[H,z]:1===S?P.center=[H,z]:2===S&&(P.centerRight=[H,z]))}}e.set(g,P)}}return e}},be=function(e,t,l,a,o){var i=new Map;return ve(i,e,1,t,l,a,o),ve(i,e,3,t,l,a,o),i},Ae=Cp(s[0],d),Te=Op(Ae,C,!0),Pe=Te.highestWallHeight,je=Te.topZ;Lp(t,Pe);var He=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae.map((function(e){return{x:e.leftPoint.x,y:e.leftPoint.y}})),t=Tw.calculatePolygonCentroid(e);return new Me.Vector3(t.x,t.y,je)}),[Ae,je]),ze=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[3],t=m,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,a,o).sub(He)}),[Ae,He,m]),Re=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[1],t=m,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,-a,o).sub(He)}),[Ae,He,m]),De=Object(r.useMemo)((function(){return(new Me.Vector3).addVectors(ze,Re).divideScalar(2)}),[ze,Re]),We=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[3],t=w,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,a,o,Ae[0]).sub(He)}),[Ae,He,w]),Ie=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[1],t=w,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,-a,o,Ae[0]).sub(He)}),[Ae,He,w]),Ce=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[1],t=x,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,a,o,Ae[2]).sub(He)}),[Ae,He,x]),Oe=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[3],t=x,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,-a,o,Ae[2]).sub(He)}),[Ae,He,x]),Fe=Object(r.useMemo)((function(){return Ae&&4===Ae.length?Ae.map((function(e){return Vm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)})):[]}),[Ae]),ke=Object(r.useMemo)((function(){return hh.clone().multiplyScalar(j)}),[j]),Ye=Object(r.useMemo)((function(){var e,t,l,a,o=[];if(!Ae||4!==Ae.length)return o;var i=Object(u.a)(Ae,4),r=i[0],n=(i[1],i[2]),c=(i[3],Object(u.a)(Fe,4)),s=c[0],d=c[1],f=c[2],h=c[3],p=r.leftPoint,y=r.rightPoint,g=n.leftPoint,m=n.rightPoint,w=p.clone().add(s),x=y.clone().add(s),v=m.clone().add(h),b=p.clone().add(h),A=y.clone().add(d),T=g.clone().add(d),P=g.clone().add(f),S=m.clone().add(f),j=[],H=me(Ae,0),z=H.lh,R=H.rh,D=Vm.getDistance(p,y,We.clone().add(He)),M=Math.min((null!==(e=r.eavesLength)&&void 0!==e?e:0)/D*(We.clone().add(He).z-z),z),W=Vm.getDistance(p,y,Ie.clone().add(He)),I=Math.min((null!==(t=r.eavesLength)&&void 0!==t?t:0)/W*(Ie.clone().add(He).z-R),R),C=Vm.getIntersectionPoint(v,b,w,x).setZ(z-M).sub(He),O=Vm.getIntersectionPoint(w,x,A,T).setZ(R-I).sub(He),F=Vm.getIntersectionPoint(We,Ie,v.clone().sub(He),b.clone().sub(He)).setZ(We.z),k=Vm.getIntersectionPoint(Ie,We,A.clone().sub(He),T.clone().sub(He)).setZ(Ie.z);j.push(C,O,k,F),j.push(C.clone().add(ke),O.clone().add(ke),k.clone().add(ke),F.clone().add(ke));var Y=Vm.getComposedWallCenter(r),L=-r.relativeAngle,E=new Me.Vector3(Y.x,Y.y).sub(De.clone().setZ(0)).length();o.push({points:j,angle:L,length:E});var U=[],N=Vm.getIntersectionPoint(ze,Re,v.clone().sub(He),b.clone().sub(He)).setZ(ze.z),V=Vm.getIntersectionPoint(ze,Re,A.clone().sub(He),T.clone().sub(He)).setZ(Re.z);U.push(F,k,V,N),U.push(F.clone().add(ke),k.clone().add(ke),V.clone().add(ke),N.clone().add(ke)),o.push({points:U,angle:L,length:E});var J=-n.relativeAngle,G=me(Ae,2),X=G.lh,B=G.rh,K=Vm.getDistance(g,m,Ce.clone().add(He)),q=Math.min((null!==(l=n.eavesLength)&&void 0!==l?l:0)/K*(Ce.clone().add(He).z-X),X),Q=Vm.getDistance(g,m,Oe.clone().add(He)),Z=Math.min((null!==(a=n.eavesLength)&&void 0!==a?a:0)/Q*(Oe.clone().add(He).z-B),B),_=Vm.getIntersectionPoint(A,T,P,S).setZ(X-q).sub(He),$=Vm.getIntersectionPoint(P,S,v,b).setZ(B-Z).sub(He),ee=Vm.getIntersectionPoint(Ce,Oe,A.clone().sub(He),T.clone().sub(He)).setZ(Oe.z),te=Vm.getIntersectionPoint(Oe,Ce,v.clone().sub(He),b.clone().sub(He)).setZ(Oe.z),le=Vm.getComposedWallCenter(n),ae=new Me.Vector3(le.x,le.y).sub(De.clone().setZ(0)).length(),oe=[];oe.push(ee,te,N,V),oe.push(ee.clone().add(ke),te.clone().add(ke),N.clone().add(ke),V.clone().add(ke)),o.push({points:oe,angle:J,length:ae});var ie=[];return ie.push(_,$,te,ee),ie.push(_.clone().add(ke),$.clone().add(ke),te.clone().add(ke),ee.clone().add(ke)),o.push({points:ie,angle:J,length:ae}),o}),[Ae,je,j,m,w,x]),Le=Object(r.useMemo)((function(){return Ae&&4===Ae.length?Ae.map((function(e){return e.leftPoint})):null}),[Ae]);Object(r.useEffect)((function(){Ae&&4===Ae.length||U(a,!1,!1,!0)}),[Ae]);var Ee=Ep();Object(r.useEffect)((function(){4===(null===Ae||void 0===Ae?void 0:Ae.length)&&(!Ew.getState().addedRoofIdSet.has(a)&&Ee||(se?function(e){var t,l=new Set,a=Object(f.a)(e);try{for(a.s();!(t=a.n()).done;)t.value.wallsId.forEach((function(e){return l.add(e)}))}catch(o){a.e(o)}finally{a.f()}E((function(e){var t,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Wall&&i.foundationId===d&&l.has(i.id)){var r=i;r.leftRoofHeight=je,r.rightRoofHeight=je,r.centerLeftRoofHeight=void 0,r.centerRightRoofHeight=void 0,r.centerRoofHeight=void 0}}}catch(o){a.e(o)}finally{a.f()}}))}(Ae):function(e,t,l,o,i){var r=new Set(e[0].wallsId),n=new Set(e[2].wallsId),c=be(e,t,l,o,i);E((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&i.foundationId===d)if(r.has(i.id)){var s=i,h=me(e,0),p=h.lh,y=h.rh;s.roofId=a,s.leftRoofHeight=p,s.rightRoofHeight=y}else if(n.has(i.id)){var g=i,m=me(e,2),w=m.lh,x=m.rh;g.roofId=a,g.leftRoofHeight=w,g.rightRoofHeight=x}else if(c.has(i.id)){var v=c.get(i.id);if(v){var b=i,A=v.left,T=v.right,P=v.center,S=v.centerLeft,j=v.centerRight;if(b.roofId=a,b.leftRoofHeight=A,b.rightRoofHeight=T,S){var H=Object(u.a)(S,2),z=H[0],R=H[1];b.centerLeftRoofHeight?(b.centerLeftRoofHeight[0]=z,b.centerLeftRoofHeight[1]=R):b.centerLeftRoofHeight=[z,R]}else b.centerLeftRoofHeight=void 0;if(P){var D=Object(u.a)(P,2),M=D[0],W=D[1];b.centerRoofHeight?(b.centerRoofHeight[0]=M,b.centerRoofHeight[1]=W):b.centerRoofHeight=[M,W]}else b.centerRoofHeight=void 0;if(j){var I=Object(u.a)(j,2),C=I[0],O=I[1];b.centerRightRoofHeight?(b.centerRightRoofHeight[0]=C,b.centerRightRoofHeight[1]=O):b.centerRightRoofHeight=[C,O]}else b.centerRightRoofHeight=void 0}}}}catch(F){o.e(F)}finally{o.f()}}))}(Ae,je,w,m,x),bp(l,a,Ye,He,je,j,se),Ew.getState().deleteAddedRoofId(a)))}),[Ye]),Up(l,a,Ye,He,je,j,se);var Ue=kp(a,He,Ye,se,It.Gambrel);Yp((function(){var e=[];if(!Ae||4!==Ae.length)return e;var t=Ae.map((function(e,t,l){return new Me.Vector3(e.leftPoint.x,e.leftPoint.y,me(l,t).lh)})),l=We.clone().add(He),o=Ie.clone().add(He),i=Ce.clone().add(He),r=Oe.clone().add(He),n=ze.clone().add(He),c=Re.clone().add(He);e.push([t[0],t[1],o,l]),e.push([l,o,c,n]),e.push([n,c,i,r]),e.push([t[2],t[3],r,i]),se?Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,[t]):Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}));var Ne=Ew((function(e){return e.elements.filter((function(e){return e.parentId===a&&e.type===V.Window}))}),Zf.a),Ve=Ew(is),Je=Tf(Ns),Ge=Ew(o.solarRadiationHeatmapMaxValue),Xe=Pf(wi),Be=Object(r.useState)(null),Ke=Object(u.a)(Be,2),qe=Ke[0],Qe=Ke[1],Ze=Object(r.useState)([]),_e=Object(u.a)(Ze,2),$e=_e[0],et=_e[1];Object(r.useEffect)((function(){if(Je)if(se){var e=Xe(a);if(e){var t=Tw.fetchHeatmapTexture(e,null!==Ge&&void 0!==Ge?Ge:5);if(t){var o=Ue();if(o&&o.length>0&&l){var i,r=new Me.Euler(0,0,l.rotation[2],"ZYX"),n=Number.MAX_VALUE,c=Number.MAX_VALUE,s=-Number.MAX_VALUE,d=-Number.MAX_VALUE,u=Object(f.a)(o);try{for(u.s();!(i=u.n()).done;){var h,p=i.value,y=Object(f.a)(p);try{for(y.s();!(h=y.n()).done;){var g=h.value.clone().applyEuler(r);g.x>s&&(s=g.x),g.xd&&(d=g.y),g.y0){for(var A=[],T=0;T0&&Ae[0].lz===Ae[2].lz&&Le&&Object(gf.jsx)(Qf,{cz:Ae[0].lz,points:Le}),k&&!H&&Object(gf.jsxs)("group",{position:[He.x,He.y,He.z+j],children:[Object(gf.jsx)(jp,{position:[De.x,De.y,De.z],onPointerDown:function(e){if(Ve(t.id,e,X.Select),ce.current=!0,ne.current=C,$(!0),dh.set(De.x,De.y,je).add(He),l){var a=-Math.atan2(ae.position.x-i,ae.position.y-n)-l.rotation[2];uh.set(-vt,0,a,"ZXY")}q(ge.TopMid),Et.getState().setEnableOrbitController(!1),E((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=je+t.thickness}))},onPointerOver:function(){E((function(e){e.hoveredHandle=ge.TopMid,e.selectedElementHeight=je+t.thickness,e.selectedElementX=De.x,e.selectedElementY=De.y}))}}),!se&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(jp,{position:[ze.x,ze.y,ze.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(m),fe(ze,Ae[3]),q(ge.TopLeft)}}),Object(gf.jsx)(jp,{position:[Re.x,Re.y,Re.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(m),fe(Re,Ae[1]),q(ge.TopRight)}}),Object(gf.jsx)(jp,{position:[We.x,We.y,We.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(w),fe(We,Ae[3]),q(ge.FrontLeft)}}),Object(gf.jsx)(jp,{position:[Ie.x,Ie.y,Ie.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(w),fe(Ie,Ae[1]),q(ge.FrontRight)}}),Object(gf.jsx)(jp,{position:[Ce.x,Ce.y,Ce.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(x),fe(Ce,Ae[1]),q(ge.BackLeft)}}),Object(gf.jsx)(jp,{position:[Oe.x,Oe.y,Oe.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(x),fe(Oe,Ae[3]),q(ge.BackRight)}})]})]}),_&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:ee,args:[1e3,100],visible:!1,position:dh,rotation:uh,onPointerMove:function(e){if(ee.current&&ce.current&&Ae&&4===Ae.length){!function(e){ie.x=e.offsetX/le.domElement.clientWidth*2-1,ie.y=-e.offsetY/le.domElement.clientHeight*2+1,oe.setFromCamera(ie,ae)}(e);var o=oe.intersectObjects([ee.current]);if(o[0]&&l){var i=o[0].point;if(i.z<.001)return;switch(B){case ge.TopMid:var r=Math.max(0,i.z-l.lz-.3-Pe),n=Pe+r,c=be(Ae,n,w,m,x);ch(c,d)&&Ew.getState().updateRoofRiseById(a,r,n+t.thickness);break;case ge.FrontLeft:if(l&&Ae&&4===Ae.length){var s=Tw.clamp(pe(l,Ae[3],i),m[0]+.05,.45),u=je-Ae[0].lz,f=[s,Tw.clamp((i.z-l.lz-Ae[0].lz)/u,0,1)],h=be(Ae,je,f,m,x);ch(h,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.frontRidgePoint[0]=f[0],t.frontRidgePoint[1]=f[1])}))}break;case ge.FrontRight:if(l&&Ae&&4===Ae.length){var p=Tw.clamp(pe(l,Ae[1],i),-.45,-m[0]-.05),y=je-Ae[0].lz,g=[-p,Tw.clamp((i.z-l.lz-Ae[0].lz)/y,0,1)],v=be(Ae,je,g,m,x);ch(v,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.frontRidgePoint=[].concat(g))}))}break;case ge.TopLeft:if(l&&Ae&&4===Ae.length){var b=[Tw.clamp(pe(l,Ae[3],i),.05-x[0],w[0]-.05),m[1]],A=be(Ae,je,w,b,x);ch(A,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.topRidgePoint=[].concat(b))}))}break;case ge.TopRight:if(l&&Ae&&4===Ae.length){var T=[-Tw.clamp(pe(l,Ae[1],i),.05-w[0],x[0]-.05),m[1]],P=be(Ae,je,w,T,x);ch(P,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.topRidgePoint=[].concat(T))}))}break;case ge.BackLeft:if(l&&Ae&&4===Ae.length){var S=Tw.clamp(pe(l,Ae[1],i),.05-m[0],.45),j=je-Ae[2].lz,H=[S,Tw.clamp((i.z-l.lz-Ae[2].lz)/j,0,1)],z=be(Ae,je,w,m,H);ch(z,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.backRidgePoint=[].concat(H))}))}break;case ge.BackRight:if(l&&Ae&&4===Ae.length){var R=Tw.clamp(pe(l,Ae[3],i),-.45,m[0]-.05),D=je-Ae[2].lz,M=[-R,Tw.clamp((i.z-l.lz-Ae[2].lz)/D,0,1)],W=be(Ae,je,w,m,M);ch(W,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.backRidgePoint=[].concat(M))}))}}}}},onPointerUp:function(){switch(B){case ge.TopMid:wp(a,ne.current,C);break;case ge.TopLeft:case ge.TopRight:ue(a,B,re.current,m);break;case ge.FrontLeft:case ge.FrontRight:ue(a,B,re.current,w);break;case ge.BackLeft:case ge.BackRight:ue(a,B,re.current,x)}ce.current=!1,$(!1),q(ge.Null),Et.getState().setEnableOrbitController(!0)},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,transparent:!0,opacity:.5})})]}):null},yh=n.a.memo(ph,zp),gh=new Me.Vector3,mh=new Me.Euler,wh=new Me.Vector2,xh=new Me.Vector3(0,0,1),vh=n.a.memo((function(e){var t=e.start,l=e.end,a=e.width,o=e.height,i=e.offset,n=e.color,c=Object(r.useMemo)((function(){return new Me.Vector2(t.x,t.y)}),[t]),s=Object(r.useMemo)((function(){return new Me.Vector2(l.x,l.y)}),[l]),d=Object(r.useMemo)((function(){return(new Me.Vector2).subVectors(s,c).angle()}),[c,s]),u=Object(r.useMemo)((function(){var e=new Me.Shape,a=c.distanceTo(s),i=t.z-l.z;return e.moveTo(0,0),e.lineTo(a,-i),e.lineTo(a,-i+o),e.lineTo(0,o),e.closePath(),e}),[t,l,c,s,o]);return Object(gf.jsx)("group",{position:i,children:Object(gf.jsx)(Lt.e,{args:[u,{steps:1,depth:a,bevelEnabled:!1}],position:t,rotation:[vt,0,d,"ZXY"],castShadow:!0,receiveShadow:!0,children:Object(gf.jsx)("meshStandardMaterial",{color:n})})})})),bh=function(e){var t=e.ridgeLeftPoint,l=e.ridgeRightPoint,a=e.wallArray,o=e.height,i=e.isShed,c=e.width,s=e.spacing,d=e.color,f=Object(u.a)(a,4),h=f[0],p=f[1],y=f[2],g=f[3],m=Object(r.useMemo)((function(){return(new Me.Vector3).subVectors(l,t).normalize()}),[]),w=Object(r.useMemo)((function(){var e;return t.clone().add(m.clone().multiplyScalar(-(null!==(e=g.eavesLength)&&void 0!==e?e:0)/2))}),[t,g.eavesLength]),x=Object(r.useMemo)((function(){var e;return l.clone().add(m.clone().multiplyScalar((null!==(e=p.eavesLength)&&void 0!==e?e:0)/2))}),[t,p.eavesLength]),v=h.leftPoint.clone().setZ(h.lz),b=y.rightPoint.clone().setZ(y.lz),A=Object(r.useMemo)((function(){if(a.length<4)return[];var e=(new Me.Vector3).subVectors(new Me.Vector3(h.rightPoint.x,h.rightPoint.y,h.lz),v).normalize(),o=(new Me.Vector3).subVectors(new Me.Vector3(y.leftPoint.x,y.leftPoint.y,y.lz),b).normalize(),i=t.distanceTo(l),r=(new Me.Vector3).subVectors(h.leftPoint,h.rightPoint).length(),n=(new Me.Vector3).subVectors(y.leftPoint,y.rightPoint).length(),d=c,u=Math.floor((Math.min(i,r,n)-c)/s)+2;return new Array(u).fill(0).map((function(l,a){var r,n,c;c=a===u-1?i:a*s+d;var f=t.clone().add(m.clone().multiplyScalar(c)),p=v.clone().add(e.clone().multiplyScalar(c)),g=b.clone().add(o.clone().multiplyScalar(c)),w=(new Me.Vector3).subVectors(p,f).normalize().multiplyScalar(null!==(r=h.eavesLength)&&void 0!==r?r:0),x=(new Me.Vector3).subVectors(g,f).normalize().multiplyScalar(null!==(n=y.eavesLength)&&void 0!==n?n:0);return p.add(w),g.add(x),{ridge:f,front:p,back:g}}))}),[s,t]),T=t.distanceTo(v)>t.distanceTo(b),P=new Me.Vector3(-c,0,0),S=new Me.Vector3(0,c/2,0);return Object(gf.jsxs)(gf.Fragment,{children:[A.map((function(e,t){return Object(gf.jsx)(n.a.Fragment,{children:i?T?Object(gf.jsx)(vh,{start:e.ridge,end:e.front,width:c,height:o,color:d}):Object(gf.jsx)(vh,{start:e.ridge,end:e.back,width:c,height:o,color:d}):Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(vh,{start:e.ridge,end:e.front,width:c,height:o,color:d}),Object(gf.jsx)(vh,{start:e.ridge,end:e.back,width:c,height:o,color:d,offset:P})]})},t)})),Object(gf.jsx)(vh,{start:w,end:x,width:c,height:o,color:d,offset:S})]})},Ah=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor;if(0===t.length)return null;var i,r=[],n=new Me.Vector3(0,0,l),c=1===t.length,s=Object(f.a)(t);try{for(s.s();!(i=s.n()).done;){var d=i.value,h=Object(u.a)(d.points,4),p=h[0],y=h[1],g=h[2],m=h[3];r.push(m,p,y,g),c&&r.push(m)}}catch(T){s.e(T)}finally{s.f()}var w=Math.abs(t[0].points[0].z)<.015,x=t[0].points[3],v=t[0].points[2],b=Object(gf.jsx)(Jl.a,{points:r,lineWidth:a,color:o}),A=Object(gf.jsx)(Jl.a,{points:[x,v],lineWidth:a,color:o});return Object(gf.jsxs)(gf.Fragment,{children:[b,!w&&!c&&A,Object(gf.jsxs)("group",{position:[0,0,l],children:[b,!w&&!c&&A]}),t.map((function(e,t){var l=Object(u.a)(e.points,4),i=l[0],r=l[1],s=l[2],d=l[3];return Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Jl.a,{points:[i,i.clone().add(n)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[r,r.clone().add(n)],lineWidth:a,color:o}),c&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:[s,s.clone().add(n)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[d,d.clone().add(n)],lineWidth:a,color:o})]})]},t)}))]})})),Th=function(e){var t=e.roofModel,l=e.foundationModel,a=t.id,i=t.parentId,n=t.wallsId,c=t.lz,s=t.rise,d=void 0===s?c:s,p=t.thickness,y=void 0===p?.2:p,g=t.ridgeLeftPoint,m=t.ridgeRightPoint,w=t.textureType,x=t.color,v=void 0===x?"white":x,b=t.sideColor,A=void 0===b?"white":b,T=t.locked,P=t.lineColor,S=void 0===P?"black":P,j=t.lineWidth,H=void 0===j?.2:j,z=t.roofStructure,R=t.rafterSpacing,D=void 0===R?2:R,M=t.rafterWidth,W=void 0===M?.1:M,I=t.rafterColor,C=void 0===I?"white":I,O=t.glassTint,F=void 0===O?"#73D8FF":O,k=t.opacity,Y=void 0===k?.5:k,L=t.ceiling,E=void 0!==L&&L,U=Ew(si),N=Ew(qc),J=_f(a),G=Vm.getWireframetStyle(S,H,J,T),B=Object(u.a)(G,2);S=B[0],H=B[1];var q=Object(Se.f)(),Q=q.gl,Z=q.camera,_=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),$=Object(r.useMemo)((function(){return new Me.Vector2}),[]),ee=Object(r.useState)(!1),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useState)(ge.Null),ie=Object(u.a)(oe,2),re=ie[0],ne=ie[1],ce=Math.abs(g[0])>.45,se=Object(r.useRef)(null),de=Object(r.useRef)(g[0]),ue=Object(r.useRef)(m[0]),fe=Object(r.useRef)(d),he=Object(r.useRef)(!1),pe=function(e,t,l){U((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&r.type===V.Roof&&r.roofType===It.Gable){r.ridgeLeftPoint[0]=t,r.ridgeRightPoint[0]=l;break}}}catch(n){i.e(n)}finally{i.f()}}))},ye=function(e,t,l){var a=new Me.Vector2(e.cx,e.cy),o=(new Me.Vector3).addVectors(t.leftPoint,t.rightPoint).divideScalar(2),i=(new Me.Vector3).subVectors(t.leftPoint,t.rightPoint).length(),r=new Me.Vector2(o.x,o.y).rotateAround(wh,e.rotation[2]).add(a),n=e.rotation[2]+t.relativeAngle,c=new Me.Vector2(l.x,l.y).sub(r).rotateAround(wh,-n).x/i;return Math.min(Math.abs(c),.5)*(c>=0?1:-1)},me=function(e,t,l){if(!e)return new Me.Vector3;var a=(new Me.Vector3).subVectors(e.leftPoint,e.rightPoint).length(),o=(new Me.Vector3).addVectors(e.leftPoint,e.rightPoint).divideScalar(2),i=new Me.Euler(0,0,e.relativeAngle),r=new Me.Vector3(t*a,0,0),n=l*d+He;return new Me.Vector3(o.x,o.y,n).add(r.applyEuler(i))},we=function(e,t){var l,a,o=e[t];return 0===t||2===t?(l=o.lz,a=o.lz):1===t?(l=e[0].lz,a=e[2].lz):(l=e[2].lz,a=e[0].lz),{lh:l,rh:a}},xe=function(e,t){var l=e.slice().reverse();return ve(l,0,t-1),ve(l,t,l.length-1),l},ve=function(e,t,l){for(;tn&&(T.center=[(n-v)/A-.5,a]),e.set(w,T)}return e},Te=function(e,t,l,a){var o=new Map;return Ae(o,e,1,t,a),Ae(o,e,3,t,l),o},Pe=Cp(n[0],i),je=Op(Pe,d,!0),He=je.highestWallHeight,ze=je.topZ;Lp(t,He);var Re=Object(r.useMemo)((function(){if(null===Pe||4!==Pe.length)return new Me.Vector3;var e=Pe.map((function(e){return{x:e.leftPoint.x,y:e.leftPoint.y}})),t=Tw.calculatePolygonCentroid(e);return new Me.Vector3(t.x,t.y,ze)}),[Pe,ze]),De=Object(r.useMemo)((function(){if(null===Pe)return new Me.Vector3;var e=Pe[3],t=Object(u.a)(g,2),l=t[0],a=t[1];return me(e,l,a)}),[Pe,ze,g]),We=Object(r.useMemo)((function(){if(null===Pe)return new Me.Vector3;var e=Pe[1],t=Object(u.a)(m,2),l=t[0],a=t[1];return me(e,l,a)}),[Pe,ze,m]),Ie=Object(r.useMemo)((function(){return new Me.Vector3((De.x+We.x)/2,(De.y+We.y)/2,ze)}),[De,We]),Ce=Object(r.useMemo)((function(){return Pe&&4===Pe.length?Pe.map((function(e){return Vm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)})):null}),[Pe]),Oe=Object(r.useMemo)((function(){return xh.clone().multiplyScalar(y)}),[y]),Fe=Object(r.useMemo)((function(){var e=[];if(!Pe||4!==Pe.length||!Ce)return e;if(ce){var t,l,a,o,i=[],r=g[0]<0?0:2,n=xe(Pe,r),c=xe(Ce,r),s=Object(u.a)(n,4),d=s[0],f=(s[1],s[2]),h=(s[3],Object(u.a)(c,4)),p=h[0],y=h[1],m=h[2],w=h[3],x=d.leftPoint,v=d.rightPoint,b=f.leftPoint,A=f.rightPoint,T=x.clone().add(p),P=v.clone().add(p),S=A.clone().add(w),j=x.clone().add(w),H=v.clone().add(y),z=b.clone().add(y),R=b.clone().add(m),D=A.clone().add(m),M=we(n,0),W=M.lh,I=M.rh,C=we(n,2),O=C.lh,F=C.rh,k=Vm.getDistance(x,v,A),Y=Math.min((null!==(t=d.eavesLength)&&void 0!==t?t:0)/k*(ze-W),W),L=Vm.getDistance(x,v,b),E=Math.min((null!==(l=d.eavesLength)&&void 0!==l?l:0)/L*(ze-I),I),U=Vm.getDistance(b,A,v),N=Math.min((null!==(a=f.eavesLength)&&void 0!==a?a:0)/U*(ze-I),O),V=Vm.getDistance(b,A,x),J=Math.min((null!==(o=f.eavesLength)&&void 0!==o?o:0)/V*(ze-W),F),G=Vm.getIntersectionPoint(S,j,T,P).setZ(W-Y).sub(Re),X=Vm.getIntersectionPoint(T,P,H,z).setZ(I-E).sub(Re),B=Vm.getIntersectionPoint(H,z,R,D).setZ(ze+N).sub(Re),K=Vm.getIntersectionPoint(R,D,S,j).setZ(ze+J).sub(Re);i.push(G,X,B,K),i.push(G.clone().add(Oe),X.clone().add(Oe),B.clone().add(Oe),K.clone().add(Oe));var q=(new Me.Vector3).addVectors(d.leftPoint,d.rightPoint).divideScalar(2).clone().sub(Ie.clone().setZ(0)).length();e.push({points:i,angle:-d.relativeAngle,length:q})}else{var Q,Z,_,$,ee=Object(u.a)(Pe,4),te=ee[0],le=(ee[1],ee[2]),ae=(ee[3],Object(u.a)(Ce,4)),oe=ae[0],ie=ae[1],re=ae[2],ne=ae[3],se=te.leftPoint.clone().add(oe),de=te.rightPoint.clone().add(oe),ue=le.rightPoint.clone().add(ne),fe=te.leftPoint.clone().add(ne),he=te.rightPoint.clone().add(ie),pe=le.leftPoint.clone().add(ie),ye=le.leftPoint.clone().add(re),ge=le.rightPoint.clone().add(re),me=Vm.getIntersectionPoint(De,We,ue.clone(),fe.clone()).setZ(De.z).sub(Re),ve=Vm.getIntersectionPoint(De,We,he.clone(),pe.clone()).setZ(We.z).sub(Re),be=[],Ae=we(Pe,0),Te=Ae.lh,Se=Ae.rh,je=Vm.getDistance(te.leftPoint,te.rightPoint,De),He=Math.min((null!==(Q=te.eavesLength)&&void 0!==Q?Q:0)/je*(De.z-Te),Te),Fe=Vm.getDistance(te.leftPoint,te.rightPoint,We),ke=Math.min((null!==(Z=te.eavesLength)&&void 0!==Z?Z:0)/Fe*(We.z-Se),Se),Ye=Vm.getIntersectionPoint(ue,fe,se,de).setZ(Te-He).sub(Re),Le=Vm.getIntersectionPoint(se,de,he,pe).setZ(Se-ke).sub(Re);be.push(Ye,Le,ve,me),be.push(Ye.clone().add(Oe),Le.clone().add(Oe),ve.clone().add(Oe),me.clone().add(Oe));var Ee=(new Me.Vector3).addVectors(te.leftPoint,te.rightPoint).divideScalar(2).clone().sub(Re.clone().setZ(0)).length();e.push({points:be,angle:-te.relativeAngle,length:Ee});var Ue=[],Ne=we(Pe,2),Ve=Ne.lh,Je=Ne.rh,Ge=Vm.getDistance(le.leftPoint,le.rightPoint,We),Xe=Math.min((null!==(_=le.eavesLength)&&void 0!==_?_:0)/Ge*(We.z-Ve),Ve),Be=Vm.getDistance(le.leftPoint,le.rightPoint,De),Ke=Math.min((null!==($=le.eavesLength)&&void 0!==$?$:0)/Be*(De.z-Je),Je),qe=Vm.getIntersectionPoint(he,pe,ye,ge).setZ(Ve-Xe).sub(Re),Qe=Vm.getIntersectionPoint(ye,ge,ue,fe).setZ(Je-Ke).sub(Re);Ue.push(qe,Qe,me,ve),Ue.push(qe.clone().add(Oe),Qe.clone().add(Oe),me.clone().add(Oe),ve.clone().add(Oe));var Ze=(new Me.Vector3).addVectors(le.leftPoint,le.rightPoint).divideScalar(2).clone().sub(Re.clone().setZ(0)).length();e.push({points:Ue,angle:-le.relativeAngle,length:Ze})}return e}),[Pe,De,We,ze,y]),ke=Object(r.useMemo)((function(){return Pe&&4===Pe.length?Pe.map((function(e){return e.leftPoint})):null}),[Pe]);Object(r.useEffect)((function(){Pe&&4===Pe.length||N(a,!1,!1,!0)}),[Pe]);var Ye=Ep();Object(r.useEffect)((function(){4===(null===Pe||void 0===Pe?void 0:Pe.length)&&(!Ew.getState().addedRoofIdSet.has(a)&&Ye||(!function(e,t,l,o){var r=Object(u.a)(e,4),n=r[0],c=(r[1],r[2]),s=(r[3],new Set(n.wallsId)),d=new Set(c.wallsId),h=Te(e,t,l,o);U((function(o){var r,n=Object(f.a)(o.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===i)if(s.has(c.id)){var p=c;if(p.roofId=a,.5===l[0])p.leftRoofHeight=t,p.rightRoofHeight=t,p.centerRoofHeight=void 0;else{var y=we(e,0),g=y.lh,m=y.rh;p.leftRoofHeight=g,p.rightRoofHeight=m}}else if(d.has(c.id)){var w=c;if(w.roofId=a,-.5===l[0])w.leftRoofHeight=t,w.rightRoofHeight=t,w.centerRoofHeight=void 0;else{var x=we(e,2),v=x.lh,b=x.rh;w.leftRoofHeight=v,w.rightRoofHeight=b}}else if(h.has(c.id)){var A=h.get(c.id);if(A){var T=c,P=A.left,S=A.right,j=A.center;if(T.roofId=a,T.leftRoofHeight=P,T.rightRoofHeight=S,j){var H=Object(u.a)(j,2),z=H[0],R=H[1];T.centerRoofHeight?(T.centerRoofHeight[0]=z,T.centerRoofHeight[1]=R):T.centerRoofHeight=[z,R]}else T.centerRoofHeight=void 0}}}}catch(D){n.e(D)}finally{n.f()}}))}(Pe,ze,g,m),bp(l,a,Fe,Re,ze,y),Ew.getState().deleteAddedRoofId(a)))}),[Fe]),Up(l,a,Fe,Re,ze,y);kp(a,Re,Fe,!1,It.Gable),Yp((function(){if(Pe&&4===Pe.length){var e=[];if(ce){var t=g[0]<0?0:2,l=xe(Pe,t).map((function(e,t,l){return new Me.Vector3(e.leftPoint.x,e.leftPoint.y,we(l,t).lh)}));e.push(l)}else{var o=Pe.map((function(e,t,l){return new Me.Vector3(e.leftPoint.x,e.leftPoint.y,we(l,t).lh)}));e.push([o[0],o[1],We.clone(),De.clone()]),e.push([o[2],o[3],De.clone(),We.clone()])}Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}}));var Le=Ew((function(e){return e.elements.filter((function(e){return e.parentId===a&&e.type===V.Window}))}),Zf.a),Ee=Ew(is),Ue=Tf(Ns),Ne=Ew(o.solarRadiationHeatmapMaxValue),Ve=Pf(wi),Je=Object(r.useState)([]),Ge=Object(u.a)(Je,2),Xe=Ge[0],Be=Ge[1];Object(r.useEffect)((function(){if(Ue){var e=Fe.length;if(e>0){for(var t=[],l=0;l0&&Object(gf.jsx)(Ah,{roofSegments:Fe,thickness:y,lineColor:S,lineWidth:z===Ct.Rafter?.1:H})]}),E&&d>0&&Pe[0].lz===Pe[2].lz&&ke&&Object(gf.jsx)(Qf,{cz:Pe[0].lz,points:ke}),z===Ct.Rafter&&Pe&&4===Pe.length&&Object(gf.jsx)("group",{onContextMenu:function(e){Sp(e,a)},onPointerDown:function(e){mp(e,a,i)},children:Object(gf.jsx)(bh,{ridgeLeftPoint:De,ridgeRightPoint:We,wallArray:Pe,overhang:0,isShed:ce,height:y,spacing:D,color:C,width:W})}),J&&!T&&Object(gf.jsxs)("group",{position:[0,0,y],children:[Object(gf.jsx)(jp,{position:[Ie.x,Ie.y,Ie.z+.15],onPointerDown:function(e){if(Ee(t.id,e,X.Select),he.current=!0,fe.current=d,ae(!0),gh.set(Ie.x,Ie.y,ze),l){var a=-Math.atan2(Z.position.x-l.cx,Z.position.y-l.cy)-l.rotation[2];mh.set(-vt,0,a,"ZXY")}ne(ge.Mid),Et.getState().setEnableOrbitController(!1),U((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=ze+t.thickness}))},onPointerOver:function(){U((function(e){e.hoveredHandle=ge.Mid,e.selectedElementHeight=ze+t.thickness,e.selectedElementX=Ie.x,e.selectedElementY=Ie.y}))}}),Object(gf.jsx)(jp,{position:[De.x,De.y,De.z+.15],onPointerDown:function(){if(he.current=!0,de.current=g[0],ue.current=m[0],ae(!0),gh.set(De.x,De.y,ze),l&&Pe&&Pe[3]){var e=(new Me.Vector3).subVectors(De,Z.position).normalize(),t=Math.atan2(e.z,Math.hypot(e.x,e.y)),a=Pe[3].relativeAngle;mh.set(-vt+t,0,a,"ZXY")}ne(ge.Left),Et.getState().setEnableOrbitController(!1)}}),Object(gf.jsx)(jp,{position:[We.x,We.y,We.z+.15],onPointerDown:function(){if(he.current=!0,de.current=g[0],ue.current=m[0],ae(!0),gh.set(We.x,We.y,ze),l&&Pe&&Pe[1]){var e=(new Me.Vector3).subVectors(We,Z.position).normalize(),t=Math.atan2(e.z,Math.hypot(e.x,e.y)),a=Pe[1].relativeAngle;mh.set(-vt+t,0,a,"ZXY")}ne(ge.Right),Et.getState().setEnableOrbitController(!1)}})]}),le&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:se,args:[1e3,100],visible:!1,position:gh,rotation:mh,onPointerMove:function(e){if(se.current&&he.current&&l&&Pe&&4===Pe.length){!function(e){$.x=e.offsetX/Q.domElement.clientWidth*2-1,$.y=-e.offsetY/Q.domElement.clientHeight*2+1,_.setFromCamera($,Z)}(e);var o=_.intersectObjects([se.current]);if(o[0]){var r=o[0].point;if(r.z<.001)return;switch(re){case ge.Left:var n=Pe[3];if(n){var c=ye(l,n,r);Math.abs(c)>=.45&&Math.abs(c)<.5&&(c=.45*Math.sign(c));var s=[c,g[1]],d=[-c,m[1]],u=Te(Pe,ze,s,d);ch(u,i)&&pe(a,c,-c)}break;case ge.Right:var f=Pe[1];if(f){var h=ye(l,f,r);Math.abs(h)>=.45&&Math.abs(h)<.5&&(h=.45*Math.sign(h));var p=[-h,g[1]],y=[h,m[1]],w=Te(Pe,ze,p,y);ch(w,i)&&pe(a,-h,h)}break;case ge.Mid:var x;x=ce?Math.max(0,r.z-l.lz-.3-He):r.z-l.lz-.3-He;var v=Te(Pe,He+x,g,m);ch(v,i)&&Ew.getState().updateRoofRiseById(a,x,ze+t.thickness)}}}},onPointerUp:function(){switch(re){case ge.Mid:wp(a,fe.current,d);break;case ge.Left:case ge.Right:!function(e,t,l,a,o){var i={name:"Resize Gable Roof Ridge",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldLeft:t,oldRight:l,newLeft:a,newRight:o,undo:function(){pe(i.resizedElementId,t,l)},redo:function(){pe(i.resizedElementId,a,o)}};Ew.getState().addUndoable(i)}(a,de.current,ue.current,g[0],m[0])}he.current=!1,ae(!1),ne(ge.Null),Et.getState().setEnableOrbitController(!0)},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,transparent:!0,opacity:.5})})]})},Ph=function(e){var t=e.index,l=e.id,a=e.points,i=e.centroid,c=e.angle,s=e.length,d=e.textureType,h=e.heatmaps,p=e.color,y=void 0===p?"white":p,g=e.sideColor,m=e.relativeAngle,w=e.foundation,x=e.roofStructure,v=(e.glassTint,e.opacity),b=void 0===v?.5:v,A=e.windows,T=Ew.getState().world,P=(Ew(Zr),Ew(tn)),S=Tf(Ns),j=Tf(Vs),H=Ew(o.heatFluxScaleFactor),z=Ew(o.heatFluxColor),R=Ew(o.heatFluxWidth),D=Pf(Ri),M=Pf.getState().hourlyHeatExchangeArrayMap,W=Mp(x===Ct.Rafter?he.NoTexture:d),I=Wp(x===Ct.Rafter,b),C=I.transparent,O=I.opacity,F=Object(Se.f)().invalidate,k=Object(r.useRef)(null),Y=Object(r.useRef)(null),L=Object(r.useRef)(null),E=Object(r.useRef)(null),U=Object(r.useRef)(0),N=Object(r.useRef)(),J=Object(r.useRef)(),G=Object(r.useState)(0),X=Object(u.a)(G,2),B=(X[0],X[1]),K=Object(r.useState)(0),q=Object(u.a)(K,2),Q=(q[0],q[1]),Z=Object(r.useState)(!0),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=function(e,t){return e.clone().setZ(0).distanceTo(t.clone().setZ(0))>2},le=Object(r.useMemo)((function(){if(j){var e=D(l);if(e){var t,o=[],r=Object(u.a)(a,5),n=r[0],c=(r[1],r[2],r[3],r[4].z-n.z),s=new Me.Vector3(0,0,c+.1),d=Object(f.a)(e.values());try{for(d.s();!(t=d.n()).done;){var h=t.value,p=[];p.push(h[0].clone().sub(i).add(s)),p.push(h[1].clone().sub(i).add(s)),o.push(p),(p=[]).push(h[0].clone().sub(i).add(s)),p.push(h[3].clone().sub(i).add(s)),o.push(p),(p=[]).push(h[1].clone().sub(i).add(s)),p.push(h[2].clone().sub(i).add(s)),o.push(p)}}catch(y){d.e(y)}finally{d.f()}return o}}}),[j]),ae=Object(r.useMemo)((function(){var e;if(j&&(!w||!w.notBuilding)){var o=M.get(l+"-"+t);if(o){var r=o.reduce((function(e,t){return e+t}),0),n=D(l);if(n&&n[t]){var c=Object(u.a)(a,5),s=c[0],d=(c[1],c[2],c[3],c[4].z-s.z),h=n[t].map((function(e){return e.clone().sub(i).add(new Me.Vector3(0,0,d))}));if(h){var p=Tw.getTriangleArea(h[0],h[1],h[2])+Tw.getTriangleArea(h[2],h[3],h[0]);if(0!==p){var y=P(V.Window,l),g=D(l);if(g&&g[t]&&(y=y.filter((function(e){var l=e,a=l.cy+(l.windowType===Yt.Polygonal&&l.polygonTop?l.polygonTop[1]/2:0);return Vm.onSegment(g[t],e.cx,a)}))),y&&y.length>0){var m,x=Object(f.a)(y);try{for(x.s();!(m=x.n()).done;){var v=m.value;p-=Tw.getWindowArea(v)}}catch(ne){x.e(ne)}finally{x.f()}}var b=4*(null!==(e=T.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),A=h[0].clone(),S=h[1].clone(),z=h[2].clone(),R=(new Me.Vector3).subVectors(S,A),W=(new Me.Vector3).subVectors(z,A),I=(new Me.Vector3).subVectors(z,S),C=R.length(),O=(new Me.Vector3).crossVectors(W,I).length()/C,F=Math.max(2,Math.round(C/b)),k=Math.max(2,Math.round(O/b));R.normalize(),W.normalize(),I.normalize();var Y=(new Me.Vector3).crossVectors(W,I).normalize(),L=R.multiplyScalar(.5*C/F),E=(new Me.Vector3).crossVectors(Y,R).normalize().multiplyScalar(.5*O/k),G=A.clone().add(L).add(E);L.multiplyScalar(2),E.multiplyScalar(2);var X=r/p*(null!==H&&void 0!==H?H:_e);U.current=X<0?1:0,N.current=Y.clone().multiplyScalar(.1),J.current=Tw.getEuler(Rt,Y,"YXZ",-Math.sign(X)*vt);for(var B,K=[],q=new Me.Vector3,Q=0;Q0){var $,ee=q.x+i.x,te=q.y+i.y,le=Object(f.a)(y);try{for(le.s();!($=le.n()).done;){var ae=$.value,oe=Vm.getRelativeWindowVerticesOnRoof(ae),ie=Tw.getPoints(oe);if(Tw.isPointInside(ee,te,ie)){B=!1;break}}}catch(ne){le.e(ne)}finally{le.f()}}if(B){var re=[];X<0?(re.push(q.clone()),re.push(q.clone().add(Y.clone().multiplyScalar(-X)))):(re.push(q.clone()),re.push(q.clone().add(Y.clone().multiplyScalar(X)))),K.push(re)}}return K}}}}}}),[j,H,i,a]);Object(r.useEffect)((function(){var e=Object(u.a)(a,5),t=e[0],l=e[1],o=e[2],i=e[3],r=e[4].z-t.z;if(k.current){var n=k.current.geometry;if(n){var d=new Float32Array(18),f=r+.01;d[0]=a[0].x,d[1]=a[0].y,d[2]=a[0].z+f,d[3]=a[1].x,d[4]=a[1].y,d[5]=a[1].z+f,d[6]=a[2].x,d[7]=a[2].y,d[8]=a[2].z+f,d[9]=a[2].x,d[10]=a[2].y,d[11]=a[2].z+f,d[12]=a[3].x,d[13]=a[3].y,d[14]=a[3].z+f,d[15]=a[0].x,d[16]=a[0].y,d[17]=a[0].z+f,n.setAttribute("position",new Me.Float32BufferAttribute(d,3)),n.computeVertexNormals();var h=[];h.push(0,0),h.push(1,0),h.push(1,1),h.push(1,1),h.push(0,1),h.push(0,0),n.setAttribute("uv",new Me.Float32BufferAttribute(h,2))}}if(Y.current){Y.current.geometry=new Ee(a,c,s);var p=te(t,i)&&te(l,o);if(ee(p),x===Ct.Glass&&p){var y=Tw.calculatePolygonCentroid(a.map(Tw.mapVector3ToPoint2)),g=new Me.Vector3(y.x,y.y,0),w=.25,v=(new Me.Vector3).addVectors(t,g.clone().sub(t).setZ(0).normalize().multiplyScalar(w)),b=(new Me.Vector3).addVectors(l,g.clone().sub(l).setZ(0).normalize().multiplyScalar(w)),A=(new Me.Vector3).addVectors(o,g.clone().sub(o).normalize().multiplyScalar(w)),T=(new Me.Vector3).addVectors(i,g.clone().sub(i).normalize().multiplyScalar(w)),P=[];P.push(v),P.push(b),P.push(A.setZ(b.z)),P.push(T.setZ(v.z)),P.push(v.clone().setZ(1)),P.push(b.clone().setZ(1)),P.push(A.clone().setZ(1)),P.push(T.clone().setZ(1));var S=new Me.Mesh(new Ee(P)),j=Af.a.subtract(Y.current,S);if(Y.current.geometry=j.geometry,function(e){return Math.abs(e)0&&x===Ct.Rafter||x!==Ct.Rafter)&&Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Bf,{id:l,index:t,segment:oe,color:ie,sideColor:null!==g&&void 0!==g?g:"white",texture:W,heatmap:h[t],transparent:C,opacity:O,windows:A,centroid:i})}),le&&le.map((function(e,t){return Object(gf.jsx)(Jl.a,{points:e,color:"gray",lineWidth:.5,dashed:!0,dashSize:.2,gapSize:.1,receiveShadow:!1,castShadow:!1,name:"Overhang Boundary "+t},t)})),ae&&ae.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==R&&void 0!==R?R:et,color:null!==z&&void 0!==z?z:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:N.current?e[U.current].clone().add(N.current):e[0],args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=J.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==z&&void 0!==z?z:$e})})]},t)}))]})},Sh=n.a.memo(Th,zp),jh=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor;if(0===t.length)return null;for(var i=[],r=new Me.Vector3(0,0,l),n=0;n3&&void 0!==arguments[3]&&arguments[3];I((function(o){var i,r=Object(f.a)(o.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.id===e&&n.type===V.Roof&&n.roofType===It.Hip){n.leftRidgeLength=t,n.rightRidgeLength=l,a&&(o.updateElementOnRoofFlag=!0);break}}}catch(c){r.e(c)}finally{r.f()}}))},ve=function(e,t,l,a,o){e.push(t,l,a),o&&e.push(o),e.push(t.clone().add(He),l.clone().add(He),a.clone().add(He)),o&&e.push(o.clone().add(He))},be=Object(r.useMemo)((function(){if(null===O||4!==O.length)return new Me.Vector2;var e=function(e){var t,l=[],a=Object(f.a)(e);try{for(a.s();!(t=a.n()).done;){var o=t.value;l.push({x:o.leftPoint.x,y:o.leftPoint.y})}}catch(i){a.e(i)}finally{a.f()}return l}(O),t=Tw.calculatePolygonCentroid(e);return new Me.Vector2(t.x,t.y)}),[O]),Ae=Object(r.useMemo)((function(){var e=new Me.Vector3,t=new Me.Vector3(be.x,be.y,ie),l=W(d[0]);return l&&e.setX(-Z).applyEuler(new Me.Euler(0,0,l.relativeAngle)).add(t),e}),[be,ie,Z]),Te=Object(r.useMemo)((function(){var e=new Me.Vector3,t=new Me.Vector3(be.x,be.y,ie),l=W(d[0]);return l&&e.setX(te).applyEuler(new Me.Euler(0,0,l.relativeAngle)).add(t),e}),[be,ie,te]),Pe=Object(r.useMemo)((function(){return new Me.Vector3(be.x,be.y,ie)}),[be,ie]),je=Object(r.useMemo)((function(){return null===O||4!==O.length?[]:O.map((function(e){return Vm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)}))}),[O]),He=Object(r.useMemo)((function(){return Rh.clone().multiplyScalar(b)}),[b]),ze=Object(r.useMemo)((function(){return null===O||4!==O.length?null:O.map((function(e,t){return{leftPoint:e.leftPoint.clone().add(je[t]),rightPoint:e.rightPoint.clone().add(je[t])}}))}),[O,je]),Re=Object(r.useMemo)((function(){var e=[];if(null===O||4!==O.length||null===ze)return e;for(var t=function(){if(null===O||4!==O.length)return 0;for(var e=O.map((function(e){return e.leftPoint})),t=[Ae,Te,Te,Ae],l=1/0,a=0;a<4;a++){var o,i,r=O[a],n=Vm.getDistance(e[a],e[(a+1)%4],t[a]),c=Math.min((null!==(o=r.eavesLength)&&void 0!==o?o:0)/n*(t[a].z-r.lz),r.lz),s=Vm.getDistance(e[a],e[(a+1)%4],t[(a+1)%4]),d=Math.min((null!==(i=r.eavesLength)&&void 0!==i?i:0)/s*(t[(a+1)%4].z-r.lz),r.lz);l=Math.min(Math.min(c,d),l)}return Number.isNaN(l)?0:l}(),l=0;l<4;l++){var a=[],o=O[l],i=Vm.getComposedWallHeight(O,l),r=i.lh,n=i.rh,c=Vm.getIntersectionPoint(ze[(l+3)%4].leftPoint,ze[(l+3)%4].rightPoint,ze[l].leftPoint,ze[l].rightPoint).setZ(r-t).sub(Pe),s=Vm.getIntersectionPoint(ze[l].leftPoint,ze[l].rightPoint,ze[(l+1)%4].leftPoint,ze[(l+1)%4].rightPoint).setZ(n-t).sub(Pe),d=(new Me.Vector3).addVectors(o.leftPoint,o.rightPoint).divideScalar(2),u=Ae.clone().sub(Pe),f=Te.clone().sub(Pe),h=0;switch(l){case 0:h=d.clone().sub(Pe.clone().setZ(0)).length(),ve(a,c,s,f,u);break;case 1:h=d.clone().sub(Te.clone().setZ(0)).length(),ve(a,c,s,f);break;case 2:h=d.clone().sub(Pe.clone().setZ(0)).length(),ve(a,c,s,u,f);break;case 3:h=d.clone().sub(Ae.clone().setZ(0)).length(),ve(a,c,s,u)}e.push({points:a,angle:-o.relativeAngle,length:h})}return e}),[O,Ae,Te,ie,b]),De=Object(r.useMemo)((function(){return O&&4===O.length?O.map((function(e){return e.leftPoint})):null}),[O]);Object(r.useEffect)((function(){if(null===O||4!==O.length)C(a,!1,!1,!0);else if(Ew.getState().addedRoofIdSet.has(a)){for(var e=function(e){var t=new Set(O[e].wallsId);I((function(e){var l,o=Object(f.a)(e.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&t.has(i.id)){var r=i;r.roofId=a,r.leftRoofHeight=void 0,r.rightRoofHeight=void 0}}}catch(n){o.e(n)}finally{o.f()}}))},t=0;t0){var e=Re.length;if(e>0){for(var t=[],o=0;o0&&l){var d,u=new Me.Euler(0,0,l.rotation[2],"ZYX"),h=Number.MAX_VALUE,p=Number.MAX_VALUE,y=-Number.MAX_VALUE,g=-Number.MAX_VALUE,m=Object(f.a)(s);try{for(m.s();!(d=m.n()).done;){var w,x=d.value,v=Object(f.a)(x);try{for(v.s();!(w=v.n()).done;){var b=w.value.clone().applyEuler(u);b.x>y&&(y=b.x),b.xg&&(g=b.y),b.y0&&De&&Object(gf.jsx)(Qf,{cz:O[0].lz,points:De}),k&&!A&&Object(gf.jsxs)("group",{position:[0,0,b+.15],children:[Object(gf.jsx)(jp,{position:[Ae.x,Ae.y,Ae.z],onPointerDown:function(){if(fe.current=!0,U(!0),Hh.set(Ae.x,Ae.y,ie),l&&O[0]){var e=Ew.getState().cameraDirection,t=Math.atan2(e.z,e.y),a=O[0].relativeAngle;zh.set(-vt-t,0,a,"ZXY")}B(ge.Left),Et.getState().setEnableOrbitController(!1)}}),Object(gf.jsx)(jp,{position:[Pe.x,Pe.y,Pe.z],onPointerDown:function(e){if(Ce(t.id,e,X.Select),fe.current=!0,pe.current=R,U(!0),Hh.set(Pe.x,Pe.y,ie),l){var a=-Math.atan2(se.position.x-n,se.position.y-c)-l.rotation[2];zh.set(-vt,0,a,"ZXY")}B(ge.Mid),Et.getState().setEnableOrbitController(!1),I((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=ie+t.thickness}))},onPointerOver:function(){I((function(e){e.hoveredHandle=ge.Mid,e.selectedElementHeight=ie+t.thickness,e.selectedElementX=be.x,e.selectedElementY=be.y}))}}),Object(gf.jsx)(jp,{position:[Te.x,Te.y,Te.z],onPointerDown:function(){if(fe.current=!0,U(!0),Hh.set(Te.x,Te.y,ie),l&&O[0]){var e=Ew.getState().cameraDirection,t=Math.atan2(e.z,e.y),a=O[0].relativeAngle;zh.set(-vt-t,0,a,"ZXY")}B(ge.Right),Et.getState().setEnableOrbitController(!1)}})]}),E&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:re,args:[1e3,100],visible:!1,position:Hh,rotation:zh,onPointerMove:function(e){if(re.current&&fe.current){!function(e){ue.x=e.offsetX/ce.domElement.clientWidth*2-1,ue.y=-e.offsetY/ce.domElement.clientHeight*2+1,de.setFromCamera(ue,se)}(e);var o=de.intersectObjects([re.current]);if(o[0]&&l){var i=o[0].point;if(i.z<.001)return;var r=O[0],n=(new Me.Vector3).subVectors(r.rightPoint,r.leftPoint).length();switch(G){case ge.Left:var c=Pe.clone().sub(Hh).applyEuler(new Me.Euler(0,0,-zh.z)),s=i.clone().sub(new Me.Vector3(l.cx,l.cy,l.cz)).applyEuler(new Me.Euler(0,0,-l.rotation[2])).sub(Hh).applyEuler(new Me.Euler(0,0,-zh.z)),d=(new Me.Vector3).subVectors(s,c).x;_(Tw.clamp(-d,.1-te,n/2-.01));break;case ge.Right:var u=Pe.clone().sub(Hh).applyEuler(new Me.Euler(0,0,-zh.z)),f=i.clone().sub(new Me.Vector3(l.cx,l.cy,l.cz)).applyEuler(new Me.Euler(0,0,-l.rotation[2])).sub(Hh).applyEuler(new Me.Euler(0,0,-zh.z)),h=(new Me.Vector3).subVectors(f,u).x;le(Tw.clamp(h,.1-Z,n/2-.01));break;case ge.Mid:var p=Math.max(0,i.z-l.lz-.3-oe);Ew.getState().updateRoofRiseById(a,p,ie+t.thickness)}}}},onPointerUp:function(){switch(G){case ge.Mid:wp(a,pe.current,R);break;case ge.Left:case ge.Right:xe(a,Z,te),function(e,t,l,a,o){var i={name:"Resize Hip Roof Ridge",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldLeftRidgeLength:t,oldRightRidgeLength:l,newLeftRidgeLength:a,newRightRidgeLength:o,undo:function(){xe(i.resizedElementId,i.oldLeftRidgeLength,i.oldRightRidgeLength,!0)},redo:function(){xe(i.resizedElementId,i.newLeftRidgeLength,i.newRightRidgeLength,!0)}};Ew.getState().addUndoable(i)}(a,h,p,Z,te)}fe.current=!1,U(!1),B(ge.Null),Et.getState().setEnableOrbitController(!0)},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,transparent:!0,opacity:.5})})]})},Mh=n.a.memo(Dh,zp),Wh=new Me.Vector3,Ih=new Me.Euler,Ch=new Me.Vector3(0,0,1),Oh=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor,i=Object(r.useMemo)((function(){return t.reduce((function(e,t){return e.concat(t.points[1])}),[t[0].points[0]])}),[t]),c=Object(r.useMemo)((function(){return t.reduce((function(e,t){return e.concat(t.points[6].clone())}),[t[0].points[7].clone()])}),[t]),s=Object(r.useMemo)((function(){return Object(gf.jsx)(Jl.a,{points:i,lineWidth:a,color:o})}),[i,a,o]);if(t.length<2)return null;var d=Math.abs(t[0].points[0].z-t[0].points[3].z)<.1;return Object(gf.jsxs)(gf.Fragment,{children:[!d&&Object(gf.jsx)(Jl.a,{points:c,lineWidth:a,color:o}),s,Object(gf.jsx)("group",{position:[0,0,l],children:s}),t.map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[!d&&Object(gf.jsx)(Jl.a,{points:[e.points[7],e.points[4]],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[e.points[4],e.points[0]],lineWidth:a,color:o})]},t)}))]})})),Fh=function(e){var t=e.roofModel,l=e.foundationModel,a=t.id,i=t.wallsId,c=t.cx,s=t.cy,d=t.lz,p=t.textureType,y=t.color,g=void 0===y?"white":y,m=t.sideColor,w=void 0===m?"white":m,x=t.thickness,v=void 0===x?.2:x,b=t.locked,A=t.lineColor,T=void 0===A?"black":A,P=t.lineWidth,S=void 0===P?.2:P,j=t.roofType,H=t.foundationId,z=t.ridgeWidth,R=void 0===z?1:z,D=t.rise,M=void 0===D?d:D,W=t.ceiling,I=void 0!==W&&W,C=t.frontRidge,O=t.backRidge,F=Mp(p),k=_f(a),Y=Vm.getWireframetStyle(T,S,k,b),L=Object(u.a)(Y,2);T=L[0],S=L[1];var E=Ew(si),U=Ew(qc),N=Ew(o.shadowEnabled),J=Ew((function(e){return e.ray})),G=Ew((function(e){return e.mouse})),B=Object(r.useState)(R),q=Object(u.a)(B,2),Q=q[0],Z=q[1],_=Object(r.useState)(null),$=Object(u.a)(_,2),ee=$[0],te=$[1],le=Object(r.useState)(!1),ae=Object(u.a)(le,2),oe=ae[0],ie=ae[1],re=Object(r.useState)(ge.Null),ne=Object(u.a)(re,2),ce=ne[0],se=ne[1],de=Object(r.useState)(null),ue=Object(u.a)(de,2),fe=ue[0],pe=ue[1],ye=Object(r.useRef)(Q),me=Object(r.useRef)(M),we=Object(r.useRef)(null),xe=Object(r.useRef)(!1),ve=Object(Se.f)(),be=ve.gl,Ae=ve.camera,Te=M<.01,Pe=function(e,t){E((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Roof&&i.roofType===It.Mansard){i.ridgeWidth=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},je=Ip(H,a,i),He=je.currentWallArray,ze=je.isLoopRef,Re=Fp(He,M),De=Re.highestWallHeight,We=Re.topZ;Lp(t,De);var Ie=Object(r.useMemo)((function(){if(He.length<2)return new Me.Vector3;var e=function(e){var t,l=[],a=e.length,o=Object(f.a)(e);try{for(o.s();!(t=o.n()).done;){var i=t.value;void 0!==i.leftPoint[0]&&void 0!==i.leftPoint[1]&&l.push({x:i.leftPoint[0],y:i.leftPoint[1]})}}catch(r){o.e(r)}finally{o.f()}return ze.current||!e[a-1].rightPoint[0]&&0!==e[a-1].rightPoint[0]||!e[a-1].rightPoint[1]&&0!==e[a-1].rightPoint[1]||l.push({x:e[a-1].rightPoint[0],y:e[a-1].rightPoint[1]}),l}(He),t=Tw.calculatePolygonCentroid(e);return Number.isNaN(t.x)||Number.isNaN(t.y)?new Me.Vector3:new Me.Vector3(t.x,t.y,We)}),[He,We]),Ce=Object(r.useMemo)((function(){var e=He.map((function(e){var t;return Vm.getWallNormal(e).multiplyScalar(null!==(t=e.eavesLength)&&void 0!==t?t:0)}));if(!ze.current&&0!==e.length){var t=(new Me.Vector3).subVectors(new Me.Vector3(He[He.length-1].rightPoint[0],He[He.length-1].rightPoint[1]),new Me.Vector3(He[0].leftPoint[0],He[0].leftPoint[1])).applyEuler(Mt).normalize().multiplyScalar(.3);e.push(t)}return e}),[He]),Oe=Object(r.useMemo)((function(){var e=He.map((function(e,t){return{leftPoint:new Me.Vector3(e.leftPoint[0],e.leftPoint[1]).add(Ce[t]),rightPoint:new Me.Vector3(e.rightPoint[0],e.rightPoint[1]).add(Ce[t])}}));return ze.current||0===e.length||e.push({leftPoint:new Me.Vector3(He[He.length-1].rightPoint[0],He[He.length-1].rightPoint[1]).add(Ce[Ce.length-1]),rightPoint:new Me.Vector3(He[0].leftPoint[0],He[0].leftPoint[1]).add(Ce[Ce.length-1])}),e}),[He,Ce]),Fe=Object(r.useMemo)((function(){var e=He.map((function(e,t){var l=new Me.Vector3(e.leftPoint[0],e.leftPoint[1]),a=new Me.Vector3(e.rightPoint[0],e.rightPoint[1]),o=(new Me.Vector3).subVectors(Ie,l).setZ(0).normalize().multiplyScalar(Q),i=(new Me.Vector3).subVectors(Ie,a).setZ(0).normalize().multiplyScalar(Q);return l.add(o).setZ(We),a.add(i).setZ(We),{leftPoint:l,rightPoint:a}}));return ze.current||0===e.length||e.push({leftPoint:e[e.length-1].rightPoint,rightPoint:e[0].leftPoint}),e}),[He,Ie,Q]),ke=Object(r.useMemo)((function(){return Ch.clone().multiplyScalar(v)}),[v]),Ye=Object(r.useMemo)((function(){var e=[];if(He.length<2)return e;for(var t=function(){for(var e=1/0,t=0;t0&&a.rightPoint.length>0&&(a.leftPoint[0]!==a.rightPoint[0]||a.leftPoint[1]!==a.rightPoint[1])){var o=[],i=Vm.getWallHeight(He,l),r=i.lh,n=i.rh;ze.current||(0===l&&(r=He[0].lz),l===He.length-1&&(n=He[He.length-1].lz));var c=Vm.getIntersectionPoint(Oe[(l+Oe.length-1)%Oe.length].leftPoint,Oe[(l+Oe.length-1)%Oe.length].rightPoint,Oe[l].leftPoint,Oe[l].rightPoint).setZ(r-t).sub(Ie),s=Vm.getIntersectionPoint(Oe[l].leftPoint,Oe[l].rightPoint,Oe[(l+1)%Oe.length].leftPoint,Oe[(l+1)%Oe.length].rightPoint).setZ(n-t).sub(Ie),d=Fe[l].leftPoint.clone().sub(Ie),u=Fe[l].rightPoint.clone().sub(Ie),f=new Me.Vector3(a.cx,a.cy).sub(Ie.clone().setZ(0)).length();o.push(c,s,u,d),o.push(c.clone().add(ke),s.clone().add(ke),u.clone().add(ke),d.clone().add(ke)),e.push({points:o,angle:-a.relativeAngle,length:f})}}if(!ze.current){var h=Oe.length-1,p=Vm.getIntersectionPoint(Oe[h-1].leftPoint,Oe[h-1].rightPoint,Oe[h].leftPoint,Oe[h].rightPoint).setZ(He[He.length-1].lz-t).sub(Ie),y=Vm.getIntersectionPoint(Oe[h].leftPoint,Oe[h].rightPoint,Oe[0].leftPoint,Oe[0].rightPoint).setZ(He[0].lz-t).sub(Ie),g=Fe[h].leftPoint.clone().sub(Ie),m=Fe[h].rightPoint.clone().sub(Ie),w=Math.atan2(y.y-p.y,y.x-p.x);w=w>=0?w:(bt+w)%bt;var x=(new Me.Vector3).addVectors(p,y).setZ(0).divideScalar(2).length(),v=[];v.push(p,y,m,g),v.push(p.clone().add(ke),y.clone().add(ke),m.clone().add(ke),g.clone().add(ke)),e.push({points:v,angle:-w,length:x})}return e}),[He,We,Q,v]),Le=Object(r.useMemo)((function(){var e=new Me.Shape;if(Fe.length>0){var t=Fe[0].leftPoint.clone().sub(Ie);e.moveTo(t.x,t.y);var l,a=Object(f.a)(Fe);try{for(a.s();!(l=a.n()).done;){var o=l.value.rightPoint.clone().sub(Ie);e.lineTo(o.x,o.y)}}catch(i){a.e(i)}finally{a.f()}e.closePath()}return e}),[He,Fe]),Ee=Object(r.useMemo)((function(){var e=[];if(0===He.length)return e;e.push((new Me.Vector3).fromArray(He[0].leftPoint));var t,l=Object(f.a)(He);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push((new Me.Vector3).fromArray(a.rightPoint))}}catch(o){l.e(o)}finally{l.f()}return e}),[He]);Object(r.useEffect)((function(){R!==Q&&Z(R)}),[R]),Object(r.useEffect)((function(){if(He.length>1){if(Ew.getState().addedRoofIdSet.has(a)){for(var e=function(e){E((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.id===He[e].id&&i.type===V.Wall){var r=i;r.roofId=a,r.leftRoofHeight=void 0,r.rightRoofHeight=void 0;break}}}catch(n){o.e(n)}finally{o.f()}}))},t=0;t0&&l.rightPoint.length>0&&(l.leftPoint[0]!==l.rightPoint[0]||l.leftPoint[1]!==l.rightPoint[1])){var o=Vm.getWallHeight(He,t),i=o.lh,r=o.rh;ze.current||(0===t&&(i=He[0].lz),t===He.length-1&&(r=He[He.length-1].lz));var n=new Me.Vector3(l.leftPoint[0],l.leftPoint[1],i),c=new Me.Vector3(l.rightPoint[0],l.rightPoint[1],r),s=Fe[t].leftPoint.clone(),d=Fe[t].rightPoint.clone();e.push([n,c,d,s])}}if(!ze.current){var u=He.length-1,h=He[0],p=He[u],y=new Me.Vector3(p.rightPoint[0],p.rightPoint[1],p.lz),g=new Me.Vector3(h.leftPoint[0],h.leftPoint[1],h.lz),m=Fe[u].leftPoint.clone(),w=Fe[u].rightPoint.clone();e.push([y,g,w,m])}var x=Fe.map((function(e){return e.leftPoint.clone()}));if(e.push(x),Te){var v,b=[],A=Object(f.a)(e.slice(0,-1));try{for(A.s();!(v=A.n()).done;){var T=v.value;b.push(T[0].clone())}}catch(P){A.e(P)}finally{A.f()}Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,[b])}else Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}));var Ne=Ew.getState().world,Ve=Ew(is),Je=Tf(Ns),Ge=Ew(o.solarRadiationHeatmapMaxValue),Xe=Pf(wi),Be=Object(r.useState)([]),Ke=Object(u.a)(Be,2),qe=Ke[0],Qe=Ke[1],Ze=Object(r.useState)(null),tt=Object(u.a)(Ze,2),lt=tt[0],at=tt[1],ot=Object(r.useState)(!1),it=Object(u.a)(ot,2),rt=it[0],nt=it[1],ct=Tf(Vs),st=Ew(o.heatFluxScaleFactor),dt=Ew(o.heatFluxColor),ut=Ew(o.heatFluxWidth),ft=Pf(Ri),ht=Pf.getState().hourlyHeatExchangeArrayMap,pt=Object(r.useRef)(null),yt=Object(r.useRef)(0),gt=Object(r.useRef)(),mt=Object(r.useRef)(),wt=Wp(),xt=wt.transparent,At=wt.opacity;Object(r.useEffect)((function(){if(Je)if(Te){var e=Xe(a);if(e){var t=Tw.fetchHeatmapTexture(e,null!==Ge&&void 0!==Ge?Ge:5);if(t){var o=Ue();if(o&&o.length>0&&l){var i,r=new Me.Euler(0,0,l.rotation[2],"ZYX"),n=Number.MAX_VALUE,c=Number.MAX_VALUE,s=-Number.MAX_VALUE,d=-Number.MAX_VALUE,u=Object(f.a)(o);try{for(u.s();!(i=u.n()).done;){var h,p=i.value,y=Object(f.a)(p);try{for(y.s();!(h=y.n()).done;){var g=h.value.clone().applyEuler(r);g.x>s&&(s=g.x),g.xd&&(d=g.y),g.yy?y=w.x:w.xg?g=w.y:w.y0&&Object(gf.jsx)(Oh,{roofSegments:Ye,thickness:v,lineColor:T,lineWidth:S})]})}),I&&M>0&&Object(gf.jsx)(Qf,{points:Ee,cz:He[0].lz}),k&&!b&&Object(gf.jsxs)("group",{position:[Ie.x,Ie.y,Ie.z+v],children:[Object(gf.jsx)(jp,{position:[0,0,.3],onPointerDown:function(e){if(Ve(t.id,e,X.Select),xe.current=!0,me.current=M,ie(!0),Wh.set(Ie.x,Ie.y,We),l){var a=-Math.atan2(Ae.position.x-c,Ae.position.y-s)-l.rotation[2];Ih.set(-vt,0,a,"ZXY")}se(ge.Top),Et.getState().setEnableOrbitController(!1),E((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=We+t.thickness}))},onPointerOver:function(){E((function(e){e.hoveredHandle=ge.Top,e.selectedElementHeight=We+t.thickness,e.selectedElementX=Ie.x,e.selectedElementY=Ie.y}))}}),Fe.map((function(e,t){var l=e.leftPoint.clone().sub(Ie);return Object(gf.jsx)(jp,{position:[l.x,l.y,0],onPointerDown:function(){xe.current=!0,ie(!0),Wh.set(l.x,l.y,We+.15),Ih.set(0,0,0),se(ge.Ridge),pe(t),te(He.reduce((function(e,t){return Math.min(e,new Me.Vector3(t.leftPoint[0],t.leftPoint[1],We).distanceTo(Ie)-1)}),1/0)),Et.getState().setEnableOrbitController(!1),ye.current=Q}},t)}))]}),oe&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:we,args:[1e3,100],visible:!1,position:Wh,rotation:Ih,onPointerMove:function(e){if(we.current&&xe.current){!function(e){G.x=e.offsetX/be.domElement.clientWidth*2-1,G.y=-e.offsetY/be.domElement.clientHeight*2+1,J.setFromCamera(G,Ae)}(e);var o=J.intersectObjects([we.current]);if(o[0]&&l){var i=o[0].point;if(i.z<.001)return;switch(ce){case ge.Top:var r=Math.max(0,i.z-l.lz-.6-De);Ew.getState().updateRoofRiseById(a,r,We+t.thickness);break;case ge.Ridge:if(l&&null!==fe){var n=i.clone().applyEuler(new Me.Euler(0,0,l.rotation[2])).sub(new Me.Vector3(l.cx,l.cy)).setZ(0),c=function(e){if(e0&&l.getRangeAt(0);t.select(),document.execCommand("copy"),document.body.removeChild(t),a&&(l.removeAllRanges(),l.addRange(a))}},_h=function(){var e=Object(Eh.a)(Lh.a.mark((function e(t,l,a){var o,i,r;return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(o=window.document.getElementById(t))){e.next=11;break}return e.next=4,Vh()(o,Object(d.a)(Object(d.a)({},a),{},{removeContainer:!0}));case 4:i=e.sent,(r=document.createElement("a")).href=i.toDataURL("image/png",1),r.download="".concat(l,".png"),r.click(),e.next=12;break;case 11:throw new Error("Cannot find element with ID ".concat(t));case 12:case"end":return e.stop()}}),e)})));return function(t,l,a){return e.apply(this,arguments)}}(),$h=function(e,t){for(var l="",a=0,o=Object.keys(e[0]);a0&&void 0!==arguments[0]?arguments[0]:.3,l=Ew((function(e){return e.viewState.orthographic})),a=Ew((function(e){return e.viewState.cameraPosition})),o=Ew((function(e){return e.viewState.cameraZoom}));if(l)e=Math.max(t,15/o);else{var i=Ew.getState().viewState.panCenter,r=Object(ep.a)(Me.Vector3,Object(h.a)(i)),n=Object(ep.a)(Me.Vector3,Object(h.a)(a)),c=n.distanceTo(r);e=Math.max(t,c/100)}return e},fp=function(e,t){var l=Object(r.useMemo)((function(){return new Me.TextureLoader}),[]);return Object(r.useMemo)((function(){var a;switch(e){case ue.Default:a=tp;break;case ue.NoTexture:a=Sf;break;case ue.Texture01:a=lp;break;case ue.Texture02:a="data:image/png;base64,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";break;case ue.Texture03:a=ap;break;case ue.Texture04:a=op;break;case ue.Texture05:a=ip;break;case ue.Texture06:a=rp;break;case ue.Texture07:a=np;break;case ue.Texture08:a=cp;break;case ue.Texture09:a=sp;break;case ue.Texture10:a=dp;break;default:a=Sf}return t===Ne.Stud&&(a=Sf),l.load(a,(function(t){t.wrapS=t.wrapT=Me.RepeatWrapping,t.offset.set(0,0);var l=.6,a=.6;switch(e){case ue.Default:l=2,a=2;break;case ue.Texture03:l=2,a=1;break;case ue.Texture06:l=1,a=1}t.repeat.set(l,a),Object(Se.c)()}))}),[e])},hp=function(e){var t=Object(r.useRef)(!0);Tf((function(e){return e.foundationMovedFlag}));var l=e;if(!t.current){var a=Ew.getState().elements.find((function(t){return t.id===e.id&&t.type===V.Foundation}));a&&(l=a)}return t.current=!1,l},pp=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"addUndoableMove",value:function(){var e=Ew.getState().selectedElement;if(e){var t=Ew.getState().getElementById(e.id),l=Tf.getState().oldParentId,a=Tf.getState().oldFoundationId;if(t&&l&&a){var o=e.type===V.SolarPanel,i=e.type===V.Polygon,r={name:"Move",timestamp:Date.now(),movedElementId:t.id,movedElementType:t.type,oldCx:e.cx,oldCy:e.cy,oldCz:e.cz,newCx:t.cx,newCy:t.cy,newCz:t.cz,oldParentType:o?e.parentType:void 0,newParentType:o?t.parentType:void 0,oldParentId:l,newParentId:t.parentId,oldFoundationId:a,newFoundationId:t.foundationId,oldNormal:(new Me.Vector3).fromArray(e.normal),newNormal:(new Me.Vector3).fromArray(t.normal),oldRotation:Object(h.a)(e.rotation),newRotation:Object(h.a)(t.rotation),undo:function(){n(this.movedElementId,[this.oldCx,this.oldCy,this.oldCz],this.oldParentId,this.newParentId,this.oldFoundationId,this.oldParentType,this.oldRotation,this.oldNormal,i?e.vertices:void 0)},redo:function(){n(this.movedElementId,[this.newCx,this.newCy,this.newCz],this.newParentId,this.oldParentId,this.newFoundationId,this.newParentType,this.newRotation,this.newNormal,i?t.vertices:void 0)}};Ew.getState().addUndoable(r);var n=function(e,t,l,a,o,i,r,n,c){Ew.getState().set((function(s){var d=s.elements.find((function(t){return t.id===e}));if(d){if(d.type===V.Polygon){if(c)d.vertices=Object(h.a)(c)}else{var u=Object(h.a)(t);d.cx=u[0],d.cy=u[1],d.cz=u[2]}if(l&&a&&o&&(d.parentId=l,d.foundationId=o,i&&d.type===V.SolarPanel&&(d.parentType=i),r&&(d.rotation=Object(h.a)(r)),n&&(d.normal=[n.x,n.y,n.z]),d.type===V.Window)){var f=s.elements.find((function(e){return e.id===l})),p=s.elements.find((function(e){return e.id===a}));if(!f||!p)return;var y=d.lx*p.lx,g=d.lz*p.lz;d.lx=y/f.lx,d.lz=g/f.lz}}}))}}}}},{key:"undoInvalidOperation",value:function(){Ew.getState().set((function(e){if(e.selectedElement)for(var t=0;t0&&e.intersections[0].eventObject.name===e.eventObject.name&&(e.stopPropagation(),Ew.getState().set((function(e){if(e.groupActionMode)e.multiSelectionsMode||e.selectedElementIdSet.clear(),e.selectedElementIdSet.has(l)?e.selectedElementIdSet.delete(l):e.selectedElementIdSet.add(l);else{var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.id===t?(i.selected=!0,e.selectedElement=i,e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t))):i.selected=!1}}catch(r){o.e(r)}finally{o.f()}}})))},wp=function(e,t,l){var a={name:"Resize Roof Rise",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldRise:t,newRise:l,undo:function(){Ew.getState().updateRoofRiseById(a.resizedElementId,a.oldRise,0)},redo:function(){Ew.getState().updateRoofRiseById(a.resizedElementId,a.newRise,0)}};Ew.getState().addUndoable(a)},xp=function(e,t){var l={lng:Ew.getState().language};return!!Vm.rooftopElementBoundaryCheck(e,t)||(Ew.getState().moveHandleType||Ew.getState().viewState.orthographic?Qh(me.t("message.MoveOutsideBoundaryCancelled",l)):Ew.getState().resizeHandleType?Qh(me.t("message.ResizingOutsideBoundaryCancelled",l)):Ew.getState().rotateHandleType&&Qh(me.t("message.RotationOutsideBoundaryCancelled",l)),!1)},vp=function(e,t,l){var a={lng:Ew.getState().language};return!!Vm.rooftopSPCollisionCheck(e,t,l)||(Ew.getState().moveHandleType||Ew.getState().viewState.orthographic?Qh(me.t("message.MoveCancelledBecauseOfOverlap",a)):Ew.getState().resizeHandleType?Qh(me.t("message.ResizingCancelledBecauseOfOverlap",a)):Ew.getState().rotateHandleType&&Qh(me.t("message.RotationCancelledBecauseOfOverlap",a)),!1)},bp=function(e,t,l,a,o,i,r){null!==e&&Ew.getState().set((function(n){if(null!==e){var c,s=Object(f.a)(n.elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.parentId===t&&d.foundationId)if(d.type===V.SolarPanel){var u=new Me.Vector3(d.cx*e.lx,d.cy*e.ly,d.cz+e.lz).clone().sub(a),p=Vm.computeState(l,u,r),y=p.segmentVertices,g=p.normal,m=p.rotation,w=void 0;w=y?Vm.getRooftopElementZ(y,u,o+i):o+i,g&&m&&void 0!==w&&(d.normal=g.toArray(),d.rotation=Object(h.a)(m),d.cz=w)}else if(d.type===V.Window){var x=new Me.Vector3(d.cx,d.cy,d.cz+e.lz).clone().sub(a),v=Vm.computeState(l,x,r),b=v.segmentVertices,A=v.normal,T=v.rotation,P=void 0;P=b?Vm.getRooftopElementZ(b,x,o+i):o+i,A&&T&&void 0!==P&&(d.rotation=Object(h.a)(T),d.cz=P)}else if(d.type===V.Sensor||d.type===V.Light){var S=new Me.Vector3(d.cx*e.lx,d.cy*e.ly,d.cz+e.lz).clone().sub(a),j=Vm.computeState(l,S,r),H=j.segmentVertices,z=j.normal,R=j.rotation,D=void 0;D=H?Vm.getRooftopElementZ(H,S,o+i):o+i,z&&R&&void 0!==D&&(d.normal=z.toArray(),d.rotation=Object(h.a)(R),d.cz=D)}}}catch(M){s.e(M)}finally{s.f()}}}))},Ap=function(e,t,l,a,o){2!==e.button&&(e.intersections[0].eventObject.name!==e.eventObject.name||(mp(e,l,t),gp(e,t,l,a,o)))},Tp=function(e,t){var l=Ew.getState().selectedElement;if(l&&Vm.isValidOnRoof(l)){var a=Ew.getState().getElementById(l.id);if(a&&Ew.getState().moveHandleType)if(e.intersections.filter((function(e){return e.eventObject.name.includes("Roof")}))[0].eventObject.userData.roofId===t.id&&a.foundationId){var o=Ew.getState().getElementById(a.foundationId);if(o)switch(a.type){case V.SolarPanel:var i=a,r=Vm.getRoofBoundaryVertices(t),n=Vm.getSolarPanelVerticesOnRoof(i,o);xp(n,r)&&vp(i,o,n)?pp.addUndoableMove():pp.undoInvalidOperation();break;case V.Sensor:case V.Light:pp.addUndoableMove()}}Ew.getState().set((function(e){e.moveHandleType=null}))}},Pp=function(e,t){var l=Ew.getState().getSelectedElement();if(l&&Vm.isValidOnRoof(l))switch(l.type){case V.Sensor:case V.Light:case V.SolarPanel:if(l.type===V.SolarPanel&&void 0===l.parentType)return;if(Ew.getState().moveHandleType){var a=e.intersections.filter((function(e){return e.eventObject.name.includes("Roof")||e.eventObject.name.includes(pp.WALL_OUTSIDE_SURFACE_MESH_NAME)}));a[0].eventObject.userData.roofId===t&&Ew.getState().set((function(e){var t,o=Object(f.a)(e.elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;if(i.id===l.id){var r=a[0].eventObject.userData,n=r.roofId,c=r.foundation,s=r.centroid,d=r.roofSegments;if(c&&s&&d&&n){var u=a[0].point,p=(new Me.Vector3).subVectors(u,new Me.Vector3(c.cx,c.cy)).applyEuler(new Me.Euler(0,0,-c.rotation[2])),y=p.clone().sub(s),g=Vm.computeState(d,y),m=g.normal,w=g.rotation;i.cx=p.x/c.lx,i.cy=p.y/c.ly,i.cz=p.z-c.lz,i.rotation=Object(h.a)(w),i.normal=m.toArray(),i.parentId=n,i.foundationId=c.id,i.type===V.SolarPanel&&(i.parentType=V.Roof,i.color="#fff"),e.selectedElement&&(e.selectedElement.parentId=n,e.selectedElement.foundationId=c.id),Tf.getState().setPrimitiveStore("showWallIntersectionPlaneId",null)}break}}}catch(x){o.e(x)}finally{o.f()}}))}}},Sp=function(e,t){e.intersections.length>0&&e.intersections[0].eventObject.name===e.eventObject.name&&(e.stopPropagation(),Ew.getState().set((function(l){l.contextMenuObjectType=V.Roof,l.pastePoint.copy(e.intersections[0].point);var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t)if(i.selected=!0,l.selectedElement=i,l.selectedElementIdSet.has(t)){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;l.selectedElementIdSet.has(c.id)&&c.type!==l.selectedElement.type&&l.selectedElementIdSet.delete(c.id)}}catch(h){n.e(h)}finally{n.f()}}else if(l.multiSelectionsMode){l.selectedElementIdSet.add(t);var s,d=Object(f.a)(l.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;l.selectedElementIdSet.has(u.id)&&u.type!==l.selectedElement.type&&l.selectedElementIdSet.delete(u.id)}}catch(h){d.e(h)}finally{d.f()}}else l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t);else i.selected=!1}}catch(h){o.e(h)}finally{o.f()}})))},jp=function(e){var t=e.position,l=e.onPointerDown,a=e.onPointerUp,o=e.onPointerOver,i=Ew(si),n=up(),c=Object(Se.f)().gl,s=Object(r.useRef)(!1),d=Object(r.useRef)(!1),h=Object(r.useRef)(!1),p=Object(r.useRef)(),y=Object(r.useState)("white"),g=Object(u.a)(y,2),m=g[0],w=g[1],x=function(e){e?(w(pt),c.domElement.style.cursor="pointer"):(w("white"),c.domElement.style.cursor="default")};Object(r.useEffect)((function(){var e=function(){d.current&&(h.current=!0),!d.current&&s.current&&x(!1),s.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var v=function(e){if(e.intersections.length>0){var t,l=Object(f.a)(e.intersections);try{for(l.s();!(t=l.n()).done;){var a=t.value.eventObject;if("Roof Handle"===a.name)return a===p.current}}catch(o){l.e(o)}finally{l.f()}}return!1};return Object(gf.jsx)(Lt.h,{name:"Roof Handle",ref:p,args:[n],position:t,onPointerMove:function(e){v(e)?(h.current=!1,d.current||(d.current=!0,x(!0))):w("white")},onPointerOut:function(e){h.current||(s.current||(e.intersections.length>0&&"Roof Handle"===e.intersections[0].eventObject.name?w("white"):x(!1)),d.current=!1,i((function(e){e.hoveredHandle=null})))},onPointerDown:function(e){v(e)&&(l&&l(e),s.current=!0)},onPointerUp:function(e){v(e)&&a&&a(e)},onPointerOver:function(e){v(e)&&o&&o(e)},onPointerLeave:function(e){v(e)&&i((function(e){e.hoveredHandle=null}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:m})})},Hp=function(e){var t=e.roofModel,l=e.foundationModel,a=Ew(qc),o=t.id,i=t.wallsId,n=t.roofType;Object(r.useEffect)((function(){0===i.length&&a(o,!1)}),[i]);return function(){switch(n){case It.Pyramid:return Object(gf.jsx)(rh,{roofModel:t,foundationModel:l});case It.Gable:return Object(gf.jsx)(Sh,{roofModel:t,foundationModel:l});case It.Hip:return Object(gf.jsx)(Mh,{roofModel:t,foundationModel:l});case It.Gambrel:return Object(gf.jsx)(yh,{roofModel:t,foundationModel:l});case It.Mansard:return Object(gf.jsx)(kh,{roofModel:t,foundationModel:l});default:return null}}()};function zp(e,t){return e.roofModel===t.roofModel&&e.foundationModel.lx===t.foundationModel.lx&&e.foundationModel.ly===t.foundationModel.ly&&e.foundationModel.lz===t.foundationModel.lz}var Rp,Dp=n.a.memo(Hp,zp),Mp=function(e){var t=Object(r.useMemo)((function(){var t;switch(e){case he.NoTexture:t=Sf;break;case he.Texture01:t=jf;break;case he.Texture02:t=Hf;break;case he.Texture03:t=zf;break;case he.Texture04:t=Rf;break;case he.Texture05:t=Df;break;case he.Texture06:t=Mf;break;case he.Texture07:t=Wf;break;default:t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC"}return(new Me.TextureLoader).load(t,(function(t){switch(t.wrapS=t.wrapT=Me.RepeatWrapping,e){case he.NoTexture:case he.Default:t.repeat.set(5,3);break;case he.Texture01:t.repeat.set(.5,.25);break;case he.Texture03:t.repeat.set(.9,.9);break;case he.Texture04:case he.Texture05:case he.Texture06:t.repeat.set(.75,.75);break;default:t.repeat.set(.5,.5)}i(t),n()}))}),[e]),l=Object(r.useState)(t),a=Object(u.a)(l,2),o=a[0],i=a[1],n=Object(Se.f)().invalidate;return o},Wp=function(e,t){var l=Ew(o.groundImage),a=Ew(o.orthographic),i=l&&a,r=i?.25:1;return{transparent:e||i,opacity:Math.min(void 0!==t?t:1,r)}},Ip=function(e,t,l){var a=Ew((function(t){return t.elements.filter((function(t){return t.foundationId===e&&t.type===V.Wall}))}),Zf.a),o=function(e){return a.find((function(t){return t.id===e}))},i=Object(r.useRef)(!1);return{currentWallArray:Object(r.useMemo)((function(){var e,a=Object(f.a)(l);try{for(a.s();!(e=a.n()).done;){var r=e.value,n=o(r);if(!n)return[];for(var c=[],s=n,d=0;n&&(!n.roofId||n.roofId===t)&&d++<100&&(c.push(n),n.leftJoints[0]);){if(n.leftJoints[0]===s.id)return c.reverse(),i.current=!0,c;n=o(n.leftJoints[0])}for(c.reverse(),n=o(s.rightJoints[0]),d=0;n&&(!n.roofId||n.roofId===t)&&d++<100&&(c.push(n),n.rightJoints[0]&&n.rightJoints[0]!==s.id);)n=o(n.rightJoints[0]);if(i.current=!1,c.length>1)return c}}catch(u){a.e(u)}finally{a.f()}return[]}),[l,a]),isLoopRef:i}},Cp=function(e,t){var l=Ew((function(e){return e.elements.filter((function(e){return e.foundationId===t&&e.type===V.Wall}))}),Zf.a);return Object(r.useMemo)((function(){for(var t=function(e){return l.find((function(t){return t.id===e}))},a=new Map,o=new Map,i=t(e),r=i,n=0,c=!1;r&&r.type===V.Wall&&n<100;){a.set(r.id,r);var s,d=r.relativeAngle.toFixed(1);if(o.has(d))null===(s=o.get(d))||void 0===s||s.push(r);else o.set(d,[r]);if(0!==r.rightJoints.length){if((r=t(r.rightJoints[0]))&&r.id===i.id){c=!0;break}n++}else r=null}if(!c||4!==o.size)return null;var h,p=[],y=Object(f.a)(o);try{for(y.s();!(h=y.n()).done;){var g,m=Object(u.a)(h.value,2),w=m[0],x=m[1],v=0,b=Object(f.a)(x);try{for(b.s();!(g=b.n()).done;){var A=g.value,T=a.get(A.leftJoints[0]),P=a.get(A.rightJoints[0]);if(T&&T.relativeAngle.toFixed(1)!==w&&v++,P&&P.relativeAngle.toFixed(1)!==w&&v++,v>2)break}}catch(C){b.e(C)}finally{b.f()}if(2!==v)return null;var S,j=null,H=null,z=0,R=-1,D=Object(f.a)(x);try{for(D.s();!(S=D.n()).done;){var M=S.value,W=a.get(M.leftJoints[0]),I=a.get(M.rightJoints[0]);z=Math.max(z,M.lz),R=Math.max(R,M.eavesLength),W&&W.relativeAngle.toFixed(1)!==w&&(j=M),I&&I.relativeAngle.toFixed(1)!==w&&(H=M)}}catch(C){D.e(C)}finally{D.f()}j&&H&&z>0&&-1!==R&&p.push({leftPoint:(new Me.Vector3).fromArray(j.leftPoint),rightPoint:(new Me.Vector3).fromArray(H.rightPoint),relativeAngle:j.relativeAngle,lz:z,eavesLength:R,wallsId:x.map((function(e){return e.id}))})}}catch(C){y.e(C)}finally{y.f()}return 4!==p.length?null:p}),[l])},Op=function(e,t,l){var a=Object(r.useMemo)((function(){return Vm.getHighestComposedWallHeight(e,l)}),[e]),o=Object(r.useMemo)((function(){return a+t}),[a,t]);return{highestWallHeight:a,topZ:o}},Fp=function(e,t,l){var a=Object(r.useMemo)((function(){return Vm.getHighestWallHeight(e,l)}),[e]),o=Object(r.useState)(t),i=Object(u.a)(o,2),n=i[0],c=i[1],s=a+n;return Object(r.useEffect)((function(){t!==n&&c(t)}),[t]),{highestWallHeight:a,topZ:s,riseInnerState:n,setRiseInnerState:c}},kp=function(e,t,l,a,o,i){var n=Tf(Lr),c=Tf(Er),s=Tf(Ir),d=function(){var r=function(e){return e.clone().add(t)},n=[];if(a)if(o===It.Gambrel)n.push(Gp(l).map(r));else{var c,s=[],d=Object(f.a)(l);try{for(d.s();!(c=d.n()).done;){var u=c.value;s.push(u.points[1].clone().add(t))}}catch(g){d.e(g)}finally{d.f()}n.push(s)}else{var h,p=Object(f.a)(l);try{for(p.s();!(h=p.n()).done;){var y=h.value.points;if(6===y.length)n.push(y.slice(3).map(r));else{if(8!==y.length)throw new Error("Invalid Roof segment data");n.push(y.slice(4).map(r))}}}catch(g){p.e(g)}finally{p.f()}i&&n.push(i)}return Pf.getState().setRoofSegmentVertices(e,n),n};return(n||c||s)&&d(),Object(r.useEffect)((function(){d()}),[l]),d},Yp=function(e){var t=Tf(Ir),l=Tf(Or);(t||l)&&e()},Lp=function(e,t){var l=Ew(Tr);Object(r.useEffect)((function(){void 0===e.rise&&Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e.id&&i.type===V.Roof){var r=i;void 0===r.rise&&(r.rise=r.lz-t,r.lz=0);break}}}catch(n){o.e(n)}finally{o.f()}}))}),[l])},Ep=function(){var e=Object(r.useRef)(!0);return!!e.current&&(e.current=!1,!0)},Up=function(e,t,l,a,o,i,n){var c=Ew((function(e){return e.updateElementOnRoofFlag}));Object(r.useEffect)((function(){c&&(bp(e,t,l,a,o,i,n),Ew.getState().setUpdateElementOnRoofFlag(!1))}),[o,i,c])},Np=function(e,t,l,a,o,i,n){!function(e,t,l,a,o,i,n){var c=Ep();Object(r.useEffect)((function(){c||bp(e,t,l,a,o,i,n)}),[l])}(e,t,l,a,o,i,n),Up(e,t,l,a,o,i,n)},Vp=function(e,t,l,a){var o=hp(t);return Object(r.useMemo)((function(){return{roofId:e,foundation:o,centroid:l,roofSegments:a}}),[e,l,a,o])},Jp=function(e,t){var l=Object(u.a)(t,4),a=l[0],o=(l[1],l[2],l[3]);e.moveTo(a.points[0].x,a.points[0].y),e.lineTo(a.points[1].x,a.points[1].y),e.lineTo(o.points[0].x,o.points[0].y),e.lineTo(o.points[1].x,o.points[1].y),e.closePath()},Gp=function(e,t){var l=[],a=Object(u.a)(e,4),o=a[0],i=(a[1],a[2],a[3]);return l.push(o.points[0].clone()),l.push(o.points[1].clone()),l.push(i.points[0].clone()),l.push(i.points[1].clone()),t?(t.push.apply(t,l),t):l},Xp=function(e){var t=e.uuid,l=e.shape,a=e.thickness,o=e.holeMeshes,i=e.simulation,n=e.castShadow,c=e.receiveShadow,s=e.children,d=Object(r.useRef)(null);if(d.current&&(d.current.geometry=new Me.ExtrudeBufferGeometry(l,{steps:1,depth:a,bevelEnabled:!1}),d.current.updateMatrix(),o.length>0)){for(var f=[],h=0;h0){var n,s=Object(f.a)(C);try{for(s.s();!(n=s.n()).done;){var d=n.value,h=new Me.Vector3(d.cx,d.cy,d.cz).sub(c);switch(d.windowType){case Yt.Polygonal:var p,y=null!==(p=d.polygonTop)&&void 0!==p?p:Fg,g=Object(u.a)(y,2),m=g[0],w=g[1],x=d.lx/2,v=d.lz/2,b=m*d.lx,A=Jf(x,v,b,w,h.x,h.y);e.holes.push(A);break;case Yt.Arched:var T=Yf(d.lx,d.lz,d.archHeight,h.x,h.y);e.holes.push(T);break;default:var P=new Me.Shape,S=d.lx/2,j=d.lz/2;P.moveTo(h.x-S,h.y-j),P.lineTo(h.x+S,h.y-j),P.lineTo(h.x+S,h.y+j),P.lineTo(h.x-S,h.y+j),P.closePath(),e.holes.push(P)}}}catch(H){s.e(H)}finally{s.f()}}return e}),[i,c,C,a]),N=Object(r.useMemo)((function(){return C.map((function(e){var t=Object(u.a)(e.rotation,3),l=t[0],a=t[1],o=t[2],i=new Me.Vector3(e.cx,e.cy,e.cz).sub(c),r=(new Me.Euler).fromArray([].concat(Object(h.a)(e.rotation),["ZXY"]));switch(e.windowType){case Yt.Polygonal:var n,s=null!==(n=e.polygonTop)&&void 0!==n?n:Fg,d=Object(u.a)(s,2),f=d[0],p=d[1],y=e.lx/2,g=e.lz/2,m=f*e.lx,w=Jf(y,g,m,p),x=new Me.Mesh(new Me.ExtrudeBufferGeometry([w],{steps:1,depth:e.ly,bevelEnabled:!1})),v=new Me.Vector3(0,0,-e.ly).applyEuler(r);return x.position.copy(i.clone().add(v)),x.rotation.copy(r),x.updateMatrix(),x;case Yt.Arched:var b=Yf(e.lx,e.lz,e.archHeight),A=new Me.Mesh(new Me.ExtrudeBufferGeometry([b],{steps:1,depth:e.ly,bevelEnabled:!1})),T=new Me.Vector3(0,0,-e.ly).applyEuler(r);return A.position.copy(i.clone().add(T)),A.rotation.copy(r),A.updateMatrix(),A;default:var P=new Me.Mesh(new Me.BoxBufferGeometry(e.lx,e.lz,2*e.ly));return P.position.copy(i),P.rotation.set(l,a,o),P.updateMatrix(),P}}))}),[C,s]),J=m===he.NoTexture&&g&&g===y,G=v&&!W,X=b&&w;return Object(gf.jsxs)(gf.Fragment,{children:[J&&!X?Object(gf.jsx)(Xp,{uuid:t,simulation:!0,shape:E,holeMeshes:N,thickness:s,castShadow:G,receiveShadow:v,children:Object(gf.jsx)("meshStandardMaterial",{color:g,transparent:W,opacity:I})}):Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("mesh",{uuid:t,userData:{simulation:!0},name:"Flat roof top shape",position:[0,0,s+.001],receiveShadow:v,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[U]}),X?Object(gf.jsx)("meshBasicMaterial",{map:w,side:Me.FrontSide}):Object(gf.jsx)("meshStandardMaterial",{map:L,color:g,transparent:W,opacity:I,side:Me.FrontSide})]}),Object(gf.jsx)(Xp,{shape:E,holeMeshes:N,thickness:s,castShadow:G,receiveShadow:v,children:Object(gf.jsx)("meshStandardMaterial",{color:null!==y&&void 0!==y?y:"white",transparent:W,opacity:I})})]}),Y,Object(gf.jsxs)("group",{position:[0,0,s],children:[Y,F.map((function(e,t){var l=[e.clone().sub(k),e];return Object(gf.jsx)(Jl.a,{points:l,lineWidth:p,color:d},t)}))]}),O&&O.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==S&&void 0!==S?S:et,color:null!==P&&void 0!==P?P:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:R.current?e[z.current].clone().add(R.current):e[0],args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=D.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==P&&void 0!==P?P:$e})})]},t)}))]})},Kp=l.p+"static/media/foundation_01.bda6fc00.png",qp=l.p+"static/media/foundation_02.a1240091.png",Qp=l.p+"static/media/foundation_03.6be5f733.png",Zp=l.p+"static/media/foundation_04.8100e8d2.png",_p=l.p+"static/media/foundation_05.8164fdc8.png",$p=l.p+"static/media/foundation_06.fc1babc0.png",ey=l.p+"static/media/foundation_07.e759a1c6.png",ty=l.p+"static/media/helvetiker_regular.typeface.9a3651b4.fnt",ly=function(e){var t=e.element,l=e.height,a=Ew(Mu),i=Ew(Hu),n=Ew(ys),c=Ew($r),s=Ew(o.groundImage),d=Object(r.useState)(),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)(10),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(0),v=Object(u.a)(x,2),b=v[0],A=v[1];Object(r.useEffect)((function(){if(a||i){var e=t.cx,o=t.cy,r=t.lx,n=t.ly;switch(t.type){case V.SolarPanel:var d=c(t);if(d){var u=e*d.lx,f=o*d.ly;p(new Me.Vector3(u,f,null!==l&&void 0!==l?l:d.lz))}break;case V.Foundation:p(new Me.Vector3(e,o,s?.1:0));break;case V.Cuboid:var h=Tw.getWorldDataById(t.id).pos,y=Tw.getWorldDataById(t.parentId).rot;p(new Me.Vector3(h.x,h.y,h.z-t.lz/2+.2)),A(y);break;default:p(new Me.Vector3(e,o,s?.2:0))}w(Math.max(5,.75*Math.hypot(r,n)))}}),[a,i]);var T=Object(Se.e)(Me.FontLoader,ty),P=.05*m,S={font:T,height:0,size:P},j=new Array(25).fill(0),H=s?"#222":"#ccc";return Object(gf.jsx)(gf.Fragment,{children:h&&Object(gf.jsxs)("group",{position:h,rotation:[vt,b,0],name:"Polar Auxiliary",children:[Object(gf.jsx)("polarGridHelper",{args:[m,24,6,120,H,H],userData:{unintersectable:!0}}),Object(gf.jsx)(Lt.g,{args:[.98*m,m,24,1,vt,n],userData:{unintersectable:!0},rotation:[-vt,0,0],children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,color:"yellow"})}),Object(gf.jsx)("group",{rotation:[0,n,0],children:Object(gf.jsx)("mesh",{position:[-.5,0,.9*-m],rotation:[-vt,0,0],userData:{unintersectable:!0},children:Object(gf.jsx)("textGeometry",{args:["".concat(-Tw.toDegrees(n).toFixed(1),"\xb0"),S]})})}),j.map((function(e,t){var l=Math.ceil(t/2)*(t%2===0?1:-1);-12===l&&(l=12);var a=function(e){return 0===e?.3*-P:e>0&&e<7?.8*-P:1.2*-P}(Math.abs(l));return Object(gf.jsx)("group",{rotation:[0,l*Math.PI/12,0],children:Object(gf.jsxs)("mesh",{position:[a,0,1.05*-m],rotation:[-vt,0,0],userData:{unintersectable:!0},children:[Object(gf.jsx)("textGeometry",{args:["".concat(-15*l,"\xb0"),S]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]})},t)}))]})})},ay=function(e){var t=e.id,l=e.position,a=e.ratio,o=e.handleType,i=e.hoverHandle,r=e.noHoverHandle,n=Ew(is),c=Ew(Mu),s=Ew(Hu)===o||c===o?pt:ht,d=Object(gf.jsx)("meshBasicMaterial",{color:s});return Object(gf.jsxs)("group",{position:l,rotation:[vt,0,0],scale:a,name:o,children:[Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.i,{args:[.15,.05,6,8,1.5*Math.PI],rotation:[vt,0,vt],children:d}),Object(gf.jsx)(Lt.c,{args:[.1,.1,6],rotation:[vt,0,0],position:[.15,0,.05],children:d}),Object(gf.jsx)(Lt.b,{args:[.05,6],rotation:[0,vt,0],position:[0,0,.15],children:d})]}),Object(gf.jsx)(Lt.f,{name:o,args:[.35,.35],position:[0,.05,0],rotation:[-vt,0,0],visible:!1,onPointerDown:function(e){n(t,e,X.Rotate)},onPointerOver:function(e){i(e,o)},onPointerOut:r})]})},oy=n.a.memo(ay),iy=function(e){var t=e.hx,l=e.hy,a=e.hz,o=e.lineColor,i=void 0===o?"black":o,r=e.lineWidth,n=void 0===r?.2:r;return Object(gf.jsx)(Jl.a,{points:[[-t,-l,-a],[t,-l,-a],[t,-l,a],[t,-l,-a],[t,l,-a],[t,l,a],[t,l,-a],[-t,l,-a],[-t,l,a],[-t,l,-a],[-t,-l,-a],[-t,-l,a],[t,-l,a],[t,l,a],[-t,l,a],[-t,-l,a]],name:"Wireframe",userData:{unintersectable:!0},lineWidth:n,color:i})},ry=n.a.memo(iy);!function(e){e.left="Left",e.right="Right",e.loop="Loop",e.null="Null"}(Rp||(Rp={}));var ny,cy=function(e){var t,l=e.element,a=e.verticalLift,i=Ew(Vi),n=Ew(o.orthographic),c=Ew(Ru),s=Ew(Hu),d=l.lx/2,u=l.ly/2,f=.2,h=.5,p=null!==(t=l.lineColor)&&void 0!==t?t:"white",y="darkorchid",g=Math.max(1,(d+u)/32),m=Object(r.useMemo)((function(){return{lng:i}}),[i]),w=Object(r.useMemo)((function(){switch(l.type){case V.Cuboid:return Math.max(.5,.1*Math.max(d,u))}return.5}),[l.type,d,u]),x=Object(r.useMemo)((function(){switch(l.type){case V.Cuboid:return n?l.lz/2+.1:-l.lz/2+.1;case V.Foundation:return l.lz+.1}return.1}),[l.type,l.lz]),v=Object(r.useMemo)((function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},backgroundColor:y,text:l.ly.toFixed(1)+me.t("word.MeterAbbreviation",m),fontSize:80,fontFace:"Times Roman",textHeight:g,position:[-d-w,0,x+a]}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d-w,-u,x],[-d-w,u,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d-w+f,.6000000000000001-u,x],[-d-w,-u,x],[-d-w-f,.6000000000000001-u,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d-w+f,u-.6000000000000001,x],[-d-w,u,x],[-d-w-f,u-.6000000000000001,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u,x],[-d-2*w,-u,x]],color:p,linewidth:h}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u,x],[-d-2*w,u,x]],color:p,linewidth:h})]})}),[d,u,x]),b=Object(r.useMemo)((function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},backgroundColor:y,text:l.ly.toFixed(1)+me.t("word.MeterAbbreviation",m),fontSize:80,fontFace:"Times Roman",textHeight:g,position:[d+w,0,x+a]}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d+w,-u,x],[d+w,u,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d+w+f,.6000000000000001-u,x],[d+w,-u,x],[d+w-f,.6000000000000001-u,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d+w+f,u-.6000000000000001,x],[d+w,u,x],[d+w-f,u-.6000000000000001,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,-u,x],[d+2*w,-u,x]],color:p,linewidth:h}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,u,x],[d+2*w,u,x]],color:p,linewidth:h})]})}),[d,u,x]),A=Object(r.useMemo)((function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},backgroundColor:y,text:l.lx.toFixed(1)+me.t("word.MeterAbbreviation",m),fontSize:80,fontFace:"Times Roman",textHeight:g,position:[0,-u-w,x+a]}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u-w,x],[d,-u-w,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[.6000000000000001-d,-u-w-f,x],[-d,-u-w,x],[.6000000000000001-d,-u-w+f,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d-.6000000000000001,-u-w-f,x],[d,-u-w,x],[d-.6000000000000001,-u-w+f,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u,x],[-d,-u-2*w,x]],color:p,linewidth:h}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,-u,x],[d,-u-2*w,x]],color:p,linewidth:h})]})}),[d,u,x]),T=Object(r.useMemo)((function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},backgroundColor:y,text:l.lx.toFixed(1)+me.t("word.MeterAbbreviation",m),fontSize:80,fontFace:"Times Roman",textHeight:g,position:[0,u+w,x+a]}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u+w,x],[d,u+w,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[.6000000000000001-d,u+w-f,x],[-d,u+w,x],[.6000000000000001-d,u+w+f,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d-.6000000000000001,u+w-f,x],[d,u+w,x],[d-.6000000000000001,u+w+f,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u,x],[-d,u+2*w,x]],color:p,linewidth:h}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,u,x],[d,u+2*w,x]],color:p,linewidth:h})]})}),[d,u,x]);if(c)if(l.type===V.Wall)switch(c){case K.LowerLeft:case K.LowerRight:return A}else switch(c){case K.LowerLeft:return Object(gf.jsxs)(gf.Fragment,{children:[v,A]});case K.LowerRight:return Object(gf.jsxs)(gf.Fragment,{children:[b,A]});case K.UpperLeft:return Object(gf.jsxs)(gf.Fragment,{children:[v,T]});case K.UpperRight:return Object(gf.jsxs)(gf.Fragment,{children:[b,T]})}if(s)if(l.type===V.Wall)switch(s){case K.LowerLeft:case K.LowerRight:return A}else switch(s){case K.LowerLeft:return Object(gf.jsxs)(gf.Fragment,{children:[v,A]});case K.LowerRight:return Object(gf.jsxs)(gf.Fragment,{children:[b,A]});case K.UpperLeft:return Object(gf.jsxs)(gf.Fragment,{children:[v,T]});case K.UpperRight:return Object(gf.jsxs)(gf.Fragment,{children:[b,T]})}return Object(gf.jsx)(gf.Fragment,{})},sy=1.225,dy=273.15,uy=5.67e-8,fy=[.103,.104,.109,.12,.13,.137,.138,.134,.121,.111,.106,.103];!function(e){e[e.NONE=0]="NONE",e[e.KASTEN_YOUNG=1]="KASTEN_YOUNG",e[e.SPHERE_MODEL=2]="SPHERE_MODEL"}(ny||(ny={}));var hy,py=1440,yy=Math.PI/720,gy=Math.PI/182.5,my=function(){function e(t,l){Object(He.a)(this,e),this.sunrise=void 0,this.sunset=void 0,this.sunrise=t,this.sunset=l}return Object(Fe.a)(e,[{key:"daylight",value:function(){return this.sunset-this.sunrise}}]),e}(),wy=.5,xy=.1,vy=23.45/180*Math.PI,by=720,Ay=function(e){var t=Math.floor((e.getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5);return vy*Math.sin(bt*(284+t)/365.25)},Ty=function(e,t){var l=Math.tan(Tw.toRadians(t))*Math.tan(Ay(e));if(Math.abs(l)>1)return new my(0,l>0?1440:0);var a=60*Math.acos(-l)/Tw.toRadians(15);return new my(by-a,by+a)},Py=function(e){return(60*e.getHours()+e.getMinutes()-by)/by*Math.PI},Sy=function(e){return(e/by-1)*Math.PI},jy=function(e,t){return Hy(1,Py(e),Ay(e),Tw.toRadians(t)).normalize()},Hy=function(e,t,l,a){var o=Math.cos(l),i=Math.sin(l),r=Math.cos(a),n=Math.sin(a),c=Math.cos(t),s=Math.sin(t),d=Math.asin(i*n+o*c*r),u=s*o,f=r*i-c*o*n,h=Math.atan2(f,u),p=new Me.Vector3(e,h,d);return Tw.sphericalToCartesianZ(p),p.x=-p.x,p},zy=function(e,t,l,a){return function(e){var t=bt*e/365;return 1.361*(1.00011+.034221*Math.cos(t)+.00128*Math.sin(t)+719e-6*Math.cos(2*t)+77e-6*Math.sin(2*t))}(t)*Math.pow(.7,Math.pow(function(e,t,l){var a;switch(e){case ny.NONE:return 1;case ny.KASTEN_YOUNG:return a=t.angleTo(Rt),1/(Math.cos(a)+.50572*Math.pow(96.07995-a/Math.PI*180,-1.6364));default:a=t.angleTo(Rt);var o=Math.cos(a),i=708,r=l/9e3;return Math.sqrt((i+r)*(i+r)*o*o+(1417+r)*(1-r))-(i+r)*o}}(a,e,l),.678))},Ry=function(e,t,l,a){var o=0,i=l.dot(Rt),r=.5*(1+i);r>0&&(o+=fy[t]*r*a);var n=.5*Math.abs(1-i);return Tw.isZero(n)||(o+=e.albedo*n*a),o},Dy=function(e){var t,l,a,c,s,d,f,h,p,y,g,m,w,x,v,b,A=e.foundation,T=Ew(i.date),P=Ew(i.latitude),S=Tf(Mr),j=Tf(ms),H=Tf(ws),z=Tf(Ns),R=Ew(o.solarRadiationHeatmapMaxValue),D=Pf(wi),M=Object(r.useState)(null),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(),F=A.lx,k=A.ly,Y=A.lz,L=A.solarUpdraftTower,E=.016*(null!==(t=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==t?t:100),U=Object(r.useMemo)((function(){return jy(new Date(T),P)}),[T,P]),N=Object(r.useMemo)((function(){for(var e,t,l,a,o=[],i=((null!==(e=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==e?e:Math.max(3,10*Y))+Y)/2,r=null!==(t=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==t?t:Math.max(F,k),n=null!==(l=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==l?l:Math.min(F,k)/2,c=null!==(a=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==a?a:Math.max(1,.025*Math.min(F,k)),s=1.15*n,d=.5*c,u=c,f=2*c,h=4*c,p=0;p<6;p++){var y=bt/6*p,g=Math.cos(y),m=Math.sin(y),w=[];w.push(new Me.Vector3(s*g,s*m,i)),w.push(new Me.Vector3(d*g,d*m,i)),w.push(new Me.Vector3(d*g,d*m,r)),w.push(new Me.Vector3(u*g,u*m,1.02*r)),w.push(new Me.Vector3(f*g,f*m,1.04*r)),w.push(new Me.Vector3(h*g,h*m,1.06*r)),o.push({points:w})}return o}),[F,k,Y,null===L||void 0===L?void 0:L.collectorRadius,null===L||void 0===L?void 0:L.collectorHeight,null===L||void 0===L?void 0:L.chimneyRadius,null===L||void 0===L?void 0:L.chimneyHeight]),V=Object(r.useMemo)((function(){for(var e,t,l=[],a=(null!==(e=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==e?e:Math.max(3,10*Y))+Y,o=null!==(t=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==t?t:Math.min(F,k)/2,i=2*o/25,r=0;r<=25;r++){var n=[],c=r*i-o,s=Math.sqrt(o*o-c*c);n.push(new Me.Vector3(-s,c,a)),n.push(new Me.Vector3(s,c,a)),l.push({points:n})}for(var d=0;d<=25;d++){var u=[],f=d*i-o,h=Math.sqrt(o*o-f*f);u.push(new Me.Vector3(f,-h,a)),u.push(new Me.Vector3(f,h,a)),l.push({points:u})}return l}),[F,k,Y,null===L||void 0===L?void 0:L.collectorRadius,null===L||void 0===L?void 0:L.collectorHeight]);return Object(r.useEffect)((function(){if(A&&z){var e=D(A.id+"-sut");e&&C(Tw.fetchHeatmapTexture(e,null!==R&&void 0!==R?R:5))}}),[z,R]),Object(Se.d)((function(e,t){(S||j&&!H)&&U.z>0&&O.current&&O.current.children.forEach((function(e){"Streamlines"===e.name&&(e.material.uniforms.dashOffset.value-=t*E*10)}))})),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0,simulation:!0},name:"Chimney",castShadow:!0,receiveShadow:!1,args:[null!==(l=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==l?l:Math.max(1,.025*Math.min(F,k)),null!==(a=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==a?a:Math.max(1,.025*Math.min(F,k)),null!==(c=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==c?c:Math.max(F,k),16,2,!0],position:[0,0,(null!==(s=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==s?s:Math.max(F,k))/2+Y],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Chimney Base",castShadow:!0,receiveShadow:!1,args:[null!==(d=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==d?d:Math.max(1,.025*Math.min(F,k)),1.6*(null!==(f=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==f?f:Math.max(1,.025*Math.min(F,k))),4*(null!==(h=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==h?h:Math.max(3,10*Y)),16,2,!0],position:[0,0,2*(null!==(p=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==p?p:Math.max(3,10*Y))+Y],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Greenhouse Wall",castShadow:!0,receiveShadow:!0,args:[null!==(y=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==y?y:Math.min(F,k)/2,null!==(g=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==g?g:Math.min(F,k)/2,null!==(m=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==m?m:Math.max(3,10*Y),50,2,!0],position:[0,0,(null!==(w=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==w?w:Math.max(3,10*Y))/2+Y],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.b,{uuid:A.id+"-sut",userData:{unintersectable:!0,simulation:!0},name:"Greenhouse Ceiling",castShadow:!1,receiveShadow:!1,args:[null!==(x=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==x?x:Math.min(F,k)/2,50,0,bt],position:[0,0,Y+(null!==(v=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==v?v:Math.max(3,10*Y))],children:z&&I?Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.FrontSide,map:I}):Object(gf.jsx)("meshPhongMaterial",{attach:"material",specular:new Me.Color("white"),shininess:50,side:Me.FrontSide,color:"lightskyblue",transparent:!0,opacity:.75})}),Object(gf.jsx)(Lt.b,{userData:{unintersectable:!0},name:"Greenhouse Ground",castShadow:!1,receiveShadow:!0,args:[null!==(b=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==b?b:Math.min(F,k)/2,50,0,bt],position:[0,0,.1],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"dimgray"})}),V&&V.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Greenhouse Roof Grid Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"gray"},t)})),U.z>0&&N&&Object(gf.jsx)("group",{ref:O,children:N.map((function(e,t){var l=e.points[0].x+e.points[1].x,a=e.points[0].y+e.points[1].y,o=new Me.Euler(0,0,bt*t/N.length+vt),i=E,r=E;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{name:"Streamlines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.5,dashed:!0,dashSize:i,gapSize:r,color:"white"}),Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[E,4*E,4,2],name:"Streamline Inlet Arrow Head",position:[.1*l,.1*a,e.points[0].z],rotation:o,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[E,4*E,4,2],name:"Streamline Inlet Arrow Head",position:[.9*l,.9*a,e.points[0].z],rotation:o,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})})]},t)}))})]})},My=n.a.memo(Dy),Wy=l(802),Iy=l.p+"static/media/glow.def60647.png",Cy=function(e){var t,l,a=e.foundation,o=Ew(i.date),n=Ew(i.latitude),c=Object(Wy.a)(Iy),s=Object(r.useMemo)((function(){return jy(new Date(o),n)}),[o,n]),d=a.lz,u=a.solarPowerTower,f=null!==(t=null===u||void 0===u?void 0:u.towerRadius)&&void 0!==t?t:1,h=null!==(l=null===u||void 0===u?void 0:u.towerHeight)&&void 0!==l?l:20,p=h/10,y=1.5*f,g=2.4*Math.max(p,y);return Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Focus Tower",castShadow:!0,receiveShadow:!1,args:[f,f,h,6,2],position:[0,0,h/2+d/2],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Center Receiver",castShadow:!0,receiveShadow:!1,args:[y,y,p,10,2],position:[0,0,h+d/2],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),s.z>0&&Object(gf.jsx)("mesh",{position:[0,0,h+d/2],children:Object(gf.jsx)("sprite",{scale:[g,g,g],children:Object(gf.jsx)("spriteMaterial",{map:c,transparent:!1,color:16777215,blending:Me.AdditiveBlending,depthWrite:!1})})})]})},Oy=n.a.memo(Cy),Fy=function(e){var t,l,a,o,i=e.foundation,n=i.ly,c=i.lz,s=i.solarAbsorberPipe,d=null!==(t=null===s||void 0===s?void 0:s.absorberHeight)&&void 0!==t?t:10,u=null!==(l=null===s||void 0===s?void 0:s.apertureWidth)&&void 0!==l?l:.6,f=null!==(a=null===s||void 0===s?void 0:s.relativeLength)&&void 0!==a?a:.9,h=null!==(o=null===s||void 0===s?void 0:s.poleNumber)&&void 0!==o?o:5,p=Object(r.useMemo)((function(){for(var e=[],t=f*n/(h+1),l=1;l<=h;l++)e.push(new Me.Vector3(0,l*t-f*n/2,d/2+c/2));return e}),[n,c,h,d,f]);return Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Receiver Vertical Pipe 1",castShadow:!1,receiveShadow:!1,args:[u/4,u/4,d,6,2],position:[0,-f*n/2,d/2+c/2],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Receiver Vertical Pipe 2",castShadow:!1,receiveShadow:!1,args:[u/4,u/4,d,6,2],position:[0,f*n/2,d/2+c/2],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Receiver Horizontal Pipe",castShadow:!1,receiveShadow:!1,args:[u/2,u/2,f*n+u/2,6,2,!1,3*vt,Math.PI],position:[0,0,d+c/2-u/4],rotation:[0,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:Me.DoubleSide})}),p&&p.map((function(e,t){return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Solar Receiver Pole "+t,castShadow:!1,receiveShadow:!1,args:[u/8,u/8,d,4,2],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})},t)}))]})},ky=n.a.memo(Fy),Yy=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"selectMe",value:function(e,t,l,a){var o,i,r,n;if(l.intersections.length>0&&l.intersections.filter((function(e){return!e.eventObject.name.startsWith("Wall Intersection Plane")}))[0].object===l.eventObject){var c,s=Object(f.a)(e.elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;d.id===t?(d.selected=!0,e.selectedElement=d,e.selectedElementHeight=d.lz):d.selected=!1}}catch(w){s.e(w)}finally{s.f()}if(!e.selectedElement)return;if(a===X.ContextMenu)if(e.selectedElementIdSet.has(t)){var u,h=Object(f.a)(e.elements);try{for(h.s();!(u=h.n()).done;){var p=u.value;e.selectedElementIdSet.has(p.id)&&p.type!==e.selectedElement.type&&e.selectedElementIdSet.delete(p.id)}}catch(w){h.e(w)}finally{h.f()}}else if(e.multiSelectionsMode){e.selectedElementIdSet.add(t);var y,g=Object(f.a)(e.elements);try{for(g.s();!(y=g.n()).done;){var m=y.value;e.selectedElementIdSet.has(m.id)&&m.type!==e.selectedElement.type&&e.selectedElementIdSet.delete(m.id)}}catch(w){g.e(w)}finally{g.f()}}else e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t);else e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t));if(e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null,a)switch(a){case X.Move:(null===(o=e.selectedElement)||void 0===o?void 0:o.type)===V.Tree||(null===(i=e.selectedElement)||void 0===i?void 0:i.type)===V.Human?e.moveHandleType=B.Default:e.moveHandleType=l.eventObject.name;break;case X.Resize:e.resizeHandleType=l.eventObject.name;break;case X.Rotate:e.rotateHandleType=l.eventObject.name;break;case X.Select:e.selectedElementAngle=null!==(r=null===(n=l.object.parent)||void 0===n?void 0:n.rotation.z)&&void 0!==r?r:0}}}},{key:"selectNone",value:function(e){e.selectedElementIdSet.clear();var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){t.value.selected=!1}}catch(a){l.e(a)}finally{l.f()}e.selectedElement=null,e.selectedElementIdSet.clear()}},{key:"clearThenAddSelectedElementIdSet",value:function(e,t){e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t)}}]),e}(),Ly=l(124),Ey=function(e){var t=Tf(Ns),l=Ew(o.solarRadiationHeatmapMaxValue),a=Object(r.useState)(null),i=Object(u.a)(a,2),n=i[0],c=i[1];return Object(r.useEffect)((function(){if(t){var a=Pf.getState().getHeatmap(e);a&&c(Tw.fetchHeatmapTexture(a,null!==l&&void 0!==l?l:5))}}),[t,l]),n},Uy=function(e,t,l,a,o,i){var n=null!==o&&void 0!==o?o:"Black"===(null===l||void 0===l?void 0:l.color)&&"Monocrystalline"===(null===l||void 0===l?void 0:l.cellType)?"silver":"white",c=null!==i&&void 0!==i?i:"gray",s=Object(r.useMemo)((function(){if(!l)return null;var e=l.cellType,t=l.length,o=l.width,i=l.m,r=l.n,s=l.color;return a===$.portrait?Ny(e,o,t,r,i,s,n,c):Ny(e,t,o,i,r,s,n,c)}),[l,a,n,c]),d=Object(r.useState)(s),f=Object(u.a)(d,2),h=f[0],p=f[1];return Object(r.useEffect)((function(){if(s&&l){var o=l.length,i=l.width,r=Math.max(1,Math.round(e/(a===$.landscape?o:i))),n=Math.max(1,Math.round(t/(a===$.landscape?i:o)));s.repeat.set(r,n),s.wrapS=s.wrapT=Me.RepeatWrapping,p(s.clone())}}),[s,e,t]),h},Ny=function(e,t,l,a,o,i,r,n){t*=250,l*=250;var c=document.createElement("canvas"),s=[t,l];c.width=s[0],c.height=s[1];var d=c.getContext("2d");if(d){d.fillStyle=r,d.fillRect(0,0,t,l);var u=.01*Math.max(t,l);if(d.fillStyle=n,d.fillRect(u,u,t-2*u,l-2*u),d.fillStyle="Black"===i?"#000":"#01345B","Thin Film"===e){var f=.6*u;d.fillRect(f,f,t-2*f,l-2*f)}else{var h=.005*Math.max(t,l),p=u+h,y=(t-2*p-h*(a-1))/a,g=(l-2*p-h*(o-1))/o,m=.1*y,w=.1*g;if("Monocrystalline"===e)for(var x=0;x0&&Object(gf.jsxs)("group",{rotation:[-c.x,0,-c.z-n],children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[s.clone().multiplyScalar(.75),[0,0,0],y.clone().multiplyScalar(p)],name:"Sun Beam",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[y.clone().multiplyScalar(.5),s.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Tw.toDegrees(y.angleTo(s)).toFixed(1)+"\xb0",fontSize:20,fontFace:"Times Roman",textHeight:.1,position:y.clone().multiplyScalar(.75).add(s.clone().multiplyScalar(.75)).multiplyScalar(.5)}),Object(gf.jsx)("group",{position:s.clone().multiplyScalar(.75),rotation:[vt+c.x+o.x,0,c.z+o.z+n,"ZXY"],children:Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",rotation:[0,0,-o.y],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})})})),Ky=function(e){var t,l,a,o,i,n=e.id;Ew(Fi);var c=Ew(Zr),s=Ew(Vi),d=Object(r.useMemo)((function(){return{lng:s}}),[s]),u=Object(r.useMemo)((function(){return c(n)}),[n]);if(!u||!u.foundationId)return null;var f=c(u.foundationId);if(!f)return null;var h=new Me.Vector3(f.cx,f.cy,f.cz),p=new Me.Vector3(u.cx*f.lx,u.cy*f.ly,f.lz/2+u.cz+u.lz/2+u.poleHeight).applyEuler(new Me.Euler(0,0,f.rotation[2])).add(h),y=(null!==(t=null===u||void 0===u?void 0:u.label)&&void 0!==t?t:me.t("shared.SolarPanelElement",d))+((null===u||void 0===u?void 0:u.locked)?" ( + ".concat(me.t("shared.ElementLocked",d)," + )"):"")+((null===u||void 0===u?void 0:u.label)?"":"\n"+me.t("word.Coordinates",d)+": ("+p.x.toFixed(1)+", "+p.y.toFixed(1)+", "+p.z.toFixed(1)+") "+me.t("word.MeterAbbreviation",d));return Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:y,color:null!==(l=u.labelColor)&&void 0!==l?l:"white",fontSize:null!==(a=u.labelFontSize)&&void 0!==a?a:20,textHeight:null!==(o=u.labelSize)&&void 0!==o?o:.2,position:[0,0,null!==(i=u.labelHeight)&&void 0!==i?i:Math.max(u.ly/2*Math.abs(Math.sin(u.tiltAngle))+.1,.2)]})},qy=function(e){var t,l,a=e.id,i=e.pvModelName,n=void 0===i?"SPR-X21-335-BLK":i,c=e.cx,s=e.cy,d=e.cz,p=e.lx,y=e.ly,g=e.lz,m=e.tiltAngle,w=e.relativeAzimuth,x=e.poleHeight,v=e.poleRadius,b=e.poleSpacing,A=e.drawSunBeam,T=e.rotation,P=void 0===T?[0,0,0]:T,S=e.normal,j=void 0===S?[0,0,1]:S,H=e.color,z=void 0===H?"white":H,R=e.frameColor,D=e.backsheetColor,M=e.showLabel,W=void 0!==M&&M,I=e.locked,C=void 0!==I&&I,O=e.parentId,F=e.foundationId,k=e.foundationModel,Y=e.orientation,L=void 0===Y?$.portrait:Y,E=Ew(si),U=Ew(is),N=Ew(Zr),J=Tf(Ns),G=Ew(o.shadowEnabled),B=Ew(o.solarPanelShininess),Q=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,Z=Ew(Yi),_=Ew(Kr),ee=_f(a),te=Object(r.useRef)(null),le=Z[n];le&&(g=Math.max(le.thickness,.02));var ae=p/2,oe=y/2,ie=g/2,re=Ew.getState().elements.length<100?4:2,ne=-x/2-g/2,ce=Object(r.useState)(0===P[0]),se=Object(u.a)(ce,2),de=se[0],ue=se[1],fe=Object(r.useState)(!1),he=Object(u.a)(fe,2),pe=he[0],ye=he[1],ge=Object(r.useState)(!1),me=Object(u.a)(ge,2),we=me[0],xe=me[1],ve=Object(Se.f)(),be=ve.gl,Ae=ve.camera,Te=Object(r.useRef)(),Pe=Object(r.useRef)(),je=Object(r.useRef)(null),He=Object(r.useRef)(!1),ze=Object(r.useRef)(null),Re=Object(r.useRef)(null),De=Object(r.useRef)(null),We=Object(r.useRef)(null),Ie=Object(r.useRef)(null),Ce=Object(r.useRef)(null),Oe=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Fe=Object(r.useMemo)((function(){return new Me.Vector2}),[]),ke=Object(r.useMemo)((function(){return de?new Me.Vector3(c,s,d+ie+x):new Me.Vector3(c,s,d+g/2+.02)}),[c,s,d,ie,de,x,_]),Ye=Object(r.useMemo)((function(){return(new Me.Euler).fromArray([].concat(Object(h.a)(P),["ZXY"]))}),[P]),Le=Object(r.useMemo)((function(){return de?new Me.Euler(m,0,w,"ZXY"):new Me.Euler}),[m,w,de]),Ee=Object(r.useMemo)((function(){for(var e=[],t=Math.floor(.5*p/b),l=Math.floor(.5*y*Math.abs(Math.cos(m))/b),a=.5*Math.sin(m),o=Math.cos(w)*b,i=Math.sin(w)*b,r=-t;r<=t;r++)for(var n=-l;n<=l;n++){var c=r*o-n*i,s=r*i+n*o;e.push(new Me.Vector3(c,s,ne+a*b*n))}return e}),[w,m,b,p,y,x,g]);Object(r.useEffect)((function(){ue(0===P[0])}),[P]),Object(r.useEffect)((function(){if(le){var e,t;L===$.portrait?(e=Math.max(1,Math.round(p/le.width)),t=Math.max(1,Math.round(y/le.length))):(e=Math.max(1,Math.round(p/le.length)),t=Math.max(1,Math.round(y/le.width))),Pe.current=[];for(var l=p/e,a=y/t,o=0;o<=e;o++)Pe.current.push({points:[new Me.Vector3(o*l-ae,-oe,g),new Me.Vector3(o*l-ae,oe,g)]});for(var i=0;i<=t;i++)Pe.current.push({points:[new Me.Vector3(-ae,i*a-oe,g),new Me.Vector3(ae,i*a-oe,g)]})}}),[L,n,p,y,g]);var Ue=Math.max(1,(p+y)/16),Ne=st*Ue*2,Ve=dt*Ue*1.5,Je=2*Ue/3,Ge=function(){var e=Ew.getState().elements.find((function(e){return e.id===F&&e.type===V.Foundation}));e&&(ze.current=[c/e.lx,s/e.ly,d-e.lz/2],Re.current=[p,y,g],De.current=w,We.current=m,Ce.current=Object(h.a)(j),Ie.current=Object(h.a)(P),te.current=e),ye(!0),He.current=!0,Et.getState().setEnableOrbitController(!1)},Xe=function(e){Fe.x=e.offsetX/be.domElement.clientWidth*2-1,Fe.y=-e.offsetY/be.domElement.clientHeight*2+1,Oe.setFromCamera(Fe,Ae)},Be=function(e){if(Ew.getState().resizeHandleType){if(Re.current&&ze.current&&Ce.current&&Ie.current){var t={name:"Resize Solar Panel On Roof",timestamp:Date.now(),id:e.id,oldDms:Object(h.a)(Re.current),oldNor:Object(h.a)(Ce.current),oldPos:Object(h.a)(ze.current),oldRot:Object(h.a)(Ie.current),newDms:[e.lx,e.ly,e.lz],newPos:[e.cx,e.cy,e.cz],newNor:Object(h.a)(e.normal),newRot:Object(h.a)(e.rotation),undo:function(){E((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=Object(h.a)(t.oldPos);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(h.a)(t.oldDms);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.normal=Object(h.a)(t.oldNor),o.rotation=Object(h.a)(t.oldRot);break}}}catch(n){a.e(n)}finally{a.f()}}))},redo:function(){E((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=Object(h.a)(t.newPos);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(h.a)(t.newDms);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.normal=Object(h.a)(t.newNor),o.rotation=Object(h.a)(t.newRot);break}}}catch(n){a.e(n)}finally{a.f()}}))}};Ew.getState().addUndoable(t)}}else if(Ew.getState().rotateHandleType&&void 0!==De.current){var l={name:"Rotate Solar Panel On Roof",timestamp:Date.now(),oldValue:De.current,newValue:e.relativeAzimuth,changedElementId:e.id,changedElementType:e.type,undo:function(){Ew.getState().updateSolarCollectorRelativeAzimuthById(l.changedElementId,l.oldValue)},redo:function(){Ew.getState().updateSolarCollectorRelativeAzimuthById(l.changedElementId,l.newValue)}};Ew.getState().addUndoable(l)}},Ke=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===O)return a}}catch(o){l.e(o)}finally{l.f()}})),qe=Uy(p,y,le,L,R,D),Qe=Ey(a);return Ke&&Ke.type===V.Roof&&0===Ke.opacity?null:Object(gf.jsxs)("group",{name:"Solar Panel Group Grandpa "+a,rotation:Ye,position:ke,children:[Object(gf.jsxs)("group",{name:"Solar Panel Group Dad "+a,rotation:Le,children:[Object(gf.jsxs)(Lt.a,{receiveShadow:G,castShadow:G,uuid:a,ref:Te,args:[p,y,g],name:"Solar Panel",onPointerDown:function(e){2!==e.button&&Ew.getState().objectTypeToAdd===V.None&&U(a,e,X.Select)},onContextMenu:function(e){U(a,e,X.ContextMenu),E((function(t){e.intersections.length>0&&(e.intersections[0].object===Te.current&&(t.contextMenuObjectType=V.SolarPanel))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===Te.current&&xe(!0))},onPointerOut:function(e){xe(!1)},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),J&&Qe?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:Qe}):qe?Q||0===B?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",map:qe,color:z}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===le||void 0===le?void 0:le.color)?at:ot),shininess:null!==B&&void 0!==B?B:tt,side:Me.FrontSide,map:qe,color:z}):Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),0===(null===le||void 0===le?void 0:le.bifacialityFactor)||Q||0===x&&0===m?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}):qe?Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===le||void 0===le?void 0:le.color)?at:ot),shininess:null!==B&&void 0!==B?B:tt,side:Me.FrontSide,map:qe,color:z}):null]}),ee&&!C&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Vy,{id:a,handleSize:Ne,parentId:O,foundationId:F}),Object(gf.jsxs)("group",{name:"Resize Handle Group",children:[Object(gf.jsx)(Jy,{pos:[-ae,0,ie],dms:[g,Ve],handleType:K.Left,initPointerDown:Ge}),Object(gf.jsx)(Jy,{pos:[ae,0,ie],dms:[g,Ve],handleType:K.Right,initPointerDown:Ge}),Object(gf.jsx)(Jy,{pos:[0,-oe,ie],dms:[g,Ve],handleType:K.Lower,initPointerDown:Ge}),Object(gf.jsx)(Jy,{pos:[0,oe,ie],dms:[g,Ve],handleType:K.Upper,initPointerDown:Ge})]})]}),Object(gf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:a,position:[0,0,xy],args:[p,y],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),J&&Qe&&Pe.current&&Pe.current.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),ee&&C&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-ae,-oe,0],[-ae,oe,0],[ae,oe,0],[ae,-oe,0],[-ae,-oe,0]],castShadow:!1,receiveShadow:!1,lineWidth:2,color:yt})]}),de&&ee&&!C&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Rotate Handle Group",rotation:[0,0,Le.z],children:[Object(gf.jsx)(Gy,{position:[0,-oe-1,0],ratio:1,handleType:q.Lower,initPointerDown:Ge}),Object(gf.jsx)(Gy,{position:[0,oe+1,0],ratio:1,handleType:q.Upper,initPointerDown:Ge})]}),Object(gf.jsx)(Xy,{rotationZ:w,tiltAngle:m,handleSize:Je,initPointerDown:Ge,handlePointerMove:function(e,t){if(He.current&&(Xe(e),t.current&&Ew.getState().rotateHandleType===q.Tilt)){var l=Oe.intersectObjects([t.current]);if(l.length>0){var o,i=l[0].point,r=null===(o=t.current.parent)||void 0===o?void 0:o.localToWorld(new Me.Vector3);if(r){var n=(new Me.Vector3).subVectors(i,r),c=n.angleTo(Rt);if(!(.5*y*Math.abs(Math.sin(c))>x)){var s,d,u=w+P[2]+(null!==(s=null===(d=te.current)||void 0===d?void 0:d.rotation[2])&&void 0!==s?s:0);c*=u%Math.PI===0?Math.sign(-n.y)*Math.sign(Math.cos(u)):Math.sign(n.x)*Math.sign(Math.sin(u)),Ew.getState().updateSolarPanelTiltAngleById(a,c)}}}}},handlePointerUp:function(){var e=N(a);if(e&&We.current&&Math.abs(e.tiltAngle-We.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:We.current,newValue:e.tiltAngle,changedElementId:a,changedElementType:V.SolarPanel,undo:function(){Ew.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.oldValue)},redo:function(){Ew.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.newValue)}};Ew.getState().addUndoable(t)}}})]}),pe&&Object(gf.jsx)(Lt.f,{ref:je,args:[1e3,1e3],visible:!1,onPointerMove:function(e){if(je.current&&He.current&&te.current&&le){Xe(e);var t=Oe.intersectObjects([je.current]);if(t.length>0){var l=t[0].point;if(l.z<.001)return;var o=Ew.getState().rotateHandleType;if(Ew.getState().resizeHandleType){var i=de?w:0,r=Ew.getState().resizeAnchor,n=new Me.Vector3(te.current.cx,te.current.cy,te.current.lz),d=(new Me.Vector3).subVectors(l,r).applyEuler(new Me.Euler(0,0,-P[2]-te.current.rotation[2]-i));E((function(e){var t,l,o,c=Object(f.a)(e.elements);try{for(c.s();!(t=c.n()).done;){var s=t.value;if(s.id===a&&te.current){switch(e.resizeHandleType){case K.Left:case K.Right:var u=s.orientation===$.landscape?le.length:le.width,h=Math.abs(d.x),p=Math.max(1,Math.ceil((h-u/2)/u))*u,y=new Me.Vector3(Math.sign(d.x)*p/2,0,0).applyEuler(new Me.Euler(0,0,P[2]+te.current.rotation[2]+i)),g=(new Me.Vector3).addVectors(r,y).sub(n).applyEuler(new Me.Euler(0,0,-te.current.rotation[2]));s.lx=p,s.cx=g.x/te.current.lx,s.cy=g.y/te.current.ly;break;case K.Upper:case K.Lower:var w=Math.abs(d.y),v=Math.abs(d.z),b=Math.hypot(w,v),A=s.orientation===$.landscape?le.width:le.length,T=Math.max(1,Math.ceil((b-A/2)/A))*A,S=new Me.Vector3(0,T*Math.sign(d.y)/2,0).applyEuler(new Me.Euler(P[0],P[1],P[2]+te.current.rotation[2]+i,"ZXY")),j=(new Me.Vector3).addVectors(r,S).sub(n).applyEuler(new Me.Euler(0,0,-te.current.rotation[2]));l=T,o=m,de&&0!==o&&.5*l*Math.abs(Math.sin(o))>x||(s.ly=T,s.cx=j.x/te.current.lx,s.cy=j.y/te.current.ly,de||(s.cz=j.z-ie))}break}}}catch(H){c.e(H)}finally{c.f()}}))}else if(o===q.Lower||o===q.Upper){var u=te.current.rotation[2],h=new Me.Vector2(te.current.cx,te.current.cy),p=new Me.Vector2(c,s).rotateAround(Dt,u),y=(new Me.Vector2).addVectors(p,h),g=Math.atan2(-l.x+y.x,l.y-y.y)-u+(o===q.Lower?Math.PI:0),v=g+(Math.abs(g)>Math.PI?-Math.sign(g)*bt:0);Ew.getState().updateSolarCollectorRelativeAzimuthById(a,v)}}}},onPointerUp:function(){if(He.current){var e=N(O);if(e&&F){var t=N(a),l=te.current;if(t&&l){var o=Vm.getRoofBoundaryVertices(e),i=Vm.getSolarPanelVerticesOnRoof(t,l);xp(i,o)&&vp(t,l,i)?Be(t):E((function(e){if(ze.current&&null!==De.current&&Ce.current&&Re.current&&Ie.current){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.id===a){var i=Object(h.a)(ze.current);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(h.a)(Re.current);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.relativeAzimuth=De.current,o.normal=Object(h.a)(Ce.current),o.rotation=Object(h.a)(Ie.current);break}}}catch(n){l.e(n)}finally{l.f()}}}))}}Et.getState().setEnableOrbitController(!0),He.current=!1,ye(!1),E((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null,e.updateElementOnRoofFlag=!0})),te.current=null}}}),de&&x>0&&Ee.map((function(e,t){return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[v,v,x+2*(e.z-ne)+g,re,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:z})},t)})),Object(gf.jsx)(By,{drawSunbeam:A,rotation:P,normal:j,relativeEuler:Le,fRotation:null!==(l=null===k||void 0===k?void 0:k.rotation[2])&&void 0!==l?l:0}),(we||W)&&!ee&&Object(gf.jsx)(Ky,{id:a})]})},Qy=function(e){var t=e.lx,l=e.lz,a=(e.parentId,e.id),o=e.roofId,i=Ew(Eu),n=Ew(Uu);Object(r.useEffect)((function(){o&&(i===o||n.has(o))&&Ew.getState().set((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.id===a&&o.type===V.Wall){var i=o;i.roofId=null,i.leftRoofHeight=void 0,i.rightRoofHeight=void 0,i.centerRoofHeight=void 0,i.centerLeftRoofHeight=void 0,i.centerRightRoofHeight=void 0;break}}}catch(r){l.e(r)}finally{l.f()}}))}),[o,i,n]);return Object(gf.jsx)(Lt.f,{args:[t,l],rotation:[vt,0,0],visible:!1,onPointerDown:function(e){(function(e){return!(2===e.button||Ew.getState().moveHandleType||Ew.getState().resizeHandleType||Ew.getState().objectTypeToAdd!==V.None||Ew.getState().isAddingElement())})(e)&&(Ew.getState().set((function(e){e.contextMenuObjectType=null})),Ew.getState().selectMe(a,e,X.Select))},onContextMenu:function(e){Ew.getState().selectMe(a,e,X.ContextMenu),Ew.getState().set((function(t){e.intersections.length>0&&e.intersections[0].object===e.eventObject&&(t.contextMenuObjectType=V.Wall)}))},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})})},Zy=n.a.memo(Qy),_y=function(e){var t=e.cy,l=e.size,a=e.type,o=Object(r.useState)(ft),i=Object(u.a)(o,2),n=i[0],c=i[1];return Object(gf.jsx)(Lt.h,{name:a,args:[l],position:[0,t,0],onPointerEnter:function(){c(pt)},onPointerOut:function(){c(ft)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:n})})},$y=function(e){var t=e.ply,l=e.phz,a=up();return Object(gf.jsxs)("group",{name:"Move Handle Group",position:[0,0,-l],onPointerDown:function(e){e.intersections.length>0&&e.intersections[0].eventObject.parent===e.eventObject&&(Ew.getState().set((function(t){t.moveHandleType=e.object.name})),Et.getState().setEnableOrbitController(!1))},children:[Object(gf.jsx)(_y,{cy:-a,size:a,type:B.Lower}),Object(gf.jsx)(_y,{cy:t+a,size:a,type:B.Upper})]})},eg=n.a.memo($y),tg=n.a.memo((function(e){var t=e.x,l=e.z,a=e.handleType,o=e.highLight,i=e.handleSize,n=e.partial,c=Ew(si),s=Ew(Ru),d=Ew(Yu),f=Object(r.useState)(!1),h=Object(u.a)(f,2),p=h[0],y=h[1],g=o||p||a===s||d&&(a===K.LowerRight||a===K.UpperRight)?pt:n?"#ADD8E6":ht,m=i,w=i,x=i;if(a===K.LowerRight||a===K.LowerLeft)m=1.7*i;else if(n){m*=.75,w=i/2;var v=(x=2.5*i)/4;a===K.WallPartialResizeLeft||a===K.WallPartialResizeRight?l-=v:a!==K.WallPartialResizeLeftTop&&a!==K.WallPartialResizeRightTop||(l+=v)}else w=i/2,x=1.7*i;return Object(gf.jsx)(Lt.a,{name:a,args:[m,w,x],position:[t,0,l],onPointerOver:function(){y(!0),c((function(e){e.hoveredHandle=a}))},onPointerLeave:function(){y(!1),c((function(e){e.hoveredHandle=null}))},children:Object(gf.jsx)("meshBasicMaterial",{color:g})})})),lg=n.a.memo((function(e){var t=e.id,l=e.parentLz,a=e.roofId,i=e.x,n=e.z,c=e.absAngle,s=e.leftUnfilledHeight,d=e.rightUnfilledHeight,p=e.leftTopPartialResizeHandleHeight,y=e.rightTopPartialResizeHandleHeight,g=e.fill,m=e.wallLeftHeight,w=e.wallRightHeight,x=e.highLight,v=e.leftJoints,b=e.rightJoints,A=Ew(si),T=Ew(o.orthographic),P=up(),S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(new Me.Vector3),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(new Me.Euler),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(null),Y=Object(r.useRef)(!1),L=Object(r.useRef)([2*n,s,d]),E=Object(r.useRef)(new Map),U=Object(r.useRef)(null),N=Object(r.useRef)(null),J=Object(r.useRef)([]),G=Object(r.useMemo)((function(){if(!a)return null;var e=Ew.getState().elements.find((function(e){return e.id===a&&e.type===V.Roof}));return e?e.roofType:null}),[a]);T&&(n=-n);var X=function(e){var t=Ew.getState().cameraDirection,l=Math.atan2(t.x,t.y);W(new Me.Vector3(e,0,0)),F(new Me.Euler(vt,0,-l-c,"ZXY")),z(!0)},B=function(e,t,l){var a=Object(u.a)(t,5),o=a[0],i=a[1],r=a[2],n=a[3],c=a[4];A((function(t){var a,s=Object(f.a)(t.elements);try{for(s.s();!(a=s.n()).done;){var d=a.value;if(d.id===e&&d.type===V.Wall){var u=d;d.lz=o,u.leftUnfilledHeight=i,u.rightUnfilledHeight=r,u.leftTopPartialHeight=n,u.rightTopPartialHeight=c}else if(d.type===V.Wall&&l.has(d.id)){var h=l.get(d.id);void 0!==h&&(d.lz=h,d.cz=h/2)}}}catch(p){s.e(p)}finally{s.f()}}))},q=function(){a&&(v.length>0||b.length>0)&&(G===It.Gable||G===It.Gambrel?Ew.getState().elements.forEach((function(e){e.id===v[0]&&(U.current=e.lz),e.id===b[0]&&(N.current=e.lz)})):(E.current.clear(),Ew.getState().elements.forEach((function(e){e.type===V.Wall&&e.roofId===a&&E.current.set(e.id,e.lz)}))))},Q=function(){J.current=Ew.getState().elements.filter((function(e){return e.parentId===t}))},Z=function(e,t,l,a,o){var i=function(e,t,l,a,o){var i=e.lx,r=e.lz,n=e.roofId,c=e.leftRoofHeight,s=e.rightRoofHeight,d=e.centerLeftRoofHeight,u=e.centerRightRoofHeight,f=e.centerRoofHeight,h=g===Ue.Partial,p=h?Math.min(m,a):m,y=h?Math.min(w,o):w,x=h&&(!Tw.isZero(m-p)||!Tw.isZero(w-y)),v=i/2,b=r/2,A=[];return A.push({x:-v,y:-b+t},{x:v,y:-b+l}),x?A.push({x:v,y:-b+y},{x:-v,y:-b+p}):n?(s?A.push({x:v,y:-b+s}):A.push({x:v,y:b}),u&&A.push({x:u[0]*i,y:-b+u[1]}),f&&A.push({x:f[0]*i,y:-b+f[1]}),d&&A.push({x:d[0]*i,y:-b+d[1]}),c?A.push({x:-v,y:-b+c}):A.push({x:-v,y:b})):A.push({x:v,y:b},{x:-v,y:b}),A}(e,t,l,a,o);if(J.current.length>0){var r,n=Object(f.a)(J.current);try{for(n.s();!(r=n.n()).done;){var c=r.value,s=c.cx,d=c.cz,h=c.lx,p=c.ly,y=c.lz;if(s*=e.lx,d*=e.lz,c.type!==V.SolarPanel?(h*=e.lx,y*=e.lz):y=p,c.type===V.Window&&c.windowType===Yt.Polygonal){var x,v=null!==(x=c.polygonTop)&&void 0!==x?x:Fg,b=Object(u.a)(v,2),A=b[0],T=b[1],P=s+A*h,S=d+y/2+T;if(!Tw.isPointInside(P,S,i))return!1}if(!Tw.isElementInsideWall(new Me.Vector3(s,0,d),h,y,i,c.type===V.Door))return!1}}catch(j){n.e(j)}finally{n.f()}}return!0};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Wall Resize Handle Group",onPointerDown:function(e){var t;if(!Ew.getState().addedWallId&&e.object===(null===(t=e.intersections[0])||void 0===t?void 0:t.object)){var l=e.object;switch(l.name){case K.LowerLeft:A((function(e){e.resizeAnchor.copy(l.localToWorld(new Me.Vector3(2*i,0,0)))}));break;case K.LowerRight:A((function(e){e.resizeAnchor.copy(l.localToWorld(new Me.Vector3(2*-i,0,0)))}));break;case K.UpperLeft:case K.WallPartialResizeLeft:case K.WallPartialResizeLeftTop:X(-i),q(),Q();break;case K.UpperRight:case K.WallPartialResizeRight:case K.WallPartialResizeRightTop:X(i),q(),Q();break;default:return void console.error("Wall resize handle unknown")}A((function(e){e.resizeHandleType=l.name})),Et.getState().setEnableOrbitController(!1),Y.current=!0,L.current=[2*n,s,d,p,y]}},children:[Object(gf.jsx)(tg,{x:-i,z:-n,handleType:K.LowerLeft,highLight:x,handleSize:P}),Object(gf.jsx)(tg,{x:i,z:-n,handleType:K.LowerRight,highLight:x,handleSize:P}),!T&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(tg,{x:-i,z:n,handleType:K.UpperLeft,highLight:x,handleSize:P}),Object(gf.jsx)(tg,{x:i,z:n,handleType:K.UpperRight,highLight:x,handleSize:P}),g===Ue.Partial&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(tg,{x:-i,z:-n+s,handleType:K.WallPartialResizeLeft,highLight:x,handleSize:P,partial:!0}),Object(gf.jsx)(tg,{x:i,z:-n+d,handleType:K.WallPartialResizeRight,highLight:x,handleSize:P,partial:!0}),Object(gf.jsx)(tg,{x:-i,z:-n+p,handleType:K.WallPartialResizeLeftTop,highLight:x,handleSize:P,partial:!0}),Object(gf.jsx)(tg,{x:i,z:-n+y,handleType:K.WallPartialResizeRightTop,highLight:x,handleSize:P,partial:!0})]})]})]}),H&&Object(gf.jsx)(Lt.f,{ref:k,position:M,rotation:O,args:[1e4,1e4],visible:!1,onPointerMove:function(e){if(0!==e.intersections.length&&Y.current){var o=e.intersections[0].point;switch(Ew.getState().resizeHandleType){case K.UpperLeft:case K.UpperRight:A((function(e){var i=g===Ue.Partial?Math.max(s,d):0,r=Math.max(i+P,o.z-l);if(null===G||G===It.Gable||G===It.Gambrel){if(U.current||N.current){var n,c,u=Math.abs(r-(null!==(n=U.current)&&void 0!==n?n:1/0)),h=Math.abs(r-(null!==(c=N.current)&&void 0!==c?c:1/0));u0){var i=e.elements.find((function(e){return e.id===t.leftJoints[0]&&e.type===V.Wall}));if(i&&i.fill===Ue.Partial){var n=i.rightUnfilledHeight;Math.abs(a-n)<.5&&(a=n)}}return Z(t,a,e.enableFineGrid?a:t.rightUnfilledHeight,t.leftTopPartialHeight,t.rightTopPartialHeight)&&(t.leftUnfilledHeight=a,e.enableFineGrid&&(t.rightUnfilledHeight=a)),"break"}())break}}catch(n){i.e(n)}finally{i.f()}}));break;case K.WallPartialResizeRight:A((function(e){var a,i=Object(f.a)(e.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(r.id===t&&r.type===V.Wall)if("break"===function(){var t=r,a=Tw.clamp(o.z-l,0,t.rightTopPartialHeight);if(t.rightJoints.length>0){var i=e.elements.find((function(e){return e.id===t.rightJoints[0]&&e.type===V.Wall}));if(i&&i.fill===Ue.Partial){var n=i.leftUnfilledHeight;Math.abs(a-n)<.5&&(a=n)}}return Z(t,e.enableFineGrid?a:t.leftUnfilledHeight,a,t.leftTopPartialHeight,t.rightTopPartialHeight)&&(t.rightUnfilledHeight=a,e.enableFineGrid&&(t.leftUnfilledHeight=a)),"break"}())break}}catch(n){i.e(n)}finally{i.f()}}));break;case K.WallPartialResizeLeftTop:A((function(e){var a=e.elements.find((function(e){return e.id===t&&e.type===V.Wall}));if(a){var i=Tw.clamp(o.z-l,a.leftUnfilledHeight,a.lz);if(a.leftJoints.length>0){var r=e.elements.find((function(e){return e.id===a.leftJoints[0]&&e.type===V.Wall}));if(r&&r.fill===Ue.Partial){var n=r.rightTopPartialHeight;Math.abs(i-n)<.5&&(i=n)}}Z(a,a.leftUnfilledHeight,a.rightUnfilledHeight,i,e.enableFineGrid?i:a.rightTopPartialHeight)&&(a.leftTopPartialHeight=i,e.enableFineGrid&&(a.rightTopPartialHeight=i))}}));break;case K.WallPartialResizeRightTop:A((function(e){var a=e.elements.find((function(e){return e.id===t&&e.type===V.Wall}));if(a){var i=Tw.clamp(o.z-l,a.rightUnfilledHeight,a.lz);if(a.rightJoints.length>0){var r=e.elements.find((function(e){return e.id===a.rightJoints[0]&&e.type===V.Wall}));if(r&&r.fill===Ue.Partial){var n=r.leftTopPartialHeight;Math.abs(i-n)<.5&&(i=n)}}Z(a,a.leftUnfilledHeight,a.rightUnfilledHeight,e.enableFineGrid?i:a.leftTopPartialHeight,i)&&(a.rightTopPartialHeight=i,e.enableFineGrid&&(a.leftTopPartialHeight=i))}}))}}},onPointerUp:function(){Et.getState().setEnableOrbitController(!0),z(!1),U.current=null,N.current=null,Y.current=!1;var e=new Map;a&&G!==It.Gable&&G!==It.Gambrel&&Ew.getState().elements.forEach((function(t){t.type===V.Wall&&t.roofId===a&&e.set(t.id,t.lz)}));var l={name:"Change Wall Height",timestamp:Date.now(),resizedElementId:t,resizedElementType:V.Wall,oldHeights:Object(h.a)(L.current),newHeights:[2*n,s,d,p,y],oldSameBuildingWallsHeightMap:new Map(E.current),newSameBuildingWallsHeightMap:e,undo:function(){B(this.resizedElementId,this.oldHeights,this.oldSameBuildingWallsHeightMap)},redo:function(){B(this.resizedElementId,this.newHeights,this.newSameBuildingWallsHeightMap)}};Ew.getState().addUndoable(l),A((function(e){e.actionState.wallHeight=2*n,e.resizeHandleType=null}))},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})})]})})),ag=function(e){var t=e.wallModel,l=e.foundationModel,a=t.id,o=t.roofId,i=t.cx,r=t.cy,n=t.lx,c=t.ly,s=t.lz,u=t.relativeAngle,f=t.fill,h=t.locked,p=t.leftUnfilledHeight,y=t.rightUnfilledHeight,g=t.leftTopPartialHeight,m=t.rightTopPartialHeight,w=t.leftJoints,x=t.rightJoints,v=_f(a),b=n/2,A=s/2,T=f===Ue.Partial,P=w.length>0?t.leftRoofHeight:s,S=x.length>0?t.rightRoofHeight:s,j=null!==P&&void 0!==P?P:s,H=null!==S&&void 0!==S?S:s,z=T?Math.min(j,g):j,R=T?Math.min(H,m):H,D=0===n;return Object(gf.jsxs)("group",{name:"Wall Group ".concat(a),position:[i,r,A],rotation:[0,0,u],userData:{aabb:!0},children:[f===Ue.Empty?Object(gf.jsx)(Zy,Object(d.a)({},t)):Object(gf.jsx)(Nm,{wallModel:t,foundationModel:l}),v&&!h&&Object(gf.jsxs)(gf.Fragment,{children:[n>.5&&Object(gf.jsx)(eg,{ply:c,phz:A}),Object(gf.jsx)(lg,{id:a,parentLz:l.lz,roofId:o,absAngle:u+l.rotation[2],x:b,z:A,leftUnfilledHeight:p,rightUnfilledHeight:y,leftTopPartialResizeHandleHeight:z,rightTopPartialResizeHandleHeight:R,fill:f,wallLeftHeight:j,wallRightHeight:H,highLight:D,leftJoints:w,rightJoints:x})]})]})},og=function(e,t){return e.wallModel===t.wallModel},ig=n.a.memo(ag,og),rg="Building Group",ng=function(e){var t=e.id,l=e.lx,a=e.ly,o=e.lz,i=function(e){return e.foundationId===t&&(e.type===V.Wall||e.type===V.Roof||e.type===V.SolarPanel&&e.parentType===V.Roof||e.type===V.Window&&e.parentType===V.Roof)},r=Ew((function(e){return e.elements.filter(i)}),Zf.a);return 0===r.length?null:Object(gf.jsx)("group",{name:rg,position:[0,0,o/2],children:r.map((function(t){switch(t.type){case V.Wall:return Object(gf.jsx)(ig,{wallModel:t,foundationModel:e},t.id);case V.Roof:return Object(gf.jsx)(Dp,{roofModel:t,foundationModel:e},t.id);case V.SolarPanel:return Object(gf.jsx)(qy,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*l,cy:t.cy*a,cz:t.cz,foundationModel:e}),t.id);case V.Window:return Object(gf.jsx)(Yg,Object(d.a)(Object(d.a)({},t),{},{cz:t.cz}),t.id);default:return null}}))})},cg=function(e,t){return e.lx===t.lx&&e.ly===t.ly&&e.lz===t.lz&&e.rotation===t.rotation},sg=n.a.memo(ng,cg),dg="Foundation Group",ug=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,p=e.lx,y=void 0===p?1:p,g=e.ly,m=void 0===g?1:g,w=e.lz,x=void 0===w?.1:w,v=e.rotation,b=void 0===v?[0,0,0]:v,A=e.color,T=void 0===A?"gray":A,P=e.lineColor,S=void 0===P?"black":P,j=e.lineWidth,H=void 0===j?.2:j,z=e.locked,R=void 0!==z&&z,D=e.showLabel,M=void 0!==D&&D,W=e.textureType,I=void 0===W?se.NoTexture:W,C=e.solarStructure,O=_f(n),F=Ew(Vi),k=Ew(o.orthographic),Y=Ew(Zr),L=Ew(on),E=Ew(si),U=Ew(cn),N=Ew(sn),J=Ew(An),Q=Ew(Sn),Z=Ew(tf),_=Ew(lf),ee=Ew(af),te=Ew(rc),le=Ew(Kn),ae=Ew(qn),oe=Ew(ls),ie=Ew(os),re=Ew(qc),ne=Ew(is),ce=Ew(ns),de=Ew(Ei),ue=Ew(Lu),fe=Ew(qu),he=Ew(o.shadowEnabled),ye=Ew(o.groundImage),ge=Ew(Cu),we=Ew(Sr),xe=Ew(Iu),ve=Ew(rn),be=Ew(Hu),Ae=Tf(Ns),Te=Ew(o.solarRadiationHeatmapMaxValue),je=Ew(o.solarRadiationHeatmapReflectionOnly),He=Pf(wi),ze=Object(Se.f)(),Re=ze.camera,De=ze.gl.domElement,We=Object(r.useState)(!1),Ie=Object(u.a)(We,2),Ce=Ie[0],Oe=Ie[1],Fe=Object(r.useState)(null),ke=Object(u.a)(Fe,2),Ye=ke[0],Le=ke[1],Ee=Object(r.useState)(!1),Ue=Object(u.a)(Ee,2),Ne=Ue[0],Ve=Ue[1],Je=Object(r.useState)({show:!1,direction:null,position:null}),Ge=Object(u.a)(Je,2),Xe=Ge[0],Be=Ge[1],Ke=Object(r.useState)([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]),qe=Object(u.a)(Ke,2),Qe=qe[0],Ze=qe[1],_e=Object(r.useRef)(null),$e=Object(r.useRef)(!1),et=Object(r.useRef)(!1),tt=Object(r.useRef)(null),lt=Object(r.useRef)(Rp.null),at=Object(r.useRef)(new Map),ot=Object(r.useRef)(null),it=Object(r.useRef)(),rt=Object(r.useRef)(null),nt=Object(r.useRef)(),ct=Object(r.useRef)(),st=Object(r.useRef)(),dt=Object(r.useRef)(),gt=Object(r.useRef)(),mt=Object(r.useRef)(),wt=Object(r.useRef)(),xt=Object(r.useRef)(),Tt=Object(r.useRef)(),Pt=Object(r.useRef)(new Me.Vector3),St=Object(r.useRef)(new Me.Vector3),jt=Object(r.useRef)(new Me.Vector3(1,1,1)),Ht=Object(r.useRef)(new Me.Vector3(1,1,1)),zt=Object(r.useRef)(0),Mt=Object(r.useRef)(0),Wt=Object(r.useRef)([]),It=Object(r.useRef)([]),Ct=Object(r.useRef)([]),Ot=Object(r.useRef)([]),Ft=Object(r.useRef)([]),kt=Object(r.useRef)([]),Yt=Object(r.useMemo)((function(){return{lng:F}}),[F]),Ut=Object(r.useMemo)((function(){return new Me.Vector2}),[]),Nt=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Vt=y/2,Jt=m/2,Gt=x/2,Xt=Object(r.useMemo)((function(){return new Me.Vector3(-Vt,-Jt,Gt)}),[Vt,Jt,Gt]),Bt=Object(r.useMemo)((function(){return new Me.Vector3(-Vt,Jt,Gt)}),[Vt,Jt,Gt]),Kt=Object(r.useMemo)((function(){return new Me.Vector3(Vt,-Jt,Gt)}),[Vt,Jt,Gt]),qt=Object(r.useMemo)((function(){return new Me.Vector3(Vt,Jt,Gt)}),[Vt,Jt,Gt]),Qt=up(),Zt=Qt,_t=Qt,$t=4*Qt,el=Jt+$t,tl=Object(r.useRef)(!1),ll=Object(r.useRef)(null),al=Ew(Vu),ol=Ew(Ju),il=Object(r.useMemo)((function(){return new Me.Vector3}),[]);if(rt.current){var rl=-1;switch(rt.current.type){case V.SolarPanel:rl=rt.current.poleHeight;break;case V.ParabolicTrough:var nl=rt.current;rl=nl.poleHeight+nl.lx/2;break;case V.ParabolicDish:var cl=rt.current;rl=cl.poleHeight+cl.lx/2+cl.lx*cl.lx/(4*cl.latusRectum);break;case V.FresnelReflector:var sl=rt.current;rl=sl.poleHeight+sl.lx/2}rl>=0&&il.set(0,0,(null===e||void 0===e?void 0:e.lz)/2+rl)}Object(r.useEffect)((function(){at.current.clear();var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;l.type===V.Wall&&l.parentId===n&&at.current.set(l.id,l)}}catch(a){t.e(a)}finally{t.f()}}),[fe]),Object(r.useEffect)((function(){ue&&ue===_e.current&&(at.current.delete(ue),$e.current=!1,et.current=!1,_e.current=null,E((function(e){e.addedWallId===e.deletedWallId&&(e.addedWallId=null),e.deletedWallId=null})),Et.getState().setEnableOrbitController(!0),Be({show:!1,direction:null,position:null}),Ze([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]))}),[ue]),Object(r.useEffect)((function(){if(e&&Ae){var t=He(e.id);Le(t?Tw.fetchHeatmapTexture(t,null!==Te&&void 0!==Te?Te:5):null)}}),[Ae,Te,je]),Object(r.useEffect)((function(){tl.current&&Ew.getState().getAutoDeletedElements()&&dl()}),[al,ol]);var dl=Object(Ly.debounce)((function(){if(ll.current){var e=Ew.getState().getAutoDeletedElements();if(e){var t=ll.current,l=t.wall,a=t.newAngle,o=t.newJoints,i={name:"Move Wall",timestamp:Date.now(),id:l.id,oldPoints:[Object(h.a)(Ft.current[0]),Object(h.a)(Ft.current[1])],newPoints:[Object(h.a)(l.leftPoint),Object(h.a)(l.rightPoint)],oldJoints:[Object(h.a)(Ct.current[0]),Object(h.a)(Ct.current[1])],newJoints:[Object(h.a)(o[0]),Object(h.a)(o[1])],oldAngle:zt.current,newAngle:a,flippedWallSide:lt.current,autoDeletedElements:Object(h.a)(e),undo:function(){var e=this;switch(this.flippedWallSide){case Rp.loop:bl(this.id);break;case Rp.left:var t=Y(this.newJoints[0][0]);t&&Al(t);break;case Rp.right:var l=Y(this.newJoints[1][0]);l&&Tl(l)}var a=Object(u.a)(this.oldJoints,2),o=a[0],i=a[1],r=Object(u.a)(this.newJoints,2),n=r[0],c=r[1];E((function(t){var l,a,r=Object(f.a)(t.elements);try{for(r.s();!(a=r.n()).done;){var n=a.value;if(n.id===e.id){var c=Object(u.a)(e.oldPoints,2),s=c[0],d=c[1];n.cx=(s[0]+d[0])/2,n.cy=(s[1]+d[1])/2,n.lx=Math.hypot(s[0]-d[0],s[1]-d[1]);var p=n;p.relativeAngle=e.oldAngle,p.leftPoint=Object(h.a)(s),p.rightPoint=Object(h.a)(d),p.leftJoints=Object(h.a)(o),p.rightJoints=Object(h.a)(i);break}}}catch(y){r.e(y)}finally{r.f()}t.resizeHandleType=null,(l=t.elements).push.apply(l,Object(h.a)(e.autoDeletedElements)),t.deletedRoofId=null,t.autoDeletedChild=null,t.autoDeletedRoofs=null,t.autoDeletedRoofIdSet.clear()})),o[0]!==n[0]&&E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.type===V.Wall&&(i.id===o[0]&&(i.rightJoints=[e.id]),i.id===n[0]&&(e.flippedWallSide!==Rp.left?i.rightJoints=[]:i.leftJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),i[0]!==c[0]&&E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&(o.id===i[0]&&(o.leftJoints=[e.id]),o.id===c[0]&&(e.flippedWallSide!==Rp.right?o.leftJoints=[]:o.rightJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),lt.current=Rp.null},redo:function(){var e=this,t=Object(u.a)(this.oldJoints,2),l=t[0],a=t[1],o=Object(u.a)(this.newJoints,2),i=o[0],r=o[1];switch(E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===e.id&&o.type===V.Wall){var n=Object(u.a)(e.newPoints,2),c=n[0],s=n[1];o.cx=(c[0]+s[0])/2,o.cy=(c[1]+s[1])/2,o.lx=Math.hypot(c[0]-s[0],c[1]-s[1]);var d=o;d.relativeAngle=e.newAngle,d.leftPoint=Object(h.a)(c),d.rightPoint=Object(h.a)(s),d.leftJoints=Object(h.a)(i),d.rightJoints=Object(h.a)(r);break}}}catch(p){a.e(p)}finally{a.f()}})),l[0]!==i[0]&&E((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;r.type===V.Wall&&(r.id===l[0]&&(r.rightJoints=[]),r.id===i[0]&&(e.flippedWallSide===Rp.right?r.leftJoints=[e.id]:r.rightJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),a[0]!==r[0]&&E((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type===V.Wall&&(i.id===a[0]&&(i.leftJoints=[]),i.id===r[0]&&(e.flippedWallSide===Rp.right?i.rightJoints=[e.id]:i.leftJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),this.flippedWallSide){case Rp.loop:bl(this.id);break;case Rp.left:var n=Y(this.newJoints[0][0]);n&&Tl(n);break;case Rp.right:var c=Y(this.newJoints[1][0]);c&&Al(c)}var s=new Set(this.autoDeletedElements.map((function(e){return e.id})));E((function(t){t.resizeHandleType=null,t.elements=t.elements.filter((function(e){return!s.has(e.id)}));var l=e.autoDeletedElements.find((function(e){return e.type===V.Roof}));l&&(t.deletedRoofId=l.id)})),lt.current=Rp.null}};we(i),tl.current=!1,E((function(e){e.autoDeletedRoofs=null,e.autoDeletedRoofIdSet.clear(),e.autoDeletedChild=null}))}}}),100),ul=function(e){Ut.x=e.offsetX/De.clientWidth*2-1,Ut.y=-e.offsetY/De.clientHeight*2+1,Nt.setFromCamera(Ut,Re)},fl=Object(r.useMemo)((function(){var e;switch(I){case se.Texture01:e=Kp;break;case se.Texture02:e=qp;break;case se.Texture03:e=Qp;break;case se.Texture04:e=Zp;break;case se.Texture05:e=_p;break;case se.Texture06:e=$p;break;case se.Texture07:e=ey;break;default:e=Sf}return(new Me.TextureLoader).load(e,(function(e){e.wrapS=e.wrapT=Me.RepeatWrapping;var t=function(e){switch(e){case se.Texture01:return{x:1,y:1};case se.Texture02:return{x:2,y:2};case se.Texture03:return{x:.4,y:.4};case se.Texture04:return{x:.25,y:.25};case se.Texture05:return{x:5,y:5};case se.Texture06:case se.Texture07:default:return{x:1,y:1}}}(I);e.repeat.set(y/t.x,m/t.y),gl(e)}))}),[I,y,m]),hl=Object(r.useState)(fl),pl=Object(u.a)(hl,2),yl=pl[0],gl=pl[1],ml=Object(r.useCallback)((function(e,t){Tf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(E((function(e){e.hoveredHandle=t})),Tw.isMoveHandle(t)?De.style.cursor="move":t===q.Lower||t===q.Upper?De.style.cursor="grab":De.style.cursor=Ew.getState().addedFoundationId?"crosshair":"pointer")}),[]),wl=Object(r.useCallback)((function(){E((function(e){e.hoveredHandle=null})),De.style.cursor=Ew.getState().addedFoundationId?"crosshair":"default"}),[]),xl=function(e){switch(e){case V.Human:case V.Tree:case V.Flower:case V.Polygon:case V.Sensor:case V.Light:case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:case V.WindTurbine:case V.Wall:return!0;default:return!1}},vl=function(e,t){var l=t,a=null,o=null,i=null,r=void 0;if(!Ew.getState().enableFineGrid){var n,c=Object(f.a)(at.current);try{for(c.s();!(n=c.n()).done;){var s,d,h=Object(u.a)(n.value,2),p=h[0],y=h[1];if(!(p===_e.current||rt.current&&p===rt.current.id)){var g=new Me.Vector3(y.leftPoint[0],y.leftPoint[1],0),m=new Me.Vector3(y.rightPoint[0],y.rightPoint[1],0),w=null!==(s=null===g||void 0===g?void 0:g.distanceTo(e))&&void 0!==s?s:Number.MAX_VALUE,x=null!==(d=null===m||void 0===m?void 0:m.distanceTo(e))&&void 0!==d?d:Number.MAX_VALUE,v=w<=x,b=v?w:x;b<=l+.01&&(l=b,a=v?g:m,r=v?y.leftJoints[0]:y.rightJoints[0],o=p,i=v?pe.Left:pe.Right)}}}catch(A){c.e(A)}finally{c.f()}}return{id:o,point:a,side:i,jointId:r}},bl=function(e){at.current.clear();var t,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Wall&&a.parentId===n&&at.current.set(a.id,a)}}catch(r){l.e(r)}finally{l.f()}for(var o=at.current.get(e),i=function(){var t=at.current.get(o.id);return t?(E((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=o;i.relativeAngle=(t.relativeAngle+Math.PI)%bt,i.leftPoint=Object(h.a)(t.rightPoint),i.rightPoint=Object(h.a)(t.leftPoint),i.leftJoints=[t.rightJoints[0]],i.rightJoints=[t.leftJoints[0]];break}}}catch(r){a.e(r)}finally{a.f()}})),(o=at.current.get(o.leftJoints[0]))&&o.id===e?"break":void 0):"break"};o&&o.leftJoints.length>0;){if("break"===i())break}E((function(e){e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,Ew.getState().resizeHandleType&&(e.resizeHandleType=Ew.getState().resizeHandleType===K.LowerLeft?K.LowerRight:K.LowerLeft)})),lt.current=lt.current===Rp.null?Rp.loop:Rp.null},Al=function(e,t){at.current.clear();var l,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&o.parentId===n&&at.current.set(o.id,o)}}catch(s){a.e(s)}finally{a.f()}for(var i=e,r=e,c=function(){var e=at.current.get(r.id);if(!e)return"break";E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(e&&o.id===e.id){var i=o;i.relativeAngle=(e.relativeAngle+Math.PI)%bt,i.leftPoint=Object(h.a)(e.rightPoint),i.rightPoint=Object(h.a)(e.leftPoint),i.leftJoints=e.rightJoints.length>0?[e.rightJoints[0]]:[],i.rightJoints=e.leftJoints.length>0?[e.leftJoints[0]]:[];break}}}catch(s){a.e(s)}finally{a.f()}}));var t=void 0;if(e.leftJoints.length>0&&(t=at.current.get(e.leftJoints[0])),!t||t.id===i.id)return"break";r=t};r;){if("break"===c())break}E((function(e){if(t){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&(o.id===i.id&&(o.leftJoints=[t.id]),o.id===t.id&&(o.rightJoints=[i.id]))}}catch(s){a.e(s)}finally{a.f()}}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.resizeHandleType=K.LowerLeft})),lt.current=lt.current===Rp.null?Rp.right:Rp.null},Tl=function(e,t){at.current.clear();var l,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&o.parentId===n&&at.current.set(o.id,o)}}catch(s){a.e(s)}finally{a.f()}for(var i=e,r=e,c=function(){var e=at.current.get(r.id);if(!e)return"break";E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(e&&o.id===e.id){var i=o;i.relativeAngle=(e.relativeAngle+Math.PI)%bt,i.leftPoint=Object(h.a)(e.rightPoint),i.rightPoint=Object(h.a)(e.leftPoint),i.leftJoints=e.rightJoints.length>0?[e.rightJoints[0]]:[],i.rightJoints=e.leftJoints.length>0?[e.leftJoints[0]]:[];break}}}catch(s){a.e(s)}finally{a.f()}}));var t=void 0;if(e.rightJoints.length>0&&(t=at.current.get(e.rightJoints[0])),!t||t.id===i.id)return"break";r=t};r;){if("break"===c())break}E((function(e){if(t){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&(o.id===i.id&&(o.rightJoints=[t.id]),o.id===t.id&&(o.leftJoints=[i.id]))}}catch(s){a.e(s)}finally{a.f()}}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.resizeHandleType=K.LowerRight})),lt.current=lt.current===Rp.null?Rp.left:Rp.null},Pl=function(e){var t=void 0;at.current.clear();var l,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.id===e&&(t=o),o.type===V.Wall&&o.parentId===n&&at.current.set(o.id,o)}}catch(u){a.e(u)}finally{a.f()}for(var i=!1;t&&t.leftJoints.length>0;){var r;if((null===(r=t=at.current.get(t.leftJoints[0]))||void 0===r?void 0:r.id)===e){i=!0;break}}if(i){for(var c=0,s=0;t&&t.leftJoints.length>0;){var d=at.current.get(t.leftJoints[0]);if(c+=(3*Math.PI-(t.relativeAngle-d.relativeAngle))%bt,s+=1,(t=d).id===e)break}c>(s-2)*Math.PI+.1?bl(e):lt.current!==Rp.null&&(lt.current=Rp.loop)}return i},Sl=Object(r.useRef)(null),jl=Object(r.useRef)(null),Hl=Object(r.useRef)(!1),zl=Object(r.useRef)(!1),Rl=Object(r.useRef)(!1),Dl=function(e,t,l){var a=Math.atan2(t.y-e.y,t.x-e.x)-(l===K.LowerLeft?Math.PI:0);return a=a>=0?a:(bt+a)%bt},Ml=function(e,t){var l,a=null,o=null,i=1/0,r=1/0,n=Object(f.a)(at.current);try{for(n.s();!(l=n.n()).done;){var c=Object(u.a)(l.value,2),s=(c[0],c[1]);if(null!==rt.current&&s.id!==rt.current.id&&s.id!==t){var d=Math.abs(e.x-s.leftPoint[0]),h=Math.abs(e.x-s.rightPoint[0]),p=Math.abs(e.y-s.leftPoint[1]),y=Math.abs(e.y-s.rightPoint[1]);d<1&&dbt-a||Math.abs(o-Math.PI)1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2?arguments[2]:void 0,o=1/0,i=1/0,r=null,n=null,c=Object(f.a)(at.current);try{for(c.s();!(t=c.n()).done;){var s=Object(u.a)(t.value,2),d=(s[0],s[1]);if(null!==rt.current&&d.id!==rt.current.id&&d.id!==a){var h=Math.abs(e.x-d.leftPoint[0]),p=Math.abs(e.x-d.rightPoint[0]);h<.01&&ht.poleHeight)return!1;var r=JSON.parse(JSON.stringify(t));return r.cx=l,r.cy=a,r.lx=o,r.ly=i,Tw.isSolarCollectorWithinHorizontalSurface(r,e)},El=ye?k?.25:.75:1;return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)("group",{ref:ot,name:"".concat(dg," ").concat(n),userData:{aabb:!0},position:[c,s,Gt],rotation:[0,0,b[2]],children:[Object(gf.jsxs)(Lt.a,{castShadow:he,receiveShadow:he,uuid:n,userData:{simulation:!0,stand:!0},ref:it,name:"Foundation",args:[y,m,x],onContextMenu:function(e){E((function(t){(Yy.selectMe(t,n,e,X.ContextMenu),t.pastePoint.copy(e.intersections[0].point),t.clickObjectType=V.Foundation,t.pasteNormal=Rt,e.altKey)?t.contextMenuObjectType=null:e.intersections.length>0&&e.intersections[0].object===it.current&&(t.contextMenuObjectType=V.Foundation);t.pasteNormal=Rt}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===it.current&&Oe(!0))},onPointerDown:function(t){if(2!==t.button){E((function(e){e.contextMenuObjectType=null})),Ew.getState().objectTypeToAdd===V.Window||xe()||ne(n,t,X.Select);var l=L(),a=!1;if(t.intersections[0].object.name===V.Polygon&&Ew.getState().objectTypeToAdd!==V.None&&(a=!0),(null===l||void 0===l?void 0:l.id)===n||a)if(xl(Ew.getState().objectTypeToAdd)){if(e){Ve(!0);var o=t.intersections.filter((function(e){return!e.eventObject.name.startsWith("Wall Intersection Plane")}))[0].point,i=ce(e,o);i&&function(e){var t={name:"Add",timestamp:Date.now(),addedElement:e,undo:function(){re(t.addedElement.id,!1)},redo:function(){E((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement}))}};we(t)}(i),E((function(e){e.actionModeLock||(e.objectTypeToAdd=V.None)}))}}else Et.getState().selectNone(),Et.setState((function(e){e.foundationRef=ot}));else if(l&&l.parentId===n&&xl(l.type))switch(rt.current=l,l.type!==V.Wall||$e.current||(tt.current=Object(h.a)(Ew.getState().elements)),Ve(!0),Pt.current.set(l.cx,l.cy,l.cz),jt.current.set(l.lx,l.ly,l.lz),l.type){case V.SolarPanel:case V.ParabolicTrough:case V.FresnelReflector:zt.current=l.relativeAzimuth;break;case V.Polygon:Wt.current=l.vertices.map((function(e){return Object(d.a)({},e)}));break;case V.Wall:var r=l;zt.current=r.relativeAngle,Ct.current=[Object(h.a)(r.leftJoints),Object(h.a)(r.rightJoints)],Ft.current=[Object(h.a)(r.leftPoint),Object(h.a)(r.rightPoint)],Sl.current=r.leftJoints[0],jl.current=r.rightJoints[0],at.current.clear();var c,s=Object(f.a)(Ew.getState().elements);try{for(s.s();!(c=s.n()).done;){var u=c.value;u.type===V.Wall&&u.parentId===n&&at.current.set(u.id,u)}}catch(T){s.e(T)}finally{s.f()}}if($e.current&&_e.current&&it.current){var p=Nt.intersectObjects([it.current]);if(0===p.length)return;var y=Tw.wallRelativePosition(p[0].point,e);Qe[0].position&&(y.setX(Qe[0].position[0]),y.setY(Qe[0].position[1]));var g=vl(y,1.5),m=g.id,w=g.point,x=g.side,v=g.jointId;y=function(e,t){return Ew.getState().enableFineGrid?(e=Tw.snapToFineGrid(e),t=null):e=t||Tw.snapToNormalGrid(e),e}(y,w);var b=K.LowerRight;if(m){var A=Y(m);x===pe.Right?E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall){if(a.id===_e.current){var o=a;o.cx=y.x,o.cy=y.y,0===A.rightJoints.length&&(o.leftJoints=[A.id])}a.id===m&&0===A.rightJoints.length&&(a.rightJoints=_e.current?[_e.current]:[])}}}catch(T){l.e(T)}finally{l.f()}})):x!==pe.Left||v||(E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall){if(a.id===_e.current){var o=a;o.cx=y.x,o.cy=y.y,0===A.leftJoints.length&&(o.rightJoints=[A.id])}a.id===m&&0===A.leftJoints.length&&(a.leftJoints=_e.current?[_e.current]:[])}}}catch(T){l.e(T)}finally{l.f()}})),b=K.LowerLeft)}else U(_e.current,y.x,y.y);$e.current=!1,et.current=!0,ee(_e.current,[y.x,y.y,y.z]),E((function(t){t.resizeHandleType=b,t.resizeAnchor=Tw.wallAbsolutePosition(y,e)})),Et.getState().setEnableOrbitController(!1),rt.current=l}}else t.altKey&&ne(n,t,X.Select)},onPointerUp:function(e){if(e.altKey&&2===e.button&&ie&&ie.length>0){E((function(t){t.pastePoint.copy(e.intersections[0].point),t.clickObjectType=V.Foundation,t.pasteNormal=Rt}));var t=oe();if(t.length>0){var l={name:"Paste to Point",timestamp:Date.now(),pastedElements:t.map((function(e){return Object(d.a)({},e)})),undo:function(){var e,t=Object(f.a)(l.pastedElements);try{for(t.s();!(e=t.n()).done;){var a=e.value;re(a.id,!1)}}catch(o){t.e(o)}finally{t.f()}},redo:function(){E((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.pastedElements)),e.selectedElement=l.pastedElements[0]}))}};we(l)}}if(rt.current&&rt.current.parentId===n&&rt.current.type!==V.Tree&&rt.current.type!==V.Flower&&rt.current.type!==V.Human){var a=Y(rt.current.id);if(a){switch(a.type){case V.Wall:var o=a;if($e.current)E((function(e){e.elements.pop(),e.addedWallId=null,e.actionModeLock&&(e.objectTypeToAdd=V.Wall,Yy.selectNone(e))})),_e.current&&at.current.delete(_e.current),_e.current=null,$e.current=!1,et.current=!1;else if(et.current&&_e.current&&it.current)Et.getState().setEnableOrbitController(!0),E((function(e){e.actionModeLock&&(e.objectTypeToAdd=V.Wall,Yy.selectNone(e)),e.addedWallId=null,0===o.lx&&tt.current?(e.elements=Object(h.a)(tt.current),_e.current&&at.current.delete(_e.current)):(!function(e){var t={name:"Add",timestamp:Date.now(),addedElement:e,flippedWallSide:lt.current,undo:function(){var e=t.addedElement;if(re(e.id,!1),(t.flippedWallSide===Rp.right||t.flippedWallSide===Rp.loop)&&e.rightJoints.length>0){var l=Y(e.rightJoints[0]);l&&Tl(l)}else if(t.flippedWallSide===Rp.left&&e.leftJoints.length>0){var a=Y(e.leftJoints[0]);a&&Al(a)}},redo:function(){var e=t.addedElement;if(t.flippedWallSide===Rp.right||t.flippedWallSide===Rp.loop&&e.rightJoints.length>0){var l=Y(e.rightJoints[0]);l&&Al(l)}else if(t.flippedWallSide===Rp.left&&e.leftJoints.length>0){var a=Y(e.leftJoints[0]);a&&Tl(a)}e.rightJoints.length>0&&Z(e.rightJoints[0],[e.id]),e.leftJoints.length>0&&_(e.leftJoints[0],[e.id]),E((function(t){t.elements.push(e),t.selectedElement=e,t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag}))}};we(t)}(o),at.current.set(o.id,o))})),_e.current=null,et.current=!1;else if(Ew.getState().resizeHandleType)o.lx>.45?(at.current.set(o.id,o),St.current.set(o.cx,o.cy,o.cz),Ht.current.set(o.lx,o.ly,o.lz),Mt.current=o.relativeAngle,Ot.current=[Object(h.a)(o.leftJoints),Object(h.a)(o.rightJoints)],kt.current=[Object(h.a)(o.leftPoint),Object(h.a)(o.rightPoint)],function(e){var t=Ew.getState().getAutoDeletedElements(),l={name:"Resize Wall",timestamp:Date.now(),resizedElementId:e.id,resizedElementType:e.type,oldPosition:Pt.current.clone(),newPosition:St.current.clone(),oldDimension:jt.current.clone(),newDimension:Ht.current.clone(),oldAngle:zt.current,newAngle:Mt.current,oldJoints:[Object(h.a)(Ct.current[0]),Object(h.a)(Ct.current[1])],newJoints:[Object(h.a)(Ot.current[0]),Object(h.a)(Ot.current[1])],oldPoint:[Object(h.a)(Ft.current[0]),Object(h.a)(Ft.current[1])],newPoint:[Object(h.a)(kt.current[0]),Object(h.a)(kt.current[1])],flippedWallSide:lt.current,autoDeletedElement:t?Object(h.a)(t):[],undo:function(){switch(l.flippedWallSide){case Rp.right:if(l.newJoints[1]){var e=Y(l.newJoints[1][0]);e&&Tl(e)}break;case Rp.left:if(l.newJoints[0]){var t=Y(l.newJoints[0][0]);t&&Al(t)}break;case Rp.loop:if(l.newJoints[0]&&l.newJoints[1])bl(l.resizedElementId);else if(l.newJoints[1]){var a=Y(l.newJoints[1][0]);a&&Tl(a)}else if(l.newJoints[0]){var o=Y(l.newJoints[0][0]);o&&Al(o)}}E((function(e){var t,a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.resizedElementId){var r=i;switch(r.cx=l.oldPosition.x,r.cy=l.oldPosition.y,r.cz=l.oldPosition.z,r.lx=l.oldDimension.x,r.ly=l.oldDimension.y,r.lz=l.oldDimension.z,r.relativeAngle=l.oldAngle,r.leftJoints=Object(h.a)(l.oldJoints[0]),r.rightJoints=Object(h.a)(l.oldJoints[1]),r.leftPoint=Object(h.a)(l.oldPoint[0]),r.rightPoint=Object(h.a)(l.oldPoint[1]),l.flippedWallSide){case Rp.loop:if(l.oldJoints[0]!==l.newJoints[1]){var n,c=Object(f.a)(e.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.type===V.Wall&&(s.id===l.newJoints[1][0]&&(s.rightJoints=[]),s.id===l.oldJoints[0][0]&&(s.rightJoints=[l.resizedElementId]))}}catch(I){c.e(I)}finally{c.f()}}else if(l.oldJoints[1]!==l.newJoints[0]){var d,u=Object(f.a)(e.elements);try{for(u.s();!(d=u.n()).done;){var p=d.value;p.type===V.Wall&&(p.id===l.newJoints[0][0]&&(p.leftJoints=[]),p.id===l.oldJoints[1][0]&&(p.leftJoints=[l.resizedElementId]))}}catch(I){u.e(I)}finally{u.f()}}break;case Rp.left:case Rp.right:if(!l.oldJoints[0]&&l.newJoints[1]){var y,g=Object(f.a)(e.elements);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.Wall&&m.id===l.newJoints[1][0]){m.leftJoints=[];break}}}catch(I){g.e(I)}finally{g.f()}}else if(!l.oldJoints[1]&&l.newJoints[0]){var w,x=Object(f.a)(e.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.Wall&&v.id===l.newJoints[0][0]){v.rightJoints=[];break}}}catch(I){x.e(I)}finally{x.f()}}else if(l.flippedWallSide===Rp.left&&l.oldJoints[0]){var b,A=Object(f.a)(e.elements);try{for(A.s();!(b=A.n()).done;){var T=b.value;T.type===V.Wall&&(T.id===l.newJoints[1][0]&&(T.leftJoints=[]),T.id===l.oldJoints[0][0]&&(T.rightJoints=[r.id]))}}catch(I){A.e(I)}finally{A.f()}}else if(l.flippedWallSide===Rp.right&&l.oldJoints[1]){var P,S=Object(f.a)(e.elements);try{for(S.s();!(P=S.n()).done;){var j=P.value;j.type===V.Wall&&(j.id===l.newJoints[0][0]&&(j.rightJoints=[]),j.id===l.oldJoints[1][0]&&(j.leftJoints=[r.id]))}}catch(I){S.e(I)}finally{S.f()}}break;case Rp.null:if(l.oldJoints[0]!==l.newJoints[0]){var H,z=Object(f.a)(e.elements);try{for(z.s();!(H=z.n()).done;){var R=H.value;R.type===V.Wall&&(R.id===l.newJoints[0][0]&&(R.rightJoints=[]),R.id===l.oldJoints[0][0]&&(R.rightJoints=[r.id]))}}catch(I){z.e(I)}finally{z.f()}}if(l.oldJoints[1]!==l.newJoints[1]){var D,M=Object(f.a)(e.elements);try{for(M.s();!(D=M.n()).done;){var W=D.value;W.type===V.Wall&&(W.id===l.newJoints[1][0]&&(W.leftJoints=[]),W.id===l.oldJoints[1][0]&&(W.leftJoints=[r.id]))}}catch(I){M.e(I)}finally{M.f()}}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}break}}}catch(I){o.e(I)}finally{o.f()}(t=e.elements).push.apply(t,Object(h.a)(l.autoDeletedElement)),e.resizeHandleType=null,e.deletedRoofId=null,e.autoDeletedRoofs=null,e.autoDeletedRoofIdSet.clear(),e.autoDeletedChild=null})),lt.current=Rp.null},redo:function(){l.autoDeletedElement.length>0&&re(l.autoDeletedElement[0].id,!1,!1,!0);var e=new Set(l.autoDeletedElement.map((function(e){return e.id})));switch(E((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)}));var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.resizedElementId){var r=i;switch(r.cx=l.newPosition.x,r.cy=l.newPosition.y,r.cz=l.newPosition.z,r.lx=l.newDimension.x,r.ly=l.newDimension.y,r.lz=l.newDimension.z,l.flippedWallSide){case Rp.left:r.relativeAngle=(l.newAngle+Math.PI)%bt;var n,c=Object(f.a)(t.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Wall&&s.id===l.oldJoints[0][0]){s.rightJoints=[];break}}}catch(P){c.e(P)}finally{c.f()}break;case Rp.right:r.relativeAngle=(l.newAngle+Math.PI)%bt;var d,u=Object(f.a)(t.elements);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Wall&&p.id===l.oldJoints[1][0]){p.leftJoints=[];break}}}catch(P){u.e(P)}finally{u.f()}break;case Rp.loop:r.relativeAngle=(l.newAngle+Math.PI)%bt,r.leftJoints=Object(h.a)(l.newJoints[1]),r.rightJoints=Object(h.a)(l.newJoints[0]),r.leftPoint=Object(h.a)(l.newPoint[1]),r.rightPoint=Object(h.a)(l.newPoint[0]);var y,g=Object(f.a)(t.elements);try{for(g.s();!(y=g.n()).done;){var m=y.value;m.type===V.Wall&&(m.id===l.newJoints[0][0]&&(m.leftJoints=[r.id]),m.id===l.newJoints[1][0]&&(m.rightJoints=[r.id]))}}catch(P){g.e(P)}finally{g.f()}break;case Rp.null:if(r.relativeAngle=l.newAngle,r.leftJoints=Object(h.a)(l.newJoints[0]),r.rightJoints=Object(h.a)(l.newJoints[1]),r.leftPoint=Object(h.a)(l.newPoint[0]),r.rightPoint=Object(h.a)(l.newPoint[1]),l.oldJoints[0][0]!==l.newJoints[0][0]){var w,x=Object(f.a)(t.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;v.type===V.Wall&&(v.id===l.newJoints[0][0]&&(v.rightJoints=[r.id]),v.id===l.oldJoints[0][0]&&(v.rightJoints=[]))}}catch(P){x.e(P)}finally{x.f()}}if(l.oldJoints[1][0]!==l.newJoints[1][0]){var b,A=Object(f.a)(t.elements);try{for(A.s();!(b=A.n()).done;){var T=b.value;T.type===V.Wall&&(T.id===l.newJoints[1][0]&&(T.leftJoints=[r.id]),T.id===l.oldJoints[1][0]&&(T.leftJoints=[]))}}catch(P){A.e(P)}finally{A.f()}}t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag}break}}}catch(P){o.e(P)}finally{o.f()}t.resizeHandleType=null})),setTimeout((function(){E((function(e){e.deletedRoofId=null,e.autoDeletedRoofs=null,e.autoDeletedRoofIdSet.clear()}))})),l.flippedWallSide){case Rp.left:var t=Y(l.resizedElementId),a=Y(l.newJoints[1][0]);Tl(t,a);break;case Rp.right:var o=Y(l.resizedElementId),i=Y(l.newJoints[0][0]);Al(o,i);break;case Rp.loop:at.current.clear();var r,c=Object(f.a)(Ew.getState().elements);try{for(c.s();!(r=c.n()).done;){var s=r.value;s.type===V.Wall&&s.parentId===n&&at.current.set(s.id,s)}}catch(d){c.e(d)}finally{c.f()}bl(l.resizedElementId)}lt.current=Rp.null}};we(l),E((function(t){t.actionState.wallHeight=e.lz,t.deletedRoofId=null,t.autoDeletedRoofs=null,t.autoDeletedRoofIdSet.clear(),t.autoDeletedChild=[]}))}(o)):E((function(e){tt.current&&(e.elements=Object(h.a)(tt.current),tt.current=null)}));else if(Ew.getState().moveHandleType){var i=o.relativeAngle,r=[],c=[];if(Sl.current)if(o.leftJoints.length>0&&(Sl.current!==o.leftJoints[0]||Sl.current===o.leftJoints[0]&&Hl.current)&&_(o.leftJoints[0],[]),Hl.current)Z(Sl.current,[o.id]),c=[Sl.current];else if(r=[Sl.current],Rl.current){Z(Sl.current,[o.id]);var s=Y(Sl.current);s&&Tl(s)}else _(Sl.current,[o.id]);else o.leftJoints.length>0&&o.leftJoints[0]!==jl.current&&(r=[],_(o.leftJoints[0],[]));if(jl.current)if(o.rightJoints.length>0&&(jl.current!==o.rightJoints[0]||jl.current===o.rightJoints[0]&&Hl.current)&&o.rightJoints[0]!==Sl.current&&Z(o.rightJoints[0],[]),Hl.current)_(jl.current,[o.id]),r=[jl.current];else if(c=[jl.current],zl.current){_(jl.current,[o.id]);var p=Y(jl.current);p&&Al(p)}else Z(jl.current,[o.id]);else o.rightJoints.length>0&&o.rightJoints[0]!==Sl.current&&(c=[],Z(o.rightJoints[0],[]));E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===o.id&&a.type===V.Wall){var n=a;if(Hl.current){i=(n.relativeAngle+Math.PI)%bt,n.relativeAngle=i;var s=[Object(h.a)(n.rightPoint),Object(h.a)(n.leftPoint)];n.leftPoint=s[0],n.rightPoint=s[1]}if(0===r.length&&0===c.length)n.roofId=null;else if(r.length>0){var d=e.elements.find((function(e){return e.id===r[0]}));d&&(n.roofId=d.roofId)}else if(c.length>0){var u=e.elements.find((function(e){return e.id===c[0]}));u&&(n.roofId=u.roofId)}n.leftJoints=Object(h.a)(r),n.rightJoints=Object(h.a)(c);break}}}catch(p){l.e(p)}finally{l.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag})),Pl(o.id),function(e,t,l){if(e.roofId)tl.current=!0,ll.current={wall:e,newAngle:t,newJoints:[Object(h.a)(l[0]),Object(h.a)(l[1])]};else{var a={name:"Move Wall",timestamp:Date.now(),id:e.id,oldPoints:[Object(h.a)(Ft.current[0]),Object(h.a)(Ft.current[1])],newPoints:[Object(h.a)(e.leftPoint),Object(h.a)(e.rightPoint)],oldJoints:[Object(h.a)(Ct.current[0]),Object(h.a)(Ct.current[1])],newJoints:[Object(h.a)(l[0]),Object(h.a)(l[1])],oldAngle:zt.current,newAngle:t,flippedWallSide:lt.current,undo:function(){var e=this;switch(this.flippedWallSide){case Rp.loop:bl(this.id);break;case Rp.left:var t=Y(this.newJoints[0][0]);t&&Al(t);break;case Rp.right:var l=Y(this.newJoints[1][0]);l&&Tl(l)}var a=Object(u.a)(this.oldJoints,2),o=a[0],i=a[1],r=Object(u.a)(this.newJoints,2),n=r[0],c=r[1];E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var r=l.value;if(r.id===e.id){var n=Object(u.a)(e.oldPoints,2),c=n[0],s=n[1];r.cx=(c[0]+s[0])/2,r.cy=(c[1]+s[1])/2,r.lx=Math.hypot(c[0]-s[0],c[1]-s[1]);var d=r;d.relativeAngle=e.oldAngle,d.leftPoint=Object(h.a)(c),d.rightPoint=Object(h.a)(s),d.leftJoints=Object(h.a)(o),d.rightJoints=Object(h.a)(i);break}}}catch(p){a.e(p)}finally{a.f()}t.resizeHandleType=null})),o[0]!==n[0]&&E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.type===V.Wall&&(i.id===o[0]&&(i.rightJoints=[e.id]),i.id===n[0]&&(e.flippedWallSide!==Rp.left?i.rightJoints=[]:i.leftJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),i[0]!==c[0]&&E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&(o.id===i[0]&&(o.leftJoints=[e.id]),o.id===c[0]&&(e.flippedWallSide!==Rp.right?o.leftJoints=[]:o.rightJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),lt.current=Rp.null},redo:function(){var e=this,t=Object(u.a)(this.oldJoints,2),l=t[0],a=t[1],o=Object(u.a)(this.newJoints,2),i=o[0],r=o[1];switch(E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===e.id&&o.type===V.Wall){var n=Object(u.a)(e.newPoints,2),c=n[0],s=n[1];o.cx=(c[0]+s[0])/2,o.cy=(c[1]+s[1])/2,o.lx=Math.hypot(c[0]-s[0],c[1]-s[1]);var d=o;d.relativeAngle=e.newAngle,d.leftPoint=Object(h.a)(c),d.rightPoint=Object(h.a)(s),d.leftJoints=Object(h.a)(i),d.rightJoints=Object(h.a)(r);break}}}catch(p){a.e(p)}finally{a.f()}})),l[0]!==i[0]&&E((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;r.type===V.Wall&&(r.id===l[0]&&(r.rightJoints=[]),r.id===i[0]&&(e.flippedWallSide===Rp.right?r.leftJoints=[e.id]:r.rightJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),a[0]!==r[0]&&E((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type===V.Wall&&(i.id===a[0]&&(i.leftJoints=[]),i.id===r[0]&&(e.flippedWallSide===Rp.right?i.rightJoints=[e.id]:i.leftJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),this.flippedWallSide){case Rp.loop:bl(this.id);break;case Rp.left:var n=Y(this.newJoints[0][0]);n&&Tl(n);break;case Rp.right:var c=Y(this.newJoints[1][0]);c&&Al(c)}E((function(e){e.resizeHandleType=null})),lt.current=Rp.null}};we(a)}}(o,i,[Object(h.a)(r),Object(h.a)(c)]),Hl.current=!1,Rl.current=!1,zl.current=!1,Sl.current=null,jl.current=null}lt.current=Rp.null,E((function(e){e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag})),Be({show:!1,direction:null,position:null}),Ze([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]);break;case V.Polygon:if(Ew.getState().moveHandleType||Ew.getState().resizeHandleType){It.current=a.vertices.map((function(e){return Object(d.a)({},e)}));var y={name:Ew.getState().moveHandleType?"Move Polygon":"Resize Polygon",timestamp:Date.now(),oldValue:Wt.current,newValue:It.current,changedElementId:a.id,changedElementType:a.type,undo:function(){ae(y.changedElementId,y.oldValue)},redo:function(){ae(y.changedElementId,y.newValue)}};we(y)}break;default:if(Ew.getState().resizeHandleType){if(St.current.set(a.cx,a.cy,a.cz),Ht.current.set(a.lx,a.ly,a.lz),St.current.distanceToSquared(Pt.current)>At||Ht.current.distanceToSquared(jt.current)>At){var g={name:"Resize",timestamp:Date.now(),resizedElementId:rt.current.id,resizedElementType:rt.current.type,oldCx:Pt.current.x,oldCy:Pt.current.y,oldCz:Pt.current.z,newCx:St.current.x,newCy:St.current.y,newCz:St.current.z,oldLx:jt.current.x,oldLy:jt.current.y,oldLz:jt.current.z,newLx:Ht.current.x,newLy:Ht.current.y,newLz:Ht.current.z,undo:function(){U(g.resizedElementId,g.oldCx,g.oldCy,g.oldCz),N(g.resizedElementId,g.oldLx,g.oldLy,g.oldLz)},redo:function(){U(g.resizedElementId,g.newCx,g.newCy,g.newCz),N(g.resizedElementId,g.newLx,g.newLy,g.newLz)}};we(g)}}else if(Ew.getState().rotateHandleType){if(Tw.isSolarCollector(rt.current)){var m=rt.current;if(Math.abs(Mt.current-zt.current)>At)if(Yl(m,Mt.current)){E((function(e){e.selectedElementAngle=Mt.current}));var w={name:"Rotate",timestamp:Date.now(),oldValue:zt.current,newValue:Mt.current,changedElementId:m.id,changedElementType:m.type,undo:function(){te(w.changedElementId,w.oldValue)},redo:function(){te(w.changedElementId,w.newValue)}};we(w)}else te(m.id,zt.current)}}else if(St.current.set(a.cx,a.cy,a.cz),St.current.distanceToSquared(Pt.current)>At){var x=!0;if(Tw.isSolarCollector(a)&&(x=kl(a,a.cx,a.cy)),x){var v={name:"Move",timestamp:Date.now(),movedElementId:a.id,movedElementType:a.type,oldCx:Pt.current.x,oldCy:Pt.current.y,oldCz:Pt.current.z,newCx:St.current.x,newCy:St.current.y,newCz:St.current.z,undo:function(){U(v.movedElementId,v.oldCx,v.oldCy,v.oldCz)},redo:function(){U(v.movedElementId,v.newCx,v.newCy,v.newCz)}};we(v)}else U(a.id,Pt.current.x,Pt.current.y,Pt.current.z)}}Ve(!1),rt.current=null,E((function(e){e.resizeHandleType=null,e.moveHandleType=null}))}}},onPointerMove:function(t){var l,a;if(e&&(!rt.current||!Tw.isSolarCollector(rt.current))){var o=Ew.getState().objectTypeToAdd;if((rt.current||_e.current||o===V.Wall)&&((null===(l=rt.current)||void 0===l?void 0:l.parentId)===n||o!==V.None)){var i=Ew.getState().moveHandleType,r=Ew.getState().resizeHandleType,c=Ew.getState().resizeAnchor;if(ul(t),it.current){var s=Nt.intersectObjects([it.current]);if(0===s.length)return;var p=s[0].point;if(rt.current&&rt.current.type&&!rt.current.locked&&s.length>0)switch(rt.current.type){case V.Sensor:case V.Light:p=Tw.relativeCoordinates(p.x,p.y,p.z,e),U(rt.current.id,p.x,p.y);break;case V.Polygon:var y=rt.current;if(i===B.Default){p=Tw.relativeCoordinates(p.x,p.y,p.z,e);var g=Tw.calculatePolygonCentroid(y.vertices),m=p.x-g.x,w=p.y-g.y,x=y.vertices.map((function(e){return Object(d.a)({},e)}));x.forEach((function(e){e.x+=m,e.y+=w})),ae(y.id,x)}else r===K.Default&&(p.x-=e.cx,p.y-=e.cy,p.applyEuler((new Me.Euler).fromArray(e.rotation.map((function(e){return-e})))),(p=Ew.getState().enableFineGrid?Tw.snapToFineGrid(p):Tw.snapToNormalGrid(p)).x/=e.lx,p.y/=e.ly,le(y.id,y.selectedIndex,p.x,p.y));break;case V.Wall:if((null===(a=Ew.getState().selectedElement)||void 0===a?void 0:a.type)!==V.Wall)break;if(!r||r!==K.LowerLeft&&r!==K.LowerRight){if(i){var v=Y(rt.current.id);if(v){p=Tw.wallRelativePosition(p,e);var b=new Me.Vector3,A=new Me.Euler(0,0,v.relativeAngle);i===B.Lower?b.setY(Qt):i===B.Upper&&b.setY(-Qt-v.ly),p.add(b.applyEuler(A));var T=(new Me.Vector3).addVectors(p,new Me.Vector3(-v.lx/2,0,0).applyEuler(A)),P=(new Me.Vector3).addVectors(p,new Me.Vector3(v.lx/2,0,0).applyEuler(A)),S=null,j=null,H=!1;Hl.current=!1,Rl.current=!1,zl.current=!1,Sl.current=null,jl.current=null;var z=function(e,t){var l="left"===t?T:P,a=(new Me.Vector3).subVectors(e,l);p.add(a),T.add(a),P.add(a)};if(!Ew.getState().enableFineGrid){var R=vl(T,1);R.point?(z(R.point,"left"),!R.id||R.jointId&&R.jointId!==v.id||(Sl.current=R.id,S=R.side===pe.Left)):Sl.current=null;var D=vl(P,1);if(D.point?(R.id||z(D.point,"right"),!D.id||D.jointId&&D.jointId!==v.id||R.id===D.id&&R.side===D.side||(jl.current=D.id,j=D.side===pe.Right)):jl.current=null,!R.point&&!D.point){var M=Ml(T),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Ml(P),F=Object(u.a)(O,2),k=F[0],L=F[1];if(null!==I||null!==k){var N=(null!==I&&void 0!==I?I:1/0)-T.x,J=(null!==k&&void 0!==k?k:1/0)-P.x,G=Math.min(N,J);T.setX(T.x+G),P.setX(P.x+G),p.setX(p.x+G),(R=vl(T,1)).point?(z(R.point,"left"),!R.id||R.jointId&&R.jointId!==v.id||(Sl.current=R.id,S=R.side===pe.Left)):Sl.current=null}if(null!==C||null!==L){var X=(null!==C&&void 0!==C?C:1/0)-T.y,q=(null!==L&&void 0!==L?L:1/0)-P.y,Q=Math.min(X,q);T.setY(T.y+Q),P.setY(P.y+Q),p.setY(p.y+Q),(D=vl(P,1)).point?(R.id||z(D.point,"right"),!D.id||D.jointId&&D.jointId!==v.id||R.id===D.id&&R.side===D.side||(jl.current=D.id,j=D.side===pe.Right)):jl.current=null}}var Z=Cl(T,0),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Cl(P,1),oe=Object(u.a)(te,2),ie=oe[0],re=oe[1];Ze(Object(Pe.a)((function(e){e[0].show=$||ee,e[1].show=ie||re}))),S&&null===j||j&&null===S||S&&j?Hl.current=!0:(S&&!1===j||j&&!1===S)&&(Rl.current=S,zl.current=j),R.point&&D.point&&(R.id===D.id&&R.side===D.side||(T.copy(R.point),P.copy(D.point),H=!0))}E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a,o=t.value;if(o.id===(null===(a=rt.current)||void 0===a?void 0:a.id)&&o.type===V.Wall){var i=o;if(H){i.cx=(T.x+P.x)/2,i.cy=(T.y+P.y)/2,i.lx=T.distanceTo(P);var r=Math.atan2(P.y-T.y,P.x-T.x);r=r>=0?r:(bt+r)%bt,i.relativeAngle=r}else i.cx=p.x,i.cy=p.y;i.leftPoint=T.toArray(),i.rightPoint=P.toArray();break}}}catch(n){l.e(n)}finally{l.f()}}))}}}else{var ne=Tw.wallRelativePosition(c,e);p=Tw.wallRelativePosition(p,e);var se,de,ue=null;if(Ew.getState().enableFineGrid)p=Tw.snapToFineGrid(p);else if(null===(se=ue=vl(p,1.5))||void 0===se?void 0:se.point)p=ue.point;else p=Tw.snapToNormalGrid(p),p=Wl(ne,p,r),(null===(de=ue=vl(p,1.5))||void 0===de?void 0:de.point)&&(p=ue.point);var fe=Dl(ne,p,r);Fl(p,fe);var he=p.distanceTo(ne),ye=(new Me.Vector3).addVectors(p,ne).divideScalar(2),ge=r===K.LowerLeft?p:ne,me=r===K.LowerLeft?ne:p;E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===rt.current.id&&a.type===V.Wall){var o=a;o.cx=ye.x,o.cy=ye.y,o.lx=he,o.relativeAngle=fe,o.leftPoint=[ge.x,ge.y,0],o.rightPoint=[me.x,me.y,0];break}}}catch(i){l.e(i)}finally{l.f()}}));var we=Y(rt.current.id);if(we)if(ue&&ue.point){if(ue.id&&ue.side&&!ue.jointId){var xe=Y(ue.id);if(xe){if(r===K.LowerLeft&&0===xe.leftJoints.length&&ue.side===pe.Left){if(we.leftJoints.length>0&&we.leftJoints[0]!==ue.id){var ve=we.leftJoints[0];E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===ve&&a.type===V.Wall){a.rightJoints=[];break}}}catch(o){l.e(o)}finally{l.f()}}))}Tl(we,xe)}else if(r===K.LowerRight&&0===xe.rightJoints.length&&ue.side===pe.Right){if(we.rightJoints.length>0&&we.rightJoints[0]!==ue.id){var be=we.rightJoints[0];E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===be&&a.type===V.Wall){a.leftJoints=[];break}}}catch(o){l.e(o)}finally{l.f()}}))}Al(we,xe)}else r===K.LowerRight&&ue.side===pe.Left&&0===xe.leftJoints.length&&xe.rightJoints[0]!==we.id?E((function(e){var t,l=null;we.rightJoints.length>0&&we.rightJoints[0]!==(null===(t=ue)||void 0===t?void 0:t.id)&&(l=we.rightJoints[0]);var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&(i.id===we.id&&(i.rightJoints=[xe.id]),i.id===xe.id&&(i.leftJoints=[we.id]),i.id===l&&(i.leftJoints=[]))}}catch(r){o.e(r)}finally{o.f()}})):r===K.LowerLeft&&ue.side===pe.Right&&0===xe.rightJoints.length&&xe.leftJoints[0]!==we.id&&E((function(e){var t,l=null;we.leftJoints.length>0&&we.leftJoints[0]!==(null===(t=ue)||void 0===t?void 0:t.id)&&(l=we.leftJoints[0]);var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&(i.id===we.id&&(i.leftJoints=[xe.id]),i.id===xe.id&&(i.rightJoints=[we.id]),i.id===l&&(i.rightJoints=[]))}}catch(r){o.e(r)}finally{o.f()}}));Pl(we.id)}}}else if(r===K.LowerRight&&we.rightJoints.length>0){var Ae=we.rightJoints[0];E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Wall&&(a.id===we.id&&(a.rightJoints=[]),a.id===Ae&&(a.leftJoints=[]))}}catch(o){l.e(o)}finally{l.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}))}else if(r===K.LowerLeft&&we.leftJoints.length>0){var Te=we.leftJoints[0];E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Wall&&(a.id===we.id&&(a.leftJoints=[]),a.id===Te&&(a.rightJoints=[]))}}catch(o){l.e(o)}finally{l.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}))}}}if(o===V.Wall&&!$e.current){tt.current=Object(h.a)(Ew.getState().elements);var Se=ce(e,p);rt.current=Se,_e.current=Se.id,$e.current=!0,Ve(!0),Et.getState().setEnableOrbitController(!1),E((function(e){e.addedWallId=Se.id,e.objectTypeToAdd=V.None}))}if(_e.current&&$e.current){p=Tw.wallRelativePosition(s[0].point,e);var je,He=null;if(Ew.getState().enableFineGrid)p=Tw.snapToFineGrid(p);else if(null===(je=He=vl(p,1.5))||void 0===je?void 0:je.point)p=He.point;else{var ze;p=Tw.snapToNormalGrid(p);var Re=Ml(p),De=Object(u.a)(Re,2),We=De[0],Ie=De[1];null!==We&&p.setX(We),null!==Ie&&p.setY(Ie),(null===(ze=He=vl(p,1.5))||void 0===ze?void 0:ze.point)&&(p=He.point)}var Ce=Cl(p),Oe=Object(u.a)(Ce,2),Fe=Oe[0],ke=Oe[1];Ze(Object(Pe.a)((function(e){e[0].show=Fe||ke}))),U(_e.current,p.x,p.y)}}}}},onPointerOut:function(){Oe(!1),Ve(!1),rt.current&&$e.current&&(re(rt.current.id,!1),$e.current=!1,E((function(e){e.addedWallId=null,e.objectTypeToAdd=V.Wall})),rt.current=null),Be({show:!1,direction:null,position:null}),Ze([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}])},onPointerEnter:function(e){rt.current&&Tw.isPlantOrHuman(rt.current)&&(e.intersections[0].object===it.current&&Ve(!0))},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El}),Ae&&Ye?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",color:"white",map:Ye,transparent:ye,opacity:El}):Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:I===se.NoTexture?T:"white",map:yl,transparent:ye,opacity:El}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El})]}),rt.current&&Tw.isSolarCollector(rt.current)&&!rt.current.locked&&Object(gf.jsx)(Lt.f,{ref:nt,name:"Foundation Intersection Plane",position:il,args:[y,m],visible:!1,onPointerMove:function(t){if(nt.current&&e&&rt.current&&e){if(!Tw.isSolarCollector(rt.current))return;var l=rt.current;ul(t);var a=Nt.intersectObjects([nt.current]);if(a.length>0){var o=a[0].point,i=Ew.getState().moveHandleType,r=Ew.getState().rotateHandleType,n=Ew.getState().resizeHandleType;if(i&&e)o=Tw.relativeCoordinates(o.x,o.y,o.z,e),U(l.id,o.x,o.y);else if(r){if(r===q.Upper||r===q.Lower){var d=e.rotation[2],u=new Me.Vector2(e.cx,e.cy),f=new Me.Vector2(e.lx*l.cx,e.ly*l.cy).rotateAround(Dt,d),h=(new Me.Vector2).addVectors(f,u),p=Math.atan2(-o.x+h.x,o.y-h.y)-d+(r===q.Lower?0:Math.PI),g=p+(Math.abs(p)>Math.PI?-Math.sign(p)*bt:0);te(l.id,g),Mt.current=g}}else if(n){var w=Ew.getState().resizeAnchor,x=new Me.Vector2(o.x,o.y),v=new Me.Vector2(w.x,w.y),A=x.distanceTo(v),T=l.relativeAzimuth+b[2],P=(new Me.Vector2).subVectors(x,v),S=new Me.Vector2(c,s);if(l.type===V.SolarPanel){var j=l,H=de(j.pvModelName);switch(n){case K.Lower:case K.Upper:var z=n===K.Lower?1:-1,R=P.angle()-T+z*vt,D=A*Math.cos(R);if(j.orientation===$.portrait)D=Math.max(1,Math.ceil((D-H.length/2)/H.length))*H.length;else D=Math.max(1,Math.ceil((D-H.width/2)/H.width))*H.width;var M=w.x+z*(D*Math.sin(T))/2,W=w.y-z*(D*Math.cos(T))/2,I=new Me.Vector2(M,W),C=(new Me.Vector2).subVectors(I,S).rotateAround(Dt,-b[2]),O=C.x/y,F=C.y/m;Ll(l,O,F,l.lx,D)&&(Q(l.id,D),U(l.id,O,F));break;case K.Left:case K.Right:var k=n===K.Left?-1:1,Y=P.angle()-T+(n===K.Left?Math.PI:0),L=A*Math.cos(Y);if(j.orientation===$.portrait)L=Math.max(1,Math.ceil((L-H.width/2)/H.width))*H.width;else L=Math.max(1,Math.ceil((L-H.length/2)/H.length))*H.length;var N=w.x+k*(L*Math.cos(T))/2,G=w.y+k*(L*Math.sin(T))/2,X=new Me.Vector2(N,G),B=(new Me.Vector2).subVectors(X,S).rotateAround(Dt,-b[2]),Z=B.x/y,_=B.y/m;Ll(l,Z,_,L,l.ly)&&(J(l.id,L),U(l.id,Z,_))}}else if(l.type===V.ParabolicTrough){var ee=l;switch(n){case K.Lower:case K.Upper:var le=n===K.Lower?1:-1,ae=P.angle()-T+le*vt,oe=A*Math.cos(ae);oe=Math.max(1,Math.ceil((oe-ee.moduleLength/2)/ee.moduleLength))*ee.moduleLength;var ie=w.x+le*(oe*Math.sin(T))/2,re=w.y-le*(oe*Math.cos(T))/2,ne=new Me.Vector2(ie,re),ce=(new Me.Vector2).subVectors(ne,S).rotateAround(Dt,-b[2]),se=ce.x/y,ue=ce.y/m;Ll(l,se,ue,l.lx,oe)&&(Q(l.id,oe),U(l.id,se,ue));break;case K.Left:case K.Right:var fe=n===K.Left?-1:1,he=P.angle()-T+(n===K.Left?Math.PI:0),pe=A*Math.cos(he),ye=w.x+fe*(pe*Math.cos(T))/2,ge=w.y+fe*(pe*Math.sin(T))/2,me=new Me.Vector2(ye,ge),we=(new Me.Vector2).subVectors(me,S).rotateAround(Dt,-b[2]),xe=we.x/y,ve=we.y/m;Ll(l,xe,ve,pe,l.ly)&&(J(l.id,pe),U(l.id,xe,ve),E((function(e){e.actionState.parabolicTroughWidth=pe})))}}else if(l.type===V.FresnelReflector){var be=l;switch(n){case K.Lower:case K.Upper:var Ae=n===K.Lower?1:-1,Te=P.angle()-T+Ae*vt,Pe=A*Math.cos(Te);Pe=Math.max(1,Math.ceil((Pe-be.moduleLength/2)/be.moduleLength))*be.moduleLength;var Se=w.x+Ae*(Pe*Math.sin(T))/2,je=w.y-Ae*(Pe*Math.cos(T))/2,He=new Me.Vector2(Se,je),ze=(new Me.Vector2).subVectors(He,S).rotateAround(Dt,-b[2]),Re=ze.x/y,De=ze.y/m;Ll(l,Re,De,l.lx,Pe)&&(Q(l.id,Pe),U(l.id,Re,De));break;case K.Left:case K.Right:var We=n===K.Left?-1:1,Ie=P.angle()-T+(n===K.Left?Math.PI:0),Ce=A*Math.cos(Ie),Oe=w.x+We*(Ce*Math.cos(T))/2,Fe=w.y+We*(Ce*Math.sin(T))/2,ke=new Me.Vector2(Oe,Fe),Ye=(new Me.Vector2).subVectors(ke,S).rotateAround(Dt,-b[2]),Le=Ye.x/y,Ee=Ye.y/m;Ll(l,Le,Ee,Ce,l.ly)&&(J(l.id,Ce),U(l.id,Le,Ee),E((function(e){e.actionState.fresnelReflectorWidth=Ce})))}}else if(l.type===V.ParabolicDish){var Ue=l;switch(n){case K.Left:case K.Right:case K.Lower:case K.Upper:var Ne=Math.min(10,A);Ll(l,Ue.cx,Ue.cy,l.lx,Ne)&&(J(l.id,Ne),Q(l.id,Ne),E((function(e){e.actionState.parabolicDishRimDiameter=Ne})))}}}}}},onPointerOut:function(){if(rt.current&&Tw.isSolarCollector(rt.current)){var e=Ew.getState().getElementById(rt.current.id);Ew.getState().moveHandleType&&!kl(e,e.cx,e.cy)&&U(e.id,Pt.current.x,Pt.current.y,Pt.current.z)}}}),Ne&&Object(gf.jsxs)(gf.Fragment,{children:[Ew.getState().rotateHandleType&&rt.current&&Tw.isSolarCollector(rt.current)&&Object(gf.jsx)(ly,{element:rt.current,height:rt.current.poleHeight+Gt}),(Ew.getState().moveHandleType||Ew.getState().resizeHandleType||_e.current)&&Object(gf.jsx)(mf,{hx:Vt,hy:Jt,hz:Gt})]}),O&&Object(gf.jsx)(cy,{element:e,verticalLift:Zt}),(!O||ye)&&Object(gf.jsx)(ry,{hx:Vt,hy:Jt,hz:Gt,lineColor:ye&&k?"white":S,lineWidth:ye&&k?3*H:H}),O&&R&&Object(gf.jsx)(ry,{hx:Vt,hy:Jt,hz:Gt,lineColor:yt,lineWidth:5*H}),Xe.show&&Object(gf.jsx)("group",{position:[0,0,Gt+.01],children:Object(gf.jsx)(fg,{hx:Vt,hy:Jt,position:Xe.position,direction:Xe.direction,color:"black"})}),Object(gf.jsx)("group",{position:[0,0,Gt+.01],children:Qe.map((function(e,t){return e.show?Object(gf.jsx)(fg,{hx:Vt,hy:Jt,position:e.position,direction:e.direction,color:"yellow"},t):null}))}),O&&!R&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.a,{ref:ct,position:[Xt.x,Xt.y,0],args:[_t,_t,1.2*x],name:K.LowerLeft,onPointerDown:function(e){ne(n,e,X.Resize),ct.current&&E((function(e){var t=ct.current.localToWorld(new Me.Vector3(y,m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){ml(e,K.LowerLeft)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.LowerLeft||Ew.getState().resizeHandleType===K.LowerLeft?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:st,position:[Bt.x,Bt.y,0],args:[_t,_t,1.2*x],name:K.UpperLeft,onPointerDown:function(e){ne(n,e,X.Resize),st.current&&E((function(e){var t=st.current.localToWorld(new Me.Vector3(y,-m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){ml(e,K.UpperLeft)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.UpperLeft||Ew.getState().resizeHandleType===K.UpperLeft?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:dt,position:[Kt.x,Kt.y,0],args:[_t,_t,1.2*x],name:K.LowerRight,onPointerDown:function(e){ne(n,e,X.Resize),dt.current&&E((function(e){var t=dt.current.localToWorld(new Me.Vector3(-y,m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){ml(e,K.LowerRight)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.LowerRight||Ew.getState().resizeHandleType===K.LowerRight?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:gt,position:[qt.x,qt.y,0],args:[_t,_t,1.2*x],name:K.UpperRight,onPointerDown:function(e){ne(n,e,X.Resize),gt.current&&E((function(e){var t=gt.current.localToWorld(new Me.Vector3(-y,-m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){ml(e,K.UpperRight)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.UpperRight||Ew.getState().resizeHandleType===K.UpperRight?pt:ht})}),!ge&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:mt,args:[Zt,6,6,0,Math.PI],position:[0,-Jt-Zt,0],name:B.Lower,onPointerDown:function(e){E((function(e){var t;e.moveHandleType=B.Lower,e.selectedElement=null!==(t=e.elements.find((function(e){return e.id===n})))&&void 0!==t?t:null;var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;e.selectedElementIdSet.has(o.id)&&!Tw.isElementAllowedMultipleMoveOnGround(o)&&e.selectedElementIdSet.delete(o.id)}}catch(i){a.e(i)}finally{a.f()}})),Et.getState().setEnableOrbitController(!1)},onPointerOver:function(e){ml(e,B.Lower)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Lower||Ew.getState().moveHandleType===B.Lower?pt:ft})}),Object(gf.jsx)(Lt.h,{ref:wt,args:[Zt,6,6,0,Math.PI],position:[0,Jt+Zt,0],name:B.Upper,onPointerDown:function(e){E((function(e){var t;e.moveHandleType=B.Upper,e.selectedElement=null!==(t=e.elements.find((function(e){return e.id===n})))&&void 0!==t?t:null;var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;e.selectedElementIdSet.has(o.id)&&!Tw.isElementAllowedMultipleMoveOnGround(o)&&e.selectedElementIdSet.delete(o.id)}}catch(i){a.e(i)}finally{a.f()}})),Et.getState().setEnableOrbitController(!1)},onPointerOver:function(e){ml(e,B.Upper)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Upper||Ew.getState().moveHandleType===B.Upper?pt:ft})}),Object(gf.jsx)(Lt.h,{ref:xt,args:[Zt,6,6,0,Math.PI],position:[-Vt-Zt,0,0],name:B.Left,onPointerDown:function(e){E((function(e){var t;e.moveHandleType=B.Left,e.selectedElement=null!==(t=e.elements.find((function(e){return e.id===n})))&&void 0!==t?t:null;var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;e.selectedElementIdSet.has(o.id)&&!Tw.isElementAllowedMultipleMoveOnGround(o)&&e.selectedElementIdSet.delete(o.id)}}catch(i){a.e(i)}finally{a.f()}})),Et.getState().setEnableOrbitController(!1)},onPointerOver:function(e){ml(e,B.Left)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Left||Ew.getState().moveHandleType===B.Left?pt:ut})}),Object(gf.jsx)(Lt.h,{ref:Tt,args:[Zt,6,6,0,Math.PI],position:[Vt+Zt,0,0],name:B.Right,onPointerDown:function(e){E((function(e){var t;e.moveHandleType=B.Right,e.selectedElement=null!==(t=e.elements.find((function(e){return e.id===n})))&&void 0!==t?t:null;var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;e.selectedElementIdSet.has(o.id)&&!Tw.isElementAllowedMultipleMoveOnGround(o)&&e.selectedElementIdSet.delete(o.id)}}catch(i){a.e(i)}finally{a.f()}})),Et.getState().setEnableOrbitController(!1)},onPointerOver:function(e){ml(e,B.Right)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Right||Ew.getState().moveHandleType===B.Right?pt:ut})}),Object(gf.jsx)(oy,{id:n,position:[0,-el,0],color:be===q.Lower||Ew.getState().rotateHandleType===q.Lower?pt:ht,ratio:$t,handleType:q.Lower,hoverHandle:ml,noHoverHandle:wl}),Object(gf.jsx)(oy,{id:n,position:[0,el,0],color:be===q.Upper||Ew.getState().rotateHandleType===q.Upper?pt:ht,ratio:$t,handleType:q.Upper,hoverHandle:ml,noHoverHandle:wl})]})]}),!ge&&Object(gf.jsxs)(gf.Fragment,{children:[(Ce||M)&&!O&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.FoundationElement",Yt))+(R?" ("+me.t("shared.ElementLocked",Yt)+")":""),color:null!==(t=null===e||void 0===e?void 0:e.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===e||void 0===e?void 0:e.labelFontSize)&&void 0!==l?l:20,fontFace:"Roboto",textHeight:null!==(a=null===e||void 0===e?void 0:e.labelSize)&&void 0!==a?a:.2,position:[0,0,null!==(i=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==i?i:Gt+.2]}),!R&&be===K.LowerLeft&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-LL",text:"LL",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[-Vt,-Jt,Gt+.2]}),!R&&be===K.UpperLeft&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-UL",text:"UL",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[-Vt,Jt,Gt+.2]}),!R&&be===K.LowerRight&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-LR",text:"LR",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[Vt,-Jt,Gt+.2]}),!R&&be===K.UpperRight&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-UR",text:"UR",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[Vt,Jt,Gt+.2]})]}),C===G.FocusPipe&&Object(gf.jsx)(ky,{foundation:e}),C===G.FocusTower&&Object(gf.jsx)(Oy,{foundation:e}),C===G.UpdraftTower&&Object(gf.jsx)(My,{foundation:e}),Object(gf.jsx)(sg,Object(d.a)({},e))]})})},fg=function(e){var t=e.hx,l=e.hy,a=e.position,o=e.direction,i=e.color;if(null===a)return null;var r=Object(u.a)(a,2),n=r[0],c=r[1],s=[];if("x"===o)s.push([-t,c,0]),s.push([t,c,0]);else{if("y"!==o)return"xy"===o?Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:[[-t,c,0],[t,c,0]],color:i}),Object(gf.jsx)(Jl.a,{points:[[n,-l,0],[n,l,0]],color:i})]}):null;s.push([n,-l,0]),s.push([n,l,0])}return Object(gf.jsx)(Jl.a,{points:s,color:i})},hg=n.a.memo(ug),pg="Handles Intersection Plane",yg=function(e){if(e.intersections.length>0){var t,l=Object(f.a)(e.intersections);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.eventObject.name===pg)return a.point.z<0?null:a.point}}catch(o){l.e(o)}finally{l.f()}}return null},gg=function(e,t){return(new Me.Vector3).subVectors(e,new Me.Vector3(t.cx,t.cy,t.lz)).applyEuler(new Me.Euler(0,0,-t.rotation[2]))},mg=function(e,t,l,a,o){for(var i=t/2,r=l/2,n=Object(u.a)(a,3),c=n[0],s=n[1],d=n[2],f=(new Me.Euler).fromArray([c-vt,s,d,"ZXY"]),h=o.map((function(e){return{x:e.x,y:e.y}})),p=-1;p<=1;p+=2)for(var y=-1;y<=1;y+=2){var g=new Me.Vector3(i*p,0,r*y).applyEuler(f),m=(new Me.Vector3).addVectors(e,g);if(!Tw.isPointInside(m.x,m.y,h))return!1}return!0},wg=function(e){switch(e){case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:return!0}return!1},xg=function(e,t,l){Ew.getState().set((function(a){var o=a.elements.find((function(t){return t.id===e&&t.type===V.Window}));if(o){var i=Object(u.a)(t,3);o.cx=i[0],o.cy=i[1],o.cz=i[2],o.rotation=Object(h.a)(l)}}))},vg=function(e,t,l,a){Ew.getState().set((function(o){var i=o.elements.find((function(t){return t.id===e&&t.type===V.Window}));if(i){var r=Object(u.a)(t,3);i.cx=r[0],i.cy=r[1],i.cz=r[2];var n=Object(u.a)(l,3);i.lx=n[0],i.ly=n[1],i.lz=n[2],void 0!==a&&null!==a&&(i.archHeight=a)}}))},bg=function(e,t){Ew.getState().set((function(l){var a=l.elements.find((function(t){return t.id===e&&t.type===V.Window}));a&&(a.polygonTop=Object(h.a)(t))}))},Ag=function(e,t){var l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.01;if(e.type!==V.SolarPanel&&e.type!==V.Window)return null;var a=(new Me.Euler).fromArray([].concat(Object(h.a)(e.rotation),["ZXY"])),o=new Me.Vector3,i=e.lx/2+l,r=l;e.type===V.SolarPanel?(r+=e.ly/2,o.set(e.cx*t.lx,e.cy*t.ly,0)):(r+=e.lz/2,o.set(e.cx,e.cy,0));for(var n=[],c=-1;c<=1;c+=2)for(var s=-1;s<=1;s+=2){var d=new Me.Vector3(c*i,c*s*r).applyEuler(a).add(o);n.push(d)}if(e.type===V.Window&&e.windowType===Yt.Polygonal){var f,p=null!==(f=e.polygonTop)&&void 0!==f?f:Fg,y=Object(u.a)(p,2),g=y[0],m=y[1],w=new Me.Vector3(g*i,m+r).applyEuler(a).add(o);n.push(w)}return n},Tg=function(e){var t;if(e.windowType===Yt.Polygonal)return null!==(t=e.polygonTop)&&void 0!==t?t:Fg},Pg=function(e){var t=e.z,l=Object(r.useRef)(),a=Object(r.useState)("white"),o=Object(u.a)(a,2),i=o[0],n=o[1];return Object(gf.jsx)(Lt.a,{ref:l,name:K.Arch,args:[.2,.2,.2],position:[0,0,t],onPointerEnter:function(){n("red")},onPointerLeave:function(){n("white")},children:Object(gf.jsx)("meshBasicMaterial",{color:i})})},Sg=function(e){var t=e.id,l=e.parentId,a=e.foundationId,o=e.lx,i=e.lz,n=e.polygonTop,c=e.rotation,s=e.windowType,d=e.parentType,p=Ew((function(e){return e.addedWindowId})),y=Ew(Sr),g=p===t,m=d===V.Roof,w=Object(r.useRef)(null),x=Object(r.useRef)(null),v=Object(r.useRef)(null),b=Object(r.useRef)(null),A=Object(r.useRef)(null),T=Object(r.useRef)(null),P=Object(r.useRef)(null),S=Object(r.useRef)(null),j=Object(r.useRef)([]),H=Object(r.useRef)(null),z=Object(r.useRef)(null),R=Object(r.useRef)(null),D=Object(r.useRef)(null),M=Object(r.useRef)(null),W=Object(r.useState)(!1),I=Object(u.a)(W,2),C=I[0],O=I[1],F=o/2,k=i/2,Y=Object(u.a)(n,2),L=Y[0],E=Y[1],U=Object(r.useMemo)((function(){return o*L}),[o,L]),N=Ew(si),J=function(e,t,l){if(!a)return null;var o=Ew.getState().elements.find((function(e){return e.id===a&&e.type===V.Foundation}));if(!o)return null;var i=e.object.localToWorld(new Me.Vector3),r=Object(u.a)(c,3),n=r[0],s=r[1],d=r[2],f=(new Me.Euler).fromArray([n-vt,s,d+o.rotation[2],"ZXY"]),h=new Me.Vector3(t,0,l).applyEuler(f);return(new Me.Vector3).addVectors(i,h)},G=function(e){var o,i,r,n,c,s=Object(f.a)(Ew.getState().elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;d.id===t&&d.type===V.Window?i=d:d.id===a&&d.type===V.Foundation?r=d:d.id===l&&d.type===V.Roof&&(n=d)}}catch(E){s.e(E)}finally{s.f()}var u=Et.getState().contentRef;if(i&&r&&n&&u&&u.current){var p=r.id,y=u.current.children.find((function(e){return e.name==="".concat(dg," ").concat(p)}));if(y){var g=y.children.find((function(e){return e.name===rg}));if(g){var m=g.children.find((function(e){return e.name.includes("Roof")&&e.name.includes(l)}));if(m){var P=m.children[0];if(P){var W,I=Object(f.a)(Ew.getState().elements);try{for(I.s();!(W=I.n()).done;){var C=W.value;if(C.parentId===l&&C.id!==t){var O=Ag(C,r);O&&j.current.push(O)}}}catch(E){I.e(E)}finally{I.f()}var F=P.userData,k=F.centroid,Y=F.roofSegments,L=new Me.Vector3(i.cx,i.cy,i.cz+r.lz).clone().sub(k);w.current=e,x.current=r,v.current=n,T.current=Vm.getSegmentIdx(Y,L),A.current=k,b.current=Y,S.current=function(e,t,l){return l===It.Gambrel?Gp(e).map((function(e){return e.add(t)})):e.map((function(e){return e.points[0].clone().add(t)}))}(b.current,A.current,n.roofType),H.current=[i.cx,i.cy,i.cz],R.current=[i.lx,i.ly,i.lz],z.current=Object(h.a)(i.rotation),D.current=i.archHeight,M.current=null!==(o=i.polygonTop)&&void 0!==o?o:null}}}}}},X=function(){if(R.current&&H.current){var e=Ew.getState().elements.find((function(e){return e.id===t&&e.type===V.Window}));if(e){var l={name:"Resize skylight",timestamp:Date.now(),id:e.id,oldPosition:Object(h.a)(H.current),newPosition:[e.cx,e.cy,e.cz],oldDimension:Object(h.a)(R.current),newDimension:[e.lx,e.ly,e.lz],oldArchHeight:D.current,newArchHeight:e.archHeight,undo:function(){vg(this.id,this.oldPosition,this.oldDimension,this.oldArchHeight)},redo:function(){vg(this.id,this.newPosition,this.newDimension,this.newArchHeight)}};y(l)}}},q=function(e){return e.roofType!==It.Gable&&Math.abs(e.rise)<.001},Q=function(e){if(v.current&&q(v.current))return S.current;if(void 0!==e&&null!==e){var t=Pf.getState().getRoofSegmentVertices(l);if(!t)return;return t[-1===e?t.length-1:e]}},Z=function(e,t,l,a,o){for(var i=t/2,r=l/2,n=(new Me.Euler).fromArray([].concat(Object(h.a)(a),["ZXY"])),c=[],s=-1;s<=1;s+=2)for(var d=-1;d<=1;d+=2){var p=new Me.Vector3(s*i,s*d*r).applyEuler(n).add(e);c.push(p)}if(o){var y=Object(u.a)(o,2),g=y[0],m=y[1],w=new Me.Vector3(g*i*2,m+r).applyEuler(n).add(e);c.push(w)}var x,v=Object(f.a)(j.current);try{for(v.s();!(x=v.n()).done;){var b,A=x.value,T=Object(f.a)(c);try{for(T.s();!(b=T.n()).done;){var P=b.value;if(Tw.isPointInside(P.x,P.y,A))return!1}}catch(R){T.e(R)}finally{T.f()}var S,H=Object(f.a)(A);try{for(H.s();!(S=H.n()).done;){var z=S.value;if(Tw.isPointInside(z.x,z.y,c))return!1}}catch(R){H.e(R)}finally{H.f()}}}catch(R){v.e(R)}finally{v.f()}return!0},_=function(e,t,l,a,o,i){if(i){var r=Object(u.a)(i,2);return function(e,t,l,a,o,i,r){var n=l/2,c=Object(u.a)(i,3),s=c[0],d=c[1],f=c[2],h=(new Me.Euler).fromArray([s-vt,d,f,"ZXY"]),p=r.map((function(e){return{x:e.x,y:e.y}})),y=(new Me.Vector3).addVectors(e,new Me.Vector3(a*t,0,n+o).applyEuler(h));return!!Tw.isPointInside(y.x,y.y,p)&&!!mg(e,t,l,i,r)}(t,l,a,r[0],r[1],o,e)}return mg(t,l,a,o,e)};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Handle Wrapper",onPointerDown:function(e){if(m&&!g){var t=e.object.name;switch(t){case B.Mid:break;case K.LowerLeft:P.current=J(e,o,i);break;case K.LowerRight:P.current=J(e,-o,i);break;case K.UpperLeft:P.current=J(e,o,-i);break;case K.UpperRight:P.current=J(e,-o,-i);break;case K.Arch:P.current=J(e,0,-i);break;case K.Upper:break;default:return}G(t),O(!0),Et.getState().setEnableOrbitController(!1)}},children:[!g&&Object(gf.jsxs)(gf.Fragment,{children:[s===Yt.Polygonal&&Object(gf.jsx)(xf,{x:U,z:k+E,handleType:K.Upper,scale:[.5,1,1.5]}),Object(gf.jsx)(xf,{x:-F,z:k,handleType:K.UpperLeft}),Object(gf.jsx)(xf,{x:F,z:k,handleType:K.UpperRight}),Object(gf.jsx)(xf,{x:-F,z:-k,handleType:K.LowerLeft}),Object(gf.jsx)(xf,{x:F,z:-k,handleType:K.LowerRight}),s===Yt.Arched&&Object(gf.jsx)(Pg,{z:k})]}),Object(gf.jsx)(bf,{handleType:B.Mid})]}),m&&C&&Object(gf.jsx)(Lt.f,{name:pg,args:[1e3,1e3],rotation:[vt,0,0],onPointerMove:function(e){if(null!==w.current&&x.current&&v.current&&b.current&&A.current&&S.current){var a=x.current;if(w.current===B.Mid){var o=v.current,i=function(e,t,l){if(e.intersections.length>0){var a,o=Object(f.a)(e.intersections);try{for(o.s();!(a=o.n()).done;){var i,r=a.value,n=r.eventObject.name;if(n.includes("Window")&&n.includes(t)&&r.object.name!==pg)return null;if(n.includes("Roof")&&n.includes(l))return{pointer:r.point.clone(),segmentIdx:Number.parseInt(null!==(i=r.object.name.split(" ").pop())&&void 0!==i?i:"-1")}}}catch(c){o.e(c)}finally{o.f()}}return null}(e,t,l),r=new Me.Vector3;if(q(o)){var n=yg(e);if(!n)return;r.copy(n);var s=gg(r,a);N((function(e){if(S.current){var l=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(l){var a=l.lx,o=l.lz,i=l.rotation,r=S.current,n=Tg(l),c=_(r,s,a,o,i,n),d=Z(s,a,o,i,n);c&&d&&(l.cx=s.x,l.cy=s.y,l.cz=s.z)}}}))}else{if(i&&i.segmentIdx!==T.current){var d=i.pointer;r.copy(d)}else{var u=yg(e);if(!u)return;r.copy(u)}var p=gg(r,a),y=p.clone().sub(A.current),g=Vm.computeState(b.current,y),m=g.rotation,j=g.segmentVertices,H=g.segmentIdx;j?p.setZ(Vm.getRooftopElementZ(j,y,A.current.z+o.thickness)):p.setZ(A.current.z+o.thickness),N((function(e){var a=Pf.getState().getRoofSegmentVertices(l);if(a){var o=a[-1===H?a.length-1:H];if(o){var r=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(r){var n=r.lx,c=r.lz,s=Tg(r),d=_(o,p,n,c,m,s),u=Z(p,n,c,m,s);d&&u&&(r.cx=p.x,r.cy=p.y,r.cz=p.z,r.rotation=Object(h.a)(m),i&&i.segmentIdx!==T.current&&(T.current=i.segmentIdx))}}}}))}}else if(wg(w.current)){var z=Q(T.current),R=yg(e),D=P.current;if(!R||!D||!z)return;var M=gg(R,a),W=function(e,t,l){var a=(new Me.Vector3).subVectors(t,e).applyEuler(new Me.Euler(0,0,-l));return{newLx:Math.abs(a.x),newLz:Math.hypot(a.y,a.z),newCenter:(new Me.Vector3).addVectors(e,t).divideScalar(2)}}(gg(D,a),M,c[2]),I=W.newLx,C=W.newLz,O=W.newCenter;Ew.getState().set((function(e){var l=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(l){var a=Tg(l),o=_(z,O,I,C,c,a),i=Z(O,I,C,c,a);o&&i&&(l.cx=O.x,l.cy=O.y,l.cz=O.z,l.lx=I,l.lz=Math.max(.001,C))}}))}else if(w.current===K.Upper){var F=Q(T.current),k=yg(e);if(!k||!F)return;var Y=gg(k,a);N((function(e){var l=e.elements.find((function(e){return e.id===t}));if(l){var a=l.lx/2,o=l.lz/2,i=new Me.Vector3(l.cx,l.cy,l.cz),r=(new Me.Euler).fromArray([].concat(Object(h.a)(l.rotation),["ZXY"])),n=new Me.Vector3(-a,-o,0).applyEuler(r).add(i),s=new Me.Vector3(a,-o,0).applyEuler(r).add(i),d=(new Me.Vector3).subVectors(Y,n),u=(new Me.Vector3).subVectors(s,n).normalize(),f=d.clone().projectOnVector(u).applyEuler(new Me.Euler(0,0,-l.rotation[2])),p=Tw.clamp((f.x-a)/l.lx,-.5,.5),y=Vm.getDistance(n,s,Y),g=Math.hypot(y,Y.z-n.z),m=[p,Math.max(0,g-l.lz)],w=new Me.Vector3(l.cx,l.cy,l.cz),x=l.lx,v=l.lz,b=_(F,w,x,v,c,m),A=Z(w,x,v,c,m);b&&A&&(l.polygonTop=[].concat(m))}}))}else if(w.current===K.Arch){var L=yg(e),E=P.current,U=Q(T.current);if(!L||!E||!U)return;var J=gg(L,a),G=gg(E,a);N((function(e){var l=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(l){var a=l.lx/2,o=l.lz/2,i=new Me.Vector3(l.cx,l.cy,l.cz),r=(new Me.Euler).fromArray([].concat(Object(h.a)(l.rotation),["ZXY"])),n=new Me.Vector3(-a,-o,0).applyEuler(r).add(i),s=new Me.Vector3(a,-o,0).applyEuler(r).add(i),d=Vm.getDistance(n,s,J),u=Math.hypot(d,J.z-n.z),f=Math.min(l.archHeight,l.lz,l.lx/2),p=l.lz-f;if(u>p&&u0&&Object(gf.jsx)("group",{position:[0,t,0],children:w(c/20,g)}),f&&d&&w(c/5,m)]})})),Mg=function(e){var t=e.id,l=e.dimension,a=e.position,i=e.mullionData,c=e.frameData,s=e.wireframeData,d=e.leftShutter,f=e.rightShutter,h=e.shutterColor,p=e.shutterWidth,y=e.glassMaterial,g=e.showHeatFluxes,m=e.area,w=e.empty,x=e.interior,v=e.foundation,b=Ew.getState().world,A=Ew(o.heatFluxScaleFactor),T=Ew(o.heatFluxColor),P=Ew(o.heatFluxWidth),S=Ew(o.shadowEnabled),j=Pf(Ai),H=Object(r.useRef)(0),z=Object(r.useRef)(),R=Object(u.a)(l,3),D=R[0],M=R[1],W=R[2],I=Object(u.a)(a,3),C=(I[0],I[1]),O=(I[2],Object(r.useMemo)((function(){var e;if(g&&!x&&(!v||!v.notBuilding)){var l=j.get(t);if(l){var a=l.reduce((function(e,t){return e+t}),0);if(0!==m){var o=4*(null!==(e=b.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),i=Math.max(2,Math.round(D/o)),r=Math.max(2,Math.round(W/o)),n=D/i,c=W/r,s=a/m*(null!==A&&void 0!==A?A:_e);H.current=s<0?1:0,z.current=Tw.getEuler(Rt,Ht,"YXZ",Math.sign(s)*vt);var d=[];if(s<0)for(var u=0;u0&&void 0!==arguments[0]&&arguments[0];se((function(o){if(o.groupActionMode)o.multiSelectionsMode||o.selectedElementIdSet.clear(),e.foundationId&&(o.selectedElementIdSet.has(l)?o.selectedElementIdSet.delete(l):o.selectedElementIdSet.add(e.foundationId));else{var i,r=Object(f.a)(o.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.id===t)if(n.selected=!0,o.selectedElement=n,a)if(o.selectedElementIdSet.has(t)){var c,s=Object(f.a)(o.elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;o.selectedElementIdSet.has(d.id)&&d.type!==o.selectedElement.type&&o.selectedElementIdSet.delete(d.id)}}catch(y){s.e(y)}finally{s.f()}}else if(o.multiSelectionsMode){o.selectedElementIdSet.add(t);var u,h=Object(f.a)(o.elements);try{for(h.s();!(u=h.n()).done;){var p=u.value;o.selectedElementIdSet.has(p.id)&&p.type!==o.selectedElement.type&&o.selectedElementIdSet.delete(p.id)}}catch(y){h.e(y)}finally{h.f()}}else o.selectedElementIdSet.clear(),o.selectedElementIdSet.add(t);else o.multiSelectionsMode?o.selectedElementIdSet.has(t)?o.selectedElementIdSet.delete(t):o.selectedElementIdSet.add(t):(o.selectedElementIdSet.clear(),o.selectedElementIdSet.add(t));else n.selected=!1}}catch(y){r.e(y)}finally{r.f()}}}))},ye=function(e){return e.intersections.length>0&&e.intersections[0].eventObject.name===ce&&!Ew.getState().moveHandleType&&!Ew.getState().resizeHandleType&&!Ew.getState().isAddingElement()&&Ew.getState().objectTypeToAdd===V.None},ge=function(e,t){Et.getState().setEnableOrbitController(!1),ue("showWallIntersectionPlaneId",l),se((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(new Me.Vector3(i,0,c).add(t))}))},me=Object(r.useMemo)((function(){if(ie===V.Roof){var e=Object(u.a)(p,3),t=e[0],l=e[1],a=e[2];return(new Me.Euler).fromArray([t-vt,l,a,"ZXY"])}return new Me.Euler}),[ie,p]),we=Object(r.useMemo)((function(){return Object(gf.jsx)("meshPhongMaterial",{specular:new Me.Color("white"),shininess:null!==fe&&void 0!==fe?fe:lt,color:M,side:Me.DoubleSide,opacity:I,transparent:!0})}),[fe,M,I]),xe=Object(r.useMemo)((function(){return void 0!==ae?[s,d,h,ae]:[s,d,h]}),[s,d,h,ae]),ve=Object(r.useMemo)((function(){return ie===V.Roof?[i,.05,c]:[i,n,c]}),[i,n,c,ie]),be=Object(r.useMemo)((function(){return{horizontalMullion:b,verticalMullion:T,width:S,horizontalMullionSpacing:H,verticalMullionSpacing:R,color:J}}),[b,T,S,H,R,J]),Ae=Object(r.useMemo)((function(){return{showFrame:X,width:_,color:Q,sillWidth:ee}}),[X,_,Q,ee]),Te=Object(r.useMemo)((function(){return{lineColor:x,lineWidth:m,selected:he,locked:y,opacity:I}}),[x,m,he,y,I]),Pe=Tf(Vs),Se=ie===V.Roof?n:0;return Object(gf.jsxs)("group",{name:ce,position:[i,Se,c],rotation:me,onPointerDown:function(e){if(2!==e.button&&!Ew.getState().addedWallId&&(ye(e)&&pe(),function(e){if(e.eventObject.name===ce&&e.intersections.length>0)switch(e.object.name){case B.Mid:case K.UpperLeft:case K.UpperRight:case K.LowerLeft:case K.LowerRight:case K.Arch:case K.Upper:return!0}return!1}(e))){var t=e.intersections[0].eventObject.name;switch(t){case B.Mid:Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=l,e.oldParentId=l,e.oldFoundationId=a})),se((function(e){e.moveHandleType=t,e.selectedElement=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))}));break;case K.UpperLeft:ge(t,new Me.Vector3(s/2,0,-h/2));break;case K.UpperRight:ge(t,new Me.Vector3(-s/2,0,-h/2));break;case K.LowerLeft:ge(t,new Me.Vector3(s/2,0,h/2));break;case K.LowerRight:ge(t,new Me.Vector3(-s/2,0,h/2));break;case K.Arch:ge(t,new Me.Vector3(0,0,0));break;case K.Upper:ge(t,new Me.Vector3(0,0,h/2))}}},onContextMenu:function(e){Ew.getState().addedWallId||ye(e)&&(pe(!0),se((function(e){e.contextMenuObjectType=V.Window})))},onPointerMove:function(){},children:[function(){switch(le){case Yt.Default:return Object(gf.jsx)(Wg,{id:e.id,dimension:xe,position:ve,mullionData:be,frameData:Ae,wireframeData:Te,leftShutter:O,rightShutter:k,shutterColor:L,shutterWidth:U,glassMaterial:we,showHeatFluxes:Pe,area:Tw.getWindowArea(e),empty:!!e.empty,interior:!!e.interior,foundation:de(e)});case Yt.Arched:return Object(gf.jsx)(Lf,{id:e.id,dimension:xe,position:ve,mullionData:be,frameData:Ae,wireframeData:Te,leftShutter:O,rightShutter:k,shutterColor:L,shutterWidth:U,glassMaterial:we,showHeatFluxes:Pe,area:Tw.getWindowArea(e),empty:!!e.empty,interior:!!e.interior,foundation:de(e)});case Yt.Polygonal:return Object(gf.jsx)(Gf,{id:e.id,dimension:xe,polygonTop:ne,position:ve,glassMaterial:we,empty:!!e.empty,interior:!!e.interior,wireframeData:Te,frameData:Ae,leftShutter:O,rightShutter:k,shutterColor:L,shutterWidth:U,showHeatFluxes:Pe,area:Tw.getWindowArea(e),foundation:de(e)})}}(),he&&Object(gf.jsx)(Ig,{element:e}),he&&!y&&Object(gf.jsx)(jg,{id:t,parentId:l,foundationId:a,lx:s,lz:h,polygonTop:ne,rotation:p,windowType:le,parentType:ie})]},t)},Yg=n.a.memo(kg),Lg=n.a.memo((function(e){var t=e.lineColor,l=void 0===t?"black":t,a=e.lineWidth,o=void 0===a?.2:a,i=e.hx,r=e.hz,c=e.fill,s=e.isTopPartial,d=e.leftUnfilledHeight,u=e.rightUnfilledHeight,f=e.showParapet,h=void 0!==f&&f,p=e.leftHeight,y=void 0===p?2*r:p,g=e.rightHeight,m=void 0===g?2*r:g,w=e.center,x=e.centerLeft,v=e.centerRight,b=Ew((function(e){return e.viewState.orthographic})),A=[-i,.001-r+(c===Ue.Partial?d:0),.001],T=[i,.001-r+(c===Ue.Partial?u:0),.001],P=[-i,y-r-.001,.001],S=[i,m-r-.001,.001],j=2*i,H=[];if(b)o=2,H.push(P,S);else if(h)H.push(P,A,T,S);else if(s)H.push(A,P,S,T,A);else{if(H.push(A,P),x){var z=[x[0]*j,x[1]-r,.001];H.push(z)}if(w){var R=[w[0]*j,w[1]-r,.001];H.push(R)}if(v){var D=[v[0]*j,v[1]-r,.001];H.push(D)}H.push(S,T)}return Object(gf.jsx)(n.a.Fragment,{children:Object(gf.jsx)(Jl.a,{rotation:[vt,0,0],points:H,color:l,lineWidth:o})})}));!function(e){e.Default="Default",e.Arched="Arched"}(hy||(hy={}));var Eg=n.a.memo((function(e){var t=e.dimension,l=e.lineColor,a=e.lineWidth,o=t.map((function(e){return e/2})),i=Object(u.a)(o,3),r=i[0],n=(i[1],i[2]),c=[-r,0,n+.05],s=[r,0,n+.05],d=[-r,0,-n],f=[r,0,-n];return Object(gf.jsx)(Jl.a,{points:[d,c,s,f],lineWidth:a,color:l})})),Ug=n.a.memo((function(e){var t=e.dimension,l=e.color,a=Object(u.a)(t,3),i=a[0],n=(a[1],a[2]),c=Ew(o.shadowEnabled),s=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:l})}),[l]),d=.1;return Object(gf.jsxs)("group",{name:"Door frame group",children:[Object(gf.jsx)(Lt.a,{position:[0,0,n/2],args:[i,d,d],castShadow:c,receiveShadow:c,children:s}),Object(gf.jsx)(Lt.a,{position:[-i/2+.05,0,0],args:[d,d,n],castShadow:c,receiveShadow:c,children:s}),Object(gf.jsx)(Lt.a,{position:[i/2-.05,0,0],args:[d,d,n],castShadow:c,receiveShadow:c,children:s})]})})),Ng=n.a.memo((function(e){var t=e.id,l=e.dimension,a=(e.color,e.frameColor),i=e.selected,c=e.locked,s=e.material,d=e.filled,f=e.area,h=e.showHeatFluxes,p=e.foundation,y=Ew.getState().world,g=Ew(o.heatFluxScaleFactor),m=Ew(o.heatFluxColor),w=Ew(o.heatFluxWidth),x=Ew(o.shadowEnabled),v=Pf(Ai),b=Object(r.useRef)(0),A=Object(r.useRef)(),T=Object(u.a)(l,3),P=T[0],S=(T[1],T[2]),j=Object(r.useMemo)((function(){var e;if(h&&(!p||!p.notBuilding)){var l=v.get(t);if(l){var a=l.reduce((function(e,t){return e+t}),0);if(0!==f){var o=4*(null!==(e=y.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),i=Math.max(2,Math.round(P/o)),r=Math.max(2,Math.round(S/o)),n=P/i,c=S/r,s=a/f*(null!==g&&void 0!==g?g:_e);b.current=s<0?1:0,A.current=Tw.getEuler(Rt,Ht,"YXZ",Math.sign(s)*vt);var d=[];if(s<0)for(var u=0;u0){var l=.5*T,a=.5*S,o=Math.min(j,S,l),i=.5*(o+l*l/o);if(Math.abs(e)-a)return!0;var r=t-(S-i-a);return e*e+r*r.1){var o=a/2+Math.pow(T,2)/(8*a),i=l-o,r=Math.acos(Math.min(t/o,1)),n=Math.PI-r;e.absarc(0,i,o,r,n,!1)}else e.lineTo(-t,l);if(e.lineTo(-t,-l),!s){var c=.4*T,d=.4*S,u=Math.min(.8*j,.8*S,.8*t);if(e.lineTo(-c,-l),u>.1){e.lineTo(-c,l-u);var f=u/2+Math.pow(.8*T,2)/(8*u),h=d-f,p=Math.acos(Math.min(c/f,1)),y=Math.PI-p;e.absarc(0,h,f,y,p,!0)}else e.lineTo(-c,d),e.lineTo(c,d);e.lineTo(c,-l)}return e.closePath(),e}),[T,S,j,s]),D=Object(r.useMemo)((function(){return{lineColor:"black",lineWidth:i&&a?.2:.1,opacity:1,selected:a,locked:i}}),[a,i]);return Object(gf.jsxs)("group",{name:"Arched door group",children:[Object(gf.jsx)("mesh",{name:"Arched Door Mesh",rotation:[vt,0,0],material:c,castShadow:y&&s,receiveShadow:y&&s,children:Object(gf.jsx)("shapeBufferGeometry",{args:[R]})}),s&&Object(gf.jsxs)("mesh",{name:"Arched Door Simulation Mesh",rotation:[vt,0,0],material:c,uuid:t,userData:{simulation:!0},castShadow:!1,receiveShadow:!1,visible:!1,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[R]}),Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})]}),s&&Object(gf.jsx)("mesh",{name:"Door plane mesh inside",position:[0,.1,0],rotation:[-vt,0,Math.PI],material:c,castShadow:y&&s,receiveShadow:y&&s,children:Object(gf.jsx)("shapeBufferGeometry",{args:[R]})}),Object(gf.jsx)(Ff,{cy:0,dimension:l,wireframeData:D}),Object(gf.jsx)(Ff,{cy:P,dimension:l,wireframeData:D}),z&&z.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==w&&void 0!==w?w:et,color:null!==m&&void 0!==m?m:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:e[v.current].clone().add(new Me.Vector3(0,0===v.current?-.1:.1,0)),args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=b.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==m&&void 0!==m?m:$e})})]},t)}))]})})),Jg="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAEACAYAAAB7+X6nAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEARs4dI3tSgAABDpJREFUeJzt2iFLq1EcgPH/keGMhoEiIhg1CAaDyWRX/AI2bXYx+gX0ExhFBLG6sCBoNGoQVkQMbxCjYeeGq4N51+57Jux5fvEwDgf27L8X3pMiIoewGhERm5ubsbS09Ntn0Qg9Pj5Gu93+G8Di4mKcnJyk3z6URmdvby9HfE2Ab2dnZ/nl5SU+Pz9/51QqanJyMubn52N3d7f/Yx8I4P39PU5PT6OqqpiYmBj9CVVMr9eLVqsVh4eHA+uNYR/e3t6O1dXVkRxMo/Hw8BC3t7f/rA8NoNVqxdHRkc8EY+T7P/8n5zycAcAZAJwBwBkAnAHAGQCcAcAZAJwBwBkAnAHAGQCcAcANfR38P1JKXjItKOdc62t6JwBc7RPgW92l0pWarE4AOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAa5TaOKWUS+2t+jgB4GqfADnnVPeeKscJAGcAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAFf720DvAZRV99tWJwBcsRtB3guoV6nJ6gSAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwC4RqmNU0q51N6qjxMArvYJkHNOde+pcpwAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAGcAcAYAN/RSaFVVcXx87LXuMVJVVaSUYnp6Oi4vL/vf7dAArq6u4vr6enSnU3G9Xi8WFhZiY2Mj3t7e+usDAczOzsbFxUU8PT3F6+vryA+pcubm5mJ5eTmen5/j4+Ojvz4QwNTUVKytrUWz2Yz9/X3v94+R+/v7vLKyEu12O3Z2dtLNzU2O+Aqg2+3GwcFBbjabsbW1lTqdTj4/P/cZYIzMzMzE+vp6uru7y51OJ3e73YiISBHhFw32Bx94jOPwP7lbAAAAAElFTkSuQmCC",Gg=l.p+"static/media/door_01.370d5c48.png",Xg=l.p+"static/media/door_02.589dadc7.png",Bg=l.p+"static/media/door_03.25d0bf9d.png",Kg=l.p+"static/media/door_04.06a40fe3.png",qg=l.p+"static/media/door_05.4515bf2c.png",Qg=l.p+"static/media/door_06.5a0271c1.png",Zg=l.p+"static/media/door_07.b3fa7c12.png",_g=l.p+"static/media/door_08.44d7e7a4.png",$g=l.p+"static/media/door_09.cc418cf3.png",em=l.p+"static/media/door_10.69a33f87.png",tm=l.p+"static/media/door_11.885157c0.png",lm=l.p+"static/media/door_12.1978a1a1.png",am=l.p+"static/media/door_13.0e06b1ac.png",om=l.p+"static/media/door_14.97d8561e.png",im=l.p+"static/media/door_15.059947bb.png",rm=l.p+"static/media/door_16.c2cd4b21.png",nm=l.p+"static/media/door_17.6410d727.png",cm=new Me.MeshStandardMaterial({color:"white",side:Me.FrontSide}),sm=n.a.memo((function(e){var t=e.dimension,l=e.doorType,a=t.map((function(e){return e/2})),o=Object(u.a)(a,3),i=o[0],r=(o[1],o[2]);return 0===i&&0===r?null:Object(gf.jsxs)("group",{name:"Door handle wrapper",children:[Object(gf.jsx)(xf,{x:-i,z:r,handleType:K.UpperLeft}),Object(gf.jsx)(xf,{x:i,z:r,handleType:K.UpperRight}),l===hy.Arched&&Object(gf.jsx)(Pg,{z:r})]})})),dm=n.a.memo((function(e){var t=e.dimension,l=Ew(o.shadowEnabled),a=Object(u.a)(t,3),i=a[0],r=a[1],n=a[2],c=t.map((function(e){return e/2})),s=Object(u.a)(c,3),d=s[0],f=s[1],h=s[2],p=function(e,t,a){return Object(gf.jsx)(Lt.f,{name:"Door seal plane",args:e,position:t,rotation:a,material:cm,receiveShadow:l})};return Object(gf.jsxs)("group",{name:"Door seal planes group",children:[p([r,n],[-d,f,0],[vt,vt,0]),p([r,n],[d,f,0],[vt,-vt,0]),p([i,r],[0,f,h],[Math.PI,0,0])]})})),um=function(e){var t=e.id,l=e.parentId,a=e.cx,i=(e.cy,e.cz),n=e.lx,c=e.ly,s=e.lz,d=e.textureType,h=e.locked,p=void 0!==h&&h,y=e.color,g=void 0===y?"white":y,m=e.doorType,w=void 0===m?hy.Default:m,x=e.archHeight,v=void 0===x?1:x,b=e.filled,A=void 0===b||b,T=e.opacity,P=void 0===T?1:T,S=e.frameColor,j=void 0===S?"white":S,H="Door Group ".concat(t),z=Ew(si),R=Tf(yf),D=Ew(o.windowShininess),M=_f(t),W=Object(r.useRef)(!1);Object(r.useEffect)((function(){var e=function(){W.current=!1};return window.addEventListener("pointerup",e),function(){return window.removeEventListener("pointerup",e)}}),[]);var I=function(){var a=arguments.length>0&&void 0!==arguments[0]&&arguments[0];z((function(o){if(o.groupActionMode)o.multiSelectionsMode||o.selectedElementIdSet.clear(),e.foundationId&&(o.selectedElementIdSet.has(l)?o.selectedElementIdSet.delete(l):o.selectedElementIdSet.add(e.foundationId));else{var i,r=Object(f.a)(o.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.id===t)if(n.selected=!0,o.selectedElement=n,a)if(o.selectedElementIdSet.has(t)){var c,s=Object(f.a)(o.elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;o.selectedElementIdSet.has(d.id)&&d.type!==o.selectedElement.type&&o.selectedElementIdSet.delete(d.id)}}catch(y){s.e(y)}finally{s.f()}}else if(o.multiSelectionsMode){o.selectedElementIdSet.add(t);var u,h=Object(f.a)(o.elements);try{for(h.s();!(u=h.n()).done;){var p=u.value;o.selectedElementIdSet.has(p.id)&&p.type!==o.selectedElement.type&&o.selectedElementIdSet.delete(p.id)}}catch(y){h.e(y)}finally{h.f()}}else o.selectedElementIdSet.clear(),o.selectedElementIdSet.add(t);else o.multiSelectionsMode?o.selectedElementIdSet.has(t)?o.selectedElementIdSet.delete(t):o.selectedElementIdSet.add(t):(o.selectedElementIdSet.clear(),o.selectedElementIdSet.add(t));else n.selected=!1}}catch(y){r.e(y)}finally{r.f()}}}))},C=function(e){return e.intersections.length>0&&e.intersections[0].eventObject.name===H&&!Ew.getState().moveHandleType&&!Ew.getState().resizeHandleType&&!Ew.getState().isAddingElement()&&Ew.getState().objectTypeToAdd===V.None},O=function(e,t){Et.getState().setEnableOrbitController(!1),R("showWallIntersectionPlaneId",l),z((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(new Me.Vector3(a,0,i).add(t)),l.selectedElement=l.elements.find((function(e){return e.selected}))}))},F=Ew(_r),k=Tf(Ns),Y=Tf(Vs),L=Ew(o.solarRadiationHeatmapMaxValue),E=Pf(wi),U=Object(r.useState)(null),N=Object(u.a)(U,2),J=N[0],G=N[1];Object(r.useEffect)((function(){if(e&&k){var t=E(e.id);if(t){var l=Tw.fetchHeatmapTexture(t,null!==L&&void 0!==L?L:5);l&&(l.wrapS=Me.RepeatWrapping,l.wrapT=Me.RepeatWrapping,l.offset.set(-n/2,-s/2),l.center.set(n/2,s/2),l.repeat.set(1/n,1/s),G(l))}}}),[k,L]);var X=function(e,t,l,a){var o=Object(r.useMemo)((function(){var t;switch(e){case fe.Default:t=Jg;break;case fe.NoTexture:t=Sf;break;case fe.Texture01:t=Gg;break;case fe.Texture02:t=Xg;break;case fe.Texture03:t=Bg;break;case fe.Texture04:t=Kg;break;case fe.Texture05:t=qg;break;case fe.Texture06:t=Qg;break;case fe.Texture07:t=Zg;break;case fe.Texture08:t=_g;break;case fe.Texture09:t=$g;break;case fe.Texture10:t=em;break;case fe.Texture11:t=tm;break;case fe.Texture12:t=lm;break;case fe.Texture13:t=am;break;case fe.Texture14:t=om;break;case fe.Texture15:t=im;break;case fe.Texture16:t=rm;break;case fe.Texture17:t=nm;break;default:t=Xg}return(new Me.TextureLoader).load(t,(function(e){void 0!==l&&void 0!==a&&(e.offset.set(.5,.5),e.repeat.set(1/l,1/a)),s(e),d()}))}),[e,t,l,a]),i=Object(r.useState)(o),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(Se.f)().invalidate;return c}(d,w,n,s),B=Object(r.useMemo)((function(){return[n,c,s,v]}),[n,c,s,v]),q=Object(r.useMemo)((function(){return k&&J&&e.filled?new Me.MeshBasicMaterial({color:g,map:J,side:Me.FrontSide}):A?d===fe.Default||d===fe.NoTexture?P<1?new Me.MeshPhongMaterial({specular:"white",shininess:null!==D&&void 0!==D?D:lt,color:g,side:Me.FrontSide,opacity:P,transparent:!0}):new Me.MeshStandardMaterial({map:X,color:g,side:Me.FrontSide}):new Me.MeshStandardMaterial({map:X,side:Me.FrontSide}):new Me.MeshStandardMaterial({opacity:g===wt?.5:0,color:g,transparent:!0,side:Me.DoubleSide})}),[k,J,g,d,X,A,P]);return Object(gf.jsxs)("group",{name:H,position:[a,0,i],onPointerDown:function(e){if(!W.current&&2!==e.button&&!Ew.getState().addedWallId&&(W.current=!0,C(e)&&I(),function(e){if(e.eventObject.name===H&&e.intersections.length>0)switch(e.object.name){case K.UpperLeft:case K.UpperRight:case K.Arch:return!0}return!1}(e))){var t=e.intersections[0].eventObject.name;switch(t){case K.UpperLeft:O(t,new Me.Vector3(n/2,0,-s/2));break;case K.UpperRight:O(t,new Me.Vector3(-n/2,0,-s/2));break;case K.Arch:O(t,new Me.Vector3(0,0,0))}}},onContextMenu:function(e){Ew.getState().addedWallId||C(e)&&(I(!0),z((function(e){e.contextMenuObjectType=V.Door})))},children:[function(){switch(w){case hy.Default:return Object(gf.jsx)(Ng,{id:t,dimension:B,color:g,frameColor:j,selected:M,locked:p,material:q,filled:A,showHeatFluxes:Y,area:Tw.getDoorArea(e),foundation:F(e)});case hy.Arched:return Object(gf.jsx)(Vg,{id:t,dimension:B,color:g,frameColor:j,selected:M,locked:p,material:q,filled:A,showHeatFluxes:Y,area:Tw.getDoorArea(e),foundation:F(e)})}}(),M&&Object(gf.jsx)(Ig,{element:e}),M&&!p&&Object(gf.jsx)(sm,{dimension:B,doorType:w}),Object(gf.jsx)(dm,{dimension:B})]})},fm=n.a.memo(um),hm=n.a.memo((function(e){var t=e.drawSunbeam,l=e.absRotation,a=e.tiltAngle,o=new Me.Vector3(0,0,1),n=Ew(i.date),c=Ew(i.latitude),s=Ew(Kr),d=Math.max(100,10*s),u=Object(r.useMemo)((function(){return jy(new Date(n),c).applyEuler(new Me.Euler(-vt-a,0,-l))}),[n,c,l,a]);return Object(gf.jsx)(gf.Fragment,{children:t&&u.z>0&&Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[o.clone().multiplyScalar(.75),[0,0,0],u.clone().multiplyScalar(d)],name:"Sun Beam",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[u.clone().multiplyScalar(.5),o.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Tw.toDegrees(u.angleTo(o)).toFixed(1)+"\xb0",fontSize:20,fontFace:"Times Roman",textHeight:.1,position:u.clone().multiplyScalar(.75).add(o.clone().multiplyScalar(.75)).multiplyScalar(.5)}),Object(gf.jsx)("group",{position:o.clone().multiplyScalar(.75),rotation:[vt,0,0],children:Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})})})),pm=function(e){var t,l,a,o,i,n=e.sp;Ew(Fi);var c=Ew(Zr),s=Ew(Vi),d=Object(r.useMemo)((function(){return{lng:s}}),[s]);if(!n.foundationId||!n.parentId)return null;var u=c(n.parentId),f=c(n.foundationId);if(!u||!f)return null;var h=new Me.Vector3(f.cx,f.cy,f.cz),p=new Me.Vector3(u.cx,u.cy,u.cz),y=new Me.Vector3(n.cx*u.lx,0,n.cz*u.lz).applyEuler(new Me.Euler(0,0,u.relativeAngle)).add(p).applyEuler(new Me.Euler(0,0,f.rotation[2])).add(h),g=(null!==(t=null===n||void 0===n?void 0:n.label)&&void 0!==t?t:me.t("shared.SolarPanelElement",d))+((null===n||void 0===n?void 0:n.locked)?" ( + ".concat(me.t("shared.ElementLocked",d)," + )"):"")+((null===n||void 0===n?void 0:n.label)?"":"\n"+me.t("word.Coordinates",d)+": ("+y.x.toFixed(1)+", "+y.y.toFixed(1)+", "+y.z.toFixed(1)+") "+me.t("word.MeterAbbreviation",d));return Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:g,color:null!==(l=n.labelColor)&&void 0!==l?l:"white",fontSize:null!==(a=n.labelFontSize)&&void 0!==a?a:20,textHeight:null!==(o=n.labelSize)&&void 0!==o?o:.2,position:[0,0,null!==(i=n.labelHeight)&&void 0!==i?i:Math.max(n.ly/2*Math.abs(Math.sin(n.tiltAngle))+.1,.2)]})},ym=function(e){var t=e.tiltAngle,l=e.handleSize,a=e.initPointerDown,o=e.handlePointerMove,i=e.handlePointerUp,n=Object(Se.f)().gl,c=Object(r.useState)(ht),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useRef)(),A=Object(r.useRef)(),T=Object(r.useMemo)((function(){return new Array(7).fill(0)}),[]),P=Ew(si);return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{name:q.Tilt,args:[l,1.1*l,18,2,0,vt],rotation:[0,-vt,0,"ZXY"],onPointerOver:function(){n.domElement.style.cursor="grab",f(pt)},onPointerOut:function(){n.domElement.style.cursor="default",f(ht)},onPointerDown:function(e){a(),e.stopPropagation(),g(!0),v(!0),P((function(e){e.rotateHandleType=q.Tilt}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide,color:d})}),y&&Object(gf.jsxs)(gf.Fragment,{children:[x&&Object(gf.jsx)(Lt.f,{name:"Solar panel tilt handle intersection plane",ref:A,args:[1e3,1e3],rotation:[0,-vt,0,"ZXY"],visible:!1,onPointerMove:function(e){o(e,A)},onPointerUp:function(){i(),v(!1),g(!1)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.g,{ref:b,name:"Solar panel tilt handle",args:[l,2*l,18,2,-0,vt],rotation:[0,-vt,0,"ZXY"],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:Me.DoubleSide})}),Object(gf.jsx)(Jl.a,{points:[[0,0,l],[0,0,1.75*l]],rotation:new Me.Euler(t,0,0,"ZXY"),lineWidth:1}),T.map((function(e,t){return Object(gf.jsxs)("group",{rotation:new Me.Euler(Math.PI/12*t-vt,0,0,"ZXY"),children:[Object(gf.jsx)(Jl.a,{points:[[0,0,1.8*l],[0,0,2*l]],color:"white",transparent:!0,opacity:.5}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(90-15*t,"\xb0"),fontSize:20*l,fontFace:"Times Roman",textHeight:.15*l,position:[0,0,1.6*l]})]},t)})),Object(gf.jsx)("group",{rotation:new Me.Euler(t,0,0,"ZXY"),children:Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(Math.floor(-t/Math.PI*180),"\xb0"),fontSize:20*l,fontFace:"Times Roman",textHeight:.2*l,position:[0,0,.75*l]})})]})]})},gm=n.a.memo((function(e){var t=e.tiltAngle,l=e.spCy,a=e.spLy,i=e.lx,n=e.nx,c=Ew(o.shadowEnabled),s=Object(r.useMemo)((function(){var e=a*Math.cos(t)/2,o=.75*a-e,i=1.5*-l,r=o-e/2,n=Math.hypot(i,r),s=Math.atan2(r,i);return Object(gf.jsx)("group",{position:[0,-o,l],rotation:[-s,0,0],children:Object(gf.jsx)(Lt.a,{args:[.05,.05,n],position:[0,0,n/2],castShadow:c,receiveShadow:c,children:Object(gf.jsx)("meshStandardMaterial",{color:"#BFBFBF"})})})}),[t,l,a]),d=Object(r.useMemo)((function(){for(var e=[],t=n%2===0?i/2:0;t0&&(e.intersections[0].object===ae.current&&(t.contextMenuObjectType=V.SolarPanel))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===ae.current&&(Y.domElement.style.cursor="move",N(!0)))},onPointerOut:function(e){Y.domElement.style.cursor="default",N(!1)},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),z&&He?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:He}):je?C||0===D?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",map:je,color:y}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===se||void 0===se?void 0:se.color)?at:ot),shininess:null!==D&&void 0!==D?D:tt,side:Me.FrontSide,map:je,color:y}):Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),0===(null===se||void 0===se?void 0:se.bifacialityFactor)||0===S?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}):je?Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===se||void 0===se?void 0:se.color)?at:ot),shininess:null!==D&&void 0!==D?D:tt,side:Me.FrontSide,map:je,color:y}):null]}),z&&He&&oe.current&&oe.current.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(gf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:l,args:[d,f],position:[0,0,h],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),j&&m&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-de,-ue,0],[-de,ue,0],[de,ue,0],[de,-ue,0],[-de,-ue,0]],castShadow:!1,receiveShadow:!1,lineWidth:2,color:yt}),j&&!m&&Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)("group",{name:mm,onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].eventObject.name===mm){var t=e.object.name;switch(t){case B.Default:Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=w,e.oldParentId=w,e.oldFoundationId=x})),H((function(e){e.moveHandleType=t,e.selectedElement=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))}));break;case K.Left:Pe(t,new Me.Vector3(d/2,0,0));break;case K.Right:Pe(t,new Me.Vector3(-d/2,0,0));break;case K.Lower:Pe(t,new Me.Vector3(0,0,f/2));break;case K.Upper:Pe(t,new Me.Vector3(0,0,-f/2))}}},onPointerOver:function(e){if(e.intersections.length>0&&e.eventObject.name.includes(mm)){var t=e.object.name;Z(t),t===B.Top?Y.domElement.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?Y.domElement.style.cursor="grab":Y.domElement.style.cursor="pointer"}},onPointerOut:function(){Z(null),Y.domElement.style.cursor="default"},children:[Object(gf.jsx)(Lt.h,{position:new Me.Vector3(0,0,0),args:[Ae,6,6],name:B.Default,children:Object(gf.jsx)("meshBasicMaterial",{color:"orange"})}),Object(gf.jsx)(Lt.a,{position:[(he.x+ye.x)/2,he.y,he.z],args:[be,be,1.2*h],name:K.Lower,children:Object(gf.jsx)("meshBasicMaterial",{color:Q===K.Lower||I===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{position:[(pe.x+ge.x)/2,pe.y,pe.z],args:[be,be,1.2*h],name:K.Upper,children:Object(gf.jsx)("meshBasicMaterial",{color:Q===K.Upper||I===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{position:[he.x,(he.y+pe.y)/2,he.z],args:[be,be,1.2*h],name:K.Left,children:Object(gf.jsx)("meshBasicMaterial",{color:Q===K.Left||I===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{position:[ye.x,(ye.y+ge.y)/2,ye.z],args:[be,be,1.2*h],name:K.Right,children:Object(gf.jsx)("meshBasicMaterial",{color:Q===K.Right||I===K.Right?pt:ht})})]})}),Object(gf.jsx)(hm,{drawSunbeam:T,absRotation:P,tiltAngle:S}),(U||A)&&!j&&Object(gf.jsx)(pm,{sp:me})]}),0!==S&&se&&Object(gf.jsx)(gm,{tiltAngle:-S,spCy:c-fe,spLy:f,lx:b===$.portrait?se.width:se.length,nx:te})]}),j&&!m&&Object(gf.jsx)("group",{name:mm,position:[n,0,s+fe],rotation:we,children:Object(gf.jsx)(ym,{tiltAngle:S,handleSize:Te,initPointerDown:function(){re.current=S,ie.current=!0,Et.getState().setEnableOrbitController(!1)},handlePointerMove:function(e,t){if(ie.current&&(function(e){ce.x=e.offsetX/Y.domElement.clientWidth*2-1,ce.y=-e.offsetY/Y.domElement.clientHeight*2+1,ne.setFromCamera(ce,k)}(e),t.current&&Ew.getState().rotateHandleType===q.Tilt)){var a=ne.intersectObjects([t.current]);if(a.length>0){var o,i=a[0].point,r=null===(o=t.current.parent)||void 0===o?void 0:o.localToWorld(new Me.Vector3);if(r){var n=(new Me.Vector3).subVectors(i,r),c=n.angleTo(Rt),s=P;c=(s%Math.PI===0?Math.sign(-n.y)*Math.sign(Math.cos(s)):Math.sign(n.x)*Math.sign(Math.sin(s)))*c-vt,c=Tw.clamp(c,-vt,0),Ew.getState().updateSolarPanelTiltAngleById(l,c)}}}},handlePointerUp:function(){var e=M(l);if(e&&null!==re.current&&Math.abs(e.tiltAngle-re.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:re.current,newValue:e.tiltAngle,changedElementId:l,changedElementType:V.SolarPanel,undo:function(){Ew.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.oldValue)},redo:function(){Ew.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.newValue)}};Ew.getState().addUndoable(t)}Et.getState().setEnableOrbitController(!0),ie.current=!1}})})]})},xm=n.a.memo(wm),vm=l.p+"static/media/polygon_08.acf0bf8f.png",bm=l.p+"static/media/polygon_09.26eed538.png",Am=l.p+"static/media/polygon_10.749fa717.png",Tm=l(842),Pm=function(e){var t=e.id,l=e.lz,a=void 0===l?.1:l,i=e.filled,c=void 0!==i&&i,s=e.rotation,d=void 0===s?[0,0,0]:s,h=e.normal,p=void 0===h?[0,0,1]:h,y=e.color,g=void 0===y?"yellow":y,m=e.label,w=e.text,x=e.fontSize,v=void 0===x?1:x,b=e.fontColor,A=void 0===b?"black":b,T=e.fontOutlineWidth,P=void 0===T?0:T,S=e.fontOutlineColor,j=void 0===S?"white":S,H=e.fontStrokeWidth,z=void 0===H?0:H,R=e.fontStrokeColor,D=void 0===R?"black":R,M=e.lineStyle,W=void 0===M?F.Solid:M,I=e.lineColor,C=void 0===I?"black":I,O=e.lineWidth,k=void 0===O?1:O,Y=e.locked,L=void 0!==Y&&Y,E=e.showLabel,U=void 0!==E&&E,N=e.parentId,J=e.foundationId,G=e.vertices,q=e.opacity,Q=void 0===q?1:q,Z=e.noOutline,_=void 0!==Z&&Z,$=e.shininess,ee=void 0===$?0:$,te=e.selectedIndex,le=void 0===te?-1:te,ae=e.textureType,oe=void 0===ae?ce.NoTexture:ae,ie=Ew(si),re=Ew(Vi),ne=Ew(is),se=Ew(cs),de=Ew(o.shadowEnabled),ue=_f(t),fe=Object(Se.f)().gl.domElement,he=Object(r.useState)(!1),pe=Object(u.a)(he,2),ye=pe[0],ge=pe[1],we=Object(r.useState)(0),xe=Object(u.a)(we,2),ve=xe[0],be=xe[1],Ae=Object(r.useState)(0),Te=Object(u.a)(Ae,2),Pe=Te[0],je=Te[1],He=Object(r.useState)(null),ze=Object(u.a)(He,2),Re=ze[0],De=ze[1],We=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===N)return a}}catch(o){l.e(o)}finally{l.f()}})),Oe=new Me.Vector3,Fe=new Me.Euler;if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid){var ke=Tw.getWorldDataById(Ce.id),Ye=ke.pos,Le=ke.rot;Oe.copy(Ye),Fe.set(0,0,Le)}var Ee=Ce?Math.max(1,Math.max(Ce.lx,Ce.ly)/24):1,Ue=dt*Ee,Ne=st*Ee,Ve=Object(r.useMemo)((function(){return{lng:re}}),[re]),Je=function(e,t){ie((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.selectedIndex=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Ge=Object(r.useMemo)((function(){var e=new Array;if(Ce){switch(Ce.type){case V.Foundation:var t,l=Object(f.a)(G);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push({x:a.x*Ce.lx,y:a.y*Ce.ly})}}catch(g){l.e(g)}finally{l.f()}break;case V.Wall:var o,i=Object(f.a)(G);try{for(i.s();!(o=i.n()).done;){var r=o.value;e.push({x:r.x*Ce.lx,y:r.y*Ce.lz})}}catch(g){i.e(g)}finally{i.f()}break;case V.Cuboid:var n,c,s=(new Me.Vector3).fromArray(p);Tw.isUnitVectorX(s)?(n=Ce.lz,c=Ce.ly):Tw.isUnitVectorY(s)?(n=Ce.lx,c=Ce.lz):(n=Ce.lx,c=Ce.ly);var d,u=Object(f.a)(G);try{for(u.s();!(d=u.n()).done;){var h=d.value;e.push({x:h.x*n,y:h.y*c})}}catch(g){u.e(g)}finally{u.f()}}var y=Tw.calculatePolygonCentroid(e);be(y.x),je(y.y)}return e}),[G,Ce,p]),Xe=function(){if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid){var e=Tw.isIdentical(p,Tt);return Oe.z+(Ce.lz+(e?0:a))/2+.01}return(null===Ce||void 0===Ce?void 0:Ce.type)===V.Foundation?Ce.lz+.01:a/2+.01}(),Be=function(){if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Wall)return new Me.Euler(-vt,0,Math.PI,"ZXY");var e=(new Me.Vector3).fromArray(p),t=d[2];return(null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid&&(t=Fe.z),Tw.isSame(e,St)?new Me.Euler(0,vt,t,"ZXY"):Tw.isSame(e,jt)?new Me.Euler(0,-vt,t,"ZXY"):Tw.isSame(e,Ht)?new Me.Euler(-vt,0,t,"ZXY"):Tw.isSame(e,zt)?new Me.Euler(vt,0,t,"ZXY"):new Me.Euler(0,0,t,"ZXY")}(),Ke=function(){var e,t;if(Ce){if(Ce.type===V.Cuboid){var l=new Me.Vector3(Oe.x,Oe.y,Xe),a=(new Me.Vector3).fromArray(p),o=!1,i=new Me.Vector3;return Tw.isSame(a,St)?(o=!0,i.x=Ce.lx/2+.01):Tw.isSame(a,jt)?(o=!0,i.x=-Ce.lx/2-.01):Tw.isSame(a,Ht)?(o=!0,i.y=Ce.ly/2+.01):Tw.isSame(a,zt)&&(o=!0,i.y=-Ce.ly/2-.01),o&&(i.applyEuler(Fe),l.x=Oe.x+i.x,l.y=Oe.y+i.y,l.z=Oe.z+i.z),l}if(Ce.type===V.Wall)return new Me.Vector3(0,-.01,0)}return new Me.Vector3(null!==(e=null===Ce||void 0===Ce?void 0:Ce.cx)&&void 0!==e?e:0,null!==(t=null===Ce||void 0===Ce?void 0:Ce.cy)&&void 0!==t?t:0,Xe)}(),qe=Object(r.useMemo)((function(){var e,t=new Array,l=Object(f.a)(Ge);try{for(l.s();!(e=l.n()).done;){var a=e.value;t.push(new Me.Vector3(a.x,a.y,0))}}catch(o){l.e(o)}finally{l.f()}return t.push(new Me.Vector3(Ge[0].x,Ge[0].y,0)),t}),[Ge]),Qe=Object(r.useMemo)((function(){var e=new Me.Shape;e.moveTo(Ge[0].x,Ge[0].y);for(var t=1;t0&&(e.intersections[0].object===e.eventObject&&(De(t),t===B.Default?fe.style.cursor="move":fe.style.cursor="pointer"))}),[]),_e=Object(r.useCallback)((function(){De(null),fe.style.cursor="default"}),[]),$e=Object(r.useMemo)((function(){var e;switch(oe){case ce.Texture01:e=Kp;break;case ce.Texture02:e=qp;break;case ce.Texture03:e=Qp;break;case ce.Texture04:e=Zp;break;case ce.Texture05:e=_p;break;case ce.Texture06:e=$p;break;case ce.Texture07:e=ey;break;case ce.Texture08:e=vm;break;case ce.Texture09:e=bm;break;case ce.Texture10:e=Am;break;default:e=Sf}return(new Me.TextureLoader).load(e,(function(e){var t=function(e){switch(e){case ce.Texture01:return{x:1,y:1};case ce.Texture02:return{x:2,y:2};case ce.Texture03:return{x:.4,y:.4};case ce.Texture04:return{x:.25,y:.25};case ce.Texture05:return{x:5,y:5};case ce.Texture06:case ce.Texture07:return{x:1,y:1};case ce.Texture08:case ce.Texture09:return{x:2,y:2};case ce.Texture10:return{x:4,y:4};default:return{x:1,y:1}}}(oe);e.wrapT=e.wrapS=Me.RepeatWrapping,e.repeat.set(1/t.x,1/t.y);var l=(new Me.Vector3).fromArray(p);Tw.isSame(l,St)?e.rotation=vt:Tw.isSame(l,jt)?e.rotation=-vt:Tw.isSame(l,zt)&&(e.rotation=Math.PI),at(e)}))}),[oe,p]),et=Object(r.useState)($e),tt=Object(u.a)(et,2),lt=tt[0],at=tt[1];return Object(gf.jsxs)("group",{name:"Polygon Group "+t,rotation:Be,position:Ke,children:[c&&Object(gf.jsxs)("mesh",{uuid:t,ref:We,receiveShadow:de,castShadow:!1,name:V.Polygon,onPointerDown:function(e){2!==e.button&&se===V.None&&ne(t,e)},onContextMenu:function(e){ne(t,e,X.ContextMenu),ie((function(t){e.intersections.length>0&&(e.intersections[0].object===We.current&&(e.intersections.length>1&&t.pastePoint.copy(e.intersections[1].point),t.contextMenuObjectType=V.Polygon))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===We.current&&ge(!0))},onPointerOut:function(){ge(!1),fe.style.cursor="default"},children:[Object(gf.jsx)("shapeBufferGeometry",{attach:"geometry",args:[Qe]}),void 0===ee||0===ee?Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:oe===ce.NoTexture?g:"white",map:lt,side:Me.DoubleSide,transparent:Q<1,opacity:Q}):Object(gf.jsx)("meshPhongMaterial",{attach:"material",color:oe===ce.NoTexture?g:"white",map:lt,side:Me.FrontSide,specular:new Me.Color("white"),shininess:ee,transparent:Q<1,opacity:Q})]}),w&&Object(gf.jsx)(Tm.a,{fontSize:v,scale:[1,1,1],color:A,position:[ve,Pe,.01],rotation:[0,0,(null===Ce||void 0===Ce?void 0:Ce.type)===V.Wall?Math.PI:0],anchorX:"center",anchorY:"middle",outlineWidth:P,outlineColor:j,strokeWidth:z,strokeColor:D,children:w}),(!_||L&&ue)&&Object(gf.jsx)(Jl.a,{points:qe,color:L&&ue?yt:C,lineWidth:k,dashed:W&&W!==F.Solid,dashSize:W===F.Dashed?.3:.1,gapSize:.1,uuid:t,receiveShadow:!1,castShadow:!1,name:"Polygon Wireframe",onPointerDown:function(e){2!==e.button&&ne(t,e)},onContextMenu:function(e){se===V.None&&(ne(t,e,X.ContextMenu),ie((function(l){if(e.intersections.length>0){var a=e.intersections[0].object;"Polygon Wireframe"===a.name&&a.uuid===t&&(l.contextMenuObjectType=V.Polygon)}})))}}),!c&&Object(gf.jsx)(Jl.a,{position:[0,0,.1],points:qe,visible:!1,lineWidth:Math.min(10*k,10),receiveShadow:!1,castShadow:!1,uuid:t,name:"Polygon Enlarged Line",onPointerDown:function(e){2!==e.button&&ne(t,e)},onContextMenu:function(e){se===V.None&&(ne(t,e,X.ContextMenu),ie((function(l){if(e.intersections.length>0){var a=e.intersections[0].object;"Polygon Enlarged Line"===a.name&&a.uuid===t&&(l.contextMenuObjectType=V.Polygon)}})))}}),ue&&!L&&Object(gf.jsx)(Lt.h,{ref:Ie,position:[ve,Pe,0],args:[Ne,6,6],name:B.Default,onPointerDown:function(e){2!==e.button&&(ne(t,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=N,e.oldParentId=N,e.oldFoundationId=J})),ie((function(e){e.moveHandleType=B.Default})))},onPointerOver:function(e){Ze(e,B.Default)},onPointerOut:_e,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),ue&&!L&&Ge.map((function(e,l){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Lt.a,{userData:{vertexIndex:l},position:[e.x,e.y,0],name:K.Default,args:[Ue,Ue,a/2+(c?0:.1)],onPointerDown:function(e){2!==e.button&&(ne(t,e,X.Resize),Je(t,l),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=N,e.oldParentId=N,e.oldFoundationId=J})),ie((function(e){e.resizeHandleType=K.Default})))},onPointerOver:function(e){Ze(e,K.Default),Je(t,l)},onPointerOut:_e,onContextMenu:function(e){ie((function(l){if(e.intersections.length>0){var a=e.intersections[0].object.userData.vertexIndex;void 0!==a&&(l.contextMenuObjectType=V.PolygonVertex,Je(t,a))}}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Re!==K.Default&&Ew.getState().resizeHandleType!==K.Default||le!==l?ht:pt})}),Object(gf.jsx)("textSprite",{name:"Label "+l,text:""+l,fontSize:20*Ee,fontFace:"Times Roman",textHeight:.2*Ee,position:[e.x,e.y,.2*Ee]})]},"resize-handle-"+l)})),(ye||U)&&!ue&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:(null!==m&&void 0!==m?m:me.t("shared.PolygonElement",Ve))+(L?" ("+me.t("shared.ElementLocked",Ve)+")":""),fontSize:20*Ee,fontFace:"Times Roman",textHeight:.2*Ee,position:[0,0,a+.2]})]})},Sm={display:!1,color:"white",textureType:ue.NoTexture,parapetHeight:1,copingsWidth:.5,copingsHeight:.1},jm=function(e){var t=e.args,l=e.wallData,a=e.parapetZ,o=e.currWallPointData,i=e.leftWallPointData,n=e.rightWallPointData,c=t.display,s=t.color,d=t.textureType,f=t.parapetHeight,h=t.copingsWidth,p=t.copingsHeight,y=l.id,g=(l.parentId,l.cx),m=l.cy,w=l.hx,x=l.hy,v=l.angle,b=(l.selected,f-p),A=fp(d),T=Object(r.useMemo)((function(){var e=new Me.Vector3(-w,x-h/2),t=new Me.Vector3(w,x-h/2),l=new Me.Vector3(w,x+h/2),a=new Me.Vector3(-w,x+h/2),r=[e,t,l,a];if(n||i){var c=Hm(o);if(n&&Rm(o.rightPoint,n.leftPoint)){var s=R(c,n);s&&(t.copy(s.outerIntersection),l.copy(s.innerIntersection))}if(i&&Rm(o.leftPoint,i.rightPoint)){var d=R(c,i);d&&(e.copy(d.outerIntersection),a.copy(d.innerIntersection))}}return r}),[x,h,o,i,n]),P=Object(r.useMemo)((function(){var e=new Me.Shape,t=new Me.Vector3(-w,2*x),l=new Me.Vector3(w,2*x);if(n||i){var a=zm(o,o.ly);if(n&&Rm(o.rightPoint,n.leftPoint)){var r=D(a,n);r&&l.copy(r)}if(i&&Rm(o.leftPoint,i.rightPoint)){var c=D(a,i);c&&t.copy(c)}}return e.moveTo(-w,0),e.lineTo(w,0),e.lineTo(l.x,l.y),e.lineTo(t.x,t.y),e.closePath(),e}),[w,o,i,n]),S=Object(r.useMemo)((function(){var e=new Me.Shape;if(0===h)return e;var t=Object(u.a)(T,4),l=t[0],a=t[1],o=t[2],i=t[3];return e.moveTo(l.x,l.y),e.lineTo(a.x,a.y),e.lineTo(o.x,o.y),e.lineTo(i.x,i.y),e.closePath(),e}),[x,h,T]),j=Object(r.useMemo)((function(){return T.map((function(e){return e.toArray()}))}),[x,T]),H=Object(r.useMemo)((function(){return[new Me.Vector3(-w,0,0),new Me.Vector3(w,0,0)]}),[w]),z=Object(r.useMemo)((function(){return[new Me.Vector3,new Me.Vector3(0,0,b)]}),[b]);function R(e,t){var l=Hm(t),a=Dm(e.outerPoints.leftPoint,e.outerPoints.rightPoint,l.outerPoints.leftPoint,l.outerPoints.rightPoint);if(!a)return null;var o=Dm(e.innerPoints.leftPoint,e.innerPoints.rightPoint,l.innerPoints.leftPoint,l.innerPoints.rightPoint);return o?{innerIntersection:(new Me.Vector3).subVectors(o,new Me.Vector3(g,m)).applyEuler(new Me.Euler(0,0,-v)),outerIntersection:(new Me.Vector3).subVectors(a,new Me.Vector3(g,m)).applyEuler(new Me.Euler(0,0,-v))}:null}function D(e,t){var l=zm(t,t.ly),a=Dm(e.leftPoint,e.rightPoint,l.leftPoint,l.rightPoint);return a?(new Me.Vector3).subVectors(a,new Me.Vector3(g,m)).applyEuler(new Me.Euler(0,0,-v)):null}return c?Object(gf.jsxs)("group",{name:"Wall Parapet Group",position:[0,0,a],onContextMenu:function(e){Ew.getState().selectMe(y,e,X.ContextMenu,!0),Ew.getState().set((function(t){e.intersections.length>0&&e.intersections[0].eventObject===e.eventObject&&(t.contextMenuObjectType=V.Wall)}))},onPointerDown:function(e){2!==e.button&&e.intersections.length>0&&e.intersections[0].eventObject===e.eventObject&&(Ew.getState().moveHandleType||Ew.getState().resizeHandleType||Ew.getState().isAddingElement()||Ew.getState().selectMe(y,e,X.Select,!0))},children:[Object(gf.jsx)(Lt.e,{name:"Body Extrude Mesh",args:[P,{steps:1,depth:b,bevelEnabled:!1}],children:Object(gf.jsx)("meshStandardMaterial",{color:s,map:A})}),Object(gf.jsx)(Jl.a,{position:[w,0,0],points:z,color:"black",lineWidth:.2}),Object(gf.jsx)(Jl.a,{position:[-w,0,0],points:z,color:"black",lineWidth:.2}),Object(gf.jsx)(Jl.a,{position:[0,0,b],points:H,color:"black",lineWidth:.2}),Object(gf.jsx)(Lt.e,{name:"Copings Extrude Mesh",position:[0,0,b],args:[S,{steps:1,depth:p,bevelEnabled:!1}],children:Object(gf.jsx)("meshStandardMaterial",{color:s})}),Object(gf.jsx)(Jl.a,{position:[0,0,b+p],points:j,color:"black",lineWidth:.2}),Object(gf.jsx)(Jl.a,{position:[0,0,b],points:j,color:"black",lineWidth:.2})]}):null};function Hm(e){var t=(e.ly+e.copingsWidth)/2,l=(e.ly-e.copingsWidth)/2;return{innerPoints:zm(e,t),outerPoints:zm(e,l)}}function zm(e,t){var l=e.leftPoint,a=e.rightPoint,o=(new Me.Vector3).fromArray(l),i=(new Me.Vector3).fromArray(a),r=(new Me.Vector3).subVectors(i,o).applyEuler(new Me.Euler(0,0,vt)).normalize().clone().multiplyScalar(t);return{leftPoint:o.clone().add(r),rightPoint:i.clone().add(r)}}function Rm(e,t){return Math.abs(e[0]-t[0])0){var b,A=Object(f.a)(x);try{for(A.s();!(b=A.n()).done;){var T=b.value;w-=Tw.getWindowArea(T,t)}}catch(oe){A.e(oe)}finally{A.f()}}if(v&&v.length>0){var P,S=Object(f.a)(v);try{for(S.s();!(P=S.n()).done;){var j=P.value;w-=j.lx*j.lz*t.lx*t.lz}}catch(oe){S.e(oe)}finally{S.f()}}var H=4*(null!==(e=Ew.getState().world.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),z=Tw.getHighestPointOfWall(t),R=Math.max(2,Math.round(i/H)),D=Math.max(2,Math.round(z/H)),M=i/R,W=z/D,I=(z-t.lz)/2,C=r/w*(null!==d&&void 0!==d?d:_e);g.current=C<0?1:0,m.current=Tw.getEuler(Rt,Ht,"YXZ",Math.sign(C)*vt);for(var O,F=[],k=n?Tw.getPartialWallVertices(t,0):Tw.getWallVertices(t,0),Y=0;Y0){var J,G=Object(f.a)(x);try{for(G.s();!(J=G.n()).done;){var X=J.value;if(X.type===V.Window){var B=X.cx*t.lx,K=X.cz*t.lz,q=X.lx*t.lx/2,Q=X.lz*t.lz/2;if(X.windowType===Yt.Arched){if(U>=B-q&&U=K-Q&&N=B-q&&U=K-Q&&N0){var Z,_=Object(f.a)(v);try{for(_.s();!(Z=_.n()).done;){var $=Z.value,ee=$.cx*i,te=$.cz*z,le=$.lx*i/2,ae=$.lz*z/2;if(U>=ee-le&&U=te-ae&&N0?E:S,U=z.length>0?U:S;var Ae=fp(R),Te=_f(m),Pe=Ew(si),je=Ew(on),He=Ew(is),ze=Ew(Sr),Re=Ew(Iu),De=Pf(wi),We=Ew(qn),Ie=Ew(o.shadowEnabled),Ce=Ew(Uu),Oe=Ew(Nu),Fe=Ew(o.solarRadiationHeatmapMaxValue),ke=Tf(yf),Ye=Tf(Ns),Le=Tf((function(e){return e.elementBeingCanceledId})),Ee=Tf((function(e){return e.showWallIntersectionPlaneId})),Ve=Object(r.useState)(!1),Je=Object(u.a)(Ve,2),Ge=Je[0],Xe=Je[1],Be=Object(r.useState)(null),Ke=Object(u.a)(Be,2),qe=Ke[0],Qe=Ke[1],Ze=Object(Se.f)(),_e=Ze.camera,$e=Ze.gl,et=(Ze.invalidate,function(e,t,l,a){var o=function(t){return t.parentId===e||t.id===a},i=Ew((function(e){if(t){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t)return o}}catch(i){a.e(i)}finally{a.f()}}return null})),n=Ew((function(e){if(l){var t,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.id===l)return o}}catch(i){a.e(i)}finally{a.f()}}return null})),c=Ew((function(e){return JSON.stringify(e.elements.filter(o))}));return{elementsOnWall:Object(r.useMemo)((function(){return Ew.getState().elements.filter((function(e){return o(e)&&Tw.isLegalOnWall(e.type)}))}),[c]),leftWall:i,rightWall:n}}(m,H[0],z[0])),tt=et.elementsOnWall,lt=et.leftWall,at=et.rightWall,ot=hp(g),it=Object(r.useRef)(null),rt=Object(r.useRef)(null),nt=Object(r.useRef)(null),ct=Object(r.useRef)(null),st=Object(r.useRef)(null),dt=Object(r.useRef)(null),ut=Object(r.useRef)(null),ft=Object(r.useRef)(null),ht=b/2,pt=T/2,xt=S/2,bt=ot?ot.rotation[2]+j:j,At=Tw.getInnerWallOffset(lt,b,T,j,"left"),Tt=Tw.getInnerWallOffset(at,b,T,j,"right"),Pt=Q===Ne.Stud||Q===Ne.Pillar,St=null!==(t=E)&&void 0!==t?t:S,jt=null!==(l=U)&&void 0!==l?l:S,Ht=ne===Ue.Partial,zt=Ht?se:0,Rt=Ht?fe:0,Dt=Ht?Math.min(St,pe):St,Mt=Ht?Math.min(jt,ge):jt,Wt=Ht&&(!Tw.isZero(St-Dt)||!Tw.isZero(jt-Mt)),It=Ie&&!Pt,Ct=xe.display,Ot=Math.max(Dt,Mt)-xt,Ft=Object(r.useMemo)((function(){return new Me.Vector2}),[]),kt=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Ut=Object(r.useMemo)((function(){return new Me.MeshStandardMaterial({color:"white",side:Me.DoubleSide,transparent:Pt,opacity:ie})}),[Pt,ie]),Nt=Object(r.useMemo)((function(){return Tw.getHighestPointOfWall(y)}),[y.lz,y.leftRoofHeight,y.rightRoofHeight,y.centerRoofHeight,y.centerLeftRoofHeight,y.centerRightRoofHeight]),Vt=Object(r.useMemo)((function(){var e=new Me.Shape;return function(e,t,l){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,n=!(arguments.length>7&&void 0!==arguments[7])||arguments[7],c=t/2,s=l/2;Ht?e.moveTo(a-c+i,o-s+se):e.moveTo(a-c+i,o-s);if(n){var d,u=tt.filter((function(e){return e.type===V.Door})).sort((function(e,t){return e.cx-t.cx})),h=Object(f.a)(u);try{for(h.s();!(d=h.n()).done;){var p=d.value;if(p.id!==ut.current){var y=p.cx*t,g=p.cz*l,m=p.lx*t,w=p.lz*S;if(p.doorType===hy.Default)e.lineTo(a+y-m/2,o-s),e.lineTo(a+y-m/2,o-s+w),e.lineTo(a+y+m/2,o-s+w),e.lineTo(a+y+m/2,o-s);else{var x=Math.min(p.archHeight,w,m/2);if(e.lineTo(a+y-m/2,o-s),x>.1){e.lineTo(a+y-m/2,o-s+w/2-x);var v=x/2+Math.pow(m,2)/(8*x),b=y,A=o+g+w/2-v,T=Math.acos(Math.min(m/2/v,1)),P=Math.PI-T;e.absarc(b,A,v,P,T,!0)}else e.lineTo(a+y-m/2,o-s+w),e.lineTo(a+y+m/2,o-s+w);e.lineTo(a+y+m/2,o-s)}}}}catch(j){h.e(j)}finally{h.f()}}Ht?e.lineTo(a+c-r,o-s+fe):e.lineTo(a+c-r,o-s);Wt?(e.lineTo(a+c-r,o-s+Mt),e.lineTo(a-c+i,o-s+Dt)):L?(U?e.lineTo(a+c-r,U-s):e.lineTo(a+c-r,o+s),G&&e.lineTo(G[0]*t,G[1]-s),N&&e.lineTo(N[0]*t,N[1]-s),J&&e.lineTo(J[0]*t,J[1]-s),E?e.lineTo(a-c+i,E-s):e.lineTo(a-c+i,o+s)):(e.lineTo(a+c-r,o+s),e.lineTo(a-c+i,o+s));e.closePath()}(e,b,S,0,0,0,0),tt.forEach((function(t){if(t.type===V.Window&&t.id!==ut.current&&t.lx>0&&t.lz>0){var l=t,a=new Me.Shape,o=t.lx*b,i=t.lz*S,r=t.cx*b,n=t.cz*S;if(l.windowType)switch(l.windowType){case Yt.Arched:rl(a,o,i,r,n,l.archHeight);break;case Yt.Polygonal:var c,s=null!==(c=l.polygonTop)&&void 0!==c?c:Fg,d=Object(u.a)(s,2);nl(a,o,i,r,n,d[0]*o,d[1]);break;case Yt.Default:default:il(a,o,i,r,n)}else il(a,o,i,r,n);e.holes.push(a)}})),e}),[b,S,ne,se,fe,Dt,Mt,tt,E,U,N,J,G]),Jt=Object(r.useMemo)((function(){var e=new Me.Shape,t=S,l=S/2;if(Ht)e.moveTo(-ht+At,-l+se),e.lineTo(ht-Tt,-l+fe);else{e.moveTo(-ht+At,-l);var a,o=tt.filter((function(e){return e.type===V.Door})).sort((function(e,t){return e.cx-t.cx})),i=Object(f.a)(o);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(r.id!==ut.current){var n=r.cx*b,c=r.cz*t,s=r.lx*b,d=r.lz*t;if(r.doorType===hy.Default)e.lineTo(n-s/2,-l),e.lineTo(n-s/2,-l+d),e.lineTo(n+s/2,-l+d),e.lineTo(n+s/2,-l);else{var h=Math.min(r.archHeight,d,s/2);if(e.lineTo(n-s/2,-l),h>.1){e.lineTo(n-s/2,d/2-l-h);var p=h/2+Math.pow(s,2)/(8*h),y=n,g=c+d/2-p,m=Math.acos(Math.min(s/2/p,1)),w=Math.PI-m;e.absarc(y,g,p,w,m,!0)}else e.lineTo(n-s/2,-l+d),e.lineTo(n+s/2,-l+d);e.lineTo(n+s/2,-l)}}}}catch(T){i.e(T)}finally{i.f()}e.lineTo(ht-Tt,-l)}if(Wt){var x=Mt-Dt,v=(b-Tt)*x/b,A=At*x/b;e.lineTo(ht-Tt,-l+Dt+v),e.lineTo(-ht+At,-l+Dt+A)}else L?(U?e.lineTo(ht-Tt,U-l):e.lineTo(ht-Tt,l),G&&e.lineTo(G[0]*b,G[1]-l),N&&e.lineTo(N[0]*b,N[1]-l),J&&e.lineTo(J[0]*b,J[1]-l),E?e.lineTo(-ht+At,E-l):e.lineTo(-ht+At,l)):(e.lineTo(ht-Tt,l),e.lineTo(-ht+At,l));return e.closePath(),tt.forEach((function(t){if(t.type===V.Window&&t.id!==ut.current&&t.lx>0&&t.lz>0){var l=t,a=new Me.Shape,o=t.lx*b,i=t.lz*S,r=t.cx*b,n=t.cz*S;if(l.windowType)switch(l.windowType){case Yt.Arched:rl(a,o,i,r,n,l.archHeight);break;case Yt.Polygonal:var c,s=null!==(c=l.polygonTop)&&void 0!==c?c:Fg,d=Object(u.a)(s,2);nl(a,o,i,r,n,d[0]*o,d[1]);break;case Yt.Default:default:il(a,o,i,r,n)}else il(a,o,i,r,n);e.holes.push(a)}})),e}),[b,S,ne,se,fe,Dt,Mt,At,Tt,tt,L,E,U,N,J,G]),Gt=Object(r.useMemo)((function(){return Ht?(Dt+Mt)/2-xt:xt}),[xt,Ht,Dt,Mt]),Xt=Object(r.useMemo)((function(){var e=Mt-Dt;return!Ht||Math.abs(e)<.01?0:Math.atan2(e,b)}),[b,Ht,Dt,Mt]),Bt=Object(r.useMemo)((function(){var e=new Me.Shape;if(!Ht||Math.abs(Xt)<1e-4)return function(e,t,l,a,o){var i=t/2,r=l/2;e.moveTo(-i,-r),e.lineTo(i,-r),e.lineTo(i-o,r),e.lineTo(-i+a,r),e.closePath()}(e,b,T,At,Tt),e;var t=b/2,l=T/2,a=Math.cos(Xt),o=t/a,i=(t-At)/a,r=(t-Tt)/a;return e.moveTo(-o,-l),e.lineTo(o,-l),e.lineTo(r,l),e.lineTo(-i,l),e.closePath(),e}),[b,T,At,Tt,Ht,Xt]),Kt=Object(r.useMemo)((function(){var e=[],t=b/2,l=S/2;return Ht?(e.push({x:-t+At,y:-l+zt}),e.push({x:t-Tt,y:-l+Rt})):(e.push({x:-t,y:-l}),e.push({x:t,y:-l})),Wt?(e.push({x:t-Tt,y:-l+Mt}),e.push({x:-t+At,y:-l+Dt})):(U?e.push({x:t,y:U-l}):e.push({x:t,y:l}),G&&e.push({x:G[0]*b,y:G[1]-l}),N&&e.push({x:N[0]*b,y:N[1]-l}),J&&e.push({x:J[0]*b,y:J[1]-l}),E?e.push({x:-t,y:E-l}):e.push({x:-t,y:l})),e}),[b,S,ne,zt,Rt,Dt,Mt,E,U,N,J,G]),qt=Object(r.useMemo)((function(){var e=[],t=0,l=0;ne===Ue.Partial&&(l=se+ht*(t=(fe-se)/b));if(Q===Ne.Stud){for(var a=te/2-ht;a<=ht;)e.push([a,t*a+l]),a+=_;a=ht-te/2,e.push([a,t*a+l])}else if(Q===Ne.Pillar){for(var o=-ht;o<=ht;)e.push([o,t*o+l]),o+=_;e.push([ht,t*ht+l])}return e}),[Q,te,_,b,T,S,se,fe]),Qt=Object(r.useMemo)((function(){return{id:m,parentId:F,cx:w,cy:x,hx:ht,hy:pt,angle:j,selected:Te}}),[m,F,w,x,ht,pt,j,Te]),Zt=Object(r.useMemo)((function(){return{leftPoint:ve,rightPoint:be,ly:T,copingsWidth:xe.copingsWidth}}),[ve,be,T,xe.copingsWidth]),_t=Object(r.useMemo)((function(){return lt&<.parapet&<.parapet.display?{leftPoint:lt.leftPoint,rightPoint:lt.rightPoint,ly:lt.ly,copingsWidth:lt.parapet.copingsWidth}:null}),[null===lt||void 0===lt?void 0:lt.leftPoint,null===lt||void 0===lt?void 0:lt.rightPoint,null===lt||void 0===lt?void 0:lt.ly,null===lt||void 0===lt||null===(a=lt.parapet)||void 0===a?void 0:a.copingsWidth,null===lt||void 0===lt||null===(i=lt.parapet)||void 0===i?void 0:i.display]),$t=Object(r.useMemo)((function(){return at&&at.parapet&&at.parapet.display?{leftPoint:at.leftPoint,rightPoint:at.rightPoint,ly:at.ly,copingsWidth:at.parapet.copingsWidth}:null}),[null===at||void 0===at?void 0:at.leftPoint,null===at||void 0===at?void 0:at.rightPoint,null===at||void 0===at?void 0:at.ly,null===at||void 0===at||null===(n=at.parapet)||void 0===n?void 0:n.copingsWidth,null===at||void 0===at||null===(c=at.parapet)||void 0===c?void 0:c.display]);function el(e,t){var l=t.cx,a=t.cy,o=t.cz;if(ot&&void 0!==bt){var i=Tw.wallAbsolutePosition(new Me.Vector3(l,a,o),ot).setZ(S/2+ot.lz);return(new Me.Vector3).subVectors(e,i).applyEuler(new Me.Euler(0,0,-bt))}return new Me.Vector3}function tl(e){for(var t=[],l=-1;l<=1;l+=2)for(var a=-1;a<=1;a+=2){var o=l,i=l*a;switch(e.type){case V.Window:var r=e.cx*b,n=e.cz*S,c=r+o*(e.lx*b/2),s=n+i*(e.lz*S/2);t.push({x:c,y:s});break;case V.Door:var d=e.cx*b,f=e.cz*S,h=d+o*(e.lx*b/2),p=f+i*(e.lz*S/2);t.push({x:h,y:p});break;case V.SolarPanel:var y=e.cx*b,g=e.cz*S,m=y+o*(e.lx/2),w=g+i*(e.ly/2);t.push({x:m,y:w})}}if(e.type===V.Window&&e.windowType===Yt.Polygonal){var x,v=null!==(x=e.polygonTop)&&void 0!==x?x:[0,0],A=Object(u.a)(v,2),T=A[0],P=A[1];t.push({x:e.cx*b+T*e.lx*b,y:e.cz*S+e.lz*S/2+P})}return t}function ll(e,t,l,a,o){if(l<.1||a<.1)return ut.current=e,!1;if(l>b||!L&&a>S)return ut.current=e,!1;l+=.1,a+=.1;var i,r=Object(f.a)(tt);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.id!==e&&n.type!==V.Polygon){for(var c=tl(n),s=[],d=-1;d<=1;d+=2)for(var h=-1;h<=1;h+=2){var p=t.x+d*l/2,y=t.z+d*h*a/2;if(s.push({x:p,y:y}),Tw.isPointInside(p,y,c))return ut.current=e,!1}if(o){var g=Object(u.a)(o,2),m=g[0],w=g[1],x=t.x+m*l,v=t.z+a/2+w;if(s.push({x:x,y:v}),Tw.isPointInside(x,v,c))return ut.current=e,!1}var A,T=Object(f.a)(c);try{for(T.s();!(A=T.n()).done;){var P=A.value;if(Tw.isPointInside(P.x,P.y,s))return ut.current=e,!1}}catch(j){T.e(j)}finally{T.f()}}}}catch(j){r.e(j)}finally{r.f()}return ut.current=null,!0}function al(e,t,l,a,o){return!!Tw.isElementInsideWall(t,l,a,Kt,o)||(ut.current=e,!1)}function ol(e,t,l,a){var o=Object(u.a)(a,2),i=o[0],r=o[1],n=e.x+t*i,c=e.z+l/2+r;return!!Tw.isPointInside(n,c,function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!Ht)return Tw.getWallVertices(e,t);var l=e.lx/2,a=e.lz/2,o={x:-l-t,y:e.leftUnfilledHeight-a-t},i={x:l+t,y:e.rightUnfilledHeight-a-t},r={x:-l-t,y:e.leftTopPartialHeight-a+t},n={x:l+t,y:e.rightTopPartialHeight-a+t},c=[];return c.push(r,o,i,n),Wt||(e.centerRightRoofHeight&&c.push({x:e.centerRightRoofHeight[0]*e.lx,y:e.centerRightRoofHeight[1]-a+t}),e.centerRoofHeight&&c.push({x:e.centerRoofHeight[0]*e.lx,y:e.centerRoofHeight[1]-a+t}),e.centerLeftRoofHeight&&c.push({x:e.centerLeftRoofHeight[0]*e.lx,y:e.centerLeftRoofHeight[1]-a+t})),c}(y,0))}function il(e,t,l){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i=t/2,r=l/2;e.moveTo(a-i,o-r),e.lineTo(a+i,o-r),e.lineTo(a+i,o+r),e.lineTo(a-i,o+r),e.closePath()}function rl(e,t,l,a,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=t/2,n=l/2,c=Math.min(i,l,r);if(e.moveTo(a-r,o-n),e.lineTo(a+r,o-n),e.lineTo(a+r,o+n-c),c>0){var s=c/2+Math.pow(t,2)/(8*c),d=a,u=o+n-s,f=Math.acos(Math.min(1,r/s)),h=Math.PI-f;e.absarc(d,u,s,f,h,!1)}else e.lineTo(a-r,o+n);e.closePath()}function nl(e,t,l,a,o,i,r){var n=t/2,c=l/2;e.moveTo(a-n,o-c),e.lineTo(a+n,o-c),e.lineTo(a+n,o+c),e.lineTo(a+i,o+c+r),e.lineTo(a-n,o+c),e.closePath()}function cl(e){return e=Ew.getState().enableFineGrid?function(e){var t=parseFloat((Math.round(e.x/gt)*gt).toFixed(1)),l=parseFloat((Math.round(e.z/gt)*gt).toFixed(1));return new Me.Vector3(t,e.y,l)}(e):function(e){var t=parseFloat((Math.round(e.x/mt)*mt).toFixed(1)),l=parseFloat((Math.round(e.z/mt)*mt).toFixed(1));return new Me.Vector3(t,e.y,l)}(e)}function sl(e,t){var l=(new Me.Vector3).subVectors((new Me.Vector3).fromArray(e.leftPoint).setZ(0),(new Me.Vector3).fromArray(e.rightPoint).setZ(0)),a=(new Me.Vector3).subVectors((new Me.Vector3).fromArray(t.rightPoint).setZ(0),(new Me.Vector3).fromArray(t.leftPoint).setZ(0)).angleTo(l);return Math.abs(a-Math.PI/2)<.087}function dl(e,t,l,a,o){Ew.getState().set((function(i){var r,n=Object(f.a)(i.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.id===e){var s=Object(u.a)(t,3);c.cx=s[0],c.cy=s[1],c.cz=s[2];var d=Object(u.a)(l,3);if(c.lx=d[0],c.ly=d[1],c.lz=d[2],void 0!==a&&(c.type===V.Window||c.type===V.Door)&&(c.archHeight=a),void 0!==o&&c.type===V.Window){var p=c;p.windowType===Yt.Polygonal&&(p.polygonTop=Object(h.a)(o))}break}}}catch(y){n.e(y)}finally{n.f()}}))}function ul(e){return e.type===V.Window&&e.windowType===Yt.Polygonal&&e.polygonTop}function fl(e){var t={name:"Add",timestamp:Date.now(),addedElement:e,undo:function(){Ew.getState().removeElementById(e.id,!1)},redo:function(){Ew.getState().set((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement,e.deletedRoofId=null}))}};ze(t)}function hl(){Ew.getState().set((function(e){e.addedWindowId=null,e.addedDoorId=null}))}function pl(e){return e.intersections.length>0&&e.intersections[0].object===e.eventObject}function yl(e,t,l){if(Ew.getState().moveHandleType&&t&&function(e){if(!e)return!1;switch(e.type){case V.Window:case V.Door:case V.SolarPanel:case V.Light:case V.Sensor:return!0}return!1}(t)&&t.parentId!==e){var a=l.intersections.filter((function(e){return e.eventObject.name.includes(pp.WALL_OUTSIDE_SURFACE_MESH_NAME)||e.eventObject.name.includes(Og)||e.eventObject.name===Om}));if(!(a.length>0&&(a[0].eventObject.name===Om||a[0].eventObject.name.includes(Og))))return!0}return!1}function gl(e){if(Ew.getState().resizeHandleType!==K.Arch)return!1;if(e.type===V.Window){var t=e;return t.windowType===Yt.Arched&&void 0!==t.archHeight}if(e.type===V.Door){var l=e;return l.doorType===hy.Arched&&void 0!==l.archHeight}}function ml(e,t,l,a,o){var i,r=arguments.length>5&&void 0!==arguments[5]&&arguments[5],n=(new Me.Vector3).subVectors(t,e).normalize(),c=r?[t.y,e.y]:[e.y,t.y],s=Object(u.a)(c,2),d=s[0],f=s[1];if(d0;){o++;var c=l.get(n.rightJoints[0]);if(!c)break;if(t&&c.lz!==r.lz)return!1,Qh(me.t("message.WallsAreNotAtSameHeight",i)),!1;if(e&&!sl(n,c))return!1,Qh(me.t("message.WallsAreNotPerpendicular",i)),!1;if(c.id===r.id){a=!0;break}if(n=c,o>100)break}return a?!e||4===o||(Qh(me.t("message.WallsNumberNeedToBeFour",i)),!1):(Qh(me.t("message.WallsAreNotConnected",i)),!1)}function vl(){return ft.current&&ft.current.status===Mm.SettingStartPoint&&Ew.getState().moveHandleType===B.Mid}function bl(){return!(Ew.getState().moveHandleType||Ew.getState().resizeHandleType||Re())}function Al(e,t,l){var a,o;!function(e){Ft.x=e.offsetX/$e.domElement.clientWidth*2-1,Ft.y=-e.offsetY/$e.domElement.clientHeight*2+1,kt.setFromCamera(Ft,_e)}(e);var i=el(null!==(a=null===(o=(t?kt.intersectObjects([t]):e.intersections)[0])||void 0===o?void 0:o.point)&&void 0!==a?a:e.point,y),r=l?cl(i.clone().add(l)).sub(l):cl(i);return{relativePointer:i,pointerOnGrid:r}}function Tl(e){if(e){var t=e.id,l=e.type;Pe((function(e){e.elements=e.elements.filter((function(e){return e.id!==t})),e.selectedElement=null,e.moveHandleType=null,e.objectTypeToAdd=l,e.addedWindowId=null,e.addedDoorId=null})),ft.current=null}}function Pl(e){if(!e)return[0,0];switch(e.type){case V.Window:var t=Tf.getState().oldParentId;if(e.parentId!==t){var l=Ew.getState().elements.find((function(e){return e.id===t}));return l?[e.lx*l.lx/2,e.lz*l.lz/2]:[0,0]}return[e.lx*b/2,e.lz*S/2];case V.Door:return[e.lx*b/2,e.lz*S/2];case V.SolarPanel:return[e.lx/2,e.ly/2]}return[km,km]}function Sl(){var e=[];if(N){var t=N[0];if(.5===t&&void 0!==E)return e.push(new Me.Vector3(ht,N[1]-xt),new Me.Vector3(-ht,E-xt)),e;if(-.5===t&&void 0!==U)return e.push(new Me.Vector3(ht,U-xt),new Me.Vector3(-ht,N[1]-xt)),e}return void 0!==U?e.push(new Me.Vector3(ht,U-xt)):e.push(new Me.Vector3(ht,xt)),void 0!==G&&e.push(new Me.Vector3(G[0]*b,G[1]-xt)),void 0!==N&&e.push(new Me.Vector3(N[0]*b,N[1]-xt)),void 0!==J&&e.push(new Me.Vector3(J[0]*b,J[1]-xt)),void 0!==E?e.push(new Me.Vector3(-ht,E-xt)):e.push(new Me.Vector3(-ht,xt)),e}function jl(e,t){var l=null===t||void 0===t?void 0:t.ignorePadding,a=(null===t||void 0===t?void 0:t.elementHalfSize)?Object(h.a)(t.elementHalfSize):[0,0],o=l?0:km,i=l?0:km+At,r=l?0:km+Tt,n=Object(u.a)(a,2),c=n[0],s=n[1],d=-ht+c+i,f=ht-c-r,p=-xt+s+o,y=xt-s-o,g=e.clone();if(!Wt&&se===fe&&pe===ge&&(!L||E===U&&void 0===N&&void 0===J&&void 0===G)){var m=Ht?se:0,w=S-(Ht?Dt:S);return g.setX(Tw.clamp(e.x,d,f)),g.setZ(Tw.clamp(e.z,p+m,y-w)),g}var x=function(e,t,l,a,o){var i=[],r=new Me.Vector3(-ht,-xt+zt),n=new Me.Vector3(ht,-xt+Rt);if(ml(r,n,e,t,o,!0),i.push({start:new Me.Vector3(l,xt),end:new Me.Vector3(l,r.y)}),i.push({start:r.clone(),end:n.clone()}),i.push({start:new Me.Vector3(a,n.y),end:new Me.Vector3(a,xt)}),Wt){var c=new Me.Vector3(ht,-xt+Mt),s=new Me.Vector3(-ht,-xt+Dt);ml(c,s,e,t,o),i.push({start:c.clone(),end:s.clone()})}else for(var d=Sl(),u=1;u=z.x&&T<=R.x){var D=(R.y-z.y)/(R.x-z.x);b=D*T+(-D*z.x+z.y);break}}var M=new Me.Vector3(-ht,-xt+zt),W=new Me.Vector3(ht,-xt+Rt),I=(W.y-M.y)/(W.x-M.x);A=I*T+(-I*M.x+M.y)}var C=v.y>b;if(function(e,t){var l=e.getPoints().map((function(e){return{x:e.x,y:e.y}}));return!Tw.isPointInside(t.x,t.y,l)}(x,v)){var O=function(e,t){for(var l=e.getPoints(),a=t,o=1/0,i=0;i0){var r=Tw.calculatePolygonCentroid(i.vertices),n=-t.x/b-r.x,c=-t.z/S-r.y,s=i.vertices.map((function(e){return{x:e.x+n,y:e.y+c}}));a.vertices=s}}}))}function zl(e,t,l){var a=e.lx*b,o=e.lz*S,i=o/2-Math.min(e.archHeight,a/2,o),r=Math.max(0,Math.min(t.z-l.z-i,a/2)),n=i+r+o/2;return{newLz:n,newCz:new Me.Vector3(e.cx*b,e.cy,e.cz*S+(n-o)/2).z,newArchHeight:r}}function Rl(e){if(2!==e.button)if(vl()){Et.getState().setEnableOrbitController(!1),Xe(!0);var t=jl(Al(e,it.current).pointerOnGrid);Pe((function(e){var l,a;e.moveHandleType=null,(null===(l=ft.current)||void 0===l?void 0:l.type)===V.Window?(e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(t)):(null===(a=ft.current)||void 0===a?void 0:a.type)===V.Door&&(e.resizeHandleType=K.UpperRight,e.resizeAnchor.copy(t).setZ(-S/2))})),ft.current.status=Mm.SettingEndPoint}else if(pl(e)){if(Ew.getState().objectTypeToAdd!==V.None)Dl(e.point,!0);else Ew.getState().groupActionMode?(Pe((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===F}}catch(o){l.e(o)}finally{l.f()}e.multiSelectionsMode||e.selectedElementIdSet.clear(),e.selectedElementIdSet.has(F)?e.selectedElementIdSet.delete(F):e.selectedElementIdSet.add(F)})),e.stopPropagation()):bl()&&Ew.getState().selectMe(m,e,X.Select)}}function Dl(e,t){if(ot&&Ew.getState().objectTypeToAdd){var l=null;switch(Ew.getState().objectTypeToAdd){case V.PyramidRoof:!L&&xl(!1,!0)&&(l=Vl.makePyramidRoof([y.id],ot));break;case V.GableRoof:!L&&xl(!1,!1)&&(l=Vl.makeGableRoof([y.id],ot));break;case V.HipRoof:!L&&xl(!1,!0)&&(l=Vl.makeHipRoof([y.id],ot,b/2));break;case V.GambrelRoof:!L&&xl(!1,!1)&&(l=Vl.makeGambrelRoof([y.id],ot));break;case V.MansardRoof:!L&&xl(!1,!0)&&(l=Vl.makeMansardRoof([y.id],ot));break;case V.SolarPanel:if(e&&t){var a,o,i,r,n=el(e,y),c=y.relativeAngle-vt,s=Ew.getState().actionState;l=Vl.makeSolarPanel(y,Ew.getState().getPvModule(null!==(a=s.solarPanelModelName)&&void 0!==a?a:"SPR-X21-335-BLK"),n.x/b,0,n.z/S,null!==(o=s.solarPanelOrientation)&&void 0!==o?o:$.landscape,null!==(i=s.solarPanelPoleHeight)&&void 0!==i?i:1,null!==(r=s.solarPanelPoleSpacing)&&void 0!==r?r:3,0,0,new Me.Vector3(Math.cos(c),Math.sin(c),0),[0,0,0],s.solarPanelFrameColor,void 0,void 0,V.Wall)}break;case V.Sensor:if(e&&t){var d=el(e,y),u=y.relativeAngle-vt;l=Vl.makeSensor(y,(d.x-.05)/b,0,(d.z-.05)/S,new Me.Vector3(Math.cos(u),Math.sin(u),0),[0,0,0])}break;case V.Light:if(e&&t){var f=el(e,y),h=y.relativeAngle-vt,p=Ew.getState().actionState;l=Vl.makeLight(y,2,p.lightDistance,p.lightIntensity,p.lightColor,(f.x-.05)/b,0,(f.z-.05)/S,new Me.Vector3(Math.cos(h),Math.sin(h),0),[0,0,0])}}l&&(fl(l),Pe((function(e){e.elements.push(l),l&&l.type===V.Roof&&e.addedRoofIdSet.add(l.id),e.actionModeLock||(e.objectTypeToAdd=V.None)})))}}function Ml(e,t,l){st.current||(He(m,e,X.ContextMenu),Pe((function(a){e.intersections.length>0&&e.intersections[0].object===t&&(a.contextMenuObjectType=V.Wall,l&&a.pastePoint.copy(e.intersections[0].point))})),e.stopPropagation())}function Wl(e){if(2!==e.button){var t=Ew.getState().objectTypeToAdd;vl()||Re()||!pl(e)||t!==V.None?Vm.isTypeRoof(t)&&Rl(e):Ew.getState().groupActionMode?(Pe((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.id===F?a.selected=!0:a.selected=!1}}catch(o){l.e(o)}finally{l.f()}})),e.stopPropagation()):bl()&&Ew.getState().selectMe(m,e,X.Select)}}function Il(e){2!==e.button&&0!==e.intersections.length&&e.intersections[0].object===e.eventObject&&(Ew.getState().groupActionMode?Pe((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===F}}catch(o){l.e(o)}finally{l.f()}e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(F)})):(function(e){return!(2===e.button||Ew.getState().addedWallId||dt.current||Ew.getState().moveHandleType||Ew.getState().resizeHandleType||Ew.getState().objectTypeToAdd!==V.None||Te||Re())}(e)&&(Pe((function(e){e.contextMenuObjectType=null})),He(m,e,X.Select)),Dl(),e.stopPropagation()))}function Cl(e){e.intersections.length>0&&e.intersections[0].object===e.eventObject&&(Pe((function(e){e.contextMenuObjectType=V.Wall})),He(m,e,X.ContextMenu),e.stopPropagation())}return Object(r.useEffect)((function(){ft.current&&ft.current.id===Le&&(ft.current=null,hl())}),[Le]),Object(r.useEffect)((function(){if(y&&Ye){var e=De(y.id);if(e){var t=Tw.fetchHeatmapTexture(e,null!==Fe&&void 0!==Fe?Fe:5);if(t){t.wrapS=Me.RepeatWrapping,t.wrapT=Me.RepeatWrapping;var l=S===Nt?0:(1-S/Nt)/2;t.offset.set(-b/2,-Nt/2-l),t.center.set(b/2,Nt/2),t.repeat.set(1/b,1/Nt),Qe(t)}}}}),[Ye,Fe]),Object(r.useEffect)((function(){L&&(Ce.has(L)||Oe.has(L))&&Ew.getState().set((function(e){var t,l=new Set,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.id===m&&o.type===V.Wall){var i=o;i.roofId=null,i.leftRoofHeight=void 0,i.rightRoofHeight=void 0,i.centerRoofHeight=void 0,i.centerLeftRoofHeight=void 0,i.centerRightRoofHeight=void 0,tt.length>0&&function(){var t=Vm.getWallPoints2D(i);tt.forEach((function(a){if(a.type!==V.Polygon){var o=a.type===V.Door,i=a.type===V.SolarPanel,r=i?a.lx-.01:a.lx*b,n=i?a.ly-.01:a.lz*S,c=new Me.Vector3(a.cx*b,0,a.cz*S);Tw.isElementInsideWall(c,r,n,t,o)||(l.add(a.id),e.autoDeletedChild?e.autoDeletedChild.push(a):e.autoDeletedChild=[a])}}))}();break}}}catch(r){a.e(r)}finally{a.f()}l.size>0?e.elements=e.elements.filter((function(e){return!l.has(e.id)})):null===e.autoDeletedChild&&(e.autoDeletedChild=[])}))}),[L,Ce,Oe]),Object(gf.jsxs)(gf.Fragment,{children:[(ie>0||Q===Ne.Default)&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("mesh",{name:"Wall Simulation Mesh",uuid:m,userData:{simulation:!0},rotation:[vt,0,0],castShadow:!1,receiveShadow:!1,visible:!1,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Vt]}),Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})]}),Object(gf.jsxs)("mesh",{name:"".concat(pp.WALL_OUTSIDE_SURFACE_MESH_NAME," ").concat(m),ref:it,rotation:[vt,0,0],castShadow:It,receiveShadow:Ie,onContextMenu:function(e){Ml(e,it.current,!0)},onPointerMove:function(e){if(function(e,t){var l=e.intersections.filter((function(e){return e.object.name!==Fm}));return l.length>0&&l[0].object.name==="".concat(pp.WALL_OUTSIDE_SURFACE_MESH_NAME," ").concat(t)}(e,m)){var t=Ew.getState().objectTypeToAdd;if((o=t)===V.Window||o===V.Door)!function(e){e&&(ft.current={id:e.id,type:e.type,status:Mm.SettingStartPoint}),Pe((function(t){e&&(t.elements.push(e),t.selectedElement=e,t.selectedElementIdSet.clear(),t.selectedElementIdSet.add(e.id),e.type===V.Window?t.addedWindowId=e.id:e.type===V.Door&&(t.addedDoorId=e.id)),t.moveHandleType=B.Mid,t.objectTypeToAdd=V.None}))}(function(e,t){if(!it.current)return null;var l=Al(e,it.current).pointerOnGrid,a=l.x/y.lx,o=l.z/y.lz;return t===V.Window?Vl.makeWindow(y,a,0,o,V.Wall):t===V.Door?Vl.makeDoor(y):null}(e,t));if(vl()){var l=jl(Al(e,it.current).pointerOnGrid);Hl(ft.current.id,l)}var a=Ew.getState().selectedElement;yl(m,a,e)&&(Pe((function(t){var l=t.elements.find((function(e){return e.id===(null===a||void 0===a?void 0:a.id)}));if(l&&(l.type!==V.SolarPanel||void 0!==l.parentType)){if(l.type===V.Window){var o=t.elements.find((function(e){return e.id===l.parentId}));if(o){var i=l.lx*o.lx,r=l.lz*o.lz;l.lx=i/b,l.lz=r/S}}var n=Al(e,it.current).pointerOnGrid,c=Pl(l),s=jl(n,{elementHalfSize:c,ignorePadding:l.type===V.SolarPanel});ll(l.id,s,2*c[0],2*c[1]),l.cx=s.x/b,l.cz=s.z/S,l.parentId=m,l.foundationId=F,t.selectedElement&&(t.selectedElement.parentId=m,t.selectedElement.foundationId=F),l.type===V.Window?(l.cy=l.id===ut.current?-.01:0,l.tint=l.id===ut.current?"red":t.selectedElement.tint):l.type===V.SolarPanel&&(l.color=l.id===ut.current?"red":"#fff",l.parentType=V.Wall)}})),ke("showWallIntersectionPlaneId",m))}else vl()&&Tl(ft.current);var o},onPointerDown:Rl,onPointerUp:function(){ft.current&&ft.current.status===Mm.SettingStartPoint&&(Pe((function(e){e.elements.pop(),e.addedDoorId=null,e.addedWindowId=null,e.moveHandleType=null,e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null)},onPointerOut:function(){vl()&&Tl(ft.current),ut.current=null},children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Vt]}),Ye&&qe?Object(gf.jsx)("meshBasicMaterial",{attach:"material",map:qe,color:"white",opacity:ie,transparent:Pt}):Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:R===ue.Default||R===ue.NoTexture?M:"white",map:Ae,transparent:Pt,opacity:ie})]}),Object(gf.jsxs)("mesh",{rotation:[vt,0,0],position:[0,.05,0],castShadow:It,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(gf.jsx)("meshStandardMaterial",{color:"white",side:Me.BackSide,transparent:Pt,opacity:ie})]}),Object(gf.jsxs)("mesh",{name:"Inside Wall",ref:rt,position:[0,T,0],rotation:[vt,0,0],castShadow:It,receiveShadow:Ie,onPointerDown:Wl,onContextMenu:function(e){Ml(e,rt.current)},children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(gf.jsx)(Ym,{transparent:Pt,color:M,opacity:ie})]}),Object(gf.jsxs)("mesh",{rotation:[vt,0,0],position:[0,T-.01,0],receiveShadow:!0,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(gf.jsx)("meshStandardMaterial",{color:"white",side:Me.FrontSide,transparent:Pt,opacity:ie})]}),(!L||Wt)&&!Ct&&Object(gf.jsx)("mesh",{name:"Top Wall",ref:nt,material:Ut,position:[0,pt,Gt],rotation:[0,-Xt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Wl,onContextMenu:function(e){Ml(e,nt.current)},children:Object(gf.jsx)("shapeBufferGeometry",{args:[Bt]})}),0===At&&Object(gf.jsx)(Lt.f,{args:[Dt-zt,T],material:Ut,position:[.01-ht,pt,-xt+zt+(Dt-zt)/2],rotation:[0,vt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Wl}),0===Tt&&Object(gf.jsx)(Lt.f,{args:[Mt-Rt,T],material:Ut,position:[ht-.01,pt,-xt+Rt+(Mt-Rt)/2],rotation:[0,vt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Wl}),(Ge||Ee===m)&&(null===(s=Ew.getState().selectedElement)||void 0===s?void 0:s.parentId)===m&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.f,{ref:ct,name:Fm,args:[1e4,1e4],position:[0,T/3,0],rotation:[vt,0,0],onPointerMove:function(e){var t,l=null!==(t=Ew.getState().selectedElement)&&void 0!==t?t:je();if((null===l||void 0===l?void 0:l.parentId)===y.id)if(Ew.getState().moveHandleType){var a=l.type!==V.Polygon?new Me.Vector3(-l.lx/2*b,0,l.lz/2*S):void 0,o=Al(e,ct.current,a),i=(o.relativePointer,o.pointerOnGrid),r=Pl(l),n=jl(i,{elementHalfSize:r,ignorePadding:l.type===V.SolarPanel}),c=2*r[0],s=2*r[1];if(l.type!==V.SolarPanel&&al(l.id,n,c,s),l.type!==V.Polygon){var d,f=!0,h=void 0;if(l.type===V.Window&&l.windowType===Yt.Polygonal)f=ol(n,c,s,h=null!==(d=l.polygonTop)&&void 0!==d?d:Fg);var p=ll(l.id,n,c,s,h);ut.current=f&&p?null:l.id}Hl(l.id,n)}else if(Ew.getState().resizeHandleType){var g=Al(e,ct.current),m=g.relativePointer,w=g.pointerOnGrid,x=Ew.getState().resizeHandleType,v=Ew.getState().resizeAnchor;switch(l.type){case V.Window:var A=l,T=jl(w,{resizeAnchor:v});if(gl(A)){var P=zl(A,T,v),j=P.newLz,H=P.newCz,z=P.newArchHeight,R=new Me.Vector3(A.cx*b,0,H);ll(A.id,R,A.lx*b,j),al(A.id,R,A.lx*b,j),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.lz=j/S,t.cz=H/S,t.archHeight=z,t.cy=t.id===ut.current?-.01:.3,t.tint=t.id===ut.current?"red":A.tint)}))}else if(x===K.Upper){var D=new Me.Vector3(A.cx*b,0,A.cz*S),M=A.lx*b,W=A.lz*S,I=[Tw.clamp((w.x-v.x)/M,-.5,.5),Math.max(0,w.z-v.z)];ll(A.id,D,M,W,I)&&ol(D,M,W,I)||(ut.current=A.id),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.polygonTop=[].concat(I),t.cy=t.id===ut.current?-.01:.3,t.tint=t.id===ut.current?"red":A.tint)}))}else{var C,O=wl(0,T,v),F=O.dimensionXZ,k=O.positionXZ,Y=new Me.Vector3(k.x,0,k.z),L=!0,E=void 0;if(A.windowType===Yt.Polygonal)E=null!==(C=A.polygonTop)&&void 0!==C?C:Fg,L=ol(Y,F.x,F.z,E);ll(A.id,Y,F.x,F.z,E)&&L&&al(A.id,Y,F.x,F.z)||(ut.current=A.id),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.lx=F.x/b,t.lz=F.z/S,t.cx=k.x/b,t.cz=k.z/S,t.cy=t.id===ut.current?-.01:.3,t.tint=t.id===ut.current?"red":A.tint)}))}break;case V.Door:var U=l,N=jl(w,{resizeAnchor:v});if(gl(U)){var J=zl(U,N,v),G=J.newLz,X=J.newCz,B=J.newArchHeight,q=new Me.Vector3(U.cx*b,0,X);ll(U.id,q,U.lx*b,G),al(U.id,q,U.lx*b,G,!0),Pe((function(e){var t=e.elements.find((function(e){return e.id===U.id}));t&&(t.lz=G/S,t.cz=X/S,t.archHeight=B,t.color=t.id===ut.current?wt:l.color)}))}else{var Q=wl(0,N,v),Z=Q.dimensionXZ,_=Q.positionXZ,$=new Me.Vector3(_.x,0,_.z);ll(U.id,$,Z.x,Z.z),al(U.id,$,Z.x,Z.z,!0),Pe((function(e){var t=e.elements.find((function(e){return e.id===U.id}));t&&(t.cx=_.x/b,t.lx=Z.x/b,t.cz=(N.z-S/2)/2/S,t.lz=(N.z+S/2)/S,t.color=t.id===ut.current?wt:l.color)}))}break;case V.SolarPanel:var ee=l,te=Em(ee),le=Object(u.a)(te,2),ae=le[0],oe=le[1];if(x===K.Lower||x===K.Upper){var ie=Math.max(1,Math.round(Math.abs(m.z-v.z)/oe))*oe,re=new Me.Vector3(0,0,m.z-v.z).normalize().multiplyScalar(ie),ne=(new Me.Vector3).addVectors(v,re.clone().divideScalar(2));if(!Tw.isElementInsideWall(ne,ee.lx-.01,ie-.01,Kt))return;ll(ee.id,ne,ee.lx,Math.abs(re.z)),Pe((function(e){var t=e.elements.find((function(e){return e.id===ee.id}));t&&(t.cz=ne.z/S,t.ly=Math.abs(re.z),t.color=t.id===ut.current?"red":"#fff")}))}else if(x===K.Left||x===K.Right){var ce=Math.max(1,Math.round(Math.abs(m.x-v.x)/ae))*ae,se=new Me.Vector3(m.x-v.x,0,0).normalize().multiplyScalar(ce),de=(new Me.Vector3).addVectors(v,se.clone().divideScalar(2));if(!Tw.isElementInsideWall(de,ce-.01,ee.ly-.01,Kt))return;ll(ee.id,de,Math.abs(se.x),ee.ly),Pe((function(e){var t=e.elements.find((function(e){return e.id===ee.id}));t&&(t.cx=de.x/b,t.lx=Math.abs(se.x),t.color=t.id===ut.current?"red":"#fff")}))}break;case V.Polygon:Pe((function(e){var t=e.elements.find((function(e){return e.id===l.id}));(null===t||void 0===t?void 0:t.selectedIndex)>=0&&(t.vertices[t.selectedIndex].x=-w.x/b,t.vertices[t.selectedIndex].y=-w.z/S)}))}}},onPointerUp:function(){if(ut.current)ft.current&&ft.current.status===Mm.SettingEndPoint?(Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null):(Ew.getState().moveHandleType||Ew.getState().resizeHandleType)&&pp.undoInvalidOperation();else if(ft.current){if(ft.current.status===Mm.SettingStartPoint)Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null;else if(ft.current.status===Mm.SettingEndPoint){var e=Ew.getState().elements,t=e[e.length-1];t.lx*b<.1||t.lz*S<.1?Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})):(Pe((function(e){e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type,Yy.selectNone(e))})),fl(t)),ft.current=null}}else Ew.getState().moveHandleType?pp.addUndoableMove():Ew.getState().resizeHandleType&&function(){var e=Ew.getState().selectedElement;if(e){var t=Ew.getState().getElementById(e.id);if(t)switch(t.type){case V.Door:case V.Window:case V.SolarPanel:var l={name:"Resize ".concat(t.type),timestamp:Date.now(),resizedElementId:t.id,resizedElementType:t.type,oldPosition:[e.cx,e.cy,e.cz],oldDimension:[e.lx,e.ly,e.lz],newPosition:[t.cx,t.cy,t.cz],newDimension:[t.lx,t.ly,t.lz],oldArchHeight:e.type===V.Window||e.type===V.Door?e.archHeight:void 0,newArchHeight:t.type===V.Window||t.type===V.Door?t.archHeight:void 0,oldPolygonTop:ul(e)?Object(h.a)(e.polygonTop):void 0,newPolygonTop:ul(t)?Object(h.a)(t.polygonTop):void 0,undo:function(){dl(this.resizedElementId,this.oldPosition,this.oldDimension,this.oldArchHeight,this.oldPolygonTop)},redo:function(){dl(this.resizedElementId,this.newPosition,this.newDimension,this.newArchHeight,this.newPolygonTop)}};ze(l);break;case V.Polygon:var a=e,o=t,i={name:"Edit Polygon",timestamp:Date.now(),oldValue:Object(h.a)(a.vertices),newValue:Object(h.a)(o.vertices),changedElementId:o.id,changedElementType:o.type,undo:function(){We(this.changedElementId,this.oldValue)},redo:function(){We(this.changedElementId,this.newValue)}};ze(i)}}}();Et.getState().setEnableOrbitController(!0),Xe(!1),Pe((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.selectedElement=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))})),ke("showWallIntersectionPlaneId",null),ut.current=null,hl()},visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{color:"blue",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.f,{name:Om,args:[b,S],rotation:[vt,0,0],position:[0,T,0],onPointerMove:function(){},visible:!1})]}),tt.map((function(e){switch(e.type){case V.Window:return Object(gf.jsx)(Yg,Object(d.a)(Object(d.a)({},e),{},{cx:e.cx*b,cy:e.cy*T,cz:e.cz*S,lx:e.lx*b,ly:T,lz:e.lz*S}),e.id);case V.Door:return ne!==Ue.Full?null:Object(gf.jsx)(fm,Object(d.a)(Object(d.a)({},e),{},{cx:e.cx*b,cy:0,cz:e.cz*S,lx:e.lx*b,ly:T,lz:e.lz*S}),e.id);case V.SolarPanel:var t=0;return ot&&y&&(t=ot.rotation[2]+y.relativeAngle),Object(gf.jsx)("group",{position:[0,-e.lz/2,0],children:Object(gf.jsx)(xm,Object(d.a)(Object(d.a)({},e),{},{cx:e.cx*b,cz:e.cz*S,absRotation:t}))},e.id);default:return null}}))]}),tt.map((function(e){return e.type===V.Polygon&&ne!==Ue.Empty?Object(gf.jsx)(Pm,Object(d.a)({},e),e.id):null})),Q===Ne.Stud&&function(){var e=null!==N&&void 0!==N?N:[0,(Dt+Mt)/2],t=Object(u.a)(e,2),l=t[0],a=t[1],o=(l*=b)+ht,i=Math.hypot(o,a-Dt),r=-Math.atan2(a-Dt,o),n=ht-l,c=Math.hypot(n,Mt-a),s=-Math.atan2(Mt-a,n);return Object(gf.jsxs)("group",{name:"wall stud group ".concat(m),children:[qt.map((function(e,t){var o,i=Object(u.a)(e,2),r=i[0],n=i[1];return o=rl!=s>l&&t<(c-r)*(l-n)/(s-n)+r&&(a=!a)}return a}},{key:"isRoofValid",value:function(t,l,a,o,i,r){var n,c=Object(f.a)(Ew.getState().elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Wall&&s.roofId===t){var d=s,u=[];if(d.id===l)u=e.getWallPoints2D(d,o,i,r);else if(d.id===a){var h=void 0,p=void 0,y=void 0;o&&(h=[-o[0],o[1]]),r&&(p=[-r[0],r[1]]),i&&(y=[-i[0],i[1]]),u=e.getWallPoints2D(d,h,p,y)}if(d.id===l||d.id===a){var g,m=Object(f.a)(Ew.getState().elements);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.parentId===d.id){var x=w.lx/2,v=w.lz/2,b=km;w.type===V.SolarPanel&&(x=(x-.01)/d.lx,v=(w.ly/2-.01)/d.lz,b=0);var A=w.cx*d.lx-x*d.lx,T=w.cx*d.lx+x*d.lx,P=w.cz*d.lz+v*d.lz+b;if(!e.isPointInside(u,A,P)||!e.isPointInside(u,T,P))return!1}}}catch(S){m.e(S)}finally{m.f()}}}}}catch(S){c.e(S)}finally{c.f()}return!0}},{key:"getSegmentIdx",value:function(e,t){for(var l=0;li.z){var d=[n,r,o];return Tw.isPointInside(l.x,l.y,d.map(Tw.mapVector3ToPoint2))?[o,r,n]:[o,i,r]}var f=[n,r,i];return Tw.isPointInside(l.x,l.y,f.map(Tw.mapVector3ToPoint2))?[i,r,n]:[i,n,o]}if(c<=s){var h=[n,r,i];return Tw.isPointInside(l.x,l.y,h.map(Tw.mapVector3ToPoint2))?[i,r,n]:[i,n,o]}var p=[n,r,o];return Tw.isPointInside(l.x,l.y,p.map(Tw.mapVector3ToPoint2))?[o,r,n]:[o,i,r]}},{key:"getSegmentNormal",value:function(e){var t=Object(u.a)(e,3),l=t[0],a=t[1],o=t[2];return(new Me.Vector3).crossVectors((new Me.Vector3).subVectors(l,a),(new Me.Vector3).subVectors(l,o)).normalize()}},{key:"getRotationFromNormal",value:function(e){return Tw.isSame(e.normalize(),Rt)?[0,0,0]:[Math.PI/2-Math.atan2(e.z,Math.hypot(e.x,e.y)),0,Math.atan2(e.y,e.x)+Math.PI/2]}},{key:"getRooftopElementZ",value:function(e,t,l){var a=Object(u.a)(e,3),o=a[0],i=a[1],r=a[2],n=(i.y-o.y)*(r.z-o.z)-(i.z-o.z)*(r.y-o.y),c=(i.z-o.z)*(r.x-o.x)-(i.x-o.x)*(r.z-o.z),s=(i.x-o.x)*(r.y-o.y)-(i.y-o.y)*(r.x-o.x);return-(-(n*o.x+c*o.y+s*o.z)+n*t.x+c*t.y)/s+l}},{key:"computeState",value:function(t,l,a){var o=e.getSegmentIdx(t,l);if(a)return{segmentIdx:-1,segmentVertices:null,normal:new Me.Vector3(0,0,1),rotation:[0,0,0]};if(-1!==o){var i=e.getSegmentVertices(t,o,l),r=e.getSegmentNormal(i);return{segmentIdx:o,segmentVertices:i,normal:r,rotation:e.getRotationFromNormal(r)}}return{segmentIdx:-1,segmentVertices:null,normal:new Me.Vector3(0,0,1),rotation:[0,0,0]}}},{key:"getOrderedWallArrayOfRoof",value:function(e){var t,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;o.type===V.Wall&&o.roofId===e&&l.set(o.id,o)}}catch(d){a.e(d)}finally{a.f()}if(0===l.size)return{orderedWallArray:[],isLoop:!1};for(var i=l.entries().next().value[1],r=[i],n=i.rightJoints[0];n&&n!==i.id;){var c=l.get(n);if(!c)break;r.push(c),n=c.rightJoints[0]}if(n===i.id)return{orderedWallArray:r,isLoop:!0};for(n=i.leftJoints[0];n;){var s=l.get(n);if(!s)break;r.unshift(s),n=s.leftJoints[0]}return{orderedWallArray:r,isLoop:!1}}},{key:"getRoofBoundaryVertices",value:function(e){var t=Pf.getState().roofSegmentVerticesMap.get(e.id);if(!t)throw new Error;if(e.roofType!==It.Gable&&e.rise<.01)return t[0].map((function(e){return{x:e.x,y:e.y}}));switch(e.roofType){case It.Gable:return 1===t.length?t[0].map((function(e){return{x:e.x,y:e.y}})):t.reduce((function(e,t){return e.push({x:t[0].x,y:t[0].y},{x:t[1].x,y:t[1].y}),e}),[]);case It.Gambrel:return t.reduce((function(e,t,l){return 0!==l&&3!==l||e.push({x:t[0].x,y:t[0].y},{x:t[1].x,y:t[1].y}),e}),[]);case It.Mansard:return t.reduce((function(e,l,a){return a!==t.length-1&&e.push({x:l[0].x,y:l[0].y}),e}),[]);default:return t.reduce((function(e,t,l){return e.push({x:t[0].x,y:t[0].y}),e}),[])}}},{key:"getAbsoluteWindowVerticesOnRoof",value:function(e,t){var l=[],a=new Me.Vector3(e.cx,e.cy,e.cz),o=new Me.Vector3(t.cx,t.cy,t.lz);if(e.windowType===Yt.Arched){for(var i=Math.min(e.archHeight,e.lx/2,e.lz),r=-1;r<=1;r+=2)for(var n=-1;n<=1;n+=2){var c=r*n>0?new Me.Vector3(e.lx/2*r,(e.lz/2-i)*n*r,0):new Me.Vector3(e.lx/2*r,e.lz/2*n*r,0);c.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),c.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(c)}var s=new Me.Vector3(0,e.lz/2,0);s.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),s.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(s)}else{for(var d=-1;d<=1;d+=2)for(var u=-1;u<=1;u+=2){var f=new Me.Vector3(e.lx/2*d,e.lz/2*u*d,0);f.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),f.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(f)}if(e.windowType===Yt.Polygonal&&e.polygonTop){var h=new Me.Vector3(e.lx*e.polygonTop[0],e.lz/2+e.polygonTop[1],0);h.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),h.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(h)}}return l}},{key:"getRelativeWindowVerticesOnRoof",value:function(e){var t=[],l=new Me.Vector3(e.cx,e.cy,e.cz);if(e.windowType===Yt.Arched){for(var a=Math.min(e.archHeight,e.lx/2,e.lz),o=-1;o<=1;o+=2)for(var i=-1;i<=1;i+=2){var r=o*i>0?new Me.Vector3(e.lx/2*o,(e.lz/2-a)*i*o,0):new Me.Vector3(e.lx/2*o,e.lz/2*i*o,0);r.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(r)}var n=new Me.Vector3(0,e.lz/2,0);n.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(n)}else{for(var c=-1;c<=1;c+=2)for(var s=-1;s<=1;s+=2){var d=new Me.Vector3(e.lx/2*c,e.lz/2*s*c,0);d.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(d)}if(e.windowType===Yt.Polygonal&&e.polygonTop){var u=new Me.Vector3(e.lx*e.polygonTop[0],e.lz/2+e.polygonTop[1],0);u.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(u)}}return t}},{key:"getAbsoluteSolarPanelVerticesOnRoof",value:function(e,t){for(var l=[],a=new Me.Vector3(e.cx*t.lx,e.cy*t.ly,e.cz),o=new Me.Vector3(t.cx,t.cy,t.lz),i=-1;i<=1;i+=2)for(var r=-1;r<=1;r+=2){var n=new Me.Vector3(e.lx/2*i,e.ly/2*r*i,0);0===e.rotation[0]?n.applyEuler(new Me.Euler(e.tiltAngle,0,e.relativeAzimuth,"ZXY")).add(a):n.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),n.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(n)}return l}},{key:"getSolarPanelVerticesOnRoof",value:function(e,t){for(var l=[],a=new Me.Vector3(e.cx*t.lx,e.cy*t.ly,e.cz+t.lz),o=-1;o<=1;o+=2)for(var i=-1;i<=1;i+=2){var r=new Me.Vector3(e.lx/2*o,e.ly/2*i*o,0);0===e.rotation[0]?r.applyEuler(new Me.Euler(e.tiltAngle,0,e.relativeAzimuth,"ZXY")).add(a):r.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),l.push(r)}return l}},{key:"getWindowVerticesOnRoof",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,l=[],a=new Me.Vector3(e.cx,e.cy,e.cz),o=e.lx/2+t,i=e.lz/2+t,r=-1;r<=1;r+=2)for(var n=-1;n<=1;n+=2){var c=new Me.Vector3(r*o,r*n*i);c.applyEuler((new Me.Euler).fromArray([].concat(Object(h.a)(e.rotation),["ZXY"]))).add(a),l.push(c)}if(e.windowType===Yt.Polygonal){var s,d=null!==(s=e.polygonTop)&&void 0!==s?s:Fg,f=Object(u.a)(d,2),p=f[0],y=f[1],g=new Me.Vector3(p*e.lx,e.lz+y).add(a);l.push(g)}return l}},{key:"rooftopElementBoundaryCheck",value:function(e,t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(!Tw.isPointInside(o.x,o.y,t))return!1}}catch(i){a.e(i)}finally{a.f()}return!0}},{key:"rooftopWindowCollisionCheck",value:function(t,l,a){var o,i=[],r=Object(f.a)(Ew.getState().elements);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.parentId===a&&n.id!==t){var c=e.getWindowVerticesOnRoof(n);i.push(c)}}}catch(x){r.e(x)}finally{r.f()}for(var s=0,d=i;s0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(s((function(e){e.hoveredHandle=l;var a=d(t);a&&(e.selectedElementAngle=a.rotation[2],e.selectedElementHeight=a.lz)})),Tw.isMoveHandle(l)?v.domElement.style.cursor="move":l===q.Upper||l===q.Lower?v.domElement.style.cursor="grab":v.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"pointer")}),[]),k=Object(r.useCallback)((function(){s((function(e){e.hoveredHandle=null})),v.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"default"}),[]),Y=function e(t){var l=d(t);if(!l)return 0;var a=l.rotation[2];return l.parentId===xt?a:a+e(l.parentId)},L=function(e){switch(e){case V.Human:case V.Flower:case V.Tree:return!0}return!1};return Object(gf.jsxs)(gf.Fragment,{children:[I&&Object(gf.jsx)(Lt.f,{name:"Cuboid Intersection Plane",ref:D,args:[1e4,1e4],position:m.position,rotation:m.rotation,visible:!1,onPointerMove:function(e){if(D.current){var l=b.intersectObject(D.current);if(l.length){var a=l[0].point,o=Ew.getState().resizeHandleType;o?Tw.isTopResizeHandle(o)?function(e){if(null!==T.current){var l=Math.max(1,e.z-T.current);s((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&(i.lz=l,i.cz=l/2,e.selectedElementHeight=l),i.parentId===t&&L(i.type)){var r=R.current.get(i.id);r&&r[0]===Gm.Top&&(i.cz=l/2)}}}catch(n){o.e(n)}finally{o.f()}}))}}(a):Tw.isXResizeHandle(o)?function(e){s((function(l){var a,o=l.elements.find((function(e){return e.id===t}));if(o){var i=e.clone().setZ(0),r=Ew.getState().resizeAnchor.clone().setZ(0),n=(new Me.Vector3).subVectors(i,r).applyEuler(new Me.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new Me.Vector3).addVectors(i,r).multiplyScalar(.5),s=Tw.getWorldDataById(o.parentId),d=s.pos,h=s.rot,p=(new Me.Vector3).subVectors(c,d).applyEuler(new Me.Euler(0,0,-h));o.cx=p.x;var y=Math.abs(n.x);o.lx=y;var g=new Me.Vector3(p.x,p.y,o.cz).applyEuler(new Me.Euler(0,0,h)).add(d),m=o.rotation[2]+h;if(z.current.size>0){var w,x=Object(f.a)(l.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value,b=z.current.get(v.id);if(b){var A=b.clone().sub(g).applyEuler(new Me.Euler(0,0,-m));if(L(v.type)){var T=R.current.get(v.id);if(T){var P=Object(u.a)(T,2),j=P[0],H=P[1];j===Gm.Top||j===Gm.NS?v.cx=A.x:j===Gm.EW&&(v.cx=Math.sign(H)*(y/2))}}else v.type===V.Cuboid?v.cx=A.x:v.cx=A.x/y}}}catch(D){x.e(D)}finally{x.f()}}}}))}(a):Tw.isYResizeHandle(o)?function(e){s((function(l){var a,o=l.elements.find((function(e){return e.id===t}));if(o){var i=e.clone().setZ(0),r=Ew.getState().resizeAnchor.clone().setZ(0),n=(new Me.Vector3).subVectors(i,r).applyEuler(new Me.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new Me.Vector3).addVectors(i,r).multiplyScalar(.5),s=Tw.getWorldDataById(o.parentId),d=s.pos,h=s.rot,p=(new Me.Vector3).subVectors(c,d).applyEuler(new Me.Euler(0,0,-h));o.cy=p.y;var y=Math.abs(n.y);o.ly=y;var g=new Me.Vector3(p.x,p.y,o.cz).applyEuler(new Me.Euler(0,0,h)).add(d),m=o.rotation[2]+h;if(z.current.size>0){var w,x=Object(f.a)(l.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value,b=z.current.get(v.id);if(b){var A=b.clone().sub(g).applyEuler(new Me.Euler(0,0,-m));if(L(v.type)){var T=R.current.get(v.id);if(T){var P=Object(u.a)(T,2),j=P[0],H=P[1];j===Gm.Top?v.cy=A.y:j===Gm.NS?v.cy=Math.sign(H)*(y/2):j===Gm.EW&&(v.cy=A.y)}}else v.type===V.Cuboid?v.cy=A.y:v.cy=A.y/y}}}catch(D){x.e(D)}finally{x.f()}}}}))}(a):function(e){s((function(l){var a,o=l.elements.find((function(e){return e.id===t}));if(o){var i=e.clone().setZ(0),r=Ew.getState().resizeAnchor.clone().setZ(0),n=(new Me.Vector3).subVectors(i,r).applyEuler(new Me.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new Me.Vector3).addVectors(i,r).multiplyScalar(.5),s=Tw.getWorldDataById(o.parentId),d=s.pos,h=s.rot,p=(new Me.Vector3).subVectors(c,d).applyEuler(new Me.Euler(0,0,-h));o.cx=p.x,o.cy=p.y;var y=Math.abs(n.x),g=Math.abs(n.y);o.lx=y,o.ly=g;var m=new Me.Vector3(p.x,p.y,o.cz).applyEuler(new Me.Euler(0,0,h)).add(d),w=o.rotation[2]+h;if(z.current.size>0){var x,v=Object(f.a)(l.elements);try{for(v.s();!(x=v.n()).done;){var b=x.value,A=z.current.get(b.id);if(A){var T=A.clone().sub(m).applyEuler(new Me.Euler(0,0,-w));if(L(b.type)){var P=R.current.get(b.id);if(P){var j=Object(u.a)(P,2),H=j[0],D=j[1];H===Gm.Top?(b.cx=T.x,b.cy=T.y):H===Gm.NS?(b.cx=T.x,b.cy=Math.sign(D)*(g/2)):H===Gm.EW&&(b.cx=Math.sign(D)*(y/2),b.cy=T.y)}}else b.type===V.Cuboid?(b.cx=T.x,b.cy=T.y):(b.cx=T.x/y,b.cy=T.y/g)}}}catch(M){v.e(M)}finally{v.f()}}}}))}(a):Ew.getState().rotateHandleType&&function(e){if(P.current){var l=Object(u.a)(P.current,2),a=l[0],o=l[1],i=Math.atan2(a-e.x,e.y-o)+(Ew.getState().rotateHandleType===q.Upper?0:Math.PI),r=Math.abs(i)>Math.PI?-Math.sign(i)*bt:0;j.current&&(i-=j.current),Ew.getState().updateElementRotationById(t,0,0,i+r)}}(a)}}},onPointerUp:function(){w(null),T.current=null,P.current=null,S.current=null,j.current=null,H.current=null}}),Object(gf.jsxs)("group",{name:"Bottom Resize Handle Group",position:[0,0,A/2-c],onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].object.name===e.object.name||Ew.getState().addedCuboidId){var l=d(t);if(l&&l.parentId!==xt){w({position:new Me.Vector3(0,0,-c),rotation:new Me.Euler});var a=Tw.getWorldDataById(l.parentId),o=a.pos,r=a.rot;H.current=o,j.current=r,S.current=r+l.rotation[2];var n=new Me.Vector3(l.cx,l.cy,l.cz).applyEuler(new Me.Euler(0,0,r)).add(o),u=Ew.getState().elements.filter((function(e){return e.parentId===l.id&&(t=e.type,L(t)||t===V.Cuboid||Tw.isIdentical(e.normal,[0,0,1]));var t}));z.current.clear(),R.current.clear();var h,p=Object(f.a)(u);try{for(p.s();!(h=p.n()).done;){var y=h.value,g=new Me.Vector3;L(y.type)?(g.set(y.cx,y.cy,y.cz),Math.abs(y.cz-c)<.01?R.current.set(y.id,[Gm.Top,1]):Math.abs(Math.abs(y.cx)-i)<.01?R.current.set(y.id,[Gm.EW,Math.sign(y.cx)]):R.current.set(y.id,[Gm.NS,Math.sign(y.cy)])):y.type===V.Cuboid?g.set(y.cx,y.cy,y.cz):g.set(y.cx*l.lx,y.cy*l.ly,0),g.applyEuler(new Me.Euler(0,0,S.current)).add(n),z.current.set(y.id,g)}}catch(m){p.e(m)}finally{p.f()}}s((function(e){var l;e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t),e.selectedElement=null!==(l=e.elements.find((function(e){return e.id===t})))&&void 0!==l?l:null}))}},children:[Object(gf.jsx)(aw,{handleType:K.UpperLeft,position:[-i,n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.UpperRight,position:[i,n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.LowerLeft,position:[-i,-n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.LowerRight,position:[i,-n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.Left,position:[-i,0,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.Right,position:[i,0,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.Upper,position:[0,n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.Lower,position:[0,-n,0],size:A,onPointerOver:F,onPointerOut:k})]}),C&&Object(gf.jsxs)("group",{name:"Cuboid Top Resize Handle Group",onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].object.name===e.object.name){var l=e.intersections[0].object,a=Ew.getState().cameraDirection,o=Math.atan2(a.x,a.y)+Y(t);w({position:l.position.clone(),rotation:new Me.Euler(-vt,o,0)});var i=l.localToWorld(new Me.Vector3);T.current=i.z-2*c;var r=Ew.getState().elements.filter((function(e){return e.parentId===t&&L(e.type)}));R.current.clear();var n,d=Object(f.a)(r);try{for(d.s();!(n=d.n()).done;){var u=n.value;(new Me.Vector3).set(u.cx,u.cy,u.cz),Math.abs(u.cz-c)<.01&&R.current.set(u.id,[Gm.Top,1])}}catch(h){d.e(h)}finally{d.f()}s((function(e){var l;e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t),e.selectedElement=null!==(l=e.elements.find((function(e){return e.id===t})))&&void 0!==l?l:null}))}},children:[Object(gf.jsx)(aw,{handleType:K.LowerLeftTop,position:[-i,-n,c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.UpperLeftTop,position:[-i,n,c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.LowerRightTop,position:[i,-n,c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.UpperRightTop,position:[i,n,c],size:A,onPointerOver:F,onPointerOut:k})]}),O&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Cuboid Move Handle Group",onPointerDown:function(e){if(e.intersections.length>0){var l=e.intersections[0].eventObject.name;switch(l){case B.Lower:case B.Upper:case B.Left:case B.Right:case B.Top:Ew.getState().set((function(e){var a,o=null!==(a=e.elements.find((function(e){return e.id===t})))&&void 0!==a?a:null;if(o){if(e.selectedElement=o,o.parentId===xt){var i,r=Object(f.a)(e.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;e.selectedElementIdSet.has(n.id)&&!Tw.isElementAllowedMultipleMoveOnGround(n)&&e.selectedElementIdSet.delete(n.id)}}catch(c){r.e(c)}finally{r.f()}}else e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(o.id);e.moveHandleType=l}})),Et.getState().setEnableOrbitController(!1)}}},children:[Object(gf.jsx)(lw,{handleType:B.Lower,position:[0,-n-1.2*A,-c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(lw,{handleType:B.Upper,position:[0,n+1.2*A,-c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(lw,{handleType:B.Left,position:[-i-1.2*A,0,-c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(lw,{handleType:B.Right,position:[i+1.2*A,0,-c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(lw,{handleType:B.Top,position:[0,0,c],size:A,onPointerOver:F,onPointerOut:k})]}),Object(gf.jsxs)("group",{name:"Cuboid Rotate Handle Group",onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].object.name===e.object.name){w({position:new Me.Vector3(0,0,-c),rotation:new Me.Euler(0,0,0)});var l=e.eventObject;P.current=l.localToWorld(new Me.Vector3).toArray();var a=d(t);a&&(j.current=Y(a.parentId))}},children:[Object(gf.jsx)(oy,{id:t,handleType:q.Lower,position:M,ratio:4*A,hoverHandle:F,noHoverHandle:k}),Object(gf.jsx)(oy,{id:t,position:W,handleType:q.Upper,ratio:4*A,hoverHandle:F,noHoverHandle:k})]})]})]})},iw=n.a.memo(ow),rw="Handle Group Move & Resize",nw=function(e){var t=e.id,l=e.parentId,a=e.cx,o=e.cy,n=e.cz,c=e.lx,s=e.ly,d=e.lz,f=e.normal,h=e.locked,p=e.trackerType,y=e.tiltAngle,g=e.relativeAzimuth,m=e.poleHeight,w=e.poleRadius,x=e.poleSpacing,v=e.color,b=void 0===v?"white":v,A=_f(t),T=uw(f),P=s/2,S=T?m:0,j=Math.max(1,(c+s)/16),H=2*j/3,z=2*j/3,R=-m/2-d/2,D=Ew(si),M=Ew(lc),W=Ew(Sr),I=Ew(i.date),C=Ew(i.latitude),O=Object(Se.f)(),F=O.gl.domElement,k=O.camera,Y=O.raycaster,L=O.mouse,E=Object(r.useState)(null),U=Object(u.a)(E,2),N=U[0],J=U[1],G=Object(r.useState)(!1),X=Object(u.a)(G,2),K=X[0],Q=X[1],Z=Object(r.useRef)(!1),_=Object(r.useRef)(0),$=Object(r.useRef)(0),ee=(Object(r.useRef)(null),Object(r.useRef)(null)),le=Object(r.useRef)(),ae=Object(r.useMemo)((function(){return new Array(13).fill(0)}),[]),oe=Object(r.useMemo)((function(){return new Date(I)}),[I]),ie=Object(r.useMemo)((function(){for(var e=[],t=Math.floor(.5*c/x),l=Math.floor(.5*s*Math.abs(Math.cos(y))/x),a=.5*Math.sin(y),o=Math.cos(g)*x,i=Math.sin(g)*x,r=-t;r<=t;r++)for(var n=-l;n<=l;n++){var d=r*o-n*i,u=r*i+n*o;e.push(new Me.Vector3(d,u,R+a*x*n))}return e}),[g,y,x,c,s,R]),re=Object(r.useMemo)((function(){return dw(f)}),[f]),ne=Object(r.useMemo)((function(){if(T){if(p===te.NO_TRACKER)return new Me.Euler(y,0,g,"ZXY");var e=jy(oe,C),t=fw(l,re.z)-re.z;switch(p){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var a=Math.hypot(e.x,e.y);return new Me.Euler(Math.atan2(a,e.z),0,Math.atan2(e.y,e.x)+vt-t,"ZXY");case te.HORIZONTAL_SINGLE_AXIS_TRACKER:return new Me.Euler(0,Math.atan2(e.x,e.z),-t+(c.1,de=S>0&&T;Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),Z.current=!1,Q(!1),D((function(e){e.rotateHandleType=null,e.moveHandleType=null,e.resizeHandleType=null}))};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var ue=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(J(t),t===B.Top?F.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?F.style.cursor="grab":F.style.cursor="pointer"))},fe=function(){J(null),F.style.cursor="default"},he=function(e){return N===e||Ew.getState().rotateHandleType===e?pt:ht};return Object(gf.jsxs)("group",{name:"Solar Panel Group",position:[a,o,S+n],rotation:re,children:[Object(gf.jsx)(cw,{solarPanelModel:e,groupRotation:re,panelRotation:ne}),ce&&Object(gf.jsxs)("group",{position:[0,0,-S],rotation:[0,0,ne.z],children:[Object(gf.jsx)(oy,{id:t,position:[0,-P-H/2,S],color:he(q.Upper),ratio:H,handleType:q.Upper,hoverHandle:ue,noHoverHandle:fe}),Object(gf.jsx)(oy,{id:t,position:[0,P+H/2,S],color:he(q.Lower),ratio:H,handleType:q.Lower,hoverHandle:ue,noHoverHandle:fe})]}),se&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{name:q.Tilt,args:[z,1.1*z,18,2,-vt,Math.PI],rotation:[0,-vt,ne.z,"ZXY"],onPointerOver:function(e){ue(e,q.Tilt)},onPointerOut:function(e){fe()},onPointerDown:function(e){if(Q(!0),N){Et.getState().setEnableOrbitController(!1),Z.current=!0,_.current=y;var t=Tw.getWorldDataById(l).rot;ee.current=t}D((function(e){e.rotateHandleType=q.Tilt}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide,color:N===q.Tilt||K?pt:ht})}),K&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{ref:le,name:"Solar panel tilt handle",args:[z,2*z,18,2,-vt,Math.PI],rotation:[0,-vt,ne.z,"ZXY"],onPointerUp:function(e){if(Math.abs($.current-_.current)>At){var l={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:_.current,newValue:$.current,changedElementId:t,changedElementType:V.SolarPanel,undo:function(){M(l.changedElementId,l.oldValue)},redo:function(){M(l.changedElementId,l.newValue)}};W(l)}},onPointerMove:function(e){if(Z.current&&(Y.setFromCamera(L,k),le.current)){var l=Y.intersectObjects([le.current]);if(l.length>0){var a=l[0].point,o=le.current.parent;if(o){var i=o.localToWorld(new Me.Vector3),r=(new Me.Vector3).subVectors(a,i),n=r.angleTo(Rt);if(!(.5*s*Math.abs(Math.sin(n))>S)){var c,d=g+(null!==(c=ee.current)&&void 0!==c?c:0),u=d%Math.PI===0?Math.sign(-r.y)*Math.sign(Math.cos(d)):Math.sign(r.x)*Math.sign(Math.sin(d));M(t,n*=u),$.current=n}}}}},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:Me.DoubleSide})}),Object(gf.jsx)(Jl.a,{points:[[0,0,z],[0,0,1.75*z]],rotation:new Me.Euler(y,0,ne.z,"ZXY"),lineWidth:1}),ae.map((function(e,t){return Object(gf.jsxs)("group",{rotation:new Me.Euler(Math.PI/12*t-vt,0,ne.z,"ZXY"),children:[Object(gf.jsx)(Jl.a,{points:[[0,0,1.8*z],[0,0,2*z]],color:"white",transparent:!0,opacity:.5}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(15*t-90,"\xb0"),fontSize:20*z,fontFace:"Times Roman",textHeight:.15*z,position:[0,0,1.6*z]})]},t)})),Object(gf.jsx)("group",{rotation:new Me.Euler(y,0,ne.z,"ZXY"),children:Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(Math.floor(y/Math.PI*180),"\xb0"),fontSize:20*z,fontFace:"Times Roman",textHeight:.2*z,position:[0,0,.75*z]})})]})]}),de&&ie.map((function(e,t){return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[w,w,m+2*(e.z-R)+d,4,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:b})},t)}))]})},cw=function(e){var t,l,a,n,c,s=e.solarPanelModel,d=e.groupRotation,f=e.panelRotation,h=s.id,p=s.parentId,y=s.lx,g=s.ly,m=s.lz,w=s.cx,x=s.cy,v=s.cz,b=s.normal,A=s.tiltAngle,T=s.relativeAzimuth,P=s.trackerType,S=s.drawSunBeam,j=s.locked,H=s.showLabel,z=s.label,R=s.pvModelName,D=s.orientation,M=s.frameColor,W=s.backsheetColor,I=s.color,C=s.poleHeight,O=_f(h),F=Ew(si),k=Ew(is),Y=Ew(i.date),L=Ew(i.latitude),E=Ew(Ru),U=Ew(Vi),N=Tf(Ns),J=Ew(Yi),G=Ew(o.solarPanelShininess),Q=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,Z=Object(r.useMemo)((function(){return{lng:U}}),[U]),_=uw(b),ee=_?A:0,le=_?T:0,ae=Math.max(1,(y+g)/16),oe=dt*ae*1.5,ie=st*ae*2,re=[y,g,m].map((function(e){return e/2})),ne=Object(u.a)(re,3),ce=ne[0],se=ne[1],de=ne[2],ue=[oe,oe,1.2*m],fe=J[R];fe&&(m=Math.max(fe.thickness,.02));var he=Object(r.useMemo)((function(){return new Date(Y)}),[Y]),pe=Object(r.useMemo)((function(){return(z||me.t("shared.SolarPanelElement",Z))+(j?" ("+me.t("shared.ElementLocked",Z)+")":"")+(z?"":"\n"+me.t("word.Coordinates",Z)+": ("+w.toFixed(1)+", "+x.toFixed(1)+", "+v.toFixed(1)+") "+me.t("word.MeterAbbreviation",Z))}),[z,j,U,w,x,v]),ye=Object(r.useMemo)((function(){var e=[];if(fe){var t,l;D===$.portrait?(t=Math.max(1,Math.round(y/fe.width)),l=Math.max(1,Math.round(g/fe.length))):(t=Math.max(1,Math.round(y/fe.length)),l=Math.max(1,Math.round(g/fe.width)));for(var a=y/t,o=g/l,i=0;i<=t;i++)e.push({points:[new Me.Vector3(i*a-ce,-se,m),new Me.Vector3(i*a-ce,se,m)]});for(var r=0;r<=l;r++)e.push({points:[new Me.Vector3(-ce,r*o-se,m),new Me.Vector3(ce,r*o-se,m)]})}return e}),[fe,D,R,y,g,m]),ge=Object(r.useState)(Oe()),we=Object(u.a)(ge,2),xe=we[0],ve=we[1],be=Object(r.useState)(!1),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],je=Object(r.useState)(null),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De=Object(r.useRef)(null),We=Object(Se.f)().gl,Ie=Uy(y,g,fe,D,M,W),Ce=Ey(h);function Oe(){var e=new Me.Euler,t=fw(p,d.z);return P===te.NO_TRACKER?e.set(-d.x-ee,0,-t-le):e.set(-d.x-f.x,-f.y,-t-f.z),jy(he,L).applyEuler(e)}function Fe(e){return ze===e||E===e?pt:ht}function ke(e,t){Et.getState().setEnableOrbitController(!1),F((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(t)}))}return Object(Se.d)((function(){var e=Oe();e.equals(xe)||ve(e)})),Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Solar Panel Box Group",rotation:f,children:[Object(gf.jsxs)(Lt.a,{uuid:h,ref:De,args:[y,g,m],position:[0,0,de],onPointerDown:function(e){2!==e.button&&k(h,e,X.Select)},onContextMenu:function(e){k(h,e,X.ContextMenu),F((function(t){e.intersections.length>0&&(e.intersections[0].object===De.current&&(t.contextMenuObjectType=V.SolarPanel))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===De.current&&(Pe(!0),We.domElement.style.cursor="move"))},onPointerOut:function(e){Pe(!1),We.domElement.style.cursor="default"},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),N&&Ce?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:Ce}):Ie?Q||0===G?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",map:Ie,color:I}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===fe||void 0===fe?void 0:fe.color)?at:ot),shininess:null!==G&&void 0!==G?G:tt,side:Me.FrontSide,map:Ie,color:I}):Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:I}),0===(null===fe||void 0===fe?void 0:fe.bifacialityFactor)||Q||0===C&&0===A?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:I}):Ie?Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===fe||void 0===fe?void 0:fe.color)?at:ot),shininess:null!==G&&void 0!==G?G:tt,side:Me.FrontSide,map:Ie,color:I}):null]}),O&&!j&&Object(gf.jsxs)("group",{name:rw,onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].eventObject.name===rw){var t=e.object.name;switch(t){case B.Default:Et.getState().setEnableOrbitController(!1),F((function(e){e.moveHandleType=t,e.selectedElement=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))}));break;case K.Left:var l=e.object.localToWorld(new Me.Vector3(y,0,0));ke(t,l);break;case K.Right:var a=e.object.localToWorld(new Me.Vector3(-y,0,0));ke(t,a);break;case K.Lower:var o=e.object.localToWorld(new Me.Vector3(0,g,0));ke(t,o);break;case K.Upper:var i=e.object.localToWorld(new Me.Vector3(0,-g,0));ke(t,i)}}},onPointerOver:function(e){if(e.intersections.length>0&&e.eventObject.name.includes(rw)){var t=e.object.name;Re(t),t===B.Top?We.domElement.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?We.domElement.style.cursor="grab":We.domElement.style.cursor="pointer"}},onPointerOut:function(){Re(null),We.domElement.style.cursor="default"},children:[Object(gf.jsx)(Lt.h,{args:[ie,6,6],name:B.Default,children:Object(gf.jsx)("meshBasicMaterial",{color:"orange"})}),Object(gf.jsx)(Lt.a,{position:[0,-se,de],args:ue,name:K.Lower,children:Object(gf.jsx)("meshBasicMaterial",{color:Fe(K.Lower)})}),Object(gf.jsx)(Lt.a,{position:[0,se,de],args:ue,name:K.Upper,children:Object(gf.jsx)("meshBasicMaterial",{color:Fe(K.Upper)})}),Object(gf.jsx)(Lt.a,{position:[-ce,0,de],args:ue,name:K.Left,children:Object(gf.jsx)("meshBasicMaterial",{color:Fe(K.Left)})}),Object(gf.jsx)(Lt.a,{position:[ce,0,de],args:ue,name:K.Right,children:Object(gf.jsx)("meshBasicMaterial",{color:Fe(K.Right)})})]}),S&&xe.z>0&&Object(gf.jsx)(sw,{sunDirection:xe}),N&&Ce&&ye.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(gf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:h,args:[y,g],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),O&&j&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-ce,-se,0],[-ce,se,0],[ce,se,0],[ce,-se,0],[-ce,-se,0]],castShadow:!1,receiveShadow:!1,lineWidth:2,color:yt})]}),(Te||H)&&!O&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:pe,color:null!==(l=s.labelColor)&&void 0!==l?l:"white",fontSize:null!==(a=s.labelFontSize)&&void 0!==a?a:20,textHeight:null!==(n=s.labelSize)&&void 0!==n?n:.2,position:[0,0,null!==(c=s.labelHeight)&&void 0!==c?c:Math.max(se*Math.abs(Math.sin(A))+.1,.2)]})]})},sw=n.a.memo((function(e){var t=e.sunDirection,l=Ew(Kr),a=Object(r.useMemo)((function(){return Math.max(100,10*l)}),[l]);return Object(gf.jsxs)("group",{name:"Sun Beam Group",children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[Rt.clone().multiplyScalar(.75),[0,0,0],t.clone().multiplyScalar(a)],name:"Sun Beam",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[t.clone().multiplyScalar(.5),Rt.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Tw.toDegrees(t.angleTo(Rt)).toFixed(1)+"\xb0",fontSize:20,fontFace:"Times Roman",textHeight:.1,position:t.clone().multiplyScalar(.75).add(Rt.clone().multiplyScalar(.75)).multiplyScalar(.5)}),Object(gf.jsx)("group",{position:Rt.clone().multiplyScalar(.75),rotation:[vt,0,0],children:Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})}));function dw(e){var t=Object(u.a)(e,3),l=t[0],a=t[1];return 1===t[2]?new Me.Euler(0,0,0):0!==l?new Me.Euler(vt,0,l*vt,"ZXY"):0!==a?new Me.Euler(-a*vt,0,0):new Me.Euler}function uw(e){return Math.abs(e[2]-1)<.01}function fw(e,t){return Tw.getWorldDataById(e).rot+t}var hw=n.a.memo(nw),pw=function(e){var t,l,a,i,n,c,s=e.id,p=e.cx,y=e.cy,g=e.lx,m=void 0===g?1:g,w=e.ly,x=void 0===w?1:w,v=e.lz,b=void 0===v?1:v,A=e.color,T=void 0===A?"silver":A,P=e.lineColor,S=void 0===P?"black":P,j=e.lineWidth,H=void 0===j?.1:j,z=e.locked,R=void 0!==z&&z,D=e.showLabel,M=void 0!==D&&D,W=e.textureTypes,I=void 0===W?[de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture]:W,C=e.stackable,O=_f(s),F=Ew(si),k=Ew(Vi),Y=Ew(o.orthographic),L=Ew(Zr),E=Ew(on),U=Ew(ns),N=Ew(qc),J=Ew(An),G=Ew(Sn),Q=Ew(cn),Z=Ew(sn),_=Ew(dn),ee=Ew(is),te=Ew(rc),le=Ew(Ei),ae=Ew(o.shadowEnabled),oe=Ew(Sr),ie=Ew(Iu),re=Ew(qn),ne=Ew(Kn),ce=Ew(rn),se=Tf(Ns),ue=Ew(o.solarRadiationHeatmapMaxValue),fe=Pf(wi),he=Ew(o.groundImage),pe=Object(Se.f)(),ye=pe.camera,ge=pe.gl.domElement,we=pe.raycaster,xe=pe.mouse,ve=Object(r.useState)(null),be=Object(u.a)(ve,2),Ae=be[0],Te=be[1],Pe=Object(r.useState)(null),je=Object(u.a)(Pe,2),He=je[0],ze=je[1],Re=Object(r.useState)(null),De=Object(u.a)(Re,2),We=De[0],Ie=De[1],Ce=Object(r.useState)(null),Oe=Object(u.a)(Ce,2),Fe=Oe[0],ke=Oe[1],Ye=Object(r.useState)(null),Le=Object(u.a)(Ye,2),Ee=Le[0],Ue=Le[1],Ne=Object(r.useState)(!1),Ve=Object(u.a)(Ne,2),Je=Ve[0],Ge=Ve[1],Xe=Object(r.useState)(!1),Be=Object(u.a)(Xe,2),Ke=Be[0],qe=Be[1],Qe=Object(r.useState)(),Ze=Object(u.a)(Qe,2),_e=Ze[0],$e=Ze[1],et=Object(r.useRef)(null),tt=Object(r.useRef)(),lt=Object(r.useRef)(null),at=Object(r.useRef)(Rt),ot=Object(r.useRef)(new Me.Vector3(0,0,0)),it=Object(r.useRef)(new Me.Euler(0,0,0)),rt=Object(r.useRef)(new Me.Vector3(1,1,1)),nt=Object(r.useRef)(new Me.Vector3),ct=Object(r.useRef)(new Me.Vector3),dt=Object(r.useRef)(new Me.Vector3),ut=Object(r.useRef)(new Me.Vector3),ft=Object(r.useRef)(new Me.Vector3(1,1,1)),ht=Object(r.useRef)(new Me.Vector3(1,1,1)),pt=Object(r.useRef)(0),gt=Object(r.useRef)(0),mt=Object(r.useRef)([]),wt=Object(r.useRef)([]),xt=Object(r.useRef)(),Pt=Object(r.useRef)(new Me.Vector3),Mt=Object(r.useRef)(0),Wt=Object(r.useMemo)((function(){return{lng:k}}),[k]),It=m/2,Ct=x/2,Ot=b/2,Ft=Object(r.useMemo)((function(){return new Me.Vector3}),[]);if(lt.current&<.current.type===V.SolarPanel){var kt=uw(lt.current.normal)?lt.current.poleHeight:0;Ft.set(0,0,e.lz/2+kt)}var Yt=Object(r.useMemo)((function(){return((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.CuboidElement",Wt))+((null===e||void 0===e?void 0:e.locked)?" ("+me.t("shared.ElementLocked",Wt)+")":"")+((null===e||void 0===e?void 0:e.label)?"":"\n"+me.t("word.Coordinates",Wt)+": ("+p.toFixed(1)+", "+y.toFixed(1)+", "+(b/2).toFixed(1)+") "+me.t("word.MeterAbbreviation",Wt))}),[null===e||void 0===e?void 0:e.label,R,k,p,y,b]);Object(r.useEffect)((function(){var e=function(){lt.current=null,qe(!1),Et.getState().setEnableOrbitController(!0)};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]),Object(r.useEffect)((function(){Ew.getState().tempHumanPlant.length>0&&F((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(e.tempHumanPlant)),e.tempHumanPlant=[]}))}),[]),Object(r.useEffect)((function(){if(e&&se){var t=null!==ue&&void 0!==ue?ue:5,l=fe(e.id+"-top");l&&Te(Tw.fetchHeatmapTexture(l,t));var a=fe(e.id+"-south");a&&ze(Tw.fetchHeatmapTexture(a,t));var o=fe(e.id+"-north");o&&Ie(Tw.fetchHeatmapTexture(o,t));var i=fe(e.id+"-west");i&&ke(Tw.fetchHeatmapTexture(i,t));var r=fe(e.id+"-east");r&&Ue(Tw.fetchHeatmapTexture(r,t,!0))}}),[se,ue]);var Ut=function(e){switch(e){case de.Facade01:return Xm;case de.Facade02:return Bm;case de.Facade03:return Km;case de.Facade04:return qm;case de.Facade05:return Qm;case de.Facade06:return Zm;case de.Facade07:return _m;case de.Facade08:return $m;case de.Facade09:return ew;case de.Facade10:return tw;default:return Sf}},Nt=function(e){switch(e){case de.Facade01:case de.Facade02:return{x:14,y:6.5};case de.Facade03:return{x:10,y:12};case de.Facade04:return{x:20,y:11};case de.Facade05:return{x:15,y:10};case de.Facade06:return{x:11,y:3.5};case de.Facade07:return{x:11,y:10};case de.Facade08:return{x:16,y:9};case de.Facade09:return{x:10,y:9};case de.Facade10:return{x:12,y:9};default:return{x:1,y:1}}},Vt=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[0]):Sf,(function(e){var t=Nt(I[0]);e.repeat.set(x/t.x,b/t.y),e.rotation=vt,e.center.x=1,e.center.y=0,e.wrapS=e.wrapT=Me.RepeatWrapping,Bt(e)}))}),[I[0],x,b]),Jt=Object(r.useState)(Vt),Gt=Object(u.a)(Jt,2),Xt=Gt[0],Bt=Gt[1],Kt=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[1]):Sf,(function(e){var t=Nt(I[1]);e.repeat.set(x/t.x,b/t.y),e.rotation=-vt,e.wrapS=e.wrapT=Me.RepeatWrapping,_t(e)}))}),[I[1],x,b]),qt=Object(r.useState)(Kt),Qt=Object(u.a)(qt,2),Zt=Qt[0],_t=Qt[1],$t=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[2]):Sf,(function(e){var t=Nt(I[2]);e.repeat.set(m/t.x,b/t.y),e.rotation=Math.PI,e.center.x=0,e.center.y=1,e.wrapS=e.wrapT=Me.RepeatWrapping,al(e)}))}),[I[2],m,b]),el=Object(r.useState)($t),tl=Object(u.a)(el,2),ll=tl[0],al=tl[1],ol=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[3]):Sf,(function(e){var t=Nt(I[3]);e.repeat.set(m/t.x,b/t.y),e.wrapS=e.wrapT=Me.RepeatWrapping,cl(e)}))}),[I[3],m,b]),il=Object(r.useState)(ol),rl=Object(u.a)(il,2),nl=rl[0],cl=rl[1],sl=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[4]):Sf,(function(e){var t=Nt(I[4]);e.repeat.set(m/t.x,x/t.y),e.wrapS=e.wrapT=Me.RepeatWrapping,hl(e)}))}),[I[4],m,x]),dl=Object(r.useState)(sl),ul=Object(u.a)(dl,2),fl=ul[0],hl=ul[1];Object(r.useEffect)((function(){Object(Se.c)()}),Object(h.a)(I));var pl=function(e){at.current=e;var t=.01;Tw.isSame(at.current,Rt)?(ot.current=new Me.Vector3(0,0,Ot+t),it.current=new Me.Euler(0,0,0),rt.current.set(It,Ct,Ot)):Tw.isSame(at.current,St)?(ot.current=new Me.Vector3(It+t,0,0),it.current=new Me.Euler(0,vt,0),rt.current.set(Ot,Ct,It)):Tw.isSame(at.current,jt)?(ot.current=new Me.Vector3(-It-t,0,0),it.current=new Me.Euler(0,-vt,0),rt.current.set(Ot,Ct,It)):Tw.isSame(at.current,zt)?(ot.current=new Me.Vector3(0,-Ct-t,0),it.current=new Me.Euler(vt,0,0),rt.current.set(It,Ot,Ct)):Tw.isSame(at.current,Ht)&&(ot.current=new Me.Vector3(0,Ct+t,0),it.current=new Me.Euler(-vt,0,0),rt.current.set(It,Ot,Ct))},yl=Math.max(1,Math.max(m,x)/8),gl=st*yl,ml=Tw.isIdentical(null===(t=lt.current)||void 0===t?void 0:t.normal,Tt),wl=function(t,l,a){var o=JSON.parse(JSON.stringify(t));return o.cx=l,o.cy=a,ce(o)?(Qh(me.t("message.MoveCancelledBecauseOfOverlap",Wt)),!1):!(Tw.isIdentical(t.normal,Tt)&&!Tw.isSolarCollectorWithinHorizontalSurface(o,e))||(Qh(me.t("message.MoveOutsideBoundaryCancelled",Wt)),!1)},xl=function(t,l,a,o,i){if(0!==t.tiltAngle&&.5*i*Math.abs(Math.sin(t.tiltAngle))>t.poleHeight)return!1;var r=JSON.parse(JSON.stringify(t));return r.cx=l,r.cy=a,r.lx=o,r.ly=i,!!Tw.isSolarCollectorWithinHorizontalSurface(r,e)},vl=he?Y?.25:.75:1,bl=[se&&Ee?Ee:Xt,se&&Fe?Fe:Zt,se&&We?We:ll,se&&He?He:nl,se&&Ae?Ae:fl,null],Al=e&&e.faceColors?[0,1,2,3,4,5].map((function(t){return I&&I[t]!==de.NoTexture?se?Object(gf.jsx)("meshBasicMaterial",{side:Me.FrontSide,attachArray:"material",color:"white",map:bl[t],transparent:Y&&he,opacity:vl},t):Object(gf.jsx)("meshStandardMaterial",{side:Me.FrontSide,attachArray:"material",color:"white",map:bl[t],transparent:Y&&he,opacity:vl},t):se?Object(gf.jsx)("meshBasicMaterial",{side:Me.FrontSide,attachArray:"material",color:"white",map:bl[t],transparent:Y&&he,opacity:vl},t):Object(gf.jsx)("meshStandardMaterial",{side:Me.FrontSide,attachArray:"material",color:e.faceColors?e.faceColors[t]:T,map:bl[t],transparent:Y&&he,opacity:vl},t)})):Object(gf.jsx)("meshStandardMaterial",{side:Me.FrontSide,attach:"material",color:T,transparent:Y&&he,opacity:vl}),Tl=Object(r.useMemo)((function(){return[It,Ct,Ot]}),[It,Ct,Ot]),Pl=O&&!R;return Object(gf.jsxs)("group",{ref:et,name:"Cuboid Group "+s,userData:{aabb:!0},children:[Object(gf.jsx)(Lt.a,{castShadow:ae,receiveShadow:ae,userData:{simulation:!0,stand:!0,stackable:C},uuid:s,ref:tt,args:[m,x,b],name:"Cuboid "+s,onContextMenu:function(e){ee(s,e,X.ContextMenu),F((function(t){t.pastePoint.copy(e.intersections[0].point);var l=e.intersections[0].face;(l&&(t.pasteNormal=l.normal.clone(),Tw.isSame(l.normal,St)?t.selectedSideIndex=0:Tw.isSame(l.normal,jt)?t.selectedSideIndex=1:Tw.isSame(l.normal,Ht)?t.selectedSideIndex=2:Tw.isSame(l.normal,zt)?t.selectedSideIndex=3:Tw.isSame(l.normal,Rt)&&(t.selectedSideIndex=4)),t.clickObjectType=V.Cuboid,e.intersections.length>0)&&(e.intersections[0].object===tt.current&&(t.contextMenuObjectType=V.Cuboid))}))},onPointerDown:function(t){if(2!==t.button){ie()||ee(s,t,X.Select);var l=E(),a=!1;if(t.intersections[0].object.name===V.Polygon&&Ew.getState().objectTypeToAdd!==V.None&&(a=!0),(null===l||void 0===l?void 0:l.id)===s||a)if(function(e){switch(e){case V.Polygon:case V.Sensor:case V.Light:case V.SolarPanel:case V.Human:case V.Tree:case V.Flower:return!0}return!1}(Ew.getState().objectTypeToAdd)&&e){qe(!0);var o=function(t){var l,a=t.intersections[0];if(Ew.getState().objectTypeToAdd===V.SolarPanel){var o,i,r,n,c,d,u,f,h=a.point,p=Tw.getWorldDataById(s),y=p.pos,g=p.rot,w=(new Me.Vector3).subVectors(h,y).applyEuler(new Me.Euler(0,0,-g)),v=Vl.makeSolarPanel(e,Ew.getState().getPvModule(null!==(o=Ew.getState().actionState.solarPanelModelName)&&void 0!==o?o:"SPR-X21-335-BLK"),w.x/m,w.y/x,w.z/b,null!==(i=Ew.getState().actionState.solarPanelOrientation)&&void 0!==i?i:$.landscape,null!==(r=Ew.getState().actionState.solarPanelPoleHeight)&&void 0!==r?r:1,null!==(n=Ew.getState().actionState.solarPanelPoleSpacing)&&void 0!==n?n:3,null!==(c=Ew.getState().actionState.solarPanelTiltAngle)&&void 0!==c?c:0,null!==(d=Ew.getState().actionState.solarPanelRelativeAzimuth)&&void 0!==d?d:0,null===(u=a.face)||void 0===u?void 0:u.normal,[0,0,0],null!==(f=Ew.getState().actionState.solarPanelFrameColor)&&void 0!==f?f:"white");return F((function(e){e.elements.push(v)})),v}return U(e,a.point,null===(l=a.face)||void 0===l?void 0:l.normal)}(t);if(o){var i={name:"Add",timestamp:Date.now(),addedElement:o,undo:function(){N(i.addedElement.id,!1)},redo:function(){F((function(e){e.elements.push(i.addedElement),e.selectedElement=i.addedElement}))}};oe(i),F((function(e){e.objectTypeToAdd=V.None}))}}else Et.getState().selectNone(),Et.setState((function(e){e.cuboidRef=et}));else if(l&&l.parentId===s&&function(e){switch(e){case V.Polygon:case V.Sensor:case V.Light:case V.SolarPanel:return!0}return!1}(l.type)){qe(!0);var r,n=Tw.getWorldDataById(s),c=n.rot,u=n.pos;Pt.current.copy(u),Mt.current=c,lt.current=l;var h,p=Object(f.a)(t.intersections);try{for(p.s();!(h=p.n()).done;){var y=h.value;if(y.object===tt.current){r=y.face;break}}}catch(g){p.e(g)}finally{p.f()}switch(r&&(pl(r.normal),_e&&_e.equals(r.normal)||$e(r.normal)),Et.getState().setEnableOrbitController(!1),nt.current.x=l.cx,nt.current.y=l.cy,nt.current.z=l.cz,dt.current.fromArray(l.normal),ft.current.x=l.lx,ft.current.y=l.ly,ft.current.z=l.lz,l.type){case V.SolarPanel:pt.current=l.relativeAzimuth;break;case V.Polygon:mt.current=l.vertices.map((function(e){return Object(d.a)({},e)}))}}}},onPointerMove:function(t){if(lt.current&&e){if(lt.current.type===V.SolarPanel&&ml)return;if(lt.current.parentId===s&<.current.type&&!lt.current.locked){var l=new Me.Vector2(t.offsetX/ge.clientWidth*2-1,1-t.offsetY/ge.clientHeight*2);if(we.setFromCamera(l,ye),tt.current){var a=we.intersectObjects([tt.current]);if(a.length>0){var o=a[0].point,i=a[0].face;if(Ew.getState().moveHandleType){if(i){var r=i.normal;_e&&!_e.equals(r)&&$e(r),pl(r),_(lt.current.id,r.x,r.y,r.z)}if(o=Tw.relativeCoordinates(o.x,o.y,o.z,e),lt.current.type===V.Polygon){var n=lt.current;if(Ew.getState().moveHandleType===B.Default){var c,f,h=Tw.calculatePolygonCentroid(mt.current),p=(new Me.Vector3).fromArray(n.normal);Tw.isSame(p,St)?(c=-(h.x+o.z),f=o.y-h.y):Tw.isSame(p,jt)?(c=o.z-h.x,f=o.y-h.y):Tw.isSame(p,Ht)?(c=o.x-h.x,f=-(h.y+o.z)):Tw.isSame(p,zt)?(c=o.x-h.x,f=o.z-h.y):(c=o.x-h.x,f=o.y-h.y);var y=mt.current.map((function(e){return Object(d.a)({},e)}));y.forEach((function(e){e.x+=c,e.y+=f})),re(n.id,y)}}else Q(lt.current.id,o.x,o.y,o.z)}else if(Ew.getState().resizeHandleType)switch(lt.current.type){case V.SolarPanel:var g=lt.current,w=Em(g),v=Object(u.a)(w,2),A=v[0],T=v[1],P=Ew.getState().resizeAnchor,S=Ew.getState().resizeHandleType;if(S===K.Lower||S===K.Upper){var j=Math.max(1,Math.round(Math.abs(o.z-P.z)/T))*T,H=new Me.Vector3(0,0,o.z-P.z).normalize().multiplyScalar(j),z=(new Me.Vector3).addVectors(P,H.clone().divideScalar(2));F((function(e){var t=e.elements.find((function(e){return e.id===g.id}));t&&(t.cz=(z.z-Pt.current.z)/b,t.ly=Math.abs(H.z))}))}else if(S===K.Left||S===K.Right){var R=(new Me.Vector3).subVectors(o,P).setZ(0),D=Math.max(1,Math.round(R.length()/A))*A,M=R.clone().normalize().multiplyScalar(D),W=(new Me.Vector3).addVectors(P,M.clone().divideScalar(2)),I=(new Me.Vector3).subVectors(W,Pt.current).applyEuler(new Me.Euler(0,0,-Mt.current));F((function(e){var t=e.elements.find((function(e){return e.id===g.id}));t&&(Math.abs(Math.abs(t.normal[1])-1)<.01?t.cx=I.x/m:t.cy=I.y/x,t.lx=M.length())}))}break;case V.Polygon:if(Ew.getState().resizeHandleType===K.Default){var C,O,k=new Me.Vector3(o.x-Pt.current.x,o.y-Pt.current.y,0).applyEuler(new Me.Euler(0,0,-Mt.current,"ZXY")),Y=lt.current,L=(new Me.Vector3).fromArray(Y.normal);Tw.isSame(L,St)?(C=e.lz,O=e.ly,k.x=-o.z+Pt.current.z):Tw.isSame(L,jt)?(C=e.lz,O=e.ly,k.x=o.z-Pt.current.z):Tw.isSame(L,Ht)?(C=e.lx,O=e.lz,k.y=-o.z+Pt.current.z):Tw.isSame(L,zt)?(C=e.lx,O=e.lz,k.y=o.z-Pt.current.z):(C=e.lx,O=e.ly),(k=Ew.getState().enableFineGrid?Tw.snapToFineGrid(k):Tw.snapToNormalGrid(k)).x/=C,k.y/=O,ne(Y.id,Y.selectedIndex,k.x,k.y)}}}}}}},onPointerUp:function(){if(lt.current){var t=L(lt.current.id);if(t&&t.parentId===s){if(t.type===V.Polygon){if(Ew.getState().moveHandleType||Ew.getState().resizeHandleType){wt.current=t.vertices.map((function(e){return Object(d.a)({},e)}));var l={name:Ew.getState().moveHandleType?"Move Polygon":"Resize Polygon",timestamp:Date.now(),oldValue:mt.current,newValue:wt.current,changedElementId:t.id,changedElementType:t.type,undo:function(){re(l.changedElementId,l.oldValue)},redo:function(){re(l.changedElementId,l.newValue)}};oe(l)}}else if(Ew.getState().resizeHandleType){if(ct.current.x=t.cx,ct.current.y=t.cy,ct.current.z=t.cz,ht.current.x=t.lx,ht.current.y=t.ly,ht.current.z=t.lz,ct.current.distanceToSquared(nt.current)>At&&ht.current.distanceToSquared(ft.current)>At){var a={name:"Resize",timestamp:Date.now(),resizedElementId:lt.current.id,resizedElementType:lt.current.type,oldCx:nt.current.x,oldCy:nt.current.y,oldCz:nt.current.z,newCx:ct.current.x,newCy:ct.current.y,newCz:ct.current.z,oldLx:ft.current.x,oldLy:ft.current.y,oldLz:ft.current.z,newLx:ht.current.x,newLy:ht.current.y,newLz:ht.current.z,undo:function(){Q(a.resizedElementId,a.oldCx,a.oldCy,a.oldCz),Z(a.resizedElementId,a.oldLx,a.oldLy,a.oldLz)},redo:function(){Q(a.resizedElementId,a.newCx,a.newCy,a.newCz),Z(a.resizedElementId,a.newLx,a.newLy,a.newLz)}};oe(a)}}else if(Ew.getState().rotateHandleType){if(lt.current.type===V.SolarPanel){var o=lt.current;if(Math.abs(gt.current-pt.current)>At)if(function(t,l){var a=JSON.parse(JSON.stringify(t));return a.relativeAzimuth=l,ce(a)?(Qh(me.t("message.RotationCancelledBecauseOfOverlap",Wt)),!1):!!Tw.isSolarCollectorWithinHorizontalSurface(a,e)||(Qh(me.t("message.RotationOutsideBoundaryCancelled",Wt)),!1)}(o,gt.current)){F((function(e){e.selectedElementAngle=gt.current}));var i={name:"Rotate",timestamp:Date.now(),oldValue:pt.current,newValue:gt.current,changedElementId:o.id,changedElementType:o.type,undo:function(){te(i.changedElementId,i.oldValue)},redo:function(){te(i.changedElementId,i.newValue)}};oe(i)}else te(o.id,pt.current)}}else if(ct.current.x=t.cx,ct.current.y=t.cy,ct.current.z=t.cz,ut.current.fromArray(t.normal),ct.current.distanceToSquared(nt.current)>At){var r=!0;if(t.type===V.SolarPanel&&(r=wl(t,t.cx,t.cy)),r){var n,c={name:"Move",timestamp:Date.now(),movedElementId:lt.current.id,movedElementType:null===(n=lt.current)||void 0===n?void 0:n.type,oldCx:nt.current.x,oldCy:nt.current.y,oldCz:nt.current.z,oldNormal:dt.current.clone(),newCx:ct.current.x,newCy:ct.current.y,newCz:ct.current.z,newNormal:ut.current.clone(),undo:function(){Q(c.movedElementId,c.oldCx,c.oldCy,c.oldCz),c.oldNormal&&_(c.movedElementId,c.oldNormal.x,c.oldNormal.y,c.oldNormal.z)},redo:function(){Q(c.movedElementId,c.newCx,c.newCy,c.newCz),c.newNormal&&_(c.movedElementId,c.newNormal.x,c.newNormal.y,c.newNormal.z)}};oe(c)}else Q(t.id,nt.current.x,nt.current.y,nt.current.z)}lt.current=null}}},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===tt.current&&Ge(!0))},onPointerOut:function(){if(Ge(!1),lt.current)switch(lt.current.type){case V.Human:case V.Tree:case V.Flower:qe(!1);break;case V.SolarPanel:var e=Ew.getState().getElementById(lt.current.id);Ew.getState().moveHandleType&&!wl(e,e.cx,e.cy)&&Q(e.id,nt.current.x,nt.current.y,nt.current.z)}},onPointerEnter:function(e){lt.current&&Tw.isPlantOrHuman(lt.current)&&(e.intersections[0].object===tt.current&&qe(!0))},children:Al}),(null===(l=lt.current)||void 0===l?void 0:l.type)===V.SolarPanel&&ml&&!lt.current.locked&&Object(gf.jsx)(Lt.f,{ref:xt,name:"Cuboid Intersection Plane",position:Ft,args:[m,x],visible:!1,onPointerMove:function(t){if(xt.current&<.current&&e){if(lt.current.type!==V.SolarPanel||!ml)return;var l=lt.current;if(l.parentId!==s||l.locked)return;we.setFromCamera(xe,ye);var a=we.intersectObjects([xt.current]);if(a.length>0){var o=a[0].point.clone();if(Ew.getState().moveHandleType)o=Tw.relativeCoordinates(o.x,o.y,o.z-l.poleHeight,e),Q(l.id,o.x,o.y,o.z);else if(Ew.getState().rotateHandleType&&Ew.getState().rotateHandleType!==q.Tilt){var i=Mt.current,r=new Me.Vector2(Pt.current.x,Pt.current.y),n=new Me.Vector2(e.lx*l.cx,e.ly*l.cy).rotateAround(Dt,i),c=(new Me.Vector2).addVectors(n,r),d=-i+Math.atan2(-o.x+c.x,o.y-c.y)+(Ew.getState().rotateHandleType===q.Lower?0:Math.PI),u=d+(Math.abs(d)>Math.PI?-Math.sign(d)*bt:0);te(l.id,u),gt.current=u}else if(Ew.getState().resizeHandleType){var f=Ew.getState().resizeAnchor,h=le(l.pvModelName),p=new Me.Vector2(o.x,o.y),y=new Me.Vector2(f.x,f.y),g=p.distanceTo(y),w=l.relativeAzimuth+Mt.current,v=(new Me.Vector2).subVectors(p,y);switch(Ew.getState().resizeHandleType){case K.Lower:case K.Upper:var b=Ew.getState().resizeHandleType===K.Lower?1:-1,A=v.angle()-w+b*vt,T=g*Math.cos(A);if(l.orientation===$.portrait)T=Math.max(1,Math.ceil((T-h.length/2)/h.length))*h.length;else T=Math.max(1,Math.ceil((T-h.width/2)/h.width))*h.width;var P=f.x+b*(T*Math.sin(w))/2,S=f.y-b*(T*Math.cos(w))/2,j=new Me.Vector2(P,S),H=new Me.Vector2(Pt.current.x,Pt.current.y),z=(new Me.Vector2).subVectors(j,H).rotateAround(Dt,-Mt.current),R=z.x/m,D=z.y/x;xl(l,R,D,l.lx,T)&&(G(l.id,T),Q(l.id,R,D));break;case K.Left:case K.Right:var M=Ew.getState().resizeHandleType===K.Left?-1:1,W=v.angle()-w+(Ew.getState().resizeHandleType===K.Left?Math.PI:0),I=g*Math.cos(W);if(l.orientation===$.portrait)I=Math.max(1,Math.ceil((I-h.width/2)/h.width))*h.width;else I=Math.max(1,Math.ceil((I-h.length/2)/h.length))*h.length;var C=f.x+M*(I*Math.cos(w))/2,O=f.y+M*(I*Math.sin(w))/2,F=new Me.Vector2(C,O),k=new Me.Vector2(Pt.current.x,Pt.current.y),Y=(new Me.Vector2).subVectors(F,k).rotateAround(Dt,-Mt.current),L=Y.x/m,E=Y.y/x;xl(l,L,E,I,l.ly)&&(J(l.id,I),Q(l.id,L,E))}}}}}}),Ke&&Object(gf.jsxs)(gf.Fragment,{children:[(Ew.getState().moveHandleType||Ew.getState().resizeHandleType)&&Object(gf.jsx)(mf,{hx:rt.current.x,hy:rt.current.y,hz:rt.current.z,position:ot.current,rotation:it.current}),Ew.getState().rotateHandleType&<.current&<.current.type===V.SolarPanel&&Object(gf.jsx)(ly,{element:lt.current,height:lt.current.poleHeight+Ot})]}),O&&Object(gf.jsx)(cy,{element:e,verticalLift:gl}),(!O||he)&&Object(gf.jsx)(ry,{hx:It,hy:Ct,hz:Ot,lineColor:he&&Y?"white":S,lineWidth:he&&Y?5*H:H}),O&&R&&Object(gf.jsx)(ry,{hx:It,hy:Ct,hz:Ot,lineColor:yt,lineWidth:5*H}),Pl&&Object(gf.jsx)(iw,{id:s,args:Tl}),(Je||M)&&!O&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:Yt,color:null!==(a=null===e||void 0===e?void 0:e.labelColor)&&void 0!==a?a:"white",fontSize:null!==(i=null===e||void 0===e?void 0:e.labelFontSize)&&void 0!==i?i:20,fontFace:"Roboto",textHeight:null!==(n=null===e||void 0===e?void 0:e.labelSize)&&void 0!==n?n:.2,position:[0,0,Ot+(null!==(c=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==c?c:.2)]})]})},yw=n.a.memo(pw),gw=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,d=e.cz,h=e.lx,p=void 0===h?1:h,y=e.ly,g=void 0===y?1:y,m=e.lz,w=void 0===m?.1:m,x=e.rotation,v=void 0===x?[0,0,0]:x,b=e.normal,A=void 0===b?[0,0,1]:b,T=e.color,P=void 0===T?"white":T,S=e.lineColor,j=void 0===S?"black":S,H=e.lineWidth,z=void 0===H?.1:H,R=e.locked,D=void 0!==R&&R,M=e.showLabel,W=void 0!==M&&M,I=e.parentId,C=e.foundationId,O=(e.light,e.heatFlux,Ew(si)),F=Ew(Vi),k=Ew(o.shadowEnabled),Y=Ew(is),L=_f(n),E=Object(Se.f)().gl.domElement,U=Object(r.useState)(!1),N=Object(u.a)(U,2),J=N[0],G=N[1],K=Object(r.useRef)(),q=Object(r.useRef)(),Q=Object(r.useMemo)((function(){return{lng:F}}),[F]),Z=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===I)return a}}catch(o){l.e(o)}finally{l.f()}})),_=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===C)return a}}catch(o){l.e(o)}finally{l.f()}}));if(I&&Z)switch(Z.type){case V.Foundation:if(d=Z.cz+Z.lz/2,Tw.isZero(v[2]))c=Z.cx+c*Z.lx,s=Z.cy+s*Z.ly;else{var $=new Me.Vector3(c*Z.lx,s*Z.ly,0);$.applyAxisAngle(Rt,v[2]),c=Z.cx+$.x,s=Z.cy+$.y}break;case V.Wall:if((null===_||void 0===_?void 0:_.type)===V.Foundation){var ee=Tw.absoluteCoordinates(c,s,d,Z,_);c=ee.x,s=ee.y,d=ee.z}break;case V.Roof:if((null===_||void 0===_?void 0:_.type)===V.Foundation){var te=Tw.absoluteCoordinates(c,s,d,Z,_);c=te.x,s=te.y,d=te.z}}var le=w/2,ae=Object(r.useMemo)((function(){if((null===Z||void 0===Z?void 0:Z.type)===V.Wall){var e=Z,t=_?_.rotation[2]+e.relativeAngle:e.relativeAngle;return new Me.Euler(vt,0,t,"ZXY")}if((null===Z||void 0===Z?void 0:Z.type)===V.Roof)return new Me.Euler(v[0],v[1],_?_.rotation[2]+v[2]:v[2],"ZXY");if((null===Z||void 0===Z?void 0:Z.type)===V.Cuboid)return dw(A);var l=(new Me.Vector3).fromArray(A);return Tw.isSame(l,St)?new Me.Euler(0,vt,v[2],"ZXY"):Tw.isSame(l,jt)?new Me.Euler(0,-vt,v[2],"ZXY"):Tw.isSame(l,Ht)?new Me.Euler(-vt,0,v[2],"ZXY"):Tw.isSame(l,zt)?new Me.Euler(vt,0,v[2],"ZXY"):new Me.Euler(0,0,v[2])}),[A,v,null===_||void 0===_?void 0:_.rotation]),oe=Object(r.useMemo)((function(){return((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.SensorElement",Q))+((null===e||void 0===e?void 0:e.locked)?" ("+me.t("shared.ElementLocked",Q)+")":"")+"\n"+me.t("word.Coordinates",Q)+": ("+c.toFixed(1)+", "+s.toFixed(1)+", "+d.toFixed(1)+") "+me.t("word.MeterAbbreviation",Q)}),[null===e||void 0===e?void 0:e.label,D,F,c,s,d]);return Object(gf.jsxs)("group",{name:"Sensor Group "+n,rotation:ae,position:[c,s,d+le],children:[Object(gf.jsx)(Lt.a,{receiveShadow:k,uuid:n,ref:K,args:[p,g,w],name:"Sensor",onPointerDown:function(e){2!==e.button&&(Y(n,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=I,e.oldParentId=I,e.oldFoundationId=C})),O((function(e){e.moveHandleType=B.Default})))},onContextMenu:function(e){Y(n,e,X.ContextMenu),O((function(t){e.intersections.length>0&&(e.intersections[0].object===K.current&&(t.contextMenuObjectType=V.Sensor))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===K.current&&(G(!0),E.style.cursor="move"))},onPointerOut:function(){G(!1),E.style.cursor="default"},children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:(null===e||void 0===e?void 0:e.lit)?pt:P})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Meter",castShadow:!1,receiveShadow:!1,args:[.3*p,.3*g,le,8,1],position:new Me.Vector3(0,0,le),rotation:[vt,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"black"})}),!L&&Object(gf.jsx)(ry,{hx:p/2,hy:g/2,hz:w/2,lineColor:j,lineWidth:z}),L&&D&&Object(gf.jsx)(ry,{hx:p/2,hy:g/2,hz:w/2,lineColor:yt,lineWidth:10*z}),L&&!D&&Object(gf.jsx)(Lt.h,{ref:q,position:new Me.Vector3(0,0,0),args:[st,6,6,0,Math.PI],name:B.Default,onPointerDown:function(e){2===e.button?(Y(n,e,X.ContextMenu),O((function(t){e.intersections.length>0&&(e.intersections[0].object===q.current&&(t.contextMenuObjectType=V.Sensor))}))):Y(n,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=I,e.oldParentId=I,e.oldFoundationId=C})),O((function(e){e.moveHandleType=B.Default}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),(J||W)&&!L&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:oe,color:null!==(t=null===e||void 0===e?void 0:e.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===e||void 0===e?void 0:e.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===e||void 0===e?void 0:e.labelSize)&&void 0!==a?a:.2,position:[0,0,w+(null!==(i=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==i?i:.2)]})]})},mw=n.a.memo(gw),ww=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,d=e.cz,h=e.lx,p=void 0===h?1:h,y=e.ly,g=void 0===y?1:y,m=e.lz,w=void 0===m?.1:m,x=e.rotation,v=void 0===x?[0,0,0]:x,b=e.normal,A=void 0===b?[0,0,1]:b,T=e.color,P=void 0===T?"#ffff99":T,S=(e.lineColor,e.lineWidth),j=void 0===S?.1:S,H=e.locked,z=void 0!==H&&H,R=e.showLabel,D=void 0!==R&&R,M=e.parentId,W=e.foundationId,I=e.decay,C=void 0===I?2:I,O=e.distance,F=void 0===O?5:O,k=e.intensity,Y=void 0===k?3:k,L=e.inside,E=void 0!==L&&L,U=Ew(si),N=Ew(Vi),J=Ew(o.shadowEnabled),G=Ew(is),K=Ew(Es).z<=0,q=_f(n),Q=Object(Se.f)().gl.domElement,Z=Object(r.useState)(!1),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Object(r.useRef)(),le=Object(r.useRef)(),ae=Object(r.useMemo)((function(){return{lng:N}}),[N]),oe=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===M)return a}}catch(o){l.e(o)}finally{l.f()}})),ie=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===W)return a}}catch(o){l.e(o)}finally{l.f()}})),re=.1;if(M&&oe)switch(oe.type){case V.Foundation:if(d=oe.cz+oe.lz/2,Tw.isZero(v[2]))c=oe.cx+c*oe.lx,s=oe.cy+s*oe.ly;else{var ne=new Me.Vector3(c*oe.lx,s*oe.ly,0);ne.applyAxisAngle(Rt,v[2]),c=oe.cx+ne.x,s=oe.cy+ne.y}break;case V.Wall:if((null===ie||void 0===ie?void 0:ie.type)===V.Foundation){var ce=Tw.absoluteCoordinates(c,s,d,oe,ie);c=ce.x,s=ce.y,d=ce.z}re=oe.ly;break;case V.Roof:if((null===ie||void 0===ie?void 0:ie.type)===V.Foundation){var se=Tw.absoluteCoordinates(c,s,d,oe,ie);c=se.x,s=se.y,d=se.z}re=oe.thickness}var de=w/2,ue=Object(r.useMemo)((function(){if((null===oe||void 0===oe?void 0:oe.type)===V.Wall){var e=oe,t=ie?ie.rotation[2]+e.relativeAngle:e.relativeAngle;return new Me.Euler(vt,0,t,"ZXY")}if((null===oe||void 0===oe?void 0:oe.type)===V.Roof)return new Me.Euler(v[0],v[1],ie?ie.rotation[2]+v[2]:v[2],"ZXY");if((null===oe||void 0===oe?void 0:oe.type)===V.Cuboid)return dw(A);var l=(new Me.Vector3).fromArray(A);return Tw.isSame(l,St)?new Me.Euler(0,vt,v[2],"ZXY"):Tw.isSame(l,jt)?new Me.Euler(0,-vt,v[2],"ZXY"):Tw.isSame(l,Ht)?new Me.Euler(-vt,0,v[2],"ZXY"):Tw.isSame(l,zt)?new Me.Euler(vt,0,v[2],"ZXY"):new Me.Euler(0,0,v[2])}),[A,v,null===ie||void 0===ie?void 0:ie.rotation]),fe=Object(r.useMemo)((function(){return((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.LightElement",ae))+((null===e||void 0===e?void 0:e.locked)?" ("+me.t("shared.ElementLocked",ae)+")":"")+"\n"+me.t("word.Coordinates",ae)+": ("+c.toFixed(1)+", "+s.toFixed(1)+", "+d.toFixed(1)+") "+me.t("word.MeterAbbreviation",ae)}),[null===e||void 0===e?void 0:e.label,z,N,c,s,d]);return Object(gf.jsxs)("group",{name:"Light Group "+n,rotation:ue,position:[c,s,d],children:[K&&Object(gf.jsx)("pointLight",{color:P,name:"Point Light "+n,position:[0,0,E?-re-de:de],decay:C,distance:F,intensity:Y,castShadow:!0}),Object(gf.jsx)(Lt.d,{receiveShadow:J,userData:{unintersectable:!0},uuid:n,ref:te,position:[0,0,E?-re:0],rotation:[vt,0,0],args:[.5*p,.5*g,de,16,1],name:"Light Base",onPointerDown:function(e){2!==e.button&&(G(n,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=M,e.oldParentId=M,e.oldFoundationId=W})))},onContextMenu:function(e){G(n,e,X.ContextMenu),U((function(t){e.intersections.length>0&&(e.intersections[0].object===te.current&&(t.contextMenuObjectType=V.Light))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===te.current&&(ee(!0),Q.style.cursor="move"))},onPointerOut:function(){ee(!1),Q.style.cursor="default"},children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightgray"})}),Object(gf.jsx)(Lt.h,{userData:{unintersectable:!0},name:"Light Bulb",castShadow:!1,receiveShadow:J,args:[.3*p,8,8,0,bt,0,Math.PI],position:new Me.Vector3(0,0,E?-re-de:de),rotation:[vt,0,0],children:K?Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"}):Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),q&&z&&Object(gf.jsx)(ry,{hx:p/2,hy:g/2,hz:w/2,lineColor:yt,lineWidth:10*j}),q&&!z&&Object(gf.jsx)(Lt.h,{ref:le,position:new Me.Vector3(0,0,E?-re-de:de),args:[st,6,6,E?Math.PI:0,Math.PI],name:B.Default,onPointerDown:function(e){2===e.button?(G(n,e,X.ContextMenu),U((function(t){e.intersections.length>0&&(e.intersections[0].object===le.current&&(t.contextMenuObjectType=V.Light))}))):G(n,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=M,e.oldParentId=M,e.oldFoundationId=W}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),($||D)&&!q&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:fe,color:null!==(t=null===e||void 0===e?void 0:e.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===e||void 0===e?void 0:e.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===e||void 0===e?void 0:e.labelSize)&&void 0!==a?a:.2,position:[0,0,(E?-re:0)+w+(null!==(i=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==i?i:.2)]})]})},xw=n.a.memo(ww),vw="Cuboid Wrapper",bw="Cuboid Stackable Child",Aw=function e(t){var l=t.elements,a=t.cuboidModel,o=a.cx,i=a.cy,r=a.lz,n=a.rotation,c=r/2;return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)("group",{name:vw,position:[o,i,c],rotation:[0,0,n[2]],children:[Object(gf.jsx)(yw,Object(d.a)({},a)),l.map((function(t){if(function(e){return Jm(e)&&e.parentId===a.id}(t))return Object(gf.jsx)("group",{name:bw,position:[0,0,c],children:Object(gf.jsx)(e,{elements:l,cuboidModel:t})},t.id);if(t.parentId===a.id){var o=a.lx,i=a.ly,r=a.lz;switch(t.type){case V.SolarPanel:return Object(gf.jsx)(hw,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*o,cy:t.cy*i,cz:t.cz*r}),t.id);case V.Sensor:return Object(gf.jsx)(mw,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*o,cy:t.cy*i,cz:t.cz*r}),t.id);case V.Light:return Object(gf.jsx)(xw,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*o,cy:t.cy*i,cz:t.cz*r}),t.id);default:return null}}}))]})})},Tw=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"calculateProfit",value:function(e){return.001*(e.yearlyYield*e.sellingPrice-e.panelCount*e.unitCost*365)}},{key:"calculateCost",value:function(e){return e.panelCount*e.unitCost*.365}},{key:"getLatLngKey",value:function(e,t){return e.toFixed(4)+", "+t.toFixed(4)}},{key:"getModelKey",value:function(e){return e.title+", "+e.userid}},{key:"resizeCanvas",value:function(e,t,l){var a=document.createElement("canvas");a.width=t,a.height=l||t*e.height/e.width;var o=a.getContext("2d");return o&&o.drawImage(e,0,0,e.width,e.height,0,0,a.width,a.height),a}},{key:"getEuler",value:function(e,t,l,a,o,i){var r=new Me.Quaternion;r.setFromUnitVectors(e,t);var n=new Me.Euler;return n.setFromQuaternion(r),l&&(n.order=l),a&&(n.x+=a),o&&(n.y+=o),i&&(n.z+=i),n}},{key:"zero2DArray",value:function(e){for(var t=0;t0){var d,u=Object(f.a)(n);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(!h.leftJoints||0===h.leftJoints.length)return D.WALL_DISJOINED;if(!h.rightJoints||0===h.rightJoints.length)return D.WALL_DISJOINED}}catch(p){u.e(p)}finally{u.f()}}return D.COMPLETE}},{key:"calculateBuildingArea",value:function(t){var l=e.getWallPointsOfRoof(t);return e.getPolygonArea(l)}},{key:"toUValueInUS",value:function(e){return e/5.67826}},{key:"toUValueInSI",value:function(e){return 5.67826*e}},{key:"toRValueInUS",value:function(e){return 5.67826*e}},{key:"toRValueInSI",value:function(e){return e/5.67826}},{key:"fetchWaterTexture",value:function(e,t){var l=document.createElement("canvas");l.width=e,l.height=t;var a=l.getContext("2d");if(a){var o=a.createRadialGradient(e/2,t/2,0,e/2,t/2,Math.max(e,t)/2);o.addColorStop(0,"#45AAEA"),o.addColorStop(.04,"#2B65EC"),o.addColorStop(.2,"#0000FF"),a.fillStyle=o,a.fillRect(0,0,e,t)}return new Me.CanvasTexture(l)}},{key:"fetchWhiteTexture",value:function(e,t){var l=document.createElement("canvas");l.width=e,l.height=t;var a=l.getContext("2d");return a&&(a.fillStyle="white",a.fillRect(0,0,e,t)),new Me.CanvasTexture(l)}},{key:"fetchIntersectables",value:function(e){var t=[];return e.traverse((function(e){e.userData.unintersectable||t.push(e)})),t}},{key:"fetchSimulationElements",value:function(t,l){if(t.userData.simulation&&l.push(t),t.children.length>0){var a,o=Object(f.a)(t.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;e.fetchSimulationElements(i,l)}}catch(r){o.e(r)}finally{o.f()}}}},{key:"getSimulationElements",value:function(t,l,a){if(t.userData.simulation&&t.uuid!==a&&l.push(t),t.children.length>0){var o,i=Object(f.a)(t.children);try{for(i.s();!(o=i.n()).done;){var r=o.value;e.getSimulationElements(r,l,a)}}catch(n){i.e(n)}finally{i.f()}}}},{key:"hasMovingParts",value:function(e){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;){var a=t.value;switch(a.type){case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:return!0;case V.SolarPanel:if(a.trackerType!==te.NO_TRACKER)return!0}}}catch(o){l.e(o)}finally{l.f()}return!1}},{key:"onBuildingEnvelope",value:function(e){return e.type===V.Foundation||e.type===V.Window||e.type===V.Door||e.type===V.Wall||e.type===V.Roof}},{key:"getWindowArea",value:function(e,t){if(t){if(e.windowType===Yt.Arched&&e.archHeight>0){var l=.5*e.lx*t.lx,a=e.lz*t.lz,o=Math.min(e.archHeight,a,l),i=.5*(o+l*l/o),r=Math.acos(Math.min(l/i,1));return.5*(Math.PI-2*r)*i*i-l*(i-o)+(a-o)*l*2}if(e.windowType===Yt.Polygonal&&e.polygonTop){var n=e.lx*e.lz*t.lx*t.lz;return n+=e.lx*t.lx*e.polygonTop[1]/2}return e.lx*e.lz*t.lx*t.lz}if(e.windowType===Yt.Arched&&e.archHeight>0){var c=.5*e.lx,s=e.lz,d=Math.min(e.archHeight,s,c),u=.5*(d+c*c/d),f=Math.acos(Math.min(c/u,1));return.5*(Math.PI-2*f)*u*u-c*(u-d)+(s-d)*c*2}if(e.windowType===Yt.Polygonal&&e.polygonTop){var h=e.lx*e.lz;return h+=e.lx*e.polygonTop[1]/2}return e.lx*e.lz}},{key:"getDoorArea",value:function(e,t){if(t){if(e.doorType===hy.Arched&&e.archHeight>0){var l=.5*e.lx*t.lx,a=e.lz*t.lz,o=Math.min(e.archHeight,a,l),i=.5*(o+l*l/o),r=Math.acos(Math.min(l/i,1));return.5*(Math.PI-2*r)*i*i-l*(i-o)+(a-o)*l*2}return e.lx*e.lz*t.lx*t.lz}if(e.doorType===hy.Arched&&e.archHeight>0){var n=.5*e.lx,c=e.lz,s=Math.min(e.archHeight,c,n),d=.5*(s+n*n/s),u=Math.acos(Math.min(n/d,1));return.5*(Math.PI-2*u)*d*d-n*(d-s)+(c-s)*n*2}return e.lx*e.lz}},{key:"hasHeliostatOrFresnelReflectors",value:function(e){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector||a.type===V.Heliostat)return!0}}catch(o){l.e(o)}finally{l.f()}return!1}},{key:"lineIntersection",value:function(e,t,l,a){var o=t.x-e.x,i=t.y-e.y,r=o*(a.y-l.y)-(a.x-l.x)*i;if(0!==r){var n=((a.y-l.y)*(a.x-e.x)+(l.x-a.x)*(a.y-e.y))/r,c=((e.y-t.y)*(a.x-e.x)+o*(a.y-e.y))/r;if(0<=n&&n<=1&&0<=c&&c<=1)return{x:e.x+n*o,y:e.y+n*i}}}},{key:"calculateSolarRadiationColor",value:function(e,t){var l=t/(Ze.length-1),a=Math.max(0,Math.floor(e/l));a>Ze.length-2&&(a=Ze.length-2);var o=Math.min(1,(e-l*a)/l);return new Me.Color(Ze[a]).lerp(Ze[a+1],o)}},{key:"transpose",value:function(e){return e[0].map((function(t,l){return e.map((function(e){return e[l]}))}))}},{key:"clone2DArray",value:function(e){return e.map((function(e){return Object(h.a)(e)}))}},{key:"fetchHeatmapTexture",value:function(t,l,a){if(!t)return null;var o=document.createElement("canvas"),i=t.length,r=t[0].length;o.width=i,o.height=r;var n=o.getContext("2d");if(n){n.clearRect(0,0,i,r);for(var c=n.getImageData(0,0,i,r),s=c.data,d=0;dt!==s>t&&e<(c-r)*(t-n)/(s-n)+r&&(a=!a)}return a}},{key:"getPoints",value:function(e){var t,l=[],a=Object(f.a)(e);try{for(a.s();!(t=a.n()).done;){var o=t.value;l.push({x:o.x,y:o.y})}}catch(i){a.e(i)}finally{a.f()}return l}},{key:"polygonIntersections",value:function(t,l,a){for(var o,i,r,n=new Array,c=0;c0&&(l>s.x&&(l=s.x),o>s.y&&(o=s.y),a=l||Math.abs(i)>=a)return!1;var r=e.rightPoint[0],n=e.rightPoint[1];return!(Math.abs(r)>=l||Math.abs(n)>=a)}},{key:"isSensorWithin",value:function(e,t){return Math.abs(e.cx)<.5-e.lx/t.lx&&Math.abs(e.cy)<.5-e.ly/t.ly}},{key:"isSolarCollectorWithinHorizontalSurface",value:function(e,t){var l=e.cx*t.lx,a=e.cy*t.ly,o=Math.cos(e.relativeAzimuth),i=Math.sin(e.relativeAzimuth),r=.5*t.lx,n=.5*t.ly,c=.5*e.lx,s=.5*e.ly*Math.cos(e.tiltAngle),d=l+c*o-s*i,u=a+c*i+s*o;return!(Math.abs(d)>r||Math.abs(u)>n)&&(d=l+c*o+s*i,u=a+c*i-s*o,!(Math.abs(d)>r||Math.abs(u)>n)&&(d=l-c*o-s*i,u=a-c*i+s*o,!(Math.abs(d)>r||Math.abs(u)>n)&&(d=l-c*o+s*i,u=a-c*i-s*o,!(Math.abs(d)>r||Math.abs(u)>n))))}},{key:"isUnitVectorX",value:function(t){return e.isSame(t,St)||e.isSame(t,jt)}},{key:"isUnitVectorY",value:function(t){return e.isSame(t,Ht)||e.isSame(t,zt)}},{key:"isSame",value:function(e,t){return Math.abs(e.x-t.x)At)return!1;return!0}},{key:"isZero",value:function(e){return Math.abs(e)-1&&e.splice(l,1)}},{key:"fixElements",value:function(t){var l,a=[],o=Object(f.a)(t);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type||a.push(i)}}catch(s){o.e(s)}finally{o.f()}if(a.length>0){var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;e.deleteElement(t,c)}}catch(s){n.e(s)}finally{n.f()}}}},{key:"isResizingVertical",value:function(e){switch(e){case K.LowerLeftTop:case K.UpperLeftTop:case K.LowerRightTop:case K.UpperRightTop:return!0;default:return!1}}},{key:"isTopResizeHandle",value:function(e){return e===K.LowerLeftTop||e===K.LowerRightTop||e===K.UpperLeftTop||e===K.UpperRightTop||e===K.Top}},{key:"isXResizeHandle",value:function(e){return e===K.Left||e===K.Right}},{key:"isYResizeHandle",value:function(e){return e===K.Upper||e===K.Lower}},{key:"isTopResizeHandleOfWall",value:function(e){return e===K.UpperLeft||e===K.UpperRight}},{key:"isRiseHandleOfRoof",value:function(e){return e===ge.Top||e===ge.Mid||e===ge.TopMid}},{key:"isMoveHandle",value:function(e){return e===B.Default||e===B.Top||e===B.Upper||e===B.Lower||e===B.Left||e===B.Right}},{key:"snapToNormalGrid",value:function(e){var t=Math.round(e.x/mt)*mt,l=Math.round(e.y/mt)*mt;return new Me.Vector3(t,l,e.z)}},{key:"snapToFineGrid",value:function(e){var t=Math.round(e.x/gt)*gt,l=Math.round(e.y/gt)*gt;return new Me.Vector3(t,l,e.z)}},{key:"isPositionRelative",value:function(e){return e===V.SolarPanel||e===V.ParabolicTrough||e===V.ParabolicDish||e===V.FresnelReflector||e===V.Heliostat||e===V.WaterHeater||e===V.Sensor||e===V.Light||e===V.Polygon||e===V.Window||e===V.Door||e===V.Roof||e===V.Wall}},{key:"isPlantOrHuman",value:function(e){return e.type===V.Tree||e.type===V.Flower||e.type===V.Human}},{key:"isFoundationOrCuboid",value:function(e){return e.type===V.Foundation||e.type===V.Cuboid}},{key:"isSolarCollector",value:function(t){return e.isSolarCollectorType(t.type)}},{key:"isSolarCollectorType",value:function(t){return t===V.SolarPanel||t===V.WaterHeater||e.isCspCollectorType(t)}},{key:"isCspCollector",value:function(t){return e.isCspCollectorType(t.type)}},{key:"isCspCollectorType",value:function(e){return e===V.ParabolicDish||e===V.ParabolicTrough||e===V.FresnelReflector||e===V.Heliostat}},{key:"isParabolicCollector",value:function(t){return e.isParabolaType(t.type)}},{key:"isParabolaType",value:function(e){return e===V.ParabolicDish||e===V.ParabolicTrough}},{key:"isParabolicTroughOrFresnelReflector",value:function(e){return e===V.FresnelReflector||e===V.ParabolicTrough}},{key:"isHeliostatOrFresnelReflector",value:function(e){return e===V.FresnelReflector||e===V.Heliostat}},{key:"isLegalOnWall",value:function(e){switch(e){case V.Window:case V.Door:case V.Sensor:case V.Light:case V.SolarPanel:case V.Polygon:return!0}return!1}},{key:"isDescendantOf",value:function(t,l){var a=t.parentId;if(!a||a===xt)return!1;var o=Ew.getState().getElementById(a);return!!o&&(o.id===l||e.isDescendantOf(o,l))}},{key:"isElementInsideWall",value:function(t,l,a,o,i){for(var r=l/2,n=a/2,c=-1;c<=1;c+=2)for(var s=-1;s<=1;s+=2)if(!i||-1!==s){var d=t.x+r*c,u=t.z+n*s;if(!e.isPointInside(d,u,o))return!1}var h,p=[{x:t.x-r,y:t.z-n},{x:t.x-r,y:t.z+n},{x:t.x+r,y:t.z+n},{x:t.x+r,y:t.z-n}],y=Object(f.a)(o);try{for(y.s();!(h=y.n()).done;){var g=h.value;if(e.isPointInside(g.x,g.y,p))return!1}}catch(m){y.e(m)}finally{y.f()}return!0}},{key:"checkElementOnWallState",value:function(t,l){var a=1e-5,o=t.lx/2+a,i=t.lz/2+a;l&&t.type===V.SolarPanel&&(o=o/l.lx+a,i=t.ly/2/l.lz+a);var r=t.cx-o,n=t.cx+o,c=t.cz-i,s=t.cz+i;if(l&&l.type===V.Wall&&!e.isElementInsideWall(new Me.Vector3(t.cx*l.lx,t.cy,t.cz*l.lz),l.lx*o*2,l.lz*i*2,e.getWallInnerSideShapePoints(l),t.type===V.Door))return ye.OutsideBoundary;var d,u=Object(f.a)(Ew.getState().elements);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(e.isLegalOnWall(h.type)&&h.type!==V.Polygon&&h.parentId===t.parentId&&h.id!==t.id){var p=h.lx/2,y=h.lz/2;l&&h.type===V.SolarPanel&&(p/=l.lx,y=h.ly/2/l.lz);var g=h.cx-p,m=h.cx+p,w=h.cz-y,x=h.cz+y;if((r>=g&&r<=m||n>=g&&n<=m||g>=r&&g<=n||m>=r&&m<=n)&&(c>=w&&c<=x||s>=w&&s<=x||w>=c&&w<=s||x>=c&&x<=s))return ye.OverLap}}}catch(v){u.e(v)}finally{u.f()}return ye.Valid}},{key:"checkElementOnRoofState",value:function(e,t){if(e.foundationId){var l=Ew.getState().getElementById(e.foundationId);if(l){var a=Vm.getSolarPanelVerticesOnRoof(e,l),o=Vm.getRoofBoundaryVertices(t);return Vm.rooftopElementBoundaryCheck(a,o)?Vm.rooftopSPCollisionCheck(e,l,a)?ye.Valid:ye.OverLap:ye.OutsideBoundary}}return ye.Invalid}},{key:"relativeCoordinates",value:function(t,l,a,o){var i=new Me.Vector3(t,l,a);if(o.type===V.Wall){var r=new Me.Vector3(o.cx,o.cy),n=Ew.getState().getParent(o);if(n){var c=new Me.Vector3(n.cx,n.cy);r.applyEuler(new Me.Euler(0,0,n.rotation[2])).add(c).setZ(n.lz+o.lz/2),i.sub(r).applyEuler(new Me.Euler(0,0,-o.relativeAngle-n.rotation[2]))}}else{var s=e.getWorldDataById(o.id),d=s.pos,u=s.rot;i.set(t-d.x,l-d.y,a-d.z),i.applyEuler(new Me.Euler(0,0,-u))}return i.x/=o.lx,i.y/=o.ly,i.z/=o.lz,i}},{key:"absoluteCoordinates",value:function(t,l,a,o,i,r){if(o.type===V.Wall&&i){var n=o,c=i?i.rotation[2]+n.relativeAngle:n.relativeAngle;if(void 0!==c){var s=e.wallAbsolutePosition(new Me.Vector3(n.cx,n.cy,n.cz),i).setZ(n.lz/2+i.lz),d=new Me.Vector3(t*n.lx,l*n.ly,a*n.lz);if(d.applyAxisAngle(Rt,c),r){var u=r*Math.cos(c-vt),f=r*Math.sin(c-vt);return new Me.Vector3(s.x+d.x+u,s.y+d.y+f,s.z+d.z)}return new Me.Vector3(s.x+d.x,s.y+d.y,s.z+d.z)}}if(o.type===V.Roof&&i){var h=new Me.Vector3(t*i.lx,l*i.ly,a+i.lz);return h.applyEuler((new Me.Euler).fromArray(i.rotation)),h.x+=i.cx,h.y+=i.cy,h}var p=new Me.Vector3(t*o.lx,l*o.ly,a*o.lz);return p.applyEuler((new Me.Euler).fromArray(o.rotation)),p.x+=o.cx,p.y+=o.cy,p.z+=o.cz,p}},{key:"absoluteHumanOrTreeCoordinates",value:function(e,t,l,a){var o=new Me.Vector3(e,t,l);return o.applyEuler((new Me.Euler).fromArray(a.rotation)),o.x+=a.cx,o.y+=a.cy,o.z+=a.cz,o}},{key:"relativePoint",value:function(e,t){var l=new Me.Vector3(e.x-t.cx,e.y-t.cy,e.z-t.cz);return l.applyEuler((new Me.Euler).fromArray(t.rotation.map((function(e){return-e})))),l}},{key:"wallAbsolutePosition",value:function(e,t){var l=new Me.Vector3(t.cx,t.cy);return(new Me.Vector3).addVectors(l,new Me.Vector3(e.x,e.y).applyAxisAngle(Rt,t.rotation[2]))}},{key:"wallRelativePosition",value:function(e,t){var l=new Me.Vector3(t.cx,t.cy);return(new Me.Vector3).subVectors(new Me.Vector3(e.x,e.y),l).applyAxisAngle(Rt,-t.rotation[2])}},{key:"getObjectChildById",value:function(t,l){if(t){var a,o=Object(f.a)(t.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name===vw){var r=e.getStackCuboidObjectById(i,l);if(r)return r}else if(i.name.includes(l))return i}}catch(n){o.e(n)}finally{o.f()}}return null}},{key:"getStackCuboidObjectById",value:function(t,l){if(t){var a,o=Object(f.a)(t.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes(l))return i;if(i.name===bw){var r=e.getStackCuboidObjectById(i.children[0],l);if(r)return r}}}catch(n){o.e(n)}finally{o.f()}}return null}},{key:"toRadians",value:function(e){return e*(Math.PI/180)}},{key:"toDegrees",value:function(e){return e*(180/Math.PI)}},{key:"getArrayMax",value:function(e){return e.reduce((function(e,t){return Math.max(e,t)}))}},{key:"getArrayMin",value:function(e){return e.reduce((function(e,t){return Math.min(e,t)}))}},{key:"getArrayMax2D",value:function(t){return e.getArrayMax(t.map(e.getArrayMax))}},{key:"getArrayMin2D",value:function(t){return e.getArrayMin(t.map(e.getArrayMin))}},{key:"sphericalToCartesianZ",value:function(e){var t=e.x*Math.cos(e.z),l=t*Math.cos(e.y),a=t*Math.sin(e.y),o=e.x*Math.sin(e.z);return e.set(l,a,o),e}},{key:"getDistance",value:function(t,l,a,o){return t=e.toRadians(t),l=e.toRadians(l),a=e.toRadians(a),o=e.toRadians(o),Math.acos(Math.sin(l)*Math.sin(o)+Math.cos(l)*Math.cos(o)*Math.cos(Math.abs(t-a)))}},{key:"minutesIntoDay",value:function(e){return 60*e.getHours()+e.getMinutes()}},{key:"dayOfYear",value:function(e){return(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())-Date.UTC(e.getFullYear(),0,0))/864e5}},{key:"daysInYear",value:function(e){var t=e.getFullYear();return t%4===0&&t%100>0||t%400===0?366:365}},{key:"daysOfMonth",value:function(e,t){return new Date(t,e+1,0).getDate()}},{key:"fahrenheitToCelsius",value:function(e){return 5*(e-32)/9}},{key:"celsiusToFahrenheit",value:function(e){return 1.8*e+32}},{key:"getOS",value:function(){var e;return null===(e=kt.a.os)||void 0===e?void 0:e.family}},{key:"isMac",value:function(){var t=e.getOS();return!!t&&(t.includes("Mac")||t.includes("OS X"))}},{key:"isChrome",value:function(){var t=e.getOS();return!!t&&t.includes("Chrome")}},{key:"detectWebGLContext",value:function(){try{var e=document.createElement("canvas");return!!window.WebGLRenderingContext&&(!!e.getContext("webgl")||!!e.getContext("experimental-webgl"))}catch(t){return!1}}},{key:"clamp",value:function(e,t,l){return t>l?(t+l)/2:Math.min(Math.max(e,t),l)}},{key:"distanceFromPointToLine2D",value:function(e,t,l){var a,o,i=[e.x,e.y],r=i[0],n=i[1],c=[t.x,t.y],s=c[0],d=c[1],u=[l.x,l.y],f=u[0],h=u[1],p=f-s,y=h-d,g=p*p+y*y,m=-1;0!==g&&(m=((r-s)*p+(n-d)*y)/g),m<0?(a=s,o=d):m>1?(a=f,o=h):(a=s+m*p,o=d+m*y);var w=r-a,x=n-o;return Math.sqrt(w*w+x*x)}},{key:"mapVector3ToPoint2",value:function(e){return{x:e.x,y:e.y}}},{key:"getWallVertices",value:function(e,t){var l,a,o=e.lx/2,i=e.lz/2,r={x:-o-t,y:-i-t},n={x:o+t,y:-i-t},c={x:-o-t,y:(null!==(l=e.leftRoofHeight)&&void 0!==l?l:e.lz)-i+t},s={x:o+t,y:(null!==(a=e.rightRoofHeight)&&void 0!==a?a:e.lz)-i+t},d=[];return d.push(c,r,n,s),e.centerRightRoofHeight&&d.push({x:e.centerRightRoofHeight[0]*e.lx,y:e.centerRightRoofHeight[1]-i+t}),e.centerRoofHeight&&d.push({x:e.centerRoofHeight[0]*e.lx,y:e.centerRoofHeight[1]-i+t}),e.centerLeftRoofHeight&&d.push({x:e.centerLeftRoofHeight[0]*e.lx,y:e.centerLeftRoofHeight[1]-i+t}),d}},{key:"isPartialWallFull",value:function(t){var l,a;return e.isZero((null!==(l=t.leftRoofHeight)&&void 0!==l?l:t.lz)-t.leftTopPartialHeight)&&e.isZero((null!==(a=t.rightRoofHeight)&&void 0!==a?a:t.lz)-t.rightTopPartialHeight)&&e.isZero(t.leftUnfilledHeight)&&e.isZero(t.rightUnfilledHeight)}},{key:"getPartialWallVertices",value:function(t,l){if(e.isPartialWallFull(t))return e.getWallVertices(t,l);var a=t.lx/2,o=t.lz/2,i={x:-a-l,y:t.leftUnfilledHeight-o-l},r={x:a+l,y:t.rightUnfilledHeight-o-l},n={x:-a-l,y:t.leftTopPartialHeight-o+l},c={x:a+l,y:t.rightTopPartialHeight-o+l},s=[];return s.push(n,i,r,c),t.centerRightRoofHeight&&s.push({x:t.centerRightRoofHeight[0]*t.lx,y:t.centerRightRoofHeight[1]-o+l}),t.centerRoofHeight&&s.push({x:t.centerRoofHeight[0]*t.lx,y:t.centerRoofHeight[1]-o+l}),t.centerLeftRoofHeight&&s.push({x:t.centerLeftRoofHeight[0]*t.lx,y:t.centerLeftRoofHeight[1]-o+l}),s}},{key:"getHighestPointOfWall",value:function(e){var t=e.lz;return e.leftRoofHeight&&(t=Math.max(t,e.leftRoofHeight)),e.rightRoofHeight&&(t=Math.max(t,e.rightRoofHeight)),e.centerRightRoofHeight&&(t=Math.max(t,e.centerRightRoofHeight[1])),e.centerRoofHeight&&(t=Math.max(t,e.centerRoofHeight[1])),e.centerLeftRoofHeight&&(t=Math.max(t,e.centerLeftRoofHeight[1])),t}},{key:"getWallPointsOfRoof",value:function(e,t){var l=null!==t&&void 0!==t?t:Ew.getState().getElementById(e.wallsId[0]);if(!l)return[];for(var a=l,o=[];l&&(!l.roofId||l.roofId===e.id);){var i;if(o.push({x:l.leftPoint[0],y:l.leftPoint[1],eave:null!==(i=l.eavesLength)&&void 0!==i?i:0}),!l.leftJoints[0])break;if(l.leftJoints[0]===a.id)return o.reverse(),o;l=Ew.getState().getElementById(l.leftJoints[0])}for(o.reverse(),l=Ew.getState().getElementById(null===a||void 0===a?void 0:a.rightJoints[0]);l&&(!l.roofId||l.roofId===e.id);){var r;if(o.push({x:l.leftPoint[0],y:l.leftPoint[1],eave:null!==(r=l.eavesLength)&&void 0!==r?r:0}),!l.rightJoints[0]||l.rightJoints[0]===a.id)break;l=Ew.getState().getElementById(l.rightJoints[0])}return o}},{key:"getWallInnerSideShapePoints",value:function(t){var l=t.lx,a=t.ly,o=t.lz,i=t.relativeAngle,r=t.fill,n=t.leftUnfilledHeight,c=t.rightUnfilledHeight,s=t.leftRoofHeight,d=t.centerLeftRoofHeight,u=t.centerRoofHeight,f=t.centerRightRoofHeight,h=t.rightRoofHeight,p=t.leftJoints,y=t.rightJoints,g=p.length>0?Ew.getState().getElementById(p[0]):null,m=y.length>0?Ew.getState().getElementById(y[0]):null,w=g&&g.type===V.Wall?e.getInnerWallOffset(g,l,a,i,"left"):0,x=m&&m.type===V.Wall?e.getInnerWallOffset(m,l,a,i,"right"):0,v=[],b=l/2,A=o/2;return r===Ue.Partial?(v.push({x:-b+w,y:-A+n}),v.push({x:b-x,y:-A+c})):(v.push({x:-b+w,y:-A}),v.push({x:b-x,y:-A})),h?v.push({x:b-x,y:h-A}):v.push({x:b-x,y:A}),f&&v.push({x:f[0]*l,y:f[1]-A}),u&&v.push({x:u[0]*l,y:u[1]-A}),d&&v.push({x:d[0]*l,y:d[1]-A}),s?v.push({x:-b+w,y:s-A}):v.push({x:-b+w,y:A}),v}},{key:"getInnerWallOffset",value:function(e,t,l,a,o){var i=0;if(e&&e.fill!==Ue.Empty){var r="left"===o?-1:1,n=(3*Math.PI+r*(a-e.relativeAngle))%bt;n<=vt+.01&&n>0&&(i=Math.min(l/Math.tan(n)+e.ly,t))}return i}},{key:"isElementAllowedMultipleMoveOnGround",value:function(e){return e.type===V.Foundation||e.type===V.Cuboid&&e.parentId===xt}}]),e}();Tw.WATER_TEXTURE=Tw.fetchWaterTexture(100,100),Tw.WHITE_TEXTURE=Tw.fetchWhiteTexture(2,2),Tw.getAllConnectedWalls=function(e){for(var t=Ew.getState().getElementById,l=[],a=e;e&&(l.push(e),e.leftJoints[0]);){if(e.leftJoints[0]===a.id)return l;var o=t(e.leftJoints[0]);o&&o.type===V.Wall&&(e=o)}var i=t(a.rightJoints[0]);for(i&&i.type===V.Wall&&(e=i);e&&(l.push(e),e.rightJoints[0]&&e.rightJoints[0]!==a.id);){var r=t(e.rightJoints[0]);r&&(e=r)}return l},Tw.getWorldDataById=function(e){var t=Ew.getState().getElementById(e);if(!t)return{pos:new Me.Vector3,rot:0,topZ:0};var l=new Me.Vector3(t.cx,t.cy,t.cz),a=t.rotation[2],o=t.lz;if(t.parentId===xt)return{pos:l,rot:a,topZ:o};var i=Tw.getWorldDataById(t.parentId),r=i.pos,n=i.rot,c=i.topZ,s=new Me.Euler(0,0,n);return{pos:(new Me.Vector3).addVectors(l.applyEuler(s),r.clone().setZ(c)),rot:a+n,topZ:o+c}},Tw.isChild=function(e,t){var l=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=Ew.getState().getElementById(t);return!!a&&((!l||!a.locked)&&(a.parentId===e||Tw.isChild(e,a.parentId,l)))},Tw.getBaseId=function(e){var t=Ew.getState().getElementById(e);return t?t.parentId===xt?t.id:Tw.getBaseId(t.parentId):null},Tw.isElementTriggerAutoDeletion=function(e){if(e.type===V.Roof){var t=e;if(t.roofType===It.Gable||t.roofType===It.Gambrel)return!0}if(e.type!==V.Wall)return!1;var l=e;if(!l.roofId)return!1;var a=Ew.getState().getElementById(l.roofId);if(!a)return!1;switch(a.roofType){case It.Hip:case It.Gable:case It.Gambrel:return!0;case It.Pyramid:case It.Mansard:return 0!==a.wallsId.length&&a.wallsId[0]===l.id;default:return!1}};var Pw=function(){function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.name=void 0,this.date=void 0,this.ground=void 0,this.latitude=void 0,this.longitude=void 0,this.address=void 0,this.countryCode=void 0,this.leafDayOfYear1=void 0,this.leafDayOfYear2=void 0,this.airAttenuationCoefficient=void 0,this.airConvectiveCoefficient=void 0,this.timesPerHour=void 0,this.daysPerYear=void 0,this.monthlyIrradianceLosses=void 0,this.pvGridCellSize=void 0,this.discretization=void 0,this.diurnalTemperatureModel=void 0,this.highestTemperatureTimeInMinutes=void 0,this.solarPanelVisibilityGridCellSize=void 0,this.solarRadiationHeatmapGridCellSize=void 0,this.cspTimesPerHour=void 0,this.cspDaysPerYear=void 0,this.cspGridCellSize=void 0,this.sutTimesPerHour=void 0,this.sutDaysPerYear=void 0,this.sutGridCellSize=void 0,this.noAnimationForHeatmapSimulation=void 0,this.noAnimationForThermalSimulation=void 0,this.noAnimationForSensorDataCollection=void 0,this.noAnimationForSolarPanelSimulation=void 0,this.noAnimationForSolarUpdraftTowerSimulation=void 0,this.latitude=42.2844063,this.longitude=-71.3488548,this.address=Xe,this.countryCode="US",this.date=new Date((new Date).getFullYear(),5,22,12).toLocaleString("en-US"),this.name="default",this.ground={albedo:.3,thermalDiffusivity:.05,snowReflectionFactors:new Array(12).fill(0)},this.leafDayOfYear1=rt,this.leafDayOfYear2=nt,this.airAttenuationCoefficient=.01,this.airConvectiveCoefficient=5,this.timesPerHour=1,this.daysPerYear=12,this.monthlyIrradianceLosses=new Array(12).fill(.05),this.pvGridCellSize=.5,this.discretization=ae.APPROXIMATE,this.diurnalTemperatureModel=U.Sinusoidal,this.highestTemperatureTimeInMinutes=900,this.solarPanelVisibilityGridCellSize=.2,this.solarRadiationHeatmapGridCellSize=.5,this.cspTimesPerHour=1,this.cspDaysPerYear=4,this.cspGridCellSize=.5,this.sutTimesPerHour=1,this.sutDaysPerYear=4,this.sutGridCellSize=1,this.noAnimationForHeatmapSimulation=!1,this.noAnimationForThermalSimulation=!1,this.noAnimationForSensorDataCollection=!1,this.noAnimationForSolarPanelSimulation=!1,this.noAnimationForSolarUpdraftTowerSimulation=!1}return Object(Fe.a)(e,[{key:"getElements",value:function(){var e=[],t={type:V.Foundation,cx:0,cy:0,cz:.05,lx:10,ly:10,lz:.1,normal:[0,0,1],rotation:[0,0,0],parentId:xt,textureType:se.NoTexture,id:m.a.generate()};e.push(t);var l={type:V.Sensor,cx:-.1,cy:0,cz:.105,lx:.1,ly:.1,lz:.01,parentId:t.id,foundationId:t.id,normal:[0,0,1],rotation:[0,0,0],id:m.a.generate(),showLabel:!0,light:!0,heatFlux:!1};e.push(l);var a={type:V.Human,name:ne.Judd,cx:1,cy:-1,cz:0,lx:Tl.fetchWidth(ne.Jiya),lz:Tl.fetchHeight(ne.Jiya),normal:[1,0,0],rotation:[0,0,0],parentId:xt,id:m.a.generate()};return e.push(a),e}}],[{key:"resetWorldModel",value:function(e){e.latitude=42.2844063,e.longitude=-71.3488548,e.address=Xe,e.countryCode="US",e.date=new Date((new Date).getFullYear(),5,22,12).toLocaleString("en-US"),e.name="default",e.ground.albedo=.3,e.ground.thermalDiffusivity=.05,e.ground.snowReflectionFactors.fill(0),e.airAttenuationCoefficient=.01,e.airConvectiveCoefficient=5,e.timesPerHour=1,e.daysPerYear=12,e.monthlyIrradianceLosses=new Array(12).fill(.05),e.pvGridCellSize=.5,e.discretization=ae.APPROXIMATE,e.diurnalTemperatureModel=U.Sinusoidal,e.highestTemperatureTimeInMinutes=900,e.solarPanelVisibilityGridCellSize=.2,e.solarRadiationHeatmapGridCellSize=.5,e.cspTimesPerHour=1,e.cspDaysPerYear=4,e.cspGridCellSize=.5,e.sutTimesPerHour=1,e.sutDaysPerYear=4,e.sutGridCellSize=1,e.noAnimationForHeatmapSimulation=!1,e.noAnimationForThermalSimulation=!1,e.noAnimationForSensorDataCollection=!1,e.noAnimationForSolarPanelSimulation=!1,e.noAnimationForSolarUpdraftTowerSimulation=!1}}]),e}(),Sw=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"clone",value:function(t,l,a,o,i,r,n,c){var s=null;switch(l.type){case V.Polygon:t&&(s=e.clonePolygon(t,l,a,o,i,r,n));break;case V.Sensor:t&&(s=e.cloneSensor(t,l,a,o,i));break;case V.Light:t&&(s=e.cloneLight(t,l,a,o,i));break;case V.SolarPanel:t&&(s=e.cloneSolarPanel(t,l,a,o,i));break;case V.ParabolicTrough:t&&(s=e.cloneParabolicTrough(t,l,a,o,i));break;case V.ParabolicDish:t&&(s=e.cloneParabolicDish(t,l,a,o,i));break;case V.FresnelReflector:t&&(s=e.cloneFresnelReflector(t,l,a,o,i));break;case V.Heliostat:t&&(s=e.cloneHeliostat(t,l,a,o,i));break;case V.WindTurbine:t&&(s=e.cloneWindTurbine(t,l,a,o,i));break;case V.Wall:t&&(s=e.cloneWall(t,l,a,o,i));break;case V.Window:t&&(s=e.cloneWindow(t,l,a,o,i,c));break;case V.Door:t&&(s=e.cloneDoor(t,l,a,o,i));break;case V.Roof:t&&(s=e.cloneRoof(t,l,a,o,i));break;case V.Human:s=e.cloneHuman(l,a,o,i,t);break;case V.Tree:s=e.cloneTree(l,a,o,i,t);break;case V.Flower:s=e.cloneFlower(l,a,o,i,t);break;case V.Foundation:s=e.cloneFoundation(l,a,o);break;case V.Cuboid:var d=t?t.id:xt;s=e.cloneCuboid(d,l,a,o)}return s}},{key:"cloneHuman",value:function(e,t,l,a,o){var i;return{type:V.Human,name:e.name,flip:e.flip,cx:t,cy:l,cz:a,lx:e.lx,ly:e.ly,lz:e.lz,normal:Object(h.a)(e.normal),rotation:Object(h.a)(e.rotation),parentId:null!==(i=null===o||void 0===o?void 0:o.id)&&void 0!==i?i:e.parentId,id:m.a.generate()}}},{key:"cloneTree",value:function(e,t,l,a,o){var i;return{type:V.Tree,name:e.name,flip:e.flip,cx:t,cy:l,cz:a,lx:e.lx,ly:e.ly,lz:e.lz,normal:Object(h.a)(e.normal),rotation:Object(h.a)(e.rotation),parentId:null!==(i=null===o||void 0===o?void 0:o.id)&&void 0!==i?i:e.parentId,id:m.a.generate()}}},{key:"cloneFlower",value:function(e,t,l,a,o){var i;return{type:V.Flower,name:e.name,flip:e.flip,cx:t,cy:l,cz:a,lx:e.lx,ly:e.ly,lz:e.lz,normal:Object(h.a)(e.normal),rotation:Object(h.a)(e.rotation),parentId:null!==(i=null===o||void 0===o?void 0:o.id)&&void 0!==i?i:e.parentId,id:m.a.generate()}}},{key:"clonePolygon",value:function(e,t,l,a,o,i,r){var n;switch(e.type){case V.Foundation:case V.Cuboid:n=e.id;break;case V.Wall:case V.Roof:n=e.parentId}var c=t.vertices.map((function(e){return Object(d.a)({},e)})),s={type:V.Polygon,cx:l,cy:a,cz:o,lx:t.lx,ly:t.ly,lz:t.lz,filled:t.filled,noOutline:t.noOutline,color:t.color,lineColor:t.lineColor,lineWidth:t.lineWidth,opacity:t.opacity,textureType:t.textureType,text:t.text,fontSize:t.fontSize,fontColor:t.fontColor,normal:Object(h.a)(t.normal),rotation:t.parentId?Object(h.a)(e.rotation):[0,0,0],vertices:c,parentId:e.id,parentType:e.type,foundationId:n,id:m.a.generate()};if(!i){var u=l,p=a;if(e.type===V.Cuboid&&r){Tw.isSame(r,jt)?u=null!==o&&void 0!==o?o:0:Tw.isSame(r,St)?u=-(null!==o&&void 0!==o?o:0):Tw.isSame(r,zt)?p=null!==o&&void 0!==o?o:0:Tw.isSame(r,Ht)&&(p=-(null!==o&&void 0!==o?o:0));var y=r.dot((new Me.Vector3).fromArray(t.normal));if(Math.abs(y)0&&this.commands.length>this.limit&&this.commands.splice(0,this.commands.length-this.limit),this.index=this.commands.length-1)}},{key:"undo",value:function(){var e=this.commands[this.index];if(e)return this.isExecuting=!0,e.undo(),this.isExecuting=!1,this.index--,e.name}},{key:"redo",value:function(){var e=this.commands[this.index+1];if(e)return this.isExecuting=!0,e.redo(),this.isExecuting=!1,this.index++,e.name}},{key:"clear",value:function(){this.commands=[],this.index=-1}},{key:"hasUndo",value:function(){return-1!==this.index}},{key:"hasRedo",value:function(){return this.index0||this.cuboidCount>0||this.wallCount>0||this.windowCount>0||this.doorCount>0||this.humanCount>0||this.treeCount>0||this.flowerCount>0||this.polygonCount>0||this.sensorCount>0||this.insideLightCount>0||this.outsideLightCount>0||this.solarPanelCount>0||this.parabolicTroughCount>0||this.parabolicDishCount>0||this.fresnelReflectorCount>0||this.heliostatCount>0||this.solarUpdraftTowerCount>0||this.windTurbineCount>0}}]),e}(),Dw=function e(t){Object(He.a)(this,e),this[Pe.c]=!0,this.problem=void 0,this.objectiveFunctionType=void 0,this.selectionMethod=void 0,this.searchMethod=void 0,this.populationSize=void 0,this.maximumGenerations=void 0,this.selectionRate=void 0,this.crossoverRate=void 0,this.mutationRate=void 0,this.convergenceThreshold=void 0,this.localSearchRadius=void 0,this.problem=t,this.objectiveFunctionType=W.DAILY_TOTAL_OUTPUT,this.selectionMethod=C.ROULETTE_WHEEL,this.searchMethod=O.GLOBAL_SEARCH_UNIFORM_SELECTION,this.populationSize=20,this.maximumGenerations=5,this.selectionRate=.5,this.crossoverRate=.5,this.mutationRate=.1,this.convergenceThreshold=.01,this.localSearchRadius=.1},Mw=function e(t){Object(He.a)(this,e),this[Pe.c]=!0,this.problem=void 0,this.objectiveFunctionType=void 0,this.searchMethod=void 0,this.swarmSize=void 0,this.maximumSteps=void 0,this.vmax=void 0,this.inertia=void 0,this.cognitiveCoefficient=void 0,this.socialCoefficient=void 0,this.convergenceThreshold=void 0,this.localSearchRadius=void 0,this.problem=t,this.objectiveFunctionType=W.DAILY_TOTAL_OUTPUT,this.searchMethod=O.GLOBAL_SEARCH_UNIFORM_SELECTION,this.swarmSize=20,this.maximumSteps=5,this.vmax=.01,this.inertia=.8,this.cognitiveCoefficient=.1,this.socialCoefficient=.1,this.convergenceThreshold=.01,this.localSearchRadius=.1},Ww=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.geneticAlgorithmParams=void 0,this.particleSwarmOptimizationParams=void 0,this.geneticAlgorithmParams=new Dw(M.SOLAR_PANEL_TILT_ANGLE),this.particleSwarmOptimizationParams=new Mw(M.SOLAR_PANEL_TILT_ANGLE)},Iw=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.minimumInterRowSpacing=void 0,this.maximumInterRowSpacing=void 0,this.minimumRowsPerRack=void 0,this.maximumRowsPerRack=void 0,this.minimumTiltAngle=void 0,this.maximumTiltAngle=void 0,this.poleHeight=void 0,this.poleSpacing=void 0,this.orientation=void 0,this.pvModelName=void 0,this.rowAxis=void 0,this.margin=void 0,this.minimumInterRowSpacing=2,this.maximumInterRowSpacing=10,this.minimumRowsPerRack=1,this.maximumRowsPerRack=6,this.minimumTiltAngle=-vt,this.maximumTiltAngle=vt,this.poleHeight=1,this.poleSpacing=5,this.orientation=$.landscape,this.pvModelName="CS6X-355P-FG",this.rowAxis=ee.leftRight},Cw=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.projectLifeSpan=void 0,this.electricitySellingPrice=void 0,this.operationalCostPerUnit=void 0,this.projectLifeSpan=25,this.electricitySellingPrice=.25,this.operationalCostPerUnit=.15},Ow=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.humanName=void 0,this.flowerType=void 0,this.treeType=void 0,this.treeSpread=void 0,this.treeHeight=void 0,this.foundationHeight=void 0,this.foundationColor=void 0,this.foundationTexture=void 0,this.groundFloorRValue=void 0,this.cuboidHeight=void 0,this.cuboidFaceColors=void 0,this.cuboidFaceTextures=void 0,this.cuboidStackable=void 0,this.wallHeight=void 0,this.wallThickness=void 0,this.wallColor=void 0,this.wallTexture=void 0,this.wallStructure=void 0,this.wallStructureSpacing=void 0,this.wallStructureWidth=void 0,this.wallStructureColor=void 0,this.wallOpacity=void 0,this.wallRValue=void 0,this.wallVolumetricHeatCapacity=void 0,this.wallEavesLength=void 0,this.wallParapet=void 0,this.roofColor=void 0,this.roofSideColor=void 0,this.roofTexture=void 0,this.roofThickness=void 0,this.roofStructure=void 0,this.roofGlassOpacity=void 0,this.roofGlassTint=void 0,this.roofRafterWidth=void 0,this.roofRafterSpacing=void 0,this.roofRafterColor=void 0,this.roofRValue=void 0,this.roofVolumetricHeatCapacity=void 0,this.roofRise=void 0,this.roofCeiling=void 0,this.ceilingRValue=void 0,this.doorColor=void 0,this.doorFrameColor=void 0,this.doorTexture=void 0,this.doorType=void 0,this.doorArchHeight=void 0,this.doorFilled=void 0,this.doorInterior=void 0,this.doorUValue=void 0,this.doorOpacity=void 0,this.doorVolumetricHeatCapacity=void 0,this.windowWidth=void 0,this.windowHeight=void 0,this.windowColor=void 0,this.windowTint=void 0,this.windowOpacity=void 0,this.windowUValue=void 0,this.windowHorizontalMullion=void 0,this.windowVerticalMullion=void 0,this.windowMullionWidth=void 0,this.windowHorizontalMullionSpacing=void 0,this.windowVerticalMullionSpacing=void 0,this.windowMullionColor=void 0,this.windowShutterLeft=void 0,this.windowShutterRight=void 0,this.windowShutterColor=void 0,this.windowShutterWidth=void 0,this.windowFrame=void 0,this.windowFrameWidth=void 0,this.windowSillWidth=void 0,this.windowType=void 0,this.windowArchHeight=void 0,this.windowEmpty=void 0,this.windowInterior=void 0,this.solarPanelModelName=void 0,this.solarPanelOrientation=void 0,this.solarPanelPoleHeight=void 0,this.solarPanelPoleSpacing=void 0,this.solarPanelTiltAngle=void 0,this.solarPanelRelativeAzimuth=void 0,this.solarPanelFrameColor=void 0,this.parabolicDishReflectance=void 0,this.parabolicDishAbsorptance=void 0,this.parabolicDishOpticalEfficiency=void 0,this.parabolicDishThermalEfficiency=void 0,this.parabolicDishRimDiameter=void 0,this.parabolicDishLatusRectum=void 0,this.parabolicDishPoleHeight=void 0,this.parabolicDishPoleRadius=void 0,this.parabolicDishReceiverStructure=void 0,this.parabolicTroughReflectance=void 0,this.parabolicTroughAbsorptance=void 0,this.parabolicTroughOpticalEfficiency=void 0,this.parabolicTroughThermalEfficiency=void 0,this.parabolicTroughLatusRectum=void 0,this.parabolicTroughPoleHeight=void 0,this.parabolicTroughWidth=void 0,this.parabolicTroughModuleLength=void 0,this.fresnelReflectorReceiver=void 0,this.fresnelReflectorReflectance=void 0,this.fresnelReflectorPoleHeight=void 0,this.fresnelReflectorWidth=void 0,this.fresnelReflectorModuleLength=void 0,this.heliostatTower=void 0,this.heliostatReflectance=void 0,this.heliostatPoleHeight=void 0,this.heliostatPoleRadius=void 0,this.heliostatWidth=void 0,this.heliostatLength=void 0,this.lightColor=void 0,this.lightIntensity=void 0,this.lightDistance=void 0,this.humanName=ne.Jack,this.flowerType=ie.YellowFlower,this.treeType=oe.Dogwood,this.treeSpread=3,this.treeHeight=4,this.foundationHeight=.1,this.foundationColor="#808080",this.foundationTexture=se.NoTexture,this.groundFloorRValue=2,this.cuboidHeight=4,this.cuboidFaceColors=["#808080","#808080","#808080","#808080","#808080","#808080"],this.cuboidFaceTextures=[de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture],this.cuboidStackable=!1,this.wallHeight=5,this.wallThickness=.3,this.wallColor="#ffffff",this.wallTexture=ue.Default,this.wallStructure=Ne.Default,this.wallStructureSpacing=2,this.wallStructureWidth=.1,this.wallStructureColor="#ffffff",this.wallOpacity=.5,this.wallRValue=2,this.wallVolumetricHeatCapacity=.5,this.wallEavesLength=.3,this.wallParapet=Sm,this.roofColor="#454769",this.roofSideColor="#ffffff",this.roofTexture=he.Default,this.roofThickness=.2,this.roofStructure=Ct.Default,this.roofGlassOpacity=.5,this.roofGlassTint="#73D8FF",this.roofRafterWidth=.1,this.roofRafterSpacing=1,this.roofRafterColor="#ffffff",this.roofRValue=2,this.roofVolumetricHeatCapacity=.5,this.roofRise=2,this.roofCeiling=!1,this.ceilingRValue=2,this.doorColor="#ffffff",this.doorFrameColor="#ffffff",this.doorTexture=fe.Default,this.doorType=hy.Default,this.doorArchHeight=1,this.doorFilled=!0,this.doorInterior=!1,this.doorUValue=1,this.doorOpacity=1,this.doorVolumetricHeatCapacity=.5,this.windowWidth=1,this.windowHeight=1,this.windowColor="#ffffff",this.windowTint="#73D8FF",this.windowOpacity=.5,this.windowUValue=2,this.windowHorizontalMullion=!0,this.windowVerticalMullion=!0,this.windowMullionWidth=.06,this.windowHorizontalMullionSpacing=.5,this.windowVerticalMullionSpacing=.5,this.windowMullionColor="#ffffff",this.windowFrame=!1,this.windowFrameWidth=.1,this.windowSillWidth=.1,this.windowType=Yt.Default,this.windowArchHeight=1,this.windowShutterLeft=!1,this.windowShutterRight=!1,this.windowShutterColor="gray",this.windowShutterWidth=.5,this.windowEmpty=!1,this.windowInterior=!1,this.solarPanelModelName="SPR-X21-335-BLK",this.solarPanelOrientation=$.landscape,this.solarPanelPoleHeight=1,this.solarPanelPoleSpacing=3,this.solarPanelTiltAngle=0,this.solarPanelRelativeAzimuth=0,this.solarPanelFrameColor="#ffffff",this.parabolicDishReflectance=.9,this.parabolicDishAbsorptance=.95,this.parabolicDishOpticalEfficiency=.7,this.parabolicDishThermalEfficiency=.3,this.parabolicDishRimDiameter=4,this.parabolicDishLatusRectum=8,this.parabolicDishPoleHeight=.2,this.parabolicDishPoleRadius=.1,this.parabolicDishReceiverStructure=J.CentralPole,this.parabolicTroughReflectance=.9,this.parabolicTroughAbsorptance=.95,this.parabolicTroughOpticalEfficiency=.7,this.parabolicTroughThermalEfficiency=.3,this.parabolicTroughLatusRectum=2,this.parabolicTroughPoleHeight=.2,this.parabolicTroughWidth=2,this.parabolicTroughModuleLength=3,this.fresnelReflectorReceiver="None",this.fresnelReflectorReflectance=.9,this.fresnelReflectorPoleHeight=.2,this.fresnelReflectorWidth=2,this.fresnelReflectorModuleLength=3,this.heliostatTower="None",this.heliostatReflectance=.9,this.heliostatPoleHeight=.2,this.heliostatPoleRadius=.1,this.heliostatWidth=4,this.heliostatLength=2,this.lightColor="#ffff99",this.lightIntensity=3,this.lightDistance=5},Fw=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.dailyPvIndividualOutputs=void 0,this.yearlyPvIndividualOutputs=void 0,this.dailyParabolicDishIndividualOutputs=void 0,this.yearlyParabolicDishIndividualOutputs=void 0,this.dailyParabolicTroughIndividualOutputs=void 0,this.yearlyParabolicTroughIndividualOutputs=void 0,this.dailyFresnelReflectorIndividualOutputs=void 0,this.yearlyFresnelReflectorIndividualOutputs=void 0,this.dailyHeliostatIndividualOutputs=void 0,this.yearlyHeliostatIndividualOutputs=void 0,this.dailyUpdraftTowerIndividualOutputs=void 0,this.yearlyUpdraftTowerIndividualOutputs=void 0,this.dailyPvIndividualOutputs=!1,this.yearlyPvIndividualOutputs=!1,this.dailyParabolicDishIndividualOutputs=!1,this.yearlyParabolicDishIndividualOutputs=!1,this.dailyParabolicTroughIndividualOutputs=!1,this.yearlyParabolicTroughIndividualOutputs=!1,this.dailyFresnelReflectorIndividualOutputs=!1,this.yearlyFresnelReflectorIndividualOutputs=!1,this.dailyHeliostatIndividualOutputs=!1,this.yearlyHeliostatIndividualOutputs=!1,this.dailyUpdraftTowerIndividualOutputs=!1,this.yearlyUpdraftTowerIndividualOutputs=!1},kw=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"getDefaultHiddenParameters",value:function(e){return e===M.SOLAR_PANEL_ARRAY?["latitude","orientation","poleHeight"]:[]}},{key:"getVariables",value:function(e,t){if(e===M.SOLAR_PANEL_ARRAY){var l=[];return t.includes("rowWidth")||l.push("rowWidth"),t.includes("tiltAngle")||l.push("tiltAngle"),t.includes("interRowSpacing")||l.push("interRowSpacing"),t.includes("latitude")||l.push("latitude"),t.includes("orientation")||l.push("orientation"),t.includes("poleHeight")||l.push("poleHeight"),t.includes("unitCost")||l.push("unitCost"),t.includes("sellingPrice")||l.push("sellingPrice"),t.includes("totalYearlyCost")||l.push("totalYearlyCost"),t.includes("totalYearlyYield")||l.push("totalYearlyYield"),t.includes("meanYearlyYield")||l.push("meanYearlyYield"),t.includes("yearlyProfit")||l.push("yearlyProfit"),l}return[]}},{key:"getTitles",value:function(e,t,l){if(e===M.SOLAR_PANEL_ARRAY){var a=[];return l.includes("rowWidth")||a.push(me.t("polygonMenu.SolarPanelArrayRowWidth",t)),l.includes("tiltAngle")||a.push(me.t("polygonMenu.SolarPanelArrayTiltAngle",t)),l.includes("interRowSpacing")||a.push(me.t("polygonMenu.SolarPanelArrayRowSpacing",t)),l.includes("latitude")||a.push(me.t("word.Latitude",t)),l.includes("orientation")||a.push(me.t("polygonMenu.SolarPanelArrayOrientation",t)),l.includes("poleHeight")||a.push(me.t("polygonMenu.SolarPanelArrayPoleHeight",t)),l.includes("unitCost")||a.push(me.t("economicsPanel.UnitCost",t)),l.includes("sellingPrice")||a.push(me.t("economicsPanel.SellingPrice",t)),l.includes("totalYearlyCost")||a.push(me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",t)),l.includes("totalYearlyYield")||a.push(me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",t)),l.includes("meanYearlyYield")||a.push(me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",t)),l.includes("yearlyProfit")||a.push(me.t("polygonMenu.SolarPanelArrayYearlyProfit",t)),a}return[]}},{key:"getTypes",value:function(e,t){if(e===M.SOLAR_PANEL_ARRAY){var l=[];return t.includes("rowWidth")||l.push("number"),t.includes("tiltAngle")||l.push("number"),t.includes("interRowSpacing")||l.push("number"),t.includes("latitude")||l.push("number"),t.includes("orientation")||l.push("boolean"),t.includes("poleHeight")||l.push("number"),t.includes("unitCost")||l.push("number"),t.includes("sellingPrice")||l.push("number"),t.includes("totalYearlyCost")||l.push("number"),t.includes("totalYearlyYield")||l.push("number"),t.includes("meanYearlyYield")||l.push("number"),t.includes("yearlyProfit")||l.push("number"),l}return[]}},{key:"getDigits",value:function(e,t){if(e===M.SOLAR_PANEL_ARRAY){var l=[];return t.includes("rowWidth")||l.push(0),t.includes("tiltAngle")||l.push(1),t.includes("interRowSpacing")||l.push(1),t.includes("latitude")||l.push(1),t.includes("orientation")||l.push(0),t.includes("poleHeight")||l.push(1),t.includes("unitCost")||l.push(2),t.includes("sellingPrice")||l.push(2),t.includes("totalYearlyCost")||l.push(1),t.includes("totalYearlyYield")||l.push(1),t.includes("meanYearlyYield")||l.push(1),t.includes("yearlyProfit")||l.push(3),l}return[]}},{key:"getTickIntegers",value:function(e,t){if(e===M.SOLAR_PANEL_ARRAY){var l=[];return t.includes("rowWidth")||l.push(!0),t.includes("tiltAngle")||l.push(!1),t.includes("interRowSpacing")||l.push(!1),t.includes("latitude")||l.push(!1),t.includes("orientation")||l.push(!0),t.includes("poleHeight")||l.push(!1),t.includes("unitCost")||l.push(!1),t.includes("sellingPrice")||l.push(!1),t.includes("totalYearlyCost")||l.push(!1),t.includes("totalYearlyYield")||l.push(!1),t.includes("meanYearlyYield")||l.push(!1),t.includes("yearlyProfit")||l.push(!1),l}return[]}},{key:"getUnits",value:function(e,t,l){if(e===M.SOLAR_PANEL_ARRAY){var a=[];return l.includes("rowWidth")||a.push(" "+me.t("solarPanelMenu.Panels",t)),l.includes("tiltAngle")||a.push("\xb0"),l.includes("interRowSpacing")||a.push(" "+me.t("word.MeterAbbreviation",t)),l.includes("latitude")||a.push("\xb0"),l.includes("orientation")||a.push(""),l.includes("poleHeight")||a.push(" "+me.t("word.MeterAbbreviation",t)),l.includes("unitCost")||a.push(""),l.includes("sellingPrice")||a.push(""),l.includes("totalYearlyCost")||a.push("K"),l.includes("totalYearlyYield")||a.push(" MWh"),l.includes("meanYearlyYield")||a.push(" kWh"),l.includes("yearlyProfit")||a.push("K"),a}return[]}},{key:"getUnit",value:function(e,t){return"tiltAngle"===e||"latitude"===e?"\xb0":"interRowSpacing"===e||"poleHeight"===e?me.t("word.MeterAbbreviation",t):"totalYearlyYield"===e?"MWh":"meanYearlyYield"===e?"kWh":"totalYearlyCost"===e||"yearlyProfit"===e?"K":""}},{key:"setScatterData",value:function(e,t,l,a){switch(e){case"rowWidth":l[t]=a.rowsPerRack;break;case"tiltAngle":l[t]=Tw.toDegrees(a.tiltAngle);break;case"interRowSpacing":l[t]=a.interRowSpacing;break;case"latitude":l[t]=a.latitude;break;case"orientation":l[t]=a.orientation===$.landscape?0:1;break;case"poleHeight":l[t]=a.poleHeight;break;case"unitCost":l[t]=a.unitCost;break;case"sellingPrice":l[t]=a.sellingPrice;break;case"totalYearlyCost":l[t]=Tw.calculateCost(a);break;case"totalYearlyYield":l[t]=.001*a.yearlyYield;break;case"meanYearlyYield":l[t]=a.yearlyYield/a.panelCount;break;case"yearlyProfit":l[t]=Tw.calculateProfit(a)}}}]),e}(),Yw=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"updateOldFileData",value:function(e){var t,l=new Map,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;l.set(o.id,o)}}catch(P){a.e(P)}finally{a.f()}var i,r=Object(f.a)(e.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;switch(n.type){case V.Foundation:n.parentId!==xt&&(console.error("Error: "+n.parentId+" is not ground!"),n.parentId=xt);break;case V.Wall:var c=n;if(void 0===c.wallStructure&&(c.wallStructure=Ne.Default),void 0===c.structureSpacing&&(c.structureSpacing=2),void 0===c.structureWidth&&(c.structureWidth=.1),void 0===c.structureColor&&(c.structureColor="white"),void 0===c.opacity&&(c.opacity=.5),void 0===c.fill&&(c.fill=Ue.Full),void 0===c.unfilledHeight&&(c.unfilledHeight=.5),void 0===c.leftUnfilledHeight||void 0===c.rightUnfilledHeight){var s,u=null!==(s=c.unfilledHeight)&&void 0!==s?s:.5;c.leftUnfilledHeight=u,c.rightUnfilledHeight=u}if(void 0!==c.leftTopPartialHeight&&void 0!==c.rightTopPartialHeight||(c.leftTopPartialHeight=c.lz,c.rightTopPartialHeight=c.lz),void 0===c.eavesLength&&c.roofId){var p=l.get(c.roofId);if(p&&p.type===V.Roof){var y=p;c.eavesLength=void 0!==y.overhang?y.overhang:.3}else c.eavesLength=.3}if(void 0===c.parapet&&(c.parapet=Object(d.a)({},Sm)),c.roofId){var g=l.get(c.roofId);if(g&&g.type===V.Roof){var m=g;m.roofType!==It.Pyramid&&m.roofType!==It.Hip&&m.roofType!==It.Mansard||(c.leftRoofHeight=void 0,c.rightRoofHeight=void 0)}}break;case V.Window:var w,x,v=n;if(void 0===v.horizontalMullion&&(v.horizontalMullion=v.mullion),void 0===v.verticalMullion&&(v.verticalMullion=v.mullion),void 0===v.mullionWidth&&(v.mullionWidth=.06),void 0===v.horizontalMullionSpacing)v.horizontalMullionSpacing=null!==(w=v.mullionSpacing)&&void 0!==w?w:.5;if(void 0===v.verticalMullionSpacing)v.verticalMullionSpacing=null!==(x=v.mullionSpacing)&&void 0!==x?x:.5;void 0===v.tint&&(v.tint="#73D8FF"),void 0===v.opacity&&(v.opacity=.5),v.shutter&&(v.leftShutter=v.shutter.showLeft,v.rightShutter=v.shutter.showRight,v.shutterColor=v.shutter.color,v.shutterWidth=v.shutter.width,v.shutter=void 0),void 0===v.shutterColor&&(v.shutterColor="gray"),void 0===v.shutterWidth&&(v.shutterWidth=.5),void 0===v.mullionColor&&(v.mullionColor="white"),void 0===v.frame&&(v.frame=!1),void 0===v.color&&(v.color="white"),void 0===v.frameWidth&&(v.frameWidth=.1),void 0===v.windowType&&(v.windowType=Yt.Default),void 0===v.archHeight&&(v.archHeight=1);break;case V.Door:var b=n;void 0===b.doorType&&(b.doorType=hy.Default),void 0===b.archHeight&&(b.archHeight=1),void 0===b.filled&&(b.filled=!0);break;case V.Roof:var A=n;if(void 0===A.ceiling&&(A.ceiling=!1),A.roofType===It.Gambrel){var T=A;void 0===T.frontRidgePoint&&(T.frontRidgePoint=T.frontRidgeLeftPoint?Object(h.a)(T.frontRidgeLeftPoint):[.35,.5],T.frontRidgeLeftPoint=void 0,T.frontRidgeRightPoint=void 0),void 0===T.backRidgePoint&&(T.backRidgePoint=T.backRidgeLeftPoint?Object(h.a)(T.backRidgeLeftPoint):[-.35,.5],T.backRidgeLeftPoint=void 0,T.backRidgeRightPoint=void 0),void 0===T.topRidgePoint&&(T.topRidgePoint=T.topRidgeLeftPoint?Object(h.a)(T.topRidgeLeftPoint):[0,1],T.topRidgeLeftPoint=void 0,T.topRidgeRightPoint=void 0)}}}}catch(P){r.e(P)}finally{r.f()}}}]),e}();function Lw(e){return e.type===V.Foundation||e.type===V.Cuboid}Object(Pe.b)();var Ew=y()(Object(Ve.a)(Object(Ve.b)((function(e,t){var l=function(t){return e(Object(Pe.a)(t))},a=new Pw,o=a.getElements();return{set:function(e){try{l(e)}catch(t){console.log(t)}},world:a,elements:o,user:{},viewState:new jw,actionState:new Ow,graphState:new Fw,solarPanelArrayLayoutParams:new zw,solarPanelArrayLayoutConstraints:new Iw,evolutionaryAlgorithmState:new Ww,economicsParams:new Cw,geneticAlgorithmWizardSelectedTab:"1",particleSwarmOptimizationWizardSelectedTab:"1",modelType:R.UNKNOWN,modelAuthor:null,modelLabel:null,modelDescription:null,projectView:!1,projectInfo:{owner:null,title:null,description:null,type:M.SOLAR_PANEL_ARRAY,designs:new Array,ranges:new Array,hiddenParameters:kw.getDefaultHiddenParameters(M.SOLAR_PANEL_ARRAY),counter:0,dataColoring:z.ALL,selectedProperty:null,sortDescending:!1,xAxisNameScatteredPlot:null,yAxisNameScatteredPlot:null,dotSizeScatteredPlot:5,thumbnailWidth:200},projectImages:new Map,designProjectType:null,notes:[],language:"en",floatingWindowOpacity:Qe,selectedFloatingWindow:null,cloudFile:void 0,latestModelSite:void 0,modelSites:new Map,peopleModels:new Map,modelsMapLatitude:42.2844063,modelsMapLongitude:-71.3488548,modelsMapAddress:Xe,modelsMapZoom:10,modelsMapType:"roadmap",modelsMapTilt:0,minimumNavigationMoveSpeed:3,minimumNavigationTurnSpeed:3,tempHumanPlant:[],ray:new Me.Raycaster,mouse:new Me.Vector2,fileChanged:!1,applyCount:0,setApplyCount:function(e){l((function(t){t.applyCount=e}))},revertApply:function(){if(t().applyCount){for(var e=0;eu&&(i=u,l=n.id)}}}catch(h){r.e(h)}finally{r.f()}}return l},overlapWithSibling:function(e,l){var a=!1;if(void 0===l){var o=t().getParent(e);if(o){var i,r=Object(f.a)(t().elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e.type&&n.parentId===e.parentId&&n.id!==e.id)if(e.type===V.SolarPanel){if(Tw.doSolarPanelsOverlap(e,n,o)){a=!0;break}}else if(Math.abs(e.cx-n.cx)*o.lx<.5*(e.lx+n.lx)&&Math.abs(e.cy-n.cy)*o.ly<.5*(e.ly+n.ly)&&Math.abs(e.cz-n.cz)*o.lz<.5*(e.lz+n.lz)){a=!0;break}}}catch(m){r.e(m)}finally{r.f()}}}else{var c,s=l*l,d=t().getParent(e),u=Object(f.a)(t().elements);try{for(u.s();!(c=u.n()).done;){var h=c.value;if(h.type===e.type&&h.parentId===e.parentId&&h.id!==e.id){var p=(e.cx-h.cx)*(d?d.lx:1),y=(e.cy-h.cy)*(d?d.ly:1),g=(e.cz-h.cz)*(d?d.lz:1);if(p*p+y*y+g*g0&&((t.intersections.filter((function(e){return!e.eventObject.name.startsWith("Wall Intersection Plane")}))[0].object===t.eventObject||o)&&l((function(l){var o,r,n,c,s,d=Object(f.a)(l.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.id===e)if(u.selected=!0,l.selectedElement=u,l.selectedElementHeight=u.lz,l.groupActionMode){var h,p=null!==(h=u.foundationId)&&void 0!==h?h:null;!p&&Lw(u)&&(p=Tw.getBaseId(u.id)),p&&(l.multiSelectionsMode||l.selectedElementIdSet.clear(),l.selectedElementIdSet.has(p)?l.selectedElementIdSet.delete(p):l.selectedElementIdSet.add(p))}else if(a===X.ContextMenu)if(l.selectedElementIdSet.has(e)){var y,g=Object(f.a)(l.elements);try{for(g.s();!(y=g.n()).done;){var m=y.value;l.selectedElementIdSet.has(m.id)&&m.type!==l.selectedElement.type&&l.selectedElementIdSet.delete(m.id)}}catch(b){g.e(b)}finally{g.f()}}else if(l.multiSelectionsMode){l.selectedElementIdSet.add(e);var w,x=Object(f.a)(l.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;l.selectedElementIdSet.has(v.id)&&v.type!==l.selectedElement.type&&l.selectedElementIdSet.delete(v.id)}}catch(b){x.e(b)}finally{x.f()}}else l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(e);else l.multiSelectionsMode?l.selectedElementIdSet.has(e)?l.selectedElementIdSet.delete(e):l.selectedElementIdSet.add(e):(l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(e));else u.selected=!1}}catch(b){d.e(b)}finally{d.f()}if(l.moveHandleType=null,l.resizeHandleType=null,l.rotateHandleType=null,a)switch(a){case X.Move:(null===(o=l.selectedElement)||void 0===o?void 0:o.type)===V.Tree||(null===(r=l.selectedElement)||void 0===r?void 0:r.type)===V.Human?l.moveHandleType=B.Default:l.moveHandleType=t.eventObject.name,i(!1);break;case X.Resize:l.resizeHandleType=t.eventObject.name,i(!1);break;case X.Rotate:l.rotateHandleType=t.eventObject.name,i(!1);break;case X.Select:l.selectedElementAngle=null!==(n=null===(c=t.object.parent)||void 0===c?void 0:c.rotation.z)&&void 0!==n?n:0,i(!0);break;default:i(!0)}})))},updateAllElementLocks:function(e){l((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){l.value.locked=e}}catch(o){a.e(o)}finally{a.f()}}))},updateElementLockByFoundationId:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.foundationId!==e&&i.parentId!==e&&i.id!==e||(i.locked=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLockByParentId:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.parentId===e&&t===r.type&&(r.locked=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLockById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementReferenceById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.referenceId=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLabelById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.label=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementShowLabelById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.showLabel=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementColorById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.color=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementColorOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Tw.isIdentical(n.normal,a)&&!n.locked&&(n.color=o)}}catch(c){r.e(c)}finally{r.f()}}))},updateElementColorAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.color=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementColorForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLineColorById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.lineColor=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLineColorOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Tw.isIdentical(n.normal,a)&&!n.locked&&(n.lineColor=o)}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLineColorAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.lineColor=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLineColorForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lineColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLineWidthById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.lineWidth=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLineWidthOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Tw.isIdentical(n.normal,a)&&!n.locked&&(n.lineWidth=o)}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLineWidthAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.lineWidth=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLineWidthForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lineWidth=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementCxById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.cx=t,i.type===V.SolarPanel&&i.parentType===V.Roof&&(l.updateElementOnRoofFlag=!0);break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementCyById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.cy=t,i.type===V.SolarPanel&&i.parentType===V.Roof&&(l.updateElementOnRoofFlag=!0);break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementCzById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.cz=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementCzForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.cz=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLxById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.lx=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLxAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.lx=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLxOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e&&!n.locked){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.lx=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLxForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lx=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLyById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.ly=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLyAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.ly=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLyOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e&&!n.locked){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.ly=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLyForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLzById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.lz=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLzAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.lz=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLzOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e&&!n.locked){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.lz=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLzForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lz=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementRotationById:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;(n.id!==e||n.locked)&&(n.parentId!==e||Jm(n))||(n.rotation[0]=t,n.rotation[1]=a,n.rotation[2]=o)}}catch(c){r.e(c)}finally{r.f()}l.selectedElementAngle=o}))},updateElementRotationForAll:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e)n.locked||(n.rotation[0]=t,n.rotation[1]=a,n.rotation[2]=o);else{var c=l.getParent(n);c&&!c.locked&&c.type===e&&(n.rotation[0]=t,n.rotation[1]=a,n.rotation[2]=o)}}}catch(s){r.e(s)}finally{r.f()}}))},updateSolarCollectorDrawSunBeamById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Tw.isSolarCollector(i)){i.drawSunBeam=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorDrawSunBeamAboveFoundation:function(e,t,a){Tw.isSolarCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.foundationId!==t||r.locked||r.type===e&&(r.drawSunBeam=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateSolarCollectorDrawSunBeamForAll:function(e,t){Tw.isSolarCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.locked||i.type===e&&(i.drawSunBeam=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorRelativeAzimuthById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Tw.isSolarCollector(i)){i.relativeAzimuth=t,l.selectedElementAngle=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorRelativeAzimuthAboveFoundation:function(e,t,a){Tw.isSolarCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||r.parentType===V.Wall||(r.relativeAzimuth=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateSolarCollectorRelativeAzimuthOnSurface:function(e,t,a,o){Tw.isSolarCollectorType(e)&&l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e&&!n.locked){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.relativeAzimuth=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorRelativeAzimuthForAll:function(e,t){Tw.isSolarCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||i.parentType===V.Wall||(i.relativeAzimuth=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleHeightById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Tw.isSolarCollector(i)){i.poleHeight=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleHeightAboveFoundation:function(e,t,a){Tw.isSolarCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.foundationId!==t||r.locked||r.type!==e||(r.poleHeight=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateSolarCollectorPoleHeightOnSurface:function(e,t,a,o){Tw.isSolarCollectorType(e)&&l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(!n.locked&&n.type===e){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.poleHeight=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorPoleHeightForAll:function(e,t){Tw.isSolarCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.poleHeight=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleRadiusById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Tw.isSolarCollector(i)){i.poleRadius=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleRadiusAboveFoundation:function(e,t,a){Tw.isSolarCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.foundationId!==t||r.locked||r.type!==e||(r.poleRadius=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateSolarCollectorPoleRadiusOnSurface:function(e,t,a,o){Tw.isSolarCollectorType(e)&&l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(!n.locked&&n.type===e){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.poleRadius=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorPoleRadiusForAll:function(e,t){Tw.isSolarCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.poleRadius=t)}}catch(r){o.e(r)}finally{o.f()}}))},clearAllSolarCollectorYields:function(){l((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(Tw.isSolarCollector(a)){var o=a;o.dailyYield=0,o.yearlyYield=0}}}catch(i){l.e(i)}finally{l.f()}}))},updateSolarCollectorDailyYieldById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isSolarCollector(i)){i.dailyYield=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorYearlyYieldById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isSolarCollector(i)){i.yearlyYield=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateCspReflectanceById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isCspCollector(i)){i.reflectance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateCspReflectanceAboveFoundation:function(e,t,a){Tw.isCspCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===e&&r.foundationId===t&&(r.reflectance=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateCspReflectanceForAll:function(e,t){Tw.isCspCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===e&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorAbsorptanceById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isParabolicCollector(i)){i.absorptance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorAbsorptanceAboveFoundation:function(e,t,a){Tw.isParabolaType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===e&&r.foundationId===t&&(r.absorptance=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateParabolicCollectorAbsorptanceForAll:function(e,t){Tw.isParabolaType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===e&&(i.absorptance=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorOpticalEfficiencyById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isParabolicCollector(i)){i.opticalEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorOpticalEfficiencyAboveFoundation:function(e,t,a){Tw.isParabolaType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===e&&r.foundationId===t&&(r.opticalEfficiency=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateParabolicCollectorOpticalEfficiencyForAll:function(e,t){Tw.isParabolaType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===e&&(i.opticalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorThermalEfficiencyById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isParabolicCollector(i)){i.thermalEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorThermalEfficiencyAboveFoundation:function(e,t,a){Tw.isParabolaType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===e&&r.foundationId===t&&(r.thermalEfficiency=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateParabolicCollectorThermalEfficiencyForAll:function(e,t){Tw.isParabolaType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===e&&(i.thermalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},foundationActionScope:_.OnlyThisObject,setFoundationActionScope:function(e){l((function(t){t.foundationActionScope=e}))},cuboidActionScope:_.OnlyThisSide,setCuboidActionScope:function(e){l((function(t){t.cuboidActionScope=e}))},polygonActionScope:_.OnlyThisObject,setPolygonActionScope:function(e){l((function(t){t.polygonActionScope=e}))},updatePolygonVertexPositionById:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.id===e){var c=n;t>=0&&t0)c=null!==(l=null===(a=e.getElementById(n.leftJoints[0]))||void 0===a?void 0:a.id)&&void 0!==l?l:"";if(n.rightJoints.length>0)s=null!==(o=null===(i=e.getElementById(n.rightJoints[0]))||void 0===i?void 0:i.id)&&void 0!==o?o:"";var d,u=Object(f.a)(e.elements);try{for(u.s();!(d=u.n()).done;){var p=d.value;p.id===c?p.rightJoints=[]:p.id===s&&(p.leftJoints=[])}}catch(h){u.e(h)}finally{u.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag;break;case V.Roof:e.deletedRoofIdSet.add(t.id),Pf.getState().deleteRoofSegmentVertices(t.id),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(t.id)}return!1}return!0}))})),Array.from(i)},removeElementById:function(e,a){var o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3?arguments[3]:void 0,r=t().elements.filter((function(t){return t.id===e||Tw.isChild(e,t.id)}));return l((function(t){var l,r=Object(f.a)(t.elements);try{var n=function(){var o=l.value;if(o.id===e){if(a)if(o.type===V.Polygon){var r=Tw.calculatePolygonCentroid(o.vertices);o.cx=r.x,o.cy=r.y,t.elementsToPaste=[o]}else if(o.type===V.Window&&o.parentType===V.Wall){var n=t.elements.find((function(e){return e.id===o.parentId&&e.type===V.Wall}));if(n){var c=Object(d.a)({},o);c.lx=o.lx*n.lx,c.lz=o.lz*n.lz,t.elementsToPaste=[c]}}else t.elementsToPaste=[o];else i||(t.deletedElements=[o]);switch(o.selected=!1,o.type){case V.Roof:var s=o;t.deletedRoofId=o.id,t.deletedRoofIdSet.add(o.id),Pf.getState().deleteRoofSegmentVertices(e),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(e),i&&(t.autoDeletedRoofs?t.autoDeletedRoofs.push(s):t.autoDeletedRoofs=[s],t.autoDeletedRoofIdSet.add(s.id));break;case V.Wall:var u,h,p,y,g=o,m="",w="";if(g.leftJoints.length>0)m=null!==(u=null===(h=t.getElementById(g.leftJoints[0]))||void 0===h?void 0:h.id)&&void 0!==u?u:"";if(g.rightJoints.length>0)w=null!==(p=null===(y=t.getElementById(g.rightJoints[0]))||void 0===y?void 0:y.id)&&void 0!==p?p:"";var x,v=Object(f.a)(t.elements);try{for(v.s();!(x=v.n()).done;){var b=x.value;b.id===m?b.rightJoints=[]:b.id===w&&(b.leftJoints=[])}}catch(A){v.e(A)}finally{v.f()}t.elements=t.elements.filter((function(e){return!(e.type===V.Roof&&0===e.wallsId.length)})),t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag,t.deletedWallId=o.id;break;case V.Foundation:t.deletedFoundationId=o.id;break;case V.Cuboid:t.deletedCuboidId=o.id}return"break"}};for(r.s();!(l=r.n()).done;){if("break"===n())break}}catch(x){r.e(x)}finally{r.f()}if(i){var c,s=Object(f.a)(t.elements);try{for(s.s();!(c=s.n()).done;){var u=c.value;Tw.isChild(e,u.id)&&(t.autoDeletedChild?t.autoDeletedChild.push(u):t.autoDeletedChild=[u])}}catch(x){s.e(x)}finally{s.f()}}else if(a){var h,p=Object(f.a)(t.elements);try{for(p.s();!(h=p.n()).done;){var y=h.value;Tw.isChild(e,y.id)&&t.elementsToPaste.push(y)}}catch(x){p.e(x)}finally{p.f()}}else{var g,m=Object(f.a)(t.elements);try{for(m.s();!(g=m.n()).done;){var w=g.value;Tw.isChild(e,w.id)&&t.deletedElements.push(w)}}catch(x){m.e(x)}finally{m.f()}}t.elements=t.elements.filter((function(t){return t.id!==e&&t.parentId!==e&&t.foundationId!==e&&!Tw.isChild(e,t.id)||(t.type===V.Roof&&(Pf.getState().deleteRoofSegmentVertices(e),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(e)),!1)})),t.selectedElementIdSet.delete(e),o&&(t.selectedElement=null,t.selectedElementIdSet.clear())})),r},removeElementsByType:function(e){l((function(t){e===V.Foundation?t.elements=t.elements.filter((function(e){return!(!e.locked&&(e.type===V.Foundation||e.foundationId))||(e.type===V.Roof&&(Pf.getState().deleteRoofSegmentVertices(e.id),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(e.id)),!1)})):t.elements=t.elements.filter((function(t){return!(!t.locked&&t.type===e)||(t.type===V.Roof&&(Pf.getState().deleteRoofSegmentVertices(t.id),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(t.id)),!1)}))}))},countElementsByType:function(e,l){var a=0;if(l){var o,i=Object(f.a)(t().elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.locked||a++}}catch(s){i.e(s)}finally{i.f()}}else{var n,c=Object(f.a)(t().elements);try{for(c.s();!(n=c.n()).done;){n.value.type===e&&a++}}catch(s){c.e(s)}finally{c.f()}}return a},countSolarStructuresByType:function(e,l){var a=0;if(l){var o,i=Object(f.a)(t().elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==V.Foundation||r.locked||r.solarStructure===e&&a++}}catch(d){i.e(d)}finally{i.f()}}else{var n,c=Object(f.a)(t().elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.type===V.Foundation&&s.solarStructure===e&&a++}}catch(d){c.e(d)}finally{c.f()}}return a},countObservers:function(){var e,l=0,a=Object(f.a)(t().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;o.type===V.Human&&o.observer&&l++}}catch(i){a.e(i)}finally{a.f()}return l},removeElementsByReferenceId:function(e,t){l((function(l){if(t){l.deletedElements=[];var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.referenceId===e&&l.deletedElements.push(i)}}catch(r){o.e(r)}finally{o.f()}}l.elements=l.elements.filter((function(t){return t.referenceId!==e}))}))},countElementsByReferenceId:function(e){var l,a=0,o=Object(f.a)(t().elements);try{for(o.s();!(l=o.n()).done;){l.value.referenceId===e&&a++}}catch(i){o.e(i)}finally{o.f()}return a},getChildren:function(e){var l,a=[],o=Object(f.a)(t().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.parentId===e&&a.push(i)}}catch(r){o.e(r)}finally{o.f()}return a},getChildrenOfType:function(e,l){var a,o=[],i=Object(f.a)(t().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;r.type===e&&r.parentId===l&&o.push(r)}}catch(n){i.e(n)}finally{i.f()}return o},removeAllChildElementsByType:function(e,t){l((function(l){l.elements=l.elements.filter((function(l){return l.locked||l.type!==t||l.parentId!==e})),t===V.Wall&&(l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag)}))},removeAllElementsOnFoundationByType:function(e,t){l((function(l){l.elements=l.elements.filter((function(l){return l.locked||l.type!==t||l.foundationId!==e})),t===V.Wall&&(l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag)}))},countAllElements:function(e){var l=0;if(e){var a,o=Object(f.a)(t().elements);try{for(o.s();!(a=o.n()).done;){a.value.locked||l++}}catch(i){o.e(i)}finally{o.f()}}else l=t().elements.length;return l},countAllElementsByType:function(e){var l,a=new Rw,o=Object(f.a)(t().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(!e||!i.locked)switch(i.type){case V.Foundation:i.solarStructure===G.UpdraftTower&&a.solarUpdraftTowerCount++,a.foundationCount++;break;case V.Cuboid:a.cuboidCount++;break;case V.Wall:a.wallCount++;break;case V.Window:a.windowCount++;break;case V.Door:a.doorCount++;break;case V.Human:a.humanCount++;break;case V.Tree:a.treeCount++;break;case V.Flower:a.flowerCount++;break;case V.Polygon:a.polygonCount++;break;case V.Sensor:a.sensorCount++;break;case V.Light:i.inside?a.insideLightCount++:a.outsideLightCount++;break;case V.SolarPanel:a.solarPanelCount++;var r=i,n=t().getPvModule(r.pvModelName);n&&(a.solarPanelModuleCount+=Tw.countSolarPanelsOnRack(r,n));break;case V.ParabolicDish:a.parabolicDishCount++;break;case V.ParabolicTrough:a.parabolicTroughCount++;break;case V.FresnelReflector:a.fresnelReflectorCount++;break;case V.Heliostat:a.heliostatCount++;break;case V.WindTurbine:a.windTurbineCount++}}}catch(c){o.e(c)}finally{o.f()}return a},countAllOffspringsByTypeAtOnce:function(e,l){var a,o=new Rw,i=Object(f.a)(t().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value,n=r.parentId===e||r.foundationId===e;if((l||!r.locked)&&n)switch(r.type){case V.Foundation:r.solarStructure===G.UpdraftTower&&o.solarUpdraftTowerCount++,o.foundationCount++;break;case V.Cuboid:o.cuboidCount++;break;case V.Wall:o.wallCount++;break;case V.Window:o.windowCount++;break;case V.Door:o.doorCount++;break;case V.Human:o.humanCount++;break;case V.Tree:o.treeCount++;break;case V.Flower:o.flowerCount++;break;case V.Polygon:o.polygonCount++;break;case V.Sensor:o.sensorCount++;break;case V.Light:r.inside?o.insideLightCount++:o.outsideLightCount++;break;case V.SolarPanel:o.solarPanelCount++;var c=r,s=t().getPvModule(c.pvModelName);s&&(o.solarPanelModuleCount+=Tw.countSolarPanelsOnRack(c,s));break;case V.ParabolicDish:o.parabolicDishCount++;break;case V.ParabolicTrough:o.parabolicTroughCount++;break;case V.FresnelReflector:o.fresnelReflectorCount++;break;case V.Heliostat:o.heliostatCount++;break;case V.WindTurbine:o.windTurbineCount++}}}catch(d){i.e(d)}finally{i.f()}return o},countSolarPanelsOnRack:function(e){var l,a=0,o=Object(f.a)(t().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.id===e&&i.type===V.SolarPanel){var r=i,n=t().getPvModule(r.pvModelName);if(n){a=Tw.countSolarPanelsOnRack(r,n);break}}}}catch(c){o.e(c)}finally{o.f()}return a},copyCutElements:function(){for(var e=[],l=new Map,a=new Map,o=new Map,i=function(i){var r=t().elementsToPaste[i],n=null;if(0===i){var c;if((null===(c=n=t().getElementById(r.id)?Sw.clone(t().getParent(r),r,r.cx,r.cy,r.cz):JSON.parse(JSON.stringify(r)))||void 0===c?void 0:c.type)===V.Wall){var s=n;s.roofId=void 0,s.leftRoofHeight=void 0,s.rightRoofHeight=void 0,s.centerLeftRoofHeight=void 0,s.centerRightRoofHeight=void 0,s.centerRoofHeight=void 0}}else{var d=t().elementsToPaste.find((function(e){return e.id===r.parentId}));if(d){var u,f=l.get(d.id);if(f)if(t().getElementById(r.id))(null===(u=n=Sw.clone(f,r,r.cx,r.cy,r.cz,r.type===V.Polygon))||void 0===u?void 0:u.type)===V.Window&&n.parentType===V.Wall&&(n.lx*=f.lx,n.lz*=f.lz);else n=JSON.parse(JSON.stringify(r))}}n&&(l.set(r.id,n),a.set(r.id,n.id),o.set(n.id,r.id),e.push(n))},r=0;r1){var X=l.pastePoint,B=l.copyCutElements();if(B.length>0){var K;if(B[0].type===V.Cuboid){var q=l.selectedElement;if(q&&q.type===V.Cuboid){var Q=Tw.getWorldDataById(q.id).pos;X.sub(Q),B[0].parentId=q.id}}else if(B[0].type===V.Wall){var Z=l.selectedElement;Z&&Z.type===V.Foundation&&((X=Tw.relativeCoordinates(X.x,X.y,X.z,Z)).set(X.x*Z.lx,X.y*Z.ly,0),B[0].parentId=Z.id,B[0].foundationId=Z.id)}B[0].cx=X.x,B[0].cy=X.y,B[0].cz=X.z,B[0].type===V.Foundation?B[0].cz+=B[0].lz/2:B[0].type===V.Cuboid&&(B[0].cz=B[0].lz/2),(K=l.elements).push.apply(K,Object(h.a)(B)),e.push.apply(e,Object(h.a)(B))}}e.length>0&&(l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(e[0].id),l.selectedElement=e[0])})),e},pasteElementsByKey:function(){var e=[];return l((function(l){if(l.elementsToPaste.length>0){var a=l.elementsToPaste[0],o=l.getParent(a),i=Sw.clone(o,a,a.cx,a.cy,a.cz);if(i){var r=!1;switch(i.type){case V.Door:case V.Window:if(o){var n=i.lx/2;if(i.cx+=3*n,o.type===V.Wall)for(;i.cx+n<.5;){if(Tw.checkElementOnWallState(i,o)===ye.Valid){l.elements.push(i),r=!0;break}i.cx+=n}else if(o.type===V.Roof){var c=Vm.getRotationOnRoof(o.id,new Me.Vector3(i.cx,i.cy));c&&(i.rotation=Object(h.a)(c));for(var s=Vm.getWindowVerticesOnRoof(i),d=Vm.getRoofSegmentBoundary(o.id,new Me.Vector3(i.cx,i.cy)),u=Vm.getRoofBoundaryVertices(o);Vm.rooftopElementBoundaryCheck(s,u);){if(d&&Vm.rooftopElementBoundaryCheck(s,d)&&Vm.rooftopWindowCollisionCheck(i.id,s,o.id)){l.elements.push(i),r=!0;break}i.cx+=n/2;var p=Vm.getRotationOnRoof(o.id,new Me.Vector3(i.cx,i.cy));p&&(i.rotation=Object(h.a)(p)),s=Vm.getWindowVerticesOnRoof(i),d=Vm.getRoofSegmentBoundary(o.id,new Me.Vector3(i.cx,i.cy))}}if(!r){i.cx=a.cx-3*n;var y=Vm.getRotationOnRoof(o.id,new Me.Vector3(i.cx,i.cy));if(y&&(i.rotation=Object(h.a)(y)),o.type===V.Wall){for(;i.cx-n>-.5;)if(o.type===V.Wall){if(Tw.checkElementOnWallState(i,o)===ye.Valid){l.elements.push(i),r=!0;break}i.cx-=n}}else if(o.type===V.Roof)for(var g=Vm.getWindowVerticesOnRoof(i),m=Vm.getRoofSegmentBoundary(o.id,new Me.Vector3(i.cx,i.cy)),w=Vm.getRoofBoundaryVertices(o);Vm.rooftopElementBoundaryCheck(g,w);){if(m&&Vm.rooftopElementBoundaryCheck(g,m)&&Vm.rooftopWindowCollisionCheck(i.id,g,o.id)){l.elements.push(i),r=!0;break}i.cx-=n;var x=Vm.getRotationOnRoof(o.id,new Me.Vector3(i.cx,i.cy));x&&(i.rotation=Object(h.a)(x)),g=Vm.getWindowVerticesOnRoof(i),m=Vm.getRoofSegmentBoundary(o.id,new Me.Vector3(i.cx,i.cy))}}if(!r){var v={lng:l.language};Qh(me.t("message.CannotPasteOutsideBoundary",v))}o.type===V.Roof&&r&&(l.updateElementOnRoofFlag=!0)}break;case V.Human:i.cx+=1,l.elements.push(i),l.elementsToPaste=[i],r=!0;break;case V.Tree:case V.Flower:i.cx+=i.lx,l.elements.push(i),l.elementsToPaste=[i],r=!0;break;case V.SolarPanel:case V.FresnelReflector:case V.Heliostat:case V.ParabolicDish:case V.ParabolicTrough:if(i.parentId){var b=l.getParent(i);if(b){if(b.type===V.Wall){var A=i.lx/b.lx/2;for(i.cx+=3*A;i.cx+A<.5;){if(Tw.checkElementOnWallState(i,b)===ye.Valid){l.elements.push(i),r=!0;break}i.cx+=A}if(!r)for(i.cx=a.cx-3*A;i.cx-A>-.5;){if(Tw.checkElementOnWallState(i,b)===ye.Valid){l.elements.push(i),l.elementsToPaste=[i],r=!0;break}i.cx-=A}if(!r){var T={lng:l.language};Qh(me.t("message.CannotPasteOutsideBoundary",T))}break}if(b.type===V.Roof){if(a.foundationId){var P=l.getElementById(a.foundationId);if(P){var S=Vm.getRoofBoundaryVertices(b),j=i.lx/P.lx/2;for(i.cx+=1.25*j;i.cx+j<.5;){var H=Vm.getSolarPanelVerticesOnRoof(i,P);if(Vm.rooftopElementBoundaryCheck(H,S)&&Vm.rooftopSPCollisionCheck(i,P,H)){l.elements.push(i),r=!0;break}i.cx+=1.25*j}if(!r)for(i.cx=a.cx-1.25*j;i.cx-j>-.5;){var z=Vm.getSolarPanelVerticesOnRoof(i,P);if(Vm.rooftopElementBoundaryCheck(z,S)&&Vm.rooftopSPCollisionCheck(i,P,z)){l.elements.push(i),r=!0;break}i.cx-=1.25*j}if(r)l.updateElementOnRoofFlag=!0;else{var R={lng:l.language};Qh(me.t("message.CannotPasteOutsideBoundary",R))}}}break}var D=l.findNearestSibling(a.id);if(D){var M=l.getElementById(D);if(M){var W=i.cx,I=i.cy,C=i.cz,O=M.cx-a.cx,F=M.cy-a.cy,k=M.cz-a.cz;i.cx=M.cx+O,i.cy=M.cy+F,i.cz=M.cz+k,l.overlapWithSibling(i)&&(i.cx=a.cx-O,i.cy=a.cy-F,i.cz=a.cz-k,l.overlapWithSibling(i)&&(i.cx=a.cx-2*O,i.cy=a.cy-2*F,i.cz=a.cz-2*k,l.overlapWithSibling(i)&&(i.cx=W-O,i.cy=I-F,i.cz=C-k)))}else i.cx+=i.lx/b.lx}else i.cx+=i.lx/b.lx;var Y={lng:l.language};l.overlapWithSibling(i)?Qh(me.t("message.CannotPasteBecauseOfOverlap",Y)):b.type===V.Foundation||b.type===V.Cuboid&&Tw.isIdentical(i.normal,Tt)?Tw.isSolarCollectorWithinHorizontalSurface(i,b)?(l.elements.push(i),l.elementsToPaste=[i],r=!0):Qh(me.t("message.CannotPasteOutsideBoundary",Y)):(l.elements.push(i),l.elementsToPaste=[i],r=!0)}}break;case V.Sensor:case V.Light:if(i.parentId){var L=l.getParent(i);L&&(i.cx+=i.lx/L.lx),i.cx<.5&&(l.elements.push(i),l.elementsToPaste=[i],r=!0)}break;case V.Polygon:var E,U=i,N=Object(f.a)(U.vertices);try{for(N.s();!(E=N.n()).done;){E.value.x+=.1}}catch(ge){N.e(ge)}finally{N.f()}U.cx+=.1,l.elements.push(U),l.elementsToPaste=[U],r=!0;break;case V.Cuboid:if(i.cx+=i.lx,1===l.elementsToPaste.length){var J,G=function e(l){var a,o=[],i=Object(f.a)(t().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(r.parentId===l.id)switch(o.push(r),r.type){case V.Cuboid:case V.Foundation:case V.Wall:case V.Roof:o.push.apply(o,Object(h.a)(e(r)))}}}catch(ge){i.e(ge)}finally{i.f()}return o}(a),X=new Map;e.push(i),X.set(a.id,i);var B,K=Object(f.a)(G);try{for(K.s();!(B=K.n()).done;){var q=B.value,Q=X.get(q.parentId);if(Q){var Z=Sw.clone(Q,q,q.cx,q.cy,q.cz,q.type===V.Polygon);Z&&(i.normal&&(Z.normal=Object(h.a)(q.normal)),e.push(Z),X.set(q.id,Z))}}}catch(ge){K.e(ge)}finally{K.f()}(J=l.elements).push.apply(J,e),l.elementsToPaste=[i],l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(i.id),l.selectedElement=i}else if(l.elementsToPaste.length>1){var _,$=l.copyCutElements();if($.length>0)$[0].cx+=$[0].lx,(_=l.elements).push.apply(_,Object(h.a)($)),l.elementsToPaste=Object(h.a)($),e.push.apply(e,Object(h.a)($)),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add($[0].id),l.selectedElement=$[0]}r=!1;break;case V.Foundation:if(i.cx+=i.lx,1===l.elementsToPaste.length)!function(){var o,r,n=new Map,c=new Map,s=Object(f.a)(l.elements);try{for(s.s();!(r=s.n()).done;){var d=r.value;if(d.parentId===a.id&&d.parentId!==d.id){var u=Sw.clone(i,d,d.cx,d.cy,d.cz,d.type===V.Polygon);if(u&&(i.normal&&(u.normal=Object(h.a)(d.normal)),e.push(u),(null===u||void 0===u?void 0:u.type)===V.Wall||(null===u||void 0===u?void 0:u.type)===V.Roof)){n.set(u.id,d.id),c.set(d.id,u.id);var p,y=Object(f.a)(l.elements);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.parentId===d.id){var m=Sw.clone(u,g,g.cx,g.cy,g.cz);m&&(d.normal&&(m.normal=Object(h.a)(g.normal)),e.push(m))}}}catch(ge){y.e(ge)}finally{y.f()}}}}}catch(ge){s.e(ge)}finally{s.f()}(o=l.elements).push.apply(o,e),l.elements.push(i),l.elementsToPaste=[i];var w,x=Object(f.a)(l.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.Roof){var b=n.get(v.id);if(b){var A=t().getElementById(b);A&&(v.wallsId=A.wallsId.map((function(e){return c.get(e)})))}}if(v.type===V.Wall){var T=n.get(v.id);if(T){var P,S=Object(f.a)(l.elements);try{for(S.s();!(P=S.n()).done;){var j=P.value;if(j.id===T&&j.type===V.Wall){var H=j,z=c.get(H.leftJoints[0]);z&&(v.leftJoints=[z]);var R=c.get(H.rightJoints[0]);if(R&&(v.rightJoints=[R]),H.roofId){var D=c.get(H.roofId);D&&(v.roofId=D)}break}}}catch(ge){S.e(ge)}finally{S.f()}}}}}catch(ge){x.e(ge)}finally{x.f()}}();else if(l.elementsToPaste.length>1){var ee,te=l.copyCutElements();if(te.length>0)te[0].cx+=te[0].lx,(ee=l.elements).push.apply(ee,Object(h.a)(te)),e.push.apply(e,Object(h.a)(te)),l.elementsToPaste=te,l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(te[0].id),l.selectedElement=te[0]}r=!0;break;case V.Wall:var le=i,ae=new Me.Vector3(1,-1,0).applyEuler(new Me.Euler(0,0,le.relativeAngle));if(i.cx+=ae.x,i.cy+=ae.y,1===l.elementsToPaste.length){var oe,ie=new Me.Vector3(i.cx,i.cy,0),re=new Me.Vector3(i.lx/2,0,0),ne=new Me.Vector3(-i.lx/2,0,0),ce=new Me.Euler(0,0,le.relativeAngle);le.leftPoint=ie.clone().add(ne.applyEuler(ce)).toArray(),le.rightPoint=ie.clone().add(re.applyEuler(ce)).toArray(),le.roofId=void 0,le.leftRoofHeight=void 0,le.rightRoofHeight=void 0,le.centerLeftRoofHeight=void 0,le.centerRightRoofHeight=void 0,le.centerRoofHeight=void 0;var se,de=Object(f.a)(l.elements);try{for(de.s();!(se=de.n()).done;){var ue=se.value;if(ue.parentId===a.id){var fe=Sw.clone(i,ue,ue.cx,ue.cy,ue.cz,ue.type===V.Polygon);fe&&(i.normal&&(fe.normal=Object(h.a)(ue.normal)),e.push(fe))}}}catch(ge){de.e(ge)}finally{de.f()}(oe=l.elements).push.apply(oe,e),l.elements.push(i),l.elementsToPaste=[i]}else if(l.elementsToPaste.length>1){var he,pe=l.copyCutElements();if(pe.length>0)pe[0].cx+=ae.x,pe[0].cy-=ae.y,(he=l.elements).push.apply(he,Object(h.a)(pe)),e.push.apply(e,Object(h.a)(pe)),l.elementsToPaste=pe,l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(pe[0].id),l.selectedElement=pe[0]}l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag,r=!0}1===l.elementsToPaste.length&&r&&(e.push(i),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(i.id),l.selectedElement=i)}}})),e},pvModules:{},loadPvModules:function(){var e=[];b.a.parse(Te,{download:!0,complete:function(t){var a,o=Object(f.a)(t.data);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Array.isArray(i)&&i.length>1){var r={name:i[0].trim(),brand:i[1].trim(),cellType:i[2].trim(),efficiency:parseFloat(i[3].trim()),length:parseFloat(i[4].trim()),nominalLength:parseFloat(i[5].trim()),width:parseFloat(i[6].trim()),nominalWidth:parseFloat(i[7].trim()),thickness:parseFloat(i[8].trim()),m:parseFloat(i[9].trim()),n:parseFloat(i[10].trim()),pmax:parseFloat(i[11].trim()),vmpp:parseFloat(i[12].trim()),impp:parseFloat(i[13].trim()),voc:parseFloat(i[14].trim()),isc:parseFloat(i[15].trim()),pmaxTC:parseFloat(i[16].trim()),noct:parseFloat(i[17].trim()),weight:parseFloat(i[18].trim()),color:i[19].trim(),shadeTolerance:i[20].trim(),bifacialityFactor:parseFloat(i[21].trim())};e.push(r)}}}catch(n){o.e(n)}finally{o.f()}l((function(t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.pvModules[o.name]=o}}catch(n){a.e(n)}finally{a.f()}}))}})},getPvModule:function(e){return t().pvModules[e]},weatherData:{},loadWeatherData:function(){var e=[];b.a.parse(ve,{download:!0,complete:function(t){var a,o=Object(f.a)(t.data);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Array.isArray(i)&&i.length>1){for(var r=[],n=[],c=[],s=5;s<29;s++)(s-5)%2===0?r.push(parseFloat(i[s].trim())):n.push(parseFloat(i[s].trim()));for(var d=29;d<41;d++)c.push(parseFloat(i[d].trim()));var u={city:i[0].trim(),country:i[1].trim(),longitude:parseFloat(i[2].trim()),latitude:parseFloat(i[3].trim()),elevation:parseFloat(i[4].trim()),lowestTemperatures:r,highestTemperatures:n,sunshineHours:c};e.push(u)}}}catch(h){o.e(h)}finally{o.f()}l((function(t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.weatherData[o.city+", "+o.country]=o}}catch(h){a.e(h)}finally{a.f()}}))}})},getWeather:function(e){return t().weatherData[e]},horizontalSolarRadiationData:{},loadHorizontalSolarRadiationData:function(){var e=[];b.a.parse(be,{download:!0,complete:function(t){var a,o=Object(f.a)(t.data);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Array.isArray(i)&&i.length>1){for(var r=[],n=2;n<14;n++)r.push(parseFloat(i[n].trim()));var c={city:i[0].trim(),country:i[1].trim(),data:r};e.push(c)}}}catch(s){o.e(s)}finally{o.f()}l((function(t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.horizontalSolarRadiationData[o.city+", "+o.country]=o}}catch(s){a.e(s)}finally{a.f()}}))}})},getHorizontalSolarRadiation:function(e){return t().horizontalSolarRadiationData[e]},verticalSolarRadiationData:{},loadVerticalSolarRadiationData:function(){var e=[];b.a.parse(Ae,{download:!0,complete:function(t){var a,o=Object(f.a)(t.data);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Array.isArray(i)&&i.length>1){for(var r=[],n=2;n<14;n++)r.push(parseFloat(i[n].trim()));var c={city:i[0].trim(),country:i[1].trim(),data:r};e.push(c)}}}catch(s){o.e(s)}finally{o.f()}l((function(t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.verticalSolarRadiationData[o.city+", "+o.country]=o}}catch(s){a.e(s)}finally{a.f()}}))}})},getVerticalSolarRadiation:function(e){return t().verticalSolarRadiationData[e]},getClosestCity:function(e,l){var a,o=Number.MAX_VALUE,i=null,r=t().weatherData;for(var n in r)r.hasOwnProperty(n)&&(a=Tw.getDistance(l,e,r[n].longitude,r[n].latitude))0?B>=12||B<=3?_w:B>3&&B<=5?qw:B>5&&B<=9?Qw:Zw:B>=12||B<=3?Qw:B>3&&B<=5?Zw:B>5&&B<=9?_w:qw;case E.Lake:return $w;case E.Mountain:return ex;case E.Rural:return tx;default:return Jw}}),[l,w,m]),ne=Object(Wy.a)(re),ce=function(e){var t;if(e.intersections.length>0)if(e.intersections[0].object===H.current)o(),a((function(e){e.clickObjectType=V.Sky}));else{var l=n();l&&((t=l.type)===V.Foundation||t===V.Cuboid||t===V.Tree||t===V.Flower||t===V.Human)&&(z.current=l,Tw.isPlantOrHuman(z.current)&&($(Z.Vertical),te.set(-vt,0,0,"ZXY")),l.type!==V.Foundation&&l.type!==V.Cuboid&&Et.getState().setEnableOrbitController(!1))}},se=function e(t){if(!t)return"";var l=t.name.split(" ");return l[2]?l[2]:e(t.parent)},de=function(e,t){var l=Et.getState().contentRef,a=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null}(null===l||void 0===l?void 0:l.current,e.id);if(a){var o,i=Object(f.a)(a.children);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.name.includes("".concat(t.id))){var n,c;null===(n=Et.getState().contentRef)||void 0===n||null===(c=n.current)||void 0===c||c.add(r);break}}}catch(d){i.e(d)}finally{i.f()}}t.parentId=xt;var s=new Me.Vector3(t.cx,t.cy,t.cz).applyEuler(new Me.Euler(0,0,e.rotation[2])).add(W.current);t.cx=s.x,t.cy=s.y,t.cz=0,L.current.set(t.id,new Me.Vector3(s.x,s.y,0)),U.current.set(t.id,xt)},ue=function(e,t,l){if(e&&t){var a=Et.getState().contentRef;if(null===a||void 0===a?void 0:a.current){var o=Tw.getObjectChildById(a.current,t),i=Tw.getObjectChildById(t===xt?a.current:o,l);if(i){if(e===xt)a.current.add(i);else{var r=Tw.getObjectChildById(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}}},fe=function(e,t){e&&a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&!Tw.isFoundationOrCuboid(i)){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},he=function(e){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.object.userData.stand)return a}}catch(o){l.e(o)}finally{l.f()}return null},pe=function(e,t){if(e&&e.current){var l=he(t.intersections);if(l){var a=l.object,o=e.current.parent;if("Ground"===a.name){if(o&&"Content"!==o.name){var i=Et.getState().contentRef;i&&i.current&&(i.current.add(e.current),fe(xt,se(e.current)))}e.current.position.copy(l.point),Object(Se.c)()}else if(a.userData.stand){var r=a.parent;if(r){o&&o.uuid!==r.uuid&&(r.add(e.current),fe(se(r),se(e.current))),X.set(0,0,-r.rotation.z);var n=(new Me.Vector3).subVectors(l.point,r.position).applyEuler(X);e.current.position.copy(n),Object(Se.c)()}}}}},ye=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e){Tw.isFoundationOrCuboid(r)||(r.parentId=t),r.cx=l.x,r.cy=l.y,r.cz=l.z;break}}}catch(n){i.e(n)}finally{i.f()}}))};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("mesh",{ref:H,name:"Sky",rotation:[vt,0,0],scale:[1,ie,1],onContextMenu:function(e){e.intersections.length>0&&(e.intersections[0].object===H.current&&(o(),a((function(e){e.clickObjectType=V.Sky,e.contextMenuObjectType=V.Sky}))))},onPointerDown:function(e){if(2!==e.button){a((function(e){e.contextMenuObjectType=null})),ce(e);var t=z.current;if(t)switch(F.current=t.lz,W.current.set(t.cx,t.cy,t.cz),t.type){case V.Human:N.current=t.parentId;break;case V.Tree:N.current=t.parentId,O.current=t.lx;break;case V.Cuboid:W.current.set(t.cx,t.cy,t.cz),C.current.set(t.lx,t.ly,t.lz),D.current.clear();var l=new Me.Vector3(t.cx,t.cy,t.cz),o=d(t.id);if(o.length>0){k.current.clear();var i,r=t.rotation[2],n=Object(f.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;switch(c.type){case V.Tree:case V.Human:var s=new Me.Vector3(c.cx,c.cy,c.cz).applyEuler(new Me.Euler(0,0,r));s.add(l),D.current.set(c.id,s),k.current.set(c.id,new Me.Vector3(c.cx,c.cy,c.cz));break;case V.SolarPanel:case V.Sensor:if(Tw.isIdentical(c.normal,Tt)){var u=new Me.Vector3(c.cx*t.lx,c.cy*t.ly,c.cz*t.lz).applyEuler(new Me.Euler(0,0,r));u.add(l),D.current.set(c.id,u)}break;case V.Polygon:if(Tw.isIdentical(c.normal,Tt)){var h,p=c,y=[],g=Object(f.a)(p.vertices);try{for(g.s();!(h=g.n()).done;){var m=h.value,w=new Me.Vector2(m.x*t.lx,m.y*t.ly).rotateAround(Dt,r);w.add(new Me.Vector2(l.x,l.y)),y.push(w)}}catch(x){g.e(x)}finally{g.f()}M.current.set(p.id,y)}}}}catch(x){n.e(x)}finally{n.f()}}}}},children:[Object(gf.jsx)("sphereBufferGeometry",{args:[5e3,16,8,0,bt,0,vt]}),Object(gf.jsx)("meshToonMaterial",{map:ne,side:Me.BackSide,opacity:1,color:"skyblue"})]}),z.current&&_!==Z.Sky&&Object(gf.jsx)(Lt.f,{ref:R,visible:!1,name:"Sky Intersection Plane",rotation:te,position:ee,args:[1e3,1e3],onPointerMove:function(e){if(z.current&&z.current.type&&!z.current.locked){var t,l=new Me.Vector2;if(l.x=e.offsetX/j.clientWidth*2-1,l.y=-e.offsetY/j.clientHeight*2+1,G.setFromCamera(l,S),R.current&&_===Z.Vertical&&(t=G.intersectObjects([R.current]))&&t.length>0){var o=t[0].point;switch(z.current.type){case V.Tree:var i=z.current;switch(g){case K.Top:y(i.id,o.z),a((function(e){e.selectedElementHeight=Math.max(1,o.z)}));break;case K.Left:case K.Right:case K.Upper:case K.Lower:p(i.id,2*Math.hypot(o.x-i.cx,o.y-i.cy))}pe(Et.getState().treeRef,e);break;case V.Human:pe(Et.getState().humanRef,e);break;case V.Cuboid:if(Tw.isTopResizeHandle(g)){a((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a,i=t.value;if(i.id===(null===(a=z.current)||void 0===a?void 0:a.id)){i.cz=Math.max(.5,o.z/2),i.lz=Math.max(1,o.z);break}}}catch(r){l.e(r)}finally{l.f()}e.selectedElementHeight=Math.max(1,o.z)}));var r=Et.getState().cuboidRef;if(null===r||void 0===r?void 0:r.current){var n,c=Object(f.a)(r.current.children);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.name.includes("Human")||s.name.includes("Tree")){var d=D.current.get(se(s));d&&(Math.abs(F.current-d.z)<.01?s.position.setZ(Math.max(o.z/2,.5)):s.position.setZ(d.z-r.current.position.z))}}}catch(u){c.e(u)}finally{c.f()}}}}}}},onPointerUp:function(){var e,t;if(z.current){var l=h(z.current.id);if(l&&!l.locked){var o=null,i=N.current;switch(l.type){case V.Cuboid:switch(g){case K.UpperLeftTop:case K.UpperRightTop:case K.LowerLeftTop:case K.LowerRightTop:Y.current.clear(),a((function(e){e.actionState.cuboidHeight=l.lz;var t,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(Tw.isPlantOrHuman(o)&&o.parentId===l.id)if(Y.current.set(o.id,l.id),Math.abs(C.current.z/2-o.cz)<.01)o.cz=l.lz/2;else{var i=o.cz+W.current.z-l.cz;Math.abs(i)>l.lz/2?de(l,o):o.cz=i}}}catch(r){a.e(r)}finally{a.f()}}));var r=d(l.id);if(r.length>0){var n,c=Object(f.a)(r);try{for(c.s();!(n=c.n()).done;){var s=n.value;L.current.set(s.id,new Me.Vector3(s.cx,s.cy,s.cz))}}catch(ie){c.e(ie)}finally{c.f()}}var m={name:"Change Cuboid Height",timestamp:Date.now(),changedElementId:l.id,changedElementType:l.type,oldValue:F.current,newValue:l.lz,oldChildrenPositionsMap:new Map(k.current),newChildrenPositionsMap:new Map(L.current),oldChildrenParentIdMap:new Map(Y.current),newChildrenParentIdMap:new Map(U.current),undo:function(){if(a((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===m.changedElementId){a.lz=m.oldValue,a.cz=m.oldValue/2;break}}}catch(ie){l.e(ie)}finally{l.f()}})),m.oldChildrenPositionsMap&&m.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(m.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),o=l[0],i=l[1],r=h(o);if((null===r||void 0===r?void 0:r.type)!==V.Polygon){var n,c;v(o,i.x,i.y,i.z);var s=null===(n=m.oldChildrenParentIdMap)||void 0===n?void 0:n.get(o),d=null===(c=m.newChildrenParentIdMap)||void 0===c?void 0:c.get(o);s&&d&&s!==d&&(ue(s,d,o),fe(s,o))}}}catch(ie){t.e(ie)}finally{t.f()}}},redo:function(){if(a((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===m.changedElementId){a.lz=m.newValue,a.cz=m.newValue/2;break}}}catch(ie){l.e(ie)}finally{l.f()}})),m.newChildrenPositionsMap&&m.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(m.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,o,i=Object(u.a)(e.value,2),r=i[0],n=i[1];v(r,n.x,n.y,n.z);var c=null===(l=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),s=null===(o=m.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(ue(s,c,r),fe(s,r))}}catch(ie){t.e(ie)}finally{t.f()}}}};x(m)}break;case V.Tree:switch(g){case K.Top:var w={name:"Change Tree Height",timestamp:Date.now(),changedElementId:l.id,changedElementType:l.type,oldValue:F.current,newValue:l.lz,undo:function(){y(w.changedElementId,w.oldValue)},redo:function(){y(w.changedElementId,w.newValue)}};x(w),a((function(e){e.actionState.treeHeight=l.lz}));break;case K.Left:case K.Right:case K.Lower:case K.Upper:var b={name:"Change Tree Spread",timestamp:Date.now(),changedElementId:l.id,changedElementType:l.type,oldValue:O.current,newValue:l.lx,undo:function(){p(b.changedElementId,b.oldValue)},redo:function(){p(b.changedElementId,b.newValue)}};x(b),a((function(e){e.actionState.treeSpread=l.lx}))}o=null===(e=Et.getState().treeRef)||void 0===e?void 0:e.current;break;case V.Human:o=null===(t=Et.getState().humanRef)||void 0===t?void 0:t.current}if(o){var T=G.intersectObjects(Tw.fetchIntersectables(P),!1),j=he(T);if(j){var R=j.point;if("Ground"===j.object.name)ye(l.id,xt,R),I.current.set(R.x,R.y,R.z),i=xt;else if(j.object.userData.stand){var D=se(j.object),M=j.object.parent;if(M){var E=(new Me.Vector3).subVectors(R,M.position).applyEuler(X);ye(l.id,D,E),I.current.set(E.x,E.y,E.z),i=D}}}}if(Ew.getState().moveHandleType&&Tw.isPlantOrHuman(l)&&(I.current.distanceToSquared(W.current)>At||G.intersectObjects([H.current]).length>0)){var B=!0;if(!Ew.getState().viewState.orthographic&&!(B=I.current.length().02}if(!B||function(){if(Ew.getState().viewState.orthographic)return!1;if(H.current){var e=G.intersectObjects(Tw.fetchIntersectables(P),!1);if(e.length>0){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;)if(t.value.object.userData.stand)return!1}catch(ie){l.e(ie)}finally{l.f()}}}return G.intersectObjects([H.current]).length>0}()){v(l.id,W.current.x,W.current.y,W.current.z),o&&Tw.isPlantOrHuman(l)&&o.position.copy(W.current),Tw.isPlantOrHuman(l)&&fe(N.current,l.id);var le=Et.getState().contentRef;if((null===le||void 0===le?void 0:le.current)&&N.current&&o){if(N.current===xt)le.current.add(o);else{var ae=Tw.getObjectChildById(le.current,N.current);null===ae||void 0===ae||ae.add(o)}Object(Se.c)()}Qh(me.t("message.CannotMoveObjectTooFar",J))}else{var oe={name:"Move",timestamp:Date.now(),movedElementId:l.id,movedElementType:l.type,oldCx:W.current.x,oldCy:W.current.y,oldCz:W.current.z,newCx:I.current.x,newCy:I.current.y,newCz:I.current.z,oldParentId:N.current,newParentId:i,undo:function(){v(oe.movedElementId,oe.oldCx,oe.oldCy,oe.oldCz),fe(oe.oldParentId,oe.movedElementId),ue(oe.oldParentId,oe.newParentId,oe.movedElementId)},redo:function(){v(oe.movedElementId,oe.newCx,oe.newCy,oe.newCz),fe(oe.newParentId,oe.movedElementId),ue(oe.newParentId,oe.oldParentId,oe.movedElementId)}};x(oe),A()}}}z.current=null,$(Z.Sky),a((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null})),Et.setState((function(e){e.humanRef=null,e.treeRef=null,e.setEnableOrbitController(!0)}))}},children:Object(gf.jsx)("meshStandardMaterial",{side:Me.DoubleSide})})]})},ax=n.a.memo(lx),ox=function(e){var t=e.lineWidth,l=void 0===t?1:t,a=e.endPoint,i=void 0===a?1e3:a,c=e.showTickMarks,s=void 0===c||c,d=e.showTickLabels,f=void 0===d||d,h=Ew(Dr),p=Ew(Kr),y=Ew(o.orthographic),g=Object(r.useState)(!1),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useRef)(1),b=Object(r.useRef)(10*v.current),A=Object(r.useRef)(new Array(50).fill(1)),T=.3,P="FloralWhite",S=l/2,j=Object(Se.e)(Me.FontLoader,ty),H=Math.min(1,Math.max(.5,.01*p)),z={font:j,height:0,size:H},R=y?h.max.z+.01:0;Object(r.useEffect)((function(){v.current=p<50?1:p<100?2:5,b.current=10*v.current,A.current=new Array(50).fill(1),x(!w)}),[p]);var D=function(e){return e%(5*v.current)===0?T:.1};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},name:"x axis line",points:[[-i,0,R],[i,0,R]],color:"red",lineWidth:l}),y&&s&&A.current.map((function(e,t){var l=(t+1)*v.current,a=D(l);return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[l,-a,R],[l,a,R]],color:P,lineWidth:S}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-l,-a,R],[-l,a,R]],color:P,lineWidth:S})]},l)})),y&&f&&A.current.map((function(e,t){var l=(t+1)*v.current;return l%b.current===0?Object(gf.jsxs)("mesh",{userData:{unintersectable:!0},position:[l-H,-.6-H,R],children:[Object(gf.jsx)("textGeometry",{args:[(l<10?" ":"")+l,z]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(gf.jsx)(n.a.Fragment,{},l)})),y&&f&&A.current.map((function(e,t){var l=-(t+1)*v.current;return l%b.current===0?Object(gf.jsxs)("mesh",{userData:{unintersectable:!0},position:[l-H,-.6-H,R],children:[Object(gf.jsx)("textGeometry",{args:[(l>-10?" ":"")+l,z]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(gf.jsx)(n.a.Fragment,{},l)})),Object(gf.jsx)(Jl.a,{name:"y axis line",userData:{unintersectable:!0},points:[[0,-i,R],[0,i,R]],color:"blue",lineWidth:l}),y&&s&&A.current.map((function(e,t){var l=(t+1)*v.current,a=D(l);return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-a,l,R],[a,l,R]],color:P,lineWidth:1.5*S}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-a,-l,R],[a,-l,R]],color:P,lineWidth:1.5*S})]},l)})),y&&f&&A.current.map((function(e,t){var l=(t+1)*v.current;return l%b.current===0?Object(gf.jsxs)("mesh",{userData:{unintersectable:!0},position:[-.6-2*H,l-H/2,R],children:[Object(gf.jsx)("textGeometry",{args:[l+"",z]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(gf.jsx)(n.a.Fragment,{},l)})),y&&f&&A.current.map((function(e,t){var l=-(t+1)*v.current;return l%b.current===0?Object(gf.jsxs)("mesh",{userData:{unintersectable:!0},position:[-.6-2*H,l-H/2,R],children:[Object(gf.jsx)("textGeometry",{args:[l+"",z]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(gf.jsx)(n.a.Fragment,{},l)})),!y&&Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},name:"z axis line",points:[[0,0,0],[0,0,i]],color:"green",lineWidth:l})]})},ix=n.a.memo(ox),rx=l(803),nx=function(e){var t,l,a,i,n,c,s=e.id,d=e.cx,h=e.cy,p=e.cz,y=e.name,g=void 0===y?ne.Jack:y,m=e.locked,w=void 0!==m&&m,x=e.flip,v=void 0!==x&&x,b=e.observer,A=void 0!==b&&b,T=e.parentId,P=!1;Ew((function(e){if(T===xt)P=!0;else{var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){if(t.value.id===T){P=!0;break}}}catch(a){l.e(a)}finally{l.f()}}}));var S=Ew(qc);Object(r.useEffect)((function(){P||S(s,!1)}),[P,s]);var j=Ew(si),H=Ew(Vi),z=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,R=Ew(is),D=Ew(Zr),M=Ew(zu),W=Ew(Hu),I=_f(s),C=Object(Se.f)().gl,O=Object(r.useState)(!1),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useState)(!1),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Et((function(e){return e.contentRef})),G=Object(r.useRef)(null),K=Object(r.useRef)(null),q=Object(r.useMemo)((function(){return{lng:H}}),[H]),Q=Object(r.useMemo)((function(){return D(s)}),[s]),Z=Object(r.useRef)(!1),_=Ew(Tr);_!==Z.current&&(Z.current=_,(null===J||void 0===J?void 0:J.current)&&G.current&&J.current.add(G.current)),Object(r.useEffect)((function(){if(T!==xt){var e=se();e&&G.current&&e.add(G.current)}}),[_]);var $=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(Tl.fetchTextureImage(g),(function(e){v&&(e.wrapS=Me.RepeatWrapping,e.repeat.x=-1),ae(e),N(!U)}))}),[g,v]),ee=Object(r.useState)($),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useMemo)((function(){return Tl.fetchWidth(g)}),[g]),ie=Object(r.useMemo)((function(){return Tl.fetchHeight(g)}),[g]),ce=Object(r.useMemo)((function(){return Tl.fetchLabel(g,q)+(w?" ("+me.t("shared.ElementLocked",q)+")":"")+"\n"+me.t("word.Coordinates",q)+": ("+d.toFixed(1)+", "+h.toFixed(1)+") "+me.t("word.MeterAbbreviation",q)}),[g,w,H,d,h]);Object(r.useEffect)((function(){var e=se();e&&G.current&&e.add(G.current)}),[J]);var se=function(){return T!==xt&&(null===J||void 0===J?void 0:J.current)?Tw.getObjectChildById(J.current,T):null};Object(Se.d)((function(e){var t=e.camera;if(G.current){var l=Tw.getWorldDataById(T).rot;if(z)G.current.rotation.set(vt,Math.PI-l,0);else{var a=t.position,o=a.x,i=a.y,r=G.current.localToWorld(new Me.Vector3),n=r.x,c=r.y;G.current.rotation.set(0,0,-Math.atan2(o-n,i-c)-l)}}}));var de=Object(r.useCallback)((function(e,t){Tf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(j((function(e){e.hoveredHandle=t,e.selectedElementHeight=Q.lz})),Tw.isMoveHandle(t)?C.domElement.style.cursor="move":C.domElement.style.cursor="pointer")}),[]),ue=Object(r.useCallback)((function(){j((function(e){e.hoveredHandle=null})),C.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"default"}),[]),fe=A?Tl.fetchGender(Q.name):re.Male,he=A?(Q.flip?-1:1)*Tl.fetchHatOffsetX(Q.name):0,pe=A?Tl.fetchHatOffsetY(Q.name):0;return P?Object(gf.jsx)("group",{ref:G,name:"Human Group "+s,userData:{aabb:!0},position:[d,h,null!==p&&void 0!==p?p:0],children:Object(gf.jsxs)("group",{position:[0,.1,ie/2],children:[Object(gf.jsx)(rx.a,{rotation:[vt,0,0],uuid:s,name:g,follow:!1,children:Object(gf.jsx)(Lt.f,{ref:K,renderOrder:3,receiveShadow:!0,name:"Human ".concat(g," plane"),args:[oe,ie],onContextMenu:function(e){R(s,e,X.ContextMenu),j((function(t){e.intersections.length>0&&(e.intersections[0].object===K.current&&(t.contextMenuObjectType=V.Human))}))},onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(R(s,e,X.Move),Et.setState((function(e){e.humanRef=G})))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===K.current&&Y(!0))},onPointerOut:function(e){Y(!1)},children:Object(gf.jsx)("meshToonMaterial",{map:le,alphaTest:.5,side:Me.DoubleSide})})}),I&&w&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-oe/2,0,-ie/2],[-oe/2,0,ie/2],[-oe/2,0,ie/2],[oe/2,0,ie/2],[oe/2,0,-ie/2],[oe/2,0,ie/2],[oe/2,0,-ie/2],[-oe/2,0,-ie/2]],castShadow:!1,receiveShadow:!1,lineWidth:.5,rotation:null===(l=K.current)||void 0===l?void 0:l.rotation,color:yt}),A&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{uuid:s,visible:!1,userData:{eyeball:!0},name:g+" eyeball",args:[oe/5,4,4,0,bt,0,bt],position:[0,0,Q.lz/2],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.d,{name:"Observer hat 1",userData:{unintersectable:!0},castShadow:!1,receiveShadow:!1,args:[.1,.1,.1,16,2],position:[he,0,Q.lz/2-.05+pe],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:fe===re.Male?"gray":"hotpink"})}),Object(gf.jsx)(Lt.d,{name:"Observer hat 2",userData:{unintersectable:!0},castShadow:!1,receiveShadow:!1,args:[.2,.2,.01,16,2],position:[he,0,Q.lz/2-.1+pe],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:fe===re.Male?"gray":"hotpink"})})]}),I&&!w&&Object(gf.jsx)(Lt.h,{position:[0,0,-ie/2],args:[.4,6,6,0,Math.PI],name:B.Default,onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(R(s,e,X.Move),Et.setState((function(e){e.humanRef=G})))},onPointerEnter:function(e){de(e,B.Default)},onPointerLeave:ue,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:W===B.Default||M===B.Default?pt:ut})}),k&&!I&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:ce,color:null!==(a=null===Q||void 0===Q?void 0:Q.labelColor)&&void 0!==a?a:"white",fontSize:null!==(i=null===Q||void 0===Q?void 0:Q.labelFontSize)&&void 0!==i?i:20,textHeight:null!==(n=null===Q||void 0===Q?void 0:Q.labelSize)&&void 0!==n?n:.2,position:[0,0,ie/2+(null!==(c=null===Q||void 0===Q?void 0:Q.labelHeight)&&void 0!==c?c:.4)]})]})}):null},cx=n.a.memo(nx),sx=l.p+"static/media/apple_spring.0cad3025.png",dx=l.p+"static/media/apple_summer.46de7d87.png",ux=l.p+"static/media/apple_fall.27ba1ce5.png",fx=l.p+"static/media/apple_winter.d23599a6.png",hx=l.p+"static/media/birch_spring.6960e824.png",px=l.p+"static/media/birch_summer.59ae1138.png",yx=l.p+"static/media/birch_fall.210e663d.png",gx=l.p+"static/media/birch_winter.c4988403.png",mx=l.p+"static/media/coconut.d38cdccd.png",wx=l.p+"static/media/dogwood_spring.c53ecf05.png",xx=l.p+"static/media/dogwood_summer.8f3157af.png",vx=l.p+"static/media/dogwood_fall.cb8fd9b6.png",bx=l.p+"static/media/dogwood_winter.745583bb.png",Ax=l.p+"static/media/elm_spring.a67f6f9c.png",Tx=l.p+"static/media/elm_summer.0e729b1c.png",Px=l.p+"static/media/elm_fall.720b87ef.png",Sx=l.p+"static/media/elm_winter.49563d13.png",jx=l.p+"static/media/fan_palm.dd78413a.png",Hx=l.p+"static/media/linden_spring.073d4e74.png",zx=l.p+"static/media/linden_summer.7a1479da.png",Rx=l.p+"static/media/linden_fall.3e8bb305.png",Dx=l.p+"static/media/linden_winter.9af7eb0e.png",Mx=l.p+"static/media/magnolia_spring.8dc3ef2d.png",Wx=l.p+"static/media/magnolia_summer.00567305.png",Ix=l.p+"static/media/magnolia_fall.475b9098.png",Cx=l.p+"static/media/magnolia_winter.8a371c67.png",Ox=l.p+"static/media/maple_spring.e1e24394.png",Fx=l.p+"static/media/maple_summer.7b3e9753.png",kx=l.p+"static/media/maple_fall.5e8e43bb.png",Yx=l.p+"static/media/maple_winter.37fba60e.png",Lx=l.p+"static/media/oak_spring.3b768daa.png",Ex=l.p+"static/media/oak_summer.54230708.png",Ux=l.p+"static/media/oak_fall.ba997613.png",Nx=l.p+"static/media/oak_winter.02087599.png",Vx=l.p+"static/media/pine.80a6a140.png",Jx=l.p+"static/media/spruce.dea2071b.png",Gx=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"isEvergreen",value:function(e){return e===oe.Spruce||e===oe.Pine||e===oe.FanPalm||e===oe.Coconut}},{key:"isConic",value:function(e){return e===oe.Spruce}},{key:"fetchLabel",value:function(e,t){switch(e){case oe.Apple:return me.t("tree.Apple",t);case oe.Birch:return me.t("tree.Birch",t);case oe.Coconut:return me.t("tree.Coconut",t);case oe.Dogwood:return me.t("tree.Dogwood",t);case oe.Elm:return me.t("tree.Elm",t);case oe.FanPalm:return me.t("tree.FanPalm",t);case oe.Linden:return me.t("tree.Linden",t);case oe.Magnolia:return me.t("tree.Magnolia",t);case oe.Maple:return me.t("tree.Maple",t);case oe.Oak:return me.t("tree.Oak",t);case oe.Spruce:return me.t("tree.Spruce",t);default:return me.t("tree.Pine",t)}}},{key:"fetchTheta",value:function(e){switch(e){case oe.Apple:return.65*Math.PI;case oe.Birch:return.72*Math.PI;case oe.Coconut:return.5*Math.PI;case oe.Dogwood:return.65*Math.PI;case oe.Elm:return.78*Math.PI;case oe.FanPalm:return.52*Math.PI;case oe.Linden:return.75*Math.PI;case oe.Magnolia:return.68*Math.PI;case oe.Maple:return.65*Math.PI;case oe.Oak:return.75*Math.PI;case oe.Spruce:return Math.PI;default:return.5*Math.PI}}},{key:"fetchTextureImage",value:function(e,t,l,a,o){var i,r=a+30,n=o-30,c=l>0;switch(e){case oe.Apple:i=t>=o||t<=a?c?fx:dx:t>a&&t<=r?c?sx:ux:t>r&&t<=n?c?dx:fx:c?ux:sx;break;case oe.Birch:i=t>=o||t<=a?c?gx:px:t>a&&t<=r?c?hx:yx:t>r&&t<=n?c?px:gx:c?yx:hx;break;case oe.Coconut:i=mx;break;case oe.Dogwood:i=t>=o||t<=a?c?bx:xx:t>a&&t<=r?c?wx:vx:t>r&&t<=n?c?xx:bx:c?vx:wx;break;case oe.Elm:i=t>=o||t<=a?c?Sx:Tx:t>a&&t<=r?c?Ax:Px:t>r&&t<=n?c?Tx:Sx:c?Px:Ax;break;case oe.FanPalm:i=jx;break;case oe.Linden:i=t>=o||t<=a?c?Dx:zx:t>a&&t<=r?c?Hx:Rx:t>r&&t<=n?c?zx:Dx:c?Rx:Hx;break;case oe.Magnolia:i=t>=o||t<=a?c?Cx:Wx:t>a&&t<=r?c?Mx:Ix:t>r&&t<=n?c?Wx:Cx:c?Ix:Mx;break;case oe.Maple:i=t>=o||t<=a?c?Yx:Fx:t>a&&t<=r?c?Ox:kx:t>r&&t<=n?c?Fx:Yx:c?kx:Ox;break;case oe.Oak:i=t>=o||t<=a?c?Nx:Ex:t>a&&t<=r?c?Lx:Ux:t>r&&t<=n?c?Ex:Nx:c?Ux:Lx;break;case oe.Spruce:i=Jx;break;default:i=Vx}return i}}]),e}(),Xx=function(e){var t,l,a,n,c,s,d,h,p=e.parentId,y=e.id,g=e.cx,m=e.cy,w=e.cz,x=e.lx,v=e.lz,b=e.name,A=void 0===b?oe.Pine:b,T=e.flip,P=void 0!==T&&T,S=e.locked,j=void 0!==S&&S,H=e.showModel,z=void 0!==H&&H,R=e.showLabel,D=void 0!==R&&R,M=!1;Ew((function(e){if(p===xt)M=!0;else{var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){if(t.value.id===p){M=!0;break}}}catch(a){l.e(a)}finally{l.f()}}}));var W=Ew(qc);Object(r.useEffect)((function(){M||W(y,!1)}),[M]);var I=Ew(si),C=Ew(Vi),O=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,F=Ew(i.date),k=Ew(i.latitude),Y=null!==(l=Ew(i.leafDayOfYear1))&&void 0!==l?l:rt,L=null!==(a=Ew(i.leafDayOfYear2))&&void 0!==a?a:nt,E=Ew(o.shadowEnabled),U=Ew(is),N=Ew(Zr),J=Ew(zu),G=Ew(Ru),q=Ew(Hu),Q=_f(y),Z=Object(r.useState)(!1),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Object(r.useState)(!1),le=Object(u.a)(te,2),ae=le[0],ie=le[1],re=Object(Se.f)().gl,ne=Et((function(e){return e.contentRef})),ce=Object(r.useRef)(null),se=Object(r.useRef)(null),de=Object(r.useRef)(null),ue=Object(r.useRef)(null),fe=Object(r.useRef)(null),he=Object(r.useRef)(),pe=Object(r.useRef)(),ye=Object(r.useRef)(),ge=Object(r.useRef)(),we=Object(r.useRef)(),xe=Object(r.useMemo)((function(){return{lng:C}}),[C]),ve=Object(r.useMemo)((function(){return N(y)}),[y]),be=Object(r.useMemo)((function(){return Tw.dayOfYear(new Date(F))}),[F]),Ae=Object(r.useMemo)((function(){return!Gx.isEvergreen(ve?ve.name:oe.Dogwood)&&(k>0?beL:be>=Y&&be<=L)}),[be,Y,L,k,null===ve||void 0===ve?void 0:ve.name]),Te=Object(r.useRef)(!1),Pe=Ew(Tr);Pe!==Te.current&&(Te.current=Pe,(null===ne||void 0===ne?void 0:ne.current)&&ce.current&&ne.current.add(ce.current)),Object(r.useEffect)((function(){if(p!==xt){var e=Je();e&&ce.current&&e.add(ce.current)}}),[Pe]),Object(r.useEffect)((function(){var e=Je();e&&ce.current&&e.add(ce.current)}),[ne]);var je=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(Gx.fetchTextureImage(A,be,k,Y,L),(function(e){P&&(e.wrapS=Me.RepeatWrapping,e.repeat.x=-1),De(e),ie(!ae)}))}),[A,be,k,P,Y,L]),He=Object(r.useState)(je),ze=Object(u.a)(He,2),Re=ze[0],De=ze[1],We=Object(r.useMemo)((function(){return((null===ve||void 0===ve?void 0:ve.label)?ve.label:Gx.fetchLabel(A,xe))+(j?" ("+me.t("shared.ElementLocked",xe)+")":"")+((null===ve||void 0===ve?void 0:ve.label)?"":"\n"+me.t("word.Coordinates",xe)+": ("+g.toFixed(1)+", "+m.toFixed(1)+") "+me.t("word.MeterAbbreviation",xe))}),[null===ve||void 0===ve?void 0:ve.label,A,g,m,j,C]),Ie=Object(r.useMemo)((function(){return Gx.fetchTheta(A)}),[A]),Ce=new Me.MeshDepthMaterial({depthPacking:Me.RGBADepthPacking,map:Re,alphaTest:.1}),Oe=x/2,Fe=v/2,ke=Object(r.useMemo)((function(){return new Me.Vector3(0,0,Fe)}),[Fe]),Ye=Object(r.useMemo)((function(){return new Me.Vector3(-Oe,0,0)}),[Oe]),Le=Object(r.useMemo)((function(){return new Me.Vector3(Oe,0,0)}),[Oe]),Ee=Object(r.useMemo)((function(){return new Me.Vector3(0,-Oe,0)}),[Oe]),Ue=Object(r.useMemo)((function(){return new Me.Vector3(0,Oe,0)}),[Oe]),Ne=Object(r.useCallback)((function(e,t){Tf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(I((function(e){e.hoveredHandle=t,e.selectedElementHeight=ve.lz})),Tw.isMoveHandle(t)?re.domElement.style.cursor="move":re.domElement.style.cursor="pointer")}),[]),Ve=Object(r.useCallback)((function(){I((function(e){e.hoveredHandle=null})),re.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"default"}),[]),Je=function(){return p!==xt&&(null===ne||void 0===ne?void 0:ne.current)?Tw.getObjectChildById(ne.current,p):null};Object(Se.d)((function(e){var t=e.camera;if(se.current&&ce.current&&de.current&&fe.current){var l=Tw.getWorldDataById(p).rot,a=t.position,o=a.x,i=a.y,r=ce.current.position,n=r.x,c=r.y,s=Ew.getState().sunlightDirection,d=s.x,u=s.y;if(Je()){var f=ce.current.localToWorld(new Me.Vector3),h=Math.atan2(o-f.x,i-f.y)+l;se.current.rotation.set(vt,-h,0),fe.current.rotation.set(-vt,h,0),de.current.rotation.set(vt,-Math.atan2(d,u)-l,0)}else{var y=Math.atan2(o-n,i-c);se.current.rotation.set(vt,-y,0),fe.current.rotation.set(-vt,y,0),de.current.rotation.set(vt,-Math.atan2(d,u),0)}}}));var Ge=.30000000000000004;return Object(gf.jsx)(gf.Fragment,{children:M?Object(gf.jsx)("group",{ref:ce,name:"Tree Group "+y,userData:{aabb:!0},position:[g,m,null!==w&&void 0!==w?w:0],children:Object(gf.jsxs)("group",{position:[0,0,v/2],children:[Object(gf.jsx)(rx.a,{ref:se,uuid:y,name:A,follow:!1,children:Object(gf.jsx)(Lt.f,{args:[x,v],children:Object(gf.jsx)("meshToonMaterial",{map:Re,side:Me.DoubleSide,alphaTest:.5})})}),Object(gf.jsx)(rx.a,{ref:de,name:A+" Shadow Billboard",follow:!1,children:Object(gf.jsx)(Lt.f,{castShadow:E,args:[x,v],customDepthMaterial:Ce,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,transparent:!0,opacity:0,depthTest:!1})})}),Gx.isConic(A)?Object(gf.jsx)(Lt.c,{visible:z||O,name:A+" Model",userData:{simulation:!0},position:[0,0,A===oe.Spruce?0:.06*v],args:[x/2,v,8,8,!0],scale:[1,1,1],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",side:Me.DoubleSide,transparent:!0,opacity:.75})}):Object(gf.jsx)(Lt.h,{visible:z||O,userData:{simulation:!Ae},name:A+" Model",args:[x/2,8,8,0,bt,0,Ie],scale:[1,v/x,1],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",side:Me.DoubleSide,transparent:!0,opacity:.75})}),Object(gf.jsx)(rx.a,{ref:fe,name:"Interaction Billboard",visible:!1,position:[0,0,-v/2+.5],children:Object(gf.jsx)(Lt.f,{ref:ue,renderOrder:3,name:A+" plane",args:[x/2,v/3],rotation:[O?vt:0,0,0],onContextMenu:function(e){U(y,e,X.ContextMenu),I((function(t){e.intersections.length>0&&(e.intersections[0].object===ue.current&&(t.contextMenuObjectType=V.Tree))}))},onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(U(y,e,X.Move),Et.setState((function(e){e.treeRef=ce})))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===ue.current&&ee(!0))},onPointerOut:function(e){ee(!1)}})}),Q&&j&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-x/2,-v/2,0],[-x/2,v/2,0],[-x/2,v/2,0],[x/2,v/2,0],[x/2,-v/2,0],[x/2,v/2,0],[x/2,-v/2,0],[-x/2,-v/2,0]],castShadow:!1,receiveShadow:!1,lineWidth:.5,rotation:null===(n=se.current)||void 0===n?void 0:n.rotation,color:yt}),Q&&!j&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{position:new Me.Vector3(0,0,-v/2),args:[Ge,6,6,0,Math.PI],name:B.Default,renderOrder:2,onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(U(y,e,X.Move),Et.setState((function(e){e.treeRef=ce})))},onPointerEnter:function(e){Ne(e,B.Default)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===B.Default||J===B.Default?pt:ut})}),!O&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.a,{ref:he,name:K.Top,args:[Ge,Ge,Ge],position:ke,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Top)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Top||G===K.Top?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:pe,name:K.Left,args:[Ge,Ge,Ge],position:Ye,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Left)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Left||G===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:ye,name:K.Right,args:[Ge,Ge,Ge],position:Le,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Right)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Right||G===K.Right?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:ge,name:K.Lower,args:[Ge,Ge,Ge],position:Ee,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Lower)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Lower||G===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:we,name:K.Upper,args:[Ge,Ge,Ge],position:Ue,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Upper)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Upper||G===K.Upper?pt:ht})})]})]}),($||D)&&!Q&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:We,color:null!==(c=null===ve||void 0===ve?void 0:ve.labelColor)&&void 0!==c?c:"white",fontSize:null!==(s=null===ve||void 0===ve?void 0:ve.labelFontSize)&&void 0!==s?s:20,textHeight:null!==(d=null===ve||void 0===ve?void 0:ve.labelSize)&&void 0!==d?d:.2,position:[0,0,v/2+(null!==(h=null===ve||void 0===ve?void 0:ve.labelHeight)&&void 0!==h?h:.4)]})]})}):null})},Bx=n.a.memo(Xx),Kx=l(58),qx=["args","children"];function Qx(e){var t=e+"Geometry";return r.forwardRef((function(e,l){var a=e.args,o=e.children,i=Object(Kx.a)(e,qx);return Object(gf.jsxs)("mesh",Object(d.a)(Object(d.a)({ref:l},i),{},{children:[Object(gf.jsx)(t,{attach:"geometry",args:a}),o]}))}))}var Zx,_x,$x,ev,tv,lv=Qx("ParabolicCylinder"),av=Qx("Paraboloid"),ov=function(e){var t,l,a,c,s=e.id,d=e.cx,h=e.cy,p=e.cz,y=e.lx,g=e.ly,m=e.lz,w=void 0===m?.1:m,x=e.reflectance,v=void 0===x?.9:x,b=e.absorberTubeRadius,A=void 0===b?.05:b,T=e.latusRectum,P=void 0===T?2:T,S=e.tiltAngle,j=e.relativeAzimuth,H=e.moduleLength,z=e.poleHeight,R=e.poleRadius,D=e.drawSunBeam,M=e.rotation,W=void 0===M?[0,0,0]:M,I=e.color,C=void 0===I?"white":I,O=e.lineColor,F=void 0===O?"black":O,k=e.lineWidth,Y=void 0===k?.5:k,L=e.showLabel,E=void 0!==L&&L,U=e.locked,N=void 0!==U&&U,J=e.parentId,G=Ew(si),Q=Ew(Vi),Z=Ew(i.date),_=Ew(i.latitude),$=Ew(Fi),ee=Tf(Ns),te=Ew(o.solarRadiationHeatmapMaxValue),le=Pf(wi),ae=Ew(o.shadowEnabled),oe=Ew(Zr),ie=Ew(is),re=Ew(Kr),ne=Ew(Ru),ce=Ew(Es),se=_f(s),de=Object(Se.f)().gl.domElement,ue=Object(r.useState)(!1),fe=Object(u.a)(ue,2),he=fe[0],pe=fe[1],ye=Object(r.useState)(null),ge=Object(u.a)(ye,2),we=ge[0],xe=ge[1],ve=Object(r.useState)(1),be=Object(u.a)(ve,2),Ae=be[0],Te=be[1],Pe=Object(r.useState)(null),je=Object(u.a)(Pe,2),He=je[0],ze=je[1],Re=Object(r.useRef)(),De=Object(r.useRef)(),We=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Oe=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(!1),Ye=Math.max(100,10*re),Le=16,Ee=ce.z<=0,Ue=Object(r.useMemo)((function(){return{lng:Q}}),[Q]),Ne=y/2,Ve=g/2,Je=w/2,Ge=z+Ne,Xe=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===J)return a}}catch(o){l.e(o)}finally{l.f()}}));if(J&&Xe)switch(Xe.type){case V.Foundation:if(p=Ge+Je+Xe.lz,Tw.isZero(W[2]))d=Xe.cx+d*Xe.lx,h=Xe.cy+h*Xe.ly;else{var Be=new Me.Vector3(d*Xe.lx,h*Xe.ly,0);Be.applyAxisAngle(Rt,W[2]),d=Xe.cx+Be.x,h=Xe.cy+Be.y}}var Ke=Ne*Ne/P,qe=.25*P,Qe=new Me.Vector3(-Ne,-Ve,Je+Ke),Ze=new Me.Vector3(-Ne,Ve,Je+Ke),_e=new Me.Vector3(Ne,-Ve,Je+Ke),$e=new Me.Vector3(Ne,Ve,Je+Ke),et=Object(r.useMemo)((function(){return oe(s)}),[s]);Object(r.useEffect)((function(){if(et&&ee){var e=le(et.id);e&&ze(Tw.fetchHeatmapTexture(e,null!==te&&void 0!==te?te:5))}}),[ee,te]),Object(r.useEffect)((function(){Te(Math.max(1,Math.round(g/H)))}),[g,H]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),ke.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var tt=Object(r.useMemo)((function(){return((null===et||void 0===et?void 0:et.label)?et.label:me.t("shared.ParabolicTroughElement",Ue))+((null===et||void 0===et?void 0:et.locked)?" ("+me.t("shared.ElementLocked",Ue)+")":"")+((null===et||void 0===et?void 0:et.label)?"":"\n"+me.t("word.Coordinates",Ue)+": ("+d.toFixed(1)+", "+h.toFixed(1)+", "+p.toFixed(1)+") "+me.t("word.MeterAbbreviation",Ue))}),[null===et||void 0===et?void 0:et.label,N,Q,d,h,p]),lt=Object(r.useMemo)((function(){return new Me.Euler(0,0,W[2],"ZXY")}),[W]),at=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(xe(t),t===B.Top?de.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?de.style.cursor="grab":de.style.cursor="pointer"))},ot=function(){xe(null),de.style.cursor="default"},it=Object(r.useMemo)((function(){return jy(new Date(Z),_)}),[Z,_]),rt=Object(r.useMemo)((function(){var e;return null===(e=oe(J))||void 0===e?void 0:e.rotation[2]}),[J]),nt=rt?it.clone().applyAxisAngle(Rt,-rt):it,ct=Object(r.useMemo)((function(){return it.z>0?new Me.Euler(0,Math.atan2(nt.x,nt.z),0,"ZXY"):new Me.Euler(S,0,j,"ZXY")}),[rt,it,S,j]),ut=Object(r.useMemo)((function(){if(it.z>0){var e=rt?Math.cos(rt):1,t=rt?Math.sin(rt):0;return-qe*(it.x*t+it.y*e)/Math.hypot(it.x,it.z)}return 0}),[it,rt,qe]),ft=new Me.Vector3(0,ut,qe).applyEuler(ct),gt=it.clone().multiplyScalar(Ye).applyEuler(new Me.Euler(-lt.x,0,-lt.z)),mt=-(Ge+w)/2,wt=Object(r.useMemo)((function(){for(var e=[],t=Math.cos(j)*H,l=Math.sin(j)*H,a=Ae/2-.5,o=0;o0&&(e.intersections[0].object===Re.current&&(t.contextMenuObjectType=V.ParabolicTrough))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===Re.current&&(pe(!0),de.style.cursor="move"))},onPointerOut:function(e){pe(!1),de.style.cursor="default"},children:ee&&He?Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.FrontSide,map:He}):Object(gf.jsx)("meshPhongMaterial",{attach:"material",specular:new Me.Color("white"),shininess:100*v,side:Me.FrontSide,color:"lightskyblue"})}),Object(gf.jsx)(lv,{receiveShadow:ae,castShadow:ae,uuid:s+" backside",ref:De,args:[P/2,y,g,Le,4],name:"Parabolic Trough Back Side",position:[0,0,-Je/2],onPointerDown:function(e){2!==e.button&&ie(s,e,X.Select)},onContextMenu:function(e){ie(s,e,X.ContextMenu),G((function(t){e.intersections.length>0&&(e.intersections[0].object===De.current&&(t.contextMenuObjectType=V.ParabolicTrough))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===De.current&&(pe(!0),de.style.cursor="move"))},onPointerOut:function(e){pe(!1),de.style.cursor="default"},children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",side:Me.BackSide,color:"white"})}),xt&&xt.map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Pt&&Object(gf.jsx)(Jl.a,{name:"Parabolic Trough Rim Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:Y,color:F}),(0===t||t===xt.length-1||Pt)&&Object(gf.jsx)(Jl.a,{name:"Parabolic Trough Focal Lines",userData:{unintersectable:!0},points:[e.points[8].clone(),e.points[8].clone().add(new Me.Vector3(0,0,qe))],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:Ee?"dimgray":"white"})]},t)})),Pt&&Object(gf.jsx)(Jl.a,{name:"Parabolic Trough Outline 1",userData:{unintersectable:!0},points:[[-Ne,-Ve,Ke],[-Ne,Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:F}),Pt&&Object(gf.jsx)(Jl.a,{name:"Parabolic Trough Outline 2",userData:{unintersectable:!0},points:[[Ne,-Ve,Ke],[Ne,Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:F}),Object(gf.jsx)(Lt.d,{name:"Parabolic Trough Absorber Tube",uuid:s,args:[A,A,g,Pt?6:2,1],position:[0,0,qe],receiveShadow:!1,castShadow:!0,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.f,{name:"Parabolic Trough Simulation Plane",uuid:s,args:[y,g],position:[0,0,Ke],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),se&&N&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Ne,-Ve,Ke],[-Ne,Ve,Ke],[Ne,Ve,Ke],[Ne,-Ve,Ke],[-Ne,-Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),se&&!N&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:We,position:new Me.Vector3(0,0,0),args:[Tt,6,6],name:B.Default,onPointerOver:function(e){at(e,B.Top)},onPointerOut:function(e){ot()},onPointerDown:function(e){2!==e.button&&ie(s,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.a,{ref:Ie,position:[(Qe.x+_e.x)/2,Qe.y,Qe.z-Ke],args:[At,At,1.2*w],name:K.Lower,onPointerDown:function(e){ie(s,e,X.Resize),Oe.current&&G((function(e){var t=Ie.current.localToWorld(new Me.Vector3(0,g,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Lower)},onPointerOut:function(e){ot()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Lower||ne===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Ce,position:[(Ze.x+$e.x)/2,Ze.y,Ze.z-Ke],args:[At,At,1.2*w],name:K.Upper,onPointerDown:function(e){ie(s,e,X.Resize),Oe.current&&G((function(e){var t=Ce.current.localToWorld(new Me.Vector3(0,-g,-Ze.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Upper)},onPointerOut:function(e){ot()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Upper||ne===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Oe,position:[Qe.x,(Qe.y+Ze.y)/2,Qe.z],args:[At,At,1.2*w],name:K.Left,onPointerDown:function(e){ie(s,e,X.Resize),Oe.current&&G((function(e){var t=Oe.current.localToWorld(new Me.Vector3(y,0,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Left)},onPointerOut:function(e){ot()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Left||ne===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Fe,position:[_e.x,(_e.y+$e.y)/2,_e.z],args:[At,At,1.2*w],name:K.Right,onPointerDown:function(e){ie(s,e,X.Resize),Oe.current&&G((function(e){var t=Fe.current.localToWorld(new Me.Vector3(-y,0,-_e.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Right)},onPointerOut:function(e){ot()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Right||ne===K.Right?pt:ht})})]})]})]}),Ge>0&&wt.map((function(e,t){return t%5===0||Pt?Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[R,R,Ge+2*(e.z-mt)+w,St,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:C})},t):Object(gf.jsx)(n.a.Fragment,{},t)})),D&&it.z>0&&Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[ft,new Me.Vector3(-.3*Ne,0,.09*Ke).applyEuler(ct),gt,new Me.Vector3(-.6*Ne,0,.36*Ke).applyEuler(ct),ft,new Me.Vector3(-.9*Ne,0,.81*Ke).applyEuler(ct),gt,new Me.Vector3(0,0,0),ft,new Me.Vector3(.3*Ne,0,.09*Ke).applyEuler(ct),gt,new Me.Vector3(.6*Ne,0,.36*Ke).applyEuler(ct),ft,new Me.Vector3(.9*Ne,0,.81*Ke).applyEuler(ct),gt],name:"Sun Beams",lineWidth:.25,color:"white"}),(he||E)&&!se&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:tt,color:null!==(t=null===et||void 0===et?void 0:et.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===et||void 0===et?void 0:et.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===et||void 0===et?void 0:et.labelSize)&&void 0!==a?a:.2,position:[0,0,null!==(c=null===et||void 0===et?void 0:et.labelHeight)&&void 0!==c?c:Math.max(Ve*Math.abs(Math.sin(et.tiltAngle))+.1,.2)]})]})},iv=n.a.memo(ov),rv=function(e){var t,l,a,c,s=e.id,d=e.cx,h=e.cy,p=e.cz,y=e.lx,g=e.ly,m=e.lz,w=void 0===m?.1:m,x=e.reflectance,v=void 0===x?.9:x,b=e.structureType,A=void 0===b?J.CentralPole:b,T=e.receiverRadius,P=void 0===T?.25:T,S=e.receiverPoleRadius,j=void 0===S?.1:S,H=e.latusRectum,z=void 0===H?2:H,R=e.tiltAngle,D=e.relativeAzimuth,M=e.poleHeight,W=e.poleRadius,I=void 0===W?.2:W,C=e.drawSunBeam,O=e.rotation,F=void 0===O?[0,0,0]:O,k=e.color,Y=void 0===k?"white":k,L=e.lineColor,E=void 0===L?"black":L,U=e.lineWidth,N=void 0===U?.25:U,G=e.showLabel,Q=void 0!==G&&G,Z=e.locked,_=void 0!==Z&&Z,$=e.parentId,ee=Ew(si),te=Ew(Vi),le=Ew(i.date),ae=Ew(i.latitude),oe=Ew(Fi),ie=Tf(Ns),re=Ew(o.solarRadiationHeatmapMaxValue),ne=Pf(wi),ce=Ew(o.shadowEnabled),se=Ew(Zr),de=Ew(is),ue=Ew(Kr),fe=Ew(Ru),he=Ew(Es),pe=_f(s),ye=Object(Se.f)().gl.domElement,ge=Object(r.useState)(!1),we=Object(u.a)(ge,2),xe=we[0],ve=we[1],be=Object(r.useState)(null),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],je=Object(r.useState)(null),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De=Object(r.useRef)(),We=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Oe=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Ye=Object(r.useRef)(!1),Le=Math.max(100,10*ue),Ee=he.z<=0,Ue=y/2,Ne=g/2,Ve=w/2,Je=M+Ue,Ge=Object(r.useMemo)((function(){return{lng:te}}),[te]),Xe=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===$)return a}}catch(o){l.e(o)}finally{l.f()}}));if($&&Xe)switch(Xe.type){case V.Foundation:if(p=Je+Ve+Xe.lz,Tw.isZero(F[2]))d=Xe.cx+d*Xe.lx,h=Xe.cy+h*Xe.ly;else{var Be=new Me.Vector3(d*Xe.lx,h*Xe.ly,0);Be.applyAxisAngle(Rt,F[2]),d=Xe.cx+Be.x,h=Xe.cy+Be.y}}var Ke=Ue*Ue/z,qe=.25*z,Qe=new Me.Vector3(-Ue,-Ne,Ve+Ke),Ze=new Me.Vector3(-Ue,Ne,Ve+Ke),_e=new Me.Vector3(Ue,-Ne,Ve+Ke),$e=new Me.Vector3(Ue,Ne,Ve+Ke),et=Object(r.useMemo)((function(){return se(s)}),[s]),tt=Object(Wy.a)(Iy),lt=P+1;Object(r.useEffect)((function(){if(et&&ie){var e=ne(et.id);e&&Re(Tw.fetchHeatmapTexture(e,null!==re&&void 0!==re?re:5))}}),[ie,re]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),Ye.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var at=Object(r.useMemo)((function(){return((null===et||void 0===et?void 0:et.label)?et.label:me.t("shared.ParabolicDishElement",Ge))+((null===et||void 0===et?void 0:et.locked)?" ("+me.t("shared.ElementLocked",Ge)+")":"")+((null===et||void 0===et?void 0:et.label)?"":"\n"+me.t("word.Coordinates",Ge)+": ("+d.toFixed(1)+", "+h.toFixed(1)+", "+p.toFixed(1)+") "+me.t("word.MeterAbbreviation",Ge))}),[null===et||void 0===et?void 0:et.label,_,te,d,h,p]),ot=Object(r.useMemo)((function(){return new Me.Euler(0,0,F[2],"ZXY")}),[F]),it=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(Pe(t),t===B.Top?ye.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?ye.style.cursor="grab":ye.style.cursor="pointer"))},rt=function(){Pe(null),ye.style.cursor="default"},nt=Object(r.useMemo)((function(){return jy(new Date(le),ae)}),[le,ae]),ct=Object(r.useMemo)((function(){var e;return null===(e=se($))||void 0===e?void 0:e.rotation[2]}),[$]),ut=ct?nt.clone().applyAxisAngle(Rt,-ct):nt,ft=Object(r.useMemo)((function(){if(nt.z>0){var e=Math.hypot(ut.x,ut.y);return new Me.Euler(Math.atan2(e,ut.z),0,Math.atan2(ut.y,ut.x)+vt,"ZXY")}return new Me.Euler(R,0,D,"ZXY")}),[nt,R,D]),gt=-(Je+w)/2,mt=oe.length<50,wt=Object(r.useMemo)((function(){var e=[];if(mt){for(var t,l,a,o=[],i=[],r=.25*Ke,n=0;n<=32;n++)t=bt*n/32,l=Math.cos(t),a=Math.sin(t),o.push(new Me.Vector3(Ue*l,Ue*a,Ke)),i.push(new Me.Vector3(Ue*l/2,Ue*a/2,r));e.push({points:o}),e.push({points:i});for(var c=0;c<12;c++){t=bt*c/12,l=Math.cos(t),a=Math.sin(t);for(var s=[],d=0;d<=8;d++){var u=0===d?0:d/8*Ue;s.push(new Me.Vector3(u*l,u*a,u*u/z+.01))}e.push({points:s})}}return e}),[Ue,z]),xt=Object(r.useMemo)((function(){if(A===J.CentralPoleWithTripod){for(var e,t=[],l=0;l<3;l++){e=bt*l/3;var a=[];a.push(new Me.Vector3(Ue*Math.cos(e),Ue*Math.sin(e),Ke)),a.push(new Me.Vector3(0,0,qe)),t.push({points:a})}return t}}),[Ue,z,A]),At=Object(r.useMemo)((function(){if(A===J.Quadrupod){for(var e,t=[],l=0;l<4;l++){e=bt*l/4;var a=[];a.push(new Me.Vector3(Ue*Math.cos(e),Ue*Math.sin(e),Ke)),a.push(new Me.Vector3(0,0,qe)),t.push({points:a})}return t}}),[Ue,z,A]),Tt=Math.max(1,(y+g)/16),Pt=dt*Tt*1.5,St=st*Tt*3,jt=nt.clone().multiplyScalar(Le),Ht=new Me.Vector3(0,0,qe).applyEuler(ft);return Object(gf.jsxs)("group",{name:"Parabolic Dish Group "+s,rotation:ot,position:[d,h,p+Ve],children:[Object(gf.jsxs)("group",{rotation:ft,children:[Object(gf.jsx)(av,{receiveShadow:ce,castShadow:ce,uuid:s,ref:De,args:[z/2,Ue,32,8],name:"Parabolic Dish Front Side",onPointerDown:function(e){2!==e.button&&de(s,e,X.Select)},onContextMenu:function(e){de(s,e,X.ContextMenu),ee((function(t){e.intersections.length>0&&(e.intersections[0].object===De.current&&(t.contextMenuObjectType=V.ParabolicDish))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===De.current&&(ve(!0),ye.style.cursor="move"))},onPointerOut:function(e){ve(!1),ye.style.cursor="default"},children:ie&&ze?Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.FrontSide,map:ze}):Object(gf.jsx)("meshPhongMaterial",{attach:"material",specular:new Me.Color("white"),shininess:100*v,side:Me.FrontSide,color:"lightskyblue"})}),Object(gf.jsx)(av,{receiveShadow:ce,castShadow:ce,uuid:s+" backside",ref:We,args:[z/2,Ue,32,8],name:"Parabolic Dish Back Side",position:[0,0,-Ve/4],onPointerDown:function(e){2!==e.button&&de(s,e,X.Select)},onContextMenu:function(e){de(s,e,X.ContextMenu),ee((function(t){e.intersections.length>0&&(e.intersections[0].object===We.current&&(t.contextMenuObjectType=V.ParabolicDish))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===We.current&&(ve(!0),ye.style.cursor="move"))},onPointerOut:function(e){ve(!1),ye.style.cursor="default"},children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",side:Me.BackSide,color:Y})}),wt&&wt.length>0&&wt.map((function(e,t){return Object(gf.jsx)(n.a.Fragment,{children:Object(gf.jsx)(Jl.a,{name:"Parabolic Dish Wireframe",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:N,color:E})},t)})),Object(gf.jsx)(Lt.d,{name:"Parabolic Dish Receiver",uuid:s,args:[P,P,.5,mt?12:4,1],rotation:[vt,0,0],position:[0,0,qe-.1],receiveShadow:!1,castShadow:!0,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),nt.z>0&&Object(gf.jsx)("mesh",{position:[0,0,qe-.1],children:Object(gf.jsx)("sprite",{scale:[lt,lt,lt],children:Object(gf.jsx)("spriteMaterial",{map:tt,transparent:!1,color:16777215,blending:Me.AdditiveBlending,depthWrite:!1})})}),(A===J.CentralPole||A===J.CentralPoleWithTripod)&&Object(gf.jsx)(Lt.d,{name:"Parabolic Dish Receiver Pole",uuid:s,args:[j,j,qe,mt?6:2,1],rotation:[vt,0,0],position:[0,0,qe/2],receiveShadow:!1,castShadow:!0,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),A===J.CentralPoleWithTripod&&xt&&xt.map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{name:"Parabolic Dish Tripod Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:1,color:Ee?"dimgray":Y}),Object(gf.jsx)(Lt.h,{position:new Me.Vector3(e.points[0].x,e.points[0].y,e.points[0].z),args:[j/2,4,4],name:"Parabolic Dish Tripod Joint",children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})})]},t)})),A===J.Quadrupod&&At&&At.map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{name:"Parabolic Dish Quadrupod Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:2,color:Ee?"dimgray":Y}),Object(gf.jsx)(Lt.h,{position:new Me.Vector3(e.points[0].x,e.points[0].y,e.points[0].z),args:[j/2,4,4],name:"Parabolic Dish Quadrupod Joint",children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})})]},t)})),Object(gf.jsx)(Lt.b,{name:"Parabolic Dish Simulation Circle",uuid:s,args:[y/2,32],position:[0,0,Ke],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),pe&&_&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Ue,-Ne,Ke],[-Ue,Ne,Ke],[Ue,Ne,Ke],[Ue,-Ne,Ke],[-Ue,-Ne,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),pe&&!_&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:Ie,position:new Me.Vector3(0,0,0),args:[St,6,6],name:B.Default,onPointerOver:function(e){it(e,B.Top)},onPointerOut:function(e){rt()},onPointerDown:function(e){2!==e.button&&de(s,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.a,{ref:Ce,position:[(Qe.x+_e.x)/2,Qe.y,Qe.z],args:[Pt,Pt,1.2*w],name:K.Lower,onPointerDown:function(e){de(s,e,X.Resize),Fe.current&&ee((function(e){var t=Ce.current.localToWorld(new Me.Vector3(0,g,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Lower)},onPointerOut:function(e){rt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Lower||fe===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Oe,position:[(Ze.x+$e.x)/2,Ze.y,Ze.z],args:[Pt,Pt,1.2*w],name:K.Upper,onPointerDown:function(e){de(s,e,X.Resize),Fe.current&&ee((function(e){var t=Oe.current.localToWorld(new Me.Vector3(0,-g,-Ze.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Upper)},onPointerOut:function(e){rt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Upper||fe===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Fe,position:[Qe.x,(Qe.y+Ze.y)/2,Qe.z],args:[Pt,Pt,1.2*w],name:K.Left,onPointerDown:function(e){de(s,e,X.Resize),Fe.current&&ee((function(e){var t=Fe.current.localToWorld(new Me.Vector3(y,0,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Left)},onPointerOut:function(e){rt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Left||fe===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:ke,position:[_e.x,(_e.y+$e.y)/2,_e.z],args:[Pt,Pt,1.2*w],name:K.Right,onPointerDown:function(e){de(s,e,X.Resize),Fe.current&&ee((function(e){var t=ke.current.localToWorld(new Me.Vector3(-y,0,-_e.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Right)},onPointerOut:function(e){rt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Right||fe===K.Right?pt:ht})})]})]})]}),Je>0&&Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole",castShadow:!1,receiveShadow:!1,args:[I,I,Je+w,mt?4:2,1],position:[0,0,gt],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),C&&nt.z>0&&Object(gf.jsx)(Jl.a,{rotation:[-ot.x,0,-ot.z],userData:{unintersectable:!0},points:[Ht,new Me.Vector3(-.3*Ue,0,.09*Ke).applyEuler(ft),jt,new Me.Vector3(-.6*Ue,0,.36*Ke).applyEuler(ft),Ht,new Me.Vector3(-.9*Ue,0,.81*Ke).applyEuler(ft),jt,Ht,new Me.Vector3(.3*Ue,0,.09*Ke).applyEuler(ft),jt,new Me.Vector3(.6*Ue,0,.36*Ke).applyEuler(ft),Ht,new Me.Vector3(.9*Ue,0,.81*Ke).applyEuler(ft),jt],name:"Sun Beams",lineWidth:.25,color:"white"}),(xe||Q)&&!pe&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:at,color:null!==(t=null===et||void 0===et?void 0:et.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===et||void 0===et?void 0:et.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===et||void 0===et?void 0:et.labelSize)&&void 0!==a?a:.2,position:[0,0,null!==(c=null===et||void 0===et?void 0:et.labelHeight)&&void 0!==c?c:Math.max(Ne*Math.abs(Math.sin(et.tiltAngle))+.1,.2)]})]})},nv=n.a.memo(rv),cv=function(e){var t,l,a,n,c=e.id,s=e.cx,d=e.cy,h=e.cz,p=e.lx,y=e.ly,g=e.lz,m=void 0===g?.1:g,w=e.reflectance,x=void 0===w?.9:w,v=e.tiltAngle,b=e.relativeAzimuth,A=e.moduleLength,T=e.poleHeight,P=e.poleRadius,S=void 0===P?.1:P,j=e.drawSunBeam,H=e.rotation,z=void 0===H?[0,0,0]:H,R=e.color,D=void 0===R?"white":R,M=e.lineColor,W=void 0===M?"black":M,I=e.lineWidth,C=void 0===I?.5:I,O=e.showLabel,F=void 0!==O&&O,k=e.locked,Y=void 0!==k&&k,L=e.parentId,E=e.receiverId,U=Ew(si),N=Ew(Vi),J=Ew(i.date),Q=Ew(i.latitude),Z=Ew(Fi),_=Tf(Ns),$=Ew(o.solarRadiationHeatmapMaxValue),ee=Pf(wi),te=Ew(o.shadowEnabled),le=Ew(Zr),ae=Ew(is),oe=Ew(Kr),ie=Ew(Ru),re=_f(c),ne=Object(Se.f)().gl.domElement,ce=Object(r.useState)(!1),se=Object(u.a)(ce,2),de=se[0],ue=se[1],fe=Object(r.useState)(null),he=Object(u.a)(fe,2),pe=he[0],ye=he[1],ge=Object(r.useState)(1),we=Object(u.a)(ge,2),xe=we[0],ve=we[1],be=Object(r.useState)(null),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],je=Object(r.useRef)(),He=Object(r.useRef)(),ze=Object(r.useRef)(),Re=Object(r.useRef)(),De=Object(r.useRef)(),We=Object(r.useRef)(),Ie=Object(r.useRef)(!1),Ce=Math.max(100,10*oe),Oe=Object(r.useMemo)((function(){return{lng:N}}),[N]),Fe=p/2,ke=y/2,Ye=m/2,Le=T+Fe,Ee=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===L)return a}}catch(o){l.e(o)}finally{l.f()}}));if(Ee)switch(Ee.type){case V.Foundation:if(h=Le+Ye+Ee.lz,Tw.isZero(z[2]))s=Ee.cx+s*Ee.lx,d=Ee.cy+d*Ee.ly;else{var Ue=new Me.Vector3(s*Ee.lx,d*Ee.ly,0);Ue.applyAxisAngle(Rt,z[2]),s=Ee.cx+Ue.x,d=Ee.cy+Ue.y}}var Ne=new Me.Vector3(-Fe,-ke,Ye),Ve=new Me.Vector3(-Fe,ke,Ye),Je=new Me.Vector3(Fe,-ke,Ye),Ge=new Me.Vector3(Fe,ke,Ye),Xe=Object(r.useMemo)((function(){return le(c)}),[c]);Object(r.useEffect)((function(){if(Xe&&_){var e=ee(Xe.id);e&&Pe(Tw.fetchHeatmapTexture(e,null!==$&&void 0!==$?$:5))}}),[_,$]),Object(r.useEffect)((function(){ve(Math.max(1,Math.round(y/A)))}),[y,A]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),Ie.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var Be=Object(r.useMemo)((function(){return((null===Xe||void 0===Xe?void 0:Xe.label)?Xe.label:me.t("shared.FresnelReflectorElement",Oe))+((null===Xe||void 0===Xe?void 0:Xe.locked)?" ("+me.t("shared.ElementLocked",Oe)+")":"")+((null===Xe||void 0===Xe?void 0:Xe.label)?"":"\n"+me.t("word.Coordinates",Oe)+": ("+s.toFixed(1)+", "+d.toFixed(1)+", "+h.toFixed(1)+") "+me.t("word.MeterAbbreviation",Oe))}),[null===Xe||void 0===Xe?void 0:Xe.label,Y,N,s,d,h]),Ke=Object(r.useMemo)((function(){return new Me.Euler(0,0,z[2],"ZXY")}),[z]),qe=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(ye(t),t===B.Top?ne.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?ne.style.cursor="grab":ne.style.cursor="pointer"))},Qe=function(){ye(null),ne.style.cursor="default"},Ze=Object(r.useMemo)((function(){return jy(new Date(J),Q)}),[J,Q]),_e=null===Ee||void 0===Ee?void 0:Ee.rotation[2],$e=E&&E!==L?le(E):null,et=Object(r.useMemo)((function(){if($e){if($e.type===V.Foundation){var e,t=$e;if(t.solarStructure===G.FocusPipe&&t.solarAbsorberPipe)return new Me.Vector3((t.cx-s)*(_e?Math.cos(_e):1),(t.cy-d)*(_e?Math.sin(_e):0),t.cz-h+t.lz/2+(null!==(e=t.solarAbsorberPipe.absorberHeight)&&void 0!==e?e:10))}}else if(Ee&&Ee.type===V.Foundation){var l,a=Ee;if(a.solarStructure===G.FocusPipe&&a.solarAbsorberPipe)return new Me.Vector3((a.cx-s)*(_e?Math.cos(_e):1),(a.cy-d)*(_e?Math.sin(_e):0),a.cz-h+a.lz/2+(null!==(l=a.solarAbsorberPipe.absorberHeight)&&void 0!==l?l:10))}return null}),[Ee,s,d,h,E,null===$e||void 0===$e?void 0:$e.cx,null===$e||void 0===$e?void 0:$e.cy,null===$e||void 0===$e?void 0:$e.cz]),tt=Object(r.useRef)(new Me.Vector3),lt=Object(r.useMemo)((function(){if(et&&Ze.z>0){var e=_e?new Me.Vector3(Math.sin(_e),Math.cos(_e),0):new Me.Vector3(0,1,0);tt.current.set(et.x,et.y,et.z);var t=Ze.z0&&(e.intersections[0].object===je.current&&(t.contextMenuObjectType=V.FresnelReflector))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===je.current&&(ue(!0),ne.style.cursor="move"))},onPointerOut:function(e){ue(!1),ne.style.cursor="default"},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),_&&Te?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",side:Me.FrontSide,map:Te}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("white"),shininess:100*x,side:Me.FrontSide,color:"lightskyblue"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D})]}),it&&it.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Fresnel Reflector Module Line",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:C,color:W},t)})),Object(gf.jsx)(Jl.a,{name:"Fresnel Reflector Outline 1",userData:{unintersectable:!0},points:[[-Fe,-ke,Ye],[-Fe,ke,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:C,color:W}),Object(gf.jsx)(Jl.a,{name:"Fresnel Reflector Outline 2",userData:{unintersectable:!0},points:[[Fe,-ke,Ye],[Fe,ke,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:C,color:W}),Object(gf.jsx)(Lt.f,{name:"Fresnel Reflector Simulation Plane",uuid:c,args:[p,y],position:[0,0,Ye],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),re&&Y&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Fe,-ke,Ye],[-Fe,ke,Ye],[Fe,ke,Ye],[Fe,-ke,Ye],[-Fe,-ke,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),re&&!Y&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:He,position:new Me.Vector3(0,0,0),args:[ct,6,6],name:B.Default,castShadow:!1,receiveShadow:!1,onPointerOver:function(e){qe(e,B.Top)},onPointerOut:function(e){Qe()},onPointerDown:function(e){2!==e.button&&ae(c,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.a,{ref:ze,position:[(Ne.x+Je.x)/2,Ne.y,Ne.z-Ye],args:[nt,nt,1.2*m],name:K.Lower,castShadow:!1,receiveShadow:!1,onPointerDown:function(e){ae(c,e,X.Resize),De.current&&U((function(e){var t=ze.current.localToWorld(new Me.Vector3(0,y,-Ne.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Lower)},onPointerOut:function(e){Qe()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Lower||ie===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Re,position:[(Ve.x+Ge.x)/2,Ve.y,Ve.z-Ye],args:[nt,nt,1.2*m],name:K.Upper,castShadow:!1,receiveShadow:!1,onPointerDown:function(e){ae(c,e,X.Resize),De.current&&U((function(e){var t=Re.current.localToWorld(new Me.Vector3(0,-y,-Ve.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Upper)},onPointerOut:function(e){Qe()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Upper||ie===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:De,position:[Ne.x,(Ne.y+Ve.y)/2,Ne.z],args:[nt,nt,1.2*m],name:K.Left,castShadow:!1,receiveShadow:!1,onPointerDown:function(e){ae(c,e,X.Resize),De.current&&U((function(e){var t=De.current.localToWorld(new Me.Vector3(p,0,-Ne.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Left)},onPointerOut:function(e){Qe()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Left||ie===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:We,position:[Je.x,(Je.y+Ge.y)/2,Je.z],args:[nt,nt,1.2*m],name:K.Right,castShadow:!1,receiveShadow:!1,onPointerDown:function(e){ae(c,e,X.Resize),De.current&&U((function(e){var t=We.current.localToWorld(new Me.Vector3(-p,0,-Je.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Right)},onPointerOut:function(e){Qe()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Right||ie===K.Right?pt:ht})})]})]})]}),Le>0&&ot.map((function(e,t){var l=Z.length<100?4:2;return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[S,S,Le+2*(e.z-at)+m,l,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:D})},t)})),j&&Ze.z>0&&Object(gf.jsx)(Jl.a,{rotation:[-Ke.x,0,-Ke.z],userData:{unintersectable:!0},points:et?[tt.current,new Me.Vector3(0,0,Ye),Ze.clone().multiplyScalar(Ce)]:[new Me.Vector3(0,0,Ye),Ze.clone().multiplyScalar(Ce)],name:"Sun Beam",lineWidth:.25,color:"white",castShadow:!1,receiveShadow:!1}),(de||F)&&!re&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:Be,color:null!==(t=null===Xe||void 0===Xe?void 0:Xe.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===Xe||void 0===Xe?void 0:Xe.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===Xe||void 0===Xe?void 0:Xe.labelSize)&&void 0!==a?a:.2,castShadow:!1,receiveShadow:!1,position:[0,0,null!==(n=null===Xe||void 0===Xe?void 0:Xe.labelHeight)&&void 0!==n?n:Math.max(ke*Math.abs(Math.sin(Xe.tiltAngle))+.1,.2)]})]})},sv=n.a.memo(cv),dv=function(e){var t,l,a,n,c=e.id,s=e.cx,d=e.cy,h=e.cz,p=e.lx,y=e.ly,g=e.lz,m=void 0===g?.1:g,w=e.reflectance,x=void 0===w?.9:w,v=e.tiltAngle,b=e.relativeAzimuth,A=e.poleHeight,T=e.poleRadius,P=void 0===T?Math.min(p,y)/20:T,S=e.drawSunBeam,j=e.rotation,H=void 0===j?[0,0,0]:j,z=e.color,R=void 0===z?"white":z,D=(e.lineColor,e.lineWidth,e.showLabel),M=void 0!==D&&D,W=e.locked,I=void 0!==W&&W,C=e.parentId,O=e.towerId,F=Ew(si),k=Ew(Vi),Y=Ew(i.date),L=Ew(i.latitude),E=Ew(Fi),U=Tf(Ns),N=Ew(o.solarRadiationHeatmapMaxValue),J=Pf(wi),K=Ew(o.shadowEnabled),q=Ew(Zr),Q=Ew(is),Z=Ew(Kr),_=_f(c),$=Object(Se.f)().gl.domElement,ee=Object(r.useState)(!1),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useState)(null),ie=Object(u.a)(oe,2),re=ie[0],ne=ie[1],ce=Object(r.useRef)(),se=Object(r.useRef)(),de=Object(r.useRef)(!1),ue=Math.max(100,10*Z),fe=Object(r.useMemo)((function(){return{lng:k}}),[k]),he=p/2,pe=y/2,ye=m/2,ge=A+Math.max(he,pe),we=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===C)return a}}catch(o){l.e(o)}finally{l.f()}}));if(we)switch(we.type){case V.Foundation:if(h=ge+ye+we.lz,Tw.isZero(H[2]))s=we.cx+s*we.lx,d=we.cy+d*we.ly;else{var xe=new Me.Vector3(s*we.lx,d*we.ly,0);xe.applyAxisAngle(Rt,H[2]),s=we.cx+xe.x,d=we.cy+xe.y}}var ve=Object(r.useMemo)((function(){return q(c)}),[c]);Object(r.useEffect)((function(){if(ve&&U){var e=J(ve.id);e&&ne(Tw.fetchHeatmapTexture(e,null!==N&&void 0!==N?N:5))}}),[U,N]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),de.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var be=Object(r.useMemo)((function(){return((null===ve||void 0===ve?void 0:ve.label)?ve.label:me.t("shared.HeliostatElement",fe))+((null===ve||void 0===ve?void 0:ve.locked)?" ("+me.t("shared.ElementLocked",fe)+")":"")+((null===ve||void 0===ve?void 0:ve.label)?"":"\n"+me.t("word.Coordinates",fe)+": ("+s.toFixed(1)+", "+d.toFixed(1)+", "+h.toFixed(1)+") "+me.t("word.MeterAbbreviation",fe))}),[null===ve||void 0===ve?void 0:ve.label,I,k,s,d,h]),Ae=Object(r.useMemo)((function(){return new Me.Euler(0,0,H[2],"ZXY")}),[H]),Te=Object(r.useMemo)((function(){return jy(new Date(Y),L)}),[Y,L]),Pe=null===we||void 0===we?void 0:we.rotation[2],je=O&&O!==C?q(O):null,He=Object(r.useMemo)((function(){if(je){if(je.type===V.Foundation){var e,t=je;if(t.solarStructure===G.FocusTower&&t.solarPowerTower)return new Me.Vector3(t.cx-s,t.cy-d,t.cz-h+t.lz/2+(null!==(e=t.solarPowerTower.towerHeight)&&void 0!==e?e:20))}}else if(we&&we.type===V.Foundation){var l,a=we;if(a.solarStructure===G.FocusTower&&a.solarPowerTower)return new Me.Vector3(a.cx-s,a.cy-d,a.cz-h+a.lz/2+(null!==(l=a.solarPowerTower.towerHeight)&&void 0!==l?l:20))}return null}),[we,s,d,h,O,null===je||void 0===je?void 0:je.cx,null===je||void 0===je?void 0:je.cy,null===je||void 0===je?void 0:je.cz]),ze=Object(r.useMemo)((function(){if(He&&Te.z>0){var e=He.clone().normalize().add(Te).normalize();Tw.isSame(e,Rt)&&(e=new Me.Vector3(-.001,0,1).normalize()),Pe&&e.applyAxisAngle(Rt,-Pe);var t=Math.hypot(e.x,e.y);return new Me.Euler(Math.atan2(t,e.z),0,Math.atan2(e.y,e.x)+vt,"ZXY")}return new Me.Euler(v,0,b,"ZXY")}),[He,Te,v,b,Pe,null===je||void 0===je?void 0:je.cx,null===je||void 0===je?void 0:je.cy,null===je||void 0===je?void 0:je.cz]),Re=-(ge+m)/2,De=Math.max(1,(p+y)/8),We=st*De*4;return Object(gf.jsxs)("group",{name:"Heliostat Group "+c,rotation:Ae,position:[s,d,h+ye],children:[Object(gf.jsxs)("group",{rotation:ze,children:[Object(gf.jsxs)(Lt.a,{receiveShadow:K,castShadow:K,uuid:c,ref:ce,args:[p,y,m],name:"Heliostat",onPointerDown:function(e){2!==e.button&&Q(c,e,X.Select)},onContextMenu:function(e){Q(c,e,X.ContextMenu),F((function(t){e.intersections.length>0&&(e.intersections[0].object===ce.current&&(t.contextMenuObjectType=V.Heliostat))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===ce.current&&(ae(!0),$.style.cursor="move"))},onPointerOut:function(e){ae(!1),$.style.cursor="default"},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),U&&re?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",side:Me.FrontSide,map:re}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("white"),shininess:100*x,side:Me.FrontSide,color:"lightskyblue"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R})]}),Object(gf.jsx)(Lt.f,{name:"Heliostat Simulation Plane",uuid:c,args:[p,y],position:[0,0,ye],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),_&&I&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-he,-pe,ye],[-he,pe,ye],[he,pe,ye],[he,-pe,ye],[-he,-pe,ye]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),_&&!I&&Object(gf.jsx)(Lt.h,{ref:se,position:new Me.Vector3(0,0,0),args:[We,6,6],name:B.Default,castShadow:!1,receiveShadow:!1,onPointerOver:function(e){!function(e,t){e.intersections.length>0&&e.intersections[0].object===e.eventObject&&($.style.cursor=t===B.Default?"move":"pointer")}(e,B.Default)},onPointerOut:function(e){$.style.cursor="default"},onPointerDown:function(e){2!==e.button&&Q(c,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})})]}),ge>0&&Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole",castShadow:!1,receiveShadow:!1,args:[P,P,ge+m,E.length<100?4:2,1],position:new Me.Vector3(0,0,Re),rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:R})}),S&&Te.z>0&&Object(gf.jsx)(Jl.a,{rotation:[-Ae.x,0,-Ae.z],userData:{unintersectable:!0},points:He?[He,new Me.Vector3(0,0,ye),Te.clone().multiplyScalar(ue)]:[new Me.Vector3(0,0,ye),Te.clone().multiplyScalar(ue)],name:"Sun Beam",lineWidth:.25,color:"white",castShadow:!1,receiveShadow:!1}),(le||M)&&!_&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:be,color:null!==(t=null===ve||void 0===ve?void 0:ve.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===ve||void 0===ve?void 0:ve.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===ve||void 0===ve?void 0:ve.labelSize)&&void 0!==a?a:.2,castShadow:!1,receiveShadow:!1,position:[0,0,null!==(n=null===ve||void 0===ve?void 0:ve.labelHeight)&&void 0!==n?n:Math.max(pe*Math.abs(Math.sin(ve.tiltAngle))+.1,.2)]})]})},uv=n.a.memo(dv),fv=function(e){var t,l,a,n,c,s,d=e.id,h=e.pvModelName,p=void 0===h?"SPR-X21-335-BLK":h,y=e.cx,g=e.cy,m=e.cz,w=e.lx,x=e.ly,v=e.lz,b=e.tiltAngle,A=e.relativeAzimuth,T=e.trackerType,P=void 0===T?te.NO_TRACKER:T,S=e.poleHeight,j=e.poleRadius,H=e.poleSpacing,z=e.drawSunBeam,R=e.rotation,D=void 0===R?[0,0,0]:R,M=e.normal,W=void 0===M?[0,0,1]:M,I=e.color,C=void 0===I?"white":I,O=(e.lineColor,e.lineWidth,e.showLabel),F=void 0!==O&&O,k=e.locked,Y=void 0!==k&&k,L=e.parentId,E=e.orientation,U=void 0===E?$.landscape:E,N=Ew(si),J=Ew(Vi),G=Ew(i.date),Q=Ew(i.latitude),Z=Ew(Fi),_=Tf(Ns),ee=Ew(o.shadowEnabled),le=Ew(o.solarPanelShininess),ae=Ew(Zr),oe=Ew(is),ie=Ew(lc),re=Ew(Kr),ne=Ew(Ru),ce=Ew(Mu),se=Ew(Sr),de=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,ue=Ew(Yi),fe=_f(d),he=Object(Se.f)(),pe=he.gl.domElement,ye=he.camera,ge=Object(r.useState)(!1),we=Object(u.a)(ge,2),xe=we[0],ve=we[1],be=Object(r.useState)(null),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],je=Object(r.useState)(),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De=Object(r.useRef)(),We=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Oe=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Ye=Object(r.useRef)(!1),Le=Object(r.useRef)(0),Ee=Object(r.useRef)(0),Ue=Object(r.useRef)(),Ne=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Ve=Math.max(100,10*re),Je=(new Me.Vector3).fromArray(W),Ge=ue[p],Xe=Object(r.useMemo)((function(){return{lng:J}}),[J]),Be=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===L)return a}}catch(o){l.e(o)}finally{l.f()}}));if(L&&Be)switch(Be.type){case V.Foundation:if(m=S+v/2+Be.lz,Tw.isZero(D[2]))y=Be.cx+y*Be.lx,g=Be.cy+g*Be.ly;else{var Ke=new Me.Vector3(y*Be.lx,g*Be.ly,0);Ke.applyAxisAngle(Rt,D[2]),y=Be.cx+Ke.x,g=Be.cy+Ke.y}break;case V.Cuboid:var qe=Tw.getWorldDataById(Be.id),Qe=qe.pos;qe.rot;if(Tw.isZero(D[2]))y=Qe.x+y*Be.lx,g=Qe.y+g*Be.ly;else{var Ze=new Me.Vector3(y*Be.lx,g*Be.ly,m*Be.lz);Ze.applyAxisAngle(Rt,D[2]),y=Qe.x+Ze.x,g=Qe.y+Ze.y}m=Tw.isSame(Je,Rt)?S+v/2+Be.lz:Qe.z+m*Be.lz}Ge&&(v=Math.max(Ge.thickness,.02));var _e=w/2,$e=x/2,et=v/2,lt=new Me.Vector3(-_e,-$e,et),it=new Me.Vector3(-_e,$e,et),rt=new Me.Vector3(_e,-$e,et),nt=new Me.Vector3(_e,$e,et),ct=Z.length<100?4:2,ut=ae(d);Object(r.useEffect)((function(){if(Ge){var e,t;U===$.portrait?(e=Math.max(1,Math.round(w/Ge.width)),t=Math.max(1,Math.round(x/Ge.length))):(e=Math.max(1,Math.round(w/Ge.length)),t=Math.max(1,Math.round(x/Ge.width))),Ue.current=[];for(var l=w/e,a=x/t,o=0;o<=e;o++)Ue.current.push({points:[new Me.Vector3(o*l-_e,-$e,v),new Me.Vector3(o*l-_e,$e,v)]});for(var i=0;i<=t;i++)Ue.current.push({points:[new Me.Vector3(-_e,i*a-$e,v),new Me.Vector3(_e,i*a-$e,v)]})}}),[U,p,w,x,v]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),Ye.current=!1,Jt(!1)};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]),Object(r.useEffect)((function(){Re(Tw.isSame(Je,Rt))}),[W]);var ft=Object(r.useMemo)((function(){return((null===ut||void 0===ut?void 0:ut.label)?ut.label:me.t("shared.SolarPanelElement",Xe))+((null===ut||void 0===ut?void 0:ut.locked)?" ("+me.t("shared.ElementLocked",Xe)+")":"")+((null===ut||void 0===ut?void 0:ut.label)?"":"\n"+me.t("word.Coordinates",Xe)+": ("+y.toFixed(1)+", "+g.toFixed(1)+", "+m.toFixed(1)+") "+me.t("word.MeterAbbreviation",Xe))}),[null===ut||void 0===ut?void 0:ut.label,Y,J,y,g,m]),gt=Object(r.useMemo)((function(){return Tw.isSame(Je,St)?new Me.Euler(vt,0,D[2]+vt,"ZXY"):Tw.isSame(Je,jt)?new Me.Euler(vt,0,D[2]-vt,"ZXY"):Tw.isSame(Je,Ht)?new Me.Euler(vt,0,D[2]+Math.PI,"ZXY"):Tw.isSame(Je,zt)?new Me.Euler(vt,0,D[2],"ZXY"):new Me.Euler(0,0,D[2],"ZXY")}),[W,D]),mt=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(Pe(t),t===B.Top?pe.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?pe.style.cursor="grab":pe.style.cursor="pointer"))},wt=function(){Pe(null),pe.style.cursor="default"},xt=Object(r.useMemo)((function(){return jy(new Date(G),Q)}),[G,Q]),bt=null===(l=ae(L))||void 0===l?void 0:l.rotation[2],Tt=bt?xt.clone().applyAxisAngle(Rt,-bt):xt,Pt=Object(r.useMemo)((function(){if(Tw.isSame(Je,Rt)){if(xt.z>0)switch(P){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var e=Math.hypot(Tt.x,Tt.y);return new Me.Euler(Math.atan2(e,Tt.z),0,Math.atan2(Tt.y,Tt.x)+vt,"ZXY");case te.HORIZONTAL_SINGLE_AXIS_TRACKER:return new Me.Euler(0,Math.atan2(Tt.x,Tt.z),w0&&(e.intersections[0].object===De.current&&(t.contextMenuObjectType=V.SolarPanel))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===De.current&&(ve(!0),pe.style.cursor="move"))},onPointerOut:function(e){ve(!1),pe.style.cursor="default"},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),_&&Xt?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:Xt}):Gt?de||0===le?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",map:Gt,color:C}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===Ge||void 0===Ge?void 0:Ge.color)?at:ot),shininess:null!==le&&void 0!==le?le:tt,side:Me.FrontSide,map:Gt,color:C}):null,0===(null===Ge||void 0===Ge?void 0:Ge.bifacialityFactor)||de||0===S&&0===b?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}):Gt?Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===Ge||void 0===Ge?void 0:Ge.color)?at:ot),shininess:null!==le&&void 0!==le?le:tt,side:Me.FrontSide,map:Gt,color:C}):null]}),_&&Xt&&Ue.current&&Ue.current.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(gf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:d,args:[w,x],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),fe&&Y&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-_e,-$e,0],[-_e,$e,0],[_e,$e,0],[_e,-$e,0],[-_e,-$e,0]],castShadow:!1,receiveShadow:!1,lineWidth:2,color:yt}),fe&&!Y&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:We,position:new Me.Vector3(0,0,0),args:[Ot,6,6],name:B.Default,onPointerOver:function(e){mt(e,B.Top)},onPointerOut:function(e){wt()},onPointerDown:function(e){oe(d,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.a,{ref:Ie,position:[(lt.x+rt.x)/2,lt.y,lt.z],args:[Ct,Ct,1.2*v],name:K.Lower,onPointerDown:function(e){oe(d,e,X.Resize),Oe.current&&N((function(e){var t=Ie.current.localToWorld(new Me.Vector3(0,x,-lt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Lower)},onPointerOut:function(e){wt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Lower||ne===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Ce,position:[(it.x+nt.x)/2,it.y,it.z],args:[Ct,Ct,1.2*v],name:K.Upper,onPointerDown:function(e){oe(d,e,X.Resize),Oe.current&&N((function(e){var t=Ce.current.localToWorld(new Me.Vector3(0,-x,-it.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Upper)},onPointerOut:function(e){wt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Upper||ne===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Oe,position:[lt.x,(lt.y+it.y)/2,lt.z],args:[Ct,Ct,1.2*v],name:K.Left,onPointerDown:function(e){oe(d,e,X.Resize),Oe.current&&N((function(e){var t=Oe.current.localToWorld(new Me.Vector3(w,0,-lt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Left)},onPointerOut:function(e){wt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Left||ne===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Fe,position:[rt.x,(rt.y+nt.y)/2,rt.z],args:[Ct,Ct,1.2*v],name:K.Right,onPointerDown:function(e){oe(d,e,X.Resize),Oe.current&&N((function(e){var t=Fe.current.localToWorld(new Me.Vector3(-w,0,-rt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Right)},onPointerOut:function(e){wt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Right||ne===K.Right?pt:ht})})]})]})]}),fe&&!Y&&P===te.NO_TRACKER&&ze&&Object(gf.jsxs)("group",{position:[0,0,-S],rotation:[0,0,Pt.z],children:[Object(gf.jsx)(oy,{id:d,position:[0,-$e-Ft/2,S],color:Te===q.Upper||ce===q.Upper?pt:ht,ratio:Ft,handleType:q.Upper,hoverHandle:mt,noHoverHandle:wt}),Object(gf.jsx)(oy,{id:d,position:[0,$e+Ft/2,S],color:Te===q.Lower||ce===q.Lower?pt:ht,ratio:Ft,handleType:q.Lower,hoverHandle:mt,noHoverHandle:wt})]}),fe&&!Y&&P===te.NO_TRACKER&&ze&&Math.abs(S)>.1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{name:q.Tilt,args:[kt,1.1*kt,18,2,-vt,Math.PI],rotation:[0,-vt,Pt.z,"ZXY"],onPointerOver:function(e){mt(e,q.Tilt)},onPointerOut:function(e){wt()},onPointerDown:function(e){if(Jt(!0),Te){Et.getState().setEnableOrbitController(!1),Ye.current=!0;var t=ae(d);Le.current=t.tiltAngle}N((function(e){e.rotateHandleType=q.Tilt}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide,color:Te===q.Tilt||Vt?pt:ht})}),Vt&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{ref:ke,name:"Solar panel tilt handle",args:[kt,2*kt,18,2,-vt,Math.PI],rotation:[0,-vt,Pt.z,"ZXY"],onPointerDown:function(e){},onPointerUp:function(e){if(Math.abs(Ee.current-Le.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:Le.current,newValue:Ee.current,changedElementId:d,changedElementType:V.SolarPanel,undo:function(){ie(t.changedElementId,t.oldValue)},redo:function(){ie(t.changedElementId,t.newValue)}};se(t)}},onPointerMove:function(e){if(Ye.current){var t=new Me.Vector2;if(t.x=e.offsetX/pe.clientWidth*2-1,t.y=-e.offsetY/pe.clientHeight*2+1,Ne.setFromCamera(t,ye),ke.current){var l=Ne.intersectObjects([ke.current]);if(l.length>0){var a=l[0].point,o=ke.current.parent;if(o){var i=o.position,r=(new Me.Vector3).subVectors(a,i),n=r.angleTo(Rt);if(!(.5*ut.ly*Math.abs(Math.sin(n))>ut.poleHeight)){var c=A+D[2],s=c%Math.PI===0?Math.sign(-r.y)*Math.sign(Math.cos(c)):Math.sign(r.x)*Math.sign(Math.sin(c));ie(d,n*=s),Ee.current=n}}}}}},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:Me.DoubleSide})}),Object(gf.jsx)(Jl.a,{points:[[0,0,kt],[0,0,1.75*kt]],rotation:new Me.Euler(b,0,Pt.z,"ZXY"),lineWidth:1}),Yt.map((function(e,t){return Object(gf.jsxs)("group",{rotation:new Me.Euler(Math.PI/12*t-vt,0,Pt.z,"ZXY"),children:[Object(gf.jsx)(Jl.a,{points:[[0,0,1.8*kt],[0,0,2*kt]],color:"white",transparent:!0,opacity:.5}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(15*t-90,"\xb0"),fontSize:20*kt,fontFace:"Times Roman",textHeight:.15*kt,position:[0,0,1.6*kt]})]},t)})),Object(gf.jsx)("group",{rotation:new Me.Euler(b,0,Pt.z,"ZXY"),children:Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(Math.floor(b/Math.PI*180),"\xb0"),fontSize:20*kt,fontFace:"Times Roman",textHeight:.2*kt,position:[0,0,.75*kt]})})]})]}),S>0&&ze&&Wt.map((function(e,t){return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[j,j,S+2*(e.z-Mt)+v,ct,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:C})},t)})),z&&xt.z>0&&Object(gf.jsxs)("group",{rotation:[-gt.x,0,-gt.z],children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[Dt.clone().multiplyScalar(.75),[0,0,0],xt.clone().multiplyScalar(Ve)],name:"Sun Beam",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[xt.clone().multiplyScalar(.5),Dt.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Tw.toDegrees(xt.angleTo(Dt)).toFixed(1)+"\xb0",fontSize:20,fontFace:"Times Roman",textHeight:.1,position:xt.clone().multiplyScalar(.75).add(Dt.clone().multiplyScalar(.75)).multiplyScalar(.5)}),Object(gf.jsx)("group",{position:Dt.clone().multiplyScalar(.75),rotation:[vt+gt.x+Pt.x,0,gt.z+Pt.z,w0?eI:e>=W&&e<=I}),[D,W,I,M]),re=Object(r.useRef)(!1),ne=Ew(Tr);ne!==re.current&&(re.current=ne,(null===Z||void 0===Z?void 0:Z.current)&&_.current&&Z.current.add(_.current)),Object(r.useEffect)((function(){if(p!==xt){var e=ge();e&&_.current&&e.add(_.current)}}),[ne]),Object(r.useEffect)((function(){var e=ge();e&&_.current&&e.add(_.current)}),[Z]);var ce=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(Nl.fetchTextureImage(v,oe),(function(e){A&&(e.wrapS=Me.RepeatWrapping,e.repeat.x=-1),fe(e),K(!G)}))}),[v,oe,A]),se=Object(r.useState)(ce),de=Object(u.a)(se,2),ue=de[0],fe=de[1],he=Object(r.useMemo)((function(){return Nl.fetchLabel(v,ae)+(P?" ("+me.t("shared.ElementLocked",ae)+")":"")+"\n"+me.t("word.Coordinates",ae)+": ("+g.toFixed(1)+", "+m.toFixed(1)+") "+me.t("word.MeterAbbreviation",ae)}),[v,g,m,P,z]),pe=Object(r.useCallback)((function(e,t){Tf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(H((function(e){e.hoveredHandle=t,e.selectedElementHeight=le.lz})),Tw.isMoveHandle(t)?q.domElement.style.cursor="move":q.domElement.style.cursor="pointer")}),[]),ye=Object(r.useCallback)((function(){H((function(e){e.hoveredHandle=null})),q.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"default"}),[]),ge=function(){return p!==xt&&(null===Z||void 0===Z?void 0:Z.current)?Tw.getObjectChildById(Z.current,p):null},we=Object(r.useMemo)((function(){return Nl.fetchSpread(v)}),[v]),xe=Object(r.useMemo)((function(){return Nl.fetchHeight(v)}),[v]);Object(Se.d)((function(e){var t=e.camera;if(_.current){var l=Tw.getWorldDataById(p).rot;if(R)$.current&&te.current&&($.current.rotation.set(vt,0,0),te.current.rotation.set(0,0,0)),_.current.rotation.set(-vt,0,0);else{if($.current&&te.current){var a=t.position,o=a.x,i=a.y,r=_.current.position,n=r.x,c=r.y;if(ge()){var s=_.current.localToWorld(new Me.Vector3),d=Math.atan2(o-s.x,i-s.y)+l;$.current.rotation.set(vt,-d,0),te.current.rotation.set(-vt,d,0)}else{var u=Math.atan2(o-n,i-c);$.current.rotation.set(vt,-u,0),te.current.rotation.set(-vt,u,0)}}_.current.rotation.set(0,0,0)}}}));return Object(gf.jsx)(gf.Fragment,{children:S?Object(gf.jsx)("group",{ref:_,name:"Flower Group "+y,userData:{aabb:!0},position:[g,m,(null!==w&&void 0!==w?w:0)+(R?.25:0)],children:Object(gf.jsxs)("group",{position:[0,0,xe/2],children:[Object(gf.jsx)(rx.a,{ref:$,uuid:y,name:v,follow:!1,rotation:[vt,0,0],children:Object(gf.jsx)(Lt.f,{args:[we,xe],receiveShadow:!0,children:Object(gf.jsx)("meshToonMaterial",{map:ue,side:Me.DoubleSide,alphaTest:.5})})}),Object(gf.jsx)(rx.a,{ref:te,name:"Interaction Billboard",visible:!1,position:[0,0,-xe/2],children:Object(gf.jsx)(Lt.f,{ref:ee,renderOrder:3,name:v+" plane",args:[we/2,2*xe],rotation:[R?vt:0,0,0],onContextMenu:function(e){C(y,e,X.ContextMenu),H((function(t){e.intersections.length>0&&(e.intersections[0].object===ee.current&&(t.contextMenuObjectType=V.Flower))}))},onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(C(y,e,X.Move),Et.setState((function(e){e.flowerRef=_})))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===ee.current&&U(!0))},onPointerOut:function(e){U(!1)}})}),Q&&P&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-we/2,-xe/2,0],[-we/2,xe/2,0],[-we/2,xe/2,0],[we/2,xe/2,0],[we/2,-xe/2,0],[we/2,xe/2,0],[we/2,-xe/2,0],[-we/2,-xe/2,0]],castShadow:!1,receiveShadow:!1,lineWidth:.5,rotation:null===(n=$.current)||void 0===n?void 0:n.rotation,color:yt}),Q&&!P&&Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Lt.h,{position:new Me.Vector3(0,0,-xe/2),args:[.30000000000000004,6,6,0,Math.PI],name:B.Default,renderOrder:2,onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(C(y,e,X.Move),Et.setState((function(e){e.flowerRef=_})))},onPointerEnter:function(e){pe(e,B.Default)},onPointerLeave:ye,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:k===B.Default||F===B.Default?pt:ut})})}),E&&!Q&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:he,color:null!==(c=null===le||void 0===le?void 0:le.labelColor)&&void 0!==c?c:"white",fontSize:null!==(s=null===le||void 0===le?void 0:le.labelFontSize)&&void 0!==s?s:20,textHeight:null!==(d=null===le||void 0===le?void 0:le.labelSize)&&void 0!==d?d:.2,position:[0,0,xe/2+(null!==(h=null===le||void 0===le?void 0:le.labelHeight)&&void 0!==h?h:.4)]})]})}):null})},yv=n.a.memo(pv),gv=l(21),mv=l(22),wv=l(843),xv=l(94),vv=mv.a.div(Zx||(Zx=Object(gv.a)(["\n position: absolute;\n left: calc(100vw / 2 - 50px);\n width: 100px;\n bottom: 6px;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 10000; // must be larger than that of the spinner so that this can be clicked\n"]))),bv=function(){var e=Ew(si),t=Ew(Gi),l=Ew(Vi),a=Tf(ws),i=Ew(o.showDesignInfoPanel),r={lng:l};return Object(gf.jsx)(vv,{style:{bottom:i?"42px":"6px"},children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.runDailyThermalSimulation=!1,e.runYearlyThermalSimulation=!1,e.pauseDailyThermalSimulation=!1,e.pauseYearlyThermalSimulation=!1,e.runStaticSimulation=!1,e.runDynamicSimulation=!1,e.pauseSimulation=!1,e.runDailyLightSensor=!1,e.runYearlyLightSensor=!1,e.pauseDailyLightSensor=!1,e.pauseYearlyLightSensor=!1,e.runDailySimulationForSolarPanels=!1,e.runYearlySimulationForSolarPanels=!1,e.pauseDailySimulationForSolarPanels=!1,e.pauseYearlySimulationForSolarPanels=!1,e.runDailySimulationForParabolicTroughs=!1,e.runYearlySimulationForParabolicTroughs=!1,e.pauseDailySimulationForParabolicTroughs=!1,e.pauseYearlySimulationForParabolicTroughs=!1,e.runDailySimulationForParabolicDishes=!1,e.runYearlySimulationForParabolicDishes=!1,e.pauseDailySimulationForParabolicDishes=!1,e.pauseYearlySimulationForParabolicDishes=!1,e.runDailySimulationForFresnelReflectors=!1,e.runYearlySimulationForFresnelReflectors=!1,e.pauseDailySimulationForFresnelReflectors=!1,e.pauseYearlySimulationForFresnelReflectors=!1,e.runDailySimulationForHeliostats=!1,e.runYearlySimulationForHeliostats=!1,e.pauseDailySimulationForHeliostats=!1,e.pauseYearlySimulationForHeliostats=!1})),e((function(e){t&&(e.actionInfo={name:"Cancel Simulation",timestamp:(new Date).getTime()})}))},title:me.t("message.CancelSimulation",r),children:me.t("word.Cancel",r)}),!a&&Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.runDailyThermalSimulation&&(e.pauseDailyThermalSimulation=!0),e.runYearlyThermalSimulation&&(e.pauseYearlyThermalSimulation=!0),e.runDynamicSimulation&&(e.pauseSimulation=!0),e.runDailyLightSensor&&(e.pauseDailyLightSensor=!0),e.runYearlyLightSensor&&(e.pauseYearlyLightSensor=!0),e.runDailySimulationForSolarPanels&&(e.pauseDailySimulationForSolarPanels=!0),e.runYearlySimulationForSolarPanels&&(e.pauseYearlySimulationForSolarPanels=!0),e.runDailySimulationForParabolicTroughs&&(e.pauseDailySimulationForParabolicTroughs=!0),e.runYearlySimulationForParabolicTroughs&&(e.pauseYearlySimulationForParabolicTroughs=!0),e.runDailySimulationForParabolicDishes&&(e.pauseDailySimulationForParabolicDishes=!0),e.runYearlySimulationForParabolicDishes&&(e.pauseYearlySimulationForParabolicDishes=!0),e.runDailySimulationForFresnelReflectors&&(e.pauseDailySimulationForFresnelReflectors=!0),e.runYearlySimulationForFresnelReflectors&&(e.pauseYearlySimulationForFresnelReflectors=!0),e.runDailySimulationForHeliostats&&(e.pauseDailySimulationForHeliostats=!0),e.runYearlySimulationForHeliostats&&(e.pauseYearlySimulationForHeliostats=!0)})),e((function(e){t&&(e.actionInfo={name:"Pause Simulation",timestamp:(new Date).getTime()})}))},title:me.t("message.PauseSimulation",r),children:me.t("word.Pause",r)}),a&&Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.runDailyThermalSimulation&&(e.pauseDailyThermalSimulation=!1),e.runYearlyThermalSimulation&&(e.pauseYearlyThermalSimulation=!1),e.runDynamicSimulation&&(e.pauseSimulation=!1),e.runDailyLightSensor&&(e.pauseDailyLightSensor=!1),e.runYearlyLightSensor&&(e.pauseYearlyLightSensor=!1),e.runDailySimulationForSolarPanels&&(e.pauseDailySimulationForSolarPanels=!1),e.runYearlySimulationForSolarPanels&&(e.pauseYearlySimulationForSolarPanels=!1),e.runDailySimulationForParabolicTroughs&&(e.pauseDailySimulationForParabolicTroughs=!1),e.runYearlySimulationForParabolicTroughs&&(e.pauseYearlySimulationForParabolicTroughs=!1),e.runDailySimulationForParabolicDishes&&(e.pauseDailySimulationForParabolicDishes=!1),e.runYearlySimulationForParabolicDishes&&(e.pauseYearlySimulationForParabolicDishes=!1),e.runDailySimulationForFresnelReflectors&&(e.pauseDailySimulationForFresnelReflectors=!1),e.runYearlySimulationForFresnelReflectors&&(e.pauseYearlySimulationForFresnelReflectors=!1),e.runDailySimulationForHeliostats&&(e.pauseDailySimulationForHeliostats=!1),e.runYearlySimulationForHeliostats&&(e.pauseYearlySimulationForHeliostats=!1)})),e((function(e){t&&(e.actionInfo={name:"Resume Simulation",timestamp:(new Date).getTime()})}))},title:me.t("message.ResumeSimulation",r),children:me.t("word.Resume",r)})]})})},Av=n.a.memo(bv),Tv=mv.a.div(_x||(_x=Object(gv.a)(["\n position: absolute;\n left: calc(100vw / 2 - 50px);\n width: 100px;\n bottom: 6px;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 10000; // must be larger than that of the spinner so that this can be clicked\n"]))),Pv=function(){var e=Ew(si),t=Ew(Gi),l=Ew(Vi),a=Tf(vs),i=Ew(o.showDesignInfoPanel),r={lng:l};return Object(gf.jsx)(Tv,{style:{bottom:i?"42px":"6px"},children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.runStaticSimulation=!1,e.pauseSimulation=!1,e.runEvolution=!1,e.pauseEvolution=!1})),t&&e((function(e){e.actionInfo={name:"Cancel Evolution",timestamp:(new Date).getTime()}}))},title:me.t("message.CancelEvolution",r),children:me.t("word.Cancel",r)}),!a&&Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.pauseSimulation=!0,e.runEvolution&&(e.pauseEvolution=!0)})),t&&e((function(e){e.actionInfo={name:"Pause Evolution",timestamp:(new Date).getTime()}}))},title:me.t("message.PauseEvolution",r),children:me.t("word.Pause",r)}),a&&Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.pauseSimulation=!1,e.runEvolution&&(e.pauseEvolution=!1)})),t&&e((function(e){e.actionInfo={name:"Resume Evolution",timestamp:(new Date).getTime()}}))},title:me.t("message.ResumeEvolution",r),children:me.t("word.Resume",r)})]})})},Sv=n.a.memo(Pv),jv=l(274),Hv=Object(mv.a)(jv.a)($x||($x=Object(gv.a)(["\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.5);\n z-index: 9999;\n"]))),zv=n.a.memo((function(e){var t=e.initializing,l=Tf(gs),a=Tf(ms),o=Tf(xs),r=Tf(ws),n=Tf(vs),c=Ew(i.noAnimationForSensorDataCollection),s=Ew(i.noAnimationForSolarPanelSimulation),d=Ew(i.noAnimationForHeatmapSimulation),u=Ew(i.noAnimationForSolarUpdraftTowerSimulation),f=Ew(i.noAnimationForThermalSimulation),h=Tf(Xs),p=Tf(Ks),y=Tf(mu),g=Tf(xu),m=Tf(Gd),w=Tf(Xd),x=Tf(Lr),v=Tf(Ir),b=Tf(Or),A=Ew.getState().elements;return Object(gf.jsx)(gf.Fragment,{children:(t||l||a||o)&&Object(gf.jsxs)(gf.Fragment,{children:[a&&(!d&&x||!f&&(v||b)||!c&&(y||g)||!u&&(m||w)||!s&&(h||p)||Tw.hasMovingParts(A))&&Object(gf.jsx)(Av,{}),o&&Object(gf.jsx)(Sv,{}),Object(gf.jsx)(Hv,{spinning:!r||!n})]})})})),Rv=function(){if(!Tf.getState().waiting)return null;var e=function(){return Object(r.useEffect)((function(){return Tf.setState((function(e){e.waiting=!1})),function(){Tf.setState((function(e){e.waiting=!1}))}})),null};return Object(gf.jsx)(e,{})},Dv=function(){var e=Ew(Fi),t=Object(r.useRef)(null);return Object(r.useEffect)((function(){t&&Et.setState((function(e){e.contentRef=t}))}),[]),console.debug(e),Object(gf.jsxs)("group",{ref:t,name:"Content",children:[e.map((function(t){switch(t.type){case V.Foundation:return Object(gf.jsx)(hg,Object(d.a)({},t),t.id);case V.Sensor:var l=t;return l.parentType===V.Cuboid?null:Object(gf.jsx)(mw,Object(d.a)({},l),t.id);case V.Light:var a=t;return a.parentType===V.Cuboid?null:Object(gf.jsx)(xw,Object(d.a)({},a),t.id);case V.Cuboid:return t.parentId!==xt?null:Object(gf.jsx)(Aw,{elements:e,cuboidModel:t},t.id);case V.Human:return Object(gf.jsx)(cx,Object(d.a)({},t),t.id);case V.Tree:return Object(gf.jsx)(Bx,Object(d.a)({},t),t.id);case V.Flower:return Object(gf.jsx)(yv,Object(d.a)({},t),t.id);case V.SolarPanel:switch(t.parentType){case V.Roof:case V.Wall:case V.Cuboid:return null;default:return Object(gf.jsx)(hv,Object(d.a)({},t),t.id)}case V.ParabolicDish:return Object(gf.jsx)(nv,Object(d.a)({},t),t.id);case V.ParabolicTrough:return Object(gf.jsx)(iv,Object(d.a)({},t),t.id);case V.FresnelReflector:return Object(gf.jsx)(sv,Object(d.a)({},t),t.id);case V.Heliostat:return Object(gf.jsx)(uv,Object(d.a)({},t),t.id);case V.Polygon:switch(t.parentType){case V.Wall:return null;default:return Object(gf.jsx)(Pm,Object(d.a)({},t),t.id)}default:if(t.id)return Object(gf.jsx)(n.a.Fragment,{},t.id)}return null})),Object(gf.jsx)(Rv,{}),Object(gf.jsx)(Mv,{})]})},Mv=function(){var e=Ew(Uu);return Object(r.useEffect)((function(){Ew.getState().set((function(e){e.deletedRoofIdSet.clear()}))}),[e]),null},Wv=n.a.memo(Dv),Iv=function(){var e=Ew(si),t=Ew(on),l=Ew(en),a=Ew(cn),i=Ew(Nn),n=Ew(ns),c=Ew(Zr),s=Ew(An),p=Ew(zn),y=Ew(qc),g=Ew(Qr),m=Ew(Du),w=Ew(Sr),x=Ew(qn),v=Ew(Br),b=Ew(Vi),A=Ew(cs),T=Ew(zu),P=Ew(Ru),S=Ew(Mu),j=Ew(Wu),H=Ew(o.shadowEnabled),z=Ew(o.groundColor),R=Ew(o.waterSurface),D=Ew((function(e){return e.world.ground})),M=Ew(Ou),W=Ew(ku),I=Tf(Ns),C=Object(Se.f)(),O=C.get,F=C.scene,k=C.invalidate,Y=Object(r.useRef)(),L=Object(r.useRef)(),E=Object(r.useRef)(null),U=Object(r.useRef)(new Me.Vector3),N=Object(r.useRef)(new Me.Vector3),J=Object(r.useRef)(new Map),G=Object(r.useRef)(new Map),X=Object(r.useRef)(new Map),Q=Object(r.useRef)(new Map),_=Object(r.useRef)(new Map),$=Object(r.useRef)(new Map),ee=Object(r.useRef)(new Map),te=Object(r.useRef)(new Map),le=Object(r.useRef)(new Me.Vector3(1,1,1)),ae=Object(r.useRef)(new Me.Vector3(1,1,1)),oe=Object(r.useRef)([0,0,1]),ie=Object(r.useRef)([0,0,1]),re=Object(r.useRef)(null),ne=Object(r.useRef)(null),ce=Object(r.useRef)(new Map),se=Object(r.useRef)(new Map),de=Object(r.useRef)(new Map),ue=Object(r.useRef)(!1),fe=Object(r.useRef)(!1),he=Object(r.useRef)(!1),pe=Object(r.useRef)(!1),ye=Object(r.useRef)(!1),ge=Object(r.useRef)(new Map),we=Object(r.useRef)(new Map),xe=Object(r.useRef)(new Map),ve=Object(r.useRef)(new Me.Vector3),be=Object(r.useMemo)((function(){return{lng:b}}),[b]);Object(r.useEffect)((function(){return window.addEventListener("pointerup",_e),function(){window.removeEventListener("pointerup",_e)}}),[]),Object(r.useEffect)((function(){M&&(e((function(e){e.addedFoundationId=null,e.deletedFoundationId=null})),ue.current=!1,fe.current=!1)}),[M]),Object(r.useEffect)((function(){W&&(e((function(e){e.addedCuboidId=null,e.deletedCuboidId=null})),he.current=!1,pe.current=!1)}),[W]);var Ae=Object(Se.f)().camera,Te=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Pe=Object(r.useMemo)((function(){return new Me.Vector2}),[]),je=E.current?Math.cos(E.current.rotation[2]):1,He=E.current?Math.sin(E.current.rotation[2]):0,ze=Z.Ground,Re=Object(r.useMemo)((function(){return new Me.Vector3}),[]),De=Object(r.useMemo)((function(){return new Me.Euler}),[]),We=Object(r.useMemo)((function(){return new Me.Euler}),[]);if(E.current)if(Tw.isPlantOrHuman(E.current)){ze=Z.Vertical;var Ie=Ew.getState().viewState.orthographic?0:-vt,Ce=Ae.position,Oe=Ce.x,Fe=Ce.y,ke=-Math.atan2(Oe,Fe);De.set(Ie,0,ke,"ZXY"),Re.set(E.current.cx,E.current.cy,0)}else if(T===B.Top)ze=Z.Horizontal,Re.set(E.current.cx,E.current.cy,E.current.lz),De.set(0,0,0);else if(Tw.isMoveHandle(T)||P===K.Left||P===K.Right||P===K.Lower||P===K.Upper||P===K.LowerLeft||P===K.UpperLeft&&E.current.type!==V.Wall||P===K.LowerRight||P===K.UpperRight&&E.current.type!==V.Wall||S===q.Lower||S===q.Upper)ze=Z.Horizontal,Re.set(E.current.cx,E.current.cy,st),De.set(0,0,0);else if(P){ze=Z.Vertical;var Ye=m(E.current,P),Le=g(),Ee=-Math.atan2(Le.x,Le.y);Re.set(Ye.x,Ye.y,0),De.set(-vt,0,Ee,"ZXY")}var Ue=function(e){Pe.x=e.offsetX/O().gl.domElement.clientWidth*2-1,Pe.y=-e.offsetY/O().gl.domElement.clientHeight*2+1,Te.setFromCamera(Pe,O().camera)},Ne=function(e){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.object.userData.stand)return a}}catch(o){l.e(o)}finally{l.f()}return null},Ve=function(t,l){t&&e((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l&&i.type!==V.Foundation){i.parentId=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Je=function e(t){if(!t)return"";var l=t.name.split(" ");return l[2]?l[2]:e(t.parent)},Ge=function(e,t,l){if(e&&t){var a=Et.getState().contentRef;if(null===a||void 0===a?void 0:a.current){var o=Tw.getObjectChildById(a.current,t),i=Tw.getObjectChildById(t===xt?a.current:o,l);if(i){if(e===xt)a.current.add(i);else{var r=Tw.getObjectChildById(a.current,e);null===r||void 0===r||r.add(i)}k()}}}},Xe=function(e,t){if(e&&e.current){var l=Ne(t.intersections);if(l){var a=l.object,o=e.current.parent;if("Ground"===a.name){if(o&&"Content"!==o.name){var i=Et.getState().contentRef;i&&i.current&&(i.current.add(e.current),Ve(xt,Je(e.current)))}e.current.position.copy(l.point),k()}else if(a.userData.stand){var r=a.parent;if(r){o&&o.uuid!==r.uuid&&(r.add(e.current),Ve(Je(r),Je(e.current)));var n=Tw.getWorldDataById(Je(r)).rot;We.set(0,0,-n);var c=(new Me.Vector3).subVectors(l.point,r.localToWorld(new Me.Vector3)).applyEuler(We);e.current.position.copy(c),k()}}ye.current||(ye.current=!0)}}},Be=function(t,l,a){e((function(e){var o,i=Object(f.a)(e.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===t){Tw.isFoundationOrCuboid(r)||(r.parentId=l),r.cx=a.x,r.cy=a.y,r.cz=a.z;break}}}catch(n){i.e(n)}finally{i.f()}}))},Ke=function(e,t){var l=Et.getState().contentRef,a=Tw.getObjectChildById(null===l||void 0===l?void 0:l.current,e.id);if(a){var o,i=Object(f.a)(a.children);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.name.includes("".concat(t.id))){var n,c;null===(n=Et.getState().contentRef)||void 0===n||null===(c=n.current)||void 0===c||c.add(r);break}}}catch(d){i.e(d)}finally{i.f()}}t.parentId=xt;var s=new Me.Vector3(t.cx,t.cy,t.cz).applyEuler(new Me.Euler(0,0,e.rotation[2])).add(U.current);t.cx=s.x,t.cy=s.y,t.cz=0,G.current.set(t.id,new Me.Vector3(s.x,s.y,0)),te.current.set(t.id,xt)},qe=function(t){var a=Ew.getState().resizeHandleType;switch(t.type){case V.Tree:switch(a){case K.Top:var o={name:"Change Tree Height",timestamp:Date.now(),changedElementId:t.id,changedElementType:t.type,oldValue:le.current.z,newValue:t.lz,undo:function(){p(o.changedElementId,o.oldValue)},redo:function(){p(o.changedElementId,o.newValue)}};return w(o),void e((function(e){e.actionState.treeHeight=t.lz}));case K.Left:case K.Right:case K.Lower:case K.Upper:var i={name:"Change Tree Spread",timestamp:Date.now(),changedElementId:t.id,changedElementType:t.type,oldValue:le.current.x,newValue:t.lx,undo:function(){s(i.changedElementId,i.oldValue)},redo:function(){s(i.changedElementId,i.newValue)}};return w(i),void e((function(e){e.actionState.treeSpread=t.lx}))}break;case V.Wall:var r={name:"Change Wall Height",timestamp:Date.now(),changedElementId:t.id,changedElementType:t.type,oldValue:le.current.z,newValue:t.lz,undo:function(){p(r.changedElementId,r.oldValue)},redo:function(){p(r.changedElementId,r.newValue)}};return w(r),void e((function(e){e.actionState.wallHeight=t.lz}))}if(N.current.set(t.cx,t.cy,t.cz),ae.current.set(t.lx,t.ly,t.lz),ee.current.clear(),te.current.clear(),G.current.clear(),Q.current.clear(),$.current.clear(),e((function(e){if(t.type===V.Cuboid&&(e.actionState.cuboidHeight=t.lz),e.updateSceneRadius(),e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,t.parentId===xt){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Tw.isPlantOrHuman(o)&&o.parentId===t.id&&(ee.current.set(o.id,t.id),!Tw.isResizingVertical(Ew.getState().resizeHandleType)))if(Math.abs(le.current.z/2-o.cz)<.01){var i=new Me.Vector3(o.cx,o.cy,o.cz).applyEuler(new Me.Euler(0,0,t.rotation[2])).add(U.current).sub(N.current).applyEuler(new Me.Euler(0,0,-t.rotation[2]));Math.abs(i.x)>Math.abs(ae.current.x/2)+.01||Math.abs(i.y)>Math.abs(ae.current.y/2)+.01?Ke(t,o):(o.cx=i.x,o.cy=i.y)}else{var r=new Me.Vector3(o.cx,o.cy,o.cz),n=(new Me.Vector3).subVectors(N.current,U.current),c=(new Me.Vector3).subVectors(r,n);Math.abs(r.x/le.current.x)>.49?Math.abs(c.y)>t.ly/2+.5?Ke(t,o):(o.cx=(r.x>0?t.lx:-t.lx)/2,o.cy=c.y):Math.abs(r.y/le.current.y)>.49&&(Math.abs(c.x)>t.lx/2+.5?Ke(t,o):(o.cx=c.x,o.cy=(r.y>0?t.ly:-t.ly)/2))}}}catch(s){a.e(s)}finally{a.f()}}})),N.current.distanceToSquared(U.current)>At&&ae.current.distanceToSquared(le.current)>At){if(t.type===V.Foundation||t.type===V.Cuboid){var n=l(t.id);if(n.length>0){var h,y=Object(f.a)(n);try{for(y.s();!(h=y.n()).done;){var g=h.value;if(g.type===V.Polygon)Q.current.set(g.id,g.vertices.map((function(e){return Object(d.a)({},e)})));else{if(g.type===V.Wall){var m=g,v=new Me.Vector2(m.leftPoint[0],m.leftPoint[1]),b=new Me.Vector2(m.rightPoint[0],m.rightPoint[1]);$.current.set(g.id,[v,b])}G.current.set(g.id,new Me.Vector3(g.cx,g.cy,g.cz))}}}catch(z){y.e(z)}finally{y.f()}}if(t.type===V.Foundation){var A=at(t.id);if(A.length>0){var T,P=Object(f.a)(A);try{for(P.s();!(T=P.n()).done;){var S=T.value,j=new Me.Vector3(S.cx,S.cy);G.current.set(S.id,j)}}catch(z){P.e(z)}finally{P.f()}}}}var H=function(){if(E.current){var t={name:"Resize",timestamp:Date.now(),resizedElementId:E.current.id,resizedElementType:E.current.type,oldCx:U.current.x,oldCy:U.current.y,oldCz:U.current.z,newCx:N.current.x,newCy:N.current.y,newCz:N.current.z,oldLx:le.current.x,oldLy:le.current.y,oldLz:le.current.z,newLx:ae.current.x,newLy:ae.current.y,newLz:ae.current.z,oldChildrenPositionsMap:new Map(J.current),newChildrenPositionsMap:new Map(G.current),oldPolygonVerticesMap:new Map(X.current),newPolygonVerticesMap:new Map(Q.current),oldChildrenParentIdMap:new Map(ee.current),newChildrenParentIdMap:new Map(te.current),oldWallPointsMap:new Map(_.current),newWallPointsMap:new Map($.current),undo:function(){if(e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.resizedElementId){o.cx=t.oldCx,o.cy=t.oldCy,o.cz=t.oldCz,o.lx=t.oldLx,o.ly=t.oldLy,o.lz=t.oldLz;break}}}catch(z){a.e(z)}finally{a.f()}})),t.oldChildrenPositionsMap.size>0){var l,a=Object(f.a)(t.oldChildrenPositionsMap.entries());try{var o=function(){var a=Object(u.a)(l.value,2),o=a[0],i=a[1],r=c(o);if((null===r||void 0===r?void 0:r.type)!==V.Polygon){var n,s;e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var r=l.value;if(r.id===o){if(r.cx=i.x,r.cy=i.y,lt(r)||(r.cz=i.z),r.type===V.Wall){var n=r,c=t.oldWallPointsMap.get(n.id);c&&(n.leftPoint=[c[0].x,c[0].y,0],n.rightPoint=[c[1].x,c[1].y,0])}break}}}catch(z){a.e(z)}finally{a.f()}t.oldWallPointsMap.size>0&&(e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag)}));var d=null===(n=t.oldChildrenParentIdMap)||void 0===n?void 0:n.get(o),h=null===(s=t.newChildrenParentIdMap)||void 0===s?void 0:s.get(o);d&&h&&d!==h&&(Ge(d,h,o),Ve(d,o))}};for(a.s();!(l=a.n()).done;)o()}catch(z){a.e(z)}finally{a.f()}}if(t.oldPolygonVerticesMap.size>0){var i,r=Object(f.a)(t.oldPolygonVerticesMap.entries());try{for(r.s();!(i=r.n()).done;){var n=Object(u.a)(i.value,2),s=n[0],d=n[1],h=c(s);(null===h||void 0===h?void 0:h.type)===V.Polygon&&x(s,d)}}catch(z){r.e(z)}finally{r.f()}}},redo:function(){if(e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.resizedElementId){o.cx=t.newCx,o.cy=t.newCy,o.cz=t.newCz,o.lx=t.newLx,o.ly=t.newLy,o.lz=t.newLz;break}}}catch(z){a.e(z)}finally{a.f()}})),t.newChildrenPositionsMap.size>0){var l,a=Object(f.a)(t.newChildrenPositionsMap.entries());try{var o=function(){var a,o,i=Object(u.a)(l.value,2),r=i[0],n=i[1];e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===r){if(o.cx=n.x,o.cy=n.y,o.type===V.SolarPanel&&o.parentType===V.Roof||(o.cz=n.z),o.type===V.Wall){var i=o,c=t.newWallPointsMap.get(i.id);c&&(i.leftPoint=[c[0].x,c[0].y,0],i.rightPoint=[c[1].x,c[1].y,0])}break}}}catch(z){a.e(z)}finally{a.f()}t.newWallPointsMap.size>0&&(e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag)}));var c=null===(a=t.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=t.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(Ge(s,c,r),Ve(s,r))};for(a.s();!(l=a.n()).done;)o()}catch(z){a.e(z)}finally{a.f()}}if(t.newPolygonVerticesMap.size>0){var i,r=Object(f.a)(t.newPolygonVerticesMap.entries());try{for(r.s();!(i=r.n()).done;){var n=Object(u.a)(i.value,2),s=n[0],d=n[1],h=c(s);(null===h||void 0===h?void 0:h.type)===V.Polygon&&x(s,d)}}catch(z){r.e(z)}finally{r.f()}}}};return t}}();H&&w(H)}},Qe=function(t){e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(t.has(o.id)){var i=t.get(o.id);i&&(o.cx=i[0],o.cy=i[1],o.cz=i[2])}}}catch(r){a.e(r)}finally{a.f()}}))},Ze=function(t,l){var o,i,r;if(!t.locked){N.current.set(t.cx,t.cy,t.cz);var n=re.current,c=null;switch(Ue(l),t.type){case V.Tree:c=null===(o=Et.getState().treeRef)||void 0===o?void 0:o.current;break;case V.Flower:c=null===(i=Et.getState().flowerRef)||void 0===i?void 0:i.current;break;case V.Human:c=null===(r=Et.getState().humanRef)||void 0===r?void 0:r.current}if(c&&ye.current){var s=Te.intersectObjects(Tw.fetchIntersectables(F),!1),d=Ne(s);if(d){var u=d.point;if("Ground"===d.object.name)Be(t.id,xt,u),N.current.set(u.x,u.y,u.z),n=xt;else if(d.object.userData.stand){var p=Je(d.object),y=d.object.parent;if(y){var g=(new Me.Vector3).subVectors(u,y.localToWorld(new Me.Vector3)).applyEuler(We);Be(t.id,p,g),N.current.set(g.x,g.y,g.z),n=p}}}ye.current=!1}if(N.current.distanceToSquared(U.current)>At||0===Te.intersectObjects([Y.current]).length){var m=!0;if(!Ew.getState().viewState.orthographic&&!(m=N.current.length().02}if(!m||function(){if(Ew.getState().viewState.orthographic)return!1;if(Y.current){var e=Te.intersectObjects(O().scene.children,!0);if(e.length>0){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;)if(t.value.object.userData.stand)return!1}catch(a){l.e(a)}finally{l.f()}}}return 0===Te.intersectObjects([Y.current]).length}()){a(t.id,U.current.x,U.current.y,U.current.z),c&&Tw.isPlantOrHuman(t)&&c.position.copy(U.current),Tw.isPlantOrHuman(t)&&Ve(re.current,t.id);var S=Et.getState().contentRef;if((null===S||void 0===S?void 0:S.current)&&re.current&&c){if(re.current===xt)S.current.add(c);else{var j=Tw.getObjectChildById(S.current,re.current);null===j||void 0===j||j.add(c)}k()}Qh(me.t("message.CannotMoveObjectTooFar",be))}else{if(ge.current.size>1){xe.current.clear();var H,z=Object(f.a)(Ew.getState().elements);try{for(z.s();!(H=z.n()).done;){var R=H.value;we.current.has(R.id)&&xe.current.set(R.id,[R.cx,R.cy,R.cz])}}catch(L){z.e(L)}finally{z.f()}var D={name:"Move Foundation Group",timestamp:Date.now(),oldPositionMap:new Map(we.current),newPositionMap:new Map(xe.current),undo:function(){Qe(D.oldPositionMap)},redo:function(){Qe(D.newPositionMap)}};w(D)}else{var M=t.type===V.Cuboid,W=M?ne.current:re.current,I=M?t.parentId:n,C={name:"Move",timestamp:Date.now(),movedElementId:t.id,movedElementType:t.type,oldCx:U.current.x,oldCy:U.current.y,oldCz:U.current.z,newCx:N.current.x,newCy:N.current.y,newCz:N.current.z,oldRotation:Object(h.a)(oe.current),newRotation:Object(h.a)(t.rotation),oldParentId:W,newParentId:I,undo:function(){a(C.movedElementId,C.oldCx,C.oldCy,C.oldCz),e((function(e){var t=e.elements.find((function(e){return e.id===C.movedElementId}));t&&C.oldRotation&&(t.rotation=Object(h.a)(C.oldRotation))})),Ve(C.oldParentId,C.movedElementId),C.movedElementType&&ot(C.movedElementType)&&Ge(C.oldParentId,C.newParentId,C.movedElementId)},redo:function(){a(C.movedElementId,C.newCx,C.newCy,C.newCz),e((function(e){var t=e.elements.find((function(e){return e.id===C.movedElementId}));t&&C.newRotation&&(t.rotation=Object(h.a)(C.newRotation))})),Ve(C.newParentId,C.movedElementId),C.movedElementType&&ot(C.movedElementType)&&Ge(C.newParentId,C.oldParentId,C.movedElementId)}};w(C)}ge.current.clear(),v()}}}},_e=function(t){if(2!==t.button){if(Et.setState((function(e){e.setEnableOrbitController(!0)})),E.current){var l=c(E.current.id);if(l)if(fe.current)if(ue.current=!1,fe.current=!1,e((function(e){e.addedFoundationId=null,e.updateSceneRadius()})),l.lx<=.1||l.ly<=.1)y(l.id,!1);else{var a={name:"Add",timestamp:Date.now(),addedElement:l,undo:function(){y(a.addedElement.id,!1),v()},redo:function(){e((function(e){e.elements.push(a.addedElement),e.selectedElement=a.addedElement,e.updateSceneRadius()}))}};w(a)}else if(pe.current)if(he.current=!1,pe.current=!1,e((function(e){e.addedCuboidId=null,e.updateSceneRadius()})),l.lx<=.1||l.ly<=.1)y(l.id,!1);else{var o={name:"Add",timestamp:Date.now(),addedElement:l,undo:function(){y(o.addedElement.id,!1),v()},redo:function(){e((function(e){e.elements.push(o.addedElement),e.selectedElement=o.addedElement,e.updateSceneRadius()}))}};w(o)}else Ew.getState().resizeHandleType?qe(l):Ew.getState().rotateHandleType?function(e){ie.current=Object(h.a)(e.rotation);var t=(new Me.Vector3).fromArray(oe.current);if((new Me.Vector3).fromArray(ie.current).distanceToSquared(t)>At){var l={name:"Rotate",timestamp:Date.now(),rotatedElementId:e.id,rotatedElementType:e.type,oldRotation:oe.current,newRotation:ie.current,undo:function(){i(l.rotatedElementId,l.oldRotation[0],l.oldRotation[1],l.oldRotation[2])},redo:function(){i(l.rotatedElementId,l.newRotation[0],l.newRotation[1],l.newRotation[2])}};w(l)}}(l):Ew.getState().moveHandleType&&Ze(l,t),l.type===V.Foundation&&Tf.getState().updateFoundationMovedFlag();E.current=null}e((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null})),Et.setState((function(e){e.humanRef=null,e.treeRef=null,e.flowerRef=null}))}},$e=function(e,t){var l=Tw.getWorldDataById(e.id).pos,a=new Me.Vector3(l.x,l.y),o=(new Me.Vector3).subVectors(a,t);ge.current.set(e.id,o),we.current.set(e.id,[e.cx,e.cy,e.cz])},et=function e(t,l){var a,o=t.intersections[0].point.clone().setZ(0),i=Object(f.a)(Ew.getState().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;!Lw(r)||r.parentId!==xt||r.locked||r.id===l.id||ge.current.has(r.id)||Tw.isChild(l.id,r.id)||Tw.isChild(r.id,l.id)||!Tw.areTwoBasesOverlapped(r,l)||($e(r,o),e(t,r)),r.id===l.id&&$e(r,o)}}catch(n){i.e(n)}finally{i.f()}},tt=function(e,t){ge.current.clear(),we.current.clear(),t.enableGroupMaster&&Ew.getState().moveHandleType&&et(e,t)},lt=function(e){return e.type===V.SolarPanel&&e.parentType===V.Roof||(e.type===V.Window&&e.parentType===V.Roof||void 0)},at=function(e){return Ew.getState().elements.filter((function(t){return t.foundationId===e&&(t.type===V.SolarPanel&&t.parentType===V.Roof||(t.type===V.Window&&t.parentType===V.Roof||(t.type===V.Sensor||t.type===V.Light||void 0)))}))},ot=function(e){return e===V.Human||e===V.Tree||e===V.Flower},it=function(e,t){if(0===e.tempHumanPlant.length){var l=e.elements.filter((function(e){return ot(e.type)&&Tw.isDescendantOf(e,t)}));e.tempHumanPlant=l;var a=new Set(l.map((function(e){return e.id})));e.elements=e.elements.filter((function(e){return!a.has(e.id)}))}},rt=function(e,t){var l=e.intersections.find((function(e){var l=e.eventObject;if(!l.name.includes("Cuboid"))return!1;var a=l.name.split(" ");return 2===a.length&&(a[1]!==t&&l.userData.stackable)}));if(l){var a=l.eventObject.name.split(" ")[1];if(!ge.current.has(a))return Tw.isChild(t,a)?void 0:l}},nt=function(e){return e===V.Foundation||e===V.Cuboid||e===V.Tree||e===V.Flower||e===V.Human},ct=function(e,t,l,a,o){if(e){var i,r=Object(f.a)(e.children);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.name.includes("Human")||n.name.includes("Tree")||n.name.includes("Flower")){var c=Je(n),s=ce.current.get(c);if(s)if(Math.abs(le.current.z/2-n.position.z)<.01){var d=(new Me.Vector3).subVectors(s,a).applyEuler(new Me.Euler(0,0,-o));n.position.setX(d.x),n.position.setY(d.y)}else{var u=(new Me.Vector3).subVectors(s,U.current).applyEuler(new Me.Euler(0,0,-o)),h=(new Me.Vector3).subVectors(a,U.current),p=(new Me.Vector3).subVectors(u,h);Math.abs(u.x/le.current.x)>.49?(n.position.setX((u.x>0?t:-t)/2),n.position.setY(p.y)):Math.abs(u.y/le.current.y)>.49&&(n.position.setX(p.x),n.position.setY((u.y>0?l:-l)/2))}}}}catch(y){r.e(y)}finally{r.f()}}},dt=function(t){if(E.current){var a=new Me.Vector2(t.x,t.y),o=new Me.Vector2(j.x,j.y),i=o.distanceTo(a),r=Math.atan2(a.x-j.x,a.y-j.y)+E.current.rotation[2],n=Math.abs(i*Math.sin(r)),c=Math.abs(i*Math.cos(r)),s=(new Me.Vector2).addVectors(a,o).multiplyScalar(.5);switch(e((function(e){if(E.current){var t,a=!1,o=Object(f.a)(e.elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;if(i.id===E.current.id){switch(i.type){case V.Cuboid:case V.Foundation:var r=l(i.id);if(r.length>0){var d,u=[],h=Object(f.a)(r);try{for(h.s();!(d=h.n()).done;){var p=d.value;if(!Tw.isPlantOrHuman(p)){var y=JSON.parse(JSON.stringify(p));if(u.push(y),Tw.isIdentical(y.normal,Tt))if(p.type===V.Wall){var g=de.current.get(p.id);if(g){var m=-i.rotation[2],w=g.centerPointAbsPos,x=g.leftPointAbsPos,v=g.rightPointAbsPos,b=(new Me.Vector2).subVectors(w,s).rotateAround(Dt,m),A=(new Me.Vector2).subVectors(x,s).rotateAround(Dt,m),T=(new Me.Vector2).subVectors(v,s).rotateAround(Dt,m);switch(P){case K.Lower:case K.Upper:y.cy=b.y;break;case K.Left:case K.Right:y.cx=b.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:y.cx=b.x,y.cy=b.y}y.leftPoint=[A.x,A.y,0],y.rightPoint=[T.x,T.y,0]}}else{var S=ce.current.get(p.id);if(S){var j=-i.rotation[2],H=(new Me.Vector2).subVectors(new Me.Vector2(S.x,S.y),s).rotateAround(Dt,j);switch(P){case K.Lower:case K.Upper:y.cy=H.y/c;break;case K.Left:case K.Right:y.cx=H.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:y.cx=H.x/n,y.cy=H.y/c}}}}}}catch(ee){h.e(ee)}finally{h.f()}var z=JSON.parse(JSON.stringify(i));switch(P){case K.Lower:case K.Upper:z.ly=c,z.cy=s.y;break;case K.Left:case K.Right:z.lx=n,z.cx=s.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:z.lx=n,z.ly=c,z.cx=s.x,z.cy=s.y}if(Tw.doesParentContainAllChildren(z,u)){switch(P){case K.Lower:case K.Upper:i.ly=c,i.cy=s.y;break;case K.Left:case K.Right:i.lx=n,i.cx=s.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:i.lx=n,i.ly=c,i.cx=s.x,i.cy=s.y}a=!0}}else if(n>.49&&c>.49){switch(P){case K.Lower:case K.Upper:i.ly=c,i.cy=s.y;break;case K.Left:case K.Right:i.lx=n,i.cx=s.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:i.lx=n,i.ly=c,i.cx=s.x,i.cy=s.y}a=!0}}break}}}catch(ee){o.e(ee)}finally{o.f()}if(a){var R,D=Object(f.a)(e.elements);try{for(D.s();!(R=D.n()).done;){var M=R.value;if(M.parentId===E.current.id)switch(M.type){case V.Wall:var W=M,I=de.current.get(M.id);if(I){var C=-E.current.rotation[2],O=I.centerPointAbsPos,F=I.leftPointAbsPos,k=I.rightPointAbsPos,Y=(new Me.Vector2).subVectors(O,s).rotateAround(Dt,C),L=(new Me.Vector2).subVectors(F,s).rotateAround(Dt,C),U=(new Me.Vector2).subVectors(k,s).rotateAround(Dt,C);switch(P){case K.Lower:case K.Upper:M.cy=Y.y;break;case K.Left:case K.Right:M.cx=Y.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:M.cx=Y.x,M.cy=Y.y}W.leftPoint=[L.x,L.y,0],W.rightPoint=[U.x,U.y,0]}break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:if(Tw.isIdentical(M.normal,Tt)){var N=ce.current.get(M.id);if(N){var J=(new Me.Vector2).subVectors(new Me.Vector2(N.x,N.y),s).rotateAround(Dt,-E.current.rotation[2]);switch(P){case K.Lower:case K.Upper:M.cy=J.y/c;break;case K.Left:case K.Right:M.cx=J.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:M.cx=J.x/n,M.cy=J.y/c}}}break;case V.Cuboid:var G=ce.current.get(M.id);if(G){var X=(new Me.Vector2).subVectors(new Me.Vector2(G.x,G.y),s).rotateAround(Dt,-E.current.rotation[2]);switch(P){case K.Lower:case K.Upper:M.cy=X.y;break;case K.Left:case K.Right:M.cx=X.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:M.cx=X.x,M.cy=X.y}}break;case V.Polygon:if(Tw.isIdentical(M.normal,Tt)){var B=M,q=se.current.get(B.id);q&&function(){var e=[];q.forEach((function(t){var l=(new Me.Vector2).subVectors(t,s).rotateAround(Dt,-E.current.rotation[2]);e.push({x:l.x/n,y:l.y/c})})),B.vertices=e}()}}if(M.foundationId===E.current.id&&M.type===V.SolarPanel&&M.parentType===V.Roof){var Q=ce.current.get(M.id);if(Q){var Z=(new Me.Vector2).subVectors(new Me.Vector2(Q.x,Q.y),s).rotateAround(Dt,-E.current.rotation[2]);switch(P){case K.Lower:case K.Upper:M.cy=Z.y/c;break;case K.Left:case K.Right:M.cx=Z.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:M.cx=Z.x/n,M.cy=Z.y/c}}}if(M.foundationId===E.current.id&&M.type===V.Window&&M.parentType===V.Roof){var _=ce.current.get(M.id);if(_){var $=(new Me.Vector2).subVectors(new Me.Vector2(_.x,_.y),s).rotateAround(Dt,-E.current.rotation[2]);M.cx=$.x,M.cy=$.y}}}}catch(ee){D.e(ee)}finally{D.f()}}}})),E.current.type){case V.Foundation:var d=Et.getState().foundationRef;(null===d||void 0===d?void 0:d.current)&&ct(null===d||void 0===d?void 0:d.current,n,c,d.current.position,E.current.rotation[2]);break;case V.Cuboid:var u=Et.getState().cuboidRef;(null===u||void 0===u?void 0:u.current)&&u.current.parent&&ct(null===u||void 0===u?void 0:u.current,n,c,u.current.parent.position,E.current.rotation[2])}}},ut=function(e){var t=E.current,l=t.cx,a=t.cy,o=Math.atan2(l-e.x,e.y-a)+(S===q.Upper?0:Math.PI),r=Math.abs(o)>Math.PI?-Math.sign(o)*bt:0;i(E.current.id,0,0,o+r)},ft=function(t){var l=ge.current.size>1;if(l)e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Lw(o)&&ge.current.has(o.id)){var i=ge.current.get(o.id);i&&(o.cx=t.x+i.x,o.cy=t.y+i.y)}}}catch(r){a.e(r)}finally{a.f()}}));else{var o,i,r=E.current.lx/2,n=E.current.ly/2;switch(T){case B.Top:if(l){var c=new Me.Vector3(t.x,t.y);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=c.x,a.cy=c.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(c,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,t.x,t.y);break;case B.Upper:if(o=t.x+He*n,i=t.y-je*n,l){var s=new Me.Vector3(o,i);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=s.x,a.cy=s.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(s,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,o,i);break;case B.Lower:if(o=t.x-He*n,i=t.y+je*n,l){var d=new Me.Vector3(o,i);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=d.x,a.cy=d.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(d,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,o,i);break;case B.Left:if(o=t.x+je*r,i=t.y+He*r,l){var u=new Me.Vector3(o,i);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=u.x,a.cy=u.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(u,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,o,i);break;case B.Right:if(o=t.x-je*r,i=t.y-He*r,l){var h=new Me.Vector3(o,i);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=h.x,a.cy=h.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(h,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,o,i)}}};return Object(gf.jsxs)(gf.Fragment,{children:[E.current&&ze!==Z.Ground&&Object(gf.jsx)(Lt.f,{ref:L,visible:!1,name:"Ground Intersection Plane",rotation:De,position:Re,args:[1e5,1e5],onPointerMove:function(t){var l;if(E.current&&E.current.type&&!E.current.locked&&(Ue(t),L.current&&ze===Z.Vertical&&(l=Te.intersectObjects([L.current]))&&l.length>0)){var a=l[0].point;switch(E.current.type){case V.Tree:var o=E.current;switch(P){case K.Top:p(o.id,a.z),e((function(e){e.selectedElementHeight=Math.max(1,a.z)}));break;case K.Left:case K.Right:case K.Upper:case K.Lower:s(o.id,2*Math.hypot(a.x-o.cx,a.y-o.cy))}Xe(Et.getState().treeRef,t);break;case V.Flower:Xe(Et.getState().flowerRef,t);break;case V.Human:Xe(Et.getState().humanRef,t)}}},children:Object(gf.jsx)("meshStandardMaterial",{side:Me.DoubleSide,opacity:.5,transparent:!0})}),Object(gf.jsx)(Lt.f,{receiveShadow:H,ref:Y,name:"Ground",userData:{stand:!0},rotation:[0,0,0],position:[0,0,0],args:[1e4,1e4],renderOrder:-2,onContextMenu:function(t){t.intersections.length>0&&(t.intersections[0].object===Y.current&&e((function(e){Yy.selectNone(e),e.pastePoint.copy(t.intersections[0].point),e.clickObjectType=V.Ground,e.contextMenuObjectType=V.Ground,e.pasteNormal=Rt})))},onPointerDown:function(a){if(2!==a.button&&0!==a.intersections.length&&Y.current)if(ue.current){Ue(a);var o=Te.intersectObjects([Y.current]);o.length>0&&(Et.getState().setEnableOrbitController(!1),e((function(e){e.moveHandleType=null,e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(o[0].point)})),ue.current=!1,fe.current=!0)}else if(he.current){Ue(a);var i=Te.intersectObjects([Y.current]);i.length>0&&(Et.getState().setEnableOrbitController(!1),e((function(e){if(e.moveHandleType=null,e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(i[0].point),E.current){var t,l=rt(a,null===(t=E.current)||void 0===t?void 0:t.id);if(l){var o=Te.intersectObjects([l.eventObject]);o.length>0&&e.resizeAnchor.copy(o[0].point)}}})),he.current=!1,pe.current=!0)}else{if(a.intersections[0].object===Y.current){if(Ew.getState().multiSelectionsMode||e((function(e){e.clickObjectType=V.Ground,e.selectedElement=null,Yy.selectNone(e),e.contextMenuObjectType=null})),nt(A)){var r=a.intersections[0].point,c=n(D,r),s={name:"Add",timestamp:Date.now(),addedElement:c,undo:function(){y(s.addedElement.id,!1),v()},redo:function(){e((function(e){e.elements.push(s.addedElement),e.selectedElement=s.addedElement,e.updateSceneRadius()}))}};w(s),e((function(e){e.actionModeLock||(e.objectTypeToAdd=V.None),e.updateSceneRadius()}))}}else{var u=Ew.getState().selectedElementIdSet;if(u.size>1){var p=Ew.getState().selectedElement;if(p){E.current=p,ge.current.clear();var g,m=Object(f.a)(Ew.getState().elements);try{for(m.s();!(g=m.n()).done;){var x=g.value;if(Tw.isElementAllowedMultipleMoveOnGround(x)&&u.has(x.id))if(x.enableGroupMaster)et(a,x);else{var b=a.intersections[0].point.clone().setZ(0);$e(x,b)}}}catch(lt){m.e(lt)}finally{m.f()}}}else{var T=t();if(T&&nt(T.type)){if(E.current=T,U.current.set(T.cx,T.cy,T.cz),le.current.set(T.lx,T.ly,T.lz),oe.current=Object(h.a)(T.rotation),T.type===V.Foundation||T.type===V.Cuboid){var P=l(T.id);if(J.current.clear(),X.current.clear(),_.current.clear(),P.length>0){var S,j=Object(f.a)(P);try{for(j.s();!(S=j.n()).done;){var H=S.value;if(H.type===V.Polygon)X.current.set(H.id,H.vertices.map((function(e){return Object(d.a)({},e)})));else{if(H.type===V.Wall){var z=H,R=new Me.Vector2(z.leftPoint[0],z.leftPoint[1]),M=new Me.Vector2(z.rightPoint[0],z.rightPoint[1]);_.current.set(H.id,[R,M])}J.current.set(H.id,new Me.Vector3(H.cx,H.cy,H.cz))}}}catch(lt){j.e(lt)}finally{j.f()}}if(T.type===V.Foundation){var W=at(T.id);if(W.length>0){var I,C=Object(f.a)(W);try{for(C.s();!(I=C.n()).done;){var O=I.value,F=new Me.Vector3(O.cx,O.cy);J.current.set(O.id,F)}}catch(lt){C.e(lt)}finally{C.f()}}}}switch(T.type){case V.Tree:re.current=T.parentId,le.current.set(T.lx,T.ly,T.lz);break;case V.Flower:case V.Human:re.current=T.parentId;break;case V.Cuboid:if(Lw(T)&&T.parentId===xt?tt(a,T):ge.current.clear(),ne.current=T.parentId,Ew.getState().moveHandleType){var k=Tw.getWorldDataById(T.id).rot,L=new Me.Euler(0,0,k);switch(Ew.getState().moveHandleType){case B.Right:ve.current.set(-T.lx/2,0,0).applyEuler(L);break;case B.Left:ve.current.set(T.lx/2,0,0).applyEuler(L);break;case B.Lower:ve.current.set(0,T.ly/2,0).applyEuler(L);break;case B.Upper:ve.current.set(0,-T.ly/2,0).applyEuler(L);break;default:ve.current.set(0,0,0)}}ce.current.clear();var N=Tw.getWorldDataById(T.id),G=N.pos,q=N.rot,Q=new Me.Vector3(G.x,G.y,G.z),Z=l(T.id);if(Z.length>0){var $,ee=Object(f.a)(Z);try{for(ee.s();!($=ee.n()).done;){var te=$.value;switch(te.type){case V.Cuboid:var ae=new Me.Vector3(te.cx,te.cy,te.cz).applyEuler(new Me.Euler(0,0,q));ae.add(Q),ce.current.set(te.id,ae);break;case V.Tree:case V.Flower:case V.Human:var ie=new Me.Vector3(te.cx,te.cy,te.cz).applyEuler(new Me.Euler(0,0,q));ie.add(Q),ce.current.set(te.id,ie);break;case V.SolarPanel:case V.Light:case V.Sensor:if(Tw.isIdentical(te.normal,Tt)){var ye=new Me.Vector3(te.cx*T.lx,te.cy*T.ly,te.cz*T.lz).applyEuler(new Me.Euler(0,0,q));ye.add(Q),ce.current.set(te.id,ye)}break;case V.Polygon:if(Tw.isIdentical(te.normal,Tt)){var me,we=te,xe=[],be=Object(f.a)(we.vertices);try{for(be.s();!(me=be.n()).done;){var Ae=me.value,Pe=new Me.Vector2(Ae.x*T.lx,Ae.y*T.ly).rotateAround(Dt,q);Pe.add(new Me.Vector2(Q.x,Q.y)),xe.push(Pe)}}catch(lt){be.e(lt)}finally{be.f()}se.current.set(we.id,xe)}}}}catch(lt){ee.e(lt)}finally{ee.f()}}break;case V.Foundation:Lw(T)&&tt(a,T),ce.current.clear(),se.current.clear(),de.current.clear();var Se=new Me.Vector2(T.cx,T.cy),je=new Me.Vector3(T.cx,T.cy,T.cz),He=l(T.id);if(He.length>0){var ze,Re=T.rotation[2],De=Object(f.a)(He);try{for(De.s();!(ze=De.n()).done;){var We=ze.value;switch(We.type){case V.Wall:var Ie=We,Ce=new Me.Vector2(Ie.cx,Ie.cy).rotateAround(Dt,Re);Ce.add(Se);var Oe=new Me.Vector2(Ie.leftPoint[0],Ie.leftPoint[1]).rotateAround(Dt,Re);Oe.add(Se);var Fe=new Me.Vector2(Ie.rightPoint[0],Ie.rightPoint[1]).rotateAround(Dt,Re);Fe.add(Se),de.current.set(Ie.id,{centerPointAbsPos:Ce,leftPointAbsPos:Oe,rightPointAbsPos:Fe});break;case V.Tree:case V.Flower:case V.Human:var ke=new Me.Vector3(We.cx,We.cy,We.cz).applyEuler(new Me.Euler(0,0,Re));ke.add(je),ce.current.set(We.id,ke);break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var Ye=new Me.Vector3(We.cx*T.lx,We.cy*T.ly,We.cz*T.lz).applyEuler(new Me.Euler(0,0,Re));Ye.add(je),ce.current.set(We.id,Ye);break;case V.Polygon:var Le,Ee=We,Ne=[],Ve=Object(f.a)(Ee.vertices);try{for(Ve.s();!(Le=Ve.n()).done;){var Je=Le.value,Ge=new Me.Vector2(Je.x*T.lx,Je.y*T.ly).rotateAround(Dt,Re);Ge.add(Se),Ne.push(Ge)}}catch(lt){Ve.e(lt)}finally{Ve.f()}se.current.set(Ee.id,Ne)}}}catch(lt){De.e(lt)}finally{De.f()}}var Xe=at(T.id);if(Xe.length>0){var Be,Ke=new Me.Euler(0,0,T.rotation[2]),qe=Object(f.a)(Xe);try{for(qe.s();!(Be=qe.n()).done;){var Qe=Be.value;if(Qe.type===V.Window){var Ze=new Me.Vector3(Qe.cx,Qe.cy).applyEuler(Ke);Ze.add(je),ce.current.set(Qe.id,Ze)}else{var _e=new Me.Vector3(Qe.cx*T.lx,Qe.cy*T.ly).applyEuler(Ke);_e.add(je),ce.current.set(Qe.id,_e)}}}catch(lt){qe.e(lt)}finally{qe.f()}}}}}}}},onPointerMove:function(t){var l;if(E.current&&E.current.type&&!E.current.locked)switch(Ue(t),E.current.type){case V.Foundation:L.current&&(l=Te.intersectObjects([L.current])).length>0&&(T?ft(l[0].point):P?dt(l[0].point):S&&ut(l[0].point));break;case V.Cuboid:if(L.current&&ze===Z.Horizontal&&(l=Te.intersectObjects([L.current])).length>0){var o=l[0].point.clone(),i=rt(t,E.current.id);if(T)if(ge.current.size>1)ft(o);else if(i){if(0===(l=Te.intersectObjects([i.eventObject])).length)return;o.copy(l[0].point).add(ve.current);var r=i.eventObject.name.split(" ")[1];e((function(e){var t=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)})),l=e.selectedElement;if(t&&l){var a=Tw.getWorldDataById(r),i=a.pos,n=a.rot,c=(new Me.Vector3).subVectors(o,i);if(c.applyEuler(new Me.Euler(0,0,-n)),t.cx=c.x,t.cy=c.y,l.parentId!==r){t.parentId!==r&&it(e,t.id);var s=Tw.getWorldDataById(l.id).rot;t.rotation[2]=s-n,t.parentId=r}else t.parentId!==r&&(t.parentId!==l.parentId&&it(e,t.id),t.parentId=l.parentId,t.rotation[2]=l.rotation[2])}}))}else e((function(e){var t=e.elements.find((function(e){return e.id===E.current.id}));if(t&&t.parentId!==xt){t.parentId!==xt&&it(e,t.id);var l=Tw.getWorldDataById(t.parentId).rot;t.rotation[2]+=l,t.parentId=xt}})),ft(o);else if(P){var s=c(E.current.id);s&&s.parentId===xt&&dt(o)}}}if(Y.current){if(A!==V.None){Ue(t);var d=Te.intersectObjects([Y.current]);if(d.length>0){var u=d[0].point;switch(A){case V.Foundation:var f=n(D,u);f&&(e((function(e){e.addedFoundationId=f.id,e.objectTypeToAdd=V.None})),E.current=f,ue.current=!0);break;case V.Cuboid:var h=n(D,u);h&&(e((function(e){e.addedCuboidId=h.id,e.objectTypeToAdd=V.None})),E.current=h,he.current=!0)}}}if(E.current&&(ue.current||he.current)){Ue(t);var p=Te.intersectObjects([Y.current]);if(0===p.length)return;var y=p[0].point;if(E.current.type===V.Foundation)a(E.current.id,y.x,y.y);else if(E.current.type===V.Cuboid){var g=rt(t,E.current.id);if(g){if(0===(p=Te.intersectObjects([g.eventObject])).length)return;y.copy(p[0].point);var m=g.eventObject.name.split(" ")[1];e((function(e){var t=e.elements.find((function(e){var t;return e.id===(null===(t=E.current)||void 0===t?void 0:t.id)}));if(t){var l=Tw.getWorldDataById(m),a=l.pos,o=l.rot,i=(new Me.Vector3).subVectors(y,a);i.applyEuler(new Me.Euler(0,0,-o)),t.cx=i.x,t.cy=i.y,t.parentId=m,t.rotation[2]=-o}}))}else e((function(e){var t=e.elements.find((function(e){var t;return e.id===(null===(t=E.current)||void 0===t?void 0:t.id)}));if(t&&t.parentId!==xt){var l=Tw.getWorldDataById(t.parentId).rot;t.rotation[2]+=l,t.parentId=xt}})),a(E.current.id,y.x,y.y)}}}},children:I&&!R?Object(gf.jsx)("meshBasicMaterial",{color:z}):Object(gf.jsx)("meshStandardMaterial",{depthTest:!1,color:R?"white":z,map:R?Tw.WATER_TEXTURE:Tw.WHITE_TEXTURE,needsUpdate:!0})})]})},Cv=n.a.memo(Iv),Ov=function(e){var t,l,a,i=e.date,n=e.hourAngle,c=e.declinationAngle,s=e.worldLatitude,h=Ew(Kr),p=Ew(o.showSunAngles),y=null===(t=Ew(o.showAzimuthAngle))||void 0===t||t,g=null===(l=Ew(o.showElevationAngle))||void 0===l||l,m=null===(a=Ew(o.showZenithAngle))||void 0===a||a,w=Object(r.useState)(Tw.toRadians(42)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(Wy.a)(Iy),T=Math.max(2,.2*h),P=Math.max(.4,.025*h),S=Object(Se.e)(Me.FontLoader,ty),j=.05*h,H={font:S,height:0,size:j},z=new Array(13).fill(0);Object(r.useEffect)((function(){b(Tw.toRadians(s))}),[s]);var R=Object(r.useMemo)((function(){for(var e=new Me.BufferGeometry,t=new Me.BufferGeometry,l=[],a=[],o=bt/72,i=0,r=0;rAt&&(c=.05*h+(i%3===0?.2:0),(s=new Me.Vector3(h,n,0)).z=.002,a.push(Tw.sphericalToCartesianZ(s)),(s=new Me.Vector3(h+c,n,0)).z=.002,a.push(Tw.sphericalToCartesianZ(s))),i++}for(var d=3*l.length,u=new Float32Array(d),f=new Float32Array(d),p=new Float32Array(d),y=0;y-.01&&e.push(n)}return e}),[v,h,c]),C=function(e){for(var t=Ay(e),l=[],a=Ty(e,Tw.toDegrees(v)),o=Sy(a.sunrise),i=Sy(a.sunset),r=(i-o)/48,n=o;n-.01&&l.push(c)}return l},O=Object(r.useMemo)((function(){for(var e=[],t=0;t<=6;t++){var l=new Date(2021,0===t?11:t-1,22);e.push(C(l))}return e}),[v,h]),F=Object(r.useMemo)((function(){return Hy(h,n,c,v)}),[v,c,n,h]),k=Object(r.useMemo)((function(){return F.clone().normalize()}),[F]),Y=Object(r.useMemo)((function(){return new Me.Vector3(F.x,F.y,0).normalize()}),[F]),L=Object(r.useMemo)((function(){return Math.asin(F.z/F.length())}),[F]),E=Object(r.useMemo)((function(){var e,t=new Me.EllipseCurve(0,0,T,T,0,L,!1,0).getPoints(25),l=new Array,a=Object(f.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new Me.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[L,F]),U=Object(r.useMemo)((function(){return Math.acos(F.z/F.length())}),[F]),N=Object(r.useMemo)((function(){var e,t=new Me.EllipseCurve(0,0,.8*T,.8*T,L,vt,!1,0).getPoints(25),l=new Array,a=Object(f.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new Me.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[U,F]),V=Object(r.useMemo)((function(){var e=Math.acos(F.y/Math.hypot(F.x,F.y));return F.x>0?-e:e}),[F]),J=Object(r.useMemo)((function(){var e,t=new Me.EllipseCurve(0,0,1.2*T,1.2*T,vt,vt+V,F.x>0,0).getPoints(50),l=new Array,a=Object(f.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new Me.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[V,F]),G=Object(r.useMemo)((function(){for(var e=2*vy/12,t=bt/48,l=new Me.BufferGeometry,a=0,o=[],i=[],r=-vy;rMath.PI&&(c=Math.PI),s>vy&&(s=vy);var d=Hy(h,n,r,v),u=Hy(h,c,r,v),f=Hy(h,c,s,v),p=Hy(h,n,s,v);(d.z>=0||u.z>=0||f.z>=0||p.z>=0)&&(o.push(d,u,f,p),i.push(a),i.push(a+1),i.push(a+2),i.push(a),i.push(a+2),i.push(a+3),a+=4)}return l.setFromPoints(o),l.setIndex(new Me.BufferAttribute(new Uint16Array(i),1)),l}),[v,h]),X=.05*h,B=2+5*X;return Object(gf.jsxs)("group",{children:[z.map((function(e,t){var l=Math.ceil(t/2)*(t%2===0?1:-1);-6===l&&(l=6);var a=function(e){return 0===e?.3*-j:e>0&&e<7?.8*-j:1.2*-j}(Math.abs(l));return Object(gf.jsx)("group",{rotation:[vt,l*Math.PI/6,0],children:Object(gf.jsxs)("mesh",{position:[a,0,1.1*-h],rotation:[-vt,0,0],children:[Object(gf.jsx)("textGeometry",{args:["".concat(-30*l,"\xb0"),H]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]})},t)})),Object(gf.jsxs)("mesh",{rotation:new Me.Euler(0,0,0),name:"Heliodon",children:[Object(gf.jsxs)("mesh",{children:[Object(gf.jsx)("bufferGeometry",Object(d.a)({},M)),Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,vertexColors:!0,polygonOffset:!0,polygonOffsetFactor:-.7,polygonOffsetUnits:-2})]}),Object(gf.jsxs)("lineSegments",{children:[Object(gf.jsx)("bufferGeometry",Object(d.a)({},W)),Object(gf.jsx)("meshBasicMaterial",{color:0})]}),Object(gf.jsxs)("mesh",{children:[I.length>3&&Object(gf.jsx)(Jl.a,{lineWidth:2,points:I,color:"yellow"}),O.filter((function(e){return e.length>3})).map((function(e,t){return Object(gf.jsx)(Jl.a,{opacity:0===t||6===t?1:.5,lineWidth:0===t||6===t?1:.5,points:e,color:"#999"},t)})),Object(gf.jsx)("mesh",{args:[G],children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,color:[1,1,0],transparent:!0,opacity:.5,depthWrite:!1,clippingPlanes:[new Me.Plane(Ht,0)]})}),Object(gf.jsx)("mesh",{position:F,children:Object(gf.jsx)("sprite",{scale:[B,B,B],children:Object(gf.jsx)("spriteMaterial",{map:A,transparent:!1,color:16777215,blending:Me.AdditiveBlending,depthWrite:!1})})}),Object(gf.jsxs)("mesh",{position:F,children:[Object(gf.jsx)("sphereGeometry",{args:[X,10,10]}),Object(gf.jsx)("meshBasicMaterial",{color:"white"})]})]})]}),Object(gf.jsx)(Lt.f,{args:[1e4,1e4],renderOrder:-1,userData:{unintersectable:!0},children:Object(gf.jsx)("meshBasicMaterial",{transparent:!0,opacity:0})}),p&&F.z>0&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[F.x,F.y,F.z]],name:"Line from origin to sun",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[F.x,F.y,0]],name:"Line from origin to sun projection on ground",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[F.x,F.y,0],[F.x,F.y,F.z]],name:"Line from sun projection on ground to sun",lineWidth:.5,color:"white"}),g&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:E,position:[0,0,0],rotation:new Me.Euler(vt,0,vt+V,"ZXY"),color:"white",name:"Elevation Angle Arc"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Elevation Angle",backgroundColor:"indigo",text:Tw.toDegrees(L).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:k.clone().multiplyScalar(T).add(Y.clone().multiplyScalar(T)).multiplyScalar(.65)})]}),m&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:N,position:[0,0,0],rotation:new Me.Euler(vt,0,vt+V,"ZXY"),color:"white",name:"Zenith Angle Arc"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Zenith Angle",backgroundColor:"navy",text:Tw.toDegrees(U).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:k.clone().multiplyScalar(T).add(Rt.clone().multiplyScalar(T)).multiplyScalar(.57)})]}),y&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:J,position:[0,0,0],color:"white",name:"Azimuth Angle Arc"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Azimuth Angle",backgroundColor:"firebrick",text:Tw.toDegrees(Math.abs(V-Math.PI)<1e-6?V:-V).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:Y.clone().multiplyScalar(T).add(Ht.clone().multiplyScalar(T)).multiplyScalar(1.1).add(new Me.Vector3(0,0,P/2))})]})]})]})},Fv=n.a.memo(Ov),kv=function(){var e=Ew(o.heliodon),t=Ew(Kr),l=Ew(i.latitude),a=Ew(i.date),n=Ew(Us),c=Object(r.useMemo)((function(){return new Date(a)}),[a]),s=Object(r.useMemo)((function(){return[Py(c),Ay(c)]}),[c]),d=Object(u.a)(s,2),f=d[0],h=d[1];return Object(r.useEffect)((function(){n(Hy(t,f,h,Tw.toRadians(l)))}),[l,f,h,t]),Object(gf.jsx)(gf.Fragment,{children:e&&Object(gf.jsx)(Fv,{date:new Date(a),hourAngle:f,declinationAngle:h,worldLatitude:l})})},Yv=n.a.memo(kv),Lv=l.p+"static/media/ifi-logo.eb360016.png",Ev=l(536),Uv=l.n(Ev),Nv=l(537),Vv=l.n(Nv),Jv=l(538),Gv=l.n(Jv),Xv=l(539),Bv=l.n(Xv),Kv=l(540),qv=l.n(Kv),Qv=l(183),Zv=l(836),_v=l(214),$v=l(835),eb=l(844),tb=l(296),lb=l(297),ab=l.p+"static/media/magic-lamp.b58f942d.png",ob=(l(217),function(e){var t=e.top,l=e.height,a=e.color,o=Ew(Vi),i=Object(r.useMemo)((function(){return{lng:o}}),[o]),n=t+56+"px",c=t+100+"px",s=t+205+"px";return Object(gf.jsxs)("div",{children:[Object(gf.jsxs)("div",{style:{position:"absolute",borderRadius:"20px",border:"thin",textAlign:"center",left:"15%",right:"15%",top:t+"px",height:(null!==l&&void 0!==l?l:300)+"px"},children:[Object(gf.jsx)("h2",{style:{marginTop:"20px",color:a},children:me.t("aboutUs.ProductBroughtToYouBy",i)}),Object(gf.jsxs)("p",{style:{fontSize:"12px",color:a},children:[Object(gf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-terms.html",style:{color:a},children:me.t("aboutUs.TermsOfService",i)}),"\xa0\xa0\xa0|\xa0\xa0\xa0",Object(gf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-privacy.html",style:{color:a},children:me.t("aboutUs.PrivacyPolicy",i)})]})]}),Object(gf.jsxs)("div",{children:[Object(gf.jsx)("hr",{style:{position:"absolute",left:"10%",width:"80%",marginTop:n,color:a}}),Object(gf.jsx)("table",{style:{position:"absolute",border:"none",top:c,left:"10%",width:"80%",fontSize:"small",color:a},children:Object(gf.jsx)("tbody",{children:Object(gf.jsxs)("tr",{style:{verticalAlign:"top"},children:[Object(gf.jsxs)("td",{children:[Object(gf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Software",i)}),"Charles Xie",Object(gf.jsx)("br",{}),"Xiaotong Ding",Object(gf.jsx)("br",{})]}),Object(gf.jsxs)("td",{children:[Object(gf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Content",i)}),"Rundong Jiang",Object(gf.jsx)("br",{}),"Charles Xie",Object(gf.jsx)("br",{})]}),Object(gf.jsxs)("td",{children:[Object(gf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Support",i)}),"Rundong Jiang",Object(gf.jsx)("br",{}),"Charles Xie",Object(gf.jsx)("br",{})]})]})})})]}),Object(gf.jsxs)("div",{style:{position:"absolute",left:"10%",marginRight:"10%",top:s,fontSize:"smaller",textAlign:"justify",color:a},children:[me.t("aboutUs.Translators",i),": ",N.Ukrainian," (Andriy Kashyrskyy), ",N.Spanish," (Alex Barco), ",N.Turkish," (Hasan Bircan)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("aboutUs.Acknowledgment",i),": ",me.t("aboutUs.FundingInformation",i)," ",me.t("aboutUs.Contact",i)]})]})}),ib=n.a.memo(ob),rb=mv.a.div(ev||(ev=Object(gv.a)(["\n position: absolute;\n top: 80px;\n left: 10px;\n display: flex;\n width: 600px;\n height: 400px;\n flex-direction: column;\n align-items: center;\n z-index: 1001;\n border-radius: 10px;\n background: dimgray;\n box-shadow: 3px 3px 3px 3px black;\n"]))),nb=function(e){var t=e.close,l=Ew(Vi);return Object(gf.jsxs)(rb,{children:[Object(gf.jsx)(ib,{top:10,color:"antiquewhite"}),Object(gf.jsx)("div",{style:{position:"absolute",fontSize:"small",color:"antiquewhite",cursor:"pointer",bottom:"10px"},onMouseDown:function(){t()},children:me.t("word.Close",{lng:l})})]})},cb=n.a.memo(nb),sb=l(232),db=l(231),ub=function(e){var t=e.name,l=Ew(si),a=Ew(Vi),o=Ew(i.cspTimesPerHour),r=Ew(i.cspDaysPerYear),n=Ew(i.cspGridCellSize),c={lng:a},s=Qv.a.SubMenu,d=db.a.Option;return Object(gf.jsx)(s,{title:me.t("menu.AnalysisOptions",c),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",c)+":"}),Object(gf.jsxs)(db.a,{style:{width:"72px"},value:null!==o&&void 0!==o?o:4,onChange:function(e){l((function(t){t.world.cspTimesPerHour=e}))},children:[Object(gf.jsx)(d,{value:1,children:"1"},1),Object(gf.jsx)(d,{value:2,children:"2"},2),Object(gf.jsx)(d,{value:3,children:"3"},3),Object(gf.jsx)(d,{value:4,children:"4"},4),Object(gf.jsx)(d,{value:6,children:"6"},6),Object(gf.jsx)(d,{value:12,children:"12"},12),Object(gf.jsx)(d,{value:30,children:"30"},30)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",c)})]},t+"-simulation-sampling-frequency"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsxs)(db.a,{style:{marginLeft:"150px",width:"72px"},value:null!==r&&void 0!==r?r:6,onChange:function(e){l((function(t){t.world.cspDaysPerYear=e})),Pf.setState((function(e){e.yearlyParabolicTroughYield=[],e.yearlyParabolicDishYield=[],e.yearlyFresnelReflectorYield=[],e.yearlyHeliostatYield=[]}))},children:[Object(gf.jsx)(d,{value:4,children:"4"},4),Object(gf.jsx)(d,{value:6,children:"6"},6),Object(gf.jsx)(d,{value:12,children:"12"},12)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",c)})]},t+"-simulation-sampling-days"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.GridCellSize",c)+":"}),Object(gf.jsx)($v.a,{min:.1,max:20,step:.05,style:{width:72},precision:2,value:null!==n&&void 0!==n?n:.5,onChange:function(e){l((function(t){t.world.cspGridCellSize=e}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",c)})]},t+"-simulation-grid-cell-size")]})},t+"-analysis-options")},fb=function(){var e=Ew(si),t=Ew.getState().elements,l=Ew(Vi),a=Ew(i.timesPerHour),o=Ew(i.daysPerYear),r=Ew(i.pvGridCellSize),n=Ew(i.discretization),c=Ew(i.noAnimationForSolarPanelSimulation),s={lng:l},d=Qv.a.SubMenu,u=db.a.Option;return Object(gf.jsx)(d,{title:me.t("menu.solarPanel.EnergyAnalysisOptions",s),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",s)+":"}),Object(gf.jsxs)(db.a,{style:{width:"72px"},value:null!==a&&void 0!==a?a:4,onChange:function(t){e((function(e){e.world.timesPerHour=t}))},children:[Object(gf.jsx)(u,{value:1,children:"1"},1),Object(gf.jsx)(u,{value:2,children:"2"},2),Object(gf.jsx)(u,{value:3,children:"3"},3),Object(gf.jsx)(u,{value:4,children:"4"},4),Object(gf.jsx)(u,{value:6,children:"6"},6),Object(gf.jsx)(u,{value:12,children:"12"},12),Object(gf.jsx)(u,{value:30,children:"30"},30)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",s)})]},"solar-panel-simulation-sampling-frequency"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsxs)(db.a,{style:{marginLeft:"150px",width:"72px"},value:null!==o&&void 0!==o?o:6,onChange:function(t){e((function(e){e.world.daysPerYear=t})),Pf.setState((function(e){e.yearlyPvYield=[]}))},children:[Object(gf.jsx)(u,{value:4,children:"4"},4),Object(gf.jsx)(u,{value:6,children:"6"},6),Object(gf.jsx)(u,{value:12,children:"12"},12)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",s)})]},"solar-panel-simulation-sampling-days"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.solarPanel.PanelDiscretization",s)+":"}),Object(gf.jsxs)(db.a,{style:{width:"165px"},value:null!==n&&void 0!==n?n:ae.APPROXIMATE,onChange:function(t){e((function(e){e.world.discretization=t}))},children:[Object(gf.jsx)(u,{value:ae.EXACT,children:me.t("menu.solarPanel.Exact",s)},ae.EXACT),Object(gf.jsx)(u,{value:ae.APPROXIMATE,children:me.t("menu.solarPanel.Approximate",s)},ae.APPROXIMATE)]})]},"solar-panel-discretization"),(!n||n===ae.APPROXIMATE)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.solarPanel.EnergyGridCellSize",s)+":"}),Object(gf.jsx)($v.a,{min:.1,max:5,step:.05,style:{width:72},precision:2,value:null!==r&&void 0!==r?r:.5,onChange:function(t){e((function(e){e.world.pvGridCellSize=t}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",s)})]},"solar-panel-simulation-grid-cell-size"),!Tw.hasMovingParts(t)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.solarPanel.SolarPanelSimulationNoAnimation",s)+":"}),Object(gf.jsx)(eb.a,{checked:c,onChange:function(t){e((function(e){e.world.noAnimationForSolarPanelSimulation=t}))}})]},"solar-panel-simulation-no-animation")]})},"solar-panel-energy-analysis-options")},hb=function(){var e=Ew(si),t=Ew.getState().elements,l=Ew(Vi),a=Ew(i.sutTimesPerHour),o=Ew(i.sutDaysPerYear),r=Ew(i.sutGridCellSize),n=Ew(i.noAnimationForSolarUpdraftTowerSimulation),c={lng:l},s=Qv.a.SubMenu,d=db.a.Option;return Object(gf.jsx)(s,{title:me.t("menu.AnalysisOptions",c),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",c)+":"}),Object(gf.jsxs)(db.a,{style:{width:"72px"},value:null!==a&&void 0!==a?a:4,onChange:function(t){e((function(e){e.world.sutTimesPerHour=t}))},children:[Object(gf.jsx)(d,{value:1,children:"1"},1),Object(gf.jsx)(d,{value:2,children:"2"},2),Object(gf.jsx)(d,{value:3,children:"3"},3),Object(gf.jsx)(d,{value:4,children:"4"},4),Object(gf.jsx)(d,{value:6,children:"6"},6),Object(gf.jsx)(d,{value:12,children:"12"},12),Object(gf.jsx)(d,{value:30,children:"30"},30)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",c)})]},"sut-simulation-sampling-frequency"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsxs)(db.a,{style:{marginLeft:"150px",width:"72px"},value:null!==o&&void 0!==o?o:6,onChange:function(t){e((function(e){e.world.sutDaysPerYear=t})),Pf.setState((function(e){e.yearlyUpdraftTowerYield=[]}))},children:[Object(gf.jsx)(d,{value:4,children:"4"},4),Object(gf.jsx)(d,{value:6,children:"6"},6),Object(gf.jsx)(d,{value:12,children:"12"},12)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",c)})]},"sut-simulation-sampling-days"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.GridCellSize",c)+":"}),Object(gf.jsx)($v.a,{min:.1,max:20,step:.1,style:{width:72},precision:1,value:null!==r&&void 0!==r?r:1,onChange:function(t){e((function(e){e.world.sutGridCellSize=t}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",c)})]},"sut-simulation-grid-cell-size"),!Tw.hasMovingParts(t)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"320px"},children:me.t("menu.solarUpdraftTower.SolarUpdraftTowerSimulationNoAnimation",c)+":"}),Object(gf.jsx)(eb.a,{checked:n,onChange:function(t){e((function(e){e.world.noAnimationForSolarUpdraftTowerSimulation=t}))}})]},"solar-updraft-tower-simulation-no-animation")]})},"sut-analysis-options")},pb=function(){var e=Ew(si),t=Ew(Vi),l=Ew(i.timesPerHour),a=Ew(i.daysPerYear),o=Ew(i.solarRadiationHeatmapGridCellSize),r={lng:t},n=Qv.a.SubMenu,c=db.a.Option;return Object(gf.jsx)(n,{title:me.t("menu.building.EnergyAnalysisOptions",r),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",r)+":"}),Object(gf.jsxs)(db.a,{style:{width:"72px"},value:null!==l&&void 0!==l?l:4,onChange:function(t){e((function(e){e.world.timesPerHour=t}))},children:[Object(gf.jsx)(c,{value:1,children:"1"},1),Object(gf.jsx)(c,{value:2,children:"2"},2),Object(gf.jsx)(c,{value:3,children:"3"},3),Object(gf.jsx)(c,{value:4,children:"4"},4),Object(gf.jsx)(c,{value:6,children:"6"},6),Object(gf.jsx)(c,{value:12,children:"12"},12),Object(gf.jsx)(c,{value:30,children:"30"},30)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",r)})]},"building-energy-simulation-sampling-frequency"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsxs)(db.a,{style:{marginLeft:"150px",width:"72px"},value:null!==a&&void 0!==a?a:6,onChange:function(t){e((function(e){e.world.daysPerYear=t}))},children:[Object(gf.jsx)(c,{value:4,children:"4"},4),Object(gf.jsx)(c,{value:6,children:"6"},6),Object(gf.jsx)(c,{value:12,children:"12"},12)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",r)})]},"building-energy-simulation-sampling-days"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.building.EnergyGridCellSize",r)+":"}),Object(gf.jsx)($v.a,{min:.1,max:5,step:.05,style:{width:72},precision:2,value:null!==o&&void 0!==o?o:.5,onChange:function(t){e((function(e){e.world.solarRadiationHeatmapGridCellSize=t}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",r)})]},"building-energy-simulation-grid-cell-size")]})},"building-energy-analysis-options")},yb=l(421),gb=l(422),mb=l(423),wb=l(424),xb=l(425),vb=l(426),bb=l(427),Ab=l(428),Tb=l(429),Pb=l(430),Sb=l(431),jb=l(432),Hb=l(433),zb=l(434),Rb=l(435),Db=l(436),Mb=l(437),Wb=l(438),Ib=l(439),Cb=l(440),Ob=l(441),Fb=l(442),kb=l(443),Yb=l(444),Lb=l(445),Eb=l(446),Ub=l(447),Nb=l(448),Vb=l(449),Jb=l(450),Gb=l(451),Xb=l(452),Bb=l(453),Kb=l(454),qb=l(455),Qb=l(456),Zb=l(457),_b=l(458),$b=l(459),eA=l(460),tA=l(461),lA=l(462),aA=l(463),oA=l(464),iA=l(465),rA=l(466),nA=l(467),cA=l(468),sA=l(469),dA=l(470),uA=l(471),fA=l(472),hA=l(473),pA=l(474),yA=l(475),gA=l(476),mA=l(477),wA=l(478),xA=l(479),vA=l(480),bA=l(481),AA=l(482),TA=l(483),PA=l(484),SA=l(485),jA=l(486),HA=l(487),zA=l(488),RA=l(489),DA=l(490),MA=l(491),WA=l(492),IA=l(493),CA=l(494),OA=l(495),FA=l(496),kA=l(497),YA=l(498),LA=l(499),EA=l(500),UA=l(501),NA=l(502),VA=l(503),JA=l(504),GA=l(505),XA=l(506),BA=l(507),KA=l(508),qA=l(509),QA=l(510),ZA=l(511),_A=l(512),$A=l(513),eT=l(514),tT=l(515),lT=l(516),aT=l(517),oT=l(518),iT=l(519),rT=l(520),nT=l(521),cT=l(522),sT=l(523),dT=l(524),uT=l(525),fT=l(526),hT=l(527),pT=l(528),yT=l(529),gT=l(530),mT=l(531),wT=l(532),xT=l(533);!function(e){e[e.NO_BUILDING=3]="NO_BUILDING",e[e.AT_LEAST_ONE_BAD_NO_GOOD=2]="AT_LEAST_ONE_BAD_NO_GOOD",e[e.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD=1]="AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD",e[e.OK=0]="OK"}(tv||(tv={}));var vT,bT,AT,TT=function(e,t,l){if(0===t(V.Foundation))return{status:tv.NO_BUILDING};var a,o=!1,i=!1,r=void 0,n=Object(f.a)(e);try{for(n.s();!(a=n.n()).done;){var c=a.value;if(c.type===V.Foundation){var s=c;if(s.notBuilding)continue;if(l(V.Wall,s.id).length>0){var d=Tw.getBuildingCompletionStatus(s,e);d===D.COMPLETE?o=!0:(i=!0,r=d)}else i=!0}}}catch(u){n.e(u)}finally{n.f()}return i&&!o?{status:tv.AT_LEAST_ONE_BAD_NO_GOOD,buildingCompletion:r}:i&&o?{status:tv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD}:{status:tv.OK}},PT=function(e){if(!e.color)return.5;var t=e.color.toLowerCase();if("white"===t)return.05;if("black"===t)return.95;var l=parseInt(e.color.substring(1),16),a=l>>16&255,o=l>>8&255,i=255&l,r=Math.min(a,o);r=Math.min(r,i);var n=Math.max(a,o);return n=Math.max(n,i),Math.min(.95,Math.max(.05,1-(r+n)/510))},ST=function(e,t,l,a){return t<0&&e.low>=l-a||t>0&&e.high<=l+a?0:t},jT=function(e,t,l,a,o,i){if(l===U.Sinusoidal)return.5*(e+t)-.5*(e-t)*Math.cos(yy*(i-(a-720)));var r=.5*(e+t),n=.5*(e-t),c=o.daylight();if(i>o.sunrise&&io.sunset){var u=i-o.sunset;return t+(d-t)*Math.exp(-6*u/s)}var f=i+1380-o.sunset;return t+(d-t)*Math.exp(-6*f/s)},HT=function(e,t,l){var a,o,i,r=e.getFullYear(),n=e.getMonth(),c=e.getDate(),s=Tw.daysOfMonth(n,r)/2;if(c11&&(o=0),i=(c-s)/(s+Tw.daysOfMonth(o,r)/2)}return{low:t[a]+(t[o]-t[a])*i,high:l[a]+(l[o]-l[a])*i}},zT=function(e,t,l,a,o,i,r,n,c){return function(e,t,l,a,o,i){for(var r=l.length,n=0,c=-1e3,s=1e3,d=-1e3,u=1e3,f=0;fa[f]&&(s=a[f]),u>l[f]&&(u=l[f]);n/=2*r;var h=.25*(c-s+d-u),p=i*Math.sqrt(gy/(2*o));return e>0?n-h*Math.exp(-p)*Math.cos(gy*(t-30)-p):n-h*Math.exp(-p)*Math.cos(Math.PI+gy*(t-30)-p)}(e,t,a,o,n,c)-Math.exp(-c*Math.sqrt(yy/(2*n)))*r*Math.cos(yy*(l-(i-720)-120))},RT="data:image/png;base64,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",DT="data:image/png;base64,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",MT="data:image/png;base64,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",WT="data:image/png;base64,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",IT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMGFRYh70JghAAAA3pJREFUWIXtlz2MVFUUx39ndnf2g4fDwAIiEZBAWCRAKAADFmpiYaVSkPhKCqdQGhLCNyEWhIqK5gEhVK/hoyBWWAixMGrURGQtdo0JMRBhyLDLYyHD7hyKe9/M5e278LKJbMNJJjM5957//Z97/+fcO6KqzKaVZnX11wSA7jyniPQDqTgUaAJdQI/jn1TVSUQEkDQUUFRbRQmIK0IReQv4BFgEuCBSBRrQqtjFxqAPmLJJdDkEWsAtoA7Myfh/VtXRXAI26z3A+8A1J6gCfArcBH6xCyqwBPgM+AcYAVg2OKi36vVSZWBg09jExBOLU7Y4a4B7wGFVvZsScI9gIbAZOBPFySWXZS0MzkVxsgvYmfGfiuLka+ADMlYLg5NRnBzK+L4DhoA2gbYIqybTvuzi1rpyfADVWhjs8YzNyfH9C7wrIm28NoEGvBOUy+MesKkX+Od5xgZyfL8CW4AFzxEQke4KrE2azdGcIIAnHv8w8MAzNpF1RHFyqtJfDoDB1CeqmgrwLLAC+NGJaQEbgfnATy6RJZXK3DtjY+sxx3MTeAzcAR5ZnA9txjfoHGET+BI4oqqXoSPCfmAwipNtwDaX9e4wuNAEieLkK9dfC4NvgLXAU+C+Be+qQm8DxjGVshz4A+i1YT3A38BWEflWVZspgeU2g2nWhN9sBh+7/ihOju4PgwMN0ChOTmTjamFwHJiK4uRkdmx/GJQa8AZQT0W4DridRwB4E48GGqZXLPXE3Sa/EmgY8a6EThVsAH73APXhF1o3sNgzNo6j9oz9iWl4bQKbozg57ZlcxV8FI8BDz9h/GG1NsyhODmYJrPaApObb5rfL5izzbAhYVAuDvZ7xLdApwzpwEaNccSYpMInZ6tRfcn6nDSqvU6qDl8UE+FxVF2Ivo1En4FV9hlW13QduAJHNSOyEEqZ+3TeAYC6S+5iyTeemb4Ui1rK4x6BzBKuBHRYoZdiNuSHn8vxd8BjTdN7DiDPAXLN/OSTd76yl1/yIqp6Wmb6KReQgpu0uA66r6pWZ4OQ+yXIWWwp8hKn5ScxObQfOY3Znp4iswmRWwuzSdVUdfim4qr70A3wBXKG4wC4C+4pgF30V92DOuqgFdC6gF1qhIwB+wHS1q5jbL63tNAFXpCXMMX1fBLiwCMU8v3vJbypZxTdV1feKmhmB/8tm/Z/RawLPAA7AbYJpF785AAAAAElFTkSuQmCC",CT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAAG9IFmxgAAA+9JREFUWIXFl21oW2UUx38nuWnasdJUmfRDTcOTK2WglSH2i3WjOD9MRdiGzreB4Ms2OlbBwiZMEVSaKqMTlllZrIIyQVY/iDoQHDLB6dDCcFCUm1vNhy2Kbfoia9pkPX5YO7I0L7epsAcuuc9zzvn//885z7k8EVXlZg7fTWUHrLUCiEg7sBFYBLKq+s2q4mstgYjcZ4x5JJ/Pi9/v/2V8fPwSsAMYU9WEV5xVZ0BENgCvA4uu68Zj8fRYoT0x2IWIjKrq6JoFiMgmoAsYUdVLItItInsikcjInr5znwH7S8X5fL7DXMtG7QJEpAM4YIw577pur4icBB7vP3Z5F7CrEqgxZruIBFV1vpqASl1wlzEmnUwm3wPWAzOxeHpvJbDjA50DBdOWauRQ4RCGQqHm6enp/cCGxsbG57LZ7I+5XO4sMAG4sXj6q+KYxGDX9feJiYm2ycnJVDUBZTMwNTWVAU4DR2ZnZz/3+XzNwChwEbi92P9QT8vRwnkmk/H0jSnrJCKbReTlWDz9B3B+fn7+DRF5GvgzFk8PFZE/YNv2S0UQf9csIBQKNft8vr7+Y5efWFr61xizoKqvWJY1VOxv2/a3hfNkMnlKVa/ULKCpqelgW1vbx8vzWDw9nM/n74zF024+nz9Q6FtY9+Whqp96IYcSh1BENvmtun1vvZt6oVrw4d7W05FIZFvxuuM4AVXNexFQKgM7PJJ/XYZ8m1fyFQJEJAKEqgUlBruIRCIPlTGPeyVfIQBoBy6Ucz7U0/JoqZovD8dx7gV61iKgFfirDPkJ27a/qEC+UVV/BhZEZEutAn4AugsXjg90DiQGu7Btu+S5SKVS3y29/rP0+0E0Gn3Kq4BSXbDTtu1TXoIdx3kRGA4EAmdyudyzqjq+hPE28KWqnq2GsaILVHXEcZxWx3H6KxC/6ThOg6qeUNWrItIAFO7kQ+AZL5tAVSs+wLrlx9yztQn4BAgW2K26urqfgEhR3DvAlqr41RyKQPuMMfuK1soJaAeGqmF6vhW3dXQ0BwKBB13X/chjZn8DZqt1hGcBqV8v9uZyuXOqOuc1BhgGnlyzABG5VYLrOtn62OAqyFHVMWPMoohsruTkpfavhcPhg2VsJc9Agf3uaDT6fjnsqtdyEWmpr2/oTqVSO1ez+4INXhCRGRG5X1W/L7Z7KcHz2excQlUnyxDkgavATAWMI8D2UoYbMiAiPuBhrvU9QKB+fWh3w223HBWRkldxY4zfsqw7FhYWdotIuoyAXDAY7BaRV4HfC9bP3PApFhE/sNcY0wjguq4Ac4BljClbLtd1r4TD4QbLsqSCzzxQb4y5TpjJZE7W/N/w/xr/AaOLRG68/t4OAAAAAElFTkSuQmCC",OT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAITq2rgrwAABI5JREFUWIXFl21MU1cYx/+nSCiUVrhQKND2IiGuCfISmzgWhkAhEx04MqUIjBCXbczsA8v4QIjomA41bgRZt+w1cQpIvC5ghsZBwBFmEJ0yFzNfsuHKW6FAoYRutkB79mGylGKhBSZPcj+c+/zP8/vnPOfck0sopVjP4K0rHcCGtSxGCOGl794dq4jcnLpRtFHlxQ8KLit9S7nknNW2oKioSDEzR1V+fn4qgZhRCUX7/e3ztzs6fTgu+7Gz+W6vgLe3tywzMzPVV7RRJRAIVBGxR8KW0mcV+iQAaFuxAbVaLfb05CebzeZUX19BakWVNtIdw16W2dylDCxqASFEGBUTkyRmAlVCkVCVsOPLWHeAT4u05wdDU9JSXpo2Tt+klN53aiAhMemgr0DwAcMwHnEvVq2WCwDYxHSgurpKp9Pr6ZRxqsJoNH5jn1/QgrCQ4G3KZI3HWoBjwntQX3sGLcPDyMnZF/rzjRs/NDU3jzvqHPYAj1kLuPbOIVw69xvSVKmITqyBBUBMUn76LKXXAFxcQLQfePsInB4XV2Lyz4/QXJcFgY8PMvIawZe8syCvTNZ8WF5Rke7UAN/bS7sSsG3ia1w69yomDBPIfO0ixJvLnGqFQQeulB+uOEII8QIcWmCjpAvAm66Cfa0cmpoaESQWIyOvESnbBvHjzeXnCSUHDhW/Z4oBkLXgFKjVakaZrDEsVyBM2IrzDQ0AgH25eXguagvau0Nc9Y2+e8e4zz/75A1K6fSi70B1zadfzXhmP3UVFKHdON9Qj9GxMezZsxfxCYlo7Qp2Gax/VDU7Pjpacvbst5r5d4sMqC9ckCjHtg87Tu69XYb7Dx5i186d4DEud+m/GHhwfGB0RLeX47gFTVp0HXPZ2SMSYfvr8+Ox34+juS4LAUwAMvIbkZa+y234H7+8f2V0RBfnCAeWuA3z89W3+rSDyuioLQiPO4q0F0bQdl3iFrjvXqXNaJw43FBff4w6ATk1IJfLr+Xn5Hio8wvi3ekzAEwOaGAwGPRTRkMex3FXl9I6vQ2tNut4a0vL0fjElGIguMBVuP5RFcZGxzvrak/nUkp1y+l5AMCybBohROiY7Ll715r1ysuFEeLO8uUKjWtPYejhCWi12pN1tadTXYED8ytAcEYml80QQvZTSjvsBU96V6lWq2eUyZqTjgUM/TWwWCyYMEwaLWZTYeN33PeugOeDBwD9ff1xVqv1VzacvSoJkZwihHjPCwghW6UyaVvX9a4dJ0ojt+t7P64G/u2zvrcKf5lMGB429VjMpq0c5x4ccNiEIpGoQCwWa2bnZkcopZM2apv04HmE6oZ0pXNzcy3zuqKioujH5tlKPt8rUzc09MXly83vUkot7sIBAJTSBQ+AsDBpWAsbztqkUmk7AL6jxk4rdZZz9XFWmPj7+7/NhrMmmVx2B0DsakFuGbAzsikiIuInlmUtgYGBBwF4PFMDT0zw/AP8S+Ss3CyVSbsBKJ6pATsjCoVCcYsNZ/9mGKZ4rQy49WdECNkQGBRYJvIVlQBge3t7p1a08+1rumPg/4h1/zv+B255SgboD8yRAAAAAElFTkSuQmCC",FT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAEbjpw7XgAAAlxJREFUWIXl18+LVWUcx/HX1wxdRVHhbWEgDEKSVtKAuGhhm8BFgX/A2ErkLmbR2FyGsIakjht3N8EgNFu1kAwECUpchD8KFJyhggxiRC5UFCFBi/q6uPcOp+HMnTv3XseoLzxwznOeh8/7+Xy/z3POicx0P2PdfVX/XwBExFhEfBQRp6uer7+XwnijaLYmSn3NzLx8TwGqhEtxPCJ2ZqnyY1S7ICJ2Ybpotl7pNa5Rr01k5ofd+6EdiIgnMVM0Wwf6nFJExJnMvMMQDgwgvBiNeu3dzJxhAAci4gltqydXO7cUz3Qv+gYYhXCjXvsJr2bmub4BRrRijXrtS3xRFqdHDUTEY5gqmq3pIYUP4zucxHxmjq8IEBGBH4tma/MQwu/hbbyIWZzH0cxcKI+rTEFmZkS8g+MDCH+CBh7Hp7iFlzLz+6rxvVLwAG4UzdZTfQpfwRRu4yi24LXMvNhr3rJFmJl/RcQl9ARo1Gs3tVf8OWawT9vy05n590rgK70NFxr12qVlhH9p1GuT2IFNuIY7eDozT/Uj3g8AfFwhXmAMN/EVnsfuzJzNzD/6EV6MzNSpg4e716W+t7Afh4pmK3EKm7Edn+ECnls6bzWtLPYzPsBDFQDr8Ii21SfwDV4eRrjbyinYjW2Yi4g9S4zagIO4innsyMyzq7J6mfjHNuxsvdfxJt7H73hU+zA5h9nM/HUUwotRmZd2jq/jN3yNraOwu2cNVEA8iCP4U/tg2bCmACWQcXyLOTy75gAdiI041nHjMNavKUAJ5AX8gL2jAhjZV/Gg8d//NfvXA9wFb2zsOT1cv34AAAAASUVORK5CYII=",kT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAMxZxGQCgAABAFJREFUWIXVl11sU2Ucxp//e/bRdnaZ2dZslq7lrTdIjEODgRWjF0YMciNw4RJNVOiIEqMbJCbGj4QElbBNvTFju1GjxguDCSbGaPACtkEMEcSvgOvpFtM1dGUTqqltd97HC4EU2LoOOgnP5Xn+5/973jfvxzlCEjdT6qbSb8kAfr9/bTAY7BCR2koEkHLXgIh4tNYDAFYC+EtE6owxZ0ieyOVyh5LJ5EmSZkkCBAKB+10u1yfGmB+7do5uLvaG+iODADoAkORJkodzudzhRCJxpiIBtNavKKWei/aMLCun4f7etQdEJARgluRvjuN8m8/nh5PJ5MSiAtTV1bW0tLR8CkB17Rx9sBz4HGH2KqUiAHwAUsaYYySPpNPp0Uwmk543QCgU2mRZ1rskP9y+6+ir1wOfSwP71vQppe4WkTtE5PdsNrv3igAiYoXD4fcBrI/2jAQrBZ5Lg30dr5PsvLwN/X5/u9b6FMnGpYYDAMmnjDG7qwAgFAo97/F43tjWPewDcNdSwwFARN4ZHx//rEprvc+yrPsuwpdcQ/2RPwuFwgsTExMfA/+dhBtIDv8fcAAoFAqbL8EBQNra2nR1dfVuku0i8lO0Z+SJSkMH9q3Zo5R6NpvNbpycnPyh2Lu8C3w+351er/dpEXkcQCHaM3JPheB9SqknZ2ZmVk9PT/9xtX/NOSAiNcFgcGNVVdVWAMsAHIv2jHRdD3x/79oPRGRlKpV6LJPJTM1VU/Iobm1tXeHxeLaJyMMkJ7t2jj66CPgXAALxeDxCMj9fXVmXkYjUaK23iMhWACFjzMHtu46+VAJ+HIAdj8c7F7ohy76OL6m5ubm1vr5+h1IqSvJQtGeks9gf7Os4RfJX27Y75+tRrKpyikTE29bWtt6yrEhDQ4OfpNtxHFtEVgPAUH8k5TjOQaXUQyS/s227u9wBlZwBEblNa/2miKwDMGOM+dkYc2J2dvZsTU3NMwAskh+RvN2yrIiIrCKZI/mVbdt7biiAz+cLe73ebwB8nclk+lOpVKzYX758+ZdKqYZYLPZA8XO/37/K7Xa/ZozxxePx9ST/LhVg3m9Cr9f7HskDsVhsx9VwABARm+QvInJFj0QicWJsbGwTyZlgMPhyKThQYg0YY5pJfj6fb9v2i6Uak5wUkcaFAsw7A/l8vtuyrLe01tsWalIsEanXWu+1LOuR8+fPv71gfalFGAgEVtfW1vYCcJH83hhzpFAonM5ms+eUUg4AOI5T7Xa7G10u1woAG0TkXpLHp6amui9cuHDuhgJcUjgcXkdyi4i0k/SKSDXJhov22YsjT5I8msvlDiQSidMLNl1MgGteEqlvamqqA4B0Oj1D8p9FN7mRAJXUrfdvWGn9C2kU6SwCYsgLAAAAAElFTkSuQmCC",YT="data:image/png;base64,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",LT="data:image/png;base64,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",ET=l(563),UT=l(804),NT=l(805),VT=l(32),JT=l.n(VT),GT=l(534),XT=l.n(GT),BT=db.a.Option,KT=function(e){var t,l,a,o=e.setDialogVisible,i=Ew(si),n=Ew(Gi),c=Ew(Vi),s=Object(r.useState)(Ew.getState().modelType),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(r.useState)(null!==(t=Ew.getState().modelAuthor)&&void 0!==t?t:XT()()),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(null!==(l=null!==(a=Ew.getState().modelLabel)&&void 0!==a?a:Ew.getState().cloudFile)&&void 0!==l?l:null),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(Ew.getState().modelDescription),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],D=H[1],M=Object(r.useState)({left:0,top:0,bottom:0,right:0}),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(null),F=Object(r.useRef)(null),k=ET.a.TextArea,Y={lng:c};Object(r.useEffect)((function(){var e;null===(e=F.current)||void 0===e||e.focus()}),[]);return Object(gf.jsxs)(Zv.a,{width:560,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return D(!0)},onMouseOut:function(){return D(!1)},children:me.t("menu.file.PublishOnModelsMap",Y)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){o(!1)},children:me.t("word.Cancel",Y)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:F,onClick:function(){Tf.setState((function(e){e.publishOnModelsMapFlag=!0})),i((function(e){e.modelType=f,e.modelAuthor=g,e.modelLabel=v,e.modelDescription=P})),Tf.getState().setChanged(!0),n&&i((function(e){e.actionInfo={name:"Publish on Map of Models",timestamp:(new Date).getTime()}})),o(!1)},disabled:!g||!v,children:me.t("word.OK",Y)},"OK")],onCancel:function(){o(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!z,bounds:I,onStart:function(e,t){return function(e,t){if(O.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=O.current.getBoundingClientRect();C({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:O,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:me.t("shared.ModelType",Y)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:f,onChange:function(e){h(e)},children:[Object(gf.jsxs)(BT,{value:R.UNKNOWN,children:[Object(gf.jsx)("img",{alt:"Building",width:24,src:LT,style:{marginRight:"8px"}}),me.t("word.Unknown",Y)]},R.UNKNOWN),Object(gf.jsxs)(BT,{value:R.UNDER_CONSTRUCTION,children:[Object(gf.jsx)("img",{alt:"Building",width:24,src:YT,style:{marginRight:"8px"}}),me.t("word.UnderConstruction",Y)]},R.UNDER_CONSTRUCTION),Object(gf.jsxs)(BT,{value:R.RESIDENTIAL_BUILDING,children:[Object(gf.jsx)("img",{alt:"Residential Building",width:24,src:RT,style:{marginRight:"8px"}}),me.t("word.ResidentialBuilding",Y)]},R.RESIDENTIAL_BUILDING),Object(gf.jsxs)(BT,{value:R.COMMERCIAL_BUILDING,children:[Object(gf.jsx)("img",{alt:"Commercial Building",width:24,src:DT,style:{marginRight:"8px"}}),me.t("word.CommercialBuilding",Y)]},R.COMMERCIAL_BUILDING),Object(gf.jsxs)(BT,{value:R.SCHOOL_BUILDING,children:[Object(gf.jsx)("img",{alt:"School Building",width:24,src:MT,style:{marginRight:"8px"}}),me.t("word.SchoolBuilding",Y)]},R.SCHOOL_BUILDING),Object(gf.jsxs)(BT,{value:R.TOURIST_ATTRACTION,children:[Object(gf.jsx)("img",{alt:"Tourist Attraction",width:24,src:WT,style:{marginRight:"8px"}}),me.t("word.TouristAttraction",Y)]},R.TOURIST_ATTRACTION),Object(gf.jsxs)(BT,{value:R.PHOTOVOLTAIC,children:[Object(gf.jsx)("img",{alt:"Photovoltaic",width:24,src:IT,style:{marginRight:"8px"}}),me.t("word.Photovoltaic",Y)]},R.PHOTOVOLTAIC),Object(gf.jsxs)(BT,{value:R.PARABOLIC_DISH,children:[Object(gf.jsx)("img",{alt:"Parabolic Dish",width:24,src:CT,style:{marginRight:"8px"}}),me.t("shared.ParabolicDishElement",Y)]},R.PARABOLIC_DISH),Object(gf.jsxs)(BT,{value:R.PARABOLIC_TROUGH,children:[Object(gf.jsx)("img",{alt:"Parabolic Trough",width:24,src:OT,style:{marginRight:"8px"}}),me.t("shared.ParabolicTroughElement",Y)]},R.PARABOLIC_TROUGH),Object(gf.jsxs)(BT,{value:R.FRESNEL_REFLECTOR,children:[Object(gf.jsx)("img",{alt:"Fresnel Reflector",width:24,src:FT,style:{marginRight:"8px"}}),me.t("shared.FresnelReflectorElement",Y)]},R.FRESNEL_REFLECTOR),Object(gf.jsxs)(BT,{value:R.SOLAR_POWER_TOWER,children:[Object(gf.jsx)("img",{alt:"Heliostat",width:24,src:kT,style:{marginRight:"8px"}}),me.t("shared.HeliostatElement",Y)]},R.SOLAR_POWER_TOWER)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Publisher",Y),":"]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(ET.a,{maxLength:30,style:{width:"100%"},value:null!==g&&void 0!==g?g:"",onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){m(e.target.value)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Label",Y),":"]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(ET.a,{maxLength:50,style:{width:"100%"},value:null!==v&&void 0!==v?v:"",onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){b(e.target.value)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Description",Y),":",Object(gf.jsx)("br",{}),Object(gf.jsxs)("span",{style:{fontSize:"10px"},children:["(",me.t("word.MaximumCharacters",Y),": 200)"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(k,{rows:5,maxLength:200,style:{width:"100%"},value:null!==P&&void 0!==P?P:"",onChange:function(e){S(e.target.value)}})})]})]})},qT=n.a.memo(KT),QT=db.a.Option,ZT=function(e){var t,l=e.saveAs,a=e.setDialogVisible,o=Ew(si),i=Ew(Gi),n=Ew(Vi),c=Object(r.useState)(null!==(t=Ew.getState().projectInfo.type)&&void 0!==t?t:M.SOLAR_PANEL_ARRAY),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(Ew.getState().projectInfo.title),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(Ew.getState().projectInfo.description),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)({left:0,top:0,bottom:0,right:0}),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useRef)(null),D=ET.a.TextArea,W={lng:n};return Object(gf.jsxs)(Zv.a,{width:560,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return P(!0)},onMouseOut:function(){return P(!1)},children:me.t(l?"menu.project.SaveProjectAs":"menu.project.CreateNewProject",W)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){a(!1)},children:me.t("word.Cancel",W)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){l?e.saveProjectFlag=!0:e.createProjectFlag=!0})),Tf.setState((function(e){e.projectType=d,e.projectTitle=y,e.projectDescription=x})),i&&o((function(e){e.actionInfo={name:l?"Save Project as":"Create New Project",timestamp:(new Date).getTime()}})),a(!1)},disabled:!y,children:me.t("word.OK",W)},"OK")],onCancel:function(){a(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!T,bounds:H,onStart:function(e,t){return function(e,t){if(R.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=R.current.getBoundingClientRect();z({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:R,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:me.t("projectPanel.ProjectType",W)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(db.a,{disabled:l,style:{width:"100%"},value:d,onChange:function(e){f(e)},children:Object(gf.jsx)(QT,{value:M.SOLAR_PANEL_ARRAY,children:me.t("projectPanel.SolarPanelArray",W)},M.SOLAR_PANEL_ARRAY)})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Title",W),":"]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(ET.a,{maxLength:50,style:{width:"100%"},value:null!==y&&void 0!==y?y:"",onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){g(e.target.value)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Description",W),":",Object(gf.jsx)("br",{}),Object(gf.jsxs)("span",{style:{fontSize:"10px"},children:["(",me.t("word.MaximumCharacters",W),": 200)"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(D,{rows:5,maxLength:200,style:{width:"100%"},value:null!==x&&void 0!==x?x:"",onChange:function(e){v(e.target.value)}})})]})]})},_T=n.a.memo(ZT),$T=l(34),eP=(l(336),l(337),function(){var e=Object(Eh.a)(Lh.a.mark((function e(t,l,a){var o;return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o={lng:Ew.getState().language},e.next=3,$T.a.firestore().collection("users").doc(t).collection("projects").doc(l).get().then((function(e){var i,r,n=e.data();n?a({owner:t,title:e.id,timestamp:n.timestamp,description:n.description,dataColoring:null!==(i=n.dataColoring)&&void 0!==i?i:z.ALL,type:n.type,designs:n.designs,ranges:n.ranges,hiddenParameters:n.hiddenParameters,counter:null!==(r=n.counter)&&void 0!==r?r:0,selectedProperty:n.selectedProperty,sortDescending:n.sortDescending,xAxisNameScatteredPlot:n.xAxisNameScatteredPlot,yAxisNameScatteredPlot:n.yAxisNameScatteredPlot,dotSizeScatteredPlot:n.dotSizeScatteredPlot,thumbnailWidth:n.thumbnailWidth}):Qh(me.t("message.CannotOpenProject",o)+": "+l)})).catch((function(e){Qh(me.t("message.CannotOpenProject",o)+": "+e)}));case 3:case"end":return e.stop()}}),e)})));return function(t,l,a){return e.apply(this,arguments)}}()),tP=function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({ranges:$T.a.firestore.FieldValue.arrayUnion(l)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))},lP=function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({ranges:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))},aP=function(e,t,l){var a={timestamp:Date.now(),title:t,thumbnail:l};switch(e){case M.SOLAR_PANEL_ARRAY:var o=Ew.getState().world.latitude,i=Tw.countAllSolarPanels(),r=Tw.countAllSolarPanelDailyYields(),n=Tw.countAllSolarPanelYearlyYields(),c=Ew.getState().economicsParams,s=c.operationalCostPerUnit,u=c.electricitySellingPrice;a=Object(d.a)(Object(d.a)({latitude:o,unitCost:s,sellingPrice:u,panelCount:i,dailyYield:r,yearlyYield:n},a),Ew.getState().solarPanelArrayLayoutParams);break;case M.SOLAR_PANEL_TILT_ANGLE:}return a},oP=function(e,t){if(!t)return null;var l,a=[],o=Object(f.a)(t);try{for(o.s();!(l=o.n()).done;){var i=l.value,r=Object(d.a)({},i);r.title=iP(e,i.title),r.timestamp=Date.now(),a.push(r)}}catch(n){o.e(n)}finally{o.f()}return a},iP=function(e,t){var l=t.lastIndexOf(" ");return e+t.substring(l)},rP=function(e){var t=document.createElement("canvas");t.width=e.width,t.height=e.height;var l=t.getContext("2d");return l&&l.drawImage(e,1,1),t.toDataURL()},nP=function(e,t,l,a){var o={lng:Ew.getState().language};$T.a.firestore().collection("users").doc(null!==l&&void 0!==l?l:a).collection("designs").doc(e).get().then((function(e){if(e.exists){var l=e.data();l&&$T.a.firestore().collection("users").doc(a).collection("designs").doc(t).set(l).then((function(){Kh(me.t("message.CloudFileCopied",o)+": "+t)})).catch((function(e){Qh(me.t("message.CannotWriteCloudFile",o)+": "+e)}))}else Qh(me.t("message.CannotReadCloudFile",o))})).catch((function(e){Qh(me.t("message.CannotReadCloudFile",o)+": "+e)}))},cP=function(e,t,l,a,o){var i={lng:Ew.getState().language};return Ew.getState().undoManager.clear(),Tf.setState((function(e){e.waiting=!0})),$T.a.firestore().collection("users").doc(e).collection(l?"designs":"files").doc(t).get().then((function(l){var r=l.data();if(r?Ew.getState().importContent(r,t):(Kh(me.t("message.CloudFileNotFound",i)+": "+t),Ew.getState().set((function(e){e.cloudFile=void 0})),Tf.setState((function(e){e.waiting=!1}))),!a&&!o){var n=Ge+"?client=web&userid="+e+"&title="+encodeURIComponent(t);window.history.pushState({},document.title,n)}})).catch((function(e){Qh(me.t("message.CannotOpenCloudFile",i)+": "+e),Tf.setState((function(e){e.waiting=!1}))}))},sP=Qv.a.SubMenu,dP={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},uP=mv.a.div(vT||(vT=Object(gv.a)(["\n width: 100px;\n"]))),fP=mv.a.img(bT||(bT=Object(gv.a)(["\n position: absolute;\n top: 10px;\n left: 10px;\n height: 40px;\n transition: 0.5s;\n opacity: 1;\n cursor: pointer;\n user-select: none;\n\n &:hover {\n opacity: 0.5;\n }\n"]))),hP=mv.a.div(AT||(AT=Object(gv.a)(["\n position: absolute;\n top: 54px;\n left: 0;\n width: 100px;\n display: flex;\n justify-content: center;\n align-items: center;\n user-select: none;\n z-index: 9;\n"]))),pP=function(e){var t=e.viewOnly,l=e.set2DView,a=e.resetView,n=e.zoomView,c=e.setNavigationView,s=e.canvas,p=Ew(si),y=Tf(yf),g=Ew(as),m=Ew(Kc),w=Ew(qc),x=Ew(jr),v=Ew(fs),b=Ew(ds),A=Ew(tn),T=Ew(us),P=Ew(rs),S=Ew(Sr),j=Tf(Ki),H=Ew.getState().loggable,z=Ew.getState().language,R=Ew.getState().floatingWindowOpacity,M=Ew.getState().undoManager,W=Ew(i.timesPerHour),I=Ew(i.solarPanelVisibilityGridCellSize),C=Ew(i.solarRadiationHeatmapGridCellSize),O=Ew(o.solarRadiationHeatmapMaxValue),F=Ew.getState().viewState.navigationView,k=Ew.getState().viewState.orthographic,Y=Ew.getState().viewState.autoRotate,L=Ew.getState().viewState.showSiteInfoPanel,E=Ew.getState().viewState.showDesignInfoPanel,U=Ew.getState().viewState.showInstructionPanel,J=Ew.getState().viewState.showMapPanel,X=Ew.getState().viewState.showWeatherPanel,B=Ew.getState().viewState.showDiurnalTemperaturePanel,K=Tf.getState().showEconomicsPanel,q=Tf.getState().showNavigationPanel,Q=Ew.getState().viewState.showStickyNotePanel,Z=Ew.getState().viewState.showHeliodonPanel,_=Ew.getState().viewState.shadowEnabled,$=Ew.getState().viewState.solarPanelShininess,ee=Tf.getState().changed,te=Ew.getState().cloudFile,le=Ew.getState().user,ae=Ew.getState().viewState.axes,oe=Ew.getState().elementsToPaste,ie=Tf.getState().runDynamicSimulation,re=Tf.getState().runStaticSimulation,ne=Ew(i.noAnimationForHeatmapSimulation),ce=Ew(i.noAnimationForSensorDataCollection),se=Ew(o.solarRadiationHeatmapReflectionOnly),de=Ew.getState().elements,ue=Ew.getState().viewState.cameraPosition,fe=Ew.getState().viewState.panCenter,he=Ew.getState().selectedElement,pe=Ew.getState().projectInfo,ye=Ew.getState().projectView,ge=Object(r.useState)(!1),we=Object(u.a)(ge,2),ve=we[0],be=we[1],Ae=Object(r.useState)(!1),Te=Object(u.a)(Ae,2),Pe=Te[0],Se=Te[1],je=Object(r.useState)(!1),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De=Object(r.useState)(!1),Me=Object(u.a)(De,2),We=Me[0],Ie=Me[1],Ce=Object(r.useState)(!1),Oe=Object(u.a)(Ce,2),Fe=Oe[0],ke=Oe[1],Ye=Object(r.useMemo)((function(){return{lng:z}}),[z]),Le=Object(r.useMemo)((function(){return Tw.isMac()}),[]),Ee=Object(r.useMemo)((function(){var e=Tw.getOS();if(e){if(e.includes("OS X"))return"Ctrl+Alt+H";if(e.includes("Chrome"))return"Ctrl+Alt+H"}return"Ctrl+Home"}),[]),Ue=function(e){var l=function(e){var t;switch(e){case"sun_angles":t=yb;break;case"insolation_and_climate":t=gb;break;case"solar_radiation_to_box":t=mb;break;case"sun_beam_at_center":t=wb;break;case"thermal_vs_building_envelope":t=xT;break;case"effect_house_size":t=sT;break;case"effect_house_orientation":t=dT;break;case"effect_wall_roof_insulation":t=uT;break;case"effect_roof_color":t=fT;break;case"effect_eaves_overhang_length":t=hT;break;case"effect_window_shgc":t=pT;break;case"effect_thermostat_setpoint":t=yT;break;case"effect_solar_panels":t=gT;break;case"effect_ground_temperature":t=mT;break;case"effect_trees":t=wT;break;case"office_building_01":t=rA;break;case"hotel_01":t=nA;break;case"spanish_style_hotel":t=cA;break;case"apartment_building_01":t=sA;break;case"white_house":t=oA;break;case"bilim_mersin_turkiye":t=iA;break;case"south_burlington_high_school":t=dA;break;case"mescalero_apache_school":t=uA;break;case"heatmap_01":t=fA;break;case"vegetative_buffer_01":t=bA;break;case"solar_canopy_form_factors":t=RA;break;case"solar_canopy_over_bleachers":t=DA;break;case"solar_bus_stop":t=MA;break;case"solar_facade_tesla":t=CA;break;case"solar_canopy_over_garage":t=IA;break;case"bipv_01":t=WA;break;case"floatovoltaics":t=OA;break;case"agrivoltaics":t=FA;break;case"effect_tilt_angle_solar_panel":t=AA;break;case"effect_azimuth_solar_panel":t=TA;break;case"effect_azimuth_parabolic_trough":t=PA;break;case"effect_latus_rectum_parabolic_trough":t=SA;break;case"parabolic_dish_focus_sunlight":t=EA;break;case"effect_orientation_solar_panel":t=jA;break;case"solar_panel_types":t=xb;break;case"vertical_bifacial_solar_panels":t=vb;break;case"compare_monofacial_bifacial_solar_panels":t=bb;break;case"why_solar_array":t=HA;break;case"solar_panel_array_auto_layout":t=zA;break;case"inter_row_spacing":t=kA;break;case"rooftop_solar_panels":t=Ab;break;case"solar_panels_over_canal":t=zb;break;case"solar_noise_barrier":t=Hb;break;case"rainbow_swash_solar_farm":t=Tb;break;case"mickey_mouse_solar_farm":t=Pb;break;case"solar_farm_hsat_array":t=Sb;break;case"solar_farm_aadat_array":t=jb;break;case"solar_trackers":t=Rb;break;case"nevada_solar_one_parabolic_troughs":t=LA;break;case"tooele_parabolic_dish_array":t=UA;break;case"ps10_solar_power_tower":t=YA;break;case"linear_fresnel_reflectors":t=NA;break;case"linear_fresnel_reflectors_two_absorbers":t=VA;break;case"effect_absorber_pipe_height":t=JA;break;case"effect_azimuth_fresnel_reflector":t=GA;break;case"cosine_efficiency_heliostats":t=XA;break;case"shadowing_blocking_heliostats":t=BA;break;case"effect_solar_power_tower_height":t=KA;break;case"solar_power_tower":t=qA;break;case"solar_updraft_tower":t=tT;break;case"solar_updraft_tower_city":t=lT;break;case"cape_cod_with_shed_dormer":t=Mb;break;case"mansard_roof_with_dormers":t=Wb;break;case"t_shaped_house":t=Ib;break;case"all_roof_types":t=Db;break;case"a_frame_house":t=Kb;break;case"half_timbered_house":t=qb;break;case"dutch_gable_roof":t=Bb;break;case"combination_roof_vs_bonnet_roof":t=Qb;break;case"butterfly_roof_house":t=Zb;break;case"gable_roof_vs_hip_roof":t=_b;break;case"gable_and_valley_roof":t=$b;break;case"clerestory_roof":t=eA;break;case"monitor_roof":t=tA;break;case"colonial_vs_saltbox":t=lA;break;case"gambrel_roof_vs_mansard_roof":t=aA;break;case"colonial_house":t=Gb;break;case"dutch_colonial_house":t=Xb;break;case"cape_cod_with_garage":t=Cb;break;case"greenhouse":t=hA;break;case"solarium":t=Eb;break;case"pavilion":t=pA;break;case"octagonal_pagoda":t=yA;break;case"ocean_front":t=gA;break;case"mosque_01":t=Ub;break;case"church_01":t=Nb;break;case"cathedral_01":t=Vb;break;case"cathedral_02":t=Jb;break;case"adobe_taos_house":t=Ob;break;case"egyptian_pyramids":t=mA;break;case"mayan_pyramid":t=wA;break;case"si_o_se_pol":t=xA;break;case"stacked_cuboids":t=vA;break;case"barn_house":t=Yb;break;case"ranch_house":t=Fb;break;case"bonnet_house":t=kb;break;case"modern_house_01":t=Lb;break;case"solar_radiation_predicted_vs_measured":t=QA;break;case"bestest_case_600":t=ZA;break;case"bestest_case_610":t=_A;break;case"bestest_case_620":t=$A;break;case"bestest_case_630":t=eT;break;case"tucson_sundt_station":t=aT;break;case"ai_tilt_angle_one_row":t=oT;break;case"ai_tilt_angles_multiple_rows":t=iT;break;case"ai_solar_farm_design":t=rT;break;case"ai_solar_farm_design_block":t=nT;break;case"ai_fitchburg_solar_farm":t=cT}return t}(e.key);l&&(Tf.setState((function(e){e.openModelsMap=!1})),!t&&ee?Zv.a.confirm({title:me.t("message.DoYouWantToSaveChanges",Ye),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){return Je(l)},onCancel:function(){Tf.setState((function(e){e.waiting=!0})),setTimeout((function(){x(l)}),10)},okText:me.t("word.Yes",Ye),cancelText:me.t("word.No",Ye)}):(Tf.setState((function(e){e.waiting=!0})),setTimeout((function(){x(l)}),10)),H&&p((function(t){t.actionInfo={name:"Open Example: "+e.key,timestamp:(new Date).getTime()}})),t||window.history.pushState({},document.title,Ge))},Ne=function(e){p((function(t){t.projectInfo=Object(d.a)({},e),t.projectImages.clear(),t.projectView=!0})),Tf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag,e.updateProjectsFlag=!0}))},Ve=function(e,l){var a="QWecNcxhyvP6j6sBN11hBsfZDau1";e&&(eP(a,e,Ne).then((function(){cP(a,e+" "+l,!0,!0,t).then((function(){}))})),Tf.setState((function(e){e.openModelsMap=!1})),H&&p((function(t){t.actionInfo={name:"Open Example: "+e,timestamp:(new Date).getTime()}})),t||window.history.pushState({},document.title,Ge))},Je=function(e){te?(p((function(t){t.localContentToImportAfterCloudFileUpdate=e})),Tf.getState().setSaveCloudFileFlag(!0)):le.uid?p((function(t){t.localContentToImportAfterCloudFileUpdate=e,t.showCloudFileTitleDialogFlag=!t.showCloudFileTitleDialogFlag,t.showCloudFileTitleDialog=!0})):Kh(me.t("menu.file.ToSaveYourWorkPleaseSignIn",Ye))},Xe=ue[0]===ue[1]&&ue[1]===ue[2]&&0===fe[0]&&0===fe[1]&&0===fe[2],Be=oe&&oe.length>0,Ke=Ew.getState().countAllElementsByType(),Ze=Object(gf.jsxs)(Qv.a,{triggerSubMenuAction:"click",children:[!j&&Object(gf.jsxs)(sP,{title:me.t("menu.fileSubMenu",Ye),children:[!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){M.clear(),p((function(e){e.createNewFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,window.history.pushState({},document.title,Ge),H&&(e.actionInfo={name:"Create New File",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.openModelsMap=!1}))},children:[me.t("menu.file.CreateNewFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+F)"]})]},"create-new-file"),!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){M.clear(),p((function(e){e.openLocalFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.cloudFile=void 0,window.history.pushState({},document.title,Ge),H&&(e.actionInfo={name:"Open Local File",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.openModelsMap=!1}))},children:[me.t("menu.file.OpenLocalFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+O)"]}),"..."]},"open-local-file"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.saveLocalFileDialogVisible=!0})),H&&p((function(e){e.actionInfo={name:"Save as Local File",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.SaveAsLocalFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+S)"]}),"..."]},"save-local-file"),le.uid&&!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.listCloudFilesFlag=!0,e.openModelsMap=!1})),p((function(e){e.selectedFloatingWindow="cloudFilePanel"})),H&&p((function(e){e.actionInfo={name:"List Cloud Files",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.OpenCloudFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Shift+O)"]}),"..."]},"open-cloud-file"),le.uid&&te&&!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.getState().setSaveCloudFileFlag(!0),H&&p((function(e){e.actionInfo={name:"Save Cloud File",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.SaveCloudFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Shift+S)"]})]},"save-cloud-file"),le.uid&&!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){p((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0,H&&(e.actionInfo={name:"Save as Cloud File",timestamp:(new Date).getTime()})}))},children:[me.t("menu.file.SaveAsCloudFile",Ye),"..."]},"save-as-cloud-file"),!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e=new URLSearchParams(window.location.search).get("userid"),t=e===le.uid;le.uid&&te&&t?Se(!0):le.uid?Kh(e&&!t?me.t("menu.file.YouCannotPublishAModelThatYouDoNotOwn",Ye)+".":me.t("menu.file.YouMustSaveModelOnCloudBeforePublishingIt",Ye)+"."):Kh(me.t("menu.file.YouMustLogInToPublishYourModel",Ye)+".")},children:[me.t("menu.file.PublishOnModelsMap",Ye),"..."]},"publish-on-model-map"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){s&&(!function(e,t){var l=document.createElement("a");l.download=e,l.href=t,l.click()}("screenshot.png",s.toDataURL("image/png")),H&&p((function(e){e.actionInfo={name:"Take Screenshot",timestamp:(new Date).getTime()}})),Tf.setState((function(e){e.openModelsMap=!1})))},children:me.t("menu.file.TakeScreenshot",Ye)},"screenshot")]},"file"),!j&&!t&&le.uid&&Object(gf.jsxs)(sP,{title:me.t("menu.projectSubMenu",Ye),children:[Object(gf.jsxs)(Qv.a.Item,{onClick:function(){le.uid?(Re(!0),Tf.setState((function(e){e.openModelsMap=!1})),H&&p((function(e){e.actionInfo={name:"Create New Project",timestamp:(new Date).getTime()}}))):Kh(me.t("menu.project.YouMustLogInToCreateProject",Ye)+".")},children:[me.t("menu.project.CreateNewProject",Ye),"..."]},"create-new-project"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){le.uid?(Tf.setState((function(e){e.showProjectsFlag=!0,e.openModelsMap=!1})),p((function(e){e.selectedFloatingWindow="projectListPanel"})),H&&p((function(e){e.actionInfo={name:"Open Project",timestamp:(new Date).getTime()}}))):Kh(me.t("menu.project.YouMustLogInToOpenProject",Ye)+".")},children:[me.t("menu.project.OpenProject",Ye),"..."]},"list-project"),ye&&pe.title&&le.uid&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Ie(!0),Tf.setState((function(e){e.openModelsMap=!1})),H&&p((function(e){e.actionInfo={name:"Save Project As",timestamp:(new Date).getTime()}}))},children:[me.t("menu.project.SaveProjectAs",Ye),"..."]},"save-project-as")]},"project"),(he||Be||M.hasUndo()||M.hasRedo())&&!j&&Object(gf.jsxs)(sP,{title:me.t("menu.editSubMenu",Ye),children:[he&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){he&&(m(he.id),H&&p((function(e){e.actionInfo={name:"Copy",timestamp:(new Date).getTime(),elementId:he.id,elementType:he.type}})))},children:[me.t("word.Copy",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+C)"]})]},"copy"),he&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(he&&he.type!==V.Roof)if(he.locked)Kh(me.t("message.ThisElementIsLocked",Ye));else{var e=w(he.id,!0);if(0===e.length)return;if(Tw.isElementTriggerAutoDeletion(e[0]))Et.getState().setListenToAutoDeletionByCut(!0),Tf.getState().setPrimitiveStore("selectedElementId",he.id);else{var t={name:"Cut",timestamp:Date.now(),deletedElements:e,selectedElementId:he.id,undo:function(){var e=t.deletedElements;if(0!==e.length){var l=e.find((function(e){return e.id===t.selectedElementId}));l&&p((function(t){var a,o=Object(f.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value;t.elements.push(i)}}catch(h){o.e(h)}finally{o.f()}if(l.type===V.Wall){var r=l,n=null,c=null;if(r.leftJoints.length>0&&(n=r.leftJoints[0]),r.rightJoints.length>0&&(c=r.rightJoints[0]),n||c){var s,d=Object(f.a)(t.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;u.id===n&&u.type===V.Wall&&(u.rightJoints[0]=r.id),u.id===c&&u.type===V.Wall&&(u.leftJoints[0]=r.id)}}catch(h){d.e(h)}finally{d.f()}}}}))}},redo:function(){t.deletedElements&&t.deletedElements.length>0&&w(t.deletedElements[0].id,!0)}};S(t)}}},children:[me.t("word.Cut",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+X)"]})]},"cut"),Be&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(oe&&oe.length>0){var e=g();if(e.length>0){var t={name:"Paste by Key",timestamp:Date.now(),pastedElements:JSON.parse(JSON.stringify(e)),undo:function(){var e,l=Object(f.a)(t.pastedElements);try{for(l.s();!(e=l.n()).done;){var a=e.value;w(a.id,!1)}}catch(o){l.e(o)}finally{l.f()}},redo:function(){p((function(e){var l;(l=e.elements).push.apply(l,Object(h.a)(t.pastedElements)),e.selectedElement=t.pastedElements[0]}))}};S(t)}}},children:[me.t("word.Paste",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+V)"]})]},"paste"),M.hasUndo()&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(M.hasUndo()){var e=M.undo();e&&Kh(me.t("menu.edit.Undo",Ye)+": "+e,qe),H&&p((function(e){e.actionInfo={name:"Undo",timestamp:(new Date).getTime()}}))}},children:[me.t("menu.edit.Undo",Ye)+": "+M.getLastUndoName(),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Z)"]})]},"undo"),M.hasRedo()&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(M.hasRedo()){var e=M.redo();e&&Kh(me.t("menu.edit.Redo",Ye)+": "+e,qe),H&&p((function(e){e.actionInfo={name:"Redo",timestamp:(new Date).getTime()}}))}},children:[me.t("menu.edit.Redo",Ye)+": "+M.getLastRedoName(),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Y)"]})]},"redo")]},"edit"),!j&&Object(gf.jsxs)(sP,{title:me.t("menu.viewSubMenu",Ye),children:[!k&&!Xe&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Reset View",timestamp:Date.now(),oldCameraPosition:Object(h.a)(ue),oldPanCenter:Object(h.a)(fe),undo:function(){var t=Et.getState().orbitControlsRef;(null===t||void 0===t?void 0:t.current)&&(t.current.object.position.set(e.oldCameraPosition[0],e.oldCameraPosition[1],e.oldCameraPosition[2]),t.current.target.set(e.oldPanCenter[0],e.oldPanCenter[1],e.oldPanCenter[2]),t.current.update(),p((function(t){var l=t.viewState;l.cameraPosition=Object(h.a)(e.oldCameraPosition),l.panCenter=Object(h.a)(e.oldPanCenter)})))},redo:function(){a()}};S(e),a(),p((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.viewState.orthographic=!1}))},style:{paddingLeft:"36px"},children:[me.t("menu.view.ResetView",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Ee,")"]})]},"reset-view"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(1.1)},style:{paddingLeft:"36px"},children:[me.t("menu.view.ZoomOut",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+])"]})]},"zoom-out-view"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(.9)},style:{paddingLeft:"36px"},children:[me.t("menu.view.ZoomIn",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+[)"]})]},"zoom-in-view"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsxs)(_v.a,{checked:F,onChange:function(e){var t={name:"Toggle Navigation View",timestamp:Date.now(),checked:e.target.checked,undo:function(){c(!t.checked)},redo:function(){c(t.checked)}};S(t),c(e.target.checked),p((function(e){e.viewState.autoRotate=!1}))},children:[me.t("menu.view.NavigationView",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Q)"]})]})},"navigation-view-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsxs)(_v.a,{checked:k,onChange:function(e){var t={name:"Toggle 2D View",timestamp:Date.now(),checked:e.target.checked,undo:function(){l(!t.checked)},redo:function(){l(t.checked)}};S(t),l(e.target.checked),p((function(e){e.viewState.autoRotate=!1}))},children:[me.t("menu.view.TwoDimensionalView",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+B)"]})]})},"orthographic-check-box"),!k&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsxs)(_v.a,{checked:Y,onChange:function(){if(!k){var e={name:"Auto Rotate",timestamp:Date.now(),checked:!Y,undo:function(){p((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.viewState.autoRotate=!e.checked}))},redo:function(){p((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.viewState.autoRotate=e.checked}))}};S(e),p((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.viewState.autoRotate=!e.viewState.autoRotate}))}},children:[me.t("menu.view.AutoRotate",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+M)"]})]})},"auto-rotate-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:ae,onChange:function(e){var t=e.target.checked,l={name:"Show Axes",timestamp:Date.now(),checked:t,undo:function(){p((function(e){e.viewState.axes=!l.checked}))},redo:function(){p((function(e){e.viewState.axes=l.checked}))}};S(l),p((function(e){e.viewState.axes=t}))},children:me.t("skyMenu.Axes",Ye)})},"axes-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:_,onChange:function(){var e={name:"Show Shadow",timestamp:Date.now(),checked:!_,undo:function(){p((function(t){t.viewState.shadowEnabled=!e.checked,t.viewState.shadowEnabled&&t.updateSceneRadius()}))},redo:function(){p((function(t){t.viewState.shadowEnabled=e.checked,t.viewState.shadowEnabled&&t.updateSceneRadius()}))}};S(e),p((function(e){e.viewState.shadowEnabled=!e.viewState.shadowEnabled,e.viewState.shadowEnabled&&e.updateSceneRadius()}))},children:me.t("menu.view.ShowShadow",Ye)})},"shadow-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:void 0===$||$>0,onChange:function(e){!function(e){var t={name:"Set Surface Shininess",timestamp:Date.now(),oldValue:null!==$&&void 0!==$?$:tt,newValue:e,undo:function(){p((function(e){e.viewState.solarPanelShininess=t.oldValue}))},redo:function(){p((function(e){e.viewState.solarPanelShininess=t.newValue}))}};S(t),p((function(t){t.viewState.solarPanelShininess=e}))}(e.target.checked?tt:0)},children:me.t("menu.view.ShowSurfaceShininess",Ye)})},"shininess-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:R<1,onChange:function(e){var t=R,l=e.target.checked?Qe:1,a={name:"Floating Window Opacity",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){p((function(e){e.floatingWindowOpacity=a.oldValue}))},redo:function(){p((function(e){e.floatingWindowOpacity=a.newValue}))}};S(a),p((function(e){e.floatingWindowOpacity=l}))},children:me.t("menu.view.TranslucentFloatingWindows",Ye)})},"translucency-check-box")]},"view"),!j&&Object(gf.jsxs)(sP,{title:me.t("menu.settingsSubMenu",Ye),children:[!Z&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Open Sun and Time Settings Panel",timestamp:Date.now(),undo:function(){p((function(e){e.viewState.showHeliodonPanel=!1}))},redo:function(){p((function(e){e.viewState.showHeliodonPanel=!0}))}};S(e),p((function(e){e.viewState.showHeliodonPanel=!0}))},children:[me.t("menu.settings.SunAndTime",Ye),"..."]},"heliodon-panel-check-box"),!J&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Open Maps",timestamp:Date.now(),undo:function(){p((function(e){e.viewState.showMapPanel=!1}))},redo:function(){p((function(e){e.viewState.showMapPanel=!0}))}};S(e),p((function(e){e.viewState.showMapPanel=!0}))},children:[me.t("word.Location",Ye),"..."]},"map-panel-check-box"),!X&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Open Weather Panel",timestamp:Date.now(),undo:function(){p((function(e){e.viewState.showWeatherPanel=!1}))},redo:function(){p((function(e){e.viewState.showWeatherPanel=!0}))}};S(e),p((function(e){e.viewState.showWeatherPanel=!0}))},children:[me.t("menu.settings.WeatherData",Ye),"..."]},"weather-panel-check-box"),!B&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Open Diurnal Temperature Panel",timestamp:Date.now(),undo:function(){p((function(e){e.viewState.showDiurnalTemperaturePanel=!1}))},redo:function(){p((function(e){e.viewState.showDiurnalTemperaturePanel=!0}))}};S(e),p((function(e){e.viewState.showDiurnalTemperaturePanel=!0}))},children:[me.t("menu.settings.DiurnalTemperature",Ye),"..."]},"diurnal-temperature-panel-check-box"),!K&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.showEconomicsPanel=!0})),H&&p((function(e){e.actionInfo={name:"Open Economics Panel",timestamp:(new Date).getTime()}}))},children:[me.t("economicsPanel.EconomicsParameters",Ye),"..."]},"economics-panel-menu-item"),!q&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.showNavigationPanel=!0})),H&&p((function(e){e.actionInfo={name:"Open Navigation Panel",timestamp:(new Date).getTime()}}))},children:[me.t("navigationPanel.NavigationParameters",Ye),"..."]},"navigation-panel-menu-item")]},"settings"),!j&&Object(gf.jsxs)(sP,{title:me.t("menu.view.accessoriesSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:L,onChange:function(){var e={name:"Show Site Information",timestamp:Date.now(),checked:!L,undo:function(){p((function(t){t.viewState.showSiteInfoPanel=!e.checked}))},redo:function(){p((function(t){t.viewState.showSiteInfoPanel=e.checked}))}};S(e),p((function(e){e.viewState.showSiteInfoPanel=!e.viewState.showSiteInfoPanel}))},children:me.t("menu.view.accessories.SiteInformation",Ye)})},"site-info-panel-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:E,onChange:function(){var e={name:"Show Design Information",timestamp:Date.now(),checked:!E,undo:function(){p((function(t){t.viewState.showDesignInfoPanel=!e.checked}))},redo:function(){p((function(t){t.viewState.showDesignInfoPanel=e.checked}))}};S(e),p((function(e){e.viewState.showDesignInfoPanel=!e.viewState.showDesignInfoPanel}))},children:me.t("menu.view.accessories.DesignInformation",Ye)})},"design-info-panel-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:U,onChange:function(){var e={name:"Show Instruction Panel",timestamp:Date.now(),checked:!U,undo:function(){p((function(t){t.viewState.showInstructionPanel=!e.checked}))},redo:function(){p((function(t){t.viewState.showInstructionPanel=e.checked}))}};S(e),p((function(e){e.viewState.showInstructionPanel=!e.viewState.showInstructionPanel}))},children:me.t("menu.view.accessories.Instruction",Ye)})},"instruction-panel-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:Q,onChange:function(){var e={name:"Show Sticky Note",timestamp:Date.now(),checked:!Q,undo:function(){p((function(t){t.viewState.showStickyNotePanel=!e.checked}))},redo:function(){p((function(t){t.viewState.showStickyNotePanel=e.checked}))}};S(e),p((function(e){e.viewState.showStickyNotePanel=!e.viewState.showStickyNotePanel}))},children:me.t("menu.view.accessories.StickyNote",Ye)})},"sticky-note-panel-check-box")]},"accessories"),!j&&Ke.gotSome()&&Object(gf.jsxs)(sP,{title:me.t("menu.analysisSubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.physicsSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:!ne||Tw.hasMovingParts(de)?function(){ie||Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),y("runDynamicSimulation",!ie),H&&p((function(e){e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Dynamic)",timestamp:(new Date).getTime()}}))}),100)}:function(){re||Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),y("runStaticSimulation",!re),H&&p((function(e){e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Static)",timestamp:(new Date).getTime()}}))}),100)},children:me.t("menu.physics.DailySolarRadiationHeatmap",Ye)},"daily-solar-radiation-heatmap"),Object(gf.jsx)(sP,{title:me.t("menu.physics.SolarRadiationHeatmapOptions",Ye),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapGridCellSize",Ye)+":"}),Object(gf.jsx)($v.a,{min:.1,max:20,step:.1,style:{width:60},precision:1,value:null!==C&&void 0!==C?C:.5,onChange:function(e){p((function(t){t.world.solarRadiationHeatmapGridCellSize=e}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",Ye)})]},"solar-radiation-heatmap-grid-cell-size"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapMaxValue",Ye)+":"}),Object(gf.jsx)($v.a,{min:.5,max:50,step:.5,style:{width:60},precision:1,value:null!==O&&void 0!==O?O:5,onChange:function(e){p((function(t){t.viewState.solarRadiationHeatMapMaxValue=e}))}})]},"solar-radiation-heatmap-max-value"),Tw.hasHeliostatOrFresnelReflectors(de)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.physics.ReflectionHeatmap",Ye)+":"}),Object(gf.jsx)(eb.a,{checked:se,onChange:function(e){p((function(t){t.viewState.solarRadiationHeatMapReflectionOnly=e}))}})]},"solar-radiation-heatmap-reflection-only"),!Tw.hasMovingParts(de)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapNoAnimation",Ye)+":"}),Object(gf.jsx)(eb.a,{checked:ne,onChange:function(e){p((function(t){t.world.noAnimationForHeatmapSimulation=e}))}})]},"solar-radiation-heatmap-no-animation")]})},"solar-radiation-heatmap-options")]},"physics"),Ke.sensorCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.sensorSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.Sensor)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){H&&p((function(e){e.actionInfo={name:"Collect Daily Data for Sensors",timestamp:(new Date).getTime()}})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailyLightSensor=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",Ye))},children:me.t("menu.sensor.CollectDailyData",Ye)},"sensor-collect-daily-data"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.Sensor)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){H&&p((function(e){e.actionInfo={name:"Collect Yearly Data for Sensors",timestamp:(new Date).getTime()}})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlyLightSensor=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",Ye))},children:me.t("menu.sensor.CollectYearlyData",Ye)},"sensor-collect-yearly-data"),Object(gf.jsx)(sP,{title:me.t("word.Options",Ye),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",Ye)+":"}),Object(gf.jsx)($v.a,{min:1,max:60,step:1,style:{width:60},precision:0,value:W,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){p((function(t){t.world.timesPerHour=e}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",Ye)})]},"sensor-simulation-sampling-frequency"),!Tw.hasMovingParts(de)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.sensor.SensorSimulationNoAnimation",Ye)+":"}),Object(gf.jsx)(eb.a,{checked:ce,onChange:function(e){p((function(t){t.world.noAnimationForSensorDataCollection=e}))}})]},"sensor-simulation-no-animation")]})},"sensor-simulation-options")]},"sensors"),Ke.wallCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.buildingSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){var e=TT(de,b,A);if(e.status!==tv.NO_BUILDING)if(e.status!==tv.AT_LEAST_ONE_BAD_NO_GOOD)e.status===tv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",Ye)),Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),H&&p((function(e){e.actionInfo={name:"Analyze Daily Building Energy",timestamp:(new Date).getTime()}})),Tf.setState((function(e){e.runDailyThermalSimulation=!0,e.simulationInProgress=!0}))}),100);else{var t;switch(e.buildingCompletion){case D.WALL_DISJOINED:t=me.t("message.WallsAreNotConnected",Ye);break;case D.WALL_EMPTY:t=me.t("message.BuildingContainsEmptyWall",Ye);break;case D.ROOF_MISSING:t=me.t("message.BuildingRoofMissing",Ye);break;default:t=me.t("message.UnknownErrors",Ye)}Qh(me.t("message.SimulationWillNotStartDueToErrors",Ye)+": "+t)}else Kh(me.t("analysisManager.NoBuildingForAnalysis",Ye))},children:me.t("menu.building.AnalyzeDailyBuildingEnergy",Ye)},"building-energy-daily-data"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){var e=TT(de,b,A);if(e.status!==tv.NO_BUILDING)if(e.status!==tv.AT_LEAST_ONE_BAD_NO_GOOD)e.status===tv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",Ye)),Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),Tf.setState((function(e){e.runYearlyThermalSimulation=!0,e.simulationInProgress=!0})),H&&p((function(e){e.actionInfo={name:"Analyze Yearly Building Energy",timestamp:(new Date).getTime()}}))}),100);else{var t;switch(e.buildingCompletion){case D.WALL_DISJOINED:t=me.t("message.WallsAreNotConnected",Ye);break;case D.WALL_EMPTY:t=me.t("message.BuildingContainsEmptyWall",Ye);break;case D.ROOF_MISSING:t=me.t("message.BuildingRoofMissing",Ye);break;default:t=me.t("message.UnknownErrors",Ye)}Qh(me.t("message.SimulationWillNotStartDueToErrors",Ye)+": "+t)}else Kh(me.t("analysisManager.NoBuildingForAnalysis",Ye))},children:me.t("menu.building.AnalyzeYearlyBuildingEnergy",Ye)},"building-energy-yearly-data"),Object(gf.jsx)(pb,{})]},"buildings"),Ke.solarPanelCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.solarPanelSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.SolarPanel)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation For Solar Panels",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",Ye))},children:me.t("menu.solarPanel.AnalyzeDailyYield",Ye)},"solar-panel-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.SolarPanel)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation For Solar Panels",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",Ye))},children:me.t("menu.solarPanel.AnalyzeYearlyYield",Ye)},"solar-panel-yearly-yield"),Object(gf.jsx)(fb,{}),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==v()?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){Tf.setState((function(e){e.runSolarPanelVisibilityAnalysis=!e.runSolarPanelVisibilityAnalysis,e.simulationInProgress=!0})),H&&p((function(e){e.actionInfo={name:"Run Visibility Analysis For Solar Panels",timestamp:(new Date).getTime()}}))}),100)):Kh(me.t("analysisManager.NoObserverForVisibilityAnalysis",Ye))},children:me.t("menu.solarPanel.AnalyzeVisibility",Ye)},"solar-panel-visibility"),Object(gf.jsx)(sP,{title:me.t("menu.solarPanel.VisibilityAnalysisOptions",Ye),children:Object(gf.jsx)(Qv.a,{children:Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{paddingRight:"10px"},children:me.t("menu.solarPanel.VisibilityGridCellSize",Ye)+":"}),Object(gf.jsx)($v.a,{min:.1,max:5,step:.1,style:{width:60},precision:1,value:null!==I&&void 0!==I?I:.2,onChange:function(e){p((function(t){t.world.solarPanelVisibilityGridCellSize=e}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",Ye)})]},"solar-panel-visibility-grid-cell-size")})},"solar-panel-visibility-analysis-options")]},"solar-panels"),Ke.parabolicTroughCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.parabolicTroughSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.ParabolicTrough)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyParabolicTroughIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Parabolic Troughs",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForParabolicTroughs=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",Ye))},children:me.t("menu.parabolicTrough.AnalyzeDailyYield",Ye)},"parabolic-trough-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.ParabolicTrough)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyParabolicTroughIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Parabolic Troughs",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForParabolicTroughs=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",Ye))},children:me.t("menu.parabolicTrough.AnalyzeYearlyYield",Ye)},"parabolic-trough-yearly-yield"),Object(gf.jsx)(ub,{name:"parabolic-trough"})]},"parabolic-trough"),Ke.parabolicDishCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.parabolicDishSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.ParabolicDish)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyParabolicDishIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Parabolic Dishes",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForParabolicDishes=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",Ye))},children:me.t("menu.parabolicDish.AnalyzeDailyYield",Ye)},"parabolic-dish-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.ParabolicDish)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyParabolicDishIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Parabolic Dishes",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForParabolicDishes=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",Ye))},children:me.t("menu.parabolicDish.AnalyzeYearlyYield",Ye)},"parabolic-dish-yearly-yield"),Object(gf.jsx)(ub,{name:"parabolic-dish"})]},"parabolic-dish"),Ke.fresnelReflectorCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.fresnelReflectorSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.FresnelReflector)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyFresnelReflectorIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Fresnel Reflectors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForFresnelReflectors=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",Ye))},children:me.t("menu.fresnelReflector.AnalyzeDailyYield",Ye)},"fresnel-reflector-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.FresnelReflector)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyFresnelReflectorIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Fresnel Reflectors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForFresnelReflectors=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",Ye))},children:me.t("menu.fresnelReflector.AnalyzeYearlyYield",Ye)},"fresnel-reflector-yearly-yield"),Object(gf.jsx)(ub,{name:"fresnel-reflector"})]},"fresnel-reflector"),Ke.heliostatCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.heliostatSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.Heliostat)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyHeliostatIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Heliostats",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForHeliostats=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",Ye))},children:me.t("menu.heliostat.AnalyzeDailyYield",Ye)},"heliostat-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.Heliostat)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyHeliostatIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Heliostats",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForHeliostats=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",Ye))},children:me.t("menu.heliostat.AnalyzeYearlyYield",Ye)},"heliostat-yearly-yield"),Object(gf.jsx)(ub,{name:"heliostat"})]},"heliostat"),Ke.solarUpdraftTowerCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.solarUpdraftTowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==T(G.UpdraftTower)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyUpdraftTowerIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Solar Updraft Tower",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForUpdraftTower=!0}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",Ye))},children:me.t("menu.solarUpdraftTower.AnalyzeDailyYield",Ye)},"solar-updraft-tower-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==T(G.UpdraftTower)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyUpdraftTowerIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Solar Updraft Tower",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForUpdraftTower=!0}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",Ye))},children:me.t("menu.solarUpdraftTower.AnalyzeYearlyYield",Ye)},"solar-updraft-tower-yearly-yield"),Object(gf.jsx)(hb,{})]},"solar-updraft-tower")]},"analysis"),Object(gf.jsxs)(sP,{title:me.t("menu.tutorialsSubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.solarEnergyScienceSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.SunAngles",Ye)},"sun_angles"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.InsolationAndClimate",Ye)},"insolation_and_climate"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.SolarRadiationToBox",Ye)},"solar_radiation_to_box"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SunBeamAndHeliodon",Ye)},"sun_beam_at_center")]},"solar-energy-science"),Object(gf.jsxs)(sP,{title:me.t("menu.buildingScienceSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.ThermalEnvelopeVsBuildingEnvelope",Ye)},"thermal_vs_building_envelope"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfSizeOnBuildingEnergy",Ye)},"effect_house_size"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfOrientationOnBuildingEnergy",Ye)},"effect_house_orientation"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfInsulationOnBuildingEnergy",Ye)},"effect_wall_roof_insulation"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfRoofColorOnBuildingEnergy",Ye)},"effect_roof_color"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfEavesOverhangLengthOnBuildingEnergy",Ye)},"effect_eaves_overhang_length"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfWindowSHGCOnBuildingEnergy",Ye)},"effect_window_shgc"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfThermostatSetpointOnBuildingEnergy",Ye)},"effect_thermostat_setpoint"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfSolarPanelsOnBuildingEnergy",Ye)},"effect_solar_panels"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfGroundTemperatureOnBuildingEnergy",Ye)},"effect_ground_temperature"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfTreesOnBuildingEnergy",Ye)},"effect_trees")]},"building-science"),Object(gf.jsxs)(sP,{title:me.t("menu.buildingDesignSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.CapeCodStyleHouseWithShedDormer",Ye)},"cape_cod_with_shed_dormer"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.MansardRoofWithDormers",Ye)},"mansard_roof_with_dormers"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GableRoofVsHipRoof",Ye)},"gable_roof_vs_hip_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.ColonialVsSaltbox",Ye)},"colonial_vs_saltbox"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GambrelRoofVsMansardRoof",Ye)},"gambrel_roof_vs_mansard_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.CombinationRoofVsBonnetRoof",Ye)},"combination_roof_vs_bonnet_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.DutchGableRoof",Ye)},"dutch_gable_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GableAndValleyRoof",Ye)},"gable_and_valley_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.ClerestoryRoof",Ye)},"clerestory_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.MonitorRoof",Ye)},"monitor_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.AFrameHouse",Ye)},"a_frame_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.HalfTimberedHouse",Ye)},"half_timbered_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.AllBasicRoofTypes",Ye)},"all_roof_types")]},"building-design"),Object(gf.jsxs)(sP,{title:me.t("menu.photovoltaicSolarPowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfTiltAngleOfSolarPanel",Ye)},"effect_tilt_angle_solar_panel"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfAzimuthOfSolarPanel",Ye)},"effect_azimuth_solar_panel"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarPanelTypes",Ye)},"solar_panel_types"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.VerticalBifacialSolarPanels",Ye)},"vertical_bifacial_solar_panels"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.CompareMonofacialAndBifacialSolarPanels",Ye)},"compare_monofacial_bifacial_solar_panels"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarTrackers",Ye)},"solar_trackers"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.CoveringGroundWithSolarPanels",Ye)},"why_solar_array"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.InterRowSpacingOfSolarPanelArray",Ye)},"inter_row_spacing"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfOrientationOfSolarPanels",Ye)},"effect_orientation_solar_panel"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarPanelArrayAutomaticLayout",Ye)},"solar_panel_array_auto_layout"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.RooftopSolarPanels",Ye)},"rooftop_solar_panels"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyFormFactors",Ye)},"solar_canopy_form_factors"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.BuildingIntegratedPhotovoltaics",Ye)},"bipv_01")]},"photovoltaic-solar-power"),Object(gf.jsxs)(sP,{title:me.t("menu.concentratedSolarPowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.FocusSunlightWithParabolicDish",Ye)},"parabolic_dish_focus_sunlight"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfParabolicTrough",Ye)},"effect_azimuth_parabolic_trough"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfLatusRectumOfParabolicTrough",Ye)},"effect_latus_rectum_parabolic_trough"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.LinearFresnelReflectors",Ye)},"linear_fresnel_reflectors"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAbsorberPipeHeightForLinearFresnelReflectors",Ye)},"effect_absorber_pipe_height"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfLinearFresnelReflectors",Ye)},"effect_azimuth_fresnel_reflector"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.LinearFresnelReflectorsWithTwoAbsorbers",Ye)},"linear_fresnel_reflectors_two_absorbers"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.SolarPowerTower",Ye)},"solar_power_tower"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.CosineEfficiencyOfHeliostats",Ye)},"cosine_efficiency_heliostats"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.ShadowingAndBlockingOfHeliostats",Ye)},"shadowing_blocking_heliostats"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectSolarPowerTowerHeight",Ye)},"effect_solar_power_tower_height")]},"concentrated-solar-power"),Object(gf.jsx)(sP,{title:me.t("menu.otherTypesOfSolarPowerSubMenu",Ye),children:Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherTypesOfSolarPowerTutorials.SolarUpdraftTower",Ye)},"solar_updraft_tower")},"other-types-of-solar-power"),Object(gf.jsxs)(sP,{title:me.t("menu.generativeDesignSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(e){return Ve(e.key,48)},children:me.t("menu.generativeDesignTutorials.MonofacialSolarPanelArrayTiltAngle",Ye)},"Tilt Angle"),Object(gf.jsx)(Qv.a.Item,{onClick:function(e){return Ve(e.key,50)},children:me.t("menu.generativeDesignTutorials.BifacialSolarPanelArrayTiltAngle",Ye)},"Bifacial Tilt Angle"),Object(gf.jsx)(Qv.a.Item,{onClick:function(e){return Ve(e.key,0)},children:me.t("menu.generativeDesignTutorials.OutputOfSolarPanelArrayInDifferentPlaces",Ye)},"Latitude"),Object(gf.jsx)(Qv.a.Item,{onClick:function(e){return Ve(e.key,0)},children:me.t("menu.generativeDesignTutorials.SimpleSolarFarmParetoFront",Ye)},"Pareto Front")]},"generative-design")]},"tutorials"),Object(gf.jsxs)(sP,{title:me.t("menu.examplesSubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.solarEnergySubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.photovoltaicSolarPowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.VegetativeBuffer",Ye)},"vegetative_buffer_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyOverBleachers",Ye)},"solar_canopy_over_bleachers"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyOverGarage",Ye)},"solar_canopy_over_garage"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarBusStop",Ye)},"solar_bus_stop"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarFacadeTesla",Ye)},"solar_facade_tesla"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.Floatovoltaics",Ye)},"floatovoltaics"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.Agrivoltaics",Ye)},"agrivoltaics"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.RainbowSwashSolarFarmBostonMA",Ye)},"rainbow_swash_solar_farm"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.MickeyMouseSolarFarmOrlandoFL",Ye)},"mickey_mouse_solar_farm"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarPanelsOverCanalBakersfieldCA",Ye)},"solar_panels_over_canal"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarNoiseBarrierLexingtonMA",Ye)},"solar_noise_barrier"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.HSATSolarTrackersRaleighNC",Ye)},"solar_farm_hsat_array"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.AADATSolarTrackersLancasterCA",Ye)},"solar_farm_aadat_array")]},"photovoltaic-solar-power-examples"),Object(gf.jsxs)(sP,{title:me.t("menu.concentratedSolarPowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.NevadaSolarOneParabolicTroughArray",Ye)},"nevada_solar_one_parabolic_troughs"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.TooeleParabolicDishArray",Ye)},"tooele_parabolic_dish_array"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.TucsonLinearFresnelReflectors",Ye)},"tucson_sundt_station"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.PS10SolarPowerTower",Ye)},"ps10_solar_power_tower")]},"concentrated-solar-power-examples"),Object(gf.jsx)(sP,{title:me.t("menu.otherTypesOfSolarPowerSubMenu",Ye),children:Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarUpdraftTowerInCity",Ye)},"solar_updraft_tower_city")},"other-types-of-solar-power-examples")]},"solar-energy"),Object(gf.jsxs)(sP,{title:me.t("menu.builtEnvironmentSubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.residentialBuildingsSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ColonialHouse",Ye)},"colonial_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.DutchColonialHouse",Ye)},"dutch_colonial_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.TShapedHouse",Ye)},"t_shaped_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.CapeCodHouseWithGarage",Ye)},"cape_cod_with_garage"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Solarium",Ye)},"solarium"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ButterflyRoofHouse",Ye)},"butterfly_roof_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.AdobeTaosHouse",Ye)},"adobe_taos_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.RanchHouse",Ye)},"ranch_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.BonnetHouse",Ye)},"bonnet_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.BarnStyleHouse",Ye)},"barn_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ModernHouse",Ye)},"modern_house_01")]},"residential_buildings"),Object(gf.jsxs)(sP,{title:me.t("menu.commercialBuildingsSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.WhiteHouse",Ye)},"white_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.BilimMersinTurkiye",Ye)},"bilim_mersin_turkiye"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.SpanishStyleHotel",Ye)},"spanish_style_hotel"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.ApartmentBuilding",Ye)},"apartment_building_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.OfficeBuilding",Ye)},"office_building_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.Hotel",Ye)},"hotel_01")]},"commercial_buildings"),Object(gf.jsxs)(sP,{title:me.t("menu.otherBuildingsSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.Greenhouse",Ye)},"greenhouse"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Church1",Ye)},"church_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Cathedral1",Ye)},"cathedral_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Cathedral2",Ye)},"cathedral_02"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Mosque1",Ye)},"mosque_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.Pavilion",Ye)},"pavilion"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.OctagonalPagoda",Ye)},"octagonal_pagoda"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.OceanFront",Ye)},"ocean_front"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.EgyptianPyramids",Ye)},"egyptian_pyramids"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.MayanPyramid",Ye)},"mayan_pyramid"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.SiOSePol",Ye)},"si_o_se_pol"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.StackedCuboids",Ye)},"stacked_cuboids")]},"other_buildings"),Object(gf.jsxs)(sP,{title:me.t("menu.buildingComplexesSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingComplexExamples.SouthBurlingtonHighSchoolVermont",Ye)},"south_burlington_high_school"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingComplexExamples.MescaleroApacheSchoolNewMexico",Ye)},"mescalero_apache_school")]},"building_complexes"),Object(gf.jsx)(sP,{title:me.t("menu.urbanPlanningSubMenu",Ye),children:Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.urbanPlanningExamples.Heatmap1",Ye)},"heatmap_01")},"urban_planning")]},"built-environment"),Object(gf.jsxs)(sP,{title:me.t("menu.artificialIntelligenceSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.OptimizingTiltAngleOfOneSolarPanelRow",Ye)},"ai_tilt_angle_one_row"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.OptimizingTiltAnglesOfMultipleSolarPanelRows",Ye)},"ai_tilt_angles_multiple_rows"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.SolarFarmGenerativeDesign",Ye)},"ai_solar_farm_design"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.SolarFarmGenerativeDesignWithBlock",Ye)},"ai_solar_farm_design_block"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.FitchburgSolarFarmGenerativeDesign",Ye)},"ai_fitchburg_solar_farm")]},"artificial-intelligence"),Object(gf.jsxs)(sP,{title:me.t("menu.benchmarksSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.SolarRadiationPredictionVsMeasurement",Ye)},"solar_radiation_predicted_vs_measured"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase600",Ye)},"bestest_case_600"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase610",Ye)},"bestest_case_610"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase620",Ye)},"bestest_case_620"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase630",Ye)},"bestest_case_630")]},"benchmarks")]},"examples"),Object(gf.jsxs)(sP,{title:me.t("menu.publicSubMenu",Ye),children:[le.uid&&!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.showModelsGallery=!0,e.leaderboardFlag=!0,e.openModelsMap=!1}))},children:[me.t("menu.ModelsGallery",Ye),"..."]},"my-models"),!j&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.modelsMapFlag=!0,e.modelsMapWeatherStations=!1,e.openModelsMap=!0,e.showModelsGallery=!1})),H&&p((function(e){e.actionInfo={name:"Open Models Map",timestamp:(new Date).getTime()}}))},children:[me.t("menu.ModelsMap",Ye),"..."]},"models-map")]},"public"),Object(gf.jsx)(sP,{title:me.t("menu.languageSubMenu",Ye),children:Object(gf.jsxs)(tb.a.Group,{value:z,style:{height:"170px"},onChange:function(e){p((function(t){switch(t.language=e.target.value,t.language){case"zh_cn":t.locale=Uv.a;break;case"zh_tw":t.locale=Vv.a;break;case"es":t.locale=Gv.a;break;case"tr":t.locale=Bv.a;break;case"ua":t.locale=qv.a;break;default:t.locale=xe.a}}))},children:[Object(gf.jsx)(tb.a,{style:dP,value:"en",children:N.English}),Object(gf.jsx)(tb.a,{style:dP,value:"es",children:N.Spanish}),Object(gf.jsx)(tb.a,{style:dP,value:"zh_cn",children:N.ChineseSimplified}),Object(gf.jsx)(tb.a,{style:dP,value:"zh_tw",children:N.ChineseTraditional}),Object(gf.jsx)(tb.a,{style:dP,value:"tr",children:N.Turkish}),Object(gf.jsx)(tb.a,{style:dP,value:"ua",children:N.Ukrainian})]})},"language"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){be(!0)},children:[me.t("menu.AboutUs",Ye),"..."]},"about")]});return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(lb.a,{overlay:Ze,trigger:["click"],onVisibleChange:function(e){e&&ke(!Fe)},children:Object(gf.jsxs)(uP,{children:[Object(gf.jsx)(fP,{src:ab,title:me.t("tooltip.clickToOpenMenu",Ye)}),Object(gf.jsx)(hP,{children:Object(gf.jsx)("span",{style:{fontSize:"10px",alignContent:"center",cursor:"pointer"},children:me.t("menu.mainMenu",Ye)})})]})}),ve&&Object(gf.jsx)(cb,{close:function(){return be(!1)}}),Pe&&Object(gf.jsx)(qT,{setDialogVisible:Se}),ze&&Object(gf.jsx)(_T,{saveAs:!1,setDialogVisible:Re}),We&&Object(gf.jsx)(_T,{saveAs:!0,setDialogVisible:Ie})]})},yP=n.a.memo(pP),gP=l(541),mP=l.n(gP),wP=function(){var e={lng:Ew(Vi)};return Object(gf.jsx)(mP.a,{location:"bottom",buttonText:me.t("cookie.Accept",e),cookieName:"AladdinCookieName",style:{background:"#2B373B",textAlign:"center",zIndex:99999},buttonStyle:{color:"#4e503b",fontSize:"12px"},expires:150,children:me.t("cookie.Statement",e)})},xP=.7/Math.cos(Tw.toRadians(42.2845513)),vP=function(){var e,t,l=Ew(si),a=Ew(i.latitude),n=Ew(i.longitude),c=Ew(o.mapZoom),s=Ew(o.mapType),d=Object(r.useRef)(),u=Object(Wy.a)("satellite"===s||"hybrid"===s?"https://maps.googleapis.com/maps/api/staticmap?maptype=satellite¢er="+a+","+n+"&zoom="+c+"&size="+(e=640)+"x"+e+"&scale=2&key=AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs":function(e,t,l,a){return"https://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&style=feature:poi|element:labels|visibility:off¢er="+t+","+l+"&zoom="+a+"&size="+e+"x"+e+"&scale=2&key=AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs"}(640,a,n,c));t=21===c?.5:20===c?1:Math.pow(2,20-c);var f=xP*Math.cos(Tw.toRadians(a))*t;return u?Object(gf.jsxs)("mesh",{rotation:[0,0,0],position:[0,0,0],renderOrder:-1,scale:[f,f,1],receiveShadow:!0,ref:d,onContextMenu:function(e){e.intersections.length>0&&(e.intersections[0].object===d.current&&l((function(t){Yy.selectNone(t),t.pastePoint.copy(e.intersections[0].point),t.clickObjectType=V.Ground,t.contextMenuObjectType=V.Ground,t.pasteNormal=Rt})))},children:[Object(gf.jsx)("planeBufferGeometry",{args:[100,100]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",depthTest:!1,side:Me.DoubleSide,map:u,opacity:1})]}):Object(gf.jsx)(gf.Fragment,{})},bP=n.a.memo(vP),AP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Ew(si),i=Ew(Vi),r=Ew(ls),n=Ew(os),c=Ew(qc),s=Ew(Sr),u=Tw.isMac();return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(n&&n.length>0){var e=r();if(e.length>0){var t={name:"Paste to Point",timestamp:Date.now(),pastedElements:e.map((function(e){return Object(d.a)({},e)})),undo:function(){var e,l=Object(f.a)(t.pastedElements);try{for(l.s();!(e=l.n()).done;){var a=e.value;c(a.id,!1)}}catch(o){l.e(o)}finally{l.f()}},redo:function(){o((function(e){var l;(l=e.elements).push.apply(l,Object(h.a)(t.pastedElements)),e.selectedElement=t.pastedElements[0],e.updateElementOnRoofFlag=!0}))}};s(t)}}},style:{paddingLeft:l},children:[me.t("word.Paste",{lng:i}),Object(gf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",u?"\u2318":"Ctrl","+V)"]})]},a)},TP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Ew(si),i=Ew(Vi),r=Ew(Kc),n=Ew(ln),c=Ew(Gi),s=Tw.isMac();return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n&&(r(n.id),c&&o((function(e){e.actionInfo={name:"Copy",timestamp:(new Date).getTime(),elementId:n.id,elementType:n.type}})))},style:{paddingLeft:l},children:[me.t("word.Copy",{lng:i}),Object(gf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",s?"\u2318":"Ctrl","+C)"]})]},a)},PP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Ew(si),i=Ew(Vi),n=Ew(qc),c=Ew(ln),s=Ew(Sr),d=Tw.isMac(),u=Object(r.useMemo)((function(){return{lng:i}}),[i]);return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(c&&c.type!==V.Roof)if(c.locked)Kh(me.t("message.ThisElementIsLocked",u));else{var e=n(c.id,!0);if(0===e.length)return;if(Tw.isElementTriggerAutoDeletion(e[0]))Et.getState().setListenToAutoDeletionByCut(!0),Tf.getState().setPrimitiveStore("selectedElementId",c.id);else{var t={name:"Cut",timestamp:Date.now(),deletedElements:e,selectedElementId:c.id,undo:function(){var e=t.deletedElements;if(0!==e.length){var l=e.find((function(e){return e.id===t.selectedElementId}));l&&o((function(t){var a,o=Object(f.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value;t.elements.push(i)}}catch(h){o.e(h)}finally{o.f()}if(l.type===V.Wall){var r=l,n=null,c=null;if(r.leftJoints.length>0&&(n=r.leftJoints[0]),r.rightJoints.length>0&&(c=r.rightJoints[0]),n||c){var s,d=Object(f.a)(t.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;u.id===n&&u.type===V.Wall&&(u.rightJoints[0]=r.id),u.id===c&&u.type===V.Wall&&(u.leftJoints[0]=r.id)}}catch(h){d.e(h)}finally{d.f()}}}}))}},redo:function(){t.deletedElements&&t.deletedElements.length>0&&n(t.deletedElements[0].id,!0)}};s(t)}}},style:{paddingLeft:l},children:[me.t("word.Cut",{lng:i}),Object(gf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",d?"\u2318":"Ctrl","+X)"]})]},a)},SP=function(e){var t=e.keyName,l=Ew(Vi),a=Ew(pn),o=Ew(Sr),i=Ew((function(e){return e.elements.find((function(t){return e.selectedElementIdSet.has(t.id)}))})),r=function(e){i&&a(i.id,e)};return Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:null===i||void 0===i?void 0:i.locked,onChange:function(e){var t=e.target.checked,l={name:"Lock",timestamp:Date.now(),checked:t,selectedElementId:null===i||void 0===i?void 0:i.id,selectedElementType:null===i||void 0===i?void 0:i.type,undo:function(){r(!l.checked)},redo:function(){r(l.checked)}};o(l),r(t)},children:me.t("word.Lock",{lng:l})})},t)},jP=l(45),HP=l.n(jP),zP=function(e){var t,l=Object(r.useState)(null!==(t=null===e||void 0===e?void 0:e.label)&&void 0!==t?t:""),a=Object(u.a)(l,2),o=a[0],i=a[1];return Object(r.useEffect)((function(){(null===e||void 0===e?void 0:e.label)&&i(e.label)}),[null===e||void 0===e?void 0:e.id]),{labelText:o,setLabelText:i}},RP=function(e){var t=Ew(Sr),l=Ew(mn);return function(){if(e){var a={name:"Show Label for "+e.type,timestamp:Date.now(),checked:!e.showLabel,selectedElementId:e.id,selectedElementType:e.type,undo:function(){l(e.id,!a.checked)},redo:function(){l(e.id,a.checked)}};t(a),l(e.id,!e.showLabel)}}},DP=function(e,t){var l=Ew(gn),a=Ew(Sr);return function(){if(e){var o=e.label,i={name:"Set Label for "+e.type,timestamp:Date.now(),oldValue:o,newValue:t,changedElementId:e.id,changedElementType:e.type,undo:function(){l(i.changedElementId,i.oldValue)},redo:function(){l(i.changedElementId,i.newValue)}};a(i),l(e.id,t)}}},MP=function(e){var t=Ew(si),l=Ew(Sr),a=function(l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===(null===e||void 0===e?void 0:e.id)){i.labelFontSize=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return function(t){if(e){var o,i=null!==(o=e.labelFontSize)&&void 0!==o?o:20,r=t,n={name:"Set Label Font Size for "+e.type,timestamp:Date.now(),oldValue:i,newValue:r,undo:function(){a(n.oldValue)},redo:function(){a(n.newValue)}};l(n),a(r)}}},WP=function(e){var t=Ew(si),l=Ew(Sr),a=function(l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===(null===e||void 0===e?void 0:e.id)){i.labelSize=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return function(t){if(e){var o,i=null!==(o=e.labelSize)&&void 0!==o?o:.2,r=t,n={name:"Set Label Size for "+e.type,timestamp:Date.now(),oldValue:i,newValue:r,undo:function(){a(n.oldValue)},redo:function(){a(n.newValue)}};l(n),a(r)}}},IP=function(e){var t=Ew(si),l=Ew(Sr),a=function(l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===(null===e||void 0===e?void 0:e.id)){i.labelColor=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return function(t){if(e){var o,i=null!==(o=e.labelColor)&&void 0!==o?o:"white",r=t,n={name:"Set Label Color for "+e.type,timestamp:Date.now(),oldValue:i,newValue:r,undo:function(){a(n.oldValue)},redo:function(){a(n.newValue)}};l(n),a(r)}}},CP=function(e){var t=Ew(si),l=Ew(Sr),a=function(l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===(null===e||void 0===e?void 0:e.id)){i.labelHeight=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return function(t){if(e){var o,i=null!==(o=e.labelHeight)&&void 0!==o?o:e.lz/2+.2,r=t,n={name:"Set Label Height for "+e.type,timestamp:Date.now(),oldValue:i,newValue:r,undo:function(){a(n.oldValue)},redo:function(){a(n.newValue)}};l(n),a(r)}}},OP=function(e){return Ew((function(t){if(t.selectedElement)return t.elements.find((function(l){var a;return l.id===(null===(a=t.selectedElement)||void 0===a?void 0:a.id)&&l.type===e}))}))},FP=function(e){var t=Object(r.useState)(e),l=Object(u.a)(t,2),a=l[0],o=l[1];return[a,function(e){o(e.hex)}]},kP=function(e){var t=e.width,l=e.title,a=e.rejectedMessage,o=e.onApply,i=e.onClose,n=e.onClickOk,c=e.onClickCancel,s=e.children,d=Ew(Ci),f=Ew(Oi),h=$f(),p=Object(r.useState)({left:0,top:0,bottom:0,right:0}),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(!1),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useRef)(null),T=function(){n?n():(o(),i(),d(0))};Object(r.useEffect)((function(){var e=function(e){"Enter"===e.key&&T()};return window.addEventListener("keydown",e),function(){return window.removeEventListener("keydown",e)}}),[T]);var P=!!a&&a.length>0;return Object(gf.jsx)(Zv.a,{width:t,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return b(!0)},onMouseOut:function(){return b(!1)},children:[l,P&&Object(gf.jsx)("span",{style:{color:"red",fontWeight:"bold"},children:a})]}),footer:[Object(gf.jsx)(xv.a,{onClick:o,children:me.t("word.Apply",h)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){c?c():(i(),f())},children:me.t("word.Cancel",h)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:T,children:me.t("word.OK",h)},"OK")],onCancel:i,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!v,bounds:g,onStart:function(e,t){return function(e,t){if(A.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=A.current.getBoundingClientRect();m({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:A,children:e})})},children:s})},YP=l(64),LP=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Dn),i=Ew(Zr),n=Ew(In),c=Ew(Sr),s=Ew(Jn),d=Ew(Ci),h=OP(V.Foundation),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.color)&&void 0!==t?t:"#808080"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&e.has(i.id))if(void 0!==t)i.color=t;else{var r=e.get(i.id);void 0!==r&&(i.color=r)}}}catch(n){o.e(n)}finally{o.f()}}))},v=function(e){if(h&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.color)return!0}}catch(n){l.e(n)}finally{l.f()}break;case _.AllObjectsOfThisType:var o,i=Object(f.a)(Ew.getState().elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.Foundation&&!r.locked&&e!==r.color)return!0}}catch(n){i.e(n)}finally{i.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.color))return!0}return!1}(e)){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(Ew.getState().elements);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.color)&&void 0!==p?p:"#808080")}}catch(H){r.e(H)}finally{r.f()}var g={name:"Set Color for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){x(g.oldValues)},redo:function(){x(g.oldValues,g.newValue)}};c(g),x(l,e),d(Ew.getState().applyCount+1);break;case _.AllObjectsOfThisType:var m,w=new Map,v=Object(f.a)(Ew.getState().elements);try{for(v.s();!(m=v.n()).done;){var b,A=m.value;if(A.type===V.Foundation)w.set(A.id,null!==(b=A.color)&&void 0!==b?b:"#808080")}}catch(H){v.e(H)}finally{v.f()}var T={name:"Set Color for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(H){t.e(H)}finally{t.f()}},redo:function(){n(V.Foundation,T.newValue)}};c(T),n(V.Foundation,e),d(Ew.getState().applyCount+1);break;default:var P=i(h.id),S=P?P.color:h.color,j={name:"Set Color of Selected Foundation",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){o(j.changedElementId,j.oldValue)},redo:function(){o(j.changedElementId,j.newValue)}};c(j),o(h.id,e),d(Ew.getState().applyCount+1)}a((function(t){t.actionState.foundationColor=e}))}};return Object(gf.jsx)(kP,{width:600,title:me.t("word.Color",w),onApply:function(){v(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",w)})]})})})]})})},EP=function(e){var t,l=e.setDialogVisible,a=Ew(Vi),o=Ew(Fi),i=Ew(Zr),n=Ew(wn),c=Ew(An),s=Ew(Pn),h=Ew(qn),p=Ew(en),y=Ew(cn),g=Ew(Sr),m=Ew(Jn),w=Ew(si),x=Ew(Ii),v=Ew(Ci),b=Ew(Oi),A=OP(V.Foundation),T=Object(r.useState)(null!==(t=null===A||void 0===A?void 0:A.lx)&&void 0!==t?t:.1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(new Map),O=Object(r.useRef)(!1),F=Object(r.useRef)(),k={lng:a},Y=function(e){return!function(e){if(A){switch(m){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a,r=p(i.id);if(r.length>0&&!Tw.doesNewSizeContainAllChildren(i,r,e,i.ly))return!1}}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(o);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Foundation){var d=s,u=p(d.id);if(u.length>0&&!Tw.doesNewSizeContainAllChildren(d,u,e,d.ly))return!1}}}catch(y){c.e(y)}finally{c.f()}break;default:var h=p(A.id);if(h.length>0)return Tw.doesNewSizeContainAllChildren(A,h,e,A.ly)}return!0}}(e)},L=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},E=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(c){o.e(c)}finally{o.f()}w((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.id){i.parentId=xt;var r=new Me.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,D.current.set(i.id,new Me.Vector3(r.x,r.y,0)),z.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},U=function(e,t){var l=p(e.id),a=e.rotation[2];if(M.current.clear(),C.current.clear(),l.length>0){var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;switch(r.type){case V.Wall:break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var s=new Me.Vector2(r.cx*e.lx,r.cy*e.ly).rotateAround(Dt,a);M.current.set(r.id,s),R.current.set(r.id,new Me.Vector3(r.cx,r.cy));break;case V.Polygon:var u,y=r,g=[],m=Object(f.a)(y.vertices);try{for(m.s();!(u=m.n()).done;){var w=u.value;g.push(new Me.Vector2(w.x*e.lx,w.y*e.ly).rotateAround(Dt,a))}}catch(J){m.e(J)}finally{m.f()}C.current.set(r.id,g),W.current.set(r.id,y.vertices.map((function(e){return Object(d.a)({},e)})));break;case V.Human:case V.Tree:R.current.set(r.id,new Me.Vector3(r.cx,r.cy,r.cz))}}}catch(J){i.e(J)}finally{i.f()}}if(c(e.id,t),l.length>0){var x,v=Object(f.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;switch(b.type){case V.Wall:break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var A=M.current.get(b.id);if(A){var T=new Me.Vector2(A.x,A.y).rotateAround(Dt,-a).x/t;n(b.id,T),D.current.set(b.id,new Me.Vector3(T,b.cy))}break;case V.Polygon:var P=C.current.get(b.id);if(P){var S,j=[],z=Object(f.a)(P);try{for(z.s();!(S=z.n()).done;){var O=S.value.rotateAround(Dt,-a),F=O.x/t,k=O.y/e.ly;j.push({x:F,y:k})}}catch(J){z.e(J)}finally{z.f()}h(b.id,j),I.current.set(b.id,j.map((function(e){return Object(d.a)({},e)})))}break;case V.Human:case V.Tree:if(D.current.set(b.id,new Me.Vector3(b.cx,b.cy,b.cz)),H.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var Y=Et.getState().contentRef,U=L(null===Y||void 0===Y?void 0:Y.current,e.id);E(U,e,b)}}else if(Math.abs(Math.abs(b.cx)-e.lx/2)0?t:-t)/2;n(b.id,N),D.current.set(b.id,new Me.Vector3(N,b.cy,b.cz))}}}}catch(J){v.e(J)}finally{v.f()}}},N=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=L(null===a||void 0===a?void 0:a.current,t),i=L(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=L(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},J=function(e,t){e&&w((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},G=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.lx=t;else{var r=e.get(i.id);void 0!==r&&(i.lx=r)}}}catch(n){o.e(n)}finally{o.f()}}))},X=function(e){if(A&&function(e){if(A){switch(m){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===A||void 0===A?void 0:A.lx)-e)>At)return!0}return!1}}(e)){var t=i(A.id),l=t?t.lx:A.lx;if(F.current=void 0,O.current=Y(e),O.current)F.current=e,j(l);else switch(R.current.clear(),D.current.clear(),W.current.clear(),I.current.clear(),m){case _.AllSelectedObjectsOfThisType:var a,r=new Map,n=Object(f.a)(o);try{for(n.s();!(a=n.n()).done;){var d=a.value;d.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(d.id)&&r.set(d.id,d.lx)}}catch(K){n.e(K)}finally{n.f()}var p,w=Object(f.a)(o);try{for(w.s();!(p=w.n()).done;){var b=p.value;b.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(b.id)&&U(b,e)}}catch(K){w.e(K)}finally{w.f()}var T={name:"Set Length for Selected Foundations",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(R.current),newChildrenPositionsMap:new Map(D.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(z.current),undo:function(){if(G(T.oldSizes),T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(T.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=T.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=T.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(N(n,c,i),J(n,i))}}catch(K){t.e(K)}finally{t.f()}}if(T.oldChildrenVerticesMap&&T.oldChildrenVerticesMap.size>0){var s,d=Object(f.a)(T.oldChildrenVerticesMap.entries());try{for(d.s();!(s=d.n()).done;){var p=Object(u.a)(s.value,2),g=p[0],m=p[1];h(g,m)}}catch(K){d.e(K)}finally{d.f()}}},redo:function(){if(G(T.oldSizes,T.newSize),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(T.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=T.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=T.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(N(c,n,i),J(c,i))}}catch(K){t.e(K)}finally{t.f()}}if(T.newChildrenVerticesMap&&T.newChildrenVerticesMap.size>0){var s,d=Object(f.a)(T.newChildrenVerticesMap.entries());try{for(d.s();!(s=d.n()).done;){var p=Object(u.a)(s.value,2),g=p[0],m=p[1];h(g,m)}}catch(K){d.e(K)}finally{d.f()}}}};g(T),v(x+1);break;case _.AllObjectsOfThisType:var P,S=new Map,M=Object(f.a)(o);try{for(M.s();!(P=M.n()).done;){var C=P.value;C.type===V.Foundation&&S.set(C.id,C.lx)}}catch(K){M.e(K)}finally{M.f()}var k,L=Object(f.a)(o);try{for(L.s();!(k=L.n()).done;){var E=k.value;E.type===V.Foundation&&U(E,e)}}catch(K){L.e(K)}finally{L.f()}var X={name:"Set Length for All Foundations",timestamp:Date.now(),oldSizes:S,newSize:e,oldChildrenPositionsMap:new Map(R.current),newChildrenPositionsMap:new Map(D.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(z.current),undo:function(){var e,t=Object(f.a)(X.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(K){t.e(K)}finally{t.f()}if(X.oldChildrenPositionsMap&&X.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(X.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,s,d=Object(u.a)(i.value,2),p=d[0],g=d[1];y(p,g.x,g.y,g.z);var m=null===(n=X.oldChildrenParentIdMap)||void 0===n?void 0:n.get(p),w=null===(s=X.newChildrenParentIdMap)||void 0===s?void 0:s.get(p);m&&w&&m!==w&&(N(m,w,p),J(m,p))}}catch(K){r.e(K)}finally{r.f()}}if(X.oldChildrenVerticesMap&&X.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(X.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(K){v.e(K)}finally{v.f()}}},redo:function(){if(s(V.Foundation,X.newSize),X.newChildrenPositionsMap&&X.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(X.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=X.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=X.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(N(c,n,i),J(c,i))}}catch(K){t.e(K)}finally{t.f()}}if(X.newChildrenVerticesMap&&X.newChildrenVerticesMap.size>0){var d,p=Object(f.a)(X.newChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];h(m,w)}}catch(K){p.e(K)}finally{p.f()}}}};g(X),v(x+1);break;default:U(A,e);var B={name:"Set Foundation Length",timestamp:Date.now(),oldSize:l,newSize:e,resizedElementId:A.id,resizedElementType:A.type,oldChildrenPositionsMap:new Map(R.current),newChildrenPositionsMap:new Map(D.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(z.current),undo:function(){if(c(A.id,B.oldSize),B.oldChildrenPositionsMap&&B.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(B.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=B.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=B.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(N(n,s,i),J(n,i))}}catch(K){t.e(K)}finally{t.f()}}if(B.oldChildrenVerticesMap&&B.oldChildrenVerticesMap.size>0){var d,p=Object(f.a)(B.oldChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];h(m,w)}}catch(K){p.e(K)}finally{p.f()}}},redo:function(){if(c(A.id,B.newSize),B.newChildrenPositionsMap&&B.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(B.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=B.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=B.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(N(s,n,i),J(s,i))}}catch(K){t.e(K)}finally{t.f()}}if(B.newChildrenVerticesMap&&B.newChildrenVerticesMap.size>0){var d,p=Object(f.a)(B.newChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];h(m,w)}}catch(K){p.e(K)}finally{p.f()}}}};g(B),v(x+1)}}},B=function(){l(!1)},K=O.current?": "+me.t("message.NotApplicableToSelectedAction",k)+(void 0!==F.current?" ("+F.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Length",k),rejectedMessage:K,onApply:function(){X(S)},onClose:B,onClickCancel:function(){B(),b()},onClickOk:function(){X(S),O.current||(l(!1),v(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:S,onChange:j}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",k),": [0.1, 1000] ",me.t("word.MeterAbbreviation",k)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",k)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:m,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",k)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",k)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",k)})]})})})]})})},UP=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(cn),n=Ew(xn),c=Ew(Sn),s=Ew(Hn),h=Ew(qn),p=Ew(en),y=Ew(Sr),g=Ew(Jn),m=Ew(si),w=Ew(Ii),x=Ew(Ci),v=Ew(Oi),b=OP(V.Foundation),A=Object(r.useState)(null!==(t=null===b||void 0===b?void 0:b.ly)&&void 0!==t?t:.1),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),O=Object(r.useRef)(),F=$f(),k=function(e){return!function(e){if(b){switch(g){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o,r=p(i.id);if(r.length>0&&!Tw.doesNewSizeContainAllChildren(i,r,i.lx,e))return!1}}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(a);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Foundation){var d=s,u=p(d.id);if(u.length>0&&!Tw.doesNewSizeContainAllChildren(d,u,d.lx,e))return!1}}}catch(y){c.e(y)}finally{c.f()}break;default:var h=p(b.id);if(h.length>0)return Tw.doesNewSizeContainAllChildren(b,h,b.lx,e)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},L=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(c){o.e(c)}finally{o.f()}m((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.id){i.parentId=xt;var r=new Me.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new Me.Vector3(r.x,r.y,0)),H.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},E=function(e,t){var l=p(e.id),a=e.rotation[2];if(D.current.clear(),I.current.clear(),l.length>0){var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;switch(r.type){case V.Wall:break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var s=new Me.Vector2(r.cx*e.lx,r.cy*e.ly).rotateAround(Dt,a);D.current.set(r.id,s),z.current.set(r.id,new Me.Vector3(r.cx,r.cy));break;case V.Polygon:var u,y=r,g=[],m=Object(f.a)(y.vertices);try{for(m.s();!(u=m.n()).done;){var w=u.value;g.push(new Me.Vector2(w.x*e.lx,w.y*e.ly).rotateAround(Dt,a))}}catch(J){m.e(J)}finally{m.f()}I.current.set(r.id,g),M.current.set(r.id,y.vertices.map((function(e){return Object(d.a)({},e)})));break;case V.Human:case V.Tree:z.current.set(r.id,new Me.Vector3(r.cx,r.cy,r.cz))}}}catch(J){i.e(J)}finally{i.f()}}if(c(e.id,t),l.length>0){var x,v=Object(f.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;switch(b.type){case V.Wall:break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var A=D.current.get(b.id);if(A){var T=new Me.Vector2(A.x,A.y).rotateAround(Dt,-a).y/t;n(b.id,T),R.current.set(b.id,new Me.Vector3(b.cx,T))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,H=[],C=Object(f.a)(P);try{for(C.s();!(S=C.n()).done;){var O=S.value.rotateAround(Dt,-a),F=O.x/e.lx,k=O.y/t;H.push({x:F,y:k})}}catch(J){C.e(J)}finally{C.f()}h(b.id,H),W.current.set(b.id,H.map((function(e){return Object(d.a)({},e)})))}break;case V.Human:case V.Tree:if(R.current.set(b.id,new Me.Vector3(b.cx,b.cy,b.cz)),j.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var E=Et.getState().contentRef,U=Y(null===E||void 0===E?void 0:E.current,e.id);L(U,e,b)}}else if(Math.abs(Math.abs(b.cy)-e.ly/2)0?t:-t)/2;n(b.id,N),R.current.set(b.id,new Me.Vector3(b.cz,N,b.cz))}}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=Y(null===a||void 0===a?void 0:a.current,t),i=Y(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=Y(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},N=function(e,t){e&&m((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},J=function(e){if(b&&function(e){if(b){switch(g){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===b||void 0===b?void 0:b.ly)-e)>At)return!0}return!1}}(e)){var t=o(b.id),l=t?t.ly:b.ly;if(O.current=void 0,C.current=k(e),C.current)O.current=e,S(l);else switch(z.current.clear(),R.current.clear(),M.current.clear(),W.current.clear(),g){case _.AllSelectedObjectsOfThisType:var r,n=new Map,d=Object(f.a)(a);try{for(d.s();!(r=d.n()).done;){var p=r.value;p.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(p.id)&&n.set(p.id,p.ly)}}catch(B){d.e(B)}finally{d.f()}var m,v=Object(f.a)(a);try{for(v.s();!(m=v.n()).done;){var A=m.value;A.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(A.id)&&E(A,e)}}catch(B){v.e(B)}finally{v.f()}var T={name:"Set Width for Selected Foundations",timestamp:Date.now(),oldSizes:n,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(T.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var r,n=Object(f.a)(T.oldChildrenPositionsMap.entries());try{for(n.s();!(r=n.n()).done;){var s,d,p=Object(u.a)(r.value,2),y=p[0],g=p[1];i(y,g.x,g.y,g.z);var m=null===(s=T.oldChildrenParentIdMap)||void 0===s?void 0:s.get(y),w=null===(d=T.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(B){n.e(B)}finally{n.f()}}if(T.oldChildrenVerticesMap&&T.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(T.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],P=b[1];h(A,P)}}catch(B){v.e(B)}finally{v.f()}}},redo:function(){var e,t=Object(f.a)(T.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];c(a,T.newSize)}}catch(B){t.e(B)}finally{t.f()}if(T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var o,r=Object(f.a)(T.newChildrenPositionsMap.entries());try{for(r.s();!(o=r.n()).done;){var n,s,d=Object(u.a)(o.value,2),p=d[0],y=d[1];i(p,y.x,y.y,y.z);var g=null===(n=T.oldChildrenParentIdMap)||void 0===n?void 0:n.get(p),m=null===(s=T.newChildrenParentIdMap)||void 0===s?void 0:s.get(p);g&&m&&g!==m&&(U(m,g,p),N(m,p))}}catch(B){r.e(B)}finally{r.f()}}if(T.newChildrenVerticesMap&&T.newChildrenVerticesMap.size>0){var w,x=Object(f.a)(T.newChildrenVerticesMap.entries());try{for(x.s();!(w=x.n()).done;){var v=Object(u.a)(w.value,2),b=v[0],A=v[1];h(b,A)}}catch(B){x.e(B)}finally{x.f()}}}};y(T),x(w+1);break;case _.AllObjectsOfThisType:var P,D=new Map,I=Object(f.a)(a);try{for(I.s();!(P=I.n()).done;){var F=P.value;F.type===V.Foundation&&D.set(F.id,F.ly)}}catch(B){I.e(B)}finally{I.f()}var Y,L=Object(f.a)(a);try{for(L.s();!(Y=L.n()).done;){var J=Y.value;J.type===V.Foundation&&E(J,e)}}catch(B){L.e(B)}finally{L.f()}var G={name:"Set Width for All Foundations",timestamp:Date.now(),oldSizes:D,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(G.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}if(G.oldChildrenPositionsMap&&G.oldChildrenPositionsMap.size>0){var r,n=Object(f.a)(G.oldChildrenPositionsMap.entries());try{for(n.s();!(r=n.n()).done;){var s,d,p=Object(u.a)(r.value,2),y=p[0],g=p[1];i(y,g.x,g.y,g.z);var m=null===(s=G.oldChildrenParentIdMap)||void 0===s?void 0:s.get(y),w=null===(d=G.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(B){n.e(B)}finally{n.f()}}if(G.oldChildrenVerticesMap&&G.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(G.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(B){v.e(B)}finally{v.f()}}},redo:function(){if(s(V.Foundation,G.newSize),G.newChildrenPositionsMap&&G.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(G.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),r=o[0],n=o[1];i(r,n.x,n.y,n.z);var c=null===(l=G.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=G.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);c&&d&&c!==d&&(U(d,c,r),N(d,r))}}catch(B){t.e(B)}finally{t.f()}}if(G.newChildrenVerticesMap&&G.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(G.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(B){y.e(B)}finally{y.f()}}}};y(G),x(w+1);break;default:E(b,e);var X={name:"Set Foundation Width",timestamp:Date.now(),oldSize:l,newSize:e,resizedElementId:b.id,resizedElementType:b.type,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){if(c(b.id,X.oldSize),X.oldChildrenPositionsMap&&X.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(X.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),r=o[0],n=o[1];i(r,n.x,n.y,n.z);var s=null===(l=X.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=X.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);s&&d&&s!==d&&(U(s,d,r),N(s,r))}}catch(B){t.e(B)}finally{t.f()}}if(X.oldChildrenVerticesMap&&X.oldChildrenVerticesMap.size>0){var p,y=Object(f.a)(X.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(B){y.e(B)}finally{y.f()}}},redo:function(){if(c(b.id,X.newSize),X.newChildrenPositionsMap&&X.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(X.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),r=o[0],n=o[1];i(r,n.x,n.y,n.z);var s=null===(l=X.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=X.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);s&&d&&s!==d&&(U(d,s,r),N(d,r))}}catch(B){t.e(B)}finally{t.f()}}if(X.newChildrenVerticesMap&&X.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(X.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(B){y.e(B)}finally{y.f()}}}};y(X),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",F)+(void 0!==O.current?" ("+O.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Width",F),rejectedMessage:X,onApply:function(){J(P)},onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},onClose:G,children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [0.1, 1000] ",me.t("word.MeterAbbreviation",F)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",F)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:g,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",F)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",F)})]})})})]})})},NP=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(cn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.lz)&&void 0!==t?t:.1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useRef)(new Map),v=Object(r.useRef)(new Map),b=Object(r.useRef)(new Map),A=Object(r.useRef)(new Map),T=$f(),P=function(e,t){a((function(l){var a=l.elements.find((function(t){return t.id===e}));a&&(a.lz=t,a.cz=t/2)}))},S=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lz=t,i.cz=t/2)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},H=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(s){o.e(s)}finally{o.f()}l.parentId=xt;var c=new Me.Vector2(l.cx,l.cy).rotateAround(Dt,-t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));l.cx=c.x,l.cy=c.y,l.cz=0,A.current.set(l.id,new Me.Vector3(c.x,c.y,0)),v.current.set(l.id,xt)}},z=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.parentId===e.id&&(x.current.set(i.id,e.id),b.current.set(i.id,new Me.Vector3(i.cx,i.cy,i.cz)),Tw.isPlantOrHuman(i)))if(Math.abs(i.cz-e.lz/2)t/2){var n=Et.getState().contentRef,c=j(null===n||void 0===n?void 0:n.current,e.id);H(c,e,i)}else i.cz=r,A.current.set(i.id,new Me.Vector3(i.cx,i.cy,r))}}}catch(s){o.e(s)}finally{o.f()}}))},R=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=j(null===a||void 0===a?void 0:a.current,t),i=j(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=j(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},D=function(e,t){e&&a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},M=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.lz=t,i.cz=t/2;else{var r=e.get(i.id);void 0!==r&&(i.lz=r,i.cz=r/2)}}}catch(n){o.e(n)}finally{o.f()}}))},W=function(e){if(p&&function(e){if(p){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lz-e)>At)return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(Math.abs(d.lz-e)>At)return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(Math.abs((null===p||void 0===p?void 0:p.lz)-e)>At)return!0}return!1}}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Foundation&&!y.locked&&Ew.getState().selectedElementIdSet.has(y.id)&&l.set(y.id,y.lz)}}catch(U){r.e(U)}finally{r.f()}var g,m=Object(f.a)(o);try{for(m.s();!(g=m.n()).done;){var w=g.value;w.type===V.Foundation&&!w.locked&&Ew.getState().selectedElementIdSet.has(w.id)&&z(w,e)}}catch(U){m.e(U)}finally{m.f()}var T={name:"Set Height for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,oldChildrenPositionsMap:new Map(b.current),newChildrenPositionsMap:new Map(A.current),oldChildrenParentIdMap:new Map(x.current),newChildrenParentIdMap:new Map(v.current),undo:function(){if(M(T.oldValues),T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(T.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];s(i,r.x,r.y,r.z);var n=null===(l=T.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=T.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(n,c,i),D(n,i))}}catch(U){t.e(U)}finally{t.f()}}},redo:function(){var e=T.newValue;if(M(T.oldValues,e),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(T.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];s(r,n.x,n.y,n.z);var c=null===(a=T.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),d=null===(o=T.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&d&&c!==d&&(R(d,c,r),D(d,r))}}catch(U){l.e(U)}finally{l.f()}}}};n(T),M(l,e),h(d+1);break;case _.AllObjectsOfThisType:var j,H=new Map,W=Object(f.a)(o);try{for(W.s();!(j=W.n()).done;){var I=j.value;I.type===V.Foundation&&H.set(I.id,I.lz)}}catch(U){W.e(U)}finally{W.f()}var C,O=Object(f.a)(o);try{for(O.s();!(C=O.n()).done;){var F=C.value;F.type===V.Foundation&&z(F,e)}}catch(U){O.e(U)}finally{O.f()}var k={name:"Set Height for All Foundations",timestamp:Date.now(),oldValues:H,newValue:e,oldChildrenPositionsMap:new Map(b.current),newChildrenPositionsMap:new Map(A.current),oldChildrenParentIdMap:new Map(x.current),newChildrenParentIdMap:new Map(v.current),undo:function(){var e,t=Object(f.a)(k.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];P(a,o)}}catch(U){t.e(U)}finally{t.f()}if(k.oldChildrenPositionsMap&&k.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(k.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,d=Object(u.a)(i.value,2),h=d[0],p=d[1];s(h,p.x,p.y,p.z);var y=null===(n=k.oldChildrenParentIdMap)||void 0===n?void 0:n.get(h),g=null===(c=k.newChildrenParentIdMap)||void 0===c?void 0:c.get(h);y&&g&&y!==g&&(R(y,g,h),D(y,h))}}catch(U){r.e(U)}finally{r.f()}}},redo:function(){var e=k.newValue;if(S(V.Foundation,e),k.newChildrenPositionsMap&&k.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(k.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];s(r,n.x,n.y,n.z);var c=null===(a=k.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),d=null===(o=k.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&d&&c!==d&&(R(d,c,r),D(d,r))}}catch(U){l.e(U)}finally{l.f()}}}};n(k),S(V.Foundation,e),h(d+1);break;default:var Y=i(p.id),L=Y?Y.lz:p.lz;z(p,e),P(p.id,e);var E={name:"Set Foundation Height",timestamp:Date.now(),oldValue:L,newValue:e,oldChildrenPositionsMap:new Map(b.current),newChildrenPositionsMap:new Map(A.current),oldChildrenParentIdMap:new Map(x.current),newChildrenParentIdMap:new Map(v.current),changedElementId:p.id,changedElementType:p.type,undo:function(){if(P(E.changedElementId,E.oldValue),E.oldChildrenPositionsMap&&E.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(E.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];s(i,r.x,r.y,r.z);var n=null===(l=E.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=E.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(n,c,i),D(n,i))}}catch(U){t.e(U)}finally{t.f()}}},redo:function(){if(P(E.changedElementId,E.newValue),E.newChildrenPositionsMap&&E.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(E.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];s(i,r.x,r.y,r.z);var n=null===(l=E.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=E.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(c,n,i),D(c,i))}}catch(U){t.e(U)}finally{t.f()}}}};n(E),h(d+1)}a((function(t){t.actionState.foundationHeight=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Height",T),onApply:function(){W(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:10,style:{width:120},step:.1,precision:2,value:m,onChange:function(e){w(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",T),": [0.1, 10] ",me.t("word.MeterAbbreviation",T)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",T)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",T)})]})})})]})})},VP=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(Nn),n=Ew(Vn),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(p&&null!==(t=-(null===p||void 0===p?void 0:p.rotation[2]))&&void 0!==t?t:0),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.rotation[2]=t;else{var r=e.get(i.id);void 0!==r&&(i.rotation[2]=-r)}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){if(p&&function(e){if(p){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(-i.rotation[2]-e)>At)return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(Math.abs(-d.rotation[2]-e)>At)return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(Math.abs(-(null===p||void 0===p?void 0:p.rotation[2])-e)>At)return!0}return!1}}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(y.id)&&l.set(y.id,-y.rotation[2])}}catch(j){r.e(j)}finally{r.f()}var g={name:"Set Azimuth for All Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(g.oldValues)},redo:function(){v(g.oldValues,-g.newValue)}};c(g),v(l,-e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(a);try{for(x.s();!(m=x.n()).done;){var b=m.value;b.type===V.Foundation&&w.set(b.id,-b.rotation[2])}}catch(j){x.e(j)}finally{x.f()}var A={name:"Set Azimuth for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,0,0,-o)}}catch(j){t.e(j)}finally{t.f()}},redo:function(){n(V.Foundation,0,0,-A.newValue)}};c(A),n(V.Foundation,0,0,-e),h(d+1);break;default:var T=o(p.id),P=T?-T.rotation[2]:-p.rotation[2],S={name:"Set Foundation Azimuth",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){i(S.changedElementId,0,0,-S.oldValue)},redo:function(){i(S.changedElementId,0,0,-S.newValue)}};c(S),i(p.id,0,0,-e),h(d+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("word.Azimuth",x),onApply:function(){b(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:-180,max:180,style:{width:120},step:.5,precision:2,value:parseFloat(Tw.toDegrees(m).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){w(Tw.toRadians(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",paddingRight:"6px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [-180\xb0, 180\xb0]",Object(gf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",x),Object(gf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},JP="data:image/png;base64,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",GP="data:image/png;base64,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",XP=l.p+"static/media/foundation_03_menu.1a0820a4.png",BP=l.p+"static/media/foundation_04_menu.cfdf351d.png",KP=l.p+"static/media/foundation_05_menu.7f382511.png",qP="data:image/png;base64,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",QP=l.p+"static/media/foundation_07_menu.cf056d65.png",ZP=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.textureType)&&void 0!==t?t:se.NoTexture),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=db.a.Option,v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){i.textureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Foundation||o.locked||(o.textureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&e.has(i.id))if(void 0!==t)i.textureType=t;else{var r=e.get(i.id);void 0!==r&&(i.textureType=r)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(h&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.textureType)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Foundation&&!n.locked&&e!==n.textureType)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.textureType))return!0}return!1}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.textureType)&&void 0!==p?p:se.NoTexture)}}catch(R){r.e(R)}finally{r.f()}var g={name:"Set Texture for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(g.oldValues)},redo:function(){A(g.oldValues,g.newValue)}};n(g),A(l,e),d(s+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var T,P=m.value;if(P.type===V.Foundation)w.set(P.id,null!==(T=P.textureType)&&void 0!==T?T:se.NoTexture)}}catch(R){x.e(R)}finally{x.f()}var S={name:"Set Texture for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(R){t.e(R)}finally{t.f()}},redo:function(){b(S.newValue)}};n(S),b(e),d(s+1);break;default:var j=i(h.id),H=j?j.textureType:h.textureType,z={name:"Set Texture of Selected Foundation",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(z.changedElementId,z.oldValue)},redo:function(){v(z.changedElementId,z.newValue)}};n(z),v(h.id,e),d(s+1)}a((function(t){t.actionState.foundationTexture=e}))}};return Object(gf.jsx)(kP,{width:500,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:g,onChange:m,children:[Object(gf.jsxs)(x,{value:se.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",w)]},se.NoTexture),Object(gf.jsxs)(x,{value:se.Texture01,children:[Object(gf.jsx)("img",{alt:se.Texture01,src:JP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture01",w)]},se.Texture01),Object(gf.jsxs)(x,{value:se.Texture02,children:[Object(gf.jsx)("img",{alt:se.Texture02,src:GP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture02",w)]},se.Texture02),Object(gf.jsxs)(x,{value:se.Texture03,children:[Object(gf.jsx)("img",{alt:se.Texture03,src:XP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture03",w)]},se.Texture03),Object(gf.jsxs)(x,{value:se.Texture04,children:[Object(gf.jsx)("img",{alt:se.Texture04,src:BP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture04",w)]},se.Texture04),Object(gf.jsxs)(x,{value:se.Texture05,children:[Object(gf.jsx)("img",{alt:se.Texture05,src:KP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture05",w)]},se.Texture05),Object(gf.jsxs)(x,{value:se.Texture06,children:[Object(gf.jsx)("img",{alt:se.Texture06,src:qP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture06",w)]},se.Texture06),Object(gf.jsxs)(x,{value:se.Texture07,children:[Object(gf.jsx)("img",{alt:se.Texture07,src:QP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture07",w)]},se.Texture07)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",w)})]})})})]})})},_P=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.absorberHeight)&&void 0!==t?t:10),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberHeight=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.absorberHeight=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberHeight=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberHeight||Math.abs(i.solarAbsorberPipe.absorberHeight-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.absorberHeight||Math.abs(d.solarAbsorberPipe.absorberHeight-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.absorberHeight)||Math.abs((null===p||void 0===p?void 0:p.absorberHeight)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberHeight)&&void 0!==m?m:10)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Height for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.absorberHeight)&&void 0!==H?H:10)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Height for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.absorberHeight)&&void 0!==t?t:10:null!==(l=p.absorberHeight)&&void 0!==l?l:10;v(h.id,e);var W={name:"Set Absorber Height on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberHeight",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:50,style:{width:120},step:.5,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [1, 50] ",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},$P=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.absorberAbsorptance)&&void 0!==t?t:.95),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberAbsorptance=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.absorberAbsorptance=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberAbsorptance=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberAbsorptance||Math.abs(i.solarAbsorberPipe.absorberAbsorptance-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.absorberAbsorptance||Math.abs(d.solarAbsorberPipe.absorberAbsorptance-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.absorberAbsorptance)||Math.abs((null===p||void 0===p?void 0:p.absorberAbsorptance)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberAbsorptance)&&void 0!==m?m:.95)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Pipe Absorptance for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.absorberAbsorptance)&&void 0!==H?H:.95)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Pipe Absorptance for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.absorberAbsorptance)&&void 0!==t?t:.95:null!==(l=p.absorberAbsorptance)&&void 0!==l?l:.95;v(h.id,e);var W={name:"Set Absorber Pipe Absorptance on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberAbsorptance",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},eS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.absorberOpticalEfficiency)&&void 0!==t?t:.7),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberOpticalEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.absorberOpticalEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberOpticalEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberOpticalEfficiency||Math.abs(i.solarAbsorberPipe.absorberOpticalEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.absorberOpticalEfficiency||Math.abs(d.solarAbsorberPipe.absorberOpticalEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.absorberOpticalEfficiency)||Math.abs((null===p||void 0===p?void 0:p.absorberOpticalEfficiency)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==m?m:.7)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Optical Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==H?H:.7)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Optical Efficiency for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==t?t:.7:null!==(l=p.absorberOpticalEfficiency)&&void 0!==l?l:.7;v(h.id,e);var W={name:"Set Absorber Optical Efficiency on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberOpticalEfficiency",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},tS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.absorberThermalEfficiency)&&void 0!==t?t:.3),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberThermalEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.absorberThermalEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberThermalEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberThermalEfficiency||Math.abs(i.solarAbsorberPipe.absorberThermalEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.absorberThermalEfficiency||Math.abs(d.solarAbsorberPipe.absorberThermalEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.absorberThermalEfficiency)||Math.abs((null===p||void 0===p?void 0:p.absorberThermalEfficiency)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==m?m:.3)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Thermal Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==H?H:.3)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Thermal Efficiency for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==t?t:.3:null!==(l=p.absorberThermalEfficiency)&&void 0!==l?l:.3;v(h.id,e);var W={name:"Set Absorber Thermal Efficiency on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberThermalEfficiency",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},lS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.apertureWidth)&&void 0!==t?t:.6),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.apertureWidth=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.apertureWidth=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.apertureWidth=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.apertureWidth||Math.abs(i.solarAbsorberPipe.apertureWidth-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.apertureWidth||Math.abs(d.solarAbsorberPipe.apertureWidth-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.apertureWidth)||Math.abs((null===p||void 0===p?void 0:p.apertureWidth)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.apertureWidth)&&void 0!==m?m:.6)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Aperture Width for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.apertureWidth)&&void 0!==H?H:.6)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Aperture Width for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.apertureWidth)&&void 0!==t?t:.6:null!==(l=p.apertureWidth)&&void 0!==l?l:.6;v(h.id,e);var W={name:"Set Absorber Aperture Width on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberApertureWidth",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:2,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.1, 2] ",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},aS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.poleNumber)&&void 0!==t?t:5),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.poleNumber=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.poleNumber=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.poleNumber=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.poleNumber||i.solarAbsorberPipe.poleNumber!==e))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.poleNumber||d.solarAbsorberPipe.poleNumber!==e))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.poleNumber)||(null===p||void 0===p?void 0:p.poleNumber)!==e)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.poleNumber)&&void 0!==m?m:5)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Pipe Pole Number for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.poleNumber)&&void 0!==H?H:5)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Pipe Pole Number for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.poleNumber)&&void 0!==t?t:5:null!==(l=p.poleNumber)&&void 0!==l?l:5;v(h.id,e);var W={name:"Set Absorber Pipe Pole Number on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberPipePoleNumber",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:1,max:100,style:{width:120},step:1,precision:0,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [1, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},oS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Ew(si),c=Ew(Fi),s=Ew(Zr),d=Ew(Sr),h=Ew(Jn),p=Ew(Ii),y=Ew(Ci),g=OP(V.Foundation),m=Object(r.useState)(null!==(t=null===g||void 0===g||null===(l=g.solarUpdraftTower)||void 0===l?void 0:l.chimneyHeight)&&void 0!==t?t:Math.max(null!==(a=null===g||void 0===g?void 0:g.lx)&&void 0!==a?a:0,null!==(o=null===g||void 0===g?void 0:g.ly)&&void 0!==o?o:0)),w=Object(u.a)(m,2),x=w[0],v=w[1],b=$f(),A=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.chimneyHeight=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){n((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.chimneyHeight=e)}}}catch(r){a.e(r)}finally{a.f()}}))},P=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.chimneyHeight=t)}}}catch(n){o.e(n)}finally{o.f()}}))},S=function(e){if(g&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.chimneyHeight||Math.abs(o.solarUpdraftTower.chimneyHeight-e)>At))return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(c);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Foundation&&!n.locked){var s=n;if(s.solarStructure===G.UpdraftTower&&s.solarUpdraftTower&&(void 0===s.solarUpdraftTower.chimneyHeight||Math.abs(s.solarUpdraftTower.chimneyHeight-e)>At))return!0}}}catch(d){r.e(d)}finally{r.f()}break;default:if(g&&g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower&&(void 0===g.solarUpdraftTower.chimneyHeight||Math.abs(g.solarUpdraftTower.chimneyHeight-e)>At))return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i,r,n=o;if(n.solarStructure===G.UpdraftTower&&n.solarUpdraftTower)l.set(o.id,null!==(i=null===(r=n.solarUpdraftTower)||void 0===r?void 0:r.chimneyHeight)&&void 0!==i?i:Math.max(n.lx,n.ly))}}}catch(C){a.e(C)}finally{a.f()}var m={name:"Set Solar Chimney Height for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){P(m.oldValues,m.newValue)}};d(m),P(l,e),y(p+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(c);try{for(v.s();!(w=v.n()).done;){var b=w.value;if(b.type===V.Foundation){var S,j,H=b;if(H.solarStructure===G.UpdraftTower&&H.solarUpdraftTower)x.set(b.id,null!==(S=null===(j=H.solarUpdraftTower)||void 0===j?void 0:j.chimneyHeight)&&void 0!==S?S:Math.max(H.lx,H.ly))}}}catch(C){v.e(C)}finally{v.f()}var z={name:"Set Solar Chimney Height for All Foundations",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){T(z.newValue)}};d(z),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var R,D,M=s(g.id),W=M&&M.solarUpdraftTower?null!==(R=M.solarUpdraftTower.chimneyHeight)&&void 0!==R?R:Math.max(M.lx,M.ly):null!==(D=g.solarUpdraftTower.chimneyHeight)&&void 0!==D?D:Math.max(g.lx,g.ly);A(g.id,e);var I={name:"Set Solar Chimney Height on Foundation",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(I.changedElementId,I.oldValue)},redo:function(){A(I.changedElementId,I.newValue)}};d(I),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight",b),onApply:function(){S(x)},onClose:function(){i(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:1e3,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [1, 1000] ",me.t("word.MeterAbbreviation",b)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},iS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Ew(si),c=Ew(Fi),s=Ew(Zr),d=Ew(Sr),h=Ew(Jn),p=Ew(Ii),y=Ew(Ci),g=OP(V.Foundation),m=Object(r.useState)(null!==(t=null===g||void 0===g||null===(l=g.solarUpdraftTower)||void 0===l?void 0:l.chimneyRadius)&&void 0!==t?t:Math.max(1,.025*Math.min(null!==(a=null===g||void 0===g?void 0:g.lx)&&void 0!==a?a:0,null!==(o=null===g||void 0===g?void 0:g.ly)&&void 0!==o?o:0))),w=Object(u.a)(m,2),x=w[0],v=w[1],b=$f(),A=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.chimneyRadius=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){n((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.chimneyRadius=e)}}}catch(r){a.e(r)}finally{a.f()}}))},P=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.chimneyRadius=t)}}}catch(n){o.e(n)}finally{o.f()}}))},S=function(e){if(g&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.chimneyRadius||Math.abs(o.solarUpdraftTower.chimneyRadius-e)>At))return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(c);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Foundation&&!n.locked){var s=n;if(s.solarStructure===G.UpdraftTower&&s.solarUpdraftTower&&(void 0===s.solarUpdraftTower.chimneyRadius||Math.abs(s.solarUpdraftTower.chimneyRadius-e)>At))return!0}}}catch(d){r.e(d)}finally{r.f()}break;default:if(g&&g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower&&(void 0===g.solarUpdraftTower.chimneyRadius||Math.abs(g.solarUpdraftTower.chimneyRadius-e)>At))return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i,r,n=o;if(n.solarStructure===G.UpdraftTower&&n.solarUpdraftTower)l.set(o.id,null!==(i=null===(r=n.solarUpdraftTower)||void 0===r?void 0:r.chimneyRadius)&&void 0!==i?i:Math.max(1,.025*Math.min(n.lx,n.ly)))}}}catch(C){a.e(C)}finally{a.f()}var m={name:"Set Solar Chimney Radius for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){P(m.oldValues,m.newValue)}};d(m),P(l,e),y(p+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(c);try{for(v.s();!(w=v.n()).done;){var b=w.value;if(b.type===V.Foundation){var S,j,H=b;if(H.solarStructure===G.UpdraftTower&&H.solarUpdraftTower)x.set(b.id,null!==(S=null===(j=H.solarUpdraftTower)||void 0===j?void 0:j.chimneyRadius)&&void 0!==S?S:Math.max(1,.025*Math.min(H.lx,H.ly)))}}}catch(C){v.e(C)}finally{v.f()}var z={name:"Set Solar Chimney Radius for All Foundations",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){T(z.newValue)}};d(z),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var R,D,M=s(g.id),W=M&&M.solarUpdraftTower?null!==(R=M.solarUpdraftTower.chimneyRadius)&&void 0!==R?R:Math.max(1,.025*Math.min(M.lx,M.ly)):null!==(D=g.solarUpdraftTower.chimneyRadius)&&void 0!==D?D:Math.max(1,.025*Math.min(g.lx,g.ly));A(g.id,e);var I={name:"Set Solar Chimney Radius on Foundation",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(I.changedElementId,I.oldValue)},redo:function(){A(I.changedElementId,I.newValue)}};d(I),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius",b),onApply:function(){S(x)},onClose:function(){i(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:10,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [0.1, 10] ",me.t("word.MeterAbbreviation",b)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},rS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Ew(si),c=Ew(Fi),s=Ew(Zr),d=Ew(Sr),h=Ew(Jn),p=Ew(Ii),y=Ew(Ci),g=OP(V.Foundation),m=Object(r.useState)(null!==(t=null===g||void 0===g||null===(l=g.solarUpdraftTower)||void 0===l?void 0:l.collectorRadius)&&void 0!==t?t:Math.max(10,.5*Math.min(null!==(a=null===g||void 0===g?void 0:g.lx)&&void 0!==a?a:0,null!==(o=null===g||void 0===g?void 0:g.ly)&&void 0!==o?o:0))),w=Object(u.a)(m,2),x=w[0],v=w[1],b=$f(),A=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorRadius=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){n((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.collectorRadius=e)}}}catch(r){a.e(r)}finally{a.f()}}))},P=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorRadius=t)}}}catch(n){o.e(n)}finally{o.f()}}))},S=function(e){if(g&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.collectorRadius||Math.abs(o.solarUpdraftTower.collectorRadius-e)>At))return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(c);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Foundation&&!n.locked){var s=n;if(s.solarStructure===G.UpdraftTower&&s.solarUpdraftTower&&(void 0===s.solarUpdraftTower.collectorRadius||Math.abs(s.solarUpdraftTower.collectorRadius-e)>At))return!0}}}catch(d){r.e(d)}finally{r.f()}break;default:if(g&&g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower&&(void 0===g.solarUpdraftTower.collectorRadius||Math.abs(g.solarUpdraftTower.collectorRadius-e)>At))return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i,r=o;if(r.solarStructure===G.UpdraftTower&&r.solarUpdraftTower)l.set(o.id,null!==(i=r.solarUpdraftTower.collectorRadius)&&void 0!==i?i:Math.max(10,.5*Math.min(r.lx,r.ly)))}}}catch(W){a.e(W)}finally{a.f()}var n={name:"Set Solar Collector Radius for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(n.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){P(n.oldValues,n.newValue)}};d(n),P(l,e),y(p+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(c);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Foundation){var b,S=v;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(v.id,null!==(b=S.solarUpdraftTower.collectorRadius)&&void 0!==b?b:Math.max(10,.5*Math.min(S.lx,S.ly)))}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Collector Radius for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){T(j.newValue)}};d(j),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var H,z,R=s(g.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.collectorRadius)&&void 0!==H?H:Math.max(10,.5*Math.min(R.lx,R.ly)):null!==(z=g.solarUpdraftTower.collectorRadius)&&void 0!==z?z:Math.max(10,.5*Math.min(g.lx,g.ly));A(g.id,e);var M={name:"Set Solar Collector Radius on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(M.changedElementId,M.oldValue)},redo:function(){A(M.changedElementId,M.newValue)}};d(M),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius",b),onApply:function(){S(x)},onClose:function(){i(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:1e3,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [1, 1000] ",me.t("word.MeterAbbreviation",b)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},nS=function(e){var t,l,a,o=e.setDialogVisible,i=Ew(si),n=(Ew(Vi),Ew(Fi)),c=Ew(Zr),s=Ew(Sr),d=Ew(Jn),h=(Ew(Gn),Ew(Ii)),p=Ew(Ci),y=(Ew(Oi),OP(V.Foundation)),g=Object(r.useState)(null!==(t=null===y||void 0===y||null===(l=y.solarUpdraftTower)||void 0===l?void 0:l.collectorHeight)&&void 0!==t?t:Math.max(3,10*(null!==(a=null===y||void 0===y?void 0:y.lz)&&void 0!==a?a:0))),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){i((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorHeight=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},A=function(e){i((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.collectorHeight=e)}}}catch(r){a.e(r)}finally{a.f()}}))},T=function(e,t){i((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorHeight=t)}}}catch(n){o.e(n)}finally{o.f()}}))},P=function(e){if(y&&function(e){switch(d){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(n);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.collectorHeight||Math.abs(o.solarUpdraftTower.collectorHeight-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(n);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Foundation&&!c.locked){var s=c;if(s.solarStructure===G.UpdraftTower&&s.solarUpdraftTower&&(void 0===s.solarUpdraftTower.collectorHeight||Math.abs(s.solarUpdraftTower.collectorHeight-e)>At))return!0}}}catch(u){r.e(u)}finally{r.f()}break;default:if(y&&y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower&&(void 0===y.solarUpdraftTower.collectorHeight||Math.abs(y.solarUpdraftTower.collectorHeight-e)>At))return!0}return!1}(e))switch(d){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(n);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i,r=o;if(r.solarStructure===G.UpdraftTower&&r.solarUpdraftTower)l.set(o.id,null!==(i=r.solarUpdraftTower.collectorHeight)&&void 0!==i?i:Math.max(3,10*r.lz))}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Collector Height for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){T(g.oldValues,g.newValue)}};s(g),T(l,e),p(h+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(n);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Foundation){var P,S=v;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(v.id,null!==(P=S.solarUpdraftTower.collectorHeight)&&void 0!==P?P:Math.max(3,10*S.lz))}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Collector Height for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(j.newValue)}};s(j),A(e),p(h+1);break;default:if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower){var H,z,R=c(y.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.collectorHeight)&&void 0!==H?H:Math.max(3,10*R.lz):null!==(z=y.solarUpdraftTower.collectorHeight)&&void 0!==z?z:Math.max(3,10*y.lz);b(y.id,e);var M={name:"Set Solar Collector Height on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(M.changedElementId,M.oldValue)},redo:function(){b(M.changedElementId,M.newValue)}};s(M),p(h+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight",v),onApply:function(){P(w)},onClose:function(){o(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:20,style:{width:120},step:1,precision:1,value:w,onChange:x}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [0.1, 20] ",me.t("word.MeterAbbreviation",v)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:d,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",v)})]})})})]})})},cS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.towerHeight)&&void 0!==t?t:20),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.towerHeight=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.towerHeight=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.towerHeight=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.towerHeight||Math.abs(i.solarPowerTower.towerHeight-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.towerHeight||Math.abs(d.solarPowerTower.towerHeight-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.towerHeight)||Math.abs((null===p||void 0===p?void 0:p.towerHeight)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.towerHeight)&&void 0!==m?m:20)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Tower Height for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.towerHeight)&&void 0!==H?H:20)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Tower Height for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.towerHeight)&&void 0!==t?t:20:null!==(l=p.towerHeight)&&void 0!==l?l:20;v(h.id,e);var W={name:"Set Tower Height on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverTowerHeight",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:10,max:500,style:{width:120},step:1,precision:1,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [10, 500] ",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},sS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.towerRadius)&&void 0!==t?t:1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.towerRadius=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.towerRadius=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.towerRadius=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.towerRadius||Math.abs(i.solarPowerTower.towerRadius-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.towerRadius||Math.abs(d.solarPowerTower.towerRadius-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.towerRadius)||Math.abs((null===p||void 0===p?void 0:p.towerRadius)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.towerRadius)&&void 0!==m?m:1)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Tower Radius for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.towerRadius)&&void 0!==H?H:1)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Tower Radius for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.towerRadius)&&void 0!==t?t:1:null!==(l=p.towerRadius)&&void 0!==l?l:1;v(h.id,e);var W={name:"Set Tower Radius on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverTowerRadius",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.5,max:10,style:{width:120},step:.5,precision:1,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.5, 10] ",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},dS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.receiverAbsorptance)&&void 0!==t?t:.95),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverAbsorptance=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.receiverAbsorptance=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverAbsorptance=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverAbsorptance||Math.abs(i.solarPowerTower.receiverAbsorptance-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.receiverAbsorptance||Math.abs(d.solarPowerTower.receiverAbsorptance-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.receiverAbsorptance)||Math.abs((null===p||void 0===p?void 0:p.receiverAbsorptance)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.receiverAbsorptance)&&void 0!==m?m:.95)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Receiver Absorptance for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.receiverAbsorptance)&&void 0!==H?H:.95)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Receiver Absorptance for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.receiverAbsorptance)&&void 0!==t?t:.95:null!==(l=p.receiverAbsorptance)&&void 0!==l?l:.95;v(h.id,e);var W={name:"Set Receiver Absorptance on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarPowerTowerMenu.ReceiverAbsorptance",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},uS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.receiverOpticalEfficiency)&&void 0!==t?t:.7),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverOpticalEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.receiverOpticalEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverOpticalEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverOpticalEfficiency||Math.abs(i.solarPowerTower.receiverOpticalEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.receiverOpticalEfficiency||Math.abs(d.solarPowerTower.receiverOpticalEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.receiverOpticalEfficiency)||Math.abs((null===p||void 0===p?void 0:p.receiverOpticalEfficiency)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.receiverOpticalEfficiency)&&void 0!==m?m:.7)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Receiver Optical Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.receiverOpticalEfficiency)&&void 0!==H?H:.7)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Receiver Optical Efficiency for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.receiverOpticalEfficiency)&&void 0!==t?t:.7:null!==(l=p.receiverOpticalEfficiency)&&void 0!==l?l:.7;v(h.id,e);var W={name:"Set Receiver Optical Efficiency on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarPowerTowerMenu.ReceiverOpticalEfficiency",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},fS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.receiverThermalEfficiency)&&void 0!==t?t:.3),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverThermalEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.receiverThermalEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverThermalEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverThermalEfficiency||Math.abs(i.solarPowerTower.receiverThermalEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.receiverThermalEfficiency||Math.abs(d.solarPowerTower.receiverThermalEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.receiverThermalEfficiency)||Math.abs((null===p||void 0===p?void 0:p.receiverThermalEfficiency)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.receiverThermalEfficiency)&&void 0!==m?m:.3)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Receiver Thermal Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.receiverThermalEfficiency)&&void 0!==H?H:.3)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Receiver Thermal Efficiency for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.receiverThermalEfficiency)&&void 0!==t?t:.3:null!==(l=p.receiverThermalEfficiency)&&void 0!==l?l:.3;v(h.id,e);var W={name:"Set Receiver Thermal Efficiency on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverThermalEfficiency",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},hS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.solarUpdraftTower)||void 0===l?void 0:l.collectorTransmissivity)&&void 0!==t?t:.9),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorTransmissivity=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.collectorTransmissivity=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorTransmissivity=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(p&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.collectorTransmissivity||Math.abs(o.solarUpdraftTower.collectorTransmissivity-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(d.solarStructure===G.UpdraftTower&&d.solarUpdraftTower&&(void 0===d.solarUpdraftTower.collectorTransmissivity||Math.abs(d.solarUpdraftTower.collectorTransmissivity-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(p&&p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower&&(void 0===p.solarUpdraftTower.collectorTransmissivity||Math.abs(p.solarUpdraftTower.collectorTransmissivity-e)>At))return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var r,y=o;if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower)l.set(o.id,null!==(r=y.solarUpdraftTower.collectorTransmissivity)&&void 0!==r?r:.9)}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Collector Transmissivity for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};c(g),A(l,e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(i);try{for(x.s();!(m=x.n()).done;){var T=m.value;if(T.type===V.Foundation){var P,S=T;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(T.id,null!==(P=S.solarUpdraftTower.collectorTransmissivity)&&void 0!==P?P:.9)}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Collector Transmissivity for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(j.newValue)}};c(j),b(e),h(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var H,z,R=n(p.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.collectorTransmissivity)&&void 0!==H?H:.9:null!==(z=p.solarUpdraftTower.collectorTransmissivity)&&void 0!==z?z:.9;v(p.id,e);var M={name:"Set Solar Collector Transmissivity on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};c(M),h(d+1)}}};return Object(gf.jsx)(kP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},pS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.solarUpdraftTower)||void 0===l?void 0:l.dischargeCoefficient)&&void 0!==t?t:.65),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.dischargeCoefficient=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.dischargeCoefficient=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.dischargeCoefficient=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(p&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.dischargeCoefficient||Math.abs(o.solarUpdraftTower.dischargeCoefficient-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(d.solarStructure===G.UpdraftTower&&d.solarUpdraftTower&&(void 0===d.solarUpdraftTower.dischargeCoefficient||Math.abs(d.solarUpdraftTower.dischargeCoefficient-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(p&&p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower&&(void 0===p.solarUpdraftTower.dischargeCoefficient||Math.abs(p.solarUpdraftTower.dischargeCoefficient-e)>At))return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var r,y=o;if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower)l.set(o.id,null!==(r=y.solarUpdraftTower.dischargeCoefficient)&&void 0!==r?r:.65)}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Chimney Discharge Coefficient for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};c(g),A(l,e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(i);try{for(x.s();!(m=x.n()).done;){var T=m.value;if(T.type===V.Foundation){var P,S=T;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(T.id,null!==(P=S.solarUpdraftTower.dischargeCoefficient)&&void 0!==P?P:.65)}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Chimney Discharge Coefficient for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(j.newValue)}};c(j),b(e),h(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var H,z,R=n(p.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.dischargeCoefficient)&&void 0!==H?H:.65:null!==(z=p.solarUpdraftTower.dischargeCoefficient)&&void 0!==z?z:.65;v(p.id,e);var M={name:"Set Solar Chimney Discharge Coefficient on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};c(M),h(d+1)}}};return Object(gf.jsx)(kP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.65,max:.7,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.65, 0.70]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},yS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.solarUpdraftTower)||void 0===l?void 0:l.turbineEfficiency)&&void 0!==t?t:.3),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.turbineEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.turbineEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.turbineEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(p&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.turbineEfficiency||Math.abs(o.solarUpdraftTower.turbineEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(d.solarStructure===G.UpdraftTower&&d.solarUpdraftTower&&(void 0===d.solarUpdraftTower.turbineEfficiency||Math.abs(d.solarUpdraftTower.turbineEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(p&&p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower&&(void 0===p.solarUpdraftTower.turbineEfficiency||Math.abs(p.solarUpdraftTower.turbineEfficiency-e)>At))return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var r,y=o;if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower)l.set(o.id,null!==(r=y.solarUpdraftTower.turbineEfficiency)&&void 0!==r?r:.3)}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Updraft Tower Turbine Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};c(g),A(l,e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(i);try{for(x.s();!(m=x.n()).done;){var T=m.value;if(T.type===V.Foundation){var P,S=T;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(T.id,null!==(P=S.solarUpdraftTower.turbineEfficiency)&&void 0!==P?P:.3)}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Updraft Tower Turbine Efficiency for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(j.newValue)}};c(j),b(e),h(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var H,z,R=n(p.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.turbineEfficiency)&&void 0!==H?H:.3:null!==(z=p.solarUpdraftTower.turbineEfficiency)&&void 0!==z?z:.3;v(p.id,e);var M={name:"Set Solar Updraft Tower Turbine Efficiency on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};c(M),h(d+1)}}};return Object(gf.jsx)(kP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerTurbineEfficiency",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.2,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.2, 1.0]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},gS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.solarUpdraftTower)||void 0===l?void 0:l.collectorEmissivity)&&void 0!==t?t:.95),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorEmissivity=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.collectorEmissivity=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorEmissivity=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(p&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.collectorEmissivity||Math.abs(o.solarUpdraftTower.collectorEmissivity-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(d.solarStructure===G.UpdraftTower&&d.solarUpdraftTower&&(void 0===d.solarUpdraftTower.collectorEmissivity||Math.abs(d.solarUpdraftTower.collectorEmissivity-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(p&&p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower&&(void 0===p.solarUpdraftTower.collectorEmissivity||Math.abs(p.solarUpdraftTower.collectorEmissivity-e)>At))return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var r,y=o;if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower)l.set(o.id,null!==(r=y.solarUpdraftTower.collectorEmissivity)&&void 0!==r?r:.95)}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Collector Emissivity for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};c(g),A(l,e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(i);try{for(x.s();!(m=x.n()).done;){var T=m.value;if(T.type===V.Foundation){var P,S=T;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(T.id,null!==(P=S.solarUpdraftTower.collectorEmissivity)&&void 0!==P?P:.95)}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Collector Emissivity for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(j.newValue)}};c(j),b(e),h(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var H,z,R=n(p.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.collectorEmissivity)&&void 0!==H?H:.95:null!==(z=p.solarUpdraftTower.collectorEmissivity)&&void 0!==z?z:.95;v(p.id,e);var M={name:"Set Solar Collector Emissivity on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};c(M),h(d+1)}}};return Object(gf.jsx)(kP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.01,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},mS=db.a.Option,wS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Gi),n=Ew(Vi),c=Tf(Nr),s=Object(r.useState)(!1),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(r.useState)(!1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)({left:0,top:0,bottom:0,right:0}),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useRef)(null),T=Ew(uf).geneticAlgorithmParams,P=Object(r.useRef)(T.selectionMethod),S=Object(r.useRef)(T.searchMethod),j=Object(r.useRef)(Math.min(T.objectiveFunctionType,W.YEARLY_TOTAL_OUTPUT)),H=Object(r.useRef)(T.populationSize),z=Object(r.useRef)(T.maximumGenerations),R=Object(r.useRef)(T.mutationRate),D=Object(r.useRef)(null!==(t=T.selectionRate)&&void 0!==t?t:.5),F=Object(r.useRef)(null!==(l=T.crossoverRate)&&void 0!==l?l:.5),k=Object(r.useRef)(T.convergenceThreshold),Y=Object(r.useRef)(T.localSearchRadius),L=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=L.current)||void 0===e||e.focus()}),[]);var E={lng:n},U=function(){c||Kh(me.t("message.EvolutionStarted",E)),o((function(e){e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=M.SOLAR_PANEL_TILT_ANGLE,e.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType=j.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod=P.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod=S.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize=H.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations=z.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate=D.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate=F.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate=R.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold=k.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius=Y.current})),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!e.runEvolution})),o((function(e){e.evolutionMethod=I.GENETIC_ALGORITHM,e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=M.SOLAR_PANEL_TILT_ANGLE,i&&(e.actionInfo={name:"Run Genetic Algorithm for Solar Panel Tilt Angle",timestamp:(new Date).getTime()})}))}),100)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)(Zv.a,{width:640,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return m(!0)},onMouseOut:function(){return m(!1)},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",E)+": ",me.t("optimizationMenu.GeneticAlgorithmSettings",E)]}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){a(!1)},children:me.t("word.Cancel",E)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:L,onClick:function(){U(),a(!1)},children:me.t("word.Run",E)},"Run")],onCancel:function(){a(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!g,bounds:v,onStart:function(e,t){return function(e,t){if(A.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=A.current.getBoundingClientRect();b({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:A,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:j.current,style:{width:"100%"},value:j.current,onChange:function(e){j.current=e,h(!f)},children:[Object(gf.jsx)(mS,{value:W.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",E)},W.DAILY_TOTAL_OUTPUT),Object(gf.jsx)(mS,{value:W.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",E)},W.YEARLY_TOTAL_OUTPUT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.GeneticAlgorithmSelectionMethod",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:P.current,style:{width:"100%"},value:P.current,onChange:function(e){P.current=e,h(!f)},children:[Object(gf.jsx)(mS,{value:C.ROULETTE_WHEEL,children:me.t("optimizationMenu.RouletteWheel",E)},C.ROULETTE_WHEEL),Object(gf.jsx)(mS,{value:C.TOURNAMENT,children:me.t("optimizationMenu.Tournament",E)},C.TOURNAMENT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.PopulationSize",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:10,max:100,style:{width:"100%"},precision:0,formatter:function(e){return Number(e).toFixed(0)},value:H.current,step:1,onChange:function(e){H.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumGenerations",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:5,max:100,step:1,style:{width:"100%"},precision:0,formatter:function(e){return Number(e).toFixed(0)},value:z.current,onChange:function(e){z.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SelectionRate",E)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:D.current,step:.01,onChange:function(e){D.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CrossoverRate",E)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:F.current,step:.01,onChange:function(e){F.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MutationRate",E)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:R.current,step:.01,onChange:function(e){R.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",E)+" [0, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:k.current,step:.001,onChange:function(e){k.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:S.current,style:{width:"100%"},value:S.current,onChange:function(e){S.current=e,h(!f)},children:[Object(gf.jsx)(mS,{value:O.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",E)},O.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(gf.jsx)(mS,{value:O.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",E)},O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),S.current===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",E)+" ([0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Y.current,step:.01,onChange:function(e){Y.current=e,h(!f)}})})]})]})})},xS=db.a.Option,vS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Ew(si),c=Ew(Gi),s=Ew(Vi),d=Tf(Nr),f=Ew(uf).particleSwarmOptimizationParams,h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)({left:0,top:0,bottom:0,right:0}),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useRef)(null),j=Object(r.useRef)(Math.min(f.objectiveFunctionType,W.YEARLY_TOTAL_OUTPUT)),H=Object(r.useRef)(f.searchMethod),z=Object(r.useRef)(f.swarmSize),R=Object(r.useRef)(f.maximumSteps),D=Object(r.useRef)(null!==(t=f.vmax)&&void 0!==t?t:.01),C=Object(r.useRef)(null!==(l=f.inertia)&&void 0!==l?l:.8),F=Object(r.useRef)(null!==(a=f.cognitiveCoefficient)&&void 0!==a?a:.1),k=Object(r.useRef)(null!==(o=f.socialCoefficient)&&void 0!==o?o:.1),Y=Object(r.useRef)(f.convergenceThreshold),L=Object(r.useRef)(f.localSearchRadius),E=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=E.current)||void 0===e||e.focus()}),[]);var U={lng:s},N=function(){d||Kh(me.t("message.EvolutionStarted",U)),n((function(e){e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=M.SOLAR_PANEL_TILT_ANGLE,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType=j.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod=H.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize=z.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps=R.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient=F.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient=k.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.vmax=D.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.inertia=C.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.convergenceThreshold=Y.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.localSearchRadius=L.current})),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!e.runEvolution})),n((function(e){e.evolutionMethod=I.PARTICLE_SWARM_OPTIMIZATION,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=M.SOLAR_PANEL_TILT_ANGLE,c&&(e.actionInfo={name:"Run Particle Swarm Optimization for Solar Panel Tilt Angle",timestamp:(new Date).getTime()})}))}),100)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)(Zv.a,{width:640,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return v(!0)},onMouseOut:function(){return v(!1)},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",U)+": ",me.t("optimizationMenu.ParticleSwarmOptimizationSettings",U)]}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){i(!1)},children:me.t("word.Cancel",U)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:E,onClick:function(){N(),i(!1)},children:me.t("word.Run",U)},"Run")],onCancel:function(){i(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!x,bounds:T,onStart:function(e,t){return function(e,t){if(S.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=S.current.getBoundingClientRect();P({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:S,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",U)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:j.current,style:{width:"100%"},value:j.current,onChange:function(e){j.current=e,g(!y)},children:[Object(gf.jsx)(xS,{value:W.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",U)},W.DAILY_TOTAL_OUTPUT),Object(gf.jsx)(xS,{value:W.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",U)},W.YEARLY_TOTAL_OUTPUT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SwarmSize",U)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:10,max:100,style:{width:"100%"},precision:0,value:z.current,step:1,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){z.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumSteps",U)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:5,max:100,step:1,style:{width:"100%"},precision:0,value:R.current,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){R.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CognitiveCoefficient",U)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:F.current,step:.01,onChange:function(e){F.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SocialCoefficient",U)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:k.current,step:.01,onChange:function(e){k.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InertiaWeight",U)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:C.current,step:.01,onChange:function(e){C.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumVelocity",U)+" [0.001, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:D.current,step:.001,onChange:function(e){D.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",U)+" [0, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:Y.current,step:.001,onChange:function(e){Y.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",U)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:H.current,style:{width:"100%"},value:H.current,onChange:function(e){H.current=e,g(!y)},children:[Object(gf.jsx)(xS,{value:O.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",U)},O.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(gf.jsx)(xS,{value:O.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",U)},O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),H.current===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",U)+" ([0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:L.current,step:.01,onChange:function(e){L.current=e,g(!y)}})})]})]})})},bS=function(e){var t,l=e.setDialogVisible,a=Ew(Vi),o=Ew(Fi),i=Ew(ln),n=Ew(Sr),c=Ew(Jn),s=Ew(Gn),d=Ew(Ii),h=Ew(Ci),p=Ew(Oi),y=Ew(Zr),g=Ew(si),m=Ew((function(e){if(i){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===i.id)return a}}catch(o){l.e(o)}finally{l.f()}}return null})),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.rValue)&&void 0!==t?t:2),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(Tw.toRValueInUS(v)),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)({left:0,top:0,bottom:0,right:0}),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useRef)(null),O={lng:a};Object(r.useEffect)((function(){var e;m&&b(null!==(e=null===m||void 0===m?void 0:m.rValue)&&void 0!==e?e:2)}),[null===m||void 0===m?void 0:m.rValue]);var F=function(e,t){g((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},k=function(e){if(m&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){var i=a;if(void 0===i.rValue||Math.abs(i.rValue-e)>At)return!0}}}catch(r){l.e(r)}finally{l.f()}break;default:if(void 0===(null===m||void 0===m?void 0:m.rValue)||Math.abs((null===m||void 0===m?void 0:m.rValue)-e)>At)return!0}return!1}(e)){switch(c){case _.AllObjectsOfThisType:var t=new Map;g((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked){var r,n=i;t.set(i.id,null!==(r=n.rValue)&&void 0!==r?r:2),n.rValue=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set R-Value for All Ground Floors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){!function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];F(o,i)}}catch(r){l.e(r)}finally{l.f()}}(l.oldValues)},redo:function(){!function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;F(o,t)}}catch(i){a.e(i)}finally{a.f()}}(l.oldValues,l.newValue)}};n(l),h(d+1);break;default:if(m){var a,i,r=null!==(a=null!==(i=y(m.id).rValue)&&void 0!==i?i:m.rValue)&&void 0!==a?a:2,s={name:"Set Ground Floor R-Value",timestamp:Date.now(),oldValue:r,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){F(s.changedElementId,s.oldValue)},redo:function(){F(s.changedElementId,s.newValue)}};n(s),F(m.id,e),h(d+1)}}g((function(t){t.actionState.groundFloorRValue=e}))}},Y=function(){var e;b(null!==(e=null===m||void 0===m?void 0:m.rValue)&&void 0!==e?e:2),l(!1)},L=function(){k(v),l(!1),h(0)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:550,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return R(!0)},onMouseOut:function(){return R(!1)},children:[me.t("word.RValue",O)+" ","(",me.t("word.ThermalResistance",O),")"]}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){k(v)},children:me.t("word.Apply",O)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){Y(),p()},children:me.t("word.Cancel",O)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:L,children:me.t("word.OK",O)},"OK")],onCancel:Y,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!z,bounds:W,onStart:function(e,t){return function(e,t){if(C.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=C.current.getBoundingClientRect();I({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:C,children:e})})},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),S(Tw.toRValueInUS(e))},onPressEnter:L}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",O),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",O),": m\xb2\xb7\u2103/W"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toRValueInUS(.01),max:Tw.toRValueInUS(100),style:{width:120},step:.01,precision:2,value:P,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){S(e),b(Tw.toRValueInSI(e))},onPressEnter:L}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",O),": [",Tw.toRValueInUS(.01).toFixed(3),", ",Tw.toRValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",O),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return s(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisGroundFloor",O)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllGroundFloors",O)})]})})})]})})})},AS=n.a.memo((function(){var e,t,l,a,o,i,n,c,s,d,p=Ew(si),y=Ew(Fi),g=Ew(Sr),m=Ew(hs),w=Ew(es),x=Ew(ts),v=Ew(pn),b=Ew(fn),A=Ew(ns),T=Ew(qc),P=Ew(Ci),S=Ew(Vi),j=Ew(os),H=OP(V.Foundation),z=Object(r.useState)(!1),R=Object(u.a)(z,2),M=R[0],W=R[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useState)(!1),Y=Object(u.a)(k,2),L=Y[0],E=Y[1],U=Object(r.useState)(!1),N=Object(u.a)(U,2),J=N[0],X=N[1],B=Object(r.useState)(!1),K=Object(u.a)(B,2),q=K[0],Q=K[1],Z=Object(r.useState)(!1),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Object(r.useState)(!1),le=Object(u.a)(te,2),ae=le[0],oe=le[1],ie=Object(r.useState)(!1),re=Object(u.a)(ie,2),ne=re[0],ce=re[1],de=Object(r.useState)(!1),ue=Object(u.a)(de,2),fe=ue[0],he=ue[1],pe=Object(r.useState)(!1),ye=Object(u.a)(pe,2),ge=ye[0],we=ye[1],xe=Object(r.useState)(!1),ve=Object(u.a)(xe,2),be=ve[0],Ae=ve[1],Te=Object(r.useState)(!1),Pe=Object(u.a)(Te,2),Se=Pe[0],je=Pe[1],He=Object(r.useState)(!1),ze=Object(u.a)(He,2),Re=ze[0],De=ze[1],We=Object(r.useState)(!1),Ie=Object(u.a)(We,2),Ce=Ie[0],Oe=Ie[1],Fe=Object(r.useState)(!1),ke=Object(u.a)(Fe,2),Ye=ke[0],Le=ke[1],Ee=Object(r.useState)(!1),Ue=Object(u.a)(Ee,2),Ne=Ue[0],Ve=Ue[1],Je=Object(r.useState)(!1),Ge=Object(u.a)(Je,2),Xe=Ge[0],Be=Ge[1],Ke=Object(r.useState)(!1),qe=Object(u.a)(Ke,2),Qe=qe[0],Ze=qe[1],_e=Object(r.useState)(!1),$e=Object(u.a)(_e,2),et=$e[0],tt=$e[1],lt=Object(r.useState)(!1),at=Object(u.a)(lt,2),ot=at[0],it=at[1],rt=Object(r.useState)(!1),nt=Object(u.a)(rt,2),ct=nt[0],st=nt[1],dt=Object(r.useState)(!1),ut=Object(u.a)(dt,2),ft=ut[0],ht=ut[1],pt=Object(r.useState)(!1),yt=Object(u.a)(pt,2),gt=yt[0],mt=yt[1],wt=Object(r.useState)(!1),xt=Object(u.a)(wt,2),vt=xt[0],bt=xt[1],At=Object(r.useState)(!1),Tt=Object(u.a)(At,2),Pt=Tt[0],St=Tt[1],jt=Object(r.useState)(!1),Ht=Object(u.a)(jt,2),zt=Ht[0],Dt=Ht[1],Mt=Object(r.useState)(!1),Wt=Object(u.a)(Mt,2),It=Wt[0],Ct=Wt[1],Ot=Object(r.useState)(!1),Ft=Object(u.a)(Ot,2),kt=Ft[0],Yt=Ft[1],Lt=zP(H),Et=Lt.labelText,Ut=Lt.setLabelText,Nt=RP(H),Vt=DP(H,Et),Jt=WP(H),Gt=MP(H),Xt=IP(H),Bt=CP(H);Object(r.useEffect)((function(){var e;H&&Zt(null===(e=H.hvacSystem)||void 0===e?void 0:e.id)}),[H]);var Kt=Object(r.useState)(null===H||void 0===H||null===(e=H.hvacSystem)||void 0===e?void 0:e.id),qt=Object(u.a)(Kt,2),Qt=qt[0],Zt=qt[1];if(!H)return null;var _t=null!==(t=null===H||void 0===H?void 0:H.solarStructure)&&void 0!==t?t:G.None,$t=H?m(H.id,!0):new Rw,el=H?m(H.id,!1):new Rw,tl={lng:S},ll=!(null===H||void 0===H?void 0:H.locked),al=function(e,t){p((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){i.solarStructure=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},ol=function(e,t){p((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e){var r=i;r.hvacSystem?r.hvacSystem.thermostatSetpoint=t:r.hvacSystem={thermostatSetpoint:t,temperatureThreshold:3};break}}}catch(n){o.e(n)}finally{o.f()}}))},il=function(e,t){p((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e){var r=i;r.hvacSystem?r.hvacSystem.temperatureThreshold=t:r.hvacSystem={thermostatSetpoint:20,temperatureThreshold:t};break}}}catch(n){o.e(n)}finally{o.f()}}))},rl=function(e,t){p((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e){var r=i;r.hvacSystem?r.hvacSystem.id=t:r.hvacSystem={thermostatSetpoint:20,temperatureThreshold:3,id:t};break}}}catch(n){o.e(n)}finally{o.f()}}))},nl=function(e){var t,l=null===(t=H.hvacSystem)||void 0===t?void 0:t.id,a=e&&e.trim().length>0?e:void 0,o={name:"Change HVAC ID",timestamp:Date.now(),oldValue:l,newValue:a,undo:function(){rl(H.id,o.oldValue)},redo:function(){rl(H.id,o.newValue)}};g(o),rl(H.id,a)},cl=!H.notBuilding&&Tw.getBuildingCompletionStatus(H,y)===D.COMPLETE,sl=function(){p((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===H.id){a.enableGroupMaster=!a.enableGroupMaster;break}}}catch(o){l.e(o)}finally{l.f()}e.groupActionUpdateFlag=!e.groupActionUpdateFlag}))},dl=function(){p((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===H.id){a.notBuilding=!a.notBuilding;break}}}catch(o){l.e(o)}finally{l.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){if(j&&j.length>0){var e=j[0];if(e.type===V.Human||e.type===V.Tree||e.type===V.Flower||e.type===V.Polygon||e.type===V.Sensor||e.type===V.Light||e.type===V.SolarPanel||e.type===V.WaterHeater||e.type===V.ParabolicDish||e.type===V.Heliostat||e.type===V.FresnelReflector||e.type===V.ParabolicTrough||e.type===V.WindTurbine||e.type===V.Wall)return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"foundation-paste"}),Object(gf.jsx)(TP,{keyName:"foundation-copy"}),ll&&Object(gf.jsx)(PP,{keyName:"foundation-cut"}),Object(gf.jsx)(SP,{keyName:"foundation-lock"}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:H.enableGroupMaster,onChange:function(e){var t={name:"Group Master",timestamp:Date.now(),checked:e.target.checked,selectedElementId:H.id,selectedElementType:H.type,undo:function(){return sl()},redo:function(){return sl()}};g(t),sl()},children:me.t("foundationMenu.GroupMaster",{lng:S})})},"group-master"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!H.notBuilding,onChange:function(e){var t={name:"Building",timestamp:Date.now(),checked:e.target.checked,selectedElementId:H.id,selectedElementType:H.type,undo:function(){return dl()},redo:function(){return dl()}};g(t),dl()},children:me.t("word.Building",{lng:S})})},"building"),$t.gotSome()&&Object(gf.jsxs)(HP.a,{title:me.t("word.Elements",tl),style:{paddingLeft:"24px"},children:[el.gotSome()&&Object(gf.jsx)(Qv.a.Item,{onClick:function(){var e,t=new Map,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;a.foundationId!==H.id&&a.id!==H.id||t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}b(H.id,!0);var o={name:"Lock All Offsprings",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(f.a)(o.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],r=l[1];v(a,r)}}catch(i){t.e(i)}finally{t.f()}},redo:function(){b(H.id,!0)}};g(o)},children:me.t("foundationMenu.LockAllElementsOnThisFoundation",tl)},"lock-all-offsprings"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){var e,t=new Map,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;a.foundationId!==H.id&&a.id!==H.id||t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}b(H.id,!1);var o={name:"Unlock All Offsprings",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(f.a)(o.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],r=l[1];v(a,r)}}catch(i){t.e(i)}finally{t.f()}},redo:function(){b(H.id,!1)}};g(o)},children:me.t("foundationMenu.UnlockAllElementsOnThisFoundation",tl)},"unlock-all-offsprings"),el.wallCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllWallsOnFoundation",tl)+" ("+el.wallCount+" "+me.t("foundationMenu.Walls",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=new Set;Ew.getState().elements.forEach((function(t){t.locked||t.type!==V.Wall||t.parentId!==H.id&&t.foundationId!==H.id||e.add(t.id)}));var t=Ew.getState().elements.filter((function(t){return e.has(t.id)||e.has(t.parentId)}));p((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)&&!e.has(t.parentId)}))}));var l=JSON.parse(JSON.stringify(t)),a={name:"Remove All Walls on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:l,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(a.removedElements)),e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}))},redo:function(){var e=new Set;Ew.getState().elements.forEach((function(t){t.locked||t.type!==V.Wall||t.parentId!==a.parentId||e.add(t.id)})),p((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)&&!e.has(t.parentId)}))}))}};g(a)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedWalls",tl)," (",el.wallCount,")"]},"remove-all-walls-on-foundation"),el.windowCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllWindowsOnFoundation",tl)+" ("+el.windowCount+" "+me.t("foundationMenu.Windows",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Window&&e.foundationId===H.id}));x(H.id,V.Window);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Windows on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.Window)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedWindows",tl)," (",el.windowCount,")"]},"remove-all-windows-on-foundation"),el.doorCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllDoorsOnFoundation",tl)+" ("+el.doorCount+" "+me.t("foundationMenu.Doors",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Door&&e.foundationId===H.id}));x(H.id,V.Door);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Doors on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.Door)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedDoors",tl)," (",el.doorCount,")"]},"remove-all-doors-on-foundation"),el.sensorCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllSensorsOnFoundation",tl)+" ("+el.sensorCount+" "+me.t("foundationMenu.Sensors",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Sensor&&e.foundationId===H.id}));x(H.id,V.Sensor);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Sensors on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.Sensor)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedSensors",tl)," (",el.sensorCount,")"]},"remove-all-sensors-on-foundation"),el.insideLightCount+el.outsideLightCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllLightsOnFoundation",tl)+" ("+(el.insideLightCount+el.outsideLightCount)+" "+me.t("foundationMenu.Lights",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Light&&e.foundationId===H.id}));x(H.id,V.Light);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Lights on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.Light)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedLights",tl)," (",el.insideLightCount+el.outsideLightCount,")"]},"remove-all-lights-on-foundation"),el.solarPanelCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllSolarPanelsOnFoundation",tl)+" ("+el.solarPanelModuleCount+" "+me.t("foundationMenu.SolarPanels",tl)+", "+el.solarPanelCount+" "+me.t("foundationMenu.Racks",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.SolarPanel&&e.foundationId===H.id}));x(H.id,V.SolarPanel);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Solar Panels on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.SolarPanel)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedSolarPanels",tl),"\xa0 (",el.solarPanelModuleCount," ",me.t("foundationMenu.SolarPanels",tl),","," ",el.solarPanelCount," ",me.t("foundationMenu.Racks",tl),")"]},"remove-all-solar-panels-on-foundation"),el.parabolicTroughCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation",tl)+" ("+el.parabolicTroughCount+" "+me.t("foundationMenu.ParabolicTroughs",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.ParabolicTrough&&e.foundationId===H.id}));w(H.id,V.ParabolicTrough);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Parabolic Troughs on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.ParabolicTrough)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedParabolicTroughs",tl)," (",el.parabolicTroughCount,")"]},"remove-all-parabolic-troughs-on-foundation"),el.parabolicDishCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllParabolicDishesOnFoundation",tl)+" ("+el.parabolicDishCount+" "+me.t("foundationMenu.ParabolicDishes",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.ParabolicDish&&e.foundationId===H.id}));w(H.id,V.ParabolicDish);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Parabolic Dishes on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.ParabolicDish)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedParabolicDishes",tl)," (",el.parabolicDishCount,")"]},"remove-all-parabolic-dishes-on-foundation"),el.fresnelReflectorCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation",tl)+" ("+el.fresnelReflectorCount+" "+me.t("foundationMenu.FresnelReflectors",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.FresnelReflector&&e.foundationId===H.id}));w(H.id,V.FresnelReflector);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Fresnel Reflectors on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.FresnelReflector)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedFresnelReflectors",tl)," (",el.fresnelReflectorCount,")"]},"remove-all-fresnel-reflector-on-foundation"),el.heliostatCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllHeliostatsOnFoundation",tl)+" ("+el.heliostatCount+" "+me.t("foundationMenu.Heliostats",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Heliostat&&e.foundationId===H.id}));w(H.id,V.Heliostat);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Heliostats on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Heliostat)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedHeliostats",tl)," (",el.heliostatCount,")"]},"remove-all-heliostats-on-foundation"),el.polygonCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllPolygonsOnFoundation",tl)+" ("+el.polygonCount+" "+me.t("foundationMenu.Polygons",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Polygon&&e.foundationId===H.id}));w(H.id,V.Polygon);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Polygons on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Polygon)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedPolygons",tl)," (",el.polygonCount,")"]},"remove-all-polygons-on-foundation"),el.humanCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllHumansOnFoundation",tl)+" ("+el.humanCount+" "+me.t("foundationMenu.Humans",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Human&&e.parentId===H.id}));w(H.id,V.Human);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Humans on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Human)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedHumans",tl)," (",el.humanCount,")"]},"remove-all-humans-on-foundation"),el.treeCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllTreesOnFoundation",tl)+" ("+el.treeCount+" "+me.t("foundationMenu.Trees",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Tree&&e.parentId===H.id}));w(H.id,V.Tree);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Trees on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Tree)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedTrees",tl)," (",el.treeCount,")"]},"remove-all-trees-on-foundation"),el.flowerCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllFlowersOnFoundation",tl)+" ("+el.flowerCount+" "+me.t("foundationMenu.Flowers",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Flower&&e.parentId===H.id}));w(H.id,V.Flower);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Flowers on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Flower)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedFlowers",tl)," (",el.flowerCount,")"]},"remove-all-flowers-on-foundation")]},"lock-unlock-clear-on-foundation"),ll&&(!H.textureType||H.textureType===se.NoTexture)&&Object(gf.jsxs)(gf.Fragment,{children:[M&&Object(gf.jsx)(LP,{setDialogVisible:W}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),W(!0)},children:[me.t("word.Color",tl)," ..."]},"foundation-color")]}),ll&&Object(gf.jsxs)(gf.Fragment,{children:[O&&Object(gf.jsx)(ZP,{setDialogVisible:F}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),F(!0)},children:[me.t("word.Texture",tl)," ..."]},"foundation-texture"),J&&Object(gf.jsx)(EP,{setDialogVisible:X}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),X(!0)},children:[me.t("word.Length",tl)," ..."]},"foundation-length"),L&&Object(gf.jsx)(UP,{setDialogVisible:E}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),E(!0)},children:[me.t("word.Width",tl)," ..."]},"foundation-width"),q&&Object(gf.jsx)(NP,{setDialogVisible:Q}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Q(!0)},children:[me.t("word.Height",tl)," ..."]},"foundation-height"),$&&Object(gf.jsx)(VP,{setDialogVisible:ee}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ee(!0)},children:[me.t("word.Azimuth",tl)," ..."]},"foundation-azimuth"),cl&&ae&&Object(gf.jsx)(bS,{setDialogVisible:oe}),cl&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),oe(!0)},children:[me.t("foundationMenu.GroundFloorRValue",tl)," ..."]},"ground-floor-r-value")]}),Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(H){p((function(e){e.objectTypeToAdd=V.Polygon}));var e=A(H,new Me.Vector3(H.cx,H.cy,H.lz),Rt),t={name:"Add",timestamp:Date.now(),addedElement:e,undo:function(){T(t.addedElement.id,!1)},redo:function(){p((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement}))}};g(t),p((function(e){e.objectTypeToAdd=V.None}))}},children:me.t("foundationMenu.AddPolygon",tl)},"add-polygon-on-foundation"),!H.notBuilding&&$t.wallCount>0&&Object(gf.jsx)(HP.a,{title:me.t("word.BuildingHVACSystem",tl),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"18px",marginTop:10},children:[Object(gf.jsx)(wv.b,{style:{width:"40px",paddingLeft:"0px",textAlign:"left"},children:"ID:"}),Object(gf.jsx)(ET.a,{style:{width:"180px"},value:Qt,onChange:function(e){var t=e.target.value;0===t.trim().length&&(t=void 0),Zt(t)},onPressEnter:function(){return nl(Qt)},onBlur:function(){return nl(Qt)}})]},"hvac-system-id"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"160px"},children:me.t("word.ThermostatSetpoint",tl)+":"}),Object(gf.jsx)($v.a,{min:0,max:30,step:1,style:{width:60},precision:1,value:null!==(l=null===(a=H.hvacSystem)||void 0===a?void 0:a.thermostatSetpoint)&&void 0!==l?l:20,onChange:function(e){var t,l,a=null!==(t=null===(l=H.hvacSystem)||void 0===l?void 0:l.thermostatSetpoint)&&void 0!==t?t:20,o=e,i={name:"Change Thermostat Setpoint",timestamp:Date.now(),oldValue:a,newValue:o,undo:function(){ol(H.id,i.oldValue)},redo:function(){ol(H.id,i.newValue)}};g(i),ol(H.id,o)}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:"\xb0C"})]},"thermostat-temperature"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{title:me.t("word.TemperatureToleranceThresholdExplanation",tl),style:{width:"160px"},children:me.t("word.TemperatureToleranceThreshold",tl)+":"}),Object(gf.jsx)($v.a,{min:0,max:30,step:1,style:{width:60},precision:1,value:null!==(o=null===(i=H.hvacSystem)||void 0===i?void 0:i.temperatureThreshold)&&void 0!==o?o:3,onChange:function(e){var t,l,a=null!==(t=null===(l=H.hvacSystem)||void 0===l?void 0:l.temperatureThreshold)&&void 0!==t?t:3,o=e,i={name:"Change Temperature Tolerance Threshold",timestamp:Date.now(),oldValue:a,newValue:o,undo:function(){il(H.id,i.oldValue)},redo:function(){il(H.id,i.newValue)}};g(i),il(H.id,o)}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:"\xb0C"})]},"tolerance-threshold")]})},"building-hvac-system"),ll&&Object(gf.jsx)(HP.a,{title:me.t("foundationMenu.SolarStructure",tl),style:{paddingLeft:"24px"},children:Object(gf.jsx)(tb.a.Group,{value:_t,style:{paddingLeft:"12px"},onChange:function(e){if(H){var t=H.solarStructure,l=e.target.value,a={name:"Select Solar Structure for Selected Foundation",timestamp:Date.now(),oldValue:t,newValue:l,changedElementId:H.id,changedElementType:H.type,undo:function(){al(a.changedElementId,a.oldValue)},redo:function(){al(a.changedElementId,a.newValue)}};g(a),al(H.id,l)}},children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:G.None,children:me.t("word.None",tl)}),Object(gf.jsx)(tb.a,{value:G.FocusPipe,children:me.t("solarAbsorberPipeMenu.AbsorberPipeForFresnelReflectors",tl)}),Object(gf.jsx)(tb.a,{value:G.FocusTower,children:me.t("solarPowerTowerMenu.ReceiverTowerForHeliostats",tl)}),Object(gf.jsx)(tb.a,{value:G.UpdraftTower,children:me.t("solarUpdraftTowerMenu.SolarUpdraftTower",tl)})]})})},"select-solar-structure"),ll&&H.solarStructure===G.FocusPipe&&Object(gf.jsxs)(HP.a,{title:me.t("solarAbsorberPipeMenu.AbsorberPipePhysicalProperties",tl),style:{paddingLeft:"24px"},children:[ne&&Object(gf.jsx)(_P,{setDialogVisible:ce}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ce(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberHeight",tl)," ..."]},"solar-absorber-pipe-height"),fe&&Object(gf.jsx)(lS,{setDialogVisible:he}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),he(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberApertureWidth",tl)," ..."]},"solar-absorber-pipe-aperture-width"),ge&&Object(gf.jsx)(aS,{setDialogVisible:we}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),we(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberPipePoleNumber",tl)," ..."]},"foundation-solar-receiver-pipe-pole-number"),be&&Object(gf.jsx)($P,{setDialogVisible:Ae}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ae(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberAbsorptance",tl)," ..."]},"solar-absorber-pipe-absorptance"),Se&&Object(gf.jsx)(eS,{setDialogVisible:je}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),je(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberOpticalEfficiency",tl)," ..."]},"solar-absorber-optical-efficiency"),Re&&Object(gf.jsx)(tS,{setDialogVisible:De}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),De(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberThermalEfficiency",tl)," ..."]},"solar-absorber-thermal-efficiency")]},"solar-absorber-pipe-physical-properties"),ll&&H.solarStructure===G.FocusTower&&Object(gf.jsxs)(HP.a,{title:me.t("solarPowerTowerMenu.ReceiverTowerPhysicalProperties",tl),style:{paddingLeft:"24px"},children:[Ce&&Object(gf.jsx)(cS,{setDialogVisible:Oe}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Oe(!0)},children:[me.t("solarPowerTowerMenu.ReceiverTowerHeight",tl)," ..."]},"solar-power-tower-height"),Ye&&Object(gf.jsx)(sS,{setDialogVisible:Le}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Le(!0)},children:[me.t("solarPowerTowerMenu.ReceiverTowerRadius",tl)," ..."]},"solar-power-tower-radius"),Ne&&Object(gf.jsx)(dS,{setDialogVisible:Ve}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ve(!0)},children:[me.t("solarPowerTowerMenu.ReceiverAbsorptance",tl)," ..."]},"solar-power-tower-receiver-absorptance"),Xe&&Object(gf.jsx)(uS,{setDialogVisible:Be}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Be(!0)},children:[me.t("solarPowerTowerMenu.ReceiverOpticalEfficiency",tl)," ..."]},"solar-power-tower-receiver-optical-efficiency"),Qe&&Object(gf.jsx)(fS,{setDialogVisible:Ze}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ze(!0)},children:[me.t("solarPowerTowerMenu.ReceiverThermalEfficiency",tl)," ..."]},"solar-power-tower-receiver-thermal-efficiency")]},"solar-power-tower-physical-properties"),ll&&H.solarStructure===G.UpdraftTower&&Object(gf.jsxs)(HP.a,{title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerPhysicalProperties",tl),style:{paddingLeft:"24px"},children:[et&&Object(gf.jsx)(oS,{setDialogVisible:tt}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),tt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight",tl)," ..."]},"solar-updraft-tower-chimney-height"),ot&&Object(gf.jsx)(iS,{setDialogVisible:it}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),it(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius",tl)," ..."]},"solar-updraft-tower-chimney-radius"),ct&&Object(gf.jsx)(nS,{setDialogVisible:st}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),st(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight",tl)," ..."]},"solar-updraft-tower-collector-height"),ft&&Object(gf.jsx)(rS,{setDialogVisible:ht}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ht(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius",tl)," ..."]},"solar-updraft-tower-collector-radius"),gt&&Object(gf.jsx)(hS,{setDialogVisible:mt}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),mt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity",tl)," ..."]},"solar-updraft-tower-collector-transmissivity"),vt&&Object(gf.jsx)(gS,{setDialogVisible:bt}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),bt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity",tl)," ..."]},"solar-updraft-tower-collector-emissivity"),Pt&&Object(gf.jsx)(pS,{setDialogVisible:St}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),St(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient",tl)," ..."]},"solar-updraft-tower-discharge-coefficient"),zt&&Object(gf.jsx)(yS,{setDialogVisible:Dt}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Dt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerTurbineEfficiency",tl)," ..."]},"solar-updraft-tower-turbine-efficiency")]},"solar-updraft-tower-physical-properties"),Object(gf.jsxs)(HP.a,{title:me.t("optimizationMenu.Optimization",tl),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(HP.a,{title:me.t("optimizationMenu.GeneticAlgorithm",tl),children:el.solarPanelCount>0&&Object(gf.jsxs)(gf.Fragment,{children:[It&&Object(gf.jsx)(wS,{setDialogVisible:Ct}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Ct(!0)},style:{paddingLeft:"12px"},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",tl),"..."]},"solar-panel-tilt-angle-ga-optimizer")]})},"genetic-algorithms"),Object(gf.jsx)(HP.a,{title:me.t("optimizationMenu.ParticleSwarmOptimization",tl),children:el.solarPanelCount>0&&Object(gf.jsxs)(gf.Fragment,{children:[kt&&Object(gf.jsx)(vS,{setDialogVisible:Yt}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Yt(!0)},style:{paddingLeft:"12px"},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",tl),"..."]},"solar-panel-tilt-angle-pso-optimizer")]})},"particle-swarm-optimization")]},"optimization"),ll&&Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",tl),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===H||void 0===H?void 0:H.showLabel),onChange:Nt,children:me.t("labelSubMenu.KeepShowingLabel",tl)})},"foundation-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:10},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",tl)+":",value:Et,onChange:function(e){return Ut(e.target.value)},onPressEnter:Vt,onBlur:Vt})},"foundation-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",tl)+":",min:H.lz/2+.2,max:100,step:1,precision:1,value:null!==(n=H.labelHeight)&&void 0!==n?n:H.lz/2+.2,onChange:function(e){return Bt(e)}})},"foundation-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",tl)+":",min:10,max:100,step:1,precision:0,value:null!==(c=H.labelFontSize)&&void 0!==c?c:20,onChange:function(e){return Gt(e)}})},"foundation-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",tl)+":",min:.2,max:5,step:.1,precision:1,value:null!==(s=H.labelSize)&&void 0!==s?s:.2,onChange:function(e){return Jt(e)}})},"foundation-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",tl)+":",value:null!==(d=H.labelColor)&&void 0!==d?d:"#ffffff",onChange:function(e){return Xt(e.target.value)}})},"foundation-label-color")]})]},"foundation-label")]})})),TS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Sr),c=Ew(Qn),s=Ew(Zn),d=Ew(nn),p=Ew(Ii),y=Ew(Ci),g=OP(V.Cuboid),m=Object(r.useState)(null!==(t=null===g||void 0===g?void 0:g.color)&&void 0!==t?t:"#808080"),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=$f();Object(r.useEffect)((function(){R()}),[g,d]);var j=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.Cuboid&&r.id===t&&!r.locked){var n,c=r;if(!c.faceColors)c.faceColors=new Array(6),c.faceColors.fill(null!==(n=c.color)&&void 0!==n?n:l);c.faceColors[e]=l;break}}}catch(s){i.e(s)}finally{i.f()}}))},H=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Cuboid&&i.id===e&&!i.locked){i.color=t;var r=i;r.faceColors||(r.faceColors=new Array(6));for(var n=0;n<4;n++)r.faceColors[n]=t;break}}}catch(c){o.e(c)}finally{o.f()}}))},z=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Cuboid&&!o.locked){o.color=e;var i=o;i.faceColors||(i.faceColors=new Array(6));for(var r=0;r<4;r++)i.faceColors[r]=e}}}catch(n){a.e(n)}finally{a.f()}}))},R=function(){var e;g&&(d>=0&&g.faceColors?v(g.faceColors[d]):v(null!==(e=g.color)&&void 0!==e?e:"#808080"))},D=function(e){if(g&&function(e){if(g){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Cuboid&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.faceColors){for(var r=0;r<4;r++)if(e!==o.faceColors[r])return!0}else if(e!==o.color)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var n,s=Object(f.a)(i);try{for(s.s();!(n=s.n()).done;){var u=n.value;if(u.type===V.Cuboid&&!u.locked){var h=u;if(h.faceColors){for(var p=0;p<4;p++)if(e!==h.faceColors[p])return!0}else if(e!==h.color)return!0}}}catch(m){s.e(m)}finally{s.f()}break;case _.OnlyThisObject:if(g.faceColors){for(var y=0;y<4;y++)if(e!==g.faceColors[y])return!0}else if(e!==(null===g||void 0===g?void 0:g.color))return!0;break;default:if(d>=0){if(e!==((null===g||void 0===g?void 0:g.faceColors)?null===g||void 0===g?void 0:g.faceColors[d]:null===g||void 0===g?void 0:g.color))return!0}else if(e!==(null===g||void 0===g?void 0:g.color))return!0}return!1}}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var r=t.value;if(r.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(r.id)){var s=r;if(s.faceColors)l.set(r.id,Object(h.a)(s.faceColors));else{var m,w=null!==(m=s.color)&&void 0!==m?m:"#808080";l.set(r.id,[w,w,w,w,w,w])}}}}catch(X){a.e(X)}finally{a.f()}var x={name:"Set Color for Selected Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];if(o&&Array.isArray(o))for(var i=0;i=0){var J=g.faceColors?g.faceColors[d]:g.color,G={name:"Set Color for Selected Side of Cuboid",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:g.id,changedElementType:g.type,changedSideIndex:d,undo:function(){void 0!==G.changedSideIndex&&j(G.changedSideIndex,G.changedElementId,G.oldValue)},redo:function(){void 0!==G.changedSideIndex&&j(G.changedSideIndex,G.changedElementId,G.newValue)}};n(G),j(d,g.id,e),y(p+1),o((function(t){t.actionState.cuboidFaceColors||(t.actionState.cuboidFaceColors=["#808080","#808080","#808080","#808080","#808080","#808080"]),t.actionState.cuboidFaceColors[d]=e}))}}P(!T)}},M=d>=0&&(null===g||void 0===g?void 0:g.faceColors)?g.faceColors[d]:null!==(l=null===g||void 0===g?void 0:g.color)&&void 0!==l?l:"#808080";return Object(gf.jsx)(kP,{width:600,title:me.t("word.Color",S),onApply:function(){D(x),a(!1),y(0)},onClose:function(){R(),a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(YP.a,{color:null!==x&&void 0!==x?x:M,onChangeComplete:function(e){v(e.hex),P(!T)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){s(e.target.value),P(!T)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("cuboidMenu.OnlyThisSide",S)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.AllSidesOfThisCuboid",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfSelectedCuboids",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfAllCuboids",S)})]})})})]})})},PS=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(en),n=Ew(wn),c=Ew(An),s=Ew(qn),h=Ew(cn),p=Ew(Sr),y=Ew(Qn),g=Ew(Zn),m=Ew(si),w=Ew(Ii),x=Ew(Ci),v=Ew(Oi),b=OP(V.Cuboid),A=Object(r.useState)(null!==(t=null===b||void 0===b?void 0:b.lx)&&void 0!==t?t:0),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),O=Object(r.useRef)(),F=$f(),k=function(e){return!function(e){if(b){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(o.id)){var r=o,n=i(r.id);if(n.length>0&&!Tw.doesNewSizeContainAllChildren(r,n,e,r.ly))return!1}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var c,s=Object(f.a)(a);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Cuboid){var u=d,h=i(u.id);if(h.length>0&&!Tw.doesNewSizeContainAllChildren(u,h,e,u.ly))return!1}}}catch(g){s.e(g)}finally{s.f()}break;default:var p=i(b.id);if(p.length>0)return Tw.doesNewSizeContainAllChildren(b,p,e,b.ly)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},L=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(c){o.e(c)}finally{o.f()}m((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.id){i.parentId=xt;var r=new Me.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new Me.Vector3(r.x,r.y,0)),H.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},E=function(e,t){var l=i(e.id),a=e.rotation[2];if(D.current.clear(),I.current.clear(),l.length>0){var o,r=Object(f.a)(l);try{for(r.s();!(o=r.n()).done;){var u=o.value;if(Tw.isIdentical(u.normal,Tt))switch(u.type){case V.SolarPanel:case V.Sensor:var h=new Me.Vector2(u.cx*e.lx,u.cy*e.ly).rotateAround(Dt,a);D.current.set(u.id,h),z.current.set(u.id,new Me.Vector3(u.cx,u.cy));break;case V.Polygon:var p,y=u,g=[],m=Object(f.a)(y.vertices);try{for(m.s();!(p=m.n()).done;){var w=p.value;g.push(new Me.Vector2(w.x*e.lx,w.y*e.ly).rotateAround(Dt,a))}}catch(J){m.e(J)}finally{m.f()}I.current.set(u.id,g),M.current.set(u.id,y.vertices.map((function(e){return Object(d.a)({},e)})))}Tw.isPlantOrHuman(u)&&z.current.set(u.id,new Me.Vector3(u.cx,u.cy,u.cz))}}catch(J){r.e(J)}finally{r.f()}}if(c(e.id,t),l.length>0){var x,v=Object(f.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(Tw.isIdentical(b.normal,Tt))switch(b.type){case V.SolarPanel:case V.Sensor:var A=D.current.get(b.id);if(A){var T=new Me.Vector2(A.x,A.y).rotateAround(Dt,-a).x/t;n(b.id,T),R.current.set(b.id,new Me.Vector3(T,b.cy))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,H=[],C=Object(f.a)(P);try{for(C.s();!(S=C.n()).done;){var O=S.value.rotateAround(Dt,-a),F=O.x/t,k=O.y/e.ly;H.push({x:F,y:k})}}catch(J){C.e(J)}finally{C.f()}s(b.id,H),W.current.set(b.id,H.map((function(e){return Object(d.a)({},e)})))}}if(Tw.isPlantOrHuman(b))if(R.current.set(b.id,new Me.Vector3(b.cx,b.cy,b.cz)),j.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var E=Et.getState().contentRef,U=Y(null===E||void 0===E?void 0:E.current,e.id);L(U,e,b)}}else if(Math.abs(Math.abs(b.cx)-e.lx/2)0?t:-t)/2;n(b.id,N),R.current.set(b.id,new Me.Vector3(N,b.cy,b.cz))}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=Y(null===a||void 0===a?void 0:a.current,t),i=Y(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=Y(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},N=function(e,t){e&&m((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},J=function(e){if(b&&function(e){if(b){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.lx-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Cuboid&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var d,u=Object(f.a)(a);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.Cuboid&&h.parentId===(null===b||void 0===b?void 0:b.parentId)&&!h.locked){var p=h;if(Math.abs(p.lx-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;case _.AllObjectsOfThisType:case _.AllObjectsOfThisTypeAboveFoundation:break;default:if(Math.abs((null===b||void 0===b?void 0:b.lx)-e)>At)return!0}return!1}}(e)){var t=o(b.id),l=t?t.lx:b.lx;if(O.current=void 0,C.current=k(e),C.current)O.current=e,S(l);else switch(y){case _.AllSelectedObjectsOfThisType:var i,r=new Map,n=Object(f.a)(a);try{for(n.s();!(i=n.n()).done;){var d=i.value;d.type===V.Cuboid&&!d.locked&&Ew.getState().selectedElementIdSet.has(d.id)&&(r.set(d.id,d.lx),E(d,e))}}catch(G){n.e(G)}finally{n.f()}var g={name:"Set Length for Selected Cuboids",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(g.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(G){t.e(G)}finally{t.f()}if(g.oldChildrenPositionsMap&&g.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(g.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,d,p=Object(u.a)(i.value,2),y=p[0],m=p[1];h(y,m.x,m.y,m.z);var w=null===(n=g.oldChildrenParentIdMap)||void 0===n?void 0:n.get(y),x=null===(d=g.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);w&&x&&w!==x&&(U(w,x,y),N(w,y))}}catch(G){r.e(G)}finally{r.f()}}if(g.oldChildrenVerticesMap&&g.oldChildrenVerticesMap.size>0){var v,b=Object(f.a)(g.oldChildrenVerticesMap.entries());try{for(b.s();!(v=b.n()).done;){var A=Object(u.a)(v.value,2),T=A[0],P=A[1];s(T,P)}}catch(G){b.e(G)}finally{b.f()}}},redo:function(){var e,t=Object(f.a)(g.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];c(a,g.newSize)}}catch(G){t.e(G)}finally{t.f()}if(g.newChildrenPositionsMap&&g.newChildrenPositionsMap.size>0){var o,i=Object(f.a)(g.newChildrenPositionsMap.entries());try{for(i.s();!(o=i.n()).done;){var r,n,d=Object(u.a)(o.value,2),p=d[0],y=d[1];h(p,y.x,y.y,y.z);var m=null===(r=g.oldChildrenParentIdMap)||void 0===r?void 0:r.get(p),w=null===(n=g.newChildrenParentIdMap)||void 0===n?void 0:n.get(p);m&&w&&m!==w&&(U(w,m,p),N(w,p))}}catch(G){i.e(G)}finally{i.f()}}if(g.newChildrenVerticesMap&&g.newChildrenVerticesMap.size>0){var x,v=Object(f.a)(g.newChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];s(A,T)}}catch(G){v.e(G)}finally{v.f()}}}};p(g),x(w+1);break;case _.AllObjectsOfThisTypeOnSurface:var m,v=new Map,A=Object(f.a)(a);try{for(A.s();!(m=A.n()).done;){var T=m.value;T.type!==V.Cuboid||T.parentId!==b.parentId||T.locked||(v.set(T.id,T.lx),E(T,e))}}catch(G){A.e(G)}finally{A.f()}var P={name:"Set Length for All Cuboids on Surface",timestamp:Date.now(),oldSizes:v,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(P.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(G){t.e(G)}finally{t.f()}if(P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(P.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,d,p=Object(u.a)(i.value,2),y=p[0],g=p[1];h(y,g.x,g.y,g.z);var m=null===(n=P.oldChildrenParentIdMap)||void 0===n?void 0:n.get(y),w=null===(d=P.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(G){r.e(G)}finally{r.f()}}if(P.oldChildrenVerticesMap&&P.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(P.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];s(A,T)}}catch(G){v.e(G)}finally{v.f()}}},redo:function(){if(function(e){var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.type!==V.Cuboid||o.locked||o.parentId!==(null===b||void 0===b?void 0:b.parentId)||E(o,e)}}catch(G){l.e(G)}finally{l.f()}}(P.newSize),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(P.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,o,i=Object(u.a)(e.value,2),r=i[0],n=i[1];h(r,n.x,n.y,n.z);var c=null===(l=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(o=P.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&d&&c!==d&&(U(d,c,r),N(d,r))}}catch(G){t.e(G)}finally{t.f()}}if(P.newChildrenVerticesMap&&P.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(P.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];s(m,w)}}catch(G){y.e(G)}finally{y.f()}}}};p(P),x(w+1);break;case _.AllObjectsOfThisType:var D,I=new Map,F=Object(f.a)(a);try{for(F.s();!(D=F.n()).done;){var Y=D.value;Y.type!==V.Cuboid||Y.locked||(I.set(Y.id,Y.lx),E(Y,e))}}catch(G){F.e(G)}finally{F.f()}var L={name:"Set Length for All Cuboids",timestamp:Date.now(),oldSizes:I,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(L.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(G){t.e(G)}finally{t.f()}if(L.oldChildrenPositionsMap&&L.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(L.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,d,p=Object(u.a)(i.value,2),y=p[0],g=p[1];h(y,g.x,g.y,g.z);var m=null===(n=L.oldChildrenParentIdMap)||void 0===n?void 0:n.get(y),w=null===(d=L.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(G){r.e(G)}finally{r.f()}}if(L.oldChildrenVerticesMap&&L.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(L.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];s(A,T)}}catch(G){v.e(G)}finally{v.f()}}},redo:function(){var e,t=Object(f.a)(L.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];c(a,L.newSize)}}catch(G){t.e(G)}finally{t.f()}if(L.newChildrenPositionsMap&&L.newChildrenPositionsMap.size>0){var o,i=Object(f.a)(L.newChildrenPositionsMap.entries());try{for(i.s();!(o=i.n()).done;){var r,n,d=Object(u.a)(o.value,2),p=d[0],y=d[1];h(p,y.x,y.y,y.z);var g=null===(r=L.oldChildrenParentIdMap)||void 0===r?void 0:r.get(p),m=null===(n=L.newChildrenParentIdMap)||void 0===n?void 0:n.get(p);g&&m&&g!==m&&(U(m,g,p),N(m,p))}}catch(G){i.e(G)}finally{i.f()}}if(L.newChildrenVerticesMap&&L.newChildrenVerticesMap.size>0){var w,x=Object(f.a)(L.newChildrenVerticesMap.entries());try{for(x.s();!(w=x.n()).done;){var v=Object(u.a)(w.value,2),b=v[0],A=v[1];s(b,A)}}catch(G){x.e(G)}finally{x.f()}}}};p(L),x(w+1);break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:E(b,e);var J={name:"Set Cuboid Length",timestamp:Date.now(),oldSize:l,newSize:e,resizedElementId:b.id,resizedElementType:b.type,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){if(c(b.id,J.oldSize),J.oldChildrenPositionsMap&&J.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(J.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];h(i,r.x,r.y,r.z);var n=null===(l=J.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=J.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&d&&n!==d&&(U(n,d,i),N(n,i))}}catch(G){t.e(G)}finally{t.f()}}if(J.oldChildrenVerticesMap&&J.oldChildrenVerticesMap.size>0){var p,y=Object(f.a)(J.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];s(m,w)}}catch(G){y.e(G)}finally{y.f()}}},redo:function(){if(c(b.id,J.newSize),J.newChildrenPositionsMap&&J.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(J.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];h(i,r.x,r.y,r.z);var n=null===(l=J.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=J.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&d&&n!==d&&(U(d,n,i),N(d,i))}}catch(G){t.e(G)}finally{t.f()}}if(J.newChildrenVerticesMap&&J.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(J.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];s(m,w)}}catch(G){y.e(G)}finally{y.f()}}}};p(J),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",F)+(void 0!==O.current?" ("+O.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Length",F),rejectedMessage:X,onApply:function(){J(P)},onClose:G,onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:500,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [0.1, 500] ",me.t("word.MeterAbbreviation",F)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",F)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",F)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSelectedCuboids",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",F)})]})})})]})})},SS=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(en),n=Ew(cn),c=Ew(xn),s=Ew(Sn),h=Ew(qn),p=Ew(Sr),y=Ew(Qn),g=Ew(Zn),m=Ew(si),w=Ew(Ii),x=Ew(Ci),v=Ew(Oi),b=OP(V.Cuboid),A=Object(r.useState)(null!==(t=null===b||void 0===b?void 0:b.ly)&&void 0!==t?t:0),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),O=Object(r.useRef)(),F=$f(),k=function(e){return!function(e){if(b){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(o.id)){var r=o,n=i(r.id);if(n.length>0&&!Tw.doesNewSizeContainAllChildren(r,n,r.lx,e))return!1}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var c,s=Object(f.a)(a);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Cuboid){var u=d,h=i(u.id);if(h.length>0&&!Tw.doesNewSizeContainAllChildren(u,h,u.lx,e))return!1}}}catch(g){s.e(g)}finally{s.f()}break;default:var p=i(b.id);if(p.length>0)return Tw.doesNewSizeContainAllChildren(b,p,b.lx,e)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},L=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(c){o.e(c)}finally{o.f()}m((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.id){i.parentId=xt;var r=new Me.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new Me.Vector3(r.x,r.y,0)),H.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},E=function(e,t){var l=i(e.id),a=e.rotation[2];if(D.current.clear(),I.current.clear(),l.length>0){var o,r=Object(f.a)(l);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(Tw.isIdentical(n.normal,Tt))switch(n.type){case V.SolarPanel:case V.Sensor:var u=new Me.Vector2(n.cx*e.lx,n.cy*e.ly).rotateAround(Dt,a);D.current.set(n.id,u),z.current.set(n.id,new Me.Vector3(n.cx,n.cy));break;case V.Polygon:var p,y=n,g=[],m=Object(f.a)(y.vertices);try{for(m.s();!(p=m.n()).done;){var w=p.value;g.push(new Me.Vector2(w.x*e.lx,w.y*e.ly).rotateAround(Dt,a))}}catch(J){m.e(J)}finally{m.f()}I.current.set(n.id,g),M.current.set(n.id,y.vertices.map((function(e){return Object(d.a)({},e)})))}Tw.isPlantOrHuman(n)&&z.current.set(n.id,new Me.Vector3(n.cx,n.cy,n.cz))}}catch(J){r.e(J)}finally{r.f()}}if(s(e.id,t),l.length>0){var x,v=Object(f.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(Tw.isIdentical(b.normal,Tt))switch(b.type){case V.SolarPanel:case V.Sensor:var A=D.current.get(b.id);if(A){var T=new Me.Vector2(A.x,A.y).rotateAround(Dt,-a).y/t;c(b.id,T),R.current.set(b.id,new Me.Vector3(b.cx,T))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,H=[],C=Object(f.a)(P);try{for(C.s();!(S=C.n()).done;){var O=S.value.rotateAround(Dt,-a),F=O.x/e.lx,k=O.y/t;H.push({x:F,y:k})}}catch(J){C.e(J)}finally{C.f()}h(b.id,H),W.current.set(b.id,H.map((function(e){return Object(d.a)({},e)})))}}if(Tw.isPlantOrHuman(b))if(R.current.set(b.id,new Me.Vector3(b.cx,b.cy,b.cz)),j.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var E=Et.getState().contentRef,U=Y(null===E||void 0===E?void 0:E.current,e.id);L(U,e,b)}}else if(Math.abs(Math.abs(b.cy)-e.ly/2)0?t:-t)/2;c(b.id,N),R.current.set(b.id,new Me.Vector3(b.cz,N,b.cz))}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=Y(null===a||void 0===a?void 0:a.current,t),i=Y(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=Y(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},N=function(e,t){e&&m((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},J=function(e){if(b&&function(e){if(b){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Cuboid&&c.parentId===(null===b||void 0===b?void 0:b.parentId)&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisType:var d,u=Object(f.a)(a);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.Cuboid&&!h.locked){var p=h;if(Math.abs(p.ly-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:if(Math.abs((null===b||void 0===b?void 0:b.ly)-e)>At)return!0}return!1}}(e)){var t=o(b.id),l=t?t.ly:b.ly;if(O.current=void 0,C.current=k(e),C.current)O.current=e,S(l);else switch(z.current.clear(),R.current.clear(),M.current.clear(),W.current.clear(),y){case _.AllSelectedObjectsOfThisType:var i,r=new Map,c=Object(f.a)(a);try{for(c.s();!(i=c.n()).done;){var d=i.value;d.type===V.Cuboid&&!d.locked&&Ew.getState().selectedElementIdSet.has(d.id)&&(r.set(d.id,d.ly),E(d,e))}}catch(G){c.e(G)}finally{c.f()}var g={name:"Set Width for Selected Cuboids on Surface",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(g.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];s(a,o)}}catch(G){t.e(G)}finally{t.f()}if(g.oldChildrenPositionsMap&&g.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(g.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var c,d,p=Object(u.a)(i.value,2),y=p[0],m=p[1];n(y,m.x,m.y,m.z);var w=null===(c=g.oldChildrenParentIdMap)||void 0===c?void 0:c.get(y),x=null===(d=g.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);w&&x&&w!==x&&(U(w,x,y),N(w,y))}}catch(G){r.e(G)}finally{r.f()}}if(g.oldChildrenVerticesMap&&g.oldChildrenVerticesMap.size>0){var v,b=Object(f.a)(g.oldChildrenVerticesMap.entries());try{for(b.s();!(v=b.n()).done;){var A=Object(u.a)(v.value,2),T=A[0],P=A[1];h(T,P)}}catch(G){b.e(G)}finally{b.f()}}},redo:function(){var e,t=Object(f.a)(g.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];s(a,g.newSize)}}catch(G){t.e(G)}finally{t.f()}if(g.newChildrenPositionsMap&&g.newChildrenPositionsMap.size>0){var o,i=Object(f.a)(g.newChildrenPositionsMap.entries());try{for(i.s();!(o=i.n()).done;){var r,c,d=Object(u.a)(o.value,2),p=d[0],y=d[1];n(p,y.x,y.y,y.z);var m=null===(r=g.oldChildrenParentIdMap)||void 0===r?void 0:r.get(p),w=null===(c=g.newChildrenParentIdMap)||void 0===c?void 0:c.get(p);m&&w&&m!==w&&(U(w,m,p),N(w,p))}}catch(G){i.e(G)}finally{i.f()}}if(g.newChildrenVerticesMap&&g.newChildrenVerticesMap.size>0){var x,v=Object(f.a)(g.newChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(G){v.e(G)}finally{v.f()}}}};p(g),x(w+1);break;case _.AllObjectsOfThisTypeOnSurface:var m,v=new Map,A=Object(f.a)(a);try{for(A.s();!(m=A.n()).done;){var T=m.value;T.type!==V.Cuboid||T.parentId!==b.parentId||T.locked||(v.set(T.id,T.ly),E(T,e))}}catch(G){A.e(G)}finally{A.f()}var P={name:"Set Width for All Cuboids on Surface",timestamp:Date.now(),oldSizes:v,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(P.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];s(a,o)}}catch(G){t.e(G)}finally{t.f()}if(P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(P.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var c,d,p=Object(u.a)(i.value,2),y=p[0],g=p[1];n(y,g.x,g.y,g.z);var m=null===(c=P.oldChildrenParentIdMap)||void 0===c?void 0:c.get(y),w=null===(d=P.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(G){r.e(G)}finally{r.f()}}if(P.oldChildrenVerticesMap&&P.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(P.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(G){v.e(G)}finally{v.f()}}},redo:function(){if(function(e){var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.type!==V.Cuboid||o.locked||o.parentId!==(null===b||void 0===b?void 0:b.parentId)||E(o,e)}}catch(G){l.e(G)}finally{l.f()}}(P.newSize),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(P.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,o,i=Object(u.a)(e.value,2),r=i[0],c=i[1];n(r,c.x,c.y,c.z);var s=null===(l=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(o=P.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);s&&d&&s!==d&&(U(d,s,r),N(d,r))}}catch(G){t.e(G)}finally{t.f()}}if(P.newChildrenVerticesMap&&P.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(P.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(G){y.e(G)}finally{y.f()}}}};p(P),x(w+1);break;case _.AllObjectsOfThisType:var D,I=new Map,F=Object(f.a)(a);try{for(F.s();!(D=F.n()).done;){var Y=D.value;Y.type!==V.Cuboid||Y.locked||(I.set(Y.id,Y.ly),E(Y,e))}}catch(G){F.e(G)}finally{F.f()}var L={name:"Set Width for All Cuboids on Surface",timestamp:Date.now(),oldSizes:I,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(L.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];s(a,o)}}catch(G){t.e(G)}finally{t.f()}if(L.oldChildrenPositionsMap&&L.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(L.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var c,d,p=Object(u.a)(i.value,2),y=p[0],g=p[1];n(y,g.x,g.y,g.z);var m=null===(c=L.oldChildrenParentIdMap)||void 0===c?void 0:c.get(y),w=null===(d=L.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(G){r.e(G)}finally{r.f()}}if(L.oldChildrenVerticesMap&&L.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(L.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(G){v.e(G)}finally{v.f()}}},redo:function(){var e,t=Object(f.a)(L.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];s(a,L.newSize)}}catch(G){t.e(G)}finally{t.f()}if(L.newChildrenPositionsMap&&L.newChildrenPositionsMap.size>0){var o,i=Object(f.a)(L.newChildrenPositionsMap.entries());try{for(i.s();!(o=i.n()).done;){var r,c,d=Object(u.a)(o.value,2),p=d[0],y=d[1];n(p,y.x,y.y,y.z);var g=null===(r=L.oldChildrenParentIdMap)||void 0===r?void 0:r.get(p),m=null===(c=L.newChildrenParentIdMap)||void 0===c?void 0:c.get(p);g&&m&&g!==m&&(U(m,g,p),N(m,p))}}catch(G){i.e(G)}finally{i.f()}}if(L.newChildrenVerticesMap&&L.newChildrenVerticesMap.size>0){var w,x=Object(f.a)(L.newChildrenVerticesMap.entries());try{for(x.s();!(w=x.n()).done;){var v=Object(u.a)(w.value,2),b=v[0],A=v[1];h(b,A)}}catch(G){x.e(G)}finally{x.f()}}}};p(L),x(w+1);break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:E(b,e);var J={name:"Set Cuboid Width",timestamp:Date.now(),oldSize:l,newSize:e,resizedElementId:b.id,resizedElementType:b.type,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){if(s(b.id,J.oldSize),J.oldChildrenPositionsMap&&J.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(J.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];n(i,r.x,r.y,r.z);var c=null===(l=J.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=J.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);c&&d&&c!==d&&(U(c,d,i),N(c,i))}}catch(G){t.e(G)}finally{t.f()}}if(J.oldChildrenVerticesMap&&J.oldChildrenVerticesMap.size>0){var p,y=Object(f.a)(J.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(G){y.e(G)}finally{y.f()}}},redo:function(){if(s(b.id,J.newSize),J.newChildrenPositionsMap&&J.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(J.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];n(i,r.x,r.y,r.z);var c=null===(l=J.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=J.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);c&&d&&c!==d&&(U(d,c,i),N(d,i))}}catch(G){t.e(G)}finally{t.f()}}if(J.newChildrenVerticesMap&&J.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(J.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(G){y.e(G)}finally{y.f()}}}};p(J),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",F)+(void 0!==O.current?" ("+O.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Width",F),rejectedMessage:X,onApply:function(){J(P)},onClose:G,onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:500,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [0.1, 500] ",me.t("word.MeterAbbreviation",F)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",F)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",F)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSelectedCuboids",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",F)})]})})})]})})},jS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew($r),n=Ew(Zr),c=Ew(zn),s=Ew(vn),d=Ew(Rn),h=Ew(bn),p=Ew(Sr),y=Ew(Qn),g=Ew(Zn),m=Ew(cn),w=Ew(Ii),x=Ew(Ci),v=OP(V.Cuboid),b=Object(r.useState)(null!==(t=null===v||void 0===v?void 0:v.lz)&&void 0!==t?t:0),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=$f(),D=function(e,t){c(e,t),s(e,t/2)},M=function(e){if(v){var t=i(v);if(t){var l,a=Object(f.a)(o);try{for(a.s();!(l=a.n()).done;){var r=l.value;r.type!==V.Cuboid||r.locked||r.parentId!==t.id||(c(r.id,e),s(r.id,e/2))}}catch(n){a.e(n)}finally{a.f()}}}},W=function(e){if(v){var t=Tw.getBaseId(v.id);if(t){var l,a=Object(f.a)(o);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.type!==V.Cuboid||i.locked||Tw.getBaseId(i.id)!==t||(c(i.id,e),s(i.id,e/2))}}catch(r){a.e(r)}finally{a.f()}}}},I=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},C=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(s){o.e(s)}finally{o.f()}l.parentId=xt;var c=new Me.Vector2(l.cx,l.cy).rotateAround(Dt,-t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));l.cx=c.x,l.cy=c.y,l.cz=0,z.current.set(l.id,new Me.Vector3(c.x,c.y,0)),j.current.set(l.id,xt)}},O=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.parentId===e.id&&(S.current.set(i.id,e.id),H.current.set(i.id,new Me.Vector3(i.cx,i.cy,i.cz)),Tw.isPlantOrHuman(i)))if(Math.abs(i.cz-e.lz/2)t/2){var n=Et.getState().contentRef,c=I(null===n||void 0===n?void 0:n.current,e.id);C(c,e,i)}else i.cz=r,z.current.set(i.id,new Me.Vector3(i.cx,i.cy,r))}}}catch(s){o.e(s)}finally{o.f()}}))},F=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=I(null===a||void 0===a?void 0:a.current,t),i=I(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=I(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},k=function(e,t){e&&a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},Y=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.lz=t,i.cz=t/2;else{var r=e.get(i.id);void 0!==r&&(i.lz=r,i.cz=r/2)}}}catch(n){o.e(n)}finally{o.f()}}))},L=function(e){if(v&&function(e){if(v){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Cuboid&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lz-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Cuboid&&!c.locked){var s=c;if(Math.abs(s.lz-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d=Tw.getBaseId(null===v||void 0===v?void 0:v.id);if(d&&d!==xt){var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Cuboid&&p.parentId&&p.parentId!==xt&&!p.locked){var g=p;if(d===Tw.getBaseId(g.id)&&Math.abs(g.lz-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}}break;case _.AllObjectsOfThisTypeOnSurface:var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var x=m.value;if(x.type===V.Cuboid&&x.parentId!==xt&&x.parentId===(null===v||void 0===v?void 0:v.parentId)&&!x.locked){var b=x;if(Math.abs(b.lz-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}break;default:if(Math.abs((null===v||void 0===v?void 0:v.lz)-e)>At)return!0}return!1}}(e)){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=new Map,i=Object(f.a)(o);try{for(i.s();!(t=i.n()).done;){var r=t.value;r.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(r.id)&&(l.set(r.id,r.lz),O(r,e))}}catch(Q){i.e(Q)}finally{i.f()}var c={name:"Set Height for Selected Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),undo:function(){if(Y(c.oldValues),c.oldChildrenPositionsMap&&c.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(c.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];m(i,r.x,r.y,r.z);var n=null===(l=c.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=c.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(F(n,s,i),k(n,i))}}catch(Q){t.e(Q)}finally{t.f()}}},redo:function(){var e=c.newValue;if(Y(c.oldValues,e),c.newChildrenPositionsMap&&c.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(c.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];m(r,n.x,n.y,n.z);var s=null===(a=c.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),d=null===(o=c.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);s&&d&&s!==d&&(F(d,s,r),k(d,r))}}catch(Q){l.e(Q)}finally{l.f()}}}};p(c),Y(l,e),x(w+1);break;case _.AllObjectsOfThisType:var s,g=new Map,b=Object(f.a)(o);try{for(b.s();!(s=b.n()).done;){var A=s.value;A.type===V.Cuboid&&(g.set(A.id,A.lz),O(A,e))}}catch(Q){b.e(Q)}finally{b.f()}var T={name:"Set Height for All Cuboids",timestamp:Date.now(),oldValues:g,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(Q){t.e(Q)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(T.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],h=s[1];m(d,h.x,h.y,h.z);var p=null===(n=T.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=T.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(F(p,y,d),k(p,d))}}catch(Q){r.e(Q)}finally{r.f()}}},redo:function(){var e=T.newValue;if(d(V.Cuboid,e),h(V.Cuboid,e/2),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(T.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];m(r,n.x,n.y,n.z);var c=null===(a=T.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=T.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(F(s,c,r),k(s,r))}}catch(Q){l.e(Q)}finally{l.f()}}}};p(T),d(V.Cuboid,e),h(V.Cuboid,e/2),x(w+1);break;case _.AllObjectsOfThisTypeAboveFoundation:var P,R=new Map,I=Tw.getBaseId(v.id),C=Object(f.a)(o);try{for(C.s();!(P=C.n()).done;){var L=P.value;L.type===V.Cuboid&&Tw.getBaseId(L.id)===I&&(R.set(L.id,L.lz),O(L,e))}}catch(Q){C.e(Q)}finally{C.f()}var E={name:"Set Height for All Cuboids Above Same Base",timestamp:Date.now(),oldValues:R,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(Q){t.e(Q)}finally{t.f()}if(E.oldChildrenPositionsMap&&E.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(E.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],h=s[1];m(d,h.x,h.y,h.z);var p=null===(n=E.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=E.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(F(p,y,d),k(p,d))}}catch(Q){r.e(Q)}finally{r.f()}}},redo:function(){var e=E.newValue;if(W(e),E.newChildrenPositionsMap&&E.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(E.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];m(r,n.x,n.y,n.z);var c=null===(a=E.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=E.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(F(s,c,r),k(s,r))}}catch(Q){l.e(Q)}finally{l.f()}}}};p(E),W(e),x(w+1);break;case _.AllObjectsOfThisTypeOnSurface:var U,N=new Map,J=Object(f.a)(o);try{for(J.s();!(U=J.n()).done;){var G=U.value;G.type===V.Cuboid&&G.parentId===v.parentId&&(N.set(G.id,G.lz),O(G,e))}}catch(Q){J.e(Q)}finally{J.f()}var X={name:"Set Height for All Cuboids on Same Surface",timestamp:Date.now(),oldValues:N,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(f.a)(X.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(Q){t.e(Q)}finally{t.f()}if(X.oldChildrenPositionsMap&&X.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(X.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],h=s[1];m(d,h.x,h.y,h.z);var p=null===(n=X.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=X.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(F(p,y,d),k(p,d))}}catch(Q){r.e(Q)}finally{r.f()}}},redo:function(){var e=X.newValue;if(M(e),X.newChildrenPositionsMap&&X.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(X.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];m(r,n.x,n.y,n.z);var c=null===(a=X.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=X.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(F(s,c,r),k(s,r))}}catch(Q){l.e(Q)}finally{l.f()}}}};p(X),M(e),x(w+1);break;default:var B=n(v.id),K=B?B.lz:v.lz;O(v,e),D(v.id,e);var q={name:"Set Cuboid Width",timestamp:Date.now(),oldValue:K,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),changedElementId:v.id,changedElementType:v.type,undo:function(){if(D(q.changedElementId,q.oldValue),q.oldChildrenPositionsMap&&q.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(q.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];m(i,r.x,r.y,r.z);var n=null===(l=q.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=q.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(F(n,c,i),k(n,i))}}catch(Q){t.e(Q)}finally{t.f()}}},redo:function(){if(D(q.changedElementId,q.newValue),q.newChildrenPositionsMap&&q.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(q.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];m(i,r.x,r.y,r.z);var n=null===(l=q.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=q.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(F(c,n,i),k(c,i))}}catch(Q){t.e(Q)}finally{t.f()}}}};p(q),x(w+1)}a((function(t){t.actionState.cuboidHeight=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Height",R),onApply:function(){L(T)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:T,onChange:P}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",R),": [0.1, 1000] ",me.t("word.MeterAbbreviation",R)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",R)}),(null===v||void 0===v?void 0:v.parentId)!==xt&&Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("cuboidMenu.AllCuboidsAboveSameBase",R)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSelectedCuboids",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",R)})]})})})]})})},HS=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(Nn),n=Ew(Sr),c=Ew(Qn),s=Ew(Zn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Cuboid),y=Object(r.useState)(p&&null!==(t=-p.rotation[2])&&void 0!==t?t:0),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e){var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.type!==V.Cuboid||o.locked||o.parentId!==(null===p||void 0===p?void 0:p.parentId)||i(o.id,0,0,-e)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.rotation[2]=t;else{var r=e.get(i.id);void 0!==r&&(i.rotation[2]=-r)}}}catch(n){o.e(n)}finally{o.f()}}))},A=function(e){if(p&&function(e){var t;switch(c){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(a);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Cuboid&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=i;if(Math.abs(-r.rotation[2]-e)>At)return!0}}}catch(w){o.e(w)}finally{o.f()}break;case _.AllObjectsOfThisTypeOnSurface:var n,s=Object(f.a)(a);try{for(s.s();!(n=s.n()).done;){var d=n.value;if(d.type===V.Cuboid&&d.parentId===(null===p||void 0===p?void 0:p.parentId)&&!d.locked){var u=d;if(Math.abs(-u.rotation[2]-e)>At)return!0}}}catch(w){s.e(w)}finally{s.f()}break;case _.AllObjectsOfThisType:var h,y=Object(f.a)(a);try{for(y.s();!(h=y.n()).done;){var g=h.value;if(g.type===V.Cuboid&&!g.locked){var m=g;if(Math.abs(-m.rotation[2]-e)>At)return!0}}}catch(w){y.e(w)}finally{y.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:if(Math.abs((p&&null!==(t=-p.rotation[2])&&void 0!==t?t:0)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var s=t.value;s.type===V.Cuboid&&!s.locked&&Ew.getState().selectedElementIdSet.has(s.id)&&l.set(s.id,-s.rotation[2])}}catch(M){r.e(M)}finally{r.f()}var y={name:"Set Azimuth for Selected Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(y.oldValues)},redo:function(){b(y.oldValues,-y.newValue)}};n(y),b(l,-e),h(d+1);break;case _.AllObjectsOfThisTypeOnSurface:var g,m=new Map,w=Object(f.a)(a);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type!==V.Cuboid||x.parentId!==p.parentId||x.locked||m.set(x.id,-x.rotation[2])}}catch(M){w.e(M)}finally{w.f()}var A={name:"Set Azimuth for All Cuboids on Surface",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,0,0,-o)}}catch(M){t.e(M)}finally{t.f()}},redo:function(){v(A.newValue)}};n(A),v(e),h(d+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(a);try{for(S.s();!(T=S.n()).done;){var j=T.value;j.type!==V.Cuboid||j.locked||P.set(j.id,-j.rotation[2])}}catch(M){S.e(M)}finally{S.f()}var H={name:"Set Azimuth for All Cuboids",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){b(H.oldValues)},redo:function(){b(H.oldValues,-H.newValue)}};n(H),b(P,-e),h(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:var z=o(p.id),R=z?-z.rotation[2]:-p.rotation[2],D={name:"Set Cuboid Azimuth",timestamp:Date.now(),oldValue:R,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){i(D.changedElementId,0,0,-D.oldValue)},redo:function(){i(D.changedElementId,0,0,-D.newValue)}};n(D),i(p.id,0,0,-e),h(d+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Azimuth",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:-180,max:180,style:{width:120},step:.5,precision:2,value:parseFloat(Tw.toDegrees(m).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){w(Tw.toRadians(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",paddingRight:"6px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [-180\xb0, 180\xb0]",Object(gf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",x),Object(gf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){s(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSelectedCuboids",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",x)})]})})})]})})},zS=l.p+"static/media/building_facade_05_menu.8fe3496b.png",RS=l.p+"static/media/building_facade_06_menu.4342d26b.png",DS=l.p+"static/media/building_facade_10_menu.de5158c9.png",MS=function(e){var t=e.setDialogVisible,l=Ew(si),a=Ew(Fi),o=Ew(Sr),i=Ew(Qn),n=Ew(Zn),c=Ew(nn),s=Ew(Ii),d=Ew(Ci),p=OP(V.Cuboid),y=Object(r.useState)(p&&p.textureTypes&&c>=0?p.textureTypes[c]:de.NoTexture),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=db.a.Option;Object(r.useEffect)((function(){p&&w(p.textureTypes&&c>=0?p.textureTypes[c]:de.NoTexture)}),[p,c]);var b=function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.Cuboid&&r.id===t&&!r.locked){var n=r;n.textureTypes||(n.textureTypes=new Array(6),n.textureTypes.fill(de.NoTexture)),n.textureTypes[e]=a;break}}}catch(c){i.e(c)}finally{i.f()}}))},A=function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Cuboid&&i.id===e&&!i.locked){var r=i;r.textureTypes||(r.textureTypes=new Array(6),r.textureTypes.fill(de.NoTexture));for(var n=0;n<4;n++)r.textureTypes[n]=t;break}}}catch(c){o.e(c)}finally{o.f()}}))},T=function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Cuboid&&!i.locked&&e.has(i.id)){var r=i;if(r.textureTypes||(r.textureTypes=new Array(6),r.textureTypes.fill(de.NoTexture)),void 0!==t)for(var n=0;n<4;n++)r.textureTypes[n]=t;else{var c=e.get(i.id);if(c&&c.length>=4)for(var s=0;s<4;s++)r.textureTypes[s]=c[s]}}}}catch(d){o.e(d)}finally{o.f()}}))},P=function(e){l((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Cuboid&&!o.locked){var i=o;i.textureTypes||(i.textureTypes=new Array(6),i.textureTypes.fill(de.NoTexture));for(var r=0;r<4;r++)i.textureTypes[r]=e}}}catch(n){a.e(n)}finally{a.f()}}))},S=function(e){if(p&&function(e){if(p){switch(i){case _.AllObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var r=o;if(r.textureTypes)for(var n=0;n<4;n++)if(e!==r.textureTypes[n])return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Cuboid&&!u.locked){var h=u;if(h.textureTypes)for(var y=0;y<4;y++)if(e!==h.textureTypes[y])return!0}}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisObject:if(p.textureTypes)for(var g=0;g<4;g++)if(e!==p.textureTypes[g])return!0;break;default:if(c>=0&&p.textureTypes&&e!==p.textureTypes[c])return!0}return!1}}(e))switch(i){case _.AllSelectedObjectsOfThisType:var t,r=new Map,n=Object(f.a)(a);try{for(n.s();!(t=n.n()).done;){var y=t.value;if(y.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(y.id)){var g=y;r.set(y.id,g.textureTypes?Object(h.a)(g.textureTypes):void 0)}}}catch(W){n.e(W)}finally{n.f()}var m={name:"Set Texture for Selected Cuboids",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];if(o&&Array.isArray(o))for(var i=0;i=0){var D=p.textureTypes?p.textureTypes[c]:de.NoTexture,M={name:"Set Texture for Selected Side of Cuboid",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,changedSideIndex:c,undo:function(){void 0!==M.changedSideIndex&&b(M.changedSideIndex,M.changedElementId,M.oldValue)},redo:function(){void 0!==M.changedSideIndex&&b(M.changedSideIndex,M.changedElementId,M.newValue)}};o(M),b(c,p.id,e),d(s+1),l((function(t){t.actionState.cuboidFaceTextures||(t.actionState.cuboidFaceTextures=[de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture]),t.actionState.cuboidFaceTextures[c]=e}))}}};return Object(gf.jsx)(kP,{width:600,title:me.t("word.Texture",x),onApply:function(){S(m)},onClose:function(){(null===p||void 0===p?void 0:p.textureTypes)&&c>=0&&w(p.textureTypes[c]),t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:m,onChange:w,children:[Object(gf.jsxs)(v,{value:de.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",x)]},de.NoTexture),Object(gf.jsxs)(v,{value:de.Facade01,children:[Object(gf.jsx)("img",{alt:de.Facade01,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture01",x)]},de.Facade01),Object(gf.jsxs)(v,{value:de.Facade02,children:[Object(gf.jsx)("img",{alt:de.Facade02,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture02",x)]},de.Facade02),Object(gf.jsxs)(v,{value:de.Facade03,children:[Object(gf.jsx)("img",{alt:de.Facade03,src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QsbACcCTl4SVwAAIABJREFUeJytnNmPZMl13n8nIu69udWSVdW19N7TMxxqVg53kRIp0gQsSoLeBT9aT6Zf5EdZAiTLgGzAMqwHv1mA/wHDL4ZtwBAhipZk2pYESRQ5M733LFXdVV1rVmbeeyPi+CEis7pnemaahBuo7q7s7K++iBsR55zvfJHyS7/6a/rDH93kt3/7N/lv//2/0HbX+I3v/GO++z++x6339ljb3OLrr13g01fOYZ1DgKgKAtPxlP/83b/lvYMjFpfX+PSldf7jv/93jOvIb/yzf8q//t3fQXpDfv/f/Cu+/4O/5cHBMWsrq3z91S2ev7SGKwoEUECA0eiU//Tdv+XB0QnLK+s8vzXkP/zhH2CKPt/5zq/zL37rN1ncuMLv/f7v8cf/8y/ZPxmzvrrK1185x+XzKxRFB2vMU/GGq+tc3xzyR3/4B0jZ5zv/5Nf53d/65yxtXJ7jPToes762xtdePsf1S+dwRfmR/Iar6zy/ucwf/eG/hYyX+F3m937/X/LH3/9LHo0S3i+8vMbl8yuILdAIEDEiCMp//f6PePOdPTr9Pm98+jruygufxpcLlJ2S1aUeY2eoT4/p9ftsbpUMFgbE0DCeTihcQQwBMRaxlrppGSwvcc716PcHdLsln3r1Nca1x1UdvvjNX2SqgggMh8uYaoFev0vQyGQ6oQhhjmeMoW4Ci8vLxHLAwsICvV7Fpz/zBlEsrtPly9/6FUzZQVBWVlYo+8ssDHr4CNNJQwgCGhDjPhLvxc+8QRSH63T52W/9EqbqAspwZYWyt8xgoUdQZTKd4nziZ+yH8QYLC3R7HV54/TOocWf8qg6grK6u0llYoT/o4DXxwwRijBhjMEbQEOn0B5zbsFRVh8IJLtYjBoVCaBkdHjNyQhtgcWWVzjL44PFtg0YIUVEFCQFrhKBKf2nIYFggxtC2JxTUOA1E37I0cMSRJ7Se4XDI8JyjaSOqU1SfxDMiBJTB8gqLqwXGCL49odCaqAUaWoYDx9hHgvesrAxZKwoaH4AWESFqBCThGSGi9JeHLK5WGe8o48WMVzD2keg9qytDzs3wtCbGdBIoELxHCkfQSH9pyOJqiRFD2xxR0aRxPM6vbVkZLrNaljTeg2Z+MaAxogBiCaqU/UUuD1bRqFgbca9+/hs0GNYvbvG1X/lHqK3oVgWtBvq9LocnERXBCFhjwRhi8KABjQGNQrfraOsWQ8lnv/ptglg2tjZ46Y0OHktVFfg4ol/1CLEmeo8BrH0Mj4iGjNd31NMGayq+8PO/DK5gfXOdlz/3DXAFRZ6cblUQghJDi6Bp5YnM+cUQIBq6fUszbbCm88l4UYnBY0QfG29AUIgR1NLrJH7Odvj8134Z7JN4ZVngNTKoHCEE1LcIEVcUoBGNipC+YhA6fYdvWjQI7itfeoXlpUWm4zEvXL9CaQz3791Go1IVJaWZQoho9AQPqgCKqhB9wApUVUX0nkKVL3z5NXr9Ps14wnPXLuKs4d69e2hUOtZSayRET4yB0NaophNa8wQaI5RlRVs3VFb4ws+9QbfToZlMuX7tItYYbt25AxE61jIlEIInBI+2AgqK4oMSgscaoaoq/DPiTTRkfp7gmzmeaiCEgDVQVo/x++oH8YRbd++CzvhFfPSEEDDYtPAQNLYEH7GiFEWJ0Qj1GKdtINQthEAzGaPWggpWA74Zg58gVcAaizWG/DjyChdEIgZBSYFeG48WHiMC3qNqETEYY/B+SiQigAGcmf0NDIq1ghXFYNLLBrRpUVtgAUJANWIzXusbVEAEDAaXgEiMYnpdFKMGlWfDQ8CIYMXgjJBCb+LnrGAkfgKeYHmcnyIiOLEYASTvDTUgMe1EDF4EsYI73rtLeyTYosRYR+Mczeke3XBAe7hL2QakLDja36FwgtGAisNZx8nJhNIL4fgI59M5ebR7m+mBgFgaH+h0Kqb7h3SaffyxpQweisDxQaAsBKOKGou1BacnY8oghOMDCt+AsRw9tEycgBjaEKmqkvrokE57QDixVDGivmVymo5A304hpkTiZFxThgJ/fEjhW/DmE/E6MaLBJ35OMBrn/EaZ30+EFwJaeE5HgrUy54fAZFrjQoGOTrDBIxqQX/v2z6uf1pRlB2McIhBizWSqqBiIEWMUsUJhDapCiOm8FtEUD4yAtZAOH5ppjTEupYuagq2KUFUFaGAybXCuoHQGVYOPETEpTkXvESOINSlAP4GXjySNqBiqyoJGxtMa60oK69B8/gevKAGxdh4LkA/yezreZFrjXElpDcqH+X30eD+C36TBuoLCWTQEjMR8/HskZ3DGWVQVd3NnkjOpMaKKoogYRCJFUSIihAjWpG08OyICEVFBgmBLQ+MnoGmrpl9t/lNQUrCuXKRpa9qgWNviTDrOVDQdZTO8wtCE9iPxIBCjUDlH09b4qIh4jEQQl+KSRkQkHYVlpG0bwGCM/US8NirOeqx8BL9PGO8TeL7Ge0VMi0hE5vwURDEx4CpHGycQBffaZ99AUYIPKYcXk4NYxLctxjhcUWJNGowY5oEOBY3CdDpCrVDYCmstImltA6gEiKCqtE1NRLG2wBqDtS6tNhUi8TG8E9QYCveseGU+3w0qklaoavo/apnWI9QIpauw1v1/4PeTjjfxE0m7VFXnyYyoZTodgbMUrsBdvLSBNRYNSoh5VYkQgmfn4QOcLRmuLGJIqyWqR8TmlabEGNjZbukvDFhaXgYizhSIQAyBnJQRomf7/W1cUbI8XMQalyZQAyIOMeYJvN7CgOFwGdVnwVvCWZdeDwFj0qDFWAR4sOPpLQxYfma8x/l5RIoP8fvJxvthflEVIw4lsrPdsLSyzOLiAq4+PsBa8BGQkqAeE0Mq8YOn219mdXUdIVWXk2lNWZaURQECB3sPMAQINfVoH6LirRCIhJAyFlRRgdIpi0tLrK+tExQK5+Z4RZEGNcOTUDM92YcY8dZ8AA9UlNIpC0tLrK9t5KxeaRufYgdCp9vl+HAPQ4Q53tP4neEtLi2xfm6dGME9xq8sCkSE/b2dD4z36fzinN9i5pckmKZpgYggVFWH/UcPcBKhnVAft7ibb7+ZnjwpgKEQNGCAshqwcf45Njc3MUZSYMtbEwRrDUTPnRtvs/3+fawxOElBDWNyzSK0IVAYS6fb59z5q2xsbmCsxViDkYSomhOF6Llz462MJzhJapIag4ZU2XuNlMZS9vqsb11lcyvhMUsDVFFS1Y4G7t64wfvv33s2vPNX2dzcTGM1FskLChRrHRrbx8Z7hhfTskdjxrOWstvn3IyfORtvDAGvHoMhhpr7N2+wvf0Ozljc5sY5bNlBMYhGlEDTKpPJKUvDDa4/d51et4PYtP2tMRhriVER4MrVa4xP9vjzHxwwXFqmX1lMWaFqEFWiepo20tZjVtYucO3qc3Q6XcqqoioLjE1BsW08GgNXrl3j9GSPP/+LQ1bWVul2SmI0GCc4UrEcNNBORiwMN7n63HN0OhVi0mCttVhrCTGCKt3nnmMyesT+/z5gdW2VXlURNeHZx/Dq8QmLw02uXnuOsqooi4Kq6iBGiCHQ+lQVX75yldOTPfb/1wErq4/xs4KTGV6knZywsLzJ1WvX6HQ6FGVJp9NNkk4M1HVDaD0vfvoljE757ne/x+r6Odxqv8IMern0ARFLCBGxGwzXL3Pp0hbWpYCelJ2Ic0XeJ0LhLE3zEg/2HmGaU3rOYHs9VEx+aErEgqyzsn6ZC+e3cEWKQc45xOQV2037rnCG8fUX2dl7RFlYul2HUJKSGUVDRGNDZJWVc1e4eOE81qRiyxUpxRUjsySGorDU059h99E+hQOXg2lVkVJVVWJUdG2FlfUrXLx4ASNgrM3HlEFJcocqlM4wnb7Ig91HVKWh0y0RkvYGMRWHscWzwvLqeS5dPE9ZlGAEZ9OOU6DbSxJNt1Phx9e4cP5NlnolTtdfQpyhaQJFWeJsyqf7C6tU3Q4jb1npWEpniQCqOOew1hJ9ZG9U07pVzr3wFR69/w6xNNjS0Taeoiiw1uCx9BdXKTsdRr5gpWPpVA6RRDAVsEIIgb1RQ6jOsf7CV9nbeY9YWcrSUdctrihwxtBE6C+uUXQ7jFrHysBSzh6GpLxcRAg+sHvSEMq1jPcuhVOMNZxMGvqdTiomFRZXNii6PUaNY2VgqKoiKQZCSjoy3t4o4Z174SvsP3iP2LGUhaOu/ZP8FpYxxjJqhbWuoyqLuY4vc36Wh8ct4+IcVz77bfbeu4/ZP5iwd1jzqVe/Qt0aDo4bXnztyxw1jr96833+4s1tHh2NEMm1iLU4a3HWEDXyf998lz/5q5uM4gKXPv1Zjo6nPNgd8cIrX8Frwf5Ry6de/RKjUPHXb2/z5z9+j93DkySdFA7nLNZZnDOEGPjfP7rP9/76FmMWufT8qzzaPWJn94TnX/oik1rZP2p48fXM760zfkbBOofJi8XZx/D+6g5jlrj0qdc5PJ5yOPK89oVv0lByPBZe+tzXOGrKNN4fv8fe0ShJGoWdL74P4k1kiYvPv86j3RN2dkcf4PezHLUd/u7uI/7kb97jvb2TJL18CE/5Pz++z5/+9V1OWebaK1/A3L59ixu336V0cPfOfW7evY+TQAgtU+9RsfigOeim81mMTeFTwBlD8EpTt5SlcPvWLd66eY+ygHfuvseNW/ewJDFx2npUHD7ktCCvFDFm/ncrQvCRpmkpCrh58yY3br9D6Qz37ryT+cXEr0382qCoKOSU/Uk8k/DalsLBzbdv8PbN+xQ2cvf2fW7evfvkeI3DB83yi3kKP/MYP+XmjRtP4ZfaD3UTaNXl+QM+hMcZXl1TloLrdDrUUYkxVeaDqos1BQZL4VwSFZ3NWZaZHy9JOrFpO1uLdQYRQ9WpaKaBGD22LOgtLGBticFQuCQTFK7A2iJlWKKg+cHM8ExaRcZYqk5FKxCj/0h+zqUaSSDVC8pjeBZxT8MLSWX9IJ44nLWpKfVUfh+F9wF+YjFF2vmldbnITDLsU/GcxYjBTesp1qUuXNSAMRXWWKIqEYUYsEpeLSmZNsZgbP6egLU26TgxpcYaQ05ls0qcsx5FkRjzxM0ecF7ZJscSFOtSgkFMrxNCKrw+lp/kojad+0/g5UzumfA0pKD+cfw+Cc9afEyVvVUQQ9bCsszxFDwFrDhM2zRgHVFA8YiJGJMqSo0xC4OzemG23bLkLYboA6FtaGObpOY0G0SyeCapuxhjqnJDDDmwgWRpOol+zBUC71va2KY0STnD+1h+kjO2jP04XtvQPCteDID5eH7PgKcxIjESNKYkIwkrH40X2hRLJU909J7JZESHIq82zYaBGRgZbCamCUg6GzUC8eydoil3H09GIFU+5mJSXeXsgQoGRJGcfaiQ0ssAEuc/FFHzDPwEwWR68hhe+kp48sl4ebIk432Y3zPgIRhRoioBfWzMH4ens15MWv0oTCdTNPp03HiPb9pUYCWGZzLITGIGosTUrYsx/bBZfFGhnk5z+zN1F33dph1CmvjEKsnsqpmgpJZsjDEPIotyn8TP5AWjuYk2x4vE4Ikhzlf8x+PlRtu80v8gv0/GM4D3Pj1cTUf3J+LFiKC4k/0dyk4fax2T0xGTk3HefvPnMP919prOgygopsxBLgZOD3fx9DDOMhmP2Xu4R0gaCma2OmYa/mzL54k3+Z9MkSv46Dk92MUM1ub8xqMxcXZSyJP80jc6380JL/Nzz4CXIWaSz9P5PQMegkYl7d8ZJfOxeMaalBof7+9jigEaW04P9/DSRQR8aBO7GNN5OJd0IiFobucqvvFZ7k4r4OTgkFF7jPqW8dEjjkYtYoTgm1xYpvdKPvpmOhb5T1/7jJXwjg/34dQ/yc8Iwbc58EdiDqCpPJ8RneGFZ8ebjVf1Y/g9Cx7E0KI+oD4QfJgH9JnW9kG8dMIIpqGiDYZmMuHhziFeS2LwhAhRDCHXICl8pAEr2SKjSmh9Est8Oj5meG095eH2AW0s0dASFKKxZ3gksSb1w/OZr4pv22wwaIlBqbWijjbzO8BriQaf8CThCTrfLeYxPOb8UqLwk+AJ+iF+z4oXQp6TGIkKLgufBj4SL/hkenCvfP7zdPoLuE6XL/2Db2M6yTi2MhxS9ZYZDLqECHXdYi2E4BGTqsymDgyWl1l3ffqDAd1OxQuvvsKkidiqwxe/+Q+pc/94eTkZ5fq9DhGY1FOKcGa8M9bSNJ6l4RCtFuZGtBdfez0b0Tp8+Vu/hFRdlJiMbX1lYdAlRphOa4IKxJlRziZj23CZ2BkwGDwb3mDQIShM6poixMeMfM+OJ6osD5exRZ/+4oAQWibTCc49Od669gmv6tPtDyicwblYU8ROMnotOCZtJLae1ZUVzhUlTQhE6iQUmqQDiSZ3SFSlv7TMYJhavd6PKGjwMYBvGA4c+yM/N46tnEvGMY0JL8QkV5KNclFhsDxkca1ExODbI0qaJP4Fz/Ig8Qtty+pwyFpZ0PqA0iImKdAgc+NdVP3p8LRODTvzQX7PgJeNcqtrqyytJpNd8A0xexE0damyke9svBqTbcl9+Rd+larXY33zHK987puILShKR9BAt+MIk+TCMCgmZ1AaQ4oFMaDR0usWNE2DoeRzX/lFgnGsb23wM2908RiqTomPp/Qrd2ZEg1Rg5RRZ5kY5S7cqqKf13Nim2dg251ckI9pCpyCezoxy8Qmj3JN4M+Pdk0a5j8Tzfp4GgyHGD+IVNJnf55+C58oCH580GlrIeHm8eobXqwqmkxqRAvetr32OXr9HM5lw/doljBHuPGYcq9F8JnoQg89Ga+8V71uMQFmVhLbFifK1n339zCh39SLOJaMcIRvlmBJiklZCa3KAVFqV3N5UqqrENzWVOTO21ZmfNcLtu3eQCB3jmDJNRjnvQZrs+lLabGwzRqnKCt80T8UzRrh95w6ij+HFkOJE28zzyzaGJ/iFuqay5iP43c0mh2Q0VJ/Gi58lCE/yK8s0XofiYtOgVYkVQUMAzXWEtXjfoMQsqlmsJK0oAhpDysUxySiX8lli3RJdm1I675MhjFRFt23y1QqKFVJ3UbJsQFaTs7sjGe+UOG0IxmIUQtMke5DO8CapOgacsRTGMNN3jAjOCk409cZzVNWmRV3xxHitEYw1tL4m2exSEWckYjComMTXJheLKMn0IIrWDVEMFkHbFnUuGe2IeD9G2gmmSrvXZcME8mF+ERAL7nj3LvWhpKDqI52yoj46oOsP8SeGKirYhtNTcM7g62nOLg2j8YQuXfR0RNHWGDGc7N+nGQnGOLxXiqqgOdmnG/eJp44qBowGTo+hLGwyoklyeExPJ3QE4umI0rdIFEb77xDHBs3GisZYmO7SbXaYPgqYNhAHjuMjn41tCpKNbaMJRQB/dEjRtqi3HD64zaRIxVwTIlVVUR8ePGm8i57JiWCsEJo6Nb+MYTStKVrhdG8PbRtip+Rw19HtVATfzLW06cEh3bhHexBwbQttwdGjs/F+FL8YLfJrv/jz2kynGOtAJafzEVVDWVkETUY06yhdMTciB6+E0FJWFa4ssyPUYCQZx6x1RE1lZIzJjZGMcjEZ5YqC0qXkNwRNGplRgk82VLHJOGZE0BwURZPq7LWhnkYiLmVVVrOKnCrhEHUu6MXsqJy1DJBIO61zBzRX9TEb+coCCIynDdYWFM7N42cISowtiMOVBaGZ2U6VtB/STYHQpnTXFQWu6KIxHUtiJPOzH+JnxCQPAuBuPZzmUtKfVbuajG3F3OgVEWkx5hTBnhmuUYxGirKh8W1+ILl+V+YVsxLQAGXhaH1DGyLOWmzuDyhKlIiogQCuMLTBoxmvbZMBWqLmIj/J4kV2vsQoGJN6C8muEwkoogaJYJzQhknWuvKDIWQRLjkciULpIo1PRj6hxZgzY1tSwxXfTimLghADbduSwrWCGmLSixFRjLRUledxo6HJMotKeqeoQQLZeJfmz736xhvM2qiQGz0xFW9NWxNjxNoi94NNUlQ1EmJMZ3M0TOvT3DMushEtp5+atBo0F32+TjZUm1qd6b3pJydnoEGjUNcjVMC61FIG5lcWRLIOpAHfejAGZwuMM0m+NjDr5IOgHqb1KeIsVVklvKyKkN83U42bpk73NIo0XiOCzip/hRADIUTq6YSoMm9RJ30qqRkzNQIMMTTZO1BhrZlf1GEWg1Tmxjuy8c5dvLiOszOjV+pZoIKPDTvvP8AVjuXhMs6kiQkhYCzJgIxFY2BnJ9AbDFgaLqYaZWY0CHH+g0No2d7epnAlyyvL2YiWriEgdt5Y0hh4+CBQdbsMV5ZRJDldRPAhQHYkhujZ2XmAEcNwdXj24GKYqydi0v2M3YcN/YUFVlZWQDVZWI0h+JB6NICPnp33dzDGMlxN/FJtlY6c1MZwRCLb721Tll1WVhfnAihiUqIg+cBB2NvbQ0QYriwj2FzLeIy4nJyklsSDnZbeoJ/muT7ZxxtDkGz0MgaJMRu9IgtLy08Y0Zq6oeoUqQsowuH+A6xEjLb48TEaFOcETyQG5hpORKkKYWFxkbXVc2mFOctkMqUoy+zMgOODXYwEDJ52kvDUyhm/2Y5SpSqg31/i3No6qun11uedhFBVXQ4PdpEYwNeMj3YhKs4IXiIx5M5d3k/OBhYWV9hY30LzVby68UBAVCg7HR7uvIuGdG/k9HCaREQ3kxFnt7jSoTg5nTBcPZ+NhqkpNZ3WFFVJ6WbGu21EA4SG6ck+7tbbb6XDyiSFMhm9AqUtqHp9zm1dY2tzMxnRTCI/M7VZY0E9d2/eZGf7HYxAkbftbKtrBB8jpSuouj3ObV7m/PnzqWOYsxLJEqi1lm2J3Ll5g53t9xCN+Q6JZs+uolESP+Mouz2W185zfmsrdS1nR6/OowjWwfv37nLn9k0MUOSVqbOjL2o2tjmq3oBzm1fY2FjHWYvOTXwRlZRaExu279/l3XffpzQOmyXxKIL6fAUuBjplQdVbYml5hY3NDZw12WhoZlsoFYracvfmLe5sv4OI4DYuXETVYItkMIghOdunx/sMljd47noyjomRpNxpzE87ZShXrl3j6NG77PzgAZtbm3TKgqgG6wSrEDQZx5qTAxaG61x97jpVWaZyITf706pPk3np8lWO9rf5sz/b5tzmJr2qJKokb1g+noMq9ekh/cEKz12/TtWp0rFhUtwSSBkYcOnSZUYH2zzc22Fza4tOVRDVYh3piMl3Cccn+3T7K1x//gU62SCX+7KISS5NVeH69Rd4+N5NDo6PuHT5Qq5xUoZnSAFciZwc7LK2dYUXPvU83U4ybavOhMXc+gUuX73G4e67PNzbYevCedzSQhdjLGV5NskKjHsFy6uXuHB+aw4WNeZrZyY3+Q29TsWD9S0uX9hkuLKYO21nRrRZA2C0ULKwcpELmxu5QCR325IpuixTnVEWBWtr57h4fovh6gKpn2koS5KVk1SMnp5auovnuXLxEtYKYSa/Z5d6VMU5S6/bYf/BFhc211ka9nPRZymrbBXNAXvcWWFx9QoXzp/HWJlfXw7eJ+kjL55uVXLh4lUm04bF4RLWCgaXUttZYqSRTsexdekCW+trqbcjSeIPIWCcpSzSxdGydGxsbHHp4iZLy32cLF3FOcO0biirCiuGJirDrXUWen3GrWN5kMxqs2zJGMEaR4yRg7Fn8cJLXIor7G6/Q7dIl0+OxlO6VZfSWuoQWbm+yaA/YBJKCqeUOY201lKWJc4lcfBwEuhtvMjlz66w9/67dArFOMfJZEqn6CbnoFeG1zcY9BcYh4LlytAr3TwdnzWAUOFoEuhtfIrzrw043N2h10neqLptKIsqpdWqLG+tsriwyCQULHeEwtqsSMRcbyRR9XAaWb32GQ7tBvsPtxmUBaZwnNYNZZkUjyYow/UVTNlhEg3L/SrFjNn9m+wbDj5wMPYsXHiJi2HIg3fvY19+/cu/43G89Jmvsrf7iNNp5OUv/Bw7BzU37+3w8NSz3LMMF7oURZmsMs5hjcH7wPf/7h4/vPWAYmGT8xevsLe9zdRHXv/iNzg6OmI0jrzypa+xc1hz8+4Ddieec4slC92CsurQzb5Xa5KF9QdvbvPj2w8pBuucv3iZ3e33qT28/sVvcHB0xOk48sqXvs7OUcOtuw94eNoy7FmGgw6uKrHW4Vy6ctd4z/f+5g4/uv2QztJ5NjbPs/3OfaYtvPyZr7K3u8ukVl7+/M/x7qMJN+89YG/iWekZlgaddF+jKChcQZmvTP9pxqsWN9nc3OL9e/cYN5GXX/sKu7sPmU4T3jt7p9y8/5D3j2qWeyWrix1sMbMDOawRmqblT/7mLn9/+wHFYIOr157D/OiHP+TGrXfoVJa7t+7y5o1bFCSj1+m0ITAzyiU95nHT2Oz8r2tPPa2pKuHmjbf4+zdvUxXCvdv3ePPmLYpsHDutE15QodPt0O31KMoy5+c2O1mgaT113WS8t/n7H9+iLOD+HM8TfcOorgkY2piyJCPJCC4mpZipaWVoak9dJ3433nqLN2/eo1tZ7t66x9u371FZJbQNk7olYml9qiOMSxYmYx/DE0Ndt9R1TVkJN95+i7du3qPbsdy7dY+3bt2lspHoW6ZNSx0sbYhzuSklM/m4ztagtg5Mp1N6/QJXdjpJsggBW5b0TDk3sZVFMTeipfuH2TWRA3ACnNk3k1GuqCrqOhBjwLqS3mAx46X4YMVlPDv/GAxyJZz69BaxZ3hVVdF8HJ5xFDYZ784KXBCbjHzGzPgl/mVV0ZqUCdmioF9103tm45Uzu+cspqb5M7lR9Ul4PYxJ8+cKR1E4CuueKILPzBszvOwIFcEZK6lhkoORs6k6jvmOhWgyvc13Rw7SyY+WUlvrslFOTXKizy7aE9IArUv+KRTRgFHmhrbkAE1Z1uzzP9xjeOZj8WLSsuRxY1uawtnVP9F4ZuTLKjE+ZCkkYrNLMs6r55iNctmN81PhGXx2y1tSzJWM+TTtp/xmAAACbUlEQVQ8ky+XEk26XISxWT5vwaRuVgjJPJBsOzOX3Rwv5T6Smi2+bWmjn+fXTxjH7AxPk/QQQ6oXZl8ZebZqQkga0bPh6Vy4nCXOkvvVQvYJB4/3yciXJkDQ7BQEjzExde/yeKPm8coZ4k+GF5h9jgnZopt2xcfhtTShRYSUrM+s9qfjEUWZLSoS8z3CmSF6JhGcPRSVVDQRNBm9smQgpAd1Oh6BdNIOmxvlOCMl5qy2yU9cVdFnxkvppIGsnqaiT3IxMjOipdaFznmLCsF7xuMRXUnGNhHNKzU/1hk/fnI8k/FUIx7N9dbH8AtgZh90gKQGEwr1tM7txdwLrrMRjdmtUZKQpszKC2LuKGoMiNGz6luFZlpnbSkRDk1LCPFshyXA/JDT5Go23sVnxPM5LZ3zy5BzfpJriWxsI+PNxqshpM998C2x9nm8eaHJT4eXFpDP4yQb5WYgT8ELnhhSQ86NDh5QdQcYa5mcjjg+OCJoktySajvjJbND72zr5e+T0cuCBsZHjwh0MdYwHp8y3n2Um/szPJkzUj0bc67EUvewLNIH0zwDntEZt1Rkzh7u2WZWbJnUYGJgcvQI01vFWMvp6QmT0zEziVGyInX2W65pfgq82ZW/mTFQkLmF9Kn8jGCIuKP9A3AP0OgZH+1z2qRAFUL+HJGohBDnQThVh7NnofgmtXI1SypHB4eMmkM0eKbHBxydtGd4kITLkGX0tHyStpRXpc8Z1bPiaYyJnzm7Az6z/M+MaDM8EA7399GTFo2B8dE+IRvlfGhy6yHxM1l9ni/nZ8Tz0sUYk5pZIV1xC77NZ+psET4dTxD+Hy7gM5v1mIY2AAAAAElFTkSuQmCC",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture03",x)]},de.Facade03),Object(gf.jsxs)(v,{value:de.Facade04,children:[Object(gf.jsx)("img",{alt:de.Facade04,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture04",x)]},de.Facade04),Object(gf.jsxs)(v,{value:de.Facade05,children:[Object(gf.jsx)("img",{alt:de.Facade05,src:zS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture05",x)]},de.Facade05),Object(gf.jsxs)(v,{value:de.Facade06,children:[Object(gf.jsx)("img",{alt:de.Facade06,src:RS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture06",x)]},de.Facade06),Object(gf.jsxs)(v,{value:de.Facade07,children:[Object(gf.jsx)("img",{alt:de.Facade07,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture07",x)]},de.Facade07),Object(gf.jsxs)(v,{value:de.Facade08,children:[Object(gf.jsx)("img",{alt:de.Facade08,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture08",x)]},de.Facade08),Object(gf.jsxs)(v,{value:de.Facade09,children:[Object(gf.jsx)("img",{alt:de.Facade09,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture09",x)]},de.Facade09),Object(gf.jsxs)(v,{value:de.Facade10,children:[Object(gf.jsx)("img",{alt:de.Facade10,src:DS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture10",x)]},de.Facade10)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){n(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("cuboidMenu.OnlyThisSide",x)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.AllSidesOfThisCuboid",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfSelectedCuboids",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfAllCuboids",x)})]})})})]})})},WS=n.a.memo((function(){var e,t,l,a,o=Ew(si),i=Ew(Vi),n=Ew(Sr),c=Ew(hs),s=Ew(es),d=Ew(Zn),p=Ew(ns),y=Ew(qc),g=Ew(Ci),m=Ew(nn),w=Ew(os),x=OP(V.Cuboid),v=Object(r.useState)(!1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useState)(!1),S=Object(u.a)(P,2),j=S[0],H=S[1],z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(!1),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),Y=k[0],L=k[1],E=Object(r.useState)(!1),U=Object(u.a)(E,2),N=U[0],J=U[1],G=zP(x),X=G.labelText,B=G.setLabelText,K=RP(x),q=DP(x,X),Q=MP(x),Z=WP(x),$=IP(x),ee=CP(x);if(!x)return null;var te=x?c(x.id,!1):new Rw,le=!(null===x||void 0===x?void 0:x.locked),ae={lng:i},oe=function(){o((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===x.id){a.enableGroupMaster=!a.enableGroupMaster;break}}}catch(o){l.e(o)}finally{l.f()}e.groupActionUpdateFlag=!e.groupActionUpdateFlag}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){if(w&&w.length>0){var e=w[0];if(e.type===V.Human||e.type===V.Tree||e.type===V.Flower||e.type===V.Polygon||e.type===V.Sensor||e.type===V.SolarPanel||e.type===V.Cuboid)return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"cuboid-paste"}),Object(gf.jsx)(TP,{keyName:"cuboid-copy"}),le&&Object(gf.jsx)(PP,{keyName:"cuboid-cut"}),Object(gf.jsx)(SP,{keyName:"cuboid-lock"}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:x.enableGroupMaster,onChange:function(e){var t={name:"Group Master",timestamp:Date.now(),checked:e.target.checked,selectedElementId:x.id,selectedElementType:x.type,undo:function(){return oe()},redo:function(){return oe()}};n(t),oe()},children:me.t("cuboidMenu.GroupMaster",{lng:i})})},"group-master"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:x.stackable,onChange:function(e){o((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===x.id){var o=!a.stackable;a.stackable=o,e.actionState.cuboidStackable=o;break}}}catch(i){l.e(i)}finally{l.f()}}))},children:me.t("cuboidMenu.Stackable",{lng:i})})},"stackable"),te.gotSome()&&Object(gf.jsxs)(HP.a,{title:me.t("word.Clear",ae),style:{paddingLeft:"24px"},children:[te.sensorCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllSensorsOnCuboid",ae)+" ("+te.sensorCount+" "+me.t("cuboidMenu.Sensors",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Sensor&&e.parentId===x.id}));s(x.id,V.Sensor);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Sensors on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Sensor)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedSensors",ae)," (",te.sensorCount," ",me.t("cuboidMenu.Sensors",ae),")"]},"remove-all-sensors-on-cuboid"),te.solarPanelCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllSolarPanelsOnCuboid",ae)+" ("+te.solarPanelModuleCount+" "+me.t("cuboidMenu.SolarPanels",ae)+", "+te.solarPanelCount+" "+me.t("cuboidMenu.Racks",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.SolarPanel&&e.parentId===x.id}));s(x.id,V.SolarPanel);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Solar Panels on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.SolarPanel)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedSolarPanels",ae),"\xa0 (",te.solarPanelModuleCount," ",me.t("cuboidMenu.SolarPanels",ae),",",te.solarPanelCount," ",me.t("cuboidMenu.Racks",ae),")"]},"remove-all-solar-panels-on-cuboid"),te.polygonCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllPolygonsOnCuboid",ae)+" ("+te.polygonCount+" "+me.t("cuboidMenu.Polygons",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Polygon&&e.parentId===x.id}));s(x.id,V.Polygon);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Polygons on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Polygon)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedPolygons",ae)," (",te.polygonCount," ",me.t("cuboidMenu.Polygons",ae),")"]},"remove-all-polygons-on-cuboid"),te.humanCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllHumansOnCuboid",ae)+" ("+te.humanCount+" "+me.t("cuboidMenu.Humans",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Human&&e.parentId===x.id}));s(x.id,V.Human);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Humans on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Human)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedHumans",ae)," (",te.humanCount," ",me.t("cuboidMenu.Humans",ae),")"]},"remove-all-humans-on-cuboid"),te.treeCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllTreesOnCuboid",ae)+" ("+te.treeCount+" "+me.t("cuboidMenu.Trees",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Tree&&e.parentId===x.id}));s(x.id,V.Tree);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Trees on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Tree)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedTrees",ae)," (",te.treeCount," ",me.t("cuboidMenu.Trees",ae),")"]},"remove-all-trees-on-cuboid"),te.flowerCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllFlowersOnCuboid",ae)+" ("+te.flowerCount+" "+me.t("cuboidMenu.Flowers",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Flower&&e.parentId===x.id}));s(x.id,V.Flower);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Flowers on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Flower)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedFlowers",ae)," (",te.flowerCount," ",me.t("cuboidMenu.Flowers",ae),")"]},"remove-all-flowers-on-cuboid")]},"clear"),le&&(!x.textureTypes||m>=0&&x.textureTypes[m]===de.NoTexture)&&Object(gf.jsxs)(gf.Fragment,{children:[A&&Object(gf.jsx)(TS,{setDialogVisible:T}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){g(0),T(!0)},children:[me.t("word.Color",ae)," ..."]},"cuboid-color")]}),le&&Object(gf.jsxs)(gf.Fragment,{children:[j&&Object(gf.jsx)(MS,{setDialogVisible:H}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){g(0),H(!0)},children:[me.t("word.Texture",ae)," ..."]},"cuboid-texture"),C&&Object(gf.jsx)(PS,{setDialogVisible:O}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Ew.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),O(!0)},children:[me.t("word.Length",ae)," ..."]},"cuboid-length"),D&&Object(gf.jsx)(SS,{setDialogVisible:M}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Ew.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),M(!0)},children:[me.t("word.Width",ae)," ..."]},"cuboid-width"),Y&&Object(gf.jsx)(jS,{setDialogVisible:L}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Ew.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),L(!0)},children:[me.t("word.Height",ae)," ..."]},"cuboid-height"),N&&Object(gf.jsx)(HS,{setDialogVisible:J}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Ew.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),J(!0)},children:[me.t("word.Azimuth",ae)," ..."]},"cuboid-azimuth")]}),Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(x){o((function(e){e.objectTypeToAdd=V.Polygon}));var e,t=Tw.getWorldDataById(x.id).pos;switch(m){case 0:e=St;break;case 1:e=jt;break;case 2:e=Ht;break;case 3:e=zt;break;default:e=Rt,t.z=x.lz}var l=p(x,t,e),a={name:"Add",timestamp:Date.now(),addedElement:l,undo:function(){y(a.addedElement.id,!1)},redo:function(){o((function(e){e.elements.push(a.addedElement),e.selectedElement=a.addedElement}))}};n(a),o((function(e){e.objectTypeToAdd=V.None}))}},children:me.t("cuboidMenu.AddPolygon",ae)},"add-polygon-on-cuboid"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===x||void 0===x?void 0:x.showLabel),onChange:K,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"cuboid-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",ae)+":",value:X,onChange:function(e){return B(e.target.value)},onPressEnter:q,onBlur:q})},"cuboid-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",ae)+":",min:.5,max:100,step:1,precision:1,value:null!==(e=x.labelHeight)&&void 0!==e?e:.5,onChange:function(e){return ee(e)}})},"cuboid-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",ae)+":",min:10,max:100,step:1,precision:0,value:null!==(t=x.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return Q(e)}})},"cuboid-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=x.labelSize)&&void 0!==l?l:.2,onChange:function(e){return Z(e)}})},"cuboid-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",ae)+":",value:null!==(a=x.labelColor)&&void 0!==a?a:"white",onChange:function(e){return $(e.target.value)}})},"cuboid-label-color")]})]},"cuboid-label")]})})),IS=n.a.memo((function(){var e,t,l,a=Ew(si),r=Ew(Fi),n=Ew(Qc),c=Ew(pn),s=Ew(un),d=Ew(Sr),p=Ew(i.latitude),y=null!==(e=Ew(i.leafDayOfYear1))&&void 0!==e?e:rt,g=null!==(t=Ew(i.leafDayOfYear2))&&void 0!==t?t:nt,m=null!==(l=Ew(i.monthlyIrradianceLosses))&&void 0!==l?l:new Array(12).fill(.05),w=Ew((function(e){return e.world.ground.albedo})),x=Ew(o.groundColor),v=Ew(o.groundImage),b=Ew(o.waterSurface),A=Ew(Vi),T=Ew(os),P={lng:A},S=Ew.getState().countAllElementsByType(!0),j=S.treeCount,H=S.flowerCount,z=S.humanCount,R=S.foundationCount,D=S.cuboidCount,M=S.solarPanelCount,W=S.gotSome(),I=function(e){a((function(t){t.viewState.waterSurface=e}))},C=function(e){a((function(t){t.viewState.groundImage=e,t.viewState.groundImageType=t.viewState.mapType}))},O=function(e){a((function(t){t.viewState.groundColor=e}))},F=function(e){a((function(t){t.world.ground.albedo=e}))},k=function(e,t){var l=m[e],o=t,i={name:"Set Irradiance Loss in "+it[e],timestamp:Date.now(),oldValue:l,newValue:o,undo:function(){a((function(t){t.world.monthlyIrradianceLosses[e]=i.oldValue}))},redo:function(){a((function(t){t.world.monthlyIrradianceLosses[e]=i.newValue}))}};d(i),a((function(t){t.world.monthlyIrradianceLosses||(t.world.monthlyIrradianceLosses=new Array(12).fill(.05)),t.world.monthlyIrradianceLosses[e]=o}))},Y=p>0;return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){if(T&&T.length>0){var e=T[0];if(e.type===V.Human||e.type===V.Tree||e.type===V.Flower||e.type===V.Cuboid||e.type===V.Foundation)return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"ground-paste"}),z>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllPeople",P)+" ("+z+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Human}));n(V.Human);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Humans",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Human)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedPeople",P)," (",z,")"]},"ground-remove-all-humans"),j>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllTrees",P)+" ("+j+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Tree}));n(V.Tree);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Trees",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Tree)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedTrees",P)," (",j,")"]},"ground-remove-all-trees"),H>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllFlowers",P)+" ("+H+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Flower}));n(V.Flower);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Flowers",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Flower)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedFlowers",P)," (",H,")"]},"ground-remove-all-flowers"),M>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllSolarPanels",P)+" ("+M+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.SolarPanel}));n(V.SolarPanel);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Solar Panels",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.SolarPanel)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedSolarPanels",P)," (",M,")"]},"ground-remove-all-solar-panels"),R>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllFoundations",P)+" ("+R+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Foundation}));n(V.Foundation);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Foundations",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Foundation)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedFoundations",P)," (",R,")"]},"ground-remove-all-foundations"),D>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllCuboids",P)+" ("+D+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Cuboid}));n(V.Cuboid);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Cuboids",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Cuboid)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedCuboids",P)," (",D,")"]},"ground-remove-all-cuboids"),W&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){var e,t=new Map,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}s(!0);var o={name:"Lock All Elements",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(f.a)(o.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],r=l[1];c(a,r)}}catch(i){t.e(i)}finally{t.f()}},redo:function(){s(!0)}};d(o)},children:[me.t("groundMenu.LockAllElements",P)," (",r.length,")"]},"lock-all-elements"),!W&&r.length>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){var e,t=new Map,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}s(!1);var o={name:"Lock All Elements",timestamp:Date.now(),oldValues:t,newValue:!1,undo:function(){var e,t=Object(f.a)(o.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],r=l[1];c(a,r)}}catch(i){t.e(i)}finally{t.f()}},redo:function(){s(!1)}};d(o)},children:[me.t("groundMenu.UnlockAllElements",P)," (",r.length,")"]},"unlock-all-elements"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:v,onChange:function(e){var t=e.target.checked,l={name:"Show Ground Image",timestamp:Date.now(),checked:t,undo:function(){C(!l.checked)},redo:function(){C(l.checked)}};d(l),C(t)},children:me.t("groundMenu.ImageOnGround",P)})},"image-on-ground"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:b,onChange:function(e){var t=e.target.checked,l={name:"Water Surface",timestamp:Date.now(),checked:t,undo:function(){I(!l.checked)},redo:function(){I(l.checked)}};d(l),I(t)},children:me.t("groundMenu.WaterSurface",P)})},"water-surface"),!b&&Object(gf.jsx)(HP.a,{title:me.t("word.Color",{lng:A}),style:{paddingLeft:"24px"},children:Object(gf.jsx)(YP.a,{color:x,onChangeComplete:function(e){var t=x,l=e.hex,a={name:"Set Ground Color",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){O(a.oldValue)},redo:function(){O(a.newValue)}};d(a),O(l)}})},"ground-color"),Object(gf.jsx)(HP.a,{title:me.t("groundMenu.Vegetation",{lng:A}),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:10},children:Object(gf.jsx)($v.a,{addonBefore:me.t(Y?"groundMenu.LeafOutDay":"groundMenu.LeafOffDay",P),addonAfter:"(1-150)",style:{width:"300px"},min:1,max:150,step:1,precision:0,value:y,onChange:function(e){var t=y,l=e,o={name:"Set Leaf Day 1",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){a((function(e){e.world.leafDayOfYear1=o.oldValue}))},redo:function(){a((function(e){e.world.leafDayOfYear1=o.newValue}))}};d(o),a((function(e){e.world.leafDayOfYear1=l}))}})},"leaf-out-day"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t(Y?"groundMenu.LeafOffDay":"groundMenu.LeafOutDay",P),addonAfter:"(215-365)",style:{width:"300px"},min:215,max:365,step:1,precision:0,value:g,onChange:function(e){var t=g,l=e,o={name:"Set Leaf Day 2",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){a((function(e){e.world.leafDayOfYear2=o.oldValue}))},redo:function(){a((function(e){e.world.leafDayOfYear2=o.newValue}))}};d(o),a((function(e){e.world.leafDayOfYear2=l}))}})},"leaf-shed-day")]})},"vegetation"),Object(gf.jsx)(HP.a,{title:me.t("groundMenu.MonthlyIrradianceLoss",{lng:A}),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:10},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.January",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[0],onChange:function(e){k(0,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.February",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[1],onChange:function(e){k(1,e)}})]},"irradiance-loss-jan"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.March",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[2],onChange:function(e){k(2,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.April",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[3],onChange:function(e){k(3,e)}})]},"irradiance-loss-mar"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.May",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[4],onChange:function(e){k(4,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.June",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[5],onChange:function(e){k(5,e)}})]},"irradiance-loss-may"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.July",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[6],onChange:function(e){k(6,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.August",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[7],onChange:function(e){k(7,e)}})]},"irradiance-loss-jul"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.September",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[8],onChange:function(e){k(8,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.October",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[9],onChange:function(e){k(9,e)}})]},"irradiance-loss-sep"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.November",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[10],onChange:function(e){k(10,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.December",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[11],onChange:function(e){k(11,e)}})]},"irradiance-loss-nov")]})},"monthly-irradiance-loss"),Object(gf.jsx)(Qv.a,{children:Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"60px"},children:[me.t("groundMenu.Albedo",P),":"]}),Object(gf.jsx)($v.a,{min:.05,max:1,step:.01,precision:2,value:w,onChange:function(e){if(e){var t=w,l=e,a={name:"Set Ground Albedo",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){F(a.oldValue)},redo:function(){F(a.newValue)}};d(a),F(l)}}})]},"ground-albedo")})]})})),CS=db.a.Option,OS=function(){var e,t=Ew(si),l=Ew(Vi),a=Ew(Sr),o=Ew.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},h=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Human&&i.id===e){var r=i;r.name=l,r.lx=Tl.fetchWidth(l),r.lz=Tl.fetchHeight(l);break}}}catch(n){o.e(n)}finally{o.f()}}))};return Object(gf.jsxs)(db.a,{style:{width:"140px"},value:null!==(e=null===o||void 0===o?void 0:o.name)&&void 0!==e?e:ne.Jack,onChange:function(e){if(o){var l=o.name;if(l!==e){var i={name:"Change People",timestamp:Date.now(),oldValue:l,newValue:e,changedElementId:o.id,changedElementType:o.type,undo:function(){h(i.changedElementId,i.oldValue)},redo:function(){h(i.changedElementId,i.newValue)}};a(i),h(o.id,e),t((function(t){t.actionState.humanName=e})),s(!c)}}},children:[Object(gf.jsxs)(CS,{value:ne.Jack,children:[Object(gf.jsx)("img",{alt:ne.Jack,src:Nt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jack",d)]},ne.Jack),Object(gf.jsxs)(CS,{value:ne.Jacob,children:[Object(gf.jsx)("img",{alt:ne.Jacob,src:Vt,height:20,style:{paddingRight:"16px"}})," ",me.t("people.Jacob",d)]},ne.Jacob),Object(gf.jsxs)(CS,{value:ne.Jacqueline,children:[Object(gf.jsx)("img",{alt:ne.Jacqueline,src:Jt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jacqueline",d)]},ne.Jacqueline),Object(gf.jsxs)(CS,{value:ne.Jaah,children:[Object(gf.jsx)("img",{alt:ne.Jaah,src:Ut,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jaah",d)]},ne.Jaah),Object(gf.jsxs)(CS,{value:ne.Jade,children:[Object(gf.jsx)("img",{alt:ne.Jade,src:Gt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jade",d)]},ne.Jade),Object(gf.jsxs)(CS,{value:ne.Jamelia,children:[Object(gf.jsx)("img",{alt:ne.Jamelia,src:Xt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jamelia",d)]},ne.Jamelia),Object(gf.jsxs)(CS,{value:ne.James,children:[Object(gf.jsx)("img",{alt:ne.James,src:Bt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.James",d)]},ne.James),Object(gf.jsxs)(CS,{value:ne.Jane,children:[Object(gf.jsx)("img",{alt:ne.Jane,src:Kt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jane",d)]},ne.Jane),Object(gf.jsxs)(CS,{value:ne.Jaya,children:[Object(gf.jsx)("img",{alt:ne.Jaya,src:qt,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jaya",d)]},ne.Jaya),Object(gf.jsxs)(CS,{value:ne.Jaye,children:[Object(gf.jsx)("img",{alt:ne.Jaye,src:Qt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jaye",d)]},ne.Jaye),Object(gf.jsxs)(CS,{value:ne.Jeanette,children:[Object(gf.jsx)("img",{alt:ne.Jeanette,src:Zt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jeanette",d)]},ne.Jeanette),Object(gf.jsxs)(CS,{value:ne.Jedi,children:[Object(gf.jsx)("img",{alt:ne.Jedi,src:_t,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jedi",d)]},ne.Jedi),Object(gf.jsxs)(CS,{value:ne.Jeff,children:[Object(gf.jsx)("img",{alt:ne.Jeff,src:$t,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jeff",d)]},ne.Jeff),Object(gf.jsxs)(CS,{value:ne.Jena,children:[Object(gf.jsx)("img",{alt:ne.Jena,src:el,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jena",d)]},ne.Jena),Object(gf.jsxs)(CS,{value:ne.Jennifer,children:[Object(gf.jsx)("img",{alt:ne.Jennifer,src:tl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jennifer",d)]},ne.Jennifer),Object(gf.jsxs)(CS,{value:ne.Jess,children:[Object(gf.jsx)("img",{alt:ne.Jess,src:ll,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jess",d)]},ne.Jess),Object(gf.jsxs)(CS,{value:ne.Jett,children:[Object(gf.jsx)("img",{alt:ne.Jett,src:al,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jett",d)]},ne.Jett),Object(gf.jsxs)(CS,{value:ne.Jill,children:[Object(gf.jsx)("img",{alt:ne.Jill,src:ol,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jill",d)]},ne.Jill),Object(gf.jsxs)(CS,{value:ne.Jiya,children:[Object(gf.jsx)("img",{alt:ne.Jiya,src:il,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jiya",d)]},ne.Jiya),Object(gf.jsxs)(CS,{value:ne.Joan,children:[Object(gf.jsx)("img",{alt:ne.Joan,src:rl,height:20,style:{paddingRight:"8px"}})," ",me.t("people.Joan",d)]},ne.Joan),Object(gf.jsxs)(CS,{value:ne.Jocelyn,children:[Object(gf.jsx)("img",{alt:ne.Jocelyn,src:nl,height:20,style:{paddingRight:"23px"}})," ",me.t("people.Jocelyn",d)]},ne.Jocelyn),Object(gf.jsxs)(CS,{value:ne.Joel,children:[Object(gf.jsx)("img",{alt:ne.Joel,src:cl,height:20,style:{paddingRight:"7px"}})," ",me.t("people.Joel",d)]},ne.Joel),Object(gf.jsxs)(CS,{value:ne.Joey,children:[Object(gf.jsx)("img",{alt:ne.Joey,src:sl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joey",d)]},ne.Joey),Object(gf.jsxs)(CS,{value:ne.John,children:[Object(gf.jsx)("img",{alt:ne.John,src:dl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.John",d)]},ne.John),Object(gf.jsxs)(CS,{value:ne.Jonathon,children:[Object(gf.jsx)("img",{alt:ne.Jonathon,src:ul,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jonathon",d)]},ne.Jonathon),Object(gf.jsxs)(CS,{value:ne.Jose,children:[Object(gf.jsx)("img",{alt:ne.Jose,src:fl,height:20,style:{paddingRight:"5px"}})," ",me.t("people.Jose",d)]},ne.Jose),Object(gf.jsxs)(CS,{value:ne.Joseph,children:[Object(gf.jsx)("img",{alt:ne.Joseph,src:hl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joseph",d)]},ne.Joseph),Object(gf.jsxs)(CS,{value:ne.Joshua,children:[Object(gf.jsx)("img",{alt:ne.Joshua,src:pl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joshua",d)]},ne.Joshua),Object(gf.jsxs)(CS,{value:ne.Judd,children:[Object(gf.jsx)("img",{alt:ne.Judd,src:yl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Judd",d)]},ne.Judd),Object(gf.jsxs)(CS,{value:ne.Judy,children:[Object(gf.jsx)("img",{alt:ne.Judy,src:gl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Judy",d)]},ne.Judy),Object(gf.jsxs)(CS,{value:ne.Julia,children:[Object(gf.jsx)("img",{alt:ne.Julia,src:ml,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Julia",d)]},ne.Julia),Object(gf.jsxs)(CS,{value:ne.Julio,children:[Object(gf.jsx)("img",{alt:ne.Julio,src:wl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Julio",d)]},ne.Julio),Object(gf.jsxs)(CS,{value:ne.Jumapili,children:[Object(gf.jsx)("img",{alt:ne.Jumapili,src:xl,height:20,style:{paddingRight:"16px"}})," ",me.t("people.Jumapili",d)]},ne.Jumapili),Object(gf.jsxs)(CS,{value:ne.June,children:[Object(gf.jsx)("img",{alt:ne.June,src:vl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.June",d)]},ne.June),Object(gf.jsxs)(CS,{value:ne.Juro,children:[Object(gf.jsx)("img",{alt:ne.Juro,src:bl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Juro",d)]},ne.Juro),Object(gf.jsxs)(CS,{value:ne.Justin,children:[Object(gf.jsx)("img",{alt:ne.Justin,src:Al,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Justin",d)]},ne.Justin)]})},FS=l(305),kS=n.a.memo((function(){var e,t=Ew(si),l=Ew(Sr),a=Ew($r),i=Ew(rs),n=Ew(Vi),c=null!==(e=Ew(o.orthographic))&&void 0!==e&&e,s=OP(V.Human),d=Object(r.useState)(!1),p=Object(u.a)(d,2),y=p[0],g=p[1],m=!(null===s||void 0===s?void 0:s.locked),w=Object(r.useRef)(0),x=Object(r.useRef)(-1),v=Object(r.useRef)(!0),b=Object(r.useRef)(!1);Object(r.useEffect)((function(){if(b.current){if(v.current)return w.current=requestAnimationFrame(P),S(),function(){cancelAnimationFrame(w.current)};v.current=!0}}),[y]);var A=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Human&&i.id===e){i.flip=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Human&&i.id===e){i.observer=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function e(){requestAnimationFrame(e);var t=Date.now();t-x.current>100&&(Object(FS.c)(),x.current=t)},S=function(){if(s){var e=s.cx,l=s.cy,o=s.cz+s.lz,r=a(s);if(r){var n=Tw.absoluteHumanOrTreeCoordinates(e,l,o,r);e=n.x,l=n.y,o=n.z}var c=Ew.getState().cameraDirection.clone().normalize().multiplyScalar(.5);e+=c.x,l+=c.y;var d=Object(h.a)(Ew.getState().viewState.cameraPosition);new FS.b(d).to([e,l,o],1e3).easing(FS.a.Quadratic.In).onUpdate((function(e){!function(e,l,a){var o=Et.getState().orbitControlsRef;(null===o||void 0===o?void 0:o.current)&&(o.current.object.position.set(e,l,a),o.current.update(),t((function(t){t.viewState.cameraPosition=[e,l,a]})))}(e[0],e[1],e[2])})).onComplete((function(){i()})).start()}};return s?Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"human-copy"}),m&&Object(gf.jsx)(PP,{keyName:"human-cut"}),Object(gf.jsx)(SP,{keyName:"human-lock"}),m&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:s.observer,onChange:function(e){var t=e.target.checked,a={name:"Set Observer",timestamp:Date.now(),checked:t,selectedElementId:s.id,selectedElementType:V.Human,undo:function(){T(s.id,!a.checked)},redo:function(){T(s.id,a.checked)}};l(a),T(s.id,t)},children:me.t("peopleMenu.Observer",{lng:n})})},"human-observer"),!c&&Object(gf.jsx)(Qv.a.Item,{onClick:function(){g(!y),b.current=!0},style:{paddingLeft:"36px"},children:me.t("peopleMenu.ViewFromThisPerson",{lng:n})},"human-move-view"),m&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:s.flip,onChange:function(e){var t=e.target.checked,a={name:"Flip Human",timestamp:Date.now(),checked:t,selectedElementId:s.id,selectedElementType:V.Human,undo:function(){A(s.id,!a.checked)},redo:function(){A(s.id,a.checked)}};l(a),A(s.id,t)},children:me.t("peopleMenu.Flip",{lng:n})})},"human-flip"),m&&Object(gf.jsx)(Qv.a,{children:Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"120px"},children:[me.t("peopleMenu.ChangePerson",{lng:n}),": "]}),Object(gf.jsx)(OS,{},"humans")]},"human-change-person")})]}):null})),YS=db.a.Option,LS=function(){var e,t=Ew(si),l=Ew(Vi),a=Ew(Sr),o=Ew.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},h=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Flower&&i.id===e){var r=i;r.name=l,r.lx=Nl.fetchSpread(l),r.lz=Nl.fetchHeight(l);break}}}catch(n){o.e(n)}finally{o.f()}}))};return Object(gf.jsxs)(db.a,{style:{width:"200px"},value:null!==(e=null===o||void 0===o?void 0:o.name)&&void 0!==e?e:ie.WhiteFlower,onChange:function(e){if(o){var l=o.name;if(l!==e){var i={name:"Change Flower",timestamp:Date.now(),oldValue:l,newValue:e,changedElementId:o.id,changedElementType:o.type,undo:function(){h(i.changedElementId,i.oldValue)},redo:function(){h(i.changedElementId,i.newValue)}};a(i),h(o.id,e),t((function(t){t.actionState.flowerType=e})),s(!c)}}},children:[Object(gf.jsxs)(YS,{value:ie.WhiteFlower,children:[Object(gf.jsx)("img",{alt:ie.WhiteFlower,src:El,height:20,style:{paddingRight:"17px"}})," ",me.t("flower.WhiteFlower",d)]},ie.WhiteFlower),Object(gf.jsxs)(YS,{value:ie.YellowFlower,children:[Object(gf.jsx)("img",{alt:ie.YellowFlower,src:Ul,height:20,style:{paddingRight:"16px"}})," ",me.t("flower.YellowFlower",d)]},ie.YellowFlower),Object(gf.jsxs)(YS,{value:ie.Hibiscus,children:[Object(gf.jsx)("img",{alt:ie.Hibiscus,src:Ml,height:20,style:{paddingRight:"19px"}})," ",me.t("flower.Hibiscus",d)]},ie.Hibiscus),Object(gf.jsxs)(YS,{value:ie.Hydrangea,children:[Object(gf.jsx)("img",{alt:ie.Hydrangea,src:Wl,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Hydrangea",d)]},ie.Hydrangea),Object(gf.jsxs)(YS,{value:ie.Spirea,children:[Object(gf.jsx)("img",{alt:ie.Spirea,src:Fl,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Spirea",d)]},ie.Spirea),Object(gf.jsxs)(YS,{value:ie.Hosta,children:[Object(gf.jsx)("img",{alt:ie.Hosta,src:Il,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Hosta",d)]},ie.Hosta),Object(gf.jsxs)(YS,{value:ie.Peony,children:[Object(gf.jsx)("img",{alt:ie.Peony,src:Cl,height:20,style:{paddingRight:"17px"}})," ",me.t("flower.Peony",d)]},ie.Peony),Object(gf.jsxs)(YS,{value:ie.Boxwood,children:[Object(gf.jsx)("img",{alt:ie.Boxwood,src:jl,height:20,style:{paddingRight:"23px"}})," ",me.t("flower.Boxwood",d)]},ie.Boxwood),Object(gf.jsxs)(YS,{value:ie.TallBush,children:[Object(gf.jsx)("img",{alt:ie.TallBush,src:Yl,height:20,style:{paddingRight:"32px"}})," ",me.t("flower.TallBush",d)]},ie.TallBush),Object(gf.jsxs)(YS,{value:ie.CactusCombo1,children:[Object(gf.jsx)("img",{alt:ie.CactusCombo1,src:Hl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo1",d)]},ie.CactusCombo1),Object(gf.jsxs)(YS,{value:ie.CactusCombo2,children:[Object(gf.jsx)("img",{alt:ie.CactusCombo2,src:zl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo2",d)]},ie.CactusCombo2),Object(gf.jsxs)(YS,{value:ie.CactusCombo3,children:[Object(gf.jsx)("img",{alt:ie.CactusCombo3,src:Rl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo3",d)]},ie.CactusCombo3),Object(gf.jsxs)(YS,{value:ie.CactusCombo4,children:[Object(gf.jsx)("img",{alt:ie.CactusCombo4,src:Dl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo4",d)]},ie.CactusCombo4),Object(gf.jsxs)(YS,{value:ie.RedRose,children:[Object(gf.jsx)("img",{alt:ie.RedRose,src:Ol,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.RedRose",d)]},ie.RedRose),Object(gf.jsxs)(YS,{value:ie.Bellflower,children:[Object(gf.jsx)("img",{alt:ie.Bellflower,src:Sl,height:20,style:{paddingRight:"20px"}})," ",me.t("flower.Bellflower",d)]},ie.Bellflower),Object(gf.jsxs)(YS,{value:ie.Sunflower,children:[Object(gf.jsx)("img",{alt:ie.Sunflower,src:kl,height:20,style:{paddingRight:"32px"}})," ",me.t("flower.Sunflower",d)]},ie.Sunflower),Object(gf.jsxs)(YS,{value:ie.Tulip,children:[Object(gf.jsx)("img",{alt:ie.Tulip,src:Ll,height:20,style:{paddingRight:"24px"}})," ",me.t("flower.Tulip",d)]},ie.Tulip)]})},ES=function(){var e=OP(V.Flower),t=Ew(si),l=Ew(Vi),a=Ew(Sr);if(!e)return null;var o={lng:l},i=!(null===e||void 0===e?void 0:e.locked),r=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Flower&&i.id===e){i.flip=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"flower-copy"}),i&&Object(gf.jsx)(PP,{keyName:"flower-cut"}),Object(gf.jsx)(SP,{keyName:"flower-lock"}),i&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:e.flip,onChange:function(t){var l=t.target.checked,o={name:"Flip Flower",timestamp:Date.now(),checked:l,selectedElementId:e.id,selectedElementType:V.Flower,undo:function(){r(e.id,!o.checked)},redo:function(){r(e.id,o.checked)}};a(o),r(e.id,l)},children:me.t("flowerMenu.Flip",{lng:l})})},"flower-flip"),i&&Object(gf.jsx)(Qv.a,{children:Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"100px"},children:[me.t("flowerMenu.Type",o),": "]}),Object(gf.jsx)(LS,{},"flowers")]},"flower-change-type")})]})},US=function(e){var t,l,a=e.setDialogVisible,o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Cn),s=Ew(On),d=Ew(Fn),h=Ew(kn),p=Ew(Sr),y=Ew(Xn),g=Ew(Bn),m=Ew(Ii),w=Ew(Ci),x=OP(V.Polygon),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.lineColor)&&void 0!==t?t:"black"),b=Object(u.a)(v,2),A=b[0],T=b[1],P=$f(),S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.lineColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){if(x&&function(e){if(x){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.lineColor)return!0}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.lineColor)return!0}}catch(g){r.e(g)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.parentId===x.parentId&&Tw.isIdentical(d.normal,x.normal)&&!d.locked&&d.lineColor!==e)return!0}}catch(g){s.e(g)}finally{s.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Polygon&&p.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!p.locked&&p.lineColor!==e)return!0}}catch(g){h.e(g)}finally{h.f()}break;default:if(e!==(null===x||void 0===x?void 0:x.lineColor))return!0}return!1}}(e))switch(y){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,g=t.value;if(g.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(g.id))l.set(g.id,null!==(r=g.lineColor)&&void 0!==r?r:"black")}}catch(J){a.e(J)}finally{a.f()}var v={name:"Set Line Color for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){S(v.oldValues,v.newValue)}};p(v),S(l,e),w(m+1);break;case _.AllObjectsOfThisType:var b,A=new Map,T=Object(f.a)(o);try{for(T.s();!(b=T.n()).done;){var P,j=b.value;if(j.type===V.Polygon)A.set(j.id,null!==(P=j.lineColor)&&void 0!==P?P:"black")}}catch(J){T.e(J)}finally{T.f()}var H={name:"Set Line Color for All Polygons",timestamp:Date.now(),oldValues:A,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){h(V.Polygon,H.newValue)}};p(H),h(V.Polygon,e),w(m+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(x)){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.parentId===x.parentId&&Tw.isIdentical(W.normal,x.normal))R.set(W.id,null!==(M=W.lineColor)&&void 0!==M?M:"gray")}}catch(J){D.e(J)}finally{D.f()}var I={name:"Set Line Color for All Polygons on Same Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:x.parentId,normal:x.normal,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){I.groupId&&s(V.Polygon,I.groupId,I.normal,I.newValue)}};p(I),s(V.Polygon,x.parentId,x.normal,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){var C,O=new Map,F=Object(f.a)(o);try{for(F.s();!(C=F.n()).done;){var k,Y=C.value;if(Y.type===V.Polygon&&Y.foundationId===x.foundationId)O.set(Y.id,null!==(k=Y.lineColor)&&void 0!==k?k:"black")}}catch(J){F.e(J)}finally{F.f()}var L={name:"Set Line Color for All Polygons Above Foundation",timestamp:Date.now(),oldValues:O,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(L.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){L.groupId&&d(V.Polygon,L.groupId,L.newValue)}};p(L),d(V.Polygon,x.foundationId,e),w(m+1)}break;default:var E=i(x.id),U=E?E.lineColor:x.lineColor,N={name:"Set Line Color of Selected Polygon",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){c(N.changedElementId,N.oldValue)},redo:function(){c(N.changedElementId,N.newValue)}};p(N),c(x.id,e),w(m+1)}};return Object(gf.jsx)(kP,{width:600,title:me.t("polygonMenu.LineColor",P),onApply:function(){j(A)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==A&&void 0!==A?A:null===x||void 0===x?void 0:x.lineColor)&&void 0!==l?l:"black",onChangeComplete:function(e){T(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",P)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",P)})]})})})]})})},NS=function(e){var t,l,a=e.setDialogVisible,o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Dn),s=Ew(Mn),d=Ew(Wn),h=Ew(In),p=Ew(Sr),y=Ew(Xn),g=Ew(Bn),m=Ew(Ii),w=Ew(Ci),x=OP(V.Polygon),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.color)&&void 0!==t?t:"gray"),b=Object(u.a)(v,2),A=b[0],T=b[1],P=$f(),S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){if(x&&function(e){if(x){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.color)return!0}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.color)return!0}}catch(g){r.e(g)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.foundationId===x.foundationId&&!d.locked&&d.color!==e)return!0}}catch(g){s.e(g)}finally{s.f()}break;case _.AllObjectsOfThisTypeOnSurface:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Polygon&&p.parentId===x.parentId&&Tw.isIdentical(p.normal,x.normal)&&!p.locked&&p.color!==e)return!0}}catch(g){h.e(g)}finally{h.f()}break;default:if(e!==x.color)return!0}return!1}}(e))switch(y){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,g=t.value;if(g.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(g.id))l.set(g.id,null!==(r=g.color)&&void 0!==r?r:"gray")}}catch(J){a.e(J)}finally{a.f()}var v={name:"Set Fill Color for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){S(v.oldValues,v.newValue)}};p(v),S(l,e),w(m+1);break;case _.AllObjectsOfThisType:var b,A=new Map,T=Object(f.a)(o);try{for(T.s();!(b=T.n()).done;){var P,j=b.value;if(j.type===V.Polygon)A.set(j.id,null!==(P=j.color)&&void 0!==P?P:"gray")}}catch(J){T.e(J)}finally{T.f()}var H={name:"Set Fill Color for All Polygons",timestamp:Date.now(),oldValues:A,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){h(V.Polygon,H.newValue)}};p(H),h(V.Polygon,e),w(m+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.foundationId===x.foundationId)R.set(W.id,null!==(M=W.color)&&void 0!==M?M:"gray")}}catch(J){D.e(J)}finally{D.f()}var I={name:"Set Fill Color for All Polygons Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){I.groupId&&d(V.Polygon,I.groupId,I.newValue)}};p(I),d(V.Polygon,x.foundationId,e),w(m+1)}break;case _.AllObjectsOfThisTypeOnSurface:if(n(x)){var C,O=new Map,F=Object(f.a)(o);try{for(F.s();!(C=F.n()).done;){var k,Y=C.value;if(Y.type===V.Polygon&&Y.parentId===x.parentId&&Tw.isIdentical(Y.normal,x.normal))O.set(Y.id,null!==(k=Y.color)&&void 0!==k?k:"gray")}}catch(J){F.e(J)}finally{F.f()}var L={name:"Set Fill Color for All Polygons on Same Surface",timestamp:Date.now(),oldValues:O,newValue:e,groupId:x.parentId,normal:x.normal,undo:function(){var e,t=Object(f.a)(L.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){L.groupId&&s(V.Polygon,L.groupId,L.normal,L.newValue)}};p(L),s(V.Polygon,x.parentId,x.normal,e),w(m+1)}break;default:var E=i(x.id),U=E?E.color:x.color,N={name:"Set Fill Color of Selected Polygon",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){c(N.changedElementId,N.oldValue)},redo:function(){c(N.changedElementId,N.newValue)}};p(N),c(x.id,e),w(m+1)}};return Object(gf.jsx)(kP,{width:600,title:me.t("polygonMenu.FillColor",P),onApply:function(){j(A)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==A&&void 0!==A?A:null===x||void 0===x?void 0:x.color)&&void 0!==l?l:"gray",onChangeComplete:function(e){T(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",P)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",P)})]})})})]})})},VS=l.p+"static/media/polygon_08_menu.e9d3ae98.png",JS=l.p+"static/media/polygon_10_menu.e1254bdd.png",GS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(Xn),d=Ew(Bn),h=Ew(Ii),p=Ew(Ci),y=OP(V.Polygon),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.textureType)&&void 0!==t?t:ce.NoTexture),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=db.a.Option,A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Polygon&&!i.locked){i.textureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Polygon&&r.parentId===e&&Tw.isIdentical(r.normal,t)&&!r.locked&&(r.textureType=l)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Polygon||i.foundationId!==e||i.locked||(i.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Polygon||o.locked||(o.textureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},j=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.textureType)return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.textureType)return!0}}catch(m){r.e(m)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,d=Object(f.a)(o);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Polygon&&u.parentId===y.parentId&&Tw.isIdentical(u.normal,y.normal)&&!u.locked&&u.textureType!==e)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var h,p=Object(f.a)(o);try{for(p.s();!(h=p.n()).done;){var g=h.value;if(g.type===V.Polygon&&g.foundationId===y.foundationId&&!g.locked&&g.textureType!==e)return!0}}catch(m){p.e(m)}finally{p.f()}break;default:if(e!==(null===y||void 0===y?void 0:y.textureType))return!0}return!1}}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,d=t.value;if(d.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(d.id))l.set(d.id,null!==(r=d.textureType)&&void 0!==r?r:ce.NoTexture)}}catch(J){a.e(J)}finally{a.f()}var g={name:"Set Texture for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){j(g.oldValues,g.newValue)}};c(g),j(l,e),p(h+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v,b=m.value;if(b.type===V.Polygon)w.set(b.id,null!==(v=b.textureType)&&void 0!==v?v:ce.NoTexture)}}catch(J){x.e(J)}finally{x.f()}var H={name:"Set Texture for All Polygons",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){S(H.newValue)}};c(H),S(e),p(h+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(y)){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.parentId===y.parentId&&Tw.isIdentical(W.normal,y.normal))R.set(W.id,null!==(M=W.textureType)&&void 0!==M?M:ce.NoTexture)}}catch(J){D.e(J)}finally{D.f()}var I={name:"Set Texture for All Polygons on Same Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:y.parentId,normal:y.normal,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){I.groupId&&T(I.groupId,I.normal,I.newValue)}};c(I),T(y.parentId,y.normal,e),p(h+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var C,O=new Map,F=Object(f.a)(o);try{for(F.s();!(C=F.n()).done;){var k,Y=C.value;if(Y.type===V.Polygon&&Y.foundationId===y.foundationId)O.set(Y.id,null!==(k=Y.textureType)&&void 0!==k?k:ce.NoTexture)}}catch(J){F.e(J)}finally{F.f()}var L={name:"Set Texture for All Polygons Above Foundation",timestamp:Date.now(),oldValues:O,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(L.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){L.groupId&&P(L.groupId,L.newValue)}};c(L),P(y.foundationId,e),p(h+1)}break;default:var E=i(y.id),U=E?E.textureType:y.textureType,N={name:"Set Texture of Selected Polygon",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(N.changedElementId,N.oldValue)},redo:function(){A(N.changedElementId,N.newValue)}};c(N),A(y.id,e),p(h+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("polygonMenu.FillTexture",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:w,onChange:function(e){return x(e)},children:[Object(gf.jsxs)(b,{value:ce.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",v)]},ce.NoTexture),Object(gf.jsxs)(b,{value:ce.Texture01,children:[Object(gf.jsx)("img",{alt:ce.Texture01,src:JP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture01",v)]},ce.Texture01),Object(gf.jsxs)(b,{value:ce.Texture02,children:[Object(gf.jsx)("img",{alt:ce.Texture02,src:GP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture02",v)]},ce.Texture02),Object(gf.jsxs)(b,{value:ce.Texture03,children:[Object(gf.jsx)("img",{alt:ce.Texture03,src:XP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture03",v)]},ce.Texture03),Object(gf.jsxs)(b,{value:ce.Texture04,children:[Object(gf.jsx)("img",{alt:ce.Texture04,src:BP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture04",v)]},ce.Texture04),Object(gf.jsxs)(b,{value:ce.Texture05,children:[Object(gf.jsx)("img",{alt:ce.Texture05,src:KP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture05",v)]},ce.Texture05),Object(gf.jsxs)(b,{value:ce.Texture06,children:[Object(gf.jsx)("img",{alt:ce.Texture06,src:qP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture06",v)]},ce.Texture06),Object(gf.jsxs)(b,{value:ce.Texture07,children:[Object(gf.jsx)("img",{alt:ce.Texture07,src:QP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture07",v)]},ce.Texture07),Object(gf.jsxs)(b,{value:ce.Texture08,children:[Object(gf.jsx)("img",{alt:ce.Texture08,src:VS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture08",v)]},ce.Texture08),Object(gf.jsxs)(b,{value:ce.Texture09,children:[Object(gf.jsx)("img",{alt:ce.Texture09,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture09",v)]},ce.Texture09),Object(gf.jsxs)(b,{value:ce.Texture10,children:[Object(gf.jsx)("img",{alt:ce.Texture10,src:JS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture10",v)]},ce.Texture10)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",v)})]})})})]})})},XS=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"create",value:function(t,l,a,o,i,r,n,c,s,d,u){if(l.type!==V.Foundation&&l.type!==V.Cuboid)throw new Error("base must be a foundation or cuboid");var f=[],h=Tw.calculatePolygonBounds(t.vertices),p=(o===$.portrait?a.length:a.width)*r;if(c===ee.upDown)for(var y=Math.floor(((h.maxX()-h.minX())*l.lx-p)/n),g=h.minX()+p/(2*l.lx)+u/l.lx,m=n/l.lx,w=.5*Math.abs(Math.cos(i))*p/l.lx,x={x:0,y:-.5},v={x:0,y:.5},b=("rotation"in l?l.rotation:void 0),A=0;A<=y;A++){var T=g+A*m;x.x=v.x=T-w;var P=Tw.polygonIntersections(x,v,t.vertices).sort((function(e,t){return e.y-t.y}));x.x=v.x=T+w;var S=Tw.polygonIntersections(x,v,t.vertices).sort((function(e,t){return e.y-t.y})),j=Math.max(P.length,S.length)/2;if(j>0)for(var H=0;H0)for(var B=0;B0)return Vl.makeSolarPanel(n,c,i,(p+y)/2,n.type===V.Cuboid?.5:n.lz,$.portrait,d,u,s,vt,Rt,o,void 0,g*n.ly,r)}},{key:"makeLeftRightSegment",value:function(e,t,l,a,o,i,r,n,c,s,d,u,f){var h=Math.abs(e.x-t.x)0)return Vl.makeSolarPanel(n,c,(p+y)/2,i,n.type===V.Cuboid?.5:n.lz,$.portrait,d,u,s,0,Rt,o,void 0,g*n.lx,r)}}]),e}(),BS=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"create",value:function(e,t,l,a,o,i,r,n,c,s,d){if(t.type!==V.Foundation&&t.type!==V.Cuboid)throw new Error("base must be a foundation or cuboid");var u,h=[],p=!Tw.isZero(t.rotation[2]),y=[],g=Object(f.a)(e.vertices);try{for(g.s();!(u=g.n()).done;){var m=u.value;y.push({x:m.x*t.lx+t.cx,y:m.y*t.ly+t.cy})}}catch(He){g.e(He)}finally{g.f()}var w=p?Tw.rotatePolygon(y,t.cx,t.cy,t.rotation[2]):y,x=Tw.calculatePolygonBounds(w),v=(a===$.portrait?l.length:l.width)*i,b=.5*Math.abs(Math.cos(o))*v;if(n===ee.eastWest)for(var A=x.maxY()-x.minY(),T=Math.floor((A-2*d-v)/r),P=x.minY()+v/2+d,S={x:x.minX(),y:0},j={x:x.maxX(),y:0},H=0;H<=T;H++){var z=P+H*r;S.y=j.y=z-b;var R=Tw.polygonIntersections(S,j,w).sort((function(e,t){return e.x-t.x}));S.y=j.y=z+b;var D=Tw.polygonIntersections(S,j,w).sort((function(e,t){return e.x-t.x})),M=Math.max(R.length,D.length)/2;if(M>0)for(var W=0;W0){var q=Tw.relativeCoordinates((J+G)/2,z,0,t),Q=Vl.makeSolarPanel(t,l,q.x,q.y,t.type===V.Cuboid?.5:t.lz,$.portrait,c,s,o,-t.rotation[2],Rt,t.rotation,void 0,K,v);Q.referenceId=e.id,Tw.changeOrientation(Q,l,a),h.push(Q)}}}else if(n===ee.northSouth)for(var Z=x.maxX()-x.minX(),_=Math.floor((Z-2*d-v)/r),te=x.minX()+v/2+d,le={x:0,y:x.minY()},ae={x:0,y:x.maxY()},oe=0;oe<=_;oe++){var ie=te+oe*r;le.x=ae.x=ie-b;var re=Tw.polygonIntersections(le,ae,w).sort((function(e,t){return e.y-t.y}));le.x=ae.x=ie+b;var ne=Tw.polygonIntersections(le,ae,w).sort((function(e,t){return e.y-t.y})),ce=Math.max(re.length,ne.length)/2;if(ce>0)for(var se=0;se0){var Se=Tw.relativeCoordinates(ie,(Ae+Te)/2,0,t),je=Vl.makeSolarPanel(t,l,Se.x,Se.y,t.type===V.Cuboid?.5:t.lz,$.portrait,c,s,o,-t.rotation[2]+vt,Rt,t.rotation,void 0,Pe,v);je.referenceId=e.id,Tw.changeOrientation(je,l,a),h.push(je)}}}return h}}]),e}(),KS=db.a.Option,qS=function(e){var t,l=e.setDialogVisible,o=Ew(si),i=Ew(Vi),n=Ew(Fi),c=Ew.getState().solarPanelArrayLayoutParams,s=Ew(on),d=Ew($r),h=Ew(Yi),p=Ew(Ei),y=Ew(yn),g=Ew(_c),m=Ew($c),w=Ew(Zc),x=Ew(Sr),v=Ew(Ii),b=Ew(Ci),A=Ew(Oi),T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!1),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useState)({left:0,top:0,bottom:0,right:0}),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useRef)(null),E=Object(r.useRef)(!0),U=Object(r.useRef)(null),N=Object(r.useRef)(null),J=Object(r.useRef)(!1),G=Object(r.useRef)(Ew(a.pvModelName)),X=Object(r.useRef)(Ew(a.rowAxis)),B=Object(r.useRef)(Ew(a.orientation)),K=Object(r.useRef)(Ew(a.tiltAngle)),q=Object(r.useRef)(Ew(a.rowWidth)),Q=Object(r.useRef)(Ew(a.interRowSpacing)),Z=Object(r.useRef)(null!==(t=Ew(a.margin))&&void 0!==t?t:0),_=Object(r.useRef)(Ew(a.poleHeight)),te=Object(r.useRef)(Ew(a.poleSpacing)),le={lng:i},ae=p(G.current),oe=s();Object(r.useEffect)((function(){var e;null===(e=U.current)||void 0===e||e.focus()}),[]),Object(r.useEffect)((function(){var e;R&&(null===(e=N.current)||void 0===e||e.focus())}),[R]);var ie=function(){if((null===oe||void 0===oe?void 0:oe.type)===V.Polygon){var e=d(oe);if(e){var t=[],l=X.current===ee.eastWest||X.current===ee.northSouth?BS.create(oe,e,ae,B.current,K.current,q.current,Q.current,X.current,_.current,te.current,Z.current):XS.create(oe,e,ae,B.current,K.current,q.current,Q.current,X.current,_.current,te.current,Z.current);if(l.length>0){var a,i=Object(f.a)(l);try{var r=function(){var e=a.value;t.push(JSON.parse(JSON.stringify(e))),o((function(t){t.elements.push(e)}))};for(i.s();!(a=i.n()).done;)r()}catch(s){i.e(s)}finally{i.f()}var n={name:"Solar Panel Array Layout",timestamp:Date.now(),oldElements:Ew.getState().deletedElements,newElements:t,oldParams:{pvModelName:c.pvModelName,rowAxis:c.rowAxis,orientation:c.orientation,tiltAngle:c.tiltAngle,rowsPerRack:c.rowsPerRack,interRowSpacing:c.interRowSpacing,poleHeight:c.poleHeight,poleSpacing:c.poleSpacing,margin:c.margin},newParams:{pvModelName:G.current,rowAxis:X.current,orientation:B.current,tiltAngle:K.current,rowsPerRack:q.current,interRowSpacing:Q.current,poleHeight:_.current,poleSpacing:te.current,margin:Z.current},referenceId:oe.id,undo:function(){m(n.referenceId,!1),n.oldElements.length>0&&o((function(e){var t,l=Object(f.a)(n.oldElements);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.elements.push(a)}}catch(s){l.e(s)}finally{l.f()}})),re(n.oldParams),ne()},redo:function(){m(n.referenceId,!1),n.newElements.length>0&&o((function(e){var t,l=Object(f.a)(n.newElements);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.elements.push(a)}}catch(s){l.e(s)}finally{l.f()}})),re(n.newParams),ne()}};x(n),b(v+1)}}E.current=!1,ne()}},re=function(e){var t;G.current=e.pvModelName,X.current=e.rowAxis,B.current=e.orientation,K.current=e.tiltAngle,q.current=e.rowsPerRack,Q.current=e.interRowSpacing,_.current=e.poleHeight,te.current=e.poleSpacing,Z.current=null!==(t=e.margin)&&void 0!==t?t:0},ne=function(){o((function(e){e.solarPanelArrayLayoutParams.pvModelName=G.current,e.solarPanelArrayLayoutParams.rowAxis=X.current,e.solarPanelArrayLayoutParams.orientation=B.current,e.solarPanelArrayLayoutParams.tiltAngle=K.current,e.solarPanelArrayLayoutParams.rowsPerRack=q.current,e.solarPanelArrayLayoutParams.interRowSpacing=Q.current,e.solarPanelArrayLayoutParams.poleHeight=_.current,e.solarPanelArrayLayoutParams.poleSpacing=te.current,e.solarPanelArrayLayoutParams.margin=Z.current}))},ce=function(){E.current&&(!function(){var e=(B.current===$.portrait?ae.length:ae.width)*q.current;return e*Math.abs(Math.sin(K.current))*.5>_.current?(Qh(me.t("message.SolarPanelsCannotIntersectWithGround",le)),!1):!(e>Q.current)||(Qh(me.t("message.SolarPanelsCannotOverlapWithOneAnother",le)),!1)}()?Qh(me.t("polygonMenu.LayoutNotAcceptedCheckYourParameters",le)):oe&&(!function(e){var t=n.filter((function(t){return t.type===V.SolarPanel&&t.parentId===e.parentId}));if(t.length>0){var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.referenceId!==e.id&&Tw.isPointInside(o.cx,o.cy,e.vertices)&&y(o.id,e.id)}}catch(i){a.e(i)}finally{a.f()}}}(oe),g(oe.id)>0?D(!0):(w(),ie())))};return Object(gf.jsxs)(gf.Fragment,{children:[R&&Object(gf.jsx)(Zv.a,{width:400,visible:R,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return C(!0)},onMouseOut:function(){return C(!1)},children:me.t("word.Reminder",le)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){D(!1)},children:me.t("word.Cancel",le)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:N,onClick:function(){oe&&(m(oe.id,!0),ie(),J.current&&(l(!1),b(0))),D(!1)},children:me.t("word.OK",le)},"OK")],children:me.t("message.ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout",le)+" "+me.t("message.DoYouWantToContinue",le)}),Object(gf.jsxs)(Zv.a,{width:640,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return C(!0)},onMouseOut:function(){return C(!1)},children:me.t("polygonMenu.SolarPanelArrayLayoutParametricDesign",le)}),footer:[Object(gf.jsx)(xv.a,{disabled:!E.current,onClick:function(){ce(),J.current=!1},children:me.t("word.Apply",le)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){l(!1),A(),E.current=!0,J.current=!1},children:me.t("word.Cancel",le)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:U,onClick:function(){E.current?(ce(),J.current=!0):l(!1)},children:me.t("word.OK",le)},"OK")],onCancel:function(){l(!1),E.current=!0},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!I,bounds:k,onStart:function(e,t){return function(e,t){if(L.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=L.current.getBoundingClientRect();Y({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:L,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayModel",le)+" ("+Object.keys(h).length+" "+me.t("word.Options",le)+"):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(db.a,{defaultValue:"Custom",style:{width:"100%"},value:G.current,onChange:function(e){G.current=e,E.current=!0,j(!S)},children:Object.keys(h).map((function(e){return Object(gf.jsx)(KS,{value:e,children:e+(h[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",le)+")":"")},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayRowAxis",le)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,E.current=!0,j(!S)},children:[Object(gf.jsx)(KS,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",le)},ee.leftRight),Object(gf.jsx)(KS,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",le)},ee.upDown),Object(gf.jsx)(KS,{value:ee.eastWest,children:me.t("polygonMenu.SolarPanelArrayEastWestRowAxis",le)},ee.eastWest),Object(gf.jsx)(KS,{value:ee.northSouth,children:me.t("polygonMenu.SolarPanelArrayNorthSouthRowAxis",le)},ee.northSouth)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayOrientation",le)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,E.current=!0,j(!S)},children:[Object(gf.jsx)(KS,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",le)},$.portrait),Object(gf.jsx)(KS,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",le)},$.landscape)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayTiltAngle",le)+" ([-90\xb0, 90\xb0]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:-90,max:90,style:{width:"100%"},precision:2,value:parseFloat(Tw.toDegrees(K.current).toFixed(2)),step:1,formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){K.current=Tw.toRadians(e),E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayRowWidth",le)+" ([1-100] "+me.t("solarPanelMenu.Panels",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:1,max:100,step:1,style:{width:"100%"},precision:0,formatter:function(e){return Number(e).toFixed(0)},value:q.current,onChange:function(e){q.current=e,E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayInterRowSpacing",le)+" ([1, 20] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:1,max:20,style:{width:"100%"},precision:2,value:Q.current,step:.5,onChange:function(e){Q.current=e,E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayMargin",le)+" ([0, 5] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:0,max:5,style:{width:"100%"},precision:1,value:Z.current,step:.1,onChange:function(e){Z.current=e,E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayPoleHeight",le)+" ([0, 10] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:0,max:10,style:{width:"100%"},precision:2,value:_.current,step:.1,onChange:function(e){_.current=e,E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayPoleSpacing",le)+" ([2, 50] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:2,max:50,style:{width:"100%"},precision:2,value:te.current,step:.5,onChange:function(e){te.current=e,E.current=!0,j(!S)}})})]})]})]})},QS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(Xn),d=Ew(Bn),h=Ew(Ii),p=Ew(Ci),y=OP(V.Polygon),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.lineStyle)&&void 0!==t?t:F.Solid),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=db.a.Option,A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.lineStyle=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Polygon&&r.parentId===e&&Tw.isIdentical(r.normal,t)&&!r.locked&&(r.lineStyle=l)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Polygon||i.foundationId!==e||i.locked||(i.lineStyle=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Polygon||o.locked||(o.lineStyle=e)}}catch(i){a.e(i)}finally{a.f()}}))},j=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.lineStyle=t)}}catch(r){o.e(r)}finally{o.f()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.lineStyle)return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.lineStyle)return!0}}catch(m){r.e(m)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,d=Object(f.a)(o);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Polygon&&u.parentId===y.parentId&&Tw.isIdentical(u.normal,y.normal)&&!u.locked&&e!==u.lineStyle)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var h,p=Object(f.a)(o);try{for(p.s();!(h=p.n()).done;){var g=h.value;if(g.type===V.Polygon&&g.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!g.locked&&e!==g.lineStyle)return!0}}catch(m){p.e(m)}finally{p.f()}break;default:if(e!==(null===y||void 0===y?void 0:y.lineStyle))return!0}return!1}}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,d=t.value;if(d.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(d.id))l.set(d.id,null!==(r=d.lineStyle)&&void 0!==r?r:F.Solid)}}catch(G){a.e(G)}finally{a.f()}var g={name:"Set Line Style for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(G){t.e(G)}finally{t.f()}},redo:function(){j(g.oldValues,g.newValue)}};c(g),j(l,e),p(h+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v,b=m.value;if(b.type===V.Polygon)w.set(b.id,null!==(v=b.lineStyle)&&void 0!==v?v:F.Solid)}}catch(G){x.e(G)}finally{x.f()}var H={name:"Set Line Style for All Polygons",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(G){t.e(G)}finally{t.f()}},redo:function(){S(H.newValue)}};c(H),S(e),p(h+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(y)){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.parentId===y.parentId&&Tw.isIdentical(W.normal,y.normal))R.set(W.id,null!==(M=W.lineStyle)&&void 0!==M?M:F.Solid)}}catch(G){D.e(G)}finally{D.f()}var I={name:"Set Line Style for All Polygons on Same Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:y.parentId,normal:y.normal,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(G){t.e(G)}finally{t.f()}},redo:function(){I.groupId&&T(I.groupId,I.normal,I.newValue)}};c(I),T(y.parentId,y.normal,e),p(h+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var C,O=new Map,k=Object(f.a)(o);try{for(k.s();!(C=k.n()).done;){var Y,L=C.value;if(L.type===V.Polygon&&L.foundationId===y.foundationId)O.set(L.id,null!==(Y=L.lineStyle)&&void 0!==Y?Y:F.Solid)}}catch(G){k.e(G)}finally{k.f()}var E={name:"Set Line Style for All Polygons Above Foundation",timestamp:Date.now(),oldValues:O,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(G){t.e(G)}finally{t.f()}},redo:function(){E.groupId&&P(E.groupId,E.newValue)}};c(E),P(y.foundationId,e),p(h+1)}break;default:var U=i(y.id),N=U?U.lineStyle:y.lineStyle,J={name:"Set Line Style of Selected Polygon",timestamp:Date.now(),oldValue:N,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(J.changedElementId,J.oldValue)},redo:function(){A(J.changedElementId,J.newValue)}};c(J),A(y.id,e),p(h+1)}};return Object(gf.jsx)(kP,{width:600,title:me.t("polygonMenu.LineStyle",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsxs)(db.a,{style:{width:"200px"},value:w,onChange:function(e){return x(e)},children:[Object(gf.jsxs)(b,{value:F.Solid,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px solid dimGray"},children:" "}),me.t("polygonMenu.SolidLine",v)]},F.Solid),Object(gf.jsxs)(b,{value:F.Dashed,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px dashed dimGray"},children:" "}),me.t("polygonMenu.DashedLine",v)]},F.Dashed),Object(gf.jsxs)(b,{value:F.Dotted,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px dotted dimGray"},children:" "}),me.t("polygonMenu.DottedLine",v)]},F.Dotted)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",v)})]})})})]})})},ZS=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew($r),n=Ew(Yn),c=Ew(Ln),s=Ew(En),d=Ew(Un),h=Ew(Sr),p=Ew(Xn),y=Ew(Bn),g=Ew(Ii),m=Ew(Ci),w=OP(V.Polygon),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.lineWidth)&&void 0!==t?t:1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=$f(),P=db.a.Option,S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.lineWidth=t)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){if(w&&function(e){if(w){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Polygon&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)&&e!==o.lineWidth)return!0}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(a);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.lineWidth)return!0}}catch(g){r.e(g)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,s=Object(f.a)(a);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.parentId===w.parentId&&Tw.isIdentical(d.normal,w.normal)&&!d.locked&&d.lineWidth!==e)return!0}}catch(g){s.e(g)}finally{s.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(a);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.Polygon&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked&&y.lineWidth!==e)return!0}}catch(g){h.e(g)}finally{h.f()}break;default:if(e!==(null===w||void 0===w?void 0:w.lineWidth))return!0}return!1}}(e))switch(p){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var y,x=t.value;if(x.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(x.id))l.set(x.id,null!==(y=x.lineWidth)&&void 0!==y?y:1)}}catch(J){r.e(J)}finally{r.f()}var v={name:"Set Line Width for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){S(v.oldValues,v.newValue)}};h(v),S(l,e),m(g+1);break;case _.AllObjectsOfThisType:var b,A=new Map,T=Object(f.a)(a);try{for(T.s();!(b=T.n()).done;){var P,j=b.value;if(j.type===V.Polygon)A.set(j.id,null!==(P=j.lineWidth)&&void 0!==P?P:1)}}catch(J){T.e(J)}finally{T.f()}var H={name:"Set Line Width for All Polygons",timestamp:Date.now(),oldValues:A,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){d(V.Polygon,H.newValue)}};h(H),d(V.Polygon,e),m(g+1);break;case _.AllObjectsOfThisTypeOnSurface:if(i(w)){var z,R=new Map,D=Object(f.a)(a);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.parentId===w.parentId&&Tw.isIdentical(W.normal,w.normal))R.set(W.id,null!==(M=W.lineWidth)&&void 0!==M?M:1)}}catch(J){D.e(J)}finally{D.f()}var I={name:"Set Line Width for All Polygons on Same Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:w.parentId,normal:w.normal,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){I.groupId&&c(V.Polygon,I.groupId,I.normal,I.newValue)}};h(I),c(V.Polygon,w.parentId,w.normal,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var C,O=new Map,F=Object(f.a)(a);try{for(F.s();!(C=F.n()).done;){var k,Y=C.value;if(Y.type===V.Polygon&&Y.foundationId===w.foundationId)O.set(Y.id,null!==(k=Y.lineWidth)&&void 0!==k?k:1)}}catch(J){F.e(J)}finally{F.f()}var L={name:"Set Line Width for All Polygons Above Foundation",timestamp:Date.now(),oldValues:O,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(L.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){L.groupId&&s(V.Polygon,L.groupId,L.newValue)}};h(L),s(V.Polygon,w.foundationId,e),m(g+1)}break;default:var E=o(w.id),U=E?E.lineWidth:w.lineWidth,N={name:"Set Line Width of Selected Polygon",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(N.changedElementId,N.oldValue)},redo:function(){n(N.changedElementId,N.newValue)}};h(N),n(w.id,e),m(g+1)}};return Object(gf.jsx)(kP,{width:560,title:me.t("polygonMenu.LineWidth",T),onApply:function(){j(b),l(!1),m(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsxs)(db.a,{style:{width:"200px"},value:b,onChange:function(e){return A(e)},children:[Object(gf.jsx)(P,{value:k.One,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"1px solid dimGray"}})},k.One),Object(gf.jsx)(P,{value:k.Two,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"2px solid dimGray"}})},k.Two),Object(gf.jsx)(P,{value:k.Three,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"3px solid dimGray"}})},k.Three),Object(gf.jsx)(P,{value:k.Four,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"4px solid dimGray"}})},k.Four),Object(gf.jsx)(P,{value:k.Five,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"5px solid dimGray"}})},k.Five)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",T)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",T)})]})})})]})})},_S=l(832),$S=l(833),ej=db.a.Option,tj=_S.a.TabPane,lj=function(e){var t,l,a,o,i,n,c,s,d,f,h=e.setDialogVisible,p=Ew(si),y=Ew(Gi),g=Ew(Vi),m=Tf(Nr),w=Ew(Yi),x=Ew(ln),v=Ew($r),b=Ew(tn),A=Ew(uf).geneticAlgorithmParams,T=Ew(ff),P=Ew(hf),S=Ew(rf),j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)(!1),F=Object(u.a)(D,2),k=F[0],Y=F[1],L=Object(r.useState)({left:0,top:0,bottom:0,right:0}),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Object(r.useRef)(null),G=Object(r.useRef)(A.objectiveFunctionType),X=Object(r.useRef)(A.selectionMethod),B=Object(r.useRef)(A.searchMethod),K=Object(r.useRef)(A.populationSize),q=Object(r.useRef)(A.maximumGenerations),Q=Object(r.useRef)(A.mutationRate),Z=Object(r.useRef)(null!==(t=A.selectionRate)&&void 0!==t?t:.5),_=Object(r.useRef)(null!==(l=A.crossoverRate)&&void 0!==l?l:.5),te=Object(r.useRef)(A.convergenceThreshold),le=Object(r.useRef)(A.localSearchRadius),ae=Object(r.useRef)(null!==(a=T.minimumTiltAngle)&&void 0!==a?a:-vt),oe=Object(r.useRef)(null!==(o=T.maximumTiltAngle)&&void 0!==o?o:vt),ie=Object(r.useRef)(T.minimumRowsPerRack),re=Object(r.useRef)(T.maximumRowsPerRack),ne=Object(r.useRef)(T.minimumInterRowSpacing),ce=Object(r.useRef)(T.maximumInterRowSpacing),se=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=se.current)||void 0===e||e.focus()}),[]);var de={lng:g},ue=Object(r.useRef)(null!==(i=T.rowAxis)&&void 0!==i?i:ee.leftRight),fe=x?v(x):void 0,he=fe?b(V.SolarPanel,fe.id):void 0,pe=Object(r.useRef)(he&&he.length>0?he[0].pvModelName:null!==(n=T.pvModelName)&&void 0!==n?n:"CS6X-355P-FG"),ye=Object(r.useRef)(he&&he.length>0?he[0].orientation:null!==(c=T.orientation)&&void 0!==c?c:$.landscape),ge=Object(r.useRef)(he&&he.length>0?he[0].poleHeight:null!==(s=T.poleHeight)&&void 0!==s?s:1),we=Object(r.useRef)(he&&he.length>0?he[0].poleSpacing:null!==(d=T.poleSpacing)&&void 0!==d?d:3),xe=Object(r.useRef)(null!==(f=T.margin)&&void 0!==f?f:0),ve=Object(r.useRef)(S.electricitySellingPrice),be=Object(r.useRef)(S.operationalCostPerUnit);Object(r.useEffect)((function(){ve.current=S.electricitySellingPrice}),[S.electricitySellingPrice]),Object(r.useEffect)((function(){be.current=S.operationalCostPerUnit}),[S.operationalCostPerUnit]);var Ae=function(){m||Kh(me.t("message.EvolutionStarted",de)),p((function(e){e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=M.SOLAR_PANEL_ARRAY,e.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType=G.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod=X.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod=B.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize=K.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations=q.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate=Z.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate=_.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate=Q.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold=te.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius=le.current,e.solarPanelArrayLayoutConstraints||(e.solarPanelArrayLayoutConstraints=new Iw),e.solarPanelArrayLayoutConstraints.minimumRowsPerRack=ie.current,e.solarPanelArrayLayoutConstraints.maximumRowsPerRack=re.current,e.solarPanelArrayLayoutConstraints.minimumTiltAngle=ae.current,e.solarPanelArrayLayoutConstraints.maximumTiltAngle=oe.current,e.solarPanelArrayLayoutConstraints.minimumInterRowSpacing=ne.current,e.solarPanelArrayLayoutConstraints.maximumInterRowSpacing=ce.current,e.solarPanelArrayLayoutConstraints.poleHeight=ge.current,e.solarPanelArrayLayoutConstraints.poleSpacing=we.current,e.solarPanelArrayLayoutConstraints.pvModelName=pe.current,e.solarPanelArrayLayoutConstraints.rowAxis=ue.current,e.solarPanelArrayLayoutConstraints.orientation=ye.current,e.solarPanelArrayLayoutConstraints.margin=xe.current,e.economicsParams.operationalCostPerUnit=be.current,e.economicsParams.electricitySellingPrice=ve.current})),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!e.runEvolution})),p((function(e){e.evolutionMethod=I.GENETIC_ALGORITHM,y&&(e.actionInfo={name:"Run Genetic Algorithm for Solar Panel Array Layout",timestamp:(new Date).getTime()})}))}),100)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:640,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return Y(!0)},onMouseOut:function(){return Y(!1)},children:me.t("optimizationMenu.SolarPanelArrayLayout",de)+": "+me.t("optimizationMenu.GeneticAlgorithmSettings",de)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){h(!1)},children:me.t("word.Cancel",de)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:se,onClick:function(){Ae(),h(!1)},children:me.t("word.Run",de)},"Run")],onCancel:function(){h(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!k,bounds:U,onStart:function(e,t){return function(e,t){if(J.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=J.current.getBoundingClientRect();N({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:J,children:e})})},children:Object(gf.jsxs)(_S.a,{defaultActiveKey:P,type:"card",onChange:function(e){p((function(t){t.geneticAlgorithmWizardSelectedTab=e}))},children:[Object(gf.jsxs)(tj,{tab:me.t("optimizationMenu.Parameters",de),children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:G.current,style:{width:"100%"},value:G.current,onChange:function(e){G.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:W.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",de)},W.DAILY_TOTAL_OUTPUT),Object(gf.jsx)(ej,{value:W.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",de)},W.YEARLY_TOTAL_OUTPUT),Object(gf.jsx)(ej,{value:W.DAILY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",de)},W.DAILY_AVERAGE_OUTPUT),Object(gf.jsx)(ej,{value:W.YEARLY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",de)},W.YEARLY_AVERAGE_OUTPUT),Object(gf.jsx)(ej,{value:W.DAILY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionDailyProfit",de)},W.DAILY_PROFIT),Object(gf.jsx)(ej,{value:W.YEARLY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",de)},W.YEARLY_PROFIT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.GeneticAlgorithmSelectionMethod",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:X.current,style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:C.ROULETTE_WHEEL,children:me.t("optimizationMenu.RouletteWheel",de)},C.ROULETTE_WHEEL),Object(gf.jsx)(ej,{value:C.TOURNAMENT,children:me.t("optimizationMenu.Tournament",de)},C.TOURNAMENT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.PopulationSize",de)+" [10, 100]:"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:10,max:100,style:{width:"100%"},precision:0,value:K.current,step:1,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){K.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumGenerations",de)+" [5, 100]:"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:5,max:100,step:1,style:{width:"100%"},precision:0,value:q.current,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){q.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SelectionRate",de)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Z.current,step:.01,onChange:function(e){Z.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CrossoverRate",de)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:_.current,step:.01,onChange:function(e){_.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MutationRate",de)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Q.current,step:.01,onChange:function(e){Q.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",de)+" (0, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:te.current,step:.001,onChange:function(e){te.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:B.current,style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:O.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",de)},O.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(gf.jsx)(ej,{value:O.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",de)},O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),B.current===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",de)+" ([0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:le.current,step:.01,onChange:function(e){le.current=e,R(!z)}})})]})]},"1"),Object(gf.jsxs)(tj,{tab:me.t("optimizationMenu.Variables",de),children:[Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.TiltAngleRange",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){ae.current=Tw.toRadians(e[0]),oe.current=Tw.toRadians(e[1]),R(!z)},min:-90,max:90,defaultValue:[Tw.toDegrees(ae.current),Tw.toDegrees(oe.current)],marks:{"-90":{style:{fontSize:"10px"},label:"-90\xb0"},"-45":{style:{fontSize:"10px"},label:"-45\xb0"},0:{style:{fontSize:"10px"},label:"0\xb0"},45:{style:{fontSize:"10px"},label:"45\xb0"},90:{style:{fontSize:"10px"},label:"90\xb0"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.RowsPerRackRange",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){ie.current=e[0],re.current=e[1],R(!z)},min:1,max:9,defaultValue:[ie.current,re.current],marks:{1:{style:{fontSize:"10px"},label:1},2:{style:{fontSize:"10px"},label:2},3:{style:{fontSize:"10px"},label:3},4:{style:{fontSize:"10px"},label:4},5:{style:{fontSize:"10px"},label:5},6:{style:{fontSize:"10px"},label:6},7:{style:{fontSize:"10px"},label:7},8:{style:{fontSize:"10px"},label:8},9:{style:{fontSize:"10px"},label:9}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InterRowSpacingRange",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){ne.current=e[0],ce.current=e[1],R(!z)},min:1,max:10,defaultValue:[ne.current,ce.current],marks:{1:{style:{fontSize:"10px"},label:"1m"},3:{style:{fontSize:"10px"},label:"3m"},5:{style:{fontSize:"10px"},label:"5m"},7:{style:{fontSize:"10px"},label:"7m"},9:{style:{fontSize:"10px"},label:"9m"}}})})]})]},"2"),Object(gf.jsxs)(tj,{tab:me.t("optimizationMenu.Constants",de),children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"0px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayModel",de)+" ("+Object.keys(w).length+" "+me.t("word.Options",de)+"):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(db.a,{defaultValue:"Custom",style:{width:"100%"},value:pe.current,onChange:function(e){pe.current=e,R(!z)},children:Object.keys(w).map((function(e){return Object(gf.jsx)(ej,{value:e,children:e+(w[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",de)+")":"")},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayRowAxis",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:ue.current,onChange:function(e){ue.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",de)},ee.leftRight),Object(gf.jsx)(ej,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",de)},ee.upDown)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayOrientation",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:ye.current,onChange:function(e){ye.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",de)},$.portrait),Object(gf.jsx)(ej,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",de)},$.landscape)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayMargin",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){xe.current=e,R(!z)},min:0,max:5,step:.1,defaultValue:xe.current,marks:{0:{style:{fontSize:"10px"},label:"0m"},1:{style:{fontSize:"10px"},label:"1m"},2:{style:{fontSize:"10px"},label:"2m"},3:{style:{fontSize:"10px"},label:"3m"},4:{style:{fontSize:"10px"},label:"4m"},5:{style:{fontSize:"10px"},label:"5m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("solarCollectorMenu.PoleHeight",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){ge.current=e,R(!z)},min:0,max:10,step:.1,defaultValue:ge.current,marks:{0:{style:{fontSize:"10px"},label:"0m"},2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("solarPanelMenu.PoleSpacing",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){we.current=e,R(!z)},min:2,max:10,step:.1,defaultValue:we.current,marks:{2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.OperationalCostPerUnit",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){be.current=e,R(!z)},min:.1,max:1,step:.01,defaultValue:be.current,marks:{.1:{style:{fontSize:"10px"},label:"10\xa2"},.3:{style:{fontSize:"10px"},label:"30\xa2"},.5:{style:{fontSize:"10px"},label:"50\xa2"},.7:{style:{fontSize:"10px"},label:"70\xa2"},.9:{style:{fontSize:"10px"},label:"90\xa2"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.ElectricitySellingPrice",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){ve.current=e,R(!z)},min:.1,max:1,step:.01,defaultValue:ve.current,marks:{.1:{style:{fontSize:"10px"},label:"10\xa2"},.3:{style:{fontSize:"10px"},label:"30\xa2"},.5:{style:{fontSize:"10px"},label:"50\xa2"},.7:{style:{fontSize:"10px"},label:"70\xa2"},.9:{style:{fontSize:"10px"},label:"90\xa2"}}})})]})]},"3")]})})})},aj=n.a.memo(lj),oj=db.a.Option,ij=_S.a.TabPane,rj=function(e){var t,l,a,o,i,n,c,s,d,f,h,p,y=e.setDialogVisible,g=Ew(si),m=Ew(Gi),w=Ew(Vi),x=Tf(Nr),v=Ew(Yi),b=Ew(ln),A=Ew($r),T=Ew(tn),P=Ew(uf).particleSwarmOptimizationParams,S=Ew(ff),j=Ew(pf),H=Ew(rf),z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],C=R[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),Y=k[0],L=k[1],E=Object(r.useState)({left:0,top:0,bottom:0,right:0}),U=Object(u.a)(E,2),N=U[0],J=U[1],G=Object(r.useRef)(null),X=Object(r.useRef)(P.objectiveFunctionType),B=Object(r.useRef)(P.searchMethod),K=Object(r.useRef)(P.swarmSize),q=Object(r.useRef)(P.maximumSteps),Q=Object(r.useRef)(null!==(t=P.vmax)&&void 0!==t?t:.01),Z=Object(r.useRef)(null!==(l=P.inertia)&&void 0!==l?l:.8),_=Object(r.useRef)(null!==(a=P.cognitiveCoefficient)&&void 0!==a?a:.1),te=Object(r.useRef)(null!==(o=P.socialCoefficient)&&void 0!==o?o:.1),le=Object(r.useRef)(P.convergenceThreshold),ae=Object(r.useRef)(P.localSearchRadius),oe=Object(r.useRef)(null!==(i=S.minimumTiltAngle)&&void 0!==i?i:-vt),ie=Object(r.useRef)(null!==(n=S.maximumTiltAngle)&&void 0!==n?n:vt),re=Object(r.useRef)(S.minimumRowsPerRack),ne=Object(r.useRef)(S.maximumRowsPerRack),ce=Object(r.useRef)(S.minimumInterRowSpacing),se=Object(r.useRef)(S.maximumInterRowSpacing),de=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=de.current)||void 0===e||e.focus()}),[]);var ue={lng:w},fe=Object(r.useRef)(null!==(c=S.rowAxis)&&void 0!==c?c:ee.leftRight),he=b?A(b):void 0,pe=he?T(V.SolarPanel,he.id):void 0,ye=Object(r.useRef)(pe&&pe.length>0?pe[0].pvModelName:null!==(s=S.pvModelName)&&void 0!==s?s:"CS6X-355P-FG"),ge=Object(r.useRef)(pe&&pe.length>0?pe[0].orientation:null!==(d=S.orientation)&&void 0!==d?d:$.landscape),we=Object(r.useRef)(pe&&pe.length>0?pe[0].poleHeight:null!==(f=S.poleHeight)&&void 0!==f?f:1),xe=Object(r.useRef)(pe&&pe.length>0?pe[0].poleSpacing:null!==(h=S.poleSpacing)&&void 0!==h?h:3),ve=Object(r.useRef)(null!==(p=S.margin)&&void 0!==p?p:0),be=Object(r.useRef)(H.electricitySellingPrice),Ae=Object(r.useRef)(H.operationalCostPerUnit);Object(r.useEffect)((function(){be.current=H.electricitySellingPrice}),[H.electricitySellingPrice]),Object(r.useEffect)((function(){Ae.current=H.operationalCostPerUnit}),[H.operationalCostPerUnit]);var Te=function(){x||Kh(me.t("message.EvolutionStarted",ue)),g((function(e){e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=M.SOLAR_PANEL_ARRAY,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType=X.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod=B.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize=K.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps=q.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient=_.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient=te.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.vmax=Q.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.inertia=Z.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.convergenceThreshold=le.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.localSearchRadius=ae.current,e.solarPanelArrayLayoutConstraints||(e.solarPanelArrayLayoutConstraints=new Iw),e.solarPanelArrayLayoutConstraints.minimumRowsPerRack=re.current,e.solarPanelArrayLayoutConstraints.maximumRowsPerRack=ne.current,e.solarPanelArrayLayoutConstraints.minimumTiltAngle=oe.current,e.solarPanelArrayLayoutConstraints.maximumTiltAngle=ie.current,e.solarPanelArrayLayoutConstraints.minimumInterRowSpacing=ce.current,e.solarPanelArrayLayoutConstraints.maximumInterRowSpacing=se.current,e.solarPanelArrayLayoutConstraints.poleHeight=we.current,e.solarPanelArrayLayoutConstraints.poleSpacing=xe.current,e.solarPanelArrayLayoutConstraints.pvModelName=ye.current,e.solarPanelArrayLayoutConstraints.rowAxis=fe.current,e.solarPanelArrayLayoutConstraints.orientation=ge.current,e.solarPanelArrayLayoutConstraints.margin=ve.current,e.economicsParams.operationalCostPerUnit=Ae.current,e.economicsParams.electricitySellingPrice=be.current})),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!e.runEvolution})),g((function(e){e.evolutionMethod=I.PARTICLE_SWARM_OPTIMIZATION,m&&(e.actionInfo={name:"Run Particle Swarm Optimization for Solar Panel Array Layout",timestamp:(new Date).getTime()})}))}),100)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:640,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return L(!0)},onMouseOut:function(){return L(!1)},children:me.t("optimizationMenu.SolarPanelArrayLayout",ue)+": "+me.t("optimizationMenu.ParticleSwarmOptimizationSettings",ue)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){y(!1)},children:me.t("word.Cancel",ue)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:de,onClick:function(){Te(),y(!1)},children:me.t("word.Run",ue)},"Run")],onCancel:function(){y(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!Y,bounds:N,onStart:function(e,t){return function(e,t){if(G.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=G.current.getBoundingClientRect();J({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:G,children:e})})},children:Object(gf.jsxs)(_S.a,{defaultActiveKey:j,type:"card",onChange:function(e){g((function(t){t.particleSwarmOptimizationWizardSelectedTab=e}))},children:[Object(gf.jsxs)(ij,{tab:me.t("optimizationMenu.Parameters",ue),children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:X.current,style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,C(!D)},children:[Object(gf.jsx)(oj,{value:W.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",ue)},W.DAILY_TOTAL_OUTPUT),Object(gf.jsx)(oj,{value:W.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",ue)},W.YEARLY_TOTAL_OUTPUT),Object(gf.jsx)(oj,{value:W.DAILY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",ue)},W.DAILY_AVERAGE_OUTPUT),Object(gf.jsx)(oj,{value:W.YEARLY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",ue)},W.YEARLY_AVERAGE_OUTPUT),Object(gf.jsx)(oj,{value:W.DAILY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionDailyProfit",ue)},W.DAILY_PROFIT),Object(gf.jsx)(oj,{value:W.YEARLY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",ue)},W.YEARLY_PROFIT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SwarmSize",ue)+" [10, 100]:"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:10,max:100,style:{width:"100%"},precision:0,value:K.current,step:1,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){K.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumSteps",ue)+" [5, 100]:"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:5,max:100,step:1,style:{width:"100%"},precision:0,value:q.current,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){q.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CognitiveCoefficient",ue)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:_.current,step:.01,onChange:function(e){_.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SocialCoefficient",ue)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:te.current,step:.01,onChange:function(e){te.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InertiaWeight",ue)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Z.current,step:.01,onChange:function(e){Z.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumVelocity",ue)+" [0.001, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:Q.current,step:.001,onChange:function(e){Q.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",ue)+" (0, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:le.current,step:.001,onChange:function(e){le.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:B.current,style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,C(!D)},children:[Object(gf.jsx)(oj,{value:O.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",ue)},O.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(gf.jsx)(oj,{value:O.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",ue)},O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),B.current===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",ue)+" ([0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:ae.current,step:.01,onChange:function(e){ae.current=e,C(!D)}})})]})]},"1"),Object(gf.jsxs)(ij,{tab:me.t("optimizationMenu.Variables",ue),children:[Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.TiltAngleRange",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){oe.current=Tw.toRadians(e[0]),ie.current=Tw.toRadians(e[1]),C(!D)},min:-90,max:90,defaultValue:[Tw.toDegrees(oe.current),Tw.toDegrees(ie.current)],marks:{"-90":{style:{fontSize:"10px"},label:"-90\xb0"},"-45":{style:{fontSize:"10px"},label:"-45\xb0"},0:{style:{fontSize:"10px"},label:"0\xb0"},45:{style:{fontSize:"10px"},label:"45\xb0"},90:{style:{fontSize:"10px"},label:"90\xb0"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.RowsPerRackRange",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){re.current=e[0],ne.current=e[1],C(!D)},min:1,max:9,defaultValue:[re.current,ne.current],marks:{1:{style:{fontSize:"10px"},label:1},2:{style:{fontSize:"10px"},label:2},3:{style:{fontSize:"10px"},label:3},4:{style:{fontSize:"10px"},label:4},5:{style:{fontSize:"10px"},label:5},6:{style:{fontSize:"10px"},label:6},7:{style:{fontSize:"10px"},label:7},8:{style:{fontSize:"10px"},label:8},9:{style:{fontSize:"10px"},label:9}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InterRowSpacingRange",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){ce.current=e[0],se.current=e[1],C(!D)},min:2,max:10,defaultValue:[ce.current,se.current],marks:{2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]})]},"2"),Object(gf.jsxs)(ij,{tab:me.t("optimizationMenu.Constants",ue),children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"0px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayModel",ue)+" ("+Object.keys(v).length+" "+me.t("word.Options",ue)+"):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(db.a,{defaultValue:"Custom",style:{width:"100%"},value:ye.current,onChange:function(e){ye.current=e,C(!D)},children:Object.keys(v).map((function(e){return Object(gf.jsx)(oj,{value:e,children:e+(v[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",ue)+")":"")},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayRowAxis",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:fe.current,onChange:function(e){fe.current=e,C(!D)},children:[Object(gf.jsx)(oj,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",ue)},ee.leftRight),Object(gf.jsx)(oj,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",ue)},ee.upDown)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayOrientation",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:ge.current,onChange:function(e){ge.current=e,C(!D)},children:[Object(gf.jsx)(oj,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",ue)},$.portrait),Object(gf.jsx)(oj,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",ue)},$.landscape)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayMargin",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){ve.current=e,C(!D)},min:0,max:5,step:.1,defaultValue:ve.current,marks:{0:{style:{fontSize:"10px"},label:"0m"},1:{style:{fontSize:"10px"},label:"1m"},2:{style:{fontSize:"10px"},label:"2m"},3:{style:{fontSize:"10px"},label:"3m"},4:{style:{fontSize:"10px"},label:"4m"},5:{style:{fontSize:"10px"},label:"5m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("solarCollectorMenu.PoleHeight",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){we.current=e,C(!D)},min:0,max:10,step:.1,defaultValue:we.current,marks:{0:{style:{fontSize:"10px"},label:"0m"},2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("solarPanelMenu.PoleSpacing",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){xe.current=e,C(!D)},min:2,max:10,step:.1,defaultValue:xe.current,marks:{2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.OperationalCostPerUnit",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){Ae.current=e,C(!D)},min:.1,max:1,step:.01,defaultValue:Ae.current,marks:{.1:{style:{fontSize:"10px"},label:"10\xa2"},.3:{style:{fontSize:"10px"},label:"30\xa2"},.5:{style:{fontSize:"10px"},label:"50\xa2"},.7:{style:{fontSize:"10px"},label:"70\xa2"},.9:{style:{fontSize:"10px"},label:"90\xa2"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.ElectricitySellingPrice",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){be.current=e,C(!D)},min:.1,max:1,step:.01,defaultValue:be.current,marks:{.1:{style:{fontSize:"10px"},label:"10\xa2"},.3:{style:{fontSize:"10px"},label:"30\xa2"},.5:{style:{fontSize:"10px"},label:"50\xa2"},.7:{style:{fontSize:"10px"},label:"70\xa2"},.9:{style:{fontSize:"10px"},label:"90\xa2"}}})})]})]},"3")]})})})},nj=n.a.memo(rj),cj=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Sr),o=Ew(Xn),i=Ew(Bn),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Polygon),p=Object(r.useState)(void 0!==(null===h||void 0===h?void 0:h.opacity)?h.opacity:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.opacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(o){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Polygon&&e!==i.opacity&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(m){a.e(m)}finally{a.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Polygon&&e!==c.opacity&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(l);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Polygon&&u.foundationId===h.foundationId&&e!==u.opacity&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.AllObjectsOfThisTypeOnSurface:var p,y=Object(f.a)(l);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Polygon&&g.parentId===h.parentId&&Tw.isIdentical(g.normal,h.normal)&&e!==g.opacity&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.opacity))return!0}return!1}}(e))switch(o){case _.AllSelectedObjectsOfThisType:var t,i=new Map,r=Object(f.a)(l);try{for(r.s();!(t=r.n()).done;){var d=t.value;if(d.type===V.Polygon&&!d.locked&&Ew.getState().selectedElementIdSet.has(d.id)){var u=d;i.set(d.id,u.opacity),x(u.id,e)}}}catch(L){r.e(L)}finally{r.f()}var p={name:"Set Opacity for Selected Polygons",timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){v(p.oldValues)},redo:function(){b(p.oldValues,p.newValue)}};a(p),c(n+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(l);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(w.type===V.Polygon&&!w.locked){var A=w;g.set(w.id,A.opacity),x(A.id,e)}}}catch(L){m.e(L)}finally{m.f()}var T={name:"Set Opacity for All Polygons",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};a(T),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var P,S=new Map,j=Object(f.a)(l);try{for(j.s();!(P=j.n()).done;){var H=P.value;if(H.type===V.Polygon&&H.foundationId===h.foundationId&&!H.locked){var z=H;S.set(H.id,z.opacity),x(z.id,e)}}}catch(L){j.e(L)}finally{j.f()}var R={name:"Set Opacity for All Polygons Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:h.foundationId,undo:function(){v(R.oldValues)},redo:function(){b(R.oldValues,R.newValue)}};a(R),c(n+1)}break;case _.AllObjectsOfThisTypeOnSurface:if(h.parentId){var D,M=new Map,W=Object(f.a)(l);try{for(W.s();!(D=W.n()).done;){var I=D.value;if(I.type===V.Polygon&&I.parentId===h.parentId&&Tw.isIdentical(I.normal,h.normal)&&!I.locked){var C=I;M.set(I.id,C.opacity),x(C.id,e)}}}catch(L){W.e(L)}finally{W.f()}var O={name:"Set Opacity for All Polygons Above Foundation",timestamp:Date.now(),oldValues:M,newValue:e,groupId:h.foundationId,undo:function(){v(O.oldValues)},redo:function(){b(O.oldValues,O.newValue)}};a(O),c(n+1)}break;default:if(h){var F=s(h.id),k=void 0!==F.opacity?F.opacity:void 0!==h.opacity?h.opacity:1,Y={name:"Set Polygon Opacity",timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(Y.changedElementId,Y.oldValue)},redo:function(){x(Y.changedElementId,Y.newValue)}};a(Y),x(h.id,e),c(n+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("polygonMenu.Opacity",w),onApply:function(){A(g)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.1,precision:1,value:g,formatter:function(e){return Number(e).toFixed(1)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return i(e.target.value)},value:o,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",w)})]})})})]})})},sj=n.a.memo((function(){var e,t,l,a,o,i,n,c,s=Ew(si),d=Ew(Vi),h=Ew(Sr),p=Ew(os),y=Ew(Ci),g=OP(V.Polygon),m=Object(r.useState)(null!==(e=null===g||void 0===g?void 0:g.text)&&void 0!==e?e:""),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(null!==(t=null===g||void 0===g?void 0:g.fontSize)&&void 0!==t?t:1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(null!==(l=null===g||void 0===g?void 0:g.fontColor)&&void 0!==l?l:"black"),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(null!==(a=null===g||void 0===g?void 0:g.fontOutlineColor)&&void 0!==a?a:"white"),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(null!==(o=null===g||void 0===g?void 0:g.fontOutlineWidth)&&void 0!==o?o:0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useState)(null!==(i=null===g||void 0===g?void 0:g.fontStrokeColor)&&void 0!==i?i:"black"),Y=Object(u.a)(k,2),L=Y[0],E=Y[1],U=Object(r.useState)(null!==(n=null===g||void 0===g?void 0:g.fontStrokeWidth)&&void 0!==n?n:0),N=Object(u.a)(U,2),J=N[0],G=N[1],X=Object(r.useState)(!1),B=Object(u.a)(X,2),K=B[0],q=B[1],Q=Object(r.useState)(!1),Z=Object(u.a)(Q,2),_=Z[0],$=Z[1],ee=Object(r.useState)(!1),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useState)(!1),ie=Object(u.a)(oe,2),re=ie[0],ne=ie[1],se=Object(r.useState)(!1),de=Object(u.a)(se,2),ue=de[0],fe=de[1],he=Object(r.useState)(!1),pe=Object(u.a)(he,2),ye=pe[0],ge=pe[1],we=Object(r.useState)(!1),xe=Object(u.a)(we,2),ve=xe[0],be=xe[1],Ae=Object(r.useState)(!1),Te=Object(u.a)(Ae,2),Pe=Te[0],Se=Te[1],je=Object(r.useState)(!1),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De={lng:d},Me=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===(null===g||void 0===g?void 0:g.parentId))return a}}catch(o){l.e(o)}finally{l.f()}}));if(Object(r.useEffect)((function(){var e,t,l,a,o,i,r;g&&(v(null!==(e=g.text)&&void 0!==e?e:""),P(null!==(t=g.fontSize)&&void 0!==t?t:1),z(null!==(l=g.fontColor)&&void 0!==l?l:"black"),W(null!==(a=g.fontOutlineColor)&&void 0!==a?a:"white"),F(null!==(o=g.fontOutlineWidth)&&void 0!==o?o:0),E(null!==(i=g.fontStrokeColor)&&void 0!==i?i:"black"),G(null!==(r=g.fontStrokeWidth)&&void 0!==r?r:0))}),[g]),!g||!Me)return null;var We=!(null===g||void 0===g?void 0:g.locked),Ie=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.filled=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Ce=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.noOutline=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Oe=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.shininess=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Fe=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.text=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},ke=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontSize=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ye=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Le=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontOutlineWidth=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ee=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontOutlineColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ue=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontStrokeWidth=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ne=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontStrokeColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ve=function(){if(g){var e,t={name:"Set Text for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.text)&&void 0!==e?e:"",newValue:x,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Fe(g.id,t.oldValue)},redo:function(){Fe(g.id,t.newValue)}};h(t),Fe(g.id,x)}},Je=function(){if(g){var e,t={name:"Set Font Size for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontSize)&&void 0!==e?e:1,newValue:T,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){ke(g.id,t.oldValue)},redo:function(){ke(g.id,t.newValue)}};h(t),ke(g.id,T)}},Ge=function(){if(g){var e,t={name:"Set Font Color for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontColor)&&void 0!==e?e:"black",newValue:H,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ye(g.id,t.oldValue)},redo:function(){Ye(g.id,t.newValue)}};h(t),Ye(g.id,H)}},Xe=function(){if(g){var e,t={name:"Set Font Outline Width for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontOutlineWidth)&&void 0!==e?e:0,newValue:O,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Le(g.id,t.oldValue)},redo:function(){Le(g.id,t.newValue)}};h(t),Le(g.id,O)}},Be=function(){if(g){var e,t={name:"Set Font Outline Color for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontOutlineColor)&&void 0!==e?e:"white",newValue:M,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ee(g.id,t.oldValue)},redo:function(){Ee(g.id,t.newValue)}};h(t),Ee(g.id,M)}},Ke=function(){if(g){var e,t={name:"Set Font Stroke Width for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontStrokeWidth)&&void 0!==e?e:0,newValue:J,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ue(g.id,t.oldValue)},redo:function(){Ue(g.id,t.newValue)}};h(t),Ue(g.id,J)}},qe=function(){if(g){var e,t={name:"Set Font Stroke Color for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontStrokeColor)&&void 0!==e?e:"black",newValue:L,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ne(g.id,t.oldValue)},redo:function(){Ne(g.id,t.newValue)}};h(t),Ne(g.id,L)}};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){if(p&&p.length>0){var e=p[0];if(e.type===V.Human||e.type===V.Tree||e.type===V.Polygon||e.type===V.Sensor||e.type===V.SolarPanel)return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"polygon-paste"}),Object(gf.jsx)(TP,{keyName:"polygon-copy"}),We&&Object(gf.jsx)(PP,{keyName:"polygon-cut"}),((null===Me||void 0===Me?void 0:Me.type)===V.Foundation||(null===Me||void 0===Me?void 0:Me.type)===V.Cuboid)&&Object(gf.jsxs)(HP.a,{title:me.t("polygonMenu.Layout",De),style:{paddingLeft:"24px"},children:[ve&&Object(gf.jsx)(qS,{setDialogVisible:be}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){y(0),be(!0)},style:{paddingLeft:"36px"},children:[me.t("polygonMenu.SolarPanelArrayLayoutParametricDesign",De)," ..."]},"solar-panel-layout"),Object(gf.jsxs)(HP.a,{title:me.t("polygonMenu.SolarPanelArrayLayoutGenerativeDesign",De),style:{paddingLeft:"24px"},children:[Pe&&Object(gf.jsx)(aj,{setDialogVisible:Se}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){y(0),Se(!0)},style:{paddingLeft:"36px"},children:[me.t("optimizationMenu.GeneticAlgorithm",De)," ..."]},"solar-panel-layout-ga"),ze&&Object(gf.jsx)(nj,{setDialogVisible:Re}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){y(0),Re(!0)},style:{paddingLeft:"36px"},children:[me.t("optimizationMenu.ParticleSwarmOptimization",De)," ..."]},"solar-panel-layout-pso")]},"solar-panel-layout-ai")]},"layout"),Object(gf.jsx)(SP,{keyName:"polygon-lock"}),We&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===g||void 0===g?void 0:g.filled),onChange:function(e){if(g){var t={name:"Fill Polygon",timestamp:Date.now(),checked:!g.filled,selectedElementId:g.id,selectedElementType:V.Polygon,undo:function(){Ie(g.id,!t.checked)},redo:function(){Ie(g.id,t.checked)}};h(t),Ie(g.id,e.target.checked)}},children:me.t("polygonMenu.Filled",De)})},"polygon-filled"),We&&g.filled&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:(null!==(c=null===g||void 0===g?void 0:g.shininess)&&void 0!==c?c:0)>0,onChange:function(e){if(g){var t,l={name:"Shiny Polygon",timestamp:Date.now(),checked:(null!==(t=null===g||void 0===g?void 0:g.shininess)&&void 0!==t?t:0)>0,selectedElementId:g.id,selectedElementType:V.Polygon,undo:function(){Oe(g.id,l.checked?0:100)},redo:function(){Oe(g.id,l.checked?100:0)}};h(l),Oe(g.id,e.target.checked?100:0)}},children:me.t("polygonMenu.Shiny",De)})},"polygon-shiny"),We&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===g||void 0===g?void 0:g.noOutline),onChange:function(e){if(g){var t={name:"No Outline for Polygon",timestamp:Date.now(),checked:!g.noOutline,selectedElementId:g.id,selectedElementType:V.Polygon,undo:function(){Ce(g.id,!t.checked)},redo:function(){Ce(g.id,t.checked)}};h(t),Ce(g.id,e.target.checked)}},children:me.t("polygonMenu.NoOutline",De)})},"polygon-no-outline"),We&&Object(gf.jsxs)(gf.Fragment,{children:[K&&Object(gf.jsx)(US,{setDialogVisible:q}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),q(!0)},children:[me.t("polygonMenu.LineColor",De)," ..."]},"polygon-line-color"),_&&Object(gf.jsx)(QS,{setDialogVisible:$}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),$(!0)},children:[me.t("polygonMenu.LineStyle",De)," ..."]},"polygon-line-style"),le&&Object(gf.jsx)(ZS,{setDialogVisible:ae}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ae(!0)},children:[me.t("polygonMenu.LineWidth",De)," ..."]},"polygon-line-width")]}),We&&g.filled&&(!g.textureType||g.textureType===ce.NoTexture)&&Object(gf.jsxs)(gf.Fragment,{children:[re&&Object(gf.jsx)(NS,{setDialogVisible:ne}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ne(!0)},children:[me.t("polygonMenu.FillColor",De)," ..."]},"polygon-fill-color")]}),We&&g.filled&&Object(gf.jsxs)(gf.Fragment,{children:[ue&&Object(gf.jsx)(GS,{setDialogVisible:fe}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),fe(!0)},children:[me.t("polygonMenu.FillTexture",De)," ..."]},"polygon-texture")]}),We&&g.filled&&Object(gf.jsxs)(gf.Fragment,{children:[ye&&Object(gf.jsx)(cj,{setDialogVisible:ge}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ge(!0)},children:[me.t("polygonMenu.Opacity",De)," ..."]},"polygon-opacity")]}),We&&Object(gf.jsx)(HP.a,{title:me.t("polygonMenu.TextBox",De),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:10},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("word.Text",De)+":",value:x,onChange:function(e){return v(e.target.value)},onPressEnter:Ve,onBlur:Ve})},"polygon-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("word.FontSize",De)+":",min:.1,max:5,step:.01,precision:2,value:T,onChange:function(e){return P(e)},onPressEnter:Je,onBlur:Je})},"polygon-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("word.FontColor",De)+":",value:H,onChange:function(e){return z(e.target.value)},onPressEnter:Ge,onBlur:Ge})},"polygon-font-color"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("polygonMenu.FontOutlineColor",De)+":",value:M,onChange:function(e){return W(e.target.value)},onPressEnter:Be,onBlur:Be})},"polygon-font-outline-color"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("polygonMenu.FontOutlineWidth",De)+":",min:0,max:1,step:.01,precision:2,value:O,onChange:function(e){return F(e)},onPressEnter:Xe,onBlur:Xe})},"polygon-font-outline-width"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("polygonMenu.FontStrokeColor",De)+":",value:L,onChange:function(e){return E(e.target.value)},onPressEnter:qe,onBlur:qe})},"polygon-font-stroke-color"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("polygonMenu.FontStrokeWidth",De)+":",min:0,max:1,step:.01,precision:2,value:J,onChange:function(e){return G(e)},onPressEnter:Ke,onBlur:Ke})},"polygon-font-stroke-width")]})},"polygon-text-box")]})})),dj=n.a.memo((function(){var e=Ew(si),t=Ew(Vi),l=OP(V.Polygon),a=Ew(qn),o=Ew(Sr);if(!l||l.selectedIndex<0)return null;var i={lng:t},r=function(t){if(l&&l.selectedIndex>=0){var i=l.vertices.map((function(e){return Object(d.a)({},e)}));switch(t){case Q.Delete:c=l.id,s=l.selectedIndex,e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&a.id===c){a.vertices.splice(s,1);break}}}catch(o){l.e(o)}finally{l.f()}}));break;case Q.InsertBeforeIndex:!function(t,l){e((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===t){var r=i,n=r.vertices.length;if(l>0&&l=0&&l3&&Object(gf.jsx)(Qv.a.Item,{onClick:function(){r(Q.Delete)},children:me.t("polygonMenu.DeleteVertex",i)},"polygon-vertex-delete")]})})),uj=n.a.memo((function(){var e=Ew(Vi),t=OP(V.Sensor),l=zP(t),a=l.labelText,o=l.setLabelText,i=RP(t),r=DP(t,a);if(!t)return null;var n={lng:e};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"sensor-copy"}),Object(gf.jsx)(PP,{keyName:"sensor-cut"}),Object(gf.jsx)(SP,{keyName:"sensor-lock"}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===t||void 0===t?void 0:t.showLabel),onChange:i,children:me.t("labelSubMenu.KeepShowingLabel",n)})},"sensor-show-label"),Object(gf.jsx)(Qv.a,{children:Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",n)+":",value:a,onChange:function(e){return o(e.target.value)},onPressEnter:r,onBlur:r})},"sensor-label-text")})]})})),fj=n.a.memo((function(){var e,t,l,a=Ew(si),o=Ew(Vi),i=Ew(Sr),n=Ew($r),c=Ew(Xc),s=OP(V.Light),d=Object(r.useState)(null!==(e=null===s||void 0===s?void 0:s.intensity)&&void 0!==e?e:3),h=Object(u.a)(d,2),p=h[0],y=h[1],g=Object(r.useState)(null!==(t=null===s||void 0===s?void 0:s.distance)&&void 0!==t?t:5),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useState)(null!==(l=null===s||void 0===s?void 0:s.color)&&void 0!==l?l:"#ffff99"),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useState)(!!(null===s||void 0===s?void 0:s.inside)),S=Object(u.a)(P,2),j=S[0],H=S[1];if(!s)return null;var z={lng:o},R=s.parentId?n(s):void 0,D=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Light&&i.id===e){i.color=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},M=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Light&&i.id===e){i.intensity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},W=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Light&&i.id===e){i.distance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"light-copy"}),Object(gf.jsx)(PP,{keyName:"light-cut"}),Object(gf.jsx)(SP,{keyName:"light-lock"}),R&&(R.type===V.Roof||R.type===V.Wall)&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:j,onChange:function(e){if(s){var t=e.target.checked,l={name:"Inside Light",timestamp:Date.now(),checked:t,undo:function(){c(s.id,!l.checked)},redo:function(){c(s.id,l.checked)}};i(l),c(s.id,t),H(t)}},children:me.t("lightMenu.Inside",z)})},"light-inside"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"80px"},children:[me.t("lightMenu.Intensity",z),":"]}),Object(gf.jsx)($v.a,{min:.1,max:10,step:.1,precision:1,value:p,onChange:function(e){return function(e){if(s&&e&&e!==p){var t={name:"Set Light Intensity",timestamp:Date.now(),oldValue:p,newValue:e,changedElementId:s.id,undo:function(){M(t.changedElementId,t.oldValue)},redo:function(){M(t.changedElementId,t.newValue)}};i(t),M(s.id,e),y(e),a((function(t){t.actionState.lightIntensity=e}))}}(e)}})]},"light-intensity"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"80px"},children:[me.t("lightMenu.MaximumDistance",z),":"]}),Object(gf.jsx)($v.a,{min:1,max:10,step:1,precision:1,value:w,onChange:function(e){return function(e){if(s&&e&&e!==w){var t={name:"Set Light Distance",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:s.id,undo:function(){W(t.changedElementId,t.oldValue)},redo:function(){W(t.changedElementId,t.newValue)}};i(t),W(s.id,e),x(e),a((function(t){t.actionState.lightDistance=e}))}}(e)}})]},"light-distance")]}),Object(gf.jsx)(HP.a,{title:me.t("word.Color",{lng:o}),style:{paddingLeft:"24px"},children:Object(gf.jsx)(YP.a,{color:A,onChangeComplete:function(e){if(s){var t=s.color,l=e.hex,o={name:"Set Light Color",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){D(s.id,o.oldValue)},redo:function(){D(s.id,o.newValue)}};i(o),D(s.id,l),T(l),a((function(e){e.actionState.lightColor=l}))}}})},"light-color")]})})),hj=function(){var e,t,l,a,n,c,s,d,u=Ew(si),f=Ew(Vi),h=Ew(Sr),p=Ew.getState().world,y=Ew(o.axes),g=Ew(o.theme),m=null===(e=Ew(o.showAzimuthAngle))||void 0===e||e,w=null===(t=Ew(o.showElevationAngle))||void 0===t||t,x=null===(l=Ew(o.showZenithAngle))||void 0===l||l,v=null!==(a=Ew(o.directLightIntensity))&&void 0!==a?a:1,b=null!==(n=Ew(o.ambientLightIntensity))&&void 0!==n?n:.1,A=null!==(c=Ew(i.airAttenuationCoefficient))&&void 0!==c?c:.01,T=null!==(s=Ew(i.airConvectiveCoefficient))&&void 0!==s?s:5,P=null!==(d=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==d?d:900,S={lng:f},j=Object(r.useMemo)((function(){return Ty(new Date(p.date),p.latitude)}),[p.date,p.latitude]),H={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},z=function(e){u((function(t){t.viewState.axes=e}))},R=function(e){u((function(t){t.viewState.theme=e}))},D=function(e){u((function(t){t.viewState.showAzimuthAngle=e}))},M=function(e){u((function(t){t.viewState.showElevationAngle=e}))},W=function(e){u((function(t){t.viewState.showZenithAngle=e}))},I=function(e){u((function(t){t.viewState.directLightIntensity=e}))},C=function(e){u((function(t){t.viewState.ambientLightIntensity=e}))},O=function(e){u((function(t){t.world.airAttenuationCoefficient=e}))},F=function(e){u((function(t){t.world.airConvectiveCoefficient=e}))},k=function(e){u((function(t){t.world.highestTemperatureTimeInMinutes=e}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:y,onChange:function(e){var t=e.target.checked,l={name:"Show Axes",timestamp:Date.now(),checked:t,undo:function(){z(!l.checked)},redo:function(){z(l.checked)}};h(l),z(t)},children:me.t("skyMenu.Axes",S)})},"axes"),Object(gf.jsx)(HP.a,{title:me.t("skyMenu.Theme",S),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(tb.a.Group,{value:g,style:{height:"135px"},onChange:function(e){var t=g,l=e.target.value,a={name:"Select Theme",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){R(a.oldValue)},redo:function(){R(a.newValue)}};h(a),R(l)},children:[Object(gf.jsx)(tb.a,{style:H,value:E.Default,children:me.t("skyMenu.ThemeDefault",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Desert,children:me.t("skyMenu.ThemeDesert",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Dune,children:me.t("skyMenu.ThemeDune",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Forest,children:me.t("skyMenu.ThemeForest",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Grassland,children:me.t("skyMenu.ThemeGrassland",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Hill,children:me.t("skyMenu.ThemeHill",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Lake,children:me.t("skyMenu.ThemeLake",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Mountain,children:me.t("skyMenu.ThemeMountain",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Rural,children:me.t("skyMenu.ThemeRural",S)})]})},"theme"),Object(gf.jsx)(HP.a,{title:me.t("skyMenu.SelectSunAnglesToShow",S),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:m,onChange:function(e){var t=m,l=e.target.checked,a={name:"Show Azimuth Angle "+l,timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){D(a.oldValue)},redo:function(){D(a.newValue)}};h(a),D(l)},children:me.t("skyMenu.ShowAzimuthAngle",S)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:w,onChange:function(e){var t=w,l=e.target.checked,a={name:"Show Elevation Angle "+l,timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){M(a.oldValue)},redo:function(){M(a.newValue)}};h(a),M(l)},children:me.t("skyMenu.ShowElevationAngle",S)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:x,onChange:function(e){var t=x,l=e.target.checked,a={name:"Show Zenith Angle "+l,timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){W(a.oldValue)},redo:function(){W(a.newValue)}};h(a),W(l)},children:me.t("skyMenu.ShowZenithAngle",S)})})]})},"sun-angles"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.DirectLightBrightnessAtNoon",S)+" [0.1-5]:"}),Object(gf.jsx)($v.a,{min:.1,max:5,step:.1,precision:2,value:v,onChange:function(e){if(e){var t=v,l=e,a={name:"Set Direct Light Intensity",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){I(a.oldValue)},redo:function(){I(a.newValue)}};h(a),I(l)}}})]},"direct-light-intensity"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.AmbientLightBrightnessAtNoon",S)+" [0.01-1]:"}),Object(gf.jsx)($v.a,{min:.01,max:1,step:.01,precision:2,value:b,onChange:function(e){if(e){var t=b,l=e,a={name:"Set Ambient Light Intensity",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){C(a.oldValue)},redo:function(){C(a.newValue)}};h(a),C(l)}}})]},"ambient-light-intensity"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.SunlightAttenuationCoefficientInAir",S)+":"}),Object(gf.jsx)($v.a,{min:0,max:.1,step:.001,precision:3,value:A,onChange:function(e){if(e){var t=A,l=e,a={name:"Set Sunlight Attenuation Coefficient of Air",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){O(a.oldValue)},redo:function(){O(a.newValue)}};h(a),O(l)}}})]},"air-attenuation-coefficient"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.ConvectiveCoefficientOfAir",S)+" [W/(m\xb2\xd7K)]:"}),Object(gf.jsx)($v.a,{min:2.5,max:20,step:.1,precision:2,value:T,onChange:function(e){if(e){var t=T,l=e,a={name:"Set Convective Coefficient of Air",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){F(a.oldValue)},redo:function(){F(a.newValue)}};h(a),F(l)}}})]},"air-convective-coefficient"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.HighestTemperatureTimeInMinutes",S)+":"}),Object(gf.jsx)($v.a,{min:720,max:j.sunset,step:5,precision:0,value:P,onChange:function(e){if(e){var t=P,l=e,a={name:"Set Time of Highest Temperature in Minutes",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){k(a.oldValue)},redo:function(){k(a.newValue)}};h(a),k(l)}}})]},"highest-temperature-time-in-minutes")]})]})},pj=function e(){Object(He.a)(this,e),this.n=14,this.nominalStrings=new Array(this.n),this.nominalWidths=new Array(this.n),this.nominalHeights=new Array(this.n),this.cellNx=new Array(this.n),this.cellNy=new Array(this.n),this.nominalWidths[0]=.99,this.nominalHeights[0]=1.65,this.cellNx[0]=6,this.cellNy[0]=10,this.nominalWidths[1]=.99,this.nominalHeights[1]=1.96,this.cellNx[1]=6,this.cellNy[1]=12,this.nominalWidths[2]=1.05,this.nominalHeights[2]=1.56,this.cellNx[2]=8,this.cellNy[2]=12,this.nominalWidths[3]=1.31,this.nominalHeights[3]=1.96,this.cellNx[3]=8,this.cellNy[3]=12,this.nominalWidths[4]=1.07,this.nominalHeights[4]=2.07,this.cellNx[4]=8,this.cellNy[4]=16,this.nominalWidths[5]=.6,this.nominalHeights[5]=1.2,this.cellNx[5]=10,this.cellNy[5]=20,this.nominalWidths[6]=1.2,this.nominalHeights[6]=2,this.cellNx[6]=10,this.cellNy[6]=20,this.nominalWidths[7]=1,this.nominalHeights[7]=2.07,this.cellNx[7]=6,this.cellNy[7]=12,this.nominalWidths[8]=.8,this.nominalHeights[8]=1.56,this.cellNx[8]=6,this.cellNy[8]=12,this.nominalWidths[9]=.83,this.nominalHeights[9]=1.58,this.cellNx[9]=6,this.cellNy[9]=12,this.nominalWidths[10]=.99,this.nominalHeights[10]=1.31,this.cellNx[10]=6,this.cellNy[10]=8,this.nominalWidths[11]=.99,this.nominalHeights[11]=1.5,this.cellNx[11]=6,this.cellNy[11]=9,this.nominalWidths[12]=1.05,this.nominalHeights[12]=1.81,this.cellNx[12]=8,this.cellNy[12]=14,this.nominalWidths[13]=1.05,this.nominalHeights[13]=1.69,this.cellNx[13]=8,this.cellNy[13]=13;for(var t=0;t0?" ("+me.t("pvModelPanel.Bifacial",j)+")":"")},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.PanelSize",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(db.a,{disabled:!0,style:{width:"100%"},value:P,onChange:function(e){},children:pj.instance.nominalStrings.map((function(e){return Object(gf.jsx)(gj,{value:e,children:e},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.CellType",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsxs)(db.a,{disabled:!0,style:{width:"100%"},value:H.cellType,onChange:function(e){},children:[Object(gf.jsx)(gj,{value:"Monocrystalline",children:me.t("pvModelPanel.Monocrystalline",j)},"Monocrystalline"),Object(gf.jsx)(gj,{value:"Polycrystalline",children:me.t("pvModelPanel.Polycrystalline",j)},"Polycrystalline"),Object(gf.jsx)(gj,{value:"Thin Film",children:me.t("pvModelPanel.ThinFilm",j)},"Thin Film")]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.BifacialityFactor",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{disabled:!0,style:{width:"100%"},precision:2,value:H.bifacialityFactor,onChange:function(e){}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("word.Color",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsxs)(db.a,{disabled:!0,style:{width:"100%"},value:H.color,onChange:function(e){},children:[Object(gf.jsx)(gj,{value:"Black",children:me.t("pvModelPanel.Black",j)},"Black"),Object(gf.jsx)(gj,{value:"Blue",children:me.t("pvModelPanel.Blue",j)},"Blue")]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.SolarCellEfficiency",j)+" (%):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{disabled:!0,style:{width:"100%"},precision:2,value:100*H.efficiency,onChange:function(e){}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.NominalOperatingCellTemperature",j)+" (\xb0C):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{disabled:!0,style:{width:"100%"},precision:1,value:H.noct,onChange:function(e){}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.TemperatureCoefficientOfPmax",j)+" (%/\xb0C):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(ET.a,{disabled:!0,style:{width:"100%"},value:H.pmaxTC,onChange:function(e){}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:3,children:me.t("word.ApplyTo",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:21,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",j)})]})})})]})]})},wj=db.a.Option,xj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Ei),c=Ew($r),s=Ew(sn),d=Ew(Sr),h=Ew(_n),p=Ew($n),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.SolarPanel),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.orientation)&&void 0!==t?t:$.portrait),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useRef)(!1),P=Object(r.useRef)(),S=$f(),j=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){var r=i,n=l.pvModules[r.pvModelName];l.setSolarPanelOrientation(r,n,t),r.parentType,V.Wall;break}}}catch(c){o.e(c)}finally{o.f()}}))},H=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.foundationId===e&&!i.locked){var r=i,n=l.pvModules[r.pvModelName];l.setSolarPanelOrientation(r,n,t),r.parentType===V.Wall&&!0}}}catch(c){o.e(c)}finally{o.f()}}))},z=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.pvModules[n.pvModelName];a.setSolarPanelOrientation(n,c,l),n.parentType===V.Wall&&!0}}}}catch(s){i.e(s)}finally{i.f()}}))},R=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked){var i=o,r=t.pvModules[i.pvModelName];t.setSolarPanelOrientation(i,r,e),i.parentType===V.Wall&&!0}}}catch(n){a.e(n)}finally{a.f()}}))},D=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id)){var r=i,n=l.pvModules[r.pvModelName];l.setSolarPanelOrientation(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e){if(w){var t=n(w.pvModelName);if(e===$.portrait){var l=Math.max(1,Math.round(w.lx/t.width)),a=Math.max(1,Math.round(w.ly/t.length));s(w.id,l*t.width,a*t.length)}else{var o=Math.max(1,Math.round(w.lx/t.length)),i=Math.max(1,Math.round(w.ly/t.width));s(w.id,o*t.length,i*t.width)}j(w.id,e)}},W=function(e,t){return!function(e,t){var l=c(e);if(l){if(l.type===V.Cuboid&&!Tw.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));a.orientation=t;var o=n(a.pvModelName);if(t===$.portrait){var i=Math.max(1,Math.round(a.lx/o.width)),r=Math.max(1,Math.round(a.ly/o.length));a.lx=i*o.width,a.ly=r*o.length}else{var s=Math.max(1,Math.round(a.lx/o.length)),d=Math.max(1,Math.round(a.ly/o.width));a.lx=s*o.length,a.ly=d*o.width}return l.type===V.Wall?Tw.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Tw.checkElementOnRoofState(a,l)===ye.Valid:Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},I=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.orientation!==e)return!0}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.SolarPanel&&!n.locked&&n.orientation!==e)return!0}}catch(A){r.e(A)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.SolarPanel&&u.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!u.locked&&u.orientation!==e)return!0}}catch(A){d.e(A)}finally{d.f()}break;case _.AllObjectsOfThisTypeOnSurface:var p=c(w);if(p)if(p.type===V.Cuboid){var y,g=Object(f.a)(o);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.SolarPanel&&m.parentId===w.parentId&&Tw.isIdentical(m.normal,w.normal)&&!m.locked&&m.orientation!==e)return!0}}catch(A){g.e(A)}finally{g.f()}}else{var x,v=Object(f.a)(o);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&!b.locked&&b.orientation!==e)return!0}}catch(A){v.e(A)}finally{v.f()}}break;default:if((null===w||void 0===w?void 0:w.orientation)!==e)return!0}return!1}}(e)){switch(P.current=void 0,h){case _.AllSelectedObjectsOfThisType:T.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(r.id)&&W(r,e)){T.current=!0;break}}}catch(pe){l.e(pe)}finally{l.f()}if(T.current)P.current=e,A(w.orientation);else{var n,s=new Map,p=Object(f.a)(o);try{for(p.s();!(n=p.n()).done;){var m=n.value;m.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(m.id)&&s.set(m.id,m.orientation)}}catch(pe){p.e(pe)}finally{p.f()}var x={name:"Set Orientation for Selected Solar Panels",timestamp:Date.now(),oldValues:s,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];j(a,o)}}catch(pe){t.e(pe)}finally{t.f()}},redo:function(){D(x.oldValues,x.newValue)}};d(x),D(s,e),g(y+1)}break;case _.AllObjectsOfThisType:T.current=!1;var v,b=Object(f.a)(o);try{for(b.s();!(v=b.n()).done;){var S=v.value;if(S.type===V.SolarPanel&&W(S,e)){T.current=!0;break}}}catch(pe){b.e(pe)}finally{b.f()}if(T.current)P.current=e,A(w.orientation);else{var I,C=new Map,O=Object(f.a)(o);try{for(O.s();!(I=O.n()).done;){var F=I.value;F.type===V.SolarPanel&&C.set(F.id,F.orientation)}}catch(pe){O.e(pe)}finally{O.f()}var k={name:"Set Orientation for All Solar Panels",timestamp:Date.now(),oldValues:C,newValue:e,undo:function(){var e,t=Object(f.a)(k.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];j(a,o)}}catch(pe){t.e(pe)}finally{t.f()}},redo:function(){R(k.newValue)}};d(k),R(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var Y,L=Object(f.a)(o);try{for(L.s();!(Y=L.n()).done;){var E=Y.value;if(E.type===V.SolarPanel&&E.foundationId===w.foundationId&&W(E,e)){T.current=!0;break}}}catch(pe){L.e(pe)}finally{L.f()}if(T.current)P.current=e,A(w.orientation);else{var U,N=new Map,J=Object(f.a)(o);try{for(J.s();!(U=J.n()).done;){var G=U.value;G.type===V.SolarPanel&&G.foundationId===w.foundationId&&N.set(G.id,G.orientation)}}catch(pe){J.e(pe)}finally{J.f()}var X={name:"Set Orientation for All Solar Panels Above Foundation",timestamp:Date.now(),oldValues:N,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(X.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];j(a,o)}}catch(pe){t.e(pe)}finally{t.f()}},redo:function(){X.groupId&&H(X.groupId,X.newValue)}};d(X),H(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var B=c(w);if(B){if(T.current=!1,B.type===V.Cuboid){var K,q=Object(f.a)(o);try{for(q.s();!(K=q.n()).done;){var Q=K.value;if(Q.type===V.SolarPanel&&Q.parentId===w.parentId&&Tw.isIdentical(Q.normal,w.normal)&&W(Q,e)){T.current=!0;break}}}catch(pe){q.e(pe)}finally{q.f()}}else{var Z,$=Object(f.a)(o);try{for($.s();!(Z=$.n()).done;){var ee=Z.value;if(ee.type===V.SolarPanel&&ee.parentId===w.parentId&&W(ee,e)){T.current=!0;break}}}catch(pe){$.e(pe)}finally{$.f()}}if(T.current)P.current=e,A(w.orientation);else{var te=new Map,le=B.type===V.Cuboid;if(le){var ae,oe=Object(f.a)(o);try{for(oe.s();!(ae=oe.n()).done;){var ie=ae.value;ie.type===V.SolarPanel&&ie.parentId===w.parentId&&Tw.isIdentical(ie.normal,w.normal)&&te.set(ie.id,ie.orientation)}}catch(pe){oe.e(pe)}finally{oe.f()}}else{var re,ne=Object(f.a)(o);try{for(ne.s();!(re=ne.n()).done;){var ce=re.value;ce.type===V.SolarPanel&&ce.parentId===w.parentId&&te.set(ce.id,ce.orientation)}}catch(pe){ne.e(pe)}finally{ne.f()}}var se=le?w.normal:void 0,de={name:"Set Orientation for All Solar Panels on Surface",timestamp:Date.now(),oldValues:te,newValue:e,groupId:w.parentId,normal:se,undo:function(){var e,t=Object(f.a)(de.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];j(a,o)}}catch(pe){t.e(pe)}finally{t.f()}},redo:function(){de.groupId&&z(de.groupId,de.normal,de.newValue)}};d(de),z(w.parentId,se,e),g(y+1)}}break;default:var ue=i(w.id),fe=ue?ue.orientation:w.orientation;if(T.current=W(w,e),T.current)P.current=e,A(fe);else{var he={name:"Set Orientation of Selected Solar Panel",timestamp:Date.now(),oldValue:fe,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){M(he.oldValue)},redo:function(){M(he.newValue)}};d(he),M(e),g(y+1)}}a((function(t){t.actionState.solarPanelOrientation=e}))}},C=function(){w&&(A(w.orientation),T.current=!1,l(!1))},O=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(P.current?" ("+(P.current===$.portrait?me.t("solarPanelMenu.Portrait",S):me.t("solarPanelMenu.Landscape",S))+")":""):"";return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.Orientation",S),rejectedMessage:O,onApply:function(){I(b)},onClose:C,onClickCancel:function(){C(),m()},onClickOk:function(){I(b),T.current||(l(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:b,onChange:function(e){return A(e)},children:[Object(gf.jsx)(wj,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",S)},$.portrait),Object(gf.jsx)(wj,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",S)},$.landscape)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",S)})]})})})]})})},vj=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Ei),s=Ew($r),d=Ew(Sr),h=Ew(_n),p=Ew($n),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.SolarPanel),x=Object(r.useState)((null===w||void 0===w?void 0:w.orientation)===$.portrait?null!==(t=null===w||void 0===w?void 0:w.lx)&&void 0!==t?t:1:null!==(l=null===w||void 0===w?void 0:w.ly)&&void 0!==l?l:2),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(0),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useRef)(!1),z=Object(r.useRef)(),R=$f();Object(r.useEffect)((function(){if(w){var e,t=null!==(e=c(w.pvModelName))&&void 0!==e?e:c("SPR-X21-335-BLK");j(w.orientation===$.portrait?t.width:t.length)}}),[w]);var D=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){var r=i,n=l.getPvModule(r.pvModelName);i.lx=Tw.panelizeLx(r,n,t);break}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.foundationId===e&&!i.locked){var r=i,n=l.getPvModule(r.pvModelName);i.lx=Tw.panelizeLx(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},W=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.getPvModule(n.pvModelName);r.lx=Tw.panelizeLx(n,c,l)}}}}catch(s){i.e(s)}finally{i.f()}}))},I=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked){var i=o,r=t.getPvModule(i.pvModelName);o.lx=Tw.panelizeLx(i,r,e)}}}catch(n){a.e(n)}finally{a.f()}}))},C=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id)){var r=i,n=l.getPvModule(r.pvModelName);i.lx=Tw.panelizeLx(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},O=function(e,t){return!function(e,t){var l=s(e);if(l){if(l.type===V.Cuboid&&!Tw.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.lx=t,l.type===V.Wall?Tw.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Tw.checkElementOnRoofState(a,l)===ye.Valid:Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},F=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(Math.abs(o.lx-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&!c.locked){var d=c;if(Math.abs(d.lx-e)>At)return!0}}}catch(H){n.e(H)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,p=Object(f.a)(i);try{for(p.s();!(u=p.n()).done;){var y=u.value;if(y.type===V.SolarPanel&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.lx-e)>At)return!0}}}catch(H){p.e(H)}finally{p.f()}break;case _.AllObjectsOfThisTypeOnSurface:var m=s(w);if(m)if(m.type===V.Cuboid){var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&Tw.isIdentical(b.normal,w.normal)&&!b.locked){var A=b;if(Math.abs(A.lx-e)>At)return!0}}}catch(H){v.e(H)}finally{v.f()}}else{var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===w.parentId&&!S.locked){var j=S;if(Math.abs(j.lx-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.lx)-e)>At)return!0}return!1}}(e))switch(z.current=void 0,h){case _.AllSelectedObjectsOfThisType:H.current=!1;var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(a.id)&&O(a,e)){H.current=!0;break}}}catch(fe){l.e(fe)}finally{l.f()}if(H.current)z.current=e,A(w.lx);else{var o,r=new Map,c=Object(f.a)(i);try{for(c.s();!(o=c.n()).done;){var p=o.value;p.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(p.id)&&r.set(p.id,p.lx)}}catch(fe){c.e(fe)}finally{c.f()}var m={name:"Set Length for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){C(m.oldValues,m.newValue)}};d(m),C(r,e),g(y+1)}break;case _.AllObjectsOfThisType:H.current=!1;var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(b.id)&&O(b,e)){H.current=!0;break}}}catch(fe){v.e(fe)}finally{v.f()}if(H.current)z.current=e,A(w.lx);else{var T,P=new Map,S=Object(f.a)(i);try{for(S.s();!(T=S.n()).done;){var j=T.value;j.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(j.id)&&P.set(j.id,j.lx)}}catch(fe){S.e(fe)}finally{S.f()}var R={name:"Set Length for All Solar Panel Arrays",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){I(R.newValue)}};d(R),I(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){H.current=!1;var F,k=Object(f.a)(i);try{for(k.s();!(F=k.n()).done;){var Y=F.value;if(Y.type===V.SolarPanel&&Y.foundationId===w.foundationId&&O(Y,e)){H.current=!0;break}}}catch(fe){k.e(fe)}finally{k.f()}if(H.current)z.current=e,A(w.lx);else{var L,E=new Map,U=Object(f.a)(i);try{for(U.s();!(L=U.n()).done;){var N=L.value;N.type===V.SolarPanel&&N.foundationId===w.foundationId&&E.set(N.id,N.lx)}}catch(fe){U.e(fe)}finally{U.f()}var J={name:"Set Length for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:E,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(J.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){J.groupId&&M(J.groupId,J.newValue)}};d(J),M(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var G=s(w);if(G){if(H.current=!1,G.type===V.Cuboid){var X,B=Object(f.a)(i);try{for(B.s();!(X=B.n()).done;){var K=X.value;if(K.type===V.SolarPanel&&K.parentId===w.parentId&&Tw.isIdentical(K.normal,w.normal)&&O(K,e)){H.current=!0;break}}}catch(fe){B.e(fe)}finally{B.f()}}else{var q,Q=Object(f.a)(i);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;if(Z.type===V.SolarPanel&&Z.parentId===w.parentId&&O(Z,e)){H.current=!0;break}}}catch(fe){Q.e(fe)}finally{Q.f()}}if(H.current)z.current=e,A(w.lx);else{var $=new Map,ee=G.type===V.Cuboid;if(ee){var te,le=Object(f.a)(i);try{for(le.s();!(te=le.n()).done;){var ae=te.value;ae.type===V.SolarPanel&&ae.parentId===w.parentId&&Tw.isIdentical(ae.normal,w.normal)&&$.set(ae.id,ae.lx)}}catch(fe){le.e(fe)}finally{le.f()}}else{var oe,ie=Object(f.a)(i);try{for(ie.s();!(oe=ie.n()).done;){var re=oe.value;re.type===V.SolarPanel&&re.parentId===w.parentId&&$.set(re.id,re.lx)}}catch(fe){ie.e(fe)}finally{ie.f()}}var ne=ee?w.normal:void 0,ce={name:"Set Length for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:$,newValue:e,groupId:w.parentId,normal:ne,undo:function(){var e,t=Object(f.a)(ce.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){ce.groupId&&W(ce.groupId,ce.normal,ce.newValue)}};d(ce),W(w.parentId,ne,e),g(y+1)}}break;default:var se=n(w.id),de=se?se.lx:w.lx;if(H.current=O(w,e),H.current)z.current=e,A(de);else{var ue={name:"Set Solar Panel Array Length",timestamp:Date.now(),oldValue:de,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(ue.changedElementId,ue.oldValue)},redo:function(){D(ue.changedElementId,ue.newValue)}};d(ue),D(w.id,e),g(y+1)}}},k=function(){H.current=!1,a(!1)},Y=H.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Length",R),rejectedMessage:Y,onApply:function(){F(b)},onClose:k,onClickCancel:function(){k(),m()},onClickOk:function(){F(b),H.current||(a(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:S,max:100*S,step:S,style:{width:120},precision:2,value:b,onChange:function(e){A(function(e){var t=null!==e&&void 0!==e?e:1;return Math.max(1,Math.ceil((t-S/2)/S))*S}(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[Math.round(b/S)+" "+me.t("solarPanelMenu.PanelsWide",R),Object(gf.jsx)("br",{}),me.t("word.MaximumNumber",R),": 100 ",me.t("solarPanelMenu.Panels",R)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",R)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",R)})]})})})]})})},bj=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Ei),s=Ew($r),d=Ew(Sr),h=Ew(_n),p=Ew($n),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.SolarPanel),x=Object(r.useState)((null===w||void 0===w?void 0:w.orientation)===$.portrait?null!==(t=null===w||void 0===w?void 0:w.ly)&&void 0!==t?t:2:null!==(l=null===w||void 0===w?void 0:w.lx)&&void 0!==l?l:1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(0),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useRef)(!1),z=Object(r.useRef)(),R=$f();Object(r.useEffect)((function(){if(w){var e,t=null!==(e=c(w.pvModelName))&&void 0!==e?e:c("SPR-X21-335-BLK");j(w.orientation===$.portrait?t.length:t.width),A(w.ly)}}),[w]);var D=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){var r=i,n=l.getPvModule(r.pvModelName);i.ly=Tw.panelizeLy(r,n,t);break}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.foundationId===e&&!i.locked){var r=i,n=l.getPvModule(r.pvModelName);i.ly=Tw.panelizeLy(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},W=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.getPvModule(n.pvModelName);r.ly=Tw.panelizeLy(n,c,l)}}}}catch(s){i.e(s)}finally{i.f()}}))},I=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked){var i=o,r=t.getPvModule(i.pvModelName);o.ly=Tw.panelizeLy(i,r,e)}}}catch(n){a.e(n)}finally{a.f()}}))},C=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id)){var r=i,n=l.getPvModule(r.pvModelName);i.ly=Tw.panelizeLy(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},O=function(e,t){return 0!==e.tiltAngle&&.5*t*Math.abs(Math.sin(e.tiltAngle))>e.poleHeight||!function(e,t){var l=s(e);if(l){if(l.type===V.Cuboid&&!Tw.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.ly=t,l.type===V.Wall?Tw.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Tw.checkElementOnRoofState(a,l)===ye.Valid:Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},F=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(Math.abs(o.ly-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&!c.locked){var d=c;if(Math.abs(d.ly-e)>At)return!0}}}catch(H){n.e(H)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,p=Object(f.a)(i);try{for(p.s();!(u=p.n()).done;){var y=u.value;if(y.type===V.SolarPanel&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.ly-e)>At)return!0}}}catch(H){p.e(H)}finally{p.f()}break;case _.AllObjectsOfThisTypeOnSurface:var m=s(w);if(m)if(m.type===V.Cuboid){var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&Tw.isIdentical(b.normal,w.normal)&&!b.locked){var A=b;if(Math.abs(A.ly-e)>At)return!0}}}catch(H){v.e(H)}finally{v.f()}}else{var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===w.parentId&&!S.locked){var j=S;if(Math.abs(j.ly-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(z.current=void 0,h){case _.AllSelectedObjectsOfThisType:H.current=!1;var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(a.id)&&O(a,e)){H.current=!0;break}}}catch(fe){l.e(fe)}finally{l.f()}if(H.current)z.current=e,A(w.ly);else{var o,r=new Map,c=Object(f.a)(i);try{for(c.s();!(o=c.n()).done;){var p=o.value;p.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(p.id)&&r.set(p.id,p.ly)}}catch(fe){c.e(fe)}finally{c.f()}var m={name:"Set Width for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){C(m.oldValues,m.newValue)}};d(m),C(r,e),g(y+1)}break;case _.AllObjectsOfThisType:H.current=!1;var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&O(b,e)){H.current=!0;break}}}catch(fe){v.e(fe)}finally{v.f()}if(H.current)z.current=e,A(w.ly);else{var T,P=new Map,S=Object(f.a)(i);try{for(S.s();!(T=S.n()).done;){var j=T.value;j.type===V.SolarPanel&&P.set(j.id,j.ly)}}catch(fe){S.e(fe)}finally{S.f()}var R={name:"Set Width for All Solar Panel Arrays",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){I(R.newValue)}};d(R),I(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){H.current=!1;var F,k=Object(f.a)(i);try{for(k.s();!(F=k.n()).done;){var Y=F.value;if(Y.type===V.SolarPanel&&Y.foundationId===w.foundationId&&O(Y,e)){H.current=!0;break}}}catch(fe){k.e(fe)}finally{k.f()}if(H.current)z.current=e,A(w.ly);else{var L,E=new Map,U=Object(f.a)(i);try{for(U.s();!(L=U.n()).done;){var N=L.value;N.type===V.SolarPanel&&N.foundationId===w.foundationId&&E.set(N.id,N.ly)}}catch(fe){U.e(fe)}finally{U.f()}var J={name:"Set Width for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:E,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(J.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){J.groupId&&M(J.groupId,J.newValue)}};d(J),M(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var G=s(w);if(G){if(H.current=!1,G.type===V.Cuboid){var X,B=Object(f.a)(i);try{for(B.s();!(X=B.n()).done;){var K=X.value;if(K.type===V.SolarPanel&&K.parentId===w.parentId&&Tw.isIdentical(K.normal,w.normal)&&O(K,e)){H.current=!0;break}}}catch(fe){B.e(fe)}finally{B.f()}}else{var q,Q=Object(f.a)(i);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;if(Z.type===V.SolarPanel&&Z.parentId===w.parentId&&O(Z,e)){H.current=!0;break}}}catch(fe){Q.e(fe)}finally{Q.f()}}if(H.current)z.current=e,A(w.ly);else{var $=new Map,ee=G.type===V.Cuboid;if(ee){var te,le=Object(f.a)(i);try{for(le.s();!(te=le.n()).done;){var ae=te.value;ae.type===V.SolarPanel&&ae.parentId===w.parentId&&Tw.isIdentical(ae.normal,w.normal)&&$.set(ae.id,ae.ly)}}catch(fe){le.e(fe)}finally{le.f()}}else{var oe,ie=Object(f.a)(i);try{for(ie.s();!(oe=ie.n()).done;){var re=oe.value;re.type===V.SolarPanel&&re.parentId===w.parentId&&$.set(re.id,re.ly)}}catch(fe){ie.e(fe)}finally{ie.f()}}var ne=ee?w.normal:void 0,ce={name:"Set Width for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:$,newValue:e,groupId:w.parentId,normal:ne,undo:function(){var e,t=Object(f.a)(ce.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){ce.groupId&&W(ce.groupId,ce.normal,ce.newValue)}};d(ce),W(w.parentId,ne,e),g(y+1)}}break;default:var se=n(w.id),de=se?se.ly:w.ly;if(H.current=O(w,e),H.current)z.current=e,A(de);else{var ue={name:"Set Solar Panel Array Width",timestamp:Date.now(),oldValue:de,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(ue.changedElementId,ue.oldValue)},redo:function(){D(ue.changedElementId,ue.newValue)}};d(ue),D(w.id,e),g(y+1)}}},k=function(){H.current=!1,a(!1)},Y=H.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Width",R),rejectedMessage:Y,onApply:function(){F(b)},onClose:k,onClickCancel:function(){k(),m()},onClickOk:function(){F(b),H.current||(a(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:S,max:100*S,step:S,style:{width:120},precision:2,value:b,onChange:function(e){A(function(e){var t=null!==e&&void 0!==e?e:1;return Math.max(1,Math.ceil((t-S/2)/S))*S}(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[Math.round(b/S)+" "+me.t("solarPanelMenu.PanelsLong",R),Object(gf.jsx)("br",{}),me.t("word.MaximumNumber",R),": 100 ",me.t("solarPanelMenu.Panels",R)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",R)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",R)})]})})})]})})},Aj=function(e){var t,l=e.setDialogVisible,a=e.isOnWall,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(lc),s=Ew($r),d=Ew(Sr),h=Ew(_n),p=Ew($n),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.SolarPanel),x=null!==(t=null===w||void 0===w?void 0:w.tiltAngle)&&void 0!==t?t:0,v=Object(r.useState)(a?-x:x),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&r.foundationId===e&&!r.locked){var n=r;n.parentType===V.Wall?n.tiltAngle=Math.min(0,l?-t:t):n.tiltAngle=t}}}catch(c){i.e(c)}finally{i.f()}}))},z=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)r.tiltAngle=l}}}catch(n){i.e(n)}finally{i.f()}}))},R=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked){var r=i;r.parentType===V.Wall?r.tiltAngle=Math.min(0,t?-e:e):r.tiltAngle=e}}}catch(n){o.e(n)}finally{o.f()}}))},D=function(e,t,l){Ew.getState().set((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked&&e.has(r.id)){var n=r;n.parentType===V.Wall?n.tiltAngle=Math.min(0,l?-t:t):n.tiltAngle=t}}}catch(c){i.e(c)}finally{i.f()}}))},M=function(e){if(a&&(e=-e),w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(Math.abs(o.tiltAngle-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&!c.locked){var d=c;if(Math.abs(d.tiltAngle-e)>At)return!0}}}catch(H){n.e(H)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,p=Object(f.a)(i);try{for(p.s();!(u=p.n()).done;){var y=u.value;if(y.type===V.SolarPanel&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.tiltAngle-e)>At)return!0}}}catch(H){p.e(H)}finally{p.f()}break;case _.AllObjectsOfThisTypeOnSurface:var m=s(w);if(m)if(m.type===V.Cuboid){var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&Tw.isIdentical(b.normal,w.normal)&&!b.locked){var A=b;if(Math.abs(A.tiltAngle-e)>At)return!0}}}catch(H){v.e(H)}finally{v.f()}}else{var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===w.parentId&&!S.locked){var j=S;if(Math.abs(j.tiltAngle-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.tiltAngle)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,h){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&r.parentType!==V.Wall&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*r.ly*Math.abs(Math.sin(e))>r.poleHeight){P.current=!0;break}}}catch(he){l.e(he)}finally{l.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var p,m=new Map,x=Object(f.a)(i);try{for(x.s();!(p=x.n()).done;){var v=p.value;v.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(v.id)&&m.set(v.id,v.tiltAngle)}}catch(he){x.e(he)}finally{x.f()}var b={name:"Set Tilt Angle for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){D(b.oldValues,b.newValue,!a)}};d(b),D(m,e,!a),g(y+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(i);try{for(j.s();!(A=j.n()).done;){var M=A.value;if(M.type===V.SolarPanel&&M.parentType!==V.Wall&&.5*M.ly*Math.abs(Math.sin(e))>M.poleHeight){P.current=!0;break}}}catch(he){j.e(he)}finally{j.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var W,I=new Map,C=Object(f.a)(i);try{for(C.s();!(W=C.n()).done;){var O=W.value;O.type===V.SolarPanel&&I.set(O.id,O.tiltAngle)}}catch(he){C.e(he)}finally{C.f()}var F={name:"Set Tilt Angle for All Solar Panel Arrays",timestamp:Date.now(),oldValues:I,newValue:e,undo:function(){var e,t=Object(f.a)(F.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){R(F.newValue,!a)}};d(F),R(e,!a),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){P.current=!1;var k,Y=Object(f.a)(i);try{for(Y.s();!(k=Y.n()).done;){var L=k.value;if(L.type===V.SolarPanel&&L.foundationId===w.foundationId&&L.parentType!==V.Wall&&.5*L.ly*Math.abs(Math.sin(e))>L.poleHeight){P.current=!0;break}}}catch(he){Y.e(he)}finally{Y.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var E,U=new Map,N=Object(f.a)(i);try{for(N.s();!(E=N.n()).done;){var J=E.value;J.type===V.SolarPanel&&J.foundationId===w.foundationId&&U.set(J.id,J.tiltAngle)}}catch(he){N.e(he)}finally{N.f()}var G={name:"Set Tilt Angle for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:U,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(G.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(he){t.e(he)}finally{t.f()}G.oldValues.size%2===0&&Ew.getState().set((function(e){}))},redo:function(){G.groupId&&H(G.groupId,G.newValue,!a)}};d(G),H(w.foundationId,e,!a),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var X=s(w);if(X){P.current=!1;var B=X.type===V.Cuboid;if(B){var K,q=Object(f.a)(i);try{for(q.s();!(K=q.n()).done;){var Q=K.value;if(Q.type===V.SolarPanel&&Q.parentId===w.parentId&&Tw.isIdentical(Q.normal,w.normal)&&.5*Q.ly*Math.abs(Math.sin(e))>Q.poleHeight){P.current=!0;break}}}catch(he){q.e(he)}finally{q.f()}}else if(w.parentType===V.Wall)P.current=!1;else{var Z,$=Object(f.a)(i);try{for($.s();!(Z=$.n()).done;){var ee=Z.value;if(ee.type===V.SolarPanel&&ee.parentId===w.parentId&&.5*ee.ly*Math.abs(Math.sin(e))>ee.poleHeight){P.current=!0;break}}}catch(he){$.e(he)}finally{$.f()}}if(P.current)S.current=e,T(w.tiltAngle);else{var te=new Map;if(B){var le,ae=Object(f.a)(i);try{for(ae.s();!(le=ae.n()).done;){var oe=le.value;oe.type===V.SolarPanel&&oe.parentId===w.parentId&&Tw.isIdentical(oe.normal,w.normal)&&te.set(oe.id,oe.tiltAngle)}}catch(he){ae.e(he)}finally{ae.f()}}else{var ie,re=Object(f.a)(i);try{for(re.s();!(ie=re.n()).done;){var ne=ie.value;ne.type===V.SolarPanel&&ne.parentId===w.parentId&&te.set(ne.id,ne.tiltAngle)}}catch(he){re.e(he)}finally{re.f()}}var ce=B?w.normal:void 0,se={name:"Set Tilt Angle for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:te,newValue:e,groupId:w.parentId,normal:ce,undo:function(){var e,t=Object(f.a)(se.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(he){t.e(he)}finally{t.f()}se.oldValues.size%2===0&&Ew.getState().set((function(e){}))},redo:function(){se.groupId&&z(se.groupId,se.normal,se.newValue)}};d(se),z(w.parentId,ce,e),g(y+1)}}break;default:var de=n(w.id),ue=de?de.tiltAngle:w.tiltAngle;if(P.current=.5*w.ly*Math.abs(Math.sin(e))>w.poleHeight,w.parentType===V.Wall&&(P.current=!1),P.current)S.current=e,T(ue);else{var fe={name:"Set Solar Panel Array Tilt Angle",timestamp:Date.now(),oldValue:ue,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){c(fe.changedElementId,fe.oldValue)},redo:function(){c(fe.changedElementId,fe.newValue)}};d(fe),c(w.id,e),g(y+1)}}o((function(t){t.actionState.solarPanelTiltAngle=e}))}},W=function(){P.current=!1,l(!1)},I=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+Tw.toDegrees(S.current).toFixed(1)+"\xb0)":null):null;return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.TiltAngle",j),rejectedMessage:I,onApply:function(){M(A)},onClose:W,onClickCancel:function(){W(),m()},onClickOk:function(){M(A),P.current||(l(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:a?0:-90,max:90,style:{width:120},precision:2,value:parseFloat(Tw.toDegrees(A).toFixed(2)),step:1,formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){T(Tw.toRadians(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [",a?"0\xb0":"-90\xb0",", 90\xb0]",Object(gf.jsx)("br",{}),me.t("solarPanelMenu.SouthFacingIsPositive",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:18,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",j)})]})})})]})})},Tj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(rc),c=Ew(nc),s=Ew(cc),d=Ew(sc),h=Ew($r),p=Ew(Sr),y=Ew(_n),g=Ew($n),m=Ew(Ii),w=Ew(Ci),x=Ew(Oi),v=OP(V.SolarPanel),b=Object(r.useRef)(!1),A=Object(r.useRef)(),T=Object(r.useState)(v&&null!==(t=-v.relativeAzimuth)&&void 0!==t?t:0),P=Object(u.a)(T,2),S=P[0],j=P[1],H=$f(),z=function(e,t){return!function(e,t){var l=h(e);if(l){if(l.type===V.Cuboid&&!Tw.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.relativeAzimuth=-t,l.type===V.Roof?Tw.checkElementOnRoofState(a,l)===ye.Valid:Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},R=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id))i.relativeAzimuth=t}}catch(r){o.e(r)}finally{o.f()}}))},D=function(e){if(v&&function(e){if(v){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&a.parentType!==V.Wall&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(-i.relativeAzimuth-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&!c.locked&&c.parentType!==V.Wall){var s=c;if(Math.abs(-s.relativeAzimuth-e)>At)return!0}}}catch(H){n.e(H)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.SolarPanel&&p.foundationId===(null===v||void 0===v?void 0:v.foundationId)&&!p.locked&&p.parentType!==V.Wall){var g=p;if(Math.abs(-g.relativeAzimuth-e)>At)return!0}}}catch(H){u.e(H)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(null===v||void 0===v?void 0:v.parentId){var m=h(v);if(m)if(m.type===V.Cuboid){var w,x=Object(f.a)(o);try{for(x.s();!(w=x.n()).done;){var b=w.value;if(b.type===V.SolarPanel&&b.parentId===v.parentId&&Tw.isIdentical(b.normal,v.normal)&&!b.locked){var A=b;if(Math.abs(-A.relativeAzimuth-e)>At)return!0}}}catch(H){x.e(H)}finally{x.f()}}else{var T,P=Object(f.a)(o);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===v.parentId&&!S.locked){var j=S;if(Math.abs(-j.relativeAzimuth-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}}break;default:if(Math.abs(-(null===v||void 0===v?void 0:v.relativeAzimuth)-e)>At)return!0}return!1}}(e)){switch(A.current=void 0,y){case _.AllSelectedObjectsOfThisType:b.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&r.parentType!==V.Wall&&Ew.getState().selectedElementIdSet.has(r.id)&&z(r,e)){b.current=!0;break}}}catch(he){l.e(he)}finally{l.f()}if(b.current)A.current=e,j(-v.relativeAzimuth);else{var g,x=new Map,T=Object(f.a)(o);try{for(T.s();!(g=T.n()).done;){var P=g.value;P.type===V.SolarPanel&&P.parentType!==V.Wall&&Ew.getState().selectedElementIdSet.has(P.id)&&x.set(P.id,-P.relativeAzimuth)}}catch(he){T.e(he)}finally{T.f()}var S={name:"Set Relative Azimuth for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,-o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){R(S.oldValues,S.newValue)}};p(S),R(x,-e),w(m+1)}break;case _.AllObjectsOfThisType:b.current=!1;var H,D=Object(f.a)(o);try{for(D.s();!(H=D.n()).done;){var M=H.value;if(M.type===V.SolarPanel&&M.parentType!==V.Wall&&z(M,e)){b.current=!0;break}}}catch(he){D.e(he)}finally{D.f()}if(b.current)A.current=e,j(-v.relativeAzimuth);else{var W,I=new Map,C=Object(f.a)(o);try{for(C.s();!(W=C.n()).done;){var O=W.value;O.type===V.SolarPanel&&O.parentType!==V.Wall&&I.set(O.id,-O.relativeAzimuth)}}catch(he){C.e(he)}finally{C.f()}var F={name:"Set Relative Azimuth for All Solar Panel Arrays",timestamp:Date.now(),oldValues:I,newValue:e,undo:function(){var e,t=Object(f.a)(F.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,-o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){d(V.SolarPanel,-F.newValue)}};p(F),d(V.SolarPanel,-e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){b.current=!1;var k,Y=Object(f.a)(o);try{for(Y.s();!(k=Y.n()).done;){var L=k.value;if(L.type===V.SolarPanel&&L.foundationId===v.foundationId&&L.parentType!==V.Wall&&z(L,e)){b.current=!0;break}}}catch(he){Y.e(he)}finally{Y.f()}if(b.current)A.current=e,j(-v.relativeAzimuth);else{var E,U=new Map,N=Object(f.a)(o);try{for(N.s();!(E=N.n()).done;){var J=E.value;J.type===V.SolarPanel&&J.foundationId===v.foundationId&&J.parentType!==V.Wall&&U.set(J.id,-J.relativeAzimuth)}}catch(he){N.e(he)}finally{N.f()}var G={name:"Set Relative Azimuth for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:U,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(f.a)(G.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,-o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){G.groupId&&s(V.SolarPanel,G.groupId,-G.newValue)}};p(G),s(V.SolarPanel,v.foundationId,-e),w(m+1)}}break;case _.AllObjectsOfThisTypeOnSurface:if(v.parentId){var X=h(v);if(X){if(b.current=!1,X.type===V.Cuboid){var B,K=Object(f.a)(o);try{for(K.s();!(B=K.n()).done;){var q=B.value;if(q.type===V.SolarPanel&&q.parentId===v.parentId&&Tw.isIdentical(q.normal,v.normal)&&z(q,e)){b.current=!0;break}}}catch(he){K.e(he)}finally{K.f()}}else{var Q,Z=Object(f.a)(o);try{for(Z.s();!(Q=Z.n()).done;){var $=Q.value;if($.type===V.SolarPanel&&$.parentId===v.parentId&&z($,e)){b.current=!0;break}}}catch(he){Z.e(he)}finally{Z.f()}}if(b.current)A.current=e,j(-v.relativeAzimuth);else{var ee=new Map,te=X.type===V.Cuboid;if(te){var le,ae=Object(f.a)(o);try{for(ae.s();!(le=ae.n()).done;){var oe=le.value;oe.type===V.SolarPanel&&oe.parentId===v.parentId&&Tw.isIdentical(oe.normal,v.normal)&&ee.set(oe.id,-oe.relativeAzimuth)}}catch(he){ae.e(he)}finally{ae.f()}}else{var ie,re=Object(f.a)(o);try{for(re.s();!(ie=re.n()).done;){var ne=ie.value;ne.type===V.SolarPanel&&ne.parentId===v.parentId&&ee.set(ne.id,-ne.relativeAzimuth)}}catch(he){re.e(he)}finally{re.f()}}var ce=te?v.normal:void 0,se={name:"Set Relative Azimuth for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:ee,newValue:e,groupId:v.parentId,normal:ce,undo:function(){var e,t=Object(f.a)(se.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,-o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){se.groupId&&c(V.SolarPanel,se.groupId,se.normal,-se.newValue)}};p(se),c(V.SolarPanel,v.parentId,ce,-e),w(m+1)}}}break;default:var de=i(v.id),ue=de?-de.relativeAzimuth:-v.relativeAzimuth;if(b.current=z(v,e),b.current)A.current=e,j(ue);else{var fe={name:"Set Solar Panel Array Relative Azimuth",timestamp:Date.now(),oldValue:ue,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){n(fe.changedElementId,-fe.oldValue)},redo:function(){n(fe.changedElementId,-fe.newValue)}};p(fe),n(v.id,-e),w(m+1)}}a((function(t){t.actionState.solarPanelRelativeAzimuth=-e}))}},M=function(){b.current=!1,l(!1)},W=b.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==A.current?" ("+Tw.toDegrees(A.current).toFixed(1)+"\xb0)":null):null;return Object(gf.jsx)(kP,{width:550,title:me.t("solarCollectorMenu.RelativeAzimuth",H),rejectedMessage:W,onApply:function(){D(S)},onClose:M,onClickCancel:function(){M(),x()},onClickOk:function(){D(S),b.current||(l(!1),w(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:-180,max:180,style:{width:120},precision:2,step:1,value:parseFloat(Tw.toDegrees(S).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){j(Tw.toRadians(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [-180\xb0, 180\xb0]",Object(gf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",H),Object(gf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",H)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:18,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",H)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",H)})]})})})]})})},Pj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(_n),d=Ew($n),h=Ew(Ii),p=Ew(Ci),y=OP(V.SolarPanel),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.trackerType)&&void 0!==t?t:te.NO_TRACKER),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=db.a.Option,A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.trackerType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.SolarPanel||i.foundationId!==e||i.locked||(i.trackerType=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)&&(r.trackerType=l)}}}catch(n){i.e(n)}finally{i.f()}}))},S=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.SolarPanel||o.locked||(o.trackerType=e)}}catch(i){a.e(i)}finally{a.f()}}))},j=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.SolarPanel&&!i.locked&&e.has(i.id)&&(i.trackerType=t)}}catch(r){o.e(r)}finally{o.f()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.trackerType!==e)return!0}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.SolarPanel&&!c.locked&&c.trackerType!==e)return!0}}catch(A){r.e(A)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.SolarPanel&&h.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!h.locked&&h.trackerType!==e)return!0}}catch(A){u.e(A)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:var p=n(y);if(p)if(p.type===V.Cuboid){var g,m=Object(f.a)(o);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.type===V.SolarPanel&&w.parentId===y.parentId&&Tw.isIdentical(w.normal,y.normal)&&!w.locked&&w.trackerType!==e)return!0}}catch(A){m.e(A)}finally{m.f()}}else{var x,v=Object(f.a)(o);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===y.parentId&&!b.locked&&b.trackerType!==e)return!0}}catch(A){v.e(A)}finally{v.f()}}break;default:if((null===y||void 0===y?void 0:y.trackerType)!==e)return!0}return!1}}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r=t.value;r.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(r.id)&&l.set(r.id,r.trackerType)}}catch(X){a.e(X)}finally{a.f()}var d={name:"Set Tracker Type for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(d.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){j(d.oldValues,d.newValue)}};c(d),j(l,e),p(h+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.SolarPanel&&m.set(x.id,x.trackerType)}}catch(X){w.e(X)}finally{w.f()}var v={name:"Set Tracker Type for All Solar Panel Arrays",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){S(v.newValue)}};c(v),S(e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var b,H=new Map,z=Object(f.a)(o);try{for(z.s();!(b=z.n()).done;){var R=b.value;R.type===V.SolarPanel&&R.foundationId===y.foundationId&&H.set(R.id,R.trackerType)}}catch(X){z.e(X)}finally{z.f()}var D={name:"Set Tracker Type for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:H,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){D.groupId&&T(D.groupId,D.newValue)}};c(D),T(y.foundationId,e),p(h+1)}break;case _.AllObjectsOfThisTypeOnSurface:var M=n(y);if(M){var W=new Map,I=M.type===V.Cuboid;if(I){var C,O=Object(f.a)(o);try{for(O.s();!(C=O.n()).done;){var F=C.value;F.type===V.SolarPanel&&F.parentId===y.parentId&&Tw.isIdentical(F.normal,y.normal)&&W.set(F.id,F.trackerType)}}catch(X){O.e(X)}finally{O.f()}}else{var k,Y=Object(f.a)(o);try{for(Y.s();!(k=Y.n()).done;){var L=k.value;L.type===V.SolarPanel&&L.parentId===y.parentId&&W.set(L.id,L.trackerType)}}catch(X){Y.e(X)}finally{Y.f()}}var E=I?y.normal:void 0,U={name:"Set Tracker Type for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:W,newValue:e,groupId:y.parentId,normal:E,undo:function(){var e,t=Object(f.a)(U.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){U.groupId&&P(U.groupId,U.normal,U.newValue)}};c(U),P(y.parentId,E,e),p(h+1)}break;default:var N=i(y.id),J=N?N.trackerType:y.trackerType,G={name:"Set Solar Panel Array Tracker Type",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(G.changedElementId,G.oldValue)},redo:function(){A(G.changedElementId,G.newValue)}};c(G),A(y.id,e),p(h+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.Tracker",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsxs)(db.a,{style:{width:"120px"},value:w,onChange:function(e){return x(e)},children:[Object(gf.jsx)(b,{value:te.NO_TRACKER,title:me.t("solarPanelMenu.NoTracker",v),children:me.t("word.None",v)},"NONE"),Object(gf.jsx)(b,{value:te.HORIZONTAL_SINGLE_AXIS_TRACKER,title:me.t("solarPanelMenu.HorizontalSingleAxisTracker",v),children:"HSAT"},"HSAT"),Object(gf.jsx)(b,{value:te.VERTICAL_SINGLE_AXIS_TRACKER,title:me.t("solarPanelMenu.VerticalSingleAxisTracker",v),children:"VSAT"},"VSAT"),Object(gf.jsx)(b,{value:te.ALTAZIMUTH_DUAL_AXIS_TRACKER,title:me.t("solarPanelMenu.AltazimuthDualAxisTracker",v),children:"AADAT"},"AADAT")]}),Object(gf.jsx)("div",{style:{paddingTop:"20px",paddingRight:"10px",textAlign:"left",fontSize:"11px"},children:me.t("solarPanelMenu.SolarTrackerFollowsSun",v)})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},Sj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(dc),c=Ew(uc),s=Ew(fc),d=Ew(hc),h=Ew($r),p=Ew(Sr),y=Ew(_n),g=Ew($n),m=Ew(Ii),w=Ew(Ci),x=Ew(Oi),v=OP(V.SolarPanel),b=Object(r.useState)(null!==(t=null===v||void 0===v?void 0:v.poleHeight)&&void 0!==t?t:0),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useRef)(!1),j=Object(r.useRef)(),H=$f(),z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id))i.poleHeight=t}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&c.foundationId===(null===v||void 0===v?void 0:v.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var d=h(v);if(d)if(d.type===V.Cuboid){var u,p=Object(f.a)(o);try{for(p.s();!(u=p.n()).done;){var g=u.value;if(g.type===V.SolarPanel&&g.parentId===v.parentId&&Tw.isIdentical(g.normal,v.normal)&&!g.locked){var m=g;if(Math.abs(m.poleHeight-e)>At)return!0}}}catch(T){p.e(T)}finally{p.f()}}else{var w,x=Object(f.a)(o);try{for(x.s();!(w=x.n()).done;){var b=w.value;if(b.type===V.SolarPanel&&b.parentId===v.parentId&&!b.locked){var A=b;if(Math.abs(A.poleHeight-e)>At)return!0}}}catch(T){x.e(T)}finally{x.f()}}break;default:if(Math.abs((null===v||void 0===v?void 0:v.poleHeight)-e)>At)return!0}return!1}}(e)){switch(j.current=void 0,y){case _.AllSelectedObjectsOfThisType:S.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){S.current=!0;break}}}catch(fe){l.e(fe)}finally{l.f()}if(S.current)j.current=e,P(v.poleHeight);else{var g,x=new Map,b=Object(f.a)(o);try{for(b.s();!(g=b.n()).done;){var A=g.value;A.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(A.id)&&x.set(A.id,A.poleHeight)}}catch(fe){b.e(fe)}finally{b.f()}var T={name:"Set Pole Height for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){z(T.oldValues,T.newValue)}};p(T),z(x,e),w(m+1)}break;case _.AllObjectsOfThisType:S.current=!1;var H,R=Object(f.a)(o);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.SolarPanel&&.5*D.ly*Math.abs(Math.sin(D.tiltAngle))>e){S.current=!0;break}}}catch(fe){R.e(fe)}finally{R.f()}if(S.current)j.current=e,P(v.poleHeight);else{var M,W=new Map,I=Object(f.a)(o);try{for(I.s();!(M=I.n()).done;){var C=M.value;C.type===V.SolarPanel&&W.set(C.id,C.poleHeight)}}catch(fe){I.e(fe)}finally{I.f()}var O={name:"Set Pole Height for All Solar Panel Arrays",timestamp:Date.now(),oldValues:W,newValue:e,undo:function(){var e,t=Object(f.a)(O.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){d(V.SolarPanel,O.newValue)}};p(O),d(V.SolarPanel,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){S.current=!1;var F,k=Object(f.a)(o);try{for(k.s();!(F=k.n()).done;){var Y=F.value;if(Y.type===V.SolarPanel&&Y.foundationId===v.foundationId&&.5*Y.ly*Math.abs(Math.sin(Y.tiltAngle))>e){S.current=!0;break}}}catch(fe){k.e(fe)}finally{k.f()}if(S.current)j.current=e,P(v.poleHeight);else{var L,E=new Map,U=Object(f.a)(o);try{for(U.s();!(L=U.n()).done;){var N=L.value;N.type===V.SolarPanel&&N.foundationId===v.foundationId&&E.set(N.id,N.poleHeight)}}catch(fe){U.e(fe)}finally{U.f()}var J={name:"Set Pole Height for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:E,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(f.a)(J.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){J.groupId&&s(V.SolarPanel,J.groupId,J.newValue)}};p(J),s(V.SolarPanel,v.foundationId,e),w(m+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var G=h(v);if(G){if(S.current=!1,G.type===V.Cuboid){var X,B=Object(f.a)(o);try{for(B.s();!(X=B.n()).done;){var K=X.value;if(K.type===V.SolarPanel&&K.parentId===v.parentId&&Tw.isIdentical(K.normal,v.normal)&&.5*K.ly*Math.abs(Math.sin(K.tiltAngle))>e){S.current=!0;break}}}catch(fe){B.e(fe)}finally{B.f()}}else{var q,Q=Object(f.a)(o);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;if(Z.type===V.SolarPanel&&Z.parentId===v.parentId&&.5*Z.ly*Math.abs(Math.sin(Z.tiltAngle))>e){S.current=!0;break}}}catch(fe){Q.e(fe)}finally{Q.f()}}if(S.current)j.current=e,P(v.poleHeight);else{var $=new Map,ee=G.type===V.Cuboid;if(ee){var te,le=Object(f.a)(o);try{for(le.s();!(te=le.n()).done;){var ae=te.value;ae.type===V.SolarPanel&&ae.parentId===v.parentId&&Tw.isIdentical(ae.normal,v.normal)&&$.set(ae.id,ae.poleHeight)}}catch(fe){le.e(fe)}finally{le.f()}}else{var oe,ie=Object(f.a)(o);try{for(ie.s();!(oe=ie.n()).done;){var re=oe.value;re.type===V.SolarPanel&&re.parentId===v.parentId&&$.set(re.id,re.poleHeight)}}catch(fe){ie.e(fe)}finally{ie.f()}}var ne=ee?v.normal:void 0,ce={name:"Set Pole Height for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:$,newValue:e,groupId:v.parentId,normal:ne,undo:function(){var e,t=Object(f.a)(ce.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){ce.groupId&&c(V.SolarPanel,ce.groupId,ce.normal,ce.newValue)}};p(ce),c(V.SolarPanel,v.parentId,ne,e),w(m+1)}}break;default:var se=i(v.id),de=se?se.poleHeight:v.poleHeight;if(S.current=.5*v.ly*Math.abs(Math.sin(v.tiltAngle))>e,S.current)j.current=e,P(de);else{var ue={name:"Set Solar Panel Array Pole Height",timestamp:Date.now(),oldValue:de,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){n(ue.changedElementId,ue.oldValue)},redo:function(){n(ue.changedElementId,ue.newValue)}};p(ue),n(v.id,e),w(m+1)}}a((function(t){t.actionState.solarPanelPoleHeight=e}))}},D=function(){S.current=!1,l(!1)},M=S.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==j.current?" ("+j.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("solarCollectorMenu.PoleHeight",H),rejectedMessage:M,onApply:function(){R(T)},onClose:D,onClickCancel:function(){D(),x()},onClickOk:function(){R(T),S.current||(l(!1),w(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:10,style:{width:120},step:.1,precision:2,value:T,onChange:P}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [0, 10] ",me.t("word.MeterAbbreviation",H)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",H)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",H)})]})})})]})})},jj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(_n),d=Ew($n),h=Ew(Ii),p=Ew(Ci),y=OP(V.SolarPanel),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.poleSpacing)&&void 0!==t?t:0),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.poleSpacing=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.foundationId===e&&!i.locked)i.poleSpacing=t}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)r.poleSpacing=l}}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked)o.poleSpacing=e}}catch(i){a.e(i)}finally{a.f()}}))},S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id))i.poleSpacing=t}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){if(y&&function(e){if(y){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleSpacing-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,c=Object(f.a)(o);try{for(c.s();!(r=c.n()).done;){var d=r.value;if(d.type===V.SolarPanel&&!d.locked){var u=d;if(Math.abs(u.poleSpacing-e)>At)return!0}}}catch(H){c.e(H)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var h,p=Object(f.a)(o);try{for(p.s();!(h=p.n()).done;){var g=h.value;if(g.type===V.SolarPanel&&g.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!g.locked){var m=g;if(Math.abs(m.poleSpacing-e)>At)return!0}}}catch(H){p.e(H)}finally{p.f()}break;case _.AllObjectsOfThisTypeOnSurface:var w=n(y);if(w)if(w.type===V.Cuboid){var x,v=Object(f.a)(o);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===y.parentId&&Tw.isIdentical(b.normal,y.normal)&&!b.locked){var A=b;if(Math.abs(A.poleSpacing-e)>At)return!0}}}catch(H){v.e(H)}finally{v.f()}}else{var T,P=Object(f.a)(o);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===y.parentId&&!S.locked){var j=S;if(Math.abs(j.poleSpacing-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}break;default:if(Math.abs((null===y||void 0===y?void 0:y.poleSpacing)-e)>At)return!0}return!1}}(e)){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var d=t.value;d.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(d.id)&&l.set(d.id,d.poleSpacing)}}catch(B){r.e(B)}finally{r.f()}var g={name:"Set Pole Spacing for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){S(g.oldValues,g.newValue)}};c(g),S(l,e),p(h+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v=m.value;v.type===V.SolarPanel&&w.set(v.id,v.poleSpacing)}}catch(B){x.e(B)}finally{x.f()}var j={name:"Set Pole Spacing for All Solar Panel Arrays",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){P(j.newValue)}};c(j),P(e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var H,z=new Map,R=Object(f.a)(o);try{for(R.s();!(H=R.n()).done;){var D=H.value;D.type===V.SolarPanel&&D.foundationId===y.foundationId&&z.set(D.id,D.poleSpacing)}}catch(B){R.e(B)}finally{R.f()}var M={name:"Set Pole Spacing for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(M.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){M.groupId&&A(M.groupId,M.newValue)}};c(M),A(y.foundationId,e),p(h+1)}break;case _.AllObjectsOfThisTypeOnSurface:var W=n(y);if(W){var I=new Map,C=W.type===V.Cuboid;if(C){var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;k.type===V.SolarPanel&&k.parentId===y.parentId&&Tw.isIdentical(k.normal,y.normal)&&I.set(k.id,k.poleSpacing)}}catch(B){F.e(B)}finally{F.f()}}else{var Y,L=Object(f.a)(o);try{for(L.s();!(Y=L.n()).done;){var E=Y.value;E.type===V.SolarPanel&&E.parentId===y.parentId&&I.set(E.id,E.poleSpacing)}}catch(B){L.e(B)}finally{L.f()}}var U=C?y.normal:void 0,N={name:"Set Pole Spacing for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:I,newValue:e,groupId:y.parentId,normal:U,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&T(N.groupId,N.normal,N.newValue)}};c(N),T(y.parentId,U,e),p(h+1)}break;default:var J=i(y.id),G=J?J.poleSpacing:y.poleSpacing,X={name:"Set Solar Panel Array Pole Spacing",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(X.changedElementId,X.oldValue)},redo:function(){b(X.changedElementId,X.newValue)}};c(X),b(y.id,e),p(h+1)}a((function(t){t.actionState.solarPanelPoleSpacing=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.PoleSpacing",v),onApply:function(){j(w),l(!1),p(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:1,style:{width:120},precision:2,value:w,onChange:x}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [1, 10] ",me.t("word.MeterAbbreviation",v)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},Hj=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew($r),s=Ew(Sr),d=Ew(_n),h=Ew($n),p=Ew(Ii),y=Ew(Ci),g=OP(V.SolarPanel),m=Object(r.useState)(null!==(t=null===g||void 0===g?void 0:g.frameColor)&&void 0!==t?t:"white"),w=Object(u.a)(m,2),x=w[0],v=w[1],b=$f(),A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.frameColor=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.SolarPanel||i.foundationId!==e||i.locked||(i.frameColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)&&(r.frameColor=l)}}}catch(n){i.e(n)}finally{i.f()}}))},S=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.SolarPanel||o.locked||(o.frameColor=e)}}catch(i){a.e(i)}finally{a.f()}}))},j=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.SolarPanel&&!i.locked&&e.has(i.id)&&(i.frameColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},H=function(e){if(g&&function(e){if(g){switch(d){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.frameColor!==e)return!0}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var o,r=Object(f.a)(i);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.SolarPanel&&!n.locked&&n.frameColor!==e)return!0}}catch(A){r.e(A)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(i);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.SolarPanel&&h.foundationId===(null===g||void 0===g?void 0:g.foundationId)&&!h.locked&&h.frameColor!==e)return!0}}catch(A){u.e(A)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:var p=c(g);if(p)if(p.type===V.Cuboid){var y,m=Object(f.a)(i);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(w.type===V.SolarPanel&&w.parentId===g.parentId&&Tw.isIdentical(w.normal,g.normal)&&!w.locked&&w.frameColor!==e)return!0}}catch(A){m.e(A)}finally{m.f()}}else{var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===g.parentId&&!b.locked&&b.frameColor!==e)return!0}}catch(A){v.e(A)}finally{v.f()}}break;default:if((null===g||void 0===g?void 0:g.frameColor)!==e)return!0}return!1}}(e)){switch(d){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var r,h=t.value;if(h.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(h.id))l.set(h.id,null!==(r=h.frameColor)&&void 0!==r?r:"white")}}catch($){a.e($)}finally{a.f()}var m={name:"Set Frame Color for Selected Solar Panels",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch($){t.e($)}finally{t.f()}},redo:function(){j(m.oldValues,m.newValue)}};s(m),j(l,e),y(p+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(i);try{for(v.s();!(w=v.n()).done;){var b,H=w.value;if(H.type===V.SolarPanel)x.set(H.id,null!==(b=H.frameColor)&&void 0!==b?b:"white")}}catch($){v.e($)}finally{v.f()}var z={name:"Set Frame Color for All Solar Panels",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch($){t.e($)}finally{t.f()}},redo:function(){S(z.newValue)}};s(z),S(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(g.foundationId){var R,D=new Map,M=Object(f.a)(i);try{for(M.s();!(R=M.n()).done;){var W,I=R.value;if(I.type===V.SolarPanel&&I.foundationId===g.foundationId)D.set(I.id,null!==(W=I.frameColor)&&void 0!==W?W:"white")}}catch($){M.e($)}finally{M.f()}var C={name:"Set Frame Color for All Solar Panels Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:g.foundationId,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch($){t.e($)}finally{t.f()}},redo:function(){C.groupId&&T(C.groupId,C.newValue)}};s(C),T(g.foundationId,e),y(p+1)}break;case _.AllObjectsOfThisTypeOnSurface:var O=c(g);if(O){var F=new Map,k=O.type===V.Cuboid;if(k){var Y,L=Object(f.a)(i);try{for(L.s();!(Y=L.n()).done;){var E,U=Y.value;if(U.type===V.SolarPanel&&U.parentId===g.parentId&&Tw.isIdentical(U.normal,g.normal))F.set(U.id,null!==(E=U.frameColor)&&void 0!==E?E:"white")}}catch($){L.e($)}finally{L.f()}}else{var N,J=Object(f.a)(i);try{for(J.s();!(N=J.n()).done;){var G,X=N.value;if(X.type===V.SolarPanel&&X.parentId===g.parentId)F.set(X.id,null!==(G=X.frameColor)&&void 0!==G?G:"white")}}catch($){J.e($)}finally{J.f()}}var B=k?g.normal:void 0,K={name:"Set Frame Color for All Solar Panels on Surface",timestamp:Date.now(),oldValues:F,newValue:e,groupId:g.parentId,normal:B,undo:function(){var e,t=Object(f.a)(K.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch($){t.e($)}finally{t.f()}},redo:function(){K.groupId&&P(K.groupId,K.normal,K.newValue)}};s(K),P(g.parentId,B,e),y(p+1)}break;default:var q=n(g.id),Q=q?q.frameColor:g.frameColor,Z={name:"Set Frame Color of Selected Solar Panel",timestamp:Date.now(),oldValue:Q,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(g.id,Z.oldValue)},redo:function(){A(g.id,Z.newValue)}};s(Z),A(g.id,e),y(p+1)}o((function(t){t.actionState.solarPanelFrameColor=e}))}};return Object(gf.jsx)(kP,{width:680,title:me.t("solarPanelMenu.FrameColor",b),onApply:function(){H(x)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==x&&void 0!==x?x:null===g||void 0===g?void 0:g.color)&&void 0!==l?l:"white",onChangeComplete:function(e){v(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){h(e.target.value)},value:d,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",b)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",b)})]})})})]})})},zj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(_n),d=Ew($n),h=Ew(Ii),p=Ew(Ci),y=Ew((function(e){return e.elements.find((function(e){return e.selected&&e.type===V.SolarPanel}))})),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.inverterEfficiency)&&void 0!==t?t:.95),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.inverterEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.SolarPanel||i.foundationId!==e||i.locked||(i.inverterEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)&&(r.inverterEfficiency=l)}}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.SolarPanel||o.locked||(o.inverterEfficiency=e)}}catch(i){a.e(i)}finally{a.f()}}))},S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.SolarPanel&&!i.locked&&e.has(i.id)&&(i.inverterEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){var t,l;if(y&&function(e){var t;switch(s){case _.AllSelectedObjectsOfThisType:var l,a=Object(f.a)(o);try{for(a.s();!(l=a.n()).done;){var i=l.value;if(i.type===V.SolarPanel&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r,c=i;if(Math.abs((null!==(r=c.inverterEfficiency)&&void 0!==r?r:.95)-e)>At)return!0}}}catch(I){a.e(I)}finally{a.f()}break;case _.AllObjectsOfThisType:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.SolarPanel&&!h.locked){var p,g=h;if(Math.abs((null!==(p=g.inverterEfficiency)&&void 0!==p?p:.95)-e)>At)return!0}}}catch(I){u.e(I)}finally{u.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var x=m.value;if(x.type===V.SolarPanel&&x.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!x.locked){var v,b=x;if(Math.abs((null!==(v=b.inverterEfficiency)&&void 0!==v?v:.95)-e)>At)return!0}}}catch(I){w.e(I)}finally{w.f()}break;case _.AllObjectsOfThisTypeOnSurface:var A=n(y);if(A)if(A.type===V.Cuboid){var T,P=Object(f.a)(o);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===y.parentId&&Tw.isIdentical(S.normal,y.normal)&&!S.locked){var j,H=S;if(Math.abs((null!==(j=H.inverterEfficiency)&&void 0!==j?j:.95)-e)>At)return!0}}}catch(I){P.e(I)}finally{P.f()}}else{var z,R=Object(f.a)(o);try{for(R.s();!(z=R.n()).done;){var D=z.value;if(D.type===V.SolarPanel&&D.parentId===y.parentId&&!D.locked){var M,W=D;if(Math.abs((null!==(M=W.inverterEfficiency)&&void 0!==M?M:.95)-e)>At)return!0}}}catch(I){R.e(I)}finally{R.f()}}break;default:if(Math.abs((null!==(t=null===y||void 0===y?void 0:y.inverterEfficiency)&&void 0!==t?t:.95)-e)>At)return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var a,r=new Map,d=Object(f.a)(o);try{for(d.s();!(a=d.n()).done;){var g,m=a.value;if(m.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(m.id))r.set(m.id,null!==(g=m.inverterEfficiency)&&void 0!==g?g:.95)}}catch(ee){d.e(ee)}finally{d.f()}var w={name:"Set Inverter Efficiency for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(ee){t.e(ee)}finally{t.f()}},redo:function(){S(w.oldValues,w.newValue)}};c(w),S(r,e),p(h+1);break;case _.AllObjectsOfThisType:var x,v=new Map,j=Object(f.a)(o);try{for(j.s();!(x=j.n()).done;){var H,z=x.value;if(z.type===V.SolarPanel)v.set(z.id,null!==(H=z.inverterEfficiency)&&void 0!==H?H:.95)}}catch(ee){j.e(ee)}finally{j.f()}var R={name:"Set Inverter Efficiency for All Solar Panel Arrays",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(ee){t.e(ee)}finally{t.f()}},redo:function(){P(R.newValue)}};c(R),P(e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I,C=D.value;if(C.type===V.SolarPanel&&C.foundationId===y.foundationId)M.set(C.id,null!==(I=C.inverterEfficiency)&&void 0!==I?I:.95)}}catch(ee){W.e(ee)}finally{W.f()}var O={name:"Set Inverter Efficiency for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:M,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(O.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(ee){t.e(ee)}finally{t.f()}},redo:function(){O.groupId&&A(O.groupId,O.newValue)}};c(O),A(y.foundationId,e),p(h+1)}break;case _.AllObjectsOfThisTypeOnSurface:var F=n(y);if(F){var k=new Map,Y=F.type===V.Cuboid;if(Y){var L,E=Object(f.a)(o);try{for(E.s();!(L=E.n()).done;){var U,N=L.value;if(N.type===V.SolarPanel&&N.parentId===y.parentId&&Tw.isIdentical(N.normal,y.normal))k.set(N.id,null!==(U=N.inverterEfficiency)&&void 0!==U?U:.95)}}catch(ee){E.e(ee)}finally{E.f()}}else{var J,G=Object(f.a)(o);try{for(G.s();!(J=G.n()).done;){var X,B=J.value;if(B.type===V.SolarPanel&&B.parentId===y.parentId)k.set(B.id,null!==(X=B.inverterEfficiency)&&void 0!==X?X:.95)}}catch(ee){G.e(ee)}finally{G.f()}}var K=Y?y.normal:void 0,q={name:"Set Inverter Efficiency for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:k,newValue:e,groupId:y.parentId,normal:K,undo:function(){var e,t=Object(f.a)(q.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(ee){t.e(ee)}finally{t.f()}},redo:function(){q.groupId&&T(q.groupId,q.normal,q.newValue)}};c(q),T(y.parentId,K,e),p(h+1)}break;default:var Q=i(y.id),Z=Q?null!==(t=Q.inverterEfficiency)&&void 0!==t?t:.95:null!==(l=y.inverterEfficiency)&&void 0!==l?l:.95,$={name:"Set Solar Panel Array Inverter Efficiency",timestamp:Date.now(),oldValue:Z,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b($.changedElementId,$.oldValue)},redo:function(){b($.changedElementId,$.newValue)}};c($),b(y.id,e),p(h+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.InverterEfficiency",v),onApply:function(){j(w)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.5,max:1,step:.01,style:{width:120},precision:2,value:w,onChange:x}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:["[0.5, 1.0]",Object(gf.jsx)("br",{}),me.t("solarPanelMenu.InverterEfficiencyExplained",v)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},Rj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Vi),i=Ew(Fi),n=Ew(Zr),c=Ew($r),s=Ew(Sr),d=Ew(_n),h=Ew($n),p=Ew(Ii),y=Ew(Ci),g=Ew(Oi),m=Ew((function(e){return e.elements.find((function(e){return e.selected&&e.type===V.SolarPanel}))})),w=Object(r.useState)(!1),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(!1),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)({left:0,top:0,bottom:0,right:0}),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useRef)(null),M=Object(r.useRef)(null!==(t=null===m||void 0===m?void 0:m.dcToAcRatio)&&void 0!==t?t:1),W={lng:o};Object(r.useEffect)((function(){var e;m&&(M.current=null!==(e=m.dcToAcRatio)&&void 0!==e?e:1)}),[m.dcToAcRatio]);var I=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.dcToAcRatio=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},C=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.SolarPanel||i.foundationId!==e||i.locked||(i.dcToAcRatio=t)}}catch(r){o.e(r)}finally{o.f()}}))},O=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)&&(r.dcToAcRatio=l)}}}catch(n){i.e(n)}finally{i.f()}}))},F=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.SolarPanel||o.locked||(o.dcToAcRatio=e)}}catch(i){a.e(i)}finally{a.f()}}))},k=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.SolarPanel&&!i.locked&&e.has(i.id)&&(i.dcToAcRatio=t)}}catch(r){o.e(r)}finally{o.f()}}))},Y=function(e){var t,l;if(m&&function(e){var t;switch(d){case _.AllSelectedObjectsOfThisType:var l,a=Object(f.a)(i);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var r,n=o;if(Math.abs((null!==(r=n.dcToAcRatio)&&void 0!==r?r:1)-e)>At)return!0}}}catch(I){a.e(I)}finally{a.f()}break;case _.AllObjectsOfThisType:var s,u=Object(f.a)(i);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.SolarPanel&&!h.locked){var p,y=h;if(Math.abs((null!==(p=y.dcToAcRatio)&&void 0!==p?p:1)-e)>At)return!0}}}catch(I){u.e(I)}finally{u.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var g,w=Object(f.a)(i);try{for(w.s();!(g=w.n()).done;){var x=g.value;if(x.type===V.SolarPanel&&x.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!x.locked){var v,b=x;if(Math.abs((null!==(v=b.dcToAcRatio)&&void 0!==v?v:1)-e)>At)return!0}}}catch(I){w.e(I)}finally{w.f()}break;case _.AllObjectsOfThisTypeOnSurface:var A=c(m);if(A)if(A.type===V.Cuboid){var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===m.parentId&&Tw.isIdentical(S.normal,m.normal)&&!S.locked){var j,H=S;if(Math.abs((null!==(j=H.dcToAcRatio)&&void 0!==j?j:1)-e)>At)return!0}}}catch(I){P.e(I)}finally{P.f()}}else{var z,R=Object(f.a)(i);try{for(R.s();!(z=R.n()).done;){var D=z.value;if(D.type===V.SolarPanel&&D.parentId===m.parentId&&!D.locked){var M,W=D;if(Math.abs((null!==(M=W.dcToAcRatio)&&void 0!==M?M:1)-e)>At)return!0}}}catch(I){R.e(I)}finally{R.f()}}break;default:if(Math.abs((null!==(t=null===m||void 0===m?void 0:m.dcToAcRatio)&&void 0!==t?t:1)-e)>At)return!0}return!1}(e)){switch(d){case _.AllSelectedObjectsOfThisType:var a,o=new Map,r=Object(f.a)(i);try{for(r.s();!(a=r.n()).done;){var h,g=a.value;if(g.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(g.id))o.set(g.id,null!==(h=g.dcToAcRatio)&&void 0!==h?h:1)}}catch(le){r.e(le)}finally{r.f()}var w={name:"Set DC-AC Ratio for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:o,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];I(a,o)}}catch(le){t.e(le)}finally{t.f()}},redo:function(){k(w.oldValues,w.newValue)}};s(w),k(o,e),y(p+1);break;case _.AllObjectsOfThisType:var x,A=new Map,T=Object(f.a)(i);try{for(T.s();!(x=T.n()).done;){var P,S=x.value;if(S.type===V.SolarPanel)A.set(S.id,null!==(P=S.dcToAcRatio)&&void 0!==P?P:1)}}catch(le){T.e(le)}finally{T.f()}var j={name:"Set DC-AC Ratio for All Solar Panel Arrays",timestamp:Date.now(),oldValues:A,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];I(a,o)}}catch(le){t.e(le)}finally{t.f()}},redo:function(){F(j.newValue)}};s(j),F(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var H,z=new Map,R=Object(f.a)(i);try{for(R.s();!(H=R.n()).done;){var D,M=H.value;if(M.type===V.SolarPanel&&M.foundationId===m.foundationId)z.set(M.id,null!==(D=M.dcToAcRatio)&&void 0!==D?D:1)}}catch(le){R.e(le)}finally{R.f()}var W={name:"Set DC-AC Ratio for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(W.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];I(a,o)}}catch(le){t.e(le)}finally{t.f()}},redo:function(){W.groupId&&C(W.groupId,W.newValue)}};s(W),C(m.foundationId,e),y(p+1)}break;case _.AllObjectsOfThisTypeOnSurface:var Y=c(m);if(Y){var L=new Map,E=Y.type===V.Cuboid;if(E){var U,N=Object(f.a)(i);try{for(N.s();!(U=N.n()).done;){var J,G=U.value;if(G.type===V.SolarPanel&&G.parentId===m.parentId&&Tw.isIdentical(G.normal,m.normal))L.set(G.id,null!==(J=G.dcToAcRatio)&&void 0!==J?J:1)}}catch(le){N.e(le)}finally{N.f()}}else{var X,B=Object(f.a)(i);try{for(B.s();!(X=B.n()).done;){var K,q=X.value;if(q.type===V.SolarPanel&&q.parentId===m.parentId)L.set(q.id,null!==(K=q.dcToAcRatio)&&void 0!==K?K:1)}}catch(le){B.e(le)}finally{B.f()}}var Q=E?m.normal:void 0,Z={name:"Set DC-AC Ratio for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:L,newValue:e,groupId:m.parentId,normal:Q,undo:function(){var e,t=Object(f.a)(Z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];I(a,o)}}catch(le){t.e(le)}finally{t.f()}},redo:function(){Z.groupId&&O(Z.groupId,Z.normal,Z.newValue)}};s(Z),O(m.parentId,Q,e),y(p+1)}break;default:var $=n(m.id),ee=$?null!==(t=$.dcToAcRatio)&&void 0!==t?t:1:null!==(l=m.dcToAcRatio)&&void 0!==l?l:1,te={name:"Set Solar Panel Array DC-AC Ratio",timestamp:Date.now(),oldValue:ee,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){I(te.changedElementId,te.oldValue)},redo:function(){I(te.changedElementId,te.newValue)}};s(te),I(m.id,e),y(p+1)}b(!v)}},L=function(){var e;M.current=null!==(e=m.dcToAcRatio)&&void 0!==e?e:1,l(!1)},E=function(){Y(M.current),l(!1),y(0)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:550,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return S(!0)},onMouseOut:function(){return S(!1)},children:me.t("solarPanelMenu.DcToAcSizeRatio",W)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){Y(M.current)},children:me.t("word.Apply",W)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){L(),g()},children:me.t("word.Cancel",W)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:E,children:me.t("word.OK",W)},"OK")],onCancel:L,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!P,bounds:z,onStart:function(e,t){return function(e,t){if(D.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=D.current.getBoundingClientRect();R({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:D,children:e})})},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:2,step:.01,style:{width:120},precision:2,value:M.current,onChange:function(e){M.current=e,b(!v)},onPressEnter:E}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:["[1.0, 2.0]",Object(gf.jsx)("br",{}),me.t("solarPanelMenu.DcToAcSizeRatioExplained",W)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){h(e.target.value),b(!v)},value:d,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",W)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",W)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",W)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",W)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",W)})]})})})]})})})},Dj=n.a.memo((function(){var e,t,l,a,o=Ew(ac),i=Ew(Sr),n=Ew(Ci),c=Ew(Vi),s=OP(V.SolarPanel),d=Object(r.useState)(!1),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)(!1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(!1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!1),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useState)(!1),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useState)(!1),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=Object(r.useState)(!1),q=Object(u.a)(K,2),Q=q[0],Z=q[1],_=Object(r.useState)(!1),$=Object(u.a)(_,2),ee=$[0],le=$[1],ae=Object(r.useState)(!1),oe=Object(u.a)(ae,2),ie=oe[0],re=oe[1],ne=zP(s),ce=ne.labelText,se=ne.setLabelText,de=RP(s),ue=DP(s,ce),fe=IP(s),he=WP(s),pe=MP(s),ye=CP(s);if(!s)return null;var ge={lng:c},we=(new Me.Vector3).fromArray(s.normal),xe=!(null===s||void 0===s?void 0:s.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"solar-panel-copy",paddingLeft:"36px"}),xe&&Object(gf.jsx)(PP,{keyName:"solar-panel-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"solar-panel-lock"}),s&&xe&&Object(gf.jsxs)(gf.Fragment,{children:[h&&Object(gf.jsx)(mj,{setDialogVisible:p}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(0),p(!0)},style:{paddingLeft:"36px"},children:[me.t("solarPanelMenu.ChangePvModel",ge)," (",s.pvModelName,") ..."]},"solar-panel-change"),m&&Object(gf.jsx)(xj,{setDialogVisible:w}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px",width:"150px"},onClick:function(){n(0),w(!0)},children:[me.t("solarPanelMenu.Orientation",ge)," ..."]},"solar-panel-orientation"),S&&Object(gf.jsx)(vj,{setDialogVisible:j}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),j(!0)},children:[me.t("word.Length",ge)," ..."]},"solar-panel-length"),b&&Object(gf.jsx)(bj,{setDialogVisible:A}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),A(!0)},children:[me.t("word.Width",ge)," ..."]},"solar-panel-width"),R&&Object(gf.jsx)(zj,{setDialogVisible:D}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),D(!0)},children:[me.t("solarPanelMenu.InverterEfficiency",ge)," ..."]},"solar-panel-inverter-efficiency"),I&&Object(gf.jsx)(Rj,{setDialogVisible:C}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),C(!0)},children:[me.t("solarPanelMenu.DcToAcSizeRatio",ge)," ..."]},"solar-panel-dc-ac-ratio"),s.parentType===V.Wall&&Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),Y(!0)},children:[me.t("solarPanelMenu.TiltAngle",ge)," ..."]},"solar-panel-tilt-angle")}),k&&Object(gf.jsx)(Aj,{setDialogVisible:Y,isOnWall:s.parentType===V.Wall}),we&&Tw.isSame(we,Rt)&&Object(gf.jsxs)(gf.Fragment,{children:[s.trackerType===te.NO_TRACKER&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),Y(!0)},children:[me.t("solarPanelMenu.TiltAngle",ge)," ..."]},"solar-panel-tilt-angle"),U&&Object(gf.jsx)(Tj,{setDialogVisible:N}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),N(!0)},children:[me.t("solarCollectorMenu.RelativeAzimuth",ge)," ..."]},"solar-panel-relative-azimuth"),s.parentType!==V.Roof&&Object(gf.jsxs)(gf.Fragment,{children:[X&&Object(gf.jsx)(Pj,{setDialogVisible:B}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),B(!0)},children:[me.t("solarPanelMenu.Tracker",ge)," ..."]},"solar-panel-tracker")]})]}),xe&&Object(gf.jsxs)(gf.Fragment,{children:[ie&&Object(gf.jsx)(Hj,{setDialogVisible:re}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),re(!0)},children:[me.t("solarPanelMenu.FrameColor",ge)," ..."]},"solar-panel-frame-color")]}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.drawSunBeam),onChange:function(e){return function(e){if(s){var t={name:"Show Sun Beam",timestamp:Date.now(),checked:!s.drawSunBeam,selectedElementId:s.id,selectedElementType:V.SolarPanel,undo:function(){o(s.id,!t.checked)},redo:function(){o(s.id,t.checked)}};i(t),o(s.id,e)}}(e.target.checked)},children:me.t("solarCollectorMenu.DrawSunBeam",ge)})},"solar-panel-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("solarCollectorMenu.Pole",ge),style:{paddingLeft:"24px"},children:[Q&&Object(gf.jsx)(Sj,{setDialogVisible:Z}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(0),Z(!0)},children:[me.t("solarCollectorMenu.PoleHeight",ge)," ..."]},"solar-panel-pole-height"),ee&&Object(gf.jsx)(jj,{setDialogVisible:le}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(0),le(!0)},children:[me.t("solarPanelMenu.PoleSpacing",ge)," ..."]},"solar-panel-pole-spacing")]},"solar-panel-pole"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",ge),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:de,children:me.t("labelSubMenu.KeepShowingLabel",ge)})},"solar-panel-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",ge)+":",value:ce,onChange:function(e){return se(e.target.value)},onPressEnter:ue})},"solar-panel-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",ge)+":",min:0,max:100,step:1,precision:1,value:null!==(e=s.labelHeight)&&void 0!==e?e:.5,onChange:function(e){return ye(e)}})},"solar-panel-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",ge)+":",min:10,max:100,step:1,precision:0,value:null!==(t=s.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return pe(e)}})},"solar-panel-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",ge)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=s.labelSize)&&void 0!==l?l:.2,onChange:function(e){return he(e)}})},"solar-panel-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",ge)+":",value:null!==(a=s.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return fe(e.target.value)}})},"solar-panel-label-color")]})]},"solar-panel-label")]})]})})),Mj=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(Sn),n=Ew(jn),c=Ew(Hn),s=Ew($r),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.ParabolicTrough),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.ly)&&void 0!==t?t:9),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useRef)(!1),P=Object(r.useRef)(),S=$f(),j=function(e,t){return!function(e,t){var l=s(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.ParabolicTrough&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(a);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!p.locked){var y=p;if(Math.abs(y.ly-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(P.current=void 0,h){case _.AllSelectedObjectsOfThisType:T.current=!1;var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&j(r,e)){T.current=!0;break}}}catch(X){l.e(X)}finally{l.f()}if(T.current)P.current=e,A(w.ly);else{var s,p=new Map,m=Object(f.a)(a);try{for(m.s();!(s=m.n()).done;){var x=s.value;x.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(x.id)&&p.set(x.id,x.ly)}}catch(X){m.e(X)}finally{m.f()}var v={name:"Set Length for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:p,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){H(v.oldValues,v.newValue)}};d(v),H(p,e),g(y+1)}break;case _.AllObjectsOfThisType:T.current=!1;var b,S=Object(f.a)(a);try{for(S.s();!(b=S.n()).done;){var z=b.value;if(z.type===V.ParabolicTrough&&j(z,e)){T.current=!0;break}}}catch(X){S.e(X)}finally{S.f()}if(T.current)P.current=e,A(w.ly);else{var R,D=new Map,M=Object(f.a)(a);try{for(M.s();!(R=M.n()).done;){var W=R.value;W.type===V.ParabolicTrough&&D.set(W.id,W.ly)}}catch(X){M.e(X)}finally{M.f()}var I={name:"Set Length for All Parabolic Troughs",timestamp:Date.now(),oldValues:D,newValue:e,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){c(V.ParabolicTrough,I.newValue)}};d(I),c(V.ParabolicTrough,e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var C,O=Object(f.a)(a);try{for(O.s();!(C=O.n()).done;){var F=C.value;if(F.type===V.ParabolicTrough&&F.foundationId===w.foundationId&&j(F,e)){T.current=!0;break}}}catch(X){O.e(X)}finally{O.f()}if(T.current)P.current=e,A(w.ly);else{var k,Y=new Map,L=Object(f.a)(a);try{for(L.s();!(k=L.n()).done;){var E=k.value;E.type===V.ParabolicTrough&&E.foundationId===w.foundationId&&Y.set(E.id,E.ly)}}catch(X){L.e(X)}finally{L.f()}var U={name:"Set Length for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:Y,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(U.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){U.groupId&&n(V.ParabolicTrough,U.groupId,U.newValue)}};d(U),n(V.ParabolicTrough,w.foundationId,e),g(y+1)}}break;default:var N=o(w.id),J=N?N.ly:w.ly;if(T.current=j(w,e),T.current)P.current=e,A(J);else{var G={name:"Set Parabolic Trough Length",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){i(G.changedElementId,G.oldValue)},redo:function(){i(G.changedElementId,G.newValue)}};d(G),i(w.id,e),g(y+1)}}},R=function(){T.current=!1,l(!1)};if((null===w||void 0===w?void 0:w.type)!==V.ParabolicTrough)return null;var D=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(void 0!==P.current?" ("+P.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Length",S),rejectedMessage:D,onApply:function(){z(b)},onClose:R,onClickCancel:function(){R(),m()},onClickOk:function(){z(b),T.current||(l(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:w.moduleLength,max:100*w.moduleLength,step:w.moduleLength,precision:2,style:{width:120},value:b,onChange:function(e){A(function(e){if(!w)return 1;var t=null!==e&&void 0!==e?e:1;return Math.max(1,Math.ceil((t-w.moduleLength/2)/w.moduleLength))*w.moduleLength}(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("parabolicTroughMenu.ModuleLength",S)+": "+w.moduleLength.toFixed(1)+" "+me.t("word.MeterAbbreviation",S),Object(gf.jsx)("br",{}),Math.round(b/w.moduleLength)+" "+me.t("parabolicTroughMenu.ModulesLong",S),Object(gf.jsx)("br",{}),me.t("word.Maximum",S),": 100 ",me.t("parabolicTroughMenu.Modules",S)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",S)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",S)})]})})})]})})},Wj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(An),c=Ew(Tn),s=Ew(Pn),d=Ew($r),h=Ew(Sr),p=Ew(Rc),y=Ew(Dc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicTrough),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.lx)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.lx=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicTrough&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.lx-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.lx)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Width for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.ParabolicTrough&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.lx);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicTrough&&M.set(I.id,I.lx)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Width for All Parabolic Troughs",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,C.newValue)}};h(C),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicTrough&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.lx);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicTrough&&U.foundationId===x.foundationId&&L.set(U.id,U.lx)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Width for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicTrough,N.groupId,N.newValue)}};h(N),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.lx:x.lx;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Trough Width",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughWidth=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Width",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 10 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",j)})]})})})]})})},Ij=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(dc),c=Ew(fc),s=Ew(hc),d=Ew($r),h=Ew(Sr),p=Ew(Rc),y=Ew(Dc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicTrough),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.poleHeight)&&void 0!==t?t:1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.tiltAngle=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.ParabolicTrough&&y.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var v=m.value;if(v.type===V.ParabolicTrough&&v.parentId===x.parentId&&!v.locked){var b=v;if(Math.abs(b.poleHeight-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}}break;default:if(Math.abs((null===x||void 0===x?void 0:x.poleHeight)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(f.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(b.id)&&w.set(b.id,b.poleHeight)}}catch(B){v.e(B)}finally{v.f()}var A={name:"Set Pole Height for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){H(A.oldValues,A.newValue)}};h(A),H(w,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var j,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;if(R.type===V.ParabolicTrough&&.5*R.ly*Math.abs(Math.sin(R.tiltAngle))>e){P.current=!0;break}}}catch(B){z.e(B)}finally{z.f()}if(P.current)S.current=e,T(x.poleHeight);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicTrough&&M.set(I.id,I.poleHeight)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Pole Height for All Parabolic Troughs",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,C.newValue)}};h(C),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicTrough&&k.foundationId===x.foundationId&&.5*k.ly*Math.abs(Math.sin(k.tiltAngle))>e){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.poleHeight);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicTrough&&U.foundationId===x.foundationId&&L.set(U.id,U.poleHeight)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Pole Height for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicTrough,N.groupId,N.newValue)}};h(N),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.poleHeight:x.poleHeight;if(P.current=.5*x.lx*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Trough Pole Height",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughPoleHeight=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",j),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [0, 5] ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",j)})]})})})]})})},Cj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Ec),c=Ew(Uc),s=Ew(Nc),d=Ew($r),h=Ew(Sr),p=Ew(Rc),y=Ew(Dc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicTrough),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.latusRectum)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.latusRectum=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.latusRectum=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.latusRectum-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.latusRectum-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicTrough&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.latusRectum-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.latusRectum)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.latusRectum);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.latusRectum)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Latus Rectum for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.ParabolicTrough&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.latusRectum);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicTrough&&M.set(I.id,I.latusRectum)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Latus Rectum for All Parabolic Troughs",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,C.newValue)}};h(C),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicTrough&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.latusRectum);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicTrough&&U.foundationId===x.foundationId&&L.set(U.id,U.latusRectum)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Latus Rectum for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicTrough,N.groupId,N.newValue)}};h(N),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.latusRectum:x.latusRectum;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Trough Latus Rectum",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughLatusRectum=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicTroughMenu.LatusRectum",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 20 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",j)})]})})})]})})},Oj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Vc),c=Ew(Jc),s=Ew(Gc),d=Ew($r),h=Ew(Sr),p=Ew(Rc),y=Ew(Dc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicTrough),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.moduleLength)&&void 0!==t?t:3),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.moduleLength=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.moduleLength=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.moduleLength-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.moduleLength-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicTrough&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.moduleLength-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.moduleLength)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.moduleLength);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.moduleLength)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Module Length for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.ParabolicTrough&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.moduleLength);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicTrough&&M.set(I.id,I.moduleLength)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Module Length for All Parabolic Troughs",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,C.newValue)}};h(C),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicTrough&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.moduleLength);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicTrough&&U.foundationId===x.foundationId&&L.set(U.id,U.moduleLength)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Module Length for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicTrough,N.groupId,N.newValue)}};h(N),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.moduleLength:x.moduleLength;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Trough Module Length",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughModuleLength=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicTroughMenu.LatusRectum",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 10 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",j)})]})})})]})})},Fj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(mc),c=Ew(wc),s=Ew(xc),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicTrough),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.reflectance)&&void 0!==t?t:.9),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.reflectance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.reflectance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Reflectance for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&v.set(A.id,A.reflectance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Reflectance for All Parabolic Troughs",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,P.newValue)}};d(P),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicTrough&&z.foundationId===m.foundationId&&j.set(z.id,z.reflectance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Reflectance for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicTrough,R.groupId,R.newValue)}};d(R),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.reflectance:m.reflectance,W={name:"Set Parabolic Trough Reflectance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicTroughReflectance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicTrough?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},kj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(vc),c=Ew(bc),s=Ew(Ac),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicTrough),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.absorptance)&&void 0!==t?t:.95),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.absorptance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.absorptance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.absorptance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.absorptance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.absorptance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.absorptance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Absorptance for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&v.set(A.id,A.absorptance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Absorptance for All Parabolic Troughs",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,P.newValue)}};d(P),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicTrough&&z.foundationId===m.foundationId&&j.set(z.id,z.absorptance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Absorptance for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicTrough,R.groupId,R.newValue)}};d(R),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.absorptance:m.absorptance,W={name:"Set Parabolic Trough Absorptance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicTroughAbsorptance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicTrough?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},Yj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Tc),c=Ew(Pc),s=Ew(Sc),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicTrough),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.opticalEfficiency)&&void 0!==t?t:.7),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.opticalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.opticalEfficiency-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.opticalEfficiency-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.opticalEfficiency-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.opticalEfficiency)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.opticalEfficiency)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Optical Efficiency for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&v.set(A.id,A.opticalEfficiency)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Optical Efficiency for All Parabolic Troughs",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,P.newValue)}};d(P),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicTrough&&z.foundationId===m.foundationId&&j.set(z.id,z.opticalEfficiency)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Optical Efficiency for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicTrough,R.groupId,R.newValue)}};d(R),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.opticalEfficiency:m.opticalEfficiency,W={name:"Set Parabolic Trough Optical Efficiency",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicTroughOpticalEfficiency=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicTrough?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},Lj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(jc),c=Ew(Hc),s=Ew(zc),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicTrough),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.thermalEfficiency)&&void 0!==t?t:.3),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.thermalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.thermalEfficiency-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.thermalEfficiency-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.thermalEfficiency-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.thermalEfficiency)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.thermalEfficiency)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Thermal Efficiency for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&v.set(A.id,A.thermalEfficiency)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Thermal Efficiency for All Parabolic Troughs",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,P.newValue)}};d(P),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicTrough&&z.foundationId===m.foundationId&&j.set(z.id,z.thermalEfficiency)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Thermal Efficiency for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicTrough,R.groupId,R.newValue)}};d(R),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.thermalEfficiency:m.thermalEfficiency,W={name:"Set Parabolic Trough Thermal Efficiency",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicTroughThermalEfficiency=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicTrough?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},Ej=n.a.memo((function(){var e,t,l,a,o=Ew(Vi),i=Ew(ac),n=Ew(Sr),c=Ew(Ci),s=OP(V.ParabolicTrough),d=Object(r.useState)(!1),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)(!1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(!1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!1),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useState)(!1),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useState)(!1),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=zP(s),q=K.labelText,Q=K.setLabelText,Z=RP(s),_=DP(s,q),$=WP(s),ee=MP(s),te=IP(s),le=CP(s);if(!s)return null;var ae={lng:o},oe=!(null===s||void 0===s?void 0:s.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"parabolic-trough-copy",paddingLeft:"36px"}),oe&&Object(gf.jsx)(PP,{keyName:"parabolic-trough-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"parabolic-trough-lock"}),s&&oe&&Object(gf.jsxs)(gf.Fragment,{children:[S&&Object(gf.jsx)(Mj,{setDialogVisible:j}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),j(!0)},children:[me.t("word.Length",ae)," ..."]},"parabolic-trough-length"),b&&Object(gf.jsx)(Wj,{setDialogVisible:A}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),A(!0)},children:[me.t("word.Width",ae)," ..."]},"parabolic-trough-width"),h&&Object(gf.jsx)(Oj,{setDialogVisible:p}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),p(!0)},children:[me.t("parabolicTroughMenu.ModuleLength",ae)," ..."]},"parabolic-trough-module-length"),m&&Object(gf.jsx)(Cj,{setDialogVisible:w}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),w(!0)},children:[me.t("parabolicTroughMenu.LatusRectum",ae)," ..."]},"parabolic-trough-latus-rectum"),R&&Object(gf.jsx)(Ij,{setDialogVisible:D}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),D(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",ae)," ..."]},"parabolic-trough-pole-height"),I&&Object(gf.jsx)(Fj,{setDialogVisible:C}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),C(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",ae)," ..."]},"parabolic-trough-reflectance"),k&&Object(gf.jsx)(kj,{setDialogVisible:Y}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),Y(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",ae)," ..."]},"parabolic-trough-absorptance"),U&&Object(gf.jsx)(Yj,{setDialogVisible:N}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),N(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",ae)," ..."]},"parabolic-trough-optical-efficiency"),X&&Object(gf.jsx)(Lj,{setDialogVisible:B}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),B(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",ae)," ..."]},"parabolic-trough-thermal-efficiency"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.drawSunBeam),onChange:function(e){return function(e){if(s){var t={name:"Show Sun Beam",timestamp:Date.now(),checked:!s.drawSunBeam,selectedElementId:s.id,selectedElementType:V.ParabolicTrough,undo:function(){i(s.id,!t.checked)},redo:function(){i(s.id,t.checked)}};n(t),i(s.id,e)}}(e.target.checked)},children:me.t("solarCollectorMenu.DrawSunBeam",ae)})},"parabolic-trough-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:Z,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"parabolic-trough-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.Label",ae)+":",value:q,onChange:function(e){return Q(e.target.value)},onPressEnter:_,onBlur:_})},"parabolic-trough-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(e=s.labelHeight)&&void 0!==e?e:.2,onChange:function(e){return le(e)}})},"parabolic-trough-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",ae)+":",min:10,max:100,step:1,precision:0,value:null!==(t=s.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return ee(e)}})},"parabolic-trough-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=s.labelSize)&&void 0!==l?l:.2,onChange:function(e){return $(e)}})},"parabolic-trough-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",ae)+":",value:null!==(a=s.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return te(e.target.value)}})},"parabolic-trough-label-color")]})]},"parabolic-trough-label")]})]})})),Uj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(An),c=Ew(Sn),s=Ew(Tn),d=Ew(jn),h=Ew(Pn),p=Ew(Hn),y=Ew($r),g=Ew(Sr),m=Ew(Yc),w=Ew(Lc),x=Ew(Ii),v=Ew(Ci),b=Ew(Oi),A=OP(V.ParabolicDish),T=Object(r.useState)(null!==(t=null===A||void 0===A?void 0:A.lx)&&void 0!==t?t:2),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useRef)(!1),z=Object(r.useRef)(),R=$f(),D=function(e,t){return!function(e,t){var l=y(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},M=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.lx=t,i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},W=function(e){if(A&&function(e){if(A){switch(m){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(y){n.e(y)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicDish&&h.foundationId===(null===A||void 0===A?void 0:A.foundationId)&&!h.locked){var p=h;if(Math.abs(p.lx-e)>At)return!0}}}catch(y){u.e(y)}finally{u.f()}break;default:if(Math.abs((null===A||void 0===A?void 0:A.lx)-e)>At)return!0}return!1}}(e)){switch(z.current=void 0,m){case _.AllSelectedObjectsOfThisType:H.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(r.id)&&D(r,e)){H.current=!0;break}}}catch(Q){l.e(Q)}finally{l.f()}if(H.current)z.current=e,j(A.lx);else{var y,w=new Map,b=Object(f.a)(o);try{for(b.s();!(y=b.n()).done;){var T=y.value;T.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(T.id)&&w.set(T.id,T.lx)}}catch(Q){b.e(Q)}finally{b.f()}var P={name:"Set Diameter for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o),c(a,o)}}catch(Q){t.e(Q)}finally{t.f()}},redo:function(){M(P.oldValues,P.newValue)}};g(P),M(w,e),v(x+1)}break;case _.AllObjectsOfThisType:H.current=!1;var S,R=Object(f.a)(o);try{for(R.s();!(S=R.n()).done;){var W=S.value;if(W.type===V.ParabolicDish&&D(W,e)){H.current=!0;break}}}catch(Q){R.e(Q)}finally{R.f()}if(H.current)z.current=e,j(A.lx);else{var I,C=new Map,O=Object(f.a)(o);try{for(O.s();!(I=O.n()).done;){var F=I.value;F.type===V.ParabolicDish&&C.set(F.id,F.lx)}}catch(Q){O.e(Q)}finally{O.f()}var k={name:"Set Diameter for All Parabolic Dishes",timestamp:Date.now(),oldValues:C,newValue:e,undo:function(){var e,t=Object(f.a)(k.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o),c(a,o)}}catch(Q){t.e(Q)}finally{t.f()}},redo:function(){h(V.ParabolicDish,k.newValue),p(V.ParabolicDish,k.newValue)}};g(k),h(V.ParabolicDish,e),p(V.ParabolicDish,e),v(x+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(A.foundationId){H.current=!1;var Y,L=Object(f.a)(o);try{for(L.s();!(Y=L.n()).done;){var E=Y.value;if(E.type===V.ParabolicDish&&E.foundationId===A.foundationId&&D(E,e)){H.current=!0;break}}}catch(Q){L.e(Q)}finally{L.f()}if(H.current)z.current=e,j(A.lx);else{var U,N=new Map,J=Object(f.a)(o);try{for(J.s();!(U=J.n()).done;){var G=U.value;G.type===V.ParabolicDish&&G.foundationId===A.foundationId&&N.set(G.id,G.lx)}}catch(Q){J.e(Q)}finally{J.f()}var X={name:"Set Diameter for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:N,newValue:e,groupId:A.foundationId,undo:function(){var e,t=Object(f.a)(X.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o),c(a,o)}}catch(Q){t.e(Q)}finally{t.f()}},redo:function(){X.groupId&&(s(V.ParabolicDish,X.groupId,X.newValue),d(V.ParabolicDish,X.groupId,X.newValue))}};g(X),s(V.ParabolicDish,A.foundationId,e),d(V.ParabolicDish,A.foundationId,e),v(x+1)}}break;default:var B=i(A.id),K=B?B.lx:A.lx;if(H.current=D(A,e),H.current)z.current=e,j(K);else{var q={name:"Set Parabolic Dish Diameter",timestamp:Date.now(),oldValue:K,newValue:e,changedElementId:A.id,changedElementType:A.type,undo:function(){n(q.changedElementId,q.oldValue),c(q.changedElementId,q.oldValue)},redo:function(){n(q.changedElementId,q.newValue),c(q.changedElementId,q.newValue)}};g(q),n(A.id,e),c(A.id,e),v(x+1)}}a((function(t){t.actionState.parabolicDishRimDiameter=e}))}},I=function(){H.current=!1,l(!1)};if((null===A||void 0===A?void 0:A.type)!==V.ParabolicDish)return null;var C=H.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicDishMenu.RimDiameter",R),rejectedMessage:C,onApply:function(){W(S)},onClose:I,onClickCancel:function(){I(),b()},onClickOk:function(){W(S),H.current||(l(!1),v(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:.5,precision:2,style:{width:120},value:S,onChange:j}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",R),": 1 ",me.t("word.MeterAbbreviation",R),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",R),": 10 ",me.t("word.MeterAbbreviation",R)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){w(e.target.value)},value:m,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",R)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",R)})]})})})]})})},Nj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(dc),c=Ew(fc),s=Ew(hc),d=Ew($r),h=Ew(Sr),p=Ew(Yc),y=Ew(Lc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicDish),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.poleHeight)&&void 0!==t?t:1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.tiltAngle=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.ParabolicDish&&y.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var v=m.value;if(v.type===V.ParabolicDish&&v.parentId===x.parentId&&!v.locked){var b=v;if(Math.abs(b.poleHeight-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}}break;default:if(Math.abs((null===x||void 0===x?void 0:x.poleHeight)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(f.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(b.id)&&w.set(b.id,b.poleHeight)}}catch(B){v.e(B)}finally{v.f()}var A={name:"Set Pole Height for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){H(A.oldValues,A.newValue)}};h(A),H(w,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var j,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;if(R.type===V.ParabolicDish&&.5*R.ly*Math.abs(Math.sin(R.tiltAngle))>e){P.current=!0;break}}}catch(B){z.e(B)}finally{z.f()}if(P.current)S.current=e,T(x.poleHeight);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicDish&&M.set(I.id,I.poleHeight)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Pole Height for All Parabolic Dishes",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicDish,C.newValue)}};h(C),s(V.ParabolicDish,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicDish&&k.foundationId===x.foundationId&&.5*k.ly*Math.abs(Math.sin(k.tiltAngle))>e){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.poleHeight);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicDish&&U.foundationId===x.foundationId&&L.set(U.id,U.poleHeight)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Pole Height for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicDish,N.groupId,N.newValue)}};h(N),c(V.ParabolicDish,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.poleHeight:x.poleHeight;if(P.current=.5*x.lx*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Dish Pole Height",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicDishPoleHeight=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicDish)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicDishMenu.ExtraPoleHeightInAdditionToRadius",j),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [0, 5] ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",j)})]})})})]})})},Vj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Ec),c=Ew(Uc),s=Ew(Nc),d=Ew($r),h=Ew(Sr),p=Ew(Yc),y=Ew(Lc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicDish),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.latusRectum)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.latusRectum=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.latusRectum=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.latusRectum-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.latusRectum-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicDish&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.latusRectum-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.latusRectum)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.latusRectum);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.latusRectum)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Latus Rectum for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.ParabolicDish&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.latusRectum);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicDish&&M.set(I.id,I.latusRectum)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Latus Rectum for All Parabolic Dishes",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicDish,C.newValue)}};h(C),s(V.ParabolicDish,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicDish&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.latusRectum);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicDish&&U.foundationId===x.foundationId&&L.set(U.id,U.latusRectum)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Latus Rectum for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicDish,N.groupId,N.newValue)}};h(N),c(V.ParabolicDish,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.latusRectum:x.latusRectum;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Dish Latus Rectum",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicDishLatusRectum=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicDish)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicDishMenu.LatusRectum",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 20 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",j)})]})})})]})})},Jj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(mc),c=Ew(wc),s=Ew(xc),d=Ew(Sr),h=Ew(Yc),p=Ew(Lc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicDish),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.reflectance)&&void 0!==t?t:.9),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicDish&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.reflectance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.reflectance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Reflectance for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&v.set(A.id,A.reflectance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Reflectance for All Parabolic Dishes",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicDish,P.newValue)}};d(P),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===m.foundationId&&j.set(z.id,z.reflectance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Reflectance for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicDish,R.groupId,R.newValue)}};d(R),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.reflectance:m.reflectance,W={name:"Set Parabolic Dish Reflectance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicDishReflectance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},Gj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(vc),c=Ew(bc),s=Ew(Ac),d=Ew(Sr),h=Ew(Yc),p=Ew(Lc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicDish),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.absorptance)&&void 0!==t?t:.95),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.absorptance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.absorptance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.absorptance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicDish&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.absorptance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.absorptance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.absorptance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Absorptance for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&v.set(A.id,A.absorptance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Absorptance for All Parabolic Dishes",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicDish,P.newValue)}};d(P),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===m.foundationId&&j.set(z.id,z.absorptance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Absorptance for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicDish,R.groupId,R.newValue)}};d(R),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.absorptance:m.absorptance,W={name:"Set Parabolic Dish Absorptance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicDishAbsorptance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},Xj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Tc),c=Ew(Pc),s=Ew(Sc),d=Ew(Sr),h=Ew(Yc),p=Ew(Lc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicDish),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.opticalEfficiency)&&void 0!==t?t:.7),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.opticalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.opticalEfficiency-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.opticalEfficiency-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicDish&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.opticalEfficiency-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.opticalEfficiency)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.opticalEfficiency)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Optical Efficiency for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&v.set(A.id,A.opticalEfficiency)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Optical Efficiency for All Parabolic Dishes",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicDish,P.newValue)}};d(P),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===m.foundationId&&j.set(z.id,z.opticalEfficiency)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Optical Efficiency for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicDish,R.groupId,R.newValue)}};d(R),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.opticalEfficiency:m.opticalEfficiency,W={name:"Set Parabolic Dish Optical Efficiency",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicDishOpticalEfficiency=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",A),onApply:function(){P(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},Bj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(jc),c=Ew(Hc),s=Ew(zc),d=Ew(Sr),h=Ew(Yc),p=Ew(Lc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicDish),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.thermalEfficiency)&&void 0!==t?t:.3),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.thermalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.thermalEfficiency-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.thermalEfficiency-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicDish&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.thermalEfficiency-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.thermalEfficiency)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.thermalEfficiency)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Thermal Efficiency for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&v.set(A.id,A.thermalEfficiency)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Thermal Efficiency for All Parabolic Dishes",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicDish,P.newValue)}};d(P),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===m.foundationId&&j.set(z.id,z.thermalEfficiency)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Thermal Efficiency for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicDish,R.groupId,R.newValue)}};d(R),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.thermalEfficiency:m.thermalEfficiency,W={name:"Set Parabolic Dish Thermal Efficiency",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicDishThermalEfficiency=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},Kj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Yc),s=Ew(Lc),d=Ew(Ii),h=Ew(Ci),p=OP(V.ParabolicDish),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.structureType)&&void 0!==t?t:J.CentralPole),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=db.a.Option,b=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&i.type===V.ParabolicDish){i.structureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.foundationId!==e||i.locked||i.type===V.ParabolicDish&&(i.structureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.locked||o.type===V.ParabolicDish&&(o.structureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},P=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.structureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.structureType!==e)return!0}}catch(h){l.e(h)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.ParabolicDish&&!n.locked&&n.structureType!==e)return!0}}catch(h){r.e(h)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.ParabolicDish&&u.foundationId===(null===p||void 0===p?void 0:p.foundationId)&&!u.locked&&u.structureType!==e)return!0}}catch(h){d.e(h)}finally{d.f()}break;default:if((null===p||void 0===p?void 0:p.structureType)!==e)return!0}return!1}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var s=t.value;s.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(s.id)&&l.set(s.id,s.structureType)}}catch(I){r.e(I)}finally{r.f()}var y={name:"Set Structure Type for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(y.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P(y.oldValues,y.newValue)}};n(y),P(l,e),h(d+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.ParabolicDish&&m.set(x.id,x.structureType)}}catch(I){w.e(I)}finally{w.f()}var v={name:"Set Structure Type for All Parabolic Dishes",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(v.newValue)}};n(v),T(e),h(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===p.foundationId&&j.set(z.id,z.structureType)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Structure Type for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:p.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&A(R.groupId,R.newValue)}};n(R),A(p.foundationId,e),h(d+1)}break;default:var D=i(p.id),M=D?D.structureType:p.structureType,W={name:"Set Parabolic Dish Structure Type",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){b(W.changedElementId,W.oldValue)},redo:function(){b(W.changedElementId,W.newValue)}};n(W),b(p.id,e),h(d+1)}a((function(t){t.actionState.parabolicDishReceiverStructure=e}))}};return(null===p||void 0===p?void 0:p.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:640,title:me.t("parabolicDishMenu.ReceiverStructure",x),onApply:function(){S(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsxs)(db.a,{value:m,onChange:function(e){return w(e)},children:[Object(gf.jsx)(v,{value:J.CentralPole,children:me.t("parabolicDishMenu.CentralPole",x)},J.CentralPole),Object(gf.jsx)(v,{value:J.CentralPoleWithTripod,children:me.t("parabolicDishMenu.CentralPoleWithTripod",x)},J.CentralPoleWithTripod),Object(gf.jsx)(v,{value:J.Quadrupod,children:me.t("parabolicDishMenu.Quadrupod",x)},J.Quadrupod)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){s(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",x)})]})})})]})})},qj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(pc),c=Ew(yc),s=Ew(gc),d=Ew($r),h=Ew(Sr),p=Ew(Yc),y=Ew(Lc),g=Ew(Ii),m=Ew(Ci),w=OP(V.ParabolicDish),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.poleRadius)&&void 0!==t?t:.1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=$f(),P=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.poleRadius=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(w&&function(e){if(w){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleRadius-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.poleRadius-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.ParabolicDish&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleRadius-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(w)){var m,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.ParabolicDish&&v.parentId===w.parentId&&!v.locked){var b=v;if(Math.abs(b.poleRadius-e)>At)return!0}}}catch(A){x.e(A)}finally{x.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.poleRadius)-e)>At)return!0}return!1}}(e)){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(y.id)&&l.set(y.id,y.poleRadius)}}catch(C){r.e(C)}finally{r.f()}var x={name:"Set Pole Radius for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){P(x.oldValues,x.newValue)}};h(x),P(l,e),m(g+1);break;case _.AllObjectsOfThisType:var v,b=new Map,A=Object(f.a)(o);try{for(A.s();!(v=A.n()).done;){var T=v.value;T.type===V.ParabolicDish&&b.set(T.id,T.poleRadius)}}catch(C){A.e(C)}finally{A.f()}var S={name:"Set Pole Radius for All Parabolic Dishes",timestamp:Date.now(),oldValues:b,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){s(V.ParabolicDish,S.newValue)}};h(S),s(V.ParabolicDish,e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var j,H=new Map,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type===V.ParabolicDish&&R.foundationId===w.foundationId&&H.set(R.id,R.poleRadius)}}catch(C){z.e(C)}finally{z.f()}var D={name:"Set Pole Radius for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:H,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){D.groupId&&c(V.ParabolicDish,D.groupId,D.newValue)}};h(D),c(V.ParabolicDish,w.foundationId,e),m(g+1)}break;default:var M=i(w.id),W=M?M.poleRadius:w.poleRadius,I={name:"Set Parabolic Dish Pole Radius",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(I.changedElementId,I.oldValue)},redo:function(){n(I.changedElementId,I.newValue)}};h(I),n(w.id,e),m(g+1)}a((function(t){t.actionState.parabolicDishPoleRadius=e}))}};return(null===w||void 0===w?void 0:w.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.PoleRadius",T),onApply:function(){S(b)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:.5,style:{width:120},step:.01,precision:2,value:b,onChange:A}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",T),": [0.1, 0.5] ",me.t("word.MeterAbbreviation",T)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",T)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",T)})]})})})]})})},Qj=n.a.memo((function(){var e,t,l,a,o=Ew(Vi),i=Ew(ac),n=Ew(Sr),c=Ew(Ci),s=OP(V.ParabolicDish),d=Object(r.useState)(!1),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)(!1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(!1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!1),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useState)(!1),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useState)(!1),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=zP(s),q=K.labelText,Q=K.setLabelText,Z=RP(s),_=DP(s,q),$=WP(s),ee=MP(s),te=IP(s),le=CP(s);if(!s)return null;var ae={lng:o},oe=!(null===s||void 0===s?void 0:s.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"parabolic-dish-copy",paddingLeft:"36px"}),oe&&Object(gf.jsx)(PP,{keyName:"parabolic-dish-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"parabolic-dish-lock"}),s&&oe&&Object(gf.jsxs)(gf.Fragment,{children:[b&&Object(gf.jsx)(Uj,{setDialogVisible:A}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),A(!0)},children:[me.t("parabolicDishMenu.RimDiameter",ae)," ..."]},"parabolic-dish-radius"),m&&Object(gf.jsx)(Vj,{setDialogVisible:w}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),w(!0)},children:[me.t("parabolicDishMenu.LatusRectum",ae)," ..."]},"parabolic-dish-latus-rectum"),h&&Object(gf.jsx)(Kj,{setDialogVisible:p}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),p(!0)},children:[me.t("parabolicDishMenu.ReceiverStructure",ae)," ..."]},"parabolic-dish-structure-type"),S&&Object(gf.jsx)(Nj,{setDialogVisible:j}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),j(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",ae)," ..."]},"parabolic-dish-pole-height"),R&&Object(gf.jsx)(qj,{setDialogVisible:D}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),D(!0)},children:[me.t("solarCollectorMenu.PoleRadius",ae)," ..."]},"parabolic-dish-pole-radius"),I&&Object(gf.jsx)(Jj,{setDialogVisible:C}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),C(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",ae)," ..."]},"parabolic-dish-reflectance"),k&&Object(gf.jsx)(Gj,{setDialogVisible:Y}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),Y(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",ae)," ..."]},"parabolic-dish-absorptance"),U&&Object(gf.jsx)(Xj,{setDialogVisible:N}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),N(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",ae)," ..."]},"parabolic-dish-optical-efficiency"),X&&Object(gf.jsx)(Bj,{setDialogVisible:B}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),B(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",ae)," ..."]},"parabolic-dish-thermal-efficiency"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.drawSunBeam),onChange:function(e){return function(e){if(s){var t={name:"Show Sun Beam",timestamp:Date.now(),checked:!s.drawSunBeam,selectedElementId:s.id,selectedElementType:V.ParabolicDish,undo:function(){i(s.id,!t.checked)},redo:function(){i(s.id,t.checked)}};n(t),i(s.id,e)}}(e.target.checked)},children:me.t("solarCollectorMenu.DrawSunBeam",ae)})},"parabolic-dish-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:Z,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"parabolic-dish-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",ae)+":",value:q,onChange:function(e){return Q(e.target.value)},onPressEnter:_,onBlur:_})},"parabolic-dish-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(e=s.labelHeight)&&void 0!==e?e:.2,onChange:function(e){return le(e)}})},"parabolic-dish-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",ae)+":",min:10,max:100,step:1,precision:0,value:null!==(t=s.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return ee(e)}})},"parabolic-dish-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=s.labelSize)&&void 0!==l?l:.2,onChange:function(e){return $(e)}})},"parabolic-dish-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",ae)+":",value:null!==(a=s.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return te(e.target.value)}})},"parabolic-dish-label-color")]})]},"parabolic-dish-label")]})]})})),Zj=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(Sn),n=Ew(jn),c=Ew(Hn),s=Ew($r),d=Ew(Sr),h=Ew(Mc),p=Ew(Wc),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.FresnelReflector),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.ly)&&void 0!==t?t:9),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useRef)(!1),P=Object(r.useRef)(),S=$f(),j=function(e,t){return!function(e,t){var l=s(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.FresnelReflector&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(a);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.FresnelReflector&&p.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!p.locked){var y=p;if(Math.abs(y.ly-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(P.current=void 0,h){case _.AllSelectedObjectsOfThisType:T.current=!1;var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(r.id)&&j(r,e)){T.current=!0;break}}}catch(X){l.e(X)}finally{l.f()}if(T.current)P.current=e,A(w.ly);else{var s,p=new Map,m=Object(f.a)(a);try{for(m.s();!(s=m.n()).done;){var x=s.value;x.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(x.id)&&p.set(x.id,x.ly)}}catch(X){m.e(X)}finally{m.f()}var v={name:"Set Length for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:p,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){H(v.oldValues,v.newValue)}};d(v),H(p,e),g(y+1)}break;case _.AllObjectsOfThisType:T.current=!1;var b,S=Object(f.a)(a);try{for(S.s();!(b=S.n()).done;){var z=b.value;if(z.type===V.FresnelReflector&&j(z,e)){T.current=!0;break}}}catch(X){S.e(X)}finally{S.f()}if(T.current)P.current=e,A(w.ly);else{var R,D=new Map,M=Object(f.a)(a);try{for(M.s();!(R=M.n()).done;){var W=R.value;W.type===V.FresnelReflector&&D.set(W.id,W.ly)}}catch(X){M.e(X)}finally{M.f()}var I={name:"Set Length for All Fresnel Reflectors",timestamp:Date.now(),oldValues:D,newValue:e,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){c(V.FresnelReflector,I.newValue)}};d(I),c(V.FresnelReflector,e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var C,O=Object(f.a)(a);try{for(O.s();!(C=O.n()).done;){var F=C.value;if(F.type===V.FresnelReflector&&F.foundationId===w.foundationId&&j(F,e)){T.current=!0;break}}}catch(X){O.e(X)}finally{O.f()}if(T.current)P.current=e,A(w.ly);else{var k,Y=new Map,L=Object(f.a)(a);try{for(L.s();!(k=L.n()).done;){var E=k.value;E.type===V.FresnelReflector&&E.foundationId===w.foundationId&&Y.set(E.id,E.ly)}}catch(X){L.e(X)}finally{L.f()}var U={name:"Set Length for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:Y,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(U.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){U.groupId&&n(V.FresnelReflector,U.groupId,U.newValue)}};d(U),n(V.FresnelReflector,w.foundationId,e),g(y+1)}}break;default:var N=o(w.id),J=N?N.ly:w.ly;if(T.current=j(w,e),T.current)P.current=e,A(J);else{var G={name:"Set Fresnel Reflector Length",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){i(G.changedElementId,G.oldValue)},redo:function(){i(G.changedElementId,G.newValue)}};d(G),i(w.id,e),g(y+1)}}},R=function(){T.current=!1,l(!1)};if((null===w||void 0===w?void 0:w.type)!==V.FresnelReflector)return null;var D=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(void 0!==P.current?" ("+P.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Length",S),rejectedMessage:D,onApply:function(){z(b)},onClose:R,onClickCancel:function(){R(),m()},onClickOk:function(){z(b),T.current||(l(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:w.moduleLength,max:200*w.moduleLength,step:w.moduleLength,style:{width:120},precision:2,value:b,onChange:function(e){A(function(e){if(!w)return 1;var t=null!==e&&void 0!==e?e:1;return Math.max(1,Math.ceil((t-w.moduleLength/2)/w.moduleLength))*w.moduleLength}(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("fresnelReflectorMenu.ModuleLength",S)+": "+w.moduleLength.toFixed(1)+" "+me.t("word.MeterAbbreviation",S),Object(gf.jsx)("br",{}),Math.round(b/w.moduleLength)+" "+me.t("fresnelReflectorMenu.ModulesLong",S),Object(gf.jsx)("br",{}),me.t("word.Maximum",S),": 200 ",me.t("fresnelReflectorMenu.Modules",S)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",S)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",S)})]})})})]})})},_j=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=(Ew(Vi),Ew(Fi)),i=Ew(Zr),n=Ew(An),c=Ew(Tn),s=Ew(Pn),d=Ew($r),h=Ew(Sr),p=Ew(Mc),y=Ew(Wc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.FresnelReflector),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.lx)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.lx=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.FresnelReflector&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.lx-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.lx)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Width for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.FresnelReflector&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.lx);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.FresnelReflector&&M.set(I.id,I.lx)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Width for All Fresnel Reflectors",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.FresnelReflector,C.newValue)}};h(C),s(V.FresnelReflector,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.FresnelReflector&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.lx);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.FresnelReflector&&U.foundationId===x.foundationId&&L.set(U.id,U.lx)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Width for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.FresnelReflector,N.groupId,N.newValue)}};h(N),c(V.FresnelReflector,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.lx:x.lx;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Fresnel Reflector Width",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.fresnelReflectorWidth=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.FresnelReflector)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Width",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 10 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",j)})]})})})]})})},$j=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(dc),s=Ew(fc),d=Ew(hc),h=Ew($r),p=Ew(Sr),y=Ew(Mc),g=Ew(Wc),m=Ew(Ii),w=Ew(Ci),x=Ew(Oi),v=OP(V.FresnelReflector),b=Object(r.useState)(null!==(t=null===v||void 0===v?void 0:v.poleHeight)&&void 0!==t?t:1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useRef)(!1),j=Object(r.useRef)(),H=Object(r.useRef)(null!==(l=null===v||void 0===v?void 0:v.poleHeight)&&void 0!==l?l:1),z=$f(),R=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.poleHeight=t)}}catch(r){o.e(r)}finally{o.f()}}))},D=function(e){if(v&&function(e){if(v){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(Math.abs(o.poleHeight-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(i);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.FresnelReflector&&p.foundationId===(null===v||void 0===v?void 0:v.foundationId)&&!p.locked){var g=p;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(A){u.e(A)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(h(v)){var m,w=Object(f.a)(i);try{for(w.s();!(m=w.n()).done;){var x=m.value;if(x.type===V.FresnelReflector&&x.parentId===v.parentId&&!x.locked){var b=x;if(Math.abs(b.poleHeight-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}}break;default:if(Math.abs((null===v||void 0===v?void 0:v.poleHeight)-e)>At)return!0}return!1}}(e)){switch(j.current=void 0,y){case _.AllSelectedObjectsOfThisType:S.current=!1;var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(a.id)&&.5*a.ly*Math.abs(Math.sin(a.tiltAngle))>e){S.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(S.current)j.current=e,H.current=v.poleHeight;else{var r,g=new Map,x=Object(f.a)(i);try{for(x.s();!(r=x.n()).done;){var b=r.value;b.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(b.id)&&g.set(b.id,b.poleHeight)}}catch(B){x.e(B)}finally{x.f()}var A={name:"Set Pole Height for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){R(A.oldValues,A.newValue)}};p(A),R(g,e),w(m+1)}break;case _.AllObjectsOfThisType:S.current=!1;var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var z=T.value;if(z.type===V.FresnelReflector&&.5*z.ly*Math.abs(Math.sin(z.tiltAngle))>e){S.current=!0;break}}}catch(B){P.e(B)}finally{P.f()}if(S.current)j.current=e,H.current=v.poleHeight;else{var D,M=new Map,W=Object(f.a)(i);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.FresnelReflector&&M.set(I.id,I.poleHeight)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Pole Height for All Fresnel Reflectors",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){d(V.FresnelReflector,C.newValue)}};p(C),d(V.FresnelReflector,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){S.current=!1;var O,F=Object(f.a)(i);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.FresnelReflector&&k.foundationId===v.foundationId&&.5*k.ly*Math.abs(Math.sin(k.tiltAngle))>e){S.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(S.current)j.current=e,H.current=v.poleHeight;else{var Y,L=new Map,E=Object(f.a)(i);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.FresnelReflector&&U.foundationId===v.foundationId&&L.set(U.id,U.poleHeight)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Pole Height for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&s(V.FresnelReflector,N.groupId,N.newValue)}};p(N),s(V.FresnelReflector,v.foundationId,e),w(m+1)}}break;default:var J=n(v.id),G=J?J.poleHeight:v.poleHeight;if(S.current=.5*v.lx*Math.abs(Math.sin(v.tiltAngle))>e,S.current)j.current=e,H.current=G;else{var X={name:"Set Fresnel Reflector Pole Height",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){c(X.changedElementId,X.oldValue)},redo:function(){c(X.changedElementId,X.newValue)}};p(X),c(v.id,e),w(m+1)}}o((function(t){t.actionState.fresnelReflectorPoleHeight=e}))}},M=function(){a(!1)};if((null===v||void 0===v?void 0:v.type)!==V.FresnelReflector)return null;var W=S.current?": "+me.t("message.NotApplicableToSelectedAction",z)+(void 0!==j.current?" ("+j.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",z),rejectedMessage:W,onApply:function(){D(T)},onClose:M,onClickCancel:function(){M(),x()},onClickOk:function(){D(T),S.current||(a(!1),w(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:T,onChange:P}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",z),": [0, 5] ",me.t("word.MeterAbbreviation",z)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",z)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",z)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",z)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",z)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",z)})]})})})]})})},eH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Vc),c=Ew(Jc),s=Ew(Gc),d=Ew($r),h=Ew(Sr),p=Ew(Mc),y=Ew(Wc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.FresnelReflector),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.moduleLength)&&void 0!==t?t:3),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.moduleLength=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.moduleLength=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.moduleLength-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.moduleLength-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.FresnelReflector&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.moduleLength-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.moduleLength)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.moduleLength);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.moduleLength)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Module Length for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.FresnelReflector&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.moduleLength);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.FresnelReflector&&M.set(I.id,I.moduleLength)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Module Length for All Fresnel Reflectors",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.FresnelReflector,C.newValue)}};h(C),s(V.FresnelReflector,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.FresnelReflector&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.moduleLength);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.FresnelReflector&&U.foundationId===x.foundationId&&L.set(U.id,U.moduleLength)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Module Length for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.FresnelReflector,N.groupId,N.newValue)}};h(N),c(V.FresnelReflector,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.moduleLength:x.moduleLength;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Fresnel Reflector Module Length",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.fresnelReflectorModuleLength=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.FresnelReflector)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("fresnelReflectorMenu.ModuleLength",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 10 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",j)})]})})})]})})},tH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(mc),c=Ew(wc),s=Ew(xc),d=Ew(Sr),h=Ew(Mc),p=Ew(Wc),y=Ew(Ii),g=Ew(Ci),m=OP(V.FresnelReflector),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.reflectance)&&void 0!==t?t:.9),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.FresnelReflector&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.reflectance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.reflectance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Reflectance for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.FresnelReflector&&v.set(A.id,A.reflectance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Reflectance for All Fresnel Reflectors",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.FresnelReflector,P.newValue)}};d(P),s(V.FresnelReflector,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.FresnelReflector&&z.foundationId===m.foundationId&&j.set(z.id,z.reflectance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Reflectance for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.FresnelReflector,R.groupId,R.newValue)}};d(R),c(V.FresnelReflector,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.reflectance:m.reflectance,W={name:"Set Fresnel Reflector Reflectance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.fresnelReflectorReflectance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.FresnelReflector?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,value:v,step:.01,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",A)})]})})})]})})},lH=db.a.Option,aH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Oc),c=Ew(Fc),s=Ew(kc),d=Ew(Sr),h=Ew(Mc),p=Ew(Wc),y=Ew(Ii),g=Ew(Ci),m=OP(V.FresnelReflector),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.receiverId)&&void 0!==t?t:"None"),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=Object(r.useMemo)((function(){var e,t=[],l=Object(f.a)(o);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Foundation){var i=a;i.solarStructure===G.FocusPipe&&t.push(i.id)}}}catch(r){l.e(r)}finally{l.f()}return t}),[o]);Object(r.useEffect)((function(){if(b("None"),m)if(m.receiverId)b(m.receiverId);else{var e=i(m.parentId);e&&e.type===V.Foundation&&e.solarStructure===G.FocusPipe&&b(e.id)}}),[m]);var P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;Tw.isHeliostatOrFresnelReflector(i.type)&&(!i.locked&&e.has(i.id)&&(i.type===V.Heliostat?i.towerId=t:i.type===V.FresnelReflector&&(i.receiverId=t)))}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(m&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.receiverId!==e)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.FresnelReflector&&!n.locked&&n.receiverId!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.FresnelReflector&&d.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!d.locked&&d.receiverId!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if((null===m||void 0===m?void 0:m.receiverId)!==e)return!0}return!1}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.receiverId)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Receiver for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P(w.oldValues,w.newValue)}};d(w),P(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.FresnelReflector&&v.set(A.id,A.receiverId)}}catch(I){b.e(I)}finally{b.f()}var T={name:"Set Receiver for All Fresnel Reflectors",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.FresnelReflector,T.newValue)}};d(T),s(V.FresnelReflector,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.FresnelReflector&&z.foundationId===m.foundationId&&j.set(z.id,z.receiverId)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Receiver for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.FresnelReflector,R.groupId,R.newValue)}};d(R),c(V.FresnelReflector,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.receiverId:m.receiverId,W={name:"Set Receiver for Fresnel Reflector",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.fresnelReflectorReceiver=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.FresnelReflector?null:Object(gf.jsx)(kP,{width:640,title:me.t("fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo",A),onApply:function(){v&&S(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsx)(db.a,{style:{width:"160px"},value:v,onChange:function(e){b(e)},children:T.map((function(e,t){return Object(gf.jsx)(lH,{value:e,children:me.t("fresnelReflectorMenu.AbsorberPipe",A)+" "+(t+1)},t)}))})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",A)})]})})})]})})},oH=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Zr),o=Ew(ac),i=Ew(oc),n=Ew(ic),c=Ew(Sr),s=Ew(Mc),d=Ew(Wc),h=Ew(Ii),p=Ew(Ci),y=OP(V.FresnelReflector),g=Object(r.useState)(!!(null===y||void 0===y?void 0:y.drawSunBeam)),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;Tw.isSolarCollectorType(i.type)&&(!i.locked&&i.type===V.FresnelReflector&&e.has(i.id)&&(i.drawSunBeam=t))}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e){if(y&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.FresnelReflector&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)&&o.drawSunBeam!==e)return!0}}catch(h){a.e(h)}finally{a.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(l);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.FresnelReflector&&!n.locked&&n.drawSunBeam!==e)return!0}}catch(h){r.e(h)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,d=Object(f.a)(l);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.FresnelReflector&&u.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!u.locked&&u.drawSunBeam!==e)return!0}}catch(h){d.e(h)}finally{d.f()}break;default:if((null===y||void 0===y?void 0:y.drawSunBeam)!==e)return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,r=new Map,d=Object(f.a)(l);try{for(d.s();!(t=d.n()).done;){var g=t.value;g.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(g.id)&&r.set(g.id,g.drawSunBeam)}}catch(W){d.e(W)}finally{d.f()}var m={name:"Draw Sun Beam for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(m.oldValues,m.newValue)}};c(m),b(r,e),p(h+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(l);try{for(v.s();!(w=v.n()).done;){var A=w.value;A.type===V.FresnelReflector&&x.set(A.id,A.drawSunBeam)}}catch(W){v.e(W)}finally{v.f()}var T={name:"Draw Sun Beam for All Fresnel Reflectors",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){n(V.FresnelReflector,T.newValue)}};c(T),n(V.FresnelReflector,e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var P,S=new Map,j=Object(f.a)(l);try{for(j.s();!(P=j.n()).done;){var H=P.value;H.type===V.FresnelReflector&&H.foundationId===y.foundationId&&S.set(H.id,H.drawSunBeam)}}catch(W){j.e(W)}finally{j.f()}var z={name:"Draw Sun Beam for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){z.groupId&&i(V.FresnelReflector,z.groupId,z.newValue)}};c(z),i(V.FresnelReflector,y.foundationId,e),p(h+1)}break;default:var R=a(y.id),D=R?R.drawSunBeam:y.drawSunBeam,M={name:"Draw Sun Beam for Fresnel Reflector",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){o(M.changedElementId,M.oldValue)},redo:function(){o(M.changedElementId,M.newValue)}};c(M),o(y.id,e),p(h+1)}};return(null===y||void 0===y?void 0:y.type)!==V.FresnelReflector?null:Object(gf.jsx)(kP,{width:500,title:me.t("solarCollectorMenu.DrawSunBeam",v),onApply:function(){A(w)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:4,children:Object(gf.jsx)(eb.a,{checked:w,onChange:function(e){x(e)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",v)})]})})})]})})},iH=n.a.memo((function(){var e,t,l,a,o=Ew(Vi),i=Ew(Ci),n=OP(V.FresnelReflector),c=Object(r.useState)(!1),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),O=C[0],F=C[1],k=zP(n),Y=k.labelText,L=k.setLabelText,E=RP(n),U=DP(n,Y),N=WP(n),J=MP(n),G=IP(n),X=CP(n);if(!n)return null;var B={lng:o},K=!(null===n||void 0===n?void 0:n.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"fresnel-reflector-copy",paddingLeft:"36px"}),K&&Object(gf.jsx)(PP,{keyName:"fresnel-reflector-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"fresnel-reflector-lock"}),n&&K&&Object(gf.jsxs)(gf.Fragment,{children:[M&&Object(gf.jsx)(aH,{setDialogVisible:W}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),W(!0)},children:[me.t("fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo",B)," ..."]},"fresnel-reflector-receiver"),x&&Object(gf.jsx)(Zj,{setDialogVisible:v}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),v(!0)},children:[me.t("word.Length",B)," ..."]},"fresnel-reflector-length"),y&&Object(gf.jsx)(_j,{setDialogVisible:g}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),g(!0)},children:[me.t("word.Width",B)," ..."]},"fresnel-reflector-width"),d&&Object(gf.jsx)(eH,{setDialogVisible:f}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),f(!0)},children:[me.t("fresnelReflectorMenu.ModuleLength",B)," ..."]},"fresnel-reflector-module-length"),T&&Object(gf.jsx)($j,{setDialogVisible:P}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),P(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",B)," ..."]},"fresnel-reflector-pole-height"),H&&Object(gf.jsx)(tH,{setDialogVisible:z}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),z(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",B)," ..."]},"fresnel-reflector-reflectance"),O&&Object(gf.jsx)(oH,{setDialogVisible:F}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),F(!0)},children:[me.t("solarCollectorMenu.DrawSunBeam",B)," ..."]},"fresnel-reflector-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",B),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===n||void 0===n?void 0:n.showLabel),onChange:E,children:me.t("labelSubMenu.KeepShowingLabel",B)})},"fresnel-reflector-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.Label",B)+":",value:Y,onChange:function(e){return L(e.target.value)},onPressEnter:U,onBlur:U})},"fresnel-reflector-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",B)+":",min:.2,max:5,step:.1,precision:1,value:null!==(e=n.labelHeight)&&void 0!==e?e:.2,onChange:function(e){return X(e)}})},"fresnel-reflector-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",B)+":",min:10,max:100,step:1,precision:0,value:null!==(t=n.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return J(e)}})},"fresnel-reflector-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",B)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=n.labelSize)&&void 0!==l?l:.2,onChange:function(e){return N(e)}})},"fresnel-reflector-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",B)+":",value:null!==(a=n.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return G(e.target.value)}})},"fresnel-reflector-label-color")]})]},"fresnel-reflector-label")]})]})})),rH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sn),c=Ew(jn),s=Ew(Hn),d=Ew($r),h=Ew(Sr),p=Ew(Ic),y=Ew(Cc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.Heliostat),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.ly)&&void 0!==t?t:4),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.ly-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.Heliostat&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.ly-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.ly)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.ly);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.ly)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Width for Selected Heliostats",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.Heliostat&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.ly);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.Heliostat&&M.set(I.id,I.ly)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Width for All Heliostats",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.Heliostat,C.newValue)}};h(C),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.Heliostat&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.ly);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.Heliostat&&U.foundationId===x.foundationId&&L.set(U.id,U.ly)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Width for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.Heliostat,N.groupId,N.newValue)}};h(N),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.ly:x.ly;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Heliostat Width",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatWidth=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.Heliostat)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Width",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 20 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",j)})]})})})]})})},nH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(An),c=Ew(Tn),s=Ew(Pn),d=Ew($r),h=Ew(Sr),p=Ew(Ic),y=Ew(Cc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.Heliostat),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.lx)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.lx=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.Heliostat&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.lx-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.lx)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Length for Selected Heliostats",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.Heliostat&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.lx);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.Heliostat&&M.set(I.id,I.lx)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Length for All Heliostats",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.Heliostat,C.newValue)}};h(C),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.Heliostat&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.lx);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.Heliostat&&U.foundationId===x.foundationId&&L.set(U.id,U.lx)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Length for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.Heliostat,N.groupId,N.newValue)}};h(N),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.lx:x.lx;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Heliostat Length",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatLength=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.Heliostat)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Length",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 20 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",j)})]})})})]})})},cH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(dc),c=Ew(fc),s=Ew(hc),d=Ew($r),h=Ew(Sr),p=Ew(Ic),y=Ew(Cc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.Heliostat),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.poleHeight)&&void 0!==t?t:1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.poleHeight=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.Heliostat&&y.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var v=m.value;if(v.type===V.Heliostat&&v.parentId===x.parentId&&!v.locked){var b=v;if(Math.abs(b.poleHeight-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}}break;default:if(Math.abs((null===x||void 0===x?void 0:x.poleHeight)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*Math.max(r.lx,r.ly)*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(f.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(b.id)&&w.set(b.id,b.poleHeight)}}catch(B){v.e(B)}finally{v.f()}var A={name:"Set Pole Height for Selected Heliostats",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){H(A.oldValues,A.newValue)}};h(A),H(w,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var j,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;if(R.type===V.Heliostat&&.5*Math.max(R.lx,R.ly)*Math.abs(Math.sin(R.tiltAngle))>e){P.current=!0;break}}}catch(B){z.e(B)}finally{z.f()}if(P.current)S.current=e,T(x.poleHeight);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.Heliostat&&M.set(I.id,I.poleHeight)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Pole Height for All Heliostats",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.Heliostat,C.newValue)}};h(C),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.Heliostat&&k.foundationId===x.foundationId&&.5*Math.max(k.lx,k.ly)*Math.abs(Math.sin(k.tiltAngle))>e){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.poleHeight);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.Heliostat&&U.foundationId===x.foundationId&&L.set(U.id,U.poleHeight)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Pole Height for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.Heliostat,N.groupId,N.newValue)}};h(N),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.poleHeight:x.poleHeight;if(P.current=.5*Math.max(x.lx,x.ly)*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(G);else{var X={name:"Set Heliostat Pole Height",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatPoleHeight=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.Heliostat)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",j),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [0, 5] ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",j)})]})})})]})})},sH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(mc),c=Ew(wc),s=Ew(xc),d=Ew(Sr),h=Ew(Ic),p=Ew(Cc),y=Ew(Ii),g=Ew(Ci),m=OP(V.Heliostat),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.reflectance)&&void 0!==t?t:.9),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Heliostat&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.reflectance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.reflectance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Reflectance for Selected Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.Heliostat&&v.set(A.id,A.reflectance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Reflectance for All Heliostats",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.Heliostat,P.newValue)}};d(P),s(V.Heliostat,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.Heliostat&&z.foundationId===m.foundationId&&j.set(z.id,z.reflectance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Reflectance for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.Heliostat,R.groupId,R.newValue)}};d(R),c(V.Heliostat,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.reflectance:m.reflectance,W={name:"Set Heliostat Reflectance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.heliostatReflectance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.Heliostat?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){P(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",A)})]})})})]})})},dH=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Zr),o=Ew(ac),i=Ew(oc),n=Ew(ic),c=Ew(Sr),s=Ew(Ic),d=Ew(Cc),h=Ew(Ii),p=Ew(Ci),y=OP(V.Heliostat),g=Object(r.useState)(!!(null===y||void 0===y?void 0:y.drawSunBeam)),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.drawSunBeam=t)}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e){if(y&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Heliostat&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)&&o.drawSunBeam!==e)return!0}}catch(h){a.e(h)}finally{a.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(l);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Heliostat&&!n.locked&&n.drawSunBeam!==e)return!0}}catch(h){r.e(h)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,d=Object(f.a)(l);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Heliostat&&u.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!u.locked&&u.drawSunBeam!==e)return!0}}catch(h){d.e(h)}finally{d.f()}break;default:if((null===y||void 0===y?void 0:y.drawSunBeam)!==e)return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,r=new Map,d=Object(f.a)(l);try{for(d.s();!(t=d.n()).done;){var g=t.value;g.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(g.id)&&r.set(g.id,g.drawSunBeam)}}catch(W){d.e(W)}finally{d.f()}var m={name:"Draw Sun Beam for Selected Heliostats",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(m.oldValues,m.newValue)}};c(m),b(r,e),p(h+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(l);try{for(v.s();!(w=v.n()).done;){var A=w.value;A.type===V.Heliostat&&x.set(A.id,A.drawSunBeam)}}catch(W){v.e(W)}finally{v.f()}var T={name:"Draw Sun Beam for All Heliostats",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){n(V.Heliostat,T.newValue)}};c(T),n(V.Heliostat,e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var P,S=new Map,j=Object(f.a)(l);try{for(j.s();!(P=j.n()).done;){var H=P.value;H.type===V.Heliostat&&H.foundationId===y.foundationId&&S.set(H.id,H.drawSunBeam)}}catch(W){j.e(W)}finally{j.f()}var z={name:"Draw Sun Beam for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){z.groupId&&i(V.Heliostat,z.groupId,z.newValue)}};c(z),i(V.Heliostat,y.foundationId,e),p(h+1)}break;default:var R=a(y.id),D=R?R.drawSunBeam:y.drawSunBeam,M={name:"Draw Sun Beam for Heliostat",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){o(M.changedElementId,M.oldValue)},redo:function(){o(M.changedElementId,M.newValue)}};c(M),o(y.id,e),p(h+1)}};return(null===y||void 0===y?void 0:y.type)!==V.Heliostat?null:Object(gf.jsx)(kP,{width:500,title:me.t("solarCollectorMenu.DrawSunBeam",v),onApply:function(){A(w)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:4,children:Object(gf.jsx)(eb.a,{checked:w,onChange:x})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",v)})]})})})]})})},uH=db.a.Option,fH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Oc),c=Ew(Fc),s=Ew(kc),d=Ew(Sr),h=Ew(Ic),p=Ew(Cc),y=Ew(Ii),g=Ew(Ci),m=OP(V.Heliostat),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.towerId)&&void 0!==t?t:"None"),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=Object(r.useMemo)((function(){var e,t=[],l=Object(f.a)(o);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Foundation){var i=a;i.solarStructure===G.FocusTower&&t.push(i.id)}}}catch(r){l.e(r)}finally{l.f()}return t}),[o]);Object(r.useEffect)((function(){if(b("None"),m)if(m.towerId)b(m.towerId);else{var e=i(m.parentId);e&&e.type===V.Foundation&&e.solarStructure===G.FocusTower&&b(e.id)}}),[m]);var P=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.towerId=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(m&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.towerId!==e)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Heliostat&&!n.locked&&n.towerId!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Heliostat&&d.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!d.locked&&d.towerId!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if((null===m||void 0===m?void 0:m.towerId)!==e)return!0}return!1}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.towerId)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Tower for Selected Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P(w.oldValues,w.newValue)}};d(w),P(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.Heliostat&&v.set(A.id,A.towerId)}}catch(I){b.e(I)}finally{b.f()}var T={name:"Set Tower for All Heliostats",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.Heliostat,T.newValue)}};d(T),s(V.Heliostat,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.Heliostat&&z.foundationId===m.foundationId&&j.set(z.id,z.towerId)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Tower for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.Heliostat,R.groupId,R.newValue)}};d(R),c(V.Heliostat,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.towerId:m.towerId,W={name:"Set Tower for Heliostat",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.heliostatTower=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.Heliostat?null:Object(gf.jsx)(kP,{width:600,title:me.t("heliostatMenu.SelectTowerToReflectSunlightTo",A),onApply:function(){v&&S(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)(db.a,{style:{width:"120px"},value:v,onChange:b,children:T.map((function(e,t){return Object(gf.jsx)(uH,{value:e,children:me.t("heliostatMenu.Tower",A)+" "+(t+1)},t)}))})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",A)})]})})})]})})},hH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(pc),c=Ew(yc),s=Ew(gc),d=Ew($r),h=Ew(Sr),p=Ew(Ic),y=Ew(Cc),g=Ew(Ii),m=Ew(Ci),w=OP(V.Heliostat),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.poleRadius)&&void 0!==t?t:.1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=$f(),P=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.poleRadius=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(w&&function(e){if(w){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleRadius-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.poleRadius-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.Heliostat&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleRadius-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(w)){var m,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Heliostat&&v.parentId===w.parentId&&!v.locked){var b=v;if(Math.abs(b.poleRadius-e)>At)return!0}}}catch(A){x.e(A)}finally{x.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.poleRadius)-e)>At)return!0}return!1}}(e)){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(y.id)&&l.set(y.id,y.poleRadius)}}catch(C){r.e(C)}finally{r.f()}var x={name:"Set Pole Radius for Selected Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){P(x.oldValues,x.newValue)}};h(x),P(l,e),m(g+1);break;case _.AllObjectsOfThisType:var v,b=new Map,A=Object(f.a)(o);try{for(A.s();!(v=A.n()).done;){var T=v.value;T.type===V.Heliostat&&b.set(T.id,T.poleRadius)}}catch(C){A.e(C)}finally{A.f()}var S={name:"Set Pole Radius for All Heliostats",timestamp:Date.now(),oldValues:b,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){s(V.Heliostat,S.newValue)}};h(S),s(V.Heliostat,e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var j,H=new Map,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type===V.Heliostat&&R.foundationId===w.foundationId&&H.set(R.id,R.poleRadius)}}catch(C){z.e(C)}finally{z.f()}var D={name:"Set Pole Radius for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:H,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){D.groupId&&c(V.Heliostat,D.groupId,D.newValue)}};h(D),c(V.Heliostat,w.foundationId,e),m(g+1)}break;default:var M=i(w.id),W=M?M.poleRadius:w.poleRadius,I={name:"Set Heliostat Pole Radius",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(I.changedElementId,I.oldValue)},redo:function(){n(I.changedElementId,I.newValue)}};h(I),n(w.id,e),m(g+1)}a((function(t){t.actionState.heliostatPoleRadius=e}))}};return(null===w||void 0===w?void 0:w.type)!==V.Heliostat?null:Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.PoleRadius",T),onApply:function(){S(b)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:.5,style:{width:120},step:.01,precision:2,value:b,onChange:A}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",T),": [0.1, 0.5] ",me.t("word.MeterAbbreviation",T)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",T)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",T)})]})})})]})})},pH=n.a.memo((function(){var e,t,l,a,o=Ew(Vi),i=Ew(Ci),n=OP(V.Heliostat),c=Object(r.useState)(!1),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),O=C[0],F=C[1],k=zP(n),Y=k.labelText,L=k.setLabelText,E=RP(n),U=DP(n,Y),N=WP(n),J=MP(n),G=IP(n),X=CP(n);if(!n)return null;var B={lng:o},K=!(null===n||void 0===n?void 0:n.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"heliostat-copy",paddingLeft:"36px"}),K&&Object(gf.jsx)(PP,{keyName:"heliostat-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"heliostat-lock"}),n&&K&&Object(gf.jsxs)(gf.Fragment,{children:[O&&Object(gf.jsx)(fH,{setDialogVisible:F}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),F(!0)},children:[me.t("heliostatMenu.SelectTowerToReflectSunlightTo",B)," ..."]},"heliostat-tower"),y&&Object(gf.jsx)(nH,{setDialogVisible:g}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),g(!0)},children:[me.t("word.Length",B)," ..."]},"heliostat-length"),d&&Object(gf.jsx)(rH,{setDialogVisible:f}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),f(!0)},children:[me.t("word.Width",B)," ..."]},"heliostat-width"),x&&Object(gf.jsx)(cH,{setDialogVisible:v}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),v(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",B)," ..."]},"heliostat-pole-height"),T&&Object(gf.jsx)(hH,{setDialogVisible:P}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),P(!0)},children:[me.t("solarCollectorMenu.PoleRadius",B)," ..."]},"heliostat-pole-radius"),H&&Object(gf.jsx)(sH,{setDialogVisible:z}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),z(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",B)," ..."]},"heliostat-reflectance"),M&&Object(gf.jsx)(dH,{setDialogVisible:W}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),W(!0)},children:[me.t("solarCollectorMenu.DrawSunBeam",B)," ..."]},"heliostat-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",B),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===n||void 0===n?void 0:n.showLabel),onChange:E,children:me.t("labelSubMenu.KeepShowingLabel",B)})},"heliostat-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.Label",B)+":",value:Y,onChange:function(e){return L(e.target.value)},onPressEnter:U,onBlur:U})},"heliostat-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",B)+":",min:.2,max:5,step:.1,precision:1,value:null!==(e=n.labelHeight)&&void 0!==e?e:.2,onChange:function(e){return X(e)}})},"heliostat-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",B)+":",min:10,max:100,step:1,precision:0,value:null!==(t=n.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return J(e)}})},"heliostat-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",B)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=n.labelSize)&&void 0!==l?l:.2,onChange:function(e){return N(e)}})},"heliostat-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",B)+":",value:null!==(a=n.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return G(e.target.value)}})},"heliostat-label-color")]})]},"heliostat-label")]})]})})),yH=db.a.Option,gH=function(){var e,t=Ew(si),l=Ew(Vi),a=Ew(Sr),o=Ew.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},h=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Tree&&i.id===e){i.name=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(db.a,{style:{width:"160px"},value:null!==(e=null===o||void 0===o?void 0:o.name)&&void 0!==e?e:oe.Pine,onChange:function(e){if(o){var l=o.name;if(l!==e){var i={name:"Change Tree",timestamp:Date.now(),oldValue:l,newValue:e,changedElementId:o.id,changedElementType:o.type,undo:function(){h(i.changedElementId,i.oldValue)},redo:function(){h(i.changedElementId,i.newValue)}};a(i),h(o.id,e),t((function(t){t.actionState.treeType=e})),s(!c)}}},children:[Object(gf.jsxs)(yH,{value:oe.Apple,children:[Object(gf.jsx)("img",{alt:oe.Apple,src:dx,height:20,style:{paddingRight:"8px"}})," ",me.t("tree.Apple",d)]},oe.Apple),Object(gf.jsxs)(yH,{value:oe.Birch,children:[Object(gf.jsx)("img",{alt:oe.Birch,src:px,height:20,style:{paddingRight:"20px"}})," ",me.t("tree.Birch",d)]},oe.Birch),Object(gf.jsxs)(yH,{value:oe.Coconut,children:[Object(gf.jsx)("img",{alt:oe.Coconut,src:mx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.Coconut",d)]},oe.Coconut),Object(gf.jsxs)(yH,{value:oe.Dogwood,children:[Object(gf.jsx)("img",{alt:oe.Dogwood,src:xx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Dogwood",d)]},oe.Dogwood),Object(gf.jsxs)(yH,{value:oe.Elm,children:[Object(gf.jsx)("img",{alt:oe.Elm,src:Tx,height:20,style:{paddingRight:"20px"}}),me.t("tree.Elm",d)]},oe.Elm),Object(gf.jsxs)(yH,{value:oe.FanPalm,children:[Object(gf.jsx)("img",{alt:oe.FanPalm,src:jx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.FanPalm",d)]},oe.FanPalm),Object(gf.jsxs)(yH,{value:oe.Linden,children:[Object(gf.jsx)("img",{alt:oe.Linden,src:zx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Linden",d)]},oe.Linden),Object(gf.jsxs)(yH,{value:oe.Magnolia,children:[Object(gf.jsx)("img",{alt:oe.Magnolia,src:Wx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Magnolia",d)]},oe.Magnolia),Object(gf.jsxs)(yH,{value:oe.Maple,children:[Object(gf.jsx)("img",{alt:oe.Maple,src:Fx,height:20,style:{paddingRight:"12px"}})," ",me.t("tree.Maple",d)]},oe.Maple),Object(gf.jsxs)(yH,{value:oe.Oak,children:[Object(gf.jsx)("img",{alt:oe.Oak,src:Ex,height:20,style:{paddingRight:"17px"}}),me.t("tree.Oak",d)]},oe.Oak),Object(gf.jsxs)(yH,{value:oe.Pine,children:[Object(gf.jsx)("img",{alt:oe.Pine,src:Vx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.Pine",d)]},oe.Pine),Object(gf.jsxs)(yH,{value:oe.Spruce,children:[Object(gf.jsx)("img",{alt:oe.Spruce,src:Jx,height:20,style:{paddingRight:"20px"}})," ",me.t("tree.Spruce",d)]},oe.Spruce)]})},mH=n.a.memo((function(){var e,t,l,a,o,i,n=Ew(si),c=Ew(Vi),s=Ew(An),d=Ew(zn),h=OP(V.Tree),p=Ew(Sr),y=Object(r.useState)(null!==(e=null===h||void 0===h?void 0:h.lx)&&void 0!==e?e:1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.lz)&&void 0!==t?t:1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=zP(h),P=T.labelText,S=T.setLabelText,j=RP(h),H=DP(h,P),z=WP(h),R=MP(h),D=IP(h),M=CP(h);if(!h)return null;var W={lng:c},I=!(null===h||void 0===h?void 0:h.locked),C=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Tree&&i.id===e){i.showModel=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},O=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Tree&&i.id===e){i.flip=t;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"tree-copy"}),I&&Object(gf.jsx)(PP,{keyName:"tree-cut"}),Object(gf.jsx)(SP,{keyName:"tree-lock"}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:(null===h||void 0===h?void 0:h.showModel)&&(null===h||void 0===h?void 0:h.type)===V.Tree,onChange:function(e){return function(e){if(h){var t={name:"Show Tree Model",timestamp:Date.now(),checked:e,selectedElementId:h.id,selectedElementType:V.Tree,undo:function(){C(h.id,!t.checked)},redo:function(){C(h.id,t.checked)}};p(t),C(h.id,e)}}(e.target.checked)},children:me.t("treeMenu.ShowModel",W)})},"tree-show-model"),I&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:h.flip,onChange:function(e){var t=e.target.checked,l={name:"Flip Tree",timestamp:Date.now(),checked:t,selectedElementId:h.id,selectedElementType:V.Tree,undo:function(){O(h.id,!l.checked)},redo:function(){O(h.id,l.checked)}};p(l),O(h.id,t)},children:me.t("treeMenu.Flip",{lng:c})})},"tree-flip"),I&&Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"100px"},children:[me.t("treeMenu.Type",W),": "]}),Object(gf.jsx)(gH,{},"trees")]},"tree-change-type"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"100px"},children:[me.t("treeMenu.Spread",W)+" ("+me.t("word.MeterAbbreviation",W)+")",":"]}),Object(gf.jsx)($v.a,{style:{width:"160px"},min:1,max:50,step:1,precision:1,value:m,onChange:function(e){return function(e){if(h&&e&&e!==m){var t={name:"Set Tree Spread",timestamp:Date.now(),oldValue:m,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){s(t.changedElementId,t.oldValue)},redo:function(){s(t.changedElementId,t.newValue)}};p(t),s(h.id,e),w(e),n((function(t){t.actionState.treeSpread=e}))}}(e)}})]},"tree-spread"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"100px"},children:[me.t("word.Height",W)+" ("+me.t("word.MeterAbbreviation",W)+")",":"]}),Object(gf.jsx)($v.a,{style:{width:"160px"},min:1,max:30,step:1,precision:1,value:b,onChange:function(e){return function(e){if(h&&e&&e!==b){var t={name:"Set Tree Height",timestamp:Date.now(),oldValue:b,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){d(t.changedElementId,t.oldValue)},redo:function(){d(t.changedElementId,t.newValue)}};p(t),d(h.id,e),A(e),n((function(t){t.actionState.treeHeight=e}))}}(e)}})]},"tree-height")]}),I&&Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",W),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===h||void 0===h?void 0:h.showLabel),onChange:j,children:me.t("labelSubMenu.KeepShowingLabel",W)})},"tree-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",W)+":",value:P,onChange:function(e){return S(e.target.value)},onPressEnter:H,onBlur:H})},"tree-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",W)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=h.labelHeight)&&void 0!==l?l:.2,onChange:function(e){return M(e)}})},"tree-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",W)+":",min:10,max:100,step:1,precision:0,value:null!==(a=h.labelFontSize)&&void 0!==a?a:20,onChange:function(e){return R(e)}})},"tree-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",W)+":",min:.2,max:5,step:.1,precision:1,value:null!==(o=h.labelSize)&&void 0!==o?o:.2,onChange:function(e){return z(e)}})},"tree-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",W)+":",value:null!==(i=h.labelColor)&&void 0!==i?i:"#ffffff",onChange:function(e){return D(e.target.value)}})},"tree-label-color")]})]},"tree-label")]})})),wH=l(806),xH="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH5QsaESMnxG6tNgAAARJJREFUeJzt2kFqQkEQhOHpoeahXtN4rEDwCgm4EBEMARMI2YXkDAbeCaJu+wZdi/87QUHT46sZ4/Pr/dZgQ7336gxI1IKBOFHvUZ0BCUeWGQZihiPLjMaYqjMg0TzP1RmQxMNmTTE0EofjnoEY0Wq1rM6ARO3GgjhR0EOsKIIe4oSmboamboYNMaPGQKyo86NuhSPLDAMxw1eWGU0T7yFOdLn8VWdAoqfHbXUGJHF6PXLda0RjjOoMSNQaC+KEHmJGjasTK2yIGZq6GTbEDO8hZngPMcORZYaBmOEry4wWS/7b60S/3z/VGZDo5XlXnQFJnD/euO41ouv/tToDEtELvdBDzPAeYoYNMcNAzHB1YuYO6bYjJ2+wRTUAAAAASUVORK5CYII=",vH="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAIAAAAlV+npAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QsaESMX4redmgAAARNJREFUaIHt2sGtwjAQBFB2PY6ggbSc+//0AI2AOCMOiIgOkgKQENDC7mk10rwKRqvYsie2ZVk3EgNvVp2BBtxadQYacNewomCmZRjl1QGYaFgJ9nq9qzPQwDzfqzPQwPF4qM5Awx7zszoDDXy/1RF4oHdUZ6CBoffqDDQA6MuKgrnOpVForrthlPqsBLhpGUap/EvQBp+gSSVoWAk6lCZgXZfqDDSw//+rzkDDrtdbdQYa2O521RlooDUdSqMwDOqzogBoWFFwXXfC1GclwDWsMLUOCeqzErTBJ2hSCRpWAkw/LMLw+egxWxSmaarOQMNO50t1BhoYx7E6Aw29g09Qn5WArj4rDKZaOQxQRROmPivhByjbHph8EXN9AAAAAElFTkSuQmCC",bH=l.p+"static/media/wall_03_menu.39f5c56a.png",AH="data:image/png;base64,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",TH=l.p+"static/media/wall_05_menu.c887c64e.png",PH=l.p+"static/media/wall_06_menu.3dc4a0c2.png",SH="data:image/png;base64,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",jH="data:image/png;base64,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",HH=l.p+"static/media/wall_09_menu.5124ae81.png",zH=l.p+"static/media/wall_10_menu.a934991d.png",RH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew(Qu),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=$f(),p=OP(V.Wall),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.textureType)&&void 0!==t?t:ue.Default),g=Object(u.a)(y,2),m=g[0],w=g[1],x=db.a.Option,v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Wall&&i.id===e&&!i.locked){i.textureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){if(p){var t=Tw.getAllConnectedWalls(p);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.textureType=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Wall||i.foundationId!==e||i.locked||(i.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.textureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(p&&function(e){if(p){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.textureType&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.textureType&&!c.locked)return!0}}catch(w){r.e(w)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Wall&&u.foundationId===p.foundationId&&e!==u.textureType&&!u.locked)return!0}}catch(w){d.e(w)}finally{d.f()}break;case _.AllConnectedObjects:var h,y=Tw.getAllConnectedWalls(p),g=Object(f.a)(y);try{for(g.s();!(h=g.n()).done;){var m=h.value;if(e!==m.textureType&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.textureType))return!0}return!1}}(e)){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var h,y=t.value;if(y.type===V.Wall&&!y.locked&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(h=y.textureType)&&void 0!==h?h:ue.Default)}}catch(J){r.e(J)}finally{r.f()}var g={name:"Set Texture for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){P(g.oldValues,g.newValue)}};i(g),P(l,e),s(c+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var S,j=m.value;if(j.type===V.Wall&&!j.locked)w.set(j.id,null!==(S=j.textureType)&&void 0!==S?S:ue.Default)}}catch(J){x.e(J)}finally{x.f()}var H={name:"Set Texture for All Walls",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){T(H.newValue)}};i(H),T(e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M=z.value;M.type!==V.Wall||M.foundationId!==p.foundationId||M.locked||R.set(M.id,M.textureType)}}catch(J){D.e(J)}finally{D.f()}var W={name:"Set Texture for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:p.foundationId,undo:function(){var e,t=Object(f.a)(W.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){W.groupId&&A(W.groupId,W.newValue)}};i(W),A(p.foundationId,e),s(c+1)}break;case _.AllConnectedObjects:if(p){var I,C=Tw.getAllConnectedWalls(p),O=new Map,F=Object(f.a)(C);try{for(F.s();!(I=F.n()).done;){var k=I.value;O.set(k.id,k.textureType)}}catch(J){F.e(J)}finally{F.f()}var Y={name:"Set Texture for All Connected Walls",timestamp:Date.now(),oldValues:O,newValue:e,undo:function(){var e,t=Object(f.a)(Y.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){b(Y.newValue)}};i(Y),b(e),s(c+1)}break;default:if(p){var L,E=d(p.id),U=null!==(L=null===E||void 0===E?void 0:E.textureType)&&void 0!==L?L:p.textureType,N={name:"Set Texture of Selected Wall",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(N.changedElementId,N.oldValue)},redo:function(){v(N.changedElementId,N.newValue)}};i(N),v(p.id,e),s(c+1)}}a((function(t){t.actionState.wallTexture=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Texture",h),onApply:function(){S(m)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:m,onChange:w,children:[Object(gf.jsxs)(x,{value:ue.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",h)]},ue.NoTexture),Object(gf.jsxs)(x,{value:ue.Default,children:[Object(gf.jsx)("img",{alt:ue.Default,src:tp,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.TextureDefault",h)]},ue.Default),Object(gf.jsxs)(x,{value:ue.Texture01,children:[Object(gf.jsx)("img",{alt:ue.Texture01,src:xH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture01",h)]},ue.Texture01),Object(gf.jsxs)(x,{value:ue.Texture02,children:[Object(gf.jsx)("img",{alt:ue.Texture02,src:vH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture02",h)]},ue.Texture02),Object(gf.jsxs)(x,{value:ue.Texture03,children:[Object(gf.jsx)("img",{alt:ue.Texture03,src:bH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture03",h)]},ue.Texture03),Object(gf.jsxs)(x,{value:ue.Texture04,children:[Object(gf.jsx)("img",{alt:ue.Texture04,src:AH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture04",h)]},ue.Texture04),Object(gf.jsxs)(x,{value:ue.Texture05,children:[Object(gf.jsx)("img",{alt:ue.Texture05,src:TH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture05",h)]},ue.Texture05),Object(gf.jsxs)(x,{value:ue.Texture06,children:[Object(gf.jsx)("img",{alt:ue.Texture06,src:PH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture06",h)]},ue.Texture06),Object(gf.jsxs)(x,{value:ue.Texture07,children:[Object(gf.jsx)("img",{alt:ue.Texture07,src:SH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture07",h)]},ue.Texture07),Object(gf.jsxs)(x,{value:ue.Texture08,children:[Object(gf.jsx)("img",{alt:ue.Texture08,src:jH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture08",h)]},ue.Texture08),Object(gf.jsxs)(x,{value:ue.Texture09,children:[Object(gf.jsx)("img",{alt:ue.Texture09,src:HH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture09",h)]},ue.Texture09),Object(gf.jsxs)(x,{value:ue.Texture10,children:[Object(gf.jsx)("img",{alt:ue.Texture10,src:zH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture10",h)]},ue.Texture10)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",h)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",h)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",h)})]})})})]})})},DH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),r=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=OP(V.Wall),h=$f(),p=FP(null!==(t=null===d||void 0===d?void 0:d.color)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Wall&&i.id===e&&!i.locked){i.color=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},x=function(e){if(d){var t=Tw.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.color=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Wall||i.foundationId!==e||i.locked||(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.color=e)}}catch(i){a.e(i)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){if(d&&function(e){if(d){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.color&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,n=Object(f.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.color&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(o);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Wall&&h.foundationId===d.foundationId&&e!==h.color&&!h.locked)return!0}}catch(w){u.e(w)}finally{u.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(d),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.color&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.color))return!0}return!1}}(e)){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=new Map,h=Object(f.a)(o);try{for(h.s();!(t=h.n()).done;){var p,y=t.value;if(y.type===V.Wall&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.color)&&void 0!==p?p:"#ffffff")}}catch(B){h.e(B)}finally{h.f()}var g={name:"Set Color for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};i(g),A(l,e),c(n+1);break;case _.AllObjectsOfThisType:var m,T=new Map,P=Object(f.a)(o);try{for(P.s();!(m=P.n()).done;){var S,j=m.value;if(j.type===V.Wall)T.set(j.id,null!==(S=j.color)&&void 0!==S?S:"#ffffff")}}catch(B){P.e(B)}finally{P.f()}var H={name:"Set Color for All Walls",timestamp:Date.now(),oldValues:T,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){b(H.newValue)}};i(H),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Wall&&W.foundationId===d.foundationId)R.set(W.id,null!==(M=W.color)&&void 0!==M?M:"#ffffff")}}catch(B){D.e(B)}finally{D.f()}var I={name:"Set Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){I.groupId&&v(I.groupId,I.newValue)}};i(I),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:var C,O=Tw.getAllConnectedWalls(d),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y,L=C.value;F.set(L.id,null!==(Y=L.color)&&void 0!==Y?Y:"#ffffff")}}catch(B){k.e(B)}finally{k.f()}var E={name:"Set Color for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){x(E.newValue)}};i(E),x(e),c(n+1);break;default:if(d){var U,N,J=s(d.id),G=null!==(U=null!==(N=null===J||void 0===J?void 0:J.color)&&void 0!==N?N:d.color)&&void 0!==U?U:"#ffffff",X={name:"Set Color of Selected Wall",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(X.changedElementId,X.oldValue)},redo:function(){w(X.changedElementId,X.newValue)}};i(X),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("wallMenu.Color",h),onApply:function(){T(g)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:m})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:r,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",h)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",h)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",h)})]})})})]})})},MH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),r=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=OP(V.Wall),h=FP(null!==(t=null===d||void 0===d?void 0:d.structureColor)&&void 0!==t?t:"#ffffff"),p=Object(u.a)(h,2),y=p[0],g=p[1],m=$f(),w=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall&&!i.locked){i.structureColor=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},x=function(e){if(d){var t=Tw.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.structureColor=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.parentId!==e||i.type!==V.Wall||i.locked||(i.structureColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.structureColor=e)}}catch(i){a.e(i)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){if(d&&function(e){if(d){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.structureColor&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,n=Object(f.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.structureColor&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(o);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Wall&&h.foundationId===d.foundationId&&e!==h.structureColor&&!h.locked)return!0}}catch(w){u.e(w)}finally{u.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(d),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.structureColor&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.structureColor))return!0}return!1}}(e)){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=new Map,h=Object(f.a)(o);try{for(h.s();!(t=h.n()).done;){var p,y=t.value;if(y.type===V.Wall&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.structureColor)&&void 0!==p?p:"#ffffff")}}catch(B){h.e(B)}finally{h.f()}var g={name:"Set Structure Color for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};i(g),A(l,e),c(n+1);break;case _.AllObjectsOfThisType:var m,T=new Map,P=Object(f.a)(o);try{for(P.s();!(m=P.n()).done;){var S,j=m.value;if(j.type===V.Wall)T.set(j.id,null!==(S=j.structureColor)&&void 0!==S?S:"#ffffff")}}catch(B){P.e(B)}finally{P.f()}var H={name:"Set Structure Color for All Walls",timestamp:Date.now(),oldValues:T,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){b(H.newValue)}};i(H),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Wall&&W.foundationId===d.foundationId)R.set(W.id,null!==(M=W.structureColor)&&void 0!==M?M:"#ffffff")}}catch(B){D.e(B)}finally{D.f()}var I={name:"Set Structure Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){I.groupId&&v(I.groupId,I.newValue)}};i(I),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:if(d){var C,O=Tw.getAllConnectedWalls(d),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y,L=C.value;F.set(L.id,null!==(Y=L.color)&&void 0!==Y?Y:"#ffffff")}}catch(B){k.e(B)}finally{k.f()}var E={name:"Set Structure Color for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){x(E.newValue)}};i(E),x(e),c(n+1)}break;default:if(d){var U,N,J=s(d.id),G=null!==(U=null!==(N=null===J||void 0===J?void 0:J.structureColor)&&void 0!==N?N:d.structureColor)&&void 0!==U?U:"#ffffff",X={name:"Set Structure Color of Selected Wall",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(X.changedElementId,X.oldValue)},redo:function(){w(X.changedElementId,X.newValue)}};i(X),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallStructureColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("wallMenu.StructureColor",m),onApply:function(){T(y)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:y,onChangeComplete:g})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:r,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",m)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",m)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",m)})]})})})]})})},WH=function(e){var t=e.wall,l=e.dataType,a=e.attributeKey,o=e.range,i=e.step,n=e.unit,c=e.setDialogVisible,s=Ew(Fi),d=Ew(Sr),h=Ew(Qu),p=Ew(Ii),y=Ew(Ci),g=Ew(si),m=Object(r.useRef)(t[a]),w=$f(),x=function(e){g((function(t){switch(a){case"ly":t.actionState.wallThickness=e;break;case"lz":t.actionState.wallHeight=e;break;case"opacity":t.actionState.wallOpacity=e;break;case"structureSpacing":t.actionState.wallStructureSpacing=e;break;case"structureWidth":t.actionState.wallStructureWidth=e;break;case"eavesLength":t.actionState.wallEavesLength=e}}))},v=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&r.type===V.Wall&&!r.locked){r[a]=t;break}}}catch(n){i.e(n)}finally{i.f()}})),x(t)},b=function(e){var l=Tw.getAllConnectedWalls(t);0!==l.length&&(g((function(t){var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(!r.locked){var n,c=Object(f.a)(t.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.id===r.id&&s.type===V.Wall&&(s[a]=e)}}catch(d){c.e(d)}finally{c.f()}}}}catch(d){i.e(d)}finally{i.f()}})),x(e))},A=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.parentId!==e||r.type!==V.Wall||r.locked||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}})),x(t)},T=function(e){g((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type!==V.Wall||i.locked||(i[a]=e)}}catch(r){o.e(r)}finally{o.f()}})),x(e)},P=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Wall&&!r.locked&&e.has(r.id)&&(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}})),x(t)},S=function(e){if(t&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(s);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&e!==i[a]&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(x){o.e(x)}finally{o.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(s);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&e!==c[a]&&!c.locked)return!0}}catch(x){n.e(x)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(s);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Wall&&p.foundationId===t.foundationId&&e!==p[a]&&!p.locked)return!0}}catch(x){u.e(x)}finally{u.f()}break;case _.AllConnectedObjects:var y,g=Tw.getAllConnectedWalls(t),m=Object(f.a)(g);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(e!==w[a]&&!w.locked)return!0}}catch(x){m.e(x)}finally{m.f()}break;default:if(e!==t[a])return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var o,i=new Map,r=Object(f.a)(s);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Wall&&Ew.getState().selectedElementIdSet.has(n.id)&&i.set(n.id,n[a])}}catch(L){r.e(L)}finally{r.f()}var c={name:"Set ".concat(l," for Selected Walls"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){var e,t=Object(f.a)(c.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){P(c.oldValues,c.newValue)}};d(c),P(i,e),y(p+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(s);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.Wall&&m.set(x.id,x[a])}}catch(L){w.e(L)}finally{w.f()}var S={name:"Set ".concat(l," for All Walls"),timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){T(S.newValue)}};d(S),T(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var j,H=new Map,z=Object(f.a)(s);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type===V.Wall&&R.foundationId===t.foundationId&&H.set(R.id,R[a])}}catch(L){z.e(L)}finally{z.f()}var D={name:"Set ".concat(l," for All Walls Above Foundation"),timestamp:Date.now(),oldValues:H,newValue:e,groupId:t.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){D.groupId&&A(D.groupId,D.newValue)}};d(D),A(t.foundationId,e),y(p+1)}break;case _.AllConnectedObjects:if(t){var M,W=Tw.getAllConnectedWalls(t),I=new Map,C=Object(f.a)(W);try{for(C.s();!(M=C.n()).done;){var O=M.value;I.set(O.id,O[a])}}catch(L){C.e(L)}finally{C.f()}var F={name:"Set ".concat(l," for All Connected Walls"),timestamp:Date.now(),oldValues:I,newValue:e,undo:function(){var e,t=Object(f.a)(F.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){b(F.newValue)}};d(F),b(e),y(p+1)}break;default:if(t){var k=t[a],Y={name:"Set Wall ".concat(l),timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){v(Y.changedElementId,Y.oldValue)},redo:function(){v(Y.changedElementId,Y.newValue)}};d(Y),v(t.id,e),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("wallMenu.".concat(l),w),onApply:function(){S(m.current)},onClose:function(){m.current=t[a],c()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:o[0],max:o[1],style:{width:120},step:i,precision:2,defaultValue:t[a],onChange:function(e){return m.current=e}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [",o.toString(),"] ",n]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:null!==n&&void 0!==n?n:" "}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},IH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Wall),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Tw.toRValueInUS(g)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];T(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;T(o,t)}}catch(i){a.e(i)}finally{a.f()}},j=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Wall&&e!==o.rValue&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&e!==c.rValue&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Wall&&u.foundationId===h.foundationId&&e!==u.rValue&&!u.locked)return!0}}catch(w){d.e(w)}finally{d.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(h),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.rValue&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rValue))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Wall&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p,y=u;l.set(u.id,null!==(p=y.rValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(B){r.e(B)}finally{r.f()}var g={name:"Set R-Value for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){P(g.oldValues)},redo:function(){S(g.oldValues,g.newValue)}};o(g),c(n+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Wall&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.rValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(B){x.e(B)}finally{x.f()}var j={name:"Set R-Value for All Walls",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){P(j.oldValues)},redo:function(){S(j.oldValues,j.newValue)}};o(j),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(null===h||void 0===h?void 0:h.foundationId){var H,z=new Map,R=Object(f.a)(a);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.Wall&&D.foundationId===h.foundationId&&!D.locked){var M,W=D;z.set(D.id,null!==(M=W.rValue)&&void 0!==M?M:2),T(W.id,e)}}}catch(B){R.e(B)}finally{R.f()}var I={name:"Set R-Value for All Walls Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:h.foundationId,undo:function(){P(I.oldValues)},redo:function(){S(I.oldValues,I.newValue)}};o(I),c(n+1)}break;case _.AllConnectedObjects:if(h){var C,O=Tw.getAllConnectedWalls(h),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y=C.value;if(!Y.locked){var L,E=Y;F.set(Y.id,null!==(L=E.rValue)&&void 0!==L?L:2),T(E.id,e)}}}catch(B){k.e(B)}finally{k.f()}var U={name:"Set R-Value for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){P(U.oldValues)},redo:function(){S(U.oldValues,U.newValue)}};o(U),c(n+1)}break;default:if(h){var N,J,G=null!==(N=null!==(J=s(h.id).rValue)&&void 0!==J?J:h.rValue)&&void 0!==N?N:2,X={name:"Set Wall R-Value",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){T(X.changedElementId,X.oldValue)},redo:function(){T(X.changedElementId,X.newValue)}};o(X),T(h.id,e),c(n+1)}}d((function(t){t.actionState.wallRValue=e}))}};return Object(gf.jsx)(kP,{width:550,title:"".concat(me.t("word.RValue",A)+" ","(").concat(me.t("word.ThermalResistance",A),")"),onApply:function(){j(g)},onClose:function(){var e;m(null!==(e=null===h||void 0===h?void 0:h.rValue)&&void 0!==e?e:2),l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){m(e),b(Tw.toRValueInUS(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",A),": m\xb2\xb7\u2103/W"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toRValueInUS(.01),max:Tw.toRValueInUS(100),style:{width:120},step:.01,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),m(Tw.toRValueInSI(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Tw.toRValueInUS(.01).toFixed(3),", ",Tw.toRValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",A),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",A)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",A)})]})})})]})})},CH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Wall),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.volumetricHeatCapacity)&&void 0!==t?t:.5),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.volumetricHeatCapacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Wall&&e!==o.volumetricHeatCapacity&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Wall&&u.foundationId===h.foundationId&&e!==u.volumetricHeatCapacity&&!u.locked)return!0}}catch(w){d.e(w)}finally{d.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(h),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.volumetricHeatCapacity&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.volumetricHeatCapacity))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Wall&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p,y=u;l.set(u.id,null!==(p=y.volumetricHeatCapacity)&&void 0!==p?p:.5),x(y.id,e)}}}catch(B){r.e(B)}finally{r.f()}var g={name:"Set Volumetric Heat Capacity for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(g.oldValues)},redo:function(){b(g.oldValues,g.newValue)}};o(g),c(n+1);break;case _.AllObjectsOfThisType:var m,w=new Map,A=Object(f.a)(a);try{for(A.s();!(m=A.n()).done;){var T=m.value;if(T.type===V.Wall&&!T.locked){var P,S=T;w.set(T.id,null!==(P=S.volumetricHeatCapacity)&&void 0!==P?P:.5),x(S.id,e)}}}catch(B){A.e(B)}finally{A.f()}var j={name:"Set Volumetric Heat Capacity for All Walls",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){v(j.oldValues)},redo:function(){b(j.oldValues,j.newValue)}};o(j),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(null===h||void 0===h?void 0:h.foundationId){var H,z=new Map,R=Object(f.a)(a);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.Wall&&D.foundationId===h.foundationId&&!D.locked){var M,W=D;z.set(D.id,null!==(M=W.volumetricHeatCapacity)&&void 0!==M?M:.5),x(W.id,e)}}}catch(B){R.e(B)}finally{R.f()}var I={name:"Set Volumetric Heat Capacity for All Walls Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:h.foundationId,undo:function(){v(I.oldValues)},redo:function(){b(I.oldValues,I.newValue)}};o(I),c(n+1)}break;case _.AllConnectedObjects:if(h){var C,O=Tw.getAllConnectedWalls(h),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y=C.value;if(!Y.locked){var L,E=Y;F.set(Y.id,null!==(L=E.volumetricHeatCapacity)&&void 0!==L?L:.5),x(E.id,e)}}}catch(B){k.e(B)}finally{k.f()}var U={name:"Set Volumetric Heat Capacity for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){v(U.oldValues)},redo:function(){b(U.oldValues,U.newValue)}};o(U),c(n+1)}break;default:if(h){var N,J,G=null!==(N=null!==(J=s(h.id).volumetricHeatCapacity)&&void 0!==J?J:h.volumetricHeatCapacity)&&void 0!==N?N:.5,X={name:"Set Volumetric Heat Capacity of Wall",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(X.changedElementId,X.oldValue)},redo:function(){x(X.changedElementId,X.newValue)}};o(X),x(h.id,e),c(n+1)}}d((function(t){t.actionState.wallVolumetricHeatCapacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:m}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},OH=function(e){var t=e.wall,l=e.dataType,a=e.attributeKey,o=e.range,i=e.step,n=e.unit,c=e.setDialogVisible,s=Ew(Fi),d=Ew(Sr),h=Ew(Qu),p=Ew(Ii),y=Ew(Ci),g=Ew(si),m=Object(r.useRef)(t.parapet[a]),w=$f(),x=function(e){g((function(t){switch(a){case"copingsHeight":t.actionState.wallParapet.copingsHeight=e;break;case"copingsWidth":t.actionState.wallParapet.copingsWidth=e;break;case"parapetHeight":t.actionState.wallParapet.parapetHeight=e}}))},v=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&r.type===V.Wall&&!r.locked){r.parapet[a]=t;break}}}catch(n){i.e(n)}finally{i.f()}})),x(t)},b=function(e){var l=Tw.getAllConnectedWalls(t);0!==l.length&&(g((function(t){var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(!r.locked){var n,c=Object(f.a)(t.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.id===r.id&&s.type===V.Wall&&(s.parapet[a]=e)}}catch(d){c.e(d)}finally{c.f()}}}}catch(d){i.e(d)}finally{i.f()}})),x(e))},A=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.parentId!==e||r.type!==V.Wall||r.locked||(r.parapet[a]=t)}}catch(n){i.e(n)}finally{i.f()}})),x(t)},T=function(e){g((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type!==V.Wall||i.locked||(i.parapet[a]=e)}}catch(r){o.e(r)}finally{o.f()}})),x(e)},P=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Wall&&!r.locked&&e.has(r.id)&&(r.parapet[a]=t)}}catch(n){i.e(n)}finally{i.f()}})),x(t)},S=function(e){if(t&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(s);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&e!==i.parapet[a]&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(x){o.e(x)}finally{o.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(s);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&e!==c.parapet[a]&&!c.locked)return!0}}catch(x){n.e(x)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(s);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Wall&&p.foundationId===t.foundationId&&e!==p.parapet[a]&&!p.locked)return!0}}catch(x){u.e(x)}finally{u.f()}break;case _.AllConnectedObjects:var y,g=Tw.getAllConnectedWalls(t),m=Object(f.a)(g);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(e!==w.parapet[a]&&!w.locked)return!0}}catch(x){m.e(x)}finally{m.f()}break;default:if(e!==t.parapet[a])return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var o,i=new Map,r=Object(f.a)(s);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Wall&&Ew.getState().selectedElementIdSet.has(n.id)&&i.set(n.id,n.parapet[a])}}catch(L){r.e(L)}finally{r.f()}var c={name:"Set ".concat(l," for Selected Walls"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){var e,t=Object(f.a)(c.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){P(c.oldValues,c.newValue)}};d(c),P(i,e),y(p+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(s);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.Wall&&m.set(x.id,x.parapet[a])}}catch(L){w.e(L)}finally{w.f()}var S={name:"Set ".concat(l," for All Walls"),timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){T(S.newValue)}};d(S),T(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var j,H=new Map,z=Object(f.a)(s);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type===V.Wall&&R.foundationId===t.foundationId&&H.set(R.id,R.parapet[a])}}catch(L){z.e(L)}finally{z.f()}var D={name:"Set ".concat(l," for All Walls Above Foundation"),timestamp:Date.now(),oldValues:H,newValue:e,groupId:t.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){D.groupId&&A(D.groupId,D.newValue)}};d(D),A(t.foundationId,e),y(p+1)}break;case _.AllConnectedObjects:if(t){var M,W=Tw.getAllConnectedWalls(t),I=new Map,C=Object(f.a)(W);try{for(C.s();!(M=C.n()).done;){var O=M.value;I.set(O.id,O.parapet[a])}}catch(L){C.e(L)}finally{C.f()}var F={name:"Set ".concat(l," for All Connected Walls"),timestamp:Date.now(),oldValues:I,newValue:e,undo:function(){var e,t=Object(f.a)(F.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){b(F.newValue)}};d(F),b(e),y(p+1)}break;default:if(t){var k=t.parapet[a],Y={name:"Set Wall ".concat(l),timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){v(Y.changedElementId,Y.oldValue)},redo:function(){v(Y.changedElementId,Y.newValue)}};d(Y),v(t.id,e),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("wallMenu.".concat(l),w),onApply:function(){S(m.current)},onClose:function(){c()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:o[0],max:o[1],style:{width:120},step:i,precision:2,defaultValue:t.parapet[a],onChange:function(e){return m.current=e}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [",o.toString(),"] ",n]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:null!==n&&void 0!==n?n:" "}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},FH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),r=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=OP(V.Wall),h=$f(),p=FP(null!==(t=null===d||void 0===d?void 0:d.parapet.color)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall&&!i.locked){i.parapet.color=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},x=function(e){if(d){var t=Tw.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.parapet.color=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.parentId!==e||i.type!==V.Wall||i.locked||(i.parapet.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.parapet.color=e)}}catch(i){a.e(i)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.parapet.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){if(d&&function(e){if(d){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.parapet.color&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,n=Object(f.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.parapet.color&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(o);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Wall&&h.foundationId===d.foundationId&&e!==h.parapet.color&&!h.locked)return!0}}catch(w){u.e(w)}finally{u.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(d),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.parapet.color&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.parapet.color))return!0}return!1}}(e)){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=new Map,h=Object(f.a)(o);try{for(h.s();!(t=h.n()).done;){var p,y=t.value;if(y.type===V.Wall&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.parapet.color)&&void 0!==p?p:"#ffffff")}}catch(B){h.e(B)}finally{h.f()}var g={name:"Set Parapet Color for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};i(g),A(l,e),c(n+1);break;case _.AllObjectsOfThisType:var m,T=new Map,P=Object(f.a)(o);try{for(P.s();!(m=P.n()).done;){var S,j=m.value;if(j.type===V.Wall)T.set(j.id,null!==(S=j.parapet.color)&&void 0!==S?S:"#ffffff")}}catch(B){P.e(B)}finally{P.f()}var H={name:"Set Parapet Color for All Walls",timestamp:Date.now(),oldValues:T,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){b(H.newValue)}};i(H),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Wall&&W.foundationId===d.foundationId)R.set(W.id,null!==(M=W.parapet.color)&&void 0!==M?M:"#ffffff")}}catch(B){D.e(B)}finally{D.f()}var I={name:"Set Parapet Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){I.groupId&&v(I.groupId,I.newValue)}};i(I),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:if(d){var C,O=Tw.getAllConnectedWalls(d),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y,L=C.value;F.set(L.id,null!==(Y=L.color)&&void 0!==Y?Y:"#ffffff")}}catch(B){k.e(B)}finally{k.f()}var E={name:"Set Parapet Color for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){x(E.newValue)}};i(E),x(e),c(n+1)}break;default:if(d){var U,N,J=s(d.id),G=null!==(U=null!==(N=null===J||void 0===J?void 0:J.parapet.color)&&void 0!==N?N:d.parapet.color)&&void 0!==U?U:"#ffffff",X={name:"Set Parapet Color of Selected Wall",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(X.changedElementId,X.oldValue)},redo:function(){w(X.changedElementId,X.newValue)}};i(X),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallParapet.color=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("wallMenu.ParapetColor",h),onApply:function(){T(g)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:m})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:r,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",h)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",h)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",h)})]})})})]})})},kH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew(Qu),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=OP(V.Wall),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.parapet.textureType)&&void 0!==t?t:ue.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=db.a.Option,v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Wall&&i.id===e&&!i.locked){i.parapet.textureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){if(h){var t=Tw.getAllConnectedWalls(h);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.parapet.textureType=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Wall||i.foundationId!==e||i.locked||(i.parapet.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.parapet.textureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.parapet.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(h&&function(e){if(h){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.parapet.textureType&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.parapet.textureType&&!c.locked)return!0}}catch(w){r.e(w)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Wall&&u.foundationId===h.foundationId&&e!==u.parapet.textureType&&!u.locked)return!0}}catch(w){d.e(w)}finally{d.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(h),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.parapet.textureType&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.parapet.textureType))return!0}return!1}}(e)){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Wall&&!y.locked&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.parapet.textureType)&&void 0!==p?p:ue.Default)}}catch(J){r.e(J)}finally{r.f()}var g={name:"Set Parapet Texture for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){P(g.oldValues,g.newValue)}};i(g),P(l,e),s(c+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var S,j=m.value;if(j.type===V.Wall&&!j.locked)w.set(j.id,null!==(S=j.parapet.textureType)&&void 0!==S?S:ue.Default)}}catch(J){x.e(J)}finally{x.f()}var H={name:"Set Parapet Texture for All Walls",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){T(H.newValue)}};i(H),T(e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M=z.value;M.type!==V.Wall||M.foundationId!==h.foundationId||M.locked||R.set(M.id,M.parapet.textureType)}}catch(J){D.e(J)}finally{D.f()}var W={name:"Set Parapet Texture for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:h.foundationId,undo:function(){var e,t=Object(f.a)(W.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){W.groupId&&A(W.groupId,W.newValue)}};i(W),A(h.foundationId,e),s(c+1)}break;case _.AllConnectedObjects:if(h){var I,C=Tw.getAllConnectedWalls(h),O=new Map,F=Object(f.a)(C);try{for(F.s();!(I=F.n()).done;){var k=I.value;O.set(k.id,k.parapet.textureType)}}catch(J){F.e(J)}finally{F.f()}var Y={name:"Set Parapet Texture for All Connected Walls",timestamp:Date.now(),oldValues:O,newValue:e,undo:function(){var e,t=Object(f.a)(Y.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){b(Y.newValue)}};i(Y),b(e),s(c+1)}break;default:if(h){var L,E=d(h.id),U=null!==(L=null===E||void 0===E?void 0:E.parapet.textureType)&&void 0!==L?L:h.parapet.textureType,N={name:"Set Parapet Texture of Selected Wall",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(N.changedElementId,N.oldValue)},redo:function(){v(N.changedElementId,N.newValue)}};i(N),v(h.id,e),s(c+1)}}a((function(t){t.actionState.wallParapet.textureType=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Texture",w),onApply:function(){S(g)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:g,onChange:m,children:[Object(gf.jsxs)(x,{value:ue.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",w)]},ue.NoTexture),Object(gf.jsxs)(x,{value:ue.Default,children:[Object(gf.jsx)("img",{alt:ue.Default,src:tp,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.TextureDefault",w)]},ue.Default),Object(gf.jsxs)(x,{value:ue.Texture01,children:[Object(gf.jsx)("img",{alt:ue.Texture01,src:xH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture01",w)]},ue.Texture01),Object(gf.jsxs)(x,{value:ue.Texture02,children:[Object(gf.jsx)("img",{alt:ue.Texture02,src:vH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture02",w)]},ue.Texture02),Object(gf.jsxs)(x,{value:ue.Texture03,children:[Object(gf.jsx)("img",{alt:ue.Texture03,src:bH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture03",w)]},ue.Texture03),Object(gf.jsxs)(x,{value:ue.Texture04,children:[Object(gf.jsx)("img",{alt:ue.Texture04,src:AH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture04",w)]},ue.Texture04),Object(gf.jsxs)(x,{value:ue.Texture05,children:[Object(gf.jsx)("img",{alt:ue.Texture05,src:TH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture05",w)]},ue.Texture05),Object(gf.jsxs)(x,{value:ue.Texture06,children:[Object(gf.jsx)("img",{alt:ue.Texture06,src:PH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture06",w)]},ue.Texture06),Object(gf.jsxs)(x,{value:ue.Texture07,children:[Object(gf.jsx)("img",{alt:ue.Texture07,src:SH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture07",w)]},ue.Texture07),Object(gf.jsxs)(x,{value:ue.Texture08,children:[Object(gf.jsx)("img",{alt:ue.Texture08,src:jH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture08",w)]},ue.Texture08),Object(gf.jsxs)(x,{value:ue.Texture09,children:[Object(gf.jsx)("img",{alt:ue.Texture09,src:HH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture09",w)]},ue.Texture09),Object(gf.jsxs)(x,{value:ue.Texture10,children:[Object(gf.jsx)("img",{alt:ue.Texture10,src:zH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture10",w)]},ue.Texture10)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})};!function(e){e.Height="Height",e.Opacity="Opacity",e.StructureSpacing="StructureSpacing",e.StructureWidth="StructureWidth",e.Thickness="Thickness",e.StructureColor="StructureColor",e.Color="Color",e.Texture="Texture",e.EavesLength="EavesLength",e.ParapetColor="ParapetColor",e.ParapetTexture="ParapetTexture",e.ParapetHeight="ParapetHeight",e.CopingsHeight="CopingsHeight",e.CopingsWidth="CopingsWidth"}(yj||(yj={}));var YH,LH={Height:{attributeKey:"lz",range:[.1,100],step:.1,unit:"word.MeterAbbreviation"},Opacity:{attributeKey:"opacity",range:[0,1],step:.01},StructureSpacing:{attributeKey:"structureSpacing",range:[.1,1e3],step:.1,unit:"word.MeterAbbreviation"},StructureWidth:{attributeKey:"structureWidth",range:[.01,1],step:.1,unit:"word.MeterAbbreviation"},Thickness:{attributeKey:"ly",range:[.1,1],step:.01,unit:"word.MeterAbbreviation"},EavesLength:{attributeKey:"eavesLength",range:[-.1,5],step:.01,unit:"word.MeterAbbreviation"},ParapetHeight:{attributeKey:"parapetHeight",range:[0,5],step:.01,unit:"word.MeterAbbreviation"},CopingsHeight:{attributeKey:"copingsHeight",range:[0,1],step:.01,unit:"word.MeterAbbreviation"},CopingsWidth:{attributeKey:"copingsWidth",range:[0,3],step:.01,unit:"word.MeterAbbreviation"}},EH={ParapetHeight:{attributeKey:"parapetHeight",range:[0,5],step:.01,unit:"word.MeterAbbreviation"},CopingsHeight:{attributeKey:"copingsHeight",range:[0,1],step:.01,unit:"word.MeterAbbreviation"},CopingsWidth:{attributeKey:"copingsWidth",range:[0,3],step:.01,unit:"word.MeterAbbreviation"}},UH={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},NH=n.a.memo((function(){var e=Ew(Vi),t=Ew(si),l=Ew(Ci),a=Ew(hs),o=Ew(es),i=Ew(Sr),n=Ew(pn),c=Ew(hn),s=Ew(Bc),d=Ew(Xc),p=Ew(qc),y=Ew(_r),g=OP(V.Wall),m=Object(r.useState)(null),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1];if(!g)return null;var R={lng:e},D=function(e,l){t((function(t){var a=t.elements.find((function(t){return t.id===e&&t.type===V.Wall}));a&&(a.parapet.display=l)}))},M=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall){var r=i;r.wallStructure=l,l!==Ne.Stud&&l!==Ne.Pillar||(r.opacity=0);break}}}catch(n){o.e(n)}finally{o.f()}}))},W=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall){i.fill=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},I=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall){i.openToOutside=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},C=function(e){return Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),v(e)},children:[me.t("wallMenu.".concat(e),R)," ..."]},"wall-".concat(e))},O=function(e,l){if(0===l)return null;var a=function(e,t){return"".concat(me.t("wallMenu.DoYouReallyWantToRemoveAll".concat(e,"sOnThisWall"),R)," (").concat(t," ").concat(me.t("wallMenu.".concat(e,"s"),R),")?")},r=e.replaceAll(" ","");return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:a(r,l),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){!function(e){if(g){var l=Ew.getState().elements.filter((function(t){return!t.locked&&t.type===e&&t.parentId===g.id}));o(g.id,e);var a=JSON.parse(JSON.stringify(l)),r={name:"Remove All ".concat(e,"s on Wall"),timestamp:Date.now(),parentId:g.id,removedElements:a,undo:function(){t((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(r.removedElements))}))},redo:function(){o(r.parentId,e)}};i(r)}}(e)}})},children:[me.t("wallMenu.RemoveAllUnlocked".concat(r,"s"),R)," (",l,")"]},"remove-all-".concat(r,"s-on-wall"))},F=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(t=o.n()).done;){var r=t.value;r.parentId===g.id&&r.type===e&&a.set(r.id,!!r.locked)}}catch(d){o.e(d)}finally{o.f()}c(g.id,e,!0);var s={name:"Lock All "+l+" on Wall",timestamp:Date.now(),oldValues:a,newValue:!0,undo:function(){var e,t=Object(f.a)(s.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(d){t.e(d)}finally{t.f()}},redo:function(){c(g.id,e,!0)}};i(s)}},children:[me.t("wallMenu.LockAll".concat(l,"s"),R)," (",t,")"]},"lock-all-".concat(l,"s-on-wall"))},k=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(gf.jsx)(Qv.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(t=o.n()).done;){var r=t.value;r.parentId===g.id&&r.type===e&&a.set(r.id,!!r.locked)}}catch(d){o.e(d)}finally{o.f()}c(g.id,e,!1);var s={name:"Unlock All "+l+" on Wall",timestamp:Date.now(),oldValues:a,newValue:!0,undo:function(){var e,t=Object(f.a)(s.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(d){t.e(d)}finally{t.f()}},redo:function(){c(g.id,e,!1)}};i(s)}},children:me.t("wallMenu.UnlockAll".concat(l,"s"),R)},"unlock-all-".concat(l,"s-on-wall"))},Y=function(e,t){return 0===e?null:Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(g){var e,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;o.parentId===g.id&&o.type===V.Light&&l.set(o.id,o.inside)}}catch(n){a.e(n)}finally{a.f()}s(g.id,t);var r={name:t?"Set All Lights on Wall Inside":"Set All Lights on Wall Outside",timestamp:Date.now(),oldValues:l,newValue:!0,undo:function(){var e,t=Object(f.a)(r.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];d(a,o)}}catch(n){t.e(n)}finally{t.f()}},redo:function(){s(g.id,t)}};i(r)}},children:[me.t(t?"wallMenu.AllLightsOnWallInside":"wallMenu.AllLightsOnWallOutside",R)," (",e,")"]},t?"inside-lights-on-wall":"outside-lights-on-wall")};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){var e=Ew.getState().elementsToPaste;if(e&&e.length>0){var t=e[0];if(Tw.isLegalOnWall(t.type))return!0}return!1}()?Object(gf.jsx)(AP,{keyName:"wall-paste"}):null,Object(gf.jsx)(TP,{keyName:"wall-copy"}),!g||g.locked?null:Object(gf.jsx)(PP,{keyName:"wall-cut"}),Object(gf.jsx)(SP,{keyName:"wall-lock"}),!g.locked&&Object(gf.jsxs)(gf.Fragment,{children:[function(){switch(x){case yj.Height:case yj.Opacity:case yj.Thickness:case yj.StructureSpacing:case yj.StructureWidth:case yj.EavesLength:var e=LH[x];return e?Object(gf.jsx)(WH,{wall:g,dataType:x,attributeKey:e.attributeKey,range:e.range,step:e.step,setDialogVisible:function(){return v(null)},unit:e.unit?me.t(e.unit,R):void 0}):null;case yj.ParapetHeight:case yj.CopingsHeight:case yj.CopingsWidth:var t=EH[x];return t?Object(gf.jsx)(OH,{wall:g,dataType:x,attributeKey:t.attributeKey,range:t.range,step:t.step,setDialogVisible:function(){return v(null)},unit:t.unit?me.t(t.unit,R):void 0}):null;case yj.Color:return Object(gf.jsx)(DH,{setDialogVisible:function(){return v(null)}});case yj.StructureColor:return Object(gf.jsx)(MH,{setDialogVisible:function(){return v(null)}});case yj.ParapetColor:return Object(gf.jsx)(FH,{setDialogVisible:function(){return v(null)}});case yj.Texture:return Object(gf.jsx)(RH,{setDialogVisible:function(){return v(null)}});case yj.ParapetTexture:return Object(gf.jsx)(kH,{setDialogVisible:function(){return v(null)}})}}(),function(){var e=g?a(g.id,!0):new Rw;if(e.gotSome()&&Ew.getState().contextMenuObjectType){var t=g?a(g.id,!1):new Rw;return Object(gf.jsxs)(HP.a,{title:me.t("word.Elements",R),style:{paddingLeft:"24px"},children:[O(V.Window,t.windowCount),O(V.Door,t.doorCount),O(V.SolarPanel,t.solarPanelCount),O(V.Sensor,t.sensorCount),O(V.Light,t.insideLightCount+t.outsideLightCount),O(V.Polygon,t.polygonCount),F(V.Window,t.windowCount),k(V.Window,e.windowCount),F(V.SolarPanel,t.solarPanelCount),k(V.SolarPanel,e.solarPanelCount),F(V.Sensor,t.sensorCount),k(V.Sensor,e.sensorCount),Y(e.outsideLightCount,!0),Y(e.insideLightCount,!1),F(V.Polygon,t.polygonCount),k(V.Polygon,e.polygonCount)]},"lock-unlock-clear-on-wall")}return null}(),g?Object(gf.jsxs)(HP.a,{title:me.t("wallMenu.Parapet",R),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:g.parapet.display,onChange:function(e){var l=e.target.checked,a={name:"Parapet",timestamp:Date.now(),checked:l,selectedElementId:g.id,selectedElementType:g.type,undo:function(){D(g.id,!a.checked)},redo:function(){D(g.id,a.checked)}};i(a),D(g.id,l),t((function(e){e.actionState.wallParapet.display=l}))},children:me.t("wallMenu.Parapet",{lng:e})})},"parapet"),Object(gf.jsx)(wH.a,{plain:!0,style:{margin:"6px"}}),C(yj.ParapetColor),C(yj.ParapetTexture),C(yj.ParapetHeight),C(yj.CopingsHeight),C(yj.CopingsWidth)]},"wall-parapet"):null,function(){var e;return g?Object(gf.jsx)(HP.a,{title:me.t("wallMenu.WallStructure",R),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(tb.a.Group,{value:null!==(e=g.wallStructure)&&void 0!==e?e:Ne.Default,style:{height:"75px"},onChange:function(e){var l={name:"Select Wall Structure",timestamp:Date.now(),oldValue:g.wallStructure,newValue:e.target.value,changedElementId:g.id,changedElementType:g.type,undo:function(){M(l.changedElementId,l.oldValue)},redo:function(){M(l.changedElementId,l.newValue)}};i(l),M(g.id,e.target.value),t((function(t){t.actionState.wallStructure=e.target.value,t.actionState.wallStructure!==Ne.Stud&&t.actionState.wallStructure!==Ne.Pillar||(t.actionState.wallOpacity=0)}))},children:[Object(gf.jsx)(tb.a,{style:UH,value:Ne.Default,children:me.t("wallMenu.DefaultStructure",R)}),Object(gf.jsx)(tb.a,{style:UH,value:Ne.Stud,children:me.t("wallMenu.StudStructure",R)}),Object(gf.jsx)(tb.a,{style:UH,value:Ne.Pillar,children:me.t("wallMenu.PillarStructure",R)})]})},"wall-structure"):null}(),(null===g||void 0===g?void 0:g.wallStructure)===Ne.Stud||(null===g||void 0===g?void 0:g.wallStructure)===Ne.Pillar?Object(gf.jsxs)(gf.Fragment,{children:[C(yj.StructureSpacing),C(yj.StructureWidth),C(yj.StructureColor),C(yj.Opacity)]}):null,Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(g){var e=y(g);if(e){var l=function(e,t,l){var a=t.cx,o=t.cy,i=t.cz,r=l?l.rotation[2]+t.relativeAngle:t.relativeAngle;if(l&&void 0!==r){var n=Tw.wallAbsolutePosition(new Me.Vector3(a,o,i),l).setZ(t.lz/2+l.lz);return(new Me.Vector3).subVectors(e,n).applyEuler(new Me.Euler(0,0,-r))}return new Me.Vector3}(Ew.getState().pastePoint,g,e);t((function(e){e.objectTypeToAdd=V.Polygon}));var a=Vl.makePolygon(g,-l.x/g.lx,0,-l.z/g.lz,new Me.Vector3(0,0,1),[0,0,0],V.Wall);t((function(e){e.elements.push(a),e.objectTypeToAdd=V.None}));var o={name:"Add",timestamp:Date.now(),addedElement:a,undo:function(){p(o.addedElement.id,!1)},redo:function(){t((function(e){e.elements.push(o.addedElement),e.selectedElement=o.addedElement}))}};i(o),t((function(e){e.objectTypeToAdd=V.None}))}}},children:me.t("foundationMenu.AddPolygon",R)},"add-polygon-on-wall"),g?Object(gf.jsxs)(HP.a,{title:me.t("wallMenu.Fill",R),style:{paddingLeft:"24px"},children:[Object(gf.jsxs)(tb.a.Group,{value:g.fill,style:{height:"75px"},onChange:function(e){var t={name:"Select Wall Fill",timestamp:Date.now(),oldValue:g.fill,newValue:e.target.value,changedElementId:g.id,changedElementType:g.type,undo:function(){W(t.changedElementId,t.oldValue)},redo:function(){W(t.changedElementId,t.newValue)}};i(t),W(g.id,e.target.value)},children:[Object(gf.jsx)(tb.a,{style:UH,value:Ue.Full,children:me.t("wallMenu.Full",R)}),Object(gf.jsx)(tb.a,{style:UH,value:Ue.Partial,children:me.t("wallMenu.Partial",R)}),Object(gf.jsx)(tb.a,{style:UH,value:Ue.Empty,children:me.t("wallMenu.Empty",R)})]}),g.fill!==Ue.Full&&Object(gf.jsx)("div",{style:{paddingLeft:"10px",paddingTop:"10px"},children:Object(gf.jsx)(_v.a,{checked:!!g.openToOutside,onChange:function(e){var t={name:"Set Open to Outside",timestamp:Date.now(),oldValue:!!g.openToOutside,newValue:e.target.checked,changedElementId:g.id,changedElementType:g.type,undo:function(){I(t.changedElementId,t.oldValue)},redo:function(){I(t.changedElementId,t.newValue)}};i(t),I(g.id,e.target.checked)},children:me.t("wallMenu.OpenToOutside",R)})})]},"wall-fill-selection"):null,C(yj.Thickness),C(yj.Height),C(yj.EavesLength),T&&Object(gf.jsx)(IH,{setDialogVisible:P}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),P(!0)},children:[me.t("word.RValue",R)," ..."]},"wall-r-value"),H&&Object(gf.jsx)(CH,{setDialogVisible:z}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),z(!0)},children:[me.t("word.VolumetricHeatCapacity",R)," ..."]},"wall-heat-capacity"),(null===g||void 0===g?void 0:g.wallStructure)===Ne.Default?C(yj.Texture):null,!((null===g||void 0===g?void 0:g.wallStructure)===Ne.Default||void 0===(null===g||void 0===g?void 0:g.opacity)||(null===g||void 0===g?void 0:g.opacity)>0)||(null===g||void 0===g?void 0:g.textureType)!==ue.NoTexture&&(null===g||void 0===g?void 0:g.textureType)!==ue.Default?null:C(yj.Color)]})]})})),VH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(si),d=Ew(Zr),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.textureType)&&void 0!==t?t:fe.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=db.a.Option,v=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.textureType=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.textureType&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&e!==c.textureType&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===h.foundationId&&e!==u.textureType&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===h.parentId&&e!==g.textureType&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.textureType))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(Ew.getState().elements);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Door&&!p.locked&&Ew.getState().selectedElementIdSet.has(p.id))l.set(p.id,null!==(u=p.textureType)&&void 0!==u?u:fe.Default)}}catch(Y){r.e(Y)}finally{r.f()}var y={name:"Set Texture for Selected Doors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),b(l,e),c(n+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(Ew.getState().elements);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Door&&!T.locked)m.set(T.id,null!==(x=T.textureType)&&void 0!==x?x:fe.Default)}}catch(Y){w.e(Y)}finally{w.f()}var P={name:"Set Texture for All Doors",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){A(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};o(P),b(m,e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(Ew.getState().elements);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type!==V.Door||z.foundationId!==h.foundationId||z.locked||j.set(z.id,z.textureType)}}catch(Y){H.e(Y)}finally{H.f()}var R={name:"Set Texture for All Doors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){A(R.oldValues)},redo:function(){R.groupId&&b(R.oldValues,R.newValue)}};o(R),b(j,e),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var D,M=new Map,W=Object(f.a)(Ew.getState().elements);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type!==V.Door||I.parentId!==h.parentId||I.locked||M.set(I.id,I.textureType)}}catch(Y){W.e(Y)}finally{W.f()}var C={name:"Set Texture for All Doors On the Same Wall",timestamp:Date.now(),oldValues:M,newValue:e,groupId:h.parentId,undo:function(){A(C.oldValues)},redo:function(){C.groupId&&b(C.oldValues,C.newValue)}};o(C),b(M,e),c(n+1)}break;default:if(h){var O=d(h.id),F=O?O.textureType:h.textureType,k={name:"Set Texture of Selected Door",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(k.changedElementId,k.oldValue)},redo:function(){v(k.changedElementId,k.newValue)}};o(k),v(h.id,e),c(n+1)}}s((function(t){t.actionState.doorTexture=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:g,onChange:function(e){return m(e)},children:[Object(gf.jsxs)(x,{value:fe.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",w)]},fe.NoTexture),Object(gf.jsxs)(x,{value:fe.Default,children:[Object(gf.jsx)("img",{alt:fe.Default,src:Jg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.TextureDefault",w)]},fe.Default),Object(gf.jsxs)(x,{value:fe.Texture01,children:[Object(gf.jsx)("img",{alt:fe.Texture01,src:Gg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture01",w)]},fe.Texture01),Object(gf.jsxs)(x,{value:fe.Texture02,children:[Object(gf.jsx)("img",{alt:fe.Texture02,src:Xg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture02",w)]},fe.Texture02),Object(gf.jsxs)(x,{value:fe.Texture03,children:[Object(gf.jsx)("img",{alt:fe.Texture03,src:Bg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture03",w)]},fe.Texture03),Object(gf.jsxs)(x,{value:fe.Texture04,children:[Object(gf.jsx)("img",{alt:fe.Texture04,src:Kg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture04",w)]},fe.Texture04),Object(gf.jsxs)(x,{value:fe.Texture05,children:[Object(gf.jsx)("img",{alt:fe.Texture05,src:qg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture05",w)]},fe.Texture05),Object(gf.jsxs)(x,{value:fe.Texture06,children:[Object(gf.jsx)("img",{alt:fe.Texture06,src:Qg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture06",w)]},fe.Texture06),Object(gf.jsxs)(x,{value:fe.Texture07,children:[Object(gf.jsx)("img",{alt:fe.Texture07,src:Zg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture07",w)]},fe.Texture07),Object(gf.jsxs)(x,{value:fe.Texture08,children:[Object(gf.jsx)("img",{alt:fe.Texture08,src:_g,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture08",w)]},fe.Texture08),Object(gf.jsxs)(x,{value:fe.Texture09,children:[Object(gf.jsx)("img",{alt:fe.Texture09,src:$g,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture09",w)]},fe.Texture09),Object(gf.jsxs)(x,{value:fe.Texture10,children:[Object(gf.jsx)("img",{alt:fe.Texture10,src:em,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture10",w)]},fe.Texture10),Object(gf.jsxs)(x,{value:fe.Texture11,children:[Object(gf.jsx)("img",{alt:fe.Texture11,src:tm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture11",w)]},fe.Texture11),Object(gf.jsxs)(x,{value:fe.Texture12,children:[Object(gf.jsx)("img",{alt:fe.Texture12,src:lm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture12",w)]},fe.Texture12),Object(gf.jsxs)(x,{value:fe.Texture13,children:[Object(gf.jsx)("img",{alt:fe.Texture13,src:am,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture13",w)]},fe.Texture13),Object(gf.jsxs)(x,{value:fe.Texture14,children:[Object(gf.jsx)("img",{alt:fe.Texture14,src:om,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture14",w)]},fe.Texture14),Object(gf.jsxs)(x,{value:fe.Texture15,children:[Object(gf.jsx)("img",{alt:fe.Texture15,src:im,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture15",w)]},fe.Texture15),Object(gf.jsxs)(x,{value:fe.Texture16,children:[Object(gf.jsx)("img",{alt:fe.Texture16,src:rm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture16",w)]},fe.Texture16),Object(gf.jsxs)(x,{value:fe.Texture17,children:[Object(gf.jsx)("img",{alt:fe.Texture17,src:nm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture17",w)]},fe.Texture17)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},JH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew($u),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.color)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.color=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},A=function(e){if(h&&function(e){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Door&&e!==a.color&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Door&&e!==c.color&&!c.locked)return!0}}catch(m){r.e(m)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===(null===h||void 0===h?void 0:h.foundationId)&&e!==u.color&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(o);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===(null===h||void 0===h?void 0:h.parentId)&&e!==g.color&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.color))return!0}return!1}(e)){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(Ew.getState().elements);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Door&&!p.locked&&Ew.getState().selectedElementIdSet.has(p.id))l.set(p.id,null!==(u=p.color)&&void 0!==u?u:"#ffffff")}}catch(U){r.e(U)}finally{r.f()}var y={name:"Set Color for Selected Doors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(y.oldValues)},redo:function(){v(y.oldValues,y.newValue)}};i(y),v(l,e),s(c+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(Ew.getState().elements);try{for(w.s();!(g=w.n()).done;){var A,T=g.value;if(T.type===V.Door&&!T.locked)m.set(T.id,null!==(A=T.color)&&void 0!==A?A:"#ffffff")}}catch(U){w.e(U)}finally{w.f()}var P={name:"Set Color for All Doors",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){b(P.oldValues)},redo:function(){v(P.oldValues,P.newValue)}};i(P),v(m,e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(Ew.getState().elements);try{for(H.s();!(S=H.n()).done;){var z,R=S.value;if(R.type===V.Door&&R.foundationId===h.foundationId&&!h.locked)j.set(R.id,null!==(z=R.color)&&void 0!==z?z:"#ffffff")}}catch(U){H.e(U)}finally{H.f()}var D={name:"Set Color for All Doors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){b(D.oldValues)},redo:function(){D.groupId&&v(D.oldValues,D.newValue)}};i(D),v(j,e),s(c+1)}break;case _.OnlyThisSide:if(h.parentId){var M,W=new Map,I=Object(f.a)(Ew.getState().elements);try{for(I.s();!(M=I.n()).done;){var C,O=M.value;if(O.type===V.Door&&O.parentId===h.parentId&&!h.locked)W.set(O.id,null!==(C=O.color)&&void 0!==C?C:"#ffffff")}}catch(U){I.e(U)}finally{I.f()}var F={name:"Set Color for All Doors On the Same Wall",timestamp:Date.now(),oldValues:W,newValue:e,groupId:h.parentId,undo:function(){b(F.oldValues)},redo:function(){F.groupId&&v(F.oldValues,F.newValue)}};i(F),v(W,e),s(c+1)}break;default:if(h){var k,Y=d(h.id),L=null!==(k=Y?Y.color:h.color)&&void 0!==k?k:"#ffffff",E={name:"Set Color of Selected Door",timestamp:Date.now(),oldValue:L,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(E.changedElementId,E.oldValue)},redo:function(){x(E.changedElementId,E.newValue)}};i(E),x(h.id,e),s(c+1)}}a((function(t){t.actionState.doorColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("word.Color",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},GH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.uValue)&&void 0!==t?t:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Tw.toUValueInUS(g)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.uValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];T(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;T(o,t)}}catch(i){a.e(i)}finally{a.f()}},j=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.uValue&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&e!==c.uValue&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===h.foundationId&&e!==u.uValue&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===h.parentId&&e!==g.uValue&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.uValue))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked){var r,n=i;t.set(i.id,null!==(r=n.uValue)&&void 0!==r?r:1),n.uValue=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set U-Value for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){P(l.oldValues)},redo:function(){S(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i,n=o;r.set(o.id,null!==(i=n.uValue)&&void 0!==i?i:1),n.uValue=e}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set U-Value for All Doors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){P(u.oldValues)},redo:function(){S(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var p=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===h.foundationId&&!o.locked){var i,r=o;p.set(o.id,null!==(i=r.uValue)&&void 0!==i?i:1),r.uValue=e}}}catch(n){a.e(n)}finally{a.f()}}));var y={name:"Set U-Value for All Doors Above Foundation",timestamp:Date.now(),oldValues:p,newValue:e,groupId:h.foundationId,undo:function(){P(y.oldValues)},redo:function(){S(y.oldValues,y.newValue)}};o(y),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var g=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===h.parentId&&!o.locked){var i,r=o;g.set(o.id,null!==(i=r.uValue)&&void 0!==i?i:1),r.uValue=e}}}catch(n){a.e(n)}finally{a.f()}}));var m={name:"Set U-Value for All Doors On the Same Wall",timestamp:Date.now(),oldValues:g,newValue:e,groupId:h.parentId,undo:function(){P(m.oldValues)},redo:function(){S(m.oldValues,m.newValue)}};o(m),c(n+1)}break;default:if(h){var w,x,v=null!==(w=null!==(x=s(h.id).uValue)&&void 0!==x?x:h.uValue)&&void 0!==w?w:1,b={name:"Set Door U-Value",timestamp:Date.now(),oldValue:v,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){T(b.changedElementId,b.oldValue)},redo:function(){T(b.changedElementId,b.newValue)}};o(b),T(h.id,e),c(n+1)}}d((function(t){t.actionState.doorUValue=e}))}};return Object(gf.jsx)(kP,{width:550,title:"".concat(me.t("word.UValue",A)+" ","(").concat(me.t("word.ThermalTransmittance",A),")"),onApply:function(){j(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){m(e),b(Tw.toUValueInUS(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",A),": W/(m\xb2\xb7\u2103)"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toUValueInUS(.01),max:Tw.toUValueInUS(100),style:{width:120},step:.01,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),m(Tw.toUValueInSI(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Tw.toUValueInUS(.01).toFixed(3),", ",Tw.toUValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",A),": Btu/(h\xb7ft\xb2\xb7\u2109)"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",A)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",A)})]})})})]})})},XH=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Sr),o=Ew($u),i=Ew(Ii),n=Ew(Ci),c=Ew(Zr),s=Ew(si),d=Ew($r),h=OP(V.Door),p=Object(r.useMemo)((function(){var e=h?h.lx:1,t=h?d(h):null;return t?e*t.lx:e}),[null===h||void 0===h?void 0:h.lx]),y=Object(r.useState)(p),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){var r=i,n=d(r);r.lx=n?t/n.lx:t;break}}}catch(c){o.e(c)}finally{o.f()}}))},b=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},A=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},T=function(e){if(h&&function(e){if(h){switch(o){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=d(i);if(r&&e!==i.lx*r.lx)return!0}}}catch(T){a.e(T)}finally{a.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(l);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Door&&!s.locked){var u=d(s);if(u&&e!==s.lx*u.lx)return!0}}}catch(T){c.e(T)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var p,y=Object(f.a)(l);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.foundationId===h.foundationId&&!g.locked){var m=d(g);if(m&&e!==g.lx*m.lx)return!0}}}catch(T){y.e(T)}finally{y.f()}break;case _.OnlyThisSide:var w,x=Object(f.a)(l);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.Door&&v.parentId===h.parentId&&!v.locked){var b=d(v);if(b&&e!==v.lx*b.lx)return!0}}}catch(T){x.e(T)}finally{x.f()}break;default:var A=d(h);if(A&&e!==h.lx*A.lx)return!0}return!1}}(e))switch(o){case _.AllSelectedObjectsOfThisType:var t=new Map;s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=i,n=r?d(r):null;t.set(i.id,r.lx*(n?n.lx:1)),r.lx=n?e/n.lx:e}}}catch(c){o.e(c)}finally{o.f()}}));var r={name:"Set Width for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){b(r.oldValues)},redo:function(){A(r.oldValues,r.newValue)}};a(r),n(i+1);break;case _.AllObjectsOfThisType:var u=new Map;s((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i=o,r=i?d(i):null;u.set(o.id,i.lx*(r?r.lx:1)),i.lx=r?e/r.lx:e}}}catch(n){a.e(n)}finally{a.f()}}));var p={name:"Set Width for All Doors",timestamp:Date.now(),oldValues:u,newValue:e,undo:function(){b(p.oldValues)},redo:function(){A(p.oldValues,p.newValue)}};a(p),n(i+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var y=new Map;s((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===h.foundationId&&!o.locked){var i=o,r=i?d(i):null;y.set(o.id,i.lx*(r?r.lx:1)),i.lx=r?e/r.lx:e}}}catch(n){a.e(n)}finally{a.f()}}));var g={name:"Set Width for All Doors Above Foundation",timestamp:Date.now(),oldValues:y,newValue:e,groupId:h.foundationId,undo:function(){b(g.oldValues)},redo:function(){A(g.oldValues,g.newValue)}};a(g),n(i+1)}break;case _.OnlyThisSide:if(h.parentId){var m=new Map;s((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===h.parentId&&!o.locked){var i=o,r=i?d(i):null;m.set(o.id,i.lx*(r?r.lx:1)),i.lx=r?e/r.lx:e}}}catch(n){a.e(n)}finally{a.f()}}));var w={name:"Set Width for All Doors On the Same Wall",timestamp:Date.now(),oldValues:m,newValue:e,groupId:h.parentId,undo:function(){b(w.oldValues)},redo:function(){A(w.oldValues,w.newValue)}};a(w),n(i+1)}break;default:if(h){var x,T,P=c(h.id),S=h?d(P):null,j=(null!==(x=null!==(T=P.lx)&&void 0!==T?T:h.lx)&&void 0!==x?x:.1)*(S?S.lx:1),H={name:"Set Door Width",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(H.changedElementId,H.oldValue)},redo:function(){v(H.changedElementId,H.newValue)}};a(H),v(h.id,e),n(i+1)}}},P=h?d(h):null,S=P&&h?2*P.lx*Math.min(Math.abs(.5-h.cx),Math.abs(-.5-h.cx)):100;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Width",x),onApply:function(){T(m)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:S,style:{width:120},step:.1,precision:2,value:m,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return w(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.1, ",S.toFixed(1),"]",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:o,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",x)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",x)})]})})})]})})},BH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=Ew($r),p=OP(V.Door),y=Object(r.useMemo)((function(){var e=p?p.lz:1,t=p?h(p):null;return t?e*t.lz:e}),[null===p||void 0===p?void 0:p.lz]),g=Object(r.useState)(y),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){var r=i,n=h(r);r.lz=n?t/n.lz:t,n&&(r.cz=-(n.lz-t)/(2*n.lz));break}}}catch(c){o.e(c)}finally{o.f()}}))},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];b(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;b(o,t)}}catch(i){a.e(i)}finally{a.f()}},P=function(e){if(p&&function(e){if(p){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var r=h(o);if(r&&e!==o.lz*r.lz)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(a);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Door&&!s.locked){var d=h(s);if(d&&e!==s.lz*d.lz)return!0}}}catch(T){c.e(T)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,y=Object(f.a)(a);try{for(y.s();!(u=y.n()).done;){var g=u.value;if(g.type===V.Door&&g.foundationId===p.foundationId&&!g.locked){var m=h(g);if(m&&e!==g.lz*m.lz)return!0}}}catch(T){y.e(T)}finally{y.f()}break;case _.OnlyThisSide:var w,x=Object(f.a)(a);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.Door&&v.parentId===p.parentId&&!v.locked){var b=h(v);if(b&&e!==v.lz*b.lz)return!0}}}catch(T){x.e(T)}finally{x.f()}break;default:var A=h(p);if(A&&e!==p.lz*A.lz)return!0}return!1}}(e))switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=i,n=r?h(r):null;t.set(i.id,r.lz*(n?n.lz:1)),r.lz=n?e/n.lz:e,n&&(r.cz=-(n.lz-e)/(2*n.lz))}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Height for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){A(l.oldValues)},redo:function(){T(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i=o,n=i?h(i):null;r.set(o.id,i.lz*(n?n.lz:1)),i.lz=n?e/n.lz:e,n&&(i.cz=-(n.lz-e)/(2*n.lz))}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set Height for All Doors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){A(u.oldValues)},redo:function(){T(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var y=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===p.foundationId&&!o.locked){var i=o,r=i?h(i):null;y.set(o.id,i.lz*(r?r.lz:1)),i.lz=r?e/r.lz:e,r&&(i.cz=-(r.lz-e)/(2*r.lz))}}}catch(n){a.e(n)}finally{a.f()}}));var g={name:"Set Height for All Doors Above Foundation",timestamp:Date.now(),oldValues:y,newValue:e,groupId:p.foundationId,undo:function(){A(g.oldValues)},redo:function(){T(g.oldValues,g.newValue)}};o(g),c(n+1)}break;case _.OnlyThisSide:if(p.parentId){var m=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===p.parentId&&!o.locked){var i=o,r=i?h(i):null;m.set(o.id,i.lz*(r?r.lz:1)),i.lz=r?e/r.lz:e,r&&(i.cz=-(r.lz-e)/(2*r.lz))}}}catch(n){a.e(n)}finally{a.f()}}));var w={name:"Set Height for All Doors On the Same Wall",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.parentId,undo:function(){A(w.oldValues)},redo:function(){T(w.oldValues,w.newValue)}};o(w),c(n+1)}break;default:if(p){var x,v,P=s(p.id),S=p?h(P):null,j=(null!==(x=null!==(v=P.lz)&&void 0!==v?v:p.lz)&&void 0!==x?x:.2)*(S?S.lz:1),H={name:"Set Door Height",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){b(H.changedElementId,H.oldValue)},redo:function(){b(H.changedElementId,H.newValue)}};o(H),b(p.id,e),c(n+1)}}},S=p?h(p):null,j=null!==(t=null===S||void 0===S?void 0:S.lz)&&void 0!==t?t:20;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Height",v),onApply:function(){P(w)},onClose:function(){x(y),l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:j,style:{width:120},step:.1,precision:2,value:w,formatter:function(e){return Number(e).toFixed(2)},onChange:x}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [0.1, ",j.toFixed(1),"]",me.t("word.MeterAbbreviation",v)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",v)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",v)})]})})})]})})},KH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.volumetricHeatCapacity)&&void 0!==t?t:.5),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.volumetricHeatCapacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.volumetricHeatCapacity&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===(null===h||void 0===h?void 0:h.foundationId)&&e!==u.volumetricHeatCapacity&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===(null===h||void 0===h?void 0:h.parentId)&&e!==g.volumetricHeatCapacity&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.volumetricHeatCapacity))return!0}return!1}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r,n=i;t.set(i.id,null!==(r=n.volumetricHeatCapacity)&&void 0!==r?r:.5),n.volumetricHeatCapacity=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Volumetric Heat Capacity for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){v(l.oldValues)},redo:function(){b(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i,n=o;r.set(o.id,null!==(i=n.volumetricHeatCapacity)&&void 0!==i?i:.5),n.volumetricHeatCapacity=e}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set Volumetric Heat Capacity for All Doors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var p=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===h.foundationId&&!o.locked){var i,r=o;p.set(o.id,null!==(i=r.volumetricHeatCapacity)&&void 0!==i?i:.5),r.volumetricHeatCapacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var y={name:"Set Volumetric Heat Capacity for All Doors Above Foundation",timestamp:Date.now(),oldValues:p,newValue:e,groupId:h.foundationId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var g=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===h.parentId&&!o.locked){var i,r=o;g.set(o.id,null!==(i=r.volumetricHeatCapacity)&&void 0!==i?i:.5),r.volumetricHeatCapacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var m={name:"Set Volumetric Heat Capacity for All Doors On the Same Wall",timestamp:Date.now(),oldValues:g,newValue:e,groupId:h.parentId,undo:function(){v(m.oldValues)},redo:function(){b(m.oldValues,m.newValue)}};o(m),c(n+1)}break;default:if(h){var w,A,T=null!==(w=null!==(A=s(h.id).volumetricHeatCapacity)&&void 0!==A?A:h.volumetricHeatCapacity)&&void 0!==w?w:.5,P={name:"Set Volumetric Heat Capacity of Door",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(P.changedElementId,P.oldValue)},redo:function(){x(P.changedElementId,P.newValue)}};o(P),x(h.id,e),c(n+1)}}d((function(t){t.actionState.doorVolumetricHeatCapacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:m}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},qH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.opacity)&&void 0!==t?t:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.opacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.opacity&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&e!==c.opacity&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===h.foundationId&&e!==u.opacity&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===h.parentId&&e!==g.opacity&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.opacity))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r,n=i;t.set(i.id,null!==(r=n.opacity)&&void 0!==r?r:1),n.opacity=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Opacity for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){v(l.oldValues)},redo:function(){b(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i,n=o;r.set(o.id,null!==(i=n.opacity)&&void 0!==i?i:1),n.opacity=e}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set Opacity for All Doors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var p=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===h.foundationId&&!o.locked){var i,r=o;p.set(o.id,null!==(i=r.opacity)&&void 0!==i?i:1),r.opacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var y={name:"Set Opacity for All Doors Above Foundation",timestamp:Date.now(),oldValues:p,newValue:e,groupId:h.foundationId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var g=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===h.parentId&&!o.locked){var i,r=o;g.set(o.id,null!==(i=r.opacity)&&void 0!==i?i:1),r.opacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var m={name:"Set Opacity for All Doors On the Same Wall",timestamp:Date.now(),oldValues:g,newValue:e,groupId:h.parentId,undo:function(){v(m.oldValues)},redo:function(){b(m.oldValues,m.newValue)}};o(m),c(n+1)}break;default:if(h){var w,A,T=null!==(w=null!==(A=s(h.id).opacity)&&void 0!==A?A:h.opacity)&&void 0!==w?w:1,P={name:"Set Opacity of Door",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(P.changedElementId,P.oldValue)},redo:function(){x(P.changedElementId,P.newValue)}};o(P),x(h.id,e),c(n+1)}}d((function(t){t.actionState.doorOpacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("wallMenu.Opacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},QH=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Sr),c=Ew($u),s=Ew(Ii),d=Ew(Ci),h=Ew(Zr),p=OP(V.Door),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.frameColor)&&void 0!==t?t:"#ffffff"),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Door||(i.frameColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e){if(p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Door&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.frameColor)return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var o,r=Object(f.a)(i);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.Door&&!n.locked&&e!==n.frameColor)return!0}}catch(m){r.e(m)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(i);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===(null===p||void 0===p?void 0:p.foundationId)&&!u.locked&&e!==u.frameColor)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var h,y=Object(f.a)(i);try{for(y.s();!(h=y.n()).done;){var g=h.value;if(g.type===V.Door&&g.parentId===(null===p||void 0===p?void 0:p.parentId)&&!g.locked&&e!==g.frameColor)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.frameColor))return!0}return!1}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Door&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(r=u.frameColor)&&void 0!==r?r:"#ffffff")}}catch(U){a.e(U)}finally{a.f()}var y={name:"Set Color for Selected Doors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};n(y),b(l,e),d(s+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(Ew.getState().elements);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Door&&!T.locked)m.set(T.id,null!==(x=T.frameColor)&&void 0!==x?x:"#ffffff")}}catch(U){w.e(U)}finally{w.f()}var P={name:"Set Color for All Doors",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){A(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};n(P),b(m,e),d(s+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var S,j=new Map,H=Object(f.a)(Ew.getState().elements);try{for(H.s();!(S=H.n()).done;){var z,R=S.value;if(R.type===V.Door&&R.foundationId===p.foundationId&&!p.locked)j.set(R.id,null!==(z=R.frameColor)&&void 0!==z?z:"#ffffff")}}catch(U){H.e(U)}finally{H.f()}var D={name:"Set Color for All Doors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:p.foundationId,undo:function(){A(D.oldValues)},redo:function(){D.groupId&&b(D.oldValues,D.newValue)}};n(D),b(j,e),d(s+1)}break;case _.OnlyThisSide:if(p.parentId){var M,W=new Map,I=Object(f.a)(Ew.getState().elements);try{for(I.s();!(M=I.n()).done;){var C,O=M.value;if(O.type===V.Door&&O.parentId===p.parentId&&!p.locked)W.set(O.id,null!==(C=O.frameColor)&&void 0!==C?C:"#ffffff")}}catch(U){I.e(U)}finally{I.f()}var F={name:"Set Color for All Doors On the Same Wall",timestamp:Date.now(),oldValues:W,newValue:e,groupId:p.parentId,undo:function(){A(F.oldValues)},redo:function(){F.groupId&&b(F.oldValues,F.newValue)}};n(F),b(W,e),d(s+1)}break;default:if(p){var k,Y=h(p.id),L=null!==(k=Y?Y.frameColor:p.frameColor)&&void 0!==k?k:"#ffffff",E={name:"Set Color of Selected Door",timestamp:Date.now(),oldValue:L,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(E.changedElementId,E.oldValue)},redo:function(){v(E.changedElementId,E.newValue)}};n(E),v(p.id,e),d(s+1)}}o((function(t){t.actionState.doorColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("doorMenu.FrameColor",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==m&&void 0!==m?m:null===p||void 0===p?void 0:p.frameColor)&&void 0!==l?l:"#ffffff",onChangeComplete:function(e){w(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",x)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",x)})]})})})]})})},ZH=n.a.memo((function(){var e=OP(V.Door),t=Ew(Vi),l=Ew(Ci),a=Ew(Sr),o=Ew(si),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(r.useState)(!1),h=Object(u.a)(d,2),p=h[0],y=h[1],g=Object(r.useState)(!1),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useState)(!1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useState)(!1),S=Object(u.a)(P,2),j=S[0],H=S[1],z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(!1),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),Y=k[0],L=k[1];if(!e)return null;var E={lng:t},U="36px",N=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){i.doorType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},J=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){i.filled=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},G=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){i.interior=t;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"door-copy"}),!e.locked&&Object(gf.jsx)(PP,{keyName:"door-cut"}),Object(gf.jsx)(SP,{keyName:"door-lock"}),!e.locked&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:e.filled,onChange:function(t){var l=t.target.checked,i={name:"Filled Door",timestamp:Date.now(),checked:l,selectedElementId:e.id,selectedElementType:e.type,undo:function(){J(e.id,!i.checked)},redo:function(){J(e.id,i.checked)}};a(i),J(e.id,l),o((function(e){e.actionState.doorFilled=l}))},children:me.t("doorMenu.Filled",E)})},"door-filled"),Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"10px"},children:Object(gf.jsx)(_v.a,{checked:!!e.interior,onChange:function(t){var l=t.target.checked,i={name:"Interior Door",timestamp:Date.now(),checked:l,selectedElementId:e.id,selectedElementType:e.type,undo:function(){G(e.id,!i.checked)},redo:function(){G(e.id,i.checked)}};a(i),G(e.id,l),o((function(e){e.actionState.doorInterior=l}))},children:me.t("doorMenu.Interior",E)})}),e?Object(gf.jsx)(HP.a,{title:me.t("doorMenu.DoorType",E),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(tb.a.Group,{value:e.doorType,style:{height:"75px"},onChange:function(t){var l={name:"Select Door Type",timestamp:Date.now(),oldValue:e.doorType,newValue:t.target.value,changedElementId:e.id,changedElementType:e.type,undo:function(){N(l.changedElementId,l.oldValue)},redo:function(){N(l.changedElementId,l.newValue)}};a(l),N(e.id,t.target.value),o((function(e){e.actionState.doorType=t.target.value}))},children:[Object(gf.jsx)(tb.a,{style:UH,value:hy.Default,children:me.t("doorMenu.Default",E)}),Object(gf.jsx)(tb.a,{style:UH,value:hy.Arched,children:me.t("doorMenu.Arched",E)})]})},"door-type"):null,A&&Object(gf.jsx)(XH,{setDialogVisible:T}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),T(!0)},children:[me.t("word.Width",E)," ..."]},"door-width"),j&&Object(gf.jsx)(BH,{setDialogVisible:H}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),H(!0)},children:[me.t("word.Height",E)," ..."]},"door-height"),e.filled&&Object(gf.jsxs)(gf.Fragment,{children:[D&&Object(gf.jsx)(GH,{setDialogVisible:M}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),M(!0)},children:[me.t("word.UValue",E)," ..."]},"door-u-value"),Y&&Object(gf.jsx)(KH,{setDialogVisible:L}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),L(!0)},children:[me.t("word.VolumetricHeatCapacity",E)," ..."]},"door-heat-capacity"),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),s(!0)},children:[me.t("word.Texture",E)," ..."]},"door-texture"),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),y(!0)},children:[me.t("word.Color",E)," ..."]},"door-color"),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),x(!0)},children:[me.t("doorMenu.FrameColor",E)," ..."]},"door-frame-color"),(e.textureType===fe.Default||e.textureType===fe.NoTexture)&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),O(!0)},children:[me.t("wallMenu.Opacity",E)," ..."]},"door-opacity")]})]}),c&&Object(gf.jsx)(VH,{setDialogVisible:s}),p&&Object(gf.jsx)(JH,{setDialogVisible:y}),w&&Object(gf.jsx)(QH,{setDialogVisible:x}),C&&Object(gf.jsx)(qH,{setDialogVisible:O})]})})),_H=function(e){var t,l=e.window,a=e.dataType,o=e.attributeKey,i=e.setDialogVisible,r=Ew(Fi),n=Ew(si),c=Ew(Sr),s=Ew(_u),d=Ew(Ii),h=Ew(Ci),p=FP(null!==(t=l[o])&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){n((function(l){var a,i=Object(f.a)(l.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(r.id===e){r.locked||r.type!==V.Window||(r[o]=t);break}}}catch(n){i.e(n)}finally{i.f()}}))},v=function(e,t){n((function(l){var a,i=Object(f.a)(l.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;r.locked||r.type!==V.Window||r.parentId!==e||(r[o]=t)}}catch(n){i.e(n)}finally{i.f()}}))},b=function(e,t){n((function(l){var a,i=Object(f.a)(l.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;r.locked||r.type!==V.Window||r.foundationId!==e||(r[o]=t)}}catch(n){i.e(n)}finally{i.f()}}))},A=function(e){n((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.locked||i.type!==V.Window||(i[o]=e)}}catch(r){a.e(r)}finally{a.f()}}))},T=function(e,t){n((function(l){var a,i=Object(f.a)(l.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;!r.locked&&r.type===V.Window&&e.has(r.id)&&(r[o]=t)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e){if(l&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(r);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Window&&e!==i[o]&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(w){a.e(w)}finally{a.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(r);try{for(c.s();!(n=c.n()).done;){var d=n.value;if(d.type===V.Window&&e!==d[o]&&!d.locked)return!0}}catch(w){c.e(w)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(r);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Window&&p.foundationId===l.foundationId&&e!==p[o]&&!p.locked)return!0}}catch(w){h.e(w)}finally{h.f()}break;case _.OnlyThisSide:var y,g=Object(f.a)(r);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.Window&&m.parentId===l.parentId&&e!==m[o]&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==l[o])return!0}return!1}(e)){switch(s){case _.AllSelectedObjectsOfThisType:var t,i=new Map,u=Object(f.a)(r);try{for(u.s();!(t=u.n()).done;){var p=t.value;p.type===V.Window&&!p.locked&&Ew.getState().selectedElementIdSet.has(p.id)&&i.set(p.id,p[o])}}catch(L){u.e(L)}finally{u.f()}var y={name:"Set ".concat(a," for Selected Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){P(y.oldValues)},redo:function(){T(y.oldValues,y.newValue)}};c(y),T(i,e),h(d+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(r);try{for(w.s();!(g=w.n()).done;){var S=g.value;S.type!==V.Window||S.locked||m.set(S.id,S[o])}}catch(L){w.e(L)}finally{w.f()}var j={name:"Set ".concat(a," for All Windows"),timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){P(j.oldValues)},redo:function(){A(j.newValue)}};c(j),A(e),h(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(l.foundationId){var H,z=new Map,R=Object(f.a)(r);try{for(R.s();!(H=R.n()).done;){var D=H.value;D.type!==V.Window||D.foundationId!==l.foundationId||l.locked||z.set(D.id,D[o])}}catch(L){R.e(L)}finally{R.f()}var M={name:"Set ".concat(a," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:z,newValue:e,groupId:l.foundationId,undo:function(){P(M.oldValues)},redo:function(){b(M.groupId,M.newValue)}};c(M),b(l.foundationId,e),h(d+1)}break;case _.OnlyThisSide:if(l.parentId){var W,I=new Map,C=Object(f.a)(r);try{for(C.s();!(W=C.n()).done;){var O=W.value;O.type!==V.Window||O.parentId!==l.parentId||O.locked||I.set(O.id,O[o])}}catch(L){C.e(L)}finally{C.f()}var F={name:"Set ".concat(a," for All Windows On the Same Wall"),timestamp:Date.now(),oldValues:I,newValue:e,groupId:l.parentId,undo:function(){P(F.oldValues)},redo:function(){v(l.parentId,F.newValue)}};c(F),v(l.parentId,e),h(d+1)}break;default:if(l){var k=l[o],Y={name:"Set ".concat(a," of Selected window"),timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:l.id,changedElementType:l.type,undo:function(){x(Y.changedElementId,Y.oldValue)},redo:function(){x(Y.changedElementId,Y.newValue)}};c(Y),x(l.id,e),h(d+1)}}n((function(t){switch(a){case YH.Tint:t.actionState.windowTint=e;break;case YH.MullionColor:t.actionState.windowMullionColor=e;break;case YH.Color:t.actionState.windowColor=e}}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("windowMenu.".concat(a),w),onApply:function(){l[o]!==g&&S(g)},onClose:function(){i()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:null!==g&&void 0!==g?g:"#73D8FF",onChangeComplete:m})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",w)})]})})})]})})},$H=function(e){var t=e.windowModel,l=e.dataType,a=e.attributeKey,o=e.range,i=e.step,n=e.unit,c=e.note,s=e.digit,d=e.setDialogVisible,h=Ew(Fi),p=Ew(Sr),y=Ew(_u),g=Ew(Ii),m=Ew(Ci),w=Ew(si),x=Ew($r),v=Object(r.useMemo)((function(){var e=t[a],l=x(t);if(l&&t.parentType!==V.Roof){if("lx"===a)return e*l.lx;if("lz"===a)return e*l.lz}return"sillWidth"===a&&void 0===e?.2:e}),[a,t]),b=Object(r.useState)(v),A=Object(u.a)(b,2),T=A[0],P=A[1],S=$f(),j=function(e,t,l){var a=x(e);!a||"lx"!==t&&"lz"!==t||e.parentType===V.Roof?e[t]=l:e[t]=l/a[t]},H=function(e,t){w((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e){r.locked||r.type!==V.Window||j(r,a,t);break}}}catch(n){i.e(n)}finally{i.f()}}))},z=function(e,t){e&&w((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.parentId!==e||j(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},R=function(e,t){e&&w((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.foundationId!==e||j(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},D=function(e){w((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.locked||i.type!==V.Window||j(i,a,e)}}catch(r){o.e(r)}finally{o.f()}}))},M=function(e,t){w((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;!r.locked&&r.type===V.Window&&e.has(r.id)&&j(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},W=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];H(o,i)}}catch(r){l.e(r)}finally{l.f()}},I=function(e){if(t&&function(e){switch(y){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(h);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Window&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=i,n=x(r);if(n&&r.parentType!==V.Roof){if("lx"===a){if(e!==r[a]*n.lx)return!0}else if("lz"===a){if(e!==r[a]*n.lz)return!0}else if(e!==r[a])return!0}else if(e!==r[a])return!0}}}catch(z){o.e(z)}finally{o.f()}break;case _.AllObjectsOfThisType:var c,s=Object(f.a)(h);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Window&&!d.locked){var u=d,p=x(u);if(p&&u.parentType!==V.Roof){if("lx"===a){if(e!==u[a]*p.lx)return!0}else if("lz"===a){if(e!==u[a]*p.lz)return!0}else if(e!==u[a])return!0}else if(e!==u[a])return!0}}}catch(z){s.e(z)}finally{s.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var g,m=Object(f.a)(h);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.type===V.Window&&w.foundationId===t.foundationId&&!w.locked){var v=w,b=x(v);if(b&&v.parentType!==V.Roof){if("lx"===a){if(e!==v[a]*b.lx)return!0}else if("lz"===a){if(e!==v[a]*b.lz)return!0}else if(e!==v[a])return!0}else if(e!==v[a])return!0}}}catch(z){m.e(z)}finally{m.f()}break;case _.OnlyThisSide:var A,T=Object(f.a)(h);try{for(T.s();!(A=T.n()).done;){var P=A.value;if(P.type===V.Window&&P.parentId===t.parentId&&!P.locked){var S=P,j=x(S);if(j&&S.parentType!==V.Roof){if("lx"===a){if(e!==S[a]*j.lx)return!0}else if("lz"===a){if(e!==S[a]*j.lz)return!0}else if(e!==S[a])return!0}else if(e!==S[a])return!0}}}catch(z){T.e(z)}finally{T.f()}break;default:var H=x(t);if(H&&t.parentType!==V.Roof){if("lx"===a){if(e!==t[a]*H.lx)return!0}else if("lz"===a){if(e!==t[a]*H.lz)return!0}else if(e!==t[a])return!0}else if(e!==t[a])return!0}return!1}(e)){switch(y){case _.AllSelectedObjectsOfThisType:var o,i=new Map,r=Object(f.a)(h);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.Window&&!n.locked&&Ew.getState().selectedElementIdSet.has(n.id)){var c=n,s=x(c),d=c[a];s&&c.parentType!==V.Roof&&("lx"===a?d*=s.lx:"lz"===a&&(d*=s.lz)),i.set(n.id,d)}}}catch(te){r.e(te)}finally{r.f()}var u={name:"Set ".concat(l," for Selected Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){W(u.oldValues)},redo:function(){M(u.oldValues,u.newValue)}};p(u),M(i,e),m(g+1);break;case _.AllObjectsOfThisType:var v,b=new Map,A=Object(f.a)(h);try{for(A.s();!(v=A.n()).done;){var T=v.value;if(T.type===V.Window&&!T.locked){var P=T,S=x(P),j=P[a];S&&P.parentType!==V.Roof&&("lx"===a?j*=S.lx:"lz"===a&&(j*=S.lz)),b.set(T.id,j)}}}catch(te){A.e(te)}finally{A.f()}var I={name:"Set ".concat(l," for All Windows"),timestamp:Date.now(),oldValues:b,newValue:e,undo:function(){W(I.oldValues)},redo:function(){D(I.newValue)}};p(I),D(e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var C,O=new Map,F=Object(f.a)(h);try{for(F.s();!(C=F.n()).done;){var k=C.value;if(k.type===V.Window&&k.foundationId===t.foundationId&&!k.locked){var Y=k,L=x(Y),E=Y[a];L&&Y.parentType!==V.Roof&&("lx"===a?E*=L.lx:"lz"===a&&(E*=L.lz)),O.set(k.id,E)}}}catch(te){F.e(te)}finally{F.f()}var U={name:"Set ".concat(l," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:O,newValue:e,groupId:t.foundationId,undo:function(){W(U.oldValues)},redo:function(){R(t.foundationId,U.newValue)}};p(U),R(t.foundationId,e),m(g+1)}break;case _.OnlyThisSide:if(t.parentId){var N,J=new Map,G=Object(f.a)(h);try{for(G.s();!(N=G.n()).done;){var X=N.value;if(X.type===V.Window&&X.parentId===t.parentId&&!X.locked){var B=X,K=x(B),q=B[a];K&&B.parentType!==V.Roof&&("lx"===a?q*=K.lx:"lz"===a&&(q*=K.lz)),J.set(X.id,q)}}}catch(te){G.e(te)}finally{G.f()}var Q={name:"Set ".concat(l," for All Windows On the Same Parent"),timestamp:Date.now(),oldValues:J,newValue:e,groupId:t.parentId,undo:function(){W(Q.oldValues)},redo:function(){z(t.parentId,Q.newValue)}};p(Q),z(t.parentId,e),m(g+1)}break;default:if(t){var Z=t[a],$=x(t);$&&t.parentType!==V.Roof&&("lx"===a?Z*=$.lx:"lz"===a&&(Z*=$.lz));var ee={name:"Set Window ".concat(l),timestamp:Date.now(),oldValue:Z,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){H(ee.changedElementId,ee.oldValue)},redo:function(){H(ee.changedElementId,ee.newValue)}};p(ee),H(t.id,e),m(g+1)}}w((function(t){switch(l){case YH.Width:t.actionState.windowWidth=e;break;case YH.Height:t.actionState.windowHeight=e;break;case YH.Opacity:t.actionState.windowOpacity=e;break;case YH.FrameWidth:t.actionState.windowFrameWidth=e;break;case YH.SillWidth:t.actionState.windowSillWidth=e;break;case YH.HorizontalMullionSpacing:t.actionState.windowHorizontalMullionSpacing=e;break;case YH.VerticalMullionSpacing:t.actionState.windowVerticalMullionSpacing=e;break;case YH.MullionWidth:t.actionState.windowMullionWidth=e}}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("windowMenu.".concat(l),S),onApply:function(){I(T)},onClose:function(){d()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:o[0],max:o[1],style:{width:120},step:i,precision:2,value:T,formatter:function(e){return Number(e).toFixed(2)},onChange:P}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",S),": [",o[0].toFixed(0===o[0]?0:null!==s&&void 0!==s?s:0),","," ",o[1].toFixed(null!==s&&void 0!==s?s:0),"] ",n," ",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{})," ",c]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:n}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",S)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",S)})]})})})]})})},ez=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(_u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Window),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.uValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Tw.toUValueInUS(g)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.uValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];T(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;T(o,t)}}catch(i){a.e(i)}finally{a.f()}},j=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Window&&e!==o.uValue&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Window&&e!==c.uValue&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Window&&u.foundationId===h.foundationId&&e!==u.uValue&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Window&&g.parentId===h.parentId&&e!==g.uValue&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.uValue))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Window&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p,y=u;l.set(u.id,null!==(p=y.uValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(X){r.e(X)}finally{r.f()}var g={name:"Set U-Value for Selected Windows",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){P(g.oldValues)},redo:function(){S(g.oldValues,g.newValue)}};o(g),c(n+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Window&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.uValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(X){x.e(X)}finally{x.f()}var j={name:"Set U-Value for All Windows",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){P(j.oldValues)},redo:function(){S(j.oldValues,j.newValue)}};o(j),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var H,z=new Map,R=Object(f.a)(a);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.Window&&D.foundationId===h.foundationId&&!D.locked){var M,W=D;z.set(D.id,null!==(M=W.uValue)&&void 0!==M?M:2),T(W.id,e)}}}catch(X){R.e(X)}finally{R.f()}var I={name:"Set U-Value for All Windows Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:h.foundationId,undo:function(){P(I.oldValues)},redo:function(){S(I.oldValues,I.newValue)}};o(I),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var C,O=new Map,F=Object(f.a)(a);try{for(F.s();!(C=F.n()).done;){var k=C.value;if(k.type===V.Window&&k.parentId===h.parentId&&!k.locked){var Y,L=k;O.set(k.id,null!==(Y=L.uValue)&&void 0!==Y?Y:2),T(L.id,e)}}}catch(X){F.e(X)}finally{F.f()}var E={name:"Set U-Value for All Windows On the Same Wall",timestamp:Date.now(),oldValues:O,newValue:e,groupId:h.parentId,undo:function(){P(E.oldValues)},redo:function(){S(E.oldValues,E.newValue)}};o(E),c(n+1)}break;default:if(h){var U,N,J=null!==(U=null!==(N=s(h.id).uValue)&&void 0!==N?N:h.uValue)&&void 0!==U?U:2,G={name:"Set Window U-Value",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){T(G.changedElementId,G.oldValue)},redo:function(){T(G.changedElementId,G.newValue)}};o(G),T(h.id,e),c(n+1)}}d((function(t){t.actionState.windowUValue=e}))}};return Object(gf.jsx)(kP,{width:550,title:"".concat(me.t("word.UValue",A)+" ","(").concat(me.t("word.ThermalTransmittance",A),")"),onApply:function(){j(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){m(e),b(Tw.toUValueInUS(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",A),": W/(m\xb2\xb7\u2103)"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toUValueInUS(.01),max:Tw.toUValueInUS(100),style:{width:120},step:.01,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),m(Tw.toUValueInSI(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Tw.toUValueInUS(.01).toFixed(3),", ",Tw.toUValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",A),": Btu/(h\xb7ft\xb2\xb7\u2109)"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",A)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",A)})]})})})]})})},tz=db.a.Option,lz=function(e){var t=e.window,l=e.dataType,a=e.attributeKey,o=e.options,i=e.optionsText,n=e.setDialogVisible,c=Ew(Fi),s=Ew(si),d=Ew(Sr),h=Ew(_u),p=Ew(Ii),y=Ew(Ci),g=Object(r.useState)(t[a]),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){s((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e){r.locked||r.type!==V.Window||(r[a]=t);break}}}catch(n){i.e(n)}finally{i.f()}}))},A=function(e,t){s((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.parentId!==e||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},T=function(e,t){s((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.foundationId!==e||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){s((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.locked||i.type!==V.Window||(i[a]=e)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e,t){s((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;!r.locked&&r.type===V.Window&&e.has(r.id)&&(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},j=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];b(o,i)}}catch(r){l.e(r)}finally{l.f()}},H=function(e){if(t&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(c);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Window&&e!==i[a]&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(w){o.e(w)}finally{o.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(c);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Window&&e!==s[a]&&!s.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(c);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Window&&p.foundationId===t.foundationId&&e!==p[a]&&!p.locked)return!0}}catch(w){u.e(w)}finally{u.f()}break;case _.OnlyThisSide:var y,g=Object(f.a)(c);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.Window&&m.parentId===t.parentId&&e!==m[a]&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==t[a])return!0}return!1}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var o,i=new Map,r=Object(f.a)(c);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Window&&!n.locked&&Ew.getState().selectedElementIdSet.has(n.id)&&i.set(n.id,n[a])}}catch(L){r.e(L)}finally{r.f()}var u={name:"Set ".concat(l," for Selected Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){j(u.oldValues)},redo:function(){S(u.oldValues,u.newValue)}};d(u),S(i,e),y(p+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(c);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type!==V.Window||x.locked||m.set(x.id,x[a])}}catch(L){w.e(L)}finally{w.f()}var v={name:"Set ".concat(l," for All Windows"),timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){j(v.oldValues)},redo:function(){P(v.newValue)}};d(v),P(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var H,z=new Map,R=Object(f.a)(c);try{for(R.s();!(H=R.n()).done;){var D=H.value;D.type!==V.Window||D.foundationId!==t.foundationId||t.locked||z.set(D.id,D[a])}}catch(L){R.e(L)}finally{R.f()}var M={name:"Set ".concat(l," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:z,newValue:e,groupId:t.foundationId,undo:function(){j(M.oldValues)},redo:function(){T(M.groupId,M.newValue)}};d(M),T(t.foundationId,e),y(p+1)}break;case _.OnlyThisSide:if(t.parentId){var W,I=new Map,C=Object(f.a)(c);try{for(C.s();!(W=C.n()).done;){var O=W.value;O.type!==V.Window||O.parentId!==t.parentId||O.locked||I.set(O.id,O[a])}}catch(L){C.e(L)}finally{C.f()}var F={name:"Set ".concat(l," for All Windows On the Same Wall"),timestamp:Date.now(),oldValues:I,newValue:e,groupId:t.parentId,undo:function(){j(F.oldValues)},redo:function(){A(t.parentId,F.newValue)}};d(F),A(t.parentId,e),y(p+1)}break;default:if(t){var k=t[a],Y={name:"Set ".concat(l," of Selected window"),timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){b(Y.changedElementId,Y.oldValue)},redo:function(){b(Y.changedElementId,Y.newValue)}};d(Y),b(t.id,e),y(p+1)}}s((function(t){switch(l){case YH.Tint:t.actionState.windowTint=e;break;case YH.MullionColor:t.actionState.windowMullionColor=e;break;case YH.Color:t.actionState.windowColor=e}}))}};return Object(gf.jsx)(kP,{width:560,title:me.t("windowMenu.".concat(l),v),onApply:function(){t[a]!==w&&H(w)},onClose:function(){n()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)(db.a,{style:{width:"150px"},value:w,onChange:function(e){return x(e)},children:o.map((function(e,t){return Object(gf.jsx)(tz,{value:e,children:i[t]},e)}))})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",v)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",v)})]})})})]})})},az=function(e){var t=e.window,l=e.dataType,a=e.attributeKey,o=e.setDialogVisible,i=Ew(Fi),n=Ew(si),c=Ew(Sr),s=Ew(_u),d=Ew(Ii),h=Ew(Ci),p=Object(r.useState)(t[a]),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){n((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&!r.locked&&r.type===V.Window){r[a]=t;break}}}catch(n){i.e(n)}finally{i.f()}}))},v=function(e,t){n((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.parentId!==e||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},b=function(e,t){n((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.foundationId!==e||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},A=function(e){n((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.locked||i.type!==V.Window||(i[a]=e)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t){n((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;!r.locked&&r.type===V.Window&&e.has(r.id)&&(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e){if(t&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(i);try{for(o.s();!(l=o.n()).done;){var r=l.value;if(r.type===V.Window&&!r.locked&&Ew.getState().selectedElementIdSet.has(r.id)&&r[a]!==e)return!0}}catch(w){o.e(w)}finally{o.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(i);try{for(c.s();!(n=c.n()).done;){var d=n.value;if(d.type===V.Window&&!d.locked&&d[a]!==e)return!0}}catch(w){c.e(w)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(i);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Window&&p.foundationId===t.foundationId&&!p.locked&&p[a]!==e)return!0}}catch(w){h.e(w)}finally{h.f()}break;case _.OnlyThisSide:var y,g=Object(f.a)(i);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.Window&&m.parentId===t.parentId&&!m.locked&&m[a]!==e)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(t[a]!==e)return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var o,r=new Map,n=Object(f.a)(i);try{for(n.s();!(o=n.n()).done;){var u=o.value;u.type===V.Window&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)&&r.set(u.id,u[a])}}catch(Y){n.e(Y)}finally{n.f()}var p={name:"Set ".concat(l," for Selected Windows"),timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){P(p.oldValues)},redo:function(){T(p.oldValues,p.newValue)}};c(p),T(r,e),h(d+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(i);try{for(m.s();!(y=m.n()).done;){var w=y.value;w.type!==V.Window||w.locked||g.set(w.id,w[a])}}catch(Y){m.e(Y)}finally{m.f()}var S={name:"Set ".concat(l," for All Windows"),timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){P(S.oldValues)},redo:function(){A(S.newValue)}};c(S),A(e),h(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var j,H=new Map,z=Object(f.a)(i);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type!==V.Window||R.foundationId!==t.foundationId||t.locked||H.set(R.id,R[a])}}catch(Y){z.e(Y)}finally{z.f()}var D={name:"Set ".concat(l," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:H,newValue:e,groupId:t.foundationId,undo:function(){P(D.oldValues)},redo:function(){b(D.groupId,D.newValue)}};c(D),b(t.foundationId,e),h(d+1)}break;case _.OnlyThisSide:if(t.parentId){var M,W=new Map,I=Object(f.a)(i);try{for(I.s();!(M=I.n()).done;){var C=M.value;C.type!==V.Window||C.parentId!==t.parentId||C.locked||W.set(C.id,C[a])}}catch(Y){I.e(Y)}finally{I.f()}var O={name:"Set ".concat(l," for All Windows On the Same Wall"),timestamp:Date.now(),oldValues:W,newValue:e,groupId:t.parentId,undo:function(){P(O.oldValues)},redo:function(){v(t.parentId,O.newValue)}};c(O),v(t.parentId,e),h(d+1)}break;default:if(t){var F=t[a],k={name:"Set ".concat(l," of Selected window"),timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){x(k.changedElementId,k.oldValue)},redo:function(){x(k.changedElementId,k.newValue)}};c(k),x(t.id,e),h(d+1)}}};return Object(gf.jsx)(kP,{width:500,title:me.t("windowMenu.".concat(l),w),onApply:function(){t[a]!==g&&S(g)},onClose:function(){o()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:4,children:Object(gf.jsx)(eb.a,{checked:g,onChange:function(e){m(e)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",w)})]})})})]})})};!function(e){e.Color="Color",e.Tint="Tint",e.Opacity="Opacity",e.WindowType="WindowType",e.HorizontalMullion="HorizontalMullion",e.VerticalMullion="VerticalMullion",e.MullionWidth="MullionWidth",e.HorizontalMullionSpacing="HorizontalMullionSpacing",e.VerticalMullionSpacing="VerticalMullionSpacing",e.MullionColor="MullionColor",e.Frame="Frame",e.FrameWidth="FrameWidth",e.SillWidth="SillWidth",e.Width="Width",e.Height="Height",e.Setback="Setback",e.LeftShutter="LeftShutter",e.RightShutter="RightShutter",e.ShutterColor="ShutterColor",e.ShutterWidth="ShutterWidth"}(YH||(YH={}));var oz,iz,rz,nz,cz,sz,dz,uz,fz,hz,pz,yz,gz,mz,wz,xz,vz,bz,Az,Tz,Pz,Sz,jz,Hz,zz,Rz,Dz,Mz,Wz,Iz,Cz,Oz={Tint:{attributeKey:"tint"},Color:{attributeKey:"color"},MullionColor:{attributeKey:"mullionColor"},ShutterColor:{attributeKey:"shutterColor"}},Fz={HorizontalMullion:{attributeKey:"horizontalMullion"},VerticalMullion:{attributeKey:"verticalMullion"},Frame:{attributeKey:"frame"},LeftShutter:{attributeKey:"leftShutter"},RightShutter:{attributeKey:"rightShutter"}},kz={WindowType:{attributeKey:"windowType",options:[Yt.Default,Yt.Arched,Yt.Polygonal]}},Yz={Opacity:{attributeKey:"opacity",range:[0,.9],step:.1,note:"windowMenu.SolarHeatGainCoefficient",digit:1},Width:{attributeKey:"lx",range:[.1,100],step:.1,unit:"word.MeterAbbreviation",digit:1},Height:{attributeKey:"lz",range:[.1,100],step:.1,unit:"word.MeterAbbreviation",digit:1},Setback:{attributeKey:"cy",range:[0,1],step:.01,unit:"",digit:0,note:"windowMenu.RelativeToWallThickness"},MullionWidth:{attributeKey:"mullionWidth",range:[0,.2],step:.1,unit:"word.MeterAbbreviation",digit:1},ShutterWidth:{attributeKey:"shutterWidth",range:[0,.5],step:.01,unit:"",digit:1},HorizontalMullionSpacing:{attributeKey:"horizontalMullionSpacing",range:[.1,5],step:.01,unit:"word.MeterAbbreviation",digit:1},VerticalMullionSpacing:{attributeKey:"verticalMullionSpacing",range:[.1,5],step:.01,unit:"word.MeterAbbreviation",digit:1},FrameWidth:{attributeKey:"frameWidth",range:[.05,.2],step:.01,unit:"word.MeterAbbreviation",digit:2},SillWidth:{attributeKey:"sillWidth",range:[0,.5],step:.01,unit:"word.MeterAbbreviation",digit:2}},Lz=n.a.memo((function(){var e=Ew(si),t=Ew(Vi),l=Ew(Sr),a=Ew(Ci),o=Ew($r),i=Object(r.useState)(null),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(r.useState)(!1),h=Object(u.a)(d,2),p=h[0],y=h[1],g=OP(V.Window);if(!g)return null;var m={lng:t},w=g?o(g):null,x=function(t,l){e((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&i.type===V.Window){i.empty=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(t,l){e((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&i.type===V.Window){i.interior=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){return Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){a(0),s(e)},children:[me.t("windowMenu.".concat(e),m)," ..."]},"window-".concat(e))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"window-copy"}),!g||g.locked?null:Object(gf.jsx)(PP,{keyName:"window-cut"}),Object(gf.jsx)(SP,{keyName:"window-lock"}),!g.locked&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!g.empty,onChange:function(t){var a=t.target.checked,o={name:"Empty Window",timestamp:Date.now(),checked:a,selectedElementId:g.id,selectedElementType:g.type,undo:function(){x(g.id,!o.checked)},redo:function(){x(g.id,o.checked)}};l(o),x(g.id,a),e((function(e){e.actionState.windowEmpty=a}))},children:me.t("windowMenu.Empty",m)})},"window-empty"),Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"10px"},children:Object(gf.jsx)(_v.a,{checked:!!g.interior,onChange:function(t){var a=t.target.checked,o={name:"Interior Window",timestamp:Date.now(),checked:a,selectedElementId:g.id,selectedElementType:g.type,undo:function(){v(g.id,!o.checked)},redo:function(){v(g.id,o.checked)}};l(o),v(g.id,a),e((function(e){e.actionState.windowInterior=a}))},children:me.t("windowMenu.Interior",m)})}),b(YH.WindowType),b(YH.Width),b(YH.Height),b(YH.Setback),b(YH.Opacity),b(YH.Tint),p&&Object(gf.jsx)(ez,{setDialogVisible:y}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){a(0),y(!0)},children:[me.t("word.UValue",m)," ..."]},"window-u-value"),g?Object(gf.jsxs)(HP.a,{title:me.t("windowMenu.Mullion",m),style:{paddingLeft:"24px"},children:[b(YH.HorizontalMullion),b(YH.VerticalMullion),Object(gf.jsx)(wH.a,{plain:!0,style:{margin:"6px"}}),b(YH.HorizontalMullionSpacing),b(YH.VerticalMullionSpacing),b(YH.MullionWidth),b(YH.MullionColor)]},"window-mullion"):null,g?Object(gf.jsxs)(HP.a,{title:me.t("windowMenu.Frame",m),style:{paddingLeft:"24px"},children:[b(YH.Frame),Object(gf.jsx)(wH.a,{plain:!0,style:{margin:"6px"}}),b(YH.FrameWidth),b(YH.SillWidth),b(YH.Color)]},"window-frame"):null,g?Object(gf.jsxs)(HP.a,{title:me.t("windowMenu.Shutter",m),style:{paddingLeft:"24px"},children:[b(YH.LeftShutter),b(YH.RightShutter),b(YH.ShutterColor),b(YH.ShutterWidth)]},"window-shutter"):null,function(){switch(c){case YH.Frame:case YH.LeftShutter:case YH.RightShutter:case YH.HorizontalMullion:case YH.VerticalMullion:var e=Fz[c];return e?Object(gf.jsx)(az,{window:g,dataType:c,attributeKey:e.attributeKey,setDialogVisible:function(){return s(null)}}):null;case YH.Tint:case YH.MullionColor:case YH.ShutterColor:case YH.Color:var t=Oz[c];return t?Object(gf.jsx)(_H,{window:g,dataType:c,attributeKey:t.attributeKey,setDialogVisible:function(){return s(null)}}):null;case YH.WindowType:var l=kz[c];return l?Object(gf.jsx)(lz,{window:g,dataType:c,attributeKey:l.attributeKey,options:[Yt.Default,Yt.Arched,Yt.Polygonal],optionsText:[me.t("windowMenu.Default",m),me.t("windowMenu.Arched",m),me.t("windowMenu.Polygonal",m)],setDialogVisible:function(){return s(null)}}):null;case YH.Opacity:case YH.Width:case YH.Height:case YH.Setback:case YH.HorizontalMullionSpacing:case YH.VerticalMullionSpacing:case YH.MullionWidth:case YH.SillWidth:case YH.ShutterWidth:case YH.FrameWidth:var a,o=Yz[c];return c===YH.Width?o.range[1]=w&&g&&g.parentType!==V.Roof?2*w.lx*Math.min(Math.abs(.5-g.cx),Math.abs(-.5-g.cx)):100:c===YH.Height&&(o.range[1]=w&&g&&g.parentType!==V.Roof?2*w.lz*Math.min(Math.abs(.5-g.cz),Math.abs(-.5-g.cz)):100),o?Object(gf.jsx)($H,{windowModel:g,dataType:c,attributeKey:o.attributeKey,range:o.range,step:o.step,setDialogVisible:function(){return s(null)},unit:o.unit?me.t(o.unit,m):void 0,note:o.note?me.t(o.note,m):void 0,digit:null!==(a=o.digit)&&void 0!==a?a:0}):null}}()]})]})})),Ez=l.p+"static/media/roof_01_menu.1418beb1.png",Uz=l.p+"static/media/roof_02_menu.055d6e06.png",Nz=l.p+"static/media/roof_03_menu.1d45e089.png",Vz=l.p+"static/media/roof_04_menu.20dee2dd.png",Jz=l.p+"static/media/roof_05_menu.34757ec1.png",Gz=l.p+"static/media/roof_06_menu.0fce42da.png",Xz=l.p+"static/media/roof_07_menu.d0b809f8.png",Bz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(si),d=Ew(Zr),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.textureType)&&void 0!==t?t:he.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=db.a.Option,v=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.textureType=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.textureType&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.textureType&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.textureType&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.textureType))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Roof&&!p.locked&&Ew.getState().selectedElementIdSet.has(p.id))l.set(p.id,null!==(u=p.textureType)&&void 0!==u?u:he.Default)}}catch(I){r.e(I)}finally{r.f()}var y={name:"Set Texture for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),b(l,e),c(n+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(a);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Roof&&!T.locked)m.set(T.id,null!==(x=T.textureType)&&void 0!==x?x:he.Default)}}catch(I){w.e(I)}finally{w.f()}var P={name:"Set Texture for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){A(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};o(P),b(m,e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(a);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type!==V.Roof||z.foundationId!==h.foundationId||z.locked||j.set(z.id,z.textureType)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Texture for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){A(R.oldValues)},redo:function(){R.groupId&&b(R.oldValues,R.newValue)}};o(R),b(j,e),c(n+1)}break;default:if(h){var D=d(h.id),M=D?D.textureType:h.textureType,W={name:"Set Texture of Selected Roof",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};o(W),v(h.id,e),c(n+1)}}s((function(t){t.actionState.roofTexture=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:g,onChange:function(e){return m(e)},children:[Object(gf.jsxs)(x,{value:he.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",w)]},he.NoTexture),Object(gf.jsxs)(x,{value:he.Default,children:[Object(gf.jsx)("img",{alt:he.Default,src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.TextureDefault",w)]},he.Default),Object(gf.jsxs)(x,{value:he.Texture01,children:[Object(gf.jsx)("img",{alt:he.Texture01,src:Ez,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture01",w)]},he.Texture01),Object(gf.jsxs)(x,{value:he.Texture02,children:[Object(gf.jsx)("img",{alt:he.Texture02,src:Uz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture02",w)]},he.Texture02),Object(gf.jsxs)(x,{value:he.Texture03,children:[Object(gf.jsx)("img",{alt:he.Texture03,src:Nz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture03",w)]},he.Texture03),Object(gf.jsxs)(x,{value:he.Texture04,children:[Object(gf.jsx)("img",{alt:he.Texture04,src:Vz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture04",w)]},he.Texture04),Object(gf.jsxs)(x,{value:he.Texture05,children:[Object(gf.jsx)("img",{alt:he.Texture05,src:Jz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture05",w)]},he.Texture05),Object(gf.jsxs)(x,{value:he.Texture06,children:[Object(gf.jsx)("img",{alt:he.Texture06,src:Gz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture06",w)]},he.Texture06),Object(gf.jsxs)(x,{value:he.Texture07,children:[Object(gf.jsx)("img",{alt:he.Texture07,src:Xz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture07",w)]},he.Texture07)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Kz=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew(Zu),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.color)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.color=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},A=function(e){if(h&&function(e){if(h){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.color&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Roof&&e!==c.color&&!c.locked)return!0}}catch(p){r.e(p)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.color&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.color))return!0}return!1}}(e)){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Roof&&!p.locked)l.set(p.id,null!==(u=p.color)&&void 0!==u?u:"#ffffff")}}catch(O){r.e(O)}finally{r.f()}var y={name:"Set Color for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(y.oldValues)},redo:function(){v(y.oldValues,y.newValue)}};i(y),v(l,e),s(c+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(o);try{for(w.s();!(g=w.n()).done;){var A,T=g.value;if(T.type===V.Roof&&!T.locked)m.set(T.id,null!==(A=T.color)&&void 0!==A?A:"#ffffff")}}catch(O){w.e(O)}finally{w.f()}var P={name:"Set Color for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){b(P.oldValues)},redo:function(){v(P.oldValues,P.newValue)}};i(P),v(m,e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z,R=S.value;if(R.type===V.Roof&&R.foundationId===h.foundationId&&!h.locked)j.set(R.id,null!==(z=R.color)&&void 0!==z?z:"#ffffff")}}catch(O){H.e(O)}finally{H.f()}var D={name:"Set Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){b(D.oldValues)},redo:function(){D.groupId&&v(D.oldValues,D.newValue)}};i(D),v(j,e),s(c+1)}break;default:if(h){var M,W=d(h.id),I=null!==(M=W?W.color:h.color)&&void 0!==M?M:"#ffffff",C={name:"Set Color of Selected Roof",timestamp:Date.now(),oldValue:I,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(C.changedElementId,C.oldValue)},redo:function(){x(C.changedElementId,C.newValue)}};i(C),x(h.id,e),s(c+1)}}a((function(t){t.actionState.roofColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("roofMenu.RoofColor",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},qz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.thickness)&&void 0!==t?t:.4),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.id===e&&(i.thickness=t,l.updateElementOnRoofFlag=!0),i.parentId===e&&i.type===V.Window&&(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.thickness&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.thickness&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.thickness&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.thickness))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p=u;l.set(u.id,p.thickness),x(p.id,e)}}}catch(O){r.e(O)}finally{r.f()}var y={name:"Set Thickness for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(a);try{for(w.s();!(g=w.n()).done;){var A=g.value;if(A.type===V.Roof&&!A.locked){var T=A;m.set(A.id,T.thickness),x(T.id,e)}}}catch(O){w.e(O)}finally{w.f()}var P={name:"Set Thickness for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){v(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};o(P),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(a);try{for(H.s();!(S=H.n()).done;){var z=S.value;if(z.type===V.Roof&&z.foundationId===h.foundationId&&!z.locked){var R=z;j.set(z.id,R.thickness),x(R.id,e)}}}catch(O){H.e(O)}finally{H.f()}var D={name:"Set Thickness for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){v(D.oldValues)},redo:function(){b(D.oldValues,D.newValue)}};o(D),c(n+1)}break;default:if(h){var M,W,I=null!==(M=null!==(W=s(h.id).thickness)&&void 0!==W?W:h.thickness)&&void 0!==M?M:.4,C={name:"Set Roof Thickness",timestamp:Date.now(),oldValue:I,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(C.changedElementId,C.oldValue)},redo:function(){x(C.changedElementId,C.newValue)}};o(C),x(h.id,e),c(n+1)}}d((function(t){t.actionState.roofThickness=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Thickness",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.05,max:1,style:{width:120},step:.01,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.05, 1] ",me.t("word.MeterAbbreviation",w)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Qz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rafterSpacing)&&void 0!==t?t:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rafterSpacing=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rafterSpacing&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.rafterSpacing&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.rafterSpacing&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rafterSpacing))return!0}return!1}}(e))switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var d,u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(d=u.rafterSpacing)&&void 0!==d?d:1),x(u.id,e)}}catch(C){r.e(C)}finally{r.f()}var p={name:"Set Rafter Spacing for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(p.oldValues)},redo:function(){b(p.oldValues,p.newValue)}};o(p),c(n+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(a);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&!A.locked)g.set(A.id,null!==(w=A.rafterSpacing)&&void 0!==w?w:1),x(A.id,e)}}catch(C){m.e(C)}finally{m.f()}var T={name:"Set Rafter Spacing for All Roofs",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};o(T),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var P,S=new Map,j=Object(f.a)(a);try{for(j.s();!(P=j.n()).done;){var H,z=P.value;if(z.type===V.Roof&&z.foundationId===h.foundationId&&!z.locked)S.set(z.id,null!==(H=z.rafterSpacing)&&void 0!==H?H:1),x(z.id,e)}}catch(C){j.e(C)}finally{j.f()}var R={name:"Set Rafter Spacing for All Roofs Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:h.foundationId,undo:function(){v(R.oldValues)},redo:function(){b(R.oldValues,R.newValue)}};o(R),c(n+1)}break;default:if(h){var D,M,W=null!==(D=null!==(M=s(h.id).rafterSpacing)&&void 0!==M?M:h.rafterSpacing)&&void 0!==D?D:1,I={name:"Set Roof Rafter Spacing",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(I.changedElementId,I.oldValue)},redo:function(){x(I.changedElementId,I.newValue)}};o(I),x(h.id,e),c(n+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("roofMenu.RafterSpacing",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:100,style:{width:120},step:.1,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.1, 100] ",me.t("word.MeterAbbreviation",w)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Zz=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Sr),o=Ew(Zu),i=Ew(Ii),n=Ew(Ci),c=Ew(Zr),s=Ew(si),d=OP(V.Roof),h=Object(r.useState)(void 0!==(null===d||void 0===d?void 0:d.opacity)?d.opacity:.5),p=Object(u.a)(h,2),y=p[0],g=p[1],m=$f(),w=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.opacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},x=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];w(o,i)}}catch(r){l.e(r)}finally{l.f()}},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;w(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){if(d&&function(e){if(d){switch(o){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Roof&&e!==i.opacity&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(p){a.e(p)}finally{a.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.opacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(l);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Roof&&h.foundationId===d.foundationId&&e!==h.opacity&&!h.locked)return!0}}catch(p){u.e(p)}finally{u.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.opacity))return!0}return!1}}(e)){switch(o){case _.AllSelectedObjectsOfThisType:var t,r=new Map,u=Object(f.a)(l);try{for(u.s();!(t=u.n()).done;){var h=t.value;if(h.type===V.Roof&&!h.locked){var p=h;r.set(h.id,p.opacity),w(p.id,e)}}}catch(C){u.e(C)}finally{u.f()}var y={name:"Set Opacity for Selected Roofs",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){x(y.oldValues)},redo:function(){v(y.oldValues,y.newValue)}};a(y),n(i+1);break;case _.AllObjectsOfThisType:var g,m=new Map,b=Object(f.a)(l);try{for(b.s();!(g=b.n()).done;){var A=g.value;if(A.type===V.Roof&&!A.locked){var T=A;m.set(A.id,T.opacity),w(T.id,e)}}}catch(C){b.e(C)}finally{b.f()}var P={name:"Set Opacity for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){x(P.oldValues)},redo:function(){v(P.oldValues,P.newValue)}};a(P),n(i+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var S,j=new Map,H=Object(f.a)(l);try{for(H.s();!(S=H.n()).done;){var z=S.value;if(z.type===V.Roof&&z.foundationId===d.foundationId&&!z.locked){var R=z;j.set(z.id,R.opacity),w(R.id,e)}}}catch(C){H.e(C)}finally{H.f()}var D={name:"Set Opacity for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:d.foundationId,undo:function(){x(D.oldValues)},redo:function(){v(D.oldValues,D.newValue)}};a(D),n(i+1)}break;default:if(d){var M=c(d.id),W=void 0!==M.opacity?M.opacity:void 0!==d.opacity?d.opacity:.5,I={name:"Set Roof Opacity",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(I.changedElementId,I.oldValue)},redo:function(){w(I.changedElementId,I.newValue)}};a(I),w(d.id,e),n(i+1)}}s((function(t){t.actionState.roofGlassOpacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("roofMenu.Opacity",m),onApply:function(){b(y)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:y,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return g(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",m),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:o,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",m)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",m)})]})})})]})})},_z=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Vi),n=Ew(ln),c=Ew(Sr),s=Ew(Zu),d=Ew(ef),h=Ew(Ii),p=Ew(Ci),y=Ew(Oi),g=Ew(Zr),m=Object(r.useState)(null!==(t=null===n||void 0===n?void 0:n.glassTint)&&void 0!==t?t:"#73D8FF"),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)({left:0,top:0,bottom:0,right:0}),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useRef)(null),D=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=D.current)||void 0===e||e.focus()}));var M={lng:i};Object(r.useEffect)((function(){var e;n&&v(null!==(e=null===n||void 0===n?void 0:n.glassTint)&&void 0!==e?e:"#73D8FF")}),[n]);var W=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.glassTint=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},I=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;W(o,t)}}catch(i){a.e(i)}finally{a.f()}},C=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];W(o,i)}}catch(r){l.e(r)}finally{l.f()}},O=function(e){if(n)switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(t=a.n()).done;){var o,i=t.value;if(i.type===V.Roof&&!i.locked)l.set(i.id,null!==(o=i.glassTint)&&void 0!==o?o:"#73D8FF")}}catch(P){a.e(P)}finally{a.f()}var r={name:"Set Glass Tint for All Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){C(r.oldValues)},redo:function(){I(r.oldValues,r.newValue)}};c(r),I(l,e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(n.foundationId){var d,u=new Map,y=Object(f.a)(Ew.getState().elements);try{for(y.s();!(d=y.n()).done;){var m,w=d.value;if(w.type===V.Roof&&w.foundationId===n.foundationId&&!n.locked)u.set(w.id,null!==(m=w.glassTint)&&void 0!==m?m:"#73D8FF")}}catch(P){y.e(P)}finally{y.f()}var x={name:"Set Glass Tint for All Roofs Above Foundation",timestamp:Date.now(),oldValues:u,newValue:e,groupId:n.foundationId,undo:function(){C(x.oldValues)},redo:function(){x.groupId&&I(x.oldValues,x.newValue)}};c(x),I(u,e),p(h+1)}break;default:if(n){var v,b=g(n.id),A=null!==(v=b?b.glassTint:n.glassTint)&&void 0!==v?v:"#73D8FF",T={name:"Set Glass Tint of Selected Roof",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:n.id,changedElementType:n.type,undo:function(){W(T.changedElementId,T.oldValue)},redo:function(){W(T.changedElementId,T.newValue)}};c(T),W(n.id,e),p(h+1)}}},F=function(){(null===n||void 0===n?void 0:n.glassTint)&&v(n.glassTint),a(!1)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:640,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return P(!0)},onMouseOut:function(){return P(!1)},children:me.t("roofMenu.GlassTint",M)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){O(x)},children:me.t("word.Apply",M)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){F(),y()},children:me.t("word.Cancel",M)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:D,onClick:function(){var e=g(n.id);e&&e.glassTint!==x&&O(x),a(!1),p(0)},children:me.t("word.OK",M)},"OK")],onCancel:F,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!T,bounds:H,onStart:function(e,t){return function(e,t){if(R.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=R.current.getBoundingClientRect();z({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:R,children:e})})},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==x&&void 0!==x?x:null===n||void 0===n?void 0:n.glassTint)&&void 0!==l?l:"#73D8FF",onChangeComplete:function(e){v(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",M)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",M)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",M)})]})})})]})})})},$z=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew(Zu),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rafterColor)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.rafterColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},A=function(e){if(h&&function(e){if(h){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.rafterColor&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Roof&&e!==c.rafterColor&&!c.locked)return!0}}catch(p){r.e(p)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.rafterColor&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rafterColor))return!0}return!1}}(e))switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(r=u.rafterColor)&&void 0!==r?r:"#ffffff")}}catch(C){a.e(C)}finally{a.f()}var p={name:"Set Rafter Color for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(p.oldValues)},redo:function(){v(p.oldValues,p.newValue)}};i(p),v(l,e),s(c+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(o);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&!A.locked)g.set(A.id,null!==(w=A.rafterColor)&&void 0!==w?w:"#ffffff")}}catch(C){m.e(C)}finally{m.f()}var T={name:"Set Rafter Color for All Roofs",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){b(T.oldValues)},redo:function(){v(T.oldValues,T.newValue)}};i(T),v(g,e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var P,S=new Map,j=Object(f.a)(o);try{for(j.s();!(P=j.n()).done;){var H,z=P.value;if(z.type===V.Roof&&z.foundationId===h.foundationId&&!h.locked)S.set(z.id,null!==(H=z.rafterColor)&&void 0!==H?H:"#ffffff")}}catch(C){j.e(C)}finally{j.f()}var R={name:"Set Rafter Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:h.foundationId,undo:function(){b(R.oldValues)},redo:function(){R.groupId&&v(R.oldValues,R.newValue)}};i(R),v(S,e),s(c+1)}break;default:if(h){var D,M=d(h.id),W=null!==(D=M?M.rafterColor:h.rafterColor)&&void 0!==D?D:"#ffffff",I={name:"Set Rafter Color of Selected Roof",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(I.changedElementId,I.oldValue)},redo:function(){x(I.changedElementId,I.newValue)}};i(I),x(h.id,e),s(c+1)}}};return Object(gf.jsx)(kP,{width:640,title:me.t("roofMenu.RoofColor",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},eR=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rafterWidth)&&void 0!==t?t:.1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rafterWidth=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rafterWidth&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.rafterWidth&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.rafterWidth&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rafterWidth))return!0}return!1}}(e))switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var d,u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(d=u.rafterWidth)&&void 0!==d?d:.1),x(u.id,e)}}catch(C){r.e(C)}finally{r.f()}var p={name:"Set Rafter Width for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(p.oldValues)},redo:function(){b(p.oldValues,p.newValue)}};o(p),c(n+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(a);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&!A.locked)g.set(A.id,null!==(w=A.rafterWidth)&&void 0!==w?w:.1),x(A.id,e)}}catch(C){m.e(C)}finally{m.f()}var T={name:"Set Rafter Width for All Roofs",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};o(T),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var P,S=new Map,j=Object(f.a)(a);try{for(j.s();!(P=j.n()).done;){var H,z=P.value;if(z.type===V.Roof&&z.foundationId===h.foundationId&&!z.locked)S.set(z.id,null!==(H=z.rafterWidth)&&void 0!==H?H:.1),x(z.id,e)}}catch(C){j.e(C)}finally{j.f()}var R={name:"Set Rafter Width for All Roofs Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:h.foundationId,undo:function(){v(R.oldValues)},redo:function(){b(R.oldValues,R.newValue)}};o(R),c(n+1)}break;default:if(h){var D,M,W=null!==(D=null!==(M=s(h.id).rafterWidth)&&void 0!==M?M:h.rafterWidth)&&void 0!==D?D:.1,I={name:"Set Roof Rafter Width",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(I.changedElementId,I.oldValue)},redo:function(){x(I.changedElementId,I.newValue)}};o(I),x(h.id,e),c(n+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("roofMenu.RafterWidth",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.01,max:1,style:{width:120},step:.01,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.01, 1] ",me.t("word.MeterAbbreviation",w)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},tR=function(e){var t,l,a=e.setDialogVisible,o=Ew(Fi),i=Ew(si),n=Ew(Sr),c=Ew(Zu),s=Ew(Ii),d=Ew(Ci),h=Ew(Zr),p=OP(V.Roof),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.sideColor)&&void 0!==t?t:"#ffffff"),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){i((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.sideColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e){if(p&&function(e){if(p){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.sideColor&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(h){l.e(h)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Roof&&e!==n.sideColor&&!n.locked)return!0}}catch(h){r.e(h)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===p.foundationId&&e!==u.sideColor&&!u.locked)return!0}}catch(h){d.e(h)}finally{d.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.sideColor))return!0}return!1}}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(r=u.sideColor)&&void 0!==r?r:"#ffffff")}}catch(O){a.e(O)}finally{a.f()}var y={name:"Set Side Color for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};n(y),b(l,e),d(s+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(o);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Roof&&!T.locked)m.set(T.id,null!==(x=T.sideColor)&&void 0!==x?x:"#ffffff")}}catch(O){w.e(O)}finally{w.f()}var P={name:"Set Side Color for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){A(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};n(P),b(m,e),d(s+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z,R=S.value;if(R.type===V.Roof&&R.foundationId===p.foundationId&&!p.locked)j.set(R.id,null!==(z=R.sideColor)&&void 0!==z?z:"#ffffff")}}catch(O){H.e(O)}finally{H.f()}var D={name:"Set Side Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:p.foundationId,undo:function(){A(D.oldValues)},redo:function(){D.groupId&&b(D.oldValues,D.newValue)}};n(D),b(j,e),d(s+1)}break;default:if(p){var M,W=h(p.id),I=null!==(M=W?W.sideColor:p.sideColor)&&void 0!==M?M:"#ffffff",C={name:"Set Side Color of Selected Roof",timestamp:Date.now(),oldValue:I,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(C.changedElementId,C.oldValue)},redo:function(){v(C.changedElementId,C.newValue)}};n(C),v(p.id,e),d(s+1)}}i((function(t){t.actionState.roofSideColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("roofMenu.RoofSideColor",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==m&&void 0!==m?m:null===p||void 0===p?void 0:p.sideColor)&&void 0!==l?l:"#ffffff",onChangeComplete:function(e){w(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",x)})]})})})]})})},lR=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Tw.toRValueInUS(g)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];T(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;T(o,t)}}catch(i){a.e(i)}finally{a.f()}},j=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rValue&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.rValue&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.rValue&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rValue))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p,y=u;l.set(u.id,null!==(p=y.rValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(Y){r.e(Y)}finally{r.f()}var g={name:"Set R-Value for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){P(g.oldValues)},redo:function(){S(g.oldValues,g.newValue)}};o(g),c(n+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Roof&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.rValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(Y){x.e(Y)}finally{x.f()}var j={name:"Set R-Value for All Roofs",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){P(j.oldValues)},redo:function(){S(j.oldValues,j.newValue)}};o(j),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var H,z=new Map,R=Object(f.a)(a);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.Roof&&D.foundationId===h.foundationId&&!D.locked){var M,W=D;z.set(D.id,null!==(M=W.rValue)&&void 0!==M?M:2),T(W.id,e)}}}catch(Y){R.e(Y)}finally{R.f()}var I={name:"Set R-Value for All Roofs Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:h.foundationId,undo:function(){P(I.oldValues)},redo:function(){S(I.oldValues,I.newValue)}};o(I),c(n+1)}break;default:if(h){var C,O,F=null!==(C=null!==(O=s(h.id).rValue)&&void 0!==O?O:h.rValue)&&void 0!==C?C:2,k={name:"Set Roof R-Value",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){T(k.changedElementId,k.oldValue)},redo:function(){T(k.changedElementId,k.newValue)}};o(k),T(h.id,e),c(n+1)}}d((function(t){t.actionState.roofRValue=e}))}};return Object(gf.jsx)(kP,{width:550,title:"".concat(me.t("roofMenu.RoofRValue",A)+" ","(").concat(me.t("word.ThermalResistance",A),")"),onApply:function(){j(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){m(e),b(Tw.toRValueInUS(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",A),": m\xb2\xb7\u2103/W"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toRValueInUS(.01),max:Tw.toRValueInUS(100),style:{width:120},step:.01,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),m(Tw.toRValueInSI(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Tw.toRValueInUS(.01).toFixed(3),", ",Tw.toRValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",A),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",A)})]})})})]})})},aR=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=OP(V.Roof),h=Object(r.useState)(null!==(t=null===d||void 0===d?void 0:d.rise)&&void 0!==t?t:0),p=Object(u.a)(h,2),y=p[0],g=p[1],m=$f(),w=function(e,t){Ew.getState().updateRoofRiseById(e,t),Ew.getState().set((function(e){e.updateElementOnRoofFlag=!0}))},x=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];w(o,i)}}catch(r){l.e(r)}finally{l.f()}},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;w(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){if(d&&function(e){if(d){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rise&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.rise&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(a);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Roof&&h.foundationId===d.foundationId&&e!==h.rise&&!h.locked)return!0}}catch(p){u.e(p)}finally{u.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.rise))return!0}return!1}}(e))switch(Ew.getState().roofActionScope){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;u.type!==V.Roof||u.locked||(l.set(u.id,u.rise),w(u.id,e))}}catch(W){r.e(W)}finally{r.f()}var h={name:"Set Rise for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){x(h.oldValues)},redo:function(){v(h.oldValues,h.newValue)}};o(h),c(n+1);break;case _.AllObjectsOfThisType:var p,y=new Map,g=Object(f.a)(a);try{for(g.s();!(p=g.n()).done;){var m=p.value;m.type!==V.Roof||m.locked||(y.set(m.id,m.rise),w(m.id,e))}}catch(W){g.e(W)}finally{g.f()}var b={name:"Set Rise for All Roofs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){x(b.oldValues)},redo:function(){v(b.oldValues,b.newValue)}};o(b),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var A,T=new Map,P=Object(f.a)(a);try{for(P.s();!(A=P.n()).done;){var S=A.value;S.type!==V.Roof||S.foundationId!==d.foundationId||S.locked||(T.set(S.id,S.rise),w(S.id,e))}}catch(W){P.e(W)}finally{P.f()}var j={name:"Set Rise for All Roofs Above Foundation",timestamp:Date.now(),oldValues:T,newValue:e,groupId:d.foundationId,undo:function(){x(j.oldValues)},redo:function(){v(j.oldValues,j.newValue)}};o(j),c(n+1)}break;default:if(d){var H,z,R=s(d.id),D=null!==(H=null!==(z=null===R||void 0===R?void 0:R.rise)&&void 0!==z?z:null===d||void 0===d?void 0:d.rise)&&void 0!==H?H:0,M={name:"Set Roof Rise",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(M.changedElementId,M.oldValue)},redo:function(){w(M.changedElementId,M.newValue)}};o(M),w(d.id,e),c(n+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("roofMenu.Rise",m),onApply:function(){b(y)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:200,style:{width:120},step:.1,precision:2,value:y,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return g(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",m),": [0, 200] ",me.t("word.MeterAbbreviation",m)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",m)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",m)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",m)})]})})})]})})},oR=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.volumetricHeatCapacity)&&void 0!==t?t:.5),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.volumetricHeatCapacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.volumetricHeatCapacity&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.volumetricHeatCapacity&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.volumetricHeatCapacity))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Roof&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r,n=i;t.set(i.id,null!==(r=n.volumetricHeatCapacity)&&void 0!==r?r:.5),n.volumetricHeatCapacity=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Volumetric Heat Capacity for Selected Roofs",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){v(l.oldValues)},redo:function(){b(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Roof&&!o.locked){var i,n=o;r.set(o.id,null!==(i=n.volumetricHeatCapacity)&&void 0!==i?i:.5),n.volumetricHeatCapacity=e}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set Volumetric Heat Capacity for All Roofs",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var p=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Roof&&o.foundationId===h.foundationId&&!o.locked){var i,r=o;p.set(o.id,null!==(i=r.volumetricHeatCapacity)&&void 0!==i?i:.5),r.volumetricHeatCapacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var y={name:"Set Volumetric Heat Capacity for All Roofs Above Foundation",timestamp:Date.now(),oldValues:p,newValue:e,groupId:h.foundationId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;default:if(h){var g,m,w=null!==(g=null!==(m=s(h.id).volumetricHeatCapacity)&&void 0!==m?m:h.volumetricHeatCapacity)&&void 0!==g?g:.5,A={name:"Set Volumetric Heat Capacity of Roof",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(A.changedElementId,A.oldValue)},redo:function(){x(A.changedElementId,A.newValue)}};o(A),x(h.id,e),c(n+1)}}d((function(t){t.actionState.roofVolumetricHeatCapacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},iR=function(e){var t,l=e.setDialogVisible,a=Ew(Vi),o=Ew(ln),i=Ew(Sr),n=Ew(Zu),c=Ew(ef),s=Ew(Ii),d=Ew(Ci),h=Ew(Oi),p=Ew(Zr),y=Ew(si),g=Ew((function(e){if(o){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===o.id)return a}}catch(i){l.e(i)}finally{l.f()}}return null})),m=Object(r.useState)(null!==(t=null===g||void 0===g?void 0:g.ceilingRValue)&&void 0!==t?t:2),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(Tw.toRValueInUS(x)),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)({left:0,top:0,bottom:0,right:0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useRef)(null),C={lng:a};Object(r.useEffect)((function(){var e;g&&v(null!==(e=null===g||void 0===g?void 0:g.ceilingRValue)&&void 0!==e?e:2)}),[null===g||void 0===g?void 0:g.ceilingRValue]);var O=function(e,t){y((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.ceilingRValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},F=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];O(o,i)}}catch(r){l.e(r)}finally{l.f()}},k=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;O(o,t)}}catch(i){a.e(i)}finally{a.f()}},Y=function(e){if(g){switch(n){case _.AllObjectsOfThisType:var t=new Map;y((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Roof&&!i.locked){var r,n=i;t.set(i.id,null!==(r=n.ceilingRValue)&&void 0!==r?r:2),n.ceilingRValue=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set R-Value for All Ceilings",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){F(l.oldValues)},redo:function(){k(l.oldValues,l.newValue)}};i(l),d(s+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(g.foundationId){var a=new Map;y((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Roof&&i.foundationId===g.foundationId&&!i.locked){var r,n=i;a.set(i.id,null!==(r=n.ceilingRValue)&&void 0!==r?r:2),n.ceilingRValue=e}}}catch(c){o.e(c)}finally{o.f()}}));var o={name:"Set R-Value for All Ceilings Above Foundation",timestamp:Date.now(),oldValues:a,newValue:e,groupId:g.foundationId,undo:function(){F(o.oldValues)},redo:function(){k(o.oldValues,o.newValue)}};i(o),d(s+1)}break;default:if(g){var r,c,u=null!==(r=null!==(c=p(g.id).ceilingRValue)&&void 0!==c?c:g.ceilingRValue)&&void 0!==r?r:2,h={name:"Set Ceiling R-Value",timestamp:Date.now(),oldValue:u,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){O(h.changedElementId,h.oldValue)},redo:function(){O(h.changedElementId,h.newValue)}};i(h),O(g.id,e),d(s+1)}}y((function(t){t.actionState.roofRValue=e}))}},L=function(){var e;v(null!==(e=null===g||void 0===g?void 0:g.ceilingRValue)&&void 0!==e?e:2),l(!1)},E=function(){Y(x),l(!1),d(0)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:550,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return z(!0)},onMouseOut:function(){return z(!1)},children:[me.t("roofMenu.CeilingRValue",C)+" ","(",me.t("word.ThermalResistance",C),")"]}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){Y(x)},children:me.t("word.Apply",C)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){L(),h()},children:me.t("word.Cancel",C)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:E,children:me.t("word.OK",C)},"OK")],onCancel:L,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!H,bounds:M,onStart:function(e,t){return function(e,t){if(I.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=I.current.getBoundingClientRect();W({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:I,children:e})})},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:x,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){v(e),P(Tw.toRValueInUS(e))},onPressEnter:E}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",C),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",C),": m\xb2\xb7\u2103/W"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toRValueInUS(.01),max:Tw.toRValueInUS(100),style:{width:120},step:.01,precision:2,value:T,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){P(e),v(Tw.toRValueInSI(e))},onPressEnter:E}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",C),": [",Tw.toRValueInUS(.01).toFixed(3),", ",Tw.toRValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",C),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return c(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisCeiling",C)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllCeilingsAboveFoundation",C)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllCeilings",C)})]})})})]})})})},rR=n.a.memo((function(){var e,t=Ew(si),l=Ew(Vi),a=Ew(of),o=Ew(hs),i=Ew(es),n=Ew(pn),c=Ew(hn),s=Ew(Bc),d=Ew(Xc),p=Ew(Ci),y=Ew(Sr),g=OP(V.Roof),m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useState)(!1),Y=Object(u.a)(k,2),L=Y[0],E=Y[1],U=Object(r.useState)(!1),N=Object(u.a)(U,2),J=N[0],G=N[1],X=Object(r.useState)(!1),B=Object(u.a)(X,2),K=B[0],q=B[1],Q=Object(r.useState)(!1),Z=Object(u.a)(Q,2),_=Z[0],$=Z[1],ee=Object(r.useState)(!1),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useState)(!1),ie=Object(u.a)(oe,2),re=ie[0],ne=ie[1],ce=Object(r.useState)(!1),se=Object(u.a)(ce,2),de=se[0],ue=se[1],fe=Object(r.useState)(!1),pe=Object(u.a)(fe,2),ye=pe[0],ge=pe[1];if(!g)return null;var we={lng:l},xe="36px",ve={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},be=function(e,l){if(0===l)return null;var a=function(e,t){return"".concat(me.t("roofMenu.DoYouReallyWantToRemoveAll".concat(e,"sOnThisRoof"),we)," (").concat(t," ").concat(me.t("roofMenu.".concat(e,"s"),we),")?")},o=e.replaceAll(" ","");return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:a(o,l),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){!function(e){if(g){var l=Ew.getState().elements.filter((function(t){return!t.locked&&t.type===e&&t.parentId===g.id}));i(g.id,e);var a=JSON.parse(JSON.stringify(l)),o={name:"Remove All ".concat(e,"s on Roof"),timestamp:Date.now(),parentId:g.id,removedElements:a,undo:function(){t((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(o.removedElements))}))},redo:function(){i(o.parentId,e)}};y(o)}}(e)}})},children:[me.t("roofMenu.RemoveAllUnlocked".concat(o,"s"),we)," (",l,")"]},"remove-all-".concat(o,"s-on-roof"))},Ae=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;i.parentId===g.id&&i.type===e&&a.set(i.id,!!i.locked)}}catch(s){o.e(s)}finally{o.f()}c(g.id,e,!0);var r={name:"Lock All "+l+" on Roof",timestamp:Date.now(),oldValues:a,newValue:!0,undo:function(){var e,t=Object(f.a)(r.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(s){t.e(s)}finally{t.f()}},redo:function(){c(g.id,e,!0)}};y(r)}},children:[me.t("roofMenu.LockAll".concat(l,"s"),we)," (",t,")"]},"lock-all-".concat(l,"s-on-roof"))},Te=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(gf.jsx)(Qv.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;i.parentId===g.id&&i.type===e&&a.set(i.id,!!i.locked)}}catch(s){o.e(s)}finally{o.f()}c(g.id,e,!1);var r={name:"Unlock All "+l+" on Roof",timestamp:Date.now(),oldValues:a,newValue:!0,undo:function(){var e,t=Object(f.a)(r.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(s){t.e(s)}finally{t.f()}},redo:function(){c(g.id,e,!1)}};y(r)}},children:me.t("roofMenu.UnlockAll".concat(l,"s"),we)},"unlock-all-".concat(l,"s-on-roof"))},Pe=function(e,t){return 0===e?null:Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(g){var e,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;o.parentId===g.id&&o.type===V.Light&&l.set(o.id,o.inside)}}catch(r){a.e(r)}finally{a.f()}s(g.id,t);var i={name:t?"Set All Lights on Roof Inside":"Set All Lights on Roof Outside",timestamp:Date.now(),oldValues:l,newValue:!0,undo:function(){var e,t=Object(f.a)(i.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];d(a,o)}}catch(r){t.e(r)}finally{t.f()}},redo:function(){s(g.id,t)}};y(i)}},children:[me.t(t?"roofMenu.AllLightsOnRoofInside":"roofMenu.AllLightsOnRoofOutside",we)," (",e,")"]},t?"inside-lights-on-roof":"outside-lights-on-roof")},Se=function(e,t){Ew.getState().set((function(l){var a=l.elements.find((function(t){return t.id===e&&t.type===V.Roof}));a&&(a.ceiling=t,l.actionState.roofCeiling=t)}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){var e=Ew.getState().elementsToPaste;if(e&&e.length>0)switch(e[0].type){case V.Window:case V.SolarPanel:case V.Sensor:case V.Light:return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"roof-paste"}),Object(gf.jsx)(SP,{keyName:"roof-lock"}),g.rise>0&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:g.ceiling,onChange:function(e){var t=e.target.checked,l={name:"Roof Ceiling",timestamp:Date.now(),checked:t,selectedElementId:g.id,selectedElementType:g.type,undo:function(){Se(g.id,!l.checked)},redo:function(){Se(g.id,l.checked)}};y(l),Se(g.id,t)},children:me.t("roofMenu.Ceiling",{lng:l})})},"roof-ceiling"),function(){var e=g?o(g.id,!0):new Rw;if(e.gotSome()&&Ew.getState().contextMenuObjectType){var t=g?o(g.id,!1):new Rw;return Object(gf.jsxs)(HP.a,{title:me.t("word.Elements",we),style:{paddingLeft:"24px"},children:[be(V.SolarPanel,t.solarPanelCount),be(V.Window,t.windowCount),be(V.Sensor,t.sensorCount),be(V.Light,t.insideLightCount+t.outsideLightCount),Ae(V.SolarPanel,t.solarPanelCount),Te(V.SolarPanel,e.solarPanelCount),Ae(V.Window,t.windowCount),Te(V.Window,e.windowCount),Ae(V.Sensor,t.sensorCount),Te(V.Sensor,e.sensorCount),Pe(e.outsideLightCount,!0),Pe(e.insideLightCount,!1)]},"lock-unlock-clear-on-roof")}return null}(),!g.locked&&g.roofType===It.Gable&&Object(gf.jsx)(HP.a,{title:me.t("roofMenu.RoofStructure",we),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(tb.a.Group,{value:null!==(e=g.roofStructure)&&void 0!==e?e:Ct.Default,style:{height:"110px",paddingTop:"0"},onChange:function(e){var l,o={name:"Select Roof Structure",timestamp:Date.now(),oldValue:null!==(l=g.roofStructure)&&void 0!==l?l:Ct.Default,newValue:e.target.value,changedElementId:g.id,changedElementType:g.type,undo:function(){a(o.changedElementId,o.oldValue)},redo:function(){a(o.changedElementId,o.newValue)}};y(o),a(g.id,e.target.value),t((function(t){t.actionState.roofStructure=e.target.value}))},children:[Object(gf.jsx)(tb.a,{style:ve,value:Ct.Default,children:me.t("roofMenu.DefaultStructure",we)}),Object(gf.jsx)(tb.a,{style:ve,value:Ct.Rafter,children:me.t("roofMenu.RafterStructure",we)}),Object(gf.jsx)(tb.a,{style:ve,value:Ct.Glass,children:me.t("roofMenu.GlassStructure",we)})]})},"roof-structure"),!g.locked&&Object(gf.jsxs)(gf.Fragment,{children:[(g.roofStructure===Ct.Rafter||g.roofStructure===Ct.Glass)&&Object(gf.jsxs)(gf.Fragment,{children:[le&&Object(gf.jsx)(Zz,{setDialogVisible:ae}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),ae(!0)},children:[me.t("roofMenu.Opacity",we)," ..."]},"roof-opacityInput")]}),g.roofStructure===Ct.Rafter&&g.roofType===It.Gable&&Object(gf.jsxs)(gf.Fragment,{children:[H&&Object(gf.jsx)($z,{setDialogVisible:z}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),z(!0)},children:[me.t("roofMenu.RafterColor",we)," ..."]},"roof-rafter-color"),x&&Object(gf.jsx)(Qz,{setDialogVisible:v}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),v(!0)},children:[me.t("roofMenu.RafterSpacing",we)," ..."]},"roof-rafter-spacing"),T&&Object(gf.jsx)(eR,{setDialogVisible:P}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),P(!0)},children:[me.t("roofMenu.RafterWidth",we)," ..."]},"roof-rafter-width")]}),O&&Object(gf.jsx)(qz,{setDialogVisible:F}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),F(!0)},children:[me.t(g.roofStructure===Ct.Rafter?"roofMenu.RafterThickness":"word.Thickness",we)," ","..."]},"roof-thickness"),g.roofStructure===Ct.Glass&&g.roofType===It.Gable&&Object(gf.jsxs)(gf.Fragment,{children:[_&&Object(gf.jsx)(_z,{setDialogVisible:$}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),$(!0)},children:[me.t("roofMenu.GlassTint",we)," ..."]},"roof-glass-tint-selection")]}),M&&Object(gf.jsx)(aR,{setDialogVisible:W}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),W(!0)},children:[me.t("roofMenu.Rise",we)," ..."]},"roof-rise"),(g.roofStructure!==Ct.Rafter||void 0===g.opacity||g.opacity>0)&&Object(gf.jsxs)(gf.Fragment,{children:[re&&Object(gf.jsx)(lR,{setDialogVisible:ne}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ne(!0)},children:[me.t("roofMenu.RoofRValue",we)," ..."]},"roof-r-value"),g.ceiling&&de&&Object(gf.jsx)(iR,{setDialogVisible:ue}),g.ceiling&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ue(!0)},children:[me.t("roofMenu.CeilingRValue",we)," ..."]},"ceiling-r-value"),ye&&Object(gf.jsx)(oR,{setDialogVisible:ge}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ge(!0)},children:[me.t("word.VolumetricHeatCapacity",we)," ..."]},"roof-heat-capacity")]}),g.roofStructure!==Ct.Rafter&&Object(gf.jsxs)(gf.Fragment,{children:[L&&Object(gf.jsx)(Bz,{setDialogVisible:E}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),E(!0)},children:[me.t("word.Texture",we)," ..."]},"roof-texture")]}),(g.roofStructure!==Ct.Rafter||void 0===g.opacity||g.opacity>0)&&Object(gf.jsxs)(gf.Fragment,{children:[J&&Object(gf.jsx)(Kz,{setDialogVisible:G}),(g.textureType===he.NoTexture||g.textureType===he.Default)&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),G(!0)},children:[me.t("roofMenu.RoofColor",we)," ..."]},"roof-color"),K&&Object(gf.jsx)(tR,{setDialogVisible:q}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),q(!0)},children:[me.t("roofMenu.RoofSideColor",we)," ..."]},"roof-side-color")]})]})]})})),nR=function(e){var t=e.children,l=Ew(bs);return Object(gf.jsx)(lb.a,{trigger:["contextMenu"],overlay:function(){switch(l){case V.Ground:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(IS,{})});case V.Sky:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(hj,{})});case V.Foundation:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(AS,{})});case V.Cuboid:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(WS,{})});case V.Polygon:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(sj,{})});case V.PolygonVertex:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(dj,{})});case V.SolarPanel:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(Dj,{})});case V.ParabolicTrough:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(Ej,{})});case V.ParabolicDish:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(Qj,{})});case V.FresnelReflector:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(iH,{})});case V.Heliostat:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(pH,{})});case V.Sensor:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(uj,{})});case V.Light:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(fj,{})});case V.Human:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(kS,{})});case V.Tree:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(mH,{})});case V.Flower:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(ES,{})});case V.Wall:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(NH,{})});case V.Window:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(Lz,{})});case V.Roof:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(rR,{})});case V.Door:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(ZH,{})});default:return Object(gf.jsx)(gf.Fragment,{})}}(),children:t},"canvas-context-menu")},cR=n.a.memo(nR),sR=l(49),dR=(l(727),l(831)),uR=l(834),fR=l(847),hR=l(848),pR=l(575),yR="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEQgBg4Se6gAABJlJREFUWIXtV11IXEcUPjNzZ3bXHzauvzVSAqlvrWx9KX0paEoRMcoKQmwFDSK+2NInqWVJNIi0pZCXUiiIqC8hJRCphIJaodJC+lTY0j9jmrS11tb1L3bv79w5feje7apX3W3MWw9cuHO+M+d8M3PmzAyBPKW5ublDStmMiE8jIgAAICIIISAcDn9rmuaHMzMzP+Tqj+QTvL29/WPHcTr8MEQEpRQopfSSkpLYjRs35nLxqeUaPBaLvazregciguu6twHg+2ycMSYopV2U0qqdnZ33AOB0Cei6HhVCgG3b9xYWFtr9bPr6+pbW1tY+QcRnlFKCUmqf5PfQEnR2dpYqpV5JJpP8ANQSCAQ6LMv6CRGvEELYwb5FRUXPm6b5JucchBBv7e7u/u5hxcXFEA6Hf5yamvrqSAKxWOxVwzDe55w/pZTa51wpBa7rAiEENO3wxCEipJcHAAA0TQNCCHh+KKWglAIhxKfRaLR7ZGRkYx+Brq6uc8lkcgUAmJTSQMQt/0nzl6KiIjBNE6SUGUKccyguLs6QT6VSZ0OhEFiW9cHc3NzrAFk5oOt6O2OMKaV2qqurX3rw4MF3+RCYmZmB4eFhWFxczOji8Tg0NDRk2pcuXbqm6/rbruu2xOPxN0ZHR5F64Pb2dohSCo7jPJyenv4mn+AAAISQfcEBAK5evQqEkMxXVVX1q6ZpgIj26OgoAmQtQWNj45VgMDhiWZaNiBuE/JseXsE5gQBN26oD+sw/pbQQAM5wznfb2trO9/f3b2aWoLCw8H46e4VS6qxpmpkKJ4Q4cfS2bYNSCoLB4D7ChmGA67oghADO/9lYtm3/sbe3l9o3A4hIBgcHm0OhUOmjR48ql5eX33Fdl9bU1EyXl5d/dnBXZAvnHNbW1n4zTdOpra09Z5pmJusTiUQcEWsDgcBsNBq9ZRiG2t7e/mJ8fPzhkQ7n5+cjra2t8uLFizgwMNB97PBPkAsXLnze2tqKDQ0NcT+c+ikTiUSJt6+llIWPQ4AQoiEiMMZCfnjOpdizb2lpGUDE+3fu3JnNBnp7e0u2tra6Nzc37y4tLd3N1aHvDBwlPT09TZqmXVdK3R4aGqrIxtbX1y8zxq5zzj/Kx2deBMrKys4rpYAxxqSUZ7IxXddDlmUByd53p00AABwAAER0GWPuPkeUem33UK9TJHDqkhcBrxbkUhmfCIEnIf8TOJEAIua1rU6VQDrZnCyVBgCQvg/SA7Ze+3TqgHeJME1TejrDMDY1TQOlFFBK97LtGWOOEAIYY3mdHb5ngW3bCgCUpmmsoKCgwNPPzs7eqqurO2+a5vLY2Nh6dp9IJDKl63phOBxOPDaBSCQiEVFKKbnrupmLwOrqqrW6unrNr8/Nmzf/BIBhH+jYouG7BI7jCEppKJ0D+nEOTpKss8F3sP5KTfs5lUo9FEKcSyaTnW1tbV8bhvFXvsErKipe2NjYeC6dM7u+BI/q3NTUNMg5f9e2be/BkdchAwAQCAQYIgKldK+ysvLZiYmJXw7aHHpeebKysvJlfX39ruu6L0opg4QQ+h8+YIzNlpaWvjY5OXnPL87fPnkgI7SmjToAAAAASUVORK5CYII=",gR=dR.a.Column,mR=mv.a.div(oz||(oz=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 14;\n"]))),wR=mv.a.div(iz||(iz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 680px;\n height: 520px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n"]))),xR=mv.a.div(rz||(rz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),vR=function(e){var t=e.cloudFileArray,l=e.openCloudFile,a=e.deleteCloudFile,o=e.renameCloudFile,i=Ew(Vi),c=Ew(si),s=Ew(Ni),d=n.a.useRef(null),p=Object(r.useRef)(null),y=p.current?p.current.clientWidth+40:680,g=p.current?p.current.clientHeight+100:600,m=Object(r.useState)({x:0,y:0}),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)({left:0,top:0,bottom:0,right:0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useState)(),Y=Object(u.a)(k,2),L=Y[0],E=Y[1],U=Object(r.useState)(),N=Object(u.a)(U,2),V=N[0],J=N[1],G=Object(r.useRef)(null),X=Object(r.useRef)(Object(h.a)(t)),B=Object(r.useState)(!1),K=Object(u.a)(B,2),q=K[0],Q=K[1],Z=ET.a.Search,_={lng:i};Object(r.useEffect)((function(){var e=function(){v({x:Math.max(0,y-window.innerWidth),y:Math.min(0,window.innerHeight-g)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){t&&(X.current=Object(h.a)(t),Q(!q))}),[t]);var $=function(){Tf.setState((function(e){e.showCloudFilePanel=!1}))},ee=function(){V&&O&&L&&(o(V,O,L),E(void 0)),P(!1)};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Zv.a,{title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return z(!0)},onMouseOut:function(){return z(!1)},children:me.t("word.Rename",_)}),visible:T,onOk:ee,onCancel:function(){P(!1),E(void 0)},modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!H,bounds:M,onStart:function(e,t){return function(e,t){if(G.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=G.current.getBoundingClientRect();W({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:G,children:e})})},children:Object(gf.jsxs)(wv.b,{direction:"vertical",style:{width:"100%"},children:[Object(gf.jsx)(ET.a,{placeholder:"Title",value:L||O,onPressEnter:ee,onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){E(e.target.value)}}),Object(gf.jsxs)("span",{style:{fontSize:"11px",color:"red"},children:[Object(gf.jsx)(fR.a,{style:{marginRight:"4px"}}),me.t("word.Caution",_)+": "+me.t("cloudFilePanel.IfSharedOrPublishedRenamingFileBreaksExistingLinks",_),"."]})]})}),Object(gf.jsx)(JT.a,{nodeRef:d,handle:".handle",bounds:"parent",axis:"both",position:x,onDrag:function(e,t){v({x:Math.max(t.x,y-window.innerWidth),y:Math.min(t.y,window.innerHeight-g)})},onStop:function(e,t){},onMouseDown:function(){c((function(e){e.selectedFloatingWindow="cloudFilePanel"}))},children:Object(gf.jsx)(mR,{ref:d,style:{zIndex:"cloudFilePanel"===s?Ke:14},children:Object(gf.jsxs)(wR,{ref:p,children:[Object(gf.jsxs)(xR,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("cloudFilePanel.MyCloudFiles",_)+" ("+X.current.length+")"}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){$()},onTouchStart:function(){$()},children:me.t("word.Close",_)})]}),Object(gf.jsx)("span",{style:{direction:"ltr"},children:Object(gf.jsx)(Z,{style:{width:"50%",paddingTop:"8px",paddingBottom:"8px"},title:me.t("cloudFilePanel.SearchByTitle",_),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(t){X.current=[];var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o,i=l.value;(null===(o=i.title)||void 0===o?void 0:o.toLowerCase().includes(e.toLowerCase()))&&X.current.push(i)}}catch(r){a.e(r)}finally{a.f()}Q(!q)}}})}),Object(gf.jsxs)(dR.a,{size:"small",style:{width:"100%",direction:"ltr"},dataSource:X.current,scroll:{y:360},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:[Object(gf.jsx)(gR,{title:me.t("word.Title",_),dataIndex:"title",width:"56%",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.title.localeCompare(t.title)},render:function(e,t){return Object(gf.jsx)(uR.a.Text,{style:{fontSize:"12px",cursor:"pointer"},title:me.t("word.Open",_),children:e})},onCell:function(e,t){return{onClick:function(){var t=window.getSelection();t&&t.toString().length>0||l(e.userid,e.title)}}}},"title"),Object(gf.jsx)(gR,{title:me.t("word.Time",_),dataIndex:"time",width:"25%",defaultSortOrder:"descend",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.timestamp-t.timestamp},render:function(e,t){return Object(gf.jsx)(uR.a.Text,{style:{fontSize:"12px"},children:e})}},"time"),Object(gf.jsx)(gR,{width:"19%",title:me.t("word.Action",_),render:function(e,t){return Object(gf.jsxs)(wv.b,{size:"middle",children:[Object(gf.jsx)("img",{title:me.t("word.Delete",_),alt:"Delete",src:yR,onClick:function(){!function(e,t){Zv.a.confirm({title:me.t("cloudFilePanel.DoYouReallyWantToDelete",_)+' "'+t+'"?',content:Object(gf.jsxs)("span",{style:{color:"red",fontWeight:"bold"},children:[Object(gf.jsx)(fR.a,{style:{marginRight:"6px"}}),me.t("word.Warning",_)+": "+me.t("message.ThisCannotBeUndone",_)]}),icon:Object(gf.jsx)(hR.a,{}),onOk:function(){a(e,t);var l=new URLSearchParams(window.location.search);l.get("title")===t&&l.get("userid")===e&&window.history.pushState({},document.title,Ge)}})}(t.userid,t.title)},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)("img",{title:me.t("word.Rename",_),alt:"Rename",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEQMtUqgrwgAAA2hJREFUWIXtVktrJFUU/k7dW1WpVHfT62RAMAsRcakmMJkwdjXTREIImcVswuAwzi4rXaq/wIUgxKWPIEzDkIDEiOkOJKsIs2jEx0IQGWbjYlqhq7sr1XXvPS5SFfOaTE/b6Ka/VdW5j+/jvO4BRhjhfwZdZFxeXn6r3W6/kCTJMy9wXReFQuGbarX6aBAB8qxhbm7OD8NwK5fLQWt9bFdKwRgDKSUsyzolIAzDFwG8NxQB+/v7nUqlcqvb7b6ilDq59LaU8kqSJFtKqUZm7PV6yOfz1UHIgaeE4CIEQbDved61KIpu1Ov1nUEJz8J69pYjMLPNzNBa87DIgTQEs7Oz7vj4+BIzF7O4CyHAzE9yudzG5uamISJmZjiOs1IqlaYGIRNCwPf9PzY2Nr4mIgMAcmlpyQrD8FvHca6fTC4igtYarVbrVQA/AUeJKKVcGRsbW9FaZ/8QQvQtIkkSLC4ufgegAgCy1Wrd8zzvehRFfzLzl0QUAoBlWVBKPbFt+9djd0kJrfVWHMcNZi47jjMdRdH3RFTrh5yZ85Zl3XEc58b8/Pyt7e3t+xLAS6m7P93d3X3/ksNERFBKfVKv13fK5bLluu60Umq3Vqt92K8HKpWKllK+2+123wBw3wIQp2uH/VxgjMmngjxmBjN7/ZIDQBzHf6X3xMDpKug/kP8ClmWd6j3HAohoqOX1NBhjTnU3C4CTfqvz28+DmVsAQEQREYGIoucRkM/ni8wMIrIBQDLzb2ksbwdBMAaAgaOMV0o9bjabnzcaDUVEbIyBEOJeEARXjTGlOI5hjCkFQaAvZf1HvJskyTtSSvi+/zMASCHEZ51O57bv+68R0QfZZiICM8MY8wOAhwCgtYbrujfTcoRSCp7nTQshpvv1gNYavV7v4dTUVBUAZK1W687MzLxp2/ZdrfXLxhhkHtBaP+p0Oj9mh4UQiOO4dnh4+Htm6+fJziClhOu6BxMTEw/W1tY6QNqKDw4O2gA+vuwwM1PanD7a29v77x8jIkrSpBtqtZx7jpkZCwsLZWPM1V6vd3LpjpTyilLqAYBfMqPv+0mhUPhifX398SACzg0kq6ureaXUjud5sG372J5NRJ7n3Tw7ETWbzSKGNREVi8W2lPJuFEWvX5RgZ7wCY0wyOTn51SDkI4wwAgD8DRixkgDRtVchAAAAAElFTkSuQmCC",onClick:function(){F(t.title),J(t.userid),P(!0)},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)(pR.a,{title:me.t("cloudFilePanel.CopyTitle",_),alt:"Copy Title",onClick:function(){Zh(t.title),Bh(me.t("cloudFilePanel.TitleCopiedToClipBoard",_)+".")},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)("img",{title:me.t("cloudFilePanel.GenerateLink",_),alt:"Link",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVERwXWf787gAABKdJREFUWIXdV09o21Yc/p5kabJkpx2keMsOppd1o7A/LWyUEMe2ItvB3WguaUsp63WjUHobbMcNethhZYdeBz40sNJtrF6apB62sbOQdSVdoCWwUNzQtN5onKBYif48vR0aF8eO48TZKOy76f0+ve97T59+0iOqqh7zeDwRy7Jc1IHneQAApRStIIoiMQzj23w+/7gVhxDiicViRziO66aUPl1aWrpz+/Ztu1b3MMY+DAaDn7ZUaYP5+fksgC0NqKp6IhaLXZEk6RXGGERRRHd3d1lV1fOZTOYaAHCMMaNTcQBgjG25ReFw+JQsy98DgGEYn9i2HTYM42PGGPN6vd/F4/HjAODZizgAEELsxrFIJHKyq6vrqmmas7quD0xOTv61Ucolk8kfHMeZdV33CiHk5yYDc3NzBymlKzsRdxyHTE1NbeJGIpGTfr9/xDTN2UqlEpmenn5aX0+n0080TfvK6/VeisVirzcZmJ+fLy8sLKztxEAj2onXIAjCHCEElNKXucZiIBAQ/0txADBNM0QpBSHk0Z4zAAD9/f3DXV1dI6ZpzpbL5dDMzMxyK66qqu9JknTRNM3fJiYmHjbtwG4Rj8ffkGX5qmVZ9yuVSsS2bSeRSHyhadqbjdxQKHREEIQMpXQZwEcAsGcDlNILgiBwAE5PT08/3b9//2uCIHzG83wuGo0G68UVRckBcHVdj0xMTNz/VwzwPB+pVqsLY2NjdwGgWCzO2batCYJwgOO4bwAgGo0elWV5kjHmrq6uhorF4kzt/o4MqKo6pKrqCeBZHyCEbMrSzZs3b62trV0TRfGD4eFhH6W0hxBS0nW9v1Ao3K3n7trARtqvA7gAAJZlpRVFeTWRSAzU81zXvSOKIgAcyuVyP42Ojh6qX3lHBsLh8Cm/3z9iGMYflNLTAOA4zuX19fUVjuOuDw4O9te4PM+/bZomqtXqo+3m3LGBjZVfNU1zdnl5OZrNZp8AQD6ff2ya5nGe59cJIYkN7vuSJJ20bXssnU4/2W7eHfWBeDx+VFGUEcuy7m3VZLLZbOHs2bMHU6lUdSPtt2zbXnIc53w9jxBCzp07967ruh6e54lhGIs7MuC67ueUUpcxdrxVh0ulUtXe3t53/H5/njFGdV1Xi8Xin/WcYDD4kiiKv9euK5XKZc513ebZNrvmAUQcxymOj48/aMULhUJH/H5/Ac/e8/6tAtcIx3GoR5KkdjzCGOMBWNuJy7KcA0B3Kg4AhBDWdgcYYw4h5FdBEHoHBwcPNNb7+vqOyrKcxy5WXg/O42kfA0LIJVEUJQA/JpPJ5z1e07Skoih57HLlmwxYVsudfY7x8fFfVldXLwqCcAzAvYGBgXuapj30er03ABidigNA20dQQyaT+dq27T7btlMAQAj527KsLw3DeKtTcWCX/4Sjo6MFAIVOxbbCnr+G/z8D5XK5fSo7RKlUMhvHmjJw+PDhwJkzZ1b27du3a4HFxUXW09NDtqqtrKxgaGioqes1GQgGgw+A7c+ErRAIBFre5/P54PP5msZffAYIIfIL1Fc8PM/fKJVKOqX0eUeilEIURQ9jjNm2TWtH9X8TPM9zrutO/QMUu0XyKmJPLwAAAABJRU5ErkJggg==",onClick:function(){var e=Ge+"?client=web&userid="+t.userid+"&title="+encodeURIComponent(t.title);Zh(e),Bh(me.t("cloudFilePanel.LinkGeneratedInClipBoard",_)+".")},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}})]})}},"action")]})]})})})]})},bR=n.a.memo(vR),AR=dR.a.Column,TR=mv.a.div(nz||(nz=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1001;\n"]))),PR=mv.a.div(cz||(cz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 400px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n"]))),SR=mv.a.div(sz||(sz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),jR=function(e){var t=e.likesArray,l=e.openCloudFile,a=Ew(Vi),o=n.a.useRef(null),i=Object(r.useRef)(null),c=i.current?i.current.clientWidth+40:680,s=i.current?i.current.clientHeight+100:600,d=Object(r.useState)({x:0,y:0}),f=Object(u.a)(d,2),h=f[0],p=f[1],y={lng:a};Object(r.useEffect)((function(){var e=function(){p({x:Math.max(0,c-window.innerWidth),y:Math.min(0,window.innerHeight-s)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var g=function(){Tf.setState((function(e){e.showLikesPanel=!1}))};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(JT.a,{nodeRef:o,handle:".handle",bounds:"parent",axis:"both",position:h,onDrag:function(e,t){p({x:Math.max(t.x,c-window.innerWidth),y:Math.min(t.y,window.innerHeight-s)})},onStop:function(e,t){},children:Object(gf.jsx)(TR,{ref:o,children:Object(gf.jsxs)(PR,{ref:i,children:[Object(gf.jsxs)(SR,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("cloudFilePanel.MyLikes",y)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){g()},onTouchStart:function(){g()},children:me.t("word.Close",y)})]}),Object(gf.jsx)(dR.a,{rowKey:function(e){return e},size:"small",style:{width:"100%",direction:"ltr"},dataSource:t,scroll:{y:300},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:Object(gf.jsx)(AR,{title:me.t("word.Title",y),render:function(e,t){return Object(gf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){var e=t,a=e.lastIndexOf(", ");a>=0&&(Tf.setState((function(e){e.openModelsMap=!1})),l(e.substring(a+2),e.substring(0,a)))},children:t.substring(0,t.lastIndexOf(", "))},t)}},"title")})]})})})})},HR=n.a.memo(jR),zR=dR.a.Column,RR=mv.a.div(dz||(dz=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1001;\n"]))),DR=mv.a.div(uz||(uz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 420px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n"]))),MR=mv.a.div(fz||(fz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),WR=function(e){var t=e.publishedModels,l=e.openCloudFile,a=Ew(Vi),o=Ew(di),i=n.a.useRef(null),c=Object(r.useRef)(null),s=c.current?c.current.clientWidth+40:680,d=c.current?c.current.clientHeight+100:600,f=Object(r.useState)({x:0,y:0}),h=Object(u.a)(f,2),p=h[0],y=h[1],g={lng:a};Object(r.useEffect)((function(){var e=function(){y({x:Math.max(0,s-window.innerWidth),y:Math.min(0,window.innerHeight-d)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var m=function(){Tf.setState((function(e){e.showPublishedModelsPanel=!1}))};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(JT.a,{nodeRef:i,handle:".handle",bounds:"parent",axis:"both",position:p,onDrag:function(e,t){y({x:Math.max(t.x,s-window.innerWidth),y:Math.min(t.y,window.innerHeight-d)})},onStop:function(e,t){},children:Object(gf.jsx)(RR,{ref:i,children:Object(gf.jsxs)(DR,{ref:c,children:[Object(gf.jsxs)(MR,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("modelsMap.MyPublishedModels",g)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){m()},onTouchStart:function(){m()},children:me.t("word.Close",g)})]}),Object(gf.jsx)(dR.a,{rowKey:function(e){return e},size:"small",style:{width:"100%",direction:"ltr"},dataSource:t,scroll:{y:300},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:Object(gf.jsx)(zR,{title:me.t("word.Title",g),render:function(e,t){return Object(gf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){o.uid&&(Tf.setState((function(e){e.openModelsMap=!1})),l(o.uid,t))},children:t},t)}},"title")})]})})})})},IR=n.a.memo(WR),CR=(Zv.a.confirm,db.a.Option),OR=mv.a.div(hz||(hz=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1000;\n"]))),FR=mv.a.div(pz||(pz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 380px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n text-align: left;\n overflow-x: hidden;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),kR=mv.a.div(yz||(yz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),YR=function(e){var t,l,a,o,i,c,s,d,f,h=e.openCloudFile,p=Ew(si),y=Tf(yf),g=Ew(Vi),m=Ew(di),w=Tf(ui),x=Tf(Ds),v=Tf(Ms),b=n.a.useRef(null),A=Object(r.useRef)(null),T=Object(r.useRef)(null!==(t=m.schoolID)&&void 0!==t?t:j.UNKNOWN),P=Object(r.useRef)(null!==(l=m.classID)&&void 0!==l?l:H.UNKNOWN),S=A.current?A.current.clientWidth+40:640,z=A.current?A.current.clientHeight+100:600,R=Object(r.useState)({x:0,y:0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I={lng:g};Object(r.useEffect)((function(){var e=function(){W({x:Math.max(0,S-window.innerWidth),y:Math.min(0,window.innerHeight-z)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var C=function(){Tf.setState((function(e){e.showAccountSettingsPanel=!1}))},O=m&&m.email&&m.email.endsWith("intofuture.org");return Object(gf.jsxs)(gf.Fragment,{children:[x&&Object(gf.jsx)(HR,{likesArray:null!==(a=m.likes)&&void 0!==a?a:[],openCloudFile:h}),v&&Object(gf.jsx)(IR,{publishedModels:null!==(o=m.published)&&void 0!==o?o:[],openCloudFile:h}),Object(gf.jsx)(JT.a,{nodeRef:b,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){},children:Object(gf.jsx)(OR,{ref:b,children:Object(gf.jsxs)(FR,{ref:A,children:[Object(gf.jsxs)(kR,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("accountSettingsPanel.MyAccountSettings",I)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){C()},onTouchStart:function(){C()},children:me.t("word.Close",I)})]}),Object(gf.jsxs)(UT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,onClick:function(){m.uid&&(Zh(m.uid),Bh(me.t("accountSettingsPanel.IDInClipBoard",I)))},children:Object(gf.jsx)(xv.a,{title:me.t("accountSettingsPanel.ClickToCopyMyID",I),style:{cursor:"copy",borderRadius:"8px"},children:me.t("accountSettingsPanel.MyID",I)})}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:m.uid})]}),!1,Object(gf.jsxs)(UT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.SchoolID",I)}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:Object(gf.jsxs)(db.a,{style:{width:"90%"},value:T.current,onChange:function(e){T.current=e,p((function(t){t.user.schoolID=e}))},children:[Object(gf.jsx)(CR,{value:j.UNKNOWN,children:j.UNKNOWN},j.UNKNOWN),Object(gf.jsx)(CR,{value:j.SCHOOL1,children:j.SCHOOL1},j.SCHOOL1),Object(gf.jsx)(CR,{value:j.SCHOOL2,children:j.SCHOOL2},j.SCHOOL2),Object(gf.jsx)(CR,{value:j.SCHOOL3,children:j.SCHOOL3},j.SCHOOL3),Object(gf.jsx)(CR,{value:j.SCHOOL4,children:j.SCHOOL4},j.SCHOOL4),Object(gf.jsx)(CR,{value:j.SCHOOL5,children:j.SCHOOL5},j.SCHOOL5)]})})]}),Object(gf.jsxs)(UT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.ClassID",I)}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:Object(gf.jsxs)(db.a,{style:{width:"90%"},value:P.current,onChange:function(e){P.current=e,p((function(t){t.user.classID=e}))},children:[Object(gf.jsx)(CR,{value:H.UNKNOWN,children:H.UNKNOWN},H.UNKNOWN),Object(gf.jsx)(CR,{value:H.CLASS1,children:H.CLASS1},H.CLASS1),Object(gf.jsx)(CR,{value:H.CLASS2,children:H.CLASS2},H.CLASS2),Object(gf.jsx)(CR,{value:H.CLASS3,children:H.CLASS3},H.CLASS3),Object(gf.jsx)(CR,{value:H.CLASS4,children:H.CLASS4},H.CLASS4),Object(gf.jsx)(CR,{value:H.CLASS5,children:H.CLASS5},H.CLASS5),Object(gf.jsx)(CR,{value:H.CLASS6,children:H.CLASS6},H.CLASS6),Object(gf.jsx)(CR,{value:H.CLASS7,children:H.CLASS7},H.CLASS7),Object(gf.jsx)(CR,{value:H.CLASS8,children:H.CLASS8},H.CLASS8),Object(gf.jsx)(CR,{value:H.CLASS9,children:H.CLASS9},H.CLASS9)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.AllPublished",I)}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:Object(gf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){y("showPublishedModelsPanel",!0)},children:null!==(i=null===(c=m.published)||void 0===c?void 0:c.length)&&void 0!==i?i:0})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.PublishedUnderAliases",I)}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:Object(gf.jsx)("span",{style:{fontSize:"10px"},children:null===(s=m.aliases)||void 0===s?void 0:s.map((function(e,t){return m.aliases?e+(t=0&&t.user.likes.splice(o,1)}else t.user.likes.push(l);if(t.modelSites){var i=t.modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(i){var r,n=Object(f.a)(i.values());try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.userid===e.userid&&c.title===e.title){void 0===c.likeCount&&(c.likeCount=0),c.likeCount+=a?-1:1;break}}}catch(s){n.e(s)}finally{n.f()}}}})),K(!B)}))}},re=function(e){var t=Ew.getState().modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(f.a)(t.values());try{for(a.s();!(l=a.n()).done;){var o,i=l.value;if(i.userid===e.userid&&i.title===e.title)return null!==(o=i.likeCount)&&void 0!==o?o:0}}catch(r){a.e(r)}finally{a.f()}}return 0},ne=function(e){var t=Ew.getState().modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(f.a)(t.values());try{for(a.s();!(l=a.n()).done;){var o,i=l.value;if(i.userid===e.userid&&i.title===e.title)return null!==(o=i.clickCount)&&void 0!==o?o:0}}catch(r){a.e(r)}finally{a.f()}}return 0},ce=function(e){var t=Ew.getState().modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(f.a)(t.values());try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.userid===e.userid&&o.title===e.title)return o.pinned}}catch(i){a.e(i)}finally{a.f()}}return!1},se=function(e,t){e.userid&&e.title&&p(e,t,(function(){m((function(l){if(l.modelSites){var a=l.modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(a){var o,i=Object(f.a)(a.values());try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.userid===e.userid&&r.title===e.title){r.pinned=t,K(!B);break}}}catch(n){i.e(n)}finally{i.f()}}}}))}))};return Object(gf.jsx)(ER.a,{mapContainerStyle:{border:"1px solid",width:"100%",height:"100%"},mapTypeId:S,options:{styles:[{featureType:"poi",elementType:"labels",stylers:[{visibility:"off"}]},{featureType:"transit",elementType:"labels",stylers:[{visibility:"off"}]}]},center:{lat:v,lng:A},zoom:T,tilt:P,onLoad:le,onUnmount:ae,onCenterChanged:function(){if(M){var e=M.getCenter();if(e){var t=e.lat(),l=e.lng();if(t!==v||l!==A){var a={name:"Set Model Map Location",timestamp:Date.now(),oldLatitude:v,newLatitude:t,oldLongitude:A,newLongitude:l,undo:function(){m((function(e){e.modelsMapLatitude=a.oldLatitude,e.modelsMapLongitude=a.oldLongitude}))},redo:function(){m((function(e){e.modelsMapLatitude=a.newLatitude,e.modelsMapLongitude=a.newLongitude}))}};w(a),m((function(e){e.modelsMapLatitude=t,e.modelsMapLongitude=l}))}}}},onZoomChanged:function(){if(M){var e=M.getZoom();if(void 0!==e&&e!==T){var t={name:"Zoom Model Map",timestamp:Date.now(),oldValue:T,newValue:e,undo:function(){m((function(e){e.modelsMapZoom=t.oldValue}))},redo:function(){m((function(e){e.modelsMapZoom=t.newValue}))}};w(t),m((function(t){t.modelsMapZoom=e}))}}},onTiltChanged:function(){if(M){var e=M.getTilt();if(void 0!==e&&e!==P){var t={name:"Tilt Model Map",timestamp:Date.now(),oldValue:P,newValue:e,undo:function(){m((function(e){e.modelsMapTilt=t.oldValue}))},redo:function(){m((function(e){e.modelsMapTilt=t.newValue}))}};w(t),m((function(t){t.modelsMapTilt=e}))}}},onMapTypeIdChanged:function(){if(M){var e=M.getMapTypeId();if(void 0!==e&&e!==S){var t={name:"Change Model Map Type",timestamp:Date.now(),oldValue:S,newValue:e,undo:function(){m((function(e){e.modelsMapType=t.oldValue}))},redo:function(){m((function(e){e.modelsMapType=t.newValue}))}};w(t),m((function(t){t.modelsMapType=e}))}}},children:Object(gf.jsxs)(gf.Fragment,{children:[H&&_.current.map((function(e,t){var l=.2*T;return Object(gf.jsx)(ER.c,{icon:{path:google.maps.SymbolPath.CIRCLE,strokeColor:"red",strokeWeight:l+2,scale:l},position:e},t)})),O&&O.size&&L&&Object(gf.jsx)(ER.b,{position:{lat:L.lat(),lng:L.lng()},children:Object(gf.jsxs)("div",{style:{border:"2px solid gainsboro",maxHeight:"400px",overflowY:"auto"},onMouseLeave:function(){F(null),E(null)},children:[O.size>1?Object(gf.jsxs)("div",{style:{background:"#dddddd",textAlign:"left",borderBottom:"1px solid gainsboro",paddingBottom:"4px",marginBottom:"4px"},children:[V?Object(gf.jsx)(GR.a,{title:me.t("modelsMap.SortFromNewestToOldest",$),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){J(!1)}}):Object(gf.jsx)(XR.a,{title:me.t("modelsMap.SortFromOldestToNewest",$),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){J(!0)}}),Object(gf.jsxs)("span",{style:{fontSize:"10px"},children:[O.size," ",me.t("modelsMap.ModelsFoundOnThisSite",$)]}),L&&Object(gf.jsxs)("span",{style:{fontSize:"10px"},children:["\xa0\u2014"," ",me.t("word.Coordinates",$)+": ("+L.lat().toFixed(4)+"\xb0, "+L.lng().toFixed(4)+"\xb0)"]})]}):"",Object(h.a)(O.keys()).sort((function(e,t){var l,a,o=O.get(e),i=O.get(t);return(null===o||void 0===o?void 0:o.pinned)&&!(null===i||void 0===i?void 0:i.pinned)?-1:(null===i||void 0===i?void 0:i.pinned)&&!(null===o||void 0===o?void 0:o.pinned)?1:(V?1:-1)*((null!==(l=null===o||void 0===o?void 0:o.timeCreated)&&void 0!==l?l:0)-(null!==(a=null===i||void 0===i?void 0:i.timeCreated)&&void 0!==a?a:0))})).map((function(e,t){var l,a=O.get(e);return a?Object(gf.jsxs)("div",{style:{padding:(null===O||void 0===O?void 0:O.size)>1?"5px 5px 20px 5px":"5px",background:t%2===0?"white":"#eeeeee"},children:[0===t&&Object(gf.jsxs)("div",{style:{fontSize:"12px",display:"block",paddingBottom:"6px"},children:[a.countryCode&&Object(gf.jsx)(QR.a,{countryCode:a.countryCode,style:{marginRight:"6px",width:"20px"},svg:!0}),null!==(l=a.address)&&void 0!==l?l:"Unknown",1===O.size&&Object(gf.jsx)("span",{style:{fontSize:"10px",display:"block",paddingTop:"10px"},children:me.t("word.Coordinates",$)+": ("+L.lat().toFixed(4)+"\xb0, "+L.lng().toFixed(4)+"\xb0)"})]}),Object(gf.jsx)(JR.a,{style:{background:ce(a)?"#FEF9EC":t%2===0?"white":"#eeeeee",width:"400px"},bordered:!1,ghost:!0,defaultActiveKey:["0"],children:Object(gf.jsx)(ZR,{header:Object(gf.jsxs)(gf.Fragment,{children:[a.label,ce(a)&&Object(gf.jsx)(BR.a,{style:{marginLeft:"8px"}})]}),style:{fontSize:"12px"},children:Object(gf.jsx)("div",{style:{fontSize:"10px",display:"block",textAlign:"left"},children:Object(gf.jsxs)(wv.b,{align:"start",children:[a.thumbnailUrl&&Object(gf.jsx)("img",{alt:a.label,title:me.t("word.Open",$),src:a.thumbnailUrl,style:{border:"1px solid #222",cursor:"pointer"},onClick:function(){return oe(a)}}),Object(gf.jsxs)("div",{children:[a.description&&""!==a.description.trim()?a.description:"","\xa0\u2014\xa0 By"," ",Object(gf.jsx)("span",{style:{cursor:"pointer"},title:me.t("modelsMap.ShowModelsPublishedByThisAuthor",$),onClick:function(){i(a.author)},children:a.author&&""!==a.author?a.author:me.t("word.Anonymous",$)}),",\xa0",a.timeCreated&&Object(gf.jsx)(qR.a,{date:new Date(a.timeCreated)})]})]})})},t)}),Object(gf.jsxs)("div",{style:{marginTop:"10px",fontSize:"11px"},children:[te&&Object(gf.jsx)(gf.Fragment,{children:ce(a)?Object(gf.jsx)(KR.a,{style:{cursor:"pointer"},title:me.t("word.Unpin",$),onClick:function(){return se(a,!1)}}):Object(gf.jsx)(BR.a,{style:{cursor:"pointer"},title:me.t("word.Pin",$),onClick:function(){return se(a,!0)}})}),Object(gf.jsx)("img",{alt:"Open",onClick:function(){return oe(a)},style:{marginLeft:"10px",cursor:"pointer"},title:me.t("word.Open",$),src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVERweICJESgAAAktJREFUWIXtV02rElEYfo+pdEXq0iKNksQvdBARRjAcPxZ+3EXrFrfWzfkDUb+h/sGcVUS0aN0iFDQ3ttFwKWPIEAVtYtJwiCszp4V4mSvqeEbLxe1dnfOc532fhzPvmZmDKKVwyHAcVP1fGMAY01Kp9PRgBgAA4vH4c4zxymf91wwghLyxWOy2GcMYU4TQ1Qu8fTUhQshbq9UeBoNByYrbarXuyLL8DQAAAcCx3+93bSMynU6NyWTyYxmvVqv3Q6HQOxbDw+Ew02w2e05RFFWWRITQNUrpr8VcEITHyWSSsNQAAIhGo91cLldm7gGe589zyuXyAzvi5mA20Ov1zgAAMplMOBKJvLUrrChKptPpNJ1mUJIkZJUoSfMe43n+s11xcxM6rcirolAonHIct3ZdluUnuq5/nc1m31Op1AfzGiHkiFL6ezFnNoAQcoqi+GYZVxQF1+v1l5TSMzOOMT4fS5KEFjto20A+nz9dxkaj0d1Go/FlXc5gMHjWbrdfrFpjNsBx3CvznBByhVJqrONb9RXTKchms/eWi28S3yaYDKTT6Y9m8V2EmQ0ghI72Lc5koFKp8AAAhJDrm3iBQOAGxphijGmxWDyxqrt1E6qq+okQ4qWUTjfxfD7fzcU4kUi8h/kHb3cD3W5X24anaZq+bU2Ay/BP+N/A5TOgqupPFv6FYygIwiOPx0M1TbN80xmGQR0OB1rGwuHwLdsGksnka5bkfcTBe8DZ7/dPXC7Xsa7PX2CLbTUMY6cbi9vthvF4LFvx9nYzsht/AFhGzatwKRNAAAAAAElFTkSuQmCC",height:ee,width:ee}),Object(gf.jsx)("img",{alt:"Export link",onClick:function(){return function(e){if(e.userid&&e.title){var t=Ge+"?client=web&userid="+e.userid+"&title="+encodeURIComponent(e.title);Zh(t),Bh(me.t("cloudFilePanel.LinkGeneratedInClipBoard",$)+".")}else Qh(me.t("message.ModelNotFound",$))}(a)},style:{marginLeft:"5px",cursor:"pointer"},title:me.t("word.Share",$),src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDzUx0EsoOwAAAotJREFUWIXtl7FP20AUxr9LXhLrFKXHwNB4oiAStXFlC4kFAVmtWAJPUYfOoCydOiA2hMTAH8Cf0JU1AysSohLq0LAVPHRDSmshyHCX65A4SRGFKIkpA59k6WQ/v+93d7p3d8CIWllZMYUQ50KI88XFRXPUPCPJtu05znkAQAPQnPPAtu25JzF3HGd20HwQwnGc2VjN7/b8PojYRuKueT6fPyIilU6nVT6fP4oVYmFhYZ5zfol+bzdqtdqSYRjaMAxdq9WWAGwwxiKIy1KpND8Rc9/3E5zzRmSeSCS2AMDzPC8C8DzPA4BkMrmF/kg0fN9PTIKBZTKZUyLSXQMAgOu6axGA67pr0ftkMrlFRDqTyZwCYI8lH4ZQl8tl1zRNWym191iwUmrPNE27XC676IzGg6IhAFCv168AXA0TCwBBEHwLgmCo2InM0Th6AXgBeDYAaSHErhBiM25DIcSmEGIXQLoHUCwW/TAMt1ut1kGlUoltX69UKnOtVusgDMPtYrHo9wCEEK8BIJVKIZvNTscFkM1mp1OpFAY9EwCglJIAoLUGY0zFBcAYU1p3qnPkOVQpvk9SSmq32732qHlG/jEMw69E9CtqPznAyclJsL6+XgKAw8PDn08OMK5xpGdTiP47AAMAxhiIxpqVB0VEYKx3SmM9gHZ3PSmlIKW8jQtASnmrVKfMRJ4AgEKhsEpEGoCempr6FBdAN7cmIl0oFFaB7iqwLOs4CIKGlPJts9ncz+Vy78Mw/D5J81wu967ZbH4EACJqVKvV452dnX6AZVnLnPNr/OPaNanHMIxry7KWI9+/zu2O47y5uLj4zBj7cHNz86q7N4zV8ygH5/y31vrLzMzM/tnZ2Y/o+x/AkgU3TshK/QAAAABJRU5ErkJggg==",height:ee,width:ee}),a.userid===g.uid&&Object(gf.jsx)("img",{alt:"Delete",onClick:function(){return e=a,void Zv.a.confirm({title:me.t("message.DoYouWantToDeleteModelFromMap",$),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){s(e,(function(){m((function(t){if(t.modelSites){var l=t.modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(l){var a,o,i,r=void 0,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c=Object(u.a)(a.value,2),s=c[0],d=c[1];if(d.userid===e.userid&&d.title===e.title){r=s;break}}}catch(h){n.e(h)}finally{n.f()}r&&(l.delete(r),0===l.size&&(null===(o=Q.current[Z.current])||void 0===o||null===(i=o.marker)||void 0===i||i.setMap(null)))}}})),F(null),E(null)}))},onCancel:function(){},okText:me.t("word.Yes",$),cancelText:me.t("word.No",$)});var e},style:{marginLeft:"5px",cursor:"pointer"},title:me.t("word.Delete",$),src:yR,height:ee,width:ee}),g.uid?Object(gf.jsx)(gf.Fragment,{children:g.likes&&g.likes.includes(Tw.getModelKey(a))?Object(gf.jsx)("img",{alt:"Like",onClick:function(){return ie(a)},style:{marginLeft:"10px",cursor:"pointer"},title:me.t("word.AlreadyLike",$),src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDi8RWsqYHwAABAtJREFUWIXlls1rXFUYxp9z7ufcyXykM8lkJiRpvtpUNFFrSEVcTE2htCpk48aCoAuz6UoQdF0VceVGEFfWP0AXIlIkLqTQIhQRXNkP1FBJMkmTzGRm7ufj4nYmmY9MkyZxoQ+8XLj3nPN7n/fce+4L/N8l2t3cmJwe91YWXzKBM35hVYskuuGk4n8Wo7Fv+m7dutlpwcLEUzPq5so5w3ZPBcUtyL606+rmjcrYwLXM9z/e7ZjNbxdnx0q5vq9d03SoqCQECYShKKRp0s9kf15+/sULzXP/OpfPV3v7b7A7TWp6OEeAlILUNTqWtVXK9n92e/6dnrbw5adfOF9OJgoU29BgR3BndMVYyPZfrrs+OX056MuEc3SddjxGR1PpNc9XJMup1J2NV16baYAvnnpuqhpLlNkECtpc64upGldGRy8t5WcvMdHd8NzRNdqJOB1N0m8zt5pOra3lLwyGdFJUksd+pRAtoE5BgKVU0iv29njNFfMBug8rYauy0YgIYzObWwjdT06+TE1rAfsd4D5AO2rRjUfabldtjKPrrMZjtBVRh9craOr8e2pqWnYvr74OzwObvoe2nwcAAvAsA74ElJJdv9csAUBxHChVG4xY8FSlYQ3YLsyllbckPDsf5vQo9EN41AQ1FXqpDBEQ7DBeAJCOA9V24Ma74EsBAUAIACQMz5kTZdNkpFrd1UmjcxOBqkErlqCQHcc3yzV0CE0HKmVoQRCuaRqQnuftDR41QVWBvrkFhftBh9JsB9J24CVi8BUJCAm6LmREj3RMgAB8y0SgqFCLZUgE4CMS3k3SdaBsVRBEonBJyGQK0o3od8PFWveSAFzLQKAq0IvlfZe9ncJKVCGiBkqGeU+6gbcg6rhGuGeZgKqFzhkcEL0t6bhQHR9uxLomvXT2B6hKi38KARkE0IpbdecHdV+TAICA8BV8K38fjX3nqFqpOQFBQq06kDh42dupYuml0vmZnwAA67n+Lyjlno/hgwYBFoeHPgcACQAbz8x8aHdZlSMw2iIBoBJLPtgcGHq/4UFhcPhNGuaRVoEAaURYeHbmjbbZrY+MfEm19cd0eHCND3LHP+hYovVc9ipV5VCTqP39SifHr2Ivp+jy6PGvaB7OdoSdkODG8NCne31PwnfixMTHNIx6b/fYcCvC1Wzu3X3Ba1oayc3ZyUSFcu+dUh0MsHosWbk/MTL3WPCa7s/OnraTqetU9nZO1DrocrL35h+zr54+ELwuUqwNDX7kW9auLVgN7psm1wcGPllYuGccDnyHVp+cOFNJp6/T3H43KLa7ZCeT+WVlcjJ/6OCdmiPl6tjI2253cpGqTiqCbtxa3hwff+9IXO+m2/PzPcUTT1zZyGWu3Dl7tvdfA//n9A8HQo97kdEpRwAAAABJRU5ErkJggg==",height:ee,width:ee}):Object(gf.jsx)("img",{alt:"Like",onClick:function(){return ie(a)},style:{marginLeft:"10px",cursor:"pointer"},title:me.t("word.Like",$),src:VR,height:ee,width:ee})}):Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)("img",{alt:"Like",style:{marginLeft:"10px",opacity:.5},title:me.t("word.MustLogInToLike",$),src:VR,height:ee,width:ee})}),"\xa0\xa0\xa0",re(a),Object(gf.jsx)("img",{alt:"Click counter",style:{marginLeft:"10px"},title:me.t("word.ClickCount",$),src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYEwsXVr/srwAAAYVJREFUWIXt1D8vQ1EYBvDnvOf0372twTdoYuJLEIPBZLFIDFaNCZMBaSwkhg6d7VJrox/ApiEhKW1ViQhXRWh7b3vvey3CJLmC0+U+y1nOe55fTk6OQMCsbO7mjKSR8TxGRIrs/MxUNp1OO0HnvwsF3XjZaKBSvUL59Aymaax1u97Ib8t/BCBBICJISXD7fTAzawX8V0JACBg4QOkq2srlhiMqNRFNJNCyrLuN5cUjQOMN1Jut0bvH5/1a43a/1+NioVia1gq4v39wm80bVKs1+IKGSKhxrQAVUZBSQikFZg/w/Y5WwLcwACiUSsPH5UoeoDFmDz23O7eztnqiDSBZLTHk7EWtjngshrfXTlJH+SeAmaXb78OxbQjfB4Tn6QIQAAgh+GOFEEJX9xdgkPmTn9D3faxv5yejZmKBALTb7cPsamZPG6BcPh+Jx6MHldp1yjBNvLSeHAD6AEQipqKRlGVZSNoObLvbDjz7FwClFHuuCyICkQCJ4McO/BGGgBAQAkLAO6uZiizcGAzsAAAAAElFTkSuQmCC",height:ee,width:ee}),"\xa0\xa0\xa0",ne(a)]})]},t):null}))]})}),!!z&&!!z.size&&Object(gf.jsx)(ER.d,{children:function(e){return Object(gf.jsx)("div",{children:Object(h.a)(z.keys()).map((function(t,l){var a=z.get(t);if(!a||!a.size)return null;var o=Object(h.a)(a.keys()).sort((function(e,t){var l,o,i=a.get(e),r=a.get(t);return(null===i||void 0===i?void 0:i.pinned)&&!(null===r||void 0===r?void 0:r.pinned)?-1:(null===r||void 0===r?void 0:r.pinned)&&!(null===i||void 0===i?void 0:i.pinned)?1:(V?1:-1)*((null!==(l=null===i||void 0===i?void 0:i.timeCreated)&&void 0!==l?l:0)-(null!==(o=null===r||void 0===r?void 0:r.timeCreated)&&void 0!==o?o:0))})),i=a.get(o[0]);if(!i)return null;var r=_R(i);return Object(gf.jsx)(ER.c,{ref:function(e){return Q.current[l]=e},clusterer:e,icon:r?{url:r}:void 0,position:{lat:i.latitude,lng:i.longitude},onClick:function(){return oe(i)},onMouseOver:function(e){q.current=O,Z.current=l,F(a);var o=t.split(", ");E(new google.maps.LatLng(Number.parseFloat(o[0]),Number.parseFloat(o[1])))},onMouseOut:function(e){O===q.current&&(F(null),E(null))}},l)}))})}})]})})},eD=n.a.memo($R),tD=l(855),lD=l(856),aD=l(846),oD=l(840),iD=l(853),rD=l(854),nD=function(e){var t=e.author,l=e.models,a=e.closeCallback,o=e.openCloudFile,i=Ew(di),n=Ew(Vi),c=Ew(si),s=Ew($i),d=Object(r.useRef)(l?new Map(l):new Map),p=Object(r.useState)(!1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(!1),T=Object(u.a)(A,2),P=T[0],S=T[1],j=ET.a.Search,H=Object(r.useMemo)((function(){return{lng:n}}),[n]);Object(r.useEffect)((function(){l&&(d.current=new Map(l),m(!g))}),[l]);var z=Object(r.useMemo)((function(){var e,l=0,a=Object(f.a)(d.current.values());try{for(a.s();!(e=a.n()).done;){var o=e.value;(t||o.userid===i.uid)&&l++}}catch(r){a.e(r)}finally{a.f()}return l}),[d.current,t,i.uid,g]),R=t&&"roadmap"!==s;return 0===d.current.size?Object(gf.jsx)(oD.a,{mask:!1,headerStyle:{height:"40px",paddingLeft:"1px",paddingRight:"1px",paddingTop:"16px",paddingBottom:"12px",background:R?"#6A6B6E":"whitesmoke"},bodyStyle:{padding:"0px 4px 0px 4px",overflowY:"hidden",background:R?"#2A2B2E":"white"},style:{scrollbarColor:R?"#6A6B6E":"whitesmoke"},title:(null!==t&&void 0!==t?t:me.t("modelsMap.MyPublishedModels",H))+" (0)",placement:"bottom",visible:!0,height:"150px",onClose:function(){a()},children:Object(gf.jsx)(UR.a,{image:UR.a.PRESENTED_IMAGE_SIMPLE,style:{color:R?"lightgray":"dimgray"}})}):Object(gf.jsx)(oD.a,{extra:Object(gf.jsxs)(wv.b,{children:[P?Object(gf.jsx)(iD.a,{title:me.t("modelsMap.SortFromNewestToOldest",H),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){S(!1)}}):Object(gf.jsx)(rD.a,{title:me.t("modelsMap.SortFromOldestToNewest",H),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){S(!0)}}),Object(gf.jsx)(j,{title:me.t("modelsMap.SearchByLabel",H),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(l){d.current.clear();var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];(null===(o=n.label)||void 0===o?void 0:o.toLowerCase().includes(e.toLowerCase()))&&d.current.set(r,n)}}catch(c){a.e(c)}finally{a.f()}m(!g)}}})]}),mask:!1,headerStyle:{height:"40px",color:R?"white":"black",background:R?"#6A6B6E":"whitesmoke",paddingLeft:"1px",paddingRight:"1px",paddingTop:"16px",paddingBottom:"12px",border:"none"},bodyStyle:{padding:"0px 4px 0px 4px",overflowY:"hidden",background:R?"#2A2B2E":"white"},title:(null!==t&&void 0!==t?t:me.t("modelsMap.MyPublishedModels",H))+" ("+z+")",placement:"bottom",visible:!0,height:"164px",onClose:function(){b(void 0),a()},children:Object(gf.jsx)("table",{children:Object(gf.jsx)("tbody",{children:Object(gf.jsx)("tr",{children:Object(h.a)(d.current.keys()).sort((function(e,t){var l,a,o=d.current.get(e),i=d.current.get(t);return o&&i?(P?-1:1)*((null!==(l=i.timeCreated)&&void 0!==l?l:0)-(null!==(a=o.timeCreated)&&void 0!==a?a:0)):0})).map((function(e,l){var a=d.current.get(e);return a&&(t||a.userid===i.uid)?Object(gf.jsx)("td",{children:Object(gf.jsxs)("div",{style:{display:"block",marginTop:"4px"},children:[Object(gf.jsx)("img",{loading:"lazy",height:"100px",width:"auto",onError:function(e){e.target.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMLDhEG5xDXZAAAAwVJREFUeJzt3aFy6kAAheHTO53ZqqDWEUVV4uLiFpVVwcXxKhV9JByqdTieABQ8QVxUryozDFCgDbun9HwuzUB28pNkE9rpw8fHB4THv9gDkH0KQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUh83jrDby+vt7Nr9e/vLw83HobOkKuEOLDpSBkFISMgpBREDIKQoY6iLUWxpjYwwjq5vch3+GcQ1EUu+W2bfH29ob1eh1xVGHQHSFlWe7FAIAkSeC9R5IkkUYVDl2Q4XB49OfGGDw/PwceTXh0QdI0PbnuL1xP6IJsNpuT67quCziSOOiCbLfbk+tWq1XAkcRBF2S5XB7s+K7rMJ/P0bZtpFGFQzft7boOs9kMSZJgMBgA+Po0dm/ognxq2/bHR4QxBsaYX3Vk0Z2y+lTXNabTKay1sYdysbsNUlUV0jSFMQbe+18zZb7LIFmWIc/z3bK1Fk3TRBzR5eiDXHu6GQ6H8N4ffZ+qqvoa1s1QBynL8qprgLUWk8nk5Po8zw+ek7GhDZJlGcqyBAA0TXP2waIxBpPJ5Oy1wjmH0WjU2zj7RhnEWovxeLxbvmRnXxLtk/eeduZFF8QYg6ZpDna+tRZ1XR99TVVVV+3gU9tgQBXk3I5K0/TgwlyW5d6Mqq9txUIV5JJPep7nyLIMwP515justXDOffv1t0Dz6MQ5d/EXUN57PD09/SjGpzzP0XUd3t/ff/xefaA4QrIsu3o66pzr7XRTFMXuqIstepBTN3Khscy8ogY5dyMXWtM00aNEC8L40I9hTNGC1HUd/dN4zFf3OyFEm2Vtt9svvz//q6IFWSwWsTZNLfosS/YpCBkFIaMgZBTkCiH+LPpB/6WNi44QMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSHzH/ERhEFb2CeRAAAAAElFTkSuQmCC"},alt:a.label,title:a.label,src:a.thumbnailUrl,style:{cursor:"pointer",borderRadius:v===a?"0":"10px",border:v===a?"2px solid "+(R?"goldenrod":"red"):"none",marginRight:"4px"},onClick:function(){b(a),o?o(a.userid,a.title):c((function(e){a&&(e.modelsMapLatitude=a.latitude,e.modelsMapLongitude=a.longitude,e.modelsMapZoom=17)}))}}),Object(gf.jsxs)("div",{children:[Object(gf.jsx)("img",{alt:a.type,src:_R(a),style:{position:"relative",left:"8px",bottom:"28px",width:"16px",height:"16px"}}),Object(gf.jsx)("span",{style:{position:"relative",left:"16px",bottom:"24px",color:"white",fontSize:"8px",fontWeight:"bold"},children:a.label?a.label.length>30?a.label.substring(0,30)+"...":a.label:"Unknown"})]})]})},l):null}))})})})})},cD=n.a.memo(nD),sD=["places"],dD=mv.a.div(gz||(gz=Object(gv.a)(["\n position: absolute;\n top: 70px;\n left: 0;\n display: flex;\n width: 100%;\n height: calc(100% - 70px);\n flex-direction: column;\n align-items: center;\n z-index: 999;\n tab-index: 0;\n background: white;\n"]))),uD=function(e){var t,l,a=e.openCloudFile,o=e.deleteModelFromMap,i=e.likeModelFromMap,n=e.pinModelFromMap,c=Ew(di),s=Ew(Vi),d=Ew(si),p=Ew(Sr),y=Ew($i),g=Ew(qi),m=void 0!==g?g:42.2844063,w=Ew(Qi),x=void 0!==w?w:-71.3488548,v=null!==(t=Ew.getState().modelsMapAddress)&&void 0!==t?t:Xe,b=Tf(er),A=Tf(yr),T=Ew(or),P=Ew(ir),S=Ew(rr),j=Object(r.useRef)(S?new Map(S):new Map),H=Object(r.useState)(),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(),F=Object(r.useRef)(),k=Object(r.useMemo)((function(){return{lng:s}}),[s]),Y=ET.a.Search;Object(r.useEffect)((function(){j.current=S?new Map(S):new Map,R&&(O.current=S.get(R)),C(!I)}),[S,R]);var L=Object(ER.f)({id:"google-map-script",googleMapsApiKey:"AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs",libraries:sD}),E=L.isLoaded,U=L.loadError,N=function(){Tf.setState((function(e){e.openModelsMap=!1}))},V=null===(l=c.email)||void 0===l?void 0:l.endsWith("@intofuture.org"),J=Object(r.useMemo)((function(){if(!P||!P.size)return 0;var e,t=0,l=Object(f.a)(P.values());try{for(l.s();!(e=l.n()).done;){var a;t+=null!==(a=e.value.size)&&void 0!==a?a:0}}catch(o){l.e(o)}finally{l.f()}return t}),[P]);return Object(gf.jsxs)(dD,{onKeyDown:function(e){"Escape"===e.key&&N()},children:[E&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{style:{position:"absolute",fontSize:"medium",color:"black",cursor:"pointer",top:"-40px",left:"40%",width:"20%",height:"28px",background:"white",boxShadow:"1px 1px 1px 1px gray"},children:Object(gf.jsx)(ER.e,{onLoad:function(e){F.current=e},onPlacesChanged:function(){var e,t=null===(e=F.current)||void 0===e?void 0:e.getPlaces();if(t&&t.length>0){var l=t[0].geometry;if(l&&l.location){var a={name:"Set Model Map Location",timestamp:Date.now(),oldLatitude:m,newLatitude:l.location.lat(),oldLongitude:x,newLongitude:l.location.lng(),oldAddress:v,newAddress:t[0].formatted_address,undo:function(){d((function(e){e.modelsMapLatitude=a.oldLatitude,e.modelsMapLongitude=a.oldLongitude,e.modelsMapAddress=a.oldAddress}))},redo:function(){d((function(e){e.modelsMapLatitude=a.newLatitude,e.modelsMapLongitude=a.newLongitude,e.modelsMapAddress=a.newAddress}))}};p(a),d((function(e){l.location&&(e.modelsMapLatitude=l.location.lat(),e.modelsMapLongitude=l.location.lng()),e.modelsMapAddress=t[0].formatted_address}))}}},children:Object(gf.jsx)("input",{type:"text",placeholder:v,style:{boxSizing:"border-box",border:"1px solid transparent",width:"100%",height:"100%",fontSize:"14px",paddingLeft:"8px",paddingRight:"8px",outline:"none",textOverflow:"ellipses",position:"relative"}})})})}),E?Object(gf.jsx)(eD,{selectAuthor:function(e){D(e),Tf.setState((function(t){t.showLeaderboard||(t.leaderboardFlag=!0),e&&(O.current=j.current.get(e))}))},closeMap:N,openModel:a,deleteModel:o,likeModel:i,pinModel:n}):Object(gf.jsx)(Hv,{}),U&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{children:"Map cannot be loaded right now, sorry."})}),Object(gf.jsxs)(gf.Fragment,{children:[R&&Object(gf.jsx)(cD,{author:R,models:O.current,closeCallback:function(){D(void 0),O.current=void 0}}),A&&!R&&Object(gf.jsx)("div",{style:{position:"absolute",fontSize:"10px",color:"black",bottom:"33px",left:"5px",width:"180px",height:"360px",overflowY:"auto",padding:"6px 6px 6px 6px",background:"whitesmoke",boxShadow:"1px 1px 1px 1px gray",textAlign:"left"},children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(Y,{title:me.t("modelsMap.SearchByPublisher",k),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(S){j.current.clear();var t,l=Object(f.a)(S);try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];o.toLowerCase().includes(e.toLowerCase())&&j.current.set(o,i)}}catch(r){l.e(r)}finally{l.f()}C(!I)}}}),0===j.current.size?Object(gf.jsx)(UR.a,{image:UR.a.PRESENTED_IMAGE_SIMPLE}):Object(gf.jsx)("table",{children:Object(gf.jsx)("tbody",{children:Object(h.a)(j.current.keys()).sort((function(e,t){var l=j.current.get(e),a=j.current.get(t);return(a?a.size:0)-(l?l.size:0)})).map((function(e,t){if(t>50)return null;var l=j.current.get(e);return void 0===(null===l||void 0===l?void 0:l.size)||0===(null===l||void 0===l?void 0:l.size)?null:Object(gf.jsxs)("tr",{style:{width:"180px"},children:[Object(gf.jsx)("td",{style:{width:"150px"},children:Object(gf.jsx)(NR.a,{icon:Object(gf.jsx)(tD.a,{}),color:(null===l||void 0===l?void 0:l.size)>10?"gold":(null===l||void 0===l?void 0:l.size)>5?"lime":(null===l||void 0===l?void 0:l.size)>1?"blue":"magenta",style:{cursor:"pointer",fontSize:"10px",fontWeight:"bold",width:"130px"},onClick:function(){return D(e)},title:e,children:e.length>16?e.substring(0,15)+"...":e})}),Object(gf.jsx)("td",{children:null===l||void 0===l?void 0:l.size})]},t)}))})})]})}),Object(gf.jsx)(wv.b,{children:Object(gf.jsxs)("div",{title:me.t("modelsMap.TotalNumberOfUserPublishedModels",k)+": "+J,style:{position:"absolute",fontSize:"14px",color:"black",bottom:"6px",left:"5px",width:"180px",height:"25px",paddingTop:"2px",background:"whitesmoke",boxShadow:"1px 1px 1px 1px gray",cursor:"pointer",userSelect:"none"},onClick:function(){Tf.setState((function(e){e.showLeaderboard||(e.leaderboardFlag=!0),e.showLeaderboard=!e.showLeaderboard}))},children:[A?Object(gf.jsx)(lD.a,{title:me.t("word.Close",k),style:{marginRight:"8px"}}):Object(gf.jsx)(aD.a,{title:me.t("word.Open",k),style:{marginRight:"8px"}}),me.t("word.Leaderboard",k)]})}),T&&Object(gf.jsx)(wv.b,{children:Object(gf.jsxs)("div",{style:{position:"absolute",fontSize:"10px",color:"roadmap"===y?"black":"white",bottom:"6px",left:"188px",height:"25x",padding:"6px 6px 2px 6px",cursor:"pointer"},onClick:function(){d((function(e){T&&(e.modelsMapLatitude=T.latitude,e.modelsMapLongitude=T.longitude,e.modelsMapZoom=20)}))},children:[me.t("word.Latest",k)+": ",T.countryCode&&Object(gf.jsx)(QR.a,{countryCode:T.countryCode,style:{marginLeft:"2px",marginRight:"4px",width:"20px"},svg:!0}),T.title+", by "+T.author]})}),Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{style:{position:"absolute",fontSize:"medium",color:"black",cursor:"pointer",top:"-52px",right:c.uid?"60px":"100px",width:"64px",height:"28px",background:"orange",boxShadow:"1px 1px 1px 1px gray"},onMouseDown:function(){N()},children:me.t("word.Close",k)})}),V&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)(_v.a,{checked:b,style:{position:"absolute",fontSize:"medium",color:"black",cursor:"pointer",top:"-52px",right:"130px",width:"160px",height:"28px",background:"white",boxShadow:"1px 1px 1px 1px gray",paddingLeft:"4px"},onChange:function(){Tf.setState((function(e){e.modelsMapWeatherStations=!e.modelsMapWeatherStations}))},children:b?Object(gf.jsx)("span",{title:me.t("mapPanel.WeatherStationsNote",k),children:me.t("mapPanel.WeatherStations",k)}):Object(gf.jsx)("span",{children:me.t("mapPanel.WeatherStations",k)})})})]})]})},fD=n.a.memo(uD),hD=l(841),pD=l(570),yD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWADQTDJ/w9AAAAltJREFUWIXt1ktoVFccx/HP30xIZoJGgiDJorRZZtPFxWSrK3HhA0vA0oXLUPex62IXQqEWu1FBUSylVRe+qjvRRfFRke581hTbqqkIVq2gm+NiTmGYxJk78YWSA//NPef+v7/7f50bKSVvcy14q/R5AfMCXkZARIxGxJGI2BsRo29EQERUI2Kir6/vIg5juqurq4bDEXEsItZ0rCCl1NYwhC9xE39gsiiKwYb9QXyL+/gNk1hUyncb8Bh+wj1cwFp0tTi/GBtxFnfxHT7oSMD4+HgVG3Aat3EIY2W+pknMapzANI5heUsBRVEM5tBN4Xp/f/9WDHYKnkXIxzk993AJn2Jhw74RbM3gs/gMlZcFzyJkKTbnGrkSEVuwCJ7WarWEyVcNbSHmx0qlknANnlQqlX24il9ziHpfA3QhNuVivtLT0/NDb29vgkdIDXYNf+ELDL0C8IfYkQv6fBPrCfzX9PB/O4M/sQujcwAvz11wBydfwHgsq5htMyFVq9UD+BensKoNtIaJXO13sa2VbzzT5kCzTeFGTk9jK32UW+0GLpf0tR9PYWUuvtsDAwMHSr58AX/j61qttjOH+ZeS7x7MdXYUY43hG1OfWA9b5KzZHnZ3d18sefZcFr0dwzMmYYOQEXyFmxEx1WGKmu0b3MLv2FwUxZIZvBcVVL4TJtRbZxp7OgAfwgP1+2R9y8It2VIrcDyn5+c2Yf5HvXWXlfEdGVBqRcQIPse6DBpSnxXdqGI3vk8p3SntdC7TbXh4uF/95ryk3kGfpJRiLr46isDrWO/uX/G8gPdGwHPDy+8U7lOg5AAAAABJRU5ErkJggg==",gD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER0qAOBQywAAAilJREFUWIXt1s+LT2EUx/HXM77mh4YZopD8ygJTRlJWioXCiGTBko1YKFbsULJgYafxD1hYYWFhQ0SDRDZKVvwDQvk1HIv7TL70veZ+ry82c+punvuc83nf85x7nsOU/W+LiLYfdOMInmEM+9A1iU9L62oHNqXUSCkdyKINbMBWrMRYSml/SqnR8Qxk0H14iJPob7FnEKfwBIfQXSUDVcR34j7OY26F/f04oTieo+irBYBNuItRLKhRJxMgzzNIdQCsQOAMGnUKNcdZhZt40y7A2gwQeIn97YBgHi7iBtbg6p8AVAZBL47jHrY3rXcEoBQESfGXPFD8AY1f4nUU4FeQzbiFs5hVEu+vAEw8T7F4kpooBWirE5bY04h4Vde5DOBt3YCdAvj2vwH+mU0BlAEM4EMnBFJKhzFc9v6n4SGlNISFWIJj2IFtmFZDeASX8A67fwuQUlqvuEDmKMataYr2eg23Fd1upKLwOlxWXMcHI+JGXm8NkFIaxqIM8C1Dfc0gX/Ee1/EYGzNMK+FBxf2/BRci4lIl4IiQ57g9mIE+xfn3ZoDIUJ/y2gzsxfoc44piVNuDcxHRsu2WZSA1j0sppeU58KDiCALjWfgjevBFUbyLsQvzcRqjETFe+qVVAJo2b1IUYm8W7PEjG9MzwEw8wp2I+FwmXAsgO8xWZGNZXpr4+gG8wLWIqNyy2wZochzCaizF6yzcdo+oDZCd+9ATEeXDZU2AKfsOfE5h6rHXy3UAAAAASUVORK5CYII=",mD="data:image/png;base64,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",wD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWADcvCN3fsAAABFJJREFUWIXtl8uLHFUUxn/n1qufM2nHSTIZMhlHYxJDFAk+iEFQV7pRsxD8L8SNIi7Eta6CC4WASxdBJLiajUZX0UjA6LiY0UDUiTOZOGO/u7qqjouq6q4uG9IqOpscKGhO3fud757z3VOnRVXZTTO7Gv0OAcAe5xSRIpCKQwEfsAAn4w9UNUBEAEm3AopqNCkByYpQRA4AzwJ7gSyI1IAWRMUkmAMFbBM6lmUbjGUbcIwt/SCIfuv1rvdgCyhniEXAV6q6NpaAiBRL8GoHTit8ntk0DTwv8L3C10nWdMpx5npB8IJly7VyobwKUPQ8bTabJjTm4Xq73U1w3ATniMBNhTdVdXPAQFVJSCyU4BPgTOpL/AcrIudseDLrT96dBZ7L+6vwSlF4N7d2zoFlcjgDEdZgWqEAfJsr01JT1QqgN5I6EXfWdWvTrnskX9cGbPhKWUQKmYPeiOAXDx4QESv1Dwi04B7LdevAtRxe2YawBu2cXx3LCm1L94hI/jbVgRJwIOsM4RsDjwIzIwRExC7Csabvr6lqmAOrukJ3G34dia7aX+90VrY7/R39q+p/NjHhmZz/I7foVoC7U0d6DZ0WPAgsisg7mQ0R8FBbucuCt22RrgE8y6JaqVSBExZYc9XKiSjSzla7fSOCFrAYwinAE5GrxFcYwP+j4x+vwFFgJUugmLD6GNhgWJqmC4t9kBCuAL0QpB+G4vndex3hWKD0I7gVqvol27acIPDqUHdAAzgUxJry0oMCP4bwmIh8qqp+SuBQCB3grKr62ZyJyP0GrEj1XM5fqkFnG3Sz2XoPCJIDCYALJoQQeD+TAYAvCvB6B6aALZPQOq6wPia4KcB+F7q5WqKqbQWpOs480FLVrqo2VbWhqo0erANlVW2nPlVtcPLkpWZMbIk01Sau/5V8kCWo9qHQhZ38O4Ap29iOMfuS1Oat7sCMiOwfIX75cr8P35Xh9IBAUXgEuJRH+AlqVVtqZkwGAK4H0ervvV6D4fdhYBFsWFAsxRnK27ImBGyArnIYWBCRPQyF6QOLO4ECzIvIKeJGRRJQgIMuTPnwjIh0GNa6a+CoA3vr/f5TIuISCx1irdTCuB/E3wIR2QLOZ4DJBBoRV5K19HfaM7Iiy+5N8fKYAC+q6mzap9cyG/6vZ0VVB+m+SnxdwoSt2rZtXIPnWOJYnqcGg6hKp9HYbEfciuJrKwlYOitMYhFxX3gLhiU4DJxJgFKGds1htuIVqpFIGEaKRhFhEHYkCP0t5XEV0y05dkV9/2YEP0SAAQnik8j4+IPP/KqqfjAykPwdE5E3iNvuAnBRVS/8E5yxI9mYYPPA08A+YlFawBPAh8Rle0lE7iM+mSEuz0VVXbkteH6YGPcALwMXmFxg54HXJsGedCp2gMqEa0nWerddxYQlAL4kbiTLQJ/h3U4PkJ0hDHGZPpsEeGIRSjx+e4xvKnnF+2MGm39H4L+yXf9ndIfAn9qmRhuMvarQAAAAAElFTkSuQmCC",xD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobEDoWDDpSWAAAASVJREFUWIXtV9FOxCAQnIF+gIn+/xdq4ruW8UGIW1woePHQpJM0Rxd6M9ll6JaSsBJhKftfEEAAQVICAJJ3qYckZr6wPANbI/6AnJ18/wLgafK/nwE85nECIACvowLeM3mqYrMozyhf37A1JvZMThN7+wUBamVgz79WwK0ZcLHJP4n2ityKmsHeI5ckWv572xBobEK7oAeSGl1b1tex5efAJWC5AHcTzrjhVucMuWB2t7eeuVxwCfDwP98FJMt8AhBL+IwXzhu11Q+ckVuyUN3bcTejJDklwJBbEdGJ1ei2ZD+BbVhjHgcz55F7AuYyYAjqDAQnPiJgrQtIxuXnwKEEg/Yr9a+vOv3EV9pLCSKO3fWxKT2D44K69j0XAJ/nRvlKSgD0AUTKeVB6tWYNAAAAAElFTkSuQmCC",vD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQoxmfjAWgAAAT5JREFUWIXllzFLxEAQhb8nB8KJ2ggqNic2V1tZWIggCFr4E/0JltdobaPVCf4Caz1zhVg8mwTES9g9dkly+KqQzMx7mZnd2ZVtusRap+zAoHqQ1GoqbAt6kIHOBQwa3m/bnoWcJd0A2L6LIasrc20GYshLnADXkba1aMpALCbAKCVAb3tgAZJ2gUPg0/ZLqwIkjUvyb6DIRQ7LlWADeLU9zSkgtgQHwMR21r+PFmD7PjdxhX6ugnKHOweeA/5jYEdSiOcYeIgWUGIOvAcCF8Awwm7e9EHVgeT3Pl2NyhAknQEj27eR9gscnfdAdgGShpIuJB1JWm9VgKQ94AqYAfu2v0I+qdPwLzaBD6CInRe5BWwBU9tvsQ5ZBdh+WtZn5VfBJXCaEiC1BI+J/o2zYKlLSsQsaMTK90Ay9O9vxz/oeVnzXXquagAAAABJRU5ErkJggg==",bD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQkWF98m8gAAARlJREFUWIXtl80SwiAMhDeVq+PFF+c9PTjjtTVeQNOUlgT7c+nOdDJFQj63QCkxM7KIiAC8sZGYmXRbp4pPOmytThXfHSCoew1wxc8lDxyL62UFKDlwAfB0FNa61TqEZP+c8m93+B14QMyxWQDDQDJ6AEx5gZk5ucCFhCHFXrRZnMjj9Iu9MHVAA/QqejXUOgQASC6UAEoOrA8gILS9g4rbAQiIUVOKrdtzfRIuZicgli8Mo3Le8io3rNOtVdsHXCIit1OrOxBjRIzxOACvSM8vaWNamVw6SBQHU48g58t7nbPqHJAFrPPh8EdwApwAJ8DhAKaNqOUlsxpA3t0qx3fZ3wU7AtBFWv65kfOr0cdpy8nnX+mP0931AThFaqpKQ14AAAAAAElFTkSuQmCC",AD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQYhKPqfMgAAAytJREFUWIXd112IVVUUB/DfHitkkm57PDOOWdP0oBmFD41QCUkEvQSVaQVBzEP50JP10AcaQVlBiTBQ+FJQvQgZaNGHUlbTx6SNZn70pRZ9EPQ0zBRhNCDsHs65w+1253TuTCK4YcPl7rXW/7/X+a+1zgkpJadzdZxW9DOKQAhhTQhhSduOKaVZbVyHj3ACX+NJzK3sPwvgxb3d3a/ieE/3/ISVWIht+AqDp4QAOrEpxngEa/ESHm+yuR578CGu+d8I4G6M4lmswP3dWVfCfViGs5rs1+JbvIwLWsUMVfpACGEFHpaL9n30Yzkux9uYLH7PwS/YH2P8ZHx8fKTw35Bl2eqxsbFtKaXNmAItJRBC6MEjuAE/4y+ch/ewBVtjjM80AC3F1UV2lmJejPFXjExMTJzE7ThZPLJ30foRFDddF2P87cJFC5Nc3a/gDnQUNnNwaLrUFjaLcAs2YQeGF/RkaX7X+amId1krpxtxNMuNfscQrmxhtwz7ZiDgS7Cx0M5rjYdX1Gq13cXBD3JhZSXBBvF6mwQ68BCOYT3mQlar1Z7GBD7FqpRSqBBsCE+1AX4XDmN7jI6gs66/zb0LsoQ1bd5mF26rYHcVhrG3UH+Sd87+OoFOPIDvsFGFNloI8AAWl9j04kUcbQCu7z24OKWkI6X0Z1Gbk0UJjYYQBpWvfgT82OIshBDW42P8gUtb2HSoD8IGdR5oYjhsmjaKW/FOi/9X4yDebHHr+n60IN6VUvoHgUNNhveapo3iCTzXVJI7syz7vAQ44YsY41tYMuVbQqC+h+T62FCvDmzHTZgn74jH8WAJ8M4iwzf/K2sVCNT3G9iHVfIpt6WYiM+X+EyRm1asBYFzKxBI+KkIOCkvwzLbY3gBPaUVVRA4Rz7F/ovA/go2o/JhtbxSP2kQ0rX4rFar7S4JfrjkbAe+xJ1tNbQWpbSuIX3NINM9pu/x2MDAwNntgLckkFLS19cXGwRUloFvYoxbcVG7wKUEmup7V6H+JB9WCR9gBCtnClyJQFPnO9jT3ZWKrNwzW+D6rvROCCGEDvmr2UhK6UQlpypxqxI4VevM+Tac6fobdX01Hh9CX7YAAAAASUVORK5CYII=",TD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQMlUuCvbgAAAxBJREFUWIXN10tonFUUB/DfF6KmPjredCIm6hSnRUix+MhOxI0oqMXGlbrwgdD4oOCrGx8gIi4EoVSFooggSsGiTUHFUBFtm7a0xRYtmtZWFxFEFBx0Ud3IdfHdiR/TmclkJhgvnMXcuef8//c875fFGC3l6ltS9P8Dgf7FMpRl2d0YxB+IOB1j3DGvYoyxJ8HtOIRJvIa/yitCxCm8h/62+j0ArwkhfISDuBFX4wPsxDXy8L6LY7h00QhgObZgBg9Vq9VKuvk32NDk/NP4GTf0TACPJOAtuAwbcRwv4/w2euvxKx7sikBy8QF8XK2GtbgpxX0nrujQxih+wKsdE6hUStWLh4a24wjWJSM7EvgtXYTvAuzGLixrSQADeB6HsQmX4IXk/se6TdyC/VewH6uytFGs53E8jtMhhN21Wm0lxrEHD8cYf5uvtOdbWZYtw0/4pK+weVWWZVMjwxdNlkqltTi7VquNyctsO2Z7Bc+yrD/LsmfxvTyRN0AZm1Pz+Ftey/dgpOCyy+XuP6cHt9+Jo6VS6VOcKOzbN1QejLh/YmLirDYGpkMIt3UBfG0CPSxv0RFfYjDGSKVSquItfIH1bQw9hW0LAC6Xy+XX8V0BuC5fzRGoH8ZsiveuyvDwWBODK1MYBjoAfzIBb20CHuXteUWRwJrkpvqBE3gDQw2G92C8DfC65N6pFsB1mcV5RQKjmG44tDXdYlMB4Am83wR4FB8m17YDPiRvQlfO6dYNhGBvC6WpdKtb5Q3qKM5NesuxGSfxTBvgyRDC17jrDPIdEKjLEbwpn3p34F75IHp7Hr2TeG5sbKxphc3lAD6fx1DE7/gFfzbkTDOZkb8HWr4FigRWy2f2fAQ+6+DMdAhhbwjh+o7KNRHow6PyZ1Q74/vb/LcN3+KBBTWqhmweSTGdaQGyr8X+KbxUT86uCRSIXCef2403PtDw+5h8dqxeKHBbAgUi96Wsf8e/JRlTAh7Ezd0Cd0QgkRjAi/hRPi2PY2OvwB0TKBBZVRkensCFiwUeY3TGi+i/Xkv+bbjkBP4BGjWpnBddssUAAAAASUVORK5CYII=",PD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQMUAz6vVAAAA6FJREFUWIXF11uIlVUUB/DfV2ppytcevxm1wQknshyYhzzRS0USmCEVXZiSii5QUT4kpBQE2kWCQKGwfMikAiWxh0KsNDLSbiaZZqFpoz0MSQ8ph+ohssvu4ewjx/GcOWfGgRZ8D3ux1/r/93+tffmyGKP/08aMdsIsy87HWPwaYzzRdP5oKZBl2Xgsxa34A7/jL5yLHTHGJ+vFnTVK4PdhD2ZiHkp4DVeEEP7FvCzLVtcNjjGO+MOV+AS7MCf5JuN17MO9yXcO+vM8f/60HCME7sQ69IcQHqnxL8OPeBGTBsW04Wie50+MmIBK01ZBVmFMjFFn59Q+fIfNmDVE/HQcrSozLAK4I4G8h4tjjEIIvfgo1f+GFvNc19E+OeKylghgNrZhL+Yn33l4FYexeBjqPVUUxW58jZVDEkA71iS5l9T4FyfgNSiGqd5mzMDlRVHsbkgAS/I8P4K1mJh887E3z/MPMbsV4K6uaaWk3iklwgQcQMdg4GuxIzHtSb6LQgjvphXc3uKK25uVCFtxY3UwERumdBQx7eFLcQGeTUmWVTu+BfAlOFwUxStDlQiPY2V18LTK0bkO72AnBnC8VOrOWwS+KTXqtlZKhGswUB38jLcRB33fNOty9IygRA+EEL7FcuhJ0m+oQyDiFywcnKS7uzvHqtSsS/v6+s5uAXg+vmwv2iIeTj4vpYNhfQMCEb+FEO6sSbQQP6SSdbYAfAk2YX/Ktx4LYozGYPqfJ/7e1tXVOW5g4KgGNqlcLr+Q7voFIYSsXC7fH2P8vFEAZFk2UaWRb1bZ/1X7B+OhyvA2bBlCgYg4dUoR8WArdZ42rXgIh/BmnVwHcPfJgwj34P1mBFQeGjOayD1HZRd90SDHIazp7g75sAl0tLdFLGoAfCE2JoB68TvxGa6ujRveiygSQphb68qybFyWZcvxMX5SeRXV2luJ1NoY41Uxxk9PzZkUSHu5WQmO43DNqu9S6exNdeY+p3KRrSiVShMalaz6Kh5bLpdDCxocRMyy7DHMLYqi/dixYz3oGTTve8zCvBhj/5AZ00pmpZNp41AKpJvwGZXDqd6c7fgqATfdKSebMMaoVDIBK5JsjUjsaeB/A/14tFXg0wjU1HWmyoW0vw7QvjqqHMHLXV1dYbjgdQnUELk+ybm9BnDXIDJbQwi9IwFuSqCGyKLUVFtSeT5QuXZvORPglgnEGPX29gasxsH0rs9GAzzGOHr/hiO1Ufk3PBP7DxjivGJEQcD3AAAAAElFTkSuQmCC",SD="data:image/png;base64,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",jD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQQBIaLdeAAAAwhJREFUWIXF10tonFUUB/DfrdQXhI8bJ9pRHHTQGhQpcUCjhIKVCMWFC1sURMG6sAtdVJeCioiUIq1SF9qNzyKKtaK1vqoWQ7UVFUOVam3ioiLYgqGCSN1cF3NHQjLJPCUXDgxn7rn//znnnnPPF1JKlnItW1L0/5tACGEghLAmhHDZgnv6mYIQwkpciytxHcZwGidwTUrpz3lGKaWeBevwJfbjNRy/4PxSwg4M4Sl82NS2R+ARfIQDWI3xGOMe7K5UyrU5ew9jU18I4Dw8hyO4p1qtVkql0vMZZEMzm0qlUsWpGOPVPRHAg/gJW3AhNuEottRqtXNb2G7AsfXr15/RMYEY4y2lUulr7MYw1uIbvIXLO3BgF15om0AGeyeDj+OqnOevcHMXETwHv2LdogQwgG053PfjImzFj3igx8s7ipMxxqJpIwohbMweLsdN5XLpH3yCMzGaUtrezK7dlVI6iB0zMzMfzGV2Pd7PeR3BDTiIvXNvb48RuDM7uL2hKKs3jb9ijHuKoticPf4Fa/sIvAYHhkqDCbdmnUdwejAWCd/jlay7Fz9jsA/Al64YGnoDP+Au9Y55RYPAM3ganyHNkYcw2QPw2XiyKIqpHNXGuZ9j5L8qwKqiKD5uQiBhH7Z2AX539vjNJmfOI7A657wZgYSTGO+gxPbj0CLnHS6X629FuwQSTlSr1WIR4DJeUu8bi52zV/3xGkwpdTSQ7Jyenn55rjKEsCyE8DAmcAorF7B/FlOYSCmNpZT+QEcRSLl8Ns7y+jZM4r0WtkfxIlbMi1wnBPAbfsfteBfftth/SP0+jC6YulkN4tM2CDT2HG+xb5dc8y0vbSYwnL1rRWBysf+LothcFMUUnsBZbVXNrHyuwr787HZD4AhexyUd9Ysm5XSH+mj1djsEYowT6gPpjV11y2bKWq22HI/hmPpE2wD8btbvV9Vr/r5uW/WCBGZF4+IY484ckUfVR7DHc1ltw0Av4C0JNCTGOIYv8HdOzXCvwB0RaEilUqn2C7ghff0062Yt+dfxv1vGFje17OpaAAAAAElFTkSuQmCC",HD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFBk6Z52WNQAABWNJREFUWIW1l31IG2ccx5+c5/WSe/Jc7vLSnNE79WxMGguCUep0otGM+dZNFKa0oER0TWVQxt4obAtjwkq6QVs2EGX/DWbf1iFrOzoQBvpXRwtrKayKTNFtrHS+JBiN3m//zOI0iYltf/D883x/v+f7eZ57nnvustA+oqWlJY/juGMrKys98Xi8KTc391VVVaXu7u5/JiYmlvYzZloRDAYLZFm+xnEcCIIAoiiuqqq6LAhCzGw2gyAIkJ+f//358+fdz928paWlhhCy8p/J552dnWUAoAcAWtM0QzAY9Lrd7gs8z4PFYolVVlb6npt5e3t7GSFkjWXZ33p6erypcjs7O4+IojjDcRzslZtWAABlt9sfmkymWENDQ146NeFwWOZ5fkmW5UeaprHPBFBRUdHJMAxUVVX1Z1JXW1sbIIRATU1N1zMBWK3WnwRBWAQAOpM6TdNYQRAeOxyO8VR5VCqxr6+PXlpa8hqNxh91Ot1GJgAURcV4nh+PRCIVo6OjSR9DSgCWZU0URRlVVX2SiflWLC4u3tHr9QaMcdK9kxLg4sWLjxFCm9FoVLcfALPZLK6trWnLy8urGRe3t7dXezyeqzRNQ3Fx8c/7AZBleVwQhPmMigCAUlX1S4wxWCwWUBTlu9bW1r5k+fX19V1dXV1VO/sHBwdtHMcBxni1vLz8/cnJSSEtgKKioisMw8Dhw4dHRkZG5GR5Q0NDeQ6H49tkR21gYEDKz8+/YLFYHvA8Dzab7c/GxsaXUpofPXr0HY7jwOPxhFLldXR01DkcjoXs7GxwOp3fAEDSPQIAqLW19RjGeA5jvHr8+PHEb8fR0VFBFMWoJEmTqcyHhobMdrv9CUIIbDbbdLrvh0AgIBkMhseSJE0BwO7NX11d3aHX68HlcjWkGigYDB7BGANCCIqKiq6lY74VpaWlXXq9Hjwezyu7REVRPjOZTBAOh617DYQxfogQApPJ9Pv22bS1tb1eUlJyye/3f5Co7u7duzzP82uKogwn0sOSJIGmaf/brc3NzeV2u/0Lr9cbdrlc/lOnTlWYzeZphBBQFAWqqt4qLi7+2Gq13mFZFjiOg4aGhreTwVMUNe3xeCZ2CYWFhR+xLAter/fg9n6fz/eJXq8HhBDQNA2EEKAoChBCT5tOpwOEEBiNRvD5fG8mM0cIIYZh/sjLy7u6S/D7/S8bDAZwuVy92/vHx8e5ysrKECHkr+2mOxshJN7R0fFGKvPTp0+XEULA4XC8tUsEANpkMj0SRXE+0R3e29trU1X1q63V2Nlyc3NvpTJHCCFVVccNBsNaW1ubPWFCU1PTMYwxyLJ8JdnxcjqdJ7OysnYBsCx74dy5c7nXr1/HiSYniuKnDMOA2+1+NyVlWVnZexhjyMnJ+bWxsbF5cnLy6WoMDw/bzpw5k0PT9NJOALPZPBYIBF6z2WzzpaWlH544caKutra2oqSkZEBRlCmDwQAFBQVf7bVKCCGE/H5/gBDyN8/zwLLsiqIojwghU7Isz/b397cxDLOWAGD65s2bTlmW7xmNxq2vZjAajZCTk7NQV1d3MpFXwmW+ffv212fPnr1048aN7rm5uZqFhQU7IQQxDPPD/Pw8RggxO2vi8bgyNjYWm52dLfX5fO6ZmRm3JEm0JElzly9f/oWiqPW0Zr9XFBYWDm4du+0tOzsbvF5vfabjpfwgSRTRaPQQAOzq39zcRLFYLOMfkowAAABFo9HiRJqmaWhjY8PzQgFCodBBnU53KJm+urpa9EIB7t+/X6hpmj6ZHolE8hJetc8LIBKJOOPxeFJ9fX1dCYVCe96m2yMrQ4Dg8vJyqv89+sCBAw+mpqbupTvmv5uD6p7Um9wSAAAAAElFTkSuQmCC",zD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFCUJq76O3AAAA0VJREFUWIWt1ltoHVUUBuBvmtZgqx4iREyNaZmgIkUtjjcERTHqQxBESaHpgyg6SoWCvotiwRdBQauoVaRCEY76YMEb1qg0Fqs51lhbW6UFLyB9KCoU8cG6fZiJDumZS05zYHFm9l7rX//MXutfE4UQ9PqLomgjToQQXuwZo0cCK6Ioegt/YTmOhRAmsWCwJb1kj6LoNdmT3x5CuAWrR0dHn+gFSwhhQYYrsa+41m63z8VRXLhgvIaOEVbiPHyE+7oQexzbcp+hEMKSRSHQbrdPj+N4Fz7BThzHDlxbSL4+3zua/0/jlUUhgHXYPTExcZqsZoZHR0dTfIGX8AZ2J0ly7+Tk5EDucxa+KpI8FQKv4+4u66viOA5JkmwviXsKj9ThN+mCfhzpsr55YGBg28zMzIaSuEO4rA58aQMCJxAVF6IoWovLO53OpRVxfydJcmYdeJM3sALnz1t7GDtCCP9UxF3c6XQOLAaB93BH4X4pLsE7NXFr8X4tel2RxHHcwqEkSUZCCJIkaeFTLK8o3JtkYrVsUYQIG/F9Lkh9cRx/g+ES37PxK+5cFB2Ys8HBwTZ2TkxMnCFTw1u7tSaOJEnyfFPcxgTyBC8MDQ3N4Gs8jShN02W4Ir//DpsWghmFEERR9GjO/hh2YSqEcLxbzURRdDUeyJP+6f9W/gGPhRAOlsQN40ZcL2vr2RDCs3KA/bJZHmQ6/6VMyVaXMU/TdHkhpnTw4AJsxZ6Cf+jv7/8t39eHTnEzt1dHRkYO48EK8JA1Uun+5rwg52MHvP1fDeCDEqeQM38zTdOTWqqMQJqmQ5hqtVofVuA+WSRwDz6rcN6Sn/E5dQRwDQ5WYM3ZzUUCK/BtTcAz+KVIYj4BrJF9E9Qlnz6pDfGQTOGqAp/Dx90IYGWr1TrcIHnAbd10oE/W33XBU9jahcDnDZPvLRUi3ICfG4Ds70JgT4O4P8bHx+NKJZSJzE8NwNaUXJfZEaxrJMXYEsfxjzWAsyXX3Wwf1i9oFmBLLkRNzrXKDmBDaZ6qQYG74jj+vdfk+QNUjuUmE/Aq7JV9ATVNPot3saoWv86h+Dbkk7Ii8bRskHU971MiUCByHTbh5bnEY2Nj23E/Lloo3r/a0/48nkGnegAAAABJRU5ErkJggg==",RD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goTEAwh+C9OzQAAAjFJREFUWIW917uLVUkQwOGvro+Z8YWMiijoKOwuDBqqmBkIJiKmCj4wMjA10P/ARFhkg40WMzERRNhkzYwUBRF2BVF2faGOjI9h3BVfZdBH5qpzZ+2Ddwqae7qqT51fd1dX143M1EYiYhRHsBQ/Z+bVVo4ys7phAGeRTTuP4Ta+Oq2o2YBbXf2L2NXGUVuANXjc1T+FH2cTYBS/fKGbOysAEdHBT9OY1kRENUSbFdiBh9Pof8eZiBiu8tbiBJwwFf1ftsM42u9TMDiD7VesrnFWBRARQ4j/GVYVB7VBsxKve9iO4TnWRsRQZv7XD4Al6OV4M/7FGBbPMO4zqY2BzgzvDGK8+fhkjcMaWajMcjrZqVxMlzOz15ivpHYLVuB+D9txDGbmbzUOawGGsL2HbWNm7qv0V70Fz3Coh+1B7cfbAIxE9EwDA7MBcCkzP+BA0z/dZYuYge67AGTmTezFD41qN/Z/AsC8vgI0cgGLmufrpgqRD1psQzVAk2I/zfRGF8A7JQn1F6CRf5rf27jXPD9ReRPSsoxSjuNejOAcXuEvbEVVed52BcaUwnR+Zl5RZv7SVHD2HeAuFqATEXOUsnwTXtSWZG0BniiBOEe5H/5QaoX3WDcbAOPNu8PoZOYE3iqnYFXfAbJUpwPKrCca9Z/YoqxKfwEiYo9Smk1iWaO+gTem/8/w/QAiYhtOKkv9FC8a04SSE9ZHxDdnxDZ54BoO4u/MvNOlf6TUgcuVtPxN8hEQKBHAR+nvnAAAAABJRU5ErkJggg==",DD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gIBAAwD+wl4jAAAAs9JREFUWIXFlz1oFFEQx39vd8/Lqudyhoty8QgshOSuyHqaGMNCDmMaQcTGUoiFhY02dn4U2lloJQTBRrCwMyIoghaKkELwAwmChYUKFoIBJfErGYt9F4/19nY3F3MDU+27+f1n5r1575SI0EkzOkoHrLUMppQyAA/YD0wA20Rk938VoJQa1LC65xs+LymlbBFZjAwgIqkcKAFTwA3gAyAxPtkyXgJgATgCTANvEwDDfj2VACAHHAQuAy9WAQz7IlDUVSu3FACcAX6vAXTFe3t7pVqtLup2HQdUIzO8CfcAZuSGSWG2bVOpVDAMg7m5uS7gNfD5n4WhCjxpN2OllPT19UmtVpNSqSRKqfq3X8A5gtmjolrwoB14LpeTkZERqVarYtt2szXfgQOtBFxbDdgwDHFdV2q1mhSLxbj1S8AFoKuZgKm0cMdxZGxsTIaGhiSTyaT57e1mArYCC0kCmKYpAwMD4vu+FAqFtFW7BeSi5kBsG7q7u8X3fSmXy2JZVhrwT+Bk5B7QArYDX5sFsCxLKpWK+L4v+Xw+bdbvgb2E5kDU+D0WDtDT0yPj4+PS398vhmGkhd8jGOkqqQAFPAMkm82K53kyOjoqjuOkBS8RnH2T0Plv1QKl/Skw63meuK7bOFCS+idgMgocJ8AAZnTPbqYEC/CY4NpuCV8RoJXmGrI3gTsEd8Nm4KIuZxL4JWBDHDgs4CPwDtgXIWALcJ7gGEWBvwCH61knFVB/lO4EXgIPgSuAzV/zdDsmgEPAVV2NRnsODAMzIrIs2khiof4fBeaBN8AscB94pcGbgI1a3DBwV2c+DXQlzTjJJtxBcCsuA490+bPaNwAZgsesQbDRVgVOcgpOAN90a3ZpqEXDmW4XHjeIFOASPFJ+AGe1gLahsQJCQkzgNMFjYhYYXDcBITGDBON5ATi17gK0CItgts8DzloIUDpwx6zj/47/AFtaIekeNV/aAAAAAElFTkSuQmCC",MD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUARIGCVc1hwAABJBJREFUWIXFl12IG1UUx//n3kzcTbe72Q2FDVZyJ8lSilosUn1QKxV9KOqDfRE/wAe1H1SUQqVULCgU9UVUUPxo/QCxglpRXwRFsYXWIlppEdt1JzNJdjfWqrXbmm2SmXuPDzZLus0k01TphUDm3v85/1/ux5kbYmZcyiYuqTuA2MUmsG17iZRyKQCjta55nvfFhcRTr0uQy+VuAHAHEZEx5gciqgBYw8xHXNfd+b8BpNPpRYlE4in8+4tfKRaLR1vHx8bGuNFoXFsqlQ5GyddxCZRSy+Px+I21Wm13uVyuKKVWJRKJdcy823XdD8PiLMt6EsCaKAChM5DNZpcJITZJKb/TWiut9S4iWl+v15+Znp6eDAFWlmV5AOA4Th8z17sBdDoFVzPzsfHx8VcBDBhjTrmuuyHMHACEEOub30dHR0e7mQMdZiCZTA6nUqlHhBCLADzIzAeYeS8R/cnMbhAEP5ZKpV+b+lQqNTgyMjLTfK5Wq5lKpVLuBhC6B06ePPlXLpf7PAiC34UQwwCuZOaDWuvT8Xh8ie/7xwHMAQwNDT3dGm+MiVRjQmfAtu2VUsoNhULhAaXUOiHEFIC7gyDYWiqVvFZtJpO5JR6Pf9Xa5zjOAmae7QbQljKZTA4LITbXarXHmbkhhPgbQCMIgq2xWOy1bDa7oqlVSqn55saYj6KYhwKMjIxsYeZ3p6ampgAgCILDxpirSqWSZ4x5FEAfABCR1dz189r7UcyBNkuglFrelxjYcPTnn9bOiYj6lFIZz/PGW/qsXC73KRGtnp/UcRyLmYMoAOdtwlgstqZR819u7WPmGoD55p+0M/d9f3VU8/MAlFJKSpl03fHDYQFKKZXP59tNexMudKxdO2cPENESZj4UJs5ms3eGrDkAoF6vrxBCbLwYgMUAfpsvymQy6Vwu94aU8rOwRL7vLy2Xy98DaNi2fXNPAMaY/US0Kp1OLyKiftu2r8/n88/F4/GKEOLhkBzfAECj0fgDALTWb0op7+0JoFgsHmHmfQMDA8fz+fxsLBY7QERbwoKZea3jOLcaY/ZalrWwmcMYM2Pb9soLBgAA13V312q1xQCe7WC83XGcfsdxdjCzBtBPRHPn2RjzthDi/p4AAGBycnJ6YmLiiYmJCapWqwuaHzOkksaY9wqFwvazRxNEFANwTjEpFotHAMxE2Qtd74SVSmWupNq2vVkIsS/Ke94Ys5OINgHY00kX+VacWbZsWEp5m+u670TRe543TkSnu81CZIDLAjwGiG+Z+UzUGK31W1LKey4aYHBwMOUH+rqCfc0LUc2BuVNlOp2ISADpy6/YCH92D3/5wUx39bnNGPO6lPK+ngGUUqOsg1XBiRM7LtQcADzPO8TMp7LZ7E09AZCUDwWBv3NyZuZEu/Gzbz6ttT4VlkNr/TwR3dU2f+t9gIiEbdu3CyESWmsQkUVW/zYNepEa1bYAQggJ4CUA240xx0I0PoBtAD42xvwCAFJKVKvVr+cDSNu210spFxpjwMxERGeMMTEhRKeaMQugHwCFCc7Wjr5mxRRCoFqt7ur5v+F/1f4BnoQqMI+v2mkAAAAASUVORK5CYII=",WD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER8TbdO6QQAAAfZJREFUWIXt1k+ITWEYx/HPmaGxkIgaFmOhGyUmipomUSxnYSMb+bNkZcUOM5JITRaUiMyWMlnY2NgoMorF+LMYFpSFiJjGn6Z5LM69da5778y5f2YszK+eOp33Oe/313Pe531f5vWPlZQeImJ2AElSQH+KiP2Z9+WJEdHSQAE3MYkoRk9mfHYM1ACX4hmSWTGAHgzXAGfjQEsNYDWu5ACX4gMWN20gA/6dE5yNsw0bwCpcxK8GwKW4V7eBDPhHE+CP6KtrDbQIPIWHOJ27DbEC5zDeBPg7TmAvJjCSy4B0h3zXBHgSl7ES+zCGS+iqpwKHG4QPYx224QnuoFBl/hkNtONlHeDHRega3MZT7JhmbU1voJh0PQd4DHuwDBfwFgfRNkNXgbZKK2V6j0c1xj7jKLrRKd3nx7EhIoYiYmqGuXMZgFvS1VzST2l3FPAGI9iC3ogYiIiJPOBqWlqlTP04hGPSXh5CFzbiPh5gc4NnSIU+4QaWVDHQJv3HnbiKV9jd6AFWaw30Yj1GkyTZ+Ze5DhyRttULdEfE3fqLXKmyK1mSJO04jlO4hm9Yjl3SA2QgIr60BDzdlUz6j5/jq7Sf1zZT7ob2ASzEGemxex4dc2ogk7gVrzGKTXNuoJi8CIPFapzEgjk1kPlou3Sr7Wu5gXn9t/oDDAKDtnkUp4wAAAAASUVORK5CYII=",ID="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUASQD8CFQfQAAA7ZJREFUWIXVl01oHGUcxp/nnZ01pmm2YePiR5MMM3MpRWyVCjZVexAjVQ+2vQQ8KH6AFtHgQfCjnioUrehFRTyoWPGgEaqIKPXQFi2lkCrW0mZ2N67ko9USwSSrOzvv48GkpDHZbL5a+hzn/+f/+83Ly/vOUBIuZ8xlpV+RAp7n3RaG4WaSVy2HAOvdAyQbwzB8B8B6SWMkV0k6I6mvWq0eLJVKJyTZFRHwff/WVCq131r7I8kd02uS3iW5GYAAnJB0yFp7qFAonFkWgTAMnzfGPCFpbT0DJfWS9CRVAZyy1n4r6UixWPx1QQK5XO7aTCbzsSRD8s564LPI7CXZCSAH4Jy19ijJwxMTE98PDQ39MadAEATbjTFvSPqA5IuLgc8Wa+0+kjeSvN4Y01+pVPZeJEDSCcPwLQBdADqWCzxHdltruy8IeJ63IZVK7QdwauZGW4lI6pe0m5Lg+/6TqVTqZUm5lQZPpmytfTafz7+dCoLgVcdxbrmE8D+TJHmqUCh8BPx3Em6TdORSkCX9Za3dMQUHAFOtVu83xvgATgL4ZCXA1to9kobjON6az+e/m167sAnb2trChoaGh0g+ICkGcNMywfeRfLBcLm8aHBz8bWb9f+cAybTv+/cZYx4BsBbAUQCPLwYu6X0A68fHx+8dHh7+fbaemkex53nrXNd9FMBdAIYA3LMA+OcA2vL5fKekylx9dV1Gk6uyc3JVPEkHSD5TA35cUqFQKHTPd0PWfR1PpaOj47p0Or2L5GOSDgLongH/CcAvURR1zz5hEQKtra2rm5ubu4wxnSRvIHl1kiStxphW13XDOI7PWWsPGGO2SvoyiqKeel+opkAul2vKZDKvkNwiaVTSz5L6kiQ56zjOwyQdAB9KajHGdALYCOAfSV9FUbRnSQLt7e1BOp3+BsDXlUrl9VKplJ9eD4LgC5Jroii6ffpzz/M2uq77kqTc2NhY18jIyHgtgTm/CV3XfVNSbxRFu2bCAYBkAcBJkhfNGBgY6Ovv798uabSxsfG5WnAASNWoXQPg07mKURQ9XWuwpCGS2UULVKvVHtd1PwvDMBVF0XvzDZpKNpttbmlpecEYc3e5XL5jvv6am9D3/U2O47wGoAHAMUmHkyQ5HcfxecdxEgCI49hNp9NZx3HWkdxG8mYAxycmJnoGBwfPL0lgKkEQbCG5E8AGSatJupLWAADJs5NtwwB+SJKkt1gsnp536EIEZiabzTY3NTWtAoBSqTQq6e8FD1mKwHLmyvs3XO78C2h74kwpj5OrAAAAAElFTkSuQmCC",CD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsBFjkGPOnzBgAAA+hJREFUWIWtll1oHFUYhp/VzZrsJhs3ZDc/m2yWyQ8lP93Ek5BWNz9oWmJKvDBMBEHTi7oSRVsRQi4KXgm5qESwCImBgqjIBEFQkYJpQRRFF4R64UVxFO1VbhYiCRIpnxc5W4ZNdnamzYEDs+d8837PvOc7Zw8igteulBoFLgNSpl9eXFxUfjS9BcGIUup6MZFS6k2gCYiICD09PSPxePw1J0xVVdXQcQAEgCcdwu0l88Hx8fGrwBzwqIYdc8SPVAJ4CJcWDAafBbaARREJiMjfzvnl5eVIU1PTTHNz85VUKnWno6PjZ9M0q0UkpkN+Gh4eHnXLUZbMNM3TkUhkG3jFg5UB4FR/f//nk5OTkslkPtFuCCCmaSZ9LQFQDUg0Gv3GT0Fp8HPT09OilPqgqFNfX3/VL8AQIAsLC74q2gHxTCKR+Bc4kcvlLmgnjnThSIG6urr3lFJf3k9yx0cMA00iEtQ7Z8ETgGVZtZp45kEASmAu1dbWXj9qLlhalEtLS50A6XQ6u76+HnKtYI8tkUi07u3txQOBQJ2I/OO6C4B+yp90D9Tz+fxjpfkCOum9Nj8/P7i5ufmLUupioVC4WRy3bfuWYRgnnbG2bd8CcI7bti3Ar4ZhnCwUCsRiMWzbPgtc4eAgu+PqgGVZSU085XDlzEHoIbek3Hgqlbr3vmEYzwNf+dkFW9Fo9F2H4AWvAGtra516/AVnXF9fn3eA3t7etwCxLCuuBWa1aEclAOBxDk6/Xv07AUg2m53yDDA1NVWvRd7RX1UFSEtLy6VKAG1tbdecY/pEPOSeK4CIUFNT8wYHB8gJEaGhoeGjSCTyrRsAUJ1MJm3goohgmuYZrZH1DeBMAKSDweBYd3f3XWCoHEAmk3l1YmJCgDTQBcjAwMCKa44KAG3OJEqp39rb2zfKADyslLphGMb7JXPR+wbQQq1a7BTwoi7OhlKAlZWV1OzsrAAzSqnXAcnlci0V9SsFFBMppT6Ox+NPOHeDEwBIx2KxP0OhUDcgkUjkbS/arjeiYlNKnb99+3bn9vb293qoszQmFArNNzY2/re1tXUXYHd39wcv2p4AYrHY7zs7O6Mvr6+fBchms8+Vxuzv7/cNDg7+NTY21g1gmmbei7anJXAsw48c2P4FMKmfPwSe0s8bgCSTyU8963pMHsfHv14ikfgaaD1OgDlANjY2pFLs6upq8SJ6+tgAcrlcfTgc/syrA9Fo9NqxLoF24RwuZ7qzVoA5r7qHrmQu7RGAQCAglQKVUn94VvVKms/nw+Fw+GngZjnru7q6vgMmvWr6WoLSgixjfb9vPb8vWJYVAl46woHzfrVEhP8BzTbP9sQqXZUAAAAASUVORK5CYII=",OD=function(e){var t=Object.assign({},e);return Object(gf.jsx)("div",{style:{verticalAlign:"top",display:"inline-block",marginTop:"4px",marginRight:"8px"},children:t.children})},FD=function(){var e=Ew(si),t=Tf(yf),l=Ew(Gi),a=Ew.getState().elements,n=Ew(Vi),c=Ew(rs),s=Ew(ss),d=Ew(o.showHeliodonPanel),f=Ew(i.noAnimationForHeatmapSimulation),p=Tf(Ns),y=Ew(zr),g=Ew(cs),m=Ew(Cu),w=Ew(Fu),x=Ew(Yu),v=Ew(Bu),b=Ew(Ku),A=Ew(Sr),T=Tf(Lr),P=Tf(Er),S=Ew(Gu),j=Object(r.useState)(V.Foundation),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)(V.Wall),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useState)(V.SolarPanel),O=Object(u.a)(C,2),F=O[0],k=O[1],Y=Object(r.useMemo)((function(){return{lng:n}}),[n]),L="invert(41%) sepia(0%) saturate(0%) hue-rotate(224deg) brightness(93%) contrast(81%)",E="invert(93%) sepia(3%) saturate(1955%) hue-rotate(26deg) brightness(113%) contrast(96%)",U=function(){e((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.actionModeLock=!1}))},N=function(t){e((function(e){e.objectTypeToAdd=t,e.groupActionMode=!1,e.actionModeLock=!1})),Et.getState().setEnableOrbitController(!1),c()},J=function(e,t,l,a){var o=e.charAt(0).toLowerCase()+e.slice(1).replace(/\s+/g,"");return Object(gf.jsxs)(Qv.a.Item,{style:{userSelect:"none"},onClick:function(){l(e),N(e)},children:[Object(gf.jsx)("img",{alt:e,src:t,height:36,width:36,style:{filter:L,verticalAlign:"middle",marginRight:"10px"}}),me.t("toolbar.SwitchToAdding".concat(null!==a&&void 0!==a?a:e.replaceAll(" ","")),Y)]},"add-".concat(o,"-menu-item"))},G=function(t,l,a,o){var i=function(e){switch(e){case V.Human:case V.Tree:case V.Flower:case V.Sensor:case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:case V.WindTurbine:case V.Light:case V.Wall:case V.Window:return!0;default:return!1}}(t);return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{title:me.t("toolbar.Add".concat(null!==o&&void 0!==o?o:t.replaceAll(" ","")),Y)+(i?"\n"+(s?me.t("toolbar.ClickToUnlockThisModeForNextAction",Y):me.t("toolbar.DoubleClickToLockThisModeForNextAction",Y)):""),alt:t,src:l,height:36,width:36,style:{filter:g===t||a?E:L,cursor:"pointer",verticalAlign:"middle"},onClick:function(){N(t)},onDoubleClick:function(){i&&e((function(e){e.actionModeLock=!0}))}}),(g===t||a)&&i&&s&&Object(gf.jsx)("img",{alt:"Tiny lock",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAJCAYAAAARml2dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobECQ3lBJ92QAAANlJREFUCJkFwT1OhEAUAOA3M28SgQIJyQYC2dYrUHgJCzuzhZ2VHmNba63MVpQbb0DlBbCwoTIUkBAdTJif9/w+xczQdd1tXddvWZY9lWV5MY7jh+r7Xg3DcJzn+WStfRdCHLTWZ9m2LRHRFkL4TJKkB4A/RCRsmuZmXddr59x+miYnpbwqiuIejTF33vsdIu6EEGCtBWPMgwwhSET8yfP8saqqQxRF3957QmYGAKBt21Zm/gUAYmaBSilyzl0uy/IKAEBEkKbpF8Zx/MLMeyFEAgDMzE5r/fwPyUVuAeqNzhQAAAAASUVORK5CYII=",style:{marginLeft:"-2px",filter:g===t||a?E:L,verticalAlign:"top"}})]})},X=function(e){return Object(gf.jsx)(lb.a,{overlay:e,trigger:["click"],children:Object(gf.jsx)("span",{title:me.t("toolbar.ClickForMoreButtons",Y),style:{cursor:"pointer",verticalAlign:"middle",fontSize:"10px",marginLeft:"4px",width:"10px",height:"36px",color:"#666666",fontWeight:"bold"},children:"\u25bc"})})},B=Object(gf.jsxs)(Qv.a,{children:[J(V.Foundation,yD,R),J(V.Cuboid,gD,R),J(V.Tree,HD,R),J(V.Flower,zD,R),J(V.Human,RD,R,"People")]}),K=Object(gf.jsxs)(Qv.a,{children:[J(V.Wall,xD,I),J(V.Window,vD,I),J(V.Door,bD,I),J(V.PyramidRoof,AD,I),J(V.HipRoof,TD,I),J(V.GableRoof,jD,I),J(V.GambrelRoof,PD,I),J(V.MansardRoof,SD,I)]}),q=Object(gf.jsxs)(Qv.a,{children:[J(V.SolarPanel,wD,k),J(V.ParabolicTrough,DD,k),J(V.ParabolicDish,MD,k),J(V.FresnelReflector,WD,k),J(V.Heliostat,ID,k),J(V.Sensor,mD,k),J(V.Light,CD,k)]});return Object(gf.jsxs)("div",{children:[Object(gf.jsx)(OD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.Select",Y),alt:"Select",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFBYXpdrWjwAAA4VJREFUWIXl10uIHEUYB/B//fvr6up5d+9unNnHsOO6sw2+8MViYCMeDCKK5BajN+8ievDgwHh0wVMOihAwIoqCsEpAl8RLPBhFZUk8uB4ECRpXMOBm3MzKdLo8pEd87OzMYWZysI71+n5V3dRXpay1uJGFNzQ6AFhr0WsXCoXCYWPMOWPM6/V6PdftP9S4+wEAnAJgAVgROWWMuQkAVlZWnIEmHwJgHcA1kj8opayIfOx53ty+Mw9YBgWcFpHdcrl8hOQHKeJMLpe7eVyAMyISLy0tLYZhWBaRj5RSluTZMAyXxgE4LSJ2bm7uIAAEQTAjIh+miM8ymUw0coDnebZard7frQjDsEzy/RTxxdTU1O0jBywuLh78e2WtVjvguu57JK3W+utyuXzXyAAi8o8d6JZKpRIaY952HMdqrc8HQXDfWAEAsLy8HGit30w/x4VSqbRnv5EBAKBarZa01idIWhH5dnJy8tBYAQAwPz9f8DzvtfSc+D4MwwfHCgCAer2eM8YcT3fip1KpdHisAACIosjVWq+mO/FzsVh8dJyAbmp3Pc97EddzyKV8Pv/YfgDpOysJEekpnJ2d9Vqt1sOtVuveJEkcAO1Op5MB8GuSJJWdnZ2Xoiha39zc7Ow1vi8AAOI4Vr3atre372y32+9YazMkQfL6ykSQJElbRL7xfb/nAvoCkiSBtVYBQKPRUKurq49YayfjOF4DcAWAjeNYk/zF9/1XAVxKkkQ5jqPiOP49CIJPNzY24p4BBkxG9wCAMeZZkpcBxCLyjLUW09PTRkTWSF4xxhzpt6D/xB0gHf8RRdGtWuunSe6QvJaefN91b0jZbPZxkpbkWi6XKw0TsE6yY4x5C8BVklv5fP6o67rvKqVsJpN5CvgrQ54juau1fmiYgE8A2HTFl40xTwCAMeYYyV2SZwF4AOC67nMkreu6x5vN5r53xoEBWutXSP5G8mI+nz/ara9UKqFS6kuSNpvNHgKAYrF4h+M4F0n+6Pv+bUMB1Gq1KWPMk77vP/DvNmNMMz12TwJAs9l0tNYvK6Ws67rPAxjs5jzIFXqvMjMzs0Byi+TWwsLCTIo6RrJD8oIxpjxSAABorU+SjI0xJ0g2SZ5P/5evfN8/MHLAxMTEioi0SMZp4Kta6zcKhcLd6PPsGwqg0Wgo3/dfEJHPPc9rZLPZW6IocgcZ242r/vev4z8B5TAn+0kvIhQAAAAASUVORK5CYII=",height:36,width:36,style:{filter:g!==V.None||m||w||x||v||b||S?L:E,cursor:"pointer",verticalAlign:"middle"},onClick:U})}),Object(gf.jsx)(OD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.ManipulateGroup",Y),alt:"Group",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAR4FluLjugAAAKtJREFUWIXtl0sOgCAMRDuG+1+5riAVASkfq0lnZ9I4z0lbBMxMlgpERAAuFMyMXYa51yFNdxpLSa9QK8pJR0x66hLArKFG0gurmzC+vDeBQz4A4DeTuAFYyAGqY5hL2xutetmg/0kg6mm8WmNYSsU8AQdwAAco7oHWFlt9Wn4rgdaW0/5o9Mo8AQdQn4YzKvWPGmB0DGvNa341SwlE09oXroSSXt9pQqur2QnRTVJZNG/P0wAAAABJRU5ErkJggg==",height:36,width:36,style:{filter:S?E:L,cursor:"pointer",verticalAlign:"middle"},onClick:function(){e((function(e){e.groupActionMode||(e.objectTypeToAdd=V.None),e.groupActionMode=!e.groupActionMode}))}})}),Object(gf.jsxs)(OD,{children:[function(e){switch(e){case V.Foundation:return G(e,yD,Ew.getState().addedFoundationId);case V.Cuboid:return G(e,gD,Ew.getState().addedCuboidId);case V.Tree:return G(e,HD);case V.Flower:return G(e,zD);case V.Human:return G(e,RD,void 0,"People")}}(z),X(B)]}),Object(gf.jsxs)(OD,{children:[function(e){switch(e){case V.Wall:return G(e,xD,Ew.getState().addedWallId);case V.Window:return G(e,vD,Ew.getState().addedWindowId);case V.Door:return G(e,bD,Ew.getState().addedDoorId);case V.PyramidRoof:return G(V.PyramidRoof,AD);case V.HipRoof:return G(V.HipRoof,TD);case V.GableRoof:return G(V.GableRoof,jD);case V.GambrelRoof:return G(V.GambrelRoof,PD);case V.MansardRoof:return G(V.MansardRoof,SD)}}(W),X(K)]}),Object(gf.jsxs)(OD,{children:[function(e){switch(e){case V.SolarPanel:return G(e,wD);case V.ParabolicTrough:return G(e,DD);case V.ParabolicDish:return G(e,MD);case V.FresnelReflector:return G(e,WD);case V.Heliostat:return G(e,ID);case V.Sensor:return G(e,mD);case V.WindTurbine:return G(e,"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUAggr/uMtcAAAAzxJREFUWIXFVk1II2cYfr7vy/zEnd/EbIs6aqMxCTaKRWpNBdfG4mWPrbfem70ve9oilL0uLaUHD4XS24KXUjxUC21pj5UiFEqLDEI0WA9CYiTuMJO3hzXbVuyaySbxgYGZ7+edZ56H550PRIRWrkKhcH96enqy1fWtXhwt4uDgwD06OnrU6vpW0TKBqampb4QQ71qWVegogzByZTKZJ6Zp/nEjFgBALpf7RJKkibGxseKNKEBEEdu2S7qu1/L5vN5zBQD4six/4XnerXK5vHYTCmB2djYdjUZ9TdNoYmLitZdVoK1Nuq7/BIBkWf7OcZyxXloAAPA875dkMom5ubnC6enp7sDAwNsIEemXsmB9fd20bbsEgADQysoKATiLxWK/G4bx5cjIyL1MJjNfLBaTRMSuq8eIKCzniGmav1Wr1TQATE5OwnVdEBGEEJAkCZxzKIqCRqNxIoTYicfjPzqOs7O5ufntBfF/ioV9ezabTdbr9TgAaJoG13X/XFhY+NSyLO77Pg+CAIwxfn5+zhljchAEqqZpkqqqt68sGNaCwcHBnyORCCmKUsvlcu8RkehZCubn59/XNI00TSMAd4hIAFgeGhr6fnl5ebirKVhbW1P39vY+8zwPjuM8IKIfVFX9QJbl7Vqtdsc0zXhYO0NZYFnWPV3XyTCMh82xbDb7mHNOiqJ4qVTqza4pkM/nb3POP7dt++tKpfLxv6aGGWPgnEsnJyd9XVMgFos9icfjO5dzzRj7inNOQggSQhS6okAikVhUFGVhZmbmHfw3w9y27eFm/peWlt5qR4AXElhdXY2Oj48/SCQSd7e3tyuXpkVfX1+KiNBoNFAul9WOEwDgLS4ufri7u/vr5QnGWHB4ePgUeGZjqVRqtEOg7QZSLBZtSZKOABBjjAB81NU+cBlnZ2cpy7JeaX5EOp1+o506of8FTWxsbDz1ff/5cxAEV/f6a9C2AqOjo68TPQsFYwzHx8f+NVs6S8B13VcvegEYY6hWq70l0N/fn2tacNGqh7a2tm71jIDjOH8ZhoFIJAIigiRJzv7+vhG2zrUnItM0X7igXq9fOR6NRp/fVyoV9n/721agU2jnTNhR/A2OInIG7r+B4wAAAABJRU5ErkJggg==");case V.Light:return G(e,CD)}}(F),X(q)]}),Object(gf.jsx)(OD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.ClearScene",Y),alt:"Clear",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWASEWSoKIWAAAAZdJREFUWIXllrEuBFEUhv9fJIR3UGokCiSeQMsbkBD/NoREvIFKQ6jmUqxWqfYAEgmReAFPgYJf4c7m7q5lcNcIJ5ns3jNn5vvmzpnk0DbqjIFa6b9BYLAzQXJN0mE/YCGEOdvnbby0B/oJTySmbF+3ErZbhyRLcprLeUgygJ00V0cPMF3UIfBct0Bb/MtX0Pbp/8tX8DMCJCdIzr5x6rTvAiQ3JN1KuiB5XOaLoqDtq74KRPh+uZa0QrLZqz6rAMn1FJ5ILPWSyCZAclPSQa/zpQTJNmYWgQjf+6hO0hKArawCVeGJxG42gdhwleEAEEJYyCKQNlwIYbwiXLbP0lzXSFYRPlk2XAhhxPY9yWFJDx/AjzrzX92BkfKP7fv4+xhCGPoMHOieCWckXb5HLoqCJAngWNJyBAzafiprGo1G66bvwbsEosQkgEUAox21BlDYvklqm/HTakmQHJN0VwX+etdvDpoAmnHYPAUwXQ62AFarXN+1A18JkieSFst1pSfPtQPJTmzHJ5//zHVZduA78XcnoqrxAhsxq5juT7lFAAAAAElFTkSuQmCC",height:36,width:36,color:"#666666",style:{cursor:"pointer"},onClick:function(){Zv.a.confirm({title:me.t("toolbar.DoYouReallyWantToClearContent",Y)+"?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var t=JSON.parse(JSON.stringify(Ew.getState().elements));y();var l={name:"Clear Scene",timestamp:Date.now(),removedElements:t,undo:function(){e((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){y()}};A(l)}}),U()}})}),Object(gf.jsx)(OD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.SpatialAnalysisOfEnergy",Y),alt:"Spatial analysis",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wEHEBw2Usn7JwAAA7JJREFUWIXF11uIlVUUB/DfOKnZpBnmQGGplWM25VhGSlkWSZeHsoeiu0WkNoEFFj1IQkVhPfWQXamwosiyCLqMdCG6kJI0RZFd6G6oNFGNXRwbh+lh7Y+zz5lznDMh04LNOd/a6/bt9d//vT/+Z2kYgu1+mJ5+K6UfW9LY6zIZF+JBdKdk1cZ7uB4n7a3EI3E23tpD0mpjG27BlHqS1GrBKKxAO5oz/S/iTf9AY0rYIFozuyLGO1iGT+oppDL5behReqstuBNnYSL2xziMTb8zsATrla/GBswcSvJG3IqdWZDncCpG1OF/MG4SbSj8N6Kt3gLOxW/JsQ9P4KB6nZM04PKKIt7AhMEcp4q+FU4v1Eh+CBbiCpyBAzG6it1VAiv9YkWvHayA87PkP2BuNrcPjsNyPInN+BGfYh3uwQ1ozXwasCaLuR5jaiVvwn2Z8V1KPZ+M2/GFwbfg12LnHJB8Z6IrzX2PebUKmK1EMttxZtK3Gojsb9CBOwRgO5JPMb8Tj4v2jcGbSd+LlbUKOEU56pswHq9n+h1YheOxAJfhYsxP/o9iV2a/OsVenOmeVoN7Ts6MHhF8vyrTdYkeN6aEG9KK7cBrOErwwd3YnXx24epUbG/SfaQcJ1ULuB8nin72p4D3ZraPGdj7dWluNJ5X3q6V+Ds9/4TT8sTVyKURW5MxJao9Jj1vEixZyF/oTP9n4LBs7kMBvsb0XBQ2QOZlk2uSw0IlBPfhXXHSjRdI/zjpFgt6Ph1vZ3G2poIWJP/+VPy0agXkLdiElqS/ThxAORAfwnlYiitxkQBuflRvw6XiRH1YeXuryqF4PzNsz+YuSUVV9v1X/F6h253inJN8m/FlmutOsWrKkixQh1jWQlrECbkRXykhvV8AbLNY/psFVecx/0l2nelFa8pcJULpxY1VbKZhDhal+eW4QHBDZfAjldizT/lOqir7CnYr3my7IJv/IlPwShbrO5xQj+Mkgey8iEUCTPXKdLysvEUrhuBvlnJAdgtubxNsV01GCcy043MDgfmseLkBUutOOAsPKD+Su/AZXhLIHil62ySuanNwRCqGwFGxcn2CLa/BnzVyDpA2wfPFpWIo41txM34x0/WJu8TUegsgrlFLUyHF2VBr9Ai+WK0EuElYq7QV+/GMrJX1fhmNxbHiIGkVFDtR9Pdnsd0+wKsC8bmMEx81BQn1iDvGMqXzZkgyIhUxX5whLXs2B4eLlSiu+p2CJ4ZVJuApscOOHu7khTSr85Nt2ORfxq1ZEqNjj0MAAAAASUVORK5CYII=",height:36,width:36,color:"#666666",style:{filter:p?E:L,cursor:"pointer",verticalAlign:"middle"},onClick:function(){p?Tf.setState((function(e){e.showSolarRadiationHeatmap=!1,e.showHeatFluxes=!1})):!f||Tw.hasMovingParts(a)?(T||Kh(me.t("message.SimulationStarted",Y)),setTimeout((function(){c(),t("runDynamicSimulation",!T),e((function(e){l&&(e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Dynamic)",timestamp:(new Date).getTime()})}))}),100)):(P||Kh(me.t("message.SimulationStarted",Y)),setTimeout((function(){c(),t("runStaticSimulation",!P),e((function(e){l&&(e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Static)",timestamp:(new Date).getTime()})}))}),100))}})}),Object(gf.jsx)(OD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.ShowSunAndTimeSettings",Y),alt:"Heliodon",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVDjcggElAxQAAAy1JREFUWIXFl09oVHcQxz+zya67MYk+3IQoddfdjf9SpXhoK1RRVEovght8mBz0FB569ZSDFxX00INgQ+GVHAqFFndJPFcE6cEee1MUYZVkNf6DWCsWmt1OD/u2Pp/vJb/dRTIw8Hhv5jsz35nf7G9FVVlNia1q9E4TKBQK+4LvRCQpImeNQVS1bQUU2BZ4d7UBa4bRcQti3bErvuq7gVet+He3G1hEuoCN9aX602w2a83NzR0GBoHfgaQxUIuUF4EfgCvAkKqSz+fP0GhFUA96PuPAFHAhFLPFBLry+fz3eD0GTkUEb+ou4Jz3nA7DlHb2gIhsBJ4BdQPzPuATVb0X+rWTU+DXTCZjAUeBH/0srOTXFgMricfQE69AEREFelT176Bty6dARPpd1x22LGsQSP18bebfhafVPzObNlXL5fIjVa2p6kLDVA4BTExMMD09/VZEUFV5D9CU4lKp9A3LD5wCWhwtKrDZeLANJn/QJHBYIh0nkEgkdrYT3K+2bXctFyNyBkQkC9xtdUaCUqvXaoBEfQ89Bd5OXwpzKI4WGR8bHwMeLy4uvjx/6VLqqy++Tdfqv9y4Pns9NEhxtMjszGx4EmG0eIP0Xj9d191h0lPHceO2bR8n0ArHcUI3YdjQrfE7ZoeH97SzmGzb7vIXEjWUYcft/+xLpdK6djdjUycnJ4/4CoqZMNA07ve9ywIng7QuoyeB1Lu2OMe8NhSMEnBd90sgNjU15QfdC6wx2BtDnm3Tb6Q5V47jfG3KwEgToBP6gfVNHNu2h23bPhG0ibqS3QEsDe7tFkVVX3kYY+Vy+YFlWc/DjMIYON/p8EXgfmbCwMV4In5ARDqq3i+FQmG39/jChIEtgEpMZoCBTivPZDJHent7FxCuhTITQdfnPWt7Hvb1970BvgP2A8v+qAT8NwCn4on4byOfjijwE40LyQe2kTciEUkBp1M9qTO5XG7r/Pz824H0wB+VSuU+MAe8Bv6isTmTwJCI5JKp5O5cLre9Wq3W0hvSv1YqlcuqejuqPUZXMhHZAxxA2ItyIsounojfWvpn6Q5wG7ipqi9XxDZJ4GPKqv87/g99LxWbCpiI3gAAAABJRU5ErkJggg==",height:36,width:36,color:"#666666",style:{filter:d?E:L,cursor:"pointer",verticalAlign:"middle"},onClick:function(){var t={name:"Show Sun and Time Settings Panel",timestamp:Date.now(),checked:!d,undo:function(){e((function(e){e.viewState.showHeliodonPanel=!t.checked}))},redo:function(){e((function(e){e.viewState.showHeliodonPanel=t.checked}))}};A(t),e((function(e){e.viewState.showHeliodonPanel=!e.viewState.showHeliodonPanel}))}})})]})},kD=n.a.memo(FD),YD=mv.a.div(mz||(mz=Object(gv.a)(["\n position: absolute;\n top: 0;\n right: 10px;\n margin: 0;\n padding-bottom: 0;\n padding-top: 16px;\n display: flex;\n justify-content: center;\n align-items: center;\n user-select: none;\n z-index: 9;\n"]))),LD=function(e){var t=e.signIn,l=e.signOut,a=Ew(Vi),o=Ew(di),i=Tf(Ki),n=Object(r.useMemo)((function(){return{lng:a}}),[a]),c=Object(gf.jsxs)(Qv.a,{triggerSubMenuAction:"click",children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.showAccountSettingsPanel=!0}))},children:me.t("avatarMenu.AccountSettings",n)},"account"),Object(gf.jsx)(Qv.a.Item,{onClick:l,children:me.t("avatarMenu.SignOut",n)},"signOut")]});return Object(gf.jsx)(YD,{children:Object(gf.jsxs)(wv.b,{direction:"horizontal",children:[!i&&Object(gf.jsx)(kD,{}),Object(gf.jsx)("div",{style:{verticalAlign:"top"},children:o.displayName?Object(gf.jsx)(lb.a,{overlay:c,trigger:["click"],children:Object(gf.jsx)("a",{className:"ant-dropdown-link",onClick:function(e){return e.preventDefault()},title:me.t("tooltip.clickToAccessAccountSettings",n),children:Object(gf.jsx)(hD.a,{size:32,src:o.photoURL,alt:o.displayName})})}):Object(gf.jsx)(pD.a,{title:Object(gf.jsx)("div",{onClick:function(e){return e.stopPropagation()},children:me.t("avatarMenu.PrivacyStatementTitle",n)}),content:Object(gf.jsxs)("div",{style:{width:"280px",fontSize:"12px"},children:[me.t("avatarMenu.PrivacyStatement",n),Object(gf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-privacy.html",children:me.t("aboutUs.PrivacyPolicy",n)}),"."]}),children:Object(gf.jsx)(xv.a,{type:"primary",onClick:t,children:me.t("avatarMenu.SignIn",n)})})})]})})},ED=n.a.memo(LD),UD=function(e){var t=e.saveToCloud,l=e.isLoading,a=e.setTitle,o=e.getTitle,i=e.setTitleDialogVisible,n=e.isTitleDialogVisible,c=Ew(si),s=Ew(Vi),d=Object(r.useState)(!1),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)({left:0,top:0,bottom:0,right:0}),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useRef)(null),v={lng:s},b=function(){t(o(),!1,!0),c((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!1}))},A=function(){i(!1),c((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!1}))};return Object(gf.jsx)(Zv.a,{width:500,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return p(!0)},onMouseOut:function(){return p(!1)},children:me.t("menu.file.SaveAsCloudFile",v)}),visible:n(),footer:[Object(gf.jsx)(xv.a,{onClick:A,children:me.t("word.Cancel",v)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:b,disabled:!o(),children:me.t("word.OK",v)},"OK")],confirmLoading:l(),onCancel:A,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!h,bounds:m,onStart:function(e,t){return function(e,t){if(x.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=x.current.getBoundingClientRect();w({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:x,children:e})})},children:Object(gf.jsxs)(wv.b,{direction:"horizontal",children:[Object(gf.jsxs)("span",{children:[me.t("word.Title",v),":"]}),Object(gf.jsx)(ET.a,{style:{width:"400px"},placeholder:"Title",value:o(),onPressEnter:b,onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){a(e.target.value)}})]})})},ND=n.a.memo(UD),VD=l(573),JD=dR.a.Column,GD=mv.a.div(wz||(wz=Object(gv.a)(["\n position: fixed;\n top: 90px;\n right: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 14;\n"]))),XD=mv.a.div(xz||(xz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 640px;\n height: 520px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n"]))),BD=mv.a.div(vz||(vz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),KD=function(e){var t=e.projects,l=e.setProjectState,a=e.deleteProject,o=e.renameProject,i=Ew(Vi),c=Ew(di),s=Ew(si),d=Ew(Ni),p=n.a.useRef(null),y=Object(r.useRef)(null),g=y.current?y.current.clientWidth+40:680,m=y.current?y.current.clientHeight+100:600,w=Object(r.useState)({x:0,y:0}),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(!1),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)({left:0,top:0,bottom:0,right:0}),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useState)(),O=Object(u.a)(C,2),F=O[0],k=O[1],Y=Object(r.useState)(),L=Object(u.a)(Y,2),E=L[0],U=L[1],N=Object(r.useRef)(null),V=Object(r.useRef)(Object(h.a)(t)),J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=Object(r.useState)(-1),q=Object(u.a)(K,2),Q=q[0],Z=q[1],_=ET.a.Search,$=Object(r.useMemo)((function(){return{lng:i}}),[i]);Object(r.useEffect)((function(){var e=function(){b({x:Math.max(0,g-window.innerWidth),y:Math.min(0,window.innerHeight-m)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){t&&(V.current=Object(h.a)(t),B(!X))}),[t]);var ee=function(){Tf.setState((function(e){e.showProjectListPanel=!1}))},te=function(){F&&E&&(o(F,E),U(void 0),B(!X)),S(!1)};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Zv.a,{title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return R(!0)},onMouseOut:function(){return R(!1)},children:me.t("word.Rename",$)}),visible:P,onOk:te,onCancel:function(){S(!1),U(void 0)},modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!z,bounds:W,onStart:function(e,t){return function(e,t){if(N.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=N.current.getBoundingClientRect();I({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:N,children:e})})},children:Object(gf.jsxs)(wv.b,{direction:"vertical",style:{width:"100%"},children:[Object(gf.jsx)(ET.a,{placeholder:"Title",value:E||F,onPressEnter:te,onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){U(e.target.value)}}),Object(gf.jsxs)("span",{style:{fontSize:"11px",color:"red"},children:[Object(gf.jsx)(fR.a,{style:{marginRight:"4px"}}),me.t("word.Caution",$)+": "+me.t("projectListPanel.IfSharedOrPublishedRenamingProjectBreaksExistingLinks",$),"."]})]})}),Object(gf.jsx)(JT.a,{nodeRef:p,handle:".handle",bounds:"parent",axis:"both",position:v,onDrag:function(e,t){b({x:Math.max(t.x,g-window.innerWidth),y:Math.min(t.y,window.innerHeight-m)})},onStop:function(e,t){},onMouseDown:function(){s((function(e){e.selectedFloatingWindow="projectListPanel"}))},children:Object(gf.jsx)(GD,{ref:p,style:{zIndex:"projectListPanel"===d?Ke:14},children:Object(gf.jsxs)(XD,{ref:y,children:[Object(gf.jsxs)(BD,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("projectListPanel.MyProjects",$)+" ("+V.current.length+")"}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){ee()},onTouchStart:function(){ee()},children:me.t("word.Close",$)})]}),Object(gf.jsx)("span",{style:{direction:"ltr"},children:Object(gf.jsx)(_,{style:{width:"50%",paddingTop:"8px",paddingBottom:"8px"},title:me.t("projectListPanel.SearchByTitle",$),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(t){V.current=[];var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o,i=l.value;(null===(o=i.title)||void 0===o?void 0:o.toLowerCase().includes(e.toLowerCase()))&&V.current.push(i)}}catch(r){a.e(r)}finally{a.f()}B(!X)}}})}),Object(gf.jsxs)(dR.a,{size:"small",style:{width:"100%",direction:"ltr",verticalAlign:"top"},dataSource:V.current,scroll:{y:360},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:[Object(gf.jsx)(JD,{title:me.t("word.Type",$),dataIndex:"type",width:"25%",render:function(e){return Object(gf.jsx)(uR.a.Text,{style:{fontSize:"12px",verticalAlign:"top"},children:e})},onCell:function(e,t){return{style:{background:Q===t?"lightskyblue":void 0!==t&&t%2===0?"beige":"gainsboro"}}}},"type"),Object(gf.jsx)(JD,{title:me.t("word.Title",$),dataIndex:"title",width:"50%",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.title.localeCompare(t.title)},render:function(e,t,o){var i=void 0;return Object(gf.jsxs)(wv.b,{style:{width:"100%"},children:[Object(gf.jsx)(lb.a,{overlay:Object(gf.jsxs)(Qv.a,{onMouseEnter:function(e){var t;i=null===(t=window.getSelection())||void 0===t?void 0:t.toString()},children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(e){e.domEvent.preventDefault(),e.domEvent.stopPropagation(),l(t)},children:me.t("word.Open",$)}),Object(gf.jsx)(Qv.a.Item,{onClick:function(t){t.domEvent.preventDefault(),t.domEvent.stopPropagation(),i&&i.length>0?Zh(i):Zh(e),Bh(me.t("projectListPanel.TitleCopiedToClipBoard",$)+".")},children:me.t("projectListPanel.CopyTitle",$)}),Object(gf.jsx)(Qv.a.Item,{onClick:function(t){t.domEvent.preventDefault(),t.domEvent.stopPropagation(),k(e),S(!0)},children:me.t("word.Rename",$)}),Object(gf.jsx)(Qv.a.Item,{onClick:function(t){t.domEvent.preventDefault(),t.domEvent.stopPropagation(),function(e){Zv.a.confirm({title:me.t("projectListPanel.DoYouReallyWantToDeleteProject",$)+' "'+e+'"?',content:Object(gf.jsxs)("span",{style:{color:"red",fontWeight:"bold"},children:[Object(gf.jsx)(fR.a,{style:{marginRight:"6px"}}),me.t("word.Warning",$)+": "+me.t("message.ThisCannotBeUndone",$)]}),icon:Object(gf.jsx)(hR.a,{}),onOk:function(){a(e)}})}(e)},children:me.t("word.Delete",$)}),Object(gf.jsx)(Qv.a.Item,{onClick:function(t){t.domEvent.preventDefault(),t.domEvent.stopPropagation();var l=Ge+"?client=web&userid="+c.uid+"&project="+encodeURIComponent(e);Zh(l),Bh(me.t("projectListPanel.ProjectLinkGeneratedInClipBoard",$)+".")},children:me.t("projectListPanel.GenerateProjectLink",$)})]}),trigger:["hover"],children:Object(gf.jsx)(VD.a,{style:{fontSize:"12px",cursor:"pointer"},onMouseEnter:function(){void 0!==o&&Z(o)},onMouseLeave:function(){Z(-1)}})}),Object(gf.jsx)(uR.a.Text,{style:{fontSize:"12px",cursor:"pointer",verticalAlign:"top"},children:e})]})},onCell:function(e,t){return{style:{background:Q===t?"lightskyblue":void 0!==t&&t%2===0?"beige":"gainsboro"}}}},"title"),Object(gf.jsx)(JD,{title:me.t("word.Time",$),dataIndex:"time",width:"25%",defaultSortOrder:"descend",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.timestamp-t.timestamp},render:function(e){return Object(gf.jsx)(uR.a.Text,{style:{fontSize:"12px",verticalAlign:"top"},children:e})},onCell:function(e,t){return{style:{background:Q===t?"lightskyblue":void 0!==t&&t%2===0?"beige":"gainsboro"}}}},"time")]})]})})})]})},qD=n.a.memo(KD),QD=function(e,t,l){Object(r.useEffect)((function(){e&&(t(),l())}),[e])},ZD=function(e){var t=e.viewOnly,l=void 0!==t&&t,a=e.canvas,o=Ew(si),n=Tf(yf),c=Ew(Vi),s=Ew(di),p=Ew(i.latitude),y=Ew(i.longitude),g=Ew(i.address),m=Ew(i.countryCode),w=Ew(Hr),v=Tf(Ps),b=Tf(Hs),A=Tf(zs),T=Tf(Rs),P=Tf(Ki),R=Ew(ar),D=Tf(nr),W=Tf(hr),I=Tf(pr),C=Tf(gr),O=Tf(mr),F=Ew(tr),k=Ew(lr),Y=Ew(jr),L=Ew(Rr),E=Tf(Di),U=Ew(wr),N=Ew(rr),J=Tf(cr),G=Tf(sr),X=Tf(dr),B=Tf(ur),K=Tf(fr),q=Object(r.useState)(!1),Q=Object(u.a)(q,2),Z=Q[0],_=Q[1],$=Object(r.useState)(!1),ee=Object(u.a)($,2),te=ee[0],le=ee[1],ae=Object(r.useState)([]),oe=Object(u.a)(ae,2),ie=oe[0],re=oe[1],ne=Object(r.useState)([]),ce=Object(u.a)(ne,2),se=ce[0],de=ce[1],ue=Object(r.useState)(!1),fe=Object(u.a)(ue,2),he=fe[0],pe=fe[1],ye=Object(r.useState)(null!==R&&void 0!==R?R:"My Aladdin File"),ge=Object(u.a)(ye,2),we=ge[0],xe=ge[1],ve=Object(r.useState)(!1),be=Object(u.a)(ve,2),Ae=be[0],Te=be[1],Pe=Object(r.useRef)(),Se=Object(r.useRef)(),je=Object(r.useRef)(),He=Object(r.useRef)(!0),ze=Object(r.useMemo)((function(){return{lng:c}}),[c]);Object(r.useEffect)((function(){var e=0===$T.a.apps.length;return 1===$T.a.apps.length&&$T.a.apps[0].name===S.LOG_DATA&&(e=!0),e?$T.a.initializeApp({apiKey:"AIzaSyD-236qE4ix9TkH2AW_wjKSz8jgK0ukjW0",authDomain:"aladdin-316017.firebaseapp.com",projectId:"aladdin-316017",storageBucket:"aladdin-316017.appspot.com",databaseURL:"https://aladdin-316017.firebaseio.com",messagingSenderId:"169516488625",appId:"1:169516488625:web:bb0ae3c3f7c6e813250f90"}):$T.a.app(),$T.a.auth().onAuthStateChanged((function(e){var t=new URLSearchParams(window.location.search).get("title");o(e?function(l){l.user&&(l.user.uid=e.uid,l.user.displayName=e.displayName,l.user.email=e.email,l.user.photoURL=e.photoURL),l.cloudFile=null!==t&&void 0!==t?t:void 0}:function(e){e.cloudFile=null!==t&&void 0!==t?t:void 0})})),De(),window.addEventListener("popstate",Re),function(){window.removeEventListener("popstate",Re)}}),[]);var Re=function(){if(!l){var e=new URLSearchParams(window.location.search),t=e.get("userid"),a=e.get("title");t&&a&&qe(t,a,!0)}};Object(r.useEffect)((function(){if(Pe.current){var e=[];Pe.current.forEach((function(t,l){e.push({key:l.toString(),title:t.fileName,time:x()(new Date(t.timestamp)).format("MM/DD/YYYY hh:mm A"),timestamp:t.timestamp,userid:t.userid,action:""})})),e.sort((function(e,t){return t.timestamp-e.timestamp})),re(e)}}),[Pe.current]),Object(r.useEffect)((function(){if(Se.current){var e=[];Se.current.forEach((function(t,l){var a,o;e.push({key:l.toString(),owner:t.owner,title:t.title,time:x()(new Date(t.timestamp)).format("MM/DD/YYYY hh:mm A"),timestamp:t.timestamp,description:t.description,dataColoring:t.dataColoring,selectedProperty:t.selectedProperty,sortDescending:t.sortDescending,xAxisNameScatteredPlot:t.xAxisNameScatteredPlot,yAxisNameScatteredPlot:t.yAxisNameScatteredPlot,dotSizeScatteredPlot:t.dotSizeScatteredPlot,thumbnailWidth:t.thumbnailWidth,type:t.type,designs:t.designs,ranges:null!==(a=t.ranges)&&void 0!==a?a:[],hiddenParameters:null!==(o=t.hiddenParameters)&&void 0!==o?o:kw.getDefaultHiddenParameters(t.type),counter:t.counter,action:""})})),e.sort((function(e,t){return t.timestamp-e.timestamp})),de(e)}}),[Se.current,he]),Object(r.useEffect)((function(){if(je.current=new Map,s.aliases&&s.aliases.length>0){var e,t=Object(f.a)(s.aliases);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l!==s.displayName){var a=N.get(l);a&&(je.current=new Map([].concat(Object(h.a)(je.current),Object(h.a)(a))))}}}catch(i){t.e(i)}finally{t.f()}}if(s.displayName){var o=N.get(s.displayName);o&&(je.current=new Map([].concat(Object(h.a)(je.current),Object(h.a)(o))))}}),[N,s.displayName,s.aliases]),QD(D,(function(){R&&(Je(R,!1,!1),xe(R))}),(function(){return n("saveCloudFileFlag",!1)})),QD(W,(function(){Ie().then((function(){Ce().then((function(){}))}))}),(function(){return n("modelsMapFlag",!1)})),QD(I,(function(){Oe().then((function(){Ce().then((function(){}))}))}),(function(){return n("leaderboardFlag",!1)})),QD(C,(function(){if(s&&s.uid&&we){var e=new URLSearchParams(window.location.search);if(e.get("userid")===s.uid&&e.get("title")===we){var t,l={latitude:p,longitude:y,address:null!==g&&void 0!==g?g:null,countryCode:null!==m&&void 0!==m?m:null,type:Ew.getState().modelType,author:null!==(t=Ew.getState().modelAuthor)&&void 0!==t?t:s.displayName,userid:s.uid,title:we,label:Ew.getState().modelLabel,description:Ew.getState().modelDescription,timeCreated:Date.now()},i=Tw.getModelKey(l),r=$T.a.firestore().collection("models");if(r){var n=$T.a.storage().ref();if(a)Tw.resizeCanvas(a,200).toBlob((function(e){if(e){var t=n.child("images/"+i+".png").put(e,{contentType:"image/png"});t.on($T.a.storage.TaskEvent.STATE_CHANGED,(function(e){var t=e.bytesTransferred/e.totalBytes*100;t>0&&Kh(me.t("word.Upload",ze)+": "+t+"%")}),(function(e){Qh("Storage: "+e)}),(function(){t.snapshot.ref.getDownloadURL().then((function(e){var t,a=Object(d.a)(Object(d.a)({},l),{},{thumbnailUrl:e}),n=r.doc(Tw.getLatLngKey(p,y));n.get().then((function(e){if(e.exists){var t=e.data();t&&t[i]?n.set(Object(sR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.UpdatedOnModelsMap",ze)+".")})):n.set(Object(sR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.PublishedOnModelsMap",ze)+".")}))}else n.set(Object(sR.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.PublishedOnModelsMap",ze)+".")}))})).catch((function(e){Qh(me.t("message.CannotPublishModelOnMap",ze)+": "+e)})),$T.a.firestore().collection("board").doc("people").update(Object(sR.a)({},(null!==(t=a.author)&&void 0!==t?t:"Anonymous")+"."+Tw.getModelKey(a),a)).then((function(){o((function(e){if(e.peopleModels){var t,l=e.peopleModels.get(null!==(t=a.author)&&void 0!==t?t:"Anonymous");l&&l.set(Tw.getModelKey(a),a)}}))})),$T.a.firestore().collection("board").doc("info").set({latestModel:a},{merge:!0}).then((function(){}))}))}))}}))}$T.a.firestore().collection("users").doc(s.uid).update(Ew.getState().modelAuthor===s.displayName?{published:$T.a.firestore.FieldValue.arrayUnion(we)}:{published:$T.a.firestore.FieldValue.arrayUnion(we),aliases:$T.a.firestore.FieldValue.arrayUnion(Ew.getState().modelAuthor)}).then((function(){o((function(e){e.user&&(e.user.published||(e.user.published=[]),e.user.published.includes(we)||e.user.published.push(we),e.user.aliases||(e.user.aliases=[]),e.modelAuthor&&!e.user.aliases.includes(e.modelAuthor)&&e.modelAuthor!==s.displayName&&e.user.aliases.push(e.modelAuthor))}))}))}}}),(function(){return n("publishOnModelsMapFlag",!1)})),QD(J,(function(){if(!s||!s.uid)return;var e=Tf.getState().projectTitle;if(!e)return void Qh(me.t("message.CannotCreateNewProjectWithoutTitle",ze)+".");var t=e.trim();if(0===t.length)return void Qh(me.t("message.CannotCreateNewProjectWithoutTitle",ze)+".");Ee(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(f.a)(Se.current);try{for(i.s();!(a=i.n()).done;){if(a.value.title===t){l=!0;break}}}catch(h){i.e(h)}finally{i.f()}}if(l)Kh(me.t("message.TitleUsedChooseDifferentOne",ze)+": "+t);else if(s&&s.uid){var r,n,c=null!==(r=Tf.getState().projectType)&&void 0!==r?r:M.SOLAR_PANEL_ARRAY,d=null!==(n=Tf.getState().projectDescription)&&void 0!==n?n:null,u=(new Date).getTime();$T.a.firestore().collection("users").doc(s.uid).collection("projects").doc(t).set({owner:s.uid,timestamp:u,type:c,description:d,counter:0,designs:[],hiddenParameters:kw.getDefaultHiddenParameters(c)}).then((function(){o((function(t){t.projectView=!0,t.projectInfo.owner=s.uid,t.projectInfo.type=c,t.projectInfo.title=e,t.projectInfo.description=d,t.projectInfo.counter=0,t.projectInfo.dataColoring=z.ALL,t.projectInfo.selectedProperty=null,t.projectInfo.sortDescending=!1,t.projectInfo.xAxisNameScatteredPlot=null,t.projectInfo.yAxisNameScatteredPlot=null,t.projectInfo.dotSizeScatteredPlot=5,t.projectInfo.thumbnailWidth=200,t.projectInfo.designs=[],t.projectInfo.ranges=[],t.projectInfo.hiddenParameters=kw.getDefaultHiddenParameters(t.projectInfo.type)}))})).catch((function(e){Qh(me.t("message.CannotCreateNewProject",ze)+": "+e)})).finally((function(){b&&Ee(!1).then((function(){le(!te)})),_(!1)}))}}))}),(function(){return n("createProjectFlag",!1)})),QD(G,(function(){if(!s||!s.uid)return;var e=Tf.getState().projectTitle;if(!e)return void Qh(me.t("message.CannotCreateNewProjectWithoutTitle",ze)+".");var t=e.trim();if(0===t.length)return void Qh(me.t("message.CannotCreateNewProjectWithoutTitle",ze)+".");Ee(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(f.a)(Se.current);try{for(i.s();!(a=i.n()).done;){if(a.value.title===t){l=!0;break}}}catch(J){i.e(J)}finally{i.f()}}if(l)Kh(me.t("message.TitleUsedChooseDifferentOne",ze)+": "+t);else if(s&&s.uid){var r=Ew.getState().projectInfo.designs;if(r){var n,c,d,h,p,y,g,m,w=Tf.getState().projectType,x=Tf.getState().projectDescription,v=Ew.getState().projectInfo.owner,A=(new Date).getTime(),T=Ew.getState().projectInfo.counter,P=null!==(n=Ew.getState().projectInfo.dataColoring)&&void 0!==n?n:null,S=null!==(c=Ew.getState().projectInfo.selectedProperty)&&void 0!==c?c:null,j=!!Ew.getState().projectInfo.sortDescending,H=null!==(d=Ew.getState().projectInfo.xAxisNameScatteredPlot)&&void 0!==d?d:"rowWidth",z=null!==(h=Ew.getState().projectInfo.yAxisNameScatteredPlot)&&void 0!==h?h:"rowWidth",R=null!==(p=Ew.getState().projectInfo.dotSizeScatteredPlot)&&void 0!==p?p:5,D=null!==(y=Ew.getState().projectInfo.thumbnailWidth)&&void 0!==y?y:200,M=null!==(g=oP(t,r))&&void 0!==g?g:[],W=Object(f.a)(r.entries());try{for(W.s();!(m=W.n()).done;){var I=Object(u.a)(m.value,2),C=I[0],O=I[1];nP(O.title,M[C].title,v,s.uid)}}catch(J){W.e(J)}finally{W.f()}var F=Ew.getState().projectImages;if(F&&F.size>0){var k,Y,L=Object(f.a)(r.entries());try{for(L.s();!(Y=L.n()).done;){var E=Object(u.a)(Y.value,2),U=E[0],N=E[1],V=F.get(N.title);V&&(M[U].thumbnail=rP(V))}}catch(J){L.e(J)}finally{L.f()}$T.a.firestore().collection("users").doc(s.uid).collection("projects").doc(t).set({owner:s.uid,timestamp:A,type:w,description:x,counter:T,dataColoring:P,selectedProperty:S,sortDescending:j,xAxisNameScatteredPlot:H,yAxisNameScatteredPlot:z,dotSizeScatteredPlot:R,thumbnailWidth:D,designs:M,ranges:null!==(k=Ew.getState().projectInfo.ranges)&&void 0!==k?k:null,hiddenParameters:Ew.getState().projectInfo.hiddenParameters}).then((function(){o((function(t){t.projectView=!0,t.projectInfo.owner=s.uid,t.projectInfo.type=w,t.projectInfo.title=e,t.projectInfo.description=x,t.projectInfo.designs=M}))})).catch((function(e){Qh(me.t("message.CannotCreateNewProject",ze)+": "+e)})).finally((function(){b&&Ee(!1).then((function(){le(!te)})),_(!1)}))}}}}))}),(function(){return n("saveProjectFlag",!1)})),QD(B,(function(){Ue(!0)}),(function(){return n("showProjectsFlag",!1)})),QD(K,(function(){Ue(!1),le(!te)}),(function(){return n("updateProjectsFlag",!1)})),QD(O,(function(){if(!s.uid)return;Qe().then((function(){Tf.setState((function(e){e.showCloudFilePanel=!0}))}))}),(function(){return n("listCloudFilesFlag",!1)})),QD(X,(function(){var e=Ew.getState().projectInfo.owner;if(s.uid!==e)Kh(me.t("message.CannotAddDesignToProjectOwnedByOthers",ze));else{var t=Ew.getState().projectInfo.title;if(t){var l,i,r;_(!0);var n=null!==(l=Ew.getState().projectInfo.type)&&void 0!==l?l:M.SOLAR_PANEL_ARRAY,c=null!==(i=Ew.getState().projectInfo.thumbnailWidth)&&void 0!==i?i:200,d=null!==(r=Ew.getState().projectInfo.counter)&&void 0!==r?r:0;!function(e,t,l,i){if(!s.uid||!a)return;var r=Tw.resizeCanvas(a,i).toDataURL(),n=aP(e,l,r);$T.a.firestore().collection("users").doc(s.uid).collection("projects").doc(t).update({designs:$T.a.firestore.FieldValue.arrayUnion(n),counter:$T.a.firestore.FieldValue.increment(1)}).then((function(){o((function(e){var t;null===(t=e.projectInfo.designs)||void 0===t||t.push(n),e.projectInfo.counter++,e.designProjectType=e.projectInfo.type,e.cloudFile=n.title})),Xe(l,!0,!0)})).catch((function(e){Qh(me.t("message.CannotAddDesignToProject",ze)+": "+e)})).finally((function(){_(!1)}))}(n,t,t+" "+d,c)}}}),(function(){return n("curateDesignToProjectFlag",!1)})),Object(r.useEffect)((function(){Te(F)}),[k]),Object(r.useEffect)((function(){xe(null!==R&&void 0!==R?R:"My Aladdin File")}),[R]),Object(r.useEffect)((function(){He.current?He.current=!1:We(s)}),[s.signFile,s.schoolID,s.classID]);var De=function(){var e=new URLSearchParams(window.location.search),t=e.get("userid");if(t){var l=e.get("title"),a=e.get("project");a?(_(!0),eP(t,a,Ne).finally((function(){_(!1)})),l&&Ve(t,l)):l&&qe(t,l)}else o((function(e){e.cloudFile=void 0}))},Me=function(){var e=Object(Eh.a)(Lh.a.mark((function e(t){var l,a,i,r,n,c,s,d,u,h,p;return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return l=$T.a.firestore(),a=!1,i=!1,r=0,n=j.UNKNOWN,c=H.UNKNOWN,s=[],d=[],u=[],e.next=11,l.collection("users").get().then((function(e){r=e.size;var l,o=Object(f.a)(e.docs);try{for(o.s();!(l=o.n()).done;){var h=l.value;if(h.id===t.uid){var p=h.data();return a=!!p.signFile,i=!!p.noLogging,n=p.schoolID?p.schoolID:j.UNKNOWN,c=p.classID?p.classID:H.UNKNOWN,p.likes&&(s=p.likes),p.published&&(d=p.published),p.aliases&&(u=p.aliases),!0}}}catch(y){o.e(y)}finally{o.f()}return!1}));case 11:e.sent?(o((function(e){e.user.signFile=a,e.user.noLogging=i,e.user.schoolID=n,e.user.classID=c,e.user.likes=s,e.user.published=d,e.user.aliases=u})),Tf.setState((function(e){e.userCount=r})),t.signFile=a,t.noLogging=i,t.schoolID=n,t.classID=c,t.likes=s,t.published=d,t.aliases=u):t.uid&&l.collection("users").doc(t.uid).set({uid:t.uid,signFile:!!t.signFile,noLogging:!!t.noLogging,schoolID:null!==(h=t.schoolID)&&void 0!==h?h:j.UNKNOWN,classID:null!==(p=t.classID)&&void 0!==p?p:H.UNKNOWN,since:x()(new Date).format("MM/DD/YYYY hh:mm A"),os:Tw.getOS()}).then((function(){Kh(me.t("message.YourAccountWasCreated",ze))})).catch((function(e){Qh(me.t("message.CannotCreateAccount",ze)+": "+e)}));case 13:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),We=function(e){var t,l;e.uid&&$T.a.firestore().collection("users").doc(e.uid).update({signFile:!!e.signFile,schoolID:null!==(t=e.schoolID)&&void 0!==t?t:j.UNKNOWN,classID:null!==(l=e.classID)&&void 0!==l?l:H.UNKNOWN}).then((function(){Kh(me.t("message.YourAccountSettingsWereSaved",ze))})).catch((function(e){Qh(me.t("message.CannotSaveYourAccountSettings",ze)+": "+e)}))},Ie=function(){var e=Object(Eh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return _(!0),e.next=3,$T.a.firestore().collection("models").get().then((function(e){var t=new Map;return e.forEach((function(e){var l=e.data();if(l){var a=new Map;for(var o in l){var i;if(!l[o].countryCode)(null===(i=l[o].address)||void 0===i?void 0:i.endsWith("USA"))&&(l[o].countryCode="US");a.set(o,l[o])}t.set(e.id,a)}})),o((function(e){e.modelSites=t})),t})).catch((function(e){Qh(me.t("message.CannotLoadModelsOnMap",ze)+": "+e)})).finally((function(){_(!1)}));case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),Ce=function(){var e=Object(Eh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,$T.a.firestore().collection("board").doc("info").get().then((function(e){if(e.exists){var t=e.data();t&&t.latestModel&&o((function(e){var l,a=!1,o=t.latestModel;o.author&&(a=!!(null===(l=e.peopleModels.get(o.author))||void 0===l?void 0:l.get(Tw.getModelKey(o))));e.latestModelSite=a?o:void 0}))}})).catch((function(e){console.log(e)}));case 2:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),Oe=function(){var e=Object(Eh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return _(!0),e.next=3,$T.a.firestore().collection("board").doc("people").get().then((function(e){var t=e.data();if(t){var l=new Map;for(var a in t)l.set(a,new Map(Object.entries(t[a])));o((function(e){e.peopleModels=l}))}})).catch((function(e){Qh(me.t("message.CannotLoadLeaderboard",ze)+": "+e)})).finally((function(){_(!1)}));case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),Fe=function(e,t){var l;s&&s.uid&&($T.a.firestore().collection("models").doc(Tw.getLatLngKey(e.latitude,e.longitude)).update(Object(sR.a)({},Tw.getModelKey(e),$T.a.firestore.FieldValue.delete())).then((function(){Bh(me.t("message.ModelDeletedFromMap",ze)),t&&t()})).catch((function(e){Qh(me.t("message.CannotDeleteModelFromMap",ze)+": "+e)})),$T.a.firestore().collection("board").doc("people").update(Object(sR.a)({},(null!==(l=e.author)&&void 0!==l?l:"Anonymous")+"."+Tw.getModelKey(e),$T.a.firestore.FieldValue.delete())).then((function(){o((function(t){t.peopleModels&&(t.peopleModels.delete(Tw.getModelKey(e)),Tf.setState((function(e){e.leaderboardFlag=!0})))}))})),$T.a.firestore().collection("users").doc(s.uid).update({published:$T.a.firestore.FieldValue.arrayRemove(e.title)}).then((function(){o((function(t){if(t.user&&t.user.published&&t.user.published.includes(e.title)){var l=t.user.published.indexOf(e.title);l>=0&&t.user.published.splice(l,1)}}))})))},ke=function(e,t,l){if(s&&s.uid){var a=Tw.getModelKey(e);$T.a.firestore().collection("users").doc(s.uid).update(t?{likes:$T.a.firestore.FieldValue.arrayUnion(a)}:{likes:$T.a.firestore.FieldValue.arrayRemove(a)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotLikeModelFromMap",ze)+": "+e)}));var o=a+".likeCount";$T.a.firestore().collection("models").doc(Tw.getLatLngKey(e.latitude,e.longitude)).update(t?Object(sR.a)({},o,$T.a.firestore.FieldValue.increment(1)):Object(sR.a)({},o,$T.a.firestore.FieldValue.increment(-1))).then((function(){l&&l()})).catch((function(e){Qh(me.t("message.CannotLikeModelFromMap",ze)+": "+e)}))}},Ye=function(e,t,l){s&&s.uid&&$T.a.firestore().collection("models").doc(Tw.getLatLngKey(e.latitude,e.longitude)).update(Object(sR.a)({},Tw.getModelKey(e)+".pinned",t)).then((function(){l&&l()})).catch((function(e){}))},Le=function(e){s&&s.uid&&$T.a.firestore().collection("models").doc(Tw.getLatLngKey(e.latitude,e.longitude)).update(Object(sR.a)({},Tw.getModelKey(e)+".clickCount",$T.a.firestore.FieldValue.increment(1))).then((function(){})).catch((function(e){}))},Ee=function(){var e=Object(Eh.a)(Lh.a.mark((function e(t){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s.uid){e.next=2;break}return e.abrupt("return");case 2:return t||_(!0),e.next=5,$T.a.firestore().collection("users").doc(s.uid).collection("projects").get().then((function(e){var t=[];return e.forEach((function(e){var l,a,o,i,r=e.data();t.push({owner:s.uid,title:e.id,timestamp:r.timestamp,description:r.description,dataColoring:r.dataColoring,selectedProperty:r.selectedProperty,sortDescending:r.sortDescending,xAxisNameScatteredPlot:r.xAxisNameScatteredPlot,yAxisNameScatteredPlot:r.yAxisNameScatteredPlot,dotSizeScatteredPlot:r.dotSizeScatteredPlot,thumbnailWidth:r.thumbnailWidth,type:r.type,designs:null!==(l=r.designs)&&void 0!==l?l:[],ranges:null!==(a=r.ranges)&&void 0!==a?a:[],hiddenParameters:null!==(o=r.hiddenParameters)&&void 0!==o?o:kw.getDefaultHiddenParameters(r.type),counter:null!==(i=r.counter)&&void 0!==i?i:0})})),t})).catch((function(e){Qh(me.t("message.CannotOpenYourProjects",ze)+": "+e)})).finally((function(){t||_(!1)}));case 5:Se.current=e.sent;case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),Ue=function(e){s.uid&&Ee(!e).then((function(){e&&Tf.setState((function(e){e.showProjectListPanel=!0})),pe(!he)}))},Ne=function(e){o((function(t){t.projectInfo=Object(d.a)({},e),t.projectImages.clear(),t.projectView=!0})),Tf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag,e.updateProjectsFlag=!0}))},Ve=function(e,t){e&&t&&(_(!0),cP(e,t,!0,!0,l).finally((function(){_(!1)})))},Je=function(e,t,l){if(s.uid){var a=e.trim();0!==a.length?(_(!0),l?Qe().then((function(){var e=!1;if(Pe.current){var l,i=Object(f.a)(Pe.current);try{for(i.s();!(l=i.n()).done;){if(l.value.fileName===a){e=!0;break}}}catch(r){i.e(r)}finally{i.f()}}e?Zv.a.confirm({title:me.t("message.CloudFileWithTitleExistsDoYouWantToOverwrite",ze),icon:Object(gf.jsx)(hR.a,{}),onOk:function(){Xe(a,t)},onCancel:function(){o((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0}))},okText:me.t("word.Yes",ze),cancelText:me.t("word.No",ze)}):Xe(a,t)})):Xe(a,t),Te(!1)):Qh(me.t("menu.file.SavingAbortedMustHaveValidTitle",ze)+".")}},Xe=function(e,t,l){if(s.uid)try{var a=$T.a.firestore().collection("users").doc(s.uid);a&&(U&&Tf.setState((function(e){e.waiting=!0})),a.collection(l?"designs":"files").doc(e).set(w()).then((function(){if(t||(o((function(t){t.cloudFile=e})),Tf.getState().setChanged(!1)),U)"CREATE_NEW_FILE"===U?L():Y(U);else if(!l){var a=Ge+"?client=web&userid="+s.uid+"&title="+encodeURIComponent(e);window.history.pushState({},document.title,a)}v&&Qe().then((function(){le(!te)}))})).catch((function(e){Qh(me.t("message.CannotSaveYourFileToCloud",ze)+": "+e)})).finally((function(){_(!1)})))}catch(i){Qh(me.t("message.CannotSaveYourFileToCloud",ze)+": "+i),_(!1)}},Be=function(e,t){E?Zv.a.confirm({title:me.t("message.DoYouWantToSaveChanges",ze),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){R?(Je(R,!0,!1),qe(e,t)):o((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0}))},onCancel:function(){qe(e,t)},okText:me.t("word.Yes",ze),cancelText:me.t("word.No",ze)}):qe(e,t)},Ke=function(e){E?Zv.a.confirm({title:me.t("message.DoYouWantToSaveChanges",ze),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){R?(Je(R,!0,!1),qe(e.userid,e.title),Le(e)):o((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0}))},onCancel:function(){qe(e.userid,e.title),Le(e)},okText:me.t("word.Yes",ze),cancelText:me.t("word.No",ze)}):(qe(e.userid,e.title),Le(e))},qe=function(e,t,a){e&&t&&(_(!0),cP(e,t,!1,a,l).finally((function(){_(!1)})))},Qe=function(){var e=Object(Eh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s.uid){e.next=2;break}return e.abrupt("return");case 2:return _(!0),e.next=5,$T.a.firestore().collection("users").doc(s.uid).collection("files").get().then((function(e){var t=[];return e.forEach((function(e){var l=e.data();t.push({timestamp:l.timestamp,fileName:e.id,userid:s.uid,uuid:l.docid})})),t})).catch((function(e){Qh(me.t("message.CannotOpenCloudFolder",ze)+": "+e)})).finally((function(){_(!1)}));case 5:Pe.current=e.sent;case 6:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return l?Object(gf.jsx)(gf.Fragment,{children:P&&Object(gf.jsx)(fD,{openCloudFile:Ke,deleteModelFromMap:Fe,likeModelFromMap:ke,pinModelFromMap:Ye})}):Object(gf.jsxs)(gf.Fragment,{children:[Z&&Object(gf.jsx)(Hv,{}),Object(gf.jsx)(ND,{saveToCloud:Je,isLoading:function(){return Z},setTitle:xe,getTitle:function(){return we},setTitleDialogVisible:Te,isTitleDialogVisible:function(){return Ae}}),Object(gf.jsx)(ED,{signIn:function(){var e=new $T.a.auth.GoogleAuthProvider;$T.a.auth().signInWithPopup(e).then((function(e){o((function(t){e.user&&(t.user.uid=e.user.uid,t.user.email=e.user.email,t.user.displayName=e.user.displayName,t.user.photoURL=e.user.photoURL,Me(Object(d.a)({},t.user)).then((function(){})))}))})).catch((function(e){"auth/popup-closed-by-user"!==e.code&&"auth/cancelled-popup-request"!==e.code&&Qh(me.t("message.CannotSignIn",ze)+": "+e)})),o((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1}))},signOut:function(){$T.a.auth().signOut().then((function(){o((function(e){e.user.uid=null,e.user.email=null,e.user.displayName=null,e.user.photoURL=null,e.user.signFile=!1,e.user.likes=[],e.user.published=[],e.user.aliases=[],e.cloudFile=void 0})),Tf.setState((function(e){e.showCloudFilePanel=!1,e.showAccountSettingsPanel=!1,e.showModelsGallery=!1,e.showProjectListPanel=!1}))})).catch((function(e){Qh(me.t("message.CannotSignOut",ze)+": "+e)}))}}),v&&Pe.current&&Object(gf.jsx)(bR,{cloudFileArray:ie,openCloudFile:Be,deleteCloudFile:function(e,t){$T.a.firestore().collection("users").doc(e).collection("files").doc(t).delete().then((function(){re(ie.filter((function(l){return l.userid!==e||l.title!==t}))),o((function(e){t===e.cloudFile&&(e.cloudFile=void 0)}))})).catch((function(e){Qh(me.t("message.CannotDeleteCloudFile",ze)+": "+e)}))},renameCloudFile:function(e,t,l){var a=$T.a.firestore().collection("users").doc(e).collection("files");a.doc(t).get().then((function(i){if(i&&i.exists){var r=i.data();r&&a.doc(l).set(r).then((function(){a.doc(t).delete().then((function(){}));var i,r=Object(f.a)(ie);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.userid===e&&n.title===t){n.title=l;break}}}catch(u){r.e(u)}finally{r.f()}re(Object(h.a)(ie)),o((function(e){e.cloudFile===t&&(e.cloudFile=l)}));var c=new URLSearchParams(window.location.search);if(c.get("title")===t&&c.get("userid")===s.uid){var d=Ge+"?client=web&userid="+s.uid+"&title="+encodeURIComponent(l);window.history.pushState({},document.title,d)}}))}})).catch((function(e){Qh(me.t("message.CannotRenameCloudFile",ze)+": "+e)}))}}),b&&Se.current&&Object(gf.jsx)(qD,{projects:se,setProjectState:Ne,deleteProject:function(e){s.uid&&$T.a.firestore().collection("users").doc(s.uid).collection("projects").doc(e).delete().then((function(){if(Se.current&&s.uid){var t,l=Object(f.a)(Se.current);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.title===e&&a.designs){var i,r=Object(f.a)(a.designs);try{var n=function(){var e=i.value;o((function(t){e.title===t.cloudFile&&(t.cloudFile=void 0)})),$T.a.firestore().collection("users").doc(s.uid).collection("designs").doc(e.title).delete().then((function(){})).catch((function(e){Qh(me.t("message.CannotDeleteCloudFile",ze)+": "+e)}))};for(r.s();!(i=r.n()).done;)n()}catch(c){r.e(c)}finally{r.f()}break}}}catch(c){l.e(c)}finally{l.f()}Se.current=Se.current.filter((function(t){return t.title!==e})),le(!te)}o((function(t){e===t.projectInfo.title&&(t.projectInfo.title=null,t.projectInfo.description=null,t.projectInfo.dataColoring=z.ALL,t.projectInfo.selectedProperty=null,t.projectInfo.sortDescending=!1,t.projectInfo.xAxisNameScatteredPlot=null,t.projectInfo.yAxisNameScatteredPlot=null,t.projectInfo.dotSizeScatteredPlot=5,t.projectInfo.thumbnailWidth=200,t.projectInfo.counter=0,t.projectInfo.designs=[],t.projectInfo.ranges=[],t.projectInfo.hiddenParameters=kw.getDefaultHiddenParameters(t.projectInfo.type),t.designProjectType=null,t.projectView=!1)}))})).catch((function(e){Qh(me.t("message.CannotDeleteProject",ze)+": "+e)}))},renameProject:function(e,t){Ee(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(f.a)(Se.current);try{for(i.s();!(a=i.n()).done;){if(a.value.title===t){l=!0;break}}}catch(n){i.e(n)}finally{i.f()}}if(l)Kh(me.t("message.TitleUsedChooseDifferentOne",ze)+": "+t);else{if(!s.uid)return;var r=$T.a.firestore().collection("users").doc(s.uid).collection("projects");r.doc(e).get().then((function(l){if(l&&l.exists){var a=l.data();if(a&&s.uid){var i=Object(d.a)({},a);if(a.designs&&a.designs.length>0){var c,h,p=null!==(c=oP(t,a.designs))&&void 0!==c?c:[],y=Object(f.a)(a.designs.entries());try{for(y.s();!(h=y.n()).done;){var g=Object(u.a)(h.value,2),m=g[0],w=g[1];nP(w.title,p[m].title,a.owner,s.uid)}}catch(n){y.e(n)}finally{y.f()}i.designs=p,o((function(e){e.projectInfo.designs=p}))}r.doc(t).set(i).then((function(){if(r.doc(e).delete().then((function(){})),Se.current){var l,a=[],i=Object(f.a)(Se.current);try{for(i.s();!(l=i.n()).done;){var c,s=l.value;if(s.title===e)a.push({owner:s.owner,timestamp:s.timestamp,title:t,description:s.description,type:s.type,designs:s.designs,ranges:null!==(c=s.ranges)&&void 0!==c?c:null,hiddenParameters:s.hiddenParameters,counter:s.counter});else a.push(s)}}catch(n){i.e(n)}finally{i.f()}Se.current=a,le(!te)}o((function(l){l.projectInfo.title===e&&(l.projectInfo.title=t)}))}))}}})).catch((function(e){Qh(me.t("message.CannotRenameProject",ze)+": "+e)}))}}))}}),A&&Object(gf.jsx)(cD,{author:void 0,models:je.current,openCloudFile:Be,closeCallback:function(){n("showModelsGallery",!1),je.current=void 0}}),T&&Object(gf.jsx)(LR,{openCloudFile:qe}),P&&Object(gf.jsx)(fD,{openCloudFile:Ke,deleteModelFromMap:Fe,likeModelFromMap:ke,pinModelFromMap:Ye})]})},_D=n.a.memo(ZD),$D=(l(730),function(){var e,t,l=Ew(Xi),a=Ew(Bi),o=Ew(di),i=Ew(ar),n=Object(r.useRef)(!0),c=Object(r.useRef)(!0),s=Object(r.useRef)(),d=null!==(e=o.schoolID)&&void 0!==e?e:j.UNKNOWN,u=null!==(t=o.classID)&&void 0!==t?t:H.UNKNOWN;return Object(r.useEffect)((function(){var e,t=void 0,l=Object(f.a)($T.a.apps);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.name===S.LOG_DATA){t=a;break}}}catch(o){l.e(o)}finally{l.f()}t||(t=$T.a.initializeApp({apiKey:"AIzaSyD-236qE4ix9TkH2AW_wjKSz8jgK0ukjW0",authDomain:"aladdin-316017.firebaseapp.com",projectId:"aladdin-316017",storageBucket:"aladdin-316017.appspot.com",databaseURL:"https://aladdin-2023.firebaseio.com",messagingSenderId:"169516488625",appId:"1:169516488625:web:bb0ae3c3f7c6e813250f90"},S.LOG_DATA)),t&&(s.current=$T.a.database(t))}),[]),Object(r.useEffect)((function(){if(n.current)n.current=!1;else if(a){var e=a.timestamp+" ("+x()(new Date(a.timestamp)).format("MM-DD-YYYY hh:mm A")+")";s.current.ref(d+"/"+u+"/"+o.uid+"/"+e).set({file:null!==i&&void 0!==i?i:"Untitled",action:JSON.stringify(a)})}}),[a,o.uid,u,d,i]),Object(r.useEffect)((function(){if(c.current)c.current=!1;else if(l){var e=l.timestamp+" ("+x()(new Date(l.timestamp)).format("MM-DD-YYYY hh:mm A")+")";s.current.ref(d+"/"+u+"/"+o.uid+"/"+e).set({file:null!==i&&void 0!==i?i:"Untitled",action:JSON.stringify(l)})}}),[l,o.uid,u,d,i]),Object(gf.jsx)(gf.Fragment,{})}),eM=n.a.memo($D),tM=function(){var e=Ew(o.directLightIntensity),t=Ew(o.ambientLightIntensity),l=Ew(Es),a=Ew(Kr),i=2*a,n=a+100,c=Object(r.useRef)();c.current&&(c.current.shadow.camera.left=-n,c.current.shadow.camera.bottom=-n,c.current.shadow.camera.right=n,c.current.shadow.camera.top=n,c.current.shadow.camera.updateProjectionMatrix());var s=l.z>0,d=s?l.normalize().dot(Rt):0;return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("ambientLight",{intensity:.1+(s?(null!==t&&void 0!==t?t:.1)*d:0),name:"Ambient Light"}),Object(gf.jsx)("directionalLight",{ref:c,name:"Directional Light",color:"white",position:l.normalize().multiplyScalar(i),intensity:s?(null!==e&&void 0!==e?e:1)*d:0,castShadow:!0,"shadow-mapSize-height":16384,"shadow-mapSize-width":16384,"shadow-camera-near":1,"shadow-camera-far":ct})]})},lM=n.a.memo(tM),aM=function(e){var t=e.element,l=Ew(qr),a=Ew(Ru),o=Ew(Hu),i=Ew(Du),n=t.type===V.Roof,c="lightGray",s=Object(Se.e)(Me.FontLoader,ty),d={font:s,height:0,size:.2},u={font:s,height:0,size:.35},f=Object(r.useMemo)((function(){return i(t,null!==a&&void 0!==a?a:o)}),[a,o]),h=Object(r.useMemo)((function(){var e=-Math.atan2(l.x,l.y)+Math.PI;return new Me.Euler(vt,0,e,"ZXY")}),[l.x,l.y]);if(!a&&!o)return null;var p=function(){var e=t.lz;return n&&(e=Ew.getState().selectedElementHeight),Math.ceil(e)+1}(),y=function(){var e=t.lz;return n&&(e=t.rise),e.toFixed(1)+" m"}(),g=n?Ew.getState().selectedElementHeight+1:t.lz-.175,m=new Array(p+1).fill(0);return Object(gf.jsxs)("group",{position:f,rotation:h,name:"Vertical Ruler",children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[0,p,0]],color:c}),Object(gf.jsxs)("mesh",{position:[-1.5,g,0],userData:{unintersectable:!0},children:[Object(gf.jsx)("textGeometry",{args:[y,u]}),Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})]}),m.map((function(e,t){var l=.2+(t%5===0?.05:0),a=Object(gf.jsx)("textGeometry",{args:["".concat(t),d]});return Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-l,t,0],[l,t,0]],lineWidth:.5,color:c}),!n&&Object(gf.jsxs)("mesh",{position:[.4,t-.125,0],userData:{unintersectable:!0},children:[a,Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:c})]})]},t)}))]})},oM=function(){var e=Ew(zu),t=Ew(Mu),l=Ew(Ru),a=Ew(Hu),i=Ew(o.groundImage),n=Ew(Kr),c=Ew(Fu),s=Ew(Cu),d=Ew((function(e){if(e.selectedElement){var t=e.selectedElement.id;return e.elements.find((function(e){return e.id===t}))}})),f=Object(r.useState)(!1),h=Object(u.a)(f,2),p=h[0],y=h[1],g=Object(r.useState)(2*n),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useState)(2*n),b=Object(u.a)(v,2),A=b[0],T=b[1];Object(r.useEffect)((function(){var e=Math.floor(n/50)+1,t=2*Math.round(n/e);x(t*e),T(t)}),[n]),Object(r.useEffect)((function(){if(l){var e=Tw.isTopResizeHandle(l)||l===K.UpperLeft&&(null===d||void 0===d?void 0:d.type)===V.Wall||l===K.UpperRight&&(null===d||void 0===d?void 0:d.type)===V.Wall;y(!e)}else y(!1)}),[l]);var P=function(){if(!d)return!1;var e=d.type;return e===V.Foundation||e===V.Cuboid||e===V.Tree&&d.parentId===V.Ground||e===V.Human&&d.parentId===V.Ground},S=a===q.Lower||a===q.Upper,j=function(e){return Tw.isTopResizeHandle(e)||(null===d||void 0===d?void 0:d.type)===V.Wall&&Tw.isTopResizeHandleOfWall(e)||(null===d||void 0===d?void 0:d.type)===V.Roof&&Tw.isRiseHandleOfRoof(e)}(null!==l&&void 0!==l?l:a);return d?Object(gf.jsxs)(gf.Fragment,{children:[((p||e||Tw.isMoveHandle(a))&&!i&&P()||c||s)&&Object(gf.jsx)("gridHelper",{rotation:[vt,0,0],name:"Grid",args:[w,A,"gray","#444444"]}),(t||S)&&d&&P()&&Object(gf.jsx)(ly,{element:d}),j&&Object(gf.jsx)(aM,{element:d})]}):null},iM="black",rM="white",nM=function(e){var t=e.visible,l=void 0===t||t,a=Object(r.useRef)(null),o=$f(),i=120*window.devicePixelRatio,n=i/150,c=20*n+"px serif";return Object(r.useEffect)((function(){a.current&&Et.setState((function(e){e.compassRef=a}))}),[]),Object(r.useEffect)((function(){if(a.current){var e=a.current.getContext("2d");if(e){var t=55*n,l=10*n,r=40*n,s=5*n,d=30*n,u=1*n,f=1*n,h=15*n,p=i/2;e.clearRect(0,0,i,i),e.beginPath(),e.arc(p,p,r,0,2*Math.PI),e.lineWidth=s,e.strokeStyle=iM,e.stroke(),e.beginPath(),e.arc(p,p,d,0,2*Math.PI),e.lineWidth=u,e.strokeStyle=iM,e.stroke(),e.lineWidth=f,e.beginPath(),e.moveTo(p,p-t),e.lineTo(p-l,p-l),e.lineTo(p,p),e.fillStyle=rM,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p-t),e.lineTo(p+l,p-l),e.lineTo(p,p),e.fillStyle=iM,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p+t),e.lineTo(p-l,p+l),e.lineTo(p,p),e.fillStyle=iM,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p+t),e.lineTo(p+l,p+l),e.lineTo(p,p),e.fillStyle=rM,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p-t,p),e.lineTo(p-l,p-l),e.lineTo(p,p),e.fillStyle=iM,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p-t,p),e.lineTo(p-l,p+l),e.lineTo(p,p),e.fillStyle=rM,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p+t,p),e.lineTo(p+l,p-l),e.lineTo(p,p),e.fillStyle=rM,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p+t,p),e.lineTo(p+l,p+l),e.lineTo(p,p),e.fillStyle=iM,e.stroke(),e.fill(),e.font=c,e.fillStyle=rM,e.textAlign="center",e.fillText("".concat(me.t("compass.N",o)),p,h),e.save(),e.translate(i,i),e.rotate(Math.PI),e.fillText("".concat(me.t("compass.S",o)),p,h),e.restore(),e.fillStyle=iM,e.save(),e.translate(0,i),e.rotate(-Math.PI/2),e.fillText("".concat(me.t("compass.W",o)),p,h),e.restore(),e.save(),e.translate(i,0),e.rotate(Math.PI/2),e.fillText("".concat(me.t("compass.E",o)),p,h),e.restore()}}}),[o]),l?Object(gf.jsx)("canvas",{ref:a,id:"compassCanvas",width:i,height:i,style:{position:"absolute",bottom:"0",right:"0",height:"".concat(120,"px"),width:"".concat(120,"px"),margin:"5px",pointerEvents:"none"}}):null},cM=n.a.memo(nM),sM=l(344),dM=l.n(sM),uM=n.a.memo((function(){var e,t,l=Ew(si),a=Ew(lf),o=Ew(tf),i=Ew(Sr),n=Object(r.useRef)(!1),c=Object(r.useRef)(!1);Ew(Nu),Ew(Ju),Tf((function(e){return e.selectedElementId})),Object(r.useEffect)((function(){Et.setState((function(e){e.listenToAutoDeletionByDeleteRef=n,e.listenToAutoDeletionByCutRef=c}))}),[]);var s=Object(Ly.debounce)((function(){var e,t,r=Tf.getState().selectedElementId,n=Ew.getState().selectedElementIdSet;if(r&&0!==n.size){var c=Ew.getState().getAutoDeletedElements();if(c){var s=Ew.getState().deletedElements,d=Ew.getState().elementsToPaste,u=null===(e=Et.getState().listenToAutoDeletionByCutRef)||void 0===e?void 0:e.current,p=null===(t=Et.getState().listenToAutoDeletionByDeleteRef)||void 0===t?void 0:t.current,y=[],g="";u?(Et.getState().setListenToAutoDeletionByCut(!1),y=[].concat(Object(h.a)(d),Object(h.a)(c)),g="Cut"):p&&(Et.getState().setListenToAutoDeletionByDelete(!1),y=[].concat(Object(h.a)(s),Object(h.a)(c)),g="Delete");var m={name:g,timestamp:Date.now(),deletedElements:Object(h.a)(y),selectedElementId:r,selectedElementIdSet:new Set(n),undo:function(){var e,t=this,i=m.deletedElements;if(i&&0!==i.length){var r,n=Object(f.a)(this.deletedElements);try{var c=function(){var e=r.value;if(e.type===V.Wall){var t=e;t.leftJoints.length>0&&a(t.leftJoints[0],[t.id]),t.rightJoints.length>0&&o(t.rightJoints[0],[t.id])}else e.type===V.Roof&&l((function(t){t.addedRoofIdSet.add(e.id)}))};for(n.s();!(r=n.n()).done;)c()}catch(d){n.e(d)}finally{n.f()}var s=null!==(e=i.find((function(e){return e.id===t.selectedElementId})))&&void 0!==e?e:null;l((function(e){var l;(l=e.elements).push.apply(l,Object(h.a)(i)),e.selectedElement=s,e.selectedElementIdSet=new Set(t.selectedElementIdSet),e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.deletedRoofId=null,e.autoDeletedRoofs=null,e.deletedRoofIdSet.clear(),e.autoDeletedRoofIdSet.clear(),e.autoDeletedChild=null}))}},redo:function(){var e=this;0!==m.deletedElements.length&&(l((function(t){var l;t.selectedElement=null!==(l=t.elements.find((function(t){return t.id===e.selectedElementId})))&&void 0!==l?l:null,t.selectedElementIdSet=new Set(e.selectedElementIdSet)})),Ew.getState().removeSelectedElements())}};i(m),l((function(e){e.selectedElement=null,e.selectedElementIdSet.clear(),e.deletedRoofId=null,e.deletedRoofIdSet.clear(),e.autoDeletedRoofs=null,e.autoDeletedRoofIdSet.clear(),e.autoDeletedChild=null})),Tf.getState().setPrimitiveStore("selectedElementId",null)}}}),50);return((null===(e=Et.getState().listenToAutoDeletionByCutRef)||void 0===e?void 0:e.current)||(null===(t=Et.getState().listenToAutoDeletionByDeleteRef)||void 0===t?void 0:t.current))&&Ew.getState().getAutoDeletedElements()&&s(),null})),fM=["left","up","right","down","shift+left","shift+up","shift+right","shift+down","ctrl+shift+left","ctrl+shift+up","ctrl+shift+right","ctrl+shift+down","meta+shift+left","meta+shift+up","meta+shift+right","meta+shift+down","ctrl+f","meta+f","ctrl+o","meta+o","ctrl+s","meta+s","ctrl+c","meta+c","ctrl+x","meta+x","ctrl+v","meta+v","ctrl+[","meta+[","ctrl+]","meta+]","ctrl+z","meta+z","ctrl+y","meta+y","ctrl+m","meta+m","ctrl+u","meta+u","ctrl+b","meta+b","shift","esc","ctrl+home","ctrl+alt+h","ctrl+shift+o","meta+shift+o","ctrl+shift+s","meta+shift+s","delete","backspace","alt+backspace","f2","f4","ctrl"],hM=function(e){var t,l=e.canvas,a=e.set2DView,i=e.setNavigationView,n=e.resetView,c=e.zoomView,s=Ew(si),d=Ew(Gi),u=Ew(rs),p=Ew(Vi),y=Ew(Pr),g=Ew(Sr),m=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,w=Ew(on),x=Ew(Zr),v=Ew(Kc),b=Ew(qc),A=Ew(as),T=Ew($r),P=Ew(wn),S=Ew(xn),j=Ew(tf),H=Ew(lf),z=Ew(Ts),R=Ew(rn),D=.1,M=Object(r.useMemo)((function(){return{lng:p}}),[p]),W=function(e,t){return l&&(l.style.cursor="default"),b(e,t)},I=function(e,t,l){var a=JSON.parse(JSON.stringify(e));if(a.cx=t,a.cy=l,e.type===V.SolarPanel&&e.parentType===V.Roof){if(e.parentId&&e.foundationId){var o=x(e.parentId),i=x(e.foundationId);if(o&&i){var r=Vm.getRoofBoundaryVertices(o),n=Vm.getSolarPanelVerticesOnRoof(a,i);if(!xp(n,r)||!vp(a,i,n))return!1}}return!0}if(R(a))return Qh(me.t("message.MoveCancelledBecauseOfOverlap",M)),!1;if(a.type===V.SolarPanel){var c=T(e);if(c&&!Tw.isSolarCollectorWithinHorizontalSurface(a,c))return Qh(me.t("message.MoveOutsideBoundaryCancelled",M)),!1}return!0},C=function(e){if(m){var t=w();if(t){var l=0;switch(t.type){case V.Foundation:case V.Cuboid:l=-.1,Ew.getState().groupActionMode&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag}));break;case V.Tree:case V.Flower:case V.Human:l=-.1;break;case V.Wall:var a=t;0===a.leftJoints.length&&0===a.rightJoints.length&&(l=-.1);break;case V.Sensor:var o=T(t);if(o){var i=t.lx/(2*o.lx);l=Math.max(-.5+i,t.cx-D/o.lx)-t.cx}break;case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:var r=T(t);r&&(l=-.1/r.lx)}if(0!==l){var n=!0;if(t.type===V.SolarPanel&&(n=I(t,t.cx+l,t.cy)),n){l*=e;var c={name:"Move Left",timestamp:Date.now(),displacement:l,movedElementId:t.id,movedElementType:t.type,undo:function(){var e=Ew.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx-c.displacement)},redo:function(){var e=Ew.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx+c.displacement)}};g(c),P(t.id,t.cx+l)}}}else{var d=-.1*e,u={name:"Move All Left",timestamp:Date.now(),displacement:d,undo:function(){var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Tw.isFoundationOrCuboid(l)||Tw.isPlantOrHuman(l)&&l.parentId===xt)&&P(l.id,l.cx-u.displacement)}}catch(a){t.e(a)}finally{t.f()}},redo:function(){var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Tw.isFoundationOrCuboid(l)||Tw.isPlantOrHuman(l)&&l.parentId===xt)&&P(l.id,l.cx+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var h,p=Object(f.a)(Ew.getState().elements);try{for(p.s();!(h=p.n()).done;){var y=h.value;(Tw.isFoundationOrCuboid(y)||Tw.isPlantOrHuman(y)&&y.parentId===xt)&&P(y.id,y.cx+d)}}catch(x){p.e(x)}finally{p.f()}}}},O=function(e){if(m){var t=w();if(t){var l=0;switch(t.type){case V.Foundation:case V.Cuboid:l=D,Ew.getState().groupActionMode&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag}));break;case V.Tree:case V.Flower:case V.Human:l=D;break;case V.Wall:var a=t;0===a.leftJoints.length&&0===a.rightJoints.length&&(l=D);break;case V.Sensor:var o=T(t);if(o){var i=o?t.lx/(2*o.lx):0;l=Math.min(.5-i,t.cx+D/o.lx)-t.cx}break;case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:var r=T(t);r&&(l=D/r.lx)}if(0!==l){var n=!0;if(t.type===V.SolarPanel&&(n=I(t,t.cx+l,t.cy)),n){l*=e;var c={name:"Move Right",timestamp:Date.now(),displacement:l,movedElementId:t.id,movedElementType:t.type,undo:function(){var e=Ew.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx-c.displacement)},redo:function(){var e=Ew.getState().getElementById(c.movedElementId);e&&P(e.id,e.cx+c.displacement)}};g(c),P(t.id,t.cx+l)}}}else{var d=D*e,u={name:"Move All Right",timestamp:Date.now(),displacement:d,undo:function(){var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Tw.isFoundationOrCuboid(l)||Tw.isPlantOrHuman(l)&&l.parentId===xt)&&P(l.id,l.cx-u.displacement)}}catch(a){t.e(a)}finally{t.f()}},redo:function(){var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Tw.isFoundationOrCuboid(l)||Tw.isPlantOrHuman(l)&&l.parentId===xt)&&P(l.id,l.cx+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var h,p=Object(f.a)(Ew.getState().elements);try{for(p.s();!(h=p.n()).done;){var y=h.value;(Tw.isFoundationOrCuboid(y)||Tw.isPlantOrHuman(y)&&y.parentId===xt)&&P(y.id,y.cx+d)}}catch(x){p.e(x)}finally{p.f()}}}},F=function(e){if(m){var t=w();if(t){var l=0;switch(t.type){case V.Foundation:case V.Cuboid:l=D,Ew.getState().groupActionMode&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag}));break;case V.Tree:case V.Flower:case V.Human:l=D;break;case V.Wall:var a=t;0===a.leftJoints.length&&0===a.rightJoints.length&&(l=D);break;case V.Sensor:var o=T(t);if(o){var i=o?t.ly/(2*o.ly):0;l=Math.min(.5-i,t.cy+D/o.ly)-t.cy}break;case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:var r=T(t);r&&(l=D/r.ly)}if(0!==l){var n=!0;if(t.type===V.SolarPanel&&(n=I(t,t.cx,t.cy+l)),n){l*=e;var c={name:"Move Up",timestamp:Date.now(),displacement:l,movedElementId:t.id,movedElementType:t.type,undo:function(){var e=Ew.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy-c.displacement)},redo:function(){var e=Ew.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy+c.displacement)}};g(c),S(t.id,t.cy+l)}}}else{var d=D*e,u={name:"Move All Up",timestamp:Date.now(),displacement:d,undo:function(){var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Tw.isFoundationOrCuboid(l)||Tw.isPlantOrHuman(l)&&l.parentId===xt)&&S(l.id,l.cy-u.displacement)}}catch(a){t.e(a)}finally{t.f()}},redo:function(){var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Tw.isFoundationOrCuboid(l)||Tw.isPlantOrHuman(l)&&l.parentId===xt)&&S(l.id,l.cy+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var h,p=Object(f.a)(Ew.getState().elements);try{for(p.s();!(h=p.n()).done;){var y=h.value;(Tw.isFoundationOrCuboid(y)||Tw.isPlantOrHuman(y)&&y.parentId===xt)&&S(y.id,y.cy+d)}}catch(x){p.e(x)}finally{p.f()}}}},k=function(e){if(m){var t=w();if(t){var l=0;switch(t.type){case V.Foundation:case V.Cuboid:l=-.1,Ew.getState().groupActionMode&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag}));break;case V.Tree:case V.Flower:case V.Human:l=-.1;break;case V.Wall:var a=t;0===a.leftJoints.length&&0===a.rightJoints.length&&(l=-.1);break;case V.Sensor:var o=T(t);if(o){var i=o?t.ly/(2*o.ly):0;l=Math.max(-.5+i,t.cy-D/o.ly)-t.cy}break;case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:var r=T(t);r&&(l=-.1/r.ly)}if(0!==l){var n=!0;if(t.type===V.SolarPanel&&(n=I(t,t.cx,t.cy+l)),n){l*=e;var c={name:"Move Down",timestamp:Date.now(),displacement:l,movedElementId:t.id,movedElementType:t.type,undo:function(){var e=Ew.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy-c.displacement)},redo:function(){var e=Ew.getState().getElementById(c.movedElementId);e&&S(e.id,e.cy+c.displacement)}};g(c),S(t.id,t.cy+l)}}}else{var d=-.1*e,u={name:"Move All Down",timestamp:Date.now(),displacement:d,undo:function(){var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Tw.isFoundationOrCuboid(l)||Tw.isPlantOrHuman(l)&&l.parentId===xt)&&S(l.id,l.cy-u.displacement)}}catch(a){t.e(a)}finally{t.f()}},redo:function(){var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;(Tw.isFoundationOrCuboid(l)||Tw.isPlantOrHuman(l)&&l.parentId===xt)&&S(l.id,l.cy+u.displacement)}}catch(a){t.e(a)}finally{t.f()}}};g(u);var h,p=Object(f.a)(Ew.getState().elements);try{for(p.s();!(h=p.n()).done;){var y=h.value;(Tw.isFoundationOrCuboid(y)||Tw.isPlantOrHuman(y)&&y.parentId===xt)&&S(y.id,y.cy+d)}}catch(x){p.e(x)}finally{p.f()}}}},Y=function(e){Ew.getState().set((function(t){t.multiSelectionsMode=e}))},L=function(e){var t=w();switch(e){case"left":C(1);break;case"shift+left":C(.2);break;case"ctrl+shift+left":case"meta+shift+left":C(5);break;case"right":O(1);break;case"shift+right":O(.2);break;case"ctrl+shift+right":case"meta+shift+right":O(5);break;case"down":k(1);break;case"shift+down":k(.2);break;case"ctrl+shift+down":case"meta+shift+down":k(5);break;case"up":F(1);break;case"shift+up":F(.2);break;case"ctrl+shift+up":case"meta+shift+up":F(5);break;case"ctrl+[":case"meta+[":c(.9);break;case"ctrl+]":case"meta+]":c(1.1);break;case"ctrl+c":case"meta+c":t&&t.type!==V.Roof&&(v(t.id),s((function(e){e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t.id)})),d&&s((function(e){e.actionInfo={name:"Copy",timestamp:(new Date).getTime(),elementId:t.id,elementType:t.type}})));break;case"ctrl+x":case"meta+x":if(!t||t.type===V.Roof)break;if(t.locked)Kh(me.t("message.ThisElementIsLocked",M));else{var l=W(t.id,!0);if(0===l.length)break;if(Tw.isElementTriggerAutoDeletion(t))Et.getState().setListenToAutoDeletionByCut(!0),Tf.getState().setPrimitiveStore("selectedElementId",t.id);else{var o={name:"Cut",timestamp:Date.now(),deletedElements:l,selectedElementId:t.id,undo:function(){var e=o.deletedElements;if(0!==e.length){var t=e.find((function(e){return e.id===o.selectedElementId}));t&&s((function(l){var a;if((a=l.elements).push.apply(a,Object(h.a)(e)),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t.id),l.selectedElement=t,t.type===V.Wall){var o=t,i=null,r=null;if(o.leftJoints.length>0&&(i=o.leftJoints[0]),o.rightJoints.length>0&&(r=o.rightJoints[0]),i||r){var n,c=Object(f.a)(l.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.id===i&&s.type===V.Wall&&(s.rightJoints[0]=o.id),s.id===r&&s.type===V.Wall&&(s.leftJoints[0]=o.id)}}catch(d){c.e(d)}finally{c.f()}}}}))}},redo:function(){o.deletedElements&&o.deletedElements.length>0&&W(o.deletedElements[0].id,!0)}};g(o)}}break;case"ctrl+v":case"meta+v":var r=A();if(r.length>0){var p={name:"Paste by Key",timestamp:Date.now(),pastedElements:JSON.parse(JSON.stringify(r)),undo:function(){var e,t=Object(f.a)(p.pastedElements);try{for(t.s();!(e=t.n()).done;){var l=e.value;b(l.id,!1)}}catch(a){t.e(a)}finally{t.f()}},redo:function(){s((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(p.pastedElements)),e.selectedElement=p.pastedElements[0]}))}};g(p)}break;case"ctrl+alt+h":case"ctrl+home":if(!m){var x=Ew.getState().viewState.cameraPosition,T=Ew.getState().viewState.panCenter;if(x[0]!==x[1]||x[1]!==x[2]||x[0]!==x[2]||0!==T[0]||0!==T[1]||0!==T[2]){var P={name:"Reset View",timestamp:Date.now(),oldCameraPosition:Object(h.a)(x),oldPanCenter:Object(h.a)(T),undo:function(){var e=Et.getState().orbitControlsRef;(null===e||void 0===e?void 0:e.current)&&(e.current.object.position.set(P.oldCameraPosition[0],P.oldCameraPosition[1],P.oldCameraPosition[2]),e.current.target.set(P.oldPanCenter[0],P.oldPanCenter[1],P.oldPanCenter[2]),e.current.update(),s((function(e){var t=e.viewState;t.cameraPosition=Object(h.a)(P.oldCameraPosition),t.panCenter=Object(h.a)(P.oldPanCenter)})))},redo:function(){n()}};g(P),s((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.viewState.orthographic=!1})),n()}}break;case"f2":case"ctrl+b":case"meta+b":!function(){if(!Ew.getState().viewState.navigationView){var e={name:"Set 2D View",timestamp:Date.now(),checked:!m,undo:function(){a(!e.checked)},redo:function(){a(e.checked)}};g(e),a(!m),s((function(e){e.viewState.autoRotate=!1}))}}();break;case"ctrl+u":case"meta+u":!function(){if(!m){var e={name:"Set Navigation View",timestamp:Date.now(),checked:!Ew.getState().viewState.navigationView,undo:function(){i(!e.checked)},redo:function(){i(e.checked)}};g(e),i(!Ew.getState().viewState.navigationView),s((function(e){e.viewState.autoRotate=!1}))}}();break;case"f4":case"ctrl+m":case"meta+m":!function(){if(!m){var e={name:"Auto Rotate",timestamp:Date.now(),checked:!Ew.getState().viewState.autoRotate,undo:function(){s((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.viewState.autoRotate=!e.checked}))},redo:function(){s((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.viewState.autoRotate=e.checked}))}};g(e),s((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.viewState.autoRotate=!e.viewState.autoRotate}))}}();break;case"ctrl+f":case"meta+f":s((function(e){e.createNewFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,window.history.pushState({},document.title,Ge),d&&(e.actionInfo={name:"Create New File",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.openModelsMap=!1}));break;case"ctrl+s":case"meta+s":Tf.setState((function(e){e.saveLocalFileDialogVisible=!0})),d&&s((function(e){e.actionInfo={name:"Save Local File",timestamp:(new Date).getTime()}}));break;case"ctrl+shift+o":case"meta+shift+o":Tf.setState((function(e){e.listCloudFilesFlag=!0,e.openModelsMap=!1})),d&&s((function(e){e.actionInfo={name:"List Cloud Files",timestamp:(new Date).getTime()}}));break;case"ctrl+shift+s":case"meta+shift+s":Tf.getState().setSaveCloudFileFlag(!0),d&&s((function(e){e.actionInfo={name:"Save Cloud File",timestamp:(new Date).getTime()}}));break;case"alt+backspace":case"backspace":case"delete":var S=Ew.getState().selectedElementIdSet;if(!t||0===S.size)break;var R=Ew.getState().removeSelectedElements();if(0===R.length)break;if(function(){var e=R.filter((function(e){return e.type===V.Foundation})),t=new Set(e.map((function(e){return e.id})));return!!R.find((function(e){return!t.has(e.parentId)&&Tw.isElementTriggerAutoDeletion(e)}))}())Et.getState().setListenToAutoDeletionByDelete(!0),Tf.getState().setPrimitiveStore("selectedElementId",t.id);else{if(1===R.length){var D={name:"Delete",timestamp:Date.now(),deletedElements:Object(h.a)(R),selectedElementId:t.id,undo:function(){var e=D.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===D.selectedElementId}));if(t&&(s((function(l){var a;(a=l.elements).push.apply(a,Object(h.a)(e)),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t.id),l.selectedElement=t,l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag,l.deletedRoofId=null,l.deletedRoofIdSet.clear()})),t.type===V.Wall)){var l=t;l.leftJoints.length>0&&H(l.leftJoints[0],[l.id]),l.rightJoints.length>0&&j(l.rightJoints[0],[l.id])}}},redo:function(){var e=D.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===D.selectedElementId}));t&&W(t.id,!1)}}};g(D)}else{var I={name:"Delete Multiple",timestamp:Date.now(),deletedElements:Object(h.a)(R),selectedElementId:t.id,selectedElementIdSet:new Set(S),undo:function(){var e=this,t=this.deletedElements;if(t&&0!==t.length){var l=t.find((function(t){return t.id===e.selectedElementId}));if(l){s((function(a){var o;(o=a.elements).push.apply(o,Object(h.a)(t)),a.selectedElement=l,a.selectedElementIdSet=new Set(e.selectedElementIdSet),a.updateWallMapOnFoundationFlag=!a.updateWallMapOnFoundationFlag,a.deletedRoofId=null,a.deletedRoofIdSet.clear()}));var a,o=Object(f.a)(this.deletedElements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Wall){var r=i;r.leftJoints.length>0&&H(r.leftJoints[0],[r.id]),r.rightJoints.length>0&&j(r.rightJoints[0],[r.id])}}}catch(n){o.e(n)}finally{o.f()}}}},redo:function(){var e=this;s((function(t){var l;t.selectedElement=null!==(l=t.elements.find((function(t){return t.id===e.selectedElementId})))&&void 0!==l?l:null,t.selectedElementIdSet=new Set(e.selectedElementIdSet)})),Ew.getState().removeSelectedElements()}};g(I)}s((function(e){e.selectedElement=null,e.selectedElementIdSet.clear()}))}break;case"ctrl+z":case"meta+z":if(y.hasUndo()){var L=y.undo();Ew.getState().groupActionMode&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag})),L&&Kh(me.t("menu.edit.Undo",M)+": "+L,qe),d&&s((function(e){e.actionInfo={name:"Undo",timestamp:(new Date).getTime()}}))}break;case"ctrl+y":case"meta+y":if(y.hasRedo()){var E=y.redo();E&&Kh(me.t("menu.edit.Redo",M)+": "+E,qe),Ew.getState().groupActionMode&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag})),d&&s((function(e){e.actionInfo={name:"Redo",timestamp:(new Date).getTime()}}))}break;case"shift":Ew.getState().viewState.navigationView&&Tf.setState((function(e){e.navigationMoveSpeed=5*Ew.getState().minimumNavigationMoveSpeed,e.navigationTurnSpeed=5*Ew.getState().minimumNavigationTurnSpeed})),z(!0);break;case"esc":var U=Ew.getState().addedFoundationId,N=Ew.getState().addedCuboidId,J=Ew.getState().addedWallId,G=Ew.getState().addedWindowId,X=Ew.getState().addedDoorId;U?b(U,!1):N?b(N,!1):J?b(J,!1):G?(b(G,!1),Tf.getState().setPrimitiveStore("elementBeingCanceledId",G)):X&&(b(X,!1),Tf.getState().setPrimitiveStore("elementBeingCanceledId",X)),s((function(e){e.objectTypeToAdd=V.None,e.actionModeLock=!1,e.moveHandleType=null,e.resizeHandleType=null,e.groupActionMode=!1})),Et.getState().setEnableOrbitController(!0),u();break;case"ctrl":Y(!0)}};Object(r.useEffect)((function(){return function(){E.current=null}}),[]);var E=Object(r.useRef)(null);return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(dM.a,{handleKeys:fM,handleEventType:"keydown",onKeyEvent:function(e,t){t.preventDefault(),E.current!==e&&(E.current=e,L(e))}}),Object(gf.jsx)(dM.a,{handleKeys:fM,handleEventType:"keyup",onKeyEvent:function(e,t){t.preventDefault(),E.current=null,function(e){switch(e){case"shift":Ew.getState().viewState.navigationView&&Tf.setState((function(e){e.navigationMoveSpeed=Ew.getState().minimumNavigationMoveSpeed,e.navigationTurnSpeed=Ew.getState().minimumNavigationTurnSpeed})),z(!1);break;case"ctrl+o":case"meta+o":Ew.getState().localFileDialogRequested||s((function(e){e.localFileDialogRequested=!0,e.openLocalFileFlag=!0,d&&(e.actionInfo={name:"Open Local File",timestamp:(new Date).getTime()})}));break;case"ctrl":Y(!1)}}(e)}}),Object(gf.jsx)(uM,{})]})},pM=n.a.memo(hM),yM=function(){var e=Ew(si),t=Ew(Xr),l=Object(Se.f)().scene;Object(r.useEffect)((function(){var t=l.children.filter((function(e){return"Content"===e.name})),o=[];if(t.length>0){var i,r=t[0].children,n=Object(f.a)(r);try{for(n.s();!(i=n.n()).done;){var c=i.value;a(c,o)}}catch(v){n.e(v)}finally{n.f()}}for(var s=[],d=0,u=o;d0){var p,y=new Me.Vector3,g=new Me.Vector3,m=Object(f.a)(s);try{for(m.s();!(p=m.n()).done;){var w=p.value;y.min(w.min),g.max(w.max)}}catch(v){m.e(v)}finally{m.f()}var x=Math.abs(y.x);x0){var a,o=Object(f.a)(t.children);try{for(o.s();!(a=o.n()).done;){e(a.value,l)}}catch(i){o.e(i)}finally{o.f()}}};return Object(gf.jsx)(gf.Fragment,{})},gM=n.a.memo(yM),mM=l(807),wM=l(808),xM=function(e){var t=(new Me.Vector3).subVectors(e.localToWorld(new Me.Vector3(0,0,1e3)),e.position);return 0===t.x&&0===t.y&&e.getWorldDirection(t),t},vM=function(e){var t=document.getElementById("compassCanvas");if(t){var l=xM(e).normalize(),a=(Math.atan2(l.y,l.x)+Math.PI/2)/Math.PI*180;t.style.transform="rotate(".concat(a,"deg)");var o=e.position.z<.001;o&&!Tf.getState().isCameraUnderGround?Tf.getState().setPrimitiveStore("isCameraUnderGround",!0):!o&&Tf.getState().isCameraUnderGround&&Tf.getState().setPrimitiveStore("isCameraUnderGround",!1)}},bM=function(){var e=Ew(si),t=Ew(o.orthographic),l=Ew(o.enableRotate),a=Ew(o.autoRotate),i=Ew(Tr),n=Ew(Kr),c=Ew(o.cameraPosition),s=Ew(o.cameraZoom),d=Ew(o.navigationView),u=Tf(gi),f=Tf(mi),p=Ew(lr),y=Tf(Ar),g=d&&!t,m=Math.hypot(c[0],c[1],c[2]),w=(t?50*s:10*m)*n,x=Object(r.useMemo)((function(){return new Me.Vector3(-w,-w,0)}),[w]),v=Object(r.useMemo)((function(){return new Me.Vector3(w,w,w/2)}),[w]),b=Object(Se.f)(),A=b.gl,T=b.invalidate,P=b.get,S=b.set,j=b.camera,H=Object(r.useMemo)((function(){var e=P().camera;return e.up.set(0,0,1),e}),[]),z=Object(r.useMemo)((function(){return A.domElement}),[]),R=Object(r.useRef)(null),D=Object(r.useRef)(null),M=Object(r.useRef)(null);Object(r.useEffect)((function(){Ew.getState().viewState.cameraPosition2D[2]<100&&e((function(e){e.viewState.cameraPosition2D[2]=150}))}),[]),Object(r.useEffect)((function(){R&&R.current&&Et.setState((function(e){e.orbitControlsRef=R}))}),[]),Object(r.useEffect)((function(){R.current&&(R.current.addEventListener("change",W),R.current.addEventListener("start",I),R.current.addEventListener("end",C));var e=R.current;return function(){e&&(e.removeEventListener("change",W),e.removeEventListener("start",I),e.removeEventListener("end",C))}}),[g]),Object(r.useEffect)((function(){var e=Ew.getState().viewState;if(R.current){if(D.current){if(g){var l,a,o=P().camera,i=null!==(l=e.cameraPositionNav)&&void 0!==l?l:[5,-30,1],r=null!==(a=e.cameraRotationNav)&&void 0!==a?a:[1.5374753309166491,.16505866097993566,.005476951734475092];o.position.fromArray(i),o.rotation.fromArray([].concat(Object(h.a)(r),["XYZ"]))}else{var n,c,s=O(null!==(n=e.cameraPosition)&&void 0!==n?n:[0,0,20]),d=O(null!==(c=e.panCenter)&&void 0!==c?c:[0,0,0]);D.current.position.copy(s),D.current.lookAt(d),D.current.zoom=1,t||(R.current.object=D.current,R.current.target.copy(d))}j.updateMatrixWorld(),vM(P().camera)}if(M.current){var u,f,p=O(null!==(u=e.cameraPosition2D)&&void 0!==u?u:[0,0,1e3]).setZ(1e3),y=O(null!==(f=e.panCenter2D)&&void 0!==f?f:[0,0,0]);M.current.position.copy(p),M.current.rotation.set(0,0,0),M.current.lookAt(y),M.current.zoom=e.cameraZoom,t&&(R.current.object=M.current,R.current.target.copy(y))}}}),[i]),Object(r.useEffect)((function(){if(M.current&&D.current&&R.current){var e,l,a=Ew.getState().viewState,o=R.current,i=M.current,r=D.current;if(t)i.rotation.set(0,0,0),o.object=i,o.target.copy(O(null!==(e=a.panCenter2D)&&void 0!==e?e:[0,0,0])),S({camera:i});else o.object=r,o.target.copy(O(null!==(l=a.panCenter)&&void 0!==l?l:[0,0,0])),S({camera:r}),vM(P().camera)}}),[t]),Object(r.useEffect)((function(){t&&R.current&&(M.current&&(M.current.zoom=s,R.current.object=M.current),W(),R.current.update())}),[s]);var W=function(){T(),Ew.getState().viewState.orthographic||(vM(P().camera),R.current&&R.current.target.clamp(x,v))},I=function(){Tf.setState((function(e){e.duringCameraInteraction=!0}))},C=function(){Tf.setState((function(e){e.duringCameraInteraction=!1})),e((function(e){if(R.current){var t=e.viewState,l=P().camera,a=l.position,o=R.current.target;t.orthographic?(l.zoom&&!isNaN(l.zoom)?t.cameraZoom=l.zoom:t.cameraZoom=20,t.cameraPosition2D=[a.x,a.y,150],t.panCenter2D=[o.x,o.y,o.z]):g?(t.cameraPositionNav=[a.x,a.y,a.z],t.cameraRotationNav=[l.rotation.x,l.rotation.y,l.rotation.z],e.cameraDirection=xM(l)):(t.cameraPosition=[a.x,a.y,a.z],t.panCenter=[o.x,o.y,o.z],e.cameraDirection=xM(l))}}))},O=function(e){return e&&Array.isArray(e)?new Me.Vector3(e[0],e[1],e[2]):e&&null!==e.x?new Me.Vector3(e.x,e.y,e.z):new Me.Vector3(0,0,5)};Object(Se.d)((function(e){a&&R.current&&R.current.update()}));var F=Et((function(e){return e.compassRef}));return Object(r.useEffect)((function(){vM(P().camera)}),[F]),Object(r.useEffect)((function(){R.current&&(!g||y||p?R.current.removeKeyEvents():R.current.listenToKeyEvents(window))}),[g,y,p]),Object(r.useEffect)((function(){if(R.current){var e=Ew.getState().viewState;if(g){var l,a,o=P().camera,i=null!==(l=e.cameraPositionNav)&&void 0!==l?l:[5,-30,1],r=null!==(a=e.cameraRotationNav)&&void 0!==a?a:[1.5374753309166491,.16505866097993566,.005476951734475092];o.position.fromArray(i),o.rotation.fromArray([].concat(Object(h.a)(r),["XYZ"])),o.updateMatrixWorld(),vM(P().camera)}else if(R.current&&D.current){var n,c,s=O(null!==(n=e.cameraPosition)&&void 0!==n?n:[0,0,20]),d=O(null!==(c=e.panCenter)&&void 0!==c?c:[0,0,0]);D.current.position.copy(s),D.current.lookAt(d),D.current.zoom=1,t||(R.current.object=D.current,R.current.target.copy(d)),D.current.updateMatrixWorld(),vM(D.current)}T()}}),[g]),Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(mM.a,{ref:D,fov:45,far:ct,up:[0,0,1]}),Object(gf.jsx)(wM.a,{ref:M,up:[0,0,1]}),Object(gf.jsx)("myOrbitControls",{ref:R,args:[H,z],autoRotate:a,enableRotate:l,enablePan:!0,enableZoom:!0,enableDamping:!1,maxAzimuthAngle:1/0,minAzimuthAngle:-1/0,maxPolarAngle:vt,minPolarAngle:0,moveSpeed:null!==u&&void 0!==u?u:3,turnSpeed:null!==f&&void 0!==f?f:3})]})},AM=n.a.memo(bM),TM=l(809),PM=l(810),SM=l(811),jM=l(812),HM=l(813),zM=l(814),RM=l(815),DM=l(816),MM=l(817),WM=l(818),IM=l(819),CM=l(820),OM=mv.a.div(bz||(bz=Object(gv.a)(["\n display: flex;\n flex-direction: column;\n z-index: 999;\n"]))),FM=function(e){var t=e.style,l=e.size,a=e.margin,o=e.round,i=e.handleShareWindowClose,r=Ew(di),n=Ew(Vi),c=Ew(ar),s=new URLSearchParams(window.location.search).get("userid"),d={lng:n},u=null!==c&&void 0!==c?c:me.t("name.Tagline",d),f="aladdinIFI "+(c?me.t("name.Tagline",d):""),h=Ge;return c&&(s?h+="?client=web&userid="+s+"&title="+encodeURIComponent(c):r.uid&&(h+="?client=web&userid="+r.uid+"&title="+encodeURIComponent(c))),Object(gf.jsxs)(OM,{style:t,children:[Object(gf.jsx)(TM.a,{url:h,title:u,via:f,style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(PM.a,{size:l,round:o})}),Object(gf.jsx)(SM.a,{url:h,quote:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(jM.a,{size:l,round:o})}),Object(gf.jsx)(HM.a,{url:h,title:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(zM.a,{size:l,round:o})}),Object(gf.jsx)(RM.a,{url:h,title:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(DM.a,{size:l,round:o})}),Object(gf.jsx)(MM.a,{url:h,title:u,summary:f,source:me.t("name.IFI",d),style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(WM.a,{size:l,round:o})}),Object(gf.jsx)(IM.a,{url:h,title:u,onShareWindowClose:i,children:Object(gf.jsx)(CM.a,{size:l,round:o})})]})},kM=n.a.memo(FM),YM=function(){function e(t,l,a){if(Object(He.a)(this,e),this.chromosome=void 0,this.fitness=Number.NaN,this.discretizationSteps=void 0,this.chromosome=new Array(t),this.discretizationSteps=a,l)if(a)for(var o=0;oe.fitness?1:this.fitness=this.chromosome.length)throw new Error("Gene index out of bound: "+e);this.chromosome[e]=t}},{key:"getGene",value:function(e){if(e<0||e>=this.chromosome.length)throw new Error("Gene index out of bound: "+e);return this.chromosome[e]}},{key:"copyGenes",value:function(e){for(var t=Math.min(this.chromosome.length,e.chromosome.length),l=0;ll&&(l=o.fitness,e=o)}}catch(i){a.e(i)}finally{a.f()}return e}},{key:"evolve",value:function(e,t){this.selectSurvivors(e),this.crossover(t)}},{key:"selectSurvivors",value:function(e){this.survivors=[],this.sort();for(var t=Math.floor(e*this.individuals.length),l=0;l=o){a=n;break}}}catch(h){r.e(h)}finally{r.f()}var c=null;do{o=Math.random()*t,i=0;var s,d=Object(f.a)(this.survivors);try{for(d.s();!(s=d.n()).done;){var u=s.value;if((i+=u.fitness-e)>=o){u!==a&&(c=u);break}}}catch(h){d.e(h)}finally{d.f()}}while(null===c);return a&&c?new LM(a,c):null}},{key:"selectParentsByTournament",value:function(){var e=this.survivors.length;if(e<=1)throw new Error("Must have at least two survivors to be used as parents");var t,l=e-1,a=Math.floor(Math.random()*l);do{t=Math.floor(Math.random()*l)}while(t===a);var o=this.survivors[a].fitness>this.survivors[t].fitness?a:t;a=Math.floor(Math.random()*l);do{t=Math.floor(Math.random()*l)}while(t===a);for(var i=this.survivors[a].fitness>this.survivors[t].fitness?a:t;i===o;){a=Math.floor(Math.random()*l);do{t=Math.floor(Math.random()*l)}while(t===a);i=this.survivors[a].fitness>this.survivors[t].fitness?a:t}return new LM(this.survivors[o],this.survivors[i])}},{key:"mutate",value:function(e){if(!Tw.isZero(e)){var t=Math.floor(e*(this.individuals.length-1));for(0===t?t=1:t===this.individuals.length-1&&(t=this.individuals.length-2),this.mutants=[];this.mutants.lengthe)return!1}return!0}}]),e}(),UM=function(){function e(t,l,a,o,i,r,n,c,s,d){Object(He.a)(this,e),this.population=void 0,this.objectiveFunctionType=void 0,this.convergenceThreshold=void 0,this.minima=void 0,this.maxima=void 0,this.foundation=void 0,this.fitnessSharingRadius=.1,this.searchMethod=O.GLOBAL_SEARCH_UNIFORM_SELECTION,this.localSearchRadius=.1,this.constraints=[],this.stopped=!0,this.mutationRate=.1,this.crossoverRate=.5,this.selectionRate=.5,this.maximumGenerations=5,this.fittestOfGenerations=[],this.populationOfGenerations=[],this.outsideGenerationCounter=0,this.computeCounter=0,this.converged=!1,this.geneNames=void 0,this.population=new EM(a,i,r,d),this.objectiveFunctionType=l,this.convergenceThreshold=n,this.maximumGenerations=o,this.searchMethod=c,this.localSearchRadius=s,this.geneNames=new Array(i),this.foundation=t;var u=t.cx,f=t.cy,h=t.lx,p=t.ly;this.minima=new Array(i),this.maxima=new Array(i);for(var y=0;y=this.maximumGenerations}}]),e}(),NM=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"gaussian",value:function(){for(var e=0,t=0;0===e;)e=Math.random();for(;0===t;)t=Math.random();return Math.sqrt(-2*Math.log(e))*Math.cos(2*Math.PI*t)}},{key:"twoGaussians",value:function(){for(var e=0,t=0;0===e;)e=Math.random();for(;0===t;)t=Math.random();var l=new Array(2),a=Math.sqrt(-2*Math.log(e)),o=2*Math.PI*t;return l[0]=a*Math.cos(o),l[1]=a*Math.sin(o),l}},{key:"poisson",value:function(e){for(var t=0,l=Math.exp(-e),a=l,o=Math.random();o>a;)a+=l*=e/++t;return t}}]),e}(),VM=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a,o,i,r,n,c,s,d){var h;Object(He.a)(this,l),(h=t.call(this,a,o,i,r,e.length,n,c,s,d)).solarPanels=void 0,h.solarPanels=e;var p,y=h.population.individuals[0],g=Object(f.a)(e.entries());try{for(g.s();!(p=g.n()).done;){var m=Object(u.a)(p.value,2),w=m[0],x=m[1],v=.5*(1+x.tiltAngle/vt);if(y.setGene(w,v),h.searchMethod===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)for(var b=1;b1;)T=NM.gaussian()*h.localSearchRadius+v;A.setGene(w,T)}h.geneNames[w]="Tilt Angle ("+x.id+")"}}catch(P){g.e(P)}finally{g.f()}return h}return Object(Fe.a)(l,[{key:"applyFittest",value:function(){var e=this.population.getFittest();if(e){for(var t=0;t0&&(T.current=Object(h.a)(H.current),D(!0)))}):void 0}),[c]),Object(r.useEffect)((function(){A.current=s,s?(cancelAnimationFrame(v.current),Tf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",x))):(Tf.setState((function(e){e.evolutionPaused=!1})),R())}),[s]);var z=function(){if(d){Tf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),b.current=!1;var e=u(V.SolarPanel,d.id);H.current.length=0;var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;H.current.push(JSON.parse(JSON.stringify(o)))}}catch(s){a.e(s)}finally{a.f()}T.current=[];var i,r=[],n=Object(f.a)(e);try{for(n.s();!(i=n.n()).done;){var c=i.value;T.current.push(JSON.parse(JSON.stringify(c))),r.push(c.label)}}catch(s){n.e(s)}finally{n.f()}T.current.length>0?(P.current=new VM(T.current,d,w.objectiveFunctionType,w.populationSize,w.maximumGenerations,w.selectionMethod,w.convergenceThreshold,w.searchMethod,w.localSearchRadius),P.current.selectionRate=w.selectionRate,P.current.crossoverRate=w.crossoverRate,P.current.mutationRate=w.mutationRate,S.current=0,j.current=!1,m(r),P.current.startEvolving(),t((function(e){e.viewState.showEvolutionPanel=!0,e.selectedFloatingWindow="solarPanelOptimizationResult"}))):Qh(me.t("message.EncounterEvolutionError",x))}};Object(r.useEffect)((function(){P.current&&y&&(j.current=P.current.evolveIndividual(S.current%w.populationSize,function(){var e=0;switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:var t,l=Pf.getState().dailyPvYield,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;for(var r in i)i.hasOwnProperty(r)&&"Total"===r&&(e+=i[r])}}catch(h){a.e(h)}finally{a.f()}break;case W.YEARLY_TOTAL_OUTPUT:var n,c=Pf.getState().yearlyPvYield,s=Object(f.a)(c);try{for(s.s();!(n=s.n()).done;){var d=n.value;for(var u in d)d.hasOwnProperty(u)&&"Total"===u&&(e+=d[u])}}catch(h){s.e(h)}finally{s.f()}e*=12/o}return e}()),C(),S.current++,P.current.outsideGenerationCounter=Math.floor(S.current/w.populationSize),v.current=requestAnimationFrame(R))}),[y]);var R=function(){if(P.current&&n===I.GENETIC_ALGORITHM&&c&&!A.current){if(j.current||P.current.outsideGenerationCounter>=w.maximumGenerations){if(cancelAnimationFrame(v.current),b.current=!0,P.current.applyFittest(),C(),D(!0),Kh(me.t("message.EvolutionCompleted",x)+"\n"+(j.current?me.t("message.ConvergenceThresholdHasBeenReached",x):me.t("message.MaximumNumberOfGenerationsHasBeenReached",x))),l&&P.current){var e=P.current.population.getFittest();e&&t((function(t){var l;t.actionInfo={name:"Genetic Algorithm for Solar Panel Tilt Angle Completed",result:VM.individualToString(e),steps:null===(l=P.current)||void 0===l?void 0:l.outsideGenerationCounter,timestamp:(new Date).getTime()}}))}return}P.current.translateIndividual(S.current%w.populationSize),D(!1)}},D=function(e){Tf.setState((function(t){if(T.current)switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case W.YEARLY_TOTAL_OUTPUT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0;break;default:Qh(me.t("message.ObjectiveFunctionTypeError",x),60)}})),t((function(e){if(T.current){switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case W.YEARLY_TOTAL_OUTPUT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1);break;default:Qh(me.t("message.ObjectiveFunctionTypeError",x),60)}var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel){var o,i=a,r=Object(f.a)(T.current);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(i.id===n.id){i.tiltAngle=n.tiltAngle;break}}}catch(c){r.e(c)}finally{r.f()}}}}catch(c){l.e(c)}finally{l.f()}}})),e&&Tf.setState((function(e){e.runEvolution=!1,e.evolutionInProgress=!1,e.objectiveEvaluationIndex=0}))},C=function(){if(P.current){for(var e=[],t=0;t0){var s=P.current.populationOfGenerations[t-1];if(s)for(var d=0,u=0;u0&&e.push(l)}p(e)}};return Object(gf.jsx)(gf.Fragment,{})},GM=n.a.memo(JM),XM=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a,o,i,r,n,c,s,d,u,f,h,p,y,g,m,w,x,v,b,A,T,P){var S;if(Object(He.a)(this,l),(S=t.call(this,d,u,f,h,3,p,y,g,m)).polygon=void 0,S.pvModel=void 0,S.orientation=$.landscape,S.rowAxis=ee.leftRight,S.poleHeight=2,S.poleSpacing=5,S.bounds=void 0,S.solarPanelCount=0,S.solarRackCount=0,S.minimumInterRowSpacing=2,S.maximumInterRowSpacing=10,S.minimumRowsPerRack=1,S.maximumRowsPerRack=6,S.minimumTiltAngle=-vt,S.maximumTiltAngle=vt,S.margin=0,S.polygon=s,S.pvModel=e,S.rowAxis=a,S.orientation=o,S.poleHeight=i,S.poleSpacing=r,S.minimumInterRowSpacing=w,S.maximumInterRowSpacing=x,S.minimumRowsPerRack=v,S.maximumRowsPerRack=b,S.minimumTiltAngle=A,S.maximumTiltAngle=T,S.margin=P,S.setInterRowSpacingBounds(),S.geneNames[0]="Tilt Angle",S.geneNames[1]="Inter-Row Spacing",S.geneNames[2]="Rack Width",n&&n.length>0){var j=n[0];if(n.length>1){var H=S.population.individuals[0],z=S.maximumTiltAngle===S.minimumTiltAngle?0:(j.tiltAngle-S.minimumTiltAngle)/(S.maximumTiltAngle-S.minimumTiltAngle);H.setGene(0,z);var R=n[1],D=c?c.interRowSpacing:S.rowAxis===ee.upDown?Math.abs(j.cx-R.cx)*S.foundation.lx:Math.abs(j.cy-R.cy)*S.foundation.ly,M=S.maximumInterRowSpacing===S.minimumInterRowSpacing?0:(D-S.minimumInterRowSpacing)/(S.maximumInterRowSpacing-S.minimumInterRowSpacing);M<0?M=0:M>1&&(M=1),H.setGene(1,M);var W=c?c.rowsPerRack:Math.max(1,Math.round(j.ly/(j.orientation===$.portrait?e.length:e.width))),I=S.maximumRowsPerRack===S.minimumRowsPerRack?0:(W-S.minimumRowsPerRack)/(S.maximumRowsPerRack-S.minimumRowsPerRack);I<0?I=0:I>1&&(I=1),H.setGene(2,I)}}return S}return Object(Fe.a)(l,[{key:"setInterRowSpacingBounds",value:function(){this.bounds=Tw.calculatePolygonBounds(this.polygon.vertices)}},{key:"applyFittest",value:function(){var e=this.population.getFittest();e&&console.log("Fittest: "+this.individualToString(e)+", rack count: "+this.solarRackCount+", panel count: "+this.solarPanelCount)}},{key:"getObjectiveUnit",value:function(){switch(this.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:return"kWh";case W.YEARLY_PROFIT:case W.DAILY_PROFIT:return"dollars"}return null}},{key:"individualToString",value:function(e){var t="F("+Tw.toDegrees(e.getGene(0)*(this.maximumTiltAngle-this.minimumTiltAngle)+this.minimumTiltAngle).toFixed(3)+"\xb0, ";return t+=(e.getGene(1)*(this.maximumInterRowSpacing-this.minimumInterRowSpacing)+this.minimumInterRowSpacing).toFixed(3)+"m, ",(t+=Math.floor(e.getGene(2)*(this.maximumRowsPerRack-this.minimumRowsPerRack)+this.minimumRowsPerRack)+")")+" = "+e.fitness.toFixed(5)+" "+this.getObjectiveUnit()}},{key:"startEvolving",value:function(){this.outsideGenerationCounter=0,this.computeCounter=0,this.fittestOfGenerations.fill(null),this.setInterRowSpacingBounds()}},{key:"translateIndividualByIndex",value:function(e){return this.translateIndividual(this.population.individuals[e])}},{key:"translateBest",value:function(){var e=this.population.getFittest();return e?this.translateIndividual(e):[]}},{key:"translateIndividual",value:function(e){if(!this.bounds)return[];var t=e.getGene(0)*(this.maximumTiltAngle-this.minimumTiltAngle)+this.minimumTiltAngle,l=e.getGene(1)*(this.maximumInterRowSpacing-this.minimumInterRowSpacing)+this.minimumInterRowSpacing,a=Math.floor(e.getGene(2)*(this.maximumRowsPerRack-this.minimumRowsPerRack)+this.minimumRowsPerRack),o=XS.create(this.polygon,this.foundation,this.pvModel,this.orientation,t,a,l,this.rowAxis,this.poleHeight,this.poleSpacing,this.margin);if(this.solarPanelCount=0,this.solarRackCount=o.length,o.length>0){var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;this.solarPanelCount+=Tw.countSolarPanelsOnRack(n,this.pvModel)}}catch(c){r.e(c)}finally{r.f()}}return o}},{key:"evolveIndividual",value:function(e,t){var l=this.population.individuals.length;if(!this.converged){var a,o=this.population.individuals[e];o.fitness=t,0===this.computeCounter&&0===e&&(this.fittestOfGenerations[0]=o.getCopy());var i=Math.floor(this.computeCounter/l);console.log("Generation "+(i+1)+", individual "+e+" : "+this.individualToString(o)+", rack count: "+this.solarRackCount+", panel count: "+this.solarPanelCount);var r=null===(a=this.populationOfGenerations[i])||void 0===a?void 0:a.individuals[e];if(r){for(var n=0;n0&&v(u.id,!1),O.current.length>0&&(C.current=Object(h.a)(O.current),E(!0))}),100))}):void 0}),[c]),Object(r.useEffect)((function(){H.current=s,s?(cancelAnimationFrame(S.current),Tf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",F))):(Tf.setState((function(e){e.evolutionPaused=!1})),L())}),[s]);var Y=function(){var e,l,a,o,i,r;if(u&&k){Tf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),j.current=!1;var n=p(V.SolarPanel,k.id);O.current.length=0;var c,s=Object(f.a)(n);try{for(s.s();!(c=s.n()).done;){var d=c.value;O.current.push(JSON.parse(JSON.stringify(d)))}}catch(y){s.e(y)}finally{s.f()}z.current=new XM(x(null!==(e=A.pvModelName)&&void 0!==e?e:"CS6X-355P-FG"),null!==(l=A.rowAxis)&&void 0!==l?l:ee.leftRight,null!==(a=A.orientation)&&void 0!==a?a:$.landscape,null!==(o=A.poleHeight)&&void 0!==o?o:1,null!==(i=A.poleSpacing)&&void 0!==i?i:3,O.current,P,u,k,b.objectiveFunctionType,b.populationSize,b.maximumGenerations,b.selectionMethod,b.convergenceThreshold,b.searchMethod,b.localSearchRadius,A.minimumInterRowSpacing,A.maximumInterRowSpacing,A.minimumRowsPerRack,A.maximumRowsPerRack,A.minimumTiltAngle,A.maximumTiltAngle,null!==(r=A.margin)&&void 0!==r?r:0),z.current.selectionRate=b.selectionRate,z.current.crossoverRate=b.crossoverRate,z.current.mutationRate=b.mutationRate,R.current=0,D.current=!1,w(Object(h.a)(z.current.geneNames)),z.current.startEvolving(),t((function(e){e.viewState.showEvolutionPanel=!0,e.selectedFloatingWindow="solarPanelOptimizationResult"}))}};Object(r.useEffect)((function(){z.current&&g&&(D.current=z.current.evolveIndividual(R.current%b.populationSize,function(){var e,t=0;switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:var l,a=Pf.getState().dailyPvYield,i=Object(f.a)(a);try{for(i.s();!(l=i.n()).done;){var r=l.value;for(var n in r)r.hasOwnProperty(n)&&"Total"===n&&(t+=r[n])}}catch(y){i.e(y)}finally{i.f()}break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:var c,s=Pf.getState().yearlyPvYield,d=Object(f.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;for(var h in u)u.hasOwnProperty(h)&&"Total"===h&&(t+=u[h])}}catch(y){d.e(y)}finally{d.f()}t*=12/o}var p=null===(e=z.current)||void 0===e?void 0:e.solarPanelCount;switch(b.objectiveFunctionType){case W.DAILY_AVERAGE_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:p&&(t/=p);break;case W.DAILY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit);break;case W.YEARLY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit*365)}return t}()),U(),R.current++,z.current.outsideGenerationCounter=Math.floor(R.current/b.populationSize),S.current=requestAnimationFrame(L))}),[g]);var L=function(){if(z.current&&n===I.GENETIC_ALGORITHM&&c&&!H.current){if(D.current||z.current.outsideGenerationCounter>=b.maximumGenerations){if(cancelAnimationFrame(S.current),j.current=!0,C.current.length>0&&v(u.id,!1),C.current=z.current.translateBest(),z.current.applyFittest(),U(),E(!0),Kh(me.t("message.EvolutionCompleted",F)+"\n"+(D.current?me.t("message.ConvergenceThresholdHasBeenReached",F):me.t("message.MaximumNumberOfGenerationsHasBeenReached",F))),z.current){var e=z.current.population.getFittest();if(e){var a=e.getGene(0)*(A.maximumTiltAngle-A.minimumTiltAngle)+A.minimumTiltAngle,o=e.getGene(1)*(A.maximumInterRowSpacing-A.minimumInterRowSpacing)+A.minimumInterRowSpacing,i=Math.floor(e.getGene(2)*(A.maximumRowsPerRack-A.minimumRowsPerRack)+A.minimumRowsPerRack);t((function(e){e.solarPanelArrayLayoutParams.tiltAngle=a,e.solarPanelArrayLayoutParams.interRowSpacing=o,e.solarPanelArrayLayoutParams.rowsPerRack=i,e.solarPanelArrayLayoutParams.orientation=A.orientation,e.solarPanelArrayLayoutParams.poleHeight=A.poleHeight})),l&&t((function(t){var l,a;t.actionInfo={name:"Genetic Algorithm for Solar Panel Array Layout Completed",result:null===(l=z.current)||void 0===l?void 0:l.individualToString(e),steps:null===(a=z.current)||void 0===a?void 0:a.outsideGenerationCounter,timestamp:(new Date).getTime()}}))}}return}v(u.id,!1),setTimeout((function(){z.current&&(C.current=z.current.translateIndividualByIndex(R.current%b.populationSize)),E(!1)}),100)}},E=function(e){Tf.setState((function(t){switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){var t;switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}(t=e.elements).push.apply(t,Object(h.a)(C.current))})),e&&Tf.setState((function(e){e.runEvolution=!1,e.evolutionInProgress=!1,e.objectiveEvaluationIndex=0}))},U=function(){if(z.current){for(var e=[],t=0;t0){var n=z.current.populationOfGenerations[t-1];if(n)for(var c=0,s=0;s0&&e.push(l)}y(e)}};return Object(gf.jsx)(gf.Fragment,{})},KM=n.a.memo(BM),qM=function(){function e(t,l){Object(He.a)(this,e),this.position=void 0,this.velocity=void 0,this.fitness=Number.NaN,this.bestPositionOfParticle=void 0,this.position=new Array,this.velocity=new Array,this.bestPositionOfParticle=new Array;for(var a=0;ae.fitness?1:this.fitnesse)return!1}return!0}}]),e}(),ZM=function(){function e(t,l,a,o,i,r,n,c,s){Object(He.a)(this,e),this.swarm=void 0,this.objectiveFunctionType=void 0,this.foundation=void 0,this.stopped=!0,this.inertia=.8,this.cognitiveCoefficient=.1,this.socialCoefficient=.1,this.maximumSteps=5,this.bestPositionOfSteps=[],this.bestFitnessOfSteps=[],this.swarmOfSteps=[],this.outsideStepCounter=0,this.computeCounter=0,this.convergenceThreshold=.1,this.converged=!1,this.searchMethod=O.GLOBAL_SEARCH_UNIFORM_SELECTION,this.localSearchRadius=.1,this.swarm=new QM(a,r,o),this.objectiveFunctionType=l,this.convergenceThreshold=n,this.searchMethod=c,this.localSearchRadius=s,this.maximumSteps=i,this.foundation=t,this.bestPositionOfSteps=new Array(this.maximumSteps+1),this.bestPositionOfSteps.fill(null),this.bestFitnessOfSteps=new Array(this.maximumSteps+1),this.bestFitnessOfSteps.fill(0),this.swarmOfSteps=new Array(this.maximumSteps);for(var d=0;d=this.maximumSteps}}]),e}(),_M=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a,o,i,r,n,c,s,d){var h;Object(He.a)(this,l),(h=t.call(this,a,o,i,r,n,e.length,c,s,d)).solarPanels=void 0,h.solarPanels=e;var p,y=h.swarm.particles[0],g=Object(f.a)(e.entries());try{for(g.s();!(p=g.n()).done;){var m=Object(u.a)(p.value,2),w=m[0],x=.5*(1+m[1].tiltAngle/vt);if(y.position[w]=x,h.searchMethod===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)for(var v=1;v1;)A=NM.gaussian()*h.localSearchRadius+x;b.position[w]=A}}}catch(T){g.e(T)}finally{g.f()}return h}return Object(Fe.a)(l,[{key:"applyFittest",value:function(){var e=this.swarm.bestPositionOfSwarm;if(e){for(var t=0;ti.fitness&&i.updateBestPosition(),i.fitness=t,0===this.computeCounter&&0===e&&(this.bestPositionOfSteps[0]=Object(h.a)(i.position),this.bestFitnessOfSteps[0]=t);var r=Math.floor(this.computeCounter/a);console.log("Step "+(r+1)+", particle "+e+" : "+l.particleToString(i.position,t));var n=null===(o=this.swarmOfSteps[r])||void 0===o?void 0:o.particles[e];if(n){for(var c=0;c0&&(T.current=Object(h.a)(H.current),D(!0)))}):void 0}),[c]),Object(r.useEffect)((function(){A.current=s,s?(cancelAnimationFrame(v.current),Tf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",x))):(Tf.setState((function(e){e.evolutionPaused=!1})),R())}),[s]);var z=function(){if(d){Tf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),b.current=!1;var e=u(V.SolarPanel,d.id);H.current.length=0;var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;H.current.push(JSON.parse(JSON.stringify(o)))}}catch(s){a.e(s)}finally{a.f()}T.current=[];var i,r=[],n=Object(f.a)(e);try{for(n.s();!(i=n.n()).done;){var c=i.value;T.current.push(JSON.parse(JSON.stringify(c))),r.push(c.label)}}catch(s){n.e(s)}finally{n.f()}T.current.length>0?(P.current=new _M(T.current,d,w.objectiveFunctionType,w.swarmSize,w.vmax,w.maximumSteps,w.convergenceThreshold,w.searchMethod,w.localSearchRadius),P.current.inertia=w.inertia,P.current.cognitiveCoefficient=w.cognitiveCoefficient,P.current.socialCoefficient=w.socialCoefficient,S.current=0,j.current=!1,m(r),P.current.startEvolving(),t((function(e){e.viewState.showEvolutionPanel=!0,e.selectedFloatingWindow="solarPanelOptimizationResult"}))):Qh(me.t("message.EncounterEvolutionError",x))}};Object(r.useEffect)((function(){P.current&&y&&(j.current=P.current.updateParticle(S.current%w.swarmSize,function(){var e=0;switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:var t,l=Pf.getState().dailyPvYield,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;for(var r in i)i.hasOwnProperty(r)&&"Total"===r&&(e+=i[r])}}catch(h){a.e(h)}finally{a.f()}break;case W.YEARLY_TOTAL_OUTPUT:var n,c=Pf.getState().yearlyPvYield,s=Object(f.a)(c);try{for(s.s();!(n=s.n()).done;){var d=n.value;for(var u in d)d.hasOwnProperty(u)&&"Total"===u&&(e+=d[u])}}catch(h){s.e(h)}finally{s.f()}e*=12/o}return e}()),C(),S.current++,P.current.outsideStepCounter=Math.floor(S.current/w.swarmSize),v.current=requestAnimationFrame(R))}),[y]);var R=function(){if(P.current&&n===I.PARTICLE_SWARM_OPTIMIZATION&&c&&!A.current){if(j.current||P.current.outsideStepCounter>=w.maximumSteps){if(cancelAnimationFrame(v.current),b.current=!0,P.current.applyFittest(),C(),D(!0),Kh(me.t("message.EvolutionCompleted",x)+"\n"+(j.current?me.t("message.ConvergenceThresholdHasBeenReached",x):me.t("message.MaximumNumberOfStepsHasBeenReached",x))),l&&P.current){var e=P.current.swarm.bestPositionOfSwarm,a=P.current.swarm.bestFitness;e&&a&&t((function(t){var l;t.actionInfo={name:"Particle Swarm Optimization for Solar Panel Tilt Angle Completed",result:_M.particleToString(e,a),steps:null===(l=P.current)||void 0===l?void 0:l.outsideStepCounter,timestamp:(new Date).getTime()}}))}return}P.current.translateParticle(S.current%w.swarmSize),D(!1)}},D=function(e){Tf.setState((function(t){if(T.current)switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case W.YEARLY_TOTAL_OUTPUT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){if(T.current){switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case W.YEARLY_TOTAL_OUTPUT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel){var o,i=a,r=Object(f.a)(T.current);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(i.id===n.id){i.tiltAngle=n.tiltAngle;break}}}catch(c){r.e(c)}finally{r.f()}}}}catch(c){l.e(c)}finally{l.f()}}})),e&&Tf.setState((function(e){e.runEvolution=!1,e.evolutionInProgress=!1,e.objectiveEvaluationIndex=0}))},C=function(){if(P.current){for(var e=[],t=0;t0){var s=P.current.swarmOfSteps[t-1];if(s)for(var d=0,u=0;u0&&e.push(l)}p(e)}};return Object(gf.jsx)(gf.Fragment,{})},eW=n.a.memo($M),tW=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a,o,i,r,n,c,s,d,u,f,h,p,y,g,m,w,x,v,b,A,T,P){var S;if(Object(He.a)(this,l),(S=t.call(this,d,u,f,h,p,3,y,g,m)).polygon=void 0,S.pvModel=void 0,S.orientation=$.landscape,S.rowAxis=ee.leftRight,S.relativeMargin=.01,S.poleHeight=2,S.poleSpacing=5,S.bounds=void 0,S.solarPanelCount=0,S.solarRackCount=0,S.minimumInterRowSpacing=2,S.maximumInterRowSpacing=10,S.minimumRowsPerRack=1,S.maximumRowsPerRack=6,S.minimumTiltAngle=-vt,S.maximumTiltAngle=vt,S.margin=0,S.polygon=s,S.pvModel=e,S.rowAxis=a,S.orientation=o,S.poleHeight=i,S.poleSpacing=r,S.minimumInterRowSpacing=w,S.maximumInterRowSpacing=x,S.minimumRowsPerRack=v,S.maximumRowsPerRack=b,S.minimumTiltAngle=A,S.maximumTiltAngle=T,S.margin=P,S.setInterRowSpacingBounds(),n&&n.length>0){var j=n[0];if(n.length>1){var H=S.swarm.particles[0];H.position[0]=S.maximumTiltAngle===S.minimumTiltAngle?0:(j.tiltAngle-S.minimumTiltAngle)/(S.maximumTiltAngle-S.minimumTiltAngle);var z=n[1],R=c?c.interRowSpacing:S.rowAxis===ee.upDown?Math.abs(j.cx-z.cx)*S.foundation.lx:Math.abs(j.cy-z.cy)*S.foundation.ly,D=S.maximumInterRowSpacing===S.minimumInterRowSpacing?0:(R-S.minimumInterRowSpacing)/(S.maximumInterRowSpacing-S.minimumInterRowSpacing);D<0?D=0:D>1&&(D=1),H.position[1]=D;var M=c?c.rowsPerRack:Math.max(1,Math.round(j.ly/(j.orientation===$.portrait?e.length:e.width))),W=S.maximumRowsPerRack===S.minimumRowsPerRack?0:(M-S.minimumRowsPerRack)/(S.maximumRowsPerRack-S.minimumRowsPerRack);W<0?W=0:W>1&&(W=1),H.position[2]=W}}return S}return Object(Fe.a)(l,[{key:"setInterRowSpacingBounds",value:function(){this.bounds=Tw.calculatePolygonBounds(this.polygon.vertices)}},{key:"applyFittest",value:function(){this.swarm.bestPositionOfSwarm&&console.log("Best: "+this.particleToString(this.swarm.bestPositionOfSwarm,this.swarm.bestFitness)+", rack count: "+this.solarRackCount+", panel count: "+this.solarPanelCount)}},{key:"getObjectiveUnit",value:function(){switch(this.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:return"kWh";case W.YEARLY_PROFIT:case W.DAILY_PROFIT:return"dollars"}return null}},{key:"particleToString",value:function(e,t){var l="F("+Tw.toDegrees(e[0]*(this.maximumTiltAngle-this.minimumTiltAngle)+this.minimumTiltAngle).toFixed(3)+"\xb0, ";return l+=(e[1]*(this.maximumInterRowSpacing-this.minimumInterRowSpacing)+this.minimumInterRowSpacing).toFixed(3)+"m, ",(l+=Math.floor(e[2]*(this.maximumRowsPerRack-this.minimumRowsPerRack)+this.minimumRowsPerRack)+")")+" = "+t.toFixed(5)+" "+this.getObjectiveUnit()}},{key:"startEvolving",value:function(){this.outsideStepCounter=0,this.computeCounter=0,this.bestPositionOfSteps.fill(null),this.bestFitnessOfSteps.fill(0),this.setInterRowSpacingBounds()}},{key:"translateParticleByIndex",value:function(e){return this.translatePosition(this.swarm.particles[e].position)}},{key:"translateBest",value:function(){return this.swarm.bestPositionOfSwarm?this.translatePosition(this.swarm.bestPositionOfSwarm):[]}},{key:"translatePosition",value:function(e){if(!this.bounds)return[];var t=e[0]*(this.maximumTiltAngle-this.minimumTiltAngle)+this.minimumTiltAngle,l=e[1]*(this.maximumInterRowSpacing-this.minimumInterRowSpacing)+this.minimumInterRowSpacing,a=Math.floor(e[2]*(this.maximumRowsPerRack-this.minimumRowsPerRack)+this.minimumRowsPerRack),o=XS.create(this.polygon,this.foundation,this.pvModel,this.orientation,t,a,l,this.rowAxis,this.poleHeight,this.poleSpacing,this.margin);if(this.solarPanelCount=0,this.solarRackCount=o.length,o.length>0){var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;this.solarPanelCount+=Tw.countSolarPanelsOnRack(n,this.pvModel)}}catch(c){r.e(c)}finally{r.f()}}return o}},{key:"updateParticle",value:function(e,t){var l=this.swarm.particles.length;if(!this.converged){var a,o=this.swarm.particles[e];o.fitness=t,0===this.computeCounter&&0===e&&(this.bestPositionOfSteps[0]=Object(h.a)(o.position),this.bestFitnessOfSteps[0]=t);var i=Math.floor(this.computeCounter/l);console.log("Step "+(i+1)+", particle "+e+" : "+this.particleToString(o.position,t)+", rack count: "+this.solarRackCount+", panel count: "+this.solarPanelCount);var r=null===(a=this.swarmOfSteps[i])||void 0===a?void 0:a.particles[e];if(r){for(var n=0;n0&&g(u.id,!1),O.current.length>0&&(C.current=Object(h.a)(O.current),E(!0))}),100))}):void 0}),[c]),Object(r.useEffect)((function(){H.current=s,s?(cancelAnimationFrame(S.current),Tf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",F))):(Tf.setState((function(e){e.evolutionPaused=!1})),L())}),[s]);var Y=function(){var e,l,a,o,i,r;if(u&&k){Tf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),j.current=!1;var n=p(V.SolarPanel,k.id);O.current.length=0;var c,s=Object(f.a)(n);try{for(s.s();!(c=s.n()).done;){var d=c.value;O.current.push(JSON.parse(JSON.stringify(d)))}}catch(h){s.e(h)}finally{s.f()}z.current=new tW(y(null!==(e=A.pvModelName)&&void 0!==e?e:"CS6X-355P-FG"),null!==(l=A.rowAxis)&&void 0!==l?l:ee.leftRight,null!==(a=A.orientation)&&void 0!==a?a:$.landscape,null!==(o=A.poleHeight)&&void 0!==o?o:1,null!==(i=A.poleSpacing)&&void 0!==i?i:3,O.current,P,u,k,b.objectiveFunctionType,b.swarmSize,b.vmax,b.maximumSteps,b.convergenceThreshold,b.searchMethod,b.localSearchRadius,A.minimumInterRowSpacing,A.maximumInterRowSpacing,A.minimumRowsPerRack,A.maximumRowsPerRack,A.minimumTiltAngle,A.maximumTiltAngle,null!==(r=A.margin)&&void 0!==r?r:0),z.current.inertia=b.inertia,z.current.cognitiveCoefficient=b.cognitiveCoefficient,z.current.socialCoefficient=b.socialCoefficient,R.current=0,D.current=!1,v(["Tilt Angle","Inter-Row Spacing","Rack Width"]),z.current.startEvolving(),t((function(e){e.viewState.showEvolutionPanel=!0,e.selectedFloatingWindow="solarPanelOptimizationResult"}))}};Object(r.useEffect)((function(){z.current&&w&&(D.current=z.current.updateParticle(R.current%b.swarmSize,function(){var e,t=0;switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:var l,a=Pf.getState().dailyPvYield,i=Object(f.a)(a);try{for(i.s();!(l=i.n()).done;){var r=l.value;for(var n in r)r.hasOwnProperty(n)&&"Total"===n&&(t+=r[n])}}catch(y){i.e(y)}finally{i.f()}break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:var c,s=Pf.getState().yearlyPvYield,d=Object(f.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;for(var h in u)u.hasOwnProperty(h)&&"Total"===h&&(t+=u[h])}}catch(y){d.e(y)}finally{d.f()}t*=12/o}var p=null===(e=z.current)||void 0===e?void 0:e.solarPanelCount;switch(b.objectiveFunctionType){case W.DAILY_AVERAGE_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:p&&(t/=p);break;case W.DAILY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit);break;case W.YEARLY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit*365)}return t}()),U(),R.current++,z.current.outsideStepCounter=Math.floor(R.current/b.swarmSize),S.current=requestAnimationFrame(L))}),[w]);var L=function(){if(z.current&&n===I.PARTICLE_SWARM_OPTIMIZATION&&c&&!H.current){if(D.current||z.current.outsideStepCounter>=b.maximumSteps){if(cancelAnimationFrame(S.current),j.current=!0,C.current.length>0&&g(u.id,!1),C.current=z.current.translateBest(),z.current.applyFittest(),U(),E(!0),Kh(me.t("message.EvolutionCompleted",F)+"\n"+(D.current?me.t("message.ConvergenceThresholdHasBeenReached",F):me.t("message.MaximumNumberOfStepsHasBeenReached",F))),z.current){var e=z.current.swarm.bestPositionOfSwarm,a=z.current.swarm.bestFitness;if(e&&a){var o=e[0]*(A.maximumTiltAngle-A.minimumTiltAngle)+A.minimumTiltAngle,i=e[1]*(A.maximumInterRowSpacing-A.minimumInterRowSpacing)+A.minimumInterRowSpacing,r=Math.floor(e[2]*(A.maximumRowsPerRack-A.minimumRowsPerRack)+A.minimumRowsPerRack);t((function(e){e.solarPanelArrayLayoutParams.tiltAngle=o,e.solarPanelArrayLayoutParams.interRowSpacing=i,e.solarPanelArrayLayoutParams.rowsPerRack=r,e.solarPanelArrayLayoutParams.orientation=A.orientation,e.solarPanelArrayLayoutParams.poleHeight=A.poleHeight})),l&&t((function(t){var l,o;t.actionInfo={name:"Particle Swarm Optimization for Solar Panel Array Layout Completed",result:null===(l=z.current)||void 0===l?void 0:l.particleToString(e,a),steps:null===(o=z.current)||void 0===o?void 0:o.outsideStepCounter,timestamp:(new Date).getTime()}}))}}return}g(u.id,!1),setTimeout((function(){z.current&&(C.current=z.current.translateParticleByIndex(R.current%b.swarmSize)),E(!1)}),100)}},E=function(e){Tf.setState((function(t){switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){var t;switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}(t=e.elements).push.apply(t,Object(h.a)(C.current))})),e&&Tf.setState((function(e){e.runEvolution=!1,e.evolutionInProgress=!1,e.objectiveEvaluationIndex=0}))},U=function(){if(z.current){for(var e=[],t=0;t0){var n=z.current.swarmOfSteps[t-1];if(n)for(var c=0,s=0;s0&&e.push(l)}m(e)}};return Object(gf.jsx)(gf.Fragment,{})},aW=n.a.memo(lW),oW=function(){var e=Ew(cs),t=Ew(Cu),l=Ew(Fu);return Object(Se.f)().gl.domElement.style.cursor=e!==V.None||l||t?"crosshair":"default",null},iW=n.a.memo(oW),rW=function(e){var t=e.width,l=void 0===t?400:t,a=e.height,n=void 0===a?400:a,c=Ew(si),s=Ew(Sr),d=Ew(i.latitude),h=Ew(i.longitude),p=Ew(o.mapZoom),y=Ew(o.mapTilt),g=Ew(o.mapType),m=Object(r.useState)(null),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useCallback)((function(e){v(e)}),[]),A=Object(r.useCallback)((function(){v(null)}),[]),T=function(){var e=new google.maps.LatLng(d,h);(new google.maps.Geocoder).geocode({location:e},(function(e,t){if(t===google.maps.GeocoderStatus.OK&&e&&e[0].address_components){c((function(t){t.world.address=e[0].formatted_address}));var l,a=Object(f.a)(e[0].address_components);try{var o=function(){var e=l.value;if("country"===e.types[0])return c((function(t){t.world.countryCode=e.short_name})),"break"};for(a.s();!(l=a.n()).done;){if("break"===o())break}}catch(i){a.e(i)}finally{a.f()}}})).then((function(){}))},P=Object(Ly.throttle)((function(){if(x){var e=x.getCenter();if(e){var t=e.lat(),l=e.lng();if(t!==d||l!==h){T();var a={name:"Set Location",timestamp:Date.now(),oldLatitude:d,newLatitude:t,oldLongitude:h,newLongitude:l,undo:function(){c((function(e){e.world.latitude=a.oldLatitude,e.world.longitude=a.oldLongitude}))},redo:function(){c((function(e){e.world.latitude=a.newLatitude,e.world.longitude=a.newLongitude}))}};s(a),c((function(e){e.world.latitude=t,e.world.longitude=l}))}}}}),200,{leading:!1,trailing:!0}),S=Object(Ly.throttle)((function(){if(x){var e=x.getZoom();if(void 0!==e&&e!==p){T();var t={name:"Zoom Map",timestamp:Date.now(),oldValue:p,newValue:e,undo:function(){c((function(e){e.viewState.mapZoom=t.oldValue}))},redo:function(){c((function(e){e.viewState.mapZoom=t.newValue}))}};s(t),c((function(t){t.viewState.mapZoom=e}))}}}),200,{leading:!1,trailing:!0});return Object(gf.jsx)(ER.a,{mapContainerStyle:{border:"1px solid",width:l+"px",height:n+"px"},mapTypeId:g,center:{lat:d,lng:h},zoom:p,tilt:y,onLoad:b,onUnmount:A,onCenterChanged:P,onZoomChanged:S,onTiltChanged:function(){if(x){var e=x.getTilt();if(void 0!==e&&e!==y){var t={name:"Tilt Map",timestamp:Date.now(),oldValue:y,newValue:e,undo:function(){c((function(e){e.viewState.mapTilt=t.oldValue}))},redo:function(){c((function(e){e.viewState.mapTilt=t.newValue}))}};s(t),c((function(t){t.viewState.mapTilt=e}))}}},onMapTypeIdChanged:function(){if(x){var e=x.getMapTypeId();if(void 0!==e&&e!==g){var t={name:"Change Map Type",timestamp:Date.now(),oldValue:g,newValue:e,undo:function(){c((function(e){e.viewState.mapType=t.oldValue,e.viewState.groundImageType=e.viewState.mapType}))},redo:function(){c((function(e){e.viewState.mapType=t.newValue,e.viewState.groundImageType=e.viewState.mapType}))}};s(t),c((function(t){t.viewState.mapType=e,t.viewState.groundImageType=e}))}}}})},nW=n.a.memo(rW),cW=["places"],sW=mv.a.div(Az||(Az=Object(gv.a)(["\n position: fixed;\n top: 40px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n"]))),dW=mv.a.div(Tz||(Tz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n width: 410px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n"]))),uW=mv.a.div(Pz||(Pz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),fW=function(){var e=Ew(Vi),t=Ew(si),l=Ew(Sr),a=Ew(i.address),c=Ew(i.latitude),s=Ew(i.longitude),d=Ew(o.mapPanelX),h=Ew(o.mapPanelY),p=Ew(o.groundImage),y=Ew(o.mapZoom),g=Ew(Ni),m=n.a.useRef(null),w=Object(r.useRef)(),x=Object(r.useRef)(null),v=x.current?x.current.clientWidth+40:460,b=x.current?x.current.clientHeight+40:600,A=Object(r.useState)({x:isNaN(d)?0:Math.min(d,window.innerWidth-v),y:isNaN(h)?0:Math.min(h,window.innerHeight-b)}),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],R=H[1],D={lng:e};Object(r.useEffect)((function(){var e=function(){S({x:Math.min(d,window.innerWidth-v),y:Math.min(h,window.innerHeight-b)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var M=Object(ER.f)({id:"google-map-script",googleMapsApiKey:"AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs",libraries:cW}),W=M.isLoaded,I=M.loadError,C=function(){var e={name:"Close Maps",timestamp:Date.now(),undo:function(){t((function(e){e.viewState.showMapPanel=!0}))},redo:function(){t((function(e){e.viewState.showMapPanel=!1}))}};l(e),t((function(e){e.viewState.showMapPanel=!1}))};return Object(gf.jsx)(JT.a,{nodeRef:m,handle:".handle",bounds:"parent",axis:"both",position:P,onDrag:function(e,t){S({x:Math.min(t.x,window.innerWidth-v),y:Math.min(t.y,window.innerHeight-b)})},onStop:function(e,l){t((function(e){e.viewState.mapPanelX=Math.min(l.x,window.innerWidth-v),e.viewState.mapPanelY=Math.min(l.y,window.innerHeight-b)}))},onMouseDown:function(){t((function(e){e.selectedFloatingWindow="mapPanel"}))},children:Object(gf.jsx)(sW,{ref:m,style:{zIndex:"mapPanel"===g?Ke:10},children:Object(gf.jsxs)(dW,{ref:x,children:[Object(gf.jsxs)(uW,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("word.Location",D)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){C()},onMouseDown:function(){C()},children:me.t("word.Close",D)})]}),Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(wv.b,{style:{paddingTop:"10px"},align:"center",size:20,children:Object(gf.jsxs)(wv.b,{direction:"horizontal",children:[Object(gf.jsx)(wv.b,{children:me.t("mapPanel.ImageOnGround",D)+":"}),Object(gf.jsx)(eb.a,{title:"Show ground image",checked:p,onChange:function(e){var a={name:"Show Ground Image",timestamp:Date.now(),checked:e,undo:function(){t((function(e){e.viewState.groundImage=!a.checked}))},redo:function(){t((function(e){e.viewState.groundImage=a.checked}))}};l(a),t((function(t){t.viewState.groundImage=e}))}})]})}),W&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{children:Object(gf.jsx)(ER.e,{onLoad:function(e){w.current=e},onPlacesChanged:function(){var e,o=null===(e=w.current)||void 0===e?void 0:e.getPlaces();if(o&&o.length>0){var i=o[0].geometry;if(i&&i.location){var r={name:"Set Location",timestamp:Date.now(),oldLatitude:c,newLatitude:i.location.lat(),oldLongitude:s,newLongitude:i.location.lng(),oldAddress:a,newAddress:o[0].formatted_address,undo:function(){t((function(e){e.world.latitude=r.oldLatitude,e.world.longitude=r.oldLongitude,e.world.address=r.oldAddress})),R(!z)},redo:function(){t((function(e){e.world.latitude=r.newLatitude,e.world.longitude=r.newLongitude,e.world.address=r.newAddress})),R(!z)}};l(r),t((function(e){if(i.location&&(e.world.latitude=i.location.lat(),e.world.longitude=i.location.lng()),o[0]&&(e.world.address=o[0].formatted_address,o[0].address_components)){var t,l=Object(f.a)(o[0].address_components);try{for(l.s();!(t=l.n()).done;){var a=t.value;if("country"===a.types[0]){e.world.countryCode=a.short_name;break}}}catch(r){l.e(r)}finally{l.f()}}}))}}},children:Object(gf.jsx)("input",{type:"text",placeholder:a,style:{boxSizing:"border-box",border:"1px solid transparent",width:"400px",height:"32px",padding:"0 12px",borderRadius:"3px",boxShadow:"0 2px 6px rgba(0, 0, 0, 0.3)",fontSize:"14px",outline:"none",textOverflow:"ellipses",position:"relative"}})})})}),W?Object(gf.jsx)(wv.b,{children:Object(gf.jsxs)("div",{children:[Object(gf.jsx)(nW,{width:400,height:400}),Object(gf.jsxs)("p",{style:{paddingTop:"10px"},children:[me.t("mapPanel.Coordinates",D)+":"," (",c.toFixed(4),"\xb0,"," ",s.toFixed(4),"\xb0), \xa0",me.t("mapPanel.Zoom",D)+":"," ",y]})]})}):Object(gf.jsx)(Hv,{}),I&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{children:"Map cannot be loaded right now, sorry."})})]})]})})})},hW=n.a.memo(fW),pW=l(348),yW=l(821),gW=l(68),mW=l.n(gW),wW=mv.a.div(Sz||(Sz=Object(gv.a)(["\n position: absolute;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 11;\n"]))),xW=mv.a.div(jz||(jz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 680px;\n padding: 0;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n"]))),vW=mv.a.div(Hz||(Hz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),bW=function(){var e=Ew(Vi),t=Ew(si),l=Ew(Sr),a=Ew(i.date),c=Ew(i.latitude),s=Ew(i.address),d=Tf(Mr),f=Ew(Wr),h=Tf(Lr),p=Ew(o.showSunAngles),y=Ew(o.heliodon),g=Ew(o.heliodonPanelX),m=Ew(o.heliodonPanelY),w=Ew(Ni),x=n.a.useRef(null),v=Object(r.useRef)(0),b=Object(r.useRef)(-1),A=Object(r.useRef)(null),T=A.current?A.current.clientWidth+40:680,P=A.current?A.current.clientHeight+100:250,S=Object(r.useState)({x:isNaN(g)?0:Math.max(g,T-window.innerWidth),y:isNaN(m)?0:Math.min(m,window.innerHeight-P)}),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useMemo)((function(){return new Date(a)}),[a]),C=Object(r.useMemo)((function(){return Ty(I,c)}),[I,c]),O={lng:e};Object(r.useEffect)((function(){var e=function(){z({x:Math.max(g,T-window.innerWidth),y:Math.min(m,window.innerHeight-P)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){return v.current=requestAnimationFrame(F),function(){cancelAnimationFrame(v.current)}}),[d]),Object(r.useEffect)((function(){d&&0===C.sunset&&(cancelAnimationFrame(v.current),Tf.setState((function(e){e.animateSun=!1})))}),[C.sunset]);var F=function e(){var t=Ew.getState().animate24Hours;if(d){v.current=requestAnimationFrame(e);var l=Date.now();if(l-b.current>100){var a=I.getDate(),o=I.getMinutes()+60*I.getHours(),i=Ty(I,Ew.getState().world.latitude);!t&&o>i.sunset&&I.setHours(i.sunrise/60,I.getMinutes()+15),I.setHours(I.getHours(),I.getMinutes()+15),I.setDate(a),k(I,!1),b.current=l}}else cancelAnimationFrame(v.current)},k=function(e,o){var i=new Date(I);if(i.setHours(e.getHours(),e.getMinutes()),o){var r={name:"Set Time",timestamp:Date.now(),oldValue:a,newValue:i.toLocaleString(),undo:function(){t((function(e){e.world.date=r.oldValue}))},redo:function(){t((function(e){e.world.date=r.newValue}))}};l(r)}t((function(e){e.world.date=i.toLocaleString("en-US")}))},Y=function(){var e={name:"Close Sun and Time Settings Panel",timestamp:Date.now(),undo:function(){t((function(e){e.viewState.showHeliodonPanel=!0}))},redo:function(){t((function(e){e.viewState.showHeliodonPanel=!1}))}};l(e),t((function(e){e.viewState.showHeliodonPanel=!1}))},L=Object(r.useRef)(Object(Ly.throttle)((function(e){var a={name:"Set Latitude",timestamp:Date.now(),oldLatitude:c,newLatitude:e,oldAddress:s,newAddress:"",undo:function(){t((function(e){e.world.latitude=a.oldLatitude,e.world.address=a.oldAddress})),W(!M)},redo:function(){t((function(e){e.world.latitude=a.newLatitude,e.world.address=a.newAddress})),W(!M)}};l(a),t((function(t){t.world.latitude=e,t.world.address=""}))}),500,{leading:!1,trailing:!0}));return Object(gf.jsx)(JT.a,{nodeRef:x,handle:".handle",bounds:"parent",axis:"both",position:H,onDrag:function(e,t){z({x:Math.max(t.x,T-window.innerWidth),y:Math.min(t.y,window.innerHeight-P)})},onStop:function(e,l){t((function(e){e.viewState.heliodonPanelX=Math.max(l.x,T-window.innerWidth),e.viewState.heliodonPanelY=Math.min(l.y,window.innerHeight-P)}))},onMouseDown:function(){t((function(e){e.selectedFloatingWindow="heliodonPanel"}))},children:Object(gf.jsx)(wW,{ref:x,style:{zIndex:"heliodonPanel"===w?Ke:11},children:Object(gf.jsxs)(xW,{ref:A,children:[Object(gf.jsxs)(vW,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("heliodonPanel.SunAndTimeSettings",O)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){Y()},onMouseDown:function(){Y()},children:me.t("word.Close",O)})]}),Object(gf.jsxs)(wv.b,{style:{padding:"20px"},align:"baseline",size:20,children:[Object(gf.jsxs)("div",{children:[me.t("menu.settings.Heliodon",O),Object(gf.jsx)("br",{}),Object(gf.jsx)(eb.a,{checked:y,onChange:function(e){var a={name:"Show Heliodon",timestamp:Date.now(),checked:!y,undo:function(){t((function(e){e.viewState.heliodon=!a.checked,e.viewState.heliodon&&e.updateSceneRadius()}))},redo:function(){t((function(e){e.viewState.heliodon=a.checked,e.viewState.heliodon&&e.updateSceneRadius()}))}};l(a),t((function(t){t.viewState.heliodon=e,t.viewState.heliodon&&t.updateSceneRadius()}))}})]}),y&&Object(gf.jsxs)("div",{children:[Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("heliodonPanel.SunAngles",O)}),Object(gf.jsx)("br",{}),Object(gf.jsx)(eb.a,{checked:p,onChange:function(e){var a={name:"Show Sun Angles",timestamp:Date.now(),checked:!p,undo:function(){t((function(e){e.viewState.showSunAngles=!a.checked}))},redo:function(){t((function(e){e.viewState.showSunAngles=a.checked}))}};l(a),t((function(t){t.viewState.showSunAngles=e}))}})]}),C.sunset>0&&!h&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("div",{children:[me.t("word.Animate",O),Object(gf.jsx)("br",{}),Object(gf.jsx)(eb.a,{checked:d,onChange:function(e){var t={name:"Animate Heliodon",timestamp:Date.now(),checked:!d,undo:function(){Tf.setState((function(e){e.animateSun=!t.checked}))},redo:function(){Tf.setState((function(e){e.animateSun=t.checked}))}};l(t),Tf.setState((function(t){t.animateSun=e}))}})]}),d&&Object(gf.jsxs)("div",{children:[Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("heliodonPanel.TwentyFourHours",O)}),Object(gf.jsx)("br",{}),Object(gf.jsx)(eb.a,{checked:f,onChange:function(e){var a={name:"Animate 24 Hours",timestamp:Date.now(),checked:!f,undo:function(){t((function(e){e.animate24Hours=!a.checked}))},redo:function(){t((function(e){e.animate24Hours=a.checked}))}};l(a),t((function(t){t.animate24Hours=e}))}})]})]}),Object(gf.jsxs)("div",{children:[me.t("word.Date",O),Object(gf.jsx)("br",{}),Object(gf.jsx)(pW.a,{disabled:h,value:mW()(I),onChange:function(e){if(e){var o=new Date(I),i=e.toDate();o.setFullYear(i.getFullYear()),o.setMonth(i.getMonth()),o.setDate(i.getDate());var r={name:"Set Date",timestamp:Date.now(),oldValue:a,newValue:o.toString(),undo:function(){t((function(e){e.world.date=r.oldValue}))},redo:function(){t((function(e){e.world.date=r.newValue}))}};l(r),t((function(e){e.world.date=o.toLocaleString("en-US")}))}}})]}),Object(gf.jsxs)("div",{children:[me.t("word.Time",O),Object(gf.jsx)("br",{}),Object(gf.jsx)(yW.a,{disabled:h,value:mW()(I,"HH:mm"),format:"HH:mm",onChange:function(e){e&&(null===k||void 0===k||k(e.toDate(),!0))}})]}),!h&&Object(gf.jsxs)("div",{children:[me.t("word.Latitude",O),": ",c.toFixed(2),"\xb0",Object(gf.jsx)($S.a,{disabled:h,style:{width:"110px"},marks:{"-90":"-90\xb0",0:"0\xb0",90:"90\xb0"},min:-90,max:90,value:c,tooltipVisible:!1,onChange:L.current})]})]})]})})})},AW=n.a.memo(bW),TW=l(285),PW=l(824),SW=l(825),jW=l(239),HW=l(826),zW=l(554),RW=l(135),DW=l(125),MW=l(136),WW=l(234),IW=["title","titleId"];function CW(){return(CW=Object.assign||function(e){for(var t=1;t=0||(o[l]=e[l]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(o[l]=e[l])}return o}function FW(e,t){var l=e.title,a=e.titleId,o=OW(e,IW);return r.createElement("svg",CW({t:1613755944969,className:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg","p-id":5967,xmlnsXlink:"http://www.w3.org/1999/xlink",width:200,height:200,ref:t,"aria-labelledby":a},o),l?r.createElement("title",{id:a},l):null,zz||(zz=r.createElement("defs",null,r.createElement("style",{type:"text/css"}))),Rz||(Rz=r.createElement("path",{d:"M194.187431 235.50871m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z","p-id":5968})),Dz||(Dz=r.createElement("path",{d:"M347.505182 165.510915h552.305182v139.99559H347.505182z","p-id":5969})),Mz||(Mz=r.createElement("path",{d:"M194.187431 512.1129m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z","p-id":5970})),Wz||(Wz=r.createElement("path",{d:"M347.505182 442.115105h552.305182v139.99559H347.505182z","p-id":5971})),Iz||(Iz=r.createElement("path",{d:"M194.187431 788.49129m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z","p-id":5972})),Cz||(Cz=r.createElement("path",{d:"M347.505182 718.719294h552.305182v139.99559H347.505182z","p-id":5973})))}var kW,YW,LW=r.forwardRef(FW),EW=(l.p,Object(mv.a)(LW)(kW||(kW=Object(gv.a)(["\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n"])))),UW=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.changeHorizontalGrid,o=e.changeVerticalGrid,i={lng:Ew(Vi)},n=Object(r.useState)(!1),c=Object(u.a)(n,2),s=c[0],d=c[1],f=Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:t,onClick:function(){null===a||void 0===a||a(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",i)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:l,onClick:function(){null===o||void 0===o||o(!l)},children:me.t("menu.graph.ShowVerticalGridLines",i)})})]});return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(lb.a,{overlay:f,placement:"bottomRight",visible:s,onVisibleChange:function(e){d(e)},children:Object(gf.jsx)(EW,{style:{right:"32px"},onClick:function(e){e.stopPropagation()}})})})},NW=function(e){var t=e.type,l=e.dataSource,a=e.height,o=e.dataKeyAxisX,i=e.labelX,n=e.labelY,c=e.unitX,s=e.unitY,d=e.yMin,f=void 0===d?"auto":d,h=e.yMax,p=void 0===h?"auto":h,y=e.fractionDigits,g=void 0===y?2:y,m=e.referenceX,w=e.color,x=Object(r.useState)(0),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(!0),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!0),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(null),W=Object(u.a)(M,2),I=W[0],C=W[1];Object(r.useEffect)((function(){if(l&&0!==l.length){var e=Array.isArray(l)?Object.keys(l[0]).length-1:Object.keys(l).length-1;b!==e&&A(e)}}),[l]);var O=Object(r.useMemo)((function(){for(var e=[],l=0;l1&&Object(gf.jsx)(WW.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(e){C(null)},onMouseEnter:function(e){C(e.dataKey)}})]})}),Object(gf.jsx)(UW,{horizontalGrid:S,verticalGrid:R,changeHorizontalGrid:function(e){j(e)},changeVerticalGrid:function(e){D(e)}})]})})})},VW=l(290),JW=l(291),GW=l(827),XW=l(828),BW=["circle","square","triangle up","triangle down","triangle right","triangle left","star","diamond","hexagon"];!function(e){e[e.DOWN=0]="DOWN",e[e.UP=1]="UP",e[e.LEFT=2]="LEFT",e[e.RIGHT=3]="RIGHT"}(YW||(YW={}));var KW,qW,QW,ZW,_W,$W,eI,tI,lI,aI,oI,iI,rI,nI,cI,sI,dI,uI,fI,hI,pI,yI,gI,mI,wI,xI,vI,bI,AI,TI,PI,SI,jI,HI,zI,RI,DI,MI,WI,II,CI,OI,FI,kI,YI,LI,EI,UI,NI,VI,JI,GI,XI,BI,KI,qI,QI,ZI,_I,$I,eC,tC,lC,aC,oC,iC,rC,nC,cC,sC,dC,uC,fC,hC,pC,yC,gC,mC,wC,xC,vC,bC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);return t&&l&&i>0&&i%d===0?Object(gf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(gf.jsx)("circle",{cx:"0",cy:"0",r:"3",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})}):null},AC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);return t&&l&&i>0&&i%d===0?Object(gf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(gf.jsx)("rect",{x:"-3",y:"-3",width:"6",height:"6",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})}):null},TC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.direction,d=e.fillColor,u=Math.round(r.length/c);if(t&&l&&i>0&&i%u===0){var f;switch(s){case YW.UP:f="-4,2.5,4,2.5,0,-3.5";break;case YW.LEFT:f="2.5,4,2.5,-4,-3.5,0";break;case YW.RIGHT:f="-2.5,4,-2.5,-4,3.5,0";break;default:f="-4,-2.5,4,-2.5,0,3.5"}return Object(gf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(gf.jsx)("polygon",{points:f,style:{opacity:a,stroke:o,fill:null!==d&&void 0!==d?d:"white",strokeWidth:1}})})}return null},PC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);return t&&l&&i>0&&i%d===0?Object(gf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(gf.jsx)("polygon",{points:"-3,0,0,5,3,0,0,-5",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})}):null},SC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);if(t&&l&&i>0&&i%d===0){var u=.05*n;return Object(gf.jsx)("svg",{x:t-100*u,y:l-100*u,width:300*u,height:300*u,viewBox:"0 0 300 300",children:Object(gf.jsx)("polygon",{points:"100,10 40,180 190,60 10,60 160,180",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})})}return null},jC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);if(t&&l&&i>0&&i%d===0){var u=.02*n;return Object(gf.jsx)("svg",{x:t-150*u,y:l-150*u,width:300*u,height:300*u,viewBox:"0 0 300 300",children:Object(gf.jsx)("polygon",{className:"hex",points:"300,150 225,280 75,280 0,150 75,20 225,20",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})})}return null},HC=function(e,t,l,a,o){switch(e){case"circle":return Object(gf.jsx)(bC,{scale:t,numberOfSymbols:l,opacity:a,fillColor:o});case"square":return Object(gf.jsx)(AC,{scale:t,numberOfSymbols:l,opacity:a,fillColor:o});case"triangle up":return Object(gf.jsx)(TC,{scale:1.1*t,numberOfSymbols:l,direction:YW.UP,opacity:a,fillColor:o});case"triangle down":return Object(gf.jsx)(TC,{scale:1.1*t,numberOfSymbols:l,direction:YW.DOWN,opacity:a,fillColor:o});case"triangle right":return Object(gf.jsx)(TC,{scale:1.1*t,numberOfSymbols:l,direction:YW.RIGHT,opacity:a,fillColor:o});case"triangle left":return Object(gf.jsx)(TC,{scale:1.1*t,numberOfSymbols:l,direction:YW.LEFT,opacity:a,fillColor:o});case"star":return Object(gf.jsx)(SC,{scale:1.25*t,numberOfSymbols:l,opacity:a,fillColor:o});case"diamond":return Object(gf.jsx)(PC,{scale:1.1*t,numberOfSymbols:l,opacity:a,fillColor:o});case"hexagon":return Object(gf.jsx)(jC,{scale:1.3*t,numberOfSymbols:l,opacity:a,fillColor:o})}},zC=Object(mv.a)(LW)(KW||(KW=Object(gv.a)(["\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n"]))),RC=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.lineCount,o=e.lineWidth,i=e.symbolSize,n=e.changeHorizontalGrid,c=e.changeVerticalGrid,s=e.changeLineWidth,d=e.changeSymbolSize,f={lng:Ew(Vi)},h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.LineWidth",f)+":",Object(gf.jsx)($S.a,{min:0,max:10,tooltipVisible:!1,defaultValue:2*o,onChange:function(e){null===s||void 0===s||s(e/2)}})]}),Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.SymbolSize",f)+":",Object(gf.jsx)($S.a,{min:2,max:12,tooltipVisible:!1,defaultValue:5*i,onChange:function(e){null===d||void 0===d||d(e/5)}})]}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:t,onClick:function(){null===n||void 0===n||n(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",f)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:l,onClick:function(){null===c||void 0===c||c(!l)},children:me.t("menu.graph.ShowVerticalGridLines",f)})})]});return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(lb.a,{overlay:m,placement:"bottomRight",visible:y,onVisibleChange:function(e){g(e)},children:Object(gf.jsx)(zC,{style:{right:a>1?"25px":"32px"},onClick:function(e){e.stopPropagation()}})})})},DC=function(e){var t=e.type,l=e.chartType,a=void 0===l?Y.Line:l,o=e.selectedIndex,i=e.dataSource,n=e.labels,c=e.height,s=e.dataKeyAxisX,d=e.labelX,f=e.labelY,h=e.unitX,p=e.unitY,y=e.yMin,g=void 0===y?"auto":y,m=e.yMax,w=void 0===m?"auto":m,x=e.curveType,v=void 0===x?"linear":x,b=e.referenceX,A=e.fractionDigits,T=void 0===A?2:A,P=e.symbolCount,S=void 0===P?12:P,j=Object(r.useState)(0),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)(!0),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useState)(!0),O=Object(u.a)(C,2),F=O[0],k=O[1],E=Object(r.useState)(null),U=Object(u.a)(E,2),N=U[0],V=U[1],J=Object(r.useState)(2),G=Object(u.a)(J,2),X=G[0],B=G[1],K=Object(r.useState)(1),q=Object(u.a)(K,2),Q=q[0],Z=q[1];Object(r.useEffect)((function(){if(i&&0!==i.length){var e=Array.isArray(i)?Object.keys(i[0]).length-1:Object.keys(i).length-1;z!==e&&R(e)}else R(0)}),[z,i]);var _=Object(r.useMemo)((function(){for(var e,l=[],i=0;i0&&(s||e),isAnimationActive:!1},i))}return l}),[t,a,o,v,n,z,X,S,Q,N]),$=function(e){},ee=function(e){V(e.dataKey)},te=function(e){V(null)};return Object(gf.jsx)(gf.Fragment,{children:i&&Object(gf.jsx)("div",{id:"line-graph-"+d+"-"+f,style:{width:"100%",height:"".concat(c,"%"),position:"relative",direction:"ltr"},children:Object(gf.jsxs)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:[Object(gf.jsx)(PW.a,{width:"100%",height:"100%",children:a===Y.Area?Object(gf.jsxs)(GW.a,{data:i,onMouseDown:$,margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(jW.a,{formatter:function(e){return e.toFixed(T)+" "+p}}),Object(gf.jsx)(HW.a,{vertical:F,horizontal:W,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(zW.a,{x:b,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(RW.a,{dataKey:null!==s&&void 0!==s?s:d,fontSize:"10px",children:Object(gf.jsx)(DW.a,{value:d+(h?" ("+h+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(MW.a,{domain:[g,w],fontSize:"10px",children:Object(gf.jsx)(DW.a,{dx:-15,value:f+(p?" ("+p+")":""),offset:0,angle:-90,position:"center"})}),_,z>1&&Object(gf.jsx)(WW.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:te,onMouseEnter:ee})]}):Object(gf.jsxs)(XW.a,{data:i,onMouseDown:$,margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(jW.a,{formatter:function(e){return e.toFixed(T)+" "+p}}),Object(gf.jsx)(HW.a,{vertical:F,horizontal:W,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(zW.a,{x:b,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(RW.a,{dataKey:null!==s&&void 0!==s?s:d,fontSize:"10px",children:Object(gf.jsx)(DW.a,{value:d+(h?" ("+h+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(MW.a,{domain:[g,w],fontSize:"10px",children:Object(gf.jsx)(DW.a,{dx:-15,value:f+(p?" ("+p+")":""),offset:0,angle:-90,position:"center"})}),_,z>1&&Object(gf.jsx)(WW.a,{wrapperStyle:{fontSize:"11px"},iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:te,onMouseEnter:ee})]})}),Object(gf.jsx)(RC,{lineCount:z,symbolSize:Q,lineWidth:X,horizontalGrid:W,verticalGrid:F,changeHorizontalGrid:function(e){I(e)},changeVerticalGrid:function(e){k(e)},changeLineWidth:function(e){B(e)},changeSymbolSize:function(e){Z(e)}})]})})})},MC=mv.a.div(qW||(qW=Object(gv.a)(["\n position: fixed;\n top: 80px;\n left: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n"]))),WC=mv.a.div(QW||(QW=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 300px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n"]))),IC=mv.a.div(ZW||(ZW=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),CC=function(e){var t,l=e.city,a=e.graphs,c=Ew(Vi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),f=Ew(Sr),h=new Date(Ew(i.date)),p=Ew(Cs),y=Ew(o.weatherPanelRect),g=Ew(Ni),m=n.a.useRef(null),w=Object(r.useRef)(null),x=Object(r.useRef)(),v=w.current?w.current.clientWidth+40:y?y.width+40:540,b=w.current?w.current.clientHeight+100:y?y.height+100:600,A=Object(r.useState)({x:y?Math.min(y.x,window.innerWidth-v):0,y:y?Math.min(y.y,window.innerHeight-b):0}),T=Object(u.a)(A,2),P=T[0],S=T[1],j={lng:c};Object(r.useEffect)((function(){S({x:Math.min(null===y||void 0===y?void 0:y.x,window.innerWidth-v),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-b)})}),[y,v,b]),Object(r.useEffect)((function(){var e=function(){S({x:Math.min(null===y||void 0===y?void 0:y.x,window.innerWidth-v),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-b)})};return window.addEventListener("resize",e),w.current&&(x.current||(x.current=new ResizeObserver((function(){d((function(e){w.current&&(e.viewState.weatherPanelRect||(e.viewState.weatherPanelRect=new Ot(0,0,500,500)),e.viewState.weatherPanelRect.width=w.current.offsetWidth,e.viewState.weatherPanelRect.height=w.current.offsetHeight)}))}))),x.current.observe(w.current)),function(){var t;window.removeEventListener("resize",e),null===(t=x.current)||void 0===t||t.disconnect()}}),[y,v,b]);var H=Object(r.useMemo)((function(){return a?Math.floor(100/a.length):100}),[a]),z=Object(r.useMemo)((function(){if(a){var e={};if(l){var t=p(l);t&&a.forEach((function(l){switch(e[l]=[],l){case L.MonthlyTemperatures:for(var a=0;a<12;a++)e[l].push({Month:it[a],Low:t.lowestTemperatures[a],High:t.highestTemperatures[a]});break;case L.SunshineHours:for(var o=0;o<12;o++)e[l].push({Month:it[o],Sunshine:t.sunshineHours[o]})}}))}return e}}),[a,l]),R=["NA",me.t("word.Temperature",j),me.t("word.Temperature",j),me.t("weatherPanel.SunshineHours",j)],D=["NA","\xb0C","\xb0C",me.t("word.Hour",j)],M=it[h.getMonth()],W=function(){var e={name:"Close Weather Panel",timestamp:Date.now(),undo:function(){d((function(e){e.viewState.showWeatherPanel=!0}))},redo:function(){d((function(e){e.viewState.showWeatherPanel=!1}))}};f(e),d((function(e){e.viewState.showWeatherPanel=!1}))};return Object(gf.jsx)(JT.a,{nodeRef:m,handle:".handle",bounds:"parent",axis:"both",position:P,onDrag:function(e,t){S({x:Math.min(t.x,window.innerWidth-v),y:Math.min(t.y,window.innerHeight-b)})},onStop:function(e,t){d((function(e){e.viewState.weatherPanelRect||(e.viewState.weatherPanelRect=new Ot(0,0,500,500)),e.viewState.weatherPanelRect.x=Math.min(t.x,window.innerWidth-v),e.viewState.weatherPanelRect.y=Math.min(t.y,window.innerHeight-b)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="weatherPanel"}))},children:Object(gf.jsx)(MC,{ref:m,style:{zIndex:"weatherPanel"===g?Ke:10},children:Object(gf.jsxs)(WC,{ref:w,style:{opacity:s,width:(y?y.width:500)+"px",height:(y?y.height:500)+"px"},children:[Object(gf.jsxs)(IC,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("word.Weather",j)+": "+((null===l||void 0===l?void 0:l.trim().endsWith(","))?null===l||void 0===l?void 0:l.trim().substring(0,(null===l||void 0===l?void 0:l.length)-2):l)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){W()},onMouseDown:function(){W()},children:me.t("word.Close",j)})]}),Object(gf.jsx)(gf.Fragment,{children:a.map((function(e){return e===L.SunshineHours?Object(gf.jsx)(NW,{type:e,dataSource:z[e],height:H,dataKeyAxisX:"Month",labelX:me.t("word.Month",j),labelY:R[e],unitY:D[e],yMin:0,fractionDigits:1,referenceX:M,color:"#FFD700"},e):Object(gf.jsx)(DC,{chartType:Y.Line,type:e,dataSource:z[e],height:H,dataKeyAxisX:"Month",labelX:me.t("word.Month",j),labelY:R[e],unitY:D[e],fractionDigits:1,referenceX:M},e)}))})]})})})},OC=n.a.memo(CC),FC=l(857),kC=l(858),YC=l(859),LC=l(860),EC=["Daylight","Clearness"],UC=mv.a.div(_W||(_W=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),NC=mv.a.div($W||($W=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),VC=mv.a.div(eI||(eI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),JC=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),f=new Date(Ew(i.date)),h=Pf(Tu),p=Pf(Su),y=Ew(o.yearlyLightSensorPanelRect),g=Ew(ds),m=Ew(o.yearlyLightSensorPanelShowDaylight),w=Ew(o.yearlyLightSensorPanelShowClearness),x=Ew(Ni),v=Object(r.useState)(!0),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(null),S=Object(r.useRef)(),j=P.current?P.current.clientWidth+40:y?y.width+40:640,H=P.current?P.current.clientHeight+100:y?y.height+100:600,z=Object(r.useState)({x:y?Math.max(y.x,j-window.innerWidth):0,y:y?Math.min(y.y,window.innerHeight-H):0}),R=Object(u.a)(z,2),D=R[0],M=R[1],W=n.a.useRef(null),I={lng:a},C=it[f.getMonth()];Object(r.useEffect)((function(){M({x:Math.max(null===y||void 0===y?void 0:y.x,j-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-H)})}),[y,j,H]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===y||void 0===y?void 0:y.x,j-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-H)})};return window.addEventListener("resize",e),P.current&&(S.current||(S.current=new ResizeObserver((function(){d((function(e){P.current&&(e.viewState.yearlyLightSensorPanelRect||(e.viewState.yearlyLightSensorPanelRect=new Ot(0,0,600,500)),e.viewState.yearlyLightSensorPanelRect.width=P.current.offsetWidth,e.viewState.yearlyLightSensorPanelRect.height=P.current.offsetHeight)}))}))),S.current.observe(P.current)),function(){var t;window.removeEventListener("resize",e),null===(t=S.current)||void 0===t||t.disconnect()}}),[y,j,H]);var O=function(){d((function(e){e.viewState.showYearlyLightSensorPanel=!1,c&&(e.actionInfo={name:"Close Yearly Light Sensor Graph",timestamp:(new Date).getTime()})}))},F=me.t("word.Month",I),k=me.t("word.Radiation",I),E=!h||!h[0]||0===Object.keys(h[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:W,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-H)})},onStop:function(e,t){d((function(e){e.viewState.yearlyLightSensorPanelRect||(e.viewState.yearlyLightSensorPanelRect=new Ot(0,0,600,500)),e.viewState.yearlyLightSensorPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyLightSensorPanelRect.y=Math.min(t.y,window.innerHeight-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="yearlyLightSensorPanel"}))},children:Object(gf.jsx)(UC,{ref:W,style:{zIndex:"yearlyLightSensorPanel"===x?Ke:9},children:Object(gf.jsxs)(NC,{ref:P,style:{opacity:s,width:(y?y.width:600)+"px",height:(y?y.height:500)+"px"},children:[Object(gf.jsxs)(VC,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("sensorPanel.LightSensor",I)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",I)+" "+l+" | "+f.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",I)})]}),m&&Object(gf.jsx)(DC,{type:L.DaylightData,chartType:Y.Area,dataSource:h.map((function(e){return{Month:e.Month,Daylight:e.Daylight}})),height:100,dataKeyAxisX:"Month",labelX:F,labelY:me.t("word.Daylight",I),unitY:me.t("word.Hour",I),yMin:0,curveType:"linear",fractionDigits:1,referenceX:C}),w&&Object(gf.jsx)(NW,{type:L.ClearnessData,dataSource:h.map((function(e){return{Month:e.Month,Clearness:e.Clearness}})),height:100,dataKeyAxisX:"Month",labelX:F,labelY:me.t("yearlyLightSensorPanel.SkyClearness",I),unitY:"%",yMin:0,yMax:100,fractionDigits:1,referenceX:C,color:"#66CDAA"}),A&&Object(gf.jsx)(DC,{type:L.YearlyRadiationSensorData,chartType:Y.Line,dataSource:h.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,EC)})),labels:p,height:100,dataKeyAxisX:"Month",labelX:F,labelY:k,unitY:"kWh/m\xb2/"+me.t("word.Day",I),yMin:0,curveType:"linear",fractionDigits:2,referenceX:C}),Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",padding:"10px",direction:"ltr"},children:[Object(gf.jsxs)(wv.b,{children:[Object(gf.jsx)(eb.a,{title:me.t("yearlyLightSensorPanel.ShowDaylightResults",I),checked:m,onChange:function(e){d((function(t){t.viewState.yearlyLightSensorPanelShowDaylight=e}))}}),me.t("word.Daylight",I)]}),Object(gf.jsxs)(wv.b,{children:[Object(gf.jsx)(eb.a,{title:me.t("yearlyLightSensorPanel.ShowSkyClearnessResults",I),checked:w,onChange:function(e){d((function(t){t.viewState.yearlyLightSensorPanelShowClearness=e}))}}),me.t("yearlyLightSensorPanel.SkyClearness",I)]}),Object(gf.jsxs)(wv.b,{children:[Object(gf.jsx)(eb.a,{title:me.t("yearlyLightSensorPanel.ShowAverageDailySolarRadiation",I),checked:A,onChange:function(e){T(e)}}),me.t("word.Radiation",I)]}),Object(gf.jsxs)(wv.b,{children:[Object(gf.jsx)(xv.a,{type:"default",icon:E?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(E?"word.Run":"word.Update",I),onClick:function(){0!==g(V.Sensor)?(Kh(me.t("message.SimulationStarted",I)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Collect Yearly Data for Sensors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlyLightSensor=!0,e.pauseYearlyLightSensor=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",I))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",I),onClick:function(){_h("line-graph-"+F+"-"+k,"yearly-light-sensor",{}).then((function(){Kh(me.t("message.ScreenshotSaved",I)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Yearly Light Sensor Graph",timestamp:(new Date).getTime()}}))}))}}),h&&h.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",I),onClick:function(){$h(h,"yearly-light-sensor.csv"),Kh(me.t("message.CsvFileSaved",I)),c&&d((function(e){e.actionInfo={name:"Export Yearly Light Sensor Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})]})})})},GC=n.a.memo(JC),XC=mv.a.div(tI||(tI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),BC=mv.a.div(lI||(lI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),KC=mv.a.div(aI||(aI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),qC=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),f=new Date(Ew(i.date)),h=Pf(Su),p=Pf(bu),y=Ew(o.dailyLightSensorPanelRect),g=Ew(ds),m=Ew(Ni),w=n.a.useRef(null),x=Object(r.useRef)(null),v=Object(r.useRef)(),b=x.current?x.current.clientWidth+40:y?y.width+40:640,A=x.current?x.current.clientHeight+100:y?y.height+100:460,T=Object(r.useState)({x:y?Math.max(y.x,b-window.innerWidth):0,y:y?Math.min(y.y,window.innerHeight-A):0}),P=Object(u.a)(T,2),S=P[0],j=P[1],H={lng:a};Object(r.useEffect)((function(){j({x:Math.max(null===y||void 0===y?void 0:y.x,b-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-A)})}),[y,b,A]),Object(r.useEffect)((function(){var e=function(){j({x:Math.max(null===y||void 0===y?void 0:y.x,b-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-A)})};return window.addEventListener("resize",e),x.current&&(v.current||(v.current=new ResizeObserver((function(){d((function(e){x.current&&(e.viewState.dailyLightSensorPanelRect||(e.viewState.dailyLightSensorPanelRect=new Ot(0,0,600,360)),e.viewState.dailyLightSensorPanelRect.width=x.current.offsetWidth,e.viewState.dailyLightSensorPanelRect.height=x.current.offsetHeight)}))}))),v.current.observe(x.current)),function(){var t;window.removeEventListener("resize",e),null===(t=v.current)||void 0===t||t.disconnect()}}),[y,b,A]);var z=function(){d((function(e){e.viewState.showDailyLightSensorPanel=!1,c&&(e.actionInfo={name:"Close Daily Light Sensor Graph",timestamp:(new Date).getTime()})}))},R=me.t("word.Hour",H),D=me.t("word.Radiation",H),M=!p||!p[0]||0===Object.keys(p[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:w,handle:".handle",bounds:"parent",axis:"both",position:S,onDrag:function(e,t){j({x:Math.max(t.x,b-window.innerWidth),y:Math.min(t.y,window.innerHeight-A)})},onStop:function(e,t){d((function(e){e.viewState.dailyLightSensorPanelRect||(e.viewState.dailyLightSensorPanelRect=new Ot(0,0,600,360)),e.viewState.dailyLightSensorPanelRect.x=Math.max(t.x,b-window.innerWidth),e.viewState.dailyLightSensorPanelRect.y=Math.min(t.y,window.innerHeight-A)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyLightSensorPanel"}))},children:Object(gf.jsx)(XC,{ref:w,style:{zIndex:"dailyLightSensorPanel"===m?Ke:9},children:Object(gf.jsxs)(BC,{ref:x,style:{opacity:s,width:(y?y.width:600)+"px",height:(y?y.height:360)+"px"},children:[Object(gf.jsxs)(KC,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("sensorPanel.LightSensor",H)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",H)+" "+l+" | "+mW()(f).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){z()},onMouseDown:function(){z()},children:me.t("word.Close",H)})]}),Object(gf.jsx)(DC,{type:L.DailyRadiationSensorData,chartType:Y.Line,dataSource:p,labels:h,height:100,dataKeyAxisX:"Hour",labelX:R,labelY:D,unitY:"kWh/m\xb2",yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:f.getHours()}),Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Object(gf.jsx)(xv.a,{type:"default",icon:M?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(M?"word.Run":"word.Update",H),onClick:function(){0!==g(V.Sensor)?(Kh(me.t("message.SimulationStarted",H)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Collect Daily Data for Sensors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailyLightSensor=!0,e.pauseDailyLightSensor=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",H))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",H),onClick:function(){_h("line-graph-"+R+"-"+D,"daily-light-sensor",{}).then((function(){Kh(me.t("message.ScreenshotSaved",H)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Light Sensor Graph",timestamp:(new Date).getTime()}}))}))}}),p&&p.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",H),onClick:function(){$h(p,"daily-light-sensor.csv"),Kh(me.t("message.CsvFileSaved",H)),c&&d((function(e){e.actionInfo={name:"Export Daily Light Sensor Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},QC=n.a.memo(qC),ZC=mv.a.div(oI||(oI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 12;\n"]))),_C=mv.a.div(iI||(iI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 200px;\n max-width: 800px;\n min-height: 60px;\n max-height: 600px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n"]))),$C=mv.a.div(rI||(rI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),eO=ET.a.TextArea,tO=function(){var e,t=Ew(Vi),l=Ew(Sr),a=null!==(e=Ew(Ui))&&void 0!==e?e:Qe,i=Ew(si),c=Ew(ki),s=Ew(o.stickyNotePanelRect),d=Ew(Ni),f=n.a.useRef(null),h=Object(r.useRef)(null),p=Object(r.useRef)(),y=h.current?h.current.clientWidth+40:s?s.width+40:440,g=h.current?h.current.clientHeight+100:s?s.height+100:400,m=Object(r.useState)({x:s?Math.min(s.x,window.innerWidth-y):0,y:s?Math.min(s.y,window.innerHeight-g):0}),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(c.length>0?c[0]:""),A=Object(u.a)(b,2),T=A[0],P=A[1],S={lng:t};Object(r.useEffect)((function(){v({x:Math.min(null===s||void 0===s?void 0:s.x,window.innerWidth-y),y:Math.min(null===s||void 0===s?void 0:s.y,window.innerHeight-g)})}),[s,y,g]),Object(r.useEffect)((function(){var e=function(){v({x:Math.min(null===s||void 0===s?void 0:s.x,window.innerWidth-y),y:Math.min(null===s||void 0===s?void 0:s.y,window.innerHeight-g)})};return window.addEventListener("resize",e),h.current&&(p.current||(p.current=new ResizeObserver((function(){i((function(e){h.current&&(e.viewState.stickyNotePanelRect||(e.viewState.stickyNotePanelRect=new Ot(0,0,400,300)),e.viewState.stickyNotePanelRect.width=h.current.offsetWidth,e.viewState.stickyNotePanelRect.height=h.current.offsetHeight)}))}))),p.current.observe(h.current)),function(){var t;window.removeEventListener("resize",e),null===(t=p.current)||void 0===t||t.disconnect()}}),[s,y,g]),Object(r.useEffect)((function(){P(c.length>0?c[0]:"")}),[c]);var j=function(){var e={name:"Close Sticky Note",timestamp:Date.now(),undo:function(){i((function(e){e.viewState.showStickyNotePanel=!0}))},redo:function(){i((function(e){e.viewState.showStickyNotePanel=!1}))}};l(e),i((function(e){e.viewState.showStickyNotePanel=!1,e.notes[0]=T}))};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(JT.a,{nodeRef:f,handle:".handle",bounds:"parent",axis:"both",position:x,onDrag:function(e,t){v({x:Math.min(t.x,window.innerWidth-y),y:Math.min(t.y,window.innerHeight-g)})},onStop:function(e,t){i((function(e){e.viewState.stickyNotePanelRect||(e.viewState.stickyNotePanelRect=new Ot(0,0,400,300)),e.viewState.stickyNotePanelRect.x=Math.min(t.x,window.innerWidth-y),e.viewState.stickyNotePanelRect.y=Math.min(t.y,window.innerHeight-g)}))},onMouseDown:function(){i((function(e){e.selectedFloatingWindow="stickyNotePanel"}))},children:Object(gf.jsx)(ZC,{ref:f,style:{zIndex:"stickyNotePanel"===d?Ke:12},children:Object(gf.jsxs)(_C,{ref:h,style:{opacity:a,width:(s?s.width:400)+"px",height:(s?s.height:300)+"px"},children:[Object(gf.jsxs)($C,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("menu.view.accessories.Note",S)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){j()},onTouchStart:function(){j()},children:me.t("word.Close",S)})]}),Object(gf.jsx)(eO,{style:{resize:"none"},rows:100,value:T,onChange:function(e){P(e.target.value)},onBlur:function(){i((function(e){e.notes[0]=T}))},onPointerOut:function(){i((function(e){e.notes[0]=T}))}})]})})})})},lO=n.a.memo(tO),aO=l(118),oO=mv.a.div(nI||(nI=Object(gv.a)(["\n position: absolute;\n top: 80px;\n left: 10px;\n margin: auto;\n display: flex;\n justify-content: left;\n align-self: flex-start;\n align-content: flex-start;\n align-items: start;\n padding: 16px;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n"]))),iO=mv.a.div(cI||(cI=Object(gv.a)(["\n position: absolute;\n top: 0;\n left: 0;\n align-self: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n margin: auto;\n width: 310px;\n padding-bottom: 10px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n"]))),rO=function(){var e,t,l=Ew(si),a=Ew(Sr),i=Ew(Vi),r=Ew(Es),n=null!==(e=Ew(o.orthographic))&&void 0!==e&&e,c=null!==(t=Ew(o.navigationView))&&void 0!==t&&t,s={lng:i},d=r.y>0?"navajowhite":"antiquewhite",u=Tw.isMac(),f=function(e){l((function(t){t.viewState.navigationView=e,t.viewState.enableRotate=!e}))};return Object(gf.jsx)(oO,{children:Object(gf.jsxs)(iO,{style:{color:d,fontSize:c?"10px":"9px"},children:[c&&Object(gf.jsxs)("span",{style:{fontSize:"12px",paddingLeft:"6px",paddingRight:"6px",paddingTop:"2px",paddingBottom:"2px",marginBottom:"6px",background:"tomato",border:"1px solid"},children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.NavigationMode",s)}),Object(gf.jsx)(aO.a,{style:{paddingLeft:"6px",cursor:"pointer"},onClick:function(){var e={name:"Close Navigation Mode",timestamp:Date.now(),undo:function(){f(!0)},redo:function(){f(!1)}};a(e),f(!1)}})]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t(c?"instructionPanel.DisableNavigation":"instructionPanel.EnableNavigation",s)}),": ",me.t("word.Press",s)," ",u?"\u2318":"Ctrl","+U"]}),c&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.MoveForwardBack",s)}),":"," ",me.t("instructionPanel.MoveForwardBackInstruction",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.MoveLeftRight",s)}),":"," ",me.t("instructionPanel.MoveLeftRightInstruction",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.MoveUpDown",s)}),":"," ",me.t("instructionPanel.MoveUpDownInstruction",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.Turn",s)}),": ",me.t("instructionPanel.TurnInstruction",s)]})]}),!n&&!c&&Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.Rotate",s)}),": ",me.t("instructionPanel.DragMouse",s)]}),!c&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.Zoom",s)}),":"," ",me.t(u?"instructionPanel.MouseWheelOrKeysMac":"instructionPanel.MouseWheelOrKeys",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.Pan",s)}),":"," ",me.t(u?"instructionPanel.HoldMetaDragMouse":"instructionPanel.HoldCtrlDragMouse",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t(n?"instructionPanel.Exit2DMode":"instructionPanel.Enter2DMode",s)}),":"," ",me.t("word.Press",s)," ",u?"\u2318":"Ctrl","+B"]})]})]})})},nO=n.a.memo(rO),cO=l(861),sO=["Daylight","Clearness"],dO=mv.a.div(sI||(sI=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),uO=mv.a.div(dI||(dI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),fO=mv.a.div(uI||(uI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),hO=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.daysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(td),w=Ew(ld),x=Pf(od),v=Ew(ds),b=Ew(o.yearlyPvYieldPanelRect),A=Tf(Nr),T=Ew.getState().economicsParams,P=Tf(ms),S=Ew(Ni),j=n.a.useRef(null),H=Object(r.useRef)(null),z=H.current?H.current.clientWidth+40:640,R=H.current?H.current.clientHeight+100:500,D=Object(r.useState)({x:b?Math.max(b.x,z-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-R):0}),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useState)(0),O=Object(u.a)(C,2),F=O[0],k=O[1],E=Object(r.useRef)(new Map),U=Object(r.useRef)(),N=it[g.getMonth()],J={lng:c},G=v(V.SolarPanel);Object(r.useEffect)((function(){var e=0;E.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],E.current.set(o,(null!==(i=E.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}k(e)}),[m]),Object(r.useEffect)((function(){I({x:Math.max(null===b||void 0===b?void 0:b.x,z-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-R)})}),[b,z,R]),Object(r.useEffect)((function(){var e=function(){I({x:Math.max(null===b||void 0===b?void 0:b.x,z-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-R)})};return window.addEventListener("resize",e),H.current&&(U.current||(U.current=new ResizeObserver((function(){p((function(e){H.current&&(e.viewState.yearlyPvYieldPanelRect||(e.viewState.yearlyPvYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyPvYieldPanelRect.width=H.current.offsetWidth,e.viewState.yearlyPvYieldPanelRect.height=H.current.offsetHeight)}))}))),U.current.observe(H.current)),function(){var t;window.removeEventListener("resize",e),null===(t=U.current)||void 0===t||t.disconnect()}}),[b,z,R]);var X=function(){p((function(e){e.viewState.showYearlyPvYieldPanel=!1,s&&(e.actionInfo={name:"Close Solar Panel Yearly Yield Graph",timestamp:(new Date).getTime()})}))};Object(r.useEffect)((function(){G<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}))}),[G,w]);var B=me.t("word.Month",J),K=me.t("solarPanelYieldPanel.Yield",J),q=Tw.countAllSolarPanels(),Q=12/y,Z=F*Q,_=q*T.operationalCostPerUnit*365,$=Z*T.electricitySellingPrice,ee=$-_,te=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:j,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){I({x:Math.max(t.x,z-window.innerWidth),y:Math.min(t.y,window.innerHeight-R)})},onStop:function(e,t){p((function(e){e.viewState.yearlyPvYieldPanelRect||(e.viewState.yearlyPvYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyPvYieldPanelRect.x=Math.max(t.x,z-window.innerWidth),e.viewState.yearlyPvYieldPanelRect.y=Math.min(t.y,window.innerHeight-R)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyPvYieldPanel"}))},children:Object(gf.jsx)(dO,{ref:j,style:{zIndex:"yearlyPvYieldPanel"===S?Ke:9},children:Object(gf.jsxs)(uO,{ref:H,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(fO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("solarPanelYieldPanel.SolarPanelYearlyYield",J)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",J)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){X()},onMouseDown:function(){X()},children:me.t("word.Close",J)})]}),Object(gf.jsx)(DC,{type:L.YearlyPvYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,sO)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:B,labelY:K,unitY:me.t("word.kWh",J),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!P&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&G>1&&E.current.size>0?Object(gf.jsx)(pD.a,{title:me.t("shared.OutputBreakdown",J),content:Object(h.a)(E.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*Q).toFixed(2)})]}),t===E.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",J)+": "+Z.toFixed(2)+" "+me.t("word.kWh",J)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",J)})}):Object(gf.jsxs)(gf.Fragment,{children:[Z>0&&Object(gf.jsx)(wv.b,{children:me.t("solarPanelYieldPanel.YearlyTotal",J)+": "+Z.toFixed(2)+" "+me.t("word.kWh",J)}),Z>0&&Object(gf.jsx)(pD.a,{title:me.t("shared.MoreResults",J),content:Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.ModuleCount",J)+": "}),Object(gf.jsx)(NT.a,{span:10,children:q})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.MeanYield",J)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:[(Z/q).toFixed(2)," kWh"]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalCost",J)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:["$",_.toFixed(2)]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalRevenue",J)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:["$",$.toFixed(2)]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.Profit",J)+": "}),Object(gf.jsx)(NT.a,{span:10,children:(ee>0?"$":"-$")+Math.abs(ee).toFixed(2)})]})]}),children:Object(gf.jsx)(xv.a,{type:"default",children:me.t("shared.MoreResults",J)})})]}),!A&&Object(gf.jsxs)(gf.Fragment,{children:[G>1&&Object(gf.jsx)(eb.a,{title:me.t("solarPanelYieldPanel.ShowOutputsOfIndividualSolarPanels",J),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:w,onChange:function(e){0!==G?(Kh(me.t("message.SimulationStarted",J)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyPvIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Solar Panels: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0,e.pauseYearlySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",J))}}),Object(gf.jsx)(xv.a,{type:"default",icon:te?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(te?"word.Run":"word.Update",J),onClick:function(){0!==G?(Kh(me.t("message.SimulationStarted",J)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Solar Panels",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0,e.pauseYearlySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",J))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",J),onClick:function(){_h("line-graph-"+B+"-"+K,"yearly-pv-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",J)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Solar Panel Yearly Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",J),onClick:function(){$h(m,"yearly-pv-yield.csv"),Kh(me.t("message.CsvFileSaved",J)),s&&p((function(e){e.actionInfo={name:"Export Solar Panel Yearly Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})]})})})},pO=n.a.memo(hO),yO=mv.a.div(fI||(fI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),gO=mv.a.div(hI||(hI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),mO=mv.a.div(pI||(pI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),wO=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(_s),m=Ew($s),w=Ew(o.dailyPvYieldPanelRect),x=Pf(od),v=Tf(Nr),b=Ew.getState().economicsParams,A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=S.current?S.current.offsetWidth+40:w?w.width+40:640,H=S.current?S.current.offsetHeight+100:w?w.height+100:500,z=Object(r.useState)({x:w?Math.max(w.x,j-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(0),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useRef)(new Map),k=Object(r.useRef)(),E={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],F.current.set(o,(null!==(i=F.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}O(e)}),[g]),Object(r.useEffect)((function(){M({x:Math.max(null===w||void 0===w?void 0:w.x,j-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-H)})}),[w,j,H]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===w||void 0===w?void 0:w.x,j-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-H)})};return window.addEventListener("resize",e),S.current&&(k.current||(k.current=new ResizeObserver((function(){d((function(e){S.current&&(e.viewState.dailyPvYieldPanelRect||(e.viewState.dailyPvYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyPvYieldPanelRect.width=S.current.offsetWidth,e.viewState.dailyPvYieldPanelRect.height=S.current.offsetHeight)}))}))),k.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=k.current)||void 0===t||t.disconnect()}}),[w,j,H]);var U=function(){d((function(e){e.viewState.showDailyPvYieldPanel=!1,c&&(e.actionInfo={name:"Close Solar Panel Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.SolarPanel);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1)}))}),[N,m]);var J=me.t("word.Hour",E),G=me.t("solarPanelYieldPanel.YieldPerHour",E),X=Tw.countAllSolarPanels(),B=X*b.operationalCostPerUnit,K=C*b.electricitySellingPrice,q=K-B,Q=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyPvYieldPanelRect||(e.viewState.dailyPvYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyPvYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.dailyPvYieldPanelRect.y=Math.min(t.y,window.innerHeight-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyPvYieldPanel"}))},children:Object(gf.jsx)(yO,{ref:P,style:{zIndex:"dailyPvYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(gO,{ref:S,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(mO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("solarPanelYieldPanel.SolarPanelDailyYield",E)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",E)+" "+l+" | "+mW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){U()},onMouseDown:function(){U()},children:me.t("word.Close",E)})]}),Object(gf.jsx)(DC,{type:L.DailyPvYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:J,labelY:G,unitY:me.t("word.kWh",E),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(gf.jsx)(pD.a,{title:me.t("shared.OutputBreakdown",E),content:Object(h.a)(F.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",E)+": "+C.toFixed(3)+" "+me.t("word.kWh",E)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",E)})}):Object(gf.jsxs)(gf.Fragment,{children:[C>0&&Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("solarPanelYieldPanel.DailyTotal",E)+": "+C.toFixed(3)+" "+me.t("word.kWh",E)}),C>0&&Object(gf.jsx)(pD.a,{title:me.t("shared.MoreResults",E),content:Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.ModuleCount",E)+": "}),Object(gf.jsx)(NT.a,{span:10,children:X})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.MeanYield",E)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:[(C/X).toFixed(2)," kWh"]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalCost",E)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:["$",B.toFixed(2)]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalRevenue",E)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:["$",K.toFixed(2)]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.Profit",E)+": "}),Object(gf.jsx)(NT.a,{span:10,children:(q>0?"$":"-$")+Math.abs(q).toFixed(2)})]})]}),children:Object(gf.jsx)(xv.a,{type:"default",children:me.t("shared.MoreResults",E)})})]}),!v&&Object(gf.jsxs)(gf.Fragment,{children:[N>1&&Object(gf.jsx)(eb.a,{title:me.t("solarPanelYieldPanel.ShowOutputsOfIndividualSolarPanels",E),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",E)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyPvIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Solar Panels: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0,e.pauseDailySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",E))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Q?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(Q?"word.Run":"word.Update",E),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",E)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Solar Panels",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0,e.pauseDailySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",E))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",E),onClick:function(){_h("line-graph-"+J+"-"+G,"daily-pv-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",E)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Solar Panel Daily Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",E),onClick:function(){$h(g,"daily-pv-yield.csv"),Kh(me.t("message.CsvFileSaved",E)),c&&d((function(e){e.actionInfo={name:"Export Solar Panel Daily Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})]})})})},xO=n.a.memo(wO),vO=mv.a.div(yI||(yI=Object(gv.a)(["\n position: absolute;\n bottom: 40px;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n"]))),bO=mv.a.div(gI||(gI=Object(gv.a)(["\n background: #282c34;\n position: absolute;\n top: 0;\n left: ",";\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: 240px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n"])),(function(e){return e.projectView?"calc(3 * 100vw / 4 - 120px)":"calc(100vw / 2 - 120px)"})),AO=function(){var e,t=Ew(Fi),l=Ew(ds),a=Ew(ps),o=Ew($r),i=Ew(Vi),r=Ew(Es),n=Ew(Kr),c=Ew(js),s=Ew((function(e){return null===e.selectedElement?null:e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))})),d=0,u=0,f=0;if(s)if(s.type===V.SolarPanel)d=a(s.id),u=null!==(e=s.dailyYield)&&void 0!==e?e:0;else if(s.type===V.Polygon){var h=o(s);h&&(d=Tw.countAllChildSolarPanels(h.id),u=Tw.countAllChildSolarPanelDailyYields(h.id))}else d=Tw.countAllChildSolarPanels(s.id),u=Tw.countAllChildSolarPanelDailyYields(s.id),f=Tw.countAllChildElementsByType(s.id,V.Heliostat);else d=Tw.countAllSolarPanels(),u=Tw.countAllSolarPanelDailyYields(),f=l(V.Heliostat);var p={lng:i},y=r.y>0,g=y?"navajowhite":"antiquewhite",m=y?"invert(85%) sepia(45%) saturate(335%) hue-rotate(329deg) brightness(100%) contrast(101%)":"invert(95%) sepia(7%) saturate(1598%) hue-rotate(312deg) brightness(106%) contrast(96%)",w=s&&s.type===V.Foundation&&!s.notBuilding&&Tw.getBuildingCompletionStatus(s,t)===D.COMPLETE;return Object(gf.jsx)(vO,{children:Object(gf.jsx)(bO,{projectView:c,children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:g,fontSize:"10px"},children:[d>0&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{alt:"Solar panel count",title:me.t("designInfoPanel.NumberOfSelectedSolarPanels",p),src:wD,height:24,width:36,style:{paddingLeft:"10px",cursor:"pointer",filter:"invert(100%) "}}),Object(gf.jsx)("span",{children:d})]}),f>0&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{alt:"Heliostat count",title:me.t("designInfoPanel.NumberOfSelectedHeliostats",p),src:ID,height:24,width:36,style:{paddingLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",filter:"invert(100%) "}}),Object(gf.jsx)("span",{children:f})]}),u>0&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{title:me.t("designInfoPanel.ElectricityGeneratedDailyBySolarPanels",p),alt:"Electricity",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEB8ttR0cqAAAA4lJREFUWIXNl0+IHEUUxn/vdfX0jOAoSQgGIoaQRRFdEwxe1j8BD5qDNxEiJje9+CcXUUTEm6gnBVFvehA9RIISIYgJGHMyugH/rGzwoiIku1Ek4mZnprrreeje3ZlJ98x0xoMfFDRV9b7vq5pXr2rg6nGDqr4OyBQc6BSx7RDC/VNyjA4WkQeAtyqGA3C5klj1o0ajsXMqA2Z2BtgvIvuqPFaIHw4hbO/1er+NMzAWIvIIMF8yNCMi3wDRUP/1qvoLcOvU4n04parPDfU1nXN7S+Z+CLzzX4oD7FHVFyeYp8CrwOZJidd/QxE5KCKrIYSPx8Rcp6r7Qgi7gbaqLpvZvJmdAvxId6pPmtmimZ0sG9wPnAWOxnF8SwXB88AlwEraTyJysHSVeRKfBr50zt0xxqS+oKrnyLdy7ZRcAxwvhE4ARypMGIPHtg18APwgIodGCQ/jRlV9iiLDVfUYYKp6WETuK0xUGbDCPMAmVX0aaNURH8bjhfizzrkDY4T729w0omtIgAvAfBRF9wAmIqWCJf3Hp1aPouhe8tU/QX6+rxATkSpTl5vN5rZxGi6O45vjOL4rhBBUFUB7vd7ZNE0XzOy2Yt554O61IDNDZKMKm1kZd8t7vws4nyTJXBRFO8nvDwAJIXzR6XSWnPd+l/f+ISArVh2p6gqwICJryZORn4QB0SiKyLKscnVZliUA3vu93vu5EEJGXnsE+B5YGrdDhwBzzj0KLFKy7VU5UcTdOU5gJJxztxdkfwKrw+JUJ6ABF4FrpzJQ4NsJxMra+1OpNhqNHcXngxMK9rfVOI5ngCRJku11tWeAT1X1MzYq4St1DDjnHiu4torIGeBtYNM44S3Aa8Ciqr7EleXz80nEVfWN/qBWq7W1MPCjqj5TwpujED0ClG6Zc26W/LodZWCp3W6XJp5zbg9wonhhlWL4aVWGc2NK8dEJOAZ0+h+l1RVlA1+ZWaqq65VQRBARzKynqqcn4BjQcRMErCNJkpe73e4SsKXVakVAGkKIO52OV9VfQwjv1uGrDRE5APxNXmQuqupy8f0HcMk5t7suZ60dMLNjwGZVvQnohRBS51wcQojN7Ls0TRfqGqgNVT0JdMkvkgvAsqqmwJtXw1f7j2Wz2dzW7XZnkyR5GAhZlgUzey9Jkp9XVlb+qss3ydEbQJqm/wC/hxBmsyzbISJfp2n6ife+U5frf4F/AW7wkmmQi1CEAAAAAElFTkSuQmCC",height:24,width:24,style:{filter:m,marginLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)("span",{children:u.toFixed(1)+" "+me.t("word.kWh",p)})]}),!s&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{title:me.t("designInfoPanel.SceneDiameter",p),alt:"Diameter",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEDUIkXIExwAABSFJREFUWIWlV1tsFFUY/s6//5yZOUtnl13abrMb3KYSioCxNviAWblGMVFAwMQXeDJRX7xgxEQaecAHqJgYiI0PxhAviZoA8UWjxCgQEhrR+ECCWoVowwLa9EJwLdvZOT7MTLvby978k5PNzvn///v+y7kJNCDxeDwzOTnZC6DX87zlxWKxDQAsyyqUSqXftNYXHce5ODo6erkRv1XlwIEDkZaWlj1EdEYIoQFUHUIITUSXpJSvAUjW8i+qTVqW9XCxWDykte7RWkMIAa31VSL6EcCvAPKe50FKmQDQBeA+rfW9rutCaw0AN5j5Ddd132k4cinlYSIKIysB+NC27Q25XM6sZheLxVZLKfuJ6K/AVluW9WVnZ2dbvdgciUQ+D42J6DQz9zQaQDKZbCeigbBsRHTZNM1MbXTmk5ip5cFGgWeLbdsbAIzDD+hn27YrMlHRA1LKw8VicZ8QAvF4/JWxsbEj9YBEIpFcqVR6bJ4pLaUcZuYrhULhIwAJIcSZ7du3bzx16pRXoRmNRh8Kay6lPFRvhLlcLlJe79lDCKENw9iplFpLRFoIoU3T7KukqbWQUv4EQBuGMVgveCiLFi06thCBYOwFANu234TfD5NSyrumHTiO8wQRaSIqJRKJ3kYJAIBhGEerEHgRADKZjBmJRP4MAh2YNiai0wB00P1Ni2VZX1cjEOg8Dz8Lo6lUykZHR0cCwL9CCB2Pxx9tFpyIHieikVoEAMQBjAshdCwW20gTExM9QghLCDGSyWTONIm/1fO8k57nJQHcJKJPhZhZYIZhGGW64wDOaq1x586dTTAMYy8AzcynmwUHMAU/rf+YprkWAJRSA5jZzPaVG5imuR/+avsOSqn3AgLH/g84M0/GYrEN5ZOWZR0hovPMvLL8u1LqqYDAdQD4IGDa6K43DS6lLKbT6UfqNZRSrgtIawrA55XW1tZOpdTyBcBPAGAp5VQ6nd5x7dq1r+olUCqV3OAXsCzrffh1ertcKZlMtjPzKIAigG3h93g8vhWACz/yqa6urq31AodiWdYO+Bm4Ccuy9gV/vpiltwozy8gVQmxeunTpJmYOaz6VzWYbBgeASCTycuDjLJRSW4KTLz/rrF+ByrVcZOZiCJ5KpZoCDwicgJ/BfiSTyXYAU0II7TjOuioEwiV1q62tbWOz4Nls1iGiUQBaKbUFAEBE5+Hvzx/XIgDgFoBNzRKIRqNPBxm/nc1mHQCAaZq7g5tL0TCMZYHuPQsQ0PCbcNsc7zWkr69PMPMv8Mt4fHqiu7vbIKIh+CkOm7G7CgEthNC2ba9qhICUcn+AUVJKdVdMKqUeDS8kwYkFIvpDSqlN06wYUkrNzBML7BHzimmaDyLYuCzLeiv8XnElU0q9WygUnhFCIJlM7lm/fv0nw8PDDzAzu64LAGBmeJ7njYyM/D40NJSvE38lEX3reV4rM1/q7e1dMzg4ODlHq6enh4noHIJtMhqNPldvhAtJIpHYTER/w0/9jY6OjmW1bBxmPoegzlLKz9rb27ONAqdSKRvA6/DfFJqIrqdSqfvrMs7lciYzHy97io0D6I/FYqtr2S5evDitlHopbGoE98x6Ip8jpmnuBnAldEREmpl/YOYBwzBeYOYnAeyUUj4rpexn5m+I6HaZfoGZD+7atcuohlNVHMdpsW37VWa+XM/jNADOM/NRwzDuruW/6uN0tti2vVprnfM8bw2AFa7rtnueB2YeI6KrWusLQogLS5Ys+T6fz8/t8nnkP/P60xxqBkq1AAAAAElFTkSuQmCC",height:20,width:20,style:{filter:m,marginLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)("span",{children:2*n+" "+me.t("word.MeterAbbreviation",p)})]}),w&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{title:me.t("designInfoPanel.BuildingArea",p),alt:"Area",src:"data:image/png;base64,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",height:20,width:20,style:{filter:m,marginLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsxs)("span",{children:[Tw.getBuildingArea(s,t).toFixed(2)+" "+me.t("word.MeterAbbreviation",p),Object(gf.jsx)("sup",{children:"2"})]})]})]})})})},TO=n.a.memo(AO),PO=mv.a.div(mI||(mI=Object(gv.a)(["\n position: absolute;\n top: 75px;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n"]))),SO=mv.a.div(wI||(wI=Object(gv.a)(["\n position: absolute;\n top: 0;\n left: ",";\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: calc(100vw / 2);\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n"])),(function(e){return e.projectView?"calc(100vw / 2)":"calc(100vw / 4)"})),jO=function(e){var t,l=e.city,a=Ew(Vi),o=Ew(i.date),n=Ew(i.address),c=Ew(i.latitude),s=Ew(i.longitude),d=Ew(i.diurnalTemperatureModel),f=Ew(Ws),h=Ew(Es),p=null!==(t=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,y=Ew(js),g=Object(r.useState)({low:0,high:20}),m=Object(u.a)(g,2),w=m[0],v=m[1],b=Object(r.useState)(10),A=Object(u.a)(b,2),T=A[0],P=A[1],S=new Date(o),j=h.y>0,H={lng:a};Object(r.useEffect)((function(){if(l){var e=f[l];if(e){var t=HT(S,e.lowestTemperatures,e.highestTemperatures);v(t);var a=jT(t.high,t.low,d,p,z,Tw.minutesIntoDay(S));P(a)}}}),[l,o]);var z=Object(r.useMemo)((function(){return Ty(S,c)}),[o,c]),R=j?"navajowhite":"antiquewhite",D=j?"invert(85%) sepia(45%) saturate(335%) hue-rotate(329deg) brightness(100%) contrast(101%)":"invert(95%) sepia(7%) saturate(1598%) hue-rotate(312deg) brightness(106%) contrast(96%)";return Object(gf.jsx)(PO,{children:Object(gf.jsx)(SO,{projectView:y,children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:R,fontSize:"10px"},children:[Object(gf.jsx)("img",{title:me.t("word.Location",H),alt:"Location",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEAIi2s5tJQAAAvdJREFUWIW1l12IDWEYx3/PM+/MJLuSXfle2tCmxRVhw40oSW5FuXGhtCVX7smNwp0ouVBC8lFc+siFkojaXeurpLBaIp0255h9x8UMOzvmnJkznf3Xc/Ge93me//+8X88zQgl4nrc4CIIVQLe1tl1Vh6y174DBMvkKQ1W3A3eBAAgz7LmI7J8KbgNcqEOaZQ9835/fSvJbdYiqsWXNvQTmtELAqYzkl0VkG9AFdDmOsw44mSHmLiClmY0xvamENRHZ3cB/LfAxGSMie0sLILXvqnooL8BxnI3A70TcC0DLkE8DPiUSDVN8Oa8yeeVW1nNspKwbmJcY346TFcH11HhV0wIcx5mRHHueN1SQHN/334lMLJYxZmbTAkTEJsdBEHQWFRCGYVtybK0db1pAEATfgH+B1toNRQXUarX1YTixW9ba0aKxSbjAeyYO0pjrussLxr1l8iHsKSMA4GIq0TNgVk7MpVTMACWvIaq6I5Xsb8HZnOG+AriZ4X+sEUfevXaB18CSjLknwFPgF7Aa6AO8lM840RvwMoenPlT1MMWrYNqulSZOYDqp972oGWPqvoBNQUT2lRBwviXkCTxsgvwbMLvVAnqp33xMMhHZ02pyAIwxBwsIuDgl5AlcaUA+DPhTwur7/kKibZgGDGWQV+IOqtN13WUtIXVdtwc4Crwh6nJGgCWe53UD31MCdsVh90QkJGpmzjqOU7iI/UNbW9tM4BzRSzYOnBGRLcACohXAcZxN8Vyoqv1xqABzgU2x8M+xuDvxnymEdhF5HAd+Ajoa+B4ATufkexDnGgHyq6mq7mRiWb+q6i7AyQ3MgDFmDVE1/Jvv+H8+6R+sta+I7rsPdFhrbxAduvvAgIi8DsOw4nnel1qtVgVC3/dNtVqdTbR6S8Mw7AH6giDoS6V/VFT8VuADje/7GPAztkqObwXop0l0quoRorJb72M0z4aBEzTY+6J9/iJV7bXWriZqr7qAGcQ3QlV/W2t/AKPAgKoOWmsHYgEN8QfFcGW2NEnqrQAAAABJRU5ErkJggg==",height:20,width:20,style:{filter:D,cursor:"pointer",verticalAlign:"middle"}}),(null!==n&&void 0!==n?n:"")+" ("+Math.abs(c).toFixed(2)+"\xb0 "+(c>0?"N":"S")+", "+Math.abs(s).toFixed(2)+"\xb0 "+(s>0?"E":"W")+")",Object(gf.jsx)("img",{title:me.t("word.Date",H),alt:"Date",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEBEGhyLIZgAAAzBJREFUWIXN1luIVWUUB/CfepzGSZ1M50Xpihk4EQRRD01B4JRFRS9B9RCGYg9Jl4cis0iGsHmIovTJF7OHbi/ShR6CLIrASzHeRgeiCwaVQmWheTlNp4f17WZ73NtzmSP1h81Ze529vvX/1re+tRb/MaaV6OfgNvyMEy2udzdO4kgzBlPS71xcmOS/sBAfYQm+RaVJAlV8hzV4M2d3DD+WGV2NX1DLPUP4A+vq9I2e+3EY6/FnTn8Sy4qcV0TIjuDhXAT+xiyMpkVrTUZgFH34Ldl1J/1qrMRrRUZD2Fqn68fnuLJJxxlm4jMM1unfxxdFBhWx2/ozHsWNLTqHo7ipQH+RONIzMFUkYrUNZ63gcPJ1BiqCdT82nSPnU3AV9pQRqIp7f/s5InAKszFeRuACbFd8dp3CtkSikABnv2aXYT5+wE+4Tuxqp6ghs7ALPVgkaspY3RpTz+Zjrbg6ZXhJVLIhXJ7kb9Alruox3IAHk/xWwRoHMNIugW704jyRUL1i18S97xU9oEvk0oyCNdbgmaLFm6nxJ5zekH7PyUdz8rg4GrgG1+J6Efq9+KTMwVqnR6AbX+GgOP8nk/wULknyl5iOD9L70mQ7gN3J6XF8j0OJaA37cGfeeVEEqnhFJNWv+FRUsRFR49eJRjMuakdf2uEjyW4/7sOHJqpfD27Gs3gPD2FjWQTawQNihy+aaPFleC59e28ZgYpImmExJ9ya5KViZhgWCTU9fd8ncmRLA8dzRc2BzclmZlF9niaK0iDOF8PJIK4QoRxM/2fT1GNJXt6AwFa8nuTHxa1axeSPYAzv1OkuNTELwBsi7AM53UYxPRnCx206nyGKT373XaKdj4joPZGc31Vnew9qWTPqx6MtOh8X1yq7LRlOJUJb8HXSrRbZn8cYkXBv45Y2CFTFmHVc7DqPbViMDYnccIH9ghb9leKgyOpWsV4MKpPGC+I45rVg0y1K+vOdIDBPnHtRFyzDZpGYczpBgKhqNbyqcSV8OX27rFPOMzydFj6AO0ShydAjmtCO9M2KTjvPMCCmo5poRNvTe9YN9yZy/6JRuCZDZAkuTo4P4d1E6P+FfwC6bc62I7I0pgAAAABJRU5ErkJggg==",height:20,width:20,style:{filter:D,cursor:"pointer",verticalAlign:"middle"}}),x()(S).format("MM/DD hh:mm A"),Object(gf.jsx)("img",{title:me.t("word.Temperature",H),alt:"Temperature",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEBsiQc7EPQAAA4ZJREFUWIXV13+o32MUB/DXve4Wd4ZizFiMDRm7iYVhsj9QQstiasuv/Ejijxkp1krRyG1Lm0z5hygpTJrZsC0rsebXwmzpdpOw6zczM/frj3M+vs/99mXbvd+tdurb85znOZ9z3s855znP+bKf0uF4CB9gIxbjhH1l/Hj0oIaP8X7Ot2HKvgCwDn9jWrF2Gr7O34i9aXyiOO2dTfYuyr3pe6KwfQ8BjM3xHAxr2Ks8Mn6wAI7AuIb94Til4Gs5/lHMK/ozx7Ymdk7EMhz0fwBOx7tYhalYgrV4tAmAo0QeTMcNaXRUg8x5Ijdgh8iNHclPEeEcQIvz41oqeybn36p74ZJcuy9BVvI34eqcz03Zx7Al5xNxKY5DB37DLMnASKzEwbg20Q7DZwnkr5Trz/FMbC/AdxWnq2iO8OJC3JVr23B/eqanBPCCuNPXJf8ODsSklFmFy/BL7q/DD4Wx7bk2x8DcOKkwDp3oFvmgAvAsLhAump0ojxFuejuVwGvpDeIWrCkUt+PcnB+KDal3lOY0FfdgQjsW4VdsTgDvpdDORP9A8gvxYc43GhiCfnyS899xL14R+dOMvsJSzO8QpfRGfCPcfj5uxc15qqdELizLkxMeKpW3qdeInSKf4EnchpML2RXF/r85sFy4d1aeZqlw/bz0wlkiETsLI41UrVV1YCauyQPdjtHYhOdFaOdifVkHXsyxX1S1rpxvQG/uVQnW1wCihq0NgMaJxO7DgyK0i1Jui3w9O4oPekWNf0s8KndgjChQ1RWr4j6pwWCbetGpKuLDxf4ZeAIv4WcR3kHRLeK014uErQrRI8LVNTze5LsD1HNk0HRFGvhcXLsZBYAFKfNm8ncP1VgjjRUP0KeiahKJWgFYKe4/cVtq4i1oGT2dSseLvFlbGK9+m8X17MRPWN8q4yNE8r2c/JImxqvf6pSZl/yEVgDoSmWzRex/TP57XIzJ4vQViDHFNzN2pbxjVwLqsd0qGopDkv8Ib+R8hXondLSoquW3QwLQl+Oxos734UicLe5zH64q5HsKMH1aQMNF8Vid/Hz/nQNVNe1Ofsh3v6IFqbB6jJ5rYnyNuAGjReV8vVXG4TAR1+/U3XuhKLfduDLXRoq3o2ZgM9sSmiyalapPaOxwZybImugP9wqdKtq1yu29+LLgN4k/KLtNzXr43aFpuFx0ux34QsT8VdGu7z/0Dzx9+SSHmHZ4AAAAAElFTkSuQmCC",height:20,width:20,style:{filter:D,cursor:"pointer",verticalAlign:"middle"}}),w?T.toFixed(1)+"\xb0C ("+me.t("siteInfoPanel.Low",H)+":"+w.low.toFixed(1)+"\xb0C, "+me.t("siteInfoPanel.High",H)+": "+w.high.toFixed(1)+"\xb0C)":""]})})})},HO=n.a.memo(jO),zO=mv.a.div(xI||(xI=Object(gv.a)(["\n position: absolute;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 7; // must be less than other panels\n"]))),RO=mv.a.div(vI||(vI=Object(gv.a)(["\n background: #282c34;\n position: absolute;\n top: 0;\n left: calc(100vw / 2 - 100px);\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: 200px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n"]))),DO=function(){var e=Ew(si),t=Ew(Vi),l=Ew(o.solarRadiationHeatmapMaxValue),a=Ew(o.showSiteInfoPanel),i=Ew(o.heatFluxScaleFactor),r=Tf(Vs),n={lng:t};return Object(gf.jsx)(zO,{style:{top:a?"110px":"80px"},children:Object(gf.jsx)(RO,{style:{width:r?"320px":"170px",left:r?"calc(100vw / 2 - 150px)":"calc(100vw / 2 - 80px)"},children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[me.t("visualizationControlPanel.ColorContrast",n)+":",Object(gf.jsx)($v.a,{title:me.t("visualizationControlPanel.ClickUpOrDownArrowButtonsToChange",n),min:.5,max:50,step:.5,style:{width:70},precision:1,value:null!==l&&void 0!==l?l:5,onChange:function(t){e((function(e){e.viewState.solarRadiationHeatMapMaxValue=t}))}}),r&&Object(gf.jsxs)(gf.Fragment,{children:[me.t("visualizationControlPanel.FluxScale",n)+":",Object(gf.jsx)($v.a,{title:me.t("visualizationControlPanel.ClickUpOrDownArrowButtonsToChange",n),min:1,max:50,step:5,style:{width:65},precision:0,value:null!==i&&void 0!==i?i:20,onChange:function(t){e((function(e){e.viewState.heatFluxScaleFactor=t}))}})]})]})})})},MO=n.a.memo(DO),WO=dR.a.Column,IO=mv.a.div(bI||(bI=Object(gv.a)(["\n position: fixed;\n top: 90px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 8;\n"]))),CO=mv.a.div(AI||(AI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),OO=mv.a.div(TI||(TI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),FO=function(){var e=Ew(Vi),t=Ew(Gi),l=Ew(si),a=new Date(Ew(i.date)),c=Ew(o.visibilityResultsPanelRect),s=Pf(Gs),d=Ew(fs),f=Ew(Ni),h=n.a.useRef(null),p=Object(r.useRef)(null),y=Object(r.useRef)(),g=p.current?p.current.clientWidth+40:c?c.width+40:640,m=p.current?p.current.clientHeight+100:c?c.height+100:570,w=Object(r.useState)({x:c?Math.max(c.x,g-window.innerWidth):0,y:c?Math.min(c.y,window.innerHeight-m):0}),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)([]),T=Object(u.a)(A,2),P=T[0],S=T[1],j={lng:e};Object(r.useEffect)((function(){b({x:Math.max(null===c||void 0===c?void 0:c.x,g-window.innerWidth),y:Math.min(null===c||void 0===c?void 0:c.y,window.innerHeight-m)})}),[c,g,m]),Object(r.useEffect)((function(){var e=function(){b({x:Math.max(null===c||void 0===c?void 0:c.x,g-window.innerWidth),y:Math.min(null===c||void 0===c?void 0:c.y,window.innerHeight-m)})};return window.addEventListener("resize",e),p.current&&(y.current||(y.current=new ResizeObserver((function(){l((function(e){p.current&&(e.viewState.visibilityResultsPanelRect||(e.viewState.visibilityResultsPanelRect=new Ot(0,0,600,470)),e.viewState.visibilityResultsPanelRect.width=p.current.offsetWidth,e.viewState.visibilityResultsPanelRect.height=p.current.offsetHeight)}))}))),y.current.observe(p.current)),function(){var t;window.removeEventListener("resize",e),null===(t=y.current)||void 0===t||t.disconnect()}}),[]),Object(r.useEffect)((function(){if(s){var e=[];s.forEach((function(t,l){var a=0,o="",i=0;t.forEach((function(e,t){i++,a+=e,o+=e.toFixed(2)+", "})),e.push({key:l.observer.id,observer:Tl.fetchLabel(l.observer.name,j),vantage:"("+l.position.x.toFixed(1)+", "+l.position.y.toFixed(1)+", "+l.position.z.toFixed(1)+") "+me.t("word.MeterAbbreviation",j),total:a.toFixed(2),itemized:i>1?o.substring(0,o.length-2):"---"})})),S(e)}}),[s,e]);var H=function(){l((function(e){e.viewState.showSolarPanelVisibilityResultsPanel=!1,t&&(e.actionInfo={name:"Close Visibility Results Panel",timestamp:(new Date).getTime()})}))};return Object(gf.jsx)(JT.a,{nodeRef:h,handle:".handle",bounds:"parent",axis:"both",position:v,onDrag:function(e,t){b({x:Math.max(t.x,g-window.innerWidth),y:Math.min(t.y,window.innerHeight-m)})},onStop:function(e,t){l((function(e){e.viewState.visibilityResultsPanelRect||(e.viewState.visibilityResultsPanelRect=new Ot(0,0,600,470)),e.viewState.visibilityResultsPanelRect.x=Math.max(t.x,g-window.innerWidth),e.viewState.visibilityResultsPanelRect.y=Math.min(t.y,window.innerHeight-m)}))},onMouseDown:function(){l((function(e){e.selectedFloatingWindow="visibilityResultsPanel"}))},children:Object(gf.jsx)(IO,{ref:h,style:{zIndex:"visibilityResultsPanel"===f?Ke:8},children:Object(gf.jsxs)(CO,{ref:p,style:{width:(c?c.width:600)+"px",height:(c?c.height:470)+"px"},children:[Object(gf.jsxs)(OO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("visibilityPanel.SolarPanelVisibility",j)+" \u2014 "+mW()(a).format("h:mm A MM/DD")}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){H()},onMouseDown:function(){H()},children:me.t("word.Close",j)})]}),Object(gf.jsxs)(dR.a,{id:"visibility-results-table",style:{width:"100%",direction:"ltr"},dataSource:P,pagination:{defaultPageSize:5,showSizeChanger:!0,pageSizeOptions:["5","10","50"]},children:[Object(gf.jsx)(WO,{title:me.t("visibilityPanel.Observer",j),dataIndex:"observer"},"observer"),Object(gf.jsx)(WO,{title:me.t("visibilityPanel.VantagePoint",j),dataIndex:"vantage"},"vantage"),Object(gf.jsx)(WO,{title:me.t("visibilityPanel.TotalVisibility",j),dataIndex:"total"},"total"),Object(gf.jsx)(WO,{title:me.t("visibilityPanel.ItemizedVisibilityByFields",j),dataIndex:"itemized"},"itemized")]}),Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(kC.a,{}),title:me.t("word.Update",j),onClick:function(){0!==d()?(Kh(me.t("message.SimulationStarted",j)),setTimeout((function(){Tf.setState((function(e){e.simulationInProgress=!0,e.runSolarPanelVisibilityAnalysis=!0})),l((function(e){t&&(e.actionInfo={name:"Run Visibility Analysis For Solar Panels",timestamp:(new Date).getTime()})}))}),100)):Kh(me.t("analysisManager.NoObserverForVisibilityAnalysis",j))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsImage",j),onClick:function(){_h("visibility-results-table","visibility-results",{}).then((function(){Kh(me.t("message.ScreenshotSaved",j))}))}})]})]})})})},kO=n.a.memo(FO),YO=["Daylight","Clearness"],LO=mv.a.div(PI||(PI=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),EO=mv.a.div(SI||(SI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),UO=mv.a.div(jI||(jI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),NO=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(gd),w=Ew(md),x=Pf(xd),v=Ew(ds),b=Ew(o.yearlyParabolicTroughYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyParabolicTroughYieldPanelRect||(e.viewState.yearlyParabolicTroughYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyParabolicTroughYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyParabolicTroughYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyParabolicTroughYieldPanel=!1,s&&(e.actionInfo={name:"Close Parabolic Trough Yearly Yield Graph",timestamp:(new Date).getTime()})}))},J=v(V.ParabolicTrough);Object(r.useEffect)((function(){J<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyParabolicTroughIndividualOutputs=!1)}))}),[J,w]);var G=me.t("word.Month",U),X=me.t("parabolicTroughYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyParabolicTroughYieldPanelRect||(e.viewState.yearlyParabolicTroughYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyParabolicTroughYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyParabolicTroughYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyParabolicTroughYieldPanel"}))},children:Object(gf.jsx)(LO,{ref:P,style:{zIndex:"yearlyParabolicTroughYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(EO,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(UO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("parabolicTroughYieldPanel.ParabolicTroughYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(DC,{type:L.YearlyParabolicTroughYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,YO)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&k.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("parabolicTroughYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(gf.jsx)(eb.a,{title:me.t("parabolicTroughYieldPanel.ShowOutputsOfIndividualParabolicTroughs",U),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:w,onChange:function(e){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyParabolicTroughIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Parabolic Troughs: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForParabolicTroughs=!0,e.pauseYearlySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Parabolic Troughs",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForParabolicTroughs=!0,e.pauseYearlySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+G+"-"+X,"yearly-parabolic-trough-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Parabolic Trough Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-parabolic-trough-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Parabolic Trough Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},VO=n.a.memo(NO),JO=mv.a.div(HI||(HI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),GO=mv.a.div(zI||(zI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),XO=mv.a.div(RI||(RI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),BO=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(hd),m=Ew(pd),w=Ew(o.dailyParabolicTroughYieldPanelRect),x=Pf(xd),v=Tf(ms),b=Ew(Ni),A=n.a.useRef(null),T=Object(r.useRef)(null),P=Object(r.useRef)(),S=T.current?T.current.clientWidth+40:w?w.width+40:640,j=T.current?T.current.clientHeight+100:w?w.height+100:500,H=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(0),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(new Map),F={lng:a};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],O.current.set(o,(null!==(i=O.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}C(e)}),[g]),Object(r.useEffect)((function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,S,j]),Object(r.useEffect)((function(){var e=function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),T.current&&(P.current||(P.current=new ResizeObserver((function(){d((function(e){T.current&&(e.viewState.dailyParabolicTroughYieldPanelRect||(e.viewState.dailyParabolicTroughYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyParabolicTroughYieldPanelRect.width=T.current.offsetWidth,e.viewState.dailyParabolicTroughYieldPanelRect.height=T.current.offsetHeight)}))}))),P.current.observe(T.current)),function(){var t;window.removeEventListener("resize",e),null===(t=P.current)||void 0===t||t.disconnect()}}),[w,S,j]);var k=function(){d((function(e){e.viewState.showDailyParabolicTroughYieldPanel=!1,c&&(e.actionInfo={name:"Close Parabolic Trough Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.ParabolicTrough);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyParabolicTroughIndividualOutputs=!1)}))}),[E,m]);var U=me.t("word.Hour",F),N=me.t("parabolicTroughYieldPanel.YieldPerHour",F),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:A,handle:".handle",bounds:"parent",axis:"both",position:R,onDrag:function(e,t){D({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyParabolicTroughYieldPanelRect||(e.viewState.dailyParabolicTroughYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyParabolicTroughYieldPanelRect.x=Math.max(t.x,S-window.innerWidth),e.viewState.dailyParabolicTroughYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyParabolicTroughYieldPanel"}))},children:Object(gf.jsx)(JO,{ref:A,style:{zIndex:"dailyParabolicTroughYieldPanel"===b?Ke:9},children:Object(gf.jsxs)(GO,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(XO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("parabolicTroughYieldPanel.ParabolicTroughDailyYield",F)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",F)+" "+l+" | "+mW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){k()},onMouseDown:function(){k()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(DC,{type:L.DailyParabolicTroughYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:N,unitY:me.t("word.kWh",F),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&O.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(O.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===O.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",F)+": "+I.toFixed(3)+" "+me.t("word.kWh",F)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",F)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("parabolicTroughYieldPanel.DailyTotal",F),":",I.toFixed(2)," ",me.t("word.kWh",F)]}),E>1&&Object(gf.jsx)(eb.a,{title:me.t("parabolicTroughYieldPanel.ShowOutputsOfIndividualParabolicTroughs",F),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyParabolicTroughIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Parabolic Troughs: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForParabolicTroughs=!0,e.pauseDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:J?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(J?"word.Run":"word.Update",F),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Parabolic Troughs",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForParabolicTroughs=!0,e.pauseDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",F),onClick:function(){_h("line-graph-"+U+"-"+N,"daily-parabolic-trough-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",F)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Parabolic Trough Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",F),onClick:function(){$h(g,"daily-parabolic-trough-yield.csv"),Kh(me.t("message.CsvFileSaved",F)),c&&d((function(e){e.actionInfo={name:"Export Daily Parabolic Trough Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},KO=n.a.memo(BO),qO=mv.a.div(DI||(DI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),QO=mv.a.div(MI||(MI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),ZO=mv.a.div(WI||(WI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),_O=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(su),m=Ew(du),w=Ew(o.dailyParabolicDishYieldPanelRect),x=Pf(yu),v=Tf(ms),b=Ew(Ni),A=n.a.useRef(null),T=Object(r.useRef)(null),P=Object(r.useRef)(),S=T.current?T.current.clientWidth+40:w?w.width+40:640,j=T.current?T.current.clientHeight+100:w?w.height+100:500,H=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(0),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(new Map),F={lng:a};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],O.current.set(o,(null!==(i=O.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}C(e)}),[g]),Object(r.useEffect)((function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,S,j]),Object(r.useEffect)((function(){var e=function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),T.current&&(P.current||(P.current=new ResizeObserver((function(){d((function(e){T.current&&(e.viewState.dailyParabolicDishYieldPanelRect||(e.viewState.dailyParabolicDishYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyParabolicDishYieldPanelRect.width=T.current.offsetWidth,e.viewState.dailyParabolicDishYieldPanelRect.height=T.current.offsetHeight)}))}))),P.current.observe(T.current)),function(){var t;window.removeEventListener("resize",e),null===(t=P.current)||void 0===t||t.disconnect()}}),[w,S,j]);var k=function(){d((function(e){e.viewState.showDailyParabolicDishYieldPanel=!1,c&&(e.actionInfo={name:"Close Parabolic Dish Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.ParabolicDish);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyParabolicDishIndividualOutputs=!1)}))}),[E,m]);var U=me.t("word.Hour",F),N=me.t("parabolicDishYieldPanel.YieldPerHour",F),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:A,handle:".handle",bounds:"parent",axis:"both",position:R,onDrag:function(e,t){D({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyParabolicDishYieldPanelRect||(e.viewState.dailyParabolicDishYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyParabolicDishYieldPanelRect.x=Math.max(t.x,S-window.innerWidth),e.viewState.dailyParabolicDishYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyParabolicDishYieldPanel"}))},children:Object(gf.jsx)(qO,{ref:A,style:{zIndex:"dailyParabolicDishYieldPanel"===b?Ke:9},children:Object(gf.jsxs)(QO,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(ZO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("parabolicDishYieldPanel.ParabolicDishDailyYield",F)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",F)+" "+l+" | "+mW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){k()},onMouseDown:function(){k()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(DC,{type:L.DailyParabolicDishYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:N,unitY:me.t("word.kWh",F),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&O.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(O.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===O.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",F)+": "+I.toFixed(3)+" "+me.t("word.kWh",F)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",F)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("parabolicDishYieldPanel.DailyTotal",F),":",I.toFixed(2)," ",me.t("word.kWh",F)]}),E>1&&Object(gf.jsx)(eb.a,{title:me.t("parabolicDishYieldPanel.ShowOutputsOfIndividualParabolicDishes",F),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyParabolicDishIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Parabolic Dishes: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForParabolicDishes=!0,e.pauseDailySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:J?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(J?"word.Run":"word.Update",F),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Parabolic Dishes",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForParabolicDishes=!0,e.pauseDailySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",F),onClick:function(){_h("line-graph-"+U+"-"+N,"daily-parabolic-dish-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",F)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Parabolic Dish Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",F),onClick:function(){$h(g,"daily-parabolic-dish-yield.csv"),Kh(me.t("message.CsvFileSaved",F)),c&&d((function(e){e.actionInfo={name:"Export Daily Parabolic Dish Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},$O=n.a.memo(_O),eF=["Daylight","Clearness"],tF=mv.a.div(II||(II=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),lF=mv.a.div(CI||(CI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),aF=mv.a.div(OI||(OI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),oF=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(fu),w=Ew(hu),x=Pf(yu),v=Ew(ds),b=Ew(o.yearlyParabolicDishYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyParabolicDishYieldPanelRect||(e.viewState.yearlyParabolicDishYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyParabolicDishYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyParabolicDishYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyParabolicDishYieldPanel=!1,s&&(e.actionInfo={name:"Close Parabolic Dish Yearly Yield Graph",timestamp:(new Date).getTime()})}))},J=v(V.ParabolicDish);Object(r.useEffect)((function(){J<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyParabolicDishIndividualOutputs=!1)}))}),[J,w]);var G=me.t("word.Month",U),X=me.t("parabolicDishYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyParabolicDishYieldPanelRect||(e.viewState.yearlyParabolicDishYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyParabolicDishYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyParabolicDishYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyParabolicDishYieldPanel"}))},children:Object(gf.jsx)(tF,{ref:P,style:{zIndex:"yearlyParabolicDishYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(lF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(aF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("parabolicDishYieldPanel.ParabolicDishYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(DC,{type:L.YearlyParabolicDishYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,eF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&k.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("parabolicDishYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(gf.jsx)(eb.a,{title:me.t("parabolicDishYieldPanel.ShowOutputsOfIndividualParabolicDishes",U),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:w,onChange:function(e){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyParabolicDishIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Parabolic Dishes: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForParabolicDishes=!0,e.pauseYearlySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Parabolic Dishes",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForParabolicDishes=!0,e.pauseYearlySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+G+"-"+X,"yearly-parabolic-dish-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Parabolic Dish Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-parabolic-dish-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Parabolic Dish Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},iF=n.a.memo(oF),rF=mv.a.div(FI||(FI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),nF=mv.a.div(kI||(kI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),cF=mv.a.div(YI||(YI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),sF=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(Sd),m=Ew(jd),w=Ew(o.dailyFresnelReflectorYieldPanelRect),x=Pf(Md),v=Tf(ms),b=Ew(Ni),A=n.a.useRef(null),T=Object(r.useRef)(null),P=Object(r.useRef)(),S=T.current?T.current.clientWidth+40:w?w.width+40:640,j=T.current?T.current.clientHeight+100:w?w.height+100:500,H=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(0),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(new Map),F={lng:a};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],O.current.set(o,(null!==(i=O.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}C(e)}),[g]),Object(r.useEffect)((function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,S,j]),Object(r.useEffect)((function(){var e=function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),T.current&&(P.current||(P.current=new ResizeObserver((function(){d((function(e){T.current&&(e.viewState.dailyFresnelReflectorYieldPanelRect||(e.viewState.dailyFresnelReflectorYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyFresnelReflectorYieldPanelRect.width=T.current.offsetWidth,e.viewState.dailyFresnelReflectorYieldPanelRect.height=T.current.offsetHeight)}))}))),P.current.observe(T.current)),function(){var t;window.removeEventListener("resize",e),null===(t=P.current)||void 0===t||t.disconnect()}}),[w,S,j]);var k=function(){d((function(e){e.viewState.showDailyFresnelReflectorYieldPanel=!1,c&&(e.actionInfo={name:"Close Fresnel Reflector Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.FresnelReflector);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyFresnelReflectorIndividualOutputs=!1)}))}),[E,m]);var U=me.t("word.Hour",F),N=me.t("fresnelReflectorYieldPanel.YieldPerHour",F),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:A,handle:".handle",bounds:"parent",axis:"both",position:R,onDrag:function(e,t){D({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyFresnelReflectorYieldPanelRect||(e.viewState.dailyFresnelReflectorYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyFresnelReflectorYieldPanelRect.x=Math.max(t.x,S-window.innerWidth),e.viewState.dailyFresnelReflectorYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyFresnelReflectorYieldPanel"}))},children:Object(gf.jsx)(rF,{ref:A,style:{zIndex:"dailyFresnelReflectorYieldPanel"===b?Ke:9},children:Object(gf.jsxs)(nF,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(cF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("fresnelReflectorYieldPanel.FresnelReflectorDailyYield",F)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",F)+" "+l+" | "+mW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){k()},onMouseDown:function(){k()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(DC,{type:L.DailyFresnelReflectorYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:N,unitY:me.t("word.kWh",F),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&O.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(O.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===O.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",F)+": "+I.toFixed(3)+" "+me.t("word.kWh",F)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",F)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("fresnelReflectorYieldPanel.DailyTotal",F),":",I.toFixed(2)," ",me.t("word.kWh",F)]}),E>1&&Object(gf.jsx)(eb.a,{title:me.t("fresnelReflectorYieldPanel.ShowOutputsOfIndividualFresnelReflectors",F),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyFresnelReflectorIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Fresnel Reflectors: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForFresnelReflectors=!0,e.pauseDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:J?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(J?"word.Run":"word.Update",F),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Fresnel Reflectors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForFresnelReflectors=!0,e.pauseDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",F),onClick:function(){_h("line-graph-"+U+"-"+N,"daily-fresnel-reflector-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",F)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Fresnel Reflector Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",F),onClick:function(){$h(g,"daily-fresnel-yield.csv"),Kh(me.t("message.CsvFileSaved",F)),c&&d((function(e){e.actionInfo={name:"Export Daily Fresnel Reflector Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},dF=n.a.memo(sF),uF=["Daylight","Clearness"],fF=mv.a.div(LI||(LI=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),hF=mv.a.div(EI||(EI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),pF=mv.a.div(UI||(UI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),yF=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(zd),w=Ew(Rd),x=Pf(Md),v=Ew(ds),b=Ew(o.yearlyFresnelReflectorYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyFresnelReflectorYieldPanelRect||(e.viewState.yearlyFresnelReflectorYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyFresnelReflectorYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyFresnelReflectorYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyFresnelReflectorYieldPanel=!1,s&&(e.actionInfo={name:"Close Fresnel Reflector Yearly Yield Graph",timestamp:(new Date).getTime()})}))},J=v(V.FresnelReflector);Object(r.useEffect)((function(){J<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyFresnelReflectorIndividualOutputs=!1)}))}),[J,w]);var G=me.t("word.Month",U),X=me.t("fresnelReflectorYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyFresnelReflectorYieldPanelRect||(e.viewState.yearlyFresnelReflectorYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyFresnelReflectorYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyFresnelReflectorYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyFresnelReflectorYieldPanel"}))},children:Object(gf.jsx)(fF,{ref:P,style:{zIndex:"yearlyFresnelReflectorYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(hF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(pF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("fresnelReflectorYieldPanel.FresnelReflectorYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(DC,{type:L.YearlyFresnelReflectorYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,uF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&k.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("fresnelReflectorYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(gf.jsx)(eb.a,{title:me.t("fresnelReflectorYieldPanel.ShowOutputsOfIndividualFresnelReflectors",U),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:w,onChange:function(e){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyFresnelReflectorIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Fresnel Reflectors: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForFresnelReflectors=!0,e.pauseYearlySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Fresnel Reflectors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForFresnelReflectors=!0,e.pauseYearlySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+G+"-"+X,"yearly-fresnel-reflector-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Fresnel Reflector Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-fresnel-reflector-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Fresnel Reflector Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},gF=n.a.memo(yF),mF=mv.a.div(NI||(NI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),wF=mv.a.div(VI||(VI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),xF=mv.a.div(JI||(JI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),vF=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(kd),m=Ew(Yd),w=Ew(o.dailyHeliostatYieldPanelRect),x=Pf(Vd),v=Tf(ms),b=Ew(Ni),A=n.a.useRef(null),T=Object(r.useRef)(null),P=Object(r.useRef)(),S=T.current?T.current.clientWidth+40:w?w.width+40:640,j=T.current?T.current.clientHeight+100:w?w.height+100:500,H=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(0),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(new Map),F={lng:a};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],O.current.set(o,(null!==(i=O.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}C(e)}),[g]),Object(r.useEffect)((function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,S,j]),Object(r.useEffect)((function(){var e=function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),T.current&&(P.current||(P.current=new ResizeObserver((function(){d((function(e){T.current&&(e.viewState.dailyHeliostatYieldPanelRect||(e.viewState.dailyHeliostatYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyHeliostatYieldPanelRect.width=T.current.offsetWidth,e.viewState.dailyHeliostatYieldPanelRect.height=T.current.offsetHeight)}))}))),P.current.observe(T.current)),function(){var t;window.removeEventListener("resize",e),null===(t=P.current)||void 0===t||t.disconnect()}}),[w,S,j]);var k=function(){d((function(e){e.viewState.showDailyHeliostatYieldPanel=!1,c&&(e.actionInfo={name:"Close Heliostat Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.Heliostat);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyHeliostatIndividualOutputs=!1)}))}),[E,m]);var U=me.t("word.Hour",F),N=me.t("heliostatYieldPanel.YieldPerHour",F),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:A,handle:".handle",bounds:"parent",axis:"both",position:R,onDrag:function(e,t){D({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyHeliostatYieldPanelRect||(e.viewState.dailyHeliostatYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyHeliostatYieldPanelRect.x=Math.max(t.x,S-window.innerWidth),e.viewState.dailyHeliostatYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyHeliostatYieldPanel"}))},children:Object(gf.jsx)(mF,{ref:A,style:{zIndex:"dailyHeliostatYieldPanel"===b?Ke:9},children:Object(gf.jsxs)(wF,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(xF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("heliostatYieldPanel.HeliostatDailyYield",F)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",F)+" "+l+" | "+mW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){k()},onMouseDown:function(){k()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(DC,{type:L.DailyHeliostatYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:N,unitY:me.t("word.kWh",F),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&O.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(O.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===O.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",F)+": "+I.toFixed(3)+" "+me.t("word.kWh",F)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",F)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("heliostatYieldPanel.DailyTotal",F),":",I.toFixed(2)," ",me.t("word.kWh",F)]}),E>1&&Object(gf.jsx)(eb.a,{title:me.t("heliostatYieldPanel.ShowOutputsOfIndividualHeliostats",F),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyHeliostatIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Heliostats: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForHeliostats=!0,e.pauseDailySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:J?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(J?"word.Run":"word.Update",F),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Heliostats",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForHeliostats=!0,e.pauseDailySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",F),onClick:function(){_h("line-graph-"+U+"-"+N,"daily-heliostat-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",F)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Heliostat Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",F),onClick:function(){$h(g,"daily-heliostat-yield.csv"),Kh(me.t("message.CsvFileSaved",F)),c&&d((function(e){e.actionInfo={name:"Export Daily Heliostat Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},bF=n.a.memo(vF),AF=["Daylight","Clearness"],TF=mv.a.div(GI||(GI=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),PF=mv.a.div(XI||(XI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),SF=mv.a.div(BI||(BI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),jF=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(Ed),w=Ew(Ud),x=Pf(Vd),v=Ew(ds),b=Ew(o.yearlyHeliostatYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyHeliostatYieldPanelRect||(e.viewState.yearlyHeliostatYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyHeliostatYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyHeliostatYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyHeliostatYieldPanel=!1,s&&(e.actionInfo={name:"Close Heliostat Yearly Yield Graph",timestamp:(new Date).getTime()})}))},J=v(V.Heliostat);Object(r.useEffect)((function(){J<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyHeliostatIndividualOutputs=!1)}))}),[J,w]);var G=me.t("word.Month",U),X=me.t("heliostatYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyHeliostatYieldPanelRect||(e.viewState.yearlyHeliostatYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyHeliostatYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyHeliostatYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyHeliostatYieldPanel"}))},children:Object(gf.jsx)(TF,{ref:P,style:{zIndex:"yearlyHeliostatYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(PF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(SF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("heliostatYieldPanel.HeliostatYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(DC,{type:L.YearlyHeliostatYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,AF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&k.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("heliostatYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(gf.jsx)(eb.a,{title:me.t("heliostatYieldPanel.ShowOutputsOfIndividualHeliostats",U),checkedChildren:Object(gf.jsx)(cO.a,{}),unCheckedChildren:Object(gf.jsx)(cO.a,{}),checked:w,onChange:function(e){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyHeliostatIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Heliostats: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForHeliostats=!0,e.pauseYearlySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Heliostats",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForHeliostats=!0,e.pauseYearlySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+G+"-"+X,"yearly-heliostat-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Heliostat Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-heliostat-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Heliostat Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},HF=n.a.memo(jF),zF=function(e){var t=e.dataSource,l=e.height,a=e.dataKeyAxisX,o=e.labelX,i=e.labelY1,n=e.labelY2,c=e.unitX,s=e.unitY1,d=e.unitY2,f=e.yMin1,h=void 0===f?"auto":f,p=e.yMax1,y=void 0===p?"auto":p,g=e.yMin2,m=void 0===g?"auto":g,w=e.yMax2,x=void 0===w?"auto":w,v=e.curveType,b=void 0===v?"linear":v,A=e.referenceX,T=e.fractionDigits,P=void 0===T?2:T,S=e.symbolCount,j=void 0===S?12:S,H=Object(r.useState)(0),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(null),W=Object(u.a)(M,2),I=W[0],C=W[1];Object(r.useEffect)((function(){if(t&&0!==t.length){var e=Array.isArray(t)?Object.keys(t[0]).length-1:Object.keys(t).length-1;e--,R!==e/2&&D(e/2)}}),[t]);var O=Object(r.useMemo)((function(){var e,t=[];t.push(Object(gf.jsx)(JW.a,{yAxisId:"left",type:b,name:"T_Ambient",dataKey:"T_Ambient",stroke:Be[0],strokeDasharray:"5 5",opacity:.5,strokeWidth:2,dot:!1,isAnimationActive:!1},"ambient-temperature"));for(var l=0;l0&&(i||e),isAnimationActive:!1},"left-"+l)),a="V_Tower"+(l+1),i=HC(BW[2*l+1],1,j,o=null===I||I===a?1:.25),t.push(Object(gf.jsx)(JW.a,{yAxisId:"right",type:b,name:a,dataKey:a,stroke:Be[2*l+1],opacity:o,strokeWidth:2,dot:j>0&&(i||e),isAnimationActive:!1},"right-"+l))}return t}),[b,R,2,j,1,I]);return Object(gf.jsx)(gf.Fragment,{children:t&&Object(gf.jsx)("div",{id:"biaxial-line-graph-"+o+"-"+i+"-"+n,style:{width:"100%",height:"".concat(l,"%"),position:"relative",direction:"ltr"},children:Object(gf.jsx)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:Object(gf.jsx)(PW.a,{width:"100%",height:"100%",children:Object(gf.jsxs)(XW.a,{data:t,onMouseDown:function(){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(jW.a,{formatter:function(e){return e.toFixed(P)}}),Object(gf.jsx)(HW.a,{vertical:!0,horizontal:!0,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(zW.a,{yAxisId:"left",x:A,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(RW.a,{dataKey:null!==a&&void 0!==a?a:o,fontSize:"10px",children:Object(gf.jsx)(DW.a,{value:o+(c?" ("+c+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(MW.a,{domain:[h,y],yAxisId:"left",fontSize:"10px",children:Object(gf.jsx)(DW.a,{dx:-15,value:i+(s?" ("+s+")":""),offset:0,angle:-90,position:"center"})}),Object(gf.jsx)(MW.a,{domain:[m,x],yAxisId:"right",orientation:"right",fontSize:"10px",children:Object(gf.jsx)(DW.a,{dx:15,value:n+(d?" ("+d+")":""),offset:0,angle:-90,position:"center"})}),O,R>1&&Object(gf.jsx)(WW.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(){C(null)},onMouseEnter:function(e){C(e.dataKey)}})]})})})})})},RF=mv.a.div(KI||(KI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),DF=mv.a.div(qI||(qI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),MF=mv.a.div(QI||(QI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),WF=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(us),g=Pf(Qd),m=Pf(qd),w=Ew(Zd),x=Ew(o.dailyUpdraftTowerYieldPanelRect),v=Pf(au),b=Tf(ms),A=Ew(Ni),T=n.a.useRef(null),P=Object(r.useRef)(null),S=Object(r.useRef)(),j=P.current?P.current.clientWidth+40:x?x.width+40:680,H=P.current?P.current.clientHeight+100:x?x.height+100:650,z=Object(r.useState)({x:x?Math.max(x.x,j-window.innerWidth):0,y:x?Math.min(x.y,window.innerHeight-H):0}),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(0),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],F.current.set(o,(null!==(i=F.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}O(e)}),[g]),Object(r.useEffect)((function(){M({x:Math.max(null===x||void 0===x?void 0:x.x,j-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-H)})}),[x,j,H]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===x||void 0===x?void 0:x.x,j-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-H)})};return window.addEventListener("resize",e),P.current&&(S.current||(S.current=new ResizeObserver((function(){d((function(e){P.current&&(e.viewState.dailyUpdraftTowerYieldPanelRect||(e.viewState.dailyUpdraftTowerYieldPanelRect=new Ot(0,0,640,550)),e.viewState.dailyUpdraftTowerYieldPanelRect.width=P.current.offsetWidth,e.viewState.dailyUpdraftTowerYieldPanelRect.height=P.current.offsetHeight)}))}))),S.current.observe(P.current)),function(){var t;window.removeEventListener("resize",e),null===(t=S.current)||void 0===t||t.disconnect()}}),[x,j,H]);var E=function(){d((function(e){e.viewState.showDailyUpdraftTowerYieldPanel=!1,c&&(e.actionInfo={name:"Close Solar Updraft Tower Daily Yield Graph",timestamp:(new Date).getTime()})}))},U=y(G.UpdraftTower);Object(r.useEffect)((function(){U<2&&w&&d((function(e){e.graphState&&(e.graphState.dailyUpdraftTowerIndividualOutputs=!1)}))}),[U,w]);var N=me.t("word.Hour",k),V=me.t("updraftTowerYieldPanel.YieldPerHour",k),J=me.t("updraftTowerYieldPanel.ChimneyAirTemperature",k),X=me.t("updraftTowerYieldPanel.ChimneyWindSpeed",k),B=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:T,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyUpdraftTowerYieldPanelRect||(e.viewState.dailyUpdraftTowerYieldPanelRect=new Ot(0,0,640,550)),e.viewState.dailyUpdraftTowerYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.dailyUpdraftTowerYieldPanelRect.y=Math.min(t.y,window.innerHeight-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"}))},children:Object(gf.jsx)(RF,{ref:T,style:{zIndex:"dailySolarUpdraftTowerYieldPanel"===A?Ke:9},children:Object(gf.jsxs)(DF,{ref:P,style:{opacity:s,width:(x?x.width:640)+"px",height:(x?x.height:550)+"px"},children:[Object(gf.jsxs)(MF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("updraftTowerYieldPanel.UpdraftTowerDailyYield",k)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+mW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",k)})]}),Object(gf.jsx)(DC,{type:L.DailyUpdraftTowerYield,chartType:w?Y.Line:Y.Area,dataSource:g,labels:v,height:100,dataKeyAxisX:"Hour",labelX:N,labelY:V,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),Object(gf.jsx)(zF,{dataSource:m,height:100,dataKeyAxisX:"Hour",labelX:N,labelY1:J,labelY2:X,unitY1:"\xb0C",unitY2:me.t("word.MeterPerSecond",k),yMin1:0,yMin2:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!b&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[U>1&&F.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(F.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+C.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("updraftTowerYieldPanel.DailyTotal",k),":",C.toFixed(2)," ",me.t("word.kWh",k)]}),Object(gf.jsx)(xv.a,{type:"default",icon:B?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(B?"word.Run":"word.Update",k),onClick:function(){0!==U?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Solar Updraft Tower",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForUpdraftTower=!0,e.pauseDailySimulationForUpdraftTower=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",k))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+N+"-"+V,"daily-updraft-tower-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Updraft Tower Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-updraft-tower-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Updraft Tower Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},IF=n.a.memo(WF),CF=mv.a.div(ZI||(ZI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n"]))),OF=mv.a.div(_I||(_I=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n"]))),FF=mv.a.div($I||($I=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),kF=function(e){var t,l,a,c=e.city,s=Ew(Vi),d=Ew(Sr),f=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,h=Ew(si),p=new Date(Ew(i.date)),y=Ew(i.latitude),g=Ew(i.ground),m=null!==(l=Ew(i.diurnalTemperatureModel))&&void 0!==l?l:U.Sinusoidal,w=null!==(a=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==a?a:900,v=Ew(Cs),b=Ew(o.diurnalTemperaturePanelRect),A=Ew(Ni),T=n.a.useRef(null),P=Object(r.useRef)(null),S=Object(r.useRef)(),j=P.current?P.current.clientWidth+40:b?b.width+40:640,H=P.current?P.current.clientHeight+100:b?b.height+100:500,z=Object(r.useState)({x:b?Math.min(b.x,window.innerWidth-j):0,y:b?Math.min(b.y,window.innerHeight-H):0}),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(m),I=Object(u.a)(W,2),C=I[0],O=I[1],F={lng:s};Object(r.useEffect)((function(){M({x:Math.min(null===b||void 0===b?void 0:b.x,window.innerWidth-j),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-H)})}),[b,j,H]),Object(r.useEffect)((function(){var e=function(){M({x:Math.min(null===b||void 0===b?void 0:b.x,window.innerWidth-j),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-H)})};return window.addEventListener("resize",e),P.current&&(S.current||(S.current=new ResizeObserver((function(){h((function(e){P.current&&(e.viewState.diurnalTemperaturePanelRect||(e.viewState.diurnalTemperaturePanelRect=new Ot(0,0,600,400)),e.viewState.diurnalTemperaturePanelRect.width=P.current.offsetWidth,e.viewState.diurnalTemperaturePanelRect.height=P.current.offsetHeight)}))}))),S.current.observe(P.current)),function(){var t;window.removeEventListener("resize",e),null===(t=S.current)||void 0===t||t.disconnect()}}),[b,j,H]);var k=Object(r.useMemo)((function(){var e=[];if(c){var t=v(c);if(t)for(var l=Ty(p,y),a=0;a<24;a++){var o;p.setHours(a);var i=HT(p,t.lowestTemperatures,t.highestTemperatures),r=Tw.minutesIntoDay(p);e.push({Hour:a,Sinusoidal:jT(i.high,i.low,U.Sinusoidal,w,l,r),PartonLogan:jT(i.high,i.low,U.PartonLogan,w,l,r),Ground:zT(y,Tw.dayOfYear(p),r,t.lowestTemperatures,t.highestTemperatures,w,.5*(i.high-i.low),null!==(o=g.thermalDiffusivity)&&void 0!==o?o:.05,1)})}}return e}),[c,w,m,p.getMonth(),p.getDate()]),E=function(){var e={name:"Close Diurnal Temperature Panel",timestamp:Date.now(),undo:function(){h((function(e){e.viewState.showDiurnalTemperaturePanel=!0}))},redo:function(){h((function(e){e.viewState.showDiurnalTemperaturePanel=!1}))}};d(e),h((function(e){e.viewState.showDiurnalTemperaturePanel=!1}))};return Object(gf.jsx)(JT.a,{nodeRef:T,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){M({x:Math.min(t.x,window.innerWidth-j),y:Math.min(t.y,window.innerHeight-H)})},onStop:function(e,t){h((function(e){e.viewState.diurnalTemperaturePanelRect||(e.viewState.diurnalTemperaturePanelRect=new Ot(0,0,600,400)),e.viewState.diurnalTemperaturePanelRect.x=Math.min(t.x,window.innerWidth-j),e.viewState.diurnalTemperaturePanelRect.y=Math.min(t.y,window.innerHeight-H)}))},onMouseDown:function(){h((function(e){e.selectedFloatingWindow="diurnalTemperaturePanel"}))},children:Object(gf.jsx)(CF,{ref:T,style:{zIndex:"diurnalTemperaturePanel"===A?Ke:10},children:Object(gf.jsxs)(OF,{ref:P,style:{opacity:f,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(FF,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("menu.settings.DiurnalTemperature",F)+": "+c+" | "+x()(p).format("MM/DD")}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(DC,{chartType:Y.Line,type:L.HourlyTemperatures,selectedIndex:C-U.Sinusoidal,dataSource:k,height:100,dataKeyAxisX:"Hour",labelX:me.t("word.Hour",F),labelY:me.t("word.Temperature",F),unitY:"\xb0C",fractionDigits:1,referenceX:p.getHours()}),Object(gf.jsxs)(wv.b,{style:{alignSelf:"center"},children:[Object(gf.jsx)(wv.b,{children:me.t("diurnalTemperaturePanel.SelectAirTemperatureModel",F)}),Object(gf.jsxs)(tb.a.Group,{onChange:function(e){var t=C,l=e.target.value,a={name:"Change Diurnal Temperature Model",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){O(a.oldValue),h((function(e){e.world.diurnalTemperatureModel=a.oldValue}))},redo:function(){O(a.newValue),h((function(e){e.world.diurnalTemperatureModel=a.newValue}))}};d(a),O(l),h((function(e){e.world.diurnalTemperatureModel=l}))},value:C,children:[Object(gf.jsx)(tb.a,{value:U.Sinusoidal,children:me.t("diurnalTemperaturePanel.Sinusoidal",F)}),Object(gf.jsx)(tb.a,{value:U.PartonLogan,children:"Parton-Logan"})]})]})]})})})},YF=n.a.memo(kF),LF=["Daylight","Clearness"],EF=mv.a.div(eC||(eC=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),UF=mv.a.div(tC||(tC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),NF=mv.a.div(lC||(lC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),VF=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.sutDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(eu),w=Ew(tu),x=Pf(au),v=Ew(us),b=Ew(o.yearlyUpdraftTowerYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyUpdraftTowerYieldPanelRect||(e.viewState.yearlyUpdraftTowerYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyUpdraftTowerYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyUpdraftTowerYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyUpdraftTowerYieldPanel=!1,s&&(e.actionInfo={name:"Close Solar Updraft Tower Yearly Yield Graph",timestamp:(new Date).getTime()})}))},V=v(G.UpdraftTower);Object(r.useEffect)((function(){V<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyUpdraftTowerIndividualOutputs=!1)}))}),[V,w]);var J=me.t("word.Month",U),X=me.t("updraftTowerYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyUpdraftTowerYieldPanelRect||(e.viewState.yearlyUpdraftTowerYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyUpdraftTowerYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyUpdraftTowerYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlySolarUpdraftTowerYieldPanel"}))},children:Object(gf.jsx)(EF,{ref:P,style:{zIndex:"yearlySolarUpdraftTowerYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(UF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(NF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("updraftTowerYieldPanel.UpdraftTowerYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(DC,{type:L.YearlyUpdraftTowerYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,LF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:J,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[V>1&&k.current.size>0?Object(gf.jsx)(pD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("updraftTowerYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==V?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Solar Updraft Tower",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForUpdraftTower=!0,e.pauseYearlySimulationForUpdraftTower=!1}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+J+"-"+X,"yearly-updraft-tower-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Updraft Tower Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-updraft-tower-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Updraft Tower Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},JF=n.a.memo(VF),GF=function(e){var t=e.dataSource,l=e.labels,a=e.height,o=e.dataKeyAxisX,i=e.labelX,n=e.labelY1,c=e.labelY2,s=e.unitX,d=e.unitY1,f=e.unitY2,h=e.yMin1,p=void 0===h?"auto":h,y=e.yMax1,g=void 0===y?"auto":y,m=e.yMin2,w=void 0===m?"auto":m,x=e.yMax2,v=void 0===x?"auto":x,b=e.curveType,A=void 0===b?"linear":b,T=e.referenceX,P=e.fractionDigits,S=void 0===P?2:P,j=Ew(ff),H=Object(r.useState)(null),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useRef)([]),W=Object(r.useMemo)((function(){if(!t||0===t.length)return[];var e,a=Object.keys(t[0]).length-1,o=t[1]?Object.keys(t[1]).length-1:a,i=t.length,r=[],n=a-1,c=(o-a)/n;M.current.length=0;for(var s=0;s0&&(f||e),isAnimationActive:!1},"left-"+s)),M.current.push({id:d,type:"line",value:d,color:Be[s]})}else if(s===n){var h="Objective",p=null===R||R===h?1:.25,y=HC(BW[s],1,i,p);r.push(Object(gf.jsx)(JW.a,{yAxisId:"right",type:A,name:h,dataKey:h,stroke:Be[s],opacity:p,strokeWidth:2,dot:i>0&&(y||e),isAnimationActive:!1},"right")),M.current.push({id:h,type:"line",value:h,color:Be[n]})}else{var g=Math.floor((s-a)/c),m="Individual"+(s+1),w=HC(BW[g],.5,i,.5,Be[g]);r.push(Object(gf.jsx)(JW.a,{yAxisId:"left",type:A,name:m,dataKey:m,opacity:.5,stroke:Be[g],strokeWidth:0,dot:w||e,isAnimationActive:!1},"left-"+s))}return r}),[t,A,2,1,R]);return Object(gf.jsx)(gf.Fragment,{children:t&&Object(gf.jsx)("div",{id:"biaxial-line-graph-"+i+"-"+n+"-"+c,style:{width:"100%",height:"".concat(a,"%"),position:"relative",direction:"ltr"},children:Object(gf.jsx)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:Object(gf.jsx)(PW.a,{width:"100%",height:"100%",children:Object(gf.jsxs)(XW.a,{data:t,onMouseDown:function(){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(jW.a,{formatter:function(e){return e.toFixed(S)},content:function(e){var t=e.active,l=e.payload;return t&&l?l.map((function(e){var t,l;return(null===(t=e.name)||void 0===t?void 0:t.toString().startsWith("Individual"))?null:(l="Tilt Angle"===e.name?Tw.toDegrees(e.value*(j.maximumTiltAngle-j.minimumTiltAngle)+j.minimumTiltAngle).toFixed(S)+"\xb0":"Inter-Row Spacing"===e.name?(e.value*(j.maximumInterRowSpacing-j.minimumInterRowSpacing)+j.minimumInterRowSpacing).toFixed(S)+"m":"Rack Width"===e.name?Math.floor(e.value*(j.maximumRowsPerRack-j.minimumRowsPerRack)+j.minimumRowsPerRack)+" panels":"Objective"===e.name?e.value.toFixed(S)+" "+f:e.value.toFixed(S),Object(gf.jsxs)("div",{children:[e.name,": ",l]},e.name))})):null}}),Object(gf.jsx)(HW.a,{vertical:!0,horizontal:!0,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(zW.a,{yAxisId:"left",x:T,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(RW.a,{dataKey:null!==o&&void 0!==o?o:i,style:{fontSize:"10px"},children:Object(gf.jsx)(DW.a,{value:i+(s?" ("+s+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(MW.a,{domain:[p,g],yAxisId:"left",style:{fontSize:"10px"},children:Object(gf.jsx)(DW.a,{dx:-20,value:n+(d?" ("+d+")":""),offset:0,angle:-90,position:"center"})}),Object(gf.jsx)(MW.a,{domain:[w,v],yAxisId:"right",orientation:"right",style:{fontSize:"10px"},children:Object(gf.jsx)(DW.a,{dx:30,value:c+(f?" ("+f+")":""),offset:0,angle:-90,position:"center"})}),W,Object(gf.jsx)(WW.a,{payload:M.current,iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(){D(null)},onMouseEnter:function(e){D(e.id)}})]})})})})})},XF=mv.a.div(aC||(aC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 8;\n"]))),BF=mv.a.div(oC||(oC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),KF=mv.a.div(iC||(iC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),qF=function(){var e,t=Ew(Vi),l=Ew(Gi),a=null!==(e=Ew(Ui))&&void 0!==e?e:Qe,i=Ew(si),c=Ew(nf),s=Ew(sf),d=Ew(o.evolutionPanelRect),f=Ew(ln),h=Ew(Gr),p=Ew.getState().evolutionaryAlgorithmState,y=Tf(ms),g=Tf(xs),m=Ew(Ni),w=n.a.useRef(null),x=Object(r.useRef)(null),v=Object(r.useRef)(),b=x.current?x.current.clientWidth+40:d?d.width+40:680,A=x.current?x.current.clientHeight+100:d?d.height+100:500,T=Object(r.useState)({x:d?Math.max(d.x,b-window.innerWidth):0,y:d?Math.min(d.y,window.innerHeight-A):0}),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useMemo)((function(){return{lng:t}}),[t]);Object(r.useEffect)((function(){j({x:Math.max(null===d||void 0===d?void 0:d.x,b-window.innerWidth),y:Math.min(null===d||void 0===d?void 0:d.y,window.innerHeight-A)})}),[d,b,A]),Object(r.useEffect)((function(){var e=function(){j({x:Math.max(null===d||void 0===d?void 0:d.x,b-window.innerWidth),y:Math.min(null===d||void 0===d?void 0:d.y,window.innerHeight-A)})};return window.addEventListener("resize",e),x.current&&(v.current||(v.current=new ResizeObserver((function(){i((function(e){x.current&&(e.viewState.evolutionPanelRect||(e.viewState.evolutionPanelRect=new Ot(0,0,640,400)),e.viewState.evolutionPanelRect.width=x.current.offsetWidth,e.viewState.evolutionPanelRect.height=x.current.offsetHeight)}))}))),v.current.observe(x.current)),function(){var t;window.removeEventListener("resize",e),null===(t=v.current)||void 0===t||t.disconnect()}}),[d,b,A]);var z=function(){i((function(e){e.viewState.showEvolutionPanel=!1,l&&(e.actionInfo={name:"Close Solar Panel Optimization Graph",timestamp:(new Date).getTime()})}))},R=Object(r.useMemo)((function(){return h&&h!==I.GENETIC_ALGORITHM?p.particleSwarmOptimizationParams:p.geneticAlgorithmParams}),[h,p]),D=Object(r.useMemo)((function(){return me.t(h===I.GENETIC_ALGORITHM?"optimizationMenu.Generation":"optimizationMenu.Step",H)}),[h,H]),C=Object(r.useMemo)((function(){return R.problem===M.SOLAR_PANEL_TILT_ANGLE?me.t("solarPanelMenu.TiltAngle",H):me.t("optimizationMenu.NormalizedVariables",H)}),[R.problem,H]),O=Object(r.useMemo)((function(){return R.problem===M.SOLAR_PANEL_TILT_ANGLE?"\xb0":""}),[R.problem]),F=Object(r.useMemo)((function(){return R.problem!==M.SOLAR_PANEL_ARRAY||R.objectiveFunctionType!==W.DAILY_PROFIT&&R.objectiveFunctionType!==W.YEARLY_PROFIT?me.t("word.kWh",H):me.t("word.dollar",H)}),[R.problem,R.objectiveFunctionType,H]),k=Object(r.useMemo)((function(){switch(R.objectiveFunctionType){case W.DAILY_PROFIT:return me.t("optimizationMenu.ObjectiveFunctionDailyProfit",H);case W.YEARLY_PROFIT:return me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",H);case W.DAILY_AVERAGE_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",H);case W.YEARLY_AVERAGE_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",H);case W.DAILY_TOTAL_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",H)}return me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",H)}),[R.objectiveFunctionType,H]),Y=Object(r.useMemo)((function(){return!!f&&(R.problem===M.SOLAR_PANEL_TILT_ANGLE?f.type===V.Foundation:R.problem===M.SOLAR_PANEL_ARRAY&&f.type===V.Polygon)}),[R.problem,f]),L=Object(r.useMemo)((function(){return R.problem===M.SOLAR_PANEL_ARRAY?me.t("optimizationMenu.ClickTargetPolygonToActivate",H):me.t("optimizationMenu.ClickTargetFoundationToActivate",H)}),[R.problem,H]),E=Object(r.useMemo)((function(){var e="";return R.problem===M.SOLAR_PANEL_TILT_ANGLE&&(e+=me.t("optimizationMenu.SolarPanelTiltAngleOptimization",H)),R.problem===M.SOLAR_PANEL_ARRAY&&(e+=me.t("optimizationMenu.SolarPanelArrayLayout",H)),e+=": ",e+=h===I.GENETIC_ALGORITHM?me.t("optimizationMenu.GeneticAlgorithm",H):me.t("optimizationMenu.ParticleSwarmOptimization",H)}),[R.problem,h,H]);return Object(gf.jsx)(JT.a,{nodeRef:w,handle:".handle",bounds:"parent",axis:"both",position:S,onDrag:function(e,t){j({x:Math.max(t.x,b-window.innerWidth),y:Math.min(t.y,window.innerHeight-A)})},onStop:function(e,t){i((function(e){e.viewState.evolutionPanelRect||(e.viewState.evolutionPanelRect=new Ot(0,0,640,400)),e.viewState.evolutionPanelRect.x=Math.max(t.x,b-window.innerWidth),e.viewState.evolutionPanelRect.y=Math.min(t.y,window.innerHeight-A)}))},onMouseDown:function(){i((function(e){e.selectedFloatingWindow="solarPanelOptimizationResult"}))},children:Object(gf.jsx)(XF,{ref:w,style:{zIndex:"solarPanelOptimizationResult"===m?Ke:9},children:Object(gf.jsxs)(BF,{ref:x,style:{opacity:a,width:(d?d.width:640)+"px",height:(d?d.height:400)+"px"},children:[Object(gf.jsxs)(KF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:E}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){z()},onMouseDown:function(){z()},children:me.t("word.Close",H)})]}),Object(gf.jsx)(GF,{dataSource:c,labels:s,height:100,dataKeyAxisX:"Step",labelX:D,labelY1:C,labelY2:k,unitY1:O,unitY2:F,curveType:"linear",fractionDigits:2}),!y&&!g&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Y&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(rD.a,{}),title:me.t("word.Run",H),onClick:function(){Kh(me.t("message.EvolutionStarted",H)),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!0,e.pauseEvolution=!1,e.evolutionInProgress=!0})),l&&i((function(e){var t;R.problem===M.SOLAR_PANEL_ARRAY?h===I.GENETIC_ALGORITHM?t="Run Genetic Algorithm for Solar Panel Array Layout":h===I.PARTICLE_SWARM_OPTIMIZATION&&(t="Run Particle Swarm Optimization for Solar Panel Array Layout"):R.problem===M.SOLAR_PANEL_TILT_ANGLE&&(h===I.GENETIC_ALGORITHM?t="Run Genetic Algorithm for Solar Panel Tilt Angle":h===I.PARTICLE_SWARM_OPTIMIZATION&&(t="Run Particle Swarm Optimization for Solar Panel Tilt Angle")),t&&(e.actionInfo={name:t,timestamp:(new Date).getTime()})}))}),100)}}),!Y&&Object(gf.jsx)("span",{children:L}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",H),onClick:function(){_h("biaxial-line-graph-"+D+"-"+C+"-"+k,"solar-panel-tilt-angle-evolution",{}).then((function(){Kh(me.t("message.ScreenshotSaved",H))}))}})]})]})})})},QF=n.a.memo(qF),ZF=function(e){var t=e.setDialogVisible,l=Ew(si),a=Ew(Vi),o=Ew(rf),i=Ew(Sr),n=Object(r.useState)(!1),c=Object(u.a)(n,2),s=c[0],d=c[1],f=Object(r.useState)(!1),h=Object(u.a)(f,2),p=h[0],y=h[1],g=Object(r.useState)({left:0,top:0,bottom:0,right:0}),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useRef)(null),b=Object(r.useRef)(null),A=Object(r.useRef)(o.electricitySellingPrice),T=Object(r.useRef)(o.operationalCostPerUnit),P={lng:a};Object(r.useEffect)((function(){var e;null===(e=b.current)||void 0===e||e.focus()}),[]);return Object(gf.jsxs)(Zv.a,{width:500,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return y(!0)},onMouseOut:function(){return y(!1)},children:me.t("economicsPanel.EconomicsParameters",P)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){t(!1)},children:me.t("word.Cancel",P)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:b,onClick:function(){!function(){var e=o.electricitySellingPrice,t=A.current;if(e!==t){var a={name:"Electricity Selling Price",timestamp:Date.now(),oldValue:e,newValue:t,undo:function(){l((function(e){e.economicsParams.electricitySellingPrice=a.oldValue}))},redo:function(){l((function(e){e.economicsParams.electricitySellingPrice=a.newValue}))}};i(a),l((function(e){e.economicsParams.electricitySellingPrice=t}))}var r=o.operationalCostPerUnit,n=T.current;if(r!==n){var c={name:"Operational Cost per Unit",timestamp:Date.now(),oldValue:r,newValue:n,undo:function(){l((function(e){e.economicsParams.operationalCostPerUnit=c.oldValue}))},redo:function(){l((function(e){e.economicsParams.operationalCostPerUnit=c.newValue}))}};i(c),l((function(e){e.economicsParams.operationalCostPerUnit=n}))}}(),t(!1)},children:me.t("word.OK",P)},"OK")],onCancel:function(){t(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!p,bounds:w,onStart:function(e,t){return function(e,t){if(v.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=v.current.getBoundingClientRect();x({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:v,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:me.t("economicsPanel.ElectricitySellingPrice",P)+" ([0.1, 1]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)($v.a,{min:.1,max:1,style:{width:"100%"},precision:2,value:A.current,step:.01,formatter:function(e){return"$".concat(e,"/kWh")},onChange:function(e){A.current=e,d(!s)},onBlur:function(e){var t=e.target.value.replace("$","").replace("/kWh",""),l=parseFloat(t);A.current=Number.isNaN(l)?.1:l,d(!s)},onPressEnter:function(e){var t=e.target.value.replace("$","").replace("/kWh",""),l=parseFloat(t);A.current=Number.isNaN(l)?.1:l,d(!s)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:me.t("economicsPanel.OperationalCostPerUnit",P)+" ([0.1, 1]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)($v.a,{min:.1,max:1,style:{width:"100%"},precision:2,value:T.current,step:.01,formatter:function(e){return"$".concat(e,"/day")},onChange:function(e){T.current=e,d(!s)},onBlur:function(e){var t=e.target.value.replace("$","").replace("/day",""),l=parseFloat(t);T.current=Number.isNaN(l)?.1:l,d(!s)},onPressEnter:function(e){var t=e.target.value.replace("$","").replace("/day",""),l=parseFloat(t);T.current=Number.isNaN(l)?.1:l,d(!s)}})})]})]})},_F=n.a.memo(ZF),$F=function(e,t,l){var a=Ew.getState().elements,o=Ew(_r),i=Ew(Zr),n=Tf(bi),c=Pf(Ai),s=Pf(Pi),d=Pf(ji),u=[],h=[],p=Object(r.useRef)(new Map),y=Object(r.useRef)(new Map),g=Object(r.useRef)(new Map);return Object(r.useEffect)((function(){var r=HT(e,t.lowestTemperatures,t.highestTemperatures);p.current.clear(),y.current.clear(),g.current.clear();for(var n=0;n<24;n++){var m,w={},x=new Map,v=Object(f.a)(a);try{for(v.s();!(m=v.n()).done;){var b=m.value;if(Tw.onBuildingEnvelope(b)){var A=c.get(b.id);if(A){var T=b.type===V.Foundation?b:o(b);if(T&&!T.notBuilding&&Tw.getBuildingCompletionStatus(T,a)===D.COMPLETE){var P,S,j,H=x.get(T.id);if(!H)H=l?{heater:0,ac:0,geothermal:0,solarPanel:0,label:null===(P=T.label)||void 0===P?void 0:P.trim()}:{heater:0,ac:0,geothermal:0,label:null===(S=T.label)||void 0===S?void 0:S.trim()},x.set(T.id,H),(null===(j=T.hvacSystem)||void 0===j?void 0:j.id)?T.hvacSystem.id&&T.hvacSystem.id.length>0&&!h.includes(T.hvacSystem.id)&&h.push(T.hvacSystem.id):T.label&&T.label.length>0&&!h.includes(T.label)&&h.push(T.label);b.type===V.Foundation?H.geothermal+=A[n]:A[n]<0?H.heater+=A[n]:H.ac+=A[n]}}}}}catch(Se){v.e(Se)}finally{v.f()}var z,R=Object(f.a)(a);try{for(R.s();!(z=R.n()).done;){var M=z.value;if(M.type===V.Foundation){var W=M;if(!W.notBuilding&&Tw.getBuildingCompletionStatus(W,a)!==D.COMPLETE)continue;var I=x.get(M.id);if(I){var C=s.get(M.id);if(C&&(I.heater<0?(I.heater+=C[n],I.heater>0&&(I.heater=0)):I.ac>0&&(I.ac+=C[n])),void 0!==I.solarPanel){var O=d.get(M.id);O&&(I.solarPanel+=O[n])}}}}}catch(Se){R.e(Se)}finally{R.f()}if(x.size>1){var F,k=1,Y=Object(f.a)(x.keys());try{for(Y.s();!(F=Y.n()).done;){var L=F.value;w.Hour=n;var E=x.get(L);if(E){var U=i(L);if(U&&U.type===V.Foundation){var N=U;if(!N.notBuilding&&Tw.getBuildingCompletionStatus(N,a)===D.COMPLETE){var J,G,X,B,K,q,Q=null!==(J=null===(G=N.hvacSystem)||void 0===G?void 0:G.thermostatSetpoint)&&void 0!==J?J:20,Z=null!==(X=null===(B=N.hvacSystem)||void 0===B?void 0:B.temperatureThreshold)&&void 0!==X?X:3,_=null!==(K=null===(q=N.hvacSystem)||void 0===q?void 0:q.id)&&void 0!==K?K:E.label&&""!==E.label?E.label:k.toString();_===k.toString()&&k++;var $=Math.abs(ST(r,E.heater,Q,Z)),ee=ST(r,E.ac,Q,Z);$>0?($-=E.geothermal)<0&&($=0):ee>0&&(ee+=E.geothermal)<0&&(ee=0);var te="Heater "+_;w[te]?w[te]=w[te]+$:w[te]=$;var le="AC "+_;if(w[le]?w[le]=w[le]+ee:w[le]=ee,void 0!==E.solarPanel){var ae="Solar "+_;w[ae]?w[ae]=w[ae]-E.solarPanel:w[ae]=-E.solarPanel}var oe,ie,re="Net "+_;if(w[re])w[re]=w[re]+$+ee-(null!==(oe=E.solarPanel)&&void 0!==oe?oe:0);else w[re]=$+ee-(null!==(ie=E.solarPanel)&&void 0!==ie?ie:0);var ne=p.current.get(_);void 0===ne&&(ne=0),ne+=$,p.current.set(_,ne),void 0===(ne=y.current.get(_))&&(ne=0),ne+=ee,y.current.set(_,ne),l&&(void 0===(ne=g.current.get(_))&&(ne=0),ne+=E.solarPanel,g.current.set(_,ne))}}}}}catch(Se){Y.e(Se)}finally{Y.f()}}else{var ce,se=Object(f.a)(x.keys());try{for(se.s();!(ce=se.n()).done;){var de=ce.value;w.Hour=n;var ue=x.get(de);if(ue){var fe=i(de);if(fe&&fe.type===V.Foundation){var he=fe;if(!he.notBuilding&&Tw.getBuildingCompletionStatus(he,a)===D.COMPLETE){var pe,ye,ge,me,we,xe=null!==(pe=null===(ye=he.hvacSystem)||void 0===ye?void 0:ye.thermostatSetpoint)&&void 0!==pe?pe:20,ve=null!==(ge=null===(me=he.hvacSystem)||void 0===me?void 0:me.temperatureThreshold)&&void 0!==ge?ge:3,be=Math.abs(ST(r,ue.heater,xe,ve)),Ae=ST(r,ue.ac,xe,ve);be>0?(be-=ue.geothermal)<0&&(be=0):Ae>0&&(Ae+=ue.geothermal)<0&&(Ae=0),w.Heater=be,w.AC=Ae,void 0!==ue.solarPanel&&(w.Solar=-ue.solarPanel),w.Net=be+Ae-(null!==(we=ue.solarPanel)&&void 0!==we?we:0);var Te="default",Pe=p.current.get(Te);void 0===Pe&&(Pe=0),Pe+=be,p.current.set(Te,Pe),void 0===(Pe=y.current.get(Te))&&(Pe=0),Pe+=Ae,y.current.set(Te,Pe),l&&(void 0===(Pe=g.current.get(Te))&&(Pe=0),Pe+=ue.solarPanel,g.current.set(Te,Pe))}}}}}catch(Se){se.e(Se)}finally{se.f()}}u.push(w)}}),[n]),{sum:u,sumHeaterMap:p.current,sumAcMap:y.current,sumSolarPanelMap:g.current,dataLabels:h}},ek=l(829),tk=Object(mv.a)(LW)(rC||(rC=Object(gv.a)(["\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n"]))),lk=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.lineWidth,o=e.symbolSize,i=e.barCategoryGap,n=e.changeHorizontalGrid,c=e.changeVerticalGrid,s=e.changeLineWidth,d=e.changeSymbolSize,f=e.changeBarCategoryGap,h={lng:Ew(Vi)},p=Object(r.useState)(!1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.LineWidth",h)+":",Object(gf.jsx)($S.a,{min:0,max:10,tooltipVisible:!1,defaultValue:2*a,onChange:function(e){null===s||void 0===s||s(e/2)}})]}),Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.SymbolSize",h)+":",Object(gf.jsx)($S.a,{min:2,max:12,tooltipVisible:!1,defaultValue:5*o,onChange:function(e){null===d||void 0===d||d(e/5)}})]}),Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.BarCategoryGap",h)+":",Object(gf.jsx)($S.a,{min:0,max:20,tooltipVisible:!1,defaultValue:i,onChange:function(e){null===f||void 0===f||f(e)}})]}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:t,onClick:function(){null===n||void 0===n||n(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",h)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:l,onClick:function(){null===c||void 0===c||c(!l)},children:me.t("menu.graph.ShowVerticalGridLines",h)})})]});return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(lb.a,{overlay:w,placement:"bottomRight",visible:g,onVisibleChange:function(e){m(e)},children:Object(gf.jsx)(tk,{style:{right:"25px"},onClick:function(e){e.stopPropagation()}})})})},ak=function(e){var t=e.type,l=e.dataSource,a=e.hasSolarPanels,o=e.labels,i=e.height,n=e.dataKeyAxisX,c=e.labelX,s=e.labelY,d=e.unitX,f=e.unitY,h=e.yMin,p=void 0===h?"auto":h,y=e.yMax,g=void 0===y?"auto":y,m=e.curveType,w=void 0===m?"linear":m,x=e.referenceX,v=e.fractionDigits,b=void 0===v?2:v,A=e.symbolCount,T=void 0===A?12:A,P=Object(r.useState)(0),S=Object(u.a)(P,2),j=S[0],H=S[1],z=Object(r.useState)(),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(!0),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useState)(!0),k=Object(u.a)(F,2),Y=k[0],L=k[1],E=Object(r.useState)(null),U=Object(u.a)(E,2),N=U[0],V=U[1],J=Object(r.useState)(2),G=Object(u.a)(J,2),X=G[0],B=G[1],K=Object(r.useState)(1),q=Object(u.a)(K,2),Q=q[0],Z=q[1],_=Object(r.useState)(2),$=Object(u.a)(_,2),ee=$[0],te=$[1];Object(r.useEffect)((function(){if(l&&0!==l.length){var e=a?4:3,t=(Array.isArray(l)?Object.keys(l[0]).length-1:Object.keys(l).length-1)/e;if(j!==t&&H(t),1===t&&l[0])for(var o in l[0])if(o.startsWith("Heater")){M(o.length>6?o.substring(6).trim():void 0);break}}}),[l]);var le=Object(r.useMemo)((function(){for(var e,t=[],l=a?4:3,i="gray",r=0;r1?o[r*l]:D?"Heater "+D:"Heater";t.push(Object(gf.jsx)(TW.a,{name:n,dataKey:n,stroke:i,fill:"#FA8072",opacity:null===N||N===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l)),n=j>1?o[r*l+1]:D?"AC "+D:"AC",t.push(Object(gf.jsx)(TW.a,{name:n,dataKey:n,stroke:i,fill:"#00BFFF",opacity:null===N||N===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l+1)),a&&(n=j>1?o[r*l+2]:D?"Solar "+D:"Solar",t.push(Object(gf.jsx)(TW.a,{name:n,dataKey:n,stroke:i,fill:"#3CB371",opacity:null===N||N===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l+2)))}for(var c=l-1,s=0;s1?o[s*l+c]:D?"Net "+D:"Net",u=HC(BW[s],Q,T,null===N||N===d?1:.25);0===s&&(e=u),t.push(Object(gf.jsx)(JW.a,{type:w,name:d,dataKey:d,stroke:Be[s],opacity:null===N||N===d?1:.25,strokeWidth:X,dot:T>0&&(u||e),isAnimationActive:!1},s*l+c))}return t}),[t,w,o,j,D,X,T,Q,N]);return Object(gf.jsx)(gf.Fragment,{children:l&&Object(gf.jsx)("div",{id:"line-graph-"+c+"-"+s,style:{width:"100%",height:"".concat(i,"%"),position:"relative",direction:"ltr"},children:Object(gf.jsxs)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:[Object(gf.jsx)(PW.a,{width:"100%",height:"100%",children:Object(gf.jsxs)(ek.a,{data:l,stackOffset:"sign",barGap:0,barCategoryGap:ee,onMouseDown:function(e){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(jW.a,{formatter:function(e){return e.toFixed(b)+" "+f}}),Object(gf.jsx)(HW.a,{vertical:Y,horizontal:C,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(zW.a,{x:x,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(RW.a,{dataKey:null!==n&&void 0!==n?n:c,fontSize:"10px",children:Object(gf.jsx)(DW.a,{value:c+(d?" ("+d+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(MW.a,{domain:[p,g],fontSize:"10px",children:Object(gf.jsx)(DW.a,{dx:-15,value:s+(f?" ("+f+")":""),offset:0,angle:-90,position:"center"})}),le,Object(gf.jsx)(zW.a,{y:0,stroke:"#888"}),j>0&&Object(gf.jsx)(WW.a,{wrapperStyle:{fontSize:"11px"},iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(e){V(null)},onMouseEnter:function(e){V(e.dataKey)}})]})}),Object(gf.jsx)(lk,{symbolSize:Q,lineWidth:X,barCategoryGap:ee,horizontalGrid:C,verticalGrid:Y,changeHorizontalGrid:function(e){O(e)},changeVerticalGrid:function(e){L(e)},changeLineWidth:function(e){B(e)},changeSymbolSize:function(e){Z(e)},changeBarCategoryGap:function(e){te(e)}})]})})})},ok=mv.a.div(nC||(nC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),ik=mv.a.div(cC||(cC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),rk=mv.a.div(sC||(sC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),nk=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),h=Ew(rs),p=Ew(Cs),y=new Date(Ew(i.date)),g=Ew(o.dailyBuildingEnergyPanelRect),m=Tf(bi),w=Tf(Ir),x=Tf(kr),v=Tf(ms),b=Tw.hasSolarPanels(Ew.getState().elements),A=Pf(rd),T=Pf(nd),P=Pf(cd),S=Ew(Ni),j=n.a.useRef(null),H=Object(r.useRef)(null),z=Object(r.useRef)(),R=H.current?H.current.clientWidth+40:g?g.width+40:640,M=H.current?H.current.clientHeight+100:g?g.height+100:460,W=Object(r.useState)({x:g?Math.max(g.x,R-window.innerWidth):0,y:g?Math.min(g.y,window.innerHeight-M):0}),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useState)([]),k=Object(u.a)(F,2),Y=k[0],E=k[1],U=Object(r.useState)(0),N=Object(u.a)(U,2),V=N[0],J=N[1],G=Object(r.useState)(0),X=Object(u.a)(G,2),B=X[0],K=X[1],q=Object(r.useState)(0),Q=Object(u.a)(q,2),Z=Q[0],_=Q[1],$=Object(r.useState)(0),ee=Object(u.a)($,2),te=ee[0],le=ee[1],ae=Object(r.useState)(["Heater","AC","Net"]),oe=Object(u.a)(ae,2),ie=oe[0],re=oe[1],ne={lng:a},ce=p(null!==l&&void 0!==l?l:"Boston MA, USA"),se=Object(r.useRef)([]),de=Object(r.useRef)([]),ue=Object(r.useRef)([]),fe=Object(r.useRef)([]);Object(r.useEffect)((function(){w&&he()}),[w]),Object(r.useEffect)((function(){he()}),[x]);var he=function(){E([]),J(0),K(0),_(0),le(0),re([])},pe=$F(y,ce,b),ye=pe.sum,ge=pe.sumHeaterMap,we=pe.sumAcMap,xe=pe.sumSolarPanelMap,ve=pe.dataLabels;Object(r.useEffect)((function(){E(ye);var e=0,t=0,l=0,a=ge.size>1;if(ge){se.current=[];var o,i=Object(f.a)(ge.keys());try{for(i.s();!(o=i.n()).done;){var r=o.value,n=ge.get(r);n&&(e+=n,a&&se.current.push(r+": "+n.toFixed(2)+" "+me.t("word.kWh",ne)))}}catch(C){i.e(C)}finally{i.f()}}if(we){de.current=[];var c,s=Object(f.a)(we.keys());try{for(s.s();!(c=s.n()).done;){var d=c.value,u=we.get(d);u&&(t+=u,a&&de.current.push(d+": "+u.toFixed(2)+" "+me.t("word.kWh",ne)))}}catch(C){s.e(C)}finally{s.f()}}if(xe&&xe.size>0){ue.current=[];var h,p=Object(f.a)(xe.keys());try{for(p.s();!(h=p.n()).done;){var y=h.value,g=xe.get(y);g&&(l+=g,a&&ue.current.push(y+": "+g.toFixed(2)+" "+me.t("word.kWh",ne)))}}catch(C){p.e(C)}finally{p.f()}}if(ge&&we&&xe){fe.current=[];var m,w=Object(f.a)(ge.keys());try{for(w.s();!(m=w.n()).done;){var x=m.value,v=0,S=ge.get(x),j=we.get(x),H=xe.get(x);S&&(v+=S),j&&(v+=j),H&&(v-=H),a&&fe.current.push(x+": "+v.toFixed(2)+" "+me.t("word.kWh",ne))}}catch(C){w.e(C)}finally{w.f()}}J(e),K(t),_(l),le(e+t-l),A(e),T(t),P(l);var z=(Object.keys(ye[0]).length-1)/(b?4:3);if(z>1){for(var R=[],D=0,M=0;M0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",ne),onClick:function(){$h(Y,"daily-building-energy.csv"),Kh(me.t("message.CsvFileSaved",ne)),c&&d((function(e){e.actionInfo={name:"Export Daily Building Energy Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},ck=n.a.memo(nk),sk=mv.a.div(dC||(dC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),dk=mv.a.div(uC||(uC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),uk=mv.a.div(fC||(fC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),fk=function(e){var t,l,a=e.city,c=Ew.getState().world,s=Ew(Cs),d=Ew(Vi),p=Ew(Gi),y=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,g=Ew(si),m=Ew(rs),w=new Date(Ew(i.date)),x=Ew(o.yearlyBuildingEnergyPanelRect),v=Tf(bi),b=Tf(Or),A=Tf(Yr),T=Tf(ms),P=Tw.hasSolarPanels(Ew.getState().elements),S=Pf(rd),j=Pf(nd),H=Pf(cd),z=Ew(Ni),R=Object(r.useRef)(null),M=Object(r.useRef)(),W=R.current?R.current.clientWidth+40:x?x.width+40:640,I=R.current?R.current.clientHeight+100:x?x.height+100:600,C=Object(r.useState)({x:x?Math.max(x.x,W-window.innerWidth):0,y:x?Math.min(x.y,window.innerHeight-I):0}),O=Object(u.a)(C,2),F=O[0],k=O[1],Y=n.a.useRef(null),E={lng:d},U=s(null!==a&&void 0!==a?a:"Boston MA, USA"),N=it[w.getMonth()],V=null!==(l=c.daysPerYear)&&void 0!==l?l:6,J=12/V,G=Object(r.useState)(0),X=Object(u.a)(G,2),B=X[0],K=X[1],q=Object(r.useState)(0),Q=Object(u.a)(q,2),Z=Q[0],_=Q[1],$=Object(r.useState)(0),ee=Object(u.a)($,2),te=ee[0],le=ee[1],ae=Object(r.useState)(0),oe=Object(u.a)(ae,2),ie=oe[0],re=oe[1],ne=Object(r.useState)(["Heater","AC","Solar","Net"]),ce=Object(u.a)(ne,2),se=ce[0],de=ce[1],ue=Object(r.useState)([]),fe=Object(u.a)(ue,2),he=fe[0],pe=fe[1],ye=$F(w,U,P),ge=ye.sum,we=ye.sumHeaterMap,xe=ye.sumAcMap,ve=ye.sumSolarPanelMap,be=ye.dataLabels,Ae=Object(r.useRef)(new Array(V).fill({})),Te=Object(r.useRef)(new Array(V).fill(0)),Pe=Object(r.useRef)(new Array(V).fill(0)),Se=Object(r.useRef)(new Array(V).fill(0)),je=Object(r.useRef)(new Array(V).fill(0)),He=Object(r.useRef)([]),ze=Object(r.useRef)([]),Re=Object(r.useRef)([]),De=Object(r.useRef)([]);Object(r.useEffect)((function(){Me()}),[V,A]),Object(r.useEffect)((function(){b&&Me()}),[b]);var Me=function(){Ae.current=new Array(V).fill({}),Te.current=new Array(V).fill(0),Pe.current=new Array(V).fill(0),Se.current=new Array(V).fill(0),je.current=new Array(V).fill(0),pe([]),K(0),_(0),le(0),re(0),de([])};Object(r.useEffect)((function(){var e=w.getMonth()/J,t=(Object.keys(ge[0]).length-1)/(P?4:3);if(He.current=[],ze.current=[],De.current=[],Re.current=[],t>1){var l,a=new Map,o=new Map,i=new Map,r=new Map,n=Object(f.a)(ge);try{for(n.s();!(l=n.n()).done;)for(var c=l.value,s=0,d=0;d6&&(Q=" "+Z.substring(6).trim());break}var $="Heater"+Q,ee="AC"+Q,te="Net"+Q;if(P){var ae="Solar"+Q,oe=0;de([$,ee,ae,te]);var ie,ne=Object(f.a)(ge);try{for(ne.s();!(ie=ne.n()).done;){var ce=ie.value;X+=ce[$],B+=ce[ee],oe+=ce[ae],q+=ce[te]}}catch(qe){ne.e(qe)}finally{ne.f()}var se={};se.Month=it[w.getMonth()],se[$]=30*X,se[ee]=30*B,se[ae]=30*oe,se[te]=30*q,Ae.current[e]=se}else{de([$,ee,te]);var ue,fe=Object(f.a)(ge);try{for(fe.s();!(ue=fe.n()).done;){var he=ue.value;X+=he[$],B+=he[ee],q+=he[te]}}catch(qe){fe.e(qe)}finally{fe.f()}var ye={};ye.Month=it[w.getMonth()],ye[$]=30*X,ye[ee]=30*B,ye[te]=30*q,Ae.current[e]=ye}}pe(Object(h.a)(Ae.current));var Me=0;if(we){var We,Ie=Object(f.a)(we.keys());try{for(Ie.s();!(We=Ie.n()).done;){var Ce,Oe=We.value;Me+=null!==(Ce=we.get(Oe))&&void 0!==Ce?Ce:0}}catch(qe){Ie.e(qe)}finally{Ie.f()}}var Fe=0;if(xe){var ke,Ye=Object(f.a)(xe.keys());try{for(Ye.s();!(ke=Ye.n()).done;){var Le,Ee=ke.value;Fe+=null!==(Le=xe.get(Ee))&&void 0!==Le?Le:0}}catch(qe){Ye.e(qe)}finally{Ye.f()}}var Ue=0;if(ve&&P){var Ne,Ve=Object(f.a)(ve.keys());try{for(Ve.s();!(Ne=Ve.n()).done;){var Je,Ge=Ne.value;Ue+=null!==(Je=ve.get(Ge))&&void 0!==Je?Je:0}}catch(qe){Ve.e(qe)}finally{Ve.f()}}Te.current[e]=Me*J*30,Pe.current[e]=Fe*J*30,Se.current[e]=Ue*J*30,je.current[e]=Te.current[e]+Pe.current[e]-Se.current[e];var Xe=Te.current.slice(0,e+1).reduce((function(e,t){return e+t}),0);K(Xe);var Be=Pe.current.slice(0,e+1).reduce((function(e,t){return e+t}),0);_(Be);var Ke=Se.current.slice(0,e+1).reduce((function(e,t){return e+t}),0);le(Ke),re(je.current.slice(0,e+1).reduce((function(e,t){return e+t}),0)),S(Xe),j(Be),H(Ke),Tf.getState().showSolarRadiationHeatmap||Pf.getState().clearDataStore()}),[v]),Object(r.useEffect)((function(){k({x:Math.max(null===x||void 0===x?void 0:x.x,W-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-I)})}),[x,W,I]),Object(r.useEffect)((function(){var e=function(){k({x:Math.max(null===x||void 0===x?void 0:x.x,W-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-I)})};return window.addEventListener("resize",e),R.current&&(M.current||(M.current=new ResizeObserver((function(){g((function(e){R.current&&(e.viewState.yearlyBuildingEnergyPanelRect||(e.viewState.yearlyBuildingEnergyPanelRect=new Ot(0,0,600,500)),e.viewState.yearlyBuildingEnergyPanelRect.width=R.current.offsetWidth,e.viewState.yearlyBuildingEnergyPanelRect.height=R.current.offsetHeight)}))}))),M.current.observe(R.current)),function(){var t;window.removeEventListener("resize",e),null===(t=M.current)||void 0===t||t.disconnect()}}),[x,W,I]);var We=function(){g((function(e){e.viewState.showYearlyBuildingEnergyPanel=!1,p&&(e.actionInfo={name:"Close Yearly Building Energy Graph",timestamp:(new Date).getTime()})}))},Ie=me.t("word.Month",E),Ce=me.t("word.Energy",E),Oe=!he||!he[0]||0===Object.keys(he[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:Y,handle:".handle",bounds:"parent",axis:"both",position:F,onDrag:function(e,t){k({x:Math.max(t.x,W-window.innerWidth),y:Math.min(t.y,window.innerHeight-I)})},onStop:function(e,t){g((function(e){e.viewState.yearlyBuildingEnergyPanelRect||(e.viewState.yearlyBuildingEnergyPanelRect=new Ot(0,0,600,360)),e.viewState.yearlyBuildingEnergyPanelRect.x=Math.max(t.x,W-window.innerWidth),e.viewState.yearlyBuildingEnergyPanelRect.y=Math.min(t.y,window.innerHeight-I)}))},onMouseDown:function(){g((function(e){e.selectedFloatingWindow="yearlyBuildingEnergyPanel"}))},children:Object(gf.jsx)(sk,{ref:Y,style:{zIndex:"yearlyBuildingEnergyPanel"===z?Ke:9},children:Object(gf.jsxs)(dk,{ref:R,style:{opacity:y,width:(x?x.width:600)+"px",height:(x?x.height:400)+"px"},children:[Object(gf.jsxs)(uk,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("buildingEnergyPanel.YearlyBuildingEnergy",E)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",E)+" "+a+" | "+w.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){We()},onMouseDown:function(){We()},children:me.t("word.Close",E)})]}),Object(gf.jsx)(ak,{type:L.YearlyBuildingEnergy,dataSource:he,hasSolarPanels:P,labels:se,height:100,dataKeyAxisX:"Month",labelX:Ie,labelY:Ce,unitY:me.t("word.kWh",E),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!T&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[0===He.current.length?Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.Heater",E)+": "+B.toFixed(0)}):Object(gf.jsx)(pD.a,{content:He.current.map((function(e,t){return Object(gf.jsx)("div",{children:e},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.Heater",E)+": "+B.toFixed(0)})}),0===ze.current.length?Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.AC",E)+": "+Z.toFixed(0)}):Object(gf.jsx)(pD.a,{content:ze.current.map((function(e,t){return Object(gf.jsx)("div",{children:e},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.AC",E)+": "+Z.toFixed(0)})}),0!==te&&Object(gf.jsx)(gf.Fragment,{children:0===Re.current.length?Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.SolarPanel",E)+": "+te.toFixed(0)}):Object(gf.jsx)(pD.a,{content:Re.current.map((function(e,t){return Object(gf.jsx)("div",{children:e},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.SolarPanel",E)+": "+te.toFixed(0)})})}),0===De.current.length?Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.Net",E)+": "+ie.toFixed(0)}):Object(gf.jsx)(pD.a,{content:De.current.map((function(e,t){return Object(gf.jsx)("div",{children:e},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.Net",E)+": "+ie.toFixed(0)})}),Object(gf.jsx)(xv.a,{type:"default",icon:Oe?Object(gf.jsx)(FC.a,{}):Object(gf.jsx)(kC.a,{}),title:me.t(Oe?"word.Run":"word.Update",E),onClick:function(){var e=Ew.getState().elements,t=Ew.getState().countElementsByType,l=Ew.getState().getChildrenOfType,a=TT(e,t,l);if(a.status!==tv.NO_BUILDING)if(a.status!==tv.AT_LEAST_ONE_BAD_NO_GOOD)a.status===tv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",E)),Kh(me.t("message.SimulationStarted",E)),setTimeout((function(){m(),Tf.setState((function(e){e.runYearlyThermalSimulation=!0,e.pauseYearlyThermalSimulation=!1,e.simulationInProgress=!0})),g((function(e){p&&(e.actionInfo={name:"Run Yearly Building Energy Analysis",timestamp:(new Date).getTime()})}))}),100);else{var o="";switch(a.buildingCompletion){case D.WALL_DISJOINED:o=me.t("message.WallsAreNotConnected",E);break;case D.WALL_EMPTY:o=me.t("message.BuildingContainsEmptyWall",E);break;case D.ROOF_MISSING:o=me.t("message.BuildingRoofMissing",E);break;default:o=me.t("message.UnknownErrors",E)}Qh(me.t("message.SimulationWillNotStartDueToErrors",E)+": "+o)}else Kh(me.t("analysisManager.NoBuildingForAnalysis",E))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(YC.a,{}),title:me.t("word.SaveAsImage",E),onClick:function(){_h("line-graph-"+Ie+"-"+Ce,"yearly-building-energy",{}).then((function(){Kh(me.t("message.ScreenshotSaved",E)),p&&g((function(e){e.actionInfo={name:"Take Screenshot of Yearly Building Energy Graph",timestamp:(new Date).getTime()}}))}))}}),Ae.current&&Ae.current.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(LC.a,{}),title:me.t("word.SaveAsCsv",E),onClick:function(){$h(Ae.current,"yearly-building-energy.csv"),Kh(me.t("message.CsvFileSaved",E)),p&&g((function(e){e.actionInfo={name:"Export Yearly Building Energy Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},hk=n.a.memo(fk),pk=function(e){var t=e.setDialogVisible,l=Ew(si),a=Ew(Vi),o=Ew(Sr),i=Ew(pi),n=Ew(yi),c=Object(r.useState)(!1),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)({left:0,top:0,bottom:0,right:0}),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useRef)(null),A=Object(r.useRef)(null),T=Object(r.useRef)(i),P=Object(r.useRef)(n),S={lng:a};Object(r.useEffect)((function(){var e;null===(e=A.current)||void 0===e||e.focus()}),[]);var j=function(e){l((function(t){t.minimumNavigationMoveSpeed=e})),Tf.setState((function(t){t.navigationMoveSpeed=e}))},H=function(e){l((function(t){t.minimumNavigationTurnSpeed=e})),Tf.setState((function(t){t.navigationTurnSpeed=e}))};return Object(gf.jsxs)(Zv.a,{width:500,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return g(!0)},onMouseOut:function(){return g(!1)},children:me.t("navigationPanel.NavigationParameters",S)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){t(!1)},children:me.t("word.Cancel",S)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:A,onClick:function(){!function(){var e=i,t=T.current;if(e!==t){var l={name:"Minimum Navigation Move Speed",timestamp:Date.now(),oldValue:e,newValue:t,undo:function(){j(l.oldValue)},redo:function(){j(l.newValue)}};o(l),j(t)}var a=n,r=P.current;if(a!==r){var c={name:"Minimum Navigation Turn Speed",timestamp:Date.now(),oldValue:a,newValue:r,undo:function(){H(c.oldValue)},redo:function(){H(c.newValue)}};o(c),H(r)}}(),t(!1)},children:me.t("word.OK",S)},"OK")],onCancel:function(){t(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!y,bounds:x,onStart:function(e,t){return function(e,t){if(b.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=b.current.getBoundingClientRect();v({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:b,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:me.t("navigationPanel.MinimumMoveSpeed",S)+" ([1, 10]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)($v.a,{min:1,max:10,style:{width:"100%"},precision:0,value:T.current,step:1,onChange:function(e){T.current=e,f(!d)},onBlur:function(e){var t=e.target.value,l=parseFloat(t);T.current=Number.isNaN(l)?3:l,f(!d)},onPressEnter:function(e){var t=e.target.value,l=parseFloat(t);T.current=Number.isNaN(l)?3:l,f(!d)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:me.t("navigationPanel.MinimumTurnSpeed",S)+" ([1, 5]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)($v.a,{min:1,max:5,style:{width:"100%"},precision:0,value:P.current,step:1,onChange:function(e){P.current=e,f(!d)},onBlur:function(e){var t=e.target.value,l=parseFloat(t);P.current=Number.isNaN(l)?3:l,f(!d)},onPressEnter:function(e){var t=e.target.value,l=parseFloat(t);P.current=Number.isNaN(l)?3:l,f(!d)}})})]})]})},yk=n.a.memo(pk),gk=function(){var e,t=Ew(o.showSiteInfoPanel),l=Ew(o.showDesignInfoPanel),a=Ew(o.showInstructionPanel),n=Ew(o.showMapPanel),c=Ew(o.showHeliodonPanel),s=Ew(o.showStickyNotePanel),d=Ew(o.showWeatherPanel),f=Ew(o.showDiurnalTemperaturePanel),h=Tf(fi),p=Tf(hi),y=Tf(Ns),g=Ew(o.showDailyLightSensorPanel),m=Ew(o.showYearlyLightSensorPanel),w=Ew(o.showDailyPvYieldPanel),x=Ew(o.showYearlyPvYieldPanel),v=Ew(o.showVisibilityResultsPanel),b=Ew(o.showDailyParabolicTroughYieldPanel),A=Ew(o.showYearlyParabolicTroughYieldPanel),T=Ew(o.showDailyParabolicDishYieldPanel),P=Ew(o.showYearlyParabolicDishYieldPanel),S=Ew(o.showDailyFresnelReflectorYieldPanel),j=Ew(o.showYearlyFresnelReflectorYieldPanel),H=Ew(o.showDailyHeliostatYieldPanel),z=Ew(o.showYearlyHeliostatYieldPanel),R=Ew(o.showDailyUpdraftTowerYieldPanel),D=Ew(o.showYearlyUpdraftTowerYieldPanel),M=Ew(o.showDailyBuildingEnergyPanel),W=Ew(o.showYearlyBuildingEnergyPanel),I=Ew(o.showEvolutionPanel),C=Ew(js),O=Ew(i.latitude),F=Ew(i.longitude),k=Ew(Ls),Y=null!==(e=Ew(o.navigationView))&&void 0!==e&&e,E=Object(r.useState)("Boston MA, USA"),U=Object(u.a)(E,2),N=U[0],V=U[1];return Object(r.useEffect)((function(){var e;V(null!==(e=k(O,F))&&void 0!==e?e:"Boston MA, USA")}),[O,F]),Object(gf.jsxs)(gf.Fragment,{children:[n&&Object(gf.jsx)(hW,{}),c&&Object(gf.jsx)(AW,{}),s&&Object(gf.jsx)(lO,{}),t&&Object(gf.jsx)(HO,{city:N}),l&&Object(gf.jsx)(TO,{}),(a||Y)&&!C&&Object(gf.jsx)(nO,{}),d&&Object(gf.jsx)(OC,{city:N,graphs:[L.MonthlyTemperatures,L.SunshineHours]}),f&&Object(gf.jsx)(YF,{city:N}),h&&Object(gf.jsx)(_F,{setDialogVisible:function(e){Tf.setState((function(t){t.showEconomicsPanel=e}))}}),p&&Object(gf.jsx)(yk,{setDialogVisible:function(e){Tf.setState((function(t){t.showNavigationPanel=e}))}}),m&&Object(gf.jsx)(GC,{city:N}),g&&Object(gf.jsx)(QC,{city:N}),x&&Object(gf.jsx)(pO,{city:N}),w&&Object(gf.jsx)(xO,{city:N}),v&&Object(gf.jsx)(kO,{}),A&&Object(gf.jsx)(VO,{city:N}),b&&Object(gf.jsx)(KO,{city:N}),P&&Object(gf.jsx)(iF,{city:N}),T&&Object(gf.jsx)($O,{city:N}),S&&Object(gf.jsx)(dF,{city:N}),j&&Object(gf.jsx)(gF,{city:N}),H&&Object(gf.jsx)(bF,{city:N}),z&&Object(gf.jsx)(HF,{city:N}),R&&Object(gf.jsx)(IF,{city:N}),D&&Object(gf.jsx)(JF,{city:N}),M&&Object(gf.jsx)(ck,{city:N}),W&&Object(gf.jsx)(hk,{city:N}),y&&Object(gf.jsx)(MO,{}),I&&Object(gf.jsx)(QF,{})]})},mk=n.a.memo(gk),wk=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"computeSolarPanelOutput",value:function(e,t,l,a,o,i,r,n,c){var s,d=o.parentType===V.Roof,u=o.parentType===V.Wall;d&&(i=r);var f=u?Tw.absoluteCoordinates(o.cx,o.cy,o.cz,i,r,o.lz):Tw.absoluteCoordinates(o.cx,o.cy,o.cz,i),h=i.rotation[2],p=o.tiltAngle,y=h+o.relativeAzimuth,g=!0;if(d&&(f.z=o.cz+o.lz+.02+i.cz+i.lz/2,Tw.isZero(o.rotation[0])?f.z+=o.poleHeight:(p=o.rotation[0],y=h,g=!1)),u&&!Tw.isZero(o.tiltAngle)){var m=i,w=(r?r.rotation[2]+m.relativeAngle:m.relativeAngle)-vt,x=o.ly*Math.abs(Math.sin(o.tiltAngle))/2;f.x+=x*Math.cos(w),f.y+=x*Math.sin(w)}var v,b,A,T,P,S=(new Me.Vector3).fromArray(o.normal),j=e.getMonth(),H=Tw.dayOfYear(e),z=null!==(s=t.solarRadiationHeatmapGridCellSize)&&void 0!==s?s:.5;t.discretization===ae.EXACT?(v=o.lx,b=o.ly,o.orientation===$.portrait?(A=Math.max(1,Math.round(o.lx/a.width)),T=Math.max(1,Math.round(o.ly/a.length)),A*=a.n,T*=a.m):(A=Math.max(1,Math.round(o.lx/a.length)),T=Math.max(1,Math.round(o.ly/a.width)),A*=a.m,T*=a.n),P=o.lx/A):(v=o.lx,b=o.ly,(A=Math.max(2,Math.round(o.lx/z)))%2!==0&&(A+=1),(T=Math.max(2,Math.round(o.ly/z)))%2!==0&&(T+=1),P=z);var R=v/A,D=b/T,M=f.x-(v-P)/2,W=f.y-(b-P)/2,I=d||u?f.z:i.lz+o.poleHeight+o.lz,C=new Me.Vector2(f.x,f.y),O=new Me.Vector3,F=Array.from(Array(A),(function(){return new Array(T)})),k=new Me.Euler(d&&!g?0:p,0,y,"ZYX");if(o.trackerType!==te.NO_TRACKER){var Y=h?l.clone().applyAxisAngle(Rt,-h):l.clone();switch(o.trackerType){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var L=(new Me.Quaternion).setFromUnitVectors(Rt,Y);(k=(new Me.Euler).setFromQuaternion(L)).z+=y;break;case te.HORIZONTAL_SINGLE_AXIS_TRACKER:var E=(new Me.Quaternion).setFromUnitVectors(Rt,new Me.Vector3(Y.x,0,Y.z).normalize());(k=(new Me.Euler).setFromQuaternion(E)).z+=y;break;case te.VERTICAL_SINGLE_AXIS_TRACKER:var U=new Me.Vector3(Y.x,-Y.y,0).normalize(),N=Math.acos(Ht.dot(U))*Math.sign(U.x);k=new Me.Euler(o.tiltAngle,0,N+h,"ZYX");break;case te.TILTED_SINGLE_AXIS_TRACKER:}}S.applyEuler(k),d&&!g&&(k.x=o.rotation[0],k.z=o.rotation[2]+h),u&&(k.x=vt+o.tiltAngle,k.z=i.relativeAngle+h);for(var J=zy(l,H,n,ny.SPHERE_MODEL),G=Ry(t.ground,j,S,J),X=S.dot(l),B=new Me.Vector2,K=new Me.Vector3,q=0;q0&&(B.set(M+q*R,W+Q*D),K.set(B.x-C.x,B.y-C.y,0),K.applyEuler(k),O.set(f.x+K.x,f.y+K.y,I+K.z),c(o.id,O,l)<0&&(F[q][Q]+=X*J));var Z=0;switch(a.shadeTolerance){case le.NONE:for(var _=Number.MAX_VALUE,ee=0;ee0){var N,J=Object(f.a)(r);try{for(J.s();!(N=J.n()).done;){var G=N.value;if(G.type===V.Window){var X=G.cx*o.lx,B=G.cz*o.lz,K=G.lx*o.lx/2,q=G.lz*o.lz/2,Q=G;if(Q.windowType===Yt.Arched){var Z=P.clone().add(new Me.Vector3(Q.cx*o.lx,0,Q.cz*o.lz));e.pointWithinArch(z,Q.lx,Q.lz,Q.archHeight,Z)&&(p=!1)}else if(U.x>=X-K&&U.x=B-q&&U.y0){var _,$=Object(f.a)(n);try{for($.s();!(_=$.n()).done;){var ee=_.value;if(ee.type===V.Door){var te=ee.cx*o.lx,le=ee.cz*o.lz,ae=ee.lx*o.lx/2,oe=ee.lz*o.lz/2,ie=ee;if(ie.doorType===hy.Arched){var re=P.clone().add(new Me.Vector3(ie.cx*o.lx,0,ie.cz*o.lz));e.pointWithinArch(z,ie.lx,ie.lz,ie.archHeight,re)&&(p=!1)}else if(U.x>=te-ae&&U.x=le-oe&&U.y0){var ne,ce=Object(f.a)(c);try{for(ce.s();!(ne=ce.n()).done;){var se=ne.value,de=se.cx*o.lx,ue=se.cz*o.lz,fe=se.lx/2,he=se.ly/2;if(U.x>=de-fe&&U.x=ue-he&&U.ywy||ye<0)&&pe&&(O[k][Y]+=I),C>0&&ye<0&&(F[k][Y]+=C*W,pe&&(O[k][Y]+=C*W))}}}return{intensity:O,unitArea:b*A,heatmap:F}}},{key:"computeDoorSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c){var s,d=Tw.dayOfYear(t),u=null!==(s=l.solarRadiationHeatmapGridCellSize)&&void 0!==s?s:.5,f=o.lx*i.lx,h=o.lz*i.lz,p=Math.max(2,Math.round(f/u)),y=Math.max(2,Math.round(h/u)),g=f/p,m=h/y,w=r.rotation[2]+i.relativeAngle,x=Tw.wallAbsolutePosition(new Me.Vector3(i.cx,i.cy,i.cz),r).setZ(i.lz/2+r.lz).clone().add(new Me.Vector3(o.cx*i.lx,0,o.cz*i.lz)),v=new Me.Vector3(Math.cos(w-vt),Math.sin(w-vt),0),b=g*Math.cos(w),A=g*Math.sin(w),T=new Me.Vector3,P=zy(a,d,n,ny.SPHERE_MODEL),S=Ry(l.ground,t.getMonth(),v,P),j=v.dot(a),H=Array(p).fill(0).map((function(){return Array(y).fill(0)}));if(o.doorType===hy.Arched)for(var z=0;z0&&c(o.id,T,a)<0&&(H[z][R]+=j*P))}else for(var W=0;W0){var C=W-p/2+.5,O=I-y/2+.5;T.set(x.x+C*b,x.y+C*A,x.z+O*m),c(o.id,T,a)<0&&(H[W][I]+=j*P)}return{intensity:H,unitArea:g*m}}},{key:"pointWithinArch",value:function(e,t,l,a,o){if(a>0){var i=.5*t,r=Math.min(a,l,i),n=.5*(r+i*i/r),c=e.x-o.x,s=e.y-o.y,d=c*c+s*s,u=e.z-o.z;return d-l/2||d+(u=e.z-(l-n))*u0&&c(o.id,T,a)<0&&(H[z][R]+=j*P))}else for(var W=0;W0){var C=W-p/2+.5,O=I-y/2+.5;T.set(x.x+C*b,x.y+C*A,x.z+O*m),c(o.id,T,a)<0&&(H[W][I]+=j*P)}return{intensity:H,unitArea:g*m}}},{key:"computeRoofWindowSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c){var s,d=Tw.dayOfYear(t),u=null!==(s=l.solarRadiationHeatmapGridCellSize)&&void 0!==s?s:.5,f=o.lx,h=o.lz,p=Math.max(2,Math.round(f/u)),y=Math.max(2,Math.round(h/u)),g=f/p,m=h/y,w=new Me.Vector3(o.cx,o.cy,o.cz).applyEuler(new Me.Euler(0,0,r.rotation[2]));w.x+=r.cx,w.y+=r.cy,w.z+=r.lz;var x=new Me.Euler(o.rotation[0],o.rotation[1],o.rotation[2]+r.rotation[2],"ZXY"),v=new Me.Vector3(0,0,1).applyEuler(x),b=new Me.Vector3,A=zy(a,d,n,ny.SPHERE_MODEL),T=Ry(l.ground,t.getMonth(),v,A),P=v.dot(a),S=Array(p).fill(0).map((function(){return Array(y).fill(0)}));if(o.windowType===Yt.Arched)for(var j=0;j0&&c(o.id,b,a)<0&&(S[j][H]+=P*A))}else for(var M=0;M0){var I=M-p/2+.5,C=W-y/2+.5,O=new Me.Vector3(I,C,0);O.applyEuler(x),b.set(w.x+O.x,w.y+O.y,w.z+O.z),c(o.id,b,a)<0&&(S[M][W]+=P*A)}return{intensity:S,unitArea:g*m}}},{key:"computePyramidRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,h,p);var g,m=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,w=Tw.dayOfYear(t),x=new Me.Euler(0,0,c.rotation[2],"ZYX"),v=zy(a,w,h,ny.SPHERE_MODEL),b=[],A=[],T=Object(f.a)(n.entries());try{var P=function(){var i=Object(u.a)(g.value,2),n=i[0],f=i[1],h=o.id+"-"+n,y=f[0].clone().applyEuler(x),w=f[1].clone().applyEuler(x),T=f[2].clone().applyEuler(x),P=(new Me.Vector3).subVectors(w,y),S=(new Me.Vector3).subVectors(T,y),j=(new Me.Vector3).subVectors(T,w),H=P.length(),z=(new Me.Vector3).crossVectors(S,j).length()/H,R=Math.max(2,Math.round(H/m)),D=Math.max(2,Math.round(z/m)),M=Array(R).fill(0).map((function(){return Array(D).fill(0)}));b.push(M),P.normalize();var W=R*S.dot(P)/H;S.normalize(),j.normalize();var I=(new Me.Vector3).crossVectors(S,j).normalize(),C=P.multiplyScalar(.5*H/R),O=(new Me.Vector3).crossVectors(I,P).normalize().multiplyScalar(.5*z/D),F=new Me.Vector3(c.cx+y.x,c.cy+y.y,c.lz+y.z+xy+(r?o.thickness:0));F.add(C).add(O),C.multiplyScalar(2),O.multiplyScalar(2),A.push(C.length()*O.length());var k=new Me.Vector3,Y=[],L=.01;Y.push({x:-.01,y:-.01}),Y.push({x:R+L,y:-.01}),Y.push({x:W,y:D+L});for(var E=Ry(l.ground,t.getMonth(),I,v),U=I.dot(a),N=0;Nwy||X<0)&&(M[N][J]+=E),U>0&&X<0&&(M[N][J]+=U*v)}}};for(T.s();!(g=T.n()).done;)P()}catch(S){T.e(S)}finally{T.f()}return{segmentIntensities:b,segmentUnitArea:A}}},{key:"computeHipRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,h,p);var g,m=Tw.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new Me.Euler(0,0,c.rotation[2],"ZYX"),v=zy(a,m,h,ny.SPHERE_MODEL),b=[],A=[],T=Object(f.a)(n.entries());try{var P=function(){var i=Object(u.a)(g.value,2),n=i[0],h=i[1],y=o.id+"-"+n,m=h[0].clone().applyEuler(x),T=h[1].clone().applyEuler(x),P=h[2].clone().applyEuler(x),S=(new Me.Vector3).subVectors(T,m),j=(new Me.Vector3).subVectors(P,m),H=(new Me.Vector3).subVectors(P,T),z=S.length(),R=(new Me.Vector3).crossVectors(j,H).length()/z,D=Math.max(2,Math.round(z/w)),M=Math.max(2,Math.round(R/w)),W=Array(D).fill(0).map((function(){return Array(M).fill(0)}));b.push(W),S.normalize();var I=D*j.dot(S)/z;j.normalize(),H.normalize();var C=(new Me.Vector3).crossVectors(j,H).normalize(),O=S.multiplyScalar(.5*z/D),F=(new Me.Vector3).crossVectors(C,S).normalize().multiplyScalar(.5*R/M),k=new Me.Vector3,Y=new Me.Vector3(c.cx+m.x,c.cy+m.y,c.lz+m.z+xy+(r?o.thickness:0));Y.add(O).add(F),O.multiplyScalar(2),F.multiplyScalar(2),A.push(O.length()*F.length());var L,E=Ry(l.ground,t.getMonth(),C,v),U=C.dot(a),N=[],V=Object(f.a)(h);try{for(V.s();!(L=V.n()).done;){var J=L.value;N.push({x:J.x,y:J.y})}}catch(ae){V.e(ae)}finally{V.f()}if(n%2===0)for(var G=0;Gwy||q<0)&&(W[G][B]+=E),U>0&&q<0&&(W[G][B]+=U*v)}}else{var Q=[],Z=.01;Q.push({x:-.01,y:-.01}),Q.push({x:D+Z,y:-.01}),Q.push({x:I,y:M+Z});for(var _=0;_wy||le<0)&&(W[_][ee]+=E),U>0&&le<0&&(W[_][ee]+=U*v)}}}};for(T.s();!(g=T.n()).done;)P()}catch(S){T.e(S)}finally{T.f()}return{segmentIntensities:b,segmentUnitArea:A}}},{key:"computeGambrelRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,h,p);var g,m=Tw.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new Me.Euler(0,0,c.rotation[2],"ZYX"),v=zy(a,m,h,ny.SPHERE_MODEL),b=[],A=[],T=Object(f.a)(n.entries());try{var P=function(){var i=Object(u.a)(g.value,2),n=i[0],f=i[1],h=o.id+"-"+n,y=f[0].clone().applyEuler(x),m=f[1].clone().applyEuler(x),T=f[2].clone().applyEuler(x),P=(new Me.Vector3).subVectors(m,y),S=(new Me.Vector3).subVectors(T,y),j=(new Me.Vector3).subVectors(T,m),H=P.length(),z=(new Me.Vector3).crossVectors(S,j).length()/H,R=Math.max(2,Math.round(H/w)),D=Math.max(2,Math.round(z/w)),M=Array(R).fill(0).map((function(){return Array(D).fill(0)}));b.push(M),P.normalize(),S.normalize(),j.normalize();var W=(new Me.Vector3).crossVectors(S,j).normalize(),I=P.multiplyScalar(.5*H/R),C=(new Me.Vector3).crossVectors(W,P).normalize().multiplyScalar(.5*z/D),O=new Me.Vector3(c.cx+y.x,c.cy+y.y,c.lz+y.z+xy+(r?o.thickness:0));O.add(I).add(C),I.multiplyScalar(2),C.multiplyScalar(2),A.push(I.length()*C.length());for(var F=new Me.Vector3,k=Ry(l.ground,t.getMonth(),W,v),Y=W.dot(a),L=0;Lwy||N<0)&&(M[L][U]+=k),Y>0&&N<0&&(M[L][U]+=Y*v)}};for(T.s();!(g=T.n()).done;)P()}catch(S){T.e(S)}finally{T.f()}return{segmentIntensities:b,segmentUnitArea:A}}},{key:"computeMansardRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,h,p);var g,m=Tw.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new Me.Euler(0,0,c.rotation[2],"ZYX"),v=zy(a,m,h,ny.SPHERE_MODEL),b=[],A=[],T=Object(f.a)(n.entries());try{for(T.s();!(g=T.n()).done;){var P=Object(u.a)(g.value,2),S=P[0],j=P[1],H=o.id+"-"+S;S===n.length-1?function(){var i,n=Number.MAX_VALUE,u=Number.MAX_VALUE,h=-Number.MAX_VALUE,y=-Number.MAX_VALUE,g=Object(f.a)(j);try{for(g.s();!(i=g.n()).done;){var m=i.value.clone().applyEuler(x);m.x>h&&(h=m.x),m.xy&&(y=m.y),m.ywy||k<0)&&(D[O][F]+=I),C>0&&k<0&&(D[O][F]+=C*v)}}}():function(){var i=j[0].clone().applyEuler(x),n=j[1].clone().applyEuler(x),u=j[2].clone().applyEuler(x),f=(new Me.Vector3).subVectors(n,i),h=(new Me.Vector3).subVectors(u,i),y=(new Me.Vector3).subVectors(u,n),g=f.length(),m=(new Me.Vector3).crossVectors(h,y).length()/g,T=Math.max(2,Math.round(g/w)),P=Math.max(2,Math.round(m/w)),S=Array(T).fill(0).map((function(){return Array(P).fill(0)}));b.push(S),f.normalize(),h.normalize(),y.normalize();var z=(new Me.Vector3).crossVectors(h,y).normalize(),R=f.multiplyScalar(.5*g/T),D=(new Me.Vector3).crossVectors(z,f).normalize().multiplyScalar(.5*m/P),M=new Me.Vector3(c.cx+i.x,c.cy+i.y,c.lz+i.z+xy+(r?o.thickness:0));M.add(R).add(D),R.multiplyScalar(2),D.multiplyScalar(2),A.push(R.length()*D.length());for(var W=new Me.Vector3,I=Ry(l.ground,t.getMonth(),z,v),C=z.dot(a),O=0;Owy||Y<0)&&(S[O][k]+=I),C>0&&Y<0&&(S[O][k]+=C*v)}}()}}catch(z){T.e(z)}finally{T.f()}return{segmentIntensities:b,segmentUnitArea:A}}},{key:"computeFlatRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,u){var h,p,y=Tw.dayOfYear(t),g=null!==(h=l.solarRadiationHeatmapGridCellSize)&&void 0!==h?h:.5,m=new Me.Euler(0,0,n.rotation[2],"ZYX"),w=zy(a,y,d,ny.SPHERE_MODEL),x=[],v=[],b=Number.MAX_VALUE,A=Number.MAX_VALUE,T=-Number.MAX_VALUE,P=-Number.MAX_VALUE,S=Object(f.a)(r);try{for(S.s();!(p=S.n()).done;){var j,H=p.value,z=Object(f.a)(H);try{for(z.s();!(j=z.n()).done;){var R=j.value.clone().applyEuler(m);R.x>T&&(T=R.x),R.xP&&(P=R.y),R.ywy||N<0)&&(C[E][U]+=Y),L>0&&N<0&&(C[E][U]+=L*w)}}return{segmentIntensities:x,segmentUnitArea:v}}},{key:"computeGableRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h){var p,y,g=Tw.dayOfYear(t),m=null!==(p=l.solarRadiationHeatmapGridCellSize)&&void 0!==p?p:.5,w=new Me.Euler(0,0,n.rotation[2],"ZYX"),x=zy(a,g,d,ny.SPHERE_MODEL),v=[],b=[],A=Object(f.a)(r.entries());try{var T=function(){var r=Object(u.a)(y.value,2),d=r[0],f=r[1],p=o.id+"-"+d,g=f[0].clone().applyEuler(w),A=f[1].clone().applyEuler(w),T=f[2].clone().applyEuler(w),P=(new Me.Vector3).subVectors(A,g),S=(new Me.Vector3).subVectors(T,g),j=(new Me.Vector3).subVectors(T,A),H=P.length(),z=(new Me.Vector3).crossVectors(S,j).length()/H,R=Math.max(2,Math.round(H/m)),D=Math.max(2,Math.round(z/m)),M=Array(R).fill(0).map((function(){return Array(D).fill(0)}));v.push(M),P.normalize(),S.normalize(),j.normalize();var W=(new Me.Vector3).crossVectors(S,j).normalize(),I=P.multiplyScalar(.5*H/R),C=(new Me.Vector3).crossVectors(W,P).normalize().multiplyScalar(.5*z/D),O=new Me.Vector3(n.cx+g.x,n.cy+g.y,n.lz+g.z+xy+(i?o.thickness:0));O.add(I).add(C),I.multiplyScalar(2),C.multiplyScalar(2),b.push(I.length()*C.length());for(var F=new Me.Vector3,k=Ry(l.ground,t.getMonth(),W,x),Y=W.dot(a),L=0;Lwy||N<0)&&(M[L][U]+=k),Y>0&&N<0&&(M[L][U]+=Y*x)}};for(A.s();!(y=A.n()).done;)T()}catch(P){A.e(P)}finally{A.f()}return{segmentIntensities:v,segmentUnitArea:b}}},{key:"isPointRoof",value:function(e,t,l,a){if(t&&t.length>0){var o,i=Object(f.a)(t);try{for(i.s();!(o=i.n()).done;){var r=o.value,n=Vm.getAbsoluteWindowVerticesOnRoof(r,a),c=Tw.getPoints(n);if(Tw.isPointInside(e.x,e.y,c))return!1}}catch(y){i.e(y)}finally{i.f()}}if(l&&l.length>0){var s,d=Object(f.a)(l);try{for(d.s();!(s=d.n()).done;){var u=s.value,h=Vm.getAbsoluteSolarPanelVerticesOnRoof(u,a),p=Tw.getPoints(h);if(Tw.isPointInside(e.x,e.y,p))return!1}}catch(y){d.e(y)}finally{d.f()}}return!0}}]),e}(),xk=function(e){var t,l,a,o,i=e.city,n=Ew(si),c=Tf(yf),s=Ew(Cs),d=Ew(_r),p=Ew($r),y=Ew(tn),g=Ew(Ei),m=Pf(xi),w=Pf(Ri),x=Pf(zi),v=Pf(Ti),b=Pf(Si),A=Pf(Hi),T=Ew(Vi),P=Ew(Gi),S=Tf(Ir),j=Tf(Cr),H=Tf(Or),z=Tf(Fr),R=Ew.getState().world,D=Ew.getState().elements,M=!!R.noAnimationForThermalSimulation,W=null!==(t=R.highestTemperatureTimeInMinutes)&&void 0!==t?t:900,I=Object(r.useRef)(0),C=Object(r.useRef)(!1),O=Object(r.useRef)(new Date(R.date)),F=Object(r.useRef)(0),k=Object(r.useRef)(!1),Y=Object(r.useRef)(new Date(R.date)),L=Object(r.useRef)(0),E=Object(r.useRef)({high:20,low:0}),N=Object(r.useRef)(20),J=Object(r.useRef)(20),G=Object(r.useRef)(new Map),X=Object(r.useRef)(new Map),B=Object(r.useRef)(new Map),K=Object(r.useRef)([]),q=Object(r.useRef)([]),Q=Object(r.useRef)(),Z=Object(r.useRef)(),_=Object(r.useRef)(0),$=Object(r.useRef)(new Map),ee=Object(r.useMemo)((function(){return{lng:T}}),[T]),te=Object(r.useMemo)((function(){return s(null!==i&&void 0!==i?i:"Boston MA, USA")}),[i]),le=new Date(R.date),ae=i?null===te||void 0===te?void 0:te.elevation:0,oe=null!==(l=R.monthlyIrradianceLosses)&&void 0!==l?l:new Array(12).fill(.05),ie=null!==(a=R.timesPerHour)&&void 0!==a?a:4,re=60/ie,ne=null!==(o=R.daysPerYear)&&void 0!==o?o:6,ce=12/ne,se=Object(Se.f)().scene,de=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),ue=function(e,t,l){if(K.current.length>1){q.current.length=0,de.set(t,l);var a=K.current.filter((function(t){return t.uuid!==e}));if(de.intersectObjects(a,!1,q.current),q.current.length>0)return q.current[0].distance}return-1},fe=function(){var e=se.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;K.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,K.current)}}catch(i){a.e(i)}finally{a.f()}}},he=function(e,t){var l=G.current.get(e);l||(l=new Array(24).fill(0),G.current.set(e,l)),l[le.getHours()]+=t},pe=function(){var e,t=Object(f.a)(D);try{for(t.s();!(e=t.n()).done;){var l,a,o,i=e.value;if(Tw.onBuildingEnvelope(i))null===(l=G.current.get(i.id))||void 0===l||l.fill(0);if(i.type===V.Roof){var r,n=Object(f.a)(G.current.keys());try{for(n.s();!(r=n.n()).done;){var c,s=r.value;if(s!==i.id&&s.startsWith(i.id))null===(c=G.current.get(s))||void 0===c||c.fill(0)}}catch(d){n.e(d)}finally{n.f()}}if(i.type===V.Foundation)null===(a=X.current.get(i.id))||void 0===a||a.fill(0),null===(o=B.current.get(i.id))||void 0===o||o.fill(0)}}catch(d){t.e(d)}finally{t.f()}},ye=function(){$.current.clear()};Object(r.useEffect)((function(){if(S){if(!M||Tw.hasMovingParts(D))return fe(),we(),I.current=requestAnimationFrame(ve),function(){cancelAnimationFrame(I.current),C.current||(Kh(me.t("message.SimulationAborted",ee)),n((function(e){e.world.date=O.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),k.current=!1};ge()}}),[S]),Object(r.useEffect)((function(){k.current=j,j?(Y.current=new Date(le.getTime()),cancelAnimationFrame(I.current),c("simulationPaused",!0),Kh(me.t("message.SimulationPaused",ee))):(c("simulationPaused",!1),le.setHours(le.getHours(),le.getMinutes()+re),ve())}),[j]);var ge=function(){ze()},we=function(){k.current?(le.setTime(Y.current.getTime()),k.current=!1):(O.current=new Date(R.date),L.current=Tw.dayOfYear(le),le.setHours(0,re/2)),C.current=!1,pe(),ye()},xe=function(){var e,t=Object(f.a)(D);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(Tw.onBuildingEnvelope(l)||l.type===V.SolarPanel){var a=G.current.get(l.id);a&&v(l.id,Object(h.a)(a));var o=$.current.get(l.id);o&&m(l.id,o.map((function(e){return Object(h.a)(e)})))}if(l.type===V.Roof){var i,r=Object(f.a)(G.current.keys());try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c!==l.id&&c.startsWith(l.id)){var s=G.current.get(c);s&&v(c,Object(h.a)(s));var d=$.current.get(c);d&&m(c,d.map((function(e){return Object(h.a)(e)})))}}}catch(p){r.e(p)}finally{r.f()}}if(l.type===V.Foundation){var u=X.current.get(l.id);u&&b(l.id,Object(h.a)(u)),(u=B.current.get(l.id))&&A(l.id,Object(h.a)(u))}}}catch(p){t.e(p)}finally{t.f()}Tf.setState((function(e){e.flagOfDailySimulation=!e.flagOfDailySimulation,e.runYearlyThermalSimulation||(e.showSolarRadiationHeatmap=!0,e.showHeatFluxes=!0)})),P&&!H&&setTimeout((function(){n((function(e){var t=Pf.getState().totalBuildingHeater,l=Pf.getState().totalBuildingAc,a=Pf.getState().totalBuildingSolarPanel;e.actionInfo={name:"Daily Building Energy Analysis Completed",result:{Heater:t.toFixed(2),AC:l.toFixed(2),SolarPanel:a.toFixed(2),Net:(t+l-a).toFixed(2)},timestamp:(new Date).getTime()}}))}),10)},ve=function e(){if(S&&!k.current){if(le.getMinutes()+60*le.getHours()+(Tw.dayOfYear(le)-L.current)*py+re>py)return ze(),cancelAnimationFrame(I.current),n((function(e){e.world.date=O.current.toLocaleString("en-US"),e.viewState.showDailyBuildingEnergyPanel=!0,e.selectedFloatingWindow="dailyBuildingEnergyPanel"})),Tf.setState((function(e){e.runDailyThermalSimulation=!1,e.simulationPaused=!1,e.simulationInProgress=!1})),Kh(me.t("message.SimulationCompleted",ee)),C.current=!0,void xe();n((function(e){e.world.date=le.toLocaleString("en-US")})),ze(),I.current=requestAnimationFrame(e),le.setHours(le.getHours(),le.getMinutes()+re)}},be=Object(r.useState)(le.getMonth()),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1];Object(r.useEffect)((function(){setTimeout((function(){fe()}),200)}),[Te]),Object(r.useEffect)((function(){if(H){if(!M||Tw.hasMovingParts(D))return je(),Pe(le.getMonth()),fe(),I.current=requestAnimationFrame(He),function(){cancelAnimationFrame(I.current),C.current||(Kh(me.t("message.SimulationAborted",ee)),n((function(e){e.world.date=O.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),k.current=!1};setTimeout((function(){}),50)}}),[H]),Object(r.useEffect)((function(){k.current=z,z?(Y.current=new Date(le.getTime()),cancelAnimationFrame(I.current),c("simulationPaused",!0),Kh(me.t("message.SimulationPaused",ee))):(c("simulationPaused",!1),le.setHours(le.getHours(),le.getMinutes()+re),He())}),[z]);var je=function(){k.current?(le.setTime(Y.current.getTime()),k.current=!1):(O.current=new Date(R.date),F.current=0,le.setMonth(0,22),L.current=Tw.dayOfYear(le),le.setHours(0,re/2),n((function(e){e.viewState.showYearlyBuildingEnergyPanel=!0,e.selectedFloatingWindow="yearlyBuildingEnergyPanel",e.world.date=le.toLocaleString("en-US")}))),pe(),ye(),C.current=!1},He=function e(){if(H&&!k.current)if(le.getMinutes()+60*le.getHours()+(Tw.dayOfYear(le)-L.current)*pyAt?te.sunshineHours[le.getMonth()]/(30*e*ie):0,Q.current=Hy(1,Py(le),Ay(le),Tw.toRadians(R.latitude)).normalize();var t,l=Object(f.a)(D);try{for(l.s();!(t=l.n()).done;){var a=t.value;switch(a.type){case V.Door:Ie(a);break;case V.Window:De(a),We(a);break;case V.Wall:Ce(a);break;case V.Roof:var o=a;ke(o),Oe(o);break;case V.SolarPanel:Re(a)}}}catch(i){l.e(i)}finally{l.f()}},Re=function(e){var t=d(e);if(t){var l=p(e);if(l){var a=g(e.pvModelName);if(Q.current&&Q.current.z>0){var o=wk.computeSolarPanelOutput(le,R,Q.current,a,e,l,t,ae,ue),i=function(e,t){var l=t.efficiency;return"Monocrystalline"===t.cellType&&(l*=.95),l*(1+t.pmaxTC*(e-25))}(N.current,a)*function(){if(!Z.current)throw new Error("sun minutes not set");var e=Z.current.daylight()/60;return e>At?te.sunshineHours[le.getMonth()]/(30*e*ie):0}()*function(e){var t;if(!g(e.pvModelName))throw new Error("PV model not found");return e.lx*e.ly*(null!==(t=e.inverterEfficiency)&&void 0!==t?t:.95)*(1-oe[le.getMonth()])}(e);if(function(e,t){var l=B.current.get(e);l||(l=new Array(24).fill(0),B.current.set(e,l)),l[le.getHours()]+=t}(t.id,o.average*i),S){for(var r=0;r0){for(var r=wk.computeRoofWindowSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),n=0;n0){for(var s=wk.computeWallWindowSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),u=0;u0){for(var f=wk.computeDoorSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),y=0;y0){for(var b=4===(c?u.length:s.length),A=y(V.SolarPanel,e.id),T=wk.computeWallSolarRadiationEnergy(le,R,Q.current,e,t,m,w,A,b?0:1,ae,ue),P=0;P0){var I,C=Object(f.a)(m);try{for(C.s();!(I=C.n()).done;){var O=I.value;g-=Tw.getWindowArea(O,e)}}catch(X){C.e(X)}finally{C.f()}}if(w&&w.length>0){var F,k=Object(f.a)(w);try{for(k.s();!(F=k.n()).done;){var Y=F.value;g-=Y.lx*Y.lz*e.lx*e.lz}}catch(X){k.e(X)}finally{k.f()}}var L=Tw.isZero(v)||Tw.isZero(x)?0:v*x/((null!==(r=e.volumetricHeatCapacity)&&void 0!==r?r:.5)*g*e.ly),E=(N.current+L-i)*g/(null!==(n=e.rValue)&&void 0!==n?n:2)*.001/ie;c&&e.openToOutside&&(E+=(N.current-i)*(p-g)*50*.001/ie),he(e.id,E)}else if(e.openToOutside){var U=Tw.getWallVertices(e,0),J=Tw.getPolygonArea(U),G=N.current-i;he(e.id,G*J*50*.001/ie)}}},Oe=function(e){var t,l,a,o=d(e);if(o){var i=null!==(t=null===(l=o.hvacSystem)||void 0===l?void 0:l.thermostatSetpoint)&&void 0!==t?t:20,r=Tw.calculateBuildingArea(e),n=J.current-i;he(o.id,n*r/(null!==(a=o.rValue)&&void 0!==a?a:2)*.001/ie)}},Fe=function(e,t,l){var a,o,i=1/(null!==(a=e.rValue)&&void 0!==a?a:2),r=1/(null!==(o=e.ceilingRValue)&&void 0!==o?o:2);return(i*t+r*l)/(i+r)},ke=function(e){var t=d(e);if(t){var l=w(e.id);if(l){var a=void 0;switch(e.roofType){case It.Pyramid:a=Ye(e,l,t);break;case It.Hip:a=Le(e,l,t);break;case It.Gable:a=Je(e,l,t);break;case It.Gambrel:a=Ee(e,l,t);break;case It.Mansard:a=Ve(e,l,t)}if(a){var o,i,r,n=null!==(o=null===(i=t.hvacSystem)||void 0===i?void 0:i.thermostatSetpoint)&&void 0!==o?o:20,c=0,s=Object(f.a)(a.entries());try{for(s.s();!(r=s.n()).done;){var h,p=Object(u.a)(r.value,2),y=p[0],g=p[1],m=(g.surfaceTemperature-(e.ceiling?Fe(e,g.surfaceTemperature,n):n))*g.totalArea/(null!==(h=e.rValue)&&void 0!==h?h:2)*.001/ie;he(e.id+"-"+y,m),c+=m}}catch(x){s.e(x)}finally{s.f()}he(e.id,c)}}}},Ye=function(e,t,l){if(e.roofType!==It.Pyramid)throw new Error("roof is not pyramid");var a=t.length;if(0!==a){var o,i=!0,r=t[0][0].z,n=Object(f.a)(t);try{for(n.s();!(o=n.n()).done;){var c,s=o.value,d=Object(f.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(Math.abs(u.z-r)>.01){i=!1;break}}}catch(me){d.e(me)}finally{d.f()}}}catch(me){n.e(me)}finally{n.f()}var p=i?1:a,g=y(V.Window,e.id),m=[];if(i){var w,v=0,b=Object(f.a)(t);try{for(b.s();!(w=b.n()).done;){var A,T=w.value,P=[],j=Object(f.a)(T);try{for(j.s();!(A=j.n()).done;){var H=A.value;P.push(Tw.mapVector3ToPoint2(H))}}catch(me){j.e(me)}finally{j.f()}v+=Tw.getPolygonArea(P)}}catch(me){b.e(me)}finally{b.f()}if(g.length>0){var z,D=Object(f.a)(g);try{for(D.s();!(z=D.n()).done;){var M=z.value;v-=M.lx*M.lz}}catch(me){D.e(me)}finally{D.f()}v<0&&(v=0)}m.push(v)}else{var W,I=Object(f.a)(t);try{for(I.s();!(W=I.n()).done;){var C=W.value,O=Tw.getTriangleArea(C[0],C[1],C[2]);if(g.length>0){var F,k=Object(f.a)(g);try{for(k.s();!(F=k.n()).done;){var Y=F.value;Vm.onSegment(C,Y.cx,Y.cy)&&(O-=Y.lx*Y.lz)}}catch(me){k.e(me)}finally{k.f()}O<0&&(O=0)}m.push(O)}}catch(me){I.e(me)}finally{I.f()}}var L=PT(e),E=Array(p).fill(0);if(Q.current&&Q.current.z>0){for(var U=y(V.SolarPanel,e.id),J=wk.computePyramidRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,g,U,ae,ue),G=0;G.01){i=!1;break}}}catch(re){d.e(re)}finally{d.f()}}}catch(re){n.e(re)}finally{n.f()}var p,g=i?1:a,m=[],w=y(V.Window,e.id),v=Object(f.a)(t);try{for(v.s();!(p=v.n()).done;){var b=p.value,A=0;if(3===b.length?A=Tw.getTriangleArea(b[0],b[1],b[2]):4===b.length&&(A=Tw.getTriangleArea(b[0],b[1],b[2])+Tw.getTriangleArea(b[2],b[3],b[0])),w.length>0){var T,P=Object(f.a)(w);try{for(P.s();!(T=P.n()).done;){var j=T.value;Vm.onSegment(b,j.cx,j.cy)&&(A-=j.lx*j.lz)}}catch(re){P.e(re)}finally{P.f()}A<0&&(A=0)}m.push(A)}}catch(re){v.e(re)}finally{v.f()}var H=i?[m.reduce((function(e,t){return e+t}),0)]:m,z=PT(e),D=Array(g).fill(0);if(Q.current&&Q.current.z>0){for(var M=y(V.SolarPanel,e.id),W=wk.computeHipRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,w,M,ae,ue),I=0;I.01){i=!1;break}}}catch(ie){d.e(ie)}finally{d.f()}}}catch(ie){n.e(ie)}finally{n.f()}var p,g=i?1:a,m=[],w=y(V.Window,e.id),v=Object(f.a)(t);try{for(v.s();!(p=v.n()).done;){var b=p.value,A=Tw.getTriangleArea(b[0],b[1],b[2])+Tw.getTriangleArea(b[2],b[3],b[0]);if(w.length>0){var T,P=Object(f.a)(w);try{for(P.s();!(T=P.n()).done;){var j=T.value;Vm.onSegment(b,j.cx,j.cy)&&(A-=j.lx*j.lz)}}catch(ie){P.e(ie)}finally{P.f()}A<0&&(A=0)}m.push(A)}}catch(ie){v.e(ie)}finally{v.f()}var H=i?[m.reduce((function(e,t){return e+t}),0)]:m,z=PT(e),D=Array(g).fill(0);if(Q.current&&Q.current.z>0){for(var M=y(V.SolarPanel,e.id),W=wk.computeGambrelRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,w,M,ae,ue),I=0;I.01){i=!1;break}}}catch(pe){d.e(pe)}finally{d.f()}}}catch(pe){n.e(pe)}finally{n.f()}for(var p=i?1:a,g=[],m=y(V.Window,e.id),w=0;w0){var A,T=Object(f.a)(m);try{for(T.s();!(A=T.n()).done;){var P=A.value;Vm.onSegment(v,P.cx,P.cy)&&(b-=P.lx*P.lz)}}catch(pe){T.e(pe)}finally{T.f()}b<0&&(b=0)}g.push(b)}var j,H=t[a-1],z=new Array,D=Object(f.a)(H);try{for(D.s();!(j=D.n()).done;){var M=j.value;z.push({x:M.x,y:M.y})}}catch(pe){D.e(pe)}finally{D.f()}var W=Tw.getPolygonArea(z);if(m.length>0){for(var I=m.length-1;I>=0;I--){var C=m[I];Vm.onSegment(H,C.cx,C.cy)&&(W-=C.lx*C.lz,m.splice(I,1))}W<0&&(W=0)}g.push(W);var O=i?[g.reduce((function(e,t){return e+t}),0)]:g,F=PT(e),k=Array(p).fill(0);if(Q.current&&Q.current.z>0){for(var Y=y(V.SolarPanel,e.id),L=wk.computeMansardRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,m,Y,ae,ue),E=0;E0){var d,u=Object(f.a)(i);try{for(u.s();!(d=u.n()).done;){var p=d.value;Vm.onSegment(c,p.cx,p.cy)&&(s-=p.lx*p.lz)}}catch(J){u.e(J)}finally{u.f()}s<0&&(s=0)}r.push(s)}}catch(J){n.e(J)}finally{n.f()}var g=PT(e),m=Array(a).fill(0);if(Q.current&&Q.current.z>0){for(var w=y(V.SolarPanel,e.id),v=wk.computeGableRoofSolarRadiationEnergy(le,R,Q.current,e,!0,t,l,i,w,ae,ue),b=0;b0&&(h(),H(),Tf.setState((function(e){e.runStaticSimulation=!1,e.simulationInProgress=!1,e.showSolarRadiationHeatmap=!0})),Kh(me.t("message.SimulationCompleted",m)))}),[p]);var j=function(e,t,l){if(P.current.length>1){S.current.length=0,A.set(t,l);var a=P.current.filter((function(t){return t.uuid!==e}));return A.intersectObjects(a,!1,S.current),S.current.length>0}return!1},H=function(){!function(){var e=g.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;P.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,P.current)}}catch(i){a.e(i)}finally{a.f()}}}();var e,t=Object(f.a)(i);try{for(t.s();!(e=t.n()).done;){var l=e.value;switch(l.type){case V.Foundation:var a=l;R(a),a.solarStructure===G.UpdraftTower&&D(a);break;case V.Cuboid:z(l);break;case V.SolarPanel:M(l);break;case V.Wall:W(l);break;case V.Door:I(l);break;case V.Roof:var o=l;switch(o.roofType){case It.Pyramid:C(o);break;case It.Gable:L(o);break;case It.Gambrel:F(o);break;case It.Mansard:O(o);break;case It.Hip:k(o)}}}}catch(r){t.e(r)}finally{t.f()}},z=function(e){var t=x.getFullYear(),l=x.getMonth(),a=x.getDate(),i=Tw.dayOfYear(x),r=e.lx,n=e.ly,s=e.lz,u=Math.max(2,Math.round(r/T)),f=Math.max(2,Math.round(n/T)),h=Math.max(2,Math.round(s/T)),p=r/u,y=n/f,g=s/h,m=c(e),A=e.cx,P=e.cy,S=e.cz;if(m&&m.type===V.Cuboid){var H=Tw.getWorldDataById(e.id);A=H.pos.x,P=H.pos.y,S=H.pos.z}for(var z=Array(u).fill(0).map((function(){return Array(f).fill(0)})),R=Array(u).fill(0).map((function(){return Array(h).fill(0)})),D=Array(u).fill(0).map((function(){return Array(h).fill(0)})),M=Array(f).fill(0).map((function(){return Array(h).fill(0)})),W=Array(f).fill(0).map((function(){return Array(h).fill(0)})),I=Rt,C=zt.clone().applyAxisAngle(Rt,e.rotation[2]),O=Ht.clone().applyAxisAngle(Rt,e.rotation[2]),F=jt.clone().applyAxisAngle(Rt,e.rotation[2]),k=St.clone().applyAxisAngle(Rt,e.rotation[2]),Y=new Me.Vector3,L=0,U=new Me.Vector2(A,P),N=new Me.Vector2,J=P-n/2,G=P+n/2,X=A-r/2,B=A+r/2,K=0;K<24;K++)for(var q=0;q0){L++;for(var _=zy(Z,i,v,ny.SPHERE_MODEL),$=Ry(o.ground,l,I,_),ee=I.dot(Z),te=A-r/2,le=P-n/2,ae=S+s/2,oe=0;oe0&&(N.set(te+(oe+.5)*p,le+(ie+.5)*y),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,ae),j(e.id,Y,Z)||(z[oe][ie]+=ee*_));te=A-r/2,le=S-s/2,$=Ry(o.ground,l,C,_),ee=C.dot(Z);for(var re=0;re0&&(N.set(te+(re+.5)*p,J),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,le+(ne+.5)*g),j(e.id,Y,Z)||(R[re][ne]+=ee*_));$=Ry(o.ground,l,O,_),ee=O.dot(Z);for(var ce=0;ce0&&(N.set(te+(ce+.5)*p,G),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,le+(h-(se+.5))*g),j(e.id,Y,Z)||(D[ce][se]+=ee*_));te=P-n/2,le=S-s/2,$=Ry(o.ground,l,F,_),ee=F.dot(Z);for(var de=0;de0&&(N.set(X,te+(de+.5)*y),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,le+(ue+.5)*g),j(e.id,Y,Z)||(M[de][ue]+=ee*_));$=Ry(o.ground,l,k,_),ee=k.dot(Z);for(var fe=0;fe0&&(N.set(B,te+(fe+.5)*y),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,le+(he+.5)*g),j(e.id,Y,Z)||(W[fe][he]+=ee*_))}}M=Tw.transpose(M),W=Tw.transpose(W);var pe=L*b/60,ye=pe>At?w.sunshineHours[l]/(30*pe*o.timesPerHour):0;E(z,ye),E(R,ye),E(D,ye),E(M,ye),E(W,ye),d(e.id+"-top",z),d(e.id+"-south",R),d(e.id+"-north",D),d(e.id+"-west",M),d(e.id+"-east",W)},R=function(e){for(var t=x.getFullYear(),l=x.getMonth(),a=x.getDate(),i=Tw.dayOfYear(x),r=e.lx,n=e.ly,c=e.lz,s=Math.max(2,Math.round(r/T)),u=Math.max(2,Math.round(n/T)),f=r/s,h=n/u,p=e.cx-r/2,y=e.cy-n/2,g=new Me.Vector2(e.cx,e.cy),m=new Me.Vector3,A=Array(s).fill(0).map((function(){return Array(u).fill(0)})),P=0,S=0;S<24;S++)for(var H=0;H0){P++;for(var D=zy(R,i,v,ny.SPHERE_MODEL),M=Ry(o.ground,l,Rt,D),W=Rt.dot(R),I=new Me.Vector2,C=0;C0&&(I.set(p+(C+.5)*f,y+(O+.5)*h),I.rotateAround(g,e.rotation[2]),m.set(I.x,I.y,c),j(e.id,m,R)||(A[C][O]+=W*D))}}var F=P*b/60,k=F>At?w.sunshineHours[l]/(30*F*o.timesPerHour):0;E(A,k),d(e.id,A)},D=function(e){var t=e.solarUpdraftTower;if(t){for(var l,a,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),c=Tw.dayOfYear(x),s=t.collectorRadius,u=Math.max(2,Math.round(2*s/T)),f=e.cx-s+T/2,h=e.cy-s+T/2,p=e.lz+t.collectorHeight,y=Array(u).fill(0).map((function(){return Array(u).fill(0)})),g=new Me.Vector3(0,0,p),m=s*s,A=0,P=0;P<24;P++)for(var S=0;S0){A++;for(var R=zy(z,c,v,ny.SPHERE_MODEL),D=Ry(o.ground,r,Rt,R),M=Rt.dot(z),W=0;Wm||(y[W][I]+=D,M>0&&(j(e.id+"-sut",g,z)||(y[W][I]+=M*R)))}}}var C=A*b/60,O=C>At?w.sunshineHours[r]/(30*C*o.timesPerHour):0;E(y,O),d(e.id+"-sut",y)}},M=function(e){if(e.trackerType!==te.NO_TRACKER)throw new Error("trackers cannot use static simulation");var t=c(e);if(!t)throw new Error("parent of solar panel does not exist");var l=e.parentType===V.Roof,a=e.parentType===V.Wall;if(l&&!(t=s(t)))throw new Error("foundation of solar panel does not exist");var i=a?Tw.absoluteCoordinates(e.cx,e.cy,e.cz,t,s(e),e.lz):Tw.absoluteCoordinates(e.cx,e.cy,e.cz,t),r=(new Me.Vector3).fromArray(e.normal),n=t.rotation[2],u=n+e.relativeAzimuth,f=e.tiltAngle,h=!0;if(l&&(i.z=e.cz+e.lz+.02+t.cz+t.lz/2,Tw.isZero(e.rotation[0])?i.z+=e.poleHeight:(f=e.rotation[0],u=n,h=!1)),a&&!Tw.isZero(e.tiltAngle)){var p=t,y=s(t),g=(y?y.rotation[2]+p.relativeAngle:p.relativeAngle)-vt,m=e.ly*Math.abs(Math.sin(e.tiltAngle))/2;i.x+=m*Math.cos(g),i.y+=m*Math.sin(g)}var A=new Me.Euler(l&&!h?0:f,0,u,"ZYX");r.applyEuler(A);var P=x.getFullYear(),S=x.getMonth(),H=x.getDate(),z=Tw.dayOfYear(x),R=e.lx,D=e.ly,M=Math.max(2,Math.round(e.lx/T)),W=Math.max(2,Math.round(e.ly/T)),I=R/M,C=D/W,O=i.x-(R-T)/2,F=i.y-(D-T)/2,k=l||a?i.z:t.lz+e.poleHeight+e.lz,Y=new Me.Vector2(i.x,i.y),L=new Me.Vector3,U=Array(M).fill(0).map((function(){return Array(W).fill(0)})),N=0;l&&!h&&(A.x=e.rotation[0],A.z=e.rotation[2]+n),a&&(A.x=vt+e.tiltAngle,A.z=t.relativeAngle+n);for(var J=0;J<24;J++)for(var G=0;G0){N++;for(var K=zy(B,z,v,ny.SPHERE_MODEL),q=Ry(o.ground,S,r,K),Q=r.dot(B),Z=new Me.Vector2,_=new Me.Vector3,$=0;$0&&(Z.set(O+$*I,F+ee*C),_.set(Z.x-Y.x,Z.y-Y.y,0),_.applyEuler(A),L.set(i.x+_.x,i.y+_.y,k+_.z),j(e.id,L,B)||(U[$][ee]+=Q*K))}}var le=N*b/60,ae=le>At?w.sunshineHours[S]/(30*le*o.timesPerHour):0;E(U,ae),d(e.id,U)},W=function(e){var t=s(e);if(!t)throw new Error("foundation of wall not found");for(var l=x.getFullYear(),a=x.getMonth(),i=x.getDate(),r=Tw.dayOfYear(x),n=e.lx,c=Tw.getHighestPointOfWall(e),u=Math.max(2,Math.round(n/T)),f=Math.max(2,Math.round(c/T)),h=n/u,p=c/f,y=t.rotation[2]+e.relativeAngle,g=Tw.wallAbsolutePosition(new Me.Vector3(e.cx,e.cy,c/2),t).setZ(c/2+t.lz),m=new Me.Vector3(Math.cos(y-vt),Math.sin(y-vt),0),A=new Me.Vector3,P=Array(u).fill(0).map((function(){return Array(f).fill(0)})),S=0,H=h*Math.cos(y),z=h*Math.sin(y),R=Tw.getWallVertices(e,2),D=(c-e.lz)/2,M=0;M<24;M++)for(var W=0;W0){S++;for(var O=zy(C,r,v,ny.SPHERE_MODEL),F=Ry(o.ground,a,m,O),k=m.dot(C),Y=0;Y0&&(A.set(g.x+U*H,g.y+U*z,g.z+N*p),j(e.id,A,C)||(P[Y][L]+=k*O)))}}}var V=S*b/60,J=V>At?w.sunshineHours[a]/(30*V*o.timesPerHour):0;E(P,J),d(e.id,P)},I=function(e){var t=s(e);if(!t)throw new Error("foundation of door not found");var l=c(e);if(!l)throw new Error("parent of door not found");for(var a=l,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),u=Tw.dayOfYear(x),f=e.lx*a.lx,h=e.lz*a.lz,p=Math.max(2,Math.round(f/T)),y=Math.max(2,Math.round(h/T)),g=f/p,m=h/y,A=t.rotation[2]+a.relativeAngle,P=Tw.wallAbsolutePosition(new Me.Vector3(a.cx,a.cy,a.cz),t).setZ(a.lz/2+t.lz).clone().add(new Me.Vector3(e.cx*a.lx,0,e.cz*a.lz)),S=new Me.Vector3(Math.cos(A-vt),Math.sin(A-vt),0),H=new Me.Vector3,z=Array(p).fill(0).map((function(){return Array(y).fill(0)})),R=0,D=g*Math.cos(A),M=g*Math.sin(A),W=0;W<24;W++)for(var I=0;I0){R++;var F=zy(O,u,v,ny.SPHERE_MODEL),k=Ry(o.ground,r,S,F),Y=S.dot(O);if(e.doorType===hy.Arched)for(var L=0;L0&&(j(e.id,H,O)||(z[L][U]+=Y*F)))}else for(var J=0;J0&&(H.set(P.x+X*D,P.y+X*M,P.z+B*m),j(e.id,H,O)||(z[J][G]+=Y*F))}}}var K=R*b/60,q=K>At?w.sunshineHours[r]/(30*K*o.timesPerHour):0;E(z,q),d(e.id,z)},C=function(e){if(e.roofType!==It.Pyramid)throw new Error("roof is not pyramid");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=!0,r=l[0][0].z,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c,h=a.value,p=Object(f.a)(h);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(M){p.e(M)}finally{p.f()}}}catch(M){n.e(M)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),H=Tw.dayOfYear(x),z=new Me.Euler(0,0,t.rotation[2],"ZYX"),R=Object(f.a)(l.entries());try{var D=function(){var l=Object(u.a)(m.value,2),a=l[0],i=l[1],r=e.id+"-"+a,n=i[0].clone().applyEuler(z),c=i[1].clone().applyEuler(z),s=i[2].clone().applyEuler(z),f=(new Me.Vector3).subVectors(c,n),h=(new Me.Vector3).subVectors(s,n),p=(new Me.Vector3).subVectors(s,c),y=f.length(),g=(new Me.Vector3).crossVectors(h,p).length()/y,x=Math.max(2,Math.round(y/T)),R=Math.max(2,Math.round(g/T)),D=Array(x).fill(0).map((function(){return Array(R).fill(0)}));f.normalize(),h.normalize(),p.normalize();var M=(new Me.Vector3).crossVectors(h,p).normalize(),W=f.multiplyScalar(.5*y/x),I=(new Me.Vector3).crossVectors(M,f).normalize().multiplyScalar(.5*g/R),C=new Me.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+xy);C.add(W).add(I),W.multiplyScalar(2),I.multiplyScalar(2);for(var O=0,F=new Me.Vector3,k=0;k<24;k++)for(var Y=0;Y0){O++;for(var N=zy(U,H,v,ny.SPHERE_MODEL),V=Ry(o.ground,P,M,N),J=M.dot(U),G=0;G0&&(F.copy(C).add(X).add(I.clone().multiplyScalar(B)),j(r,F,U)||(D[G][B]+=J*N))}}var K=O*b/60,q=K>At?w.sunshineHours[P]/(30*K*o.timesPerHour):0;E(D,q),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(M){R.e(M)}finally{R.f()}}}},O=function(e){if(e.roofType!==It.Mansard)throw new Error("roof is not mansard");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=!0,r=l[0][0].z,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c,h=a.value,p=Object(f.a)(h);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(C){p.e(C)}finally{p.f()}}}catch(C){n.e(C)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),H=Tw.dayOfYear(x),z=new Me.Euler(0,0,t.rotation[2],"ZYX"),R=Object(f.a)(l.entries());try{for(R.s();!(m=R.n()).done;){var D=Object(u.a)(m.value,2),M=D[0],W=D[1],I=e.id+"-"+M;M===l.length-1?function(){var e,l=Number.MAX_VALUE,a=Number.MAX_VALUE,i=-Number.MAX_VALUE,r=-Number.MAX_VALUE,n=Object(f.a)(W);try{for(n.s();!(e=n.n()).done;){var c=e.value.clone().applyEuler(z);c.x>i&&(i=c.x),c.xr&&(r=c.y),c.y0){x++;for(var k=zy(F,H,v,ny.SPHERE_MODEL),Y=Ry(o.ground,P,Rt,k),L=Rt.dot(F),U=0;U0&&(R.y=m.y+N*y,j(I,R,F)||(g[U][N]+=L*k))}}}var V=x*b/60,J=V>At?w.sunshineHours[P]/(30*V*o.timesPerHour):0;E(g,J),d(I,g)}():function(){var e=W[0].clone().applyEuler(z),l=W[1].clone().applyEuler(z),a=W[2].clone().applyEuler(z),i=(new Me.Vector3).subVectors(l,e),r=(new Me.Vector3).subVectors(a,e),n=(new Me.Vector3).subVectors(a,l),c=i.length(),s=(new Me.Vector3).crossVectors(r,n).length()/c,u=Math.max(2,Math.round(c/T)),f=Math.max(2,Math.round(s/T)),h=Array(u).fill(0).map((function(){return Array(f).fill(0)}));i.normalize(),r.normalize(),n.normalize();var p=(new Me.Vector3).crossVectors(r,n).normalize(),y=i.multiplyScalar(.5*c/u),g=(new Me.Vector3).crossVectors(p,i).normalize().multiplyScalar(.5*s/f),m=new Me.Vector3(t.cx+e.x,t.cy+e.y,t.lz+e.z+xy);m.add(y).add(g),y.multiplyScalar(2),g.multiplyScalar(2);for(var x=0,R=new Me.Vector3,D=0;D<24;D++)for(var M=0;M0){x++;for(var F=zy(O,H,v,ny.SPHERE_MODEL),k=Ry(o.ground,P,p,F),Y=p.dot(O),L=0;L0&&(R.copy(m).add(U).add(g.clone().multiplyScalar(N)),j(I,R,O)||(h[L][N]+=Y*F))}}var V=x*b/60,J=V>At?w.sunshineHours[P]/(30*V*o.timesPerHour):0;E(h,J),d(I,h)}()}}catch(C){R.e(C)}finally{R.f()}}}},F=function(e){if(e.roofType!==It.Gambrel)throw new Error("roof is not gambrel");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=!0,r=l[0][0].z,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c,h=a.value,p=Object(f.a)(h);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(M){p.e(M)}finally{p.f()}}}catch(M){n.e(M)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),H=Tw.dayOfYear(x),z=new Me.Euler(0,0,t.rotation[2],"ZYX"),R=Object(f.a)(l.entries());try{var D=function(){var l=Object(u.a)(m.value,2),a=l[0],i=l[1],r=e.id+"-"+a,n=i[0].clone().applyEuler(z),c=i[1].clone().applyEuler(z),s=i[2].clone().applyEuler(z),f=(new Me.Vector3).subVectors(c,n),h=(new Me.Vector3).subVectors(s,n),p=(new Me.Vector3).subVectors(s,c),y=f.length(),g=(new Me.Vector3).crossVectors(h,p).length()/y,x=Math.max(2,Math.round(y/T)),R=Math.max(2,Math.round(g/T)),D=Array(x).fill(0).map((function(){return Array(R).fill(0)}));f.normalize(),h.normalize(),p.normalize();var M=(new Me.Vector3).crossVectors(h,p).normalize(),W=f.multiplyScalar(.5*y/x),I=(new Me.Vector3).crossVectors(M,f).normalize().multiplyScalar(.5*g/R),C=new Me.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+xy);C.add(W).add(I),W.multiplyScalar(2),I.multiplyScalar(2);for(var O=0,F=new Me.Vector3,k=0;k<24;k++)for(var Y=0;Y0){O++;for(var N=zy(U,H,v,ny.SPHERE_MODEL),V=Ry(o.ground,P,M,N),J=M.dot(U),G=0;G0&&(F.copy(C).add(X).add(I.clone().multiplyScalar(B)),j(r,F,U)||(D[G][B]+=J*N))}}var K=O*b/60,q=K>At?w.sunshineHours[P]/(30*K*o.timesPerHour):0;E(D,q),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(M){R.e(M)}finally{R.f()}}}},k=function(e){if(e.roofType!==It.Hip)throw new Error("roof is not hip");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=!0,r=l[0][0].z,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c,h=a.value,p=Object(f.a)(h);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(M){p.e(M)}finally{p.f()}}}catch(M){n.e(M)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),H=Tw.dayOfYear(x),z=new Me.Euler(0,0,t.rotation[2],"ZYX"),R=Object(f.a)(l.entries());try{var D=function(){var l=Object(u.a)(m.value,2),a=l[0],i=l[1],r=e.id+"-"+a,n=i[0].clone().applyEuler(z),c=i[1].clone().applyEuler(z),s=i[2].clone().applyEuler(z),f=(new Me.Vector3).subVectors(c,n),h=(new Me.Vector3).subVectors(s,n),p=(new Me.Vector3).subVectors(s,c),y=f.length(),g=(new Me.Vector3).crossVectors(h,p).length()/y,x=Math.max(2,Math.round(y/T)),R=Math.max(2,Math.round(g/T)),D=Array(x).fill(0).map((function(){return Array(R).fill(0)}));f.normalize(),h.normalize(),p.normalize();var M=(new Me.Vector3).crossVectors(h,p).normalize(),W=f.multiplyScalar(.5*y/x),I=(new Me.Vector3).crossVectors(M,f).normalize().multiplyScalar(.5*g/R),C=0,O=new Me.Vector3,F=new Me.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+xy);if(F.add(W).add(I),W.multiplyScalar(2),I.multiplyScalar(2),a%2===0)for(var k=0;k<24;k++)for(var Y=0;Y0){C++;for(var N=zy(U,H,v,ny.SPHERE_MODEL),V=Ry(o.ground,P,M,N),J=M.dot(U),G=0;G0&&(O.copy(F).add(X).add(I.clone().multiplyScalar(B)),j(r,O,U)||(D[G][B]+=J*N))}}else for(var K=0;K<24;K++)for(var q=0;q0){C++;for(var _=zy(Z,H,v,ny.SPHERE_MODEL),$=Ry(o.ground,P,M,_),ee=M.dot(Z),te=0;te0&&(O.copy(F).add(le).add(I.clone().multiplyScalar(ae)),j(r,O,Z)||(D[te][ae]+=ee*_))}}var oe=C*b/60,ie=oe>At?w.sunshineHours[P]/(30*oe*o.timesPerHour):0;E(D,ie),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(M){R.e(M)}finally{R.f()}}}},Y=function(e,t,l){var a,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),c=Tw.dayOfYear(x),s=new Me.Euler(0,0,t.rotation[2],"ZYX"),u=l[0][0].z,h=Number.MAX_VALUE,p=Number.MAX_VALUE,y=-Number.MAX_VALUE,g=-Number.MAX_VALUE,m=Object(f.a)(l);try{for(m.s();!(a=m.n()).done;){var A,P=a.value,S=Object(f.a)(P);try{for(S.s();!(A=S.n()).done;){var H=A.value.clone().applyEuler(s);H.x>y&&(y=H.x),H.xg&&(g=H.y),H.y0){C++;for(var U=zy(L,c,v,ny.SPHERE_MODEL),N=Ry(o.ground,r,Rt,U),V=Rt.dot(L),J=0;J0&&(O.y=I.y+G*M,j(e.id,O,L)||(W[J][G]+=V*U))}}}var X=C*b/60,B=X>At?w.sunshineHours[r]/(30*X*o.timesPerHour):0;E(W,B),d(e.id,W)},L=function(e){if(e.roofType!==It.Gable)throw new Error("roof is not gable");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),c=Tw.dayOfYear(x),h=new Me.Euler(0,0,t.rotation[2],"ZYX"),p=Object(f.a)(l.entries());try{var g=function(){var l=Object(u.a)(a.value,2),s=l[0],f=l[1],p=e.id+"-"+s,y=f[0].clone().applyEuler(h),g=f[1].clone().applyEuler(h),m=f[2].clone().applyEuler(h),x=(new Me.Vector3).subVectors(g,y),A=(new Me.Vector3).subVectors(m,y),P=(new Me.Vector3).subVectors(m,g),S=x.length(),H=(new Me.Vector3).crossVectors(A,P).length()/S,z=Math.max(2,Math.round(S/T)),R=Math.max(2,Math.round(H/T)),D=Array(z).fill(0).map((function(){return Array(R).fill(0)}));x.normalize(),A.normalize(),P.normalize();var M=(new Me.Vector3).crossVectors(A,P).normalize(),W=x.multiplyScalar(.5*S/z),I=(new Me.Vector3).crossVectors(M,x).normalize().multiplyScalar(.5*H/R),C=new Me.Vector3(t.cx+y.x,t.cy+y.y,t.lz+y.z+xy);C.add(W).add(I),W.multiplyScalar(2),I.multiplyScalar(2);for(var O=0,F=new Me.Vector3,k=0;k<24;k++)for(var Y=0;Y0){O++;for(var N=zy(U,c,v,ny.SPHERE_MODEL),V=Ry(o.ground,r,M,N),J=M.dot(U),G=0;G0&&(F.copy(C).add(X).add(I.clone().multiplyScalar(B)),j(p,F,U)||(D[G][B]+=J*N))}}var K=O*b/60,q=K>At?w.sunshineHours[r]/(30*K*o.timesPerHour):0;E(D,q),d(p,D)};for(p.s();!(a=p.n()).done;)g()}catch(m){p.e(m)}finally{p.f()}}},E=function(e,t){for(var l=0;l=Y.sunset)return cancelAnimationFrame(W.current),Tf.setState((function(e){e.runDynamicSimulation=!1})),a((function(e){e.world.date=C.current.toLocaleString("en-US")})),Kh(me.t("message.SimulationCompleted",T)),I.current=!0,function(){m();var e,t=Y.daylight()/60,l=t>At?P.sunshineHours[S.getMonth()]/(30*t*c.timesPerHour):0,a=Object(f.a)(s);try{for(a.s();!(e=a.n()).done;){var o=e.value;switch(o.type){case V.Foundation:case V.Wall:case V.Door:case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:var i=O.current.get(o.id);if(i){for(var r=0;r0){if(d.roofType===It.Pyramid||d.roofType===It.Mansard||d.roofType===It.Gambrel||d.roofType===It.Hip){var p,y=!0,w=u[0][0].z,x=Object(f.a)(u);try{for(x.s();!(p=x.n()).done;){var v,A=p.value,T=Object(f.a)(A);try{for(T.s();!(v=T.n()).done;){var j=v.value;if(Math.abs(j.z-w)>.01){y=!1;break}}}catch(J){T.e(J)}finally{T.f()}}}catch(J){x.e(J)}finally{x.f()}if(y){var H=O.current.get(d.id);if(H){for(var z=0;z1){M.current.length=0,z.set(t,l);var a=D.current.filter((function(t){return t.uuid!==e}));return z.intersectObjects(a,!1,M.current),M.current.length>0}return!1},J=function(){var e=A.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;D.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,D.current)}}catch(i){a.e(i)}finally{a.f()}}},X=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=Tw.dayOfYear(S),a=e.lx,o=e.ly,i=e.lz,r=Math.max(2,Math.round(a/R)),n=Math.max(2,Math.round(o/R)),s=Math.max(2,Math.round(i/R)),d=a/r,u=o/n,f=i/s,h=O.current.get(e.id+"-top");h&&h.length===r&&h[0].length===n||(h=Array(r).fill(0).map((function(){return Array(n).fill(0)})),O.current.set(e.id+"-top",h));var y=O.current.get(e.id+"-south");y&&y.length===r&&y[0].length===s||(y=Array(r).fill(0).map((function(){return Array(s).fill(0)})),O.current.set(e.id+"-south",y));var g=O.current.get(e.id+"-north");g&&g.length===r&&g[0].length===s||(g=Array(r).fill(0).map((function(){return Array(s).fill(0)})),O.current.set(e.id+"-north",g));var m=O.current.get(e.id+"-west");m&&m.length===n&&m[0].length===s||(m=Array(n).fill(0).map((function(){return Array(s).fill(0)})),O.current.set(e.id+"-west",m));var w=O.current.get(e.id+"-east");w&&w.length===n&&w[0].length===s||(w=Array(n).fill(0).map((function(){return Array(s).fill(0)})),O.current.set(e.id+"-east",w));var x=Rt,v=zt.clone().applyAxisAngle(Rt,e.rotation[2]),b=Ht.clone().applyAxisAngle(Rt,e.rotation[2]),A=jt.clone().applyAxisAngle(Rt,e.rotation[2]),T=St.clone().applyAxisAngle(Rt,e.rotation[2]),P=p(e),H=e.cx,z=e.cy,D=e.cz;if(P&&P.type===V.Cuboid){var M=Tw.getWorldDataById(e.id);H=M.pos.x,z=M.pos.y,D=M.pos.z}for(var W=new Me.Vector3,I=new Me.Vector2(H,z),C=new Me.Vector2,F=z-o/2,k=z+o/2,Y=H-a/2,L=H+a/2,E=zy(t,l,j,ny.SPHERE_MODEL),U=Ry(c.ground,S.getMonth(),x,E),J=x.dot(t),G=H-a/2,X=z-o/2,B=D+i/2,K=0;K0&&(C.set(G+(K+.5)*d,X+(q+.5)*u),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,B),N(e.id,W,t)||(h[K][q]+=J*E));G=H-a/2,X=D-i/2,U=Ry(c.ground,S.getMonth(),v,E),J=v.dot(t);for(var Q=0;Q0&&(C.set(G+(Q+.5)*d,F),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,X+(Z+.5)*f),N(e.id,W,t)||(y[Q][Z]+=J*E));U=Ry(c.ground,S.getMonth(),b,E),J=b.dot(t);for(var _=0;_0&&(C.set(G+(_+.5)*d,k),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,X+(s-($+.5))*f),N(e.id,W,t)||(g[_][$]+=J*E));G=z-o/2,X=D-i/2,U=Ry(c.ground,S.getMonth(),A,E),J=A.dot(t);for(var ee=0;ee0&&(C.set(Y,G+(ee+.5)*u),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,X+(te+.5)*f),N(e.id,W,t)||(m[ee][te]+=J*E));U=Ry(c.ground,S.getMonth(),T,E),J=T.dot(t);for(var le=0;le0&&(C.set(L,G+(le+.5)*u),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,X+(ae+.5)*f),N(e.id,W,t)||(w[le][ae]+=J*E))}},B=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=Tw.dayOfYear(S),a=e.lx,o=e.ly,i=e.lz,r=Math.max(2,Math.round(a/R)),n=Math.max(2,Math.round(o/R)),s=a/r,d=o/n,u=e.cx-a/2,f=e.cy-o/2,h=new Me.Vector2(e.cx,e.cy),p=new Me.Vector3,y=O.current.get(e.id);y&&y.length===r&&y[0].length===n||(y=Array(r).fill(0).map((function(){return Array(n).fill(0)})),O.current.set(e.id,y));for(var g=zy(t,l,j,ny.SPHERE_MODEL),m=Ry(c.ground,S.getMonth(),Rt,g),w=Rt.dot(t),x=new Me.Vector2,v=0;v0&&(x.set(u+(v+.5)*s,f+(b+.5)*d),x.rotateAround(h,e.rotation[2]),p.set(x.x,x.y,i),N(e.id,p,t)||(y[v][b]+=w*g))}},K=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=Tw.dayOfYear(S),o=e.lx,i=Tw.getHighestPointOfWall(e),r=Math.max(2,Math.round(o/R)),n=Math.max(2,Math.round(i/R)),s=o/r,d=i/n,u=l.rotation[2]+e.relativeAngle,f=Tw.wallAbsolutePosition(new Me.Vector3(e.cx,e.cy,e.cz),l).setZ(i/2+l.lz),h=new Me.Vector3(Math.cos(u-vt),Math.sin(u-vt),0),p=s*Math.cos(u),g=s*Math.sin(u),m=new Me.Vector3,w=O.current.get(e.id);w&&w.length===r&&w[0].length===n||(w=Array(r).fill(0).map((function(){return Array(n).fill(0)})),O.current.set(e.id,w));for(var x=Tw.getWallVertices(e,1),v=(i-e.lz)/2,b=zy(t,a,j,ny.SPHERE_MODEL),A=Ry(c.ground,S.getMonth(),h,b),T=h.dot(t),P=0;P0&&(m.set(f.x+z*p,f.y+z*g,f.z+D*d),N(e.id,m,t)||(w[P][H]+=T*b)))}}},q=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of door not found");var a=p(e);if(!a)throw new Error("parent of door not found");var o=Tw.dayOfYear(S),i=a,r=e.lx*i.lx,n=e.lz*i.lz,s=Math.max(2,Math.round(r/R)),d=Math.max(2,Math.round(n/R)),u=r/s,f=n/d,h=l.rotation[2]+i.relativeAngle,g=Tw.wallAbsolutePosition(new Me.Vector3(i.cx,i.cy,i.cz),l).setZ(i.lz/2+l.lz).clone().add(new Me.Vector3(e.cx*i.lx,0,e.cz*i.lz)),m=new Me.Vector3(Math.cos(h-vt),Math.sin(h-vt),0),w=u*Math.cos(h),x=u*Math.sin(h),v=new Me.Vector3,b=O.current.get(e.id);b&&b.length===s&&b[0].length===d||(b=Array(s).fill(0).map((function(){return Array(d).fill(0)})),O.current.set(e.id,b));var A=zy(t,o,j,ny.SPHERE_MODEL),T=Ry(c.ground,S.getMonth(),m,A),P=m.dot(t);if(e.doorType===hy.Arched)for(var H=0;H0&&(N(e.id,v,t)||(b[H][z]+=P*A)))}else for(var W=0;W0){var C=W-s/2+.5,F=I-d/2+.5;v.set(g.x+C*w,g.y+C*x,g.z+F*f),N(e.id,v,t)||(b[W][I]+=P*A)}}},Q=function(e,t,l,a){var o,i=a[0][0].z,r=Tw.dayOfYear(S),n=zy(e,r,j,ny.SPHERE_MODEL),s=new Me.Euler(0,0,l.rotation[2],"ZYX"),d=Number.MAX_VALUE,u=Number.MAX_VALUE,h=-Number.MAX_VALUE,p=-Number.MAX_VALUE,y=Object(f.a)(a);try{for(y.s();!(o=y.n()).done;){var g,m=o.value,w=Object(f.a)(m);try{for(w.s();!(g=w.n()).done;){var x=g.value.clone().applyEuler(s);x.x>h&&(h=x.x),x.xp&&(p=x.y),x.y0&&(z.y=H.y+I*T,N(t.id,z,e)||(P[W][I]+=M*n))}},Z=function(e){if(e.roofType!==It.Pyramid)throw new Error("roof is not pyramid");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=!0,r=a[0][0].z,n=Object(f.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,h=Object(f.a)(d);try{for(h.s();!(s=h.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){h.e(T)}finally{h.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Tw.dayOfYear(S),w=new Me.Euler(0,0,l.rotation[2],"ZYX"),x=zy(t,m,j,ny.SPHERE_MODEL),v=Object(f.a)(a.entries());try{var A=function(){var a=Object(u.a)(g.value,2),o=a[0],i=a[1],r=e.id+"-"+o,n=i[0].clone().applyEuler(w),s=i[1].clone().applyEuler(w),d=i[2].clone().applyEuler(w),f=(new Me.Vector3).subVectors(s,n),h=(new Me.Vector3).subVectors(d,n),p=(new Me.Vector3).subVectors(d,s),y=f.length(),m=(new Me.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=O.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),O.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new Me.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),j=(new Me.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),H=new Me.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+xy);H.add(P).add(j),P.multiplyScalar(2),j.multiplyScalar(2);for(var z=new Me.Vector3,D=Ry(c.ground,S.getMonth(),T,x),M=T.dot(t),W=0;W0&&(z.copy(H).add(I).add(j.clone().multiplyScalar(C)),N(r,z,t)||(A[W][C]+=M*x))};for(v.s();!(g=v.n()).done;)A()}catch(T){v.e(T)}finally{v.f()}}}}},_=function(e){if(e.roofType!==It.Mansard)throw new Error("roof is not mansard");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=!0,r=a[0][0].z,n=Object(f.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,h=Object(f.a)(d);try{for(h.s();!(s=h.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(z){h.e(z)}finally{h.f()}}}catch(z){n.e(z)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Tw.dayOfYear(S),w=new Me.Euler(0,0,l.rotation[2],"ZYX"),x=zy(t,m,j,ny.SPHERE_MODEL),v=Object(f.a)(a.entries());try{for(v.s();!(g=v.n()).done;){var A=Object(u.a)(g.value,2),T=A[0],P=A[1],H=e.id+"-"+T;T===a.length-1?function(){var e,a=Number.MAX_VALUE,o=Number.MAX_VALUE,i=-Number.MAX_VALUE,r=-Number.MAX_VALUE,n=Object(f.a)(P);try{for(n.s();!(e=n.n()).done;){var s=e.value.clone().applyEuler(w);s.x>i&&(i=s.x),s.xr&&(r=s.y),s.y0&&(v.y=m.y+j*y,N(H,v,t)||(g[T][j]+=A*x))}}():function(){var e=P[0].clone().applyEuler(w),a=P[1].clone().applyEuler(w),o=P[2].clone().applyEuler(w),i=(new Me.Vector3).subVectors(a,e),r=(new Me.Vector3).subVectors(o,e),n=(new Me.Vector3).subVectors(o,a),s=i.length(),d=(new Me.Vector3).crossVectors(r,n).length()/s,u=Math.max(2,Math.round(s/R)),f=Math.max(2,Math.round(d/R)),h=O.current.get(H);h&&h.length===u&&h[0].length===f||(h=Array(u).fill(0).map((function(){return Array(f).fill(0)})),O.current.set(H,h)),i.normalize(),r.normalize(),n.normalize();var p=(new Me.Vector3).crossVectors(r,n).normalize(),y=i.multiplyScalar(.5*s/u),g=(new Me.Vector3).crossVectors(p,i).normalize().multiplyScalar(.5*d/f),m=new Me.Vector3(l.cx+e.x,l.cy+e.y,l.lz+e.z+xy);m.add(y).add(g),y.multiplyScalar(2),g.multiplyScalar(2);for(var v=new Me.Vector3,b=Ry(c.ground,S.getMonth(),p,x),A=p.dot(t),T=0;T0&&(v.copy(m).add(j).add(g.clone().multiplyScalar(z)),N(H,v,t)||(h[T][z]+=A*x))}()}}catch(z){v.e(z)}finally{v.f()}}}}},$=function(e){if(e.roofType!==It.Gambrel)throw new Error("roof is not gambrel");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=!0,r=a[0][0].z,n=Object(f.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,h=Object(f.a)(d);try{for(h.s();!(s=h.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){h.e(T)}finally{h.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Tw.dayOfYear(S),w=new Me.Euler(0,0,l.rotation[2],"ZYX"),x=zy(t,m,j,ny.SPHERE_MODEL),v=Object(f.a)(a.entries());try{var A=function(){var a=Object(u.a)(g.value,2),o=a[0],i=a[1],r=e.id+"-"+o,n=i[0].clone().applyEuler(w),s=i[1].clone().applyEuler(w),d=i[2].clone().applyEuler(w),f=(new Me.Vector3).subVectors(s,n),h=(new Me.Vector3).subVectors(d,n),p=(new Me.Vector3).subVectors(d,s),y=f.length(),m=(new Me.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=O.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),O.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new Me.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),j=(new Me.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),H=new Me.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+xy);H.add(P).add(j),P.multiplyScalar(2),j.multiplyScalar(2);for(var z=new Me.Vector3,D=Ry(c.ground,S.getMonth(),T,x),M=T.dot(t),W=0;W0&&(z.copy(H).add(I).add(j.clone().multiplyScalar(C)),N(r,z,t)||(A[W][C]+=M*x))};for(v.s();!(g=v.n()).done;)A()}catch(T){v.e(T)}finally{v.f()}}}}},ee=function(e){if(e.roofType!==It.Hip)throw new Error("roof is not hip");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=!0,r=a[0][0].z,n=Object(f.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,h=Object(f.a)(d);try{for(h.s();!(s=h.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){h.e(T)}finally{h.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Tw.dayOfYear(S),w=new Me.Euler(0,0,l.rotation[2],"ZYX"),x=zy(t,m,j,ny.SPHERE_MODEL),v=Object(f.a)(a.entries());try{var A=function(){var a=Object(u.a)(g.value,2),o=a[0],i=a[1],r=e.id+"-"+o,n=i[0].clone().applyEuler(w),s=i[1].clone().applyEuler(w),d=i[2].clone().applyEuler(w),f=(new Me.Vector3).subVectors(s,n),h=(new Me.Vector3).subVectors(d,n),p=(new Me.Vector3).subVectors(d,s),y=f.length(),m=(new Me.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=O.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),O.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new Me.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),j=(new Me.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),H=new Me.Vector3,z=new Me.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+xy);z.add(P).add(j),P.multiplyScalar(2),j.multiplyScalar(2);for(var D=Ry(c.ground,S.getMonth(),T,x),M=T.dot(t),W=0;W0&&(H.copy(z).add(I).add(j.clone().multiplyScalar(C)),N(r,H,t)||(A[W][C]+=M*x))};for(v.s();!(g=v.n()).done;)A()}catch(T){v.e(T)}finally{v.f()}}}}},le=function(e){if(e.roofType!==It.Gable)throw new Error("roof is not gable");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=Tw.dayOfYear(S),r=new Me.Euler(0,0,l.rotation[2],"ZYX"),n=zy(t,i,j,ny.SPHERE_MODEL),s=Object(f.a)(a.entries());try{var d=function(){var a=Object(u.a)(o.value,2),i=a[0],s=a[1],d=e.id+"-"+i,f=s[0].clone().applyEuler(r),h=s[1].clone().applyEuler(r),p=s[2].clone().applyEuler(r),y=(new Me.Vector3).subVectors(h,f),g=(new Me.Vector3).subVectors(p,f),m=(new Me.Vector3).subVectors(p,h),w=y.length(),x=(new Me.Vector3).crossVectors(g,m).length()/w,v=Math.max(2,Math.round(w/R)),b=Math.max(2,Math.round(x/R)),A=O.current.get(d);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),O.current.set(d,A)),y.normalize(),g.normalize(),m.normalize();var T=(new Me.Vector3).crossVectors(g,m).normalize(),P=y.multiplyScalar(.5*w/v),j=(new Me.Vector3).crossVectors(T,y).normalize().multiplyScalar(.5*x/b),H=new Me.Vector3(l.cx+f.x,l.cy+f.y,l.lz+f.z+xy);H.add(P).add(j),P.multiplyScalar(2),j.multiplyScalar(2);for(var z=new Me.Vector3,D=Ry(c.ground,S.getMonth(),T,n),M=T.dot(t),W=0;W0&&(z.copy(H).add(I).add(j.clone().multiplyScalar(C)),N(d,z,t)||(A[W][C]+=M*n))};for(s.s();!(o=s.n()).done;)d()}catch(h){s.e(h)}finally{s.f()}}}},ae=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=p(e);if(!l)throw new Error("parent of solar panel does not exist");var a=e.parentType===V.Roof,o=e.parentType===V.Wall;if(a&&!(l=y(l)))throw new Error("foundation of solar panel does not exist");var i=Tw.dayOfYear(S),r=o?Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l,y(e),e.lz):Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l),n=l.rotation[2],s=n+e.relativeAzimuth,d=e.tiltAngle,u=!0;if(a&&(r.z=e.cz+e.lz+.02+l.cz+l.lz/2,Tw.isZero(e.rotation[0])?r.z+=e.poleHeight:(d=e.rotation[0],s=n,u=!1)),o&&!Tw.isZero(e.tiltAngle)){var f=l,h=y(l),g=(h?h.rotation[2]+f.relativeAngle:f.relativeAngle)-vt,m=e.ly*Math.abs(Math.sin(e.tiltAngle))/2;r.x+=m*Math.cos(g),r.y+=m*Math.sin(g)}var w=(new Me.Vector3).fromArray(e.normal),x=e.lx,v=e.ly,b=Math.max(2,Math.round(e.lx/R)),A=Math.max(2,Math.round(e.ly/R)),T=x/b,P=v/A,H=r.x-(x-R)/2,z=r.y-(v-R)/2,D=a||o?r.z:l.lz+e.poleHeight+e.lz,M=new Me.Vector2(r.x,r.y),W=new Me.Vector3,I=O.current.get(e.id);I&&I.length===b&&I[0].length===A||(I=Array(b).fill(0).map((function(){return Array(A).fill(0)})),O.current.set(e.id,I));var C=new Me.Euler(a&&!u?0:d,0,s,"ZYX");if(e.trackerType!==te.NO_TRACKER){var F=n?t.clone().applyAxisAngle(Rt,-n):t.clone();switch(e.trackerType){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var k=(new Me.Quaternion).setFromUnitVectors(Rt,F);(C=(new Me.Euler).setFromQuaternion(k)).z+=s;break;case te.HORIZONTAL_SINGLE_AXIS_TRACKER:var Y=(new Me.Quaternion).setFromUnitVectors(Rt,new Me.Vector3(F.x,0,F.z).normalize());(C=(new Me.Euler).setFromQuaternion(Y)).z+=s;break;case te.VERTICAL_SINGLE_AXIS_TRACKER:if(Math.abs(e.tiltAngle)>.001){var L=new Me.Vector3(F.x,-F.y,0).normalize(),E=Math.acos(Ht.dot(L))*Math.sign(L.x);C=new Me.Euler(e.tiltAngle,0,E+n,"ZYX")}break;case te.TILTED_SINGLE_AXIS_TRACKER:}}w.applyEuler(C),a&&!u&&(C.x=e.rotation[0],C.z=e.rotation[2]+n),o&&(C.x=vt+e.tiltAngle,C.z=l.relativeAngle+n);for(var U=zy(t,i,j,ny.SPHERE_MODEL),J=Ry(c.ground,S.getMonth(),w,U),G=w.dot(t),X=new Me.Vector2,B=new Me.Vector3,K=0;K0&&(X.set(H+K*T,z+q*P),B.set(X.x-M.x,X.y-M.y,0),B.applyEuler(C),W.set(r.x+B.x,r.y+B.y,D+B.z),N(e.id,W,t)||(I[K][q]+=G*U))}},oe=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=p(e);if(!l)throw new Error("parent of parabolic trough does not exist");var a=Tw.dayOfYear(S),o=Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l),i=(new Me.Vector3).fromArray(e.normal),r=i.clone(),n=e.lx,s=e.ly,d=n*n/(4*e.latusRectum),u=e.poleHeight+n/2,f=Math.max(2,Math.round(e.lx/R)),h=Math.max(2,Math.round(e.ly/R)),y=n/f,g=s/h,m=o.x-(n-R)/2,w=o.y-(s-R)/2,x=l.lz+u+e.lz+d,v=new Me.Vector2(o.x,o.y),b=new Me.Vector3,A=O.current.get(e.id);A&&A.length===f&&A[0].length===h||(A=Array(f).fill(0).map((function(){return Array(h).fill(0)})),O.current.set(e.id,A));var T=l.rotation[2],P=T+e.relativeAzimuth,H=Tw.isZero(P),z=H?1:Math.cos(P),D=H?0:Math.sin(P),M=T?t.clone().applyAxisAngle(Rt,-T):t.clone(),W=(new Me.Quaternion).setFromUnitVectors(Rt,new Me.Vector3(M.x*z,M.x*D,M.z).normalize()),I=(new Me.Euler).setFromQuaternion(W);i.copy(r.clone().applyEuler(I));for(var C=zy(t,a,j,ny.SPHERE_MODEL),F=Ry(c.ground,S.getMonth(),i,C),k=i.dot(t),Y=new Me.Vector2,L=new Me.Vector3,E=0,U=0,V=1,J=4/(e.latusRectum*e.latusRectum),G=0;G0&&(Y.set(E,w+X*g),H||Y.rotateAround(v,P),L.set(Y.x-v.x,Y.y-v.y,0),L.applyEuler(I),b.set(o.x+L.x,o.y+L.y,x+L.z),N(e.id,b,t)||(A[G][X]+=k*C*V))}}},ie=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=p(e);if(!l)throw new Error("parent of parabolic dish does not exist");var a=Tw.dayOfYear(S),o=Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l),i=(new Me.Vector3).fromArray(e.normal),r=i.clone(),n=e.lx,s=e.ly,d=n*n/(4*e.latusRectum),u=e.poleHeight+n/2,f=Math.max(2,Math.round(e.lx/R)),h=Math.max(2,Math.round(e.ly/R)),y=n/f,g=s/h,m=o.x-(n-R)/2,w=o.y-(s-R)/2,x=l.lz+u+e.lz+d,v=new Me.Vector2(o.x,o.y),b=new Me.Vector3,A=O.current.get(e.id);A&&A.length===f&&A[0].length===h||(A=Array(f).fill(0).map((function(){return Array(h).fill(0)})),O.current.set(e.id,A));var T=l.rotation[2],P=T+e.relativeAzimuth,H=Tw.isZero(P),z=T?t.clone().applyAxisAngle(Rt,-T):t.clone(),D=(new Me.Quaternion).setFromUnitVectors(Rt,z),M=(new Me.Euler).setFromQuaternion(D);i.copy(r.clone().applyEuler(M));for(var W=zy(t,a,j,ny.SPHERE_MODEL),I=Ry(c.ground,S.getMonth(),i,W),C=i.dot(t),F=new Me.Vector2,k=new Me.Vector3,Y=0,L=0,E=0,U=0,V=1,J=4/(e.latusRectum*e.latusRectum),G=0;Gn/2))for(var X=0;Xs/2||(A[G][X]+=I,C>0&&(F.set(Y,L),H||F.rotateAround(v,P),k.set(F.x-v.x,F.y-v.y,0),k.applyEuler(M),b.set(o.x+k.x,o.y+k.y,x+k.z),N(e.id,b,t)||(V=1/Math.sqrt(1+(E*E+U*U)*J),A[G][X]+=C*W*V)))}},re=function(e){var t,l=jy(S,c.latitude);if(!(l.z0&&(B.set(q,b+Z*w),K.set(B.x-T.x,B.y-T.y,0),K.applyEuler(z),P.set(n.x+K.x,n.y+K.y,A+K.z),N(e.id,P,l)||N(e.id,P,D)||(H[Q][Z]+=X*U))}else for(var _=0;_0&&(B.set(q,b+$*w),K.set(B.x-T.x,B.y-T.y,0),K.applyEuler(z),P.set(n.x+K.x,n.y+K.y,A+K.z),N(e.id,P,l)||(H[_][$]+=X*U))}}}}},ne=function(e){var t,l=jy(S,c.latitude);if(!(l.z0&&(L.set(U,b+X*w),E.set(L.x-T.x,L.y-T.y,0),E.applyEuler(D),P.set(n.x+E.x,n.y+E.y,A+E.z),N(e.id,P,l)||N(e.id,P,z)||(H[J][X]+=Y*F))}else for(var B=0;B0&&(L.set(U,b+K*w),E.set(L.x-T.x,L.y-T.y,0),E.applyEuler(D),P.set(n.x+E.x,n.y+E.y,A+E.z),N(e.id,P,l)||(H[B][K]+=Y*F))}}}}},ce=function(e){var t=e.solarUpdraftTower;if(t){var l=jy(S,c.latitude);if(!(l.z<=0)){var a=Tw.dayOfYear(S),o=(new Me.Vector3).fromArray(e.normal),i=t.collectorRadius,r=Math.max(2,Math.round(2*i/R)),n=e.cx-i+R/2,s=e.cy-i+R/2,d=e.lz+t.collectorHeight,u=e.id+"-sut",f=O.current.get(u);f&&f.length===r&&f[0].length===r||(f=Array(r).fill(0).map((function(){return Array(r).fill(0)})),O.current.set(u,f));for(var h,p,y=zy(l,a,j,ny.SPHERE_MODEL),g=Ry(c.ground,S.getMonth(),o,y),m=new Me.Vector3(0,0,d),w=o.dot(l),x=i*i,v=0;vx||(f[v][b]+=g,w>0&&(N(u,m,l)||(f[v][b]+=w*y)))}}}};return Object(gf.jsx)(gf.Fragment,{})},Pk=n.a.memo(Tk),Sk=function(e){var t,l,a,i,n=e.city,c=Ew(si),s=Tf(yf),d=Ew(Gi),h=Ew(Vi),p=Ew.getState().world,y=Ew.getState().elements,g=Ew(Cs),m=Ew($r),w=Pf(yd),x=Ew(ec),v=Pf(wd),b=Ew(tc),A=Ew(pd),T=Ew(md),P=Pf(vd),S=Tf(sd),j=Tf(dd),H=Tf(ud),z=Tf(fd),R=Ew(o.showDailyParabolicTroughYieldPanel),D=Object(Se.f)().scene,M=Object(r.useMemo)((function(){return{lng:h}}),[h]),W=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===W||void 0===W?void 0:W.elevation:0,O=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,F=60/O,k=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/k,L=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),E=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,N=Object(r.useRef)([]),J=Object(r.useRef)([]),G=Object(r.useRef)(0),X=Object(r.useRef)(!1),B=Object(r.useRef)(new Date(p.date)),K=Object(r.useRef)(new Map),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(0),Z=Object(r.useRef)(!1),_=Object(r.useRef)(new Date(p.date)),$=Object(r.useMemo)((function(){return Ty(I,p.latitude)}),[p.date,p.latitude]),ee=Object(r.useRef)($),te=Tw.daysInYear(I)/12;Object(r.useEffect)((function(){if(S)return le(),G.current=requestAnimationFrame(ae),function(){cancelAnimationFrame(G.current),X.current||(Kh(me.t("message.SimulationAborted",M)),c((function(e){e.world.date=B.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),Z.current=!1}}),[S]),Object(r.useEffect)((function(){Z.current=H,H?(_.current=new Date(I.getTime()),cancelAnimationFrame(G.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(s("simulationPaused",!1),ae())}),[H]);var le=function(){Z.current?(I.setTime(_.current.getTime()),Z.current=!1):(B.current=new Date(p.date),I.setHours(Math.floor($.sunrise/60),F/2-30)),X.current=!1,ye(),ge()},ae=function e(){if(S&&!Z.current){if(I.getMinutes()+60*I.getHours()>=$.sunset)return cancelAnimationFrame(G.current),c((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showDailyParabolicTroughYieldPanel=!0,e.selectedFloatingWindow="dailyParabolicTroughYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,oe(),void(d&&c((function(e){var t=Pf.getState().sumDailyParabolicTroughYield();e.actionInfo={name:"Daily Simulation for Parabolic Troughs Completed",result:{totalYield:t},details:Pf.getState().dailyParabolicTroughYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+F),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(f.a)(y);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.ParabolicTrough&&de(a)}}catch(o){l.e(o)}finally{l.f()}G.current=requestAnimationFrame(e)}},oe=function(){var e,t=ue(),l=Object(f.a)(y);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.ParabolicTrough){var o=a,i=K.current.get(o.id);if(i)for(var r=he(o)*t,n=0;n0&&(W.set(x+k*h,v+Y*y),c||W.rotateAround(A,n),O.set(W.x-A.x,W.y-A.y,0),O.applyEuler(R),T.set(o.x+O.x,o.y+O.y,b+O.z),pe(e.id,T,t)||(F+=M*D));var L=K.current.get(e.id);if(L)L[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=F/(u*f)}}},ue=function(){var e=$.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},fe=function(){var e=ee.current.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},he=function(e){return e.lx*e.ly*e.opticalEfficiency*e.thermalEfficiency*e.absorptance*e.reflectance*(1-E[I.getMonth()])},pe=function(e,t,l){if(N.current.length>1){J.current.length=0,L.set(t,l);var a=N.current.filter((function(t){return t.uuid!==e}));return L.intersectObjects(a,!1,J.current),J.current.length>0}return!1},ye=function(){var e=D.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;N.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,N.current)}}catch(i){a.e(i)}finally{a.f()}}},ge=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.ParabolicTrough){var a=K.current.get(l.id);a?a.fill(0):K.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},we=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.ParabolicTrough){var a=q.current.get(l.id);a&&a.length===k?a.fill(0):q.current.set(l.id,new Array(k).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(gf.jsx)(gf.Fragment,{})},jk=n.a.memo(Sk),Hk=function(e){var t,l,a,i,n=e.city,c=Ew(si),s=Tf(yf),d=Ew(Gi),h=Ew(Vi),p=Ew.getState().world,y=Ew.getState().elements,g=Ew(Cs),m=Ew($r),w=Pf(uu),x=Ew(ec),v=Pf(pu),b=Ew(tc),A=Ew(du),T=Ew(hu),P=Pf(gu),S=Tf(iu),j=Tf(ru),H=Tf(nu),z=Tf(cu),R=Ew(o.showDailyParabolicDishYieldPanel),D=Object(Se.f)().scene,M=Object(r.useMemo)((function(){return{lng:h}}),[h]),W=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===W||void 0===W?void 0:W.elevation:0,O=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,F=60/O,k=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/k,L=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),E=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,N=Object(r.useRef)([]),J=Object(r.useRef)([]),G=Object(r.useRef)(0),X=Object(r.useRef)(!1),B=Object(r.useRef)(new Date(p.date)),K=Object(r.useRef)(new Map),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(0),Z=Object(r.useRef)(!1),_=Object(r.useRef)(new Date(p.date)),$=Object(r.useMemo)((function(){return Ty(I,p.latitude)}),[p.date,p.latitude]),ee=Object(r.useRef)($),te=Tw.daysInYear(I)/12;Object(r.useEffect)((function(){if(S)return le(),G.current=requestAnimationFrame(ae),function(){cancelAnimationFrame(G.current),X.current||(Kh(me.t("message.SimulationAborted",M)),c((function(e){e.world.date=B.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),Z.current=!1}}),[S]),Object(r.useEffect)((function(){Z.current=H,H?(_.current=new Date(I.getTime()),cancelAnimationFrame(G.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(s("simulationPaused",!1),ae())}),[H]);var le=function(){Z.current?(I.setTime(_.current.getTime()),Z.current=!1):(B.current=new Date(p.date),I.setHours(Math.floor($.sunrise/60),F/2-30)),X.current=!1,ye(),ge()},ae=function e(){if(S&&!Z.current){if(I.getMinutes()+60*I.getHours()>=$.sunset)return cancelAnimationFrame(G.current),c((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showDailyParabolicDishYieldPanel=!0,e.selectedFloatingWindow="dailyParabolicDishYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForParabolicDishes=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,oe(),void(d&&c((function(e){var t=Pf.getState().sumDailyParabolicDishYield();e.actionInfo={name:"Daily Simulation for Parabolic Dishes Completed",result:{totalYield:t},details:Pf.getState().dailyParabolicDishYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+F),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(f.a)(y);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.ParabolicDish&&de(a)}}catch(o){l.e(o)}finally{l.f()}G.current=requestAnimationFrame(e)}},oe=function(){var e,t=ue(),l=Object(f.a)(y);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.ParabolicDish){var o=a,i=K.current.get(o.id);if(i)for(var r=he(o)*t,n=0;n0&&(D.set(g+O*u,w+F*f),P||D.rotateAround(v,T),M.set(D.x-v.x,D.y-v.y,0),M.applyEuler(H),b.set(o.x+M.x,o.y+M.y,x+M.z),pe(e.id,b,t)||(W+=R*z));var k=K.current.get(e.id);if(k)k[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=W/(s*d)}}},ue=function(){var e=$.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},fe=function(){var e=ee.current.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},he=function(e){return e.lx*e.ly*e.opticalEfficiency*e.thermalEfficiency*e.absorptance*e.reflectance*(1-E[I.getMonth()])},pe=function(e,t,l){if(N.current.length>1){J.current.length=0,L.set(t,l);var a=N.current.filter((function(t){return t.uuid!==e}));return L.intersectObjects(a,!1,J.current),J.current.length>0}return!1},ye=function(){var e=D.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;N.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,N.current)}}catch(i){a.e(i)}finally{a.f()}}},ge=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.ParabolicDish){var a=K.current.get(l.id);a?a.fill(0):K.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},we=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.ParabolicDish){var a=q.current.get(l.id);a&&a.length===k?a.fill(0):q.current.set(l.id,new Array(k).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(gf.jsx)(gf.Fragment,{})},zk=n.a.memo(Hk),Rk=function(e){var t,l,a,i,n=e.city,c=Ew(si),s=Tf(yf),d=Ew(Gi),h=Ew(Vi),p=Ew.getState().world,y=Ew.getState().elements,g=Ew(Cs),m=Ew($r),w=Pf(Hd),x=Ew(ec),v=Ew(jd),b=Pf(Dd),A=Ew(tc),T=Ew(Rd),P=Pf(Wd),S=Tf(bd),j=Tf(Ad),H=Tf(Td),z=Tf(Pd),R=Ew(o.showDailyFresnelReflectorYieldPanel),D=Object(Se.f)().scene,M=Object(r.useMemo)((function(){return{lng:h}}),[h]),W=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===W||void 0===W?void 0:W.elevation:0,O=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,F=60/O,k=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/k,L=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),E=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,N=Object(r.useRef)([]),J=Object(r.useRef)([]),X=Object(r.useRef)(0),B=Object(r.useRef)(!1),K=Object(r.useRef)(new Date(p.date)),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(new Map),Z=Object(r.useRef)(0),_=Object(r.useRef)(!1),$=Object(r.useRef)(new Date(p.date)),ee=Object(r.useMemo)((function(){return Ty(I,p.latitude)}),[p.date,p.latitude]),te=Object(r.useRef)(ee),le=Tw.daysInYear(I)/12;Object(r.useEffect)((function(){if(S)return ae(),X.current=requestAnimationFrame(oe),function(){cancelAnimationFrame(X.current),B.current||(Kh(me.t("message.SimulationAborted",M)),c((function(e){e.world.date=K.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),_.current=!1}}),[S]),Object(r.useEffect)((function(){_.current=H,H?($.current=new Date(I.getTime()),cancelAnimationFrame(X.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(s("simulationPaused",!1),oe())}),[H]);var ae=function(){_.current?(I.setTime($.current.getTime()),_.current=!1):(K.current=new Date(p.date),I.setHours(Math.floor(ee.sunrise/60),F/2-30)),B.current=!1,ge(),we()},oe=function e(){if(S&&!_.current){if(I.getMinutes()+60*I.getHours()>=ee.sunset)return cancelAnimationFrame(X.current),c((function(e){e.world.date=K.current.toLocaleString("en-US"),e.viewState.showDailyFresnelReflectorYieldPanel=!0,e.selectedFloatingWindow="dailyFresnelReflectorYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),B.current=!0,ie(),void(d&&c((function(e){var t=Pf.getState().sumDailyFresnelReflectorYield();e.actionInfo={name:"Daily Simulation for Fresnel Reflectors Completed",result:{totalYield:t},details:Pf.getState().dailyFresnelReflectorYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+F),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(f.a)(y);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.FresnelReflector&&ue(a)}}catch(o){l.e(o)}finally{l.f()}X.current=requestAnimationFrame(e)}},ie=function(){var e,t=fe(),l=Object(f.a)(y);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.FresnelReflector){var o=a,i=q.current.get(o.id);if(i)for(var r=pe(o)*t,n=0;n0&&(L.set(J,A+B*v),E.set(L.x-P.x,L.y-P.y,0),E.applyEuler(r),S.set(s.x+E.x,s.y+E.y,T+E.z),ye(e.id,S,l)||ye(e.id,S,n)||(N+=Y*k))}var K=q.current.get(e.id);if(K)K[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=N/(g*w)}}}},fe=function(){var e=ee.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},he=function(){var e=te.current.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},pe=function(e){var t=m(e);if(!t)throw new Error("parent of Fresnel reflector does not exist");var l=1;if(t.type===V.Foundation){var a,o,i,r=t.solarAbsorberPipe;l*=(null!==(a=null===r||void 0===r?void 0:r.absorberOpticalEfficiency)&&void 0!==a?a:.7)*(null!==(o=null===r||void 0===r?void 0:r.absorberThermalEfficiency)&&void 0!==o?o:.3)*(null!==(i=null===r||void 0===r?void 0:r.absorberAbsorptance)&&void 0!==i?i:.95)}return e.lx*e.ly*e.reflectance*l*(1-E[I.getMonth()])},ye=function(e,t,l){if(N.current.length>1){J.current.length=0,L.set(t,l);var a=N.current.filter((function(t){return t.uuid!==e}));return L.intersectObjects(a,!1,J.current),J.current.length>0}return!1},ge=function(){var e=D.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;N.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,N.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.FresnelReflector){var a=q.current.get(l.id);a?a.fill(0):q.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},xe=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.FresnelReflector){var a=Q.current.get(l.id);a&&a.length===k?a.fill(0):Q.current.set(l.id,new Array(k).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(gf.jsx)(gf.Fragment,{})},Dk=n.a.memo(Rk),Mk=function(e){var t,l,a,i,n=e.city,c=Ew(si),s=Tf(yf),d=Ew(Gi),h=Ew(Vi),p=Ew.getState().world,y=Ew.getState().elements,g=Ew(Cs),m=Ew($r),w=Pf(Ld),x=Ew(ec),v=Ew(Yd),b=Pf(Nd),A=Ew(tc),T=Ew(Ud),P=Pf(Jd),S=Tf(Id),j=Tf(Cd),H=Tf(Od),z=Tf(Fd),R=Ew(o.showDailyHeliostatYieldPanel),D=Object(Se.f)().scene,M=Object(r.useMemo)((function(){return{lng:h}}),[h]),W=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===W||void 0===W?void 0:W.elevation:0,O=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,F=60/O,k=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/k,L=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),E=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,N=Object(r.useRef)([]),J=Object(r.useRef)([]),X=Object(r.useRef)(0),B=Object(r.useRef)(!1),K=Object(r.useRef)(new Date(p.date)),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(new Map),Z=Object(r.useRef)(0),_=Object(r.useRef)(!1),$=Object(r.useRef)(new Date(p.date)),ee=Object(r.useMemo)((function(){return Ty(I,p.latitude)}),[p.date,p.latitude]),te=Object(r.useRef)(ee),le=Tw.daysInYear(I)/12;Object(r.useEffect)((function(){if(S)return ae(),X.current=requestAnimationFrame(oe),function(){cancelAnimationFrame(X.current),B.current||(Kh(me.t("message.SimulationAborted",M)),c((function(e){e.world.date=K.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),_.current=!1}}),[S]),Object(r.useEffect)((function(){_.current=H,H?($.current=new Date(I.getTime()),cancelAnimationFrame(X.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(s("simulationPaused",!1),oe())}),[H]);var ae=function(){_.current?(I.setTime($.current.getTime()),_.current=!1):(K.current=new Date(p.date),I.setHours(Math.floor(ee.sunrise/60),F/2-30)),B.current=!1,ge(),we()},oe=function e(){if(S&&!_.current){if(I.getMinutes()+60*I.getHours()>=ee.sunset)return cancelAnimationFrame(X.current),c((function(e){e.world.date=K.current.toLocaleString("en-US"),e.viewState.showDailyHeliostatYieldPanel=!0,e.selectedFloatingWindow="dailyHeliostatYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForHeliostats=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),B.current=!0,ie(),void(d&&c((function(e){var t=Pf.getState().sumDailyHeliostatYield();e.actionInfo={name:"Daily Simulation for Heliostats Completed",result:{totalYield:t},details:Pf.getState().dailyHeliostatYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+F),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(f.a)(y);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Heliostat&&ue(a)}}catch(o){l.e(o)}finally{l.f()}X.current=requestAnimationFrame(e)}},ie=function(){var e,t=fe(),l=Object(f.a)(y);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Heliostat){var o=a,i=q.current.get(o.id);if(i)for(var r=pe(o)*t,n=0;n0&&(W.set(k,A+L*v),O.set(W.x-P.x,W.y-P.y,0),O.applyEuler(n),S.set(s.x+O.x,s.y+O.y,T+O.z),ye(e.id,S,l)||ye(e.id,S,r)||(F+=M*D))}var E=q.current.get(e.id);if(E)E[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=F/(g*w)}}}},fe=function(){var e=ee.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},he=function(){var e=te.current.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},pe=function(e){var t=m(e);if(!t)throw new Error("parent of heliostat does not exist");var l=1;if(t.type===V.Foundation){var a,o,i,r=t.solarPowerTower;l*=(null!==(a=null===r||void 0===r?void 0:r.receiverOpticalEfficiency)&&void 0!==a?a:.7)*(null!==(o=null===r||void 0===r?void 0:r.receiverThermalEfficiency)&&void 0!==o?o:.3)*(null!==(i=null===r||void 0===r?void 0:r.receiverAbsorptance)&&void 0!==i?i:.95)}return e.lx*e.ly*e.reflectance*l*(1-E[I.getMonth()])},ye=function(e,t,l){if(N.current.length>1){J.current.length=0,L.set(t,l);var a=N.current.filter((function(t){return t.uuid!==e}));return L.intersectObjects(a,!1,J.current),J.current.length>0}return!1},ge=function(){var e=D.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;N.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,N.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Heliostat){var a=q.current.get(l.id);a?a.fill(0):q.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},xe=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Heliostat){var a=Q.current.get(l.id);a&&a.length===k?a.fill(0):Q.current.set(l.id,new Array(k).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(gf.jsx)(gf.Fragment,{})},Wk=n.a.memo(Mk),Ik=function(e){var t,l,a,n,c,s=e.city,d=Ew(si),h=Tf(yf),p=Ew(Gi),y=Ew(Vi),g=Ew.getState().world,m=Ew.getState().elements,w=Ew(Cs),x=Pf(ou),v=Pf(_d),b=Pf($d),A=Pf(lu),T=Tf(Gd),P=Tf(Bd),S=Tf(Xd),j=Tf(Kd),H=Ew(o.showDailyUpdraftTowerYieldPanel),z=Ew(i.noAnimationForSolarUpdraftTowerSimulation),R=null!==(t=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,D=null!==(l=g.sutGridCellSize)&&void 0!==l?l:1,M=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:y}}),[y]),I=Object(r.useMemo)((function(){return w(null!==s&&void 0!==s?s:"Boston MA, USA")}),[s]),C=new Date(g.date),O=s?null===(a=w(s))||void 0===a?void 0:a.elevation:0,F=null!==(n=g.sutTimesPerHour)&&void 0!==n?n:4,k=60/F,Y=null!==(c=g.sutDaysPerYear)&&void 0!==c?c:6,L=12/Y,E=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),U=Object(r.useRef)([]),N=Object(r.useRef)([]),J=Object(r.useRef)(0),X=Object(r.useRef)(!1),B=Object(r.useRef)(new Date(g.date)),K=Object(r.useRef)(new Array(24).fill(0)),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(new Map),Z=Object(r.useRef)(new Map),_=Object(r.useRef)(new Map),$=Object(r.useRef)(0),ee=Object(r.useRef)(!1),te=Object(r.useRef)(new Date(g.date)),le=Object(r.useRef)(0),ae=Object(r.useMemo)((function(){return Ty(C,g.latitude)}),[g.date,g.latitude]),oe=Object(r.useRef)(ae),ie=Tw.daysInYear(C)/12;Object(r.useEffect)((function(){if(T){if(!z||Tw.hasMovingParts(m))return ne(),J.current=requestAnimationFrame(ce),function(){cancelAnimationFrame(J.current),X.current||(Kh(me.t("message.SimulationAborted",W)),d((function(e){e.world.date=B.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),ee.current=!1};re()}}),[T]),Object(r.useEffect)((function(){ee.current=P,P?(te.current=new Date(C.getTime()),cancelAnimationFrame(J.current),h("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(h("simulationPaused",!1),ce())}),[P]);var re=function(){Te(),ge();var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Foundation){var a=l;a.solarStructure===G.UpdraftTower&&a.solarUpdraftTower&&ve(a)}}}catch(o){t.e(o)}finally{t.f()}d((function(e){e.viewState.showDailyUpdraftTowerYieldPanel=!0,e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,se(),p&&d((function(e){var t=Pf.getState().sumDailyUpdraftTowerYield();e.actionInfo={name:"Static Daily Simulation for Updraft Tower Completed",result:{totalYield:t},details:Pf.getState().dailyUpdraftTowerYield,timestamp:(new Date).getTime()}}))},ne=function(){ee.current?(C.setTime(te.current.getTime()),ee.current=!1):(B.current=new Date(g.date),le.current=C.getDay(),C.setHours(Math.floor(ae.sunrise/60),-k/2)),X.current=!1,Te(),ge()},ce=function e(){if(T&&!ee.current){if(C.getMinutes()+60*C.getHours()+(C.getDay()-le.current)*py+k>=ae.sunset)return cancelAnimationFrame(J.current),d((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showDailyUpdraftTowerYieldPanel=!0,e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,se(),void(p&&d((function(e){var t=Pf.getState().sumDailyUpdraftTowerYield();e.actionInfo={name:"Dynamic Daily Simulation for Updraft Tower Completed",result:{totalYield:t},details:Pf.getState().dailyUpdraftTowerYield,timestamp:(new Date).getTime()}})));C.setHours(C.getHours(),C.getMinutes()+k),d((function(e){e.world.date=C.toLocaleString("en-US")}));var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation){var o=a;o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&xe(o)}}}catch(i){l.e(i)}finally{l.f()}J.current=requestAnimationFrame(e)}},se=function(){var e,t=be(),l=Object(f.a)(m);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Foundation){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower){var i,r,n,c=null!==(i=o.solarUpdraftTower.collectorTransmissivity)&&void 0!==i?i:.9,d=null!==(r=o.solarUpdraftTower.turbineEfficiency)&&void 0!==r?r:.3,u=null!==(n=o.solarUpdraftTower.dischargeCoefficient)&&void 0!==n?n:.65,h=Math.PI*o.solarUpdraftTower.chimneyRadius*o.solarUpdraftTower.chimneyRadius,p=Math.PI*o.solarUpdraftTower.collectorRadius*o.solarUpdraftTower.collectorRadius,y=1239.7*h,x=19.6134*o.solarUpdraftTower.chimneyHeight,v=q.current.get(a.id+"-sut"),b=Q.current.get(a.id+"-sut"),A=Z.current.get(a.id+"-sut");if(A&&v&&b){var T=.5*u*d*sy*h,P=new Date(g.date),S=void 0,j=void 0;s&&(S=w(s),j=HT(P,S.lowestTemperatures,S.highestTemperatures));for(var H=0;H0&&H>0&&v[H-1]>z){var M,W,I=(v[H-1]+z)/2,C=(null!==(M=g.airConvectiveCoefficient)&&void 0!==M?M:5)*p*(I-z),O=I+dy,F=O*O*O*O,k=D*D*D*D,Y=(null!==(W=o.solarUpdraftTower.collectorEmissivity)&&void 0!==W?W:.95)*uy*p*(F-k);A[H]-=C+Y,A[H]<0&&(A[H]=0)}var L=A[H]/(y*D),E=D*(1+Math.cbrt(L*L/x))-dy,U=E>z?Math.sqrt(x*((E+dy)/D-1)):0;A[H]=T*U*U*U*.001,v[H]=E,b[H]=U}}}}}}catch(N){l.e(N)}finally{l.f()}de()},de=function(){var e,t=new Map,l=0,a=[],o=Object(f.a)(m);try{for(o.s();!(e=o.n()).done;){var i=e.value;if(i.type===V.Foundation){var r=i;if(r.solarStructure===G.UpdraftTower&&r.solarUpdraftTower){l++;var n=q.current.get(i.id+"-sut");n&&t.set("Temperature Tower"+l,n);var c=Q.current.get(i.id+"-sut");c&&t.set("Wind Speed Tower"+l,c);var s=Z.current.get(i.id+"-sut");s&&(t.set("Tower"+l,s),a.push(i.label?i.label:"Tower"+l))}}}}catch(z){o.e(z)}finally{o.f()}for(var d=[],u=0;u<24;u++){var h={};h.Hour=u;for(var p=1;p<=l;p++){var y,g="Tower"+p;h[a[p-1]]=null===(y=t.get(g))||void 0===y?void 0:y[u]}d.push(h)}b(d);for(var w=[],A=0;A<24;A++){var T={};T.Hour=A,T.T_Ambient=K.current[A];for(var P=1;P<=l;P++){var S,j,H="Temperature Tower"+P;T["T_"+a[P-1]]=null===(S=t.get(H))||void 0===S?void 0:S[A],H="Wind Speed Tower"+P,T["V_"+a[P-1]]=null===(j=t.get(H))||void 0===j?void 0:j[A]}w.push(T)}v(w),x(a)};Object(r.useEffect)((function(){if(S){if(!z||Tw.hasMovingParts(m))return ue(),J.current=requestAnimationFrame(he),function(){cancelAnimationFrame(J.current),X.current||(Kh(me.t("message.SimulationAborted",W)),d((function(e){e.world.date=B.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),ee.current=!1};fe()}}),[S]),Object(r.useEffect)((function(){ee.current=j,j?(te.current=new Date(C.getTime()),cancelAnimationFrame(J.current),h("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(h("simulationPaused",!1),he())}),[j]);var ue=function(){ee.current?(C.setTime(te.current.getTime()),ee.current=!1):(B.current=new Date(g.date),$.current=0,C.setMonth(0,22),le.current=C.getDay(),oe.current=Ty(C,g.latitude),C.setHours(Math.floor(oe.current.sunrise/60),-k/2),d((function(e){e.world.date=C.toLocaleString("en-US")}))),X.current=!1,Te(),ge(),we()},fe=function(){Te(),ge(),we(),B.current=new Date(g.date),$.current=0;for(var e=0;e<12;e+=L){C.setMonth(e,22),oe.current=Ty(C,g.latitude),ge();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation){var o=a;o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&ve(o)}}}catch(i){l.e(i)}finally{l.f()}pe(),$.current++}d((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showYearlyUpdraftTowerYieldPanel=!0,e.selectedFloatingWindow="yearlySolarUpdraftTowerYieldPanel"})),Tf.setState((function(e){e.runYearlySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,ye(),p&&d((function(e){var t=Pf.getState().sumYearlyUpdraftTowerYield();e.actionInfo={name:"Static Yearly Simulation for Updraft Tower Completed",result:{totalYield:t},details:Pf.getState().yearlyUpdraftTowerYield,timestamp:(new Date).getTime()}}))},he=function e(){if(S&&!ee.current)if(C.getMinutes()+60*C.getHours()+(C.getDay()-le.current)*py+k0&&j>0&&r[j-1]>z){var M,W,I=(r[j-1]+z)/2,O=(null!==(M=g.airConvectiveCoefficient)&&void 0!==M?M:5)*v*(I-z),F=I+dy,k=F*F*F*F,Y=D*D*D*D,L=(null!==(W=o.solarUpdraftTower.collectorEmissivity)&&void 0!==W?W:.95)*uy*v*(k-Y);i[j]-=O+L,i[j]<0&&(i[j]=0)}var E=i[j]/(b*D),U=D*(1+Math.cbrt(E*E/A))-dy,N=U>z?Math.sqrt(A*((U+dy)/D-1)):0;i[j]=T*N*N*N*.001,r[j]=U,n[j]=N}var J=_.current.get(o.id+"-sut");if(J){var X=i.reduce((function(e,t){return e+t}),0);J[$.current]+=X}}}}}}catch(B){l.e(B)}finally{l.f()}H&&de()},ye=function(){var e,t=[],l=[],a=0,o=Object(f.a)(m);try{for(o.s();!(e=o.n()).done;){var i=e.value;if(i.type===V.Foundation){var r=i;if(r.solarStructure===G.UpdraftTower&&r.solarUpdraftTower){var n=_.current.get(i.id+"-sut");n&&(t.push(n),l.push(i.label?i.label:"Tower"+ ++a))}}}}catch(v){o.e(v)}finally{o.f()}for(var c=[],s=0;s<12;s+=L){var d={};d.Month=it[s];var h,p=Object(f.a)(t.entries());try{for(p.s();!(h=p.n()).done;){var y=Object(u.a)(h.value,2),g=y[0],w=y[1];d[l[g]]=w[s/L]*ie}}catch(v){p.e(v)}finally{p.f()}c.push(d)}A(c),x(l)},ge=function(){var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Foundation){var a=l;if(a.solarStructure===G.UpdraftTower&&a.solarUpdraftTower){var o=q.current.get(l.id+"-sut");o?o.fill(0):q.current.set(l.id+"-sut",new Array(24).fill(0));var i=Q.current.get(l.id+"-sut");i?i.fill(0):Q.current.set(l.id+"-sut",new Array(24).fill(0));var r=Z.current.get(l.id+"-sut");r?r.fill(0):Z.current.set(l.id+"-sut",new Array(24).fill(0))}}}}catch(n){t.e(n)}finally{t.f()}},we=function(){var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Foundation){var a=l;if(a.solarStructure===G.UpdraftTower&&a.solarUpdraftTower){var o=_.current.get(l.id+"-sut");o&&o.length===Y?o.fill(0):_.current.set(l.id+"-sut",new Array(Y).fill(0))}}}}catch(i){t.e(i)}finally{t.f()}},xe=function(e){var t=e.solarUpdraftTower;if(t){var l=jy(C,g.latitude);if(!(l.zw||(v++,x+=p,m>0&&(Pe(e.id+"-sut",y,l)||(x+=m*h)))}v&&(x/=v);var T=C.getMinutes()>=30?C.getHours()+1===24?0:C.getHours()+1:C.getHours(),P=Math.PI*t.collectorRadius*t.collectorRadius;a[T]+=x*P}}}},ve=function(e){var t=e.solarUpdraftTower;if(t){var l=Z.current.get(e.id+"-sut");if(l)for(var a,o,i=(new Me.Vector3).fromArray(e.normal),r=C.getFullYear(),n=C.getMonth(),c=C.getDate(),s=Tw.dayOfYear(C),d=t.collectorRadius,u=Math.max(2,Math.round(2*d/D)),f=e.cx-d+D/2,h=e.cy-d+D/2,p=e.lz+t.collectorHeight,y=new Me.Vector3(0,0,p),m=d*d,w=0,x=Math.PI*t.collectorRadius*t.collectorRadius,v=0;v<24;v++){for(var b=0;b0){var P=zy(T,s,O,ny.SPHERE_MODEL),S=Ry(g.ground,n,Rt,P),j=i.dot(T);w=0;for(var H=0;Hm||(w++,l[v]+=S,j>0&&(Pe(e.id+"-sut",y,T)||(l[v]+=j*P)))}}}w&&(l[v]/=w),l[v]*=x}}},be=function(){var e=ae.daylight()/60;return e>At?I.sunshineHours[C.getMonth()]/(30*e*F):0},Ae=function(){var e=C.getMonth(),t=oe.current.daylight()/60;return t>At?I.sunshineHours[e]/(30*t*F):0},Te=function(){var e=M.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;U.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,U.current)}}catch(i){a.e(i)}finally{a.f()}}},Pe=function(e,t,l){if(U.current.length>1){N.current.length=0,E.set(t,l);var a=U.current.filter((function(t){return t.uuid!==e}));return E.intersectObjects(a,!1,N.current),N.current.length>0}return!1};return Object(gf.jsx)(gf.Fragment,{})},Ck=n.a.memo(Ik),Ok=function e(t,l){Object(He.a)(this,e),this.position=void 0,this.observer=void 0,this.position=t,this.observer=l},Fk=function(){var e,t=Ew(Vi),l=Ew.getState().world,a=Ew.getState().elements,o=Ew(si),i=Tf(yf),n=Ew($r),c=Ew(_r),s=Tf(Js),d=Object(Se.f)().scene,h={lng:t},p=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),y=null!==(e=l.solarPanelVisibilityGridCellSize)&&void 0!==e?e:.2,g=Object(r.useRef)([]),m=Object(r.useRef)([]),w=Object(r.useRef)([]);Object(r.useEffect)((function(){s&&a&&a.length>0&&(x(),i("runSolarPanelVisibilityAnalysis",!1),o((function(e){e.viewState.showSolarPanelVisibilityResultsPanel=!0,e.selectedFloatingWindow="visibilityResultsPanel"})),Kh(me.t("message.SimulationCompleted",h))),i("simulationInProgress",!1)}),[s]);var x=function(){if(Pf.getState().clearSolarPanelVisibilityResults(),function(){g.current=[];var e,t=Object(f.a)(a);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Human){var o=l;if(o.observer){var i=n(o),r=i?Tw.absoluteHumanOrTreeCoordinates(o.cx,o.cy,o.cz,i):new Me.Vector3(o.cx,o.cy,o.cz);r.z+=o.lz,g.current.push(new Ok(r,o))}}}}catch(c){t.e(c)}finally{t.f()}}(),0!==g.current.length){!function(){var e=d.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;m.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,m.current)}}catch(i){a.e(i)}finally{a.f()}}}();var e,t=Object(f.a)(g.current);try{for(t.s();!(e=t.n()).done;){var l,o=e.value,i=new Map,r=Object(f.a)(a);try{for(r.s();!(l=r.n()).done;){var c=l.value;if(c.type===V.SolarPanel){var s=c;i.set(s.parentId,0)}}}catch(b){r.e(b)}finally{r.f()}var u,h=Object(f.a)(a);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.SolarPanel){var y,w=p,x=null!==(y=i.get(w.parentId))&&void 0!==y?y:0;x+=100*v(w,o.position),i.set(w.parentId,x)}}}catch(b){h.e(b)}finally{h.f()}Pf.getState().setSolarPanelVisibilityResult(o,i)}}catch(b){t.e(b)}finally{t.f()}}},v=function(e,t){var l=n(e);if(!l)throw new Error("parent of solar panel does not exist");var a=!1;if(l.type===V.Roof){if(!(l=c(l)))throw new Error("foundation of solar panel does not exist");a=!0}var o=Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l);a&&(o.z=e.cz+l.cz+l.lz/2);var i=(new Me.Vector3).fromArray(e.normal),r=l.rotation[2]+e.relativeAzimuth;Math.abs(e.tiltAngle)>.001&&i.applyEuler(new Me.Euler(e.tiltAngle,0,r,"ZYX"));for(var s,d=e.lx,u=e.ly*Math.cos(e.tiltAngle),f=e.ly*Math.abs(Math.sin(e.tiltAngle)),h=Math.max(2,Math.round(e.lx/y)),p=Math.max(2,Math.round(e.ly/y)),g=d/h,m=u/p,w=f/p,x=o.x-d/2,v=o.y-u/2,A=(a?o.z:e.poleHeight+o.z)-f/2,T=new Me.Vector2(o.x,o.y),P=0,S=new Me.Vector3,j=new Me.Vector3,H=new Me.Vector2,z=Tw.isZero(r),R=0;R0&&(j.normalize(),b(e.id,S,j)&&(P+=Math.abs(j.dot(i))/(s*s)));return P*y*y/(4*Math.PI)},b=function(e,t,l){if(m.current.length>1){w.current.length=0,p.set(t,l);var a=m.current.filter((function(t){return t.uuid!==e}));if(p.intersectObjects(a,!1,w.current),0===w.current.length)return!0;var o,i=Object(f.a)(w.current.entries());try{for(i.s();!(o=i.n()).done;){var r=Object(u.a)(o.value,2),n=r[0];if(r[1].object.name.endsWith("eyeball")&&0===n)return!0}}catch(c){i.e(c)}finally{i.f()}return!1}return!0};return Object(gf.jsx)(gf.Fragment,{})},kk=n.a.memo(Fk),Yk=function(e){var t,l=e.city,a=Ew(si),n=Tf(yf),c=Ew(Gi),s=Ew(Vi),d=Ew.getState().world,h=Ew.getState().elements,p=Ew($r),y=Ew(_r),g=Ew(Cs),m=Ew(Fs),w=Ew(Ys),x=Pf(ju),v=Pf(Au),b=Pf(Pu),A=Tf(mu),T=Tf(wu),P=Tf(xu),S=Tf(vu),j=Ew(o.showDailyLightSensorPanel),H=Ew(i.noAnimationForSensorDataCollection),z=Object(Se.f)().scene,R=Object(r.useMemo)((function(){return{lng:s}}),[s]),D=Object(r.useMemo)((function(){return g(null!==l&&void 0!==l?l:"Boston MA, USA")}),[l]),M=new Date(d.date),W=Object(r.useMemo)((function(){return m(null!==l&&void 0!==l?l:"Boston MA, USA")}),[l]),I=Object(r.useMemo)((function(){return w(null!==l&&void 0!==l?l:"Boston MA, USA")}),[l]),C=l?null===D||void 0===D?void 0:D.elevation:0,O=null!==(t=d.timesPerHour)&&void 0!==t?t:4,F=60/O,k=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Y=Object(r.useRef)([]),L=Object(r.useRef)([]),E=Object(r.useRef)(0),U=Object(r.useRef)(!1),N=Object(r.useRef)(new Date(d.date)),J=Object(r.useRef)(new Map),G=Object(r.useRef)(new Map),X=Object(r.useRef)(new Array(12).fill(0)),B=Object(r.useRef)(new Array(12).fill(0)),K=Object(r.useRef)(0),q=Object(r.useRef)(!1),Q=Object(r.useRef)(new Date(d.date)),Z=Object(r.useRef)(0),_=Object(r.useMemo)((function(){return Ty(M,d.latitude)}),[d.date,d.latitude]),$=Object(r.useRef)(_);Object(r.useEffect)((function(){if(A){if(!H||Tw.hasMovingParts(h))return te(),E.current=requestAnimationFrame(le),function(){cancelAnimationFrame(E.current),U.current||(Kh(me.t("message.SimulationAborted",R)),a((function(e){e.world.date=N.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),q.current=!1};ee()}}),[A]),Object(r.useEffect)((function(){q.current=T,T?(Q.current=new Date(M.getTime()),cancelAnimationFrame(E.current),n("simulationPaused",!0),Kh(me.t("message.SimulationPaused",R))):(n("simulationPaused",!1),le())}),[T]);var ee=function(){ge(),de();var e,t=Object(f.a)(h);try{for(t.s();!(e=t.n()).done;){var l=e.value;l.type===V.Sensor&&he(l)}}catch(o){t.e(o)}finally{t.f()}a((function(e){e.viewState.showDailyLightSensorPanel=!0,e.selectedFloatingWindow="dailyLightSensorPanel"})),Tf.setState((function(e){e.runDailyLightSensor=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",R)),U.current=!0,ae(),c&&a((function(e){e.actionInfo={name:"Static Daily Simulation for Sensors Completed",details:Pf.getState().dailyLightSensorData,timestamp:(new Date).getTime()}}))},te=function(){q.current?(M.setTime(Q.current.getTime()),q.current=!1):(N.current=new Date(d.date),Z.current=M.getDay(),M.setHours(Math.floor(_.sunrise/60),-F/2)),U.current=!1,ge(),de()},le=function e(){if(A&&!q.current){if(M.getMinutes()+60*M.getHours()+(M.getDay()-Z.current)*py+F>=_.sunset)return cancelAnimationFrame(E.current),a((function(e){e.world.date=N.current.toLocaleString("en-US"),e.viewState.showDailyLightSensorPanel=!0,e.selectedFloatingWindow="dailyLightSensorPanel"})),Tf.setState((function(e){e.runDailyLightSensor=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",R)),U.current=!0,ae(),void(c&&a((function(e){e.actionInfo={name:"Dynamic Daily Simulation for Sensors Completed",details:Pf.getState().dailyLightSensorData,timestamp:(new Date).getTime()}})));M.setHours(M.getHours(),M.getMinutes()+F),a((function(e){e.world.date=M.toLocaleString("en-US")}));var t,l=Object(f.a)(h);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.type===V.Sensor&&fe(o)}}catch(i){l.e(i)}finally{l.f()}E.current=requestAnimationFrame(e)}},ae=function(){var e,t=pe(),l=Object(f.a)(h);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Sensor){var o=J.current.get(a.id);if(o)for(var i=0;i0&&(we(e.id,o,t)||(s+=c*n));var u=J.current.get(e.id);if(u)u[M.getMinutes()>=30?M.getHours()+1===24?0:M.getHours()+1:M.getHours()]+=s}},he=function(e){var t=p(e);if(!t)throw new Error("parent of sensor does not exist");var l=J.current.get(e.id);if(l){var a=null;t.type===V.Wall&&(a=y(e));var o=Tw.absoluteCoordinates(e.cx,e.cy,e.cz,t,a||void 0),i=(new Me.Vector3).fromArray(e.normal);i.applyAxisAngle(Rt,t.rotation[2]);for(var r=M.getFullYear(),n=M.getMonth(),c=M.getDate(),s=Tw.dayOfYear(M),u=0;u<24;u++)for(var f=0;f0){var m=zy(g,s,C,ny.SPHERE_MODEL),w=i.dot(g);w>0&&(we(e.id,o,g)||(l[u]+=w*m)),l[u]+=Ry(d.ground,n,i,m)}}}},pe=function(){var e=_.daylight()/60;return e>At?D.sunshineHours[M.getMonth()]/(30*e*O):0},ye=function(){var e=M.getMonth(),t=$.current.daylight()/60;return t>At?(X.current[e]=t,B.current[e]=D.sunshineHours[e]/(30*t),B.current[e]/O):(X.current[e]=0,B.current[e]=0,0)},ge=function(){var e=z.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;Y.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,Y.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(e,t,l){if(Y.current.length>1){L.current.length=0,k.set(t,l);var a=Y.current.filter((function(t){return t.uuid!==e}));return k.intersectObjects(a,!1,L.current),L.current.length>0}return!1};return Object(gf.jsx)(gf.Fragment,{})},Lk=n.a.memo(Yk),Ek=function(e,t){var l=t.efficiency;return"Monocrystalline"===t.cellType&&(l*=.95),l*(1+t.pmaxTC*(e-25))},Uk=function(e){var t,l,a,n,c,s=e.city,d=Ew(si),h=Tf(yf),p=Ew(Gi),y=Ew(Vi),g=Ew.getState().world,m=Ew.getState().elements,w=Ew(Ei),x=Ew(Cs),v=Ew($r),b=Ew(_r),A=Pf(ed),T=Ew(ec),P=Pf(ad),S=Ew(tc),j=Ew($s),H=Ew(ld),z=Pf(id),R=Tf(Xs),D=Tf(Bs),M=Tf(Qs),W=Tf(Ks),I=Tf(qs),C=Tf(Zs),O=Ew(o.showDailyPvYieldPanel),F=Ew(i.noAnimationForSolarPanelSimulation),k=null!==(t=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,Y=Tf(Nr),L=Object(Se.f)().scene,E=Object(r.useMemo)((function(){return{lng:y}}),[y]),U=Object(r.useMemo)((function(){return x(null!==s&&void 0!==s?s:"Boston MA, USA")}),[s]),N=new Date(g.date),J=s?null===U||void 0===U?void 0:U.elevation:0,G=null!==(l=g.timesPerHour)&&void 0!==l?l:4,X=60/G,B=null!==(a=g.daysPerYear)&&void 0!==a?a:6,K=12/B,q=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Q=null!==(n=g.monthlyIrradianceLosses)&&void 0!==n?n:new Array(12).fill(.05),Z=null!==(c=g.pvGridCellSize)&&void 0!==c?c:.25,_=Object(r.useRef)([]),ee=Object(r.useRef)([]),oe=Object(r.useRef)(0),ie=Object(r.useRef)(!1),re=Object(r.useRef)(new Date(g.date)),ne=Object(r.useRef)(new Map),ce=Object(r.useRef)(new Map),se=Object(r.useRef)(0),de=Object(r.useRef)(!1),ue=Object(r.useRef)(new Date(g.date)),fe=Object(r.useRef)(0),he=Object(r.useRef)(20),pe=Object(r.useMemo)((function(){return Ty(N,g.latitude)}),[g.date,g.latitude]),ye=Object(r.useRef)(pe),ge=Tw.daysInYear(N)/12;Object(r.useEffect)((function(){if(R){if(!F||Tw.hasMovingParts(m))return xe(),oe.current=requestAnimationFrame(ve),function(){cancelAnimationFrame(oe.current),ie.current||(Kh(me.t("message.SimulationAborted",E)),d((function(e){e.world.date=re.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),de.current=!1};setTimeout((function(){we(!1)}),50)}}),[R]),Object(r.useEffect)((function(){D&&F&&!Tw.hasMovingParts(m)&&setTimeout((function(){we(!0)}),50)}),[D]),Object(r.useEffect)((function(){de.current=M,M?(ue.current=new Date(N.getTime()),cancelAnimationFrame(oe.current),h("simulationPaused",!0),Kh(me.t("message.SimulationPaused",E))):(h("simulationPaused",!1),ve())}),[M]);var we=function(e){Le(),We();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.SolarPanel&&Re(a)}}catch(n){l.e(n)}finally{l.f()}if(d((function(t){Y||e||(t.viewState.showDailyPvYieldPanel=!0,t.selectedFloatingWindow="dailyPvYieldPanel")})),Tf.setState((function(t){e?t.runDailySimulationForSolarPanelsLastStep=!1:t.runDailySimulationForSolarPanels=!1,t.simulationInProgress=!1,t.simulationPaused=!1})),ie.current=!0,be(),!Y&&!e&&(Kh(me.t("message.SimulationCompleted",E)),p)){var o=Pf.getState().sumDailyPvYield(),i=Pf.getState().getDailyPvProfit(),r=Pf.getState().dailyPvYield;d((function(e){e.actionInfo={name:"Static Daily Simulation for Solar Panels Completed",result:{totalYield:o.toFixed(2),profit:i.toFixed(2)},details:r,timestamp:(new Date).getTime()}}))}},xe=function(){de.current?(N.setTime(ue.current.getTime()),de.current=!1):(re.current=new Date(g.date),fe.current=N.getDay(),N.setHours(Math.floor(pe.sunrise/60),-X/2)),ie.current=!1,Le(),We()},ve=function e(){if(R&&!de.current){if(N.getMinutes()+60*N.getHours()+(N.getDay()-fe.current)*py+X>=pe.sunset){if(cancelAnimationFrame(oe.current),d((function(e){e.world.date=re.current.toLocaleString("en-US"),Y||(e.viewState.showDailyPvYieldPanel=!0,e.selectedFloatingWindow="dailyPvYieldPanel")})),Tf.setState((function(e){e.runDailySimulationForSolarPanels=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),ie.current=!0,be(),!Y&&(Kh(me.t("message.SimulationCompleted",E)),p)){var t=Pf.getState().sumDailyPvYield(),l=Pf.getState().getDailyPvProfit(),a=Pf.getState().dailyPvYield;d((function(e){e.actionInfo={name:"Dynamic Daily Simulation for Solar Panels Completed",result:{totalYield:t.toFixed(2),profit:l.toFixed(2)},details:a,timestamp:(new Date).getTime()}}))}return}N.setHours(N.getHours(),N.getMinutes()+X),d((function(e){e.world.date=N.toLocaleString("en-US")}));var o,i=Object(f.a)(m);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.SolarPanel&&De(r)}}catch(n){i.e(n)}finally{i.f()}oe.current=requestAnimationFrame(e)}},be=function(){var e,t=Ce(),l=Object(f.a)(m);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.SolarPanel){var o=a,i=ne.current.get(a.id);if(i)for(var r=Fe(o)*t,n=0;n0){var B=zy(U,R,J,ny.SPHERE_MODEL),K=Ry(g.ground,H,y,B),q=y.dot(U),Q=new Me.Vector2,_=new Me.Vector3;if(o.bifacialityFactor>0)for(var ee=y.clone().negate(),oe=K+Ry(g.ground,H,ee,B)*o.bifacialityFactor,ie=0;ie0?q:-q*o.bifacialityFactor)*B);else for(var ce=0;ce0&&(Q.set(W+ce*D,I+se*M),_.set(Q.x-O.x,Q.y-O.y,0),_.applyEuler(m),F.set(r.x+_.x,r.y+_.y,C+_.z),Ye(e.id,F,U)||(k[ce][se]+=q*B));var de=0;ke(E);var ue=Ek(he.current,o);switch(o.shadeTolerance){case le.NONE:for(var fe=Number.MAX_VALUE,pe=0;pe0)for(var q=P.clone().negate(),Q=G+Ry(g.ground,S,q,U)*o.bifacialityFactor,_=0;_0?X:-X*o.bifacialityFactor)*U);else for(var oe=0;oe0&&(B.set(R+oe*H,D+ie*z),K.set(B.x-W.x,B.y-W.y,0),K.applyEuler(O),I.set(r.x+K.x,r.y+K.y,M+K.z),Ye(e.id,I,i)||(C[oe][ie]+=X*U));var re=0;switch(o.shadeTolerance){case le.NONE:for(var ce=Number.MAX_VALUE,se=0;se=30?N.getHours()+1===24?0:N.getHours()+1:N.getHours()]+=Te*re/(x*A)}}},We=function(){var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.SolarPanel){var a=ne.current.get(l.id);a?a.fill(0):ne.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},Ie=function(){var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.SolarPanel){var a=ce.current.get(l.id);a&&a.length===B?a.fill(0):ce.current.set(l.id,new Array(B).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},Ce=function(){var e=pe.daylight()/60;return e>At?U.sunshineHours[N.getMonth()]/(30*e*G):0},Oe=function(){var e=ye.current.daylight()/60;return e>At?U.sunshineHours[N.getMonth()]/(30*e*G):0},Fe=function(e){var t;if(!w(e.pvModelName))throw new Error("PV model not found");return e.lx*e.ly*(null!==(t=e.inverterEfficiency)&&void 0!==t?t:.95)*(1-Q[N.getMonth()])},ke=function(e){if(s){var t=x(s);if(t){var l=HT(e,t.lowestTemperatures,t.highestTemperatures);he.current=jT(l.high,l.low,g.diurnalTemperatureModel,k,Ty(e,g.latitude),Tw.minutesIntoDay(e))}}},Ye=function(e,t,l){if(_.current.length>1){ee.current.length=0,q.set(t,l);var a=_.current.filter((function(t){return t.uuid!==e}));return q.intersectObjects(a,!1,ee.current),ee.current.length>0}return!1},Le=function(){var e=L.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;_.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,_.current)}}catch(i){a.e(i)}finally{a.f()}}};return Object(gf.jsx)(gf.Fragment,{})},Nk=n.a.memo(Uk),Vk=function(){var e=Ew(i.latitude),t=Ew(i.longitude),l=Ew(Ls),a=Object(r.useState)("Boston MA, USA"),o=Object(u.a)(a,2),n=o[0],c=o[1];return Object(r.useEffect)((function(){var a;c(null!==(a=l(e,t))&&void 0!==a?a:"Boston MA, USA")}),[e,t]),Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(vk,{city:n}),Object(gf.jsx)(Ak,{city:n}),Object(gf.jsx)(Pk,{city:n}),Object(gf.jsx)(Lk,{city:n}),Object(gf.jsx)(Nk,{city:n}),Object(gf.jsx)(kk,{}),Object(gf.jsx)(jk,{city:n}),Object(gf.jsx)(zk,{city:n}),Object(gf.jsx)(Dk,{city:n}),Object(gf.jsx)(Wk,{city:n}),Object(gf.jsx)(Ck,{city:n})]})},Jk=n.a.memo(Vk),Gk=l(845),Xk=l(862),Bk=l(574),Kk=l(863),qk=l(864),Qk=l(865),Zk=l(866),_k=l(867),$k=l(868),eY=l(869),tY=l(572),lY=l(301),aY=l(571),oY=l(870),iY=l(871),rY=l(872),nY="data:image/png;base64,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",cY=l(338),sY=l(91),dY=l(218),uY=l(557),fY=function(e){var t=e.yScale,l=e.tickLength,a=e.tickIntegers,o=e.variable,i=e.name,n=e.unit,c=e.type,s=e.digits,d=e.min,h=e.max,p=e.step,y=e.value,g=Ew(si),m=Ew(di),w=Ew(Vi),x=Ew(Ss),v=Object(r.useState)(!1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(d),S=Object(r.useRef)(h);Object(r.useEffect)((function(){P.current=d}),[d]),Object(r.useEffect)((function(){S.current=h}),[h]);var j={lng:w},H=m.uid===x.owner,z=t.range(),R=Object(r.useMemo)((function(){var e=z[0]-z[1],o="number"===c?Math.floor(e/l):1;return(a?t.ticks(o).filter((function(e){return Number.isInteger(e)})):t.ticks(o)).map((function(e){return{value:e,yOffset:t(e)}}))}),[t,l,c,a]),D=function(){g((function(e){e.projectInfo.selectedProperty=e.projectInfo.selectedProperty!==o?o:null})),Tf.setState((function(e){e.updateProjectsFlag=!0}))},M=function(){H&&x.owner&&x.title?function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({selectedProperty:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(x.owner,x.title,x.selectedProperty!==o?o:null).then((function(){D()})):D()},W=function(e,t){return Object(gf.jsx)("span",{style:{display:"block",width:t+"px"},children:e})},I=function(){return Object(gf.jsx)("text",{onClick:M,x:0,y:-20,style:{fontSize:"10px",textAnchor:"middle",fill:"dimgray",cursor:"pointer",fontWeight:x.selectedProperty===o?"bold":"normal"},children:i})},C=Object(r.useMemo)((function(){return"yearlyProfit"===o||"unitCost"===o||"sellingPrice"===o||"totalYearlyCost"===o}),[o]);return Object(gf.jsxs)(gf.Fragment,{children:["orientation"!==o?Object(gf.jsx)(pD.a,{content:Object(gf.jsxs)("div",{children:[Object(gf.jsx)($v.a,{style:{width:"240px"},addonBefore:W(me.t("word.Minimum",j)+(C?" $":""),80),addonAfter:n,min:"totalYearlyCost"===o||"totalYearlyYield"===o||"meanYearlyYield"===o||"unitCost"===o||"poleHeight"===o||"interRowSpacing"===o?0:"tiltAngle"===o||"latitude"===o?-90:"rowWidth"===o?1:Number.MIN_SAFE_INTEGER,max:S.current-p,step:p,value:P.current,onChange:function(e){g((function(t){if(t.projectInfo.ranges){var l,a=-1,i=null,r=Object(f.a)(t.projectInfo.ranges.entries());try{for(r.s();!(l=r.n()).done;){var n=Object(u.a)(l.value,2),c=n[0],s=n[1];if(s.variable===o){a=c,i=s;break}}}catch(y){r.e(y)}finally{r.f()}if(a>=0&&i)t.projectInfo.ranges[a]={variable:i.variable,minimum:e,maximum:i.maximum},m.uid&&x.title&&lP(m.uid,x.title,t.projectInfo.ranges);else{var d={variable:o,minimum:e,maximum:h};t.projectInfo.ranges.push(d),m.uid&&x.title&&tP(m.uid,x.title,d)}}else{var p={variable:o,minimum:e,maximum:h};t.projectInfo.ranges=[p],m.uid&&x.title&&tP(m.uid,x.title,p)}})),P.current=e,T(!A)}}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{style:{width:"240px"},addonBefore:W(me.t("word.Maximum",j)+(C?" $":""),80),addonAfter:n,min:P.current+p,max:"tiltAngle"===o||"latitude"===o?90:Number.MAX_SAFE_INTEGER,step:p,value:S.current,onChange:function(e){g((function(t){if(t.projectInfo.ranges){var l,a=-1,i=null,r=Object(f.a)(t.projectInfo.ranges.entries());try{for(r.s();!(l=r.n()).done;){var n=Object(u.a)(l.value,2),c=n[0],s=n[1];if(s.variable===o){a=c,i=s;break}}}catch(y){r.e(y)}finally{r.f()}if(a>=0&&i)t.projectInfo.ranges[a]={variable:i.variable,minimum:i.minimum,maximum:e},m.uid&&x.title&&lP(m.uid,x.title,t.projectInfo.ranges);else{var h={variable:o,minimum:d,maximum:e};t.projectInfo.ranges.push(h),m.uid&&x.title&&tP(m.uid,x.title,h)}}else{var p={variable:o,minimum:d,maximum:e};t.projectInfo.ranges=[p],m.uid&&x.title&&tP(m.uid,x.title,p)}})),S.current=e,T(!A)}})]}),children:I()}):Object(gf.jsx)(gf.Fragment,{children:I()}),void 0!==y&&Object(gf.jsx)("text",{x:0,y:-8,style:{fontSize:"9px",textAnchor:"middle",fill:"dimgray"},children:C?y.toLocaleString("en-US",{style:"currency",currency:"USD",maximumFractionDigits:s})+("yearlyProfit"===o||"totalYearlyCost"===o?"K":""):("orientation"===o?me.t(0===y?"solarPanelMenu.Landscape":"solarPanelMenu.Portrait",j)+(0===y?" (\u25ad)":" (\u25af)"):y.toFixed(s))+(""!==n?n:"")}),Object(gf.jsx)("line",{x1:0,x2:0,y1:t(d),y2:t(h),stroke:"gold",strokeWidth:10,onClick:M,style:{cursor:"pointer"},strokeOpacity:x.selectedProperty===o?.5:0}),Object(gf.jsx)("line",{x1:0,x2:0,y1:t(d),y2:t(h),stroke:"black",strokeWidth:2}),R.map((function(e){var t=e.value,l=e.yOffset;return Object(gf.jsxs)("g",{transform:"translate(0, ".concat(l,")"),shapeRendering:"crispEdges",children:[Object(gf.jsx)("line",{x1:-5,x2:0,stroke:"black",strokeWidth:1}),Object(gf.jsx)("text",{style:{fontSize:"10px",textAnchor:"start",alignmentBaseline:"central",transform:"translateX(-25px)"},children:"orientation"===o?0===t?"\u25ad":"\u25af":t},t)]},t)}))]})},hY=n.a.memo(fY),pY={top:30,right:55,bottom:36,left:55},yY=["#e0ac2b","#e85252","#6689c6","#9a6fb0","#a53253","#69b3a2","#556b2f","#8b008b","#ff1493","#d2691e","#2f4f4f","#dc143c"],gY=function(e){var t=e.id,l=e.width,a=e.height,o=e.data,i=e.types,r=e.minima,n=e.maxima,c=e.steps,s=e.variables,d=e.titles,u=e.units,f=e.digits,p=e.tickIntegers,y=e.hover,g=e.hoveredIndex,m=e.selectedIndex,w=l-pY.right-pY.left,x=a-pY.top-pY.bottom,v=Object(h.a)(new Set(o.map((function(e){return e.group})))),b=cY.b().range([0,w]).domain(s).padding(0),A={};s.forEach((function(e,t){var l,a;A[e]=sY.a().range([x,0]).domain([null!==(l=r[t])&&void 0!==l?l:0,null!==(a=n[t])&&void 0!==a?a:1])}));var T=dY.a().domain(v).range(yY),P=uY.a(),S=o.map((function(e,t){if(e.invisible)return null;var l=s.map((function(t){var l,a=A[t];return[null!==(l=b(t))&&void 0!==l?l:0,a(e[t])]})),a=P(l);return a?Object(gf.jsx)("path",{onMouseOver:function(){y(t)},d:a,stroke:e.hovered?"red":T(e.group),fill:"none",strokeWidth:e.selected?3:1,strokeDasharray:e.hovered?"5,3":"none"},t):void 0})),j=s.map((function(e,t){var l,a=A[e];return Object(gf.jsx)("g",{transform:"translate("+b(e)+",0)",children:Object(gf.jsx)(hY,{yScale:a,tickLength:40,tickIntegers:p[t],type:null!==(l=i[t])&&void 0!==l?l:"number",variable:s[t],name:d[t],unit:u[t],digits:f[t],min:r[t],max:n[t],step:c[t],value:g>=0&&!o[g].invisible?o[g][e]:m>=0&&!o[m].invisible?o[m][e]:void 0})},t)}));return Object(gf.jsx)("svg",{id:t,width:l,height:a,onContextMenu:function(e){e.stopPropagation()},children:Object(gf.jsxs)("g",{width:w,height:x,transform:"translate(".concat([pY.left,pY.top].join(","),")"),children:[S,j]})})},mY=n.a.memo(gY),wY=l(347),xY=l(161),vY=l(830),bY=l(292),AY=Object(mv.a)(LW)(hC||(hC=Object(gv.a)(["\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n"]))),TY=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.symbolSize,o=e.changeHorizontalGrid,i=e.changeVerticalGrid,n=e.changeSymbolSize,c={lng:Ew(Vi)},s=Object(r.useState)(!1),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.SymbolSize",c)+":",Object(gf.jsx)($S.a,{min:1,max:8,tooltipVisible:!1,value:a,onChange:function(e){null===n||void 0===n||n(e)}})]}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:t,onClick:function(){null===o||void 0===o||o(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",c)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:l,onClick:function(){null===i||void 0===i||i(!l)},children:me.t("menu.graph.ShowVerticalGridLines",c)})})]});return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(lb.a,{overlay:p,placement:"bottomRight",visible:f,onVisibleChange:function(e){h(e)},children:Object(gf.jsx)(AY,{style:{top:"120px",right:"16px"},onClick:function(e){e.stopPropagation()}})})})},PY=ET.a.TextArea,SY=db.a.Option,jY=mv.a.div(pC||(pC=Object(gv.a)(["\n position: relative;\n top: 0;\n left: 0;\n width: 100%;\n height: calc(100% - 30px);\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding-bottom: 30px;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n background: white;\n"]))),HY=mv.a.div(yC||(yC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n border: none;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n overflow-y: hidden;\n"]))),zY=mv.a.div(gC||(gC=Object(gv.a)(["\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n"]))),RY=mv.a.div(mC||(mC=Object(gv.a)(["\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n"]))),DY=mv.a.div(wC||(wC=Object(gv.a)(["\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 6px;\n padding-bottom: 6px;\n background: white;\n"]))),MY=mv.a.div(xC||(xC=Object(gv.a)(["\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: flex-start;\n background: white;\n"]))),WY=function(e){var t,l,a,o,i,n,c,s,d,p,y,g,m,w,v,b,A,T,P,S,j,H=e.relativeWidth,R=e.canvas,D=Ew(si),W=Ew(di),I=Ew(Vi),C=Ew(ar),O=Ew(Ss),F=Ew(ff),k=Ew(rf),Y=Object(r.useState)(),L=Object(u.a)(Y,2),E=L[0],U=L[1],N=Object(r.useState)(),V=Object(u.a)(N,2),J=V[0],G=V[1],X=Object(r.useState)(!1),B=Object(u.a)(X,2),K=B[0],q=B[1],Q=Object(r.useState)(!1),Z=Object(u.a)(Q,2),_=Z[0],ee=Z[1],te=Object(r.useRef)(!1),le=Object(r.useRef)(null!==(t=O.description)&&void 0!==t?t:null),ae=Object(r.useRef)(!1),oe=Object(r.useRef)(!1),ie=Object(r.useRef)(null!==(l=O.dataColoring)&&void 0!==l?l:z.ALL),re=Object(r.useRef)(!1),ne=Object(r.useRef)(null!==(a=O.designs)&&void 0!==a?a:[]),ce=Object(r.useRef)(null!==(o=O.thumbnailWidth)&&void 0!==o?o:200),se=Object(r.useRef)(null!==(i=O.xAxisNameScatteredPlot)&&void 0!==i?i:"rowWidth"),de=Object(r.useRef)(null!==(n=O.yAxisNameScatteredPlot)&&void 0!==n?n:"rowWidth"),ue=Object(r.useRef)(null!==(c=O.dotSizeScatteredPlot)&&void 0!==c?c:5),fe=Object(r.useRef)(!0),he=Object(r.useRef)(!0);Object(r.useEffect)((function(){var e;se.current=null!==(e=O.xAxisNameScatteredPlot)&&void 0!==e?e:"rowWidth"}),[O.xAxisNameScatteredPlot]),Object(r.useEffect)((function(){var e;de.current=null!==(e=O.yAxisNameScatteredPlot)&&void 0!==e?e:"rowWidth"}),[O.yAxisNameScatteredPlot]),Object(r.useEffect)((function(){var e;ue.current=null!==(e=O.dotSizeScatteredPlot)&&void 0!==e?e:5}),[O.dotSizeScatteredPlot]),Object(r.useEffect)((function(){var e;ce.current=null!==(e=O.thumbnailWidth)&&void 0!==e?e:200}),[O.thumbnailWidth]);var pe=Object(r.useMemo)((function(){return{lng:I}}),[I]),ye=W.uid===O.owner;Object(r.useEffect)((function(){if(ne.current=[],O.designs){var e,t=Object(f.a)(O.designs);try{for(t.s();!(e=t.n()).done;){var l=e.value;ne.current.push(l)}}catch(i){t.e(i)}finally{t.f()}var a=O.selectedProperty;if(a){var o=O.sortDescending?1:-1;ne.current.sort((function(e,t){return a?"rowWidth"===a&&"rowsPerRack"in e&&"rowsPerRack"in t?o*(e.rowsPerRack-t.rowsPerRack):"orientation"===a?o*(("Landscape"===e[a]?0:1)-("Landscape"===t[a]?0:1)):"totalYearlyYield"===a&&"yearlyYield"in e&&"yearlyYield"in t?o*(e.yearlyYield-t.yearlyYield):"meanYearlyYield"===a&&"yearlyYield"in e&&"yearlyYield"in t?o*(e.yearlyYield/e.panelCount-t.yearlyYield/t.panelCount):"totalYearlyCost"===a?o*(Tw.calculateCost(e)-Tw.calculateCost(t)):"yearlyProfit"===a?o*(Tw.calculateProfit(e)-Tw.calculateProfit(t)):a in e&&a in t?o*(e[a]-t[a]):0:0}))}q(!K)}}),[O.designs,O.sortDescending,O.selectedProperty]),Object(r.useEffect)((function(){if(U(void 0),O.designs){var e,t=Object(f.a)(O.designs);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.title===C){U(l);break}}}catch(a){t.e(a)}finally{t.f()}}}),[C,O.designs]),Object(r.useEffect)((function(){var e=function(){q(!K)};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[K]);var ge=function(){D((function(e){e.projectView=!1,e.projectInfo.title=null,e.projectInfo.description=null,e.projectInfo.owner=null,e.projectImages.clear()})),U(void 0),Tf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag}))},we=function(){W.uid&&O.title&&E&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({designs:$T.a.firestore.FieldValue.arrayRemove(l)}).then((function(){Tf.setState((function(e){e.updateProjectsFlag=!0})),$T.a.firestore().collection("users").doc(e).collection("designs").doc(l.title).delete().then((function(){Ew.setState((function(e){l.title===e.cloudFile&&(e.cloudFile=void 0)})),Kh(me.t("message.DesignRemovedFromProject",a)+".")})).catch((function(e){Qh(me.t("message.CannotDeleteCloudFile",a)+": "+e)}))})).catch((function(e){Qh(me.t("message.CannotRemoveDesignFromProject",a)+": "+e)}))}(W.uid,O.title,E).then((function(){D((function(e){if(e.projectInfo.designs){var t,l=-1,a=Object(f.a)(e.projectInfo.designs.entries());try{for(a.s();!(t=a.n()).done;){var o=Object(u.a)(t.value,2),i=o[0];if(o[1].title===E.title){l=i;break}}}catch(r){a.e(r)}finally{a.f()}l>=0&&e.projectInfo.designs.splice(l,1)}}))}))},xe=window.innerHeight,ve=Math.round(800/ce.current),be=48/ve,Ae=Math.round(H*window.innerWidth/ve-be),Te=Object(r.useMemo)((function(){var e,t,l,a,o,i;return[kw.getVariables(O.type,null!==(e=O.hiddenParameters)&&void 0!==e?e:[]),kw.getTitles(O.type,pe,null!==(t=O.hiddenParameters)&&void 0!==t?t:[]),kw.getUnits(O.type,pe,null!==(l=O.hiddenParameters)&&void 0!==l?l:[]),kw.getDigits(O.type,null!==(a=O.hiddenParameters)&&void 0!==a?a:[]),kw.getTickIntegers(O.type,null!==(o=O.hiddenParameters)&&void 0!==o?o:[]),kw.getTypes(O.type,null!==(i=O.hiddenParameters)&&void 0!==i?i:[])]}),[O.type,O.hiddenParameters,_,pe]),Pe=Object(u.a)(Te,6),Se=Pe[0],je=Pe[1],He=Pe[2],ze=Pe[3],Re=Pe[4],De=Pe[5],Me=Object(r.useMemo)((function(){var e=[];if(O.designs&&O.type===M.SOLAR_PANEL_ARRAY){var t,l=Object(f.a)(O.designs);try{for(l.s();!(t=l.n()).done;){var a,o,i,r,n,c,s,d,u,h,p,y,g,m=t.value,w={};(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("rowWidth"))||(w.rowWidth=m.rowsPerRack),(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("tiltAngle"))||(w.tiltAngle=Tw.toDegrees(m.tiltAngle)),(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("interRowSpacing"))||(w.interRowSpacing=m.interRowSpacing),(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("latitude"))||(w.latitude=null!==(n=m.latitude)&&void 0!==n?n:42),(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("orientation"))||(w.orientation=m.orientation===$.landscape?0:1),(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("poleHeight"))||(w.poleHeight=m.poleHeight),(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("unitCost"))||(w.unitCost=m.unitCost),(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("sellingPrice"))||(w.sellingPrice=m.sellingPrice),(null===(h=O.hiddenParameters)||void 0===h?void 0:h.includes(""))||(w.totalYearlyCost=Tw.calculateCost(m)),(null===(p=O.hiddenParameters)||void 0===p?void 0:p.includes("totalYearlyYield"))||(w.totalYearlyYield=.001*m.yearlyYield),(null===(y=O.hiddenParameters)||void 0===y?void 0:y.includes("meanYearlyYield"))||(w.meanYearlyYield=m.yearlyYield/m.panelCount),(null===(g=O.hiddenParameters)||void 0===g?void 0:g.includes("yearlyProfit"))||(w.yearlyProfit=Tw.calculateProfit(m)),w.group=O.dataColoring===z.INDIVIDUALS?m.title:"default",w.selected=E===m,w.hovered=J===m,w.invisible=m.invisible,e.push(w)}}catch(x){l.e(x)}finally{l.f()}}return e}),[O.designs,O.type,J,E,k,O.hiddenParameters,O.dataColoring,_]),We=function(e,t){var l=t;if(O.ranges){var a,o=Object(f.a)(O.ranges);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.variable===e){var r;l=null!==(r=i.minimum)&&void 0!==r?r:t;break}}}catch(n){o.e(n)}finally{o.f()}}return l},Ie=function(e,t){var l=t;if(O.ranges){var a,o=Object(f.a)(O.ranges);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.variable===e){var r;l=null!==(r=i.maximum)&&void 0!==r?r:t;break}}}catch(n){o.e(n)}finally{o.f()}}return l},Ce=Object(r.useMemo)((function(){if(O.type===M.SOLAR_PANEL_ARRAY&&F){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=O.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(We("rowWidth",F.minimumRowsPerRack)),(null===(t=O.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(We("tiltAngle",Tw.toDegrees(F.minimumTiltAngle))),(null===(l=O.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(We("interRowSpacing",F.minimumInterRowSpacing)),(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(We("latitude",-90)),(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(0),(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(We("poleHeight",0)),(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(We("unitCost",.1)),(null===(n=O.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(We("sellingPrice",.1)),(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(We("totalYearlyCost",0)),(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(We("totalYearlyYield",0)),(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(We("meanYearlyYield",0)),(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(We("yearlyProfit",-10)),f}return[]}),[F,O.type,O.ranges,O.hiddenParameters,_]),Oe=Object(r.useMemo)((function(){if(O.type===M.SOLAR_PANEL_ARRAY&&F){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=O.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(Ie("rowWidth",F.maximumRowsPerRack)),(null===(t=O.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(Ie("tiltAngle",Tw.toDegrees(F.maximumTiltAngle))),(null===(l=O.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(Ie("interRowSpacing",F.maximumInterRowSpacing)),(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(Ie("latitude",90)),(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(1),(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(Ie("poleHeight",5)),(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(Ie("unitCost",1)),(null===(n=O.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(Ie("sellingPrice",.5)),(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(Ie("totalYearlyCost",100)),(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(Ie("totalYearlyYield",100)),(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(Ie("meanYearlyYield",1e3)),(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(Ie("yearlyProfit",10)),f}return[]}),[F,O.type,O.ranges,O.hiddenParameters,_]),Fe=Object(r.useMemo)((function(){if(O.type===M.SOLAR_PANEL_ARRAY&&F){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=O.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(1),(null===(t=O.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(.1),(null===(l=O.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(.1),(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(.1),(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(1),(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(.1),(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(.01),(null===(n=O.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(.01),(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(.1),(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(1),(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(1),(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(.1),f}return[]}),[O.type,O.hiddenParameters,_]),ke=Object(r.useRef)(!(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("rowWidth"))),Ye=Object(r.useRef)(!(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("tiltAngle"))),Le=Object(r.useRef)(!(null===(p=O.hiddenParameters)||void 0===p?void 0:p.includes("interRowSpacing"))),Ee=Object(r.useRef)(!(null===(y=O.hiddenParameters)||void 0===y?void 0:y.includes("latitude"))),Ue=Object(r.useRef)(!(null===(g=O.hiddenParameters)||void 0===g?void 0:g.includes("orientation"))),Ne=Object(r.useRef)(!(null===(m=O.hiddenParameters)||void 0===m?void 0:m.includes("poleHeight"))),Ve=Object(r.useRef)(!(null===(w=O.hiddenParameters)||void 0===w?void 0:w.includes("unitCost"))),Je=Object(r.useRef)(!(null===(v=O.hiddenParameters)||void 0===v?void 0:v.includes("sellingPrice"))),Xe=Object(r.useRef)(!(null===(b=O.hiddenParameters)||void 0===b?void 0:b.includes("totalYearlyCost"))),Be=Object(r.useRef)(!(null===(A=O.hiddenParameters)||void 0===A?void 0:A.includes("totalYearlyYield"))),Ke=Object(r.useRef)(!(null===(T=O.hiddenParameters)||void 0===T?void 0:T.includes("meanYearlyYield"))),qe=Object(r.useRef)(!(null===(P=O.hiddenParameters)||void 0===P?void 0:P.includes("yearlyProfit")));Object(r.useEffect)((function(){var e,t,l,a,o,i,r,n,c,s,d,u;ke.current=!(null===(e=O.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth")),Ye.current=!(null===(t=O.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle")),Le.current=!(null===(l=O.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing")),Ee.current=!(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("latitude")),Ue.current=!(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("orientation")),Ne.current=!(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight")),Ve.current=!(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("unitCost")),Je.current=!(null===(n=O.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice")),Xe.current=!(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost")),Be.current=!(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield")),Ke.current=!(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield")),qe.current=!(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit")),q(!K)}),[O.hiddenParameters]),Object(r.useEffect)((function(){le.current=O.description}),[O.description]);var Qe=function(e){var t;t=e.title,D((function(e){if(e.projectInfo.designs){var l,a=Object(f.a)(e.projectInfo.designs);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.title===t){o.invisible=!o.invisible;break}}}catch(i){a.e(i)}finally{a.f()}}})),ye&&W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};$T.a.firestore().collection("users").doc(e).collection("projects").doc(t).get().then((function(o){if(o.exists){var i=o.data();if(i){var r=[];r.push.apply(r,Object(h.a)(i.designs));var n,c=-1,s=Object(f.a)(r.entries());try{for(s.s();!(n=s.n()).done;){var d=Object(u.a)(n.value,2),p=d[0];if(d[1].title===l.title){c=p;break}}}catch(y){s.e(y)}finally{s.f()}c>=0&&(r[c].invisible=!l.invisible,$T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({designs:r}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)})))}}})).catch((function(e){Qh(me.t("message.CannotFetchProjectData",a)+": "+e)})).finally((function(){}))}(W.uid,O.title,e)},Ze=function(e,t){D((function(l){l.projectInfo.hiddenParameters&&(e?l.projectInfo.hiddenParameters.includes(t)&&l.projectInfo.hiddenParameters.splice(l.projectInfo.hiddenParameters.indexOf(t),1):l.projectInfo.hiddenParameters.includes(t)||l.projectInfo.hiddenParameters.push(t))}))},_e=function(e,t){re.current=!0,ye?W.uid&&O.title&&function(e,t,l,a){var o={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({hiddenParameters:a?$T.a.firestore.FieldValue.arrayUnion(l):$T.a.firestore.FieldValue.arrayRemove(l)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",o)+": "+e)}))}(W.uid,O.title,t,!e).then((function(){Ze(e,t)})):Ze(e,t)},$e=function(){D((function(e){e.projectInfo.dataColoring=ie.current})),Tf.setState((function(e){e.updateProjectsFlag=!0})),q(!K)},et=function(e){ie.current=e,ye?W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({dataColoring:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,ie.current).then((function(){$e()})):$e()},tt=function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(SY,{value:"rowWidth",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowWidth",pe)})},"rowWidth"),Object(gf.jsx)(SY,{value:"tiltAngle",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTiltAngle",pe)})},"tiltAngle"),Object(gf.jsx)(SY,{value:"interRowSpacing",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowSpacing",pe)})},"interRowSpacing"),Object(gf.jsx)(SY,{value:"latitude",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Latitude",pe)})},"latitude"),Object(gf.jsx)(SY,{value:"orientation",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayOrientation",pe)})},"orientation"),Object(gf.jsx)(SY,{value:"poleHeight",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayPoleHeight",pe)})},"poleHeight"),Object(gf.jsx)(SY,{value:"unitCost",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.UnitCost",pe)})},"unitCost"),Object(gf.jsx)(SY,{value:"sellingPrice",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.SellingPrice",pe)})},"sellingPrice"),Object(gf.jsx)(SY,{value:"totalYearlyCost",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",pe)})},"totalYearlyCost"),Object(gf.jsx)(SY,{value:"totalYearlyYield",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",pe)})},"totalYearlyYield"),Object(gf.jsx)(SY,{value:"meanYearlyYield",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",pe)})},"meanYearlyYield"),Object(gf.jsx)(SY,{value:"yearlyProfit",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayYearlyProfit",pe)})},"yearlProfit")]})},lt=Object(r.useMemo)((function(){var e=[];if(O.designs&&O.type===M.SOLAR_PANEL_ARRAY){var t,l=Object(f.a)(O.designs);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(!a.invisible&&a!==E){var o={};kw.setScatterData(se.current,"x",o,a),kw.setScatterData(de.current,"y",o,a),e.push(o)}}}catch(i){l.e(i)}finally{l.f()}}return e}),[se.current,de.current,O.designs,O.type,E]),at=Object(r.useMemo)((function(){var e=[];if(O.designs&&O.type===M.SOLAR_PANEL_ARRAY){var t,l=Object(f.a)(O.designs);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a===E){var o={};kw.setScatterData(se.current,"x",o,a),kw.setScatterData(de.current,"y",o,a),e.push(o)}}}catch(i){l.e(i)}finally{l.f()}}return e}),[se.current,de.current,O.designs,O.type,E]),ot=function(e){var t={min:0,max:1};if(O.type===M.SOLAR_PANEL_ARRAY&&F)switch(e){case"rowWidth":t.min=We("rowWidth",F.minimumRowsPerRack),t.max=Ie("rowWidth",F.maximumRowsPerRack);break;case"tiltAngle":t.min=We("tiltAngle",Tw.toDegrees(F.minimumTiltAngle)),t.max=Ie("tiltAngle",Tw.toDegrees(F.maximumTiltAngle));break;case"interRowSpacing":t.min=We("interRowSpacing",F.minimumInterRowSpacing),t.max=Ie("interRowSpacing",F.maximumInterRowSpacing);break;case"latitude":t.min=We("latitude",-90),t.max=Ie("latitude",90);break;case"orientation":t.min=0,t.max=1;break;case"poleHeight":t.min=We("poleHeight",0),t.max=Ie("poleHeight",5);break;case"unitCost":t.min=We("unitCost",.1),t.max=Ie("unitCost",1);break;case"sellingPrice":t.min=We("sellingPrice",.1),t.max=Ie("sellingPrice",.5);break;case"totalYearlyCost":t.min=We("totalYearlyCost",0),t.max=Ie("totalYearlyCost",100);break;case"totalYearlyYield":t.min=We("totalYearlyYield",0),t.max=Ie("totalYearlyYield",100);break;case"meanYearlyYield":t.min=We("meanYearlyYield",0),t.max=Ie("meanYearlyYield",1e3);break;case"yearlyProfit":t.min=We("yearlyProfit",-10),t.max=Ie("yearlyProfit",10)}return t},it=Object(r.useMemo)((function(){return ot(se.current)}),[se.current,O.ranges]),rt=Object(r.useMemo)((function(){return ot(de.current)}),[de.current,O.ranges]),nt=Object(r.useMemo)((function(){return kw.getUnit(se.current,pe)}),[se.current,pe]),ct=Object(r.useMemo)((function(){return kw.getUnit(de.current,pe)}),[de.current,pe]),st=function(e){var t=e.cx,l=e.cy;return Object(gf.jsx)(xY.a,{cx:t,cy:l,fill:"#8884d8",r:ue.current})};return Object(gf.jsx)(jY,{onContextMenu:function(e){e.stopPropagation()},children:Object(gf.jsxs)(HY,{children:[Object(gf.jsxs)(zY,{children:[Object(gf.jsx)("span",{children:(ye?me.t("projectPanel.Project",pe):me.t("projectPanel.ProjectByOtherPeople",pe))+": "+O.title+(ye?"":" ("+me.t("word.Owner",pe)+": "+(null===(S=O.owner)||void 0===S?void 0:S.substring(0,4))+"***)")+" ("+ne.current.length+")"}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){ge()},onTouchStart:function(){ge()},children:Object(gf.jsx)(aO.a,{title:me.t("word.Close",pe)})})]}),Object(gf.jsx)(JR.a,{style:{backgroundColor:"white",border:"none"},onChange:function(e){oe.current=e.length>0,q(!K)},children:Object(gf.jsx)(JR.a.Panel,{style:{backgroundColor:"white",border:"none"},header:Object(gf.jsxs)(RY,{children:[Object(gf.jsx)("span",{children:me.t("projectPanel.ProjectDescription",pe)+" | "+me.t("projectPanel.ProjectType",pe)+": "+O.type}),Object(gf.jsxs)("span",{children:[ye&&Object(gf.jsxs)(gf.Fragment,{children:[oe.current&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),te.current=!te.current,q(!K)},children:te.current?Object(gf.jsx)(Xk.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.MakeDescriptionNonEditable",pe)}):Object(gf.jsx)(Bk.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.MakeDescriptionEditable",pe)})}),Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),Tf.setState((function(e){e.curateDesignToProjectFlag=!0}))},children:Object(gf.jsx)(Kk.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.CurateCurrentDesign",pe)})}),E&&E.title===C&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){var t;(e.stopPropagation(),R&&W.uid&&O.title&&C)&&function(e,t,l,a,o,i){var r={lng:Ew.getState().language};return Tf.setState((function(e){e.waiting=!0})),$T.a.firestore().collection("users").doc(e).collection("designs").doc(o).set(Ew.getState().exportContent()).then((function(){if(Tf.getState().setChanged(!1),i){var n=Tw.resizeCanvas(i,a).toDataURL();$T.a.firestore().collection("users").doc(e).collection("projects").doc(l).get().then((function(a){if(a.exists){var i=a.data();if(i){var c=[];c.push.apply(c,Object(h.a)(i.designs));var s,d=-1,p=Object(f.a)(c.entries());try{for(p.s();!(s=p.n()).done;){var y=Object(u.a)(s.value,2),g=y[0];if(y[1].title===o){d=g;break}}}catch(m){p.e(m)}finally{p.f()}d>=0&&(c[d]=aP(t,o,n),$T.a.firestore().collection("users").doc(e).collection("projects").doc(l).update({designs:c}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",r)+": "+e)})).finally((function(){Ew.getState().set((function(e){e.projectInfo.designs=c})),Tf.setState((function(e){e.updateProjectsFlag=!0,e.waiting=!1}))})))}}})).catch((function(e){Qh(me.t("message.CannotFetchProjectData",r)+": "+e)})).finally((function(){}))}}))}(W.uid,O.type,O.title,null!==(t=O.thumbnailWidth)&&void 0!==t?t:200,C,R).then((function(){q(!K)}))},children:Object(gf.jsx)(qk.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.UpdateSelectedDesign",pe)})}),E&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),we(),U(void 0)},children:Object(gf.jsx)(Qk.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.RemoveSelectedDesign",pe)})}),E&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){if(e.stopPropagation(),O.title){var t=Ge+"?client=web&userid="+W.uid+"&project="+encodeURIComponent(O.title);E&&(t+="&title="+encodeURIComponent(E.title)),Zh(t),Bh(me.t("projectListPanel.ProjectLinkGeneratedInClipBoard",pe)+".")}},children:Object(gf.jsx)(Zk.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectListPanel.GenerateProjectLink",pe)})})]}),O.designs&&O.designs.length>1&&O.selectedProperty&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),D((function(e){e.projectInfo.sortDescending=!e.projectInfo.sortDescending}))},children:O.sortDescending?Object(gf.jsx)(_k.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.ClickToFlipSortingOrder",pe)}):Object(gf.jsx)($k.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.ClickToFlipSortingOrder",pe)})}),Object(gf.jsx)(pD.a,{title:Object(gf.jsx)("div",{onClick:function(e){return e.stopPropagation()},children:me.t("projectPanel.ProjectSettings",pe)}),content:function(){return Object(gf.jsx)("div",{style:{width:"250px"},onClick:function(e){return e.stopPropagation()},children:Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{span:14,style:{paddingTop:"5px"},children:Object(gf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.ThumbnailImageSize",pe),": "]})}),Object(gf.jsx)(NT.a,{span:10,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:ce.current,onChange:function(e){ce.current=e,ye?W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({thumbnailWidth:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,e).then((function(){D((function(e){e.projectInfo.thumbnailWidth=ce.current}))})):D((function(e){e.projectInfo.thumbnailWidth=ce.current})),q(!K)},children:[Object(gf.jsx)(SY,{value:100,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Small",pe)})},"small-thumbnail"),Object(gf.jsx)(SY,{value:125,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Medium",pe)})},"medium-thumbnail"),Object(gf.jsx)(SY,{value:200,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Large",pe)})},"large-thumbnail")]})})]})})},children:Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){return e.stopPropagation()},children:Object(gf.jsx)(eY.a,{style:{fontSize:"24px",color:"gray"}})})})]})]}),children:Object(gf.jsx)(PY,{title:te.current?void 0:me.t("projectPanel.DoubleClickToMakeDescriptionEditable",pe),bordered:te.current,readOnly:!te.current,value:null!==(j=le.current)&&void 0!==j?j:void 0,onDoubleClick:function(){te.current=!te.current,q(!K)},onChange:function(e){le.current=e.target.value,ae.current=!0,D((function(t){t.projectInfo.description=e.target.value})),q(!K)},onBlur:function(){te.current=!1,ae.current&&W.uid&&ye&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({description:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,le.current).then((function(){ae.current=!1,q(!K)}))},style:{paddingLeft:"10px",textAlign:"left",resize:te.current?"vertical":"none"}})},"1")}),ne.current.length>0&&Object(gf.jsxs)(MY,{children:[Object(gf.jsx)(Gk.b,{style:{width:"100%",height:xe/2-(oe.current?160:80),paddingLeft:"4px",paddingRight:"4px",overflowX:"hidden",overflowY:"auto"},grid:{column:ve,gutter:1},dataSource:ne.current,renderItem:function(e){var t,l=e.title.lastIndexOf(" "),a=100===O.thumbnailWidth?8:125===O.thumbnailWidth?12:30;return Object(gf.jsxs)(Gk.b.Item,{style:{marginBottom:"-28px"},onMouseOver:function(){G(e)},onMouseLeave:function(){G(void 0)},children:[Object(gf.jsx)("img",{loading:"eager",width:Ae+"px",height:"auto",onError:function(e){e.target.src=nY},onLoad:function(t){D((function(l){l.projectImages.set(e.title,t.target)})),Tf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag}))},alt:e.title,title:(e.timestamp?me.t("word.LastUpdate",pe)+": "+x()(new Date(e.timestamp)).format("MM-DD-YYYY hh:mm A")+"\n":"")+(E===e?me.t("projectPanel.SingleClickToDeselectDoubleClickToOpen",pe):me.t("projectPanel.SingleClickToSelectDoubleClickToOpen",pe)),src:(null===(t=e.thumbnail)||void 0===t?void 0:t.startsWith("data:image/png;base64"))?e.thumbnail:nY,style:{transition:".5s ease",opacity:J===e?.5:1,padding:"1px",cursor:"pointer",borderRadius:E===e?"0":"10px",border:E===e?"2px solid red":"none"},onDoubleClick:function(t){var l=t.target;l.src===nY&&(l.src=e.thumbnailUrl),U(e),O.owner&&cP(O.owner,e.title,!0,!0).then((function(){}))},onClick:function(t){var l=t.target;l.src===nY&&(l.src=e.thumbnailUrl),U(e!==E?e:void 0)}}),Object(gf.jsx)("div",{style:{position:"relative",left:"10px",textAlign:"left",bottom:"18px",color:"white",fontSize:"8px",fontWeight:e.title===C?"bold":"normal"},children:e.title?e.title.length>a?e.title.substring(0,Math.min(a,l))+"..."+e.title.substring(l):e.title:"Unknown"}),Object(gf.jsxs)("div",{style:{position:"relative",right:"10px",textAlign:"right",bottom:"36px",color:"white"},children:[e.title===C&&Object(gf.jsx)(tY.a,{style:{paddingRight:"4px",fontSize:"16px"}}),e.invisible?Object(gf.jsx)(lY.a,{onClick:function(){Qe(e)},style:{fontSize:"16px"},title:me.t("projectPanel.DesignNotShownInSolutionSpaceClickToShow",pe)}):Object(gf.jsx)(aY.a,{onClick:function(){Qe(e)},style:{fontSize:"16px"},title:me.t("projectPanel.DesignShownInSolutionSpaceClickToHide",pe)})]})]})}}),Object(gf.jsxs)(DY,{children:[Object(gf.jsx)("span",{style:{paddingLeft:"20px"},children:me.t("projectPanel.DistributionInSolutionSpace",pe)}),Object(gf.jsxs)("span",{children:[O.type===M.SOLAR_PANEL_ARRAY&&Object(gf.jsx)(pD.a,{title:me.t("projectPanel.ChooseSolutionSpace",pe),onVisibleChange:function(e){re.current&&(e||Tf.setState((function(e){e.updateProjectsFlag=!0})),re.current=!1)},content:Object(gf.jsxs)("div",{children:[Object(gf.jsx)(_v.a,{onChange:function(e){ke.current=e.target.checked,_e(ke.current,"rowWidth"),ee(!_)},checked:ke.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowWidth",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ye.current=e.target.checked,_e(Ye.current,"tiltAngle"),ee(!_)},checked:Ye.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTiltAngle",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Le.current=e.target.checked,_e(Le.current,"interRowSpacing"),ee(!_)},checked:Le.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowSpacing",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ee.current=e.target.checked,_e(Ee.current,"latitude"),ee(!_)},checked:Ee.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Latitude",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ue.current=e.target.checked,_e(Ue.current,"orientation"),ee(!_)},checked:Ue.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayOrientation",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ne.current=e.target.checked,_e(Ne.current,"poleHeight"),ee(!_)},checked:Ne.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayPoleHeight",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ve.current=e.target.checked,_e(Ve.current,"unitCost"),ee(!_)},checked:Ve.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.UnitCost",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Je.current=e.target.checked,_e(Je.current,"sellingPrice"),ee(!_)},checked:Je.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.SellingPrice",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Xe.current=e.target.checked,_e(Xe.current,"totalYearlyCost"),ee(!_)},checked:Xe.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Be.current=e.target.checked,_e(Be.current,"totalYearlyYield"),ee(!_)},checked:Be.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ke.current=e.target.checked,_e(Ke.current,"meanYearlyYield"),ee(!_)},checked:Ke.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){qe.current=e.target.checked,_e(qe.current,"yearlyProfit"),ee(!_)},checked:qe.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayYearlyProfit",pe)})})]}),children:Object(gf.jsx)(xv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(gf.jsx)(oY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(gf.jsx)(pD.a,{title:me.t("projectPanel.ChooseDataColoring",pe),content:function(){var e;return Object(gf.jsx)("div",{children:Object(gf.jsxs)(tb.a.Group,{onChange:function(e){et(e.target.value)},value:null!==(e=O.dataColoring)&&void 0!==e?e:z.ALL,children:[Object(gf.jsx)(tb.a,{style:{fontSize:"12px"},value:z.ALL,children:me.t("projectPanel.SameColorForAllDesigns",pe)}),Object(gf.jsx)("br",{}),Object(gf.jsx)(tb.a,{style:{fontSize:"12px"},value:z.INDIVIDUALS,children:me.t("projectPanel.OneColorForEachDesign",pe)})]})})}(),children:Object(gf.jsx)(xv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(gf.jsx)(iY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(gf.jsx)(pD.a,{title:me.t("projectPanel.GenerateScatteredPlot",pe),content:Object(gf.jsxs)("div",{style:{width:"280px"},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{span:8,style:{paddingTop:"5px"},children:Object(gf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.SelectXAxis",pe),": "]})}),Object(gf.jsx)(NT.a,{span:16,children:Object(gf.jsx)(db.a,{style:{width:"100%"},value:se.current,onChange:function(e){se.current=e,ye&&W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({xAxisNameScatteredPlot:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,e).then((function(){})),q(!K)},children:tt()})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"8px"},children:[Object(gf.jsx)(NT.a,{span:8,style:{paddingTop:"5px"},children:Object(gf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.SelectYAxis",pe),": "]})}),Object(gf.jsx)(NT.a,{span:16,children:Object(gf.jsx)(db.a,{style:{width:"100%"},value:de.current,onChange:function(e){de.current=e,ye&&W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({yAxisNameScatteredPlot:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,e).then((function(){})),q(!K)},children:tt()})})]}),Object(gf.jsx)(UT.a,{style:{paddingBottom:"8px"},children:Object(gf.jsxs)("div",{children:[Object(gf.jsxs)(vY.a,{id:"scattered-chart",width:280,height:240,margin:{top:0,right:0,bottom:-10,left:-10},children:[Object(gf.jsx)(HW.a,{strokeWidth:"1",stroke:"gray",horizontal:fe.current,vertical:he.current}),Object(gf.jsx)(RW.a,{dataKey:"x",fontSize:10,type:"number",domain:[it.min,it.max],name:"x",unit:nt,strokeWidth:1,stroke:"gray",tickFormatter:function(e,t){return"yearlyProfit"===se.current||"unitCost"===se.current||"sellingPrice"===se.current?"$"+e:e}}),Object(gf.jsx)(MW.a,{dataKey:"y",fontSize:10,type:"number",domain:[rt.min,rt.max],name:"y",unit:ct,strokeWidth:1,stroke:"gray",tickFormatter:function(e,t){return"yearlyProfit"===de.current||"unitCost"===de.current||"sellingPrice"===de.current?"$"+e:e}}),Object(gf.jsx)(jW.a,{cursor:{strokeDasharray:"3 3"},formatter:function(e){return e.toFixed(2)}}),Object(gf.jsx)(bY.a,{name:"All",data:lt,fill:"#8884d8",shape:Object(gf.jsx)(st,{})}),E&&Object(gf.jsx)(bY.a,{name:"Selected",data:at,fill:"red",shape:"star"})]}),Object(gf.jsx)(TY,{symbolSize:ue.current,horizontalGrid:fe.current,verticalGrid:he.current,changeHorizontalGrid:function(e){fe.current=e,q(!K)},changeVerticalGrid:function(e){he.current=e,q(!K)},changeSymbolSize:function(e){ue.current=e,ye&&W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({dotSizeScatteredPlot:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,e).then((function(){})),q(!K)}})]})}),Object(gf.jsx)(UT.a,{children:Object(gf.jsx)("span",{style:{width:"100%",textAlign:"center"},children:Object(gf.jsx)(YC.a,{style:{fontSize:"18px",color:"gray",paddingRight:"8px"},title:me.t("projectPanel.ScatteredPlotScreenshot",pe),onClick:function(){var e=document.getElementById("scattered-chart");e&&Object(wY.saveSvgAsPng)(e,"scattered-chart-"+O.title+".png").then((function(){Kh(me.t("message.ScreenshotSaved",pe))}))}})})})]}),children:Object(gf.jsx)(xv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(gf.jsx)(rY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(gf.jsx)(xv.a,{style:{border:"none",paddingRight:"20px",background:"white"},onClick:function(){var e=document.getElementById("design-space");e&&Object(wY.saveSvgAsPng)(e,"design-space-"+O.title+".png").then((function(){Kh(me.t("message.ScreenshotSaved",pe))}))},children:Object(gf.jsx)(YC.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.SolutionSpaceScreenshot",pe)})})]})]}),Object(gf.jsx)(mY,{id:"design-space",width:H*window.innerWidth,height:xe/2-120,data:Me,types:De,minima:Ce,maxima:Oe,steps:Fe,variables:Se,titles:je,units:He,digits:ze,tickIntegers:Re,hover:function(e){O.designs&&e>=0&&e1||l.size>0,b=Object(r.useRef)(null),A=Object(r.useRef)(new Me.Vector3),T=Object(r.useRef)(new Me.Euler),P=Object(r.useRef)(new Me.Vector2),S=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Me.Vector3),C=Object(r.useRef)(!1),O=Object(r.useRef)(new Map),F=Object(r.useRef)(new Map),k=Object(r.useRef)(new Map),Y=Object(r.useRef)(new Map),L=Object(r.useRef)(new Map),E=Object(r.useState)(new Me.Vector3(s,d,p)),U=Object(u.a)(E,2),N=U[0],J=U[1],G=Object(r.useState)(n),X=Object(u.a)(G,2),Q=X[0],Z=X[1],_=Object(r.useState)(g/2),$=Object(u.a)(_,2),ee=$[0],te=$[1],le=Object(r.useState)(m/2),ae=Object(u.a)(le,2),oe=ae[0],ie=ae[1],re=Object(r.useState)(w),ne=Object(u.a)(re,2),ce=ne[0],se=ne[1],de=Object(r.useState)(!1),ue=Object(u.a)(de,2),fe=ue[0],he=ue[1],pe=Object(r.useState)(vC.Null),ye=Object(u.a)(pe,2),ge=ye[0],me=ye[1],we=Object(Se.f)().get,xe=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),ve=Object(r.useMemo)((function(){return new Me.Vector2}),[]),be=Ew(o.orthographic),Ae=Ew(Zr),Te=Ew(Qr),Pe=Ew(si),je=Ew(Sr);Object(r.useEffect)((function(){se(w)}),[w]),Object(r.useEffect)((function(){J(new Me.Vector3(s,d,p)),He(g,m),Z(n)}),[a,i,n]);var He=function(e,t){te(e/2),ie(t/2)},ze=function(e){he(!0),Et.getState().setEnableOrbitController(!1),C.current=!0,A.current.set(0,0,0),T.current.set(0,0,0),Ie(B.Default),e.stopPropagation()},Re=function(e,t,l){Pe((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(Lw(r)&&e.has(r.id)){var n=e.get(r.id),c=Object(u.a)(n,4);r.cx=c[0],r.cy=c[1],r.lx=c[2],r.ly=c[3]}else if(e.has(r.parentId))switch(r.type){case V.Wall:var s=t.get(r.id);if(!s)continue;var d=r,p=s.slice(0,3),y=s.slice(3);d.cx=(p[0]+y[0])/2,d.cy=(p[1]+y[1])/2,d.lx=Math.hypot(p[0]-y[0]+(p[1]-y[1])),d.relativeAngle=Math.atan2(y[1]-p[1],y[0]-p[0]),d.leftPoint=Object(h.a)(p),d.rightPoint=Object(h.a)(y);break;case V.Window:var g=r;if(g.parentType!==V.Roof)continue;var m=l.get(r.id);if(!m)continue;var w=Object(u.a)(m,2);g.cx=w[0],g.cy=w[1]}}}catch(x){i.e(x)}finally{i.f()}a.groupActionUpdateFlag=!a.groupActionUpdateFlag,a.updateElementOnRoofFlag=!0}))},De=function(e,t){Pe((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id)){var r=e.get(i.id);void 0!==r&&(i.type===V.Roof?i.rise=r:i.lz=r)}if(i.type===V.Wall&&t.has(i.id)){var n=i,c=t.get(n.id);c&&(n.leftTopPartialHeight=c.upperLeft,n.rightTopPartialHeight=c.upperRight,n.leftUnfilledHeight=c.lowerLeft,n.rightUnfilledHeight=c.lowerRight)}}}catch(s){o.e(s)}finally{o.f()}l.groupActionUpdateFlag=!l.groupActionUpdateFlag,l.updateElementOnRoofFlag=!0}))},We=function(e){Pe((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(e.has(o.id)){var i=e.get(o.id);i&&(o.cx=i[0],o.cy=i[1],o.cz=i[2],o.rotation[2]=i[3])}}}catch(r){a.e(r)}finally{a.f()}t.groupActionUpdateFlag=!t.groupActionUpdateFlag}))},Ie=function(e){Pe((function(t){t.moveHandleType=e}))},Ce=function(e,a){var o=new Me.Vector2(N.x,N.y);P.current.set(e,a).rotateAround(OY,Q).add(o),me(vC.ResizeXY),M.current.clear(),W.current.clear(),j.current.clear(),O.current.clear(),F.current.clear(),z.current.clear(),L.current.clear();var i,r=2*ee,n=2*oe,c=Object(f.a)(Ew.getState().elements);try{for(c.s();!(i=c.n()).done;){var s=i.value;if(Lw(s)&&(t.has(s.id)||l.has(s.id))){var d=Tw.getWorldDataById(s.id).pos;M.current.set(s.id,[(d.x-N.x)/r,(d.y-N.y)/n]),W.current.set(s.id,[s.lx/r,s.ly/n]),O.current.set(s.id,[s.cx,s.cy,s.lx,s.ly])}else if(s.foundationId&&t.has(s.foundationId)){var u=Ae(s.foundationId);if(!u)continue;switch(s.type){case V.Wall:var p=s,y=new Me.Vector2(p.leftPoint[0]/u.lx,p.leftPoint[1]/u.ly),g=new Me.Vector2(p.rightPoint[0]/u.lx,p.rightPoint[1]/u.ly);j.current.set(p.id,[y,g]),F.current.set(p.id,[].concat(Object(h.a)(p.leftPoint),Object(h.a)(p.rightPoint)));break;case V.Window:var m=s;if(m.parentType!==V.Roof)continue;z.current.set(m.id,[m.cx/u.lx,m.cy/u.ly]),L.current.set(m.id,[m.cx,m.cy])}}}}catch(w){c.e(w)}finally{c.f()}},Oe=function(e,a,o){var i=Te(),r=i.x,n=i.y;A.current.set(e,a,o),T.current.set(-vt,0,-Math.atan2(r,n)-Q,"ZXY"),me(vC.ResizeZ),S.current.clear(),k.current.clear(),H.current.clear(),Y.current.clear();var c,s=Object(f.a)(Ew.getState().elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.foundationId&&t.has(d.foundationId))if(d.type===V.Wall){S.current.set(d.id,d.lz/ce),k.current.set(d.id,d.lz);var u=d;u.fill===Ue.Partial&&(Y.current.set(u.id,{upperLeft:u.leftTopPartialHeight,upperRight:u.rightTopPartialHeight,lowerLeft:u.leftUnfilledHeight,lowerRight:u.rightUnfilledHeight}),H.current.set(u.id,{upperLeft:u.leftTopPartialHeight/ce,upperRight:u.rightTopPartialHeight/ce,lowerLeft:u.leftUnfilledHeight/ce,lowerRight:u.rightUnfilledHeight/ce}))}else d.type===V.Roof&&(S.current.set(d.id,d.rise/ce),k.current.set(d.id,d.rise));else(t.has(d.id)||l.has(d.id))&&(S.current.set(d.id,d.lz/ce),k.current.set(d.id,d.lz))}}catch(h){s.e(h)}finally{s.f()}},Fe=up(),ke=Fe/2,Ye=ce+ke-Fe/2,Le=ee+Fe,Ee=oe+Fe,Ne=oe+4*Fe;return Object(gf.jsxs)("group",{name:"Group Master",position:N,rotation:[0,0,Q],children:[Object(gf.jsxs)("group",{name:"Resize Handle Group",onPointerDown:function(e){switch(ze(e),e.object.name){case K.UpperLeft:Ce(ee,-oe);break;case K.UpperRight:Ce(-ee,-oe);break;case K.LowerLeft:Ce(ee,oe);break;case K.LowerRight:Ce(-ee,oe);break;case K.UpperLeftTop:Oe(-ee,oe,ce);break;case K.UpperRightTop:Oe(ee,oe,ce);break;case K.LowerLeftTop:Oe(-ee,-oe,ce);break;case K.LowerRightTop:Oe(ee,-oe,ce)}},children:[Object(gf.jsx)(FY,{args:[ee,oe,ke,Fe],handleType:K.UpperRight}),Object(gf.jsx)(FY,{args:[-ee,oe,ke,Fe],handleType:K.UpperLeft}),Object(gf.jsx)(FY,{args:[ee,-oe,ke,Fe],handleType:K.LowerRight}),Object(gf.jsx)(FY,{args:[-ee,-oe,ke,Fe],handleType:K.LowerLeft}),!be&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(FY,{args:[ee,oe,Ye,Fe],handleType:K.UpperRightTop}),Object(gf.jsx)(FY,{args:[-ee,oe,Ye,Fe],handleType:K.UpperLeftTop}),Object(gf.jsx)(FY,{args:[ee,-oe,Ye,Fe],handleType:K.LowerRightTop}),Object(gf.jsx)(FY,{args:[-ee,-oe,Ye,Fe],handleType:K.LowerLeftTop})]})]}),Object(gf.jsxs)("group",{name:"Move Handle Group",onPointerDown:function(e){if(ze(e),me(vC.Move),e.intersections.length>0){var l=e.intersections[0].point.clone().setZ(0);I.current.subVectors(N,l);var a,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Lw(i)&&t.has(i.id)){var r=new Me.Vector3(i.cx,i.cy),n=(new Me.Vector3).subVectors(r,l);R.current.set(i.id,n),O.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}}}catch(c){o.e(c)}finally{o.f()}}},children:[Object(gf.jsx)(kY,{args:[0,Ee,ke,Fe],handleType:B.Upper}),Object(gf.jsx)(kY,{args:[0,-Ee,ke,Fe],handleType:B.Lower}),Object(gf.jsx)(kY,{args:[Le,0,ke,Fe],handleType:B.Right}),Object(gf.jsx)(kY,{args:[-Le,0,ke,Fe],handleType:B.Left})]}),Object(gf.jsxs)("group",{name:"Rotate Handle Group",onPointerDown:function(e){if(ze(e),e.object.name===q.Lower?me(vC.RotateLower):e.object.name===q.Upper&&me(vC.RotateUpper),e.intersections.length>0){var l,a=new Me.Vector3(N.x,N.y),o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(Lw(i)&&t.has(i.id)){var r=new Me.Vector3(i.cx,i.cy),n=(new Me.Vector3).subVectors(r,a);R.current.set(i.id,n),D.current.set(i.id,i.rotation[2]),O.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}t.has(i.parentId)&&O.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}}catch(c){o.e(c)}finally{o.f()}}},children:[Object(gf.jsx)(YY,{args:[0,Ne,ke,Fe],handleType:q.Upper}),Object(gf.jsx)(YY,{args:[0,-Ne,ke,Fe],handleType:q.Lower})]}),fe&&Object(gf.jsx)(Lt.f,{name:"Intersection Plane",ref:b,args:[Math.max(2.4*ee,1e3),Math.max(2.4*ee,1e3)],visible:!1,position:A.current,rotation:T.current,onPointerMove:function(e){if(b.current&&C.current){var a;a=e,ve.x=a.offsetX/we().gl.domElement.clientWidth*2-1,ve.y=-a.offsetY/we().gl.domElement.clientHeight*2+1,xe.setFromCamera(ve,we().camera);var o=xe.intersectObjects([b.current]);if(o.length>0){var i=o[0].point;switch(ge){case vC.ResizeXY:!function(e){var a=new Me.Vector2(e.x,e.y),o=P.current.clone();if(v){var i=(new Me.Vector2).subVectors(a,o),r=Math.max(1,i.length()),n=Math.sqrt(Math.pow(r,2)/(Math.pow(x,2)+1)),c=n*x,s=new Me.Vector2(n*Math.sign(i.x),c*Math.sign(i.y)).normalize().multiplyScalar(r/2).add(o);J(new Me.Vector3(s.x,s.y)),He(n,c),Pe((function(e){var a,o=new Map,i=Object(f.a)(e.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(Lw(r)&&(t.has(r.id)||l.has(r.id))){var d=M.current.get(r.id),h=W.current.get(r.id);if(d&&h){var p=h[0]*n,y=h[1]*c;if(r.lx=p,r.ly=y,r.parentId!==xt){var g=o.get(r.parentId);if(g){var m=g.pos,w=g.rot,x=new Me.Vector3(d[0]*n+s.x,d[1]*c+s.y),v=x.clone().sub(m).applyEuler(new Me.Euler(0,0,-w));r.cx=v.x,r.cy=v.y,o.set(r.id,{pos:x.clone(),rot:r.rotation[2]+w})}}else{var b=d[0]*n+s.x,A=d[1]*c+s.y;r.cx=b,r.cy=A,o.set(r.id,{pos:new Me.Vector3(b,A),rot:r.rotation[2]})}var T,P=Object(f.a)(e.elements);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.foundationId===r.id)switch(S.type){case V.Wall:var H=S,R=j.current.get(H.id);if(!R)continue;var D=Object(u.a)(R,2),I=D[0],C=D[1],O=[I.x*p,I.y*y,r.lz],F=[C.x*p,C.y*y,r.lz];H.cx=(O[0]+F[0])/2,H.cy=(O[1]+F[1])/2,H.lx=Math.hypot(O[0]-F[0]+(O[1]-F[1])),H.relativeAngle=Math.atan2(F[1]-O[1],F[0]-O[0]),H.leftPoint=[].concat(O),H.rightPoint=[].concat(F);break;case V.Window:var k=S;if(k.parentType!==V.Roof)continue;var Y=z.current.get(k.id);if(!Y)continue;k.cx=Y[0]*p,k.cy=Y[1]*y}}}catch(L){P.e(L)}finally{P.f()}}}}}catch(L){i.e(L)}finally{i.f()}}))}else{var d=o.distanceTo(a),h=Math.atan2(a.x-o.x,a.y-o.y)+Q,p=Math.abs(d*Math.sin(h)),y=Math.abs(d*Math.cos(h)),g=(new Me.Vector2).addVectors(a,o).multiplyScalar(.5);J(new Me.Vector3(g.x,g.y)),He(p,y),Pe((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(t.has(o.id))o.lx=p,o.ly=y,o.cx=g.x,o.cy=g.y;else if(o.foundationId&&t.has(o.foundationId))switch(o.type){case V.Wall:var i=o,r=j.current.get(i.id);if(!r)continue;var n=Object(u.a)(r,2),c=n[0],s=n[1],d=[c.x*p,c.y*y,0],h=[s.x*p,s.y*y,0];i.cx=(d[0]+h[0])/2,i.cy=(d[1]+h[1])/2,i.lx=Math.hypot(d[0]-h[0],d[1]-h[1]),i.relativeAngle=Math.atan2(h[1]-d[1],h[0]-d[0]),i.leftPoint=[].concat(d),i.rightPoint=[].concat(h);break;case V.Window:var m=o;if(m.parentType!==V.Roof)continue;var w=z.current.get(m.id);if(!w)continue;m.cx=w[0]*p,m.cy=w[1]*y}}}catch(x){a.e(x)}finally{a.f()}}))}Ew.getState().updateElementOnRoofFn()}(i);break;case vC.ResizeZ:!function(e){if(!(e.z<.1)){var t=e.z;se(t),Pe((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(S.current.has(o.id))if(o.type===V.Wall){o.lz=t*S.current.get(o.id);var i=o;if(i.fill===Ue.Partial){var r=H.current.get(i.id);r&&(i.leftTopPartialHeight=t*r.upperLeft,i.rightTopPartialHeight=t*r.upperRight,i.leftUnfilledHeight=t*r.lowerLeft,i.rightUnfilledHeight=t*r.lowerRight)}}else if(o.type===V.Roof)o.rise=t*S.current.get(o.id);else if(o.type===V.Cuboid){var n=S.current.get(o.id);if(n){var c=n*t;o.lz=c,o.cz=c/2}}}}catch(s){a.e(s)}finally{a.f()}e.updateElementOnRoofFlag=!0}))}}(i);break;case vC.RotateLower:case vC.RotateUpper:!function(e){var a=new Me.Vector3(N.x,N.y),o=Math.atan2(a.x-e.x,e.y-a.y)+(ge===vC.RotateUpper?0:Math.PI),i=o+(Math.abs(o)>Math.PI?-bt:0),r=new Me.Euler(0,0,i),n=D.current.size;Pe((function(e){var o,c=Object(f.a)(e.elements);try{for(c.s();!(o=c.n()).done;){var s=o.value;if(Lw(s)&&t.has(s.id)&&!l.has(s.id)){var d=R.current.get(s.id),u=1!==n?D.current.get(s.id):0;if(d&&void 0!==u){var h=d.clone().applyEuler(r);s.cx=a.x+h.x,s.cy=a.y+h.y,s.rotation=[0,0,u+i]}}if(s.type!==V.Cuboid&&t.has(s.parentId)){var p=1!==n?D.current.get(s.parentId):0;void 0!==p&&(s.rotation=[0,0,p+i])}}}catch(y){c.e(y)}finally{c.f()}})),Z(i)}(i);break;case vC.Move:J((new Me.Vector3).addVectors(i.clone().setZ(0),I.current)),Pe((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;if(Lw(r)&&t.has(r.id)&&!l.has(r.id)){var n=R.current.get(r.id);n&&(r.cx=i.x+n.x,r.cy=i.y+n.y)}}}catch(c){o.e(c)}finally{o.f()}}))}}}},onPointerUp:function(e){switch(ge){case vC.Move:case vC.RotateLower:case vC.RotateUpper:!function(){var e,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;(Lw(o)&&t.has(o.id)||t.has(o.parentId))&&l.set(o.id,[o.cx,o.cy,o.cz,o.rotation[2]])}}catch(n){a.e(n)}finally{a.f()}var i=ge===vC.Move?"Move":"Rotate",r={name:"".concat(i," Foundation Group"),timestamp:Date.now(),oldPositionMap:new Map(O.current),newPositionMap:new Map(l),undo:function(){We(r.oldPositionMap)},redo:function(){We(r.newPositionMap)}};je(r)}();break;case vC.ResizeXY:!function(){var e,t=new Map,l=new Map,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(e=o.n()).done;){var i=e.value;if(Lw(i)&&O.current.has(i.id))t.set(i.id,[i.cx,i.cy,i.lx,i.ly]);else if(F.current.has(i.id)){var r=i;l.set(i.id,[].concat(Object(h.a)(r.leftPoint),Object(h.a)(r.rightPoint)))}else if(L.current.has(i.id)){var n=i;if(n.parentType!==V.Roof)continue;a.set(n.id,[n.cx,n.cy])}}}catch(s){o.e(s)}finally{o.f()}var c={name:"Resize Building XY",timestamp:Date.now(),oldFoundationDataMap:new Map(O.current),newFoundationDataMap:new Map(t),oldWallPointsMap:new Map(F.current),newWallPointsMap:new Map(l),oldSkylightPosMap:new Map(L.current),newSkylightPosMap:new Map(a),undo:function(){Re(c.oldFoundationDataMap,c.oldWallPointsMap,c.oldSkylightPosMap)},redo:function(){Re(c.newFoundationDataMap,c.newWallPointsMap,c.newSkylightPosMap)}};je(c)}();break;case vC.ResizeZ:!function(){var e,t=new Map,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;if(k.current.has(o.id)&&(o.type===V.Roof?t.set(o.id,o.rise):t.set(o.id,o.lz)),o.type===V.Wall&&Y.current.has(o.id)){var i=o;l.set(i.id,{lowerLeft:i.leftUnfilledHeight,lowerRight:i.rightUnfilledHeight,upperLeft:i.leftTopPartialHeight,upperRight:i.rightTopPartialHeight})}}}catch(n){a.e(n)}finally{a.f()}var r={name:"Resize Building Z",timestamp:Date.now(),oldElementHeightMap:new Map(k.current),newElementHeightMap:new Map(t),oldPartialWallHeightMap:new Map(Y.current),newPartialWallHeightMap:new Map(l),undo:function(){De(r.oldElementHeightMap,r.oldPartialWallHeightMap)},redo:function(){De(r.newElementHeightMap,r.newPartialWallHeightMap)}};je(r)}()}he(!1),Et.getState().setEnableOrbitController(!0),C.current=!1,me(vC.Null),Ie(null),Pe((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag,e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.updateElementOnRoofFlag=!0}))}}),Object(gf.jsx)("group",{name:"Wireframe Group",position:[0,0,ce/2],children:Object(gf.jsx)(ry,{hx:ee,hy:oe,hz:ce/2,lineColor:"white"})})]})},EY=n.a.memo(LY),UY=function(e){return e.parentId===xt&&(e.type===V.Foundation||e.type===V.Cuboid)},NY=function(e,t,l){var a=l.get(e),o=l.get(t);if(!a||!o)return!1;var i,r=Object(f.a)(a);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(Tw.isPointInside(n.x,n.y,o))return!0}}catch(w){r.e(w)}finally{r.f()}var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(Tw.isPointInside(d.x,d.y,a))return!0}}catch(w){s.e(w)}finally{s.f()}a.push(a[0]),o.push(o[0]);for(var u=0;u0){Tf.setState((function(e){e.waiting=!0}));var l=new FileReader;l.readAsText(t.files[0]);var o=t.files[0].name;a((function(e){e.localFileName=o})),l.onload=function(){if(l.result){var o=JSON.parse(l.result.toString());e?f&&(a((function(e){e.localContentToImportAfterCloudFileUpdate=o})),Tf.getState().setSaveCloudFileFlag(!0)):i(o)}t.value=""}}},t.click()},I=function(){x(!0),function(){var e=h.trim();if(e.length>0){e.endsWith(".ala")||(e+=".ala");var t=new Blob([JSON.stringify(o())],{type:"application/json"});return Object(Jh.saveAs)(t,e),a((function(t){t.localFileName=e,t.cloudFile=void 0})),!0}return Qh(me.t("menu.file.SavingAbortedMustHaveValidFileName",R)+"."),!1}()&&Tf.setState((function(e){e.saveLocalFileDialogVisible=!1})),x(!1)},C=function(){Tf.setState((function(e){e.saveLocalFileDialogVisible=!1}))};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return T(!0)},onMouseOut:function(){return T(!1)},children:me.t("menu.file.SaveAsLocalFile",R)}),footer:f?[Object(gf.jsx)(xv.a,{onClick:function(){f&&a((function(e){e.localFileName=f,e.localFileName.endsWith(".ala")||(e.localFileName+=".ala")}))},children:me.t("menu.file.UseCloudFileName",R)},"Apply"),Object(gf.jsx)(xv.a,{onClick:C,children:me.t("word.Cancel",R)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:I,disabled:!h,children:me.t("word.OK",R)},"OK")]:[Object(gf.jsx)(xv.a,{onClick:C,children:me.t("word.Cancel",R)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:I,disabled:!h,children:me.t("word.OK",R)},"OK")],visible:c,confirmLoading:w,onCancel:C,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!A,bounds:j,onStart:function(e,t){return function(e,t){if(z.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=z.current.getBoundingClientRect();H({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:z,children:e})})},children:Object(gf.jsx)(ET.a,{placeholder:"File name",value:h,onPressEnter:I,onChange:function(e){a((function(t){t.localFileName=e.target.value}))}})})})},KY=n.a.memo(BY),qY=function(){var e=Ew(Ji),t=Ew((function(e){return e.world})),l=Ew((function(e){return e.elements})),a=Ew((function(e){return e.viewState})),o=Ew((function(e){return e.notes})),i=Tf(Ns),n=Tf(Vs),c=Tf(Mi),s=Tf(Wi),d=Ew(Is),u=Ew(Os),f=Ew(ks),h=Ew(Li),p=new URLSearchParams(window.location.search),y="true"===p.get("viewonly"),g="true"===p.get("map");return Object(r.useEffect)((function(){d(),u(),f(),h(),Tf.setState((function(e){e.openModelsMap=g,g&&(e.modelsMapFlag=!0,e.modelsMapWeatherStations=!1,e.leaderboardFlag=!0,e.showLeaderboard=!0)}))}),[]),Object(r.useEffect)((function(){Tf.getState().skipChange?s(!1):Tf.getState().changed||c(!0)}),[t,a,l,o]),Object(r.useEffect)((function(){i&&Tf.setState((function(e){e.showSolarRadiationHeatmap=!1})),n&&Tf.setState((function(e){e.showHeatFluxes=!1}))}),[t,l]),Object(gf.jsx)(Vw.a,{locale:e,children:Object(gf.jsxs)(Uw,{children:[y?Object(gf.jsx)(XY,{viewOnly:!0}):Object(gf.jsxs)(Nw.a,{onBeforeunload:function(){return""},children:[Object(gf.jsx)(XY,{viewOnly:!1})," "]}),Object(gf.jsx)(KY,{viewOnly:y})]})})};s.a.render(Object(gf.jsx)(n.a.StrictMode,{children:Object(gf.jsx)(qY,{})}),document.getElementById("root"))}},[[791,1,2]]]); -//# sourceMappingURL=main.d3157261.chunk.js.map \ No newline at end of file +(this.webpackJsonpaladdin=this.webpackJsonpaladdin||[]).push([[0],{421:function(e){e.exports=JSON.parse('{"docid":"pSdH5rJWovu8hchgLSnsqT","time":"02/02/2023 12:24 pm","timestamp":1675358675337,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"timesPerHour":20,"date":"1/22/2022 10:15:00 AM","longitude":-71.3488548,"name":"default","address":"Natick, MA","ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"orthographic":false,"cameraZoom":28.63945562104857},"elements":[{"cy":1.9385448115528998,"name":"June","type":"Human","cz":1.1465644746167777e-15,"normal":[0,1,0],"cx":-2.72710574788732,"selected":false,"id":"8si9AKQwGf4sYiD91xfFr6","rotation":[0,0,0],"parentId":"Ground"}],"view":{"mapWeatherStations":false,"showGroundPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"groundPanelY":0,"yearlyLightSensorPanelY":0,"axes":true,"showHeliodonPanel":true,"showWeatherPanel":false,"dailyLightSensorPanelY":0,"mapType":"roadmap","groundImage":false,"autoRotate":false,"dailyLightSensorPanelX":0,"showYearlyLightSensorPanel":false,"weatherPanelY":0,"heliodonPanelX":-6,"showStickyNotePanel":true,"groundColor":"#16cda5","weatherPanelX":0,"heliodonPanelY":9,"groundPanelX":0,"shadowEnabled":true,"theme":"Default","heliodon":true,"stickyNotePanelY":0,"yearlyLightSensorPanelX":0,"showDailyLightSensorPanel":false,"mapZoom":16,"stickyNotePanelX":0,"cameraPosition":[-2.2645315712935465,-19.016408185270922,3.0537676736998205],"panCenter":[1.9284721678646957,1.0746189678250615,2.420128405670479],"orthographic":false,"enableRotate":true,"cameraZoom":24.55475326309651,"showInstructionPanel":false,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999799],"panCenter2D":[0,0,0],"showSunAngles":true,"stickyNotePanelRect":{"x":-5,"y":-2,"width":309,"height":64}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Sun angles relative to the ground"]}')},422:function(e){e.exports=JSON.parse('{"docid":"aLZxDeCyLDDueFWdBcXne3","time":"02/02/2023 12:27 pm","timestamp":1675358863088,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":0,"timesPerHour":6,"date":"9/22/2022, 3:00:00 PM","longitude":-71.3488548,"name":"default","address":"","ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"orthographic":false,"cameraZoom":28.63945562104857,"noAnimationForSensorDataCollection":true},"elements":[{"cy":-3.793749931074972,"name":"Jeanette","type":"Human","cz":0,"normal":[0,1,0],"cx":-1.8371287635005462,"selected":false,"id":"8si9AKQwGf4sYiD91xfFr6","rotation":[0,0,0],"parentId":"Ground","lx":0.4,"ly":0.6,"lz":1.62},{"type":"Foundation","cx":-0.02034256309656146,"cy":-0.0945631153454527,"cz":0.05,"lx":4.039349774896637,"ly":4.009416382499952,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"vtjS16tFJ2nQYaRPqaTXtD","textureType":"Foundation Texture #2"},{"type":"Sensor","cx":0.24583065540477922,"cy":-0.24570551313996075,"cz":0.5000000074505806,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vtjS16tFJ2nQYaRPqaTXtD","foundationId":"vtjS16tFJ2nQYaRPqaTXtD","id":"1RgbN67ETfax1aEC4UN1sd","selected":false}],"view":{"mapWeatherStations":false,"showGroundPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"groundPanelY":0,"yearlyLightSensorPanelY":5,"axes":true,"showHeliodonPanel":true,"showWeatherPanel":false,"dailyLightSensorPanelY":203,"mapType":"roadmap","groundImage":false,"autoRotate":false,"dailyLightSensorPanelX":-31,"showYearlyLightSensorPanel":true,"weatherPanelY":0,"heliodonPanelX":-5,"showStickyNotePanel":true,"groundColor":"#16cda5","weatherPanelX":0,"heliodonPanelY":4,"groundPanelX":0,"shadowEnabled":true,"theme":"Default","heliodon":true,"stickyNotePanelY":0,"yearlyLightSensorPanelX":-1,"showDailyLightSensorPanel":false,"mapZoom":16,"stickyNotePanelX":0,"cameraPosition":[14.252594110627898,-20.834202556609767,6.804345920821559],"panCenter":[0,0,0],"orthographic":false,"enableRotate":true,"cameraZoom":58.72652247402654,"showInstructionPanel":false,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999795],"panCenter2D":[0,0,0],"showSunAngles":true,"stickyNotePanelRect":{"x":1204,"y":154,"width":595,"height":199},"yearlyLightSensorPanelRect":{"x":-1284,"y":2,"width":600,"height":500},"yearlyLightSensorPanelShowDaylight":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["The solar radiation at different locations of the Earth in different seasons is largely responsible for local climate. Overall, every place on the Earth has about the same hours of daylight in total (ideally 12\xd7365=4,380 hours), regardless of where it is. However, the distribution throughout the year is vastly different, resulting in large temperature variations across the globe. You can change the latitude to investigate these relationships. Make sure to refresh the graph after changing any variables."]}')},423:function(e){e.exports=JSON.parse('{"docid":"3DwyXjJjUExjZ1f5APPdnu","time":"11/13/2022 04:59 pm","timestamp":1668376781695,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"date":"6/22/2022 1:00:00 PM","timesPerHour":6,"address":"Natick, MA","latitude":42.2844063,"longitude":-71.3488548,"name":"default","orthographic":false,"cameraZoom":35,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"noAnimationForSensorDataCollection":true,"noAnimationForHeatmapSimulation":true},"elements":[{"selected":false,"cz":-0.00999999999999913,"cx":-0.2955982837076121,"type":"Human","id":"3NsNQgPftGsbYSoSRa2zV4","normal":[0,1,0],"cy":3.9255960830681698,"name":"Jack","rotation":[0,0,0],"parentId":"Ground","lx":0.42,"ly":0.42,"lz":1.8},{"selected":false,"cy":4.081504375344256,"name":"Jacqueline","rotation":[0,0,0],"normal":[0,1,0],"id":"xaNFgEDtpNwZNyUWnndg4x","cz":-0.009999999999999095,"type":"Human","cx":2.399220108700476,"parentId":"Ground","lx":0.43,"ly":0.6,"lz":1.78},{"cx":0.20566332108722207,"color":"gray","cz":2,"type":"Cuboid","lz":4,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":3.646712311386908,"cy":0.10935014088128625,"rotation":[0,0,0],"lx":2.2290047878920136,"id":"2QtCNEmEF6Mcs3vbbR96ZT","selected":false,"parentId":"Ground"},{"ly":0.1,"selected":false,"type":"Sensor","showLabel":true,"normal":[0,0,1],"lz":0.01,"rotation":[0,0,0],"lx":0.1,"cz":0.5,"cx":0.03109721392634064,"cy":0.16878784903489202,"id":"iqgmPt2Nm3r4bW8A7g6DJy","label":"Top","parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"label":"North","rotation":[0,0,0],"ly":0.1,"normal":[0,1,0],"cy":0.4999999988722325,"type":"Sensor","showLabel":true,"selected":false,"id":"soQWet6PH9YYEVPLyKPtZ1","cz":-0.036155842645941405,"lx":0.1,"lz":0.01,"cx":-0.0014535790327764226,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"normal":[1,0,0],"cz":0.012842850721372034,"cy":-0.02894757303561696,"ly":0.1,"lz":0.01,"label":"East","id":"g3pxtSA3CsXPiogBgtEeYs","lx":0.1,"showLabel":true,"rotation":[0,0,0],"type":"Sensor","cx":0.5000000161579515,"selected":false,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"lz":0.01,"showLabel":true,"rotation":[0,0,0],"cy":-0.4999999988722335,"selected":false,"id":"1GCXGRbm6nuTH23uA8Yngz","cx":0.028086152131634783,"normal":[0,-1,0],"cz":-0.16060425332465766,"ly":0.1,"type":"Sensor","label":"South","lx":0.1,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"selected":false,"ly":0.1,"normal":[-1,0,0],"rotation":[0,0,0],"id":"9Aqk7YM1qj7eBSDfhRzr51","cy":-0.0010171489984738787,"label":"West","cz":0.04694614030299604,"cx":-0.5000000161579532,"type":"Sensor","showLabel":true,"lz":0.01,"lx":0.1,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"}],"view":{"showDailyLightSensorPanel":true,"showYearlyLightSensorPanel":false,"autoRotate":false,"showGroundPanel":false,"yearlyLightSensorPanelY":70,"stickyNotePanelX":6,"mapType":"roadmap","weatherPanelY":0,"shadowEnabled":true,"theme":"Default","stickyNotePanelY":0,"mapWeatherStations":false,"groundColor":"#16cda5","heliodon":true,"dailyLightSensorPanelX":-19,"axes":true,"showWeatherPanel":false,"dailyLightSensorPanelY":15,"mapTilt":0,"heliodonPanelX":-1235,"groundPanelY":0,"heliodonPanelY":7,"groundImage":false,"mapZoom":16,"showStickyNotePanel":true,"groundPanelX":0,"weatherPanelX":0,"yearlyLightSensorPanelX":-905,"showHeliodonPanel":false,"cameraPosition":[11.69562560736218,15.284097405092108,4.526997191755329],"panCenter":[-2.432389491951708,0.8034413072625061,1.0138875329134873],"orthographic":false,"enableRotate":true,"cameraZoom":28.63945562104857,"cameraPosition2D":[0,-0.00004000177797536253,39.99999999997991],"panCenter2D":[0,0,0],"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar radiation to a box\\n\\nThis model shows the solar radiation the five sides (top, west, east, south, and north sides) of a box receives. There is a sensor on each side. Analyze the daily and annual sensor data to compare the solar radiation the five sides receive.\\n\\nYou can also change the day and the location to investigate the dependency of the results on these factors. "]}')},424:function(e){e.exports=JSON.parse('{"docid":"9q5sS1hxGDArNFtMUxxGLt","time":"02/02/2023 12:31 pm","timestamp":1675359088220,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"timesPerHour":20,"date":"2/22/2022 9:45:00 AM","longitude":-71.3488548,"name":"default","address":"Natick, MA","ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"orthographic":false,"cameraZoom":28.63945562104857},"elements":[{"cy":0.9214233571448283,"name":"Jaya","type":"Human","cz":0.05000000074505806,"normal":[0,1,0],"cx":-2.0622287048965853,"selected":false,"id":"8si9AKQwGf4sYiD91xfFr6","rotation":[0,0,0],"parentId":"73EHGXQZFsvacbt1n2ck3h","lx":0.6,"ly":0.42,"lz":1.55},{"rotation":[0,0,0],"normal":[0,0,1],"lx":8.151162622676603,"ly":6.576493454880806,"id":"73EHGXQZFsvacbt1n2ck3h","selected":false,"cz":0.05,"cy":1.1027590009475272,"cx":-0.9582675975183035,"lz":0.1,"type":"Foundation","parentId":"Ground"},{"poleSpacing":2,"label":"Solar Panel","showLabel":false,"lx":0.99,"drawSunBeam":true,"type":"Solar Panel","trackerType":"None","relativeAzimuth":0,"lz":0.05,"normal":[0,0,1],"cy":-0.16505049820470327,"cx":0.11464240173253676,"cz":0.5000000074505806,"poleRadius":0.05,"ly":1.65,"poleHeight":0,"rotation":[0,0,0],"selected":false,"orientation":"Portrait","tiltAngle":0,"id":"5QH64n4W7t2nwnWmzmGyMg","parentId":"73EHGXQZFsvacbt1n2ck3h","foundationId":"73EHGXQZFsvacbt1n2ck3h","pvModelName":"SPR-X21-335-BLK"},{"lz":0.01,"ly":0.1,"cx":0.1375052960984675,"showLabel":false,"id":"vPAwDhHdD9bH57J7RhabCf","cy":0.12369628620569162,"selected":false,"cz":0.5000000074505806,"type":"Sensor","normal":[0,0,1],"lx":0.1,"rotation":[0,0,0],"parentId":"73EHGXQZFsvacbt1n2ck3h","foundationId":"73EHGXQZFsvacbt1n2ck3h"}],"view":{"mapWeatherStations":false,"showGroundPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"groundPanelY":0,"yearlyLightSensorPanelY":0,"axes":true,"showHeliodonPanel":true,"showWeatherPanel":false,"dailyLightSensorPanelY":0,"mapType":"roadmap","groundImage":false,"autoRotate":false,"dailyLightSensorPanelX":0,"showYearlyLightSensorPanel":false,"weatherPanelY":0,"heliodonPanelX":-6,"showStickyNotePanel":true,"groundColor":"#68ccca","weatherPanelX":0,"heliodonPanelY":9,"groundPanelX":0,"shadowEnabled":true,"theme":"Default","heliodon":true,"stickyNotePanelY":0,"yearlyLightSensorPanelX":0,"showDailyLightSensorPanel":false,"mapZoom":16,"stickyNotePanelX":0,"cameraPosition":[-5.789682038682944,18.727459047471708,4.434763103599393],"panCenter":[-1.75129140268729,-0.10770909213304464,1.3605382204171563],"orthographic":false,"enableRotate":true,"cameraZoom":24.55475326309651,"showInstructionPanel":false,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999799],"panCenter2D":[0,0,0],"stickyNotePanelRect":{"x":0,"y":0,"width":473,"height":61}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Test if the sun beam aligns with the heliodon correctly"]}')},425:function(e){e.exports=JSON.parse('{"docid":"a23ZVUe81EjtB3oPinKZm4","time":"02/02/2023 12:19 pm","timestamp":1675358372271,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2775281,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3468091,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA, USA","date":"6/15/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.0145505850910366,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground","color":"#999999"},{"rotation":[0,0,0],"normal":[0,0,1],"showLabel":true,"label":"Monocrystalline","cy":-0.27899190547936026,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"cz":0.5000000074505806,"type":"Solar Panel","id":"c2J7QZr1z68dpk33yTT2Sd","orientation":"Landscape","cx":0.008285803864999835,"relativeAzimuth":0,"trackerType":"None","poleSpacing":3,"selected":false,"lz":0.046,"lx":17.138,"poleHeight":1,"drawSunBeam":false,"ly":2.092,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X21-335-BLK"},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":1.984,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":true,"label":"Polycrystalline","tiltAngle":0.5235987755982988,"poleSpacing":3,"rotation":[0,0,0],"lx":17.712,"selected":false,"orientation":"Landscape","cx":0.0011144506933526612,"relativeAzimuth":0,"cy":0.010234323153061437,"poleHeight":1,"drawSunBeam":false,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-355P-FG"},{"poleRadius":0.05,"type":"Solar Panel","lx":18.081,"lz":0.046,"relativeAzimuth":0,"drawSunBeam":false,"rotation":[0,0,0],"ly":2.464,"normal":[0,0,1],"poleSpacing":3,"cx":0.003982991962011493,"trackerType":"None","cy":0.32738584282585487,"label":"Thin Film","cz":0.5000000074506161,"orientation":"Landscape","showLabel":true,"selected":false,"poleHeight":1,"tiltAngle":0.5235987755982988,"id":"mAv2C19w4RJA4u6knYxU3u","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"FS-6430"},{"type":"Human","name":"Justin","cx":-0.6422253837185492,"cy":-6.097930974223568,"cz":0.05000000074505806,"lx":0.6,"lz":1.755,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmVJY65HF3sgVftctUAMHa","selected":false,"ly":0.42}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Forest","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[6.231682260523529,-11.839635427091224,3.4189848625017474],"panCenter":[1.5940644020050898,-0.07013351095627554,0.6762754823912617],"orthographic":false,"enableRotate":true,"cameraZoom":37.01235612443422,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.1982070075600382,150],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"waterSurface":false,"showMapPanel":false,"mapPanelX":175,"mapPanelY":53,"weatherPanelRect":{"x":696,"y":52,"width":500,"height":500},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-2,"y":0,"width":200,"height":65}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar panel types"]}')},426:function(e){e.exports=JSON.parse('{"docid":"wFMNzt7sPEDjKGAPcESDBP","time":"08/30/2023 08:36 am","timestamp":1693399003790,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.3600825,"pvGridCellSize":0.25,"timesPerHour":1,"longitude":-71.0588801,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Boston, MA, USA","date":"6/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"countryCode":"US"},"elements":[{"cy":-0.033179790625714745,"normal":[0,0,1],"lz":0.1,"ly":16.949918527981186,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.017129111403884067,"cz":0.05,"rotation":[0,0,0],"lx":37.87324352407775,"selected":false,"parentId":"Ground","color":"#16a5a5","label":""},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":2.132,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":true,"label":"E-W","tiltAngle":1.5707963267948966,"poleSpacing":2.1,"rotation":[0,0,0],"lx":10.48,"selected":false,"orientation":"Portrait","cx":-0.20024728670215317,"relativeAzimuth":-1.5707963267948966,"cy":-0.0004001413797904696,"poleHeight":2,"drawSunBeam":false,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS3W-420MB-AG","dailyYield":27.769005901292118},{"type":"Human","name":"Justin","cx":-0.8077148464578228,"cy":-2.467214041682034,"cz":0.05000000074505895,"lx":0.6,"lz":1.755,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmVJY65HF3sgVftctUAMHa","selected":false,"ly":0.42},{"type":"Solar Panel","pvModelName":"CS3W-420MB-AG","cx":0.19919037937422715,"cy":-0.0004001413797904696,"cz":0.5000000074505806,"lx":10.48,"ly":2.132,"lz":0.046,"trackerType":"None","tiltAngle":-1.5707963267948966,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":2,"poleSpacing":2.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Foundation","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oQUmi4HfhmDhT2fedCAHBP","selected":false,"dailyYield":17.55726336493663,"label":"N-S"}],"sceneRadius":24,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Mountain","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-939,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":49,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":true,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[9.42333778357062,-26.00860153882541,4.957120957652498],"panCenter":[9.680010046024961,1.8911434375133904,3.488277959545367],"orthographic":false,"enableRotate":true,"cameraZoom":19.000000000000004,"showInstructionPanel":false,"cameraPosition2D":[6.40968432574854,1.6481778498093007,150],"panCenter2D":[6.40968432574854,1.649178227254012,0.0000023981152496769078],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"waterSurface":false,"showMapPanel":false,"mapPanelX":39,"mapPanelY":49,"weatherPanelRect":{"x":696,"y":52,"width":500,"height":500},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-2,"y":0,"width":200,"height":65},"navigationView":false},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":["Bifacial solar panels"],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},427:function(e){e.exports=JSON.parse('{"docid":"fXAaqcjQbaBomkkTcKkuR5","time":"08/31/2023 10:18 am","timestamp":1693491481113,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.3600825,"pvGridCellSize":0.25,"timesPerHour":1,"longitude":-71.0588801,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Boston, MA, USA","date":"6/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"countryCode":"US","daysPerYear":12},"elements":[{"cy":-0.033179790625714745,"normal":[0,0,1],"lz":0.1,"ly":16.949918527981186,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.017129111403884067,"cz":0.05,"rotation":[0,0,0],"lx":37.87324352407775,"selected":false,"parentId":"Ground","color":"#666666","label":""},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":2.132,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":true,"label":"Bifacial","tiltAngle":0.6981317007977318,"poleSpacing":3,"rotation":[0,0,0],"lx":11.528,"selected":false,"orientation":"Portrait","cx":-0.20024728670215317,"relativeAzimuth":0,"cy":-0.0004001413797904696,"poleHeight":1.5,"drawSunBeam":false,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS3W-445MB-AG","dailyYield":8.868699562970985,"yearlyYield":7933.919486524438},{"type":"Human","name":"Justin","cx":-0.8077148464578228,"cy":-2.467214041682034,"cz":0.05000000074505895,"lx":0.6,"lz":1.755,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmVJY65HF3sgVftctUAMHa","selected":false,"ly":0.42},{"type":"Solar Panel","pvModelName":"CS3W-440MS","cx":0.19919037937422715,"cy":-0.0004001413797904696,"cz":0.5000000074505806,"lx":11.528,"ly":2.108,"lz":0.046,"trackerType":"None","tiltAngle":0.6981317007977318,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.5,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Foundation","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oQUmi4HfhmDhT2fedCAHBP","selected":false,"dailyYield":6.700357358830137,"label":"Monofacial","yearlyYield":6331.051197253751,"drawSunBeam":false}],"sceneRadius":24,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Mountain","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-939,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":true,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":49,"groundColor":"#194d33","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[21.044833876539915,-19.158030778662997,1.9640239249677898],"panCenter":[8.779754971790968,7.5724725159534465,1.9640239249677898],"orthographic":false,"enableRotate":true,"cameraZoom":19.000000000000004,"showInstructionPanel":false,"cameraPosition2D":[6.40968432574854,1.6481778498093007,150],"panCenter2D":[6.40968432574854,1.649178227254012,0.0000023981152496769078],"dailyPvYieldPanelRect":{"x":-1103,"y":47,"width":600,"height":400},"waterSurface":false,"showMapPanel":false,"mapPanelX":39,"mapPanelY":49,"weatherPanelRect":{"x":696,"y":52,"width":500,"height":500},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-2,"y":0,"width":265,"height":96},"navigationView":false,"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":true,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":["Comparing the annual outputs of bifacial and monofacial solar panels"],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},428:function(e){e.exports=JSON.parse('{"docid":"mxcpjFL7wwjT6kUG3dgBwT","time":"02/04/2023 01:21 pm","timestamp":1675534888279,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"3/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":true,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":true,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":true,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.25,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":3.22609431418537,"leftJoints":["1k67G1W1gvb3E7EbmbG1h1"],"rightJoints":["uytQSeUom5oDsFC3PKa7q8"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"u1AdedeCmmKa3QYfwjJ4ya","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":3.22609431418537,"rightRoofHeight":3.22609431418537,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.22609431418537,"rightTopPartialHeight":3.22609431418537},{"type":"Window","cx":-0.25833333333333336,"cy":-1.3376344861350336e-15,"cz":-0.08,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8KuTFKVbnS9JsUhgiz6ayk","parentId":"u1AdedeCmmKa3QYfwjJ4ya","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.26666666666666666,"cy":-1.1010413489448665e-14,"cz":-0.08,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2ddK5UqQWy74ghKtND3in4","parentId":"u1AdedeCmmKa3QYfwjJ4ya","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3.22609431418537,"leftJoints":["tKvexMf8zrvPgydcZb5VYA"],"rightJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"1k67G1W1gvb3E7EbmbG1h1","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":3.22609431418537,"rightRoofHeight":3.22609431418537,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.22609431418537,"rightTopPartialHeight":3.22609431418537},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3.22609431418537,"leftJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"rightJoints":["tKvexMf8zrvPgydcZb5VYA"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"uytQSeUom5oDsFC3PKa7q8","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":3.22609431418537,"rightRoofHeight":3.22609431418537,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.22609431418537,"rightTopPartialHeight":3.22609431418537},{"type":"Window","cx":0.3466666666666667,"cy":0,"cz":-0.059131688577327556,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ffkLQGy3NT64UfpCw11G41","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.10666666666666667,"cy":0,"cz":-0.059131688577327556,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gNMVvT81stFdLZCLrqUQZf","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.13333333333333333,"cy":0,"cz":-0.059131688577327556,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tVsnXCNKFAXpT1tvrhqYrT","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.36000000000000004,"cy":0,"cz":-0.059131688577327556,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5bfnZWdB6epkk2c8Lmex9Z","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3.22609431418537,"leftJoints":["uytQSeUom5oDsFC3PKa7q8"],"rightJoints":["1k67G1W1gvb3E7EbmbG1h1"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"tKvexMf8zrvPgydcZb5VYA","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":3.22609431418537,"rightRoofHeight":3.22609431418537,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.22609431418537,"rightTopPartialHeight":3.22609431418537},{"type":"Window","cx":-0.375,"cy":0,"cz":0,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aScdMHKjqapGhvxSXnrdVS","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.25,"cy":0,"cz":0,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"94qFJLPpyieU8kH3r8ea1u","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.24999999999999992,"cy":0,"cz":0,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hqJtpQuGAWonh9XMck7DkQ","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.37499999999999994,"cy":0,"cz":0,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iepBWG7Nk7RRKfgVSDffBC","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":0.5,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-0.07737809374999927,"cy":-0.08634488504745477,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.08065235785463425,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["tKvexMf8zrvPgydcZb5VYA"],"textureType":"Roof Texture Default","color":"#666666","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"45NB7k7GYboywbxoXsYHLH","leftRidgeLength":3,"rightRidgeLength":3,"label":"","rise":1.3492858897703286,"ceiling":false},{"type":"Door","cx":0.00416666666666667,"cy":0,"cz":-0.125,"lx":0.24166666666666667,"ly":0,"lz":0.75,"textureType":"Door Texture #5","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"bm1UTSxwjiN1iZGr4Z4Fm6","doorType":"Default","archHeight":1,"filled":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.045101456155734465,"cy":-0.1728550176508481,"cz":3.912059639775531,"lx":1.558,"ly":1.046,"lz":0.046,"showLabel":true,"normal":[0,-0.26053732960492465,0.9654637745054627],"rotation":[0.26357871191724236,0,0],"color":"#fff","parentType":"Roof","parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"hggpkWHD6D2DWRepcABzSN","selected":false,"dailyYield":1.1606630204047466,"yearlyYield":14.01350339573908,"label":"S","labelSize":0.4},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.04923325035798107,"cy":0.23033266020936075,"cz":4.048748074874304,"lx":1.558,"ly":1.046,"lz":0.046,"showLabel":true,"normal":[1.836536775249149e-17,0.26053732960492476,0.9654637745054627],"rotation":[0.2635787119172426,0,3.141592653589793],"color":"#fff","parentType":"Roof","parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"3AjZD5PGir6Pw6qNxAXT2v","selected":false,"dailyYield":0.7689476441385455,"yearlyYield":9.02911259075203,"label":"N","labelSize":0.4},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.23435630964973508,"cy":0.03020266603782977,"cz":3.927707691404531,"lx":1.558,"ly":1.046,"lz":0.046,"showLabel":true,"normal":[-0.3976643293667701,3.3320459964913965e-17,0.9175309701308599],"rotation":[0.4089698333626983,0,4.71238898038469],"color":"#fff","parentType":"Roof","parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"dfe7nQ9k8jDK91KdkmUEv6","selected":false,"dailyYield":0.9541736397038687,"yearlyYield":11.32280863910204,"label":"W","labelSize":0.4},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.3049880725182647,"cy":0.048385609165732826,"cz":3.978511539183477,"lx":1.558,"ly":1.046,"lz":0.046,"showLabel":true,"normal":[0.39766432936677054,-1.33281839859656e-16,0.9175309701308599],"rotation":[0.40896983336269876,0,1.5707963267948961],"color":"#fff","parentType":"Roof","parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"1dU1iCu9PPq5BqZD1KErE7","selected":false,"dailyYield":0.9576426115274149,"yearlyYield":11.37252332042091,"label":"E","labelSize":0.4},{"type":"Sensor","cx":0.057157621054107106,"cy":0.14033655142046375,"cz":4.4036437311884296,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0,0.2605373296049247,0.9654637745054626],"rotation":[0.2635787119172426,0,3.141592653589793],"parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"mKDuzWBHjARCKjue8riAq8","selected":false,"label":"N"},{"type":"Sensor","cx":0.05632462642172124,"cy":-0.03881517090426316,"cz":4.440639819780413,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0,-0.26053732960492465,0.9654637745054627],"rotation":[0.26357871191724236,0,0],"parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"qMhiLQRXRChHGtKoRd73LF","selected":false,"label":"S"},{"type":"Sensor","cx":0.25193424207044157,"cy":0.045340891802389115,"cz":4.396078903758752,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0.39766432936677054,-1.33281839859656e-16,0.9175309701308599],"rotation":[0.40896983336269876,0,1.5707963267948961],"parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"3DwwhpFKYxSqcDS4CihiGw","selected":false,"label":"E"},{"type":"Sensor","cx":-0.1790489651075926,"cy":0.040907220548995316,"cz":4.363011644147998,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[-0.3976643293667701,3.3320459964913965e-17,0.9175309701308599],"rotation":[0.4089698333626983,0,4.71238898038469],"parentId":"45NB7k7GYboywbxoXsYHLH","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"72Y7F2N3gynqymAnAg1DcZ","selected":false,"label":"W"}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[3.096291394829855,-4.886200526627762,20.956812400919997],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.847108697996333,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":true,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.5949692122407761,0.408443644397781,1.6485310965583475],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":4,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"dailyPvYieldPanelRect":{"x":-25,"y":27,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyLightSensorPanelRect":{"x":-1275,"y":17,"width":600,"height":360},"stickyNotePanelRect":{"x":-4,"y":-3,"width":303,"height":64}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar panels on different sides of a roof"]}')},429:function(e){e.exports=JSON.parse('{"docid":"4FPGPRyja1jZsFg1c9iXEn","time":"02/19/2023 11:51 am","timestamp":1676825516232,"userid":"HPwaZxo6jaPjQcD6cBGUWPpQkVw2","owner":null,"email":null,"world":{"pvGridCellSize":0.5,"sutGridCellSize":1,"noAnimationForHeatmapSimulation":false,"latitude":42.30152633098348,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"name":"default","highestTemperatureTimeInMinutes":900,"daysPerYear":12,"date":"5/1/2023, 8:30:00 AM","sutDaysPerYear":4,"timesPerHour":4,"cspTimesPerHour":4,"ground":{"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05},"cspGridCellSize":0.5,"noAnimationForSolarUpdraftTowerSimulation":false,"noAnimationForSolarPanelSimulation":false,"dustLoss":0.05,"sutTimesPerHour":4,"address":"Quincy, MA, USA","cspDaysPerYear":4,"diurnalTemperatureModel":1,"solarRadiationHeatmapGridCellSize":1.5,"noAnimationForThermalSimulation":false,"airAttenuationCoefficient":0.01,"noAnimationForSensorDataCollection":false,"airConvectiveCoefficient":5,"longitude":-71.04686341053608},"elements":[{"solarUpdraftTower":{},"textureType":"No Foundation Texture","lx":212.5285321639104,"rotation":[0,0,0],"solarPowerTower":{},"cx":-10.534022898559044,"id":"m2Y8UkiEpzxPgEaP4XFVt6","cz":0.05,"ly":289.40841858160877,"cy":-5.174607839650079,"lz":0.1,"hvacSystem":{"thermostatSetpoint":20},"parentId":"Ground","solarAbsorberPipe":{},"type":"Foundation","normal":[0,0,1],"color":"#808080","selected":false},{"lz":0.4,"cx":0,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","cy":0,"vertices":[{"y":-0.015548960261952672,"x":-0.13409964163315105},{"x":0.1599785198430574,"y":0.4768347813665486},{"y":0.4768347813665486,"x":0.3034886626434471},{"x":0.34113066731240177,"y":0.43191556283201865},{"x":0.3764200466895468,"y":0.41463894031873794},{"y":0.35762608602491147,"x":0.37406742139773713},{"x":0.2917255361843988,"y":0.23496206618061816},{"y":0.1710385628814794,"x":0.2987834120598278},{"x":0.2799624097253504,"y":0.11402570858765293},{"y":0.006910649005312299,"x":0.22585202801372808},{"x":0.1529206439676284,"y":-0.04146389403187379},{"y":-0.06219584104781069,"x":0.1458627680921994},{"y":-0.06565116555046684,"x":0.09175238638057703},{"y":-0.08292778806374758,"x":0.06587350817067068},{"x":-0.08234188521333836,"y":-0.08292778806374758}],"ly":0.4,"lx":0.4,"color":"#ffffff","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","id":"5DXDSqQGwG9HHBGtTSMivo","type":"Polygon","filled":true,"lineColor":"#b3b3b3","rotation":[0,0,0],"selectedIndex":10,"normal":[0,0,1],"opacity":0,"selected":false,"cz":0},{"rotation":[0,0,0],"showLabel":false,"poleRadius":0.05,"poleSpacing":3,"trackerType":"None","referenceId":"5DXDSqQGwG9HHBGtTSMivo","id":"39YHB9jsen7civ3YRJKQCC","cy":-0.06921706043720798,"drawSunBeam":false,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","frameColor":"white","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","orientation":"Portrait","normal":[0,0,1],"color":"#fff","selected":false,"relativeAzimuth":0,"type":"Solar Panel","cx":-0.0044720631905931785,"poleHeight":1,"tiltAngle":0.5235987755982988,"lx":31.744,"pvModelName":"CS6X-355P-FG","lz":0.006,"cz":0.1,"ly":3.936},{"normal":[0,0,1],"tiltAngle":0.5235987755982988,"cy":-0.04416595779295089,"lx":50.592,"cz":0.1,"rotation":[0,0,0],"drawSunBeam":false,"poleRadius":0.05,"orientation":"Portrait","lz":0.006,"type":"Solar Panel","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","selected":false,"trackerType":"None","referenceId":"5DXDSqQGwG9HHBGtTSMivo","ly":3.936,"id":"wRpEM8qhuhZqcTqN2dpgxk","cx":0.020668929177468376,"pvModelName":"CS6X-355P-FG","showLabel":false,"color":"#fff","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"frameColor":"white","poleSpacing":3,"poleHeight":1},{"pvModelName":"CS6X-355P-FG","trackerType":"None","tiltAngle":0.5235987755982988,"selected":false,"color":"#fff","poleSpacing":3,"orientation":"Portrait","frameColor":"white","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","drawSunBeam":false,"cy":-0.019114855148693807,"relativeAzimuth":0,"showLabel":false,"cx":0.026370111541441255,"normal":[0,0,1],"cz":0.1,"lz":0.006,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","rotation":[0,0,0],"poleRadius":0.05,"type":"Solar Panel","ly":3.936,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","poleHeight":1,"id":"tD1s9u51ND5RmtjGVXGCLf","lx":61.504},{"cz":0.1,"tiltAngle":0.5235987755982988,"frameColor":"white","id":"uqbw8SLNidH2HVf3A3aEpb","poleHeight":1,"pvModelName":"CS6X-355P-FG","lx":68.448,"relativeAzimuth":0,"showLabel":false,"type":"Solar Panel","lz":0.006,"drawSunBeam":false,"poleRadius":0.05,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","selected":false,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","cy":0.005936247495563277,"rotation":[0,0,0],"ly":3.936,"trackerType":"None","orientation":"Portrait","color":"#fff","cx":0.04797937239367053,"poleSpacing":3,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1]},{"frameColor":"white","cz":0.1,"trackerType":"None","type":"Solar Panel","ly":3.936,"id":"abu8rTHpebENbtwLNiH7VV","selected":false,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"tiltAngle":0.5235987755982988,"drawSunBeam":true,"pvModelName":"CS6X-355P-FG","lz":0.006,"cx":0.06772862843868938,"color":"#fff","showLabel":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1],"relativeAzimuth":0,"cy":0.03098735013982036,"poleSpacing":3,"orientation":"Portrait","rotation":[0,0,0],"lx":68.448,"poleRadius":0.05},{"drawSunBeam":false,"cx":0.0815369877932561,"poleHeight":1,"lx":68.448,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","trackerType":"None","cy":0.056038452784077444,"id":"nZ63hCPNboQvjJjFBKXPux","pvModelName":"CS6X-355P-FG","tiltAngle":0.5235987755982988,"selected":false,"normal":[0,0,1],"cz":0.1,"showLabel":false,"relativeAzimuth":0,"ly":3.936,"rotation":[0,0,0],"frameColor":"white","poleSpacing":3,"color":"#fff","orientation":"Portrait","poleRadius":0.05,"lz":0.006,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","referenceId":"5DXDSqQGwG9HHBGtTSMivo","type":"Solar Panel"},{"lz":0.006,"cy":0.08108955542833453,"poleRadius":0.05,"trackerType":"None","poleHeight":1,"cx":0.09534534714782292,"cz":0.1,"normal":[0,0,1],"relativeAzimuth":0,"frameColor":"white","id":"hif4KqE4YP3kUVrrgkfMhx","ly":3.936,"showLabel":false,"lx":67.456,"orientation":"Portrait","selected":false,"color":"#fff","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","drawSunBeam":false,"tiltAngle":0.5235987755982988,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","pvModelName":"CS6X-355P-FG","poleSpacing":3,"rotation":[0,0,0],"referenceId":"5DXDSqQGwG9HHBGtTSMivo","type":"Solar Panel"},{"relativeAzimuth":0,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","selected":false,"tiltAngle":0.5235987755982988,"ly":3.936,"cy":0.10614065807259161,"orientation":"Portrait","color":"#fff","cx":0.1091537065023897,"trackerType":"None","showLabel":false,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":67.456,"poleRadius":0.05,"pvModelName":"CS6X-355P-FG","rotation":[0,0,0],"poleSpacing":3,"lz":0.006,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"cz":0.1,"id":"qfhB3DdpB1gYjw25yY8eTt","frameColor":"white","normal":[0,0,1],"drawSunBeam":false,"type":"Solar Panel"},{"cz":0.1,"rotation":[0,0,0],"id":"oKCroDuPSw8Jz4hpytmpuV","tiltAngle":0.5235987755982988,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","lz":0.006,"relativeAzimuth":0,"poleSpacing":3,"pvModelName":"CS6X-355P-FG","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1],"selected":false,"ly":3.936,"type":"Solar Panel","color":"#fff","frameColor":"white","trackerType":"None","poleRadius":0.05,"poleHeight":1,"lx":65.472,"cx":0.12116209363369557,"drawSunBeam":false,"orientation":"Portrait","cy":0.13119176071684868,"showLabel":false},{"lz":0.006,"drawSunBeam":false,"selected":false,"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.13277794649991534,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"id":"mHK7aYVb1Wk6EsoKnJgiKD","relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"color":"#fff","frameColor":"white","trackerType":"None","tiltAngle":0.5235987755982988,"cz":0.1,"poleSpacing":3,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","referenceId":"5DXDSqQGwG9HHBGtTSMivo","showLabel":false,"normal":[0,0,1],"cy":0.15624286336110577,"rotation":[0,0,0],"ly":3.936,"lx":64.48},{"poleSpacing":3,"cx":0.14138598430837385,"frameColor":"white","id":"9pHe3mAgmKZtQtjzLXxdYX","rotation":[0,0,0],"poleHeight":1,"pvModelName":"CS6X-355P-FG","color":"#fff","orientation":"Portrait","cy":0.18129396600536285,"normal":[0,0,1],"drawSunBeam":false,"lz":0.006,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","trackerType":"None","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"lx":61.504,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"cz":0.1,"tiltAngle":0.5235987755982988,"showLabel":false,"type":"Solar Panel","ly":3.936,"selected":false},{"cy":0.20634506864961993,"showLabel":false,"poleRadius":0.05,"selected":false,"ly":3.936,"frameColor":"white","cz":0.1,"type":"Solar Panel","relativeAzimuth":0,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","rotation":[0,0,0],"normal":[0,0,1],"poleSpacing":3,"color":"#fff","trackerType":"None","pvModelName":"CS6X-355P-FG","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","id":"wxnBoqUDaxFyzEJ8C9neNT","drawSunBeam":false,"lx":57.536,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","orientation":"Portrait","lz":0.006,"cx":0.14748395783026924,"poleHeight":1,"tiltAngle":0.5235987755982988},{"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"selected":false,"rotation":[0,0,0],"frameColor":"white","poleSpacing":3,"relativeAzimuth":0,"cz":0.1,"tiltAngle":0.5235987755982988,"normal":[0,0,1],"cx":0.1535819313521647,"lz":0.006,"id":"wFKvkQ1Z8bZ4V5gp8W9qaV","type":"Solar Panel","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":54.56,"trackerType":"None","orientation":"Portrait","color":"#fff","poleRadius":0.05,"cy":0.23139617129387702,"showLabel":false,"ly":3.936,"pvModelName":"CS6X-355P-FG","drawSunBeam":false,"referenceId":"5DXDSqQGwG9HHBGtTSMivo"},{"referenceId":"5DXDSqQGwG9HHBGtTSMivo","selected":false,"relativeAzimuth":0,"rotation":[0,0,0],"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","tiltAngle":0.5235987755982988,"poleRadius":0.05,"lx":54.56,"lz":0.006,"showLabel":false,"normal":[0,0,1],"poleHeight":1,"trackerType":"None","color":"#fff","type":"Solar Panel","frameColor":"white","pvModelName":"CS6X-355P-FG","drawSunBeam":false,"cz":0.1,"id":"5UEd5WPYGM3mteKkUdGC5b","ly":3.936,"cy":0.2564472739381341,"orientation":"Portrait","cx":0.1650931283901031,"poleSpacing":3},{"lx":54.56,"poleSpacing":3,"color":"#fff","rotation":[0,0,0],"normal":[0,0,1],"selected":false,"pvModelName":"CS6X-355P-FG","drawSunBeam":false,"poleRadius":0.05,"cz":0.1,"poleHeight":1,"trackerType":"None","orientation":"Portrait","cx":0.18098221432743639,"lz":0.006,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","frameColor":"white","cy":0.2814983765823912,"tiltAngle":0.5235987755982988,"id":"2svrFi8xQmtUMBe5ZAK81o","showLabel":false,"ly":3.936,"type":"Solar Panel","referenceId":"5DXDSqQGwG9HHBGtTSMivo","relativeAzimuth":0,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6"},{"cx":0.19687130026476962,"cy":0.30654947922664827,"poleRadius":0.05,"rotation":[0,0,0],"poleHeight":1,"selected":false,"showLabel":false,"lz":0.006,"type":"Solar Panel","normal":[0,0,1],"id":"bGivs5Yuda48gHtDd1BsdF","poleSpacing":3,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":55.552,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","frameColor":"white","pvModelName":"CS6X-355P-FG","referenceId":"5DXDSqQGwG9HHBGtTSMivo","drawSunBeam":false,"ly":3.936,"relativeAzimuth":0,"color":"#fff","orientation":"Portrait","cz":0.1,"tiltAngle":0.5235987755982988,"trackerType":"None"},{"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","orientation":"Portrait","selected":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lz":0.006,"pvModelName":"CS6X-355P-FG","relativeAzimuth":0,"cz":0.1,"showLabel":false,"lx":55.552,"frameColor":"white","poleSpacing":3,"poleRadius":0.05,"referenceId":"5DXDSqQGwG9HHBGtTSMivo","poleHeight":1,"tiltAngle":0.5235987755982988,"rotation":[0,0,0],"cy":0.33160058187090535,"type":"Solar Panel","normal":[0,0,1],"color":"#fff","id":"jm8EQPxBbaiTMXoQiF7CER","ly":3.936,"trackerType":"None","cx":0.21276038620210297,"drawSunBeam":false},{"poleSpacing":3,"frameColor":"white","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","rotation":[0,0,0],"lz":0.006,"lx":55.552,"id":"8a4sJM8CzcwGaTVPbJ3rEU","color":"#fff","trackerType":"None","relativeAzimuth":0,"ly":3.936,"poleHeight":1,"pvModelName":"CS6X-355P-FG","type":"Solar Panel","cz":0.1,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1],"referenceId":"5DXDSqQGwG9HHBGtTSMivo","showLabel":false,"cy":0.35665168451516244,"poleRadius":0.05,"cx":0.232198442985121,"selected":false,"drawSunBeam":false,"orientation":"Portrait","tiltAngle":0.5235987755982988},{"selected":false,"drawSunBeam":false,"ly":3.936,"showLabel":false,"orientation":"Portrait","color":"#fff","poleHeight":1,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":52.576,"frameColor":"white","type":"Solar Panel","cz":0.1,"poleSpacing":3,"tiltAngle":0.5235987755982988,"normal":[0,0,1],"referenceId":"5DXDSqQGwG9HHBGtTSMivo","trackerType":"None","cy":0.3817027871594195,"id":"mSAWD32s6rcXazrWTV4Xv5","cx":0.24019624331923956,"rotation":[0,0,0],"relativeAzimuth":0,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lz":0.006,"poleRadius":0.05,"pvModelName":"CS6X-355P-FG"},{"poleRadius":0.05,"selected":false,"normal":[0,0,1],"id":"5LQqmcsTvpZmQs4iTqrCGu","cy":0.4067538898036766,"lz":0.006,"orientation":"Portrait","rotation":[0,0,0],"lx":49.6,"ly":3.936,"drawSunBeam":false,"showLabel":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"cx":0.248194043653358,"cz":0.1,"type":"Solar Panel","color":"#fff","poleSpacing":3,"trackerType":"None","pvModelName":"CS6X-355P-FG","frameColor":"white","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","tiltAngle":0.5235987755982988,"poleHeight":1,"referenceId":"5DXDSqQGwG9HHBGtTSMivo"},{"frameColor":"white","cx":0.23674454976762427,"ly":3.936,"poleSpacing":3,"poleHeight":1,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","trackerType":"None","tiltAngle":0.5235987755982988,"drawSunBeam":false,"relativeAzimuth":0,"rotation":[0,0,0],"showLabel":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":38.688,"poleRadius":0.05,"pvModelName":"CS6X-355P-FG","cz":0.1,"type":"Solar Panel","referenceId":"5DXDSqQGwG9HHBGtTSMivo","color":"#fff","orientation":"Portrait","cy":0.4318049924479337,"lz":0.006,"selected":false,"id":"32Cg2tC6n7DHigNkVxdrgt","normal":[0,0,1]},{"relativeAzimuth":0,"tiltAngle":0.5235987755982988,"id":"sqjEqAoMgMpxq5BxsJh969","cx":0.23372915722930276,"cy":0.4568560950921907,"type":"Solar Panel","frameColor":"white","referenceId":"5DXDSqQGwG9HHBGtTSMivo","ly":3.936,"drawSunBeam":false,"pvModelName":"CS6X-355P-FG","lz":0.006,"poleRadius":0.05,"color":"#fff","orientation":"Portrait","lx":30.752,"cz":0.1,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","normal":[0,0,1],"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleSpacing":3,"showLabel":false,"rotation":[0,0,0],"selected":false,"trackerType":"None","poleHeight":1},{"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","selectedIndex":0,"lx":0.4,"normal":[0,0,1],"lz":0.4,"ly":0.4,"opacity":0,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","id":"i53LLgEmjv9V4sT2Bw7T8V","cy":0,"rotation":[0,0,0],"color":"#ffffff","vertices":[{"x":-0.37171479610592745,"y":-0.45264750984795554},{"y":-0.41291127806740985,"x":-0.37171479610592745},{"x":-0.35759904435506945,"y":-0.3887240065488168},{"x":-0.3975936743158338,"y":-0.3749027085381922},{"x":-0.38818317314859513,"y":-0.3144345297417096},{"x":-0.4164146766503111,"y":-0.27815362246382},{"x":-0.37877267198135645,"y":-0.13821298010624597},{"y":-0.07083415230445106,"x":-0.35759904435506945},{"y":-0.07083415230445106,"x":-0.2093836509710604},{"y":-0.25569401319655505,"x":0.0799892599215287},{"y":-0.3679920595328799,"x":0.061168257587051356},{"y":-0.4025453045594414,"x":0.01646837704266767},{"x":-0.07763663462971902,"y":-0.43364322508334674},{"y":-0.45437517209928363,"x":-0.11057338871505437}],"cz":0,"cx":0,"selected":false,"filled":true,"lineColor":"#999999","type":"Polygon"},{"type":"Solar Panel","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","relativeAzimuth":0,"color":"#fff","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","pvModelName":"CS6X-355P-FG","poleHeight":1,"poleSpacing":3,"rotation":[0,0,0],"frameColor":"white","id":"rjtxU5WsNM51KRLNQSNjpi","trackerType":"None","cz":0.1,"tiltAngle":0.5235987755982988,"selected":false,"orientation":"Portrait","normal":[0,0,1],"cy":-0.44066444447274405,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"drawSunBeam":false,"lz":0.006,"showLabel":false,"lx":54.56,"ly":3.936,"cx":-0.23295381956127093},{"orientation":"Portrait","cy":-0.41561334182848697,"id":"r4etahi9gw6GJxHew37bNn","poleHeight":1,"poleSpacing":3,"lx":67.456,"cx":-0.20254012539999636,"normal":[0,0,1],"selected":false,"frameColor":"white","lz":0.006,"drawSunBeam":false,"relativeAzimuth":0,"showLabel":false,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","type":"Solar Panel","ly":3.936,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","cz":0.1,"pvModelName":"CS6X-355P-FG","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"trackerType":"None","rotation":[0,0,0],"tiltAngle":0.5235987755982988,"color":"#fff"},{"poleSpacing":3,"trackerType":"None","frameColor":"white","lx":78.368,"normal":[0,0,1],"poleHeight":1,"cz":0.1,"orientation":"Portrait","showLabel":false,"cy":-0.3905622391842299,"tiltAngle":0.5235987755982988,"cx":-0.16654214275360996,"poleRadius":0.05,"color":"#fff","selected":false,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"rotation":[0,0,0],"drawSunBeam":false,"id":"oPaST5wTNmvuMg4irNTNvF","ly":3.936,"pvModelName":"CS6X-355P-FG","lz":0.006,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","type":"Solar Panel"},{"poleHeight":1,"relativeAzimuth":0,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","ly":3.936,"type":"Solar Panel","id":"fF8k5yd2hu4Rwpr6gbrW2i","normal":[0,0,1],"tiltAngle":0.5235987755982988,"cy":-0.3655111365399728,"poleRadius":0.05,"poleSpacing":3,"selected":false,"lx":92.256,"drawSunBeam":false,"frameColor":"white","cz":0.1,"showLabel":false,"lz":0.006,"trackerType":"None","pvModelName":"CS6X-355P-FG","rotation":[0,0,0],"orientation":"Portrait","color":"#fff","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","cx":-0.16834099366066035},{"pvModelName":"CS6X-355P-FG","color":"#fff","normal":[0,0,1],"poleSpacing":3,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","selected":false,"cz":0.1,"orientation":"Portrait","showLabel":false,"cx":-0.16377492283812295,"trackerType":"None","frameColor":"white","lz":0.006,"lx":93.248,"ly":3.936,"rotation":[0,0,0],"poleHeight":1,"id":"vR22Q3vueKbYiqVBv8D26g","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"drawSunBeam":false,"tiltAngle":0.5235987755982988,"type":"Solar Panel","poleRadius":0.05,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","cy":-0.3404600338957157},{"pvModelName":"CS6X-355P-FG","poleSpacing":3,"cx":-0.1597263390941956,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","cz":0.1,"poleRadius":0.05,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","tiltAngle":0.5235987755982988,"showLabel":false,"selected":false,"rotation":[0,0,0],"relativeAzimuth":0,"cy":-0.31540893125145864,"id":"fHL4NPe6GsTPPqRFeNWFSj","color":"#fff","poleHeight":1,"trackerType":"None","drawSunBeam":false,"type":"Solar Panel","frameColor":"white","ly":3.936,"orientation":"Portrait","lx":93.248,"lz":0.006,"normal":[0,0,1]},{"showLabel":false,"drawSunBeam":false,"trackerType":"None","lx":97.216,"cy":-0.29035782860720155,"poleSpacing":3,"poleHeight":1,"rotation":[0,0,0],"pvModelName":"CS6X-355P-FG","ly":3.936,"orientation":"Portrait","relativeAzimuth":0,"selected":false,"lz":0.006,"cz":0.1,"type":"Solar Panel","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","frameColor":"white","tiltAngle":0.5235987755982988,"color":"#fff","poleRadius":0.05,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","cx":-0.16533131631908343,"normal":[0,0,1],"id":"wo99UxfjEn2Sft7C8epu1F"},{"cy":-0.26530672596294447,"poleSpacing":3,"color":"#fff","trackerType":"None","cz":0.1,"lz":0.006,"tiltAngle":0.5235987755982988,"rotation":[0,0,0],"poleRadius":0.05,"ly":3.936,"cx":-0.16654823110912362,"selected":false,"frameColor":"white","id":"atncuqMmE5QUMBXmuECL7c","normal":[0,0,1],"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"orientation":"Portrait","relativeAzimuth":0,"drawSunBeam":false,"pvModelName":"CS6X-355P-FG","type":"Solar Panel","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":100.192,"showLabel":false},{"lz":0.006,"orientation":"Portrait","lx":92.256,"cy":-0.24025562331868738,"selected":false,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","ly":3.936,"color":"#fff","drawSunBeam":false,"type":"Solar Panel","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleHeight":1,"tiltAngle":0.5235987755982988,"pvModelName":"CS6X-355P-FG","frameColor":"white","poleSpacing":3,"showLabel":false,"rotation":[0,0,0],"trackerType":"None","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"normal":[0,0,1],"id":"pRs6eMcbHHwteicGZNiUf4","cx":-0.17740291781012096,"relativeAzimuth":0,"cz":0.1},{"type":"Solar Panel","color":"#fff","frameColor":"white","normal":[0,0,1],"poleRadius":0.05,"tiltAngle":0.5235987755982988,"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","relativeAzimuth":0,"lz":0.006,"pvModelName":"CS6X-355P-FG","ly":3.936,"drawSunBeam":false,"poleHeight":1,"id":"oTDhH5JF9kfv5Xuz6jEMoT","rotation":[0,0,0],"showLabel":false,"selected":false,"cy":-0.2152045206744303,"cz":0.1,"orientation":"Portrait","trackerType":"None","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","cx":-0.1936407690619649,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":82.336,"poleSpacing":3},{"tiltAngle":0.5235987755982988,"relativeAzimuth":0,"trackerType":"None","showLabel":false,"lz":0.006,"normal":[0,0,1],"parentId":"m2Y8UkiEpzxPgEaP4XFVt6","selected":false,"ly":3.936,"orientation":"Portrait","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","drawSunBeam":false,"cx":-0.2098786203138088,"color":"#fff","pvModelName":"CS6X-355P-FG","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","poleRadius":0.05,"cz":0.1,"cy":-0.19015341803017322,"lx":72.416,"id":"vTDkEMLLiFSDFeVQ9M7gEq","rotation":[0,0,0],"type":"Solar Panel","poleSpacing":3,"frameColor":"white","poleHeight":1},{"lx":63.488,"drawSunBeam":false,"poleHeight":1,"cx":-0.22611647156565276,"poleRadius":0.05,"lz":0.006,"selected":false,"poleSpacing":3,"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","trackerType":"None","tiltAngle":0.5235987755982988,"orientation":"Portrait","ly":3.936,"showLabel":false,"relativeAzimuth":0,"rotation":[0,0,0],"pvModelName":"CS6X-355P-FG","referenceId":"i53LLgEmjv9V4sT2Bw7T8V","type":"Solar Panel","color":"#fff","frameColor":"white","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","cy":-0.16510231538591613,"cz":0.1,"id":"ddcikvHRjDyv431v3iHzR9","normal":[0,0,1]},{"cy":-0.14005121274165905,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","poleRadius":0.05,"frameColor":"white","color":"#fff","trackerType":"None","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","selected":false,"ly":3.936,"poleHeight":1,"tiltAngle":0.5235987755982988,"type":"Solar Panel","cx":-0.2423189775828182,"lx":53.568,"normal":[0,0,1],"showLabel":false,"relativeAzimuth":0,"rotation":[0,0,0],"drawSunBeam":false,"poleSpacing":3,"id":"kzwB7XdQnSLaWv37UNBRHE","pvModelName":"CS6X-355P-FG","lz":0.006,"cz":0.1,"orientation":"Portrait"},{"relativeAzimuth":0,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"trackerType":"None","orientation":"Portrait","drawSunBeam":false,"poleSpacing":3,"cx":-0.25798989752621326,"selected":false,"lx":43.647999999999996,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","pvModelName":"CS6X-355P-FG","cz":0.1,"ly":3.936,"rotation":[0,0,0],"foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","type":"Solar Panel","color":"#fff","normal":[0,0,1],"showLabel":false,"id":"iSBjaL3vNJSWkMSnEcxexJ","cy":-0.11500011009740196,"frameColor":"white","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lz":0.006,"poleHeight":1},{"pvModelName":"CS6X-355P-FG","selected":false,"referenceId":"i53LLgEmjv9V4sT2Bw7T8V","rotation":[0,0,0],"drawSunBeam":false,"cy":-0.08994900745314488,"cz":0.1,"id":"inhpfuX2LqrdYubxNoTMKi","trackerType":"None","lz":0.006,"poleRadius":0.05,"frameColor":"white","foundationId":"m2Y8UkiEpzxPgEaP4XFVt6","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"poleSpacing":3,"showLabel":false,"type":"Solar Panel","parentId":"m2Y8UkiEpzxPgEaP4XFVt6","lx":33.728,"ly":3.936,"normal":[0,0,1],"poleHeight":1,"orientation":"Portrait","cx":-0.2736608174696083,"color":"#fff"},{"type":"Foundation","cx":130.77937125760448,"cy":3.87684921362672,"cz":0.05,"lx":56.64628450306867,"ly":56.97569559573312,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"#808080","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"nCbdmnahzfS1w9hiPKySNL","label":"Rainbow Swash","labelSize":4,"labelHeight":50,"showLabel":true,"labelFontSize":50,"labelColor":"black"},{"type":"Wall","cx":-14.049964379597128,"cy":20.03116873649283,"cz":0,"lx":6.020797289396148,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.8682349942715186,"leftPoint":[-11.799964379597128,22.03116873649283,0.1],"rightPoint":[-16.299964379597128,18.03116873649283,0.1],"leftJoints":["eJTbEVraxbUMqMs6Np8NKF"],"rightJoints":["hXhPy1xFEnY2hwUty4JKnh"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"dg44T4UU4svJo7xChjjMQJ","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-18.049964379597128,"cy":15.53116873649283,"cz":0,"lx":6.103277807866851,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.101663015995481,"leftPoint":[-16.299964379597128,18.03116873649283,0.1],"rightPoint":[-19.799964379597128,13.03116873649283,0.1],"leftJoints":["dg44T4UU4svJo7xChjjMQJ"],"rightJoints":["r6mVuTRZiSA9BuDPhjz2Lp"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"hXhPy1xFEnY2hwUty4JKnh","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-20.799964379597128,"cy":10.28116873649283,"cz":0,"lx":5.852349955359813,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.363617976800782,"leftPoint":[-19.799964379597128,13.03116873649283,0.1],"rightPoint":[-21.799964379597128,7.53116873649283,0.1],"leftJoints":["hXhPy1xFEnY2hwUty4JKnh"],"rightJoints":["7XqqJhYujD5LNMbkq5uwj5"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"r6mVuTRZiSA9BuDPhjz2Lp","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-22.149964379597122,"cy":4.63116873649283,"cz":0,"lx":5.842088667591412,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.592280244817776,"leftPoint":[-21.799964379597128,7.53116873649283,0.1],"rightPoint":[-22.49996437959713,1.7311687364928305,0.1],"leftJoints":["r6mVuTRZiSA9BuDPhjz2Lp"],"rightJoints":["f9fikVMDyJeGH7jFyXZWwX"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"7XqqJhYujD5LNMbkq5uwj5","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-22.44996437959712,"cy":-0.7688312635071695,"cz":0,"lx":5.000999900019995,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.7323863143578375,"leftPoint":[-22.499964379597117,1.7311687364928305,0.1],"rightPoint":[-22.399964379597122,-3.2688312635071703,0.1],"leftJoints":["7XqqJhYujD5LNMbkq5uwj5"],"rightJoints":["xuvvfjRXMWdjTE7V8yHHHs"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"f9fikVMDyJeGH7jFyXZWwX","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-21.549964379597128,"cy":-6.568831263507171,"cz":0,"lx":6.815423684555494,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":4.964484961052763,"leftPoint":[-22.399964379597122,-3.2688312635071703,0.1],"rightPoint":[-20.699964379597134,-9.86883126350717,0.1],"leftJoints":["f9fikVMDyJeGH7jFyXZWwX"],"rightJoints":["up3mEwP5XpBuhYU31R9sSn"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"xuvvfjRXMWdjTE7V8yHHHs","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-19.49996437959713,"cy":-11.918831263507169,"cz":0,"lx":4.750789408087882,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":5.241978579166767,"leftPoint":[-20.699964379597134,-9.86883126350717,0.1],"rightPoint":[-18.299964379597128,-13.96883126350717,0.1],"leftJoints":["xuvvfjRXMWdjTE7V8yHHHs"],"rightJoints":["3RcJPAXuGxFdfSHj5R15Et"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"up3mEwP5XpBuhYU31R9sSn","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-16.549964379597128,"cy":-16.46883126350717,"cz":0,"lx":6.103277807866851,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":5.323114944773899,"leftPoint":[-18.299964379597128,-13.96883126350717,0.1],"rightPoint":[-14.799964379597128,-18.96883126350717,0.1],"leftJoints":["up3mEwP5XpBuhYU31R9sSn"],"rightJoints":["5CVoJKJNEiwZKYgJZcNSFi"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"3RcJPAXuGxFdfSHj5R15Et","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-11.749964379597131,"cy":-20.51883126350717,"cz":0,"lx":6.842514157822414,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":5.81300184353285,"leftPoint":[-14.799964379597142,-18.96883126350717,0.1],"rightPoint":[-8.699964379597134,-22.06883126350717,0.1],"leftJoints":["3RcJPAXuGxFdfSHj5R15Et"],"rightJoints":["jBn8o6CDfAHiZEGaPT1dBH"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"5CVoJKJNEiwZKYgJZcNSFi","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-5.699964379597134,"cy":-22.868831263507175,"cz":0,"lx":6.209669878504014,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":6.022582915432245,"leftPoint":[-8.699964379597134,-22.068831263507175,0.1],"rightPoint":[-2.6999643795971338,-23.668831263507172,0.1],"leftJoints":["5CVoJKJNEiwZKYgJZcNSFi"],"rightJoints":["7WeEQ5XGbSwarbCtZLcy3v"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"jBn8o6CDfAHiZEGaPT1dBH","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":0.20003562040287193,"cy":-23.918831263507172,"cz":0,"lx":5.82151183113116,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":6.197191015985346,"leftPoint":[-2.6999643795971338,-23.668831263507172,0.1],"rightPoint":[3.1000356204028776,-24.168831263507172,0.1],"leftJoints":["jBn8o6CDfAHiZEGaPT1dBH"],"rightJoints":["v7jn11zR2wYLhDxejpfXGD"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"7WeEQ5XGbSwarbCtZLcy3v","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":5.250035620402855,"cy":-23.36883126350717,"cz":0,"lx":4.588027898781775,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.35621965539615097,"leftPoint":[3.1000356204028776,-24.168831263507172,0.1],"rightPoint":[7.400035620402861,-22.56883126350717,0.1],"leftJoints":["7WeEQ5XGbSwarbCtZLcy3v"],"rightJoints":["ijnWnJpBMsWV74W4WWEWNB"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"v7jn11zR2wYLhDxejpfXGD","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":8.800035620402866,"cy":-22.01883126350717,"cz":0,"lx":3.008321791298265,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.3743336160075845,"leftPoint":[7.400035620402861,-22.56883126350717,0.1],"rightPoint":[10.200035620402872,-21.46883126350717,0.1],"leftJoints":["v7jn11zR2wYLhDxejpfXGD"],"rightJoints":["crmfHAnSRdMR5VgizUq9LM"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"ijnWnJpBMsWV74W4WWEWNB","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":11.450035620402872,"cy":-20.71883126350717,"cz":0,"lx":2.9154759474226504,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.5404195002705842,"leftPoint":[10.200035620402872,-21.46883126350717,0.1],"rightPoint":[12.700035620402872,-19.96883126350717,0.1],"leftJoints":["ijnWnJpBMsWV74W4WWEWNB"],"rightJoints":["8PdqQxoo78gsSMQ7Gk5KLR"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"crmfHAnSRdMR5VgizUq9LM","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":13.950035620402872,"cy":-18.96883126350717,"cz":0,"lx":3.2015621187164243,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.6747409422235527,"leftPoint":[12.700035620402872,-19.96883126350717,0.1],"rightPoint":[15.200035620402872,-17.96883126350717,0.1],"leftJoints":["crmfHAnSRdMR5VgizUq9LM"],"rightJoints":["6qpKnQqjrecVz81WJpLQT3"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"8PdqQxoo78gsSMQ7Gk5KLR","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":16.450035620402872,"cy":-16.96883126350717,"cz":0,"lx":3.2015621187164243,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.6747409422235527,"leftPoint":[15.200035620402872,-17.96883126350717,0.1],"rightPoint":[17.700035620402872,-15.96883126350717,0.1],"leftJoints":["8PdqQxoo78gsSMQ7Gk5KLR"],"rightJoints":["hELSBxVzGyyQWpXPyvjTHw"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"6qpKnQqjrecVz81WJpLQT3","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":18.700035620402872,"cy":-14.96883126350717,"cz":0,"lx":2.8284271247461903,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.7853981633974483,"leftPoint":[17.700035620402872,-15.96883126350717,0.1],"rightPoint":[19.700035620402872,-13.96883126350717,0.1],"leftJoints":["6qpKnQqjrecVz81WJpLQT3"],"rightJoints":["4fB42Goo94xeF9fnshTMSp"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"hELSBxVzGyyQWpXPyvjTHw","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":20.700035620402872,"cy":-12.71883126350717,"cz":0,"lx":3.2015621187164243,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":0.8960553845713439,"leftPoint":[19.700035620402872,-13.96883126350717,0.1],"rightPoint":[21.700035620402872,-11.46883126350717,0.1],"leftJoints":["hELSBxVzGyyQWpXPyvjTHw"],"rightJoints":["43JV1qpPY5ifjyLwezRVA6"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"4fB42Goo94xeF9fnshTMSp","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":23.200035620402872,"cy":-8.71883126350717,"cz":0,"lx":6.264982043070834,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.0714496051147666,"leftPoint":[21.700035620402872,-11.46883126350717,0.1],"rightPoint":[24.700035620402872,-5.96883126350717,0.1],"leftJoints":["4fB42Goo94xeF9fnshTMSp"],"rightJoints":["4w2rHft9nRb3VsBiJ3yDka"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"43JV1qpPY5ifjyLwezRVA6","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":25.200035620402872,"cy":-3.9688312635071696,"cz":0,"lx":4.123105625617661,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.3258176636680326,"leftPoint":[24.700035620402872,-5.96883126350717,0.1],"rightPoint":[25.700035620402872,-1.9688312635071696,0.1],"leftJoints":["43JV1qpPY5ifjyLwezRVA6"],"rightJoints":["drEpxmzAKwiqtosy39e6Vr"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"4w2rHft9nRb3VsBiJ3yDka","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":25.700035620402872,"cy":0.031168736492830362,"cz":0,"lx":4,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.5707963267948966,"leftPoint":[25.700035620402872,-1.9688312635071696,0.1],"rightPoint":[25.700035620402872,2.0311687364928304,0.1],"leftJoints":["4w2rHft9nRb3VsBiJ3yDka"],"rightJoints":["doFL6ojJQmnX4K2WrFghMW"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"drEpxmzAKwiqtosy39e6Vr","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":25.700035620402872,"cy":3.7811687364928304,"cz":0,"lx":3.5,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.5707963267948966,"leftPoint":[25.700035620402872,2.0311687364928304,0.1],"rightPoint":[25.700035620402872,5.53116873649283,0.1],"leftJoints":["drEpxmzAKwiqtosy39e6Vr"],"rightJoints":["p64ZbjyJXwL2QB5NtHDbAL"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"doFL6ojJQmnX4K2WrFghMW","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":25.200035620402872,"cy":7.53116873649283,"cz":0,"lx":4.123105625617661,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.8157749899217608,"leftPoint":[25.700035620402872,5.53116873649283,0.1],"rightPoint":[24.700035620402872,9.53116873649283,0.1],"leftJoints":["doFL6ojJQmnX4K2WrFghMW"],"rightJoints":["2ovFHEfiXwzvGxgJdZVohF"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"p64ZbjyJXwL2QB5NtHDbAL","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":23.950035620402872,"cy":11.28116873649283,"cz":0,"lx":3.8078865529319543,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":1.9756881130799802,"leftPoint":[24.700035620402872,9.53116873649283,0.1],"rightPoint":[23.200035620402872,13.03116873649283,0.1],"leftJoints":["p64ZbjyJXwL2QB5NtHDbAL"],"rightJoints":["4FRjmDxxDfS6r8HLMLZ4VF"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"2ovFHEfiXwzvGxgJdZVohF","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":22.450035620402872,"cy":14.53116873649283,"cz":0,"lx":3.3541019662496847,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.0344439357957027,"leftPoint":[23.200035620402872,13.03116873649283,0.1],"rightPoint":[21.700035620402872,16.03116873649283,0.1],"leftJoints":["2ovFHEfiXwzvGxgJdZVohF"],"rightJoints":["ce3qFMioJ6iam6f3Ps6XMK"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"4FRjmDxxDfS6r8HLMLZ4VF","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":20.700035620402872,"cy":17.03116873649283,"cz":0,"lx":2.8284271247461903,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.356194490192345,"leftPoint":[21.700035620402872,16.03116873649283,0.1],"rightPoint":[19.700035620402872,18.03116873649283,0.1],"leftJoints":["4FRjmDxxDfS6r8HLMLZ4VF"],"rightJoints":["hMHLjh9gVUXjqtgU6m8bRM"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"ce3qFMioJ6iam6f3Ps6XMK","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":18.700035620402872,"cy":19.28116873649283,"cz":0,"lx":3.2015621187164243,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.2455372690184494,"leftPoint":[19.700035620402872,18.03116873649283,0.1],"rightPoint":[17.700035620402872,20.53116873649283,0.1],"leftJoints":["ce3qFMioJ6iam6f3Ps6XMK"],"rightJoints":["abAkJXmsmcg5ajbzQfYkR5"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"hMHLjh9gVUXjqtgU6m8bRM","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":16.450035620402872,"cy":21.28116873649283,"cz":0,"lx":2.9154759474226504,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.601173153319209,"leftPoint":[17.700035620402872,20.53116873649283,0.1],"rightPoint":[15.200035620402872,22.03116873649283,0.1],"leftJoints":["hMHLjh9gVUXjqtgU6m8bRM"],"rightJoints":["ksNDjPcxBviiRDPqzCkcR3"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"abAkJXmsmcg5ajbzQfYkR5","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":12.700035620402872,"cy":23.53116873649283,"cz":0,"lx":5.830951894845301,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.601173153319209,"leftPoint":[15.200035620402872,22.03116873649283,0.1],"rightPoint":[10.200035620402872,25.03116873649283,0.1],"leftJoints":["abAkJXmsmcg5ajbzQfYkR5"],"rightJoints":["2G6Ycemoq6UcAJEBxk2txa"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"ksNDjPcxBviiRDPqzCkcR3","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":7.750035620402883,"cy":25.58116873649283,"cz":0,"lx":5.021951811795889,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":2.9207638838604444,"leftPoint":[10.200035620402872,25.03116873649283,0.1],"rightPoint":[5.300035620402866,26.131168736492832,0.1],"leftJoints":["ksNDjPcxBviiRDPqzCkcR3"],"rightJoints":["aaWFv2WxaeMYVbeK6B3njf"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"2G6Ycemoq6UcAJEBxk2txa","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-9.799964379597128,"cy":22.78116873649283,"cz":0,"lx":4.272001872658765,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.5003633238603653,"leftPoint":[-7.799964379597128,23.53116873649283,0.1],"rightPoint":[-11.799964379597128,22.03116873649283,0.1],"leftJoints":["wcz96GJreptw2HHTTyJGnx"],"rightJoints":["dg44T4UU4svJo7xChjjMQJ"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"eJTbEVraxbUMqMs6Np8NKF","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-6.049964379597128,"cy":24.28116873649283,"cz":0,"lx":3.8078865529319543,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.5464844398748765,"leftPoint":[-4.299964379597128,25.03116873649283,0.1],"rightPoint":[-7.799964379597128,23.53116873649283,0.1],"leftJoints":["2B4JavsLMUjzTvW2zcVwEQ"],"rightJoints":["eJTbEVraxbUMqMs6Np8NKF"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"wcz96GJreptw2HHTTyJGnx","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":-2.799964379597128,"cy":25.53116873649283,"cz":0,"lx":3.1622776601683795,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.4633432079864352,"leftPoint":[-1.299964379597128,26.03116873649283,0.1],"rightPoint":[-4.299964379597128,25.03116873649283,0.1],"leftJoints":["aaWFv2WxaeMYVbeK6B3njf"],"rightJoints":["wcz96GJreptw2HHTTyJGnx"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"2B4JavsLMUjzTvW2zcVwEQ","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Wall","cx":2.000035620402855,"cy":26.08116873649283,"cz":0,"lx":6.600757532283728,"ly":0.3,"lz":43,"eavesLength":0.3,"rValue":2,"fill":"Full","relativeAngle":3.156743009464563,"leftPoint":[5.300035620402866,26.131168736492832,0.1],"rightPoint":[-1.2999643795971565,26.03116873649283,0.1],"leftJoints":["2G6Ycemoq6UcAJEBxk2txa"],"rightJoints":["2B4JavsLMUjzTvW2zcVwEQ"],"textureType":"No Wall Texture","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"aaWFv2WxaeMYVbeK6B3njf","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"eNawNU6nX2MwYS8vPdrDfM","leftRoofHeight":43,"rightRoofHeight":43,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":43,"rightTopPartialHeight":43},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.2,"rValue":2,"color":"#ffffff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["ksNDjPcxBviiRDPqzCkcR3","2G6Ycemoq6UcAJEBxk2txa","aaWFv2WxaeMYVbeK6B3njf","2B4JavsLMUjzTvW2zcVwEQ","wcz96GJreptw2HHTTyJGnx","eJTbEVraxbUMqMs6Np8NKF","dg44T4UU4svJo7xChjjMQJ","hXhPy1xFEnY2hwUty4JKnh","r6mVuTRZiSA9BuDPhjz2Lp","7XqqJhYujD5LNMbkq5uwj5","f9fikVMDyJeGH7jFyXZWwX","xuvvfjRXMWdjTE7V8yHHHs","up3mEwP5XpBuhYU31R9sSn","3RcJPAXuGxFdfSHj5R15Et","5CVoJKJNEiwZKYgJZcNSFi","jBn8o6CDfAHiZEGaPT1dBH","7WeEQ5XGbSwarbCtZLcy3v","v7jn11zR2wYLhDxejpfXGD","ijnWnJpBMsWV74W4WWEWNB","crmfHAnSRdMR5VgizUq9LM","8PdqQxoo78gsSMQ7Gk5KLR","6qpKnQqjrecVz81WJpLQT3","hELSBxVzGyyQWpXPyvjTHw","4fB42Goo94xeF9fnshTMSp","43JV1qpPY5ifjyLwezRVA6","4w2rHft9nRb3VsBiJ3yDka","drEpxmzAKwiqtosy39e6Vr","doFL6ojJQmnX4K2WrFghMW","p64ZbjyJXwL2QB5NtHDbAL","2ovFHEfiXwzvGxgJdZVohF","4FRjmDxxDfS6r8HLMLZ4VF","ce3qFMioJ6iam6f3Ps6XMK","hMHLjh9gVUXjqtgU6m8bRM","abAkJXmsmcg5ajbzQfYkR5"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nCbdmnahzfS1w9hiPKySNL","foundationId":"nCbdmnahzfS1w9hiPKySNL","id":"eNawNU6nX2MwYS8vPdrDfM"}],"view":{"yearlyLightSensorPanelShowDaylight":false,"showYearlyParabolicDishYieldPanel":false,"showSunAngles":false,"showDailyFresnelReflectorYieldPanel":false,"groundPanelY":0,"waterSurface":false,"solarRadiationHeatMapMaxValue":6,"yearlyParabolicDishYieldPanelRect":{"y":0,"x":0,"width":600,"height":400},"showHeliodonPanel":false,"showDailyLightSensorPanel":false,"yearlyPvYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"heatFluxWidth":0.5,"heliodon":false,"panCenter2D":[131.8325577738685,6.979070650641251,0.000006979380865863898],"cameraPosition":[103.91363351545266,-170.19097104218287,181.31250975423077],"mapZoom":17,"showSiteInfoPanel":true,"yearlyUpdraftTowerYieldPanelRect":{"y":0,"x":0,"height":400,"width":600},"windowShininess":200,"dailyUpdraftTowerYieldPanelRect":{"width":640,"x":0,"height":550,"y":0},"showYearlyLightSensorPanel":false,"weatherPanelX":0,"mapType":"hybrid","heliodonPanelY":0,"ambientLightIntensity":0.1,"weatherPanelRect":{"height":500,"width":500,"y":0,"x":0},"cameraPosition2D":[131.8325577738685,6.978920643967857,150],"yearlyHeliostatYieldPanelRect":{"y":0,"height":400,"width":600,"x":0},"heatFluxScaleFactor":20,"showMapPanel":false,"dailyLightSensorPanelRect":{"width":600,"height":360,"x":0,"y":0},"yearlyLightSensorPanelRect":{"width":600,"height":500,"y":0,"x":0},"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showDailyParabolicTroughYieldPanel":false,"groundPanelX":0,"mapPanelY":0,"stickyNotePanelX":6,"axes":true,"showElevationAngle":true,"dailyBuildingEnergyPanelRect":{"x":0,"width":600,"y":0,"height":400},"showYearlyBuildingEnergyPanel":false,"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"mapPanelX":0,"autoRotate":false,"cameraZoom":11.974738784767572,"showDailyHeliostatYieldPanel":false,"yearlyFresnelReflectorYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"stickyNotePanelRect":{"height":300,"y":0,"width":400,"x":0},"showStickyNotePanel":false,"dailyHeliostatYieldPanelRect":{"width":600,"height":400,"y":0,"x":0},"showZenithAngle":true,"dailyParabolicTroughYieldPanelRect":{"height":400,"y":0,"x":0,"width":600},"showEvolutionPanel":false,"solarPanelShininess":100,"showDailyPvYieldPanel":false,"stickyNotePanelY":0,"diurnalTemperaturePanelRect":{"width":600,"height":400,"x":0,"y":0},"dailyLightSensorPanelY":162,"showYearlyPvYieldPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"height":400,"width":600},"yearlyLightSensorPanelShowClearness":false,"shadowEnabled":true,"showGroundPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"showDiurnalTemperaturePanel":false,"showYearlyUpdraftTowerYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDesignInfoPanel":true,"showWeatherPanel":false,"yearlyParabolicTroughYieldPanelRect":{"height":400,"x":0,"y":0,"width":600},"heliodonPanelX":0,"yearlyLightSensorPanelX":0,"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"showInstructionPanel":true,"panCenter":[45.46506493212769,-44.02353583672552,0],"solarRadiationHeatMapReflectionOnly":false,"groundColor":"#16A5A5","showEconomicsPanel":false,"evolutionPanelRect":{"width":640,"height":400,"x":0,"y":0},"directLightIntensity":1,"groundImage":true,"dailyPvYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"theme":"Default","mapWeatherStations":false,"showDailyUpdraftTowerYieldPanel":false,"yearlyLightSensorPanelY":0,"dailyFresnelReflectorYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"dailyLightSensorPanelX":-1275,"heatFluxColor":"gray","mapTilt":0,"showYearlyHeliostatYieldPanel":false,"enableRotate":true,"orthographic":false,"showAzimuthAngle":true,"weatherPanelY":0,"showDailyBuildingEnergyPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"interRowSpacing":7.25,"margin":2,"pvModelName":"CS6X-355P-FG","rowsPerRack":2,"rowAxis":"Left-Right","orientation":"Portrait","poleHeight":1,"poleSpacing":3,"tiltAngle":0.5235987755982988},"solarPanelArrayLayoutConstraints":{"maximumInterRowSpacing":10,"orientation":"Landscape","maximumRowsPerRack":6,"minimumInterRowSpacing":2,"minimumRowsPerRack":1,"poleSpacing":5,"minimumTiltAngle":-1.5707963267948966,"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","poleHeight":1,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"maximumGenerations":5,"crossoverRate":0.5,"populationSize":20,"convergenceThreshold":0.01,"searchMethod":1,"localSearchRadius":0.1,"selectionRate":0.5,"selectionMethod":1,"objectiveFunctionType":1,"problem":"Solar Panel Tilt Angle","mutationRate":0.1},"particleSwarmOptimizationParams":{"objectiveFunctionType":1,"convergenceThreshold":0.01,"swarmSize":20,"socialCoefficient":0.1,"vmax":0.01,"maximumSteps":5,"problem":"Solar Panel Tilt Angle","localSearchRadius":0.1,"inertia":0.8,"searchMethod":1,"cognitiveCoefficient":0.1}},"economicsParams":{"operationalCostPerUnit":0.15,"electricitySellingPrice":0.25,"projectLifeSpan":25},"notes":[]}')},430:function(e){e.exports=JSON.parse('{"docid":"fxMgHdY9nZbP8YEqb9fZ1w","time":"02/06/2023 03:46 pm","timestamp":1675716393386,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"date":"5/10/2021, 12:00:00 PM","ground":{"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05},"address":"Orlando, FL, USA","latitude":28.373886495744546,"cameraZoom":28.63945562104857,"name":"default","timesPerHour":1,"longitude":-81.5624358808899,"orthographic":false,"solarRadiationHeatmapGridCellSize":5,"pvGridCellSize":1},"elements":[{"type":"Foundation","cx":3.6287395608159727,"ly":283.0666063211208,"rotation":[0,0,-0.25695756630108585],"solarPowerTower":{},"id":"qKhYC3p1wiYeGuqWSSHJ89","color":"#999999","normal":[0,0,1],"cy":-13.583365825686094,"lx":337.3327572637294,"parentId":"Ground","lz":0.1,"solarUpdraftTower":{},"cz":0.05,"selected":false,"solarAbsorberPipe":{}},{"filled":true,"selectedIndex":37,"id":"gxiitHUfviQVqFAUKnd2B7","cz":0,"cx":0,"lz":0.4,"cy":0,"lx":0.4,"selected":false,"color":"white","type":"Polygon","parentId":"qKhYC3p1wiYeGuqWSSHJ89","normal":[0,0,1],"vertices":[{"x":-0.21350077712137278,"y":-0.42075759570318405},{"x":-0.2787182797987076,"y":-0.3183082097551242},{"x":-0.30984481516743556,"y":-0.20702698019085236},{"x":-0.3083625991974962,"y":-0.09044664445685331},{"x":-0.27865660234861234,"y":0.00706547489296964},{"x":-0.33053416129649227,"y":-0.01236458106269687},{"x":-0.37203620845479624,"y":-0.008831843616212049},{"x":-0.4120560396431608,"y":0.017663687232424098},{"x":-0.45504030277140417,"y":0.07065474892969639},{"x":-0.4846846221701927,"y":0.14660860402912002},{"x":-0.4802379742603744,"y":0.23492704019124053},{"x":-0.4594869506812224,"y":0.29145083933499766},{"x":-0.42094933546279734,"y":0.3409091635857851},{"x":-0.37500064039467507,"y":0.3762365380506333},{"x":-0.3379452411461894,"y":0.3886011191133302},{"x":-0.27717438637867287,"y":0.3886011191133302},{"x":-0.23270790728049007,"y":0.3691710631576637},{"x":-0.19713472400194382,"y":0.3373764261393003},{"x":-0.17193705251297356,"y":0.29851631422796726},{"x":-0.1467393810240033,"y":0.24022614636096776},{"x":-0.14525716505406386,"y":0.1784032410474834},{"x":-0.1585971087835187,"y":0.1236458106269687},{"x":-0.12450614147491189,"y":0.13601039168966556},{"x":-0.07855744640678965,"y":0.1625059225383017},{"x":0.004446647909818281,"y":0.1625059225383017},{"x":0.05187755894787995,"y":0.14130949785939279},{"x":0.08152187834666849,"y":0.12011307318048388},{"x":0.07411079849697136,"y":0.1607395538150593},{"x":0.06966415058715308,"y":0.22079609040530124},{"x":0.08448631028654735,"y":0.28261899571878557},{"x":0.12154170953503303,"y":0.3391427948625427},{"x":0.18972364415224668,"y":0.3903674878365726},{"x":0.27569217040873345,"y":0.3903674878365726},{"x":0.315712001597098,"y":0.3656383257111788},{"x":0.37203620845479624,"y":0.3161800014603914},{"x":0.40464495979346365,"y":0.2472916212539374},{"x":0.4090916077032819,"y":0.17487050360099857},{"x":0.39575166397382705,"y":0.09891664850157496},{"x":0.36758956054497793,"y":0.04945832425078748},{"x":0.3112653536872797,"y":0.00176636872324241},{"x":0.26976330652897573,"y":-0.017663687232424098},{"x":0.21936796355103522,"y":-0.017663687232424098},{"x":0.19417029206206496,"y":-0.01236458106269687},{"x":0.22677904340073238,"y":-0.10951486084102942},{"x":0.22671736595063713,"y":-0.22645703614651888},{"x":0.1852153187923332,"y":-0.3465701093270028},{"x":0.10968398177551761,"y":-0.4468912869803297},{"x":0.004446647909818281,"y":-0.49105050506139},{"x":-0.07559301446691079,"y":-0.49281687378463235},{"x":-0.14457773451918945,"y":-0.46315044506100184}],"ly":0.4,"rotation":[0,0,-0.25695756630108585],"foundationId":"qKhYC3p1wiYeGuqWSSHJ89","opacity":0},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.037616685320439464,"cy":-0.48857758884885055,"cz":0.1,"lx":28.799999999999997,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"kWpkpkWKF1uWgdwJ2NZefx","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":42.076837683556896},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.0372083877509681,"cy":-0.4744466390629113,"cz":0.1,"lx":50.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"dK6YzfpNPfiWaeFn2QffwS","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":73.63446594622458},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03654996905677188,"cy":-0.460315689276972,"cz":0.1,"lx":73.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2YnbhMS1ahtpsDUt83Kmqa","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":106.94529577904046},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.031199169405290578,"cy":-0.4461847394910327,"cz":0.1,"lx":92.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"rZ6mfN6qq8rs7avswS9pu2","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":134.99652090141174},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03621493966368436,"cy":-0.43205378970509345,"cz":0.1,"lx":104.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"nsxJE4hnqqqbojxtQF5XmZ","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":152.52853660289378},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04202884346728941,"cy":-0.41792283991915413,"cz":0.1,"lx":115.19999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"65qqYMw5kK9P2gpyyLouG5","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":168.30735073422758},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04120703986508323,"cy":-0.40379189013321487,"cz":0.1,"lx":122.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2sNWVSiGrgGLPazQHQc81Q","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":178.8265601551169},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04038523626287707,"cy":-0.3896609403472756,"cz":0.1,"lx":128.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"cnEFmUzsqP1tLRHrUQvSwW","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":187.59256800585786},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03956343266067097,"cy":-0.3755299905613363,"cz":0.1,"lx":135.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"98MNypEPPBsYie5TNeQKR6","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":198.11177742674707},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03874162905846479,"cy":-0.36139904077539703,"cz":0.1,"lx":141.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"xb5Buj7cVMwRPovXehf8wX","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":206.87778527748813},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.037919825456258605,"cy":-0.34726809098945777,"cz":0.1,"lx":148.79999999999998,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"9cdDw2HjNqp1VMPzxiNCdw","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":217.39699469837734},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.039402378999016274,"cy":-0.33313714120351845,"cz":0.1,"lx":153.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"8zxNS5x3yVnoFnibsJjUwa","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":224.4098009789702},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04145884091268481,"cy":-0.3190061914175792,"cz":0.1,"lx":158.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2RRuCpeWAGmBTfC2dhxMwq","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":231.422607259563},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04149659769772568,"cy":-0.3048752416316399,"cz":0.1,"lx":162,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"iv6ViUw3EJjpR2TGVGwYEb","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":236.68221197000761},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04103158876597998,"cy":-0.2907442918457006,"cz":0.1,"lx":164.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"fW2H3FSf6TjWNbMrKb1Lkt","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":240.18861511030403},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.040566579834234257,"cy":-0.2766133420597614,"cz":0.1,"lx":168,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2t1Xvha9SQuwVN7KfkUeiy","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":245.44821982074862},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04010157090248856,"cy":-0.2624823922738221,"cz":0.1,"lx":170.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"8iBoV7XvdfudFjFhHgKqTa","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":248.95462296104498},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.039636561970742834,"cy":-0.2483514424878828,"cz":0.1,"lx":174,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"wYMRLZC1rubPv5oYgrbkPg","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":254.21422767148965},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03917155303899711,"cy":-0.2342204927019435,"cz":0.1,"lx":176.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"tdEaYaSRTP4xPW2tL6xYLX","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":257.7206308117861},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.0394392928303727,"cy":-0.22008954291600424,"cz":0.1,"lx":178.79999999999998,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"5M1u3s5y7Yg9TFyx3QAJka","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":261.2270339520825},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04141185432912459,"cy":-0.20595859313006498,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"hiA62xMKPaFVvMB4EbNPY4","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04144393579015737,"cy":-0.19182764334412566,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"b54t9D1QjNBLmMTU63QWVT","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04135037805808456,"cy":-0.1776966935581864,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"d1YSCd8j3DVVmp36H3tHZz","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04125682032601172,"cy":-0.16356574377224714,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"1ysUo9HPCMC5bpSzendt1P","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04116326259393882,"cy":-0.14943479398630782,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2GwbaiKPvFUtnmPT96gojn","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04106970486186601,"cy":-0.13530384420036856,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jfCpXtMzyB64DGxKrDZTJ5","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04097614712979322,"cy":-0.1211728944144293,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"49X8WCb1TJhiSctnjKxN4r","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04165455280196828,"cy":-0.10704194462849004,"cz":0.1,"lx":180,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"9EUafkcKKdEjXyJwgKUn9F","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":262.98023552223066},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04393626708296591,"cy":-0.09291099484255072,"cz":0.1,"lx":177.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"83ZWm7TJF8qdoueqVfWe1p","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":259.47383238193424},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04420570767416232,"cy":-0.07878004505661146,"cz":0.1,"lx":175.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"iEjavascg418skk9iKNiXc","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":255.9674292416379},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04442483385188012,"cy":-0.0646490952706722,"cz":0.1,"lx":171.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"mEQPpZurmPLPYfvHBtjBp8","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":250.7078245311932},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04464396002959792,"cy":-0.05051814548473288,"cz":0.1,"lx":169.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jXz3fip3tXcdriBZEWDqpy","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":247.20142139089677},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04486308620731577,"cy":-0.03638719569879362,"cz":0.1,"lx":165.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"eqHXHHJiV6yMbr5L1r1Ld7","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":241.9418166804522},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04508221238503357,"cy":-0.022256245912854355,"cz":0.1,"lx":162,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"nX2ypmuMKZwqMh2zBmNNcy","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":236.68221197000761},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.340155090410463,"cy":-0.008125296126915038,"cz":0.1,"lx":9.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"wnN4Cfoo6RAEcvrqb2PcCi","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":14.025612561185637},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.0008397564506628652,"cy":-0.008125296126915038,"cz":0.1,"lx":192,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"41tmtPqEDkBjyum5o2HyTb","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":280.51225122371267},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.33919569243719283,"cy":0.006005653659024224,"cz":0.1,"lx":34.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"nUZy35meWUt3qFXdKcjG8T","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":50.84284553429793},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.01707173035142423,"cy":0.006005653659024224,"cz":0.1,"lx":199.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"42nshWJYmviEWoTkQyU4n7","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":291.0314606446019},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.040942647871871296,"cy":0.02013660344496354,"cz":0.1,"lx":249.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"woLsJFnRDToiWqRHeJaj7e","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":364.6659265908265},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03832955601375582,"cy":0.03426755323090275,"cz":0.1,"lx":259.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"co9GdUpZDxCi3rLez9eaX9","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":378.6915391520121},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03571646415564039,"cy":0.048398503016842065,"cz":0.1,"lx":268.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jbUV2vPsguy1CptC637MTc","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":392.7171517131978},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03645227851214608,"cy":0.06252945280278138,"cz":0.1,"lx":276,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"qkmUJNGwXdSLVnfZeY68uS","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":403.2363611340871},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03734260936957107,"cy":0.07666040258872059,"cz":0.1,"lx":282,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"6iGc4xFsJd9M2yj74iPeRR","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":412.00236898482797},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03607706284374246,"cy":0.0907913523746599,"cz":0.1,"lx":286.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"omBvXRQwdAtvY6W2nJwnSu","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":419.0151752654209},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.035576630292429856,"cy":0.10492230216059922,"cz":0.1,"lx":290.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"86V9dMayifHM3TKqinFVHY","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":424.27477997586544},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.19735877990437656,"cy":0.11905325194653843,"cz":0.1,"lx":186,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"hbiQ95FcNxgSx4s8JJpjr7","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":271.7462433729717},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.24049456177332856,"cy":0.11905325194653843,"cz":0.1,"lx":106.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"nhNSmKpJTEt2hyfDoJmW3v","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":156.03493974319017},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31770381965182604,"cy":0.13318420173247775,"cz":0.1,"lx":108,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"phxBsJWZVwgu5cw4g8V4wY","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":157.78814131333837},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.03308870698607633,"cy":0.13318420173247775,"cz":0.1,"lx":62.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"tuJ1gTPzUhawyfMHxKao6u","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":91.16648164770662},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.24046099085550587,"cy":0.13318420173247775,"cz":0.1,"lx":108,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jtBNT6PcfTMUK2qEAoEKzy","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":157.78814131333837},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31874014769682496,"cy":0.14731515151841706,"cz":0.1,"lx":110.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"3Kj2UQDiRgd2551SXnotBs","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":161.29454445363484},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.033764879795220165,"cy":0.14731515151841706,"cz":0.1,"lx":44.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"39FZrG2AvYzTH8N4iEhi3W","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":64.86845809548358},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.24041303240147344,"cy":0.14731515151841706,"cz":0.1,"lx":109.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"oK7nq2Fur7VVa6ALjsnPy9","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":159.5413428834866},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3169744670961393,"cy":0.16144610130435627,"cz":0.1,"lx":111.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"fnB5YFmLgA7bBpseBoJH8k","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":163.04774602378293},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.036255002624718397,"cy":0.16144610130435627,"cz":0.1,"lx":31.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"dZPmGJSNE99kF5mskFBu8m","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":45.58324082385331},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.240365073947441,"cy":0.16144610130435627,"cz":0.1,"lx":111.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"xdu2VhAyxp7GHG6GkN2Rak","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":163.04774602378293},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3148974522014887,"cy":0.1755770510902956,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"g7Pg4uWoBiYjTsLY8RraRJ","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.24100628905692523,"cy":0.1755770510902956,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"hDztK9BKaGUf2AywiKnX14","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31399347805252253,"cy":0.1897080008762349,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"qRpgEphc3gwtfun3kDAQ8w","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2402168091310728,"cy":0.1897080008762349,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"vc7S9aQUn3Nxbw9os9915M","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31380714233058726,"cy":0.2038389506621741,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"kRsxFHjzWbANb66JdKxPEn","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23925985477458384,"cy":0.2038389506621741,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"p7ZRVtya7nPesW49gxfWje","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.313620806608652,"cy":0.21796990044811343,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"mwBcFhJw4XwTYpgx3t8Kq4","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.238302900418095,"cy":0.21796990044811343,"cz":0.1,"lx":112.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"6LEGw3yDjniXRNLBc3hQEt","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":164.80094759393123},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31343447088671683,"cy":0.23210085023405264,"cz":0.1,"lx":111.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"wQatxUrP1g2jmJrfUibX2C","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":163.04774602378293},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23916510110353983,"cy":0.23210085023405264,"cz":0.1,"lx":111.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"6yT9UzJjZp1c4agfQAh2Za","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":163.04774602378293},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3127806949383655,"cy":0.24623180001999195,"cz":0.1,"lx":109.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2sWWpxqpZqAXKAZerDK9Cn","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":159.5413428834866},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2402069428031286,"cy":0.24623180001999195,"cz":0.1,"lx":110.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"teapWmNzVUv7LoUgjnLHJu","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":161.29454445363484},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3132410802017558,"cy":0.26036274980593127,"cz":0.1,"lx":105.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"aGUWAZyZhfeCxcewvQ7kQ9","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":154.281738173042},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2385564165948445,"cy":0.26036274980593127,"cz":0.1,"lx":106.8,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"pKCiy2oM8YqTjYeCwFccee","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":156.03493974319017},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3137014654651461,"cy":0.2744936995918705,"cz":0.1,"lx":102,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"mtSGfTvotfJZuE5rKNWHKD","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":149.02213346259734},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2369058903865603,"cy":0.2744936995918705,"cz":0.1,"lx":103.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"25YjZ6eNgXEZMpGdn5MeCJ","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":150.77533503274557},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3141618507285363,"cy":0.2886246493778098,"cz":0.1,"lx":97.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"3QmRQECQLpN1r5BFbEnPZu","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":142.0093271820046},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23694469336187218,"cy":0.2886246493778098,"cz":0.1,"lx":98.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"7fQN2CLRbYff7Kgk1L8AFk","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":143.76252875215275},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3125435243418768,"cy":0.3027555991637491,"cz":0.1,"lx":91.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"2sok3ZhMGD367xZKYFitkd","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":133.24331933126356},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23823213095114654,"cy":0.3027555991637491,"cz":0.1,"lx":93.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"knqe8wxaNzdbbkkGeV6nft","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":136.74972247155998},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3116195455554211,"cy":0.3168865489496883,"cz":0.1,"lx":85.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"sJtpFF4zqnp47K3f8FHJoz","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":124.4773114805225},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23857920295070112,"cy":0.3168865489496883,"cz":0.1,"lx":87.6,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"eenbnKZSxHXg341eYvv6YL","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":127.98371462081894},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31069556676896537,"cy":0.33101749873562764,"cz":0.1,"lx":78,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"rnrxkB2JpncBeLWxT29QJC","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":113.9581020596333},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23516481259137628,"cy":0.33101749873562764,"cz":0.1,"lx":79.2,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"cZtPSF2YivPA1jCjxoWje1","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":115.7113036297815},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31044025346401344,"cy":0.34514844852156695,"cz":0.1,"lx":68.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"rJSTWke3wchC8uFSfcSzQ1","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":99.93248949844762},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23449459815656987,"cy":0.34514844852156695,"cz":0.1,"lx":68.39999999999999,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"6Hp4zwmET4Ch6ZFmL8mGpC","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":99.93248949844762},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3091556662900659,"cy":0.35927939830750616,"cz":0.1,"lx":56.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"fJ8958fxoKHVFgspEjynzP","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":82.40047379696561},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2358526876659724,"cy":0.35927939830750616,"cz":0.1,"lx":56.4,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"1CoiFcccuM9VRQ7ukyN4aa","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":82.40047379696561},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":-0.31159009373160274,"cy":0.3734103480934455,"cz":0.1,"lx":43.199999999999996,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"jzJ71uWBpujykTfLckxzbh","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":63.11525652533535},{"type":"Solar Panel","pvModelName":"FS-495","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2,"poleRadius":0.05,"poleSpacing":3,"cx":0.23483923162347198,"cy":0.3734103480934455,"cz":0.1,"lx":43.199999999999996,"ly":2.4,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.25695756630108585],"color":"#fff","frameColor":"white","parentId":"qKhYC3p1wiYeGuqWSSHJ89","foundationId":"qKhYC3p1wiYeGuqWSSHJ89","id":"qYWcALWx8U3KNV1wk9Ec8j","referenceId":"gxiitHUfviQVqFAUKnd2B7","selected":false,"dailyYield":63.11525652533535}],"view":{"showWeatherPanel":false,"weatherPanelY":0,"showDesignInfoPanel":true,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelY":0,"showStickyNotePanel":false,"showInfoPanel":true,"panCenter2D":[39.10459750703379,-60.079467366675814,-0.00006008213787399433],"shadowEnabled":true,"stickyNotePanelY":0,"theme":"Default","autoRotate":false,"cameraPosition2D":[39.10459750703379,-60.079617373283014,150],"showYearlyPvYieldPanel":false,"showDailyLightSensorPanel":false,"heliodonPanelX":-6,"showGroundPanel":false,"dailyLightSensorPanelX":0,"cameraZoom":4.904200711979575,"showDailyPvYieldPanel":false,"cameraPosition":[94.96625797546166,-156.07916973403763,226.41931192253614],"weatherPanelX":0,"showInstructionPanel":true,"groundPanelY":0,"mapTilt":0,"groundColor":"#16a5a5","panCenter":[21.38313493992602,-35.00376702263927,0],"showMapPanel":false,"enableRotate":true,"heliodon":false,"groundImage":true,"dailyLightSensorPanelY":0,"mapZoom":17,"showYearlyLightSensorPanel":false,"dailyPvYieldPanelX":0,"groundPanelX":0,"heliodonPanelY":9,"mapType":"hybrid","mapWeatherStations":false,"axes":true,"orthographic":false,"stickyNotePanelX":0,"showHeliodonPanel":false,"yearlyLightSensorPanelX":0,"solarPanelShininess":0,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showEconomicsPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"rowAxis":"Left-Right","tiltAngle":0.5235987755982988,"poleHeight":2,"poleSpacing":3,"orientation":"Landscape","rowsPerRack":4,"interRowSpacing":4,"pvModelName":"FS-495"},"solarPanelArrayLayoutConstraints":{"orientation":"Landscape","maximumTiltAngle":1.5707963267948966,"minimumInterRowSpacing":2,"minimumTiltAngle":-1.5707963267948966,"pvModelName":"CS6X-355P-FG","maximumRowsPerRack":6,"minimumRowsPerRack":1,"rowAxis":"Left-Right","poleHeight":1,"poleSpacing":5,"maximumInterRowSpacing":10},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"mutationRate":0.1,"localSearchRadius":0.1,"crossoverRate":0.5,"convergenceThreshold":0.01,"maximumGenerations":5,"searchMethod":1,"populationSize":20,"selectionRate":0.5,"selectionMethod":1,"objectiveFunctionType":1,"problem":"Solar Panel Tilt Angle"},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"inertia":0.8,"convergenceThreshold":0.01,"swarmSize":20,"searchMethod":1,"socialCoefficient":0.1,"cognitiveCoefficient":0.1,"localSearchRadius":0.1,"vmax":0.01,"maximumSteps":5}},"economicsParams":{"operationalCostPerUnit":0.15,"projectLifeSpan":25,"electricitySellingPrice":0.4},"notes":[]}')},431:function(e){e.exports=JSON.parse('{"docid":"j9Q8R8iNXqFBaujVRfHNC2","time":"05/18/2022 02:05 pm","timestamp":1652897143355,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":35.81284404374666,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-78.7501240418377,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"2401 Trenton Rd, Raleigh, NC 27607, USA","date":"4/15/2022 10:15:00 AM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.10173433320329936,"normal":[0,0,1],"lz":0.1,"ly":51.9907667035674,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.005905293451752419,"cz":0.05,"rotation":[0,0,0],"lx":75.61279135922823,"selected":false,"parentId":"Ground","locked":true},{"poleRadius":0.05,"type":"Solar Panel","lx":1.984,"lz":0.046,"relativeAzimuth":0,"drawSunBeam":false,"rotation":[0,0,0],"ly":21.648,"normal":[0,0,1],"poleSpacing":3,"cx":0.08211037572567748,"trackerType":"HSAT","cy":0.2234368441602269,"label":"Row3","cz":0.5000000074506161,"orientation":"Portrait","showLabel":false,"selected":false,"poleHeight":1,"tiltAngle":0,"id":"mAv2C19w4RJA4u6knYxU3u","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-355P-FG"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.16248436170569222,"cy":0.2234368441602269,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bLn1japfJEgTKBPWbNzur1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.23879905546449415,"cy":0.2246175890711455,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xrAXVLJvJZKmHgq57E2MQB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.31836118300026617,"cy":0.2233645095937837,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tRW2bpMcmbgt4enWCcDP51","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.39629959364755313,"cy":0.22343686243351435,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tJsi7hiees32d12b6mBMhW","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.47586172118332537,"cy":0.22461757079785805,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5KhMg2uodxoo1Z4XL87XGA","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0025482481899054073,"cy":0.22225611752259564,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"26aZGW371fb7o1PfURQ3zg","selected":false,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.07457830401313895,"cy":0.2246175890711455,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wUt5FR6ocPi4PpiJnSm7dt","selected":false,"drawSunBeam":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.15495228999315366,"cy":0.2210754091582519,"cz":0.5000000074506517,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9KjddEKBMzvacaiu1qXZ6p","selected":false,"drawSunBeam":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23532627597316833,"cy":0.22107540915833737,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v1S992hiHrrXWRFsDpx8ie","selected":false,"drawSunBeam":false},{"type":"Cuboid","cx":-32.63845852923165,"cy":15.792302218810745,"cz":1.2553344031996811,"lx":5.133059413294499,"ly":13.392050108713438,"lz":2.5106688063993623,"color":"gray","normal":[0,0,1],"rotation":[0,0,0],"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","id":"1x2m4C7FHzAwDkHxXXdvsn","selected":false,"locked":true},{"type":"Human","name":"Jack","cx":-28.54553838833994,"cy":11.2385720166683,"cz":0,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.8},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.46971942316836673,"cy":-0.2583893879929419,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5MXRMjMkweGaqcjbtGi5WU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3904301692588086,"cy":-0.2623054559086292,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9xkDVHA2779LgaH8YdZCmx","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3131409153492504,"cy":-0.26022152382431646,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mN37zmeNfQecDk9remsomw","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23385166143969227,"cy":-0.26413759174000373,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e3Pif4TuZ9DpVbtnBEVtva","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.15456240753013412,"cy":-0.260053659655691,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g39HnTg7UwuA8CBPjuTqTF","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.07527315362057596,"cy":-0.25996972757137826,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oFMzredZvfguD3UXAtxX6K","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.004016100288982194,"cy":-0.25988579548706553,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2ABmv4sfkBHxsAyYodagum","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.08330535419854035,"cy":-0.2618018634027528,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k577u5kHuxBEHJLmRQtnAz","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1625946081080985,"cy":-0.26371793131844007,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w4he3pd3YzeFnd3X45S2gw","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.24188386201765666,"cy":-0.26163399923412733,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pyLs3bLikRTcZrrF7e1TcH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3167669019313885,"cy":-0.25817391579286053,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6wAigPY54YvU4hpiRBKYf4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.39751068943275564,"cy":-0.26121089229567773,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iTsCanVgttoMHWKMPD8d5z","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4775584098004903,"cy":-0.2553834493088245,"cz":0.5000000074505806,"lx":1.984,"ly":21.648,"lz":0.046,"trackerType":"HSAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o5ef4DVoUQeG4ovcxCKPpK","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":20,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":true,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[31.151690262644525,60.08959522074622,31.574651861408782],"panCenter":[5.074127461000436,15.829331204955876,0],"orthographic":false,"enableRotate":true,"cameraZoom":19,"showInstructionPanel":true,"showMapPanel":false,"cameraPosition2D":[8.577303319163851,-9.663080657094188,49.999990336648274],"panCenter2D":[8.577303319163851,-9.663030654871722,-0.000009663320744681337],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},432:function(e){e.exports=JSON.parse('{"docid":"axSGqNWcpePCTLspRawDR9","time":"05/18/2022 12:07 pm","timestamp":1652890029091,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":34.661401193155264,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-118.08438229389954,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"3782 E Ave L, Lancaster, CA 93535, USA","date":"3/30/2022 11:30:00 AM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Approximate","daysPerYear":4},"elements":[{"cy":0.07254451818739938,"normal":[0,0,1],"lz":0.1,"ly":81.92819197480188,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.08412023344924435,"cz":0.05,"rotation":[0,0,0],"lx":82.66288858793011,"selected":false,"parentId":"Ground","textureType":"No Foundation Texture","locked":true},{"type":"Human","name":"Jack","cx":49.29766862442634,"cy":-12.729504090108108,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rrK38LJKu6CVWVjf2zV1b2","selected":false,"ly":0.45},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"AADAT","relativeAzimuth":0,"tiltAngle":0,"orientation":"Portrait","drawSunBeam":false,"poleHeight":1.2,"poleRadius":0.05,"poleSpacing":3,"cx":0.2518807579243098,"cy":0.010250386487824486,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5786gicyfJksUGkwhvexAb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25427388005268026,"cy":-0.04395224581399519,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k9w88akkXvyeym1nEoJCjH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2566670021810507,"cy":-0.09815487811581487,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i4BrqTV8VhJzUFMcA4xEMs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2530944088658749,"cy":-0.1536069244602506,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vcRG9TH79RxwCJhnX4D2hp","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25192019869553334,"cy":-0.21079873518169914,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rtH2MUzGv2KfYvP1V1Rm6A","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.19991063417063695,"cy":-0.18536196640558186,"cz":0.5000000074506517,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wv9ywiGPQRmqsVCgAzNiwq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19064139133153096,"cy":0.15891530324997943,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ucdEe1iLcEHHhf7vQqUUBk","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10269156717338637,"cy":-0.12788362495230762,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iRH83oBMSFMwbXKKj29Qwe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10314333812802398,"cy":-0.013487174391434594,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eQKzkcGn74q7YicXK2W4tT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15886708542833353,"cy":0.12620926239733848,"cz":0.5000000074506517,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dDRJL26Ytf5c8uDCiZ3aXx","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15339180094769295,"cy":0.06763384458981574,"cz":0.5000000074506517,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5VPk2zFGHCYnEvmb4Swkfx","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1533504351516886,"cy":0.011186366145812043,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mWLpnzd5GQucX4FdT7Xfxt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1555155212376684,"cy":0.24112965852461848,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8fafEASeWSKzVyfD9jxhX3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1589318952851763,"cy":0.18059187676792832,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8oEiCQAuNSHPSDiR6LUNbE","selected":false,"drawSunBeam":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25484854246591865,"cy":0.06997519331444636,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hS7hPBhsXEFxoPaaW27Bei","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.058180152618152965,"cy":0.12709108304539296,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eBcpt1Wt3T5EkddP5aWE5r","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09325025604322237,"cy":0.0983124515002669,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rVyrwEiwe9ZPbBS99cPzQZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14277629723213114,"cy":0.015285529455875321,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sFJojw9tEoGQyahPFbrMGm","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04294631891940937,"cy":0.06901057210886578,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ekjGZoifbx54ZxvxR9nd4Y","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2920444708915642,"cy":0.04225008319918739,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3BDM99QnBLCJL4C6i8MSSs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2886934107606972,"cy":0.09972897002350474,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gEHyNnwSt5QbZ5cmLo61av","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05646578271859648,"cy":0.06997519331444636,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t5wJr6yXENMUDnfPe9dKk2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.041385173102717936,"cy":0.12610163574289743,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qXjk7hou8dch4h29ZdrRwv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1923023384210398,"cy":0.10145193857791704,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hyHFcJjhpxKcY4WiqVxvnY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1895020308870361,"cy":0.043602527595053696,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fYZ6sBUNi7ENt9JGidVuq8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0896200750136689,"cy":0.15848596846951796,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bnwN7888LrQM7dC3CaukC4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25776231965010593,"cy":0.12762742673544877,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dMTxMasD2j1rCN41KmcoKf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2045542377026502,"cy":0.09879647040569517,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jK4TDxAWQQmZt76MiUgYBj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0915388849864329,"cy":0.04212814396977042,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4AZoM6mfHgnqyYfm1FKGHz","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1422836298066917,"cy":0.07046201484554855,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2LodiR2ATEwXvrSF5QtqFJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0422721424424923,"cy":0.011806515962473143,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cQzP6z5hZLemyfnuj3n9Dm","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.006994600101448293,"cy":0.04312289956203308,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oz6Y5UFdG5kpKdrsZGPPHy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.006994600101448293,"cy":0.10028772676757898,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jDhoFMd3Yqniw6HmXCK6PZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10700608746564778,"cy":0.09929355585965646,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9uyqQ937ezx3VdDJUFfzMi","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1065134200402084,"cy":0.04361998501599436,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8GgRE418BL6BVETxL6mwZ7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05527600779451013,"cy":0.011806515962473143,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xu2mR289eySb3y2d1ZZWgf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2060322399789683,"cy":0.044117070469955603,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u558xjFbFWRjTHBfoZjc3B","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20553957255352892,"cy":-0.013047756735590265,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"st7NYqMPZnkacwsV9fNrTW","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15578016258414895,"cy":-0.04436414033515022,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1H39aeiRM4xc1iUZYtAB8W","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05626134264538889,"cy":-0.04386705488118897,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"66Y2RUGQAkcJg6mWe5jRG5","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10552808518932955,"cy":-0.07319509666490383,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8mkhtM6wG9Afn5AsZkJC3p","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10865037816756891,"cy":0.21407673957857115,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmpLZMvpnpGmUxvk5iTgP1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10865037816756891,"cy":0.15762154422622862,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ngNMpaj8EwRBxMeWvoeXys","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057634016263961675,"cy":0.18418869498027218,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"giC1j5cUtWifw2JwH5a5bP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.007440498907186952,"cy":0.15762154422622862,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rs1mymysHmGoDcaan4oDsB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04193017390275545,"cy":0.18584914190239984,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uPnwAA4FcFWHA7FqJJGQae","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2065688792406212,"cy":0.1567913207651648,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6KPu6mNrxywNai4UXzGBJ5","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2567623965973961,"cy":0.18501891844133603,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1n372FWqJ9pVPw4eSXYmPV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2065688792406212,"cy":0.21490696303963497,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gi6tkDKs6NtgCMAAReWJAR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.004971965266689796,"cy":-0.01340448875292641,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pLi7ggTT3PqwKQBJVjuniN","selected":false,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14231720861630498,"cy":0.12856372308899353,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iXLnMRMrRjtjArqFQVcTD3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24023570968935748,"cy":0.06961785735345952,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9g2NFucTWZE9VvPJ1U9fnX","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24270424332985463,"cy":0.12607305270580196,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e6vsB5ZrLgyMEs8nt19DUv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09459222490002743,"cy":-0.012574265291862577,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hQr9Fef5Fh7zxEbLkL1VMo","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04357586299642019,"cy":-0.04329253335122541,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fJiHeWQvfcH93LJDacJ5U2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.006617654360354536,"cy":-0.06985968410526895,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"av2DnyKiv87Tdt3JFpxyHB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2057460346937889,"cy":-0.07068990756633277,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tzhyrWaP1ZqrN4rpJQBLcB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15390682824334934,"cy":-0.1005779521646317,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3nRRF2j6QrScDDkbrs6m4a","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20327750105329176,"cy":-0.1296357733018668,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7y7rBQL5vGHMt8ZANGKmdr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15472967279018185,"cy":-0.15703314751697414,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cN1AzorJdqMR2VPo9KVZma","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.055165482623464525,"cy":-0.10306862254782327,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dfu9LFXVjUWPvnPcDkjy6R","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1390685759174889,"cy":0.1852541725070993,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rxx1fqNmXiDTg1ZhJ1QnGn","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09067926762777045,"cy":0.21416267146874132,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8SRi5DvvrpV4dNgiTvJ9Je","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.00800945322626064,"cy":0.21480508255677777,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"266hnZ1rnYA5XLvbZ8txcr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04147760940199774,"cy":0.24037406770776895,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7vBjqcNWEe5WcN3ZPbNV6e","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.058580287492818954,"cy":0.24037406770776895,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"syucoPsRr3v2eHQaYYfqug","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.007769636725919854,"cy":0.27113384694018494,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kWziiofHHGucoQrSYimggR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057016882853837374,"cy":0.2987387770205583,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"idtAosKbm3W95AtcEbYCdb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10782753362073655,"cy":0.2695564223641636,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6xoYbDnXopc3sxqZhRMx2C","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10860279827645342,"cy":0.32854167949809765,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bpjusQDMhzuD6wY6N7LYpe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1592693110228126,"cy":0.35588539966209315,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tX9ZhVSGraSP2oyuKxZRks","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15691272903460993,"cy":0.30000910193566754,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n7JZKTvm9Z74h9Q2sTZDE3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20875753277507064,"cy":0.272665381771672,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"edXx1WDDhJHy3n7mzY55eB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20522265979276647,"cy":0.3297305368965322,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpFtUM9gLUrhBCuhPrUxch","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20757924178096934,"cy":0.3867956920213924,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pezhDsUoQ6nUspAa69MKkr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2570674635332272,"cy":0.41413941218538786,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oM9xei2CxtE8z6PBbtfg9f","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25588917253912563,"cy":0.3546965422636585,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"boLotmiivinNNHWUkJNPK1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2570674635332272,"cy":0.30000910193566754,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gy1y7cW6cjooGgNpDRcVqF","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25588917253912563,"cy":0.2405662320139381,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xnSPHfaBhXAD7ssnz5CFcM","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":0.07055962403779206,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"khKhaS8ssRAseSkBgDXTD4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":0.012305611514497291,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4Z7xaYhMGZDK551XajN4xD","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":-0.012660393852629088,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w29qA4SyEe8XYJFPW7NZFY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14237318346714029,"cy":-0.04238182881349372,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xtibwmyRkGDZD1aXvyKhQs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09170667072078098,"cy":-0.07210326377435848,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1PogYHu7FjwwFaSG7CbAN4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.042218448968523115,"cy":-0.10063584133678857,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iPqMK3ttEsCxnPof1ShTJR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.00726977278373475,"cy":-0.12441298930548035,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9GmoNmHrHgvD95Qd2V3rCJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.056757994535992624,"cy":-0.1588898538600834,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kuKrRiiiHZzLJDtmorgeuP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10388963430004787,"cy":-0.18623357402407878,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dNLLoyzyJAC4ab9yNV49YW","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1545561470464073,"cy":-0.21357729418807436,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2K3F8F31VVhyhEKnxs3Erf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2016877868104623,"cy":-0.24092101435206986,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fDAsp6SESYssbfVnpQgG3D","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2511760085627201,"cy":-0.2718313067113691,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2zKUQEiEH6NvsSMtHEjR6F","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3030208123031809,"cy":-0.1850447166256443,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w9y4ucdHTVjss2inC3NCUr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3013169393640835,"cy":-0.23950929397792342,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rbco6Y3hA3xGnGqyMDpR5N","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3013169393640835,"cy":-0.3006836542668394,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3ULG8zNaZ7DoT4B28Qot6U","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3013169393640835,"cy":-0.1276476065924771,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3AUeCn3oqRmECRW8VZWFNk","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30218309151864386,"cy":-0.07084284346705509,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aQpjCoWjLCxvJeQv5oUMVb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3013169393640835,"cy":-0.01403808034163304,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vBbWMduvCeR6vTDiguHAbY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30304924367320435,"cy":0.04364060221648771,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"okZoQ3ysJTWRd5qkZTjBii","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30304924367320435,"cy":0.0986975264765121,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vb4fTp2UdSaTbvLvi9dHuG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30478154798232504,"cy":0.15725012846733166,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8wtcFzrh2coJE8Az2epH5T","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30478154798232504,"cy":0.21405489159275365,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cV7ZMqR486KK5uKiKyHsbD","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30478154798232504,"cy":0.26911181585277805,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6NYbyBHAQVquv8YKDCR6oa","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30629425197116866,"cy":0.3273569087969701,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"snK592eqLd3gtZUGisH7Bi","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3052840147301011,"cy":0.3874954089039585,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k347z912Q33SPm4HjDf6Ts","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30526315555234357,"cy":0.4432203131739659,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fbe5VKYd1udpQPzu38HQ7E","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2511760085627201,"cy":-0.324141032242491,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"swtWVRnxgYawbA874SNx1j","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2994859393208767,"cy":-0.35505132460179034,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5S3HYU2UW8isQw3SzAvJM6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3489741610731348,"cy":-0.32889646183622934,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5JQUVSMiMnHRjQS21Wnniz","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3489741610731348,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2KniKkjJuWzm1bjpPzKSFN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":-0.2111995793912052,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wwTA44T8asPKftHuSv9Kxj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.35133074306133744,"cy":-0.15294556686791044,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t3E52wZbbHnADbh2UbMakk","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3501524520672361,"cy":-0.09825812653991937,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"va5gGZiucR3BZro2UmUfwP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":-0.04000411401662455,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bH3pA8zNDVqLrfvegAx9xh","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.012305611514497309,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"juS4o8FwY72f2ZGpUyJTFT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.07174848143622668,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mWzf3i5nYWUXB7AZpupMGw","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.12643592176421772,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w3LD5JnAsnpX4oBsSFDj3R","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.1823122194906433,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aYmwXUwtmrJa7BKf4smZKd","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3548656160436416,"cy":0.24294394681080725,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hsDudJG9V3zUGU3c9JEDW1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3536873250495403,"cy":0.30000910193566743,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"93uFEA1egTtZQgpK4YcPrJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.35707425706052764,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u3Q4mYsqDTVks8sDVy3DEP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3548656160436416,"cy":0.4153282695838226,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6riq3e9uC7h5gp6Zomw7hq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2896595577298127,"cy":-0.015038108649498227,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rPCnFh8P3Fbb8rP7NJpXsJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":-0.04238182881349376,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jzhnP1nX9SurbY1UtSQfGN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":-0.0697255489774893,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pY9hiMs2za6x5s29sH6TC2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":-0.10182469873522315,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7QH8sk9RVXWAVfxVKeVt7q","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09406325270898373,"cy":-0.12679070410234947,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sGHLds88BbZkPQYtZDaLUx","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04339673996262456,"cy":-0.1588898538600833,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"99eVg8SaLEcFCJMaPWXD8n","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.00726977278373475,"cy":-0.18504471662564428,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"71eWvY68edyj2BgXY8WQ4o","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05440141254779,"cy":-0.21357729418807442,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7cCL63qwoUHSbtu2cHebcT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10506792529414916,"cy":-0.24329872914893902,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qibcJYeM1UJiSYmvPBWTJW","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15219956505820442,"cy":-0.27183130671136924,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"94NK21a9LTKKEhFcnnw4vS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20286607780456356,"cy":-0.2991750268753647,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ctBifLhmGgP5j5rfZjUDLe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3489741610731348,"cy":-0.384772759562655,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6eG7N9xmRDsFuyZqn8egmG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20875753277507064,"cy":0.4438608471462526,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fmhVUSuHzAWRC1bU9xS2gN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15691272903460993,"cy":0.41176169738851875,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sakLKAcwmQ8kEENPFgVJs7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10978108927055467,"cy":0.3832291198260886,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3rzPNvgYH4pwdLcevFMKV3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057936285530094174,"cy":0.3535076848652239,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1iMnenTQz4wtpVYNe7J99s","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0037348998014306895,"cy":0.32854167949809754,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o6xmo5Pn4wef9kZe2C6xqZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.042218448968523115,"cy":0.2964425297403637,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1Hb1yh1DVHfQP14FUSJEpj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09406325270898373,"cy":0.2714765243732374,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fWLDpBHepwmvJCiLxMU4RS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":0.24056623201393804,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cWx48TmtxbDy2rScmVSy7R","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":0.21678908404524636,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bFFj7b63cxrmzb377KjU2M","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":0.18706764908438164,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mAx1Vzsd2drZJEgWexVM84","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2896595577298127,"cy":0.15734621412351696,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"46a2ja51RhKgBss3KCVLnt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":0.12762477916265227,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tUaAfUGCxujqu9Y3vxe3yK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3909925832225313,"cy":0.09909220160022218,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7a2AMmJ4fbqLMH45H2iCNA","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43930251398068787,"cy":0.07174848143622668,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kkUqgHLFPwyrfMCV6mKfD5","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.38981429222842984,"cy":0.04321590387379655,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gAiz2xxrUp1UfsRWXcBSLS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.013494468912931856,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dMdBxe5wEMLJ9PEggVeAu9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.03868357598621893,"cy":0.3558853996620931,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gxnEnb3NzQY8Ge8Jm8SA7f","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.011982936760140374,"cy":0.3867956920213924,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sybUdESzHSnVaXwGfuQ7wf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057936285530094174,"cy":0.4129505547869533,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aPHnrEqwvsnVWtCHhtBxTy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10742450728235205,"cy":0.4438608471462526,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wxemx2DoJf46iBNpWXybjK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08935008873257824,"cy":0.32973053689653214,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kTFnxGqojRvyWxfgRvtskF","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":0.30000910193566743,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mzpfv3SH2Wnh3egtjjBKvT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":0.27028766697480283,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ncPJvuiPcTCVtFi2He6gAs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23899304498345342,"cy":0.24056623201393804,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6uuRE7GHEcAEe4K7GVHngk","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":0.21441136924837714,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wHfsLSo1vVCiKJ3F2NUC8n","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":0.1823122194906433,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ebXYmm7boDVkw8327EMtzH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":0.1549684993266478,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rsxKthqzEDpLfcWrcWU6dN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.436945931992485,"cy":0.12524706436578312,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pryGHMWa1mhgMofvvUeLdo","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4416590959688905,"cy":0.013494468912931856,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3FLYvn8ndZAh8K2QPPyYxf","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":-0.016226966047932775,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a8jMxMQHGxEvruq2J4uUU2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4404808049747891,"cy":-0.044759543610362974,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dVQN7Pi8ydDNrsoiF2hfZe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":-0.04238182881349376,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qAgJ475UJeJY7FPcGEdpNY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.39217087421663255,"cy":-0.0721032637743584,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dpAxQujNQAySa9aSeZdEoX","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29083784872391416,"cy":-0.07091440637592385,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bYHHa97S8RXp19NoqTvPJr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2378147539893521,"cy":-0.10182469873522315,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6SeEC7fQCdKXPjZxSsdZm8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":-0.127979561500784,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aRFAARutT3NYzQH7JngjR9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14237318346714029,"cy":-0.15770099646164876,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pgXWnPt5iKo75wpgk8bAas","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08817179773847693,"cy":-0.18623357402407884,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vfvvk63mRwsRQ13tLkM2Wu","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04339673996262456,"cy":-0.21476615158650897,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4VAyz7v3pJ4ecCEvKkELct","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0049131907955319975,"cy":-0.23973215695363526,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rXXDtaCQ441CBebznnvwVP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05204483055958712,"cy":-0.26826473451606536,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8GbJtcsWZn3sFCVai2uXdu","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10506792529414916,"cy":-0.2991750268753647,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tkJiqSfGcrwkF7R5W6oWrR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1545561470464073,"cy":-0.32770760443779473,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mjVgFDC3MuuSbrQiLz8beg","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.20050949581636093,"cy":-0.35386246720335574,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eZQnyiKuHTgpriho1XTkFq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25235429955682165,"cy":-0.3871504743595241,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nnhD5KcBckk4FAXqgrJz1m","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30184252130907957,"cy":-0.4121164797266506,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vddHcoVWtVSFne7zHaZDoV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.041040157974421676,"cy":0.4129505547869533,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nthJ9ZXFLF4YVLkK6FJg3G","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09052837972667965,"cy":0.38560683462295775,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pHpx6NN38VbLKsAdjvQq5X","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":0.3535076848652239,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tReNdr6BMknW3pKaaKgT2r","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":0.3321082516934013,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pky3qKmcQv6goYMFfPrQyu","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2378147539893521,"cy":0.30000910193566743,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9Gh4oxs7xr6bu526hDNvv2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":0.2714765243732374,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fxzu2mix8VrfcwwGyVpWmZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.24175508941237273,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e8sL54r9712juxaxDn8oSw","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":0.21441136924837714,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kNyq87ppcAxC6iAJLfFYPn","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":0.18706764908438164,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h3uTywdm7RShuhnZCn9reC","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09052837972667965,"cy":0.4426719897478181,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pJncozy6Rz8EfewNTzBV9a","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":0.41413941218538786,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vvMUbsrcSiSjwP7Y5tU1LL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.18832653223709409,"cy":0.3867956920213924,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1G8NT1Zoz87anyKBPQsHLd","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":0.3558853996620931,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i9YQqnCZv92BFJFHn7cCiB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":0.3261639647012283,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s3UMZ6yA8AhemDugYV8vL9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.29882024453723294,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iE5KVmshBFmCedVRvmAraQ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.387457710240227,"cy":0.2714765243732374,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nSoRZ2ohopc3Uk2eEhsaXz","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":0.23937737461550349,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tRnf3HbPJnHGQc3C1tHrm4","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":0.3000091019356675,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5GNzWP1xJUZHh9KT6YRFV6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.387457710240227,"cy":0.32973053689653226,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gYVeyGSA6dumwRgt46oGj8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.3558853996620931,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3SLWKQyMH3qNnSL8cb6Mxe","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":0.3856068346229578,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o1MFq3LbkcxftPFeSVY2YQ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24017133597755486,"cy":0.4177059843806916,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1x2T8djMTuLWynXEnNgMbT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":0.44267198974781796,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ccqgw8SRNmHVUFFbXRyYT9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2896595577298127,"cy":0.4450497045446872,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"m1JXedMn92Urk8nE9oPJHC","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":0.4141394121853879,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o67PeKaAkvwQrD7JVLdGYg","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3862794192461258,"cy":0.3844179772245232,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bkfCZxyk73k4a4vrgwaj4L","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43930251398068787,"cy":0.35469654226365854,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vrgCite9XpUW1Cq3PuWhba","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":0.4188948417791262,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cRNc4mNhvgSvQLUkp5faWt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.38981429222842984,"cy":0.4438608471462525,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5xRxzmnaiMp3ypfUVQBWr3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.010804645766038935,"cy":0.4438608471462525,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5CzxLZbvH5PomobdfeXNZp","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.44029427495094886,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9h3yDXtr329orX1FLE5i63","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4031755468017982,"cy":0.3844179772245232,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7nTZRLPEdEtBjmsWCnB26y","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4514854775599548,"cy":0.4165171269822571,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"abEAsj1hGeo63K5YHetkKr","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4055321287900009,"cy":0.32973053689653226,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hsqeY3fPZZkvqziKNEVVas","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45502035054225903,"cy":0.3582631144589623,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dCHY6fHL88UK5U5JeNTwME","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43930251398068787,"cy":0.4723934247086827,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8a2tR8FURhfjJTiYpNfCzv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4404808049747891,"cy":-0.10063584133678853,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3TNP5AjyGeTgzNXWzYVznQ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.38510112825202436,"cy":-0.12560184670391483,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"saWHMFZynA21qy5pjZ1rg3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3367911974938678,"cy":-0.09825812653991942,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vYyqsMkXopji3o4ewZDzXj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4404808049747891,"cy":-0.15770099646164878,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bDcv52Ek3SJZueMz72m1rB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":-0.18266700182877516,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pg6C9LvjyDQAKpVjTFWKhm","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3426826524643748,"cy":-0.15413442426634502,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7xxy5WMi2eRmAFJQd4PEpL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2884812667357113,"cy":-0.13035727629765329,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bKrn5V4VqTw7TEK7QKYeA1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43930251398068787,"cy":-0.21476615158650897,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s6CxUXipAWMWAd8W2jdPk2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.387457710240227,"cy":-0.2385432995552006,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7pEWxcY19Ng2hczQx4C5sh","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3391477794820706,"cy":-0.21238843678963976,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rqhBmqo9RCaSK9b3hCeo3X","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29083784872391416,"cy":-0.18385585922720973,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nbbJ9oZ8jEaCweY8WgVHtK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24017133597755486,"cy":-0.15532328166477963,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5DwWFBTuxqVLf5FzhT7Udm","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.18950482323119552,"cy":-0.18266700182877507,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n5ksBwaEKwnY1T4um6u5YV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":-0.21595500898494352,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oRnvwa7g1CtYiocfQSv6ZH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09288496171488242,"cy":-0.2421098717505044,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"szeJxCXxaL2e3RjfwM8x47","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04339673996262456,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hFu14KzwBM87w56f6Cwr48","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0037348998014306895,"cy":-0.29798616947693,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sQMsnkxn9T5AgrjfJHH51n","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.05557970354189131,"cy":-0.3277076044377948,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7GDJiXyhG6C4hNkW9Y5KQ1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10624621628825073,"cy":-0.3562401820002249,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kRdHgfFG6booP82zfM58L5","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15337785605230575,"cy":-0.3835839021642204,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5bnXwcCDLMuTi7NBVNs9wq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2016877868104623,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2cSu4Me9dQhmQX73fnfjcT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.25235429955682165,"cy":-0.4406490572890806,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"epJz3sQxCaTSmtVk8L41pY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.4416590959688905,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u5wXENdced4NnZ2UpBvdUR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.38981429222842984,"cy":-0.29798616947693,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2dN8txQPwqUuXJ6MvLow8v","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aCzYNDZyfJEdri5oFDAX1A","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29201613971801543,"cy":-0.2421098717505044,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xw95hcJakBfeUDzB5drZTb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2378147539893521,"cy":-0.21357729418807436,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7aFDGFAZUmGKJWfMUn4u8W","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":-0.2385432995552006,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wYpaiw5NjZeqmt9x2asvgE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":-0.2742090215082384,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bSFykzxR6KFC6U5RmABfAo","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09052837972667965,"cy":-0.29798616947693,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"td3wNUExEJkcF3U68VMTCS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04457503095672587,"cy":-0.3300853192346639,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gqiho9LGuhUyb3Qus7okQR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2931944307121169,"cy":-0.295608454680061,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kqCmYed2jAt9y67YpwCDE9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23899304498345342,"cy":-0.2694535919144999,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dgxBqcP8E136o93HKbnb5Y","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.436945931992485,"cy":-0.3277076044377948,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"d8xVLuSbdR3ZcdTaGVf3kE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3886360012343286,"cy":-0.3574290393986594,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mE2ubFBooCHdCnyZX6Q2fn","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.34150436147027335,"cy":-0.3300853192346639,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rNH5NZ3ioMN6XFUt4UpHjp","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.43812422298658643,"cy":-0.384772759562655,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ov1As6JoGWeAANi2w4bAzb","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.387457710240227,"cy":-0.413305337125085,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9AGm3XGuztXYa4ZvvUC2qU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.44283738696299196,"cy":-0.4454044868828189,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"whp3eTFpZtyHh6MmQTeqsP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.33796948848796926,"cy":-0.384772759562655,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2tivptcQ7UJFtBc3QNMdjZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29083784872391416,"cy":-0.3538624672033556,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8BKcu35Qa4TPVNvr9QNtYS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24017133597755486,"cy":-0.32889646183622934,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s8GdNU4Xh5bDiYNyPpM5c2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":-0.295608454680061,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"geLZV2TE4SAkBTxY2H7z9C","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14001660147893752,"cy":-0.3277076044377948,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cR5NttdPtQtKZ2QuGZ4cGY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09406325270898373,"cy":-0.3586178967970941,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kb64JmF4g2VHNUXt8PGp8P","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":-0.35505132460179034,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ohyVoqyh1fSJAZvoWLa7xg","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.23899304498345342,"cy":-0.3883393317579587,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mam3m1MFMR6QYaVhMhUf61","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.29083784872391416,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9otfxK8a8saUXNrV48ac1S","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.3450392344525775,"cy":-0.4430267720859498,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3FE8UkdGNZdxozENEdAKLF","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.2896595577298127,"cy":-0.4679927774530761,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1itKaxAe6PPjB36Ct9WPbt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24017133597755486,"cy":-0.4418379146875151,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mEwqoN1Hgzq1sZEWWYtYiS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19068311422529685,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mvPqyD2QhB4pgXGsya35Az","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":-0.3859616169610895,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"icedHX9AjRRV6K9qLRi8h8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09052837972667965,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ixMrfpnNCx2pzdbjNDcETK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04693161294492862,"cy":-0.38239504476578573,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fJa1KgR4efS7rdWz3c5ws6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14119489247303899,"cy":-0.4418379146875151,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"niDVT6JMXYiQ1MfkaVXBh2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.19186140521939826,"cy":-0.4679927774530761,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9WTjUWsouqRDt3WAX9og5p","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.09406325270898373,"cy":-0.46680392005464155,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gJWF9BbGWqJ5RiBTFKBvEy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.04339673996262456,"cy":-0.4418379146875151,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8vSWbpHRJezXwxg2bzLK15","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.001378317813227938,"cy":-0.35505132460179034,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"89LTrNQMYLBWkUr8q3zs78","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0025566088073292518,"cy":-0.4121164797266505,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mG1153YuBpGiUTcG3cLKhu","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.053223121553688676,"cy":-0.38715047435952415,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nzaobVxpQX5ZDLxNtod1tq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10388963430004787,"cy":-0.41092762232821595,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"prucxap8in3eRt1hXbqSZc","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.050866539565485806,"cy":-0.4430267720859498,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o6dCXRccq7VrMuTGUAMf1h","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0037348998014306895,"cy":-0.46918163485151065,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1CeJhTWdV6HVNMGZiebhVN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10271134330594656,"cy":-0.46918163485151065,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iuVig88Eryb498jb2o9hv6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15691272903460993,"cy":-0.4430267720859498,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pDU7v3xRa7tyafHMTVQfHP","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.19815291382815808,"cy":-0.4703704922499454,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"igDxZaX9vHP2AWnmuk7rbE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.30302081230318084,"cy":-0.46680392005464155,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hpSEihRmM4bWqGtADkL3iV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3501524520672361,"cy":-0.4418379146875151,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k6hVcQ4HsjPmK2AMBXFwSG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":0.471204567310248,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pQWMSf63o2UZvbixbJ7x3a","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3525090340554387,"cy":0.47001570991181346,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iHs7hh1fgkTvcFjQGp6vdU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.2511760085627201,"cy":0.471204567310248,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ikwnSMkfVme9m36c4fdgzZ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15337785605230575,"cy":0.4688268525133789,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3BVEG2ZatFh5rurg1BfDQ1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.057936285530094174,"cy":0.4688268525133789,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5TTwQeht2y67yFHpDwk7SG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.042218448968523115,"cy":0.471204567310248,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qt4yLExJpLTBowT6VPA2t7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.14472976545534302,"cy":0.4688268525133789,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wtXgsveFPNuvG8yagrGhjX","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.24134962697165613,"cy":0.4664491377165097,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jCucxgVjuLNfUB5GcZ3GBJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.34150436147027335,"cy":0.47001570991181346,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bvUs4vNUy7rjJ8wRozhXzH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.2702876669748028,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"21jCj69kYjWbi43ijo148n","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.21084479705307344,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"autBoAyzdvNAZVDtBQh6h3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.1537796419282132,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"opKFYN72H4nWcaRQ2QPip7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3996406738194939,"cy":0.10028105899865679,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"66RKD94s3WovZtoVdR4EhK","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40435383779589945,"cy":0.04083818907692739,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t1o1k82fPneidh8LG91KZ3","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40199725580769696,"cy":-0.016226966047932775,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q8YoP7VA8Cq7aoqvmhWueh","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3996406738194939,"cy":-0.07091440637592385,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"d6BxohUXx7jMxtc9jXais2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.40081896481359536,"cy":-0.12679070410234947,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"akDuRhxwpxoj2z33rJUgJh","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.18266700182877507,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hzYm1dhZ9LLt7sqemmYCDs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.2409210143520699,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ocH8rQddgtgbqC8pcEacuE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.2991750268753647,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uF9F47Z6PqiJhWoStgn2uS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.3574290393986595,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"92fYhQy7HvXbtXrCyTCqTH","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3984623828253927,"cy":-0.4097387649297813,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kUJd8a2SHxduSfAvQGLQfS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.3996406738194939,"cy":-0.4703704922499452,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9XaXTUvPm9yFtUaW2Ye2sL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45502035054225903,"cy":0.30119795933410204,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cg7BBRL4WcDqB8yp1B7o8a","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.452663768554056,"cy":0.24294394681080725,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pAcNoDp7ir4EWPT9j9kq1e","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4514854775599548,"cy":0.1870676490843817,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8nXK8m2dvdiFfCKeR9nLWj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.452663768554056,"cy":0.12762477916265233,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eP1EoT59gCuUXxYM4EXHzS","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.452663768554056,"cy":0.07055962403779206,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1gjtQCskcuhbhwoNpKGBt7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":0.012305611514497309,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jimkC6zfk4aDVcsqbirSS1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.44677231358354924,"cy":-0.04238182881349376,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vvgZbtsp1caVNW8tZNWHgJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":-0.09706926914148485,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uAVWMCSJd4PAg19UJ7o6xs","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45266376855405616,"cy":-0.15888985386008334,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ncdztpRTU1hDfYCvqpzcT2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4467723135835491,"cy":-0.21595500898494358,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bRuvkqPWMiR7YmistgDHNL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":-0.26945359191449997,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5qeiecJQD6oAbtikN5hs7G","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4491288955717519,"cy":-0.3265187470393602,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"acpCXRHPZv9nQZjdjiSrj1","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.45030718656585317,"cy":-0.38358390216422034,"cz":0.5000000074505806,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"c6tcyDJgJPeoowWMPezdUA","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.4491288955717519,"cy":-0.4406490572890806,"cz":0.5000000074505095,"lx":2.976,"ly":1.968,"lz":0.046,"trackerType":"AADAT","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3tXdUQvFc2DWP68yZ3S37u","selected":false}],"view":{"yearlyPvYieldPanelX":-1278,"autoRotate":false,"mapZoom":20,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":47,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-284,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":164,"groundColor":"#68ccca","groundPanelY":0,"groundImage":true,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[54.58775332762295,-93.02576361051297,20.93606976764628],"panCenter":[14.588117257653206,-3.3871234541530884,0],"orthographic":false,"enableRotate":true,"cameraZoom":10.266841665590098,"showInstructionPanel":true,"cameraPosition2D":[2.3674379904539022,-0.42904140754321896,47.99999957096287],"panCenter2D":[2.3674379904539022,-0.428993405410401,3.192361204877974e-7],"showEvolutionPanel":false,"solarRadiationHeatMapMaxValue":8,"evolutionPanelX":-3,"evolutionPanelY":5,"showEconomicsPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":520,"height":318},"showMapPanel":false},"evolutionMethod":2,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"notes":[]}')},433:function(e){e.exports=JSON.parse('{"docid":"9J5vzBxZ8UEKUiQGnyPEwk","time":"02/03/2023 10:36 am","timestamp":1675438564802,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":true,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"52 Grove St, Lexington, MA 02420, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.473578752859865,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":true,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.23642289182585},"elements":[{"type":"Foundation","cx":0.18907611516527822,"cy":-1.4953477366662633,"cz":0.05,"lx":142.99409463043497,"ly":14.49686547290569,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.17972820802569928],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"f1wuYrFxWZKMD6aZyPACDm","locked":true},{"type":"Wall","cx":0.1229949609826312,"cy":-0.09586926546103025,"cz":0,"lx":141.43921506444258,"ly":0.3,"lz":5,"relativeAngle":0.013431200616335025,"leftPoint":[-70.59023385930746,-1.045689943643172,0.1],"rightPoint":[70.83622378127272,0.853951412721111,0.1],"leftJoints":[],"rightJoints":[],"textureType":"Wall Texture #9","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0.17972820802569928],"parentId":"f1wuYrFxWZKMD6aZyPACDm","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"2yrSxZa8P37K2Wabhhsob6","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"color":"#999999","fill":"Full","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.4638388297765159,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0],"color":"#fff","parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"6TnNeQH6erPu8fzCqspsQz","selected":false,"dailyYield":6.733366737790442},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4638388297765159,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"gu6EsH65oiQstx8yYjxsYM","selected":false,"color":"#fff","dailyYield":3.991431891754075},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4638388297765159,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"94hqXM6tCStbzXuLLtVMBy","selected":false,"color":"#fff","dailyYield":3.989257482553087},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4072774299104671,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"aS89FFbHtiL5JbmajBYETF","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4072774299104671,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"iMsrFuB8C7dYwSkPYpkRyx","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.4072774299104671,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"djV64xj6hwTLYAQB2N8zw1","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.35071603004441837,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"casseicLyjsxNGnJT7DvaK","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.35071603004441837,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"ufBkyVjzMhQN4mEaVXo3EK","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.35071603004441837,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"rG69gXx8zf5z7bd3jLid7p","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.2941546301783697,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"4mhiWnxVt3aSMz3WDvtVwo","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.2941546301783697,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"cfXV4fZanitQvrNsdxnjDu","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.2941546301783697,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"afxfcWAVeGHfrBf7ddtQkK","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.23759323031232094,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"taypcJAabEnqBDqf3KAcsA","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.23759323031232094,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"5VSFMaiUtr3ASxPZrLPaqP","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.23759323031232094,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"khqKJ2jxRFmMw5yFH4HvBM","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.18103183044627222,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"45VggV1fJxeJNM36B2hiQt","selected":false,"color":"#fff","drawSunBeam":true,"dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.18103183044627222,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"soXBAY8jJsisj3Xad7rpuD","selected":false,"color":"#fff","dailyYield":3.880541409581155,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.18103183044627222,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"sR2RBNakCEySyoLGEeeZb7","selected":false,"color":"#fff","dailyYield":3.8640428284166424,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.12447043058022349,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"iwZXtRNQgv7fvMRfiFZxuv","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.12447043058022349,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"wUSzVi6q69sDd7Y3RV7XDc","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.12447043058022349,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"g8656tJazY4VvwetGnGz1R","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.06790903071417476,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"1BNASUXS635gRH1Xg45X8c","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.06790903071417476,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"jqyPzfhR61a76okfZpf812","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.06790903071417476,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"gxBypDUjEGfJT4aJY4HKEm","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.011347630848126027,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"tzyoRV5o5Rf6T7A6oU6yFQ","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.011347630848126027,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"jGQqULp9xXooyUSarLteE1","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.011347630848126027,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"c5nbEjzq2Budgo4DrHmjRz","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0452137690179227,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"7DRo8NdVHyNoN6SCtArVVd","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0452137690179227,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"rq26S8tSgsT11vC4noGToG","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0452137690179227,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"4ZMNCLswMsFA8KarYUVw1G","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.10177516888397144,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"22DFqVGzrGpriDvT6ouxg7","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.10177516888397144,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"vvfCJue14aYCZ2L5rcpewf","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.10177516888397144,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"hhenx4zMnvUHuryKk9FFB8","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.15833656875002017,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"tNCMqiL9tn5diapj3smKL9","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.15833656875002017,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"3GsZ7gQePP2KmUhz3ysWpz","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.15833656875002017,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"qBPNAAa4HnjwBJ2TFMVzhv","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.21489796861606889,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"raUT5Fe7Z4gk2QVK2yVSap","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.21489796861606889,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"18BeCBetcY2SnC96NdiyGR","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.21489796861606889,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"jJw5xahWNQv9BKodgpDQUR","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.27145936848211766,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"1MiLx5fG5sgnXzzKVfatuF","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.27145936848211766,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"giGW7icqfR8Ad9ukdMMaHX","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.27145936848211766,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"bYrSiMQSXtGa7p4zv5yDGZ","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3280207683481664,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"vcPTnmFnHZYKsoYKkBcskf","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3280207683481664,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"cAD7dLSqyYRtYyQsTG2mbb","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3280207683481664,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"rTvMYE5Z5kwPgoWKh4kLzb","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3845821682142151,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"k4ZudXKEZmAmfbUvaCp3Dp","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3845821682142151,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"8hVfJjo52dDJLo4AfmT3HK","selected":false,"color":"#fff","dailyYield":3.880541409581155},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3845821682142151,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"9g31dfD7wp3rjSRfYLZJ2z","selected":false,"color":"#fff","dailyYield":3.8640428284166424},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.44114356808026384,"cy":0,"cz":0.2954,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.04375081827167128,-0.9990424745227598,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"sxZHfHVk2n5kbhzY3hT2zd","selected":false,"color":"#fff","dailyYield":6.732470849618642},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.44114356808026384,"cy":8.881784197001252e-15,"cz":-0.004600000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.3490658503988659,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"nA54BbzpGLqh5sWi7osbnq","selected":false,"color":"#fff","dailyYield":4.024242246107118},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.44114356808026384,"cy":-1.4802973661668755e-14,"cz":-0.30460000000000004,"lx":7.79,"ly":1.046,"lz":0.046,"trackerType":"None","tiltAngle":-0.6981317007977318,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0.013430796794925525,-0.9999098027809575,0],"rotation":[0,0,0.17972820802569928],"parentType":"Wall","parentId":"2yrSxZa8P37K2Wabhhsob6","foundationId":"f1wuYrFxWZKMD6aZyPACDm","id":"vtRkLNQDgqTSNAh2My5c9Y","selected":false,"color":"#fff","dailyYield":4.009918074143593}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-17.282790575888168,5.440474449160031,0.0000036906384867201037],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-17.282790575888168,5.440324442496329,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":19,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-42.77632157556409,-34.119265652337766,20.000447749982982],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":true,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":6.470670899474179,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-26.714608093209538,-11.412788709722923,0.2632378650359435],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":4.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":413,"height":68}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["A proposed solar noise barrier in Lexington, MA"]}')},434:function(e){e.exports=JSON.parse('{"docid":"mETyjNhcSpLHUreuu362jG","time":"02/03/2023 10:33 am","timestamp":1675438394402,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"9/22/2022 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":true,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"S H St, Bakersfield, CA 93313, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":35.2397498816683,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-119.02084409607578},"elements":[{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"121ogbDPhqFdjF1EqsotWr","foundationId":"121ogbDPhqFdjF1EqsotWr","id":"bXdahMaM63p5YKq5iW5dkA","selected":false},{"type":"Foundation","cx":-0.355148183178954,"cy":-68.66520831611422,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"121ogbDPhqFdjF1EqsotWr","selected":false,"textureType":"Foundation Texture #5"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"e1EQqVFfXevnZt4eaeuVPE","foundationId":"e1EQqVFfXevnZt4eaeuVPE","id":"kGbBKyVArnRt64dJUZUHXo","selected":false},{"type":"Foundation","cx":-6.512082441645507,"cy":-68.66019836570281,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"e1EQqVFfXevnZt4eaeuVPE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5AYGqMpb7MY45GfUGrAPx7","foundationId":"5AYGqMpb7MY45GfUGrAPx7","id":"pHgsi4FBAPcCENbBFq8nJi","selected":false},{"type":"Foundation","cx":5.789049041421398,"cy":-68.36660414055642,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"5AYGqMpb7MY45GfUGrAPx7","selected":false},{"type":"Human","name":"Jack","cx":1.2131787149033482,"cy":-5.683681388279453,"cz":0.300000011920929,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"5AYGqMpb7MY45GfUGrAPx7","id":"echEghBkfqunhtqJQz95fM","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1207079978734572,"cy":-0.004668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xgFeRbJGihUVnyEf5m22ib","foundationId":"xgFeRbJGihUVnyEf5m22ib","id":"1ZYTz63nWtEEsbRNhgdFaw","selected":false},{"type":"Foundation","cx":5.809815585913138,"cy":-54.46106108413,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"xgFeRbJGihUVnyEf5m22ib","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nAmb8PRM1R6jeNzPW5C8VV","foundationId":"nAmb8PRM1R6jeNzPW5C8VV","id":"4zJUqXV3Fnf2nuwbpsMiXs","selected":false},{"type":"Foundation","cx":5.7835484198244025,"cy":-40.561453025263894,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nAmb8PRM1R6jeNzPW5C8VV","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"2Jpks6qcta7oxTq8g15yvM","foundationId":"2Jpks6qcta7oxTq8g15yvM","id":"nTqyuFThYbp62RDDvj69Tn","selected":false},{"type":"Foundation","cx":5.765589353420241,"cy":-26.70562418723046,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"2Jpks6qcta7oxTq8g15yvM","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4XXqf2vXZ7ZFawMdYuzXJR","foundationId":"4XXqf2vXZ7ZFawMdYuzXJR","id":"8xX37o12HQw79GgWaPoJra","selected":false},{"type":"Foundation","cx":5.7629992141008515,"cy":-12.846184608655223,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4XXqf2vXZ7ZFawMdYuzXJR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nhfGp8zoAtBhBtTRQS5X4A","foundationId":"nhfGp8zoAtBhBtTRQS5X4A","id":"xtX3Yeicb1xmckA4hRhAbT","selected":false},{"type":"Foundation","cx":-0.3660148444167448,"cy":-54.735545319487315,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nhfGp8zoAtBhBtTRQS5X4A","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ibdbY4z7waLLai5mudLon8","foundationId":"ibdbY4z7waLLai5mudLon8","id":"uUyvA9DB8ymLg6XLaLfYFQ","selected":false},{"type":"Foundation","cx":-0.35970964251660265,"cy":-40.85602650039143,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ibdbY4z7waLLai5mudLon8","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vXadeokGJ9NmeA6ewhjvBy","foundationId":"vXadeokGJ9NmeA6ewhjvBy","id":"ippQMjL5WuoRmncEHb3ng3","selected":false},{"type":"Foundation","cx":-0.35809920705666,"cy":-27.00228253941227,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vXadeokGJ9NmeA6ewhjvBy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"j9vK8NMr2vp4GiSK1DtxRq","foundationId":"j9vK8NMr2vp4GiSK1DtxRq","id":"ntm7qPuXg8vaHHDMEfMv14","selected":false},{"type":"Foundation","cx":-0.35734216826093124,"cy":-13.132067218686498,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"j9vK8NMr2vp4GiSK1DtxRq","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"2WSX6m9s99dM4WhZbyuvff","foundationId":"2WSX6m9s99dM4WhZbyuvff","id":"gkBV2ZfxJtfhuZjj7rHAoZ","selected":false},{"type":"Foundation","cx":-0.3463719972166439,"cy":0.7317163979243815,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"2WSX6m9s99dM4WhZbyuvff","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eLNa4YNCioCE3UNDGya3Up","foundationId":"eLNa4YNCioCE3UNDGya3Up","id":"rWFuzCeuZszy77yBB8jveg","selected":false},{"type":"Foundation","cx":-0.3586608333447727,"cy":14.590396355482044,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eLNa4YNCioCE3UNDGya3Up","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o1CCZc1sDeTQWrwG46TfNN","foundationId":"o1CCZc1sDeTQWrwG46TfNN","id":"qShFLxfnobEyyoPeMTASuG","selected":false},{"type":"Foundation","cx":-0.3518720954179425,"cy":28.454375484604732,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"o1CCZc1sDeTQWrwG46TfNN","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"u1RK5NeNA9j7qFSmCR8hid","foundationId":"u1RK5NeNA9j7qFSmCR8hid","id":"rCYT7zsMynuWwB4Gj2Fsd3","selected":false},{"type":"Foundation","cx":-0.35131046912982616,"cy":42.32211519647182,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"u1RK5NeNA9j7qFSmCR8hid","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h9eRaQKsYCgZDNL6TBSdkG","foundationId":"h9eRaQKsYCgZDNL6TBSdkG","id":"iciTKiFoWiSSRXfRV2jKAY","selected":false},{"type":"Foundation","cx":-0.35806918169835766,"cy":56.17571570619225,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"h9eRaQKsYCgZDNL6TBSdkG","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.003863684501694478,"cy":0.01352080389279529,"cz":0.5000000074505806,"lx":13.776,"ly":8.928,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.75,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gdwqBp4tF8xLp9yJkFqCx6","foundationId":"gdwqBp4tF8xLp9yJkFqCx6","id":"88NfQv74cDhjrzSepw9B7g","selected":false},{"type":"Foundation","cx":-0.3684777264545248,"cy":70.01231995987031,"cz":0.05,"lx":9.850000000000009,"ly":14.457208351115582,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #5","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gdwqBp4tF8xLp9yJkFqCx6","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"16YsecagZdQFboT8cHk3zY","foundationId":"16YsecagZdQFboT8cHk3zY","id":"uWF3E9dPiegXh2L5b6Vsn8","selected":false},{"type":"Foundation","cx":5.774616554678275,"cy":1.0295178181583675,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"16YsecagZdQFboT8cHk3zY","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gdCn75FBte524E9epTDvqA","foundationId":"gdCn75FBte524E9epTDvqA","id":"tFCws2tPQDLM5HKxxJGgWv","selected":false},{"type":"Foundation","cx":5.773867010320257,"cy":14.885614964778393,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gdCn75FBte524E9epTDvqA","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"qLVXWryBBGmRgAroLqVwdi","foundationId":"qLVXWryBBGmRgAroLqVwdi","id":"ud1b2bEhTi9i92Q8c8D373","selected":false},{"type":"Foundation","cx":5.778389095695882,"cy":28.74465191336493,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qLVXWryBBGmRgAroLqVwdi","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bVwMiP2aUzVjjeaX792zXn","foundationId":"bVwMiP2aUzVjjeaX792zXn","id":"c9QcDJ4K8yR1ng4dRJ4D4t","selected":false},{"type":"Foundation","cx":5.784822839568983,"cy":42.61795388645869,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"bVwMiP2aUzVjjeaX792zXn","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nW5ArCP1HhxjesUyKCR3at","foundationId":"nW5ArCP1HhxjesUyKCR3at","id":"gxJYgTJqcdLmnzufEv3zS9","selected":false},{"type":"Foundation","cx":5.772865019410357,"cy":56.469133301847506,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nW5ArCP1HhxjesUyKCR3at","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.1167079978734572,"cy":-0.006668963284178641,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ez9S4TjyRrt69CUc8NCPjT","foundationId":"ez9S4TjyRrt69CUc8NCPjT","id":"715S84avByaQTs2A6QaRyi","selected":false},{"type":"Foundation","cx":5.767433266447149,"cy":70.31691119865602,"cz":0.3,"lx":3.6116055507992932,"ly":14.100000000000009,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ez9S4TjyRrt69CUc8NCPjT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k7PuJZ5ck1CDCnF49AEbze","foundationId":"k7PuJZ5ck1CDCnF49AEbze","id":"rBjhWRGRVr5rhJmJ7ZHt5W","selected":false},{"type":"Foundation","cx":-6.527392714190696,"cy":-54.732229116611116,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"k7PuJZ5ck1CDCnF49AEbze","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rU3754fwdgKoDWv2zoFH3R","foundationId":"rU3754fwdgKoDWv2zoFH3R","id":"1Wbh9tZMmYnYRWgQs2oxcg","selected":false},{"type":"Foundation","cx":-6.534711172615536,"cy":-40.8521892213242,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"rU3754fwdgKoDWv2zoFH3R","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmvt2utUNYmiSjixPNE6cB","foundationId":"rmvt2utUNYmiSjixPNE6cB","id":"hgGCNRfRRjgNRbKehkHZRR","selected":false},{"type":"Foundation","cx":-6.531475518119176,"cy":-27.005759344492336,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"rmvt2utUNYmiSjixPNE6cB","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5D8LWb5KSCQa5CzJgeqTzQ","foundationId":"5D8LWb5KSCQa5CzJgeqTzQ","id":"4q6sn5L82weCVDGzpuu2sX","selected":false},{"type":"Foundation","cx":-6.531475518119178,"cy":-13.125523095938771,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"5D8LWb5KSCQa5CzJgeqTzQ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kvv1recmXZdZQMtZey2snR","foundationId":"kvv1recmXZdZQMtZey2snR","id":"iy2Xwp5VW7Kj9siFtt7QWd","selected":false},{"type":"Foundation","cx":-6.508807101463274,"cy":0.7373815692707449,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"kvv1recmXZdZQMtZey2snR","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xb3DDtTRb2xE4U4z4K1hXE","foundationId":"xb3DDtTRb2xE4U4z4K1hXE","id":"nMuKPt4koMQGztfZfy8jfD","selected":false},{"type":"Foundation","cx":-6.5258084139552,"cy":14.606283609496337,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"xb3DDtTRb2xE4U4z4K1hXE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gwy36bVzcps8LsRhJTof4Q","foundationId":"gwy36bVzcps8LsRhJTof4Q","id":"i67r94XMRFM3jCvyxogFNy","selected":false},{"type":"Foundation","cx":-6.511475518119177,"cy":28.4721869622139,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gwy36bVzcps8LsRhJTof4Q","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7zg5mcdSFwxHKAWZT3Ek6v","foundationId":"7zg5mcdSFwxHKAWZT3Ek6v","id":"eRWg2zs6foonE5xuNEVRz9","selected":false},{"type":"Foundation","cx":-6.511051943403113,"cy":42.34375751909987,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7zg5mcdSFwxHKAWZT3Ek6v","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"suByeHBWYCe52G1Gv4ZeSU","foundationId":"suByeHBWYCe52G1Gv4ZeSU","id":"phLDTcCNd2W2ZnrjoTkBjB","selected":false},{"type":"Foundation","cx":-6.52880710146327,"cy":56.18132525099307,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"suByeHBWYCe52G1Gv4ZeSU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.10063950048686088,"cy":0.012876862495727583,"cz":0.5000000074505806,"lx":13.776,"ly":2.976,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":-1.5707963267948966,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":4,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jfGqSpqYfY4BpzvBjow99u","foundationId":"jfGqSpqYfY4BpzvBjow99u","id":"shmgnG7kSY3iWfHSTksGd3","selected":false},{"type":"Foundation","cx":-6.53447420562725,"cy":70.03322597872673,"cz":0.3,"lx":3.7538685169331028,"ly":14.407188450292779,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jfGqSpqYfY4BpzvBjow99u","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[7.48786322173483,69.21304781831628,0.00006921612429673364],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[7.48786322173483,69.2130278174273,20.000069216086263],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":19,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[14.98566534119282,-94.01207606498471,5.484037741591015],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":true,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":38.96037486782548,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-22.269354989815284,10.551050181634587,0.4104687909980791],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":366,"height":67}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["A proposed solar canal in California"]}')},435:function(e){e.exports=JSON.parse('{"docid":"vhboPhKYLs7YFW4GNHvu35","time":"02/02/2023 05:12 pm","timestamp":1675375965968,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"timesPerHour":4,"address":"Natick, MA","name":"default","longitude":-71.3488548,"latitude":42.2844063,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"date":"8/22/2022, 2:00:00 PM","orthographic":false,"cameraZoom":43.16939043526371},"elements":[{"lz":0.1,"rotation":[0,0,0],"normal":[0,0,1],"cy":0.03672476718970863,"id":"iGgGyZAWhJDDrqTBSuKY6v","ly":10.412088787523913,"type":"Foundation","cx":-0.02675735166375759,"selected":false,"cz":0.05,"lx":16.616755394628733,"parentId":"Ground"},{"lz":0.046,"selected":false,"cz":0.5000000074505984,"relativeAzimuth":1.5707963267948966,"cy":-0.10449299890247031,"cx":-0.4024621157154061,"poleRadius":0.05,"showLabel":true,"lx":1.046,"label":"VSAT","tiltAngle":0.5235987755982988,"poleSpacing":3,"rotation":[0,0,0],"poleHeight":1,"trackerType":"VSAT","drawSunBeam":true,"orientation":"Portrait","ly":1.558,"type":"Solar Panel","id":"dnMAS4xYMUhcSByeLwN5TX","normal":[0,0,1],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.9974383842410144},{"ly":1.558,"drawSunBeam":true,"selected":false,"normal":[0,0,1],"id":"wc8yTNk8bcNL8vA26NKhEp","tiltAngle":0,"poleRadius":0.05,"poleHeight":1,"rotation":[0,0,0],"type":"Solar Panel","lz":0.046,"trackerType":"HSAT","lx":1.046,"label":"HSAT","cz":0.5000000074505762,"showLabel":true,"cx":0.13515302447733513,"poleSpacing":3,"relativeAzimuth":0,"cy":-0.10573019166804135,"orientation":"Portrait","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":2.073422461213974},{"lx":1.046,"poleSpacing":3,"rotation":[0,0,0],"orientation":"Portrait","poleHeight":1,"showLabel":true,"tiltAngle":0.5235987755982988,"normal":[0,0,1],"selected":false,"label":"AADAT","lz":0.046,"drawSunBeam":true,"id":"r18XcJKcSLBW2tCEW6s74k","relativeAzimuth":0,"cy":-0.09709770433882582,"type":"Solar Panel","trackerType":"AADAT","poleRadius":0.05,"cx":-0.13700106436587867,"ly":1.558,"cz":0.5000000074505806,"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":2.215778465205723},{"tiltAngle":0.5235987755982988,"normal":[0,0,1],"rotation":[0,0,0],"lz":0.046,"poleSpacing":3,"selected":false,"cy":-0.11542091451120043,"drawSunBeam":true,"poleHeight":1,"lx":1.046,"relativeAzimuth":0,"trackerType":"None","cx":0.4032836323996918,"showLabel":true,"id":"u4LjNU3fd3PVZ6QAX6aug1","ly":1.558,"poleRadius":0.05,"label":"Fixed","orientation":"Portrait","cz":0.5000000074506161,"type":"Solar Panel","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.590603475645371}],"view":{"weatherPanelX":0,"heliodonPanelY":314,"showStickyNotePanel":true,"dailyPvYieldPanelX":4,"weatherPanelY":0,"dailyLightSensorPanelY":525,"mapZoom":16,"showHeliodonPanel":true,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":-1204,"theme":"Default","autoRotate":false,"groundColor":"#16a5a5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":true,"mapWeatherStations":false,"dailyPvYieldPanelY":1,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":-1277,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[12.032136043105444,-19.275007353612423,7.568306918458618],"panCenter":[0,0,0],"orthographic":false,"enableRotate":true,"cameraZoom":41.01092091350052,"stickyNotePanelX":5,"stickyNotePanelY":2,"cameraPosition2D":[0,-0.00004000177797536253,39.99999999997981],"panCenter2D":[0,0,0],"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar trackers\\n\\nAs the sun moves across the sky, solar panels do not always face the sun. Solar trackers allow them to follow the sun like sunflowers to maximize their outputs. This model compares the outputs of solar panels driven by the horizontal single-axis tracker (HSAT), the vertical single-axis tracker (VSAT), and the altazimuth dual-axis trackers (AADAT), as well as that of a fixed solar panel. You can also animate the movement of the sun to see how the solar panels follow it."]}')},436:function(e){e.exports=JSON.parse('{"docid":"stLbuVGfE2K8DrmoYsFg9w","time":"02/04/2023 02:04 pm","timestamp":1675537455512,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":14.613120903558068,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.06554753263096413,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-7.418371930827338,"type":"Foundation","solarPowerTower":{},"lx":18.159918676696766,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":4,"roofId":"pNA4YvnHKpbgLLZoVdn8iH","ly":0.3,"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[6.699943397855505,5.67322456909281,0.1],"type":"Wall","rightRoofHeight":4,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.6999433978555056,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.6732245690928105,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.699943397855504,"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"cy":0.6732245690928105,"leftRoofHeight":4,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":4,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":4,"roofId":"pNA4YvnHKpbgLLZoVdn8iH","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"lx":10,"windows":[],"lz":4,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"pNA4YvnHKpbgLLZoVdn8iH","selected":false,"cy":0.6732245690928105,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4,"ly":0.3,"cx":-5.300056602144494,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"showLabel":false,"cx":0.6999433978555061,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-4.3267754309071895,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"pNA4YvnHKpbgLLZoVdn8iH","leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"ly":0.3,"lz":4,"leftRoofHeight":4,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4,"lx":12,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,6],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,6],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Foundation","cx":-18.384386246268818,"cy":-7.395598164511793,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"pNA4YvnHKpbgLLZoVdn8iH","leftRidgeLength":6,"rightRidgeLength":6,"rise":2,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2,"ceiling":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["1k67G1W1gvb3E7EbmbG1h1"],"rightJoints":["uytQSeUom5oDsFC3PKa7q8"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u1AdedeCmmKa3QYfwjJ4ya","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["tKvexMf8zrvPgydcZb5VYA"],"rightJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1k67G1W1gvb3E7EbmbG1h1","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"rightJoints":["tKvexMf8zrvPgydcZb5VYA"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uytQSeUom5oDsFC3PKa7q8","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["uytQSeUom5oDsFC3PKa7q8"],"rightJoints":["1k67G1W1gvb3E7EbmbG1h1"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tKvexMf8zrvPgydcZb5VYA","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Foundation","cx":18.191904297849153,"cy":-7.416985047669567,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["tKvexMf8zrvPgydcZb5VYA"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"45NB7k7GYboywbxoXsYHLH","leftRidgeLength":3,"rightRidgeLength":3,"rise":2,"ceiling":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":5,"leftJoints":["xyaukKZz7A3TN7punm6ojQ"],"rightJoints":["t8gz6AKc17wrcW6oGcJkRc"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tjjt6SvCacxyrjW8mL7Kcd","parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","roofId":"hajPbexieJRPqTV4EDojfw","leftRoofHeight":5,"rightRoofHeight":5,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":5,"leftJoints":["eyn92Pbtw4rxGsusMErN7b"],"rightJoints":["tjjt6SvCacxyrjW8mL7Kcd"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xyaukKZz7A3TN7punm6ojQ","parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","roofId":"hajPbexieJRPqTV4EDojfw","leftRoofHeight":5,"rightRoofHeight":5,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":5,"leftJoints":["tjjt6SvCacxyrjW8mL7Kcd"],"rightJoints":["eyn92Pbtw4rxGsusMErN7b"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"t8gz6AKc17wrcW6oGcJkRc","parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","roofId":"hajPbexieJRPqTV4EDojfw","leftRoofHeight":5,"rightRoofHeight":5,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":5,"leftJoints":["t8gz6AKc17wrcW6oGcJkRc"],"rightJoints":["xyaukKZz7A3TN7punm6ojQ"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eyn92Pbtw4rxGsusMErN7b","parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","roofId":"hajPbexieJRPqTV4EDojfw","leftRoofHeight":5,"rightRoofHeight":5,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Foundation","cx":-18.349437375856816,"cy":7.358577960859719,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fWm5hggYktD39sKer9AZNn","selected":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["7pDL5vuaWkaSp6xPdGtoFv"],"rightJoints":["jRzTPUopsCw4wfe1XwNMiY"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ak7Cpd4phQ5SWBAYKo1UCe","parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","roofId":"jKe65v2XQs93jh4Da9kMiu","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["f2RfmPbQBbQQB9B9qxgaGp"],"rightJoints":["ak7Cpd4phQ5SWBAYKo1UCe"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7pDL5vuaWkaSp6xPdGtoFv","parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","roofId":"jKe65v2XQs93jh4Da9kMiu","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["ak7Cpd4phQ5SWBAYKo1UCe"],"rightJoints":["f2RfmPbQBbQQB9B9qxgaGp"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jRzTPUopsCw4wfe1XwNMiY","parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","roofId":"jKe65v2XQs93jh4Da9kMiu","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["jRzTPUopsCw4wfe1XwNMiY"],"rightJoints":["7pDL5vuaWkaSp6xPdGtoFv"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"f2RfmPbQBbQQB9B9qxgaGp","parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","roofId":"jKe65v2XQs93jh4Da9kMiu","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Foundation","cx":18.357286683609985,"cy":7.35579151072247,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"w5VAS3XZUgKoYjMsuPJ9cq","selected":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":3,"leftJoints":["3nk4fctTxNug3tQ2458FKw"],"rightJoints":["dc91yXxYZexfAFXVg2fpn6"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pwXdeCrfH255xyNxeKZFmq","parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","roofId":"ptuJ1uXn6Mmb8yfPchYi2c","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3,"leftJoints":["m39f5UsRB2FwBXUr7e5PvG"],"rightJoints":["pwXdeCrfH255xyNxeKZFmq"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3nk4fctTxNug3tQ2458FKw","parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","roofId":"ptuJ1uXn6Mmb8yfPchYi2c","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,6.780964087966274],"selected":false,"centerLeftRoofHeight":[-0.35,4.890482043983138],"centerRightRoofHeight":[0.35,4.890482043983138],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3,"leftJoints":["pwXdeCrfH255xyNxeKZFmq"],"rightJoints":["m39f5UsRB2FwBXUr7e5PvG"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dc91yXxYZexfAFXVg2fpn6","parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","roofId":"ptuJ1uXn6Mmb8yfPchYi2c","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,6.780964087966274],"selected":false,"centerLeftRoofHeight":[-0.35,4.890482043983138],"centerRightRoofHeight":[0.35,4.890482043983138],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3,"leftJoints":["dc91yXxYZexfAFXVg2fpn6"],"rightJoints":["3nk4fctTxNug3tQ2458FKw"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"m39f5UsRB2FwBXUr7e5PvG","parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","roofId":"ptuJ1uXn6Mmb8yfPchYi2c","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Foundation","cx":-0.2822234132630961,"cy":-22.249672711420477,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"d6fjBvqj48Q3knutrPvQzj","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","wallsId":["xyaukKZz7A3TN7punm6ojQ","tjjt6SvCacxyrjW8mL7Kcd","t8gz6AKc17wrcW6oGcJkRc","eyn92Pbtw4rxGsusMErN7b"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fWm5hggYktD39sKer9AZNn","foundationId":"fWm5hggYktD39sKer9AZNn","id":"hajPbexieJRPqTV4EDojfw","rise":0,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","wallsId":["f2RfmPbQBbQQB9B9qxgaGp","7pDL5vuaWkaSp6xPdGtoFv","ak7Cpd4phQ5SWBAYKo1UCe","jRzTPUopsCw4wfe1XwNMiY"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"w5VAS3XZUgKoYjMsuPJ9cq","foundationId":"w5VAS3XZUgKoYjMsuPJ9cq","id":"jKe65v2XQs93jh4Da9kMiu","rise":3.592861140197524,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gambrel","wallsId":["m39f5UsRB2FwBXUr7e5PvG"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"d6fjBvqj48Q3knutrPvQzj","foundationId":"d6fjBvqj48Q3knutrPvQzj","id":"ptuJ1uXn6Mmb8yfPchYi2c","rise":3.7809640879662743,"ceiling":false,"frontRidgePoint":[0.35,0.5],"backRidgePoint":[0.35,0.5],"topRidgePoint":[0,1]},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":3,"leftJoints":["ixC5APwNiRHyp3q8fcpSip"],"rightJoints":["8hSDdsDC58WwCVch1EWVeh"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ozFwLmFwWhU6vEeaiRMgLF","parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","roofId":"nUUEKM9A4b42WTe8cCbmi9","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3,"leftJoints":["qjuHirmyC29jd4cf1J7Ub1"],"rightJoints":["ozFwLmFwWhU6vEeaiRMgLF"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ixC5APwNiRHyp3q8fcpSip","parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","roofId":"nUUEKM9A4b42WTe8cCbmi9","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3,"leftJoints":["ozFwLmFwWhU6vEeaiRMgLF"],"rightJoints":["qjuHirmyC29jd4cf1J7Ub1"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8hSDdsDC58WwCVch1EWVeh","parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","roofId":"nUUEKM9A4b42WTe8cCbmi9","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3,"leftJoints":["8hSDdsDC58WwCVch1EWVeh"],"rightJoints":["ixC5APwNiRHyp3q8fcpSip"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qjuHirmyC29jd4cf1J7Ub1","parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","roofId":"nUUEKM9A4b42WTe8cCbmi9","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Foundation","cx":18.14821865757634,"cy":-22.28587145270979,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"upLMjkz3yhg33F3y5iosoh","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","wallsId":["qjuHirmyC29jd4cf1J7Ub1"],"textureType":"Roof Texture Default","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"upLMjkz3yhg33F3y5iosoh","foundationId":"upLMjkz3yhg33F3y5iosoh","id":"nUUEKM9A4b42WTe8cCbmi9","rise":2.4252724498654796,"ceiling":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":3,"leftJoints":["igxQHaerDScxsfB5TgVZU4"],"rightJoints":["fisK6kExsrNY6Pqi3iQHme"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3gfx2QQjNJN8MdstGfbwGN","parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofId":"ue2dCEQjJdM2ogHcYaDLus","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3,"leftJoints":["ayZDPKzE28H2j3EL6h6FST"],"rightJoints":["3gfx2QQjNJN8MdstGfbwGN"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"igxQHaerDScxsfB5TgVZU4","parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofId":"ue2dCEQjJdM2ogHcYaDLus","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0.15368124011044487,5.976337025346289],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3,"leftJoints":["3gfx2QQjNJN8MdstGfbwGN"],"rightJoints":["ayZDPKzE28H2j3EL6h6FST"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fisK6kExsrNY6Pqi3iQHme","parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofId":"ue2dCEQjJdM2ogHcYaDLus","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[-0.15368124011044487,5.976337025346289],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3,"leftJoints":["fisK6kExsrNY6Pqi3iQHme"],"rightJoints":["igxQHaerDScxsfB5TgVZU4"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ayZDPKzE28H2j3EL6h6FST","parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofId":"ue2dCEQjJdM2ogHcYaDLus","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"id":"ue2dCEQjJdM2ogHcYaDLus","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8FvPN2owsgTQ83kbYPEi1w","foundationId":"8FvPN2owsgTQ83kbYPEi1w","roofType":"Gable","textureType":"Roof Texture Default","thickness":0.2,"wallsId":["ayZDPKzE28H2j3EL6h6FST"],"ridgeLeftPoint":[-0.15368124011044487,1],"ridgeRightPoint":[0.15368124011044487,1],"selected":false,"rise":2.9763370253462886,"ceiling":false},{"type":"Foundation","cx":-18.3917853849947,"cy":-22.23021238337839,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"8FvPN2owsgTQ83kbYPEi1w","selected":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":5.846129172584467,"leftJoints":["7uVMbtndXyFhLg9N8igxZL"],"rightJoints":["satrCacXQzxtUPDa8WeKn7"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uNqL4MKdnpapHVSi9J1K8T","parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofId":"iNBeHL8TpJ75nDzdH6Ar6c","leftRoofHeight":5.846129172584467,"rightRoofHeight":5.846129172584467,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.846129172584467,"rightTopPartialHeight":5.846129172584467},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":3,"leftJoints":["5u61LU9xBr7HzdGUCwG4J6"],"rightJoints":["uNqL4MKdnpapHVSi9J1K8T"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7uVMbtndXyFhLg9N8igxZL","parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofId":"iNBeHL8TpJ75nDzdH6Ar6c","leftRoofHeight":3,"rightRoofHeight":5.846129172584467,"centerRoofHeight":[0.5,5.846129172584467],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":3,"leftJoints":["uNqL4MKdnpapHVSi9J1K8T"],"rightJoints":["5u61LU9xBr7HzdGUCwG4J6"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"satrCacXQzxtUPDa8WeKn7","parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofId":"iNBeHL8TpJ75nDzdH6Ar6c","leftRoofHeight":5.846129172584467,"rightRoofHeight":3,"centerRoofHeight":[-0.5,5.846129172584467],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":3,"leftJoints":["satrCacXQzxtUPDa8WeKn7"],"rightJoints":["7uVMbtndXyFhLg9N8igxZL"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5u61LU9xBr7HzdGUCwG4J6","parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofId":"iNBeHL8TpJ75nDzdH6Ar6c","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"id":"iNBeHL8TpJ75nDzdH6Ar6c","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"parentId":"e6BPbJvDHWVEFn61HvpPWK","foundationId":"e6BPbJvDHWVEFn61HvpPWK","roofType":"Gable","textureType":"Roof Texture Default","thickness":0.2,"wallsId":["5u61LU9xBr7HzdGUCwG4J6"],"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":0.04736842105263009,"cy":7.4416382171024535,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"e6BPbJvDHWVEFn61HvpPWK","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.052631578947368425,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.052631578947368425,-0.000020000888987681265,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-28.363486288062674,-49.79716924665453,24.823194309796552],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":15.47561875,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-6.81693136261614,-15.495725419499871,0],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},437:function(e){e.exports=JSON.parse('{"docid":"9gaZVfxNNTHLmXcZPRJRXw","time":"09/23/2023 09:34 AM","timestamp":1695476069953,"userid":null,"owner":null,"email":null,"world":{"latitude":42.52092349999999,"address":"Leominster State Forest, Leominster, MA 01420, USA","name":"default","airAttenuationCoefficient":0.01,"ground":{"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3},"dustLoss":0.05,"cspGridCellSize":0.5,"cspDaysPerYear":4,"discretization":"Approximate","daysPerYear":12,"cspTimesPerHour":4,"pvGridCellSize":0.5,"timesPerHour":1,"noAnimationForHeatmapSimulation":false,"date":"6/22/2022, 10:00:00 AM","solarRadiationHeatmapGridCellSize":0.25,"solarPanelVisibilityGridCellSize":0.2,"noAnimationForSensorDataCollection":false,"longitude":-71.8384068,"noAnimationForSolarPanelSimulation":false},"elements":[{"parentId":"Ground","selected":false,"cy":0.8212100903152009,"id":"m7AH7DcnoGzAq9kryBy4RS","type":"Foundation","ly":10.473983232081025,"cx":-0.22738864151314608,"lz":0.07401736805849783,"hvacSystem":{"temperatureThreshold":3,"thermostatSetpoint":20,"id":"A"},"locked":true,"rotation":[0,0,0],"cz":0.05,"enableGroupMaster":true,"solarAbsorberPipe":{},"solarUpdraftTower":{},"lx":13.564552414056891,"solarPowerTower":{},"normal":[0,0,1]},{"fill":"Full","structureColor":"white","type":"Wall","rightPoint":[-5.457020109151015,3.478026472724187,0.1],"cx":0.5429798908489842,"opacity":0,"locked":true,"showLabel":false,"relativeAngle":3.141592653589793,"lz":3.700868402924892,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":3.478026472724187,"ly":0.3,"leftTopPartialHeight":3.700868402924892,"leftPoint":[6.542979890848985,3.478026472724187,0.1],"lx":12,"leftUnfilledHeight":0.5,"textureType":"Wall Texture Default","cz":0,"color":"white","normal":[0,0,1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"eavesLength":0.2,"parentId":"m7AH7DcnoGzAq9kryBy4RS","parapet":{"parapetHeight":1,"display":false,"copingsWidth":0.5,"color":"white","textureType":"No Wall Texture","copingsHeight":0.1},"rightUnfilledHeight":0.5,"windows":[],"rightTopPartialHeight":3.700868402924892,"structureSpacing":2,"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"selected":false,"leftRoofHeight":3.700868402924892,"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","roofId":"nbw17kYeUHp1aouuScuF3Y","wallStructure":"Default","structureWidth":0.1,"rightRoofHeight":3.700868402924892},{"rightPoint":[6.542979890848985,3.478026472724187,0.1],"structureSpacing":2,"relativeAngle":1.5707963267948966,"wallStructure":"Default","cz":1.2992388529678256,"opacity":0.5,"textureType":"Wall Texture Default","eavesLength":0.2,"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","locked":true,"selected":false,"leftRoofHeight":3.700868402924892,"ly":0.3,"parapet":{"copingsHeight":0.1,"textureType":"No Wall Texture","copingsWidth":0.5,"color":"white","parapetHeight":1,"display":false},"windows":[],"cx":6.542979890848985,"color":"white","structureColor":"white","showLabel":false,"rightRoofHeight":3.7008684029248915,"structureWidth":0.1,"leftTopPartialHeight":3.700868402924892,"parentId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"rotation":[0,0,0],"fill":"Full","rightTopPartialHeight":3.700868402924892,"centerRoofHeight":[-0.022465454047944533,5.827600046994059],"lx":7.5,"lz":3.700868402924892,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"id":"8XDG3EHsQoX26MhuzwMYUM","leftPoint":[6.542979890848985,-4.021973527275812,0.1],"cy":-0.27197352727581237,"type":"Wall","roofId":"nbw17kYeUHp1aouuScuF3Y"},{"parentId":"m7AH7DcnoGzAq9kryBy4RS","locked":true,"cy":-0.27197352727581237,"rightTopPartialHeight":3.700868402924892,"id":"skm8dNPSkFaVkoUwiPNfq1","centerRoofHeight":[0.022465454047944533,5.827600046994059],"rightPoint":[-5.457020109151015,-4.021973527275812,0.1],"roofId":"nbw17kYeUHp1aouuScuF3Y","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"wallStructure":"Default","rotation":[0,0,0],"showLabel":false,"cz":2.586710917765224,"structureColor":"white","structureSpacing":2,"selected":false,"leftRoofHeight":3.700868402924892,"eavesLength":0.2,"opacity":0.5,"color":"white","rightRoofHeight":3.7008684029248915,"leftTopPartialHeight":3.700868402924892,"textureType":"Wall Texture Default","cx":-5.457020109151015,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"type":"Wall","parapet":{"copingsHeight":0.1,"textureType":"No Wall Texture","display":false,"color":"white","parapetHeight":1,"copingsWidth":0.5},"lz":3.700868402924892,"lx":7.5,"relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.457020109151015,3.478026472724187,0.1],"structureWidth":0.1,"windows":[],"normal":[0,0,1],"fill":"Full","ly":0.3},{"selected":false,"textureType":"Wall Texture Default","cx":0.5429798908489842,"parapet":{"copingsHeight":0.1,"parapetHeight":1,"copingsWidth":0.5,"color":"white","textureType":"No Wall Texture","display":false},"rotation":[0,0,0],"locked":true,"showLabel":false,"rightTopPartialHeight":3.700868402924892,"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"eavesLength":0.2,"windows":[],"normal":[0,0,1],"structureColor":"white","roofId":"nbw17kYeUHp1aouuScuF3Y","parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cV8MyCuhWAsvEyyFuVqVqg","leftPoint":[-5.457020109151015,-4.021973527275812,0.1],"leftUnfilledHeight":0.5,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":-4.021973527275812,"structureSpacing":2,"structureWidth":0.1,"lx":12,"relativeAngle":0,"color":"white","wallStructure":"Default","rightRoofHeight":3.700868402924892,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.700868402924892,"type":"Wall","fill":"Full","lz":3.700868402924892,"opacity":0,"leftRoofHeight":3.700868402924892,"ly":0.3,"rightPoint":[6.542979890848985,-4.021973527275812,0.1],"cz":2.4938633836176103,"leftJoints":["skm8dNPSkFaVkoUwiPNfq1"]},{"ly":8.209748806830484,"normal":[0,0,1],"cy":-1.588798589487019,"hvacSystem":{"id":"A","temperatureThreshold":3,"thermostatSetpoint":20},"selected":false,"id":"8fpWrU7qVyVgipB7LtABom","solarPowerTower":{},"solarAbsorberPipe":{},"lz":0.07401736805849783,"cx":0.3444310502028619,"type":"Foundation","lx":9.082946486026735,"solarUpdraftTower":{},"rotation":[0,0,0],"cz":0.05,"locked":true,"parentId":"Ground"},{"structureWidth":0.1,"leftRoofHeight":5.712225310760859,"rightPoint":[-3.263274891520475,1.612200631492839,0],"roofId":"bMyAZV3jeEtHec1SxNb6X8","type":"Wall","fill":"Empty","leftTopPartialHeight":5.234219703671004,"leftUnfilledHeight":4.805475873448939,"cx":-0.034941558187143285,"leftPoint":[3.193391775146188,1.612200631492839,0],"structureSpacing":2,"rightRoofHeight":5.712225310760859,"locked":true,"lz":5.234219703671004,"rotation":[0,0,0],"leftJoints":["4Q8KDQDxyuamkEtRJU3paR"],"rightUnfilledHeight":4.805475873448939,"wallStructure":"Default","windows":[],"parapet":{"textureType":"No Wall Texture","display":false,"copingsHeight":0.1,"parapetHeight":1,"color":"white","copingsWidth":0.5},"opacity":0.5,"textureType":"Wall Texture Default","ly":0.3,"id":"bKLMq3WjuxRcsMDb5d4Xo1","cy":1.612200631492839,"lx":6.4566666666666634,"normal":[0,0,1],"color":"white","parentId":"8fpWrU7qVyVgipB7LtABom","relativeAngle":3.141592653589793,"foundationId":"8fpWrU7qVyVgipB7LtABom","showLabel":false,"rightTopPartialHeight":5.234219703671004,"structureColor":"white","selected":false,"cz":3.903941909848086,"eavesLength":0,"rightJoints":["1ATAe6P2KAHKLDSDfpVro9"]},{"color":"white","rightPoint":[3.1933917751461904,1.612200631492839,0],"parentId":"8fpWrU7qVyVgipB7LtABom","opacity":0.5,"rightRoofHeight":5.712225310760859,"structureColor":"white","roofId":"bMyAZV3jeEtHec1SxNb6X8","parapet":{"parapetHeight":1,"textureType":"No Wall Texture","copingsWidth":0.5,"color":"white","copingsHeight":0.1,"display":false},"showLabel":false,"cx":3.193391775146189,"eavesLength":0.1,"id":"4Q8KDQDxyuamkEtRJU3paR","type":"Wall","textureType":"Wall Texture Default","centerRoofHeight":[0.5,5.712225310760859],"leftJoints":["7xigJB2WiCCrREDc2Ja3YN"],"lz":6.136322990957498,"rightJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"cz":3.068161495478749,"leftTopPartialHeight":5.234219703671004,"structureWidth":0.1,"rotation":[0,0,0],"ly":0.3,"locked":false,"leftRoofHeight":5.234219703671004,"structureSpacing":2,"foundationId":"8fpWrU7qVyVgipB7LtABom","windows":[],"rightTopPartialHeight":5.760851132763845,"leftUnfilledHeight":3.5697809504114297,"leftPoint":[3.193391775146188,-1.1632293875304307,0],"selected":false,"wallStructure":"Default","lx":2.7754300190232697,"normal":[0,0,1],"relativeAngle":1.570796326794896,"fill":"Partial","rightUnfilledHeight":5.234219703671004,"cy":0.22448562198120414},{"rightTopPartialHeight":5.234219703671004,"id":"1ATAe6P2KAHKLDSDfpVro9","parentId":"8fpWrU7qVyVgipB7LtABom","leftJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"showLabel":false,"locked":false,"cy":0.22448562198120414,"normal":[0,0,1],"leftRoofHeight":5.712225310760859,"centerRoofHeight":[-0.5,5.712225310760859],"lz":6.232580143918559,"leftTopPartialHeight":5.822758282488435,"leftPoint":[-3.263274891520475,1.612200631492839,0],"opacity":0.5,"rightUnfilledHeight":3.5697809504114297,"rotation":[0,0,0],"rightRoofHeight":5.234219703671004,"structureSpacing":2,"lx":2.7754300190232697,"structureColor":"white","rightJoints":["7xigJB2WiCCrREDc2Ja3YN"],"foundationId":"8fpWrU7qVyVgipB7LtABom","eavesLength":0.1,"rightPoint":[-3.263274891520475,-1.1632293875304307,0],"wallStructure":"Default","ly":0.3,"parapet":{"display":false,"copingsHeight":0.1,"parapetHeight":1,"copingsWidth":0.5,"textureType":"No Wall Texture","color":"white"},"type":"Wall","structureWidth":0.1,"roofId":"bMyAZV3jeEtHec1SxNb6X8","fill":"Partial","color":"white","cz":3.1162900719592797,"leftUnfilledHeight":5.234219703671004,"relativeAngle":-1.5707963267948966,"selected":false,"windows":[],"cx":-3.263274891520475,"textureType":"Wall Texture Default"},{"locked":true,"ceiling":false,"cz":0,"rotation":[0,0,0],"textureType":"Roof Texture Default","rise":2.126731644069167,"selected":false,"normal":[0,0,1],"color":"#666666","ly":0,"showLabel":false,"lz":0,"cx":0,"roofType":"Gable","ridgeRightPoint":[-0.022465454047944533,1],"cy":0,"type":"Roof","lx":0,"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nbw17kYeUHp1aouuScuF3Y","ridgeLeftPoint":[0.022465454047944533,1],"wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"thickness":0.2,"foundationId":"m7AH7DcnoGzAq9kryBy4RS"},{"leftTopPartialHeight":5.234219703671004,"showLabel":false,"windows":[],"roofId":"bMyAZV3jeEtHec1SxNb6X8","opacity":0.5,"parentId":"8fpWrU7qVyVgipB7LtABom","rightJoints":["4Q8KDQDxyuamkEtRJU3paR"],"structureWidth":0.1,"selected":false,"locked":true,"leftUnfilledHeight":3.5697809504114297,"color":"white","ly":0.3,"normal":[0,0,1],"structureColor":"white","id":"7xigJB2WiCCrREDc2Ja3YN","rightRoofHeight":5.234219703671004,"rightPoint":[3.193391775146188,-1.1632293875304307,0],"lz":5.234219703671004,"cx":-0.034941558187143285,"lx":6.4566666666666634,"leftJoints":["1ATAe6P2KAHKLDSDfpVro9"],"cy":-1.1632293875304307,"leftRoofHeight":5.234219703671004,"leftPoint":[-3.263274891520475,-1.1632293875304307,0],"wallStructure":"Default","fill":"Partial","foundationId":"8fpWrU7qVyVgipB7LtABom","parapet":{"parapetHeight":1,"display":false,"color":"white","copingsHeight":0.1,"textureType":"No Wall Texture","copingsWidth":0.5},"rightTopPartialHeight":5.234219703671004,"textureType":"Wall Texture Default","eavesLength":0.4,"rightUnfilledHeight":3.5697809504114297,"relativeAngle":0,"rotation":[0,0,0],"cz":3.535805069111796,"type":"Wall","structureSpacing":2},{"color":"#666666","showLabel":false,"locked":true,"ridgeLeftPoint":[-0.5,1],"id":"bMyAZV3jeEtHec1SxNb6X8","thickness":0.1,"roofType":"Gable","cy":0,"ceiling":false,"textureType":"Roof Texture Default","foundationId":"8fpWrU7qVyVgipB7LtABom","ly":0,"lx":0,"rotation":[0,0,0],"cx":0,"normal":[0,0,1],"parentId":"8fpWrU7qVyVgipB7LtABom","rise":0.4780056070898553,"lz":0,"selected":false,"ridgeRightPoint":[0.5,1],"type":"Roof","wallsId":["7xigJB2WiCCrREDc2Ja3YN"],"cz":0},{"color":"#ffffff","frameWidth":0.05,"normal":[0,0,1],"id":"kT8BzEWny2ZAvkGr4E4KEf","showLabel":false,"mullionSpacing":0.5,"locked":true,"rotation":[0,0,0],"mullionColor":"white","cz":0.4037254895427074,"type":"Window","mullion":true,"windowType":"Default","cy":0.1,"selected":false,"tint":"#73D8FF","mullionWidth":0.06,"ly":0.3,"lz":0.14780124246219536,"frame":true,"opacity":0.5,"shutter":{"color":"#4d4d4d","width":0.3,"showRight":true,"showLeft":true},"lx":0.15384615384615385,"archHeight":1,"parentId":"7xigJB2WiCCrREDc2Ja3YN","cx":-0.23283427981414576,"foundationId":"8fpWrU7qVyVgipB7LtABom"},{"opacity":0.5,"mullionSpacing":0.5,"rotation":[0,0,0],"windowType":"Default","frameWidth":0.05,"foundationId":"8fpWrU7qVyVgipB7LtABom","mullion":true,"ly":0.3,"mullionColor":"white","color":"#ffffff","tint":"#73D8FF","cy":0.1,"cz":0.4037254895427074,"locked":true,"parentId":"7xigJB2WiCCrREDc2Ja3YN","id":"7u1AuHohJXNKKJPafwNUFQ","lz":0.14780124246219536,"archHeight":1,"frame":true,"normal":[0,0,1],"cx":0.23180175529168826,"mullionWidth":0.06,"lx":0.15384615384615385,"type":"Window","selected":false,"shutter":{"width":0.3,"showLeft":true,"color":"#4d4d4d","showRight":true}},{"id":"3KgcTmNBqtYJcCny8HxQyQ","selected":false,"locked":true,"type":"Foundation","cx":6.813410596867628,"solarPowerTower":{},"normal":[0,0,1],"solarUpdraftTower":{},"lx":3.6868215598526417,"cz":0.05,"solarAbsorberPipe":{},"parentId":"Ground","cy":0.16141466329287235,"notBuilding":true,"rotation":[0,0,0],"lz":0.07401736805849783,"ly":2.3229214459557985},{"eavesLength":0.3,"opacity":0.5,"parapet":{"display":false,"copingsHeight":0.1,"textureType":"No Wall Texture","copingsWidth":0.5,"parapetHeight":1,"color":"white"},"leftTopPartialHeight":6.661563125264805,"windows":[],"selected":false,"leftPoint":[0.9885216091721372,0.8698262658360515,0.1],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","fill":"Full","cz":0,"normal":[0,0,1],"ly":0.2,"rightJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"rightUnfilledHeight":0.5,"rotation":[0,0,0],"wallStructure":"Default","rightTopPartialHeight":6.661563125264805,"showLabel":false,"leftJoints":["h8DQWwUSgNc283RWhcM3B1"],"cx":0.23852160917213716,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","rightPoint":[-0.5114783908278628,0.8698262658360515,0.1],"leftUnfilledHeight":0.5,"lx":1.5,"locked":true,"id":"5eUwuiBwfGoNEpcHG5kHqK","structureSpacing":2,"cy":0.8698262658360515,"relativeAngle":3.141592653589793,"type":"Wall","structureColor":"white","lz":6.661563125264805,"textureType":"Wall Texture #3","structureWidth":0.1},{"normal":[0,0,1],"type":"Wall","rightJoints":["qQNV4qND1aDjEtJsd6HVio"],"opacity":0.5,"eavesLength":0.3,"textureType":"Wall Texture #3","leftPoint":[-0.5114783908278628,0.8698262658360516,0],"rightUnfilledHeight":1.5096768753682475,"cy":0.11982626583605155,"rotation":[0,0,0],"lx":1.5,"id":"hbU2xUbmKEDDXYDMWnjjCc","lz":6.661563125264805,"rightTopPartialHeight":6.661563125264805,"windows":[],"relativeAngle":4.71238898038469,"structureSpacing":2,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","selected":false,"cx":-0.5114783908278628,"rightPoint":[-0.5114783908278628,-0.6301737341639485,0],"locked":true,"showLabel":false,"structureColor":"white","parentId":"3KgcTmNBqtYJcCny8HxQyQ","structureWidth":0.1,"fill":"Partial","ly":0.2,"leftUnfilledHeight":1.5096768753682475,"wallStructure":"Default","leftTopPartialHeight":6.661563125264805,"cz":0,"parapet":{"copingsHeight":0.1,"copingsWidth":0.5,"parapetHeight":1,"textureType":"No Wall Texture","display":false,"color":"white"},"leftJoints":["5eUwuiBwfGoNEpcHG5kHqK"]},{"cz":0,"lz":6.661563125264805,"rotation":[0,0,0],"textureType":"Wall Texture #3","cy":-0.6301737341639485,"rightPoint":[0.9885216091721372,-0.6301737341639485,0.1],"normal":[0,0,1],"structureSpacing":2,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","selected":false,"leftUnfilledHeight":0.5,"leftTopPartialHeight":6.661563125264805,"leftJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"copingsWidth":0.5,"textureType":"No Wall Texture"},"cx":0.23852160917213716,"structureWidth":0.1,"type":"Wall","rightJoints":["h8DQWwUSgNc283RWhcM3B1"],"leftPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"rightTopPartialHeight":6.661563125264805,"windows":[],"relativeAngle":0,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","lx":1.5,"ly":0.2,"structureColor":"white","fill":"Full","id":"qQNV4qND1aDjEtJsd6HVio","opacity":0.5,"rightUnfilledHeight":0.5,"showLabel":false,"eavesLength":0.3,"wallStructure":"Default","locked":true},{"id":"h8DQWwUSgNc283RWhcM3B1","textureType":"Wall Texture #3","rotation":[0,0,0],"opacity":0.5,"ly":0.2,"selected":false,"lz":6.661563125264805,"leftJoints":["qQNV4qND1aDjEtJsd6HVio"],"cy":0.1198262658360515,"fill":"Full","parapet":{"display":false,"copingsWidth":0.5,"parapetHeight":1,"textureType":"No Wall Texture","color":"white","copingsHeight":0.1},"relativeAngle":1.5707963267948966,"locked":true,"cx":0.9885216091721372,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","structureWidth":0.1,"rightTopPartialHeight":6.661563125264805,"rightUnfilledHeight":0.5,"rightJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"lx":1.5,"type":"Wall","cz":0,"leftTopPartialHeight":6.661563125264805,"eavesLength":0.3,"windows":[],"leftPoint":[0.9885216091721372,-0.6301737341639485,0.1],"leftUnfilledHeight":0.5,"wallStructure":"Default","structureColor":"white","showLabel":false,"structureSpacing":2,"rightPoint":[0.9885216091721372,0.8698262658360515,0.1],"normal":[0,0,1]},{"mullionColor":"white","windowType":"Default","cy":0,"cz":0,"frame":true,"ly":0.3,"cx":-0.375,"locked":true,"id":"wpUTVyngSAjDJDRdEV1NA6","shutter":{"color":"#4d4d4d","showRight":true,"width":0.25,"showLeft":true},"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","frameWidth":0.05,"type":"Window","tint":"#73D8FF","mullionSpacing":0.7,"mullion":true,"color":"#ffffff","archHeight":1,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","lz":0.44384979425833565,"lx":0.08333333333333333,"selected":false,"mullionWidth":0.06,"rotation":[0,0,0],"normal":[0,0,1],"opacity":0.5},{"locked":true,"archHeight":1,"cx":-0.20833333333333334,"lx":0.08333333333333333,"cy":0.1,"cz":-0.005759415706553773,"mullionColor":"white","mullionSpacing":0.7,"shutter":{"showRight":true,"color":"#4d4d4d","showLeft":true,"width":0.25},"frameWidth":0.05,"mullionWidth":0.06,"lz":0.44384979425833565,"mullion":true,"opacity":0.5,"color":"#ffffff","parentId":"cV8MyCuhWAsvEyyFuVqVqg","normal":[0,0,1],"type":"Window","frame":true,"tint":"#73D8FF","windowType":"Default","rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","ly":0.3,"id":"5ncRWHnRQyocXJujBx5jNE","selected":false},{"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","ly":0.3,"mullionSpacing":0.7,"windowType":"Default","mullionWidth":0.06,"mullionColor":"white","id":"piUU3YZv2L1Zvedb6EFfFm","lz":0.44384979425833565,"rotation":[0,0,0],"selected":false,"locked":true,"mullion":true,"cx":0.19999999999999998,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"archHeight":1,"type":"Window","frame":true,"shutter":{"width":0.25,"color":"#4d4d4d","showLeft":true,"showRight":true},"cz":-0.005759415706553773,"color":"#ffffff","normal":[0,0,1],"frameWidth":0.05,"tint":"#73D8FF","opacity":0.5},{"cx":0.37499999999999994,"lx":0.08333333333333333,"shutter":{"width":0.25,"showLeft":true,"showRight":true,"color":"#4d4d4d"},"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"mullionWidth":0.06,"mullionSpacing":0.7,"normal":[0,0,1],"lz":0.44384979425833565,"ly":0.3,"selected":false,"frameWidth":0.05,"opacity":0.5,"mullion":true,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","id":"upiLr8uqx55GDieKSLsjPj","frame":true,"cy":0,"cz":0,"archHeight":1,"type":"Window","color":"#ffffff","locked":true,"mullionColor":"white","tint":"#73D8FF","windowType":"Default"},{"mullionSpacing":0.7,"tint":"#73D8FF","type":"Window","id":"d9R7TXr9G1aG6bGwu14v9k","frameWidth":0.05,"lx":0.13333333333333333,"cx":0.3466666666666667,"windowType":"Default","mullion":true,"mullionColor":"white","archHeight":1,"cy":0,"normal":[0,0,1],"ly":0.3,"locked":true,"rotation":[0,0,0],"lz":0.3942112571821837,"selected":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","parentId":"skm8dNPSkFaVkoUwiPNfq1","mullionWidth":0.06,"frame":true,"opacity":0.5,"cz":-0.05913168857732756,"showLabel":false,"shutter":{"showRight":true,"color":"#4d4d4d","showLeft":true,"width":0.25},"color":"#ffffff"},{"tint":"#73D8FF","mullion":true,"normal":[0,0,1],"opacity":0.5,"lz":0.3942112571821837,"selected":false,"shutter":{"showLeft":true,"width":0.25,"color":"#4d4d4d","showRight":true},"cz":0.5913168857732756,"type":"Window","mullionWidth":0.06,"mullionSpacing":0.7,"mullionColor":"white","windowType":"Default","ly":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","frame":true,"parentId":"skm8dNPSkFaVkoUwiPNfq1","frameWidth":0.05,"locked":true,"id":"9k4wgdGyyHM5BC1r2nJbQH","archHeight":1,"rotation":[0,0,0],"color":"#ffffff","cy":0,"cx":0,"lx":0.13333333333333333},{"mullionColor":"white","cx":0,"cz":-0.05913168857732756,"type":"Window","lx":0.13333333333333333,"rotation":[0,0,0],"windowType":"Default","color":"#ffffff","parentId":"skm8dNPSkFaVkoUwiPNfq1","ly":0.3,"shutter":{"showLeft":true,"showRight":true,"width":0.25,"color":"#4d4d4d"},"foundationId":"m7AH7DcnoGzAq9kryBy4RS","archHeight":1,"cy":0,"mullionSpacing":0.7,"lz":0.3942112571821837,"id":"rgPxjoaTPqdF2tQvSYYJxX","frameWidth":0.05,"selected":false,"tint":"#73D8FF","opacity":0.5,"locked":true,"frame":true,"mullionWidth":0.06,"normal":[0,0,1],"mullion":true},{"mullionColor":"white","cz":-0.05913168857732756,"normal":[0,0,1],"frame":true,"windowType":"Default","opacity":0.5,"ly":0.3,"mullionWidth":0.06,"cx":-0.3333333333333333,"color":"#ffffff","lz":0.3942112571821837,"lx":0.13333333333333333,"mullionSpacing":0.7,"cy":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","rotation":[0,0,0],"id":"85T9TwcUR7am6Rcbs7Fcvu","type":"Window","selected":false,"frameWidth":0.05,"locked":true,"mullion":true,"parentId":"skm8dNPSkFaVkoUwiPNfq1","archHeight":1,"shutter":{"width":0.25,"showRight":true,"color":"#4d4d4d","showLeft":true}},{"lx":0.544,"lz":1.68,"cz":0.03700868412852199,"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","type":"Human","cy":-3.5804269948570657,"ly":0.544,"locked":true,"normal":[0,1,0],"id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"cx":-0.09889479147539992,"name":"Judd"},{"locked":true,"lx":7.849178627898182,"cz":0,"id":"t5Aj8tjjpqVaLaB3uEqfR8","cy":-3.6653094140688935,"rotation":[0,0,0],"type":"Tree","normal":[0,1,0],"lz":8.26765132308192,"parentId":"Ground","selected":false,"cx":11.305837530144139,"name":"Magnolia"},{"parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","type":"Window","foundationId":"m7AH7DcnoGzAq9kryBy4RS","mullionSpacing":0.7,"archHeight":1,"selected":false,"lz":0.3942112571821837,"lx":0.13333333333333333,"windowType":"Default","rotation":[0,0,0],"shutter":{"width":0.25,"showRight":true,"showLeft":true,"color":"#4d4d4d"},"ly":0.3,"cz":-0.08,"locked":true,"cx":-0.25833333333333336,"frame":true,"color":"#ffffff","frameWidth":0.05,"mullionWidth":0.06,"id":"dGQYRX5aMuZKouydnVo1zc","mullionColor":"white","mullion":true,"normal":[0,0,1],"tint":"#73D8FF","cy":-1.3376344861350336e-15,"opacity":0.5},{"foundationId":"m7AH7DcnoGzAq9kryBy4RS","ly":0.3,"color":"#ffffff","mullion":true,"frame":true,"normal":[0,0,1],"mullionWidth":0.06,"rotation":[0,0,0],"type":"Window","selected":false,"lx":0.13333333333333333,"mullionColor":"white","tint":"#73D8FF","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","locked":true,"windowType":"Default","shutter":{"showRight":true,"showLeft":true,"width":0.25,"color":"#4d4d4d"},"frameWidth":0.05,"archHeight":1,"cx":0.26666666666666666,"cz":-0.08,"mullionSpacing":0.7,"opacity":0.5,"cy":-1.1010413489448665e-14,"id":"cni5XLCGZ7vNfLqxjgsnua","lz":0.3942112571821837},{"lx":0.10833333333333332,"color":"white","showLabel":false,"textureType":"Door Texture Default","lz":0.716165481422614,"normal":[0,1,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","filled":true,"type":"Door","locked":true,"doorType":"Default","ly":0,"selected":false,"archHeight":1,"cy":0,"cz":-0.14191725928869298,"rotation":[0,0,0],"opacity":1,"id":"j9wJCoWK33fz7y9VeMvYET","cx":0.004166666666666666},{"id":"hDyRWYv3zznENZxyb7giJb","parentId":"Ground","selected":false,"ly":0.43,"name":"Jess","cy":-3.1477838439296697,"rotation":[0,0,0],"type":"Human","locked":true,"cx":10.043178984637636,"cz":0,"lz":1.5,"normal":[0,1,0],"lx":0.43},{"lx":1,"id":"rQBZjpiN17FBa7zVGS29EM","name":"Hosta","locked":true,"parentId":"Ground","rotation":[0,0,0],"cx":-4.865498633056688,"cz":4.440892098500626e-16,"cy":-5.35511145051621,"type":"Flower","lz":0.7,"selected":false,"normal":[0,1,0]},{"cx":-5.913277609806336,"parentId":"Ground","rotation":[0,0,0],"normal":[0,1,0],"lz":0.7,"cy":-5.374330832155909,"type":"Flower","lx":1,"name":"Hosta","cz":0,"locked":true,"id":"gc42wB2NVDE3XxmJXbCjzF","selected":false},{"parentId":"Ground","selected":false,"normal":[0,1,0],"id":"vUf5PGrUMVgXbqYPHJhogg","cz":0,"type":"Flower","locked":true,"rotation":[0,0,0],"cy":-5.032667389054726,"name":"Hosta","cx":5.365516144068206,"lz":0.7,"lx":1},{"type":"Flower","cz":0,"lx":1,"selected":false,"normal":[0,1,0],"locked":true,"id":"nQJ3744KdWm46uETjWgCgh","name":"Hosta","cy":-5.0400985854852,"lz":0.7,"parentId":"Ground","rotation":[0,0,0],"cx":6.451426749352761},{"normal":[0,1,0],"lx":0.4,"name":"Bellflower","selected":false,"type":"Flower","cx":10.305907483983008,"lz":0.8,"locked":true,"cz":-4.440892098500626e-16,"rotation":[0,0,0],"parentId":"Ground","cy":-4.741244078804888,"id":"v55S46CRAfNBqtvC7SejWL"},{"type":"Flower","selected":false,"locked":true,"cz":0,"rotation":[0,0,0],"lz":0.8,"name":"Bellflower","cx":10.64587810641245,"normal":[0,1,0],"lx":0.4,"cy":-5.149011385356842,"parentId":"Ground","id":"cjq5zpMwEQ68Pvr3BHuvAN"},{"locked":true,"lx":0.4,"selected":false,"id":"bq7T5SUabm6WYJRf7MELsr","type":"Flower","parentId":"Ground","cz":0,"cy":-5.113715548843749,"name":"Bellflower","normal":[0,1,0],"lz":0.8,"rotation":[0,0,0],"cx":11.069278217326396},{"parentId":"Ground","selected":false,"rotation":[0,0,0],"cz":0,"type":"Flower","name":"Bellflower","id":"kGacG4GbyL6sr53BA3szew","lx":0.4,"cx":10.087718880149556,"normal":[0,0,1],"cy":-5.171937637087455,"locked":true,"lz":0.8},{"rotation":[0,0,0],"parentId":"Ground","cz":0,"id":"3mzXsN58FdxQCLpv8kVCYw","normal":[0,0,1],"selected":false,"name":"Bellflower","locked":true,"cx":11.337264912334188,"lx":0.4,"type":"Flower","lz":0.8,"cy":-4.906129973770318},{"rotation":[0,0,0],"normal":[0,0,1],"cy":-3.991597909938303,"cz":0,"name":"Bellflower","locked":true,"lz":0.8,"type":"Flower","lx":0.4,"id":"acUhTF9RVe5riGAE9cfhJn","cx":10.431075288929677,"parentId":"Ground","selected":false},{"name":"Bellflower","id":"ooTJkhwo3iWiDqyRe6jwef","cx":9.86441386534317,"cy":-4.67810479084557,"parentId":"Ground","normal":[0,0,1],"selected":false,"lx":0.4,"locked":true,"rotation":[0,0,0],"cz":-8.881784197001252e-16,"type":"Flower","lz":0.8},{"lz":0.5,"rotation":[0,0,0],"name":"White Flower","selected":false,"type":"Flower","cz":0,"lx":0.8,"id":"p8SDFTinzKkCMVNKYGXSQU","cx":9.406250442154278,"normal":[0,1,0],"locked":true,"cy":-4.8162245440076354,"parentId":"Ground"},{"cz":0,"selected":false,"cx":9.924833666037356,"type":"Flower","rotation":[0,0,0],"locked":true,"name":"White Flower","cy":-5.548260780564018,"parentId":"Ground","lz":0.5,"lx":0.8,"normal":[0,0,1],"id":"vXr6WeGdxpL14pfLB8tAGS"},{"normal":[0,1,0],"rotation":[0,0,0],"lz":2,"selected":false,"cz":0.03700868412863657,"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.8637473869150567,"locked":true,"lx":1,"id":"8jaD71ndVi3Pxu67kBrHve","name":"Tall Bush","type":"Flower","cy":-5.021658074995834},{"normal":[0,0,1],"cx":1.960367825542456,"lz":2,"name":"Tall Bush","locked":true,"cz":0.03700868412852288,"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"xu93thGDcf75KxzfVpckCK","lx":1,"rotation":[0,0,0],"cy":-5.044972777905908,"selected":false,"type":"Flower"},{"rotation":[0,0,0],"id":"aPfi6ru8UEQvmRY7YmRfhQ","selected":false,"lx":2,"cx":-2.974917470063473,"name":"Hydrangea","parentId":"m7AH7DcnoGzAq9kryBy4RS","type":"Flower","lz":1.5,"locked":true,"cy":-4.971526921550339,"cz":0.03700868412852377,"normal":[0,0,1]},{"cx":2.9943532379673203,"lx":2,"rotation":[0,0,0],"selected":false,"cz":0.03700868412852288,"name":"Hydrangea","type":"Flower","parentId":"8fpWrU7qVyVgipB7LtABom","normal":[0,0,1],"id":"p12f94kQKCXpPNEEPe9ktz","cy":-2.3800793411851497,"locked":true,"lz":1.5},{"parentId":"Ground","cz":4.440892098500626e-16,"cx":-8.658559512721883,"id":"8MCf8WzkvdtkVT9MPmDy4G","cy":0.2268652768492938,"rotation":[0,0,0],"normal":[0,0,1],"lx":5.410682322966088,"locked":true,"type":"Tree","selected":false,"lz":5.9930306282885,"name":"Magnolia"},{"name":"Yellow Flower","type":"Flower","locked":true,"rotation":[0,0,0],"cy":-3.717743510806919,"id":"kwZdR8kant3eBoLCjjUQCJ","lx":2,"selected":false,"normal":[0,0,1],"lz":1.4,"cx":-8.813697651847779,"parentId":"Ground","cz":-4.440892098500626e-16},{"lx":1,"parentId":"Ground","lz":0.7,"rotation":[0,0,0],"cx":-9.660182286895216,"selected":false,"cy":-0.10473626441648776,"type":"Flower","cz":0,"locked":true,"normal":[0,0,1],"name":"Hosta","id":"hM4s39UWZUWNoUSUMHrmbJ"},{"lz":0.7,"id":"nQgYQhsWvwPQorjAb4dSNv","rotation":[0,0,0],"selected":false,"locked":true,"cz":0,"cx":-9.04189556545002,"cy":-0.8584081924043119,"lx":1,"name":"Hosta","type":"Flower","normal":[0,0,1],"parentId":"Ground"},{"selectedIndex":1,"noOutline":true,"lx":0.4,"id":"eYBEchBwdGr5aCP6pHEkhr","vertices":[{"x":-0.04166666666666669,"y":-0.13775856472283443},{"y":-0.00265513883370061,"x":-0.04166666666666669},{"x":0.041666666666666616,"y":-0.00265513883370061},{"x":0.041666666666666616,"y":-0.13775856472283443}],"text":"175","opacity":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","fontSize":0.3,"cy":-0.2942089556230589,"rotation":[0,0,0],"ly":0.4,"selected":false,"normal":[0,0,1],"fontStrokeWidth":0.01,"cz":0,"parentType":"Wall","lz":0.4,"fontColor":"gold","parentId":"cV8MyCuhWAsvEyyFuVqVqg","filled":true,"type":"Polygon","locked":true,"cx":-0.00213352886578518,"color":"#ffffff"},{"lx":0.10666666666666667,"locked":true,"parentId":"8XDG3EHsQoX26MhuzwMYUM","normal":[0,1,0],"type":"Door","cz":-0.3986137684780472,"lineWidth":0.2,"doorType":"Default","textureType":"Door Texture #8","uValue":10,"color":"#ffffff","rotation":[0,0,0],"selected":false,"archHeight":1,"ly":0,"lz":0.20277246304390567,"interior":true,"filled":false,"id":"d48TNpLXWZQD5hZa4SumwF","showLabel":false,"lineColor":"#000000","foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.013333333333333334,"cy":0},{"type":"Window","color":"#ffffff","empty":true,"opacity":0.5,"normal":[0,-1,0],"parentType":"Roof","lx":6.2858321442603895,"rotation":[0.535854716076799,0,0],"lineColor":"#000000","lz":2.946512926202779,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","frame":true,"ly":0.2,"cz":4.9719401800066105,"showLabel":false,"cy":-2.2182418146601295,"windowType":"Default","sillWidth":0,"mullionSpacing":0.5,"frameWidth":0.1,"mullion":false,"locked":true,"uValue":2,"selected":false,"mullionColor":"#ffffff","interior":true,"cx":0.546396492045166,"tint":"#73D8FF","archHeight":1,"id":"qbq4krxSBYqvGnjWC2BaZ6","shutter":{"showRight":false,"color":"grey","showLeft":false,"width":0.5},"parentId":"nbw17kYeUHp1aouuScuF3Y","lineWidth":0.2,"mullionWidth":0.06}],"sceneRadius":19,"view":{"visibilityResultsPanelY":0,"showSunAngles":false,"showYearlyBuildingEnergyPanel":false,"yearlyPvYieldPanelY":0,"mapWeatherStations":false,"enableRotate":true,"showYearlyHeliostatYieldPanel":false,"heatFluxScaleFactor":5,"dailyParabolicTroughYieldPanelY":0,"dailyBuildingEnergyPanelRect":{"y":237,"height":360,"x":-520,"width":600},"yearlyParabolicTroughYieldPanelY":0,"showDesignInfoPanel":false,"cameraPosition":[-8.799358255746082,-16.959783561056284,1.954611653271045],"yearlyPvYieldPanelX":0,"yearlyHeliostatYieldPanelY":0,"mapPanelY":0,"showYearlyFresnelReflectorYieldPanel":false,"solarRadiationHeatMapReflectionOnly":false,"stickyNotePanelY":0,"cameraZoom":38.96037486782549,"autoRotate":false,"yearlyBuildingEnergyPanelRect":{"height":400,"x":-78,"y":157,"width":600},"showSolarPanelVisibilityResultsPanel":false,"yearlyParabolicDishYieldPanelX":0,"mapTilt":0,"weatherPanelX":0,"theme":"Hill","yearlyHeliostatYieldPanelX":0,"showMapPanel":false,"groundColor":"forestgreen","dailyFresnelReflectorYieldPanelX":0,"dailyPvYieldPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"dailyHeliostatYieldPanelX":0,"showDailyHeliostatYieldPanel":false,"ambientLightIntensity":0.2,"axes":true,"solarRadiationHeatMapMaxValue":5,"directLightIntensity":2,"groundImage":false,"mapPanelX":0,"showWeatherPanel":false,"showYearlyParabolicDishYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":0,"showHeliodonPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"dailyPvYieldPanelX":0,"showYearlyParabolicTroughYieldPanel":false,"mapZoom":18,"heliodonPanelY":0,"dailyFresnelReflectorYieldPanelY":0,"dailyLightSensorPanelY":0,"yearlyParabolicDishYieldPanelY":0,"weatherPanelY":0,"mapType":"roadmap","yearlyFresnelReflectorYieldPanelY":0,"showDailyBuildingEnergyPanel":false,"showDailyParabolicTroughYieldPanel":false,"heliodonPanelX":0,"visibilityResultsPanelX":0,"showDailyFresnelReflectorYieldPanel":false,"stickyNotePanelX":0,"orthographic":false,"yearlyParabolicTroughYieldPanelX":0,"showStickyNotePanel":false,"showDailyPvYieldPanel":false,"dailyLightSensorPanelX":0,"showDailyParabolicDishYieldPanel":false,"heliodon":false,"cameraPosition2D":[0.3385955283596493,-0.9616823668411001,150],"showYearlyPvYieldPanel":false,"navigationView":false,"panCenter":[-1.2725556781216778,-2.9298638165589974,1.954611653271045],"panCenter2D":[0.3385955283596493,-0.960681989394115,-9.84385140521351e-7],"showInstructionPanel":true,"dailyHeliostatYieldPanelY":0,"yearlyLightSensorPanelY":0,"dailyParabolicDishYieldPanelX":0,"yearlyLightSensorPanelX":0,"showSiteInfoPanel":true,"showDailyLightSensorPanel":false},"graphState":{"yearlyHeliostatIndividualOutputs":false,"dailyPvIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"poleSpacing":3,"interRowSpacing":2,"tiltAngle":0,"orientation":"Landscape","poleHeight":1,"rowAxis":"Zonal","rowsPerRack":1,"pvModelName":"SPR-X21-335-BLK"},"solarPanelArrayLayoutConstraints":{"maximumTiltAngle":1.5707963267948966,"maximumInterRowSpacing":10,"minimumTiltAngle":-1.5707963267948966,"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","poleSpacing":5,"poleHeight":1,"minimumInterRowSpacing":2,"maximumRowsPerRack":6,"minimumRowsPerRack":1},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"mutationRate":0.1,"localSearchRadius":0.1,"populationSize":20,"selectionMethod":1,"crossoverRate":0.5,"convergenceThreshold":0.01,"searchMethod":1,"selectionRate":0.5,"problem":"Solar Panel Tilt Angle","maximumGenerations":5,"objectiveFunctionType":1},"particleSwarmOptimizationParams":{"convergenceThreshold":0.01,"searchMethod":1,"localSearchRadius":0.1,"vmax":0.01,"maximumSteps":5,"problem":"Solar Panel Tilt Angle","swarmSize":20,"cognitiveCoefficient":0.1,"inertia":0.8,"objectiveFunctionType":1,"socialCoefficient":0.1}},"economicsParams":{"projectLifeSpan":25,"operationalCostPerUnit":0.15,"electricitySellingPrice":0.25},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":[],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},438:function(e){e.exports=JSON.parse('{"docid":"4MEDLVu1wYqsKgVHnu73g2","time":"06/19/2023 12:53 pm","timestamp":1687193611217,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"10/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":11.161213715568111,"solarUpdraftTower":{},"parentId":"Ground","cx":0.43688740998646924,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.6256010051791083,"type":"Foundation","solarPowerTower":{},"lx":15.01849429025864,"lz":0.15,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.075,"enableGroupMaster":true,"color":"#999999","locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":0,"lx":12,"relativeAngle":3.141592653589793,"lz":4.0189625473598385,"roofId":"78T3MkimgRTSnmRTMhRnJm","ly":0.1,"rightPoint":[-6.121296160650631,3.6736355578602797,0.15],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"No Wall Texture","leftPoint":[5.878703839349369,3.6736355578602797,0.15],"type":"Wall","rightRoofHeight":4.0189625473598385,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4.0189625473598385,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.12129616065063109,"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":3.6736355578602797,"color":"#ffffff","studWidth":0.1,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":5.878703839349369,"leftPoint":[5.878703839349369,-3.8263644421397207,0.15],"cy":-0.07636444213971982,"leftRoofHeight":4.0189625473598385,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[5.878703839349369,3.6736355578602797,0.15],"ly":0.1,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":7.5,"normal":[0,0,1],"lz":4.0189625473598385,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":1.2992388529678256,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","rightRoofHeight":4.0189625473598385,"roofId":"78T3MkimgRTSnmRTMhRnJm","color":"#ffffff","studWidth":0.1,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"lx":7.5,"lz":4.0189625473598385,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"78T3MkimgRTSnmRTMhRnJm","selected":false,"cy":-0.07636444213971982,"cz":2.586710917765224,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-6.121296160650631,-3.8263644421397207,0.15],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"No Wall Texture","rightRoofHeight":4.0189625473598385,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-6.121296160650631,3.6736355578602797,0.15],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4.0189625473598385,"ly":0.1,"cx":-6.121296160650631,"color":"#ffffff","studWidth":0.1,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"showLabel":false,"cx":-0.12129616065063109,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[5.878703839349369,-3.8263644421397207,0.15],"cz":2.4938633836176103,"textureType":"No Wall Texture","cy":-3.8263644421397207,"id":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"78T3MkimgRTSnmRTMhRnJm","leftPoint":[-6.121296160650631,-3.8263644421397207,0.15],"normal":[0,0,1],"ly":0.1,"lz":4.0189625473598385,"leftRoofHeight":4.0189625473598385,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4.0189625473598385,"lx":12,"color":"#ffffff","studWidth":0.1,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Window","showLabel":false,"ly":0.3,"lz":0.44384979425833565,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#009ce0","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.09751468078404088,"selected":false,"cx":-0.375,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#009ce0","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.09751468078404088,"normal":[0,0,1],"cx":-0.20833333333333334,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.20833333333333334,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#009ce0","cz":-0.09751468078404088,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0.3,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.375,"cy":0.1,"cz":-0.09751468078404088,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#009ce0","selected":false,"ly":0.3,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"lz":0.3942112571821837,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#009ce0","lx":0.13333333333333333,"cx":0.3333333333333333,"cz":-0.0726954122459649,"ly":0.3,"showLabel":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.3333333333333333,"rotation":[0,0,0],"type":"Window","lz":0.3942112571821837,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":-0.0726954122459649,"lx":0.13333333333333333,"color":"#009ce0","cy":0.1,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"tint":"#73D8FF","locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.18779489182743653,"lx":0.16666666666666666,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #6","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"huHgxbUk5nxatnYiuq2HhR","locked":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Door","cx":-0.006666666666666672,"cy":0,"cz":-0.18779489182743653,"lx":0.2,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #4","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"eBQam4YYdXWFEi5iDbVQ4t","locked":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Human","name":"Judd","cx":-1.6517669050671016,"cy":-5.151915789984621,"cz":0,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fPgwwBmXz2LWV9vPRMmqzu","selected":false,"ly":0.544,"locked":false,"flip":true},{"type":"Window","cx":0,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"mullionSpacing":1,"color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"id":"6fPaBMTjYg9NPR7fFaHY6L","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.3},"selected":false,"locked":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Tree","name":"Maple","cx":11.865118463765427,"cy":-5.577986315935053,"cz":8.881784197001252e-16,"lx":16.05619920115618,"lz":13.259443372641188,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fvxLBBmjibSLAyfoLcbVjh","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-3.0750695946303814,"cy":-4.227743581523945,"cz":0,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"c6WoCyEbuQkywzSj8xtBF2","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":2.0998220675663912,"cy":5.661327124584192,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"2agGn2N16sYDjc7TtzRo77","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-1.443673320056662,"cy":5.538396761407162,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"817xHue6rUfnaS7Rb7KYEp","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":3.7512645617671208,"cy":-4.363148504838203,"cz":0,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"gonFzZtq1wiiYeCU4hrBiQ","selected":false,"locked":false},{"type":"Tree","name":"Oak","cx":-12.252366424027322,"cy":-4.618748106171015,"cz":0,"lx":8.855861155358149,"lz":12.194962084865425,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qpT1N3VZfjdrNWS4GttCXC","selected":false,"locked":false},{"type":"Human","name":"Jena","cx":0.8275383928823183,"cy":-9.624350207348813,"cz":0,"lx":0.695,"ly":0.695,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"gqeggrZFS756iNyQUnbtUf","selected":false,"locked":false,"flip":true},{"type":"Tree","name":"Elm","cx":13.111399109297015,"cy":-1.1973027476553462,"cz":0,"lx":10.046562775206576,"lz":8.109426488433453,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"rAcrYXcgzcVotvfd1MPBUS","selected":false,"locked":false,"flip":true},{"type":"Wall","cx":-2.2052541270362322,"cy":0.8790814624363403,"cz":3.903941909848086,"lx":1.6301713902021722,"ly":0.1,"lz":7.36138516954615,"leftJoints":["7th3drNVpuY5AYVdUWYMmr"],"rightJoints":["4phTBDkfBQXjkb4Rk7FnE9"],"leftPoint":[-1.3901684319351464,0.8790814624363403,0.13318518579593203],"rightPoint":[-3.020339822137318,0.8790814624363402,0.13318518579593203],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#c45100","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"nKrKhaZnvb6NWdN1cuPNPQ","parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","studWidth":0.1,"roofId":"a4xCB5WuiLgF5jeoo2tZKb","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.991111147755922,"rightTopPartialHeight":7.991111147755922,"leftRoofHeight":7.36138516954615,"rightRoofHeight":7.36138516954615},{"type":"Wall","cx":-1.390168431935146,"cy":0.1417655180283693,"cz":3.5644394786617815,"lx":1.4746318888159395,"ly":0.1,"lz":7.36138516954615,"leftJoints":["kWszqFPBGdK8r8abVTohoG"],"rightJoints":["nKrKhaZnvb6NWdN1cuPNPQ"],"leftPoint":[-1.390168431935146,-0.5955504263796001,0.13318518579593203],"rightPoint":[-1.3901684319351464,0.8790814624363403,0.13318518579593203],"relativeAngle":1.570796326794897,"textureType":"No Wall Texture","color":"#c45100","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"7th3drNVpuY5AYVdUWYMmr","parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","studWidth":0.1,"roofId":"a4xCB5WuiLgF5jeoo2tZKb","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.991111147755922,"rightTopPartialHeight":7.991111147755922,"leftRoofHeight":7.36138516954615,"rightRoofHeight":7.36138516954615},{"type":"Wall","cx":-3.020339822137318,"cy":0.14176551802837095,"cz":3.660138480027889,"lx":1.4746318888159395,"ly":0.1,"lz":7.36138516954615,"leftJoints":["nKrKhaZnvb6NWdN1cuPNPQ"],"rightJoints":["kWszqFPBGdK8r8abVTohoG"],"leftPoint":[-3.020339822137318,0.8790814624363402,0.13318518579593203],"rightPoint":[-3.020339822137318,-0.5955504263796002,0.13318518579593203],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#c45100","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"4phTBDkfBQXjkb4Rk7FnE9","parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","studWidth":0.1,"roofId":"a4xCB5WuiLgF5jeoo2tZKb","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.991111147755922,"rightTopPartialHeight":7.991111147755922,"leftRoofHeight":7.36138516954615,"rightRoofHeight":7.36138516954615},{"type":"Wall","cx":-2.2052541270362322,"cy":-0.5955504263796001,"cz":3.535805069111796,"lx":1.6301713902021722,"ly":0.1,"lz":7.36138516954615,"leftJoints":["4phTBDkfBQXjkb4Rk7FnE9"],"rightJoints":["7th3drNVpuY5AYVdUWYMmr"],"leftPoint":[-3.020339822137318,-0.5955504263796002,0.13318518579593203],"rightPoint":[-1.390168431935146,-0.5955504263796001,0.13318518579593203],"relativeAngle":0,"textureType":"No Wall Texture","color":"#c45100","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"kWszqFPBGdK8r8abVTohoG","parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","studWidth":0.1,"roofId":"a4xCB5WuiLgF5jeoo2tZKb","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.991111147755922,"rightTopPartialHeight":7.991111147755922,"leftRoofHeight":7.36138516954615,"rightRoofHeight":7.36138516954615},{"type":"Foundation","cx":0.3077078971226189,"cy":3.0276471134665144,"cz":0.05,"lx":6.050585488591402,"ly":1.8221381985905813,"lz":0.13318518579593203,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tn6VdYYXt613XceYDyUpJ9","selected":false,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Tree","name":"Elm","cx":20.67846328505893,"cy":-9.20268218529909,"cz":0,"lx":12.433839488245253,"lz":9.836057268637402,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"6U6bXmGtKfkYqAs2kythZy","selected":false,"locked":false},{"type":"Tree","name":"Oak","flip":true,"cx":-10.79612992548108,"cy":-0.5136286397841126,"cz":0,"lx":8.855861155358149,"lz":10.429490037118851,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"kMBedsoq9QVDjasDrQWT4V","selected":false,"locked":false},{"type":"Window","cx":-0.012652630358459416,"cy":0.3,"cz":-0.43145161207114374,"lx":0.7034406025498919,"ly":0.1,"lz":0.1120689672961754,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"4phTBDkfBQXjkb4Rk7FnE9","foundationId":"tn6VdYYXt613XceYDyUpJ9","id":"j6NUHZizYhFTiAyWQhXoD9","locked":false},{"type":"Polygon","cx":0.07638982322958343,"cy":-0.25928828992332453,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.08333333333333336,"y":-0.3349639302840458},{"x":-0.08333333333333336,"y":-0.21055371393891886},{"x":0.08333333333333327,"y":-0.21055371393891886},{"x":0.08333333333333327,"y":-0.3349639302840458}],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":2,"id":"riLcPLsK7W8zeEnjZw8gRf","text":"1776","fontSize":0.3,"fontColor":"gold","opacity":0,"noOutline":true,"fontStrokeWidth":0.01,"locked":false},{"type":"Foundation","cx":0.33379757598519466,"cy":-2.7971719396742896,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"qGYqGFx5QHvCYMPqUamwtg","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["fHfbtb59n24haPtRTBRcYJ"],"rightJoints":["1jiwH1dGqmJCE577Ac4BpJ"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oQTYhBNys7ET4C3deVBZ5Q","parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"rYxSTT1cUyicscf7Y4FuC6","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["5nN1y4Kn3NGWF4MsuL2gGg"],"rightJoints":["oQTYhBNys7ET4C3deVBZ5Q"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fHfbtb59n24haPtRTBRcYJ","parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"rYxSTT1cUyicscf7Y4FuC6","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["oQTYhBNys7ET4C3deVBZ5Q"],"rightJoints":["5nN1y4Kn3NGWF4MsuL2gGg"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1jiwH1dGqmJCE577Ac4BpJ","parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"rYxSTT1cUyicscf7Y4FuC6","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["1jiwH1dGqmJCE577Ac4BpJ"],"rightJoints":["fHfbtb59n24haPtRTBRcYJ"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5nN1y4Kn3NGWF4MsuL2gGg","parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"rYxSTT1cUyicscf7Y4FuC6","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-4.860154921480787e-17,"cy":0.1,"cz":0.3666666666666667,"lx":0.7004221405870003,"ly":0.1,"lz":0.2333333333333334,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mLmsMTSYV91NUMvpsqsFiG","parentId":"5nN1y4Kn3NGWF4MsuL2gGg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"rYxSTT1cUyicscf7Y4FuC6","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"qGYqGFx5QHvCYMPqUamwtg","foundationId":"qGYqGFx5QHvCYMPqUamwtg","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["1jiwH1dGqmJCE577Ac4BpJ"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.27,"thickness":0.1,"rValue":2,"color":"#4d4d4d","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["7th3drNVpuY5AYVdUWYMmr","nKrKhaZnvb6NWdN1cuPNPQ","4phTBDkfBQXjkb4Rk7FnE9","kWszqFPBGdK8r8abVTohoG"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tn6VdYYXt613XceYDyUpJ9","foundationId":"tn6VdYYXt613XceYDyUpJ9","id":"a4xCB5WuiLgF5jeoo2tZKb","locked":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.4627363727730651,"lx":0.6781353418329732,"ly":0.1,"lz":0.04949944589233271,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"7th3drNVpuY5AYVdUWYMmr","foundationId":"tn6VdYYXt613XceYDyUpJ9","id":"bgYTJi5DzEFJGVCo57XuYk","locked":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.4627363727730651,"lx":0.6134324317125827,"ly":0.1,"lz":0.04949944589233271,"uValue":2,"mullion":true,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ooToYHmPZvhwYzrAb3RyWE","parentId":"nKrKhaZnvb6NWdN1cuPNPQ","foundationId":"tn6VdYYXt613XceYDyUpJ9","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.4627363727730651,"lx":0.6781353418329732,"ly":0.1,"lz":0.04949944589233271,"uValue":2,"mullion":true,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gozabRkLLupzqY7JtKZ5DU","parentId":"4phTBDkfBQXjkb4Rk7FnE9","foundationId":"tn6VdYYXt613XceYDyUpJ9","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Window","cx":0.03235145506019523,"cy":0.3,"cz":0.4627363727730651,"lx":0.6781353418329732,"ly":0.1,"lz":0.04949944589233271,"uValue":2,"mullion":true,"mullionWidth":0.01,"mullionSpacing":0.1,"mullionColor":"#4d4d4d","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"suAHKZgUHocvdJbxFoH78W","parentId":"kWszqFPBGdK8r8abVTohoG","foundationId":"tn6VdYYXt613XceYDyUpJ9","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Foundation","cx":3.2150216052788303,"cy":-2.8132764716626193,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"gh4c13r9yNg7ppA3VVwrX8","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["9qfdnpKV9WxuYmpphDkmD4"],"rightJoints":["j9Z8EowBvMVCM2dwgKYy1y"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"trW1X3K7auhSfAooobgEiw","parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"685MKS7u6S8wM1nxD2jLoc","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["3x1iWRnJVD2nF7eUVd16Wm"],"rightJoints":["trW1X3K7auhSfAooobgEiw"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9qfdnpKV9WxuYmpphDkmD4","parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"685MKS7u6S8wM1nxD2jLoc","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["trW1X3K7auhSfAooobgEiw"],"rightJoints":["3x1iWRnJVD2nF7eUVd16Wm"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j9Z8EowBvMVCM2dwgKYy1y","parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"685MKS7u6S8wM1nxD2jLoc","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["j9Z8EowBvMVCM2dwgKYy1y"],"rightJoints":["9qfdnpKV9WxuYmpphDkmD4"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3x1iWRnJVD2nF7eUVd16Wm","parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"685MKS7u6S8wM1nxD2jLoc","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-4.860154921480787e-17,"cy":0.1,"cz":0.3666666666666667,"lx":0.7004221405870003,"ly":0.1,"lz":0.2333333333333334,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6LzR6eV1uwci9irbGqdmsg","parentId":"3x1iWRnJVD2nF7eUVd16Wm","foundationId":"gh4c13r9yNg7ppA3VVwrX8","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"685MKS7u6S8wM1nxD2jLoc","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gh4c13r9yNg7ppA3VVwrX8","foundationId":"gh4c13r9yNg7ppA3VVwrX8","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["j9Z8EowBvMVCM2dwgKYy1y"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Foundation","cx":-4.860568941525044,"cy":0.763315834515849,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"js7EaM7SDLKEtCc7cBhAUc","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["tJ9GgBix3PLQrNArenRuzc"],"rightJoints":["mnsM5PmgqiqpCUSahppEQQ"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"4oWBJBVuW5ddc3zLD4mbeh","parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bz1WrgXhu5EcEAR9GxS6yF","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["41NvU5MXffjBBr51nmDdGG"],"rightJoints":["4oWBJBVuW5ddc3zLD4mbeh"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"tJ9GgBix3PLQrNArenRuzc","parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bz1WrgXhu5EcEAR9GxS6yF","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["4oWBJBVuW5ddc3zLD4mbeh"],"rightJoints":["41NvU5MXffjBBr51nmDdGG"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"mnsM5PmgqiqpCUSahppEQQ","parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bz1WrgXhu5EcEAR9GxS6yF","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["mnsM5PmgqiqpCUSahppEQQ"],"rightJoints":["tJ9GgBix3PLQrNArenRuzc"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"41NvU5MXffjBBr51nmDdGG","parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bz1WrgXhu5EcEAR9GxS6yF","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-0.0038568156424866754,"cy":0.3,"cz":0.4134081675516749,"lx":0.692708509302027,"ly":0.1,"lz":0.1601496684366832,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9EeeFoACPVE8MLe3zorx4K","parentId":"41NvU5MXffjBBr51nmDdGG","foundationId":"js7EaM7SDLKEtCc7cBhAUc","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"bz1WrgXhu5EcEAR9GxS6yF","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"js7EaM7SDLKEtCc7cBhAUc","foundationId":"js7EaM7SDLKEtCc7cBhAUc","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["mnsM5PmgqiqpCUSahppEQQ"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Mansard","roofStructure":"Default","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"ridgeWidth":1.783225650631956,"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"78T3MkimgRTSnmRTMhRnJm","locked":false,"rise":2.3357705249971685,"ceiling":false},{"type":"Foundation","cx":5.500184342397144,"cy":0.616975206751395,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"f7TRNhRrBM6HewS6E1guoW","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["rRB8ra1Qwyw4iiHGHnpVZi"],"rightJoints":["1hwtcWgsscfNjYqgnjhvtn"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"pNGTThD5hH42KcpY4sRcaQ","parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"hWL7sH8U7YoQ4wHgsqH7VK","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["eqjL2dbMLsHLvayC5LyFuv"],"rightJoints":["pNGTThD5hH42KcpY4sRcaQ"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"rRB8ra1Qwyw4iiHGHnpVZi","parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"hWL7sH8U7YoQ4wHgsqH7VK","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["pNGTThD5hH42KcpY4sRcaQ"],"rightJoints":["eqjL2dbMLsHLvayC5LyFuv"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"1hwtcWgsscfNjYqgnjhvtn","parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"hWL7sH8U7YoQ4wHgsqH7VK","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["1hwtcWgsscfNjYqgnjhvtn"],"rightJoints":["rRB8ra1Qwyw4iiHGHnpVZi"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"eqjL2dbMLsHLvayC5LyFuv","parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"hWL7sH8U7YoQ4wHgsqH7VK","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-0.0038568156424866754,"cy":0.3,"cz":0.4134081675516749,"lx":0.692708509302027,"ly":0.1,"lz":0.1601496684366832,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mDEuMJDYX8TiA5aadxRnBu","parentId":"eqjL2dbMLsHLvayC5LyFuv","foundationId":"f7TRNhRrBM6HewS6E1guoW","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"hWL7sH8U7YoQ4wHgsqH7VK","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"f7TRNhRrBM6HewS6E1guoW","foundationId":"f7TRNhRrBM6HewS6E1guoW","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["1hwtcWgsscfNjYqgnjhvtn"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Window","cx":-2.9061219154167555,"cy":-3.497482825893301,"cz":5.031519407546503,"lx":1.300297700517698,"ly":0.1,"lz":1.9655762500908776,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[1.1621842141674956,0,0],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"dqF6aB1PLVLHAKyQxUkNWg","locked":false,"interior":true,"empty":true},{"type":"Window","cx":-0.13217799837949085,"cy":-3.466819756320384,"cz":5.102337732905447,"lx":1.0067165265651998,"ly":0.1,"lz":2.114356430670708,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[1.1621842141674956,0,0],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"s7X1mdRRoj7fgg7jLfkGQy","locked":false,"interior":true,"empty":true,"polygonTop":[0.013284896561776944,0.31018938223150583]},{"type":"Window","cx":2.7465783818144205,"cy":-3.5046143246410884,"cz":5.015048753901841,"lx":1.1969599659290129,"ly":0.1,"lz":1.7862306602865088,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[1.1621842141674958,0,0],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"4ExkckYEtLvi3sMjGcHsBj","locked":false,"interior":true,"empty":true},{"type":"Window","cx":-5.33506170232176,"cy":0.09994590152917182,"cz":5.333416244357606,"lx":1.2282372453539805,"ly":0.1,"lz":1.511969232086556,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.9962527086505618,0,4.71238898038469],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"gFPFPr9Hy5FNU5ri2g3ZMj","locked":false,"interior":true,"empty":true},{"type":"Window","cx":5.09996147816442,"cy":-0.02661611464564695,"cz":5.321843608513025,"lx":1.1961819365662594,"ly":0.1,"lz":1.1993416949141293,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#888","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.9962527086505618,0,1.5707963267948966],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"hYKzofeHiHD2fL3mK24K6U","locked":false,"interior":true,"empty":true},{"type":"Foundation","cx":-2.443546493608035,"cy":-2.7953215648047354,"cz":0.05,"lx":2.007222071597162,"ly":3.3579733671910272,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"rValue":2,"id":"k5csVFnyrpYrBkQNWDouaF","selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":0.6594266049428096,"cz":3.903941909848086,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"fill":"Empty","leftUnfilledHeight":3.8676606000295384,"rightUnfilledHeight":3.8676606000295384,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["hhfft6jEyF5V7W3kNGR7VB"],"rightJoints":["vuuABxxTWnhAaFBLMw5wsz"],"leftPoint":[0.7057012241777734,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,0.6594266049428096,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uTXQVHi382ou2WhVmDTfzD","parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"3dnKtcKTXnG1eDaqcB1sdk","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Wall","cx":0.7057012241777735,"cy":0.09181970821117244,"cz":3.5644394786617815,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["4fS3C4uw4LVSpSngSsA7dR"],"rightJoints":["uTXQVHi382ou2WhVmDTfzD"],"leftPoint":[0.7057012241777734,-0.4757871885204647,0],"rightPoint":[0.7057012241777736,0.6594266049428096,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hhfft6jEyF5V7W3kNGR7VB","parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"3dnKtcKTXnG1eDaqcB1sdk","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.7211445534800273,"cy":0.09181970821117244,"cz":3.660138480027889,"lx":1.1352137934632742,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.1,"fill":"Partial","leftUnfilledHeight":6,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["uTXQVHi382ou2WhVmDTfzD"],"rightJoints":["4fS3C4uw4LVSpSngSsA7dR"],"leftPoint":[-0.7211445534800273,0.6594266049428096,0],"rightPoint":[-0.7211445534800273,-0.4757871885204647,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vuuABxxTWnhAaFBLMw5wsz","parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"3dnKtcKTXnG1eDaqcB1sdk","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"locked":false},{"type":"Wall","cx":-0.007721664651126947,"cy":-0.4757871885204647,"cz":3.535805069111796,"lx":1.4268457776578005,"ly":0.1,"lz":6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.2,"fill":"Partial","leftUnfilledHeight":3.84142941805093,"rightUnfilledHeight":3.84142941805093,"leftTopPartialHeight":6,"rightTopPartialHeight":6,"leftJoints":["vuuABxxTWnhAaFBLMw5wsz"],"rightJoints":["hhfft6jEyF5V7W3kNGR7VB"],"leftPoint":[-0.7211445534800273,-0.4757871885204647,0],"rightPoint":[0.7057012241777734,-0.4757871885204647,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4fS3C4uw4LVSpSngSsA7dR","parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"3dnKtcKTXnG1eDaqcB1sdk","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.47],"selected":false,"locked":false},{"type":"Window","cx":-4.860154921480787e-17,"cy":0.1,"cz":0.3666666666666667,"lx":0.7004221405870003,"ly":0.1,"lz":0.2333333333333334,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bKJgLy3t9PMmV69scLag6y","parentId":"4fS3C4uw4LVSpSngSsA7dR","foundationId":"k5csVFnyrpYrBkQNWDouaF","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.3},"selected":false,"locked":false},{"id":"3dnKtcKTXnG1eDaqcB1sdk","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.47,"color":"#ffffff","ceilingRValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k5csVFnyrpYrBkQNWDouaF","foundationId":"k5csVFnyrpYrBkQNWDouaF","roofType":"Gable","textureType":"No Roof Texture","thickness":0.05,"wallsId":["vuuABxxTWnhAaFBLMw5wsz"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false},{"type":"Window","cx":-0.2967756977486685,"cy":0.20088911106289942,"cz":6.454733072357007,"lx":1.191642955374655,"ly":0.1,"lz":1.1555332790892452,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"78T3MkimgRTSnmRTMhRnJm","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"iuNzbNXdWiXkLCQooXhnqK"}],"sceneRadius":34,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[1.5484163619340843,0.44578561471726313,8.140182408063113e-8],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[1.5484163619340843,0.4447852372714149,150],"theme":"Rural","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-8.484010006399412,-18.277620093544904,3.817556225217015],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":50.3506522061685,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#3a8569","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[2.1400728033642977,-1.125989332642603,3.1050102010198306],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":6},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},439:function(e){e.exports=JSON.parse('{"docid":"g9RKpzrgbWbsC1dbkpX9ZS","time":"06/17/2023 02:55 pm","timestamp":1687028106173,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jaye","cx":-1.2513719184514027,"cy":-6.372159113081112,"cz":0.03284187614917711,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.55,"locked":true},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":6,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":6,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":6,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":6,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2kwhV9PqZtFtk8RVLFx83","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qpEwqVCd2BoFtSevFQh92k","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":0.5149353122311684,"cy":0.036172415190780516,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":true,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Door","cx":0,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"textureType":"Door Texture #3","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"sXi8n3YHx4BKsSMSv4hsZ3","locked":true,"doorType":"Default","archHeight":1,"filled":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0.6922319427215817],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":true,"rise":2.2458395786002807,"ceiling":false},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5CaMQ21unMpwofCSBHFHKy","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p9ZFePdMbr5NJNutJpztLz","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"onfGgeAsDqrPXW9qAoSbJh","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916777,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mM8yRHvdQcQxaerLVfTrHK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"reViENhjL3rZ1iP9Y6KZQV","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dKNjnS17wjTVoaiN1bY7jW","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bJfKVxMyGkSvssMyjbaW7W","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u4p2yGTyGA3NaJrURgo1aw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"swiJmUxEJ9JBgVoJXFiWMw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dJpqWBHMDhQTd71cTnXaW4","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j5a1DqXozDg23XnZHUwT3y","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wdagFqacKyLy9R8i7SRZPq","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fY9urdYNGp76qQUc5TkF8d","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kwvhmrhVppPu21YKVKixoa","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nZtTu7kGPQBjfFfeNj7L7w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"433Qj5XWec6xkx6KMSVinb","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tPa2K6uLM9bNJjLjnApS5w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cAQmf2baCS5Y2WWh241r8n","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jena","cx":0.012588972336459392,"cy":14.712453241561741,"cz":0,"lx":0.695,"ly":0.695,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"5FVsreGyGxfLQLGYPuw8VY","selected":false,"locked":true},{"type":"Wall","cx":-1.183865369768545,"cy":0.5782456514167715,"cz":2.2408122612280286,"lx":1.1862232825779104,"ly":0.1,"lz":9.575974551005562,"leftJoints":["pw9wMqrj3Enw2zC5Tgk6yR"],"rightJoints":["dMssi4ADwUhxkBhQ377g3E"],"leftPoint":[-0.59075372847959,0.5782456514167715,0],"rightPoint":[-1.7769770110575003,0.5782456514167715,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #3","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"id":"5koEPnk7n6ka7L389qtGvZ","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-0.59075372847959,"cy":0.043861762748918204,"cz":2.2301039869226305,"lx":1.0687677773357067,"ly":0.1,"lz":9.575974551005562,"leftJoints":["sW8KRkVjiejYRvNZCfXEAP"],"rightJoints":["5koEPnk7n6ka7L389qtGvZ"],"leftPoint":[-0.59075372847959,-0.4905221259189351,0],"rightPoint":[-0.59075372847959,0.5782456514167715,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #3","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"id":"pw9wMqrj3Enw2zC5Tgk6yR","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-1.7769770110575003,"cy":0.043861762748918204,"cz":2.228839888904333,"lx":1.0687677773357067,"ly":0.1,"lz":9.575974551005562,"leftJoints":["5koEPnk7n6ka7L389qtGvZ"],"rightJoints":["sW8KRkVjiejYRvNZCfXEAP"],"leftPoint":[-1.7769770110575003,0.5782456514167715,0],"rightPoint":[-1.7769770110575003,-0.4905221259189351,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #3","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"id":"dMssi4ADwUhxkBhQ377g3E","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-1.183865369768545,"cy":-0.4905221259189351,"cz":2.268765007024547,"lx":1.1862232825779104,"ly":0.1,"lz":9.575974551005562,"leftJoints":["dMssi4ADwUhxkBhQ377g3E"],"rightJoints":["pw9wMqrj3Enw2zC5Tgk6yR"],"leftPoint":[-1.7769770110575003,-0.4905221259189351,0],"rightPoint":[-0.59075372847959,-0.4905221259189351,0],"relativeAngle":0,"textureType":"Wall Texture #3","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"id":"sW8KRkVjiejYRvNZCfXEAP","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Foundation","cx":-6.963047317091872,"cy":9.305275463657257,"cz":0.05,"lx":3.9991959519547824,"ly":1.4273945635779641,"lz":0.11969968188756955,"normal":[0,0,1],"rotation":[0,0,2.2629939081358477],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qEHo3z28Ar77Wu5WGXMk73","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":0.8037383988388016,"cy":5.7479913822261075,"cz":1.2963049013988683,"lx":2.4667544114619777,"ly":0.1,"lz":2.5926098027977367,"leftJoints":["cRF4aFTgNdpMTdmopKNDYe"],"rightJoints":["maCaKmF7W1UtJB4NhBQsX3"],"leftPoint":[2.03711560456979,5.747991382226106,0.06568375039354474],"rightPoint":[-0.4296388068921875,5.747991382226109,0.06568375039354474],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"id":"qA9MpNw8bZfY7qVfr846Q8","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"gJReW7hpA5RV4sDmYkftax","selected":false,"leftRoofHeight":2.5926098027977367,"rightRoofHeight":2.5926098027977367,"locked":true,"structureSpacing":3,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5926098027977367,"rightTopPartialHeight":2.5926098027977367},{"type":"Wall","cx":2.037115604569791,"cy":-0.0267801106673915,"cz":1.2963049013988683,"lx":11.549542985787003,"ly":0.3,"lz":2.5926098027977367,"leftJoints":["5ExmWkfAba5nuC3xfHo5vU"],"rightJoints":["qA9MpNw8bZfY7qVfr846Q8"],"leftPoint":[2.0371156045697902,-5.801551603560892,0.06568375039354474],"rightPoint":[2.03711560456979,5.747991382226106,0.06568375039354474],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"id":"cRF4aFTgNdpMTdmopKNDYe","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Stud","opacity":0,"roofId":"gJReW7hpA5RV4sDmYkftax","selected":false,"leftRoofHeight":2.5926098027977367,"rightRoofHeight":2.5926098027977367,"locked":true,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5926098027977367,"rightTopPartialHeight":2.5926098027977367},{"type":"Wall","cx":-0.4296388068921877,"cy":-0.026780110667392,"cz":1.2963049013988683,"lx":11.549542985787003,"ly":0.1,"lz":2.5,"leftJoints":["qA9MpNw8bZfY7qVfr846Q8"],"rightJoints":["5ExmWkfAba5nuC3xfHo5vU"],"leftPoint":[-0.4296388068921875,5.747991382226109,0.06568375039354474],"rightPoint":[-0.4296388068921875,-5.801551603560892,0.06568375039354474],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"id":"maCaKmF7W1UtJB4NhBQsX3","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"gJReW7hpA5RV4sDmYkftax","selected":false,"leftRoofHeight":2.5926098027977367,"rightRoofHeight":2.5926098027977367,"locked":true,"structureSpacing":3,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"type":"Wall","cx":0.8037383988388016,"cy":-5.801551603560892,"cz":1.2963049013988683,"lx":2.46675441146198,"ly":0.1,"lz":2.5926098027977367,"leftJoints":["maCaKmF7W1UtJB4NhBQsX3"],"rightJoints":["cRF4aFTgNdpMTdmopKNDYe"],"leftPoint":[-0.4296388068921875,-5.801551603560892,0.06568375039354474],"rightPoint":[2.0371156045697902,-5.801551603560892,0.06568375039354474],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"id":"5ExmWkfAba5nuC3xfHo5vU","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"gJReW7hpA5RV4sDmYkftax","selected":false,"leftRoofHeight":2.5926098027977367,"rightRoofHeight":2.5926098027977367,"locked":true,"structureSpacing":3,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5926098027977367,"rightTopPartialHeight":2.5926098027977367},{"type":"Foundation","cx":4.89676730184058,"cy":-5.153959605268503,"cz":0.05,"lx":4.932837807071785,"ly":16.292262691376934,"lz":0.06568375039354474,"normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"myXiyVt2NURPnPChDUSnvF","selected":false,"locked":true,"notBuilding":true},{"type":"Tree","name":"Maple","cx":-9.524500304672243,"cy":13.709596046858643,"cz":0,"lx":10.834343460246352,"lz":10.259018050875072,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"nHGsDGLUFhyht1nKkbShZS","selected":false,"locked":true},{"type":"Tree","name":"Maple","cx":-6.796534185824541,"cy":18.258777569256825,"cz":0,"lx":15.381033043650339,"lz":12.882589649504101,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"pYVQihimDYo3cuWwFUxGRV","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-2.2262641238571375,"cy":-0.2694473112048733,"cz":0.03284187614917755,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","id":"pv5MXJzN7e4QwMAqb7AK2K","selected":false,"locked":true},{"type":"Flower","name":"Spirea","cx":-2.2467598257077848,"cy":3.412268957127143,"cz":0.03284187614917755,"lx":1.8,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","id":"evYRkJazdBwJn4ArepyeZH","selected":false,"locked":true},{"type":"Flower","name":"Spirea","cx":-2.3118748580987036,"cy":-3.753623714118395,"cz":0.03284187614917755,"lx":1.8,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","id":"mr1vQH3R9jwp2hzXcmJrDH","selected":false,"locked":true},{"type":"Wall","cx":0.06987760561132239,"cy":2.6725668112376275,"cz":2.2408122612280286,"lx":10.248709902558403,"ly":0.3,"lz":6,"leftJoints":["a5m5AvsmWigFtneecAXGMn"],"rightJoints":["6PzfAQV8su7Enkckc6tSx8"],"leftPoint":[5.194232556890523,2.672566811237627,0],"rightPoint":[-5.054477345667879,2.672566811237628,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"id":"82amhDo89t4LPzjbshEmmD","parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofId":"wFnXk782R98H6AT2RALp7W","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":5.1942325568905225,"cy":-0.06239106653992166,"cz":2.2301039869226305,"lx":5.4699157555551,"ly":0.3,"lz":6,"leftJoints":["xvDTHckT6Jh3sPEoBy9XsM"],"rightJoints":["82amhDo89t4LPzjbshEmmD"],"leftPoint":[5.194232556890521,-2.7973489443174713,0],"rightPoint":[5.194232556890523,2.672566811237628,0],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"id":"a5m5AvsmWigFtneecAXGMn","parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofId":"wFnXk782R98H6AT2RALp7W","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5.858178072916449,"rightUnfilledHeight":5.858178072916449,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-5.054477345667879,"cy":-0.06239106653992166,"cz":2.228839888904333,"lx":5.4699157555551,"ly":0.3,"lz":6,"leftJoints":["82amhDo89t4LPzjbshEmmD"],"rightJoints":["xvDTHckT6Jh3sPEoBy9XsM"],"leftPoint":[-5.054477345667878,2.672566811237628,0],"rightPoint":[-5.054477345667879,-2.7973489443174713,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"id":"6PzfAQV8su7Enkckc6tSx8","parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofId":"wFnXk782R98H6AT2RALp7W","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.2742272581577952,"cy":0.1,"cz":-0.29166666666666663,"lx":0.1828181721051967,"ly":0.3,"lz":0.24999999999999992,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hskMbJc7MNggWVyJxXeWfq","parentId":"6PzfAQV8su7Enkckc6tSx8","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.27422725815779514,"cy":0.1,"cz":-0.29166666666666663,"lx":0.18281817210519707,"ly":0.3,"lz":0.24999999999999992,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"t4tAXhCx5djrNJxXHT3ypA","parentId":"6PzfAQV8su7Enkckc6tSx8","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27422725815779525,"cy":0.1,"cz":0.2916666666666666,"lx":0.1828181721051968,"ly":0.3,"lz":0.24999999999999986,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gDRnUAXHHxbgJda5pCBAaH","parentId":"6PzfAQV8su7Enkckc6tSx8","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2742272581577952,"cy":0.1,"cz":0.2916666666666666,"lx":0.1828181721051969,"ly":0.3,"lz":0.24999999999999986,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jQdaLqe6Gc7eF6ukLyTX2V","parentId":"6PzfAQV8su7Enkckc6tSx8","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.06987760561132239,"cy":-2.7973489443174713,"cz":2.268765007024547,"lx":10.248709902558403,"ly":0.3,"lz":6,"leftJoints":["6PzfAQV8su7Enkckc6tSx8"],"rightJoints":["a5m5AvsmWigFtneecAXGMn"],"leftPoint":[-5.054477345667879,-2.7973489443174713,0],"rightPoint":[5.194232556890523,-2.7973489443174713,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"id":"xvDTHckT6Jh3sPEoBy9XsM","parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofId":"wFnXk782R98H6AT2RALp7W","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"id":"wFnXk782R98H6AT2RALp7W","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"parentId":"8JaqTz5HE2vZh6f1qWauFD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","roofType":"Gable","textureType":"Roof Texture Default","thickness":0.1,"wallsId":["xvDTHckT6Jh3sPEoBy9XsM"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":true,"rise":2.2458395786002807,"ceiling":false},{"type":"Foundation","cx":-2.6332068809886726,"cy":4.093457334157864,"cz":0.05,"lx":13.955747653843215,"ly":7.879103027392385,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-0.8785643840733148],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"8JaqTz5HE2vZh6f1qWauFD","selected":false,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Window","cx":0.2439331412216011,"cy":0.1,"cz":0.29742868877631434,"lx":0.09757325648864049,"ly":0.3,"lz":0.23847595578070466,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"a18ekWsi3At6CyxwfsEfLY","parentId":"82amhDo89t4LPzjbshEmmD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2439331412216011,"cy":0.1,"cz":-0.20257131122368566,"lx":0.09757325648864049,"ly":0.3,"lz":0.23847595578070466,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ewmHx8vQmQCZbH72jjrubL","parentId":"82amhDo89t4LPzjbshEmmD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.1951465129772808,"cy":0.1,"cz":0.29742868877631434,"lx":0.09757325648864049,"ly":0.3,"lz":0.23847595578070466,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p47WFW8gx3h8pL5rWPaE9A","parentId":"xvDTHckT6Jh3sPEoBy9XsM","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.1951465129772808,"cy":0.1,"cz":-0.28590464455701897,"lx":0.09757325648864049,"ly":0.3,"lz":0.23847595578070466,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dKSHyHzpuwjQ6u42WTMQwe","parentId":"xvDTHckT6Jh3sPEoBy9XsM","foundationId":"8JaqTz5HE2vZh6f1qWauFD","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.35},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"locked":true,"windowType":"Default","archHeight":1},{"type":"Tree","name":"Maple","flip":true,"cx":-10.024831295895067,"cy":-6.947888024156535,"cz":3.552713678800501e-15,"lx":9.499179837441329,"lz":8.91889941652548,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"17x5uLRhSti25y9wnQAD3e","selected":false,"locked":true},{"type":"Tree","name":"Maple","flip":true,"cx":7.8517108982888875,"cy":-13.70932723423602,"cz":0,"lx":10.834343460246352,"lz":10.259018050875072,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"e2bctFXk26F3cCpiZ3zcBD","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","cx":9.46029508775506,"cy":4.366435707994473,"cz":0,"lx":2,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rjMRf1bvBNLgz5CfSBmVBH","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","flip":true,"cx":6.596349525650214,"cy":7.3019799091519495,"cz":0,"lx":2,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"4nuj6tR4dp4bVWBFmJcLMX","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","flip":true,"cx":12.109444732702052,"cy":1.502490145889622,"cz":0,"lx":2,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"coNQQ9v27FUH4psYEEKrzU","selected":false,"locked":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.004578461502795039,"cy":-0.18228950583714837,"cz":7.217657963251398,"lx":10.906,"ly":5.23,"lz":0.046,"showLabel":false,"normal":[0,-0.4097333676171505,0.9122053318530369],"rotation":[0.4221617487320859,0,0],"color":"#fff","parentType":"Roof","parentId":"1iq4TPqH8xr1w2VxMAh8MU","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"e4qFnFipJKb5qm8a1HUcvh","selected":false,"locked":true},{"type":"Human","name":"June","cx":5.394006234886843,"cy":5.908204264429319,"cz":0.05000000074505806,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"tW2AiaFFEyE2Ns8f1NeVn4","selected":false,"ly":0.65,"locked":true},{"type":"Tree","name":"Maple","flip":true,"cx":-5.079938766417403,"cy":-11.600796953463268,"cz":8.881784197001252e-16,"lx":9.499179837441329,"lz":8.91889941652548,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"sFTDyq1WHUnyaCtK8Et8T3","selected":false,"locked":true},{"type":"Wall","cx":-0.5668843269198223,"cy":3.3269838316456033,"cz":2.2408122612280286,"lx":3.1143702580201373,"ly":0.1,"lz":2.5,"leftJoints":["5JFnb9etkW9gKawcVectpr"],"rightJoints":["4EuwNxKwuEQyYWKDv2pmPC"],"leftPoint":[0.9903008020902468,3.3269838316456037,0.06568375039354474],"rightPoint":[-2.1240694559298916,3.3269838316456037,0.06568375039354474],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"id":"vN4erE1LRomCSRmHUxy4kc","parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","wallStructure":"Stud","structureSpacing":3,"structureColor":"white","structureWidth":0.16,"opacity":0,"roofId":"niExsBvaYVQdEU42Cfexz9","selected":false,"leftRoofHeight":2.5,"rightRoofHeight":2.5,"locked":true,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"type":"Wall","cx":0.9903008020902477,"cy":0.19539461285221188,"cz":2.2301039869226305,"lx":6.263178437586782,"ly":0.1,"lz":2.5,"leftJoints":["oDVTwfwNuCQjh6t1rv6GNB"],"rightJoints":["vN4erE1LRomCSRmHUxy4kc"],"leftPoint":[0.9903008020902475,-2.936194605941179,0.06568375039354474],"rightPoint":[0.9903008020902482,3.326983831645603,0.06568375039354474],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"id":"5JFnb9etkW9gKawcVectpr","parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","wallStructure":"Stud","structureSpacing":3,"structureColor":"white","structureWidth":0.16,"opacity":0,"roofId":"niExsBvaYVQdEU42Cfexz9","selected":false,"leftRoofHeight":2.5,"rightRoofHeight":2.5,"locked":true,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"type":"Wall","cx":-2.1240694559298916,"cy":0.19539461285221216,"cz":2.228839888904333,"lx":6.263178437586782,"ly":0.3,"lz":2.5,"leftJoints":["vN4erE1LRomCSRmHUxy4kc"],"rightJoints":["oDVTwfwNuCQjh6t1rv6GNB"],"leftPoint":[-2.1240694559298916,3.3269838316456037,0.06568375039354474],"rightPoint":[-2.1240694559298934,-2.9361946059411803,0.06568375039354474],"relativeAngle":-1.570796326794897,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"id":"4EuwNxKwuEQyYWKDv2pmPC","parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","wallStructure":"Stud","structureSpacing":3,"structureColor":"white","structureWidth":0.2,"opacity":0,"roofId":"niExsBvaYVQdEU42Cfexz9","selected":false,"leftRoofHeight":2.5,"rightRoofHeight":2.5,"locked":true,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"type":"Wall","cx":-0.5668843269198227,"cy":-2.9361946059411808,"cz":2.268765007024547,"lx":3.11437025802014,"ly":0.3,"lz":2.5,"leftJoints":["4EuwNxKwuEQyYWKDv2pmPC"],"rightJoints":["5JFnb9etkW9gKawcVectpr"],"leftPoint":[-2.1240694559298934,-2.9361946059411803,0.06568375039354474],"rightPoint":[0.9903008020902475,-2.936194605941179,0.06568375039354474],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#009ce0","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"id":"oDVTwfwNuCQjh6t1rv6GNB","parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","wallStructure":"Pillar","structureSpacing":3,"structureColor":"white","structureWidth":0.2,"opacity":0,"roofId":"niExsBvaYVQdEU42Cfexz9","selected":false,"leftRoofHeight":2.5,"rightRoofHeight":2.5,"locked":true,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.5,"rightTopPartialHeight":2.5},{"id":"niExsBvaYVQdEU42Cfexz9","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,0.692197581340951],"parentId":"hGX3VDUCbUqQb4byUBd7zY","foundationId":"hGX3VDUCbUqQb4byUBd7zY","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture Default","thickness":0.1,"wallsId":["oDVTwfwNuCQjh6t1rv6GNB"],"rightRidgeLength":1.3155130008385778,"leftRidgeLength":1.2587510331302654,"selected":false,"locked":true,"rise":0,"ceiling":false},{"type":"Foundation","cx":-0.26272797008951887,"cy":8.1604401446677,"cz":0.05,"lx":5.309542023727572,"ly":8.144294099873703,"lz":0.06568375039354474,"normal":[0,0,1],"rotation":[0,0,0.692197581340951],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hGX3VDUCbUqQb4byUBd7zY","selected":false,"locked":true,"notBuilding":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Hip","roofStructure":"Default","wallsId":["5ExmWkfAba5nuC3xfHo5vU"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,2.2630282695164783],"parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","id":"gJReW7hpA5RV4sDmYkftax","leftRidgeLength":-1.2155130008385777,"rightRidgeLength":1.3155130008385778,"locked":true,"rise":1.3681252475370629,"ceiling":false},{"type":"Polygon","cx":0.04278236969738311,"cy":-0.2560980400226438,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.08333333333333333,"y":-0.4166666666666667},{"x":-0.08333333333333333,"y":-0.25},{"x":0.08333333333333333,"y":-0.25},{"x":0.08333333333333333,"y":-0.4166666666666667}],"parentId":"beHqET5NN8aNdsuBncMpY7","parentType":"Wall","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"filled":true,"selectedIndex":1,"id":"ikVqMPzpwnqJzyuQKJnm3R","text":"1204","fontColor":"gold","fontSize":0.6,"fontStrokeWidth":0.01,"noOutline":true,"opacity":0,"locked":true},{"type":"Door","cx":-0.020833333333333332,"cy":0,"cz":-0.041666666666666664,"lx":0.2916666666666667,"ly":0,"lz":0.9166666666666666,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"n3r5S7QrbxSVjZ7xS5KyLu","locked":true,"interior":true},{"type":"Door","cx":-0.2792719769465921,"cy":0,"cz":-0.024999999999999984,"lx":0.36339744091590337,"ly":0,"lz":0.9500000000000001,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"82amhDo89t4LPzjbshEmmD","foundationId":"8JaqTz5HE2vZh6f1qWauFD","id":"igRWHnMRS6fxTHqNXYPWef","locked":true,"interior":true},{"type":"Door","cx":0.2792719769465921,"cy":0,"cz":-0.024999999999999984,"lx":0.36339744091590337,"ly":0,"lz":0.9500000000000001,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"xvDTHckT6Jh3sPEoBy9XsM","foundationId":"8JaqTz5HE2vZh6f1qWauFD","id":"qMCLuvG8BqaZaKpZzUtedz","locked":true,"interior":true},{"type":"Window","cx":3.404624864058591,"cy":2.7885016621952796,"cz":6.004798871333477,"lx":3.4895626397811177,"ly":0.1,"lz":0.17796770265695697,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6875112116901372,0,3.141592653589793],"parentId":"wFnXk782R98H6AT2RALp7W","parentType":"Roof","foundationId":"8JaqTz5HE2vZh6f1qWauFD","id":"7jkKGZrNg3fgmgiepuiVd6","polygonTop":[-0.4938087607108084,3.421264074035363],"locked":true},{"type":"Window","cx":3.296162482623047,"cy":-2.8950100151340963,"cz":6.019804579108658,"lx":3.6646685608352865,"ly":0.1,"lz":0.1258033813461092,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6875112116901371,0,-2.220446049250313e-16],"parentId":"wFnXk782R98H6AT2RALp7W","parentType":"Roof","foundationId":"8JaqTz5HE2vZh6f1qWauFD","id":"8TA7azNRBiNJHZ7UE6h9mn","polygonTop":[0.4950567748754359,3.3542143495155483],"locked":true},{"type":"Window","cx":0.1444278091371094,"cy":4.845674679128341,"cz":6.11808489875612,"lx":5.117648906007396,"ly":0.1,"lz":0.03540983073830939,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.4221617487320861,0,3.141592653589793],"parentId":"1iq4TPqH8xr1w2VxMAh8MU","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"tR6G6HakBCyhofJHaGkXmp","polygonTop":[0.01012300685908669,5.088349513682089],"locked":true}],"sceneRadius":32,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.504837297056488,2.0699150930784547,0.000003503755702267236],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.504837297056488,2.0689147156290253,150],"theme":"Forest","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[25.3008289766012,0.2505638757784885,4.9037705563101905],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":43.16939043526372,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-1.0370877496821287,2.0688812675610166,1.5303345515052023],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},440:function(e){e.exports=JSON.parse('{"docid":"vK6VS27r7ebuK4Vrn5FXEP","time":"06/15/2023 09:51 am","timestamp":1686837060482,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"10/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":10.473983232081025,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.22738864151314608,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.8212100903152013,"type":"Foundation","solarPowerTower":{},"lx":13.564552414056891,"lz":1.5,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.75,"enableGroupMaster":false,"color":"#999999","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":0,"lx":12,"relativeAngle":3.141592653589793,"lz":4.0189625473598385,"roofId":"nbw17kYeUHp1aouuScuF3Y","ly":0.3,"rightPoint":[-5.457020109151015,3.478026472724187,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture #10","leftPoint":[6.542979890848985,3.478026472724187,0.1],"type":"Wall","rightRoofHeight":4.0189625473598385,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4.0189625473598385,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.5429798908489842,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":3.478026472724187,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.542979890848985,"leftPoint":[6.542979890848985,-4.021973527275812,0.1],"cy":-0.27197352727581237,"leftRoofHeight":4.0189625473598385,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.542979890848985,3.478026472724187,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":7.5,"normal":[0,0,1],"lz":4.0189625473598385,"centerRoofHeight":[-0.022465454047944533,6.807600955038734],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":1.2992388529678256,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #10","rightRoofHeight":4.0189625473598385,"roofId":"nbw17kYeUHp1aouuScuF3Y","color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"lx":7.5,"windows":[],"lz":4.0189625473598385,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"nbw17kYeUHp1aouuScuF3Y","selected":false,"cy":-0.27197352727581237,"cz":2.586710917765224,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0.022465454047944533,6.807600955038734],"rightPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture #10","rightRoofHeight":4.0189625473598385,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.457020109151015,3.478026472724187,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4.0189625473598385,"ly":0.3,"cx":-5.457020109151015,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"showLabel":false,"cx":0.5429798908489842,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.542979890848985,-4.021973527275812,0.1],"cz":2.4938633836176103,"textureType":"Wall Texture #10","cy":-4.021973527275812,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"nbw17kYeUHp1aouuScuF3Y","leftPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"ly":0.3,"lz":4.0189625473598385,"leftRoofHeight":4.0189625473598385,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4.0189625473598385,"lx":12,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.05,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Foundation","ly":9.25428200301757,"lz":1.5,"rotation":[0,0,0],"cz":0.75,"cx":-3.7362314250129023,"lx":6.612524274166,"parentId":"Ground","solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"solarUpdraftTower":{},"normal":[0,0,1],"cy":-1.5723524020196393,"id":"8fpWrU7qVyVgipB7LtABom","color":"#999999","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"showLabel":false,"cz":3.903941909848086,"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","lz":6,"ly":0.1,"leftRoofHeight":6,"relativeAngle":3.141592653589793,"rightRoofHeight":6,"leftJoints":["4Q8KDQDxyuamkEtRJU3paR"],"lx":1.1421683491180719,"windows":[],"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"rightJoints":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Wall Texture #10","cx":-0.03446770657950715,"leftPoint":[0.5366164679795284,1.8199505814331163,1.5],"type":"Wall","rightPoint":[-0.6055518811385436,1.8199505814331163,1.5],"id":"bKLMq3WjuxRcsMDb5d4Xo1","cy":1.8199505814331163,"normal":[0,0,1],"selected":false,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","centerRoofHeight":[0,6.823266113240277],"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.034605844072436,"rightUnfilledHeight":4.034605844072436,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"normal":[0,0,1],"leftJoints":["7xigJB2WiCCrREDc2Ja3YN"],"lz":6,"selected":false,"ly":0.1,"cz":3.5644394786617815,"id":"4Q8KDQDxyuamkEtRJU3paR","rotation":[0,0,0],"cy":0.25713866261073326,"rightJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"leftPoint":[0.5366164679795284,-1.3056732562116498,1.5],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","textureType":"Wall Texture #10","cx":0.5366164679795284,"showLabel":false,"leftRoofHeight":6,"foundationId":"8fpWrU7qVyVgipB7LtABom","relativeAngle":1.5707963267948966,"windows":[],"rightRoofHeight":6,"type":"Wall","parentId":"8fpWrU7qVyVgipB7LtABom","rightPoint":[0.5366164679795289,1.8199505814331163,1.5],"lx":3.125623837644766,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.299511925163531,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightJoints":["7xigJB2WiCCrREDc2Ja3YN"],"parentId":"8fpWrU7qVyVgipB7LtABom","showLabel":false,"leftRoofHeight":6,"selected":false,"id":"1ATAe6P2KAHKLDSDfpVro9","leftJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"textureType":"Wall Texture #10","cx":-0.6055518811385436,"rightPoint":[-0.6055518811385436,-1.3056732562116498,1.5],"lz":6,"relativeAngle":-1.5707963267948966,"normal":[0,0,1],"type":"Wall","cz":3.660138480027889,"rotation":[0,0,0],"leftPoint":[-0.6055518811385436,1.8199505814331163,1.5],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","foundationId":"8fpWrU7qVyVgipB7LtABom","lx":3.125623837644766,"cy":0.25713866261073326,"windows":[],"ly":0.1,"rightRoofHeight":6,"color":"#ffffff","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6,"rightUnfilledHeight":4.0310074855252225,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"ly":0,"cx":0,"type":"Roof","thickness":0.1,"ridgeLeftPoint":[0.022465454047944533,1],"textureType":"Roof Texture #7","showLabel":false,"lz":0,"normal":[0,0,1],"ridgeRightPoint":[-0.022465454047944533,1],"wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"selected":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0,"roofType":"Gable","id":"nbw17kYeUHp1aouuScuF3Y","parentId":"m7AH7DcnoGzAq9kryBy4RS","cz":0,"rotation":[0,0,0],"lx":0,"color":"#666666","locked":true,"rise":2.7886384076788957,"ceiling":true},{"rightPoint":[0.5366164679795284,-1.3056732562116498,1.5],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","selected":false,"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"cx":-0.03446770657950715,"ly":0.1,"relativeAngle":0,"cz":3.535805069111796,"rightJoints":["4Q8KDQDxyuamkEtRJU3paR"],"leftRoofHeight":6,"rightRoofHeight":6,"id":"7xigJB2WiCCrREDc2Ja3YN","normal":[0,0,1],"leftPoint":[-0.6055518811385436,-1.3056732562116498,1.5],"type":"Wall","cy":-1.3056732562116498,"leftJoints":["1ATAe6P2KAHKLDSDfpVro9"],"lz":6,"windows":[],"showLabel":false,"textureType":"Wall Texture #10","lx":1.1421683491180719,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","centerRoofHeight":[0,6.823266113240277],"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.9620846370965292,"rightUnfilledHeight":3.9620846370965292,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"normal":[0,0,1],"rotation":[0,0,0],"lz":1.5,"cz":0.75,"solarPowerTower":{},"parentId":"Ground","ly":2.3229214459557985,"lx":3.6868215598526417,"cx":6.212507460282481,"solarUpdraftTower":{},"cy":0.2598608554811861,"solarAbsorberPipe":{},"id":"3KgcTmNBqtYJcCny8HxQyQ","type":"Foundation","selected":false,"color":"#999999","locked":true,"notBuilding":true},{"id":"5eUwuiBwfGoNEpcHG5kHqK","lx":1.5,"leftJoints":["h8DQWwUSgNc283RWhcM3B1"],"rightPoint":[-0.5114783908278628,0.8698262658360515,0.1],"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftPoint":[0.9885216091721372,0.8698262658360515,0.1],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","textureType":"Wall Texture #3","cz":0,"cx":0.23852160917213716,"selected":false,"rotation":[0,0,0],"windows":[],"normal":[0,0,1],"ly":0.2,"lz":7.729424429660076,"showLabel":false,"cy":0.8698262658360515,"rightJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"type":"Wall","relativeAngle":3.141592653589793,"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.729424429660076,"rightTopPartialHeight":7.729424429660076},{"type":"Wall","leftPoint":[-0.5114783908278628,0.8698262658360515,0.1],"rotation":[0,0,0],"cy":0.1198262658360515,"lz":7.729424429660076,"textureType":"Wall Texture #3","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","ly":0.2,"rightJoints":["qQNV4qND1aDjEtJsd6HVio"],"lx":1.4999999999999998,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","windows":[],"selected":false,"leftJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"showLabel":false,"id":"hbU2xUbmKEDDXYDMWnjjCc","relativeAngle":4.71238898038469,"rightPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"normal":[0,0,1],"cz":0,"cx":-0.5114783908278628,"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.729424429660076,"rightTopPartialHeight":7.729424429660076},{"leftPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"cy":-0.6301737341639485,"rightJoints":["h8DQWwUSgNc283RWhcM3B1"],"rightPoint":[0.9885216091721372,-0.6301737341639485,0.1],"cz":0,"windows":[],"lz":7.729424429660076,"selected":false,"rotation":[0,0,0],"ly":0.2,"relativeAngle":0,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","normal":[0,0,1],"leftJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"textureType":"Wall Texture #3","parentId":"3KgcTmNBqtYJcCny8HxQyQ","lx":1.5,"showLabel":false,"cx":0.23852160917213716,"type":"Wall","id":"qQNV4qND1aDjEtJsd6HVio","studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.729424429660076,"rightTopPartialHeight":7.729424429660076},{"id":"h8DQWwUSgNc283RWhcM3B1","type":"Wall","relativeAngle":1.5707963267948966,"normal":[0,0,1],"windows":[],"leftPoint":[0.9885216091721372,-0.6301737341639485,0.1],"cz":0,"rightJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"selected":false,"textureType":"Wall Texture #3","ly":0.2,"cx":0.9885216091721372,"lx":1.5,"cy":0.1198262658360515,"rightPoint":[0.9885216091721372,0.8698262658360515,0.1],"showLabel":false,"lz":7.729424429660076,"rotation":[0,0,0],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftJoints":["qQNV4qND1aDjEtJsd6HVio"],"studWidth":0.1,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.729424429660076,"rightTopPartialHeight":7.729424429660076},{"type":"Window","showLabel":false,"ly":0.3,"lz":0.44384979425833565,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#4d4d4d","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.09751468078404088,"selected":false,"cx":-0.375,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#4d4d4d","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.09751468078404088,"normal":[0,0,1],"cx":-0.20833333333333334,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.20833333333333334,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#4d4d4d","cz":-0.09751468078404088,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0.3,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.375,"cy":0.1,"cz":-0.09751468078404088,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#4d4d4d","selected":false,"ly":0.3,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"lz":0.3942112571821837,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#4d4d4d","lx":0.13333333333333333,"cx":0.3333333333333333,"cz":-0.0726954122459649,"ly":0.3,"showLabel":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0.3,"selected":false,"type":"Window","foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0.1,"cz":0.7732940589008983,"id":"9k4wgdGyyHM5BC1r2nJbQH","lx":0.13333333333333333,"color":"#4d4d4d","lz":0.3942112571821837,"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","rotation":[0,0,0],"cx":0.01333333333333333,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.3333333333333333,"rotation":[0,0,0],"type":"Window","lz":0.3942112571821837,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":-0.0726954122459649,"lx":0.13333333333333333,"color":"#4d4d4d","cy":0.1,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.18779489182743653,"lx":0.16666666666666666,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #5","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"huHgxbUk5nxatnYiuq2HhR","locked":true,"doorType":"Default","archHeight":1,"filled":true,"frameColor":"#4d4d4d"},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Roof Texture #7","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"7MxSmgNk4kQf8eNqmnwjMJ","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":true,"rise":0.823266113240277,"ceiling":false},{"type":"Window","cx":-9.720309842961575e-17,"cy":0.1,"cz":0.3833333333333333,"lx":0.700422140587,"ly":0.3,"lz":0.26666666666666666,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7xigJB2WiCCrREDc2Ja3YN","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"bKSng9YxxhEwLmca6q52t4","shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"tint":"#73D8FF","locked":true,"mullion":true,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.18779489182743653,"lx":0.13333333333333333,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #4","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"eBQam4YYdXWFEi5iDbVQ4t","locked":true,"doorType":"Default","archHeight":1,"filled":true,"frameColor":"#4d4d4d"},{"type":"Human","name":"Julia","cx":-4.0546196737223905,"cy":-5.207889624542965,"cz":0.75,"lx":0.43,"lz":1.71,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"havSSZEB6mAoQ1s57LQVxN","selected":false,"ly":0.43,"locked":true},{"type":"Human","name":"Jeanette","cx":0.2766717538290546,"cy":-0.6581153273582476,"cz":0.21150016667646382,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cv6ws4fhTJwK38XNPpn7tw","id":"fPgwwBmXz2LWV9vPRMmqzu","selected":false,"ly":0.4,"locked":true,"flip":true},{"type":"Wall","cx":-0.006181075141490355,"cy":1.8156223325109586,"cz":3.903941909848086,"lx":1.1421683491180719,"ly":0.1,"lz":6,"leftJoints":["t6JjtmZmPqJRVZKJkbyzJi"],"rightJoints":["qnrZVcXW7sGmWiL5DxCcpP"],"leftPoint":[0.5649030994175456,1.8156223325109586,0],"rightPoint":[-0.5772652497005263,1.8156223325109586,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"34NjUPzx48JorZ5wqGUvgg","parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","studWidth":0.1,"roofId":"6XqoQpBQebVdBqY1vwaPk1","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.823266113240277],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.090518331707904,"rightUnfilledHeight":4.090518331707904,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":0.5649030994175457,"cy":0.2528104136885755,"cz":3.5644394786617815,"lx":3.125623837644766,"ly":0.1,"lz":6,"leftJoints":["i4xUARQgNSf52ouooVSiS9"],"rightJoints":["34NjUPzx48JorZ5wqGUvgg"],"leftPoint":[0.5649030994175456,-1.3100015051338076,0],"rightPoint":[0.5649030994175459,1.8156223325109586,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"t6JjtmZmPqJRVZKJkbyzJi","parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","studWidth":0.1,"roofId":"6XqoQpBQebVdBqY1vwaPk1","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.028013889590567,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-0.5772652497005263,"cy":0.2528104136885755,"cz":3.660138480027889,"lx":3.125623837644766,"ly":0.1,"lz":6,"leftJoints":["34NjUPzx48JorZ5wqGUvgg"],"rightJoints":["i4xUARQgNSf52ouooVSiS9"],"leftPoint":[-0.5772652497005263,1.8156223325109586,0],"rightPoint":[-0.5772652497005263,-1.3100015051338076,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qnrZVcXW7sGmWiL5DxCcpP","parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","studWidth":0.1,"roofId":"6XqoQpBQebVdBqY1vwaPk1","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6,"rightUnfilledHeight":4.1364823542733955,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-0.006181075141490355,"cy":-1.3100015051338076,"cz":3.535805069111796,"lx":1.1421683491180719,"ly":0.1,"lz":6,"leftJoints":["qnrZVcXW7sGmWiL5DxCcpP"],"rightJoints":["t6JjtmZmPqJRVZKJkbyzJi"],"leftPoint":[-0.5772652497005263,-1.3100015051338076,0],"rightPoint":[0.5649030994175456,-1.3100015051338076,0],"relativeAngle":0,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"i4xUARQgNSf52ouooVSiS9","parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","studWidth":0.1,"roofId":"6XqoQpBQebVdBqY1vwaPk1","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.823266113240277],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.7865681839342544,"rightUnfilledHeight":3.7865681839342544,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-9.720309842961575e-17,"cy":0.1,"cz":0.3833333333333333,"lx":0.700422140587,"ly":0.3,"lz":0.26666666666666666,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"cwyjixUkvZfY5coPeNcNNJ","parentId":"i4xUARQgNSf52ouooVSiS9","foundationId":"av7Scm9oWip67CGVAb3HwH","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"id":"6XqoQpBQebVdBqY1vwaPk1","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"av7Scm9oWip67CGVAb3HwH","foundationId":"av7Scm9oWip67CGVAb3HwH","roofType":"Gable","textureType":"Roof Texture #7","thickness":0.1,"wallsId":["qnrZVcXW7sGmWiL5DxCcpP"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":true,"rise":0.823266113240277,"ceiling":false},{"type":"Foundation","cx":0.24223269105650805,"cy":-1.5680241530974817,"cz":0.75,"lx":1.6067507475074267,"ly":9.245625505173257,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"av7Scm9oWip67CGVAb3HwH","selected":false,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","cx":-0.6856567353991228,"cy":2.1936412961014904,"cz":3.903941909848086,"lx":1.1421683491180716,"ly":0.1,"lz":6,"leftJoints":["v49PfQ59VkByq57ohKX9uA"],"rightJoints":["eq4bXeL88bLi2xVeWkyogN"],"leftPoint":[-0.11457256084008716,2.1936412961014904,1.5],"rightPoint":[-1.2567409099581588,2.1936412961014904,1.5],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j2TVMgjH32U1V7YuWfrYce","parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","studWidth":0.1,"roofId":"o79bdk9md4xmEmamE9jZDk","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.823266113240277],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.114887562223342,"rightUnfilledHeight":4.114887562223342,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-0.11457256084008716,"cy":0.6308293772791074,"cz":3.5644394786617815,"lx":3.125623837644766,"ly":0.1,"lz":6,"leftJoints":["dofmNpVnoyUD6poUbEH92H"],"rightJoints":["j2TVMgjH32U1V7YuWfrYce"],"leftPoint":[-0.11457256084008716,-0.9319825415432756,1.5],"rightPoint":[-0.11457256084008716,2.1936412961014904,1.5],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"v49PfQ59VkByq57ohKX9uA","parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","studWidth":0.1,"roofId":"o79bdk9md4xmEmamE9jZDk","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.062467969251437,"rightUnfilledHeight":6,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-1.2567409099581588,"cy":0.6308293772791074,"cz":3.660138480027889,"lx":3.125623837644766,"ly":0.1,"lz":6,"leftJoints":["j2TVMgjH32U1V7YuWfrYce"],"rightJoints":["dofmNpVnoyUD6poUbEH92H"],"leftPoint":[-1.2567409099581588,2.1936412961014904,1.5],"rightPoint":[-1.2567409099581588,-0.9319825415432756,1.5],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eq4bXeL88bLi2xVeWkyogN","parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","studWidth":0.1,"roofId":"o79bdk9md4xmEmamE9jZDk","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6,"rightUnfilledHeight":4.049169946024193,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-0.6856567353991228,"cy":-0.9319825415432756,"cz":3.535805069111796,"lx":1.1421683491180716,"ly":0.1,"lz":6,"leftJoints":["eq4bXeL88bLi2xVeWkyogN"],"rightJoints":["v49PfQ59VkByq57ohKX9uA"],"leftPoint":[-1.2567409099581588,-0.9319825415432756,1.5],"rightPoint":[-0.11457256084008716,-0.9319825415432756,1.5],"relativeAngle":0,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dofmNpVnoyUD6poUbEH92H","parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","studWidth":0.1,"roofId":"o79bdk9md4xmEmamE9jZDk","selected":false,"leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,6.823266113240277],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.9479613094983987,"rightUnfilledHeight":3.9479613094983987,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-9.720309842961575e-17,"cy":0.1,"cz":0.3833333333333333,"lx":0.700422140587,"ly":0.3,"lz":0.26666666666666666,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"3EDLJ75vzk99MpdxpHr4hh","parentId":"dofmNpVnoyUD6poUbEH92H","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"id":"o79bdk9md4xmEmamE9jZDk","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"jkuhEvcKWfSvDRMRBsqBXk","foundationId":"jkuhEvcKWfSvDRMRBsqBXk","roofType":"Gable","textureType":"Roof Texture #7","thickness":0.1,"wallsId":["eq4bXeL88bLi2xVeWkyogN"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":true,"rise":0.823266113240277,"ceiling":false},{"type":"Foundation","cx":5.151890032982978,"cy":-1.8906835088164353,"cz":0.75,"lx":2.7786220563926096,"ly":10.001663432354322,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jkuhEvcKWfSvDRMRBsqBXk","selected":false,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","cx":-0.0729406966879953,"cy":2.9131022913654188,"cz":0,"lx":8.077654819551407,"ly":0.3,"lz":4.0189625473598385,"leftJoints":["5qopMgXVhuWqLTTbgdg2C8"],"rightJoints":["tQatQTQ6mQZuwKjoqupSL4"],"leftPoint":[3.965886713087709,2.9131022913654188,0.1],"rightPoint":[-4.111768106463698,2.9131022913654188,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2QkXRbu2NTc1FDQpK7icS4","parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","studWidth":0.1,"roofId":"uvH1MqzefQ1iAsExpBtN4M","selected":false,"leftRoofHeight":4.0189625473598385,"rightRoofHeight":4.0189625473598385,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","cx":3.965886713087709,"cy":-0.1655182683590748,"cz":1.2992388529678256,"lx":6.157241119448987,"ly":0.3,"lz":4.0189625473598385,"leftJoints":["1ep2Qk4inm58Y7PxoRguRG"],"rightJoints":["2QkXRbu2NTc1FDQpK7icS4"],"leftPoint":[3.965886713087709,-3.2441388280835683,0.1],"rightPoint":[3.965886713087709,2.9131022913654188,0.1],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5qopMgXVhuWqLTTbgdg2C8","parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","studWidth":0.1,"roofId":"uvH1MqzefQ1iAsExpBtN4M","selected":false,"leftRoofHeight":4.0189625473598385,"rightRoofHeight":4.0189625473598385,"centerRoofHeight":[-0.022465454047944533,6.384556049599329],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","cx":-4.111768106463698,"cy":-0.1655182683590748,"cz":2.586710917765224,"lx":6.157241119448987,"ly":0.3,"lz":4.0189625473598385,"leftJoints":["2QkXRbu2NTc1FDQpK7icS4"],"rightJoints":["1ep2Qk4inm58Y7PxoRguRG"],"leftPoint":[-4.111768106463698,2.9131022913654188,0.1],"rightPoint":[-4.111768106463698,-3.2441388280835683,0.1],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tQatQTQ6mQZuwKjoqupSL4","parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","studWidth":0.1,"roofId":"uvH1MqzefQ1iAsExpBtN4M","selected":false,"leftRoofHeight":4.0189625473598385,"rightRoofHeight":4.0189625473598385,"centerRoofHeight":[0.022465454047944533,6.384556049599329],"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"type":"Wall","cx":-0.0729406966879953,"cy":-3.2441388280835683,"cz":2.4938633836176103,"lx":8.077654819551407,"ly":0.3,"lz":4.0189625473598385,"leftJoints":["tQatQTQ6mQZuwKjoqupSL4"],"rightJoints":["5qopMgXVhuWqLTTbgdg2C8"],"leftPoint":[-4.111768106463698,-3.2441388280835683,0.1],"rightPoint":[3.965886713087709,-3.2441388280835683,0.1],"relativeAngle":0,"textureType":"Wall Texture #10","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1ep2Qk4inm58Y7PxoRguRG","parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","studWidth":0.1,"roofId":"uvH1MqzefQ1iAsExpBtN4M","selected":false,"leftRoofHeight":4.0189625473598385,"rightRoofHeight":4.0189625473598385,"locked":true,"wallStructure":"Default","structureSpacing":0.41,"structureWidth":0.05,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385},{"id":"uvH1MqzefQ1iAsExpBtN4M","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,0],"parentId":"ifK63owceWoNBq3LMhjcHs","foundationId":"ifK63owceWoNBq3LMhjcHs","roofType":"Gable","textureType":"Roof Texture #7","thickness":0.1,"wallsId":["1ep2Qk4inm58Y7PxoRguRG"],"ridgeLeftPoint":[0.022465454047944533,1],"ridgeRightPoint":[-0.022465454047944533,1],"selected":false,"locked":true,"rise":2.3655935022394905,"ceiling":false},{"type":"Foundation","cx":10.465737313188763,"cy":0.5916447850218542,"cz":0.05,"lx":10.00769643062065,"ly":8.714303918225442,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ifK63owceWoNBq3LMhjcHs","selected":false,"locked":true,"notBuilding":true},{"type":"Door","cx":0,"cy":0,"cz":-0.12558978365487306,"lx":0.7427898485433437,"ly":0,"lz":0.7488204326902539,"textureType":"Door Texture #9","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1ep2Qk4inm58Y7PxoRguRG","foundationId":"ifK63owceWoNBq3LMhjcHs","id":"eL15oTbziWLZJbMNpssTck","locked":true,"doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"6fPaBMTjYg9NPR7fFaHY6L","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.16546497475722394,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"mrb9waVHrsnfat2WgDHgMt","parentId":"2QkXRbu2NTc1FDQpK7icS4","foundationId":"ifK63owceWoNBq3LMhjcHs","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.26782910355972656,"cy":0.1,"cz":5.524923467398277e-17,"lx":0.08333333333333333,"ly":0.3,"lz":0.49764086538050767,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"2H38SarX7MqKe9NrSJLU3c","parentId":"2QkXRbu2NTc1FDQpK7icS4","foundationId":"ifK63owceWoNBq3LMhjcHs","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03248208022392633,"cy":0.1,"cz":0.6842561898981983,"lx":0.1624104011196317,"ly":0.3,"lz":0.3732306490353806,"mullionSpacing":0.5,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"i3Tn7iQFeRuNXmrH6GPDQq","parentId":"5qopMgXVhuWqLTTbgdg2C8","foundationId":"ifK63owceWoNBq3LMhjcHs","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"locked":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Cuboid","cx":2.2577642180173108,"cy":-5.6453790558022865,"cz":0.1,"lx":3,"ly":1.3162306313801917,"lz":0.2,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"9Wze4XMmA39XWNbYe6ckwa","locked":true},{"type":"Cuboid","cx":2.2976038416189706,"cy":-5.4405702290503335,"cz":0.2,"lx":3,"ly":1.3162306313801917,"lz":0.4,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"cGSH1ASJyBhQtxEpSahrE8","selected":false,"locked":true},{"type":"Cuboid","cx":2.3365648968920367,"cy":-5.154286927831944,"cz":0.3,"lx":3,"ly":1.3162306313801917,"lz":0.6,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"cv6ws4fhTJwK38XNPpn7tw","selected":false,"locked":true},{"type":"Cuboid","cx":2.507062522396451,"cy":-4.8455157683194425,"cz":0.4,"lx":3,"ly":1.3162306313801917,"lz":0.8,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"ri6K8Qk4KK99vNANoaSiXZ","selected":false,"locked":true},{"type":"Cuboid","cx":2.4248821063155837,"cy":-4.531133253293998,"cz":0.5,"lx":3,"ly":1.3162306313801917,"lz":1,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"2Gn8chyesHppiqqGTQZT8a","selected":false,"locked":true},{"type":"Cuboid","cx":2.533917032120782,"cy":-4.195225691908959,"cz":0.6,"lx":3,"ly":1.3162306313801917,"lz":1.2,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"ehfdKqFJbYRYgEacHfcSrM","selected":false,"locked":true},{"type":"Wall","cx":0.0857963607111687,"cy":-0.2904374094354525,"cz":1.150915251216218,"lx":2.404566605355184,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-1.116486941966424,-0.2904374094354525,1.5],"rightPoint":[1.2880796633887615,-0.2904374094354525,1.5],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"4JmE6VzFyWnD6MemgeMrqW","parentId":"daUcFc6UnVMEpiH1CZh8Ax","foundationId":"daUcFc6UnVMEpiH1CZh8Ax","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"locked":true,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":5.066690845229112,"cy":-5.858628346969445,"cz":0.75,"lx":2.8024103470983674,"ly":0.5858813368700218,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"daUcFc6UnVMEpiH1CZh8Ax","selected":false,"locked":true},{"type":"Wall","cx":-0.010162937707880904,"cy":-0.27969729189333203,"cz":1.150915251216218,"lx":2.7842161072229072,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-1.4022709913193345,-0.27969729189333203,0],"rightPoint":[1.3819451159035727,-0.27969729189333203,0],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"vcvEWpSiXZ5AtQHJNQyqhY","parentId":"65TcBaUghe9ngQtPh9tufn","foundationId":"65TcBaUghe9ngQtPh9tufn","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":6.152095245348214,"cy":-4.760328635056652,"cz":0.75,"lx":2.915478093095909,"ly":0.7794205585653092,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"65TcBaUghe9ngQtPh9tufn","selected":false,"locked":true},{"type":"Wall","cx":-0.276566476107305,"cy":0.5996488777144623,"cz":1.150915251216218,"lx":11.731055226486902,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-6.142094089350756,0.5996488777144623,0],"rightPoint":[5.588961137136146,0.5996488777144623,0],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"k8e5KBsuGXsXGc26TdAWYM","parentId":"csYashxN5k4v6auFhKNgfA","foundationId":"csYashxN5k4v6auFhKNgfA","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":-7.493205467286131,"cy":-0.5191007727531233,"cz":0.75,"lx":12.992980587303297,"ly":1.782214080949399,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"csYashxN5k4v6auFhKNgfA","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":-0.22003149528798988,"cy":0.772395685760463,"cz":1.150915251216218,"lx":1.9858951415309851,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-1.2129790660534816,0.7723956857604638,1.5],"rightPoint":[0.7729160754775029,0.7723956857604621,1.5],"relativeAngle":-1.0062975645253129e-15,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"sY5yERTXjEfiYz5tbFrJmk","parentId":"kzThvJkRFm5Ya2iKooXQMF","foundationId":"kzThvJkRFm5Ya2iKooXQMF","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":4.743113555100415,"cy":-4.918499332768188,"cz":0.75,"lx":2.567636418672608,"ly":1.9347230107434228,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"kzThvJkRFm5Ya2iKooXQMF","selected":false,"locked":true},{"type":"Wall","cx":-0.059861706164943095,"cy":0.5378886591540968,"cz":1.150915251216218,"lx":1.9858951415309851,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-1.0528092769304358,0.5378886591540978,1.5],"rightPoint":[0.9330858646005495,0.5378886591540958,1.5],"relativeAngle":-1.0062975645253129e-15,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"8BecBzK2CPYixjaNncu9H5","parentId":"gwSpq2qFCkfhWVsvJnM5AE","foundationId":"gwSpq2qFCkfhWVsvJnM5AE","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Foundation","cx":0.42575056512061704,"cy":-5.140654078880996,"cz":0.75,"lx":2.247296840426521,"ly":1.4657089575306883,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gwSpq2qFCkfhWVsvJnM5AE","selected":false,"locked":true},{"type":"Foundation","cx":-2.9112882100701762,"cy":-6.403418415150944,"cz":0.75,"lx":8.173695480475347,"ly":1.3650515213739076,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jWpuB3xMuZWn7633AcTjQQ","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":-0.02566265362821607,"cy":0.20995571674405689,"cz":1.150915251216218,"lx":7.716839583972954,"ly":0.1,"lz":0.8018305024324359,"leftJoints":[],"rightJoints":[],"leftPoint":[-3.884082445614693,0.20995571674405689,1.5],"rightPoint":[3.8327571383582604,0.20995571674405689,1.5],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"pSkQGB7bArPhyBetUXPGRv","parentId":"jWpuB3xMuZWn7633AcTjQQ","foundationId":"jWpuB3xMuZWn7633AcTjQQ","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.2,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.8018305024324359,"rightTopPartialHeight":0.8018305024324359},{"type":"Tree","name":"Maple","cx":17.67275693788636,"cy":1.4450419691745573,"cz":0,"lx":7.6312730174756584,"lz":11.401453020556955,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fvxLBBmjibSLAyfoLcbVjh","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-5.066992481792914,"cy":-7.730957758574714,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9CLZuQC6xH4DGcZvLruk4s","selected":false,"locked":true,"flip":true},{"type":"Flower","name":"Yellow Flower","cx":-3.066992481792914,"cy":-7.730957758574714,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"c6WoCyEbuQkywzSj8xtBF2","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-1.066992481792914,"cy":-7.730957758574714,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"2agGn2N16sYDjc7TtzRo77","selected":false,"locked":true,"flip":true},{"type":"Flower","name":"Yellow Flower","cx":-7.120054695086734,"cy":-7.839525295949519,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"817xHue6rUfnaS7Rb7KYEp","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":5.193738527580392,"cy":-7.522536559524424,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"gonFzZtq1wiiYeCU4hrBiQ","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","cx":4.348603816989412,"cy":-3.7966311920217564,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ifK63owceWoNBq3LMhjcHs","id":"3BJtmEHpbtqcXXRrfQPwwr","selected":false,"locked":true},{"type":"Tree","name":"Oak","cx":-10.77654007007384,"cy":-2.788234414080616,"cz":0,"lx":8.855861155358149,"lz":10.429490037118851,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qpT1N3VZfjdrNWS4GttCXC","selected":false,"locked":true},{"type":"Human","name":"Jess","cx":2.2752160006176823,"cy":-7.071591540443462,"cz":0,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"gqeggrZFS756iNyQUnbtUf","selected":false,"locked":true},{"type":"Human","name":"Jacob","cx":0.3503088352536956,"cy":-2.663378139781919,"cz":0.75,"lx":0.8,"ly":0.8,"lz":1.82,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","id":"gesRfpbEyibu8BUu8qDy6K","selected":false,"locked":true},{"type":"Tree","name":"Elm","cx":18.756466652215924,"cy":-2.7486876275390486,"cz":0,"lx":10.046562775206576,"lz":8.109426488433453,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"rAcrYXcgzcVotvfd1MPBUS","selected":false,"locked":true},{"type":"Human","name":"James","cx":8.507664798169325,"cy":-5.727708445895644,"cz":0,"lx":0.472,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"73Mqjiw5uA1adJ6VuCj1Hf","selected":false,"locked":true,"ly":0.472},{"type":"Window","cx":0,"cy":0.3,"cz":-0.4375948219942384,"lx":0.5999999999999999,"ly":0.2,"lz":0.09893520815024884,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#ffffff","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"hbU2xUbmKEDDXYDMWnjjCc","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","id":"uREiM8jYGDR4pHGhExSRue","locked":true},{"type":"Window","cx":4.705024136514664,"cy":-2.6459148350408155,"cz":5.1903908249340365,"lx":1.017838969182642,"ly":0.1,"lz":2.4409651392693985,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"awVnqCCaufqdGFN22hhzCh","polygonTop":[-0.004246287687605959,1.3860496223503058],"locked":true},{"type":"Window","cx":-3.539719570796281,"cy":-2.6129313680432986,"cz":5.216072446970213,"lx":1.0219090902157242,"ly":0.1,"lz":2.605748416583291,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"beXK9hhAUyaFYx6f7DgTpY","polygonTop":[-0.009615353578652338,1.2933689118390408],"locked":true},{"type":"Window","cx":0.46569240547031454,"cy":-2.6095553790950374,"cz":5.2187010630636665,"lx":1.0033772100904075,"ly":0.1,"lz":2.5243075624407934,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"1fevDj1GsBSq5dNg5cXjnX","polygonTop":[-0.0091530130675596,1.325340055666175],"locked":true}],"sceneRadius":30,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-1.2466960461719456,-2.0265671834489423,-0.000001924388015203177],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-1.2466960461719456,-2.027567560894961,150],"theme":"Mountain","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[15.555852980703822,-18.310792933314314,3.245069996575005],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":53.00068653280895,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#3a8569","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[3.1288754420913087,4.629680469479072,3.245069996575005],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},441:function(e){e.exports=JSON.parse('{"docid":"9jsoUmZjFa6HRMNbZRgLRS","time":"02/04/2023 12:38 pm","timestamp":1675532324876,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Santa Fe, NM, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":35.6869752,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-105.937799},"elements":[{"type":"Human","name":"Jack","cx":8.588979243554906,"cy":-11.560427912321174,"cz":0.041681792587043624,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"nxTJLHqZjgyqZrkQWWFYNc","selected":false,"ly":0.42},{"type":"Wall","cx":4.753050582030476,"cy":10.626899890630142,"cz":0,"lx":9.506101164060953,"ly":0.3,"lz":3,"leftJoints":["n33KXHECHwqKVeBnmXbdJd"],"rightJoints":["6eXPAWMW3HwxTSXj1rA53P"],"leftPoint":[9.506101164060953,10.626899890630142,0],"rightPoint":[0,10.626899890630142,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"a4Bg19CP2z1jtLJFY16BxW","parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","roofId":"7doUCjB7UiFLbUyVdhSHA4","selected":false,"leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":9.506101164060953,"cy":7.9701749179726065,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"leftJoints":["beJH9KRXtDcaa6m4RL93xX"],"rightJoints":["a4Bg19CP2z1jtLJFY16BxW"],"leftPoint":[9.506101164060953,5.313449945315071,0],"rightPoint":[9.506101164060953,10.626899890630142,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"n33KXHECHwqKVeBnmXbdJd","parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","roofId":"7doUCjB7UiFLbUyVdhSHA4","selected":false,"leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0,"cy":8.855749908858451,"cz":0,"lx":3.542299963543381,"ly":0.3,"lz":3,"leftJoints":["a4Bg19CP2z1jtLJFY16BxW"],"rightJoints":["4SGmtgxinTGHnoFQ6qdAaP"],"leftPoint":[0,10.626899890630142,0],"rightPoint":[0,7.084599927086761,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"6eXPAWMW3HwxTSXj1rA53P","parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","roofId":"7doUCjB7UiFLbUyVdhSHA4","selected":false,"leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-4.27774552382743,"cy":7.084599927086761,"cz":0,"lx":8.55549104765486,"ly":0.3,"lz":3,"leftJoints":["6eXPAWMW3HwxTSXj1rA53P"],"rightJoints":["6iedjZED9QspL73RvXyJ4d"],"leftPoint":[0,7.084599927086761,0],"rightPoint":[-8.55549104765486,7.084599927086761,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"4SGmtgxinTGHnoFQ6qdAaP","parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","roofId":"7doUCjB7UiFLbUyVdhSHA4","selected":false,"leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Foundation","cx":-0.9875375953656599,"cy":0.44615496717367314,"cz":0.05,"lx":40.39365311700692,"ly":26.5055971077695,"lz":0.08336358648077638,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7ZHXRj1w61cveRC3gvedyo","selected":false,"enableGroupMaster":true},{"type":"Wall","cx":-8.961026955741858,"cy":7.857997137758722,"cz":0,"lx":3.615158317694301,"ly":0.3,"lz":5,"leftJoints":["xuK1PJLtnxrY5qEw5Jrz2o"],"rightJoints":["hCvpR7Qt8oZW3kx27Ef8k6"],"leftPoint":[-7.1534477968947074,7.857997137758721,0],"rightPoint":[-10.768606114589009,7.857997137758723,0],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"uDQQEBasztVc5Fw2jHnuGP","parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","roofId":"7C84Wu1AsADHbFygjWBmQ9","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-7.197945741195914,"cy":10.175838580765596,"cz":0,"lx":4.636537079315653,"ly":0.3,"lz":5,"leftJoints":["vsD1vwp8qSW44JbcubZkXV"],"rightJoints":["uDQQEBasztVc5Fw2jHnuGP"],"leftPoint":[-7.242443685497121,12.493680023772473,0],"rightPoint":[-7.1534477968947074,7.857997137758721,0],"relativeAngle":-1.5516006743615667,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"xuK1PJLtnxrY5qEw5Jrz2o","parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","roofId":"7C84Wu1AsADHbFygjWBmQ9","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-10.768606114589009,"cy":5.3615068621475075,"cz":0,"lx":4.992980551222431,"ly":0.3,"lz":5,"leftJoints":["uDQQEBasztVc5Fw2jHnuGP"],"rightJoints":["uATyhCzseLrePeH6qe33SW"],"leftPoint":[-10.768606114589009,7.857997137758723,0],"rightPoint":[-10.768606114589009,2.865016586536292,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"hCvpR7Qt8oZW3kx27Ef8k6","parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","roofId":"7C84Wu1AsADHbFygjWBmQ9","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-8.961026955741858,"cy":2.865016586536292,"cz":0,"lx":3.615158317694301,"ly":0.3,"lz":5,"leftJoints":["hCvpR7Qt8oZW3kx27Ef8k6"],"rightJoints":["tqM54puNK2eFNMyoRHbgSP"],"leftPoint":[-10.768606114589009,2.865016586536292,0],"rightPoint":[-7.1534477968947074,2.865016586536292,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"uATyhCzseLrePeH6qe33SW","parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","roofId":"7C84Wu1AsADHbFygjWBmQ9","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Foundation","cx":-0.46263679223863563,"cy":1.9526278259940124,"cz":0.05,"lx":26.17077502865179,"ly":28.364342258415146,"lz":0.08336358648077638,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"g8MxeMM8L2RM1xR4mKCqRr","selected":false,"enableGroupMaster":false},{"type":"Wall","cx":-8.55549104765486,"cy":8.41296241341553,"cz":0,"lx":2.6567249726575364,"ly":0.3,"lz":3,"relativeAngle":1.5707963267948966,"leftPoint":[-8.55549104765486,7.084599927086761,0],"rightPoint":[-8.55549104765486,9.741324899744297,0],"leftJoints":["4SGmtgxinTGHnoFQ6qdAaP"],"rightJoints":["hDtjiJL8L1n4uHmeabkB4U"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"6iedjZED9QspL73RvXyJ4d","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-12.35793151327924,"cy":9.741324899744297,"cz":0,"lx":7.604880931248763,"ly":0.3,"lz":3,"relativeAngle":3.141592653589793,"leftPoint":[-8.55549104765486,9.741324899744297,0],"rightPoint":[-16.160371978903623,9.741324899744297,0],"leftJoints":["6iedjZED9QspL73RvXyJ4d"],"rightJoints":["e6DZMEDS2hLL8irgctx6vS"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"hDtjiJL8L1n4uHmeabkB4U","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-16.160371978903623,"cy":7.527387422529684,"cz":0,"lx":4.427874954429226,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[-16.160371978903623,9.741324899744297,0],"rightPoint":[-16.160371978903623,5.313449945315071,0],"leftJoints":["hDtjiJL8L1n4uHmeabkB4U"],"rightJoints":["7s9AjDXhyZFDC86cd8GCyQ"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"e6DZMEDS2hLL8irgctx6vS","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-17.586287153512764,"cy":5.313449945315071,"cz":0,"lx":2.8518303492182824,"ly":0.3,"lz":3,"relativeAngle":3.141592653589793,"leftPoint":[-16.160371978903623,5.313449945315071,0],"rightPoint":[-19.012202328121905,5.313449945315071,0],"leftJoints":["e6DZMEDS2hLL8irgctx6vS"],"rightJoints":["a5EWedAAgHioHmzEA7mZco"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"7s9AjDXhyZFDC86cd8GCyQ","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-19.012202328121905,"cy":0.4427874954429223,"cz":0,"lx":9.741324899744297,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[-19.012202328121905,5.313449945315071,0],"rightPoint":[-19.012202328121905,-4.427874954429226,0],"leftJoints":["7s9AjDXhyZFDC86cd8GCyQ"],"rightJoints":["qL7VdZTbY3pmPL7NfVed4R"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"a5EWedAAgHioHmzEA7mZco","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-16.160371978903623,"cy":-4.427874954429226,"cz":0,"lx":5.7036606984365665,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[-19.012202328121905,-4.427874954429226,0],"rightPoint":[-13.308541629685338,-4.427874954429226,0],"leftJoints":["a5EWedAAgHioHmzEA7mZco"],"rightJoints":["fn57GZtoH28juoAimKo6sD"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"qL7VdZTbY3pmPL7NfVed4R","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-13.308541629685338,"cy":-7.084599927086762,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[-13.308541629685338,-4.427874954429226,0],"rightPoint":[-13.308541629685338,-9.741324899744297,0],"leftJoints":["qL7VdZTbY3pmPL7NfVed4R"],"rightJoints":["9SBa3hK2RVhjPz2Nqh1iCG"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"fn57GZtoH28juoAimKo6sD","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-9.030796105857908,"cy":-9.741324899744297,"cz":0,"lx":8.555491047654861,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[-13.308541629685338,-9.741324899744297,0],"rightPoint":[-4.753050582030476,-9.741324899744297,0],"leftJoints":["fn57GZtoH28juoAimKo6sD"],"rightJoints":["iYnhW4g6qEKdNus5mK9fsA"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"9SBa3hK2RVhjPz2Nqh1iCG","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-4.753050582030476,"cy":-7.084599927086762,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"relativeAngle":1.5707963267948966,"leftPoint":[-4.753050582030476,-9.741324899744297,0],"rightPoint":[-4.753050582030476,-4.427874954429226,0],"leftJoints":["9SBa3hK2RVhjPz2Nqh1iCG"],"rightJoints":["6pHr36CrawF8YcpXm7jL2B"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"iYnhW4g6qEKdNus5mK9fsA","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-0.4753050582030476,"cy":-4.427874954429226,"cz":0,"lx":8.555491047654858,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[-4.753050582030476,-4.427874954429226,0],"rightPoint":[3.802440465624381,-4.427874954429226,0],"leftJoints":["iYnhW4g6qEKdNus5mK9fsA"],"rightJoints":["danskvNGt22kxxX25ZKZed"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"6pHr36CrawF8YcpXm7jL2B","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":3.802440465624381,"cy":-7.084599927086762,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[3.802440465624381,-4.427874954429226,0],"rightPoint":[3.802440465624381,-9.741324899744297,0],"leftJoints":["6pHr36CrawF8YcpXm7jL2B"],"rightJoints":["wg6dFewM89iG6naCdP3n3V"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"danskvNGt22kxxX25ZKZed","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":8.55549104765486,"cy":-9.741324899744297,"cz":0,"lx":9.506101164060958,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[3.802440465624381,-9.741324899744297,0],"rightPoint":[13.308541629685338,-9.741324899744297,0],"leftJoints":["danskvNGt22kxxX25ZKZed"],"rightJoints":["rpaC6fdHvBmen4T9c95DSG"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"wg6dFewM89iG6naCdP3n3V","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":13.308541629685338,"cy":-7.084599927086762,"cz":0,"lx":5.313449945315071,"ly":0.3,"lz":3,"relativeAngle":1.5707963267948966,"leftPoint":[13.308541629685338,-9.741324899744297,0],"rightPoint":[13.308541629685338,-4.427874954429226,0],"leftJoints":["wg6dFewM89iG6naCdP3n3V"],"rightJoints":["pHPE8SbRWTKrpBzChi8YzX"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"rpaC6fdHvBmen4T9c95DSG","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":15.685066920700574,"cy":-4.427874954429226,"cz":0,"lx":4.753050582030474,"ly":0.3,"lz":3,"relativeAngle":0,"leftPoint":[13.308541629685338,-4.427874954429226,0],"rightPoint":[18.061592211715812,-4.427874954429226,0],"leftJoints":["rpaC6fdHvBmen4T9c95DSG"],"rightJoints":["hoTvGY2rqMy7seoYfMRRTd"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"pHPE8SbRWTKrpBzChi8YzX","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":18.061592211715812,"cy":2.6567249726575355,"cz":0,"lx":14.169199854173524,"ly":0.3,"lz":3,"relativeAngle":1.5707963267948966,"leftPoint":[18.061592211715812,-4.427874954429226,0],"rightPoint":[18.061592211715812,9.741324899744297,0],"leftJoints":["pHPE8SbRWTKrpBzChi8YzX"],"rightJoints":["j5t6bBkxWAT3r9CjT4GP8B"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"hoTvGY2rqMy7seoYfMRRTd","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":15.685066920700574,"cy":9.741324899744297,"cz":0,"lx":4.753050582030474,"ly":0.3,"lz":3,"relativeAngle":3.141592653589793,"leftPoint":[18.061592211715812,9.741324899744297,0],"rightPoint":[13.308541629685338,9.741324899744297,0],"leftJoints":["hoTvGY2rqMy7seoYfMRRTd"],"rightJoints":["9M2paYYKiDyFzdP7AKGC3T"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"j5t6bBkxWAT3r9CjT4GP8B","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":13.308541629685338,"cy":7.527387422529684,"cz":0,"lx":4.427874954429226,"ly":0.3,"lz":3,"relativeAngle":-1.5707963267948966,"leftPoint":[13.308541629685338,9.741324899744297,0],"rightPoint":[13.308541629685338,5.313449945315071,0],"leftJoints":["j5t6bBkxWAT3r9CjT4GP8B"],"rightJoints":["beJH9KRXtDcaa6m4RL93xX"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"9M2paYYKiDyFzdP7AKGC3T","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":11.407321396873146,"cy":5.313449945315071,"cz":0,"lx":3.802440465624386,"ly":0.3,"lz":3,"relativeAngle":3.141592653589793,"leftPoint":[13.308541629685338,5.313449945315071,0],"rightPoint":[9.506101164060953,5.313449945315071,0],"leftJoints":["9M2paYYKiDyFzdP7AKGC3T"],"rightJoints":["n33KXHECHwqKVeBnmXbdJd"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"beJH9KRXtDcaa6m4RL93xX","color":"#df9b6c","roofId":"7doUCjB7UiFLbUyVdhSHA4","leftRoofHeight":3,"rightRoofHeight":3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["danskvNGt22kxxX25ZKZed","wg6dFewM89iG6naCdP3n3V","rpaC6fdHvBmen4T9c95DSG","pHPE8SbRWTKrpBzChi8YzX","hoTvGY2rqMy7seoYfMRRTd","j5t6bBkxWAT3r9CjT4GP8B","9M2paYYKiDyFzdP7AKGC3T","beJH9KRXtDcaa6m4RL93xX","n33KXHECHwqKVeBnmXbdJd","a4Bg19CP2z1jtLJFY16BxW","6eXPAWMW3HwxTSXj1rA53P","4SGmtgxinTGHnoFQ6qdAaP","6iedjZED9QspL73RvXyJ4d","hDtjiJL8L1n4uHmeabkB4U","e6DZMEDS2hLL8irgctx6vS","7s9AjDXhyZFDC86cd8GCyQ","a5EWedAAgHioHmzEA7mZco","qL7VdZTbY3pmPL7NfVed4R","fn57GZtoH28juoAimKo6sD","9SBa3hK2RVhjPz2Nqh1iCG","iYnhW4g6qEKdNus5mK9fsA","6pHr36CrawF8YcpXm7jL2B"],"textureType":"No Roof Texture","color":"#df9b6c","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"7ZHXRj1w61cveRC3gvedyo","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"7doUCjB7UiFLbUyVdhSHA4","sideColor":"#df9b6c","rise":0,"ceiling":false},{"type":"Wall","cx":-7.1534477968947074,"cy":-0.13077174419716386,"cz":0,"lx":5.991576661466917,"ly":0.3,"lz":5,"relativeAngle":-1.5707963267948966,"leftPoint":[-7.1534477968947074,2.8650165865362944,0],"rightPoint":[-7.1534477968947074,-3.126560074930622,0],"leftJoints":["uATyhCzseLrePeH6qe33SW"],"rightJoints":["7vyLAK1d3g1q4PaUuuH3M8"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"tqM54puNK2eFNMyoRHbgSP","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-4.143736556044865,"cy":12.493680023772473,"cz":0,"lx":6.197414258904514,"ly":0.3,"lz":5,"relativeAngle":3.141592653589793,"leftPoint":[-1.0450294265926074,12.493680023772473,0],"rightPoint":[-7.242443685497122,12.493680023772473,0],"leftJoints":["qEF7XtXZnzW6BxWMfbdwQU"],"rightJoints":["xuK1PJLtnxrY5qEw5Jrz2o"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"vsD1vwp8qSW44JbcubZkXV","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-1.0450294265926074,"cy":10.746136830844623,"cz":0,"lx":3.4950863858557017,"ly":0.3,"lz":5,"relativeAngle":1.5707963267948966,"leftPoint":[-1.0450294265926074,8.998593637916771,0],"rightPoint":[-1.0450294265926074,12.493680023772473,0],"leftJoints":["dYJeyws9qM6CyNBpAFDT4C"],"rightJoints":["vsD1vwp8qSW44JbcubZkXV"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"qEF7XtXZnzW6BxWMfbdwQU","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":1.537226514617607,"cy":8.998593637916771,"cz":0,"lx":5.164511882420429,"ly":0.3,"lz":5,"relativeAngle":3.141592653589793,"leftPoint":[4.119482455827821,8.998593637916771,0],"rightPoint":[-1.0450294265926074,8.998593637916771,0],"leftJoints":["xnWNtThasHmB5nj7DTLwTx"],"rightJoints":["qEF7XtXZnzW6BxWMfbdwQU"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"dYJeyws9qM6CyNBpAFDT4C","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":4.163980400129028,"cy":6.930401222471017,"cz":0,"lx":4.137342110270493,"ly":0.3,"lz":5,"relativeAngle":1.5923083871193127,"leftPoint":[4.208478344430235,4.862208807025264,0],"rightPoint":[4.119482455827821,8.998593637916771,0],"leftJoints":["e1bkiT8KZb5kq2EZtd6xkx"],"rightJoints":["dYJeyws9qM6CyNBpAFDT4C"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"xnWNtThasHmB5nj7DTLwTx","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":7.565411068003514,"cy":4.862208807025264,"cz":0,"lx":6.713865447146558,"ly":0.3,"lz":5,"relativeAngle":3.141592653589793,"leftPoint":[10.922343791576793,4.862208807025264,0],"rightPoint":[4.208478344430235,4.862208807025264,0],"leftJoints":["rBwg9zRDQVA6MAAvxTQwmb"],"rightJoints":["xnWNtThasHmB5nj7DTLwTx"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"e1bkiT8KZb5kq2EZtd6xkx","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":10.922343791576793,"cy":1.8664204762918066,"cz":0,"lx":5.991576661466915,"ly":0.3,"lz":5,"relativeAngle":1.5707963267948966,"leftPoint":[10.922343791576793,-1.1293678544416508,0],"rightPoint":[10.922343791576793,4.862208807025264,0],"leftJoints":["aEZwzvFgCTEAmsGj6SSh6G"],"rightJoints":["e1bkiT8KZb5kq2EZtd6xkx"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"rBwg9zRDQVA6MAAvxTQwmb","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":5.499606315035343,"cy":-1.1293678544416508,"cz":0,"lx":10.8454749530829,"ly":0.3,"lz":5,"relativeAngle":0,"leftPoint":[0.07686883849389224,-1.1293678544416508,0],"rightPoint":[10.922343791576793,-1.1293678544416508,0],"leftJoints":["jFwtQp4MdbPXqJBW5eWb7h"],"rightJoints":["rBwg9zRDQVA6MAAvxTQwmb"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"aEZwzvFgCTEAmsGj6SSh6G","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":0.07686883849389224,"cy":-2.1279639646861366,"cz":0,"lx":1.9971922204889714,"ly":0.3,"lz":5,"relativeAngle":1.5707963267948966,"leftPoint":[0.07686883849389224,-3.126560074930622,0],"rightPoint":[0.07686883849389224,-1.1293678544416508,0],"leftJoints":["7vyLAK1d3g1q4PaUuuH3M8"],"rightJoints":["aEZwzvFgCTEAmsGj6SSh6G"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"jFwtQp4MdbPXqJBW5eWb7h","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-3.5382894792004076,"cy":-3.126560074930622,"cz":0,"lx":7.2303166353886,"ly":0.3,"lz":5,"relativeAngle":0,"leftPoint":[-7.1534477968947074,-3.126560074930622,0],"rightPoint":[0.07686883849389224,-3.126560074930622,0],"leftJoints":["tqM54puNK2eFNMyoRHbgSP"],"rightJoints":["jFwtQp4MdbPXqJBW5eWb7h"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"7vyLAK1d3g1q4PaUuuH3M8","color":"#df9b6c","roofId":"7C84Wu1AsADHbFygjWBmQ9","leftRoofHeight":5,"rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["rBwg9zRDQVA6MAAvxTQwmb","e1bkiT8KZb5kq2EZtd6xkx","xnWNtThasHmB5nj7DTLwTx","dYJeyws9qM6CyNBpAFDT4C","qEF7XtXZnzW6BxWMfbdwQU","vsD1vwp8qSW44JbcubZkXV","xuK1PJLtnxrY5qEw5Jrz2o","uDQQEBasztVc5Fw2jHnuGP","hCvpR7Qt8oZW3kx27Ef8k6","uATyhCzseLrePeH6qe33SW","tqM54puNK2eFNMyoRHbgSP","7vyLAK1d3g1q4PaUuuH3M8","jFwtQp4MdbPXqJBW5eWb7h","aEZwzvFgCTEAmsGj6SSh6G"],"textureType":"No Roof Texture","color":"#df9b6c","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"7C84Wu1AsADHbFygjWBmQ9","sideColor":"#df9b6c","rise":0,"ceiling":false},{"type":"Wall","cx":-4.345096487504885,"cy":5.984852164118302,"cz":0,"lx":4,"ly":0.3,"lz":7,"leftJoints":["rHJy1GYK2qvXJVNLZqp4wD"],"rightJoints":["nps5Vjk1xXh8tbJUyypnno"],"leftPoint":[-2.345096487504885,5.984852164118302,0.08336358648077638],"rightPoint":[-6.345096487504885,5.984852164118302,0.08336358648077638],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"a7asXFjrAC6qt3AiY1YGsD","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":-4.345096487504885,"cy":-0.015147835881696992,"cz":0,"lx":4,"ly":0.3,"lz":7,"leftJoints":["nps5Vjk1xXh8tbJUyypnno"],"rightJoints":["xkqwYwVjduojn9HfSnXbKM"],"leftPoint":[-6.345096487504885,-0.015147835881696992,0.08336358648077638],"rightPoint":[-2.345096487504885,-0.015147835881696992,0.08336358648077638],"relativeAngle":0,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"cpDb3yAZ18RsXbHAuAXABX","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":-2.345096487504885,"cy":-2.765147835881696,"cz":0,"lx":5.500000000000002,"ly":0.3,"lz":7,"leftJoints":["cpDb3yAZ18RsXbHAuAXABX"],"rightJoints":["hzXfdodMPgDwURK77F9MeV"],"leftPoint":[-2.345096487504885,-0.015147835881695215,0.08336358648077638],"rightPoint":[-2.345096487504885,-5.515147835881697,0.08336358648077638],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"xkqwYwVjduojn9HfSnXbKM","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":-2.345096487504885,"cy":7.984852164118302,"cz":0,"lx":4,"ly":0.3,"lz":7,"leftJoints":["r2R5PZ9UN3GkeiaDktnAeY"],"rightJoints":["a7asXFjrAC6qt3AiY1YGsD"],"leftPoint":[-2.345096487504885,9.984852164118301,0.08336358648077638],"rightPoint":[-2.345096487504885,5.984852164118302,0.08336358648077638],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"rHJy1GYK2qvXJVNLZqp4wD","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":2.654903512495115,"cy":7.984852164118302,"cz":0,"lx":4,"ly":0.3,"lz":7,"leftJoints":["67wPdhvoUHXR7PuJh6jwmB"],"rightJoints":["r2R5PZ9UN3GkeiaDktnAeY"],"leftPoint":[2.654903512495115,5.984852164118302,0.08336358648077638],"rightPoint":[2.654903512495115,9.984852164118301,0.08336358648077638],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"658TiH6xarPxo2CoZwhF5b","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":6.654903512495115,"cy":5.984852164118302,"cz":0,"lx":8,"ly":0.3,"lz":7,"leftJoints":["41c9AtTSXggfJV4XdiEcAE"],"rightJoints":["658TiH6xarPxo2CoZwhF5b"],"leftPoint":[10.654903512495114,5.984852164118302,0.08336358648077638],"rightPoint":[2.654903512495115,5.984852164118306,0.08336358648077638],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"67wPdhvoUHXR7PuJh6jwmB","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":10.654903512495114,"cy":2.984852164118302,"cz":0,"lx":6,"ly":0.3,"lz":7,"leftJoints":["5oTqiHKufLbh4Es8MKzkGe"],"rightJoints":["67wPdhvoUHXR7PuJh6jwmB"],"leftPoint":[10.654903512495114,-0.015147835881696103,0.08336358648077638],"rightPoint":[10.654903512495114,5.984852164118302,0.08336358648077638],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"41c9AtTSXggfJV4XdiEcAE","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":6.904903512495115,"cy":-0.015147835881696992,"cz":0,"lx":7.5,"ly":0.3,"lz":7,"leftJoints":["f8PnD7wEXwH2ygFbDasoV3"],"rightJoints":["41c9AtTSXggfJV4XdiEcAE"],"leftPoint":[3.154903512495115,-0.015147835881696992,0.08336358648077638],"rightPoint":[10.654903512495114,-0.015147835881696992,0.08336358648077638],"relativeAngle":0,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"5oTqiHKufLbh4Es8MKzkGe","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":3.154903512495115,"cy":-2.765147835881697,"cz":0,"lx":5.5,"ly":0.3,"lz":7,"leftJoints":["hzXfdodMPgDwURK77F9MeV"],"rightJoints":["5oTqiHKufLbh4Es8MKzkGe"],"leftPoint":[3.154903512495115,-5.515147835881696,0.08336358648077638],"rightPoint":[3.154903512495115,-0.015147835881696992,0.08336358648077638],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"f8PnD7wEXwH2ygFbDasoV3","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":0.4049035124951148,"cy":-5.515147835881698,"cz":0,"lx":5.5,"ly":0.3,"lz":7,"leftJoints":["xkqwYwVjduojn9HfSnXbKM"],"rightJoints":["f8PnD7wEXwH2ygFbDasoV3"],"leftPoint":[-2.345096487504885,-5.515147835881698,0.08336358648077638],"rightPoint":[3.154903512495115,-5.515147835881697,0.08336358648077638],"relativeAngle":0,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"hzXfdodMPgDwURK77F9MeV","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Foundation","cx":2.433419492707406,"cy":5.124042977542905,"cz":0.05,"lx":23.540246238854113,"ly":24.334046586651752,"lz":0.08336358648077638,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dwSg9LvrTwKhMcJFZMtZSx","selected":false,"enableGroupMaster":false},{"type":"Wall","cx":-6.345096487504885,"cy":2.984852164118302,"cz":0,"lx":6,"ly":0.3,"lz":7,"leftJoints":["a7asXFjrAC6qt3AiY1YGsD"],"rightJoints":["cpDb3yAZ18RsXbHAuAXABX"],"leftPoint":[-6.345096487504885,5.984852164118302,0.08336358648077638],"rightPoint":[-6.345096487504885,-0.015147835881696992,0.08336358648077638],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"nps5Vjk1xXh8tbJUyypnno","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","roofId":"qpPuzrLkb9c5N87uABuvRn","selected":false,"leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","cx":0.1549035124951148,"cy":9.984852164118301,"cz":0,"lx":5,"ly":0.3,"lz":7,"leftJoints":["658TiH6xarPxo2CoZwhF5b"],"rightJoints":["rHJy1GYK2qvXJVNLZqp4wD"],"leftPoint":[2.654903512495115,9.984852164118301,0.08336358648077638],"rightPoint":[-2.345096487504885,9.984852164118301,0.08336358648077638],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#df9b6c","normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"id":"r2R5PZ9UN3GkeiaDktnAeY","parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","selected":false,"roofId":"qpPuzrLkb9c5N87uABuvRn","leftRoofHeight":7,"rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["a7asXFjrAC6qt3AiY1YGsD","nps5Vjk1xXh8tbJUyypnno","cpDb3yAZ18RsXbHAuAXABX","xkqwYwVjduojn9HfSnXbKM","hzXfdodMPgDwURK77F9MeV","f8PnD7wEXwH2ygFbDasoV3","5oTqiHKufLbh4Es8MKzkGe","41c9AtTSXggfJV4XdiEcAE","67wPdhvoUHXR7PuJh6jwmB","658TiH6xarPxo2CoZwhF5b","r2R5PZ9UN3GkeiaDktnAeY","rHJy1GYK2qvXJVNLZqp4wD"],"textureType":"No Roof Texture","color":"#df9b6c","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-2.6026888642036767],"parentId":"dwSg9LvrTwKhMcJFZMtZSx","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"qpPuzrLkb9c5N87uABuvRn","sideColor":"#df9b6c","rise":0,"ceiling":false},{"type":"Door","cx":0.02629889958936659,"cy":0,"cz":-0.08333333333333333,"lx":0.2629889958936659,"ly":0,"lz":0.8333333333333334,"textureType":"Door Texture #7","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"wg6dFewM89iG6naCdP3n3V","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"eh8QYUJbECtJYcGAUmmcbF","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.34188569466176566,"cy":0.1,"cz":0.08333333333333333,"lx":0.05259779917873318,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"wg6dFewM89iG6naCdP3n3V","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"k4NKNGGqdN9XJAC7JngQKc","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.34188569466176566,"cy":0.1,"cz":0.08333333333333333,"lx":0.05259779917873318,"ly":0.3,"lz":0.5,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gndjHJZsJ4fAEbUPhoMN8f","parentId":"wg6dFewM89iG6naCdP3n3V","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15779339753619967,"cy":0.1,"cz":-3.700743415417188e-17,"lx":0.10519559835746636,"ly":0.3,"lz":0.6666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pHPE8SbRWTKrpBzChi8YzX","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"uLMRWieC9yGWXYyj2feHNa","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20745979403699807,"cy":0.1,"cz":0.3,"lx":0.04610217645266624,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"aEZwzvFgCTEAmsGj6SSh6G","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"7ptZfruK52YBWvj7ntVHnR","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.39186849984766303,"cy":0.1,"cz":0.3,"lx":0.04610217645266624,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"aEZwzvFgCTEAmsGj6SSh6G","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"bLbWhQE8kcWeWpvQFXbQ5a","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03333333333333333,"cy":0.1,"cz":0.14285714285714285,"lx":0.06666666666666667,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"5oTqiHKufLbh4Es8MKzkGe","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"9a7QJYQGFkQBwdFtnhaCnM","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3,"cy":0.1,"cz":0.14285714285714285,"lx":0.06666666666666667,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"5oTqiHKufLbh4Es8MKzkGe","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"vi8Yq5gBqJoW5tPeYhBH7B","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3803429557344965,"cy":0.1,"cz":0.3,"lx":0.06915326467899936,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7vyLAK1d3g1q4PaUuuH3M8","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"kizJtpXqJWR6KCL438E5YJ","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2272727272727271,"cy":0.1,"cz":0.07142857142857142,"lx":0.09090909090909062,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hzXfdodMPgDwURK77F9MeV","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"g2MyW88G8QaeW7ivhwR2tv","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jess","cx":4.690272477111533,"cy":13.3005830342772,"cz":0.03336358582743005,"lx":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","id":"nTe63y4NHf8RrpW2eucqBC","selected":false,"ly":0.43},{"type":"Window","cx":-0.3418856946617659,"cy":0.1,"cz":-0.08333333333333333,"lx":0.05259779917873321,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"a4Bg19CP2z1jtLJFY16BxW","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"qJGbm5uGmW4X697uskEVvs","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Door","cx":-0.13149449794683302,"cy":0,"cz":-0.08333333333333333,"lx":0.1577933975361996,"ly":0,"lz":0.8333333333333334,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"a4Bg19CP2z1jtLJFY16BxW","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"w281yvi8VG2acGPfsqs5DF","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0.07889669876809982,"cy":0.1,"cz":-0.08333333333333333,"lx":0.05259779917873321,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"a4Bg19CP2z1jtLJFY16BxW","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"mWxzJt7m7UWEJMmH3QHQEB","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3418856946617659,"cy":0.1,"cz":-0.08333333333333333,"lx":0.05259779917873321,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"a4Bg19CP2z1jtLJFY16BxW","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"7u2aKRK5YJxj5G4bJhfnuN","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.28237583077258077,"cy":0.1,"cz":-0.25,"lx":0.08067880879216593,"ly":0.3,"lz":0.3,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vsD1vwp8qSW44JbcubZkXV","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"kJNAK2vsWPzsnxXo8yU2jJ","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.28237583077258077,"cy":0.1,"cz":0.25,"lx":0.08067880879216593,"ly":0.3,"lz":0.3,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vsD1vwp8qSW44JbcubZkXV","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"3xBVGhYk5CECo9wX6WccRP","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.28237583077258077,"cy":0.1,"cz":0.25,"lx":0.08067880879216593,"ly":0.3,"lz":0.3,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vsD1vwp8qSW44JbcubZkXV","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"vLYAPPmtNdR8BBv2dwnaPC","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.28237583077258077,"cy":0.1,"cz":-0.25,"lx":0.08067880879216593,"ly":0.3,"lz":0.3,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vsD1vwp8qSW44JbcubZkXV","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"kx7Jk3snYCbpQRqNSTwx7i","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.33885099692709686,"cy":0.1,"cz":0.3,"lx":0.0968145705505991,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"dYJeyws9qM6CyNBpAFDT4C","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"hFnZkVdXVk7kt7HuJ5EXTA","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Door","cx":0.2904437116517973,"cy":0,"cz":-0.3,"lx":0.1936291411011982,"ly":0,"lz":0.4,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dYJeyws9qM6CyNBpAFDT4C","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"hXTygNgpyWv5Q8SdkdwrBN","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0.24203642637649775,"cy":0.1,"cz":0.3,"lx":0.0968145705505991,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"dYJeyws9qM6CyNBpAFDT4C","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"42F92bD3A47C9HfuQN7TKE","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.31558679507239956,"cy":0.1,"cz":0.24999999999999997,"lx":0.21039119671493278,"ly":0.3,"lz":0.1666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"j5t6bBkxWAT3r9CjT4GP8B","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"qxRE8qmG9xHbjtVsaCxYsE","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.29586262038037425,"cy":0.1,"cz":-0.08333333333333333,"lx":0.06574724897341651,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hDtjiJL8L1n4uHmeabkB4U","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"9sATuUB81PmwXpthc9oUjo","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29586262038037425,"cy":0.1,"cz":-0.08333333333333333,"lx":0.06574724897341651,"ly":0.3,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hDtjiJL8L1n4uHmeabkB4U","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"wmRa6rPywUr54Esr4Sk1n4","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15,"cy":0.1,"cz":0.35714285714285715,"lx":0.1,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"r2R5PZ9UN3GkeiaDktnAeY","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"akprzo3hHBejx7HCAVwmQ4","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.25,"cy":0.1,"cz":0.35714285714285715,"lx":0.1,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"r2R5PZ9UN3GkeiaDktnAeY","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"kHdEwJHqbM3B6pBPMdhSph","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.28125,"cy":0.1,"cz":0.35714285714285715,"lx":0.0625,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"67wPdhvoUHXR7PuJh6jwmB","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"gSzMdys25c7EFmVM4PPcqc","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.09375,"cy":0.1,"cz":0.35714285714285715,"lx":0.0625,"ly":0.3,"lz":0.14285714285714285,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"67wPdhvoUHXR7PuJh6jwmB","foundationId":"dwSg9LvrTwKhMcJFZMtZSx","id":"osJn4P5UR44EiHtzsfapPV","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.33512735959822765,"cy":0.1,"cz":0.3,"lx":0.07447274657738392,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"e1bkiT8KZb5kq2EZtd6xkx","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"iYjDfcWBcotpYGf1tfdYtt","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.03723637328869196,"cy":0.1,"cz":0.3,"lx":0.07447274657738392,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"e1bkiT8KZb5kq2EZtd6xkx","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"1DVcZmp9unvFUD3kth4Ldt","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.33512735959822765,"cy":0.1,"cz":0.3,"lx":0.07447274657738392,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"e1bkiT8KZb5kq2EZtd6xkx","foundationId":"g8MxeMM8L2RM1xR4mKCqRr","id":"iDftHFSTHkqwMVnS3owrRR","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.16666666666666666,"lx":0.2629889958936657,"ly":0,"lz":0.6666666666666666,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beJH9KRXtDcaa6m4RL93xX","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"eAWyKBNd38qS1dYBuKrkj6","doorType":"Default","archHeight":1,"filled":true},{"type":"Flower","name":"Cactus Combo 1","cx":15.634548540985584,"cy":11.876139460714374,"cz":0.04168179258704141,"lx":2,"lz":2.35,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"wmzcYA53yLxrPfQ5v68p4e","selected":false},{"type":"Flower","name":"Cactus Combo 2","cx":18.898648680314054,"cy":11.25310807141135,"cz":0.041681792587041855,"lx":2,"lz":2.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"ekW7n1M2LiXzN32pweKLPt","selected":false},{"type":"Flower","name":"Cactus Combo 4","cx":-9.952276659759775,"cy":12.90502413689002,"cz":0.04168179258704274,"lx":2,"lz":2.69,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"g8MxeMM8L2RM1xR4mKCqRr","id":"kyZxhbtBH6PAgp5K6MDu9p","selected":false},{"type":"Flower","name":"Cactus Combo 3","cx":-16.70983030604646,"cy":11.722560280813752,"cz":0.041681792587040974,"lx":2,"lz":2.45,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"a9ApdGiziGdUumhgusYw2u","selected":false},{"type":"Human","name":"Jamelia","cx":-0.9137087061647211,"cy":10.928006147996442,"cz":0.041681792587041855,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"5QNe3ntzVQvFEHnDW2YJBn","selected":false,"ly":0.65},{"type":"Human","name":"Juro","cx":12.272662858917183,"cy":8.898453665685638,"cz":0.041681792587041855,"lx":0.494,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"jrkJAJRrbJ8LDAxvtvH9ym","selected":false,"ly":0.494},{"type":"Flower","name":"Cactus Combo 2","cx":15.729057510724607,"cy":-7.680209466829874,"cz":0.041681792587040974,"lx":2,"lz":2.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"bWKYur6DnwP6mEaL7fWHC5","selected":false},{"type":"Flower","name":"Cactus Combo 1","cx":5.786476089599912,"cy":-6.442673510815909,"cz":0.04168179258704363,"lx":2,"lz":2.35,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dwSg9LvrTwKhMcJFZMtZSx","id":"3ao3ZpduETphLg6cc8LUjj","selected":false},{"type":"Flower","name":"Cactus Combo 4","cx":-10.111033648495354,"cy":-7.125989728474186,"cz":0.04168179258704363,"lx":2,"lz":2.69,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dwSg9LvrTwKhMcJFZMtZSx","id":"uqTpdoF6iAUdixG8SfEgJj","selected":false},{"type":"Window","cx":-0.31558679507239945,"cy":0.1,"cz":0.24999999999999997,"lx":0.21039119671493292,"ly":0.3,"lz":0.1666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"j5t6bBkxWAT3r9CjT4GP8B","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"ibgD6gwHyvXo2UA5ceSEVw","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jiya","cx":10.698394787136534,"cy":11.589493889667297,"cz":0.03336358582743005,"lx":0.6,"lz":1.74,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"mMaWsSyXEBfBHccaGNhNaS","selected":false,"ly":0.6},{"type":"Human","name":"John","cx":8.199832055622817,"cy":11.636996804402608,"cz":0.033363585827429154,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"48yGEsfjgkFf6JxD4AfTys","selected":false,"ly":0.6},{"type":"Window","cx":-0.4058097887797344,"cy":0.1,"cz":0.24999999999999997,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","id":"aPAj9pnBrDVWusPRcoZUdo","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2999463656198036,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bhkdQB672T3sQvxXuVmHrR","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.19408294245987287,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hBEhSqRgj9NSNQa4oM7xNt","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.08821951929994218,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tB2iwRfd3qTWeCsYv7HiuW","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.44109759649971125,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5RkPZYVo3GN5X19Bn6Yr4D","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3705219810597575,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"59NsagWft1p9bwUyWDUzrn","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2999463656198037,"cy":0.1,"cz":0.25000000000000006,"lx":0.03528780771997702,"ly":0.3,"lz":0.1666666666666666,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"77AhVqY63vBnmESEhniVsa","parentId":"hoTvGY2rqMy7seoYfMRRTd","foundationId":"7ZHXRj1w61cveRC3gvedyo","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.05,"windowType":"Default","archHeight":1},{"type":"Cuboid","cx":-14.789681570981625,"cy":-12.821724309505734,"cz":1.3499532304431159,"lx":3.0361328512402026,"ly":2.0173847404410545,"lz":2.6999064608862318,"color":"#df9b6c","faceColors":["#df9b6c","#df9b6c","#df9b6c","#df9b6c","#df9b6c","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.0555294187969286],"parentId":"Ground","selected":false,"id":"8afBb85AbBXxrUxc1UJNK2"},{"type":"Tree","name":"Coconut","cx":10.01957056934475,"cy":-11.043888206723011,"cz":0,"lx":4.98455928150696,"lz":7.122482384126237,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"gHPxDQkjKxPPpDTbnNBT1s","selected":false},{"type":"Tree","name":"Coconut","cx":19.62542663178017,"cy":-0.8605656311368737,"cz":0.041681792587041855,"lx":4.98455928150696,"lz":7.122482384126237,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"7ZHXRj1w61cveRC3gvedyo","id":"ojssPm5w3H8Z5YiH8zAEzJ","selected":false},{"type":"Tree","name":"Coconut","cx":-5.921845166656402,"cy":-20.83835275090669,"cz":-8.881784197001252e-16,"lx":4.98455928150696,"lz":7.122482384126237,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"hiyUWsAKxmKF4tZmUy3NkH","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-12.5485886969171,-8.79449187461802,-0.000008794882783709357],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-12.5485886969171,-8.794641881286468,150],"theme":"Dune","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-9.661868463308164,-30.326442140062476,3.3023821453989806],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":37.01235612443423,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#999999","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.5760093837906188,2.4983076358188625,2.2700206595855397],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},442:function(e){e.exports=JSON.parse('{"docid":"ioJu36TzRMhQVBC6fnqBek","time":"07/20/2023 06:11 pm","timestamp":1689891095940,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"diurnalTemperatureModel":1,"longitude":-71.3488548,"sutDaysPerYear":4,"daysPerYear":4,"solarPanelVisibilityGridCellSize":0.2,"sutGridCellSize":1,"noAnimationForSensorDataCollection":false,"latitude":42.2844063,"address":"Natick, MA","discretization":"Approximate","solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2023, 12:00:00 PM","pvGridCellSize":0.5,"cspGridCellSize":0.5,"airAttenuationCoefficient":0.01,"noAnimationForThermalSimulation":false,"highestTemperatureTimeInMinutes":900,"noAnimationForSolarPanelSimulation":false,"sutTimesPerHour":1,"noAnimationForSolarUpdraftTowerSimulation":false,"timesPerHour":1,"cspTimesPerHour":1,"ground":{"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05},"dustLoss":0.05,"name":"default","countryCode":"US","cspDaysPerYear":4,"noAnimationForHeatmapSimulation":false,"airConvectiveCoefficient":5},"elements":[{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":9.90269213865045,"solarUpdraftTower":{},"ly":19.683075461124755,"lz":0.1,"parentId":"Ground","cx":-9.113689833217686,"cy":0.18995426124406656,"cz":0.05,"textureType":"No Foundation Texture","id":"9i1GeRaoeMfYcFyEXeESac","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["vGUT3JZv2v5bPwGYFugWY9"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["v2X26dL66tDwT3FmUa4dJm"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":19.021724129735727,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"emaK2k9UPEiLxchx8wQAVR","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"9QENUE5u5vX4ytePVUekD6","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[4.927202561127663,9.208552266536293,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":4.927202561127659,"cy":-0.3023097983315708,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[4.927202561127656,-9.813171863199434,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":1.5707963267948963,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["aR3TKXZKTA3DjkwyAfcrsN"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["9QENUE5u5vX4ytePVUekD6"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":9.871623613893995,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,5],"roofId":"emaK2k9UPEiLxchx8wQAVR","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"vGUT3JZv2v5bPwGYFugWY9","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-4.944421052766332,9.208552266536286,0],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":-0.008609245819334532,"cy":9.208552266536289,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[4.927202561127663,9.208552266536293,0],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":3.1415926535897936,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["v2X26dL66tDwT3FmUa4dJm"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["vGUT3JZv2v5bPwGYFugWY9"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":19.02172412973572,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"emaK2k9UPEiLxchx8wQAVR","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"aR3TKXZKTA3DjkwyAfcrsN","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-4.944421052766332,-9.813171863199434,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":-4.944421052766332,"cy":-0.30230979833157434,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-4.944421052766332,9.208552266536286,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":-1.5707963267948968,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["9QENUE5u5vX4ytePVUekD6"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["aR3TKXZKTA3DjkwyAfcrsN"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":9.871623613893986,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,5],"roofId":"emaK2k9UPEiLxchx8wQAVR","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"v2X26dL66tDwT3FmUa4dJm","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[4.927202561127656,-9.813171863199434,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":-0.008609245819338085,"cy":-9.813171863199434,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-4.94442105276633,-9.813171863199434,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":0,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"color":"#808080","thickness":0.2,"ridgeRightPoint":[0,1],"sideColor":"#ffffff","ridgeLeftPoint":[0,1],"type":"Roof","lx":0,"ly":0,"lz":2,"lineWidth":0.2,"showLabel":false,"wallsId":["9QENUE5u5vX4ytePVUekD6"],"textureType":"Roof Texture Default","id":"emaK2k9UPEiLxchx8wQAVR","selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","rValue":2,"parentId":"9i1GeRaoeMfYcFyEXeESac","cx":0,"cy":0,"cz":0,"rise":2},{"color":"#ffffff","type":"Window","lx":0.147367402963575,"ly":0.3,"tint":"#73D8FF","lz":0.5426870588204226,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"dYhfccPnbEuiEAJoeaQBDj","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"v2X26dL66tDwT3FmUa4dJm","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.2701735720998875,"cy":0.3,"cz":0.0904478431367371,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.147367402963575,"ly":0.3,"tint":"#73D8FF","lz":0.5426870588204226,"windowType":"Default","empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"5nVnggQ1j1y4LhusK3QQ9N","selected":false,"normal":[0,0,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,-1,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","uValue":2,"parentId":"v2X26dL66tDwT3FmUa4dJm","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.22105110444536252,"cy":0.3,"cz":0.0904478431367371,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.06896551724137932,"ly":0.3,"tint":"#73D8FF","lz":0.3333333333333333,"windowType":"Arched","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"iAAMojVW9SfERJgsNR5wGg","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"v2X26dL66tDwT3FmUa4dJm","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.014639709033835343,"cy":0.3,"cz":0.1951247058802817,"opacity":0.5,"frame":true},{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":5.121405440544657,"solarUpdraftTower":{},"ly":23.331989134689955,"lz":0.1,"parentId":"Ground","notBuilding":true,"cx":7.117139637555678,"cy":-2.1402534531496054,"cz":0.05,"textureType":"Foundation Texture #7","id":"6oJTxTDspAfmbzbkSwgLzM","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["u8cZQ8gw5Uc65jmC4AaB7d"],"structureSpacing":3.1,"structureColor":"white","rightRoofHeight":3,"leftJoints":["naij9irGfPKDF6gEc7Zkzp"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":6.120671841837397,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"wBHkiU6oo5drdfZkAFGFfz","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"hbDCpCYC3ZLecZSkhJS1EQ","leftRoofHeight":3,"structureWidth":0.2,"eavesLength":0.3,"selected":false,"rightPoint":[2.559407991260085,2.8016570371963034,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":2.559407991260085,"cy":-0.25867888372239545,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[2.559407991260085,-3.3190148046410934,0.1],"wallStructure":"Pillar","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":1.5707963267948966,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":27.903855171778083,"solarUpdraftTower":{},"ly":11.561493647400244,"lz":0.1,"parentId":"Ground","cx":-0.6894829517342327,"cy":3.639827040053712,"cz":0.05,"textureType":"No Foundation Texture","id":"4CT3RC8YfvAiLoXMz31PEP","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["1Zay38AwfKg5VsDAT4PNTX"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["9BgkixvH2fS92Toh4D28v5"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":21.991286967543367,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"qmUXXfVhmamGoX7fipyTJo","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"kqp9pSQMqPyRJVqLaTvTUF","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0,"selected":false,"rightPoint":[-8.140917668430362,5.750753387493409,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":2.8547258153413235,"cy":5.750753387493408,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[13.850369299113007,5.750753387493406,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":3.141592653589793,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["kqp9pSQMqPyRJVqLaTvTUF"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["oNGhacA1yDo6pQ4NiWd8Nw"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":11.392654386409493,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,5],"roofId":"qmUXXfVhmamGoX7fipyTJo","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"9BgkixvH2fS92Toh4D28v5","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[13.850369299113007,5.750753387493413,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":13.850369299113007,"cy":0.05442619428866724,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[13.850369299113007,-5.641900998916079,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":1.5707963267948966,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"normal":[0,1,0],"cx":0.12009022039087736,"cy":-3.0450806858488395,"cz":0.05000000074505806,"rotation":[0,0,0],"name":"Jamelia","id":"uRMwVbiJoYLhXPAzZaiS71","type":"Human","lx":0.65,"lz":1.8,"parentId":"6oJTxTDspAfmbzbkSwgLzM","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["oNGhacA1yDo6pQ4NiWd8Nw"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":2.999999999999999,"leftJoints":["kqp9pSQMqPyRJVqLaTvTUF"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":11.392654386409477,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[-5.551115123125783e-17,5],"roofId":"qmUXXfVhmamGoX7fipyTJo","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"1Zay38AwfKg5VsDAT4PNTX","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-8.140917668430362,-5.64190099891607,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Empty","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":-8.140917668430362,"cy":0.05442619428866813,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-8.140917668430362,5.750753387493406,0.1],"wallStructure":"Default","leftTopPartialHeight":4.5,"studSpacing":2,"relativeAngle":-1.5707963267948966,"opacity":0.5,"rightTopPartialHeight":4.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["9BgkixvH2fS92Toh4D28v5"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["1Zay38AwfKg5VsDAT4PNTX"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":21.991286967543363,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"qmUXXfVhmamGoX7fipyTJo","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"oNGhacA1yDo6pQ4NiWd8Nw","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[13.850369299113007,-5.641900998916079,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":2.8547258153413235,"cy":-5.641900998916076,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-8.140917668430362,-5.641900998916072,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":-3.231019343291642e-16,"opacity":0.5,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"color":"#808080","thickness":0.2,"ridgeRightPoint":[0,1],"sideColor":"#ffffff","ridgeLeftPoint":[0,1],"type":"Roof","lx":0,"ly":0,"lz":2,"lineWidth":0.2,"showLabel":false,"wallsId":["kqp9pSQMqPyRJVqLaTvTUF"],"textureType":"Roof Texture Default","id":"qmUXXfVhmamGoX7fipyTJo","selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","rValue":2,"parentId":"4CT3RC8YfvAiLoXMz31PEP","cx":0,"cy":0,"cz":0,"rise":2},{"normal":[0,1,0],"color":"#ffffff","rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","doorType":"Default","filled":true,"lineColor":"#000000","type":"Door","lx":0.10630984247920754,"uValue":1,"ly":0,"lz":0.8333333333333334,"lineWidth":0.2,"showLabel":false,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","interior":false,"cx":0.2232506692063359,"cy":0,"cz":-0.08333333333333333,"archHeight":1,"textureType":"Door Texture #13","id":"j64mXBpPWycvnXkBDtiDas","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["gjog834aLNPzVBFGgmeHKa"],"structureSpacing":3.1,"structureColor":"white","rightRoofHeight":3,"leftJoints":["hbDCpCYC3ZLecZSkhJS1EQ"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":5.029686673364193,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,4.0028493376063965],"roofId":"wBHkiU6oo5drdfZkAFGFfz","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"u8cZQ8gw5Uc65jmC4AaB7d","leftRoofHeight":3,"structureWidth":0.2,"eavesLength":0.3,"selected":false,"rightPoint":[-2.470278682104108,2.8016570371963034,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Empty","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":0.04456465457798853,"cy":2.8016570371963034,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[2.559407991260085,2.8016570371963034,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":3.141592653589793,"opacity":0.5,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["naij9irGfPKDF6gEc7Zkzp"],"structureSpacing":3.1,"structureColor":"white","rightRoofHeight":3,"leftJoints":["u8cZQ8gw5Uc65jmC4AaB7d"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":6.120671841837397,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"wBHkiU6oo5drdfZkAFGFfz","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"gjog834aLNPzVBFGgmeHKa","leftRoofHeight":3,"structureWidth":0.2,"eavesLength":0.3,"selected":false,"rightPoint":[-2.470278682104108,-3.3190148046410934,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":-2.470278682104108,"cy":-0.25867888372239545,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-2.470278682104108,2.8016570371963034,0.1],"wallStructure":"Pillar","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":-1.5707963267948966,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["hbDCpCYC3ZLecZSkhJS1EQ"],"structureSpacing":3.1,"structureColor":"white","rightRoofHeight":3,"leftJoints":["gjog834aLNPzVBFGgmeHKa"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":5.029686673364193,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,4.0028493376063965],"roofId":"wBHkiU6oo5drdfZkAFGFfz","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"naij9irGfPKDF6gEc7Zkzp","leftRoofHeight":3,"structureWidth":0.2,"eavesLength":0.3,"selected":false,"rightPoint":[2.559407991260085,-3.3190148046410934,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Empty","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":0.04456465457798853,"cy":-3.3190148046410934,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-2.470278682104108,-3.3190148046410934,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":0,"opacity":0.5,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"color":"#808080","thickness":0.15,"ridgeRightPoint":[0,1],"sideColor":"#ffffff","ridgeLeftPoint":[0,1],"type":"Roof","lx":0,"ly":0,"lz":0,"lineWidth":0.2,"showLabel":false,"wallsId":["gjog834aLNPzVBFGgmeHKa"],"textureType":"Roof Texture Default","id":"wBHkiU6oo5drdfZkAFGFfz","selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,0],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","lineColor":"#000000","rValue":2,"parentId":"6oJTxTDspAfmbzbkSwgLzM","cx":0,"cy":0,"cz":0,"rise":1.0028493376063965},{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":2.728592264047313,"solarUpdraftTower":{},"ly":4.662886212525777,"lz":0.1,"parentId":"Ground","notBuilding":true,"cx":3.15486402400506,"cy":5.558911086166162,"cz":0.05,"textureType":"No Foundation Texture","id":"cnVE9qA8tGVxx7Twx9YQ7v","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["pXM26q1VjfYYDMxhYfN2o9"],"structureSpacing":2,"structureColor":"white","leftJoints":["oQPmsDKPXogP77dA6oQjhK"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":1,"ly":0.2,"lz":6,"lineWidth":0.2,"showLabel":false,"volumetricHeatCapacity":0.5,"textureType":"Wall Texture #3","studColor":"#ffffff","id":"o5Yf7XQHbF4kHVdq79cdp9","structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-0.8117707735928041,-0.1460542118582815,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"cnVE9qA8tGVxx7Twx9YQ7v","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"cnVE9qA8tGVxx7Twx9YQ7v","cx":-0.31177077359280414,"cy":-0.1460542118582815,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[0.18822922640719586,-0.1460542118582815,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":3.141592653589793,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["o5Yf7XQHbF4kHVdq79cdp9"],"structureSpacing":2,"structureColor":"white","leftJoints":["xuRnyn33hSpjc1EP64SqoP"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":1,"ly":0.2,"lz":6,"lineWidth":0.2,"showLabel":false,"volumetricHeatCapacity":0.5,"textureType":"Wall Texture #3","studColor":"#ffffff","id":"oQPmsDKPXogP77dA6oQjhK","structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[0.18822922640719586,-0.1460542118582815,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"cnVE9qA8tGVxx7Twx9YQ7v","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"cnVE9qA8tGVxx7Twx9YQ7v","cx":0.18822922640719586,"cy":-0.6460542118582815,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[0.18822922640719586,-1.1460542118582815,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":1.5707963267948966,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["xuRnyn33hSpjc1EP64SqoP"],"structureSpacing":2,"structureColor":"white","leftJoints":["o5Yf7XQHbF4kHVdq79cdp9"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":1,"ly":0.2,"lz":6,"lineWidth":0.2,"showLabel":false,"volumetricHeatCapacity":0.5,"textureType":"Wall Texture #3","studColor":"#ffffff","id":"pXM26q1VjfYYDMxhYfN2o9","structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-0.8117707735928041,-1.1460542118582815,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"cnVE9qA8tGVxx7Twx9YQ7v","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"cnVE9qA8tGVxx7Twx9YQ7v","cx":-0.8117707735928041,"cy":-0.6460542118582815,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-0.8117707735928041,-0.1460542118582815,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":4.71238898038469,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["oQPmsDKPXogP77dA6oQjhK"],"structureSpacing":2,"structureColor":"white","leftJoints":["pXM26q1VjfYYDMxhYfN2o9"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":1,"ly":0.2,"lz":6,"lineWidth":0.2,"showLabel":false,"volumetricHeatCapacity":0.5,"textureType":"Wall Texture #3","studColor":"#ffffff","id":"xuRnyn33hSpjc1EP64SqoP","structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[0.18822922640719586,-1.1460542118582815,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"cnVE9qA8tGVxx7Twx9YQ7v","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"cnVE9qA8tGVxx7Twx9YQ7v","cx":-0.31177077359280414,"cy":-1.1460542118582815,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-0.8117707735928041,-1.1460542118582815,0.1],"wallStructure":"Default","leftTopPartialHeight":2.5,"studSpacing":2,"relativeAngle":0,"opacity":0,"rightTopPartialHeight":2.5,"unfilledHeight":0.5},{"color":"#ffffff","type":"Window","lx":0.04252393699168303,"ly":0.3,"tint":"#73D8FF","lz":0.5,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"aZQsp9KnrVqmk4eAwe1NCt","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.20610080510533202,"cy":0.3,"cz":0.08333333333333333,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.0865221828476419,"ly":0.3,"tint":"#73D8FF","lz":0.5,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"wi1NteLea8pGYc59N8ZyTs","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.09315657273688317,"cy":0.3,"cz":0.08333333333333333,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.04252393699168303,"ly":0.3,"tint":"#73D8FF","lz":0.5,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"tpCHwLeKKFgUw5FY2DKdy1","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.021261968495841516,"cy":0.3,"cz":0.08333333333333333,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.04252393699168303,"ly":0.3,"tint":"#73D8FF","lz":0.3333333333333333,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"1NPtUozjvhjcbUekBxsSNW","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.40397740142098876,"cy":0.3,"cz":0.16666666666666666,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.04632014812218899,"ly":0.3,"tint":"#73D8FF","lz":0.3333333333333333,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"ptRhzHtPCd3TfYdEbPj837","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"9QENUE5u5vX4ytePVUekD6","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.29226874611722437,"cy":0.3,"cz":0.16666666666666666,"opacity":0.5,"frame":true},{"normal":[0,0,1],"hvacSystem":{"id":"1","thermostatSetpoint":20},"solarPowerTower":{},"color":"#808080","rotation":[0,0,0],"solarAbsorberPipe":{},"type":"Foundation","lx":3.215640251525082,"solarUpdraftTower":{},"ly":7.683856697227261,"lz":0.1,"parentId":"Ground","cx":13.747250889007532,"cy":3.741208118171845,"cz":0.05,"textureType":"No Foundation Texture","id":"4SCfFQkEiBbVWLNY4GZGRU","selected":false},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["c1xKbTDTkdNMKPxFGbq5sJ"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["4HHRdJpRSx8pifjYvsDdM4"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":2.1985623896518645,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"iQYyB4WDCVVmrDF6P2RGEj","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"u8nK8tuuo6DkzwQEivraoQ","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-0.6112818815298553,3.4762421347806844,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":0.4879993132960756,"cy":3.4762421347806844,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[1.5872805081220083,3.4762421347806844,0.1],"wallStructure":"Default","leftTopPartialHeight":5.5,"studSpacing":2,"relativeAngle":3.141592653589793,"opacity":0,"rightTopPartialHeight":5.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["u8nK8tuuo6DkzwQEivraoQ"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["bxY2NeBNcbCbVPsugfGXTE"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":7.103113702900762,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,4.5],"roofId":"iQYyB4WDCVVmrDF6P2RGEj","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"4HHRdJpRSx8pifjYvsDdM4","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[1.5872805081220083,3.4762421347806844,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":1.5872805081220083,"cy":-0.07531471666969658,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[1.5872805081220083,-3.6268715681200776,0.1],"wallStructure":"Default","leftTopPartialHeight":5.5,"studSpacing":2,"relativeAngle":1.5707963267948966,"opacity":0,"rightTopPartialHeight":5.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["bxY2NeBNcbCbVPsugfGXTE"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["u8nK8tuuo6DkzwQEivraoQ"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":7.103113702900762,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"centerRoofHeight":[0,4.5],"roofId":"iQYyB4WDCVVmrDF6P2RGEj","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"c1xKbTDTkdNMKPxFGbq5sJ","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[-0.6112818815298553,-3.6268715681200776,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Empty","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":-0.6112818815298553,"cy":-0.07531471666969658,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-0.6112818815298553,3.4762421347806844,0.1],"wallStructure":"Default","leftTopPartialHeight":5.5,"studSpacing":2,"relativeAngle":-1.5707963267948966,"opacity":0,"rightTopPartialHeight":5.5,"unfilledHeight":0.5},{"rightUnfilledHeight":0.5,"color":"#ffffff","rightJoints":["4HHRdJpRSx8pifjYvsDdM4"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":3,"leftJoints":["c1xKbTDTkdNMKPxFGbq5sJ"],"parapet":{"parapetHeight":1,"color":"white","copingsHeight":0.1,"display":false,"textureType":"No Wall Texture","copingsWidth":0.5},"type":"Wall","lx":2.1985623896518645,"ly":0.3,"lz":3,"lineWidth":0.2,"showLabel":false,"roofId":"iQYyB4WDCVVmrDF6P2RGEj","volumetricHeatCapacity":0.5,"textureType":"Wall Texture Default","studColor":"#ffffff","id":"bxY2NeBNcbCbVPsugfGXTE","leftRoofHeight":3,"structureWidth":0.1,"eavesLength":0.3,"selected":false,"rightPoint":[1.5872805081220083,-3.6268715681200776,0.1],"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","studWidth":0.1,"lineColor":"#000000","windows":[],"fill":"Full","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":0.4879993132960756,"cy":-3.6268715681200776,"cz":0,"leftUnfilledHeight":0.5,"leftPoint":[-0.6112818815298553,-3.6268715681200776,0.1],"wallStructure":"Default","leftTopPartialHeight":5.5,"studSpacing":2,"relativeAngle":0,"opacity":0,"rightTopPartialHeight":5.5,"unfilledHeight":0.5},{"color":"#808080","thickness":0.2,"ridgeRightPoint":[0,1],"sideColor":"#ffffff","ridgeLeftPoint":[0,1],"type":"Roof","lx":0,"ly":0,"lz":0,"lineWidth":0.2,"showLabel":false,"wallsId":["bxY2NeBNcbCbVPsugfGXTE"],"textureType":"Roof Texture Default","id":"iQYyB4WDCVVmrDF6P2RGEj","selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","lineColor":"#000000","rValue":2,"parentId":"4SCfFQkEiBbVWLNY4GZGRU","cx":0,"cy":0,"cz":0,"rise":1.5},{"color":"#ffffff","type":"Window","lx":0.4656293560221584,"ly":0.3,"tint":"#73D8FF","lz":0.3333333333333333,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":false,"interior":false,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"ur2wu1GbyFVp7FmPxNNmBM","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4SCfFQkEiBbVWLNY4GZGRU","lineColor":"#000000","uValue":2,"parentId":"bxY2NeBNcbCbVPsugfGXTE","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":1.2923810799929613e-17,"cy":0.3,"cz":0.16666666666666666,"opacity":0.5,"frame":true},{"normal":[0,1,0],"cx":-13.100619706718579,"cy":-10.982350587612038,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"bzsGApekhuYxympNeW6JVx","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-11.532994972828238,"cy":-10.945183221755485,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"2y8Zm1vaLLzKLCLA5bR7oe","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-9.926022363688986,"cy":-10.929829923112186,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"dJtXdJrD6NpPxoMSTaJY7n","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-8.252046390037505,"cy":-10.833715328006154,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"fZeGKA8vqbSdnXefKUgP6u","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-6.596249922214839,"cy":-10.835475782121927,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"mDpx3QUsXGWznsz7rRMSdN","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-4.903997368711945,"cy":-10.880752447262477,"cz":0,"rotation":[0,0,0],"name":"Boxwood","id":"7unbM9cBoPXu92FcGyHWjG","type":"Flower","lx":1.6,"lz":1.44,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-8.971390493828297,"cy":-12.01356765080397,"cz":0,"rotation":[0,0,0],"name":"Jacob","id":"9sZwMtiyANKZHbqdhvGUp9","type":"Human","lx":0.8,"lz":1.82,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-2.805525594551304,"cy":-3.0636427589221107,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"kdDbY49KBpLT6Gh4XRcuXV","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-0.8228472548979603,"cy":-2.9603397088144945,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"cPktsh6MkPkQgTpcfsZ264","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":1.2205615754221601,"cy":-3.0452854714079365,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"pfPsSh1hnCKWYj3B8ZGyhC","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":3.188130988912686,"cy":-3.1336708109310862,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"oKGQ71oyUFnUv3h2wpjctG","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.49096591590788,"cy":-2.9417670536643996,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"tAkXUbnTXQQEkhtjgkeL9a","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":12.439980874103988,"cy":-2.958114538663313,"cz":0,"rotation":[0,0,0],"name":"Yellow Flower","id":"3uPL624aQAssRbe8u5vNsL","type":"Flower","lx":2,"lz":1.4,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.227119582351997,"cy":-6.718823701549967,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"pp9vMNnF3gKDKwKACrCtWt","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.248202396665872,"cy":-7.3829856427934075,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"6HCPw6bEmxM9XBoyEFYsXx","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.29608623259089,"cy":-8.067012538431428,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"s9pXmqBnLJggJVDKmKrsUe","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.253112052389068,"cy":-8.783230589194178,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"nmZQCDYhSZSpTJn766vY6J","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.284683512589031,"cy":-9.514835126828089,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"qTPuqJ4Ppz1TkNvBeQyqFz","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.071297430185469,"cy":-6.519410387949039,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"5pk9bJdBfyK4bpLi5BT6NM","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.062267589853372,"cy":-7.196223132026073,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"r8K8yWqHuFGizynm6ddenB","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.097400993990563,"cy":-7.971209786072892,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"oG3QSnZ1Uk7vjSTdBJ8fXN","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.06700296171534,"cy":-8.729909052223485,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"tkRzfWzEvDw14BTf7giDeA","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.080379345721328,"cy":-9.557453473585836,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"sCmW6UrmvwLKnfPLkgt286","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.299044056096119,"cy":-10.313859849129921,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"qigHYFtupbrFesxkd37Zht","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.075030547693563,"cy":-10.331325702253856,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"wWEyHg1cJDBq1b3EMERb9A","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.309032427615859,"cy":-11.091835373694485,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"1kA9AC2Guwj5iAhcjXubxK","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.099628606942899,"cy":-11.10977466594735,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"6Lxn24pDS3Drayq29WyoKf","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.385872466836958,"cy":-11.910915656038041,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"qrcVRZNMH5ehQ4r36RBqU6","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.130718482167884,"cy":-11.91928566361417,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"89M11hZpqVtWuZCYDG5EYF","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.426502126657067,"cy":-12.641489645575502,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"edL3BFi1bTcY7m6rb8Z692","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.128599191487156,"cy":-12.753156162180996,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"33TVUhPCYQMxWUT6sdBkTj","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":4.438104647827676,"cy":-13.391380274386641,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"ddTatvjn8PZnpa5P7wkL8k","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":10.094734752772371,"cy":-13.540199425804733,"cz":0,"rotation":[0,0,0],"name":"White Flower","id":"mx6oiu2CpUQHto7UPZUVNA","type":"Flower","lx":0.8,"lz":0.5,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":15.223771494752249,"cy":-1.1686190396344398,"cz":0,"rotation":[0,0,0],"name":"Hibiscus","id":"bEZvtj2vhcueHdhStZq3zG","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":16.813831408618693,"cy":4.533595612460387,"cz":0,"rotation":[0,0,0],"name":"Hibiscus","id":"rHgigsbmBipXpU5L23ADrP","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":16.761059861350283,"cy":2.526606100917273,"cz":0,"rotation":[0,0,0],"name":"Hibiscus","id":"5sKnhXEkZrDN45g6Hkv3Dr","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":16.735563289446127,"cy":6.631805912715191,"cz":-1.7763568394002505e-15,"rotation":[0,0,0],"name":"Hibiscus","id":"2NraLHQLDf7r45LZpKeZWV","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":16.65137747037868,"cy":0.5295700067482301,"cz":0,"rotation":[0,0,0],"name":"Hibiscus","id":"ssqX4qu1eL82YUJ4MAMBZc","type":"Flower","lx":2,"lz":1.7,"parentId":"Ground","selected":false},{"color":"#ffffff","polygonTop":[0,1.5],"type":"Window","lx":0.6144309976040727,"ly":0.3,"tint":"#73D8FF","lz":0.9666666666666667,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"hNQ7uh7EgAer8x5yJgdejy","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"9BgkixvH2fS92Toh4D28v5","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-1.9490155445241313e-17,"cy":0.3,"cz":0.01666666666666668,"opacity":0.5,"frame":false},{"color":"#ffffff","type":"Window","lx":1.0259623193904517,"ly":0.2,"tint":"#73D8FF","lz":0.9973447889836972,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"pEKTeVcdGPeo8QaTuPfNZn","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.33765748962314723,0,3.141592653589793],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"qmUXXfVhmamGoX7fipyTJo","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":3.271837805703635,"cy":1.2022574325146156,"cz":4.796992518408978,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[0.02198232342893128,5.239274910393489],"type":"Window","lx":11.521452745175713,"ly":0.2,"tint":"#73D8FF","lz":0.028013650400663493,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"ve3NZruBvxPhuGrwYfJYbD","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.3849826581688516,0,1.5707963267948961],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"emaK2k9UPEiLxchx8wQAVR","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":5.086744147605803,"cy":3.321831955890855,"cz":3.135353456445162,"opacity":0.5,"frame":false},{"color":"#ffffff","type":"Window","lx":0.5841143520475517,"ly":0.3,"tint":"#73D8FF","lz":0.9333333333333332,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"xcpQhvE8H4jY1XBufEziCv","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"9i1GeRaoeMfYcFyEXeESac","lineColor":"#000000","uValue":2,"parentId":"9QENUE5u5vX4ytePVUekD6","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.1869142359643362,"cy":0.3,"cz":0,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[-0.5,6.225749243067175],"type":"Window","lx":4.529358401864285,"ly":0.2,"tint":"#73D8FF","lz":0.0014510101332386256,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"qco3N3M7pEccTSX4FnzmmB","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.33765748962314746,0,-4.440892098500626e-16],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"qmUXXfVhmamGoX7fipyTJo","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-6.038377742510676,"cy":-5.937820865703974,"cz":3.0961015205935123,"opacity":0.5,"frame":false},{"color":"#ffffff","type":"Window","lx":0.17714486148633357,"ly":0.3,"tint":"#73D8FF","lz":0.9333333333333332,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"1u4CPXmzZ7U8AD1aJnrxtZ","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"oNGhacA1yDo6pQ4NiWd8Nw","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-0.40688031378480977,"cy":0.3,"cz":0,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[0.5,5.545977124465995],"type":"Window","lx":4.431361564126709,"ly":0.2,"tint":"#73D8FF","lz":0.05655021663112993,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"hxMturJGqg8nQWYw3248Zf","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.33765748962314746,0,3.141592653589793],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"qmUXXfVhmamGoX7fipyTJo","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-6.124998499042543,"cy":5.680878658133054,"cz":3.224533256953256,"opacity":0.5,"frame":true},{"color":"#ffffff","type":"Window","lx":0.19988113884645106,"ly":0.3,"tint":"#73D8FF","lz":0.9333333333333332,"windowType":"Default","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0.1,"mullionSpacing":0.5,"archHeight":1,"id":"rm6Z987XxKrWApL3xoegwQ","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"4CT3RC8YfvAiLoXMz31PEP","lineColor":"#000000","uValue":2,"parentId":"kqp9pSQMqPyRJVqLaTvTUF","parentType":"Wall","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":0.3955121751047511,"cy":0.3,"cz":0,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[0.5,2.9702881561464394],"type":"Window","lx":3.157582763484352,"ly":0.15,"tint":"#73D8FF","lz":0.021976494720977846,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"pqpP8EKpYsZ86BiFVEHhxo","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.3794473874556583,0,1.5707963267948966],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","lineColor":"#000000","uValue":2,"parentId":"wBHkiU6oo5drdfZkAFGFfz","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":2.8491029983508964,"cy":1.4398333849785727,"cz":3.034477716074278,"opacity":0.5,"frame":false},{"color":"#ffffff","polygonTop":[-0.5,2.8179589134876353],"type":"Window","lx":3.322490733590821,"ly":0.15,"tint":"#73D8FF","lz":0.016499091866733075,"windowType":"Polygonal","lineWidth":0.2,"showLabel":false,"empty":true,"interior":true,"sillWidth":0,"mullionSpacing":0.5,"archHeight":1,"id":"7zkZZCYRrhEu3epYoe3VVL","selected":false,"normal":[0,-1,0],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0.3794473874556583,0,4.71238898038469],"foundationId":"6oJTxTDspAfmbzbkSwgLzM","lineColor":"#000000","uValue":2,"parentId":"wBHkiU6oo5drdfZkAFGFfz","parentType":"Roof","mullionColor":"#ffffff","mullion":true,"frameWidth":0.1,"cx":-2.759910269509251,"cy":1.377735998361726,"cz":3.034503006074985,"opacity":0.5,"frame":false},{"normal":[0,1,0],"cx":19.682640887226967,"cy":1.7189056044242683,"cz":0,"rotation":[0,0,0],"name":"Apple","id":"7Fb312hzxWdTnmmZmzJ1Ub","type":"Tree","lx":5.1836671993460035,"lz":5.934335930936695,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-17.761844408107656,"cy":-14.105635188228664,"cz":0,"rotation":[0,0,0],"name":"Elm","id":"7o7bNqKzFGLaB6T7op3udd","type":"Tree","lx":15.71602183123487,"lz":16.55887991319796,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":0.7478699234997297,"cy":-12.856360711077464,"cz":1.7763568394002505e-15,"rotation":[0,0,0],"name":"Joel","id":"68Win1DRWqT8VnsTwHRtwy","type":"Human","lx":1.8,"lz":1.75,"parentId":"Ground","selected":false},{"normal":[0,1,0],"cx":-0.11804362509319688,"cy":-9.517368667682085,"cz":0,"rotation":[0,0,0],"name":"Jacqueline","id":"n6cjamzJLc5nH9PXsech9s","type":"Human","lx":0.43,"lz":1.78,"parentId":"Ground","selected":false}],"sceneRadius":32,"view":{"showDailyLightSensorPanel":false,"yearlyPvYieldPanelY":0,"yearlyHeliostatYieldPanelY":0,"windowShininess":200,"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"dailyLightSensorPanelY":0,"heatFluxWidth":0.5,"showEvolutionPanel":false,"shadowEnabled":true,"theme":"Rural","dailyFresnelReflectorYieldPanelRect":{"width":600,"y":0,"x":0,"height":400},"showDailyParabolicTroughYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelY":0,"dailyLightSensorPanelRect":{"x":0,"height":360,"y":0,"width":600},"yearlyFresnelReflectorYieldPanelX":0,"dailyParabolicDishYieldPanelRect":{"height":400,"x":0,"y":0,"width":600},"dailyParabolicDishYieldPanelX":0,"dailyParabolicTroughYieldPanelRect":{"width":600,"height":400,"x":0,"y":0},"yearlyLightSensorPanelRect":{"width":600,"height":500,"x":0,"y":0},"showDailyFresnelReflectorYieldPanel":false,"weatherPanelRect":{"x":0,"width":500,"y":0,"height":500},"showWeatherPanel":false,"showDailyHeliostatYieldPanel":false,"stickyNotePanelX":0,"weatherPanelX":0,"showDailyBuildingEnergyPanel":false,"showYearlyUpdraftTowerYieldPanel":false,"yearlyHeliostatYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"evolutionPanelRect":{"x":0,"width":640,"y":0,"height":400},"waterSurface":false,"showYearlyPvYieldPanel":false,"weatherPanelY":0,"groundImage":false,"dailyParabolicDishYieldPanelY":0,"solarPanelShininess":100,"directLightIntensity":1,"solarRadiationHeatMapMaxValue":5,"heliodon":false,"mapPanelX":0,"showEconomicsPanel":false,"showStickyNotePanel":false,"showYearlyLightSensorPanel":false,"mapPanelY":0,"heliodonPanelX":0,"showDesignInfoPanel":true,"showHeliodonPanel":false,"yearlyFresnelReflectorYieldPanelY":0,"dailyPvYieldPanelY":0,"dailyPvYieldPanelX":0,"groundColor":"#194d33","showMapPanel":false,"autoRotate":false,"heatFluxScaleFactor":20,"dailyFresnelReflectorYieldPanelX":0,"showAzimuthAngle":true,"yearlyUpdraftTowerYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"dailyParabolicTroughYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"dailyFresnelReflectorYieldPanelY":0,"yearlyLightSensorPanelY":0,"showZenithAngle":true,"heliodonPanelY":0,"dailyUpdraftTowerYieldPanelRect":{"height":550,"width":640,"x":0,"y":0},"yearlyParabolicTroughYieldPanelX":0,"orthographic":false,"showDailyUpdraftTowerYieldPanel":false,"mapZoom":18,"mapWeatherStations":false,"showYearlyParabolicTroughYieldPanel":false,"cameraPosition":[18.00443196668519,-27.247214599490015,4.125039875772188],"dailyHeliostatYieldPanelX":0,"enableRotate":true,"dailyHeliostatYieldPanelY":0,"showSolarPanelVisibilityResultsPanel":false,"showInstructionPanel":true,"yearlyPvYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"showSiteInfoPanel":true,"dailyLightSensorPanelX":0,"panCenter2D":[4.576706139296041,-7.605431240841252,-0.000007651462374536784],"showDailyParabolicDishYieldPanel":false,"ambientLightIntensity":0.1,"yearlyLightSensorPanelShowDaylight":false,"showElevationAngle":true,"showYearlyBuildingEnergyPanel":false,"cameraZoom":37.01235612443423,"showDailyPvYieldPanel":false,"diurnalTemperaturePanelRect":{"height":400,"width":600,"y":0,"x":0},"cameraPosition2D":[4.576706139296041,-7.606431618292216,150],"yearlyHeliostatYieldPanelX":0,"showSunAngles":false,"showYearlyParabolicDishYieldPanel":false,"solarRadiationHeatMapReflectionOnly":false,"yearlyFresnelReflectorYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"yearlyBuildingEnergyPanelRect":{"height":400,"x":0,"width":600,"y":0},"dailyPvYieldPanelRect":{"height":400,"width":600,"x":0,"y":0},"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelRect":{"x":0,"width":600,"y":0,"height":400},"axes":false,"dailyBuildingEnergyPanelRect":{"width":600,"x":-10,"y":-2,"height":400},"yearlyLightSensorPanelShowClearness":false,"heatFluxColor":"gray","showDiurnalTemperaturePanel":false,"yearlyPvYieldPanelX":0,"stickyNotePanelRect":{"height":300,"y":0,"width":400,"x":0},"showYearlyHeliostatYieldPanel":false,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"panCenter":[-2.2871814685183796,5.668685587288812,3.578971879440754],"yearlyParabolicDishYieldPanelRect":{"x":0,"height":400,"y":0,"width":600},"visibilityResultsPanelRect":{"x":0,"height":470,"width":600,"y":0},"yearlyParabolicDishYieldPanelY":0,"mapType":"roadmap","groundImageType":"roadmap","yearlyLightSensorPanelX":0,"mapTilt":0},"graphState":{"dailyPvIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"poleSpacing":3,"interRowSpacing":2,"rowAxis":"Zonal","tiltAngle":0,"rowsPerRack":1,"poleHeight":1,"orientation":"Landscape","pvModelName":"SPR-X21-335-BLK"},"solarPanelArrayLayoutConstraints":{"rowAxis":"Zonal","minimumTiltAngle":-1.5707963267948966,"pvModelName":"CS6X-355P-FG","maximumInterRowSpacing":10,"poleSpacing":5,"poleHeight":1,"orientation":"Landscape","maximumRowsPerRack":6,"minimumRowsPerRack":1,"maximumTiltAngle":1.5707963267948966,"minimumInterRowSpacing":2},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"inertia":0.8,"convergenceThreshold":0.01,"swarmSize":20,"socialCoefficient":0.1,"cognitiveCoefficient":0.1,"localSearchRadius":0.1,"searchMethod":1,"maximumSteps":5,"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"vmax":0.01},"geneticAlgorithmParams":{"objectiveFunctionType":1,"mutationRate":0.1,"convergenceThreshold":0.01,"selectionRate":0.5,"localSearchRadius":0.1,"problem":"Solar Panel Tilt Angle","maximumGenerations":5,"selectionMethod":1,"searchMethod":1,"crossoverRate":0.5,"populationSize":20}},"economicsParams":{"projectLifeSpan":25,"operationalCostPerUnit":0.15,"electricitySellingPrice":0.25},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":[]}')},443:function(e){e.exports=JSON.parse('{"docid":"2dxtGmCKtazgz4ZZyFZJZt","time":"08/09/2023 10:14 am","timestamp":1691590469988,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":0.13929493819855354,"cy":6.605812086773116,"cz":2.2408122612280286,"lx":13.774073361922072,"ly":0.3,"lz":4.406268181656478,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[7.026331619159589,6.605812086773116,1],"rightPoint":[-6.747741742762483,6.605812086773116,1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #2","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"mMQKmyWeVTYGQZt5Pwr8i7","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.06250000000000006,"lx":0.0708994221944815,"ly":0.3,"lz":0.3750000000000001,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729104,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Wall","cx":7.026331619159589,"cy":1.082477095396415,"cz":2.2301039869226305,"lx":11.046669982753404,"ly":0.3,"lz":4.406268181656478,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[7.0263316191595875,-4.440857895980288,1],"rightPoint":[7.026331619159591,6.605812086773116,1],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture #2","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"mMQKmyWeVTYGQZt5Pwr8i7","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-6.747741742762481,"cy":1.082477095396415,"cz":2.228839888904333,"lx":11.046669982753404,"ly":0.3,"lz":4.406268181656478,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-6.747741742762481,6.605812086773116,1],"rightPoint":[-6.747741742762483,-4.440857895980288,1],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture #2","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"mMQKmyWeVTYGQZt5Pwr8i7","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.05938134141579032,"lx":0.09052501808791685,"ly":0.3,"lz":0.6312373171684194,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.13929493819855443,"cy":-4.440857895980288,"cz":2.268765007024547,"lx":13.774073361922074,"ly":0.3,"lz":4.406268181656478,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-6.747741742762483,-4.440857895980288,1],"rightPoint":[7.026331619159591,-4.440857895980288,1],"relativeAngle":0,"textureType":"Wall Texture #2","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"mMQKmyWeVTYGQZt5Pwr8i7","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.39930090798010054,"cy":0.1,"cz":0,"lx":0.072600165087291,"ly":0.3,"lz":0.75,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"29QuQvndX2M7Sq4iEkq1Xz","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.217800495261873,"cy":0.1,"cz":0,"lx":0.072600165087291,"ly":0.3,"lz":0.75,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4LUVPCUMNMxJkqRL8wFtEe","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.217800495261873,"cy":0.1,"cz":0,"lx":0.072600165087291,"ly":0.3,"lz":0.75,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9FGAjvvq6tsggdPdWysCTK","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":0,"lx":0.072600165087291,"ly":0.3,"lz":0.75,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ucbeQgKEoSy9dHSmSFvaic","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.0625,"lx":0.217800495261873,"ly":0,"lz":0.875,"color":"white","textureType":"Door Texture #5","normal":[0,1,0],"rotation":[0,0,0],"id":"wzic8VHyh9MpPw339UYDy4","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Foundation","cx":-0.10211164866366573,"cy":-1.0707408518635368,"cz":0.5,"lx":19.70489075906007,"ly":14.114227282188692,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":false,"color":"#ffffff","hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"notBuilding":false},{"type":"Human","name":"Jeanette","cx":0.14801233194486496,"cy":-8.06976158791596,"cz":0.550000011920929,"lx":0.4,"ly":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dR4uPsfmhQVuGb7SK23oGM","id":"wnofb4XeX3vKmPtas3Qz87","selected":false},{"type":"Wall","cx":-0.011858550160528447,"cy":7.221609932314045,"cz":2.2408122612280286,"lx":17.504258260617593,"ly":0.1,"lz":3.738081358463903,"leftJoints":["13CFTeuFCTc4YUCeVPJLjR"],"rightJoints":["7hhgnkf2gpmkfhuWn7XUeP"],"leftPoint":[8.740270580148266,7.221609932314045,1.1],"rightPoint":[-8.763987680469327,7.221609932314045,1.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"noYCZko5xXDdVcHWBtGenP","parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","wallStructure":"Stud","structureSpacing":2.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"1YZMDHP4rjNjWTDSh913J6","selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.738081358463903,"rightTopPartialHeight":3.738081358463903},{"type":"Wall","cx":8.740270580148266,"cy":-1.182787584171602,"cz":2.2301039869226305,"lx":16.808795032971297,"ly":0.1,"lz":3.738081358463903,"leftJoints":["59rdAGCDJqPHgoGBDNRR6Q"],"rightJoints":["noYCZko5xXDdVcHWBtGenP"],"leftPoint":[8.740270580148266,-9.587185100657251,1.1],"rightPoint":[8.74027058014827,7.221609932314045,1.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"13CFTeuFCTc4YUCeVPJLjR","parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","wallStructure":"Stud","structureSpacing":2.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"1YZMDHP4rjNjWTDSh913J6","selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.738081358463903,"rightTopPartialHeight":3.738081358463903},{"type":"Wall","cx":-8.763987680469327,"cy":-1.182787584171602,"cz":2.228839888904333,"lx":16.808795032971297,"ly":0.1,"lz":3.738081358463903,"leftJoints":["noYCZko5xXDdVcHWBtGenP"],"rightJoints":["59rdAGCDJqPHgoGBDNRR6Q"],"leftPoint":[-8.763987680469324,7.221609932314045,1.1],"rightPoint":[-8.763987680469327,-9.587185100657251,1.1],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7hhgnkf2gpmkfhuWn7XUeP","parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","wallStructure":"Stud","structureSpacing":2.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"1YZMDHP4rjNjWTDSh913J6","selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.738081358463903,"rightTopPartialHeight":3.738081358463903},{"type":"Wall","cx":-0.01185855016052667,"cy":-9.587185100657251,"cz":2.268765007024547,"lx":17.504258260617597,"ly":0.1,"lz":3.738081358463903,"leftJoints":["7hhgnkf2gpmkfhuWn7XUeP"],"rightJoints":["13CFTeuFCTc4YUCeVPJLjR"],"leftPoint":[-8.763987680469327,-9.587185100657251,1.1],"rightPoint":[8.74027058014827,-9.587185100657251,1.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"59rdAGCDJqPHgoGBDNRR6Q","parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","wallStructure":"Stud","structureSpacing":2.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"1YZMDHP4rjNjWTDSh913J6","selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.738081358463903,"rightTopPartialHeight":3.738081358463903},{"id":"1YZMDHP4rjNjWTDSh913J6","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"dR4uPsfmhQVuGb7SK23oGM","foundationId":"dR4uPsfmhQVuGb7SK23oGM","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #1","thickness":0.2,"wallsId":["59rdAGCDJqPHgoGBDNRR6Q"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":1.3622814256430873,"ceiling":false},{"type":"Foundation","cx":0.04811947352688506,"cy":1.0979918791395855,"cz":0.55,"lx":22.625453690958146,"ly":19.31036432995692,"lz":1.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dR4uPsfmhQVuGb7SK23oGM","selected":false,"color":"#ffffff","notBuilding":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","roofStructure":"Default","wallsId":["roDDPncXBpNgmNum9aUaov"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"mMQKmyWeVTYGQZt5Pwr8i7","leftRidgeLength":3.4435183404805185,"rightRidgeLength":3.4435183404805185,"rise":2.6086446360194486,"ceiling":false},{"type":"Foundation","cx":-4.821425474895643,"cy":-8.879390234274549,"cz":0.5,"lx":7.794523521725198,"ly":3.265167760947254,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"836Y3qvzoPStkTCKiU6Zim","color":"#ffffff","textureType":"Foundation Texture #4","notBuilding":true},{"type":"Wall","cx":-0.14626729738059208,"cy":0.5024705864032608,"cz":1.0309059401885354,"lx":7.5,"ly":0.1,"lz":1.0618118803770709,"relativeAngle":0,"leftPoint":[-3.896267297380592,0.5024705864032608,1],"rightPoint":[3.603732702619408,0.5024705864032608,1],"leftJoints":[],"rightJoints":[],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"836Y3qvzoPStkTCKiU6Zim","foundationId":"836Y3qvzoPStkTCKiU6Zim","id":"e64Qztsfyr4zQmZk97hBnb","wallStructure":"Stud","opacity":0,"structureColor":"white","structureSpacing":0.3,"structureWidth":0.05,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Wall","cx":-0.0005250650359469589,"cy":0.5000831632035059,"cz":1.0309059401885354,"lx":7.5,"ly":0.1,"lz":1.0618118803770709,"leftJoints":[],"rightJoints":[],"leftPoint":[-3.750525065035947,0.5000831632035059,1],"rightPoint":[3.749474934964052,0.5000831632035059,1],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"efngrMnFf6NGDKsBgosZFy","parentId":"aiFpq1ExRSUpbVmoio8kUd","foundationId":"aiFpq1ExRSUpbVmoio8kUd","wallStructure":"Stud","structureSpacing":0.3,"structureColor":"white","structureWidth":0.05,"opacity":0,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Foundation","cx":5.053596159844837,"cy":-8.881777657474304,"cz":0.5,"lx":8.105470562568627,"ly":3.2603929145477437,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","textureType":"Foundation Texture #4","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"aiFpq1ExRSUpbVmoio8kUd","selected":false,"notBuilding":true},{"type":"Wall","cx":-0.17954580261008696,"cy":-0.4621199267349816,"cz":1.0309059401885354,"lx":16.799999999999997,"ly":0.1,"lz":1.0618118803770709,"leftJoints":[],"rightJoints":[],"leftPoint":[-8.579545802610086,-0.4621199267349803,1],"rightPoint":[8.22045419738991,-0.46211992673498287,1],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"id":"sDWXonkZUyEPkgjChPFW25","parentId":"tQpZNWS9qUQiRVZS8oj4Qc","foundationId":"tQpZNWS9qUQiRVZS8oj4Qc","wallStructure":"Stud","structureSpacing":0.3,"structureColor":"white","structureWidth":0.05,"opacity":0,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Foundation","cx":8.34010119848655,"cy":0.21478440141855337,"cz":0.5,"lx":17.56747060893107,"ly":1.582487181459217,"lz":1,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tQpZNWS9qUQiRVZS8oj4Qc","selected":false,"notBuilding":true},{"type":"Wall","cx":0.17386663993795157,"cy":-0.45093322724616236,"cz":1.0309059401885354,"lx":16.799999999999997,"ly":0.1,"lz":1.0618118803770709,"leftJoints":[],"rightJoints":[],"leftPoint":[-8.226133360062049,-0.45093322724616186,1],"rightPoint":[8.57386663993795,-0.45093322724616464,1],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"1pz8zDt3tLxwV81bEJHYGM","parentId":"3kLgJo385s42rfmZRWwy75","foundationId":"3kLgJo385s42rfmZRWwy75","wallStructure":"Stud","structureSpacing":0.3,"structureColor":"white","structureWidth":0.05,"opacity":0,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Foundation","cx":-8.212637572768045,"cy":0.13836840972225417,"cz":0.5,"lx":17.178828934275355,"ly":1.6048605804368434,"lz":1,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3kLgJo385s42rfmZRWwy75","selected":false,"notBuilding":true},{"type":"Wall","cx":-0.09999999999999787,"cy":1.3322676295501878e-15,"cz":1.0309059401885354,"lx":16.799999999999997,"ly":0.1,"lz":1.0618118803770709,"leftJoints":[],"rightJoints":[],"leftPoint":[-8.499999999999996,2.6645352591003757e-15,0],"rightPoint":[8.3,0,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"is5SYj452p8YfTVgmaU6zM","parentId":"n2K3pFpV1Cjm6AUAgZRCTf","foundationId":"n2K3pFpV1Cjm6AUAgZRCTf","wallStructure":"Stud","structureSpacing":0.3,"structureColor":"white","structureWidth":0.05,"opacity":0,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.0618118803770709,"rightTopPartialHeight":1.0618118803770709},{"type":"Foundation","cx":0.3262876024341112,"cy":8.30924735716035,"cz":0.5,"lx":17.72656221415125,"ly":2.5067270349291775,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"n2K3pFpV1Cjm6AUAgZRCTf","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.012664813117774204,"cy":-9.507612927983782,"cz":0.05,"lx":2,"ly":2,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cTpXWFzNLufQycEffsJdCb","color":"#ffffff","enableGroupMaster":false,"notBuilding":true},{"type":"Foundation","cx":0.011699082173905834,"cy":-10.207612261814711,"cz":0.1,"lx":0.2,"ly":2,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"8rgH1Z1kSv9eGuQwDGDKs1","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.011975005300725344,"cy":-10.007612452148733,"cz":0.15,"lx":0.2,"ly":2,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ovbGxMS1g4Zg4nuB4TQqeX","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.01225092842754491,"cy":-9.807612642482752,"cz":0.2,"lx":0.2,"ly":2,"lz":0.4,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mVnVWTdw8vPyh7LrycmxnQ","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.012526851554364421,"cy":-9.607612832816773,"cz":0.25,"lx":0.2,"ly":2,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"wUNxCTFzJEgfzKSgjrd9z5","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.012802774681183987,"cy":-9.407613023150793,"cz":0.3,"lx":0.2,"ly":2,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"53BxN4TGqhcfN2Yd5k8dup","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.013078697808003498,"cy":-9.207613213484814,"cz":0.35,"lx":0.2,"ly":2,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"meWg2dKv2vnU5j91nQfeeo","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.013354620934823008,"cy":-9.007613403818834,"cz":0.4,"lx":0.2,"ly":2,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3mD1fnxQ9fjW7tjkECGw95","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.013630544061642519,"cy":-8.807613594152855,"cz":0.45,"lx":0.2,"ly":2,"lz":0.9,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cLkWHshGLvdq5XN1PjRi3M","selected":false,"notBuilding":true},{"type":"Foundation","cx":0.013906467188462085,"cy":-8.607613784486874,"cz":0.5,"lx":0.2,"ly":2,"lz":1,"normal":[0,0,1],"rotation":[0,0,1.5694167107231525],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"2wfw4Hci4SimT8xLVSR1qM","selected":false,"notBuilding":true},{"type":"Flower","name":"Tall Bush","cx":-9.817715749800067,"cy":-9.852268243951208,"cz":0,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"hL3pAKVFBPkxjTw9uDE2qM","selected":false},{"type":"Flower","name":"Tall Bush","cx":9.939790338917515,"cy":-9.59379601065341,"cz":0,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9JQTdh1CLGJcq2FEuAr43e","selected":false},{"type":"Tree","name":"Magnolia","cx":-12.382557468618694,"cy":-8.982107454472132,"cz":1.7763568394002505e-15,"lx":7.545471252443165,"lz":10.603223623678987,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mz5Bu6Fc74abemkCjnNzj8","selected":false},{"type":"Tree","name":"Linden","cx":13.009119254200783,"cy":-8.749068294142525,"cz":0,"lx":8.011654641868677,"lz":10.603223623678987,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"vRaDd6Us9GPPs1xWHr35Aq","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-1.6973329547002773,"cy":-0.9810097607697941,"cz":0.4999999999999991,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"836Y3qvzoPStkTCKiU6Zim","id":"uW8r9yxCBYBnbmu4mcD2dK","selected":false},{"type":"Flower","name":"Yellow Flower","cx":2.1540732998146876,"cy":-0.7842673436297751,"cz":0.5,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"836Y3qvzoPStkTCKiU6Zim","id":"7rBvK7XUtGC5sWHZd7QXas","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-2.179727293653672,"cy":-0.7583396115954706,"cz":0.5,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"aiFpq1ExRSUpbVmoio8kUd","id":"a8ojsUZ7mU36ELVrWAE4C8","selected":false},{"type":"Flower","name":"Yellow Flower","cx":1.9219781706072183,"cy":-0.6600952948240391,"cz":0.5,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"aiFpq1ExRSUpbVmoio8kUd","id":"6H6en2GXU1wLSxKHPWsjJ6","selected":false},{"type":"Tree","name":"Apple","cx":13.247382515056007,"cy":-1.2331435918787816,"cz":1.7763568394002505e-15,"lx":6.227742361345067,"lz":6.109070444404363,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"242hfQPKKVCMwkg6guH9SJ","selected":false},{"type":"Tree","name":"Apple","flip":true,"cx":13.169742632007722,"cy":5.190500041503218,"cz":-8.881784197001252e-16,"lx":6.227742361345067,"lz":6.109070444404363,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rfSjqDoXAWcYP1QiJK14Ah","selected":false},{"type":"Tree","name":"Pine","cx":-14.749577815037771,"cy":1.149901818018586,"cz":0,"lx":4.512512815610147,"lz":12.024404332399733,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"fy1FkFpbo7uvywjAGwxRuY","selected":false},{"type":"Tree","name":"Pine","flip":true,"cx":-14.371853116942734,"cy":-0.9634768965176921,"cz":0,"lx":4.512512815610147,"lz":8.962712367303366,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"n1AY9F8phLA3eJfdFeLCVt","selected":false},{"type":"Tree","name":"Pine","flip":true,"cx":-15.240052070171995,"cy":2.549040907949193,"cz":0,"lx":7.596612700375146,"lz":7.787173553198613,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"niwq5q77JDU4G8BQsbgERV","selected":false},{"type":"Tree","name":"Magnolia","flip":true,"cx":-14.127046185685298,"cy":-5.909041660781089,"cz":0,"lx":6.24467494419313,"lz":8.23797178206723,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"svLkeNQopLzpZVKNMw4BPh","selected":false},{"type":"Human","name":"Jeff","cx":0.12654793991771474,"cy":-12.447770037532427,"cz":0,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"ggcEZD7jGqKHjY9sjyW651","selected":false,"ly":0.6},{"type":"Human","name":"Jennifer","cx":-1.02983903936377,"cy":-8.19510646529044,"cz":0.550000011920929,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dR4uPsfmhQVuGb7SK23oGM","id":"9A499PNQRGp7jNr6cuTVMi","selected":false,"ly":0.45},{"type":"Human","name":"Jett","cx":0.945405682980855,"cy":-12.320812786564254,"cz":8.881784197001252e-16,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"xyc9SJrxYKnGoZ1JsnzDHM","selected":false,"ly":0.6},{"type":"Window","cx":-0.016104291229904533,"cy":1.8002134679755866,"cz":4.816843659976703,"lx":6.99919664887142,"ly":0.2,"lz":5.817011327539121,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,3.141592653589793],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"f1J4REo4jQv29PCWE7DY9o"},{"type":"Window","cx":-0.05151161986007091,"cy":-4.040746113044766,"cz":4.837111990518853,"lx":6.999674883388914,"ly":0.2,"lz":5.437430983992275,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,0],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"jvY75c4SHrBZnwZVKousju"},{"type":"Window","cx":5.318722507920985,"cy":4.582891269828743,"cz":4.3657952325816325,"lx":3.467667580770554,"ly":0.2,"lz":0.00531143113289233,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,3.141592653589793],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"sX9UU3kudi5NcAve6pMHjM","polygonTop":[0.4836066024850123,5.296892684036137]},{"type":"Window","cx":-5.343537105869802,"cy":4.545906716881224,"cz":4.3717901143583795,"lx":3.4010319442975763,"ly":0.2,"lz":0.1825055927452041,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,3.141592653589793],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"9u53gJyT1Q25rdtt6maYhC","polygonTop":[-0.5,5.2491187506805534]},{"type":"Window","cx":5.259917043757973,"cy":-6.686746145003361,"cz":4.408217868278964,"lx":3.3609664331480253,"ly":0.2,"lz":0.001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,0],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"uhwFXhZdCJ9WRZodgaGM39","polygonTop":[-0.5,5.167549845268113]},{"type":"Window","cx":-5.283116299901134,"cy":-6.676742962528736,"cz":4.409839299161519,"lx":3.2409329250484538,"ly":0.2,"lz":0.020267481118999123,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16069389122377764,0,0],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"nDuyUhzJ8jfAMyFVHV4a4b","polygonTop":[0.5,5.127516924065475]},{"type":"Window","cx":-7.026900064701883,"cy":-1.1705448238754261,"cz":4.401906118465314,"lx":10.96491542180579,"ly":0.2,"lz":0.05934796066186738,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.24644748988851184,0,4.71238898038469],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"wCvpMZz8wRo6JLVskJvaxa","polygonTop":[-0.002890307610633155,3.539512596657185]},{"type":"Window","cx":7.048045854571776,"cy":-1.093473652020256,"cz":4.390620355845949,"lx":11.034753536063173,"ly":0.2,"lz":0.001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.24644748988851184,0,1.5707963267948963],"parentId":"1YZMDHP4rjNjWTDSh913J6","parentType":"Roof","foundationId":"dR4uPsfmhQVuGb7SK23oGM","id":"qgitJao18HGfoWkWAG39gT","polygonTop":[-0.009542098130494085,3.625871533157426]}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.695474665244077,9.454611546562601,0.00000942600132651463],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.695474665244077,9.453611169126416,150],"theme":"Forest","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[9.628275537924297,-25.20157333419027,4.240697142180643],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":27.20748283999615,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.5642366854944917,-0.4056742952770788,2.0409440324131825],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":[],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},444:function(e){e.exports=JSON.parse('{"docid":"5VKCiKrWNQyEtr5YBL2CSv","time":"05/22/2023 10:12 am","timestamp":1684764769331,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"noAnimationForSolarPanelSimulation":false,"latitude":42.2844063,"cspTimesPerHour":4,"timesPerHour":1,"noAnimationForSensorDataCollection":false,"noAnimationForSolarUpdraftTowerSimulation":false,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"sutGridCellSize":1,"longitude":-71.3488548,"airConvectiveCoefficient":5,"name":"default","highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"diurnalTemperatureModel":1,"discretization":"Approximate","address":"Natick, MA","noAnimationForHeatmapSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspDaysPerYear":4,"pvGridCellSize":0.5,"airAttenuationCoefficient":0.01,"sutDaysPerYear":4,"date":"9/22/2022, 10:00:00 AM","cspGridCellSize":0.5,"dustLoss":0.05,"daysPerYear":12},"elements":[{"type":"Foundation","ly":15.634026313844405,"normal":[0,0,1],"parentId":"Ground","cz":0.05,"lz":0.1,"solarPowerTower":{},"cy":-2.0978986591875834,"selected":false,"rotation":[0,0,0],"solarAbsorberPipe":{},"id":"x9h6vgTSQ3QLh48G3oYMPN","lx":31.424087209321772,"cx":0.2605383705139097,"solarUpdraftTower":{},"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"lx":23.5,"normal":[0,0,1],"roofId":"viqYpNieXAmEvy7RzMSU7R","lz":12,"cz":6.08075667710203,"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"gYxC2R3CWviHFfEMyEPT1K","leftPoint":[10.73068954852153,7.564003538648882,0.1],"cx":-1.0193104514784697,"type":"Wall","rightJoints":["gAzos6YN4ZktUEWKP98uBq"],"rotation":[0,0,0],"relativeAngle":3.141592653589793,"leftJoints":["iF8yBnVR7zKfNKiVQ7M1op"],"cy":7.564003538648882,"selected":false,"leftRoofHeight":12,"rightRoofHeight":12,"windows":[],"textureType":"Wall Texture Default","ly":0.3,"showLabel":false,"rightPoint":[-12.76931045147847,7.564003538648882,0.1],"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"lz":12,"ly":0.3,"cz":0,"lx":10.5,"showLabel":false,"normal":[0,0,1],"cx":-12.76931045147847,"textureType":"Wall Texture Default","roofId":"viqYpNieXAmEvy7RzMSU7R","cy":2.3140035386488824,"leftJoints":["gYxC2R3CWviHFfEMyEPT1K"],"rightJoints":["56tPe5zv4S5mhoVrSD2NK7"],"leftRoofHeight":12,"leftPoint":[-12.76931045147847,7.564003538648882,0.1],"relativeAngle":4.71238898038469,"rightRoofHeight":12,"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"gAzos6YN4ZktUEWKP98uBq","selected":false,"windows":[],"type":"Wall","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","rightPoint":[-12.76931045147847,-2.9359964613511176,0.1],"rotation":[0,0,0],"centerRoofHeight":[0,15.934734349134846],"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cy":2.3140035386488824,"cx":10.73068954852153,"leftJoints":["56tPe5zv4S5mhoVrSD2NK7"],"roofId":"viqYpNieXAmEvy7RzMSU7R","parentId":"x9h6vgTSQ3QLh48G3oYMPN","showLabel":false,"lz":12,"cz":2.6457488129010285,"leftRoofHeight":12,"textureType":"Wall Texture Default","leftPoint":[10.73068954852153,-2.9359964613511176,0.1],"id":"iF8yBnVR7zKfNKiVQ7M1op","rightJoints":["gYxC2R3CWviHFfEMyEPT1K"],"rightRoofHeight":12,"selected":false,"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","rotation":[0,0,0],"type":"Wall","ly":0.3,"relativeAngle":1.5707963267948966,"centerRoofHeight":[0,15.934734349134846],"windows":[],"lx":10.5,"normal":[0,0,1],"rightPoint":[10.73068954852153,7.564003538648882,0.1],"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"showLabel":false,"id":"56tPe5zv4S5mhoVrSD2NK7","roofId":"viqYpNieXAmEvy7RzMSU7R","cz":5.720174265006714,"type":"Wall","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","lz":12,"lx":23.5,"leftPoint":[-12.76931045147847,-2.935996461351123,0.1],"cy":-2.9359964613511202,"leftJoints":["gAzos6YN4ZktUEWKP98uBq"],"relativeAngle":2.2676895822130855e-16,"windows":[],"rotation":[0,0,0],"rightRoofHeight":12,"selected":false,"leftRoofHeight":12,"normal":[0,0,1],"ly":0.3,"rightJoints":["iF8yBnVR7zKfNKiVQ7M1op"],"cx":-1.0193104514784697,"rightPoint":[10.73068954852153,-2.9359964613511176,0.1],"textureType":"Wall Texture Default","parentId":"x9h6vgTSQ3QLh48G3oYMPN","color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cy":0.1,"parentId":"56tPe5zv4S5mhoVrSD2NK7","cx":-0.3617021276595745,"lz":0.17636142264118151,"cz":0.28681928867940926,"ly":0.3,"normal":[0,0,1],"color":"#ffffff","id":"etKxgbj2UBmFLsuY4i5CJ9","rotation":[0,0,0],"lx":0.1702127659574468,"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","selected":false,"showLabel":false,"type":"Window","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"ly":0.3,"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","rotation":[0,0,0],"lx":0.1702127659574468,"normal":[0,0,1],"id":"nF2Q5EW3FMMGZXhRHjxAya","cy":0.1,"parentId":"56tPe5zv4S5mhoVrSD2NK7","cx":-0.1276595744680851,"selected":false,"type":"Window","lz":0.17636142264118151,"cz":0.28681928867940926,"color":"#ffffff","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"id":"bpUvKGmm3pbG6LoUQVwyUS","lx":0.1702127659574468,"lz":0.17636142264118151,"cx":0.10638297872340426,"rotation":[0,0,0],"type":"Window","color":"#ffffff","cz":0.28681928867940926,"selected":false,"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","ly":0.3,"cy":0.1,"normal":[0,0,1],"parentId":"56tPe5zv4S5mhoVrSD2NK7","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"cz":0.28681928867940926,"id":"cGXdptrFDNmLCsGiAspsDd","lz":0.17636142264118151,"parentId":"56tPe5zv4S5mhoVrSD2NK7","type":"Window","ly":0.3,"cx":0.3404255319148936,"cy":0.1,"color":"#ffffff","selected":false,"normal":[0,0,1],"rotation":[0,0,0],"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","lx":0.1702127659574468,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"rotation":[0,0,0],"selected":false,"solarPowerTower":{},"cx":-7.538371501184832,"id":"rzzzSn5cSsCh41KW1dZ8o9","parentId":"Ground","lz":0.1,"lx":21.72063547763523,"cy":0.21534781482795487,"solarUpdraftTower":{},"type":"Foundation","ly":4.31333678945802,"solarAbsorberPipe":{},"cz":0.05,"normal":[0,0,1],"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","normal":[0,0,1],"leftRoofHeight":20,"cx":7.057804014514522,"showLabel":false,"id":"gSgPwypYb2qas3tXnXpzu5","rightPoint":[5.057804014514522,1.9532181864937823,0.1],"cz":0,"selected":false,"relativeAngle":3.141592653589793,"cy":1.9532181864937823,"rightJoints":["ne9d3ykDCR9vMZ2sfPqRBL"],"rotation":[0,0,0],"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","parentId":"rzzzSn5cSsCh41KW1dZ8o9","leftJoints":["5spEvKcr5r35ajFtNP5ug4"],"roofId":"bXyFJNv4LJba2AUhe3ZtVT","rightRoofHeight":20,"windows":[],"leftPoint":[9.057804014514522,1.9532181864937823,0.1],"lz":20,"ly":0.3,"lx":4,"textureType":"Wall Texture Default","color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":13.09781600017236,"rightUnfilledHeight":13.09781600017236,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"leftPoint":[9.057804014514522,-2.0467818135062186,0.1],"cy":-0.04678181350621824,"leftJoints":["iY6iwiFa7FE4A2YwRcXYQX"],"rightPoint":[9.057804014514522,1.9532181864937823,0.1],"rightRoofHeight":20,"lx":4,"cz":0,"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","windows":[],"showLabel":false,"leftRoofHeight":20,"parentId":"rzzzSn5cSsCh41KW1dZ8o9","selected":false,"lz":20,"ly":0.3,"normal":[0,0,1],"type":"Wall","cx":9.057804014514522,"rightJoints":["gSgPwypYb2qas3tXnXpzu5"],"rotation":[0,0,0],"textureType":"Wall Texture Default","id":"5spEvKcr5r35ajFtNP5ug4","roofId":"bXyFJNv4LJba2AUhe3ZtVT","relativeAngle":1.5707963267948966,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":13.10125703573121,"rightUnfilledHeight":13.10125703573121,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","selected":false,"lz":20,"windows":[],"rightJoints":["iY6iwiFa7FE4A2YwRcXYQX"],"lx":4,"leftRoofHeight":20,"cz":0,"rightPoint":[5.057804014514522,-2.0467818135062186,0.1],"type":"Wall","cy":-0.04678181350621824,"roofId":"bXyFJNv4LJba2AUhe3ZtVT","relativeAngle":4.71238898038469,"cx":5.057804014514522,"leftPoint":[5.057804014514522,1.9532181864937823,0.1],"rightRoofHeight":20,"ly":0.3,"rotation":[0,0,0],"parentId":"rzzzSn5cSsCh41KW1dZ8o9","textureType":"Wall Texture Default","showLabel":false,"leftJoints":["gSgPwypYb2qas3tXnXpzu5"],"normal":[0,0,1],"id":"ne9d3ykDCR9vMZ2sfPqRBL","color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":13.104325113888441,"rightUnfilledHeight":13.104325113888441,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"ly":0.3,"windows":[],"rightJoints":["5spEvKcr5r35ajFtNP5ug4"],"lx":4,"relativeAngle":0,"leftPoint":[5.057804014514522,-2.0467818135062186,0.1],"lz":20,"rotation":[0,0,0],"type":"Wall","selected":false,"leftRoofHeight":20,"normal":[0,0,1],"cy":-2.0467818135062186,"rightPoint":[9.057804014514522,-2.0467818135062186,0.1],"rightRoofHeight":20,"showLabel":false,"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","id":"iY6iwiFa7FE4A2YwRcXYQX","leftJoints":["ne9d3ykDCR9vMZ2sfPqRBL"],"cz":0,"parentId":"rzzzSn5cSsCh41KW1dZ8o9","roofId":"bXyFJNv4LJba2AUhe3ZtVT","textureType":"Wall Texture Default","cx":7.057804014514522,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.4,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":13.110251380374818,"rightUnfilledHeight":13.110251380374818,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"normal":[0,0,1],"lx":0,"cx":0,"cz":0,"cy":0,"roofType":"Pyramid","ly":0,"lz":0,"showLabel":false,"parentId":"rzzzSn5cSsCh41KW1dZ8o9","rotation":[0,0,0],"textureType":"Roof Texture Default","type":"Roof","thickness":0.1,"wallsId":["5spEvKcr5r35ajFtNP5ug4","gSgPwypYb2qas3tXnXpzu5","ne9d3ykDCR9vMZ2sfPqRBL","iY6iwiFa7FE4A2YwRcXYQX"],"id":"bXyFJNv4LJba2AUhe3ZtVT","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","selected":false,"color":"#4d4d4d","rise":2.4214017411934243,"ceiling":false,"locked":false},{"cy":0.1,"cx":0,"cz":0.375,"lz":0.1,"foundationId":"rzzzSn5cSsCh41KW1dZ8o9","ly":0.3,"id":"f3zJpwNA8T36dWKnnLB2Ue","normal":[0,0,1],"parentId":"iY6iwiFa7FE4A2YwRcXYQX","type":"Window","selected":false,"lx":0.5,"rotation":[0,0,0],"showLabel":false,"color":"#ffffff","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"cz":0.375,"showLabel":false,"normal":[0,0,1],"parentId":"5spEvKcr5r35ajFtNP5ug4","lx":0.5,"ly":0.3,"cx":0,"color":"#ffffff","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","selected":false,"lz":0.1,"type":"Window","rotation":[0,0,0],"id":"vLvEkBDowmVtpuRDtw4SXE","cy":0.1,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cy":0.1,"id":"4R8u4ZpfkjtqDvbjmeT7bf","rotation":[0,0,0],"lz":0.2,"selected":false,"cx":-0.2857142857142857,"cz":-0.3,"showLabel":false,"parentId":"iF8yBnVR7zKfNKiVQ7M1op","normal":[0,0,1],"lx":0.09523809523809523,"color":"#ffffff","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","ly":0.3,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"lx":0.09523809523809523,"type":"Window","parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","showLabel":false,"selected":false,"color":"#ffffff","rotation":[0,0,0],"id":"sknCCjfYvoTnoJodNpouJ1","cy":0.1,"cz":-0.3,"normal":[0,0,1],"cx":0.2857142857142857,"lz":0.2,"ly":0.3,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"lz":0.09999999999999998,"rotation":[0,0,0],"id":"eu9mFgyuKTJ1jH9yK9yLSt","color":"#ffffff","ly":0.3,"cy":0.1,"lx":0.3047619047619048,"type":"Window","cx":0,"cz":-0.09999999999999998,"selected":false,"showLabel":false,"parentId":"iF8yBnVR7zKfNKiVQ7M1op","normal":[0,0,1],"foundationId":"x9h6vgTSQ3QLh48G3oYMPN","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1.1999999999999997,"locked":false},{"type":"Tree","name":"Oak","cx":23.74199340816881,"cy":10.644500397978508,"cz":0,"lx":20,"lz":24,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"b1PLNbuHYXMSFSk3EuJWpe","selected":false,"locked":false},{"type":"Tree","name":"Elm","cx":-11.169257359842945,"cy":-29.31617204471101,"cz":1.7763568394002505e-15,"lx":20,"lz":20,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"7jf8KwAp3jRyyjP9pa5nD6","selected":false,"locked":false},{"type":"Human","name":"Jack","cx":13.450425292803352,"cy":-0.6851982985911116,"cz":0.05000000074505806,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"fEgQo63aax49KtqEdPTNhE","selected":false,"ly":0.42,"locked":false},{"type":"Human","name":"Jena","cx":15.018980097026159,"cy":12.103463958939685,"cz":3.552713678800501e-15,"lx":0.695,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"4BmWg5mgbRSqHZB7i69JCr","selected":false,"ly":0.695,"locked":false},{"type":"Human","name":"Jeff","cx":17.834834093586977,"cy":-13.833037629725366,"cz":0,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"xix4idJ2qyP21RHv281pxk","selected":false,"ly":0.6,"locked":false},{"type":"Human","name":"Jose","cx":19.855346329668855,"cy":-1.5096947835564674,"cz":0,"lx":2,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"swuHMR6JuNqcRU1q2CGzEB","selected":false,"ly":2,"locked":false},{"type":"Human","name":"June","cx":13.437411824806574,"cy":1.7698691218286662,"cz":0.05000000074505806,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"neJBajzFYG5HwTAskcMmid","selected":false,"ly":0.65,"locked":false},{"type":"Door","cx":1.057355261547768e-17,"cy":0,"cz":-0.325,"lx":0.32380952380952377,"ly":0,"lz":0.35000000000000003,"textureType":"Door Texture #2","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"1cqNEbnbmdgjFsj2KffdDW","color":"white","doorType":"Default","archHeight":1,"filled":true,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-11.283173842293113,"cy":-5.011574326559238,"cz":0.05000000074506161,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"1EBzai8Qd5Jq4dWcsiq8La","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-11.271441109375889,"cy":-7.494044638896808,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","id":"o9s9NrSQqGhb4mKxZK73ZY","selected":false,"locked":false},{"type":"Tree","name":"Maple","cx":-4.545943688973082,"cy":-23.537404195497544,"cz":0,"lx":20,"lz":16.05832090138246,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"gkQDZPnaSVr9iatjDLPxBD","selected":false,"locked":false},{"type":"Tree","name":"Oak","cx":15.895794748349687,"cy":24.757130551972956,"cz":0,"lx":16.237525350473454,"lz":14.730013828864193,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"n7bLUe1p1rbbqq2FsGvzJ1","selected":false,"locked":false},{"type":"Tree","name":"Oak","cx":26.48163780671832,"cy":25.18035168450354,"cz":0,"lx":13.930205088796232,"lz":14.730013828864193,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"64YqofbhUQNT1AUUrbAQFL","selected":false,"flip":true,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.2916666666666667,"lx":0.7619047619047619,"ly":0.3,"lz":0.16666666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"2akAYnPawwHe5duAcNSm7B","windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.37500000000000006,"lx":0.5,"ly":0.3,"lz":0.09999999999999991,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ne9d3ykDCR9vMZ2sfPqRBL","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","id":"4xy5bj1K9gsNUeeRqMHQ4T","windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":0.23099428957730517,"cy":6.239081888589501,"cz":0,"lx":20,"ly":0.3,"lz":6.986961603131722,"leftJoints":["t1G4LBkeHJCJQyxbr7ccH4"],"rightJoints":["4QQLfJpksW9car6RpJhBza"],"leftPoint":[10.230994289577309,6.2390818885895,0.1],"rightPoint":[-9.769005710422693,6.2390818885894985,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"nRyok2ppvyvZoipPDTMibS","parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"2edgYQtearj95L9ExcxpR8","selected":false,"leftRoofHeight":6.986961603131722,"rightRoofHeight":6.986961603131722,"fill":"Partial","eavesLength":0,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6.886961603131723,"rightUnfilledHeight":6.886961603131723,"leftTopPartialHeight":6.986961603131722,"rightTopPartialHeight":6.986961603131722},{"type":"Wall","cx":0.23099428957730755,"cy":-3.260918111410499,"cz":0,"lx":20,"ly":0.3,"lz":5,"leftJoints":["4QQLfJpksW9car6RpJhBza"],"rightJoints":["t1G4LBkeHJCJQyxbr7ccH4"],"leftPoint":[-9.769005710422693,-3.260918111410501,0.1],"rightPoint":[10.230994289577309,-3.2609181114104966,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#9f0500","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"9Yk7vG95h8gCN8K81b6QsV","parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"2edgYQtearj95L9ExcxpR8","selected":false,"leftRoofHeight":5,"rightRoofHeight":5,"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Window","cx":-0.35,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2ZFQrnmC5HWZdeWiMJGmRx","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.19999999999999996,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p5XsrFbFiHc5cUtkroJ7bZ","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.04999999999999996,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sYLoiFbgR7dHUeBey4QLWg","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.10000000000000005,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"waQ4yFfcYPcnN877Bomdn5","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25000000000000006,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"i4RR7R41FRkfno1WwtTX7f","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.4,"cy":0.1,"cz":-0.1,"lx":0.1,"ly":0.3,"lz":0.6,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQwvmPAtL9tsANDrDpmVRC","parentId":"9Yk7vG95h8gCN8K81b6QsV","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":10.230994289577309,"cy":1.4890818885894999,"cz":0,"lx":9.5,"ly":0.3,"lz":5,"leftJoints":["9Yk7vG95h8gCN8K81b6QsV"],"rightJoints":["nRyok2ppvyvZoipPDTMibS"],"leftPoint":[10.230994289577309,-3.2609181114105,0.1],"rightPoint":[10.230994289577309,6.2390818885895,0.1],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#9f0500","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"t1G4LBkeHJCJQyxbr7ccH4","parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"2edgYQtearj95L9ExcxpR8","selected":false,"leftRoofHeight":5,"rightRoofHeight":6.986961603131722,"centerRoofHeight":[0.5,6.986961603131722],"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"type":"Wall","cx":-9.769005710422693,"cy":1.4890818885894987,"cz":0,"lx":9.5,"ly":0.3,"lz":5,"leftJoints":["nRyok2ppvyvZoipPDTMibS"],"rightJoints":["9Yk7vG95h8gCN8K81b6QsV"],"leftPoint":[-9.769005710422693,6.2390818885894985,0.1],"rightPoint":[-9.769005710422693,-3.260918111410501,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#9f0500","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"4QQLfJpksW9car6RpJhBza","parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"2edgYQtearj95L9ExcxpR8","selected":false,"leftRoofHeight":6.986961603131722,"rightRoofHeight":5,"centerRoofHeight":[-0.5,6.986961603131722],"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"id":"2edgYQtearj95L9ExcxpR8","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","foundationId":"cLT8u6hCPgvgGLYpma7b1F","roofType":"Gable","roofStructure":"Default","textureType":"Roof Texture Default","thickness":0.1,"wallsId":["9Yk7vG95h8gCN8K81b6QsV"],"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"selected":false,"rise":0,"ceiling":false,"locked":false},{"type":"Flower","name":"Peony","cx":-7.921494529469528,"cy":-5.703131639854222,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"n7MjXwaqUNnrqr7tttq8Xs","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","flip":true,"cx":-6.921494529469528,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"sV3wDCg6jC5jfbaZPhLEFR","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-5.921494529469528,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"5qYyouDiycvWuJ5qvpfENM","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-4.921494529469526,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"d5qiLf7kCJT5AZq7DadTns","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-3.921494529469527,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"wsrTngfrvFcPA2tZXvJ7x3","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","flip":true,"cx":-2.921494529469527,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"afwAGtRYkrpVQnTg7J7Qth","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-1.921494529469527,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"qcKnQw96DTDSeCGHYqMA48","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-0.9214945294695266,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"waxy4TUCBpoD2cd6LrtnaA","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":0.07850547053047338,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"nvZw8LLJYkjMh1JGkRLD3K","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","flip":true,"cx":1.078505470530473,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"cqsNRo9PPkomK9wdkZupc1","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":2.078505470530473,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"jrx4N63zfhzuthq28WtS35","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":3.0785054705304695,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"mxRRf3jQHxj2YV6RTapCHL","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":4.07850547053047,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"nTZ7SBUGqeqonpnPNpk3oW","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","flip":true,"cx":5.07850547053047,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"3dhHbjvLKuWhGK9UjHE6XT","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":6.07850547053047,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"4GeJePH4hCxCTjZtoXxWto","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":7.07850547053047,"cy":-5.703131639854224,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"7FGr3ZNRc8Yr5eCEbRFCP4","selected":false,"locked":false},{"type":"Flower","name":"Peony","cx":8.541770761909182,"cy":-5.4564771733354345,"cz":0.05000000074505895,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"j6RLkdyyrwF7fa2EzQWxLx","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":11.033481724703831,"cy":2.4259920840004234,"cz":0.05000000074505895,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"keYgfjtBV5HoobU1c7o3UJ","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":10.99612420253719,"cy":0.2217548731086052,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"vVnzt8ngpeWWaQC4FjAL4j","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":10.959797795589187,"cy":-1.7573623215975718,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"gZMPqGYEq2m24MmNCDDYiG","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-10.392242624146428,"cy":3.263587702330267,"cz":0.050000000745050954,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"6Ub8pCiCnETjVt5AhwfdTF","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-10.422719499264469,"cy":0.5714316192013018,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,-3.141592653589793],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"66aAYBuCfd3AhjLpHJLkUu","selected":false,"locked":false},{"type":"Foundation","cx":-0.3396050744252213,"cy":11.51965967612361,"cz":0.05,"lx":27.18366746665238,"ly":13.555523568838572,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cLT8u6hCPgvgGLYpma7b1F","selected":false,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Flower","name":"Hydrangea","cx":-10.300379922837644,"cy":-2.268843152966837,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cLT8u6hCPgvgGLYpma7b1F","id":"ageUa3KUftjZpZZ9K9EjET","selected":false,"locked":false},{"type":"Window","cx":-0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j41VCcj3usY83nb7TyLTSz","parentId":"4QQLfJpksW9car6RpJhBza","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2Gb1qNGA9XYJH1M5ngkWgg","parentId":"4QQLfJpksW9car6RpJhBza","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vi8CDjZJjcyCw9PypDyDTY","parentId":"4QQLfJpksW9car6RpJhBza","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ssGXAAom5GmpQtoTEfxLxY","parentId":"t1G4LBkeHJCJQyxbr7ccH4","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jAMmFqujhajRarjA7EnVcV","parentId":"t1G4LBkeHJCJQyxbr7ccH4","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9iqv8Mygk4XdBQpnv3SnAQ","parentId":"t1G4LBkeHJCJQyxbr7ccH4","foundationId":"cLT8u6hCPgvgGLYpma7b1F","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.3404255319148936,"cy":0.1,"cz":0.28681928867940926,"lx":0.1702127659574468,"ly":0.3,"lz":0.17636142264118151,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eBsupuArqkdPqdm1NpNRGG","parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.10638297872340426,"cy":0.1,"cz":0.28681928867940926,"lx":0.1702127659574468,"ly":0.3,"lz":0.17636142264118151,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fCtqDhopDBEzVW7mRyhrYJ","parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.1276595744680851,"cy":0.1,"cz":0.28681928867940926,"lx":0.1702127659574468,"ly":0.3,"lz":0.17636142264118151,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ug8Cox9PN3TyFyQqu1r9qK","parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3617021276595745,"cy":0.1,"cz":0.28681928867940926,"lx":0.1702127659574468,"ly":0.3,"lz":0.17636142264118151,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3BwnkPkWjwJcrrLjwf9GLa","parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":-0.25,"lx":0.09523809523809523,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"whn43FxoK2FiHHEsJEgwx9","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.09523809523809523,"cy":0.1,"cz":-0.25,"lx":0.09523809523809523,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1jBLLRwnh7NZy9MTMYQHt2","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.14285714285714285,"cy":0.1,"cz":-0.25,"lx":0.09523809523809523,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5ttkkqMJXFY2rDGZmC9Lzj","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.38095238095238093,"cy":0.1,"cz":-0.25,"lx":0.09523809523809523,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"k8vEiLRG6xxiXgVTPxWxXM","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.37500000000000006,"lx":0.5,"ly":0.3,"lz":0.09999999999999991,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6YKcvoA3eJ8MWWe5Vsy3eT","parentId":"gSgPwypYb2qas3tXnXpzu5","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["56tPe5zv4S5mhoVrSD2NK7"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"x9h6vgTSQ3QLh48G3oYMPN","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"viqYpNieXAmEvy7RzMSU7R","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":3.934734349134846,"ceiling":false,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.2916666666666668,"lx":0.7619047619047619,"ly":0.3,"lz":0.16666666666666638,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rk1VAoH8VnjeXMMcRz8iw6","parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"locked":false},{"type":"Window","cx":-0.004761904761904766,"cy":0.1,"cz":0.6791666666666667,"lx":0.23809523809523808,"ly":0.3,"lz":0.125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cdP2JvFiiD6EFxpYXpURLL","parentId":"gAzos6YN4ZktUEWKP98uBq","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Window","cx":0.014285714285714277,"cy":0.1,"cz":0.6708333333333334,"lx":0.23809523809523808,"ly":0.3,"lz":0.125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7hN73eLMovYtBF2VxtgwGA","parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false},{"type":"Light","decay":2,"distance":10,"intensity":10,"color":"#fe9200","cx":0.32491117851716567,"cy":-0.02051365319438737,"cz":22.47091493193306,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,-0.7710068386722702,0.6368268640066874],"rotation":[0.8804206662401132,0,0],"parentId":"bXyFJNv4LJba2AUhe3ZtVT","foundationId":"rzzzSn5cSsCh41KW1dZ8o9","id":"gnMTcek5K3cRDBprwKnFBZ","selected":false,"inside":false,"locked":false},{"type":"Light","decay":2,"distance":10,"intensity":10,"color":"#fe9200","cx":0.002857142857142857,"cy":0,"cz":-0.0025,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[1,0,0],"rotation":[0,0,0],"parentId":"iF8yBnVR7zKfNKiVQ7M1op","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"dpLuhLSSPa19xJpw2Qffsi","selected":false,"locked":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.38095238095238093,"y":-0.125},{"x":-0.38095238095238093,"y":0},{"x":0.38095238095238093,"y":0},{"x":0.38095238095238093,"y":-0.125}],"parentId":"iF8yBnVR7zKfNKiVQ7M1op","parentType":"Wall","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","selected":false,"filled":true,"selectedIndex":2,"id":"sQ3Tb8iVwJfm4J6HcRtiJG","text":"PARADISE FARM","fontColor":"gold","fontSize":1,"noOutline":true,"opacity":0,"locked":false},{"type":"Door","cx":0.02127659574468085,"cy":0,"cz":-0.2708333333333333,"lx":0.5531914893617021,"ly":0,"lz":0.4583333333333333,"doorType":"Default","filled":false,"archHeight":1,"textureType":"No Door Texture","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gYxC2R3CWviHFfEMyEPT1K","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"9ANMGsRZBmgfHhV2Q1CDCc","locked":false,"interior":true},{"type":"Door","cx":-0.02127659574468085,"cy":0,"cz":-0.2916666666666667,"lx":0.5531914893617021,"ly":0,"lz":0.4166666666666667,"doorType":"Default","filled":false,"archHeight":1,"textureType":"No Door Texture","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"56tPe5zv4S5mhoVrSD2NK7","foundationId":"x9h6vgTSQ3QLh48G3oYMPN","id":"vap2L1NkxsVcWyXHMxiu2p","locked":false,"interior":true},{"solarPowerTower":{},"lx":29.20195847671534,"parentId":"Ground","id":"46TKaVq8pvU97fq25w6FtQ","cx":1.0262187405527392,"lz":0.1,"cy":-11.383349626055136,"normal":[0,0,1],"solarAbsorberPipe":{},"selected":false,"cz":0.05,"solarUpdraftTower":{},"ly":12.71246047298328,"rotation":[0,0,0],"type":"Foundation","locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"cz":0,"windows":[],"relativeAngle":3.141592653589793,"id":"kDP3sGBycYRfxJNAuZJQCx","normal":[0,0,1],"rightJoints":["6i3LR3TEvtE6sm3KPPvawH"],"ly":0.3,"cx":-1.69761452373917,"rotation":[0,0,0],"foundationId":"46TKaVq8pvU97fq25w6FtQ","roofId":"6c49g876wkgGNVBvgTNf4N","lz":6.986961603131722,"selected":false,"cy":6.34147142267982,"rightRoofHeight":6.986961603131722,"rightPoint":[-11.697614523739169,6.34147142267982,0.1],"textureType":"No Wall Texture","leftRoofHeight":6.986961603131722,"showLabel":false,"leftPoint":[8.302385476260831,6.34147142267982,0.1],"type":"Wall","lx":20,"parentId":"46TKaVq8pvU97fq25w6FtQ","leftJoints":["7N5hq7UW6d1NtoD4SxrS8y"],"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":6.175009105936305,"rightUnfilledHeight":6.175009105936305,"leftTopPartialHeight":6.986961603131722,"rightTopPartialHeight":6.986961603131722},{"type":"Wall","lz":5,"foundationId":"46TKaVq8pvU97fq25w6FtQ","normal":[0,0,1],"relativeAngle":0,"showLabel":false,"rightJoints":["7N5hq7UW6d1NtoD4SxrS8y"],"leftJoints":["6i3LR3TEvtE6sm3KPPvawH"],"textureType":"Wall Texture Default","leftPoint":[-11.697614523739169,-3.1585285773201797,0.1],"rightPoint":[8.302385476260831,-3.158528577320176,0.1],"id":"6JeFi4vn6AoV5MBuK71Kj4","windows":[],"roofId":"6c49g876wkgGNVBvgTNf4N","rotation":[0,0,0],"lx":20,"cy":-3.1585285773201797,"leftRoofHeight":5,"rightRoofHeight":5,"cz":0,"ly":0.3,"parentId":"46TKaVq8pvU97fq25w6FtQ","selected":false,"cx":-1.69761452373917,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftJoints":["6JeFi4vn6AoV5MBuK71Kj4"],"cy":1.5914714226798203,"roofId":"6c49g876wkgGNVBvgTNf4N","showLabel":false,"windows":[],"type":"Wall","rightJoints":["kDP3sGBycYRfxJNAuZJQCx"],"leftPoint":[8.302385476260831,-3.1585285773201797,0.1],"relativeAngle":1.5707963267948966,"parentId":"46TKaVq8pvU97fq25w6FtQ","normal":[0,0,1],"selected":false,"rotation":[0,0,0],"leftRoofHeight":5,"centerRoofHeight":[0.5,6.986961603131722],"ly":0.3,"lz":5,"id":"7N5hq7UW6d1NtoD4SxrS8y","rightPoint":[8.302385476260831,6.34147142267982,0.1],"foundationId":"46TKaVq8pvU97fq25w6FtQ","rightRoofHeight":6.986961603131722,"lx":9.5,"cz":0,"textureType":"Wall Texture Default","cx":8.302385476260831,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"foundationId":"46TKaVq8pvU97fq25w6FtQ","cx":-11.697614523739169,"id":"6i3LR3TEvtE6sm3KPPvawH","normal":[0,0,1],"type":"Wall","rotation":[0,0,0],"rightRoofHeight":5,"lz":5,"lx":9.5,"rightJoints":["6JeFi4vn6AoV5MBuK71Kj4"],"cz":0,"textureType":"Wall Texture Default","relativeAngle":4.71238898038469,"leftRoofHeight":6.986961603131722,"windows":[],"leftJoints":["kDP3sGBycYRfxJNAuZJQCx"],"showLabel":false,"ly":0.3,"parentId":"46TKaVq8pvU97fq25w6FtQ","leftPoint":[-11.697614523739169,6.34147142267982,0.1],"centerRoofHeight":[-0.5,6.986961603131722],"selected":false,"roofId":"6c49g876wkgGNVBvgTNf4N","rightPoint":[-11.697614523739169,-3.1585285773201797,0.1],"cy":1.5914714226798203,"color":"#9f0500","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":false,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cy":0,"parentId":"46TKaVq8pvU97fq25w6FtQ","rotation":[0,0,0],"ridgeRightPoint":[0.5,1],"selected":false,"type":"Roof","thickness":0.1,"lz":0,"lx":0,"roofType":"Gable","foundationId":"46TKaVq8pvU97fq25w6FtQ","normal":[0,0,1],"cz":0,"id":"6c49g876wkgGNVBvgTNf4N","cx":0,"textureType":"Roof Texture Default","wallsId":["6JeFi4vn6AoV5MBuK71Kj4"],"ridgeLeftPoint":[-0.5,1],"ly":0,"showLabel":false,"color":"#4d4d4d","roofStructure":"Default","rise":0,"ceiling":false,"locked":false},{"id":"8bXmzpgr9i9JFo2oBsPwmf","foundationId":"46TKaVq8pvU97fq25w6FtQ","type":"Window","lx":0.1,"selected":false,"rotation":[0,0,0],"cx":-0.35,"parentId":"6JeFi4vn6AoV5MBuK71Kj4","color":"#ffffff","cy":0,"normal":[0,0,1],"lz":0.6,"showLabel":false,"ly":0.3,"cz":-0.1,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"cz":-0.1,"color":"#ffffff","id":"xjhgUKTmXdCae92VivseTy","parentId":"6JeFi4vn6AoV5MBuK71Kj4","cx":-0.19999999999999996,"foundationId":"46TKaVq8pvU97fq25w6FtQ","rotation":[0,0,0],"lx":0.1,"type":"Window","normal":[0,0,1],"selected":false,"ly":0.3,"cy":0,"lz":0.6,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"cz":-0.1,"lz":0.6,"cy":0,"type":"Window","color":"#ffffff","parentId":"6JeFi4vn6AoV5MBuK71Kj4","cx":-0.04999999999999996,"id":"kPfc2HWm4ZV8tdUhXMQ1J6","selected":false,"normal":[0,0,1],"ly":0.3,"foundationId":"46TKaVq8pvU97fq25w6FtQ","lx":0.1,"rotation":[0,0,0],"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"lz":0.6,"ly":0.3,"parentId":"6JeFi4vn6AoV5MBuK71Kj4","lx":0.1,"foundationId":"46TKaVq8pvU97fq25w6FtQ","color":"#ffffff","cy":0,"type":"Window","selected":false,"cz":-0.1,"cx":0.10000000000000005,"id":"msWBbsfJmqRnJLeUcmpcgH","normal":[0,0,1],"rotation":[0,0,0],"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"selected":false,"ly":0.3,"color":"#ffffff","foundationId":"46TKaVq8pvU97fq25w6FtQ","type":"Window","rotation":[0,0,0],"parentId":"6JeFi4vn6AoV5MBuK71Kj4","normal":[0,0,1],"cx":0.25000000000000006,"lx":0.1,"id":"1cwhsRjtvJtmfm2tgLVX5c","cy":0,"cz":-0.1,"lz":0.6,"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"normal":[0,0,1],"foundationId":"46TKaVq8pvU97fq25w6FtQ","cz":-0.1,"id":"ji1bstwegM7BG7jKCfjWE9","cx":0.4,"parentId":"6JeFi4vn6AoV5MBuK71Kj4","cy":0,"lx":0.1,"type":"Window","ly":0.3,"selected":false,"lz":0.6,"rotation":[0,0,0],"color":"#ffffff","mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"ly":0.3,"type":"Window","rotation":[0,0,0],"cy":0.1,"foundationId":"46TKaVq8pvU97fq25w6FtQ","lz":0.4,"parentId":"7N5hq7UW6d1NtoD4SxrS8y","lx":0.10526315789473684,"cx":-0.2631578947368421,"selected":false,"color":"#ffffff","showLabel":false,"cz":0,"id":"4c1wL2gSvqBAbj5Dt9dzzk","normal":[0,0,1],"mullionSpacing":1,"mullionWidth":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Human","name":"Jess","cx":10.850050894558208,"cy":-3.696870042392426,"cz":0.05000000074505806,"lx":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"pnZ17fTrUAQjd7ZGBi4LZw","selected":false,"ly":0.43,"locked":false},{"type":"Flower","name":"Peony","cx":-9.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"r3HRWGLTLtPMP6QPxaP2u9","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-8.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"eB1sPWxNsgKXNP6CKxK1cQ","selected":false,"flip":true,"locked":false},{"type":"Flower","name":"Hosta","cx":-7.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"pmPLWWXJMx6px3ffjyd7Xf","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-6.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"rFPmR6A2xwJwzhvMRvDbF4","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-5.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"3tR1Hnu1k94fCkXYFdPNCZ","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-4.850103342786,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"ac3W5UphRDEuZMMMxdg9a8","selected":false,"flip":true,"locked":false},{"type":"Flower","name":"Hosta","cx":-3.8501033427860003,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"3j517SjKVEgfCScaEPmkeg","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-2.8501033427860003,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"vLUgsZC1zUxAvajPJX9oRy","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-1.8501033427860003,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"kb5KssfCiZkY9jQ5M4fg79","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":-0.8501033427860003,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"rvgmvqqddGgLnhBVWDH5Yi","selected":false,"flip":true,"locked":false},{"type":"Flower","name":"Hosta","cx":0.1498966572139997,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"whxmnRSL5NJSpdaiWxZBom","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":1.1498966572139997,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"hcWpyraDuh7HTi6CTV9t8w","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":2.1498966572139997,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"k3fvYn4xsoNn35srPUnKcM","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":3.1498966572139997,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"rZdFV48y6NMFUVbnDpaSyZ","selected":false,"flip":true,"locked":false},{"type":"Flower","name":"Hosta","cx":4.149896657214,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"codYgSxPq8Vks6hVgvEgs8","selected":false,"locked":false},{"type":"Flower","name":"Sunflower","cx":5.149896657214,"cy":-5.600742105763903,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"bTFFYv3CW8yhDsAPYPTsXV","selected":false,"locked":false},{"type":"Flower","name":"Peony","cx":6.613161948592704,"cy":-5.354087639245112,"cz":0.05000000074505895,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"ctEoy8WqpFPS2x5ac3G3Pw","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":9.10487291138736,"cy":2.5283816180907426,"cz":0.05000000074505895,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"kGH6RHxnnVioxpEWe4i5gm","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":9.067515389220716,"cy":0.32414440719892745,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"q26Eg31XYAcejy2Lefy1u6","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":9.031188982272717,"cy":-1.654972787507253,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"5yYM5vzDCoYXugAds8nGWB","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-11.93283136913118,"cy":-0.5875588698031677,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"46TKaVq8pvU97fq25w6FtQ","id":"phZdGJBNMcagm1hqvjyqar","selected":false,"locked":false},{"type":"Window","cx":0.05263157894736842,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"i7D5ks6qD3vrJhaHoUEn98","parentId":"7N5hq7UW6d1NtoD4SxrS8y","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3684210526315789,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xjbyj3NQZe1tdahps4bSB2","parentId":"7N5hq7UW6d1NtoD4SxrS8y","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xARzngwCEN8qLjikbQKjCx","parentId":"6i3LR3TEvtE6sm3KPPvawH","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jdyY9wswVivifuQfer37rz","parentId":"6i3LR3TEvtE6sm3KPPvawH","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3157894736842105,"cy":0.1,"cz":0,"lx":0.10526315789473684,"ly":0.3,"lz":0.4,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8yDD6Xt5pfo9gxGo7Y9zu8","parentId":"6i3LR3TEvtE6sm3KPPvawH","foundationId":"46TKaVq8pvU97fq25w6FtQ","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false}],"sceneRadius":49,"view":{"yearlyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"diurnalTemperaturePanelX":0,"showInstructionPanel":true,"axes":false,"enableRotate":true,"weatherPanelY":0,"cameraPosition":[39.53930781148676,-18.15711200922334,7.49838766552481],"showYearlyUpdraftTowerYieldPanel":false,"showSunAngles":false,"dailyPvYieldPanelX":0,"dailyHeliostatYieldPanelY":0,"showDailyHeliostatYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"showDailyLightSensorPanel":false,"solarRadiationHeatMapReflectionOnly":false,"autoRotate":false,"showWeatherPanel":false,"yearlyParabolicDishYieldPanelX":0,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelX":0,"yearlyPvYieldPanelX":0,"mapType":"roadmap","visibilityResultsPanelX":0,"heliodonPanelY":0,"showYearlyParabolicTroughYieldPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"dailyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"mapPanelX":0,"orthographic":false,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelY":0,"showHeliodonPanel":false,"showDailyFresnelReflectorYieldPanel":false,"heliodon":false,"showMapPanel":false,"shadowEnabled":true,"dailyFresnelReflectorYieldPanelY":0,"showYearlyFresnelReflectorYieldPanel":false,"weatherPanelX":0,"yearlyHeliostatYieldPanelX":0,"dailyLightSensorPanelY":0,"showDiurnalTemperaturePanel":false,"showDailyUpdraftTowerYieldPanel":false,"mapPanelY":0,"dailyPvYieldPanelY":0,"showStickyNotePanel":false,"yearlyUpdraftTowerYieldPanelX":0,"yearlyFresnelReflectorYieldPanelX":0,"groundColor":"forestgreen","dailyHeliostatYieldPanelX":0,"stickyNotePanelX":0,"dailyUpdraftTowerYieldPanelY":0,"showElevationAngle":true,"yearlyFresnelReflectorYieldPanelY":0,"showYearlyHeliostatYieldPanel":false,"mapZoom":18,"panCenter":[3.1489910021809835,1.5743732308094776,7.2061184926881126],"visibilityResultsPanelY":0,"showZenithAngle":true,"stickyNotePanelY":0,"showDesignInfoPanel":false,"yearlyPvYieldPanelY":0,"dailyUpdraftTowerYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"showYearlyLightSensorPanel":false,"heliodonPanelX":0,"theme":"Rural","yearlyLightSensorPanelShowDaylight":false,"groundImage":false,"showAzimuthAngle":true,"ambientLightIntensity":0.1,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"showDailyParabolicDishYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"solarRadiationHeatMapMaxValue":5,"showYearlyPvYieldPanel":false,"yearlyLightSensorPanelShowClearness":false,"showSolarPanelVisibilityResultsPanel":false,"diurnalTemperaturePanelY":0,"yearlyHeliostatYieldPanelY":0,"cameraZoom":19,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[9.76105549939355,6.983359177962507,0.0000040802859234775474],"cameraPosition2D":[9.76105549939355,6.983209171299203,150],"yearlyLightSensorPanelX":0,"showDailyParabolicTroughYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},445:function(e){e.exports=JSON.parse('{"docid":"owwsgdXHDbNagWUrRiAo3n","time":"06/18/2023 07:00 pm","timestamp":1687129219076,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Miami, FL, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":25.7616798,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-80.1917902},"elements":[{"ly":21.382516494600992,"solarUpdraftTower":{},"parentId":"Ground","cx":0.12539468533083742,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.14607588848467667,"type":"Foundation","solarPowerTower":{},"lx":18.404896936058655,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"color":"#cccccc","enableGroupMaster":true,"textureType":"Foundation Texture #2","locked":false},{"type":"Human","name":"Jaye","cx":-2.7072108715724905,"cy":5.7390022883526095,"cz":0.05000000074505806,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.55,"locked":false},{"type":"Human","name":"Jess","cx":8.450674550954435,"cy":-2.040964169794302,"cz":0.05000000074505806,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false,"locked":false},{"type":"Wall","cx":-3.3726189887257103,"cy":8.134829504503935,"cz":0,"lx":7.649489274590845,"ly":0.1,"lz":6,"relativeAngle":2.944169982729981,"leftPoint":[0.3775108703190573,7.384697795521461,0.1],"rightPoint":[-7.1227488477704775,8.88496121348641,0],"leftJoints":["fH1Eycb1edh4ewg8cSm7F2"],"rightJoints":["1fNhHihSFWK4q4YFxM4GxP"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"jtB2mK47EhRe9haPUXWpqu","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":3.6275108703190573,"cy":7.384697795521461,"cz":0,"lx":6.5,"ly":0.1,"lz":6,"relativeAngle":3.141592653589793,"leftPoint":[6.877510870319057,7.384697795521461,0.1],"rightPoint":[0.3775108703190573,7.384697795521461,0.1],"leftJoints":["o3wqaqdyzHo4XWGr2xqwut"],"rightJoints":["jtB2mK47EhRe9haPUXWpqu"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"fH1Eycb1edh4ewg8cSm7F2","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":6.877510870319057,"cy":4.634697795521461,"cz":0,"lx":5.499999999999999,"ly":0.1,"lz":6,"relativeAngle":1.5707963267948966,"leftPoint":[6.877510870319057,1.884697795521462,0.1],"rightPoint":[6.877510870319059,7.384697795521461,0.1],"leftJoints":["vGUEcuvyBtUte9nHKMMtRK"],"rightJoints":["fH1Eycb1edh4ewg8cSm7F2"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"o3wqaqdyzHo4XWGr2xqwut","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":3.627703166633557,"cy":1.884697795521462,"cz":0,"lx":6.501153732383853,"ly":0.1,"lz":6,"relativeAngle":0,"leftPoint":[0.3775108703190573,1.884697795521462,0.1],"rightPoint":[6.877895462948057,1.8846977955214619,0],"leftJoints":["jREcPkJHS2ha1J5przL31q"],"rightJoints":["o3wqaqdyzHo4XWGr2xqwut"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"vGUEcuvyBtUte9nHKMMtRK","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-3.3724891296809427,"cy":2.884697795521462,"cz":0,"lx":7.762087348130012,"ly":0.1,"lz":6,"relativeAngle":6.022582915432245,"leftPoint":[-7.122489129680943,3.884697795521462,0.1],"rightPoint":[0.3775108703190573,1.884697795521462,0.1],"leftJoints":["1fNhHihSFWK4q4YFxM4GxP"],"rightJoints":["vGUEcuvyBtUte9nHKMMtRK"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"jREcPkJHS2ha1J5przL31q","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-7.122489129680943,"cy":6.384697795521461,"cz":0,"lx":4.999999999999999,"ly":0.1,"lz":6,"relativeAngle":4.71238898038469,"leftPoint":[-7.122489129680943,8.884697795521461,0.1],"rightPoint":[-7.122489129680943,3.884697795521462,0.1],"leftJoints":["jtB2mK47EhRe9haPUXWpqu"],"rightJoints":["jREcPkJHS2ha1J5przL31q"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"1fNhHihSFWK4q4YFxM4GxP","roofId":"5PVMZuTRFmTCfk2YbWKwPq","leftRoofHeight":6,"rightRoofHeight":6,"color":"#cccccc","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Foundation","cx":4.805913157134036,"cy":-3.6653250376384854,"cz":0.2,"lx":4.565495674711998,"ly":6.575538224210636,"lz":0.4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"krZVQGBw1wVwxak2PssY7v","textureType":"Foundation Texture #5","locked":false,"notBuilding":true},{"type":"Foundation","cx":7.301535582510818,"cy":-3.7151297019599916,"cz":0.25,"lx":0.5,"ly":6.504377225831106,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"iv83XEzdWqY6v8XR5AToXK","color":"#ffffff","locked":false,"notBuilding":true},{"type":"Foundation","cx":2.4329687772478152,"cy":-3.7102946606740073,"cz":0.25,"lx":0.5,"ly":6.504377225831106,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cLXoh6MxU5E5Gva8BASQRm","selected":false,"locked":false,"notBuilding":true},{"type":"Foundation","cx":4.862158322186749,"cy":-0.20866405563399004,"cz":0.25,"lx":5.379502342454104,"ly":0.5,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hzhocB2hGXGCFSJk2wnktz","selected":false,"locked":false,"notBuilding":true},{"type":"Foundation","cx":4.862690579253708,"cy":-7.224281838084487,"cz":0.25,"lx":5.379502342454104,"ly":0.5,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gHY8UXkMn58xRtZAJVDtN6","selected":false,"locked":false,"notBuilding":true},{"type":"Foundation","cx":4.866917615138179,"cy":-7.704867444683629,"cz":0.15,"lx":5.379502342454104,"ly":0.5,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3HGisFhi9kVGUkmKRBhKms","selected":false,"locked":false,"notBuilding":true},{"type":"Window","cx":-3.416070845000482e-17,"cy":0.1,"cz":0.29166666666666663,"lx":0.9230769230769231,"ly":0.3,"lz":0.25000000000000006,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vGUEcuvyBtUte9nHKMMtRK","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"jrakT4hmGTpA5xVoQK7Sx3","locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.000040953643875444483,"cy":0.3,"cz":-0.2833333333333333,"lx":0.9229950157891724,"ly":0.3,"lz":0.39999999999999997,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vGUEcuvyBtUte9nHKMMtRK","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"e19pGWtpLkqWbfXdnaZhjy","locked":false,"frame":true,"frameWidth":0.1,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1,"sillWidth":0},{"type":"Window","cx":-0.2898704818803739,"cy":0.1,"cz":0.29166666666666663,"lx":0.19324698792024925,"ly":0.3,"lz":0.24999999999999992,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"jREcPkJHS2ha1J5przL31q","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"sovEYSXhGEu5Ldj2kgneVg","locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.2254548192402908,"cy":0.1,"cz":0.2916666666666667,"lx":0.19324698792024925,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gFuo9DkFa685GcUxuiuYb8","parentId":"jREcPkJHS2ha1J5przL31q","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2898704818803739,"cy":0.1,"cz":-0.2083333333333333,"lx":0.19324698792024925,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hhZYVdjTizeYL1gPxKSz9p","parentId":"jREcPkJHS2ha1J5przL31q","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.2254548192402908,"cy":0.1,"cz":-0.2083333333333333,"lx":0.19324698792024925,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"28zX4FcaMGFduU6Aof316p","parentId":"jREcPkJHS2ha1J5przL31q","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0033765060398756046,"cy":0.1,"cz":0.29166666666666663,"lx":0.793246987920249,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4MrXBjecJdLy1tjgTVbQVw","parentId":"1fNhHihSFWK4q4YFxM4GxP","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0033765060398756046,"cy":0.1,"cz":-0.20833333333333334,"lx":0.793246987920249,"ly":0.3,"lz":0.25,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"paKeNYdxXEhDFWLKsseJA5","parentId":"1fNhHihSFWK4q4YFxM4GxP","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.29468156152921643,"cy":0.1,"cz":0.29166666666666663,"lx":0.19713085278206485,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u1u3AjVrK7HHdWWARHUbKE","parentId":"jtB2mK47EhRe9haPUXWpqu","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16292275379321294,"cy":0.1,"cz":0.2916666666666667,"lx":0.19713085278206485,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"srk5mHASnPgAUpjbT9uftd","parentId":"jtB2mK47EhRe9haPUXWpqu","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.29468156152921643,"cy":0.1,"cz":-0.2083333333333333,"lx":0.19713085278206485,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tuZbwGt7CbT6QqTZ4sKjKB","parentId":"jtB2mK47EhRe9haPUXWpqu","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16292275379321294,"cy":0.1,"cz":-0.2083333333333333,"lx":0.19713085278206485,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fVyFjpBszkzEvddzxZF4cN","parentId":"jtB2mK47EhRe9haPUXWpqu","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.2139500417756478,"cy":0.1,"cz":0.2916666666666667,"lx":0.27405392970514175,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jgsYPqkQbCLB7nSKYoTQz1","parentId":"fH1Eycb1edh4ewg8cSm7F2","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["jtB2mK47EhRe9haPUXWpqu","1fNhHihSFWK4q4YFxM4GxP","jREcPkJHS2ha1J5przL31q","vGUEcuvyBtUte9nHKMMtRK","o3wqaqdyzHo4XWGr2xqwut","fH1Eycb1edh4ewg8cSm7F2"],"textureType":"No Roof Texture","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"5PVMZuTRFmTCfk2YbWKwPq","locked":false,"rise":0,"ceiling":false},{"type":"Window","cx":0.2139500417756478,"cy":0.1,"cz":-0.2083333333333333,"lx":0.27405392970514175,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iYZGRCyiCoyTmxb2iW91K5","parentId":"fH1Eycb1edh4ewg8cSm7F2","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.24758841976281373,"cy":0.1,"cz":-0.2083333333333333,"lx":0.27405392970514175,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3hXTrx5RjPnoyDuFRCWL2w","parentId":"fH1Eycb1edh4ewg8cSm7F2","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.24758841976281373,"cy":0.1,"cz":0.2916666666666667,"lx":0.27405392970514175,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7TekVwAyTBKGDMvDso7KwN","parentId":"fH1Eycb1edh4ewg8cSm7F2","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frameWidth":0.05,"frame":true,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.22727272727272732,"cy":0.1,"cz":0.2916666666666667,"lx":0.27272727272727276,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ky3TVidbZJNxBmsHW5p4aV","parentId":"o3wqaqdyzHo4XWGr2xqwut","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.22727272727272732,"cy":0.1,"cz":0.2916666666666667,"lx":0.27272727272727276,"ly":0.3,"lz":0.24999999999999992,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6T5fUwPHMtaFTnJUZ9FeNm","parentId":"o3wqaqdyzHo4XWGr2xqwut","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.22727272727272732,"cy":0.1,"cz":-0.20833333333333334,"lx":0.27272727272727276,"ly":0.3,"lz":0.25,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uH3BNCdk4hWNuoStiax9Mc","parentId":"o3wqaqdyzHo4XWGr2xqwut","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Window","cx":0.22727272727272732,"cy":0.1,"cz":-0.20833333333333334,"lx":0.27272727272727276,"ly":0.3,"lz":0.25,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4JcJH5e4rWagE4s7pxc2vr","parentId":"o3wqaqdyzHo4XWGr2xqwut","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"frame":true,"frameWidth":0.05,"mullion":true,"opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1},{"type":"Tree","name":"Coconut","cx":-3.5174202973352635,"cy":-5.952506495142959,"cz":0.050000000745058504,"lx":3.421252972867562,"lz":5.8824455683270385,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"r4PU1mJTsD7Dm4DCSTQbEk","selected":false,"locked":false},{"type":"Tree","name":"Coconut","flip":true,"cx":-4.056727114780923,"cy":-6.820925912328164,"cz":0.05000000074505806,"lx":3.421252972867562,"lz":3.7067838832176516,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qYjmrdb86SDT3egVhi2Ddg","selected":false,"locked":false},{"type":"Tree","name":"Coconut","flip":true,"cx":-3.058157215251919,"cy":-5.348879217798858,"cz":0.05000000074505806,"lx":2.0761240579059335,"lz":3.468323603426934,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7qTMbix1j6GoFy9o8Dge8Q","selected":false,"locked":false},{"type":"Tree","name":"Pine","flip":true,"cx":-6.654527859836286,"cy":-7.991796862008116,"cz":0.05000000074505806,"lx":2.811171334227782,"lz":5.2304806796050185,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"hgWXQayK9bDxaZTKFMFyaj","selected":false,"locked":false},{"type":"Tree","name":"Pine","flip":false,"cx":-6.145316897074318,"cy":-8.056698018196002,"cz":0.050000000745058504,"lx":2.1110953047223546,"lz":3.545986285890324,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5NPZQ3kADKqz5pZRjy2r8m","selected":false,"locked":false},{"type":"Flower","name":"Spirea","cx":8.102181299831539,"cy":4.045842994396765,"cz":0.05000000074505806,"lx":1.8,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"taF3ALjLpVssdzRj5rkAQQ","selected":false,"locked":false},{"type":"Flower","name":"Spirea","cx":-5.879762709897744,"cy":1.4043677766482918,"cz":0.05000000074502964,"lx":1.8,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"j5yY2k9GT68hDzGzo8g4X5","selected":false,"locked":false},{"type":"Flower","name":"Spirea","cx":-8.163745041032497,"cy":5.853168143382562,"cz":0.05000000074505806,"lx":1.8,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"wQLFTPCoFnPyshTWJztWv8","selected":false,"locked":false},{"type":"Flower","name":"Spirea","cx":-2.279762709897744,"cy":1.4043677766482918,"cz":0.05000000074502964,"lx":1.8,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8nf4FW7PRbc5MHE74z6k6X","selected":false,"locked":false},{"type":"Flower","name":"Boxwood","cx":8.755439698619178,"cy":-3.801559677962663,"cz":0.050000000745058504,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3Me2yqTX69xpAQdJimGv6J","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-3.7656917519971405,"cy":-7.189954744763735,"cz":0.050000000745057616,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"b8dhYx3mLo55GMwpAMANF4","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-2.9954361886672194,"cy":-6.017555062549365,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"aD6qe37bZZVXu7NhL9YCyw","selected":false,"locked":false},{"type":"Flower","name":"Hosta","cx":-2.5427971092417136,"cy":-4.3436146516258916,"cz":0.05000000074505717,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"6Z7HQYvZ4Ls1JaGM7AfPk1","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-5.573500548190964,"cy":-8.097341718681303,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"igiDoKTCbe5rQ5p9LftFTF","selected":false,"locked":false},{"type":"Human","name":"Judd","cx":7.8538131049134385,"cy":-5.07106737312789,"cz":0.05000000074505828,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3PTeJ2nnhnU1658gE9hwVj","selected":false,"locked":false,"ly":0.544},{"type":"Human","name":"Jeff","cx":1.3294328409358478,"cy":0.0073529482213468,"cz":0.1500000059604645,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3HGisFhi9kVGUkmKRBhKms","id":"vmxzjFWTAjwTqms6QcsEP3","selected":false,"locked":false,"ly":0.6},{"type":"Human","name":"Jamelia","flip":true,"cx":8.040674150226515,"cy":-6.334084712275156,"cz":0.05000000074505806,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5Qsgp8Gq1Jr7PUZmxevYZR","selected":false,"locked":false,"ly":0.65},{"type":"Human","name":"Jennifer","cx":-0.9884229521541545,"cy":3.585869160830872,"cz":0.05000000074505806,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"sjU37oco1BJnmRhataWCxf","selected":false,"ly":0.45},{"type":"Tree","name":"Fan Palm","cx":-3.0053849919153564,"cy":-3.8414595688219437,"cz":0.05000000074505806,"lx":3.3292228289929944,"lz":4.535630581080736,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"72iSoNbD98zvpFJ2Q1mmkB","selected":false},{"type":"Flower","name":"Hosta","flip":true,"cx":-3.557645718087297,"cy":-6.494909623054461,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"fixSsPsLT9YGgQ2atTquS7","selected":false},{"type":"Flower","name":"Hosta","cx":-2.8775394857306047,"cy":-4.995547826339774,"cz":0.05000000074505717,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rGgsLECHRG1JrsuPt4Zkbs","selected":false},{"type":"Flower","name":"Hosta","flip":true,"cx":-2.6007319365603525,"cy":-5.483479639543539,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"2RrpkK93q9tXhZRqF6FvrT","selected":false},{"type":"Flower","name":"Hosta","flip":true,"cx":-2.14120900487017,"cy":-4.690834516460342,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"eXNFmUTqaatU1h8XmR1dnP","selected":false},{"type":"Flower","name":"Hosta","cx":-2.251092230304847,"cy":-3.591429672886945,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"ro5BfNTKQSaGfLx4eKBnio","selected":false},{"type":"Light","decay":2,"distance":6,"intensity":8,"color":"#009ce0","cx":-0.0668233149685919,"cy":0.05804493333085005,"cz":0.500000007450585,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"hjub9esH6NqUMrKoM4qiEZ","selected":false},{"type":"Light","decay":2,"distance":6,"intensity":8,"color":"#009ce0","cx":0.4297365503834882,"cy":-0.1789222334700641,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"6aGXSJXX1kvmEvo5FpXMaw","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":8,"color":"#fe9200","cx":0.0692403262735466,"cy":0.2196827525166444,"cz":6.2,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5PVMZuTRFmTCfk2YbWKwPq","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"432pe1oLqRcmTRcAYqgtqG","selected":false,"inside":true},{"type":"Light","decay":2,"distance":6,"intensity":8,"color":"#fe9200","cx":-0.17601132104075962,"cy":-0.3273891737363795,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"iMv2LJEW81uJy7BUGUKL83","selected":false},{"type":"Polygon","cx":-0.020412282064186955,"cy":-0.023334577896438075,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.03636363636363637,"y":-0.08333333333333333},{"x":-0.1272727272727273,"y":-0.08333333333333333},{"x":-0.05454545454545455,"y":-0.03333333333333333},{"x":-0.09090909090909093,"y":0.049999999999999996},{"x":0,"y":0},{"x":0.09090909090909093,"y":0.049999999999999996},{"x":0.05454545454545455,"y":-0.03333333333333333},{"x":0.1272727272727273,"y":-0.08333333333333333},{"x":0.03636363636363637,"y":-0.08333333333333333},{"x":0,"y":-0.16666666666666666}],"parentId":"o3wqaqdyzHo4XWGr2xqwut","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":1,"id":"bM2XuLbGojMjjtTq6QbXqK","lineColor":"#4d4d4d","noOutline":false,"text":"26","fontSize":0.3,"fontColor":"gold","fontOutlineWidth":0.01,"lineWidth":1}],"sceneRadius":14,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0.7599467981478756,-5.067346033277178,-0.000005027848075881249],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0.7599467981478756,-5.067496039946536,150],"theme":"Rural","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[15.236325505747509,-7.86777235732635,2.457105139993579],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":75.89554049207442,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-1.6563214275080296,1.8214306688802133,2.457105139993578],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},446:function(e){e.exports=JSON.parse('{"docid":"hPTJuLgPgoJuMRXMJ2VDBS","time":"06/15/2023 03:10 pm","timestamp":1686856228122,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"5/22/2022, 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":10.473983232081025,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.22738864151314608,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.8212100903152009,"type":"Foundation","solarPowerTower":{},"lx":13.564552414056891,"lz":0.08037925094719676,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"enableGroupMaster":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":0,"lx":12,"relativeAngle":3.141592653589793,"lz":4.0189625473598385,"roofId":"nbw17kYeUHp1aouuScuF3Y","ly":0.3,"rightPoint":[-5.457020109151015,3.478026472724187,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[6.542979890848985,3.478026472724187,0.1],"type":"Wall","rightRoofHeight":4.0189625473598385,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4.0189625473598385,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.5429798908489842,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":3.478026472724187,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385,"locked":true},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.542979890848985,"leftPoint":[6.542979890848985,-4.021973527275812,0.1],"cy":-0.27197352727581237,"leftRoofHeight":4.0189625473598385,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.542979890848985,3.478026472724187,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":7.5,"normal":[0,0,1],"lz":4.0189625473598385,"centerRoofHeight":[-0.022465454047944533,6.807600955038734],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":1.2992388529678256,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","rightRoofHeight":4.0189625473598385,"roofId":"nbw17kYeUHp1aouuScuF3Y","color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385,"locked":true},{"lx":7.5,"windows":[],"lz":4.0189625473598385,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"nbw17kYeUHp1aouuScuF3Y","selected":false,"cy":-0.27197352727581237,"cz":2.586710917765224,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0.022465454047944533,6.807600955038734],"rightPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4.0189625473598385,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.457020109151015,3.478026472724187,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4.0189625473598385,"ly":0.3,"cx":-5.457020109151015,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385,"locked":true},{"showLabel":false,"cx":0.5429798908489842,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.542979890848985,-4.021973527275812,0.1],"cz":2.4938633836176103,"textureType":"Wall Texture Default","cy":-4.021973527275812,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"nbw17kYeUHp1aouuScuF3Y","leftPoint":[-5.457020109151015,-4.021973527275812,0.1],"normal":[0,0,1],"ly":0.3,"lz":4.0189625473598385,"leftRoofHeight":4.0189625473598385,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4.0189625473598385,"lx":12,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.0189625473598385,"rightTopPartialHeight":4.0189625473598385,"locked":true},{"type":"Foundation","ly":9.17890503672627,"lz":0.06478560897373455,"rotation":[0,0,0],"cz":0.05,"cx":-3.0123969578104886,"lx":2.997193198016322,"parentId":"Ground","solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"solarUpdraftTower":{},"normal":[0,0,1],"cy":-1.5649990896825194,"id":"8fpWrU7qVyVgipB7LtABom","hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"showLabel":false,"cz":3.903941909848086,"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","lz":5.674455425565713,"ly":0.3,"leftRoofHeight":5.674455425565713,"relativeAngle":3.141592653589793,"rightRoofHeight":5.674455425565713,"leftJoints":["4Q8KDQDxyuamkEtRJU3paR"],"lx":2.13057265557637,"windows":[],"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"rightJoints":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Wall Texture Default","cx":-0.011530025051640469,"leftPoint":[1.0537563027365446,1.8025200094198752,0],"type":"Wall","rightPoint":[-1.0768163528398256,1.8025200094198752,0],"id":"bKLMq3WjuxRcsMDb5d4Xo1","cy":1.8025200094198752,"normal":[0,0,1],"selected":false,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","centerRoofHeight":[0,6.808247394681429],"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.9689600797771365,"rightUnfilledHeight":3.9689600797771365,"leftTopPartialHeight":5.674455425565713,"rightTopPartialHeight":5.674455425565713,"locked":true},{"normal":[0,0,1],"leftJoints":["7xigJB2WiCCrREDc2Ja3YN"],"lz":5.674455425565713,"selected":false,"ly":0.3,"cz":3.5644394786617815,"id":"4Q8KDQDxyuamkEtRJU3paR","rotation":[0,0,0],"cy":0.250986023416642,"rightJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"leftPoint":[1.0537563027365446,-1.3005479625865912,0],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","textureType":"Wall Texture Default","cx":1.053756302736545,"showLabel":false,"leftRoofHeight":5.674455425565713,"foundationId":"8fpWrU7qVyVgipB7LtABom","relativeAngle":1.5707963267948963,"windows":[],"rightRoofHeight":5.674455425565713,"type":"Wall","parentId":"8fpWrU7qVyVgipB7LtABom","rightPoint":[1.0537563027365453,1.8025200094198752,0],"lx":3.1030679720064667,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.020600140222275,"rightUnfilledHeight":4.020600140222275,"leftTopPartialHeight":5.674455425565713,"rightTopPartialHeight":5.674455425565713,"locked":true},{"rightJoints":["7xigJB2WiCCrREDc2Ja3YN"],"parentId":"8fpWrU7qVyVgipB7LtABom","showLabel":false,"leftRoofHeight":5.674455425565713,"selected":false,"id":"1ATAe6P2KAHKLDSDfpVro9","leftJoints":["bKLMq3WjuxRcsMDb5d4Xo1"],"textureType":"Wall Texture Default","cx":-1.0768163528398256,"rightPoint":[-1.0768163528398256,-1.3005479625865912,0],"lz":5.674455425565713,"relativeAngle":-1.5707963267948966,"normal":[0,0,1],"type":"Wall","cz":3.660138480027889,"rotation":[0,0,0],"leftPoint":[-1.0768163528398256,1.8025200094198752,0],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","foundationId":"8fpWrU7qVyVgipB7LtABom","lx":3.1030679720064667,"cy":0.250986023416642,"windows":[],"ly":0.3,"rightRoofHeight":5.674455425565713,"color":"#ffffff","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5.674455425565713,"rightUnfilledHeight":3.92594971520268,"leftTopPartialHeight":5.674455425565713,"rightTopPartialHeight":5.674455425565713,"locked":true},{"ly":0,"cx":0,"type":"Roof","thickness":0.1,"ridgeLeftPoint":[0.022465454047944533,1],"textureType":"Roof Texture #1","showLabel":false,"lz":0,"normal":[0,0,1],"ridgeRightPoint":[-0.022465454047944533,1],"wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"selected":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0,"roofType":"Gable","id":"nbw17kYeUHp1aouuScuF3Y","parentId":"m7AH7DcnoGzAq9kryBy4RS","cz":0,"rotation":[0,0,0],"lx":0,"color":"#666666","rise":2.7886384076788957,"ceiling":true,"locked":true},{"rightPoint":[1.0537563027365446,-1.3005479625865912,0],"roofId":"7MxSmgNk4kQf8eNqmnwjMJ","selected":false,"parentId":"8fpWrU7qVyVgipB7LtABom","rotation":[0,0,0],"cx":-0.011530025051640469,"ly":0.3,"relativeAngle":0,"cz":3.535805069111796,"rightJoints":["4Q8KDQDxyuamkEtRJU3paR"],"leftRoofHeight":5.674455425565713,"rightRoofHeight":5.674455425565713,"id":"7xigJB2WiCCrREDc2Ja3YN","normal":[0,0,1],"leftPoint":[-1.0768163528398256,-1.3005479625865912,0],"type":"Wall","cy":-1.3005479625865912,"leftJoints":["1ATAe6P2KAHKLDSDfpVro9"],"lz":5.674455425565713,"windows":[],"showLabel":false,"textureType":"Wall Texture Default","lx":2.13057265557637,"foundationId":"8fpWrU7qVyVgipB7LtABom","color":"#ffffff","centerRoofHeight":[0,6.808247394681429],"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.143662209927734,"rightUnfilledHeight":4.143662209927734,"leftTopPartialHeight":5.674455425565713,"rightTopPartialHeight":5.674455425565713,"locked":true},{"normal":[0,0,1],"rotation":[0,0,0],"lz":0.08037925094719676,"cz":0.05,"solarPowerTower":{},"parentId":"Ground","ly":2.3229214459557985,"lx":3.6868215598526417,"cx":6.688554173396975,"solarUpdraftTower":{},"cy":0.40327666182062216,"solarAbsorberPipe":{},"id":"3KgcTmNBqtYJcCny8HxQyQ","type":"Foundation","selected":false,"notBuilding":true,"locked":true},{"id":"5eUwuiBwfGoNEpcHG5kHqK","lx":1.5,"leftJoints":["h8DQWwUSgNc283RWhcM3B1"],"rightPoint":[-0.5114783908278628,0.8698262658360515,0.1],"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftPoint":[0.9885216091721372,0.8698262658360515,0.1],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","textureType":"Wall Texture #3","cz":0,"cx":0.23852160917213716,"selected":false,"rotation":[0,0,0],"windows":[],"normal":[0,0,1],"ly":0.2,"lz":7.234132585247709,"showLabel":false,"cy":0.8698262658360515,"rightJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"type":"Wall","relativeAngle":3.141592653589793,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.234132585247709,"rightTopPartialHeight":7.234132585247709,"locked":true},{"type":"Wall","leftPoint":[-0.5114783908278628,0.8698262658360515,0.1],"rotation":[0,0,0],"cy":0.1198262658360515,"lz":7.234132585247709,"textureType":"Wall Texture #3","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","ly":0.2,"rightJoints":["qQNV4qND1aDjEtJsd6HVio"],"lx":1.4999999999999998,"parentId":"3KgcTmNBqtYJcCny8HxQyQ","windows":[],"selected":false,"leftJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"showLabel":false,"id":"hbU2xUbmKEDDXYDMWnjjCc","relativeAngle":4.71238898038469,"rightPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"normal":[0,0,1],"cz":0,"cx":-0.5114783908278628,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.234132585247709,"rightTopPartialHeight":7.234132585247709,"locked":true},{"leftPoint":[-0.5114783908278628,-0.6301737341639485,0.1],"cy":-0.6301737341639485,"rightJoints":["h8DQWwUSgNc283RWhcM3B1"],"rightPoint":[0.9885216091721372,-0.6301737341639485,0.1],"cz":0,"windows":[],"lz":7.234132585247709,"selected":false,"rotation":[0,0,0],"ly":0.2,"relativeAngle":0,"foundationId":"3KgcTmNBqtYJcCny8HxQyQ","normal":[0,0,1],"leftJoints":["hbU2xUbmKEDDXYDMWnjjCc"],"textureType":"Wall Texture #3","parentId":"3KgcTmNBqtYJcCny8HxQyQ","lx":1.5,"showLabel":false,"cx":0.23852160917213716,"type":"Wall","id":"qQNV4qND1aDjEtJsd6HVio","studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.234132585247709,"rightTopPartialHeight":7.234132585247709,"locked":true},{"id":"h8DQWwUSgNc283RWhcM3B1","type":"Wall","relativeAngle":1.5707963267948966,"normal":[0,0,1],"windows":[],"leftPoint":[0.9885216091721372,-0.6301737341639485,0.1],"cz":0,"rightJoints":["5eUwuiBwfGoNEpcHG5kHqK"],"selected":false,"textureType":"Wall Texture #3","ly":0.2,"cx":0.9885216091721372,"lx":1.5,"cy":0.1198262658360515,"rightPoint":[0.9885216091721372,0.8698262658360515,0.1],"showLabel":false,"lz":7.234132585247709,"rotation":[0,0,0],"parentId":"3KgcTmNBqtYJcCny8HxQyQ","foundationId":"3KgcTmNBqtYJcCny8HxQyQ","leftJoints":["qQNV4qND1aDjEtJsd6HVio"],"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.234132585247709,"rightTopPartialHeight":7.234132585247709,"locked":true},{"type":"Window","showLabel":false,"ly":0.3,"lz":0.44384979425833565,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.09751468078404088,"selected":false,"cx":-0.4166666666666667,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","frame":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.1219248971291678,"normal":[0,0,1],"cx":-0.25,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"cx":0.25,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#ffffff","cz":-0.1219248971291678,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0.3,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":1,"shutter":{"showLeft":false,"showRight":false,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.4166666666666667,"cy":0.1,"cz":-0.09751468078404088,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0.3,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"tint":"#73D8FF","frame":true,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"lz":0.3942112571821837,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#ffffff","lx":0.13333333333333333,"cx":0.3333333333333333,"cz":-0.09710562859109184,"ly":0.3,"showLabel":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"ly":0.3,"selected":false,"type":"Window","foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0,"cz":0.5913168857732756,"id":"9k4wgdGyyHM5BC1r2nJbQH","lx":0.13333333333333333,"color":"#ffffff","lz":0.3942112571821837,"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","rotation":[0,0,0],"cx":0,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"ly":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.3333333333333333,"rotation":[0,0,0],"type":"Window","lz":0.3942112571821837,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":-0.09710562859109184,"lx":0.13333333333333333,"color":"#ffffff","cy":0.1,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Tree","name":"Pine","cx":11.005948677853029,"cy":-1.394052607962342,"cz":3.552713678800501e-15,"lx":6.452035166159083,"lz":9.139816695798023,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"t5Aj8tjjpqVaLaB3uEqfR8","selected":false,"locked":true},{"type":"Window","cx":-0.25833333333333336,"cy":-1.3376344861350336e-15,"cz":-0.08,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.26666666666666666,"cy":-1.1010413489448665e-14,"cz":-0.08,"lx":0.13333333333333333,"ly":0.3,"lz":0.3942112571821837,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":1,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Wall","cx":-0.15054541065002525,"cy":1.76763937363111,"cz":3.903941909848086,"lx":7.859980732011655,"ly":0.1,"lz":3.8503419054045027,"leftJoints":["qdWCAVU64LNURAh8wmzrJW"],"rightJoints":["5SVe8cv2nsyRKR6jszXPqq"],"leftPoint":[3.779444955355803,1.76763937363111,0.06056023612846141],"rightPoint":[-4.08053577665585,1.76763937363111,0.06056023612846141],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eYz6mrLsdVMWcgpJiTXXtH","parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofId":"9SPVWHTRZMkvFFbvi4Y4dK","leftRoofHeight":3.8503419054045027,"rightRoofHeight":3.8503419054045027,"selected":false,"studWidth":0.1,"studColor":"white","opacity":0,"wallStructure":"Stud","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.8503419054045027,"rightTopPartialHeight":3.8503419054045027,"locked":true},{"type":"Wall","cx":3.779444955355803,"cy":0.10818511446824708,"cz":3.5644394786617815,"lx":3.3189085183257268,"ly":0.1,"lz":3.442308777851562,"leftJoints":["9YsY5P23SDcYcTLJeEGMo8"],"rightJoints":["eYz6mrLsdVMWcgpJiTXXtH"],"leftPoint":[3.779444955355803,-1.5512691446946167,0.06056023612846141],"rightPoint":[3.779444955355805,1.76763937363111,0.06056023612846141],"relativeAngle":1.570796326794896,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qdWCAVU64LNURAh8wmzrJW","parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofId":"9SPVWHTRZMkvFFbvi4Y4dK","leftRoofHeight":3.442308777851562,"rightRoofHeight":3.8503419054045027,"centerRoofHeight":[0.5,3.8503419054045027],"selected":false,"studWidth":0.1,"wallStructure":"Stud","opacity":0.25,"studSpacing":1.6,"studColor":"white","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.442308777851562,"rightTopPartialHeight":3.442308777851562,"locked":true},{"type":"Wall","cx":-4.08053577665585,"cy":0.10818511446824708,"cz":3.660138480027889,"lx":3.3189085183257268,"ly":0.1,"lz":3.442308777851562,"leftJoints":["eYz6mrLsdVMWcgpJiTXXtH"],"rightJoints":["9YsY5P23SDcYcTLJeEGMo8"],"leftPoint":[-4.08053577665585,1.76763937363111,0.06056023612846141],"rightPoint":[-4.08053577665585,-1.5512691446946167,0.06056023612846141],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5SVe8cv2nsyRKR6jszXPqq","parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofId":"9SPVWHTRZMkvFFbvi4Y4dK","leftRoofHeight":3.8503419054045027,"rightRoofHeight":3.442308777851562,"centerRoofHeight":[-0.5,3.8503419054045027],"selected":false,"wallStructure":"Stud","opacity":0.25,"studWidth":0.1,"studSpacing":1.6,"studColor":"white","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.442308777851562,"rightTopPartialHeight":3.442308777851562,"locked":true},{"type":"Wall","cx":-0.15054541065002525,"cy":-1.5512691446946167,"cz":3.535805069111796,"lx":7.859980732011655,"ly":0.1,"lz":3.442308777851562,"leftJoints":["5SVe8cv2nsyRKR6jszXPqq"],"rightJoints":["qdWCAVU64LNURAh8wmzrJW"],"leftPoint":[-4.08053577665585,-1.5512691446946167,0.06056023612846141],"rightPoint":[3.779444955355803,-1.5512691446946167,0.06056023612846141],"relativeAngle":0,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9YsY5P23SDcYcTLJeEGMo8","parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofId":"9SPVWHTRZMkvFFbvi4Y4dK","leftRoofHeight":3.442308777851562,"rightRoofHeight":3.442308777851562,"selected":false,"studWidth":0.1,"wallStructure":"Stud","opacity":0.25,"studColor":"white","studSpacing":2,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.442308777851562,"rightTopPartialHeight":3.442308777851562,"locked":true},{"id":"9SPVWHTRZMkvFFbvi4Y4dK","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"91GS1aZ3DbZBjAVtatsatL","foundationId":"91GS1aZ3DbZBjAVtatsatL","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.1,"wallsId":["9YsY5P23SDcYcTLJeEGMo8"],"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"selected":false,"translucent":true,"rafterSpacing":2,"roofStructure":"Rafter","rise":0,"ceiling":false,"locked":true},{"type":"Foundation","cx":0.4816835699661557,"cy":-4.8267180085139945,"cz":0.05,"lx":9.870953390145004,"ly":4.194004820393555,"lz":0.04867786417191091,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"91GS1aZ3DbZBjAVtatsatL","selected":false,"notBuilding":true,"locked":true},{"type":"Door","cx":0,"cy":0,"cz":-0.2,"lx":0.25,"ly":0,"lz":0.6,"textureType":"Door Texture #6","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"huHgxbUk5nxatnYiuq2HhR","doorType":"Default","archHeight":1,"filled":true,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["1ATAe6P2KAHKLDSDfpVro9"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8fpWrU7qVyVgipB7LtABom","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"7MxSmgNk4kQf8eNqmnwjMJ","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":1.1337919691157152,"ceiling":false,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.46576840681624293,"lx":0.34364727930476036,"ly":0.3,"lz":0.15525613560541424,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7xigJB2WiCCrREDc2Ja3YN","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"bKSng9YxxhEwLmca6q52t4","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"frame":true,"frameWidth":0.06,"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","windowType":"Default","archHeight":1,"locked":true},{"type":"Wall","cx":-0.011530025051640469,"cy":1.8025200094198752,"cz":3.903941909848086,"lx":2.13057265557637,"ly":0.3,"lz":5.665479357106698,"leftJoints":["gjFo4dGKiFsEAtvgC2uCdo"],"rightJoints":["28JZn5ZqftnjWtvDA7sVWD"],"leftPoint":[1.0537563027365446,1.8025200094198752,0],"rightPoint":[-1.0768163528398256,1.8025200094198752,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3J2f3hD7LiPYocNLAGAHn1","parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofId":"rEidR5TzysvNG1rgGa79ag","leftRoofHeight":5.665479357106698,"rightRoofHeight":5.665479357106698,"centerRoofHeight":[0,6.765479357106699],"selected":false,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.17087314092728,"rightUnfilledHeight":4.17087314092728,"leftTopPartialHeight":5.665479357106698,"rightTopPartialHeight":5.665479357106698,"locked":true},{"type":"Wall","cx":1.053756302736545,"cy":0.250986023416642,"cz":3.5644394786617815,"lx":3.1030679720064667,"ly":0.3,"lz":5.665479357106698,"leftJoints":["fWZF78k9YENmcxHia3M4iF"],"rightJoints":["3J2f3hD7LiPYocNLAGAHn1"],"leftPoint":[1.0537563027365446,-1.3005479625865912,0],"rightPoint":[1.0537563027365453,1.8025200094198752,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gjFo4dGKiFsEAtvgC2uCdo","parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofId":"rEidR5TzysvNG1rgGa79ag","leftRoofHeight":5.665479357106698,"rightRoofHeight":5.665479357106698,"selected":false,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.2501718067420615,"rightUnfilledHeight":5.665479357106698,"leftTopPartialHeight":5.665479357106698,"rightTopPartialHeight":5.665479357106698,"locked":true},{"type":"Wall","cx":-1.0768163528398256,"cy":0.250986023416642,"cz":3.660138480027889,"lx":3.1030679720064667,"ly":0.3,"lz":5.665479357106698,"leftJoints":["3J2f3hD7LiPYocNLAGAHn1"],"rightJoints":["fWZF78k9YENmcxHia3M4iF"],"leftPoint":[-1.0768163528398256,1.8025200094198752,0],"rightPoint":[-1.0768163528398256,-1.3005479625865912,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"28JZn5ZqftnjWtvDA7sVWD","parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofId":"rEidR5TzysvNG1rgGa79ag","leftRoofHeight":5.665479357106698,"rightRoofHeight":5.665479357106698,"selected":false,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.112382106286621,"rightUnfilledHeight":4.112382106286621,"leftTopPartialHeight":5.665479357106698,"rightTopPartialHeight":5.665479357106698,"locked":true},{"type":"Wall","cx":-0.011530025051640469,"cy":-1.3005479625865912,"cz":3.535805069111796,"lx":2.13057265557637,"ly":0.3,"lz":5.665479357106698,"leftJoints":["28JZn5ZqftnjWtvDA7sVWD"],"rightJoints":["gjFo4dGKiFsEAtvgC2uCdo"],"leftPoint":[-1.0768163528398256,-1.3005479625865912,0],"rightPoint":[1.0537563027365446,-1.3005479625865912,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fWZF78k9YENmcxHia3M4iF","parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofId":"rEidR5TzysvNG1rgGa79ag","leftRoofHeight":5.665479357106698,"rightRoofHeight":5.665479357106698,"centerRoofHeight":[0,6.765479357106699],"selected":false,"studWidth":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.243512040075365,"rightUnfilledHeight":4.243512040075365,"leftTopPartialHeight":5.665479357106698,"rightTopPartialHeight":5.665479357106698,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.46576840681624293,"lx":0.34364727930476036,"ly":0.3,"lz":0.15525613560541424,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gAS9MDKRJP4JWvfqrqBKdy","parentId":"fWZF78k9YENmcxHia3M4iF","foundationId":"nu2sn9efF1AHCFrvuV5ULi","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.06,"windowType":"Default","archHeight":1,"locked":true},{"id":"rEidR5TzysvNG1rgGa79ag","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nu2sn9efF1AHCFrvuV5ULi","foundationId":"nu2sn9efF1AHCFrvuV5ULi","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.1,"wallsId":["28JZn5ZqftnjWtvDA7sVWD"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rise":1.1,"ceiling":false,"locked":true},{"type":"Foundation","cx":3.6575623433664717,"cy":-1.54061534072674,"cz":0.05,"lx":2.997193198016322,"ly":9.17890503672627,"lz":0.06468312864431171,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nu2sn9efF1AHCFrvuV5ULi","selected":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"type":"Door","cx":0,"cy":0,"cz":-0.18779489182743653,"lx":0.13333333333333333,"ly":0,"lz":0.624410216345127,"textureType":"Door Texture #1","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"eBQam4YYdXWFEi5iDbVQ4t","doorType":"Default","archHeight":1,"filled":true,"locked":true},{"type":"Tree","name":"Apple","cx":-8.870480061609383,"cy":-0.6721812852789775,"cz":0,"lx":4.272747980812545,"lz":4.234704800641296,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"oGL2siNwwXoicUvtQoHfi3","selected":false,"locked":true},{"type":"Human","name":"Jamelia","cx":0.5077215094390786,"cy":-5.182357959116953,"cz":0,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"havSSZEB6mAoQ1s57LQVxN","selected":false,"ly":0.65,"locked":true},{"type":"Human","name":"Jack","cx":-7.974613533200657,"cy":-4.521571410086505,"cz":8.881784197001252e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fPgwwBmXz2LWV9vPRMmqzu","selected":false,"ly":0.42,"locked":true},{"type":"Flower","name":"Hosta","cx":-6.306441231413446,"cy":-4.762303364786677,"cz":4.440892098500626e-16,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"1cAkMnRPZL6fG1dhWuUn14","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":6.169203623475488,"cy":-5.72637309429814,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"htN99q9wA5PLZNcJh1UgLF","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-5.061905234310647,"cy":-5.806918097592128,"cz":-1.7763568394002505e-15,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"j1Fmf7QNoHATgNqGSJnptk","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":5.621277500928149,"cy":-6.190060319204097,"cz":-8.881784197001252e-16,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"b8aTi9NKLHSRuN9DAY2Dvd","selected":false,"locked":true},{"type":"Flower","name":"Tall Bush","cx":5.615846305114406,"cy":-5.453095801875909,"cz":0.040189623832702644,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"84bbtLrAVMTpW8zhkv6ac6","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":6.558445661570947,"cy":-5.148346193790616,"cz":0,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7PKC5BECKBBX3d4Za7d4Du","selected":false,"locked":true},{"type":"Flower","name":"Red Rose","cx":-5.407028367581802,"cy":-5.549301025270703,"cz":0,"lx":0.5,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"s9wwdrqZHX68urRnmZ9bDp","selected":false,"locked":true},{"type":"Flower","name":"Tall Bush","cx":-4.834800784349908,"cy":-4.621520750635222,"cz":0,"lx":1,"lz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"vKDYbBm1LFSeCRbRGxpJzR","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":-5.746710484862029,"cy":-5.268820363710504,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qrfLBQvCQkPzUhnUEFDgC1","selected":false,"locked":true},{"type":"Flower","name":"Red Rose","cx":5.955104289170869,"cy":-5.9761317798049545,"cz":0,"lx":0.5,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"daEJUZv3vgUrqorbyNtAdL","selected":false,"locked":true},{"type":"Flower","name":"Red Rose","cx":6.380681139084028,"cy":-5.4372416572511035,"cz":0,"lx":0.5,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"oCHH6YeZ2ebkct1XeVw26T","selected":false,"locked":true},{"type":"Flower","name":"Red Rose","cx":-6.0720221613270775,"cy":-5.14772584317228,"cz":0,"lx":0.5,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"kAuo84ejkCrSVu9PCaPugg","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":1.6210802629879084,"cy":-8.23340133659074,"cz":0,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"kmbR9RJMfaDSwNReuSKCjQ","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":3.611880585955519,"cy":-8.204961331976918,"cz":0,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"8bs3duj4DEPj8B5fQB6m61","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-0.5688000922764606,"cy":-8.261841341204562,"cz":0,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"xiFfAWcKYuiBh744RUaZyc","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-2.844000461382297,"cy":-8.261841341204562,"cz":0,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"wV1JQBxQxSUBFz9dC7xrav","selected":false,"locked":true},{"type":"Tree","name":"Pine","cx":11.504343484441804,"cy":-0.763939147024864,"cz":0,"lx":5.1791034594942555,"lz":5.428693136268209,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"iVXpvVvo7CVsBLdZiLcmV8","selected":false,"flip":true,"locked":true},{"type":"Tree","name":"Pine","cx":14.030494530217624,"cy":0.04081963902747532,"cz":0,"lx":4.05233280460769,"lz":7.181542362302404,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wTP4kg9xyU48nnBEmn3ppV","selected":false,"locked":true},{"type":"Foundation","cx":0.30925292274615623,"cy":-1.2101326772862784,"cz":0.05,"lx":6.745176508169567,"ly":8.157824691427903,"lz":0.0627727643414778,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"j26S3yBrW81Hpmua4v9rbN","selected":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":true},{"type":"Wall","cx":0.0036303018672041443,"cy":1.418731310908802,"cz":3.903941909848086,"lx":6.727305402522589,"ly":0.3,"lz":6.620718306713466,"leftJoints":["9SCrAqQSk4xVacCdSJE3pn"],"rightJoints":["8Vadn4BSVDAC5WjSkKfgzz"],"leftPoint":[3.367283003128499,1.418731310908802,0],"rightPoint":[-3.3600223993940905,1.418731310908802,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5AKBX2BV6amQvk312dBM8B","parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","studWidth":0.1,"roofId":"vKXQiCBzbfpPSTJ27J8jBB","selected":false,"leftRoofHeight":6.620718306713466,"rightRoofHeight":6.620718306713466,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.324926656434854,"rightUnfilledHeight":4.324926656434854,"leftTopPartialHeight":6.620718306713466,"rightTopPartialHeight":6.620718306713466,"locked":true},{"type":"Wall","cx":3.3672830031285006,"cy":-0.062237916432278606,"cz":3.5644394786617815,"lx":2.961938454682161,"ly":0.3,"lz":5.64147421981503,"leftJoints":["dTWEdcfdTXFV5sEPVRd8z5"],"rightJoints":["5AKBX2BV6amQvk312dBM8B"],"leftPoint":[3.367283003128499,-1.5432071437733592,0],"rightPoint":[3.367283003128503,1.418731310908802,0],"relativeAngle":1.5707963267948952,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9SCrAqQSk4xVacCdSJE3pn","parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","studWidth":0.1,"roofId":"vKXQiCBzbfpPSTJ27J8jBB","selected":false,"leftRoofHeight":5.64147421981503,"rightRoofHeight":6.620718306713466,"centerRoofHeight":[0.5,6.620718306713466],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.092459386252685,"rightUnfilledHeight":4.092459386252685,"leftTopPartialHeight":5.64147421981503,"rightTopPartialHeight":5.64147421981503,"locked":true},{"type":"Wall","cx":-3.3600223993940905,"cy":-0.062237916432278606,"cz":3.660138480027889,"lx":2.961938454682161,"ly":0.3,"lz":5.64147421981503,"leftJoints":["5AKBX2BV6amQvk312dBM8B"],"rightJoints":["dTWEdcfdTXFV5sEPVRd8z5"],"leftPoint":[-3.3600223993940905,1.418731310908802,0],"rightPoint":[-3.3600223993940905,-1.5432071437733592,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8Vadn4BSVDAC5WjSkKfgzz","parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","studWidth":0.1,"roofId":"vKXQiCBzbfpPSTJ27J8jBB","selected":false,"leftRoofHeight":6.620718306713466,"rightRoofHeight":5.64147421981503,"centerRoofHeight":[-0.5,6.620718306713466],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.9233710526843555,"rightUnfilledHeight":3.9233710526843555,"leftTopPartialHeight":5.64147421981503,"rightTopPartialHeight":5.64147421981503,"locked":true},{"type":"Wall","cx":0.0036303018672041443,"cy":-1.5432071437733592,"cz":3.535805069111796,"lx":6.727305402522589,"ly":0.3,"lz":5.64147421981503,"leftJoints":["8Vadn4BSVDAC5WjSkKfgzz"],"rightJoints":["9SCrAqQSk4xVacCdSJE3pn"],"leftPoint":[-3.3600223993940905,-1.5432071437733592,0],"rightPoint":[3.367283003128499,-1.5432071437733592,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dTWEdcfdTXFV5sEPVRd8z5","parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","studWidth":0.1,"roofId":"vKXQiCBzbfpPSTJ27J8jBB","selected":false,"leftRoofHeight":5.64147421981503,"rightRoofHeight":5.64147421981503,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.163695339993486,"rightUnfilledHeight":4.163695339993486,"leftTopPartialHeight":5.64147421981503,"rightTopPartialHeight":5.64147421981503,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","roofStructure":"Default","wallsId":["dTWEdcfdTXFV5sEPVRd8z5"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"j26S3yBrW81Hpmua4v9rbN","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"vKXQiCBzbfpPSTJ27J8jBB","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"rise":0,"ceiling":false,"locked":true},{"type":"Window","cx":0,"cy":0.3,"cz":0.40953276837441766,"lx":0.44594377993825984,"ly":0.3,"lz":0.14548273694573843,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"dTWEdcfdTXFV5sEPVRd8z5","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"r1RG4byiDKweDnNzMe6Uqt","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.31833333333333336,"cy":0.1,"cz":-0.12239672405306627,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nkKGWu3sRWjy8kWKFV8wES","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.30833333333333335,"cy":0.1,"cz":-0.09751468078404088,"lx":0.08333333333333333,"ly":0.3,"lz":0.44384979425833565,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e4784e1QWCibptuMbZE3Fb","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#666666","width":0.3},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.4506499123046388,"cy":-2.253829215918892,"cz":5.495676945306635,"lx":6.517117804983129,"ly":0.1,"lz":3.1452722458300313,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"miUkiQAMUrUH9VdizU1QHd","locked":true},{"type":"Window","cx":-0.040529886594876885,"cy":0.3,"cz":0.36293328834815236,"lx":0.6611308564654793,"ly":0.3,"lz":0.23883190909923116,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"28JZn5ZqftnjWtvDA7sVWD","parentType":"Wall","foundationId":"nu2sn9efF1AHCFrvuV5ULi","id":"xq6zsNgL6KPAX41MXZ3EbC","locked":true},{"type":"Window","cx":0.02441680094832896,"cy":0.3,"cz":0.35427189383741103,"lx":0.6933570277585752,"ly":0.3,"lz":0.2562105393925967,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"4Q8KDQDxyuamkEtRJU3paR","parentType":"Wall","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"qcnFPvRmcmP1h3bepT45qh","locked":true},{"type":"Window","cx":4.296638448514275,"cy":-2.708258875969741,"cz":5.141848441701093,"lx":0.8645085564531798,"ly":0.1,"lz":1.937214690596396,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"cMbDioVwT4kfspCSxauDDf","polygonTop":[-0.5,1.125032012484936],"locked":true},{"type":"Window","cx":-3.3098661063241783,"cy":-2.738630134883686,"cz":5.118200739891894,"lx":0.6049071605861784,"ly":0.1,"lz":2.2332848397709752,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.6615683838581541,0,0],"parentId":"nbw17kYeUHp1aouuScuF3Y","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"vbnhFbrJ9782uVqEAWSbqW","polygonTop":[0.5,0.9018556681153167],"locked":true},{"type":"Window","cx":1.0937607455840728,"cy":0.6467227885963354,"cz":5.73187840674332,"lx":2.4176106129913375,"ly":0.1,"lz":0.16460115006383247,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8165400713416964,0,1.5707963267948963],"parentId":"7MxSmgNk4kQf8eNqmnwjMJ","parentType":"Roof","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"wCFZjtmrD2b8mTn1f1qano","polygonTop":[0.5,1.0560439311761334],"locked":true},{"type":"Window","cx":-1.0462741509941371,"cy":1.4199114403224693,"cz":5.8069617126253155,"lx":0.9242462576351369,"ly":0.1,"lz":0.1721360167476046,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8165400713416961,0,4.71238898038469],"parentId":"7MxSmgNk4kQf8eNqmnwjMJ","parentType":"Roof","foundationId":"8fpWrU7qVyVgipB7LtABom","id":"kdtAstd8jE9ACZ3TfHUAZb","polygonTop":[-0.5,0.99155281262393],"locked":true},{"type":"Window","cx":-1.1170172726431056,"cy":0.5138568052522039,"cz":5.723968440623406,"lx":2.596092763357134,"ly":0.1,"lz":0.082389128100567,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8014286985579611,0,4.71238898038469],"parentId":"rEidR5TzysvNG1rgGa79ag","parentType":"Roof","foundationId":"nu2sn9efF1AHCFrvuV5ULi","id":"7Y1EoQrhcqZsSLDF4LmMiA","polygonTop":[-0.5,1.2214855671184548],"locked":true},{"type":"Window","cx":1.0534033913747818,"cy":1.2212640151421539,"cz":5.765843768521558,"lx":1.130053534424075,"ly":0.1,"lz":0.020226846288053643,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8014286985579612,0,1.5707963267948963],"parentId":"rEidR5TzysvNG1rgGa79ag","parentType":"Roof","foundationId":"nu2sn9efF1AHCFrvuV5ULi","id":"x4QzPw1xK8z1dYWnRSPfDD","polygonTop":[0.5,1.214791037762756],"locked":true},{"type":"Window","cx":0.428377511975304,"cy":0.3,"cz":0.36902546903156846,"lx":0.11351539072017484,"ly":0.3,"lz":0.22649733563143687,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"dTWEdcfdTXFV5sEPVRd8z5","parentType":"Wall","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"rGAmTgsinEVfLmLsgxtKCo","locked":true},{"type":"Window","cx":-0.428377511975304,"cy":0.3,"cz":0.3671875531695516,"lx":0.11351539072017484,"ly":0.3,"lz":0.2228215039074031,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"dTWEdcfdTXFV5sEPVRd8z5","parentType":"Wall","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"tcZghwrXjxrMrPYG8qWmMK","locked":true},{"type":"Window","cx":-2.887838483851968,"cy":-1.5429231830507752,"cz":5.741568099840816,"lx":1.1156980571027848,"ly":0.1,"lz":0.006652456667148232,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3192968291527907,0,0],"parentId":"vKXQiCBzbfpPSTJ27J8jBB","parentType":"Roof","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"iAta14nH255gL4E1skBYr2","polygonTop":[-0.5,3.135049288439095],"locked":true},{"type":"Window","cx":2.9643296778973105,"cy":-1.5489835426240144,"cz":5.739564489243441,"lx":0.977937957633503,"ly":0.1,"lz":0.09523764867628905,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3192968291527907,0,0],"parentId":"vKXQiCBzbfpPSTJ27J8jBB","parentType":"Roof","foundationId":"j26S3yBrW81Hpmua4v9rbN","id":"p89tc6ji5qG8UFCeVeXzs6","polygonTop":[0.5,3.0552575653113068],"locked":true}],"sceneRadius":20,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.94522901824079,-1.0741381728239148,-0.00000107590488899985],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.94522901824079,-1.075138550271241,150],"theme":"Forest","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-4.574738869546006,-17.12597647560641,2.6902980037557214],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":45.44146361606706,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#3a8569","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.8575132784294428,-0.32342939215259475,2.6902980037557214],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},447:function(e){e.exports=JSON.parse('{"docid":"tn5NXrCgVkn7A5sexifmrP","time":"02/04/2023 01:00 pm","timestamp":1675533609468,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"6/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"M4J3+GMR, Rue de La Kasbah, Kairouan, Tunisia","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":35.6813583,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.25,"name":"default","longitude":10.1041467},"elements":[{"type":"Wall","cx":-1.5357911804424789,"cy":-8.147946678658776,"cz":2.268765007024547,"lx":41.99999999999999,"ly":0.5,"lz":10,"leftJoints":["pV4i6Rv9Vpys7aXEi9nnh4"],"rightJoints":["m87y7C5QvZwH9XgiqzyDsg"],"leftPoint":[-22.535791180442477,-8.147946678658771,0.25],"rightPoint":[19.464208819557516,-8.147946678658784,0.25],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tKvexMf8zrvPgydcZb5VYA","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"q6GhCTYocV8Du6Z7WCqnGz","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"leftRoofHeight":10,"rightRoofHeight":10,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Foundation","cx":1.290269817272435,"cy":-3.5970579374045144,"cz":0.125,"lx":65.10485687395563,"ly":44.85538565072669,"lz":0.25,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"color":"#999999"},{"type":"Wall","cx":19.46420881955751,"cy":2.1020533213412156,"cz":0,"lx":20.5,"ly":0.5,"lz":10,"relativeAngle":1.5707963267948966,"leftPoint":[19.464208819557516,-8.147946678658784,0.25],"rightPoint":[19.46420881955751,12.352053321341215,0.25],"leftJoints":["tKvexMf8zrvPgydcZb5VYA"],"rightJoints":["3u1tb8n3XMJZXYU3udLNqv"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"m87y7C5QvZwH9XgiqzyDsg","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"q6GhCTYocV8Du6Z7WCqnGz","leftRoofHeight":10,"rightRoofHeight":10,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-1.5357911804424824,"cy":12.352053321341218,"cz":0,"lx":42,"ly":0.5,"lz":10,"relativeAngle":3.141592653589793,"leftPoint":[19.464208819557516,12.352053321341216,0.25],"rightPoint":[-22.535791180442484,12.35205332134122,0.25],"leftJoints":["m87y7C5QvZwH9XgiqzyDsg"],"rightJoints":["pV4i6Rv9Vpys7aXEi9nnh4"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"3u1tb8n3XMJZXYU3udLNqv","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"q6GhCTYocV8Du6Z7WCqnGz","leftRoofHeight":10,"rightRoofHeight":10,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-22.535791180442498,"cy":2.1020533213412165,"cz":0,"lx":20.500000000000007,"ly":0.5,"lz":10,"relativeAngle":4.712388980384689,"leftPoint":[-22.535791180442484,12.35205332134122,0.25],"rightPoint":[-22.535791180442505,-8.147946678658787,0.25],"leftJoints":["3u1tb8n3XMJZXYU3udLNqv"],"rightJoints":["tKvexMf8zrvPgydcZb5VYA"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"pV4i6Rv9Vpys7aXEi9nnh4","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"q6GhCTYocV8Du6Z7WCqnGz","leftRoofHeight":10,"rightRoofHeight":10,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Human","name":"Jaah","cx":-20.815616879711254,"cy":-18.576078606733773,"cz":0.125,"lx":0.74,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"oS4Uf1aJoiB2V9pQqWTsVG","selected":false,"ly":0.74},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.5,"roofType":"Pyramid","roofStructure":"Default","wallsId":["3u1tb8n3XMJZXYU3udLNqv","pV4i6Rv9Vpys7aXEi9nnh4","tKvexMf8zrvPgydcZb5VYA","m87y7C5QvZwH9XgiqzyDsg"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"q6GhCTYocV8Du6Z7WCqnGz","sideColor":"#ffffff","rise":0,"ceiling":false},{"type":"Door","cx":-0.4107142857142858,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"doorType":"Arched","archHeight":1,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"jXmzH2ciK425Fb6dH2EkVp","filled":false},{"type":"Door","cx":-0.3214285714285715,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"3Ypjy6UAE7xHgadjTDfe2a","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":-0.2321428571428572,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"mMiEmbz3vkGVE8tUbXxgNQ","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":-0.1428571428571429,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"tPuRheQMuGYu1gmyqi6c4s","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":-0.0535714285714286,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"qCzzF9bXjrUUQcTszp1SPS","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.0357142857142857,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"r6qnpYnu8yvZzEEeE2fqps","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.125,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"bYotwM3kh8YucfABgu8Eot","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.2142857142857143,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"bH3GWXsdZcQF9JUubCPadp","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.3035714285714286,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"hgaMdHTtMAFGSJgPw6fbgW","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Door","cx":0.3928571428571429,"cy":0,"cz":-0.2,"lx":0.059523809523809534,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"tcvaKKEqJwZ2KN8UScxvAs","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"filled":false},{"type":"Wall","cx":-2.0348646464512568,"cy":-10.275504500010312,"cz":2.268765007024547,"lx":38.88254641036014,"ly":0.5,"lz":16,"leftJoints":["iC5vVUbJMtmDkNzYUxBZPA"],"rightJoints":["mM4PcE69DPCUHMXtdYUR1q"],"leftPoint":[-21.47613785163133,-10.275504500010307,0.1],"rightPoint":[17.406408558728813,-10.275504500010317,0.1],"relativeAngle":-2.741111892188643e-16,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tHwdHqDmQXFhmVBYpGMk1M","parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"wyopmFLrEU8Q6F3Eo2E8qH","leftRoofHeight":16,"rightRoofHeight":16,"selected":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"type":"Wall","cx":17.406408558728813,"cy":-1.3101914721012853,"cz":0,"lx":17.930626055818067,"ly":0.5,"lz":16,"leftJoints":["tHwdHqDmQXFhmVBYpGMk1M"],"rightJoints":[],"leftPoint":[17.406408558728813,-10.275504500010317,0.1],"rightPoint":[17.406408558728806,7.655121555807748,0.1],"relativeAngle":1.5707963267948972,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mM4PcE69DPCUHMXtdYUR1q","parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"wyopmFLrEU8Q6F3Eo2E8qH","leftRoofHeight":16,"rightRoofHeight":16,"selected":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"type":"Wall","cx":-21.476137851631343,"cy":-1.310191472101287,"cz":0,"lx":17.930626055818067,"ly":0.5,"lz":16,"leftJoints":[],"rightJoints":["tHwdHqDmQXFhmVBYpGMk1M"],"leftPoint":[-21.476137851631336,7.655121555807748,0.1],"rightPoint":[-21.47613785163135,-10.275504500010321,0.1],"relativeAngle":-1.5707963267948977,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iC5vVUbJMtmDkNzYUxBZPA","parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"wyopmFLrEU8Q6F3Eo2E8qH","leftRoofHeight":16,"rightRoofHeight":16,"selected":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"id":"wyopmFLrEU8Q6F3Eo2E8qH","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.5,"wallsId":["iC5vVUbJMtmDkNzYUxBZPA","tHwdHqDmQXFhmVBYpGMk1M","mM4PcE69DPCUHMXtdYUR1q"],"selected":false,"sideColor":"#ffffff","rise":0,"ceiling":false},{"type":"Foundation","cx":1.7183157358311596,"cy":-0.28833946443478364,"cz":0.05,"lx":53.43283132966065,"ly":36.15762103719206,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hNbyNzvcTVK1vEJxa83hcL","selected":false,"color":"#999999"},{"type":"Window","cx":-0.4346423153885066,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tq5v5MiQZt5qstbgFWnvG5","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.32662469854639264,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tnAiVDN8QFPpM8tgevRmcN","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.21860708170427864,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3nMYyTwN3Em3zi1cHJC4sf","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.1105894648621647,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cCAyiJ9wpmzcPpyPdhfiCf","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.0025718480200507404,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eez2P3itr5bZkDqccZV8JD","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.10544576882206322,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kUi59wGAijZzpxe2ea5yGk","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.21346338566417716,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5BkQRXptjCjpMLBbuit7LG","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.32148100250629114,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wW8MUuXM3xqHEL2sbQVtzB","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.42949861934840516,"cy":0.1,"cz":0.28125,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ccgRRcvFN2ruATRvwGX84y","parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":-0.39880952380952384,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"i5fduT9idUyGfEykeAwxhP","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":-0.30952380952380953,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"fRizbSvKJ8g4Q7BkTDodnJ","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":-0.22023809523809523,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"e1sFSDmTNZ4sZ9Y1VTweWG","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":-0.13095238095238093,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"4JvvxD5ReU3HCb3rrCJfqu","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":-0.04166666666666664,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"rxe4vXzmMs9ks1UPKMsMHJ","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.047619047619047644,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"qM4GDTxt6ZN2Tk8zN9epmX","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.13690476190476195,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"gWzssvMidARJ4cQ7NE4iEX","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.22619047619047625,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"wVBpJ6rUX7jujyXvbCDuGG","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.3154761904761905,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"rywUBEaEaD2kzBC78kTd66","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0.4047619047619048,"cy":0,"cz":-0.2,"lx":0.05952380952380952,"ly":0,"lz":0.6,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"4sh9rckArBRiLDTvRhk9XE","parentId":"3u1tb8n3XMJZXYU3udLNqv","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.21875,"lx":0.951583767418624,"ly":0,"lz":0.5625,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tHwdHqDmQXFhmVBYpGMk1M","foundationId":"hNbyNzvcTVK1vEJxa83hcL","id":"4yyor28faKUByr4PZBcCtd"},{"type":"Wall","cx":-2.0348646464512603,"cy":7.655121555807748,"cz":0,"lx":38.88254641036015,"ly":0.5,"lz":16,"leftJoints":["mM4PcE69DPCUHMXtdYUR1q"],"rightJoints":["iC5vVUbJMtmDkNzYUxBZPA"],"leftPoint":[17.406408558728813,7.655121555807748,0.1],"rightPoint":[-21.476137851631336,7.655121555807748,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2mZ55xAX1KuR3Q2dngP1w","parentId":"hNbyNzvcTVK1vEJxa83hcL","foundationId":"hNbyNzvcTVK1vEJxa83hcL","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"wyopmFLrEU8Q6F3Eo2E8qH","leftRoofHeight":16,"rightRoofHeight":16,"selected":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"type":"Window","cx":-0.43652041374223555,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"u5zqDbkaAjTXDXvkwuoihC","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3285027969001216,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kKyDa7cDgjAnQgNANR1HWe","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.22048518005800757,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nw4CtWvmwcVC5Xe1THkFLF","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.11246756321589363,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"x6kokyu7Qezd9q5C3o2tsm","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.00444994637377967,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fnjqZxGUX54z9mXbXLiiRE","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.10356767046833429,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tdwDQUv17oBgAFyg3P4xM6","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.21158528731044823,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hUp1krohSEg7azNVaFn5Vi","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3196029041525622,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rnUJCj9zp9Q9MtSBUyxpSr","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.42762052099467623,"cy":0.1,"cz":0.3039722877290828,"lx":0.07201174456140931,"ly":0.5,"lz":0.3125,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.6250000000000018,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bDgdCWe9fUHArD8KxnxhgG","parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","tint":"red","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":-0.006429620050125837,"cy":0,"cz":-0.21875,"lx":0.9387245273183722,"ly":0,"lz":0.5625,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"w2mZ55xAX1KuR3Q2dngP1w","foundationId":"hNbyNzvcTVK1vEJxa83hcL","id":"mwADv6B5ue7JfsfTJPh6bK"},{"type":"Foundation","cx":27.211897808892417,"cy":-2.277125937112275,"cz":0.1,"lx":7.862239275491355,"ly":8.18645532809304,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jo2xWjh3Cc1HQacSqq3RwZ","enableGroupMaster":true},{"type":"Wall","cx":-0.20148632007026634,"cy":1.8550497672374595,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":30,"relativeAngle":3.1415926535897927,"leftPoint":[0.6411062725223289,1.8550497672374595],"rightPoint":[-1.0440789126628616,1.85504976723746],"leftJoints":["npFbHBHE2K2JqNLhKJ6X3t"],"rightJoints":["cJ3MHxSdHF6NBdtBsFYUrC"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"63M4Ay9XbnqNvAk8QywH63","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4836133028186254,"cy":1.4489577998324776,"cz":0,"lx":1.19683109271183,"ly":0.3,"lz":30,"relativeAngle":-2.3957214089984347,"leftPoint":[-1.0440789126628616,1.85504976723746],"rightPoint":[-1.9231476929743891,1.0428658324274953],"leftJoints":["63M4Ay9XbnqNvAk8QywH63"],"rightJoints":["pkGthR3DucyAx4LwcC1Kdd"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"cJ3MHxSdHF6NBdtBsFYUrC","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.9231476929743891,"cy":0.20030911625962777,"cz":0,"lx":1.685113432335735,"ly":0.3,"lz":30,"relativeAngle":-1.5707963267948966,"leftPoint":[-1.9231476929743891,1.0428658324274953],"rightPoint":[-1.9231476929743891,-0.6422475999082398],"leftJoints":["cJ3MHxSdHF6NBdtBsFYUrC"],"rightJoints":["myGwrCaTTUQ5A7LpQkLGdD"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"pkGthR3DucyAx4LwcC1Kdd","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4836133028186254,"cy":-1.0787123486711252,"cz":0,"lx":1.2388574688675817,"ly":0.3,"lz":30,"relativeAngle":-0.7818940174543654,"leftPoint":[-1.9231476929743891,-0.6422475999082398],"rightPoint":[-1.0440789126628616,-1.5151770974340102],"leftJoints":["pkGthR3DucyAx4LwcC1Kdd"],"rightJoints":["167KXvNm8cDcHPx8xW946K"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"myGwrCaTTUQ5A7LpQkLGdD","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-0.20148632007026634,"cy":-1.5151770974340102,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":30,"relativeAngle":0,"leftPoint":[-1.0440789126628616,-1.5151770974340102],"rightPoint":[0.6411062725223289,-1.5151770974340102],"leftJoints":["myGwrCaTTUQ5A7LpQkLGdD"],"rightJoints":["4N88hDYexmoMCfgkuoD5Rh"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"167KXvNm8cDcHPx8xW946K","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.0624025688186265,"cy":1.433771409153526,"cz":0,"lx":1.1915805038063918,"ly":0.3,"lz":30,"relativeAngle":2.356215779952568,"leftPoint":[1.483698865114924,1.0124930510695922],"rightPoint":[0.6411062725223289,1.85504976723746],"leftJoints":["2Ew2MEjMkmHhJiQ9oqAGU2"],"rightJoints":["63M4Ay9XbnqNvAk8QywH63"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"npFbHBHE2K2JqNLhKJ6X3t","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.483698865114924,"cy":0.16993633490172466,"cz":0,"lx":1.6851134323357353,"ly":0.3,"lz":30,"relativeAngle":1.5707963267948966,"leftPoint":[1.483698865114924,-0.6726203812661429],"rightPoint":[1.483698865114924,1.0124930510695922],"leftJoints":["4N88hDYexmoMCfgkuoD5Rh"],"rightJoints":["npFbHBHE2K2JqNLhKJ6X3t"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"2Ew2MEjMkmHhJiQ9oqAGU2","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.0626642442323444,"cy":-1.0937037083639525,"cz":0,"lx":1.192226389921747,"ly":0.3,"lz":30,"relativeAngle":0.7852978318515466,"leftPoint":[0.6411062725223289,-1.5151770974340102],"rightPoint":[1.4842222159423528,-0.6722303192938943],"leftJoints":["167KXvNm8cDcHPx8xW946K"],"rightJoints":["2Ew2MEjMkmHhJiQ9oqAGU2"],"textureType":"No Wall Texture","color":"#ffffff","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"4N88hDYexmoMCfgkuoD5Rh","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"ask5m4JZ2uoEk2cEnnLbsK","leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":1.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-0.7345405315369007,"cy":2.2012354524785778,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":20,"leftJoints":["oNTQ9kGJLR6NE6X37waKe5"],"rightJoints":["p8peNzDRqcaFDtvEdTohPZ"],"leftPoint":[0.10805206105569454,2.2012354524785778,0.1],"rightPoint":[-1.577133124129496,2.201235452478578,0.1],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adnnHLPEXD64e7HP26zx36","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.0166675142852597,"cy":1.795143485073596,"cz":0,"lx":1.19683109271183,"ly":0.3,"lz":20,"leftJoints":["adnnHLPEXD64e7HP26zx36"],"rightJoints":["pvG7hHR36xfJmEyp1eS9YY"],"leftPoint":[-1.577133124129496,2.201235452478578,0.1],"rightPoint":[-2.4562019044410235,1.3890515176686136,0.1],"relativeAngle":-2.3957214089984347,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p8peNzDRqcaFDtvEdTohPZ","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.4562019044410235,"cy":0.546494801500746,"cz":0,"lx":1.685113432335735,"ly":0.3,"lz":20,"leftJoints":["p8peNzDRqcaFDtvEdTohPZ"],"rightJoints":["ewYXhBGEZue5LMkkkDNb2N"],"leftPoint":[-2.4562019044410235,1.3890515176686136,0.1],"rightPoint":[-2.4562019044410235,-0.2960619146671215,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pvG7hHR36xfJmEyp1eS9YY","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.0166675142852597,"cy":-0.7325266634300069,"cz":0,"lx":1.2388574688675817,"ly":0.3,"lz":20,"leftJoints":["pvG7hHR36xfJmEyp1eS9YY"],"rightJoints":["5TCNcDuH6LTN7MuR8NFXaf"],"leftPoint":[-2.4562019044410235,-0.2960619146671215,0.1],"rightPoint":[-1.577133124129496,-1.1689914121928924,0.1],"relativeAngle":-0.7818940174543654,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ewYXhBGEZue5LMkkkDNb2N","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-0.7345405315369007,"cy":-1.1689914121928924,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":20,"leftJoints":["ewYXhBGEZue5LMkkkDNb2N"],"rightJoints":["jF6FEFY4L9ZBSgjp7949eF"],"leftPoint":[-1.577133124129496,-1.1689914121928924,0.1],"rightPoint":[0.10805206105569454,-1.1689914121928924,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5TCNcDuH6LTN7MuR8NFXaf","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.5293483573519921,"cy":1.7799570943946443,"cz":0,"lx":1.1915805038063918,"ly":0.3,"lz":20,"leftJoints":["b3SjNidDoApoDQgAZjBhRR"],"rightJoints":["adnnHLPEXD64e7HP26zx36"],"leftPoint":[0.9506446536482898,1.3586787363107105,0.1],"rightPoint":[0.10805206105569454,2.201235452478578,0.1],"relativeAngle":2.356215779952568,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oNTQ9kGJLR6NE6X37waKe5","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.9506446536482898,"cy":0.5161220201428429,"cz":0,"lx":1.6851134323357353,"ly":0.3,"lz":20,"leftJoints":["jF6FEFY4L9ZBSgjp7949eF"],"rightJoints":["oNTQ9kGJLR6NE6X37waKe5"],"leftPoint":[0.9506446536482898,-0.3264346960250246,0.1],"rightPoint":[0.9506446536482898,1.3586787363107105,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"b3SjNidDoApoDQgAZjBhRR","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.5296100327657101,"cy":-0.7475180231228342,"cz":0,"lx":1.192226389921747,"ly":0.3,"lz":20,"leftJoints":["5TCNcDuH6LTN7MuR8NFXaf"],"rightJoints":["b3SjNidDoApoDQgAZjBhRR"],"leftPoint":[0.10805206105569454,-1.1689914121928924,0.1],"rightPoint":[0.9511680044757185,-0.32604463405277606,0.1],"relativeAngle":0.7852978318515466,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jF6FEFY4L9ZBSgjp7949eF","parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"dyG5Lv9BjBabdoCAJRrzex","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Foundation","cx":27.7105671464116,"cy":-2.6420189029493315,"cz":0.05,"lx":4.989784328698819,"ly":4.552797399247233,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"idmo7S3eXBpD6VWYDG7diy","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["4N88hDYexmoMCfgkuoD5Rh","2Ew2MEjMkmHhJiQ9oqAGU2","npFbHBHE2K2JqNLhKJ6X3t","63M4Ay9XbnqNvAk8QywH63","cJ3MHxSdHF6NBdtBsFYUrC","pkGthR3DucyAx4LwcC1Kdd","myGwrCaTTUQ5A7LpQkLGdD","167KXvNm8cDcHPx8xW946K"],"textureType":"No Roof Texture","color":"#ffffff","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jo2xWjh3Cc1HQacSqq3RwZ","foundationId":"jo2xWjh3Cc1HQacSqq3RwZ","id":"ask5m4JZ2uoEk2cEnnLbsK","rise":0,"ceiling":false},{"type":"Wall","cx":-0.6463414312406925,"cy":1.7491373104519843,"cz":0,"lx":1.4245403393373886,"ly":0.3,"lz":40,"leftJoints":["p9FmVKK28qciXfgD3M1K6V"],"rightJoints":["nApCmMqRMThE5A5HdfM3dh"],"leftPoint":[0.06592873842799918,1.7491373104519834,0.1],"rightPoint":[-1.3586116009093843,1.7491373104519843,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fRXGTknc5ZYRa28V8BWwuh","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-1.7301639233528903,"cy":1.4187885996411662,"cz":0,"lx":0.9943468188665976,"ly":0.3,"lz":40,"leftJoints":["fRXGTknc5ZYRa28V8BWwuh"],"rightJoints":["4KAheoavQjSxkpwUJhTcg7"],"leftPoint":[-1.3586116009093843,1.7491373104519843,0.1],"rightPoint":[-2.1017162457963963,1.0884398888303481,0.1],"relativeAngle":-2.4148300779771343,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nApCmMqRMThE5A5HdfM3dh","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-2.1017162457963963,"cy":0.4030347409529105,"cz":0,"lx":1.370810295754875,"ly":0.3,"lz":40,"leftJoints":["nApCmMqRMThE5A5HdfM3dh"],"rightJoints":["6UtLwWPfxSz1Nn8LJyUZiD"],"leftPoint":[-2.1017162457963963,1.0884398888303481,0.1],"rightPoint":[-2.1017162457963963,-0.2823704069245272,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4KAheoavQjSxkpwUJhTcg7","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-1.7301639233528903,"cy":-0.6374268439911468,"cz":0,"lx":1.0278447388893002,"ly":0.3,"lz":40,"leftJoints":["4KAheoavQjSxkpwUJhTcg7"],"rightJoints":["ppMSBZRCq12eT8z3NB6hMS"],"leftPoint":[-2.1017162457963963,-0.2823704069245272,0.1],"rightPoint":[-1.3586116009093843,-0.9924832810577664,0.1],"relativeAngle":-0.7626994937110066,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6UtLwWPfxSz1Nn8LJyUZiD","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-0.6463414312406925,"cy":-0.9924832810577664,"cz":0,"lx":1.4245403393373886,"ly":0.3,"lz":40,"leftJoints":["6UtLwWPfxSz1Nn8LJyUZiD"],"rightJoints":["dQ7dD99j57UBUw5JhK5Ym8"],"leftPoint":[-1.3586116009093843,-0.9924832810577664,0.1],"rightPoint":[0.06592873842799918,-0.9924832810577664,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ppMSBZRCq12eT8z3NB6hMS","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.4220638232623486,"cy":1.4064347365132654,"cz":0,"lx":0.9884882454216453,"ly":0.3,"lz":40,"leftJoints":["iNFasQAxKLM2g211nuNb2z"],"rightJoints":["fRXGTknc5ZYRa28V8BWwuh"],"leftPoint":[0.778198908096698,1.0637321625745466,0.1],"rightPoint":[0.06592873842799918,1.7491373104519843,0.1],"relativeAngle":2.375413341461377,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p9FmVKK28qciXfgD3M1K6V","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.778198908096698,"cy":0.37832701469710894,"cz":0,"lx":1.3708102957548751,"ly":0.3,"lz":40,"leftJoints":["dQ7dD99j57UBUw5JhK5Ym8"],"rightJoints":["p9FmVKK28qciXfgD3M1K6V"],"leftPoint":[0.778198908096698,-0.3070781331803287,0.1],"rightPoint":[0.778198908096698,1.0637321625745466,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iNFasQAxKLM2g211nuNb2z","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.4222850257663353,"cy":-0.6496220528239478,"cz":0,"lx":0.9890270478638401,"ly":0.3,"lz":40,"leftJoints":["ppMSBZRCq12eT8z3NB6hMS"],"rightJoints":["iNFasQAxKLM2g211nuNb2z"],"leftPoint":[0.06592873842799918,-0.9924832810577664,0.1],"rightPoint":[0.7786413131046714,-0.3067608245901292,0.1],"relativeAngle":0.7661003289655364,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dQ7dD99j57UBUw5JhK5Ym8","parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8T3htfZzkyzGKAg9MjWEi4","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Foundation","cx":27.6576948812141,"cy":-2.506928881033054,"cz":0.05,"lx":4.268844692534827,"ly":3.6205625940120694,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nSuM9UkMkLHBgCAuUp64m1","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["p9FmVKK28qciXfgD3M1K6V","fRXGTknc5ZYRa28V8BWwuh","nApCmMqRMThE5A5HdfM3dh","4KAheoavQjSxkpwUJhTcg7","6UtLwWPfxSz1Nn8LJyUZiD","ppMSBZRCq12eT8z3NB6hMS","dQ7dD99j57UBUw5JhK5Ym8","iNFasQAxKLM2g211nuNb2z"],"textureType":"No Roof Texture","color":"#ffffff","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nSuM9UkMkLHBgCAuUp64m1","foundationId":"nSuM9UkMkLHBgCAuUp64m1","id":"8T3htfZzkyzGKAg9MjWEi4","rise":13.522672727906091,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["b3SjNidDoApoDQgAZjBhRR","oNTQ9kGJLR6NE6X37waKe5","adnnHLPEXD64e7HP26zx36","p8peNzDRqcaFDtvEdTohPZ","pvG7hHR36xfJmEyp1eS9YY","ewYXhBGEZue5LMkkkDNb2N","5TCNcDuH6LTN7MuR8NFXaf","jF6FEFY4L9ZBSgjp7949eF"],"textureType":"No Roof Texture","color":"#ffffff","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"idmo7S3eXBpD6VWYDG7diy","foundationId":"idmo7S3eXBpD6VWYDG7diy","id":"dyG5Lv9BjBabdoCAJRrzex","rise":0,"ceiling":false},{"type":"Wall","cx":-0.7345405315369007,"cy":2.2012354524785778,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":20,"leftJoints":["wt8f2UuyWEu5744tfT81tN"],"rightJoints":["mUct1Mv8YXbfrstcjehPpa"],"leftPoint":[0.10805206105569454,2.2012354524785778,0.1],"rightPoint":[-1.577133124129496,2.201235452478578,0.1],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1A1n4avbSRXWKghQMw9QmS","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.0166675142852597,"cy":1.795143485073596,"cz":0,"lx":1.19683109271183,"ly":0.3,"lz":20,"leftJoints":["1A1n4avbSRXWKghQMw9QmS"],"rightJoints":["5WJdP5E99dMPaLFTQ6cg6Q"],"leftPoint":[-1.577133124129496,2.201235452478578,0.1],"rightPoint":[-2.4562019044410235,1.3890515176686136,0.1],"relativeAngle":-2.3957214089984347,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mUct1Mv8YXbfrstcjehPpa","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.4562019044410235,"cy":0.546494801500746,"cz":0,"lx":1.685113432335735,"ly":0.3,"lz":20,"leftJoints":["mUct1Mv8YXbfrstcjehPpa"],"rightJoints":["trsYgSjY5YRLrdedvaJSHE"],"leftPoint":[-2.4562019044410235,1.3890515176686136,0.1],"rightPoint":[-2.4562019044410235,-0.2960619146671215,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5WJdP5E99dMPaLFTQ6cg6Q","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-2.0166675142852597,"cy":-0.7325266634300069,"cz":0,"lx":1.2388574688675817,"ly":0.3,"lz":20,"leftJoints":["5WJdP5E99dMPaLFTQ6cg6Q"],"rightJoints":["1XHXV2QxJeTydiieFTLRAN"],"leftPoint":[-2.4562019044410235,-0.2960619146671215,0.1],"rightPoint":[-1.577133124129496,-1.1689914121928924,0.1],"relativeAngle":-0.7818940174543654,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"trsYgSjY5YRLrdedvaJSHE","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-0.7345405315369007,"cy":-1.1689914121928924,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":20,"leftJoints":["trsYgSjY5YRLrdedvaJSHE"],"rightJoints":["e41wz75u2ryRdJixSo4bbC"],"leftPoint":[-1.577133124129496,-1.1689914121928924,0.1],"rightPoint":[0.10805206105569454,-1.1689914121928924,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1XHXV2QxJeTydiieFTLRAN","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.5293483573519921,"cy":1.7799570943946443,"cz":0,"lx":1.1915805038063918,"ly":0.3,"lz":20,"leftJoints":["rwkRVKiYfYKkrL5fSm48ht"],"rightJoints":["1A1n4avbSRXWKghQMw9QmS"],"leftPoint":[0.9506446536482898,1.3586787363107105,0.1],"rightPoint":[0.10805206105569454,2.201235452478578,0.1],"relativeAngle":2.356215779952568,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wt8f2UuyWEu5744tfT81tN","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.9506446536482898,"cy":0.5161220201428429,"cz":0,"lx":1.6851134323357353,"ly":0.3,"lz":20,"leftJoints":["e41wz75u2ryRdJixSo4bbC"],"rightJoints":["wt8f2UuyWEu5744tfT81tN"],"leftPoint":[0.9506446536482898,-0.3264346960250246,0.1],"rightPoint":[0.9506446536482898,1.3586787363107105,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rwkRVKiYfYKkrL5fSm48ht","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":0.5296100327657101,"cy":-0.7475180231228342,"cz":0,"lx":1.192226389921747,"ly":0.3,"lz":20,"leftJoints":["1XHXV2QxJeTydiieFTLRAN"],"rightJoints":["rwkRVKiYfYKkrL5fSm48ht"],"leftPoint":[0.10805206105569454,-1.1689914121928924,0.1],"rightPoint":[0.9511680044757185,-0.32604463405277606,0.1],"relativeAngle":0.7852978318515466,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e41wz75u2ryRdJixSo4bbC","parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"oxncVFS4dMKc2b6nwpauSP","leftRoofHeight":20,"rightRoofHeight":20,"selected":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"id":"oxncVFS4dMKc2b6nwpauSP","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"9CoHzygyKEYpDGTpmZP3qF","foundationId":"9CoHzygyKEYpDGTpmZP3qF","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":1,"wallsId":["rwkRVKiYfYKkrL5fSm48ht","wt8f2UuyWEu5744tfT81tN","1A1n4avbSRXWKghQMw9QmS","mUct1Mv8YXbfrstcjehPpa","5WJdP5E99dMPaLFTQ6cg6Q","trsYgSjY5YRLrdedvaJSHE","1XHXV2QxJeTydiieFTLRAN","e41wz75u2ryRdJixSo4bbC"],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":-26.000122008937623,"cy":-2.4456470612698347,"cz":0.05,"lx":4.989784328698819,"ly":4.552797399247233,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9CoHzygyKEYpDGTpmZP3qF","selected":false},{"type":"Wall","cx":-0.20148632007026634,"cy":1.8550497672374595,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":30,"leftJoints":["rGMwJ6KNdYyNwmQKhW2Nh4"],"rightJoints":["oRNf7bY3AJx3zVpaTdb4zu"],"leftPoint":[0.6411062725223289,1.8550497672374595],"rightPoint":[-1.0440789126628616,1.85504976723746],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9GySPDZNNZvFp6JaddRiDB","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4836133028186254,"cy":1.4489577998324776,"cz":0,"lx":1.19683109271183,"ly":0.3,"lz":30,"leftJoints":["9GySPDZNNZvFp6JaddRiDB"],"rightJoints":["4nY35MHMDAs2QdKy4qH4ya"],"leftPoint":[-1.0440789126628616,1.85504976723746],"rightPoint":[-1.9231476929743891,1.0428658324274953],"relativeAngle":-2.3957214089984347,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oRNf7bY3AJx3zVpaTdb4zu","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.9231476929743891,"cy":0.20030911625962777,"cz":0,"lx":1.685113432335735,"ly":0.3,"lz":30,"leftJoints":["oRNf7bY3AJx3zVpaTdb4zu"],"rightJoints":["wYoS3whcRTi53dM2ct7qM2"],"leftPoint":[-1.9231476929743891,1.0428658324274953],"rightPoint":[-1.9231476929743891,-0.6422475999082398],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4nY35MHMDAs2QdKy4qH4ya","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4836133028186254,"cy":-1.0787123486711252,"cz":0,"lx":1.2388574688675817,"ly":0.3,"lz":30,"leftJoints":["4nY35MHMDAs2QdKy4qH4ya"],"rightJoints":["mCZwmWyb4fsNj2wmYQBvsz"],"leftPoint":[-1.9231476929743891,-0.6422475999082398],"rightPoint":[-1.0440789126628616,-1.5151770974340102],"relativeAngle":-0.7818940174543654,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wYoS3whcRTi53dM2ct7qM2","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-0.20148632007026634,"cy":-1.5151770974340102,"cz":0,"lx":1.6851851851851931,"ly":0.3,"lz":30,"leftJoints":["wYoS3whcRTi53dM2ct7qM2"],"rightJoints":["5kERhDJVYnRwidcZHzNwPz"],"leftPoint":[-1.0440789126628616,-1.5151770974340102],"rightPoint":[0.6411062725223289,-1.5151770974340102],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mCZwmWyb4fsNj2wmYQBvsz","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.0624025688186265,"cy":1.433771409153526,"cz":0,"lx":1.1915805038063918,"ly":0.3,"lz":30,"leftJoints":["6prLNGnRe7BKvuxjsqwhNV"],"rightJoints":["9GySPDZNNZvFp6JaddRiDB"],"leftPoint":[1.483698865114924,1.0124930510695922],"rightPoint":[0.6411062725223289,1.85504976723746],"relativeAngle":2.356215779952568,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rGMwJ6KNdYyNwmQKhW2Nh4","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.483698865114924,"cy":0.16993633490172466,"cz":0,"lx":1.6851134323357353,"ly":0.3,"lz":30,"leftJoints":["5kERhDJVYnRwidcZHzNwPz"],"rightJoints":["rGMwJ6KNdYyNwmQKhW2Nh4"],"leftPoint":[1.483698865114924,-0.6726203812661429],"rightPoint":[1.483698865114924,1.0124930510695922],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6prLNGnRe7BKvuxjsqwhNV","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":1.0626642442323444,"cy":-1.0937037083639525,"cz":0,"lx":1.192226389921747,"ly":0.3,"lz":30,"leftJoints":["mCZwmWyb4fsNj2wmYQBvsz"],"rightJoints":["6prLNGnRe7BKvuxjsqwhNV"],"leftPoint":[0.6411062725223289,-1.5151770974340102],"rightPoint":[1.4842222159423528,-0.6722303192938943],"relativeAngle":0.7852978318515466,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5kERhDJVYnRwidcZHzNwPz","parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"uMr4G8iwQhvVEE8TbWYbgJ","leftRoofHeight":30,"rightRoofHeight":30,"selected":false,"fill":"Full","eavesLength":1.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"id":"uMr4G8iwQhvVEE8TbWYbgJ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"1oxk3P52oSn4HGaJ5d21cE","foundationId":"1oxk3P52oSn4HGaJ5d21cE","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":1,"wallsId":["5kERhDJVYnRwidcZHzNwPz","6prLNGnRe7BKvuxjsqwhNV","rGMwJ6KNdYyNwmQKhW2Nh4","9GySPDZNNZvFp6JaddRiDB","oRNf7bY3AJx3zVpaTdb4zu","4nY35MHMDAs2QdKy4qH4ya","wYoS3whcRTi53dM2ct7qM2","mCZwmWyb4fsNj2wmYQBvsz"],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":-26.499667294833905,"cy":-2.142020498769739,"cz":0.1,"lx":7.862239275491355,"ly":8.18645532809304,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1oxk3P52oSn4HGaJ5d21cE","selected":false,"enableGroupMaster":true},{"type":"Wall","cx":-0.6463414312406925,"cy":1.7491373104519843,"cz":0,"lx":1.4245403393373886,"ly":0.3,"lz":40,"leftJoints":["mMt5DmNXZy5oG4vq89vafC"],"rightJoints":["4p4RhAQUE1YZ6FvTNz5vv4"],"leftPoint":[0.06592873842799918,1.7491373104519834,0.1],"rightPoint":[-1.3586116009093843,1.7491373104519843,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nr2YdH7dGwCs9FLqqqGjFg","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-1.7301639233528903,"cy":1.4187885996411662,"cz":0,"lx":0.9943468188665976,"ly":0.3,"lz":40,"leftJoints":["nr2YdH7dGwCs9FLqqqGjFg"],"rightJoints":["mLwkBCLjpPZP6KYK5Bt7J8"],"leftPoint":[-1.3586116009093843,1.7491373104519843,0.1],"rightPoint":[-2.1017162457963963,1.0884398888303481,0.1],"relativeAngle":-2.4148300779771343,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4p4RhAQUE1YZ6FvTNz5vv4","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-2.1017162457963963,"cy":0.4030347409529105,"cz":0,"lx":1.370810295754875,"ly":0.3,"lz":40,"leftJoints":["4p4RhAQUE1YZ6FvTNz5vv4"],"rightJoints":["7uWfnz1ukohHZ8q7Z4KWAP"],"leftPoint":[-2.1017162457963963,1.0884398888303481,0.1],"rightPoint":[-2.1017162457963963,-0.2823704069245272,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mLwkBCLjpPZP6KYK5Bt7J8","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-1.7301639233528903,"cy":-0.6374268439911468,"cz":0,"lx":1.0278447388893002,"ly":0.3,"lz":40,"leftJoints":["mLwkBCLjpPZP6KYK5Bt7J8"],"rightJoints":["wynoJj85BW9QJZxa23rRom"],"leftPoint":[-2.1017162457963963,-0.2823704069245272,0.1],"rightPoint":[-1.3586116009093843,-0.9924832810577664,0.1],"relativeAngle":-0.7626994937110066,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7uWfnz1ukohHZ8q7Z4KWAP","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":-0.6463414312406925,"cy":-0.9924832810577664,"cz":0,"lx":1.4245403393373886,"ly":0.3,"lz":40,"leftJoints":["7uWfnz1ukohHZ8q7Z4KWAP"],"rightJoints":["kCyrQp6qPZF1NC78PVWkyR"],"leftPoint":[-1.3586116009093843,-0.9924832810577664,0.1],"rightPoint":[0.06592873842799918,-0.9924832810577664,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wynoJj85BW9QJZxa23rRom","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.4220638232623486,"cy":1.4064347365132654,"cz":0,"lx":0.9884882454216453,"ly":0.3,"lz":40,"leftJoints":["ho9ZWX9Y7gps9CuiwCZxjF"],"rightJoints":["nr2YdH7dGwCs9FLqqqGjFg"],"leftPoint":[0.778198908096698,1.0637321625745466,0.1],"rightPoint":[0.06592873842799918,1.7491373104519843,0.1],"relativeAngle":2.375413341461377,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mMt5DmNXZy5oG4vq89vafC","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.778198908096698,"cy":0.37832701469710894,"cz":0,"lx":1.3708102957548751,"ly":0.3,"lz":40,"leftJoints":["kCyrQp6qPZF1NC78PVWkyR"],"rightJoints":["mMt5DmNXZy5oG4vq89vafC"],"leftPoint":[0.778198908096698,-0.3070781331803287,0.1],"rightPoint":[0.778198908096698,1.0637321625745466,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ho9ZWX9Y7gps9CuiwCZxjF","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":0.4222850257663353,"cy":-0.6496220528239478,"cz":0,"lx":0.9890270478638401,"ly":0.3,"lz":40,"leftJoints":["wynoJj85BW9QJZxa23rRom"],"rightJoints":["ho9ZWX9Y7gps9CuiwCZxjF"],"leftPoint":[0.06592873842799918,-0.9924832810577664,0.1],"rightPoint":[0.7786413131046714,-0.3067608245901292,0.1],"relativeAngle":0.7661003289655364,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kCyrQp6qPZF1NC78PVWkyR","parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"eGKywH11tWPx9igpC5XjNU","leftRoofHeight":40,"rightRoofHeight":40,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"id":"eGKywH11tWPx9igpC5XjNU","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"9Y1kU3q99HMAW1GDxevTYM","foundationId":"9Y1kU3q99HMAW1GDxevTYM","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["mMt5DmNXZy5oG4vq89vafC","nr2YdH7dGwCs9FLqqqGjFg","4p4RhAQUE1YZ6FvTNz5vv4","mLwkBCLjpPZP6KYK5Bt7J8","7uWfnz1ukohHZ8q7Z4KWAP","wynoJj85BW9QJZxa23rRom","kCyrQp6qPZF1NC78PVWkyR","ho9ZWX9Y7gps9CuiwCZxjF"],"selected":false,"rise":13.522672727906091,"ceiling":false},{"type":"Foundation","cx":-26.07251778331903,"cy":-2.351761746510464,"cz":0.05,"lx":4.268844692534827,"ly":3.6205625940120694,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9Y1kU3q99HMAW1GDxevTYM","selected":false},{"type":"Wall","cx":-0.9902356029479495,"cy":-11.912514576226425,"cz":2.268765007024547,"lx":36.926563179741635,"ly":0.5,"lz":17,"leftJoints":["rmJMuUkEt1MeMCUMuSJyMP"],"rightJoints":["phirdj4sqaQKeToCxzfiMH"],"leftPoint":[-19.45351719281877,-11.912514576226423,0.1],"rightPoint":[17.47304598692287,-11.912514576226428,0.1],"relativeAngle":-1.4431536702349665e-16,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"i77w1Es8Z5SjkjpQ5nMhD5","parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"vL7dGWufEhTghRwUx8yTvj","leftRoofHeight":17,"rightRoofHeight":17,"selected":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Door","cx":0,"cy":0,"cz":-0.21875,"lx":0.951583767418624,"ly":0,"lz":0.5625,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"mWaGM2hsTBxoCRqCfarD1y","parentId":"i77w1Es8Z5SjkjpQ5nMhD5","foundationId":"tLnj42ybzfx7UvcxHnYBsE","selected":false},{"type":"Wall","cx":17.47304598692286,"cy":-4.836753855231592,"cz":0,"lx":14.151521441989672,"ly":0.5,"lz":17,"leftJoints":["i77w1Es8Z5SjkjpQ5nMhD5"],"rightJoints":[],"leftPoint":[17.47304598692287,-11.912514576226428,0.1],"rightPoint":[17.473045986922852,2.239006865763245,0.1],"relativeAngle":1.570796326794898,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"phirdj4sqaQKeToCxzfiMH","parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"vL7dGWufEhTghRwUx8yTvj","leftRoofHeight":17,"rightRoofHeight":17,"selected":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-19.453517192818786,"cy":-4.836753855231592,"cz":0,"lx":14.151521441989672,"ly":0.5,"lz":17,"leftJoints":[],"rightJoints":["i77w1Es8Z5SjkjpQ5nMhD5"],"leftPoint":[-19.453517192818783,2.239006865763245,0.1],"rightPoint":[-19.45351719281879,-11.912514576226428,0.1],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rmJMuUkEt1MeMCUMuSJyMP","parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":"vL7dGWufEhTghRwUx8yTvj","leftRoofHeight":17,"rightRoofHeight":17,"selected":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-0.9902356029479567,"cy":2.239006865763245,"cz":0,"lx":36.92656317974165,"ly":0.5,"lz":17,"leftJoints":["phirdj4sqaQKeToCxzfiMH"],"rightJoints":["rmJMuUkEt1MeMCUMuSJyMP"],"leftPoint":[17.47304598692287,2.239006865763245,0.1],"rightPoint":[-19.453517192818783,2.239006865763245,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eKjiWm3px73qKLcoG9tGHu","parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":3,"roofId":null,"selected":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Door","cx":-0.006429620050125837,"cy":0,"cz":-0.21875,"lx":0.9387245273183722,"ly":0,"lz":0.5625,"color":"white","textureType":"Door Texture Default","filled":false,"doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"dhr8kv5642kt62iFhTt4ta","parentId":"eKjiWm3px73qKLcoG9tGHu","foundationId":"tLnj42ybzfx7UvcxHnYBsE","selected":false},{"type":"Foundation","cx":0.9431450312565914,"cy":3.149229192376307,"cz":0.05,"lx":41.18193719933953,"ly":25.196736647897943,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tLnj42ybzfx7UvcxHnYBsE","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Mansard","roofStructure":"Default","wallsId":["phirdj4sqaQKeToCxzfiMH"],"ridgeWidth":2.66901172469158,"textureType":"No Roof Texture","color":"#ffffff","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tLnj42ybzfx7UvcxHnYBsE","foundationId":"tLnj42ybzfx7UvcxHnYBsE","id":"vL7dGWufEhTghRwUx8yTvj","rise":1.907584707016376,"ceiling":false},{"type":"Human","name":"Jiya","cx":-18.787647876406897,"cy":-18.538338993489504,"cz":0.125,"lx":0.6,"ly":0.6,"lz":1.74,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"muPJhyAEwPwvd29CyHNPTv","selected":false},{"type":"Tree","name":"Coconut","cx":24.642500087694035,"cy":-15.595852113993274,"cz":0.12499999999999645,"lx":7.10302446035018,"lz":11.247303362702601,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"fjFxbSnebLaGdvEjgFeKBY","selected":false},{"type":"Tree","name":"Coconut","cx":21.66117439174871,"cy":-16.376771590483912,"cz":0.125,"lx":4.8301750266215455,"lz":7.467800914861559,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"fJBtdZnifxUnAi1A2mQVwv","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[13.204078062477329,8.198113820431859,0.000008738290977654438],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[13.204078062477329,8.197963813764718,150],"theme":"Dune","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":19,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[40.16161458870258,-83.52840108412623,20.640119356575983],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":12.604988194492185,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#8c9763","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[3.0849566827898878,4.932309755028921,20.640119356575976],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":2.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"dailyPvYieldPanelRect":{"x":-4,"y":10,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyLightSensorPanelRect":{"x":-1254,"y":272,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},448:function(e){e.exports=JSON.parse('{"docid":"kfhYJJUbjvMzonQRyiPc3j","time":"02/03/2023 08:07 pm","timestamp":1675472845072,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 9:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":17.756863619774798,"solarUpdraftTower":{},"parentId":"Ground","cx":-2.4293224579513826,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.4049185488212945,"type":"Foundation","solarPowerTower":{},"lx":35.28188764969263,"lz":1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.5,"textureType":"Foundation Texture #2","enableGroupMaster":true,"color":"#ffffff"},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":24.269954502361394,"relativeAngle":3.141592653589793,"lz":6,"roofId":"eX962ry384m9Aq9zJiKfY6","ly":0.3,"rightPoint":[-9.99610487226133,4.83201801478668,1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture #4","leftPoint":[14.27384963010006,4.832018014786678,1],"type":"Wall","rightRoofHeight":6,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":6,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":2.1388723789193644,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":4.83201801478668,"color":"#ffffff","opacity":0,"wallStructure":"Default","studSpacing":100,"studColor":"#666666","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":14.273849630100056,"leftPoint":[14.273849630100056,-5.54086475965909,1],"cy":-0.35442337243620514,"leftRoofHeight":6,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[14.27384963010006,4.83201801478668,1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10.37288277444577,"normal":[0,0,1],"lz":6,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture #4","rightRoofHeight":6,"roofId":"eX962ry384m9Aq9zJiKfY6","color":"#ffffff","opacity":0,"wallStructure":"Default","studSpacing":100,"studColor":"#666666","centerRoofHeight":[0,9],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"lx":10.37288277444577,"windows":[],"lz":6,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"eX962ry384m9Aq9zJiKfY6","selected":false,"cy":-0.35442337243620514,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-9.99610487226133,-5.54086475965909,1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture #4","rightRoofHeight":6,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":-1.5707963267948968,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-9.99610487226133,4.83201801478668,1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":6,"ly":0.3,"cx":-9.99610487226133,"color":"#ffffff","opacity":0,"wallStructure":"Default","studSpacing":100,"studColor":"#666666","centerRoofHeight":[0,9],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"showLabel":false,"cx":2.1388723789193644,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[14.27384963010006,-5.54086475965909,1],"cz":2.268765007024547,"textureType":"Wall Texture #4","cy":-5.54086475965909,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"eX962ry384m9Aq9zJiKfY6","leftPoint":[-9.99610487226133,-5.54086475965909,1],"normal":[0,0,1],"ly":0.3,"lz":6,"leftRoofHeight":6,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":6,"lx":24.269954502361394,"color":"#ffffff","wallStructure":"Default","opacity":0,"studSpacing":100,"studColor":"#666666","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-1.8995410156020984,"cy":1.1382243316181326,"cz":2.2408122612280286,"lx":3.053187061305774,"ly":0.2,"lz":12.024186118737006,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[-0.37294748494921137,1.1382243316181326,0.07664429931579812],"rightPoint":[-3.4261345462549855,1.1382243316181326,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.37294748494921137,"cy":-0.10216350253359563,"cz":1.9496749649980285,"lx":2.4807756683034574,"ly":0.2,"lz":12.024186118737006,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[-0.37294748494921315,-1.3425513366853248,0.07664429931579812],"rightPoint":[-0.37294748494921137,1.1382243316181326,0.07664429931579812],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"wallStructure":"Default","opacity":0.5,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-3.4261345462549855,"cy":-0.10216350253359563,"cz":2.228839888904333,"lx":2.4807756683034574,"ly":0.2,"lz":12.024186118737006,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-3.4261345462549855,1.1382243316181326,0.07664429931579812],"rightPoint":[-3.4261345462549855,-1.3425513366853248,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-1.8995410156020984,"cy":-1.3425513366853248,"cz":2.268765007024547,"lx":3.053187061305774,"ly":0.2,"lz":12.024186118737006,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-3.4261345462549855,-1.3425513366853248,0.07664429931579812],"rightPoint":[-0.37294748494921137,-1.3425513366853248,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Foundation","cx":14.094080413269129,"cy":0.15570536150984227,"cz":0.05,"lx":8.775727447038646,"ly":4.909042441548677,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":false,"color":"#ffffff"},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.15,"roofType":"Pyramid","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7","pPpJHGJ2bGVqLdA1FpXi4V","giYTP9Qg6uJ3yfkS1RoDqG","2RETAxyRMzZBEQkBGms56R"],"textureType":"Roof Texture #7","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"u1sPtasg3hWUinAjQbYwBP","sideColor":"#4d4d4d","rise":2.0481021935471038,"ceiling":false},{"type":"Window","cx":0.0021539197282083927,"cy":0.1,"cz":0.3488182697258943,"lx":0.5686474602805061,"ly":0.2,"lz":0.18392000793749944,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"62Gv8U29wFJyJf1vgeLMyo","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1},{"type":"Wall","cx":-0.20317717304724836,"cy":0.8008815905246398,"cz":2.2408122612280286,"lx":1.7317721396367636,"ly":0.2,"lz":12.024186118737006,"leftJoints":["dzLroXC8UBmujXxPj58BnJ"],"rightJoints":["2AP7zuBsHXSx9vjaaQ41Sa"],"leftPoint":[0.6627088967711334,0.8008815905246398,0],"rightPoint":[-1.0690632428656301,0.8008815905246398,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9CKGzf7taYbb5TxpshE7KA","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"14aRqq6MKm9VsEB7xehwCw","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.6627088967711334,"cy":0.06442649426996133,"cz":2.2301039869226305,"lx":1.472910192509357,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gH8a7zMeyH4srn6fpqovLp"],"rightJoints":["9CKGzf7taYbb5TxpshE7KA"],"leftPoint":[0.6627088967711331,-0.6720286019847171,0],"rightPoint":[0.6627088967711336,0.8008815905246398,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dzLroXC8UBmujXxPj58BnJ","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","wallStructure":"Default","opacity":0.5,"roofId":"14aRqq6MKm9VsEB7xehwCw","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"selected":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-1.0690632428656301,"cy":0.06442649426996133,"cz":2.228839888904333,"lx":1.472910192509357,"ly":0.2,"lz":12.024186118737006,"leftJoints":["9CKGzf7taYbb5TxpshE7KA"],"rightJoints":["gH8a7zMeyH4srn6fpqovLp"],"leftPoint":[-1.0690632428656301,0.8008815905246398,0],"rightPoint":[-1.0690632428656301,-0.6720286019847171,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2AP7zuBsHXSx9vjaaQ41Sa","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"14aRqq6MKm9VsEB7xehwCw","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.20317717304724825,"cy":-0.6720286019847171,"cz":2.268765007024547,"lx":1.7317721396367638,"ly":0.2,"lz":12.024186118737006,"leftJoints":["2AP7zuBsHXSx9vjaaQ41Sa"],"rightJoints":["dzLroXC8UBmujXxPj58BnJ"],"leftPoint":[-1.0690632428656301,-0.6720286019847171,0],"rightPoint":[0.6627088967711336,-0.6720286019847171,0],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gH8a7zMeyH4srn6fpqovLp","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"14aRqq6MKm9VsEB7xehwCw","leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"14aRqq6MKm9VsEB7xehwCw","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #7","thickness":0.15,"wallsId":["gH8a7zMeyH4srn6fpqovLp","dzLroXC8UBmujXxPj58BnJ","9CKGzf7taYbb5TxpshE7KA","2AP7zuBsHXSx9vjaaQ41Sa"],"selected":false,"sideColor":"#4d4d4d","rise":7.313111372629006,"ceiling":false},{"type":"Foundation","cx":12.425615366004104,"cy":0.028931059233684664,"cz":0.05,"lx":3.229114860580372,"ly":2.221848349715204,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7jmzUaUYBWVbxJMLM3ukrN","selected":false},{"type":"Human","name":"Jaye","cx":16.450422145232615,"cy":-0.22113841806491535,"cz":0.5,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"iDEwVvzHLgt4QuBLaRKJtz","selected":false,"ly":0.55},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"Roof Texture #7","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"eX962ry384m9Aq9zJiKfY6","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"sideColor":"#4d4d4d","rise":3,"ceiling":false},{"type":"Door","cx":-8.950612010673349e-17,"cy":0,"cz":-0.3331657120178574,"lx":0.8061994583201278,"ly":0,"lz":0.3336685759642853,"textureType":"Door Texture #5","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"ekcJVu2iDNfD8vCRPJWcfY","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.3856208622982074,"cy":0.1,"cz":-0.16666666666666666,"lx":0.09640521557455185,"ly":0.3,"lz":0.3333333333333333,"mullionWidth":0.08,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"9oFXDcsdcyJ89HEsb2DDAG","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.24101303893637963,"cy":0.1,"cz":-0.16666666666666666,"lx":0.09640521557455185,"ly":0.3,"lz":0.3333333333333333,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ssU5SYZXCGdgbbL6FKEC5P","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.24101303893637963,"cy":0.1,"cz":-0.16666666666666666,"lx":0.09640521557455185,"ly":0.3,"lz":0.3333333333333333,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fptVfz87nopSTdqFchXqam","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3856208622982074,"cy":0.1,"cz":-0.16666666666666666,"lx":0.09640521557455185,"ly":0.3,"lz":0.3333333333333333,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dBjY8chWcXqTSEjTPuyYBe","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.24101303893637963,"cy":0.1,"cz":0.375,"lx":0.09640521557455185,"ly":0.3,"lz":0.4166666666666667,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"ukFf3NbtSoWEm19XdABfLF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.24101303893637963,"cy":0.1,"cz":0.375,"lx":0.09640521557455185,"ly":0.3,"lz":0.4166666666666667,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e66yZnH635KK4nUZeZJouj","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.004820260778727587,"cy":0.1,"cz":0.5500000000000002,"lx":0.1253267802469174,"ly":0.3,"lz":0.6999999999999998,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8FUv4v48DhXb1UYjQUTX7D","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.2892156467236556,"cy":0.1,"cz":0,"lx":0.1928104311491037,"ly":0.3,"lz":0.5,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5yZFsPzLz262PvuKKqo6BT","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.2892156467236556,"cy":0.1,"cz":0,"lx":0.1928104311491037,"ly":0.3,"lz":0.5,"mullionWidth":0.08,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pRx46Qg86s1FgV9Tkkwhkb","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.2916666666666667,"lx":0.13496730180437258,"ly":0,"lz":0.4166666666666667,"textureType":"Door Texture #2","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"3Zxx9R9RT39QbRUhwQji79","doorType":"Default","archHeight":1,"filled":true},{"type":"Cuboid","cx":15.482678805847527,"cy":0.03501810630543489,"cz":0.5,"lx":0.5,"ly":3,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"7HoCBk9FUvPFeTLHCCJTNC"},{"type":"Cuboid","cx":15.982678805847527,"cy":0.03501810630543489,"cz":0.4,"lx":0.5,"ly":3,"lz":0.8,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"wT8Ce4Jri1xraPwAe1CNeM","selected":false},{"type":"Cuboid","cx":16.482678805847527,"cy":0.03501810630543489,"cz":0.3,"lx":0.5,"ly":3,"lz":0.6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"kygu5kCeJayDbMCovLE74e","selected":false},{"type":"Cuboid","cx":16.982678805847527,"cy":0.03501810630543489,"cz":0.2,"lx":0.5,"ly":3,"lz":0.4,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"x3KMwKP4LZeaVL1t9Sa9pC","selected":false},{"type":"Cuboid","cx":16.454615930533183,"cy":-1.723835668236857,"cz":0.5,"lx":2.5,"ly":0.5,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"dCP1VYfhvq16F8TKTUaTJy","selected":false},{"type":"Cuboid","cx":16.45823999757701,"cy":1.798322131122021,"cz":0.5,"lx":2.5,"ly":0.5,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7CauidfWWfvxRjMT2AFDZ7","selected":false},{"type":"Human","name":"Jamelia","cx":-0.11177369144009575,"cy":0.35103184354339856,"cz":0.10000000149011612,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"grVotAf51uhbEVGMStvWX3","id":"aT4DrrYnjHCzoD1VbK7qaQ","selected":false,"ly":0.65},{"type":"Tree","name":"Spruce","cx":-9.332343084456326,"cy":-7.670721874044395,"cz":0.49999999999999645,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"efGrH4MExjf1MncqygtFYz","selected":false},{"type":"Tree","name":"Spruce","cx":-2.4224793125813298,"cy":-7.597212684981861,"cz":0.49999999999999645,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"mVFRaCS8mpYH1fWycvYh2A","selected":false},{"type":"Tree","name":"Spruce","cx":5.7002860788249174,"cy":-7.486948901388057,"cz":0.5,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"76Tg87omCPA31TcVqXcmTm","selected":false},{"type":"Tree","name":"Spruce","cx":12.904186606949914,"cy":-7.413439712325518,"cz":0.49999999999999645,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9tspspKKMvyRj8ZAXB1S5M","selected":false},{"type":"Tree","name":"Spruce","cx":-9.185324706331325,"cy":6.884097560337873,"cz":0.49999999999999645,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jB2hT6s8JMuu4hvTQGpet3","selected":false},{"type":"Tree","name":"Spruce","cx":5.884059051481165,"cy":6.773833776744068,"cz":0.5,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"4721EtxPvv42oUzmx3KVyF","selected":false},{"type":"Tree","name":"Spruce","cx":-1.9163053006129438,"cy":6.972061722697195,"cz":0.5,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5JeYYLhDB98wnUERTPXwhK","selected":false},{"type":"Tree","name":"Spruce","cx":12.830677417887415,"cy":6.810588371275337,"cz":0.5,"lx":3,"lz":5.858069311885397,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"muLKxWCdfcK2eTHLBsDxzY","selected":false},{"type":"Cuboid","cx":17.482678805847527,"cy":0.03501810630543489,"cz":0.1,"lx":0.5,"ly":3,"lz":0.2,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"grVotAf51uhbEVGMStvWX3","selected":false},{"type":"Flower","name":"White Flower","cx":15.126182941215411,"cy":2.0688216490527616,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"oTAnTfR89oZPsyKVkbpY4L","selected":false},{"type":"Flower","name":"White Flower","cx":15.15556957531615,"cy":3.2795889445752495,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"i17rLiCzdL5NmRJGR4y1CS","selected":false},{"type":"Flower","name":"White Flower","cx":15.217151871229412,"cy":4.479113375165792,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cH33zk4JiguncGCgw5dgge","selected":false},{"type":"Flower","name":"White Flower","cx":15.072373579996741,"cy":-2.4484335890262776,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"w8aD5THe2gjzneE5VAcSXT","selected":false},{"type":"Flower","name":"White Flower","cx":15.073985679510187,"cy":-3.688355208079927,"cz":0.5,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"onzxSqcVAm3FyLWanpmjH2","selected":false},{"type":"Flower","name":"White Flower","cx":15.176965591305198,"cy":-5.044043742265718,"cz":0.4999999999999991,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"j3jTvCkw7njipy5x4UrSpB","selected":false},{"type":"Flower","name":"Hibiscus","cx":15.090503333801388,"cy":2.6795845901554154,"cz":0.5,"lx":2,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"gQ7GqXx4tKL7uBJwLrMcA6","selected":false},{"type":"Flower","name":"Hibiscus","cx":15.11041357320055,"cy":3.9081085710241874,"cz":0.4999999999999991,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"6HJcrgKqYqvU7BYpYwf1Se","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.913002609189407,"cy":-3.0774482324317782,"cz":0.5000000000000009,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vyshpZCEierrdgAyXaBcst","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.941871873418721,"cy":-4.383327895714419,"cz":0.5,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kAeRGtsWdmxUoAQPB5P6KJ","selected":false},{"type":"Human","name":"Jade","cx":16.85821378704074,"cy":-2.487104433327495,"cz":0.5,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5quA9K9PbuFux9inPinoZp","selected":false,"ly":0.48},{"type":"Human","name":"Jett","cx":-0.04509947681173543,"cy":-0.12777417813363456,"cz":0.300000011920929,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"kygu5kCeJayDbMCovLE74e","id":"qNbt2kqLcnpAuYiCzMr8qu","selected":false,"ly":0.6},{"type":"Human","name":"Jedi","cx":16.573220428178367,"cy":-1.1124659446434038,"cz":0.5,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"gHn3DWePGHkUPuTQBYNFA7","selected":false,"ly":0.56},{"type":"Human","name":"Jennifer","cx":16.90812280276899,"cy":1.1730238573514669,"cz":0.5,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"pkNrn5a7PGHK1vUXoNbNtp","selected":false,"ly":0.45},{"type":"Window","cx":-0.37082887811447396,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qS8bPerGLqgrEhg3VdRMna","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.24721925207631612,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nmpua75umkgQmm3afavHG4","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.12360962603815825,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fN2d9MiAtthczP5v35Bn9Z","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-4.0245584642661925e-16,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rt5vtqFNGBs4uVevaa5SHr","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.12360962603815745,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iqKTDEyqgoDU5cgt71CFea","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.24721925207631532,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vHTxpdJckKKr3ePx8aFQpY","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3708288781144731,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7MSjvWxXyqcQDbp8fs3ZDw","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.37082887811447396,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5vsADBuvCZtK48YRH9MYR9","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.24721925207631612,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"d6tpsz63SWdyNJ6pv74f1S","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.12360962603815825,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qLXWzVH589njSMD4htbaDZ","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-4.0245584642661925e-16,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rLKBLFR9JVQSkBFbLvtmjw","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.12360962603815745,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3VPrjTctjaZkp9jMcnmk9K","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.24721925207631532,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jXBTXx15DGSCH8grL279or","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3708288781144731,"cy":0.1,"cz":0,"lx":0.0824064173587719,"ly":0.3,"lz":0.6666666666666666,"mullion":true,"mullionWidth":0.08,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Arched","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"58KzRG1iYAZNHC4ZV2DbrP","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[5.218957131029783,0.6180582017777921,6.180856740847945e-7],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[5.218957131029783,0.6180382008888045,150],"theme":"Mountain","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[22.977248222176474,21.907448743442465,8.268031438861318],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":47.83311959586008,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#696635","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-3.993253335690816,-7.535606531970473,7.708620369560713],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},449:function(e){e.exports=JSON.parse('{"docid":"u1WXQV62cNL8GXN8gP2Uro","time":"02/03/2023 08:06 pm","timestamp":1675472763047,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"4/22/2022, 7:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":-0.3764576456166644,"cy":0.7527432813254578,"cz":2.2408122612280286,"lx":2.8256001957793133,"ly":0.2,"lz":17.11162413698611,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[1.0363424522729936,0.7527432813254578,0.07664429931579812],"rightPoint":[-1.7892577435063188,0.7527432813254578,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"aAQtPcYcdvnjKLxjxpN6fj","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"opacity":0.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":1.03634245227299,"cy":-0.6129469247080586,"cz":1.9496749649980285,"lx":2.7313804120670326,"ly":0.2,"lz":17.11162413698611,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[1.03634245227299,-1.9786371307415749,0.07664429931579812],"rightPoint":[1.0363424522729936,0.7527432813254578,0.07664429931579812],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"aAQtPcYcdvnjKLxjxpN6fj","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"wallStructure":"Default","opacity":0.5,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":-1.7892577435063188,"cy":-0.6129469247080586,"cz":2.228839888904333,"lx":2.7313804120670326,"ly":0.2,"lz":17.11162413698611,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-1.7892577435063188,0.7527432813254578,0.07664429931579812],"rightPoint":[-1.7892577435063188,-1.9786371307415749,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"aAQtPcYcdvnjKLxjxpN6fj","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"opacity":0.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":-0.3764576456166644,"cy":-1.9786371307415749,"cz":2.268765007024547,"lx":2.8256001957793133,"ly":0.2,"lz":17.11162413698611,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-1.7892577435063188,-1.9786371307415749,0.07664429931579812],"rightPoint":[1.0363424522729936,-1.9786371307415749,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"aAQtPcYcdvnjKLxjxpN6fj","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"opacity":0.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Foundation","cx":9.88256564470575,"cy":-18.302742621755318,"cz":0.05,"lx":5.358597805586726,"ly":4.404021553494953,"lz":0.10907253340755482,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":false,"color":"#ffffff","locked":false},{"type":"Wall","cx":-0.5591812718525784,"cy":10.613663444712508,"cz":2.2408122612280286,"lx":1.7651178031601384,"ly":0.2,"lz":17.11162413698611,"leftJoints":["dzLroXC8UBmujXxPj58BnJ"],"rightJoints":["2AP7zuBsHXSx9vjaaQ41Sa"],"leftPoint":[0.32337762972749395,10.613663444712508,0.09656797003029352],"rightPoint":[-1.4417401734326472,10.613663444712508,0.09656797003029352],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,2.576026974436725],"id":"9CKGzf7taYbb5TxpshE7KA","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"uGKYfaStAHZiUBuVtKS6dW","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"selected":false,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":0.32337762972749395,"cy":9.751643903669297,"cz":2.2301039869226305,"lx":1.7240390820864182,"ly":0.2,"lz":17.11162413698611,"leftJoints":["gH8a7zMeyH4srn6fpqovLp"],"rightJoints":["9CKGzf7taYbb5TxpshE7KA"],"leftPoint":[0.32337762972749395,8.889624362626087,0.09656797003029352],"rightPoint":[0.32337762972749395,10.613663444712508,0.09656797003029352],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,2.576026974436725],"id":"dzLroXC8UBmujXxPj58BnJ","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","wallStructure":"Default","opacity":0.5,"roofId":"uGKYfaStAHZiUBuVtKS6dW","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"selected":false,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":-1.4417401734326472,"cy":9.751643903669297,"cz":2.228839888904333,"lx":1.7240390820864182,"ly":0.2,"lz":17.11162413698611,"leftJoints":["9CKGzf7taYbb5TxpshE7KA"],"rightJoints":["gH8a7zMeyH4srn6fpqovLp"],"leftPoint":[-1.4417401734326472,10.613663444712508,0.09656797003029352],"rightPoint":[-1.4417401734326472,8.889624362626087,0.09656797003029352],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,2.576026974436725],"id":"2AP7zuBsHXSx9vjaaQ41Sa","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"uGKYfaStAHZiUBuVtKS6dW","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"selected":false,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Wall","cx":-0.5591812718525784,"cy":8.889624362626087,"cz":2.268765007024547,"lx":1.7651178031601384,"ly":0.2,"lz":17.11162413698611,"leftJoints":["2AP7zuBsHXSx9vjaaQ41Sa"],"rightJoints":["dzLroXC8UBmujXxPj58BnJ"],"leftPoint":[-1.4417401734326472,8.889624362626087,0.09656797003029352],"rightPoint":[0.32337762972749395,8.889624362626087,0.09656797003029352],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,2.576026974436725],"id":"gH8a7zMeyH4srn6fpqovLp","parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","opacity":0.5,"roofId":"uGKYfaStAHZiUBuVtKS6dW","leftRoofHeight":17.11162413698611,"rightRoofHeight":17.11162413698611,"selected":false,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17.11162413698611,"rightTopPartialHeight":17.11162413698611},{"type":"Foundation","cx":14.958059471973794,"cy":-10.376627749775599,"cz":0.05,"lx":3.9130970991852903,"ly":26.13645284205659,"lz":0.10907253340755482,"normal":[0,0,1],"rotation":[0,0,2.576026974436725],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7jmzUaUYBWVbxJMLM3ukrN","selected":false,"enableGroupMaster":false,"color":"#ffffff","locked":false},{"type":"Foundation","cx":7.577351540057415,"cy":-22.562392942244166,"cz":0.05,"lx":53.002191940731585,"ly":17.343791633088202,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3JxHzzEsV9Da6tuGXPViKy","color":"#ffffff","locked":false},{"type":"Wall","cx":0,"cy":6.071605429917916,"cz":0,"lx":41.97190103136961,"ly":0.3,"lz":10,"relativeAngle":3.141592653589793,"leftPoint":[20.985950515684806,6.071605429917916,0],"rightPoint":[-20.985950515684806,6.071605429917916,0],"leftJoints":["4R59jrQvJmq95aQT2Dv649"],"rightJoints":["iLwQ5UBgBL3sonqBcqFoC5"],"textureType":"Wall Texture #8","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"eaUtdoPPg5CEenHZ1cZ7yL","color":"white","roofId":"3pZdU1AL5k6hknNK4gDLPK","leftRoofHeight":10,"rightRoofHeight":10,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-20.985950515684806,"cy":-0.25298355957991303,"cz":0,"lx":12.64917797899566,"ly":0.3,"lz":10,"relativeAngle":-1.5707963267948966,"leftPoint":[-20.985950515684806,6.071605429917916,0],"rightPoint":[-20.985950515684806,-6.577572549077742,0],"leftJoints":["eaUtdoPPg5CEenHZ1cZ7yL"],"rightJoints":["puEFSm14QZKVxz67Z67N16"],"textureType":"Wall Texture #8","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"iLwQ5UBgBL3sonqBcqFoC5","color":"white","roofId":"3pZdU1AL5k6hknNK4gDLPK","leftRoofHeight":10,"rightRoofHeight":10,"centerRoofHeight":[0,13.341587920831635],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":0,"cy":-6.577572549077742,"cz":0,"lx":41.97190103136961,"ly":0.3,"lz":10,"relativeAngle":0,"leftPoint":[-20.985950515684806,-6.577572549077742,0],"rightPoint":[20.985950515684806,-6.577572549077742,0],"leftJoints":["iLwQ5UBgBL3sonqBcqFoC5"],"rightJoints":["4R59jrQvJmq95aQT2Dv649"],"textureType":"Wall Texture #8","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"puEFSm14QZKVxz67Z67N16","color":"white","roofId":"3pZdU1AL5k6hknNK4gDLPK","leftRoofHeight":10,"rightRoofHeight":10,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":20.985950515684806,"cy":-0.25298355957991303,"cz":0,"lx":12.64917797899566,"ly":0.3,"lz":10,"relativeAngle":1.5707963267948966,"leftPoint":[20.985950515684806,-6.577572549077742,0],"rightPoint":[20.985950515684806,6.071605429917916,0],"leftJoints":["puEFSm14QZKVxz67Z67N16"],"rightJoints":["eaUtdoPPg5CEenHZ1cZ7yL"],"textureType":"Wall Texture #8","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"4R59jrQvJmq95aQT2Dv649","color":"white","roofId":"3pZdU1AL5k6hknNK4gDLPK","leftRoofHeight":10,"rightRoofHeight":10,"centerRoofHeight":[0,13.341587920831635],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["9CKGzf7taYbb5TxpshE7KA","2AP7zuBsHXSx9vjaaQ41Sa","gH8a7zMeyH4srn6fpqovLp","dzLroXC8UBmujXxPj58BnJ"],"textureType":"Roof Texture #5","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,2.576026974436725],"parentId":"7jmzUaUYBWVbxJMLM3ukrN","foundationId":"7jmzUaUYBWVbxJMLM3ukrN","id":"uGKYfaStAHZiUBuVtKS6dW","locked":false,"rise":8.555812068493054,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["2RETAxyRMzZBEQkBGms56R","beHqET5NN8aNdsuBncMpY7","pPpJHGJ2bGVqLdA1FpXi4V","giYTP9Qg6uJ3yfkS1RoDqG"],"textureType":"Roof Texture #5","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"aAQtPcYcdvnjKLxjxpN6fj","locked":false,"rise":1.975489281315383,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Gable","roofStructure":"Default","wallsId":["eaUtdoPPg5CEenHZ1cZ7yL"],"textureType":"Roof Texture #5","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"3JxHzzEsV9Da6tuGXPViKy","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"3pZdU1AL5k6hknNK4gDLPK","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":false,"rise":3.3415879208316355,"ceiling":false},{"type":"Human","name":"Jack","cx":24.03461056644682,"cy":-0.9488790909164386,"cz":0.10000000149011613,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,1.0052306476418282],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"3LWACNGJBDVRSGmB2iRsbK","selected":false,"locked":false,"ly":0.42},{"type":"Wall","cx":0,"cy":6,"cz":0,"lx":27,"ly":0.3,"lz":10,"leftJoints":["bJ26Y2Ztj2wnvSCwMVZbSj"],"rightJoints":["iwUy27fkuqc81ipg2dgQZa"],"leftPoint":[13.5,6,0],"rightPoint":[-13.5,6,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"id":"agFV6snz1JdtWvd4JR2cDW","parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofId":"cHg19Gk5NDmFTLbhEqkpEc","selected":false,"leftRoofHeight":10,"rightRoofHeight":10,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-13.5,"cy":-0.25,"cz":0,"lx":12.5,"ly":0.3,"lz":10,"leftJoints":["agFV6snz1JdtWvd4JR2cDW"],"rightJoints":["c7vcy9r1yDujdJxgxp5TzY"],"leftPoint":[-13.499999999999998,6,0],"rightPoint":[-13.5,-6.5,0],"relativeAngle":4.71238898038469,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"id":"iwUy27fkuqc81ipg2dgQZa","parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofId":"cHg19Gk5NDmFTLbhEqkpEc","selected":false,"leftRoofHeight":10,"rightRoofHeight":10,"centerRoofHeight":[0,13.341587920831635],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":0,"cy":-6.5,"cz":0,"lx":27,"ly":0.3,"lz":10,"leftJoints":["iwUy27fkuqc81ipg2dgQZa"],"rightJoints":["bJ26Y2Ztj2wnvSCwMVZbSj"],"leftPoint":[-13.5,-6.5,0],"rightPoint":[13.5,-6.5,0],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"id":"c7vcy9r1yDujdJxgxp5TzY","parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofId":"cHg19Gk5NDmFTLbhEqkpEc","selected":false,"leftRoofHeight":10,"rightRoofHeight":10,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":13.5,"cy":-0.25,"cz":0,"lx":12.5,"ly":0.3,"lz":10,"leftJoints":["c7vcy9r1yDujdJxgxp5TzY"],"rightJoints":["agFV6snz1JdtWvd4JR2cDW"],"leftPoint":[13.5,-6.5,0],"rightPoint":[13.5,6,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"id":"bJ26Y2Ztj2wnvSCwMVZbSj","parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofId":"cHg19Gk5NDmFTLbhEqkpEc","selected":false,"leftRoofHeight":10,"rightRoofHeight":10,"centerRoofHeight":[0,13.341587920831635],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"id":"cHg19Gk5NDmFTLbhEqkpEc","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"parentId":"aXmgoxjAJPULF92Dwj9wXo","foundationId":"aXmgoxjAJPULF92Dwj9wXo","roofType":"Gable","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["agFV6snz1JdtWvd4JR2cDW"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false,"rise":3.3415879208316355,"ceiling":false},{"type":"Foundation","cx":10.745099874695102,"cy":-19.099061544436797,"cz":0.05,"lx":34.0956484513338,"ly":17.139247765633556,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-0.5655656791530684],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"aXmgoxjAJPULF92Dwj9wXo","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["rbfyBq5mDVjxhT7cHiZa6r"],"rightJoints":["evmZhzFqQUpVbc7Pz1QgMJ"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"wnNdNWw7uCJtb791q2h2kv","parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","opacity":0.5,"roofId":"xgcfKKQgeBMWdofPE3DXN2","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["tFV6qvitr5PH2Ab2oo3oSn"],"rightJoints":["wnNdNWw7uCJtb791q2h2kv"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"rbfyBq5mDVjxhT7cHiZa6r","parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","wallStructure":"Default","opacity":0.5,"roofId":"xgcfKKQgeBMWdofPE3DXN2","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["wnNdNWw7uCJtb791q2h2kv"],"rightJoints":["tFV6qvitr5PH2Ab2oo3oSn"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"evmZhzFqQUpVbc7Pz1QgMJ","parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","opacity":0.5,"roofId":"xgcfKKQgeBMWdofPE3DXN2","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["evmZhzFqQUpVbc7Pz1QgMJ"],"rightJoints":["rbfyBq5mDVjxhT7cHiZa6r"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"tFV6qvitr5PH2Ab2oo3oSn","parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","opacity":0.5,"roofId":"xgcfKKQgeBMWdofPE3DXN2","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"xgcfKKQgeBMWdofPE3DXN2","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"gddwwsiW9SAwt9BDP8qhGA","foundationId":"gddwwsiW9SAwt9BDP8qhGA","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["wnNdNWw7uCJtb791q2h2kv","evmZhzFqQUpVbc7Pz1QgMJ","tFV6qvitr5PH2Ab2oo3oSn","rbfyBq5mDVjxhT7cHiZa6r"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":-10.384377691463378,"cy":-33.417453285003795,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gddwwsiW9SAwt9BDP8qhGA","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["juENJWiqAWw4xaJKCkBnBu"],"rightJoints":["kR4ctZiA4puw1EFB5KiG5E"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"b44mniuvoz9x2PrRVmaHR2","parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","opacity":0.5,"roofId":"xvCWqbtBHhPfDxKkaUCj1N","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gmYm1iNZTPrTFyvZ3zM6wc"],"rightJoints":["b44mniuvoz9x2PrRVmaHR2"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"juENJWiqAWw4xaJKCkBnBu","parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","wallStructure":"Default","opacity":0.5,"roofId":"xvCWqbtBHhPfDxKkaUCj1N","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["b44mniuvoz9x2PrRVmaHR2"],"rightJoints":["gmYm1iNZTPrTFyvZ3zM6wc"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"kR4ctZiA4puw1EFB5KiG5E","parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","opacity":0.5,"roofId":"xvCWqbtBHhPfDxKkaUCj1N","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kR4ctZiA4puw1EFB5KiG5E"],"rightJoints":["juENJWiqAWw4xaJKCkBnBu"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"gmYm1iNZTPrTFyvZ3zM6wc","parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","opacity":0.5,"roofId":"xvCWqbtBHhPfDxKkaUCj1N","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"xvCWqbtBHhPfDxKkaUCj1N","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"eTTCEUsedrFiMVxzGXSPUk","foundationId":"eTTCEUsedrFiMVxzGXSPUk","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["b44mniuvoz9x2PrRVmaHR2","kR4ctZiA4puw1EFB5KiG5E","gmYm1iNZTPrTFyvZ3zM6wc","juENJWiqAWw4xaJKCkBnBu"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":-8.002707095672621,"cy":-29.66519620128789,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eTTCEUsedrFiMVxzGXSPUk","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["r3gZsm5d2NUURkeJvNjoh1"],"rightJoints":["6gbdPzRZhLL2pFKuqZLzc7"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"h6RcENRcyV9RrecCDiFvpW","parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","opacity":0.5,"roofId":"6gwGsxKD4B1rm1H1Vk3Ngq","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["oFJo6fvJ5KGuFkZ1uaJYjz"],"rightJoints":["h6RcENRcyV9RrecCDiFvpW"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"r3gZsm5d2NUURkeJvNjoh1","parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","wallStructure":"Default","opacity":0.5,"roofId":"6gwGsxKD4B1rm1H1Vk3Ngq","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["h6RcENRcyV9RrecCDiFvpW"],"rightJoints":["oFJo6fvJ5KGuFkZ1uaJYjz"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"6gbdPzRZhLL2pFKuqZLzc7","parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","opacity":0.5,"roofId":"6gwGsxKD4B1rm1H1Vk3Ngq","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["6gbdPzRZhLL2pFKuqZLzc7"],"rightJoints":["r3gZsm5d2NUURkeJvNjoh1"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"oFJo6fvJ5KGuFkZ1uaJYjz","parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","opacity":0.5,"roofId":"6gwGsxKD4B1rm1H1Vk3Ngq","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"6gwGsxKD4B1rm1H1Vk3Ngq","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"dry3LvTbwVtZ9zC2iXiS6E","foundationId":"dry3LvTbwVtZ9zC2iXiS6E","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["h6RcENRcyV9RrecCDiFvpW","6gbdPzRZhLL2pFKuqZLzc7","oFJo6fvJ5KGuFkZ1uaJYjz","r3gZsm5d2NUURkeJvNjoh1"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":-5.621036499881868,"cy":-25.912939117571987,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dry3LvTbwVtZ9zC2iXiS6E","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["tuFkkTxMLGJupvdG99JJmE"],"rightJoints":["dCPkgeninMwV2CefSv8Tyh"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"5VMupGYdfv6eXLkphmN6Sb","parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","opacity":0.5,"roofId":"vWxd63CkWo4geKwK32Aif7","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["f9C4rqMCfriiBEp6cWZTjf"],"rightJoints":["5VMupGYdfv6eXLkphmN6Sb"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"tuFkkTxMLGJupvdG99JJmE","parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","wallStructure":"Default","opacity":0.5,"roofId":"vWxd63CkWo4geKwK32Aif7","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["5VMupGYdfv6eXLkphmN6Sb"],"rightJoints":["f9C4rqMCfriiBEp6cWZTjf"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"dCPkgeninMwV2CefSv8Tyh","parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","opacity":0.5,"roofId":"vWxd63CkWo4geKwK32Aif7","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["dCPkgeninMwV2CefSv8Tyh"],"rightJoints":["tuFkkTxMLGJupvdG99JJmE"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"f9C4rqMCfriiBEp6cWZTjf","parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","opacity":0.5,"roofId":"vWxd63CkWo4geKwK32Aif7","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"vWxd63CkWo4geKwK32Aif7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"teEJ9AmuMs6M9VZiHzT62s","foundationId":"teEJ9AmuMs6M9VZiHzT62s","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["5VMupGYdfv6eXLkphmN6Sb","dCPkgeninMwV2CefSv8Tyh","f9C4rqMCfriiBEp6cWZTjf","tuFkkTxMLGJupvdG99JJmE"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":-3.2393659040911107,"cy":-22.16068203385608,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"teEJ9AmuMs6M9VZiHzT62s","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gwHuE3q3o7hQafGJcQ7Ldx"],"rightJoints":["1LixWzKAyzhWp6KyjXV5K9"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"8ATi9fhnsoTYgrRebeda98","parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","opacity":0.5,"roofId":"2igmnqP4fQU8AfDDqEEHxR","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["9xBo23SsCzdw2nMz6XkrRK"],"rightJoints":["8ATi9fhnsoTYgrRebeda98"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"gwHuE3q3o7hQafGJcQ7Ldx","parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","wallStructure":"Default","opacity":0.5,"roofId":"2igmnqP4fQU8AfDDqEEHxR","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["8ATi9fhnsoTYgrRebeda98"],"rightJoints":["9xBo23SsCzdw2nMz6XkrRK"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"1LixWzKAyzhWp6KyjXV5K9","parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","opacity":0.5,"roofId":"2igmnqP4fQU8AfDDqEEHxR","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["1LixWzKAyzhWp6KyjXV5K9"],"rightJoints":["gwHuE3q3o7hQafGJcQ7Ldx"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"9xBo23SsCzdw2nMz6XkrRK","parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","opacity":0.5,"roofId":"2igmnqP4fQU8AfDDqEEHxR","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"2igmnqP4fQU8AfDDqEEHxR","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"w1GQJoXwTctyFPQTHvbCSJ","foundationId":"w1GQJoXwTctyFPQTHvbCSJ","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["8ATi9fhnsoTYgrRebeda98","1LixWzKAyzhWp6KyjXV5K9","9xBo23SsCzdw2nMz6XkrRK","gwHuE3q3o7hQafGJcQ7Ldx"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":5.878850875181692,"cy":-43.63794559714253,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"w1GQJoXwTctyFPQTHvbCSJ","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gVQBUETgtMy9wnJS5MyAwR"],"rightJoints":["kZ3yx1o3MpryY5DEwAHRSu"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"mVXKFfUbKmFXpx4p6d1mu7","parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","opacity":0.5,"roofId":"d2Rg3hSVCMgqwYgvySw6Ve","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["uXfDQAFqu42CBoR6RERDEE"],"rightJoints":["mVXKFfUbKmFXpx4p6d1mu7"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"gVQBUETgtMy9wnJS5MyAwR","parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","wallStructure":"Default","opacity":0.5,"roofId":"d2Rg3hSVCMgqwYgvySw6Ve","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["mVXKFfUbKmFXpx4p6d1mu7"],"rightJoints":["uXfDQAFqu42CBoR6RERDEE"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"kZ3yx1o3MpryY5DEwAHRSu","parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","opacity":0.5,"roofId":"d2Rg3hSVCMgqwYgvySw6Ve","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kZ3yx1o3MpryY5DEwAHRSu"],"rightJoints":["gVQBUETgtMy9wnJS5MyAwR"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"uXfDQAFqu42CBoR6RERDEE","parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","opacity":0.5,"roofId":"d2Rg3hSVCMgqwYgvySw6Ve","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"d2Rg3hSVCMgqwYgvySw6Ve","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"qFjTDh4kdKUejoECGaAtFF","foundationId":"qFjTDh4kdKUejoECGaAtFF","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["mVXKFfUbKmFXpx4p6d1mu7","kZ3yx1o3MpryY5DEwAHRSu","uXfDQAFqu42CBoR6RERDEE","gVQBUETgtMy9wnJS5MyAwR"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":8.26052147097245,"cy":-39.88568851342663,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qFjTDh4kdKUejoECGaAtFF","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["4U2FUn1XmkrEQUaPmhvyyA"],"rightJoints":["jPqCvMBCkPVvRbVHByK9Sd"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"5zbGDbw5ZL64ZnafnWAddf","parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","opacity":0.5,"roofId":"efiH48pXLfRzfiE8Wi1bdv","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["jsjvgQe8PDECuTtUpZqqPx"],"rightJoints":["5zbGDbw5ZL64ZnafnWAddf"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"4U2FUn1XmkrEQUaPmhvyyA","parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","wallStructure":"Default","opacity":0.5,"roofId":"efiH48pXLfRzfiE8Wi1bdv","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["5zbGDbw5ZL64ZnafnWAddf"],"rightJoints":["jsjvgQe8PDECuTtUpZqqPx"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"jPqCvMBCkPVvRbVHByK9Sd","parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","opacity":0.5,"roofId":"efiH48pXLfRzfiE8Wi1bdv","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["jPqCvMBCkPVvRbVHByK9Sd"],"rightJoints":["4U2FUn1XmkrEQUaPmhvyyA"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"jsjvgQe8PDECuTtUpZqqPx","parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","opacity":0.5,"roofId":"efiH48pXLfRzfiE8Wi1bdv","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"efiH48pXLfRzfiE8Wi1bdv","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"eawHcqEx4ydgKwpfjVv9RR","foundationId":"eawHcqEx4ydgKwpfjVv9RR","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["5zbGDbw5ZL64ZnafnWAddf","jPqCvMBCkPVvRbVHByK9Sd","jsjvgQe8PDECuTtUpZqqPx","4U2FUn1XmkrEQUaPmhvyyA"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":10.6421920667632,"cy":-36.13343142971072,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eawHcqEx4ydgKwpfjVv9RR","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kzoM97zxdWMYoEvnY6njBU"],"rightJoints":["hCESxuxDssAckoNt8Ysqfa"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"hjQtHP6wU1C98tsKp38NFc","parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","opacity":0.5,"roofId":"fyUg5zq8ntfBYqeveZG1Mz","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["rpsA3uefMnrgXZ2ssSvfxV"],"rightJoints":["hjQtHP6wU1C98tsKp38NFc"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"kzoM97zxdWMYoEvnY6njBU","parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","wallStructure":"Default","opacity":0.5,"roofId":"fyUg5zq8ntfBYqeveZG1Mz","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["hjQtHP6wU1C98tsKp38NFc"],"rightJoints":["rpsA3uefMnrgXZ2ssSvfxV"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"hCESxuxDssAckoNt8Ysqfa","parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","opacity":0.5,"roofId":"fyUg5zq8ntfBYqeveZG1Mz","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["hCESxuxDssAckoNt8Ysqfa"],"rightJoints":["kzoM97zxdWMYoEvnY6njBU"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"rpsA3uefMnrgXZ2ssSvfxV","parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","opacity":0.5,"roofId":"fyUg5zq8ntfBYqeveZG1Mz","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"fyUg5zq8ntfBYqeveZG1Mz","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"g52oWNGab2d5tJm7ExTD79","foundationId":"g52oWNGab2d5tJm7ExTD79","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["hjQtHP6wU1C98tsKp38NFc","hCESxuxDssAckoNt8Ysqfa","rpsA3uefMnrgXZ2ssSvfxV","kzoM97zxdWMYoEvnY6njBU"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":13.023862662553956,"cy":-32.381174345994815,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"g52oWNGab2d5tJm7ExTD79","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["vpoRybfzCjbHDw4Zf7t8V7"],"rightJoints":["pWk5x2zZNk49mb2AbHyPt9"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"85JuGPRhVTskx5HKKPLWZJ","parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","opacity":0.5,"roofId":"uzoWkkSM6BdFkW3tQ9QEeP","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["a723GZeeHDaeGxxKov9kNA"],"rightJoints":["85JuGPRhVTskx5HKKPLWZJ"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"vpoRybfzCjbHDw4Zf7t8V7","parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","wallStructure":"Default","opacity":0.5,"roofId":"uzoWkkSM6BdFkW3tQ9QEeP","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["85JuGPRhVTskx5HKKPLWZJ"],"rightJoints":["a723GZeeHDaeGxxKov9kNA"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"pWk5x2zZNk49mb2AbHyPt9","parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","opacity":0.5,"roofId":"uzoWkkSM6BdFkW3tQ9QEeP","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["pWk5x2zZNk49mb2AbHyPt9"],"rightJoints":["vpoRybfzCjbHDw4Zf7t8V7"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"a723GZeeHDaeGxxKov9kNA","parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","opacity":0.5,"roofId":"uzoWkkSM6BdFkW3tQ9QEeP","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"uzoWkkSM6BdFkW3tQ9QEeP","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"e3sKy7gdQ45ovgtshJNKSh","foundationId":"e3sKy7gdQ45ovgtshJNKSh","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["85JuGPRhVTskx5HKKPLWZJ","pWk5x2zZNk49mb2AbHyPt9","a723GZeeHDaeGxxKov9kNA","vpoRybfzCjbHDw4Zf7t8V7"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":23.539261545507316,"cy":-15.785608947862563,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"e3sKy7gdQ45ovgtshJNKSh","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["ucyqM28VHCejiYXSBRU74w"],"rightJoints":["wCoXQcNBi6mJ5wS4Y6r4VL"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"mRLpMEwUpk6b3VqzxYNaep","parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","opacity":0.5,"roofId":"4sAKtdpUfojEauuc9xKUx9","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["oqTZ9Y5zqDf3qpPSoAsnfq"],"rightJoints":["mRLpMEwUpk6b3VqzxYNaep"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"ucyqM28VHCejiYXSBRU74w","parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","wallStructure":"Default","opacity":0.5,"roofId":"4sAKtdpUfojEauuc9xKUx9","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["mRLpMEwUpk6b3VqzxYNaep"],"rightJoints":["oqTZ9Y5zqDf3qpPSoAsnfq"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"wCoXQcNBi6mJ5wS4Y6r4VL","parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","opacity":0.5,"roofId":"4sAKtdpUfojEauuc9xKUx9","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["wCoXQcNBi6mJ5wS4Y6r4VL"],"rightJoints":["ucyqM28VHCejiYXSBRU74w"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"oqTZ9Y5zqDf3qpPSoAsnfq","parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","opacity":0.5,"roofId":"4sAKtdpUfojEauuc9xKUx9","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"4sAKtdpUfojEauuc9xKUx9","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"9NZEpPcimoPFTA7fAmDMQW","foundationId":"9NZEpPcimoPFTA7fAmDMQW","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["mRLpMEwUpk6b3VqzxYNaep","wCoXQcNBi6mJ5wS4Y6r4VL","oqTZ9Y5zqDf3qpPSoAsnfq","ucyqM28VHCejiYXSBRU74w"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":7.4047851687956925,"cy":-5.505166586090663,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9NZEpPcimoPFTA7fAmDMQW","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kfCkPxHEQXF9CME4mp5rfJ"],"rightJoints":["m1iEhgTKYmokoNeBfUn1Zw"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"kywCD23ffmYn7n35c65bvN","parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","opacity":0.5,"roofId":"uZ3WYfpisjGExUNhqUQ6GJ","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["5nYLFT5aCGPe4ESsdg7FAP"],"rightJoints":["kywCD23ffmYn7n35c65bvN"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"kfCkPxHEQXF9CME4mp5rfJ","parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","wallStructure":"Default","opacity":0.5,"roofId":"uZ3WYfpisjGExUNhqUQ6GJ","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["kywCD23ffmYn7n35c65bvN"],"rightJoints":["5nYLFT5aCGPe4ESsdg7FAP"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"m1iEhgTKYmokoNeBfUn1Zw","parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","opacity":0.5,"roofId":"uZ3WYfpisjGExUNhqUQ6GJ","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["m1iEhgTKYmokoNeBfUn1Zw"],"rightJoints":["kfCkPxHEQXF9CME4mp5rfJ"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"id":"5nYLFT5aCGPe4ESsdg7FAP","parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","opacity":0.5,"roofId":"uZ3WYfpisjGExUNhqUQ6GJ","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"uZ3WYfpisjGExUNhqUQ6GJ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"aU7wo9HzTSBezmB9xaSNVe","foundationId":"aU7wo9HzTSBezmB9xaSNVe","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["kywCD23ffmYn7n35c65bvN","m1iEhgTKYmokoNeBfUn1Zw","5nYLFT5aCGPe4ESsdg7FAP","kfCkPxHEQXF9CME4mp5rfJ"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":25.920932141298064,"cy":-12.03335186414666,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,-2.136362005947965],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"aU7wo9HzTSBezmB9xaSNVe","selected":false,"locked":false},{"type":"Wall","cx":-0.05770761016186121,"cy":-2.0545438475941236,"cz":2.2408122612280286,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["3Yw9eyhMVgXRzWxARHi4qj"],"rightJoints":["gLQjrbahvSyZbT7mE7nLTs"],"leftPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"tsTPsXh1D4u1sYk5kevjpw","parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","opacity":0.5,"roofId":"t86AYAH7J8wQCFq8cXiLAx","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":0.5758269282626731,"cy":-2.6370266614844784,"cz":2.2301039869226305,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["eve2xjCEYcENW3bQKBtFbH"],"rightJoints":["tsTPsXh1D4u1sYk5kevjpw"],"leftPoint":[0.5758269282626731,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-2.0545438475941236,0.07664429931579812],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"3Yw9eyhMVgXRzWxARHi4qj","parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","wallStructure":"Default","opacity":0.5,"roofId":"t86AYAH7J8wQCFq8cXiLAx","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.6912421485863973,"cy":-2.6370266614844784,"cz":2.228839888904333,"lx":1.1649656277807072,"ly":0.2,"lz":12.024186118737006,"leftJoints":["tsTPsXh1D4u1sYk5kevjpw"],"rightJoints":["eve2xjCEYcENW3bQKBtFbH"],"leftPoint":[-0.6912421485863973,-2.0545438475941236,0.07664429931579812],"rightPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"gLQjrbahvSyZbT7mE7nLTs","parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","opacity":0.5,"roofId":"t86AYAH7J8wQCFq8cXiLAx","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"type":"Wall","cx":-0.05770761016186121,"cy":-3.2195094753748315,"cz":2.268765007024547,"lx":1.2670690768490716,"ly":0.2,"lz":12.024186118737006,"leftJoints":["gLQjrbahvSyZbT7mE7nLTs"],"rightJoints":["3Yw9eyhMVgXRzWxARHi4qj"],"leftPoint":[-0.6912421485863973,-3.2195094753748315,0.07664429931579812],"rightPoint":[0.5758269282626749,-3.2195094753748315,0.07664429931579812],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"eve2xjCEYcENW3bQKBtFbH","parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","opacity":0.5,"roofId":"t86AYAH7J8wQCFq8cXiLAx","selected":false,"leftRoofHeight":12.024186118737006,"rightRoofHeight":12.024186118737006,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12.024186118737006,"rightTopPartialHeight":12.024186118737006},{"id":"t86AYAH7J8wQCFq8cXiLAx","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"7JsauhgC1ELukuq9oR7WP3","foundationId":"7JsauhgC1ELukuq9oR7WP3","roofType":"Pyramid","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["tsTPsXh1D4u1sYk5kevjpw","gLQjrbahvSyZbT7mE7nLTs","eve2xjCEYcENW3bQKBtFbH","3Yw9eyhMVgXRzWxARHi4qj"],"selected":false,"locked":false,"rise":3.274541173757898,"ceiling":false},{"type":"Foundation","cx":9.786455764586453,"cy":-1.752909502374763,"cz":0.05,"lx":2.222149187675665,"ly":7.1332883762479655,"lz":0.07664429931579812,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7JsauhgC1ELukuq9oR7WP3","selected":false,"locked":false},{"type":"Wall","cx":1.1857370908139018,"cy":9.993801958880498,"cz":0,"lx":39.97362197823709,"ly":0.3,"lz":4.929284805861828,"leftJoints":["7ZPYuSaC3udPdFwLBc9LcF"],"rightJoints":["dHQToxKir9k3FNNhxE7P9U"],"leftPoint":[21.172548079932447,9.993801958880498,0.049292848058618284],"rightPoint":[-18.80107389830464,9.993801958880498,0.049292848058618284],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"bMP8c52yyd4ARJDKPf1aWM","parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofId":"vQHPZRPjRtVs3kCxxrFEVN","selected":false,"leftRoofHeight":4.929284805861828,"rightRoofHeight":4.929284805861828,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.929284805861828,"rightTopPartialHeight":4.929284805861828},{"type":"Wall","cx":-18.80107389830464,"cy":0.044516399695865516,"cz":0,"lx":19.89857111836926,"ly":0.3,"lz":4.929284805861828,"leftJoints":["bMP8c52yyd4ARJDKPf1aWM"],"rightJoints":["7MR7F47mpBryE1Ejti6rUy"],"leftPoint":[-18.80107389830464,9.993801958880498,0.049292848058618284],"rightPoint":[-18.80107389830464,-9.904769159488765,0.049292848058618284],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"dHQToxKir9k3FNNhxE7P9U","parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofId":"vQHPZRPjRtVs3kCxxrFEVN","selected":false,"leftRoofHeight":4.929284805861828,"rightRoofHeight":4.929284805861828,"centerRoofHeight":[0,8.270872726693463],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.929284805861828,"rightTopPartialHeight":4.929284805861828},{"type":"Wall","cx":1.1857370908139018,"cy":-9.904769159488765,"cz":0,"lx":39.97362197823709,"ly":0.3,"lz":4.929284805861828,"leftJoints":["dHQToxKir9k3FNNhxE7P9U"],"rightJoints":["7ZPYuSaC3udPdFwLBc9LcF"],"leftPoint":[-18.80107389830464,-9.904769159488765,0.049292848058618284],"rightPoint":[21.172548079932447,-9.904769159488765,0.049292848058618284],"relativeAngle":0,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"7MR7F47mpBryE1Ejti6rUy","parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofId":"vQHPZRPjRtVs3kCxxrFEVN","selected":false,"leftRoofHeight":4.929284805861828,"rightRoofHeight":4.929284805861828,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.929284805861828,"rightTopPartialHeight":4.929284805861828},{"type":"Wall","cx":21.172548079932447,"cy":0.044516399695865516,"cz":0,"lx":19.89857111836926,"ly":0.3,"lz":4.929284805861828,"leftJoints":["7MR7F47mpBryE1Ejti6rUy"],"rightJoints":["bMP8c52yyd4ARJDKPf1aWM"],"leftPoint":[21.172548079932447,-9.904769159488765,0.049292848058618284],"rightPoint":[21.172548079932447,9.993801958880498,0.049292848058618284],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #8","color":"white","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"id":"7ZPYuSaC3udPdFwLBc9LcF","parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofId":"vQHPZRPjRtVs3kCxxrFEVN","selected":false,"leftRoofHeight":4.929284805861828,"rightRoofHeight":4.929284805861828,"centerRoofHeight":[0,8.270872726693463],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.929284805861828,"rightTopPartialHeight":4.929284805861828},{"id":"vQHPZRPjRtVs3kCxxrFEVN","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","roofType":"Gable","roofStructure":"Default","textureType":"Roof Texture #5","thickness":0.05,"wallsId":["bMP8c52yyd4ARJDKPf1aWM"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false,"rise":3.3415879208316355,"ceiling":false},{"type":"Foundation","cx":7.4620263843372925,"cy":-23.808571879858576,"cz":0.1,"lx":57.05667537827628,"ly":36.07153705363366,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,1.0052306476418282],"parentId":"Ground","color":"#ffffff","textureType":"Foundation Texture #2","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"rmtVJVWrnHvQEaqLr1b9Tf","selected":false,"enableGroupMaster":true,"locked":false},{"type":"Door","cx":0.019764130160484145,"cy":0,"cz":-0.35,"lx":0.3557543428887146,"ly":0,"lz":0.3,"textureType":"Door Texture #7","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"4R59jrQvJmq95aQT2Dv649","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"5i5aw65ViZQJ6ANMtaYEt3","locked":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.3162260825677463,"cy":0.1,"cz":4.4408920985006264e-17,"lx":0.1581130412838731,"ly":0.3,"lz":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4R59jrQvJmq95aQT2Dv649","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"gAXs9sJoJF81X2Sdijoe3o","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.35575434288871466,"cy":0.1,"cz":4.4408920985006264e-17,"lx":0.15811304128387302,"ly":0.3,"lz":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4R59jrQvJmq95aQT2Dv649","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"agk3V1PDaTw1t7ybFJCTUJ","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.019764130160484145,"cy":0.1,"cz":0.1625,"lx":0.3557543428887146,"ly":0.3,"lz":0.575,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4R59jrQvJmq95aQT2Dv649","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"mnCW9Hm1zy48vmk8GxhHip","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":2.25},{"type":"Window","cx":0.2939438414261553,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"dJzbjbMH3V7vVry4QUZJ1h","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.36899333285410985,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aVMji7S1iMqS6e5iGevjST","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.4440428242820644,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4xnBXKk3mzEiVTEU1sUo9z","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.4440428242820644,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vGt71VZQKGWWqARuxaBuHk","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.36899333285410985,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"nQw98VMPrH5pKkcEzYqYAr","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.2939438414261553,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"oDAHJqV8nu3rm8iXJXkjDo","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.21889434999820076,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"dQtpLnqk4XU6QXdnZwYZ3y","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.1438448585702462,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"fnp6cZDYtVkBgXyRLqoy4k","parentId":"7MR7F47mpBryE1Ejti6rUy","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.4440428242820644,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"taL5VcYj3uWGDL8xr44zFA","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.36899333285410985,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"36eQAALv2V7tE2Nitdg2Z9","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.2939438414261553,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"j19CocmDx5qUxbi12esWTq","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.1438448585702462,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aNTKQXqg4KFQWerkNfvi67","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.21889434999820076,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"7wkeWMuadLGRRHvrhXkgXu","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.2939438414261553,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"pP3XvCSY89vtf8Jf82MA2Q","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.36899333285410985,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"o5mLe8ag3RmgrS6cYio7c2","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.4440428242820644,"cy":0.1,"cz":0.05071729669640994,"lx":0.03752474571397727,"ly":0.3,"lz":0.5071729669640999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"sJP9KeY4DvXEbM21cwfCL6","parentId":"bMP8c52yyd4ARJDKPf1aWM","foundationId":"rmtVJVWrnHvQEaqLr1b9Tf","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.4,"cy":0.1,"cz":0.025,"lx":0.08,"ly":0.3,"lz":0.85,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"faxjoAqSZje6BEDac2ztM3","parentId":"bJ26Y2Ztj2wnvSCwMVZbSj","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.125,"lx":0.16,"ly":0.3,"lz":1.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2KQEWZui5HypVTjznRgV1e","parentId":"bJ26Y2Ztj2wnvSCwMVZbSj","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.4,"cy":0.1,"cz":0.025,"lx":0.08,"ly":0.3,"lz":0.85,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vmXEoXgzaz3BcPRdhwTBNF","parentId":"bJ26Y2Ztj2wnvSCwMVZbSj","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.4,"cy":0.1,"cz":0.025,"lx":0.08,"ly":0.3,"lz":0.85,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jgVVfzMun1U9KUtjVLXpLW","parentId":"iwUy27fkuqc81ipg2dgQZa","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4,"cy":0.1,"cz":0.025,"lx":0.08,"ly":0.3,"lz":0.85,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"7LVpvnWs9aYvqrDqGeRFsz","parentId":"iwUy27fkuqc81ipg2dgQZa","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0040000000000000036,"cy":0.1,"cz":0.14500000000000002,"lx":0.2,"ly":0.3,"lz":1.05,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"kUvJ29KgoC2Mx2n6oquM7i","parentId":"iwUy27fkuqc81ipg2dgQZa","foundationId":"aXmgoxjAJPULF92Dwj9wXo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Human","name":"Jade","cx":24.498922181392803,"cy":0.35278398935384025,"cz":0.10000000149011613,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,1.0052306476418282],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"8oCpJQ69v59EaR16ZevwwH","selected":false,"locked":false,"ly":0.48},{"type":"Human","name":"Jennifer","cx":24.15853922395012,"cy":-4.360566668970516,"cz":0.10000000149011613,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"23pVVVaYxcEWbusAdT9bp6","selected":false,"locked":false,"ly":0.45},{"type":"Human","name":"Jeanette","cx":23.512736665641548,"cy":-5.246201365995199,"cz":0.1000000014901179,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"vLrAF4TXaJsxUnvTqvZyhr","selected":false,"locked":false,"ly":0.4},{"type":"Human","name":"Judd","cx":23.688249777842685,"cy":-7.134597873618337,"cz":0.10000000149011613,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"72RNARnNBupWUTwLyPFi2x","selected":false,"locked":false,"ly":0.544},{"type":"Flower","name":"Hydrangea","cx":14.106133352222937,"cy":-12.792118753025974,"cz":0.1000000014901179,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"hxA3iWj7PVq4oxfYivWPDZ","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":16.106133352222937,"cy":-12.792118753025974,"cz":0.1000000014901179,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"em4eb843STnngTiG8Pq4ZG","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":18.106133352222937,"cy":-12.792118753025974,"cz":0.1000000014901179,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"xn9oq6YLSQoRDx2Th897Ey","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":20.106133352222937,"cy":-12.792118753025974,"cz":0.1000000014901179,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"n5Xm3uZ3yogruAzMr3ekgG","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":12.711504093322223,"cy":12.55312249061943,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"vGSyjGNkAKGrDeLZUtMvLb","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":15.040744575677394,"cy":12.500852726588041,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"xdceQ9SQzswYkrUwEtMzsR","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":17.31542920437773,"cy":12.41395471892114,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"1diZFF1KGB7XeeLHtoXNtr","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":19.66459729675223,"cy":12.4508690521801,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"4Rb2MRXZ3tKBv37PWSvEzQ","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-17.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"vhFQBJS6Fh7bkaVvXfo1NR","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-15.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"dFZa68UKB2fanAfPxKpSfp","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-13.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"u1q3FxnjwFSpD8qDLT3jLw","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-11.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"i63WTBeMTnSDnxeSuJpFZf","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-9.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"xiSxNNSCHQvhBkz8weBtDU","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-7.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"1urqV2akP9gK1CshpjMiad","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-5.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"iBL1h5VnnSJTEgMS6joQZh","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-3.201177116757094,"cy":-12.468380206012615,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"rr534i2kNra6AbjGze6tbb","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-17.839350032255844,"cy":12.586893239928504,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"gbD24xDaa2k33ZoxvEb6oz","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-15.787787005334005,"cy":12.526983753449453,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"uBAQNvAScFhk39Y9iwCNjY","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-13.758974118534871,"cy":12.689520734967552,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"kPa2FJR2pvHaWxWxA6FLVw","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-11.91848248954889,"cy":12.495637874367116,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"qCbupam4PMgJ8bX3HzPiMM","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-9.771115833391356,"cy":12.37809450353804,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"uMoz3GQoaHbHMecPfBqzkq","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-7.782512420623269,"cy":12.558430909387932,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"uKXc9jut6dFoRru4RQMPUM","selected":false,"locked":false},{"type":"Flower","name":"Hydrangea","cx":-5.490189984387705,"cy":12.433086575302662,"cz":0.10000000149011613,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"iWmJ1E8vNxV24C2rg3YseQ","selected":false,"locked":false,"flip":true},{"type":"Flower","name":"Hydrangea","cx":-2.9411297348927254,"cy":12.354975599770267,"cz":0.10000000149014454,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"gTnMje1b6tBrp8YWHbFCqb","selected":false,"locked":false},{"type":"Tree","name":"Magnolia","cx":23.96071696630824,"cy":-44.82446487452612,"cz":0,"lx":7.42077263012308,"lz":11.136257929861511,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"1WJdNkrobPPSWfLEoaVoK7","selected":false,"locked":false,"flip":true},{"type":"Tree","name":"Magnolia","cx":33.556040711677696,"cy":-28.810119661301552,"cz":0,"lx":7.42077263012308,"lz":11.136257929861511,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9PY4aB8JZi8u5zBp4N8KWJ","selected":false,"locked":false},{"type":"Tree","name":"Magnolia","cx":-6.440436625289015,"cy":-3.053996336525085,"cz":0,"lx":7.42077263012308,"lz":11.136257929861511,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"4GFXCjc87cvCMmXmHyPFgU","selected":false,"locked":false},{"type":"Tree","name":"Magnolia","cx":-11.363079989838765,"cy":-10.70167442074012,"cz":0,"lx":7.42077263012308,"lz":11.136257929861511,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"mnYhfWGZdarqEGdoNy3nZY","selected":false,"locked":false,"flip":true},{"type":"Human","name":"Jaye","cx":-9.814032718831394,"cy":-16.689844349152544,"cz":0.10000000149011702,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"2reV16jkVqXG2TtRUqYKXY","selected":false,"locked":false,"ly":0.55},{"type":"Window","cx":-0.3931201493034107,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"w43ATGzZw2efL2uLDpm4P8","parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2859055631297533,"cy":0.1,"cz":0.32499999999999996,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"iZNLiBj11xETGpzE6fwM9U","parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.17869097695609581,"cy":0.1,"cz":0.32500000000000007,"lx":0.02382546359414602,"ly":0.3,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"9AjuE6mwgTZmX4VvbqAs3y","parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.08338912257951141,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"fJi9i8gEPxfpsgBYXywEnj","parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.07147639078243827,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"925Dk6Ft7JiUDRySfQMrYy","parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.17869097695609581,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"a4xwf7BynvydJnSiBM877Z","parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2859055631297533,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"ozvNDrL6sKDfgo668mHjk9","parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3931201493034107,"cy":0.1,"cz":0.3250000000000002,"lx":0.02382546359414619,"ly":0.3,"lz":0.24999999999999964,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"q6g4rybSU63f4mHggAAJRU","parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.28590556312975324,"cy":0.1,"cz":0.32500000000000007,"lx":0.023825463594146105,"ly":0.3,"lz":0.25000000000000017,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"2rTqwrtxBDgy6QaZefzNsm","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3931201493034107,"cy":0.1,"cz":0.325,"lx":0.023825463594146105,"ly":0.3,"lz":0.25,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"puEFSm14QZKVxz67Z67N16","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"bLab7Y2bZ3ran5xf7gqkpy","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3931201493034107,"cy":0.1,"cz":0.325,"lx":0.023825463594146105,"ly":0.3,"lz":0.25,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"6BiRTS7hCwUwcWSrYNnhUQ","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.28590556312975324,"cy":0.1,"cz":0.325,"lx":0.023825463594146147,"ly":0.3,"lz":0.25,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"eaUtdoPPg5CEenHZ1cZ7yL","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"7unzgHw9BGUs7eL9a5oKXh","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-3.510814778537278e-17,"cy":0.1,"cz":0.125,"lx":0.23716956192580982,"ly":0.3,"lz":1.05,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iLwQ5UBgBL3sonqBcqFoC5","foundationId":"3JxHzzEsV9Da6tuGXPViKy","id":"jbGnjsCChKRb1kQuYrUT5d","opacity":0.9,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Human","name":"Jocelyn","cx":-19.644729072809923,"cy":-15.043092228016992,"cz":0.10000000149011702,"lx":0.4,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"mDGKhZ6QHKAjKHhMgj8e9r","selected":false,"locked":false,"ly":0.4},{"type":"Human","name":"Jedi","cx":-21.40281107675301,"cy":-11.905580437823337,"cz":0.10000000149011613,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"kKfw47d3CRnoAajE5xamBN","selected":false,"ly":0.56,"locked":false},{"type":"Human","name":"Joey","cx":-10.626252329426645,"cy":-15.36971947531225,"cz":0.10000000149011525,"lx":0.462,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"w9rWjW5nMD7ysqTc51hQsW","selected":false,"ly":0.462,"locked":false},{"type":"Tree","name":"Linden","cx":-28.5283374786377,"cy":2.5670594706748773,"cz":0.09215714161556932,"lx":12.56599065387215,"lz":17.875438659167433,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"rmtVJVWrnHvQEaqLr1b9Tf","id":"8QYb3yiDqtDAebwAsHj1PL","selected":false,"locked":false},{"type":"Tree","name":"Linden","flip":true,"cx":-1.0744344498561738,"cy":-55.986059359035295,"cz":0,"lx":7.368180679718989,"lz":10.847055184453376,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mxWw8g34JBPawafnUyy3eX","selected":false,"locked":false},{"type":"Tree","name":"Linden","flip":false,"cx":-8.805777739086423,"cy":-50.96204115065417,"cz":0,"lx":9.893561641812246,"lz":10.847055184453376,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"hfHvh9t2Cet9WXvsjAPh7t","selected":false,"locked":false},{"type":"Window","cx":-1.375205378309486e-16,"cy":0.1,"cz":0.3652487893589756,"lx":0.353907110246429,"ly":0.2,"lz":0.08765970944615396,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":0.8,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73d8ff","tint":"#009ce0","opacity":0.9,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"2Ly2StWGBYNwBSYafFGNuR","windowType":"Default","archHeight":1},{"type":"Window","cx":-3.2517565688624697e-16,"cy":0.1,"cz":0.36524878935897553,"lx":0.36611524179571514,"ly":0.2,"lz":0.08765970944615402,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":0.8,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73d8ff","tint":"#009ce0","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"v2e9bxX15mdBzVMafhi23N","windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3652487893589755,"lx":0.35390711024642874,"ly":0.2,"lz":0.08765970944615412,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":0.8,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73d8ff","tint":"#009ce0","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"nRNf4jj3t7m3SLG7DzYeL9","windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3652487893589755,"lx":0.36611524179571453,"ly":0.2,"lz":0.08765970944615412,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":0.8,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73d8ff","tint":"#009ce0","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"rE6cHpj3a1a3s58XNqPkDx","windowType":"Default","archHeight":1}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[21.8332121686219,1.6957671677596553,0.0000071623250231361926],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[21.8332121686219,1.6956171610724768,150],"theme":"Lake","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[31.117746115680333,-61.74530628577921,6.635303925622853],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":11.97473878476758,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#696635","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[8.743444485308892,-20.90776182518235,5.656639637187283],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},450:function(e){e.exports=JSON.parse('{"docid":"rb7ptdm5a1RqrxS7efVQBm","time":"05/10/2023 10:24 am","timestamp":1683728645588,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":2,"date":"4/22/2022, 4:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":22.123368787949577,"solarUpdraftTower":{},"parentId":"Ground","cx":31.92543795669036,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":2.1656113002014568,"type":"Foundation","solarPowerTower":{},"lx":21.251959060399457,"lz":0.5,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.25,"textureType":"No Foundation Texture","enableGroupMaster":false,"color":"#999999","locked":false},{"type":"Human","name":"Jack","cx":-2.477311032723648,"cy":-35.3224465130531,"cz":0.300000011920929,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","id":"bxVgnTyTS3rQB9DZjweZGa","selected":false,"ly":0.42,"locked":false},{"type":"Wall","cx":-4.882174640318183,"cy":3.2723372961326387,"cz":0,"lx":2.2370509461013435,"ly":0.1,"lz":61,"relativeAngle":4.301576093475627,"leftPoint":[-4.435486222481405,4.29779752999532,0.5],"rightPoint":[-5.328863058154962,2.2468770622699576,0.5],"leftJoints":["twZXBhJnLkQAfkhcdZPvcE"],"rightJoints":["6BBNNShnXYdN4Fo6vrLZgS"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"pqrUfkTtDCPWZgLQ2ZZY2x","roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-5.328863058154962,"cy":0.9968770622699568,"cz":0,"lx":2.5,"ly":0.1,"lz":61,"relativeAngle":4.71238898038469,"leftPoint":[-5.328863058154962,2.2468770622699568,0.5],"rightPoint":[-5.328863058154962,-0.25312293773004324,0.5],"leftJoints":["pqrUfkTtDCPWZgLQ2ZZY2x"],"rightJoints":[],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"6BBNNShnXYdN4Fo6vrLZgS","roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-3.685486222481405,"cy":5.04779752999532,"cz":0,"lx":2.1213203435596424,"ly":0.1,"lz":61,"leftJoints":["o7owRXdGmtoUmGe7aMBfwD"],"rightJoints":["pqrUfkTtDCPWZgLQ2ZZY2x"],"leftPoint":[-2.935486222481405,5.79779752999532,0.5],"rightPoint":[-4.435486222481405,4.29779752999532,0.5],"relativeAngle":3.9269908169872414,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"twZXBhJnLkQAfkhcdZPvcE","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-1.935486222481405,"cy":6.29779752999532,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["7oCL7hfQ9Q5pKtbUKfbhxC"],"rightJoints":["twZXBhJnLkQAfkhcdZPvcE"],"leftPoint":[-0.9354862224814049,6.79779752999532,0.5],"rightPoint":[-2.935486222481405,5.79779752999532,0.5],"relativeAngle":3.6052402625905993,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"o7owRXdGmtoUmGe7aMBfwD","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":0.31451377751859866,"cy":6.797797529995318,"cz":0,"lx":2.5,"ly":0.1,"lz":61,"leftJoints":["9Qfx6trBssgAGuZJMWpoN4"],"rightJoints":["o7owRXdGmtoUmGe7aMBfwD"],"leftPoint":[1.5645137775185987,6.79779752999532,0.5],"rightPoint":[-0.9354862224814049,6.797797529995316,0.5],"relativeAngle":3.141592653589795,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"7oCL7hfQ9Q5pKtbUKfbhxC","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.5645137775185987,"cy":6.29779752999532,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["nXkkPMC5GnQsGGo6pXGf1J"],"rightJoints":["7oCL7hfQ9Q5pKtbUKfbhxC"],"leftPoint":[3.5645137775185987,5.79779752999532,0.5],"rightPoint":[1.5645137775185987,6.79779752999532,0.5],"relativeAngle":2.677945044588988,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"9Qfx6trBssgAGuZJMWpoN4","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.314513777518599,"cy":5.04779752999532,"cz":0,"lx":2.1213203435596424,"ly":0.1,"lz":61,"leftJoints":["ukLTgjquG74WrHxQMTeCGR"],"rightJoints":["9Qfx6trBssgAGuZJMWpoN4"],"leftPoint":[5.064513777518599,4.29779752999532,0.5],"rightPoint":[3.5645137775185987,5.79779752999532,0.5],"relativeAngle":2.356194490192344,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"nXkkPMC5GnQsGGo6pXGf1J","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.564513777518599,"cy":3.2977975299953197,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["ieCZYgGYnWFZFTUUeDJ4Kc"],"rightJoints":["nXkkPMC5GnQsGGo6pXGf1J"],"leftPoint":[6.064513777518599,2.2977975299953197,0.5],"rightPoint":[5.064513777518599,4.29779752999532,0.5],"relativeAngle":2.0344439357957036,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ukLTgjquG74WrHxQMTeCGR","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":6.064513777518599,"cy":1.0477975299953193,"cz":0,"lx":2.5,"ly":0.1,"lz":61,"leftJoints":["1mFHht66LtQmGXw2uwQpTW"],"rightJoints":["ukLTgjquG74WrHxQMTeCGR"],"leftPoint":[6.064513777518599,-0.20220247000468072,0.5],"rightPoint":[6.064513777518599,2.2977975299953197,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ieCZYgGYnWFZFTUUeDJ4Kc","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-4.882174640318183,"cy":-1.2276627038673618,"cz":0,"lx":2.144069307100406,"ly":0.1,"lz":61,"leftJoints":[],"rightJoints":["ne25yHm9jCD9Vx7iYW9GUg"],"leftPoint":[-5.328863058154958,-0.2531229377300428,0.5],"rightPoint":[-4.435486222481405,-2.2022024700046807,0.5],"relativeAngle":5.142171914901031,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"rnDe8ZUbiedJjvYKnAx9vs","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.564513777518599,"cy":-1.2022024700046807,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["hDTYb7CsL6KjhaG3K3ZaEb"],"rightJoints":["ieCZYgGYnWFZFTUUeDJ4Kc"],"leftPoint":[5.064513777518599,-2.2022024700046807,0.5],"rightPoint":[6.064513777518599,-0.20220247000468072,0.5],"relativeAngle":1.1071487177940904,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"1mFHht66LtQmGXw2uwQpTW","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.314513777518599,"cy":-2.9522024700046807,"cz":0,"lx":2.1213203435596424,"ly":0.1,"lz":61,"leftJoints":["ngivbbtv3RRgTjMZ9HM5iJ"],"rightJoints":["1mFHht66LtQmGXw2uwQpTW"],"leftPoint":[3.5645137775185987,-3.7022024700046807,0.5],"rightPoint":[5.064513777518599,-2.2022024700046807,0.5],"relativeAngle":0.7853981633974483,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"hDTYb7CsL6KjhaG3K3ZaEb","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.5645137775185987,"cy":-4.20220247000468,"cz":0,"lx":2.23606797749979,"ly":0.1,"lz":61,"leftJoints":["2sbTRgNVHvPNpK2pDRUNQN"],"rightJoints":["hDTYb7CsL6KjhaG3K3ZaEb"],"leftPoint":[1.5645137775185987,-4.70220247000468,0.5],"rightPoint":[3.5645137775185987,-3.7022024700046807,0.5],"relativeAngle":0.46364760900080615,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ngivbbtv3RRgTjMZ9HM5iJ","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":0.31451377751859866,"cy":-4.70220247000468,"cz":0,"lx":2.5,"ly":0.1,"lz":61,"leftJoints":["7kjEcCQNbaUjRAbeSyBXZx"],"rightJoints":["ngivbbtv3RRgTjMZ9HM5iJ"],"leftPoint":[-0.9354862224814049,-4.70220247000468,0.5],"rightPoint":[1.5645137775185987,-4.70220247000468,0.5],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"2sbTRgNVHvPNpK2pDRUNQN","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-1.935486222481405,"cy":-4.202202470004682,"cz":0,"lx":2.2360679774997907,"ly":0.1,"lz":61,"leftJoints":["ne25yHm9jCD9Vx7iYW9GUg"],"rightJoints":["2sbTRgNVHvPNpK2pDRUNQN"],"leftPoint":[-2.935486222481405,-3.7022024700046807,0.5],"rightPoint":[-0.9354862224814049,-4.702202470004682,0.5],"relativeAngle":5.819537698178779,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"7kjEcCQNbaUjRAbeSyBXZx","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-3.685486222481405,"cy":-2.9522024700046807,"cz":0,"lx":2.1213203435596424,"ly":0.1,"lz":61,"leftJoints":["rnDe8ZUbiedJjvYKnAx9vs"],"rightJoints":["7kjEcCQNbaUjRAbeSyBXZx"],"leftPoint":[-4.435486222481405,-2.2022024700046807,0.5],"rightPoint":[-2.935486222481405,-3.7022024700046807,0.5],"relativeAngle":5.497787143782138,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ne25yHm9jCD9Vx7iYW9GUg","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"roofId":"6muwd4sKetNydriFdTdYo3","leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":-0.316601796041418,"cy":-12.89173870425908,"cz":2.2408122612280286,"lx":16.92215779250457,"ly":0.1,"lz":60,"leftJoints":["55SwaH9QxLHmcgrnQzAWTs"],"rightJoints":["ho8wYRGhLSJb2djJKqwSe1"],"leftPoint":[8.144477100210871,-12.89173870425908],"rightPoint":[-8.7776806922937,-12.89173870425908],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rCFFBj6A2tyxuTVf5rPe81","parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"j7icsPbRmrKngzuxfnJULB","leftRoofHeight":60,"rightRoofHeight":60,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":59.5,"rightTopPartialHeight":59.5},{"type":"Wall","cx":8.144477100210871,"cy":-21.23052296081884,"cz":2.2301039869226305,"lx":16.677568513119517,"ly":0.1,"lz":60,"leftJoints":["szxkDJ4zvsmCjRAjDwr4oT"],"rightJoints":["rCFFBj6A2tyxuTVf5rPe81"],"leftPoint":[8.144477100210871,-29.569307217378597],"rightPoint":[8.144477100210871,-12.891738704259076],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"55SwaH9QxLHmcgrnQzAWTs","parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"j7icsPbRmrKngzuxfnJULB","leftRoofHeight":60,"rightRoofHeight":60,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":59.5,"rightTopPartialHeight":59.5},{"type":"Wall","cx":-8.777680692293703,"cy":-21.230522960818842,"cz":28.5009781424094,"lx":16.67756851311951,"ly":0.1,"lz":60,"leftJoints":["rCFFBj6A2tyxuTVf5rPe81"],"rightJoints":["szxkDJ4zvsmCjRAjDwr4oT"],"leftPoint":[-8.777680692293707,-12.891738704259083],"rightPoint":[-8.7776806922937,-29.569307217378597],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ho8wYRGhLSJb2djJKqwSe1","parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"j7icsPbRmrKngzuxfnJULB","leftRoofHeight":60,"rightRoofHeight":60,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":59.5,"rightTopPartialHeight":59.5},{"type":"Wall","cx":-0.316601796041418,"cy":-29.569307217378597,"cz":2.268765007024547,"lx":16.92215779250457,"ly":0.1,"lz":60,"leftJoints":["ho8wYRGhLSJb2djJKqwSe1"],"rightJoints":["55SwaH9QxLHmcgrnQzAWTs"],"leftPoint":[-8.7776806922937,-29.569307217378597],"rightPoint":[8.144477100210871,-29.569307217378597],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"szxkDJ4zvsmCjRAjDwr4oT","parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"j7icsPbRmrKngzuxfnJULB","leftRoofHeight":60,"rightRoofHeight":60,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":59.5,"rightTopPartialHeight":59.5},{"type":"Foundation","cx":32.336232202320254,"cy":24.075169100408157,"cz":0.3,"lx":47.66882528133987,"ly":92.1673445682163,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"d5JiHWyULwssBmiBFfBkPJ","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["vHsRxkqZrsLbc2Cw1mShNh"],"rightJoints":["wC1WzjegFNTFT2ZnHmoM1U"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"q4Q62RYECS7ssEQGWwMQaR","parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"7wW1vUuiQtQZyEVQ52AYZr","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":61,"leftJoints":["3apukdsSG9Q7tUtWvyHP14"],"rightJoints":["q4Q62RYECS7ssEQGWwMQaR"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"vHsRxkqZrsLbc2Cw1mShNh","parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"7wW1vUuiQtQZyEVQ52AYZr","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":61,"leftJoints":["q4Q62RYECS7ssEQGWwMQaR"],"rightJoints":["3apukdsSG9Q7tUtWvyHP14"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"wC1WzjegFNTFT2ZnHmoM1U","parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"7wW1vUuiQtQZyEVQ52AYZr","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["wC1WzjegFNTFT2ZnHmoM1U"],"rightJoints":["vHsRxkqZrsLbc2Cw1mShNh"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"3apukdsSG9Q7tUtWvyHP14","parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"7wW1vUuiQtQZyEVQ52AYZr","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Foundation","cx":42.906117156706635,"cy":9.533578534694202,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6Vzmg1uXrJSEjXjuXeqZxb","selected":false,"locked":false},{"type":"Wall","cx":-2.059761729325267,"cy":3.0551015103684858,"cz":2.2408122612280286,"lx":20.586914175189918,"ly":0.1,"lz":40,"leftJoints":["vFwZn47p27JhuJCUwo66PB"],"rightJoints":["jz5YKDY6NpWFeAzmZZgmMG"],"leftPoint":[8.233695358269692,3.0551015103684858,0.5],"rightPoint":[-12.353218816920226,3.0551015103684858,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eQty63hcTNfqGkZ1bn9pou","parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eiNiz47nydELtmQT3Y9tQx","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":39.5,"rightTopPartialHeight":39.5},{"type":"Wall","cx":8.233695358269692,"cy":-7.284137744601432,"cz":2.2301039869226305,"lx":20.678478509939843,"ly":0.1,"lz":40,"leftJoints":["tF3vwD5MeKKihs6KSsJULW"],"rightJoints":["eQty63hcTNfqGkZ1bn9pou"],"leftPoint":[8.233695358269692,-17.623376999571356,0.5],"rightPoint":[8.233695358269692,3.0551015103684858,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"vFwZn47p27JhuJCUwo66PB","parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eiNiz47nydELtmQT3Y9tQx","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":39.5,"rightTopPartialHeight":39.5},{"type":"Wall","cx":-12.353218816920233,"cy":-7.2841377446014395,"cz":2.228839888904333,"lx":20.678478509939836,"ly":0.1,"lz":40,"leftJoints":["eQty63hcTNfqGkZ1bn9pou"],"rightJoints":["tF3vwD5MeKKihs6KSsJULW"],"leftPoint":[-12.353218816920233,3.0551015103684787,0.5],"rightPoint":[-12.353218816920226,-17.623376999571356,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jz5YKDY6NpWFeAzmZZgmMG","parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eiNiz47nydELtmQT3Y9tQx","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":39.5,"rightTopPartialHeight":39.5},{"type":"Wall","cx":-2.059761729325267,"cy":-17.623376999571356,"cz":1.780425728663789,"lx":20.586914175189918,"ly":0.1,"lz":40,"leftJoints":["jz5YKDY6NpWFeAzmZZgmMG"],"rightJoints":["vFwZn47p27JhuJCUwo66PB"],"leftPoint":[-12.353218816920226,-17.623376999571356,0.5],"rightPoint":[8.233695358269692,-17.623376999571356,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"tF3vwD5MeKKihs6KSsJULW","parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eiNiz47nydELtmQT3Y9tQx","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":39.5,"rightTopPartialHeight":39.5},{"type":"Foundation","cx":34.184931916240686,"cy":9.996162357092924,"cz":0.25,"lx":28.142586741754783,"ly":39.057935888273825,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fD1unP99uJ2AUvKzSqaqv1","selected":false,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["ho8wYRGhLSJb2djJKqwSe1","szxkDJ4zvsmCjRAjDwr4oT","55SwaH9QxLHmcgrnQzAWTs","rCFFBj6A2tyxuTVf5rPe81"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"j7icsPbRmrKngzuxfnJULB","locked":false,"sideColor":"#8f6767","rise":0,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["tF3vwD5MeKKihs6KSsJULW","vFwZn47p27JhuJCUwo66PB","eQty63hcTNfqGkZ1bn9pou","jz5YKDY6NpWFeAzmZZgmMG"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fD1unP99uJ2AUvKzSqaqv1","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"eiNiz47nydELtmQT3Y9tQx","locked":false,"sideColor":"#8f6767","rise":0,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["rnDe8ZUbiedJjvYKnAx9vs","ne25yHm9jCD9Vx7iYW9GUg","7kjEcCQNbaUjRAbeSyBXZx","2sbTRgNVHvPNpK2pDRUNQN","ngivbbtv3RRgTjMZ9HM5iJ","hDTYb7CsL6KjhaG3K3ZaEb","1mFHht66LtQmGXw2uwQpTW","ieCZYgGYnWFZFTUUeDJ4Kc","ukLTgjquG74WrHxQMTeCGR","nXkkPMC5GnQsGGo6pXGf1J","9Qfx6trBssgAGuZJMWpoN4","7oCL7hfQ9Q5pKtbUKfbhxC","o7owRXdGmtoUmGe7aMBfwD","twZXBhJnLkQAfkhcdZPvcE","pqrUfkTtDCPWZgLQ2ZZY2x","6BBNNShnXYdN4Fo6vrLZgS"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"6muwd4sKetNydriFdTdYo3","locked":false,"sideColor":"#8f6767","rise":40.65606181416068,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["vHsRxkqZrsLbc2Cw1mShNh","q4Q62RYECS7ssEQGWwMQaR","wC1WzjegFNTFT2ZnHmoM1U","3apukdsSG9Q7tUtWvyHP14"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6Vzmg1uXrJSEjXjuXeqZxb","foundationId":"6Vzmg1uXrJSEjXjuXeqZxb","id":"7wW1vUuiQtQZyEVQ52AYZr","locked":false,"sideColor":"#8f6767","rise":7.2788709521325785,"ceiling":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["b5Ed9Q8H2ZuAnTPt364rFi"],"rightJoints":["iPw21WkbFfNGs2GducHHkL"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"ogWsiwSVu2siW9Ju34ZuiD","parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"qwYLFbE4ymUU5tBty522Jg","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":61,"leftJoints":["we96ZZsqRukzrDQLzGsXgd"],"rightJoints":["ogWsiwSVu2siW9Ju34ZuiD"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"b5Ed9Q8H2ZuAnTPt364rFi","parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"qwYLFbE4ymUU5tBty522Jg","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":61,"leftJoints":["ogWsiwSVu2siW9Ju34ZuiD"],"rightJoints":["we96ZZsqRukzrDQLzGsXgd"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"iPw21WkbFfNGs2GducHHkL","parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"qwYLFbE4ymUU5tBty522Jg","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["iPw21WkbFfNGs2GducHHkL"],"rightJoints":["b5Ed9Q8H2ZuAnTPt364rFi"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"we96ZZsqRukzrDQLzGsXgd","parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"qwYLFbE4ymUU5tBty522Jg","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"id":"qwYLFbE4ymUU5tBty522Jg","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"kGDsncg3szoccDkShD216f","foundationId":"kGDsncg3szoccDkShD216f","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["b5Ed9Q8H2ZuAnTPt364rFi","ogWsiwSVu2siW9Ju34ZuiD","iPw21WkbFfNGs2GducHHkL","we96ZZsqRukzrDQLzGsXgd"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":7.2788709521325785,"ceiling":false},{"type":"Foundation","cx":42.92006579798169,"cy":-3.82074241486986,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"kGDsncg3szoccDkShD216f","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["pGdyGz8Q2yqRKAUSe2WBaZ"],"rightJoints":["gqtNTDTyYXafiDYDAD7TP5"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"13XtQDNCzy1wcfpbyh4hjG","parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"unGGRxk8aAPx1RGgoMUHuG","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":61,"leftJoints":["appL8aespWEHwPfTvg3Tnj"],"rightJoints":["13XtQDNCzy1wcfpbyh4hjG"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pGdyGz8Q2yqRKAUSe2WBaZ","parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"unGGRxk8aAPx1RGgoMUHuG","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":61,"leftJoints":["13XtQDNCzy1wcfpbyh4hjG"],"rightJoints":["appL8aespWEHwPfTvg3Tnj"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"gqtNTDTyYXafiDYDAD7TP5","parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"unGGRxk8aAPx1RGgoMUHuG","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["gqtNTDTyYXafiDYDAD7TP5"],"rightJoints":["pGdyGz8Q2yqRKAUSe2WBaZ"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"appL8aespWEHwPfTvg3Tnj","parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"unGGRxk8aAPx1RGgoMUHuG","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"id":"unGGRxk8aAPx1RGgoMUHuG","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"wVk1Prn3hdhvpUZ9PYFEqC","foundationId":"wVk1Prn3hdhvpUZ9PYFEqC","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["pGdyGz8Q2yqRKAUSe2WBaZ","13XtQDNCzy1wcfpbyh4hjG","gqtNTDTyYXafiDYDAD7TP5","appL8aespWEHwPfTvg3Tnj"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":7.2788709521325785,"ceiling":false},{"type":"Foundation","cx":21.16852585877021,"cy":-3.78771116486994,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"wVk1Prn3hdhvpUZ9PYFEqC","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["fBMuUvUm2XHqZj1rfF2pKe"],"rightJoints":["fFbhZTcnWojs6r2gfNC8Ac"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iqStzfwWhLGQQWnV7zYbVJ","parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"64chsWYaQ1WXbJzrruvsSA","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":61,"leftJoints":["fSWzmQwwSCpa4XTiCWadFJ"],"rightJoints":["iqStzfwWhLGQQWnV7zYbVJ"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fBMuUvUm2XHqZj1rfF2pKe","parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"64chsWYaQ1WXbJzrruvsSA","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":61,"leftJoints":["iqStzfwWhLGQQWnV7zYbVJ"],"rightJoints":["fSWzmQwwSCpa4XTiCWadFJ"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fFbhZTcnWojs6r2gfNC8Ac","parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"64chsWYaQ1WXbJzrruvsSA","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":61,"leftJoints":["fFbhZTcnWojs6r2gfNC8Ac"],"rightJoints":["fBMuUvUm2XHqZj1rfF2pKe"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fSWzmQwwSCpa4XTiCWadFJ","parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"64chsWYaQ1WXbJzrruvsSA","selected":false,"leftRoofHeight":61,"rightRoofHeight":61,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":60.5,"rightTopPartialHeight":60.5},{"id":"64chsWYaQ1WXbJzrruvsSA","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"sTdmJHCeaF7fiC4wxraQvH","foundationId":"sTdmJHCeaF7fiC4wxraQvH","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["fBMuUvUm2XHqZj1rfF2pKe","iqStzfwWhLGQQWnV7zYbVJ","fFbhZTcnWojs6r2gfNC8Ac","fSWzmQwwSCpa4XTiCWadFJ"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":7.2788709521325785,"ceiling":false},{"type":"Foundation","cx":21.217344626106712,"cy":9.487929780449239,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"sTdmJHCeaF7fiC4wxraQvH","selected":false,"locked":false},{"type":"Foundation","cx":46.44079504193018,"cy":-6.9607153899841805,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nBfQ1VbpB9H4ysCzMtCuPy","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["n8WrLFfhmR5MpuvGmKysZG"],"rightJoints":["dbVfVNYCWAroMTmBEqYeR4"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"wq86d5bWa3b2DNCBna4CeP","parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"3cC18p4o27We9TRzUXcjvJ","leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":41,"leftJoints":["jKVT2MfeRaz2it59upaJsG"],"rightJoints":["wq86d5bWa3b2DNCBna4CeP"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"n8WrLFfhmR5MpuvGmKysZG","parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"3cC18p4o27We9TRzUXcjvJ","leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":41,"leftJoints":["wq86d5bWa3b2DNCBna4CeP"],"rightJoints":["jKVT2MfeRaz2it59upaJsG"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"dbVfVNYCWAroMTmBEqYeR4","parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"3cC18p4o27We9TRzUXcjvJ","leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["dbVfVNYCWAroMTmBEqYeR4"],"rightJoints":["n8WrLFfhmR5MpuvGmKysZG"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"jKVT2MfeRaz2it59upaJsG","parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"selected":false,"roofId":"3cC18p4o27We9TRzUXcjvJ","leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["jKVT2MfeRaz2it59upaJsG","n8WrLFfhmR5MpuvGmKysZG","wq86d5bWa3b2DNCBna4CeP","dbVfVNYCWAroMTmBEqYeR4"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nBfQ1VbpB9H4ysCzMtCuPy","foundationId":"nBfQ1VbpB9H4ysCzMtCuPy","id":"3cC18p4o27We9TRzUXcjvJ","locked":false,"sideColor":"#8f6767","rise":9.911111547438225,"ceiling":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["fGunkFZDLaHCN1Y4VqozG5"],"rightJoints":["xgMnQPMYvVygU1qre3rtoQ"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"ic7X4VUc5364fhg7VH2Xt9","parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"iaC7gjXpRF8sDNrzMuoLvf","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":41,"leftJoints":["cVUWnxaNHTTX4XSarmyvut"],"rightJoints":["ic7X4VUc5364fhg7VH2Xt9"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"fGunkFZDLaHCN1Y4VqozG5","parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"iaC7gjXpRF8sDNrzMuoLvf","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":41,"leftJoints":["ic7X4VUc5364fhg7VH2Xt9"],"rightJoints":["cVUWnxaNHTTX4XSarmyvut"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"xgMnQPMYvVygU1qre3rtoQ","parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"iaC7gjXpRF8sDNrzMuoLvf","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["xgMnQPMYvVygU1qre3rtoQ"],"rightJoints":["fGunkFZDLaHCN1Y4VqozG5"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"cVUWnxaNHTTX4XSarmyvut","parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"iaC7gjXpRF8sDNrzMuoLvf","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"id":"iaC7gjXpRF8sDNrzMuoLvf","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"sfGQk2YxLGeUhSygxuNcnp","foundationId":"sfGQk2YxLGeUhSygxuNcnp","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["cVUWnxaNHTTX4XSarmyvut","fGunkFZDLaHCN1Y4VqozG5","ic7X4VUc5364fhg7VH2Xt9","xgMnQPMYvVygU1qre3rtoQ"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":9.911111547438225,"ceiling":false},{"type":"Foundation","cx":46.31802127561469,"cy":12.684398904718867,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"sfGQk2YxLGeUhSygxuNcnp","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["gh1M1f9qhMGoNQ2Sc4Z2Dn"],"rightJoints":["pnLNuXyTY2gSJ1DpTuU4uT"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"5gcHNbuEXkTtST9vsf3C1N","parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"49DYNSJM4mb3Amf9zEcSuy","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":41,"leftJoints":["eHHmL4t3wnDWyiwmvPPcdG"],"rightJoints":["5gcHNbuEXkTtST9vsf3C1N"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"gh1M1f9qhMGoNQ2Sc4Z2Dn","parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"49DYNSJM4mb3Amf9zEcSuy","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":41,"leftJoints":["5gcHNbuEXkTtST9vsf3C1N"],"rightJoints":["eHHmL4t3wnDWyiwmvPPcdG"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pnLNuXyTY2gSJ1DpTuU4uT","parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"49DYNSJM4mb3Amf9zEcSuy","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["pnLNuXyTY2gSJ1DpTuU4uT"],"rightJoints":["gh1M1f9qhMGoNQ2Sc4Z2Dn"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eHHmL4t3wnDWyiwmvPPcdG","parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"49DYNSJM4mb3Amf9zEcSuy","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"id":"49DYNSJM4mb3Amf9zEcSuy","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"j4PeEevBuviMj9ySaHCvmk","foundationId":"j4PeEevBuviMj9ySaHCvmk","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["eHHmL4t3wnDWyiwmvPPcdG","gh1M1f9qhMGoNQ2Sc4Z2Dn","5gcHNbuEXkTtST9vsf3C1N","pnLNuXyTY2gSJ1DpTuU4uT"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":9.911111547438225,"ceiling":false},{"type":"Foundation","cx":17.617416680668534,"cy":-7.081676620216011,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"j4PeEevBuviMj9ySaHCvmk","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["8RHz5EYxWVxY6Jt5vozUe7"],"rightJoints":["2uW5rRCde8ts2eAbydroXA"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qovzxCb6vspTrPrifJg8FE","parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"dU22xraE7fkaQeudtQezPj","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":41,"leftJoints":["iYVes92EX4HBiJvFdVLp4v"],"rightJoints":["qovzxCb6vspTrPrifJg8FE"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8RHz5EYxWVxY6Jt5vozUe7","parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"dU22xraE7fkaQeudtQezPj","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":41,"leftJoints":["qovzxCb6vspTrPrifJg8FE"],"rightJoints":["iYVes92EX4HBiJvFdVLp4v"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2uW5rRCde8ts2eAbydroXA","parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"dU22xraE7fkaQeudtQezPj","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":41,"leftJoints":["2uW5rRCde8ts2eAbydroXA"],"rightJoints":["8RHz5EYxWVxY6Jt5vozUe7"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iYVes92EX4HBiJvFdVLp4v","parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"dU22xraE7fkaQeudtQezPj","selected":false,"leftRoofHeight":41,"rightRoofHeight":41,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40.5,"rightTopPartialHeight":40.5},{"id":"dU22xraE7fkaQeudtQezPj","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6e1LBCH7kdPkaD1nyNXGTx","foundationId":"6e1LBCH7kdPkaD1nyNXGTx","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["iYVes92EX4HBiJvFdVLp4v","8RHz5EYxWVxY6Jt5vozUe7","qovzxCb6vspTrPrifJg8FE","2uW5rRCde8ts2eAbydroXA"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":9.911111547438225,"ceiling":false},{"type":"Foundation","cx":17.73320615435275,"cy":12.716218116632643,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6e1LBCH7kdPkaD1nyNXGTx","selected":false,"locked":false},{"type":"Foundation","cx":31.837120136953352,"cy":34.21863076373691,"cz":0.25,"lx":18.498978574883413,"ly":60.60688660259319,"lz":0.2496942045301915,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"inhpub3MTpu4G1VDDvBtem","selected":false,"locked":false},{"type":"Wall","cx":0.2345130342804871,"cy":27.168552176842663,"cz":2.2408122612280286,"lx":16.254908005168197,"ly":0.1,"lz":19.97553636241532,"leftJoints":["t9LGJeHDCScMaYt1JPTD25"],"rightJoints":["8ygPss7hAjTnN2gdGp6ttV"],"leftPoint":[8.361967036864586,27.168552176842663,0],"rightPoint":[-7.892940968303612,27.168552176842663,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kCsahZfC53mhXpdE7TMKTD","parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"sygn3Sh4dUutUeoxP6LrDr","selected":false,"leftRoofHeight":19.97553636241532,"rightRoofHeight":19.97553636241532,"centerRoofHeight":[0,34.46430883284354],"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":19.47553636241532,"rightTopPartialHeight":19.47553636241532},{"type":"Wall","cx":8.361967036864586,"cy":0.8572306983972329,"cz":2.2301039869226305,"lx":52.62264295689086,"ly":0.1,"lz":19.97553636241532,"leftJoints":["rzCwiAsS4K7UKzev4QiQCA"],"rightJoints":["kCsahZfC53mhXpdE7TMKTD"],"leftPoint":[8.361967036864586,-25.454090780048197,0],"rightPoint":[8.361967036864586,27.168552176842663,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"t9LGJeHDCScMaYt1JPTD25","parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"sygn3Sh4dUutUeoxP6LrDr","selected":false,"leftRoofHeight":19.97553636241532,"rightRoofHeight":19.97553636241532,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":19.47553636241532,"rightTopPartialHeight":19.47553636241532},{"type":"Wall","cx":-7.8929409683036145,"cy":0.8572306983972151,"cz":2.228839888904333,"lx":52.62264295689083,"ly":0.1,"lz":19.97553636241532,"leftJoints":["kCsahZfC53mhXpdE7TMKTD"],"rightJoints":["rzCwiAsS4K7UKzev4QiQCA"],"leftPoint":[-7.892940968303616,27.168552176842628,0],"rightPoint":[-7.892940968303612,-25.454090780048197,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8ygPss7hAjTnN2gdGp6ttV","parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"sygn3Sh4dUutUeoxP6LrDr","selected":false,"leftRoofHeight":19.97553636241532,"rightRoofHeight":19.97553636241532,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":19.47553636241532,"rightTopPartialHeight":19.47553636241532},{"type":"Wall","cx":0.2345130342804871,"cy":-25.454090780048197,"cz":2.268765007024547,"lx":16.254908005168197,"ly":0.1,"lz":19.97553636241532,"leftJoints":["8ygPss7hAjTnN2gdGp6ttV"],"rightJoints":["t9LGJeHDCScMaYt1JPTD25"],"leftPoint":[-7.892940968303612,-25.454090780048197,0],"rightPoint":[8.361967036864586,-25.454090780048197,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rzCwiAsS4K7UKzev4QiQCA","parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"sygn3Sh4dUutUeoxP6LrDr","selected":false,"leftRoofHeight":19.97553636241532,"rightRoofHeight":19.97553636241532,"centerRoofHeight":[0,34.46430883284354],"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":19.47553636241532,"rightTopPartialHeight":19.47553636241532},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Gable","roofStructure":"Default","wallsId":["t9LGJeHDCScMaYt1JPTD25"],"textureType":"No Roof Texture","color":"#8f6767","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"inhpub3MTpu4G1VDDvBtem","foundationId":"inhpub3MTpu4G1VDDvBtem","id":"sygn3Sh4dUutUeoxP6LrDr","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":false,"sideColor":"#8f6767","rise":14.488772470428223,"ceiling":false},{"type":"Foundation","cx":42.906117156706635,"cy":9.533578534694202,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3sLwhEgNEsXYeDRotu6V2t","selected":false,"locked":false},{"type":"Foundation","cx":42.92006579798169,"cy":-3.82074241486986,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"bJWxUcmXbPhwpSEfhKNUR9","selected":false,"locked":false},{"type":"Foundation","cx":21.16852585877021,"cy":-3.78771116486994,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"d25rEMwrJ6RN3MFRjbRPz1","selected":false,"locked":false},{"type":"Foundation","cx":21.217344626106712,"cy":9.487929780449239,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cErd2SqgLThpK4vJfhjWqd","selected":false,"locked":false},{"type":"Foundation","cx":46.740795041930184,"cy":-3.860715389984191,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vmAPnWwpqkdy6LbCoBx7XJ","selected":false,"locked":false},{"type":"Foundation","cx":46.718021275614696,"cy":9.584398904718878,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"igvTSt7WASqgGBPhrg13mS","selected":false,"locked":false},{"type":"Foundation","cx":17.31741668066853,"cy":-3.7816766202160212,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35UveCxDtSq3bRxo63iNA8","selected":false,"locked":false},{"type":"Foundation","cx":17.333206154352744,"cy":9.516218116632654,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hcQws7c356C61b1Zdukfsh","selected":false,"locked":false},{"type":"Wall","cx":0.08759481901403955,"cy":0.48701542341002635,"cz":0,"lx":0.7619228017884919,"ly":0.1,"lz":30.522600729435336,"leftJoints":["xjtDHvujcFtzK6uxUtDUQW"],"rightJoints":["pvCLq35sk3nh5kUAUegEwu"],"leftPoint":[0.23742845459659656,0.8372745712126496,0],"rightPoint":[-0.06223881656851746,0.13675627560740305,0],"relativeAngle":-1.9750187634646525,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"eZcF1TXGmmHdWSo1nGEuPP","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-0.06223881656851746,"cy":-0.29019732073449356,"cz":0,"lx":0.8539071926837931,"ly":0.1,"lz":30.522600729435336,"leftJoints":["eZcF1TXGmmHdWSo1nGEuPP"],"rightJoints":[],"leftPoint":[-0.06223881656851746,0.13675627560740305,0],"rightPoint":[-0.06223881656851746,-0.7171509170763901,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"pvCLq35sk3nh5kUAUegEwu","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":0.48900253218546175,"cy":1.0934467290177876,"cz":0,"lx":0.7180910553661809,"ly":0.1,"lz":30.522600729435336,"leftJoints":["1n1zoL6MhaLiDGbiwa1f2P"],"rightJoints":["eZcF1TXGmmHdWSo1nGEuPP"],"leftPoint":[0.7405766097743269,1.3496188868229255,0],"rightPoint":[0.23742845459659656,0.8372745712126496,0],"relativeAngle":-2.3471388749896596,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"xjtDHvujcFtzK6uxUtDUQW","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":1.0760087132261462,"cy":1.520400325359684,"cz":0,"lx":0.7528107219608302,"ly":0.1,"lz":30.522600729435336,"leftJoints":["mriUigHEL4wunXM4kHrR6L"],"rightJoints":["xjtDHvujcFtzK6uxUtDUQW"],"leftPoint":[1.4114408166779655,1.6911817638964426,0],"rightPoint":[0.7405766097743269,1.3496188868229255,0],"relativeAngle":-2.6706609040195843,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"1n1zoL6MhaLiDGbiwa1f2P","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":1.8307309459927419,"cy":1.6911817638964426,"cz":0,"lx":0.8385802586295528,"ly":0.1,"lz":30.522600729435336,"leftJoints":["swhHhwagxik9xtVxu4wfTo"],"rightJoints":["1n1zoL6MhaLiDGbiwa1f2P"],"leftPoint":[2.2500210753075183,1.6911817638964426,0],"rightPoint":[1.4114408166779655,1.6911817638964426,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"mriUigHEL4wunXM4kHrR6L","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":2.5854531787593378,"cy":1.520400325359684,"cz":0,"lx":0.7528107219608307,"ly":0.1,"lz":30.522600729435336,"leftJoints":["hi3umDHUNXmBT4vcsRpTQy"],"rightJoints":["mriUigHEL4wunXM4kHrR6L"],"leftPoint":[2.9208852822111573,1.3496188868229255,0],"rightPoint":[2.2500210753075183,1.6911817638964426,0],"relativeAngle":2.6706609040195843,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"swhHhwagxik9xtVxu4wfTo","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.172459359800022,"cy":1.0934467290177876,"cz":0,"lx":0.7180910553661805,"ly":0.1,"lz":30.522600729435336,"leftJoints":["dRRWEjS64akBN9tsLF4oVT"],"rightJoints":["swhHhwagxik9xtVxu4wfTo"],"leftPoint":[3.424033437388887,0.8372745712126496,0],"rightPoint":[2.9208852822111573,1.3496188868229255,0],"relativeAngle":2.347138874989659,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"hi3umDHUNXmBT4vcsRpTQy","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.5917494891147967,"cy":0.4957116941391323,"cz":0,"lx":0.7610358020520893,"ly":0.1,"lz":30.522600729435336,"leftJoints":["uQk2JFg84bBpGZQkpPmwje"],"rightJoints":["hi3umDHUNXmBT4vcsRpTQy"],"leftPoint":[3.7594655408407065,0.15414881706561503,0],"rightPoint":[3.424033437388887,0.8372745712126496,0],"relativeAngle":2.027238521722415,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"dRRWEjS64akBN9tsLF4oVT","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.7594655408407065,"cy":-0.2728047792762874,"cz":0,"lx":0.8539071926838048,"ly":0.1,"lz":30.522600729435336,"leftJoints":["muL5NfgYyKhfqV3h7fsQsn"],"rightJoints":["dRRWEjS64akBN9tsLF4oVT"],"leftPoint":[3.7594655408407065,-0.6997583756181898,0],"rightPoint":[3.7594655408407065,0.15414881706561503,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"uQk2JFg84bBpGZQkpPmwje","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":0.08759481901404094,"cy":-1.0500175234208071,"cz":0,"lx":0.7300693007410605,"ly":0.1,"lz":30.522600729435336,"leftJoints":[],"rightJoints":["7EX6pFLmgKqJLtfcWEpofK"],"leftPoint":[-0.06223881656851469,-0.7171509170763901,0],"rightPoint":[0.23742845459659656,-1.3828841297652243,0],"relativeAngle":-1.147833323399613,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"5WHTbyH9BzzN64KTDCgoMv","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.5917494891147967,"cy":-1.041321252691707,"cz":0,"lx":0.7610358020520893,"ly":0.1,"lz":30.522600729435336,"leftJoints":["oikWBJjQhAPNedPGNcE3gc"],"rightJoints":["uQk2JFg84bBpGZQkpPmwje"],"leftPoint":[3.424033437388887,-1.3828841297652243,0],"rightPoint":[3.7594655408407065,-0.6997583756181898,0],"relativeAngle":1.1143541318673784,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"muL5NfgYyKhfqV3h7fsQsn","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":3.172459359800022,"cy":-1.6390562875703623,"cz":0,"lx":0.7180910553661803,"ly":0.1,"lz":30.522600729435336,"leftJoints":["i4ifyJQtiXdLMSDpWxEVF4"],"rightJoints":["muL5NfgYyKhfqV3h7fsQsn"],"leftPoint":[2.9208852822111573,-1.8952284453755002,0],"rightPoint":[3.424033437388887,-1.3828841297652243,0],"relativeAngle":0.7944537786001341,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"oikWBJjQhAPNedPGNcE3gc","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":2.5854531787593378,"cy":-2.0660098839122587,"cz":0,"lx":0.7528107219608308,"ly":0.1,"lz":30.522600729435336,"leftJoints":["wop6FQVjsmsgGpEYiRnuWv"],"rightJoints":["oikWBJjQhAPNedPGNcE3gc"],"leftPoint":[2.2500210753075183,-2.2367913224490175,0],"rightPoint":[2.9208852822111573,-1.8952284453755002,0],"relativeAngle":0.47093174957020895,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"i4ifyJQtiXdLMSDpWxEVF4","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":1.8307309459927419,"cy":-2.2367913224490175,"cz":0,"lx":0.8385802586295528,"ly":0.1,"lz":30.522600729435336,"leftJoints":["xvpmoVyQtt5PQRMqAmpsxP"],"rightJoints":["i4ifyJQtiXdLMSDpWxEVF4"],"leftPoint":[1.4114408166779655,-2.2367913224490175,0],"rightPoint":[2.2500210753075183,-2.2367913224490175,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"wop6FQVjsmsgGpEYiRnuWv","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":1.0760087132261462,"cy":-2.0660098839122587,"cz":0,"lx":0.7528107219608304,"ly":0.1,"lz":30.522600729435336,"leftJoints":["7EX6pFLmgKqJLtfcWEpofK"],"rightJoints":["wop6FQVjsmsgGpEYiRnuWv"],"leftPoint":[0.7405766097743269,-1.8952284453755002,0],"rightPoint":[1.4114408166779655,-2.2367913224490175,0],"relativeAngle":-0.4709317495702092,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"xvpmoVyQtt5PQRMqAmpsxP","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":0.48900253218546175,"cy":-1.6390562875703623,"cz":0,"lx":0.7180910553661808,"ly":0.1,"lz":30.522600729435336,"leftJoints":["5WHTbyH9BzzN64KTDCgoMv"],"rightJoints":["xvpmoVyQtt5PQRMqAmpsxP"],"leftPoint":[0.23742845459659656,-1.3828841297652243,0],"rightPoint":[0.7405766097743269,-1.8952284453755002,0],"relativeAngle":-0.7944537786001334,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"7EX6pFLmgKqJLtfcWEpofK","parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofId":"hYevMRVtvGbUbiRqk1nUc8","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"color":"#cccccc","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"id":"hYevMRVtvGbUbiRqk1nUc8","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nzCkjYnVxyaDzHFwCDNifn","foundationId":"nzCkjYnVxyaDzHFwCDNifn","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["5WHTbyH9BzzN64KTDCgoMv","7EX6pFLmgKqJLtfcWEpofK","xvpmoVyQtt5PQRMqAmpsxP","wop6FQVjsmsgGpEYiRnuWv","i4ifyJQtiXdLMSDpWxEVF4","oikWBJjQhAPNedPGNcE3gc","muL5NfgYyKhfqV3h7fsQsn","uQk2JFg84bBpGZQkpPmwje","dRRWEjS64akBN9tsLF4oVT","hi3umDHUNXmBT4vcsRpTQy","swhHhwagxik9xtVxu4wfTo","mriUigHEL4wunXM4kHrR6L","1n1zoL6MhaLiDGbiwa1f2P","xjtDHvujcFtzK6uxUtDUQW","eZcF1TXGmmHdWSo1nGEuPP","pvCLq35sk3nh5kUAUegEwu"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":20.34309413089949,"ceiling":false},{"type":"Foundation","cx":22.101836585291686,"cy":59.66510601397874,"cz":0.25,"lx":10.346352433552571,"ly":7.249184290263735,"lz":0.25018525188061747,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"nzCkjYnVxyaDzHFwCDNifn","selected":false,"locked":false},{"type":"Wall","cx":0.29316921930580264,"cy":25.564628992279733,"cz":2.2408122612280286,"lx":20.32057068547883,"ly":0.1,"lz":11.54977608077218,"leftJoints":["s1xEbSBtShW5kWkbmjYKyT"],"rightJoints":["kdHDzULPWJfMLCpsjYsWA1"],"leftPoint":[10.453454562045218,25.564628992279733,0],"rightPoint":[-9.867116123433613,25.564628992279733,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"6NAiyB2LDnaumetDroz2SP","parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"43U2Bn5NdVK18XM6yHM246","selected":false,"leftRoofHeight":11.54977608077218,"rightRoofHeight":11.54977608077218,"centerRoofHeight":[0,17.846156119433356],"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.04977608077218,"rightTopPartialHeight":11.04977608077218},{"type":"Wall","cx":10.453454562045218,"cy":0.806623209903595,"cz":2.2301039869226305,"lx":49.516011564752276,"ly":0.1,"lz":11.54977608077218,"leftJoints":["4soX2cVpCLxg8TgMMdUsVJ"],"rightJoints":["6NAiyB2LDnaumetDroz2SP"],"leftPoint":[10.453454562045218,-23.951382572472543,0],"rightPoint":[10.453454562045218,25.564628992279733,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s1xEbSBtShW5kWkbmjYKyT","parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"43U2Bn5NdVK18XM6yHM246","selected":false,"leftRoofHeight":11.54977608077218,"rightRoofHeight":11.54977608077218,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.04977608077218,"rightTopPartialHeight":11.04977608077218},{"type":"Wall","cx":-9.867116123433618,"cy":0.806623209903579,"cz":2.228839888904333,"lx":49.51601156475225,"ly":0.1,"lz":11.54977608077218,"leftJoints":["6NAiyB2LDnaumetDroz2SP"],"rightJoints":["4soX2cVpCLxg8TgMMdUsVJ"],"leftPoint":[-9.867116123433622,25.5646289922797,0],"rightPoint":[-9.867116123433613,-23.951382572472543,0],"relativeAngle":-1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kdHDzULPWJfMLCpsjYsWA1","parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"43U2Bn5NdVK18XM6yHM246","selected":false,"leftRoofHeight":11.54977608077218,"rightRoofHeight":11.54977608077218,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.04977608077218,"rightTopPartialHeight":11.04977608077218},{"type":"Wall","cx":0.29316921930580264,"cy":-23.951382572472543,"cz":2.268765007024547,"lx":20.32057068547883,"ly":0.1,"lz":11.54977608077218,"leftJoints":["kdHDzULPWJfMLCpsjYsWA1"],"rightJoints":["s1xEbSBtShW5kWkbmjYKyT"],"leftPoint":[-9.867116123433613,-23.951382572472543,0],"rightPoint":[10.453454562045218,-23.951382572472543,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4soX2cVpCLxg8TgMMdUsVJ","parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"43U2Bn5NdVK18XM6yHM246","selected":false,"leftRoofHeight":11.54977608077218,"rightRoofHeight":11.54977608077218,"centerRoofHeight":[0,17.846156119433356],"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.04977608077218,"rightTopPartialHeight":11.04977608077218},{"id":"43U2Bn5NdVK18XM6yHM246","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tRJdenhEy35bKxtqwaV7mW","foundationId":"tRJdenhEy35bKxtqwaV7mW","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["s1xEbSBtShW5kWkbmjYKyT"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"locked":false,"sideColor":"#8f6767","rise":6.296380038661177,"ceiling":false},{"type":"Foundation","cx":31.800913861014813,"cy":36.46175047854304,"cz":0.25,"lx":23.12592612769986,"ly":57.028897244406764,"lz":0.14437220100965228,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tRJdenhEy35bKxtqwaV7mW","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["rY4g4se9c9Ac81ycfZ2psF"],"rightJoints":["edLYKiK67rcWj7yEjSg5Gw"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"m2HcdaunRK2mJDqZ6u7zB2","parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"b6WgrEhvmm5vBfQ5hvUoV7","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["hnGSq9jjoBBqypZ4j6i4tD"],"rightJoints":["m2HcdaunRK2mJDqZ6u7zB2"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rY4g4se9c9Ac81ycfZ2psF","parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"b6WgrEhvmm5vBfQ5hvUoV7","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["m2HcdaunRK2mJDqZ6u7zB2"],"rightJoints":["hnGSq9jjoBBqypZ4j6i4tD"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"edLYKiK67rcWj7yEjSg5Gw","parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"b6WgrEhvmm5vBfQ5hvUoV7","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["edLYKiK67rcWj7yEjSg5Gw"],"rightJoints":["rY4g4se9c9Ac81ycfZ2psF"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"hnGSq9jjoBBqypZ4j6i4tD","parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"b6WgrEhvmm5vBfQ5hvUoV7","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"b6WgrEhvmm5vBfQ5hvUoV7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4eW2GX1ScRsXHpNggfMAh6","foundationId":"4eW2GX1ScRsXHpNggfMAh6","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["hnGSq9jjoBBqypZ4j6i4tD","rY4g4se9c9Ac81ycfZ2psF","m2HcdaunRK2mJDqZ6u7zB2","edLYKiK67rcWj7yEjSg5Gw"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.0572589693394,"cy":29.64082269160803,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4eW2GX1ScRsXHpNggfMAh6","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["iDdbvKHdvp7bwG9TRH7Z1s"],"rightJoints":["qCdtrWKEz7G85zz6r7u1bg"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4SRnxg5YyewBKp25hu7pX6","parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"w76LBs2JwDTGkqjmZCF8cs","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["o3YcepgLVkYe1C12rYuUcN"],"rightJoints":["4SRnxg5YyewBKp25hu7pX6"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iDdbvKHdvp7bwG9TRH7Z1s","parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"w76LBs2JwDTGkqjmZCF8cs","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["4SRnxg5YyewBKp25hu7pX6"],"rightJoints":["o3YcepgLVkYe1C12rYuUcN"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qCdtrWKEz7G85zz6r7u1bg","parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"w76LBs2JwDTGkqjmZCF8cs","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["qCdtrWKEz7G85zz6r7u1bg"],"rightJoints":["iDdbvKHdvp7bwG9TRH7Z1s"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"o3YcepgLVkYe1C12rYuUcN","parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"w76LBs2JwDTGkqjmZCF8cs","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"w76LBs2JwDTGkqjmZCF8cs","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4grymoAeE1wyKWf6d9SvGL","foundationId":"4grymoAeE1wyKWf6d9SvGL","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["o3YcepgLVkYe1C12rYuUcN","iDdbvKHdvp7bwG9TRH7Z1s","4SRnxg5YyewBKp25hu7pX6","qCdtrWKEz7G85zz6r7u1bg"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.12041686407624,"cy":21.776349007392366,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4grymoAeE1wyKWf6d9SvGL","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["pqDxrgVJyRAZkmJDZW8KxP"],"rightJoints":["5YtUmRWQdNuxWqery1ymqA"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wgaVoeaxZnDaQiMJmkWwKa","parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"ccBdYpfsEntnyimCgAGbFH","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["osM7biMJmfhnN53neDAWtn"],"rightJoints":["wgaVoeaxZnDaQiMJmkWwKa"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pqDxrgVJyRAZkmJDZW8KxP","parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"ccBdYpfsEntnyimCgAGbFH","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["wgaVoeaxZnDaQiMJmkWwKa"],"rightJoints":["osM7biMJmfhnN53neDAWtn"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"5YtUmRWQdNuxWqery1ymqA","parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"ccBdYpfsEntnyimCgAGbFH","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["5YtUmRWQdNuxWqery1ymqA"],"rightJoints":["pqDxrgVJyRAZkmJDZW8KxP"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"osM7biMJmfhnN53neDAWtn","parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"ccBdYpfsEntnyimCgAGbFH","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"ccBdYpfsEntnyimCgAGbFH","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"qEkR58t9MVxKb9UtTzLoRJ","foundationId":"qEkR58t9MVxKb9UtTzLoRJ","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["osM7biMJmfhnN53neDAWtn","pqDxrgVJyRAZkmJDZW8KxP","wgaVoeaxZnDaQiMJmkWwKa","5YtUmRWQdNuxWqery1ymqA"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.12041686407624,"cy":38.27619910075263,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qEkR58t9MVxKb9UtTzLoRJ","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["aWFGP4t67ffRZBsCFNikXA"],"rightJoints":["2uYJDU198peC8Tg5ojQxP4"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iWxYLc7ffDzpRdJiYsnbXJ","parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eQ7btevxK7r8DzoyTEdTxn","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["1Q3HJwHJv2PVY4SzR42Cjo"],"rightJoints":["iWxYLc7ffDzpRdJiYsnbXJ"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"aWFGP4t67ffRZBsCFNikXA","parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eQ7btevxK7r8DzoyTEdTxn","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["iWxYLc7ffDzpRdJiYsnbXJ"],"rightJoints":["1Q3HJwHJv2PVY4SzR42Cjo"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2uYJDU198peC8Tg5ojQxP4","parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eQ7btevxK7r8DzoyTEdTxn","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["2uYJDU198peC8Tg5ojQxP4"],"rightJoints":["aWFGP4t67ffRZBsCFNikXA"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"1Q3HJwHJv2PVY4SzR42Cjo","parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"eQ7btevxK7r8DzoyTEdTxn","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"eQ7btevxK7r8DzoyTEdTxn","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"61X5NKPMEEPTLmE48XtBWW","foundationId":"61X5NKPMEEPTLmE48XtBWW","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["1Q3HJwHJv2PVY4SzR42Cjo","aWFGP4t67ffRZBsCFNikXA","iWxYLc7ffDzpRdJiYsnbXJ","2uYJDU198peC8Tg5ojQxP4"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.12041686407624,"cy":46.27619910075262,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"61X5NKPMEEPTLmE48XtBWW","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["fY4i2vP6PHczLiFYJKL6Wv"],"rightJoints":["idjrGY3KVjR98yX9Yu1Ra6"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eMNaM3G63snsMKbM8u6oYY","parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"tuJvTy5gsauq5Hd2q2TrvG","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["amBCThLtBnL1J1PMrwDbZv"],"rightJoints":["eMNaM3G63snsMKbM8u6oYY"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fY4i2vP6PHczLiFYJKL6Wv","parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"tuJvTy5gsauq5Hd2q2TrvG","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["eMNaM3G63snsMKbM8u6oYY"],"rightJoints":["amBCThLtBnL1J1PMrwDbZv"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"idjrGY3KVjR98yX9Yu1Ra6","parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"tuJvTy5gsauq5Hd2q2TrvG","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["idjrGY3KVjR98yX9Yu1Ra6"],"rightJoints":["fY4i2vP6PHczLiFYJKL6Wv"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"amBCThLtBnL1J1PMrwDbZv","parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"tuJvTy5gsauq5Hd2q2TrvG","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"tuJvTy5gsauq5Hd2q2TrvG","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"gJWB97wg6zgCYzFdGJY5ps","foundationId":"gJWB97wg6zgCYzFdGJY5ps","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["amBCThLtBnL1J1PMrwDbZv","fY4i2vP6PHczLiFYJKL6Wv","eMNaM3G63snsMKbM8u6oYY","idjrGY3KVjR98yX9Yu1Ra6"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.070416864076236,"cy":54.22634900740702,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gJWB97wg6zgCYzFdGJY5ps","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["6pg1zB89qcq9dmq7s1ptPG"],"rightJoints":["q4CuysQYWEW74wVhnGoz38"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"vbW8e5Fx8RtgYAGG2GpRxh","parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"vKsXGsPSDc5jtGNVG5pT4h","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["27GGc5fv8LG1vuW4Uncogs"],"rightJoints":["vbW8e5Fx8RtgYAGG2GpRxh"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"6pg1zB89qcq9dmq7s1ptPG","parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"vKsXGsPSDc5jtGNVG5pT4h","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["vbW8e5Fx8RtgYAGG2GpRxh"],"rightJoints":["27GGc5fv8LG1vuW4Uncogs"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"q4CuysQYWEW74wVhnGoz38","parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"vKsXGsPSDc5jtGNVG5pT4h","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["q4CuysQYWEW74wVhnGoz38"],"rightJoints":["6pg1zB89qcq9dmq7s1ptPG"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"27GGc5fv8LG1vuW4Uncogs","parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"vKsXGsPSDc5jtGNVG5pT4h","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"vKsXGsPSDc5jtGNVG5pT4h","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"amG9BsG4REBbTJiqZddZRf","foundationId":"amG9BsG4REBbTJiqZddZRf","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["27GGc5fv8LG1vuW4Uncogs","6pg1zB89qcq9dmq7s1ptPG","vbW8e5Fx8RtgYAGG2GpRxh","q4CuysQYWEW74wVhnGoz38"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":48.02516540226579,"cy":13.71724930866217,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"amG9BsG4REBbTJiqZddZRf","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["pNFepfvePvMvRyTFP4sbzs"],"rightJoints":["kf6UY9oxBvAS9oizmQi2UF"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"49srqvHCqp7LPpHj4YFmnX","parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"585fnALdAC34mNZDfmGzpR","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["qjgvxRHbZgjaPsgRgW2rKY"],"rightJoints":["49srqvHCqp7LPpHj4YFmnX"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pNFepfvePvMvRyTFP4sbzs","parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"585fnALdAC34mNZDfmGzpR","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["49srqvHCqp7LPpHj4YFmnX"],"rightJoints":["qjgvxRHbZgjaPsgRgW2rKY"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kf6UY9oxBvAS9oizmQi2UF","parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"585fnALdAC34mNZDfmGzpR","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["kf6UY9oxBvAS9oizmQi2UF"],"rightJoints":["pNFepfvePvMvRyTFP4sbzs"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qjgvxRHbZgjaPsgRgW2rKY","parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"585fnALdAC34mNZDfmGzpR","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"585fnALdAC34mNZDfmGzpR","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"ijj9XtQP41yWeKSFtsH9KG","foundationId":"ijj9XtQP41yWeKSFtsH9KG","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["qjgvxRHbZgjaPsgRgW2rKY","pNFepfvePvMvRyTFP4sbzs","49srqvHCqp7LPpHj4YFmnX","kf6UY9oxBvAS9oizmQi2UF"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.108670143366425,"cy":21.75623548237505,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ijj9XtQP41yWeKSFtsH9KG","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["4FTkcMtCn8GmJne1UmBSnm"],"rightJoints":["1fYMNpakzjWFH4TGNYecnG"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"1P5iFtakfLrTXAgXy2xEwu","parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"5jHjwRti8g6gjQYwYNaqMu","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["8SkMwYmnPtJVtGW2vvZau2"],"rightJoints":["1P5iFtakfLrTXAgXy2xEwu"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4FTkcMtCn8GmJne1UmBSnm","parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"5jHjwRti8g6gjQYwYNaqMu","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["1P5iFtakfLrTXAgXy2xEwu"],"rightJoints":["8SkMwYmnPtJVtGW2vvZau2"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"1fYMNpakzjWFH4TGNYecnG","parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"5jHjwRti8g6gjQYwYNaqMu","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["1fYMNpakzjWFH4TGNYecnG"],"rightJoints":["4FTkcMtCn8GmJne1UmBSnm"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8SkMwYmnPtJVtGW2vvZau2","parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"5jHjwRti8g6gjQYwYNaqMu","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"5jHjwRti8g6gjQYwYNaqMu","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tsSkKMSbzvsCzXJnVjuqkh","foundationId":"tsSkKMSbzvsCzXJnVjuqkh","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["8SkMwYmnPtJVtGW2vvZau2","4FTkcMtCn8GmJne1UmBSnm","1P5iFtakfLrTXAgXy2xEwu","1fYMNpakzjWFH4TGNYecnG"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.06868414507791,"cy":13.792917787121219,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tsSkKMSbzvsCzXJnVjuqkh","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["eKwrTnqzoru7h1ejKJfQMg"],"rightJoints":["aepE6idhiAJ636esCgz28B"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"sduDhLeTnLnC5gSRR1knQa","parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"gdKEp1z3y4ryc7dvjnUqEa","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["rD8sjfgNgEk8eR9fGvg7qv"],"rightJoints":["sduDhLeTnLnC5gSRR1knQa"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eKwrTnqzoru7h1ejKJfQMg","parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"gdKEp1z3y4ryc7dvjnUqEa","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["sduDhLeTnLnC5gSRR1knQa"],"rightJoints":["rD8sjfgNgEk8eR9fGvg7qv"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"aepE6idhiAJ636esCgz28B","parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"gdKEp1z3y4ryc7dvjnUqEa","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["aepE6idhiAJ636esCgz28B"],"rightJoints":["eKwrTnqzoru7h1ejKJfQMg"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rD8sjfgNgEk8eR9fGvg7qv","parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"gdKEp1z3y4ryc7dvjnUqEa","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"gdKEp1z3y4ryc7dvjnUqEa","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"c5x1qZw1vbVMAajuz84fbo","foundationId":"c5x1qZw1vbVMAajuz84fbo","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["rD8sjfgNgEk8eR9fGvg7qv","eKwrTnqzoru7h1ejKJfQMg","sduDhLeTnLnC5gSRR1knQa","aepE6idhiAJ636esCgz28B"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.029331020077915,"cy":30.2047466933794,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"c5x1qZw1vbVMAajuz84fbo","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["rmuH4rirvchW582N8rYFag"],"rightJoints":["uW9vVgQVERMAHeNEoWkYEh"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"uUKBr4jcQhby6GvNzKqUHH","parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"rTW8jYbcN9iKLUvtZVEcCq","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["wbwhMTBcYQcbgteFUcRUx7"],"rightJoints":["uUKBr4jcQhby6GvNzKqUHH"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rmuH4rirvchW582N8rYFag","parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"rTW8jYbcN9iKLUvtZVEcCq","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["uUKBr4jcQhby6GvNzKqUHH"],"rightJoints":["wbwhMTBcYQcbgteFUcRUx7"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"uW9vVgQVERMAHeNEoWkYEh","parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"rTW8jYbcN9iKLUvtZVEcCq","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["uW9vVgQVERMAHeNEoWkYEh"],"rightJoints":["rmuH4rirvchW582N8rYFag"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wbwhMTBcYQcbgteFUcRUx7","parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"rTW8jYbcN9iKLUvtZVEcCq","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"rTW8jYbcN9iKLUvtZVEcCq","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8naBHyvVijZuabFdbTKFpX","foundationId":"8naBHyvVijZuabFdbTKFpX","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["wbwhMTBcYQcbgteFUcRUx7","rmuH4rirvchW582N8rYFag","uUKBr4jcQhby6GvNzKqUHH","uW9vVgQVERMAHeNEoWkYEh"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.063453741288843,"cy":38.34103797920378,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"8naBHyvVijZuabFdbTKFpX","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["ash2NaiDiFh6y8HJuTzbUe"],"rightJoints":["rQ2xEkb62W6Hz14LruJt4U"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ui6xC8viC2GKhF7W4v6W1c","parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"aSwgfRaBWT4x8pjZRpNseg","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["4a5mwkpfWp9Ti3rrftjFDZ"],"rightJoints":["ui6xC8viC2GKhF7W4v6W1c"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ash2NaiDiFh6y8HJuTzbUe","parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"aSwgfRaBWT4x8pjZRpNseg","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["ui6xC8viC2GKhF7W4v6W1c"],"rightJoints":["4a5mwkpfWp9Ti3rrftjFDZ"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rQ2xEkb62W6Hz14LruJt4U","parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"aSwgfRaBWT4x8pjZRpNseg","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["rQ2xEkb62W6Hz14LruJt4U"],"rightJoints":["ash2NaiDiFh6y8HJuTzbUe"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4a5mwkpfWp9Ti3rrftjFDZ","parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"aSwgfRaBWT4x8pjZRpNseg","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"aSwgfRaBWT4x8pjZRpNseg","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pea8XwQNq3CzMWjVuAMDFt","foundationId":"pea8XwQNq3CzMWjVuAMDFt","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["4a5mwkpfWp9Ti3rrftjFDZ","ash2NaiDiFh6y8HJuTzbUe","ui6xC8viC2GKhF7W4v6W1c","rQ2xEkb62W6Hz14LruJt4U"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.082728428788844,"cy":46.363924541707796,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"pea8XwQNq3CzMWjVuAMDFt","selected":false,"locked":false},{"type":"Wall","cx":4.231115688397861,"cy":1.4333132304343623,"cz":2.2408122612280286,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["9KWwq22ziFFGjGozMGZDJy"],"rightJoints":["axJwDxU9qufHCzbi6cJjRE"],"leftPoint":[5.697379306766306,1.4333132304343623,0.5],"rightPoint":[2.7648520700294164,1.4333132304343623,0.5],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2xmth77a7rM6NqB4LYTVg3","parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"wmVcJCTPwpivZkJBd9PRUz","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":5.697379306766306,"cy":0.014860193091425167,"cz":2.2301039869226305,"lx":2.836906074685875,"ly":0.1,"lz":14,"leftJoints":["47gofCM28sUzgssGChu6rj"],"rightJoints":["2xmth77a7rM6NqB4LYTVg3"],"leftPoint":[5.697379306766306,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,1.4333132304343623,0.5],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"9KWwq22ziFFGjGozMGZDJy","parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"wmVcJCTPwpivZkJBd9PRUz","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":2.7648520700294164,"cy":0.014860193091424279,"cz":2.228839888904333,"lx":2.8369060746858734,"ly":0.1,"lz":14,"leftJoints":["2xmth77a7rM6NqB4LYTVg3"],"rightJoints":["47gofCM28sUzgssGChu6rj"],"leftPoint":[2.7648520700294164,1.4333132304343614,0.5],"rightPoint":[2.7648520700294164,-1.4035928442515129,0.5],"relativeAngle":-1.5707963267948961,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"axJwDxU9qufHCzbi6cJjRE","parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"wmVcJCTPwpivZkJBd9PRUz","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"type":"Wall","cx":4.231115688397861,"cy":-1.4035928442515129,"cz":2.268765007024547,"lx":2.93252723673689,"ly":0.1,"lz":14,"leftJoints":["axJwDxU9qufHCzbi6cJjRE"],"rightJoints":["9KWwq22ziFFGjGozMGZDJy"],"leftPoint":[2.7648520700294164,-1.4035928442515129,0.5],"rightPoint":[5.697379306766306,-1.4035928442515129,0.5],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"47gofCM28sUzgssGChu6rj","parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","wallStructure":"Default","studSpacing":100,"studColor":"#666666","opacity":0,"roofId":"wmVcJCTPwpivZkJBd9PRUz","selected":false,"leftRoofHeight":14,"rightRoofHeight":14,"locked":false,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13.5,"rightTopPartialHeight":13.5},{"id":"wmVcJCTPwpivZkJBd9PRUz","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"3FFY4h4Y53Ud4TwY2XAm3b","foundationId":"3FFY4h4Y53Ud4TwY2XAm3b","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["47gofCM28sUzgssGChu6rj","9KWwq22ziFFGjGozMGZDJy","2xmth77a7rM6NqB4LYTVg3","axJwDxU9qufHCzbi6cJjRE"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":3.7559133706467165,"ceiling":false},{"type":"Foundation","cx":16.06830096335861,"cy":54.39520622164741,"cz":0.25,"lx":11.586920121577,"ly":4.513937500002255,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3FFY4h4Y53Ud4TwY2XAm3b","selected":false,"locked":false},{"type":"Wall","cx":-4.287405180985958,"cy":0.6870154234100241,"cz":0,"lx":0.7619228017884919,"ly":0.1,"lz":30.522600729435336,"leftJoints":["eyhcnsCSVemrG9SDzg4nJ2"],"rightJoints":["bHsvKPqQBPZPeMWXAxFnQa"],"leftPoint":[-4.137571545403402,1.0372745712126488,0.25018525188061747],"rightPoint":[-4.437238816568516,0.3367562756073994,0.25018525188061747],"relativeAngle":-1.9750187634646525,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"aU3ZWFitC4Fgrww9n7FaQe","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-4.437238816568516,"cy":-0.0901973207344966,"cz":0,"lx":0.8539071926837931,"ly":0.1,"lz":30.522600729435336,"leftJoints":["aU3ZWFitC4Fgrww9n7FaQe"],"rightJoints":[],"leftPoint":[-4.437238816568516,0.3367562756073994,0.25018525188061747],"rightPoint":[-4.437238816568516,-0.5171509170763926,0.25018525188061747],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"bHsvKPqQBPZPeMWXAxFnQa","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-3.8859974678145366,"cy":1.2934467290177807,"cz":0,"lx":0.7180910553661809,"ly":0.1,"lz":30.522600729435336,"leftJoints":["xcRtMosaXc2kjoRaazGNSd"],"rightJoints":["aU3ZWFitC4Fgrww9n7FaQe"],"leftPoint":[-3.6344233902256713,1.5496188868229197,0.25018525188061747],"rightPoint":[-4.137571545403402,1.0372745712126488,0.25018525188061747],"relativeAngle":-2.3471388749896596,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eyhcnsCSVemrG9SDzg4nJ2","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-3.298991286773852,"cy":1.7204003253596767,"cz":0,"lx":0.7528107219608302,"ly":0.1,"lz":30.522600729435336,"leftJoints":["fsM3HFbdwGctcxehK1sWSn"],"rightJoints":["eyhcnsCSVemrG9SDzg4nJ2"],"leftPoint":[-2.9635591833220327,1.8911817638964408,0.25018525188061747],"rightPoint":[-3.6344233902256713,1.5496188868229197,0.25018525188061747],"relativeAngle":-2.6706609040195843,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xcRtMosaXc2kjoRaazGNSd","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-2.5442690540072563,"cy":1.8911817638964408,"cz":0,"lx":0.8385802586295528,"ly":0.1,"lz":30.522600729435336,"leftJoints":["6XgmyJyqgEv5ifchExpE81"],"rightJoints":["xcRtMosaXc2kjoRaazGNSd"],"leftPoint":[-2.12497892469248,1.8911817638964408,0.25018525188061747],"rightPoint":[-2.9635591833220327,1.8911817638964408,0.25018525188061747],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fsM3HFbdwGctcxehK1sWSn","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-1.7895468212406604,"cy":1.7204003253596767,"cz":0,"lx":0.7528107219608307,"ly":0.1,"lz":30.522600729435336,"leftJoints":["fYWGXixdnmhXJQ9obJmEx4"],"rightJoints":["fsM3HFbdwGctcxehK1sWSn"],"leftPoint":[-1.454114717788841,1.5496188868229197,0.25018525188061747],"rightPoint":[-2.12497892469248,1.8911817638964408,0.25018525188061747],"relativeAngle":2.6706609040195843,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"6XgmyJyqgEv5ifchExpE81","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-1.202540640199976,"cy":1.2934467290177807,"cz":0,"lx":0.7180910553661805,"ly":0.1,"lz":30.522600729435336,"leftJoints":["4GwFXBtR54ZnyGA71jYYZc"],"rightJoints":["6XgmyJyqgEv5ifchExpE81"],"leftPoint":[-0.9509665626111112,1.0372745712126488,0.25018525188061747],"rightPoint":[-1.454114717788841,1.5496188868229197,0.25018525188061747],"relativeAngle":2.347138874989659,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"fYWGXixdnmhXJQ9obJmEx4","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-0.7832505108852015,"cy":0.6957116941391277,"cz":0,"lx":0.7610358020520893,"ly":0.1,"lz":30.522600729435336,"leftJoints":["eBehuFBXFQvHTyVLAdaGdf"],"rightJoints":["fYWGXixdnmhXJQ9obJmEx4"],"leftPoint":[-0.6155344591592917,0.35414881706561374,0.25018525188061747],"rightPoint":[-0.9509665626111112,1.0372745712126488,0.25018525188061747],"relativeAngle":2.027238521722415,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4GwFXBtR54ZnyGA71jYYZc","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-0.6155344591592917,"cy":-0.07280477927628937,"cz":0,"lx":0.8539071926838048,"ly":0.1,"lz":30.522600729435336,"leftJoints":["d7o4BGzTN8VdkyE1cWq7ia"],"rightJoints":["4GwFXBtR54ZnyGA71jYYZc"],"leftPoint":[-0.6155344591592917,-0.4997583756181925,0.25018525188061747],"rightPoint":[-0.6155344591592917,0.35414881706561374,0.25018525188061747],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"eBehuFBXFQvHTyVLAdaGdf","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-4.2874051809859575,"cy":-0.85001752342081,"cz":0,"lx":0.7300693007410605,"ly":0.1,"lz":30.522600729435336,"leftJoints":[],"rightJoints":["71Xv23m81dcuvYBk8UDpg2"],"leftPoint":[-4.437238816568513,-0.5171509170763926,0.25018525188061747],"rightPoint":[-4.137571545403402,-1.1828841297652275,0.25018525188061747],"relativeAngle":-1.147833323399613,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xewwKY8wmraW5H3W8KA3XV","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-0.7832505108852015,"cy":-0.8413212526917135,"cz":0,"lx":0.7610358020520893,"ly":0.1,"lz":30.522600729435336,"leftJoints":["gKowPySkxP5QDpYS45Ky87"],"rightJoints":["eBehuFBXFQvHTyVLAdaGdf"],"leftPoint":[-0.9509665626111112,-1.1828841297652275,0.25018525188061747],"rightPoint":[-0.6155344591592917,-0.4997583756181925,0.25018525188061747],"relativeAngle":1.1143541318673784,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"d7o4BGzTN8VdkyE1cWq7ia","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-1.202540640199976,"cy":-1.4390562875703665,"cz":0,"lx":0.7180910553661803,"ly":0.1,"lz":30.522600729435336,"leftJoints":["w2pokb3YWg3yZ7YCCbdX1w"],"rightJoints":["d7o4BGzTN8VdkyE1cWq7ia"],"leftPoint":[-1.454114717788841,-1.6952284453755055,0.25018525188061747],"rightPoint":[-0.9509665626111112,-1.1828841297652275,0.25018525188061747],"relativeAngle":0.7944537786001341,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"gKowPySkxP5QDpYS45Ky87","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-1.7895468212406604,"cy":-1.8660098839122625,"cz":0,"lx":0.7528107219608308,"ly":0.1,"lz":30.522600729435336,"leftJoints":["6uEEWTZCV76LChiCEwjXou"],"rightJoints":["gKowPySkxP5QDpYS45Ky87"],"leftPoint":[-2.12497892469248,-2.0367913224490195,0.25018525188061747],"rightPoint":[-1.454114717788841,-1.6952284453755055,0.25018525188061747],"relativeAngle":0.47093174957020895,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"w2pokb3YWg3yZ7YCCbdX1w","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-2.5442690540072563,"cy":-2.0367913224490195,"cz":0,"lx":0.8385802586295528,"ly":0.1,"lz":30.522600729435336,"leftJoints":["t5GH8Xd8h7kQ1uXXK7nK76"],"rightJoints":["w2pokb3YWg3yZ7YCCbdX1w"],"leftPoint":[-2.9635591833220327,-2.0367913224490195,0.25018525188061747],"rightPoint":[-2.12497892469248,-2.0367913224490195,0.25018525188061747],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"6uEEWTZCV76LChiCEwjXou","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-3.298991286773852,"cy":-1.8660098839122625,"cz":0,"lx":0.7528107219608304,"ly":0.1,"lz":30.522600729435336,"leftJoints":["71Xv23m81dcuvYBk8UDpg2"],"rightJoints":["6uEEWTZCV76LChiCEwjXou"],"leftPoint":[-3.6344233902256713,-1.6952284453755055,0.25018525188061747],"rightPoint":[-2.9635591833220327,-2.0367913224490195,0.25018525188061747],"relativeAngle":-0.4709317495702092,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"t5GH8Xd8h7kQ1uXXK7nK76","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"type":"Wall","cx":-3.8859974678145366,"cy":-1.4390562875703665,"cz":0,"lx":0.7180910553661808,"ly":0.1,"lz":30.522600729435336,"leftJoints":["xewwKY8wmraW5H3W8KA3XV"],"rightJoints":["t5GH8Xd8h7kQ1uXXK7nK76"],"leftPoint":[-4.137571545403402,-1.1828841297652275,0.25018525188061747],"rightPoint":[-3.6344233902256713,-1.6952284453755055,0.25018525188061747],"relativeAngle":-0.7944537786001334,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"71Xv23m81dcuvYBk8UDpg2","parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofId":"fvYFb2pAnenzxFGy1hd1nC","selected":false,"leftRoofHeight":30.522600729435336,"rightRoofHeight":30.522600729435336,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.022600729435336,"rightTopPartialHeight":30.022600729435336},{"id":"fvYFb2pAnenzxFGy1hd1nC","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8f6767","normal":[0,0,1],"rotation":[0,0,0],"parentId":"h1eHzifF9EYnFRDPhVNFMh","foundationId":"h1eHzifF9EYnFRDPhVNFMh","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["xewwKY8wmraW5H3W8KA3XV","71Xv23m81dcuvYBk8UDpg2","t5GH8Xd8h7kQ1uXXK7nK76","6uEEWTZCV76LChiCEwjXou","w2pokb3YWg3yZ7YCCbdX1w","gKowPySkxP5QDpYS45Ky87","d7o4BGzTN8VdkyE1cWq7ia","eBehuFBXFQvHTyVLAdaGdf","4GwFXBtR54ZnyGA71jYYZc","fYWGXixdnmhXJQ9obJmEx4","6XgmyJyqgEv5ifchExpE81","fsM3HFbdwGctcxehK1sWSn","xcRtMosaXc2kjoRaazGNSd","eyhcnsCSVemrG9SDzg4nJ2","aU3ZWFitC4Fgrww9n7FaQe","bHsvKPqQBPZPeMWXAxFnQa"],"selected":false,"locked":false,"sideColor":"#8f6767","rise":20.34309413089949,"ceiling":false},{"type":"Foundation","cx":42.75366036851538,"cy":59.539698159110614,"cz":0.25,"lx":10.249999999999995,"ly":6.800000000000001,"lz":0.25018525188061747,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#999999","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"h1eHzifF9EYnFRDPhVNFMh","selected":false,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.8009797439083822,"lx":0.12303976124405665,"ly":0.3,"lz":0.500612339942739,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"kCsahZfC53mhXpdE7TMKTD","foundationId":"inhpub3MTpu4G1VDDvBtem","id":"n1xfWKYM49Ta9i1jvUnSdx","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3030361779763614,"lx":0.14763364899706352,"ly":0.3,"lz":1.1255629467693422,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","id":"t1uT7pQu9MoDXHdkcvNfZV","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.3813869265757474,"cy":0.1,"cz":0.10822720642012906,"lx":0.07381682449853176,"ly":0.3,"lz":0.7359450036568776,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","id":"oHgCutzcC6esppUpaCZhxo","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jaye","cx":-3.1586003174219464,"cy":42.50138216080711,"cz":0.300000011920929,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","id":"gGGvteApaSqA4rn3D5Jbp6","selected":false,"locked":false,"ly":0.55},{"type":"Window","cx":-0.20914766941250665,"cy":0.1,"cz":0.10822720642012906,"lx":0.07381682449853176,"ly":0.3,"lz":0.7359450036568776,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"qRAtVr3qjJXnPZvCynZgyN","parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20914766941250665,"cy":0.1,"cz":0.10822720642012906,"lx":0.07381682449853176,"ly":0.3,"lz":0.7359450036568776,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"k25WWUL3hGYFBBRg8XmfZg","parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3813869265757474,"cy":0.1,"cz":0.10822720642012906,"lx":0.07381682449853176,"ly":0.3,"lz":0.7359450036568776,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"xpvMVVPvYfJtfXdZGuJKJ7","parentId":"6NAiyB2LDnaumetDroz2SP","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3420580759264758,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","id":"9MktNmqdZdUjgUT3J7mmKP","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.1805306511834178,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"5VB6B3ApC4i4eK9yQ41MtE","parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.019003226440359768,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"wzeRPHbDL7fX7eVg8JovP1","parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.15202581152287814,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"gajXEi8SYukHS1ccyswRmf","parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.3135532362659362,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"8XYd7CxYiMzmhMgtNcF9hb","parentId":"t9LGJeHDCScMaYt1JPTD25","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.30405162304575645,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"iXrcQAXko5wJpsX8sJ8oxo","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.14252419830269836,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"dP8bg5cpSmNTjTSvLF6GmF","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.028504839660539658,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"nEjY9Gpj1vzDHW816Q21tM","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.17102903796323798,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"gFdP6DrScRCmNaddZ5LxW9","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.34205807592647597,"cy":0.1,"cz":0.3754592549570542,"lx":0.038006452880719535,"ly":0.3,"lz":0.15018370198282166,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"qYRq9Vy4HqB8CxTJbdKN9R","parentId":"8ygPss7hAjTnN2gdGp6ttV","foundationId":"inhpub3MTpu4G1VDDvBtem","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.40390975298658544,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"7Lt4nrPUnVMu764fCtZmnY","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jamelia","cx":15.537054538671264,"cy":-5.629500472027733,"cz":0.30000001192093256,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","id":"8dBf5N1hG2GfhtqSBisTkY","selected":false,"locked":false,"ly":0.65},{"type":"Window","cx":-0.23224810796728662,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"j9LyHn7BbYyr1sVT3bpcdF","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.07068420677265246,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"f2jDtPu32L3psHVPyQZste","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.10097743824664636,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"ojDrT4TtdCUuT741f3Cvkd","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.26254133944128055,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"r25WWueVXf7KAQQ6LVAkkh","parentId":"s1xEbSBtShW5kWkbmjYKyT","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.26254133944128066,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"881QknQ9aYiDKonXA8GnKw","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.10097743824664644,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"6AJhEo3V3och7gTNYqoNM9","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06058646294798784,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"fL6TEjx55ZJKxKH9q12vGC","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23224810796728676,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"51kmNRrRmSEhwTtk8tqNeL","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.40390975298658566,"cy":0.1,"cz":-0.021645441284025815,"lx":0.040390975298658545,"ly":0.3,"lz":0.8225267687929809,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"fXSwM2zT4Nfs9fKB83zeeM","parentId":"kdHDzULPWJfMLCpsjYsWA1","foundationId":"tRJdenhEy35bKxtqwaV7mW","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3157345459686911,"cy":0.1,"cz":0.1625,"lx":0.09714909106728957,"ly":0.3,"lz":0.65,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"mrwfYRsQYZsxgg3XbWQ1C9","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-5.39285788621555e-18,"cy":0.1,"cz":0.1625,"lx":0.09714909106728957,"ly":0.3,"lz":0.65,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"bbxD9VsSepsiYkXX43SgSR","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.3157345459686911,"cy":0.1,"cz":0.1625,"lx":0.09714909106728957,"ly":0.3,"lz":0.65,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"7a1XMVdYNgeWFuGynLbyj6","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Door","cx":0.024287272766822392,"cy":0,"cz":-0.45,"lx":0.24287272766822393,"ly":0,"lz":0.1,"textureType":"Door Texture #5","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"bWWJD1gFk9dmFyj6UtBgyw","locked":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.3157345459686911,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"4S2resCtMssVYmHmddP2zN","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-5.39285788621555e-18,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"sBu7pLatsE56Y6wmZEVsrW","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.17001090936775676,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"pKcG4z62TKd9yDYm6HvFre","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.17001090936775676,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"94jWNmV88zyuJzH2jKEhjS","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.31573454596869105,"cy":0.1,"cz":-0.275,"lx":0.09714909106728957,"ly":0.3,"lz":0.15,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"qLUGPVCbRRso5wPajMPhB9","parentId":"tF3vwD5MeKKihs6KSsJULW","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jeff","cx":-15.661746199983284,"cy":-22.272680701572895,"cz":0.30000001192093256,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"d5JiHWyULwssBmiBFfBkPJ","id":"ePaWVnF4Nn4YocprHwRiBU","selected":false,"locked":false,"ly":0.6},{"type":"Window","cx":0.029547059313054503,"cy":0.1,"cz":0.3333333333333333,"lx":0.35456471175665405,"ly":0.3,"lz":0.21666666666666667,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"szxkDJ4zvsmCjRAjDwr4oT","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"mP3Am8ZtiUAtGfBZJbxuUF","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.2659770155408789,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","id":"dJZj2sUCxXenPrW2Jawxrw","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09671891474213778,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"ta3rrvA6SZ71h7JpdQ8H9v","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07253918605660334,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"ka6Tnds7o2rpeQbTUL5XNR","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2659770155408789,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"3AmRpUZe9Zieufb9NFpKUe","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2659770155408789,"cy":0.1,"cz":-0.15625,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"9wNFWndGsb6CZofrG9Fupa","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09671891474213778,"cy":0.1,"cz":-0.15625,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"ss9gxEkgAKKu97XBUXNM54","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07253918605660334,"cy":0.1,"cz":-0.15625,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"u7JMjGgg9RrLGWHEohLHUW","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2659770155408789,"cy":0.1,"cz":-0.15625,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"seZJReiTn7AB935XPj7nmi","parentId":"vFwZn47p27JhuJCUwo66PB","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.29015674422641347,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"j44vXPNj93wPQunzLh8T1Q","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09671891474213784,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"shnTbDVozQrbvzKdN1MMK9","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0967189147421378,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"33HVy94BzEoDPXtrspXujk","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29015674422641347,"cy":0.1,"cz":0.28125,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"j4J8y7JeZK4qxfinaK39hR","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.29015674422641347,"cy":0.1,"cz":-0.16875,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"cRf1jRTwuR2e4zLg6vFDLv","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09671891474213784,"cy":0.1,"cz":-0.16875,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"vkoYTRq9mT4PwEwXPraM2s","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0967189147421378,"cy":0.1,"cz":-0.16875,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"mwATeDbSxAHev6LkxaPgTD","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3143364729119479,"cy":0.1,"cz":-0.16875,"lx":0.09671891474213778,"ly":0.3,"lz":0.3625,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"foK7LkvSM2WCizQJfUWA13","parentId":"jz5YKDY6NpWFeAzmZZgmMG","foundationId":"fD1unP99uJ2AUvKzSqaqv1","tint":"#009ce0","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.029980389503821973,"cy":0.1,"cz":0.3416666666666667,"lx":0.4796862320611516,"ly":0.1,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"ho8wYRGhLSJb2djJKqwSe1","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"kNDuFavJnC2DWCruSM8Yz5","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.04497058425573294,"cy":0.1,"cz":0.3416666666666667,"lx":0.5096666215649733,"ly":0.1,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"55SwaH9QxLHmcgrnQzAWTs","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"1zwyQ7SmozfQ7SawBNjqnG","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.029547059313054503,"cy":0.1,"cz":0.3416666666666667,"lx":0.47275294900887205,"ly":0.1,"lz":0.21666666666666667,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#4d4d4d","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"rCFFBj6A2tyxuTVf5rPe81","foundationId":"d5JiHWyULwssBmiBFfBkPJ","id":"pNX7KUpUJwgYkqu5xoyYFx","opacity":0.7,"locked":false,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1}],"sceneRadius":88,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[53.57176406047198,16.258735969028876,-0.000005704638955527846],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[53.57176406047198,16.25858596239243,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-85.36846751108261,-76.3704417077798,98.31866395924627],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":11.3760018455292,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[59.19446663129345,19.785139016084358,32.12480868336017],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},451:function(e){e.exports=JSON.parse('{"docid":"e5Mx3kDX6jj2XdEqyRiZ5Z","time":"06/12/2023 05:06 pm","timestamp":1686603965753,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jedi","cx":-0.35404550237608445,"cy":-9.031512450493677,"cz":-4.440892098500626e-16,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.56,"locked":true},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":6,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":6,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":6,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.24583957860028],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":6,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":6,"rightRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2kwhV9PqZtFtk8RVLFx83","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qpEwqVCd2BoFtSevFQh92k","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Foundation","cx":0.005791011935526669,"cy":0.058297538110867464,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":true,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Door","cx":0.00416666666666667,"cy":0,"cz":-0.27499999999999997,"lx":0.125,"ly":0,"lz":0.45,"textureType":"Door Texture #15","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"sXi8n3YHx4BKsSMSv4hsZ3","doorType":"Arched","archHeight":1,"filled":true,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2.2458395786002807,"ceiling":true,"locked":true},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5CaMQ21unMpwofCSBHFHKy","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p9ZFePdMbr5NJNutJpztLz","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"onfGgeAsDqrPXW9qAoSbJh","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mM8yRHvdQcQxaerLVfTrHK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"reViENhjL3rZ1iP9Y6KZQV","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dKNjnS17wjTVoaiN1bY7jW","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vXvgSmG1wzCSFmLFyHD3px","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bJfKVxMyGkSvssMyjbaW7W","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u4p2yGTyGA3NaJrURgo1aw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"swiJmUxEJ9JBgVoJXFiWMw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dJpqWBHMDhQTd71cTnXaW4","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j5a1DqXozDg23XnZHUwT3y","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.3333333333333333,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wdagFqacKyLy9R8i7SRZPq","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tJCV3miBMBbJoQ5KVL5GnC","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nRhC43dgJ576icoywiE43t","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fY9urdYNGp76qQUc5TkF8d","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kwvhmrhVppPu21YKVKixoa","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nZtTu7kGPQBjfFfeNj7L7w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"433Qj5XWec6xkx6KMSVinb","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":0.30570421810208276,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tPa2K6uLM9bNJjLjnApS5w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.29166666666666663,"cy":0.1,"cz":-0.2776291152312506,"lx":0.08333333333333333,"ly":0,"lz":0.22192489712916785,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cAQmf2baCS5Y2WWh241r8n","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"tint":"#73D8FF","mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Human","name":"Jess","cx":-7.267359835478274,"cy":-5.46716265973663,"cz":0.05000000074505806,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"5FVsreGyGxfLQLGYPuw8VY","selected":false,"locked":true},{"type":"Wall","cx":0.030224599657563633,"cy":2.181664431199555,"cz":2.2408122612280286,"lx":4.432938866484924,"ly":0.3,"lz":2.43795716101014,"leftJoints":["6q7e31mDw8dyN76mepj8pf"],"rightJoints":["91j8TFnFqna2wESTuPP4Kp"],"leftPoint":[2.2466940329000256,2.181664431199555,0],"rightPoint":[-2.1862448335848983,2.181664431199555,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ej8aZCWbLXMBpE4Cdavwp6","parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","roofId":"soVsWFGXbdhR2HYVAwuauC","selected":false,"leftRoofHeight":3.9650570060090606,"rightRoofHeight":2.43795716101014,"centerRoofHeight":[-0.5,3.9650570060090606],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.43795716101014,"rightTopPartialHeight":2.43795716101014},{"type":"Wall","cx":2.2466940329000256,"cy":-0.05093095151911964,"cz":2.2301039869226305,"lx":4.46519076543735,"ly":0.3,"lz":3.9650570060090606,"leftJoints":["oNnwF78XTbjrii9WEpinq5"],"rightJoints":["ej8aZCWbLXMBpE4Cdavwp6"],"leftPoint":[2.246694032900025,-2.2835263342377945,0],"rightPoint":[2.2466940329000264,2.181664431199555,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6q7e31mDw8dyN76mepj8pf","parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","roofId":"soVsWFGXbdhR2HYVAwuauC","selected":false,"leftRoofHeight":3.9650570060090606,"rightRoofHeight":3.9650570060090606,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.2233373091364115,"rightUnfilledHeight":3.2233373091364115,"leftTopPartialHeight":3.9650570060090606,"rightTopPartialHeight":3.9650570060090606},{"type":"Wall","cx":-2.1862448335848983,"cy":-0.05093095151911964,"cz":2.228839888904333,"lx":4.46519076543735,"ly":0.3,"lz":2.43795716101014,"leftJoints":["ej8aZCWbLXMBpE4Cdavwp6"],"rightJoints":["oNnwF78XTbjrii9WEpinq5"],"leftPoint":[-2.1862448335848983,2.181664431199555,0],"rightPoint":[-2.1862448335848983,-2.2835263342377945,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"91j8TFnFqna2wESTuPP4Kp","parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","roofId":"soVsWFGXbdhR2HYVAwuauC","selected":false,"leftRoofHeight":2.43795716101014,"rightRoofHeight":2.43795716101014,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.43795716101014,"rightTopPartialHeight":2.43795716101014},{"type":"Wall","cx":0.030224599657564077,"cy":-2.2835263342377945,"cz":2.268765007024547,"lx":4.432938866484925,"ly":0.3,"lz":2.43795716101014,"leftJoints":["91j8TFnFqna2wESTuPP4Kp"],"rightJoints":["6q7e31mDw8dyN76mepj8pf"],"leftPoint":[-2.1862448335848983,-2.2835263342377945,0],"rightPoint":[2.2466940329000264,-2.2835263342377945,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oNnwF78XTbjrii9WEpinq5","parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","roofId":"soVsWFGXbdhR2HYVAwuauC","selected":false,"leftRoofHeight":2.43795716101014,"rightRoofHeight":3.9650570060090606,"centerRoofHeight":[0.5,3.9650570060090606],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.43795716101014,"rightTopPartialHeight":2.43795716101014},{"type":"Foundation","cx":-8.111049740764729,"cy":0.08239268090626156,"cz":0.05,"lx":6.036367189018974,"ly":6.431853734147982,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7pHjvqBpPz7sYq5ET1nnMX","selected":false,"locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","roofStructure":"Default","wallsId":["6q7e31mDw8dyN76mepj8pf"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7pHjvqBpPz7sYq5ET1nnMX","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","id":"soVsWFGXbdhR2HYVAwuauC","ridgeLeftPoint":[0.5,1],"ridgeRightPoint":[-0.5,1],"rise":0,"ceiling":false,"locked":true},{"type":"Window","cx":-0.11279199083484595,"cy":0.1,"cz":0.10254486994201946,"lx":0.2255839816696919,"ly":0.3,"lz":0.6152692196521174,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aS26toPbuxFA4EAg6ptRCD","parentId":"oNnwF78XTbjrii9WEpinq5","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.08281474884461537,"lx":0.671863792073878,"ly":0.3,"lz":0.6547294618469256,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oy9eXMTPrwyNzvomHovfsD","parentId":"91j8TFnFqna2wESTuPP4Kp","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"#73d8ff","width":0.25},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Window","cx":0.11279199083484595,"cy":0.1,"cz":0.10254486994201946,"lx":0.2255839816696919,"ly":0.3,"lz":0.6152692196521174,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4mXMxYJnZGCrX3QZdFQHGr","parentId":"ej8aZCWbLXMBpE4Cdavwp6","foundationId":"7pHjvqBpPz7sYq5ET1nnMX","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"#73d8ff","width":0.25},"selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.08,"windowType":"Default","archHeight":1,"locked":true},{"type":"Wall","cx":-0.8322807242725112,"cy":1.200921695970016,"cz":2.2408122612280286,"lx":0.8544333532350403,"ly":0.15,"lz":9.575974551005562,"leftJoints":["pw9wMqrj3Enw2zC5Tgk6yR"],"rightJoints":["dMssi4ADwUhxkBhQ377g3E"],"leftPoint":[-0.4050640476549914,1.200921695970016,0.11969968188756955],"rightPoint":[-1.259497400890032,1.200921695970016,0.11969968188756955],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #3","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5koEPnk7n6ka7L389qtGvZ","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-0.4050640476549914,"cy":0.14277050874931954,"cz":2.2301039869226305,"lx":2.1163023744413962,"ly":0.15,"lz":9.575974551005562,"leftJoints":["sW8KRkVjiejYRvNZCfXEAP"],"rightJoints":["5koEPnk7n6ka7L389qtGvZ"],"leftPoint":[-0.4050640476549914,-0.9153806784713785,0.11969968188756955],"rightPoint":[-0.4050640476549914,1.200921695970016,0.11969968188756955],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #3","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pw9wMqrj3Enw2zC5Tgk6yR","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-1.259497400890032,"cy":0.14277050874931954,"cz":2.228839888904333,"lx":2.1163023744413962,"ly":0.15,"lz":9.575974551005562,"leftJoints":["5koEPnk7n6ka7L389qtGvZ"],"rightJoints":["sW8KRkVjiejYRvNZCfXEAP"],"leftPoint":[-1.259497400890032,1.200921695970016,0.11969968188756955],"rightPoint":[-1.259497400890032,-0.9153806784713785,0.11969968188756955],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #3","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dMssi4ADwUhxkBhQ377g3E","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Wall","cx":-0.8322807242725112,"cy":-0.9153806784713785,"cz":2.268765007024547,"lx":0.8544333532350405,"ly":0.15,"lz":9.575974551005562,"leftJoints":["dMssi4ADwUhxkBhQ377g3E"],"rightJoints":["pw9wMqrj3Enw2zC5Tgk6yR"],"leftPoint":[-1.259497400890032,-0.9153806784713785,0.11969968188756955],"rightPoint":[-0.4050640476549914,-0.9153806784713785,0.11969968188756955],"relativeAngle":0,"textureType":"Wall Texture #3","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sW8KRkVjiejYRvNZCfXEAP","parentId":"qEHo3z28Ar77Wu5WGXMk73","foundationId":"qEHo3z28Ar77Wu5WGXMk73","roofId":null,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.575974551005562,"rightTopPartialHeight":9.575974551005562},{"type":"Foundation","cx":7.486416419884205,"cy":-0.2409139792702466,"cz":0.05,"lx":2.839701333763733,"ly":2.938267885749648,"lz":0.11969968188756955,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qEHo3z28Ar77Wu5WGXMk73","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":8.075263543932596,"cy":-0.6884958197811117,"cz":0.5701039576976044,"lx":5.507966558248896,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":["mqNMzZ6M874kpGr6Eb5P4b"],"leftPoint":[8.075263543932598,2.065487459343336,0],"rightPoint":[8.075263543932595,-3.4424790989055594,0],"relativeAngle":-1.5707963267948974,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pTqaBUKRmjPL9fsFDPBYdH","parentId":"eUQQcfUyWDHA7KoGuDBRyw","foundationId":"eUQQcfUyWDHA7KoGuDBRyw","wallStructure":"Stud","opacity":0,"roofId":null,"selected":false,"structureSpacing":0.25,"structureWidth":0.02,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-8.075263543932598,"cy":-0.6884958197811117,"cz":2.228839888904333,"lx":5.507966558248896,"ly":0.1,"lz":1,"leftJoints":["txrhd5ZN1ZaUi7X6CidW39"],"rightJoints":[],"leftPoint":[-8.075263543932598,-3.4424790989055594,0],"rightPoint":[-8.075263543932598,2.065487459343336,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1eZoH5UbMqtXnnStv5oPMy","parentId":"eUQQcfUyWDHA7KoGuDBRyw","foundationId":"eUQQcfUyWDHA7KoGuDBRyw","wallStructure":"Stud","opacity":0,"roofId":null,"selected":false,"structureSpacing":0.25,"structureWidth":0.02,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-3.545116350166421,"cy":-3.4494515352900414,"cz":0.6126379187745709,"lx":9.060305118936492,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":["1eZoH5UbMqtXnnStv5oPMy"],"leftPoint":[0.9850308435997561,-3.4564239716745235,0],"rightPoint":[-8.075263543932598,-3.4424790989055594,0],"relativeAngle":3.140053535636089,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"txrhd5ZN1ZaUi7X6CidW39","parentId":"eUQQcfUyWDHA7KoGuDBRyw","foundationId":"eUQQcfUyWDHA7KoGuDBRyw","wallStructure":"Stud","opacity":0,"roofId":null,"selected":false,"structureSpacing":0.25,"structureWidth":0.02,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Foundation","cx":-2.1373102684560767,"cy":-4.085170940145713,"cz":0.05,"lx":19.693313015419633,"ly":8.765160185704904,"lz":0.06568375039354474,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eUQQcfUyWDHA7KoGuDBRyw","selected":false,"locked":true,"enableGroupMaster":false,"notBuilding":true},{"type":"Wall","cx":5.761435748265872,"cy":-3.449451535290042,"cz":0.5701039576976044,"lx":4.6276766018679725,"ly":0.1,"lz":1,"leftJoints":["pTqaBUKRmjPL9fsFDPBYdH"],"rightJoints":[],"leftPoint":[8.075263543932598,-3.4424790989055603,0],"rightPoint":[3.4476079525991463,-3.4564239716745235,0],"relativeAngle":-3.1385792853117462,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mqNMzZ6M874kpGr6Eb5P4b","parentId":"eUQQcfUyWDHA7KoGuDBRyw","foundationId":"eUQQcfUyWDHA7KoGuDBRyw","wallStructure":"Stud","opacity":0,"selected":false,"structureSpacing":0.25,"structureWidth":0.02,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Tree","name":"Elm","cx":12.193483954680035,"cy":-3.450559107713003,"cz":8.881784197001252e-16,"lx":8.182228289296598,"lz":10.259018050875072,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"nHGsDGLUFhyht1nKkbShZS","selected":false,"locked":true},{"type":"Tree","name":"Maple","cx":-14.053228627664431,"cy":-3.1648808638293726,"cz":0,"lx":7.51702234293303,"lz":8.935898046217556,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"pYVQihimDYo3cuWwFUxGRV","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":3.290712882109931,"cy":-6.730243806005441,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"pv5MXJzN7e4QwMAqb7AK2K","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-3.2352418118616306,"cy":-6.686295545696994,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"evYRkJazdBwJn4ArepyeZH","selected":false,"locked":true},{"type":"Flower","name":"Spirea","cx":-5.425159494402423,"cy":-6.686295545696994,"cz":0.05000000074505806,"lx":1.8,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"mr1vQH3R9jwp2hzXcmJrDH","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-7.004918274330166,"cy":-0.19566971843541836,"cz":0.03284187614917755,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"qPgjnRK2xBNDKQYWaqPEJW","selected":false,"locked":true},{"type":"Flower","name":"Boxwood","cx":-9.151037603220141,"cy":-3.889330876320888,"cz":0.03284187614917755,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"m8cKNBQB4gUpU1aJMFZzhU","selected":false,"locked":true},{"type":"Flower","name":"Boxwood","cx":9.13503616494302,"cy":-3.964216287045085,"cz":0.032841876149175775,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"tncEiBTcdo5sNQWHKbsyh2","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-7.661893579092403,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"3vTcKnJjhDrau5WtHq6mBt","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-6.661893579092403,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"sDmTVeVfizELxSDFfm4Uea","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-5.661893579092403,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"g823QGzRg2L3V2cZr4aRxd","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-4.661893579092403,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"hHUhERpDDMaotPBoVG69kS","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-3.6618935790924034,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"kHQDrKatqtEmBRsqGsesEx","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-2.6618935790924034,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"tZShdZCdNYPMDRYqULaCBd","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-1.6618935790924034,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"7t2HS7jELVuWTJ8wEd6GU6","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":-0.6618935790924034,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"2CQpgvbKEJRX6BS4JzKyeA","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":0.33810642090759657,"cy":-4.239717705527416,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"j13bnHy89XjWxoKTXY11wT","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":3.9884684920246123,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"jGj2jbHeSWSMLQ4R6813YK","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":4.988468492024612,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"2Fq3eCF7Cmj4HXLnWJj5XE","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":5.988468492024612,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"3ykQAwfp6KeX9fEn2PpH4T","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":6.988468492024612,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"e26QSrjZiynidud1nyPf16","selected":false,"locked":true},{"type":"Flower","name":"Hosta","cx":7.988468492024612,"cy":-4.18131990065966,"cz":0.03284187614917755,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"eUQQcfUyWDHA7KoGuDBRyw","id":"aZdoik5bFQJGAW29Jo71RA","selected":false,"locked":true},{"type":"Light","decay":2,"distance":10,"intensity":10,"color":"#fe9200","cx":-0.15060725129335759,"cy":-0.0069023347929206705,"cz":8.339264661200525,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0.4097333676171505,0.9122053318530369],"rotation":[0.4221617487320859,0,3.141592653589793],"parentId":"1iq4TPqH8xr1w2VxMAh8MU","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"gsaoCVaDLKgne3oCcDZ5e9","selected":false,"inside":true,"locked":true},{"type":"Light","decay":2,"distance":6,"intensity":8,"color":"#fe9200","cx":0.004999999999999995,"cy":0,"cz":-0.02333333333333333,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"eS9BNDuHjJf4dGFLVwhXwG","selected":false,"locked":true},{"type":"Door","cx":-0.01000000000000002,"cy":0,"cz":-0.21666666666666667,"lx":0.42000000000000004,"ly":0,"lz":0.5666666666666667,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"jbVYfDfRVVQDSMqv6ux2rr","locked":true,"interior":true},{"type":"Foundation","cx":0.0987039168470164,"cy":-6.316994564085812,"cz":0.05,"lx":3.2352197337597937,"ly":4.369968224342228,"lz":0.06568375039354474,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"myXiyVt2NURPnPChDUSnvF","selected":false,"locked":true,"notBuilding":true},{"type":"Wall","cx":0.016199018084092187,"cy":1.482279391694321,"cz":2.2408122612280286,"lx":2.375854690465504,"ly":0.3,"lz":3.2841875196772365,"leftJoints":["cRF4aFTgNdpMTdmopKNDYe"],"rightJoints":["maCaKmF7W1UtJB4NhBQsX3"],"leftPoint":[1.204126363316844,1.482279391694321,0],"rightPoint":[-1.1717283271486596,1.482279391694321,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qA9MpNw8bZfY7qVfr846Q8","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Stud","opacity":0,"roofId":"kL2csyDhpYU6Tdyq5APXiG","selected":false,"leftRoofHeight":3.2841875196772365,"rightRoofHeight":3.2841875196772365,"centerRoofHeight":[0,3.837098172113132],"structureSpacing":1000,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.2841875196772365,"rightTopPartialHeight":3.2841875196772365},{"type":"Wall","cx":1.2041263633168442,"cy":-0.03460380925524109,"cz":0.9803491274068566,"lx":3.0337664018991246,"ly":0.3,"lz":3.2841875196772365,"leftJoints":["5ExmWkfAba5nuC3xfHo5vU"],"rightJoints":["qA9MpNw8bZfY7qVfr846Q8"],"leftPoint":[1.204126363316844,-1.5514870102048033,0],"rightPoint":[1.2041263633168446,1.482279391694321,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cRF4aFTgNdpMTdmopKNDYe","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"kL2csyDhpYU6Tdyq5APXiG","selected":false,"leftRoofHeight":3.2841875196772365,"rightRoofHeight":3.2841875196772365,"structureSpacing":1000,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.2841875196772365,"rightTopPartialHeight":3.2841875196772365},{"type":"Wall","cx":-1.1717283271486596,"cy":-0.03460380925524109,"cz":2.228839888904333,"lx":3.0337664018991246,"ly":0.3,"lz":3.2841875196772365,"leftJoints":["qA9MpNw8bZfY7qVfr846Q8"],"rightJoints":["5ExmWkfAba5nuC3xfHo5vU"],"leftPoint":[-1.1717283271486596,1.482279391694321,0],"rightPoint":[-1.1717283271486596,-1.5514870102048033,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"maCaKmF7W1UtJB4NhBQsX3","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Pillar","opacity":0,"roofId":"kL2csyDhpYU6Tdyq5APXiG","selected":false,"leftRoofHeight":3.2841875196772365,"rightRoofHeight":3.2841875196772365,"structureSpacing":1000,"structureWidth":0.2,"structureColor":"white","fill":"Full","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.2841875196772365,"rightTopPartialHeight":3.2841875196772365},{"type":"Wall","cx":0.01619901808409252,"cy":-1.5514870102048033,"cz":2.268765007024547,"lx":2.3758546904655042,"ly":0.3,"lz":3.2841875196772365,"leftJoints":["maCaKmF7W1UtJB4NhBQsX3"],"rightJoints":["cRF4aFTgNdpMTdmopKNDYe"],"leftPoint":[-1.1717283271486596,-1.5514870102048033,0],"rightPoint":[1.2041263633168446,-1.5514870102048033,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5ExmWkfAba5nuC3xfHo5vU","parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","wallStructure":"Default","opacity":0,"roofId":"kL2csyDhpYU6Tdyq5APXiG","selected":false,"leftRoofHeight":3.2841875196772365,"rightRoofHeight":3.2841875196772365,"centerRoofHeight":[0,3.837098172113132],"structureSpacing":1000,"structureWidth":0.2,"structureColor":"white","fill":"Partial","eavesLength":0.3,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.110608215274513,"rightUnfilledHeight":3.110608215274513,"leftTopPartialHeight":3.2841875196772365,"rightTopPartialHeight":3.2841875196772365},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","roofStructure":"Default","wallsId":["maCaKmF7W1UtJB4NhBQsX3"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"myXiyVt2NURPnPChDUSnvF","foundationId":"myXiyVt2NURPnPChDUSnvF","id":"kL2csyDhpYU6Tdyq5APXiG","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":0.5529106524358953,"ceiling":false,"locked":true},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.21045058100840097,"y":-0.6089786250075502},{"x":-0.21045058100840097,"y":-0.4567339687556626},{"x":0.21045058100840097,"y":-0.4567339687556626},{"x":0.21045058100840097,"y":-0.6089786250075502}],"parentId":"5ExmWkfAba5nuC3xfHo5vU","parentType":"Wall","foundationId":"myXiyVt2NURPnPChDUSnvF","selected":false,"filled":true,"selectedIndex":2,"id":"19jcnLnazAo68d9SCy19QV","noOutline":true,"text":"26","fontSize":0.35,"fontColor":"gold","locked":true},{"type":"Door","cx":-0.05,"cy":0,"cz":-0.4583333333333333,"lx":0.1,"ly":0,"lz":0.08333333333333333,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"3zkRmLGDcsm6tCGsvCTs4B","interior":true,"frameColor":"#4d4d4d","locked":true}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-7.862597366276697,1.7514757983201874,0.0000017661570980830242],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-7.862597366276697,1.7504754208759876,150],"theme":"Mountain","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-6.838817312607155,-22.7607406255055,2.6094586494143144],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":30.146795390577452,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.07649922483275468,1.5616450860400017,2.4309145652183837],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},452:function(e){e.exports=JSON.parse('{"docid":"bdxRpN9LUZ1jTZzjLf3j79","time":"08/16/2023 09:04 am","timestamp":1692191055280,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 1:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":15.82679166341284,"solarUpdraftTower":{},"parentId":"Ground","cx":-8.9649429178124,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.5215353669749065,"type":"Foundation","solarPowerTower":{},"lx":19.683950802792882,"lz":0.08304003951954272,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.04152001975977136,"enableGroupMaster":true,"textureType":"Foundation Texture #4","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":3.3216015807817088,"roofId":"sfGxVh6UQ5Rh5eXQutdage","ly":0.3,"rightPoint":[-6.139317409562167,6.280059949020198,0.08304003951954272],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[5.860682590437832,6.280059949020198,0.08304003951954272],"type":"Wall","rightRoofHeight":3.3216015807817088,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":3.3216015807817088,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.13931740956216743,"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":6.280059949020198,"color":"#f44e3b","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.3216015807817088,"rightTopPartialHeight":3.3216015807817088},{"type":"Wall","parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":5.860682590437831,"leftPoint":[5.860682590437829,-3.719940050979802,0.08304003951954272],"cy":1.2800599490201985,"leftRoofHeight":3.3216015807817088,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[5.860682590437833,6.280059949020198,0.08304003951954272],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":3.3216015807817088,"centerRoofHeight":[0,6.6432031615634175],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":3.3216015807817083,"roofId":"sfGxVh6UQ5Rh5eXQutdage","centerLeftRoofHeight":[-0.35,4.982402371172563],"centerRightRoofHeight":[0.35,4.982402371172564],"color":"#f44e3b","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.3216015807817088,"rightTopPartialHeight":3.3216015807817088},{"lx":10,"lz":3.3216015807817088,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"sfGxVh6UQ5Rh5eXQutdage","selected":false,"cy":1.2800599490201985,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0,6.6432031615634175],"rightPoint":[-6.139317409562167,-3.719940050979802,0.08304003951954272],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":3.3216015807817083,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-6.139317409562166,6.280059949020198,0.08304003951954272],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":3.3216015807817088,"ly":0.3,"cx":-6.139317409562167,"centerLeftRoofHeight":[-0.35,4.982402371172563],"centerRightRoofHeight":[0.35,4.982402371172564],"color":"#f44e3b","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.3216015807817088,"rightTopPartialHeight":3.3216015807817088},{"showLabel":false,"cx":-0.13931740956216743,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[5.860682590437833,-3.719940050979802,0.08304003951954272],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-3.719940050979802,"id":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"sfGxVh6UQ5Rh5eXQutdage","leftPoint":[-6.139317409562167,-3.719940050979802,0.08304003951954272],"normal":[0,0,1],"ly":0.3,"lz":3.3216015807817088,"leftRoofHeight":3.3216015807817088,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":3.3216015807817088,"lx":12,"color":"#f44e3b","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.3216015807817088,"rightTopPartialHeight":3.3216015807817088},{"type":"Window","showLabel":false,"ly":0,"lz":0.44384979425833565,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.07139510364251808,"selected":false,"cx":-0.4166666666666667,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.07139510364251808,"normal":[0,0,1],"cx":-0.225,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0,"lz":0.44384979425833565,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.20833333333333334,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"color":"#ffffff","cz":-0.07139510364251808,"cy":0.3,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0,"selected":false,"lz":0.44384979425833565,"type":"Window","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.4166666666666667,"cy":0.1,"cz":-0.07139510364251808,"lz":0.44384979425833565,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333333,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Joan","cx":-9.748795495187615,"cy":-11.885843529724642,"cz":0,"lx":1.7,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":1.7,"locked":true},{"type":"Tree","name":"Magnolia","flip":true,"cx":2.83831023868078,"cy":0.3026770951383977,"cz":0,"lx":4.909285741329502,"lz":7.047282022546526,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"t5Aj8tjjpqVaLaB3uEqfR8","selected":false,"locked":true},{"type":"Window","cx":-0.2916666666666667,"cy":-1.3376344861350336e-15,"cz":0,"lx":0.08333333333333333,"ly":0,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2916666666666667,"cy":-1.1010413489448665e-14,"cz":0,"lx":0.08333333333333333,"ly":0,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"roofType":"Gambrel","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"Roof Texture #1","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"sfGxVh6UQ5Rh5eXQutdage","color":"#666666","thickness":0.15,"locked":true,"rise":3.3216015807817088,"ceiling":false,"frontRidgePoint":[0.35,0.5],"backRidgePoint":[0.35,0.5],"topRidgePoint":[0,1]},{"type":"Wall","cx":-0.17032995035379805,"cy":2.9140760690705836,"cz":2.2408122612280286,"lx":4,"ly":0.3,"lz":3.45,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[1.829670049646202,2.914076069070582,0.08304003951954272],"rightPoint":[-2.170329950353798,2.9140760690705845,0.08304003951954272],"relativeAngle":3.1415926535897922,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"p1WWYMY9TmVyswdgfSEZfZ","leftRoofHeight":3.45,"rightRoofHeight":3.4499999999999993,"centerRoofHeight":[0,6.716478772745814],"centerLeftRoofHeight":[-0.35,5.083239386372908],"centerRightRoofHeight":[0.35,5.083239386372907],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.35,"rightUnfilledHeight":3.35,"leftTopPartialHeight":3.45,"rightTopPartialHeight":3.45},{"type":"Wall","cx":1.829670049646202,"cy":-0.3359239309294191,"cz":2.2301039869226305,"lx":6.500000000000001,"ly":0.3,"lz":3.45,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[1.8296700496462002,-3.5859239309294173,0.08304003951954272],"rightPoint":[1.8296700496462037,2.914076069070582,0.08304003951954272],"relativeAngle":1.5707963267948957,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"p1WWYMY9TmVyswdgfSEZfZ","leftRoofHeight":3.45,"rightRoofHeight":3.45,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.0873856802470327,"rightUnfilledHeight":2.3262939270695226,"leftTopPartialHeight":3.45,"rightTopPartialHeight":3.45},{"type":"Wall","cx":-2.170329950353798,"cy":-0.3359239309294191,"cz":2.228839888904333,"lx":6.5,"ly":0.3,"lz":3.45,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-2.170329950353798,2.914076069070582,0.08304003951954272],"rightPoint":[-2.170329950353798,-3.5859239309294173,0.08304003951954272],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"p1WWYMY9TmVyswdgfSEZfZ","leftRoofHeight":3.45,"rightRoofHeight":3.45,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.1078217002230364,"rightUnfilledHeight":2.2273879622936055,"leftTopPartialHeight":3.45,"rightTopPartialHeight":3.45},{"type":"Wall","cx":-0.17032995035379805,"cy":-3.5859239309294173,"cz":2.268765007024547,"lx":3.9999999999999982,"ly":0.3,"lz":3.45,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-2.170329950353798,-3.5859239309294173,0.08304003951954272],"rightPoint":[1.8296700496462002,-3.5859239309294173,0.08304003951954272],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"p1WWYMY9TmVyswdgfSEZfZ","leftRoofHeight":3.45,"rightRoofHeight":3.450000000000001,"centerRoofHeight":[0,6.716478772745814],"centerLeftRoofHeight":[-0.35,5.083239386372908],"centerRightRoofHeight":[0.35000000000000003,5.083239386372907],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.45,"rightTopPartialHeight":3.45},{"type":"Foundation","cx":-8.995176289846825,"cy":-2.548120633774467,"cz":0.04152001975977136,"lx":7.238675704625617,"ly":10.649205015118838,"lz":0.08304003951954272,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"textureType":"No Foundation Texture","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Human","name":"Joel","cx":-7.789004610682257,"cy":-12.04210360652551,"cz":8.881784197001252e-16,"lx":1.8,"ly":1.8,"lz":1.75,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false,"locked":true},{"type":"Window","cx":0,"cy":0.3,"cz":0.8730728022225684,"lx":0.4000000000000002,"ly":0.3,"lz":0.5419072565519394,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"9sxNKgBrTJz5rbuB2EAigV","mullionSpacing":0.56,"shutter":{"showLeft":false,"showRight":false,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":0.8,"empty":false},{"type":"Door","cx":-0.012500000000000002,"cy":0,"cz":-0.0693642478160203,"lx":0.225,"ly":0,"lz":0.8612715043679594,"textureType":"Door Texture Default","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"3ToGStSrcyguQUUqJUFhxz","locked":true,"doorType":"Default","archHeight":1,"filled":false,"interior":true},{"type":"Window","cx":-0.3,"cy":0,"cz":0,"lx":0.10000000000000002,"ly":0,"lz":0.5000000000000001,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"qoQarTFv95tVF8owcPVUFr","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.35,"cy":0,"cz":0,"lx":0.1,"ly":0,"lz":0.5,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"gFrpbUVsUk5Cyw1YgAc3Su","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0,"cz":1.1,"lx":0.1,"ly":0,"lz":0.5,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"g7oggQtbGLCJnWDBEWrL6f","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.25,"cy":0,"cz":0,"lx":0.1,"ly":0,"lz":0.5,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"9KXbYufDZik3nedxtSG2Wa","mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3,"cy":1.1102230246251565e-15,"cz":0,"lx":0.1,"ly":0,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hP5LnWCZSyCWuh6LURpM1g","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"mullionSpacing":0.9,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.5000000000000002,"ly":0,"lz":0.75,"textureType":"Door Texture #2","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"xfiB1ehYmvvHX7d6tsihDv","locked":true,"doorType":"Default","archHeight":1,"filled":true},{"type":"Foundation","cx":-13.194524944705082,"cy":-3.7517234810804703,"cz":0.05,"lx":4.724839965236282,"ly":9.227617734475299,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vQQ15yke8RSPKZiM6iV1gf","textureType":"Foundation Texture #1","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","cx":-1.1428938383677334,"cy":2.0741127418694787,"cz":0,"lx":4.5,"ly":0.3,"lz":5.812802766367991,"relativeAngle":4.71238898038469,"leftPoint":[-1.1428938383677334,4.324112741869479,0.1],"rightPoint":[-1.1428938383677334,-0.1758872581305213,0.1],"leftJoints":["9UyBScab4vxjAdrfwjXhxP"],"rightJoints":["6U3sDe4yzT2QH8iRY62SdZ"],"textureType":"Wall Texture Default","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"1F9rbQh1mAYkQprzoxJ12Q","color":"#f44e3b","roofId":"9Jb55MpdEHfaQRtH1w8w7c","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5.812802766367991,"rightUnfilledHeight":3.4823963079433295,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":0.1071061616322666,"cy":4.324112741869479,"cz":0,"lx":2.5,"ly":0.3,"lz":5.812802766367991,"relativeAngle":3.141592653589793,"leftPoint":[1.3571061616322666,4.324112741869479,0.1],"rightPoint":[-1.1428938383677334,4.324112741869479,0.1],"leftJoints":["vy2WJt6CvVCYvqCPAeFYe5"],"rightJoints":["1F9rbQh1mAYkQprzoxJ12Q"],"textureType":"Wall Texture Default","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"9UyBScab4vxjAdrfwjXhxP","color":"#f44e3b","roofId":"9Jb55MpdEHfaQRtH1w8w7c","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"centerRoofHeight":[0,6.662549619276321],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.238894569131756,"rightUnfilledHeight":4.238894569131756,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":1.3571061616322666,"cy":2.0741127418694787,"cz":0,"lx":4.5,"ly":0.3,"lz":5.812802766367991,"relativeAngle":1.5707963267948966,"leftPoint":[1.3571061616322666,-0.1758872581305213,0.1],"rightPoint":[1.3571061616322666,4.324112741869479,0.1],"leftJoints":["6U3sDe4yzT2QH8iRY62SdZ"],"rightJoints":["9UyBScab4vxjAdrfwjXhxP"],"textureType":"Wall Texture Default","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"vy2WJt6CvVCYvqCPAeFYe5","color":"#f44e3b","roofId":"9Jb55MpdEHfaQRtH1w8w7c","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.596810400573552,"rightUnfilledHeight":5.812802766367991,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":0.1071061616322666,"cy":-0.1758872581305213,"cz":0,"lx":2.5,"ly":0.3,"lz":5.812802766367991,"relativeAngle":0,"leftPoint":[-1.1428938383677334,-0.1758872581305213,0.1],"rightPoint":[1.3571061616322666,-0.1758872581305213,0.1],"leftJoints":["1F9rbQh1mAYkQprzoxJ12Q"],"rightJoints":["vy2WJt6CvVCYvqCPAeFYe5"],"textureType":"Wall Texture Default","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"6U3sDe4yzT2QH8iRY62SdZ","color":"#f44e3b","roofId":"9Jb55MpdEHfaQRtH1w8w7c","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"centerRoofHeight":[0,6.662549619276321],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.6595021394542453,"rightUnfilledHeight":3.6595021394542453,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["1F9rbQh1mAYkQprzoxJ12Q"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"9Jb55MpdEHfaQRtH1w8w7c","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":true,"rise":0.8497468529083303,"ceiling":false},{"type":"Wall","cx":-1.1202290403576152,"cy":2.071621897384918,"cz":0,"lx":4.5,"ly":0.3,"lz":5.812802766367991,"leftJoints":["1nb1rRhk5XTwkqRDvamK5g"],"rightJoints":["3LCPjAAvYioWiSGfdrWDra"],"leftPoint":[-1.1202290403576152,4.321621897384919,0.1],"rightPoint":[-1.1202290403576152,-0.17837810261508213,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"bpwfKUJNQLVoQQHt2xqi72","parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"roofId":"3RtfyZgDoXZ3wGixrorVUM","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5.812802766367991,"rightUnfilledHeight":3.2790718567695616,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":0.12977095964238483,"cy":4.321621897384919,"cz":0,"lx":2.5,"ly":0.3,"lz":5.812802766367991,"leftJoints":["mMwirEeb4r8mhYQ7E9qdX2"],"rightJoints":["bpwfKUJNQLVoQQHt2xqi72"],"leftPoint":[1.3797709596423848,4.321621897384919,0.1],"rightPoint":[-1.1202290403576152,4.321621897384919,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"1nb1rRhk5XTwkqRDvamK5g","parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"roofId":"3RtfyZgDoXZ3wGixrorVUM","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"centerRoofHeight":[0,6.6628027663679905],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.6979530221307058,"rightUnfilledHeight":3.6979530221307058,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":1.3797709596423848,"cy":2.071621897384918,"cz":0,"lx":4.5,"ly":0.3,"lz":5.812802766367991,"leftJoints":["3LCPjAAvYioWiSGfdrWDra"],"rightJoints":["1nb1rRhk5XTwkqRDvamK5g"],"leftPoint":[1.3797709596423848,-0.17837810261508213,0.1],"rightPoint":[1.3797709596423848,4.321621897384919,0.1],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"mMwirEeb4r8mhYQ7E9qdX2","parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"roofId":"3RtfyZgDoXZ3wGixrorVUM","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.3444620413364214,"rightUnfilledHeight":5.812802766367991,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Wall","cx":0.12977095964238483,"cy":-0.17837810261508213,"cz":0,"lx":2.5,"ly":0.3,"lz":5.812802766367991,"leftJoints":["bpwfKUJNQLVoQQHt2xqi72"],"rightJoints":["mMwirEeb4r8mhYQ7E9qdX2"],"leftPoint":[-1.1202290403576152,-0.17837810261508213,0.1],"rightPoint":[1.3797709596423848,-0.17837810261508213,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"3LCPjAAvYioWiSGfdrWDra","parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"roofId":"3RtfyZgDoXZ3wGixrorVUM","leftRoofHeight":5.812802766367991,"rightRoofHeight":5.812802766367991,"centerRoofHeight":[0,6.6628027663679905],"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.203916013233736,"rightUnfilledHeight":3.203916013233736,"leftTopPartialHeight":5.812802766367991,"rightTopPartialHeight":5.812802766367991},{"type":"Foundation","cx":-5.154384285489001,"cy":-3.843449030047704,"cz":0.05,"lx":5.245611715983199,"ly":9.222636045506174,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mJVE3dD5FuAaHn4NaQUVru","selected":false,"textureType":"Foundation Texture #1","locked":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","wallsId":["bpwfKUJNQLVoQQHt2xqi72"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mJVE3dD5FuAaHn4NaQUVru","foundationId":"mJVE3dD5FuAaHn4NaQUVru","id":"3RtfyZgDoXZ3wGixrorVUM","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"locked":true,"rise":0.85,"ceiling":false},{"type":"Window","cx":0.019999999999999997,"cy":0.1,"cz":0.35266980188300795,"lx":0.44000000000000006,"ly":0.3,"lz":0.22364426460873682,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"3LCPjAAvYioWiSGfdrWDra","foundationId":"mJVE3dD5FuAaHn4NaQUVru","id":"nEpoC7XwMto4CjwuGq3WQ5","mullionSpacing":0.6,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3607208764315504,"lx":0.4,"ly":0.3,"lz":0.24194892545145757,"selected":false,"showLabel":false,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6U3sDe4yzT2QH8iRY62SdZ","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"izgEX4RP4fMzobDmWztBrf","mullionSpacing":0.6,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"locked":true,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-9.128472071553885,"cy":-5.731921555180726,"cz":0.05,"lx":10.661429059004004,"ly":5.310443804879643,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jjxHg8QgQHBYMPjmTLKh9Y","textureType":"No Foundation Texture","locked":true,"notBuilding":true},{"type":"Wall","cx":-3.055204431580803,"cy":-1.835109259524482,"cz":0,"lx":1.8466260644079497,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-3.9785174637847778,-1.8351092595244811,0.1],"rightPoint":[-2.131891399376828,-1.835109259524483,0.1],"relativeAngle":6.283185307179585,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"wyasgQhDU8TZWAHXXtnR4J","parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.3,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-3.9785174637847778,"cy":-0.160751432682531,"cz":0.5175200861571223,"lx":3.3487156536839,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-3.9785174637847796,1.513606394159419,0.1],"rightPoint":[-3.9785174637847778,-1.8351092595244811,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"6Hv4mJv5hCRGAqNa8Wf45B","parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.3,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.7895023054362934,"rightTopPartialHeight":0.7895023054362934},{"type":"Wall","cx":3.9728241996527984,"cy":-0.16075143268253278,"cz":0.5732895465300347,"lx":3.3487156536839007,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[3.9728241996527993,-1.835109259524483,0.1],"rightPoint":[3.9728241996527984,1.5136063941594173,0.1],"relativeAngle":1.570796326794897,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"1fR31M3LuxWCDraA3p4mZU","parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.3,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.847582665593212,"rightTopPartialHeight":0.847582665593212},{"type":"Wall","cx":2.997153367934011,"cy":-1.835109259524483,"cz":0,"lx":1.951341663437577,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[2.0214825362152222,-1.835109259524483,0.1],"rightPoint":[3.9728241996527993,-1.835109259524483,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"iUM2Ms6kj53m7TzQjPhH62","parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","wallStructure":"Stud","opacity":0,"selected":false,"locked":true,"structureSpacing":0.3,"structureWidth":0.05,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Foundation","cx":-1.6211500807426074,"cy":0.8631023553389863,"cz":0.05,"lx":4.818228793661425,"ly":2.663944474302019,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1tKxhv9RZ3WGSr4yfyFtGe","textureType":"No Foundation Texture","locked":true,"notBuilding":true},{"type":"Wall","cx":-0.7514450867052019,"cy":0.5637297015144593,"cz":0,"lx":1.5028901734104034,"ly":0.25,"lz":9,"relativeAngle":3.141592653589793,"leftPoint":[-2.6696692384049984e-16,0.5637297015144593,0],"rightPoint":[-1.5028901734104037,0.5637297015144593,0],"leftJoints":["188rdr57sdmGcfGiDQEznS"],"rightJoints":["t7nvzQnWvPgJFKi8qM2KJ2"],"textureType":"Wall Texture #3","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","foundationId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"nzDmLXy4XJEJgippavtWPK","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":0.00011804109969691571,"cy":-0.1412546603508431,"cz":0,"lx":1.4099687434951584,"ly":0.25,"lz":9,"relativeAngle":1.5709637646913654,"leftPoint":[0.00023608219939409838,-0.8462390222161456,0],"rightPoint":[-2.6696692384049984e-16,0.5637297015144593,0],"leftJoints":["bKLADc1rtEXxLWJ2wpXCyG"],"rightJoints":["nzDmLXy4XJEJgippavtWPK"],"textureType":"Wall Texture #3","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","foundationId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"188rdr57sdmGcfGiDQEznS","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-1.5028901734104037,"cy":-0.14093242537861483,"cz":0,"lx":1.4093242537861483,"ly":0.25,"lz":9,"relativeAngle":-1.5707963267948966,"leftPoint":[-1.5028901734104037,0.5637297015144593,0],"rightPoint":[-1.5028901734104037,-0.845594552271689,0],"leftJoints":["nzDmLXy4XJEJgippavtWPK"],"rightJoints":["bKLADc1rtEXxLWJ2wpXCyG"],"textureType":"Wall Texture #3","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","foundationId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"t7nvzQnWvPgJFKi8qM2KJ2","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.7702585421996653,"rightUnfilledHeight":3.7702585421996653,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-0.7513270456055048,"cy":-0.8459167872439173,"cz":0,"lx":1.5031263937690138,"ly":0.25,"lz":9,"relativeAngle":-0.0004287530089774864,"leftPoint":[-1.5028901734104037,-0.845594552271689,0],"rightPoint":[0.00023608219939409838,-0.8462390222161456,0],"leftJoints":["t7nvzQnWvPgJFKi8qM2KJ2"],"rightJoints":["188rdr57sdmGcfGiDQEznS"],"textureType":"Wall Texture #3","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","foundationId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"bKLADc1rtEXxLWJ2wpXCyG","locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Tree","name":"Dogwood","flip":true,"cx":-17.829756210687247,"cy":-6.178261442103567,"cz":0,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"sgSHG9SfkfzrTceiA5T19b","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":-14.43393823103578,"cy":-4.956583187921545,"cz":0,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"fwbwXjTKB4ejYpnXGBAaQt","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":-4.4821432852704675,"cy":0.4495990226501192,"cz":0.05999999865889549,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"24FmLU3mJkXNY53JzrL5Dt","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":-4.910500041352744,"cy":0.9540476712796391,"cz":0.05999999865889549,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"reEeBmqCcbQu2EtMT38ywZ","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":4.9562085665626325,"cy":1.0667527129983299,"cz":0.05999999865889549,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"o3P5EpuHXdx6pH3hYkfv1R","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":4.317403660851184,"cy":0.4787676966756642,"cz":0.05999999865889727,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"3LVtMLU8sBDE9SYSdKtA6S","selected":false,"locked":true},{"type":"Flower","name":"White Flower","cx":5.530912218683256,"cy":1.5116578930650046,"cz":0.05999999865889549,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"2Y1swCnkjr3jQPeteyJshF","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":4.806452300697741,"cy":1.744166442984243,"cz":0.05999999865889727,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"8t9PQbZw572ixzdS9MRLLW","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":4.291768127996638,"cy":1.3247562673381097,"cz":0.05999999865889549,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"4JVL5x9cWyH4LksfSY1fX3","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":4.661246706636892,"cy":1.5508003603072646,"cz":0.05999999865889549,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"nGnmCTUqQFz7isWWpWK3Mz","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":-0.33218746630730145,"cy":-0.5494864663355421,"cz":0.05000000074505895,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vQQ15yke8RSPKZiM6iV1gf","id":"gZ9m1tT2VUgZsBDcfZh8HW","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":-4.244159478853515,"cy":1.7707434623377676,"cz":0.05999999865889549,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"9SxVYH5WbgA3HtDCqqfPhx","selected":false,"locked":true},{"type":"Flower","name":"Bellflower","cx":-4.802140374248943,"cy":1.496640607591619,"cz":0.05999999865889549,"lx":0.4,"lz":0.8,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"bJusUpxFXhNuVLWkwSgPDp","selected":false,"locked":true},{"type":"Flower","name":"Boxwood","flip":true,"cx":-4.49997835962516,"cy":-1.1855861204384208,"cz":0.06,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"abgyaezp654EktrPW99LBw","selected":false,"locked":true},{"type":"Flower","name":"Boxwood","cx":4.432083177417134,"cy":-1.2772922274665977,"cz":0.06,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"7MNjP1XvBJBd9d5PFunfnH","selected":false,"locked":true},{"type":"Flower","name":"Hibiscus","flip":true,"cx":-7.116951685811008,"cy":3.638352633555244,"cz":0.04152001813054085,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"1FPVPX2cPwyJtX2iR6TB6X","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":1.182265720860439,"cy":-0.23022475718108382,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1tKxhv9RZ3WGSr4yfyFtGe","id":"qbSQDtvRnmoWesph95KY9z","selected":false,"locked":true},{"type":"Human","name":"Jade","cx":-3.033395250022613,"cy":-0.5816610420513619,"cz":0.05999999865889549,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"mtu9ruoaP4m3bTDiUvwuGN","selected":false,"ly":0.48,"locked":true,"flip":true},{"type":"Human","name":"Jose","cx":-16.76731141531199,"cy":-10.548882253809875,"cz":-1.7763568394002505e-15,"lx":2,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"96NHdfhp3jEHitMi3f3E5K","selected":false,"ly":2,"locked":true,"flip":true},{"type":"Flower","name":"Hibiscus","cx":-7.181651324625273,"cy":-1.60099461837087,"cz":0.04152001813054085,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"dVDLRSyAD2wDbGWk4knF4E","selected":false,"locked":true},{"type":"Tree","name":"Magnolia","cx":1.620258691481478,"cy":-5.240948297707899,"cz":4.440892098500626e-16,"lx":5.556994802603297,"lz":7.996988894474121,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"oELXz144CkaWe2X3qoRnK8","selected":false,"locked":true},{"type":"Human","name":"Jaye","cx":-1.4302201700943762,"cy":-2.031152248382565,"cz":0.04943574334705669,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"irBooVothSqri1n99D7Wzu","id":"gr5QDB4cbkGum8zoHp2N7d","selected":false,"locked":true,"ly":0.55},{"type":"Tree","name":"Dogwood","cx":-8.836300989612065,"cy":6.666048417776266,"cz":0.0415200181305444,"lx":3,"lz":4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tirzAP1CYKccDFYsQijz2n","selected":false,"locked":true},{"type":"Window","cx":-0.008333333333333331,"cy":0.1,"cz":-0.009152330421360376,"lx":0.08333333333333333,"ly":0.3,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.9,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n8fVvNLwh7c4hGNqS46E2j","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":true,"showRight":true,"color":"#4d4d4d","width":0.3},"selected":false,"windowType":"Default","archHeight":1,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gambrel","roofStructure":"Default","wallsId":["2RETAxyRMzZBEQkBGms56R"],"textureType":"Roof Texture #1","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"p1WWYMY9TmVyswdgfSEZfZ","rise":3.266478772745814,"ceiling":false,"frontRidgePoint":[0.35,0.5],"backRidgePoint":[0.35,0.5],"topRidgePoint":[0,1],"locked":true},{"type":"Window","cx":-4.213281959601948,"cy":-2.634538118666024,"cz":4.673359172167364,"lx":2.1500259275083913,"ly":0.15,"lz":1.2358639032447665,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"bAFTA4vJ8U4gd3hFz74r7X","locked":true,"interior":true,"empty":true},{"type":"Window","cx":-4.195476233446163,"cy":-1.505374843371567,"cz":5.4714739316244385,"lx":2.170306524786385,"ly":0.15,"lz":1.415052250899271,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.4430521468850588,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"5CQw4ehLx6bYSBiyfowUgp","locked":true,"interior":true,"empty":true,"polygonTop":[0.041335690072458735,2.1804081724852833]},{"type":"Window","cx":3.9865243272197457,"cy":-2.690596399748453,"cz":4.611291413814264,"lx":2.264658675515979,"ly":0.15,"lz":1.4006562758537777,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"73WXvEpNVy6WMicsQVtM4K","locked":true,"interior":true,"empty":true},{"type":"Window","cx":4.003502641451691,"cy":-1.5436235422141884,"cz":5.453324368976082,"lx":2.2758545278519184,"ly":0.15,"lz":1.4725562648663195,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.4430521468850588,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"6sSeyqhkrkXd9xruJTto55","locked":true,"interior":true,"polygonTop":[-0.03456014333676215,2.044626136017569],"empty":true},{"type":"Window","cx":-0.14301293626591338,"cy":-3.0760156278277453,"cz":4.184555041396983,"lx":2.492322842531612,"ly":0.15,"lz":2.5010692402560784,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"roHftPtnfwZguzJ6CGy1u1","locked":true,"interior":true},{"type":"Door","cx":-0.1269230769230768,"cy":0,"cz":-0.032608695652173926,"lx":0.7153846153846152,"ly":0,"lz":0.9347826086956521,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"mjYXviVCxSp5wKZomZ1KXX","interior":true,"locked":true},{"type":"Door","cx":0.12692307692307694,"cy":0,"cz":-0.032608695652173926,"lx":0.7153846153846154,"ly":0,"lz":0.9347826086956521,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"gVuhwxMRjqj8Y5dEW4h6yb","locked":true,"interior":true},{"type":"Window","cx":-0.18164384373242548,"cy":-2.1763353010978204,"cz":5.153093457763647,"lx":2.4530899553344963,"ly":0.15,"lz":0.021492949604609426,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0,"uValue":2,"normal":[0,-1,0],"rotation":[0.4430521468850588,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"8dL9pADpGdb8uz3jgoQ35W","locked":true,"interior":true,"polygonTop":[-0.02050328365131785,3.3532324030149554]},{"type":"Window","cx":1.445462406762685,"cy":-3.8750343198078783,"cz":3.2998811246118693,"lx":0.6642965558015783,"ly":0.15,"lz":0.13029717559155046,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"qWHrnb8KKMoQRor3JnSQFU","polygonTop":[-0.5,2.3784236921544717],"interior":true,"empty":true,"locked":true},{"type":"Window","cx":-1.8155222162706668,"cy":-3.9009770076057917,"cz":3.2711573670121106,"lx":0.6830097672938518,"ly":0.15,"lz":0.037173765084373096,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.836227776804661,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"cCVV5LBTueLCRBh8Qiucqm","polygonTop":[0.5,2.451948768657457],"interior":true,"empty":true,"locked":true},{"type":"Window","cx":-1.1953590455988037,"cy":3.710975210631405,"cz":5.8617143628039825,"lx":1.3882703649523895,"ly":0.1,"lz":0.05964604677957688,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5971766580926772,0,4.71238898038469],"parentId":"3RtfyZgDoXZ3wGixrorVUM","parentType":"Roof","foundationId":"mJVE3dD5FuAaHn4NaQUVru","id":"uj3hhpNKwSAcHZfWCq9Luv","interior":true,"empty":true,"polygonTop":[-0.5,1.197404893567288],"locked":true},{"type":"Door","cx":0,"cy":0,"cz":-0.40052979348664974,"lx":0.1,"ly":0,"lz":0.19894041302670049,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"onpRTR6aYFESxEyAVVtKxv","locked":true,"interior":true},{"type":"Window","cx":1.4673866142968786,"cy":3.7373739092900653,"cz":5.853224121202935,"lx":1.2289614765652717,"ly":0.1,"lz":0.027992846261972834,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5971766580926772,0,1.5707963267948966],"parentId":"3RtfyZgDoXZ3wGixrorVUM","parentType":"Roof","foundationId":"mJVE3dD5FuAaHn4NaQUVru","id":"x86g7FJRWVhpFuUj55vS2u","polygonTop":[0.5,1.2696169168418234],"empty":true,"interior":true,"locked":true},{"type":"Window","cx":-1.8854196712406885,"cy":1.377621465687576,"cz":4.325544482383382,"lx":3.1362291179665966,"ly":0.1,"lz":1.8233213544103637,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.218733394523589,0,-1.5707963267948966],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"mX7yGqS9yHFcCXD3HzPsqo","interior":true,"empty":true,"locked":true},{"type":"Window","cx":1.57237554916422,"cy":1.3657152285229026,"cz":4.2503725201405285,"lx":3.1993051559264813,"ly":0.1,"lz":1.9446887668441453,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.2187333945235876,0,1.5707963267948963],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"7HdybnBrpZ9pZKTsQWmnxm","interior":true,"empty":true,"locked":true},{"type":"Window","cx":1.1953670575332103,"cy":1.4635343025462166,"cz":5.223257241936748,"lx":2.975761109246804,"ly":0.1,"lz":0.0858565540829778,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8621416327956242,0,1.5707963267948963],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"fq4riipVcz1YXRCRFinfh9","polygonTop":[0.5,1.8067884811337014],"empty":true,"interior":true,"locked":true},{"type":"Window","cx":-1.5078124165602862,"cy":1.6184244215922492,"cz":5.256172313894667,"lx":2.757238648211566,"ly":0.1,"lz":0.157707537509605,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.8621416327956238,0,4.71238898038469],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"8uYxv4QmwRV4QGvGAmTGjh","interior":true,"empty":true,"polygonTop":[-0.5,1.6411153230617954],"locked":true},{"type":"Window","cx":1.9241586401335837,"cy":-1.0071004651436564,"cz":3.2927958540885793,"lx":1.433257415263137,"ly":0.1,"lz":0.013334330641535795,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.2187333945235888,0,1.570796326794896],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"eKtQtrVKNAyECAnnFakYcM","interior":true,"empty":true,"polygonTop":[0.5,1.8703231446359028],"locked":true},{"type":"Window","cx":-2.1759330536672916,"cy":-0.9097092686724473,"cz":3.5347479849708097,"lx":1.401447790844605,"ly":0.1,"lz":0.1563290290003139,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.218733394523589,0,-1.5707963267948966],"parentId":"p1WWYMY9TmVyswdgfSEZfZ","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"bscMEhqajcMX1VR8jmUamz","interior":true,"polygonTop":[-0.5,1.6499601679714657],"locked":true},{"type":"Window","cx":-1.1488249093401395,"cy":3.6694840938188165,"cz":5.908770839253448,"lx":1.465482126287153,"ly":0.1,"lz":0.011624696831896512,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5970381619598664,0,4.71238898038469],"parentId":"9Jb55MpdEHfaQRtH1w8w7c","parentType":"Roof","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"voXoMmK9hgrALZQEVrCQw5","interior":true,"polygonTop":[-0.5,1.1791221277328057],"locked":true},{"type":"Window","cx":1.4545359523843153,"cy":3.6687614111197395,"cz":5.846570239911134,"lx":1.494871028893363,"ly":0.1,"lz":0.000005533992709237107,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5970381619598664,0,1.5707963267948966],"parentId":"9Jb55MpdEHfaQRtH1w8w7c","parentType":"Roof","foundationId":"vQQ15yke8RSPKZiM6iV1gf","id":"njHN3bGKJaNcsPt3zqUDGM","polygonTop":[0.5,1.3683506058769899],"locked":true},{"type":"Foundation","cx":-9.019380791884265,"cy":-6.4970289405032915,"cz":0.06,"lx":13.017853790376485,"ly":4.062304674420269,"lz":0.12,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"#808080","textureType":"Foundation Texture #2","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"irBooVothSqri1n99D7Wzu","notBuilding":true,"locked":true},{"type":"Wall","cx":-0.002846632065990562,"cy":1.5136063941594182,"cz":0,"lx":7.951341663437577,"ly":0.3,"lz":3.12,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0,"rValue":2,"fill":"Empty","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.6465790930600694,"rightTopPartialHeight":0.6465790930600694,"relativeAngle":3.141592653589793,"leftPoint":[3.9728241996527984,1.5136063941594173,0.1],"rightPoint":[-3.9785174637847796,1.513606394159419,0.1],"leftJoints":["kGep2Ez1jSGfeVaiQD6Nk1"],"rightJoints":["jQqGH4ZZuR2sJEjqAtaMdR"],"textureType":"Wall Texture Default","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"rTXZg1jcKPDTpopSQL5CRv","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vFgo3dzFcDvifutsURLSxs","leftRoofHeight":3.12,"rightRoofHeight":3.12,"locked":true},{"type":"Wall","cx":3.9728241996527984,"cy":-0.16075143268253278,"cz":0,"lx":3.3487156536839007,"ly":0.3,"lz":3.12,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.3,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.6465790930600694,"rightTopPartialHeight":0.6465790930600694,"relativeAngle":1.570796326794897,"leftPoint":[3.9728241996527993,-1.835109259524483,0.1],"rightPoint":[3.9728241996527984,1.5136063941594173,0.1],"leftJoints":["keZvZnZ8iUxAQcoKMHvMJB"],"rightJoints":["rTXZg1jcKPDTpopSQL5CRv"],"textureType":"Wall Texture Default","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"kGep2Ez1jSGfeVaiQD6Nk1","structureSpacing":1.7,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vFgo3dzFcDvifutsURLSxs","leftRoofHeight":3.12,"rightRoofHeight":3.12,"locked":true},{"type":"Wall","cx":-3.9785174637847778,"cy":-0.160751432682531,"cz":0,"lx":3.3487156536839,"ly":0.3,"lz":3.12,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.3,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.6465790930600694,"rightTopPartialHeight":0.6465790930600694,"relativeAngle":4.71238898038469,"leftPoint":[-3.9785174637847796,1.513606394159419,0.1],"rightPoint":[-3.9785174637847778,-1.8351092595244811,0.1],"leftJoints":["rTXZg1jcKPDTpopSQL5CRv"],"rightJoints":["keZvZnZ8iUxAQcoKMHvMJB"],"textureType":"Wall Texture Default","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"jQqGH4ZZuR2sJEjqAtaMdR","structureSpacing":1.7,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vFgo3dzFcDvifutsURLSxs","leftRoofHeight":3.12,"rightRoofHeight":3.12,"locked":true},{"type":"Wall","cx":-0.0028466320659887856,"cy":-1.835109259524482,"cz":0,"lx":7.951341663437577,"ly":0.3,"lz":3.12,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.3,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.6465790930600694,"rightTopPartialHeight":0.6465790930600694,"relativeAngle":0,"leftPoint":[-3.9785174637847778,-1.8351092595244811,0.1],"rightPoint":[3.9728241996527993,-1.835109259524483,0.1],"leftJoints":["jQqGH4ZZuR2sJEjqAtaMdR"],"rightJoints":["kGep2Ez1jSGfeVaiQD6Nk1"],"textureType":"Wall Texture Default","color":"#ffffff","volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"keZvZnZ8iUxAQcoKMHvMJB","structureSpacing":1.95,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vFgo3dzFcDvifutsURLSxs","leftRoofHeight":3.12,"rightRoofHeight":3.12,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.5816829802762808,"thickness":0.1,"rValue":2,"color":"#454769","sideColor":"#ffffff","textureType":"Roof Texture #1","roofType":"Hip","roofStructure":"Default","wallsId":["kGep2Ez1jSGfeVaiQD6Nk1"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jjxHg8QgQHBYMPjmTLKh9Y","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"vFgo3dzFcDvifutsURLSxs","leftRidgeLength":-1.5743578268419502,"rightRidgeLength":1.6693578268419502,"locked":true},{"type":"Window","cx":1.8566011256825674,"cy":0.6599329242183138,"cz":3.5487146962420235,"lx":1.5566850872614637,"ly":0.1,"lz":0.002654387077510697,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.13521473007536366,0,1.5707963267948968],"parentId":"vFgo3dzFcDvifutsURLSxs","parentType":"Roof","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"rihytw1YgyZTRTywNknqYW","polygonTop":[0.5,1.775657673942406],"locked":true},{"type":"Window","cx":-1.819837767636188,"cy":0.6880180791747286,"cz":3.5544907008722126,"lx":1.5263724499901699,"ly":0.1,"lz":0.026357656056318596,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.13521473007536366,0,-1.5707963267948961],"parentId":"vFgo3dzFcDvifutsURLSxs","parentType":"Roof","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"stDHx7ttyun3AsgaRa1QHp","polygonTop":[-0.5,1.8110420094651125],"locked":true},{"type":"Window","cx":0.020163528741469428,"cy":-0.10759934471036203,"cz":3.552336576069286,"lx":3.53497207600787,"ly":0.1,"lz":0.05477306389188632,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.16246888891658018,0,-4.440892098500626e-16],"parentId":"vFgo3dzFcDvifutsURLSxs","parentType":"Roof","foundationId":"jjxHg8QgQHBYMPjmTLKh9Y","id":"tDydDDQ3yMKBMmcqedWGby","polygonTop":[0.0030579922127344215,1.4843446624982513],"locked":true}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[1.8840441516195205,0.5644717303985555,0.0000011143112580395247],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[1.8840441516195205,0.5634713529449765,150],"theme":"Rural","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-12.358378063755914,-20.87295700480061,2.7360078726027206],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":24.554753263096522,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-7.660890412118296,2.6592379428106594,2.7360078726027206],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5,"navigationView":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":[],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},453:function(e){e.exports=JSON.parse('{"docid":"rrmoe4xsE37DPN5LvoSX2L","time":"08/09/2023 10:13 am","timestamp":1691590424058,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"4/22/2022, 1:30:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":0.06979666348441205,"cy":3.6828701050775523,"cz":2.5,"lx":10.751033569310817,"ly":0.3,"lz":4.88805324936884,"leftJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"rightJoints":["11Ltx28CSTVpm6gjZuBH9w"],"leftPoint":[5.445313448139821,3.682870105077552,0.1],"rightPoint":[-5.305720121170997,3.682870105077553,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n8LvMVp1hZ7BptmwrWpcMT","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"hg8eUTjrNzo4UYNKSxj3Pu","selected":false,"leftRoofHeight":4.88805324936884,"rightRoofHeight":4.88805324936884,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.002373687472664,"rightUnfilledHeight":4.002373687472664,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Wall","cx":5.445313448139816,"cy":0.4275597826751323,"cz":2.2301039869226305,"lx":6.510620644804842,"ly":0.3,"lz":4.88805324936884,"leftJoints":["hndwqtrrygFvfqvBJrvZYu"],"rightJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"leftPoint":[5.445313448139813,-2.8277505397272886,0.1],"rightPoint":[5.445313448139821,3.682870105077553,0.1],"relativeAngle":1.5707963267948954,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e5r2Cqz5K28ewHbKWcFnYZ","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"hg8eUTjrNzo4UYNKSxj3Pu","selected":false,"leftRoofHeight":4.88805324936884,"rightRoofHeight":4.88805324936884,"centerRoofHeight":[0,7.235780632005643],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5,"rightUnfilledHeight":5,"leftTopPartialHeight":5,"rightTopPartialHeight":5,"locked":false,"openToOutside":false},{"type":"Wall","cx":-5.305720121170997,"cy":0.4275597826751323,"cz":2.228839888904333,"lx":6.510620644804842,"ly":0.3,"lz":4.88805324936884,"leftJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"rightJoints":["hndwqtrrygFvfqvBJrvZYu"],"leftPoint":[-5.305720121170997,3.682870105077553,0.1],"rightPoint":[-5.305720121170997,-2.8277505397272886,0.1],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"11Ltx28CSTVpm6gjZuBH9w","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"hg8eUTjrNzo4UYNKSxj3Pu","selected":false,"leftRoofHeight":4.88805324936884,"rightRoofHeight":4.88805324936884,"centerRoofHeight":[0,7.235780632005643],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":5,"rightUnfilledHeight":5,"leftTopPartialHeight":5,"rightTopPartialHeight":5,"locked":false,"openToOutside":false},{"type":"Wall","cx":0.06979666348441205,"cy":-2.8277505397272886,"cz":2.268765007024547,"lx":10.751033569310817,"ly":0.3,"lz":4.88805324936884,"leftJoints":["11Ltx28CSTVpm6gjZuBH9w"],"rightJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"leftPoint":[-5.305720121170997,-2.8277505397272886,0.1],"rightPoint":[5.445313448139821,-2.8277505397272886,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hndwqtrrygFvfqvBJrvZYu","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"hg8eUTjrNzo4UYNKSxj3Pu","selected":false,"leftRoofHeight":4.88805324936884,"rightRoofHeight":4.88805324936884,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.224276701112264,"rightUnfilledHeight":4.224276701112264,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false,"openToOutside":false},{"type":"Foundation","cx":0.3157662585983827,"cy":-0.49838170379810354,"cz":0.05,"lx":15.656066884011606,"ly":12.596965835422395,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Human","name":"June","cx":-2.4661903240728087,"cy":-9.006462311217309,"cz":0,"lx":0.65,"ly":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qPhtowBuGGDfEAuEFNhxwt","selected":false,"locked":false},{"type":"Wall","cx":0.14686719191865327,"cy":5.522679083865754,"cz":2.2408122612280286,"lx":13.78718704575697,"ly":0.3,"lz":4.061910717171535,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[7.040460714797138,5.522679083865754,0.12],"rightPoint":[-6.746726330959832,5.522679083865754,0.12],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.06250000000000006,"lx":0.0708994221944815,"ly":0.3,"lz":0.3750000000000001,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729104,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":7.040460714797138,"cy":0.02164780187261517,"cz":2.2301039869226305,"lx":11.002062563986277,"ly":0.3,"lz":4.061910717171535,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[7.040460714797138,-5.479383480120523,0.12],"rightPoint":[7.04046071479714,5.522679083865754,0.12],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":-6.746726330959831,"cy":0.02164780187261517,"cz":2.228839888904333,"lx":11.002062563986277,"ly":0.3,"lz":4.061910717171535,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-6.74672633095983,5.522679083865754,0.12],"rightPoint":[-6.746726330959832,-5.479383480120523,0.12],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":0.14686719191865416,"cy":-5.479383480120523,"cz":2.268765007024547,"lx":13.787187045756973,"ly":0.3,"lz":4.061910717171535,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-6.746726330959832,-5.479383480120523,0.12],"rightPoint":[7.04046071479714,-5.479383480120523,0.12],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.39930090798010054,"cy":0.1,"cz":-0.0484624485645839,"lx":0.072600165087291,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"29QuQvndX2M7Sq4iEkq1Xz","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.21716749210312172,"cy":0.1,"cz":-0.0484624485645839,"lx":0.0738661714047936,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4LUVPCUMNMxJkqRL8wFtEe","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25410057780551853,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"9FGAjvvq6tsggdPdWysCTK","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":-0.06249999999999989,"lx":0.072600165087291,"ly":0.3,"lz":0.3749999999999998,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"ucbeQgKEoSy9dHSmSFvaic","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":0.014266831753957678,"cy":0,"cz":-0.1875,"lx":0.26186699684124864,"ly":0,"lz":0.625,"color":"#73d8ff","textureType":"Door Texture #6","normal":[0,1,0],"rotation":[0,0,0],"id":"wzic8VHyh9MpPw339UYDy4","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"doorType":"Default","archHeight":1,"filled":true,"locked":false},{"id":"22qg2ZvB7t4cVkS2ppWUue","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["roDDPncXBpNgmNum9aUaov"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":2.0309553585857674,"ceiling":false,"locked":false},{"type":"Foundation","cx":0.19669830531017318,"cy":-0.08496072357293061,"cz":0.06,"lx":17.736587385560814,"ly":14.112977894531522,"lz":0.12,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":false,"enableGroupMaster":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Window","cx":0.1816870865194007,"cy":1.506541025906793,"cz":5.744650351161887,"lx":6.810433848205276,"ly":0.2,"lz":3.1501122272271536,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"nRJKnWqaTZMRXNYjQYBBN4","interior":true,"empty":true,"locked":false},{"type":"Window","cx":-4.204012569268376,"cy":2.9463024154168345,"cz":5.213097091560926,"lx":1.8793730345291677,"ly":0.2,"lz":0.10394989944101299,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"dyzgwSBWzQe7d2Mdh1AuFs","interior":true,"polygonTop":[-0.4945055117340491,2.9817139947018276],"empty":true,"locked":false},{"type":"Window","cx":4.5669067733435496,"cy":2.98476727058541,"cz":5.198896044572235,"lx":1.8476822467087874,"ly":0.2,"lz":0.0009475429668261212,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"uhbKNy7GzaCLkkjREuNwq9","polygonTop":[0.5,3.054344986803331],"interior":true,"empty":true,"locked":false},{"type":"Window","cx":0.13914271249375698,"cy":-1.4674024209486225,"cz":5.7431156063968745,"lx":6.808872300840532,"ly":0.2,"lz":3.162055053995225,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"fRAXriArpJwz8vt5qFbBr8","interior":true,"empty":true,"locked":false},{"type":"Window","cx":-4.236438960455537,"cy":-2.8956049895712455,"cz":5.215829810116305,"lx":1.8110462507584613,"ly":0.2,"lz":0.11218491449779774,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100747,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"d2W6C8E4fV5E9D474375zw","empty":true,"interior":true,"polygonTop":[0.4883725105977682,2.9617114188962397],"locked":false},{"type":"Window","cx":4.521733506737581,"cy":-2.9083363875263974,"cz":5.211129436754687,"lx":1.8533938312525375,"ly":0.2,"lz":0.0727447886791959,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.35367200616100725,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"hZSdDLaVahbQNDSPFMa22P","polygonTop":[-0.5,2.97886505236164],"interior":true,"empty":true,"locked":false},{"type":"Window","cx":5.579385297453698,"cy":0.038450512915636725,"cz":5.156923892280704,"lx":5.893522919746983,"ly":0.2,"lz":0.06575238683701148,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.518907643929702,0,1.5707963267948963],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"whfKWvVSZ8Zpig8MXVtDnn","polygonTop":[-0.004256210920065387,2.2474023195155906],"interior":true,"empty":true,"locked":false},{"id":"hg8eUTjrNzo4UYNKSxj3Pu","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":3.810423621996117,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofType":"Gable","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["hndwqtrrygFvfqvBJrvZYu"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rise":2.3477273826368026,"ceiling":false,"locked":false},{"type":"Window","cx":-5.210239899855391,"cy":0.02428974701914899,"cz":5.199992048011484,"lx":5.892196685663338,"ly":0.2,"lz":0.03913490008238186,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.05,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.518907643929702,0,4.71238898038469],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"nSDYeeSFt1TkoA9AsVzFvv","polygonTop":[-0.006026915919198358,2.136722376968723],"interior":true,"empty":true,"locked":false},{"type":"Window","cx":0.0041783865768951906,"cy":0.3,"cz":0.7431852609403766,"lx":0.151429262766099,"ly":0.3,"lz":0.2863705218807532,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"e5r2Cqz5K28ewHbKWcFnYZ","parentType":"Wall","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"2Z4ZTK92xYT6s7pAjiT6th","locked":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.7391715106470117,"lx":0.15978603591988938,"ly":0.3,"lz":0.27834302129402333,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"11Ltx28CSTVpm6gjZuBH9w","parentType":"Wall","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"cAmpTqjyXxbvZVGVCwC6f3","locked":false}],"sceneRadius":12,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[3.13462208385991,0.12570156647960654,-6.336761576329169e-7],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[3.13462208385991,0.12470118903347407,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[12.594616653747995,-17.492939317320165,4.593155797112493],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":15.475618750000006,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.1945052133063472,0.596243023398342,1.0070484500451025],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":240,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"designProjectType":null,"notes":["Dutch gable roof"],"minimumNavigationMoveSpeed":3,"minimumNavigationTurnSpeed":3}')},454:function(e){e.exports=JSON.parse('{"docid":"iRonP6f82ihBcmjezX6Awd","time":"03/20/2023 10:32 pm","timestamp":1679365946442,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":-0.48795103908913395,"cy":4.769352133858485,"cz":2.2408122612280286,"lx":9.470897735981776,"ly":0.3,"lz":1,"leftJoints":["vKjEHsN5hVHi8S9tPzBesN"],"rightJoints":["eTKLP2TockjZDP1RLDKvpj"],"leftPoint":[4.247497828901754,4.769352133858485,0],"rightPoint":[-5.223399907080022,4.769352133858485,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"o6RrXLKTD62SEJEe7jE1pv","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":1,"rightRoofHeight":1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"centerRoofHeight":[0,9.714205250083014],"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":4.2474978289017535,"cy":0.49244353247458017,"cz":2.2301039869226305,"lx":8.55381720276781,"ly":0.3,"lz":1,"leftJoints":["gTaSzURYtieAPQn32pwAn4"],"rightJoints":["o6RrXLKTD62SEJEe7jE1pv"],"leftPoint":[4.247497828901752,-3.7844650689093244,0],"rightPoint":[4.247497828901756,4.769352133858485,0],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"vKjEHsN5hVHi8S9tPzBesN","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":1,"rightRoofHeight":1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-5.2233999070800206,"cy":0.4924435324745795,"cz":2.228839888904333,"lx":8.55381720276781,"ly":0.3,"lz":1,"leftJoints":["o6RrXLKTD62SEJEe7jE1pv"],"rightJoints":["gTaSzURYtieAPQn32pwAn4"],"leftPoint":[-5.2233999070800206,4.769352133858485,0],"rightPoint":[-5.223399907080021,-3.7844650689093258,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"eTKLP2TockjZDP1RLDKvpj","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":1,"rightRoofHeight":1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-0.48795103908913307,"cy":-3.7844650689093253,"cz":2.4372288712998555,"lx":9.470897735981776,"ly":0.3,"lz":1,"leftJoints":["eTKLP2TockjZDP1RLDKvpj"],"rightJoints":["vKjEHsN5hVHi8S9tPzBesN"],"leftPoint":[-5.223399907080021,-3.7844650689093258,0],"rightPoint":[4.247497828901755,-3.7844650689093244,0],"relativeAngle":1.4066962464272472e-16,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"gTaSzURYtieAPQn32pwAn4","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":1,"rightRoofHeight":1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"centerRoofHeight":[0,9.714205250083014],"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Foundation","cx":-0.7626979834308516,"cy":-10.359931683120488,"cz":0.05,"lx":12.251810254872597,"ly":12.332955581960839,"lz":0.1167755799390626,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"enableGroupMaster":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.3,"roofType":"Gable","roofStructure":"Default","wallsId":["eTKLP2TockjZDP1RLDKvpj"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"hV2AZhwpKM9xyypcH54NGK","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":8.714205250083014,"ceiling":false},{"type":"Human","name":"Jaye","cx":-0.5647094530410346,"cy":5.465061158668581,"cz":0.058387789875268936,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","id":"tnC2iecYMhdN7XDrxXs4UT","selected":false,"ly":0.55},{"type":"Window","cx":-0.21478352854197222,"cy":0.1,"cz":1.25,"lx":0.21478352854197222,"ly":0.3,"lz":1.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"cikc5XBeHvW1ZWaYYBURtq","windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":5,"lx":0.21478352854197222,"ly":0.3,"lz":3,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"hzyxe6XmNqQVYTMPwT86gP","windowType":"Default","archHeight":1},{"type":"Window","cx":0.21478352854197222,"cy":0.1,"cz":1.25,"lx":0.21478352854197222,"ly":0.3,"lz":1.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"poKYkVbAKiojUgyQBBM5eo","windowType":"Default","archHeight":1},{"type":"Window","cx":0.010739176427098599,"cy":0.1,"cz":4.8,"lx":0.21478352854197225,"ly":0.3,"lz":3,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"k65HqyHnfGZzC6XJ1tz5nf","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.21478352854197227,"cy":0.1,"cz":1.25,"lx":0.21478352854197227,"ly":0.3,"lz":1.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"iUS6mBnScixGHK4jiNa74q","windowType":"Default","archHeight":1},{"type":"Window","cx":0.21478352854197227,"cy":0.1,"cz":1.25,"lx":0.21478352854197227,"ly":0.3,"lz":1.5,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"gpSRstNVjjcombQpjx6cCS","windowType":"Default","archHeight":1},{"type":"Wall","cx":0.16127924019256784,"cy":2.332251732154486,"cz":2.2408122612280286,"lx":3.686932704592566,"ly":0.3,"lz":3.091798357527264,"leftJoints":["auhnwnZuvqZga1NwTs4Qh6"],"rightJoints":["fbEWRqBAdexGf2BAr7KyDh"],"leftPoint":[2.004745592488851,2.3322517321544853,0.09026163656372185],"rightPoint":[-1.6821871121037153,2.332251732154486,0.09026163656372185],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"kopxVibcARqNdAWExZTDft","parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"nRVwf4unMrCTvV163G9mW8","selected":false,"leftRoofHeight":4.183499794647806,"rightRoofHeight":3.091798357527264,"centerRoofHeight":[-0.5,4.183499794647806],"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.091798357527264,"rightTopPartialHeight":3.091798357527264},{"type":"Wall","cx":2.0047455924888506,"cy":0.21993436134309594,"cz":2.2301039869226305,"lx":4.224634741622781,"ly":0.3,"lz":4.183499794647806,"leftJoints":["7WK6nSdGpz8Z5ugN4DQqPL"],"rightJoints":["kopxVibcARqNdAWExZTDft"],"leftPoint":[2.0047455924888493,-1.8923830094682954,0.09026163656372185],"rightPoint":[2.004745592488852,2.3322517321544853,0.09026163656372185],"relativeAngle":1.5707963267948961,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"auhnwnZuvqZga1NwTs4Qh6","parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"nRVwf4unMrCTvV163G9mW8","selected":false,"leftRoofHeight":4.183499794647806,"rightRoofHeight":4.183499794647806,"fill":"Partial","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.5178364017567816,"rightUnfilledHeight":3.5178364017567816,"leftTopPartialHeight":4.183499794647806,"rightTopPartialHeight":4.183499794647806},{"type":"Wall","cx":-1.6821871121037146,"cy":0.2199343613430946,"cz":2.228839888904333,"lx":4.224634741622782,"ly":0.3,"lz":3.091798357527264,"leftJoints":["kopxVibcARqNdAWExZTDft"],"rightJoints":["7WK6nSdGpz8Z5ugN4DQqPL"],"leftPoint":[-1.6821871121037144,2.332251732154486,0.09026163656372185],"rightPoint":[-1.682187112103714,-1.892383009468295,0.09026163656372185],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"fbEWRqBAdexGf2BAr7KyDh","parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"nRVwf4unMrCTvV163G9mW8","selected":false,"leftRoofHeight":3.091798357527264,"rightRoofHeight":3.091798357527264,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.091798357527264,"rightTopPartialHeight":3.091798357527264},{"type":"Wall","cx":0.16127924019256823,"cy":-1.8923830094682952,"cz":2.4372288712998555,"lx":3.686932704592566,"ly":0.3,"lz":3.091798357527264,"leftJoints":["fbEWRqBAdexGf2BAr7KyDh"],"rightJoints":["auhnwnZuvqZga1NwTs4Qh6"],"leftPoint":[-1.682187112103714,-1.892383009468295,0.09026163656372185],"rightPoint":[2.004745592488851,-1.8923830094682954,0.09026163656372185],"relativeAngle":1.8067425368120646e-16,"textureType":"Wall Texture Default","color":"#e27300","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"7WK6nSdGpz8Z5ugN4DQqPL","parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"nRVwf4unMrCTvV163G9mW8","selected":false,"leftRoofHeight":3.091798357527264,"rightRoofHeight":4.183499794647806,"centerRoofHeight":[0.5,4.183499794647806],"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.091798357527264,"rightTopPartialHeight":3.091798357527264},{"type":"Foundation","cx":4.882244941296917,"cy":-10.70091032804037,"cz":0.05,"lx":5.471984286386839,"ly":6.044552967256032,"lz":0.09026163656372185,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"oabGyAr3D6hSmpBhWPDGqF","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Gable","roofStructure":"Default","wallsId":["fbEWRqBAdexGf2BAr7KyDh"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"oabGyAr3D6hSmpBhWPDGqF","foundationId":"oabGyAr3D6hSmpBhWPDGqF","id":"nRVwf4unMrCTvV163G9mW8","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"rise":0,"ceiling":false},{"type":"Door","cx":-0.01183534271196981,"cy":0,"cz":-0.15296909264162628,"lx":0.4024016522069765,"ly":0,"lz":0.6940618147167474,"textureType":"Door Texture #2","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbEWRqBAdexGf2BAr7KyDh","foundationId":"oabGyAr3D6hSmpBhWPDGqF","id":"nthEKWrtxGs4PSrCWi5GEG","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0.27122816718470794,"cy":0.1,"cz":0,"lx":0.27122816718470794,"ly":0.3,"lz":0.6468727157224915,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kopxVibcARqNdAWExZTDft","foundationId":"oabGyAr3D6hSmpBhWPDGqF","id":"wKDeRMv3UEU8mXGaoDUiWs","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27122816718470794,"cy":0.1,"cz":0,"lx":0.27122816718470794,"ly":0.3,"lz":0.6468727157224915,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#cccccc","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7WK6nSdGpz8Z5ugN4DQqPL","foundationId":"oabGyAr3D6hSmpBhWPDGqF","id":"42U3kN4qWYuxhLNDbwxXrd","windowType":"Default","archHeight":1}],"sceneRadius":21,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.6516049999999995,-8.063611874995965,-0.00000806397029662998],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.6516049999999995,-8.063761881663362,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[13.842271241738974,-28.65293514275273,4.026963629011761],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":37.01235612443423,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-1.977021416592465,-10.783837041816236,3.5213876845072543],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["A-frame house"]}')},455:function(e){e.exports=JSON.parse('{"docid":"bm2bMMbAcph5HBEqZHjndk","time":"03/20/2023 11:03 am","timestamp":1679324587911,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":0.016921335908854303,"cy":4.063374076185866,"cz":2.2408122612280286,"lx":9.470897735981776,"ly":0.3,"lz":8,"leftJoints":["vKjEHsN5hVHi8S9tPzBesN"],"rightJoints":["eTKLP2TockjZDP1RLDKvpj"],"leftPoint":[4.752370203899743,4.063374076185865,0.1167755799390626],"rightPoint":[-4.718527532082034,4.063374076185867,0.1167755799390626],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffd99a","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"o6RrXLKTD62SEJEe7jE1pv","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"centerRoofHeight":[0,14],"fill":"Full","eavesLength":0.5,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":4.752370203899742,"cy":-0.2135345251980382,"cz":2.2301039869226305,"lx":8.55381720276781,"ly":0.3,"lz":8,"leftJoints":["gTaSzURYtieAPQn32pwAn4"],"rightJoints":["o6RrXLKTD62SEJEe7jE1pv"],"leftPoint":[4.75237020389974,-4.490443126581943,0.1167755799390626],"rightPoint":[4.752370203899745,4.063374076185865,0.1167755799390626],"relativeAngle":1.5707963267948961,"textureType":"No Wall Texture","color":"#ffd99a","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"vKjEHsN5hVHi8S9tPzBesN","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-4.718527532082032,"cy":-0.2135345251980388,"cz":2.228839888904333,"lx":8.55381720276781,"ly":0.3,"lz":8,"leftJoints":["o6RrXLKTD62SEJEe7jE1pv"],"rightJoints":["gTaSzURYtieAPQn32pwAn4"],"leftPoint":[-4.718527532082033,4.063374076185867,0.1167755799390626],"rightPoint":[-4.718527532082033,-4.490443126581945,0.1167755799390626],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#ffd99a","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"eTKLP2TockjZDP1RLDKvpj","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":0.016921335908855254,"cy":-4.490443126581944,"cz":2.4372288712998555,"lx":9.470897735981776,"ly":0.3,"lz":8,"leftJoints":["eTKLP2TockjZDP1RLDKvpj"],"rightJoints":["vKjEHsN5hVHi8S9tPzBesN"],"leftPoint":[-4.718527532082033,-4.490443126581945,0.1167755799390626],"rightPoint":[4.752370203899743,-4.490443126581943,0.1167755799390626],"relativeAngle":1.4066962464272472e-16,"textureType":"No Wall Texture","color":"#ffd99a","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"gTaSzURYtieAPQn32pwAn4","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"hV2AZhwpKM9xyypcH54NGK","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"centerRoofHeight":[0,14],"fill":"Full","eavesLength":0.5,"locked":true,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Foundation","cx":0.06778462234397686,"cy":0.11229032412929119,"cz":0.05,"lx":13.261555004868576,"ly":13.821828446550082,"lz":0.1167755799390626,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"enableGroupMaster":true,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.3,"roofType":"Gable","roofStructure":"Default","wallsId":["eTKLP2TockjZDP1RLDKvpj"],"textureType":"Roof Texture Default","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"hV2AZhwpKM9xyypcH54NGK","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":6,"ceiling":false,"sideColor":"#4d4d4d","locked":true},{"type":"Human","name":"Jaye","cx":-5.524403634250389,"cy":5.933912667936443,"cz":0.058387789875268936,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","id":"tnC2iecYMhdN7XDrxXs4UT","selected":false,"ly":0.55,"locked":true},{"type":"Polygon","cx":0.00031866172024926434,"cy":-1.0502280057835613,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":0.00006828465433912113,"y":-0.982449115782449},{"x":0,"y":-1.25},{"x":0,"y":-0.875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"filled":true,"selectedIndex":2,"id":"xmTq7nGfL5qqQp8gvXDYM6","lineColor":"#4d4d4d","lineWidth":2,"locked":true},{"type":"Polygon","cx":0.14078214869407168,"cy":-0.7541666666666667,"cz":0.6437310349973828,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.26396652880138444,"y":-0.875},{"x":0,"y":-0.875},{"x":0.15837991728083065,"y":-0.5125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"kxt6Srxx1T2g9dM5Cj9xjQ","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.09047767660927532,"cy":-5.921189464667502e-15,"cz":0.6771072607245675,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0,"y":-0.875},{"x":-0.26396652880138444,"y":-0.875},{"x":-0.15837991728083065,"y":-0.5125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"oepTS5ZaT38ze93aEUFXCf","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.3273184957137167,"cy":-0.35,"cz":-0.1473145782594516,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.49625707414660275,"y":-0.5},{"x":0.15837991728083065,"y":-0.5},{"x":0.15837991728083065,"y":-0.1875},{"x":0.49625707414660275,"y":-0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"6GCp4VpMJ4zaYZryasBb12","selected":false,"selectedIndex":1,"locked":true},{"type":"Window","cx":0,"cy":0.3,"cz":0.35,"lx":0.21117322304110756,"ly":0.3,"lz":0.24999999999999994,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":0.8499999999999999,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"cPiRHW6SZVJYmoL6piX4rh","locked":true},{"type":"Window","cx":-0.322039165137689,"cy":0.3,"cz":0.35,"lx":0.26396652880138444,"ly":0.3,"lz":0.25,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"oKk1wpnrjFtx7ZScLUWdKG","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3257820909910863,"cy":0.3,"cz":0.35000000000000003,"lx":0.26396652880138444,"ly":0.3,"lz":0.24999999999999994,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"vm61bCHu5wJTneq9mSRG3v","locked":true},{"type":"Polygon","cx":-0.32731849571371674,"cy":-0.34375,"cz":0.07091220488250127,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15837991728083065,"y":-0.5},{"x":-0.49625707414660275,"y":-0.5},{"x":-0.49625707414660275,"y":-0.1875},{"x":-0.15837991728083065,"y":-0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"a2uJiAM1SwWygA7Xks25tx","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.009700144501707204,"cy":0,"cz":0.07091220488250127,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.15837991728083065,"y":-0.5},{"x":-0.15837991728083065,"y":-0.5},{"x":-0.15837991728083065,"y":-0.1875},{"x":0.15837991728083065,"y":-0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"okpxRdBH9UmPzQeBnPqHvV","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.43994421466897404,"cy":-0.10416666666666667,"cz":-0.0908057613542031,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.47513975184249196,"y":-0.125},{"x":0.4223464460822151,"y":-0.125},{"x":0.47513975184249196,"y":-0.0625}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"gnnDsq9utfqbvsSLW4Vsui","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.31675983456166135,"cy":-0.10416666666666667,"cz":-0.0908057613542031,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.4223464460822151,"y":-0.125},{"x":0.3167598345616613,"y":-0.125},{"x":0.3695531403219382,"y":-0.0625}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"daBi7jdbhLYUKfawDVZbRF","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.26396652880138444,"cy":-0.14583333333333334,"cz":0.09889005465479705,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.3167598345616613,"y":-0.125},{"x":0.26396652880138444,"y":-0.1875},{"x":0.21117322304110756,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"83Jx4Wfx1CTQe5o1dVj7Gt","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":-0.31823715865388064,"cy":0,"cz":-0.06254223609465975,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.4223464460822151,"y":-0.125},{"x":0.3695531403219382,"y":-0.1875},{"x":0.3167598345616613,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"2P1Z36zj1PZrLZ5WtCuQLU","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":-0.1528231574478215,"cy":0,"cz":-0.07973264486359,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.47513975184249196,"y":-0.1875},{"x":0.4223464460822151,"y":-0.125},{"x":0.47513975184249196,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"c8iKMXwV5TTJS5y7LAm16z","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.26396652880138444,"cy":-0.10416666666666667,"cz":-0.0264570438192977,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.3167598345616613,"y":-0.125},{"x":0.26396652880138444,"y":-0.0625},{"x":0.21117322304110756,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"4EQtRFUvGwquz82cAGupQx","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":-0.0984129795658402,"cy":0,"cz":0.0741183552861776,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.21117322304110756,"y":-0.125},{"x":0.15837991728083065,"y":-0.1875},{"x":0.10558661152055378,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"keytXy7yjTuyQvCHx43FMf","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":-0.08043767629130923,"cy":-1.1842378929335004e-14,"cz":0.053462400842831936,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.15837991728083065,"y":-0.0625},{"x":0.21117322304110756,"y":-0.125},{"x":0.10558661152055378,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"vcfgXdnGFRF224UmF7C68T","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.05586281472424893,"cy":0,"cz":-0.06415089633102461,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.10558661152055378,"y":-0.125},{"x":0.05279330576027689,"y":-0.1875},{"x":0,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"6L9YHg5xYnPV5wP7pRzMPQ","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.04508436921887703,"cy":-1.1842378929335004e-14,"cz":-0.07958364344414548,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.10558661152055378,"y":-0.125},{"x":0.05279330576027689,"y":-0.0625},{"x":0,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"vFWJZ8BRQAYJsb48YWUz6j","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.12944043805698166,"cy":0,"cz":-0.044015079009130986,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0,"y":-0.125},{"x":-0.05279330576027689,"y":-0.1875},{"x":-0.10558661152055378,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"c9pAfjjQXFGB9FrY3fPcgo","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.1360791344719124,"cy":0,"cz":-0.002668588802964056,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.05279330576027689,"y":-0.0625},{"x":0,"y":-0.125},{"x":-0.10558661152055378,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8hMi9wi8eWGAVCFdCrrHxf","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.1504887203711347,"cy":1.1842378929335004e-14,"cz":-0.03387070431424388,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.10558661152055378,"y":-0.125},{"x":-0.15837991728083065,"y":-0.1875},{"x":-0.21117322304110756,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"1vmj7VNyMLhdjUdvzKBed1","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.2027600334109868,"cy":1.1842378929335004e-14,"cz":-0.02143305207869428,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15837991728083065,"y":-0.0625},{"x":-0.10558661152055378,"y":-0.125},{"x":-0.21117322304110756,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"ffiDmHRPrs2dDPEPn4TWqL","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.3241256214430625,"cy":-1.1842378929335004e-14,"cz":-0.01780218811727341,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.21117322304110756,"y":-0.125},{"x":-0.26396652880138444,"y":-0.1875},{"x":-0.3167598345616613,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"wcidSWb2sESnViCDPV9mWc","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.25617993668706274,"cy":0,"cz":-0.01786081434302994,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.21117322304110756,"y":-0.125},{"x":-0.26396652880138444,"y":-0.0625},{"x":-0.3167598345616613,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"feb2PRU5xBgnQQYi5Q5HxG","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.15105849038732078,"cy":0,"cz":-0.11142936913498758,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.3167598345616613,"y":-0.125},{"x":-0.3695531403219382,"y":-0.1875},{"x":-0.4223464460822151,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8YCxSmg5F51AUWFz5Z7Mcz","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.2903850025394723,"cy":0,"cz":-0.05931035952397312,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.3167598345616613,"y":-0.125},{"x":-0.4223464460822151,"y":-0.125},{"x":-0.3695531403219382,"y":-0.0625}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"br3QNNryqRA4C5JyMif58B","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.2709208200589227,"cy":0,"cz":-0.12433060024345055,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.4223464460822151,"y":-0.125},{"x":-0.47513975184249196,"y":-0.125},{"x":-0.47513975184249196,"y":-0.0625}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"qua38i78SB79351oS944na","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.26414949628329426,"cy":0,"cz":-0.11662195581661955,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.4223464460822151,"y":-0.125},{"x":-0.47513975184249196,"y":-0.1875},{"x":-0.47513975184249196,"y":-0.125}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"vmDWdbEKBTn6Q3L3pv8qqU","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":-0.1231126961021224,"cy":0,"cz":-0.16413364186630847,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.4968716360356549,"y":0.1875},{"x":0.4968716360356549,"y":-0.0625},{"x":0.15899447916988277,"y":-0.0625},{"x":0.15899447916988277,"y":0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8PUhoaNcXfpHS24ebeEAKM","selected":false,"selectedIndex":3,"locked":true},{"type":"Polygon","cx":0.17939465541008254,"cy":1.1842378929335004e-14,"cz":-0.09134585167481035,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.15837991728083065,"y":0.1875},{"x":0.15837991728083065,"y":-0.0625},{"x":-0.15837991728083065,"y":-0.0625},{"x":-0.15837991728083065,"y":0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"bcXX5tcf3D2wVveoEkcL6f","selected":false,"selectedIndex":3,"locked":true},{"type":"Polygon","cx":0.27093529163208646,"cy":0,"cz":-0.23361707380435942,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15837991728083065,"y":0.1875},{"x":-0.15837991728083065,"y":-0.0625},{"x":-0.49625707414660275,"y":-0.0625},{"x":-0.49625707414660275,"y":0.1875}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"6s38KEz9j6GBtEC98qn52U","selected":false,"selectedIndex":3,"locked":true},{"type":"Window","cx":-0.32016770221099033,"cy":0.3,"cz":-0.05625,"lx":0.2677094546547817,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"o7JmF1iLCdGFdtbRj8czNQ","locked":true},{"type":"Window","cx":0.005279330576027693,"cy":0.3,"cz":-0.056249999999999994,"lx":0.22173188419316292,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"gnKEFjjyTpc69CbNkzsSnb","locked":true},{"type":"Window","cx":0.33106142156711393,"cy":0.3,"cz":-0.05624999999999997,"lx":0.25340786764932904,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"itZnbX7dvNW4uttWy8xqNF","locked":true},{"type":"Polygon","cx":0.3273184957137167,"cy":0.2791666666666667,"cz":-0.3574546006707193,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.49625707414660275,"y":0.225},{"x":0.3273184957137167,"y":0.3625},{"x":0.15837991728083065,"y":0.225}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"eM6FR2jokXDXXNuqEbWW5t","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.3273184957137167,"cy":0.45416666666666666,"cz":-0.38841568779580643,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.32793305760276886,"y":0.35833333333333334},{"x":0.15899447916988282,"y":0.49583333333333335},{"x":0.49687163603565493,"y":0.49583333333333335}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"xbCXMjDGmXXmNhu45xKrKU","selected":false,"selectedIndex":0,"locked":true},{"type":"Polygon","cx":0.02549879326087855,"cy":-1.1842378929335004e-14,"cz":-0.30729230835255206,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.15837991728083065,"y":0.225},{"x":0,"y":0.3625},{"x":-0.15837991728083065,"y":0.225}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"5HQ6TVrPFFjZ9n9pMNCaPw","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.17764937225875113,"cy":1.1842378929335004e-14,"cz":-0.38532011935953503,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15837991728083065,"y":0.225},{"x":-0.32670393382466456,"y":0.35833333333333334},{"x":-0.49625707414660275,"y":0.225}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"6xMKYrX7YfEEQhYDvJGbXj","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.028297592880302983,"cy":0,"cz":-0.4292130777977021,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.32670393382466456,"y":0.35833333333333334},{"x":-0.4956425122575506,"y":0.49583333333333335},{"x":-0.1577653553917785,"y":0.49583333333333335}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"aC5hTZ2mJqEmuJzedm4MJc","selected":false,"locked":true},{"type":"Polygon","cx":-0.0752822112279152,"cy":0,"cz":-0.43162058966296696,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0,"y":0.3625},{"x":-0.14782125612877528,"y":0.5},{"x":0.15899447916988285,"y":0.49583333333333335}],"parentId":"o6RrXLKTD62SEJEe7jE1pv","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"g4vxfHB2tWhootScoBEJAy","selected":false,"selectedIndex":0,"locked":true},{"type":"Window","cx":-0.15837991728083065,"cy":0.3,"cz":-0.36250000000000004,"lx":0.08446928921644303,"ly":0.3,"lz":0.10000000000000003,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"aTgEN9mCRYp5yq7d1z5C9J","locked":true},{"type":"Window","cx":0.16893857843288604,"cy":0.3,"cz":-0.3625,"lx":0.08446928921644302,"ly":0.3,"lz":0.09999999999999998,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"iJhjRtnwcwPom4AbAof7TY","locked":true},{"type":"Window","cx":0,"cy":0.3,"cz":0.625,"lx":0.10558661152055378,"ly":0.3,"lz":0.125,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"eM9DBHVTV9qvEYGB1GSGT4","locked":true},{"type":"Window","cx":-0.2850838511054952,"cy":0.3,"cz":0.625,"lx":0.10558661152055378,"ly":0.3,"lz":0.125,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"xktqPqwH68DsLhhed5NdpJ","locked":true},{"type":"Window","cx":0.3167598345616613,"cy":0.3,"cz":0.625,"lx":0.10558661152055378,"ly":0.3,"lz":0.125,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"smfVPdpD4AJjru3d9qbPFB","locked":true},{"type":"Polygon","cx":0.33203141791512314,"cy":-0.34064625850340136,"cz":0.0816606073539844,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.5026995431476631,"y":-0.4875},{"x":0.16366961869923916,"y":-0.5},{"x":0.16366961869923916,"y":-0.1875},{"x":0.5026995431476631,"y":-0.1875}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"7P3jamWRpmTThzKQQchxem","selected":false,"selectedIndex":2,"locked":true},{"type":"Polygon","cx":0.08095645236308847,"cy":1.1472304587793285e-14,"cz":0.024081550771485216,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.11690687049945654,"y":-0.4875},{"x":-0.15197893164929352,"y":-0.4875},{"x":-0.15197893164929352,"y":-0.1875},{"x":0.11690687049945654,"y":-0.1875}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"hti4VWVrfMLPFRbMnZuXCh","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":-0.06332927122552619,"cy":3.7007434154171886e-16,"cz":0.11866929892518252,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.19874167984907612,"y":-0.5},{"x":-0.49524132235097623,"y":-0.4844583756672448},{"x":-0.4910088560977175,"y":-0.1875},{"x":-0.19874167984907612,"y":-0.1875}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"fK55YfVyK24HbKmqkoFvX8","selected":false,"selectedIndex":0,"locked":true},{"type":"Window","cx":-0.3273392373984783,"cy":0.3,"cz":0.34375,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"7uoagXVHHDZRJe6yfz87Uy","locked":true},{"type":"Window","cx":0.02338137409989131,"cy":0.3,"cz":0.34375,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"2eFNdjG8a6PPPeWCyHvJZF","locked":true},{"type":"Window","cx":0.3435254963995652,"cy":0.3,"cz":0.34375,"lx":0.10251664030184776,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"pVvTiVPrSp7DHLhNTLPbpw","locked":true},{"type":"Polygon","cx":0.11417019715816792,"cy":-0.03691339676553812,"cz":-0.01732802673536704,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.334513812493377,"y":-0.1887668131742859},{"x":0.11690687049945654,"y":-0.1875},{"x":0,"y":0.2},{"x":0.5026995431476631,"y":0.2}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"ncvU41deRZgttbWEevak9W","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":0.23813144459901245,"cy":-1.2582527612418442e-14,"cz":-0.15608783217541283,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.15197893164929352,"y":-0.1875},{"x":-0.33902992444842395,"y":-0.1875},{"x":-0.5026995431476631,"y":0.2},{"x":-0.011690687049945655,"y":0.2}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"nUnv6wAVCPmYj3Aresrcpk","selected":false,"selectedIndex":1,"locked":true},{"type":"Polygon","cx":-0.13062766511807228,"cy":-2.590520390792032e-15,"cz":-0.22842446371425668,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.49818343119261616,"y":0.1987331868257141},{"x":0.15301751728589502,"y":0.20325890158694568},{"x":0.15345728483965818,"y":0.49941339676553814},{"x":0.49818343119261616,"y":0.49873318682571405}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8Kz8otpe54cGwNRpjbBHbb","selected":false,"locked":true},{"type":"Polygon","cx":0.08870702581035714,"cy":1.1657341758564144e-14,"cz":-0.3327175444793864,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.1564950436043405,"y":0.19873318682571411},{"x":-0.5016609575110615,"y":0.2032589015869457},{"x":-0.5012211899572985,"y":0.49941339676553814},{"x":-0.1564950436043405,"y":0.4987331868257141}],"parentId":"eTKLP2TockjZDP1RLDKvpj","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"wG7R1sDD8K7WPRvoZtoyJw","selected":false,"locked":true},{"type":"Window","cx":-0.23381374099891308,"cy":0.3,"cz":0.0062500000000000056,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"pHH5nsCFYVbtKpFCrTf3Ws","locked":true},{"type":"Window","cx":0.25134977157383154,"cy":0.3,"cz":0.0062500000000000056,"lx":0.1285975575494022,"ly":0.3,"lz":0.1875,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#4d4d4d","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"cwAvtz8KzMtAWzktGpFNXr","locked":true},{"type":"Polygon","cx":0.3974833596981522,"cy":-0.3,"cz":0.15250947773144075,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.5026995431476631,"y":-0.4875},{"x":0.29226717624864135,"y":-0.4875},{"x":0.29226717624864135,"y":-0.1125},{"x":0.5026995431476631,"y":-0.1125}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"h2haDNadyPJVsXHUBM7goT","selected":false,"selectedIndex":2,"locked":false},{"type":"Polygon","cx":0.2062582639639952,"cy":0,"cz":0.09819258432246669,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.29352549639956527,"y":-0.4875},{"x":-0.503957863298587,"y":-0.4875},{"x":-0.503957863298587,"y":-0.1125},{"x":-0.29352549639956527,"y":-0.1125}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"qNhdQA6nMEubq6HrA8GQ56","selected":false},{"type":"Polygon","cx":-0.00041944005030796134,"cy":-0.2375,"cz":0.11572778700091202,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.001258320150923864,"y":-0.4875},{"x":-0.29226717624864135,"y":-0.1125},{"x":0,"y":-0.1125},{"x":0.29226717624864135,"y":-0.1125}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"7xfb1T386qUxDL13U5ur56","selected":false,"selectedIndex":2},{"type":"Window","cx":0,"cy":0.3,"cz":0.25625,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,-1,0],"rotation":[0,0,0],"id":"61722s3ZSQeHug5MRWQdpi","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3947838165504891,"cy":0.3,"cz":0.25625,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,-1,0],"rotation":[0,0,0],"id":"16SX2hn6bjPsYFGUZ6H1HJ","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3947838165504891,"cy":0.3,"cz":0.25625,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,-1,0],"rotation":[0,0,0],"id":"rxzF9abntmscS3LgzGNTHv","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Polygon","cx":0.26762748199782616,"cy":0.07499999999999998,"cz":-0.20483915447539497,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.4137610701221468,"y":-0.10625000000000001},{"x":0.12149389387350548,"y":-0.10625000000000001},{"x":0.12149389387350548,"y":0.25625},{"x":0.4137610701221468,"y":0.25625}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"4a4kmf2AVjLH4xqmTBj5qm","selected":false,"selectedIndex":3},{"type":"Polygon","cx":0.2640836675523676,"cy":0,"cz":-0.07455503736820074,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":-0.1357012212252989,"y":-0.10625000000000001},{"x":-0.4279683974739402,"y":-0.10625000000000001},{"x":-0.4279683974739402,"y":0.25625},{"x":-0.1357012212252989,"y":0.25625}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"nzNaoQaRpK6d7hEi9ZXqqA","selected":false},{"type":"Polygon","cx":-0.00800080807265061,"cy":-3.076242964065538e-15,"cz":-0.3451540701116582,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.5026995431476631,"y":0.2625},{"x":-0.49994974836164874,"y":0.2579458713508321},{"x":-0.49994974836164874,"y":0.49544587135083207},{"x":0.5026995431476631,"y":0.5}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"eVuLrSaB1RiWnm1kdJDxE3","selected":false,"selectedIndex":3},{"type":"Window","cx":-0.25719511509880444,"cy":0.3,"cz":-0.06875,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"srgUpVRNxrAgJWbybn588q","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.29226717624864135,"cy":0.3,"cz":-0.06875,"lx":0.11690687049945654,"ly":0.3,"lz":0.1875,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#4d4d4d","frame":true,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"id":"98pLU7aQ4axthpXWXa3LR2","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Polygon","cx":0.004459000607667748,"cy":5.782411586589357e-17,"cz":-0.07786416501615101,"lx":0.4,"ly":0.4,"lz":0.4,"filled":false,"color":"#ffffff","lineColor":"#4d4d4d","lineWidth":2,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"vertices":[{"x":0.25719511509880444,"y":0.2625},{"x":-0.29226717624864135,"y":0.2625},{"x":-0.29226717624864135,"y":0.5},{"x":0.25719511509880444,"y":0.5}],"parentId":"vKjEHsN5hVHi8S9tPzBesN","parentType":"Wall","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"oMeHBYv8MZowW2UjWYNbTs","selected":false,"selectedIndex":3}],"sceneRadius":18,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.5736443737686907,-8.024644919181295,-0.000008025001608758962],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.5736443737686907,-8.024794925856764,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[10.811404848456696,-24.22563598939458,8.16030935368929],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[2.4887069683147542,-4.392139935230605,6.944093833347563],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["A half-timbered house"]}')},456:function(e){e.exports=JSON.parse('{"docid":"u6V16ot91aBGkUfNPgtKBw","time":"06/13/2023 10:40 am","timestamp":1686667251444,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.3,"date":"4/22/2022, 1:30:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"John","cx":-3.628595765451405,"cy":-5.965837088553536,"cz":0.075,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","id":"qPhtowBuGGDfEAuEFNhxwt","selected":false,"locked":false},{"type":"Wall","cx":0.10471070913816627,"cy":6.876571226527738,"cz":2.2408122612280286,"lx":13.774073361922072,"ly":0.3,"lz":4.1,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[6.991747390099202,6.876571226527738,0.1],"rightPoint":[-6.78232597182287,6.876571226527738,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"leftRoofHeight":4.1,"rightRoofHeight":4.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.0625,"lx":0.0708994221944815,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":6.991747390099202,"cy":1.3532362351510367,"cz":2.2301039869226305,"lx":11.046669982753404,"ly":0.3,"lz":4.1,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[6.9917473900992,-4.1700987562256655,0.1],"rightPoint":[6.991747390099204,6.876571226527738,0.1],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"leftRoofHeight":4.1,"rightRoofHeight":4.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":-6.782325971822869,"cy":1.3532362351510367,"cz":2.228839888904333,"lx":11.046669982753404,"ly":0.3,"lz":4.1,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-6.782325971822869,6.876571226527738,0.1],"rightPoint":[-6.78232597182287,-4.1700987562256655,0.1],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"leftRoofHeight":4.1,"rightRoofHeight":4.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.0625,"lx":0.09052501808791685,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":0.10471070913816716,"cy":-4.1700987562256655,"cz":2.268765007024547,"lx":13.774073361922074,"ly":0.3,"lz":4.1,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-6.78232597182287,-4.1700987562256655,0.1],"rightPoint":[6.991747390099204,-4.1700987562256655,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"22qg2ZvB7t4cVkS2ppWUue","selected":false,"leftRoofHeight":4.1,"rightRoofHeight":4.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.3993009079801005,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729113,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"29QuQvndX2M7Sq4iEkq1Xz","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.25410057780551853,"cy":0.1,"cz":-0.062499999999999944,"lx":0.072600165087291,"ly":0.3,"lz":0.3749999999999999,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4LUVPCUMNMxJkqRL8wFtEe","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.217800495261873,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"9FGAjvvq6tsggdPdWysCTK","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ucbeQgKEoSy9dHSmSFvaic","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":-0.02203325078968787,"cy":0,"cz":-0.1875,"lx":0.18926683175395775,"ly":0,"lz":0.625,"color":"white","textureType":"Door Texture #7","normal":[0,1,0],"rotation":[0,0,0],"id":"wzic8VHyh9MpPw339UYDy4","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"doorType":"Default","archHeight":1,"filled":true,"locked":false},{"id":"22qg2ZvB7t4cVkS2ppWUue","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["roDDPncXBpNgmNum9aUaov"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":2,"ceiling":false,"locked":false},{"type":"Foundation","cx":-11.627490246197299,"cy":0.3947804481181869,"cz":0.075,"lx":19.77405921718084,"ly":14.655745561697936,"lz":0.15,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":false,"enableGroupMaster":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Foundation","cx":-11.621608440780687,"cy":1.9572753540307968,"cz":0.05,"lx":16.830274696272348,"ly":15.08817119873108,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1hsdTDJQtP791cvdCX88pM","selected":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"locked":false},{"type":"Wall","cx":0.08541275905423218,"cy":3.142987766593968,"cz":2.2408122612280286,"lx":10.982816484532037,"ly":0.3,"lz":5.1,"leftJoints":["oqmTcCR15WVtwsqrWdL4GC"],"rightJoints":["1pdrgHKxCmzDRjbnSqoG6g"],"leftPoint":[5.57682100132025,3.142987766593967,0],"rightPoint":[-5.405995483211786,3.142987766593969,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pbycx2vwYmMhSjRe9GEQ9K","parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","selected":false,"roofId":"1ruH3RPfFc3ThJYcd2omkK","leftRoofHeight":5.1,"rightRoofHeight":5.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Partial","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.423886716391337,"rightUnfilledHeight":4.423886716391337,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Wall","cx":5.576821001320248,"cy":-0.20560385518737068,"cz":2.2301039869226305,"lx":6.697183243562679,"ly":0.3,"lz":5.1,"leftJoints":["gCfAqTHxYsKYYxNWYw9TWQ"],"rightJoints":["pbycx2vwYmMhSjRe9GEQ9K"],"leftPoint":[5.576821001320245,-3.5541954769687103,0],"rightPoint":[5.57682100132025,3.142987766593969,0],"relativeAngle":1.570796326794896,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oqmTcCR15WVtwsqrWdL4GC","parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","selected":false,"roofId":"1ruH3RPfFc3ThJYcd2omkK","leftRoofHeight":5.1,"rightRoofHeight":5.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.137593329953601,"rightUnfilledHeight":4.137593329953601,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Wall","cx":-5.405995483211786,"cy":-0.20560385518737068,"cz":2.228839888904333,"lx":6.697183243562679,"ly":0.3,"lz":5.1,"leftJoints":["pbycx2vwYmMhSjRe9GEQ9K"],"rightJoints":["gCfAqTHxYsKYYxNWYw9TWQ"],"leftPoint":[-5.405995483211786,3.142987766593969,0],"rightPoint":[-5.405995483211786,-3.5541954769687103,0],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1pdrgHKxCmzDRjbnSqoG6g","parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","selected":false,"roofId":"1ruH3RPfFc3ThJYcd2omkK","leftRoofHeight":5.1,"rightRoofHeight":5.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.005808068482516,"rightUnfilledHeight":4.005808068482516,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Wall","cx":0.08541275905423218,"cy":-3.5541954769687103,"cz":2.268765007024547,"lx":10.982816484532037,"ly":0.3,"lz":5.1,"leftJoints":["1pdrgHKxCmzDRjbnSqoG6g"],"rightJoints":["oqmTcCR15WVtwsqrWdL4GC"],"leftPoint":[-5.405995483211786,-3.5541954769687103,0],"rightPoint":[5.57682100132025,-3.5541954769687103,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gCfAqTHxYsKYYxNWYw9TWQ","parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","selected":false,"roofId":"1ruH3RPfFc3ThJYcd2omkK","leftRoofHeight":5.1,"rightRoofHeight":5.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.950942062075448,"rightUnfilledHeight":3.950942062075448,"leftTopPartialHeight":4.525537209578383,"rightTopPartialHeight":4.525537209578383,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","roofStructure":"Default","wallsId":["pbycx2vwYmMhSjRe9GEQ9K"],"textureType":"Roof Texture #2","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1hsdTDJQtP791cvdCX88pM","foundationId":"1hsdTDJQtP791cvdCX88pM","id":"1ruH3RPfFc3ThJYcd2omkK","leftRidgeLength":3.201607189072456,"rightRidgeLength":3.144275873016056,"rise":3.3,"ceiling":false,"locked":false},{"type":"Human","name":"Jett","cx":3.45311660764904,"cy":-5.539983726654682,"cz":0,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"ngMWYAz5cg4LmcZtkKGH5w","selected":false,"locked":false},{"type":"Wall","cx":-0.5646884076429224,"cy":5.154362868463492,"cz":2.2408122612280286,"lx":12.155877698025375,"ly":0.3,"lz":4,"leftJoints":["63yNZT5sk98atsFEx8NvNs"],"rightJoints":["jQsmtVwKhe4n3CrR6jXs3q"],"leftPoint":[5.513250441369763,5.154362868463492,0.15],"rightPoint":[-6.642627256655608,5.154362868463492,0.15],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mzpK9wLgMhYvSmDqWB4w5a","parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofId":"4gpAeqULbxkTE3NVbw47eo","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.06250000000000006,"lx":0.0708994221944815,"ly":0.3,"lz":0.3750000000000001,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"4wXNeeycaqHL9B1R9qUX1E","parentId":"mzpK9wLgMhYvSmDqWB4w5a","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729104,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"mt3NkwPRVR29Vv4nC9yzZx","parentId":"mzpK9wLgMhYvSmDqWB4w5a","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"a4kNY3m4aqY6M343x3uLZh","parentId":"mzpK9wLgMhYvSmDqWB4w5a","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":5.513250441369763,"cy":0.8650317721032894,"cz":2.2301039869226305,"lx":8.578662192720406,"ly":0.3,"lz":4,"leftJoints":["7AAP4SGnSJct2FC9Zr7dc4"],"rightJoints":["mzpK9wLgMhYvSmDqWB4w5a"],"leftPoint":[5.513250441369756,-3.424299324256914,0.15],"rightPoint":[5.513250441369763,5.154362868463492,0.15],"relativeAngle":1.570796326794896,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"63yNZT5sk98atsFEx8NvNs","parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofId":"4gpAeqULbxkTE3NVbw47eo","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jbtNFjUNQaHTwUPP6Cgyx7","parentId":"63yNZT5sk98atsFEx8NvNs","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ig1Epmrjnd2PJxhzkNaQVQ","parentId":"63yNZT5sk98atsFEx8NvNs","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"f3BCsz5GQBEYy4XiqRBqZE","parentId":"63yNZT5sk98atsFEx8NvNs","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":-6.642627256655608,"cy":0.8650317721032894,"cz":2.228839888904333,"lx":8.578662192720406,"ly":0.3,"lz":4,"leftJoints":["mzpK9wLgMhYvSmDqWB4w5a"],"rightJoints":["7AAP4SGnSJct2FC9Zr7dc4"],"leftPoint":[-6.642627256655608,5.154362868463492,0.15],"rightPoint":[-6.642627256655608,-3.424299324256914,0.15],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jQsmtVwKhe4n3CrR6jXs3q","parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofId":"4gpAeqULbxkTE3NVbw47eo","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"cWeaG9uSw8kJfhXamtKBxr","parentId":"jQsmtVwKhe4n3CrR6jXs3q","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"nxekbBrmyzGrPUF9ezKfwT","parentId":"jQsmtVwKhe4n3CrR6jXs3q","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"e67VWqxp9LA175MVc6hEpX","parentId":"jQsmtVwKhe4n3CrR6jXs3q","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Wall","cx":-0.5646884076429224,"cy":-3.424299324256914,"cz":2.268765007024547,"lx":12.155877698025375,"ly":0.3,"lz":4,"leftJoints":["jQsmtVwKhe4n3CrR6jXs3q"],"rightJoints":["63yNZT5sk98atsFEx8NvNs"],"leftPoint":[-6.642627256655608,-3.424299324256914,0.15],"rightPoint":[5.513250441369763,-3.424299324256914,0.15],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"7AAP4SGnSJct2FC9Zr7dc4","parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofId":"4gpAeqULbxkTE3NVbw47eo","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Window","cx":-0.39930090798010054,"cy":0.1,"cz":-0.0484624485645839,"lx":0.072600165087291,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"3CK46FAqDU4yiw68e68gyB","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.21716749210312172,"cy":0.1,"cz":-0.0484624485645839,"lx":0.0738661714047936,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"b4tHm9uwSzreh4oUqoA1iA","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25410057780551853,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"i6yCtjaey6bF3bxgioyozq","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":-0.06249999999999989,"lx":0.072600165087291,"ly":0.3,"lz":0.3749999999999998,"mullionSpacing":0.5,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jfHaiksBWSL7KRtRUTCNe2","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":0.02056618256702364,"cy":0,"cz":-0.1875,"lx":0.2056618256702355,"ly":0,"lz":0.625,"color":"white","textureType":"Door Texture #7","normal":[0,1,0],"rotation":[0,0,0],"id":"srJTCNtCygPjzCukKAxRUa","parentId":"7AAP4SGnSJct2FC9Zr7dc4","foundationId":"oWDryEiqPVRjWJgYF9QDux","selected":false,"doorType":"Default","archHeight":1,"filled":true,"locked":false},{"id":"4gpAeqULbxkTE3NVbw47eo","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"oWDryEiqPVRjWJgYF9QDux","foundationId":"oWDryEiqPVRjWJgYF9QDux","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["7AAP4SGnSJct2FC9Zr7dc4"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":3.3,"ceiling":false,"locked":false},{"type":"Foundation","cx":12.400385994458517,"cy":1.2287983710659756,"cz":0.075,"lx":14.955401155218322,"ly":11.516608009620233,"lz":0.15,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"oWDryEiqPVRjWJgYF9QDux","selected":false,"notBuilding":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"B"},"locked":false},{"type":"Wall","cx":1.5103273766750398,"cy":6.063064855929808,"cz":2.2408122612280286,"lx":13.774073361922072,"ly":0.3,"lz":4,"leftJoints":["tBjXFzHUauAuKRcxtaPG1e"],"rightJoints":["4SzYT1f9J8muRMTnAg2SJH"],"leftPoint":[8.397364057636077,6.063064855929808,0.25],"rightPoint":[-5.376709304285996,6.063064855929808,0.25],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dwbAGuCethnJoxAoWyoGv2","parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","wallStructure":"Pillar","opacity":0,"roofId":"uJkcA94q1VPrPcTVWbwGvS","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"structureSpacing":2.3,"structureWidth":0.25,"structureColor":"#ffffff","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Wall","cx":8.397364057636077,"cy":0.5397298645531063,"cz":2.2301039869226305,"lx":11.046669982753404,"ly":0.3,"lz":4,"leftJoints":["jXXAZGYK8JJ2UA3NqYndxp"],"rightJoints":["dwbAGuCethnJoxAoWyoGv2"],"leftPoint":[8.397364057636073,-4.983605126823596,0.25],"rightPoint":[8.397364057636077,6.063064855929808,0.25],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tBjXFzHUauAuKRcxtaPG1e","parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","wallStructure":"Pillar","structureSpacing":2.3,"opacity":0,"roofId":"uJkcA94q1VPrPcTVWbwGvS","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"structureWidth":0.25,"structureColor":"#ffffff","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Wall","cx":-5.376709304285995,"cy":0.5397298645531063,"cz":2.228839888904333,"lx":11.046669982753404,"ly":0.3,"lz":4,"leftJoints":["dwbAGuCethnJoxAoWyoGv2"],"rightJoints":["jXXAZGYK8JJ2UA3NqYndxp"],"leftPoint":[-5.376709304285995,6.063064855929808,0.25],"rightPoint":[-5.376709304285996,-4.983605126823596,0.25],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4SzYT1f9J8muRMTnAg2SJH","parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","wallStructure":"Pillar","opacity":0,"roofId":"uJkcA94q1VPrPcTVWbwGvS","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"structureSpacing":2.3,"structureWidth":0.25,"structureColor":"#ffffff","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"type":"Wall","cx":1.5103273766750416,"cy":-4.983605126823596,"cz":2.268765007024547,"lx":13.774073361922074,"ly":0.3,"lz":4,"leftJoints":["4SzYT1f9J8muRMTnAg2SJH"],"rightJoints":["tBjXFzHUauAuKRcxtaPG1e"],"leftPoint":[-5.376709304285996,-4.983605126823596,0.25],"rightPoint":[8.397364057636077,-4.983605126823596,0.25],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jXXAZGYK8JJ2UA3NqYndxp","parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","wallStructure":"Pillar","opacity":0,"roofId":"uJkcA94q1VPrPcTVWbwGvS","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"structureSpacing":2.3,"structureWidth":0.25,"structureColor":"#ffffff","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4,"locked":false},{"id":"uJkcA94q1VPrPcTVWbwGvS","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#454769","normal":[0,0,1],"rotation":[0,0,0],"parentId":"s1ySBq5Hp2XQRHXHYFr7Ei","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","roofType":"Hip","roofStructure":"Default","textureType":"Roof Texture #2","thickness":0.2,"wallsId":["jXXAZGYK8JJ2UA3NqYndxp"],"rightRidgeLength":3.4435183404805185,"leftRidgeLength":3.4435183404805185,"selected":false,"rise":1.5269644430820746,"ceiling":false,"locked":false},{"type":"Foundation","cx":10.37396266274916,"cy":1.4954382308468475,"cz":0.125,"lx":16.96282588210709,"ly":13.050086329642726,"lz":0.25,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"s1ySBq5Hp2XQRHXHYFr7Ei","selected":false,"enableGroupMaster":true,"notBuilding":true,"locked":false},{"type":"Window","cx":0.07884126244762069,"cy":-0.4199549792627557,"cz":5.657927332967425,"lx":6.879964200295598,"ly":0.2,"lz":3.6298042832326978,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"5qeCesjRK72iMFt1u6qiC3","interior":true,"empty":true,"locked":false},{"type":"Window","cx":4.6299611623937915,"cy":-1.9963568795412103,"cz":5.087112090821291,"lx":1.9473454718410252,"ly":0.2,"lz":0.2766726175398978,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"aGpcgzxVmKxBSPh9yRzTLJ","interior":true,"empty":true,"polygonTop":[-0.5,3.2251316092291917],"locked":false},{"type":"Window","cx":-4.39419016648573,"cy":-2.002733503950701,"cz":5.084803114661254,"lx":1.92547283639216,"ly":0.2,"lz":0.24728723598247773,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.34741346419269825,0,0],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"osBXWJHBmx9hpwyQUwqfsK","polygonTop":[0.46902792604716753,3.180338239963955],"locked":false},{"type":"Window","cx":0.11638811342117883,"cy":3.157291970642662,"cz":5.646751287652042,"lx":6.9955661140483585,"ly":0.2,"lz":3.5587869628599558,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"4W4UVMV7FW5xPQu2hjVR4Y","locked":false},{"type":"Window","cx":4.590702645311016,"cy":4.683424214953679,"cz":5.094138691568809,"lx":1.7954404068830758,"ly":0.2,"lz":0.26778946663296593,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"jJTqLy3iA2qbmapg7Zub8Z","polygonTop":[0.5,3.0683555686449475],"locked":false},{"type":"Window","cx":-4.415927568932208,"cy":4.63032056148964,"cz":5.113367528330277,"lx":1.7975728034829963,"ly":0.2,"lz":0.3359502694894871,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.3474134641926985,0,3.141592653589793],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"m5979bvktsFocL1GPG4weA","polygonTop":[-0.4957280589496637,2.9554677254634854],"locked":false},{"type":"Window","cx":5.504236899323556,"cy":1.3302889338668908,"cz":5.19822982033263,"lx":5.612135328984845,"ly":0.2,"lz":0.3020024535761091,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5129779343199241,0,1.5707963267948963],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"uyC7NDy7e1ziZpNPzq7VwJ","polygonTop":[0.009359362140956982,1.9288870310031725],"locked":false},{"type":"Window","cx":-5.3990349070202655,"cy":1.2828552303810974,"cz":5.1395256307270145,"lx":6.2123129373580515,"ly":0.2,"lz":0.000006294722086474765,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5129779343199243,0,4.71238898038469],"parentId":"22qg2ZvB7t4cVkS2ppWUue","parentType":"Roof","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"wfuMCkccoofFa3YJZeQXjY","polygonTop":[-0.008473558583168532,2.320323655487881],"locked":false},{"type":"Window","cx":1.5099442103574612,"cy":2.197100019877415,"cz":5.268772915652224,"lx":6.866771854005096,"ly":0.2,"lz":3.3727323067547332,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.26972023694331404,0,3.141592653589793],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"jKvUBT3s3eyiNHv6xMyWAB","locked":false},{"type":"Window","cx":1.5105405746812384,"cy":-1.0648474200330473,"cz":5.283367872610519,"lx":6.865526912026976,"ly":0.2,"lz":3.1583095363910174,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.2697202369433138,0,0],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"nehwkAn747SbcH197nfAym","locked":false},{"type":"Window","cx":6.847328996169246,"cy":0.5571537124890757,"cz":4.912671214877417,"lx":5.747166362942518,"ly":0.2,"lz":0.07159007097595167,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.4061405868341845,0,1.5707963267948963],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"vzRJC7dg8gVnPCKJ8nK1uw","polygonTop":[0.0029237138437357584,1.8546622388485283],"locked":false},{"type":"Window","cx":-3.913630166662161,"cy":0.5040604017480659,"cz":4.875275785658461,"lx":6.025884701181912,"ly":0.2,"lz":0.016127155846384855,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.4061405868341845,0,4.71238898038469],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"kwCF77vQKSWqB9vJyLsGEC","polygonTop":[-0.002404697670111075,1.990469286566286],"locked":false},{"type":"Window","cx":5.8964025615822475,"cy":3.6476180468177413,"cz":4.867767100389265,"lx":1.6622791380927708,"ly":0.2,"lz":0.4588203236729191,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.26972023694331404,0,3.141592653589793],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"41o33Gu8Z1ZgNh7JnbXzVZ","polygonTop":[0.5,2.796622713087028],"locked":false},{"type":"Window","cx":-2.855581425025988,"cy":3.549188813296429,"cz":4.894978547817588,"lx":1.5556391784234185,"ly":0.2,"lz":0.4903348709835801,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.26972023694331404,0,3.141592653589793],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"gfa6RMCw76XaAmQeeHFmdc","polygonTop":[-0.5,2.5684727779282683],"locked":false},{"type":"Window","cx":-2.7969890059844267,"cy":-2.384701698791339,"cz":4.918484960952953,"lx":1.5043468507143833,"ly":0.2,"lz":0.30588110911202415,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.2697202369433138,0,0],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"neBTigCnPfsLosQzW9yEzs","polygonTop":[0.5,2.6873784768414724],"locked":false},{"type":"Window","cx":5.895662984214205,"cy":-2.416289985539417,"cz":4.90975215898503,"lx":1.579400635678578,"ly":0.2,"lz":0.3714274801752112,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Polygonal","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.2697202369433138,0,0],"parentId":"uJkcA94q1VPrPcTVWbwGvS","parentType":"Roof","foundationId":"s1ySBq5Hp2XQRHXHYFr7Ei","id":"4LmavYSaxJMdhHeDjENvmB","polygonTop":[-0.5,2.6218328392217303],"locked":false}],"sceneRadius":27,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.6328594466581806,4.6052145632619785,0.000004606954980926815],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.6328594466581806,4.6042141858164145,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-24.900270995188162,-22.88331862075037,5.458927240534251],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":43.16939043526372,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-0.17215904908430746,3.1094271606158492,2.035326701937142],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":334,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Combination roof vs. bonnet roof"]}')},457:function(e){e.exports=JSON.parse('{"docid":"eUyyJJc59Won933XJe19sV","time":"06/17/2023 01:41 pm","timestamp":1687023666114,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 9:15:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jeff","cx":2.849872692474971,"cy":-6.695477959956797,"cz":1.05,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.6,"locked":true},{"type":"Wall","cx":0.40535681744352425,"cy":5.410198334546533,"cz":2.2408122612280286,"lx":6.331471207996493,"ly":0.3,"lz":8.5,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[3.571092421441771,5.410198334546532,2.1],"rightPoint":[-2.760378786554723,5.410198334546534,2.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"9DRBXRS4our7656cx2vwpG","leftRoofHeight":8.5,"rightRoofHeight":8.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8.5,"rightTopPartialHeight":8.5},{"type":"Wall","cx":3.57109242144177,"cy":-0.3506001740764093,"cz":2.2301039869226305,"lx":11.521597017245886,"ly":0.3,"lz":6.067100850480004,"leftJoints":["8VKLBEAuMJxaXGp1WaM9mU"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[3.57109242144177,-6.1113986826993525,2.1],"rightPoint":[3.571092421441772,5.410198334546534,2.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"9DRBXRS4our7656cx2vwpG","leftRoofHeight":7,"rightRoofHeight":8.5,"centerRoofHeight":[-0.19251847682880624,6.3652370979872765],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6.067100850480004,"rightTopPartialHeight":6.067100850480004},{"type":"Wall","cx":-2.7603787865547225,"cy":-0.3506001740764093,"cz":2.228839888904333,"lx":11.521597017245886,"ly":0.3,"lz":6.067100850480004,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["8VKLBEAuMJxaXGp1WaM9mU"],"leftPoint":[-2.760378786554722,5.410198334546534,2.1],"rightPoint":[-2.760378786554723,-6.1113986826993525,2.1],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"9DRBXRS4our7656cx2vwpG","leftRoofHeight":8.5,"rightRoofHeight":7,"centerRoofHeight":[0.19251847682880624,6.3652370979872765],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6.067100850480004,"rightTopPartialHeight":6.067100850480004},{"type":"Foundation","cx":-0.33784337005620096,"cy":1.3319211806243931,"cz":1.05,"lx":15.0489874276124,"ly":21.361755748126203,"lz":2.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":true,"color":"#b3b3b3","locked":true},{"type":"Wall","cx":0.40535681744352337,"cy":-6.1113986826993525,"cz":3.5404855174251457,"lx":6.3314712079964925,"ly":0.3,"lz":7,"relativeAngle":0,"leftPoint":[-2.760378786554723,-6.1113986826993525,2.1],"rightPoint":[3.57109242144177,-6.1113986826993525,2.1],"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"8VKLBEAuMJxaXGp1WaM9mU","roofId":"9DRBXRS4our7656cx2vwpG","leftRoofHeight":7,"rightRoofHeight":7,"color":"#999999","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["8VKLBEAuMJxaXGp1WaM9mU"],"textureType":"No Roof Texture","color":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"9DRBXRS4our7656cx2vwpG","ridgeLeftPoint":[0.19251847682880624,1],"ridgeRightPoint":[-0.19251847682880624,1],"locked":true,"sideColor":"#999999","rise":-2.1347629020127235,"ceiling":false},{"type":"Wall","cx":0.7846470380907851,"cy":6.144582715914701,"cz":2.2408122612280286,"lx":8.239996514218573,"ly":0.1,"lz":2.458799038921556,"leftJoints":["awarKnJ5NQrzVL6xf3jKDE"],"rightJoints":["c43fWPvXTFz63buLF7EQiF"],"leftPoint":[4.904645295200071,6.1445827159147,0.038162668507384964],"rightPoint":[-3.3353512190185017,6.144582715914702,0.038162668507384964],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s2FCVLdwmxK7ScMqTWFnPt","parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","wallStructure":"Stud","opacity":0,"roofId":"5By6QsyR9XJzwW57eFw7Rg","selected":false,"leftRoofHeight":2.458799038921556,"rightRoofHeight":2.458799038921556,"structureSpacing":2.1,"structureWidth":0.2,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.458799038921556,"rightTopPartialHeight":2.458799038921556},{"type":"Wall","cx":4.904645295200071,"cy":-0.6338350568557676,"cz":2.2301039869226305,"lx":13.55683554554094,"ly":0.1,"lz":2.458799038921556,"leftJoints":["jCtJVX5GRr3k9vybapQgGf"],"rightJoints":["s2FCVLdwmxK7ScMqTWFnPt"],"leftPoint":[4.904645295200069,-7.4122528296262375,0.038162668507384964],"rightPoint":[4.904645295200073,6.144582715914702,0.038162668507384964],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"awarKnJ5NQrzVL6xf3jKDE","parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","wallStructure":"Stud","opacity":0,"roofId":"5By6QsyR9XJzwW57eFw7Rg","selected":false,"leftRoofHeight":2.458799038921556,"rightRoofHeight":2.458799038921556,"structureSpacing":1.93,"structureWidth":0.2,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.458799038921556,"rightTopPartialHeight":2.458799038921556},{"type":"Wall","cx":-3.335351219018501,"cy":-0.6338350568557676,"cz":2.228839888904333,"lx":13.55683554554094,"ly":0.1,"lz":2.458799038921556,"leftJoints":["s2FCVLdwmxK7ScMqTWFnPt"],"rightJoints":["jCtJVX5GRr3k9vybapQgGf"],"leftPoint":[-3.3353512190185,6.144582715914702,0.038162668507384964],"rightPoint":[-3.3353512190185017,-7.4122528296262375,0.038162668507384964],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"c43fWPvXTFz63buLF7EQiF","parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","wallStructure":"Stud","opacity":0,"roofId":"5By6QsyR9XJzwW57eFw7Rg","selected":false,"leftRoofHeight":2.458799038921556,"rightRoofHeight":2.458799038921556,"structureSpacing":1.93,"structureWidth":0.2,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.458799038921556,"rightTopPartialHeight":2.458799038921556},{"type":"Wall","cx":0.7846470380907842,"cy":-7.4122528296262375,"cz":3.5404855174251457,"lx":8.239996514218571,"ly":0.1,"lz":2.458799038921556,"leftJoints":["c43fWPvXTFz63buLF7EQiF"],"rightJoints":["awarKnJ5NQrzVL6xf3jKDE"],"leftPoint":[-3.3353512190185017,-7.4122528296262375,0.038162668507384964],"rightPoint":[4.904645295200069,-7.4122528296262375,0.038162668507384964],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"jCtJVX5GRr3k9vybapQgGf","parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","wallStructure":"Stud","opacity":0,"roofId":"5By6QsyR9XJzwW57eFw7Rg","selected":false,"leftRoofHeight":2.458799038921556,"rightRoofHeight":2.458799038921556,"structureSpacing":2.1,"structureWidth":0.2,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.458799038921556,"rightTopPartialHeight":2.458799038921556},{"type":"Foundation","cx":-0.7344091119928784,"cy":1.2827917090727918,"cz":1,"lx":11.86176666643788,"ly":16.71773862227102,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"oR9dfJF3BCFMyFyFLPCHa7","selected":false,"locked":true,"notBuilding":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","roofStructure":"Default","wallsId":["jCtJVX5GRr3k9vybapQgGf"],"ridgeWidth":0.5,"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"oR9dfJF3BCFMyFyFLPCHa7","foundationId":"oR9dfJF3BCFMyFyFLPCHa7","id":"5By6QsyR9XJzwW57eFw7Rg","locked":true,"rise":0,"ceiling":false},{"type":"Wall","cx":-0.039595288973048426,"cy":5.505906418342898,"cz":2.2408122612280286,"lx":8.1086978625349,"ly":0.1,"lz":3.7968822453017803,"leftJoints":["cSVfkr5b26MSCjvZV6AAuA"],"rightJoints":["39y7xTS1S7F7jiBBvyvPxR"],"leftPoint":[4.0147536422944015,5.505906418342896,0],"rightPoint":[-4.093944220240498,5.5059064183429,0],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hq7PgWBkRgswjhv5arBsam","parentId":"5Ds4Da2scUYHkUksNyQ1xG","foundationId":"5Ds4Da2scUYHkUksNyQ1xG","wallStructure":"Pillar","opacity":0,"roofId":null,"selected":false,"structureSpacing":2.1,"structureWidth":0.08,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.7968822453017803,"rightTopPartialHeight":3.7968822453017803},{"type":"Wall","cx":4.0147536422944015,"cy":-1.1596625117163346,"cz":2.2301039869226305,"lx":13.33113786011847,"ly":0.1,"lz":3.7968822453017803,"leftJoints":["8K2s8ExFq4TG2csG9MWdsp"],"rightJoints":["hq7PgWBkRgswjhv5arBsam"],"leftPoint":[4.0147536422944,-7.8252314417755695,0],"rightPoint":[4.014753642294403,5.5059064183429,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cSVfkr5b26MSCjvZV6AAuA","parentId":"5Ds4Da2scUYHkUksNyQ1xG","foundationId":"5Ds4Da2scUYHkUksNyQ1xG","wallStructure":"Pillar","opacity":0,"roofId":null,"selected":false,"structureSpacing":1.93,"structureWidth":0.08,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.7968822453017803,"rightTopPartialHeight":3.7968822453017803},{"type":"Wall","cx":-4.093944220240498,"cy":-1.1596625117163346,"cz":2.228839888904333,"lx":13.33113786011847,"ly":0.1,"lz":3.7968822453017803,"leftJoints":["hq7PgWBkRgswjhv5arBsam"],"rightJoints":["8K2s8ExFq4TG2csG9MWdsp"],"leftPoint":[-4.093944220240498,5.5059064183429,0],"rightPoint":[-4.093944220240498,-7.8252314417755695,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"39y7xTS1S7F7jiBBvyvPxR","parentId":"5Ds4Da2scUYHkUksNyQ1xG","foundationId":"5Ds4Da2scUYHkUksNyQ1xG","wallStructure":"Pillar","opacity":0,"roofId":null,"selected":false,"structureSpacing":1.93,"structureWidth":0.08,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.7968822453017803,"rightTopPartialHeight":3.7968822453017803},{"type":"Wall","cx":-0.039595288973049314,"cy":-7.8252314417755695,"cz":3.5404855174251457,"lx":8.108697862534898,"ly":0.1,"lz":3.7968822453017803,"leftJoints":["39y7xTS1S7F7jiBBvyvPxR"],"rightJoints":["cSVfkr5b26MSCjvZV6AAuA"],"leftPoint":[-4.093944220240498,-7.8252314417755695,0],"rightPoint":[4.0147536422944,-7.8252314417755695,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"8K2s8ExFq4TG2csG9MWdsp","parentId":"5Ds4Da2scUYHkUksNyQ1xG","foundationId":"5Ds4Da2scUYHkUksNyQ1xG","wallStructure":"Pillar","opacity":0,"roofId":null,"selected":false,"structureSpacing":2.1,"structureWidth":0.08,"structureColor":"white","locked":true,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.7968822453017803,"rightTopPartialHeight":3.7968822453017803},{"type":"Foundation","cx":0.04362302366466242,"cy":1.823303235241708,"cz":1,"lx":8.30081773193631,"ly":17.094708951250738,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"5Ds4Da2scUYHkUksNyQ1xG","selected":false,"enableGroupMaster":false,"locked":true,"notBuilding":true},{"type":"Window","cx":-0.25419587257395015,"cy":0.1,"cz":-0.30201296045936715,"lx":0.24801117503166498,"ly":0.3,"lz":0.33556995606596346,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1d7mvhUrBc4LPBEQXecARp","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.34717409348831374,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"ir7hkL6jERL1qMTc1icTaU","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2603805701162353,"cy":0.1,"cz":-0.30201296045936715,"lx":0.2603805701162353,"ly":0.3,"lz":0.33556995606596346,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"r88YNaDvQ5vy3aH4s6woYs","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"u5euGVsx1U7wCryJGvzaQB","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.34717409348831374,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"cSXg7ALAMVJuBAwSqm3fTC","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.23691176200967903,"cy":0.1,"cz":0.23120466954884986,"lx":0.15794117467311936,"ly":0.3,"lz":0.39473351804515744,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8VKLBEAuMJxaXGp1WaM9mU","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"4BaNwdGRdaXZpb72VCDgor","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.23120466954884986,"lx":0.15794117467311936,"ly":0.3,"lz":0.39473351804515744,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rbG9cs5DUMxXisr5wn3eQo","parentId":"8VKLBEAuMJxaXGp1WaM9mU","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23691176200967903,"cy":0.1,"cz":0.23120466954884986,"lx":0.15794117467311936,"ly":0.3,"lz":0.39473351804515744,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mFoP4r2Wu3pQmWdjtsWy3S","parentId":"8VKLBEAuMJxaXGp1WaM9mU","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.34717409348831374,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"augNejin4JPCekoKKnTYSv","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.029411764705882353,"lx":0.15794117467311933,"ly":0.3,"lz":0.17647058823529413,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"5B4h5oeHnYU5wJtaewHXT5","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.24723505294647052,"lx":0.17358704674415687,"ly":0.3,"lz":0.3296467372619607,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8361znRuvUkFVaeSdoo5N8","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.34717409348831374,"cy":0.1,"cz":0.24723505294647058,"lx":0.17358704674415687,"ly":0.3,"lz":0.32964673726196053,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oqGE4Pc7gaUxrzp2HEspd6","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jett","cx":3.30154460456002,"cy":-9.422479646769895,"cz":1.05,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"rw9LaiB1TVsCjU7r3gxtva","selected":false,"ly":0.6,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-1.3048004341950468,"cy":-9.630820519777313,"cz":1.05,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"eSJdzinPpHu96SbrVMAjVK","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":6.510735678336653,"cy":-3.1958389696925,"cz":1.05,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"5HazbJmLvszfXVAspqP44n","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":6.4905736887835115,"cy":3.679225460437303,"cz":1.05,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"ksxkAyWQERG2x1K1PGLm2t","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-5.9613745486693706,"cy":-2.773042180475202,"cz":1.05,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"iMujo9QXGncnBDqpZ8cWcv","selected":false,"locked":true},{"type":"Flower","name":"Hydrangea","cx":-6.2101179268188,"cy":3.9102946709381,"cz":1.05,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"6cWk3x2UFqbqvZgzUcoLmx","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":1.8508428108951245,"cy":-9.658677131415082,"cz":1.05,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"tgueUXSjzrifiN4jQuumWf","selected":false,"locked":true},{"type":"Tree","name":"Apple","cx":6.0352995723203975,"cy":9.024257786663838,"cz":1.0499999523162848,"lx":4.174402972815023,"lz":5.46894817384739,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"aKSdbZwyPvicQCB2BLjJKk","selected":false,"locked":true},{"type":"Tree","name":"Apple","cx":-5.904244061298131,"cy":8.73412818752091,"cz":1.049999952316284,"lx":4.174402972815023,"lz":5.46894817384739,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"izwDJguiBhY5ey4Ujd2R3z","selected":false,"locked":true},{"type":"Human","name":"Jena","cx":4.50924100032713,"cy":-0.042568091946864506,"cz":1.05,"lx":0.695,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"q9UXGHJuymt18ppM1rZtbi","selected":false,"ly":0.695,"locked":true},{"type":"Window","cx":0,"cy":0.1,"cz":0.38235294117647056,"lx":0.15794117467311933,"ly":0.3,"lz":0.17647058823529413,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fpLqjLTr3asSNu2fh1ZJCm","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true,"windowType":"Default","archHeight":1},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":0.02669213223982052,"cy":0.08291430106063127,"cz":7.726383223578941,"lx":6.232,"ly":8.368,"lz":0.046,"showLabel":false,"normal":[0,-0.2584595890813664,0.9660220705614811],"rotation":[0.2614272700856308,0,0],"color":"#fff","parentType":"Roof","parentId":"9DRBXRS4our7656cx2vwpG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"n5j4iVNJbtpUNbLaMZkvDP","selected":false,"locked":true},{"type":"Light","decay":2,"distance":8,"intensity":8,"color":"#fe9200","cx":0.05226827991600305,"cy":-0.11746474188720647,"cz":6.581147613067356,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,-0.2584595890813664,0.9660220705614811],"rotation":[0.2614272700856308,0,0],"parentId":"9DRBXRS4our7656cx2vwpG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"uKAsAnFBRgrMiaDDwGrZbd","selected":false,"inside":true,"locked":true},{"type":"Light","decay":2,"distance":8,"intensity":8,"color":"#fe9200","cx":0.04809382562376093,"cy":0.17196359453393734,"cz":8.23533076857283,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[-6.262269137366339e-17,-0.2584595890813664,0.9660220705614811],"rotation":[0.2614272700856308,0,-4.440892098500626e-16],"parentId":"9DRBXRS4our7656cx2vwpG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"ndNwjPHJBZn5L5PwwRPXWh","selected":false,"inside":true,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":5,"color":"#7b64ff","cx":0.4038813832551331,"cy":-0.018771346923666346,"cz":0.4999999772934685,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"eKvvAN4QXDBPjUP3YttScs","selected":false,"locked":true},{"type":"Light","decay":2,"distance":8,"intensity":5,"color":"#f44e3b","cx":0.03479011577552929,"cy":0.29915344735612687,"cz":8.962264816189862,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[-6.262269137366339e-17,-0.2584595890813664,0.9660220705614811],"rotation":[0.2614272700856308,0,-4.440892098500626e-16],"parentId":"9DRBXRS4our7656cx2vwpG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"j4JYudDCjzNXq8FDPWZEem","selected":false,"inside":true,"locked":true},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.39094575141857246,"y":-0.6076345062918038},{"x":-0.3475489897325333,"y":-0.5252228219763136},{"x":-0.30415222804649406,"y":-0.6076345062918038},{"x":-0.3475489897325333,"y":-0.690046190607294}],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","parentType":"Wall","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"filled":true,"selectedIndex":0,"id":"it9MDEMzBf4jYFMwSdWCYB","text":"LAKE INN","fontSize":0.6,"fontColor":"white","noOutline":true,"opacity":0,"fontStrokeWidth":0.01,"locked":true}],"sceneRadius":16,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[1.9823782654476845,7.984103859589565,0.000007948413777907035],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[1.9823782654476845,7.983103482143546,150],"theme":"Mountain","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[26.70929607950559,3.177981670849796,5.962891433031834],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":13.966745921875,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"forestgreen","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.21820041958429523,2.945228709202592,5.9628914330318326],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":true,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},458:function(e){e.exports=JSON.parse('{"docid":"9oLedt6KSdnvU6ReLpvofe","time":"06/12/2023 10:14 am","timestamp":1686579271051,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":14.613120903558068,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.19344523437500172,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.036317022980521335,"type":"Foundation","solarPowerTower":{},"lx":18.159918676696766,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"label":"Box Gable","labelHeight":8,"labelSize":0.5,"showLabel":true},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":4,"roofId":"pNA4YvnHKpbgLLZoVdn8iH","ly":0.3,"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[6.699943397855505,5.67322456909281,0.1],"type":"Wall","rightRoofHeight":4,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.6999433978555056,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.6732245690928105,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.699943397855504,"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"cy":0.6732245690928105,"leftRoofHeight":4,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":4,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":4,"roofId":"pNA4YvnHKpbgLLZoVdn8iH","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"lx":10,"windows":[],"lz":4,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"pNA4YvnHKpbgLLZoVdn8iH","selected":false,"cy":0.6732245690928105,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4,"ly":0.3,"cx":-5.300056602144494,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"showLabel":false,"cx":0.6999433978555061,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-4.3267754309071895,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"pNA4YvnHKpbgLLZoVdn8iH","leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"ly":0.3,"lz":4,"leftRoofHeight":4,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4,"lx":12,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","showLabel":false,"ly":0,"lz":0.4719248971291678,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":0.014037551435416101,"selected":false,"cx":-0.4166666666666667,"normal":[0,0,1],"lx":0.08333333333333333,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":0.014037551435416101,"normal":[0,0,1],"cx":-0.25,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0,"lz":0.4719248971291678,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.24999999999999997,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333326,"color":"#ffffff","cz":0.014037551435416101,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0,"selected":false,"lz":0.4719248971291678,"type":"Window","mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.4166666666666667,"cy":0.1,"cz":0.014037551435416101,"lz":0.4719248971291678,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333341,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"lz":0.5,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#ffffff","lx":0.1,"cx":0.35,"cz":0,"ly":0,"showLabel":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"selected":false,"cz":-0.003118658584209677,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","type":"Window","normal":[0,0,1],"id":"rgPxjoaTPqdF2tQvSYYJxX","lx":0.15000000000000005,"ly":0,"color":"#ffffff","parentId":"skm8dNPSkFaVkoUwiPNfq1","lz":0.5062373171684194,"cy":0.1,"cx":0.025000000000000022,"rotation":[0,0,0],"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.32500000000000007,"rotation":[0,0,0],"type":"Window","lz":0.5,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":0,"lx":0.1499999999999999,"color":"#ffffff","cy":0.1,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jamelia","cx":1.1862593917325661,"cy":-5.878603983923892,"cz":0.05000000074505806,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.65},{"type":"Door","cx":-0.007175044455080826,"cy":0,"cz":-0.10574881686604092,"lx":0.24768342224349496,"ly":0,"lz":0.7885023662679181,"textureType":"Door Texture #5","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"j9wJCoWK33fz7y9VeMvYET","doorType":"Default","archHeight":1,"filled":true},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,6],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,6],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.25,"cy":0.1,"cz":0,"lx":0.1,"ly":0.3,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mN8bzYoiQHnqnz3EdnMx5V","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.009999999999999998,"cy":0.1,"cz":0.65,"lx":0.1,"ly":0.3,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tykEvHMLKUG24aenygTKer","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.25,"cy":0.1,"cz":0,"lx":0.1,"ly":0.3,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ptjuJgnSZ9BGF41zQTa7NN","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.4166666666666667,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2kwhV9PqZtFtk8RVLFx83","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.25,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qpEwqVCd2BoFtSevFQh92k","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.25,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qH7TW5xv9LhkiifYBpFnzX","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4166666666666667,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kGJQ1siixMwoWrD3EUKKJK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-18.764187734374996,"cy":0.14106107076947794,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"label":"Open Gable","showLabel":true,"labelHeight":7,"labelSize":0.5},{"type":"Door","cx":0,"cy":0,"cz":-0.1,"lx":0.25,"ly":0,"lz":0.8,"textureType":"Door Texture #5","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"sXi8n3YHx4BKsSMSv4hsZ3","doorType":"Default","archHeight":1,"filled":true},{"type":"Human","name":"Jess","cx":-3.1725018437499966,"cy":-6.753630704470966,"cz":0.05000000074505806,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"textureType":"Roof Texture #1","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"pNA4YvnHKpbgLLZoVdn8iH","leftRidgeLength":6,"rightRidgeLength":6,"rise":2,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture #1","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2,"ceiling":false},{"type":"Human","name":"Jeanette","cx":7.621742234374995,"cy":-6.466760136609153,"cz":0.05000000074505806,"lx":0.4,"ly":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","id":"oRmXPWxcNMFxgsrsxonDon","selected":false},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["1k67G1W1gvb3E7EbmbG1h1"],"rightJoints":["uytQSeUom5oDsFC3PKa7q8"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u1AdedeCmmKa3QYfwjJ4ya","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["tKvexMf8zrvPgydcZb5VYA"],"rightJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1k67G1W1gvb3E7EbmbG1h1","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["u1AdedeCmmKa3QYfwjJ4ya"],"rightJoints":["tKvexMf8zrvPgydcZb5VYA"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uytQSeUom5oDsFC3PKa7q8","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.36,"cy":0.1,"cz":-0.003118658584209677,"lx":0.12000000000000002,"ly":0.3,"lz":0.5062373171684194,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ffkLQGy3NT64UfpCw11G41","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.05,"cy":0.1,"cz":-0.003118658584209677,"lx":0.1,"ly":0.3,"lz":0.5062373171684194,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gNMVvT81stFdLZCLrqUQZf","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3366666666666666,"cy":0.1,"cz":0,"lx":0.12666666666666676,"ly":0.3,"lz":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5bfnZWdB6epkk2c8Lmex9Z","parentId":"uytQSeUom5oDsFC3PKa7q8","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["uytQSeUom5oDsFC3PKa7q8"],"rightJoints":["1k67G1W1gvb3E7EbmbG1h1"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tKvexMf8zrvPgydcZb5VYA","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"roofId":"45NB7k7GYboywbxoXsYHLH","leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.375,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aScdMHKjqapGhvxSXnrdVS","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"94qFJLPpyieU8kH3r8ea1u","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20833333333333334,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hqJtpQuGAWonh9XMck7DkQ","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.375,"cy":0.1,"cz":0.014037551435416101,"lx":0.08333333333333333,"ly":0.3,"lz":0.4719248971291678,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iepBWG7Nk7RRKfgVSDffBC","parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"mullionSpacing":1,"mullion":true,"mullionWidth":0.06,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":18.4159863125,"cy":-0.013675215842332555,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"label":"Hip","showLabel":true,"labelHeight":8,"labelSize":0.5},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Hip","wallsId":["tKvexMf8zrvPgydcZb5VYA"],"textureType":"Roof Texture #1","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"45NB7k7GYboywbxoXsYHLH","leftRidgeLength":3,"rightRidgeLength":3,"rise":2,"ceiling":false},{"type":"Door","cx":0.00416666666666667,"cy":0,"cz":-0.125,"lx":0.24166666666666667,"ly":0,"lz":0.75,"textureType":"Door Texture #5","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"tKvexMf8zrvPgydcZb5VYA","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"bm1UTSxwjiN1iZGr4Z4Fm6","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.35000000000000014,"cy":0.1,"cz":0.014037551435416087,"lx":0.10000000000000027,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vA6adyEkDTr58b4mpzEs5P","parentId":"1k67G1W1gvb3E7EbmbG1h1","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":1.3322676295501878e-16,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000027,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"twnicRfRAP53B9K6S8CVFm","parentId":"1k67G1W1gvb3E7EbmbG1h1","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.35000000000000014,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000027,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"oxmJ7ohqmjFLB5ye4yGS6E","parentId":"1k67G1W1gvb3E7EbmbG1h1","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3500000000000001,"cy":0.1,"cz":0.01403755143541606,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jsRnsGzxKw3CunZjMYneFD","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8d9L17Wt7kc8NaHb7DZkQA","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3500000000000001,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hVKNWxqP1tH67cRypCiM18","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.29999999999999993,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hHA24TY61rX4piy7chXHsW","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":0.6390375514354161,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sFXKinS1ygh3aQAbgbsfyW","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3000000000000001,"cy":0.1,"cz":0.014037551435416074,"lx":0.10000000000000017,"ly":0.3,"lz":0.47192489712916785,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n9vgLXoYa2nNMGT5JFGz9k","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1}],"sceneRadius":35,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,19.999999999989587],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-28.254159564913593,-27.690636175073536,3.1442036565521727],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.847108697996333,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-2.0057889063141925,7.911051887878871,2.2071518984525413],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":288,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Gable roof vs. hip roof"]}')},459:function(e){e.exports=JSON.parse('{"docid":"jBRvLNoGNN2puEDd9PXycz","time":"06/10/2023 06:24 pm","timestamp":1686435869581,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jedi","cx":6.331304507164129,"cy":-1.3012531601465285,"cz":0.05,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.56,"locked":false},{"type":"Wall","cx":0.2181336152654918,"cy":3.890044719861693,"cz":2.2408122612280286,"lx":19.557378002954934,"ly":0.3,"lz":4.671023197562504,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[9.996822616742959,3.890044719861693,0.1167755799390626],"rightPoint":[-9.560555386211975,3.890044719861694,0.1167755799390626],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":9.996822616742957,"cy":0.3560826328024773,"cz":2.2301039869226305,"lx":7.067924174118433,"ly":0.3,"lz":4.671023197562504,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[9.996822616742953,-3.177879454256739,0.1167755799390626],"rightPoint":[9.99682261674296,3.890044719861694,0.1167755799390626],"relativeAngle":1.5707963267948957,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[0,6.671023197562504],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":-9.560555386211973,"cy":0.3560826328024773,"cz":2.228839888904333,"lx":7.067924174118433,"ly":0.3,"lz":4.671023197562504,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-9.560555386211973,3.890044719861694,0.1167755799390626],"rightPoint":[-9.560555386211975,-3.177879454256739,0.1167755799390626],"relativeAngle":-1.570796326794897,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[0,6.671023197562504],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":0.2181336152654927,"cy":-3.177879454256739,"cz":2.268765007024547,"lx":19.557378002954934,"ly":0.3,"lz":4.671023197562504,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-9.560555386211975,-3.177879454256739,0.1167755799390626],"rightPoint":[9.99682261674296,-3.177879454256739,0.1167755799390626],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Foundation","cx":0,"cy":1.7959453873000797,"cz":0.05,"lx":20.027750617523758,"ly":10.567937825052699,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"enableGroupMaster":true,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture #1","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2,"ceiling":false,"locked":false},{"type":"Wall","cx":0.48326494323250757,"cy":3.5008921737627774,"cz":2.2408122612280286,"lx":9.311701011603256,"ly":0.3,"lz":4.671023197562504,"leftJoints":["vKjEHsN5hVHi8S9tPzBesN"],"rightJoints":["eTKLP2TockjZDP1RLDKvpj"],"leftPoint":[5.1391154490341355,3.500892173762777,0.1167755799390626],"rightPoint":[-4.172585562569121,3.5008921737627787,0.1167755799390626],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"o6RrXLKTD62SEJEe7jE1pv","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":5.139115449034135,"cy":-0.014752489141851436,"cz":2.2301039869226305,"lx":7.03128932580926,"ly":0.3,"lz":4.671023197562504,"leftJoints":["gTaSzURYtieAPQn32pwAn4"],"rightJoints":["o6RrXLKTD62SEJEe7jE1pv"],"leftPoint":[5.139115449034133,-3.530397152046481,0.1167755799390626],"rightPoint":[5.139115449034136,3.500892173762778,0.1167755799390626],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"vKjEHsN5hVHi8S9tPzBesN","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[0,6.671023197562504],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":-4.17258556256912,"cy":-0.01475248914185131,"cz":2.228839888904333,"lx":7.03128932580926,"ly":0.3,"lz":4.671023197562504,"leftJoints":["o6RrXLKTD62SEJEe7jE1pv"],"rightJoints":["gTaSzURYtieAPQn32pwAn4"],"leftPoint":[-4.17258556256912,3.5008921737627787,0.1167755799390626],"rightPoint":[-4.172585562569121,-3.530397152046481,0.1167755799390626],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"eTKLP2TockjZDP1RLDKvpj","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[0,6.671023197562504],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.571023197562504,"rightUnfilledHeight":4.571023197562504,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"type":"Wall","cx":0.483264943232508,"cy":-3.530397152046481,"cz":2.268765007024547,"lx":9.311701011603258,"ly":0.3,"lz":4.671023197562504,"leftJoints":["eTKLP2TockjZDP1RLDKvpj"],"rightJoints":["vKjEHsN5hVHi8S9tPzBesN"],"leftPoint":[-4.172585562569121,-3.530397152046481,0.1167755799390626],"rightPoint":[5.139115449034136,-3.530397152046481,0.1167755799390626],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"id":"gTaSzURYtieAPQn32pwAn4","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504,"locked":false},{"id":"atFqzWxSt7aWP6ZqiaDGq7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.2,"wallsId":["gTaSzURYtieAPQn32pwAn4"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rise":2,"ceiling":false,"locked":false},{"type":"Foundation","cx":0.23126993902249376,"cy":-2.0229770702149175,"cz":0.05,"lx":14.211391813883525,"ly":9.298675779004126,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"locked":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"},"enableGroupMaster":true},{"type":"Window","cx":-0.2844428535544314,"cy":0.1,"cz":-0.16056439205683565,"lx":0.14222142677721564,"ly":0.3,"lz":0.3211287841136713,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"aZCLoUJL2oqSdY1EPAoZaK","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2844428535544314,"cy":0.1,"cz":-0.16056439205683565,"lx":0.1422214267772157,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"7tBrMVcDfPB8c8BZciVReg","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":0.007111071338860792,"cy":0,"cz":-0.25,"lx":0.21333214016582355,"ly":0,"lz":0.5,"color":"white","textureType":"Door Texture #4","normal":[0,1,0],"rotation":[0,0,0],"id":"7U3cffozoc4HtMQf5rGEzr","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"doorType":"Default","archHeight":1,"filled":true,"locked":false},{"type":"Window","cx":-0.2844428535544314,"cy":0.1,"cz":0.37465024813261655,"lx":0.14222142677721564,"ly":0.3,"lz":0.3211287841136713,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"kXNUWsGU11pAFUKwvU2cgP","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":7.894875130155282e-18,"cy":0.1,"cz":0.37465024813261655,"lx":0.1422214267772157,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2TxqL85a1LDTfDpUNCK9gm","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2844428535544315,"cy":0.1,"cz":0.37465024813261655,"lx":0.14222142677721583,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"e7mrU2eTyTJt6DPomDBhWs","parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.37587117494845146,"cy":0.1,"cz":0.26760732009472615,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136712,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4UxKztqar6qH3CTGZ9qgY9","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.05369588213549307,"cy":0.1,"cz":0.2676073200947262,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136712,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tQ1H6t36xF8x6Jq7rqyTYA","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.37587117494845146,"cy":0.1,"cz":-0.1605643920568356,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136712,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2o6zHemGFi14KgXdJ3iuht","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.05369588213549307,"cy":0.1,"cz":-0.1605643920568356,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136712,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"bNFvbn2V5MqizQvTWS1gF8","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.007074212847824756,"cy":0.1,"cz":0.717187617853866,"lx":0.1273358312608462,"ly":0.3,"lz":0.14986009925304675,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tnV8oAWfG9ER3isiJKzp3v","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.28037933545424537,"cy":0.1,"cz":0.3211287841136713,"lx":0.13630590003900364,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"d65ECu9HpsufqejE9JE6SQ","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2814150068377438,"cy":0.1,"cz":0.3211287841136713,"lx":0.1445912711069909,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"6kdvjn4UXHVDJzSZhf4B4J","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.2829685139129914,"cy":0.1,"cz":-0.21408585607578087,"lx":0.1414842569564957,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"eVWLBrjytjaXb5Ykbr5VPD","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2814150068377438,"cy":0.1,"cz":-0.21408585607578087,"lx":0.14459127110699085,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2ZfkAgSXYQx6P4m4xidDeL","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.053695882135493055,"cy":0.1,"cz":0.2676073200947261,"lx":0.10739176427098611,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"oEw7Y1dUnZ4auXTsBwuqSe","parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3758711749484514,"cy":0.1,"cz":0.2676073200947261,"lx":0.10739176427098611,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4g5mEoLtYLy6qSqMvwrtZa","parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.053695882135493055,"cy":0.1,"cz":-0.16056439205683565,"lx":0.10739176427098611,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4SFYRMATJPbJgwPmaVx1ZQ","parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.3758711749484514,"cy":0.1,"cz":-0.16056439205683565,"lx":0.10739176427098611,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vJzKtUzUWEXsGn9NbVuYJR","parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.2829685139129914,"cy":0.1,"cz":-0.21408585607578084,"lx":0.14148425695649575,"ly":0.3,"lz":0.21408585607578082,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"6K9qDfssYi3YmZcNiGxeFD","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.2829685139129914,"cy":0.1,"cz":-0.21408585607578087,"lx":0.1414842569564957,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aFbFpSbkdAr9vNaBtR39Zj","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.7171876178538659,"lx":0.1414842569564957,"ly":0.3,"lz":0.14986009925304655,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"gTVRT9iKwSKBHrZBxbTWqP","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25565799256140304,"cy":0.1,"cz":0.32112878411367124,"lx":0.051131598512280566,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"nyFPVXnTmHtF1thRj3voUP","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.25565799256140304,"cy":0.1,"cz":-0.21408585607578087,"lx":0.051131598512280566,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"44QoRqthuL83hLzEWvpPy4","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.40905278809824486,"cy":0.1,"cz":-0.21408585607578087,"lx":0.051131598512280566,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"eL8eT9b15BPwUEoDRzrTes","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.40905278809824486,"cy":0.1,"cz":0.32112878411367124,"lx":0.051131598512280566,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"ik59hsieStesGBV1HN1iPA","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.28555769237173745,"cy":0.1,"cz":0.21408585607578087,"lx":0.13630590003900364,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jzPeoP6c34HMtziwDKHv3a","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":0.28037933545424537,"cy":0.1,"cz":0.21408585607578087,"lx":0.13630590003900364,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jsfEyvAHdrSn2vaQ4ia3zy","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.25565799256140304,"cy":0.1,"cz":0.3211287841136713,"lx":0.05113159851228061,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"1RhUm2Y2uUHcxK5xvxbogA","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.40905278809824486,"cy":0.1,"cz":0.3211287841136713,"lx":0.05113159851228061,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"5ZJyH8rrUf7HJAQnM2bWVm","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.40905278809824486,"cy":0.1,"cz":-0.21408585607578087,"lx":0.05113159851228061,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"nw3rdMtcMqRG4LGoRcBsfK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Window","cx":-0.25565799256140304,"cy":0.1,"cz":-0.21408585607578087,"lx":0.05113159851228061,"ly":0.3,"lz":0.21408585607578087,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.05,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vmF1fcU9LPrzoGvKVJXeJJ","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1,"locked":false},{"type":"Door","cx":-1.1353495590844666e-17,"cy":0,"cz":-0.04661843672800818,"lx":0.35792118958596425,"ly":0,"lz":0.9067631265439836,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"4u2Lemg9g24YVU44Rt2Xic","interior":true,"locked":false},{"type":"Window","cx":0.025565799256140304,"cy":0.3,"cz":0.05352146401894522,"lx":0.10226319702456121,"ly":0.3,"lz":0.5352146401894522,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0,0,0],"parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"bqg8AAYEpwNKgztwidBiEk","locked":false},{"type":"Window","cx":0.4720595639184657,"cy":-3.3684520937463995,"cz":4.763171084384773,"lx":6.938544523756692,"ly":0.2,"lz":0.00409574132092067,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.2,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5149965428074765,0,-2.220446049250313e-16],"parentId":"1iq4TPqH8xr1w2VxMAh8MU","parentType":"Roof","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"aGPExW23jA85jXEJyeCpz1","interior":true,"empty":true,"polygonTop":[-0.035382757507848805,4.273887307898969],"locked":false},{"type":"Window","cx":-2.6203952752607758,"cy":3.667558239043421,"cz":4.776209255164273,"lx":3.171105348094547,"ly":0.2,"lz":0.017651285838173516,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.2,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5172270860325816,0,3.141592653589793],"parentId":"atFqzWxSt7aWP6ZqiaDGq7","parentType":"Roof","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"72o3pTJwsE9dUcnRyyjnEw","interior":true,"polygonTop":[0.5,4.226955821233187],"empty":true,"locked":false},{"type":"Window","cx":-2.693211019665715,"cy":-3.6869046603465847,"cz":4.781988313035353,"lx":2.9580970480479842,"ly":0.2,"lz":0.09882178864870414,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.2,"sillWidth":0,"windowType":"Polygonal","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.5172270860325816,0,0],"parentId":"atFqzWxSt7aWP6ZqiaDGq7","parentType":"Roof","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"uPuuLDNiMgZBsKvCnm6tSV","polygonTop":[-0.5,4.164786986092855],"interior":true,"empty":true,"locked":false},{"type":"Door","cx":-0.3090654703490424,"cy":0,"cz":-0.014505558316641022,"lx":0.3603907064477181,"ly":0,"lz":0.9709888833667178,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"8s4tEpToJXwoUEYbHRBASE","interior":true,"locked":false},{"type":"Door","cx":0.3060665281723105,"cy":0,"cz":-0.014505558316641022,"lx":0.3543928220942542,"ly":0,"lz":0.9709888833667178,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"kP69Q4f2kGriQePVP8M1cp","locked":false,"interior":true}],"sceneRadius":13,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.2194678710540945,-0.08163623568179776,-2.1779207174878058e-7],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.2194678710540945,-0.08263661312798706,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-0.0825236074539012,-21.73896740327531,3.532398591116602],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":33.40365140230189,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[0.5164600410339055,-0.2045268879302931,3.380292682783385],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":256,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Gable-and-valley roof"]}')},460:function(e){e.exports=JSON.parse('{"docid":"xtKNTywwk7s3D5dx9fE6NJ","time":"06/12/2023 10:07 am","timestamp":1686578834737,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"4/22/2022, 10:30:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"Jocelyn","cx":7.030735525496638,"cy":-10.425839702214304,"cz":0,"lx":0.4,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.4},{"type":"Wall","cx":0.19888873388653605,"cy":5.462586096288465,"cz":2.2408122612280286,"lx":9.311701011603256,"ly":0.3,"lz":4.671023197562504,"leftJoints":["vKjEHsN5hVHi8S9tPzBesN"],"rightJoints":["eTKLP2TockjZDP1RLDKvpj"],"leftPoint":[4.854739239688164,5.462586096288464,0.1167755799390626],"rightPoint":[-4.4569617719150925,5.462586096288466,0.1167755799390626],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"o6RrXLKTD62SEJEe7jE1pv","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":4.671023197562504,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504},{"type":"Wall","cx":4.854739239688163,"cy":1.9469414333838355,"cz":2.2301039869226305,"lx":7.03128932580926,"ly":0.3,"lz":4.671023197562504,"leftJoints":["gTaSzURYtieAPQn32pwAn4"],"rightJoints":["o6RrXLKTD62SEJEe7jE1pv"],"leftPoint":[4.854739239688161,-1.5687032295207934,0.1167755799390626],"rightPoint":[4.854739239688166,5.462586096288464,0.1167755799390626],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"vKjEHsN5hVHi8S9tPzBesN","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":7.104360278230817,"rightRoofHeight":4.671023197562504,"centerRoofHeight":[-0.5,7.104360278230817],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504},{"type":"Wall","cx":-4.456961771915092,"cy":1.9469414333838349,"cz":2.228839888904333,"lx":7.03128932580926,"ly":0.3,"lz":4.671023197562504,"leftJoints":["o6RrXLKTD62SEJEe7jE1pv"],"rightJoints":["gTaSzURYtieAPQn32pwAn4"],"leftPoint":[-4.456961771915091,5.462586096288466,0.1167755799390626],"rightPoint":[-4.456961771915092,-1.568703229520794,0.1167755799390626],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"eTKLP2TockjZDP1RLDKvpj","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":4.671023197562504,"rightRoofHeight":7.104360278230817,"centerRoofHeight":[0.5,7.104360278230817],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.671023197562504,"rightTopPartialHeight":4.671023197562504},{"type":"Wall","cx":0.1988887338865364,"cy":-1.5687032295207946,"cz":2.268765007024547,"lx":9.311701011603258,"ly":0.3,"lz":7.104360278230817,"leftJoints":["eTKLP2TockjZDP1RLDKvpj"],"rightJoints":["vKjEHsN5hVHi8S9tPzBesN"],"leftPoint":[-4.456961771915092,-1.568703229520794,0.1167755799390626],"rightPoint":[4.854739239688165,-1.5687032295207934,0.1167755799390626],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"gTaSzURYtieAPQn32pwAn4","parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofId":"atFqzWxSt7aWP6ZqiaDGq7","selected":false,"leftRoofHeight":7.104360278230817,"rightRoofHeight":7.104360278230817,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.104360278230817,"rightTopPartialHeight":7.104360278230817},{"id":"atFqzWxSt7aWP6ZqiaDGq7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"35YTYxrb8rDJ1XNYjgkPTK","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.2,"wallsId":["gTaSzURYtieAPQn32pwAn4"],"ridgeLeftPoint":[0.5,1],"ridgeRightPoint":[-0.5,1],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":-0.18703080111903558,"cy":-9.915377662073155,"cz":0.05,"lx":13.403144619496231,"ly":13.222063624055503,"lz":0.1167755799390626,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"35YTYxrb8rDJ1XNYjgkPTK","selected":false,"enableGroupMaster":true,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Wall","cx":0.35217238415000696,"cy":2.6927731238245474,"cz":2.2408122612280286,"lx":8.76701829919503,"ly":0.3,"lz":2.6726233773992516,"leftJoints":["v7ziTUW2TZM5T4TwmNAdjJ"],"rightJoints":["vhCUXkYA9VDRSco52tUYkV"],"leftPoint":[4.735681533747522,2.692773123824547,0.0668155844349813],"rightPoint":[-4.031336765447508,2.692773123824548,0.0668155844349813],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gG5CjV1FxMvKL6tHfFayym","parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofId":"jVi4m1ThhBLxMFASq2GS9v","selected":false,"leftRoofHeight":2.6726233773992516,"rightRoofHeight":2.6726233773992516,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.6726233773992516,"rightTopPartialHeight":2.6726233773992516},{"type":"Wall","cx":4.735681533747522,"cy":0.48062987575342486,"cz":2.2301039869226305,"lx":4.424286496142247,"ly":0.3,"lz":2.6726233773992516,"leftJoints":["eTtjCc8c1PMfKVHADbJHAr"],"rightJoints":["gG5CjV1FxMvKL6tHfFayym"],"leftPoint":[4.73568153374752,-1.731513372317698,0.0668155844349813],"rightPoint":[4.735681533747522,2.692773123824548,0.0668155844349813],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"v7ziTUW2TZM5T4TwmNAdjJ","parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofId":"jVi4m1ThhBLxMFASq2GS9v","selected":false,"leftRoofHeight":4.738508482435636,"rightRoofHeight":2.6726233773992516,"centerRoofHeight":[-0.5,4.738508482435636],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.6726233773992516,"rightTopPartialHeight":2.6726233773992516},{"type":"Wall","cx":-4.031336765447506,"cy":0.48062987575342486,"cz":2.228839888904333,"lx":4.424286496142247,"ly":0.3,"lz":2.6726233773992516,"leftJoints":["gG5CjV1FxMvKL6tHfFayym"],"rightJoints":["eTtjCc8c1PMfKVHADbJHAr"],"leftPoint":[-4.031336765447506,2.692773123824548,0.0668155844349813],"rightPoint":[-4.031336765447508,-1.731513372317698,0.0668155844349813],"relativeAngle":-1.5707963267948972,"textureType":"Wall Texture Default","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vhCUXkYA9VDRSco52tUYkV","parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofId":"jVi4m1ThhBLxMFASq2GS9v","selected":false,"leftRoofHeight":2.6726233773992516,"rightRoofHeight":4.738508482435636,"centerRoofHeight":[0.5,4.738508482435636],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.6726233773992516,"rightTopPartialHeight":2.6726233773992516},{"type":"Wall","cx":0.35217238415000696,"cy":-1.731513372317698,"cz":2.268765007024547,"lx":8.76701829919503,"ly":0.3,"lz":4.738508482435636,"leftJoints":["vhCUXkYA9VDRSco52tUYkV"],"rightJoints":["v7ziTUW2TZM5T4TwmNAdjJ"],"leftPoint":[-4.031336765447508,-1.731513372317698,0.0668155844349813],"rightPoint":[4.735681533747522,-1.731513372317698,0.0668155844349813],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eTtjCc8c1PMfKVHADbJHAr","parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofId":"jVi4m1ThhBLxMFASq2GS9v","selected":false,"leftRoofHeight":4.738508482435636,"rightRoofHeight":4.738508482435636,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Empty","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.273631578164477,"rightUnfilledHeight":4.273631578164477,"leftTopPartialHeight":4.738508482435636,"rightTopPartialHeight":4.738508482435636},{"id":"jVi4m1ThhBLxMFASq2GS9v","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"parentId":"6YXGTgZyXDxpnnbdLfyv5j","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","roofType":"Gable","textureType":"Roof Texture #1","thickness":0.2,"wallsId":["eTtjCc8c1PMfKVHADbJHAr"],"ridgeLeftPoint":[0.5,1],"ridgeRightPoint":[-0.5,1],"selected":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":-0.7467654326238933,"cy":-6.853383216679946,"cz":0.05,"lx":11.313197651444508,"ly":6.0997112704854475,"lz":0.0668155844349813,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6YXGTgZyXDxpnnbdLfyv5j","selected":false,"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3,"id":"A"}},{"type":"Door","cx":-0.05369588213549307,"cy":0,"cz":-0.25,"lx":0.15034846997938056,"ly":0,"lz":0.5,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"91pkNVx7ajPdGc4gqpa6PF","doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":-0.32217529281295837,"cy":0.1,"cz":-0.16056439205683565,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136713,"shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"7ha8A9howKC84aYKTw9eqN","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.26847941067746534,"cy":0.1,"cz":-0.16056439205683565,"lx":0.10739176427098614,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"8VBQnA65eh5k5Uw55HF1Cb","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.32217529281295837,"cy":0.1,"cz":0.32112878411367135,"lx":0.10739176427098608,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"un8y8e9JpPi1naZZMpwMVZ","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.05369588213549307,"cy":0.1,"cz":0.32112878411367135,"lx":0.10739176427098614,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"v1BvsJ4T7JhsFhezNhcX4K","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.26847941067746534,"cy":0.1,"cz":0.32112878411367135,"lx":0.10739176427098614,"ly":0.3,"lz":0.21408585607578096,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"soGnwUqCB3auZqHEHNS1LQ","parentId":"o6RrXLKTD62SEJEe7jE1pv","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-1.2546916046160377e-17,"cy":0.1,"cz":0.18708210226259175,"lx":0.22602514572054705,"ly":0.3,"lz":0.7483284090503667,"shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vhCUXkYA9VDRSco52tUYkV","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","id":"aRTYiMKpbFtXogCmbdfpaN","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2844428535544314,"cy":0.1,"cz":-0.16056439205683565,"lx":0.1422214267772157,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"m5qoAfq3cFT2Jt7voLAZVP","parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2844428535544314,"cy":0.1,"cz":-0.16056439205683565,"lx":0.1422214267772157,"ly":0.3,"lz":0.3211287841136713,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aF1Pnz747SfgYcvKbrSeaH","parentId":"eTKLP2TockjZDP1RLDKvpj","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","tint":"#73D8FF","shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"selected":false,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.01710957989146351,"cy":0.1,"cz":0.05948559174013301,"lx":0.39922353080081546,"ly":0.3,"lz":0.7041900664751375,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"gG5CjV1FxMvKL6tHfFayym","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","id":"uicWDWWbqUVhqeZaftrgmK","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-1.0037532836928301e-16,"cy":0.1,"cz":0.07392401455912316,"lx":0.22602514572054688,"ly":0.3,"lz":0.6753132208371573,"shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"v7ziTUW2TZM5T4TwmNAdjJ","foundationId":"6YXGTgZyXDxpnnbdLfyv5j","id":"pVu2one7ax8iwQZsAqqvKk","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.03555535669430392,"cy":0.1,"cz":-0.05352146401894522,"lx":0.21333214016582355,"ly":0.3,"lz":0.5352146401894522,"shutter":{"showLeft":true,"showRight":true,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vKjEHsN5hVHi8S9tPzBesN","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"sTNhou8URmxdSewCTJQCAy","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3518965680359005,"lx":0.8591341141678889,"ly":0.3,"lz":0.14075862721436017,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"kVcMN888wkNzdrNFsdAiaM","opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0.053695882135493055,"cy":0,"cz":-0.25,"lx":0.42956705708394444,"ly":0,"lz":0.5,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"wpqi2Ry4DwtfWLp7rkgBQh"},{"type":"Door","cx":0,"cy":0,"cz":-0.1796206863928199,"lx":0.8591341141678889,"ly":0,"lz":0.6407586272143603,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gTaSzURYtieAPQn32pwAn4","foundationId":"35YTYxrb8rDJ1XNYjgkPTK","id":"nnyBHsqWtA9kbVTgYsewZw","interior":true}],"sceneRadius":21,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.6516049999999995,-8.08817077589694,-0.00000806397029662998],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.6516049999999995,-8.089170775904988,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[16.59744270375234,-0.7176337384414646,3.223728034339639],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":37.01235612443423,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.4383511164484704,-7.6519084348386786,3.2237280343396377],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60},"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360},"heatFluxScaleFactor":5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Clerestory roof"]}')},461:function(e){e.exports=JSON.parse('{"docid":"4aDAL58XHFYL5qfHvxH7ag","time":"03/21/2023 09:15 am","timestamp":1679404555806,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 1:30:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Wall","cx":-1.5970326990453252,"cy":4.004815564210436,"cz":2.2408122612280286,"lx":6.360799275911862,"ly":0.3,"lz":7.5,"leftJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"rightJoints":["11Ltx28CSTVpm6gjZuBH9w"],"leftPoint":[1.5833669389106055,4.004815564210436,0.12302997096647357],"rightPoint":[-4.777432337001256,4.004815564210436,0.12302997096647357],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n8LvMVp1hZ7BptmwrWpcMT","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"bdD5ztB6YGXg4uAZiGZwDr","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":1.5833669389106042,"cy":0.7942223442409677,"cz":2.2301039869226305,"lx":6.421186439938938,"ly":0.3,"lz":7.5,"leftJoints":["hndwqtrrygFvfqvBJrvZYu"],"rightJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"leftPoint":[1.5833669389106024,-2.4163708757285014,0.12302997096647357],"rightPoint":[1.5833669389106055,4.004815564210436,0.12302997096647357],"relativeAngle":1.5707963267948961,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e5r2Cqz5K28ewHbKWcFnYZ","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"bdD5ztB6YGXg4uAZiGZwDr","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-4.777432337001256,"cy":0.7942223442409677,"cz":2.228839888904333,"lx":6.421186439938938,"ly":0.3,"lz":7.5,"leftJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"rightJoints":["hndwqtrrygFvfqvBJrvZYu"],"leftPoint":[-4.777432337001256,4.004815564210436,0.12302997096647357],"rightPoint":[-4.777432337001256,-2.4163708757285014,0.12302997096647357],"relativeAngle":-1.5707963267948966,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"11Ltx28CSTVpm6gjZuBH9w","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"bdD5ztB6YGXg4uAZiGZwDr","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-1.5970326990453252,"cy":-2.4163708757285014,"cz":2.268765007024547,"lx":6.360799275911862,"ly":0.3,"lz":7.5,"leftJoints":["11Ltx28CSTVpm6gjZuBH9w"],"rightJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"leftPoint":[-4.777432337001256,-2.4163708757285014,0.12302997096647357],"rightPoint":[1.5833669389106055,-2.4163708757285014,0.12302997096647357],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hndwqtrrygFvfqvBJrvZYu","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"bdD5ztB6YGXg4uAZiGZwDr","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Foundation","cx":1.5369607065875481,"cy":-0.7337478948430647,"cz":0.05,"lx":9.90872374106268,"ly":8.491876915965634,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"locked":false},{"type":"Wall","cx":0.19112531149657697,"cy":5.620514141149594,"cz":2.2408122612280286,"lx":11.291398093915323,"ly":0.3,"lz":4,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[5.836824358454238,5.620514141149594,0.1],"rightPoint":[-5.454573735461085,5.620514141149594,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.3275511143392143,"cy":0.1,"cz":-0.06250000000000006,"lx":0.0708994221944815,"ly":0.3,"lz":0.3750000000000001,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29040066034916406,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729104,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.07260016508729102,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":5.836824358454238,"cy":-0.00995475119942446,"cz":2.2301039869226305,"lx":11.260937784698037,"ly":0.3,"lz":4,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[5.836824358454236,-5.640423643548443,0.1],"rightPoint":[5.83682435845424,5.620514141149594,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-5.454573735461083,"cy":-0.00995475119942446,"cz":2.228839888904333,"lx":11.260937784698037,"ly":0.3,"lz":4,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-5.454573735461083,5.620514141149594,0.1],"rightPoint":[-5.454573735461085,-5.640423643548443,0.1],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.1911253114965783,"cy":-5.640423643548443,"cz":2.268765007024547,"lx":11.291398093915324,"ly":0.3,"lz":4,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-5.454573735461085,-5.640423643548443,0.1],"rightPoint":[5.83682435845424,-5.640423643548443,0.1],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.3949264794283293,"cy":0.1,"cz":-0.0625,"lx":0.08134902219083363,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"29QuQvndX2M7Sq4iEkq1Xz","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.21716749210312172,"cy":0.1,"cz":-0.0484624485645839,"lx":0.0738661714047936,"ly":0.3,"lz":0.3469248971291678,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4LUVPCUMNMxJkqRL8wFtEe","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.21342606671010173,"cy":0.1,"cz":-0.0625,"lx":0.072600165087291,"ly":0.3,"lz":0.375,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"9FGAjvvq6tsggdPdWysCTK","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.39930090798010054,"cy":0.1,"cz":-0.06249999999999989,"lx":0.072600165087291,"ly":0.3,"lz":0.3749999999999998,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"ucbeQgKEoSy9dHSmSFvaic","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":false,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-0.16683617706583842,"cy":0.10266831665150722,"cz":0.06,"lx":14.604582269301902,"ly":13.013221811141948,"lz":0.12,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":false,"enableGroupMaster":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","roofStructure":"Default","wallsId":["roDDPncXBpNgmNum9aUaov"],"ridgeWidth":2.741183421535105,"textureType":"Roof Texture #2","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"wCPmoV4VwkScF5K7cf32UD","rise":2,"ceiling":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["e5r2Cqz5K28ewHbKWcFnYZ","n8LvMVp1hZ7BptmwrWpcMT","11Ltx28CSTVpm6gjZuBH9w","hndwqtrrygFvfqvBJrvZYu"],"textureType":"Roof Texture #2","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"bdD5ztB6YGXg4uAZiGZwDr","rise":2.399521849228247,"ceiling":false},{"type":"Window","cx":-0.23360168934983674,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.91,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"jA4MqD7ALHMKTSCdEzWHix","windowType":"Default","archHeight":1},{"type":"Window","cx":0.2336016893498367,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3LT1rVtnjso2jP6z4TaDHZ","parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.23729790815292326,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ckaBeGV6Ni9NQ3te3EiN3g","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.22990547054675017,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fEDLXuYBqFYJiCkBziofUB","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.23360168934983674,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"v9cnm7VWZ62giNve9jyv7m","parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2336016893498367,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qVLTtiLnxXpR5yqcHhSa9e","parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.23729790815292326,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"meXeAm7nDdwTPRbzo9vVFs","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.22990547054675017,"cy":0.1,"cz":0.4,"lx":0.31146891913311564,"ly":0.3,"lz":0.13333333333333333,"mullion":true,"mullionWidth":0.1,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.08,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qJBjFd5e5FHkdYG6fhgp91","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.91,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Julia","cx":0.2781860356360548,"cy":-5.386859602824218,"cz":0.05999999865889549,"lx":0.43,"lz":1.71,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","id":"jiceWNCXNG4mowM8Y1pnuj","selected":false,"ly":0.43},{"type":"Door","cx":0,"cy":0,"cz":-0.1875,"lx":0.17712598416645625,"ly":0,"lz":0.625,"doorType":"Arched","archHeight":1,"textureType":"No Door Texture","color":"#73d8ff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"fTMHecXmkxoFyi5nVgZruF","filled":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.04428149604161406,"y":-0.35},{"x":-0.06199409445825968,"y":-0.3},{"x":-0.06199409445825968,"y":-0.25},{"x":-0.04428149604161406,"y":-0.2},{"x":0.05142883345662218,"y":-0.20084745762711861},{"x":0.07085039366658251,"y":-0.25},{"x":0.07085039366658251,"y":-0.3},{"x":0.05313779524993687,"y":-0.35}],"parentId":"roDDPncXBpNgmNum9aUaov","parentType":"Wall","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":true,"selectedIndex":1,"id":"pTMN5Rfce2g9VdNDy1KZ2d","text":"DEPOT","fontSize":0.3,"fontColor":"gold"},{"type":"Door","cx":0,"cy":0,"cz":-0.31666666666666665,"lx":0.31146891913311564,"ly":0,"lz":0.36666666666666664,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"trSHy7vD1sqEajCH8ej493"},{"type":"Door","cx":0,"cy":0,"cz":-0.31666666666666665,"lx":0.31146891913311564,"ly":0,"lz":0.36666666666666664,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"cf7HkkLcbaZLJwzCBfEgBH"}],"sceneRadius":10,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-7.335485572988376,-17.642820069421862,3.809724387059762],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":35.161738318212514,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.3277453693129069,-0.2039271051931454,3.5347379885285575],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Monitor roof"]}')},462:function(e){e.exports=JSON.parse('{"docid":"sXLwKRDpQ3Uupy3LJSKC7z","time":"06/12/2023 10:27 am","timestamp":1686580058007,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"type":"Human","name":"June","cx":2.0733747451945757,"cy":-6.061881854428435,"cz":0.05000000074505806,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.65},{"type":"Wall","cx":0.6394231663265257,"cy":5.872000955672556,"cz":2.2408122612280286,"lx":10.96242641823205,"ly":0.3,"lz":5.158338809071295,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.120636375442551,5.872000955672555,0],"rightPoint":[-4.8417900427894995,5.872000955672556,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Wall","cx":6.12063637544255,"cy":0.696812767580496,"cz":2.2301039869226305,"lx":10.35037637618412,"ly":0.3,"lz":5.158338809071295,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.120636375442548,-4.478375420511564,0],"rightPoint":[6.120636375442552,5.872000955672556,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"centerRoofHeight":[0,7.404178387671576],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Wall","cx":-4.8417900427894995,"cy":0.696812767580496,"cz":2.228839888904333,"lx":10.35037637618412,"ly":0.3,"lz":5.158338809071295,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-4.841790042789499,5.872000955672556,0],"rightPoint":[-4.8417900427894995,-4.478375420511564,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"centerRoofHeight":[0,7.404178387671576],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Wall","cx":0.6394231663265262,"cy":-4.478375420511564,"cz":2.268765007024547,"lx":10.962426418232052,"ly":0.3,"lz":5.158338809071295,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-4.8417900427894995,-4.478375420511564,0],"rightPoint":[6.120636375442552,-4.478375420511564,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"1iq4TPqH8xr1w2VxMAh8MU","leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.4104930631521381,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004747,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"w2kwhV9PqZtFtk8RVLFx83","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Foundation","cx":-11.865426237722085,"cy":-0.3020514645326293,"cz":0.05,"lx":16.58973102119719,"ly":15.125130138250977,"lz":0.0859723134845216,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"label":"Colonial","labelHeight":9,"labelSize":0.5,"showLabel":true},{"type":"Door","cx":-0.022805170175118798,"cy":0,"cz":-0.25,"lx":0.1368310210507128,"ly":0,"lz":0.5,"textureType":"Door Texture #1","color":"white","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"sXi8n3YHx4BKsSMSv4hsZ3","doorType":"Default","archHeight":1,"filled":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.15,"roofType":"Gable","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"Roof Texture #2","color":"#cccccc","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"1iq4TPqH8xr1w2VxMAh8MU","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":2.2458395786002807,"ceiling":false},{"type":"Window","cx":0.228051701751188,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"p9ZFePdMbr5NJNutJpztLz","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.41049306315213846,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047536,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"onfGgeAsDqrPXW9qAoSbJh","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.228051701751188,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047519,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mM8yRHvdQcQxaerLVfTrHK","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.228051701751188,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047519,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"reViENhjL3rZ1iP9Y6KZQV","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4104930631521384,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047512,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dKNjnS17wjTVoaiN1bY7jW","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.289844532311202,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373401,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bJfKVxMyGkSvssMyjbaW7W","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.289844532311202,"cy":0.1,"cz":-0.24232607555784985,"lx":0.09661484410373396,"ly":0,"lz":0.2907912906694198,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u4p2yGTyGA3NaJrURgo1aw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2880871761594032,"cy":0.1,"cz":0.24232607555784988,"lx":0.10012955640733165,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"swiJmUxEJ9JBgVoJXFiWMw","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.289844532311202,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373405,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dJpqWBHMDhQTd71cTnXaW4","parentId":"2RETAxyRMzZBEQkBGms56R","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31927238245166323,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004752,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j5a1DqXozDg23XnZHUwT3y","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31927238245166323,"cy":0.1,"cz":0.24232607555784988,"lx":0.0912206807004752,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wdagFqacKyLy9R8i7SRZPq","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.045610340350237685,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047537,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tJCV3miBMBbJoQ5KVL5GnC","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0456103403502376,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004752,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nRhC43dgJ576icoywiE43t","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3648827228019008,"cy":0.1,"cz":0.24232607555784988,"lx":0.0912206807004752,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fY9urdYNGp76qQUc5TkF8d","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3677465315760693,"cy":0.1,"cz":-0.24232607555784988,"lx":0.08549306315213832,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"kwvhmrhVppPu21YKVKixoa","parentId":"giYTP9Qg6uJ3yfkS1RoDqG","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3381519543630691,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373387,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nZtTu7kGPQBjfFfeNj7L7w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3381519543630691,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373387,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"433Qj5XWec6xkx6KMSVinb","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3381519543630691,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373387,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tPa2K6uLM9bNJjLjnApS5w","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3381519543630691,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373387,"ly":0,"lz":0.29079129066941983,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cAQmf2baCS5Y2WWh241r8n","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.228051701751188,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1fmjy8Zg2jNAAXJDNAtxtX","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4104930631521384,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vxHToBs6fvSBn4dmam1NPh","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Juro","cx":-1.8455745212476522,"cy":-6.047134973310751,"cz":0.042986158281564275,"lx":0.494,"ly":0.494,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"hszWAAkWMHNQoK3CMWw8fv","id":"pBBZ6mrTSk6FLL8v8uuPYG","selected":false},{"type":"Wall","cx":0.6394231663265257,"cy":5.872000955672556,"cz":2.2408122612280286,"lx":10.96242641823205,"ly":0.3,"lz":5.158338809071295,"leftJoints":["sLjmied5ovE5nNuq6aFYPi"],"rightJoints":["723nwVCZT2zzcwYqNJCWVS"],"leftPoint":[6.120636375442551,5.872000955672555,0],"rightPoint":[-4.8417900427894995,5.872000955672556,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"iwGA1TfwpSpggq8C9JfAoJ","parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"wqXe9pYmicSvR7iYewPLF7","selected":false,"leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.31927238245166323,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004752,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cXa45JVn2G9m2N2fUuSH2s","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31927238245166323,"cy":0.1,"cz":0.24232607555784988,"lx":0.0912206807004752,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iJdJ7WAwuh83JHVXJKYXzH","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.045610340350237685,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047537,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dkUReYpnmAcqhYPPyQxoRH","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0456103403502376,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004752,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aFrtgne6bioyotbdk5S8KN","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3648827228019008,"cy":0.1,"cz":0.24232607555784988,"lx":0.0912206807004752,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"aEweEoYSW7Np4EVuX2Fdsb","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3677465315760693,"cy":0.1,"cz":-0.24232607555784988,"lx":0.08549306315213832,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4xUmcM8pypieKfKsDMRcGC","parentId":"iwGA1TfwpSpggq8C9JfAoJ","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":6.12063637544255,"cy":0.696812767580496,"cz":2.2301039869226305,"lx":10.35037637618412,"ly":0.3,"lz":5.158338809071295,"leftJoints":["hZoCtb7QW6TLTCnow7LXWA"],"rightJoints":["iwGA1TfwpSpggq8C9JfAoJ"],"leftPoint":[6.120636375442548,-4.478375420511564,0],"rightPoint":[6.120636375442552,5.872000955672556,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"sLjmied5ovE5nNuq6aFYPi","parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"wqXe9pYmicSvR7iYewPLF7","selected":false,"leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"centerRoofHeight":[0.17663019315906894,8.721280120974388],"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.3381519543630691,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373387,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"5cz4chLixfxh7WLLDakTKw","parentId":"sLjmied5ovE5nNuq6aFYPi","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3381519543630691,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373387,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nGCDuaQuHsagkRRXKZrc7L","parentId":"sLjmied5ovE5nNuq6aFYPi","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3381519543630691,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373387,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8t3b9gLTjPqXrVKA67DgG7","parentId":"sLjmied5ovE5nNuq6aFYPi","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3381519543630691,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373387,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pVYrF6C2mmp9q8PmrhehV8","parentId":"sLjmied5ovE5nNuq6aFYPi","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-4.8417900427894995,"cy":0.696812767580496,"cz":2.228839888904333,"lx":10.35037637618412,"ly":0.3,"lz":5.158338809071295,"leftJoints":["iwGA1TfwpSpggq8C9JfAoJ"],"rightJoints":["hZoCtb7QW6TLTCnow7LXWA"],"leftPoint":[-4.841790042789499,5.872000955672556,0],"rightPoint":[-4.8417900427894995,-4.478375420511564,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"723nwVCZT2zzcwYqNJCWVS","parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"wqXe9pYmicSvR7iYewPLF7","selected":false,"leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"centerRoofHeight":[-0.17663019315906894,8.721280120974388],"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.289844532311202,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09661484410373401,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bCczr2bfNJ9hHru5dKivtn","parentId":"723nwVCZT2zzcwYqNJCWVS","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.289844532311202,"cy":0.1,"cz":-0.24232607555784985,"lx":0.09661484410373396,"ly":0.3,"lz":0.2907912906694198,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8hu972Coyp2SdPeApdzUcM","parentId":"723nwVCZT2zzcwYqNJCWVS","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2880871761594032,"cy":0.1,"cz":0.24232607555784988,"lx":0.10012955640733165,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"stJETXTgkaem9cnthaz7DF","parentId":"723nwVCZT2zzcwYqNJCWVS","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.289844532311202,"cy":0.1,"cz":0.24232607555784988,"lx":0.09661484410373405,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8uMuJn7ATgkV1KuyvniGpN","parentId":"723nwVCZT2zzcwYqNJCWVS","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6394231663265262,"cy":-4.478375420511564,"cz":2.268765007024547,"lx":10.962426418232052,"ly":0.3,"lz":5.158338809071295,"leftJoints":["723nwVCZT2zzcwYqNJCWVS"],"rightJoints":["sLjmied5ovE5nNuq6aFYPi"],"leftPoint":[-4.8417900427894995,-4.478375420511564,0],"rightPoint":[6.120636375442552,-4.478375420511564,0],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#b0bc00","normal":[0,0,1],"rotation":[0,0,0],"id":"hZoCtb7QW6TLTCnow7LXWA","parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"wqXe9pYmicSvR7iYewPLF7","selected":false,"leftRoofHeight":5.158338809071295,"rightRoofHeight":5.158338809071295,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.158338809071295,"rightTopPartialHeight":5.158338809071295},{"type":"Window","cx":-0.4104930631521381,"cy":0.1,"cz":-0.24232607555784988,"lx":0.0912206807004747,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hQMgr7y3LyHNDTRRkE594t","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Door","cx":-0.022805170175118798,"cy":0,"cz":-0.25,"lx":0.1368310210507128,"ly":0,"lz":0.5,"color":"white","textureType":"Door Texture #1","normal":[0,1,0],"rotation":[0,0,0],"id":"qph4faDddEH8gdVzH6ivZr","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","selected":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Window","cx":0.228051701751188,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n6cw2a16gnaNtUX8qEggGq","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.41049306315213846,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047536,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tPpwv4eAJzufaa29tD1UJG","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.228051701751188,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"vTVeGVzfHjGyBh4GUdsJTK","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.228051701751188,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"88gwLvpD9kwfDsBZHSLpf2","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4104930631521384,"cy":0.1,"cz":0.24232607555784988,"lx":0.09122068070047512,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"taea46Jq5kmPKnsEuNdHWM","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.228051701751188,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s6dPHQVJrM3Acf87nyeVab","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4104930631521384,"cy":0.1,"cz":-0.24232607555784988,"lx":0.09122068070047519,"ly":0.3,"lz":0.29079129066941983,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"j8XTJHQPmBNW4amR5ZNmdA","parentId":"hZoCtb7QW6TLTCnow7LXWA","foundationId":"hszWAAkWMHNQoK3CMWw8fv","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"id":"wqXe9pYmicSvR7iYewPLF7","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hszWAAkWMHNQoK3CMWw8fv","foundationId":"hszWAAkWMHNQoK3CMWw8fv","roofType":"Gable","textureType":"Roof Texture #2","thickness":0.15,"wallsId":["hZoCtb7QW6TLTCnow7LXWA"],"ridgeLeftPoint":[-0.17663019315906894,1],"ridgeRightPoint":[0.17663019315906894,1],"selected":false,"rise":3.562941311903093,"ceiling":false},{"type":"Foundation","cx":11.036197795997648,"cy":-0.3904739664770651,"cz":0.05,"lx":16.58973102119719,"ly":15.125130138250977,"lz":0.0859723134845216,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hszWAAkWMHNQoK3CMWw8fv","selected":false,"showLabel":true,"label":"Saltbox","labelHeight":9,"labelSize":0.5}],"sceneRadius":25,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,19.9999999999895],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-21.088801690415984,-18.193636596891952,4.218925791626301],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":17.147500000000004,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"forestgreen","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-1.8484762737245803,-0.01599768987763376,3.116362939071387],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":234,"height":61}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Colonial vs. saltbox"]}')},463:function(e){e.exports=JSON.parse('{"docid":"kZU7r98YD2swbMpBZrHNnd","time":"06/12/2023 10:32 am","timestamp":1686580347333,"owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022 10:15:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":14.613120903558068,"solarUpdraftTower":{},"parentId":"Ground","cx":-9.804203725230073,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":0.08530001295248146,"type":"Foundation","solarPowerTower":{},"lx":18.159918676696766,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"label":"Gambrel ","labelHeight":9,"labelSize":0.5,"showLabel":true},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":4,"roofId":"sfGxVh6UQ5Rh5eXQutdage","ly":0.3,"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[6.699943397855505,5.67322456909281,0.1],"type":"Wall","rightRoofHeight":4,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.6999433978555056,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.6732245690928105,"color":"#f44e3b","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.699943397855504,"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"cy":0.6732245690928105,"leftRoofHeight":4,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":4,"centerRoofHeight":[0,8],"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":4,"roofId":"sfGxVh6UQ5Rh5eXQutdage","centerLeftRoofHeight":[-0.35,6],"centerRightRoofHeight":[0.35,6],"color":"#f44e3b","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"lx":10,"windows":[],"lz":4,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"sfGxVh6UQ5Rh5eXQutdage","selected":false,"cy":0.6732245690928105,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"centerRoofHeight":[0,8],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4,"ly":0.3,"cx":-5.300056602144494,"centerLeftRoofHeight":[-0.35,6],"centerRightRoofHeight":[0.35,6],"color":"#f44e3b","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"showLabel":false,"cx":0.6999433978555061,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-4.3267754309071895,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"sfGxVh6UQ5Rh5eXQutdage","leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"ly":0.3,"lz":4,"leftRoofHeight":4,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4,"lx":12,"color":"#f44e3b","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","showLabel":false,"ly":0,"lz":0.375,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","id":"wpUTVyngSAjDJDRdEV1NA6","cz":-0.0625,"selected":false,"cx":-0.375,"normal":[0,0,1],"lx":0.08333333333333333,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"id":"5ncRWHnRQyocXJujBx5jNE","color":"#ffffff","selected":false,"cy":0.1,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","rotation":[0,0,0],"cz":-0.06249999999999989,"normal":[0,0,1],"cx":-0.20833333333333334,"type":"Window","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333333,"ly":0,"lz":0.3749999999999998,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"cx":0.20833333333333337,"id":"piUU3YZv2L1Zvedb6EFfFm","parentId":"cV8MyCuhWAsvEyyFuVqVqg","lx":0.08333333333333341,"color":"#ffffff","cz":-0.0625,"cy":0.1,"rotation":[0,0,0],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","normal":[0,0,1],"ly":0,"selected":false,"lz":0.375,"type":"Window","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"rotation":[0,0,0],"normal":[0,0,1],"cx":0.375,"cy":0.1,"cz":-0.06250000000000006,"lz":0.3749999999999999,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","lx":0.08333333333333341,"parentId":"cV8MyCuhWAsvEyyFuVqVqg","color":"#ffffff","selected":false,"ly":0,"id":"upiLr8uqx55GDieKSLsjPj","type":"Window","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"lz":0.375,"cy":0.1,"selected":false,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"d9R7TXr9G1aG6bGwu14v9k","color":"#ffffff","lx":0.1,"cx":0.3,"cz":-0.0625,"ly":0,"showLabel":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0,"selected":false,"type":"Window","foundationId":"m7AH7DcnoGzAq9kryBy4RS","cy":0.1,"cz":-0.0625,"id":"9k4wgdGyyHM5BC1r2nJbQH","lx":0.1,"color":"#ffffff","lz":0.375,"normal":[0,0,1],"parentId":"skm8dNPSkFaVkoUwiPNfq1","rotation":[0,0,0],"cx":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"ly":0,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.3,"rotation":[0,0,0],"type":"Window","lz":0.375,"id":"85T9TwcUR7am6Rcbs7Fcvu","normal":[0,0,1],"selected":false,"parentId":"skm8dNPSkFaVkoUwiPNfq1","cz":-0.0625,"lx":0.09999999999999995,"color":"#ffffff","cy":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0,"lz":0.375,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"dGQYRX5aMuZKouydnVo1zc","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0,"lz":0.375,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cni5XLCGZ7vNfLqxjgsnua","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.1875,"lx":0.16666666666666666,"ly":0,"lz":0.625,"textureType":"Door Texture #6","selected":false,"showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"j9wJCoWK33fz7y9VeMvYET","color":"white","doorType":"Default","archHeight":1,"filled":true},{"type":"Roof","thickness":0.2,"cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"roofType":"Gambrel","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"Roof Texture #1","selected":false,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"sfGxVh6UQ5Rh5eXQutdage","color":"#666666","rise":4,"ceiling":false,"frontRidgePoint":[0.35,0.5],"backRidgePoint":[0.35,0.5],"topRidgePoint":[0,1]},{"type":"Human","name":"Jeanette","cx":0.21229430424866003,"cy":-5.637713455371184,"cz":0.05000000074505806,"lx":0.4,"ly":0.4,"lz":1.62,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false},{"type":"Window","cx":-0.3500000000000001,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xvSfp96ouDUqqhbUKFAfvN","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"uMr1zC8iUpUcFHuHfA3LNb","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3500000000000001,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nTJAtH1bkusjTMRvTpeUq1","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":0.9375,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wJizEa8fmJx3s6DnYFJCaB","parentId":"8XDG3EHsQoX26MhuzwMYUM","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":0.9375,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fcbYfWunuYUDKu74uGTtE2","parentId":"skm8dNPSkFaVkoUwiPNfq1","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.041666666666666664,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e5UwypTCfHps6bAP47dvKX","parentId":"2u4Fe7xnA6kkXXVGrQ4eyJ","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555056,"cy":5.6732245690928105,"cz":2.2408122612280286,"lx":12,"ly":0.3,"lz":4,"leftJoints":["aJzBKycDgPV2XFyreGUWbN"],"rightJoints":["q3QyrcfYtaEUJUy3dDMe3o"],"leftPoint":[6.699943397855505,5.67322456909281,0.1],"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"ajX6DE1iwh52m5aYDEnUZw","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"mV7ZzdDseX98dNDS9YnHz7","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"f27adUV1mvqbvyHKYmSuV2","parentId":"ajX6DE1iwh52m5aYDEnUZw","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3333333333333333,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tWZGLDh66KAhJVvZqAMQj9","parentId":"ajX6DE1iwh52m5aYDEnUZw","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.041666666666666664,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"mpyjLbrKcGFUF8TjcaBsHx","parentId":"ajX6DE1iwh52m5aYDEnUZw","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":6.699943397855504,"cy":0.6732245690928105,"cz":2.2301039869226305,"lx":10,"ly":0.3,"lz":4,"leftJoints":["vZvx6xJpNjwVutXgBYTqDu"],"rightJoints":["ajX6DE1iwh52m5aYDEnUZw"],"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"aJzBKycDgPV2XFyreGUWbN","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"mV7ZzdDseX98dNDS9YnHz7","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.3500000000000001,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wAVcmtVfsGGWzQD4FYwZNW","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":8.881784197001253e-17,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u5BLpPtdFZZZhqt5769cX6","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3500000000000001,"cy":0.1,"cz":-0.0625,"lx":0.10000000000000017,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"3kDRvtG74CSaYS7Hdz4Zf9","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-5.300056602144494,"cy":0.6732245690928105,"cz":2.228839888904333,"lx":10,"ly":0.3,"lz":4,"leftJoints":["ajX6DE1iwh52m5aYDEnUZw"],"rightJoints":["vZvx6xJpNjwVutXgBYTqDu"],"leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"q3QyrcfYtaEUJUy3dDMe3o","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"mV7ZzdDseX98dNDS9YnHz7","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":0.3,"cy":0.1,"cz":-0.0625,"lx":0.1,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gyFrbE3iZarFXfLEH1H67R","parentId":"q3QyrcfYtaEUJUy3dDMe3o","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.0625,"lx":0.1,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"unBvd3fv6vjx3w5z7xjUYQ","parentId":"q3QyrcfYtaEUJUy3dDMe3o","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3,"cy":0.1,"cz":-0.0625,"lx":0.09999999999999995,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"a5UaEaWbJaymLnXeqKPnVG","parentId":"q3QyrcfYtaEUJUy3dDMe3o","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":0.6999433978555061,"cy":-4.3267754309071895,"cz":2.268765007024547,"lx":12,"ly":0.3,"lz":4,"leftJoints":["q3QyrcfYtaEUJUy3dDMe3o"],"rightJoints":["aJzBKycDgPV2XFyreGUWbN"],"leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#f44e3b","normal":[0,0,1],"rotation":[0,0,0],"id":"vZvx6xJpNjwVutXgBYTqDu","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"mV7ZzdDseX98dNDS9YnHz7","selected":false,"leftRoofHeight":4,"rightRoofHeight":4,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.375,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333333,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2GCuByhTAXSLeW2Qg1rbmy","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.20833333333333334,"cy":0.1,"cz":-0.06249999999999989,"lx":0.08333333333333333,"ly":0.3,"lz":0.3749999999999998,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jqoCSv6SGc3CUNj2d3NntP","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.20833333333333337,"cy":0.1,"cz":-0.0625,"lx":0.08333333333333341,"ly":0.3,"lz":0.375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fHoEdLPaiDXqCueBgeDdLS","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.375,"cy":0.1,"cz":-0.06250000000000006,"lx":0.08333333333333341,"ly":0.3,"lz":0.3749999999999999,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cDtJU4W55HjRmy9cDhmm6R","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Door","cx":0,"cy":0,"cz":-0.1875,"lx":0.16666666666666666,"ly":0,"lz":0.625,"color":"white","textureType":"Door Texture #6","normal":[0,1,0],"rotation":[0,0,0],"id":"9M7tkz3sEgnV2Z9JRHNunf","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","selected":false,"doorType":"Default","archHeight":1,"filled":true},{"type":"Human","name":"Jett","cx":0.21229430424866003,"cy":-5.637713455371184,"cz":0.05000000074505806,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"fbbzRkZEo4AnT3QEsWR9oP","selected":false},{"type":"Foundation","cx":10.097000941178736,"cy":0.15684188850117087,"cz":0.05,"lx":18.159918676696766,"ly":14.613120903558068,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hM4gzHVfAcT1HDeDhXqfQE","selected":false,"label":"Mansard","labelHeight":9,"labelSize":0.5,"showLabel":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","roofStructure":"Default","wallsId":["vZvx6xJpNjwVutXgBYTqDu"],"ridgeWidth":1.3796830302831236,"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","id":"mV7ZzdDseX98dNDS9YnHz7","rise":2.8592746089260386,"ceiling":false},{"type":"Window","cx":-1.7044433380331139,"cy":-4.015924463712854,"cz":5.284591699130502,"lx":1,"ly":0.2,"lz":1.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.2587938987974363,0,0],"parentId":"mV7ZzdDseX98dNDS9YnHz7","parentType":"Roof","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","id":"cH5YJR4J6bQYpX3WB9k67N"},{"type":"Window","cx":-2.7018576414835405,"cy":-1.2664219595013968,"cz":7.091630555089024,"lx":1,"ly":0.2,"lz":1.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.519146114246523,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"1DzhW8vmdxVB9mcmU4b6BC"},{"type":"Window","cx":4.341146883752691,"cy":-1.251091065564622,"cz":7.1103910909217225,"lx":1,"ly":0.2,"lz":1.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.519146114246523,0,0],"parentId":"sfGxVh6UQ5Rh5eXQutdage","parentType":"Roof","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"8aBtPjYUmoaUgGD59eww1P"},{"type":"Window","cx":3.2042827482748226,"cy":-4.014959357661002,"cz":5.287583934394446,"lx":1,"ly":0.2,"lz":1.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[1.2587938987974363,0,0],"parentId":"mV7ZzdDseX98dNDS9YnHz7","parentType":"Roof","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","id":"g7sgiaMwM5so3QfreNjMbC"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-21.571150309425594,-21.972462076133603,4.616004408449201],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":31.733468832186787,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.5906667798973315,5.766093748984623,2.3165783316967063],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":318,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Gambrel roof vs. mansard roof"]}')},464:function(e){e.exports=JSON.parse('{"docid":"qbfYd6J3bjVQWhg6gmeyL9","time":"03/21/2023 09:11 am","timestamp":1679404281857,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"7/22/2022, 5:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"1600 Pennsylvania Avenue NW, Washington, DC 20500, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":38.8976763,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-77.0365298,"airConvectiveCoefficient":5,"diurnalTemperatureModel":1,"highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"sutDaysPerYear":4,"sutGridCellSize":1,"noAnimationForSolarUpdraftTowerSimulation":false},"elements":[{"type":"Foundation","cx":2.437186281961438,"cy":4.616260107535155,"cz":0.15,"lx":74.26384799474762,"ly":70.57289198325788,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3Qmj2gXj2Lmc28MbpT7BdQ","enableGroupMaster":true,"locked":false,"textureType":"Foundation Texture #4"},{"type":"Wall","cx":-27.296564319985823,"cy":-3.2481977926108314,"cz":0,"lx":27,"ly":0.8,"lz":15,"relativeAngle":4.71238898038469,"leftPoint":[-27.296564319985823,10.251802207389169,0.25],"rightPoint":[-27.296564319985823,-16.74819779261083,0.25],"leftJoints":["jF3H99H3SvFmx1EtcFgSUR"],"rightJoints":["qEgP3g76n6YGpTNdaUNRJ5"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"u5UupDCTgXC6oFiX9y4uby","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-1.7965643199858263,"cy":10.251802207389169,"cz":0,"lx":51,"ly":0.8,"lz":15,"relativeAngle":3.141592653589793,"leftPoint":[23.703435680014174,10.251802207389169,0.25],"rightPoint":[-27.296564319985823,10.251802207389169,0.25],"leftJoints":["pkajzTvgP9i43n8Xx6zTrw"],"rightJoints":["u5UupDCTgXC6oFiX9y4uby"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"jF3H99H3SvFmx1EtcFgSUR","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":23.703435680014174,"cy":-2.7481977926108314,"cz":0,"lx":26,"ly":0.8,"lz":15,"relativeAngle":1.5707963267948966,"leftPoint":[23.703435680014174,-15.748197792610831,0.25],"rightPoint":[23.703435680014174,10.251802207389169,0.25],"leftJoints":["vsV2452bmxt8JnQXXqBe5N"],"rightJoints":["jF3H99H3SvFmx1EtcFgSUR"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"pkajzTvgP9i43n8Xx6zTrw","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-19.046564319985826,"cy":-16.74819779261083,"cz":3.733120462951788,"lx":16.5,"ly":0.8,"lz":15,"relativeAngle":0,"leftPoint":[-27.296564319985823,-16.74819779261083,0.25],"rightPoint":[-10.796564319985826,-16.74819779261083,0.25],"leftJoints":["u5UupDCTgXC6oFiX9y4uby"],"rightJoints":["oHVfosgpAEPgTvFqa59jhu"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"qEgP3g76n6YGpTNdaUNRJ5","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":15.453435680014174,"cy":-15.748197792610831,"cz":0,"lx":16.5,"ly":0.8,"lz":15,"relativeAngle":0,"leftPoint":[7.203435680014174,-15.748197792610831,0.25],"rightPoint":[23.703435680014174,-15.748197792610831,0.25],"leftJoints":["3nWwhqzYyg3BoBTyzmSgQv"],"rightJoints":["pkajzTvgP9i43n8Xx6zTrw"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"vsV2452bmxt8JnQXXqBe5N","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"wallStructure":"Default","structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":6.953435680014174,"cy":-16.74819779261083,"cz":0,"lx":2.0615528128088303,"ly":0.8,"lz":15,"relativeAngle":1.3258176636680323,"leftPoint":[6.703435680014174,-17.74819779261083,0.25],"rightPoint":[7.203435680014174,-15.748197792610831,0.25],"leftJoints":["juEYyWFfCjJDE4b169Lr6e"],"rightJoints":["vsV2452bmxt8JnQXXqBe5N"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"3nWwhqzYyg3BoBTyzmSgQv","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-10.546564319985826,"cy":-17.49819779261083,"cz":0,"lx":1.5811388300841898,"ly":0.8,"lz":15,"relativeAngle":5.034139534781332,"leftPoint":[-10.796564319985826,-16.74819779261083,0.25],"rightPoint":[-10.296564319985826,-18.24819779261083,0.25],"leftJoints":["qEgP3g76n6YGpTNdaUNRJ5"],"rightJoints":["7KCjLbvxBFDXSftkUZDS2v"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"oHVfosgpAEPgTvFqa59jhu","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-9.546564319985826,"cy":-19.24819779261083,"cz":0,"lx":2.5,"ly":0.8,"lz":15,"relativeAngle":5.355890089177974,"leftPoint":[-10.296564319985826,-18.24819779261083,0.25],"rightPoint":[-8.796564319985826,-20.24819779261083,0.25],"leftJoints":["oHVfosgpAEPgTvFqa59jhu"],"rightJoints":["oSmqM3WG97smXJFvN7dA25"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"7KCjLbvxBFDXSftkUZDS2v","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-8.046564319985826,"cy":-20.99819779261083,"cz":0,"lx":2.1213203435596424,"ly":0.8,"lz":15,"relativeAngle":5.497787143782137,"leftPoint":[-8.796564319985826,-20.24819779261083,0.25],"rightPoint":[-7.296564319985826,-21.74819779261083,0.25],"leftJoints":["7KCjLbvxBFDXSftkUZDS2v"],"rightJoints":["6BCCjk22xgQQ9jwAeGEMpR"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"oSmqM3WG97smXJFvN7dA25","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-6.546564319985826,"cy":-22.24819779261083,"cz":0,"lx":1.8027756377319946,"ly":0.8,"lz":15,"relativeAngle":5.6951827036320175,"leftPoint":[-7.296564319985826,-21.74819779261083,0.25],"rightPoint":[-5.796564319985826,-22.74819779261083,0.25],"leftJoints":["oSmqM3WG97smXJFvN7dA25"],"rightJoints":["mrpM4sL27ca3MHv3JwptDB"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"6BCCjk22xgQQ9jwAeGEMpR","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-4.796564319985826,"cy":-23.24819779261083,"cz":0,"lx":2.23606797749979,"ly":0.8,"lz":15,"relativeAngle":5.81953769817878,"leftPoint":[-5.796564319985826,-22.74819779261083,0.25],"rightPoint":[-3.7965643199858263,-23.74819779261083,0.25],"leftJoints":["6BCCjk22xgQQ9jwAeGEMpR"],"rightJoints":["onQ3RZrBRz8TRewvvY3dTV"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"mrpM4sL27ca3MHv3JwptDB","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-2.7965643199858263,"cy":-23.74819779261083,"cz":0,"lx":1.9999999999999998,"ly":0.8,"lz":15,"relativeAngle":0,"leftPoint":[-3.7965643199858263,-23.74819779261083,0.25],"rightPoint":[-1.7965643199858263,-23.74819779261083,0.25],"leftJoints":["mrpM4sL27ca3MHv3JwptDB"],"rightJoints":["cKAWjnd2X23kJ1QdKrzyaP"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"onQ3RZrBRz8TRewvvY3dTV","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureWidth":0.7,"structureSpacing":5,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-0.7965643199858263,"cy":-23.49819779261083,"cz":0,"lx":2.0615528128088303,"ly":0.8,"lz":15,"relativeAngle":0.24497866312686423,"leftPoint":[-1.7965643199858263,-23.74819779261083,0.25],"rightPoint":[0.20343568001417367,-23.24819779261083,0.25],"leftJoints":["onQ3RZrBRz8TRewvvY3dTV"],"rightJoints":["ksg7ADGGcB7LaHQWR2gDoP"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"cKAWjnd2X23kJ1QdKrzyaP","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":0.9534356800141737,"cy":-22.99819779261083,"cz":0,"lx":1.5811388300841898,"ly":0.8,"lz":15,"relativeAngle":0.32175055439664213,"leftPoint":[0.20343568001417367,-23.24819779261083,0.25],"rightPoint":[1.7034356800141737,-22.74819779261083,0.25],"leftJoints":["cKAWjnd2X23kJ1QdKrzyaP"],"rightJoints":["tjit5nfeyfk7MgJnZwEuUo"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"ksg7ADGGcB7LaHQWR2gDoP","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":2.4534356800141737,"cy":-22.24819779261083,"cz":0,"lx":1.8027756377319946,"ly":0.8,"lz":15,"relativeAngle":0.588002603547567,"leftPoint":[1.7034356800141737,-22.74819779261083,0.25],"rightPoint":[3.2034356800141737,-21.74819779261083,0.25],"leftJoints":["ksg7ADGGcB7LaHQWR2gDoP"],"rightJoints":["2aizppjx7nR9dWK7oFqe3X"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"tjit5nfeyfk7MgJnZwEuUo","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":3.9534356800141737,"cy":-21.24819779261083,"cz":0,"lx":1.8027756377319946,"ly":0.8,"lz":15,"relativeAngle":0.588002603547567,"leftPoint":[3.2034356800141737,-21.74819779261083,0.25],"rightPoint":[4.703435680014174,-20.74819779261083,0.25],"leftJoints":["tjit5nfeyfk7MgJnZwEuUo"],"rightJoints":["8ocZPrJmGusu3tZWJzWvDk"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"2aizppjx7nR9dWK7oFqe3X","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":5.203435680014174,"cy":-20.24819779261083,"cz":0,"lx":1.4142135623730951,"ly":0.8,"lz":15,"relativeAngle":0.7853981633974483,"leftPoint":[4.703435680014174,-20.74819779261083,0.25],"rightPoint":[5.703435680014174,-19.74819779261083,0.25],"leftJoints":["2aizppjx7nR9dWK7oFqe3X"],"rightJoints":["juEYyWFfCjJDE4b169Lr6e"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"8ocZPrJmGusu3tZWJzWvDk","color":"white","wallStructure":"Pillar","opacity":0,"roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":6.203435680014174,"cy":-18.74819779261083,"cz":0,"lx":2.23606797749979,"ly":0.8,"lz":15,"relativeAngle":1.1071487177940904,"leftPoint":[5.703435680014174,-19.74819779261083,0.25],"rightPoint":[6.703435680014174,-17.74819779261083,0.25],"leftJoints":["8ocZPrJmGusu3tZWJzWvDk"],"rightJoints":["3nWwhqzYyg3BoBTyzmSgQv"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"juEYyWFfCjJDE4b169Lr6e","color":"white","roofId":"kKLW3PicqjFWjN5PqUDTTj","leftRoofHeight":15,"rightRoofHeight":15,"wallStructure":"Pillar","opacity":0,"structureSpacing":5,"structureWidth":0.7,"structureColor":"white","locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["oHVfosgpAEPgTvFqa59jhu","7KCjLbvxBFDXSftkUZDS2v","oSmqM3WG97smXJFvN7dA25","6BCCjk22xgQQ9jwAeGEMpR","mrpM4sL27ca3MHv3JwptDB","onQ3RZrBRz8TRewvvY3dTV","cKAWjnd2X23kJ1QdKrzyaP","ksg7ADGGcB7LaHQWR2gDoP","tjit5nfeyfk7MgJnZwEuUo","2aizppjx7nR9dWK7oFqe3X","8ocZPrJmGusu3tZWJzWvDk","juEYyWFfCjJDE4b169Lr6e","3nWwhqzYyg3BoBTyzmSgQv","vsV2452bmxt8JnQXXqBe5N","pkajzTvgP9i43n8Xx6zTrw","jF3H99H3SvFmx1EtcFgSUR","u5UupDCTgXC6oFiX9y4uby","qEgP3g76n6YGpTNdaUNRJ5"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"kKLW3PicqjFWjN5PqUDTTj","locked":false,"rise":0,"ceiling":false},{"type":"Foundation","cx":1.202928279289015,"cy":-0.8889074596387783,"cz":0.1,"lx":64.84314999489811,"ly":43.56565669817109,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"b7DVyKfyTBHZGANbVbGoYG","locked":false},{"type":"Wall","cx":-0.1363522997348845,"cy":12.047335526575006,"cz":0,"lx":44,"ly":0.3,"lz":17,"relativeAngle":3.141592653589793,"leftPoint":[21.863647700265116,12.047335526575006,0.2],"rightPoint":[-22.136352299734884,12.04733552657501,0.2],"leftJoints":["sEoC32EE5BhvottJbmBN7P"],"rightJoints":["r8Aw9XiLCw9kPKUMgd3t6u"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"gtmtUrJvJf5sJGi7m3ucvT","roofId":"dnGfHzSjH6Qt6pNJ8jFJUj","leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":16.110000000000003,"rightUnfilledHeight":16.110000000000003,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-21.886352299734884,"cy":2.5473355265750053,"cz":0,"lx":19.00657780874821,"ly":0.3,"lz":17,"relativeAngle":4.738698697637612,"leftPoint":[-22.136352299734884,12.047335526575006,0.2],"rightPoint":[-21.636352299734884,-6.952664473424995,0.2],"leftJoints":["gtmtUrJvJf5sJGi7m3ucvT"],"rightJoints":["rxcHxAK8KNRZb3EZ7ovrqm"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"r8Aw9XiLCw9kPKUMgd3t6u","roofId":"dnGfHzSjH6Qt6pNJ8jFJUj","leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":16.110000000000003,"rightUnfilledHeight":16.110000000000003,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":0.1136477002651155,"cy":-6.952664473424995,"cz":0,"lx":43.5,"ly":0.3,"lz":17,"relativeAngle":0,"leftPoint":[-21.636352299734884,-6.952664473424995,0.2],"rightPoint":[21.863647700265116,-6.952664473424995,0.2],"leftJoints":["r8Aw9XiLCw9kPKUMgd3t6u"],"rightJoints":["sEoC32EE5BhvottJbmBN7P"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"rxcHxAK8KNRZb3EZ7ovrqm","roofId":"dnGfHzSjH6Qt6pNJ8jFJUj","leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":16.014014541320304,"rightUnfilledHeight":16.014014541320304,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":21.863647700265116,"cy":2.5473355265750053,"cz":0,"lx":19,"ly":0.3,"lz":17,"relativeAngle":1.5707963267948966,"leftPoint":[21.863647700265116,-6.952664473424995,0.2],"rightPoint":[21.863647700265116,12.047335526575006,0.2],"leftJoints":["rxcHxAK8KNRZb3EZ7ovrqm"],"rightJoints":["gtmtUrJvJf5sJGi7m3ucvT"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"sEoC32EE5BhvottJbmBN7P","roofId":"dnGfHzSjH6Qt6pNJ8jFJUj","leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":16.110000000000003,"rightUnfilledHeight":16.110000000000003,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Mansard","roofStructure":"Default","wallsId":["rxcHxAK8KNRZb3EZ7ovrqm"],"ridgeWidth":1.6897028772572007,"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"b7DVyKfyTBHZGANbVbGoYG","foundationId":"b7DVyKfyTBHZGANbVbGoYG","id":"dnGfHzSjH6Qt6pNJ8jFJUj","locked":false,"rise":1.1924072822886274,"ceiling":false},{"type":"Foundation","cx":2.0776940726226174,"cy":18.14658482221914,"cz":0.1,"lx":23.456509054864263,"ly":24.556989889910795,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"sQbhet5xpiSK5NzTWtub4a","locked":false},{"type":"Wall","cx":-8.831120616583963,"cy":0.3221979196479152,"cz":0,"lx":17.297870029495435,"ly":0.5,"lz":15,"relativeAngle":-1.5707963267948966,"leftPoint":[-8.831120616583963,8.971132934395634,0],"rightPoint":[-8.831120616583963,-8.326737095099803,0],"leftJoints":["7QCAeFgCM4uwoEq1rdWfs2"],"rightJoints":["ue429MHHFRd7tE3xfNNNHx"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"8kN3EwUCnSjrTbu7YtQvQY","roofId":"89u35YTLctNXWRDNsxwcpj","wallStructure":"Pillar","opacity":0,"structureSpacing":6,"structureWidth":1,"structureColor":"white","locked":false,"leftRoofHeight":15,"rightRoofHeight":15,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-1.165400792362441,"cy":8.971132934395634,"cz":0,"lx":15.331439648443038,"ly":0.8,"lz":15,"relativeAngle":3.141592653589793,"leftPoint":[6.500319031859077,8.971132934395634,0],"rightPoint":[-8.83112061658396,8.971132934395634,0],"leftJoints":["cCcLVBABwpzcuXp9FsPst3"],"rightJoints":["8kN3EwUCnSjrTbu7YtQvQY"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"7QCAeFgCM4uwoEq1rdWfs2","roofId":"89u35YTLctNXWRDNsxwcpj","wallStructure":"Pillar","opacity":0,"structureSpacing":5.6,"structureWidth":1,"structureColor":"white","locked":false,"leftRoofHeight":15,"rightRoofHeight":15,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":6.500319031859077,"cy":0.3221979196479152,"cz":0,"lx":17.297870029495435,"ly":0.5,"lz":15,"relativeAngle":1.5707963267948966,"leftPoint":[6.500319031859077,-8.326737095099803,0],"rightPoint":[6.500319031859077,8.971132934395634,0],"leftJoints":["ue429MHHFRd7tE3xfNNNHx"],"rightJoints":["7QCAeFgCM4uwoEq1rdWfs2"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"cCcLVBABwpzcuXp9FsPst3","roofId":"89u35YTLctNXWRDNsxwcpj","wallStructure":"Pillar","opacity":0,"structureSpacing":6,"structureWidth":1,"structureColor":"white","locked":false,"leftRoofHeight":15,"rightRoofHeight":15,"fill":"Full","eavesLength":0.6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-1.1654007923624428,"cy":-8.326737095099803,"cz":0,"lx":15.331439648443041,"ly":0.5,"lz":15,"relativeAngle":0,"leftPoint":[-8.831120616583963,-8.326737095099803,0],"rightPoint":[6.500319031859077,-8.326737095099803,0],"leftJoints":["8kN3EwUCnSjrTbu7YtQvQY"],"rightJoints":["cCcLVBABwpzcuXp9FsPst3"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"ue429MHHFRd7tE3xfNNNHx","roofId":"89u35YTLctNXWRDNsxwcpj","structureSpacing":5.6,"structureWidth":1,"wallStructure":"Default","structureColor":"white","opacity":0.5,"locked":false,"leftRoofHeight":15,"rightRoofHeight":15,"fill":"Full","eavesLength":0.6,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":15,"rightTopPartialHeight":15},{"type":"Wall","cx":-1.459252183107493,"cy":4.715511268475593,"cz":0,"lx":8.560946140897292,"ly":0.3,"lz":17,"leftJoints":["gpDtE9g3zjB5xUcdy4p2bn"],"rightJoints":["ozPT6yyjumU6Hv81G3owfN"],"leftPoint":[2.821220887341153,4.715511268475593,0],"rightPoint":[-5.739725253556139,4.715511268475594,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"cGxpdDXk7BPKiVfi6VxNx9","parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofId":"3DT5vkx2wE8Avqo6NjE3qK","selected":false,"leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-5.691083514119223,"cy":1.2695607261280444,"cz":0,"lx":6.89258765896258,"ly":0.3,"lz":17,"leftJoints":["cGxpdDXk7BPKiVfi6VxNx9"],"rightJoints":["2zvZ3adRvEkJq9fVPEEKKi"],"leftPoint":[-5.739725253556139,4.715511268475593,0],"rightPoint":[-5.642441774682306,-2.1763898162195043,0],"relativeAngle":-1.5566816409948834,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"ozPT6yyjumU6Hv81G3owfN","parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofId":"3DT5vkx2wE8Avqo6NjE3qK","selected":false,"leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":-1.4106104436705764,"cy":-2.1763898162195043,"cz":0,"lx":8.46366266202346,"ly":0.3,"lz":17,"leftJoints":["ozPT6yyjumU6Hv81G3owfN"],"rightJoints":["gpDtE9g3zjB5xUcdy4p2bn"],"leftPoint":[-5.642441774682306,-2.1763898162195043,0],"rightPoint":[2.821220887341153,-2.1763898162195043,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"2zvZ3adRvEkJq9fVPEEKKi","parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofId":"3DT5vkx2wE8Avqo6NjE3qK","selected":false,"leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"type":"Wall","cx":2.821220887341153,"cy":1.2695607261280444,"cz":0,"lx":6.891901084695098,"ly":0.3,"lz":17,"leftJoints":["2zvZ3adRvEkJq9fVPEEKKi"],"rightJoints":["cGxpdDXk7BPKiVfi6VxNx9"],"leftPoint":[2.821220887341153,-2.1763898162195043,0],"rightPoint":[2.821220887341153,4.715511268475593,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"gpDtE9g3zjB5xUcdy4p2bn","parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofId":"3DT5vkx2wE8Avqo6NjE3qK","selected":false,"leftRoofHeight":17,"rightRoofHeight":17,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":17,"rightTopPartialHeight":17},{"id":"3DT5vkx2wE8Avqo6NjE3qK","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"cyVPK1qLJT1KbaGL6qLYHA","foundationId":"cyVPK1qLJT1KbaGL6qLYHA","roofType":"Mansard","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["2zvZ3adRvEkJq9fVPEEKKi"],"ridgeWidth":1.6897028772572007,"selected":false,"locked":false,"rise":1.1924072822886274,"ceiling":false},{"type":"Foundation","cx":2.1156734519362868,"cy":-14.279123441940943,"cz":0.1,"lx":15.481779487215247,"ly":15.111518843057006,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"cyVPK1qLJT1KbaGL6qLYHA","selected":false,"locked":false},{"type":"Window","cx":-0.2878787878787879,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#b3b3b3","normal":[0,0,1],"rotation":[0,0,0],"parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"5TpJDxszAzRvyQ2NqfKkn9","opacity":0.5,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.045454545454545456,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"isnfsXJ1sYeWDDj1v3HAcy","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19696969696969696,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rjznXiHLyLsFZBtBqoe6me","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4393939393939394,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hRT3G1Qxj9ddwfGbVmjK67","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.4090909090909091,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4FZyv3iFANwURNdtJmSf5k","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16666666666666666,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9XgeyGKZ17bF6hmvudf1pb","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07575757575757576,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tmSZBUv79gGQEmqdHUeNBv","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3181818181818182,"cy":0.3,"cz":0.26666666666666666,"lx":0.09090909090909091,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hpKyGgh393UrDCYt2TFEPH","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2878787878787879,"cy":0.3,"cz":-0.15,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"4AD8LAo94avXAwRxmXoTW5","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.045454545454545456,"cy":0.3,"cz":-0.15,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"o746xoPC2dwGtGgutFsDXX","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19696969696969696,"cy":0.3,"cz":-0.15,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"c53UUVUecAFBsz89jbxVYA","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4393939393939394,"cy":0.3,"cz":-0.15,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bpg8E63ShDakBXvmrGVvhc","parentId":"qEgP3g76n6YGpTNdaUNRJ5","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jedi","cx":10.792902287976906,"cy":-24.111012140339845,"cz":0.15000000596046095,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"jXBttvkEdJUcgsQyoxkJyY","selected":false,"ly":0.56,"locked":false},{"type":"Window","cx":-0.4090909090909091,"cy":0.3,"cz":-0.11666666666666667,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9D4XHpdhCgSutX6wu9btGJ","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16666666666666666,"cy":0.3,"cz":-0.11666666666666667,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gWSjVYZUm8Qw4rZTGCdJqU","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07575757575757576,"cy":0.3,"cz":-0.11666666666666667,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ssjJa1pfa5qX67vq3t3ms4","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3181818181818182,"cy":0.3,"cz":-0.11666666666666667,"lx":0.09090909090909091,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"cm6JHszxRa71LB4AL9o4hM","parentId":"vsV2452bmxt8JnQXXqBe5N","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.45098039215686275,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"eGFMPp63uaJ8Z6dEip1wCT","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3627450980392157,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"6g1oBhU14hr3mTV912e9dM","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2647058823529411,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"nAfcKafQoUyknKRwU7zYyz","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.17647058823529407,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jdht2qsNqNvtRuTiSrxhRn","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.45098039215686275,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sMRK1zZtDamAUaaju5kzEB","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3627450980392157,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ivaEUPDqF8h1KuwffoQE9v","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2647058823529412,"cy":0.3,"cz":-0.15,"lx":0.03921568627450977,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"qoUC82g8EKd6aX4rrRhS51","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.17647058823529407,"cy":0.3,"cz":-0.15,"lx":0.03921568627450987,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9G3Na6w4LghC1tGJcYYMQX","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.46078431372549017,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"9zGVUoYGVo2E4qf9ZuPkby","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.37254901960784315,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pErJmrncghcaMqwr5VCYq6","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2843137254901961,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bNA5NJ5jM3rqPHYpWU9YvX","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19607843137254904,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"u6JmSSS7MnsTc3abTnBiZB","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19607843137254902,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fnbrpCKzRDKtbEzFZ8278Y","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.28431372549019607,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iNCEukMLjXLvD5gbDy1xJM","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.37254901960784315,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"amzAdeamET282epqcjwyww","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.46078431372549017,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bRsXBDeYfSso6tiCqiYCUp","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3149455302863263,"cy":0.1,"cz":-0.0125,"lx":0.29836944974494073,"ly":0.5,"lz":0.2,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.8,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#b3b3b3","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7QCAeFgCM4uwoEq1rdWfs2","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"x7JsEH8PfGjJ373jxu2nH9","opacity":0,"frame":true,"locked":false,"mullionColor":"white","frameWidth":0.2,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.008288040270692798,"cy":0.1,"cz":-0.0125,"lx":0.21548904703801275,"ly":0.5,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"fN7U27jHhJwVAWntrzsr1D","parentId":"7QCAeFgCM4uwoEq1rdWfs2","foundationId":"sQbhet5xpiSK5NzTWtub4a","tint":"#b3b3b3","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":false,"frameWidth":0.2,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3149455302863263,"cy":0.1,"cz":-0.0125,"lx":0.29836944974494073,"ly":0.5,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bmDtwgfufE5e4Kne2LhHZq","parentId":"7QCAeFgCM4uwoEq1rdWfs2","foundationId":"sQbhet5xpiSK5NzTWtub4a","tint":"#b3b3b3","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullionColor":"white","frame":false,"frameWidth":0.2,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.07843137254901958,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"ascuFaQMJxzrhtJHSRpvZ2","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.107843137254902,"cy":0.1,"cz":0.3,"lx":0.03921568627450987,"ly":0.3,"lz":0.2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rSoHzPCUdtqVH7c8BRWJ1V","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0784313725490196,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"tFJRnNLL8FhvzRjVcGz5Fk","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.0196078431372549,"cy":0.3,"cz":-0.2833333333333333,"lx":0.0784313725490196,"ly":0.3,"lz":0.36666666666666664,"mullion":true,"mullionWidth":0.06,"mullionSpacing":5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"668rcrJyE6W7MNd2pYWoAp","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.7,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Arched","archHeight":2,"sillWidth":0},{"type":"Window","cx":0.10784313725490197,"cy":0.3,"cz":-0.15,"lx":0.0392156862745098,"ly":0.3,"lz":0.3,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.8,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bdPS759a6fLQqu4V2o4qtx","parentId":"jF3H99H3SvFmx1EtcFgSUR","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","tint":"#b3b3b3","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"frame":true,"mullionColor":"white","frameWidth":0.2,"locked":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Joey","cx":9.115387825475082,"cy":-24.651217406554846,"cz":0.15,"lx":0.462,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"ouHmzt9Us42w5bHjR9ZvBW","selected":false,"ly":0.462,"locked":false},{"type":"Tree","name":"Elm","cx":24.68149666528604,"cy":30.40624439575707,"cz":0.1500000059604645,"lx":12.225521614749255,"lz":8.985934888591816,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"iyZFP8cWUDsX2VGyUoGTxq","selected":false,"locked":false},{"type":"Tree","name":"Maple","cx":-33.168239841792456,"cy":33.081643759613165,"cz":0.15000000596046628,"lx":21.067617771997934,"lz":15.677323900388549,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"q5tey4s1a5vXUiiDEyFkaC","selected":false,"flip":true,"locked":false},{"type":"Tree","name":"Oak","cx":27.369492357164148,"cy":-25.522008177846573,"cz":0.1500000059604645,"lx":10.7323110159116,"lz":14.464681446457563,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"n1sQ5fcUd75QzX2Y353uNT","selected":false,"locked":false},{"type":"Tree","name":"Oak","flip":true,"cx":31.990594871051,"cy":-29.99931442147024,"cz":0.15,"lx":10.7323110159116,"lz":11.586410893659473,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"1i15CUF6r9qjPL7U2Lb6eo","selected":false,"locked":false},{"type":"Tree","name":"Oak","cx":30.9837315091143,"cy":-18.406933063455,"cz":0.15,"lx":10.7323110159116,"lz":11.586410893659473,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"tcFvkUdRjNo8qiDvEShvKP","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":12.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"tm3GiScxVp1WgzmWsLgusP","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":14.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"f2DSzggaELKVYDnQ3jkH8J","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":16.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"8NTkXiYEAz7nkqKvjnXpTs","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":18.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"5hte45etpHBPzUjLVr5M8S","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":20.542371491375786,"cy":-20.043493250811643,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"k5NSyhh1vTCW6anr3Bnxxm","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-24.199104717917777,"cy":-19.89755183152851,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"jKAUFtG6mCpk1VKUFLbArj","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-21.70602992567401,"cy":-19.842150169478614,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"38XrzKeRncZdskEKuyybVH","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-19.37916011957982,"cy":-19.78674850742873,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"imTCPSHK1nyiQfLEdYvRSi","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-17.163093637585362,"cy":-19.78674850742873,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"mhx7saLxNPZ36vhhBgjpsi","selected":false,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Hip","roofStructure":"Default","wallsId":["8kN3EwUCnSjrTbu7YtQvQY"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sQbhet5xpiSK5NzTWtub4a","foundationId":"sQbhet5xpiSK5NzTWtub4a","id":"89u35YTLctNXWRDNsxwcpj","leftRidgeLength":8.635242091739931,"rightRidgeLength":10.319579264913394,"rise":3.229240477888453,"ceiling":false},{"type":"Foundation","cx":0.6163744974611483,"cy":18.71649900037034,"cz":0.5,"lx":50.85545052514254,"ly":17.97168247424439,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"#ffffff","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ustJbtTQJEeCkyVnXGayK2"},{"type":"Human","name":"Jamelia","cx":1.3448042201833577,"cy":2.8336636548560605,"cz":0.5000000000000009,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ustJbtTQJEeCkyVnXGayK2","id":"pAQhAzdRtcSEf5g4XYdKtM","selected":false,"ly":0.65},{"type":"Human","name":"Jaye","cx":4.47029660144684,"cy":5.02316777071092,"cz":0.5000000000000009,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ustJbtTQJEeCkyVnXGayK2","id":"dbe6vr9MpeAutqWYghGDv5","selected":false,"ly":0.55},{"type":"Light","decay":2,"distance":10,"intensity":10,"color":"#ff0000","cx":-0.021931798388491356,"cy":-0.31746447944889156,"cz":0.5000000198682151,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"eK4rrZPqmi6q4jMkoXNFpz","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":5,"color":"#0000ff","cx":0.15060856519114013,"cy":-0.2699408955339268,"cz":0.5000000198682151,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"fHCHUCQJQtBzqC5JVjvrVV","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":5,"color":"#0000ff","cx":-0.18847671202407354,"cy":-0.26968211451709273,"cz":0.5000000198682151,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"rLc1ZCGs7ugmXpxAb6kueG","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":5,"color":"#0000ff","cx":0.267273996418672,"cy":-0.2667264794936538,"cz":0.5000000198682121,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"tFz5GHQqyyVVxh25czH4Em","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":5,"color":"#0000ff","cx":-0.34024773885085746,"cy":-0.26354534234637206,"cz":0.5000000198682151,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","foundationId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"etKXiduEZtGdENpo2GRtJg","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":9,"color":"#ff00ff","cx":-0.02474975458211863,"cy":0.12239922347312886,"cz":0.49999999999999645,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ustJbtTQJEeCkyVnXGayK2","foundationId":"ustJbtTQJEeCkyVnXGayK2","id":"iPzFJUPPfWj6iSKXbVujiL","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-14.836223831491182,"cy":-19.73134684537884,"cz":0.1500000059604645,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"3Qmj2gXj2Lmc28MbpT7BdQ","id":"dqcT5qczxNqZJ7sXcMUU2L","selected":false},{"type":"Polygon","cx":0.1374437866453651,"cy":-0.12111426497213049,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.526127233622693,"y":-0.4433333333333333},{"x":-0.526127233622693,"y":-0.3566666666666667},{"x":0.46529955659029343,"y":-0.3566666666666667},{"x":0.46529955659029343,"y":-0.4433333333333333}],"parentId":"7QCAeFgCM4uwoEq1rdWfs2","parentType":"Wall","foundationId":"sQbhet5xpiSK5NzTWtub4a","selected":false,"filled":true,"selectedIndex":2,"id":"2qLCC51p5mx8fVpgQpr3Zc","noOutline":true,"lineColor":"#808080","textureType":"No Polygon Texture","text":"1600","fontSize":0.6,"fontColor":"gray"}],"sceneRadius":60,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[4.371875648214528,21.08668963398181,0.000029433785846390654],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[4.371875648214528,21.086539627316288,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":19,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-18.776334866989732,67.71900500088384,8.029479005212822],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.01,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":18.05,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16A5A5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-2.188721381754669,0.6407899994531973,8.029479005212822],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showAzimuthAngle":true,"showElevationAngle":true,"showZenithAngle":true,"waterSurface":false,"solarPanelShiness":100,"windowShiness":200,"showDiurnalTemperaturePanel":false,"showEconomicsPanel":false,"showDailyUpdraftTowerYieldPanel":false,"showYearlyUpdraftTowerYieldPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"yearlyLightSensorPanelShowDaylight":false,"yearlyLightSensorPanelShowClearness":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400},"directLightIntensity":0.5},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},465:function(e){e.exports=JSON.parse('{"docid":"iYCTJTjPxpfAmYmA6nDmNN","time":"06/18/2023 07:55 pm","timestamp":1687132511108,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarPanelVisibilityGridCellSize":0.2,"longitude":34.54995193372956,"diurnalTemperatureModel":1,"cspDaysPerYear":4,"discretization":"Approximate","solarRadiationHeatmapGridCellSize":0.5,"noAnimationForHeatmapSimulation":false,"dustLoss":0.05,"pvGridCellSize":0.5,"airAttenuationCoefficient":0.01,"date":"3/22/2023, 12:00:00 PM","ground":{"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05},"address":"Kocavilayet, 2929. Sk. No:1, 33110 Yeni\u015fehir/Mersin, T\xfcrkiye","timesPerHour":1,"cspGridCellSize":0.5,"daysPerYear":12,"sutTimesPerHour":1,"noAnimationForSolarPanelSimulation":false,"sutDaysPerYear":4,"countryCode":"TR","noAnimationForSolarUpdraftTowerSimulation":false,"latitude":36.81233464724704,"name":"default","sutGridCellSize":1,"highestTemperatureTimeInMinutes":900,"noAnimationForThermalSimulation":false,"airConvectiveCoefficient":5,"noAnimationForSensorDataCollection":false,"cspTimesPerHour":1},"elements":[{"cy":-2.235554730854802,"solarUpdraftTower":{},"normal":[0,0,1],"cz":0.05,"id":"2XGmuwQrQtDPGFB7FUq4gK","solarPowerTower":{},"solarAbsorberPipe":{},"lx":58.35972106577608,"rotation":[0,0,0.7770359328652141],"parentId":"Ground","textureType":"No Foundation Texture","selected":false,"type":"Foundation","cx":-2.210236108673694,"ly":32.834680769300704,"color":"#808080","hvacSystem":{"thermostatSetpoint":20,"id":"A"},"lz":0.1,"locked":true},{"normal":[0,0,1],"roofId":"byzwW7Db61R9EfVcvoWVQ9","studColor":"#ffffff","leftJoints":["vqP69iA4TuZd8ZEvPBLjzU"],"rightRoofHeight":11.5,"relativeAngle":3.141592653589793,"structureColor":"white","volumetricHeatCapacity":0.5,"lineWidth":0.2,"opacity":0.5,"textureType":"No Wall Texture","windows":[],"fill":"Full","cx":1.1731464688636888,"color":"#e9d8ba","studWidth":0.1,"ly":0.3,"leftRoofHeight":11.5,"lz":11.5,"type":"Wall","rightJoints":["6bfpYPQw2M5RbKRsLfDauC"],"studSpacing":2,"structureSpacing":2,"id":"r7FDtsVF9isPsPhYMJtzMf","showLabel":false,"parentId":"2XGmuwQrQtDPGFB7FUq4gK","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","structureWidth":0.1,"lineColor":"#000000","eavesLength":-0.05,"unfilledHeight":0.5,"lx":39,"rotation":[0,0,0],"rValue":2,"rightPoint":[-18.326853531136305,8.729078401244518,0.1],"cy":8.729078401244518,"cz":0,"selected":false,"leftPoint":[20.673146468863685,8.729078401244516,0.1],"wallStructure":"Default","parapet":{"display":true,"color":"#e9d8ba","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.5,"rightTopPartialHeight":11.5,"locked":true},{"volumetricHeatCapacity":0.5,"wallStructure":"Default","lx":17.000000000000004,"rotation":[0,0,0],"opacity":0.5,"studColor":"#ffffff","ly":0.3,"type":"Wall","fill":"Full","rightJoints":["r7FDtsVF9isPsPhYMJtzMf"],"normal":[0,0,1],"rightRoofHeight":11.5,"lineColor":"#000000","lineWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","structureWidth":0.1,"centerRoofHeight":[0,12.780523500160847],"id":"vqP69iA4TuZd8ZEvPBLjzU","selected":false,"leftPoint":[20.67314646886369,-8.27092159875549,0.1],"roofId":"byzwW7Db61R9EfVcvoWVQ9","color":"#e9d8ba","studSpacing":2,"structureSpacing":2,"cz":0,"windows":[],"structureColor":"white","cy":0.22907840124451972,"rValue":2,"leftJoints":["jE7DwieCwvfvkHcN1Bkpu2"],"cx":20.673146468863674,"leftRoofHeight":11.5,"parentId":"2XGmuwQrQtDPGFB7FUq4gK","rightPoint":[20.673146468863685,8.729078401244516,0.1],"studWidth":0.1,"showLabel":false,"unfilledHeight":0.5,"eavesLength":0,"lz":11.5,"textureType":"No Wall Texture","relativeAngle":1.5707963267948966,"parapet":{"display":false,"color":"#e9d8ba","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.5,"rightTopPartialHeight":11.5,"locked":true},{"leftJoints":["6bfpYPQw2M5RbKRsLfDauC"],"parentId":"2XGmuwQrQtDPGFB7FUq4gK","studColor":"#ffffff","cz":0,"relativeAngle":0,"wallStructure":"Default","showLabel":false,"lineWidth":0.2,"leftRoofHeight":11.5,"ly":0.3,"type":"Wall","structureColor":"white","color":"#e9d8ba","fill":"Full","lineColor":"#000000","textureType":"No Wall Texture","roofId":"byzwW7Db61R9EfVcvoWVQ9","lz":11.5,"unfilledHeight":0.5,"normal":[0,0,1],"selected":false,"cy":-8.270921598755486,"volumetricHeatCapacity":0.5,"structureSpacing":2,"windows":[],"lx":38.99999999999999,"studWidth":0.1,"rightPoint":[20.673146468863674,-8.27092159875548,0.1],"eavesLength":-0.1,"rightRoofHeight":11.5,"opacity":0.5,"leftPoint":[-18.326853531136308,-8.27092159875549,0.1],"structureWidth":0.1,"rightJoints":["vqP69iA4TuZd8ZEvPBLjzU"],"cx":1.1731464688636861,"rValue":2,"id":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","rotation":[0,0,0],"studSpacing":2,"parapet":{"display":true,"color":"#e9d8ba","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.5,"rightTopPartialHeight":11.5,"locked":true},{"rightJoints":["jE7DwieCwvfvkHcN1Bkpu2"],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","centerRoofHeight":[0,12.780523500160847],"leftPoint":[-18.326853531136305,8.729078401244518,0.1],"windows":[],"studSpacing":2,"lineColor":"#000000","structureWidth":0.1,"structureSpacing":2,"textureType":"No Wall Texture","rightPoint":[-18.326853531136308,-8.27092159875549,0.1],"rotation":[0,0,0],"lx":17.00000000000001,"lz":11.5,"cx":-18.326853531136308,"eavesLength":0,"opacity":0.5,"id":"6bfpYPQw2M5RbKRsLfDauC","wallStructure":"Default","studWidth":0.1,"structureColor":"white","leftRoofHeight":11.5,"selected":false,"rightRoofHeight":11.5,"showLabel":false,"type":"Wall","roofId":"byzwW7Db61R9EfVcvoWVQ9","ly":0.3,"leftJoints":["r7FDtsVF9isPsPhYMJtzMf"],"lineWidth":0.2,"volumetricHeatCapacity":0.5,"color":"#e9d8ba","relativeAngle":4.71238898038469,"cy":0.22907840124450551,"studColor":"#ffffff","parentId":"2XGmuwQrQtDPGFB7FUq4gK","unfilledHeight":0.5,"normal":[0,0,1],"fill":"Full","cz":0,"rValue":2,"parapet":{"display":false,"color":"#e9d8ba","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11.5,"rightTopPartialHeight":11.5,"locked":true},{"color":"#808080","type":"Foundation","solarAbsorberPipe":{},"id":"j3n8P4y4kG4w4nSZiAf6rj","solarUpdraftTower":{},"lx":8.996965797517845,"selected":false,"cx":15.96321224800585,"lz":0.12,"hvacSystem":{"thermostatSetpoint":20,"id":"A"},"solarPowerTower":{},"parentId":"Ground","cz":0.06,"rotation":[0,0,0.7770359328652141],"cy":7.538802967801969,"normal":[0,0,1],"rValue":2,"ly":17.6681425475643,"textureType":"No Foundation Texture","locked":true},{"id":"vEPKSnunpPsGKUDNJaGnTR","fill":"Full","color":"#c1bdb4","unfilledHeight":0.5,"normal":[0,0,1],"eavesLength":0,"leftJoints":["1QnZb7zSPuvyzTVeC8AkVL"],"volumetricHeatCapacity":0.5,"ly":0.3,"lz":13,"selected":false,"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","opacity":0.5,"cx":2.550655474633215,"rightJoints":["iYLfpK8sAzBxMk4mz1BXiS"],"cy":0.09368069935964818,"parentId":"j3n8P4y4kG4w4nSZiAf6rj","textureType":"Wall Texture Default","structureWidth":0.1,"lx":9.499999999999998,"rightPoint":[2.5506554746332153,4.843680699359649,0.12],"relativeAngle":1.5707963267948963,"structureColor":"white","cz":0,"wallStructure":"Default","type":"Wall","rotation":[0,0,0],"leftPoint":[2.550655474633213,-4.656319300640349,0.12],"structureSpacing":2,"rValue":2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"9wUwTaeJ4rHLbRCsFJ3NXZ","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"lx":4.500000000000002,"wallStructure":"Default","ly":0.3,"normal":[0,0,1],"rightPoint":[2.550655474633216,-4.656319300640352,0.12],"type":"Wall","fill":"Full","structureSpacing":2,"color":"#c1bdb4","cx":0.3006554746332153,"relativeAngle":6.283185307179585,"unfilledHeight":0.5,"textureType":"Wall Texture Default","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","leftPoint":[-1.9493445253667843,-4.656319300640349,0.12],"rightJoints":["vEPKSnunpPsGKUDNJaGnTR"],"lz":13,"id":"1QnZb7zSPuvyzTVeC8AkVL","cz":0,"volumetricHeatCapacity":0.5,"structureColor":"white","rValue":2,"leftJoints":["joaXtauLNr5aPP2tqqpryi"],"opacity":0.5,"selected":false,"parentId":"j3n8P4y4kG4w4nSZiAf6rj","rotation":[0,0,0],"structureWidth":0.1,"eavesLength":0,"cy":-4.65631930064035,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"9wUwTaeJ4rHLbRCsFJ3NXZ","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"opacity":0.5,"eavesLength":0,"normal":[0,0,1],"lz":13,"structureColor":"white","volumetricHeatCapacity":0.5,"cy":0.09368069935964818,"structureWidth":0.1,"fill":"Full","ly":0.3,"unfilledHeight":0.5,"selected":false,"color":"#c1bdb4","rightPoint":[-1.9493445253667818,-4.656319300640352,0.12],"parentId":"j3n8P4y4kG4w4nSZiAf6rj","structureSpacing":2,"cx":-1.9493445253667832,"id":"joaXtauLNr5aPP2tqqpryi","leftJoints":["iYLfpK8sAzBxMk4mz1BXiS"],"wallStructure":"Default","leftPoint":[-1.9493445253667834,4.843680699359648,0.12],"lx":9.5,"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","cz":0,"textureType":"Wall Texture Default","type":"Wall","rotation":[0,0,0],"rightJoints":["1QnZb7zSPuvyzTVeC8AkVL"],"relativeAngle":4.71238898038469,"rValue":2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"9wUwTaeJ4rHLbRCsFJ3NXZ","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"id":"iYLfpK8sAzBxMk4mz1BXiS","studColor":"#ffffff","ly":0.3,"fill":"Full","unfilledHeight":0.5,"studSpacing":2,"leftPoint":[2.5506554746332153,4.843680699359649,0.12],"color":"#c1bdb4","rotation":[0,0,0],"type":"Wall","wallStructure":"Default","lx":4.499999999999998,"lineWidth":0.2,"rightPoint":[-1.949344525366782,4.843680699359645,0.12],"showLabel":false,"studWidth":0.1,"structureSpacing":2,"textureType":"Wall Texture Default","structureWidth":0.1,"normal":[0,0,1],"cy":4.8436806993596475,"lz":13,"cx":0.30065547463321707,"opacity":0.5,"rValue":2,"parentId":"j3n8P4y4kG4w4nSZiAf6rj","structureColor":"white","leftJoints":["vEPKSnunpPsGKUDNJaGnTR"],"windows":[],"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","cz":0,"rightJoints":["joaXtauLNr5aPP2tqqpryi"],"relativeAngle":3.1415926535897936,"volumetricHeatCapacity":0.5,"eavesLength":0,"selected":false,"lineColor":"#000000","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"9wUwTaeJ4rHLbRCsFJ3NXZ","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"volumetricHeatCapacity":0.5,"selected":false,"opacity":0.5,"normal":[0,0,1],"wallStructure":"Default","rightJoints":["gZiomgVxY3vk4YfQ9Jjh6B"],"id":"sCZzaqpAQeUmKwng1WHaCF","foundationId":"o2WibZi2fR7HySSdFgPoda","lx":9.499999999999998,"color":"#c1bdb4","parentId":"o2WibZi2fR7HySSdFgPoda","cx":2.550655474633215,"ly":0.3,"unfilledHeight":0.5,"textureType":"Wall Texture Default","eavesLength":0,"leftPoint":[2.550655474633213,-4.656319300640349,0.12],"relativeAngle":1.5707963267948963,"cy":0.09368069935964818,"fill":"Full","structureSpacing":2,"rightPoint":[2.5506554746332153,4.843680699359649,0.12],"structureWidth":0.1,"leftJoints":["tJ6f61zEL1oQGpeeCnFH2S"],"type":"Wall","rValue":2,"cz":0,"structureColor":"white","rotation":[0,0,0],"lz":13,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"rdXcWwV3c9y2W6N9aNo82Z","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"cz":0,"selected":false,"leftPoint":[-1.9493445253667843,-4.656319300640349,0.12],"cx":0.3006554746332153,"normal":[0,0,1],"lz":13,"cy":-4.65631930064035,"rightJoints":["sCZzaqpAQeUmKwng1WHaCF"],"rightPoint":[2.550655474633216,-4.656319300640352,0.12],"fill":"Full","structureColor":"white","opacity":0.5,"unfilledHeight":0.5,"rotation":[0,0,0],"textureType":"Wall Texture Default","rValue":2,"ly":0.3,"volumetricHeatCapacity":0.5,"lx":4.500000000000002,"color":"#c1bdb4","eavesLength":0,"id":"tJ6f61zEL1oQGpeeCnFH2S","structureSpacing":2,"leftJoints":["eZza9yCuyFywaPPzJVe5tY"],"foundationId":"o2WibZi2fR7HySSdFgPoda","wallStructure":"Default","relativeAngle":6.283185307179585,"type":"Wall","structureWidth":0.1,"parentId":"o2WibZi2fR7HySSdFgPoda","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"rdXcWwV3c9y2W6N9aNo82Z","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"type":"Wall","opacity":0.5,"structureSpacing":2,"wallStructure":"Default","parentId":"o2WibZi2fR7HySSdFgPoda","relativeAngle":4.71238898038469,"id":"eZza9yCuyFywaPPzJVe5tY","textureType":"Wall Texture Default","cx":-1.9493445253667832,"structureWidth":0.1,"normal":[0,0,1],"volumetricHeatCapacity":0.5,"lx":9.5,"lz":13,"fill":"Full","structureColor":"white","foundationId":"o2WibZi2fR7HySSdFgPoda","rotation":[0,0,0],"ly":0.3,"leftPoint":[-1.9493445253667834,4.843680699359648,0.12],"rightPoint":[-1.9493445253667818,-4.656319300640352,0.12],"color":"#c1bdb4","rValue":2,"cz":0,"rightJoints":["tJ6f61zEL1oQGpeeCnFH2S"],"eavesLength":0,"cy":0.09368069935964818,"selected":false,"leftJoints":["gZiomgVxY3vk4YfQ9Jjh6B"],"unfilledHeight":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"rdXcWwV3c9y2W6N9aNo82Z","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"normal":[0,0,1],"unfilledHeight":0.5,"selected":false,"rotation":[0,0,0],"structureColor":"white","leftJoints":["sCZzaqpAQeUmKwng1WHaCF"],"parentId":"o2WibZi2fR7HySSdFgPoda","structureWidth":0.1,"relativeAngle":3.1415926535897936,"wallStructure":"Default","rValue":2,"ly":0.3,"lz":13,"leftPoint":[2.5506554746332153,4.843680699359649,0.12],"volumetricHeatCapacity":0.5,"cx":0.30065547463321707,"type":"Wall","fill":"Full","eavesLength":0,"id":"gZiomgVxY3vk4YfQ9Jjh6B","rightJoints":["eZza9yCuyFywaPPzJVe5tY"],"cy":4.8436806993596475,"rightPoint":[-1.949344525366782,4.843680699359645,0.12],"textureType":"Wall Texture Default","foundationId":"o2WibZi2fR7HySSdFgPoda","structureSpacing":2,"opacity":0.5,"lx":4.499999999999998,"color":"#c1bdb4","cz":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"rdXcWwV3c9y2W6N9aNo82Z","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"solarUpdraftTower":{},"rotation":[0,0,0.7770359328652141],"cz":0.06,"ly":17.6681425475643,"type":"Foundation","hvacSystem":{"thermostatSetpoint":20,"id":"A"},"lx":8.996965797517845,"textureType":"No Foundation Texture","color":"#808080","lz":0.12,"id":"o2WibZi2fR7HySSdFgPoda","solarAbsorberPipe":{},"rValue":2,"parentId":"Ground","solarPowerTower":{},"cy":-19.27217037701027,"cx":-11.087826553311125,"normal":[0,0,1],"selected":false,"locked":true},{"ly":0.3,"foundationId":"hLsewK7zX5Mau5SErFyCiz","unfilledHeight":0.5,"opacity":0.5,"structureWidth":0.1,"rightJoints":["kFKM2qRJFmWx323z2hBCra"],"wallStructure":"Default","rightPoint":[2.5506554746332153,4.843680699359649,0.12],"relativeAngle":1.5707963267948963,"volumetricHeatCapacity":0.5,"cz":0,"rValue":2,"fill":"Full","selected":false,"eavesLength":0,"normal":[0,0,1],"lx":9.499999999999998,"cy":0.09368069935964818,"parentId":"hLsewK7zX5Mau5SErFyCiz","rotation":[0,0,0],"leftPoint":[2.550655474633213,-4.656319300640349,0.12],"structureSpacing":2,"structureColor":"white","type":"Wall","id":"gv3LzTTefsaZrtK8Lzx2bM","textureType":"Wall Texture Default","color":"#c1bdb4","lz":13,"leftJoints":["i7SnyGKg3wpYfMg2Ck4kpZ"],"cx":2.550655474633215,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"3gdGvLfCvyTnvdRCWnC9h9","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"fill":"Full","rotation":[0,0,0],"normal":[0,0,1],"ly":0.3,"cz":0,"textureType":"Wall Texture Default","wallStructure":"Default","rValue":2,"id":"i7SnyGKg3wpYfMg2Ck4kpZ","relativeAngle":6.283185307179585,"leftJoints":["5KcXyJ1kNDvp5rTZsShAbX"],"cx":0.3006554746332153,"foundationId":"hLsewK7zX5Mau5SErFyCiz","color":"#c1bdb4","structureSpacing":2,"lz":13,"rightPoint":[2.550655474633216,-4.656319300640352,0.12],"leftPoint":[-1.9493445253667843,-4.656319300640349,0.12],"type":"Wall","opacity":0.5,"structureColor":"white","rightJoints":["gv3LzTTefsaZrtK8Lzx2bM"],"lx":4.500000000000002,"eavesLength":0,"unfilledHeight":0.5,"selected":false,"parentId":"hLsewK7zX5Mau5SErFyCiz","volumetricHeatCapacity":0.5,"structureWidth":0.1,"cy":-4.65631930064035,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"3gdGvLfCvyTnvdRCWnC9h9","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"rightJoints":["i7SnyGKg3wpYfMg2Ck4kpZ"],"fill":"Full","volumetricHeatCapacity":0.5,"structureColor":"white","rightPoint":[-1.9493445253667818,-4.656319300640352,0.12],"parentId":"hLsewK7zX5Mau5SErFyCiz","leftJoints":["kFKM2qRJFmWx323z2hBCra"],"opacity":0.5,"wallStructure":"Default","unfilledHeight":0.5,"normal":[0,0,1],"structureWidth":0.1,"leftPoint":[-1.9493445253667834,4.843680699359648,0.12],"textureType":"Wall Texture Default","eavesLength":0,"ly":0.3,"type":"Wall","lx":9.5,"selected":false,"relativeAngle":4.71238898038469,"id":"5KcXyJ1kNDvp5rTZsShAbX","cy":0.09368069935964818,"cz":0,"foundationId":"hLsewK7zX5Mau5SErFyCiz","color":"#c1bdb4","lz":13,"cx":-1.9493445253667832,"rValue":2,"structureSpacing":2,"rotation":[0,0,0],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"3gdGvLfCvyTnvdRCWnC9h9","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"type":"Wall","eavesLength":0,"rightPoint":[-1.949344525366782,4.843680699359645,0.12],"leftJoints":["gv3LzTTefsaZrtK8Lzx2bM"],"unfilledHeight":0.5,"cz":0,"cx":0.30065547463321707,"textureType":"Wall Texture Default","normal":[0,0,1],"structureColor":"white","color":"#c1bdb4","foundationId":"hLsewK7zX5Mau5SErFyCiz","rotation":[0,0,0],"rValue":2,"lz":13,"fill":"Full","lx":4.499999999999998,"cy":4.8436806993596475,"relativeAngle":3.1415926535897936,"id":"kFKM2qRJFmWx323z2hBCra","ly":0.3,"structureWidth":0.1,"wallStructure":"Default","opacity":0.5,"parentId":"hLsewK7zX5Mau5SErFyCiz","structureSpacing":2,"volumetricHeatCapacity":0.5,"rightJoints":["5KcXyJ1kNDvp5rTZsShAbX"],"selected":false,"leftPoint":[2.5506554746332153,4.843680699359649,0.12],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"3gdGvLfCvyTnvdRCWnC9h9","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"cy":-10.703769932796098,"rValue":2,"solarPowerTower":{},"textureType":"No Foundation Texture","lx":8.996965797517845,"cx":-19.60349962700186,"rotation":[0,0,0.7770359328652141],"hvacSystem":{"thermostatSetpoint":20,"id":"A"},"ly":17.6681425475643,"solarUpdraftTower":{},"lz":0.12,"id":"hLsewK7zX5Mau5SErFyCiz","color":"#808080","selected":false,"cz":0.06,"solarAbsorberPipe":{},"parentId":"Ground","normal":[0,0,1],"type":"Foundation","locked":true},{"leftPoint":[2.550655474633213,-4.656319300640349,0.12],"relativeAngle":1.5707963267948963,"unfilledHeight":0.5,"leftJoints":["dMQfydvLoQmsUVh8GcfQWg"],"wallStructure":"Default","structureSpacing":2,"cz":0,"color":"#c1bdb4","type":"Wall","cx":2.550655474633215,"structureWidth":0.1,"normal":[0,0,1],"rotation":[0,0,0],"cy":0.09368069935964818,"selected":false,"id":"3WQQwDXPDfYCATy53ts83F","ly":0.3,"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","rightPoint":[2.5506554746332153,4.843680699359649,0.12],"textureType":"Wall Texture Default","volumetricHeatCapacity":0.5,"opacity":0.5,"structureColor":"white","lz":13,"rValue":2,"eavesLength":0,"rightJoints":["16SbPgFqDMyVbV8UtDHAYk"],"lx":9.499999999999998,"parentId":"x4oU2GYmkiSMe4Z8gg6K3C","fill":"Full","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"q8ctEFdUTArcnVXRSQ323h","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"rightJoints":["3WQQwDXPDfYCATy53ts83F"],"type":"Wall","relativeAngle":6.283185307179585,"textureType":"Wall Texture Default","eavesLength":0,"lz":13,"id":"dMQfydvLoQmsUVh8GcfQWg","parentId":"x4oU2GYmkiSMe4Z8gg6K3C","lx":4.500000000000002,"fill":"Full","structureColor":"white","color":"#c1bdb4","unfilledHeight":0.5,"ly":0.3,"cy":-4.65631930064035,"selected":false,"leftPoint":[-1.9493445253667843,-4.656319300640349,0.12],"leftJoints":["kmaifBj79SDvw8jCqEakPi"],"rotation":[0,0,0],"opacity":0.5,"normal":[0,0,1],"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","volumetricHeatCapacity":0.5,"rightPoint":[2.550655474633216,-4.656319300640352,0.12],"cx":0.3006554746332153,"rValue":2,"structureSpacing":2,"structureWidth":0.1,"cz":0,"wallStructure":"Default","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"q8ctEFdUTArcnVXRSQ323h","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"structureColor":"white","wallStructure":"Default","volumetricHeatCapacity":0.5,"normal":[0,0,1],"type":"Wall","rightPoint":[-1.9493445253667818,-4.656319300640352,0.12],"rightJoints":["dMQfydvLoQmsUVh8GcfQWg"],"leftJoints":["16SbPgFqDMyVbV8UtDHAYk"],"cy":0.09368069935964818,"parentId":"x4oU2GYmkiSMe4Z8gg6K3C","leftPoint":[-1.9493445253667834,4.843680699359648,0.12],"lx":9.5,"rValue":2,"ly":0.3,"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","id":"kmaifBj79SDvw8jCqEakPi","lz":13,"structureWidth":0.1,"opacity":0.5,"color":"#c1bdb4","cx":-1.9493445253667832,"relativeAngle":4.71238898038469,"structureSpacing":2,"eavesLength":0,"textureType":"Wall Texture Default","fill":"Full","cz":0,"unfilledHeight":0.5,"selected":false,"rotation":[0,0,0],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"q8ctEFdUTArcnVXRSQ323h","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"volumetricHeatCapacity":0.5,"wallStructure":"Default","rotation":[0,0,0],"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","lz":13,"parentId":"x4oU2GYmkiSMe4Z8gg6K3C","cx":0.30065547463321707,"rightJoints":["kmaifBj79SDvw8jCqEakPi"],"leftJoints":["3WQQwDXPDfYCATy53ts83F"],"unfilledHeight":0.5,"opacity":0.5,"cy":4.8436806993596475,"selected":false,"textureType":"Wall Texture Default","structureSpacing":2,"fill":"Full","type":"Wall","ly":0.3,"rValue":2,"normal":[0,0,1],"relativeAngle":3.1415926535897936,"structureWidth":0.1,"lx":4.499999999999998,"id":"16SbPgFqDMyVbV8UtDHAYk","leftPoint":[2.5506554746332153,4.843680699359649,0.12],"structureColor":"white","eavesLength":0,"rightPoint":[-1.949344525366782,4.843680699359645,0.12],"cz":0,"color":"#c1bdb4","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"q8ctEFdUTArcnVXRSQ323h","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"solarAbsorberPipe":{},"textureType":"No Foundation Texture","rotation":[0,0,0.7770359328652141],"rValue":2,"type":"Foundation","selected":false,"hvacSystem":{"thermostatSetpoint":20,"id":"A"},"lz":0.12,"ly":17.6681425475643,"lx":8.996965797517845,"normal":[0,0,1],"solarUpdraftTower":{},"parentId":"Ground","solarPowerTower":{},"color":"#808080","id":"x4oU2GYmkiSMe4Z8gg6K3C","cz":0.06,"cx":7.698794351508976,"cy":16.007045037404467,"locked":true},{"lz":13,"leftJoints":["aMAoC9G4MpUPGJVmt36yfP"],"wallStructure":"Default","rotation":[0,0,0],"structureColor":"white","selected":false,"relativeAngle":1.5707963267948961,"cz":0,"rightJoints":["iVn6mF9eoYKrYt3EzDy2TC"],"id":"u1GLQPod2yRsFy4dWHVdVa","rightPoint":[2.8178761000817967,3.2189656143947305,0],"parentId":"oGfdqtfZrLhGvZskoNeDFJ","lx":6.3134164357268086,"type":"Wall","volumetricHeatCapacity":0.5,"cy":0.062257396531326226,"foundationId":"oGfdqtfZrLhGvZskoNeDFJ","ly":0.3,"opacity":0.5,"fill":"Full","eavesLength":0,"structureWidth":0.1,"normal":[0,0,1],"structureSpacing":2,"unfilledHeight":0.5,"color":"#c1bdb4","rValue":2,"cx":2.8178761000817953,"leftPoint":[2.817876100081794,-3.094450821332078,0],"textureType":"Wall Texture Default","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"ips8v5W6dhiA81cAxrdErd","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"parentId":"oGfdqtfZrLhGvZskoNeDFJ","rightJoints":["u1GLQPod2yRsFy4dWHVdVa"],"structureColor":"white","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","volumetricHeatCapacity":0.5,"leftJoints":["eTsfM9k5RPHprx93KkShya"],"opacity":0.5,"structureWidth":0.1,"lx":4.971444625304221,"unfilledHeight":0.5,"structureSpacing":2,"textureType":"No Wall Texture","cy":-3.094450821332079,"cx":0.33215378742968693,"fill":"Full","color":"#c1bdb4","cz":0,"rotation":[0,0,0],"normal":[0,0,1],"leftPoint":[-2.1535685252224237,-3.094450821332078,0],"lz":13,"wallStructure":"Default","type":"Wall","selected":false,"id":"aMAoC9G4MpUPGJVmt36yfP","rValue":2,"ly":0.3,"eavesLength":0,"relativeAngle":-4.466400043859356e-16,"rightPoint":[2.8178761000817976,-3.0944508213320803,0],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"ips8v5W6dhiA81cAxrdErd","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"color":"#c1bdb4","cz":0,"selected":false,"rightPoint":[-2.153568525222421,-3.0944508213320803,0],"leftPoint":[-2.153568525222423,3.21896561439473,0],"structureColor":"white","lx":6.31341643572681,"lz":13,"volumetricHeatCapacity":0.5,"normal":[0,0,1],"cx":-2.153568525222422,"relativeAngle":-1.5707963267948963,"structureSpacing":2,"eavesLength":0,"structureWidth":0.1,"rValue":2,"leftJoints":["iVn6mF9eoYKrYt3EzDy2TC"],"foundationId":"oGfdqtfZrLhGvZskoNeDFJ","cy":0.06225739653132489,"parentId":"oGfdqtfZrLhGvZskoNeDFJ","ly":0.3,"rightJoints":["aMAoC9G4MpUPGJVmt36yfP"],"type":"Wall","unfilledHeight":0.5,"textureType":"Wall Texture Default","rotation":[0,0,0],"id":"eTsfM9k5RPHprx93KkShya","fill":"Full","opacity":0.5,"wallStructure":"Default","parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"ips8v5W6dhiA81cAxrdErd","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"parentId":"oGfdqtfZrLhGvZskoNeDFJ","structureWidth":0.1,"foundationId":"oGfdqtfZrLhGvZskoNeDFJ","relativeAngle":-3.1415926535897927,"textureType":"Wall Texture Default","structureColor":"white","volumetricHeatCapacity":0.5,"color":"#c1bdb4","rightJoints":["eTsfM9k5RPHprx93KkShya"],"wallStructure":"Default","structureSpacing":2,"rotation":[0,0,0],"leftPoint":[2.8178761000817967,3.2189656143947305,0],"ly":0.3,"rightPoint":[-2.1535685252224215,3.2189656143947274,0],"unfilledHeight":0.5,"opacity":0.5,"fill":"Full","lx":4.971444625304218,"type":"Wall","id":"iVn6mF9eoYKrYt3EzDy2TC","leftJoints":["u1GLQPod2yRsFy4dWHVdVa"],"lz":13,"eavesLength":0,"cz":0,"cx":0.3321537874296876,"rValue":2,"selected":false,"cy":3.2189656143947287,"normal":[0,0,1],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"roofId":"ips8v5W6dhiA81cAxrdErd","leftRoofHeight":13,"rightRoofHeight":13,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13,"locked":true},{"textureType":"No Foundation Texture","solarAbsorberPipe":{},"parentId":"Ground","hvacSystem":{"thermostatSetpoint":20,"id":"A"},"type":"Foundation","lz":0.12,"normal":[0,0,1],"cx":-6.658209585503492,"solarPowerTower":{},"cz":0.06,"cy":2.9554447902666663,"rotation":[0,0,0.7770359328652141],"rValue":2,"selected":false,"ly":11.741720163005958,"lx":9.93953716847022,"id":"oGfdqtfZrLhGvZskoNeDFJ","solarUpdraftTower":{},"color":"#808080","locked":true},{"normal":[0,0,1],"lz":0,"selected":false,"ceiling":false,"sideColor":"#ffffff","ridgeRightPoint":[0,1],"type":"Roof","showLabel":false,"rValue":2,"id":"byzwW7Db61R9EfVcvoWVQ9","parentId":"2XGmuwQrQtDPGFB7FUq4gK","cx":0,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","textureType":"No Roof Texture","rotation":[0,0,0],"ly":0,"roofStructure":"Default","roofType":"Gable","ridgeLeftPoint":[0,1],"lx":0,"thickness":0.2,"lineColor":"#000000","cy":0,"cz":0,"wallsId":["jE7DwieCwvfvkHcN1Bkpu2"],"rise":1.2805235001608466,"color":"#73d8ff","lineWidth":0.2,"locked":true},{"textureType":"No Wall Texture","selected":false,"roofId":"tR8bCboRhW3wJCicDgK2jW","leftPoint":[6.104959873734063,-3.546673308869522,0.12],"structureColor":"white","rightRoofHeight":12.5,"id":"nkv63w7AFXpTDVXgNtZaZp","opacity":0,"rotation":[0,0,0],"leftJoints":["1G9FW32uCMUYbXB7bybpze"],"volumetricHeatCapacity":0.5,"lx":4.998533544552693,"wallStructure":"Default","unfilledHeight":3.8747450187684356,"cy":-1.0474065365931762,"cz":0,"parentId":"uj4Qq2BojpeyU8mLo7xk7N","foundationId":"uj4Qq2BojpeyU8mLo7xk7N","eavesLength":0,"fill":"Partial","cx":6.104959873734066,"ly":0.3,"structureSpacing":2,"type":"Wall","normal":[0,0,1],"rightJoints":[],"rValue":2,"color":"#4d4d4d","leftRoofHeight":12.5,"rightPoint":[6.104959873734069,1.4518602356831711,0.12],"lz":12.5,"structureWidth":0.1,"relativeAngle":1.5707963267948952,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.8747450187684356,"rightUnfilledHeight":3.8747450187684356,"leftTopPartialHeight":12.5,"rightTopPartialHeight":12.5,"locked":true},{"selected":false,"leftPoint":[-6.476087156413756,-3.5466733088695213,0.12],"fill":"Partial","structureSpacing":2,"ly":0.3,"roofId":"tR8bCboRhW3wJCicDgK2jW","structureWidth":0.1,"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","normal":[0,0,1],"lx":12.581047030147829,"structureColor":"white","unfilledHeight":3.877447716243144,"cy":-3.5466733088695213,"color":"#4d4d4d","wallStructure":"Default","type":"Wall","rotation":[0,0,0],"textureType":"No Wall Texture","rightPoint":[6.104959873734072,-3.546673308869523,0.12],"relativeAngle":-1.4119308473639638e-16,"id":"1G9FW32uCMUYbXB7bybpze","leftJoints":["9ULQ17PCkbiQTAk5KCBQqS"],"cx":-0.18556364133984293,"rValue":2,"cz":0,"eavesLength":0,"rightJoints":["nkv63w7AFXpTDVXgNtZaZp"],"lz":12.5,"opacity":0.5,"leftRoofHeight":12.5,"rightRoofHeight":12.5,"parentId":"uj4Qq2BojpeyU8mLo7xk7N","volumetricHeatCapacity":0.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.877447716243144,"rightUnfilledHeight":3.877447716243144,"leftTopPartialHeight":12.5,"rightTopPartialHeight":12.5,"locked":true},{"structureColor":"white","leftPoint":[-6.4760871564137545,1.4518602356831711,0.12],"selected":false,"color":"#4d4d4d","leftRoofHeight":12.5,"lz":12.5,"parentId":"uj4Qq2BojpeyU8mLo7xk7N","structureWidth":0.1,"fill":"Partial","roofId":"tR8bCboRhW3wJCicDgK2jW","textureType":"No Wall Texture","unfilledHeight":3.8825262761296813,"cy":-1.0474065365931766,"lx":4.998533544552695,"cz":0,"structureSpacing":2,"eavesLength":0,"volumetricHeatCapacity":0.5,"wallStructure":"Default","foundationId":"uj4Qq2BojpeyU8mLo7xk7N","rotation":[0,0,0],"leftJoints":[],"rightPoint":[-6.476087156413749,-3.546673308869523,0.12],"type":"Wall","id":"9ULQ17PCkbiQTAk5KCBQqS","rightJoints":["1G9FW32uCMUYbXB7bybpze"],"opacity":0.5,"relativeAngle":-1.5707963267948957,"cx":-6.476087156413751,"rightRoofHeight":12.5,"ly":0.3,"rValue":2,"normal":[0,0,1],"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":3.8825262761296813,"rightUnfilledHeight":3.8825262761296813,"leftTopPartialHeight":12.5,"rightTopPartialHeight":12.5,"locked":true},{"ly":7.102899659180595,"parentId":"Ground","rValue":2,"solarPowerTower":{},"color":"#808080","textureType":"No Foundation Texture","hvacSystem":{"thermostatSetpoint":20},"rotation":[0,0,0.7770359328652141],"cz":0.06,"lx":13.160581645410465,"solarUpdraftTower":{},"type":"Foundation","cy":-7.71612929167876,"solarAbsorberPipe":{},"cx":5.571147308635517,"id":"uj4Qq2BojpeyU8mLo7xk7N","normal":[0,0,1],"selected":false,"lz":0.12,"notBuilding":false,"locked":true},{"rValue":2,"ly":0,"ceiling":false,"lx":0,"sideColor":"#ffffff","cz":0,"lineWidth":0.2,"cx":0,"normal":[0,0,1],"lineColor":"#000000","showLabel":false,"wallsId":["nkv63w7AFXpTDVXgNtZaZp","9ULQ17PCkbiQTAk5KCBQqS","1G9FW32uCMUYbXB7bybpze"],"type":"Roof","rotation":[0,0,0],"textureType":"No Roof Texture","roofStructure":"Default","roofType":"Pyramid","thickness":0.1,"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","cy":0,"lz":0,"selected":false,"color":"#73d8ff","id":"tR8bCboRhW3wJCicDgK2jW","rise":0,"parentId":"uj4Qq2BojpeyU8mLo7xk7N","locked":true},{"mullionWidth":0.06,"frame":true,"type":"Window","shutter":{"color":"grey","showLeft":false,"showRight":false,"width":0.5},"rotation":[0,0,0],"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","selected":false,"sillWidth":0,"lineColor":"#000000","uValue":2,"normal":[0,-1,0],"mullionColor":"#4d4d4d","archHeight":1,"frameWidth":0.2,"showLabel":false,"lineWidth":0.2,"lx":0.3333333333333332,"tint":"#0062b1","cx":-0.011111111111111117,"cz":-0.041666666666666664,"id":"wqLLY7STGwviPzesQo2Pm3","cy":0.3,"color":"#ffffff","opacity":0.5,"ly":0.3,"windowType":"Default","mullionSpacing":2,"mullion":true,"lz":0.75,"parentId":"1QnZb7zSPuvyzTVeC8AkVL","locked":true},{"tint":"#0062b1","frame":true,"selected":false,"ly":0.3,"cz":-0.041666666666666664,"foundationId":"o2WibZi2fR7HySSdFgPoda","rotation":[0,0,0],"archHeight":1,"sillWidth":0,"windowType":"Default","cy":0.3,"parentId":"tJ6f61zEL1oQGpeeCnFH2S","cx":-0.011111111111111117,"id":"qUkb8xmoiBdjkzRWtig4SU","shutter":{"color":"grey","showLeft":false,"width":0.5,"showRight":false},"normal":[0,0,1],"color":"#ffffff","mullionWidth":0.06,"lx":0.3333333333333332,"mullion":true,"lz":0.75,"type":"Window","frameWidth":0.2,"mullionSpacing":2,"opacity":0.5,"uValue":2,"mullionColor":"#4d4d4d","locked":true},{"lz":0.48,"rotation":[0,0,0],"tint":"#315f6f","mullionWidth":0.05,"parentId":"1G9FW32uCMUYbXB7bybpze","ly":0.3,"cz":0.12,"type":"Window","mullionColor":"#666666","shutter":{"width":0.5,"color":"grey","showLeft":false,"showRight":false},"lineWidth":0.2,"windowType":"Default","sillWidth":0,"opacity":0.9,"lx":0.8743310452334228,"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","normal":[0,-1,0],"frame":true,"mullionSpacing":1,"mullion":true,"showLabel":false,"uValue":2,"cy":0.3,"cx":0,"color":"#ffffff","lineColor":"#000000","frameWidth":0.05,"id":"otfRaWBjxDE3hRYtq3HZ4m","archHeight":1,"selected":false,"locked":true},{"windowType":"Default","ly":0.3,"archHeight":1,"lz":0.14285714285714282,"selected":false,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","frame":true,"cy":0.3,"lineWidth":0.2,"lx":0.05384615384615385,"frameWidth":0.2,"lineColor":"#000000","cx":0.19358974358974362,"tint":"#b3b3b3","opacity":0.9,"mullionWidth":0.1,"cz":0.23291925465838512,"rotation":[0,0,0],"mullionSpacing":1.25,"type":"Window","mullionColor":"#ffffff","sillWidth":0,"normal":[0,-1,0],"showLabel":false,"id":"d7WscaF1Qtzp9YhmRPKdMx","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","color":"#ffffff","uValue":2,"mullion":true,"shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"locked":true},{"cx":0.2576923076923078,"frameWidth":0.2,"lx":0.05384615384615385,"tint":"#b3b3b3","opacity":0.9,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"sillWidth":0,"color":"#ffffff","lz":0.14285714285714282,"mullionColor":"#ffffff","mullionSpacing":1.25,"selected":false,"rotation":[0,0,0],"cy":0.3,"mullion":true,"ly":0.3,"normal":[0,0,1],"parentId":"jE7DwieCwvfvkHcN1Bkpu2","archHeight":1,"cz":0.23291925465838512,"mullionWidth":0.1,"type":"Window","id":"phyxK6dSx3mzB64HK7tbQq","windowType":"Default","frame":true,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"locked":true},{"color":"#ffffff","mullion":true,"lx":0.0538461538461538,"rotation":[0,0,0],"opacity":0.9,"windowType":"Default","cy":0.3,"ly":0.3,"type":"Window","uValue":2,"cx":0.3217948717948719,"frame":true,"cz":0.23291925465838512,"mullionSpacing":1.25,"shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"selected":false,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","frameWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","archHeight":1,"mullionColor":"#ffffff","lz":0.14285714285714282,"tint":"#b3b3b3","sillWidth":0,"mullionWidth":0.1,"normal":[0,0,1],"id":"rUCAQoA9pCTnCsyUCwQKsz","locked":true},{"lz":0.14285714285714285,"rotation":[0,0,0],"sillWidth":0,"windowType":"Default","frame":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cy":0.3,"mullionSpacing":1.25,"opacity":0.9,"ly":0.3,"uValue":2,"mullionColor":"#ffffff","color":"#ffffff","archHeight":1,"type":"Window","id":"cVhfCa3Uxnnwwat44DMDUA","mullionWidth":0.1,"cx":0.3910256410256411,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"mullion":true,"selected":false,"normal":[0,0,1],"lx":0.06410256410256411,"frameWidth":0.2,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","tint":"#b3b3b3","cz":0.23291925465838512,"locked":true},{"frame":true,"shutter":{"width":0.5,"showLeft":false,"showRight":false,"color":"grey"},"cx":0.1948717948717949,"color":"#ffffff","frameWidth":0.2,"mullion":true,"ly":0.3,"archHeight":1,"rotation":[0,0,0],"tint":"#b3b3b3","opacity":0.9,"mullionColor":"#ffffff","lx":0.056410256410256404,"id":"bNXPgPwYdtaKzeyyFztb1n","normal":[0,0,1],"sillWidth":0,"cz":-0.02795031055900621,"windowType":"Default","mullionWidth":0.1,"lz":0.14285714285714285,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"jE7DwieCwvfvkHcN1Bkpu2","selected":false,"type":"Window","cy":0.3,"mullionSpacing":1.25,"uValue":2,"locked":true},{"mullionWidth":0.1,"tint":"#b3b3b3","shutter":{"width":0.5,"showLeft":false,"color":"grey","showRight":false},"lz":0.14285714285714282,"cy":0.3,"uValue":2,"mullionSpacing":1.25,"sillWidth":0,"cx":0.20512820512820518,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","lx":0.03589743589743587,"rotation":[0,0,0],"selected":false,"type":"Window","archHeight":1,"mullionColor":"#ffffff","normal":[0,0,1],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"id":"3VvDJnQdsED8fAouDPT9yF","frameWidth":0.2,"ly":0.3,"windowType":"Default","frame":true,"color":"#ffffff","cz":-0.2888198757763975,"mullion":true,"locked":true},{"cz":-0.02795031055900621,"ly":0.3,"shutter":{"color":"grey","showRight":false,"width":0.5,"showLeft":false},"id":"kaF2HtrRicfNAq1W9doyfR","tint":"#b3b3b3","cy":0.3,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"jE7DwieCwvfvkHcN1Bkpu2","mullionSpacing":1.25,"normal":[0,0,1],"mullionWidth":0.1,"windowType":"Default","sillWidth":0,"type":"Window","rotation":[0,0,0],"uValue":2,"color":"#ffffff","archHeight":1,"mullion":true,"lz":0.14285714285714285,"frame":true,"selected":false,"lx":0.05384615384615385,"frameWidth":0.2,"cx":0.2576923076923078,"opacity":0.9,"mullionColor":"#ffffff","locked":true},{"parentId":"jE7DwieCwvfvkHcN1Bkpu2","mullionWidth":0.1,"mullionColor":"#ffffff","tint":"#b3b3b3","color":"#ffffff","cy":0.3,"lx":0.0538461538461538,"cx":0.3217948717948719,"frameWidth":0.2,"windowType":"Default","mullionSpacing":1.25,"opacity":0.9,"ly":0.3,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"rotation":[0,0,0],"type":"Window","id":"2pB9fvP8ZeUqogmRwvUTce","sillWidth":0,"normal":[0,0,1],"archHeight":1,"selected":false,"uValue":2,"lz":0.14285714285714285,"frame":true,"mullion":true,"cz":-0.02795031055900621,"locked":true},{"sillWidth":0,"frame":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionSpacing":1.25,"windowType":"Default","uValue":2,"lz":0.14285714285714285,"rotation":[0,0,0],"tint":"#b3b3b3","shutter":{"showLeft":false,"color":"grey","showRight":false,"width":0.5},"color":"#ffffff","parentId":"jE7DwieCwvfvkHcN1Bkpu2","id":"nTCU2PDq5uNAZg9zRpPCHX","archHeight":1,"opacity":0.9,"cx":0.3910256410256411,"mullionColor":"#ffffff","type":"Window","normal":[0,0,1],"cy":0.3,"mullion":true,"frameWidth":0.2,"selected":false,"lx":0.06410256410256411,"ly":0.3,"mullionWidth":0.1,"cz":-0.02795031055900621,"locked":true},{"frame":true,"archHeight":1,"normal":[0,0,1],"mullionColor":"#ffffff","cz":-0.2888198757763975,"windowType":"Default","mullionSpacing":1.25,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","cx":0.258974358974359,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionWidth":0.1,"uValue":2,"selected":false,"shutter":{"color":"grey","showLeft":false,"showRight":false,"width":0.5},"lx":0.056410256410256404,"sillWidth":0,"cy":0.3,"opacity":0.9,"type":"Window","ly":0.3,"lz":0.14285714285714282,"rotation":[0,0,0],"tint":"#b3b3b3","mullion":true,"frameWidth":0.2,"id":"1GzMSiwb36TFB48v2QYryB","color":"#ffffff","locked":true},{"id":"ayHDGxuZiXFZRCb6xwiWDe","lx":0.0538461538461538,"type":"Window","parentId":"jE7DwieCwvfvkHcN1Bkpu2","ly":0.3,"shutter":{"showLeft":false,"color":"grey","showRight":false,"width":0.5},"selected":false,"frame":true,"frameWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cz":-0.2888198757763975,"mullionColor":"#ffffff","mullionWidth":0.1,"archHeight":1,"tint":"#b3b3b3","windowType":"Default","color":"#ffffff","uValue":2,"normal":[0,0,1],"lz":0.14285714285714282,"mullion":true,"sillWidth":0,"cx":0.3217948717948719,"rotation":[0,0,0],"mullionSpacing":1.25,"opacity":0.9,"cy":0.3,"locked":true},{"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","normal":[0,0,1],"opacity":0.9,"cy":0.3,"tint":"#b3b3b3","rotation":[0,0,0],"frame":true,"lx":0.06410256410256411,"ly":0.3,"mullionWidth":0.1,"frameWidth":0.2,"mullionSpacing":1.25,"mullion":true,"sillWidth":0,"selected":false,"id":"mPyFc6BaTuwYm116awk4nS","lz":0.14285714285714285,"mullionColor":"#ffffff","uValue":2,"windowType":"Default","color":"#ffffff","cx":0.3910256410256411,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","archHeight":1,"cz":-0.2888198757763975,"type":"Window","shutter":{"showRight":false,"width":0.5,"showLeft":false,"color":"grey"},"locked":true},{"ly":0.3,"lz":4.070845481097757,"structureSpacing":4,"rotation":[0,0,0],"fill":"Full","textureType":"No Wall Texture","cy":-2.5093852454781445,"leftJoints":[],"structureWidth":0.5,"foundationId":"8DwiqAmnDYU6meyiSHFYvg","cz":2.0354227405488783,"volumetricHeatCapacity":0.5,"rValue":2,"id":"bwWCUGgxViKGTAu9eHo4CU","normal":[0,0,1],"cx":0.13591177848864566,"rightPoint":[5.998472224148425,-2.5093852454781453,0.2],"wallStructure":"Pillar","structureColor":"#4d4d4d","unfilledHeight":0.5,"type":"Wall","relativeAngle":-1.5150008736501291e-16,"lx":11.725120891319554,"selected":false,"eavesLength":0.3,"color":"#4d4d4d","leftPoint":[-5.726648667171128,-2.5093852454781445,0.2],"rightJoints":[],"parentId":"8DwiqAmnDYU6meyiSHFYvg","opacity":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.070845481097757,"rightTopPartialHeight":4.070845481097757,"locked":true},{"type":"Foundation","cy":-7.844584975085767,"textureType":"No Foundation Texture","ly":9.133282463061267,"cz":0.1,"normal":[0,0,1],"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"rotation":[0,0,0.7770359328652141],"lz":0.2,"solarAbsorberPipe":{},"parentId":"Ground","cx":5.386211591704882,"rValue":2,"color":"#e9d8ba","solarUpdraftTower":{},"id":"8DwiqAmnDYU6meyiSHFYvg","selected":false,"lx":13.077027743266148,"notBuilding":true,"locked":true},{"cz":0.23291925465838512,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"ly":0.3,"id":"46EurDPfGoJsechaGfz85S","cy":0.3,"mullionColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"tint":"#b3b3b3","mullionWidth":0.1,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"color":"#ffffff","opacity":0.9,"type":"Window","lx":0.051282051282051294,"selected":false,"mullionSpacing":1.25,"archHeight":1,"mullion":true,"windowType":"Default","sillWidth":0,"frame":true,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","lz":0.14285714285714285,"cx":-0.19230769230769235,"frameWidth":0.2,"locked":true},{"selected":false,"cy":0.3,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"mullion":true,"lz":0.14285714285714285,"archHeight":1,"opacity":0.9,"rotation":[0,0,0],"parentId":"jE7DwieCwvfvkHcN1Bkpu2","mullionSpacing":1.25,"lx":0.06410256410256411,"ly":0.3,"mullionColor":"#ffffff","windowType":"Default","frameWidth":0.2,"uValue":2,"normal":[0,0,1],"cx":-0.3910256410256411,"sillWidth":0,"type":"Window","tint":"#b3b3b3","color":"#ffffff","id":"izxRQkWui4YmZiY96HksMX","cz":0.23291925465838512,"frame":true,"mullionWidth":0.1,"locked":true},{"mullionSpacing":1.25,"uValue":2,"archHeight":1,"cy":0.3,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","cz":0.23291925465838512,"mullionWidth":0.1,"windowType":"Default","type":"Window","tint":"#b3b3b3","shutter":{"color":"grey","showLeft":false,"showRight":false,"width":0.5},"cx":-0.3217948717948719,"color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullion":true,"lx":0.0538461538461538,"normal":[0,0,1],"selected":false,"ly":0.3,"sillWidth":0,"frame":true,"opacity":0.9,"frameWidth":0.2,"mullionColor":"#ffffff","lz":0.14285714285714282,"id":"cx5YNYxji3cWvUe2vzHp8r","rotation":[0,0,0],"locked":true},{"frame":true,"selected":false,"shutter":{"showRight":false,"width":0.5,"showLeft":false,"color":"grey"},"sillWidth":0,"frameWidth":0.2,"mullionWidth":0.1,"cz":0.23291925465838512,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"jE7DwieCwvfvkHcN1Bkpu2","color":"#ffffff","opacity":0.9,"type":"Window","lz":0.14285714285714282,"normal":[0,0,1],"mullionSpacing":1.25,"uValue":2,"mullion":true,"id":"v7KHWrJEpTEx5wKqo46MKC","mullionColor":"#ffffff","windowType":"Default","ly":0.3,"cx":-0.25512820512820517,"rotation":[0,0,0],"cy":0.3,"archHeight":1,"tint":"#b3b3b3","lx":0.05897435897435896,"locked":true},{"uValue":2,"frameWidth":0.2,"normal":[0,0,1],"mullionSpacing":1.25,"cx":-0.3884615384615385,"selected":false,"lx":0.06923076923076922,"ly":0.3,"rotation":[0,0,0],"cz":-0.2888198757763975,"mullion":true,"lz":0.14285714285714282,"opacity":0.9,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","archHeight":1,"mullionColor":"#ffffff","windowType":"Default","shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"type":"Window","sillWidth":0,"mullionWidth":0.1,"color":"#ffffff","tint":"#b3b3b3","id":"aq2YNCbxikYtSJvwjUbALP","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","frame":true,"cy":0.3,"locked":true},{"tint":"#b3b3b3","ly":0.3,"id":"nMhMe9155kYQJYGKXKtDJE","mullion":true,"rotation":[0,0,0],"frameWidth":0.2,"archHeight":1,"lz":0.14285714285714282,"color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","selected":false,"frame":true,"cx":-0.3192307692307694,"sillWidth":0,"mullionWidth":0.1,"normal":[0,0,1],"cy":0.3,"opacity":0.9,"shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"cz":-0.2888198757763975,"type":"Window","lx":0.05384615384615394,"uValue":2,"mullionSpacing":1.25,"windowType":"Default","mullionColor":"#ffffff","parentId":"jE7DwieCwvfvkHcN1Bkpu2","locked":true},{"lx":0.05384615384615385,"opacity":0.9,"mullionWidth":0.1,"type":"Window","sillWidth":0,"ly":0.3,"uValue":2,"shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"mullionColor":"#ffffff","cz":-0.2888198757763975,"cx":-0.25512820512820517,"normal":[0,0,1],"selected":false,"id":"9uThAQakWzLaaAnEDxEbHb","mullion":true,"color":"#ffffff","windowType":"Default","lz":0.14285714285714282,"frame":true,"rotation":[0,0,0],"cy":0.3,"mullionSpacing":1.25,"archHeight":1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","frameWidth":0.2,"tint":"#b3b3b3","parentId":"jE7DwieCwvfvkHcN1Bkpu2","locked":true},{"windowType":"Default","opacity":0.9,"mullionSpacing":1.25,"mullionWidth":0.1,"lz":0.14285714285714285,"cx":-0.19230769230769235,"cy":0.3,"id":"8fuBFjedq9njRTLoxtn8EP","lx":0.051282051282051294,"uValue":2,"frame":true,"sillWidth":0,"mullion":true,"frameWidth":0.2,"archHeight":1,"cz":-0.2888198757763975,"selected":false,"normal":[0,0,1],"ly":0.3,"rotation":[0,0,0],"type":"Window","parentId":"jE7DwieCwvfvkHcN1Bkpu2","color":"#ffffff","shutter":{"showRight":false,"showLeft":false,"color":"grey","width":0.5},"tint":"#b3b3b3","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionColor":"#ffffff","locked":true},{"mullionSpacing":1.25,"cx":-0.3884615384615385,"cy":0.3,"mullionWidth":0.1,"mullion":true,"color":"#ffffff","type":"Window","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionColor":"#ffffff","cz":-0.02795031055900621,"lz":0.14285714285714285,"tint":"#b3b3b3","frameWidth":0.2,"sillWidth":0,"selected":false,"uValue":2,"rotation":[0,0,0],"normal":[0,0,1],"ly":0.3,"archHeight":1,"shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"frame":true,"lx":0.06923076923076922,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","opacity":0.9,"windowType":"Default","id":"djvC79sCMpkHHpaVqyVdW8","locked":true},{"uValue":2,"lz":0.14285714285714285,"type":"Window","id":"eZg5T5d6C7sKQSaPhcKxw6","ly":0.3,"frameWidth":0.2,"frame":true,"cy":0.3,"windowType":"Default","shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"selected":false,"sillWidth":0,"lx":0.056410256410256446,"mullion":true,"mullionWidth":0.1,"normal":[0,0,1],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cx":-0.31794871794871804,"archHeight":1,"mullionColor":"#ffffff","tint":"#b3b3b3","color":"#ffffff","rotation":[0,0,0],"mullionSpacing":1.25,"cz":-0.02795031055900621,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","opacity":0.9,"locked":true},{"lx":0.056410256410256404,"normal":[0,0,1],"mullion":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionWidth":0.1,"frameWidth":0.2,"archHeight":1,"cz":-0.02795031055900621,"cy":0.3,"opacity":0.9,"ly":0.3,"windowType":"Default","frame":true,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","cx":-0.2538461538461539,"selected":false,"rotation":[0,0,0],"color":"#ffffff","uValue":2,"id":"8xJvoQv2PELZbsAu7THviM","type":"Window","mullionColor":"#ffffff","mullionSpacing":1.25,"lz":0.14285714285714285,"tint":"#b3b3b3","shutter":{"showLeft":false,"width":0.5,"showRight":false,"color":"grey"},"sillWidth":0,"locked":true},{"mullionColor":"#ffffff","shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"windowType":"Default","normal":[0,0,1],"mullionWidth":0.1,"lz":0.14285714285714285,"cy":0.3,"type":"Window","rotation":[0,0,0],"opacity":0.9,"id":"6253HwoM7vYHZDUNYjsTgU","selected":false,"frame":true,"ly":0.3,"lx":0.051282051282051294,"archHeight":1,"mullion":true,"cx":-0.19230769230769235,"tint":"#b3b3b3","frameWidth":0.2,"color":"#ffffff","uValue":2,"cz":-0.02795031055900621,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"jE7DwieCwvfvkHcN1Bkpu2","sillWidth":0,"mullionSpacing":1.25,"locked":true},{"mullionColor":"#4d4d4d","rotation":[0,0,0],"mullionWidth":0.06,"frameWidth":0.2,"opacity":0.5,"cz":-0.041666666666666664,"lx":0.11695906432748526,"shutter":{"showRight":false,"width":0.5,"showLeft":false,"color":"grey"},"parentId":"vEPKSnunpPsGKUDNJaGnTR","archHeight":1,"ly":0.3,"cy":0.3,"type":"Window","color":"#ffffff","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","frame":true,"mullionSpacing":2,"cx":0.11111111111111106,"uValue":2,"selected":false,"windowType":"Default","id":"gcLhGQTVxE2fJnMpRDahoq","tint":"#0062b1","mullion":true,"normal":[0,0,1],"lz":0.75,"sillWidth":0,"locked":true},{"frame":true,"rotation":[0,0,0],"mullionColor":"#4d4d4d","shutter":{"width":0.5,"showLeft":false,"showRight":false,"color":"grey"},"cx":0.3216374269005848,"frameWidth":0.2,"parentId":"vEPKSnunpPsGKUDNJaGnTR","archHeight":1,"ly":0.3,"foundationId":"j3n8P4y4kG4w4nSZiAf6rj","opacity":0.5,"mullion":true,"lz":0.75,"id":"sP3EuQN5nUzkBPzPZicBDL","mullionWidth":0.06,"lx":0.11695906432748526,"windowType":"Default","uValue":2,"sillWidth":0,"selected":false,"type":"Window","mullionSpacing":2,"cy":0.3,"normal":[0,0,1],"tint":"#0062b1","cz":-0.041666666666666664,"color":"#ffffff","locked":true},{"parentId":"3WQQwDXPDfYCATy53ts83F","cx":-0.3099415204678364,"rotation":[0,0,0],"uValue":2,"lz":0.75,"type":"Window","opacity":0.5,"selected":false,"normal":[0,0,1],"mullionSpacing":2,"mullionColor":"#4d4d4d","cy":0.3,"lx":0.11695906432748526,"sillWidth":0,"archHeight":1,"mullionWidth":0.06,"frame":true,"ly":0.3,"tint":"#0062b1","id":"a9iz7tks9oLk2eTwA9Yde3","foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","shutter":{"showRight":false,"width":0.5,"color":"grey","showLeft":false},"mullion":true,"frameWidth":0.2,"windowType":"Default","color":"#ffffff","cz":-0.041666666666666664,"locked":true},{"color":"#ffffff","cx":-0.09941520467836266,"normal":[0,0,1],"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","rotation":[0,0,0],"mullionColor":"#4d4d4d","cz":-0.041666666666666664,"archHeight":1,"sillWidth":0,"mullionWidth":0.06,"windowType":"Default","shutter":{"color":"grey","showRight":false,"showLeft":false,"width":0.5},"type":"Window","mullionSpacing":2,"parentId":"3WQQwDXPDfYCATy53ts83F","cy":0.3,"selected":false,"mullion":true,"opacity":0.5,"lz":0.75,"id":"s7untaE7NYoTEH5Xxqu7vu","uValue":2,"ly":0.3,"lx":0.11695906432748526,"tint":"#0062b1","frameWidth":0.2,"frame":true,"locked":true},{"cz":-0.041666666666666664,"normal":[0,0,1],"sillWidth":0,"windowType":"Default","color":"#ffffff","mullionColor":"#4d4d4d","parentId":"eZza9yCuyFywaPPzJVe5tY","tint":"#0062b1","frameWidth":0.2,"type":"Window","lz":0.75,"id":"4J5xN82Vi7ATj7FHVXK9fT","foundationId":"o2WibZi2fR7HySSdFgPoda","rotation":[0,0,0],"frame":true,"cx":-0.30994152046783635,"mullionSpacing":2,"uValue":2,"ly":0.3,"opacity":0.5,"lx":0.11695906432748526,"selected":false,"mullionWidth":0.06,"cy":0.3,"archHeight":1,"shutter":{"color":"grey","showRight":false,"showLeft":false,"width":0.5},"mullion":true,"locked":true},{"parentId":"eZza9yCuyFywaPPzJVe5tY","uValue":2,"cx":-0.09941520467836262,"mullionSpacing":2,"lz":0.75,"normal":[0,0,1],"frameWidth":0.2,"cz":-0.041666666666666664,"tint":"#0062b1","ly":0.3,"rotation":[0,0,0],"cy":0.3,"mullionWidth":0.06,"type":"Window","opacity":0.5,"selected":false,"frame":true,"foundationId":"o2WibZi2fR7HySSdFgPoda","archHeight":1,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"sillWidth":0,"color":"#ffffff","windowType":"Default","mullion":true,"mullionColor":"#4d4d4d","lx":0.11695906432748526,"id":"215xeoB94LfwSgY9VkRb9T","locked":true},{"archHeight":1,"lx":0.11695906432748526,"id":"ddfjZo324XGZQ4fjUcBn6X","sillWidth":0,"mullionWidth":0.06,"ly":0.3,"opacity":0.5,"type":"Window","mullionSpacing":2,"windowType":"Default","color":"#ffffff","foundationId":"hLsewK7zX5Mau5SErFyCiz","normal":[0,0,1],"uValue":2,"frameWidth":0.2,"parentId":"5KcXyJ1kNDvp5rTZsShAbX","mullionColor":"#4d4d4d","rotation":[0,0,0],"cz":-0.041666666666666664,"cy":0.3,"shutter":{"showLeft":false,"width":0.5,"color":"grey","showRight":false},"mullion":true,"cx":0.3216374269005847,"selected":false,"tint":"#0062b1","lz":0.75,"frame":true,"locked":true},{"normal":[0,0,1],"foundationId":"hLsewK7zX5Mau5SErFyCiz","lz":0.75,"windowType":"Default","archHeight":1,"parentId":"5KcXyJ1kNDvp5rTZsShAbX","lx":0.11695906432748526,"uValue":2,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"type":"Window","mullionColor":"#4d4d4d","opacity":0.5,"mullionWidth":0.06,"frameWidth":0.2,"cx":0.11111111111111105,"cz":-0.041666666666666664,"id":"rw5R1u3LjL3kSbDYXLqpep","tint":"#0062b1","frame":true,"sillWidth":0,"cy":0.3,"color":"#ffffff","ly":0.3,"rotation":[0,0,0],"mullion":true,"selected":false,"mullionSpacing":2,"locked":true},{"id":"u7vgLv3TfTJ9G6m9VRJXKE","cy":-8.330957372051333,"type":"Cuboid","selected":false,"cz":0.6,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","ly":4.416238472006233,"rotation":[0,0,0.7770205829878756],"cx":6.1134856174136125,"lx":12.5,"color":"#e9d8ba","lz":1.2,"normal":[0,0,1],"faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"locked":true},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"color":"#e9d8ba","rotation":[0,0,0.7770205829878756],"ly":0.3,"parentId":"Ground","type":"Cuboid","cx":7.775993069912096,"cz":0.5,"lz":1,"cy":-9.982710148514444,"normal":[0,0,1],"id":"xwTCcYWFUqCHdfYgjwLPzr","selected":false,"lx":12.5,"locked":true},{"cy":-10.222251297562046,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lx":12.5,"color":"#e9d8ba","cz":0.4,"rotation":[0,0,0.7770205829878756],"cx":7.97917394469156,"type":"Cuboid","id":"4ahnYxjJA1TN7cwGSyLftT","lz":0.8,"normal":[0,0,1],"parentId":"Ground","ly":0.3,"selected":false,"faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"locked":true},{"parentId":"Ground","selected":false,"faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"cz":0.3,"id":"axXhhxk8aLaskye6X7yAxR","cy":-10.456557176149813,"color":"#e9d8ba","rotation":[0,0,0.7770205829878756],"cx":8.172887209710508,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","normal":[0,0,1],"ly":0.3,"lx":12.5,"lz":0.6,"locked":true},{"color":"#e9d8ba","ly":0.3,"cz":0.2,"parentId":"Ground","lz":0.4,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"k4MhMFRn1raEXYc4ftU5Lc","faceColors":["#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#e9d8ba","#808080"],"type":"Cuboid","cx":8.377329978512003,"selected":false,"rotation":[0,0,0.7770205829878756],"normal":[0,0,1],"lx":12.5,"cy":-10.669908202265143,"locked":true},{"sillWidth":0,"color":"#ffffff","lz":0.14285714285714285,"shutter":{"showLeft":false,"width":0.5,"color":"grey","showRight":false},"normal":[0,0,1],"cy":0.3,"id":"aAHxe5UAeWUHZvvacf7DLX","frame":true,"opacity":0.9,"windowType":"Default","mullionColor":"#ffffff","frameWidth":0.2,"mullionWidth":0.05,"cx":-0.3782051282051282,"lx":0.03846153846153847,"archHeight":1,"mullion":true,"parentId":"r7FDtsVF9isPsPhYMJtzMf","ly":0.3,"type":"Window","cz":-0.30952380952380953,"selected":false,"mullionSpacing":1,"uValue":2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","rotation":[0,0,0],"tint":"#b3b3b3","locked":true},{"archHeight":1,"windowType":"Default","frame":true,"normal":[0,0,1],"color":"#ffffff","cy":0.3,"tint":"#b3b3b3","ly":0.3,"parentId":"r7FDtsVF9isPsPhYMJtzMf","mullionWidth":0.05,"shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"id":"o3uqUfUSMsh6mPJ8kZKe6V","rotation":[0,0,0],"mullion":true,"selected":false,"lx":0.03846153846153847,"uValue":2,"mullionSpacing":1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","sillWidth":0,"frameWidth":0.2,"type":"Window","lz":0.14285714285714285,"mullionColor":"#ffffff","opacity":0.9,"cx":-0.3782051282051282,"cz":0.2619047619047619,"locked":true},{"sillWidth":0,"frame":true,"tint":"#b3b3b3","mullion":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"id":"ftqkfAje9vSURSKAfdGfkb","frameWidth":0.2,"cy":0.1,"lz":0.14285714285714285,"ly":0.3,"shutter":{"showLeft":false,"color":"grey","width":0.5,"showRight":false},"lx":0.03846153846153847,"mullionColor":"#ffffff","cz":0.2619047619047619,"mullionSpacing":1,"color":"#ffffff","mullionWidth":0.05,"normal":[0,0,1],"uValue":2,"type":"Window","parentId":"r7FDtsVF9isPsPhYMJtzMf","selected":false,"cx":-0.3205128205128205,"rotation":[0,0,0],"archHeight":1,"windowType":"Default","locked":true},{"mullionWidth":0.05,"opacity":0.9,"mullionColor":"#ffffff","type":"Window","parentId":"r7FDtsVF9isPsPhYMJtzMf","mullion":true,"selected":false,"uValue":2,"color":"#ffffff","cz":0.2619047619047619,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionSpacing":1,"ly":0.3,"cx":-0.26282051282051283,"lz":0.14285714285714285,"rotation":[0,0,0],"windowType":"Default","sillWidth":0,"normal":[0,0,1],"lx":0.03846153846153847,"frameWidth":0.2,"frame":true,"id":"47o8tVpT7No3q7ScC7ayfT","archHeight":1,"shutter":{"showRight":false,"width":0.5,"color":"grey","showLeft":false},"cy":0.1,"tint":"#b3b3b3","locked":true},{"id":"e9WgXpqUMuc4bjKV6V5giQ","cz":0.2619047619047619,"lx":0.03846153846153847,"type":"Window","cy":0.1,"tint":"#b3b3b3","frameWidth":0.2,"uValue":2,"sillWidth":0,"mullionWidth":0.05,"rotation":[0,0,0],"mullionSpacing":1,"ly":0.3,"shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"normal":[0,0,1],"mullionColor":"#ffffff","opacity":0.9,"cx":-0.2051282051282051,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","color":"#ffffff","windowType":"Default","lz":0.14285714285714285,"parentId":"r7FDtsVF9isPsPhYMJtzMf","archHeight":1,"selected":false,"frame":true,"mullion":true,"locked":true},{"lz":0.14285714285714285,"ly":0.3,"archHeight":1,"cz":0.2619047619047619,"mullionWidth":0.05,"tint":"#b3b3b3","shutter":{"showRight":false,"width":0.5,"showLeft":false,"color":"grey"},"mullionSpacing":1,"normal":[0,0,1],"cx":-0.14743589743589736,"id":"vWfatFM987X7DVksHURHa2","mullion":true,"rotation":[0,0,0],"opacity":0.9,"lx":0.03846153846153847,"mullionColor":"#ffffff","cy":0.1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"sillWidth":0,"type":"Window","frame":true,"windowType":"Default","selected":false,"parentId":"r7FDtsVF9isPsPhYMJtzMf","frameWidth":0.2,"color":"#ffffff","locked":true},{"frameWidth":0.2,"type":"Window","frame":true,"mullionWidth":0.05,"parentId":"r7FDtsVF9isPsPhYMJtzMf","id":"1JBYjadgjTeQWv6jrVmNzf","cz":0.2619047619047619,"normal":[0,0,1],"cy":0.1,"cx":-0.08974358974358965,"rotation":[0,0,0],"tint":"#b3b3b3","windowType":"Default","mullion":true,"ly":0.3,"uValue":2,"archHeight":1,"lx":0.03846153846153847,"lz":0.14285714285714285,"mullionColor":"#ffffff","color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionSpacing":1,"sillWidth":0,"opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"width":0.5,"color":"grey"},"selected":false,"locked":true},{"mullionSpacing":1,"selected":false,"tint":"#b3b3b3","frameWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","color":"#ffffff","uValue":2,"ly":0.3,"opacity":0.9,"frame":true,"type":"Window","shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"parentId":"r7FDtsVF9isPsPhYMJtzMf","archHeight":1,"sillWidth":0,"cy":0.1,"cz":-0.30952380952380953,"rotation":[0,0,0],"lz":0.14285714285714285,"id":"cfj3pRCVpZMJFi4BqedUfe","mullion":true,"normal":[0,0,1],"mullionWidth":0.05,"cx":-0.3205128205128205,"windowType":"Default","mullionColor":"#ffffff","lx":0.03846153846153847,"locked":true},{"mullionColor":"#ffffff","lz":0.14285714285714285,"cy":0.1,"shutter":{"color":"grey","showLeft":false,"width":0.5,"showRight":false},"cz":-0.30952380952380953,"tint":"#b3b3b3","uValue":2,"color":"#ffffff","mullionWidth":0.05,"id":"mdRuaw8QhYk6E15WXmfncN","normal":[0,0,1],"frameWidth":0.2,"ly":0.3,"frame":true,"lx":0.03846153846153847,"selected":false,"mullionSpacing":1,"windowType":"Default","cx":-0.26282051282051283,"parentId":"r7FDtsVF9isPsPhYMJtzMf","mullion":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","rotation":[0,0,0],"type":"Window","archHeight":1,"opacity":0.9,"sillWidth":0,"locked":true},{"tint":"#b3b3b3","frameWidth":0.2,"uValue":2,"id":"55aZ17NQmYsZjj65tA9N6c","type":"Window","cy":0.1,"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","color":"#ffffff","normal":[0,0,1],"mullion":true,"shutter":{"showRight":false,"color":"grey","showLeft":false,"width":0.5},"mullionColor":"#ffffff","cx":-0.2051282051282051,"windowType":"Default","cz":-0.30952380952380953,"lz":0.14285714285714285,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","selected":false,"opacity":0.9,"archHeight":1,"lx":0.03846153846153847,"mullionSpacing":1,"mullionWidth":0.05,"frame":true,"ly":0.3,"sillWidth":0,"locked":true},{"type":"Window","ly":0.3,"windowType":"Default","cz":-0.30952380952380953,"sillWidth":0,"frameWidth":0.2,"lz":0.14285714285714285,"archHeight":1,"normal":[0,0,1],"color":"#ffffff","selected":false,"lx":0.03846153846153847,"tint":"#b3b3b3","cx":-0.14743589743589736,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionWidth":0.05,"id":"1z5sb7DiDiWaTZ6WSGSBgP","shutter":{"showLeft":false,"showRight":false,"width":0.5,"color":"grey"},"mullionSpacing":1,"opacity":0.9,"rotation":[0,0,0],"mullionColor":"#ffffff","frame":true,"cy":0.1,"mullion":true,"uValue":2,"parentId":"r7FDtsVF9isPsPhYMJtzMf","locked":true},{"mullion":true,"cx":-0.08974358974358965,"tint":"#b3b3b3","mullionSpacing":1,"normal":[0,0,1],"sillWidth":0,"lz":0.14285714285714285,"archHeight":1,"rotation":[0,0,0],"lx":0.03846153846153847,"frameWidth":0.2,"color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"ly":0.3,"type":"Window","selected":false,"id":"1VhTxbHHBGndaZD6vgtVKW","frame":true,"opacity":0.9,"mullionColor":"#ffffff","mullionWidth":0.05,"cz":-0.30952380952380953,"parentId":"r7FDtsVF9isPsPhYMJtzMf","cy":0.1,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"windowType":"Default","locked":true},{"lx":0.03846153846153847,"tint":"#b3b3b3","shutter":{"showRight":false,"showLeft":false,"width":0.5,"color":"grey"},"type":"Window","frame":true,"mullionSpacing":1,"archHeight":1,"sillWidth":0,"cy":0.3,"opacity":0.9,"id":"xmoWZwUhtR6SFNiGKtxr1m","mullionWidth":0.05,"color":"#ffffff","rotation":[0,0,0],"mullionColor":"#ffffff","lz":0.14285714285714285,"normal":[0,0,1],"cx":-0.3782051282051282,"parentId":"r7FDtsVF9isPsPhYMJtzMf","selected":false,"windowType":"Default","uValue":2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","ly":0.3,"mullion":true,"frameWidth":0.2,"cz":-0.023809523809523808,"locked":true},{"archHeight":1,"cy":0.1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"r7FDtsVF9isPsPhYMJtzMf","lz":0.14285714285714285,"ly":0.3,"shutter":{"showLeft":false,"width":0.5,"showRight":false,"color":"grey"},"mullionSpacing":1,"lx":0.03846153846153847,"selected":false,"cx":-0.3205128205128205,"id":"dmo2H1zYKT8Yb8BFyJx3Gz","cz":-0.023809523809523808,"tint":"#b3b3b3","mullionWidth":0.05,"normal":[0,0,1],"rotation":[0,0,0],"frame":true,"color":"#ffffff","type":"Window","frameWidth":0.2,"uValue":2,"mullion":true,"mullionColor":"#ffffff","windowType":"Default","opacity":0.9,"sillWidth":0,"locked":true},{"normal":[0,0,1],"tint":"#b3b3b3","mullionWidth":0.05,"mullion":true,"frame":true,"uValue":2,"type":"Window","rotation":[0,0,0],"mullionColor":"#ffffff","mullionSpacing":1,"opacity":0.9,"frameWidth":0.2,"ly":0.3,"parentId":"r7FDtsVF9isPsPhYMJtzMf","shutter":{"showLeft":false,"showRight":false,"width":0.5,"color":"grey"},"windowType":"Default","lz":0.14285714285714285,"cy":0.1,"sillWidth":0,"selected":false,"cz":-0.023809523809523808,"archHeight":1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","lx":0.03846153846153847,"cx":-0.26282051282051283,"id":"ifqLCE1HzUvw6zh9hXdDbd","color":"#ffffff","locked":true},{"shutter":{"color":"grey","showRight":false,"showLeft":false,"width":0.5},"cx":-0.2051282051282051,"parentId":"r7FDtsVF9isPsPhYMJtzMf","uValue":2,"ly":0.3,"normal":[0,0,1],"cz":-0.023809523809523808,"mullionWidth":0.05,"frame":true,"sillWidth":0,"id":"gA23Z9tUz7wPHpEvmsKQF9","windowType":"Default","mullion":true,"lx":0.03846153846153847,"opacity":0.9,"type":"Window","archHeight":1,"lz":0.14285714285714285,"rotation":[0,0,0],"selected":false,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","frameWidth":0.2,"mullionSpacing":1,"mullionColor":"#ffffff","tint":"#b3b3b3","color":"#ffffff","cy":0.1,"locked":true},{"type":"Window","frame":true,"selected":false,"uValue":2,"rotation":[0,0,0],"mullionSpacing":1,"lx":0.03846153846153847,"id":"g26wC9moZKAAzi72Vpxkja","mullionColor":"#ffffff","color":"#ffffff","windowType":"Default","cy":0.1,"parentId":"r7FDtsVF9isPsPhYMJtzMf","cz":-0.023809523809523808,"sillWidth":0,"ly":0.3,"lz":0.14285714285714285,"cx":-0.14743589743589736,"tint":"#b3b3b3","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"frameWidth":0.2,"normal":[0,0,1],"archHeight":1,"mullionWidth":0.05,"mullion":true,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"locked":true},{"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"color":"#ffffff","parentId":"r7FDtsVF9isPsPhYMJtzMf","id":"t5oxzLUUWgsBQiTqMqndt1","cz":-0.023809523809523808,"sillWidth":0,"uValue":2,"ly":0.3,"shutter":{"showRight":false,"color":"grey","showLeft":false,"width":0.5},"rotation":[0,0,0],"selected":false,"mullionWidth":0.05,"cx":-0.08974358974358965,"windowType":"Default","mullion":true,"mullionColor":"#ffffff","type":"Window","normal":[0,0,1],"cy":0.1,"tint":"#b3b3b3","mullionSpacing":1,"frameWidth":0.2,"frame":true,"archHeight":1,"lx":0.03846153846153847,"lz":0.14285714285714285,"locked":true},{"mullionWidth":0.05,"cx":0.10897435897435898,"uValue":2,"selected":false,"frameWidth":0.2,"lz":0.14285714285714285,"type":"Window","id":"9Xa2jX1sxCcJu9Qb6YPC2s","mullionColor":"#ffffff","opacity":0.9,"sillWidth":0,"lx":0.03846153846153847,"parentId":"r7FDtsVF9isPsPhYMJtzMf","archHeight":1,"color":"#ffffff","normal":[0,0,1],"windowType":"Default","rotation":[0,0,0],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","frame":true,"cy":0.3,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"mullion":true,"mullionSpacing":1,"cz":-0.30952380952380953,"tint":"#b3b3b3","ly":0.3,"locked":true},{"uValue":2,"frame":true,"mullionColor":"#ffffff","cy":0.1,"sillWidth":0,"frameWidth":0.2,"ly":0.3,"shutter":{"width":0.5,"showLeft":false,"color":"grey","showRight":false},"cz":-0.30952380952380953,"id":"jAuZTLVVKe7wAQ3T71wGgZ","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionWidth":0.05,"parentId":"r7FDtsVF9isPsPhYMJtzMf","selected":false,"opacity":0.9,"windowType":"Default","mullionSpacing":1,"archHeight":1,"normal":[0,0,1],"mullion":true,"rotation":[0,0,0],"lx":0.03846153846153847,"type":"Window","tint":"#b3b3b3","cx":0.16666666666666669,"lz":0.14285714285714285,"color":"#ffffff","locked":true},{"mullionSpacing":1,"selected":false,"opacity":0.9,"windowType":"Default","type":"Window","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cx":0.22435897435897442,"archHeight":1,"sillWidth":0,"mullion":true,"tint":"#b3b3b3","lz":0.14285714285714285,"frameWidth":0.2,"normal":[0,0,1],"ly":0.3,"mullionWidth":0.05,"cz":-0.30952380952380953,"id":"vENyYLo9ct8hNwWCaxGgh9","lx":0.03846153846153847,"parentId":"r7FDtsVF9isPsPhYMJtzMf","frame":true,"shutter":{"color":"grey","showLeft":false,"width":0.5,"showRight":false},"mullionColor":"#ffffff","color":"#ffffff","cy":0.1,"rotation":[0,0,0],"uValue":2,"locked":true},{"selected":false,"color":"#ffffff","sillWidth":0,"uValue":2,"cz":-0.30952380952380953,"shutter":{"color":"grey","showRight":false,"width":0.5,"showLeft":false},"frame":true,"mullion":true,"mullionSpacing":1,"mullionWidth":0.05,"normal":[0,0,1],"parentId":"r7FDtsVF9isPsPhYMJtzMf","id":"q7q4AW6uBwbJ6Cu8CRiTjs","type":"Window","tint":"#b3b3b3","ly":0.3,"frameWidth":0.2,"cy":0.1,"lz":0.14285714285714285,"rotation":[0,0,0],"cx":0.2820512820512821,"lx":0.03846153846153847,"mullionColor":"#ffffff","windowType":"Default","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","archHeight":1,"opacity":0.9,"locked":true},{"tint":"#b3b3b3","archHeight":1,"mullion":true,"cx":0.33974358974358976,"rotation":[0,0,0],"lx":0.03846153846153847,"windowType":"Default","mullionSpacing":1,"type":"Window","uValue":2,"cy":0.1,"id":"93xJt2nF5KXFmbdPTBkxxA","shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"mullionWidth":0.05,"sillWidth":0,"ly":0.3,"color":"#ffffff","cz":-0.30952380952380953,"frameWidth":0.2,"mullionColor":"#ffffff","frame":true,"lz":0.14285714285714285,"opacity":0.9,"normal":[0,0,1],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","selected":false,"parentId":"r7FDtsVF9isPsPhYMJtzMf","locked":true},{"normal":[0,0,1],"mullionWidth":0.05,"parentId":"r7FDtsVF9isPsPhYMJtzMf","lz":0.14285714285714285,"selected":false,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","type":"Window","id":"rqxKsXtJSfhtmcVetqkrnQ","windowType":"Default","cz":-0.30952380952380953,"frameWidth":0.2,"lx":0.03846153846153847,"ly":0.3,"mullion":true,"archHeight":1,"frame":true,"sillWidth":0,"opacity":0.9,"uValue":2,"cy":0.1,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"rotation":[0,0,0],"cx":0.3974358974358974,"color":"#ffffff","mullionSpacing":1,"mullionColor":"#ffffff","tint":"#b3b3b3","locked":true},{"shutter":{"width":0.5,"color":"grey","showLeft":false,"showRight":false},"color":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","type":"Window","windowType":"Default","normal":[0,0,1],"parentId":"r7FDtsVF9isPsPhYMJtzMf","rotation":[0,0,0],"mullionSpacing":1,"lz":0.14285714285714285,"mullionColor":"#ffffff","archHeight":1,"mullion":true,"sillWidth":0,"opacity":0.9,"mullionWidth":0.05,"cy":0.3,"cz":-0.023809523809523808,"lx":0.03846153846153847,"ly":0.3,"tint":"#b3b3b3","selected":false,"cx":0.10897435897435898,"id":"t5xKggUuuYXpJByLpjQCCN","frameWidth":0.2,"uValue":2,"frame":true,"locked":true},{"color":"#ffffff","id":"3mgduhR1rZfiGxV9DxMKKp","selected":false,"cz":-0.023809523809523808,"tint":"#b3b3b3","frame":true,"mullionColor":"#ffffff","frameWidth":0.2,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","parentId":"r7FDtsVF9isPsPhYMJtzMf","mullion":true,"windowType":"Default","ly":0.3,"mullionWidth":0.05,"uValue":2,"lx":0.03846153846153847,"mullionSpacing":1,"lz":0.14285714285714285,"type":"Window","rotation":[0,0,0],"normal":[0,0,1],"sillWidth":0,"cx":0.16666666666666669,"shutter":{"width":0.5,"showRight":false,"showLeft":false,"color":"grey"},"cy":0.1,"opacity":0.9,"archHeight":1,"locked":true},{"sillWidth":0,"windowType":"Default","mullionWidth":0.05,"uValue":2,"mullionSpacing":1,"id":"3iPxQ9YQqC9r3Ge6DJC5HU","selected":false,"opacity":0.9,"parentId":"r7FDtsVF9isPsPhYMJtzMf","shutter":{"color":"grey","showRight":false,"width":0.5,"showLeft":false},"frame":true,"type":"Window","cy":0.1,"mullion":true,"ly":0.3,"rotation":[0,0,0],"tint":"#b3b3b3","lx":0.03846153846153847,"color":"#ffffff","archHeight":1,"normal":[0,0,1],"frameWidth":0.2,"cz":-0.023809523809523808,"cx":0.22435897435897442,"lz":0.14285714285714285,"mullionColor":"#ffffff","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","locked":true},{"opacity":0.9,"cy":0.1,"normal":[0,0,1],"frameWidth":0.2,"id":"76oBAJjEY5VErwpM1BxmpH","parentId":"r7FDtsVF9isPsPhYMJtzMf","mullionSpacing":1,"lz":0.14285714285714285,"ly":0.3,"frame":true,"mullionColor":"#ffffff","cx":0.2820512820512821,"sillWidth":0,"lx":0.03846153846153847,"mullion":true,"uValue":2,"archHeight":1,"rotation":[0,0,0],"type":"Window","tint":"#b3b3b3","selected":false,"color":"#ffffff","shutter":{"color":"grey","showRight":false,"width":0.5,"showLeft":false},"windowType":"Default","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cz":-0.023809523809523808,"mullionWidth":0.05,"locked":true},{"archHeight":1,"ly":0.3,"mullionColor":"#ffffff","mullion":true,"selected":false,"mullionWidth":0.05,"sillWidth":0,"shutter":{"width":0.5,"showLeft":false,"showRight":false,"color":"grey"},"cx":0.33974358974358976,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","tint":"#b3b3b3","rotation":[0,0,0],"frameWidth":0.2,"type":"Window","color":"#ffffff","cy":0.1,"cz":-0.023809523809523808,"opacity":0.9,"parentId":"r7FDtsVF9isPsPhYMJtzMf","lx":0.03846153846153847,"lz":0.14285714285714285,"frame":true,"uValue":2,"id":"pPk6b2pTiBVzv3KLBQxRSg","windowType":"Default","mullionSpacing":1,"normal":[0,0,1],"locked":true},{"cy":0.1,"frame":true,"windowType":"Default","parentId":"r7FDtsVF9isPsPhYMJtzMf","sillWidth":0,"selected":false,"normal":[0,0,1],"archHeight":1,"mullionWidth":0.05,"shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"ly":0.3,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","type":"Window","rotation":[0,0,0],"lx":0.03846153846153847,"mullionSpacing":1,"tint":"#b3b3b3","color":"#ffffff","opacity":0.9,"lz":0.14285714285714285,"cz":-0.023809523809523808,"uValue":2,"mullionColor":"#ffffff","mullion":true,"id":"dDqdERBwZJGfHxCAxg8mQc","cx":0.3974358974358974,"frameWidth":0.2,"locked":true},{"sillWidth":0,"mullionWidth":0.05,"id":"g49obECC2D5AhNaQXqvDPp","frame":true,"mullionColor":"#ffffff","mullionSpacing":1,"lz":0.14285714285714285,"windowType":"Default","opacity":0.9,"normal":[0,0,1],"type":"Window","cx":0.10897435897435898,"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","lx":0.03846153846153847,"shutter":{"showLeft":false,"width":0.5,"color":"grey","showRight":false},"mullion":true,"cy":0.3,"color":"#ffffff","frameWidth":0.2,"archHeight":1,"uValue":2,"ly":0.3,"cz":0.2619047619047619,"selected":false,"tint":"#b3b3b3","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","locked":true},{"mullionSpacing":1,"color":"#ffffff","parentId":"r7FDtsVF9isPsPhYMJtzMf","frameWidth":0.2,"lx":0.03846153846153847,"type":"Window","rotation":[0,0,0],"lz":0.14285714285714285,"uValue":2,"frame":true,"id":"n8XDBwufcE9UWBEg19yPpi","opacity":0.9,"normal":[0,0,1],"mullionColor":"#ffffff","ly":0.3,"tint":"#b3b3b3","archHeight":1,"windowType":"Default","cy":0.1,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"cz":0.2619047619047619,"selected":false,"cx":0.16666666666666669,"mullion":true,"mullionWidth":0.05,"sillWidth":0,"locked":true},{"parentId":"r7FDtsVF9isPsPhYMJtzMf","color":"#ffffff","frame":true,"lx":0.03846153846153847,"normal":[0,0,1],"mullionWidth":0.05,"shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"mullion":true,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"cz":0.2619047619047619,"sillWidth":0,"cx":0.22435897435897442,"lz":0.14285714285714285,"archHeight":1,"type":"Window","cy":0.1,"mullionSpacing":1,"selected":false,"mullionColor":"#ffffff","rotation":[0,0,0],"ly":0.3,"windowType":"Default","tint":"#b3b3b3","id":"b5uBoVa6wo8VKkGWVcCau1","frameWidth":0.2,"opacity":0.9,"locked":true},{"color":"#ffffff","lx":0.03846153846153847,"cy":0.1,"type":"Window","opacity":0.9,"sillWidth":0,"frame":true,"mullionWidth":0.05,"selected":false,"rotation":[0,0,0],"id":"nwmp8tgXJE3t7ELMTsmseA","normal":[0,0,1],"windowType":"Default","lz":0.14285714285714285,"cx":0.2820512820512821,"shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"mullion":true,"ly":0.3,"tint":"#b3b3b3","frameWidth":0.2,"cz":0.2619047619047619,"archHeight":1,"mullionSpacing":1,"uValue":2,"parentId":"r7FDtsVF9isPsPhYMJtzMf","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","mullionColor":"#ffffff","locked":true},{"id":"72vvSwRX9xusD4gBvjme4x","rotation":[0,0,0],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.9,"frame":true,"windowType":"Default","mullionWidth":0.05,"cy":0.1,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"sillWidth":0,"normal":[0,0,1],"cz":0.2619047619047619,"archHeight":1,"frameWidth":0.2,"type":"Window","mullion":true,"tint":"#b3b3b3","uValue":2,"lx":0.03846153846153847,"selected":false,"color":"#ffffff","cx":0.33974358974358976,"ly":0.3,"lz":0.14285714285714285,"parentId":"r7FDtsVF9isPsPhYMJtzMf","mullionColor":"#ffffff","mullionSpacing":1,"locked":true},{"cy":0.1,"normal":[0,0,1],"tint":"#b3b3b3","frame":true,"frameWidth":0.2,"lz":0.14285714285714285,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","uValue":2,"sillWidth":0,"cx":0.3974358974358974,"type":"Window","archHeight":1,"windowType":"Default","lx":0.03846153846153847,"parentId":"r7FDtsVF9isPsPhYMJtzMf","mullionWidth":0.05,"id":"nfohs2Unqz45ioM4iNmfos","cz":0.2619047619047619,"mullionSpacing":1,"mullion":true,"selected":false,"ly":0.3,"mullionColor":"#ffffff","opacity":0.9,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"color":"#ffffff","rotation":[0,0,0],"locked":true},{"lz":0.75,"type":"Window","uValue":2,"frameWidth":0.2,"shutter":{"showRight":false,"showLeft":false,"width":0.5,"color":"grey"},"windowType":"Default","frame":true,"mullionColor":"#ffffff","rotation":[0,0,0],"selected":false,"cy":0.3,"foundationId":"hLsewK7zX5Mau5SErFyCiz","opacity":0.5,"lx":0.22222222222222213,"mullionWidth":0.06,"ly":0.3,"tint":"#0062b1","mullionSpacing":5,"id":"nCv1Ny793c5HrEnfGj93XH","archHeight":1,"cx":-8.635067969306777e-17,"sillWidth":0,"normal":[0,0,1],"mullion":true,"cz":-0.041666666666666664,"color":"#ffffff","parentId":"kFKM2qRJFmWx323z2hBCra","locked":true},{"opacity":0.5,"sillWidth":0,"uValue":2,"tint":"#0062b1","ly":0.3,"type":"Window","cy":0.3,"cz":-0.041666666666666664,"foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","frame":true,"windowType":"Default","archHeight":1,"mullionWidth":0.06,"lz":0.75,"cx":-8.635067969306777e-17,"mullionColor":"#ffffff","rotation":[0,0,0],"id":"5HaXS5141hpZmmNQTR28pq","color":"#ffffff","mullionSpacing":5,"frameWidth":0.2,"mullion":true,"lx":0.22222222222222213,"normal":[0,0,1],"shutter":{"color":"grey","showRight":false,"showLeft":false,"width":0.5},"parentId":"16SbPgFqDMyVbV8UtDHAYk","selected":false,"locked":true},{"windowType":"Default","rotation":[0,0,0],"frame":true,"lz":0.75,"ly":0.3,"cy":0.3,"mullionColor":"#ffffff","opacity":0.5,"id":"rkqdUY1fH4ETNHTSNuscn1","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","color":"#ffffff","cx":0.01053672324504819,"mullionWidth":0.06,"sillWidth":0,"selected":false,"frameWidth":0.2,"mullion":true,"normal":[0,0,1],"shutter":{"width":0.5,"color":"grey","showRight":false,"showLeft":false},"tint":"#0062b1","cz":-0.041666666666666664,"uValue":2,"parentId":"iVn6mF9eoYKrYt3EzDy2TC","type":"Window","archHeight":1,"lx":0.22222222222222213,"mullionSpacing":5,"locked":true},{"doorType":"Default","rotation":[0,0,0],"frameColor":"#ffffff","id":"nCMdK2uZjAQvbd9xNjWLHp","filled":true,"cz":-0.33695652173913043,"type":"Door","ly":0,"lz":0.32608695652173914,"normal":[0,0,1],"lx":0.053846153846153856,"opacity":0.5,"archHeight":1,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","selected":false,"textureType":"Door Texture Default","cx":0.012820512820512824,"color":"#009ce0","uValue":1,"cy":0,"locked":true},{"type":"Human","rotation":[0,0,0],"lz":1.8,"selected":false,"cy":-0.1500000059604638,"name":"Jack","cz":0.30360914351979496,"normal":[0,1,0],"id":"3ZDfWfiHz4RyG9jjRaKJMd","parentId":"4ahnYxjJA1TN7cwGSyLftT","lx":0.42,"cx":-3.810198255647766,"locked":true},{"selected":false,"parentId":"u7vgLv3TfTJ9G6m9VRJXKE","rotation":[0,0,0],"id":"kNqFk1V3FLs1ySbp9WvM5C","cx":0.5509936852391848,"lx":0.48,"lz":1.6,"cz":0.6000000238418579,"type":"Human","normal":[0,1,0],"cy":-1.9056488848059487,"name":"Jade","locked":true},{"type":"Human","selected":false,"name":"James","normal":[0,1,0],"cx":13.796503677890236,"lx":0.472,"cy":-14.701093907978901,"cz":0,"rotation":[0,0,0],"lz":1.75,"parentId":"Ground","id":"hEkECi6wTCQNNwcMymHKtW","locked":true},{"normal":[0,1,0],"cz":0,"name":"Jacqueline","lz":1.78,"lx":0.43,"parentId":"Ground","id":"jkiLfuhPDQMUuLpfWnf96a","rotation":[0,0,0],"cx":14.379527131239326,"type":"Human","cy":-14.104111051733407,"selected":false,"locked":true},{"uValue":2,"ly":0.3,"cy":0.3,"cz":-0.44989648033126295,"lineColor":"#000000","mullionWidth":0.1,"archHeight":1,"mullion":true,"mullionColor":"#ffffff","parentId":"jE7DwieCwvfvkHcN1Bkpu2","lx":0.025641025641025647,"sillWidth":0,"selected":false,"opacity":0.5,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","windowType":"Default","cx":-0.3974358974358975,"id":"ey7NEkHJkJr31HLTbvLk1h","frame":true,"normal":[0,-1,0],"lineWidth":0.2,"showLabel":false,"lz":0.047619047619047616,"tint":"#b3b3b3","mullionSpacing":1.25,"rotation":[0,0,0],"frameWidth":0.05,"color":"#ffffff","type":"Window","shutter":{"showRight":false,"color":"grey","showLeft":false,"width":0.5},"locked":true},{"windowType":"Default","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cz":-0.44989648033126295,"cx":-0.3205128205128206,"cy":0.3,"uValue":2,"shutter":{"showRight":false,"color":"grey","width":0.5,"showLeft":false},"type":"Window","sillWidth":0,"mullionWidth":0.1,"mullionColor":"#ffffff","archHeight":1,"frame":true,"ly":0.3,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","opacity":0.5,"tint":"#b3b3b3","rotation":[0,0,0],"lx":0.025641025641025647,"frameWidth":0.05,"mullionSpacing":1.25,"selected":false,"color":"#ffffff","normal":[0,-1,0],"mullion":true,"lz":0.047619047619047616,"id":"tBwi3AxHXayUK8gVkMaxbE","locked":true},{"opacity":0.5,"mullionWidth":0.1,"type":"Window","normal":[0,-1,0],"archHeight":1,"lz":0.047619047619047616,"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cz":-0.44989648033126295,"lx":0.025641025641025647,"frame":true,"shutter":{"width":0.5,"showRight":false,"color":"grey","showLeft":false},"uValue":2,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","rotation":[0,0,0],"mullionSpacing":1.25,"ly":0.3,"frameWidth":0.05,"tint":"#b3b3b3","cx":-0.25641025641025644,"cy":0.3,"sillWidth":0,"selected":false,"id":"aaeq11aoNBxT8ngMjW1MD1","windowType":"Default","mullion":true,"color":"#ffffff","mullionColor":"#ffffff","locked":true},{"mullionColor":"#ffffff","lz":0.047619047619047616,"cx":-0.19230769230769235,"uValue":2,"sillWidth":0,"id":"tQRNuUci7nDK7JtFR1J9hs","opacity":0.5,"mullion":true,"cz":-0.44989648033126295,"windowType":"Default","lx":0.025641025641025647,"selected":false,"color":"#ffffff","shutter":{"showRight":false,"width":0.5,"color":"grey","showLeft":false},"parentId":"jE7DwieCwvfvkHcN1Bkpu2","archHeight":1,"tint":"#b3b3b3","frameWidth":0.05,"type":"Window","rotation":[0,0,0],"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","ly":0.3,"frame":true,"normal":[0,-1,0],"mullionWidth":0.1,"cy":0.3,"mullionSpacing":1.25,"locked":true},{"mullionWidth":0.15,"lz":0.2260869565217391,"lx":0.12564102564102567,"uValue":2,"shutter":{"width":0.5,"color":"grey","showLeft":false,"showRight":false},"sillWidth":0,"lineColor":"#000000","cy":0.3,"showLabel":false,"mullionSpacing":1.75,"lineWidth":0.2,"selected":false,"color":"#ffffff","ly":0.3,"windowType":"Default","type":"Window","tint":"#009ce0","frame":false,"cz":-0.28695652173913044,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","cx":-0.07820512820512822,"mullionColor":"#ffffff","archHeight":1,"opacity":0.5,"rotation":[0,0,0],"mullion":true,"normal":[0,-1,0],"frameWidth":0.1,"id":"noDtXCs5Fto2dPjMS4sHTG","locked":true},{"foundationId":"2XGmuwQrQtDPGFB7FUq4gK","opacity":0.5,"id":"32Mm6Utbug2woUysRGXDB7","frameWidth":0.1,"mullionWidth":0.15,"parentId":"jE7DwieCwvfvkHcN1Bkpu2","shutter":{"width":0.5,"color":"grey","showLeft":false,"showRight":false},"mullion":true,"mullionColor":"#ffffff","type":"Window","frame":false,"selected":false,"windowType":"Default","cy":0.3,"ly":0.3,"normal":[0,0,1],"cz":-0.29130434782608694,"tint":"#009ce0","color":"#ffffff","lx":0.1230769230769231,"rotation":[0,0,0],"uValue":2,"cx":0.10256410256410259,"archHeight":1,"sillWidth":0,"mullionSpacing":1.75,"lz":0.21739130434782608,"locked":true},{"lineColor":"#e9d8ba","color":"#e9d8ba","cz":0,"ly":0.4,"parentType":"Wall","vertices":[{"x":-0.5007532349973239,"y":-0.44799999999999995},{"x":-0.5007532349973239,"y":-0.376},{"y":-0.376,"x":0.5007532349973239},{"y":-0.44,"x":0.5007532349973239}],"id":"aJWE2MtRWkR9GDyeWR1Gxe","filled":true,"selected":false,"cy":-0.4400430854049809,"type":"Polygon","selectedIndex":0,"normal":[0,0,1],"lx":0.4,"lz":0.4,"cx":0.15819596410925735,"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","parentId":"1G9FW32uCMUYbXB7bybpze","noOutline":true,"rotation":[0,0,0],"locked":true},{"filled":true,"ly":0.4,"cz":0,"cy":0,"vertices":[{"x":-0.5001466885671803,"y":-0.44},{"y":-0.376,"x":-0.5001466885671803},{"y":-0.376,"x":0.4601349534818058},{"y":-0.44,"x":0.5001466885671803}],"lx":0.4,"noOutline":true,"cx":0,"parentId":"9ULQ17PCkbiQTAk5KCBQqS","type":"Polygon","id":"cAXqDBJufU2L5v4YCuvU4k","color":"#e9d8ba","lz":0.4,"selected":false,"selectedIndex":3,"parentType":"Wall","lineColor":"#e9d8ba","rotation":[0,0,0],"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","normal":[0,0,1],"locked":true},{"selected":false,"opacity":0,"text":"YENISEHIR BELEDIYESI BILIM SANAT MERKEZI","noOutline":true,"cy":0,"fontColor":"gold","cz":0,"normal":[0,0,1],"cx":0,"rotation":[0,0,0],"foundationId":"uj4Qq2BojpeyU8mLo7xk7N","color":"#ffffff","selectedIndex":3,"lx":0.4,"type":"Polygon","ly":0.4,"fontSize":0.5,"filled":true,"parentType":"Wall","parentId":"1G9FW32uCMUYbXB7bybpze","vertices":[{"x":-0.47819624166517993,"y":0.14},{"x":-0.47819624166517993,"y":0.18000000000000002},{"y":0.18000000000000002,"x":0.47561944404400847},{"x":0.47561944404400847,"y":0.14}],"id":"ddNUh9NWyq7jo9Hii6cxUy","lz":0.4,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["vEPKSnunpPsGKUDNJaGnTR","iYLfpK8sAzBxMk4mz1BXiS","joaXtauLNr5aPP2tqqpryi","1QnZb7zSPuvyzTVeC8AkVL"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"j3n8P4y4kG4w4nSZiAf6rj","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","id":"9wUwTaeJ4rHLbRCsFJ3NXZ","locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["16SbPgFqDMyVbV8UtDHAYk","kmaifBj79SDvw8jCqEakPi","dMQfydvLoQmsUVh8GcfQWg","3WQQwDXPDfYCATy53ts83F"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"x4oU2GYmkiSMe4Z8gg6K3C","foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","id":"q8ctEFdUTArcnVXRSQ323h","locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["tJ6f61zEL1oQGpeeCnFH2S","sCZzaqpAQeUmKwng1WHaCF","gZiomgVxY3vk4YfQ9Jjh6B","eZza9yCuyFywaPPzJVe5tY"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"o2WibZi2fR7HySSdFgPoda","foundationId":"o2WibZi2fR7HySSdFgPoda","id":"rdXcWwV3c9y2W6N9aNo82Z","locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["5KcXyJ1kNDvp5rTZsShAbX","i7SnyGKg3wpYfMg2Ck4kpZ","gv3LzTTefsaZrtK8Lzx2bM","kFKM2qRJFmWx323z2hBCra"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"hLsewK7zX5Mau5SErFyCiz","foundationId":"hLsewK7zX5Mau5SErFyCiz","id":"3gdGvLfCvyTnvdRCWnC9h9","locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.05,"rValue":2,"color":"#73d8ff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["eTsfM9k5RPHprx93KkShya","aMAoC9G4MpUPGJVmt36yfP","u1GLQPod2yRsFy4dWHVdVa","iVn6mF9eoYKrYt3EzDy2TC"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"oGfdqtfZrLhGvZskoNeDFJ","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","id":"ips8v5W6dhiA81cAxrdErd","locked":true},{"type":"Foundation","cx":2.2717235438998022,"cy":-13.70952380378541,"cz":0.05,"lx":0.7913071632562995,"ly":6.7897393900555105,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.7770205829878756],"parentId":"Ground","selected":false,"color":"#808080","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"mjxy5YL3EoKusPrE4miGfp","notBuilding":true,"locked":true},{"type":"Wall","cx":-0.20459827817487655,"cy":-1.7122028473101976,"cz":0,"lx":1.6908062651709903,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"relativeAngle":-1.5707963267948972,"leftPoint":[-0.20459827817487616,-0.8667997147247025,0],"rightPoint":[-0.20459827817487694,-2.5576059798956927,0],"leftJoints":["9LP2kDJGn2neiYDzDX66JW"],"rightJoints":["kVBpA22r7rMwMak56bdzNG"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"kAomEduDnbZXe9fMR2J4vS","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vX75xVcns2UiTk795WQxu9","leftRoofHeight":1.4200281664406509,"rightRoofHeight":0.8626045741320808,"centerRoofHeight":[-0.5,1.9880394330169113],"locked":true},{"type":"Wall","cx":0.011903976174146291,"cy":-2.5576059798956923,"cz":1.5186399018658703,"lx":0.43300450869804646,"ly":0.3,"lz":0.8626045741320808,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.0372798037317406,"rightTopPartialHeight":3.0372798037317406,"relativeAngle":3.0767985154612743e-15,"leftPoint":[-0.20459827817487694,-2.5576059798956927,0],"rightPoint":[0.22840623052316952,-2.5576059798956914,0],"leftJoints":["kAomEduDnbZXe9fMR2J4vS"],"rightJoints":["xrMk4ZTC1gwLZELF3Hm4PW"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"kVBpA22r7rMwMak56bdzNG","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vX75xVcns2UiTk795WQxu9","leftRoofHeight":0.8626045741320808,"rightRoofHeight":0.8626045741320808,"locked":true},{"type":"Wall","cx":0.22840623052316894,"cy":-1.7122028473101973,"cz":0,"lx":1.690806265170988,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"relativeAngle":1.5707963267948974,"leftPoint":[0.22840623052316952,-2.5576059798956914,0],"rightPoint":[0.22840623052316833,-0.8667997147247033,0],"leftJoints":["kVBpA22r7rMwMak56bdzNG"],"rightJoints":["9LP2kDJGn2neiYDzDX66JW"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"xrMk4ZTC1gwLZELF3Hm4PW","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vX75xVcns2UiTk795WQxu9","leftRoofHeight":0.8626045741320808,"rightRoofHeight":1.4200281664406509,"centerRoofHeight":[0.5,1.9880394330169113],"locked":true},{"type":"Wall","cx":0.011903976174146083,"cy":-0.8667997147247029,"cz":0,"lx":0.4330045086980445,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"relativeAngle":3.1415926535897913,"leftPoint":[0.22840623052316833,-0.8667997147247033,0],"rightPoint":[-0.20459827817487616,-0.8667997147247025,0],"leftJoints":["xrMk4ZTC1gwLZELF3Hm4PW"],"rightJoints":["kAomEduDnbZXe9fMR2J4vS"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"9LP2kDJGn2neiYDzDX66JW","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"vX75xVcns2UiTk795WQxu9","leftRoofHeight":1.9880394330169113,"rightRoofHeight":1.9880394330169113,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.5680112665762603,"thickness":0.1,"rValue":2,"color":"#ffffff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Gable","roofStructure":"Default","wallsId":["kVBpA22r7rMwMak56bdzNG"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"vX75xVcns2UiTk795WQxu9","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"locked":true},{"type":"Wall","cx":-0.20459827817487508,"cy":1.0250055239867875,"cz":0,"lx":3.7836104774229744,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"relativeAngle":-1.5707963267948963,"leftPoint":[-0.20459827817487566,2.9168107626982747,0],"rightPoint":[-0.20459827817487453,-0.8667997147247,0],"leftJoints":["hb7Tux4vCn6v5A6JnAifhr"],"rightJoints":["ji3RWSoHzqrqxaW2CNta4W"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"wwL7bfAKTRXceXoVXbnQe9","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"sFQv2f1u7oD1ozyFQA6CvB","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"locked":true},{"type":"Wall","cx":-0.005847552410961521,"cy":2.9252948707181776,"cz":0,"lx":0.3978634493419871,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"relativeAngle":-3.09893137333499,"leftPoint":[0.19290317335295262,2.93377897873808,0],"rightPoint":[-0.20459827817487566,2.9168107626982747,0],"leftJoints":["33r7faucqj1HNFffUsMqbr"],"rightJoints":["wwL7bfAKTRXceXoVXbnQe9"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"hb7Tux4vCn6v5A6JnAifhr","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"sFQv2f1u7oD1ozyFQA6CvB","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"locked":true},{"type":"Wall","cx":0.21065470193806246,"cy":1.0334896320066904,"cz":0,"lx":3.800744515522147,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"relativeAngle":1.580137542273405,"leftPoint":[0.22840623052317233,-0.8667997147246993,0],"rightPoint":[0.19290317335295262,2.93377897873808,0],"leftJoints":["ji3RWSoHzqrqxaW2CNta4W"],"rightJoints":["hb7Tux4vCn6v5A6JnAifhr"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"33r7faucqj1HNFffUsMqbr","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"sFQv2f1u7oD1ozyFQA6CvB","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"locked":true},{"type":"Wall","cx":0.011903976174146083,"cy":-0.8667997147247029,"cz":0,"lx":0.4330045086980445,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"relativeAngle":-1.7947991340190846e-15,"leftPoint":[-0.20459827817487616,-0.8667997147247025,0],"rightPoint":[0.22840623052316833,-0.8667997147247033,0],"leftJoints":["wwL7bfAKTRXceXoVXbnQe9"],"rightJoints":["33r7faucqj1HNFffUsMqbr"],"textureType":"No Wall Texture","color":"#e9d8ba","volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"#ffffff","opacity":0.5,"selected":false,"lineWidth":0.2,"lineColor":"#000000","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"ji3RWSoHzqrqxaW2CNta4W","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","unfilledHeight":0.5,"roofId":"sFQv2f1u7oD1ozyFQA6CvB","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"thickness":0.1,"rValue":2,"color":"#ffffff","sideColor":"#ffffff","textureType":"No Roof Texture","roofType":"Pyramid","roofStructure":"Default","wallsId":["ji3RWSoHzqrqxaW2CNta4W","33r7faucqj1HNFffUsMqbr","hb7Tux4vCn6v5A6JnAifhr","wwL7bfAKTRXceXoVXbnQe9"],"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mjxy5YL3EoKusPrE4miGfp","foundationId":"mjxy5YL3EoKusPrE4miGfp","id":"sFQv2f1u7oD1ozyFQA6CvB","locked":true},{"type":"Wall","cx":-0.20459827817487655,"cy":-1.7122028473101976,"cz":0,"lx":1.6908062651709903,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"leftJoints":["kQgqBbuoJMHBFT8g1JN1tC"],"rightJoints":["3c6cWYJDLKfbWoov8rSetU"],"leftPoint":[-0.20459827817487616,-0.8667997147247025,0],"rightPoint":[-0.20459827817487694,-2.5576059798956927,0],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"hQDTYviozPxCLRiuoq8YbP","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bi1wbzAS6GmbpEfuCH6pB4","leftRoofHeight":1.4200281664406509,"rightRoofHeight":0.8626045741320808,"centerRoofHeight":[-0.5,1.9880394330169113],"selected":false,"locked":true},{"type":"Wall","cx":0.011903976174146291,"cy":-2.5576059798956923,"cz":1.5186399018658703,"lx":0.43300450869804646,"ly":0.3,"lz":0.8626045741320808,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.0372798037317406,"rightTopPartialHeight":3.0372798037317406,"leftJoints":["hQDTYviozPxCLRiuoq8YbP"],"rightJoints":["3SCoUPNSFfffHGPmvk8DUC"],"leftPoint":[-0.20459827817487694,-2.5576059798956927,0],"rightPoint":[0.22840623052316952,-2.5576059798956914,0],"relativeAngle":3.0767985154612743e-15,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"3c6cWYJDLKfbWoov8rSetU","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bi1wbzAS6GmbpEfuCH6pB4","leftRoofHeight":0.8626045741320808,"rightRoofHeight":0.8626045741320808,"selected":false,"locked":true},{"type":"Wall","cx":0.22840623052316894,"cy":-1.7122028473101973,"cz":0,"lx":1.690806265170988,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"leftJoints":["3c6cWYJDLKfbWoov8rSetU"],"rightJoints":["kQgqBbuoJMHBFT8g1JN1tC"],"leftPoint":[0.22840623052316952,-2.5576059798956914,0],"rightPoint":[0.22840623052316833,-0.8667997147247033,0],"relativeAngle":1.5707963267948974,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"3SCoUPNSFfffHGPmvk8DUC","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bi1wbzAS6GmbpEfuCH6pB4","leftRoofHeight":0.8626045741320808,"rightRoofHeight":1.4200281664406509,"centerRoofHeight":[0.5,1.9880394330169113],"selected":false,"locked":true},{"type":"Wall","cx":0.011903976174146083,"cy":-0.8667997147247029,"cz":0,"lx":0.4330045086980445,"ly":0.3,"lz":1.4200281664406509,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.5,"rightTopPartialHeight":4.5,"leftJoints":["3SCoUPNSFfffHGPmvk8DUC"],"rightJoints":["hQDTYviozPxCLRiuoq8YbP"],"leftPoint":[0.22840623052316833,-0.8667997147247033,0],"rightPoint":[-0.20459827817487616,-0.8667997147247025,0],"relativeAngle":3.1415926535897913,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"kQgqBbuoJMHBFT8g1JN1tC","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"bi1wbzAS6GmbpEfuCH6pB4","leftRoofHeight":1.9880394330169113,"rightRoofHeight":1.9880394330169113,"selected":false,"locked":true},{"id":"bi1wbzAS6GmbpEfuCH6pB4","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0.5680112665762603,"color":"#ffffff","rValue":2,"ceilingRValue":2,"sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["3c6cWYJDLKfbWoov8rSetU"],"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"selected":false,"locked":true},{"type":"Wall","cx":-0.20459827817487508,"cy":1.0250055239867875,"cz":0,"lx":3.7836104774229744,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"leftJoints":["oo7zYTZq5M8KXcmw8fK7tD"],"rightJoints":["ij5SdFExjnoBJBDeaF2ioW"],"leftPoint":[-0.20459827817487566,2.9168107626982747,0],"rightPoint":[-0.20459827817487453,-0.8667997147247,0],"relativeAngle":-1.5707963267948963,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"uizhgrZpeyc2KYB1TvZ5Nf","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8m9Vi16SPU3YiAzGyrbieq","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"selected":false,"locked":true},{"type":"Wall","cx":-0.005847552410961521,"cy":2.9252948707181776,"cz":0,"lx":0.3978634493419871,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"leftJoints":["mgWkbY4DegHxFAvRa9Bw4F"],"rightJoints":["uizhgrZpeyc2KYB1TvZ5Nf"],"leftPoint":[0.19290317335295262,2.93377897873808,0],"rightPoint":[-0.20459827817487566,2.9168107626982747,0],"relativeAngle":-3.09893137333499,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"oo7zYTZq5M8KXcmw8fK7tD","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8m9Vi16SPU3YiAzGyrbieq","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"selected":false,"locked":true},{"type":"Wall","cx":0.21065470193806246,"cy":1.0334896320066904,"cz":0,"lx":3.800744515522147,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"leftJoints":["ij5SdFExjnoBJBDeaF2ioW"],"rightJoints":["oo7zYTZq5M8KXcmw8fK7tD"],"leftPoint":[0.22840623052317233,-0.8667997147246993,0],"rightPoint":[0.19290317335295262,2.93377897873808,0],"relativeAngle":1.580137542273405,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"mgWkbY4DegHxFAvRa9Bw4F","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8m9Vi16SPU3YiAzGyrbieq","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"selected":false,"locked":true},{"type":"Wall","cx":0.011903976174146083,"cy":-0.8667997147247029,"cz":0,"lx":0.4330045086980445,"ly":0.3,"lz":2.0107598836799614,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"eavesLength":0.02,"rValue":2,"volumetricHeatCapacity":0.5,"fill":"Full","leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.379293249110431,"rightTopPartialHeight":4.379293249110431,"leftJoints":["uizhgrZpeyc2KYB1TvZ5Nf"],"rightJoints":["mgWkbY4DegHxFAvRa9Bw4F"],"leftPoint":[-0.20459827817487616,-0.8667997147247025,0],"rightPoint":[0.22840623052316833,-0.8667997147247033,0],"relativeAngle":-1.7947991340190846e-15,"textureType":"No Wall Texture","color":"#e9d8ba","normal":[0,0,1],"rotation":[0,0,0],"id":"ij5SdFExjnoBJBDeaF2ioW","parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"8m9Vi16SPU3YiAzGyrbieq","leftRoofHeight":2.0107598836799614,"rightRoofHeight":2.0107598836799614,"selected":false,"locked":true},{"id":"8m9Vi16SPU3YiAzGyrbieq","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":false,"rise":0,"color":"#ffffff","rValue":2,"ceilingRValue":2,"sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"qRkMdipDNgMrnuysUddPgu","foundationId":"qRkMdipDNgMrnuysUddPgu","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["ij5SdFExjnoBJBDeaF2ioW","mgWkbY4DegHxFAvRa9Bw4F","oo7zYTZq5M8KXcmw8fK7tD","uizhgrZpeyc2KYB1TvZ5Nf"],"selected":false,"locked":true},{"type":"Foundation","cx":11.311392901943481,"cy":-4.7142040538495555,"cz":0.05,"lx":0.7913071632562995,"ly":6.7897393900555105,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.7770205829878756],"parentId":"Ground","color":"#808080","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"rValue":2,"id":"qRkMdipDNgMrnuysUddPgu","selected":false,"notBuilding":true,"locked":true},{"type":"Door","cx":-0.11315789473684208,"cy":0,"cz":-0.06153846153846153,"lx":0.6894736842105263,"ly":0,"lz":0.8769230769230769,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"joaXtauLNr5aPP2tqqpryi","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","id":"keZr7qBSZM6JD1wUNN3RrV","interior":true,"locked":true},{"type":"Door","cx":0.12368421052631581,"cy":0,"cz":-0.06538461538461539,"lx":0.668421052631579,"ly":0,"lz":0.8692307692307693,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"kmaifBj79SDvw8jCqEakPi","foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","id":"vp6vHpvNfTH54o1tThWij3","interior":true,"locked":true},{"type":"Door","cx":-0.2611111111111111,"cy":0,"cz":-0.030769230769230764,"lx":0.3000000000000001,"ly":0,"lz":0.9384615384615385,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dMQfydvLoQmsUVh8GcfQWg","foundationId":"x4oU2GYmkiSMe4Z8gg6K3C","id":"b4ReFVnndEjjEwadJrJfnm","interior":true,"locked":true},{"type":"Door","cx":0.2277777777777778,"cy":0,"cz":-0.03461538461538463,"lx":0.3666666666666666,"ly":0,"lz":0.9307692307692308,"doorType":"Default","filled":false,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iYLfpK8sAzBxMk4mz1BXiS","foundationId":"j3n8P4y4kG4w4nSZiAf6rj","id":"wa145FYVqDahTu1KJYV3LK","interior":true,"locked":true},{"type":"Door","cx":0.12368421052631574,"cy":0,"cz":-0.06538461538461539,"lx":0.6684210526315789,"ly":0,"lz":0.8692307692307693,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"sCZzaqpAQeUmKwng1WHaCF","foundationId":"o2WibZi2fR7HySSdFgPoda","id":"1r7udrYyCT7hkUCv5siuDw","locked":true},{"type":"Door","cx":-0.12368421052631574,"cy":0,"cz":-0.06538461538461539,"lx":0.6684210526315789,"ly":0,"lz":0.8692307692307693,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gv3LzTTefsaZrtK8Lzx2bM","foundationId":"hLsewK7zX5Mau5SErFyCiz","id":"vASnwHDvzPR9avU565RVbd","locked":true},{"type":"Door","cx":0.26111111111111107,"cy":0,"cz":-0.042307692307692296,"lx":0.29999999999999993,"ly":0,"lz":0.9153846153846155,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"i7SnyGKg3wpYfMg2Ck4kpZ","foundationId":"hLsewK7zX5Mau5SErFyCiz","id":"ewo4SkBBdDL4Dgy9tWDw9P","locked":true},{"type":"Door","cx":-0.26111111111111107,"cy":0,"cz":-0.042307692307692296,"lx":0.2999999999999998,"ly":0,"lz":0.9153846153846155,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"gZiomgVxY3vk4YfQ9Jjh6B","foundationId":"o2WibZi2fR7HySSdFgPoda","id":"7HwzJtGpVjcSG4pVEZX7yq","locked":true},{"type":"Door","cx":-0.10744643820625929,"cy":0,"cz":-0.06153846153846153,"lx":0.6583928464374896,"ly":0,"lz":0.8769230769230769,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"u1GLQPod2yRsFy4dWHVdVa","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","id":"kmWJjPpjeytKavWK96TyyH","locked":true},{"type":"Door","cx":4.4664000438593557e-17,"cy":0,"cz":-0.038461538461538464,"lx":0.8390809794142997,"ly":0,"lz":0.9230769230769231,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"aMAoC9G4MpUPGJVmt36yfP","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","id":"hMEcTxQ4NT4QbuYeBXMCEV","locked":true},{"type":"Door","cx":0.13912500749375725,"cy":0,"cz":-0.06153846153846153,"lx":0.5950357078624938,"ly":0,"lz":0.8769230769230769,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"eTsfM9k5RPHprx93KkShya","foundationId":"oGfdqtfZrLhGvZskoNeDFJ","id":"vbLxh8TTREuj8zv66LqoAM","locked":true},{"type":"Door","cx":-0.2823529411764706,"cy":0,"cz":-0.010869565217391304,"lx":0.38823529411764707,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"vqP69iA4TuZd8ZEvPBLjzU","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"vbUoZmBsuZRXzK6QXsDYtV","locked":true},{"type":"Door","cx":0.2823529411764706,"cy":0,"cz":-0.010869565217391304,"lx":0.38823529411764707,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"vqP69iA4TuZd8ZEvPBLjzU","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"fknzp5TF4y6Z2JezdMmUnw","locked":true},{"type":"Door","cx":-0.46282051282051284,"cy":0,"cz":-0.004347826086956506,"lx":0.053846153846153884,"ly":0,"lz":0.991304347826087,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"62KCpUdkhCRr3ExkPE3Sd1","locked":true},{"type":"Door","cx":0.458974358974359,"cy":0,"cz":-0.004347826086956506,"lx":0.061538461538461424,"ly":0,"lz":0.991304347826087,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"oHCJ27NVx4XbdXZVcpvNo5","locked":true},{"type":"Door","cx":-0.4615384615384616,"cy":0,"cz":-0.004347826086956506,"lx":0.056410256410256404,"ly":0,"lz":0.991304347826087,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"jE7DwieCwvfvkHcN1Bkpu2","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"3deR2pFWoANWBbeogtfdY4","locked":true},{"type":"Door","cx":0.2823529411764706,"cy":0,"cz":-0.0017278291556811246,"lx":0.3882352941176471,"ly":0,"lz":0.9965443416886377,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6bfpYPQw2M5RbKRsLfDauC","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"nAw5K9QrWgALjVNPKgbC1o","locked":true},{"type":"Door","cx":-0.2823529411764706,"cy":0,"cz":-0.010869565217391304,"lx":0.3882352941176471,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6bfpYPQw2M5RbKRsLfDauC","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"kNSEPx2oK4SSg7KeM6Ty8x","locked":true},{"type":"Door","cx":0.46282051282051284,"cy":0,"cz":-0.010869565217391304,"lx":0.053846153846153884,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"5UP5zCx3iEA1h5gxGrabow","locked":true},{"type":"Door","cx":0.00641025641025641,"cy":0,"cz":-0.010869565217391304,"lx":0.11538461538461539,"ly":0,"lz":0.9782608695652174,"doorType":"Default","filled":false,"interior":true,"archHeight":1,"textureType":"Door Texture Default","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"r7FDtsVF9isPsPhYMJtzMf","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"nd9aBdZVvLyLxm6LSWmReW","locked":true},{"type":"Window","cx":19.271100620021265,"cy":-4.54768812158822,"cz":12.260904466364499,"lx":2.748705948983199,"ly":0.2,"lz":6.901186917106701,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.14952541119872453,0,2.220446049250313e-16],"parentId":"byzwW7Db61R9EfVcvoWVQ9","parentType":"Roof","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"5kDW9Ug8bkdf5i9qjLd7bj","locked":true},{"type":"Window","cx":19.227858803067697,"cy":4.981211897402677,"cz":12.264615427486488,"lx":2.8786302292092456,"ly":0.2,"lz":6.844179828287683,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":false,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.14952541119872476,0,3.141592653589793],"parentId":"byzwW7Db61R9EfVcvoWVQ9","parentType":"Roof","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"oxL6YVVCiXau1r4WQuSjxn","locked":true},{"type":"Window","cx":-17.18252886122661,"cy":-4.622268332707515,"cz":12.249668970719181,"lx":2.2316030028692726,"ly":0.2,"lz":6.893564122242849,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.14952541119872476,0,2.220446049250313e-16],"parentId":"byzwW7Db61R9EfVcvoWVQ9","parentType":"Roof","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"rqUXFDFwX2z3bbGtXfBcfd","locked":true},{"type":"Window","cx":-17.11075110661269,"cy":5.168142143612845,"cz":12.236454418879077,"lx":2.3271871087906195,"ly":0.2,"lz":6.844860410467514,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"sillWidth":0,"windowType":"Default","empty":true,"interior":true,"archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"uValue":2,"normal":[0,-1,0],"rotation":[0.1495254111987243,0,3.1415926535897936],"parentId":"byzwW7Db61R9EfVcvoWVQ9","parentType":"Roof","foundationId":"2XGmuwQrQtDPGFB7FUq4gK","id":"qAswaYhvWDiHawY6iYvLWG","locked":true}],"sceneRadius":90,"view":{"yearlyLightSensorPanelRect":{"height":500,"width":600,"x":0,"y":0},"showYearlyParabolicDishYieldPanel":false,"showDesignInfoPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"showInstructionPanel":true,"dailyParabolicTroughYieldPanelRect":{"height":400,"x":0,"width":600,"y":0},"dailyPvYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"yearlyLightSensorPanelShowDaylight":false,"cameraPosition":[28.761610676892403,-33.63667545263391,8.036616917846569],"yearlyPvYieldPanelX":0,"showDailyHeliostatYieldPanel":false,"solarRadiationHeatMapMaxValue":3,"showDailyPvYieldPanel":false,"showSunAngles":false,"yearlyParabolicDishYieldPanelY":0,"showYearlyPvYieldPanel":false,"yearlyParabolicDishYieldPanelRect":{"width":600,"y":0,"height":400,"x":0},"mapZoom":19,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"yearlyPvYieldPanelY":0,"dailyHeliostatYieldPanelY":0,"showYearlyBuildingEnergyPanel":false,"mapWeatherStations":false,"stickyNotePanelX":0,"dailyPvYieldPanelY":0,"dailyFresnelReflectorYieldPanelY":0,"yearlyHeliostatYieldPanelX":0,"cameraZoom":18.050000000000008,"yearlyParabolicTroughYieldPanelY":0,"yearlyPvYieldPanelRect":{"width":600,"height":400,"x":0,"y":0},"theme":"Default","dailyLightSensorPanelRect":{"height":360,"y":0,"width":600,"x":0},"dailyFresnelReflectorYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"heatFluxColor":"gray","showYearlyFresnelReflectorYieldPanel":false,"solarPanelShininess":100,"mapType":"roadmap","yearlyParabolicTroughYieldPanelX":0,"cameraPosition2D":[9.356963094823977,-6.143696261834446,150],"showDailyLightSensorPanel":false,"weatherPanelX":0,"yearlyFresnelReflectorYieldPanelX":0,"visibilityResultsPanelRect":{"x":0,"height":470,"y":0,"width":600},"showDailyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelRect":{"width":600,"height":400,"y":0,"x":0},"showHeliodonPanel":false,"windowShininess":200,"yearlyLightSensorPanelY":0,"dailyParabolicDishYieldPanelY":0,"panCenter2D":[9.356963094823977,-6.142695884375581,-0.000007053447453632921],"dailyHeliostatYieldPanelX":0,"showWeatherPanel":false,"heliodonPanelY":0,"yearlyParabolicDishYieldPanelX":0,"mapPanelX":0,"dailyPvYieldPanelX":0,"weatherPanelY":0,"showMapPanel":false,"stickyNotePanelY":0,"yearlyHeliostatYieldPanelY":0,"groundImage":true,"dailyHeliostatYieldPanelRect":{"y":0,"x":0,"height":400,"width":600},"panCenter":[-1.9927664106999077,1.50952086360681,5.064941130407551],"showYearlyLightSensorPanel":false,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"ambientLightIntensity":0.1,"showSolarPanelVisibilityResultsPanel":false,"mapPanelY":0,"dailyParabolicDishYieldPanelX":0,"orthographic":false,"showElevationAngle":true,"dailyParabolicTroughYieldPanelY":0,"axes":true,"showStickyNotePanel":false,"heliodon":false,"yearlyLightSensorPanelShowClearness":false,"yearlyLightSensorPanelX":0,"dailyUpdraftTowerYieldPanelRect":{"height":550,"y":0,"x":0,"width":640},"yearlyFresnelReflectorYieldPanelY":0,"mapTilt":0,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelX":0,"showDailyFresnelReflectorYieldPanel":false,"showEconomicsPanel":false,"showAzimuthAngle":true,"dailyLightSensorPanelY":0,"showDailyUpdraftTowerYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"enableRotate":true,"diurnalTemperaturePanelRect":{"width":600,"x":0,"y":0,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"waterSurface":false,"showZenithAngle":true,"evolutionPanelRect":{"y":0,"width":640,"height":400,"x":0},"showYearlyUpdraftTowerYieldPanel":false,"shadowEnabled":true,"yearlyFresnelReflectorYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"yearlyHeliostatYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"showDiurnalTemperaturePanel":false,"autoRotate":false,"solarRadiationHeatMapReflectionOnly":false,"heliodonPanelX":0,"groundColor":"#16A5A5","heatFluxScaleFactor":20,"heatFluxWidth":0.5,"showSiteInfoPanel":true,"dailyFresnelReflectorYieldPanelX":0,"yearlyUpdraftTowerYieldPanelRect":{"height":400,"x":0,"y":0,"width":600},"weatherPanelRect":{"width":500,"height":500,"x":0,"y":0},"visibilityResultsPanelX":0,"showDailyParabolicTroughYieldPanel":false,"showEvolutionPanel":false,"showYearlyHeliostatYieldPanel":false,"groundImageType":"roadmap"},"graphState":{"dailyParabolicTroughIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyPvIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"rowsPerRack":1,"tiltAngle":0,"poleHeight":1,"rowAxis":"Zonal","orientation":"Landscape","pvModelName":"SPR-X21-335-BLK","interRowSpacing":2,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"maximumInterRowSpacing":10,"pvModelName":"CS6X-355P-FG","minimumTiltAngle":-1.5707963267948966,"poleHeight":1,"rowAxis":"Zonal","maximumRowsPerRack":6,"poleSpacing":5,"minimumInterRowSpacing":2,"maximumTiltAngle":1.5707963267948966,"minimumRowsPerRack":1,"orientation":"Landscape"},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"objectiveFunctionType":1,"inertia":0.8,"searchMethod":1,"maximumSteps":5,"vmax":0.01,"cognitiveCoefficient":0.1,"swarmSize":20,"socialCoefficient":0.1,"convergenceThreshold":0.01,"problem":"Solar Panel Tilt Angle","localSearchRadius":0.1},"geneticAlgorithmParams":{"convergenceThreshold":0.01,"problem":"Solar Panel Tilt Angle","mutationRate":0.1,"maximumGenerations":5,"selectionMethod":1,"localSearchRadius":0.1,"searchMethod":1,"populationSize":20,"crossoverRate":0.5,"objectiveFunctionType":1,"selectionRate":0.5}},"economicsParams":{"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15,"projectLifeSpan":25},"modelType":"School Building","modelAuthor":"The Architect","modelLabel":"Yeni\u015fehir Belediyesi Bilim ve Sanat Merkezi","modelDescription":"Mersin Yeni\u015fehir Belediyesi B\u0130LSEM","notes":[]}')},466:function(e){e.exports=JSON.parse('{"docid":"tM5fjWZLVef6uQTttZQufM","time":"11/13/2022 07:15 pm","timestamp":1668384959038,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"6/22/2022 4:00:00 PM","longitude":-110.9747108,"latitude":32.2226066,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Tucson, AZ, USA","timesPerHour":20,"orthographic":false,"cameraZoom":15.475618749999999,"solarRadiationHeatmapGridCellSize":2,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cz":0.10000000074506517,"id":"2gPWTJVs8iqE6rVTtrnnd8","name":"Julio","normal":[0,1,0],"cy":-19.528888002511724,"type":"Human","cx":13.490029797984572,"rotation":[0,0,0],"selected":false,"parentId":"Ground","lx":0.5,"ly":0.42,"lz":1.76},{"ly":17.026616933032848,"cy":-19.859023165912554,"cz":0.05,"lz":0.1,"selected":false,"lx":36.16252356452459,"type":"Foundation","id":"dqxcN6K9GVQLtZRykzonbS","cx":0.03966683604024013,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #2"},{"normal":[0,0,1],"type":"Tree","rotation":[0,0,0],"lx":4,"cx":-23.993252440580314,"id":"ibv7qyFAZNTUiSKfRnG81J","cz":-8.881784197001252e-16,"selected":false,"cy":-7.809220875702906,"lz":10,"name":"Birch","parentId":"Ground"},{"selected":false,"poleSpacing":4,"lz":0.046,"cy":-0.023651645489680885,"drawSunBeam":true,"poleRadius":0.05,"label":"Solar Panel","ly":3.12,"lx":20.99,"rotation":[0,0,0],"type":"Solar Panel","tiltAngle":0.05235987755982989,"poleHeight":2.5,"normal":[0,0,1],"orientation":"Portrait","cz":0.5000000074505628,"relativeAzimuth":0,"cx":-0.14046178216409752,"showLabel":false,"id":"kLwberNeAuQDEs45xghUMw","trackerType":"None","parentId":"dqxcN6K9GVQLtZRykzonbS","foundationId":"dqxcN6K9GVQLtZRykzonbS","pvModelName":"SPR-X21-335-BLK"},{"id":"5wtQcSRJfXRx7dRi95EJjx","cy":-17.66536908075935,"type":"Human","rotation":[0,0,0],"cz":0.10000000074505806,"selected":false,"cx":7.100228690010481,"normal":[0,1,0],"name":"Jade","parentId":"Ground","lx":0.48,"ly":0.48,"lz":1.6},{"cx":-23.340488252107782,"cz":0,"id":"tJeB5NfeXNiu4x7bJzUo9c","selected":false,"rotation":[0,0,0],"lz":4.164962493910564,"name":"Apple","normal":[0,0,1],"type":"Tree","lx":4.059299397551073,"cy":-22.87864367350907,"parentId":"Ground"},{"type":"Human","name":"Jedi","id":"wizaQCLaDPXxAgvgzpYzE5","cy":-26.52645438589241,"rotation":[0,0,0],"cx":-20.391856797710087,"selected":false,"cz":-7.105427357601002e-15,"normal":[0,1,0],"parentId":"Ground","lx":0.56,"ly":0.56,"lz":1.75},{"name":"Jocelyn","rotation":[0,0,0],"cz":-9.833932535276902e-15,"cx":-5.594678028642042,"type":"Human","normal":[0,1,0],"id":"8gaXxvd41d1wtkBveac2iT","cy":-24.46034584888105,"selected":false,"parentId":"Ground","lx":0.4,"ly":0.6,"lz":1.72},{"selected":false,"rotation":[0,0,0],"id":"tSCfpjZEaf2LdYnKVymp8f","cx":-24.035139369880795,"cy":-11.60375573934435,"normal":[0,1,0],"cz":8.881784197001252e-16,"name":"Judd","type":"Human","parentId":"Ground","lx":0.544,"ly":0.544,"lz":1.68},{"type":"Human","cy":-26.346953604384606,"name":"Jeff","normal":[0,1,0],"selected":false,"cx":-14.95104385552803,"cz":0.10000000074506517,"rotation":[0,0,0],"id":"649JwdxAWZ8uAmjtuwCu7m","parentId":"Ground","lx":0.6,"ly":0.6,"lz":1.65},{"id":"v8yuSV55idFvdSiztzVfkc","cz":0.10000000074506517,"type":"Human","normal":[0,1,0],"selected":false,"cy":-25.080741421179635,"cx":-1.3149126517891083,"rotation":[0,0,0],"name":"Joey","parentId":"Ground","lx":0.462,"ly":0.695,"lz":1.72},{"type":"Tree","name":"Linden","cx":30.437792865488664,"cy":-17.386067284775812,"cz":-7.105427357601002e-15,"lx":23,"lz":17,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rWrzivW4afibFuZheu2ZqV","selected":false},{"type":"Tree","name":"Birch","cx":-23.798739662505156,"cy":3.0810007914333255,"cz":0,"lx":4,"lz":10,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"rd1CFzdzbUa21QJwgHv8cP","selected":false},{"type":"Cuboid","cx":-0.09692665761748831,"cy":-0.09694518863336476,"cz":10.01793918410506,"lx":36.06261166884342,"ly":21.672025065737824,"lz":18.410192174768163,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["Facade #10","Facade #10","Facade #10","Facade #10","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"aj9AkMLHmiC7fiuGVPs4H7","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-12.88108244582257,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"oHeGQDazJuZsZxKRzGGPDD","selected":false},{"type":"Flower","name":"Hydrangea","cx":-10.88108244582257,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"n7tcVJNYuVeGnjeGQXZtpb","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-8.88108244582257,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"jY9Y4Lm3QMDVY6ThY32QL6","selected":false},{"type":"Flower","name":"Hydrangea","cx":-6.881082445822569,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"ijsBYLU6Xgn2UahtDbM3ax","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-4.881082445822569,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"aMGVaSDxGidE4hAekjvzp1","selected":false},{"type":"Flower","name":"Hydrangea","cx":-2.8810824458225692,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"jNS7CLQtTgERjMBryrJy3f","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-0.8810824458225692,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"m5iTV6jNY7ctTerZ1zT3mN","selected":false},{"type":"Flower","name":"Hydrangea","cx":1.1189175541774308,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"obmBrYQNng1HztDQMhFTdF","selected":false},{"type":"Flower","name":"Yellow Flower","cx":3.1189175541774308,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"bX5gWjKNUmXEpNE3CSVo5i","selected":false},{"type":"Flower","name":"Hydrangea","cx":5.118917554177431,"cy":-7.8862995083645835,"cz":0.05000000074505806,"lx":2,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dqxcN6K9GVQLtZRykzonbS","id":"e1T6XS94X1vuZYnmBeSzv3","selected":false},{"type":"Tree","name":"Birch","cx":-23.930414200652432,"cy":-2.885662218323219,"cz":8.881784197001252e-16,"lx":4,"lz":10,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"jDrfaAvoEqu7y5suMRTWYc","selected":false}],"view":{"shadowEnabled":true,"showYearlyLightSensorPanel":false,"showStickyNotePanel":false,"mapTilt":0,"showSiteInfoPanel":true,"showHeliodonPanel":false,"stickyNotePanelX":6,"groundColor":"forestgreen","showWeatherPanel":false,"showDailyLightSensorPanel":false,"heliodonPanelX":-1235,"weatherPanelX":0,"groundImage":false,"autoRotate":false,"axes":true,"weatherPanelY":0,"groundPanelX":0,"theme":"Forest","mapWeatherStations":false,"mapType":"roadmap","yearlyLightSensorPanelY":70,"mapZoom":16,"stickyNotePanelY":0,"showGroundPanel":false,"heliodonPanelY":7,"yearlyLightSensorPanelX":-905,"dailyLightSensorPanelY":15,"heliodon":false,"dailyLightSensorPanelX":-19,"groundPanelY":0,"showMapPanel":false,"cameraPosition":[-16.291066490441285,-43.009068926241156,5.496187293258948],"panCenter":[2.1268141574348576,-9.161736732265924,5.496187293258948],"orthographic":false,"enableRotate":true,"cameraZoom":12.604988194492185,"showInstructionPanel":true,"cameraPosition2D":[4.203619393633803,-8.791827721460434,49.9999912078788],"panCenter2D":[4.203619393633803,-8.791777719248431,0.0000016660811664248792]},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[""]}')},467:function(e){e.exports=JSON.parse('{"docid":"i1UYg29b6kEuhDLMCMNpP5","time":"11/13/2022 07:17 pm","timestamp":1668385042826,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"longitude":-71.0588801,"timesPerHour":20,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"name":"default","orthographic":false,"date":"6/22/2022 2:00:00 PM","latitude":42.3600825,"address":"Boston, MA, USA","cameraZoom":15.475618749999999,"solarRadiationHeatmapGridCellSize":2,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"selected":false,"cz":8.856282232714092,"faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"ly":33.93664889246779,"rotation":[0,0,-0.0032691065367469463],"parentId":"Ground","color":"#ffffff","locked":true,"textureTypes":["Facade #6","Facade #6","Facade #6","Facade #6","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"lx":13.425069388064955,"cx":-6.488470028429835,"lz":17.712564465428184,"type":"Cuboid","cy":0.019620316414646233,"id":"aj9AkMLHmiC7fiuGVPs4H7"},{"ly":21.367362944163304,"parentId":"Ground","textureType":"Foundation Texture #5","id":"nkyNmQGMpysyBAzvoXacg4","normal":[0,0,1],"cz":0.15,"cy":-0.6842314918166474,"rotation":[0,0,0],"locked":true,"selected":false,"cx":7.741690731109698,"lx":8.748703583308991,"type":"Foundation","lz":0.3},{"cz":0.10000000074505806,"normal":[0,1,0],"cx":8.66688372110198,"cy":-13.746548548931791,"type":"Human","parentId":"Ground","rotation":[0,0,0],"id":"4Vzhap6VgrCQ5NTbMiLqko","name":"Jacqueline","selected":false,"lx":0.43,"ly":0.6,"lz":1.78},{"lz":18,"id":"68fHvB4gguggDahyWhJ4SX","rotation":[0,0,0],"locked":true,"parentId":"Ground","type":"Tree","normal":[0,1,0],"lx":20,"cz":0.10000000074505806,"cx":13.623011710923919,"selected":false,"name":"Oak","cy":12.95292752972638},{"textureType":"Foundation Texture #1","rotation":[0,0,0],"normal":[0,0,1],"id":"mB2npz1re5TLiTmp6dijK4","selected":false,"cz":0.25,"parentId":"Ground","lz":0.5,"cy":-0.6991379361374314,"locked":true,"lx":0.5880095062712664,"type":"Foundation","ly":22.361419422277052,"cx":12.378216846473736},{"textureType":"Foundation Texture #1","lz":0.5,"lx":8.699592487769063,"cx":7.739060103053577,"normal":[0,0,1],"id":"6VQra4naAQFjguzsdBbGzc","selected":false,"ly":0.5266260617381799,"locked":true,"cz":0.25,"rotation":[0,0,0],"parentId":"Ground","cy":-11.625239464321695,"type":"Foundation"},{"cx":7.752694722563858,"parentId":"Ground","cz":0.25,"lz":0.5,"normal":[0,0,1],"id":"56rJdSeQkFjNtFMq7H6UpX","textureType":"Foundation Texture #1","lx":8.679570997286799,"type":"Foundation","selected":false,"rotation":[0,0,0],"cy":10.194687286684449,"ly":0.5386483210241274},{"id":"eU9g8aGc26unxecmNefMbn","locked":true,"cx":3.0473373691290284,"lz":0.5,"type":"Foundation","normal":[0,0,1],"cz":0.25,"parentId":"Ground","selected":false,"rotation":[0,0,0],"ly":22.40023737998388,"lx":0.7052822924117278,"textureType":"Foundation Texture #1","cy":-0.7141009093628288},{"parentId":"Ground","type":"Human","normal":[0,1,0],"selected":false,"cy":-13.302409805647457,"name":"June","id":"sRkZkptRmoDxYpUWxicUE2","cx":10.066230625457528,"cz":0.10000000074505806,"rotation":[0,0,0],"lx":0.65,"ly":0.65,"lz":1.85},{"type":"Human","id":"27tFcVkJUEjzAmNC6yi8q6","name":"Jedi","cy":-17.39224604987067,"rotation":[0,0,0],"parentId":"Ground","cx":11.172877256337918,"cz":0.10000000074505806,"normal":[0,1,0],"selected":false,"lx":0.56,"ly":0.56,"lz":1.75},{"cx":14.572429350273456,"cz":0.10000000074505762,"rotation":[0,0,0],"cy":-12.024223980842134,"selected":false,"normal":[0,1,0],"name":"Jose","parentId":"Ground","type":"Human","id":"h7GsvzmZmQv6Lgxa5TK46V","lx":2,"ly":2,"lz":1.6},{"lx":5,"parentId":"Ground","id":"at3dF6SQoavQM2mWXfaQoH","cz":0.10000000074505895,"rotation":[0,0,0],"cy":21.229675112263504,"normal":[0,1,0],"type":"Tree","cx":1.973403675763489,"locked":true,"lz":12,"name":"Pine","selected":false},{"textureType":"Foundation Texture #2","id":"6gVMaHq7VLa19eqMVECxpG","ly":52.39119915791477,"cz":0.05,"selected":false,"cx":-0.6875232985680384,"parentId":"Ground","locked":true,"type":"Foundation","rotation":[0,0,0],"cy":2.56875991707771,"normal":[0,0,1],"lz":0.1,"lx":37.85599614878349},{"cx":7.643885747803793,"selected":false,"locked":true,"id":"h8TwAvSyLwtPBvqze5mwzf","lz":9,"type":"Tree","cy":-21.507259849637833,"parentId":"Ground","rotation":[0,0,0],"cz":0.10000000074505762,"name":"Maple","lx":7,"normal":[0,1,0]},{"parentId":"Ground","lx":6,"locked":true,"type":"Tree","rotation":[0,0,0],"normal":[0,0,1],"cy":-20.556927102277076,"lz":7,"cz":0.10000000074505762,"id":"ujafmePw8rQZjxB8qy62oa","name":"Maple","selected":false,"cx":12.405622304747324},{"selected":false,"parentId":"Ground","id":"ckD1BgrHEqvMdo9aEBaYXU","type":"Human","rotation":[0,0,0],"normal":[0,1,0],"cy":-14.554057740143271,"name":"Jaya","cz":0.10000000074505806,"cx":5.006550016327088,"lx":0.6,"ly":0.6,"lz":1.55},{"rotation":[0,0,0],"name":"Judd","cy":-15.073100073321267,"cx":12.689715112185674,"parentId":"Ground","type":"Human","cz":0.1000000007450585,"normal":[0,1,0],"selected":false,"id":"npocC3zf2QhLeKj6LeXJvL","lx":0.544,"ly":0.544,"lz":1.68},{"cy":0.5804724345884147,"rotation":[0,0,0],"lz":19.49711020919501,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"cz":9.748555104597505,"color":"gray","cx":-2.205872934036133,"locked":true,"ly":0.8534746756143718,"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","lx":0.828070336814001,"id":"gdcpJkZkVZXJHaDmRtpFtw","selected":false},{"normal":[0,0,1],"cz":10.253341514775366,"color":"gray","parentId":"Ground","lz":20.506683029550732,"type":"Cuboid","selected":false,"id":"wJkGWJoWEXDPm4p9rWMB3a","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,0],"ly":0.8534746756143718,"faceColors":["gray","gray","gray","gray","gray","gray"],"cx":-2.105385998729491,"lx":0.828070336814001,"cy":2.869274580105114,"locked":true},{"ly":34.489830484403164,"cx":-6.481696563939499,"type":"Foundation","parentId":"Ground","lz":0.3,"cz":0.15,"rotation":[0,0,0],"id":"38Wmw6REgfAAEs5HtLXUmy","selected":false,"normal":[0,0,1],"cy":0.05822819825317893,"locked":true,"color":"#666666","lx":13.764674737343674},{"relativeAzimuth":0,"tiltAngle":0.42308540045443915,"poleSpacing":3,"cx":0.39547991802521515,"cz":0.5000000074505806,"lz":0.046,"id":"2BhUXhGXtbxsUZ6RL3rXMW","trackerType":"None","orientation":"Portrait","pvModelName":"SPR-X21-335-BLK","showLabel":false,"lx":1.046,"type":"Solar Panel","foundationId":"6gVMaHq7VLa19eqMVECxpG","poleHeight":2.6,"cy":0.0004767391535806561,"normal":[0,0,1],"selected":false,"ly":1.558,"drawSunBeam":false,"rotation":[0,0,0],"poleRadius":0.05,"parentId":"6gVMaHq7VLa19eqMVECxpG"},{"type":"Flower","name":"Boxwood","cx":14.589782607955689,"cy":-5.22248370768526,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"6LyjhRYrjyMM94sWFxmsqL","selected":false},{"type":"Flower","name":"Boxwood","cx":14.487482209296324,"cy":-7.284306500015294,"cz":0.05000000074505628,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"cAUoEVfsJryF5CiN2bA6FF","selected":false},{"type":"Flower","name":"Boxwood","cx":14.656720218433037,"cy":-3.0619235461512933,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"14ZankHi6YjP8eUwRAzc99","selected":false},{"type":"Flower","name":"Boxwood","cx":14.649968347802723,"cy":-0.5953981727630122,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"cKDzu7CNMKytpxg8x9M4vH","selected":false},{"type":"Flower","name":"Boxwood","cx":14.465946083296767,"cy":2.3705809858943816,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"2nJegakb4Q3dsnpjrnazGL","selected":false},{"type":"Flower","name":"Boxwood","cx":14.535486123826292,"cy":5.258763702004629,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"puhTw5YZiZX1mZayPv7eKr","selected":false},{"type":"Flower","name":"Boxwood","cx":14.562074464646393,"cy":-9.421018376024211,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"3aFBjoFzTN38LjxnNVca94","selected":false},{"type":"Flower","name":"Boxwood","cx":14.48848671206672,"cy":-11.828589152852121,"cz":0.050000000745059836,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"ksddQtWpUymEExWqGah9pg","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.602082126220235,"cy":-10.642654606813768,"cz":0.05000000074505628,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"ftch5sGAxD2dLW85VDsCvD","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.574840162280765,"cy":-13.130340588937553,"cz":0.05000000074506161,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"oVgmk99C2S2KZF2CFR1hGP","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.575588404543318,"cy":-8.21343708444617,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"9uo3Ts1QDRhb3aomxt4V2f","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.557819941105063,"cy":-6.106389769612514,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"agCMuQbpTFk2RqkwtebyV4","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.556683398866188,"cy":-4.0576139533384525,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"aFUE71bDFA2LjkNkJFEuii","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.64239387314273,"cy":-1.7994645182621838,"cz":0.050000000745059836,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"4Z9VuhUNw8DYwRbkqYhoHB","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.529383383564124,"cy":0.8679517875801537,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"nf7V66G4i2YFWuJXZENckj","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.581939017157946,"cy":3.902214931587771,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"kKWrifvQ6fGtZhJmgPvL5X","selected":false},{"type":"Flower","name":"Hibiscus","cx":14.45704330414372,"cy":6.704146476013747,"cz":0.05000000074505806,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"aL2Uhpp8HT6eUfWcMrtxWr","selected":false},{"type":"Flower","name":"Tall Bush","cx":-8.820527407137332,"cy":-21.01555787918438,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"czSxXH8n5KnbYhnZp9414E","selected":false},{"type":"Flower","name":"Tall Bush","cx":-5.64492924344334,"cy":-20.928730058607652,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"12s9PdvNM6rnixcYtcjVJm","selected":false},{"type":"Flower","name":"Tall Bush","cx":-2.4233695148043557,"cy":-21.043064672162302,"cz":0.05000000074506161,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"fnbqxsK1LLgKaQxJEJtzGY","selected":false},{"type":"Flower","name":"Tall Bush","cx":0.44859084832241436,"cy":-21.025210125432253,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"5HDDx2HYGe5rU4vkYUjLkn","selected":false},{"type":"Flower","name":"Tall Bush","cx":-11.802690551407991,"cy":-21.134263522232033,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"ii2AHuBu7eNYp9zExhjpBk","selected":false},{"type":"Flower","name":"Hosta","cx":13.888302021073589,"cy":-23.07433161468632,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"ry52Vu3ZtWa5Z5S4Cv3Fns","selected":false},{"type":"Flower","name":"Hosta","cx":13.000536079398454,"cy":-23.90262067298287,"cz":0.05000000074505895,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"2KvsyZDeNBQ15oEbTBWXTQ","selected":false},{"type":"Flower","name":"Hosta","cx":12.99992231969237,"cy":-22.436277503833722,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"sBdHaZQt67kBAXxPrttrkC","selected":false},{"type":"Flower","name":"Hosta","cx":7.96155182885969,"cy":-24.919269939427444,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"rErTYG7fvCUCgbP8phnFpb","selected":false},{"type":"Flower","name":"Hosta","cx":8.302339884724876,"cy":-23.511029051299055,"cz":0.05000000074506161,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"qREs5pGeMh2bn8266bra52","selected":false},{"type":"Flower","name":"Hosta","cx":12.046100627532674,"cy":-23.058422241294327,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"cFutgv9ep2vsCmwtcQ32FT","selected":false},{"type":"Flower","name":"Hosta","cx":7.459817492896914,"cy":-23.89304923816075,"cz":0.050000000745059836,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"meCdn2mUx41JAdUmabe62e","selected":false},{"type":"Flower","name":"Hosta","cx":8.773287043648144,"cy":-24.33842489149061,"cz":0.05000000074505806,"lx":1,"lz":0.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"1zHSSdp6WfVgSDgmVd5A2g","selected":false},{"type":"Flower","name":"Peony","cx":15.825630097786828,"cy":-25.16699394950085,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"xi2HuxsfZQnvPjTKPQxrbF","selected":false},{"type":"Flower","name":"Peony","cx":16.48091229260942,"cy":-24.316745367707185,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"2Ake4uxrZPD3VybPtfduv3","selected":false},{"type":"Flower","name":"Peony","cx":16.886960727664686,"cy":-25.34224361063938,"cz":0.05000000074505806,"lx":1.5,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6gVMaHq7VLa19eqMVECxpG","id":"4obU3fsBjpjfoLx69cK5C6","selected":false}],"view":{"heliodonPanelY":7,"heliodon":false,"stickyNotePanelX":6,"showHeliodonPanel":false,"yearlyLightSensorPanelX":-905,"enableRotate":true,"dailyLightSensorPanelY":15,"mapZoom":16,"weatherPanelY":0,"cameraZoom":15.47561875,"groundPanelX":0,"showSiteInfoPanel":true,"showYearlyPvYieldPanel":false,"stickyNotePanelY":0,"yearlyLightSensorPanelY":70,"showYearlyLightSensorPanel":false,"axes":true,"orthographic":false,"showWeatherPanel":false,"cameraPosition":[31.71971744843037,-16.83871990124489,7.439938736584827],"mapTilt":0,"showMapPanel":false,"autoRotate":false,"groundPanelY":0,"mapWeatherStations":false,"showGroundPanel":false,"groundColor":"forestgreen","panCenter":[-1.577685546422091,0.586908253253759,7.439938736584823],"showInstructionPanel":true,"heliodonPanelX":-1235,"dailyLightSensorPanelX":-19,"shadowEnabled":true,"showStickyNotePanel":false,"showDailyPvYieldPanel":false,"groundImage":false,"mapType":"roadmap","showDailyLightSensorPanel":false,"theme":"Forest","weatherPanelX":0,"cameraPosition2D":[0.8790434579553117,3.516123829597026,50.00000351630349],"panCenter2D":[0.8790434579553117,3.5161738318194917,0.0000035163301233325335]},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[""]}')},468:function(e){e.exports=JSON.parse('{"docid":"pxi9S4wGaGxiW2Q28M7prc","time":"06/18/2023 07:07 pm","timestamp":1687129633099,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 1:30:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Miami, FL, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":25.7616798,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-80.1917902},"elements":[{"type":"Wall","cx":-0.5738138595304036,"cy":4.010364625861682,"cz":2.2408122612280286,"lx":18.01575243966671,"ly":0.3,"lz":9,"leftJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"rightJoints":["11Ltx28CSTVpm6gjZuBH9w"],"leftPoint":[8.434062360302951,4.010364625861682,0.1],"rightPoint":[-9.581690079363758,4.010364625861682,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"n8LvMVp1hZ7BptmwrWpcMT","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"cgHKR8ai6snf9XinDUWwjd","selected":false,"leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.633496307266332,"rightUnfilledHeight":4.633496307266332,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":8.434062360302947,"cy":0.16844568443230257,"cz":2.2301039869226305,"lx":7.683837882858757,"ly":0.3,"lz":9,"leftJoints":["hndwqtrrygFvfqvBJrvZYu"],"rightJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"leftPoint":[8.434062360302942,-3.673473256997076,0.1],"rightPoint":[8.434062360302951,4.010364625861682,0.1],"relativeAngle":1.5707963267948957,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"e5r2Cqz5K28ewHbKWcFnYZ","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"cgHKR8ai6snf9XinDUWwjd","selected":false,"leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.81107858935271,"rightUnfilledHeight":4.81107858935271,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-9.581690079363758,"cy":0.16844568443230257,"cz":2.228839888904333,"lx":7.683837882858757,"ly":0.3,"lz":9,"leftJoints":["n8LvMVp1hZ7BptmwrWpcMT"],"rightJoints":["hndwqtrrygFvfqvBJrvZYu"],"leftPoint":[-9.581690079363758,4.010364625861682,0.1],"rightPoint":[-9.581690079363758,-3.673473256997076,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"11Ltx28CSTVpm6gjZuBH9w","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"cgHKR8ai6snf9XinDUWwjd","selected":false,"leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Partial","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.538993236656353,"rightUnfilledHeight":4.538993236656353,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-0.5738138595304036,"cy":-3.673473256997076,"cz":2.268765007024547,"lx":18.01575243966671,"ly":0.3,"lz":9,"leftJoints":["11Ltx28CSTVpm6gjZuBH9w"],"rightJoints":["e5r2Cqz5K28ewHbKWcFnYZ"],"leftPoint":[-9.581690079363758,-3.673473256997076,0.1],"rightPoint":[8.434062360302951,-3.673473256997076,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"hndwqtrrygFvfqvBJrvZYu","parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","roofId":"cgHKR8ai6snf9XinDUWwjd","selected":false,"leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":false,"fill":"Full","eavesLength":0.4,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Foundation","cx":1.328107295365207,"cy":-2.32341538525935,"cz":0.05,"lx":20.16561856842383,"ly":11.725607943394946,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"locked":true},{"type":"Wall","cx":0.31845175389180724,"cy":5.51114190784781,"cz":2.2408122612280286,"lx":18.813654239419552,"ly":0.3,"lz":4.56796601625556,"leftJoints":["iDYhRA8ugGHkfhtK8qw34U"],"rightJoints":["1nexviqMbEfx5qrHX1iQLA"],"leftPoint":[9.725278873601583,5.51114190784781,0],"rightPoint":[-9.088375365817969,5.51114190784781,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"gMAz3EG3wEtDDDZGez95Am","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4.56796601625556,"rightRoofHeight":4.56796601625556,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.56796601625556,"rightTopPartialHeight":4.56796601625556},{"type":"Wall","cx":9.725278873601583,"cy":-0.00976103700472608,"cz":2.2301039869226305,"lx":11.04180588970507,"ly":0.3,"lz":4.56796601625556,"leftJoints":["roDDPncXBpNgmNum9aUaov"],"rightJoints":["gMAz3EG3wEtDDDZGez95Am"],"leftPoint":[9.72527887360158,-5.530663981857262,0],"rightPoint":[9.725278873601587,5.51114190784781,0],"relativeAngle":1.570796326794896,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"iDYhRA8ugGHkfhtK8qw34U","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4.56796601625556,"rightRoofHeight":4.56796601625556,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.56796601625556,"rightTopPartialHeight":4.56796601625556},{"type":"Wall","cx":-9.088375365817967,"cy":-0.00976103700472608,"cz":2.228839888904333,"lx":11.04180588970507,"ly":0.3,"lz":4.56796601625556,"leftJoints":["gMAz3EG3wEtDDDZGez95Am"],"rightJoints":["roDDPncXBpNgmNum9aUaov"],"leftPoint":[-9.088375365817964,5.51114190784781,0],"rightPoint":[-9.088375365817969,-5.530663981857262,0],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"1nexviqMbEfx5qrHX1iQLA","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4.56796601625556,"rightRoofHeight":4.56796601625556,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.56796601625556,"rightTopPartialHeight":4.56796601625556},{"type":"Wall","cx":0.318451753891809,"cy":-5.530663981857262,"cz":2.268765007024547,"lx":18.813654239419556,"ly":0.3,"lz":4.56796601625556,"leftJoints":["1nexviqMbEfx5qrHX1iQLA"],"rightJoints":["iDYhRA8ugGHkfhtK8qw34U"],"leftPoint":[-9.088375365817969,-5.530663981857262,0],"rightPoint":[9.725278873601587,-5.530663981857262,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"roDDPncXBpNgmNum9aUaov","parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","roofId":"wCPmoV4VwkScF5K7cf32UD","selected":false,"leftRoofHeight":4.56796601625556,"rightRoofHeight":4.56796601625556,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0,"locked":false,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4.56796601625556,"rightTopPartialHeight":4.56796601625556},{"type":"Foundation","cx":0.4107313024346143,"cy":-1.9585431776860986,"cz":0.06,"lx":24.334060214728257,"ly":12.759991395526452,"lz":0.1370389804876668,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"locked":true,"enableGroupMaster":true,"notBuilding":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Mansard","roofStructure":"Default","wallsId":["roDDPncXBpNgmNum9aUaov"],"ridgeWidth":0.5,"textureType":"No Roof Texture","color":"#f44e3b","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"axj9GVUBNvhnWAa3G8T3wG","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"wCPmoV4VwkScF5K7cf32UD","rise":0.3478700995805717,"ceiling":false,"locked":true},{"type":"Door","cx":-0.13288221247108084,"cy":0,"cz":-0.14054209286568672,"lx":0.2126115399537293,"ly":0,"lz":0.7189158142686265,"doorType":"Arched","archHeight":1.5,"textureType":"Door Texture Default","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","id":"fTMHecXmkxoFyi5nVgZruF","filled":false,"locked":true},{"type":"Door","cx":0.10630576997686465,"cy":0,"cz":-0.14054209286568672,"lx":0.21261153995372933,"ly":0,"lz":0.7189158142686265,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1.429004247968055,"normal":[0,1,0],"rotation":[0,0,0],"id":"thTY63emBWLui9mLZFtB5x","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":false,"locked":true},{"type":"Door","cx":-0.3587819736719182,"cy":0,"cz":-0.14054209286568672,"lx":0.18603509745951316,"ly":0,"lz":0.7189158142686265,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1.5,"normal":[0,0,1],"rotation":[0,0,0],"id":"r7aX4f3HRkVXuNQaRxbPi1","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":false,"locked":true},{"type":"Door","cx":0.3454937524248102,"cy":0,"cz":-0.14054209286568672,"lx":0.21261153995372936,"ly":0,"lz":0.7189158142686265,"color":"white","textureType":"Door Texture Default","doorType":"Arched","archHeight":1.5000000000000002,"normal":[0,1,0],"rotation":[0,0,0],"id":"h7dwAP8dsZbfjhXMRt294q","parentId":"roDDPncXBpNgmNum9aUaov","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":false,"locked":true},{"type":"Window","cx":-0.34549375242481023,"cy":0.1,"cz":0,"lx":0.05315288498843229,"ly":0.3,"lz":0.4378316285372531,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rdTv6Q4XaY2HL4w2ci3fB5","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.13288221247108084,"cy":0.3,"cz":0,"lx":0.05315288498843234,"ly":0.3,"lz":0.4378316285372531,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"pQxrSqKt4uEUL2dJPHShTY","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.13288221247108084,"cy":0.3,"cz":0,"lx":0.05315288498843232,"ly":0.3,"lz":0.4378316285372531,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"atW2SL8otwncREw5PJhodr","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"qbQ9QMk6Dj7o7JJCKkAhev","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"2VRD7a1NgLHaEmc9D9M6WC","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.27157505426375056,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"4oyLukiiczQdV1HoYtc4Fr","parentId":"iDYhRA8ugGHkfhtK8qw34U","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.09052501808791685,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"htUC2ciWSRkoYRYshdvzr9","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.31683756330770896,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"rRinSM2N5C3a63EVX8XwC3","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Window","cx":2.010059187716281e-17,"cy":0.1,"cz":-0.06561865858420968,"lx":0.0905250180879169,"ly":0.3,"lz":0.38123731716841935,"mullionSpacing":0.5,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"aW33UVVm7iNu3o3dYVhWrc","parentId":"1nexviqMbEfx5qrHX1iQLA","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"mullionWidth":0.06,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"locked":true,"windowType":"Default","archHeight":1},{"type":"Door","cx":-0.3746721111208206,"cy":0,"cz":-0.3611111111111111,"lx":0.08326046913796013,"ly":0,"lz":0.2777777777777778,"doorType":"Default","archHeight":1,"textureType":"Door Texture #1","color":"#73d8ff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"ecLTLgAm2MxZyZRCJTtQKo","filled":true,"locked":true},{"type":"Door","cx":-0.15264419341959357,"cy":0,"cz":-0.3611111111111111,"lx":0.08326046913796013,"ly":0,"lz":0.2777777777777778,"color":"#73d8ff","textureType":"Door Texture #1","doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"bEeuNKM57K5x42NhRniwi6","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"filled":true,"locked":true},{"type":"Door","cx":0.12489070370694019,"cy":0,"cz":-0.3611111111111111,"lx":0.08326046913796013,"ly":0,"lz":0.2777777777777778,"color":"#73d8ff","textureType":"Door Texture #1","doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"qEKCQ7EzsMMEDG8bv8fsum","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"filled":true,"locked":true},{"type":"Door","cx":0.3746721111208206,"cy":0,"cz":-0.3611111111111111,"lx":0.08326046913796013,"ly":0,"lz":0.2777777777777778,"color":"#73d8ff","textureType":"Door Texture #1","doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"8wkxpiMCThpy9pWENNkhKk","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","selected":false,"filled":true,"locked":true},{"type":"Window","cx":-0.3746721111208206,"cy":0.1,"cz":0.25,"lx":0.08326046913796013,"ly":0.3,"lz":0.2777777777777778,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"9Wg9qQLxZfpvdDjZ2VpjsU","locked":true},{"type":"Window","cx":-0.12489070370694019,"cy":0.3,"cz":0.25,"lx":0.08326046913796013,"ly":0.3,"lz":0.2777777777777778,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rj3NsBy5xBcFQpgf9yTyXN","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.12489070370694019,"cy":0.3,"cz":0.25,"lx":0.08326046913796013,"ly":0.3,"lz":0.2777777777777778,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hdSr1YZAyCNR6oUkaHZMAg","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3746721111208206,"cy":0.3,"cz":0.25,"lx":0.08326046913796013,"ly":0.3,"lz":0.2777777777777778,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"asxeUzs2NaJ78jjx63TyyC","parentId":"hndwqtrrygFvfqvBJrvZYu","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":true,"showRight":true,"color":"#009ce0","width":0.5},"selected":false,"locked":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Hip","roofStructure":"Default","wallsId":["hndwqtrrygFvfqvBJrvZYu"],"textureType":"No Roof Texture","color":"#f44e3b","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"3vsEsZfsBjGXDRnpzcE3dE","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","id":"cgHKR8ai6snf9XinDUWwjd","leftRidgeLength":4.503938109916677,"rightRidgeLength":4.503938109916677,"rise":2.5896529887286306,"ceiling":false,"locked":true},{"type":"Human","name":"Jeanette","cx":0.8591126899329264,"cy":-9.396182210960866,"cz":0,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"85Scr5g8mYtCpbKgKe9vrB","selected":false,"flip":true,"ly":0.4,"locked":true},{"type":"Human","name":"Jacob","cx":-0.10555204032261312,"cy":-9.416124087799197,"cz":0,"lx":0.8,"lz":1.82,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"3vrVERckAPTLoMt9TNeS2S","selected":false,"ly":0.8,"locked":true},{"type":"Window","cx":0.34549375242481023,"cy":0.3,"cz":0,"lx":0.05315288498843234,"ly":0.3,"lz":0.4378316285372531,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"cspu4NZcKs2zheso8YnaAG","parentId":"gMAz3EG3wEtDDDZGez95Am","foundationId":"axj9GVUBNvhnWAa3G8T3wG","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3607953662644939,"cy":0.3,"cz":0.2884716244387647,"lx":0.05550697942530675,"ly":0.3,"lz":0.20083452890024844,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"vDt9VGvnvU9vePAfrLQMYJ","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.16652093827592027,"cy":0.3,"cz":0.2884716244387647,"lx":0.05550697942530675,"ly":0.3,"lz":0.20083452890024844,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"hYQQWiCSxQgqR2XiFwQcHB","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1387674485632669,"cy":0.3,"cz":0.2884716244387647,"lx":0.05550697942530675,"ly":0.3,"lz":0.20083452890024844,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"hgcEVbECbXF3rdyRi8jL7y","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3885488559771473,"cy":0.3,"cz":0.2884716244387647,"lx":0.05550697942530675,"ly":0.3,"lz":0.20083452890024844,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"ih1JWVrGZLFL47MHERTzyn","parentId":"n8LvMVp1hZ7BptmwrWpcMT","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1952149463416227,"cy":0.1,"cz":0.2777777777777778,"lx":0.13014329756108178,"ly":0.3,"lz":0.2222222222222222,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"uACfjsfx3oFuHFL2K4wn6s","parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1952149463416227,"cy":0.1,"cz":0.2777777777777778,"lx":0.13014329756108178,"ly":0.3,"lz":0.2222222222222222,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"jUW859PMX9WssNh7ajd7bW","parentId":"11Ltx28CSTVpm6gjZuBH9w","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.26028659512216357,"cy":0.1,"cz":0.2777777777777779,"lx":0.13014329756108178,"ly":0.3,"lz":0.22222222222222243,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"9GK118ZSrqGs81r2c9DmJ9","parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.26028659512216357,"cy":0.3,"cz":0.2777777777777777,"lx":0.13014329756108178,"ly":0.3,"lz":0.22222222222222243,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#73d8ff","normal":[0,0,1],"rotation":[0,0,0],"id":"qMSMFHr6W7JY5LW4w6QRRk","parentId":"e5r2Cqz5K28ewHbKWcFnYZ","foundationId":"3vsEsZfsBjGXDRnpzcE3dE","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Tree","name":"Coconut","cx":-13.833956304562825,"cy":-5.734368757546395,"cz":0,"lx":10.296431730851847,"lz":14.247937869417774,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"dhdL6enwuq52BCva98npwA","selected":false,"locked":true},{"type":"Tree","name":"Coconut","cx":-16.03648257210165,"cy":-7.577405253611644,"cz":-8.881784197001252e-16,"lx":6.4568591564721105,"lz":8.433084547651115,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"oX2XaCFnUgccQdVNREDqjW","selected":false,"locked":true},{"type":"Tree","name":"Fan Palm","cx":15.143629921921018,"cy":-10.9460234939345,"cz":0,"lx":5.636076310522914,"lz":7.988346597759666,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"gbweDZRVxLwqky2axf7Y8q","selected":false,"locked":true},{"type":"Tree","name":"Fan Palm","cx":14.372021459439786,"cy":-8.787207002242742,"cz":0,"lx":6.791895714508713,"lz":10.21869909939493,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"sf29WMk4BaTsfLzkZNmVzH","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":2.428817756541367,"cy":-10.484144416604128,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9DZLwc5PTpq9K9kFVPWuDb","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-1.9808700560460073,"cy":-10.456723771199588,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"tbLKA9nAkR1p2Y51NnR7Hz","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":-6.50706138180835,"cy":-10.311129925272937,"cz":-8.881784197001252e-16,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mwwbjydsGANpRKQR1fPW3q","selected":false,"locked":true},{"type":"Flower","name":"Yellow Flower","cx":6.571598639052613,"cy":-10.492326870561346,"cz":0,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"c8AcvQkEYah3BNHFPjZ6U4","selected":false,"locked":true},{"type":"Polygon","cx":0.039567390445074416,"cy":-0.26884665270178654,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.18603509745951316,"y":-0.4378316285372531},{"x":-0.18603509745951316,"y":-0.21891581426862655},{"x":0.23918798244794548,"y":-0.21891581426862655},{"x":0.2395673904450744,"y":-0.46884665270178655}],"parentId":"roDDPncXBpNgmNum9aUaov","parentType":"Wall","foundationId":"axj9GVUBNvhnWAa3G8T3wG","selected":false,"filled":true,"selectedIndex":0,"id":"jaEQvTPeDh2m31LB8RsyFG","text":"SPANISH TAVERN","fontSize":0.7,"fontColor":"gold","fontOutlineColor":"red","fontOutlineWidth":0.05,"noOutline":true,"opacity":0}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0.12159863905262133,-1.1671768638939548,-0.0000012172309664404964],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0.12159863905262133,-1.1673268705613518,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-7.450909722303011,-23.613178769130574,4.500139724117738],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":20.00000000000001,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[1.616638405874658,1.2781230776372128,4.313092868911078],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":360}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},469:function(e){e.exports=JSON.parse('{"docid":"8zyJg4GHQPZX9C7UX4st8J","time":"03/18/2023 08:26 pm","timestamp":1679185608583,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":1,"date":"12/22/2022, 8:15:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Honolulu, HI, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":21.3098845,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-157.8581401},"elements":[{"ly":16.927339965869773,"solarUpdraftTower":{},"parentId":"Ground","cx":-10.030961003153333,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":25.06053757796986,"type":"Foundation","solarPowerTower":{},"lx":36.13676163604105,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,-0.7727629180414017],"cz":0.05},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":25.078696453594382,"relativeAngle":3.141592653589793,"lz":30,"roofId":"1rg4qXk51s2D35ph8XqwbD","ly":0.1,"rightPoint":[-7.080024662598481,7.041260263727929,0],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,-0.7727629180414017],"textureType":"No Wall Texture","leftPoint":[17.998671790995903,7.041260263727929,0],"type":"Wall","normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":5.459323564198711,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":7.041260263727929,"color":"#ffffe0","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":17.998671790995893,"leftPoint":[17.99867179099588,-4.904184303905874,0],"cy":1.0685379799110275,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[17.998671790995903,7.041260263727929,0],"ly":0.1,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":11.945444567633803,"normal":[0,0,1],"lz":30,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,-0.7727629180414017],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948946,"textureType":"No Wall Texture","roofId":"1rg4qXk51s2D35ph8XqwbD","color":"#ffffe0","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"lx":11.945444567633803,"windows":[],"lz":30,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"1rg4qXk51s2D35ph8XqwbD","selected":false,"cy":1.0685379799110275,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-7.080024662598481,-4.904184303905874,0],"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"textureType":"No Wall Texture","parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":-1.5707963267948966,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-7.080024662598481,7.041260263727929,0],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","ly":0.1,"cx":-7.080024662598481,"color":"#ffffe0","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"showLabel":false,"cx":5.459323564198711,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[17.998671790995903,-4.904184303905874,0],"cz":2.268765007024547,"textureType":"No Wall Texture","cy":-4.904184303905874,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"1rg4qXk51s2D35ph8XqwbD","leftPoint":[-7.080024662598481,-4.904184303905874,0],"normal":[0,0,1],"ly":0.1,"lz":30,"relativeAngle":0,"rotation":[0,0,-0.7727629180414017],"lx":25.078696453594382,"color":"#ffffe0","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":7.840470874398735,"cy":5.490428888324286,"cz":2.2408122612280286,"lx":16.75500291983642,"ly":0.1,"lz":40,"leftJoints":["aJzBKycDgPV2XFyreGUWbN"],"rightJoints":["q3QyrcfYtaEUJUy3dDMe3o"],"leftPoint":[16.217972334316947,5.490428888324284,0.1],"rightPoint":[-0.5370305855194735,5.490428888324285,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"ajX6DE1iwh52m5aYDEnUZw","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gvRT2kUN1YoGCZrBAosc54","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":16.217972334316944,"cy":-4.464643680942036,"cz":19.195539088325102,"lx":19.91014513853265,"ly":0.1,"lz":40,"leftJoints":["vZvx6xJpNjwVutXgBYTqDu"],"rightJoints":["ajX6DE1iwh52m5aYDEnUZw"],"leftPoint":[16.21797233431694,-14.41971625020836,0.1],"rightPoint":[16.217972334316947,5.490428888324284,0.1],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"aJzBKycDgPV2XFyreGUWbN","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gvRT2kUN1YoGCZrBAosc54","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Window","cx":-0.3867375122795052,"cy":0.1,"cz":0.10625,"lx":0.22099286415971733,"ly":0.3,"lz":0.7125,"mullion":true,"mullionWidth":0.06,"mullionSpacing":3,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wAVcmtVfsGGWzQD4FYwZNW","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.44375,"lx":0.47714368398120766,"ly":0.3,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"u5BLpPtdFZZZhqt5769cX6","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.44375,"lx":0.10045130189078055,"ly":0.3,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3kDRvtG74CSaYS7Hdz4Zf9","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-0.537030585519473,"cy":-4.46464368094204,"cz":2.228839888904333,"lx":19.91014513853265,"ly":0.1,"lz":40,"leftJoints":["ajX6DE1iwh52m5aYDEnUZw"],"rightJoints":["vZvx6xJpNjwVutXgBYTqDu"],"leftPoint":[-0.5370305855194735,5.490428888324285,0.1],"rightPoint":[-0.5370305855194752,-14.419716250208367,0.1],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"q3QyrcfYtaEUJUy3dDMe3o","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gvRT2kUN1YoGCZrBAosc54","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Wall","cx":7.840470874398735,"cy":-14.419716250208364,"cz":11.720703078908016,"lx":16.75500291983642,"ly":0.1,"lz":40,"leftJoints":["q3QyrcfYtaEUJUy3dDMe3o"],"rightJoints":["aJzBKycDgPV2XFyreGUWbN"],"leftPoint":[-0.5370305855194752,-14.419716250208367,0.1],"rightPoint":[16.21797233431694,-14.41971625020836,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"vZvx6xJpNjwVutXgBYTqDu","parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gvRT2kUN1YoGCZrBAosc54","selected":false,"leftRoofHeight":40,"rightRoofHeight":40,"locked":false,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":40,"rightTopPartialHeight":40},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.44375,"lx":0.4774693289088429,"ly":0.3,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jqoCSv6SGc3CUNj2d3NntP","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3879438297384349,"cy":0.1,"cz":0.44375,"lx":0.11936733222721073,"ly":0.3,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fHoEdLPaiDXqCueBgeDdLS","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.36813175214922683,"cy":0.1,"cz":0.10500000000000001,"lx":0.24254861996467425,"ly":0.3,"lz":0.7150000000000001,"mullion":true,"mullionWidth":0.06,"mullionSpacing":3,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"cDtJU4W55HjRmy9cDhmm6R","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jett","cx":22.405208091244,"cy":-4.9072672102145285,"cz":0.07500000298023225,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"fbbzRkZEo4AnT3QEsWR9oP","selected":false},{"type":"Foundation","cx":9.883909213954574,"cy":18.92966595365953,"cz":0.075,"lx":78.43901005555475,"ly":71.09926407060658,"lz":0.15,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"hM4gzHVfAcT1HDeDhXqfQE","selected":false,"locked":false,"enableGroupMaster":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["q3QyrcfYtaEUJUy3dDMe3o","vZvx6xJpNjwVutXgBYTqDu","aJzBKycDgPV2XFyreGUWbN","ajX6DE1iwh52m5aYDEnUZw"],"textureType":"No Roof Texture","color":"#666666","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","id":"gvRT2kUN1YoGCZrBAosc54","locked":false,"sideColor":"#666666","rise":0,"ceiling":false},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.3,"lz":0.04999999999999994,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#999999","tint":"#009ce0","opacity":0.9,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"hXDYrzLkVvDyB5XjtNmnpF","locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.36875,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"rG1B3YDka8evv1iRX84o9o","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.2937500000000002,"lx":0.4774693289088429,"ly":0.1,"lz":0.037499999999999645,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3UNoma1dXsmygDK7CEMoeK","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.21875,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sd3EQKPdzkdU4oHrJHF6z6","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.14375,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tdS8P8P3u1nFnMkc5rhziK","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":0.06875,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fot8pwtoi6ibSjPGupS1qv","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":-0.00625,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"6EhGwMTuUYnqbTApuPextU","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":-0.08125,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mQ1vMy6wk1K8zQ4XW25Pa4","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":-0.15625,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"xeQKnySzuUrMzG5a16tLkb","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.029841833056802682,"cy":0.1,"cz":-0.23125,"lx":0.4774693289088429,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5XDU9fVCRxTJLcDoUD9Lh9","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["8XDG3EHsQoX26MhuzwMYUM","2u4Fe7xnA6kkXXVGrQ4eyJ","skm8dNPSkFaVkoUwiPNfq1","cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"No Roof Texture","color":"#666666","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"1rg4qXk51s2D35ph8XqwbD","sideColor":"#666666","rise":0,"ceiling":false},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"veFj2RPH9FK5Ao9iDG2JPQ","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sjoT9VNZjDkgezWwtsvX1H","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"c3CrejqQvGUvB3tz2qUtSs","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"54CDd5MyTY1sZku1AxjXiV","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bnfcGzXENjbkzh9kkmgCt1","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"hLoimJgy8UQ7UMWdnPWQDr","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"7HFCb3ZQu4czKjDhFmnHch","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"qWx6AJBVMGYPJ4Ho1LMQem","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9CtXe67uSkntiJK3PdfzmF","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jmVdqwU3fqhEGk97aQXYEX","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wdnnALggwiP7UHfVhF7SWW","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9qSb4G4eXKMLNk6b2Mnxjd","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fbXTujX2nC1dnrTNLQQaH2","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"kPmU38jjwSfUUZCv9WNCNC","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"miYw9uqZnfLViAeihqKiQU","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mdv9UVbG7EBitFdaYUkjsg","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"urvoEGE7cTq18MHrjMtEta","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aG4F7poaBiKo4FnvkesMid","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"dpGTcBMRjsfms2X9nZ4kXB","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"r72et61W5MhwpaYEF75Lh8","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"kfBYaXYAWc8NFLir41LMUf","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sZ9pExZ3wnnmg8ersouQqR","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"hsgq2SXxdCMQRiXuigpEnf","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4cJ8Pgng6fBXRTX8WcXQVg","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bsGPA2UqEVe6SNCXBuagSF","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"qoRwFevwZ3YYSnDdJLoDqH","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4WEcGq6tGKDXcjGfvF3Tqi","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ofgYdgnyE5KuECDZGdmjFD","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pHYCjB2xdehwowhrgYcS5c","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3Q2Wqp4rsyN89CVgnpPKCM","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"oVMnTwRZ8JUb44CXEkjBYL","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"awSE1XUqEZc7Ryyr6ZQ76Y","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"rVMR7tb7kXRnjoKHu2uyrZ","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ktvktsYRNrNC4YQGJQ65Vk","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mDgZnRfoyVP2YKQSiG96yP","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"rZqeq8wo58QSrFmB3rpFBD","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"kQER8EGDmLkbzKEnbH9AdE","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pHvp5WhRnmKrP1SER1BBPx","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aZrgq675xDvSLbDtUdwQsY","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jKtw1tdxJxcJphjEsWRmNW","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jgu4jSQaAhhuBZyZoH81Vw","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gL3MbkYAkwWqHwKNVFfvjX","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"43vK33D69FP5XTqiRyn5ZC","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5CKwKV9BkacegVoEPzvmNN","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"6dszW4NvJ7dea2hEqvWvWt","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5wUE7YuTr5FaL5BKb5taCi","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gUSBkoburdStT335zZGKSH","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"qaz6Ru4mqUG7iJ4Ycd7F9n","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aC9jXjoijXwkzJe9GEmTWi","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"w4NVxvubCEgR8AigUi47sf","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"c2FMW9zjWRExPvuVGBX4HW","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"66P3KrsZHSZo36fXBYj8qX","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"kNFB5Lqn3mkhGj4vWLcpup","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"egzr7tMm23v6EusXDcg5hk","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fg88qYi3xQqiUry3XoMG94","parentId":"cV8MyCuhWAsvEyyFuVqVqg","foundationId":"m7AH7DcnoGzAq9kryBy4RS","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3879438297384349,"cy":0.1,"cz":0.36875,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tfzr5KT4W9PhBL9cJ8zsaA","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":0.29375,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"i6H6Xevamb9d4oXjeQCCVQ","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":0.21875,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5XFRaVZReMkHmTkTRTsRuW","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":0.14375,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"57X6pPozmTcJNsHjWMZ2XK","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":0.06875,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8bZz4FqqQe2bdV4WSMC6jm","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.39520439262152746,"cy":0.1,"cz":-0.006462001517518967,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gFyWDsDvxmZLpfKAZSAYx5","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":-0.08125,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aEb8cJ6YhMAb9KuP8VjgKP","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":-0.15625,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"vWo8aVFrScBkGwhkRkYbFw","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.38794382973843494,"cy":0.1,"cz":-0.23125,"lx":0.11936733222721067,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ukpSgR2RV34eo2XfZVmUQx","parentId":"vZvx6xJpNjwVutXgBYTqDu","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.36875,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"12QeRFNV1Hc4sRbkxeVHBz","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.29375,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"aEhEPB9abuMwcNR6YEDDzo","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.21875,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bahcDPtF8RkBJeqyW4uoBW","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.14375,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"j8CVLpwpSN8q6CwaZNU8f2","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":0.06875,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"xaiGSGs8MoAP2yqunEFz1t","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":-0.00625,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"2mWxcnyFJtKcRwpimCotCD","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":-0.08125,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"7fehkUWZ89tU27wVPAaQiD","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":-0.15625,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"cLjpkvrCHbUZQvi2ugMz7m","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06278206368173785,"cy":0.1,"cz":-0.23125,"lx":0.47714368398120766,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"775gLWKQ2CDxL24uAyMuJh","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.36875,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sG6LtKnafZHdzPAsvV8PYJ","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.29375,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3JLF3stSYMjoSYPebvZ4PV","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.21875,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"hs4CReuowYw4vhbQaajr1c","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.14375,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"7q37MBnhP8o81q6wk5b4ev","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":0.06875,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fYYQri43bTWAWzKm8CTjgx","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":-0.00625,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"vVphvZY7TyNxocgdqGbqJG","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":-0.08125,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"1x6vFAj3oANsndJiQWQqch","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":-0.15625,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"amqZLKSwPYeveasoE38xPf","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4018052075631222,"cy":0.1,"cz":-0.23125,"lx":0.10045130189078055,"ly":0.1,"lz":0.0375,"mullion":true,"mullionWidth":0.06,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.08,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8pqGLYqiyyd3o5U4oTyKWQ","parentId":"aJzBKycDgPV2XFyreGUWbN","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-0.6029509196285296,"cy":4.363723699614781,"cz":2.2408122612280286,"lx":38.83648396698225,"ly":0.1,"lz":8,"leftJoints":["buJzWWqdvseWMEsfiYMLMP"],"rightJoints":["8SHv6CAA9xkRcfdve2aKJD"],"leftPoint":[18.815291063862595,4.363723699614781,0.02095211693261273],"rightPoint":[-20.021192903119655,4.363723699614781,0.02095211693261273],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"pbHN78JfkaYPi761T2RspW","parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pHTF23CfLXLueNE1tagt35","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":18.815291063862578,"cy":2.495382831879124,"cz":2.2301039869226305,"lx":3.736681735471314,"ly":0.1,"lz":8,"leftJoints":["cthH5Q4t9AqYehpe6ssXrf"],"rightJoints":["pbHN78JfkaYPi761T2RspW"],"leftPoint":[18.815291063862563,0.627041964143467,0.02095211693261273],"rightPoint":[18.815291063862595,4.363723699614781,0.02095211693261273],"relativeAngle":1.5707963267948881,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"buJzWWqdvseWMEsfiYMLMP","parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pHTF23CfLXLueNE1tagt35","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-20.021192903119655,"cy":2.495382831879124,"cz":2.228839888904333,"lx":3.736681735471314,"ly":0.1,"lz":8,"leftJoints":["pbHN78JfkaYPi761T2RspW"],"rightJoints":["cthH5Q4t9AqYehpe6ssXrf"],"leftPoint":[-20.021192903119655,4.363723699614781,0.02095211693261273],"rightPoint":[-20.021192903119655,0.627041964143467,0.02095211693261273],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"8SHv6CAA9xkRcfdve2aKJD","parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pHTF23CfLXLueNE1tagt35","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-0.6029509196285296,"cy":0.627041964143467,"cz":2.268765007024547,"lx":38.83648396698225,"ly":0.1,"lz":8,"leftJoints":["8SHv6CAA9xkRcfdve2aKJD"],"rightJoints":["buJzWWqdvseWMEsfiYMLMP"],"leftPoint":[-20.021192903119655,0.627041964143467,0.02095211693261273],"rightPoint":[18.815291063862595,0.627041964143467,0.02095211693261273],"relativeAngle":0,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"id":"cthH5Q4t9AqYehpe6ssXrf","parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pHTF23CfLXLueNE1tagt35","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"id":"pHTF23CfLXLueNE1tagt35","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"qxAJALKsgHR99QXiiey2Jy","foundationId":"qxAJALKsgHR99QXiiey2Jy","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["buJzWWqdvseWMEsfiYMLMP","pbHN78JfkaYPi761T2RspW","8SHv6CAA9xkRcfdve2aKJD","cthH5Q4t9AqYehpe6ssXrf"],"selected":false,"sideColor":"#666666","rise":0,"ceiling":false},{"type":"Foundation","cx":-2.457987770512858,"cy":8.5745044622651,"cz":0.05,"lx":43.13213840818644,"ly":9.617341850294016,"lz":0.02095211693261273,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"qxAJALKsgHR99QXiiey2Jy","selected":false},{"type":"Window","cx":0.23817810098010178,"cy":0.1,"cz":-0.03125,"lx":0.5021051858499441,"ly":0.1,"lz":0.8125,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#999999","tint":"#4d4d4d","opacity":0.9,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","id":"wvo4rWSpdYajq7orMpbxwv","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.1094331815313981,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#999999","tint":"#4d4d4d","opacity":0.9,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","id":"7yzuNTr1nHZ9M3xoVT6avS","windowType":"Default","archHeight":1},{"type":"Window","cx":-0.4570444640428979,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5QTwW8m9wGX6HGnbLPxKyJ","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.39910925029098127,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"hs42cyfWo4jmy3NRKUXRUF","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3411740365390646,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"xwaNrD73kLoXPJvKgQmEMf","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2832388227871479,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5fsUwbpNYhCT9veH1pJuBb","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.22530360903523122,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"67uFrhX3jmZgG5Uwx5UZkn","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.16736839528331454,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9c8dBuEjRjp1p1S8dhEcnt","parentId":"cthH5Q4t9AqYehpe6ssXrf","foundationId":"qxAJALKsgHR99QXiiey2Jy","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-1.4056682810734662,"cy":6.875194394376913,"cz":2.2408122612280286,"lx":25.078696453594382,"ly":0.1,"lz":30,"leftJoints":["dzHmrowq7VzT13tXyJ2UqF"],"rightJoints":["pHKTjESURrdXxEMpYFEvmj"],"leftPoint":[11.133679945723728,6.875194394376912,0.1],"rightPoint":[-13.945016507870662,6.875194394376912,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"sVQKrHhSTfNeVTVVzVgh8h","parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"njRXPjHAzFuEQzFQaKio93","selected":false,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":11.13367994572371,"cy":0.9024721105600149,"cz":2.2301039869226305,"lx":11.945444567633803,"ly":0.1,"lz":30,"leftJoints":["knjx4z8fKUVQF38Tr2D5YR"],"rightJoints":["sVQKrHhSTfNeVTVVzVgh8h"],"leftPoint":[11.1336799457237,-5.070250173256886,0.1],"rightPoint":[11.133679945723728,6.875194394376912,0.1],"relativeAngle":1.5707963267948946,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"dzHmrowq7VzT13tXyJ2UqF","parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"njRXPjHAzFuEQzFQaKio93","selected":false,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-13.945016507870664,"cy":0.9024721105600122,"cz":2.228839888904333,"lx":11.945444567633803,"ly":0.1,"lz":30,"leftJoints":["sVQKrHhSTfNeVTVVzVgh8h"],"rightJoints":["knjx4z8fKUVQF38Tr2D5YR"],"leftPoint":[-13.945016507870662,6.875194394376912,0.1],"rightPoint":[-13.945016507870662,-5.070250173256887,0.1],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"pHKTjESURrdXxEMpYFEvmj","parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"njRXPjHAzFuEQzFQaKio93","selected":false,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-1.4056682810734649,"cy":-5.0702501732568885,"cz":2.268765007024547,"lx":25.078696453594382,"ly":0.1,"lz":30,"leftJoints":["pHKTjESURrdXxEMpYFEvmj"],"rightJoints":["dzHmrowq7VzT13tXyJ2UqF"],"leftPoint":[-13.945016507870662,-5.070250173256887,0.1],"rightPoint":[11.13367994572373,-5.070250173256887,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"knjx4z8fKUVQF38Tr2D5YR","parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"njRXPjHAzFuEQzFQaKio93","selected":false,"leftRoofHeight":30,"rightRoofHeight":30,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"uJ5VXB9mJCHeVMURUphT8T","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wnK1hkWv21nCd1Utptm2Ei","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pEvywZty9TJkaURwjtVySg","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tWq4HyTuGAuAN6dd6GPS2N","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"24XsGn6puXsJxiC1CXzcBv","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pkcczmXvVUiEdpQApgmexY","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"sa92opTQVGVahjcKdrQYNu","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"75MHEhXJJecJXb1MEFATcp","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.4583333333333333,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"6nqrXQt9q6iMswTzGidgHb","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"b1foK7N1uzozAzTNBXGmZB","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"nJJ7PvwzGmhWVcxY9bet36","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"vj5w5TDBurYnrHfJcc9FLw","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"qYve9T714wdvYeg4ZURztj","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"u95CGNREXr1JhsDomK6oUP","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"h31BtoerjLiQ4Ph2duYsTc","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.35833333333333334,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9dxvQwRi6mWsaWRPC67F9D","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"rjRNUHYRmb3eWDV9hgNPgk","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"9S42HWD1ZPYw28WUgncNJg","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"6z3whdKeQxDdJsZmhQ5kkh","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"oJTfPHNAtBzrf2iJENqHK6","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"31jBrsSiuVnoBUL9zp8ca6","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4MbQ64c8HUZrvfYs3kgE6b","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8EW5KxGCVAJwrRFzn2isg8","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.25833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pFyHWVuvzXQH1TQ1JhYRAx","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8AjjyhHzBJtzfxgCpuWX7d","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"s1sVDPm2cHt3fumjgcwoek","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wvpWMkzuKAKaviPUsqwQGa","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4inH8BAKWrcqZKNbaRb4ZX","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fsV7H7ZmN4jx2WUQX2f5zs","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"55E9hvsT1rzmJ6fT3m6NcG","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"uKLeQgpSELANVT2TRKNsAf","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.15833333333333335,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"nY9NDsN8rJhMi99gzYKtWJ","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5uo11zCRNj9YohSCdvoz6U","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"1Kr3EHJrBneewC46BaE2Ph","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ov5R5oyJBGiQGjspTURXyd","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jaeqZUoGssJAoAxW2E91xj","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"dYrh6yCuHp4rN3uYNhLJPq","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"eJmoE9srUeuBcYJBZHqYQ6","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wniuB8XsQisBLpGGqQxkBF","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":0.05833333333333336,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"o4XtWQqdKQ78Q8CKjzjKHW","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"7s5FfAfve61p7zKukxPALw","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"8gF1BVyyyBHomFZH7wzdah","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"e8uDpgzMYfsmnhjaNLhBhr","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fzA8v8aP7HzsfsJ5jvVku9","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gPBz88neav7bwpPYBatUzf","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bLjvQy84YUL9NshZ2ECHsZ","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"wy5NXYh5x3qLXD7T41WQtG","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":-0.04166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"urCTjPq8RemHnQPB5atkfH","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4386192887000486,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ijGpbm5vZNXcurEfDWRTEi","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3189958463273081,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"gFaxtGtjGoAmXwz4kcD2mV","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.19937240395456757,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"eNkrUnU9y5cm2pN62nhxuL","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.07974896158182704,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5xow2hbgFrKWpxhPpsF2oG","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.03987448079091349,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"ittnJX2spdpmthzEKvTSta","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.15949792316365402,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"h4grVoSbeCwgTF2pxNsMb8","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.27912136553639455,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"cSY4kfnQdndkFPFy82Fgbc","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3987448079091351,"cy":0.1,"cz":-0.14166666666666664,"lx":0.07974896158182702,"ly":0.1,"lz":0.04999999999999994,"mullion":true,"mullionWidth":0.1,"mullionSpacing":2,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tXgqNm5fVVjFB6dfyXDq3i","parentId":"knjx4z8fKUVQF38Tr2D5YR","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","tint":"#009ce0","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"id":"njRXPjHAzFuEQzFQaKio93","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"parentId":"bPEF7Uhqc8jpoTSmhKDVeo","foundationId":"bPEF7Uhqc8jpoTSmhKDVeo","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":1,"wallsId":["dzHmrowq7VzT13tXyJ2UqF","sVQKrHhSTfNeVTVVzVgh8h","pHKTjESURrdXxEMpYFEvmj","knjx4z8fKUVQF38Tr2D5YR"],"selected":false,"sideColor":"#666666","rise":0,"ceiling":false},{"type":"Foundation","cx":31.408586983997502,"cy":25.06147299717385,"cz":0.05,"lx":29.014724156297994,"ly":16.595208227167745,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"bPEF7Uhqc8jpoTSmhKDVeo","selected":false},{"type":"Wall","cx":-2.172089616054159,"cy":4.269527680689553,"cz":2.2408122612280286,"lx":38.83648396698225,"ly":0.1,"lz":8,"leftJoints":["sR2ork3jG2mR5nZkK6KFeD"],"rightJoints":["wRcqTTshgLb8rN6th4Gpqm"],"leftPoint":[17.246152367436963,4.269527680689554,0.02095211693261273],"rightPoint":[-21.590331599545284,4.2695276806895555,0.02095211693261273],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"k9HzM68Yarpc7nfmHcL8RX","parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pZTS1LtmxQ4iRLvvo2k6FG","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":17.24615236743695,"cy":2.4011868129538962,"cz":2.2301039869226305,"lx":3.736681735471314,"ly":0.1,"lz":8,"leftJoints":["3VZZxMzA1BHxrWmzs6HKLa"],"rightJoints":["k9HzM68Yarpc7nfmHcL8RX"],"leftPoint":[17.246152367436935,0.532845945218239,0.02095211693261273],"rightPoint":[17.246152367436963,4.269527680689554,0.02095211693261273],"relativeAngle":1.5707963267948881,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"sR2ork3jG2mR5nZkK6KFeD","parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pZTS1LtmxQ4iRLvvo2k6FG","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-21.590331599545284,"cy":2.4011868129538976,"cz":2.228839888904333,"lx":3.736681735471314,"ly":0.1,"lz":8,"leftJoints":["k9HzM68Yarpc7nfmHcL8RX"],"rightJoints":["3VZZxMzA1BHxrWmzs6HKLa"],"leftPoint":[-21.590331599545284,4.2695276806895555,0.02095211693261273],"rightPoint":[-21.590331599545284,0.5328459452182401,0.02095211693261273],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"wRcqTTshgLb8rN6th4Gpqm","parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pZTS1LtmxQ4iRLvvo2k6FG","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Wall","cx":-2.1720896160541585,"cy":0.5328459452182414,"cz":0.5,"lx":38.83648396698225,"ly":0.1,"lz":8,"leftJoints":["wRcqTTshgLb8rN6th4Gpqm"],"rightJoints":["sR2ork3jG2mR5nZkK6KFeD"],"leftPoint":[-21.590331599545284,0.5328459452182401,0.02095211693261273],"rightPoint":[17.246152367436963,0.532845945218239,0.02095211693261273],"relativeAngle":0,"textureType":"No Wall Texture","color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"id":"3VZZxMzA1BHxrWmzs6HKLa","parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pZTS1LtmxQ4iRLvvo2k6FG","selected":false,"leftRoofHeight":8,"rightRoofHeight":8,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"type":"Window","cx":-0.1094331815313981,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5Fjqy9y1YfpweWd3F1suvT","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.32829954459419425,"cy":0.1,"cz":-0.03125,"lx":0.3218622986217591,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"75HCZhhPHELWXwGW5h2WPD","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"id":"pZTS1LtmxQ4iRLvvo2k6FG","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#666666","normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"parentId":"mEAgnYYx5Vpv2wQEcaoDS8","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["sR2ork3jG2mR5nZkK6KFeD","k9HzM68Yarpc7nfmHcL8RX","wRcqTTshgLb8rN6th4Gpqm","3VZZxMzA1BHxrWmzs6HKLa"],"selected":false,"sideColor":"#666666","rise":0,"ceiling":false},{"type":"Foundation","cx":27.68901540648673,"cy":11.617892532194158,"cz":0.05,"lx":46.2704158010377,"ly":9.428949812443559,"lz":0.02095211693261273,"normal":[0,0,1],"rotation":[0,0,0.7980334087534946],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mEAgnYYx5Vpv2wQEcaoDS8","selected":false},{"type":"Window","cx":-0.05149796777948146,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"woWw7XGUm4xqUAFSTaxp7s","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.006437245972435182,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"p72g5k8odqsgTDtjZrUT8a","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.06437245972435182,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"pRepfQdGpU9sdbgLJsfdTe","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.12230767347626846,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5oab4a82csybhPKBpwXVfB","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.1802428872281851,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"buq5YaVMEosHyRoKSUbsVt","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23817810098010178,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"efAnUu4mYbWRhdGHs3mZi9","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.29611331473201846,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"jyJM6MGuMRcai6pbrb3Cin","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.35404852848393514,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5cDm82FkWrYhcDPVSU84Ve","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4119837422358518,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mC7TrBSkmqNWk58epxFszN","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.46991895598776845,"cy":0.1,"cz":-0.03125,"lx":0.03862347583461109,"ly":0.1,"lz":0.8125,"mullion":true,"mullionWidth":0.1,"mullionSpacing":5,"mullionColor":"#999999","frame":false,"frameWidth":0.05,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"eAGg5HRuXspYe6baEw1Pd4","parentId":"3VZZxMzA1BHxrWmzs6HKLa","foundationId":"mEAgnYYx5Vpv2wQEcaoDS8","tint":"#4d4d4d","opacity":0.9,"shutter":{"showLeft":false,"showRight":false,"color":"#aea1ff","width":0.3},"selected":false,"windowType":"Default","archHeight":1},{"type":"Tree","name":"Coconut","cx":29.772169703668084,"cy":3.13936308626816,"cz":0.075,"lx":14.520625349385156,"lz":15.546086109013482,"normal":[0,1,0],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"awZFHKX9S4YwAMjbSq1yte","selected":false},{"type":"Tree","name":"Coconut","flip":true,"cx":29.969020753546168,"cy":-14.890022732958304,"cz":0.075,"lx":11.801916444038328,"lz":14.712241097320083,"normal":[0,1,0],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"oXudTEZFdmZo2c8EsbRpo1","selected":false},{"type":"Tree","name":"Coconut","cx":30.340707732263212,"cy":22.863697403310276,"cz":0.075,"lx":11.799635641951403,"lz":18.03518550107995,"normal":[0,1,0],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"1PFc7JhaMeKKaCbh4JY7pw","selected":false},{"type":"Tree","name":"Coconut","flip":true,"cx":-5.622533214526047,"cy":-26.68161954425443,"cz":0.075,"lx":11.801916444038328,"lz":17.69875674824313,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"ghtAJzyWZvFaBBUqp1aRCj","selected":false},{"type":"Tree","name":"Coconut","flip":false,"cx":10.296218935380278,"cy":-27.603318709603634,"cz":0.075,"lx":8.431050051779376,"lz":14.44899202269211,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"g6oua2UeBCgiNbB146Y9vt","selected":false},{"type":"Tree","name":"Coconut","flip":true,"cx":25.84939972102471,"cy":-26.971930698353695,"cz":0.075,"lx":11.801916444038328,"lz":17.69875674824313,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"qX2bGrx3fNBzBZKpMfQVvM","selected":false},{"type":"Tree","name":"Coconut","flip":false,"cx":-20.99614909921928,"cy":-27.25943651847644,"cz":0.075,"lx":10.446668331936932,"lz":15.66063540678114,"normal":[0,0,1],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"vbLVgvpnWHhnRd9uUf7sV8","selected":false},{"type":"Human","name":"Jacqueline","cx":16.26014984241543,"cy":-19.603129566992923,"cz":0.075,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,-0.7727629180414017],"parentId":"hM4gzHVfAcT1HDeDhXqfQE","id":"1k2jiRJ9Za2yVNkgRYdhKs","selected":false,"ly":0.43},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":0.27624108019964655,"y":-0.5},{"x":0.27624108019964655,"y":-0.4625},{"x":0.5022565094539028,"y":-0.4625},{"x":0.5022565094539028,"y":-0.5}],"parentId":"aJzBKycDgPV2XFyreGUWbN","parentType":"Wall","foundationId":"hM4gzHVfAcT1HDeDhXqfQE","selected":false,"filled":true,"selectedIndex":0,"id":"hvwazXjoHjWT4TxByg9aJo","text":"OCEANIC","fontColor":"red","fontSize":1,"noOutline":true,"opacity":0}],"sceneRadius":90,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[20.405612129997095,28.227763446481866,0.000028229018151188892],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[20.405612129997095,28.22761343981447,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[37.702769068930394,-75.97521031128004,17.83040709876231],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":7.547072050706145,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#0c797d","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[15.19436480647435,27.872451314228233,14.077650267491105],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"directLightIntensity":2},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},470:function(e){e.exports=JSON.parse('{"docid":"iTjDf3ar2Wi1xMDNhVPun5","time":"02/03/2023 08:02 pm","timestamp":1675472536455,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"daysPerYear":4,"noAnimationForSolarPanelSimulation":true,"longitude":-73.177891,"sutTimesPerHour":4,"noAnimationForSolarUpdraftTowerSimulation":false,"diurnalTemperatureModel":1,"discretization":"Approximate","sutDaysPerYear":4,"sutGridCellSize":1,"cspTimesPerHour":4,"highestTemperatureTimeInMinutes":900,"pvGridCellSize":0.5,"noAnimationForSensorDataCollection":false,"name":"default","cspGridCellSize":0.5,"dustLoss":0.05,"solarRadiationHeatmapGridCellSize":5,"latitude":44.454924,"cspDaysPerYear":4,"date":"5/22/2022, 1:00:00 PM","address":"550 Dorset St, South Burlington, VT 05403, USA","ground":{"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3},"airAttenuationCoefficient":0.01,"solarPanelVisibilityGridCellSize":0.2,"timesPerHour":2,"airConvectiveCoefficient":5,"noAnimationForHeatmapSimulation":true},"elements":[{"rotation":[0,0,0.11344640137963143],"lx":42.0955259862511,"cy":-46.54215234653224,"type":"Cuboid","ly":34.92675303840907,"id":"qsPqX4eMRADWLb6uFzZyu3","cz":6.5,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","locked":true,"selected":false,"cx":1.8084891171279258,"color":"#e27300","lz":13,"faceColors":["#e27300","#e27300","#e27300","#e27300","#d0d7da","gray"],"normal":[0,0,1]},{"rotation":[0,0,0.11344640137963143],"type":"Cuboid","ly":3.86445911605994,"faceColors":["#e27300","#e27300","#e27300","#e27300","#eff3f4","gray"],"id":"15SnZzWbRga2YXQjrHrMoH","locked":true,"parentId":"Ground","cx":23.280210785776593,"color":"#e27300","cz":3.5,"selected":false,"normal":[0,0,1],"lz":7,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":-63.54853637545297,"lx":12.707438928677645},{"cx":-33.686845121145325,"ly":21.436523356683622,"id":"jeaVPPnZw5Ed7yuuYuFjT4","cz":3.5,"color":"#e27300","locked":true,"lx":60,"parentId":"Ground","type":"Cuboid","selected":false,"cy":5.924352450279141,"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","Facade #1","Facade #1","No Facade Texture","No Facade Texture"],"lz":7,"rotation":[0,0,-0.22689280275926285],"faceColors":["#e27300","#e27300","#e27300","#e27300","#dadedf","gray"]},{"locked":true,"lz":7,"selected":false,"rotation":[0,0,0.47123889803846897],"lx":70,"faceColors":["#e27300","#e27300","#e27300","#e27300","#dadedf","gray"],"ly":22.005759208164513,"parentId":"Ground","cy":16.732974312474486,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"w8SzPJTBSBctdCdhPMiQ8Y","color":"#e27300","type":"Cuboid","normal":[0,0,1],"cx":34.50919214417893,"cz":3.5},{"lz":0.1,"normal":[0,0,1],"locked":true,"type":"Foundation","cz":0.05,"ly":33.24144899129459,"rotation":[0,0,0.11344640137963143],"parentId":"Ground","selected":false,"cy":6.225878764069708,"solarUpdraftTower":{},"solarAbsorberPipe":{},"id":"pAENrJmYZCM1ckJVXJhbjf","cx":-3.0110805900742577,"solarPowerTower":{},"lx":33.143096812026116},{"cy":13,"rotation":[0,0,0],"leftRoofHeight":8,"id":"etH6khoAQcue7DhdL3hKE4","windows":[],"type":"Wall","leftPoint":[7.5,12,0],"lineWidth":0.2,"leftJoints":["8bjxpu3YEF3xWPcrbQwkhJ"],"ly":0.3,"rightJoints":["kDgsBFAdDRYMKBfw4NrZmC"],"color":"#e27300","lx":8.24621125123532,"relativeAngle":2.896613990462928,"normal":[0,0,1],"showLabel":false,"lz":8,"cx":3.5000000000000004,"textureType":"Wall Texture Default","rightPoint":[-0.49999999999999944,14,0],"lineColor":"black","roofId":"k6bth8F9WX1VG1Z9xWAtQv","selected":false,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","rightRoofHeight":8,"parentId":"pAENrJmYZCM1ckJVXJhbjf","locked":true,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"relativeAngle":1.9379701606131157,"rightJoints":["etH6khoAQcue7DhdL3hKE4"],"cx":10,"lx":13.928388277184117,"leftPoint":[12.5,-1,0],"normal":[0,0,1],"id":"8bjxpu3YEF3xWPcrbQwkhJ","roofId":"k6bth8F9WX1VG1Z9xWAtQv","type":"Wall","rightPoint":[7.5,11.999999999999998,0],"lineColor":"black","textureType":"Wall Texture Default","leftJoints":["78z2ecrQQgcHrHfygTZ9jK"],"leftRoofHeight":8,"rightRoofHeight":8,"showLabel":false,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","cy":5.499999999999999,"color":"#e27300","lz":8,"cz":0,"windows":[],"selected":false,"rotation":[0,0,0],"locked":true,"ly":0.3,"parentId":"pAENrJmYZCM1ckJVXJhbjf","lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"lineWidth":0.2,"normal":[0,0,1],"selected":false,"cx":11.75,"rightPoint":[12.5,-1,0],"rightJoints":["8bjxpu3YEF3xWPcrbQwkhJ"],"id":"78z2ecrQQgcHrHfygTZ9jK","rotation":[0,0,0],"textureType":"Wall Texture Default","leftJoints":["mDkaCjWbyiM41dnmEVWdxy"],"parentId":"pAENrJmYZCM1ckJVXJhbjf","windows":[],"leftPoint":[11,-10.5,0],"leftRoofHeight":8,"lx":9.617692030835672,"lineColor":"black","lz":8,"color":"#e27300","foundationId":"pAENrJmYZCM1ckJVXJhbjf","locked":true,"showLabel":false,"roofId":"k6bth8F9WX1VG1Z9xWAtQv","relativeAngle":1.4141944498128813,"rightRoofHeight":8,"ly":0.3,"cz":0,"type":"Wall","cy":-5.75,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"rotation":[0,0,0],"relativeAngle":3.402195045337134,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","cx":-4.249999999999999,"cy":13,"color":"#e27300","lineWidth":0.2,"lineColor":"black","showLabel":false,"textureType":"Wall Texture Default","rightJoints":["hK2wY1qjEVKHhT5eT1oyYc"],"locked":true,"windows":[],"rightPoint":[-8,12,0],"lz":8,"id":"kDgsBFAdDRYMKBfw4NrZmC","type":"Wall","leftJoints":["etH6khoAQcue7DhdL3hKE4"],"lx":7.762087348130014,"ly":0.3,"rightRoofHeight":8,"selected":false,"parentId":"pAENrJmYZCM1ckJVXJhbjf","cz":0,"leftPoint":[-0.49999999999999856,14,0],"leftRoofHeight":8,"roofId":"k6bth8F9WX1VG1Z9xWAtQv","normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"ly":0.3,"locked":true,"showLabel":false,"leftRoofHeight":8,"cx":-9.75,"rightRoofHeight":8,"rotation":[0,0,0],"id":"hK2wY1qjEVKHhT5eT1oyYc","leftJoints":["kDgsBFAdDRYMKBfw4NrZmC"],"cz":0,"relativeAngle":4.375714160997962,"leftPoint":[-8.000000000000002,11.999999999999998,0],"normal":[0,0,1],"textureType":"Wall Texture Default","cy":6.999999999999999,"lz":8,"windows":[],"foundationId":"pAENrJmYZCM1ckJVXJhbjf","rightJoints":["b4LV4TTeCfWqyehosbTDfi"],"lx":10.594810050208544,"rightPoint":[-11.5,2,0],"color":"#e27300","selected":false,"type":"Wall","parentId":"pAENrJmYZCM1ckJVXJhbjf","roofId":"k6bth8F9WX1VG1Z9xWAtQv","lineWidth":0.2,"lineColor":"black","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"lineColor":"black","roofId":"k6bth8F9WX1VG1Z9xWAtQv","normal":[0,0,1],"rightRoofHeight":8,"lz":8,"cy":-12.749999999999998,"ly":0.3,"id":"mDkaCjWbyiM41dnmEVWdxy","leftPoint":[1,-15,0],"lx":10.965856099730656,"textureType":"Wall Texture Default","type":"Wall","showLabel":false,"rightPoint":[11,-10.499999999999996,0],"rightJoints":["78z2ecrQQgcHrHfygTZ9jK"],"lineWidth":0.2,"selected":false,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","rotation":[0,0,0],"color":"#e27300","cx":6,"relativeAngle":0.4228539261329409,"locked":true,"parentId":"pAENrJmYZCM1ckJVXJhbjf","windows":[],"cz":0,"leftJoints":["2og8Xo997HNRwLdj5mnKCf"],"leftRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"normal":[0,0,1],"leftPoint":[-11.499999999999998,2,0],"rightRoofHeight":8,"leftJoints":["hK2wY1qjEVKHhT5eT1oyYc"],"parentId":"pAENrJmYZCM1ckJVXJhbjf","lx":12.257650672131263,"type":"Wall","selected":false,"lz":8,"cx":-10.25,"relativeAngle":4.917784369574457,"id":"b4LV4TTeCfWqyehosbTDfi","rightJoints":["2og8Xo997HNRwLdj5mnKCf"],"leftRoofHeight":8,"rightPoint":[-9,-10,0],"color":"#e27300","foundationId":"pAENrJmYZCM1ckJVXJhbjf","ly":0.3,"cz":0,"rotation":[0,0,0],"showLabel":false,"locked":true,"cy":-4,"lineColor":"black","roofId":"k6bth8F9WX1VG1Z9xWAtQv","windows":[],"textureType":"Wall Texture Default","lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"ly":0.3,"leftPoint":[-8.999999999999996,-9.999999999999996,0],"foundationId":"pAENrJmYZCM1ckJVXJhbjf","rotation":[0,0,0],"cz":0,"textureType":"Wall Texture Default","lx":11.180339887498947,"roofId":"k6bth8F9WX1VG1Z9xWAtQv","rightJoints":["mDkaCjWbyiM41dnmEVWdxy"],"showLabel":false,"id":"2og8Xo997HNRwLdj5mnKCf","lineWidth":0.2,"lz":8,"windows":[],"normal":[0,0,1],"parentId":"pAENrJmYZCM1ckJVXJhbjf","selected":false,"cy":-12.499999999999998,"locked":true,"leftJoints":["b4LV4TTeCfWqyehosbTDfi"],"color":"#e27300","cx":-3.9999999999999982,"lineColor":"black","rightPoint":[1,-15,0],"relativeAngle":5.81953769817878,"leftRoofHeight":8,"type":"Wall","rightRoofHeight":8,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":8,"rightTopPartialHeight":8},{"cz":0,"locked":true,"selected":false,"cx":0,"type":"Roof","id":"k6bth8F9WX1VG1Z9xWAtQv","wallsId":["8bjxpu3YEF3xWPcrbQwkhJ","etH6khoAQcue7DhdL3hKE4","kDgsBFAdDRYMKBfw4NrZmC","hK2wY1qjEVKHhT5eT1oyYc","b4LV4TTeCfWqyehosbTDfi","2og8Xo997HNRwLdj5mnKCf","mDkaCjWbyiM41dnmEVWdxy","78z2ecrQQgcHrHfygTZ9jK"],"textureType":"No Roof Texture","thickness":0.2,"showLabel":false,"lineWidth":0.2,"lineColor":"black","normal":[0,0,1],"roofType":"Pyramid","lx":0,"color":"#bbc0c4","parentId":"pAENrJmYZCM1ckJVXJhbjf","rotation":[0,0,0],"ly":0,"cy":0,"foundationId":"pAENrJmYZCM1ckJVXJhbjf","lz":0,"sideColor":"#bbc0c4","rise":0,"ceiling":false},{"id":"bJhvoWT5frHADN5rpErFAp","type":"Foundation","solarUpdraftTower":{},"parentId":"Ground","solarAbsorberPipe":{},"locked":true,"ly":20.929643657953434,"cx":-14.3191636352593,"lx":30.96479094015392,"lz":0.1,"normal":[0,0,1],"solarPowerTower":{},"cy":-19.246790495991178,"selected":false,"cz":0.05,"rotation":[0,0,0.11344640137963143]},{"showLabel":false,"selected":false,"leftJoints":["u3McT1xxp22V2ArAdyDW3J"],"windows":[],"textureType":"Wall Texture Default","foundationId":"bJhvoWT5frHADN5rpErFAp","rotation":[0,0,0],"normal":[0,0,1],"lz":12,"relativeAngle":2.8068558162729786,"id":"wERFjjYFCWERMhNEB9iuoK","cz":0,"type":"Wall","lineWidth":0.2,"leftRoofHeight":12,"locked":true,"parentId":"bJhvoWT5frHADN5rpErFAp","color":"#e27300","ly":0.3,"rightRoofHeight":12,"lineColor":"black","leftPoint":[12.5,5.5,0],"cx":6.75,"rightPoint":[0.9999999999999996,9.5,0],"rightJoints":["7dQxN3e4X8QdrAXYYEN8WG"],"cy":7.5,"roofId":"nGgWDMiF4t3mFWmEvV3G6V","lx":12.175795661885921,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"color":"#e27300","leftJoints":["pcWBDfha4S8aWQ8R18i4nV"],"foundationId":"bJhvoWT5frHADN5rpErFAp","rotation":[0,0,0],"lz":12,"id":"u3McT1xxp22V2ArAdyDW3J","parentId":"bJhvoWT5frHADN5rpErFAp","lineColor":"black","cz":0,"cy":-4.440892098500626e-16,"leftRoofHeight":12,"relativeAngle":1.5707963267948966,"lx":11,"selected":false,"locked":true,"ly":0.3,"rightRoofHeight":12,"textureType":"Wall Texture Default","roofId":"nGgWDMiF4t3mFWmEvV3G6V","windows":[],"normal":[0,0,1],"leftPoint":[12.5,-5.5,0],"type":"Wall","rightJoints":["wERFjjYFCWERMhNEB9iuoK"],"showLabel":false,"cx":12.5,"rightPoint":[12.5,5.499999999999999,0],"lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"normal":[0,0,1],"lineWidth":0.2,"lx":11.067971810589325,"windows":[],"selected":false,"textureType":"Wall Texture Default","cx":7.249999999999998,"rightPoint":[12.499999999999996,-5.499999999999999,0],"cz":0,"id":"pcWBDfha4S8aWQ8R18i4nV","showLabel":false,"relativeAngle":0.32175055439664213,"parentId":"bJhvoWT5frHADN5rpErFAp","leftPoint":[2,-9,0],"rightRoofHeight":12,"rightJoints":["u3McT1xxp22V2ArAdyDW3J"],"foundationId":"bJhvoWT5frHADN5rpErFAp","lineColor":"black","leftRoofHeight":12,"roofId":"nGgWDMiF4t3mFWmEvV3G6V","rotation":[0,0,0],"color":"#e27300","type":"Wall","ly":0.3,"cy":-7.25,"leftJoints":["6ue5PfovkzS53Qu47dbJ2S"],"lz":12,"locked":true,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"windows":[],"leftJoints":["wERFjjYFCWERMhNEB9iuoK"],"roofId":"nGgWDMiF4t3mFWmEvV3G6V","showLabel":false,"cx":-5.5,"relativeAngle":3.541833310623767,"normal":[0,0,1],"rightRoofHeight":12,"lz":12,"leftPoint":[0.9999999999999996,9.5,0],"parentId":"bJhvoWT5frHADN5rpErFAp","locked":true,"lineColor":"black","id":"7dQxN3e4X8QdrAXYYEN8WG","rightPoint":[-12,4,0],"rightJoints":["1kwWJQEGgHXq1W18rzcYh4"],"lineWidth":0.2,"selected":false,"rotation":[0,0,0],"lx":14.115594213493104,"cy":6.75,"foundationId":"bJhvoWT5frHADN5rpErFAp","color":"#e27300","leftRoofHeight":12,"cz":0,"ly":0.3,"type":"Wall","textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cz":0,"foundationId":"bJhvoWT5frHADN5rpErFAp","leftJoints":["7dQxN3e4X8QdrAXYYEN8WG"],"windows":[],"leftRoofHeight":12,"normal":[0,0,1],"selected":false,"roofId":"nGgWDMiF4t3mFWmEvV3G6V","rightRoofHeight":12,"relativeAngle":4.71238898038469,"cx":-12,"color":"#e27300","parentId":"bJhvoWT5frHADN5rpErFAp","id":"1kwWJQEGgHXq1W18rzcYh4","lx":8.499999999999998,"textureType":"Wall Texture Default","type":"Wall","locked":true,"lineWidth":0.2,"rightJoints":["6ue5PfovkzS53Qu47dbJ2S"],"showLabel":false,"lineColor":"black","rotation":[0,0,0],"leftPoint":[-11.999999999999998,3.9999999999999982,0],"lz":12,"cy":-0.2500000000000009,"rightPoint":[-12,-4.5,0],"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cx":-4.999999999999997,"lx":14.705441169852739,"windows":[],"lz":12,"rightPoint":[2,-9,0],"locked":true,"ly":0.3,"rotation":[0,0,0],"lineWidth":0.2,"normal":[0,0,1],"color":"#e27300","roofId":"nGgWDMiF4t3mFWmEvV3G6V","id":"6ue5PfovkzS53Qu47dbJ2S","leftPoint":[-11.999999999999995,-4.499999999999997,0],"textureType":"Wall Texture Default","rightRoofHeight":12,"foundationId":"bJhvoWT5frHADN5rpErFAp","showLabel":false,"leftRoofHeight":12,"lineColor":"black","cy":-6.749999999999998,"leftJoints":["1kwWJQEGgHXq1W18rzcYh4"],"parentId":"bJhvoWT5frHADN5rpErFAp","relativeAngle":5.972187026574045,"cz":0,"type":"Wall","rightJoints":["pcWBDfha4S8aWQ8R18i4nV"],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"roofType":"Pyramid","lx":0,"lz":0,"foundationId":"bJhvoWT5frHADN5rpErFAp","ly":0,"normal":[0,0,1],"showLabel":false,"lineWidth":0.2,"id":"nGgWDMiF4t3mFWmEvV3G6V","locked":true,"cz":0,"lineColor":"black","selected":false,"color":"#bbc0c4","type":"Roof","cy":0,"textureType":"No Roof Texture","rotation":[0,0,0],"thickness":0.2,"wallsId":["7dQxN3e4X8QdrAXYYEN8WG","1kwWJQEGgHXq1W18rzcYh4","6ue5PfovkzS53Qu47dbJ2S","pcWBDfha4S8aWQ8R18i4nV","u3McT1xxp22V2ArAdyDW3J","wERFjjYFCWERMhNEB9iuoK"],"cx":0,"parentId":"bJhvoWT5frHADN5rpErFAp","sideColor":"#bbc0c4","rise":0,"ceiling":false},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.22689280275926285],"lz":7,"selected":false,"cx":-16.084384276720815,"color":"#e27300","cy":15.36794895618929,"faceColors":["#e27300","#e27300","#e27300","#e27300","#f9fdfe","gray"],"cz":3.5,"parentId":"Ground","locked":true,"normal":[0,0,1],"type":"Cuboid","ly":4.781704008793219,"lx":6.529460998348136,"id":"gNV64yHSX1cBB43cygkyfk"},{"parentId":"Ground","ly":4.94412378095928,"rotation":[0,0,0.47123889803846897],"cy":18.145923422735436,"type":"Cuboid","locked":true,"normal":[0,0,1],"faceColors":["#e27300","#e27300","#e27300","#e27300","#f9fdfe","gray"],"lx":7.636154465642389,"cz":3.5,"lz":7,"selected":false,"color":"#e27300","id":"91GnsPRwrk88qGT8VmRMYg","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":8.05053425462394},{"solarPowerTower":{},"cy":33.364915793093175,"parentId":"Ground","id":"1nEGYML9Y5W4dWVRK3n5WW","locked":true,"selected":false,"cx":-5.596972605764655,"ly":39.876530801142074,"lx":39.61249197494745,"solarUpdraftTower":{},"rotation":[0,0,0.11344640137963143],"cz":0.05,"type":"Foundation","normal":[0,0,1],"lz":0.1,"solarAbsorberPipe":{}},{"color":"#e27300","relativeAngle":3.141592653589793,"parentId":"1nEGYML9Y5W4dWVRK3n5WW","lx":38.5,"rightPoint":[-19.489993841129074,18.992592968189904,0.1],"showLabel":false,"roofId":"vaDVUZ1uyEALYaHTbs211h","selected":false,"windows":[],"lz":7,"leftPoint":[19.010006158870922,18.992592968189896,0.1],"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","normal":[0,0,1],"lineWidth":0.2,"rotation":[0,0,0],"leftRoofHeight":7,"id":"97HokqKu917DTkAssZGbhE","type":"Wall","cz":0,"locked":true,"textureType":"Wall Texture Default","cy":18.992592968189904,"cx":-0.23999384112907807,"leftJoints":["2QQRWDofKjHid4D3rHXvwX"],"ly":0.3,"rightJoints":["fPtvUV7Bzhezt9xwDuPEmF"],"lineColor":"black","rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","windows":[],"lz":7,"rightJoints":["97HokqKu917DTkAssZGbhE"],"relativeAngle":1.5707963267948966,"rightRoofHeight":7,"showLabel":false,"selected":false,"parentId":"1nEGYML9Y5W4dWVRK3n5WW","cy":3.7425929681898977,"leftRoofHeight":7,"normal":[0,0,1],"locked":true,"id":"2QQRWDofKjHid4D3rHXvwX","lineColor":"black","textureType":"Wall Texture Default","ly":0.3,"roofId":"vaDVUZ1uyEALYaHTbs211h","leftPoint":[19.010006158870922,-11.507407031810096,0.1],"rotation":[0,0,0],"cz":0,"leftJoints":["v4k1Tt2DPV8adpDFKC5P12"],"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","lx":30.499999999999996,"cx":19.01000615887092,"color":"#e27300","rightPoint":[19.010006158870922,18.992592968189896,0.1],"lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"id":"fPtvUV7Bzhezt9xwDuPEmF","textureType":"Wall Texture Default","foundationId":"1nEGYML9Y5W4dWVRK3n5WW","leftJoints":["97HokqKu917DTkAssZGbhE"],"ly":0.3,"parentId":"1nEGYML9Y5W4dWVRK3n5WW","lineWidth":0.2,"leftPoint":[-19.489993841129067,18.992592968189896,0],"windows":[],"leftRoofHeight":7,"cz":0,"cy":3.746296484094948,"roofId":"vaDVUZ1uyEALYaHTbs211h","locked":true,"rotation":[0,0,0],"rightJoints":["ebWW9yh8D9FYjir4ozAvaz"],"selected":false,"lx":30.492594609952747,"rightPoint":[-19.5,-11.5,0],"rightRoofHeight":7,"relativeAngle":4.712060829921323,"lineColor":"black","showLabel":false,"normal":[0,0,1],"lz":7,"color":"#e27300","cx":-19.49499692056453,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"parentId":"1nEGYML9Y5W4dWVRK3n5WW","leftJoints":["fPtvUV7Bzhezt9xwDuPEmF"],"lineWidth":0.2,"textureType":"Wall Texture Default","leftPoint":[-19.5,-11.499999999999991,0],"cx":-10,"color":"#e27300","normal":[0,0,1],"cy":-14.999999999999996,"locked":true,"rightJoints":["v4k1Tt2DPV8adpDFKC5P12"],"selected":false,"leftRoofHeight":7,"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","lx":20.24845673131659,"windows":[],"relativeAngle":5.930194919352675,"rotation":[0,0,0],"roofId":"vaDVUZ1uyEALYaHTbs211h","showLabel":false,"rightRoofHeight":7,"id":"ebWW9yh8D9FYjir4ozAvaz","rightPoint":[-0.5,-18.5,0],"ly":0.3,"cz":0,"lz":7,"lineColor":"black","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","rightJoints":["2QQRWDofKjHid4D3rHXvwX"],"leftRoofHeight":7,"leftJoints":["ebWW9yh8D9FYjir4ozAvaz"],"cy":-15.003703515905048,"cx":9.255003079435461,"roofId":"vaDVUZ1uyEALYaHTbs211h","showLabel":false,"color":"#e27300","lineWidth":0.2,"relativeAngle":0.3441478196335668,"lx":20.725267108965333,"selected":false,"textureType":"Wall Texture Default","rightRoofHeight":7,"parentId":"1nEGYML9Y5W4dWVRK3n5WW","locked":true,"normal":[0,0,1],"lineColor":"black","rightPoint":[19.010006158870922,-11.507407031810095,0],"lz":7,"ly":0.3,"id":"v4k1Tt2DPV8adpDFKC5P12","cz":0,"rotation":[0,0,0],"windows":[],"leftPoint":[-0.5,-18.5,0],"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cy":-16.63156986902993,"lz":5,"lx":8.20544233607179,"id":"x3h1GsQhgRmq3SsscYfmB3","faceColors":["#e27300","#e27300","#e27300","#e27300","#eff3f4","gray"],"color":"#e27300","type":"Cuboid","locked":true,"normal":[0,0,1],"parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":11.4641129152687,"selected":false,"cx":16.793944749049793,"cz":2.5,"rotation":[0,0,0.11344640137963143]},{"lz":6.5,"ly":9.79284174487727,"color":"#e27300","selected":false,"faceColors":["#e27300","#e27300","#e27300","#e27300","#cbced4","gray"],"normal":[0,0,1],"rotation":[0,0,0.11344640137963143],"cx":18.04602799184764,"cy":-5.757381561584599,"lx":13.705205912378894,"id":"pawpCxDgzEqhYUsyrbWbDa","parentId":"Ground","locked":true,"cz":3.25,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid"},{"cz":0.05,"selected":false,"cy":-71.07055697625319,"id":"jqbU6DNc1hw25bSjkKpMiq","parentId":"Ground","ly":19.18495691494635,"solarPowerTower":{},"rotation":[0,0,0.47123889803846897],"lz":0.1,"solarUpdraftTower":{},"locked":true,"type":"Foundation","lx":30.387424337601402,"normal":[0,0,1],"solarAbsorberPipe":{},"cx":-4.462146546381112},{"textureType":"Wall Texture Default","ly":0.3,"relativeAngle":3.1415926535897927,"roofId":"nbhyUPhsFS3FWduEBX5mR4","normal":[0,0,1],"locked":true,"leftPoint":[14.911466700814316,8.908511607852175,0.1],"lineColor":"black","windows":[],"type":"Wall","leftRoofHeight":9,"selected":false,"id":"t45ndcq7s2gwo2wADp4LvF","lz":9,"rightRoofHeight":9,"rightJoints":["96Vsi7iFvTbA9KnjAiCzjC"],"cz":0,"lx":19.999999999999996,"rightPoint":[-5.088533299185682,8.908511607852187,0.1],"rotation":[0,0,0],"showLabel":false,"parentId":"jqbU6DNc1hw25bSjkKpMiq","leftJoints":["aUxdFcbeJNrCyc15FmwGK7"],"foundationId":"jqbU6DNc1hw25bSjkKpMiq","cx":4.911466700814314,"cy":8.908511607852173,"color":"#e27300","lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"lineWidth":0.2,"windows":[],"roofId":"nbhyUPhsFS3FWduEBX5mR4","id":"2Q9JHTpdQziYaq1i4YVAfD","cy":-9.591488392147804,"selected":false,"textureType":"Wall Texture Default","parentId":"jqbU6DNc1hw25bSjkKpMiq","leftRoofHeight":9,"ly":0.3,"rightJoints":["aUxdFcbeJNrCyc15FmwGK7"],"lz":9,"cz":0,"leftPoint":[-14.588533299185684,-9.591488392147816,0.1],"normal":[0,0,1],"rightRoofHeight":9,"lineColor":"black","showLabel":false,"rightPoint":[7.411466700814323,-9.591488392147804,0.1],"rotation":[0,0,0],"foundationId":"jqbU6DNc1hw25bSjkKpMiq","relativeAngle":0,"cx":-3.588533299185679,"color":"#e27300","type":"Wall","locked":true,"leftJoints":["fjtHDsHPyFgzX4a1QCnEg1"],"lx":22.000000000000007,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"lz":9,"leftJoints":["2Q9JHTpdQziYaq1i4YVAfD"],"cy":-0.34148839214781823,"lineWidth":0.2,"locked":true,"selected":false,"rightPoint":[14.911466700814314,8.90851160785218,0.1],"relativeAngle":1.1856388204314217,"cz":0,"leftRoofHeight":9,"lx":19.962464777677127,"parentId":"jqbU6DNc1hw25bSjkKpMiq","rightJoints":["t45ndcq7s2gwo2wADp4LvF"],"cx":11.161466700814309,"normal":[0,0,1],"roofId":"nbhyUPhsFS3FWduEBX5mR4","lineColor":"black","foundationId":"jqbU6DNc1hw25bSjkKpMiq","id":"aUxdFcbeJNrCyc15FmwGK7","color":"#e27300","textureType":"Wall Texture Default","rightRoofHeight":9,"ly":0.3,"rotation":[0,0,0],"type":"Wall","showLabel":false,"leftPoint":[7.411466700814304,-9.59148839214781,0.1],"windows":[],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"cx":-2.2158130411354513,"lx":3.4859481923608877,"ly":4.275960039070249,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"nypM3mdmViZReBeYosY2yV","cz":6,"cy":-27.62799047977582,"faceColors":["#808080","#808080","#808080","#808080","#ffffff","gray"],"lz":12,"type":"Cuboid","parentId":"Ground","normal":[0,0,1],"color":"#808080","rotation":[0,0,0.11344640137963143],"locked":true,"selected":false},{"type":"Wall","lx":13.499999999999998,"foundationId":"jqbU6DNc1hw25bSjkKpMiq","selected":false,"locked":true,"normal":[0,0,1],"leftPoint":[-14.588533299185688,3.9085116078521778,0.1],"cx":-14.588533299185682,"lineWidth":0.2,"textureType":"Wall Texture Default","leftRoofHeight":9,"relativeAngle":4.71238898038469,"color":"#e27300","rightJoints":["2Q9JHTpdQziYaq1i4YVAfD"],"showLabel":false,"windows":[],"lineColor":"black","leftJoints":["iik8XWaEN3wPnYJVvNUf8N"],"cz":0,"cy":-2.841488392147814,"id":"fjtHDsHPyFgzX4a1QCnEg1","parentId":"jqbU6DNc1hw25bSjkKpMiq","ly":0.3,"lz":9,"roofId":"nbhyUPhsFS3FWduEBX5mR4","rightRoofHeight":9,"rightPoint":[-14.588533299185684,-9.591488392147816,0.1],"rotation":[0,0,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"showLabel":false,"rightPoint":[-14.588533299185688,3.9085116078521778,0.1],"rightRoofHeight":9,"lineColor":"black","cx":-9.838533299185684,"relativeAngle":3.1415926535897936,"foundationId":"jqbU6DNc1hw25bSjkKpMiq","windows":[],"type":"Wall","parentId":"jqbU6DNc1hw25bSjkKpMiq","id":"iik8XWaEN3wPnYJVvNUf8N","roofId":"nbhyUPhsFS3FWduEBX5mR4","rightJoints":["fjtHDsHPyFgzX4a1QCnEg1"],"leftRoofHeight":9,"cy":3.9085116078521835,"lx":9.500000000000002,"locked":true,"textureType":"Wall Texture Default","normal":[0,0,1],"lz":9,"leftJoints":["96Vsi7iFvTbA9KnjAiCzjC"],"selected":false,"cz":0,"leftPoint":[-5.088533299185688,3.908511607852178,0.1],"lineWidth":0.2,"color":"#e27300","rotation":[0,0,0],"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"textureType":"Wall Texture Default","selected":false,"rotation":[0,0,0],"showLabel":false,"lineColor":"black","roofId":"nbhyUPhsFS3FWduEBX5mR4","leftPoint":[-5.088533299185681,8.908511607852187,0.1],"cx":-5.088533299185681,"lx":5.000000000000002,"type":"Wall","rightJoints":["iik8XWaEN3wPnYJVvNUf8N"],"windows":[],"lz":9,"locked":true,"leftRoofHeight":9,"rightRoofHeight":9,"ly":0.3,"parentId":"jqbU6DNc1hw25bSjkKpMiq","rightPoint":[-5.088533299185688,3.908511607852178,0.1],"cy":6.408511607852189,"normal":[0,0,1],"color":"#e27300","leftJoints":["t45ndcq7s2gwo2wADp4LvF"],"relativeAngle":4.71238898038469,"foundationId":"jqbU6DNc1hw25bSjkKpMiq","cz":0,"lineWidth":0.2,"id":"96Vsi7iFvTbA9KnjAiCzjC","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"ly":18.600818138777164,"normal":[0,0,1],"lz":7,"id":"9ZkQyqaEmTeYEWHbrCFRQb","type":"Cuboid","cx":-21.473353217856005,"cz":3.5,"lx":28.43689133843813,"cy":-80.03483805963909,"selected":false,"faceColors":["#e27300","#e27300","#e27300","#e27300","#a0a8a1","gray"],"rotation":[0,0,0.47123889803846897],"parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"#e27300","locked":true},{"lineColor":"black","foundationId":"jqbU6DNc1hw25bSjkKpMiq","cz":0,"roofType":"Pyramid","locked":true,"lz":0,"normal":[0,0,1],"id":"nbhyUPhsFS3FWduEBX5mR4","cy":0,"cx":0,"type":"Roof","ly":0,"lineWidth":0.2,"color":"#a0a8a1","selected":false,"wallsId":["t45ndcq7s2gwo2wADp4LvF","96Vsi7iFvTbA9KnjAiCzjC","iik8XWaEN3wPnYJVvNUf8N","fjtHDsHPyFgzX4a1QCnEg1","2Q9JHTpdQziYaq1i4YVAfD","aUxdFcbeJNrCyc15FmwGK7"],"showLabel":false,"lx":0,"textureType":"No Roof Texture","thickness":0.2,"parentId":"jqbU6DNc1hw25bSjkKpMiq","rotation":[0,0,0],"sideColor":"#a0a8a1","rise":0,"ceiling":false},{"rotation":[0,0,0.11344640137963143],"lx":33.330266968334364,"parentId":"Ground","locked":true,"selected":false,"cy":-18.068839609848254,"color":"#e27300","id":"u9fp9k5YxThQWCBpcjSypa","ly":24.01347765210959,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"lz":7,"faceColors":["#e27300","#e27300","#e27300","#e27300","#dadedf","gray"],"cz":3.5,"cx":-3.833297199689312,"type":"Cuboid"},{"parentId":"Ground","lx":6.254852089156679,"color":"#e27300","lz":6,"cy":-14.332630086328715,"rotation":[0,0,0.11344640137963143],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":8.529051468761843,"cz":3,"cx":23.820970949615347,"normal":[0,0,1],"id":"g3WSwwiWWgknhD1TsV34bi","locked":true,"type":"Cuboid","faceColors":["#e27300","#e27300","#e27300","#e27300","#eff3f4","gray"],"selected":false},{"selected":false,"parentId":"Ground","rotation":[0,0,0.11344640137963143],"lx":138.78684366347608,"solarAbsorberPipe":{},"cz":0.05,"textureType":"Foundation Texture #1","lz":0.1,"id":"reBHg6Exy2MChwcxtr3gj7","locked":true,"color":"#808080","cx":-1.8708371231135246,"solarUpdraftTower":{},"type":"Foundation","ly":56.63391373000898,"cy":89.14969979439752,"solarPowerTower":{},"normal":[0,0,1]},{"color":"#808080","cz":0.05,"solarPowerTower":{},"textureType":"Foundation Texture #1","locked":true,"ly":114.12479182802815,"id":"36nmeGQGETdJPm5rWVVRjJ","solarUpdraftTower":{},"lx":42.16787694736764,"lz":0.1,"normal":[0,0,1],"solarAbsorberPipe":{},"selected":false,"cy":-148.8692182215829,"parentId":"Ground","rotation":[0,0,0.11344640137963143],"type":"Foundation","cx":-28.614737300680485},{"id":"bFksCZzoXd93c7MyivmV9K","faceColors":["gray","gray","gray","gray","gray","gray"],"ly":5.781774626442493,"rotation":[0,0,0.11344640137963143],"cx":-8.05557182480289,"normal":[0,0,1],"parentId":"Ground","color":"gray","cy":28.559956693666173,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":true,"selected":false,"cz":4.5,"lz":9,"lx":2.7809448048857632,"type":"Cuboid"},{"id":"4uGXxDXoTLYvikq5fUL9dt","normal":[0,0,1],"parentId":"Ground","cz":4.5,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":38.25979783456656,"lx":2.7809448048857632,"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":9,"selected":false,"locked":true,"rotation":[0,0,0.11344640137963143],"cx":-6.727695250737455,"type":"Cuboid","color":"gray","ly":5.781774626442493},{"type":"Tree","lx":10,"selected":false,"name":"Magnolia","cz":0,"locked":true,"id":"xmEmwPRar8iA32AgGqBDZo","cy":44.65483300272308,"rotation":[0,0,0],"parentId":"Ground","cx":15.962764438139406,"normal":[0,1,0],"lz":10},{"cx":4.786319195449075,"name":"Magnolia","lz":10,"id":"2N9b6wPaP7vTT6v2GfUvci","cy":57.504795212360165,"selected":false,"rotation":[0,0,0],"parentId":"Ground","type":"Tree","locked":true,"lx":10,"normal":[0,0,1],"cz":0},{"cz":0,"id":"tQuBdxiCZwsv3tPttqZcge","locked":true,"type":"Tree","lz":10,"parentId":"Ground","lx":10,"cx":-37.72446755161796,"name":"Magnolia","rotation":[0,0,0],"selected":false,"cy":24.20884875644974,"normal":[0,0,1]},{"rotation":[0,0,0],"locked":true,"normal":[0,0,1],"parentId":"Ground","cz":0,"cy":27.53619242162998,"name":"Magnolia","type":"Tree","lx":10,"cx":-56.12589485999845,"id":"sBLygdm7dv2Y53q9fnNST7","selected":false,"lz":10},{"ly":1,"type":"Cuboid","id":"dHHanjftUrSruBnauGJSLy","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","cx":-5.870064866540858,"lx":2,"normal":[0,0,1],"lz":9,"cy":15.318325135239354,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,0.11344640137963143],"selected":false,"locked":true,"cz":4.5},{"id":"9vxhEg5mY7bnj3mASyLPuq","cz":4.5,"lx":1.5,"ly":1,"cx":-3.8512872137145457,"normal":[0,0,1],"type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"locked":true,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":11.777212358373532,"lz":9,"rotation":[0,0,0.11344640137963143],"parentId":"Ground","selected":false,"color":"gray"},{"cz":4.5,"cy":15.693005652428699,"normal":[0,0,1],"cx":-2.6936903398761203,"selected":false,"locked":true,"lz":9,"rotation":[0,0,0.11344640137963143],"color":"gray","ly":1,"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","id":"hvuDpXrEgC1sbzpcoS3Pv5","lx":2,"type":"Cuboid"},{"cz":4.5,"id":"xtuommaSLMKZrejRaGGfMk","faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"lz":9,"type":"Cuboid","cx":6.443464344950151,"locked":true,"cy":6.860194005695455,"color":"gray","parentId":"Ground","rotation":[0,0,0.47123889803846897],"selected":false,"lx":1,"ly":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"color":"gray","ly":2,"parentId":"Ground","normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":8,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"sJYEUPNTzxmWik8iqk2zs1","cy":25.83184970998569,"locked":true,"cz":4,"selected":false,"rotation":[0,0,0.47123889803846897],"type":"Cuboid","lx":2,"cx":46.69245220859119},{"cz":4,"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":8,"cx":57.51703501824526,"lx":2,"locked":true,"selected":false,"color":"gray","ly":2,"parentId":"Ground","type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":32.45468730038977,"rotation":[0,0,0.47123889803846897],"id":"bbqihnnqHMG2BadQAqxu4w","normal":[0,0,1]},{"id":"25nzwRphH2HZWasHbdyR9H","rotation":[0,0,0.47123889803846897],"cz":4,"cx":9.64097434426713,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"lz":8,"ly":2,"selected":false,"color":"gray","locked":true,"type":"Cuboid","cy":14.625073334021367,"lx":2,"parentId":"Ground"},{"locked":true,"ly":3.023435418581383,"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"color":"gray","normal":[0,0,1],"lz":8,"id":"auEsiwZVDg1BpD4SLuxEMu","cz":4,"selected":false,"cx":13.735991450729825,"rotation":[0,0,0.47123889803846897],"parentId":"Ground","lx":1.956376737761125,"cy":11.519743764909009},{"cx":8.737674718750876,"lz":8,"selected":false,"lx":1.6103314300645608,"color":"gray","cz":4,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"locked":true,"ly":6.078985704618435,"rotation":[0,0,0.47123889803846897],"cy":10.874631022787334,"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","id":"hVeFrmw4X6UXNLJxSgFFTX"},{"lz":8,"cy":9.924339607771106,"type":"Cuboid","lx":4.469059126518252,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"cz":4,"parentId":"Ground","ly":2.3777908106308545,"locked":true,"cx":10.942483109442229,"selected":false,"id":"meaBMTA4CLhnmmXQkVUk4b","color":"gray","rotation":[0,0,0.47123889803846897],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"rotation":[0,0,-0.22689280275926285],"id":"uaSYyvLxcyJGUeppQk2fkP","normal":[0,0,1],"locked":true,"faceColors":["gray","gray","gray","gray","gray","gray"],"color":"gray","cx":-58.373259464283144,"selected":false,"ly":1,"cz":4,"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lx":1,"parentId":"Ground","cy":19.91282275388616,"lz":8},{"lx":1,"parentId":"Ground","locked":true,"ly":1,"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"cx":-18.92226089346107,"rotation":[0,0,-0.22689280275926285],"type":"Cuboid","cz":4,"color":"gray","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"aSJgYXr93BZfEPKkAwN8r7","lz":8,"normal":[0,0,1],"cy":-0.6960334472303071},{"locked":true,"lx":2.0388988979736835,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.22689280275926285],"id":"vUyZDk5YRtPiBnYt1snpgt","selected":false,"cy":10.353201903334014,"color":"gray","ly":2.0216903725484365,"normal":[0,0,1],"type":"Cuboid","cx":-16.847254368208766,"parentId":"Ground","lz":8,"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":4},{"type":"Cuboid","cy":11.088622268912289,"cz":4,"rotation":[0,0,-0.22689280275926285],"ly":2.9540425209021324,"id":"dfGLJ9Zv1uAnvCfrcBHsCt","locked":true,"lz":8,"parentId":"Ground","color":"gray","cx":-14.705676459927645,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"lx":1.7677570935590694,"selected":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":7.5,"selected":false,"cz":3.75,"lx":0.9904096888649759,"type":"Cuboid","color":"gray","cy":-4.822954202789914,"parentId":"Ground","locked":true,"id":"n5nBWKF2pcd87Hywxr4MmX","cx":19.016528568953923,"normal":[0,0,1],"ly":1.9410657757772696,"rotation":[0,0,0.11344640137963143],"faceColors":["gray","gray","gray","gray","gray","gray"]},{"type":"Cuboid","ly":1,"cx":22.516067022100426,"color":"gray","parentId":"Ground","cz":3.5,"locked":true,"selected":false,"lx":1,"lz":7,"rotation":[0,0,0.11344640137963143],"id":"oDooft2rdfK7T7GeS22TTX","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"cy":-11.05785927501001},{"rotation":[0,0,0.11344640137963143],"type":"Cuboid","selected":false,"lz":6,"locked":true,"lx":1,"parentId":"Ground","ly":1,"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"id":"5MNhY3je6nxRhgVTaQd4XD","cx":17.344429933105552,"cy":-13.822777502645632,"cz":3},{"rotation":[0,0,0.11344640137963143],"id":"hTpGn7Ld64gegWm4tEbZhj","normal":[0,0,1],"lz":6,"locked":true,"cz":3,"lx":1,"type":"Cuboid","ly":1,"selected":false,"cx":13.157095779673083,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":-14.697109758746397,"faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground","color":"gray"},{"type":"Cuboid","parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":-6.445109761249004,"rotation":[0,0,0.11344640137963143],"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":4.5,"locked":true,"cx":-1.5852019434320317,"ly":1,"selected":false,"normal":[0,0,1],"lz":9,"id":"rq5RGqs3gD3vGibJBsqSoL","color":"gray","lx":1},{"lx":1,"parentId":"Ground","rotation":[0,0,0.11344640137963143],"normal":[0,0,1],"type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"gray","locked":true,"selected":false,"cx":1.8238223447270574,"id":"pVxtrZrVGwkvEXjPsLSV95","cz":4,"ly":1,"cy":-11.816737963378758,"lz":8},{"selected":false,"ly":1.3665925830167867,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"rotation":[0,0,0.11344640137963143],"cz":6.5,"lz":13,"id":"kfMaGeiQgdSFzmbpVf6zVf","cx":-10.111227834366188,"type":"Cuboid","lx":1.8193596961081897,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"gray","locked":true,"cy":-15.497913514100716},{"color":"gray","lx":1,"type":"Cuboid","cy":-27.533957889184162,"cz":6.5,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,0.11344640137963143],"selected":false,"lz":13,"id":"bkDAE3FxXTUCR13vm7LnmF","locked":true,"normal":[0,0,1],"ly":1,"cx":-2.3075258042202},{"normal":[0,0,1],"selected":false,"locked":true,"cx":-15.307775607494396,"lx":2.5676889546751847,"color":"gray","ly":1.3662836019362639,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,0.11344640137963143],"parentId":"Ground","type":"Cuboid","cz":6.5,"lz":13,"cy":-18.40230760434186,"id":"aQcL3piZZWLrX5Ud8AM8Ke"},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"selected":false,"id":"i4oTzKRpveYkgD2Hd8SNHf","faceColors":["gray","gray","gray","gray","gray","gray"],"ly":1,"lz":14,"color":"gray","lx":1,"parentId":"Ground","cy":-29.315479380504186,"rotation":[0,0,0.11344640137963143],"cx":16.7566929241104,"cz":7,"type":"Cuboid","normal":[0,0,1],"locked":true},{"ly":1,"normal":[0,0,1],"cx":19.914283665719672,"cy":-44.497740663585425,"lz":14,"lx":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,0.11344640137963143],"id":"ah9bKoBGUiMWeHKfdxzpi9","cz":7,"color":"gray","type":"Cuboid","locked":true,"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground"},{"lz":14,"normal":[0,0,1],"locked":true,"id":"vBZ2DA9y9KYiCwgzGpLfFD","color":"gray","lx":1,"rotation":[0,0,0.11344640137963143],"cz":7,"cy":-47.62693833888401,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","selected":false,"ly":1,"cx":20.25452350291907},{"cy":-38.0401954851006,"type":"Cuboid","lx":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"ly":1,"rotation":[0,0,0.11344640137963143],"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":7,"locked":true,"id":"2jpUuL1gcsjduHrhm3n43t","selected":false,"parentId":"Ground","cx":-17.59480337417267,"color":"gray","lz":14},{"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"ly":1,"cy":-50.768525050448105,"lz":14,"lx":1,"id":"doc8sxSmKeL7RKrAnLUcoL","selected":false,"type":"Cuboid","cx":-16.679482324891723,"locked":true,"color":"gray","rotation":[0,0,0.11344640137963143],"parentId":"Ground","cz":7},{"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"selected":false,"id":"us3zCoK5ewuBS6QTdVwh5n","cz":7,"ly":1,"lx":1,"normal":[0,0,1],"color":"gray","locked":true,"lz":14,"rotation":[0,0,0.11344640137963143],"cy":-63.79092407456009,"cx":-15.262534505030402,"parentId":"Ground"},{"faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,0.47123889803846897],"lz":10,"normal":[0,0,1],"lx":1,"type":"Cuboid","cy":-67.46996837049493,"id":"t959VVjipFtQcWvuiVz2K9","parentId":"Ground","cx":-4.425598860553924,"cz":5,"color":"gray","selected":false,"ly":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":true},{"ly":1,"lx":1,"locked":true,"type":"Cuboid","rotation":[0,0,0.47123889803846897],"cx":-3.1466144543948023,"normal":[0,0,1],"color":"gray","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":10,"cy":-66.65602476858759,"selected":false,"id":"qhPJYtSXY5a7RZFHnh9sXY","faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground","cz":5},{"cx":-6.364270455130605,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"lz":10,"ly":1,"locked":true,"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"lx":1,"color":"gray","type":"Cuboid","selected":false,"id":"uHN4GMMVvGcf6APcCUZnSj","cy":-75.21381547306636,"rotation":[0,0,0.47123889803846897],"cz":5},{"ly":1,"cy":-83.03785791923461,"rotation":[0,0,0.47123889803846897],"locked":true,"lx":1,"normal":[0,0,1],"color":"gray","lz":8,"selected":false,"cx":-23.111777972260608,"id":"vtCxYC9fd4ntw6fFZCahnk","faceColors":["gray","gray","gray","gray","gray","gray"],"cz":4,"parentId":"Ground","type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"locked":true,"lz":10,"lx":1,"rotation":[0,0,0.47123889803846897],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":1,"color":"gray","type":"Cuboid","cy":-79.50076914190635,"cx":-14.662733157197128,"cz":5,"id":"hZWUtVcu3jjMB9HKr9R8ro","normal":[0,0,1],"parentId":"Ground"},{"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":true,"lx":1,"ly":1,"cz":4,"normal":[0,0,1],"color":"gray","rotation":[0,0,0.47123889803846897],"cy":-84.70748291923546,"id":"iw4xNrSMGDSZJUGzJ8pTqm","cx":-28.436527972260606,"lz":8,"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground"},{"type":"Cuboid","cz":4,"locked":true,"lz":8,"ly":1,"id":"iLtZHkfUgxkgeqhAZivYfe","cx":-30.88874837783922,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"selected":false,"cy":-84.0342920377216,"normal":[0,0,1],"parentId":"Ground","rotation":[0,0,0.47123889803846897],"lx":1,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"selected":false,"lz":8,"parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-13.782520236054552,"rotation":[0,0,0.47123889803846897],"type":"Cuboid","lx":1,"cz":4,"id":"ssCGfzEitaxtFqQF7Ga8kZ","color":"gray","ly":1,"normal":[0,0,1],"cy":-67.47809368871428,"faceColors":["gray","gray","gray","gray","gray","gray"],"locked":true},{"selected":false,"color":"#f9fdfe","ly":0,"foundationId":"1nEGYML9Y5W4dWVRK3n5WW","lz":0,"lx":0,"lineColor":"black","textureType":"No Roof Texture","rotation":[0,0,0],"parentId":"1nEGYML9Y5W4dWVRK3n5WW","roofType":"Pyramid","wallsId":["97HokqKu917DTkAssZGbhE","fPtvUV7Bzhezt9xwDuPEmF","ebWW9yh8D9FYjir4ozAvaz","v4k1Tt2DPV8adpDFKC5P12","2QQRWDofKjHid4D3rHXvwX"],"locked":true,"type":"Roof","cx":0,"showLabel":false,"lineWidth":0.2,"thickness":0.2,"normal":[0,0,1],"cz":0,"cy":0,"id":"vaDVUZ1uyEALYaHTbs211h","sideColor":"#f9fdfe","rise":0,"ceiling":false},{"selected":false,"lz":0.4,"filled":false,"id":"fdazNUtKFoSEAPgq9CQJES","type":"Polygon","locked":true,"cx":0,"parentId":"qsPqX4eMRADWLb6uFzZyu3","color":"#d0d7da","selectedIndex":3,"foundationId":"qsPqX4eMRADWLb6uFzZyu3","cz":0,"rotation":[0,0,0.11344640137963143],"normal":[0,0,1],"vertices":[{"x":-0.3919656451231681,"y":-0.44378588479022363},{"x":-0.3919656451231681,"y":0.4581015584931341},{"y":0.4581015584931341,"x":0.3563324046574256},{"y":-0.44378588479022363,"x":0.3563324046574256}],"cy":0,"ly":0.4,"lx":0.4,"lineColor":"#ffffff","lineStyle":2},{"type":"Polygon","cz":0,"lx":0.4,"selected":false,"color":"#dadedf","normal":[0,0,1],"lz":0.4,"filled":false,"locked":true,"parentId":"jeaVPPnZw5Ed7yuuYuFjT4","ly":0.4,"cy":0,"selectedIndex":5,"rotation":[0,0,-0.22689280275926285],"id":"4bjxP3DGK4dodwicaeMGrq","vertices":[{"x":-0.4583333333333333,"y":-0.41984420002481043},{"x":-0.4583333333333333,"y":0.2798961333498736},{"y":0.2798961333498736,"x":-0.4083333333333333},{"x":-0.4083333333333333,"y":0.41984420002481043},{"x":0.20833333333333334,"y":0.41984420002481043},{"y":-0.41984420002481043,"x":0.20833333333333334}],"cx":0,"foundationId":"jeaVPPnZw5Ed7yuuYuFjT4","lineStyle":2,"lineColor":"#ffffff"},{"type":"Tree","name":"Magnolia","cx":-42.801241972409024,"cy":-41.7007983662498,"cz":0,"lx":9.278019576062961,"lz":8.643797542596442,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"g1FsRLcUZdSt9Q2DU31zPA","selected":false,"locked":true},{"type":"Tree","name":"Magnolia","cx":-59.8787215366302,"cy":-50.66068977312313,"cz":-7.105427357601002e-15,"lx":9.278019576062961,"lz":11.78149367100265,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"krmMVWEiKsnePivMXL7Nes","selected":false,"locked":true},{"type":"Tree","name":"Magnolia","cx":-51.87839388003734,"cy":-62.51980907480443,"cz":0,"lx":6.499371428507982,"lz":7.082169014620417,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"rW1c33rx65WFpCNTzaAbaM","selected":false,"locked":true}],"view":{"showDailyLightSensorPanel":false,"yearlyHeliostatYieldPanelY":0,"yearlyFresnelReflectorYieldPanelY":0,"showInstructionPanel":false,"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelX":0,"panCenter2D":[-38.51386717609555,9.861822957610682,-0.00020795605672141833],"dailyPvYieldPanelRect":{"height":400,"width":600,"x":0,"y":0},"panCenter":[-7.484723712513362,-24.66583880095733,0.1225204207961253],"showMapPanel":false,"groundColor":"#16a5a5","yearlyFresnelReflectorYieldPanelRect":{"x":0,"width":600,"y":0,"height":400},"yearlyPvYieldPanelY":0,"mapWeatherStations":false,"visibilityResultsPanelX":0,"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400},"stickyNotePanelRect":{"width":269,"y":0,"x":-3,"height":87},"cameraPosition2D":[-38.51386717609555,9.861802956721695,19.99979204387911],"showYearlyParabolicTroughYieldPanel":false,"showEvolutionPanel":false,"showHeliodonPanel":false,"theme":"Default","showYearlyParabolicDishYieldPanel":false,"mapPanelX":0,"showDailyFresnelReflectorYieldPanel":false,"dailyLightSensorPanelX":0,"dailyParabolicDishYieldPanelX":0,"heliodon":false,"dailyPvYieldPanelX":0,"dailyFresnelReflectorYieldPanelRect":{"y":0,"height":400,"x":0,"width":600},"axes":true,"mapTilt":0,"dailyFresnelReflectorYieldPanelX":0,"showEconomicsPanel":false,"dailyParabolicTroughYieldPanelY":0,"dailyLightSensorPanelY":0,"visibilityResultsPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"showYearlyFresnelReflectorYieldPanel":false,"yearlyLightSensorPanelRect":{"height":500,"y":0,"x":0,"width":600},"dailyParabolicDishYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"showDesignInfoPanel":true,"yearlyUpdraftTowerYieldPanelRect":{"y":0,"height":400,"x":0,"width":600},"yearlyPvYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"yearlyParabolicDishYieldPanelX":0,"solarRadiationHeatMapReflectionOnly":false,"showZenithAngle":true,"groundImage":true,"showYearlyLightSensorPanel":false,"mapZoom":17,"yearlyFresnelReflectorYieldPanelX":0,"visibilityResultsPanelRect":{"width":600,"x":0,"y":0,"height":470},"showStickyNotePanel":true,"yearlyLightSensorPanelShowClearness":false,"showElevationAngle":true,"weatherPanelY":0,"yearlyLightSensorPanelShowDaylight":false,"yearlyLightSensorPanelY":0,"mapType":"hybrid","showYearlyPvYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"yearlyPvYieldPanelX":0,"diurnalTemperaturePanelRect":{"width":600,"x":0,"y":0,"height":400},"dailyHeliostatYieldPanelX":0,"heliodonPanelX":0,"showYearlyHeliostatYieldPanel":false,"yearlyParabolicTroughYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"dailyHeliostatYieldPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"stickyNotePanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelRect":{"height":400,"x":0,"width":600,"y":0},"orthographic":false,"cameraPosition":[35.702709576196014,-94.16775966891016,142.42515130862242],"showDailyUpdraftTowerYieldPanel":false,"showDailyPvYieldPanel":false,"enableRotate":true,"showYearlyUpdraftTowerYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showDailyParabolicTroughYieldPanel":false,"dailyFresnelReflectorYieldPanelY":0,"showWeatherPanel":false,"yearlyLightSensorPanelX":0,"mapPanelY":0,"dailyHeliostatYieldPanelRect":{"height":400,"width":600,"x":0,"y":0},"autoRotate":false,"dailyParabolicDishYieldPanelY":0,"cameraZoom":22.160664819944596,"showAzimuthAngle":true,"weatherPanelRect":{"y":0,"x":0,"height":500,"width":500},"showSunAngles":false,"dailyLightSensorPanelRect":{"x":0,"width":600,"height":360,"y":0},"heliodonPanelY":0,"showSolarPanelVisibilityResultsPanel":false,"showDailyHeliostatYieldPanel":false,"shadowEnabled":true,"dailyUpdraftTowerYieldPanelRect":{"x":0,"width":640,"height":550,"y":0},"dailyPvYieldPanelY":0,"showDiurnalTemperaturePanel":false,"weatherPanelX":0,"ambientLightIntensity":0.1,"solarRadiationHeatMapMaxValue":5,"stickyNotePanelX":0,"showSiteInfoPanel":true,"yearlyHeliostatYieldPanelRect":{"width":600,"x":0,"y":0,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"rowAxis":"Left-Right","interRowSpacing":2,"tiltAngle":0,"poleSpacing":3,"rowsPerRack":1,"poleHeight":1,"pvModelName":"SPR-X21-335-BLK","orientation":"Landscape"},"solarPanelArrayLayoutConstraints":{"maximumTiltAngle":1.5707963267948966,"minimumRowsPerRack":1,"rowAxis":"Left-Right","orientation":"Landscape","maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumInterRowSpacing":10,"minimumInterRowSpacing":2,"poleSpacing":5,"poleHeight":1,"pvModelName":"CS6X-355P-FG"},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"vmax":0.01,"localSearchRadius":0.1,"inertia":0.8,"searchMethod":1,"maximumSteps":5,"objectiveFunctionType":1,"problem":"Solar Panel Tilt Angle","socialCoefficient":0.1,"convergenceThreshold":0.01,"cognitiveCoefficient":0.1,"swarmSize":20},"geneticAlgorithmParams":{"localSearchRadius":0.1,"maximumGenerations":5,"mutationRate":0.1,"problem":"Solar Panel Tilt Angle","selectionRate":0.5,"populationSize":20,"objectiveFunctionType":1,"searchMethod":1,"convergenceThreshold":0.01,"selectionMethod":1,"crossoverRate":0.5}},"economicsParams":{"electricitySellingPrice":0.25,"projectLifeSpan":25,"operationalCostPerUnit":0.15},"notes":["South Burlington High School\\nVermont, USA"]}')},471:function(e){e.exports=JSON.parse('{"docid":"dWgDnPJDqR9XymfxSQN7WJ","time":"02/03/2023 07:56 pm","timestamp":1675472176562,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"pvGridCellSize":0.5,"timesPerHour":2,"latitude":33.225546302957646,"longitude":-105.74311446654394,"daysPerYear":4,"airAttenuationCoefficient":0.01,"solarPanelVisibilityGridCellSize":0.2,"cspDaysPerYear":4,"sutGridCellSize":1,"diurnalTemperatureModel":1,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"noAnimationForSolarPanelSimulation":false,"noAnimationForSolarUpdraftTowerSimulation":false,"name":"default","highestTemperatureTimeInMinutes":900,"noAnimationForSensorDataCollection":false,"cspGridCellSize":0.5,"cspTimesPerHour":4,"sutDaysPerYear":4,"airConvectiveCoefficient":5,"dustLoss":0.05,"address":"249 White Mountain Dr, Mescalero, NM 88340, USA","sutTimesPerHour":4,"discretization":"Approximate","noAnimationForHeatmapSimulation":false,"date":"Wed Jun 22 2022 12:00:00 GMT-0400 (Eastern Daylight Time)","solarRadiationHeatmapGridCellSize":10},"elements":[{"cx":36.04364346579838,"color":"#808080","normal":[0,0,1],"id":"aXWETyunkqtQVNXGWr9VZd","solarPowerTower":{},"solarAbsorberPipe":{},"lx":65.26457989390352,"rotation":[0,0,-0.41015237421866746],"ly":29.235638926118842,"cz":0.5,"solarUpdraftTower":{},"cy":-20.683265041734174,"parentId":"Ground","locked":false,"type":"Foundation","lz":1,"selected":false},{"type":"Wall","parentId":"aXWETyunkqtQVNXGWr9VZd","locked":false,"leftJoints":["7a9g1bU6Fq192u17jYzUVQ"],"windows":[],"normal":[0,0,1],"rightPoint":[-30.895924961184342,13.06099510897374,1],"leftPoint":[32.60407503881567,13.060995108973744,1],"id":"qmFzWJnLZGgtRZtU4NCV2i","rightJoints":["8UV181m3Qgm4gVeHjN6o1N"],"leftRoofHeight":5,"color":"white","cx":0.8540750388156599,"foundationId":"aXWETyunkqtQVNXGWr9VZd","lineColor":"black","cz":0,"lz":5,"rotation":[0,0,-0.41015237421866746],"selected":false,"textureType":"Wall Texture Default","showLabel":false,"cy":13.060995108973737,"roofId":"adpYUuHEY6XwTLGq9piRR2","ly":0.3,"lx":63.5,"relativeAngle":3.141592653589793,"rightRoofHeight":5,"lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"lineWidth":0.2,"windows":[],"cy":-0.1890048910262596,"color":"white","showLabel":false,"rightJoints":["qmFzWJnLZGgtRZtU4NCV2i"],"normal":[0,0,1],"lineColor":"black","textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"roofId":"adpYUuHEY6XwTLGq9piRR2","lz":5,"locked":false,"cx":32.604075038815665,"lx":26.500000000000004,"ly":0.3,"selected":false,"leftPoint":[32.604075038815665,-13.439004891026256,1],"parentId":"aXWETyunkqtQVNXGWr9VZd","rightPoint":[32.60407503881566,13.060995108973742,1],"leftRoofHeight":5,"type":"Wall","rightRoofHeight":5,"foundationId":"aXWETyunkqtQVNXGWr9VZd","leftJoints":["cqVaqhkF9cafDk3CujuxhA"],"cz":0,"relativeAngle":1.5707963267948966,"id":"7a9g1bU6Fq192u17jYzUVQ","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cx":0.8540750388156644,"windows":[],"leftPoint":[-30.895924961184335,-13.439004891026261,1],"rightRoofHeight":5,"showLabel":false,"selected":false,"type":"Wall","leftJoints":["8UV181m3Qgm4gVeHjN6o1N"],"rightPoint":[32.604075038815665,-13.439004891026256,1],"cz":0,"ly":0.3,"parentId":"aXWETyunkqtQVNXGWr9VZd","relativeAngle":0,"id":"cqVaqhkF9cafDk3CujuxhA","roofId":"adpYUuHEY6XwTLGq9piRR2","rightJoints":["7a9g1bU6Fq192u17jYzUVQ"],"lx":63.50000000000001,"textureType":"Wall Texture Default","lineWidth":0.2,"cy":-13.439004891026254,"lineColor":"black","lz":5,"rotation":[0,0,-0.41015237421866746],"leftRoofHeight":5,"locked":false,"normal":[0,0,1],"foundationId":"aXWETyunkqtQVNXGWr9VZd","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cy":-0.18900489102626317,"leftRoofHeight":5,"lz":5,"textureType":"Wall Texture Default","leftPoint":[-30.895924961184342,13.06099510897374,1],"relativeAngle":4.71238898038469,"cz":0,"rightJoints":["cqVaqhkF9cafDk3CujuxhA"],"selected":false,"foundationId":"aXWETyunkqtQVNXGWr9VZd","lx":26.50000000000001,"parentId":"aXWETyunkqtQVNXGWr9VZd","rotation":[0,0,-0.41015237421866746],"rightPoint":[-30.89592496118435,-13.439004891026267,1],"color":"white","type":"Wall","normal":[0,0,1],"rightRoofHeight":5,"leftJoints":["qmFzWJnLZGgtRZtU4NCV2i"],"cx":-30.895924961184342,"windows":[],"roofId":"adpYUuHEY6XwTLGq9piRR2","ly":0.3,"lineWidth":0.2,"id":"8UV181m3Qgm4gVeHjN6o1N","locked":false,"lineColor":"black","showLabel":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"lz":1,"solarAbsorberPipe":{},"cz":0.5,"ly":4.206012254646608,"type":"Foundation","rotation":[0,0,-0.41015237421866746],"lx":31.26437853168839,"normal":[0,0,1],"solarUpdraftTower":{},"cx":-2.5548208091674596,"selected":false,"parentId":"Ground","cy":-104.18033992817378,"solarPowerTower":{},"locked":false,"id":"67y6tGP5Z273J9KfaZt2qW"},{"color":"white","ly":0.3,"normal":[0,0,1],"windows":[],"leftPoint":[-2.1622916607695264,-2.0529036258004845,0],"rightPoint":[-2.1622916607695246,1.9676858128519996,0],"rightRoofHeight":6,"roofId":"vamU7TTNZeBARJChC8HbPy","rightJoints":["vyB1xaFqKE2eYECPWHSjtt"],"lineColor":"black","showLabel":false,"type":"Wall","parentId":"67y6tGP5Z273J9KfaZt2qW","cz":0,"id":"vVaHoupmNeeUhBf8aEhNwN","cy":-0.042608906474242425,"foundationId":"67y6tGP5Z273J9KfaZt2qW","lineWidth":0.2,"textureType":"Wall Texture Default","leftJoints":["c2T86bj1Ndr1wBUNfBDMTd"],"cx":-2.1622916607695255,"relativeAngle":1.5707963267948961,"rotation":[0,0,-0.41015237421866746],"selected":false,"centerRoofHeight":[0,6.274887651356121],"lz":6,"lx":4.020589438652484,"leftRoofHeight":6,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"cy":-2.0529036258004867,"relativeAngle":5.681468402920898e-16,"selected":false,"normal":[0,0,1],"lz":6,"parentId":"67y6tGP5Z273J9KfaZt2qW","windows":[],"ly":0.3,"textureType":"Wall Texture Default","leftJoints":["42wy1mrJXkRG5d8TpG2sXB"],"roofId":"vamU7TTNZeBARJChC8HbPy","cz":0,"leftPoint":[-9.97874294335964,-2.052903625800489,0],"lineWidth":0.2,"id":"c2T86bj1Ndr1wBUNfBDMTd","rightRoofHeight":6,"color":"white","locked":false,"cx":-6.070517302064583,"lineColor":"black","lx":7.816451282590114,"type":"Wall","rotation":[0,0,-0.41015237421866746],"rightPoint":[-2.1622916607695264,-2.0529036258004845,0],"rightJoints":["vVaHoupmNeeUhBf8aEhNwN"],"showLabel":false,"foundationId":"67y6tGP5Z273J9KfaZt2qW","leftRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"showLabel":false,"lineWidth":0.2,"lx":4.020589438652497,"cy":-0.042608906474240316,"color":"white","lineColor":"black","leftJoints":["vyB1xaFqKE2eYECPWHSjtt"],"id":"42wy1mrJXkRG5d8TpG2sXB","leftPoint":[-9.978742943359647,1.9676858128520083,0],"ly":0.3,"cz":0,"parentId":"67y6tGP5Z273J9KfaZt2qW","rightRoofHeight":6,"lz":6,"type":"Wall","cx":-9.978742943359643,"relativeAngle":-1.5707963267948948,"foundationId":"67y6tGP5Z273J9KfaZt2qW","normal":[0,0,1],"rightJoints":["c2T86bj1Ndr1wBUNfBDMTd"],"textureType":"Wall Texture Default","locked":false,"selected":false,"centerRoofHeight":[0,6.274887651356121],"windows":[],"roofId":"vamU7TTNZeBARJChC8HbPy","leftRoofHeight":6,"rightPoint":[-9.97874294335964,-2.052903625800489,0],"rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightRoofHeight":6,"id":"vyB1xaFqKE2eYECPWHSjtt","textureType":"Wall Texture Default","lx":7.816451282590123,"leftRoofHeight":6,"color":"white","selected":false,"roofId":"vamU7TTNZeBARJChC8HbPy","showLabel":false,"cz":3.7151685093329987,"cx":-6.0705173020645855,"rotation":[0,0,-0.41015237421866746],"type":"Wall","rightPoint":[-9.978742943359647,1.9676858128520083,0],"ly":0.3,"lineWidth":0.2,"windows":[],"parentId":"67y6tGP5Z273J9KfaZt2qW","foundationId":"67y6tGP5Z273J9KfaZt2qW","leftJoints":["vVaHoupmNeeUhBf8aEhNwN"],"cy":1.9676858128520038,"locked":false,"relativeAngle":3.1415926535897922,"rightJoints":["42wy1mrJXkRG5d8TpG2sXB"],"leftPoint":[-2.1622916607695246,1.9676858128519996,0],"lineColor":"black","lz":6,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"cz":0.5,"id":"vr622m4sUbseJrnaD3qEiM","cx":-34.35924569376295,"rotation":[0,0,-0.41015237421866746],"solarAbsorberPipe":{},"lz":1,"normal":[0,0,1],"solarPowerTower":{},"selected":false,"lx":9.87769053193653,"ly":13.609083182601537,"solarUpdraftTower":{},"locked":false,"parentId":"Ground","type":"Foundation","cy":-110.59011455401989},{"leftJoints":["mMXGrqXV1RkkkiT4sMy7uW"],"lineWidth":0.2,"cz":0,"rightRoofHeight":5.5,"rightPoint":[-3.499999999999999,5.5,0],"cy":5.5,"relativeAngle":3.141592653589793,"color":"white","roofId":"2v86EFgUZGnV81678JbvWF","locked":false,"windows":[],"leftPoint":[3.5,5.5,0],"lz":5.5,"selected":false,"type":"Wall","normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","showLabel":false,"id":"3XaMSJRAJ16nXkn1WKx9DA","lx":6.999999999999999,"foundationId":"vr622m4sUbseJrnaD3qEiM","ly":0.3,"rightJoints":["fgcrmKBkK397YQPfDfJ1C1"],"parentId":"vr622m4sUbseJrnaD3qEiM","leftRoofHeight":5.5,"lineColor":"black","cx":4.440892098500626e-16,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"rightJoints":["3XaMSJRAJ16nXkn1WKx9DA"],"lx":6.000000000000007,"windows":[],"rotation":[0,0,-0.41015237421866746],"locked":false,"normal":[0,0,1],"lineColor":"black","showLabel":false,"leftJoints":["gphnEpjKALdRhPrtitPn39"],"lz":5.5,"rightRoofHeight":5.5,"selected":false,"foundationId":"vr622m4sUbseJrnaD3qEiM","leftRoofHeight":5.5,"parentId":"vr622m4sUbseJrnaD3qEiM","ly":0.3,"lineWidth":0.2,"cy":2.5000000000000036,"id":"mMXGrqXV1RkkkiT4sMy7uW","rightPoint":[3.499999999999996,5.500000000000007,0],"cz":0,"textureType":"Wall Texture Default","leftPoint":[3.5,-0.5,0],"relativeAngle":1.5707963267948974,"type":"Wall","roofId":"2v86EFgUZGnV81678JbvWF","cx":3.4999999999999982,"color":"white","centerRoofHeight":[0.5,5.5],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"selected":false,"type":"Wall","windows":[],"leftPoint":[-3.499999999999999,5.5,0],"parentId":"vr622m4sUbseJrnaD3qEiM","normal":[0,0,1],"rightRoofHeight":5.5,"color":"white","lineWidth":0.2,"cz":0,"rotation":[0,0,-0.41015237421866746],"lz":5.5,"lineColor":"black","lx":6,"leftRoofHeight":5.5,"centerRoofHeight":[-0.5,5.5],"cy":2.5,"foundationId":"vr622m4sUbseJrnaD3qEiM","relativeAngle":4.71238898038469,"roofId":"2v86EFgUZGnV81678JbvWF","rightJoints":["gphnEpjKALdRhPrtitPn39"],"locked":false,"cx":-3.4999999999999996,"textureType":"Wall Texture Default","leftJoints":["3XaMSJRAJ16nXkn1WKx9DA"],"ly":0.3,"id":"fgcrmKBkK397YQPfDfJ1C1","showLabel":false,"rightPoint":[-3.5,-0.5,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"lz":5.5,"leftPoint":[-3.500000000000002,-0.5000000000000027,0],"foundationId":"vr622m4sUbseJrnaD3qEiM","cy":-0.5000000000000013,"cx":-1.1102230246251565e-15,"rightPoint":[3.5,-0.5,0],"type":"Wall","locked":false,"rotation":[0,0,-0.41015237421866746],"color":"white","rightRoofHeight":5.5,"parentId":"vr622m4sUbseJrnaD3qEiM","showLabel":false,"lx":7.000000000000002,"lineColor":"black","id":"gphnEpjKALdRhPrtitPn39","selected":false,"rightJoints":["mMXGrqXV1RkkkiT4sMy7uW"],"relativeAngle":3.806478941571964e-16,"lineWidth":0.2,"roofId":"2v86EFgUZGnV81678JbvWF","ly":0.3,"leftRoofHeight":5.5,"normal":[0,0,1],"textureType":"Wall Texture Default","leftJoints":["fgcrmKBkK397YQPfDfJ1C1"],"windows":[],"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"normal":[0,0,1],"lz":0,"selected":false,"lineWidth":0.2,"lineColor":"black","ridgeLeftPoint":[-0.5,1],"roofType":"Gable","rotation":[0,0,-0.41015237421866746],"ridgeRightPoint":[0.5,1],"color":"#ffffff","wallsId":["gphnEpjKALdRhPrtitPn39"],"foundationId":"vr622m4sUbseJrnaD3qEiM","showLabel":false,"lx":0,"ly":0,"type":"Roof","id":"2v86EFgUZGnV81678JbvWF","cy":0,"textureType":"No Roof Texture","parentId":"vr622m4sUbseJrnaD3qEiM","locked":false,"thickness":0.2,"cz":0,"cx":0,"rise":0,"ceiling":false},{"faceColors":["#808080","#808080","#808080","#808080","gray","gray"],"type":"Cuboid","normal":[0,0,1],"lz":10,"color":"#808080","rotation":[0,0,-0.41015237421866746],"id":"tJwtVMueteLadJkjPMvgHJ","ly":5.2309404248682405,"lx":17.77873962075454,"parentId":"Ground","cy":-91.40202421369783,"selected":false,"cx":-30.993558257452644,"cz":5,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false},{"normal":[0,0,1],"locked":false,"cy":-78.92340302016538,"type":"Cuboid","color":"gray","lx":1.0334892378492886,"id":"bsLSWBxdTE3mxEDuQuAp85","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"selected":false,"lz":10,"parentId":"Ground","ly":1.0961848981988211,"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":5,"rotation":[0,0,-0.41015237421866746],"cx":-51.860873283037826},{"cx":-50.86971253877132,"cy":-76.80735590147192,"color":"gray","parentId":"Ground","selected":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.41015237421866746],"lz":10,"ly":1.0961848981988211,"cz":5,"faceColors":["gray","gray","gray","gray","gray","gray"],"id":"iiF3WkKwiFkKBVE2vpXCby","lx":1.0334892378492886,"normal":[0,0,1],"locked":false,"type":"Cuboid"},{"cx":-40.795288101438004,"normal":[0,0,1],"selected":false,"cy":-87.54304825772702,"faceColors":["gray","gray","gray","gray","gray","gray"],"ly":1.57584749281375,"cz":5,"type":"Cuboid","locked":false,"id":"fxmDEQJYBtbGKzqxLPsYbc","rotation":[0,0,-0.41015237421866746],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":10,"parentId":"Ground","color":"gray","lx":2.5033124327375345},{"cx":-65.84838339559631,"parentId":"Ground","id":"gEHbpQXkCu9RtbMyy3Xryz","solarPowerTower":{},"cz":0.5,"type":"Foundation","lz":1,"locked":false,"normal":[0,0,1],"solarUpdraftTower":{},"lx":23.72966343486742,"rotation":[0,0,-0.41015237421866746],"solarAbsorberPipe":{},"selected":false,"ly":44.45702535517728,"cy":23.93484529988586},{"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","cz":0,"type":"Wall","lineWidth":0.2,"rightJoints":["e5up5WS9fCbKNmdUhKFsh6"],"ly":0.3,"parentId":"gEHbpQXkCu9RtbMyy3Xryz","leftJoints":["wxDvuiUvYK71aR1xZ9r86C"],"cx":6.378439777987635,"windows":[],"roofId":"8JTXb2hRmgAaiTxMs35gh1","rightRoofHeight":5,"leftRoofHeight":5,"leftPoint":[6.378439777987634,-14.93662498464927,0],"normal":[0,0,1],"locked":false,"rotation":[0,0,-0.41015237421866746],"selected":false,"color":"white","rightPoint":[6.378439777987638,13.906512916742425,0],"relativeAngle":1.5707963267948966,"lz":5,"showLabel":false,"lineColor":"black","lx":28.843137901391696,"id":"pk5HH5mW7Fkgf2nUSMZyW9","textureType":"Wall Texture Default","cy":-0.5150560339534227,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cz":0,"locked":false,"relativeAngle":0,"selected":false,"rightRoofHeight":5,"color":"white","lineColor":"black","lx":6.909976426153277,"ly":0.3,"textureType":"Wall Texture Default","windows":[],"leftPoint":[-0.5315366481656362,-14.93662498464927,0],"lz":5,"rightJoints":["pk5HH5mW7Fkgf2nUSMZyW9"],"type":"Wall","cx":2.9234515649110024,"rightPoint":[6.378439777987641,-14.93662498464927,0],"leftRoofHeight":5,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","showLabel":false,"rotation":[0,0,-0.41015237421866746],"roofId":"8JTXb2hRmgAaiTxMs35gh1","normal":[0,0,1],"leftJoints":["jmovDX25miN2VZhEhqh9uy"],"cy":-14.93662498464927,"lineWidth":0.2,"parentId":"gEHbpQXkCu9RtbMyy3Xryz","id":"wxDvuiUvYK71aR1xZ9r86C","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rightJoints":["ncaNE7qPYcxTMDrSjrKjqC"],"type":"Wall","lz":5,"rightRoofHeight":5,"cy":13.906512916742425,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","selected":false,"cx":2.923451564911001,"lx":6.909976426153274,"cz":0,"lineWidth":0.2,"id":"e5up5WS9fCbKNmdUhKFsh6","leftJoints":["pk5HH5mW7Fkgf2nUSMZyW9"],"locked":false,"lineColor":"black","showLabel":false,"leftRoofHeight":5,"ly":0.3,"leftPoint":[6.378439777987638,13.906512916742425,0],"color":"white","roofId":"8JTXb2hRmgAaiTxMs35gh1","parentId":"gEHbpQXkCu9RtbMyy3Xryz","textureType":"Wall Texture Default","rightPoint":[-0.5315366481656362,13.906512916742425,0],"rotation":[0,0,-0.41015237421866746],"relativeAngle":3.141592653589793,"windows":[],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"ly":0.3,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"parentId":"gEHbpQXkCu9RtbMyy3Xryz","id":"ncaNE7qPYcxTMDrSjrKjqC","rightJoints":["4z9pAxyVBGgvcBfL2oBkTg"],"lineColor":"black","color":"white","type":"Wall","cy":11.331232746975312,"locked":false,"windows":[],"rightPoint":[-2.6576832408281814,8.755952577208193,0],"lz":5,"roofId":"8JTXb2hRmgAaiTxMs35gh1","leftJoints":["e5up5WS9fCbKNmdUhKFsh6"],"selected":false,"lx":5.572142419633009,"leftPoint":[-0.5315366481656337,13.90651291674243,0],"relativeAngle":-1.962287472589105,"leftRoofHeight":5,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","showLabel":false,"cz":0,"textureType":"Wall Texture Default","lineWidth":0.2,"rightRoofHeight":5,"cx":-1.5946099444969075,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftPoint":[-2.6576832408281814,-10.301120679068463,0],"lineColor":"black","id":"jmovDX25miN2VZhEhqh9uy","leftJoints":["vmWMc4Nmqnx9AxgePRvtFK"],"rightRoofHeight":5,"ly":0.3,"cz":0,"windows":[],"relativeAngle":-1.1407594566434893,"parentId":"gEHbpQXkCu9RtbMyy3Xryz","leftRoofHeight":5,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","lz":5,"showLabel":false,"color":"white","cy":-12.618872831858864,"roofId":"8JTXb2hRmgAaiTxMs35gh1","lx":5.0998430858751655,"cx":-1.5946099444969064,"lineWidth":0.2,"type":"Wall","normal":[0,0,1],"locked":false,"rightPoint":[-0.5315366481656315,-14.936624984649265,0],"selected":false,"rightJoints":["wxDvuiUvYK71aR1xZ9r86C"],"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"lineColor":"black","type":"Wall","leftPoint":[-2.657683240828184,8.75595257720819,0],"rightRoofHeight":5,"leftRoofHeight":5,"rotation":[0,0,-0.41015237421866746],"color":"white","normal":[0,0,1],"ly":0.3,"textureType":"Wall Texture Default","parentId":"gEHbpQXkCu9RtbMyy3Xryz","cz":0,"lz":5,"showLabel":false,"rightPoint":[-3.720756537159453,3.0903362037205393,0],"relativeAngle":-1.756275603957499,"cx":-3.1892198889938186,"leftJoints":["ncaNE7qPYcxTMDrSjrKjqC"],"roofId":"8JTXb2hRmgAaiTxMs35gh1","lineWidth":0.2,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","windows":[],"lx":5.764489025482136,"id":"4z9pAxyVBGgvcBfL2oBkTg","selected":false,"rightJoints":["9Zt1Jh2MmnkaBKaBtYD19E"],"locked":false,"cy":5.923144390464365,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftPoint":[-3.720756537159453,-3.605392237673962,0],"roofId":"8JTXb2hRmgAaiTxMs35gh1","parentId":"gEHbpQXkCu9RtbMyy3Xryz","showLabel":false,"leftRoofHeight":5,"cx":-3.1892198889938137,"leftJoints":["9Zt1Jh2MmnkaBKaBtYD19E"],"type":"Wall","cy":-6.953256458371211,"windows":[],"color":"white","rightRoofHeight":5,"rightJoints":["jmovDX25miN2VZhEhqh9uy"],"textureType":"Wall Texture Default","lx":6.779594692477702,"lz":5,"rightPoint":[-2.6576832408281743,-10.30112067906846,0],"relativeAngle":-1.4133416859659305,"lineColor":"black","id":"vmWMc4Nmqnx9AxgePRvtFK","ly":0.3,"rotation":[0,0,-0.41015237421866746],"lineWidth":0.2,"locked":false,"foundationId":"gEHbpQXkCu9RtbMyy3Xryz","cz":0,"normal":[0,0,1],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"showLabel":false,"lz":5,"type":"Wall","leftJoints":["4z9pAxyVBGgvcBfL2oBkTg"],"relativeAngle":-1.5707963267948966,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"selected":false,"lineColor":"black","rightJoints":["vmWMc4Nmqnx9AxgePRvtFK"],"windows":[],"color":"white","ly":0.3,"roofId":"8JTXb2hRmgAaiTxMs35gh1","parentId":"gEHbpQXkCu9RtbMyy3Xryz","rightRoofHeight":5,"id":"9Zt1Jh2MmnkaBKaBtYD19E","leftPoint":[-3.720756537159453,3.0903362037205393,0],"lineWidth":0.2,"lx":6.695728441394501,"rightPoint":[-3.720756537159453,-3.605392237673962,0],"cy":-0.25752801697671135,"cz":0,"leftRoofHeight":5,"locked":false,"cx":-3.720756537159453,"textureType":"Wall Texture Default","foundationId":"gEHbpQXkCu9RtbMyy3Xryz","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"normal":[0,0,1],"type":"Foundation","solarPowerTower":{},"cz":0.5,"parentId":"Ground","lx":60.173882739434646,"solarAbsorberPipe":{},"id":"iUb7PSjszf44Zg2YisnC92","rotation":[0,0,-0.41015237421866746],"locked":false,"ly":39.103180000408386,"selected":false,"cy":-92.19721962691857,"cx":-31.79924395729909,"lz":1,"solarUpdraftTower":{}},{"cy":-0.32818957860566655,"normal":[0,0,1],"relativeAngle":1.5707963267948966,"rightPoint":[29.377149084975663,17.921810421394337,1],"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":5,"type":"Wall","locked":false,"cz":0,"roofId":"sYHDayEkzyov7moz6ZSxMu","lx":36.5,"selected":false,"leftPoint":[29.377149084975656,-18.57818957860566,1],"parentId":"iUb7PSjszf44Zg2YisnC92","id":"8M5AjFRvfsj1XtZsKZtgrR","leftJoints":["vBUTysuRjhgkSBTqe4LbYB"],"cx":29.37714908497567,"ly":0.3,"rightJoints":["fof9eWFH74VGAR5Qpn7HGe"],"color":"white","foundationId":"iUb7PSjszf44Zg2YisnC92","textureType":"Wall Texture Default","lz":5,"leftRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rightRoofHeight":5,"ly":0.3,"cy":-18.328189578605663,"lz":5,"locked":false,"cx":0.3771490849756667,"cz":0,"leftPoint":[-28.622850915024337,-18.07818957860566,1],"parentId":"iUb7PSjszf44Zg2YisnC92","color":"white","lx":58.00215513237418,"id":"vBUTysuRjhgkSBTqe4LbYB","selected":false,"normal":[0,0,1],"textureType":"Wall Texture Default","type":"Wall","relativeAngle":6.27456483106745,"leftRoofHeight":5,"leftJoints":["nSEqG4yU7gG9aGhAQPfSs7"],"rightJoints":["8M5AjFRvfsj1XtZsKZtgrR"],"rotation":[0,0,-0.41015237421866746],"rightPoint":[29.37714908497567,-18.578189578605652,1],"foundationId":"iUb7PSjszf44Zg2YisnC92","roofId":"sYHDayEkzyov7moz6ZSxMu","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"roofId":"sYHDayEkzyov7moz6ZSxMu","selected":false,"color":"white","cz":0,"relativeAngle":4.726276976315656,"type":"Wall","rightPoint":[-28.622850915024348,-18.078189578605663,1],"parentId":"iUb7PSjszf44Zg2YisnC92","cy":-0.07818957860566123,"rightRoofHeight":5,"lx":36.003472054789384,"foundationId":"iUb7PSjszf44Zg2YisnC92","locked":false,"ly":0.3,"rightJoints":["vBUTysuRjhgkSBTqe4LbYB"],"textureType":"Wall Texture Default","leftJoints":["fof9eWFH74VGAR5Qpn7HGe"],"rotation":[0,0,-0.41015237421866746],"leftPoint":[-29.122850915024344,17.921810421394333,1],"lz":5,"cx":-28.87285091502434,"id":"nSEqG4yU7gG9aGhAQPfSs7","leftRoofHeight":5,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"foundationId":"iUb7PSjszf44Zg2YisnC92","cz":0,"lx":58.50000000000001,"color":"white","leftRoofHeight":5,"leftPoint":[29.377149084975663,17.921810421394337,1],"rightPoint":[-29.122850915024344,17.921810421394333,1],"rightRoofHeight":5,"type":"Wall","leftJoints":["8M5AjFRvfsj1XtZsKZtgrR"],"cx":0.12714908497566135,"cy":17.921810421394333,"roofId":"sYHDayEkzyov7moz6ZSxMu","selected":false,"id":"fof9eWFH74VGAR5Qpn7HGe","lz":5,"relativeAngle":3.141592653589793,"locked":false,"ly":0.3,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"parentId":"iUb7PSjszf44Zg2YisnC92","rightJoints":["nSEqG4yU7gG9aGhAQPfSs7"],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"ridgeLeftPoint":[0,1],"wallsId":["vyB1xaFqKE2eYECPWHSjtt"],"selected":false,"lineColor":"black","thickness":0.2,"textureType":"No Roof Texture","cy":0,"locked":false,"lx":0,"foundationId":"67y6tGP5Z273J9KfaZt2qW","type":"Roof","id":"vamU7TTNZeBARJChC8HbPy","ridgeRightPoint":[0,1],"showLabel":false,"cz":0,"lineWidth":0.2,"lz":0,"cx":0,"parentId":"67y6tGP5Z273J9KfaZt2qW","ly":0,"color":"#ffffff","roofType":"Gable","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"rise":0.2748876513561207,"ceiling":false},{"rotation":[0,0,-0.41015237421866746],"color":"white","leftJoints":["aAXg3DaZ5U93pUr6mT9qRa"],"rightPoint":[21.241978419322884,-31.078254176042062,1],"relativeAngle":-8.350902447731317e-16,"cz":0,"lz":6,"normal":[0,0,1],"leftPoint":[-21.300892857609153,-31.07825417604202,1],"rightJoints":["eVDG7gqXM3uLaHhJS5k6Fh"],"textureType":"Wall Texture Default","cx":-0.02945721914313104,"cy":-31.078254176042037,"selected":false,"lx":42.54287127693204,"type":"Wall","roofId":"a67eFG3dY8EiYs3GWgTwsF","id":"eH6hFH3ypVjToGKtFHdgq1","ly":0.3,"parentId":"un11oZ7V5tAhWhFKuL8M5Q","locked":false,"foundationId":"un11oZ7V5tAhWhFKuL8M5Q","leftRoofHeight":6,"rightRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"leftJoints":["eH6hFH3ypVjToGKtFHdgq1"],"cx":21.241978419322905,"textureType":"Wall Texture Default","type":"Wall","parentId":"un11oZ7V5tAhWhFKuL8M5Q","lx":60.8712338982037,"locked":false,"roofId":"a67eFG3dY8EiYs3GWgTwsF","id":"eVDG7gqXM3uLaHhJS5k6Fh","foundationId":"un11oZ7V5tAhWhFKuL8M5Q","selected":false,"lz":6,"cz":0,"rightPoint":[21.241978419322912,29.792979722161636,1],"leftPoint":[21.241978419322884,-31.078254176042062,1],"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":6,"leftRoofHeight":6,"ly":0.3,"rightJoints":["n7z5CC6u32wsAzBksvYYPh"],"color":"white","relativeAngle":1.5707963267948961,"normal":[0,0,1],"cy":-0.6426372269402103,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","id":"n7z5CC6u32wsAzBksvYYPh","cz":0,"cx":-0.029457219143118607,"color":"white","foundationId":"un11oZ7V5tAhWhFKuL8M5Q","leftPoint":[21.241978419322912,29.792979722161636,1],"rightPoint":[-21.300892857609156,29.792979722161586,1],"rightJoints":["aAXg3DaZ5U93pUr6mT9qRa"],"lx":42.542871276932075,"lz":6,"locked":false,"rightRoofHeight":6,"selected":false,"ly":0.3,"cy":29.792979722161608,"relativeAngle":-3.1415926535897922,"textureType":"Wall Texture Default","leftRoofHeight":6,"normal":[0,0,1],"leftJoints":["eVDG7gqXM3uLaHhJS5k6Fh"],"rotation":[0,0,-0.41015237421866746],"roofId":"a67eFG3dY8EiYs3GWgTwsF","parentId":"un11oZ7V5tAhWhFKuL8M5Q","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"parentId":"un11oZ7V5tAhWhFKuL8M5Q","textureType":"Wall Texture Default","cy":-0.6426372269402094,"cx":-21.300892857609156,"ly":0.3,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.5707963267948966,"lx":60.87123389820361,"leftPoint":[-21.300892857609156,29.792979722161586,1],"rightPoint":[-21.300892857609153,-31.07825417604202,1],"selected":false,"leftRoofHeight":6,"locked":false,"rightJoints":["eH6hFH3ypVjToGKtFHdgq1"],"rightRoofHeight":6,"foundationId":"un11oZ7V5tAhWhFKuL8M5Q","id":"aAXg3DaZ5U93pUr6mT9qRa","cz":0,"color":"white","lz":6,"type":"Wall","roofId":"a67eFG3dY8EiYs3GWgTwsF","leftJoints":["n7z5CC6u32wsAzBksvYYPh"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"solarUpdraftTower":{},"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"solarPowerTower":{},"selected":false,"cy":87.53589386962994,"lz":1,"cz":0.5,"type":"Foundation","id":"un11oZ7V5tAhWhFKuL8M5Q","locked":false,"normal":[0,0,1],"cx":45.25333009420649,"solarAbsorberPipe":{},"lx":43.198179226129824,"ly":63.27584645952004},{"rightJoints":["e9GuUTJEvD6Q7osTyxTwrk"],"color":"white","lx":52.85122191172576,"rightRoofHeight":10,"ly":0.3,"lz":10,"leftRoofHeight":10,"cx":-1.8343056423094959,"locked":false,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"relativeAngle":3.141592653589793,"leftJoints":["3Yax97DpPm9sAXkyokJjCv"],"type":"Wall","parentId":"pdEGhJFD3W3BmcX1EPbyWH","foundationId":"pdEGhJFD3W3BmcX1EPbyWH","cz":0,"cy":17.27662252082144,"leftPoint":[24.59130531355338,17.276622520821444,1],"id":"2zTB9zP2crzAGhXAKtKuuQ","rightPoint":[-28.259916598172374,17.276622520821448,1],"selected":false,"textureType":"Wall Texture Default","roofId":"u17BQ8h2PCTPBYHjaSoxnN","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rightRoofHeight":10,"rightPoint":[24.591305313553377,17.276622520821448,1],"leftJoints":["9QvBYUfBnBzYQEjDjyYwwJ"],"rightJoints":["2zTB9zP2crzAGhXAKtKuuQ"],"cx":24.591305313553377,"normal":[0,0,1],"foundationId":"pdEGhJFD3W3BmcX1EPbyWH","id":"3Yax97DpPm9sAXkyokJjCv","type":"Wall","locked":false,"lx":33.26826380090492,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"textureType":"Wall Texture Default","color":"white","relativeAngle":1.5707963267948968,"lz":10,"leftPoint":[24.591305313553377,-15.991641280083474,1],"selected":false,"parentId":"pdEGhJFD3W3BmcX1EPbyWH","roofId":"u17BQ8h2PCTPBYHjaSoxnN","leftRoofHeight":10,"cz":0,"cy":0.6424906203689869,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"roofId":"u17BQ8h2PCTPBYHjaSoxnN","rightRoofHeight":10,"normal":[0,0,1],"cy":-15.99164128008347,"rotation":[0,0,-0.41015237421866746],"rightPoint":[24.59130531355339,-15.99164128008347,1],"relativeAngle":1.3444206397855422e-16,"leftJoints":["e9GuUTJEvD6Q7osTyxTwrk"],"leftRoofHeight":10,"textureType":"Wall Texture Default","lz":10,"foundationId":"pdEGhJFD3W3BmcX1EPbyWH","leftPoint":[-28.259916598172378,-15.991641280083478,1],"cx":-1.8343056423094914,"ly":0.3,"parentId":"pdEGhJFD3W3BmcX1EPbyWH","id":"9QvBYUfBnBzYQEjDjyYwwJ","cz":0,"rightJoints":["3Yax97DpPm9sAXkyokJjCv"],"selected":false,"type":"Wall","locked":false,"color":"white","lx":52.85122191172576,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lx":33.268263800904926,"roofId":"u17BQ8h2PCTPBYHjaSoxnN","locked":false,"color":"white","lz":10,"leftPoint":[-28.259916598172374,17.276622520821448,1],"cz":0,"cx":-28.259916598172378,"foundationId":"pdEGhJFD3W3BmcX1EPbyWH","rightRoofHeight":10,"rightJoints":["9QvBYUfBnBzYQEjDjyYwwJ"],"rightPoint":[-28.25991659817238,-15.991641280083474,1],"leftJoints":["2zTB9zP2crzAGhXAKtKuuQ"],"rotation":[0,0,-0.41015237421866746],"cy":0.6424906203689869,"parentId":"pdEGhJFD3W3BmcX1EPbyWH","leftRoofHeight":10,"selected":false,"id":"e9GuUTJEvD6Q7osTyxTwrk","ly":0.3,"textureType":"Wall Texture Default","normal":[0,0,1],"type":"Wall","relativeAngle":-1.5707963267948968,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"ly":35.70031798940237,"cy":9.0346445367948,"cx":-34.76955763240692,"solarPowerTower":{},"id":"pdEGhJFD3W3BmcX1EPbyWH","solarUpdraftTower":{},"lz":1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"parentId":"Ground","type":"Foundation","color":"#808080","lx":61.18626972549096,"rotation":[0,0,-0.41015237421866746],"locked":false,"cz":0.5},{"ly":0.3,"rightJoints":["uSo7fsB5ruR2pmb3hS5LJZ"],"roofId":"iLELU7fMnA7QkYUmgQBEWM","rightPoint":[-11.5,12.5,0],"selected":false,"normal":[0,0,1],"type":"Wall","rotation":[0,0,-0.41015237421866746],"leftRoofHeight":5,"color":"white","rightRoofHeight":5,"locked":false,"leftJoints":["9NzKjLTF3oM85YSQpL4gnd"],"relativeAngle":1.5707963267948961,"lz":5,"cx":-11.5,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","cz":0,"lx":4.5000000000000036,"cy":10.249999999999998,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","textureType":"Wall Texture Default","id":"qVHFnW8AAY4XUoieeiErxH","leftPoint":[-11.500000000000002,7.9999999999999964,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cy":-3.699284342853991,"cz":0,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","id":"o6KGNbWFg87od5BX9EpsTo","leftRoofHeight":5,"rightJoints":["9NzKjLTF3oM85YSQpL4gnd"],"lz":5,"normal":[0,0,1],"roofId":"iLELU7fMnA7QkYUmgQBEWM","rightPoint":[19,8,0],"type":"Wall","rightRoofHeight":5,"lx":23.399166797479726,"locked":false,"leftJoints":["2TSEdoLpnDva8vLd5CzUbS"],"relativeAngle":1.577946340946004,"selected":false,"textureType":"Wall Texture Default","cx":19.08365147411056,"color":"white","rotation":[0,0,-0.41015237421866746],"ly":0.3,"leftPoint":[19.167302948221124,-15.398568685707982,0],"parentId":"5Ccs4YQJG3fyuyHdGw79zD","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"roofId":"iLELU7fMnA7QkYUmgQBEWM","id":"2TSEdoLpnDva8vLd5CzUbS","rightRoofHeight":5,"locked":false,"normal":[0,0,1],"cy":-15.449284342853987,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","rotation":[0,0,-0.41015237421866746],"leftPoint":[-17.5,-15.5,0],"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","ly":0.3,"rightPoint":[19.16730294822113,-15.398568685707975,0],"selected":false,"rightJoints":["o6KGNbWFg87od5BX9EpsTo"],"leftJoints":["g6f1sfDxicEvG7uLqaixdo"],"relativeAngle":0.0027662535123536003,"type":"Wall","cx":0.8336514741105656,"lz":5,"textureType":"Wall Texture Default","leftRoofHeight":5,"lx":36.667443240675304,"color":"white","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftJoints":["susL6EqdzG6nqxMNGZaDXi"],"rightPoint":[-17.5,-15.5,0],"rotation":[0,0,-0.41015237421866746],"ly":0.3,"leftRoofHeight":5,"selected":false,"color":"white","foundationId":"5Ccs4YQJG3fyuyHdGw79zD","id":"g6f1sfDxicEvG7uLqaixdo","parentId":"5Ccs4YQJG3fyuyHdGw79zD","lx":12.5,"textureType":"Wall Texture Default","locked":false,"rightJoints":["2TSEdoLpnDva8vLd5CzUbS"],"cy":-9.25,"type":"Wall","leftPoint":[-17.5,-3,0],"roofId":"iLELU7fMnA7QkYUmgQBEWM","rightRoofHeight":5,"lz":5,"relativeAngle":4.71238898038469,"cx":-17.5,"cz":0,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cz":0.5,"ly":46.30008176444467,"color":"#808080","selected":false,"solarUpdraftTower":{},"locked":false,"solarAbsorberPipe":{},"type":"Foundation","cy":36.64822593291561,"id":"5Ccs4YQJG3fyuyHdGw79zD","rotation":[0,0,-0.41015237421866746],"cx":-16.881510447516995,"lx":50.75601134711293,"parentId":"Ground","lz":1,"normal":[0,0,1],"solarPowerTower":{}},{"type":"Wall","foundationId":"bEJsUFdHaD6DHGcx6x8yR6","rightPoint":[-13.223409044384212,13.466478685194005,1],"rightJoints":["wv4UgZqFkoaJSym14cGEUi"],"ly":0.3,"rightRoofHeight":10,"roofId":"gTmk5BL11HKrSyJkFQtskK","locked":false,"normal":[0,0,1],"cx":2.2442947755447555,"leftRoofHeight":10,"relativeAngle":3.141592653589793,"cy":13.466478685194003,"cz":0,"rotation":[0,0,-0.41015237421866746],"parentId":"bEJsUFdHaD6DHGcx6x8yR6","color":"white","id":"3VxH8hmRUhtWZN2xHFt4SG","selected":false,"textureType":"Wall Texture Default","leftJoints":["xrxYGVSxLCof2hSDyYDBhi"],"leftPoint":[17.711998595473723,13.466478685193998,1],"lz":10,"lx":30.935407639857935,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"leftPoint":[17.71199859547372,-9.01511632562459,1],"color":"white","lz":10,"foundationId":"bEJsUFdHaD6DHGcx6x8yR6","rotation":[0,0,-0.41015237421866746],"cy":2.2256811797847043,"lx":22.481595010818598,"leftJoints":["arZ3wqpChkyUrckbL7omCG"],"roofId":"gTmk5BL11HKrSyJkFQtskK","textureType":"Wall Texture Default","locked":false,"cx":17.71199859547372,"rightPoint":[17.711998595473712,13.466478685194001,1],"parentId":"bEJsUFdHaD6DHGcx6x8yR6","leftRoofHeight":10,"ly":0.3,"type":"Wall","normal":[0,0,1],"id":"xrxYGVSxLCof2hSDyYDBhi","relativeAngle":1.570796326794897,"selected":false,"rightJoints":["3VxH8hmRUhtWZN2xHFt4SG"],"rightRoofHeight":10,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"foundationId":"bEJsUFdHaD6DHGcx6x8yR6","textureType":"Wall Texture Default","parentId":"bEJsUFdHaD6DHGcx6x8yR6","cy":-9.015116325624591,"type":"Wall","roofId":"gTmk5BL11HKrSyJkFQtskK","locked":false,"selected":false,"relativeAngle":5.742147832930279e-17,"lx":30.935407639857935,"id":"arZ3wqpChkyUrckbL7omCG","rightPoint":[17.711998595473727,-9.015116325624586,1],"normal":[0,0,1],"leftRoofHeight":10,"leftPoint":[-13.223409044384207,-9.015116325624595,1],"cx":2.244294775544758,"ly":0.3,"cz":0,"lz":10,"rightRoofHeight":10,"rotation":[0,0,-0.41015237421866746],"leftJoints":["wv4UgZqFkoaJSym14cGEUi"],"color":"white","rightJoints":["xrxYGVSxLCof2hSDyYDBhi"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rotation":[0,0,-0.41015237421866746],"selected":false,"leftPoint":[-13.223409044384212,13.466478685194005,1],"lx":22.4815950108186,"cz":0,"locked":false,"leftRoofHeight":10,"foundationId":"bEJsUFdHaD6DHGcx6x8yR6","type":"Wall","parentId":"bEJsUFdHaD6DHGcx6x8yR6","rightPoint":[-13.223409044384217,-9.0151163256246,1],"ly":0.3,"leftJoints":["3VxH8hmRUhtWZN2xHFt4SG"],"rightRoofHeight":10,"relativeAngle":-1.5707963267948968,"cx":-13.22340904438421,"id":"wv4UgZqFkoaJSym14cGEUi","roofId":"gTmk5BL11HKrSyJkFQtskK","cy":2.225681179784705,"normal":[0,0,1],"textureType":"Wall Texture Default","rightJoints":["arZ3wqpChkyUrckbL7omCG"],"color":"white","lz":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lx":38.16899134770527,"locked":false,"type":"Foundation","cz":0.5,"ly":29.987807733938208,"solarAbsorberPipe":{},"solarUpdraftTower":{},"solarPowerTower":{},"parentId":"Ground","cx":-9.057642071147427,"rotation":[0,0,-0.41015237421866746],"color":"#808080","id":"bEJsUFdHaD6DHGcx6x8yR6","normal":[0,0,1],"cy":51.32581716422129,"lz":1,"selected":false},{"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","rightRoofHeight":5,"rotation":[0,0,-0.41015237421866746],"leftRoofHeight":5,"lx":19.88616352810249,"selected":false,"rightJoints":["bQ2Kx7puBgpzyzLtLqMSws"],"normal":[0,0,1],"ly":0.3,"cz":0,"color":"white","leftJoints":["oiFAJnXcnAH7zdnComwnZ7"],"roofId":"1qyyipEsGS2s5T9XgP6Hmh","id":"wQJum4dZFQ5ppcaqoirdh1","rightPoint":[-8.228455824549409,10.031147764731335,1],"lz":5,"locked":false,"cx":1.7146259395018353,"textureType":"Wall Texture Default","relativeAngle":3.141592653589793,"parentId":"wBnvyTf1aAJoT1h5Lem3nN","type":"Wall","cy":10.03114776473134,"leftPoint":[11.657707703553081,10.031147764731333,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"locked":false,"cz":0,"roofId":"1qyyipEsGS2s5T9XgP6Hmh","type":"Wall","color":"white","selected":false,"parentId":"wBnvyTf1aAJoT1h5Lem3nN","leftPoint":[11.657707703553083,-7.894846587717293,1],"ly":0.3,"rightRoofHeight":5,"relativeAngle":1.5707963267948972,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","lx":17.92599435244863,"leftRoofHeight":5,"leftJoints":["cEMfGqLjg1Ef23MmrZJMBi"],"id":"oiFAJnXcnAH7zdnComwnZ7","cy":1.0681505885070242,"lz":5,"rightJoints":["wQJum4dZFQ5ppcaqoirdh1"],"textureType":"Wall Texture Default","cx":11.657707703553074,"rightPoint":[11.657707703553076,10.03114776473133,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rotation":[0,0,-0.41015237421866746],"locked":false,"relativeAngle":8.932627134891857e-17,"lz":5,"ly":0.3,"cy":-7.894846587717294,"lx":19.886163528102486,"selected":false,"leftRoofHeight":5,"rightJoints":["oiFAJnXcnAH7zdnComwnZ7"],"roofId":"1qyyipEsGS2s5T9XgP6Hmh","color":"white","normal":[0,0,1],"parentId":"wBnvyTf1aAJoT1h5Lem3nN","rightRoofHeight":5,"cx":1.714625939501836,"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","rightPoint":[11.657707703553083,-7.894846587717293,1],"type":"Wall","leftJoints":["bQ2Kx7puBgpzyzLtLqMSws"],"id":"cEMfGqLjg1Ef23MmrZJMBi","cz":0,"leftPoint":[-8.22845582454941,-7.894846587717293,1],"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","rightRoofHeight":5,"selected":false,"cx":-8.228455824549414,"locked":false,"cz":0,"color":"white","roofId":"1qyyipEsGS2s5T9XgP6Hmh","rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.5707963267948968,"rightJoints":["cEMfGqLjg1Ef23MmrZJMBi"],"type":"Wall","leftJoints":["wQJum4dZFQ5ppcaqoirdh1"],"lx":17.925994352448633,"cy":1.0681505885070197,"leftPoint":[-8.228455824549409,10.031147764731335,1],"id":"bQ2Kx7puBgpzyzLtLqMSws","parentId":"wBnvyTf1aAJoT1h5Lem3nN","ly":0.3,"normal":[0,0,1],"textureType":"Wall Texture Default","rightPoint":[-8.22845582454941,-7.894846587717293,1],"leftRoofHeight":5,"lz":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"id":"wBnvyTf1aAJoT1h5Lem3nN","type":"Foundation","solarAbsorberPipe":{},"ly":25.324222344655617,"cx":-30.225503309474327,"solarPowerTower":{},"cz":0.5,"lz":1,"normal":[0,0,1],"locked":false,"lx":23.992259398375765,"color":"#808080","solarUpdraftTower":{},"cy":64.37240201413404,"selected":false},{"selected":false,"color":"white","rightRoofHeight":5,"ly":0.3,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","id":"9NzKjLTF3oM85YSQpL4gnd","cy":7.999999999999999,"cz":0,"leftJoints":["o6KGNbWFg87od5BX9EpsTo"],"lx":30.5,"leftRoofHeight":5,"showLabel":false,"lineColor":"black","leftPoint":[19,7.999999999999998,0],"locked":false,"lz":5,"cx":3.75,"normal":[0,0,1],"rightJoints":["qVHFnW8AAY4XUoieeiErxH"],"lineWidth":0.2,"rightPoint":[-11.5,8,0],"roofId":"iLELU7fMnA7QkYUmgQBEWM","type":"Wall","foundationId":"5Ccs4YQJG3fyuyHdGw79zD","relativeAngle":3.141592653589793,"rotation":[0,0,-0.41015237421866746],"windows":[],"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rightJoints":["4HqBTHcSgWW5QKhSZyPhns"],"selected":false,"rightRoofHeight":5,"id":"uSo7fsB5ruR2pmb3hS5LJZ","leftPoint":[-11.5,12.499999999999998,0],"leftRoofHeight":5,"lz":5,"relativeAngle":3.141592653589793,"showLabel":false,"lx":12,"cz":0,"textureType":"Wall Texture Default","foundationId":"5Ccs4YQJG3fyuyHdGw79zD","leftJoints":["qVHFnW8AAY4XUoieeiErxH"],"locked":false,"roofId":"iLELU7fMnA7QkYUmgQBEWM","cx":-17.5,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","lineWidth":0.2,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"cy":12.5,"normal":[0,0,1],"type":"Wall","rightPoint":[-23.5,12.5,0],"lineColor":"black","windows":[],"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"locked":false,"lx":15.5,"rightRoofHeight":5,"leftRoofHeight":5,"showLabel":false,"relativeAngle":4.71238898038469,"cy":4.75,"cz":0,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","color":"white","cx":-23.5,"textureType":"Wall Texture Default","leftPoint":[-23.5,12.5,0],"rotation":[0,0,-0.41015237421866746],"lineWidth":0.2,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","ly":0.3,"rightJoints":["susL6EqdzG6nqxMNGZaDXi"],"type":"Wall","roofId":"iLELU7fMnA7QkYUmgQBEWM","lz":5,"lineColor":"black","id":"4HqBTHcSgWW5QKhSZyPhns","normal":[0,0,1],"selected":false,"windows":[],"leftJoints":["uSo7fsB5ruR2pmb3hS5LJZ"],"rightPoint":[-23.5,-3,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"selected":false,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","id":"susL6EqdzG6nqxMNGZaDXi","color":"white","cy":-3.000000000000001,"cz":0,"rotation":[0,0,-0.41015237421866746],"rightPoint":[-17.5,-3,0],"leftRoofHeight":5,"lz":5,"leftJoints":["4HqBTHcSgWW5QKhSZyPhns"],"parentId":"5Ccs4YQJG3fyuyHdGw79zD","normal":[0,0,1],"textureType":"Wall Texture Default","locked":false,"ly":0.3,"lx":6,"leftPoint":[-23.5,-3.0000000000000018,0],"lineColor":"black","lineWidth":0.2,"showLabel":false,"rightJoints":["g6f1sfDxicEvG7uLqaixdo"],"windows":[],"roofId":"iLELU7fMnA7QkYUmgQBEWM","relativeAngle":2.9605947323337506e-16,"cx":-20.5,"type":"Wall","rightRoofHeight":5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"relativeAngle":3.141592653589793,"color":"white","leftPoint":[14.941525004458317,12.56263735597024,1],"cy":12.562637355970242,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","leftRoofHeight":12,"rightPoint":[-13.249437673269998,12.562637355970246,1],"cx":0.8460436655941601,"rotation":[0,0,-0.41015237421866746],"cz":0,"selected":false,"rightJoints":["1RLyYLqhL7EB8W88F1YjMf"],"leftJoints":["8SK72dWsX2KdwBhjqAJrHR"],"normal":[0,0,1],"type":"Wall","lz":12,"roofId":"g8pgyA4zcrzdfdvNphwHQy","textureType":"Wall Texture Default","rightRoofHeight":12,"lx":28.190962677728308,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","ly":0.3,"locked":false,"id":"eAv1PVUtpNQ3MSDZw48MQs","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"normal":[0,0,1],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","rightJoints":["eAv1PVUtpNQ3MSDZw48MQs"],"locked":false,"rightRoofHeight":12,"lx":23.84442368092651,"leftRoofHeight":12,"ly":0.3,"relativeAngle":1.573797223078846,"type":"Wall","foundationId":"9VLFJ7oUEizHpLYBMkGrSR","roofId":"g8pgyA4zcrzdfdvNphwHQy","id":"8SK72dWsX2KdwBhjqAJrHR","cz":0,"color":"white","cx":14.977302271968785,"rotation":[0,0,-0.41015237421866746],"leftJoints":["feUXDC3dk8QN3nPhgvxRs7"],"selected":false,"leftPoint":[15.013079539479259,-11.281678961006573,1],"lz":12,"cy":0.6404791974818389,"rightPoint":[14.941525004458313,12.562637355970246,1],"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"parentId":"9VLFJ7oUEizHpLYBMkGrSR","locked":false,"id":"mJUeyE2zphErZr6GzDs3tZ","color":"white","leftJoints":["1RLyYLqhL7EB8W88F1YjMf"],"rotation":[0,0,-0.41015237421866746],"lz":12,"lx":10.00000000000001,"rightRoofHeight":12,"roofId":"g8pgyA4zcrzdfdvNphwHQy","cz":0,"rightJoints":["j1cSjqWhsVxayuMSQv24u3"],"leftPoint":[-13.48692046052075,-20.78167896100656,1],"selected":false,"textureType":"Wall Texture Default","leftRoofHeight":12,"rightPoint":[-3.4869204605207464,-20.78167896100657,1],"ly":0.3,"relativeAngle":6.2831853071795845,"cy":-20.781678961006566,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","type":"Wall","normal":[0,0,1],"cx":-8.486920460520746,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"rightJoints":["mJUeyE2zphErZr6GzDs3tZ"],"rightPoint":[-13.486920460520746,-20.78167896100657,1],"roofId":"g8pgyA4zcrzdfdvNphwHQy","locked":false,"textureType":"Wall Texture Default","ly":0.3,"rotation":[0,0,-0.41015237421866746],"leftRoofHeight":12,"type":"Wall","normal":[0,0,1],"cy":-4.109520802518161,"rightRoofHeight":12,"lz":12,"selected":false,"leftJoints":["eAv1PVUtpNQ3MSDZw48MQs"],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","relativeAngle":4.705266963855983,"cx":-13.36817906689537,"lx":33.345161998719504,"id":"1RLyYLqhL7EB8W88F1YjMf","cz":0,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","leftPoint":[-13.249437673270002,12.562637355970253,1],"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"selected":false,"solarUpdraftTower":{},"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","solarPowerTower":{},"normal":[0,0,1],"cy":-20.68271396979996,"id":"9VLFJ7oUEizHpLYBMkGrSR","type":"Foundation","cz":0.5,"lz":1,"lx":37.181112111986096,"color":"#808080","cx":-37.24334643439944,"locked":false,"ly":48.16142132853967,"solarAbsorberPipe":{}},{"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":10,"leftJoints":["2EixC2HpxvUhCDPQSQd8uE"],"roofId":"teQS3ohvRHqAbgCQQahyC6","ly":0.3,"leftPoint":[22.429243972447885,21.46242092084928,1],"type":"Wall","normal":[0,0,1],"selected":false,"lz":10,"lx":44.9605119434254,"rightPoint":[-22.53126797097753,21.462420920849283,1],"foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","cx":-0.05101199926482192,"id":"c79sKVUHUztGcC5p3emVv9","color":"white","locked":false,"cy":21.46242092084928,"cz":0,"leftRoofHeight":10,"relativeAngle":3.141592653589793,"parentId":"tjMZKt5v9D1sx6sc6Xyaq2","textureType":"Wall Texture Default","rightJoints":["rAsfTcgvLcTeECYxyTewjt"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"roofId":"teQS3ohvRHqAbgCQQahyC6","cx":22.42924397244788,"lz":10,"cz":0,"rotation":[0,0,-0.41015237421866746],"foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","type":"Wall","relativeAngle":1.5707963267948968,"rightPoint":[22.429243972447868,21.46242092084928,1],"normal":[0,0,1],"id":"2EixC2HpxvUhCDPQSQd8uE","locked":false,"parentId":"tjMZKt5v9D1sx6sc6Xyaq2","leftRoofHeight":10,"lx":42.36942370339931,"rightJoints":["c79sKVUHUztGcC5p3emVv9"],"ly":0.3,"leftJoints":["hxjd42T86KZffMsDx5Lnqd"],"leftPoint":[22.42924397244787,-20.907002782550034,1],"selected":false,"rightRoofHeight":10,"cy":0.27770906914962534,"textureType":"Wall Texture Default","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"cz":0,"locked":false,"leftPoint":[-22.531267970977524,-20.90700278255003,1],"roofId":"teQS3ohvRHqAbgCQQahyC6","lz":10,"rightRoofHeight":10,"leftJoints":["rAsfTcgvLcTeECYxyTewjt"],"relativeAngle":1.5803706520383676e-16,"rotation":[0,0,-0.41015237421866746],"cy":-20.907002782550027,"selected":false,"lx":44.9605119434254,"textureType":"Wall Texture Default","cx":-0.05101199926482192,"leftRoofHeight":10,"type":"Wall","rightPoint":[22.429243972447882,-20.907002782550023,1],"color":"white","ly":0.3,"rightJoints":["2EixC2HpxvUhCDPQSQd8uE"],"id":"hxjd42T86KZffMsDx5Lnqd","parentId":"tjMZKt5v9D1sx6sc6Xyaq2","foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"normal":[0,0,1],"ly":0.3,"locked":false,"cx":-22.531267970977524,"leftRoofHeight":10,"parentId":"tjMZKt5v9D1sx6sc6Xyaq2","color":"white","relativeAngle":-1.5707963267948968,"textureType":"Wall Texture Default","selected":false,"type":"Wall","lz":10,"rightRoofHeight":10,"id":"rAsfTcgvLcTeECYxyTewjt","cz":0,"cy":0.27770906914962445,"rightPoint":[-22.53126797097753,-20.90700278255004,1],"leftJoints":["c79sKVUHUztGcC5p3emVv9"],"rightJoints":["hxjd42T86KZffMsDx5Lnqd"],"leftPoint":[-22.53126797097753,21.462420920849283,1],"rotation":[0,0,-0.41015237421866746],"foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","roofId":"teQS3ohvRHqAbgCQQahyC6","lx":42.36942370339932,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"cz":0.5,"id":"tjMZKt5v9D1sx6sc6Xyaq2","lx":46.90554216771846,"cy":18.6131690650482,"locked":false,"color":"#808080","solarPowerTower":{},"selected":false,"rotation":[0,0,-0.41015237421866746],"lz":1,"parentId":"Ground","ly":43.713031743362755,"cx":59.64808106801135,"solarUpdraftTower":{},"type":"Foundation","solarAbsorberPipe":{},"normal":[0,0,1]},{"leftJoints":["1nApY26ge55fxfDJGTDRg7"],"color":"white","relativeAngle":3.141592653589793,"normal":[0,0,1],"selected":false,"leftPoint":[23.979857556057137,22.372040279665153,1],"cy":22.37204027966516,"cx":0.07009613256013125,"leftRoofHeight":10,"rightPoint":[-23.83966529093686,22.372040279665164,1],"lz":10,"foundationId":"2LZNQJZFPrCxZzv5NuwumV","cz":0,"rightJoints":["rZvSe3ehuF6gYShWHjg7Kt"],"ly":0.3,"locked":false,"parentId":"2LZNQJZFPrCxZzv5NuwumV","rightRoofHeight":10,"roofId":"9TF7gEynqtnsWJGidoBUNq","id":"hcTBY8guDEpwEg5jtYtD3H","rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","lx":47.81952284699399,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rotation":[0,0,-0.41015237421866746],"roofId":"9TF7gEynqtnsWJGidoBUNq","selected":false,"foundationId":"2LZNQJZFPrCxZzv5NuwumV","locked":false,"rightRoofHeight":10,"textureType":"Wall Texture Default","parentId":"2LZNQJZFPrCxZzv5NuwumV","leftRoofHeight":10,"rightPoint":[23.979857556057127,22.37204027966517,1],"relativeAngle":1.5707963267948966,"rightJoints":["hcTBY8guDEpwEg5jtYtD3H"],"id":"1nApY26ge55fxfDJGTDRg7","lx":42.78808681818175,"cy":0.9779968705742945,"cz":0,"leftJoints":["4gP6SGPKJj7CUqEnRFmQ9x"],"color":"white","leftPoint":[23.979857556057127,-20.41604653851659,1],"type":"Wall","normal":[0,0,1],"ly":0.3,"cx":23.979857556057123,"lz":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"cz":0,"id":"4gP6SGPKJj7CUqEnRFmQ9x","cy":-20.416046538516596,"color":"white","locked":false,"relativeAngle":3.714710506593678e-16,"leftJoints":["rZvSe3ehuF6gYShWHjg7Kt"],"rightPoint":[23.979857556057144,-20.41604653851658,1],"lx":47.819522846994,"selected":false,"ly":0.3,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"parentId":"2LZNQJZFPrCxZzv5NuwumV","foundationId":"2LZNQJZFPrCxZzv5NuwumV","cx":0.07009613256014546,"lz":10,"leftRoofHeight":10,"type":"Wall","rightJoints":["1nApY26ge55fxfDJGTDRg7"],"roofId":"9TF7gEynqtnsWJGidoBUNq","leftPoint":[-23.83966529093686,-20.416046538516596,1],"rightRoofHeight":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lz":10,"normal":[0,0,1],"locked":false,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":10,"rightPoint":[-23.839665290936864,-20.416046538516596,1],"leftJoints":["hcTBY8guDEpwEg5jtYtD3H"],"roofId":"9TF7gEynqtnsWJGidoBUNq","cx":-23.839665290936868,"rightJoints":["4gP6SGPKJj7CUqEnRFmQ9x"],"leftPoint":[-23.83966529093686,22.372040279665164,1],"cy":0.9779968705742856,"relativeAngle":-1.5707963267948968,"id":"rZvSe3ehuF6gYShWHjg7Kt","ly":0.3,"selected":false,"parentId":"2LZNQJZFPrCxZzv5NuwumV","color":"white","lx":42.78808681818176,"textureType":"Wall Texture Default","type":"Wall","foundationId":"2LZNQJZFPrCxZzv5NuwumV","cz":0,"leftRoofHeight":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"locked":false,"solarAbsorberPipe":{},"rotation":[0,0,-0.41015237421866746],"cz":0.5,"color":"#808080","lx":52.581175557196865,"solarUpdraftTower":{},"ly":46.345317346771616,"lz":1,"id":"2LZNQJZFPrCxZzv5NuwumV","selected":false,"type":"Foundation","cy":-66.29767782769949,"solarPowerTower":{},"normal":[0,0,1],"cx":24.045330033541646,"parentId":"Ground"},{"textureType":"Wall Texture Default","lineColor":"black","leftPoint":[-3.4869204605207464,-20.78167896100657,1],"ly":0.3,"rightRoofHeight":12,"roofId":"g8pgyA4zcrzdfdvNphwHQy","lz":12,"rightPoint":[8.51307953947926,-14.281678961006572,1],"lineWidth":0.2,"relativeAngle":0.4964227534048815,"locked":false,"type":"Wall","cx":2.5130795394792607,"windows":[],"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","color":"white","id":"j1cSjqWhsVxayuMSQv24u3","showLabel":false,"selected":false,"lx":13.647344063956183,"normal":[0,0,1],"cz":0,"cy":-17.531678961006573,"leftJoints":["mJUeyE2zphErZr6GzDs3tZ"],"leftRoofHeight":12,"rotation":[0,0,-0.41015237421866746],"rightJoints":["svVfgRXxxLmkheyww2W4ad"],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"leftPoint":[8.513079539479259,-11.281678961006572,1],"roofId":"g8pgyA4zcrzdfdvNphwHQy","cz":0,"id":"feUXDC3dk8QN3nPhgvxRs7","selected":false,"textureType":"Wall Texture Default","cx":11.763079539479257,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","rightPoint":[15.013079539479259,-11.281678961006573,1],"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","leftRoofHeight":12,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"type":"Wall","lz":12,"leftJoints":["svVfgRXxxLmkheyww2W4ad"],"lineColor":"black","windows":[],"cy":-11.28167896100657,"normal":[0,0,1],"rightJoints":["8SK72dWsX2KdwBhjqAJrHR"],"relativeAngle":0,"lineWidth":0.2,"rightRoofHeight":12,"color":"white","showLabel":false,"locked":false,"lx":6.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"ly":0.3,"textureType":"Wall Texture Default","foundationId":"9VLFJ7oUEizHpLYBMkGrSR","roofId":"g8pgyA4zcrzdfdvNphwHQy","relativeAngle":1.5707963267948974,"lineWidth":0.2,"selected":false,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","rotation":[0,0,-0.41015237421866746],"windows":[],"lx":3.000000000000001,"showLabel":false,"type":"Wall","color":"white","lineColor":"black","normal":[0,0,1],"leftRoofHeight":12,"rightJoints":["feUXDC3dk8QN3nPhgvxRs7"],"lz":12,"locked":false,"cx":8.513079539479259,"cz":0,"cy":-12.78167896100657,"rightPoint":[8.513079539479259,-11.281678961006572,1],"rightRoofHeight":12,"leftJoints":["j1cSjqWhsVxayuMSQv24u3"],"id":"svVfgRXxxLmkheyww2W4ad","leftPoint":[8.51307953947926,-14.281678961006572,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"type":"Wall","color":"white","relativeAngle":3.1415926535897927,"normal":[0,0,1],"locked":false,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":5,"lx":8.873370500562523,"roofId":"iCAiZhiTVrLLqoQWH1g8xu","rightPoint":[-4.33188166169194,11.821078427256497,0],"id":"1k4PTfybuAQ33E2nttLT4d","rightJoints":["dqGGsMEnQRvAtVj8JUXBJ1"],"lz":5,"ly":0.3,"leftRoofHeight":5,"cx":0.10480358858932037,"cy":11.821078427256495,"leftPoint":[4.541488838870581,11.821078427256491,0],"cz":0,"selected":false,"textureType":"Wall Texture Default","parentId":"m4iUcU4yAYwkvkodEmkEet","foundationId":"m4iUcU4yAYwkvkodEmkEet","leftJoints":["annVBiZ5xysQxyv34DuQgv"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cz":0,"foundationId":"m4iUcU4yAYwkvkodEmkEet","textureType":"Wall Texture Default","leftRoofHeight":5,"type":"Wall","id":"annVBiZ5xysQxyv34DuQgv","rotation":[0,0,-0.41015237421866746],"selected":false,"color":"white","cy":-0.7092647056353876,"cx":4.541488838870581,"ly":0.3,"parentId":"m4iUcU4yAYwkvkodEmkEet","normal":[0,0,1],"roofId":"iCAiZhiTVrLLqoQWH1g8xu","locked":false,"rightRoofHeight":5,"lz":5,"rightPoint":[4.541488838870581,11.821078427256495,0],"leftJoints":["fE5GSES3t1e72zkQ5eaMtN"],"rightJoints":["1k4PTfybuAQ33E2nttLT4d"],"leftPoint":[4.541488838870581,-13.23960783852727,0],"relativeAngle":1.5707963267948966,"lx":25.060686265783765,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"relativeAngle":4.003792784912203e-16,"cy":-13.239607838527268,"rightPoint":[4.541488838870582,-13.239607838527267,0],"locked":false,"rightRoofHeight":5,"id":"fE5GSES3t1e72zkQ5eaMtN","leftRoofHeight":5,"leftJoints":["dqGGsMEnQRvAtVj8JUXBJ1"],"rightJoints":["annVBiZ5xysQxyv34DuQgv"],"type":"Wall","cx":0.10480358858932082,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"leftPoint":[-4.33188166169194,-13.23960783852727,0],"foundationId":"m4iUcU4yAYwkvkodEmkEet","ly":0.3,"lx":8.873370500562523,"lz":5,"roofId":"iCAiZhiTVrLLqoQWH1g8xu","parentId":"m4iUcU4yAYwkvkodEmkEet","color":"white","selected":false,"textureType":"Wall Texture Default","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftPoint":[-4.33188166169194,11.821078427256497,0],"rightRoofHeight":5,"cz":0,"cy":-0.7092647056353867,"foundationId":"m4iUcU4yAYwkvkodEmkEet","color":"white","rotation":[0,0,-0.41015237421866746],"roofId":"iCAiZhiTVrLLqoQWH1g8xu","leftJoints":["1k4PTfybuAQ33E2nttLT4d"],"lz":5,"textureType":"Wall Texture Default","lx":25.060686265783765,"leftRoofHeight":5,"cx":-4.33188166169194,"locked":false,"id":"dqGGsMEnQRvAtVj8JUXBJ1","selected":false,"parentId":"m4iUcU4yAYwkvkodEmkEet","rightPoint":[-4.33188166169194,-13.23960783852727,0],"normal":[0,0,1],"ly":0.3,"type":"Wall","relativeAngle":-1.5707963267948966,"rightJoints":["fE5GSES3t1e72zkQ5eaMtN"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"rotation":[0,0,-0.41015237421866746],"selected":false,"lx":12.02609775935612,"parentId":"Ground","solarAbsorberPipe":{},"solarPowerTower":{},"normal":[0,0,1],"cz":0.5,"locked":false,"lz":1,"ly":39.808565196188674,"type":"Foundation","solarUpdraftTower":{},"cx":-53.11572356309672,"id":"m4iUcU4yAYwkvkodEmkEet","color":"#808080","cy":-13.056870681152052},{"cx":-2.4577065861477623,"leftPoint":[4.807994986966596,2.7315947133271403,0],"leftJoints":["cTujmRqECeyH6sGwqfoDEM"],"type":"Wall","id":"91sCr2ydHgygQWRuaJ5N1C","relativeAngle":-3.141592653589793,"cy":2.7315947133271394,"ly":0.3,"parentId":"bkH7VRrzUTdvxfSm8xVMfT","rotation":[0,0,-0.41015237421866746],"locked":false,"lx":14.531403146228717,"rightPoint":[-9.72340815926212,2.7315947133271385,0],"rightJoints":["jhMUxbjEpDbcfFhgvBAFQj"],"normal":[0,0,1],"textureType":"Wall Texture Default","selected":false,"cz":0,"roofId":"vRe6nzFrDCWVtSCu332MH4","foundationId":"bkH7VRrzUTdvxfSm8xVMfT","leftRoofHeight":16,"color":"white","lz":16,"rightRoofHeight":16,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"parentId":"bkH7VRrzUTdvxfSm8xVMfT","selected":false,"rightJoints":["91sCr2ydHgygQWRuaJ5N1C"],"color":"white","lz":16,"leftRoofHeight":16,"roofId":"vRe6nzFrDCWVtSCu332MH4","rightPoint":[4.807994986966594,2.7315947133271434,0],"lx":5.477642221583295,"ly":0.3,"type":"Wall","centerRoofHeight":[0,17.3393317550628],"foundationId":"bkH7VRrzUTdvxfSm8xVMfT","leftPoint":[4.807994986966587,-2.746047508256152,0],"leftJoints":["9qVmVQPuu4fH6aAQqyfjRg"],"id":"cTujmRqECeyH6sGwqfoDEM","textureType":"Wall Texture Default","locked":false,"cy":-0.007226397464504375,"cz":0,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"relativeAngle":1.5707963267948952,"rightRoofHeight":16,"cx":4.80799498696659,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"type":"Wall","leftPoint":[-9.723408159262116,-2.7460475082561513,0],"selected":false,"foundationId":"bkH7VRrzUTdvxfSm8xVMfT","color":"white","normal":[0,0,1],"leftRoofHeight":16,"rotation":[0,0,-0.41015237421866746],"leftJoints":["jhMUxbjEpDbcfFhgvBAFQj"],"rightRoofHeight":16,"parentId":"bkH7VRrzUTdvxfSm8xVMfT","roofId":"vRe6nzFrDCWVtSCu332MH4","locked":false,"id":"9qVmVQPuu4fH6aAQqyfjRg","rightJoints":["cTujmRqECeyH6sGwqfoDEM"],"textureType":"Wall Texture Default","cx":-2.4577065861477636,"lz":16,"cz":0,"relativeAngle":-1.5280327900245335e-16,"lx":14.531403146228705,"rightPoint":[4.807994986966588,-2.7460475082561535,0],"cy":-2.7460475082561526,"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"lz":16,"cy":-0.007226397464506373,"selected":false,"id":"jhMUxbjEpDbcfFhgvBAFQj","roofId":"vRe6nzFrDCWVtSCu332MH4","normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"type":"Wall","parentId":"bkH7VRrzUTdvxfSm8xVMfT","color":"white","textureType":"Wall Texture Default","cz":0,"rightJoints":["9qVmVQPuu4fH6aAQqyfjRg"],"leftPoint":[-9.72340815926212,2.7315947133271385,0],"leftJoints":["91sCr2ydHgygQWRuaJ5N1C"],"lx":5.47764222158329,"cx":-9.723408159262117,"relativeAngle":-1.5707963267948957,"ly":0.3,"leftRoofHeight":16,"foundationId":"bkH7VRrzUTdvxfSm8xVMfT","centerRoofHeight":[0,17.3393317550628],"rightPoint":[-9.723408159262116,-2.7460475082561513,0],"rightRoofHeight":16,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"cz":0.5,"lz":1,"cx":78.75570287833209,"selected":false,"color":"#808080","solarPowerTower":{},"cy":10.912053869608645,"solarUpdraftTower":{},"id":"bkH7VRrzUTdvxfSm8xVMfT","normal":[0,0,1],"parentId":"Ground","ly":5.705242176061485,"type":"Foundation","rotation":[0,0,-0.41015237421866746],"solarAbsorberPipe":{},"lx":20.778562085655192,"locked":false},{"rotation":[0,0,-0.41015237421866746],"selected":false,"normal":[0,0,1],"color":"white","rightRoofHeight":11,"type":"Wall","rightPoint":[-10.286622985342673,4.983310762184353,0],"leftRoofHeight":11,"cz":0,"textureType":"Wall Texture Default","locked":false,"parentId":"qJBTbMiP4tUMstkk4bQqAp","cx":0.8987861583692425,"id":"oNZPm4ForjT1jLCRGXT8ae","leftPoint":[12.084195302081158,4.983310762184358,0],"foundationId":"qJBTbMiP4tUMstkk4bQqAp","lz":11,"cy":4.983310762184356,"roofId":"tLNDomb3SubspErPERhojH","ly":0.3,"lx":22.37081828742383,"rightJoints":["twTFceoz8nr7JM6esRsvns"],"leftJoints":["8Pn1CKwtmisKkjic3nAhPK"],"relativeAngle":-3.141592653589793,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lz":11,"leftRoofHeight":11,"parentId":"qJBTbMiP4tUMstkk4bQqAp","rotation":[0,0,-0.41015237421866746],"lx":9.215971205723465,"relativeAngle":1.5707963267948954,"locked":false,"rightPoint":[12.084195302081158,4.98331076218436,0],"roofId":"tLNDomb3SubspErPERhojH","cy":0.3753251593226281,"color":"white","rightRoofHeight":11,"type":"Wall","leftPoint":[12.084195302081147,-4.232660443539104,0],"normal":[0,0,1],"foundationId":"qJBTbMiP4tUMstkk4bQqAp","id":"8Pn1CKwtmisKkjic3nAhPK","centerRoofHeight":[0,12.111126896848333],"selected":false,"ly":0.3,"leftJoints":["2nMWmvd9mtkAxjJG8mCTx2"],"cz":0,"rightJoints":["oNZPm4ForjT1jLCRGXT8ae"],"textureType":"Wall Texture Default","cx":12.084195302081152,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"locked":false,"rightJoints":["8Pn1CKwtmisKkjic3nAhPK"],"leftPoint":[-10.286622985342662,-4.2326604435391,0],"rightRoofHeight":11,"foundationId":"qJBTbMiP4tUMstkk4bQqAp","type":"Wall","selected":false,"roofId":"tLNDomb3SubspErPERhojH","rightPoint":[12.084195302081158,-4.2326604435391,0],"leftRoofHeight":11,"ly":0.3,"cx":0.8987861583692478,"lz":11,"leftJoints":["twTFceoz8nr7JM6esRsvns"],"relativeAngle":0,"normal":[0,0,1],"textureType":"Wall Texture Default","color":"white","parentId":"qJBTbMiP4tUMstkk4bQqAp","cy":-4.2326604435391,"lx":22.37081828742382,"cz":0,"rotation":[0,0,-0.41015237421866746],"id":"2nMWmvd9mtkAxjJG8mCTx2","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"ly":0.3,"leftPoint":[-10.286622985342673,4.983310762184353,0],"cx":-10.286622985342667,"normal":[0,0,1],"leftJoints":["oNZPm4ForjT1jLCRGXT8ae"],"cy":0.3753251593226268,"lx":9.215971205723452,"rightPoint":[-10.286622985342662,-4.2326604435391,0],"locked":false,"cz":0,"lz":11,"rotation":[0,0,-0.41015237421866746],"centerRoofHeight":[0,12.111126896848333],"type":"Wall","foundationId":"qJBTbMiP4tUMstkk4bQqAp","leftRoofHeight":11,"roofId":"tLNDomb3SubspErPERhojH","color":"white","selected":false,"id":"twTFceoz8nr7JM6esRsvns","rightJoints":["2nMWmvd9mtkAxjJG8mCTx2"],"parentId":"qJBTbMiP4tUMstkk4bQqAp","rightRoofHeight":11,"textureType":"Wall Texture Default","relativeAngle":-1.5707963267948954,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"solarPowerTower":{},"selected":false,"normal":[0,0,1],"lx":29.0500894298776,"id":"qJBTbMiP4tUMstkk4bQqAp","color":"#808080","cz":0.5,"solarUpdraftTower":{},"lz":1,"parentId":"Ground","locked":false,"ly":13.367138022352988,"cy":28.71057712188597,"solarAbsorberPipe":{},"rotation":[0,0,-0.41015237421866746],"type":"Foundation","cx":36.57481860706345},{"ly":0.3,"cy":2.971894027777658,"textureType":"Wall Texture Default","selected":false,"leftPoint":[12.422123880582443,2.9718940277776653,1],"rightJoints":["nNQo9acqRqKRWfE4a1RvLy"],"normal":[0,0,1],"type":"Wall","foundationId":"64tiQZ7Po62MhdtE1e44n9","cz":0,"rotation":[0,0,-0.41015237421866746],"id":"5QyDHSHQi5g83yTByESY7g","color":"white","rightPoint":[7.6013879231388755,2.9718940277776573,1],"locked":false,"lz":13,"cx":10.011755901860653,"lx":4.8207359574435635,"relativeAngle":-3.1415926535897922,"leftJoints":["2DDFqyaAZAAuWTVgy7UTYL"],"parentId":"64tiQZ7Po62MhdtE1e44n9","roofId":"oTjPo4r99EKfdasnxT3n5a","leftRoofHeight":13,"rightRoofHeight":13,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"parentId":"64tiQZ7Po62MhdtE1e44n9","leftPoint":[12.422123880582435,-2.1178940951050267,1],"leftJoints":["7JuGqBdByKra32qVf2wuMP"],"cz":0,"locked":false,"ly":0.3,"foundationId":"64tiQZ7Po62MhdtE1e44n9","color":"white","rotation":[0,0,-0.41015237421866746],"selected":false,"lz":13,"cy":0.42699996633631887,"leftRoofHeight":13,"cx":12.422123880582438,"lx":5.089788122882689,"normal":[0,0,1],"relativeAngle":1.570796326794896,"roofId":"oTjPo4r99EKfdasnxT3n5a","rightJoints":["5QyDHSHQi5g83yTByESY7g"],"type":"Wall","rightRoofHeight":13,"rightPoint":[12.422123880582443,2.9718940277776653,1],"id":"2DDFqyaAZAAuWTVgy7UTYL","textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"foundationId":"64tiQZ7Po62MhdtE1e44n9","id":"7JuGqBdByKra32qVf2wuMP","textureType":"Wall Texture Default","rightPoint":[12.422123880582431,-2.1178940951050196,1],"lx":4.820735957443555,"leftRoofHeight":13,"roofId":"oTjPo4r99EKfdasnxT3n5a","ly":0.3,"selected":false,"lz":13,"leftJoints":["nNQo9acqRqKRWfE4a1RvLy"],"cx":10.011755901860655,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":13,"rightJoints":["2DDFqyaAZAAuWTVgy7UTYL"],"leftPoint":[7.601387923138878,-2.1178940951050227,1],"relativeAngle":6.448443757120744e-16,"cy":-2.117894095105022,"locked":false,"normal":[0,0,1],"color":"white","parentId":"64tiQZ7Po62MhdtE1e44n9","cz":0,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"id":"nNQo9acqRqKRWfE4a1RvLy","foundationId":"64tiQZ7Po62MhdtE1e44n9","textureType":"Wall Texture Default","roofId":"oTjPo4r99EKfdasnxT3n5a","rotation":[0,0,-0.41015237421866746],"leftRoofHeight":13,"color":"white","parentId":"64tiQZ7Po62MhdtE1e44n9","ly":0.3,"cz":0,"relativeAngle":-1.5707963267948963,"leftPoint":[7.6013879231388755,2.9718940277776573,1],"rightRoofHeight":13,"cx":7.601387923138877,"normal":[0,0,1],"rightJoints":["7JuGqBdByKra32qVf2wuMP"],"type":"Wall","lx":5.089788122882682,"rightPoint":[7.601387923138878,-2.1178940951050227,1],"selected":false,"locked":false,"lz":13,"leftJoints":["5QyDHSHQi5g83yTByESY7g"],"cy":0.4269999663363171,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"selected":false,"ly":6.942959260815169,"parentId":"Ground","lz":1,"id":"64tiQZ7Po62MhdtE1e44n9","solarUpdraftTower":{},"cy":28.3064695776253,"locked":false,"color":"#808080","cx":24.870540041807864,"lx":25.896215586399297,"rotation":[0,0,-0.41015237421866746],"solarPowerTower":{},"normal":[0,0,1],"solarAbsorberPipe":{},"type":"Foundation","cz":0.5},{"color":"white","lx":6.102875967687821,"lz":11,"rightJoints":["ufN8sfE783eMNceqzrR88z"],"cz":0,"relativeAngle":-3.1415926535897927,"cy":3.4313212286858255,"textureType":"Wall Texture Default","roofId":"fS4RCk5GfqcPBkrsfQqupD","leftJoints":["pzCu78KeKhhbMuf9rgBh5L"],"selected":false,"leftPoint":[3.0844752908601185,3.4313212286858272,0],"foundationId":"kqR5p2bajX4NMTBq55qbCM","locked":false,"parentId":"kqR5p2bajX4NMTBq55qbCM","ly":0.3,"id":"4CXQZA8oGxMYG5uuTdJH4z","rightPoint":[-3.018400676827702,3.431321228685824,0],"cx":0.03303730701620822,"leftRoofHeight":11,"normal":[0,0,1],"rightRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"leftPoint":[3.0844752908601167,-6.300430996731014,0],"cx":3.0844752908601176,"normal":[0,0,1],"foundationId":"kqR5p2bajX4NMTBq55qbCM","cy":-1.4345548840225932,"color":"white","id":"pzCu78KeKhhbMuf9rgBh5L","rightRoofHeight":11,"cz":0,"rightPoint":[3.0844752908601185,3.4313212286858272,0],"centerRoofHeight":[-0.5,11],"rotation":[0,0,-0.41015237421866746],"lz":11,"relativeAngle":1.5707963267948963,"leftRoofHeight":11,"textureType":"Wall Texture Default","selected":false,"locked":false,"ly":0.3,"parentId":"kqR5p2bajX4NMTBq55qbCM","type":"Wall","roofId":"fS4RCk5GfqcPBkrsfQqupD","leftJoints":["kQ44ExCwR71BEyjwkSCp38"],"rightJoints":["4CXQZA8oGxMYG5uuTdJH4z"],"lx":9.731752225416841,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"foundationId":"kqR5p2bajX4NMTBq55qbCM","textureType":"Wall Texture Default","relativeAngle":-5.821376180034847e-16,"rightPoint":[3.0844752908601167,-6.300430996731014,0],"id":"kQ44ExCwR71BEyjwkSCp38","normal":[0,0,1],"roofId":"fS4RCk5GfqcPBkrsfQqupD","rightJoints":["pzCu78KeKhhbMuf9rgBh5L"],"rightRoofHeight":11,"cy":-6.300430996731012,"lx":6.102875967687822,"selected":false,"color":"white","ly":0.3,"leftJoints":["ufN8sfE783eMNceqzrR88z"],"cz":0,"leftPoint":[-3.018400676827706,-6.30043099673101,0],"parentId":"kqR5p2bajX4NMTBq55qbCM","leftRoofHeight":11,"type":"Wall","lz":11,"rotation":[0,0,-0.41015237421866746],"cx":0.03303730701620533,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cz":0,"lz":11,"rightPoint":[-3.018400676827706,-6.30043099673101,0],"parentId":"kqR5p2bajX4NMTBq55qbCM","rightJoints":["kQ44ExCwR71BEyjwkSCp38"],"cx":-3.018400676827704,"leftRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.5707963267948972,"selected":false,"cy":-1.434554884022593,"foundationId":"kqR5p2bajX4NMTBq55qbCM","color":"white","rightRoofHeight":11,"locked":false,"leftJoints":["4CXQZA8oGxMYG5uuTdJH4z"],"lx":9.731752225416834,"id":"ufN8sfE783eMNceqzrR88z","normal":[0,0,1],"centerRoofHeight":[0.5,11],"leftPoint":[-3.018400676827702,3.431321228685824,0],"textureType":"Wall Texture Default","ly":0.3,"type":"Wall","roofId":"fS4RCk5GfqcPBkrsfQqupD","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Foundation","ly":13.304430432789896,"selected":false,"color":"#808080","solarPowerTower":{},"locked":false,"normal":[0,0,1],"cy":32.738819911856226,"cz":0.5,"solarAbsorberPipe":{},"id":"kqR5p2bajX4NMTBq55qbCM","cx":72.31692383934994,"rotation":[0,0,-0.41015237421866746],"lx":7.252592961439527,"parentId":"Ground","solarUpdraftTower":{},"lz":1},{"rightJoints":["9YnLeekp8YrBjSwNEVxSmp"],"roofId":"wrKEiNvyDQopU6C5MqvRMM","cy":7.3527391531452935,"leftPoint":[5.468301535132202,7.352739153145294,1],"id":"2qkVxdRDddbpLN4sHJK2gE","relativeAngle":3.141592653589793,"leftRoofHeight":4,"parentId":"98vBSiAe7BeqTZRNu482vh","rightRoofHeight":4,"cx":-0.9755536194629697,"leftJoints":["gz2Gm7sAdANkmLzo5wFbxx"],"color":"white","lz":4,"rotation":[0,0,-0.41015237421866746],"rightPoint":[-7.419408774058143,7.352739153145295,1],"lx":12.887710309190346,"foundationId":"98vBSiAe7BeqTZRNu482vh","normal":[0,0,1],"type":"Wall","locked":false,"selected":false,"cz":0,"ly":0.3,"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"cz":0,"roofId":"wrKEiNvyDQopU6C5MqvRMM","leftPoint":[5.468301535132206,-7.370642577725551,1],"centerRoofHeight":[0,6],"foundationId":"98vBSiAe7BeqTZRNu482vh","id":"gz2Gm7sAdANkmLzo5wFbxx","normal":[0,0,1],"rightJoints":["2qkVxdRDddbpLN4sHJK2gE"],"type":"Wall","leftRoofHeight":4,"textureType":"Wall Texture Default","lz":4,"relativeAngle":1.5707963267948963,"selected":false,"rightPoint":[5.4683015351322,7.352739153145298,1],"cy":-0.008951712290128144,"locked":false,"leftJoints":["vha1dDK5ppjp6f9bgr45uq"],"color":"white","cx":5.468301535132204,"rightRoofHeight":4,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"parentId":"98vBSiAe7BeqTZRNu482vh","lx":14.723381730870852,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"leftJoints":["9YnLeekp8YrBjSwNEVxSmp"],"id":"vha1dDK5ppjp6f9bgr45uq","relativeAngle":2.756667859198411e-16,"cz":0,"color":"white","leftRoofHeight":4,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"lz":4,"textureType":"Wall Texture Default","cy":-7.370642577725552,"leftPoint":[-7.4194087740581365,-7.370642577725553,1],"locked":false,"cx":-0.9755536194629646,"rightJoints":["gz2Gm7sAdANkmLzo5wFbxx"],"parentId":"98vBSiAe7BeqTZRNu482vh","roofId":"wrKEiNvyDQopU6C5MqvRMM","normal":[0,0,1],"type":"Wall","selected":false,"rightPoint":[5.468301535132206,-7.370642577725551,1],"rightRoofHeight":4,"lx":12.887710309190334,"foundationId":"98vBSiAe7BeqTZRNu482vh","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.5707963267948961,"centerRoofHeight":[0,6],"foundationId":"98vBSiAe7BeqTZRNu482vh","ly":0.3,"cx":-7.419408774058138,"textureType":"Wall Texture Default","lz":4,"cy":-0.008951712290129699,"leftPoint":[-7.419408774058143,7.352739153145295,1],"id":"9YnLeekp8YrBjSwNEVxSmp","cz":0,"color":"white","rightPoint":[-7.4194087740581365,-7.370642577725553,1],"lx":14.723381730870852,"roofId":"wrKEiNvyDQopU6C5MqvRMM","rightRoofHeight":4,"normal":[0,0,1],"leftJoints":["2qkVxdRDddbpLN4sHJK2gE"],"rightJoints":["vha1dDK5ppjp6f9bgr45uq"],"type":"Wall","locked":false,"selected":false,"parentId":"98vBSiAe7BeqTZRNu482vh","leftRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"cz":0.5,"type":"Foundation","color":"#808080","id":"98vBSiAe7BeqTZRNu482vh","solarAbsorberPipe":{},"solarPowerTower":{},"rotation":[0,0,-0.41015237421866746],"lx":15.543629167882932,"cy":-34.03935192999712,"cx":66.44654466726774,"normal":[0,0,1],"locked":false,"parentId":"Ground","solarUpdraftTower":{},"lz":1,"selected":false,"ly":16.051182282542253},{"relativeAngle":-3.141592653589792,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":10,"id":"7zFHG6rEsyAEeiBjZ3Fqiv","cz":0,"roofId":"52yUcWyJUbmGw2PC5d5KiK","textureType":"Wall Texture Default","cy":2.3029070359201342,"cx":-2.061194479172505,"lx":4.563843535322344,"leftPoint":[0.2207272884886666,2.302907035920138,0],"color":"white","locked":false,"leftRoofHeight":10,"selected":false,"normal":[0,0,1],"lz":10,"type":"Wall","rightPoint":[-4.343116246833677,2.3029070359201307,0],"parentId":"tafet8SHZ3Nd8kXyfeZ9FR","ly":0.3,"rightJoints":["sfm78zxYm2PZeqMiLJ7sRS"],"leftJoints":["qEu4R9jBDYekHJdsyGPkHu"],"foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rightRoofHeight":10,"cx":0.2207272884886636,"lz":10,"normal":[0,0,1],"relativeAngle":1.5707963267948952,"locked":false,"cy":0.09783532837621656,"lx":4.410143415087843,"rightJoints":["7zFHG6rEsyAEeiBjZ3Fqiv"],"type":"Wall","selected":false,"ly":0.3,"leftRoofHeight":10,"cz":0,"textureType":"Wall Texture Default","id":"qEu4R9jBDYekHJdsyGPkHu","rotation":[0,0,-0.41015237421866746],"rightPoint":[0.2207272884886666,2.302907035920138,0],"parentId":"tafet8SHZ3Nd8kXyfeZ9FR","leftPoint":[0.2207272884886606,-2.1072363791677047,0],"foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","leftJoints":["k13k8dUZo1jLk9Pubbz3Yu"],"color":"white","roofId":"52yUcWyJUbmGw2PC5d5KiK","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rightJoints":["qEu4R9jBDYekHJdsyGPkHu"],"leftPoint":[-4.34311624683366,-2.1072363791677042,0],"rightPoint":[0.2207272884886606,-2.1072363791677047,0],"rightRoofHeight":10,"id":"k13k8dUZo1jLk9Pubbz3Yu","ly":0.3,"leftRoofHeight":10,"cz":0,"leftJoints":["sfm78zxYm2PZeqMiLJ7sRS"],"lx":4.563843535322321,"color":"white","locked":false,"parentId":"tafet8SHZ3Nd8kXyfeZ9FR","foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","textureType":"Wall Texture Default","type":"Wall","selected":false,"relativeAngle":-9.730596730869277e-17,"rotation":[0,0,-0.41015237421866746],"roofId":"52yUcWyJUbmGw2PC5d5KiK","cy":-2.1072363791677047,"normal":[0,0,1],"cx":-2.0611944791725,"lz":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"leftRoofHeight":10,"relativeAngle":-1.5707963267948928,"cx":-4.343116246833668,"rightRoofHeight":10,"ly":0.3,"parentId":"tafet8SHZ3Nd8kXyfeZ9FR","locked":false,"roofId":"52yUcWyJUbmGw2PC5d5KiK","leftJoints":["7zFHG6rEsyAEeiBjZ3Fqiv"],"leftPoint":[-4.343116246833677,2.3029070359201307,0],"lx":4.410143415087835,"rightJoints":["k13k8dUZo1jLk9Pubbz3Yu"],"type":"Wall","lz":10,"foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","color":"white","selected":false,"textureType":"Wall Texture Default","rightPoint":[-4.34311624683366,-2.1072363791677042,0],"rotation":[0,0,-0.41015237421866746],"cz":0,"id":"sfm78zxYm2PZeqMiLJ7sRS","normal":[0,0,1],"cy":0.09783532837621323,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"solarUpdraftTower":{},"solarAbsorberPipe":{},"color":"#808080","ly":4.607404636305792,"cy":-35.24749355392174,"locked":false,"type":"Foundation","cx":69.68931082715157,"cz":0.5,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"solarPowerTower":{},"selected":false,"parentId":"Ground","lx":8.9358229854864,"id":"tafet8SHZ3Nd8kXyfeZ9FR","lz":1},{"color":"white","relativeAngle":3.141592653589793,"rightRoofHeight":5.25,"id":"vG7sqxy4RdGecDZ8BgqUDU","lx":9.337227070632437,"rotation":[0,0,-0.41015237421866746],"rightJoints":["9cZUThxWj1ikMEGtxc3eiz"],"lz":5.25,"leftJoints":["3JjPc2Pp9fAroM9UdivE1u"],"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","parentId":"a7Ykq8sCMoZy5zM2ybNhKs","normal":[0,0,1],"textureType":"Wall Texture Default","cy":3.3516986330408542,"rightPoint":[-4.747688161235284,3.351698633040855,0],"leftRoofHeight":5.25,"cz":0,"cx":-0.07907462591906578,"leftPoint":[4.589538909397152,3.3516986330408534,0],"roofId":"qYDMJTekV8NWHzzCiVYwcs","ly":0.3,"centerRoofHeight":[0,6.225217409690371],"type":"Wall","selected":false,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"leftRoofHeight":5.25,"normal":[0,0,1],"rightPoint":[4.589538909397152,3.3516986330408534,0],"lx":6.320731749368616,"cz":0,"locked":false,"rightJoints":["vG7sqxy4RdGecDZ8BgqUDU"],"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","rightRoofHeight":5.25,"type":"Wall","selected":false,"relativeAngle":1.5707963267948961,"color":"white","rotation":[0,0,-0.41015237421866746],"cy":0.19133275835654517,"lz":5.25,"id":"3JjPc2Pp9fAroM9UdivE1u","roofId":"qYDMJTekV8NWHzzCiVYwcs","leftPoint":[4.58953890939715,-2.969033116327763,0],"parentId":"a7Ykq8sCMoZy5zM2ybNhKs","leftJoints":["cABST71Bn78stcfTw5z7y2"],"cx":4.589538909397151,"textureType":"Wall Texture Default","ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"textureType":"Wall Texture Default","cz":0,"leftRoofHeight":5.25,"cy":-2.969033116327763,"locked":false,"roofId":"qYDMJTekV8NWHzzCiVYwcs","ly":0.3,"parentId":"a7Ykq8sCMoZy5zM2ybNhKs","rightPoint":[4.58953890939715,-2.969033116327763,0],"cx":-0.07907462591906667,"rightRoofHeight":5.25,"lz":5.25,"relativeAngle":-4.756114491922529e-17,"selected":false,"type":"Wall","normal":[0,0,1],"color":"white","leftJoints":["9cZUThxWj1ikMEGtxc3eiz"],"rightJoints":["3JjPc2Pp9fAroM9UdivE1u"],"centerRoofHeight":[0,6.225217409690371],"rotation":[0,0,-0.41015237421866746],"leftPoint":[-4.747688161235283,-2.9690331163277626,0],"id":"cABST71Bn78stcfTw5z7y2","lx":9.337227070632434,"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"rotation":[0,0,-0.41015237421866746],"color":"white","selected":false,"locked":false,"ly":0.3,"relativeAngle":-1.5707963267948966,"leftPoint":[-4.747688161235284,3.351698633040855,0],"lz":5.25,"roofId":"qYDMJTekV8NWHzzCiVYwcs","parentId":"a7Ykq8sCMoZy5zM2ybNhKs","cy":0.19133275835654628,"rightJoints":["cABST71Bn78stcfTw5z7y2"],"cx":-4.747688161235283,"lx":6.320731749368617,"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","textureType":"Wall Texture Default","leftJoints":["vG7sqxy4RdGecDZ8BgqUDU"],"type":"Wall","rightPoint":[-4.747688161235283,-2.9690331163277626,0],"rightRoofHeight":5.25,"leftRoofHeight":5.25,"cz":0,"id":"9cZUThxWj1ikMEGtxc3eiz","normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"color":"#808080","solarPowerTower":{},"type":"Foundation","locked":false,"selected":false,"lx":10.667610013832563,"solarAbsorberPipe":{},"parentId":"Ground","normal":[0,0,1],"cx":35.81768474812716,"rotation":[0,0,-0.41015237421866746],"cy":-31.968353023498793,"solarUpdraftTower":{},"cz":0.5,"id":"a7Ykq8sCMoZy5zM2ybNhKs","lz":1,"ly":10.658064363814518},{"locked":false,"id":"a6q6Txnypc9iPjohNf43CB","leftPoint":[4.779738528665165,10.937352047913798,1],"cx":0.395865158322978,"leftJoints":["4RfjPoTAycowc8B5SwzkpM"],"rightJoints":["jWqRj42hxzMWofSpUH42dz"],"rotation":[0,0,-0.41015237421866746],"parentId":"uBZaguS4Mp4iydQBE88CA1","selected":false,"rightPoint":[-3.9880082120192073,10.937352047913798,1],"foundationId":"uBZaguS4Mp4iydQBE88CA1","leftRoofHeight":10,"lz":10,"ly":0.3,"cz":0,"color":"white","normal":[0,0,1],"rightRoofHeight":10,"roofId":"jSo2aHHx58NTeAQuDZodmY","type":"Wall","lx":8.767746740684375,"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","cy":10.937352047913794,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"leftPoint":[4.779738528665165,3.130296275146503,1],"normal":[0,0,1],"roofId":"jSo2aHHx58NTeAQuDZodmY","rightJoints":["a6q6Txnypc9iPjohNf43CB"],"rotation":[0,0,-0.41015237421866746],"ly":0.3,"relativeAngle":1.5707963267948963,"cz":0,"id":"4RfjPoTAycowc8B5SwzkpM","parentId":"uBZaguS4Mp4iydQBE88CA1","cx":4.779738528665163,"locked":false,"textureType":"Wall Texture Default","leftJoints":["nRLvRbWCCyQkZn2SaeWzhR"],"rightPoint":[4.779738528665165,10.937352047913798,1],"foundationId":"uBZaguS4Mp4iydQBE88CA1","selected":false,"lx":7.807055772767293,"lz":10,"leftRoofHeight":10,"rightRoofHeight":10,"cy":7.033824161530151,"color":"white","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"rotation":[0,0,-0.41015237421866746],"leftRoofHeight":10,"cz":0,"lx":8.767746740684375,"cx":0.3958651583229764,"rightJoints":["4RfjPoTAycowc8B5SwzkpM"],"type":"Wall","cy":3.130296275146505,"foundationId":"uBZaguS4Mp4iydQBE88CA1","ly":0.3,"rightRoofHeight":10,"id":"nRLvRbWCCyQkZn2SaeWzhR","parentId":"uBZaguS4Mp4iydQBE88CA1","rightPoint":[4.779738528665165,3.130296275146503,1],"lz":10,"normal":[0,0,1],"textureType":"Wall Texture Default","color":"white","relativeAngle":3.0390194173108526e-16,"locked":false,"leftPoint":[-3.9880082120192113,3.1302962751465033,1],"roofId":"jSo2aHHx58NTeAQuDZodmY","leftJoints":["jWqRj42hxzMWofSpUH42dz"],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lz":10,"relativeAngle":-1.5707963267948968,"cy":7.03382416153015,"parentId":"uBZaguS4Mp4iydQBE88CA1","rightPoint":[-3.9880082120192113,3.1302962751465033,1],"ly":0.3,"lx":7.807055772767296,"roofId":"jSo2aHHx58NTeAQuDZodmY","cx":-3.988008212019209,"color":"white","foundationId":"uBZaguS4Mp4iydQBE88CA1","leftPoint":[-3.9880082120192073,10.937352047913798,1],"rightJoints":["nRLvRbWCCyQkZn2SaeWzhR"],"selected":false,"cz":0,"leftRoofHeight":10,"rightRoofHeight":10,"leftJoints":["a6q6Txnypc9iPjohNf43CB"],"type":"Wall","locked":false,"textureType":"Wall Texture Default","normal":[0,0,1],"id":"jWqRj42hxzMWofSpUH42dz","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"ly":26.759313634558907,"cy":-19.722143796679788,"cz":0.5,"lx":9.74476233969461,"solarAbsorberPipe":{},"locked":false,"selected":false,"parentId":"Ground","normal":[0,0,1],"color":"#808080","type":"Foundation","id":"uBZaguS4Mp4iydQBE88CA1","cx":17.121825988451324,"solarPowerTower":{},"solarUpdraftTower":{},"rotation":[0,0,-0.41015237421866746],"lz":1},{"leftJoints":["ngPHRhypQfV68DYtm6sZvW"],"cz":0,"leftRoofHeight":10,"parentId":"rQh2s1iBHWvFGFdzViXEe2","rotation":[0,0,-0.41015237421866746],"cx":-0.4824098277040898,"leftPoint":[12.274733699058217,12.570550728118558,1],"locked":false,"rightJoints":["sbPEhSxLJ7xiM71jhPJUkw"],"textureType":"Wall Texture Default","roofId":"tN1a6B1uCvjUWCkBQctrVG","color":"white","selected":false,"lz":10,"cy":12.570550728118565,"ly":0.3,"relativeAngle":3.141592653589793,"foundationId":"rQh2s1iBHWvFGFdzViXEe2","id":"b12LAtSYTNxCwTbH7iRFmz","rightRoofHeight":10,"rightPoint":[-13.239553354466391,12.570550728118558,1],"lx":25.51428705352461,"type":"Wall","normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"leftPoint":[12.274733699058213,-12.675216149553869,1],"normal":[0,0,1],"leftJoints":["2z5tfxd1xStwLEwGZ1Enk7"],"locked":false,"rightPoint":[12.274733699058217,12.570550728118558,1],"foundationId":"rQh2s1iBHWvFGFdzViXEe2","relativeAngle":1.5707963267948966,"ly":0.3,"lz":10,"lx":25.245766877672445,"cz":0,"roofId":"tN1a6B1uCvjUWCkBQctrVG","selected":false,"cy":-0.05233271071766232,"rightRoofHeight":10,"rotation":[0,0,-0.41015237421866746],"parentId":"rQh2s1iBHWvFGFdzViXEe2","cx":12.274733699058219,"id":"ngPHRhypQfV68DYtm6sZvW","color":"white","leftRoofHeight":10,"textureType":"Wall Texture Default","rightJoints":["b12LAtSYTNxCwTbH7iRFmz"],"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"roofId":"tN1a6B1uCvjUWCkBQctrVG","rightPoint":[12.274733699058219,-12.675216149553865,1],"color":"white","foundationId":"rQh2s1iBHWvFGFdzViXEe2","lx":25.514287053524612,"cz":0,"leftPoint":[-13.239553354466391,-12.675216149553885,1],"leftJoints":["sbPEhSxLJ7xiM71jhPJUkw"],"selected":false,"id":"2z5tfxd1xStwLEwGZ1Enk7","parentId":"rQh2s1iBHWvFGFdzViXEe2","normal":[0,0,1],"rightJoints":["ngPHRhypQfV68DYtm6sZvW"],"rightRoofHeight":10,"leftRoofHeight":10,"type":"Wall","ly":0.3,"relativeAngle":3.4811022461136335e-16,"rotation":[0,0,-0.41015237421866746],"lz":10,"cy":-12.675216149553874,"locked":false,"textureType":"Wall Texture Default","cx":-0.4824098277040827,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"ly":0.3,"selected":false,"roofId":"tN1a6B1uCvjUWCkBQctrVG","cz":0,"leftJoints":["b12LAtSYTNxCwTbH7iRFmz"],"lz":10,"cx":-13.239553354466391,"locked":false,"foundationId":"rQh2s1iBHWvFGFdzViXEe2","lx":25.245766877672445,"id":"sbPEhSxLJ7xiM71jhPJUkw","rightJoints":["2z5tfxd1xStwLEwGZ1Enk7"],"textureType":"Wall Texture Default","leftRoofHeight":10,"relativeAngle":-1.5707963267948968,"rightRoofHeight":10,"rightPoint":[-13.239553354466395,-12.675216149553886,1],"cy":-0.05233271071766321,"rotation":[0,0,-0.41015237421866746],"type":"Wall","normal":[0,0,1],"color":"white","parentId":"rQh2s1iBHWvFGFdzViXEe2","leftPoint":[-13.239553354466391,12.570550728118558,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"lx":27.015265076182526,"solarPowerTower":{},"id":"rQh2s1iBHWvFGFdzViXEe2","lz":1,"rotation":[0,0,-0.41015237421866746],"cy":-75.35128568516778,"normal":[0,0,1],"cx":46.98901169365807,"cz":0.5,"solarUpdraftTower":{},"parentId":"Ground","selected":false,"type":"Foundation","locked":false,"color":"#808080","ly":28.698582154704336,"solarAbsorberPipe":{}},{"leftPoint":[3.881236454413665,2.590871964313816,0],"rotation":[0,0,-0.41015237421866746],"lx":13.122757014665611,"cz":0,"roofId":"mgoQMGVeVMwiZzvh6DtsHC","textureType":"Wall Texture Default","parentId":"kLLR11PM8xK326yQ5QVzHF","cx":-2.68014205291914,"leftRoofHeight":16,"cy":2.590871964313818,"locked":false,"id":"gs8TZionAFZcvbLtmKeykq","normal":[0,0,1],"relativeAngle":3.141592653589793,"foundationId":"kLLR11PM8xK326yQ5QVzHF","lz":16,"ly":0.3,"rightRoofHeight":16,"color":"white","selected":false,"type":"Wall","rightJoints":["9qCk45C9zpiC2iX7xDbSMH"],"leftJoints":["rohGrk56Rmwrds2U1CuXPp"],"rightPoint":[-9.241520560251946,2.59087196431382,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"rightRoofHeight":16,"cx":3.881236454413662,"rotation":[0,0,-0.41015237421866746],"leftJoints":["3d9FbdLzNegyUKLjvqVp9P"],"centerRoofHeight":[0,17.714737050020105],"roofId":"mgoQMGVeVMwiZzvh6DtsHC","color":"white","id":"rohGrk56Rmwrds2U1CuXPp","selected":false,"rightJoints":["gs8TZionAFZcvbLtmKeykq"],"foundationId":"kLLR11PM8xK326yQ5QVzHF","textureType":"Wall Texture Default","locked":false,"type":"Wall","leftPoint":[3.8812364544136595,-2.6095545856794877,0],"lx":5.200426549993304,"cy":-0.009341310682835946,"normal":[0,0,1],"lz":16,"parentId":"kLLR11PM8xK326yQ5QVzHF","ly":0.3,"cz":0,"leftRoofHeight":16,"relativeAngle":1.5707963267948957,"rightPoint":[3.881236454413665,2.590871964313816,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"locked":false,"parentId":"kLLR11PM8xK326yQ5QVzHF","foundationId":"kLLR11PM8xK326yQ5QVzHF","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"textureType":"Wall Texture Default","cx":-2.6801420529191438,"leftJoints":["9qCk45C9zpiC2iX7xDbSMH"],"cy":-2.6095545856794904,"color":"white","leftRoofHeight":16,"ly":0.3,"relativeAngle":4.0609381948055113e-16,"leftPoint":[-9.241520560251947,-2.609554585679493,0],"rightJoints":["rohGrk56Rmwrds2U1CuXPp"],"type":"Wall","selected":false,"id":"3d9FbdLzNegyUKLjvqVp9P","rightPoint":[3.8812364544136595,-2.6095545856794877,0],"roofId":"mgoQMGVeVMwiZzvh6DtsHC","cz":0,"lz":16,"rightRoofHeight":16,"lx":13.122757014665607,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"cx":-9.241520560251946,"cz":0,"roofId":"mgoQMGVeVMwiZzvh6DtsHC","lz":16,"relativeAngle":-1.570796326794897,"cy":-0.009341310682836612,"normal":[0,0,1],"foundationId":"kLLR11PM8xK326yQ5QVzHF","parentId":"kLLR11PM8xK326yQ5QVzHF","rotation":[0,0,-0.41015237421866746],"lx":5.200426549993313,"color":"white","leftJoints":["gs8TZionAFZcvbLtmKeykq"],"locked":false,"leftPoint":[-9.241520560251946,2.59087196431382,0],"id":"9qCk45C9zpiC2iX7xDbSMH","rightRoofHeight":16,"ly":0.3,"centerRoofHeight":[0,17.714737050020105],"selected":false,"rightJoints":["3d9FbdLzNegyUKLjvqVp9P"],"leftRoofHeight":16,"rightPoint":[-9.241520560251947,-2.609554585679493,0],"textureType":"Wall Texture Default","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":16,"rightTopPartialHeight":16},{"rotation":[0,0,-0.41015237421866746],"cy":-78.99513775014256,"color":"#808080","solarUpdraftTower":{},"lz":1,"selected":false,"parentId":"Ground","cz":0.5,"cx":57.21273152304917,"locked":false,"solarAbsorberPipe":{},"solarPowerTower":{},"type":"Foundation","normal":[0,0,1],"id":"kLLR11PM8xK326yQ5QVzHF","lx":20.705717238442087,"ly":5.889181614425833},{"parentId":"x5CDMTRHrHH6ChAJLKJCrV","cz":0,"rightRoofHeight":11,"lx":21.722848351168093,"id":"6V62Zt3rayMTYsccknpXaH","lz":11,"ly":0.3,"leftRoofHeight":11,"cx":4.010629943427583,"type":"Wall","locked":false,"cy":4.151117918815318,"leftPoint":[14.87205411901163,4.151117918815315,0],"selected":false,"relativeAngle":3.1415926535897927,"roofId":"5Fxdv1WWmCMeawRz9mKuqV","textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"leftJoints":["9wfJs9iCWUXsCC7X64D8Nb"],"color":"white","rightPoint":[-6.8507942321564625,4.151117918815323,0],"normal":[0,0,1],"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","rightJoints":["qD9BfhCuxt9GxywQHZujJQ"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cz":0,"roofId":"5Fxdv1WWmCMeawRz9mKuqV","parentId":"x5CDMTRHrHH6ChAJLKJCrV","textureType":"Wall Texture Default","lx":8.340566324530702,"rightPoint":[14.87205411901163,4.151117918815315,0],"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","locked":false,"cx":14.872054119011626,"normal":[0,0,1],"leftPoint":[14.872054119011624,-4.189448405715386,0],"color":"white","rightRoofHeight":11,"rightJoints":["6V62Zt3rayMTYsccknpXaH"],"cy":-0.019165243450035785,"ly":0.3,"centerRoofHeight":[0,12.060818180566665],"leftJoints":["eVyuLptBvR2cKWFWdRTpDm"],"leftRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"selected":false,"type":"Wall","lz":11,"id":"9wfJs9iCWUXsCC7X64D8Nb","relativeAngle":1.570796326794896,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"id":"eVyuLptBvR2cKWFWdRTpDm","leftJoints":["qD9BfhCuxt9GxywQHZujJQ"],"lz":11,"leftRoofHeight":11,"cx":4.010629943427585,"textureType":"Wall Texture Default","cz":0,"selected":false,"rightPoint":[14.872054119011624,-4.189448405715386,0],"parentId":"x5CDMTRHrHH6ChAJLKJCrV","type":"Wall","color":"white","ly":0.3,"rightJoints":["9wfJs9iCWUXsCC7X64D8Nb"],"cy":-4.189448405715389,"leftPoint":[-6.850794232156455,-4.189448405715391,0],"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","rightRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"relativeAngle":2.0443415277360858e-16,"roofId":"5Fxdv1WWmCMeawRz9mKuqV","lx":21.72284835116808,"normal":[0,0,1],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"leftJoints":["6V62Zt3rayMTYsccknpXaH"],"centerRoofHeight":[0,12.060818180566665],"locked":false,"rightPoint":[-6.850794232156455,-4.189448405715391,0],"type":"Wall","rightJoints":["eVyuLptBvR2cKWFWdRTpDm"],"parentId":"x5CDMTRHrHH6ChAJLKJCrV","cy":-0.01916524345003401,"lz":11,"leftRoofHeight":11,"rightRoofHeight":11,"relativeAngle":-1.5707963267948957,"color":"white","cz":0,"id":"qD9BfhCuxt9GxywQHZujJQ","lx":8.340566324530712,"roofId":"5Fxdv1WWmCMeawRz9mKuqV","cx":-6.850794232156459,"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","ly":0.3,"leftPoint":[-6.8507942321564625,4.151117918815323,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Foundation","solarPowerTower":{},"rotation":[0,0,-0.41015237421866746],"selected":false,"locked":false,"lx":30.492817584324445,"id":"x5CDMTRHrHH6ChAJLKJCrV","lz":1,"cx":-2.6987520128351328,"normal":[0,0,1],"cz":0.5,"ly":8.387848050211689,"solarAbsorberPipe":{},"solarUpdraftTower":{},"cy":-53.16373671637722,"color":"#808080","parentId":"Ground"},{"type":"Wall","textureType":"Wall Texture Default","lx":5.147994804936703,"rotation":[0,0,-0.41015237421866746],"lz":13,"ly":0.3,"cy":3.5419213517865673,"leftJoints":["xqjrhteUBJfNDcJWuHnvRu"],"leftRoofHeight":13,"rightRoofHeight":13,"rightJoints":["qY5WoPV6F2CGJU6Z5GgH9A"],"normal":[0,0,1],"locked":false,"cx":1.9334943095461699,"id":"5TCp2VzUPYtC3wHFFUhMZA","relativeAngle":3.1415926535897922,"leftPoint":[4.507491712014521,3.5419213517865646,0],"cz":0,"foundationId":"niHTxZ4PaRwa8PCQj9YtSY","roofId":"15884yYUHNT5NwXMKhmRGP","color":"white","selected":false,"rightPoint":[-0.6405030929221814,3.54192135178657,0],"parentId":"niHTxZ4PaRwa8PCQj9YtSY","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"type":"Wall","id":"xqjrhteUBJfNDcJWuHnvRu","roofId":"15884yYUHNT5NwXMKhmRGP","foundationId":"niHTxZ4PaRwa8PCQj9YtSY","lx":7.024418192306677,"lz":13,"relativeAngle":1.5707963267948963,"rightJoints":["5TCp2VzUPYtC3wHFFUhMZA"],"selected":false,"textureType":"Wall Texture Default","cx":4.50749171201452,"parentId":"niHTxZ4PaRwa8PCQj9YtSY","leftRoofHeight":13,"rightRoofHeight":13,"cy":0.029712255633226103,"ly":0.3,"color":"white","normal":[0,0,1],"leftPoint":[4.507491712014519,-3.4824968405201124,0],"rightPoint":[4.507491712014521,3.5419213517865646,0],"rotation":[0,0,-0.41015237421866746],"cz":0,"locked":false,"leftJoints":["nW4zHPMqaoecHBwBCyEqwh"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"cx":1.9334943095461696,"lz":13,"lx":5.147994804936699,"roofId":"15884yYUHNT5NwXMKhmRGP","color":"white","ly":0.3,"foundationId":"niHTxZ4PaRwa8PCQj9YtSY","leftPoint":[-0.6405030929221798,-3.482496840520119,0],"type":"Wall","parentId":"niHTxZ4PaRwa8PCQj9YtSY","leftRoofHeight":13,"textureType":"Wall Texture Default","cz":0,"rotation":[0,0,-0.41015237421866746],"rightPoint":[4.507491712014519,-3.4824968405201124,0],"leftJoints":["qY5WoPV6F2CGJU6Z5GgH9A"],"selected":false,"cy":-3.482496840520116,"id":"nW4zHPMqaoecHBwBCyEqwh","locked":false,"normal":[0,0,1],"rightRoofHeight":13,"relativeAngle":1.293967534963907e-15,"rightJoints":["xqjrhteUBJfNDcJWuHnvRu"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"textureType":"Wall Texture Default","ly":0.3,"foundationId":"niHTxZ4PaRwa8PCQj9YtSY","id":"qY5WoPV6F2CGJU6Z5GgH9A","cy":0.029712255633225437,"leftJoints":["5TCp2VzUPYtC3wHFFUhMZA"],"relativeAngle":-1.5707963267948963,"leftPoint":[-0.6405030929221814,3.54192135178657,0],"leftRoofHeight":13,"cz":0,"roofId":"15884yYUHNT5NwXMKhmRGP","rightRoofHeight":13,"selected":false,"normal":[0,0,1],"cx":-0.6405030929221807,"lz":13,"rotation":[0,0,-0.41015237421866746],"rightJoints":["nW4zHPMqaoecHBwBCyEqwh"],"lx":7.024418192306689,"rightPoint":[-0.6405030929221798,-3.482496840520119,0],"parentId":"niHTxZ4PaRwa8PCQj9YtSY","type":"Wall","locked":false,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":13,"rightTopPartialHeight":13},{"solarAbsorberPipe":{},"cy":-49.221657555965606,"ly":7.870086564093848,"cz":0.5,"type":"Foundation","solarPowerTower":{},"locked":false,"rotation":[0,0,-0.41015237421866746],"solarUpdraftTower":{},"normal":[0,0,1],"lz":1,"id":"niHTxZ4PaRwa8PCQj9YtSY","parentId":"Ground","color":"#808080","selected":false,"lx":9.19241650107572,"cx":0.2960050895698132},{"leftJoints":["pBQFic2TqVJyDdJyEaBVof"],"cy":6.111068939289358,"rightJoints":["w8GFYP8jB1EG2YVL6appCT"],"rightRoofHeight":20,"locked":false,"type":"Wall","rotation":[0,0,-0.41015237421866746],"cx":-6.699754362236526,"foundationId":"jH5z454ciczrceJTNes5b4","relativeAngle":-3.1415926535897927,"color":"white","lz":20,"rightPoint":[-16.136312320425503,6.1110689392893525,1],"cz":0,"leftPoint":[2.7368035959524555,6.111068939289361,1],"parentId":"jH5z454ciczrceJTNes5b4","id":"tq43NPQgXhkeNmwFteVBqx","lx":18.873115916377962,"roofId":"aqd47NYJ1Q6UzcCmxxcoXQ","ly":0.3,"textureType":"Wall Texture Default","normal":[0,0,1],"leftRoofHeight":20,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"normal":[0,0,1],"leftJoints":["4ocNasurxu3LhLKonWAKWR"],"lz":20,"rightRoofHeight":20,"locked":false,"foundationId":"jH5z454ciczrceJTNes5b4","cy":-0.01768597422249274,"rotation":[0,0,-0.41015237421866746],"relativeAngle":1.5707963267948966,"selected":false,"cx":2.736803595952447,"id":"pBQFic2TqVJyDdJyEaBVof","rightPoint":[2.7368035959524555,6.111068939289361,1],"cz":0,"color":"white","type":"Wall","lx":12.257509827023695,"roofId":"aqd47NYJ1Q6UzcCmxxcoXQ","textureType":"Wall Texture Default","ly":0.3,"rightJoints":["tq43NPQgXhkeNmwFteVBqx"],"parentId":"jH5z454ciczrceJTNes5b4","leftRoofHeight":20,"leftPoint":[2.7368035959524515,-6.146440887734339,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"selected":false,"rightJoints":["pBQFic2TqVJyDdJyEaBVof"],"leftJoints":["w8GFYP8jB1EG2YVL6appCT"],"lz":20,"lx":18.873115916377927,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"id":"4ocNasurxu3LhLKonWAKWR","locked":false,"foundationId":"jH5z454ciczrceJTNes5b4","leftRoofHeight":20,"type":"Wall","cy":-6.146440887734334,"normal":[0,0,1],"cx":-6.69975436223651,"rightRoofHeight":20,"ly":0.3,"parentId":"jH5z454ciczrceJTNes5b4","cz":0,"color":"white","relativeAngle":-7.059076177209601e-16,"roofId":"aqd47NYJ1Q6UzcCmxxcoXQ","rightPoint":[2.736803595952453,-6.146440887734342,1],"leftPoint":[-16.13631232042547,-6.146440887734327,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"rotation":[0,0,-0.41015237421866746],"rightPoint":[-16.13631232042547,-6.146440887734327,1],"ly":0.3,"parentId":"jH5z454ciczrceJTNes5b4","textureType":"Wall Texture Default","id":"w8GFYP8jB1EG2YVL6appCT","relativeAngle":-1.5707963267948937,"type":"Wall","lz":20,"locked":false,"leftJoints":["tq43NPQgXhkeNmwFteVBqx"],"leftPoint":[-16.136312320425503,6.1110689392893525,1],"foundationId":"jH5z454ciczrceJTNes5b4","cz":0,"roofId":"aqd47NYJ1Q6UzcCmxxcoXQ","rightRoofHeight":20,"color":"white","cx":-16.13631232042549,"cy":-0.017685974222486855,"lx":12.257509827023679,"leftRoofHeight":20,"rightJoints":["4ocNasurxu3LhLKonWAKWR"],"normal":[0,0,1],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"locked":false,"color":"#808080","lx":39.42410417793452,"cx":66.63950557888982,"ly":15.35325958544188,"rotation":[0,0,-0.41015237421866746],"type":"Foundation","selected":false,"lz":1,"parentId":"Ground","normal":[0,0,1],"solarPowerTower":{},"cy":16.298608230784698,"id":"jH5z454ciczrceJTNes5b4","solarAbsorberPipe":{},"solarUpdraftTower":{},"cz":0.5},{"type":"Wall","relativeAngle":3.141592653589793,"cy":1.981243048009849,"foundationId":"n59KTNFiEAdewYQ4UeZKU4","locked":false,"parentId":"n59KTNFiEAdewYQ4UeZKU4","leftRoofHeight":4,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"roofId":"rSsa8T9bULkoQ2pinqnr8i","leftPoint":[0.9304202110555404,1.981243048009849,0],"color":"white","rightRoofHeight":4,"cz":0,"cx":-2.0589287667673153,"id":"v3VJnU8TGf45Uue1UFcxRK","lx":5.9786979556457105,"centerRoofHeight":[0,4.977141261476465],"normal":[0,0,1],"rightPoint":[-5.0482777445901705,1.981243048009849,0],"leftJoints":["usXjKxe48EnDWZT6Frh4Pq"],"selected":false,"ly":0.3,"lz":4,"rightJoints":["oB5VoQWfR3kmSWtghKT8LL"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"leftJoints":["8m4LSxdnyZTCo1Q3CX64h7"],"rightPoint":[0.9304202110555404,1.981243048009849,0],"cx":0.9304202110555421,"leftPoint":[0.9304202110555437,-1.9726241537665505,0],"color":"white","rotation":[0,0,-0.41015237421866746],"leftRoofHeight":4,"foundationId":"n59KTNFiEAdewYQ4UeZKU4","cy":0.004309447121649268,"lx":3.9538672017764,"locked":false,"id":"usXjKxe48EnDWZT6Frh4Pq","selected":false,"ly":0.3,"rightRoofHeight":4,"rightJoints":["v3VJnU8TGf45Uue1UFcxRK"],"textureType":"Wall Texture Default","parentId":"n59KTNFiEAdewYQ4UeZKU4","roofId":"rSsa8T9bULkoQ2pinqnr8i","normal":[0,0,1],"type":"Wall","relativeAngle":1.5707963267948977,"cz":0,"lz":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"cx":-2.058928766767304,"cz":0,"leftRoofHeight":4,"lx":5.978697955645695,"rightJoints":["usXjKxe48EnDWZT6Frh4Pq"],"centerRoofHeight":[0,4.977141261476465],"leftJoints":["oB5VoQWfR3kmSWtghKT8LL"],"foundationId":"n59KTNFiEAdewYQ4UeZKU4","id":"8m4LSxdnyZTCo1Q3CX64h7","rightRoofHeight":4,"rightPoint":[0.9304202110555437,-1.9726241537665505,0],"roofId":"rSsa8T9bULkoQ2pinqnr8i","cy":-1.9726241537665496,"textureType":"Wall Texture Default","locked":false,"normal":[0,0,1],"type":"Wall","rotation":[0,0,-0.41015237421866746],"selected":false,"ly":0.3,"relativeAngle":-2.971143303405775e-16,"color":"white","parentId":"n59KTNFiEAdewYQ4UeZKU4","lz":4,"leftPoint":[-5.048277744590152,-1.9726241537665488,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"locked":false,"rightJoints":["8m4LSxdnyZTCo1Q3CX64h7"],"lz":4,"leftJoints":["v3VJnU8TGf45Uue1UFcxRK"],"color":"white","type":"Wall","textureType":"Wall Texture Default","cz":0,"parentId":"n59KTNFiEAdewYQ4UeZKU4","selected":false,"id":"oB5VoQWfR3kmSWtghKT8LL","rotation":[0,0,-0.41015237421866746],"cy":0.004309447121650156,"leftPoint":[-5.0482777445901705,1.981243048009849,0],"leftRoofHeight":4,"lx":3.953867201776398,"rightPoint":[-5.048277744590152,-1.9726241537665488,0],"normal":[0,0,1],"rightRoofHeight":4,"ly":0.3,"cx":-5.048277744590161,"relativeAngle":-1.570796326794892,"roofId":"rSsa8T9bULkoQ2pinqnr8i","foundationId":"n59KTNFiEAdewYQ4UeZKU4","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"solarUpdraftTower":{},"normal":[0,0,1],"color":"#808080","lz":1,"cz":0.5,"lx":10.423522474713057,"ly":4.1286288557387945,"locked":false,"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"solarPowerTower":{},"id":"n59KTNFiEAdewYQ4UeZKU4","cy":-40.804555672678404,"type":"Foundation","cx":68.39138539021306,"selected":false,"solarAbsorberPipe":{}},{"locked":false,"selected":false,"lx":5.9786979556457105,"ly":0.3,"rightPoint":[-5.0482777445901705,1.981243048009849,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"lz":4,"foundationId":"5YuxWSX2uVTCHuPGAXXubi","leftRoofHeight":4,"roofId":"1E1bgqioi9tFqyckxVRysA","leftJoints":["c7E26TQsGBwiEUQ4ooLDKK"],"color":"white","normal":[0,0,1],"relativeAngle":3.141592653589793,"type":"Wall","id":"ccjpL8TWCg1zhnSiXXyUiu","cx":-2.0589287667673153,"rightJoints":["ar4bhGtUec9qTkqAxEbkF4"],"rotation":[0,0,-0.41015237421866746],"parentId":"5YuxWSX2uVTCHuPGAXXubi","cz":0,"centerRoofHeight":[0,4.788751523933837],"leftPoint":[0.9304202110555404,1.981243048009849,0],"cy":1.981243048009849,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"parentId":"5YuxWSX2uVTCHuPGAXXubi","lz":4,"rightRoofHeight":4,"roofId":"1E1bgqioi9tFqyckxVRysA","cy":0.004309447121649268,"foundationId":"5YuxWSX2uVTCHuPGAXXubi","normal":[0,0,1],"type":"Wall","locked":false,"rotation":[0,0,-0.41015237421866746],"leftJoints":["nxEr9eKy7xre7xajGyT8qN"],"selected":false,"ly":0.3,"relativeAngle":1.5707963267948977,"rightPoint":[0.9304202110555404,1.981243048009849,0],"rightJoints":["ccjpL8TWCg1zhnSiXXyUiu"],"leftPoint":[0.9304202110555437,-1.9726241537665505,0],"id":"c7E26TQsGBwiEUQ4ooLDKK","cz":0,"cx":0.9304202110555421,"lx":3.9538672017764,"textureType":"Wall Texture Default","color":"white","leftRoofHeight":4,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"cz":0,"relativeAngle":-2.971143303405775e-16,"textureType":"Wall Texture Default","normal":[0,0,1],"color":"white","parentId":"5YuxWSX2uVTCHuPGAXXubi","leftJoints":["ar4bhGtUec9qTkqAxEbkF4"],"leftPoint":[-5.048277744590152,-1.9726241537665488,0],"centerRoofHeight":[0,4.788751523933837],"lx":5.978697955645695,"leftRoofHeight":4,"cx":-2.058928766767304,"locked":false,"ly":0.3,"rightPoint":[0.9304202110555437,-1.9726241537665505,0],"id":"nxEr9eKy7xre7xajGyT8qN","type":"Wall","cy":-1.9726241537665496,"rightRoofHeight":4,"lz":4,"foundationId":"5YuxWSX2uVTCHuPGAXXubi","selected":false,"rightJoints":["c7E26TQsGBwiEUQ4ooLDKK"],"roofId":"1E1bgqioi9tFqyckxVRysA","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"locked":false,"ly":0.3,"parentId":"5YuxWSX2uVTCHuPGAXXubi","normal":[0,0,1],"textureType":"Wall Texture Default","lx":3.953867201776398,"cy":0.004309447121650156,"lz":4,"selected":false,"leftPoint":[-5.0482777445901705,1.981243048009849,0],"leftRoofHeight":4,"rightPoint":[-5.048277744590152,-1.9726241537665488,0],"rightJoints":["nxEr9eKy7xre7xajGyT8qN"],"rightRoofHeight":4,"relativeAngle":-1.570796326794892,"color":"white","roofId":"1E1bgqioi9tFqyckxVRysA","leftJoints":["ccjpL8TWCg1zhnSiXXyUiu"],"id":"ar4bhGtUec9qTkqAxEbkF4","foundationId":"5YuxWSX2uVTCHuPGAXXubi","cx":-5.048277744590161,"rotation":[0,0,-0.41015237421866746],"type":"Wall","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"lz":1,"selected":false,"solarAbsorberPipe":{},"cz":0.5,"locked":false,"type":"Foundation","normal":[0,0,1],"solarPowerTower":{},"id":"5YuxWSX2uVTCHuPGAXXubi","cy":-30.912868668016095,"cx":72.70720165765073,"solarUpdraftTower":{},"ly":4.1286288557387945,"parentId":"Ground","color":"#808080","lx":10.423522474713057,"rotation":[0,0,-0.41015237421866746]},{"textureType":"Wall Texture Default","cx":0.01121512740181907,"rightPoint":[-3.072511420947951,1.3672430244223959,0],"cy":1.3672430244223936,"id":"6QCJ15fiFxBVfmQVYdq3Tt","relativeAngle":3.1415926535897927,"normal":[0,0,1],"selected":false,"leftJoints":["hKcyiMXDvquM1MhoYuTSwv"],"leftRoofHeight":11,"cz":0,"rightJoints":["xaCgBVBkCeg8kpZex83ZSB"],"lz":11,"type":"Wall","lx":6.167453096699541,"locked":false,"leftPoint":[3.0949416757515893,1.3672430244223912,0],"ly":0.3,"foundationId":"jsSCnAypzh29RxPH7MED73","rotation":[0,0,-0.41015237421866746],"roofId":"g5QrsNM3GmBsG5THTKDrtm","parentId":"jsSCnAypzh29RxPH7MED73","color":"white","rightRoofHeight":11,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":7.1624734368285194,"leftRoofHeight":11,"rightPoint":[3.0949416757515893,1.3672430244223912,0],"foundationId":"jsSCnAypzh29RxPH7MED73","cz":0,"cx":3.0949416757515884,"ly":0.3,"rightJoints":["6QCJ15fiFxBVfmQVYdq3Tt"],"normal":[0,0,1],"textureType":"Wall Texture Default","rightRoofHeight":11,"leftPoint":[3.094941675751588,-5.795230412406128,0],"type":"Wall","id":"hKcyiMXDvquM1MhoYuTSwv","roofId":"g5QrsNM3GmBsG5THTKDrtm","locked":false,"cy":-2.2139936939918683,"color":"white","rotation":[0,0,-0.41015237421866746],"parentId":"jsSCnAypzh29RxPH7MED73","relativeAngle":1.5707963267948963,"selected":false,"lz":11,"leftJoints":["eS1W5AA2DGWiYaV8ifzzrj"],"centerRoofHeight":[-0.5,11],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"leftJoints":["xaCgBVBkCeg8kpZex83ZSB"],"cz":0,"rotation":[0,0,-0.41015237421866746],"relativeAngle":0,"textureType":"Wall Texture Default","cy":-5.795230412406128,"rightPoint":[3.094941675751588,-5.795230412406128,0],"lx":6.167453096699535,"parentId":"jsSCnAypzh29RxPH7MED73","id":"eS1W5AA2DGWiYaV8ifzzrj","foundationId":"jsSCnAypzh29RxPH7MED73","locked":false,"rightJoints":["hKcyiMXDvquM1MhoYuTSwv"],"ly":0.3,"rightRoofHeight":11,"color":"white","leftPoint":[-3.0725114209479467,-5.795230412406128,0],"leftRoofHeight":11,"roofId":"g5QrsNM3GmBsG5THTKDrtm","cx":0.011215127401820624,"type":"Wall","lz":11,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"roofId":"g5QrsNM3GmBsG5THTKDrtm","cz":0,"leftRoofHeight":11,"type":"Wall","cy":-2.213993693991866,"parentId":"jsSCnAypzh29RxPH7MED73","rotation":[0,0,-0.41015237421866746],"rightJoints":["eS1W5AA2DGWiYaV8ifzzrj"],"textureType":"Wall Texture Default","id":"xaCgBVBkCeg8kpZex83ZSB","lx":7.162473436828524,"cx":-3.072511420947949,"leftJoints":["6QCJ15fiFxBVfmQVYdq3Tt"],"lz":11,"ly":0.3,"locked":false,"rightPoint":[-3.0725114209479467,-5.795230412406128,0],"foundationId":"jsSCnAypzh29RxPH7MED73","normal":[0,0,1],"color":"white","centerRoofHeight":[0.5,11],"rightRoofHeight":11,"leftPoint":[-3.072511420947951,1.3672430244223959,0],"relativeAngle":-1.570796326794896,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"locked":false,"solarPowerTower":{},"selected":false,"solarUpdraftTower":{},"cz":0.5,"solarAbsorberPipe":{},"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"ly":12.02473099186649,"cy":-50.437956729618975,"lx":6.9193101388799265,"lz":1,"parentId":"Ground","color":"#808080","type":"Foundation","cx":40.2572441035554,"id":"jsSCnAypzh29RxPH7MED73"},{"cy":0,"wallsId":["91sCr2ydHgygQWRuaJ5N1C"],"lz":0,"type":"Roof","id":"vRe6nzFrDCWVtSCu332MH4","textureType":"No Roof Texture","showLabel":false,"rotation":[0,0,0],"lineWidth":0.2,"ridgeLeftPoint":[0,1],"cz":0,"normal":[0,0,1],"roofType":"Gable","cx":0,"ly":0,"thickness":0.2,"locked":false,"lx":0,"parentId":"bkH7VRrzUTdvxfSm8xVMfT","foundationId":"bkH7VRrzUTdvxfSm8xVMfT","ridgeRightPoint":[0,1],"lineColor":"black","selected":false,"color":"#ffffff","rise":1.3393317550628012,"ceiling":false},{"cz":0,"lz":0,"id":"fS4RCk5GfqcPBkrsfQqupD","ly":0,"selected":false,"ridgeLeftPoint":[-0.5,1],"normal":[0,0,1],"showLabel":false,"cy":0,"color":"#ffffff","type":"Roof","foundationId":"kqR5p2bajX4NMTBq55qbCM","rotation":[0,0,0],"locked":false,"lineColor":"black","textureType":"No Roof Texture","lineWidth":0.2,"lx":0,"ridgeRightPoint":[0.5,1],"cx":0,"thickness":0.2,"wallsId":["4CXQZA8oGxMYG5uuTdJH4z"],"roofType":"Gable","parentId":"kqR5p2bajX4NMTBq55qbCM","rise":0,"ceiling":false},{"showLabel":false,"rotation":[0,0,0],"cy":0,"wallsId":["oB5VoQWfR3kmSWtghKT8LL"],"thickness":0.2,"lz":0,"foundationId":"n59KTNFiEAdewYQ4UeZKU4","lineColor":"black","cz":0,"textureType":"No Roof Texture","cx":0,"type":"Roof","ly":0,"roofType":"Gable","lineWidth":0.2,"selected":false,"ridgeRightPoint":[0,1],"color":"#ffffff","ridgeLeftPoint":[0,1],"parentId":"n59KTNFiEAdewYQ4UeZKU4","normal":[0,0,1],"locked":false,"lx":0,"id":"rSsa8T9bULkoQ2pinqnr8i","rise":0.977141261476465,"ceiling":false},{"parentId":"b7G57PTXunVqeHXzCWeuRF","rightJoints":["dpZWnBXJifWNeSxPnXSh11"],"ly":0.3,"cx":0.22353744000734044,"lz":10,"normal":[0,0,1],"leftPoint":[8.53481429529893,4.284875927504061,1],"rightRoofHeight":10,"foundationId":"b7G57PTXunVqeHXzCWeuRF","textureType":"Wall Texture Default","rightPoint":[-8.087739415284249,4.284875927504063,1],"leftJoints":["6fcDhLeskSsK9vgEVSS72V"],"locked":false,"relativeAngle":3.141592653589793,"lx":16.622553710583173,"type":"Wall","roofId":"5AL2YmNDuGkeP7qZ5AC7iV","color":"white","id":"kj6mwcCRjjAjkZKNVLpD6Q","rotation":[0,0,-0.41015237421866746],"cy":4.2848759275040615,"leftRoofHeight":10,"selected":false,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"normal":[0,0,1],"id":"6fcDhLeskSsK9vgEVSS72V","locked":false,"roofId":"5AL2YmNDuGkeP7qZ5AC7iV","rotation":[0,0,-0.41015237421866746],"cx":8.534814295298915,"lz":10,"leftJoints":["eJ8JK9wm6JNigJXLFxHXZv"],"rightJoints":["kj6mwcCRjjAjkZKNVLpD6Q"],"leftPoint":[8.534814295298911,-8.242350712076524,1],"leftRoofHeight":10,"textureType":"Wall Texture Default","rightRoofHeight":10,"cz":0,"cy":-1.978737392286233,"selected":false,"foundationId":"b7G57PTXunVqeHXzCWeuRF","parentId":"b7G57PTXunVqeHXzCWeuRF","lx":12.527226639580588,"ly":0.3,"rightPoint":[8.53481429529893,4.284875927504061,1],"relativeAngle":1.5707963267948954,"color":"white","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"ly":0.3,"id":"eJ8JK9wm6JNigJXLFxHXZv","rightPoint":[8.534814295298911,-8.242350712076524,1],"rightJoints":["6fcDhLeskSsK9vgEVSS72V"],"leftRoofHeight":10,"cz":0,"cx":0.22353744000733222,"locked":false,"rightRoofHeight":10,"leftJoints":["dpZWnBXJifWNeSxPnXSh11"],"leftPoint":[-8.087739415284243,-8.24235071207653,1],"parentId":"b7G57PTXunVqeHXzCWeuRF","lz":10,"lx":16.622553710583155,"cy":-8.242350712076528,"color":"white","relativeAngle":2.1372851251721804e-16,"textureType":"Wall Texture Default","selected":false,"rotation":[0,0,-0.41015237421866746],"type":"Wall","normal":[0,0,1],"roofId":"5AL2YmNDuGkeP7qZ5AC7iV","foundationId":"b7G57PTXunVqeHXzCWeuRF","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"textureType":"Wall Texture Default","cz":0,"ly":0.3,"relativeAngle":-1.5707963267948966,"selected":false,"color":"white","cy":-1.9787373922862332,"leftPoint":[-8.087739415284249,4.284875927504063,1],"lx":12.527226639580594,"lz":10,"parentId":"b7G57PTXunVqeHXzCWeuRF","leftJoints":["kj6mwcCRjjAjkZKNVLpD6Q"],"locked":false,"foundationId":"b7G57PTXunVqeHXzCWeuRF","roofId":"5AL2YmNDuGkeP7qZ5AC7iV","rightRoofHeight":10,"rightPoint":[-8.087739415284243,-8.24235071207653,1],"id":"dpZWnBXJifWNeSxPnXSh11","normal":[0,0,1],"cx":-8.087739415284243,"rightJoints":["eJ8JK9wm6JNigJXLFxHXZv"],"rotation":[0,0,-0.41015237421866746],"type":"Wall","leftRoofHeight":10,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"id":"b7G57PTXunVqeHXzCWeuRF","cz":0.5,"color":"#808080","parentId":"Ground","locked":false,"cx":39.84041470102862,"solarPowerTower":{},"type":"Foundation","selected":false,"rotation":[0,0,-0.41015237421866746],"solarAbsorberPipe":{},"lx":18.262342237511447,"solarUpdraftTower":{},"cy":-19.957109308878913,"ly":25.839391461953184,"lz":1,"normal":[0,0,1]},{"wallsId":["nRLvRbWCCyQkZn2SaeWzhR","4RfjPoTAycowc8B5SwzkpM","a6q6Txnypc9iPjohNf43CB","jWqRj42hxzMWofSpUH42dz"],"lx":0,"cz":0,"cx":0,"thickness":0.2,"id":"jSo2aHHx58NTeAQuDZodmY","type":"Roof","showLabel":false,"locked":false,"roofType":"Pyramid","lz":0,"ly":0,"foundationId":"uBZaguS4Mp4iydQBE88CA1","color":"#ffffff","lineWidth":0.2,"cy":0,"parentId":"uBZaguS4Mp4iydQBE88CA1","normal":[0,0,1],"rotation":[0,0,0],"textureType":"No Roof Texture","lineColor":"black","selected":false,"rise":1.4201872195519947,"ceiling":false},{"lx":0,"selected":false,"parentId":"niHTxZ4PaRwa8PCQj9YtSY","foundationId":"niHTxZ4PaRwa8PCQj9YtSY","wallsId":["nW4zHPMqaoecHBwBCyEqwh","xqjrhteUBJfNDcJWuHnvRu","5TCp2VzUPYtC3wHFFUhMZA","qY5WoPV6F2CGJU6Z5GgH9A"],"cx":0,"showLabel":false,"rotation":[0,0,0],"cz":0,"normal":[0,0,1],"roofType":"Pyramid","lz":0,"locked":false,"lineColor":"black","thickness":0.2,"cy":0,"ly":0,"id":"15884yYUHNT5NwXMKhmRGP","color":"#ffffff","textureType":"No Roof Texture","type":"Roof","lineWidth":0.2,"rise":2,"ceiling":false},{"locked":false,"lx":0,"textureType":"No Roof Texture","normal":[0,0,1],"thickness":0.2,"lineWidth":0.2,"cy":0,"ridgeRightPoint":[0,1],"parentId":"x5CDMTRHrHH6ChAJLKJCrV","cx":0,"wallsId":["6V62Zt3rayMTYsccknpXaH"],"showLabel":false,"foundationId":"x5CDMTRHrHH6ChAJLKJCrV","lz":0,"selected":false,"ly":0,"ridgeLeftPoint":[0,1],"lineColor":"black","cz":0,"id":"5Fxdv1WWmCMeawRz9mKuqV","type":"Roof","color":"#ffffff","rotation":[0,0,0],"roofType":"Gable","rise":1.060818180566665,"ceiling":false},{"showLabel":false,"ly":0,"color":"#ffffff","rotation":[0,0,0],"roofType":"Pyramid","cx":0,"lineWidth":0.2,"thickness":0.2,"textureType":"No Roof Texture","locked":false,"wallsId":["5QyDHSHQi5g83yTByESY7g","nNQo9acqRqKRWfE4a1RvLy","7JuGqBdByKra32qVf2wuMP","2DDFqyaAZAAuWTVgy7UTYL"],"lx":0,"selected":false,"lz":0,"parentId":"64tiQZ7Po62MhdtE1e44n9","cy":0,"cz":0,"normal":[0,0,1],"foundationId":"64tiQZ7Po62MhdtE1e44n9","lineColor":"black","type":"Roof","id":"oTjPo4r99EKfdasnxT3n5a","rise":2,"ceiling":false},{"cz":0,"ly":0,"color":"#ffffff","showLabel":false,"type":"Roof","wallsId":["oNZPm4ForjT1jLCRGXT8ae"],"locked":false,"lineWidth":0.2,"ridgeRightPoint":[0,1],"textureType":"No Roof Texture","cy":0,"thickness":0.2,"lz":0,"rotation":[0,0,0],"parentId":"qJBTbMiP4tUMstkk4bQqAp","normal":[0,0,1],"cx":0,"id":"tLNDomb3SubspErPERhojH","lx":0,"lineColor":"black","selected":false,"ridgeLeftPoint":[0,1],"foundationId":"qJBTbMiP4tUMstkk4bQqAp","roofType":"Gable","rise":1.111126896848333,"ceiling":false},{"color":"#ffffff","normal":[0,0,1],"thickness":0.2,"ridgeRightPoint":[0,1],"lz":0,"roofType":"Gable","ly":0,"type":"Roof","lineColor":"black","showLabel":false,"id":"1E1bgqioi9tFqyckxVRysA","parentId":"5YuxWSX2uVTCHuPGAXXubi","ridgeLeftPoint":[0,1],"foundationId":"5YuxWSX2uVTCHuPGAXXubi","locked":false,"cz":0,"selected":false,"lx":0,"textureType":"No Roof Texture","cy":0,"lineWidth":0.2,"wallsId":["ar4bhGtUec9qTkqAxEbkF4"],"rotation":[0,0,0],"cx":0,"rise":0.7887515239338372,"ceiling":false},{"cy":0.22491740558796045,"rightPoint":[-7.989846773884258,0.2249174055879637,1],"roofId":"7MHnZ8shY1nNWWHte69oqs","lx":16.622553710583173,"selected":false,"locked":false,"type":"Wall","parentId":"jXMhg2wW7AzS5RR8DVRgQA","rightJoints":["bBRKF8cuUabp5jr721b2aF"],"leftRoofHeight":20,"rotation":[0,0,-0.41015237421866746],"lz":20,"relativeAngle":3.141592653589793,"leftJoints":["monXTa8uPTJhzhXCcFVkHQ"],"cx":0.3214300814073309,"rightRoofHeight":20,"cz":0,"normal":[0,0,1],"color":"white","foundationId":"jXMhg2wW7AzS5RR8DVRgQA","id":"abgP23xfq9mn6fXM5eixEU","leftPoint":[8.63270693669892,0.22491740558795703,1],"ly":0.3,"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"normal":[0,0,1],"locked":false,"parentId":"jXMhg2wW7AzS5RR8DVRgQA","rightPoint":[8.63270693669892,0.22491740558795703,1],"leftPoint":[8.6327069366989,-12.302309233992622,1],"id":"monXTa8uPTJhzhXCcFVkHQ","cx":8.632706936698906,"cy":-6.038695914202334,"textureType":"Wall Texture Default","leftJoints":["1sWH6Vf283ZQdSSFT642nh"],"color":"white","foundationId":"jXMhg2wW7AzS5RR8DVRgQA","rightRoofHeight":20,"leftRoofHeight":20,"cz":0,"lx":12.527226639580588,"selected":false,"ly":0.3,"relativeAngle":1.5707963267948954,"rightJoints":["abgP23xfq9mn6fXM5eixEU"],"type":"Wall","lz":20,"roofId":"7MHnZ8shY1nNWWHte69oqs","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"rightPoint":[8.6327069366989,-12.302309233992622,1],"roofId":"7MHnZ8shY1nNWWHte69oqs","ly":0.3,"lx":16.622553710583155,"relativeAngle":2.1372851251721804e-16,"rotation":[0,0,-0.41015237421866746],"lz":20,"leftJoints":["bBRKF8cuUabp5jr721b2aF"],"normal":[0,0,1],"foundationId":"jXMhg2wW7AzS5RR8DVRgQA","leftPoint":[-7.989846773884253,-12.302309233992618,1],"cz":0,"id":"1sWH6Vf283ZQdSSFT642nh","rightJoints":["monXTa8uPTJhzhXCcFVkHQ"],"selected":false,"parentId":"jXMhg2wW7AzS5RR8DVRgQA","color":"white","cx":0.321430081407323,"textureType":"Wall Texture Default","type":"Wall","leftRoofHeight":20,"locked":false,"cy":-12.302309233992629,"rightRoofHeight":20,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"lx":12.527226639580594,"leftRoofHeight":20,"color":"white","normal":[0,0,1],"leftJoints":["abgP23xfq9mn6fXM5eixEU"],"cz":0,"ly":0.3,"selected":false,"rightPoint":[-7.989846773884253,-12.302309233992618,1],"cy":-6.038695914202334,"leftPoint":[-7.989846773884258,0.2249174055879637,1],"locked":false,"id":"bBRKF8cuUabp5jr721b2aF","rightJoints":["1sWH6Vf283ZQdSSFT642nh"],"relativeAngle":-1.5707963267948966,"foundationId":"jXMhg2wW7AzS5RR8DVRgQA","cx":-7.989846773884254,"parentId":"jXMhg2wW7AzS5RR8DVRgQA","textureType":"Wall Texture Default","roofId":"7MHnZ8shY1nNWWHte69oqs","lz":20,"type":"Wall","rightRoofHeight":20,"rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Foundation","cy":-59.32802731716726,"color":"#808080","solarUpdraftTower":{},"parentId":"Ground","solarPowerTower":{},"rotation":[0,0,-0.41015237421866746],"lz":1,"solarAbsorberPipe":{},"normal":[0,0,1],"ly":33.95930850578536,"lx":18.06655695471146,"selected":false,"cz":0.5,"id":"jXMhg2wW7AzS5RR8DVRgQA","locked":false,"cx":27.648877509882105},{"parentId":"Ground","color":"gray","cx":-21.42383933703887,"cy":-95.95694272842316,"ly":1.57584749281375,"id":"fskGS47Z1ZNZV2kamP1tSH","normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":10,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cz":5,"locked":false,"selected":false,"type":"Cuboid","lx":2.5033124327375345,"rotation":[0,0,-0.41015237421866746]},{"color":"white","lx":3.975737139849098,"foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","id":"mCTHFTsPbL7uxKLV7Fs7gC","locked":false,"cx":11.798791107427842,"leftRoofHeight":6,"rightRoofHeight":6,"leftJoints":["fAYf9rMtUxbvaurL2KcLtn"],"centerRoofHeight":[0,6.274887651356121],"lz":6,"leftPoint":[11.798791107427842,-1.9873220704176595,0],"textureType":"Wall Texture Default","ly":0.3,"cy":0.000546499506889564,"cz":0,"relativeAngle":1.5707963267948961,"type":"Wall","selected":false,"rightPoint":[11.798791107427844,1.9884150694314386,0],"roofId":"rxThm84RhChdhdNYSFFbG6","parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","rotation":[0,0,-0.41015237421866746],"rightJoints":["htbHSZNyQhmtqy5XzNBo85"],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"cy":-1.9873220704176617,"id":"fAYf9rMtUxbvaurL2KcLtn","relativeAngle":5.312979959407059e-16,"cz":0,"parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","rightPoint":[11.798791107427842,-1.9873220704176595,0],"leftRoofHeight":6,"leftJoints":["21bSs7TaWmDDwyZwkVPp3m"],"color":"white","lx":7.940642588168972,"roofId":"rxThm84RhChdhdNYSFFbG6","cx":7.828469813343356,"locked":false,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"type":"Wall","ly":0.3,"lz":6,"rightRoofHeight":6,"leftPoint":[3.858148519258871,-1.9873220704176637,0],"textureType":"Wall Texture Default","rightJoints":["mCTHFTsPbL7uxKLV7Fs7gC"],"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightRoofHeight":6,"ly":0.3,"roofId":"rxThm84RhChdhdNYSFFbG6","normal":[0,0,1],"leftJoints":["htbHSZNyQhmtqy5XzNBo85"],"leftRoofHeight":6,"textureType":"Wall Texture Default","cx":3.8581485192588696,"locked":false,"lz":6,"rotation":[0,0,-0.41015237421866746],"centerRoofHeight":[0,6.274887651356121],"lx":3.975737139849111,"selected":false,"leftPoint":[3.858148519258868,1.9884150694314473,0],"id":"21bSs7TaWmDDwyZwkVPp3m","color":"white","cy":0.0005464995068917844,"parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","rightJoints":["fAYf9rMtUxbvaurL2KcLtn"],"rightPoint":[3.858148519258871,-1.9873220704176637,0],"relativeAngle":-1.570796326794896,"foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","type":"Wall","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","roofId":"rxThm84RhChdhdNYSFFbG6","color":"white","selected":false,"ly":0.3,"parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","leftRoofHeight":6,"type":"Wall","leftPoint":[11.798791107427844,1.9884150694314386,0],"rightPoint":[3.858148519258868,1.9884150694314473,0],"cx":7.8284698133433555,"cz":3.7151685093329987,"textureType":"Wall Texture Default","relativeAngle":3.1415926535897922,"leftJoints":["mCTHFTsPbL7uxKLV7Fs7gC"],"id":"htbHSZNyQhmtqy5XzNBo85","rightJoints":["21bSs7TaWmDDwyZwkVPp3m"],"locked":false,"rotation":[0,0,-0.41015237421866746],"lx":7.940642588168976,"normal":[0,0,1],"rightRoofHeight":6,"cy":1.988415069431443,"lz":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"textureType":"No Roof Texture","ridgeLeftPoint":[0,1],"cx":0,"rotation":[0,0,-0.41015237421866746],"selected":false,"ridgeRightPoint":[0,1],"ly":0,"lz":0,"cz":0,"locked":false,"foundationId":"jYmTgt5Yh5kp4YxeQ9xdGS","lx":0,"roofType":"Gable","type":"Roof","id":"rxThm84RhChdhdNYSFFbG6","wallsId":["htbHSZNyQhmtqy5XzNBo85"],"parentId":"jYmTgt5Yh5kp4YxeQ9xdGS","normal":[0,0,1],"color":"#ffffff","cy":0,"thickness":0.2,"rise":0.2748876513561207,"ceiling":false},{"type":"Foundation","locked":false,"cy":-78.52468836433339,"lx":29.579193784185183,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"selected":false,"cx":-61.66430487227184,"cz":0.5,"solarAbsorberPipe":{},"lz":1,"solarPowerTower":{},"parentId":"Ground","solarUpdraftTower":{},"ly":4.244451594984441,"id":"jYmTgt5Yh5kp4YxeQ9xdGS"},{"normal":[0,0,1],"parentId":"2LZNQJZFPrCxZzv5NuwumV","rightRidgeLength":1.461737872145095,"selected":false,"color":"#ffffff","locked":false,"cy":0,"textureType":"No Roof Texture","lineColor":"black","lineWidth":0.2,"id":"9TF7gEynqtnsWJGidoBUNq","wallsId":["hcTBY8guDEpwEg5jtYtD3H"],"rotation":[0,0,0],"showLabel":false,"roofType":"Hip","leftRidgeLength":1.7970131018338904,"thickness":0.2,"foundationId":"2LZNQJZFPrCxZzv5NuwumV","lz":0,"cx":0,"ly":0,"lx":0,"type":"Roof","cz":0,"rise":5,"ceiling":false},{"selected":false,"id":"tN1a6B1uCvjUWCkBQctrVG","rotation":[0,0,0],"lineColor":"black","lineWidth":0.2,"ly":0,"cz":0,"roofType":"Hip","cy":0,"textureType":"No Roof Texture","leftRidgeLength":0.059768175058504625,"showLabel":false,"locked":false,"wallsId":["b12LAtSYTNxCwTbH7iRFmz"],"cx":0,"thickness":0.2,"normal":[0,0,1],"foundationId":"rQh2s1iBHWvFGFdzViXEe2","lz":0,"lx":0,"parentId":"rQh2s1iBHWvFGFdzViXEe2","color":"#ffffff","rightRidgeLength":12.757143526762304,"type":"Roof","rise":2.8291651006338494,"ceiling":false},{"ly":0,"lineColor":"black","thickness":0.2,"cz":0,"type":"Roof","wallsId":["gs8TZionAFZcvbLtmKeykq"],"lineWidth":0.2,"parentId":"kLLR11PM8xK326yQ5QVzHF","roofType":"Gable","cx":0,"showLabel":false,"id":"mgoQMGVeVMwiZzvh6DtsHC","ridgeLeftPoint":[0,1],"cy":0,"ridgeRightPoint":[0,1],"lx":0,"textureType":"No Roof Texture","foundationId":"kLLR11PM8xK326yQ5QVzHF","color":"#ffffff","selected":false,"locked":false,"rotation":[0,0,0],"normal":[0,0,1],"lz":0,"rise":1.714737050020105,"ceiling":false},{"normal":[0,0,1],"type":"Roof","lz":0,"cx":0,"rotation":[0,0,0],"rightRidgeLength":1.354315870345922,"wallsId":["c79sKVUHUztGcC5p3emVv9"],"lx":0,"lineWidth":0.2,"thickness":0.2,"leftRidgeLength":1.2176583991481174,"cy":0,"selected":false,"textureType":"No Roof Texture","foundationId":"tjMZKt5v9D1sx6sc6Xyaq2","showLabel":false,"cz":0,"color":"#ffffff","parentId":"tjMZKt5v9D1sx6sc6Xyaq2","locked":false,"roofType":"Hip","id":"teQS3ohvRHqAbgCQQahyC6","lineColor":"black","ly":0,"rise":5,"ceiling":false},{"ly":5.984113255877874,"color":"gray","normal":[0,0,1],"parentId":"Ground","cy":111.66856512870567,"cx":55.88269693007359,"selected":false,"lx":21.294854568920073,"id":"3PRatafdc5GGL7xWYLxLQt","rotation":[0,0,-0.41015237421866746],"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"cz":4.25,"lz":8.5},{"rightRoofHeight":12,"cx":0.017113708955167617,"relativeAngle":3.141592653589793,"lx":12.131551303286216,"leftJoints":["snwHy88SCLUgp9tM1ts1kV"],"rightPoint":[-6.04866194268794,-9.49210668858673,1],"rightJoints":["fgVtymGrmdEZZzZZ3mW69b"],"selected":false,"foundationId":"4p3AerfQErrh3N7JyKd7PA","color":"white","cy":-9.49210668858672,"ly":0.3,"locked":false,"type":"Wall","roofId":"ui47bC2XPhcG14b6RPgvMq","leftPoint":[6.082889360598275,-9.492106688586723,1],"id":"pJZasFocQxwotbLjPFqJsC","normal":[0,0,1],"lz":12,"parentId":"4p3AerfQErrh3N7JyKd7PA","cz":0,"leftRoofHeight":12,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cy":-19.44706205065753,"leftPoint":[6.082889360598278,-29.402017412728345,1],"color":"white","rightJoints":["pJZasFocQxwotbLjPFqJsC"],"locked":false,"relativeAngle":1.5707963267948963,"parentId":"4p3AerfQErrh3N7JyKd7PA","type":"Wall","selected":false,"leftRoofHeight":12,"normal":[0,0,1],"rightRoofHeight":12,"lx":19.90991072414161,"cx":6.08288936059827,"lz":12,"foundationId":"4p3AerfQErrh3N7JyKd7PA","ly":0.3,"textureType":"Wall Texture Default","roofId":"ui47bC2XPhcG14b6RPgvMq","id":"snwHy88SCLUgp9tM1ts1kV","cz":0,"rightPoint":[6.082889360598275,-9.492106688586723,1],"rotation":[0,0,-0.41015237421866746],"leftJoints":["9RBn6VqRCqHmHYTVsG2Hbq"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cx":0.017113708955172058,"lz":12,"rightJoints":["snwHy88SCLUgp9tM1ts1kV"],"leftRoofHeight":12,"type":"Wall","selected":false,"locked":false,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","ly":0.3,"rightPoint":[6.082889360598278,-29.402017412728345,1],"roofId":"ui47bC2XPhcG14b6RPgvMq","id":"9RBn6VqRCqHmHYTVsG2Hbq","lx":12.131551303286194,"leftJoints":["fgVtymGrmdEZZzZZ3mW69b"],"rightRoofHeight":12,"parentId":"4p3AerfQErrh3N7JyKd7PA","normal":[0,0,1],"cy":-29.40201741272834,"leftPoint":[-6.048661942687922,-29.402017412728334,1],"relativeAngle":-1.757094500109714e-15,"cz":0,"color":"white","foundationId":"4p3AerfQErrh3N7JyKd7PA","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"cz":0,"rightRoofHeight":12,"color":"white","type":"Wall","id":"fgVtymGrmdEZZzZZ3mW69b","cy":-19.447062050657532,"leftJoints":["pJZasFocQxwotbLjPFqJsC"],"rightPoint":[-6.048661942687922,-29.402017412728334,1],"roofId":"ui47bC2XPhcG14b6RPgvMq","leftPoint":[-6.04866194268794,-9.49210668858673,1],"relativeAngle":-1.5707963267948957,"parentId":"4p3AerfQErrh3N7JyKd7PA","lz":12,"foundationId":"4p3AerfQErrh3N7JyKd7PA","leftRoofHeight":12,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"lx":19.909910724141604,"selected":false,"locked":false,"normal":[0,0,1],"rightJoints":["9RBn6VqRCqHmHYTVsG2Hbq"],"textureType":"Wall Texture Default","cx":-6.048661942687932,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"solarPowerTower":{},"selected":false,"cy":106.34352672553437,"locked":false,"cx":54.33030410078149,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"parentId":"Ground","lz":1,"ly":63.77501586798267,"color":"#808080","lx":12.35095202063562,"solarAbsorberPipe":{},"solarUpdraftTower":{},"id":"4p3AerfQErrh3N7JyKd7PA","cz":0.5,"type":"Foundation"},{"rotation":[0,0,-0.41015237421866746],"lz":6,"normal":[0,0,1],"locked":false,"centerRoofHeight":[0,6.440750059917652],"id":"irVUAZaEWhGKYr7twduXEh","cy":6.530855931908157,"leftPoint":[2.9112812141567144,6.530855931908155,1],"roofId":"ngj1wMdEusAUmYWeWEqzyw","type":"Wall","rightRoofHeight":6,"cz":0,"rightJoints":["8yAv4GumHgHAy2fR9bygQz"],"foundationId":"gszYxD4CuGX1qrhwnFgJQu","lx":6.102875967687821,"parentId":"gszYxD4CuGX1qrhwnFgJQu","cx":-0.14015676968719282,"ly":0.3,"leftRoofHeight":6,"rightPoint":[-3.191594753531113,6.530855931908152,1],"selected":false,"textureType":"Wall Texture Default","color":"white","leftJoints":["gr56ivVG6p8ierekWDUK1u"],"relativeAngle":-3.1415926535897927,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"parentId":"gszYxD4CuGX1qrhwnFgJQu","color":"white","foundationId":"gszYxD4CuGX1qrhwnFgJQu","normal":[0,0,1],"locked":false,"cx":2.9112812141567126,"ly":0.3,"cz":0,"selected":false,"rotation":[0,0,-0.41015237421866746],"id":"gr56ivVG6p8ierekWDUK1u","textureType":"Wall Texture Default","rightJoints":["irVUAZaEWhGKYr7twduXEh"],"lx":9.731752225416841,"cy":1.6649798191997407,"rightPoint":[2.9112812141567144,6.530855931908155,1],"lz":6,"leftPoint":[2.911281214156714,-3.2008962935086798,1],"type":"Wall","relativeAngle":1.5707963267948963,"rightRoofHeight":6,"leftJoints":["1K6LZYJR4J6iMfrED26Yxe"],"roofId":"ngj1wMdEusAUmYWeWEqzyw","leftRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"selected":false,"roofId":"ngj1wMdEusAUmYWeWEqzyw","lz":6,"rightJoints":["gr56ivVG6p8ierekWDUK1u"],"centerRoofHeight":[0,6.440750059917652],"leftPoint":[-3.191594753531113,-3.2008962935086824,1],"leftJoints":["8yAv4GumHgHAy2fR9bygQz"],"rightPoint":[2.911281214156714,-3.2008962935086798,1],"cz":0,"rightRoofHeight":6,"type":"Wall","relativeAngle":-5.821376180034847e-16,"locked":false,"id":"1K6LZYJR4J6iMfrED26Yxe","parentId":"gszYxD4CuGX1qrhwnFgJQu","color":"white","normal":[0,0,1],"cx":-0.14015676968720614,"cy":-3.200896293508684,"leftRoofHeight":6,"foundationId":"gszYxD4CuGX1qrhwnFgJQu","rotation":[0,0,-0.41015237421866746],"lx":6.102875967687822,"textureType":"Wall Texture Default","ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightJoints":["1K6LZYJR4J6iMfrED26Yxe"],"leftPoint":[-3.191594753531113,6.530855931908152,1],"relativeAngle":-1.5707963267948972,"id":"8yAv4GumHgHAy2fR9bygQz","selected":false,"lx":9.731752225416834,"type":"Wall","foundationId":"gszYxD4CuGX1qrhwnFgJQu","leftJoints":["irVUAZaEWhGKYr7twduXEh"],"normal":[0,0,1],"parentId":"gszYxD4CuGX1qrhwnFgJQu","lz":6,"locked":false,"rotation":[0,0,-0.41015237421866746],"cy":1.664979819199738,"color":"white","cx":-3.191594753531114,"ly":0.3,"leftRoofHeight":6,"rightPoint":[-3.191594753531113,-3.2008962935086824,1],"roofId":"ngj1wMdEusAUmYWeWEqzyw","cz":0,"rightRoofHeight":6,"textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"locked":false,"selected":false,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","color":"#808080","cx":24.599288579767826,"solarAbsorberPipe":{},"cy":62.32717346646996,"type":"Foundation","solarPowerTower":{},"lx":7.149369527041389,"normal":[0,0,1],"ly":13.668965778073638,"lz":1,"cz":0.5,"solarUpdraftTower":{},"id":"gszYxD4CuGX1qrhwnFgJQu"},{"type":"Roof","ridgeLeftPoint":[0,1],"ly":0,"id":"ngj1wMdEusAUmYWeWEqzyw","locked":false,"foundationId":"gszYxD4CuGX1qrhwnFgJQu","lineColor":"black","selected":false,"lx":0,"thickness":0.2,"rotation":[0,0,0],"wallsId":["gr56ivVG6p8ierekWDUK1u"],"cx":0,"showLabel":false,"lineWidth":0.2,"ridgeRightPoint":[0,1],"color":"#ffffff","textureType":"No Roof Texture","roofType":"Gable","cz":0,"parentId":"gszYxD4CuGX1qrhwnFgJQu","cy":0,"normal":[0,0,1],"lz":0,"rise":0.4407500599176517,"ceiling":false},{"selected":false,"lz":0.1,"color":"#68ccca","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"type":"Foundation","cy":80.9376872016833,"lx":46.93960391347784,"id":"pzqyJ9AXZR9mJxEtKDPKGG","solarUpdraftTower":{},"cx":111.01126755807289,"ly":67.71063906268108,"locked":false,"solarAbsorberPipe":{},"parentId":"Ground","cz":0.05,"solarPowerTower":{}},{"leftJoints":["bmKncuas6bZ1hnGH6qyHKX"],"roofId":"gVgDeNYsXdGDefJV1YRGoa","selected":false,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","locked":false,"cx":-0.14015676968719282,"relativeAngle":-3.1415926535897927,"normal":[0,0,1],"lx":6.102875967687821,"id":"8kwuUQ3tQhRzvqUiLnSjD4","type":"Wall","centerRoofHeight":[0,6.440750059917652],"cz":0,"foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","parentId":"uLUbMGL5dFfRU3Jy3CBsF5","lz":6,"rightPoint":[-3.191594753531113,6.530855931908152,1],"rightJoints":["gDyesAJb6hCZTAKFF2wVoZ"],"color":"white","cy":6.530855931908157,"leftPoint":[2.9112812141567144,6.530855931908155,1],"rightRoofHeight":6,"leftRoofHeight":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"cz":0,"textureType":"Wall Texture Default","selected":false,"type":"Wall","roofId":"gVgDeNYsXdGDefJV1YRGoa","id":"bmKncuas6bZ1hnGH6qyHKX","leftPoint":[2.911281214156714,-3.2008962935086798,1],"rightRoofHeight":6,"relativeAngle":1.5707963267948963,"lz":6,"parentId":"uLUbMGL5dFfRU3Jy3CBsF5","rightJoints":["8kwuUQ3tQhRzvqUiLnSjD4"],"foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","locked":false,"rotation":[0,0,-0.41015237421866746],"rightPoint":[2.9112812141567144,6.530855931908155,1],"leftJoints":["vWXBFGVtdF9Zkw4WgrWQbB"],"normal":[0,0,1],"cx":2.9112812141567126,"cy":1.6649798191997407,"color":"white","leftRoofHeight":6,"ly":0.3,"lx":9.731752225416841,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"rightRoofHeight":6,"leftJoints":["gDyesAJb6hCZTAKFF2wVoZ"],"lx":6.102875967687822,"rightJoints":["bmKncuas6bZ1hnGH6qyHKX"],"locked":false,"parentId":"uLUbMGL5dFfRU3Jy3CBsF5","cz":0,"type":"Wall","centerRoofHeight":[0,6.440750059917652],"relativeAngle":-5.821376180034847e-16,"leftRoofHeight":6,"id":"vWXBFGVtdF9Zkw4WgrWQbB","textureType":"Wall Texture Default","color":"white","lz":6,"cy":-3.200896293508684,"cx":-0.14015676968720614,"selected":false,"leftPoint":[-3.191594753531113,-3.2008962935086824,1],"rotation":[0,0,-0.41015237421866746],"foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","ly":0.3,"normal":[0,0,1],"rightPoint":[2.911281214156714,-3.2008962935086798,1],"roofId":"gVgDeNYsXdGDefJV1YRGoa","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"relativeAngle":-1.5707963267948972,"locked":false,"cy":1.664979819199738,"leftJoints":["8kwuUQ3tQhRzvqUiLnSjD4"],"textureType":"Wall Texture Default","selected":false,"lz":6,"lx":9.731752225416834,"color":"white","type":"Wall","foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","parentId":"uLUbMGL5dFfRU3Jy3CBsF5","rotation":[0,0,-0.41015237421866746],"rightJoints":["vWXBFGVtdF9Zkw4WgrWQbB"],"cz":0,"rightRoofHeight":6,"leftRoofHeight":6,"roofId":"gVgDeNYsXdGDefJV1YRGoa","cx":-3.191594753531114,"id":"gDyesAJb6hCZTAKFF2wVoZ","normal":[0,0,1],"leftPoint":[-3.191594753531113,6.530855931908152,1],"ly":0.3,"rightPoint":[-3.191594753531113,-3.2008962935086824,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"ridgeRightPoint":[0,1],"wallsId":["bmKncuas6bZ1hnGH6qyHKX"],"selected":false,"ridgeLeftPoint":[0,1],"ly":0,"parentId":"uLUbMGL5dFfRU3Jy3CBsF5","normal":[0,0,1],"cz":0,"textureType":"No Roof Texture","foundationId":"uLUbMGL5dFfRU3Jy3CBsF5","color":"#ffffff","cy":0,"cx":0,"lz":0,"thickness":0.2,"rotation":[0,0,0],"id":"gVgDeNYsXdGDefJV1YRGoa","locked":false,"type":"Roof","lx":0,"roofType":"Gable","rise":0.4407500599176517,"ceiling":false},{"lz":1,"lx":7.149369527041389,"color":"#808080","cx":41.18797801355477,"locked":false,"selected":false,"id":"uLUbMGL5dFfRU3Jy3CBsF5","normal":[0,0,1],"ly":13.668965778073638,"parentId":"Ground","solarUpdraftTower":{},"solarPowerTower":{},"type":"Foundation","cz":0.5,"solarAbsorberPipe":{},"rotation":[0,0,-0.41015237421866746],"cy":55.159515522512336},{"selected":false,"normal":[0,0,1],"centerRoofHeight":[-0.5,7],"locked":false,"lz":7,"rotation":[0,0,-0.41015237421866746],"rightJoints":["no8zN9dyqYE4qeuVrW3Heo"],"parentId":"vwL7hNDotVD3LxBD3WrfUq","leftJoints":["nxkAimjB2HNyGqmHN18F5b"],"id":"ra9rKcRfAsQu21a3r6cLBQ","leftPoint":[6.466711798346411,2.6318665263706373,0],"rightPoint":[1.0790317820948425,2.631866526370637,0],"leftRoofHeight":7,"foundationId":"vwL7hNDotVD3LxBD3WrfUq","cy":2.6318665263706373,"cx":3.772871790220627,"rightRoofHeight":7,"textureType":"Wall Texture Default","ly":0.3,"relativeAngle":-3.141592653589793,"lx":5.387680016251569,"color":"white","roofId":"48YD9h2WBNi7Es8vvJXW3G","type":"Wall","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"parentId":"vwL7hNDotVD3LxBD3WrfUq","rotation":[0,0,-0.41015237421866746],"lz":7,"roofId":"48YD9h2WBNi7Es8vvJXW3G","leftJoints":["33Vec12THAd4u8Vna3kAPR"],"rightJoints":["ra9rKcRfAsQu21a3r6cLBQ"],"id":"nxkAimjB2HNyGqmHN18F5b","color":"white","cx":6.466711798346411,"locked":false,"leftRoofHeight":7,"selected":false,"rightPoint":[6.466711798346411,2.6318665263706373,0],"normal":[0,0,1],"relativeAngle":1.5707963267948966,"type":"Wall","lx":5.401219763739984,"cz":0,"leftPoint":[6.466711798346411,-2.769353237369347,0],"cy":-0.06874335549935484,"ly":0.3,"textureType":"Wall Texture Default","foundationId":"vwL7hNDotVD3LxBD3WrfUq","rightRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"relativeAngle":-1.2364019629334816e-15,"lz":7,"ly":0.3,"cz":0,"leftJoints":["no8zN9dyqYE4qeuVrW3Heo"],"rightPoint":[6.466711798346411,-2.769353237369347,0],"cx":3.772871790220624,"cy":-2.7693532373693435,"leftPoint":[1.0790317820948367,-2.7693532373693404,0],"foundationId":"vwL7hNDotVD3LxBD3WrfUq","lx":5.387680016251575,"color":"white","locked":false,"leftRoofHeight":7,"type":"Wall","rightJoints":["nxkAimjB2HNyGqmHN18F5b"],"parentId":"vwL7hNDotVD3LxBD3WrfUq","textureType":"Wall Texture Default","selected":false,"roofId":"48YD9h2WBNi7Es8vvJXW3G","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"rightRoofHeight":7,"id":"33Vec12THAd4u8Vna3kAPR","centerRoofHeight":[0.5,7],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"lx":5.401219763739977,"rotation":[0,0,-0.41015237421866746],"cz":2.7786330947701083,"color":"white","normal":[0,0,1],"roofId":"48YD9h2WBNi7Es8vvJXW3G","rightPoint":[1.0790317820948367,-2.7693532373693404,0],"cy":-0.06874335549935173,"leftPoint":[1.0790317820948425,2.631866526370637,0],"id":"no8zN9dyqYE4qeuVrW3Heo","lz":7,"relativeAngle":-1.570796326794898,"textureType":"Wall Texture Default","selected":false,"rightRoofHeight":7,"leftRoofHeight":7,"locked":false,"foundationId":"vwL7hNDotVD3LxBD3WrfUq","ly":0.3,"rightJoints":["33Vec12THAd4u8Vna3kAPR"],"parentId":"vwL7hNDotVD3LxBD3WrfUq","type":"Wall","leftJoints":["ra9rKcRfAsQu21a3r6cLBQ"],"cx":1.0790317820948396,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"cy":84.30176551679384,"type":"Foundation","rotation":[0,0,-0.41015237421866746],"solarUpdraftTower":{},"parentId":"Ground","ly":5.568881804752381,"cz":0.5,"cx":19.50958427736446,"locked":false,"lx":13.89007394070906,"normal":[0,0,1],"id":"vwL7hNDotVD3LxBD3WrfUq","lz":1,"color":"#808080"},{"leftPoint":[-0.7148597809579893,2.6859428300134063,1],"rightJoints":["fc3SxNnr1T2obwWNDrRWPq"],"selected":false,"parentId":"4UZo2BLYXGN9cd3hbyQ45x","leftJoints":["fHApw3eZ3j52e3Ze4hhzaH"],"color":"white","lx":5.387680016251569,"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"ly":0.3,"rightRoofHeight":7,"cz":0,"lz":7,"roofId":"8gnJuvioHBpuV9PnGGyNAB","id":"94d3RXBRBLR2SMUq5fQJtk","cy":2.685942830013403,"rightPoint":[-6.102539797209565,2.6859428300134014,1],"foundationId":"4UZo2BLYXGN9cd3hbyQ45x","relativeAngle":-3.141592653589793,"cx":-3.4086997890837694,"type":"Wall","centerRoofHeight":[0.5,7],"leftRoofHeight":7,"textureType":"Wall Texture Default","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"id":"fHApw3eZ3j52e3Ze4hhzaH","lx":5.401219763739984,"ly":0.3,"locked":false,"rotation":[0,0,-0.41015237421866746],"cz":0,"selected":false,"leftPoint":[-0.7148597809579927,-2.7152769337265767,1],"lz":7,"relativeAngle":1.5707963267948966,"rightRoofHeight":7,"leftRoofHeight":7,"leftJoints":["qCUxDe7bDY8tYgH1joCgeh"],"textureType":"Wall Texture Default","foundationId":"4UZo2BLYXGN9cd3hbyQ45x","cx":-0.7148597809579962,"rightJoints":["94d3RXBRBLR2SMUq5fQJtk"],"parentId":"4UZo2BLYXGN9cd3hbyQ45x","rightPoint":[-0.7148597809579893,2.6859428300134063,1],"cy":-0.014667051856591229,"normal":[0,0,1],"type":"Wall","roofId":"8gnJuvioHBpuV9PnGGyNAB","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"id":"qCUxDe7bDY8tYgH1joCgeh","relativeAngle":-1.2364019629334816e-15,"textureType":"Wall Texture Default","rightPoint":[-0.7148597809579927,-2.7152769337265767,1],"lx":5.387680016251575,"cz":0,"color":"white","rotation":[0,0,-0.41015237421866746],"leftPoint":[-6.102539797209571,-2.7152769337265754,1],"parentId":"4UZo2BLYXGN9cd3hbyQ45x","foundationId":"4UZo2BLYXGN9cd3hbyQ45x","rightJoints":["fHApw3eZ3j52e3Ze4hhzaH"],"leftRoofHeight":7,"roofId":"8gnJuvioHBpuV9PnGGyNAB","normal":[0,0,1],"cx":-3.4086997890837756,"rightRoofHeight":7,"cy":-2.715276933726573,"leftJoints":["fc3SxNnr1T2obwWNDrRWPq"],"type":"Wall","selected":false,"ly":0.3,"locked":false,"lz":7,"centerRoofHeight":[-0.5,7],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cy":-0.014667051856584123,"id":"fc3SxNnr1T2obwWNDrRWPq","roofId":"8gnJuvioHBpuV9PnGGyNAB","ly":0.3,"foundationId":"4UZo2BLYXGN9cd3hbyQ45x","leftRoofHeight":7,"selected":false,"rightRoofHeight":7,"rightJoints":["qCUxDe7bDY8tYgH1joCgeh"],"color":"white","cx":-6.102539797209562,"parentId":"4UZo2BLYXGN9cd3hbyQ45x","textureType":"Wall Texture Default","leftPoint":[-6.102539797209565,2.6859428300134014,1],"lz":7,"rotation":[0,0,-0.41015237421866746],"locked":false,"rightPoint":[-6.102539797209571,-2.7152769337265754,1],"lx":5.401219763739977,"normal":[0,0,1],"cz":0,"type":"Wall","relativeAngle":-1.570796326794898,"leftJoints":["94d3RXBRBLR2SMUq5fQJtk"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"id":"4UZo2BLYXGN9cd3hbyQ45x","cz":0.5,"solarUpdraftTower":{},"cx":60.22394051332042,"ly":5.482519143209589,"normal":[0,0,1],"color":"#808080","parentId":"Ground","lz":1,"type":"Foundation","solarPowerTower":{},"solarAbsorberPipe":{},"cy":66.89544628344375,"rotation":[0,0,-0.41015237421866746],"locked":false,"selected":false,"lx":12.981345567934609},{"ridgeRightPoint":[0.5,1],"ly":0,"wallsId":["no8zN9dyqYE4qeuVrW3Heo"],"lz":0,"cz":0,"thickness":0.2,"color":"#ffffff","showLabel":false,"lineWidth":0.2,"selected":false,"textureType":"No Roof Texture","foundationId":"vwL7hNDotVD3LxBD3WrfUq","rotation":[0,0,0],"id":"48YD9h2WBNi7Es8vvJXW3G","lineColor":"black","type":"Roof","parentId":"vwL7hNDotVD3LxBD3WrfUq","cx":0,"locked":false,"cy":0,"roofType":"Gable","lx":0,"normal":[0,0,1],"ridgeLeftPoint":[-0.5,1],"rise":0,"ceiling":false},{"cz":0,"lineWidth":0.2,"color":"#ffffff","foundationId":"tafet8SHZ3Nd8kXyfeZ9FR","parentId":"tafet8SHZ3Nd8kXyfeZ9FR","normal":[0,0,1],"id":"52yUcWyJUbmGw2PC5d5KiK","wallsId":["k13k8dUZo1jLk9Pubbz3Yu","qEu4R9jBDYekHJdsyGPkHu","7zFHG6rEsyAEeiBjZ3Fqiv","sfm78zxYm2PZeqMiLJ7sRS"],"lx":0,"locked":false,"selected":false,"showLabel":false,"cy":0,"ly":0,"textureType":"No Roof Texture","type":"Roof","rotation":[0,0,0],"cx":0,"lineColor":"black","lz":0,"thickness":0.2,"roofType":"Pyramid","rise":1.0848601282561745,"ceiling":false},{"type":"Roof","wallsId":["vha1dDK5ppjp6f9bgr45uq"],"ridgeRightPoint":[0,1],"color":"#ffffff","rotation":[0,0,0],"lineColor":"black","ridgeLeftPoint":[0,1],"cz":0,"cx":0,"normal":[0,0,1],"selected":false,"roofType":"Gable","lz":0,"thickness":0.2,"lineWidth":0.2,"ly":0,"id":"wrKEiNvyDQopU6C5MqvRMM","locked":false,"foundationId":"98vBSiAe7BeqTZRNu482vh","textureType":"No Roof Texture","lx":0,"parentId":"98vBSiAe7BeqTZRNu482vh","cy":0,"showLabel":false,"rise":2,"ceiling":false},{"cy":0,"selected":false,"type":"Roof","leftRidgeLength":15.875000000000002,"lx":0,"cx":0,"locked":false,"id":"adpYUuHEY6XwTLGq9piRR2","normal":[0,0,1],"wallsId":["cqVaqhkF9cafDk3CujuxhA"],"cz":0,"parentId":"aXWETyunkqtQVNXGWr9VZd","showLabel":false,"rightRidgeLength":15.875000000000002,"color":"#ffffff","rotation":[0,0,0],"textureType":"No Roof Texture","foundationId":"aXWETyunkqtQVNXGWr9VZd","roofType":"Hip","lineWidth":0.2,"ly":0,"lineColor":"black","thickness":0.2,"lz":0,"rise":2.5,"ceiling":false},{"cx":40.42324164440271,"lx":46.50473526306251,"type":"Foundation","id":"gg3wfWZaPNSy6E85uMZYRf","solarAbsorberPipe":{},"ly":57.10448987141375,"color":"#68ccca","cy":-138.0841490094463,"solarPowerTower":{},"cz":0.05,"locked":false,"selected":false,"lz":0.1,"parentId":"Ground","solarUpdraftTower":{},"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746]},{"solarAbsorberPipe":{},"ly":57.28147044148081,"parentId":"Ground","color":"#68ccca","cx":-134.9224921942922,"cz":0.05,"locked":false,"rotation":[0,0,-0.41015237421866746],"lz":0.1,"cy":-67.94969279046406,"normal":[0,0,1],"solarUpdraftTower":{},"type":"Foundation","solarPowerTower":{},"lx":59.55306513135086,"selected":false,"id":"a6rvHmP4DDMyxBjdX22svj"},{"id":"aNDJu4drMr2fEx1r8tHjj6","cy":18.299607948404756,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"color":"gray","parentId":"Ground","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":3.834587966975077,"rotation":[0,0,-0.41015237421866746],"lx":7.294777414475799,"cx":-55.05079468229798,"selected":false,"locked":false,"cz":6,"lz":12,"type":"Cuboid"},{"lx":7.294777414475799,"ly":3.834587966975077,"lz":12,"cx":-33.5448212615926,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"cy":8.863867840093441,"type":"Cuboid","selected":false,"color":"gray","id":"qPJRFLTr5yqpFjK2r5qNtK","locked":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","cz":6},{"lx":7.294777414475799,"parentId":"Ground","selected":false,"cx":-26.791783116976674,"color":"gray","cz":6,"faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,-0.41015237421866746],"locked":false,"id":"foA7zzY5fzm5ppKLNPgcZM","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","ly":3.834587966975077,"normal":[0,0,1],"cy":5.910492232229722,"lz":12},{"selected":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-50.198042271889335,"parentId":"Ground","ly":1.4387765101632088,"cy":16.15769091498796,"color":"gray","normal":[0,0,1],"locked":false,"lz":12,"type":"Cuboid","lx":3.0374945193791563,"cz":6,"rotation":[0,0,-0.41015237421866746],"id":"jcVSu4BB2otpgDQ9Uss6dk"},{"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"id":"dvQtFmgsNmd5tYGN78K2eR","type":"Cuboid","lx":3.0374945193791563,"cx":-38.46497607487548,"lz":12,"selected":false,"locked":false,"parentId":"Ground","color":"gray","cy":11.032940387603501,"rotation":[0,0,-0.41015237421866746],"cz":6,"ly":1.4387765101632088},{"locked":false,"selected":false,"id":"qHYYLt5NNn8YrtX4BAqtZt","cz":6,"cx":-21.68767431477416,"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":12,"lx":3.0374945193791563,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":1.4387765101632088,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","type":"Cuboid","normal":[0,0,1],"cy":3.88590550753401,"color":"gray"},{"id":"t1b6qVRBDTKtM9evc3a38G","rotation":[0,0,-0.41015237421866746],"cy":22.859143113805672,"cz":4,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"parentId":"Ground","lz":8,"type":"Cuboid","ly":4.854618540394783,"color":"gray","lx":3.504189768701392,"cx":-62.133323117727784,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false,"selected":false},{"type":"Cuboid","cz":5,"parentId":"Ground","ly":3.834587966975077,"cx":-1.671845448850263,"rotation":[0,0,-0.41015237421866746],"cy":36.05441660008029,"lx":7.294777414475799,"color":"gray","lz":10,"selected":false,"id":"ewVvbjdsVwbRqgEtvCq5hs","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"locked":false,"normal":[0,0,1]},{"ly":0.3,"leftJoints":["nM3F4oVEiNnPXXKHuymBW8"],"leftRoofHeight":5,"textureType":"Wall Texture Default","cx":1.4377006720631131,"cz":0,"color":"white","rightJoints":["pVB4qAvwgYktWUYmnpXrvd"],"locked":false,"id":"fVkwHoLMqjGDdZWbofbtKG","foundationId":"51jEtCS88nBPdVJc1fit8Y","roofId":"79Z3Q6kmRSdUu2gZAfxqYU","leftPoint":[16.8234405859108,5.91199411832761,0],"relativeAngle":-3.141592653589793,"lz":5,"normal":[0,0,1],"selected":false,"cy":5.911994118327609,"rightRoofHeight":5,"type":"Wall","lx":30.771479827695373,"rightPoint":[-13.948039241784572,5.911994118327607,0],"parentId":"51jEtCS88nBPdVJc1fit8Y","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"locked":false,"rightJoints":["fVkwHoLMqjGDdZWbofbtKG"],"cz":0,"leftPoint":[16.823440585910813,-5.705218022759548,0],"rightPoint":[16.8234405859108,5.91199411832761,0],"selected":false,"color":"white","cx":16.823440585910806,"lx":11.617212141087158,"leftRoofHeight":5,"normal":[0,0,1],"id":"nM3F4oVEiNnPXXKHuymBW8","textureType":"Wall Texture Default","foundationId":"51jEtCS88nBPdVJc1fit8Y","parentId":"51jEtCS88nBPdVJc1fit8Y","rightRoofHeight":5,"rotation":[0,0,-0.41015237421866746],"type":"Wall","lz":5,"roofId":"79Z3Q6kmRSdUu2gZAfxqYU","ly":0.3,"cy":0.10338804778403077,"leftJoints":["hjhpbBLzTxiFBJngNEFjyo"],"relativeAngle":1.570796326794898,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"leftPoint":[-13.94803924178457,-5.705218022759548,0],"selected":false,"normal":[0,0,1],"type":"Wall","leftRoofHeight":5,"roofId":"79Z3Q6kmRSdUu2gZAfxqYU","foundationId":"51jEtCS88nBPdVJc1fit8Y","cy":-5.705218022759548,"locked":false,"rightPoint":[16.823440585910813,-5.705218022759548,0],"rightRoofHeight":5,"ly":0.3,"rotation":[0,0,-0.41015237421866746],"cz":0,"cx":1.4377006720631211,"rightJoints":["nM3F4oVEiNnPXXKHuymBW8"],"textureType":"Wall Texture Default","lx":30.771479827695384,"color":"white","relativeAngle":0,"lz":5,"leftJoints":["pVB4qAvwgYktWUYmnpXrvd"],"id":"hjhpbBLzTxiFBJngNEFjyo","parentId":"51jEtCS88nBPdVJc1fit8Y","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"locked":false,"cx":-13.94803924178457,"rightJoints":["hjhpbBLzTxiFBJngNEFjyo"],"lx":11.617212141087155,"rightPoint":[-13.94803924178457,-5.705218022759548,0],"leftRoofHeight":5,"id":"pVB4qAvwgYktWUYmnpXrvd","roofId":"79Z3Q6kmRSdUu2gZAfxqYU","cy":0.10338804778402944,"type":"Wall","selected":false,"rightRoofHeight":5,"leftPoint":[-13.948039241784572,5.911994118327607,0],"relativeAngle":-1.5707963267948966,"color":"white","foundationId":"51jEtCS88nBPdVJc1fit8Y","normal":[0,0,1],"leftJoints":["fVkwHoLMqjGDdZWbofbtKG"],"textureType":"Wall Texture Default","lz":5,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"parentId":"51jEtCS88nBPdVJc1fit8Y","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5,"rightTopPartialHeight":5},{"cz":0.5,"locked":false,"id":"51jEtCS88nBPdVJc1fit8Y","cx":-48.38996233223847,"rotation":[0,0,-0.41015237421866746],"cy":-47.44094494420046,"type":"Foundation","solarUpdraftTower":{},"solarAbsorberPipe":{},"color":"#808080","ly":12.435067202411405,"parentId":"Ground","selected":false,"lx":39.55613553448626,"solarPowerTower":{},"lz":1,"normal":[0,0,1]},{"relativeAngle":1.5696801656994488,"lx":11.718328338430736,"lz":12,"color":"white","id":"axApxDk7fg6kdu31qZJjpa","leftRoofHeight":12,"selected":false,"locked":false,"rightPoint":[15.013079539479257,-11.281678961006579,0],"textureType":"Wall Texture Default","rightRoofHeight":12,"showLabel":false,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","cy":-17.14083948050329,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","roofId":"8jjNTNMVuPtviaQ4z8aUBg","type":"Wall","leftPoint":[15,-23,0],"rotation":[0,0,0],"ly":0.3,"lineWidth":0.2,"normal":[0,0,1],"cx":15.006539769739629,"cz":0,"rightJoints":[],"leftJoints":["qPSY4fD3E14vaHrFvAVhoM"],"lineColor":"black","windows":[],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"showLabel":false,"rotation":[0,0,0],"lineWidth":0.2,"relativeAngle":0,"type":"Wall","normal":[0,0,1],"cx":0.75,"lz":12,"lineColor":"black","rightRoofHeight":12,"lx":28.5,"leftPoint":[-13.5,-23,0],"windows":[],"leftJoints":["qfMw91HFwbo5hsC2LrExL9"],"locked":false,"roofId":"8jjNTNMVuPtviaQ4z8aUBg","id":"qPSY4fD3E14vaHrFvAVhoM","cz":0,"leftRoofHeight":12,"ly":0.3,"rightJoints":["axApxDk7fg6kdu31qZJjpa"],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","textureType":"Wall Texture Default","color":"white","rightPoint":[15,-22.999999999999993,0],"cy":-22.999999999999996,"selected":false,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"type":"Wall","leftRoofHeight":12,"leftJoints":[],"parentId":"9VLFJ7oUEizHpLYBMkGrSR","normal":[0,0,1],"roofId":"8jjNTNMVuPtviaQ4z8aUBg","windows":[],"lineColor":"black","locked":false,"showLabel":false,"rotation":[0,0,0],"leftPoint":[-13.486920460520745,-20.781678961006566,0],"cx":-13.493460230260371,"cy":-21.89083948050328,"rightRoofHeight":12,"lz":12,"rightPoint":[-13.5,-23,0],"rightJoints":["qPSY4fD3E14vaHrFvAVhoM"],"selected":false,"lx":2.2183595980800535,"color":"white","id":"qfMw91HFwbo5hsC2LrExL9","lineWidth":0.2,"relativeAngle":4.706492905071611,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","ly":0.3,"textureType":"Wall Texture Default","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":12,"rightTopPartialHeight":12},{"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","type":"Cuboid","rotation":[0,0,-0.41015237421866746],"lz":15,"locked":false,"color":"gray","selected":false,"cx":-36.56959623779416,"cz":7.5,"id":"tweiiVLhdx6oBWEnEtnipE","faceColors":["gray","gray","gray","gray","gray","gray"],"ly":3.089724753674105,"cy":-41.66817975093342,"lx":9.664636900370548},{"selected":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"rotation":[0,0,-0.41015237421866746],"lx":5.865449300431789,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"type":"Cuboid","parentId":"Ground","id":"rsUvVCPdmqPJntvXeM2GVb","cx":-44.38865117345025,"locked":false,"cz":7.5,"ly":1.5650109734892819,"lz":15,"color":"gray","cy":-40.96079721670519},{"lx":3.0249690735409964,"cx":-28.99251915905568,"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"type":"Cuboid","cz":7.5,"color":"gray","locked":false,"lz":15,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"selected":false,"ly":2.6391120002649107,"id":"fkBTP56VVn81KwB625hk51","cy":-31.500761697700995,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1]},{"color":"gray","type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"ly":1.012024715192918,"parentId":"Ground","selected":false,"cx":-55.01870252082621,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"id":"sd5KLhyrNizECe9gb6KsQr","lz":15,"lx":1.0626113345203119,"cz":7.5,"locked":false,"rotation":[0,0,-0.41015237421866746],"cy":-33.468482869791565},{"type":"Cuboid","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"locked":false,"cx":-31.1067471882413,"lx":1.4142777966890399,"parentId":"Ground","selected":false,"id":"uMjoRxmZFJiEozXunGCtEk","cz":7.5,"cy":-28.926011393490615,"faceColors":["gray","gray","gray","gray","gray","gray"],"lz":15,"color":"gray","rotation":[0,0,-0.41015237421866746],"ly":1.5089496296253628},{"cz":7.5,"color":"gray","lz":15,"lx":1.4142777966890399,"cy":-19.94113390915151,"type":"Cuboid","selected":false,"id":"vnrmWArXJmER4412akTEze","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"ly":1.5089496296253628,"cx":-27.239009141660663,"locked":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"parentId":"Ground","rotation":[0,0,-0.41015237421866746]},{"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"cx":-26.10325222179982,"cz":7.5,"ly":2.6391120002649107,"cy":-24.7401297358751,"selected":false,"locked":false,"lz":15,"lx":3.0249690735409964,"faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"type":"Cuboid","color":"gray","id":"sgZFM1eyn2EqyhNUVokoxt"},{"cy":-45.1003153467037,"lz":15,"ly":1.012024715192918,"normal":[0,0,1],"cx":-34.012367343427655,"parentId":"Ground","cz":7.5,"type":"Cuboid","lx":1.0626113345203119,"selected":false,"locked":false,"rotation":[0,0,-0.41015237421866746],"id":"t9SieBbjr7gB8ZfmMfPkkv","color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"cz":6,"type":"Cuboid","normal":[0,0,1],"cy":2.6351006761143005,"locked":false,"parentId":"Ground","cx":-57.48268699848795,"lx":1.921551368829732,"faceColors":["gray","gray","gray","gray","gray","gray"],"ly":1.170092177740421,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":12,"id":"f6gjMamZeJ9AforAMb7sba","selected":false,"color":"gray","rotation":[0,0,-0.41015237421866746]},{"normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"cz":6,"ly":1.170092177740421,"cx":-46.79299933184681,"type":"Cuboid","parentId":"Ground","cy":32.079219880108276,"color":"gray","lx":1.921551368829732,"lz":12,"selected":false,"locked":false,"faceColors":["gray","gray","gray","gray","gray","gray"],"id":"uZN8yxuazrtq9vtfvNYjW8","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"]},{"selected":false,"id":"kCUndw17uk69evYZvDbpA3","locked":false,"lx":3.8078632615679346,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cy":17.85994953380947,"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"ly":1.8431797229103413,"faceColors":["gray","gray","gray","gray","gray","gray"],"type":"Cuboid","normal":[0,0,1],"lz":12,"color":"gray","cx":-15.533010162096012,"cz":6},{"selected":false,"cz":6,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","cy":23.773736942115185,"ly":1.8431797229103413,"color":"gray","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false,"lx":3.8078632615679346,"id":"c5CHPFsUadwXiYeCQ5kL3M","type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"normal":[0,0,1],"lz":12,"cx":-29.102366745520293},{"faceColors":["gray","gray","gray","gray","gray","gray"],"type":"Cuboid","selected":false,"cy":19.328580088899457,"ly":1.5089496296253628,"cz":5,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"locked":false,"cx":-6.919453557487373,"normal":[0,0,1],"color":"gray","parentId":"Ground","id":"qMykCJZ7DBxwNpVWKYScqJ","lz":10,"rotation":[0,0,-0.41015237421866746],"lx":1.4142777966890399},{"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"cy":22.10130410795824,"selected":false,"parentId":"Ground","type":"Cuboid","ly":1.5089496296253628,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"lz":10,"rotation":[0,0,-0.41015237421866746],"id":"mSqbavJzutA9zhAu8xE3xS","normal":[0,0,1],"cz":5,"lx":1.4142777966890399,"locked":false,"cx":-5.974746211405201},{"lx":1.4142777966890399,"id":"pyDFzHD4KAB1BNqMnzD6wS","type":"Cuboid","lz":10,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":1.5089496296253628,"cz":5,"cy":46.28392644240339,"color":"gray","selected":false,"locked":false,"cx":-22.974716021978587,"faceColors":["gray","gray","gray","gray","gray","gray"],"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","normal":[0,0,1]},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"color":"gray","normal":[0,0,1],"lz":10,"id":"3niC4znTpJLi9xPdZ3J3mi","locked":false,"ly":1.5089496296253628,"type":"Cuboid","faceColors":["gray","gray","gray","gray","gray","gray"],"cx":-19.844681452337475,"cz":5,"lx":1.4142777966890399,"cy":44.91410182205283,"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"selected":false},{"id":"kmb6FinDNPjHaUSx4hWkRY","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"parentId":"Ground","rotation":[0,0,-0.41015237421866746],"cz":6,"lx":2.409551412544647,"cx":0.8488303977586087,"ly":2.2160601102189608,"cy":59.792631721777234,"selected":false,"type":"Cuboid","lz":12,"color":"gray","locked":false},{"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"faceColors":["gray","gray","gray","gray","gray","gray"],"cy":64.33483423541351,"normal":[0,0,1],"lx":2.815013454740496,"selected":false,"parentId":"Ground","id":"jdUgLxxS7aoo8G5FKM1bpd","color":"gray","locked":false,"lz":12,"cx":-10.431764953695687,"type":"Cuboid","rotation":[0,0,-0.41015237421866746],"cz":6,"ly":3.1077135053990776},{"cx":-28.610884157233254,"cy":60.58459939907478,"color":"gray","selected":false,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cz":4,"id":"mQbRKyuR5iBvfSyrTNXPkk","type":"Cuboid","locked":false,"normal":[0,0,1],"lx":2.5003437899627516,"parentId":"Ground","lz":8,"ly":6.3419454417230305,"rotation":[0,0,-0.41015237421866746],"faceColors":["gray","gray","gray","gray","gray","gray"]},{"lz":8,"rotation":[0,0,-0.41015237421866746],"id":"bK5YCpcen6fCBKp3RRNqEh","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"parentId":"Ground","selected":false,"color":"gray","cy":68.11631889207206,"faceColors":["gray","gray","gray","gray","gray","gray"],"locked":false,"lx":1.9416600589072726,"ly":1.989767039492348,"type":"Cuboid","cx":-36.29885094967864,"cz":4,"normal":[0,0,1]},{"normal":[0,0,1],"parentId":"Ground","faceColors":["gray","gray","gray","gray","gray","gray"],"lz":8,"type":"Cuboid","ly":1.989767039492348,"rotation":[0,0,-0.41015237421866746],"cx":-38.338758743868084,"selected":false,"color":"gray","textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cz":4,"cy":63.07951549965926,"locked":false,"lx":1.9416600589072726,"id":"jmsNe53MLv3GKAG45iZZhS"},{"locked":false,"showLabel":false,"thickness":0.2,"type":"Roof","normal":[0,0,1],"color":"#ffffff","cz":0,"parentId":"pdEGhJFD3W3BmcX1EPbyWH","roofType":"Pyramid","lz":0,"lx":0,"selected":false,"id":"u17BQ8h2PCTPBYHjaSoxnN","lineWidth":0.2,"cx":0,"lineColor":"black","foundationId":"pdEGhJFD3W3BmcX1EPbyWH","wallsId":["9QvBYUfBnBzYQEjDjyYwwJ","3Yax97DpPm9sAXkyokJjCv","2zTB9zP2crzAGhXAKtKuuQ","e9GuUTJEvD6Q7osTyxTwrk"],"cy":0,"textureType":"No Roof Texture","ly":0,"rotation":[0,0,0],"rise":0,"ceiling":false},{"lz":0,"lineWidth":0.2,"color":"#ffffff","selected":false,"rotation":[0,0,0],"cy":0,"cz":0,"type":"Roof","textureType":"No Roof Texture","foundationId":"gEHbpQXkCu9RtbMyy3Xryz","parentId":"gEHbpQXkCu9RtbMyy3Xryz","roofType":"Pyramid","showLabel":false,"lx":0,"id":"8JTXb2hRmgAaiTxMs35gh1","ly":0,"normal":[0,0,1],"thickness":0.2,"locked":false,"wallsId":["e5up5WS9fCbKNmdUhKFsh6","ncaNE7qPYcxTMDrSjrKjqC","4z9pAxyVBGgvcBfL2oBkTg","9Zt1Jh2MmnkaBKaBtYD19E","vmWMc4Nmqnx9AxgePRvtFK","jmovDX25miN2VZhEhqh9uy","wxDvuiUvYK71aR1xZ9r86C","pk5HH5mW7Fkgf2nUSMZyW9"],"lineColor":"black","cx":0,"rise":0,"ceiling":false},{"lz":0,"showLabel":false,"parentId":"5Ccs4YQJG3fyuyHdGw79zD","id":"iLELU7fMnA7QkYUmgQBEWM","lineWidth":0.2,"textureType":"No Roof Texture","locked":false,"cy":0,"selected":false,"type":"Roof","lineColor":"black","cx":0,"normal":[0,0,1],"roofType":"Pyramid","rotation":[0,0,0],"thickness":0.2,"color":"#ffffff","ly":0,"wallsId":["2TSEdoLpnDva8vLd5CzUbS","o6KGNbWFg87od5BX9EpsTo","9NzKjLTF3oM85YSQpL4gnd","qVHFnW8AAY4XUoieeiErxH","uSo7fsB5ruR2pmb3hS5LJZ","4HqBTHcSgWW5QKhSZyPhns","susL6EqdzG6nqxMNGZaDXi","g6f1sfDxicEvG7uLqaixdo"],"cz":0,"foundationId":"5Ccs4YQJG3fyuyHdGw79zD","lx":0,"rise":0,"ceiling":false},{"normal":[0,0,1],"textureType":"No Roof Texture","selected":false,"thickness":0.2,"foundationId":"wBnvyTf1aAJoT1h5Lem3nN","showLabel":false,"lineColor":"black","color":"#ffffff","wallsId":["cEMfGqLjg1Ef23MmrZJMBi","oiFAJnXcnAH7zdnComwnZ7","wQJum4dZFQ5ppcaqoirdh1","bQ2Kx7puBgpzyzLtLqMSws"],"locked":false,"type":"Roof","lineWidth":0.2,"lz":0,"roofType":"Pyramid","cy":0,"cz":0,"parentId":"wBnvyTf1aAJoT1h5Lem3nN","lx":0,"cx":0,"rotation":[0,0,0],"ly":0,"id":"1qyyipEsGS2s5T9XgP6Hmh","rise":0,"ceiling":false},{"color":"#ffffff","roofType":"Pyramid","foundationId":"bEJsUFdHaD6DHGcx6x8yR6","wallsId":["arZ3wqpChkyUrckbL7omCG","xrxYGVSxLCof2hSDyYDBhi","3VxH8hmRUhtWZN2xHFt4SG","wv4UgZqFkoaJSym14cGEUi"],"id":"gTmk5BL11HKrSyJkFQtskK","cy":0,"locked":false,"cz":0,"thickness":0.2,"parentId":"bEJsUFdHaD6DHGcx6x8yR6","lineColor":"black","lineWidth":0.2,"normal":[0,0,1],"rotation":[0,0,0],"lz":0,"showLabel":false,"selected":false,"ly":0,"textureType":"No Roof Texture","type":"Roof","lx":0,"cx":0,"rise":0,"ceiling":false},{"locked":false,"wallsId":["hjhpbBLzTxiFBJngNEFjyo","nM3F4oVEiNnPXXKHuymBW8","fVkwHoLMqjGDdZWbofbtKG","pVB4qAvwgYktWUYmnpXrvd"],"showLabel":false,"roofType":"Pyramid","parentId":"51jEtCS88nBPdVJc1fit8Y","textureType":"No Roof Texture","foundationId":"51jEtCS88nBPdVJc1fit8Y","color":"#ffffff","type":"Roof","ly":0,"cy":0,"lineColor":"black","lz":0,"thickness":0.2,"lx":0,"cx":0,"rotation":[0,0,0],"normal":[0,0,1],"cz":0,"selected":false,"id":"79Z3Q6kmRSdUu2gZAfxqYU","lineWidth":0.2,"rise":0,"ceiling":false},{"roofType":"Pyramid","lineColor":"black","wallsId":["mJUeyE2zphErZr6GzDs3tZ","j1cSjqWhsVxayuMSQv24u3","svVfgRXxxLmkheyww2W4ad","feUXDC3dk8QN3nPhgvxRs7","8SK72dWsX2KdwBhjqAJrHR","eAv1PVUtpNQ3MSDZw48MQs","1RLyYLqhL7EB8W88F1YjMf"],"id":"g8pgyA4zcrzdfdvNphwHQy","lx":0,"cz":0,"textureType":"No Roof Texture","showLabel":false,"rotation":[0,0,0],"cy":0,"cx":0,"locked":false,"type":"Roof","thickness":0.2,"ly":0,"foundationId":"9VLFJ7oUEizHpLYBMkGrSR","normal":[0,0,1],"selected":false,"lineWidth":0.2,"color":"#ffffff","lz":0,"parentId":"9VLFJ7oUEizHpLYBMkGrSR","rise":0,"ceiling":false},{"roofType":"Pyramid","selected":false,"locked":false,"textureType":"No Roof Texture","parentId":"9VLFJ7oUEizHpLYBMkGrSR","rotation":[0,0,0],"color":"#ffffff","type":"Roof","foundationId":"9VLFJ7oUEizHpLYBMkGrSR","lineColor":"black","lz":0,"normal":[0,0,1],"cz":0,"cy":0,"ly":0,"showLabel":false,"id":"8jjNTNMVuPtviaQ4z8aUBg","wallsId":["qfMw91HFwbo5hsC2LrExL9","qPSY4fD3E14vaHrFvAVhoM","axApxDk7fg6kdu31qZJjpa"],"thickness":0.2,"lx":0,"cx":0,"lineWidth":0.2,"rise":0,"ceiling":false},{"lx":0,"rotation":[0,0,0],"parentId":"m4iUcU4yAYwkvkodEmkEet","lineColor":"black","selected":false,"thickness":0.2,"textureType":"No Roof Texture","cz":0,"color":"#ffffff","ly":0,"id":"iCAiZhiTVrLLqoQWH1g8xu","cy":0,"showLabel":false,"cx":0,"lineWidth":0.2,"foundationId":"m4iUcU4yAYwkvkodEmkEet","roofType":"Pyramid","normal":[0,0,1],"wallsId":["dqGGsMEnQRvAtVj8JUXBJ1","fE5GSES3t1e72zkQ5eaMtN","annVBiZ5xysQxyv34DuQgv","1k4PTfybuAQ33E2nttLT4d"],"lz":0,"locked":false,"type":"Roof","rise":0,"ceiling":false},{"cx":3.772871790220627,"centerRoofHeight":[-0.5,7],"ly":0.3,"rightJoints":["mr118MYyqYHattPXCpoynG"],"relativeAngle":-3.141592653589793,"foundationId":"eP5t9YkC32dmeRk87x14Ko","rightPoint":[1.0790317820948425,2.631866526370637,0],"cz":0,"lx":5.387680016251569,"normal":[0,0,1],"type":"Wall","rotation":[0,0,-0.41015237421866746],"leftPoint":[6.466711798346411,2.6318665263706373,0],"locked":false,"lz":7,"selected":false,"leftRoofHeight":7,"color":"white","parentId":"eP5t9YkC32dmeRk87x14Ko","id":"xhZR7k2DmmA9LNkxhevkLf","rightRoofHeight":7,"textureType":"Wall Texture Default","roofId":"iM8xLCCHLJSTRMvV2ytbGw","cy":2.6318665263706373,"leftJoints":["hKD2n49XvVQhMiQhxLTwnG"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"textureType":"Wall Texture Default","roofId":"iM8xLCCHLJSTRMvV2ytbGw","color":"white","rightRoofHeight":7,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"leftRoofHeight":7,"selected":false,"cy":-0.06874335549935484,"parentId":"eP5t9YkC32dmeRk87x14Ko","leftPoint":[6.466711798346411,-2.769353237369347,0],"cx":6.466711798346411,"rightJoints":["xhZR7k2DmmA9LNkxhevkLf"],"rightPoint":[6.466711798346411,2.6318665263706373,0],"type":"Wall","lx":5.401219763739984,"locked":false,"lz":7,"relativeAngle":1.5707963267948966,"id":"hKD2n49XvVQhMiQhxLTwnG","foundationId":"eP5t9YkC32dmeRk87x14Ko","leftJoints":["tY9ds8odUyLmWNVGbRfRZS"],"ly":0.3,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"foundationId":"eP5t9YkC32dmeRk87x14Ko","leftRoofHeight":7,"textureType":"Wall Texture Default","lx":5.387680016251575,"leftPoint":[1.0790317820948367,-2.7693532373693404,0],"color":"white","parentId":"eP5t9YkC32dmeRk87x14Ko","centerRoofHeight":[0.5,7],"roofId":"iM8xLCCHLJSTRMvV2ytbGw","ly":0.3,"rightRoofHeight":7,"selected":false,"locked":false,"rightJoints":["hKD2n49XvVQhMiQhxLTwnG"],"cy":-2.7693532373693435,"rightPoint":[6.466711798346411,-2.769353237369347,0],"lz":7,"type":"Wall","relativeAngle":-1.2364019629334816e-15,"id":"tY9ds8odUyLmWNVGbRfRZS","cx":3.772871790220624,"leftJoints":["mr118MYyqYHattPXCpoynG"],"rotation":[0,0,-0.41015237421866746],"cz":2.59868595123194,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"lx":5.401219763739977,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"locked":false,"leftJoints":["xhZR7k2DmmA9LNkxhevkLf"],"parentId":"eP5t9YkC32dmeRk87x14Ko","foundationId":"eP5t9YkC32dmeRk87x14Ko","rightJoints":["tY9ds8odUyLmWNVGbRfRZS"],"cx":1.0790317820948396,"id":"mr118MYyqYHattPXCpoynG","selected":false,"relativeAngle":-1.570796326794898,"roofId":"iM8xLCCHLJSTRMvV2ytbGw","leftPoint":[1.0790317820948425,2.631866526370637,0],"color":"white","type":"Wall","textureType":"Wall Texture Default","cz":2.8306092473007007,"leftRoofHeight":7,"rightPoint":[1.0790317820948367,-2.7693532373693404,0],"rightRoofHeight":7,"lz":7,"normal":[0,0,1],"cy":-0.06874335549935173,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"color":"#808080","parentId":"Ground","type":"Foundation","lx":13.89007394070906,"cy":96.06999769870255,"id":"eP5t9YkC32dmeRk87x14Ko","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"solarPowerTower":{},"solarUpdraftTower":{},"ly":5.568881804752381,"solarAbsorberPipe":{},"cx":24.454109298590414,"cz":0.5,"selected":false,"lz":1,"locked":false},{"selected":false,"leftJoints":["1wfGxoDf2D4xggTqqerw35"],"rightRoofHeight":7,"cx":3.772871790220627,"leftRoofHeight":7,"color":"white","textureType":"Wall Texture Default","locked":false,"leftPoint":[6.466711798346411,2.6318665263706373,0],"lz":7,"lx":5.387680016251569,"parentId":"jxVQ73S6zAeTM6FAnyQm16","id":"dGhfzR7o1S6iaLXRYQQHpz","foundationId":"jxVQ73S6zAeTM6FAnyQm16","type":"Wall","normal":[0,0,1],"ly":0.3,"rightPoint":[1.0790317820948425,2.631866526370637,0],"cy":2.6318665263706373,"cz":0,"relativeAngle":-3.141592653589793,"centerRoofHeight":[-0.5,7],"rightJoints":["qauPnugYuuS7RLZjxeEFyH"],"roofId":"9Di2gUsu4cUvfnKcucwxcz","rotation":[0,0,-0.41015237421866746],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"rightJoints":["dGhfzR7o1S6iaLXRYQQHpz"],"rightRoofHeight":7,"textureType":"Wall Texture Default","roofId":"9Di2gUsu4cUvfnKcucwxcz","type":"Wall","rotation":[0,0,-0.41015237421866746],"color":"white","foundationId":"jxVQ73S6zAeTM6FAnyQm16","cx":6.466711798346411,"id":"1wfGxoDf2D4xggTqqerw35","locked":false,"normal":[0,0,1],"relativeAngle":1.5707963267948966,"lx":5.401219763739984,"leftPoint":[6.466711798346411,-2.769353237369347,0],"lz":7,"rightPoint":[6.466711798346411,2.6318665263706373,0],"leftJoints":["6DTGHsEWy1Mj5z5EBJ8m4A"],"ly":0.3,"cz":0,"cy":-0.06874335549935484,"parentId":"jxVQ73S6zAeTM6FAnyQm16","selected":false,"leftRoofHeight":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"color":"white","rightPoint":[6.466711798346411,-2.769353237369347,0],"normal":[0,0,1],"selected":false,"roofId":"9Di2gUsu4cUvfnKcucwxcz","rightRoofHeight":7,"cy":-2.7693532373693435,"lz":7,"cx":3.772871790220624,"parentId":"jxVQ73S6zAeTM6FAnyQm16","leftPoint":[1.0790317820948367,-2.7693532373693404,0],"ly":0.3,"foundationId":"jxVQ73S6zAeTM6FAnyQm16","textureType":"Wall Texture Default","leftRoofHeight":7,"rightJoints":["1wfGxoDf2D4xggTqqerw35"],"rotation":[0,0,-0.41015237421866746],"cz":0,"locked":false,"lx":5.387680016251575,"id":"6DTGHsEWy1Mj5z5EBJ8m4A","relativeAngle":-1.2364019629334816e-15,"type":"Wall","centerRoofHeight":[0.5,7],"leftJoints":["qauPnugYuuS7RLZjxeEFyH"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"ly":0.3,"lx":5.401219763739977,"rotation":[0,0,-0.41015237421866746],"roofId":"9Di2gUsu4cUvfnKcucwxcz","leftPoint":[1.0790317820948425,2.631866526370637,0],"rightRoofHeight":7,"color":"white","textureType":"Wall Texture Default","foundationId":"jxVQ73S6zAeTM6FAnyQm16","leftRoofHeight":7,"locked":false,"type":"Wall","cz":0,"leftJoints":["dGhfzR7o1S6iaLXRYQQHpz"],"rightPoint":[1.0790317820948367,-2.7693532373693404,0],"parentId":"jxVQ73S6zAeTM6FAnyQm16","normal":[0,0,1],"cx":1.0790317820948396,"lz":7,"rightJoints":["6DTGHsEWy1Mj5z5EBJ8m4A"],"relativeAngle":-1.570796326794898,"cy":-0.06874335549935173,"id":"qauPnugYuuS7RLZjxeEFyH","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"solarUpdraftTower":{},"lz":1,"parentId":"Ground","solarAbsorberPipe":{},"normal":[0,0,1],"solarPowerTower":{},"id":"jxVQ73S6zAeTM6FAnyQm16","selected":false,"ly":5.568881804752381,"type":"Foundation","lx":13.89007394070906,"cz":0.5,"locked":false,"color":"#808080","cx":29.2866477996762,"rotation":[0,0,-0.41015237421866746],"cy":107.44244234980054},{"rotation":[0,0,-0.41015237421866746],"cz":0,"rightPoint":[1.0790317820948425,2.631866526370637,0],"selected":false,"color":"white","foundationId":"rDKG6AKNM5QvYPq1qfdTX1","lx":5.387680016251569,"rightRoofHeight":7,"relativeAngle":-3.141592653589793,"roofId":"gRx8iaGJs1z3AUhQF6eqGJ","normal":[0,0,1],"leftJoints":["iTrgk5UiyKug74tDSksgxe"],"ly":0.3,"locked":false,"leftPoint":[6.466711798346411,2.6318665263706373,0],"id":"nxbMX3EChmn9CzTV7CdW2h","cx":3.772871790220627,"rightJoints":["ehEH19eZNtirzGTfRqW3Hp"],"leftRoofHeight":7,"cy":2.6318665263706373,"parentId":"rDKG6AKNM5QvYPq1qfdTX1","textureType":"Wall Texture Default","lz":7,"centerRoofHeight":[-0.5,7],"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"lz":7,"rightJoints":["nxbMX3EChmn9CzTV7CdW2h"],"rightRoofHeight":7,"ly":0.3,"color":"white","rotation":[0,0,-0.41015237421866746],"cy":-0.06874335549935484,"foundationId":"rDKG6AKNM5QvYPq1qfdTX1","roofId":"gRx8iaGJs1z3AUhQF6eqGJ","rightPoint":[6.466711798346411,2.6318665263706373,0],"selected":false,"parentId":"rDKG6AKNM5QvYPq1qfdTX1","id":"iTrgk5UiyKug74tDSksgxe","cx":6.466711798346411,"cz":0,"normal":[0,0,1],"relativeAngle":1.5707963267948966,"leftRoofHeight":7,"textureType":"Wall Texture Default","lx":5.401219763739984,"type":"Wall","leftJoints":["97QKa6yKUz1mJAvuAaYQi5"],"leftPoint":[6.466711798346411,-2.769353237369347,0],"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Wall","rightRoofHeight":7,"locked":false,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","ly":0.3,"relativeAngle":-1.2364019629334816e-15,"centerRoofHeight":[0.5,7],"cx":3.772871790220624,"roofId":"gRx8iaGJs1z3AUhQF6eqGJ","rightPoint":[6.466711798346411,-2.769353237369347,0],"foundationId":"rDKG6AKNM5QvYPq1qfdTX1","leftJoints":["ehEH19eZNtirzGTfRqW3Hp"],"id":"97QKa6yKUz1mJAvuAaYQi5","leftPoint":[1.0790317820948367,-2.7693532373693404,0],"leftRoofHeight":7,"cz":0,"color":"white","selected":false,"lz":7,"lx":5.387680016251575,"cy":-2.7693532373693435,"normal":[0,0,1],"rightJoints":["iTrgk5UiyKug74tDSksgxe"],"parentId":"rDKG6AKNM5QvYPq1qfdTX1","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"rightPoint":[1.0790317820948367,-2.7693532373693404,0],"foundationId":"rDKG6AKNM5QvYPq1qfdTX1","normal":[0,0,1],"color":"white","cx":1.0790317820948396,"parentId":"rDKG6AKNM5QvYPq1qfdTX1","cy":-0.06874335549935173,"leftPoint":[1.0790317820948425,2.631866526370637,0],"leftRoofHeight":7,"locked":false,"lz":7,"leftJoints":["nxbMX3EChmn9CzTV7CdW2h"],"roofId":"gRx8iaGJs1z3AUhQF6eqGJ","ly":0.3,"type":"Wall","selected":false,"rotation":[0,0,-0.41015237421866746],"cz":0,"textureType":"Wall Texture Default","id":"ehEH19eZNtirzGTfRqW3Hp","lx":5.401219763739977,"relativeAngle":-1.570796326794898,"rightRoofHeight":7,"rightJoints":["97QKa6yKUz1mJAvuAaYQi5"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cx":34.55424337004162,"solarAbsorberPipe":{},"type":"Foundation","rotation":[0,0,-0.41015237421866746],"locked":false,"cz":0.5,"parentId":"Ground","solarPowerTower":{},"normal":[0,0,1],"ly":5.568881804752381,"cy":118.62202333064985,"lx":13.89007394070906,"solarUpdraftTower":{},"selected":false,"color":"#808080","lz":1,"id":"rDKG6AKNM5QvYPq1qfdTX1"},{"wallsId":["mr118MYyqYHattPXCpoynG"],"lz":0,"lineWidth":0.2,"textureType":"No Roof Texture","locked":false,"ridgeLeftPoint":[-0.5,1],"thickness":0.2,"cx":0,"rotation":[0,0,0],"id":"iM8xLCCHLJSTRMvV2ytbGw","foundationId":"eP5t9YkC32dmeRk87x14Ko","selected":false,"ly":0,"color":"#ffffff","cz":0,"parentId":"eP5t9YkC32dmeRk87x14Ko","ridgeRightPoint":[0.5,1],"lineColor":"black","showLabel":false,"type":"Roof","lx":0,"roofType":"Gable","normal":[0,0,1],"cy":0,"rise":0,"ceiling":false},{"ly":0,"type":"Roof","thickness":0.2,"lz":0,"wallsId":["qauPnugYuuS7RLZjxeEFyH"],"color":"#ffffff","selected":false,"ridgeRightPoint":[0.5,1],"lx":0,"ridgeLeftPoint":[-0.5,1],"normal":[0,0,1],"lineColor":"black","rotation":[0,0,0],"roofType":"Gable","locked":false,"cy":0,"parentId":"jxVQ73S6zAeTM6FAnyQm16","cz":0,"textureType":"No Roof Texture","showLabel":false,"foundationId":"jxVQ73S6zAeTM6FAnyQm16","id":"9Di2gUsu4cUvfnKcucwxcz","cx":0,"lineWidth":0.2,"rise":0,"ceiling":false},{"ly":0,"lineWidth":0.2,"cx":0,"type":"Roof","textureType":"No Roof Texture","ridgeLeftPoint":[-0.5,1],"showLabel":false,"selected":false,"cz":0,"wallsId":["ehEH19eZNtirzGTfRqW3Hp"],"rotation":[0,0,0],"lineColor":"black","color":"#ffffff","lx":0,"id":"gRx8iaGJs1z3AUhQF6eqGJ","thickness":0.2,"normal":[0,0,1],"ridgeRightPoint":[0.5,1],"parentId":"rDKG6AKNM5QvYPq1qfdTX1","locked":false,"roofType":"Gable","cy":0,"lz":0,"foundationId":"rDKG6AKNM5QvYPq1qfdTX1","rise":0,"ceiling":false},{"lx":5.387680016251569,"cz":0,"rightRoofHeight":7,"ly":0.3,"parentId":"jYYkxDDGtpRKpj5cDaSAyU","leftPoint":[-0.7148597809579893,2.6859428300134063,1],"leftJoints":["dn61jbg36CDKXJ7atWKcPL"],"normal":[0,0,1],"rightPoint":[-6.102539797209565,2.6859428300134014,1],"roofId":"8851rT9wqqajnoeFBmiUjQ","color":"white","locked":false,"selected":false,"rightJoints":["81VpPXebFdckLDhrYfjNw4"],"cy":2.685942830013403,"type":"Wall","leftRoofHeight":7,"id":"sksYhYD2dNixUEPNYJqc76","rotation":[0,0,-0.41015237421866746],"centerRoofHeight":[0.5,7],"relativeAngle":-3.141592653589793,"textureType":"Wall Texture Default","lz":7,"foundationId":"jYYkxDDGtpRKpj5cDaSAyU","cx":-3.4086997890837694,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"locked":false,"cy":-0.014667051856591229,"roofId":"8851rT9wqqajnoeFBmiUjQ","leftRoofHeight":7,"rightRoofHeight":7,"parentId":"jYYkxDDGtpRKpj5cDaSAyU","selected":false,"lz":7,"textureType":"Wall Texture Default","type":"Wall","color":"white","foundationId":"jYYkxDDGtpRKpj5cDaSAyU","leftPoint":[-0.7148597809579927,-2.7152769337265767,1],"rotation":[0,0,-0.41015237421866746],"id":"dn61jbg36CDKXJ7atWKcPL","normal":[0,0,1],"leftJoints":["x33tCm8G91uhrEhqZh7Sgp"],"cx":-0.7148597809579962,"rightPoint":[-0.7148597809579893,2.6859428300134063,1],"ly":0.3,"lx":5.401219763739984,"rightJoints":["sksYhYD2dNixUEPNYJqc76"],"relativeAngle":1.5707963267948966,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"ly":0.3,"locked":false,"rightPoint":[-0.7148597809579927,-2.7152769337265767,1],"rightJoints":["dn61jbg36CDKXJ7atWKcPL"],"id":"x33tCm8G91uhrEhqZh7Sgp","normal":[0,0,1],"lx":5.387680016251575,"roofId":"8851rT9wqqajnoeFBmiUjQ","lz":7,"rotation":[0,0,-0.41015237421866746],"parentId":"jYYkxDDGtpRKpj5cDaSAyU","relativeAngle":-1.2364019629334816e-15,"textureType":"Wall Texture Default","centerRoofHeight":[-0.5,7],"rightRoofHeight":7,"cx":-3.4086997890837756,"leftPoint":[-6.102539797209571,-2.7152769337265754,1],"cz":0,"type":"Wall","color":"white","foundationId":"jYYkxDDGtpRKpj5cDaSAyU","selected":false,"leftJoints":["81VpPXebFdckLDhrYfjNw4"],"leftRoofHeight":7,"cy":-2.715276933726573,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cy":-0.014667051856584123,"normal":[0,0,1],"leftPoint":[-6.102539797209565,2.6859428300134014,1],"rightJoints":["x33tCm8G91uhrEhqZh7Sgp"],"locked":false,"cz":0,"cx":-6.102539797209562,"lz":7,"id":"81VpPXebFdckLDhrYfjNw4","rightRoofHeight":7,"selected":false,"lx":5.401219763739977,"foundationId":"jYYkxDDGtpRKpj5cDaSAyU","roofId":"8851rT9wqqajnoeFBmiUjQ","type":"Wall","color":"white","ly":0.3,"rightPoint":[-6.102539797209571,-2.7152769337265754,1],"parentId":"jYYkxDDGtpRKpj5cDaSAyU","leftRoofHeight":7,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","relativeAngle":-1.570796326794898,"leftJoints":["sksYhYD2dNixUEPNYJqc76"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"type":"Foundation","color":"#808080","cy":78.31845915827158,"solarAbsorberPipe":{},"solarPowerTower":{},"cz":0.5,"locked":false,"ly":5.482519143209589,"normal":[0,0,1],"lz":1,"selected":false,"id":"jYYkxDDGtpRKpj5cDaSAyU","solarUpdraftTower":{},"lx":12.981345567934609,"cx":65.13740167211039,"parentId":"Ground","rotation":[0,0,-0.41015237421866746]},{"rotation":[0,0,-0.41015237421866746],"relativeAngle":-3.141592653589793,"cx":-3.4086997890837694,"cy":2.685942830013403,"rightJoints":["5BVMmeTYtWaRrB3p7N2yex"],"textureType":"Wall Texture Default","cz":0,"lx":5.387680016251569,"type":"Wall","roofId":"uhbPwQthVjoBQGqRB2bxwD","leftJoints":["nU3buhZij6ruFmt78QqHPt"],"id":"xbje76bhjMGZA3Mc8s8cWN","ly":0.3,"parentId":"dTyQpKfdgEv9kGBprmTD5p","leftRoofHeight":7,"foundationId":"dTyQpKfdgEv9kGBprmTD5p","color":"white","rightPoint":[-6.102539797209565,2.6859428300134014,1],"leftPoint":[-0.7148597809579893,2.6859428300134063,1],"locked":false,"centerRoofHeight":[0.5,7],"rightRoofHeight":7,"lz":7,"selected":false,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cz":0,"roofId":"uhbPwQthVjoBQGqRB2bxwD","cy":-0.014667051856591229,"leftRoofHeight":7,"rotation":[0,0,-0.41015237421866746],"selected":false,"textureType":"Wall Texture Default","relativeAngle":1.5707963267948966,"leftJoints":["dwNyLyogzdW8eZvvnJWmaJ"],"rightJoints":["xbje76bhjMGZA3Mc8s8cWN"],"locked":false,"foundationId":"dTyQpKfdgEv9kGBprmTD5p","lz":7,"rightRoofHeight":7,"color":"white","lx":5.401219763739984,"id":"nU3buhZij6ruFmt78QqHPt","ly":0.3,"leftPoint":[-0.7148597809579927,-2.7152769337265767,1],"cx":-0.7148597809579962,"parentId":"dTyQpKfdgEv9kGBprmTD5p","normal":[0,0,1],"type":"Wall","rightPoint":[-0.7148597809579893,2.6859428300134063,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"textureType":"Wall Texture Default","type":"Wall","leftPoint":[-6.102539797209571,-2.7152769337265754,1],"foundationId":"dTyQpKfdgEv9kGBprmTD5p","roofId":"uhbPwQthVjoBQGqRB2bxwD","cz":0,"rightJoints":["nU3buhZij6ruFmt78QqHPt"],"ly":0.3,"relativeAngle":-1.2364019629334816e-15,"rightRoofHeight":7,"cy":-2.715276933726573,"selected":false,"id":"dwNyLyogzdW8eZvvnJWmaJ","locked":false,"cx":-3.4086997890837756,"rotation":[0,0,-0.41015237421866746],"rightPoint":[-0.7148597809579927,-2.7152769337265767,1],"lx":5.387680016251575,"color":"white","normal":[0,0,1],"leftJoints":["5BVMmeTYtWaRrB3p7N2yex"],"centerRoofHeight":[-0.5,7],"parentId":"dTyQpKfdgEv9kGBprmTD5p","leftRoofHeight":7,"lz":7,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"leftPoint":[-6.102539797209565,2.6859428300134014,1],"selected":false,"color":"white","type":"Wall","textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"leftRoofHeight":7,"lz":7,"cx":-6.102539797209562,"leftJoints":["xbje76bhjMGZA3Mc8s8cWN"],"relativeAngle":-1.570796326794898,"id":"5BVMmeTYtWaRrB3p7N2yex","ly":0.3,"roofId":"uhbPwQthVjoBQGqRB2bxwD","rightRoofHeight":7,"cz":0,"cy":-0.014667051856584123,"rightJoints":["dwNyLyogzdW8eZvvnJWmaJ"],"lx":5.401219763739977,"locked":false,"parentId":"dTyQpKfdgEv9kGBprmTD5p","foundationId":"dTyQpKfdgEv9kGBprmTD5p","rightPoint":[-6.102539797209571,-2.7152769337265754,1],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"normal":[0,0,1],"cy":89.91033144595889,"solarPowerTower":{},"id":"dTyQpKfdgEv9kGBprmTD5p","parentId":"Ground","solarUpdraftTower":{},"locked":false,"type":"Foundation","cx":70.15208193257892,"color":"#808080","ly":5.482519143209589,"cz":0.5,"solarAbsorberPipe":{},"lz":1,"lx":12.981345567934609,"rotation":[0,0,-0.41015237421866746],"selected":false},{"leftPoint":[-0.7148597809579893,2.6859428300134063,1],"selected":false,"normal":[0,0,1],"relativeAngle":-3.141592653589793,"cz":0,"rightRoofHeight":7,"ly":0.3,"parentId":"7tr4anbazuvTAtnbTpqU9w","type":"Wall","centerRoofHeight":[0.5,7],"leftRoofHeight":7,"color":"white","locked":false,"textureType":"Wall Texture Default","rightPoint":[-6.102539797209565,2.6859428300134014,1],"lx":5.387680016251569,"rightJoints":["cK1cR6gMr6BKG2p5YWPAbz"],"rotation":[0,0,-0.41015237421866746],"roofId":"4YikGAD8ELjnqVycqWQnqk","lz":7,"id":"7R7xQ85xB9XpqZUteZ3rjG","cy":2.685942830013403,"foundationId":"7tr4anbazuvTAtnbTpqU9w","cx":-3.4086997890837694,"leftJoints":["fb2EVpNYy9jyY5yAermefj"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"cz":0,"rotation":[0,0,-0.41015237421866746],"type":"Wall","relativeAngle":1.5707963267948966,"leftRoofHeight":7,"rightPoint":[-0.7148597809579893,2.6859428300134063,1],"rightRoofHeight":7,"rightJoints":["7R7xQ85xB9XpqZUteZ3rjG"],"textureType":"Wall Texture Default","leftJoints":["kYSMKReMjdXaFQpkHynQU8"],"lx":5.401219763739984,"ly":0.3,"locked":false,"parentId":"7tr4anbazuvTAtnbTpqU9w","foundationId":"7tr4anbazuvTAtnbTpqU9w","selected":false,"id":"fb2EVpNYy9jyY5yAermefj","leftPoint":[-0.7148597809579927,-2.7152769337265767,1],"cx":-0.7148597809579962,"normal":[0,0,1],"cy":-0.014667051856591229,"lz":7,"roofId":"4YikGAD8ELjnqVycqWQnqk","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"color":"white","cz":0,"normal":[0,0,1],"leftJoints":["cK1cR6gMr6BKG2p5YWPAbz"],"ly":0.3,"lz":7,"textureType":"Wall Texture Default","leftRoofHeight":7,"lx":5.387680016251575,"rightJoints":["fb2EVpNYy9jyY5yAermefj"],"cx":-3.4086997890837756,"rightRoofHeight":7,"selected":false,"rightPoint":[-0.7148597809579927,-2.7152769337265767,1],"type":"Wall","foundationId":"7tr4anbazuvTAtnbTpqU9w","cy":-2.715276933726573,"id":"kYSMKReMjdXaFQpkHynQU8","centerRoofHeight":[-0.5,7],"relativeAngle":-1.2364019629334816e-15,"rotation":[0,0,-0.41015237421866746],"parentId":"7tr4anbazuvTAtnbTpqU9w","leftPoint":[-6.102539797209571,-2.7152769337265754,1],"locked":false,"roofId":"4YikGAD8ELjnqVycqWQnqk","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"lx":5.401219763739977,"ly":0.3,"cz":0,"rightPoint":[-6.102539797209571,-2.7152769337265754,1],"parentId":"7tr4anbazuvTAtnbTpqU9w","leftRoofHeight":7,"color":"white","rightRoofHeight":7,"cx":-6.102539797209562,"leftJoints":["7R7xQ85xB9XpqZUteZ3rjG"],"locked":false,"type":"Wall","lz":7,"normal":[0,0,1],"selected":false,"leftPoint":[-6.102539797209565,2.6859428300134014,1],"roofId":"4YikGAD8ELjnqVycqWQnqk","rightJoints":["kYSMKReMjdXaFQpkHynQU8"],"foundationId":"7tr4anbazuvTAtnbTpqU9w","id":"cK1cR6gMr6BKG2p5YWPAbz","cy":-0.014667051856584123,"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"relativeAngle":-1.570796326794898,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7,"rightTopPartialHeight":7},{"selected":false,"solarPowerTower":{},"cz":0.5,"cx":75.10959011141287,"type":"Foundation","solarAbsorberPipe":{},"cy":101.13287550232491,"ly":5.482519143209589,"lx":12.981345567934609,"solarUpdraftTower":{},"id":"7tr4anbazuvTAtnbTpqU9w","locked":false,"lz":1,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","color":"#808080","normal":[0,0,1]},{"lz":0,"textureType":"No Roof Texture","foundationId":"un11oZ7V5tAhWhFKuL8M5Q","cy":0,"lineColor":"black","lineWidth":0.2,"lx":0,"wallsId":["eVDG7gqXM3uLaHhJS5k6Fh"],"ly":0,"rightRidgeLength":15.217808474550925,"selected":false,"type":"Roof","rotation":[0,0,0],"color":"#ffffff","cz":0,"thickness":0.2,"roofType":"Hip","showLabel":false,"normal":[0,0,1],"leftRidgeLength":15.217808474550925,"cx":0,"locked":false,"parentId":"un11oZ7V5tAhWhFKuL8M5Q","id":"a67eFG3dY8EiYs3GWgTwsF","rise":3,"ceiling":false},{"selected":false,"type":"Roof","cy":0,"lz":0,"cz":0,"lineWidth":0.2,"wallsId":["fHApw3eZ3j52e3Ze4hhzaH"],"color":"#ffffff","ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"foundationId":"4UZo2BLYXGN9cd3hbyQ45x","lx":0,"showLabel":false,"lineColor":"black","rotation":[0,0,0],"thickness":0.2,"roofType":"Gable","id":"8gnJuvioHBpuV9PnGGyNAB","ly":0,"locked":false,"textureType":"No Roof Texture","parentId":"4UZo2BLYXGN9cd3hbyQ45x","cx":0,"normal":[0,0,1],"rise":0,"ceiling":false},{"ly":0,"lineWidth":0.2,"thickness":0.2,"ridgeRightPoint":[0.5,1],"rotation":[0,0,0],"selected":false,"lz":0,"id":"8851rT9wqqajnoeFBmiUjQ","lineColor":"black","wallsId":["dn61jbg36CDKXJ7atWKcPL"],"ridgeLeftPoint":[-0.5,1],"cz":0,"cy":0,"foundationId":"jYYkxDDGtpRKpj5cDaSAyU","lx":0,"parentId":"jYYkxDDGtpRKpj5cDaSAyU","showLabel":false,"normal":[0,0,1],"cx":0,"roofType":"Gable","color":"#ffffff","textureType":"No Roof Texture","locked":false,"type":"Roof","rise":0,"ceiling":false},{"textureType":"No Roof Texture","lx":0,"parentId":"dTyQpKfdgEv9kGBprmTD5p","color":"#ffffff","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"lz":0,"thickness":0.2,"type":"Roof","selected":false,"showLabel":false,"cz":0,"wallsId":["nU3buhZij6ruFmt78QqHPt"],"rotation":[0,0,0],"lineWidth":0.2,"foundationId":"dTyQpKfdgEv9kGBprmTD5p","cy":0,"id":"uhbPwQthVjoBQGqRB2bxwD","lineColor":"black","ly":0,"locked":false,"normal":[0,0,1],"cx":0,"roofType":"Gable","rise":0,"ceiling":false},{"showLabel":false,"normal":[0,0,1],"parentId":"7tr4anbazuvTAtnbTpqU9w","lz":0,"lineWidth":0.2,"rotation":[0,0,0],"ly":0,"id":"4YikGAD8ELjnqVycqWQnqk","textureType":"No Roof Texture","cz":0,"roofType":"Gable","lineColor":"black","foundationId":"7tr4anbazuvTAtnbTpqU9w","lx":0,"wallsId":["fb2EVpNYy9jyY5yAermefj"],"cy":0,"cx":0,"color":"#ffffff","locked":false,"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"thickness":0.2,"type":"Roof","selected":false,"rise":0,"ceiling":false},{"lineColor":"black","thickness":0.2,"id":"sYHDayEkzyov7moz6ZSxMu","wallsId":["vBUTysuRjhgkSBTqe4LbYB"],"foundationId":"iUb7PSjszf44Zg2YisnC92","rightRidgeLength":10.468639728099076,"cy":0,"leftRidgeLength":10.502576741045827,"locked":false,"color":"#ffffff","parentId":"iUb7PSjszf44Zg2YisnC92","lz":0,"showLabel":false,"cx":0,"roofType":"Hip","normal":[0,0,1],"cz":0,"lx":0,"selected":false,"type":"Roof","textureType":"No Roof Texture","lineWidth":0.2,"ly":0,"rotation":[0,0,0],"rise":2.5,"ceiling":false},{"normal":[0,0,1],"cx":4.440892098500626e-16,"type":"Wall","ly":0.3,"relativeAngle":3.141592653589793,"rightPoint":[-3.499999999999999,5.5,0],"rotation":[0,0,-0.41015237421866746],"leftPoint":[3.5,5.5,0],"color":"white","lx":6.999999999999999,"rightRoofHeight":5.5,"lz":5.5,"locked":false,"selected":false,"leftRoofHeight":5.5,"textureType":"Wall Texture Default","roofId":"ta7dJGh8vLPXrt6JV7RiRA","cy":5.5,"id":"qefHhW7RphUHeDq16TbXhE","parentId":"rQHuxdXYQbCuq9CeyutKyt","foundationId":"rQHuxdXYQbCuq9CeyutKyt","leftJoints":["6ooz87ACe4edwrDbgzxpbv"],"rightJoints":["havXcoauCS81jHQUuLqvuh"],"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"cx":3.4999999999999982,"foundationId":"rQHuxdXYQbCuq9CeyutKyt","parentId":"rQHuxdXYQbCuq9CeyutKyt","rightPoint":[3.499999999999996,5.500000000000007,0],"lz":5.5,"relativeAngle":1.5707963267948974,"leftRoofHeight":5.5,"locked":false,"color":"white","leftPoint":[3.5,-0.5,0],"rotation":[0,0,-0.41015237421866746],"type":"Wall","roofId":"ta7dJGh8vLPXrt6JV7RiRA","leftJoints":["mr4zR49hytzuJEADGRBy6h"],"selected":false,"centerRoofHeight":[0.5,5.5],"normal":[0,0,1],"cy":2.5000000000000036,"id":"6ooz87ACe4edwrDbgzxpbv","ly":0.3,"lx":6.000000000000007,"textureType":"Wall Texture Default","rightJoints":["qefHhW7RphUHeDq16TbXhE"],"cz":0,"rightRoofHeight":5.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"roofId":"ta7dJGh8vLPXrt6JV7RiRA","rotation":[0,0,-0.41015237421866746],"leftPoint":[-3.499999999999999,5.5,0],"rightJoints":["mr4zR49hytzuJEADGRBy6h"],"color":"white","leftRoofHeight":5.5,"foundationId":"rQHuxdXYQbCuq9CeyutKyt","leftJoints":["qefHhW7RphUHeDq16TbXhE"],"rightRoofHeight":5.5,"lx":6,"relativeAngle":4.71238898038469,"cx":-3.4999999999999996,"cz":0,"normal":[0,0,1],"id":"havXcoauCS81jHQUuLqvuh","ly":0.3,"rightPoint":[-3.5,-0.5,0],"textureType":"Wall Texture Default","cy":2.5,"locked":false,"selected":false,"type":"Wall","lz":5.5,"centerRoofHeight":[-0.5,5.5],"parentId":"rQHuxdXYQbCuq9CeyutKyt","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"textureType":"Wall Texture Default","foundationId":"rQHuxdXYQbCuq9CeyutKyt","locked":false,"leftJoints":["havXcoauCS81jHQUuLqvuh"],"rightJoints":["6ooz87ACe4edwrDbgzxpbv"],"relativeAngle":3.806478941571964e-16,"rightPoint":[3.5,-0.5,0],"color":"white","rightRoofHeight":5.5,"leftRoofHeight":5.5,"leftPoint":[-3.500000000000002,-0.5000000000000027,0],"id":"mr4zR49hytzuJEADGRBy6h","ly":0.3,"lx":7.000000000000002,"type":"Wall","roofId":"ta7dJGh8vLPXrt6JV7RiRA","cx":-1.1102230246251565e-15,"cy":-0.5000000000000013,"normal":[0,0,1],"selected":false,"lz":5.5,"cz":0,"rotation":[0,0,-0.41015237421866746],"parentId":"rQHuxdXYQbCuq9CeyutKyt","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"color":"#ffffff","normal":[0,0,1],"textureType":"No Roof Texture","id":"ta7dJGh8vLPXrt6JV7RiRA","thickness":0.2,"cy":0,"foundationId":"rQHuxdXYQbCuq9CeyutKyt","selected":false,"locked":false,"ridgeRightPoint":[0.5,1],"roofType":"Gable","wallsId":["mr4zR49hytzuJEADGRBy6h"],"rotation":[0,0,-0.41015237421866746],"ly":0,"cz":0,"ridgeLeftPoint":[-0.5,1],"lx":0,"type":"Roof","cx":0,"lz":0,"parentId":"rQHuxdXYQbCuq9CeyutKyt","rise":0,"ceiling":false},{"locked":false,"solarAbsorberPipe":{},"lz":1,"ly":13.609083182601537,"cz":0.5,"type":"Foundation","id":"rQHuxdXYQbCuq9CeyutKyt","cx":-44.11791038753842,"normal":[0,0,1],"lx":9.87769053193653,"solarUpdraftTower":{},"selected":false,"cy":-106.22676257052163,"rotation":[0,0,-0.41015237421866746],"parentId":"Ground","solarPowerTower":{}},{"id":"i5GKt7QSXzDRXB7dcnVBLM","locked":false,"rotation":[0,0,2.731440279371126],"leftPoint":[3.5,5.5,0],"ly":0.3,"cy":5.5,"leftJoints":["m2eA6TxbykTmNtzzk3kJAi"],"relativeAngle":3.141592653589793,"parentId":"i7ztNW6L7rJRDK1bHdkfyV","textureType":"Wall Texture Default","cz":0,"rightPoint":[-3.499999999999999,5.5,0],"selected":false,"lz":5.5,"rightJoints":["sPS51DdhZZB8Z5PdWKEDt2"],"normal":[0,0,1],"foundationId":"i7ztNW6L7rJRDK1bHdkfyV","leftRoofHeight":5.5,"color":"white","type":"Wall","roofId":"r5b5XcBuiD8AujQ1MGfNH3","lx":6.999999999999999,"rightRoofHeight":5.5,"cx":4.440892098500626e-16,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"centerRoofHeight":[0.5,5.5],"roofId":"r5b5XcBuiD8AujQ1MGfNH3","rotation":[0,0,2.731440279371126],"foundationId":"i7ztNW6L7rJRDK1bHdkfyV","cz":0,"relativeAngle":1.5707963267948974,"color":"white","cx":3.4999999999999982,"id":"m2eA6TxbykTmNtzzk3kJAi","leftJoints":["oH8d6S7hYF3gtbhBgwNM9N"],"rightPoint":[3.499999999999996,5.500000000000007,0],"leftPoint":[3.5,-0.5,0],"lx":6.000000000000007,"locked":false,"rightJoints":["i5GKt7QSXzDRXB7dcnVBLM"],"normal":[0,0,1],"parentId":"i7ztNW6L7rJRDK1bHdkfyV","cy":2.5000000000000036,"textureType":"Wall Texture Default","ly":0.3,"rightRoofHeight":5.5,"selected":false,"lz":5.5,"leftRoofHeight":5.5,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"normal":[0,0,1],"rightJoints":["oH8d6S7hYF3gtbhBgwNM9N"],"relativeAngle":4.71238898038469,"leftPoint":[-3.499999999999999,5.5,0],"leftRoofHeight":5.5,"leftJoints":["i5GKt7QSXzDRXB7dcnVBLM"],"color":"white","selected":false,"lz":5.5,"locked":false,"rightRoofHeight":5.5,"cy":2.5,"cx":-3.4999999999999996,"type":"Wall","cz":0,"id":"sPS51DdhZZB8Z5PdWKEDt2","rightPoint":[-3.5,-0.5,0],"textureType":"Wall Texture Default","foundationId":"i7ztNW6L7rJRDK1bHdkfyV","roofId":"r5b5XcBuiD8AujQ1MGfNH3","parentId":"i7ztNW6L7rJRDK1bHdkfyV","ly":0.3,"centerRoofHeight":[-0.5,5.5],"rotation":[0,0,2.731440279371126],"lx":6,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"locked":false,"id":"oH8d6S7hYF3gtbhBgwNM9N","type":"Wall","leftJoints":["sPS51DdhZZB8Z5PdWKEDt2"],"rightPoint":[3.5,-0.5,0],"rotation":[0,0,2.731440279371126],"cx":-1.1102230246251565e-15,"color":"white","rightJoints":["m2eA6TxbykTmNtzzk3kJAi"],"roofId":"r5b5XcBuiD8AujQ1MGfNH3","foundationId":"i7ztNW6L7rJRDK1bHdkfyV","lx":7.000000000000002,"leftRoofHeight":5.5,"textureType":"Wall Texture Default","parentId":"i7ztNW6L7rJRDK1bHdkfyV","rightRoofHeight":5.5,"leftPoint":[-3.500000000000002,-0.5000000000000027,0],"cy":-0.5000000000000013,"cz":0,"selected":false,"lz":5.5,"relativeAngle":3.806478941571964e-16,"ly":0.3,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"parentId":"i7ztNW6L7rJRDK1bHdkfyV","selected":false,"thickness":0.2,"cy":0,"type":"Roof","foundationId":"i7ztNW6L7rJRDK1bHdkfyV","id":"r5b5XcBuiD8AujQ1MGfNH3","roofType":"Gable","lx":0,"wallsId":["oH8d6S7hYF3gtbhBgwNM9N"],"normal":[0,0,1],"ridgeRightPoint":[0.5,1],"color":"#ffffff","cz":0,"ly":0,"rotation":[0,0,2.731440279371126],"ridgeLeftPoint":[-0.5,1],"cx":0,"locked":false,"lz":0,"textureType":"No Roof Texture","rise":0,"ceiling":false},{"solarAbsorberPipe":{},"rotation":[0,0,2.731440279371126],"id":"i7ztNW6L7rJRDK1bHdkfyV","cy":-73.67535448644264,"lx":9.87769053193653,"normal":[0,0,1],"locked":false,"solarPowerTower":{},"selected":false,"cx":-30.629562336104748,"ly":13.609083182601537,"parentId":"Ground","solarUpdraftTower":{},"type":"Foundation","lz":1,"cz":0.5},{"rotation":[0,0,2.731440279371126],"leftRoofHeight":5.5,"foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","color":"white","parentId":"hSQpUbAbHNwPXWwTfmLQQ9","cz":0,"normal":[0,0,1],"selected":false,"cy":5.5,"relativeAngle":3.141592653589793,"roofId":"runBfYomSfd687Gchj63SZ","leftPoint":[3.5,5.5,0],"leftJoints":["ubJ5Kh7Kzh6DiRySw16dSF"],"locked":false,"rightJoints":["96zUdoDkw4WNfs9uwWoQAg"],"lx":6.999999999999999,"ly":0.3,"rightRoofHeight":5.5,"cx":4.440892098500626e-16,"lz":5.5,"rightPoint":[-3.499999999999999,5.5,0],"id":"3poxNxgtfpKbeLU5s5wzoP","textureType":"Wall Texture Default","type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","parentId":"hSQpUbAbHNwPXWwTfmLQQ9","rightPoint":[3.499999999999996,5.500000000000007,0],"color":"white","id":"ubJ5Kh7Kzh6DiRySw16dSF","leftRoofHeight":5.5,"relativeAngle":1.5707963267948974,"normal":[0,0,1],"cx":3.4999999999999982,"roofId":"runBfYomSfd687Gchj63SZ","rotation":[0,0,2.731440279371126],"cz":0,"rightRoofHeight":5.5,"lx":6.000000000000007,"selected":false,"locked":false,"centerRoofHeight":[0.5,5.5],"ly":0.3,"leftPoint":[3.5,-0.5,0],"textureType":"Wall Texture Default","rightJoints":["3poxNxgtfpKbeLU5s5wzoP"],"leftJoints":["5n3uXwW2AJxGx3HRvGRLXX"],"cy":2.5000000000000036,"lz":5.5,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"id":"96zUdoDkw4WNfs9uwWoQAg","rightJoints":["5n3uXwW2AJxGx3HRvGRLXX"],"centerRoofHeight":[-0.5,5.5],"foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","locked":false,"type":"Wall","ly":0.3,"relativeAngle":4.71238898038469,"parentId":"hSQpUbAbHNwPXWwTfmLQQ9","leftRoofHeight":5.5,"roofId":"runBfYomSfd687Gchj63SZ","textureType":"Wall Texture Default","normal":[0,0,1],"cy":2.5,"rightPoint":[-3.5,-0.5,0],"rightRoofHeight":5.5,"lx":6,"rotation":[0,0,2.731440279371126],"cx":-3.4999999999999996,"selected":false,"color":"white","leftPoint":[-3.499999999999999,5.5,0],"leftJoints":["3poxNxgtfpKbeLU5s5wzoP"],"lz":5.5,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"selected":false,"parentId":"hSQpUbAbHNwPXWwTfmLQQ9","color":"white","leftJoints":["96zUdoDkw4WNfs9uwWoQAg"],"cy":-0.5000000000000013,"lz":5.5,"textureType":"Wall Texture Default","relativeAngle":3.806478941571964e-16,"type":"Wall","leftPoint":[-3.500000000000002,-0.5000000000000027,0],"lx":7.000000000000002,"leftRoofHeight":5.5,"roofId":"runBfYomSfd687Gchj63SZ","cx":-1.1102230246251565e-15,"rightJoints":["ubJ5Kh7Kzh6DiRySw16dSF"],"rotation":[0,0,2.731440279371126],"id":"5n3uXwW2AJxGx3HRvGRLXX","rightRoofHeight":5.5,"locked":false,"cz":0,"rightPoint":[3.5,-0.5,0],"foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","ly":0.3,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.5,"rightTopPartialHeight":5.5},{"parentId":"hSQpUbAbHNwPXWwTfmLQQ9","cy":0,"ly":0,"textureType":"No Roof Texture","lz":0,"rotation":[0,0,2.731440279371126],"ridgeRightPoint":[0.5,1],"locked":false,"type":"Roof","foundationId":"hSQpUbAbHNwPXWwTfmLQQ9","roofType":"Gable","thickness":0.2,"color":"#ffffff","id":"runBfYomSfd687Gchj63SZ","selected":false,"wallsId":["5n3uXwW2AJxGx3HRvGRLXX"],"normal":[0,0,1],"cz":0,"ridgeLeftPoint":[-0.5,1],"cx":0,"lx":0,"rise":0,"ceiling":false},{"solarAbsorberPipe":{},"type":"Foundation","rotation":[0,0,2.731440279371126],"selected":false,"solarUpdraftTower":{},"cx":-20.62568109333218,"lz":1,"id":"hSQpUbAbHNwPXWwTfmLQQ9","ly":13.609083182601537,"cy":-78.08358970074559,"locked":false,"parentId":"Ground","lx":9.87769053193653,"cz":0.5,"normal":[0,0,1],"solarPowerTower":{}},{"id":"g5QrsNM3GmBsG5THTKDrtm","lx":0,"lz":0,"locked":false,"color":"#ffffff","parentId":"jsSCnAypzh29RxPH7MED73","thickness":0.2,"showLabel":false,"cx":0,"textureType":"No Roof Texture","ridgeLeftPoint":[-0.5,1],"rotation":[0,0,0],"cy":0,"lineColor":"black","roofType":"Gable","normal":[0,0,1],"type":"Roof","selected":false,"wallsId":["6QCJ15fiFxBVfmQVYdq3Tt"],"ly":0,"ridgeRightPoint":[0.5,1],"cz":0,"lineWidth":0.2,"foundationId":"jsSCnAypzh29RxPH7MED73","rise":0,"ceiling":false},{"locked":false,"ly":0.3,"lz":11,"rightRoofHeight":11,"textureType":"Wall Texture Default","cy":1.3672430244223936,"cz":0,"selected":false,"roofId":"vSTpyGi1WSV73vjm9ifaVF","type":"Wall","color":"white","leftRoofHeight":11,"rightJoints":["6h7WjPWFBQymjBKRVYEU1F"],"relativeAngle":3.1415926535897927,"normal":[0,0,1],"foundationId":"tL1dWhNk5SYJrYMJekBQPT","leftPoint":[3.0949416757515893,1.3672430244223912,0],"parentId":"tL1dWhNk5SYJrYMJekBQPT","rotation":[0,0,-0.41015237421866746],"leftJoints":["884js7wUi92VZEx6c9MoMb"],"lx":6.167453096699541,"id":"sjiccDfBPmjs7njCd2f7Zn","rightPoint":[-3.072511420947951,1.3672430244223959,0],"cx":0.01121512740181907,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":7.1624734368285194,"type":"Wall","ly":0.3,"textureType":"Wall Texture Default","foundationId":"tL1dWhNk5SYJrYMJekBQPT","leftJoints":["bbdCECR63r6BPqRgAaaEkx"],"rotation":[0,0,-0.41015237421866746],"centerRoofHeight":[-0.5,11],"cz":0,"roofId":"vSTpyGi1WSV73vjm9ifaVF","rightPoint":[3.0949416757515893,1.3672430244223912,0],"leftPoint":[3.094941675751588,-5.795230412406128,0],"cx":3.0949416757515884,"rightRoofHeight":11,"rightJoints":["sjiccDfBPmjs7njCd2f7Zn"],"color":"white","normal":[0,0,1],"leftRoofHeight":11,"parentId":"tL1dWhNk5SYJrYMJekBQPT","relativeAngle":1.5707963267948963,"selected":false,"id":"884js7wUi92VZEx6c9MoMb","cy":-2.2139936939918683,"lz":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"rightPoint":[3.094941675751588,-5.795230412406128,0],"leftRoofHeight":11,"selected":false,"id":"bbdCECR63r6BPqRgAaaEkx","rightJoints":["884js7wUi92VZEx6c9MoMb"],"rightRoofHeight":11,"cx":0.011215127401820624,"parentId":"tL1dWhNk5SYJrYMJekBQPT","relativeAngle":0,"cz":0,"rotation":[0,0,-0.41015237421866746],"textureType":"Wall Texture Default","cy":-5.795230412406128,"color":"white","lz":11,"leftJoints":["6h7WjPWFBQymjBKRVYEU1F"],"locked":false,"roofId":"vSTpyGi1WSV73vjm9ifaVF","type":"Wall","leftPoint":[-3.0725114209479467,-5.795230412406128,0],"foundationId":"tL1dWhNk5SYJrYMJekBQPT","lx":6.167453096699535,"normal":[0,0,1],"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"rightPoint":[-3.0725114209479467,-5.795230412406128,0],"locked":false,"rightRoofHeight":11,"normal":[0,0,1],"selected":false,"relativeAngle":-1.570796326794896,"color":"white","lx":7.162473436828524,"type":"Wall","rotation":[0,0,-0.41015237421866746],"cx":-3.072511420947949,"leftPoint":[-3.072511420947951,1.3672430244223959,0],"ly":0.3,"foundationId":"tL1dWhNk5SYJrYMJekBQPT","textureType":"Wall Texture Default","id":"6h7WjPWFBQymjBKRVYEU1F","cz":0,"centerRoofHeight":[0.5,11],"lz":11,"leftRoofHeight":11,"rightJoints":["bbdCECR63r6BPqRgAaaEkx"],"parentId":"tL1dWhNk5SYJrYMJekBQPT","cy":-2.213993693991866,"roofId":"vSTpyGi1WSV73vjm9ifaVF","leftJoints":["sjiccDfBPmjs7njCd2f7Zn"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"foundationId":"tL1dWhNk5SYJrYMJekBQPT","cz":0,"textureType":"No Roof Texture","lz":0,"lx":0,"ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"rotation":[0,0,0],"cy":0,"type":"Roof","selected":false,"cx":0,"ly":0,"thickness":0.2,"wallsId":["sjiccDfBPmjs7njCd2f7Zn"],"id":"vSTpyGi1WSV73vjm9ifaVF","parentId":"tL1dWhNk5SYJrYMJekBQPT","color":"#ffffff","roofType":"Gable","locked":false,"normal":[0,0,1],"rise":0,"ceiling":false},{"cy":-47.30267633910208,"color":"#808080","rotation":[0,0,-0.41015237421866746],"parentId":"Ground","cx":33.062760716057014,"lz":1,"solarUpdraftTower":{},"ly":12.02473099186649,"solarAbsorberPipe":{},"normal":[0,0,1],"lx":6.9193101388799265,"locked":false,"selected":false,"cz":0.5,"id":"tL1dWhNk5SYJrYMJekBQPT","solarPowerTower":{},"type":"Foundation"},{"textureType":"Wall Texture Default","normal":[0,0,1],"locked":false,"cz":0,"lz":11,"rotation":[0,0,-0.41015237421866746],"ly":0.3,"parentId":"fHceZhM7YfHkRpJA2Esq6q","leftJoints":["bsAJpLn9jN322sM8DpUqNT"],"color":"white","rightRoofHeight":11,"rightJoints":["9zXV5uFN4dSMYxBWBituAB"],"foundationId":"fHceZhM7YfHkRpJA2Esq6q","relativeAngle":3.1415926535897927,"roofId":"uKCQp7m7UvcYMBhFBR8GT7","cx":0.01121512740181907,"lx":6.167453096699541,"leftRoofHeight":11,"leftPoint":[3.0949416757515893,1.3672430244223912,0],"rightPoint":[-3.072511420947951,1.3672430244223959,0],"id":"jDBrbsB7AgYxXtiw7hRkBD","selected":false,"cy":1.3672430244223936,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cx":3.0949416757515884,"relativeAngle":1.5707963267948963,"centerRoofHeight":[-0.5,11],"parentId":"fHceZhM7YfHkRpJA2Esq6q","cy":-2.2139936939918683,"normal":[0,0,1],"rightPoint":[3.0949416757515893,1.3672430244223912,0],"color":"white","textureType":"Wall Texture Default","roofId":"uKCQp7m7UvcYMBhFBR8GT7","leftPoint":[3.094941675751588,-5.795230412406128,0],"ly":0.3,"leftJoints":["qjfMazdqWCR3Emu8xMPVFZ"],"lx":7.1624734368285194,"foundationId":"fHceZhM7YfHkRpJA2Esq6q","selected":false,"rightRoofHeight":11,"locked":false,"leftRoofHeight":11,"rotation":[0,0,-0.41015237421866746],"rightJoints":["jDBrbsB7AgYxXtiw7hRkBD"],"lz":11,"cz":0,"type":"Wall","id":"bsAJpLn9jN322sM8DpUqNT","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":6.167453096699535,"leftJoints":["9zXV5uFN4dSMYxBWBituAB"],"relativeAngle":0,"color":"white","rightRoofHeight":11,"normal":[0,0,1],"id":"qjfMazdqWCR3Emu8xMPVFZ","ly":0.3,"lz":11,"cx":0.011215127401820624,"rightPoint":[3.094941675751588,-5.795230412406128,0],"roofId":"uKCQp7m7UvcYMBhFBR8GT7","textureType":"Wall Texture Default","type":"Wall","selected":false,"cy":-5.795230412406128,"parentId":"fHceZhM7YfHkRpJA2Esq6q","leftRoofHeight":11,"locked":false,"leftPoint":[-3.0725114209479467,-5.795230412406128,0],"rotation":[0,0,-0.41015237421866746],"cz":0,"rightJoints":["bsAJpLn9jN322sM8DpUqNT"],"foundationId":"fHceZhM7YfHkRpJA2Esq6q","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cy":-2.213993693991866,"parentId":"fHceZhM7YfHkRpJA2Esq6q","rightPoint":[-3.0725114209479467,-5.795230412406128,0],"id":"9zXV5uFN4dSMYxBWBituAB","leftPoint":[-3.072511420947951,1.3672430244223959,0],"lx":7.162473436828524,"locked":false,"rightJoints":["qjfMazdqWCR3Emu8xMPVFZ"],"centerRoofHeight":[0.5,11],"selected":false,"color":"white","textureType":"Wall Texture Default","cz":0,"leftRoofHeight":11,"cx":-3.072511420947949,"leftJoints":["jDBrbsB7AgYxXtiw7hRkBD"],"foundationId":"fHceZhM7YfHkRpJA2Esq6q","ly":0.3,"roofId":"uKCQp7m7UvcYMBhFBR8GT7","rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"rightRoofHeight":11,"lz":11,"type":"Wall","relativeAngle":-1.570796326794896,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":0,"cz":0,"thickness":0.2,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"ly":0,"selected":false,"parentId":"fHceZhM7YfHkRpJA2Esq6q","wallsId":["jDBrbsB7AgYxXtiw7hRkBD"],"textureType":"No Roof Texture","foundationId":"fHceZhM7YfHkRpJA2Esq6q","cy":0,"roofType":"Gable","id":"uKCQp7m7UvcYMBhFBR8GT7","color":"#ffffff","type":"Roof","locked":false,"cx":0,"rotation":[0,0,0],"lz":0,"normal":[0,0,1],"rise":0,"ceiling":false},{"type":"Foundation","selected":false,"cz":0.5,"lx":6.9193101388799265,"parentId":"Ground","cx":25.793727800925453,"solarPowerTower":{},"ly":12.02473099186649,"color":"#808080","solarUpdraftTower":{},"lz":1,"solarAbsorberPipe":{},"id":"fHceZhM7YfHkRpJA2Esq6q","normal":[0,0,1],"rotation":[0,0,-0.41015237421866746],"cy":-44.150742219854976,"locked":false},{"id":"eDUMHr2NcH2Gn7xk4o7aw9","cy":1.3672430244223936,"textureType":"Wall Texture Default","lx":6.167453096699541,"relativeAngle":3.1415926535897927,"rotation":[0,0,2.731440279371126],"rightJoints":["dBRLXzBSe497rzH2ZCcM82"],"roofId":"4m5SMiyzXUqv7MDwHxMrqg","type":"Wall","normal":[0,0,1],"parentId":"fs8r4ERWJ4tuBZW1NUtMpb","lz":11,"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","rightRoofHeight":11,"cz":0,"ly":0.3,"cx":0.01121512740181907,"leftRoofHeight":11,"rightPoint":[-3.072511420947951,1.3672430244223959,0],"color":"white","leftJoints":["6ev87RFfruvs5gvArbaReo"],"selected":false,"leftPoint":[3.0949416757515893,1.3672430244223912,0],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":7.1624734368285194,"cy":-2.2139936939918683,"normal":[0,0,1],"rightJoints":["eDUMHr2NcH2Gn7xk4o7aw9"],"rightPoint":[3.0949416757515893,1.3672430244223912,0],"rotation":[0,0,2.731440279371126],"relativeAngle":1.5707963267948963,"lz":11,"selected":false,"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","type":"Wall","roofId":"4m5SMiyzXUqv7MDwHxMrqg","leftJoints":["wYP5AC8pKwpu2zvkHKJuyw"],"parentId":"fs8r4ERWJ4tuBZW1NUtMpb","centerRoofHeight":[-0.5,11],"color":"white","textureType":"Wall Texture Default","leftRoofHeight":11,"cx":3.0949416757515884,"cz":0,"leftPoint":[3.094941675751588,-5.795230412406128,0],"id":"6ev87RFfruvs5gvArbaReo","ly":0.3,"rightRoofHeight":11,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cx":0.011215127401820624,"color":"white","parentId":"fs8r4ERWJ4tuBZW1NUtMpb","relativeAngle":0,"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","id":"wYP5AC8pKwpu2zvkHKJuyw","selected":false,"lx":6.167453096699535,"type":"Wall","rightPoint":[3.094941675751588,-5.795230412406128,0],"lz":11,"rightRoofHeight":11,"normal":[0,0,1],"leftRoofHeight":11,"rightJoints":["6ev87RFfruvs5gvArbaReo"],"cy":-5.795230412406128,"rotation":[0,0,2.731440279371126],"textureType":"Wall Texture Default","cz":0,"roofId":"4m5SMiyzXUqv7MDwHxMrqg","leftPoint":[-3.0725114209479467,-5.795230412406128,0],"leftJoints":["dBRLXzBSe497rzH2ZCcM82"],"ly":0.3,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"rightJoints":["wYP5AC8pKwpu2zvkHKJuyw"],"textureType":"Wall Texture Default","lz":11,"cy":-2.213993693991866,"roofId":"4m5SMiyzXUqv7MDwHxMrqg","cz":0,"rightPoint":[-3.0725114209479467,-5.795230412406128,0],"ly":0.3,"relativeAngle":-1.570796326794896,"type":"Wall","lx":7.162473436828524,"rightRoofHeight":11,"centerRoofHeight":[0.5,11],"color":"white","rotation":[0,0,2.731440279371126],"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","leftRoofHeight":11,"cx":-3.072511420947949,"leftPoint":[-3.072511420947951,1.3672430244223959,0],"normal":[0,0,1],"parentId":"fs8r4ERWJ4tuBZW1NUtMpb","id":"dBRLXzBSe497rzH2ZCcM82","selected":false,"leftJoints":["eDUMHr2NcH2Gn7xk4o7aw9"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Roof","id":"4m5SMiyzXUqv7MDwHxMrqg","lz":0,"cy":0,"lx":0,"ridgeRightPoint":[0.5,1],"normal":[0,0,1],"cz":0,"wallsId":["eDUMHr2NcH2Gn7xk4o7aw9"],"foundationId":"fs8r4ERWJ4tuBZW1NUtMpb","roofType":"Gable","thickness":0.2,"textureType":"No Roof Texture","ridgeLeftPoint":[-0.5,1],"selected":false,"parentId":"fs8r4ERWJ4tuBZW1NUtMpb","color":"#ffffff","ly":0,"cx":0,"rotation":[0,0,2.731440279371126],"rise":0,"ceiling":false},{"cy":-87.33804902014363,"parentId":"Ground","id":"fs8r4ERWJ4tuBZW1NUtMpb","lz":1,"solarAbsorberPipe":{},"selected":false,"type":"Foundation","solarUpdraftTower":{},"color":"#808080","cx":24.611820076821594,"normal":[0,0,1],"ly":12.02473099186649,"rotation":[0,0,2.731440279371126],"lx":6.9193101388799265,"cz":0.5,"solarPowerTower":{}},{"type":"Wall","foundationId":"jj54TnbPPLQx19RofY6bBx","color":"white","relativeAngle":3.1415926535897927,"leftRoofHeight":11,"textureType":"Wall Texture Default","leftPoint":[3.0949416757515893,1.3672430244223912,0],"leftJoints":["a4sxwAfDyYN2ctPYayZ8Rp"],"lx":6.167453096699541,"rightJoints":["jpAZ9atyqHZpxDMMXDH32S"],"lz":11,"rightPoint":[-3.072511420947951,1.3672430244223959,0],"id":"eHL2VLecmq9sobBZmGw45i","ly":0.3,"normal":[0,0,1],"roofId":"aNwaGHwp5cd46aLgfhTdkk","rotation":[0,0,2.731440279371126],"rightRoofHeight":11,"cx":0.01121512740181907,"cz":0,"selected":false,"cy":1.3672430244223936,"parentId":"jj54TnbPPLQx19RofY6bBx","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"textureType":"Wall Texture Default","normal":[0,0,1],"centerRoofHeight":[-0.5,11],"parentId":"jj54TnbPPLQx19RofY6bBx","cz":0,"leftRoofHeight":11,"rotation":[0,0,2.731440279371126],"selected":false,"id":"a4sxwAfDyYN2ctPYayZ8Rp","foundationId":"jj54TnbPPLQx19RofY6bBx","ly":0.3,"leftJoints":["ntgMQTFPjEa6eGdeyqZWjE"],"cy":-2.2139936939918683,"rightPoint":[3.0949416757515893,1.3672430244223912,0],"roofId":"aNwaGHwp5cd46aLgfhTdkk","lz":11,"color":"white","lx":7.1624734368285194,"cx":3.0949416757515884,"leftPoint":[3.094941675751588,-5.795230412406128,0],"rightRoofHeight":11,"rightJoints":["eHL2VLecmq9sobBZmGw45i"],"relativeAngle":1.5707963267948963,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"leftPoint":[-3.0725114209479467,-5.795230412406128,0],"type":"Wall","rightPoint":[3.094941675751588,-5.795230412406128,0],"roofId":"aNwaGHwp5cd46aLgfhTdkk","lz":11,"rotation":[0,0,2.731440279371126],"rightJoints":["a4sxwAfDyYN2ctPYayZ8Rp"],"leftRoofHeight":11,"cy":-5.795230412406128,"leftJoints":["jpAZ9atyqHZpxDMMXDH32S"],"cz":0,"relativeAngle":0,"foundationId":"jj54TnbPPLQx19RofY6bBx","color":"white","cx":0.011215127401820624,"normal":[0,0,1],"rightRoofHeight":11,"ly":0.3,"lx":6.167453096699535,"selected":false,"textureType":"Wall Texture Default","id":"ntgMQTFPjEa6eGdeyqZWjE","parentId":"jj54TnbPPLQx19RofY6bBx","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"color":"white","rightJoints":["ntgMQTFPjEa6eGdeyqZWjE"],"ly":0.3,"type":"Wall","cy":-2.213993693991866,"selected":false,"rotation":[0,0,2.731440279371126],"normal":[0,0,1],"lz":11,"leftRoofHeight":11,"textureType":"Wall Texture Default","leftJoints":["eHL2VLecmq9sobBZmGw45i"],"roofId":"aNwaGHwp5cd46aLgfhTdkk","centerRoofHeight":[0.5,11],"rightRoofHeight":11,"id":"jpAZ9atyqHZpxDMMXDH32S","leftPoint":[-3.072511420947951,1.3672430244223959,0],"relativeAngle":-1.570796326794896,"foundationId":"jj54TnbPPLQx19RofY6bBx","rightPoint":[-3.0725114209479467,-5.795230412406128,0],"parentId":"jj54TnbPPLQx19RofY6bBx","cz":0,"cx":-3.072511420947949,"lx":7.162473436828524,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":0,"color":"#ffffff","normal":[0,0,1],"thickness":0.2,"wallsId":["eHL2VLecmq9sobBZmGw45i"],"ridgeRightPoint":[0.5,1],"textureType":"No Roof Texture","cy":0,"foundationId":"jj54TnbPPLQx19RofY6bBx","cx":0,"ridgeLeftPoint":[-0.5,1],"rotation":[0,0,2.731440279371126],"selected":false,"id":"aNwaGHwp5cd46aLgfhTdkk","parentId":"jj54TnbPPLQx19RofY6bBx","roofType":"Gable","lz":0,"ly":0,"type":"Roof","cz":0,"rise":0,"ceiling":false},{"color":"#808080","selected":false,"lx":6.9193101388799265,"lz":1,"type":"Foundation","cz":0.5,"solarPowerTower":{},"solarUpdraftTower":{},"ly":12.02473099186649,"parentId":"Ground","normal":[0,0,1],"solarAbsorberPipe":{},"cy":-83.96400506720003,"id":"jj54TnbPPLQx19RofY6bBx","rotation":[0,0,2.731440279371126],"cx":16.965503952859194},{"color":"white","leftJoints":["1grZuTdR63nsQE356nWnzd"],"type":"Wall","ly":0.3,"rightJoints":["273cTJKK381CJaxKCfBNJW"],"cz":0,"roofId":"5kL2iBLvr52ipCNA3bs5cq","rightPoint":[-3.072511420947951,1.3672430244223959,0],"rotation":[0,0,2.731440279371126],"lz":11,"lx":6.167453096699541,"parentId":"7sPS9WfdHAu8wqjpcnPHgs","leftRoofHeight":11,"cy":1.3672430244223936,"textureType":"Wall Texture Default","normal":[0,0,1],"relativeAngle":3.1415926535897927,"foundationId":"7sPS9WfdHAu8wqjpcnPHgs","selected":false,"cx":0.01121512740181907,"leftPoint":[3.0949416757515893,1.3672430244223912,0],"rightRoofHeight":11,"id":"qgRfDLTUB6zC4mGwstgdHV","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"relativeAngle":1.5707963267948963,"rightJoints":["qgRfDLTUB6zC4mGwstgdHV"],"leftJoints":["s1pLuQJKHQfm1KbkXQK17L"],"color":"white","rightRoofHeight":11,"ly":0.3,"leftRoofHeight":11,"lz":11,"id":"1grZuTdR63nsQE356nWnzd","parentId":"7sPS9WfdHAu8wqjpcnPHgs","roofId":"5kL2iBLvr52ipCNA3bs5cq","normal":[0,0,1],"lx":7.1624734368285194,"leftPoint":[3.094941675751588,-5.795230412406128,0],"centerRoofHeight":[-0.5,11],"foundationId":"7sPS9WfdHAu8wqjpcnPHgs","cz":0,"textureType":"Wall Texture Default","rotation":[0,0,2.731440279371126],"type":"Wall","selected":false,"rightPoint":[3.0949416757515893,1.3672430244223912,0],"cy":-2.2139936939918683,"cx":3.0949416757515884,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"color":"white","cx":0.011215127401820624,"normal":[0,0,1],"textureType":"Wall Texture Default","cz":0,"type":"Wall","ly":0.3,"lz":11,"rightJoints":["1grZuTdR63nsQE356nWnzd"],"foundationId":"7sPS9WfdHAu8wqjpcnPHgs","rotation":[0,0,2.731440279371126],"cy":-5.795230412406128,"leftPoint":[-3.0725114209479467,-5.795230412406128,0],"rightRoofHeight":11,"parentId":"7sPS9WfdHAu8wqjpcnPHgs","lx":6.167453096699535,"leftRoofHeight":11,"roofId":"5kL2iBLvr52ipCNA3bs5cq","rightPoint":[3.094941675751588,-5.795230412406128,0],"leftJoints":["273cTJKK381CJaxKCfBNJW"],"id":"s1pLuQJKHQfm1KbkXQK17L","relativeAngle":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lz":11,"rightPoint":[-3.0725114209479467,-5.795230412406128,0],"normal":[0,0,1],"type":"Wall","rotation":[0,0,2.731440279371126],"textureType":"Wall Texture Default","lx":7.162473436828524,"selected":false,"cx":-3.072511420947949,"relativeAngle":-1.570796326794896,"parentId":"7sPS9WfdHAu8wqjpcnPHgs","cy":-2.213993693991866,"cz":0,"color":"white","foundationId":"7sPS9WfdHAu8wqjpcnPHgs","id":"273cTJKK381CJaxKCfBNJW","rightJoints":["s1pLuQJKHQfm1KbkXQK17L"],"rightRoofHeight":11,"leftRoofHeight":11,"leftPoint":[-3.072511420947951,1.3672430244223959,0],"ly":0.3,"roofId":"5kL2iBLvr52ipCNA3bs5cq","centerRoofHeight":[0.5,11],"leftJoints":["qgRfDLTUB6zC4mGwstgdHV"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"ridgeRightPoint":[0.5,1],"type":"Roof","cx":0,"wallsId":["qgRfDLTUB6zC4mGwstgdHV"],"ly":0,"cz":0,"thickness":0.2,"normal":[0,0,1],"rotation":[0,0,2.731440279371126],"color":"#ffffff","lx":0,"roofType":"Gable","lz":0,"textureType":"No Roof Texture","cy":0,"id":"5kL2iBLvr52ipCNA3bs5cq","parentId":"7sPS9WfdHAu8wqjpcnPHgs","ridgeLeftPoint":[-0.5,1],"foundationId":"7sPS9WfdHAu8wqjpcnPHgs","rise":0,"ceiling":false},{"selected":false,"ly":12.02473099186649,"parentId":"Ground","cx":8.897542847512511,"lz":1,"solarPowerTower":{},"rotation":[0,0,2.731440279371126],"solarUpdraftTower":{},"solarAbsorberPipe":{},"color":"#808080","normal":[0,0,1],"cz":0.5,"cy":-80.50493585333112,"type":"Foundation","id":"7sPS9WfdHAu8wqjpcnPHgs","lx":6.9193101388799265},{"wallsId":["3JjPc2Pp9fAroM9UdivE1u"],"lx":0,"color":"#ffffff","rotation":[0,0,0],"foundationId":"a7Ykq8sCMoZy5zM2ybNhKs","showLabel":false,"textureType":"No Roof Texture","lz":0,"id":"qYDMJTekV8NWHzzCiVYwcs","type":"Roof","ridgeRightPoint":[0,1],"normal":[0,0,1],"lineColor":"black","roofType":"Gable","cx":0,"thickness":0.2,"cy":0,"parentId":"a7Ykq8sCMoZy5zM2ybNhKs","ly":0,"ridgeLeftPoint":[0,1],"cz":0,"selected":false,"lineWidth":0.2,"rise":0.9752174096903712,"ceiling":false},{"lx":9.337227070632437,"rightPoint":[-4.747688161235284,3.351698633040855,0],"lz":5.25,"rightJoints":["aS3LNujiVdR6Qawgwx71Xp"],"leftJoints":["b5WAAJ2sso2rc9V8yZ7iom"],"parentId":"b9sLhFsxP7jM5xLzyG2m8E","textureType":"Wall Texture Default","normal":[0,0,1],"type":"Wall","leftRoofHeight":5.25,"selected":false,"cz":0,"relativeAngle":3.141592653589793,"leftPoint":[4.589538909397152,3.3516986330408534,0],"color":"white","ly":0.3,"rotation":[0,0,-0.41015237421866746],"rightRoofHeight":5.25,"centerRoofHeight":[0,6.225217409690371],"roofId":"e9ZJ6jf8buNcpSGMCbcrrA","cx":-0.07907462591906578,"cy":3.3516986330408542,"foundationId":"b9sLhFsxP7jM5xLzyG2m8E","id":"bCNGD8BAzXepM4A7Cp5qfr","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"leftRoofHeight":5.25,"relativeAngle":1.5707963267948961,"lx":6.320731749368616,"color":"white","leftPoint":[4.58953890939715,-2.969033116327763,0],"cy":0.19133275835654517,"ly":0.3,"id":"b5WAAJ2sso2rc9V8yZ7iom","normal":[0,0,1],"type":"Wall","foundationId":"b9sLhFsxP7jM5xLzyG2m8E","rightPoint":[4.589538909397152,3.3516986330408534,0],"rotation":[0,0,-0.41015237421866746],"rightJoints":["bCNGD8BAzXepM4A7Cp5qfr"],"lz":5.25,"leftJoints":["9sNfcLVjGqnn14Dpdib7wD"],"rightRoofHeight":5.25,"roofId":"e9ZJ6jf8buNcpSGMCbcrrA","textureType":"Wall Texture Default","selected":false,"parentId":"b9sLhFsxP7jM5xLzyG2m8E","cz":0,"cx":4.589538909397151,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"rightPoint":[4.58953890939715,-2.969033116327763,0],"rotation":[0,0,-0.41015237421866746],"ly":0.3,"lx":9.337227070632434,"cy":-2.969033116327763,"type":"Wall","lz":5.25,"leftRoofHeight":5.25,"roofId":"e9ZJ6jf8buNcpSGMCbcrrA","leftPoint":[-4.747688161235283,-2.9690331163277626,0],"id":"9sNfcLVjGqnn14Dpdib7wD","centerRoofHeight":[0,6.225217409690371],"foundationId":"b9sLhFsxP7jM5xLzyG2m8E","selected":false,"textureType":"Wall Texture Default","cx":-0.07907462591906667,"parentId":"b9sLhFsxP7jM5xLzyG2m8E","cz":0,"relativeAngle":-4.756114491922529e-17,"leftJoints":["aS3LNujiVdR6Qawgwx71Xp"],"rightJoints":["b5WAAJ2sso2rc9V8yZ7iom"],"color":"white","rightRoofHeight":5.25,"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"leftRoofHeight":5.25,"selected":false,"textureType":"Wall Texture Default","roofId":"e9ZJ6jf8buNcpSGMCbcrrA","rightPoint":[-4.747688161235283,-2.9690331163277626,0],"relativeAngle":-1.5707963267948966,"rightRoofHeight":5.25,"foundationId":"b9sLhFsxP7jM5xLzyG2m8E","lx":6.320731749368617,"color":"white","rightJoints":["9sNfcLVjGqnn14Dpdib7wD"],"parentId":"b9sLhFsxP7jM5xLzyG2m8E","id":"aS3LNujiVdR6Qawgwx71Xp","type":"Wall","normal":[0,0,1],"leftPoint":[-4.747688161235284,3.351698633040855,0],"rotation":[0,0,-0.41015237421866746],"leftJoints":["bCNGD8BAzXepM4A7Cp5qfr"],"cz":0,"ly":0.3,"cy":0.19133275835654628,"cx":-4.747688161235283,"lz":5.25,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"parentId":"b9sLhFsxP7jM5xLzyG2m8E","thickness":0.2,"ly":0,"roofType":"Gable","normal":[0,0,1],"wallsId":["b5WAAJ2sso2rc9V8yZ7iom"],"cy":0,"cz":0,"id":"e9ZJ6jf8buNcpSGMCbcrrA","ridgeRightPoint":[0,1],"foundationId":"b9sLhFsxP7jM5xLzyG2m8E","ridgeLeftPoint":[0,1],"cx":0,"rotation":[0,0,0],"selected":false,"textureType":"No Roof Texture","type":"Roof","color":"#ffffff","lz":0,"lx":0,"rise":0.9752174096903712,"ceiling":false},{"selected":false,"solarUpdraftTower":{},"lz":1,"rotation":[0,0,-0.41015237421866746],"normal":[0,0,1],"solarPowerTower":{},"lx":10.667610013832563,"solarAbsorberPipe":{},"color":"#808080","ly":10.658064363814518,"cz":0.5,"type":"Foundation","cx":15.65777292096255,"id":"b9sLhFsxP7jM5xLzyG2m8E","cy":-23.209117764580718,"parentId":"Ground"},{"lz":5.25,"foundationId":"gcZv1t7Cby2WKRNnett3ui","rightPoint":[-4.747688161235284,3.351698633040855,0],"leftPoint":[4.589538909397152,3.3516986330408534,0],"parentId":"gcZv1t7Cby2WKRNnett3ui","relativeAngle":3.141592653589793,"cz":0,"leftJoints":["aTEF4j2yHMBMrPfT9T9EdT"],"rightRoofHeight":5.25,"selected":false,"ly":0.3,"type":"Wall","lx":9.337227070632437,"cy":3.3516986330408542,"textureType":"Wall Texture Default","cx":-0.07907462591906578,"centerRoofHeight":[0,6.225217409690371],"color":"white","id":"9dJMCWVZ7AkDBVYRwiBuju","leftRoofHeight":5.25,"rightJoints":["q6CqZkkwBK9C5a7FRZGdjh"],"normal":[0,0,1],"rotation":[0,0,2.731440279371126],"roofId":"jRbh8euqUSp75DJHpm8gNn","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"normal":[0,0,1],"relativeAngle":1.5707963267948961,"rightRoofHeight":5.25,"rightJoints":["9dJMCWVZ7AkDBVYRwiBuju"],"ly":0.3,"rightPoint":[4.589538909397152,3.3516986330408534,0],"leftRoofHeight":5.25,"leftJoints":["hKTWU47gri3P24HLwd9scm"],"color":"white","lx":6.320731749368616,"selected":false,"rotation":[0,0,2.731440279371126],"cy":0.19133275835654517,"cz":0,"parentId":"gcZv1t7Cby2WKRNnett3ui","roofId":"jRbh8euqUSp75DJHpm8gNn","textureType":"Wall Texture Default","foundationId":"gcZv1t7Cby2WKRNnett3ui","cx":4.589538909397151,"leftPoint":[4.58953890939715,-2.969033116327763,0],"id":"aTEF4j2yHMBMrPfT9T9EdT","type":"Wall","lz":5.25,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"cz":0,"lx":9.337227070632434,"relativeAngle":-4.756114491922529e-17,"rightJoints":["aTEF4j2yHMBMrPfT9T9EdT"],"leftRoofHeight":5.25,"parentId":"gcZv1t7Cby2WKRNnett3ui","rotation":[0,0,2.731440279371126],"cy":-2.969033116327763,"textureType":"Wall Texture Default","centerRoofHeight":[0,6.225217409690371],"cx":-0.07907462591906667,"leftJoints":["q6CqZkkwBK9C5a7FRZGdjh"],"roofId":"jRbh8euqUSp75DJHpm8gNn","color":"white","rightPoint":[4.58953890939715,-2.969033116327763,0],"leftPoint":[-4.747688161235283,-2.9690331163277626,0],"id":"hKTWU47gri3P24HLwd9scm","selected":false,"ly":0.3,"foundationId":"gcZv1t7Cby2WKRNnett3ui","rightRoofHeight":5.25,"normal":[0,0,1],"type":"Wall","lz":5.25,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"rightJoints":["hKTWU47gri3P24HLwd9scm"],"textureType":"Wall Texture Default","roofId":"jRbh8euqUSp75DJHpm8gNn","id":"q6CqZkkwBK9C5a7FRZGdjh","lx":6.320731749368617,"selected":false,"rotation":[0,0,2.731440279371126],"ly":0.3,"cz":0,"cy":0.19133275835654628,"rightRoofHeight":5.25,"color":"white","normal":[0,0,1],"leftJoints":["9dJMCWVZ7AkDBVYRwiBuju"],"leftRoofHeight":5.25,"relativeAngle":-1.5707963267948966,"lz":5.25,"foundationId":"gcZv1t7Cby2WKRNnett3ui","rightPoint":[-4.747688161235283,-2.9690331163277626,0],"type":"Wall","cx":-4.747688161235283,"leftPoint":[-4.747688161235284,3.351698633040855,0],"parentId":"gcZv1t7Cby2WKRNnett3ui","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"wallsId":["aTEF4j2yHMBMrPfT9T9EdT"],"cy":0,"selected":false,"roofType":"Gable","textureType":"No Roof Texture","cx":0,"color":"#ffffff","ridgeLeftPoint":[0,1],"lz":0,"rotation":[0,0,2.731440279371126],"lx":0,"parentId":"gcZv1t7Cby2WKRNnett3ui","thickness":0.2,"foundationId":"gcZv1t7Cby2WKRNnett3ui","normal":[0,0,1],"ridgeRightPoint":[0,1],"ly":0,"id":"jRbh8euqUSp75DJHpm8gNn","cz":0,"type":"Roof","rise":0.9752174096903712,"ceiling":false},{"solarAbsorberPipe":{},"id":"gcZv1t7Cby2WKRNnett3ui","rotation":[0,0,2.731440279371126],"parentId":"Ground","normal":[0,0,1],"color":"#808080","cx":23.588922199683385,"cy":-4.2358171284989465,"ly":10.658064363814518,"type":"Foundation","lz":1,"solarPowerTower":{},"cz":0.5,"solarUpdraftTower":{},"selected":false,"lx":10.667610013832563},{"roofId":"dzARxJ53WwFwsNrhuBLzWG","ly":0.3,"selected":false,"normal":[0,0,1],"type":"Wall","rotation":[0,0,2.731440279371126],"rightRoofHeight":5.25,"lx":9.337227070632437,"lz":5.25,"id":"uBjSfWV5MAS9vnKb4XPdfP","relativeAngle":3.141592653589793,"centerRoofHeight":[0,6.225217409690371],"cy":3.3516986330408542,"rightPoint":[-4.747688161235284,3.351698633040855,0],"rightJoints":["uR2W8UpidEKJWdspykk1aw"],"foundationId":"ceA38nUA7SQynuTCNKi2BV","textureType":"Wall Texture Default","parentId":"ceA38nUA7SQynuTCNKi2BV","cx":-0.07907462591906578,"color":"white","leftPoint":[4.589538909397152,3.3516986330408534,0],"leftRoofHeight":5.25,"leftJoints":["paBZJ3XFdCVFNJ8PkS5wvw"],"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"cy":0.19133275835654517,"foundationId":"ceA38nUA7SQynuTCNKi2BV","relativeAngle":1.5707963267948961,"leftRoofHeight":5.25,"rightPoint":[4.589538909397152,3.3516986330408534,0],"ly":0.3,"textureType":"Wall Texture Default","rotation":[0,0,2.731440279371126],"cx":4.589538909397151,"lx":6.320731749368616,"normal":[0,0,1],"leftPoint":[4.58953890939715,-2.969033116327763,0],"lz":5.25,"rightRoofHeight":5.25,"cz":0,"parentId":"ceA38nUA7SQynuTCNKi2BV","roofId":"dzARxJ53WwFwsNrhuBLzWG","rightJoints":["uBjSfWV5MAS9vnKb4XPdfP"],"leftJoints":["hwrPdC7kZvm4PMhTtpv3Cf"],"selected":false,"color":"white","type":"Wall","id":"paBZJ3XFdCVFNJ8PkS5wvw","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"cz":0,"selected":false,"ly":0.3,"id":"hwrPdC7kZvm4PMhTtpv3Cf","leftRoofHeight":5.25,"leftJoints":["uR2W8UpidEKJWdspykk1aw"],"rightPoint":[4.58953890939715,-2.969033116327763,0],"rightRoofHeight":5.25,"cy":-2.969033116327763,"lx":9.337227070632434,"color":"white","normal":[0,0,1],"textureType":"Wall Texture Default","type":"Wall","cx":-0.07907462591906667,"rotation":[0,0,2.731440279371126],"parentId":"ceA38nUA7SQynuTCNKi2BV","relativeAngle":-4.756114491922529e-17,"roofId":"dzARxJ53WwFwsNrhuBLzWG","leftPoint":[-4.747688161235283,-2.9690331163277626,0],"lz":5.25,"foundationId":"ceA38nUA7SQynuTCNKi2BV","centerRoofHeight":[0,6.225217409690371],"rightJoints":["paBZJ3XFdCVFNJ8PkS5wvw"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"leftRoofHeight":5.25,"type":"Wall","roofId":"dzARxJ53WwFwsNrhuBLzWG","leftJoints":["uBjSfWV5MAS9vnKb4XPdfP"],"leftPoint":[-4.747688161235284,3.351698633040855,0],"rightJoints":["hwrPdC7kZvm4PMhTtpv3Cf"],"normal":[0,0,1],"foundationId":"ceA38nUA7SQynuTCNKi2BV","selected":false,"id":"uR2W8UpidEKJWdspykk1aw","parentId":"ceA38nUA7SQynuTCNKi2BV","rotation":[0,0,2.731440279371126],"cy":0.19133275835654628,"textureType":"Wall Texture Default","ly":0.3,"lx":6.320731749368617,"cx":-4.747688161235283,"color":"white","lz":5.25,"relativeAngle":-1.5707963267948966,"rightRoofHeight":5.25,"rightPoint":[-4.747688161235283,-2.9690331163277626,0],"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.25,"rightTopPartialHeight":5.25},{"type":"Roof","normal":[0,0,1],"cx":0,"rotation":[0,0,2.731440279371126],"foundationId":"ceA38nUA7SQynuTCNKi2BV","lx":0,"parentId":"ceA38nUA7SQynuTCNKi2BV","ridgeRightPoint":[0,1],"color":"#ffffff","ly":0,"selected":false,"thickness":0.2,"roofType":"Gable","cz":0,"id":"dzARxJ53WwFwsNrhuBLzWG","textureType":"No Roof Texture","wallsId":["paBZJ3XFdCVFNJ8PkS5wvw"],"lz":0,"ridgeLeftPoint":[0,1],"cy":0,"rise":0.9752174096903712,"ceiling":false},{"rotation":[0,0,2.731440279371126],"solarPowerTower":{},"selected":false,"type":"Foundation","ly":10.658064363814518,"normal":[0,0,1],"solarUpdraftTower":{},"cy":-13.20207722402062,"solarAbsorberPipe":{},"cx":44.31026086081932,"color":"#808080","cz":0.5,"lx":10.667610013832563,"id":"ceA38nUA7SQynuTCNKi2BV","parentId":"Ground","lz":1},{"rightRoofHeight":11,"foundationId":"88UbNAdWUbzJHGAmrqJWPn","rightJoints":["mqAaf5QtrdpibBSarUk9qt"],"relativeAngle":-3.1415926535897927,"textureType":"Wall Texture Default","type":"Wall","lz":11,"color":"white","cx":0.03303730701620822,"id":"ovU5BwtCwgHA5UHHhibxpu","roofId":"wSxYARgs9umEJRG8XyZbKH","leftPoint":[3.0844752908601185,3.4313212286858272,0],"selected":false,"parentId":"88UbNAdWUbzJHGAmrqJWPn","ly":0.3,"leftRoofHeight":11,"leftJoints":["bWeTZ14zUp93sauz9hT9ba"],"rotation":[0,0,-0.41015237421866746],"lx":6.102875967687821,"normal":[0,0,1],"rightPoint":[-3.018400676827702,3.431321228685824,0],"cy":3.4313212286858255,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lz":11,"rightJoints":["ovU5BwtCwgHA5UHHhibxpu"],"color":"white","foundationId":"88UbNAdWUbzJHGAmrqJWPn","parentId":"88UbNAdWUbzJHGAmrqJWPn","relativeAngle":1.5707963267948963,"rightPoint":[3.0844752908601185,3.4313212286858272,0],"textureType":"Wall Texture Default","rotation":[0,0,-0.41015237421866746],"cy":-1.4345548840225932,"roofId":"wSxYARgs9umEJRG8XyZbKH","type":"Wall","leftJoints":["8kMoucgjs3KynPyoZExz4J"],"ly":0.3,"rightRoofHeight":11,"leftRoofHeight":11,"lx":9.731752225416841,"leftPoint":[3.0844752908601167,-6.300430996731014,0],"selected":false,"cz":0,"normal":[0,0,1],"id":"bWeTZ14zUp93sauz9hT9ba","cx":3.0844752908601176,"centerRoofHeight":[-0.5,11],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"cy":-6.300430996731012,"cx":0.03303730701620533,"leftRoofHeight":11,"relativeAngle":-5.821376180034847e-16,"selected":false,"rotation":[0,0,-0.41015237421866746],"leftJoints":["mqAaf5QtrdpibBSarUk9qt"],"leftPoint":[-3.018400676827706,-6.30043099673101,0],"foundationId":"88UbNAdWUbzJHGAmrqJWPn","id":"8kMoucgjs3KynPyoZExz4J","type":"Wall","rightPoint":[3.0844752908601167,-6.300430996731014,0],"normal":[0,0,1],"textureType":"Wall Texture Default","color":"white","roofId":"wSxYARgs9umEJRG8XyZbKH","cz":0,"lx":6.102875967687822,"rightJoints":["bWeTZ14zUp93sauz9hT9ba"],"parentId":"88UbNAdWUbzJHGAmrqJWPn","ly":0.3,"lz":11,"rightRoofHeight":11,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"rightPoint":[-3.018400676827706,-6.30043099673101,0],"id":"mqAaf5QtrdpibBSarUk9qt","centerRoofHeight":[0.5,11],"leftPoint":[-3.018400676827702,3.431321228685824,0],"rotation":[0,0,-0.41015237421866746],"cy":-1.434554884022593,"rightRoofHeight":11,"color":"white","foundationId":"88UbNAdWUbzJHGAmrqJWPn","cz":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rightJoints":["8kMoucgjs3KynPyoZExz4J"],"lz":11,"leftRoofHeight":11,"ly":0.3,"roofId":"wSxYARgs9umEJRG8XyZbKH","parentId":"88UbNAdWUbzJHGAmrqJWPn","cx":-3.018400676827704,"lx":9.731752225416834,"type":"Wall","relativeAngle":-1.5707963267948972,"leftJoints":["ovU5BwtCwgHA5UHHhibxpu"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":0,"cx":0,"wallsId":["ovU5BwtCwgHA5UHHhibxpu"],"lz":0,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"rotation":[0,0,0],"ly":0,"type":"Roof","normal":[0,0,1],"cz":0,"textureType":"No Roof Texture","id":"wSxYARgs9umEJRG8XyZbKH","selected":false,"roofType":"Gable","thickness":0.2,"parentId":"88UbNAdWUbzJHGAmrqJWPn","color":"#ffffff","cy":0,"foundationId":"88UbNAdWUbzJHGAmrqJWPn","rise":0,"ceiling":false},{"normal":[0,0,1],"type":"Foundation","id":"88UbNAdWUbzJHGAmrqJWPn","solarAbsorberPipe":{},"lx":7.252592961439527,"cx":62.080046007118426,"ly":13.304430432789896,"lz":1,"selected":false,"solarPowerTower":{},"solarUpdraftTower":{},"cy":37.19900910209601,"color":"#808080","rotation":[0,0,-0.41015237421866746],"cz":0.5,"parentId":"Ground"},{"rightRoofHeight":11,"relativeAngle":-3.1415926535897927,"selected":false,"rotation":[0,0,2.731440279371126],"cz":0,"leftPoint":[3.0844752908601185,3.4313212286858272,0],"textureType":"Wall Texture Default","cy":3.4313212286858255,"normal":[0,0,1],"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","cx":0.03303730701620822,"type":"Wall","rightJoints":["rYV5p6RL3LBPRMKrDscX3e"],"id":"dat7BcuHkXNM7uDy6XoM77","parentId":"3GmVD3k9gEdK1KyAQNL7Qd","leftJoints":["imJTFiGu5qfL7Sh3jfMjyP"],"rightPoint":[-3.018400676827702,3.431321228685824,0],"leftRoofHeight":11,"lx":6.102875967687821,"ly":0.3,"lz":11,"roofId":"vqk2MvDnMGXjNatJWKEZ3Q","color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"centerRoofHeight":[-0.5,11],"lz":11,"rightPoint":[3.0844752908601185,3.4313212286858272,0],"lx":9.731752225416841,"rightJoints":["dat7BcuHkXNM7uDy6XoM77"],"id":"imJTFiGu5qfL7Sh3jfMjyP","ly":0.3,"leftJoints":["rmxwktmu6mngA8cW2oTqim"],"textureType":"Wall Texture Default","cz":0,"selected":false,"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","roofId":"vqk2MvDnMGXjNatJWKEZ3Q","leftPoint":[3.0844752908601167,-6.300430996731014,0],"type":"Wall","cy":-1.4345548840225932,"leftRoofHeight":11,"relativeAngle":1.5707963267948963,"rightRoofHeight":11,"color":"white","parentId":"3GmVD3k9gEdK1KyAQNL7Qd","normal":[0,0,1],"cx":3.0844752908601176,"rotation":[0,0,2.731440279371126],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"normal":[0,0,1],"color":"white","rightRoofHeight":11,"rotation":[0,0,2.731440279371126],"rightPoint":[3.0844752908601167,-6.300430996731014,0],"leftPoint":[-3.018400676827706,-6.30043099673101,0],"parentId":"3GmVD3k9gEdK1KyAQNL7Qd","ly":0.3,"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","rightJoints":["imJTFiGu5qfL7Sh3jfMjyP"],"id":"rmxwktmu6mngA8cW2oTqim","lz":11,"cx":0.03303730701620533,"cy":-6.300430996731012,"cz":0,"lx":6.102875967687822,"relativeAngle":-5.821376180034847e-16,"leftRoofHeight":11,"textureType":"Wall Texture Default","roofId":"vqk2MvDnMGXjNatJWKEZ3Q","leftJoints":["rYV5p6RL3LBPRMKrDscX3e"],"type":"Wall","selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"leftRoofHeight":11,"cx":-3.018400676827704,"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","cz":0,"lx":9.731752225416834,"normal":[0,0,1],"type":"Wall","selected":false,"centerRoofHeight":[0.5,11],"color":"white","leftPoint":[-3.018400676827702,3.431321228685824,0],"relativeAngle":-1.5707963267948972,"id":"rYV5p6RL3LBPRMKrDscX3e","roofId":"vqk2MvDnMGXjNatJWKEZ3Q","ly":0.3,"textureType":"Wall Texture Default","leftJoints":["dat7BcuHkXNM7uDy6XoM77"],"rightPoint":[-3.018400676827706,-6.30043099673101,0],"parentId":"3GmVD3k9gEdK1KyAQNL7Qd","rightRoofHeight":11,"rotation":[0,0,2.731440279371126],"cy":-1.434554884022593,"lz":11,"rightJoints":["rmxwktmu6mngA8cW2oTqim"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"textureType":"No Roof Texture","cx":0,"roofType":"Gable","lx":0,"ly":0,"wallsId":["dat7BcuHkXNM7uDy6XoM77"],"normal":[0,0,1],"color":"#ffffff","ridgeRightPoint":[0.5,1],"thickness":0.2,"foundationId":"3GmVD3k9gEdK1KyAQNL7Qd","type":"Roof","cy":0,"rotation":[0,0,2.731440279371126],"selected":false,"lz":0,"id":"vqk2MvDnMGXjNatJWKEZ3Q","cz":0,"ridgeLeftPoint":[-0.5,1],"parentId":"3GmVD3k9gEdK1KyAQNL7Qd","rise":0,"ceiling":false},{"color":"#808080","ly":13.304430432789896,"normal":[0,0,1],"lx":7.252592961439527,"solarUpdraftTower":{},"cy":0.39963845763658945,"lz":1,"cx":57.679815811211355,"type":"Foundation","solarAbsorberPipe":{},"selected":false,"solarPowerTower":{},"id":"3GmVD3k9gEdK1KyAQNL7Qd","parentId":"Ground","cz":0.5,"rotation":[0,0,2.731440279371126]},{"rightRoofHeight":11,"lz":11,"normal":[0,0,1],"foundationId":"oYDvciacfdn2FyG6Pct5UQ","textureType":"Wall Texture Default","leftJoints":["uuKuNJNLJkLuMtyKwwLbpZ"],"color":"white","rotation":[0,0,2.731440279371126],"id":"36dnW2hrDUevTFeF7RsSFs","rightPoint":[-3.018400676827702,3.431321228685824,0],"selected":false,"rightJoints":["doa2HGm3D8izkEMMPgsx7E"],"cx":0.03303730701620822,"parentId":"oYDvciacfdn2FyG6Pct5UQ","cy":3.4313212286858255,"leftPoint":[3.0844752908601185,3.4313212286858272,0],"cz":0,"roofId":"jTzPENUqMsb7iHTtwq7yKs","relativeAngle":-3.1415926535897927,"lx":6.102875967687821,"ly":0.3,"leftRoofHeight":11,"type":"Wall","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lz":11,"relativeAngle":1.5707963267948963,"foundationId":"oYDvciacfdn2FyG6Pct5UQ","normal":[0,0,1],"ly":0.3,"parentId":"oYDvciacfdn2FyG6Pct5UQ","cx":3.0844752908601176,"leftRoofHeight":11,"rotation":[0,0,2.731440279371126],"leftPoint":[3.0844752908601167,-6.300430996731014,0],"type":"Wall","cy":-1.4345548840225932,"rightPoint":[3.0844752908601185,3.4313212286858272,0],"rightJoints":["36dnW2hrDUevTFeF7RsSFs"],"textureType":"Wall Texture Default","lx":9.731752225416841,"roofId":"jTzPENUqMsb7iHTtwq7yKs","centerRoofHeight":[-0.5,11],"leftJoints":["vqh1RPWSMZerDaWxLP3Y4Z"],"id":"uuKuNJNLJkLuMtyKwwLbpZ","rightRoofHeight":11,"selected":false,"color":"white","cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","rotation":[0,0,2.731440279371126],"color":"white","leftPoint":[-3.018400676827706,-6.30043099673101,0],"normal":[0,0,1],"parentId":"oYDvciacfdn2FyG6Pct5UQ","rightRoofHeight":11,"selected":false,"leftRoofHeight":11,"roofId":"jTzPENUqMsb7iHTtwq7yKs","leftJoints":["doa2HGm3D8izkEMMPgsx7E"],"rightPoint":[3.0844752908601167,-6.300430996731014,0],"ly":0.3,"textureType":"Wall Texture Default","cy":-6.300430996731012,"rightJoints":["uuKuNJNLJkLuMtyKwwLbpZ"],"cz":0,"lz":11,"relativeAngle":-5.821376180034847e-16,"lx":6.102875967687822,"foundationId":"oYDvciacfdn2FyG6Pct5UQ","cx":0.03303730701620533,"id":"vqh1RPWSMZerDaWxLP3Y4Z","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"selected":false,"cz":0,"ly":0.3,"type":"Wall","cx":-3.018400676827704,"centerRoofHeight":[0.5,11],"normal":[0,0,1],"lx":9.731752225416834,"color":"white","relativeAngle":-1.5707963267948972,"leftJoints":["36dnW2hrDUevTFeF7RsSFs"],"lz":11,"id":"doa2HGm3D8izkEMMPgsx7E","rightJoints":["vqh1RPWSMZerDaWxLP3Y4Z"],"leftPoint":[-3.018400676827702,3.431321228685824,0],"parentId":"oYDvciacfdn2FyG6Pct5UQ","leftRoofHeight":11,"rightRoofHeight":11,"foundationId":"oYDvciacfdn2FyG6Pct5UQ","cy":-1.434554884022593,"rotation":[0,0,2.731440279371126],"rightPoint":[-3.018400676827706,-6.30043099673101,0],"roofId":"jTzPENUqMsb7iHTtwq7yKs","textureType":"Wall Texture Default","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"lx":0,"foundationId":"oYDvciacfdn2FyG6Pct5UQ","ridgeLeftPoint":[-0.5,1],"cx":0,"parentId":"oYDvciacfdn2FyG6Pct5UQ","normal":[0,0,1],"lz":0,"wallsId":["36dnW2hrDUevTFeF7RsSFs"],"ly":0,"cy":0,"rotation":[0,0,2.731440279371126],"id":"jTzPENUqMsb7iHTtwq7yKs","color":"#ffffff","type":"Roof","roofType":"Gable","textureType":"No Roof Texture","ridgeRightPoint":[0.5,1],"cz":0,"selected":false,"thickness":0.2,"rise":0,"ceiling":false},{"normal":[0,0,1],"cx":47.576205150745,"id":"oYDvciacfdn2FyG6Pct5UQ","solarAbsorberPipe":{},"cz":0.5,"cy":4.8155054973730085,"color":"#808080","lz":1,"type":"Foundation","lx":7.252592961439527,"parentId":"Ground","solarUpdraftTower":{},"ly":13.304430432789896,"rotation":[0,0,2.731440279371126],"selected":false,"solarPowerTower":{}},{"normal":[0,0,1],"wallsId":["1sWH6Vf283ZQdSSFT642nh","monXTa8uPTJhzhXCcFVkHQ","abgP23xfq9mn6fXM5eixEU","bBRKF8cuUabp5jr721b2aF"],"roofType":"Pyramid","rotation":[0,0,0],"lineWidth":0.2,"showLabel":false,"lz":0,"lineColor":"black","id":"7MHnZ8shY1nNWWHte69oqs","cz":0,"type":"Roof","textureType":"No Roof Texture","selected":false,"parentId":"jXMhg2wW7AzS5RR8DVRgQA","cx":0,"thickness":0.2,"foundationId":"jXMhg2wW7AzS5RR8DVRgQA","lx":0,"ly":0,"cy":0,"color":"#ffffff","rise":0,"ceiling":false},{"cy":0,"selected":false,"wallsId":["eJ8JK9wm6JNigJXLFxHXZv","6fcDhLeskSsK9vgEVSS72V","kj6mwcCRjjAjkZKNVLpD6Q","dpZWnBXJifWNeSxPnXSh11"],"cz":0,"showLabel":false,"id":"5AL2YmNDuGkeP7qZ5AC7iV","foundationId":"b7G57PTXunVqeHXzCWeuRF","type":"Roof","parentId":"b7G57PTXunVqeHXzCWeuRF","roofType":"Pyramid","thickness":0.2,"rotation":[0,0,0],"color":"#ffffff","lineColor":"black","lz":0,"cx":0,"textureType":"No Roof Texture","lineWidth":0.2,"normal":[0,0,1],"ly":0,"lx":0,"rise":0,"ceiling":false},{"cz":0,"color":"#ffffff","textureType":"No Roof Texture","lz":0,"rotation":[0,0,0],"cx":0,"normal":[0,0,1],"lx":0,"lineColor":"black","cy":0,"roofType":"Pyramid","thickness":0.2,"id":"aqd47NYJ1Q6UzcCmxxcoXQ","selected":false,"wallsId":["4ocNasurxu3LhLKonWAKWR","pBQFic2TqVJyDdJyEaBVof","tq43NPQgXhkeNmwFteVBqx","w8GFYP8jB1EG2YVL6appCT"],"ly":0,"parentId":"jH5z454ciczrceJTNes5b4","type":"Roof","foundationId":"jH5z454ciczrceJTNes5b4","lineWidth":0.2,"showLabel":false,"rise":0,"ceiling":false},{"rotation":[0,0,0],"ly":0,"textureType":"No Roof Texture","cx":0,"cy":0,"cz":0,"showLabel":false,"normal":[0,0,1],"wallsId":["9RBn6VqRCqHmHYTVsG2Hbq","snwHy88SCLUgp9tM1ts1kV","pJZasFocQxwotbLjPFqJsC","fgVtymGrmdEZZzZZ3mW69b"],"lineWidth":0.2,"lx":0,"roofType":"Pyramid","type":"Roof","foundationId":"4p3AerfQErrh3N7JyKd7PA","id":"ui47bC2XPhcG14b6RPgvMq","color":"#ffffff","parentId":"4p3AerfQErrh3N7JyKd7PA","lineColor":"black","selected":false,"thickness":0.2,"lz":0,"rise":0,"ceiling":false}],"view":{"dailyUpdraftTowerYieldPanelRect":{"x":0,"height":550,"y":0,"width":640},"dailyParabolicDishYieldPanelX":0,"visibilityResultsPanelY":0,"showDesignInfoPanel":true,"mapPanelY":0,"dailyParabolicTroughYieldPanelRect":{"height":400,"x":0,"width":600,"y":0},"showSunAngles":false,"stickyNotePanelY":0,"autoRotate":false,"weatherPanelY":0,"dailyLightSensorPanelRect":{"y":0,"height":360,"width":600,"x":0},"groundColor":"forestgreen","enableRotate":true,"showElevationAngle":true,"yearlyPvYieldPanelY":0,"panCenter2D":[68.43396623741017,108.77453989719173,0.00001332276757861851],"showMapPanel":false,"heliodonPanelY":0,"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"weatherPanelX":0,"solarRadiationHeatMapMaxValue":5,"dailyPvYieldPanelY":0,"showInstructionPanel":false,"yearlyPvYieldPanelRect":{"width":600,"y":86,"x":-326,"height":400},"yearlyLightSensorPanelShowClearness":false,"cameraZoom":25.847108697996326,"showSolarPanelVisibilityResultsPanel":false,"mapType":"hybrid","showYearlyParabolicTroughYieldPanel":false,"heliodonPanelX":0,"showYearlyHeliostatYieldPanel":false,"axes":true,"showDailyHeliostatYieldPanel":false,"yearlyFresnelReflectorYieldPanelRect":{"width":600,"y":0,"x":0,"height":400},"showHeliodonPanel":false,"dailyLightSensorPanelX":0,"dailyFresnelReflectorYieldPanelY":0,"yearlyPvYieldPanelX":0,"showZenithAngle":true,"heliodon":false,"dailyHeliostatYieldPanelX":0,"orthographic":false,"showDailyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"y":0,"width":236,"x":0,"height":87},"yearlyLightSensorPanelY":0,"groundImage":true,"yearlyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"showWeatherPanel":false,"yearlyParabolicTroughYieldPanelY":0,"dailyPvYieldPanelX":0,"showYearlyPvYieldPanel":false,"dailyFresnelReflectorYieldPanelX":0,"weatherPanelRect":{"y":0,"height":500,"width":500,"x":0},"evolutionPanelRect":{"y":0,"x":0,"width":640,"height":400},"showDailyUpdraftTowerYieldPanel":false,"showAzimuthAngle":true,"showEvolutionPanel":false,"yearlyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"ambientLightIntensity":0.1,"dailyFresnelReflectorYieldPanelRect":{"y":0,"height":400,"x":0,"width":600},"yearlyLightSensorPanelX":0,"showEconomicsPanel":false,"dailyParabolicDishYieldPanelRect":{"width":600,"x":0,"y":0,"height":400},"stickyNotePanelX":0,"showDiurnalTemperaturePanel":false,"yearlyFresnelReflectorYieldPanelX":0,"panCenter":[38.386200794550874,-23.3410033657338,0.000026460494326568842],"showStickyNotePanel":true,"showDailyParabolicDishYieldPanel":false,"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"shadowEnabled":false,"mapZoom":17,"showYearlyFresnelReflectorYieldPanel":false,"yearlyLightSensorPanelShowDaylight":false,"showYearlyUpdraftTowerYieldPanel":false,"showDailyLightSensorPanel":false,"dailyHeliostatYieldPanelY":0,"yearlyParabolicTroughYieldPanelRect":{"height":400,"width":600,"x":0,"y":0},"yearlyFresnelReflectorYieldPanelY":0,"diurnalTemperaturePanelRect":{"y":0,"width":600,"height":400,"x":0},"theme":"Default","dailyLightSensorPanelY":0,"visibilityResultsPanelRect":{"x":0,"height":470,"width":600,"y":0},"yearlyLightSensorPanelRect":{"height":500,"y":0,"x":0,"width":600},"showSiteInfoPanel":true,"visibilityResultsPanelX":0,"mapTilt":0,"solarRadiationHeatMapReflectionOnly":false,"cameraPosition":[79.58351721186,-134.3931242110791,147.3552432306341],"showYearlyLightSensorPanel":false,"dailyParabolicTroughYieldPanelX":0,"yearlyHeliostatYieldPanelX":0,"yearlyParabolicDishYieldPanelRect":{"width":600,"y":0,"height":400,"x":0},"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicTroughYieldPanelY":0,"dailyPvYieldPanelRect":{"width":600,"height":400,"y":0,"x":0},"cameraPosition2D":[68.43396623741017,108.77451989630273,20.00001332267289],"dailyParabolicDishYieldPanelY":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"interRowSpacing":2,"rowAxis":"Left-Right","pvModelName":"SPR-X21-335-BLK","tiltAngle":0,"poleSpacing":3,"orientation":"Landscape","poleHeight":1,"rowsPerRack":1},"solarPanelArrayLayoutConstraints":{"rowAxis":"Left-Right","poleHeight":1,"minimumTiltAngle":-1.5707963267948966,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"maximumInterRowSpacing":10,"minimumInterRowSpacing":2,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","poleSpacing":5,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"localSearchRadius":0.1,"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"maximumGenerations":5,"selectionMethod":1,"searchMethod":1,"mutationRate":0.1,"selectionRate":0.5,"convergenceThreshold":0.01,"crossoverRate":0.5,"populationSize":20},"particleSwarmOptimizationParams":{"vmax":0.01,"inertia":0.8,"objectiveFunctionType":1,"searchMethod":1,"cognitiveCoefficient":0.1,"problem":"Solar Panel Tilt Angle","socialCoefficient":0.1,"localSearchRadius":0.1,"maximumSteps":5,"swarmSize":20,"convergenceThreshold":0.01}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Mescalero Apache School\\nNew Mexico, USA"]}')},472:function(e){e.exports=JSON.parse('{"docid":"oRJVoBEAs85sQVTxz3G3Aa","timestamp":1643138671495,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"9/22/2021 11:00:00 AM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":2},"elements":[{"type":"Foundation","cx":-9.55171908313751,"cy":-18.19491515601114,"cz":0.05,"lx":69.0515968638667,"ly":71.26044576002357,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-1.017744597267026],"parentId":"Ground","id":"9zunWg9vgE2EXQf2GAGvHJ","selected":false,"textureType":"Foundation Texture #2"},{"type":"Tree","name":"Maple","cx":3.2728380906673773,"cy":2.018552619631127,"cz":0.05000000074505806,"lx":9.63205225658289,"lz":12.42213702192784,"normal":[0,0,1],"rotation":[0,0,0.4041452104082131],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"e4UGoSP6vMmKtTpaK7Xx7e","selected":false,"showModel":false},{"type":"Human","name":"Jack","cx":9.261208020051818,"cy":17.4519165226371,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0.4041452104082131],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"aqHPhgdskHU47w7A1JoYUH","selected":false,"ly":0.6},{"type":"Tree","name":"Maple","cx":-2.759236366671214,"cy":-6.100345712463374,"cz":0.05000000074505806,"lx":15.662386774550322,"lz":17.814185690323082,"normal":[0,0,1],"rotation":[0,0,0.5235987755982988],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"quQsvQqGqFo233Raf5MV2q","selected":false},{"type":"Cuboid","cx":-9.798880015116119,"cy":-4.358075047463568,"cz":9.736603648251254,"lx":19.17702564125724,"ly":13.830784586479455,"lz":19.47320729650251,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,3.141592653589793],"parentId":"Ground","selected":false,"id":"u8URHSH38BdLFefR2kpArP"},{"type":"Tree","name":"Spruce","cx":8.846757081366217,"cy":8.465966186158635,"cz":0.05000000074505806,"lx":4.201867761608678,"lz":9.066423414956883,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"8nmhqhdJRjPhvXmqRWtXWS","selected":false,"showModel":false},{"type":"Cuboid","cx":3.3849893009151506,"cy":3.1596268234618305,"cz":4.774411049933112,"lx":17.91634633119275,"ly":6.319724352083252,"lz":9.548822099866223,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.8378964730477152],"parentId":"Ground","id":"w6fsWnZq8bBGBS5PxduXBK","selected":false},{"type":"Cuboid","cx":0.8301123283897702,"cy":-13.282792837220546,"cz":5.471867705312628,"lx":5.668418559135588,"ly":9.979432490224614,"lz":10.943735410625257,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.7040209346650892],"parentId":"Ground","selected":false,"id":"e4j7PfDmVs1dovQBZBQ3BT"},{"type":"Cuboid","cx":3.6644340063361565,"cy":-4.8364998865196736,"cz":2,"lx":4.840425768432099,"ly":20.8513404243441,"lz":4,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"qfz89eHJ88Lg9JCyH53fc9"},{"type":"Cuboid","cx":-4.166247795353307,"cy":-32.1603428429262,"cz":2.63479238812298,"lx":11.313153894671187,"ly":12.684919468119116,"lz":5.26958477624596,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.2580366898458273],"parentId":"Ground","selected":false,"id":"nNjg1Ffg3pm4CdyzNQdiW9"},{"type":"Cuboid","cx":-4.400070852285921,"cy":-32.71929138984055,"cz":13.65810647211173,"lx":3.1252453327696883,"ly":3.149430446459918,"lz":27.31621294422346,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.7128704595183226],"parentId":"Ground","selected":false,"id":"ofBXHyPsTmNpJVcNoCo9j5"},{"type":"Cuboid","cx":-20.05284620919852,"cy":-31.1598203541727,"cz":4.6920942485939525,"lx":14.24559815125088,"ly":10.643905820516908,"lz":9.384188497187905,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.2728352410356374],"parentId":"Ground","selected":false,"id":"aZcQCi1W1twRBtwgJgUoeW"},{"type":"Tree","name":"Oak","cx":19.63141428747889,"cy":-14.555088162280029,"cz":0.05000000074505806,"lx":16.244539454462206,"lz":17.937149329522143,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9zunWg9vgE2EXQf2GAGvHJ","id":"hP32y2WeaoShZAgJcL2phB","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[53.96406310906323,-63.55404886182046,17.26191308801079],"panCenter":[-14.409899112760232,-10.942953787224548,3.8259899066863428],"orthographic":false,"enableRotate":true,"cameraZoom":15.47561875,"showInstructionPanel":true,"cameraPosition2D":[4.361874143686572,3.699796590309034,48.00000369998439],"panCenter2D":[4.361874143686572,3.699844592441852,0.000004448257642288249],"showHeatmap":false,"showSolarRadiationHeatmap":false,"showSunAngles":false,"solarRadiationHeatMapMaxValue":4.5},"notes":[]}')},473:function(e){e.exports=JSON.parse('{"docid":"gj8mmfSE6fqAAUtvXZYGkb","time":"03/19/2023 02:00 pm","timestamp":1679248844823,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022 11:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":14.613120903558068,"solarUpdraftTower":{},"parentId":"Ground","cx":-2.6557701490344776,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.09987728198946044,"type":"Foundation","solarPowerTower":{},"lx":18.159918676696766,"lz":0.1,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":3,"roofId":"vyQyu3QobXjxj1jDvhJ4sy","ly":0.3,"rightPoint":[-5.300056602144494,5.6732245690928105,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"No Wall Texture","leftPoint":[6.699943397855505,5.67322456909281,0.1],"type":"Wall","rightRoofHeight":3,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":3,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":0.6999433978555056,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.6732245690928105,"color":"#ffffff","opacity":0.4,"wallStructure":"Stud","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":6.699943397855504,"leftPoint":[6.6999433978555025,-4.3267754309071895,0.1],"cy":0.6732245690928105,"leftRoofHeight":3,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[6.699943397855506,5.6732245690928105,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":3,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","rightRoofHeight":3,"roofId":"vyQyu3QobXjxj1jDvhJ4sy","color":"#ffffff","opacity":0.4,"wallStructure":"Stud","centerRoofHeight":[0,4.790804943100949],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"lx":10,"windows":[],"lz":3,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"vyQyu3QobXjxj1jDvhJ4sy","selected":false,"cy":0.6732245690928105,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"No Wall Texture","rightRoofHeight":3,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-5.300056602144493,5.6732245690928105,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":3,"ly":0.3,"cx":-5.300056602144494,"color":"#ffffff","opacity":0.4,"wallStructure":"Stud","centerRoofHeight":[0,4.790804943100949],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"showLabel":false,"cx":0.6999433978555061,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[6.699943397855506,-4.3267754309071895,0.1],"cz":2.268765007024547,"textureType":"No Wall Texture","cy":-4.3267754309071895,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"vyQyu3QobXjxj1jDvhJ4sy","leftPoint":[-5.300056602144494,-4.3267754309071895,0.1],"normal":[0,0,1],"ly":0.3,"lz":3,"leftRoofHeight":3,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":3,"lx":12,"color":"#ffffff","wallStructure":"Stud","opacity":0.4,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Human","name":"James","cx":-1.8741011733558182,"cy":-5.8416164272427595,"cz":0.05000000074505806,"lx":0.472,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.472},{"type":"Human","name":"Jess","cx":-4.0157582744754965,"cy":3.8617380009978506,"cz":0.050000000745058504,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Gable","roofStructure":"Rafter","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"vyQyu3QobXjxj1jDvhJ4sy","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rise":1.790804943100949,"ceiling":false},{"type":"Flower","name":"White Flower","cx":-4.1342434171004925,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"46aifVnH3B74BwVSi3Crxq","selected":false},{"type":"Flower","name":"White Flower","cx":-3.3342434171004927,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"i8U6G9JyPpL2hbWBs7vVz6","selected":false},{"type":"Flower","name":"White Flower","cx":-2.534243417100493,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"ugPMRjEYo4WRamJ9tFewHm","selected":false},{"type":"Flower","name":"White Flower","cx":-1.7342434171004928,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cXWM3Js8Lp8DUZByf9ySVZ","selected":false},{"type":"Flower","name":"White Flower","cx":-0.9342434171004927,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tWw7iszMWHGh94zWUms3bX","selected":false},{"type":"Flower","name":"White Flower","cx":-0.1342434171004927,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"wFi9RKANUcSDb8JEQtDAEk","selected":false},{"type":"Flower","name":"White Flower","cx":0.6657565828995073,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"bgwNTPoMCs4Wi6VnCqioA2","selected":false},{"type":"Flower","name":"White Flower","cx":1.4657565828995074,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"m6nguuL3Zz24UD89QncVq3","selected":false},{"type":"Flower","name":"White Flower","cx":2.2657565828995074,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kGhztdakMGZm6mkLawDRht","selected":false},{"type":"Flower","name":"White Flower","cx":3.0657565828995077,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"t89aQNRve3pcY6QfBoyCYo","selected":false},{"type":"Flower","name":"White Flower","cx":3.8657565828995075,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"2bSs9uZqzgsXpzetM5AmxD","selected":false},{"type":"Flower","name":"White Flower","cx":4.665756582899507,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7CEvARocUnJdE2SHZcDU2V","selected":false},{"type":"Flower","name":"White Flower","cx":5.465756582899507,"cy":-2.3876241823818267,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rYZJ2mHmESXni5V1aVa46t","selected":false},{"type":"Flower","name":"White Flower","cx":-4.2619057070341295,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"m4JAZDAnBR2QnoTX6gwxgv","selected":false},{"type":"Flower","name":"White Flower","cx":-3.4619057070341297,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7nhnwoJ8FbP4fj9ZXLrfye","selected":false},{"type":"Flower","name":"White Flower","cx":-2.66190570703413,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"uFsFHipxUMRX5aHpDNiLzw","selected":false},{"type":"Flower","name":"White Flower","cx":-1.8619057070341298,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"mJ6VdUdVpFHoDMvk5CifrP","selected":false},{"type":"Flower","name":"White Flower","cx":-1.0619057070341298,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"ebBzNYMUnf5tyqviBfW44K","selected":false},{"type":"Flower","name":"White Flower","cx":-0.26190570703412974,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7qGERbKCYNJZY5SktqYFGH","selected":false},{"type":"Flower","name":"White Flower","cx":0.5380942929658703,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"oAb4tA3ghqD5MVLjvE2JNB","selected":false},{"type":"Flower","name":"White Flower","cx":1.3380942929658703,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"anEdC4mKjKpYkWwwTugQd7","selected":false},{"type":"Flower","name":"White Flower","cx":2.1380942929658704,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3WdeMit6SeG4bqra8yJxnB","selected":false},{"type":"Flower","name":"White Flower","cx":2.9380942929658707,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jnmEfnMgUaJK9NwsWsV3gH","selected":false},{"type":"Flower","name":"White Flower","cx":3.7380942929658705,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8471n9p1MKM4v5HYVYNnbf","selected":false},{"type":"Flower","name":"White Flower","cx":4.53809429296587,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jRVVQvkLQEJFVGW7n4JcjX","selected":false},{"type":"Flower","name":"White Flower","cx":5.33809429296587,"cy":-0.7069427320257313,"cz":0.05000000074505895,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"n9PiSuToBHaHcJ2hu8PhVa","selected":false},{"type":"Flower","name":"White Flower","cx":-4.344446260163467,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5GRQttXkMVj9MJmJA2sCTw","selected":false},{"type":"Flower","name":"White Flower","cx":-3.5444462601634674,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"79Mv3qBTpXEHM1FaDfaYXS","selected":false},{"type":"Flower","name":"White Flower","cx":-2.7444462601634676,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8XAz3reTAfJSVRX2DdJvMN","selected":false},{"type":"Flower","name":"White Flower","cx":-1.9444462601634676,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"hGDaJZoqkJU6bVFNwzDKgn","selected":false},{"type":"Flower","name":"White Flower","cx":-1.1444462601634675,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cWsLs9ePKWKWrV1Akhn42n","selected":false},{"type":"Flower","name":"White Flower","cx":-0.34444626016346747,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"8NgHbW2QgN3CvEsxHivBg6","selected":false},{"type":"Flower","name":"White Flower","cx":0.4555537398365326,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7ogG3q6XsVTY3wSGV7BrEK","selected":false},{"type":"Flower","name":"White Flower","cx":1.2555537398365326,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"aTLKeq862hXuydUnDnRufZ","selected":false},{"type":"Flower","name":"White Flower","cx":2.0555537398365327,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"4SotanHYdz7BmHuHEsRU5J","selected":false},{"type":"Flower","name":"White Flower","cx":2.855553739836533,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"o98emba7AiB167tGV4Un8g","selected":false},{"type":"Flower","name":"White Flower","cx":3.6555537398365328,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"1ExTvAYZaKio5wNoaShuZo","selected":false},{"type":"Flower","name":"White Flower","cx":4.455553739836533,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"t3oYKCD7r8u33GMpXr8wwr","selected":false},{"type":"Flower","name":"White Flower","cx":5.255553739836532,"cy":1.0410219573182566,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5jPVxqN2CvnEkeYz4QQra5","selected":false},{"type":"Flower","name":"White Flower","cx":-4.391533387874089,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"of1adpyZeoRS8fTjGoytf1","selected":false},{"type":"Flower","name":"White Flower","cx":-3.5915333878740894,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9ncNDKqkLLMu7d9PUN7oUA","selected":false},{"type":"Flower","name":"White Flower","cx":-2.7915333878740896,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"u3zUSyPymxJB7HgazzqLzv","selected":false},{"type":"Flower","name":"White Flower","cx":-1.9915333878740895,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"dHPhWCEiz1y9PnXZp83MpE","selected":false},{"type":"Flower","name":"White Flower","cx":-1.1915333878740895,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"bg6PZWwTrwwre4jiKxe7uX","selected":false},{"type":"Flower","name":"White Flower","cx":-0.3915333878740894,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"5F7K7QFnfwHKfd4Lfw728p","selected":false},{"type":"Flower","name":"White Flower","cx":0.4084666121259106,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"532gMLAZ5tcLjzMQisipSa","selected":false},{"type":"Flower","name":"White Flower","cx":1.2084666121259107,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"v3gFFnUntYFxM9Nx5RWfik","selected":false},{"type":"Flower","name":"White Flower","cx":2.0084666121259107,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"s6dpt2XkDQfRw5bGeX1H1V","selected":false},{"type":"Flower","name":"White Flower","cx":2.808466612125911,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"uw1Jz6HvycMidfXokrAzFQ","selected":false},{"type":"Flower","name":"White Flower","cx":3.608466612125911,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"n7ppnA9LyoWRWkVHPMq965","selected":false},{"type":"Flower","name":"White Flower","cx":4.408466612125911,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"r4x3CD3uiRipJcivNwW5MN","selected":false},{"type":"Flower","name":"White Flower","cx":5.2084666121259104,"cy":3.1239668412171455,"cz":0.05000000074505806,"lx":0.8,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7eEgZikopFnYDrozpMnbVk","selected":false},{"type":"Flower","name":"Sunflower","cx":-4.481342001872006,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9P5CuiQ2MG15JKupLj1B6D","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.4813420018720063,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"meDHz6sDDGj4eDAWvaf1Jc","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.4813420018720063,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"sRFj36qrZLXFZTDMQ6mpD9","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.4813420018720063,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qNZvKMkFPtUNCcEgL1huNh","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.48134200187200626,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kcPXW35rZZAsL5WiiAk3hw","selected":false},{"type":"Flower","name":"Sunflower","cx":0.5186579981279937,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"feWWMNFMFvQ8cSM14BMp8t","selected":false},{"type":"Flower","name":"Sunflower","cx":1.5186579981279937,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"msFwckWagge9gpLdQeS4JJ","selected":false},{"type":"Flower","name":"Sunflower","cx":2.5186579981279937,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"dogJzpvueZ1anaBAZ7muH8","selected":false},{"type":"Flower","name":"Sunflower","cx":3.5186579981279937,"cy":4.83047805671146,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"cYZoVFdifJsko9MEehFjtS","selected":false},{"type":"Flower","name":"Sunflower","cx":-4.24189898255945,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"s25usGNmQJ66fR5yXuRGGo","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.2418989825594497,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"pzBtEERtTPkBv9CsHDmZDu","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.2418989825594497,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"m5X7sdToMdq8xEefEwxLCK","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.2418989825594497,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"f4inpmtrAzszkJUhzYSUye","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.24189898255944975,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"f4ThsERMjZf2AhEJ56hsa6","selected":false},{"type":"Flower","name":"Sunflower","cx":0.7581010174405503,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"16shGo6CLCNPBSgnunhAkS","selected":false},{"type":"Flower","name":"Sunflower","cx":1.7581010174405503,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7vYNCNRBverkM51mspnoUJ","selected":false},{"type":"Flower","name":"Sunflower","cx":2.7581010174405503,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"voHLpW8Gd4XA3Ceg6Xbe7t","selected":false},{"type":"Flower","name":"Sunflower","cx":3.7581010174405503,"cy":2.1058294107860522,"cz":0.05000000074505717,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"u6Ue6tXWzkHCodK9XZEU2L","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.9022248766799255,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"c6JNqxEgYvWDCRJawdShSj","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.9022248766799255,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"oaSKDixHoDBGhRmyNSQzgw","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.9022248766799255,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vrts4rUEEsRTQs9sGjhPQA","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.9022248766799255,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3pYKWqcAmjBuuNuny7rpoV","selected":false},{"type":"Flower","name":"Sunflower","cx":0.09777512332007454,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"1S6ZgxRm2LWmGc9KQsgDFh","selected":false},{"type":"Flower","name":"Sunflower","cx":1.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"opQ4ZLwfvkzg5Vxfj8cfQA","selected":false},{"type":"Flower","name":"Sunflower","cx":2.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nkbv83UnHqmfM7bAwa33Pe","selected":false},{"type":"Flower","name":"Sunflower","cx":3.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"mN9mTCijKK38jmTnqKHee1","selected":false},{"type":"Flower","name":"Sunflower","cx":4.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"dArQ57WQgeQivghvFz6Pkf","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.660995740108657,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"v7PVJmCSxV3Mzkp3DvmbxL","selected":false},{"type":"Flower","name":"Sunflower","cx":5.0977751233200745,"cy":0.17873664141611412,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"h4XguGKN7sgDCDuSE5McKM","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.660995740108657,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"wSmuS2APtdqz8q7JGKKASr","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.6609957401086568,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nhuLvBuF9q3oVKsH9nQgoj","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.6609957401086568,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"gyN8wLEyhGu5icXFxTanDS","selected":false},{"type":"Flower","name":"Sunflower","cx":0.3390042598913432,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3Hxo93yvCk6bL25Z1j69hy","selected":false},{"type":"Flower","name":"Sunflower","cx":1.3390042598913432,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"6CEP9TkxfGsqwqefDYN2m3","selected":false},{"type":"Flower","name":"Sunflower","cx":2.339004259891343,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tKziXd6bAbZhg1ZHtHCDYk","selected":false},{"type":"Flower","name":"Sunflower","cx":3.339004259891343,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"i75ADLAQar36M93rinkuBn","selected":false},{"type":"Flower","name":"Sunflower","cx":4.339004259891343,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9aKZZrCwftw93k2j9EUPft","selected":false},{"type":"Flower","name":"Sunflower","cx":5.339004259891343,"cy":-1.5650161510961733,"cz":0.05000000074505895,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jtbnWz1TtfVCGS6GFT7cd5","selected":false},{"type":"Flower","name":"Sunflower","cx":4.700456042537368,"cy":2.0818781692863544,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kpaDqAs7RHDDcutq6peJfx","selected":false},{"type":"Flower","name":"Sunflower","cx":4.834015330936817,"cy":4.861450972934322,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"n1pT9mZTaMUzmHpcczyBaV","selected":false},{"type":"Flower","name":"Sunflower","cx":-3.3045300953024963,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"k1bygQU9gmbRLruK4LkufJ","selected":false},{"type":"Flower","name":"Sunflower","cx":-2.3045300953024963,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"1Qg8EAesLQmApEi3SoVr2L","selected":false},{"type":"Flower","name":"Sunflower","cx":-1.3045300953024963,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"pX7RzZXzs2a2wB6ikN7nMV","selected":false},{"type":"Flower","name":"Sunflower","cx":-0.3045300953024963,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"4n5Yx4e8sgXGuByhj8k1fL","selected":false},{"type":"Flower","name":"Sunflower","cx":0.6954699046975037,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vHXKNqVUezGNFoAwcMvXfT","selected":false},{"type":"Flower","name":"Sunflower","cx":1.6954699046975037,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qESmtL2sTn5MoKqcsafYq5","selected":false},{"type":"Flower","name":"Sunflower","cx":2.6954699046975037,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jzYPMGXoRbfHffj27jjLk1","selected":false},{"type":"Flower","name":"Sunflower","cx":3.6954699046975037,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qbv7JX9QpCnKwVvTQzv2CK","selected":false},{"type":"Flower","name":"Sunflower","cx":4.695469904697504,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vegPcGL4Si9F7tHaiDew5A","selected":false},{"type":"Flower","name":"Sunflower","cx":5.695469904697504,"cy":-3.4208830597913056,"cz":0.05000000074505806,"lx":1,"lz":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nfuYXRCdKKX1yeEVfQ1Q8w","selected":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.19999999999999998,"y":-0.7999999999999999},{"x":-0.19999999999999998,"y":-0.4666666666666666},{"x":0.20000000000000004,"y":-0.4666666666666666},{"x":0.20000000000000004,"y":-0.7999999999999999}],"parentId":"skm8dNPSkFaVkoUwiPNfq1","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":0,"id":"9M33FqMDNgV3pDjYk2UES3","text":"Greenhouse","fontSize":0.5,"fontColor":"gold","fontStrokeWidth":0.01,"noOutline":true,"opacity":0}],"sceneRadius":15,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,19.999999999989587],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-13.969061585407742,-10.143303302147187,2.3881460403679218],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.847108697996333,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-1.0306086242769346,3.0389446343818545,1.3437141951705311],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},474:function(e){e.exports=JSON.parse('{"docid":"pBi5xeMeSVt3pt1S6pNqhP","time":"03/19/2023 01:57 pm","timestamp":1679248653859,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"3019 Jameson Beach Rd, South Lake Tahoe, CA 96150, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":38.9379299,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-120.0387964},"elements":[{"ly":15.823820171875001,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.23635058692870636,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":-0.30044344061775696,"type":"Foundation","solarPowerTower":{},"lx":20.01699292669677,"lz":0.25,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.125,"textureType":"Foundation Texture #2","enableGroupMaster":true},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":12,"relativeAngle":3.141592653589793,"lz":4,"roofId":"ddvCooK4VAFN7dUMWPpapB","ly":0.3,"rightPoint":[-6.228593727144493,5.3056786237803095,0.1],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[5.771406272855506,5.305678623780308,0.1],"type":"Wall","rightRoofHeight":4,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":4,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.22859372714449355,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":5.3056786237803095,"color":"#ffffff","opacity":0,"wallStructure":"Stud","structureSpacing":100,"structureColor":"#666666","structureWidth":0.1,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.5,"rightTopPartialHeight":3.5},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":5.771406272855505,"leftPoint":[5.771406272855503,-4.6943213762196905,0.1],"cy":0.3056786237803084,"leftRoofHeight":4,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[5.771406272855507,5.3056786237803095,0.1],"ly":0.3,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":10,"normal":[0,0,1],"lz":4,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture Default","rightRoofHeight":4,"roofId":"ddvCooK4VAFN7dUMWPpapB","color":"#ffffff","opacity":0,"wallStructure":"Stud","structureSpacing":100,"structureColor":"#666666","structureWidth":0.1,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.5,"rightTopPartialHeight":3.5},{"lx":10,"windows":[],"lz":4,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"ddvCooK4VAFN7dUMWPpapB","selected":false,"cy":0.3056786237803084,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-6.228593727144493,-4.6943213762196905,0.1],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":4,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":4.71238898038469,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-6.228593727144492,5.3056786237803095,0.1],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":4,"ly":0.3,"cx":-6.228593727144493,"color":"#ffffff","opacity":0,"wallStructure":"Stud","structureSpacing":100,"structureColor":"#666666","structureWidth":0.1,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.5,"rightTopPartialHeight":3.5},{"showLabel":false,"cx":-0.2285937271444931,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[5.771406272855507,-4.6943213762196905,0.1],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-4.6943213762196905,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"ddvCooK4VAFN7dUMWPpapB","leftPoint":[-6.228593727144493,-4.6943213762196905,0.1],"normal":[0,0,1],"ly":0.3,"lz":4,"leftRoofHeight":4,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":4,"lx":12,"color":"#ffffff","wallStructure":"Stud","opacity":0,"structureSpacing":100,"structureColor":"#666666","structureWidth":0.1,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3.5,"rightTopPartialHeight":3.5},{"type":"Human","name":"Jacob","cx":7.289879196764376,"cy":0.9615979280726203,"cz":0.125,"lx":0.8,"lz":1.82,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.8},{"type":"Wall","cx":0.09100362924299155,"cy":1.1882025501879951,"cz":2.2408122612280286,"lx":1.5601883727480157,"ly":0.2,"lz":7.649013269649758,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[0.8710978156169994,1.1882025501879951,0],"rightPoint":[-0.6890905571310163,1.1882025501879951,0],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":7.649013269649758,"rightRoofHeight":7.649013269649758,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.149013269649758,"rightTopPartialHeight":7.149013269649758},{"type":"Wall","cx":0.8710978156169993,"cy":0.14100043812882335,"cz":2.2301039869226305,"lx":2.0944042241183434,"ly":0.2,"lz":7.649013269649758,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[0.8710978156169991,-0.9062016739303485,0],"rightPoint":[0.8710978156169995,1.1882025501879951,0],"relativeAngle":1.5707963267948963,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":7.649013269649758,"rightRoofHeight":7.649013269649758,"wallStructure":"Default","opacity":0.5,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.149013269649758,"rightTopPartialHeight":7.149013269649758},{"type":"Wall","cx":-0.6890905571310162,"cy":0.14100043812882335,"cz":2.228839888904333,"lx":2.0944042241183434,"ly":0.2,"lz":7.649013269649758,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-0.6890905571310162,1.1882025501879951,0],"rightPoint":[-0.6890905571310163,-0.9062016739303485,0],"relativeAngle":-1.5707963267948968,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":7.649013269649758,"rightRoofHeight":7.649013269649758,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.149013269649758,"rightTopPartialHeight":7.149013269649758},{"type":"Wall","cx":0.0910036292429916,"cy":-0.9062016739303485,"cz":2.268765007024547,"lx":1.5601883727480157,"ly":0.2,"lz":7.649013269649758,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-0.6890905571310163,-0.9062016739303485,0],"rightPoint":[0.8710978156169995,-0.9062016739303485,0],"relativeAngle":0,"textureType":"Wall Texture #4","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"u1sPtasg3hWUinAjQbYwBP","leftRoofHeight":7.649013269649758,"rightRoofHeight":7.649013269649758,"opacity":0.5,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.149013269649758,"rightTopPartialHeight":7.149013269649758},{"type":"Foundation","cx":-0.0721809285526831,"cy":-0.11580967162986489,"cz":0.05,"lx":2.3610744974526523,"ly":3.0605782147964087,"lz":0.07649013269649757,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false},{"type":"Human","name":"Jess","cx":-1.0115122224568758,"cy":-3.6651165310105203,"cz":0.125,"lx":0.43,"ly":0.43,"lz":1.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.15,"roofType":"Pyramid","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7","pPpJHGJ2bGVqLdA1FpXi4V","giYTP9Qg6uJ3yfkS1RoDqG","2RETAxyRMzZBEQkBGms56R"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"u1sPtasg3hWUinAjQbYwBP","rise":1.3063523363004892,"ceiling":false},{"type":"Window","cx":0.023873137489038417,"cy":0.1,"cz":0.3595234970910072,"lx":0.5252090247588448,"ly":0.2,"lz":0.11766223541160228,"mullionWidth":0.06,"mullionSpacing":0.5,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"62Gv8U29wFJyJf1vgeLMyo","parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"frame":true,"mullion":true,"tint":"#73D8FF","opacity":0.5,"mullionColor":"white","frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":-6.114654382048409,"cy":0.32019837609535623,"cz":0,"lx":9.600000000000001,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-7.214654382048406,-5.779801623904644,0],"rightPoint":[-7.214654382048404,3.820198376095357,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"moXtDnyecvwRem92AzKP6s","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Wall","cx":5.700000000000008,"cy":-2.6500000000000012,"cz":0,"lx":3.5,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[8,-2.5,0],"rightPoint":[8,1,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"n3Fbp8o59RXvpMXPY1s1Sm","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Wall","cx":5.710429595506894,"cy":3.3385814547866905,"cz":0,"lx":3.5,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[7.210429595506889,1.3885814547866906,0],"rightPoint":[7.210429595506889,4.88858145478669,0],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"vhwBgsvb2XNRoUeLKEqhYZ","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Wall","cx":-0.25,"cy":-4.660000000000009,"cz":0,"lx":11.5,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-6,-7,0],"rightPoint":[5.5,-7,0],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"wSthZNuu3hKxPyS8LHSGvS","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Wall","cx":-0.211862519698188,"cy":5.176033006265223,"cz":0,"lx":11.5,"ly":0.1,"lz":1,"leftJoints":[],"rightJoints":[],"leftPoint":[-8.76186251969819,5.476033006265222,0],"rightPoint":[2.7381374803018104,5.476033006265222,0],"relativeAngle":0,"textureType":"Wall Texture Default","normal":[0,0,1],"rotation":[0,0,0],"id":"um8H4fZzRuLbZZ81bgs5nP","parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","wallStructure":"Stud","structureSpacing":0.2,"structureWidth":0.05,"opacity":0,"selected":false,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.5,"rightTopPartialHeight":0.5},{"type":"Door","cx":0,"cy":0,"cz":-0.34805186284300194,"lx":0.4774627497807679,"ly":0,"lz":0.3038962743139961,"textureType":"Door Texture #2","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"h5Bd5QDcL7vWMTHPSCDuBD","doorType":"Default","archHeight":1,"filled":true},{"type":"Tree","name":"Fan Palm","cx":2.7985631567413556,"cy":-10.731117262084023,"cz":0,"lx":6.375358320482912,"lz":8.451212523084012,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"iQhcHctqyRJaG4XFZS4XMk","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.1,"roofType":"Hip","roofStructure":"Default","wallsId":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"textureType":"Roof Texture #1","color":"#454769","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"ddvCooK4VAFN7dUMWPpapB","leftRidgeLength":3,"rightRidgeLength":3,"rise":1.4109420933443069,"ceiling":false},{"type":"Flower","name":"Peony","cx":7.023550381410839,"cy":-3.8877826159721582,"cz":0.12499999999999956,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"hRzYHbdXP7aLP7JcDbRqRR","selected":false},{"type":"Flower","name":"Peony","cx":6.9734776254848185,"cy":-2.9143031643660438,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"vMLhayUTUD8aHWGMkGHz6W","selected":false},{"type":"Flower","name":"Peony","cx":6.9889157221008045,"cy":-1.8856467808244108,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"aKoXDkCANHQbTt7sp6H4cD","selected":false},{"type":"Flower","name":"Peony","cx":7.056609460752512,"cy":2.106696532214023,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"drvWi4itbJZhSYfhzMLFUz","selected":false},{"type":"Flower","name":"Peony","cx":7.073130172902122,"cy":3.1951278306332282,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3XQg1jKjV5dafQKCUY9Tom","selected":false},{"type":"Flower","name":"Peony","cx":6.831179450888563,"cy":4.436138900477424,"cz":0.125,"lx":1.5,"lz":1,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"7ETHmh5VY9WD7DqvsYegAD","selected":false},{"type":"Tree","name":"Fan Palm","cx":-3.064329828704058,"cy":-11.205145732983894,"cz":4.440892098500626e-16,"lx":6.375358320482912,"lz":8.451212523084012,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"stqfKSZKDeaDe1syQCZ2RQ","selected":false},{"type":"Tree","name":"Fan Palm","cx":-10.213746832393127,"cy":-10.383228886165,"cz":-4.440892098500626e-16,"lx":6.375358320482912,"lz":8.451212523084012,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"u5zC3LfHnyukcnd2TZGm5n","selected":false},{"type":"Human","name":"Jade","cx":4.6162547175937405,"cy":0.8236142952720673,"cz":0.125,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"kEK1sks1vjBNeG9bYUByB6","selected":false,"ly":0.48},{"type":"Human","name":"Jaye","cx":4.113865624208955,"cy":-0.1569064565752818,"cz":0.125,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jiL3321sgunb78Yp2wx7LZ","selected":false,"ly":0.55},{"type":"Human","name":"Jack","cx":2.270983153500868,"cy":-5.647402265265438,"cz":0.125,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"qKXJTHDFWk1Be3UB18FicH","selected":false,"ly":0.42},{"type":"Human","name":"Jeanette","cx":6.811654467665146,"cy":0.3288410550941858,"cz":0.12500000000000044,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jdNC43ZSdnd8zSCxaT42uJ","selected":false,"ly":0.4},{"type":"Human","name":"Jedi","cx":4.3803812097281964,"cy":-6.219962402856187,"cz":0.12500000000000044,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tktL4bCeJqmadSREQxqYZf","selected":false,"ly":0.56},{"type":"Human","name":"Jaah","cx":8.073408817436135,"cy":-2.861373653368049,"cz":0.125,"lx":0.74,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3tNBEAxUt3DLTZFUWrkT43","selected":false,"ly":0.74},{"type":"Human","name":"Jena","cx":5.650342532886793,"cy":-5.869419038331923,"cz":0.125,"lx":0.695,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"jbcUSTcV9ETtNTun9qHy9c","selected":false,"ly":0.695},{"type":"Human","name":"Jennifer","cx":6.650342532886793,"cy":-5.869419038331923,"cz":0.125,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"6mEiayfKLXRKd6HoatZeT7","selected":false,"ly":0.45},{"type":"Human","name":"Jeff","cx":8.281124000346418,"cy":-0.21288109922245724,"cz":0.125,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"o9nFAFEjnDEDMLNsibYbMM","selected":false,"ly":0.6},{"type":"Human","name":"Jacqueline","cx":8.774300454275942,"cy":-3.11382005301836,"cz":0.12499999999999956,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"9kJpcRTmPtd11noXLWWsGH","selected":false,"ly":0.43},{"type":"Human","name":"Joey","cx":5.394689962250994,"cy":-6.419034150551809,"cz":0.12500000000000044,"lx":0.462,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"wMtjHPExCprVrQ6rgijhKz","selected":false,"ly":0.462},{"type":"Human","name":"Jett","cx":5.607500871784192,"cy":-7.300972318306286,"cz":0.12500000000000044,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tfCgFHPgnZKoKRfd18qKeP","selected":false,"ly":0.6},{"type":"Human","name":"John","cx":7.617007740588695,"cy":-5.315039692166635,"cz":0.125,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3NBaVzParvnoX1VTgD2qhi","selected":false,"ly":0.6},{"type":"Human","name":"Judd","cx":8.557509471799634,"cy":-7.331160131258592,"cz":0.125,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"gM888A8u94AD92SprN4wbj","selected":false,"ly":0.544},{"type":"Human","name":"Joan","cx":5.580895600535009,"cy":10.995552502214208,"cz":0,"lx":1.7,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"1j9fkBAMPQ7exCAX2P7fF1","selected":false,"ly":1.7},{"type":"Human","name":"Joel","cx":6.580895600535009,"cy":10.995552502214208,"cz":0,"lx":1.8,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3SfQXzZu7J7mi1JmUBYxFc","selected":false,"ly":1.8},{"type":"Human","name":"June","cx":9.253027066264448,"cy":-1.8207404946549808,"cz":0.125,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"uiRD36Lx6DhqS1L8GSmo2f","selected":false,"ly":0.65},{"type":"Human","name":"Juro","cx":7.94102921033523,"cy":-5.9229770250984926,"cz":0.12500000000000044,"lx":0.494,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"2LZ8A82RZWiecfd18pDMu3","selected":false,"ly":0.494},{"type":"Human","name":"Jamelia","cx":7.019233078838581,"cy":-6.865958327348711,"cz":0.125,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nArb1Wy1pTTLTAwpfD1gxv","selected":false,"ly":0.65},{"type":"Human","name":"Jiya","cx":6.536125724548311,"cy":-7.090427106555895,"cz":0.125,"lx":0.6,"lz":1.74,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3rhHbB9NPHbS5kJ4toDf75","selected":false,"ly":0.6},{"type":"Human","name":"Jumapili","cx":4.710047052887569,"cy":-7.365082439159079,"cz":0.12500000000000044,"lx":0.75,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"2ydVQyK8TCn9PXCMXcCTEy","selected":false,"ly":0.75},{"type":"Human","name":"James","cx":8.638930109856844,"cy":-4.382295505716076,"cz":0.12500000000000044,"lx":0.472,"ly":0.472,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"ucP3AmMZpFLmiVbQL9CJRg","selected":false},{"type":"Human","name":"Jaya","cx":8.430115188508257,"cy":-4.95104947778114,"cz":0.125,"lx":0.6,"ly":0.6,"lz":1.55,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tSdmVjv6FH3XWNZ5eajwUB","selected":false},{"type":"Human","name":"Jocelyn","cx":9.099153262139186,"cy":1.6734195388718494,"cz":0.125,"lx":0.4,"ly":0.4,"lz":1.72,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"oY9mHLD2TnGtS48tFX7msv","selected":false},{"type":"Human","name":"Julia","cx":8.50369110484068,"cy":-5.75207005231741,"cz":0.125,"lx":0.43,"ly":0.43,"lz":1.71,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"noQp7pbZpEPcCC5Bwy2Ds5","selected":false},{"type":"Human","name":"Julio","cx":6.3276841954899155,"cy":-7.497137528054779,"cz":0.12500000000000044,"lx":0.5,"ly":0.5,"lz":1.76,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"86gZdR7TufwZSuihX2WNJZ","selected":false},{"type":"Human","name":"Jose","cx":4.085694603550463,"cy":-9.392938952651445,"cz":0,"lx":2,"ly":2,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"pTRxrEpSAWLBc3BhSmJurU","selected":false},{"type":"Human","name":"Joseph","cx":4.70285983370786,"cy":-8.668392524889338,"cz":8.881784197001252e-16,"lx":0.6,"ly":0.6,"lz":1.88,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"qx4Vz41aeQtxbcayMgdcfb","selected":false},{"type":"Light","decay":2,"distance":5,"intensity":3,"color":"#ffff99","cx":0.0032094235984929786,"cy":0,"cz":-0.15034969489506517,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[1,-2.220446049250313e-16,0],"rotation":[0,0,0],"parentId":"pPpJHGJ2bGVqLdA1FpXi4V","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"7ZdVSQw5Udf8Sk6TxfRr7E","selected":false},{"type":"Human","name":"Jill","cx":9.085367232279435,"cy":2.675249483795916,"cz":0.125,"lx":0.42,"ly":0.42,"lz":1.71,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"tnutvhGAiQivDEaTbwWokd","selected":false},{"type":"Human","name":"Jane","cx":10.315104916263296,"cy":-5.841074350867604,"cz":0,"lx":0.4,"ly":0.4,"lz":1.67,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"2qCeCbYUD9ZAWR8LaSwSBc","selected":false},{"type":"Human","name":"Judy","cx":8.894992472252287,"cy":-0.05735797632890183,"cz":0.125,"lx":0.41,"ly":0.41,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"evvFN1Y5c55LCjm2Zs4RPR","selected":false},{"type":"Human","name":"Jonathon","cx":7.865481936696703,"cy":-8.800651006432007,"cz":-4.440892098500626e-16,"lx":0.6,"ly":0.6,"lz":1.9,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"cPGv26A3o2hSuwc8DPUQ6y","selected":false},{"type":"Human","name":"Joshua","cx":9.361559767195017,"cy":-2.653290992466755,"cz":0.12499999999999956,"lx":0.5,"ly":0.5,"lz":1.79,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rd5u6niG5wuUyGxwjj9FrQ","selected":false},{"type":"Human","name":"Justin","cx":8.841054844860178,"cy":-3.9407835630247803,"cz":0.125,"lx":0.6,"ly":0.6,"lz":1.755,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"nctqWUAWcyYHT4SGzerSs4","selected":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.5,"y":-0.5},{"x":-0.5,"y":-0.25},{"x":0.5,"y":-0.25},{"x":0.5,"y":-0.5}],"parentId":"8XDG3EHsQoX26MhuzwMYUM","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":2,"id":"bcBZb3U93o5F2jxgHWz66U","text":"Welcome to Moosehorn State Park","fontSize":0.5,"fontColor":"gold","fontOutlineColor":"white","fontOutlineWidth":0,"fontStrokeWidth":0.01,"noOutline":false,"textureType":"Polygon Texture #9"}],"sceneRadius":19,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[3.150676678462785,4.331280702823742,0.00000433147322558565],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[3.150676678462785,4.331130696160679,150],"theme":"Lake","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[17.624223636446942,-6.695533088864225,2.329292013297666],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.84710869799634,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0.4679506390771288,0.22749806834114614,2.3292876283609285],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},475:function(e){e.exports=JSON.parse('{"docid":"mW1ttJThpPJ2JKrSAT7EUP","time":"02/04/2023 01:03 pm","timestamp":1675533820168,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":31.29833989999999,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":120.58319,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Suzhou, Jiangsu, China","date":"4/22/2022, 3:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Exact","daysPerYear":4},"elements":[{"cy":-0.059966096117782364,"normal":[0,0,1],"lz":0.08187919001653333,"ly":13.340881459022976,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.23469319781280173,"cz":0.05,"rotation":[0,0,0],"lx":13.149110146454165,"selected":false,"parentId":"Ground","locked":false},{"type":"Wall","cx":-5.704543355403865,"cy":0.218424664108547,"cz":0,"lx":5.274193548387098,"ly":0.3,"lz":4,"relativeAngle":-1.5707963267948972,"leftPoint":[-5.704543355403863,2.855521438302096,0.08187919001653333],"rightPoint":[-5.704543355403865,-2.418672110085002,0.08187919001653333],"leftJoints":["phev4gQxjvHYwHg819vEHB"],"rightJoints":["kdCvwj5JgamPrPyPvrdvAm"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4xuyJn2DKfBNBFjKWxSNkV","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-4.031115363517457,"cy":4.320575201742957,"cz":0,"lx":4.448255286649458,"ly":0.3,"lz":4,"relativeAngle":-2.4224905134396697,"leftPoint":[-2.357687371631047,5.785628965183817,0.08187919001653333],"rightPoint":[-5.7045433554038665,2.855521438302096,0.08187919001653333],"leftJoints":["98ta6USvR1CGq17YJbnQS1"],"rightJoints":["4xuyJn2DKfBNBFjKWxSNkV"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"phev4gQxjvHYwHg819vEHB","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-4.031115363517457,"cy":-4.176736626214033,"cz":0,"lx":4.854339125731116,"ly":0.3,"lz":4,"relativeAngle":-0.8100578027781637,"leftPoint":[-5.704543355403865,-2.418672110085002,0.08187919001653333],"rightPoint":[-2.357687371631049,-5.934801142343065,0.08187919001653333],"leftJoints":["4xuyJn2DKfBNBFjKWxSNkV"],"rightJoints":["nw6raZBAGuWkF5ubuLU8xD"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kdCvwj5JgamPrPyPvrdvAm","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":4.33602459591459,"cy":-4.176736626214031,"cz":0,"lx":4.854339125731116,"ly":0.3,"lz":4,"relativeAngle":0.8100578027781632,"leftPoint":[2.66259660402818,-5.934801142343061,0.08187919001653333],"rightPoint":[6.0094525878009994,-2.4186721100849997,0.08187919001653333],"leftJoints":["nw6raZBAGuWkF5ubuLU8xD"],"rightJoints":["iV9VtU8uZo4yDiYJfPcmdy"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"npYCeoFyusHZjnvHSA5MHT","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.15245461619856626,"cy":5.785628965183817,"cz":0,"lx":5.020283975659227,"ly":0.3,"lz":4,"relativeAngle":3.1415926535897927,"leftPoint":[2.66259660402818,5.7856289651838155,0.08187919001653333],"rightPoint":[-2.357687371631047,5.785628965183817,0.08187919001653333],"leftJoints":["p7LQvPgC6EYePDocPwo9xL"],"rightJoints":["phev4gQxjvHYwHg819vEHB"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"98ta6USvR1CGq17YJbnQS1","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.0094525878009994,"cy":0.21842466410854633,"cz":0,"lx":5.274193548387096,"ly":0.3,"lz":4,"relativeAngle":1.5707963267948966,"leftPoint":[6.0094525878009994,-2.418672110085002,0.08187919001653333],"rightPoint":[6.0094525878009994,2.8555214383020946,0.08187919001653333],"leftJoints":["npYCeoFyusHZjnvHSA5MHT"],"rightJoints":["p7LQvPgC6EYePDocPwo9xL"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iV9VtU8uZo4yDiYJfPcmdy","roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.1526933276969229,"cy":-5.934801142343063,"cz":0,"lx":5.021429002185668,"ly":0.3,"lz":4,"leftJoints":["kdCvwj5JgamPrPyPvrdvAm"],"rightJoints":["npYCeoFyusHZjnvHSA5MHT"],"leftPoint":[-2.357687371631049,-5.934801142343065,0.08187919001653333],"rightPoint":[2.6630740270248947,-5.934801142343061,0],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"nw6raZBAGuWkF5ubuLU8xD","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":4.33602459591459,"cy":4.3205752017429555,"cz":0,"lx":4.448255286649457,"ly":0.3,"lz":4,"leftJoints":["iV9VtU8uZo4yDiYJfPcmdy"],"rightJoints":["98ta6USvR1CGq17YJbnQS1"],"leftPoint":[6.0094525878009994,2.8555214383020946,0.08187919001653333],"rightPoint":[2.66259660402818,5.7856289651838155,0.08187919001653333],"relativeAngle":2.4224905134396693,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"p7LQvPgC6EYePDocPwo9xL","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"roofId":"cqv2PuQ6Ct8FunGC5Rsg5E","leftRoofHeight":4,"rightRoofHeight":4,"color":"#d8cdbb","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Human","name":"Jack","cx":-4.760459270800288,"cy":-2.5348481679853134,"cz":0.1,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"wvAyR5FHsaRG2ToXMAXh87","selected":false,"ly":0.42,"locked":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Mansard","roofStructure":"Default","wallsId":["npYCeoFyusHZjnvHSA5MHT"],"ridgeWidth":1,"textureType":"No Roof Texture","color":"#8e826f","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cqv2PuQ6Ct8FunGC5Rsg5E","locked":false,"rise":1.4151723428443308,"ceiling":false},{"type":"Wall","cx":-4.710361945157022,"cy":1.4641075126787761,"cz":0,"lx":4.0741991827809585,"ly":0.3,"lz":7.5,"leftJoints":["mNbBhBDTayeXWAoDE8ip6A"],"rightJoints":["giioZ24KGCk6oJoadGeQJg"],"leftPoint":[-4.710361945157022,3.5012071040692554,0.08187919001653333],"rightPoint":[-4.7103619451570236,-0.5729920787117029,0.08187919001653333],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"fKn6ccVkMdWqQghcJAFmEQ","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-3.3998110672719446,"cy":4.632929099286187,"cz":0,"lx":3.463142086593125,"ly":0.3,"lz":7.5,"leftJoints":["fPGQ97jmfXKFKCgzdf8tK2"],"rightJoints":["fKn6ccVkMdWqQghcJAFmEQ"],"leftPoint":[-2.0892601893868656,5.7646510945031215,0.08187919001653333],"rightPoint":[-4.7103619451570236,3.5012071040692554,0.08187919001653333],"relativeAngle":-2.429286367572432,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"mNbBhBDTayeXWAoDE8ip6A","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-3.399811067271945,"cy":-1.9310584729720213,"cz":0,"lx":3.774592923611536,"ly":0.3,"lz":7.5,"leftJoints":["fKn6ccVkMdWqQghcJAFmEQ"],"rightJoints":["2Ecm8hWzZfEbStzt675QWs"],"leftPoint":[-4.7103619451570236,-0.5729920787117029,0.08187919001653333],"rightPoint":[-2.089260189386867,-3.2891248672323394,0.08187919001653333],"relativeAngle":-0.8032015766363013,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"giioZ24KGCk6oJoadGeQJg","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":3.152943322153453,"cy":-1.9310584729720182,"cz":0,"lx":3.7745929236115394,"ly":0.3,"lz":7.5,"leftJoints":["2Ecm8hWzZfEbStzt675QWs"],"rightJoints":["dJmNmvxvjdHh3vPxEXp335"],"leftPoint":[1.8423924442683726,-3.289124867232336,0.08187919001653333],"rightPoint":[4.463494200038532,-0.5729920787116995,0.08187919001653333],"relativeAngle":0.8032015766363004,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"oq3EhiCKFwwA92Ur9WnxEC","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-0.12343387255924654,"cy":5.7646510945031215,"cz":0,"lx":3.931652633655238,"ly":0.3,"lz":7.5,"leftJoints":["mPpYQCigCupk4wWxmYLiGt"],"rightJoints":["mNbBhBDTayeXWAoDE8ip6A"],"leftPoint":[1.8423924442683726,5.7646510945031215,0.08187919001653333],"rightPoint":[-2.0892601893868656,5.7646510945031215,0.08187919001653333],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"fPGQ97jmfXKFKCgzdf8tK2","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":4.463494200038532,"cy":1.4641075126787761,"cz":0,"lx":4.0741991827809585,"ly":0.3,"lz":7.5,"leftJoints":["oq3EhiCKFwwA92Ur9WnxEC"],"rightJoints":["mPpYQCigCupk4wWxmYLiGt"],"leftPoint":[4.463494200038532,-0.5729920787117029,0.08187919001653333],"rightPoint":[4.463494200038532,3.5012071040692554,0.08187919001653333],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"dJmNmvxvjdHh3vPxEXp335","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":-0.12343387255924654,"cy":-3.289124867232336,"cz":0,"lx":3.931652633655238,"ly":0.3,"lz":7.5,"leftJoints":["giioZ24KGCk6oJoadGeQJg"],"rightJoints":["oq3EhiCKFwwA92Ur9WnxEC"],"leftPoint":[-2.0892601893868656,-3.289124867232336,0.08187919001653333],"rightPoint":[1.8423924442683726,-3.289124867232336,0.08187919001653333],"relativeAngle":0,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"2Ecm8hWzZfEbStzt675QWs","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"type":"Wall","cx":3.152943322153453,"cy":4.632929099286187,"cz":0,"lx":3.4631420865931273,"ly":0.3,"lz":7.5,"leftJoints":["dJmNmvxvjdHh3vPxEXp335"],"rightJoints":["fPGQ97jmfXKFKCgzdf8tK2"],"leftPoint":[4.463494200038532,3.5012071040692554,0.08187919001653333],"rightPoint":[1.8423924442683726,5.7646510945031215,0.08187919001653333],"relativeAngle":2.4292863675724323,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"mPpYQCigCupk4wWxmYLiGt","parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofId":"56kE8YxGS5vZT15DARe55m","selected":false,"leftRoofHeight":7.5,"rightRoofHeight":7.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":7.5,"rightTopPartialHeight":7.5},{"id":"56kE8YxGS5vZT15DARe55m","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8e826f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"eTosNnXwuFCRGqZWfF7TsY","foundationId":"eTosNnXwuFCRGqZWfF7TsY","roofType":"Mansard","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["oq3EhiCKFwwA92Ur9WnxEC"],"ridgeWidth":1,"selected":false,"locked":false,"rise":1.4151723428443308,"ceiling":false},{"type":"Foundation","cx":0.07312548836645227,"cy":-1.3848958277284682,"cz":0.05,"lx":9.464156224937316,"ly":12.896297667676603,"lz":0.08187919001653333,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"eTosNnXwuFCRGqZWfF7TsY","selected":false,"locked":false},{"type":"Wall","cx":-3.4962075675486224,"cy":2.7874111204970315,"cz":0,"lx":2.8892970239124907,"ly":0.3,"lz":11,"leftJoints":["wg8fH2jxgcfzoEQ3iyHRk5"],"rightJoints":["bzdCKkoEsHKfg6PMf8sKa9"],"leftPoint":[-3.4962075675486224,4.232059632453278],"rightPoint":[-3.496207567548624,1.3427626085407864],"relativeAngle":-1.5707963267948972,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"mMPeuLSFxt2hhKw1jzoAXX","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":-2.5042315840033176,"cy":5.0346421390956335,"cz":0,"lx":2.5519835672660642,"ly":0.3,"lz":11,"leftJoints":["5SAdNQtzr2xU5rw3LJPFUt"],"rightJoints":["mMPeuLSFxt2hhKw1jzoAXX"],"leftPoint":[-1.5122556004580119,5.837224645737991],"rightPoint":[-3.496207567548624,4.232059632453278],"relativeAngle":-2.461342900204164,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"wg8fH2jxgcfzoEQ3iyHRk5","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":-2.5042315840033185,"cy":0.3796636005699572,"cz":0,"lx":2.7651951476053704,"ly":0.3,"lz":11,"leftJoints":["mMPeuLSFxt2hhKw1jzoAXX"],"rightJoints":["d6PNwTS2wJV1Koozu7wRCJ"],"leftPoint":[-3.496207567548624,1.3427626085407864],"rightPoint":[-1.5122556004580128,-0.5834354074008719],"relativeAngle":-0.7706289724283263,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"bzdCKkoEsHKfg6PMf8sKa9","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":2.455648333723217,"cy":0.37966360056995985,"cz":0,"lx":2.765195147605374,"ly":0.3,"lz":11,"leftJoints":["d6PNwTS2wJV1Koozu7wRCJ"],"rightJoints":["1cSqXyGASoNdwCM2MQgYAg"],"leftPoint":[1.4636723501779088,-0.5834354074008692],"rightPoint":[3.4476243172685246,1.3427626085407889],"relativeAngle":0.770628972428325,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"tdJA55oXTxjRMFMd2yzHeU","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":-0.024291625140051565,"cy":5.837224645737991,"cz":0,"lx":2.9759279506359206,"ly":0.3,"lz":11,"leftJoints":["5zeSH5hMhT3UJzZ2VMSrtV"],"rightJoints":["wg8fH2jxgcfzoEQ3iyHRk5"],"leftPoint":[1.4636723501779088,5.837224645737991],"rightPoint":[-1.5122556004580119,5.837224645737991],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"5SAdNQtzr2xU5rw3LJPFUt","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":3.4476243172685246,"cy":2.7874111204970315,"cz":0,"lx":2.8892970239124907,"ly":0.3,"lz":11,"leftJoints":["tdJA55oXTxjRMFMd2yzHeU"],"rightJoints":["5zeSH5hMhT3UJzZ2VMSrtV"],"leftPoint":[3.4476243172685246,1.3427626085407864],"rightPoint":[3.4476243172685246,4.232059632453278],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"1cSqXyGASoNdwCM2MQgYAg","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":-0.024291625140051565,"cy":-0.5834354074008692,"cz":0,"lx":2.9759279506359206,"ly":0.3,"lz":11,"leftJoints":["bzdCKkoEsHKfg6PMf8sKa9"],"rightJoints":["tdJA55oXTxjRMFMd2yzHeU"],"leftPoint":[-1.5122556004580119,-0.5834354074008692],"rightPoint":[1.4636723501779088,-0.5834354074008692],"relativeAngle":0,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"d6PNwTS2wJV1Koozu7wRCJ","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"type":"Wall","cx":2.455648333723217,"cy":5.0346421390956335,"cz":0,"lx":2.551983567266067,"ly":0.3,"lz":11,"leftJoints":["1cSqXyGASoNdwCM2MQgYAg"],"rightJoints":["5SAdNQtzr2xU5rw3LJPFUt"],"leftPoint":[3.4476243172685246,4.232059632453278],"rightPoint":[1.4636723501779088,5.837224645737991],"relativeAngle":2.4613429002041647,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"5zeSH5hMhT3UJzZ2VMSrtV","parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofId":"kXXsWtzhvHq2DAaXZEi8ju","selected":false,"leftRoofHeight":11,"rightRoofHeight":11,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":11,"rightTopPartialHeight":11},{"id":"kXXsWtzhvHq2DAaXZEi8ju","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8e826f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"67a4Cj7mTjUcKpS9UXcYMf","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","roofType":"Mansard","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["tdJA55oXTxjRMFMd2yzHeU"],"ridgeWidth":1,"selected":false,"locked":false,"rise":1.4151723428443308,"ceiling":false},{"type":"Foundation","cx":-0.1382893636180098,"cy":-2.8344198053167737,"cz":0.05,"lx":7.240655122656252,"ly":11.908488628124994,"lz":0.08187919001653333,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"67a4Cj7mTjUcKpS9UXcYMf","selected":false,"locked":false},{"type":"Wall","cx":-2.305386933936208,"cy":3.5406126703672625,"cz":0,"lx":1.8992997541814245,"ly":0.3,"lz":14.5,"leftJoints":["3uhgX6EhXdVFMDgjKuTvWJ"],"rightJoints":["6a5FbNhUegAfkm1WbCa4hr"],"leftPoint":[-2.305386933936208,4.4902625474579745,0.08187919001653333],"rightPoint":[-2.305386933936208,2.59096279327655,0.08187919001653333],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"m9CmZzHka279S6PzqcJDms","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":-1.6457325150805282,"cy":5.017845812508369,"cz":0,"lx":1.6893644412938968,"ly":0.3,"lz":14.5,"leftJoints":["cj1x2iAzLBRGYCY4fbDa9u"],"rightJoints":["m9CmZzHka279S6PzqcJDms"],"leftPoint":[-0.9860780962248481,5.545429077558764,0.08187919001653333],"rightPoint":[-2.305386933936208,4.4902625474579745,0.08187919001653333],"relativeAngle":-2.466981384386693,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"3uhgX6EhXdVFMDgjKuTvWJ","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":-1.6457325150805282,"cy":1.9578628752160765,"cz":0,"lx":1.8286163715377841,"ly":0.3,"lz":14.5,"leftJoints":["m9CmZzHka279S6PzqcJDms"],"rightJoints":["pLBnaJicNdNqvsWh4XB2xC"],"leftPoint":[-2.305386933936208,2.59096279327655,0.08187919001653333],"rightPoint":[-0.9860780962248481,1.3247629571556034,0.08187919001653333],"relativeAngle":-0.7648600253804781,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"6a5FbNhUegAfkm1WbCa4hr","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":1.6525395791978759,"cy":1.9578628752160787,"cz":0,"lx":1.8286163715377868,"ly":0.3,"lz":14.5,"leftJoints":["pLBnaJicNdNqvsWh4XB2xC"],"rightJoints":["x2WKNCsnTm3wuwLHXfgCEX"],"leftPoint":[0.9928851603421944,1.3247629571556052,0.08187919001653333],"rightPoint":[2.312193998053557,2.5909627932765527,0.08187919001653333],"relativeAngle":0.7648600253804773,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"1WEB2uNx8HTmooMiMdCuRb","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":0.0034035320586731643,"cy":5.545429077558764,"cz":0,"lx":1.9789632565670425,"ly":0.3,"lz":14.5,"leftJoints":["caQUPNBf9AQWUAkvEEKBK9"],"rightJoints":["3uhgX6EhXdVFMDgjKuTvWJ"],"leftPoint":[0.9928851603421944,5.545429077558764,0.08187919001653333],"rightPoint":[-0.9860780962248481,5.545429077558764,0.08187919001653333],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"cj1x2iAzLBRGYCY4fbDa9u","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":2.312193998053557,"cy":3.5406126703672625,"cz":0,"lx":1.8992997541814245,"ly":0.3,"lz":14.5,"leftJoints":["1WEB2uNx8HTmooMiMdCuRb"],"rightJoints":["caQUPNBf9AQWUAkvEEKBK9"],"leftPoint":[2.312193998053557,2.59096279327655,0.08187919001653333],"rightPoint":[2.312193998053557,4.4902625474579745,0.08187919001653333],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"x2WKNCsnTm3wuwLHXfgCEX","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":0.0034035320586731643,"cy":1.3247629571556052,"cz":0,"lx":1.9789632565670425,"ly":0.3,"lz":14.5,"leftJoints":["6a5FbNhUegAfkm1WbCa4hr"],"rightJoints":["1WEB2uNx8HTmooMiMdCuRb"],"leftPoint":[-0.9860780962248481,1.3247629571556052,0.08187919001653333],"rightPoint":[0.9928851603421944,1.3247629571556052,0.08187919001653333],"relativeAngle":0,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"pLBnaJicNdNqvsWh4XB2xC","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"type":"Wall","cx":1.6525395791978759,"cy":5.017845812508369,"cz":0,"lx":1.6893644412938993,"ly":0.3,"lz":14.5,"leftJoints":["x2WKNCsnTm3wuwLHXfgCEX"],"rightJoints":["cj1x2iAzLBRGYCY4fbDa9u"],"leftPoint":[2.312193998053557,4.4902625474579745,0.08187919001653333],"rightPoint":[0.9928851603421944,5.545429077558764,0.08187919001653333],"relativeAngle":2.4669813843866937,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"caQUPNBf9AQWUAkvEEKBK9","parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofId":"pHdzF3ngGjARqDaSnrPCbJ","selected":false,"leftRoofHeight":14.5,"rightRoofHeight":14.5,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":14.5,"rightTopPartialHeight":14.5},{"id":"pHdzF3ngGjARqDaSnrPCbJ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#8e826f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"mZUacXWS8C3iqt3FX2P392","foundationId":"mZUacXWS8C3iqt3FX2P392","roofType":"Mansard","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["1WEB2uNx8HTmooMiMdCuRb"],"ridgeWidth":1,"selected":false,"locked":false,"rise":1.4151723428443308,"ceiling":false},{"type":"Foundation","cx":-0.12202054492778736,"cy":-3.6786752972065244,"cz":0.05,"lx":4.62580908783712,"ly":11.244705561904492,"lz":0.08187919001653333,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mZUacXWS8C3iqt3FX2P392","selected":false,"locked":false},{"type":"Wall","cx":-2.1374696253712813,"cy":0.6843845582744623,"cz":0,"lx":1.3196288700603707,"ly":0.3,"lz":18,"leftJoints":["nDHpcsgkV9peBKJpWVGgfd"],"rightJoints":["k2jx5wJhEXwRbUKXtsBVsi"],"leftPoint":[-2.1374696253712813,1.3441989933046479,0.2],"rightPoint":[-2.1374696253712813,0.02457012324427721,0.2],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"9D7SuFhdAmbL3s4qJSt14J","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":-1.7017113613971415,"cy":1.7107625683214178,"cz":0,"lx":1.1388663119977358,"ly":0.3,"lz":18,"leftJoints":["rhFdf5zdJe6JyTbbEFrxS6"],"rightJoints":["9D7SuFhdAmbL3s4qJSt14J"],"leftPoint":[-1.2659530974230018,2.0773261433381873,0.2],"rightPoint":[-2.1374696253712813,1.3441989933046479,0.2],"relativeAngle":-2.442224676045199,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"nDHpcsgkV9peBKJpWVGgfd","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":-1.7017113613971415,"cy":-0.41530616677584553,"cz":0,"lx":1.2383479561797213,"ly":0.3,"lz":18,"leftJoints":["9D7SuFhdAmbL3s4qJSt14J"],"rightJoints":["k1Zz3xzbmLW17cj6uWBzfc"],"leftPoint":[-2.1374696253712813,0.02457012324427721,0.2],"rightPoint":[-1.2659530974230018,-0.8551824567959683,0.2],"relativeAngle":-0.790101033639045,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"k2jx5wJhEXwRbUKXtsBVsi","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":0.47707995847355766,"cy":-0.4153061667758444,"cz":0,"lx":1.2383479561797235,"ly":0.3,"lz":18,"leftJoints":["k1Zz3xzbmLW17cj6uWBzfc"],"rightJoints":["bQ466SAJMAnn6fakoD16LP"],"leftPoint":[0.041321694499416806,-0.8551824567959676,0.2],"rightPoint":[0.9128382224476985,0.024570123244278763,0.2],"relativeAngle":0.7901010336390442,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"6akTVpZG7AbvMgXaG1q3Nh","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":-0.6123157014617926,"cy":2.0773261433381873,"cz":0,"lx":1.3072747919224188,"ly":0.3,"lz":18,"leftJoints":["cGGqfipx5C3U3jy37qBmH3"],"rightJoints":["nDHpcsgkV9peBKJpWVGgfd"],"leftPoint":[0.041321694499416806,2.0773261433381873,0.2],"rightPoint":[-1.2659530974230018,2.0773261433381873,0.2],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"rhFdf5zdJe6JyTbbEFrxS6","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":0.9128382224476985,"cy":0.6843845582744623,"cz":0,"lx":1.3196288700603707,"ly":0.3,"lz":18,"leftJoints":["6akTVpZG7AbvMgXaG1q3Nh"],"rightJoints":["cGGqfipx5C3U3jy37qBmH3"],"leftPoint":[0.9128382224476985,0.02457012324427721,0.2],"rightPoint":[0.9128382224476985,1.3441989933046479,0.2],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"bQ466SAJMAnn6fakoD16LP","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":-0.6123157014617926,"cy":-0.8551824567959676,"cz":0,"lx":1.3072747919224188,"ly":0.3,"lz":18,"leftJoints":["k2jx5wJhEXwRbUKXtsBVsi"],"rightJoints":["6akTVpZG7AbvMgXaG1q3Nh"],"leftPoint":[-1.2659530974230018,-0.8551824567959676,0.2],"rightPoint":[0.041321694499416806,-0.8551824567959676,0.2],"relativeAngle":0,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"k1Zz3xzbmLW17cj6uWBzfc","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Wall","cx":0.47707995847355766,"cy":1.7107625683214178,"cz":0,"lx":1.1388663119977376,"ly":0.3,"lz":18,"leftJoints":["bQ466SAJMAnn6fakoD16LP"],"rightJoints":["rhFdf5zdJe6JyTbbEFrxS6"],"leftPoint":[0.9128382224476985,1.3441989933046479,0.2],"rightPoint":[0.041321694499416806,2.0773261433381873,0.2],"relativeAngle":2.4422246760452,"textureType":"No Wall Texture","color":"#d8cdbb","normal":[0,0,1],"rotation":[0,0,0],"id":"cGGqfipx5C3U3jy37qBmH3","parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","roofId":"rdzur4ggFrcghzk546PTce","selected":false,"leftRoofHeight":18,"rightRoofHeight":18,"locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":18,"rightTopPartialHeight":18},{"type":"Foundation","cx":0.5137640713758937,"cy":-0.8247397257024911,"cz":0.1,"lx":17.47075427773578,"ly":17.57589746990512,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"t3DvVsTxEUmLPJ5qyzz1Cq","selected":false,"locked":false,"enableGroupMaster":true},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.3982929957049007,"ly":0.3,"lz":0.75,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nw6raZBAGuWkF5ubuLU8xD","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kJ99yCt5NwrUx6aeyLQD19","opacity":0,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.04022745849176903,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.06,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"k1Zz3xzbmLW17cj6uWBzfc","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"2i6NJTsHZcvu5DZpjL2nTf","opacity":0,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.049787851751147326,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"827buPg2up7S5NJpu1bTwc","parentId":"6akTVpZG7AbvMgXaG1q3Nh","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.03092128411947934,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"696xgzPkcYLSq7T7Qw1kVp","parentId":"bQ466SAJMAnn6fakoD16LP","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.03385386298551652,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jCNeHwVCUvbqQjRxPEpVWh","parentId":"k2jx5wJhEXwRbUKXtsBVsi","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.06228256362044849,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"x8xMT8Y3CFHpSTTtRuQJEH","parentId":"cGGqfipx5C3U3jy37qBmH3","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.02834774148633909,"cy":0.1,"cz":0.44166666666666665,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"nppApRrEXRyeUd9vJfwuSz","parentId":"rhFdf5zdJe6JyTbbEFrxS6","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.02951470439825077,"cy":0.1,"cz":0.44184392259435495,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"wGQdjaEJAq274XD4qjARvv","parentId":"nDHpcsgkV9peBKJpWVGgfd","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.02377711455299869,"cy":0.1,"cz":0.4427721444522278,"lx":0.40227458491769036,"ly":0.3,"lz":0.061111111111111144,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"bfx8vmpw2KKDieuVcLZMqt","parentId":"9D7SuFhdAmbL3s4qJSt14J","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3333333333333333,"lx":0.2543459692852634,"ly":0.3,"lz":0.2666666666666667,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"b18KSu7muEcNBoRo9BCFtR","parentId":"2Ecm8hWzZfEbStzt675QWs","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.005291630779154989,"cy":0.1,"cz":0.36666666666666664,"lx":0.2543459692852634,"ly":0.3,"lz":0.20000000000000007,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"6ehjjnYKcMRY6uDm39RjZg","parentId":"oq3EhiCKFwwA92Ur9WnxEC","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.00444948057017957,"cy":0.1,"cz":0.36666666666666664,"lx":0.2543459692852634,"ly":0.3,"lz":0.20000000000000007,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"beNSFD5YoXGJs5n6HkCEia","parentId":"dJmNmvxvjdHh3vPxEXp335","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":5.610195147971379e-17,"cy":0.1,"cz":0.3333333333333333,"lx":0.2887551174614818,"ly":0.3,"lz":0.2666666666666667,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"enXaCvRZY1o42EepsmhAcu","parentId":"mPpYQCigCupk4wWxmYLiGt","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3333333333333333,"lx":0.2543459692852634,"ly":0.3,"lz":0.2666666666666667,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"co2nWxWjHSrQ1y3CbewV71","parentId":"fPGQ97jmfXKFKCgzdf8tK2","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3333333333333333,"lx":0.2887551174614821,"ly":0.3,"lz":0.2666666666666667,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"oAJfvW2Atau2PMDooxnZup","parentId":"mNbBhBDTayeXWAoDE8ip6A","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":2.72500919767831e-17,"cy":0.1,"cz":0.33333333333333326,"lx":0.24544700814490417,"ly":0.3,"lz":0.2666666666666668,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"oysyT4xkNku4YbbVaJZRwr","parentId":"fKn6ccVkMdWqQghcJAFmEQ","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.3333333333333333,"lx":0.2649292308435736,"ly":0.3,"lz":0.26666666666666666,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tfr35CsQ7uYrvJEbNiSm9Z","parentId":"giioZ24KGCk6oJoadGeQJg","foundationId":"eTosNnXwuFCRGqZWfF7TsY","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-2.007494887994791e-17,"cy":0.1,"cz":0.38636363636363646,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aVd2M9mPnyt54bpo1cinGs","parentId":"bzdCKkoEsHKfg6PMf8sKa9","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.01280424424064466,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vEK53nipfn3Fi9zDdjYNwA","parentId":"d6PNwTS2wJV1Koozu7wRCJ","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":2.0074948879947884e-17,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086014,"ly":0.3,"lz":0.1363636363636365,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"7a8LzQgQTZT74cAMqSaHG3","parentId":"tdJA55oXTxjRMFMd2yzHeU","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.007766589935909038,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"m8mvZULmKJiijiJZQ4Ws2p","parentId":"1cSqXyGASoNdwCM2MQgYAg","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.015106961898701282,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"2yZN5brch6X6VdX7qusThM","parentId":"5zeSH5hMhT3UJzZ2VMSrtV","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.01280424424064466,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"6wGZka29sHQXPaM4orSj26","parentId":"5SAdNQtzr2xU5rw3LJPFUt","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.015106961898701494,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tFAKFAeYrHzMpedpoQ4z2J","parentId":"wg8fH2jxgcfzoEQ3iyHRk5","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0.007766589935909038,"cy":0.1,"cz":0.3863636363636363,"lx":0.36163812918086063,"ly":0.3,"lz":0.13636363636363652,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tsfJ1jgF5hbLvum632wKcR","parentId":"mMPeuLSFxt2hhKw1jzoAXX","foundationId":"67a4Cj7mTjUcKpS9UXcYMf","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"1tp2T4LDRLMNEK26RseK5r","parentId":"pLBnaJicNdNqvsWh4XB2xC","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.020773233582139315,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"tgrkWzLGJa5Q9w4cDnLRRp","parentId":"1WEB2uNx8HTmooMiMdCuRb","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.01059737146443586,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"o3JTZDoUCh4i6VTFAXTRi5","parentId":"x2WKNCsnTm3wuwLHXfgCEX","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"86L95Fnu4u89jayQZWX5Xw","parentId":"cj1x2iAzLBRGYCY4fbDa9u","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.043311747423323166,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vNmcUsYJDkYimiCfMHdNFB","parentId":"3uhgX6EhXdVFMDgjKuTvWJ","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.01059737146443586,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"dDi3Fw7AsTes6zvNGEEHiL","parentId":"m9CmZzHka279S6PzqcJDms","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-0.02077323358213971,"cy":0.1,"cz":0.41772030651340997,"lx":0.5053150919713008,"ly":0.3,"lz":0.13007662835249043,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"bAVGu4K7Tu42BYzdxoX44L","parentId":"6a5FbNhUegAfkm1WbCa4hr","foundationId":"mZUacXWS8C3iqt3FX2P392","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.4120025297364816,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"qGTqwRerdw925V3dp1Zxqj","parentId":"npYCeoFyusHZjnvHSA5MHT","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.3792048929663609,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"76hrnZkDNKTnFBf136Yypd","parentId":"iV9VtU8uZo4yDiYJfPcmdy","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":-2.4958617549610238e-17,"cy":0.1,"cz":-0.125,"lx":0.44961448278442956,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"4dQWwkYdrjgXGYUZinRtRU","parentId":"p7LQvPgC6EYePDocPwo9xL","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.39838383838383856,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"vetMY2wce8PY7wZMnBgYtd","parentId":"98ta6USvR1CGq17YJbnQS1","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.125,"lx":0.4496144827844295,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"v2Bpx6NQy5wWaCAkP524Kv","parentId":"phev4gQxjvHYwHg819vEHB","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":3.157515024163289e-17,"cy":0.1,"cz":-0.12499999999999994,"lx":0.3792048929663607,"ly":0.3,"lz":0.7499999999999999,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"rDQtPqhJZVdy7Xh7XJRsb3","parentId":"4xuyJn2DKfBNBFjKWxSNkV","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Window","cx":8.004757157551921e-17,"cy":0.1,"cz":-0.125,"lx":0.4120025297364814,"ly":0.3,"lz":0.75,"mullionWidth":0.06,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"e19JPkz5u6tKcbjYUvXegq","parentId":"kdCvwj5JgamPrPyPvrdvAm","foundationId":"of4fAMi2p9MKmo6JDUYnfX","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":false,"mullion":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1},{"type":"Human","name":"Jacqueline","cx":4.255864387589413,"cy":-6.242196181277151,"cz":0.1,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"wfWT37sYApxTzWzUncAoR9","selected":false,"locked":false,"ly":0.43},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["6akTVpZG7AbvMgXaG1q3Nh","bQ466SAJMAnn6fakoD16LP","cGGqfipx5C3U3jy37qBmH3","rhFdf5zdJe6JyTbbEFrxS6","nDHpcsgkV9peBKJpWVGgfd","9D7SuFhdAmbL3s4qJSt14J","k2jx5wJhEXwRbUKXtsBVsi","k1Zz3xzbmLW17cj6uWBzfc"],"textureType":"No Roof Texture","color":"#8e826f","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"rdzur4ggFrcghzk546PTce","locked":false,"rise":0.7945305564645331,"ceiling":false},{"type":"Tree","name":"Dogwood","cx":7.392171297775102,"cy":7.163513110419622,"cz":0.10000000149011612,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"jBw9RYvUZrnME36Vm8DaPW","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":6.759545239381245,"cy":-2.5910214138353416,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"5kQBFtBdW6bwiFWnzf9wwH","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":6.490113616723971,"cy":3.8154638360153057,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"2GfJNYSop6f5v7xSek1ytE","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":2.508512970788757,"cy":7.348011777521739,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"adVq8AGmfbAWANd1ERqtLC","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-3.329172186785436,"cy":7.377948624483658,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"okSKfXzr6RNLYQU4kZsQEZ","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-7.9394466189209485,"cy":4.054958611710656,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"cbRLDrHAkXSVreLWjbyF5V","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-7.819699231073273,"cy":-2.2317792502923153,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"buHEZW6R7p71SuhwZZJ2PT","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-3.808161738176137,"cy":-6.572622059770561,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"9DD3bFQeXC1bN3n5JNfTHY","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":2.2690181950934063,"cy":-6.572622059770561,"cz":0.10000000149011612,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"bnApLQ8V1oJiPKXxDRPxb4","selected":false,"locked":false},{"type":"Tree","name":"Dogwood","cx":7.328345331657704,"cy":-6.931864223313587,"cz":0.10000000149011612,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"g8PvSEYYsCu2XWBqG3iX5a","selected":false,"locked":false},{"type":"Tree","name":"Dogwood","cx":-7.759825537149433,"cy":-6.692369447618235,"cz":0.10000000149011612,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"eFc8WGqQzEfKvVgDn3e4Wq","selected":false,"locked":false},{"type":"Tree","name":"Dogwood","cx":-7.459318010176873,"cy":7.482898989893004,"cz":0.10000000149011612,"lx":3,"lz":4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"288KLWR7KewUpd13gMeuAi","selected":false,"locked":false},{"type":"Window","cx":0.029596929340897304,"cy":0.1,"cz":0.42068965517241375,"lx":0.5327447281361516,"ly":0.3,"lz":0.11034482758620694,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"caQUPNBf9AQWUAkvEEKBK9","foundationId":"mZUacXWS8C3iqt3FX2P392","id":"g8YUeBMeW1DSqfqrvD7Vbk"},{"type":"Light","decay":2,"distance":10,"intensity":2,"color":"#fe9200","cx":-0.030005590627033965,"cy":-0.4532425907688764,"cz":0.5000000074505895,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"qF9C6U2NXL7yTL6tKt4cmM","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":2,"color":"#7b64ff","cx":0.4305972540929517,"cy":0.06205523390636515,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"c16cf3Q9umV9K4iATpzZdw","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":2,"color":"#68bc00","cx":-0.03448954854070917,"cy":0.43858567895245787,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"kdV7kizuYhPCDkqnpXr6Jf","selected":false},{"type":"Light","decay":2,"distance":10,"intensity":2,"color":"#fa28ff","cx":-0.44220837093921556,"cy":0.040360464163231746,"cz":0.5000000074505806,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t3DvVsTxEUmLPJ5qyzz1Cq","foundationId":"t3DvVsTxEUmLPJ5qyzz1Cq","id":"pCzfVRHLpKFtr7SXEbAF9q","selected":false}],"view":{"yearlyPvYieldPanelX":-67,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Grassland","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":66,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-13,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[-2.010984368039464,-28.85991180576142,8.94754765614511],"panCenter":[-0.2875344548235237,0.8941760908925925,8.94754765614511],"orthographic":false,"enableRotate":true,"cameraZoom":33.40365140230189,"showInstructionPanel":true,"cameraPosition2D":[0.3578976625538651,1.7782818083550982,150],"panCenter2D":[0.3578976625538651,1.778431815016015,0.000002363573287717466],"showEvolutionPanel":false,"solarRadiationHeatMapMaxValue":6,"evolutionPanelX":-13,"evolutionPanelY":8,"evolutionPanelRect":{"x":0,"y":0,"width":498,"height":340},"waterSurface":false,"showMapPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"selectionMethod":1,"searchMethod":1,"populationSize":30,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},476:function(e){e.exports=JSON.parse('{"docid":"8fjimYdFfmatTLYR2DNXvA","time":"02/04/2023 01:05 pm","timestamp":1675533906512,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"orthographic":false,"noAnimationForSolarPanelSimulation":false,"discretization":"Approximate","cspGridCellSize":0.5,"diurnalTemperatureModel":1,"sutDaysPerYear":4,"address":"Honolulu, HI, USA","sutGridCellSize":1,"solarPanelVisibilityGridCellSize":0.2,"airAttenuationCoefficient":0.01,"longitude":-157.86620385714326,"pvGridCellSize":0.5,"date":"4/22/2022, 10:00:00 AM","noAnimationForSolarUpdraftTowerSimulation":false,"cameraZoom":43.16939043526371,"sutTimesPerHour":4,"daysPerYear":12,"timesPerHour":4,"cspDaysPerYear":4,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"albedo":0.3,"thermalDiffusivity":0.05},"latitude":21.310722676290315,"airConvectiveCoefficient":5,"name":"default","solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"highestTemperatureTimeInMinutes":900,"dustLoss":0.05,"noAnimationForHeatmapSimulation":false,"noAnimationForSensorDataCollection":false},"elements":[{"solarAbsorberPipe":{},"solarPowerTower":{},"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"color":"#009ce0","ly":24.9333515261897,"type":"Foundation","parentId":"Ground","lz":0.1,"selected":false,"cz":0.05,"cx":-0.9759327650956084,"cy":2.7473554645675557,"id":"sfVVGvWfY1uFZBwuAeqDnU","solarUpdraftTower":{},"lx":10.57622536718512,"locked":false,"textureType":"No Foundation Texture"},{"showLabel":false,"cz":0,"drawSunBeam":false,"cx":-0.0173882538930337,"color":"#fff","poleRadius":0.05,"parentId":"sfVVGvWfY1uFZBwuAeqDnU","dailyYield":25.00468094869397,"selected":false,"trackerType":"None","orientation":"Portrait","poleSpacing":3,"lx":6.944,"locked":false,"type":"Solar Panel","rotation":[0,0,1.5707963267948966],"ly":3.936,"pvModelName":"CS6X-355P-FG","relativeAzimuth":0,"poleHeight":1.5,"normal":[0,0,1],"id":"4bpFrEwZJxbfGUTtn9R1sg","lz":0.046,"cy":-0.3535113399890203,"foundationId":"sfVVGvWfY1uFZBwuAeqDnU","tiltAngle":0},{"solarAbsorberPipe":{},"lz":0.1,"solarPowerTower":{},"rotation":[0,0,-0.7853981633974483],"locked":false,"cy":3.3785331461228845,"type":"Foundation","solarUpdraftTower":{},"parentId":"Ground","cz":0.05,"selected":false,"lx":17.522626722458362,"ly":16.217549949540043,"normal":[0,0,1],"color":"#009ce0","id":"c2gz3bi2QzLErUX4XmgVX7","cx":2.825325314034343,"textureType":"No Foundation Texture"},{"ly":0.1,"lz":1.75,"selected":false,"textureType":"No Wall Texture","foundationId":"c2gz3bi2QzLErUX4XmgVX7","lineColor":"black","windows":[],"leftPoint":[-0.41513844869064975,-4.018227675100984,0.1],"id":"iQCq8L9uGMQTqYvdj9Zg8G","leftJoints":["cSJn7k7dHrZvyJZf7rCR3h"],"rotation":[0,0,-0.7853981633974483],"showLabel":false,"cz":0,"rightPoint":[0.08486155130934736,-4.01822767510099,0.1],"lineWidth":0.2,"color":"#ffffff","rightJoints":["8BLfCN1Rb2sjqzL81nEAF1"],"locked":false,"cx":-0.16513844869065064,"lx":0.4999999999999971,"roofId":"95ywic4c9x92ks45ZbwSqV","type":"Wall","rightRoofHeight":1.75,"cy":-4.01822767510099,"leftRoofHeight":1.75,"normal":[0,0,1],"relativeAngle":6.283185307179577,"parentId":"c2gz3bi2QzLErUX4XmgVX7","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"cz":0,"foundationId":"c2gz3bi2QzLErUX4XmgVX7","parentId":"c2gz3bi2QzLErUX4XmgVX7","ly":0.1,"cx":-0.16513844869065064,"textureType":"No Wall Texture","roofId":"95ywic4c9x92ks45ZbwSqV","lx":0.5000000000000003,"locked":false,"rightRoofHeight":1.75,"selected":false,"leftPoint":[0.0848615513093498,2.481772324899016,0.1],"cy":2.481772324899016,"lz":1.75,"lineWidth":0.2,"normal":[0,0,1],"relativeAngle":3.1415926535897922,"rightPoint":[-0.41513844869064953,2.481772324899015,0.1],"leftJoints":["8BLfCN1Rb2sjqzL81nEAF1"],"rotation":[0,0,-0.7853981633974483],"type":"Wall","id":"wXQ7LSxUUW2TWS968Lkeqi","showLabel":false,"leftRoofHeight":1.75,"windows":[],"color":"#ffffff","lineColor":"black","rightJoints":["cSJn7k7dHrZvyJZf7rCR3h"],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"leftPoint":[-0.41513844869064953,2.481772324899015,0.1],"locked":false,"lineWidth":0.2,"ly":0.1,"windows":[],"rightRoofHeight":1.75,"color":"#ffffff","leftRoofHeight":1.75,"cx":-0.4151384486906503,"id":"cSJn7k7dHrZvyJZf7rCR3h","lx":6.5,"parentId":"c2gz3bi2QzLErUX4XmgVX7","rightPoint":[-0.41513844869064975,-4.018227675100984,0.1],"rotation":[0,0,-0.7853981633974483],"roofId":"95ywic4c9x92ks45ZbwSqV","cz":0,"textureType":"No Wall Texture","leftJoints":["wXQ7LSxUUW2TWS968Lkeqi"],"selected":false,"foundationId":"c2gz3bi2QzLErUX4XmgVX7","relativeAngle":4.71238898038469,"type":"Wall","cy":-0.7682276751009843,"lz":1.75,"showLabel":false,"lineColor":"black","rightJoints":["iQCq8L9uGMQTqYvdj9Zg8G"],"normal":[0,0,1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"locked":false,"selected":false,"type":"Wall","lz":1.75,"leftRoofHeight":1.75,"textureType":"No Wall Texture","id":"8BLfCN1Rb2sjqzL81nEAF1","leftPoint":[0.08486155130935003,-4.0182276751009915,0.1],"cx":0.08486155130935003,"roofId":"95ywic4c9x92ks45ZbwSqV","cz":0,"ly":0.1,"relativeAngle":1.5707963267948966,"color":"#ffffff","foundationId":"c2gz3bi2QzLErUX4XmgVX7","lineColor":"black","rightPoint":[0.0848615513093498,2.481772324899016,0.1],"cy":-0.7682276751009878,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"lx":6.500000000000005,"leftJoints":["iQCq8L9uGMQTqYvdj9Zg8G"],"parentId":"c2gz3bi2QzLErUX4XmgVX7","rightRoofHeight":1.75,"rightJoints":["wXQ7LSxUUW2TWS968Lkeqi"],"windows":[],"lineWidth":0.2,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"normal":[0,0,1],"wallsId":["8BLfCN1Rb2sjqzL81nEAF1"],"cy":0,"rightRidgeLength":-3.1500000000000026,"locked":false,"lz":0,"id":"95ywic4c9x92ks45ZbwSqV","lineColor":"black","selected":false,"lx":0,"textureType":"No Roof Texture","ly":0,"rotation":[0,0,-0.7853981633974483],"lineWidth":0.2,"cz":0,"foundationId":"c2gz3bi2QzLErUX4XmgVX7","color":"#ffffff","parentId":"c2gz3bi2QzLErUX4XmgVX7","showLabel":false,"thickness":0.05,"roofType":"Hip","leftRidgeLength":3.2500000000000027,"cx":0,"type":"Roof","roofStructure":"Default","rise":16.098880019941728,"sideColor":"#ffffff","ceiling":false},{"cz":0,"rotation":[0,0,-0.7853981633974483],"parentId":"mcxY5unDv2pKvQAJXd1qqG","rightPoint":[0.08486155130934736,-4.01822767510099,0.1],"roofId":"7DEvyGzFf8SCPa5eeKTryQ","leftRoofHeight":1.75,"color":"#ffffff","textureType":"No Wall Texture","rightRoofHeight":1.75,"lz":1.75,"selected":false,"foundationId":"mcxY5unDv2pKvQAJXd1qqG","cx":-0.16513844869065064,"ly":0.1,"cy":-4.01822767510099,"rightJoints":["81FqBBm7B8Cgn7RbBDkgTc"],"type":"Wall","leftJoints":["wPbsRDuG2myaDXtTkpKWyU"],"leftPoint":[-0.41513844869064975,-4.018227675100984,0.1],"normal":[0,0,1],"lx":0.4999999999999971,"relativeAngle":6.283185307179577,"id":"jPQHNjKitSZdUXrDLCKowL","locked":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"rightRoofHeight":1.75,"id":"3DG2FvhMwMqXmaiYMPxgiv","cy":2.481772324899016,"color":"#ffffff","rotation":[0,0,-0.7853981633974483],"rightPoint":[-0.41513844869064953,2.481772324899015,0.1],"lx":0.5000000000000003,"selected":false,"roofId":"7DEvyGzFf8SCPa5eeKTryQ","textureType":"No Wall Texture","leftPoint":[0.0848615513093498,2.481772324899016,0.1],"type":"Wall","parentId":"mcxY5unDv2pKvQAJXd1qqG","foundationId":"mcxY5unDv2pKvQAJXd1qqG","lz":1.75,"locked":false,"leftJoints":["81FqBBm7B8Cgn7RbBDkgTc"],"rightJoints":["wPbsRDuG2myaDXtTkpKWyU"],"relativeAngle":3.1415926535897922,"cx":-0.16513844869065064,"leftRoofHeight":1.75,"normal":[0,0,1],"ly":0.1,"cz":0,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"leftPoint":[-0.41513844869064953,2.481772324899015,0.1],"cx":-0.4151384486906503,"foundationId":"mcxY5unDv2pKvQAJXd1qqG","selected":false,"id":"wPbsRDuG2myaDXtTkpKWyU","leftRoofHeight":1.75,"textureType":"No Wall Texture","color":"#ffffff","rotation":[0,0,-0.7853981633974483],"normal":[0,0,1],"rightJoints":["jPQHNjKitSZdUXrDLCKowL"],"cz":0,"locked":false,"type":"Wall","ly":0.1,"roofId":"7DEvyGzFf8SCPa5eeKTryQ","cy":-0.7682276751009843,"rightRoofHeight":1.75,"lz":1.75,"leftJoints":["3DG2FvhMwMqXmaiYMPxgiv"],"lx":6.5,"parentId":"mcxY5unDv2pKvQAJXd1qqG","relativeAngle":4.71238898038469,"rightPoint":[-0.41513844869064975,-4.018227675100984,0.1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"type":"Wall","color":"#ffffff","rightRoofHeight":1.75,"foundationId":"mcxY5unDv2pKvQAJXd1qqG","cx":0.08486155130935003,"cz":0,"leftJoints":["jPQHNjKitSZdUXrDLCKowL"],"rightJoints":["3DG2FvhMwMqXmaiYMPxgiv"],"ly":0.1,"roofId":"7DEvyGzFf8SCPa5eeKTryQ","leftRoofHeight":1.75,"lz":1.75,"id":"81FqBBm7B8Cgn7RbBDkgTc","cy":-0.7682276751009878,"parentId":"mcxY5unDv2pKvQAJXd1qqG","relativeAngle":1.5707963267948966,"rotation":[0,0,-0.7853981633974483],"selected":false,"textureType":"No Wall Texture","locked":false,"rightPoint":[0.0848615513093498,2.481772324899016,0.1],"normal":[0,0,1],"lx":6.500000000000005,"leftPoint":[0.08486155130935003,-4.0182276751009915,0.1],"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.75,"rightTopPartialHeight":1.75},{"roofStructure":"Default","textureType":"No Roof Texture","lz":0,"cz":0,"rotation":[0,0,-0.7853981633974483],"foundationId":"mcxY5unDv2pKvQAJXd1qqG","type":"Roof","color":"#ffffff","wallsId":["81FqBBm7B8Cgn7RbBDkgTc"],"lx":0,"cx":0,"leftRidgeLength":3.2500000000000027,"rightRidgeLength":-3.1500000000000026,"id":"7DEvyGzFf8SCPa5eeKTryQ","cy":0,"parentId":"mcxY5unDv2pKvQAJXd1qqG","normal":[0,0,1],"roofType":"Hip","thickness":0.05,"locked":false,"selected":false,"ly":0,"rise":16.098880019941728,"sideColor":"#ffffff","ceiling":false},{"cx":-2.820889718788509,"lx":17.522626722458362,"solarAbsorberPipe":{},"cy":3.1943110177197918,"cz":0.05,"id":"mcxY5unDv2pKvQAJXd1qqG","lz":0.1,"normal":[0,0,1],"solarPowerTower":{},"selected":false,"solarUpdraftTower":{},"type":"Foundation","locked":false,"color":"#009ce0","rotation":[0,0,-0.7853981633974483],"ly":16.217549949540043,"parentId":"Ground","textureType":"No Foundation Texture","enableGroupMaster":true},{"rotation":[0,0,0],"leftJoints":["4jxSnG9vT4aBdW8AckRKYU"],"windows":[],"type":"Wall","lx":12.5,"cx":-3.4999999999999987,"showLabel":false,"rightRoofHeight":1.6,"normal":[0,0,1],"textureType":"No Wall Texture","parentId":"sfVVGvWfY1uFZBwuAeqDnU","ly":0.3,"cy":-0.25,"roofId":"uRtLCjK4u6T6gpiAxaqJ4Y","selected":false,"leftPoint":[-3.4999999999999973,6,0],"relativeAngle":4.71238898038469,"lineColor":"black","locked":false,"rightJoints":["dDiLTvTPyJXZvEWaFVYpwD"],"lz":1.6,"lineWidth":0.2,"leftRoofHeight":1.6,"id":"fx2d8KZ2FbN5HXDjmbeNTq","foundationId":"sfVVGvWfY1uFZBwuAeqDnU","rightPoint":[-3.5,-6.5,0],"cz":0,"color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.6,"rightTopPartialHeight":1.6},{"roofId":"uRtLCjK4u6T6gpiAxaqJ4Y","locked":false,"cy":-0.25000000000000044,"rightPoint":[2.9999999999999982,5.999999999999999,0],"selected":false,"rightRoofHeight":1.6,"rightJoints":["4jxSnG9vT4aBdW8AckRKYU"],"leftRoofHeight":1.6,"showLabel":false,"ly":0.3,"windows":[],"parentId":"sfVVGvWfY1uFZBwuAeqDnU","rotation":[0,0,0],"cz":0,"textureType":"No Wall Texture","leftJoints":["dDiLTvTPyJXZvEWaFVYpwD"],"leftPoint":[3,-6.5,0],"lx":12.5,"lineWidth":0.2,"lz":1.6,"normal":[0,0,1],"relativeAngle":1.5707963267948966,"cx":2.999999999999999,"foundationId":"sfVVGvWfY1uFZBwuAeqDnU","type":"Wall","lineColor":"black","id":"kgt2xgas1aqzzJdjuE2oTU","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.6,"rightTopPartialHeight":1.6},{"textureType":"No Wall Texture","parentId":"sfVVGvWfY1uFZBwuAeqDnU","selected":false,"leftRoofHeight":1.6,"lz":1.6,"cx":-0.25,"id":"dDiLTvTPyJXZvEWaFVYpwD","leftJoints":["fx2d8KZ2FbN5HXDjmbeNTq"],"cy":-6.5,"relativeAngle":0,"cz":0,"locked":false,"centerRoofHeight":[0,1.6],"lx":6.5,"type":"Wall","showLabel":false,"roofId":"uRtLCjK4u6T6gpiAxaqJ4Y","ly":0.3,"windows":[],"rightPoint":[3,-6.5,0],"lineWidth":0.2,"leftPoint":[-3.5,-6.5,0],"rightRoofHeight":1.6,"rightJoints":["kgt2xgas1aqzzJdjuE2oTU"],"normal":[0,0,1],"lineColor":"black","rotation":[0,0,0],"foundationId":"sfVVGvWfY1uFZBwuAeqDnU","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.6,"rightTopPartialHeight":1.6},{"leftJoints":["kgt2xgas1aqzzJdjuE2oTU"],"windows":[],"ly":0.3,"locked":false,"centerRoofHeight":[0,1.6],"cy":5.999999999999998,"rightPoint":[-3.4999999999999973,5.999999999999998,0],"showLabel":false,"parentId":"sfVVGvWfY1uFZBwuAeqDnU","textureType":"No Wall Texture","rightJoints":["fx2d8KZ2FbN5HXDjmbeNTq"],"foundationId":"sfVVGvWfY1uFZBwuAeqDnU","type":"Wall","id":"4jxSnG9vT4aBdW8AckRKYU","lz":1.6,"leftRoofHeight":1.6,"rightRoofHeight":1.6,"lineWidth":0.2,"rotation":[0,0,0],"roofId":"uRtLCjK4u6T6gpiAxaqJ4Y","lx":6.499999999999996,"leftPoint":[2.9999999999999982,5.999999999999999,0],"relativeAngle":3.141592653589793,"selected":false,"cz":0,"cx":-0.24999999999999956,"normal":[0,0,1],"lineColor":"black","color":"#ffffff","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1.6,"rightTopPartialHeight":1.6},{"showLabel":false,"wallsId":["fx2d8KZ2FbN5HXDjmbeNTq"],"roofStructure":"Default","locked":false,"ly":0,"normal":[0,0,1],"color":"#ffffff","foundationId":"sfVVGvWfY1uFZBwuAeqDnU","ridgeLeftPoint":[0,1],"cz":0,"lineWidth":0.2,"rotation":[0,0,0],"parentId":"sfVVGvWfY1uFZBwuAeqDnU","roofType":"Gable","ridgeRightPoint":[0,1],"cx":0,"type":"Roof","cy":0,"lineColor":"black","lx":0,"id":"uRtLCjK4u6T6gpiAxaqJ4Y","thickness":0.4,"selected":false,"lz":0,"textureType":"No Roof Texture","rise":0,"sideColor":"#ffffff","ceiling":false},{"type":"Human","name":"Jeff","cx":-6.502161132128585,"cy":-0.11016766385402654,"cz":0.75,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"nxpfXTi8karHMZTuUfg7ua","id":"uohRAyGkaEQKAWQ4nxXd7n","selected":false,"locked":false,"ly":0.6},{"type":"Cuboid","cx":-1.5500000000000027,"cy":5.125000000000001,"cz":0.75,"lx":23.296674873649543,"ly":1.1460990537871516,"lz":1.5,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"jrdvuWjMZPwKCrsCkYbs2x","locked":false},{"type":"Cuboid","cx":-1.5499999999999994,"cy":-0.12500200000011227,"cz":0.75,"lx":23.296674873649543,"ly":1.1460990537871516,"lz":1.5,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"nxpfXTi8karHMZTuUfg7ua","selected":false,"locked":false},{"type":"Foundation","cx":-6.683083197474398,"cy":-67.2866913326566,"cz":0.15,"lx":40,"ly":40,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"ihXBcGst6vfG6pMnKjKmcM","textureType":"Foundation Texture #7","locked":false,"enableGroupMaster":true},{"type":"Foundation","cx":13.760889379859025,"cy":-67.2492084538547,"cz":0.5,"lx":1,"ly":40,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vgW1NebabuY1wd8pyCtxcL","locked":false,"textureType":"Foundation Texture #1","enableGroupMaster":false},{"type":"Foundation","cx":-27.220804284247304,"cy":-67.2105953370125,"cz":0.5,"lx":1,"ly":40,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"erWKhrLkVgeBGrkYbzkvdA","selected":false,"locked":false},{"type":"Foundation","cx":-6.7329733624271535,"cy":-46.77136586096416,"cz":0.5,"lx":42,"ly":1,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9pJgP99aRJ8Ucspa2Xmi3n","selected":false,"locked":false},{"type":"Foundation","cx":-6.740359075877207,"cy":-87.76629626012827,"cz":0.5,"lx":42,"ly":1,"lz":1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vKsvgYQL3ATsUMrkRxNVtG","selected":false,"locked":false},{"type":"Human","name":"Jack","cx":0.038403051629375184,"cy":-10.6680905961247,"cz":0.49999999999999956,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"vgW1NebabuY1wd8pyCtxcL","id":"ca1o8dHiZMnRxbmGVa2QgH","selected":false,"locked":false,"ly":0.42},{"type":"Human","name":"Judd","cx":12.353179322478177,"cy":5.7758180762563,"cz":0.15,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"aUp3bFMPfhPR555kq4RxtS","selected":false,"locked":false,"ly":0.544},{"type":"Human","name":"Jess","cx":17.33662712955384,"cy":1.475715952229109,"cz":0.1500000059604645,"lx":0.43,"lz":1.5,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"wtw985egzP7m3E2u8Hzcug","selected":false,"locked":false,"ly":0.43},{"type":"Human","name":"Jennifer","cx":18.10291752042776,"cy":-1.7717803444007103,"cz":0.1500000059604645,"lx":0.45,"lz":1.7,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"7CidBs9j2hdjoie9s47tSo","selected":false,"locked":false,"ly":0.45},{"type":"Human","name":"Jeanette","cx":16.915296607371396,"cy":-5.742321393879223,"cz":0.15,"lx":0.4,"lz":1.62,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"9QoGq38Qc3iCuT9ChxbAyR","selected":false,"locked":false,"ly":0.4},{"type":"Human","name":"Jamelia","cx":17.721133919154003,"cy":-5.518875626742528,"cz":0.15,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"85muF4mPeUfkVQindFk2SC","selected":false,"locked":false,"ly":0.65},{"type":"Human","name":"Jade","cx":0.6415363456979275,"cy":7.410775156216488,"cz":0.1500000059604645,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"jBLqkfTJCSVqqR4CU7nfJ2","selected":false,"locked":false,"ly":0.48},{"type":"Flower","name":"Yellow Flower","cx":18.683881743553787,"cy":18.33607154360658,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"eB4WthSRNZpHrasisKTtYg","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-18.795638463082337,"cy":18.660989204818456,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"h3cqaVZXomQdjmyTbFaSE7","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":-16.292595004641754,"cy":-18.43048092235047,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"hEqgADfaTf5Syacb7QRfe6","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":17.686932547560502,"cy":-18.72635054653726,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"dViWZq883MztDQDT9tgFHg","selected":false,"locked":false},{"type":"Tree","name":"Coconut","cx":18.340044767234033,"cy":12.835308413075914,"cz":0.15,"lx":6.929334761971469,"lz":6.813471569919312,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"rK9Z4WmcdLBPe5DdK1mo3L","selected":false,"locked":false},{"type":"Tree","name":"Coconut","cx":18.20400735303405,"cy":4.605044853977084,"cz":0.15,"lx":6.415005134340998,"lz":6.813471569919312,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"ko7TU1v7o4aKNwN5wszk6E","selected":false,"locked":false},{"type":"Tree","name":"Coconut","cx":16.744228490634097,"cy":-4.496771610813894,"cz":0.1500000059604645,"lx":5.516658633108942,"lz":6.813471569919312,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"1zDByoeV2v4opENdb8nE73","selected":false,"locked":false},{"type":"Tree","name":"Coconut","cx":18.06796993883407,"cy":-12.807744163620441,"cz":0.15,"lx":3.7877637261892754,"lz":6.813471569919312,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"5ynw27sYwALgCvbTKBPFuc","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":18.73185271365966,"cy":9.091268351797737,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"5xUkwUkEF3nM4dp1f8ZjGH","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":18.82807405354676,"cy":0.4545102937342307,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"9CUeHAtdXMGrojz43dddm7","selected":false,"locked":false},{"type":"Flower","name":"Yellow Flower","cx":18.790525833741423,"cy":-8.33811033147611,"cz":0.15,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"9werjyfGxz2ZnUBAmZUSeP","selected":false,"locked":false},{"type":"Tree","name":"Linden","cx":-13.237896819150908,"cy":7.786733045780586,"cz":0.15,"lx":12.449941214324092,"lz":9.058629663838381,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"9HVmsEYn5NmhERnCHtLeTG","selected":false,"locked":false},{"type":"Human","name":"Jacob","cx":16.698553189544626,"cy":-13.302196684361064,"cz":0.1500000059604645,"lx":0.8,"ly":0.8,"lz":1.82,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"oVwVpc1MsHV8dEBsQ3Qes9","selected":false},{"type":"Human","name":"Jacqueline","cx":16.92629922811857,"cy":-10.360458138569996,"cz":0.1500000059604645,"lx":0.43,"ly":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"go7YPG6xiBGLHMPZz7e4qo","selected":false},{"type":"Flower","name":"Hibiscus","cx":-0.09277991929455354,"cy":0.3164809017961403,"cz":0.15,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"975HgY9tQaZ5QeqbgzHx3y","selected":false},{"type":"Flower","name":"Hibiscus","cx":2.3987692101921008,"cy":0.2735471847110773,"cz":0.1500000059604645,"lx":2,"lz":1.7,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"edrMt5m6ycQCMvY4tyMhZK","selected":false},{"type":"Tree","name":"Fan Palm","cx":-16.84484975237295,"cy":-12.927386696052167,"cz":0.15,"lx":4.076837194726303,"lz":6.270754609829865,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"pzKai5MWnLpM5xYggPryb1","selected":false},{"type":"Human","name":"Jaye","cx":-0.11721899052498141,"cy":8.102455442033538,"cz":0.1500000059604645,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"o65jp32RsZKq9pnvJ8qjFn","selected":false,"ly":0.55},{"type":"Foundation","cx":-6.355619144447829,"cy":-57.87489141106073,"cz":0.05,"lx":17.250094637989044,"ly":17.442537041091708,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"color":"gray","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"xjGay2mVopjsp4Ndv4B8Eh","enableGroupMaster":true},{"type":"Wall","cx":0.15275097566949114,"cy":7.153909729519647,"cz":0,"lx":6,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":3.141592653589793,"leftPoint":[3.152750975669491,7.153909729519647,0.1],"rightPoint":[-2.847249024330509,7.153909729519647,0.1],"leftJoints":["hqsA2Cy29sRNBoj4v9Cr5r"],"rightJoints":["gQNkn8fsCop5ur3PiXUxVi"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"7T7V4fAArnXnf77GARr48T","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-4.347249024330509,"cy":5.403909729519647,"cz":0,"lx":4.6097722286464435,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":4.003762708257019,"leftPoint":[-2.847249024330509,7.153909729519647,0.1],"rightPoint":[-5.847249024330509,3.653909729519647,0.1],"leftJoints":["7T7V4fAArnXnf77GARr48T"],"rightJoints":["j6xhxcV6gu7NJTE1m7PHjp"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"gQNkn8fsCop5ur3PiXUxVi","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":4.652750975669491,"cy":5.403909729519647,"cz":0,"lx":4.6097722286464435,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":2.279422598922567,"leftPoint":[6.152750975669491,3.653909729519647,0.1],"rightPoint":[3.152750975669491,7.153909729519647,0.1],"leftJoints":["xwZdPNzp8AKwovnxoLD3nU"],"rightJoints":["7T7V4fAArnXnf77GARr48T"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"hqsA2Cy29sRNBoj4v9Cr5r","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.847249024330509,"cy":1.153909729519647,"cz":0,"lx":5,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":4.712388980384691,"leftPoint":[-5.847249024330512,3.653909729519647,0.1],"rightPoint":[-5.847249024330509,-1.346090270480353,0.1],"leftJoints":["gQNkn8fsCop5ur3PiXUxVi"],"rightJoints":["5HfZoyda9UcsGyCP24zQ6f"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"j6xhxcV6gu7NJTE1m7PHjp","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-4.347249024330509,"cy":-3.096090270480353,"cz":0,"lx":4.6097722286464435,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":5.42101525251236,"leftPoint":[-5.847249024330509,-1.346090270480353,0.1],"rightPoint":[-2.847249024330509,-4.846090270480353,0.1],"leftJoints":["j6xhxcV6gu7NJTE1m7PHjp"],"rightJoints":["mDLvATpuRq21i8iZBYi4ta"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"5HfZoyda9UcsGyCP24zQ6f","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.15275097566949114,"cy":-4.846090270480353,"cz":0,"lx":6,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":0,"leftPoint":[-2.847249024330509,-4.846090270480353,0.1],"rightPoint":[3.152750975669491,-4.846090270480353,0.1],"leftJoints":["5HfZoyda9UcsGyCP24zQ6f"],"rightJoints":["23GGGVXLMLhDsJPuc4tWdJ"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"mDLvATpuRq21i8iZBYi4ta","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.152750975669491,"cy":1.153909729519647,"cz":0,"lx":5,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":1.5707963267948966,"leftPoint":[6.152750975669491,-1.346090270480353,0.1],"rightPoint":[6.152750975669491,3.653909729519647,0.1],"leftJoints":["23GGGVXLMLhDsJPuc4tWdJ"],"rightJoints":["hqsA2Cy29sRNBoj4v9Cr5r"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"xwZdPNzp8AKwovnxoLD3nU","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":4.652750975669491,"cy":-3.096090270480353,"cz":0,"lx":4.6097722286464435,"ly":0.3,"lz":3,"fill":"Full","relativeAngle":0.8621700546672264,"leftPoint":[3.152750975669491,-4.846090270480353,0.1],"rightPoint":[6.152750975669491,-1.346090270480353,0.1],"leftJoints":["mDLvATpuRq21i8iZBYi4ta"],"rightJoints":["xwZdPNzp8AKwovnxoLD3nU"],"textureType":"Wall Texture #3","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Stud","studSpacing":2,"studWidth":0.3,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"23GGGVXLMLhDsJPuc4tWdJ","structureSpacing":50,"structureWidth":0.2,"structureColor":"white","roofId":"11NehXdVvEJW3XyYbWtXPQ","leftRoofHeight":3,"rightRoofHeight":3,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0,"cy":6.5,"cz":0,"lx":6,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["8FDqLAdw457E2bhA9XTcY8"],"rightJoints":["8RoWdxqFb6i5NdhSc28mnN"],"leftPoint":[3,6.5],"rightPoint":[-3,6.5],"relativeAngle":3.141592653589793,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"84MYXJ2PMaqXsehRJzjVQe","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-4.5,"cy":4.75,"cz":0,"lx":4.6097722286464435,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["84MYXJ2PMaqXsehRJzjVQe"],"rightJoints":["pk9TBhq9oWST9hGbLUebt3"],"leftPoint":[-3,6.5],"rightPoint":[-6,3],"relativeAngle":4.003762708257019,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8RoWdxqFb6i5NdhSc28mnN","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":4.5,"cy":4.75,"cz":0,"lx":4.6097722286464435,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["vEPCFaMTtBZuQbmTYF61aY"],"rightJoints":["84MYXJ2PMaqXsehRJzjVQe"],"leftPoint":[6,3],"rightPoint":[3,6.5],"relativeAngle":2.279422598922567,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8FDqLAdw457E2bhA9XTcY8","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-6.000000000000002,"cy":0.5,"cz":0,"lx":5,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["8RoWdxqFb6i5NdhSc28mnN"],"rightJoints":["q546XZV5H6AGWKk4L5mFny"],"leftPoint":[-6.0000000000000036,3],"rightPoint":[-6,-2],"relativeAngle":4.712388980384691,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pk9TBhq9oWST9hGbLUebt3","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-4.5,"cy":-3.75,"cz":0,"lx":4.6097722286464435,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["pk9TBhq9oWST9hGbLUebt3"],"rightJoints":["5MSQKrS7n6GSqPGqdxq5Bj"],"leftPoint":[-6,-2],"rightPoint":[-3,-5.5],"relativeAngle":5.42101525251236,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"q546XZV5H6AGWKk4L5mFny","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":-2,"cy":-5.5,"cz":0,"lx":2,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["q546XZV5H6AGWKk4L5mFny"],"rightJoints":[],"leftPoint":[-3,-5.5,0],"rightPoint":[-1,-5.5,0],"relativeAngle":0,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5MSQKrS7n6GSqPGqdxq5Bj","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":6,"cy":0.5,"cz":0,"lx":5,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["hdi4QkYQSUhV3rb5bWoPyE"],"rightJoints":["8FDqLAdw457E2bhA9XTcY8"],"leftPoint":[6,-2],"rightPoint":[6,3],"relativeAngle":1.5707963267948966,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vEPCFaMTtBZuQbmTYF61aY","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":4.5,"cy":-3.75,"cz":0,"lx":4.6097722286464435,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":["vhyVh2ErPYrdrgRVofCLxz"],"rightJoints":["vEPCFaMTtBZuQbmTYF61aY"],"leftPoint":[3,-5.5],"rightPoint":[6,-2],"relativeAngle":0.8621700546672264,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hdi4QkYQSUhV3rb5bWoPyE","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Foundation","cx":-6.206616408300555,"cy":-57.696705992331786,"cz":0.1,"lx":17.55559658932802,"ly":18.75035650013101,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"gray","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"86ArGmhZe3wg69cHFHJhHy","selected":false,"enableGroupMaster":true},{"type":"Wall","cx":2,"cy":-5.5,"cz":0,"lx":2,"ly":0.1,"lz":1,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Full","leftJoints":[],"rightJoints":["hdi4QkYQSUhV3rb5bWoPyE"],"leftPoint":[1,-5.5,0],"rightPoint":[3,-5.5,0],"relativeAngle":0,"textureType":"Wall Texture #3","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vhyVh2ErPYrdrgRVofCLxz","parentId":"86ArGmhZe3wg69cHFHJhHy","foundationId":"86ArGmhZe3wg69cHFHJhHy","wallStructure":"Stud","structureSpacing":0.5,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":null,"selected":false,"eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":1,"rightTopPartialHeight":1},{"type":"Wall","cx":0,"cy":3.398893115303052,"cz":0,"lx":3.320044158350688,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["rar8H4qGrUVwxrAVMoviFk"],"rightJoints":["oNJ9yc8yVRwjREwej61c5A"],"leftPoint":[1.660022079175344,3.398893115303052,0],"rightPoint":[-1.660022079175344,3.398893115303052,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rp3dXSxQpb7ynasZ6iB6eD","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.110255927874554,"rightUnfilledHeight":4.110255927874554,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-2.490033118763016,"cy":2.483806507336846,"cz":0,"lx":2.470871769976342,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["rp3dXSxQpb7ynasZ6iB6eD"],"rightJoints":["qFqkwR72frMwniMPRhnRWu"],"leftPoint":[-1.660022079175344,3.398893115303052,0],"rightPoint":[-3.320044158350688,1.5687198993706395,0],"relativeAngle":-2.3074818778158113,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oNJ9yc8yVRwjREwej61c5A","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.057580145705773,"rightUnfilledHeight":4.057580145705773,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":2.490033118763016,"cy":2.483806507336846,"cz":0,"lx":2.470871769976342,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["8QpMcXYdcYd52x57cuvRwd"],"rightJoints":["rp3dXSxQpb7ynasZ6iB6eD"],"leftPoint":[3.320044158350688,1.5687198993706395,0],"rightPoint":[1.660022079175344,3.398893115303052,0],"relativeAngle":2.3074818778158113,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rar8H4qGrUVwxrAVMoviFk","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.100659354320178,"rightUnfilledHeight":4.100659354320178,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-3.3200441583506892,"cy":0.2614533165617733,"cz":0,"lx":2.6145331656177326,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["oNJ9yc8yVRwjREwej61c5A"],"rightJoints":["kihCtvbfxzgerRhgdX2mXc"],"leftPoint":[-3.32004415835069,1.5687198993706395,0],"rightPoint":[-3.320044158350688,-1.045813266247093,0],"relativeAngle":-1.5707963267948957,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qFqkwR72frMwniMPRhnRWu","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.079570215122429,"rightUnfilledHeight":4.079570215122429,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-2.490033118763016,"cy":-1.960899874213299,"cz":0,"lx":2.470871769976342,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["qFqkwR72frMwniMPRhnRWu"],"rightJoints":["jVTcP5pBaEuvpEqr3A1SVZ"],"leftPoint":[-3.320044158350688,-1.045813266247093,0],"rightPoint":[-1.660022079175344,-2.8759864821795054,0],"relativeAngle":-0.8341107757739816,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kihCtvbfxzgerRhgdX2mXc","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.134242304497143,"rightUnfilledHeight":4.134242304497143,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":3.320044158350688,"cy":0.2614533165617733,"cz":0,"lx":2.6145331656177326,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["nFBw1TRtTNF6p1WGqWPgfw"],"rightJoints":["rar8H4qGrUVwxrAVMoviFk"],"leftPoint":[3.320044158350688,-1.045813266247093,0],"rightPoint":[3.320044158350688,1.5687198993706395,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8QpMcXYdcYd52x57cuvRwd","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.039195103204583,"rightUnfilledHeight":4.039195103204583,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":2.490033118763016,"cy":-1.960899874213299,"cz":0,"lx":2.470871769976342,"ly":0.1,"lz":6,"rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"fill":"Partial","leftJoints":["jVTcP5pBaEuvpEqr3A1SVZ"],"rightJoints":["8QpMcXYdcYd52x57cuvRwd"],"leftPoint":[1.660022079175344,-2.8759864821795054,0],"rightPoint":[3.320044158350688,-1.045813266247093,0],"relativeAngle":0.8341107757739816,"textureType":"No Wall Texture","color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nFBw1TRtTNF6p1WGqWPgfw","parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","wallStructure":"Default","structureSpacing":1,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.108930812815814,"rightUnfilledHeight":4.108930812815814,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Foundation","cx":-6.1615980987141725,"cy":-56.93879552861954,"cz":0.05,"lx":9.714225983793291,"ly":9.80468578734971,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"gray","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"n5CRoXkagMPz1MK5uJrLb5","selected":false},{"type":"Wall","cx":0,"cy":-2.8759864821795054,"cz":0,"lx":3.320044158350688,"ly":0.1,"lz":6,"fill":"Partial","relativeAngle":0,"leftPoint":[-1.660022079175344,-2.8759864821795054,0],"rightPoint":[1.660022079175344,-2.8759864821795054,0],"leftJoints":["kihCtvbfxzgerRhgdX2mXc"],"rightJoints":["nFBw1TRtTNF6p1WGqWPgfw"],"textureType":"No Wall Texture","color":"white","rValue":2.2894337349821954,"volumetricHeatCapacity":0.5,"wallStructure":"Default","studSpacing":0.5,"studWidth":0.1,"studColor":"white","opacity":0,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"jVTcP5pBaEuvpEqr3A1SVZ","structureSpacing":1,"structureWidth":0.1,"structureColor":"white","roofId":"smwrqG518CZJrsaW49WWUA","leftRoofHeight":6,"rightRoofHeight":6,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":4.015344082405362,"rightUnfilledHeight":4.015344082405362,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.5743098600216179,"thickness":0.1,"roofType":"Pyramid","roofStructure":"Default","wallsId":["qFqkwR72frMwniMPRhnRWu","kihCtvbfxzgerRhgdX2mXc","jVTcP5pBaEuvpEqr3A1SVZ","nFBw1TRtTNF6p1WGqWPgfw","8QpMcXYdcYd52x57cuvRwd","rar8H4qGrUVwxrAVMoviFk","rp3dXSxQpb7ynasZ6iB6eD","oNJ9yc8yVRwjREwej61c5A"],"textureType":"Roof Texture Default","color":"#666666","sideColor":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"n5CRoXkagMPz1MK5uJrLb5","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"smwrqG518CZJrsaW49WWUA","ceiling":false},{"type":"Window","cx":0,"cy":0.3,"cz":0.3499999999999999,"lx":0.7649549167327019,"ly":0.1,"lz":0.19999999999999982,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"8QpMcXYdcYd52x57cuvRwd","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"dYYTafeaVyrPGiHr9hT4x7"},{"type":"Window","cx":-6.739866298094781e-16,"cy":0.3,"cz":0.34999999999999987,"lx":0.809430915963378,"ly":0.1,"lz":0.19999999999999973,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rar8H4qGrUVwxrAVMoviFk","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"jZbi6wpUUPGF7S266xXdZb"},{"type":"Window","cx":0,"cy":0.3,"cz":0.3499999999999999,"lx":0.9036024392790976,"ly":0.1,"lz":0.19999999999999982,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rp3dXSxQpb7ynasZ6iB6eD","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"dAbndkGsGZCPSQ6cfeGiaG"},{"type":"Window","cx":-6.290541878221795e-16,"cy":0.3,"cz":0.3499999999999999,"lx":0.8094309159633778,"ly":0.1,"lz":0.19999999999999987,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"nFBw1TRtTNF6p1WGqWPgfw","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"kSuLif4Wir4urUXskyaV4U"},{"type":"Window","cx":0,"cy":0.3,"cz":0.3499999999999999,"lx":0.9036024392790976,"ly":0.1,"lz":0.19999999999999982,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jVTcP5pBaEuvpEqr3A1SVZ","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"uzbQK6qBJiZchj62eoVcS2"},{"type":"Window","cx":-6.290541878221795e-16,"cy":0.3,"cz":0.3499999999999999,"lx":0.8094309159633778,"ly":0.1,"lz":0.19999999999999987,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kihCtvbfxzgerRhgdX2mXc","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"qdqEUWrM4pFbL4aKbpxg5S"},{"type":"Window","cx":0,"cy":0.3,"cz":0.3499999999999999,"lx":0.7649549167327019,"ly":0.1,"lz":0.19999999999999982,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"qFqkwR72frMwniMPRhnRWu","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"387ytv7CWaVRo77xEcJ6ve"},{"type":"Window","cx":-5.841217458348811e-16,"cy":0.3,"cz":0.34999999999999987,"lx":0.8094309159633776,"ly":0.1,"lz":0.19999999999999973,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"oNJ9yc8yVRwjREwej61c5A","foundationId":"n5CRoXkagMPz1MK5uJrLb5","id":"5pj2DDSnCjnbjFqVV7kdtA"},{"type":"Human","name":"Jane","cx":3.736227180070431,"cy":-0.07270961061114178,"cz":0.1500000059604645,"lx":0.4,"ly":0.4,"lz":1.67,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ihXBcGst6vfG6pMnKjKmcM","id":"mXtLTeWPeXbh8ZPv5wFnjK","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1,"thickness":0.1,"roofType":"Mansard","roofStructure":"Default","wallsId":["mDLvATpuRq21i8iZBYi4ta"],"ridgeWidth":2.994634976387277,"textureType":"Roof Texture Default","color":"#666666","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"xjGay2mVopjsp4Ndv4B8Eh","foundationId":"xjGay2mVopjsp4Ndv4B8Eh","id":"11NehXdVvEJW3XyYbWtXPQ","ceiling":false}],"view":{"weatherPanelX":0,"cameraZoom":11.974738784767576,"showInstructionPanel":false,"orthographic":false,"showYearlyUpdraftTowerYieldPanel":false,"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"cameraPosition":[2.0567122000034246,-82.20963270587687,2.469053520866666],"showYearlyHeliostatYieldPanel":false,"mapTilt":0,"groundPanelY":0,"heliodonPanelX":0,"showMapPanel":false,"heliodonPanelY":0,"showElevationAngle":true,"solarRadiationHeatMapReflectionOnly":false,"groundImage":false,"mapWeatherStations":false,"showDailyParabolicTroughYieldPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400},"theme":"Default","dailyPvYieldPanelRect":{"height":400,"x":0,"width":600,"y":0},"dailyHeliostatYieldPanelRect":{"height":400,"width":600,"y":0,"x":0},"showDailyLightSensorPanel":false,"yearlyUpdraftTowerYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"groundColor":"#0062b1","showGroundPanel":false,"weatherPanelY":0,"yearlyLightSensorPanelX":0,"showDiurnalTemperaturePanel":false,"showYearlyPvYieldPanel":false,"yearlyLightSensorPanelY":0,"yearlyLightSensorPanelRect":{"y":0,"x":0,"height":500,"width":600},"showDailyParabolicDishYieldPanel":false,"showDailyHeliostatYieldPanel":false,"yearlyLightSensorPanelShowDaylight":false,"autoRotate":false,"dailyParabolicTroughYieldPanelRect":{"width":600,"y":0,"x":0,"height":400},"dailyPvYieldPanelY":1,"yearlyPvYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"mapPanelX":0,"yearlyLightSensorPanelShowClearness":false,"dailyLightSensorPanelX":-1277,"stickyNotePanelX":5,"yearlyFresnelReflectorYieldPanelRect":{"width":600,"y":0,"height":400,"x":0},"visibilityResultsPanelRect":{"width":600,"y":0,"x":0,"height":470},"mapType":"hybrid","yearlyParabolicTroughYieldPanelRect":{"x":0,"height":400,"width":600,"y":0},"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelRect":{"width":600,"x":0,"y":0,"height":400},"showSolarPanelVisibilityResultsPanel":false,"showEvolutionPanel":false,"showDesignInfoPanel":false,"showAzimuthAngle":true,"showYearlyLightSensorPanel":false,"dailyPvYieldPanelX":4,"showSunAngles":false,"stickyNotePanelY":2,"dailyLightSensorPanelRect":{"width":600,"y":0,"x":0,"height":360},"showSiteInfoPanel":true,"mapZoom":17,"shadowEnabled":true,"showStickyNotePanel":false,"showYearlyFresnelReflectorYieldPanel":false,"cameraPosition2D":[35.60900958192718,-37.58389220703244,150],"yearlyParabolicDishYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"showHeliodonPanel":false,"showDailyPvYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showZenithAngle":true,"panCenter":[0,0,0],"showYearlyParabolicTroughYieldPanel":false,"showDailyUpdraftTowerYieldPanel":false,"dailyLightSensorPanelY":525,"axes":false,"dailyUpdraftTowerYieldPanelRect":{"height":550,"x":0,"width":640,"y":0},"enableRotate":true,"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"showSolarRadiationHeatmap":false,"stickyNotePanelRect":{"height":300,"x":0,"y":0,"width":400},"heliodon":false,"weatherPanelRect":{"height":500,"width":500,"x":0,"y":0},"showWeatherPanel":false,"diurnalTemperaturePanelRect":{"height":400,"y":0,"width":600,"x":0},"showEconomicsPanel":false,"mapPanelY":0,"panCenter2D":[35.60900958192718,-37.5837422003028,-0.000044548927895332545],"groundPanelX":0,"showYearlyParabolicDishYieldPanel":false,"waterSurface":true},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"tiltAngle":0,"poleHeight":1,"rowAxis":"Zonal","rowsPerRack":1,"pvModelName":"SPR-X21-335-BLK","interRowSpacing":2,"orientation":"Landscape","poleSpacing":3},"solarPanelArrayLayoutConstraints":{"rowAxis":"Zonal","minimumRowsPerRack":1,"maximumInterRowSpacing":10,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","minimumTiltAngle":-1.5707963267948966,"minimumInterRowSpacing":2,"maximumTiltAngle":1.5707963267948966,"maximumRowsPerRack":6,"poleSpacing":5,"poleHeight":1},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"convergenceThreshold":0.01,"searchMethod":1,"vmax":0.01,"socialCoefficient":0.1,"cognitiveCoefficient":0.1,"objectiveFunctionType":1,"localSearchRadius":0.1,"swarmSize":20,"maximumSteps":5,"problem":"Solar Panel Tilt Angle","inertia":0.8},"geneticAlgorithmParams":{"convergenceThreshold":0.01,"localSearchRadius":0.1,"mutationRate":0.1,"populationSize":20,"searchMethod":1,"problem":"Solar Panel Tilt Angle","selectionRate":0.5,"crossoverRate":0.5,"objectiveFunctionType":1,"selectionMethod":1,"maximumGenerations":5}},"economicsParams":{"projectLifeSpan":25,"operationalCostPerUnit":0.15,"electricitySellingPrice":0.25},"notes":[]}')},477:function(e){e.exports=JSON.parse('{"docid":"aAQ9PBNcxmy54LzwEjDjx6","time":"02/04/2023 01:07 pm","timestamp":1675534023944,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":29.97967840899827,"solarRadiationHeatmapGridCellSize":2,"pvGridCellSize":0.5,"timesPerHour":1,"longitude":31.1328118254,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Unnamed Road, Nazlet El-Semman, Al Haram, Giza Governorate 3512201, Egypt","date":"9/15/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":false,"noAnimationForHeatmapSimulation":false},"elements":[{"cy":1.8727761492415205,"normal":[0,0,1],"lz":0.1,"ly":33.71645112830097,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":3.8026045865356792,"cz":0.05,"rotation":[0,0,0],"lx":37.627215506503944,"selected":false,"parentId":"Ground","color":"#939e68"},{"type":"Human","name":"Jack","cx":-20.29704864931282,"cy":2.5303584520169977,"cz":1.7763568394002505e-15,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"tmVJY65HF3sgVftctUAMHa","selected":false,"ly":0.42},{"type":"Wall","cx":0,"cy":16.296284712012135,"cz":0,"lx":36.37297498962048,"ly":0.3,"lz":0.1,"relativeAngle":3.141592653589793,"leftPoint":[18.18648749481024,16.296284712012135,0],"rightPoint":[-18.18648749481024,16.296284712012135,0],"leftJoints":["x8opa4joDX2ozyr1wxLBFd"],"rightJoints":["cbbyeikFQdrAHuD95BDSGz"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nTB9SvRUJL9zbmnaWUjcpm","roofId":"k5DPAgfcA7iEV8uJMULHoF","leftRoofHeight":0.1,"rightRoofHeight":0.1,"color":"#b07e3d","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":-18.18648749481024,"cy":-1.7763568394002505e-15,"cz":0,"lx":32.59256942402426,"ly":0.3,"lz":0.1,"relativeAngle":-1.5707963267948966,"leftPoint":[-18.18648749481024,16.29628471201213,0],"rightPoint":[-18.18648749481024,-16.296284712012135,0],"leftJoints":["nTB9SvRUJL9zbmnaWUjcpm"],"rightJoints":["h8nRc5JnZSmPUtQYLCpzpo"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cbbyeikFQdrAHuD95BDSGz","roofId":"k5DPAgfcA7iEV8uJMULHoF","leftRoofHeight":0.1,"rightRoofHeight":0.1,"color":"#b07e3d","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":18.18648749481024,"cy":0,"cz":0,"lx":32.59256942402427,"ly":0.3,"lz":0.1,"relativeAngle":1.5707963267948966,"leftPoint":[18.18648749481024,-16.296284712012135,0],"rightPoint":[18.18648749481024,16.296284712012135,0],"leftJoints":["h8nRc5JnZSmPUtQYLCpzpo"],"rightJoints":["nTB9SvRUJL9zbmnaWUjcpm"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"x8opa4joDX2ozyr1wxLBFd","roofId":"k5DPAgfcA7iEV8uJMULHoF","leftRoofHeight":0.1,"rightRoofHeight":0.1,"color":"#b07e3d","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":0,"cy":-16.296284712012135,"cz":0,"lx":36.37297498962048,"ly":0.3,"lz":0.1,"relativeAngle":0,"leftPoint":[-18.18648749481024,-16.296284712012135,0],"rightPoint":[18.18648749481024,-16.296284712012135,0],"leftJoints":["cbbyeikFQdrAHuD95BDSGz"],"rightJoints":["x8opa4joDX2ozyr1wxLBFd"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h8nRc5JnZSmPUtQYLCpzpo","roofId":"k5DPAgfcA7iEV8uJMULHoF","leftRoofHeight":0.1,"rightRoofHeight":0.1,"color":"#b07e3d","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["x8opa4joDX2ozyr1wxLBFd","nTB9SvRUJL9zbmnaWUjcpm","cbbyeikFQdrAHuD95BDSGz","h8nRc5JnZSmPUtQYLCpzpo"],"textureType":"No Roof Texture","color":"#f1bd5f","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k5DPAgfcA7iEV8uJMULHoF","sideColor":"#f1bd5f","rise":23.904675932583867,"ceiling":false},{"type":"Wall","cx":0,"cy":20.99732159077814,"cz":0,"lx":37.31092134412355,"ly":0.3,"lz":0.22250033892788987,"leftJoints":["7WsdqvYxWkA27jvXNo2Mm1"],"rightJoints":["tZM6D9KrMoJw5byU4Mef1i"],"leftPoint":[18.655460672061775,20.99732159077814,0],"rightPoint":[-18.655460672061775,20.99732159077814,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"kfxJiyZVakywzVGMDtjswR","parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofId":"vsaCHfjwMoXqY3LhUh3AYn","selected":false,"leftRoofHeight":0.22250033892788987,"rightRoofHeight":0.22250033892788987,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.22250033892788987,"rightTopPartialHeight":0.22250033892788987},{"type":"Wall","cx":-18.655460672061775,"cy":-1.7763568394002505e-15,"cz":0,"lx":41.99464318155627,"ly":0.3,"lz":0.22250033892788987,"leftJoints":["kfxJiyZVakywzVGMDtjswR"],"rightJoints":["vf6wgmEsbmPCE8KcphJGqP"],"leftPoint":[-18.655460672061775,20.997321590778135,0],"rightPoint":[-18.655460672061775,-20.99732159077814,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"tZM6D9KrMoJw5byU4Mef1i","parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofId":"vsaCHfjwMoXqY3LhUh3AYn","selected":false,"leftRoofHeight":0.22250033892788987,"rightRoofHeight":0.22250033892788987,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.22250033892788987,"rightTopPartialHeight":0.22250033892788987},{"type":"Wall","cx":18.655460672061775,"cy":0,"cz":0,"lx":41.99464318155628,"ly":0.3,"lz":0.22250033892788987,"leftJoints":["vf6wgmEsbmPCE8KcphJGqP"],"rightJoints":["kfxJiyZVakywzVGMDtjswR"],"leftPoint":[18.655460672061775,-20.99732159077814,0],"rightPoint":[18.655460672061775,20.99732159077814,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"7WsdqvYxWkA27jvXNo2Mm1","parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofId":"vsaCHfjwMoXqY3LhUh3AYn","selected":false,"leftRoofHeight":0.22250033892788987,"rightRoofHeight":0.22250033892788987,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.22250033892788987,"rightTopPartialHeight":0.22250033892788987},{"type":"Wall","cx":0,"cy":-20.99732159077814,"cz":0,"lx":37.31092134412355,"ly":0.3,"lz":0.22250033892788987,"leftJoints":["tZM6D9KrMoJw5byU4Mef1i"],"rightJoints":["7WsdqvYxWkA27jvXNo2Mm1"],"leftPoint":[-18.655460672061775,-20.99732159077814,0],"rightPoint":[18.655460672061775,-20.99732159077814,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"vf6wgmEsbmPCE8KcphJGqP","parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofId":"vsaCHfjwMoXqY3LhUh3AYn","selected":false,"leftRoofHeight":0.22250033892788987,"rightRoofHeight":0.22250033892788987,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.22250033892788987,"rightTopPartialHeight":0.22250033892788987},{"id":"vsaCHfjwMoXqY3LhUh3AYn","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#f1bd5f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7wPQXpdL4AkSgqr5d4ivTf","foundationId":"7wPQXpdL4AkSgqr5d4ivTf","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["7WsdqvYxWkA27jvXNo2Mm1","kfxJiyZVakywzVGMDtjswR","tZM6D9KrMoJw5byU4Mef1i","vf6wgmEsbmPCE8KcphJGqP"],"selected":false,"sideColor":"#f1bd5f","rise":26.582665517432964,"ceiling":false},{"type":"Foundation","cx":12.856852941052583,"cy":43.808036262261155,"cz":0.05,"lx":38.5975048387485,"ly":43.44273432574787,"lz":0.22250033892788987,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#939e68","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7wPQXpdL4AkSgqr5d4ivTf","selected":false},{"type":"Wall","cx":0,"cy":10.377063829820637,"cz":0,"lx":24.393816584690047,"ly":0.3,"lz":0.1,"leftJoints":["c1ip4EoLV1xG5UrcQjKJFf"],"rightJoints":["aXfuVy74x5TuX5PAxrYsmb"],"leftPoint":[12.196908292345023,10.377063829820637,0],"rightPoint":[-12.196908292345023,10.377063829820637,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"6n1nr1JX4st4jvQ9gUV4ia","parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofId":"6Z9o7PiPN8Lg87aGjnheF2","selected":false,"leftRoofHeight":0.1,"rightRoofHeight":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":-12.196908292345023,"cy":0,"cz":0,"lx":20.754127659641274,"ly":0.3,"lz":0.1,"leftJoints":["6n1nr1JX4st4jvQ9gUV4ia"],"rightJoints":["mU8UDvpwYrQexfz1wzirNx"],"leftPoint":[-12.196908292345023,10.377063829820637,0],"rightPoint":[-12.196908292345023,-10.377063829820637,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"aXfuVy74x5TuX5PAxrYsmb","parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofId":"6Z9o7PiPN8Lg87aGjnheF2","selected":false,"leftRoofHeight":0.1,"rightRoofHeight":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":12.196908292345023,"cy":0,"cz":0,"lx":20.754127659641274,"ly":0.3,"lz":0.1,"leftJoints":["mU8UDvpwYrQexfz1wzirNx"],"rightJoints":["6n1nr1JX4st4jvQ9gUV4ia"],"leftPoint":[12.196908292345023,-10.377063829820637,0],"rightPoint":[12.196908292345023,10.377063829820637,0],"relativeAngle":1.5707963267948966,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"c1ip4EoLV1xG5UrcQjKJFf","parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofId":"6Z9o7PiPN8Lg87aGjnheF2","selected":false,"leftRoofHeight":0.1,"rightRoofHeight":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"type":"Wall","cx":0,"cy":-10.377063829820637,"cz":0,"lx":24.393816584690047,"ly":0.3,"lz":0.1,"leftJoints":["aXfuVy74x5TuX5PAxrYsmb"],"rightJoints":["c1ip4EoLV1xG5UrcQjKJFf"],"leftPoint":[-12.196908292345023,-10.377063829820637,0],"rightPoint":[12.196908292345023,-10.377063829820637,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#b07e3d","normal":[0,0,1],"rotation":[0,0,0],"id":"mU8UDvpwYrQexfz1wzirNx","parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofId":"6Z9o7PiPN8Lg87aGjnheF2","selected":false,"leftRoofHeight":0.1,"rightRoofHeight":0.1,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1},{"id":"6Z9o7PiPN8Lg87aGjnheF2","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#f1bd5f","normal":[0,0,1],"rotation":[0,0,0],"parentId":"vEZNUjoALqFNdeECwYexcJ","foundationId":"vEZNUjoALqFNdeECwYexcJ","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.05,"wallsId":["c1ip4EoLV1xG5UrcQjKJFf","6n1nr1JX4st4jvQ9gUV4ia","aXfuVy74x5TuX5PAxrYsmb","mU8UDvpwYrQexfz1wzirNx"],"selected":false,"sideColor":"#f1bd5f","rise":16.854120951667817,"ceiling":false},{"type":"Foundation","cx":45.25308331556635,"cy":20.416929673194815,"cz":0.05,"lx":25.23498267381729,"ly":21.469787234111664,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#939e68","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vEZNUjoALqFNdeECwYexcJ","selected":false},{"type":"Human","name":"Jaah","cx":39.44168754364077,"cy":-40.717132307246644,"cz":0,"lx":0.74,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mXBNsLzvysAACaXT4Ret47","selected":false,"ly":0.74},{"type":"Tree","name":"Coconut","cx":42.806669480662926,"cy":-43.46857047024383,"cz":0,"lx":7.465549642203886,"lz":12.033907674351804,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"nN965AFg3yMtHobvcGg5R7","selected":false},{"type":"Tree","name":"Coconut","cx":41.00137659683238,"cy":-40.141651116333534,"cz":0,"lx":5.412336834290683,"lz":8.971899696117683,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"2anvXQ4u2H4Gmk1Wk9rdgM","selected":false},{"type":"Tree","name":"Coconut","cx":45.13152925903263,"cy":-41.184279758308485,"cz":0,"lx":4.120170321128103,"lz":6.431070332387913,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"kUerK8k3CG9QPyDqpE1w3s","selected":false},{"type":"Tree","name":"Coconut","cx":42.724610065173344,"cy":-37.37569784643946,"cz":-8.881784197001252e-16,"lx":5.285861196217217,"lz":7.810076760608297,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"6e2aW2xXuEPds7gKc1zyEZ","selected":false},{"type":"Human","name":"Jiya","cx":38.48713465659762,"cy":-41.18611455055127,"cz":0,"lx":0.6,"lz":1.74,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"waRJTQwVoTc2m73FTmZtku","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Dune","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#fcde9d","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[29.718967845382636,-60.9210785032056,6.195253307893477],"panCenter":[20.220405140712533,12.500928314079184,6.195253307893477],"orthographic":false,"enableRotate":true,"cameraZoom":13.966745921875,"showInstructionPanel":true,"cameraPosition2D":[2.7117906831589016,-0.17118900317690566,150],"panCenter2D":[2.7117906831589016,-0.17103899651007715,5.772019952800763e-7],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"waterSurface":false,"showMapPanel":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},478:function(e){e.exports=JSON.parse('{"docid":"cTcUvKrDVjKVCsa7Bc6eWP","time":"07/11/2023 11:15 am","timestamp":1689088517320,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"date":"5/1/2022, 11:00:00 AM","timesPerHour":1,"noAnimationForHeatmapSimulation":false,"cameraZoom":35.16173831821251,"latitude":20.6834718,"address":"Ch\xedcharo 1, Agua Clara, 20263 Aguascalientes, Ags, Mexico","orthographic":false,"pvGridCellSize":0.5,"noAnimationForSolarPanelSimulation":false,"solarRadiationHeatmapGridCellSize":2,"name":"default","longitude":-88.56849969999999,"countryCode":"MX","ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]}},"elements":[{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,-0.4308260576178866],"type":"Foundation","lx":7.036992589214696,"ly":30.510947098235302,"lz":0.1,"parentId":"Ground","cx":-27.085409900327864,"cy":-75.75391737780706,"cz":0.05,"id":"of4fAMi2p9MKmo6JDUYnfX","locked":false,"selected":false},{"normal":[0,0,1],"enableGroupMaster":true,"color":"#ffffff","rotation":[0,0,-0.4308260576178866],"type":"Cuboid","lx":56,"ly":56,"lz":3,"parentId":"Ground","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-18.375019902136223,"cy":-56.51798491947705,"cz":1.5,"id":"wiH8vD751NzePoNE489Zmz","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":50.63868728162561,"ly":51,"lz":3,"parentId":"wiH8vD751NzePoNE489Zmz","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-0.08666355805458079,"cy":0.07433002082287654,"cz":1.5,"id":"vEE1TP3rTAVaRcwDoKZkXG","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":46,"ly":46,"parentId":"vEE1TP3rTAVaRcwDoKZkXG","lz":3,"faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":0.07205603943225766,"cy":-0.3609974280100564,"cz":1.5,"id":"64zAV4AXgf3acGYiGgbHtk","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":41,"ly":41,"parentId":"64zAV4AXgf3acGYiGgbHtk","lz":3,"faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-0.2179635556946673,"cy":-0.2714914561985524,"cz":1.5,"id":"6tvwCY3BfS5DKToaqrjH6b","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":36,"ly":36,"lz":3,"parentId":"6tvwCY3BfS5DKToaqrjH6b","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":0.20649365162019312,"cy":-0.07640192198699511,"cz":1.5,"id":"w5DovAeNvLxdFUsA55MTUK","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":31,"ly":31,"lz":3,"parentId":"w5DovAeNvLxdFUsA55MTUK","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":0.21796368761107066,"cy":0.27148491092499955,"cz":1.5,"id":"xkbrwv3RHrtDWs4fwBjHcK","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":26,"ly":26,"lz":3,"parentId":"xkbrwv3RHrtDWs4fwBjHcK","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":0.0000012533374448675178,"cy":-0.000002726892110443256,"cz":1.5,"id":"pbMzPvQHYgJQunHq51J49Z","locked":false,"selected":false,"stackable":true},{"normal":[0,0,1],"color":"#ffffff","rotation":[0,0,0],"type":"Cuboid","lx":21,"ly":21,"lz":3,"parentId":"pbMzPvQHYgJQunHq51J49Z","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cx":-0.07647088824865858,"cy":-0.20646417621273133,"cz":1.5,"id":"mnvyeK5fN3hX9sLjvEKUuf","locked":false,"selected":false,"stackable":true},{"color":"white","rightJoints":["snp41n8epU65cJmpWYe2JY"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.10000000000000142,"leftJoints":["7HaAi9SXBNPgTWdiQyjMiG"],"lx":20.02647993516194,"type":"Wall","ly":0.3,"showLabel":false,"lineWidth":0.2,"lz":0.1,"centerRoofHeight":[-0.5,24.07205708567741],"roofId":"sGVLr2RiApAro2AZTF4Soq","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"25Fv92JqG6V9Az4Vdn87cm","structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.460358901737687,-10.32346519208701,0],"normal":[0,0,1],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","rotation":[0,0,-0.4308260576178866],"lineColor":"black","windows":[],"fill":"Full","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":-3.4603589017376857,"cy":-0.3102252245060395,"wallStructure":"Default","leftPoint":[-3.4603589017376843,9.703014743074931,0],"cz":0,"relativeAngle":-1.5707963267948968,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["25Fv92JqG6V9Az4Vdn87cm"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["nyGwFjAxRx8nejSDNHRuJf"],"type":"Wall","lx":6.747607724168489,"ly":0.3,"lineWidth":0.2,"showLabel":false,"lz":24.07205708567741,"roofId":"sGVLr2RiApAro2AZTF4Soq","textureType":"No Wall Texture","id":"7HaAi9SXBNPgTWdiQyjMiG","leftRoofHeight":24.07205708567741,"structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.4603589017376843,9.703014743074931,0],"normal":[0,0,1],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","rotation":[0,0,-0.4308260576178866],"lineColor":"black","windows":[],"fill":"Full","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":-0.08657971268263398,"cy":9.715917584374791,"cz":0,"wallStructure":"Default","leftPoint":[3.2871994763724164,9.728820425674652,0],"relativeAngle":-3.137768224760869,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":24.07205708567741,"rightTopPartialHeight":24.07205708567741,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["7HaAi9SXBNPgTWdiQyjMiG"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["snp41n8epU65cJmpWYe2JY"],"lx":20.026479935161944,"type":"Wall","ly":0.3,"lz":0.1,"showLabel":false,"lineWidth":0.2,"centerRoofHeight":[0.5,24.07205708567741],"roofId":"sGVLr2RiApAro2AZTF4Soq","textureType":"No Wall Texture","id":"nyGwFjAxRx8nejSDNHRuJf","leftRoofHeight":0.1,"locked":false,"structureWidth":0.1,"eavesLength":0,"selected":false,"rightPoint":[3.2871994763724164,9.728820425674652,0],"normal":[0,0,1],"rotation":[0,0,-0.4308260576178866],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","lineColor":"black","windows":[],"fill":"Full","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":3.2871994763724164,"cy":-0.2844195419063196,"cz":0,"wallStructure":"Default","leftPoint":[3.2871994763724164,-10.297659509487291,0],"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["nyGwFjAxRx8nejSDNHRuJf"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.1,"leftJoints":["25Fv92JqG6V9Az4Vdn87cm"],"lx":6.747607724168491,"type":"Wall","ly":0.3,"lineWidth":0.2,"lz":0.1,"showLabel":false,"roofId":"sGVLr2RiApAro2AZTF4Soq","textureType":"No Wall Texture","id":"snp41n8epU65cJmpWYe2JY","leftRoofHeight":0.1,"structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[3.2871994763724164,-10.297659509487291,0],"normal":[0,0,1],"rotation":[0,0,-0.4308260576178866],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","lineColor":"black","windows":[],"fill":"Full","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":-0.08657971268263531,"cy":-10.310562350787151,"wallStructure":"Default","cz":0,"leftPoint":[-3.460358901737687,-10.32346519208701,0],"relativeAngle":0.003824428828923839,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"sideColor":"#ffffff","ridgeLeftPoint":[-0.5,1],"lx":0,"type":"Roof","ly":0,"lz":0,"lineWidth":0.2,"showLabel":false,"overhang":0,"wallsId":["snp41n8epU65cJmpWYe2JY"],"textureType":"No Roof Texture","id":"sGVLr2RiApAro2AZTF4Soq","locked":false,"selected":false,"normal":[0,0,1],"ceiling":false,"roofStructure":"Default","roofType":"Gable","rotation":[0,0,-0.4308260576178866],"foundationId":"of4fAMi2p9MKmo6JDUYnfX","lineColor":"black","parentId":"of4fAMi2p9MKmo6JDUYnfX","cx":0,"cy":0,"cz":0,"rise":0},{"color":"white","rightJoints":["p76sjxtkpQv2qS73PYE2kL"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.10000000000000142,"leftJoints":["6JMAttAcVe64vobp1GLMxZ"],"type":"Wall","lx":20.02647993516194,"ly":0.3,"lz":0.1,"centerRoofHeight":[-0.5,24.07205708567741],"roofId":"okzyGygyV9CuUuCgZJHxtL","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"wqgKTMGphRnmbTc7egg7A4","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[-3.460358901737687,-10.32346519208701,0],"normal":[0,0,1],"rotation":[0,0,-2.001622384412783],"foundationId":"6hcF56jh7q4LNRLycVpoD9","fill":"Full","parentId":"6hcF56jh7q4LNRLycVpoD9","cx":-3.4603589017376857,"cy":-0.3102252245060395,"leftPoint":[-3.4603589017376843,9.703014743074931,0],"wallStructure":"Default","cz":0,"relativeAngle":-1.5707963267948968,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["wqgKTMGphRnmbTc7egg7A4"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["1bHrmE4SnxxPJS3An7ttHy"],"type":"Wall","lx":6.747607724168489,"ly":0.3,"lz":24.07205708567741,"roofId":"okzyGygyV9CuUuCgZJHxtL","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"6JMAttAcVe64vobp1GLMxZ","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[-3.4603589017376843,9.703014743074931,0],"normal":[0,0,1],"rotation":[0,0,-2.001622384412783],"foundationId":"6hcF56jh7q4LNRLycVpoD9","fill":"Full","parentId":"6hcF56jh7q4LNRLycVpoD9","cx":-0.08657971268263398,"cy":9.715917584374791,"wallStructure":"Default","cz":0,"leftPoint":[3.2871994763724164,9.728820425674652,0],"relativeAngle":-3.137768224760869,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":24.07205708567741,"rightTopPartialHeight":24.07205708567741,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["6JMAttAcVe64vobp1GLMxZ"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["p76sjxtkpQv2qS73PYE2kL"],"type":"Wall","lx":20.026479935161944,"ly":0.3,"lz":0.1,"centerRoofHeight":[0.5,24.07205708567741],"roofId":"okzyGygyV9CuUuCgZJHxtL","textureType":"No Wall Texture","leftRoofHeight":0.1,"id":"1bHrmE4SnxxPJS3An7ttHy","structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[3.2871994763724164,9.728820425674652,0],"normal":[0,0,1],"rotation":[0,0,-2.001622384412783],"foundationId":"6hcF56jh7q4LNRLycVpoD9","fill":"Full","parentId":"6hcF56jh7q4LNRLycVpoD9","cx":3.2871994763724164,"cy":-0.2844195419063196,"leftPoint":[3.2871994763724164,-10.297659509487291,0],"wallStructure":"Default","cz":0,"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["1bHrmE4SnxxPJS3An7ttHy"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.1,"leftJoints":["wqgKTMGphRnmbTc7egg7A4"],"type":"Wall","lx":6.747607724168491,"ly":0.3,"lz":0.1,"roofId":"okzyGygyV9CuUuCgZJHxtL","textureType":"No Wall Texture","id":"p76sjxtkpQv2qS73PYE2kL","leftRoofHeight":0.1,"locked":false,"structureWidth":0.1,"eavesLength":0,"selected":false,"rightPoint":[3.2871994763724164,-10.297659509487291,0],"normal":[0,0,1],"foundationId":"6hcF56jh7q4LNRLycVpoD9","rotation":[0,0,-2.001622384412783],"fill":"Full","parentId":"6hcF56jh7q4LNRLycVpoD9","cx":-0.08657971268263531,"cy":-10.310562350787151,"wallStructure":"Default","cz":0,"leftPoint":[-3.460358901737687,-10.32346519208701,0],"relativeAngle":0.003824428828923839,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"sideColor":"#ffffff","ridgeLeftPoint":[-0.5,1],"type":"Roof","lx":0,"ly":0,"lz":0,"wallsId":["p76sjxtkpQv2qS73PYE2kL"],"overhang":0,"textureType":"No Roof Texture","id":"okzyGygyV9CuUuCgZJHxtL","locked":false,"selected":false,"normal":[0,0,1],"ceiling":false,"roofStructure":"Default","roofType":"Gable","foundationId":"6hcF56jh7q4LNRLycVpoD9","rotation":[0,0,-2.001622384412783],"parentId":"6hcF56jh7q4LNRLycVpoD9","cx":0,"cy":0,"cz":0,"rise":0},{"normal":[0,0,1],"solarPowerTower":{},"color":"#ffffff","rotation":[0,0,-2.001622384412783],"solarAbsorberPipe":{},"solarUpdraftTower":{},"type":"Foundation","lx":7.036992589214696,"ly":30.510947098235302,"parentId":"Ground","lz":0.1,"cx":-37.19656198570662,"cy":-48.22218639532002,"cz":0.05,"id":"6hcF56jh7q4LNRLycVpoD9","locked":false,"selected":false},{"color":"white","rightJoints":["6eET4gZfKAok8BawnfpVP5"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.10000000000000142,"leftJoints":["4tcfgq35BNQEAuA7Q4gK2w"],"type":"Wall","lx":20.02647993516194,"ly":0.3,"lz":0.1,"centerRoofHeight":[-0.5,24.07205708567741],"roofId":"u4Mpv2GeNWKchY8947S8v4","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"ewTz3qtVabc3vib1o37RWk","structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.460358901737687,-10.32346519208701,0],"normal":[0,0,1],"rotation":[0,0,1.1399702691770102],"foundationId":"8gpLzgkZ8nK4SDTRc45eLs","fill":"Full","parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":-3.4603589017376857,"cy":-0.3102252245060395,"cz":0,"wallStructure":"Default","leftPoint":[-3.4603589017376843,9.703014743074931,0],"relativeAngle":-1.5707963267948968,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["ewTz3qtVabc3vib1o37RWk"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["vvdQFgS7BMWgSzhZ3WPn3v"],"type":"Wall","lx":6.747607724168489,"ly":0.3,"lz":24.07205708567741,"roofId":"u4Mpv2GeNWKchY8947S8v4","textureType":"No Wall Texture","leftRoofHeight":24.07205708567741,"id":"4tcfgq35BNQEAuA7Q4gK2w","structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.4603589017376843,9.703014743074931,0],"normal":[0,0,1],"foundationId":"8gpLzgkZ8nK4SDTRc45eLs","rotation":[0,0,1.1399702691770102],"fill":"Full","parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":-0.08657971268263398,"cy":9.715917584374791,"wallStructure":"Default","leftPoint":[3.2871994763724164,9.728820425674652,0],"cz":0,"relativeAngle":-3.137768224760869,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":24.07205708567741,"rightTopPartialHeight":24.07205708567741,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["4tcfgq35BNQEAuA7Q4gK2w"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["6eET4gZfKAok8BawnfpVP5"],"type":"Wall","lx":20.026479935161944,"ly":0.3,"lz":0.1,"centerRoofHeight":[0.5,24.07205708567741],"roofId":"u4Mpv2GeNWKchY8947S8v4","textureType":"No Wall Texture","leftRoofHeight":0.1,"id":"vvdQFgS7BMWgSzhZ3WPn3v","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[3.2871994763724164,9.728820425674652,0],"normal":[0,0,1],"foundationId":"8gpLzgkZ8nK4SDTRc45eLs","rotation":[0,0,1.1399702691770102],"fill":"Full","parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":3.2871994763724164,"cy":-0.2844195419063196,"wallStructure":"Default","leftPoint":[3.2871994763724164,-10.297659509487291,0],"cz":0,"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["vvdQFgS7BMWgSzhZ3WPn3v"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.1,"leftJoints":["ewTz3qtVabc3vib1o37RWk"],"lx":6.747607724168491,"type":"Wall","ly":0.3,"lz":0.1,"roofId":"u4Mpv2GeNWKchY8947S8v4","textureType":"No Wall Texture","leftRoofHeight":0.1,"id":"6eET4gZfKAok8BawnfpVP5","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[3.2871994763724164,-10.297659509487291,0],"normal":[0,0,1],"foundationId":"8gpLzgkZ8nK4SDTRc45eLs","rotation":[0,0,1.1399702691770102],"fill":"Full","parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":-0.08657971268263531,"cy":-10.310562350787151,"leftPoint":[-3.460358901737687,-10.32346519208701,0],"wallStructure":"Default","cz":0,"relativeAngle":0.003824428828923839,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"sideColor":"#ffffff","type":"Roof","lx":0,"ly":0,"lz":0,"overhang":0,"wallsId":["6eET4gZfKAok8BawnfpVP5"],"textureType":"No Roof Texture","id":"u4Mpv2GeNWKchY8947S8v4","locked":false,"selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","foundationId":"8gpLzgkZ8nK4SDTRc45eLs","rotation":[0,0,1.1399702691770102],"parentId":"8gpLzgkZ8nK4SDTRc45eLs","cx":0,"cy":0,"cz":0,"rise":0},{"normal":[0,0,1],"solarPowerTower":{},"color":"#ffffff","rotation":[0,0,1.1399702691770102],"solarAbsorberPipe":{},"type":"Foundation","solarUpdraftTower":{},"lx":7.036992589214696,"ly":30.510947098235302,"parentId":"Ground","lz":0.1,"cx":-0.019117338301022357,"cy":-64.89645982858704,"cz":0.05,"id":"8gpLzgkZ8nK4SDTRc45eLs","locked":false,"selected":false},{"color":"white","rightJoints":["2UujwtSnnVJqGDCJ3BBRm9"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.10000000000000142,"leftJoints":["2owQUpRggJZAfJhkbdGdV7"],"type":"Wall","lx":20.02647993516194,"ly":0.3,"lz":0.1,"centerRoofHeight":[-0.5,24.07205708567741],"roofId":"vaffHA2pvgk7DEwhzj6gNE","textureType":"No Wall Texture","id":"1S8fhLLB2Yj68UzfGctHxC","leftRoofHeight":24.07205708567741,"structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[-3.460358901737687,-10.32346519208701,0],"normal":[0,0,1],"rotation":[0,0,-3.5724187112076797],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","fill":"Full","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":-3.4603589017376857,"cy":-0.3102252245060395,"wallStructure":"Default","cz":0,"leftPoint":[-3.4603589017376843,9.703014743074931,0],"relativeAngle":-1.5707963267948968,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["1S8fhLLB2Yj68UzfGctHxC"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["ie77KsfUeoYHMvNbdg5A7r"],"type":"Wall","lx":6.747607724168489,"ly":0.3,"lz":24.07205708567741,"roofId":"vaffHA2pvgk7DEwhzj6gNE","textureType":"No Wall Texture","id":"2owQUpRggJZAfJhkbdGdV7","leftRoofHeight":24.07205708567741,"locked":false,"structureWidth":0.1,"selected":false,"eavesLength":0,"rightPoint":[-3.4603589017376843,9.703014743074931,0],"normal":[0,0,1],"rotation":[0,0,-3.5724187112076797],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","fill":"Full","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":-0.08657971268263398,"cy":9.715917584374791,"cz":0,"leftPoint":[3.2871994763724164,9.728820425674652,0],"wallStructure":"Default","relativeAngle":-3.137768224760869,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":24.07205708567741,"rightTopPartialHeight":24.07205708567741,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["2owQUpRggJZAfJhkbdGdV7"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":24.07205708567741,"leftJoints":["2UujwtSnnVJqGDCJ3BBRm9"],"type":"Wall","lx":20.026479935161944,"ly":0.3,"lz":0.1,"centerRoofHeight":[0.5,24.07205708567741],"roofId":"vaffHA2pvgk7DEwhzj6gNE","textureType":"No Wall Texture","leftRoofHeight":0.1,"id":"ie77KsfUeoYHMvNbdg5A7r","structureWidth":0.1,"locked":false,"selected":false,"eavesLength":0,"rightPoint":[3.2871994763724164,9.728820425674652,0],"normal":[0,0,1],"rotation":[0,0,-3.5724187112076797],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","fill":"Full","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":3.2871994763724164,"cy":-0.2844195419063196,"wallStructure":"Default","leftPoint":[3.2871994763724164,-10.297659509487291,0],"cz":0,"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["ie77KsfUeoYHMvNbdg5A7r"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":0.1,"leftJoints":["1S8fhLLB2Yj68UzfGctHxC"],"type":"Wall","lx":6.747607724168491,"ly":0.3,"lz":0.1,"roofId":"vaffHA2pvgk7DEwhzj6gNE","textureType":"No Wall Texture","id":"2UujwtSnnVJqGDCJ3BBRm9","leftRoofHeight":0.1,"structureWidth":0.1,"locked":false,"eavesLength":0,"selected":false,"rightPoint":[3.2871994763724164,-10.297659509487291,0],"normal":[0,0,1],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","rotation":[0,0,-3.5724187112076797],"fill":"Full","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":-0.08657971268263531,"cy":-10.310562350787151,"leftPoint":[-3.460358901737687,-10.32346519208701,0],"cz":0,"wallStructure":"Default","relativeAngle":0.003824428828923839,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":0.1,"rightTopPartialHeight":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"sideColor":"#ffffff","type":"Roof","lx":0,"ly":0,"lz":0,"wallsId":["2UujwtSnnVJqGDCJ3BBRm9"],"overhang":0,"textureType":"No Roof Texture","id":"vaffHA2pvgk7DEwhzj6gNE","locked":false,"selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,-3.5724187112076797],"foundationId":"hmZjWWeZz4S4GgQzaeEoDs","parentId":"hmZjWWeZz4S4GgQzaeEoDs","cx":0,"cy":0,"cz":0,"rise":0},{"normal":[0,0,1],"solarPowerTower":{},"color":"#ffffff","rotation":[0,0,-3.5724187112076797],"solarAbsorberPipe":{},"type":"Foundation","lx":7.036992589214696,"solarUpdraftTower":{},"ly":30.510947098235302,"parentId":"Ground","lz":0.1,"cx":-9.922732853325604,"cy":-37.99179481559905,"cz":0.05,"id":"hmZjWWeZz4S4GgQzaeEoDs","locked":false,"selected":false},{"color":"white","rightJoints":["w8ioBPnjpEK1kCVPvdyXSf"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":30.5,"leftJoints":["o5TUM6k7TUF5pcoV1nrf3P"],"lx":15.990395824622178,"type":"Wall","ly":0.3,"lz":30.5,"centerRoofHeight":[-0.5,30.5],"roofId":"fpyToZsG3vjeXnpTZcmiFA","textureType":"No Wall Texture","leftRoofHeight":30.5,"id":"9EahYNQZypYcfg5Yptfmkk","locked":false,"structureWidth":0.1,"selected":false,"eavesLength":0.2,"rightPoint":[-8.119283016182168,-17.843264137803672,0.1],"normal":[0,0,1],"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,-3.5724187112076797],"fill":"Full","parentId":"tznSPCJVyf8hCJAPieocy5","cx":-8.119283016182168,"cy":-9.848066225492586,"cz":0,"leftPoint":[-8.119283016182163,-1.852868313181495,0.1],"wallStructure":"Default","relativeAngle":-1.570796326794897,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.5,"rightTopPartialHeight":30.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["9EahYNQZypYcfg5Yptfmkk"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":30.5,"leftJoints":["jbmSv4P2XCW2pGLUzPPdFg"],"lx":15.828210447987294,"type":"Wall","ly":0.3,"lz":30.5,"roofId":"fpyToZsG3vjeXnpTZcmiFA","textureType":"No Wall Texture","id":"o5TUM6k7TUF5pcoV1nrf3P","leftRoofHeight":30.5,"structureWidth":0.1,"locked":false,"eavesLength":0.2,"selected":false,"rightPoint":[-8.119283016182163,-1.852868313181495,0.1],"normal":[0,0,1],"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,-3.5724187112076797],"fill":"Full","parentId":"tznSPCJVyf8hCJAPieocy5","cx":-0.2051844979525692,"cy":-1.8425658765917845,"cz":0,"leftPoint":[7.7089140202770245,-1.8322634400020812,0.1],"wallStructure":"Default","relativeAngle":-3.140290871618499,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.5,"rightTopPartialHeight":30.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["o5TUM6k7TUF5pcoV1nrf3P"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":null,"leftJoints":["w8ioBPnjpEK1kCVPvdyXSf"],"type":"Wall","lx":15.99039582462218,"ly":0.3,"lz":30.5,"centerRoofHeight":[0.4999999999999998,30.5],"roofId":"fpyToZsG3vjeXnpTZcmiFA","textureType":"No Wall Texture","leftRoofHeight":30.5,"id":"jbmSv4P2XCW2pGLUzPPdFg","locked":false,"structureWidth":0.1,"selected":false,"eavesLength":0.2,"rightPoint":[7.7089140202770245,-1.8322634400020812,0.1],"normal":[0,0,1],"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,-3.5724187112076797],"fill":"Full","parentId":"tznSPCJVyf8hCJAPieocy5","cx":7.708914020277024,"cy":-9.827461352313167,"leftPoint":[7.708914020277023,-17.822659264624257,0.1],"wallStructure":"Default","cz":0,"relativeAngle":1.5707963267948966,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.5,"rightTopPartialHeight":30.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"white","rightJoints":["jbmSv4P2XCW2pGLUzPPdFg"],"structureSpacing":2,"structureColor":"white","rightRoofHeight":30.5,"leftJoints":["9EahYNQZypYcfg5Yptfmkk"],"lx":15.828210447987301,"type":"Wall","ly":0.3,"lz":30.5,"roofId":"fpyToZsG3vjeXnpTZcmiFA","textureType":"No Wall Texture","id":"w8ioBPnjpEK1kCVPvdyXSf","leftRoofHeight":30.5,"locked":false,"structureWidth":0.1,"selected":false,"eavesLength":0.2,"rightPoint":[7.708914020277023,-17.822659264624257,0.1],"normal":[0,0,1],"rotation":[0,0,-3.5724187112076797],"foundationId":"tznSPCJVyf8hCJAPieocy5","fill":"Full","parentId":"tznSPCJVyf8hCJAPieocy5","cx":-0.20518449795257118,"cy":-17.83296170121396,"leftPoint":[-8.119283016182168,-17.843264137803672,0.1],"cz":0,"wallStructure":"Default","relativeAngle":0.0013017819712943387,"opacity":0.5,"unfilledHeight":0.5,"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30.5,"rightTopPartialHeight":30.5,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1}},{"color":"#ffffff","thickness":0.1,"ridgeRightPoint":[0.5,1],"ridgeLeftPoint":[-0.5,1],"lx":0,"type":"Roof","ly":0,"lz":0,"wallsId":["w8ioBPnjpEK1kCVPvdyXSf"],"overhang":0.2,"textureType":"No Roof Texture","id":"fpyToZsG3vjeXnpTZcmiFA","locked":false,"selected":false,"ceiling":false,"normal":[0,0,1],"roofStructure":"Default","roofType":"Gable","rotation":[0,0,-3.5724187112076797],"foundationId":"tznSPCJVyf8hCJAPieocy5","parentId":"tznSPCJVyf8hCJAPieocy5","cx":0,"cy":0,"cz":0,"rise":0},{"normal":[0,0,1],"solarPowerTower":{},"color":"#ffffff","rotation":[0,0,-3.5724187112076797],"solarAbsorberPipe":{},"solarUpdraftTower":{},"type":"Foundation","lx":16.502964739720774,"ly":43.56257699656065,"lz":0.1,"parentId":"Ground","cx":-22.491532647648288,"cy":-65.93307419737648,"cz":0.05,"id":"tznSPCJVyf8hCJAPieocy5","locked":false,"selected":false},{"color":"#73D8FF","lx":0.1263566722575591,"type":"Window","tint":"#73D8FF","ly":0.3,"lineWidth":0.2,"lz":0.08196721311475416,"windowType":"Default","showLabel":false,"mullionSpacing":2,"archHeight":1,"id":"gnr8cDLm7R39CGUTTPWRkH","locked":false,"selected":false,"normal":[0,0,1],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"rotation":[0,0,0],"foundationId":"tznSPCJVyf8hCJAPieocy5","lineColor":"black","parentId":"o5TUM6k7TUF5pcoV1nrf3P","mullionColor":"white","mullion":true,"frameWidth":0.1,"cx":9.819886079874965e-17,"cy":0.1,"cz":0.319672131147541,"opacity":0,"frame":false},{"color":"#73D8FF","type":"Window","lx":0.1263566722575591,"ly":0.3,"tint":"#73D8FF","windowType":"Default","lz":0.08196721311475416,"mullionSpacing":2,"archHeight":1,"id":"kUvytSevD3UrWB3anozSfo","locked":false,"selected":false,"normal":[0,0,1],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"rotation":[0,0,0],"foundationId":"tznSPCJVyf8hCJAPieocy5","parentId":"w8ioBPnjpEK1kCVPvdyXSf","mullionColor":"white","mullion":true,"frameWidth":0.1,"cx":0.031589168064389835,"cy":0.1,"cz":0.319672131147541,"opacity":0,"frame":false},{"color":"#73D8FF","type":"Window","lx":0.1263566722575591,"ly":0.3,"tint":"#73D8FF","lz":0.08196721311475416,"windowType":"Default","mullionSpacing":2,"archHeight":1,"id":"865c35tP58MbX185GC2Zp7","locked":false,"selected":false,"normal":[0,0,1],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showRight":false,"showLeft":false},"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,0],"parentId":"9EahYNQZypYcfg5Yptfmkk","mullionColor":"white","mullion":true,"frameWidth":0.1,"cx":0.0006407972856078512,"cy":0.1,"cz":0.319672131147541,"opacity":0,"frame":false},{"color":"#73D8FF","type":"Window","lx":0.1263566722575591,"ly":0.3,"tint":"#73D8FF","windowType":"Default","lz":0.08196721311475416,"mullionSpacing":2,"archHeight":1,"id":"gyCeohTiRvRXSouuRxL1uy","locked":false,"selected":false,"normal":[0,0,1],"mullionWidth":0.06,"shutter":{"color":"grey","width":0.5,"showLeft":false,"showRight":false},"foundationId":"tznSPCJVyf8hCJAPieocy5","rotation":[0,0,0],"parentId":"jbmSv4P2XCW2pGLUzPPdFg","mullionColor":"white","mullion":true,"frameWidth":0.1,"cx":-0.030627972135977996,"cy":0.1,"cz":0.319672131147541,"opacity":0,"frame":false},{"normal":[0,1,0],"rotation":[0,0,-2.001622384412783],"lx":0.494,"type":"Human","ly":0.494,"lz":1.72,"parentId":"6hcF56jh7q4LNRLycVpoD9","cx":0.6155237368087336,"cy":-13.667323728312198,"cz":0.05000000074505806,"name":"Juro","id":"r66dpfqZ6etskNEDBj8h8E","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,0],"lx":1.7,"type":"Human","ly":1.7,"lz":1.68,"parentId":"Ground","cx":-48.35423161189035,"cy":-82.28031356342372,"cz":0,"name":"Joan","id":"w1GaaLPU8uoPVtySP11CNB","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,0],"type":"Human","lx":1.8,"ly":1.8,"lz":1.75,"parentId":"Ground","cx":-48.773755635528666,"cy":-86.19055704219848,"cz":0,"name":"Joel","id":"hqm4qYUeBiCnkFo8f8K4q3","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"type":"Human","lx":0.42,"ly":0.42,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","lz":1.8,"cx":5.159796472851735,"cy":-2.2075746120889566,"cz":1.5,"name":"Jack","id":"57uEnUU7dx25CfhheTRdsb","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"lx":0.6,"type":"Human","ly":0.6,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","lz":1.88,"cx":9.25006190829934,"cy":6.451678309086552,"cz":1.5,"name":"Joseph","id":"7pCFcU7FA5XV2M6Yw2pNPJ","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"type":"Human","lx":0.6,"ly":0.6,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","lz":1.65,"cx":-0.4372003189144742,"cy":8.19573281933403,"cz":1.5,"name":"Jeff","id":"dJi9Dc4GEuLq5NjFPvHqU9","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"type":"Human","lx":0.695,"ly":0.695,"lz":1.6,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","cx":-8.6401936835747,"cy":0.41444427778789716,"cz":1.5,"name":"Jena","id":"9EHiXxpVGajiXXrSM5hPga","locked":false,"selected":false},{"normal":[0,1,0],"rotation":[0,0,-0.4308260576178866],"lx":0.43,"type":"Human","ly":0.43,"lz":1.5,"parentId":"mnvyeK5fN3hX9sLjvEKUuf","cx":0.007552993564822197,"cy":-8.796578961750832,"cz":1.5,"name":"Jess","id":"7yXJFHLZH8aLmjnxsCJfei","locked":false,"selected":false}],"sceneRadius":117,"view":{"yearlyLightSensorPanelY":0,"weatherPanelY":0,"panCenter2D":[-29.13539419159263,-62.86427427096306,-0.0000621339264290157],"showWeatherPanel":false,"showYearlyPvYieldPanel":false,"showSiteInfoPanel":true,"weatherPanelX":0,"dailyPvYieldPanelY":8,"autoRotate":false,"heliodonPanelY":-33,"showGroundPanel":false,"dailyPvYieldPanelRect":{"width":600,"x":0,"y":0,"height":400},"orthographic":false,"heliodon":false,"groundImage":false,"mapTilt":0,"showInstructionPanel":true,"groundPanelX":0,"cameraPosition2D":[-29.13539419159263,-62.865274648456655,150],"enableRotate":true,"cameraPosition":[13.301447909114042,-125.69517498333751,12.672024693594299],"mapWeatherStations":false,"waterSurface":false,"mapZoom":17,"heliodonPanelX":-1175,"groundPanelY":0,"shadowEnabled":true,"dailyPvYieldPanelX":-3,"panCenter":[-18.660063442267198,-59.376354618489714,6.942819287427842],"showMapPanel":false,"showDailyPvYieldPanel":false,"groundColor":"#68ccca","showHeliodonPanel":false,"yearlyPvYieldPanelY":16,"mapType":"hybrid","yearlyPvYieldPanelX":-25,"cameraZoom":5.839780486775448,"yearlyLightSensorPanelX":0,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showPvDailyYieldPanel":true,"axes":false,"showDesignInfoPanel":true,"dailyLightSensorPanelX":-240,"dailyLightSensorPanelY":232,"theme":"Grassland","groundImageType":"hybrid"},"graphState":{"yearlyHeliostatIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"poleSpacing":3,"rowAxis":"Zonal","tiltAngle":0,"rowsPerRack":1,"pvModelName":"CS6X-355P-FG","poleHeight":1,"orientation":"Landscape","interRowSpacing":2},"solarPanelArrayLayoutConstraints":{"rowAxis":"Zonal","orientation":"Landscape","minimumInterRowSpacing":2,"poleHeight":1,"poleSpacing":5,"minimumRowsPerRack":1,"maximumTiltAngle":1.5707963267948966,"pvModelName":"CS6X-355P-FG","maximumRowsPerRack":6,"maximumInterRowSpacing":10,"minimumTiltAngle":-1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"populationSize":20,"crossoverRate":0.5,"searchMethod":1,"problem":"Solar Panel Tilt Angle","selectionMethod":1,"selectionRate":0.5,"objectiveFunctionType":1,"maximumGenerations":5,"convergenceThreshold":0.01,"mutationRate":0.1,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"vmax":0.01,"inertia":0.8,"objectiveFunctionType":1,"cognitiveCoefficient":0.1,"problem":"Solar Panel Tilt Angle","socialCoefficient":0.1,"localSearchRadius":0.1,"searchMethod":1,"maximumSteps":5,"convergenceThreshold":0.01,"swarmSize":20}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Tourist Attraction","modelAuthor":"The Architect","modelLabel":"Mayan Pyramid","modelDescription":"El templo de Kukulc\xe1n,1\u200b es un edificio prehisp\xe1nico ubicado en la pen\xednsula de Yucat\xe1n, en el actual estado del mismo nombre.","designProjectType":null,"notes":[]}')},479:function(e){e.exports=JSON.parse('{"docid":"h2AeuzPtvyccb7bEaZpofi","time":"02/04/2023 01:10 pm","timestamp":1675534213625,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":5,"date":"6/22/2022, 10:00:00 AM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Isfahan Province, Esfahan, Enghelab Sq Chahar Bagh e Abbasi St\u060c JMV8+QX8, Iran","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":32.64464465095667,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.25,"name":"default","longitude":51.66765981904907},"elements":[{"type":"Foundation","cx":-24.087406912469724,"cy":-0.9943329859958538,"cz":0.3,"lx":309.0660757142105,"ly":148.37785658395512,"lz":0.6,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1rAGH78b5nt7cXyGU9vNRV","selected":false,"color":"#4d4d4d","textureType":"Foundation Texture #5","locked":true},{"type":"Wall","cx":153.13833064830163,"cy":4.807832977070984,"cz":0,"lx":15.894482628786152,"ly":1,"lz":4,"relativeAngle":1.6141972072488455,"leftPoint":[153.4831396456019,-3.131924655538281,0.6],"rightPoint":[152.79352165100136,12.747590609680257,0.6],"leftJoints":["fD1UBEgXL6iTqqgsj9fhry"],"rightJoints":["f2zX88pBygszntq4fuFUT5"],"textureType":"No Wall Texture","color":"#dd8c55","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"m87y7C5QvZwH9XgiqzyDsg","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"16a9tkDUC6i3u2A8viWNQi","leftRoofHeight":4,"rightRoofHeight":4,"locked":true,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-152.5559344954129,"cy":3.9555923893088227,"cz":0,"lx":14.231488793574167,"ly":1,"lz":4,"relativeAngle":4.801490183460943,"leftPoint":[-153.1891172963546,11.043109434155966,0.6],"rightPoint":[-151.92275169447117,-3.13192465553829,0.6],"leftJoints":["f2zX88pBygszntq4fuFUT5"],"rightJoints":["fD1UBEgXL6iTqqgsj9fhry"],"textureType":"No Wall Texture","color":"#dd8c55","wallStructure":"Default","studSpacing":2,"studWidth":0.1,"studColor":"white","opacity":3,"selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"pV4i6Rv9Vpys7aXEi9nnh4","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","roofId":"16a9tkDUC6i3u2A8viWNQi","leftRoofHeight":4,"rightRoofHeight":4,"locked":true,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.45022052258609563,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kjpqeFXZhizkQQr5Hivm1x","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.42320729123092926,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xihM6sKHtJ56MCcntR5Pn3","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3961940598757629,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"aeHoYndySbPsgXVjUCfHsH","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3691808285205965,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eYyU8ieYT8rZoSrLt7N5sQ","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.34216759716543016,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5g3FeTPUp5Q7UE3xvhA98P","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3151543658102638,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rHjZTUsU1eafkXFHxU1PLK","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2881411344550974,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"7kG8zf5fGdctVHWVtR3gZG","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.26112790309993106,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pyxgv4MkDKunPXUdWXGkeK","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.23411467174476475,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dVAeQcMiSZmruJYZ1yoay8","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.20710144038959846,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2xN7obuKRCafLdBciyJcgU","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.18008820903443218,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hsVmzqgjRUqWu9pUUuohXS","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1530749776792659,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"82FTBR7MFe9VjFyizNpuHe","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1260617463240996,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iyR4AwdTWGGfWcPMw3q9yS","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.09904851496893328,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eUKQkGt2QkcKAQkFbyBd1z","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.07203528361376696,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pXoTt6VKWQ38KsJoNipigS","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.045022052258600634,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"h5HEkcguEMJKHHE9CTcHyU","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.01800882090343431,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3N4zt2BmanxLWvDVeMWxws","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.009004410451732012,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nU4dTNk98whZDM1D6iF1wH","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.036017641806898336,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wn6JZdPWKb4ULL75tPNQNf","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.06303087316206465,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vvkCvyRoLDxmsRByGmpBzy","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.09004410451723098,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2VBpzGbfV2mQWBqheobZU8","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1170573358723973,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6dAY6WFsTirRsXExVou2P4","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1440705672275636,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rhZQSKVeSziHJnsN1wJJXZ","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.17108379858272987,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iRL8ygheAyqnavA7YkPNUy","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.19809702993789616,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iDwqS1ACo3nwFTgu3ZUn9P","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.22511026129306244,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cW4eyEo2JKwejeyCd9U7qY","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.25212349264822875,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5Qe1yDDX9nFGs5zfDrsrCP","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2791367240033951,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"miecWuKrFNJbG2jUsMkGdJ","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3061499553585615,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1MQhMoVtyd649yMzeGnhiz","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.33316318671372785,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"m8pkHXYqCXHkqKvPBAZwqz","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3601764180688942,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wNkx21Xrdez1MeTxYPd4yM","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3871896494240606,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oUMCjti1nCovRzd2744TQ9","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.41420288077922696,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"txUufVQNmXshJWF6xqpWhP","parentId":"f2zX88pBygszntq4fuFUT5","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Wall","cx":-0.19779782267661816,"cy":11.895350021918105,"cz":2.268765007024547,"lx":305.9873863303283,"ly":1,"lz":4,"leftJoints":["m87y7C5QvZwH9XgiqzyDsg"],"rightJoints":["pV4i6Rv9Vpys7aXEi9nnh4"],"leftPoint":[152.79352165100153,12.747590609680286,0.6],"rightPoint":[-153.1891172963546,11.043109434155966,0.6],"relativeAngle":3.1471631119377927,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"id":"f2zX88pBygszntq4fuFUT5","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"16a9tkDUC6i3u2A8viWNQi","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"locked":true,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.45022052258609563,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"saRb1kM5vD2B9Hp74JLvqp","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.42320729123092926,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2bWU8rtwvXjxo9aXzuerLB","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3961940598757629,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eYnezXtfnko5GcAor3MWu7","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3691808285205965,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6tZNzJ3NpgTVHKjGhXk5ij","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.34216759716543016,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qYBjBMG217J5xiN31k1FVh","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3151543658102638,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2ZPzdru18Dd9wbgc6tF8hm","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2881411344550974,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4QFUZqYWR8J1sv6MW3wHQR","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.26112790309993106,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vxc3EcwAgcYTpUmxZr3Nzt","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.23411467174476475,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oVh5ccuC7bRVGc8GT2nG1w","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.20710144038959846,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"syZxWKWMgKJbf9AQLw2DbK","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.18008820903443218,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kbpuGEAsfRXc3aBZ7yLy35","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1530749776792659,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qHCQ6aJqKx2bg8CTfP6ksL","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.1260617463240996,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5yhhQGggQJLxrwyLMTZk76","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.09904851496893328,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jbVZKYLq5UCNS54M7MLP7w","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.07203528361376696,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dMS3cANbFbUy72GtNg5nTX","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.045022052258600634,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dQ1L5CXyaRnqFdZmdJ23Mx","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.01800882090343431,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jJzaRsWSkzzXGUbxhM8Tkd","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.009004410451732012,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9CdAzuCiQLeLt1Rpfn5FGg","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.036017641806898336,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iw4U38q8hoNmj83CegVdj8","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.06303087316206465,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1S3q9zUqhnXwjv568RB51K","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.09004410451723098,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vF6KJJ1x1WYqaYRYVSjoYX","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1170573358723973,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fT1RMXQH4BRBFk8RzzEyqB","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.1440705672275636,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"uRmEZhdLDsYdKddFP5mnAZ","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.17108379858272987,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qdquxadFLYruszob71gLbV","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.19809702993789616,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8n95WzWt7D23dwMcn7s35V","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.22511026129306244,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oPjFrXfiZkaoXxsWWdGBLk","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.25212349264822875,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vFx9mhnTHbSWtMBawETWGK","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2791367240033951,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"npXN3hv9x7TnSdu9mcCLRN","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3061499553585615,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5sdwP9myEG7quLwU7Xrz47","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.33316318671372785,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jSXDfhhT2GuCgaELbHNqdw","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3601764180688942,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rz4GUsef9nqJhXFRmdEzzD","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3871896494240606,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4bjaEWSRz3V8CCdF71xaCz","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.41420288077922696,"cy":0.1,"cz":-0.14999999999999986,"lx":0.018008820903444214,"ly":1,"lz":0.6999999999999997,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.5999999999999996,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hmfdn7ZwhGKfmSizXsFFVk","parentId":"fD1UBEgXL6iTqqgsj9fhry","foundationId":"1rAGH78b5nt7cXyGU9vNRV","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Wall","cx":0.7801939755653722,"cy":-3.1319246555382825,"cz":2.268765007024547,"lx":305.40589134007274,"ly":1,"lz":4,"leftJoints":["pV4i6Rv9Vpys7aXEi9nnh4"],"rightJoints":["m87y7C5QvZwH9XgiqzyDsg"],"leftPoint":[-151.92275169447117,-3.131924655538283,0.6],"rightPoint":[153.4831396456019,-3.131924655538281,0.6],"relativeAngle":-2.6173711784754543e-17,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"id":"fD1UBEgXL6iTqqgsj9fhry","parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"16a9tkDUC6i3u2A8viWNQi","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"locked":true,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Pyramid","roofStructure":"Default","wallsId":["f2zX88pBygszntq4fuFUT5","pV4i6Rv9Vpys7aXEi9nnh4","fD1UBEgXL6iTqqgsj9fhry","m87y7C5QvZwH9XgiqzyDsg"],"textureType":"No Roof Texture","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"16a9tkDUC6i3u2A8viWNQi","locked":true,"rise":0,"ceiling":false},{"type":"Wall","cx":152.31464905205874,"cy":-1.0704041763225653,"cz":0,"lx":4.732830401162478,"ly":1,"lz":10,"leftJoints":[],"rightJoints":["9NUyotcWKkPg4jzRyBrCwn"],"leftPoint":[152.6600543110326,-3.411475749046293,0.05688696619531554],"rightPoint":[151.9692437930849,1.2706673964011728,0.05688696619531554],"relativeAngle":1.7172810304491228,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"id":"oQZ4yGirBmQVFQ9YDrVVvp","parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"4UKGcXwxZXJkjRB5gCcWoM","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-153.90823853352632,"cy":-1.321690966858462,"cz":0,"lx":4.36784096744436,"ly":1,"lz":10,"leftJoints":["9NUyotcWKkPg4jzRyBrCwn"],"rightJoints":["2EQtF2szHM14rxHpJcmfUo"],"leftPoint":[-154.54251626713952,0.7680938153293653,0.05688696619531554],"rightPoint":[-153.27396079991317,-3.4114757490462893,0.05688696619531554],"relativeAngle":-1.2761193330736746,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"id":"wUpyWMY54tun2oXCsJoZhL","parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"4UKGcXwxZXJkjRB5gCcWoM","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-1.2866362370273055,"cy":1.0193806058652697,"cz":2.268765007024547,"lx":306.5121720836238,"ly":1,"lz":10,"leftJoints":["oQZ4yGirBmQVFQ9YDrVVvp"],"rightJoints":["wUpyWMY54tun2oXCsJoZhL"],"leftPoint":[151.96924379308496,1.2706673964011799,0.05688696619531554],"rightPoint":[-154.54251626713952,0.7680938153293653,0.05688696619531554],"relativeAngle":-3.13995299992499,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"id":"9NUyotcWKkPg4jzRyBrCwn","parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"4UKGcXwxZXJkjRB5gCcWoM","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-1.1369830444213562,"cy":-3.2057378745231233,"cz":2.268765007024547,"lx":304.27424431214394,"ly":1,"lz":10,"leftJoints":["wUpyWMY54tun2oXCsJoZhL"],"rightJoints":[],"leftPoint":[-153.2739660888427,-3.4114757490462466,0],"rightPoint":[151,-3,0],"relativeAngle":0.0013523191073632186,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"id":"2EQtF2szHM14rxHpJcmfUo","parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","wallStructure":"Stud","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"4UKGcXwxZXJkjRB5gCcWoM","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"id":"4UKGcXwxZXJkjRB5gCcWoM","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"parentId":"dYN3JG9zLXMcmq6cqLG4jC","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["9NUyotcWKkPg4jzRyBrCwn","wUpyWMY54tun2oXCsJoZhL","2EQtF2szHM14rxHpJcmfUo","oQZ4yGirBmQVFQ9YDrVVvp"],"selected":false,"locked":true,"rise":0,"ceiling":false},{"type":"Foundation","cx":-13.437660062457336,"cy":-3.021202416355237,"cz":0.05,"lx":333.3539193128119,"ly":8.472793647667807,"lz":0.05688696619531554,"normal":[0,0,1],"rotation":[0,0,-1.6859880574265222],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dYN3JG9zLXMcmq6cqLG4jC","selected":false,"locked":true},{"type":"Window","cx":-0.4547943367220286,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","id":"8c427syBcfkzhApjRu7KiG","locked":true},{"type":"Window","cx":-0.4440280432415217,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jdaEWMvReo1Vung8tjzaSx","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4332617497610147,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3B48xu3sHcEjL7mhoaWwHU","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4224954562805078,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5U7EeBcgVpiGapLTZWovwM","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4117291628000008,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jSiSuprvH81cqvi89vBqpb","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4009628693194939,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dchxG8ZAQ9uRfitqDkaXnL","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3901965758389869,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rd3v273iMAtFt31eXrFRnG","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.37943028235848,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nJWwv1LMiSQJXxdLNgDCWR","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.368663988877973,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tEUzEwitdzqR62Z2hEX3qr","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3578976953974661,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"794wiotJYK86u4ytktDe21","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3471314019169591,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5tf1cYsGZGuXZLvqtY3Wus","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3363651084364522,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6wFEvk3pLRAy6sCQxQ4sPQ","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3255988149559452,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vknekJf36fzszYh1h83wqd","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3148325214754383,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"x2iBhPct6yCXXun6vuDJJS","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3040662279949313,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rgbja9QpX2jJYhsCViY2yY","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2932999345144244,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xyNKQPQWThs67xeiTbWtLY","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2825336410339174,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"gbTmncsXqQVmz8SeKbxv3d","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2717673475534105,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9PuDkFfgSLMfPq51XevFh7","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2610010540729035,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"mJGKG5YpTDDj5mzeHuFzCm","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2502347605923966,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8z2YkWvq4poYzmwNCG45JY","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.23946846711188963,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"emAZ74KFMWSta8KaMduCkr","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.22870217363138268,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6Ds8xyAoQtsih1Pj2eDZwi","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.21793588015087573,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"u45SNvprQYGANCPSwBGzLs","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.20716958667036878,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"htZhURdHCCyJ33tqDmC1gT","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.19640329318986183,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wZwEP2ER3Q9obYa3kXhZ7h","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.18563699970935488,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5zNfcKQCEZvh8nJP9dr2G9","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.17487070622884793,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pBLFgbZxEBNSEtSSjunwwQ","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.16410441274834098,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qkAJcZyKCcJsGREUhkQ78i","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.15333811926783403,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bY9FdJE4SUzDC35a2K1Tzi","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.14257182578732708,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"chLpcXJGwNdNfMozdu7hKg","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.13180553230682013,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3v2BjJSxDF6WpC2DEP42PU","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.12103923882631318,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fqLN8nXoQdJLLJXy5Gwq4f","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.11027294534580623,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"21VBTu8WAdnNwf3x8Zhsuu","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.09950665186529928,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ioXeHrGyfepr3g94p8JLrw","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.08874035838479233,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cy797bHB115wX1gZRH3swM","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.07797406490428538,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"avv4wEy6iPL1CGQoPdSWU5","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.06720777142377843,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fJbmZ64QMaPM9EGMmB984H","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.05644147794327148,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dWfjvmrxqx18k2RKjfdiie","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.04567518446276453,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nefVVFfk24vVE2WLuZReQ4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.03490889098225758,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qLr8HKMWcfRHcfPkHfGPHC","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.024142597501750636,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oy13AUfgb8jcwnMbGNC7a4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.013376304021243696,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4oRAMSYUJG1S9YeFQFNThR","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.0026100105407367564,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"gSmzU3p7S4nLpThNjjLpNP","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.005872523716636283,"cy":0.1,"cz":0.215,"lx":0.004567518446267809,"ly":1,"lz":0.41000000000000003,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jVtZiADJWYhT3XDB4vjJJ8","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.01533381192677481,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6CmGH8a9xKQ4kNuHGUMAw4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.02528447711330811,"cy":0.1,"cz":0.205,"lx":0.005546272399057335,"ly":1,"lz":0.39,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"u38CDVSjPJwJgHnw2Y6FBF","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.03327763439428638,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tq3gcRfDVJqb7T6MyBKK2T","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.04404392787479333,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dSNi5FN3jitEZpttkJCZah","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.05481022135530028,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"skDmbyQ9ChWHwFXt4vbpdF","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.06557651483580723,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1TSBXLmviiwznmkhKxY4F2","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.07634280831631418,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vYMMSTxDfPvirbGiiE2UJZ","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.08710910179682113,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rRLUQpqQSTeubCr79bjn8m","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.09787539527732808,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"gcKRcHdNpX9Vtmc6HncwGF","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.10864168875783503,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oeGCBcEftrMH9jXAYtFrCa","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.11940798223834198,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ajECxgC3C6oXv4ciM75edJ","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.13017427571884893,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"g62oxEPuj3wd39vv4EYTgA","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.14094056919935588,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4k8GPkrBb12613smqqyShp","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.15170686267986283,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vBpUF9pHrUiuWZ5eVGTu5p","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.16247315616036978,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hgdBdvabmf6Pd5AVy88Leh","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.17323944964087673,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"mkgCAdDKF5LyXVZDpVipxK","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.18400574312138368,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"352sJZ7Jvw7FRWDNhR3m19","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.19477203660189063,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hTHrpxyWuGhz1duVVa441z","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.20553833008239758,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"icykR9dGdiRBF5wm2ixAXY","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.21630462356290453,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8hHkoZq2YYvcBW78r5hZFt","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.22707091704341148,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"sezgWua2c8TT2rYs9Vc9P3","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.23783721052391843,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wdyWjdXf8jBzBkXxJJiXk1","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.24860350400442538,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wxGSNmdFgrPkRZEQsr8fWa","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.25936979748493233,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kQNmZsKiKnFT7Utyn9jZgh","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2701360909654393,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bANrbxGiy8tnQaAwz7Zyf4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.28090238444594623,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"uLfixFD9ZurMuJqq1YJ517","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2916686779264532,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6ZXh3jYZhqjps3nTnn4kmX","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.30243497140696013,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6tnSUYG5FnRK1A46sJBg1v","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3132012648874671,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"r6eyDw9sk8QzcdPZ55YqR4","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.32396755836797403,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dcBrioFfV3SWYJEue4QEz5","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.334733851848481,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qFXxdtGrRR5HpmzE8PG7T1","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.34550014532898793,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"53ERZmvVXVHTHZKdd5jDMd","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3562664388094949,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"d4fFAm5371MeUPa3wg3bvM","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.36703273229000183,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6c7LVC3vg4uwfj3z9fdtvK","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3777990257705088,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qUfYKqrHB4CrQ3N1sLtFtG","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.38856531925101573,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2m5mJjvys8EXj2Dtn5HR6L","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3993316127315227,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nTo2Ea7ixx2Bx6c49MgE5r","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Wall","cx":152.31464905205874,"cy":-1.0704041763225653,"cz":0,"lx":4.732830401162478,"ly":1,"lz":10,"leftJoints":[],"rightJoints":["g3He9XTWe5maiTYrqciaG9"],"leftPoint":[152.6600543110326,-3.411475749046293,0.05688696619531554],"rightPoint":[151.9692437930849,1.2706673964011728,0.05688696619531554],"relativeAngle":1.7172810304491228,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"id":"tTQGq2VqjKpQoZgpEaARbs","parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"9giBMxpAESvroYM29nf3G8","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-153.90823853352632,"cy":-1.321690966858462,"cz":0,"lx":4.36784096744436,"ly":1,"lz":10,"leftJoints":["g3He9XTWe5maiTYrqciaG9"],"rightJoints":["xdCET3deCXRuddujsYebQJ"],"leftPoint":[-154.54251626713952,0.7680938153293653,0.05688696619531554],"rightPoint":[-153.27396079991317,-3.4114757490462893,0.05688696619531554],"relativeAngle":-1.2761193330736746,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"id":"a3Vx8CkX7Gvm3xygEW6suk","parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"9giBMxpAESvroYM29nf3G8","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-1.2866362370273055,"cy":1.0193806058652697,"cz":2.268765007024547,"lx":306.5121720836238,"ly":1,"lz":10,"leftJoints":["tTQGq2VqjKpQoZgpEaARbs"],"rightJoints":["a3Vx8CkX7Gvm3xygEW6suk"],"leftPoint":[151.96924379308496,1.2706673964011799,0.05688696619531554],"rightPoint":[-154.54251626713952,0.7680938153293653,0.05688696619531554],"relativeAngle":-3.13995299992499,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"id":"g3He9XTWe5maiTYrqciaG9","parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","wallStructure":"Default","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"9giBMxpAESvroYM29nf3G8","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Window","cx":-0.0016312565879556264,"cy":0.1,"cz":-0.25,"lx":0.9722289264215535,"ly":1,"lz":0.4,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4TrowgoNHHNXYC8KtY1dtx","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4547943367220286,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iof3BVn3KFMX9V6rxX61FU","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4440280432415217,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oeVswn1FhJvx1f2JWvuaZH","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4332617497610147,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4ZTszhixEz84xXerw82Uo3","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4224954562805078,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1sd89pPPKeQ9FqjTEs4sZF","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4117291628000008,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8s1DLvp5TX82whCzVfdUy4","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.4009628693194939,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oXy9DWPm3cMawuws3jF8Dw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3901965758389869,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ggUJnAELkscnr8wCY2e7Xs","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.37943028235848,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8K3TMP2Tgt2RSSJuVqdR4j","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.368663988877973,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2S8f7FahdEW7w7JhfCr366","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3578976953974661,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hhTDcot7DdMSFULh2sdVeZ","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3471314019169591,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2pZvpiD5SsELthkKt5tJ3m","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3363651084364522,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qtThbnZ5JrBKiRkEvfRHrG","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3255988149559452,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fGfPoazDUrc1DSJzSnMpw3","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3148325214754383,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"x3RhjZSxkvWSRpw5djcpHZ","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.3040662279949313,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oLkzHPWGqiFTFWraAnDDgS","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2932999345144244,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tjR9qDZMaGrJrWqAX3GTdN","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2825336410339174,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2mkdDg7a8yURhWsybphBX8","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2717673475534105,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"shD7ir3GFfbNG9UMMU6iwe","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2610010540729035,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"afuEQk9zuenrJ8npwWbHHS","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.2502347605923966,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bUcm7SdZ4EQSXBzhVjLFu8","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.23946846711188963,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"umh8sJsWFoUPrkMgMwXLJn","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.22870217363138268,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ervRrrNZYFcCz6shRwYQAk","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.21793588015087573,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"aRMEj198niGbhwRDVQV2Km","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.20716958667036878,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"25sJCfiia7r85LY9nqQicw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.19640329318986183,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"73rwFbBokSJRAU9Dv14LUw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.18563699970935488,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9DpFamDpKZuxKGTKjNyYgL","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.17487070622884793,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tMcjE28A6HsCisTEqVEqDz","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.16410441274834098,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5prc1TM3iJvnq2rRv3GjGw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.15333811926783403,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8hZc1y1J1uuiUzd7bn2efy","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.14257182578732708,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"btAxXppEu9xUvRTDmyL6e9","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.13180553230682013,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nk7LwxQwWjfkFkTpnqaBzC","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.12103923882631318,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xqm1C2kjuX1xr87NJG13D1","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.11027294534580623,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tKZW8EpQP3VnR9rHQDUsi7","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.09950665186529928,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cs2PWb768A9N78tdDnfCJe","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.08874035838479233,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"aEp3n5z6CHtBUhs4tf1qQE","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.07797406490428538,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9yP2H7BonttfM9g6obUAWw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.06720777142377843,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"mzzB5cTKaPu2GCcZSHNfoN","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.05644147794327148,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rLsbraJPBqJvE4764xSEve","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.04567518446276453,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vKVhtpqyoaaHZW5MyN6eTB","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.03490889098225758,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jqdKUxQoqH8xWJQ6WhDGVQ","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.024142597501750636,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"7W9Ex51ZfXMaF32tnfWjoG","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.013376304021243696,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cHwdqwmBgx8A17cDpZPPbh","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":-0.0044043927874840355,"cy":0.1,"cz":0.21999999999999997,"lx":0.003588764493510067,"ly":1,"lz":0.42000000000000004,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eJYiY4DxK2CARyVadVVJCx","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.004567518446267871,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9Q9L4KdsCCfLnQFBJuanXE","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.01533381192677481,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3cRXM4bonZuYd9TnGSQqHH","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.026100105407281752,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"97h3j7H6Qh9e6EQaWwwUZs","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.034419514005859485,"cy":0.1,"cz":0.21999999999999997,"lx":0.004893769763858407,"ly":1,"lz":0.42000000000000004,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1tjDay5JXZwfoH1FRqotv8","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.04404392787479333,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"r2NNGxf63r8FosPwJcTE9W","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.05481022135530028,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oAWmRTRvbzDTo9C3MrVKuU","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.06557651483580723,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nxEpnZTwyQv5kRbmcUQT1a","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.07634280831631418,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cxmmFejGDyUJgTvayWAjdb","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.08710910179682113,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rMHepSTZZvbuQwxezFKpdj","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.09787539527732808,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eaxDcJH54ULucXspGZbKty","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.10864168875783503,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iCSFe1wxX4XSin8cB68JeL","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.11940798223834198,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"kgoq3WLxjVdPRdaxyzqFVA","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.13017427571884893,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tBR5PErXE7yvYAGPgMqH1D","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.14094056919935588,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iyQuNv6jvRv3GvuS8UwxUv","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.15170686267986283,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xmqsdiGpkMdxiVjXTPaJy1","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.16247315616036978,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"k5yQE7AumptJLR5Hzwy992","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.17323944964087673,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pB3LcGmgHBTuT6LcAoCTvg","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.18400574312138368,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"n43Pd6jLDz3CYkTbCV3gjh","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.19477203660189063,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"trG58x8VeFSbKFAEHY4zJs","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.20553833008239758,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pTcw3Ur3TBnoB59qvLnZju","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.21630462356290453,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cfRJh7295CGWwCnbeA6tL2","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.22707091704341148,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dY8S4UaNAqP39TMFMEg5vp","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.23783721052391843,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iXENQGue8HpDQxMxGep9B7","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.24860350400442538,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wcpBvnsfPogwewn1nqjhP1","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.25936979748493233,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"o9i61J2BnA3F192C23MrBE","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2701360909654393,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"491xMjyUYSkSxP8QumC9Ad","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.28090238444594623,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pSWKk8pafQidxC7vXHaMCo","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.2916686779264532,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iTAFmPC5oX6jsetEFccxke","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.30243497140696013,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"iz9ye9NbXspk9eitQpzyBB","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3132012648874671,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"gNyXuR9rKr3itGofcKsjEe","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.32396755836797403,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"qtDo91vL39Swf6jH2eCN33","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.334733851848481,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jPqnNwwcUAYNf7z6neEUMx","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.34550014532898793,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bEUtkBUPaeHwYUvidNh7L3","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3562664388094949,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"ea6qeRQ1FZ5mWCfujb9TRw","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.36703273229000183,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"wWpVZQ8VDFJormPKS8z6GS","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3777990257705088,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"sxCmsmibuQs3hkEUB7yL2z","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.38856531925101573,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hg7q1GBM4nGGX6iEWCAYQY","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.3993316127315227,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tYNYJRyLtFZMp118iLaQYh","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Wall","cx":-1.1369830444213562,"cy":-3.2057378745231233,"cz":2.268765007024547,"lx":304.27424431214394,"ly":1,"lz":10,"leftJoints":["a3Vx8CkX7Gvm3xygEW6suk"],"rightJoints":[],"leftPoint":[-153.2739660888427,-3.4114757490462466,0],"rightPoint":[151,-3,0],"relativeAngle":0.0013523191073632186,"textureType":"No Wall Texture","color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"id":"xdCET3deCXRuddujsYebQJ","parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","wallStructure":"Stud","structureSpacing":1000,"structureColor":"white","structureWidth":0.1,"opacity":0,"roofId":"9giBMxpAESvroYM29nf3G8","leftRoofHeight":10,"rightRoofHeight":10,"selected":false,"locked":true,"fill":"Full","eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"id":"9giBMxpAESvroYM29nf3G8","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"color":"#dd8c55","normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"parentId":"5wyrw4eyiKGEAMo62i1ana","foundationId":"5wyrw4eyiKGEAMo62i1ana","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["g3He9XTWe5maiTYrqciaG9","a3Vx8CkX7Gvm3xygEW6suk","xdCET3deCXRuddujsYebQJ","tTQGq2VqjKpQoZgpEaARbs"],"selected":false,"locked":true,"rise":0,"ceiling":false},{"type":"Foundation","cx":-26.222816598442076,"cy":-0.9292686291105667,"cz":0.05,"lx":333.3539193128119,"ly":8.472793647667807,"lz":0.05688696619531554,"normal":[0,0,1],"rotation":[0,0,1.4494959437812907],"parentId":"Ground","color":"#ffffff","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"5wyrw4eyiKGEAMo62i1ana","selected":false,"locked":true},{"type":"Cuboid","cx":-43.176009447245605,"cy":-162.89911470396555,"cz":2.4,"lx":33.24079414212538,"ly":153.39358926336755,"lz":4.8,"color":"gray","faceColors":["gray","gray","gray","gray","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.690700446406907],"parentId":"Ground","selected":false,"id":"u7iJ275LF7PsLiM2u1dVBQ","locked":true},{"type":"Cuboid","cx":-2.8348275713997992,"cy":161.33575348972343,"cz":2.4,"lx":33.24079414212538,"ly":153.39358926336755,"lz":4.8,"color":"gray","faceColors":["gray","gray","gray","gray","#999999","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.690700446406907],"parentId":"Ground","id":"wyK5WSj9bXtNuRAF7XgETz","selected":false,"locked":true},{"type":"Human","name":"Jack","cx":-13.867776626070096,"cy":16.44454221560224,"cz":2.4,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"u7iJ275LF7PsLiM2u1dVBQ","id":"3TR4V58Snnnj9e7TpcxNer","selected":false,"locked":true,"ly":0.42},{"type":"Human","name":"Jade","cx":4.361328445266435,"cy":5.283856360212143,"cz":2.4,"lx":0.48,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"wyK5WSj9bXtNuRAF7XgETz","id":"432YUQhSdAnxi3UMs4gV6j","selected":false,"locked":true,"ly":0.48},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.21759070764863064,"cy":0.09383633281654624,"cz":0.500000019868218,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"nA8YNqGcgNn6n9w5X3BpF9","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.16557346067688847,"cy":0.09106998636897809,"cz":0.5000000198682152,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"wZS6seNSEkCgvazx2SPZ5c","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.11082921515041991,"cy":0.08928793716557112,"cz":0.5000000198682152,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"x3C87W7drRbnUHfAYYiZ6Y","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.05774324107965007,"cy":0.0913178646013816,"cz":0.5000000198682152,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"u6wAPuen9vF2Z3r6jkt6uM","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":0.005068761768732548,"cy":0.08874894608300367,"cz":0.5000000198682152,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"rL6iysZ9LkBhdnBmy78QpW","selected":false,"locked":true},{"type":"Light","decay":2,"distance":5,"intensity":10,"color":"#ffff99","cx":-0.0491156001466331,"cy":0.09437002382165598,"cz":0.500000019868227,"lx":0.16,"ly":0.16,"lz":0.08,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-1.69063753117418],"parentId":"1rAGH78b5nt7cXyGU9vNRV","foundationId":"1rAGH78b5nt7cXyGU9vNRV","id":"rEnSYjbkzp79trJtnUa7Gy","selected":false,"locked":true},{"type":"Window","cx":0.41009790621202963,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pR2ZvfPm33xd32n52fERDG","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.4208641996925366,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"d3taAEWrsfg9pDkNriT6Bf","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.41009790621202963,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jDcqi15keuTdq7ExRrL3UP","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":0.4208641996925366,"cy":0.1,"cz":0.2249999999999981,"lx":0.007177528987004627,"ly":1,"lz":0.4299999999999963,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Arched","archHeight":1.09999999999998,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"q63v3RoQgW3e2HtK8UQ7Hm","parentId":"g3He9XTWe5maiTYrqciaG9","foundationId":"5wyrw4eyiKGEAMo62i1ana","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true},{"type":"Window","cx":4.636310074930709e-17,"cy":0.1,"cz":-0.275,"lx":0.9689664132456421,"ly":1,"lz":0.45,"mullion":false,"mullionWidth":0.06,"mullionSpacing":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"rkSn9S8cDboGt5qcUBcvye","parentId":"9NUyotcWKkPg4jzRyBrCwn","foundationId":"dYN3JG9zLXMcmq6cqLG4jC","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"locked":true}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":58,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[110.96343175001607,66.9554559161036,0.0000720622586878184],"yearlyHeliostatYieldPanelY":0,"mapPanelX":197,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[110.96343175001607,66.95530590939957,150],"theme":"Dune","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":17,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-12.806523424789926,-160.05159040218686,14.727641870329451],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":3.3216676797521423,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#fb9e00","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[-32.60447516785695,-115.97404775152154,0.3818596975980578],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":2.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"dailyPvYieldPanelRect":{"x":-4,"y":10,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyLightSensorPanelRect":{"x":-1254,"y":272,"width":600,"height":360},"weatherPanelRect":{"x":820,"y":40,"width":500,"height":500},"waterSurface":false},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},480:function(e){e.exports=JSON.parse('{"docid":"9ZNtij6epEbjFerL3Fki8V","time":"04/30/2023 08:14 pm","timestamp":1682900089813,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2023, 12:00:00 PM","cspTimesPerHour":1,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"countryCode":"US","airConvectiveCoefficient":5,"diurnalTemperatureModel":1,"highestTemperatureTimeInMinutes":900,"sutTimesPerHour":1,"sutDaysPerYear":4,"sutGridCellSize":1,"noAnimationForThermalSimulation":false,"noAnimationForSolarUpdraftTowerSimulation":false},"elements":[{"type":"Cuboid","cx":-0.22430639550810128,"cy":8.947133751823877,"cz":2.401107446167214,"lx":18.902326348374032,"ly":5.3294214620188916,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"stackable":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"m4D9SbEpcsZfFRNzvJTjS5"},{"type":"Cuboid","cx":-0.26822240735293335,"cy":12.103493027949177,"cz":2.839687693194611,"lx":18.984817336850906,"ly":1.06143303468172,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"4w7XR2z9jkkyeZbNjAh92J","selected":false},{"type":"Cuboid","cx":-8.62825556014066,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"8anKqMBmn2tBM3VcbkW2hs","selected":false},{"type":"Cuboid","cx":-5.172802633695682,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"1L5N5fkm9M3irZedu1HDBw","selected":false},{"type":"Cuboid","cx":-1.7173497072507025,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"6oVCjynNCY7nCmhamoZVq2","selected":false},{"type":"Cuboid","cx":1.7381032191942762,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"4zPy6F9nXphm8skTrgCaAW","selected":false},{"type":"Cuboid","cx":5.193556145639255,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"7mvJNbzUwn3qqmU3qEVitc","selected":false},{"type":"Cuboid","cx":8.649009072084235,"cy":-0.029274931737717114,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"4w7XR2z9jkkyeZbNjAh92J","id":"xiYgkAhrbVK6XVAigVSkom","selected":false},{"type":"Human","name":"Jack","cx":-7.801540397849415,"cy":-0.26188830739616975,"cz":2.4011075496673584,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m4D9SbEpcsZfFRNzvJTjS5","id":"8NTe1csuN2SaTMvxbNW9Po","selected":false},{"type":"Cuboid","cx":-3.6145240973701718,"cy":4.206434223281605,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"8JgsqWqgb4cyYSdEJfGwEm","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"8JgsqWqgb4cyYSdEJfGwEm","id":"xeWGgNUm9y6UhkwbSisvQf","selected":false},{"type":"Human","name":"Jeff","cx":-0.06368738371907989,"cy":0.025775270777415926,"cz":0.10000000149011612,"lx":0.6,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"pcfABj9VPodaxzM775mxon","id":"eeqUf4vobbEXfMB8bkzmGM","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"xeWGgNUm9y6UhkwbSisvQf","id":"m74U4PeTm7hTqfFPWnM7zL","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"m74U4PeTm7hTqfFPWnM7zL","id":"wUVjKjRa6pzXyxbMQ53EQM","selected":false},{"type":"Cuboid","cx":-0.019517637205746396,"cy":0.17398583927153197,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"wUVjKjRa6pzXyxbMQ53EQM","id":"d41QGJugD7tGPsTYKGhykU","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"d41QGJugD7tGPsTYKGhykU","id":"ewa94SA8sKbxzN2tE4mB3G","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"ewa94SA8sKbxzN2tE4mB3G","id":"arNH7dUPxXi661cPiribL2","selected":false},{"type":"Cuboid","cx":-0.008006915988230112,"cy":0.5202217706157303,"cz":0.1,"lx":1.5160138319764558,"ly":1.6177944400962208,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"arNH7dUPxXi661cPiribL2","id":"pcfABj9VPodaxzM775mxon","selected":false},{"type":"Cuboid","cx":0.9517371303232212,"cy":-0.1558343454428396,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"stackable":true,"parentId":"pcfABj9VPodaxzM775mxon","id":"vTqu46XuGVTy2QjutgP1cQ","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"vTqu46XuGVTy2QjutgP1cQ","id":"pp1Ttn4SvkyFUYRPxBPiEQ","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pp1Ttn4SvkyFUYRPxBPiEQ","id":"6h2y2J7ocSWWvCr5bRQvWb","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"6h2y2J7ocSWWvCr5bRQvWb","id":"kLMxbeRFakpUXe68rAKa3a","selected":false},{"type":"Cuboid","cx":-0.019517637205746396,"cy":0.17398583927153197,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"kLMxbeRFakpUXe68rAKa3a","id":"ppPnuhTpcUSHXMcpxdAKgq","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"ppPnuhTpcUSHXMcpxdAKgq","id":"awwHf9YjgCzqZ59uSJXvbZ","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"awwHf9YjgCzqZ59uSJXvbZ","id":"kYGd5athrBpPwKUzyL5ypn","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"kYGd5athrBpPwKUzyL5ypn","id":"sNEKpySg3BQ4ga8B5hSXC5","selected":false},{"type":"Cuboid","cx":-1.7208456881689926e-15,"cy":0.2071151324090322,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"sNEKpySg3BQ4ga8B5hSXC5","id":"nfewirQxFL3G5mr1LTKJ4Q","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"nfewirQxFL3G5mr1LTKJ4Q","id":"eyi9c5ZCgCKTVNCEoLFZki","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"eyi9c5ZCgCKTVNCEoLFZki","id":"kDnmDYWAfFojmgmSfVFXVN","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"kDnmDYWAfFojmgmSfVFXVN","id":"6dhMXX3yHamC4VtEy1UWDu","selected":false},{"type":"Cuboid","cx":-0.019517637205746396,"cy":0.17398583927153197,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"6dhMXX3yHamC4VtEy1UWDu","id":"cmC7Vzw8ZucHWUzr8YxLFa","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"cmC7Vzw8ZucHWUzr8YxLFa","id":"9Vw4QTauKAg8QvUaB1Euvx","selected":false},{"type":"Cuboid","cx":-0.0036484396437304056,"cy":0.1947553046754603,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"9Vw4QTauKAg8QvUaB1Euvx","id":"pJRDT44anj2xpBPXknWsKw","selected":false},{"type":"Cuboid","cx":-1.7763568394002505e-15,"cy":0.21132455056762076,"cz":0.1,"lx":1.5,"ly":1,"lz":0.2,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pJRDT44anj2xpBPXknWsKw","id":"j38YrARLBzo6erzquVrcVn","selected":false},{"type":"Cuboid","cx":-7.012727351573531,"cy":-0.0019896050851210545,"cz":2.401107446167214,"lx":5.332404162083246,"ly":12.674961304569683,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"q5FjLBSpipgNNVuah4hNZD","selected":false},{"type":"Cuboid","cx":-0.01596259528722399,"cy":0.11880364489857795,"cz":0.05,"lx":31.446492946590087,"ly":34.94910259238378,"lz":0.1,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"stackable":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"azyA8xuS3BmfetgYA2vQmH","enableGroupMaster":true},{"type":"Cuboid","cx":-6.183805959243027,"cy":-11.996720725467824,"cz":2.839687693194611,"lx":7.107385573986727,"ly":1.0946519025967618,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"pvKQ8K8ppq2w8qd94NN9Pq","selected":false},{"type":"Cuboid","cx":-2.6545444189389995,"cy":-0.012665497780197654,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pvKQ8K8ppq2w8qd94NN9Pq","id":"wdxoPVDdzYeWyAYAZzkhtp","selected":false},{"type":"Cuboid","cx":0.8009085075059792,"cy":-0.012665497780197654,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pvKQ8K8ppq2w8qd94NN9Pq","id":"5uJL1EV8MPYeihH3UHzRgB","selected":false},{"type":"Cuboid","cx":-6.259452975235207,"cy":-8.867472080025085,"cz":2.401107446167214,"lx":6.926658110091524,"ly":5.102845526644927,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"fDXXcdBNXgffF1kQT4tCPn","selected":false},{"type":"Cuboid","cx":6.486972303080908,"cy":-0.054704878346608754,"cz":2.401107446167214,"lx":5.332404162083246,"ly":12.674961304569683,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"m4EGzGFe1rC8e8u6MQUpW8","selected":false},{"type":"Cuboid","cx":-10.220230850412868,"cy":-0.014533868827829727,"cz":2.839687693194611,"lx":25.047849285814525,"ly":1.0029193528166587,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"stackable":true,"parentId":"Ground","id":"uqhNMV7mprjgQMdGsRF2QT","selected":false},{"type":"Cuboid","cx":-5.596739585658853,"cy":0.0290609141417434,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"q16v7h71SJ7yFzoy83DaBL","selected":false},{"type":"Cuboid","cx":-2.141286659213871,"cy":0.029060914141743187,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"7o2risK8LTapPsnDGartoZ","selected":false},{"type":"Cuboid","cx":1.3141662672311076,"cy":0.029060914141742975,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"eAM1pw2NKdNfF1gW8XpVih","selected":false},{"type":"Cuboid","cx":4.769619193676086,"cy":0.029060914141742764,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"5cwTU21rFZUwTfiouz5qYe","selected":false},{"type":"Cuboid","cx":8.225072120121062,"cy":0.029060914141749657,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"biVWnambVhBNmbnHk2Wiy3","selected":false},{"type":"Cuboid","cx":11.680525046566043,"cy":0.029060914141751222,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"rSaUgAuDRqbJLQtkpJnJtG","selected":false},{"type":"Cuboid","cx":-8.818019962594427,"cy":0.02514455088051193,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"sMxTWQFpHwxtpEsSHpPYb6","selected":false},{"type":"Cuboid","cx":-2.1412866592138746,"cy":0.0290609141417434,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"eRXqtRB7se3M8GzKXkxUnh","selected":false},{"type":"Cuboid","cx":-11.724426888881109,"cy":0.05789686773779312,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"uqhNMV7mprjgQMdGsRF2QT","id":"qLaLq73w7A9ZmbSk84RuGL","selected":false},{"type":"Cuboid","cx":9.685298368001048,"cy":0.0017243180851487239,"cz":2.839687693194611,"lx":25.09195057934765,"ly":0.9927712733989245,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.5707963267948966],"stackable":true,"parentId":"Ground","id":"irfb2m2puWv6odJ6Jwp6YM","selected":false},{"type":"Cuboid","cx":-5.618790232425412,"cy":-0.03080928172797003,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"sEAcnpxYSig5gpY8iTY3Yy","selected":false},{"type":"Cuboid","cx":-2.163337305980429,"cy":-0.030809281727968464,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"6feu78ouLNMPYNKTLRwvPo","selected":false},{"type":"Cuboid","cx":1.2921156204645494,"cy":-0.030809281727968676,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"6CfBo1pNmDDqH7Mwik6c7H","selected":false},{"type":"Cuboid","cx":4.747568546909526,"cy":-0.030809281727968887,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"isrB6noYi8NEhJRQG8ietf","selected":false},{"type":"Cuboid","cx":8.203021473354507,"cy":-0.030809281727954888,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"dReb13hJ9AJKebwakYRY69","selected":false},{"type":"Cuboid","cx":11.658474399799484,"cy":-0.03080928172794977,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"3eH5ZbQj5WHp7QCzbxMKGz","selected":false},{"type":"Cuboid","cx":-8.840070609360978,"cy":-0.03472564498920451,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"svPiKiErdWciBnFsmqoNKg","selected":false},{"type":"Cuboid","cx":-2.1633373059804324,"cy":-0.030809281727968464,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"aQ3KbWPYnCPqSao4PhCn2t","selected":false},{"type":"Cuboid","cx":-11.746477535647664,"cy":-0.001973328131929355,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"irfb2m2puWv6odJ6Jwp6YM","id":"3GXadNYd518rGsiHZnch9r","selected":false},{"type":"Human","name":"Jamelia","cx":-0.09265449725102398,"cy":-11.357307781644565,"cz":0.05000000074505806,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"azyA8xuS3BmfetgYA2vQmH","id":"1JVUnXP3EYNgXEV5Mhij7X","selected":false},{"type":"Cuboid","cx":5.911674805614613,"cy":-8.780289167948837,"cz":2.401107446167214,"lx":6.525003449448929,"ly":4.771919851852802,"lz":4.802214892334428,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"Ground","id":"3LriNZQ2FWUrzgTjH1nQGp","selected":false},{"type":"Cuboid","cx":5.6478649104510295,"cy":-12.017787072476704,"cz":2.839687693194611,"lx":7.128069650550036,"ly":1.1096381510921969,"lz":5.679375386389222,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"stackable":true,"parentId":"Ground","id":"qEtCzg44w2EkGdkHGvTyXg","selected":false},{"type":"Cuboid","cx":-2.609503179079046,"cy":0.028969325588168324,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"qEtCzg44w2EkGdkHGvTyXg","id":"54P6ija5X4jX2T74DKWGuo","selected":false},{"type":"Cuboid","cx":0.8459497473659319,"cy":0.0289693255881679,"cz":0.5902551357358532,"lx":1.7277264632224896,"ly":1.0453332555014059,"lz":1.1805102714717064,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"qEtCzg44w2EkGdkHGvTyXg","id":"hhTBL9sevUWmS4YHc9UFL2","selected":false},{"type":"Cuboid","cx":5.908936634022203,"cy":-0.011694823916091224,"cz":0.25,"lx":5.894051564987242,"ly":1.0122050011149266,"lz":0.5,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"stackable":true,"parentId":"pvKQ8K8ppq2w8qd94NN9Pq","id":"79YR8wYSe1eRRM8AXmk2pi","selected":false}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[3.365731258384917,-4.23743050549221,-0.000004359573758408488],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[3.365731258384917,-4.237580512159635,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-0.8932377675710492,-35.04498361736728,12.916960792715187],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"directLightIntensity":1,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":30.146795390577452,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":false,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16A5A5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":true,"panCenter":[0,0,0],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":3.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"heatFluxScaleFactor":20,"heatFluxColor":"gray","heatFluxWidth":0.5,"showAzimuthAngle":true,"showElevationAngle":true,"showZenithAngle":true,"groundImageType":"roadmap","waterSurface":false,"solarPanelShininess":100,"windowShininess":200,"showDiurnalTemperaturePanel":false,"showEconomicsPanel":false,"showDailyUpdraftTowerYieldPanel":false,"showYearlyUpdraftTowerYieldPanel":false,"showDailyBuildingEnergyPanel":false,"showYearlyBuildingEnergyPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"yearlyLightSensorPanelShowDaylight":false,"yearlyLightSensorPanelShowClearness":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":[]}')},481:function(e){e.exports=JSON.parse('{"docid":"ag6x1qqPgPt1AJp2oKoKDF","time":"02/02/2023 08:27 pm","timestamp":1675387657521,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"10/1/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":1,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":5.105053829358722,"normal":[0,0,1],"lz":0.1,"ly":26.301278139506802,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-1.995894425388201,"cz":0.05,"rotation":[0,0,0],"lx":38.854999999999976,"selected":false,"parentId":"Ground"},{"rotation":[0,0,0],"normal":[0,0,1],"showLabel":false,"label":"Row1","cy":-0.39629808463170607,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"cz":0.5000000074505806,"type":"Solar Panel","id":"c2J7QZr1z68dpk33yTT2Sd","orientation":"Landscape","cx":-0.0067633355149074184,"relativeAzimuth":0,"trackerType":"None","poleSpacing":3,"selected":false,"lz":0.046,"lx":31.488,"poleHeight":1,"drawSunBeam":false,"ly":1.984,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-355P-FG"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.006869188501244585,"cy":-0.3009472773624533,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6g9iBRNNW6XDAK9EeP8dnv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0069750414875817505,"cy":-0.20559647009320042,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ec9UdLR1fMcWkEUdiFjUx2","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007080894473918917,"cy":-0.11024566282394763,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fQLn5udBainjxVp4XrJMRj","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007186747460256083,"cy":-0.014894855554694773,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"p8zx94dUJdEAskSt1PKSVa","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007292600446593249,"cy":0.08045595171455801,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fc9ACQJk2egBLobC44KRz9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007398453432930415,"cy":0.1758067589838109,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k1F8Jw2a6YkaS53ggunuWE","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007504306419267581,"cy":0.2711575662530637,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nfKxjTCwPLzpCqrrT4qwQd","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.007610159405604748,"cy":0.3665083735223166,"cz":0.5000000074505806,"lx":31.488,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oY8VxSJVvnuAD8XoQBDkh2","selected":false},{"type":"Tree","name":"Spruce","cx":11.921605574611789,"cy":-10.909355003026004,"cz":0,"lx":4.3193414394375225,"lz":9.842530786133311,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"vfBrsVoh8zPsZKEuooN1Mp","selected":false,"showModel":false},{"type":"Tree","name":"Spruce","cx":-2.2808944253881993,"cy":-11.194355003026004,"cz":0,"lx":4.3193414394375225,"lz":10.279562696083193,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"99sYceKNBfrqJSsDa72tLX","selected":false,"showModel":false},{"type":"Human","name":"Joel","cx":-7.8137499999999935,"cy":-0.3139426000311314,"cz":0.05000000074505806,"lx":1,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ipdiy6H5XdiRMv79uDtrRE","id":"obVZfacvimifAis6oD33mX","selected":false,"observer":true,"ly":0.6},{"type":"Tree","name":"Spruce","cx":2.374105574611796,"cy":-10.956855003026007,"cz":0,"lx":4.3193414394375225,"lz":9.842530786133311,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"sCYPQFyb4Ezu7V4j1ddt8r","selected":false,"showModel":false},{"type":"Tree","name":"Spruce","cx":7.029105574611797,"cy":-11.004355003026005,"cz":0,"lx":4.3193414394375225,"lz":8.761424913666062,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"jgqeg8YLSBfHZnbBhuouTU","selected":false,"showModel":false},{"type":"Human","name":"June","cx":7.0000631393125845,"cy":-0.3317126323621302,"cz":0.05000000074505806,"lx":0.4,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"ipdiy6H5XdiRMv79uDtrRE","id":"m6FHMxEEVfFM123WLmXjyv","selected":false,"observer":true,"ly":0.4},{"type":"Foundation","cx":-1.9721444253882048,"cy":-14.775412402994869,"cz":0.05,"lx":38.427499999999974,"ly":3.837114799937732,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"ipdiy6H5XdiRMv79uDtrRE","textureType":"Foundation Texture #2"}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":false,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[4.688586933696731,-41.63558463662862,6.94326488693142],"panCenter":[5.94996462578833,-14.876226974643979,5.628671784918282],"orthographic":false,"enableRotate":true,"cameraZoom":21.05263157894738,"showInstructionPanel":false,"cameraPosition2D":[2.659105574611795,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.659105574611795,-0.19805700089319547,5.501827899659354e-7],"showSolarPanelVisibilityResultsPanel":true,"visibilityResultsPanelX":-6,"visibilityResultsPanelY":-1,"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":342,"height":67}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Vegetative buffer to hide solar farms"]}')},482:function(e){e.exports=JSON.parse('{"docid":"8D5YJAWj6vd3LW25Hcokqe","time":"02/02/2023 03:03 pm","timestamp":1675368235538,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"timesPerHour":10,"pvGridCellSize":0.25,"address":"Natick, MA","name":"default","longitude":-71.3488548,"latitude":42.2844063,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"date":"9/22/2022 12:00:00 PM","orthographic":false,"cameraZoom":43.16939043526371,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"lz":0.1,"rotation":[0,0,0],"normal":[0,0,1],"cy":-0.0832752328102914,"id":"iGgGyZAWhJDDrqTBSuKY6v","ly":10.412088787523913,"type":"Foundation","cx":0.013242648336242419,"selected":false,"cz":0.05,"lx":16.616755394628733,"parentId":"Ground"},{"lz":0.046,"selected":false,"cz":0.5000000074505984,"relativeAzimuth":0,"cy":0.010384230278591844,"cx":0.2680462212766878,"poleRadius":0.05,"showLabel":true,"lx":1.046,"label":"60\xb0","tiltAngle":1.0471975511965976,"poleSpacing":3,"rotation":[0,0,0],"poleHeight":1,"trackerType":"None","drawSunBeam":false,"orientation":"Portrait","ly":1.558,"type":"Solar Panel","id":"dnMAS4xYMUhcSByeLwN5TX","normal":[0,0,1],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.3898315956697325},{"ly":1.558,"drawSunBeam":false,"selected":false,"normal":[0,0,1],"id":"wc8yTNk8bcNL8vA26NKhEp","tiltAngle":0.5235987755982988,"poleRadius":0.05,"poleHeight":1,"rotation":[0,0,0],"type":"Solar Panel","lz":0.046,"trackerType":"None","lx":1.046,"label":"30\xb0","cz":0.5000000074505762,"showLabel":true,"cx":0.13277873492805234,"poleSpacing":3,"relativeAzimuth":0,"cy":0.010196717472218795,"orientation":"Portrait","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.3601290996632553},{"lx":1.046,"poleSpacing":3,"rotation":[0,0,0],"orientation":"Portrait","poleHeight":1,"showLabel":true,"tiltAngle":-1.0471975511965976,"normal":[0,0,1],"selected":false,"label":"-60\xb0","lz":0.046,"drawSunBeam":false,"id":"r18XcJKcSLBW2tCEW6s74k","relativeAzimuth":0,"cy":0.003644619198116936,"type":"Solar Panel","trackerType":"None","poleRadius":0.05,"cx":-0.26994946306447615,"ly":1.558,"cz":0.5000000074505806,"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":0.2655114569703831},{"tiltAngle":0,"normal":[0,0,1],"rotation":[0,0,0],"lz":0.046,"poleSpacing":3,"selected":false,"cy":0.010748815746320655,"drawSunBeam":true,"poleHeight":1,"lx":1.046,"relativeAzimuth":0,"trackerType":"None","cx":-0.0014144903672051448,"showLabel":true,"id":"u4LjNU3fd3PVZ6QAX6aug1","ly":1.558,"poleRadius":0.05,"label":"0\xb0","orientation":"Portrait","cz":0.5000000074506161,"type":"Solar Panel","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.055863332406658},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.14083049882259674,"cy":0.007102961069032241,"cz":0.500000007450585,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":-0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"sHpER3yfCDZgTy8YcbqJF4","selected":false,"label":"-30\xb0","dailyYield":0.5565058986546524},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3828186339361362,"cy":0.008748911792797884,"cz":0.5000000074505806,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":1.5707963267948966,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"3AQTuKXP5kZ5PgShm7kPSX","selected":false,"label":"90\xb0","dailyYield":1.1380948831431423},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.413167442044193,"cy":0.006734639393330298,"cz":0.5000000074505806,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":-1.5707963267948966,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"8GwG9uCiXmMbkeB4NtFJwK","selected":false,"label":"-90\xb0","dailyYield":0.3371955456546947},{"type":"Human","name":"Jack","cx":-0.6922041428236811,"cy":-4.092105437234061,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","id":"vDEckHeU6T8epe3YRNBYqh","selected":false,"ly":0.6}],"view":{"weatherPanelX":0,"heliodonPanelY":453,"showStickyNotePanel":true,"dailyPvYieldPanelX":4,"weatherPanelY":0,"dailyLightSensorPanelY":525,"mapZoom":16,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":-1244,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":true,"mapWeatherStations":false,"dailyPvYieldPanelY":1,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":-1277,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[8.023018704034044,-16.232959358672062,3.67727930352486],"panCenter":[5.030220047531196,-1.0315498826531624,0.3615371700849206],"orthographic":false,"enableRotate":true,"cameraZoom":53.00068653280895,"stickyNotePanelX":5,"stickyNotePanelY":2,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999796],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":1,"y":4,"width":202,"height":93}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of tilt angles on\\nsolar panel outputs"]}')},483:function(e){e.exports=JSON.parse('{"docid":"44QNMQZiyWYfqFnbbUSraT","time":"02/02/2023 03:04 pm","timestamp":1675368269762,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"timesPerHour":20,"address":"Natick, MA","name":"default","longitude":-71.3488548,"latitude":42.2844063,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"date":"9/22/2021 12:00:00 PM","orthographic":false,"cameraZoom":43.16939043526371,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"lz":0.1,"rotation":[0,0,0],"normal":[0,0,1],"cy":-0.0832752328102914,"id":"iGgGyZAWhJDDrqTBSuKY6v","ly":10.412088787523913,"type":"Foundation","cx":0.013242648336242419,"selected":false,"cz":0.05,"lx":16.616755394628733,"parentId":"Ground"},{"lz":0.046,"selected":false,"cz":0.5000000074505984,"relativeAzimuth":1.0471975511965976,"cy":0.010384230278591844,"cx":0.2680462212766878,"poleRadius":0.05,"showLabel":true,"lx":1.046,"label":"60\xb0","tiltAngle":0.6981317007977318,"poleSpacing":3,"rotation":[0,0,0],"poleHeight":1,"trackerType":"None","drawSunBeam":false,"orientation":"Portrait","ly":1.558,"type":"Solar Panel","id":"dnMAS4xYMUhcSByeLwN5TX","normal":[0,0,1],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.1296025646801735},{"ly":1.558,"drawSunBeam":false,"selected":false,"normal":[0,0,1],"id":"wc8yTNk8bcNL8vA26NKhEp","tiltAngle":0.6981317007977318,"poleRadius":0.05,"poleHeight":1,"rotation":[0,0,0],"type":"Solar Panel","lz":0.046,"trackerType":"None","lx":1.046,"label":"30\xb0","cz":0.5000000074505762,"showLabel":true,"cx":0.13277873492805234,"poleSpacing":3,"relativeAzimuth":0.5235987755982988,"cy":0.010196717472218795,"orientation":"Portrait","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.3296869651923566},{"lx":1.046,"poleSpacing":3,"rotation":[0,0,0],"orientation":"Portrait","poleHeight":1,"showLabel":true,"tiltAngle":0.6981317007977318,"normal":[0,0,1],"selected":false,"label":"-60\xb0","lz":0.046,"drawSunBeam":false,"id":"r18XcJKcSLBW2tCEW6s74k","relativeAzimuth":-1.0471975511965976,"cy":0.003644619198116936,"type":"Solar Panel","trackerType":"None","poleRadius":0.05,"cx":-0.26994946306447615,"ly":1.558,"cz":0.5000000074505806,"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.1539575918080192},{"tiltAngle":0.6981317007977318,"normal":[0,0,1],"rotation":[0,0,0],"lz":0.046,"poleSpacing":3,"selected":false,"cy":0.010748815746320655,"drawSunBeam":true,"poleHeight":1,"lx":1.046,"relativeAzimuth":0,"trackerType":"None","cx":-0.0014144903672051448,"showLabel":true,"id":"u4LjNU3fd3PVZ6QAX6aug1","ly":1.558,"poleRadius":0.05,"label":"0\xb0","orientation":"Portrait","cz":0.5000000074506161,"type":"Solar Panel","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":1.4023532989786718},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.14083049882259674,"cy":0.007102961069032241,"cz":0.500000007450585,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":0.6981317007977318,"relativeAzimuth":-0.5235987755982988,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"sHpER3yfCDZgTy8YcbqJF4","selected":false,"label":"-30\xb0","dailyYield":1.3216497104200369},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.3828186339361362,"cy":0.008748911792797884,"cz":0.5000000074505806,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":0.6981317007977318,"relativeAzimuth":1.5707963267948966,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"3AQTuKXP5kZ5PgShm7kPSX","selected":false,"label":"90\xb0","dailyYield":0.9830976469578562},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":-0.413167442044193,"cy":0.006734639393330298,"cz":0.5000000074505806,"lx":1.046,"ly":1.558,"lz":0.046,"trackerType":"None","tiltAngle":0.6981317007977318,"relativeAzimuth":-1.5707963267948966,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"8GwG9uCiXmMbkeB4NtFJwK","selected":false,"label":"-90\xb0","dailyYield":0.9777009351289816},{"type":"Human","name":"Jack","cx":-0.6922041428236811,"cy":-4.092105437234061,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","id":"vDEckHeU6T8epe3YRNBYqh","selected":false,"ly":0.6}],"view":{"weatherPanelX":0,"heliodonPanelY":453,"showStickyNotePanel":true,"dailyPvYieldPanelX":4,"weatherPanelY":0,"dailyLightSensorPanelY":525,"mapZoom":16,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":-1244,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":true,"mapWeatherStations":false,"dailyPvYieldPanelY":1,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":-1277,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[3.763670237910374,-16.61721730429299,2.914312591691999],"panCenter":[5.030220047531196,-1.0315498826531624,0.3615371700849206],"orthographic":false,"enableRotate":true,"cameraZoom":53.00068653280895,"stickyNotePanelX":5,"stickyNotePanelY":2,"cameraPosition2D":[0,-0.00004000177797536253,39.9999999999796],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":91}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of azimuth on \\nsolar panel outputs"]}')},484:function(e){e.exports=JSON.parse('{"docid":"tKo6pFHzEmKPLUAtFMSXH1","time":"02/03/2023 04:17 pm","timestamp":1675459040307,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"12/22/2022, 10:30:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":32.2226066,"longitude":-110.9747108,"address":"Tucson, AZ, USA","timesPerHour":4,"pvGridCellSize":0.25,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.7,"airAttenuationCoefficient":0.01},"elements":[{"type":"Foundation","cx":-0.14690699678366315,"cy":-7.208163838562541,"cz":0.05,"lx":11.055471871472701,"ly":58.48001412614986,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","selected":false,"id":"4LeRe177Bf56Mb1oae55ip","textureType":"Foundation Texture #1"},{"type":"Human","name":"Jess","cx":1.6319195310451686,"cy":-16.45128807612893,"cz":0,"lx":0.6,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"mBHbx3X3c1GbXKCLvDVgzL","selected":false,"ly":0.6},{"type":"Parabolic Trough","cx":-0.23513458174461563,"cy":0.004519902359052559,"cz":0.5000000074505806,"lx":3.5,"ly":50,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"4LeRe177Bf56Mb1oae55ip","foundationId":"4LeRe177Bf56Mb1oae55ip","id":"dcjUqAUQZ4LNafSWu4PepW","selected":false,"dailyYield":147.4722488686051,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","label":"EW2","labelHeight":4,"labelSize":2},{"type":"Parabolic Trough","cx":0.15865672328822894,"cy":0.004519902359052563,"cz":0.5000000074505806,"lx":3.5,"ly":50,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"4LeRe177Bf56Mb1oae55ip","foundationId":"4LeRe177Bf56Mb1oae55ip","id":"pwQnP4mNmxVYhvmGqFmMN2","selected":false,"dailyYield":113.9525242653769,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","drawSunBeam":false,"label":"EW1","labelHeight":4,"labelSize":2},{"type":"Parabolic Trough","cx":-0.19816155489194087,"cy":-0.00935955151513266,"cz":0.5000000074505806,"lx":3.5,"ly":50,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rahZRzHN5oxPmD7yBmrrsA","foundationId":"rahZRzHN5oxPmD7yBmrrsA","id":"anQtntJ2EF1xbdU9j34juv","selected":false,"dailyYield":105.42067563837163,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","drawSunBeam":false,"label":"NS1","labelHeight":4,"labelSize":2},{"type":"Parabolic Trough","cx":0.2505997669563526,"cy":-0.00935955151513266,"cz":0.5000000074505806,"lx":3.5,"ly":50,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rahZRzHN5oxPmD7yBmrrsA","foundationId":"rahZRzHN5oxPmD7yBmrrsA","id":"2kyncnrNRhEC8vcEWLLbSV","selected":false,"dailyYield":105.31845023255819,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","label":"NS2","labelHeight":4,"labelSize":2},{"type":"Foundation","cx":0.359422565830144,"cy":28.716630531767144,"cz":0.05,"lx":9.701256512237665,"ly":56.88650192791737,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","id":"rahZRzHN5oxPmD7yBmrrsA","selected":false},{"type":"Human","name":"Judd","cx":3.796298271490718,"cy":-15.228318565508843,"cz":0,"lx":0.6,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"eN5ri3eDDgFLQmoz3oRMfF","selected":false,"ly":0.6}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":true,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":18,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Desert","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[16.103455794589095,-53.110389552237656,19.628758062026815],"panCenter":[15.024700307415378,0.2771229411200077,1.7412798340419682],"orthographic":false,"enableRotate":true,"cameraZoom":6.470670899474181,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[0,-0.000020000888987681265,150],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":11.5,"showSunAngles":true,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":false,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":1,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":true,"dailyParabolicTroughYieldPanelX":-5,"dailyParabolicTroughYieldPanelY":5,"showYearlyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":336,"height":66}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":true,"yearlyParabolicTroughIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of azimuths of parabolic troughs"]}')},485:function(e){e.exports=JSON.parse('{"docid":"vx1ug6kpDBy3x9Qeuoopbp","time":"02/02/2023 12:05 pm","timestamp":1675357543063,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022, 12:00:00 PM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":32.2226066,"longitude":-110.9747108,"address":"Tucson, AZ, USA","timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.6,"airAttenuationCoefficient":0.01},"elements":[{"type":"Parabolic Trough","cx":0.0029931755117467013,"cy":-0.016245165138677214,"cz":0.5000000074505806,"lx":6,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":4,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"rahZRzHN5oxPmD7yBmrrsA","foundationId":"rahZRzHN5oxPmD7yBmrrsA","id":"2kyncnrNRhEC8vcEWLLbSV","selected":false,"dailyYield":233.64209746690477,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","label":"LR=4m","drawSunBeam":true,"locked":false,"labelHeight":5,"labelSize":1},{"type":"Foundation","cx":0.21407524112268916,"cy":-36.149591263989876,"cz":0.05,"lx":12,"ly":35,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"rahZRzHN5oxPmD7yBmrrsA","selected":false},{"type":"Human","name":"Judd","cx":11.353738913610336,"cy":-7.831484265178309,"cz":0,"lx":0.6,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"eN5ri3eDDgFLQmoz3oRMfF","selected":false,"ly":0.6},{"type":"Foundation","cx":-0.00004490043542196287,"cy":-0.25172016696204835,"cz":0.05,"lx":12,"ly":35,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"gZkDqHfktzoy6gJmARmspx","selected":false},{"type":"Parabolic Trough","cx":0.0029931755117467013,"cy":-0.016245165138677214,"cz":0.5000000074505806,"lx":6,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gZkDqHfktzoy6gJmARmspx","foundationId":"gZkDqHfktzoy6gJmARmspx","id":"mBvFg1q8TpWjfngs6RnkZ4","selected":false,"label":"LR=8m","dailyYield":233.64209746690477,"drawSunBeam":true,"locked":false,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelHeight":5,"labelSize":1},{"type":"Parabolic Trough","cx":-0.01770652380020336,"cy":0.008044936654478363,"cz":0.5000000074505806,"lx":6,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":5,"latusRectum":16,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"evP6wn78pnNyKDZXgNgWdE","selected":false,"label":"LR=16m","dailyYield":233.64209746690477,"drawSunBeam":true,"locked":false,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelHeight":5,"labelSize":1},{"type":"Foundation","cx":0.08085129201298358,"cy":35.3877160159791,"cz":0.05,"lx":12,"ly":35,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"cZGzTuNW8Aam7msowwUroB","selected":false}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":true,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":18,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[22.155781466338546,-55.72853752805094,9.397557668970421],"panCenter":[-5.110111828219519,-15.113374046752455,0],"orthographic":false,"enableRotate":true,"cameraZoom":9.753499582310592,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[0,-0.000020000888987681265,19.99999999998951],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":9.5,"showSunAngles":true,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":false,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":1,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":true,"dailyParabolicTroughYieldPanelX":-24,"dailyParabolicTroughYieldPanelY":26,"showYearlyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":355,"height":60}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of latus rectum of parabolic trough"]}')},486:function(e){e.exports=JSON.parse('{"docid":"dvN36C7J8FdfSS21QcUvBx","time":"02/02/2023 05:16 pm","timestamp":1675376211296,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"12/1/2021 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0001687190273044117,"cy":-0.1827633083380377,"cz":0.5000000074505806,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"snQKvKf7xPrhuT28Bo2tYv","selected":false,"dailyYield":7.484195397296324,"label":"L2","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0005055611729018629,"cy":0.005909338720999285,"cz":0.5000000074506161,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"s6gwZqoX59Afjq9iWzuivT","selected":false,"drawSunBeam":false,"dailyYield":7.484195397296324,"label":"L3","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0008424033184993142,"cy":0.19458198578003624,"cz":0.5000000074506517,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pbozwPgQw2bzssDtJKTqSk","selected":false,"dailyYield":7.484195397296324,"label":"L4","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0001681231182930395,"cy":-0.37143595539707464,"cz":0.5000000074505451,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"3nSBw847J9tSxs8CwWughr","selected":false,"label":"L1","dailyYield":13.210165552148743,"yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640967653,"cy":0.38325463283907324,"cz":0.5000000074506872,"lx":17.712,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pu9LeYFSmjuxaejn2VSzZ1","selected":false,"dailyYield":7.484195397296324,"label":"L5","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Foundation","cx":10.048739466084358,"cy":0.01420541284211474,"cz":0.05,"lx":18.175146995703113,"ly":15,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7nkGUQpHaM9zN22MJgfSvf","selected":false},{"type":"Human","name":"Jack","cx":-0.1594284211117477,"cy":-6.960741063855943,"cz":-1.7763568394002505e-15,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"d3bJG1MfPQqauwCeM9B8UL","selected":false,"ly":0.6},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.008008869365173981,"cy":-0.18492700121558012,"cz":0.5000000074505806,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"6AH8jB41hnb2DKANJAvRwV","selected":false,"dailyYield":2.263426258433755,"label":"P2","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.008328904339362014,"cy":0.007217978403519174,"cz":0.5000000074506161,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"aB8iEcrZaWTL6xKZKhhAXB","selected":false,"dailyYield":2.2442794871667524,"label":"P3","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.008648939313550047,"cy":0.19936295802261844,"cz":0.5000000074506517,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"2meA9SG5bqFDgzeFyXtF9Q","selected":false,"dailyYield":2.2442794871667524,"label":"P4","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.007688834390985949,"cy":-0.37707198083467935,"cz":0.5000000074505451,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"868aWiBhQX239e6oehaSij","selected":false,"dailyYield":13.21016555214874,"label":"P1","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.00896897428773808,"cy":0.39150793764171776,"cz":0.5000000074506872,"lx":17.856,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"enRB3aUi95qo1iy8fc8PQq","foundationId":"enRB3aUi95qo1iy8fc8PQq","id":"oBHHZdopRmiffSiEULht6u","selected":false,"dailyYield":2.2442794871667524,"label":"P5","yearlyYield":"0[object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object][object Object]","labelSize":0.5},{"type":"Foundation","cx":-10.236210959894782,"cy":-0.0034675956445191503,"cz":0.05,"lx":19.1296452086662,"ly":14.728928705271478,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"enRB3aUi95qo1iy8fc8PQq","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#16cda5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":true,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[22.452978407808587,-24.247050313502623,17.045911348582777],"panCenter":[16.676839641041024,0.697317195514167,0.36124976444702794],"orthographic":false,"enableRotate":true,"cameraZoom":33.40365140230188,"showInstructionPanel":false,"cameraPosition2D":[2.651601657211317,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.651601657211317,-0.19805700089319547,5.501827899659354e-7],"solarRadiationHeatMapMaxValue":4.5,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-2,"y":-3,"width":321,"height":84}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of orientation (landscape vs. portrait)\\non outputs of solar panel arrays"]}')},487:function(e){e.exports=JSON.parse('{"docid":"gtXnXouMVM8pMVHsKAhdM3","time":"02/02/2023 12:17 pm","timestamp":1675358247774,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"9/22/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.045715871759253096,"normal":[0,0,1],"lz":0.1,"ly":15,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-10.115014866732034,"cz":0.05,"rotation":[0,0,0],"lx":18.175146995703113,"selected":false,"parentId":"Ground"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640966676,"cy":-0.015945367160926777,"cz":0.5000000074506872,"lx":15.744,"ly":13.888,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.15,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tc8JHQj7hE233H7YfXfbjR","selected":false,"drawSunBeam":false,"label":"Block","dailyYield":103.86651140858137},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0001687190273044117,"cy":-0.1827633083380377,"cz":0.5000000074505806,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"snQKvKf7xPrhuT28Bo2tYv","selected":false,"dailyYield":17.598295752357192,"label":"Row 2"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0005055611729018629,"cy":0.005909338720999285,"cz":0.5000000074506161,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"s6gwZqoX59Afjq9iWzuivT","selected":false,"drawSunBeam":false,"dailyYield":17.598295752357192,"label":"Row 3"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0008424033184993142,"cy":0.19458198578003624,"cz":0.5000000074506517,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pbozwPgQw2bzssDtJKTqSk","selected":false,"dailyYield":17.598295752357192,"label":"Row 4"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0001681231182930395,"cy":-0.37143595539707464,"cz":0.5000000074505451,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"3nSBw847J9tSxs8CwWughr","selected":false,"label":"Row 1","dailyYield":20.418384465308375},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640967653,"cy":0.38325463283907324,"cz":0.5000000074506872,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pu9LeYFSmjuxaejn2VSzZ1","selected":false,"dailyYield":17.598295752357192,"label":"Row 5"},{"type":"Foundation","cx":9.631391045182012,"cy":-0.034724141127635555,"cz":0.05,"lx":18.175146995703113,"ly":15,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7nkGUQpHaM9zN22MJgfSvf","selected":false},{"type":"Human","name":"Jack","cx":-0.1594284211117477,"cy":-6.960741063855943,"cz":-1.7763568394002505e-15,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"d3bJG1MfPQqauwCeM9B8UL","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#16cda5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":true,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[23.00808622059582,-24.680171647342778,15.7199588387956],"panCenter":[15.700578278283736,2.441435258509561,0.07017002569005788],"orthographic":false,"enableRotate":true,"cameraZoom":27.207482839996143,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"solarRadiationHeatMapMaxValue":4.5,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-1,"y":2,"width":200,"height":60}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Tilt or not tilt?"]}')},488:function(e){e.exports=JSON.parse('{"docid":"pbUQyfMqdFM4hGmWGdjXR3","time":"05/21/2023 08:16 pm","timestamp":1684714615826,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":1,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"6/22/2022, 12:00:00\u202fPM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Approximate","daysPerYear":4},"elements":[{"type":"Cuboid","cx":-0.09073244329620422,"cy":-0.08928113742371785,"cz":3,"lx":59.802153799265035,"ly":54.767587001262534,"lz":6,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"parentId":"Ground","selected":false,"id":"pLxvVJ1wH71Yw1QXZXh7Cg"},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"vertices":[{"x":-0.25918798931603854,"y":-0.3104025744206716},{"x":-0.1504962518609256,"y":0},{"x":-0.35951882388998896,"y":0.16433077469329674},{"x":-0.09002353591652279,"y":0.166501344234237},{"x":0,"y":0.4564743741480465},{"x":0.09196993169278787,"y":0.16433077469329674},{"x":0.37624062965231403,"y":0.16433077469329674},{"x":0.15885715474208814,"y":0},{"x":0.25918798931603854,"y":-0.31953206190363254},{"x":0,"y":-0.11868333727849208}],"parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","selected":false,"filled":true,"selectedIndex":6,"id":"rUADzqR9VSPATNniVsn3qE","opacity":0.5},{"type":"Human","name":"Jack","cx":-21.334148117714555,"cy":-20.123968320321495,"cz":3.0000000000000004,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,-0.7853981633974483],"parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"5uAL6fK1eTHonYN5seNqZq","selected":false},{"type":"Human","name":"Jacqueline","cx":23.344921829148568,"cy":-18.543851714098956,"cz":2.9999999999999964,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,-0.7853981633974483],"parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"2Xajuxftni9JrMcjA5JcTZ","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.24400225350210067,"cy":-0.2973806270625913,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"dwDAEsrLknWSJ6wmG84FDe","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.2340673494452827,"cy":-0.2824067173672925,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"rJPYR1ViscGwEao14Ahz8L","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.22413244538846475,"cy":-0.2674328076719938,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"2bryRDHBS2YZ4nXPVH27oM","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.21419754133164678,"cy":-0.25245889797669496,"cz":0.5,"lx":2.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"oKVf1WANEaHoC28aczNAmB","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.2042626372748288,"cy":-0.23748498828139625,"cz":0.5,"lx":2.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"tBCicEZU2wG49eu4i6Kwm3","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.19432773321801083,"cy":-0.22251107858609742,"cz":0.5,"lx":3.5999999999999996,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"evdaFcgrk6M4JJMyu3ZzMq","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.18439282916119284,"cy":-0.2075371688907986,"cz":0.5,"lx":3.5999999999999996,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"1sWb4XgrTSe79TQULsTE5S","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.17445792510437497,"cy":-0.1925632591954998,"cz":0.5,"lx":4.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"mZffYSWU7S8PgHaRpYZeEL","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.16452302104755695,"cy":-0.17758934950020103,"cz":0.5,"lx":4.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"n5a72Z8AZCjsHvJEWEfhFF","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.15458811699073896,"cy":-0.1626154398049022,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"mEyfc6dJNr8NgLtwNYnoHX","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.14465321293392097,"cy":-0.14764153010960349,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"wj2fWqRxszA5Gvokpup7wQ","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.13471830887710307,"cy":-0.13266762041430463,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"bgNCkPikGZjCttLzS6w1Ei","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.12478340482028506,"cy":-0.11769371071900586,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"pzZaWBzWNUPmQr5UmuU4EJ","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.1148485007634671,"cy":-0.1027198010237071,"cz":0.5,"lx":8.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"nvJ2MYXHoiz17urRs5MsVm","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.3462544047278434,"cy":0.14995832880911858,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"dsTi2gBy3qMzkxSzEKBUKt","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.10491359670664915,"cy":-0.08774589132840831,"cz":0.5,"lx":9.6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"1zkzwAySbr3kh67TymqSoa","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.29600197017289004,"cy":0.12090847752330136,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"nNXDQxgbGxZh1trPJqCUdP","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.09497869264983118,"cy":-0.07277198163310952,"cz":0.5,"lx":9.6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"fjd8Qa2TAYrApMxCXDFDpf","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.2457495356179366,"cy":0.0918586262374842,"cz":0.5,"lx":10.799999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"b9qhzTZxDNwEDcF7hiJX4C","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.151763002830166,"cy":0.015054374730769834,"cz":0.5,"lx":21.599999999999998,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"2UFe7VNPDEaGQZvkWVQhfF","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.1330229162480746,"cy":0.020413676435490843,"cz":0.5,"lx":20.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"6azY5mJr9WGW9T4xntRtbV","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.09816732549621686,"cy":0.008176039664707214,"cz":0.5,"lx":24,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"7pB4XFf5JNuyyXs1dscyU9","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.04968850627849703,"cy":-0.01893715486872221,"cz":0.5,"lx":27.599999999999998,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"cw2cYF33vM7nDrUtAQ9PtX","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.0012096870607772334,"cy":-0.0460503494021516,"cz":0.5,"lx":32.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"aZJH3WRjsEN8q1US8B1Lga","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.041725175322164326,"cy":-0.06710995316331908,"cz":0.5,"lx":34.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"viJ9kyaeaMt713J28EcCFK","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.046229595226249795,"cy":-0.046206356470879194,"cz":0.5,"lx":31.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"tyYYXFH1cfiQ3uNpmQwaDs","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.050734015130335264,"cy":-0.02530275977843931,"cz":0.5,"lx":27.599999999999998,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"vP1hAunDAXzhYB1S1HLKVM","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.05523843503442073,"cy":-0.004399163085999424,"cz":0.5,"lx":25.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"u6QjEgQS4SovsxfWiwK9pS","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.05234611465739277,"cy":0.024581126850095093,"cz":0.5,"lx":22.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"46FxqZ3kp4K5aLnSHofoke","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04805120265582289,"cy":0.05509294308926524,"cz":0.5,"lx":21.599999999999998,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"4KWK7RGJeM7J1Y4Bc2BCbo","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04375629065425305,"cy":0.08560475932843534,"cz":0.5,"lx":19.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"9NexZBuAyQshnZjEyJiXpM","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.039461378652683204,"cy":0.11611657556760548,"cz":0.5,"lx":18,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"aQJdFu6WBGKc9yho8AS2xT","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.04924988203531412,"cy":0.13125034396973115,"cz":0.5,"lx":18,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"3ogeckCTPTgxjp41JDKuuA","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.05914913042917638,"cy":0.1462631870114971,"cz":0.5,"lx":18,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"m5ZqKSj8PiDLKTSkryPkD4","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.06904837882303859,"cy":0.1612760300532631,"cz":0.5,"lx":19.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"gUD4622TjboopEheHWCtM8","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.14637364805016384,"cy":0.10266464590659576,"cz":0.5,"lx":8.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"3B4tjopc3V8wB73wfk3LgA","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.020601276304081376,"cy":0.23999877236143063,"cz":0.5,"lx":10.799999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"j6oGKhKWfa4g28v4pveBRC","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.16516009271515278,"cy":0.10797332801394043,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"6uMytuxgTByw7WEXjAsAXU","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.017562115186903173,"cy":0.2691394015238318,"cz":0.5,"lx":8.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"2FJtQtosDkuXdtp7KmRoYy","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.18394653738014172,"cy":0.11328201012128505,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"3pFwSbqooyxHrq2Jp4XADp","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.014522954069724847,"cy":0.298280030686233,"cz":0.5,"lx":7.199999999999999,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"5qdmnpcKFqUM9vXyTX4hi7","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.20273298204513066,"cy":0.11859069222862975,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"tJg3jzMUi1ApjHbbN193Zz","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.011483792952546625,"cy":0.3274206598486342,"cz":0.5,"lx":6,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"xxk4Md1mJ7NHchtu4BLpwH","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.2215194267101196,"cy":0.12389937433597444,"cz":0.5,"lx":4.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"7NmhiBzuipraDWa3kyetyj","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.008444631835368357,"cy":0.35656128901103534,"cz":0.5,"lx":3.5999999999999996,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"f8qSHhvV7wP4nEzfo6VoDk","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.24030587137510853,"cy":0.12920805644331906,"cz":0.5,"lx":4.8,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"posdSQ1dJvWZjSpgrNhZeK","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.005405470718190015,"cy":0.3857019181734367,"cz":0.5,"lx":2.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"9riXPgRDkjJzGVegGVgCgw","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.25909231604009747,"cy":0.13451673855066373,"cz":0.5,"lx":3.5999999999999996,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"cHZAxZtQFw1z3WZs51Lb8y","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.0023663096010117777,"cy":0.41484254733583786,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"oe7DbmdHbpatHjToisk5xv","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.2778787607050864,"cy":0.1398254206580084,"cz":0.5,"lx":2.4,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"wWLocRGwnWkKFGd13Lw2xH","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":0.0006728515161664303,"cy":0.443983176498239,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"pLYCjrgQcBLecG9n2GBB5R","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.2966652053700753,"cy":0.14513410276535307,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"5cGW4T9ojh23VUkpq6dRc7","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3154516500350642,"cy":0.15044278487269772,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"uZGNbTxhF7wMM1ExYuxSCK","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false},{"type":"Solar Panel","pvModelName":"FS-275","trackerType":"None","relativeAzimuth":0.7853981633974483,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.3,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3342380947000532,"cy":0.15575146698004247,"cz":0.5,"lx":1.2,"ly":0.6,"lz":0.0068,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"color":"#fff","frameColor":"white","parentType":"Cuboid","parentId":"pLxvVJ1wH71Yw1QXZXh7Cg","foundationId":"pLxvVJ1wH71Yw1QXZXh7Cg","id":"hpaMNd5tiDGWpzg7eQxhTm","referenceId":"rUADzqR9VSPATNniVsn3qE","selected":false}],"sceneRadius":37,"view":{"yearlyPvYieldPanelX":-1278,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":47,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[43.034934411209356,-77.43728686826599,60.87535152181681],"panCenter":[7.125444398078178,-5.749142987156418,0.5356497726578432],"orthographic":false,"enableRotate":true,"cameraZoom":13.268408625781248,"showInstructionPanel":false,"cameraPosition2D":[5.843642120827252,1.7570601735865479,150],"panCenter2D":[5.843642120827252,1.75721018025187,0.0000026494911975471404],"showEvolutionPanel":false,"solarRadiationHeatMapMaxValue":3.5,"evolutionPanelX":-3,"evolutionPanelY":5,"showEconomicsPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":520,"height":318},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":-1,"y":4,"width":378,"height":114},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"solarPanelShininess":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":2,"solarPanelArrayLayoutParams":{"pvModelName":"FS-275","rowAxis":"East-West","orientation":"Landscape","tiltAngle":0.5235987755982988,"rowsPerRack":1,"interRowSpacing":1,"poleHeight":0.3,"poleSpacing":3,"margin":0.2},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Draw a polygon for the solar panel field and\\nthen use the built-in parametric design tool to \\nautomatically layout the array."]}')},489:function(e){e.exports=JSON.parse('{"docid":"6VEXdSdGFhXnQZHfdXvgS7","time":"02/02/2023 05:25 pm","timestamp":1675376741403,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"timesPerHour":20,"address":"Natick, MA","name":"default","longitude":-71.3488548,"latitude":42.2844063,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"date":"9/22/2022 12:00:00 PM","orthographic":false,"cameraZoom":43.16939043526371,"solarRadiationHeatmapGridCellSize":0.5,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"lz":0.1,"rotation":[0,0,0],"normal":[0,0,1],"cy":0.01492842170085762,"id":"iGgGyZAWhJDDrqTBSuKY6v","ly":8.502064537189229,"type":"Foundation","cx":-18.41116088158014,"selected":false,"cz":0.05,"lx":17.842360789303687,"parentId":"Ground"},{"tiltAngle":0.17453292519943295,"normal":[0,0,1],"rotation":[0,0,0],"lz":0.046,"poleSpacing":3,"selected":false,"cy":-0.18343704156525936,"drawSunBeam":false,"poleHeight":3,"lx":15.58,"relativeAzimuth":0,"trackerType":"None","cx":0.0181751573598281,"showLabel":true,"id":"u4LjNU3fd3PVZ6QAX6aug1","ly":3.138,"poleRadius":0.05,"label":"A1","orientation":"Landscape","cz":0.5000000074506161,"type":"Solar Panel","parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","pvModelName":"SPR-X21-335-BLK","dailyYield":35.54542639501863,"labelSize":1,"labelHeight":1},{"type":"Human","name":"Jack","cx":5.0617851423711855,"cy":-3.5130800185994246,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","id":"vDEckHeU6T8epe3YRNBYqh","selected":false,"ly":0.6},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.018913624924680107,"cy":0.17920253753513882,"cz":0.5000000074505806,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":-0.17453292519943295,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iGgGyZAWhJDDrqTBSuKY6v","foundationId":"iGgGyZAWhJDDrqTBSuKY6v","id":"bqrD5jMPaBdy2VU82Pf8jX","selected":false,"dailyYield":27.191418577368122,"drawSunBeam":true,"label":"A2","labelHeight":1,"labelSize":1},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.017803254641984647,"cy":-0.17133196101794607,"cz":0.5000000074506161,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sp1YZua8fLpGUcQPoeBUrY","foundationId":"sp1YZua8fLpGUcQPoeBUrY","id":"jY1SyCfNFUJ6aZrVBG9yei","selected":false,"dailyYield":31.69613876356361,"label":"B1","labelHeight":1,"labelSize":1},{"type":"Human","name":"Jade","cx":-2.04763165702893,"cy":0.5372372205223073,"cz":0.05000000074505717,"lx":0.6,"ly":0.6,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"sp1YZua8fLpGUcQPoeBUrY","id":"bh4ogCSa9KLpabxMXJSMdr","selected":false},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0178798068026682,"cy":0.19617148450633917,"cz":0.5000000074505806,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"sp1YZua8fLpGUcQPoeBUrY","foundationId":"sp1YZua8fLpGUcQPoeBUrY","id":"aB8nn17qEG1UkLCBmN3EDg","selected":false,"dailyYield":31.695989795928103,"label":"B2","labelHeight":1,"labelSize":1},{"type":"Foundation","cx":-0.02993684696192045,"cy":-0.07488211918489984,"cz":0.05,"lx":17.842360789303687,"ly":8.502064537189229,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"sp1YZua8fLpGUcQPoeBUrY","selected":false},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.017795422816082346,"cy":-0.17724133449748175,"cz":0.5000000074506161,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":-0.17453292519943295,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t8NKy5QyCsnVgJWSgzdVtp","foundationId":"t8NKy5QyCsnVgJWSgzdVtp","id":"w9uCiRPECzBHx6GziL9u7M","selected":false,"dailyYield":27.191412082396756,"label":"C1","labelHeight":1,"labelSize":1},{"type":"Human","name":"Jett","cx":1.2692636297118085,"cy":0.227513847491835,"cz":0.05000000074505717,"lx":0.6,"ly":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"t8NKy5QyCsnVgJWSgzdVtp","id":"icbuTBYKh2PiqbDEDzA6iB","selected":false},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","cx":0.0178798068026682,"cy":0.18617148450633916,"cz":0.5000000074505806,"lx":15.58,"ly":3.138,"lz":0.046,"trackerType":"None","tiltAngle":0.17453292519943295,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":3,"poleSpacing":3,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"t8NKy5QyCsnVgJWSgzdVtp","foundationId":"t8NKy5QyCsnVgJWSgzdVtp","id":"dFE6Wu3wf499uPuTFXoFR4","selected":false,"dailyYield":35.54528007836568,"label":"C2","labelHeight":1,"labelSize":1},{"type":"Foundation","cx":18.291413493732467,"cy":-0.04494527222298039,"cz":0.05,"lx":17.842360789303687,"ly":8.502064537189229,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"t8NKy5QyCsnVgJWSgzdVtp","selected":false}],"view":{"weatherPanelX":0,"heliodonPanelY":453,"showStickyNotePanel":true,"dailyPvYieldPanelX":4,"weatherPanelY":0,"dailyLightSensorPanelY":525,"mapZoom":16,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":-1244,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":true,"mapWeatherStations":false,"dailyPvYieldPanelY":1,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":-1277,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[21.984836349008607,-27.120112904171,15.351212623628198],"panCenter":[9.268096375789943,3.7277158588340003,2.046834497769918],"orthographic":false,"enableRotate":true,"cameraZoom":84.09478170866971,"stickyNotePanelX":5,"stickyNotePanelY":2,"cameraPosition2D":[15.041522569185233,0.23774787312868362,40.00000029048154],"panCenter2D":[15.041522569185233,0.23778787490665898,2.905048059856975e-7],"showSolarRadiationHeatmap":false,"showDesignInfoPanel":true,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":1,"y":3,"width":229,"height":64}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar canopy design"]}')},490:function(e){e.exports=JSON.parse('{"docid":"cpQtXDN91AWfQ7C3APvJh3","time":"02/03/2023 10:25 am","timestamp":1675437921671,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"airAttenuationCoefficient":0.01,"cspTimesPerHour":4,"timesPerHour":2,"solarPanelVisibilityGridCellSize":0.2,"latitude":44.454924,"noAnimationForSensorDataCollection":false,"noAnimationForSolarUpdraftTowerSimulation":false,"discretization":"Approximate","date":"6/22/2022 3:30:00 PM","highestTemperatureTimeInMinutes":900,"cspDaysPerYear":4,"address":"550 Dorset St, South Burlington, VT 05403, USA","diurnalTemperatureModel":1,"airConvectiveCoefficient":5,"cspGridCellSize":0.5,"noAnimationForSolarPanelSimulation":true,"sutGridCellSize":1,"name":"default","dustLoss":0.05,"sutDaysPerYear":4,"pvGridCellSize":0.5,"noAnimationForHeatmapSimulation":true,"sutTimesPerHour":4,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"daysPerYear":4,"solarRadiationHeatmapGridCellSize":5,"longitude":-73.177891},"elements":[{"type":"Foundation","cx":179.45847099490584,"cy":145.85951451290708,"cz":0.1,"lx":46.64912192730487,"ly":16.598079304638254,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0.1434660645139339],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"73zFNy4Kytq2jGeHP8hybB","locked":true,"enableGroupMaster":true},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.08726646259971647,"orientation":"Landscape","drawSunBeam":true,"poleHeight":4.8,"poleRadius":0.05,"poleSpacing":5,"cx":0.013487121407959702,"cy":-0.12279534594195182,"cz":0.5000000074505806,"lx":43.624,"ly":11.506,"lz":0.046,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0.1434660645139339],"color":"#fff","parentId":"73zFNy4Kytq2jGeHP8hybB","foundationId":"73zFNy4Kytq2jGeHP8hybB","id":"5B4Rr9X9rqJjgERVH84xem","selected":false,"locked":false},{"type":"Human","name":"Jack","cx":8.339907658116347,"cy":-0.6016935110092154,"cz":0.619724807975928,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"dUwnUoWvbFx2hdh7SmwvjQ","id":"e5UykxeUAcAAsmgFcznP9J","selected":false,"locked":false,"ly":0.42},{"type":"Human","name":"Jacqueline","cx":20.54897495598685,"cy":-8.016956409003306,"cz":0.10000000149011612,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"73zFNy4Kytq2jGeHP8hybB","id":"9v3zq1A3MmHnKeqiCTkYcc","selected":false,"locked":false,"ly":0.6},{"type":"Cuboid","cx":178.74973834889272,"cy":151.23959562318993,"cz":3,"lx":12.107420150412665,"ly":3.6361191766113197,"lz":6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","selected":false,"id":"stfeWojM9fq1rRFvV8kFrw","locked":true},{"type":"Cuboid","cx":179.70526882974113,"cy":148.87674866966486,"cz":1.8,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":3.6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"mvQonCDuxqjgZkeWBbRQ73","selected":false,"locked":true},{"type":"Cuboid","cx":179.86870093281857,"cy":147.67018638185647,"cz":1.5,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":3,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"nAoWaWCXnJrVeXtGcCdhsQ","selected":false,"locked":true},{"type":"Cuboid","cx":180.03030758101804,"cy":146.47434150650943,"cz":1.3,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":2.6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"hEEbCeJXouC5MRLwbMLUXU","selected":false,"locked":true},{"type":"Cuboid","cx":180.18731589126733,"cy":145.26767530633435,"cz":1.1,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":2.2,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"ewYiSC3NgUrSGS9bNScvyi","selected":false,"locked":true},{"type":"Cuboid","cx":180.34892253946674,"cy":144.0718304309881,"cz":0.9,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":1.8,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"dUwnUoWvbFx2hdh7SmwvjQ","selected":false,"locked":true},{"type":"Cuboid","cx":180.505930849716,"cy":142.93138721769165,"cz":0.7,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":1.4,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"2wek6yYK17CpmBuG1P6f8D","selected":false,"locked":true},{"type":"Cuboid","cx":180.6629391599653,"cy":141.79094400439524,"cz":0.5,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"cyVdcaHRiaSZbNdcjQVuiw","selected":false,"locked":false},{"type":"Cuboid","cx":180.8270823782518,"cy":140.57464564227953,"cz":0.3,"lx":42.703465320212665,"ly":1.2033870245364555,"lz":0.6,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.1434557633128617],"parentId":"Ground","id":"2io4wkR5VXLTD2R8fop411","selected":false,"locked":false}],"view":{"showYearlyFresnelReflectorYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"showZenithAngle":true,"yearlyPvYieldPanelRect":{"x":0,"height":400,"y":0,"width":600},"showAzimuthAngle":true,"dailyPvYieldPanelRect":{"height":400,"y":0,"x":0,"width":600},"dailyUpdraftTowerYieldPanelRect":{"width":640,"x":0,"y":0,"height":550},"diurnalTemperaturePanelRect":{"width":600,"height":400,"y":0,"x":0},"showHeliodonPanel":false,"weatherPanelX":0,"theme":"Default","enableRotate":true,"dailyFresnelReflectorYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"dailyHeliostatYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"dailyHeliostatYieldPanelY":0,"yearlyHeliostatYieldPanelRect":{"y":0,"width":600,"height":400,"x":0},"yearlyLightSensorPanelRect":{"x":0,"width":600,"y":0,"height":500},"yearlyParabolicTroughYieldPanelRect":{"height":400,"y":0,"width":600,"x":0},"dailyParabolicDishYieldPanelX":0,"ambientLightIntensity":0.1,"dailyParabolicTroughYieldPanelRect":{"width":600,"y":0,"x":0,"height":400},"yearlyLightSensorPanelShowClearness":false,"mapPanelX":0,"yearlyLightSensorPanelShowDaylight":false,"showDiurnalTemperaturePanel":false,"mapZoom":17,"yearlyPvYieldPanelX":0,"showElevationAngle":true,"showYearlyParabolicDishYieldPanel":false,"dailyLightSensorPanelRect":{"y":0,"height":360,"x":0,"width":600},"evolutionPanelRect":{"y":0,"height":400,"x":0,"width":640},"mapWeatherStations":false,"showDesignInfoPanel":true,"mapPanelY":0,"showDailyParabolicTroughYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"weatherPanelY":0,"showSiteInfoPanel":true,"showYearlyParabolicTroughYieldPanel":false,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelRect":{"width":600,"x":0,"height":400,"y":0},"showMapPanel":false,"dailyParabolicTroughYieldPanelY":0,"cameraPosition":[206.67769816695932,120.15082999798835,5.121281605668084],"showYearlyLightSensorPanel":false,"cameraZoom":23.327015599941678,"heliodonPanelY":0,"autoRotate":false,"shadowEnabled":true,"showWeatherPanel":false,"yearlyFresnelReflectorYieldPanelX":0,"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"height":400,"width":600},"dailyFresnelReflectorYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyHeliostatYieldPanelY":0,"mapTilt":0,"visibilityResultsPanelRect":{"height":470,"y":0,"width":600,"x":0},"stickyNotePanelRect":{"y":0,"x":0,"height":61,"width":267},"visibilityResultsPanelX":0,"showYearlyUpdraftTowerYieldPanel":false,"showDailyLightSensorPanel":false,"yearlyPvYieldPanelY":0,"dailyLightSensorPanelX":0,"yearlyParabolicTroughYieldPanelX":0,"weatherPanelRect":{"y":0,"height":500,"width":500,"x":0},"panCenter2D":[183.8188163621815,139.3629304846877,-0.00008002863814434504],"dailyParabolicTroughYieldPanelX":0,"showDailyUpdraftTowerYieldPanel":false,"cameraPosition2D":[183.8188163621815,139.36291048379871,19.999919971295522],"showYearlyHeliostatYieldPanel":false,"showEconomicsPanel":false,"heliodonPanelX":0,"yearlyParabolicDishYieldPanelY":0,"showDailyParabolicDishYieldPanel":false,"dailyPvYieldPanelX":0,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelRect":{"x":0,"width":600,"y":0,"height":400},"orthographic":false,"panCenter":[175.21189117230256,159.9366389436321,1.5458921274125108],"dailyPvYieldPanelY":0,"showDailyFresnelReflectorYieldPanel":false,"mapType":"hybrid","groundImage":false,"groundColor":"#16a5a5","showDailyHeliostatYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyFresnelReflectorYieldPanelRect":{"x":0,"width":600,"height":400,"y":0},"showStickyNotePanel":true,"heliodon":false,"dailyLightSensorPanelY":0,"solarRadiationHeatMapReflectionOnly":false,"showEvolutionPanel":false,"showInstructionPanel":false,"showSunAngles":false,"showYearlyPvYieldPanel":false,"dailyHeliostatYieldPanelRect":{"height":400,"x":0,"y":0,"width":600},"yearlyLightSensorPanelX":0,"yearlyFresnelReflectorYieldPanelY":0,"yearlyHeliostatYieldPanelX":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyFresnelReflectorYieldPanelX":0,"axes":false,"visibilityResultsPanelY":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"orientation":"Landscape","interRowSpacing":2,"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","poleSpacing":3,"rowsPerRack":1,"tiltAngle":0,"poleHeight":1},"solarPanelArrayLayoutConstraints":{"maximumTiltAngle":1.5707963267948966,"rowAxis":"Zonal","maximumInterRowSpacing":10,"maximumRowsPerRack":6,"minimumInterRowSpacing":2,"pvModelName":"CS6X-355P-FG","minimumTiltAngle":-1.5707963267948966,"orientation":"Landscape","minimumRowsPerRack":1,"poleSpacing":5,"poleHeight":1},"evolutionaryAlgorithmState":{"particleSwarmOptimizationParams":{"objectiveFunctionType":1,"socialCoefficient":0.1,"localSearchRadius":0.1,"vmax":0.01,"swarmSize":20,"problem":"Solar Panel Tilt Angle","maximumSteps":5,"inertia":0.8,"cognitiveCoefficient":0.1,"searchMethod":1,"convergenceThreshold":0.01},"geneticAlgorithmParams":{"maximumGenerations":5,"mutationRate":0.1,"objectiveFunctionType":1,"selectionRate":0.5,"crossoverRate":0.5,"localSearchRadius":0.1,"searchMethod":1,"problem":"Solar Panel Tilt Angle","selectionMethod":1,"populationSize":20,"convergenceThreshold":0.01}},"economicsParams":{"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15,"projectLifeSpan":25},"notes":["Solar canopy over bleachers"]}')},491:function(e){e.exports=JSON.parse('{"docid":"smhvUEBkVkGKNFKH9wXerr","time":"03/19/2023 01:40 pm","timestamp":1679247607363,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"4/22/2022 2:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":4,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548},"elements":[{"ly":3.258836461194841,"solarUpdraftTower":{},"parentId":"Ground","cx":-0.0628073590395834,"id":"m7AH7DcnoGzAq9kryBy4RS","cy":1.7678944590969095,"type":"Foundation","solarPowerTower":{},"lx":10.54713578879197,"lz":0.05733001510678199,"solarAbsorberPipe":{},"normal":[0,0,1],"selected":false,"rotation":[0,0,0],"cz":0.05,"textureType":"Foundation Texture #2"},{"id":"2u4Fe7xnA6kkXXVGrQ4eyJ","selected":false,"cz":2.2408122612280286,"lx":6.322909236616773,"relativeAngle":3.141592653589793,"lz":2.707750558185909,"roofId":"o9MiaiNtVRQTUvRdiEBPKe","ly":0.1,"rightPoint":[-3.281902734041268,1.0926779224456118,0],"leftJoints":["8XDG3EHsQoX26MhuzwMYUM"],"rotation":[0,0,0],"textureType":"Wall Texture Default","leftPoint":[3.041006502575506,1.0926779224456111,0],"type":"Wall","rightRoofHeight":2.707750558185909,"normal":[0,0,1],"parentId":"m7AH7DcnoGzAq9kryBy4RS","leftRoofHeight":2.707750558185909,"showLabel":false,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","cx":-0.12044811573288094,"windows":[],"rightJoints":["skm8dNPSkFaVkoUwiPNfq1"],"cy":1.0926779224456116,"color":"#ffffff","opacity":0.25,"wallStructure":"Stud","studSpacing":20,"studColor":"#ffffff","studWidth":0.2,"structureSpacing":2.1,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.707750558185909,"rightTopPartialHeight":2.707750558185909},{"type":"Wall","windows":[],"parentId":"m7AH7DcnoGzAq9kryBy4RS","cx":3.041006502575505,"leftPoint":[3.041006502575504,-0.9667719612095651,0],"cy":0.06295298061802335,"leftRoofHeight":2.2932006042712794,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"rightPoint":[3.041006502575506,1.0926779224456118,0],"ly":0.1,"id":"8XDG3EHsQoX26MhuzwMYUM","showLabel":false,"lx":2.059449883655177,"normal":[0,0,1],"lz":2.2932006042712794,"leftJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"cz":2.2301039869226305,"rotation":[0,0,0],"rightJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"relativeAngle":1.5707963267948957,"textureType":"Wall Texture Default","rightRoofHeight":2.707750558185909,"roofId":"o9MiaiNtVRQTUvRdiEBPKe","color":"#ffffff","opacity":0.25,"wallStructure":"Stud","studSpacing":100,"studColor":"#ffffff","centerRoofHeight":[0.5,2.707750558185909],"studWidth":0.2,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.2932006042712794,"rightTopPartialHeight":2.2932006042712794},{"lx":2.059449883655177,"windows":[],"lz":2.2932006042712794,"id":"skm8dNPSkFaVkoUwiPNfq1","roofId":"o9MiaiNtVRQTUvRdiEBPKe","selected":false,"cy":0.06295298061802335,"cz":2.228839888904333,"showLabel":false,"leftJoints":["2u4Fe7xnA6kkXXVGrQ4eyJ"],"rightPoint":[-3.281902734041268,-0.9667719612095651,0],"normal":[0,0,1],"rotation":[0,0,0],"textureType":"Wall Texture Default","rightRoofHeight":2.2932006042712794,"parentId":"m7AH7DcnoGzAq9kryBy4RS","relativeAngle":-1.5707963267948966,"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftPoint":[-3.281902734041268,1.0926779224456118,0],"rightJoints":["cV8MyCuhWAsvEyyFuVqVqg"],"type":"Wall","leftRoofHeight":2.707750558185909,"ly":0.1,"cx":-3.281902734041268,"color":"#ffffff","opacity":0.25,"wallStructure":"Stud","studSpacing":100,"studColor":"#ffffff","centerRoofHeight":[-0.5,2.707750558185909],"studWidth":0.2,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.2932006042712794,"rightTopPartialHeight":2.2932006042712794},{"showLabel":false,"cx":-0.12044811573288094,"parentId":"m7AH7DcnoGzAq9kryBy4RS","rightPoint":[3.041006502575506,-0.9667719612095651,0],"cz":2.268765007024547,"textureType":"Wall Texture Default","cy":-0.9667719612095651,"id":"cV8MyCuhWAsvEyyFuVqVqg","windows":[],"foundationId":"m7AH7DcnoGzAq9kryBy4RS","leftJoints":["skm8dNPSkFaVkoUwiPNfq1"],"rightJoints":["8XDG3EHsQoX26MhuzwMYUM"],"selected":false,"type":"Wall","roofId":"o9MiaiNtVRQTUvRdiEBPKe","leftPoint":[-3.281902734041268,-0.9667719612095651,0],"normal":[0,0,1],"ly":0.1,"lz":2.2932006042712794,"leftRoofHeight":2.2932006042712794,"relativeAngle":0,"rotation":[0,0,0],"rightRoofHeight":2.2932006042712794,"lx":6.322909236616773,"color":"#ffffff","wallStructure":"Stud","opacity":0,"studSpacing":100,"studColor":"#ffffff","studWidth":0.2,"structureSpacing":2.1,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.2932006042712794,"rightTopPartialHeight":2.2932006042712794},{"type":"Human","name":"Judd","cx":1.633148784510131,"cy":-0.48619735894130045,"cz":0.02866500802338123,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.544},{"type":"Human","name":"Jade","cx":-2.4056687191409836,"cy":-0.7214806671440712,"cz":0.02866500802338123,"lx":0.48,"ly":0.48,"lz":1.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"rzeLyCpDSHwygv1oZdbv2w","selected":false,"flip":true},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.05,"roofType":"Gable","roofStructure":"Rafter","wallsId":["cV8MyCuhWAsvEyyFuVqVqg"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"o9MiaiNtVRQTUvRdiEBPKe","ridgeLeftPoint":[-0.5,1],"ridgeRightPoint":[0.5,1],"rise":0,"ceiling":false},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":true,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.013581557939684385,"cy":0.026013281736561093,"cz":2.5548677739939563,"lx":6.232,"ly":2.092,"lz":0.046,"showLabel":false,"normal":[0,-0.19733348260296196,0.9803364201353465],"rotation":[0.1986371700239986,0,0],"color":"#fff","parentType":"Roof","parentId":"o9MiaiNtVRQTUvRdiEBPKe","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"gcgsZpEBMDbC2MoxXfdQ5z","selected":false},{"type":"Tree","name":"Dogwood","cx":-6.069538614907841,"cy":1.7342109688811949,"cz":0,"lx":2.576376919790349,"lz":3.4569079447673756,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"9vtidDnwwZ7MMSCF9kkf1v","selected":false},{"type":"Tree","name":"Magnolia","cx":6.029325159381688,"cy":1.1288413497919034,"cz":0,"lx":5.866636356742361,"lz":7.0242541599963335,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"7y5foXVbpe2pYJ2ZMcNgG1","selected":false},{"type":"Polygon","cx":-0.054330031344316826,"cy":-0.27967892470948996,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.29711331243712213,"y":-0.37645814056822685},{"x":-0.25433003134431686,"y":-0.17645814056822684},{"x":0.14566996865568319,"y":-0.17645814056822684},{"x":0.18845324974848848,"y":-0.37645814056822685}],"parentId":"skm8dNPSkFaVkoUwiPNfq1","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","selected":false,"filled":true,"selectedIndex":3,"id":"jFtAKqea5hrJYqvHqsXVig","fontColor":"white","text":"ELM STREET","fontSize":0.2,"noOutline":true,"opacity":0},{"type":"Polygon","cx":-0.03159943058059205,"cy":-5.551115123125783e-16,"cz":0.3151039010139313,"lx":0.4,"ly":0.4,"lz":0.4,"filled":true,"noOutline":true,"color":"#ffffff","opacity":0,"text":"ELM STREET","fontSize":0.2,"fontColor":"white","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.19999999999999996,"y":-0.4200653155418168},{"x":-0.15721671890719469,"y":-0.2200653155418168},{"x":0.24278328109280536,"y":-0.2200653155418168},{"x":0.28556656218561066,"y":-0.4200653155418168}],"parentId":"8XDG3EHsQoX26MhuzwMYUM","parentType":"Wall","foundationId":"m7AH7DcnoGzAq9kryBy4RS","id":"jgt48M3TDZL99Yra6Kyr5Q","selected":false},{"type":"Human","name":"Julio","cx":0.5178196751817774,"cy":-0.5447731101746882,"cz":0.02866500802338123,"lx":0.5,"lz":1.76,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"q3FndYLdQ24MSDvkeE4ifM","selected":false},{"type":"Human","name":"June","cx":-1.7835969899126987,"cy":-1.0262736798633494,"cz":0.0073300155767722225,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"m7AH7DcnoGzAq9kryBy4RS","id":"hpYMNr3jwLZFDdiKVSnVAY","selected":false}],"sceneRadius":11,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.000020000888987681265,19.999999999989587],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-7.4101525299496,-7.1680457550968235,2.8167371698815544],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":25.847108697996333,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[-0.2469393365439706,2.7582746226325283,1.9240094094942006],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":false,"solarRadiationHeatMapMaxValue":5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"stickyNotePanelRect":{"x":0,"y":0,"width":207,"height":64}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Solar bus stop"]}')},492:function(e){e.exports=JSON.parse('{"docid":"ctNBPhic6sxKfpMZwUSyvY","time":"02/04/2023 01:23 pm","timestamp":1675535030470,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"noAnimationForSolarPanelSimulation":false,"latitude":42.2844063,"cspTimesPerHour":4,"timesPerHour":4,"noAnimationForSensorDataCollection":false,"noAnimationForSolarUpdraftTowerSimulation":false,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"sutGridCellSize":1,"longitude":-71.3488548,"airConvectiveCoefficient":5,"name":"default","highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"diurnalTemperatureModel":1,"discretization":"Approximate","address":"Natick, MA","noAnimationForHeatmapSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspDaysPerYear":4,"pvGridCellSize":0.5,"airAttenuationCoefficient":0.01,"sutDaysPerYear":4,"date":"4/22/2022, 9:00:00 AM","cspGridCellSize":0.5,"dustLoss":0.05,"daysPerYear":12},"elements":[{"type":"Foundation","cx":-0.05000000000000249,"cy":-0.07499999999999751,"cz":0.05,"lx":50,"ly":25,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9VUxbWr6Hk1HaeGiLpEeqj","locked":true},{"type":"Wall","cx":0.25,"cy":10.000000000000002,"cz":0,"lx":43.5,"ly":0.3,"lz":30,"relativeAngle":3.141592653589793,"leftPoint":[22,10,0],"rightPoint":[-21.5,10.000000000000004,0],"leftJoints":["vdPkX7ZYSwK7VW7fzaG511"],"rightJoints":["1pJb5b6kS2mjvFyYw2rr5k"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"nYSb3p1MnuhwNe2u1j3fXF","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":22,"cy":2,"cz":0,"lx":16,"ly":0.3,"lz":30,"relativeAngle":1.5707963267948966,"leftPoint":[22,-6,0],"rightPoint":[22,10,0],"leftJoints":["8ntQ5ns6192qHa3sbwWgfy"],"rightJoints":["nYSb3p1MnuhwNe2u1j3fXF"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"vdPkX7ZYSwK7VW7fzaG511","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-21.5,"cy":2.0000000000000018,"cz":0,"lx":16.000000000000004,"ly":0.3,"lz":30,"relativeAngle":4.71238898038469,"leftPoint":[-21.5,10.000000000000004,0],"rightPoint":[-21.5,-6,0],"leftJoints":["nYSb3p1MnuhwNe2u1j3fXF"],"rightJoints":["nQCZuQBzmXXaGGKFTeJE3m"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1pJb5b6kS2mjvFyYw2rr5k","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-13.25,"cy":-6,"cz":0,"lx":16.5,"ly":0.3,"lz":30,"relativeAngle":0,"leftPoint":[-21.5,-6,0],"rightPoint":[-5,-6,0],"leftJoints":["1pJb5b6kS2mjvFyYw2rr5k"],"rightJoints":["5ZR3fL2v4p4po3VR8oJ6H8"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"nQCZuQBzmXXaGGKFTeJE3m","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":13.5,"cy":-6,"cz":0,"lx":17,"ly":0.3,"lz":30,"relativeAngle":0,"leftPoint":[5,-6,0],"rightPoint":[22,-6,0],"leftJoints":["12rbxrGaa8wVVn4DUNhY7V"],"rightJoints":["vdPkX7ZYSwK7VW7fzaG511"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"8ntQ5ns6192qHa3sbwWgfy","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":5,"cy":-8.5,"cz":0,"lx":5,"ly":0.3,"lz":30,"relativeAngle":1.5707963267948966,"leftPoint":[5,-11,0],"rightPoint":[5,-6,0],"leftJoints":["4gHpGdkzTfd6pDbTqPc7xa"],"rightJoints":["8ntQ5ns6192qHa3sbwWgfy"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"12rbxrGaa8wVVn4DUNhY7V","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":-5,"cy":-8.5,"cz":0,"lx":5,"ly":0.3,"lz":30,"relativeAngle":4.71238898038469,"leftPoint":[-5,-6,0],"rightPoint":[-5,-11,0],"leftJoints":["nQCZuQBzmXXaGGKFTeJE3m"],"rightJoints":["4gHpGdkzTfd6pDbTqPc7xa"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"5ZR3fL2v4p4po3VR8oJ6H8","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Wall","cx":0,"cy":-11,"cz":0,"lx":10,"ly":0.3,"lz":30,"relativeAngle":0,"leftPoint":[-5,-11,0],"rightPoint":[5,-11,0],"leftJoints":["5ZR3fL2v4p4po3VR8oJ6H8"],"rightJoints":["12rbxrGaa8wVVn4DUNhY7V"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"4gHpGdkzTfd6pDbTqPc7xa","roofId":"a69gMcUNAL6smrEEJWVg5m","leftRoofHeight":30,"rightRoofHeight":30,"color":"white","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":30,"rightTopPartialHeight":30},{"type":"Human","name":"Jack","cx":-0.8543093326653608,"cy":-11.792939085977409,"cz":0.05000000074505806,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tYfANfn3oinAT4dW1rRsqr","selected":false,"ly":0.42},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["12rbxrGaa8wVVn4DUNhY7V","8ntQ5ns6192qHa3sbwWgfy","vdPkX7ZYSwK7VW7fzaG511","nYSb3p1MnuhwNe2u1j3fXF","1pJb5b6kS2mjvFyYw2rr5k","nQCZuQBzmXXaGGKFTeJE3m","5ZR3fL2v4p4po3VR8oJ6H8","4gHpGdkzTfd6pDbTqPc7xa"],"textureType":"No Roof Texture","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"a69gMcUNAL6smrEEJWVg5m","rise":0,"ceiling":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Portrait","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.3343030303030303,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"color":"#fff","parentType":"Wall","parentId":"nQCZuQBzmXXaGGKFTeJE3m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2tX22vCbk47e7Qb9jmWbuT","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.12024242424242425,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"nQCZuQBzmXXaGGKFTeJE3m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rMVZd7mHmDzSsY9qJkKCYE","selected":false,"color":"#fff"},{"type":"Window","cx":-0.10606060606060606,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1.5,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#999999","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nQCZuQBzmXXaGGKFTeJE3m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"5GSyALrLv2JTFn5Jfts2K9","mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3484848484848485,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"iCM8LCxtUc6mLFahJZKXiN","parentId":"nQCZuQBzmXXaGGKFTeJE3m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0016000000000000014,"cy":-2.3684757858670007e-14,"cz":0.056400000000000006,"lx":3.968,"ly":23.616,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"4gHpGdkzTfd6pDbTqPc7xa","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"qfUCcto9FYp97r1bwAkTYw","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.11858823529411765,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8ntQ5ns6192qHa3sbwWgfy","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"15b42ktZHToFGP5MjajP8M","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.352,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"trackerType":"None","tiltAngle":-0.01802584949990571,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8ntQ5ns6192qHa3sbwWgfy","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"3PJY1VV4LwZ339b6deeXfW","selected":false,"color":"#fff"},{"type":"Human","name":"Jane","cx":1.0059834215863663,"cy":-11.909754621259744,"cz":0.05000000074506161,"lx":0.4,"lz":1.67,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"vFaP6sE5CTWHTpkpuqQusz","selected":false,"ly":0.4},{"type":"Window","cx":0.1051693404634581,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bQX8o8NiMvqqkwFqX982ii","parentId":"8ntQ5ns6192qHa3sbwWgfy","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.36541889483065954,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"5iqB79CbMKKaHc2jYwiL2n","parentId":"8ntQ5ns6192qHa3sbwWgfy","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3757575757575758,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"h4kTQPqQyQnweHnqPDZiBg","parentId":"4gHpGdkzTfd6pDbTqPc7xa","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3742424242424242,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mDkZKRTvbZchzgdEwuowBS","parentId":"4gHpGdkzTfd6pDbTqPc7xa","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.33049242424242425,"cy":0.3,"cz":0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"vY3gwN3Dc3BUuPz4qtFxKd","parentId":"vdPkX7ZYSwK7VW7fzaG511","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.32575757575757575,"cy":0.3,"cz":0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"1c7fsYtocCSJ8re71u4EMD","parentId":"vdPkX7ZYSwK7VW7fzaG511","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.33049242424242414,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"bHLzi4Znc3fVju7nSQfVt1","parentId":"1pJb5b6kS2mjvFyYw2rr5k","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.32575757575757575,"cy":0.1,"cz":-0.008333333333333333,"lx":0.15151515151515152,"ly":0.3,"lz":0.9166666666666666,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"mXRwTS9CG5axkFHpYXQb93","parentId":"1pJb5b6kS2mjvFyYw2rr5k","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":0.44166666666666665,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"4jyHDksE16v8MGpAHgZbRq","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0035666924067298844,"cy":0.1,"cz":0.3543373547979109,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"fv633U9B6zqzsfkiTeArhy","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":0.2583333333333333,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"oqAP6n2W5ZjTRthjMYEkPV","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":0.1583333333333333,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"cpcc8c1vn5nWiukQ3PxS3f","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":0.058333333333333307,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"x1oydAUUHFagHckinEa19D","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":-0.0416666666666667,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"3cgMKo42a4ASQqE8xnVK2P","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":-0.1416666666666667,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"x8WkyGbyAMcWUhHRUjS5gG","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":-0.2416666666666667,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"tXGRiJPBepugeH5wctYQEF","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.005747126436781609,"cy":0.1,"cz":-0.3416666666666667,"lx":0.9310344827586207,"ly":0.3,"lz":0.05000000000000006,"mullionWidth":0.1,"mullionSpacing":1.5,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"id":"uHRUBQhmS94JcKPRt7LDmv","parentId":"nYSb3p1MnuhwNe2u1j3fXF","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#73D8FF","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullion":true,"opacity":0.5,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.08726646259971647,"orientation":"Landscape","drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.05,"poleSpacing":3,"cx":0.013173838940837719,"cy":0.0680060264405102,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"color":"#fff","parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gXW6QsEtteXYtodQNf8hx7","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.013587479651289406,"cy":-0.039519927704392936,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rR23iB2i6JynSXag96y23e","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.012423446703966497,"cy":-0.14139419142614063,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"jxhCthLZ9Lv87sCrBWn5kx","selected":false,"drawSunBeam":true},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.012712080197510935,"cy":0.1770912519450651,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rZk9AYLNUc6CbsxJg1HEUU","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.012483352791167981,"cy":0.28984082936278965,"cz":30.2,"lx":39.36,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":0.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"a69gMcUNAL6smrEEJWVg5m","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"69WEvUFeggtX7SkVeLfN3F","selected":false},{"type":"Flower","name":"Yellow Flower","cx":15.765812910070952,"cy":-8.771551347375933,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"hhZNor6RrsErCXv6N2LCBX","selected":false},{"type":"Flower","name":"Yellow Flower","cx":7.825357530488457,"cy":-8.372047787963048,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1coQpeKubKsF9M826JWhcT","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-7.686841949758485,"cy":-8.502083508685182,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tBw3D4GurLA8jWoFe411qW","selected":false},{"type":"Flower","name":"Yellow Flower","cx":-14.751204802860983,"cy":-8.343574225207504,"cz":0.05000000074505806,"lx":2,"lz":1.4,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"72uapoUNTci2SLYKwgBp8U","selected":false},{"type":"Flower","name":"Boxwood","cx":19.359037887762355,"cy":-9.111613117711592,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"vm54XJx4Xqji3E2uYkM3Bg","selected":false},{"type":"Flower","name":"Boxwood","cx":12.019561876673311,"cy":-8.832301300458631,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"sjqbn1oAGT3nUbPzFZ9yXN","selected":false},{"type":"Flower","name":"Boxwood","cx":-11.235438884150971,"cy":-8.639820120644501,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tQx6MounMWtZzmbZeEtcYq","selected":false},{"type":"Flower","name":"Boxwood","cx":-18.29029667468214,"cy":-7.990154726249322,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1CG9RbukrrdXudKgMY2Jii","selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.425,"lx":0.5,"ly":0,"lz":0.15,"textureType":"Door Texture #6","color":"white","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"4gHpGdkzTfd6pDbTqPc7xa","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"nJiiCKZsnQ4hdD69NEYwor","doorType":"Default","archHeight":1,"filled":true},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Portrait","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.0010000000000000007,"cy":0,"cz":-0.009199999999999993,"lx":3.968,"ly":27.552,"lz":0.046,"showLabel":false,"normal":[-1,1.2246467991473532e-16,0],"rotation":[0,0,0],"color":"#fff","frameColor":"white","parentType":"Wall","parentId":"1pJb5b6kS2mjvFyYw2rr5k","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"uLAs5uL6WLuiZStL3dsozJ","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0010000000000000009,"cy":2.373101715136272e-14,"cz":0.0074666666666666735,"lx":3.968,"ly":27.552,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[1,0,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"vdPkX7ZYSwK7VW7fzaG511","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"oq1GewTgCJGR8EGbL6DMu7","selected":false,"color":"#fff"}],"view":{"yearlyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"diurnalTemperaturePanelX":0,"showInstructionPanel":false,"axes":true,"enableRotate":true,"weatherPanelY":0,"cameraPosition":[-41.48638943484854,-53.785037218162735,15.500675823090146],"showYearlyUpdraftTowerYieldPanel":false,"showSunAngles":false,"dailyPvYieldPanelX":0,"dailyHeliostatYieldPanelY":0,"showDailyHeliostatYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"showDailyLightSensorPanel":false,"solarRadiationHeatMapReflectionOnly":false,"autoRotate":false,"showWeatherPanel":false,"yearlyParabolicDishYieldPanelX":0,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelX":0,"yearlyPvYieldPanelX":0,"mapType":"roadmap","visibilityResultsPanelX":0,"heliodonPanelY":0,"showYearlyParabolicTroughYieldPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"dailyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"mapPanelX":0,"orthographic":false,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelY":0,"showHeliodonPanel":false,"showDailyFresnelReflectorYieldPanel":false,"heliodon":false,"showMapPanel":false,"shadowEnabled":true,"dailyFresnelReflectorYieldPanelY":0,"showYearlyFresnelReflectorYieldPanel":false,"weatherPanelX":0,"yearlyHeliostatYieldPanelX":0,"dailyLightSensorPanelY":0,"showDiurnalTemperaturePanel":false,"showDailyUpdraftTowerYieldPanel":false,"mapPanelY":0,"dailyPvYieldPanelY":0,"showStickyNotePanel":true,"yearlyUpdraftTowerYieldPanelX":0,"yearlyFresnelReflectorYieldPanelX":0,"groundColor":"#16A5A5","dailyHeliostatYieldPanelX":0,"stickyNotePanelX":0,"dailyUpdraftTowerYieldPanelY":0,"showElevationAngle":true,"yearlyFresnelReflectorYieldPanelY":0,"showYearlyHeliostatYieldPanel":false,"mapZoom":18,"panCenter":[1.9046368072380662,-2.718943908236788,15.500675823090146],"visibilityResultsPanelY":0,"showZenithAngle":true,"stickyNotePanelY":0,"showDesignInfoPanel":true,"yearlyPvYieldPanelY":0,"dailyUpdraftTowerYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"showYearlyLightSensorPanel":false,"heliodonPanelX":0,"theme":"Default","yearlyLightSensorPanelShowDaylight":false,"groundImage":false,"showAzimuthAngle":true,"ambientLightIntensity":0.1,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"showDailyParabolicDishYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"solarRadiationHeatMapMaxValue":3.5,"showYearlyPvYieldPanel":false,"yearlyLightSensorPanelShowClearness":false,"showSolarPanelVisibilityResultsPanel":false,"diurnalTemperaturePanelY":0,"yearlyHeliostatYieldPanelY":0,"cameraZoom":31.733468832186784,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"cameraPosition2D":[0,-0.00015000666739695134,150],"yearlyLightSensorPanelX":0,"showDailyParabolicTroughYieldPanel":false,"waterSurface":false,"showEconomicsPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-3,"y":-2,"width":339,"height":63},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Building-integrated photovoltaics (BIPV)"]}')},493:function(e){e.exports=JSON.parse('{"docid":"m1j5HqK6ztTDmHotnswvhm","time":"03/19/2023 01:23 pm","timestamp":1679246616189,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":2,"date":"6/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":true,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"350 Spelman Ln SW, Atlanta, GA 30314, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":33.74249063340524,"noAnimationForSensorDataCollection":false,"timesPerHour":2,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":true,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-84.41325446099088,"airConvectiveCoefficient":5,"diurnalTemperatureModel":1,"highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"sutDaysPerYear":4,"sutGridCellSize":1,"noAnimationForSolarUpdraftTowerSimulation":false},"elements":[{"type":"Foundation","cx":-4.899281040587393,"cy":-11.584454395492607,"cz":0.05,"lx":65.19262557107372,"ly":131.69230495241158,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.530395639672967],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fAfbfM7oEHfq1VBgchFech","enableGroupMaster":true},{"type":"Wall","cx":4.643026020738638,"cy":58.19197664732871,"cz":0,"lx":39.00320499651278,"ly":0.2,"lz":10,"relativeAngle":3.1544124640626934,"leftPoint":[24.14302602073864,58.441976647328715,0.1],"rightPoint":[-14.856973979261348,57.94197664732871,0.1],"leftJoints":["hZXuadfd8Y2gU3C4iTs3VG"],"rightJoints":["sdKSXeQhAWxE6ifCs1d6RC"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"tysEJM9hUShvginx4rYC7K","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":24.39302602073864,"cy":2.941976647328705,"cz":0,"lx":111.00112612041376,"ly":0.2,"lz":10,"relativeAngle":1.575300800833464,"leftPoint":[24.643026020738645,-52.55802335267129,0.1],"rightPoint":[24.143026020738642,58.4419766473287,0.1],"leftJoints":["njXmWTSZ52XC3BH77kTEtQ"],"rightJoints":["tysEJM9hUShvginx4rYC7K"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"hZXuadfd8Y2gU3C4iTs3VG","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":9.143026020738638,"cy":-52.8080233526713,"cz":0,"lx":31.004031995854984,"ly":0.2,"lz":10,"relativeAngle":0.016127633843636247,"leftPoint":[-6.356973979261358,-53.05802335267129,0.1],"rightPoint":[24.64302602073863,-52.558023352671285,0.1],"leftJoints":["1sYogQ8Va73vub552Dsk1p"],"rightJoints":["hZXuadfd8Y2gU3C4iTs3VG"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"njXmWTSZ52XC3BH77kTEtQ","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-6.356973979261353,"cy":-47.05802335267128,"cz":0,"lx":11.999999999999986,"ly":0.2,"lz":10,"relativeAngle":4.712388980384691,"leftPoint":[-6.356973979261358,-41.05802335267129,0.1],"rightPoint":[-6.356973979261351,-53.058023352671285,0.1],"leftJoints":["dfk6k28j8Rsu1Q1oCp7zKp"],"rightJoints":["njXmWTSZ52XC3BH77kTEtQ"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"1sYogQ8Va73vub552Dsk1p","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":-14.606973979261362,"cy":8.441976647328703,"cz":0,"lx":99.0012626182111,"ly":0.2,"lz":10,"relativeAngle":4.717439442493762,"leftPoint":[-14.856973979261348,57.94197664732871,0.1],"rightPoint":[-14.356973979261365,-41.05802335267131,0.1],"leftJoints":["tysEJM9hUShvginx4rYC7K"],"rightJoints":["dfk6k28j8Rsu1Q1oCp7zKp"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"sdKSXeQhAWxE6ifCs1d6RC","color":"#cccccc","studSpacing":200,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Cuboid","cx":34.8305400791776,"cy":-52.42058894277254,"cz":6,"lx":7.619334475628514,"ly":5.299339135336109,"lz":12,"color":"#999999","faceColors":["#999999","#999999","#999999","#999999","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.5484342228590808],"parentId":"Ground","selected":false,"id":"aLpgA6ukywKpo8YHkCPK9Z"},{"type":"Window","cx":-0.2701985741652489,"cy":0.1,"cz":0.325,"lx":0.44948921683564763,"ly":0.2,"lz":0.15,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"sdKSXeQhAWxE6ifCs1d6RC","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"dXdqLZ7zgTd93oqrXfjWsJ","opacity":0,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-3.58855390814681e-17,"cy":0.1,"cz":-0.4,"lx":0.9898863651661457,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"xi8z9Sz8uH7vazDgmc3RCx","parentId":"sdKSXeQhAWxE6ifCs1d6RC","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jack","cx":0.6384948916889619,"cy":-0.2839733771670918,"cz":5.999999999999999,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"aLpgA6ukywKpo8YHkCPK9Z","id":"ddYtbAhoUpyMoKhVhaAQGE","selected":false,"ly":0.42},{"type":"Window","cx":0,"cy":0.1,"cz":0,"lx":0.9898863651661457,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"aziCwtJpaGh65HD2YLn8fS","parentId":"sdKSXeQhAWxE6ifCs1d6RC","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Wall","cx":1.5252168961263317,"cy":51.80939453669954,"cz":0,"lx":20.031488630531463,"ly":0.2,"lz":9,"leftJoints":["kuZyRXr6X1ZZLgvnEdPLQW"],"rightJoints":["nWPXmVRMzHKyjWryQf87JS"],"leftPoint":[11.540961211392062,51.809394536699536,0],"rightPoint":[-8.490527419139399,51.80939453669955,0],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qsREzsezLRHaTka6P3qi8E","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Stud","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":11.7913548192737,"cy":-3.284592727383899,"cz":0,"lx":110.1891125223151,"ly":0.2,"lz":9,"leftJoints":["dkmWHRoyM37TP1ais2mnQQ"],"rightJoints":["qsREzsezLRHaTka6P3qi8E"],"leftPoint":[12.041748427155346,-58.37857999146732,0],"rightPoint":[11.540961211392053,51.80939453669952,0],"relativeAngle":1.5753411400554025,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kuZyRXr6X1ZZLgvnEdPLQW","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Stud","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-3.2436892780431448,"cy":-58.47348142439061,"cz":0,"lx":30.571464611396937,"ly":0.2,"lz":9,"leftJoints":["ihGgAKbhoAEwWeLnpFQBfw"],"rightJoints":["kuZyRXr6X1ZZLgvnEdPLQW"],"leftPoint":[-18.52912698324161,-58.568382857313914,0],"rightPoint":[12.041748427155321,-58.37857999146732,0],"relativeAngle":0.006208537524114639,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"dkmWHRoyM37TP1ais2mnQQ","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Stud","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-18.52912698324161,"cy":-52.1159338984573,"cz":0,"lx":12.904897917713235,"ly":0.2,"lz":9,"leftJoints":["qXr3hrbfNKc7RCzq91xbXK"],"rightJoints":["dkmWHRoyM37TP1ais2mnQQ"],"leftPoint":[-18.52912698324161,-45.66348493960068,0],"rightPoint":[-18.52912698324161,-58.568382857313914,0],"relativeAngle":-1.5707963267948966,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"ihGgAKbhoAEwWeLnpFQBfw","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","studSpacing":200,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Wall","cx":-7.989740203376101,"cy":3.1678562314727046,"cz":0,"lx":97.2882323106823,"ly":0.2,"lz":9,"leftJoints":["qsREzsezLRHaTka6P3qi8E"],"rightJoints":["qXr3hrbfNKc7RCzq91xbXK"],"leftPoint":[-8.490527419139399,51.80939453669955,0],"rightPoint":[-7.488952987612803,-45.47368207375414,0],"relativeAngle":-1.5605012263432012,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"nWPXmVRMzHKyjWryQf87JS","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Default","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Foundation","cx":2.6802301363018337,"cy":-0.008091723250991834,"cz":0.075,"lx":47.100258882021336,"ly":155.2816074058604,"lz":0.15,"normal":[0,0,1],"rotation":[0,0,0.530395639672967],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"s7XmQ94X6RJALjEtkckmRw","selected":false},{"type":"Wall","cx":-13.009039985427215,"cy":-45.568583506677385,"cz":0,"lx":11.041805422196214,"ly":0.2,"lz":9,"leftJoints":["nWPXmVRMzHKyjWryQf87JS"],"rightJoints":["ihGgAKbhoAEwWeLnpFQBfw"],"leftPoint":[-7.488952987612821,-45.47368207375409,0],"rightPoint":[-18.52912698324161,-45.66348493960068,0],"relativeAngle":-3.1244023294596825,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"qXr3hrbfNKc7RCzq91xbXK","parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","wallStructure":"Stud","studSpacing":200,"opacity":0,"selected":false,"roofId":"715hHLBU5uPxPmY3VTjteR","leftRoofHeight":9,"rightRoofHeight":9,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9,"rightTopPartialHeight":9},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["ihGgAKbhoAEwWeLnpFQBfw","dkmWHRoyM37TP1ais2mnQQ","kuZyRXr6X1ZZLgvnEdPLQW","qsREzsezLRHaTka6P3qi8E","nWPXmVRMzHKyjWryQf87JS","qXr3hrbfNKc7RCzq91xbXK"],"textureType":"No Roof Texture","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"s7XmQ94X6RJALjEtkckmRw","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"715hHLBU5uPxPmY3VTjteR","sideColor":"#999999","rise":0,"ceiling":false},{"type":"Wall","cx":-10.356973979261362,"cy":-41.05802335267131,"cz":0,"lx":8.000000000000007,"ly":0.2,"lz":10,"leftJoints":["sdKSXeQhAWxE6ifCs1d6RC"],"rightJoints":["1sYogQ8Va73vub552Dsk1p"],"leftPoint":[-14.35697397926136,-41.05802335267131,0.1],"rightPoint":[-6.356973979261358,-41.05802335267129,0.1],"relativeAngle":3.5527136788004978e-15,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"dfk6k28j8Rsu1Q1oCp7zKp","parentId":"fAfbfM7oEHfq1VBgchFech","foundationId":"fAfbfM7oEHfq1VBgchFech","studSpacing":200,"selected":false,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":10,"rightTopPartialHeight":10},{"type":"Wall","cx":1.4207056572728782,"cy":46.41750725666692,"cz":0,"lx":18.6588866759028,"ly":0.2,"lz":5.794050119631874,"leftJoints":["jG1casp2JsBCa6isf6jPBp"],"rightJoints":["tYVF4f8huJSYi3SnemH2U3"],"leftPoint":[10.750148995224277,46.417507256666916,0],"rightPoint":[-7.908737680678521,46.41750725666693,0],"relativeAngle":3.1415926535897927,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"hNWXBkU3b39gF1yUGHaJqP","parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","wallStructure":"Stud","studSpacing":200,"opacity":0,"roofId":"tknPcP8JDek1GProeixsEp","selected":false,"leftRoofHeight":5.794050119631874,"rightRoofHeight":5.794050119631874,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.794050119631874,"rightTopPartialHeight":5.794050119631874},{"type":"Wall","cx":10.983385078673063,"cy":-2.9427598627993987,"cz":0,"lx":98.72163631495759,"ly":0.2,"lz":5.794050119631874,"leftJoints":["iFwuQS6DyWdjrRQbrM6EVe"],"rightJoints":["hNWXBkU3b39gF1yUGHaJqP"],"leftPoint":[11.21662116212185,-52.3030269822657,0],"rightPoint":[10.750148995224274,46.4175072566669,0],"relativeAngle":1.5755214703412732,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jG1casp2JsBCa6isf6jPBp","parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","wallStructure":"Default","studSpacing":200,"opacity":0,"roofId":"tknPcP8JDek1GProeixsEp","selected":false,"leftRoofHeight":9.013429915065354,"rightRoofHeight":5.794050119631874,"centerRoofHeight":[-0.5,9.013429915065354],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.794050119631874,"rightTopPartialHeight":5.794050119631874},{"type":"Wall","cx":2.109769329329133,"cy":-52.165708324365085,"cz":0,"lx":18.215774122254274,"ly":0.2,"lz":9.013429915065354,"leftJoints":["tYVF4f8huJSYi3SnemH2U3"],"rightJoints":["jG1casp2JsBCa6isf6jPBp"],"leftPoint":[-6.997082503463552,-52.028389666464484,0],"rightPoint":[11.216621162121818,-52.30302698226569,0],"relativeAngle":-0.015077466364245784,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"iFwuQS6DyWdjrRQbrM6EVe","parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","wallStructure":"Default","studSpacing":200,"opacity":0,"roofId":"tknPcP8JDek1GProeixsEp","selected":false,"leftRoofHeight":9.013429915065354,"rightRoofHeight":9.013429915065354,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":9.013429915065354,"rightTopPartialHeight":9.013429915065354},{"type":"Wall","cx":-7.452910092071025,"cy":-2.805441204898788,"cz":0,"lx":98.45011800989347,"ly":0.2,"lz":5.794050119631874,"leftJoints":["hNWXBkU3b39gF1yUGHaJqP"],"rightJoints":["iFwuQS6DyWdjrRQbrM6EVe"],"leftPoint":[-7.908737680678497,46.41750725666691,0],"rightPoint":[-6.997082503463552,-52.028389666464484,0],"relativeAngle":-1.5615361224898512,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"tYVF4f8huJSYi3SnemH2U3","parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","wallStructure":"Stud","studSpacing":200,"opacity":0,"roofId":"tknPcP8JDek1GProeixsEp","selected":false,"leftRoofHeight":5.794050119631874,"rightRoofHeight":9.013429915065354,"centerRoofHeight":[0.5,9.013429915065354],"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.794050119631874,"rightTopPartialHeight":5.794050119631874},{"type":"Foundation","cx":-16.35434154408445,"cy":-4.658194992756286,"cz":0.1,"lx":43.87284485416718,"ly":139.1211999878274,"lz":0.2,"normal":[0,0,1],"rotation":[0,0,0.530395639672967],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"aLEzp9hfrYz6biKQBY4n26","selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["iFwuQS6DyWdjrRQbrM6EVe"],"textureType":"No Roof Texture","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"aLEzp9hfrYz6biKQBY4n26","foundationId":"aLEzp9hfrYz6biKQBY4n26","id":"tknPcP8JDek1GProeixsEp","ridgeLeftPoint":[0.5,1],"ridgeRightPoint":[-0.5,1],"sideColor":"#999999","rise":0,"ceiling":false},{"type":"Window","cx":0,"cy":0.1,"cz":0.325,"lx":0.9742789087050032,"ly":0.2,"lz":0.15,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"tysEJM9hUShvginx4rYC7K","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"t2Cw4N4TZZkGP5BoLeNcKe","opacity":0,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.0019768216134676713,"cy":0.1,"cz":-0.005731530796598517,"lx":0.9782325519319385,"ly":0.2,"lz":0.21146306159319703,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"qwSoMqqWcK4TDa7AjgWqwH","parentId":"tysEJM9hUShvginx4rYC7K","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":4.554386849898802e-17,"cy":0.1,"cz":-0.4,"lx":0.9742789087050032,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"m3ekqWg3Hj5f3LitnJWBy1","parentId":"tysEJM9hUShvginx4rYC7K","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":3.200610482948187e-17,"cy":0.1,"cz":0.325,"lx":0.9729631020395402,"ly":0.2,"lz":0.15,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"hZXuadfd8Y2gU3C4iTs3VG","foundationId":"fAfbfM7oEHfq1VBgchFech","id":"gvpuFXmeNDDeRKgSmwP1CZ","opacity":0,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":3.200610482948187e-17,"cy":0.1,"cz":-0.05,"lx":0.9729631020395402,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"eCbjoFBaHQiuQUKYuZoFfR","parentId":"hZXuadfd8Y2gU3C4iTs3VG","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0,"cy":0.1,"cz":-0.4,"lx":0.9729631020395402,"ly":0.2,"lz":0.2,"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jFDknbsuGgwqRxzvsmU4CQ","parentId":"hZXuadfd8Y2gU3C4iTs3VG","foundationId":"fAfbfM7oEHfq1VBgchFech","tint":"#73D8FF","opacity":0,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Jaye","cx":-17.46381887736557,"cy":-41.9816536072657,"cz":0.05,"lx":0.55,"lz":1.65,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"fAfbfM7oEHfq1VBgchFech","id":"c9HstzWD7XzAFugKNugMuy","selected":false,"ly":0.55},{"type":"Window","cx":-0.45740372646398547,"cy":0.1,"cz":0.25,"lx":0.07195114798309891,"ly":0.2,"lz":0.3888888888888889,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":false,"mullionWidth":0.06,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"nWPXmVRMzHKyjWryQf87JS","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"wuQewUkoGaBsjuzjt5f5uH","opacity":0,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":2.5,"poleRadius":0.05,"poleSpacing":5,"cx":-0.08476384816809007,"cy":0.25788159693893226,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"color":"#fff","parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"vqvQktRu6i8bL8ZiGaoGnt","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1615496100848164,"cy":0.25770817536556956,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"wdbtnJ1XkcTwDSb8wiEMKL","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08010322022532794,"cy":0.09848093983788882,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"32oGsayzWtjfS2sR392vRy","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15821694625943433,"cy":0.09899040837617899,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"e6f94dRNL6XBpsmcrnKDU9","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.1544950822019521,"cy":-0.05668699528465417,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"wzKUNhsTS2CEWiU4WpUm2j","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08173283819450536,"cy":-0.056114317250364976,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"mKWB3USg3dr53V5yqbCZHD","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.08275541478239372,"cy":-0.21595299989492936,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"t9dCrMhmdqRDyewscNhEss","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.060547048383927105,"cy":-0.3528469086181044,"cz":9.2,"lx":27.776,"ly":3.936,"lz":0.046,"trackerType":"None","tiltAngle":0.08726646259971647,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"7UbuZjpocqLztS4V8bYdKv","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.15077186158226766,"cy":-0.21881896397118786,"cz":9.2,"lx":5.904,"ly":21.823999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":2.5,"poleSpacing":5,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentType":"Roof","parentId":"715hHLBU5uPxPmY3VTjteR","foundationId":"s7XmQ94X6RJALjEtkckmRw","id":"e5YYaGmX4NkSq53yXqBiSb","selected":false},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.4500000000000003,"y":-0.425},{"x":-0.4500000000000003,"y":-0.17499999999999996},{"x":-0.2833333333333334,"y":-0.17499999999999996},{"x":-0.2833333333333334,"y":-0.425}],"parentId":"1sYogQ8Va73vub552Dsk1p","parentType":"Wall","foundationId":"fAfbfM7oEHfq1VBgchFech","selected":false,"filled":true,"selectedIndex":3,"id":"mMTWwGXVY6tHrH3tFfFj84","text":"P","fontColor":"black","fontOutlineColor":"white","fontOutlineWidth":0.1,"fontSize":2}],"sceneRadius":106,"view":{"dailyPvYieldPanelX":0,"mapPanelY":158,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[16.929262825751,-28.15408933210822,-0.000058144424349073707],"yearlyHeliostatYieldPanelY":0,"mapPanelX":248,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[16.929262825751,-28.154239338775618,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-13.677779559893043,-87.22834473506032,67.89303797087159],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":0,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":true,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":9.265824603195062,"mapType":"hybrid","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":0,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16A5A5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[7.0532361348326695,-29.239499866887954,4.7578192072686045],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":7,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"waterSurface":false,"showAzimuthAngle":true,"showElevationAngle":true,"showZenithAngle":true,"solarPanelShiness":100,"windowShiness":200,"showDiurnalTemperaturePanel":false,"showEconomicsPanel":false,"showDailyUpdraftTowerYieldPanel":false,"showYearlyUpdraftTowerYieldPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":353,"height":64},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"yearlyLightSensorPanelShowDaylight":false,"yearlyLightSensorPanelShowClearness":false,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Hypothetical solar canopies for a garage"]}')},494:function(e){e.exports=JSON.parse('{"docid":"9FwzvKbLoEC3qk3HcYhpK3","time":"02/04/2023 02:19 pm","timestamp":1675538359367,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"noAnimationForSolarPanelSimulation":false,"latitude":37.4924685,"cspTimesPerHour":4,"timesPerHour":4,"noAnimationForSensorDataCollection":false,"noAnimationForSolarUpdraftTowerSimulation":false,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"sutGridCellSize":1,"longitude":-121.944697,"airConvectiveCoefficient":5,"name":"default","highestTemperatureTimeInMinutes":900,"sutTimesPerHour":4,"diurnalTemperatureModel":1,"discretization":"Approximate","address":"45500 Fremont Blvd, Fremont, CA 94538, USA","noAnimationForHeatmapSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspDaysPerYear":4,"pvGridCellSize":0.5,"airAttenuationCoefficient":0.01,"sutDaysPerYear":4,"date":"1/1/2022, 9:00:00 AM","cspGridCellSize":0.5,"dustLoss":0.05,"daysPerYear":12},"elements":[{"type":"Foundation","cx":-0.08114032291986462,"cy":0.04294942268642887,"cz":0.05,"lx":77.18969112756628,"ly":25.114558892189873,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"9VUxbWr6Hk1HaeGiLpEeqj","locked":false},{"type":"Wall","cx":16.394958493767938,"cy":-6.958678279965962,"cz":0,"lx":34.5,"ly":0.3,"lz":20,"relativeAngle":0,"leftPoint":[-0.6550415062320631,-7.358678279965961,0.1],"rightPoint":[33.84495849376793,-7.358678279965961,0.1],"leftJoints":[],"rightJoints":[],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"8BJFAiWAksi5iXqqAXG3m7","wallStructure":"Default","opacity":0,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Solar Panel","pvModelName":"FS-497","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.272463768115942,"cy":0,"cz":0.445,"lx":15.6,"ly":1.2,"lz":0.046,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"color":"#fff","parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wGRXvcE2DsAaZztwb6HksP","selected":false},{"type":"Human","name":"Jedi","cx":25.350323157691225,"cy":-8.982865067578267,"cz":0.05000000074505806,"lx":0.56,"lz":1.75,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"iDRReqKwNSn3MdzCD9xntV","selected":false,"ly":0.56},{"type":"Solar Panel","pvModelName":"FS-497","trackerType":"None","relativeAzimuth":0,"tiltAngle":0,"orientation":"Landscape","drawSunBeam":false,"poleHeight":1,"poleRadius":0.05,"poleSpacing":3,"cx":-0.23768115942028983,"cy":0,"cz":-0.0050000000000000044,"lx":6,"ly":4.8,"lz":0.046,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"color":"#fff","parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"kDSDBXNMTiTKABtDtEoTPM","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.4463768115942027,"cy":2.960594732333751e-15,"cz":0.17517500000000008,"lx":3.5999999999999996,"ly":9.6,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"3R99UFMtSTu8MpSzhFBEzM","selected":false,"color":"#fff","drawSunBeam":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.3768115942028986,"cy":0,"cz":0.055525000000000005,"lx":1.2,"ly":14.399999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2nC5kmMxK27nhcbuLchKpX","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.24057971014492754,"cy":0,"cz":0.26534999999999986,"lx":6,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2f53rLJkYN28GAXqDH43oC","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.08115942028985497,"cy":0,"cz":-0.03447500000000003,"lx":2.4,"ly":18,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1CLg3vw3R6Mjckp2zLGRcx","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.23768115942028983,"cy":0,"cz":-0.21465000000000006,"lx":8.4,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"3EcpwWTaBMzQ2Wh6WUSfZ2","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.005797101449275342,"cy":0,"cz":0.44517500000000004,"lx":33.6,"ly":1.2,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"afQFwUz294V81V8ekAFzoy","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.38840579710144923,"cy":0,"cz":0.025875000000000446,"lx":4.8,"ly":13.2,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rvr7kALWbgFepgQwhgLdmn","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.47536231884057967,"cy":2.960594732333751e-15,"cz":-0.034299999999999733,"lx":1.2,"ly":18,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"h8Kaodh1qXkhqWggo4XUhx","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.21449275362318843,"cy":0,"cz":0.02570000000000001,"lx":4.8,"ly":13.199999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gb2jcBuVudWuAzaQrnkX6y","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.30144927536231886,"cy":0,"cz":-0.2143,"lx":1.2,"ly":3.599999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"vUqRVHfCe86GnXDtKSxaw8","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.127536231884058,"cy":0,"cz":0.05552500000000036,"lx":1.2,"ly":14.399999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"uSBaFrGbhmQkQMurd3uJ8K","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.01159420289855071,"cy":0,"cz":0.265525,"lx":6,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"n1zXsXRnujYqMASe1WUKNR","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.11594202898550725,"cy":-1.1842378929335004e-14,"cz":0.05535000000000023,"lx":1.2,"ly":14.399999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1bjxTFMmzz4rPmQkK5vxos","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.011594202898550721,"cy":0,"cz":0.025,"lx":6,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"kXtBHayvf3Tvd93XA15jDA","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.005797101449275342,"cy":0,"cz":-0.21447500000000003,"lx":7.199999999999999,"ly":3.599999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"7g2C2UieAJmWoyUM62ZQ2a","selected":false,"color":"#fff"},{"type":"Wall","cx":-17.344845563783142,"cy":-6.9427205539050725,"cz":4.230734017714145,"lx":34.5,"ly":0.3,"lz":20,"leftJoints":["gPxD8gV5byhzgQKdBBgMTy"],"rightJoints":[],"leftPoint":[-34.59484556378314,-6.9427205539050725,0.1],"rightPoint":[-0.09484556378314224,-6.9427205539050725,0.1],"relativeAngle":0,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"7cDw6CDEimwyt2K7C9p2yW","parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","wallStructure":"Default","opacity":0,"selected":false,"roofId":"sGiZvGvnHnyEYkatVrLiX7","leftRoofHeight":20,"rightRoofHeight":20,"structureSpacing":2,"structureWidth":0.1,"structureColor":"white","fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.255072463768116,"cy":0,"cz":0.265,"lx":6,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wFqugJCgR6UNZP8KrBbWpt","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.35942028985507246,"cy":-1.1842378929335004e-14,"cz":0.05535000000000023,"lx":1.2,"ly":14.399999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"4jWvM8cSUfsXRSp6TmJ2Gg","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.22028985507246376,"cy":0,"cz":0.025174999999999993,"lx":5.999999999999999,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"toAqeegGXNvuKLhennKVzP","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.23768115942028983,"cy":0,"cz":-0.21447500000000003,"lx":7.199999999999998,"ly":3.599999999999999,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"saA7QrRCNPT5wTdbHg5J4Z","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.44637681159420284,"cy":-1.1842378929335004e-14,"cz":0.1753500000000002,"lx":2.4,"ly":9.6,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1muJg2Kq7Xbc14wrpktdBf","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.42898550724637674,"cy":0,"cz":-0.21447500000000003,"lx":3.5999999999999996,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"d7sb6VcbzjaYN3rbM9eNEy","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.4463768115942027,"cy":0,"cz":-0.21447500000000003,"lx":3.5999999999999996,"ly":3.5999999999999996,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"cog6ySXPfBh8EbJAcymKkb","selected":false,"color":"#fff"},{"type":"Wall","cx":-34.64742278189158,"cy":2.0786397230474662,"cz":0,"lx":18.04302697558712,"ly":0.3,"lz":20,"relativeAngle":4.718216995364466,"leftPoint":[-34.7,11.100000000000001,0],"rightPoint":[-34.59484556378315,-6.942720553905069,0],"leftJoints":["doTJdkASNxSDmLf9c3Pegr"],"rightJoints":["7cDw6CDEimwyt2K7C9p2yW"],"textureType":"No Wall Texture","selected":false,"lineWidth":0.2,"lineColor":"black","windows":[],"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gPxD8gV5byhzgQKdBBgMTy","roofId":"sGiZvGvnHnyEYkatVrLiX7","leftRoofHeight":20,"rightRoofHeight":20,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":-0.4000000000000057,"cy":11.099999999999998,"cz":0,"lx":68.6,"ly":0.3,"lz":20,"leftJoints":["6iADGugkaqZHafimZHuePH"],"rightJoints":["gPxD8gV5byhzgQKdBBgMTy"],"leftPoint":[33.89999999999999,11.099999999999996,0],"rightPoint":[-34.7,11.100000000000001,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"doTJdkASNxSDmLf9c3Pegr","parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","selected":false,"roofId":"sGiZvGvnHnyEYkatVrLiX7","leftRoofHeight":20,"rightRoofHeight":20,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Wall","cx":33.791618329408095,"cy":2.180852804801064,"cz":0,"lx":17.839611349594517,"ly":0.3,"lz":20,"leftJoints":[],"rightJoints":["doTJdkASNxSDmLf9c3Pegr"],"leftPoint":[33.6832366588162,-6.738294390397874,0],"rightPoint":[33.9,11.100000000000001,0],"relativeAngle":1.5586453515816485,"textureType":"No Wall Texture","normal":[0,0,1],"rotation":[0,0,0],"id":"6iADGugkaqZHafimZHuePH","parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","selected":false,"roofId":"sGiZvGvnHnyEYkatVrLiX7","leftRoofHeight":20,"rightRoofHeight":20,"wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","eavesLength":0.3,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":20,"rightTopPartialHeight":20},{"type":"Window","cx":0.22463768115942012,"cy":0.1,"cz":0.15000000000000005,"lx":0.4782608695652177,"ly":0.3,"lz":0.6000000000000001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":2,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#009ce0","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"qQynJ4ikT8Jys2hyueRjYG","opacity":0.9,"mullion":true,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"thickness":0.2,"roofType":"Pyramid","roofStructure":"Default","wallsId":["6iADGugkaqZHafimZHuePH","doTJdkASNxSDmLf9c3Pegr","gPxD8gV5byhzgQKdBBgMTy","7cDw6CDEimwyt2K7C9p2yW"],"textureType":"No Roof Texture","color":"#999999","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"sGiZvGvnHnyEYkatVrLiX7","rise":0,"ceiling":false},{"type":"Window","cx":0.22463768115942023,"cy":0.1,"cz":-0.325,"lx":0.4782608695652175,"ly":0.3,"lz":0.3,"mullionWidth":0.1,"mullionSpacing":2,"color":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"id":"jd3R2J1QYzh9JuC9phYqVK","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","tint":"#009ce0","shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"opacity":0.8,"mullion":true,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Human","name":"Joey","cx":27.81441583822325,"cy":-8.684480883806081,"cz":0.05000000074505806,"lx":0.462,"ly":0.462,"lz":1.72,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"fGLWCfzEic9oaSWyEnfb8i","selected":false},{"type":"Solar Panel","pvModelName":"FS-497","cx":0.011594202898550683,"cy":-5.921189464667502e-15,"cz":-0.44000000000000006,"lx":32.4,"ly":1.7999999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"n8XPZ6tgzkn2e4GV2EzSXQ","selected":false,"color":"#fff"},{"type":"Solar Panel","pvModelName":"FS-497","cx":-0.30724637681159417,"cy":-5.921189464667502e-15,"cz":-0.44000000000000006,"lx":13.2,"ly":1.7999999999999998,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,-1,0],"rotation":[0,0,0],"parentType":"Wall","parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"ekdf8pAm7pTKeoNrT8Tsaw","selected":false,"color":"#fff"},{"type":"Tree","name":"Coconut","cx":-37.29836295160464,"cy":6.720238350736238,"cz":0.05000000074505806,"lx":3.701437012134672,"lz":5.8375624371425605,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"bieAeuuP4wJ8YMzJZ42ius","selected":false},{"type":"Tree","name":"Coconut","cx":-37.9321629780283,"cy":-10.933241760578944,"cz":0.050000000745059836,"lx":3.701437012134672,"lz":5.8375624371425605,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1BTxRyn2gu6uRotoQP2TPa","selected":false},{"type":"Tree","name":"Coconut","cx":36.96142302143514,"cy":-12.152019969014674,"cz":0.05000000074505451,"lx":3.701437012134672,"lz":5.8375624371425605,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"45HuTdkFeGkSbAuGPLxP7t","selected":false},{"type":"Tree","name":"Coconut","cx":37.37981081167908,"cy":8.010864765015526,"cz":0.05000000074505451,"lx":3.701437012134672,"lz":5.8375624371425605,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gQacj5zT5LnDR4eGQGkjvL","selected":false},{"type":"Window","cx":-0.3014492753623188,"cy":0.1,"cz":0.38499999999999995,"lx":0.30724637681159417,"ly":0.3,"lz":0.049999999999999864,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wWxvu5H2MuoVyv6ABdSbEK","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.3028985507246377,"cy":0.1,"cz":0.11749999999999998,"lx":0.03188405797101443,"ly":0.3,"lz":0.475,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"eREbGbTDZGJcxYejLHJP9R","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.09420289855072465,"cy":0.1,"cz":0.14499999999999996,"lx":0.031884057971014505,"ly":0.3,"lz":0.5399999999999999,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"rHF8v4bUPPQWeN1QG5CD8Z","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.010144927536231944,"cy":0.1,"cz":0.38999999999999996,"lx":0.1710144927536233,"ly":0.3,"lz":0.049999999999999954,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1iamFXUWAL4NspqHjRqj9C","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.010144927536231887,"cy":0.1,"cz":0.14499999999999996,"lx":0.16521739130434784,"ly":0.3,"lz":0.06000000000000005,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"kwg8jL3PhhkSHEUBWoJRhB","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.008695652173913031,"cy":0.1,"cz":-0.0975,"lx":0.16811594202898547,"ly":0.3,"lz":0.05500000000000001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"eBcZrL2nPnHJENRw34vkgb","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23768115942028983,"cy":0.1,"cz":0.3849999999999999,"lx":0.2086956521739131,"ly":0.3,"lz":0.05999999999999979,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tNMjGGfcx6yh5WH83NpPfT","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.15072463768115943,"cy":0.1,"cz":0.23249999999999998,"lx":0.0347826086956522,"ly":0.3,"lz":0.23500000000000004,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"cSnVNjSPe2y5ibKDfks9cp","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.2565217391304348,"cy":0.1,"cz":0.14500000000000002,"lx":0.17101449275362315,"ly":0.3,"lz":0.049999999999999975,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"oQPXqj5b7fi9mxcYzLVwxU","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.23768115942028983,"cy":0.1,"cz":-0.09500000000000001,"lx":0.2086956521739131,"ly":0.3,"lz":0.06000000000000004,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"acu7FEv3n3KgU2sbERHsq8","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.32608695652173914,"cy":0.1,"cz":0.030000000000000006,"lx":0.03188405797101453,"ly":0.3,"lz":0.16999999999999998,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"mwtc1MiJNhvF5Wp2hfBGbo","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.3942028985507246,"cy":0.1,"cz":0.14499999999999996,"lx":0.0347826086956522,"ly":0.3,"lz":0.5399999999999999,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"xjxbBTagEoUGRvE4BqcQ8X","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.4463768115942029,"cy":0.1,"cz":-0.0975,"lx":0.06376811594202897,"ly":0.3,"lz":0.05500000000000001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"gopaxkwtRfTqBUgmdgUeeB","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.44637681159420284,"cy":0.1,"cz":-0.09500000000000001,"lx":0.10434782608695652,"ly":0.3,"lz":0.06000000000000004,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"qtFXnqjWpK5EGFhJVApZG1","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2391304347826087,"cy":0.1,"cz":0.3850000000000001,"lx":0.2405797101449276,"ly":0.3,"lz":0.05999999999999987,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"n3FzBgTqGZAf3tAvrhJnpS","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.34347826086956523,"cy":0.1,"cz":0.11250000000000004,"lx":0.031884057971014484,"ly":0.3,"lz":0.4749999999999999,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wN26cpvDFmXpaVZ9fzFKx6","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.1333333333333334,"cy":0.1,"cz":0.11499999999999999,"lx":0.034782608695652126,"ly":0.3,"lz":0.47000000000000003,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"a6Zd5eVvPewZw6pi9G6fFn","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.2391304347826087,"cy":0.1,"cz":0.145,"lx":0.17101449275362318,"ly":0.3,"lz":0.06000000000000001,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"jXiZzAe8xydxZFiw3kYxPd","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":0.010144927536231873,"cy":0.1,"cz":-0.35,"lx":0.9304347826086955,"ly":0.3,"lz":0.09000000000000004,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"7cDw6CDEimwyt2K7C9p2yW","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"kWayuyUJ3NCoJ76cAXXsb2","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Window","cx":-0.30869565217391304,"cy":0.1,"cz":-0.35,"lx":0.37391304347826093,"ly":0.3,"lz":0.08000000000000003,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullionWidth":0.1,"mullionSpacing":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#73D8FF","tint":"#73D8FF","normal":[0,0,1],"rotation":[0,0,0],"parentId":"8BJFAiWAksi5iXqqAXG3m7","foundationId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"4sc4zQh2e4rskEdUjC7bwE","mullion":true,"opacity":0.5,"mullionColor":"white","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1},{"type":"Flower","name":"Boxwood","cx":-33.25171795779697,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2qoyCTh6RmtgUKGjienf6c","selected":false},{"type":"Flower","name":"Boxwood","cx":-30.051717957796967,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"27S95LNhtfhhNdrfhLb63X","selected":false},{"type":"Flower","name":"Boxwood","cx":-26.851717957796964,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"4EzEYN7UN51NGA1h2gYf6h","selected":false},{"type":"Flower","name":"Boxwood","cx":-23.65171795779696,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"aMDDZrStJb88k8cjNdHTyX","selected":false},{"type":"Flower","name":"Boxwood","cx":-20.45171795779696,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"bmyWAH2NGyagaGJf2zR8wZ","selected":false},{"type":"Flower","name":"Boxwood","cx":-17.251717957796956,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"qjnbGRzmuBcffGRPmRHiD4","selected":false},{"type":"Flower","name":"Boxwood","cx":-14.051717957796956,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"2kbr1bEYWRM4qt64AXRioR","selected":false},{"type":"Flower","name":"Boxwood","cx":-10.851717957796957,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"wPVJmyDJeSE1u47UPb87pe","selected":false},{"type":"Flower","name":"Boxwood","cx":-7.651717957796958,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"7fEUD44paZGx4eApcgVBdW","selected":false},{"type":"Flower","name":"Boxwood","cx":-4.451717957796959,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"iz1HshbMuyvDyuUFjjNVmm","selected":false},{"type":"Flower","name":"Boxwood","cx":-1.2517179577969584,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"1HnQLoEVsBHHwYnQM4daRk","selected":false},{"type":"Flower","name":"Boxwood","cx":1.9482820422030418,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"tHugAGpHLnMfQJaJDiLNgW","selected":false},{"type":"Flower","name":"Boxwood","cx":5.148282042203042,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"fNGZwXhHJCEaTdeKtqi7LN","selected":false},{"type":"Flower","name":"Boxwood","cx":8.348282042203042,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"x9veDZdEDkbTP24vXAaH9a","selected":false},{"type":"Flower","name":"Boxwood","cx":11.548282042203041,"cy":-10.483343820985965,"cz":0.05000000074505806,"lx":1.6,"lz":1.44,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"aW9z1qFcCFUJKw1kfwTUs9","selected":false},{"type":"Human","name":"Jack","cx":-36.639233371667494,"cy":-11.25138408484107,"cz":0.05000000074505806,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"9VUxbWr6Hk1HaeGiLpEeqj","id":"bQ8SMNuHJbe3JAwpYi8Bx3","selected":false,"ly":0.42}],"view":{"yearlyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"diurnalTemperaturePanelX":0,"showInstructionPanel":true,"axes":false,"enableRotate":true,"weatherPanelY":0,"cameraPosition":[-38.175932678703475,-44.876912777413864,6.961313205634463],"showYearlyUpdraftTowerYieldPanel":false,"showSunAngles":false,"dailyPvYieldPanelX":0,"dailyHeliostatYieldPanelY":0,"showDailyHeliostatYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"showDailyLightSensorPanel":false,"solarRadiationHeatMapReflectionOnly":false,"autoRotate":false,"showWeatherPanel":false,"yearlyParabolicDishYieldPanelX":0,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelX":0,"yearlyPvYieldPanelX":0,"mapType":"roadmap","visibilityResultsPanelX":0,"heliodonPanelY":0,"showYearlyParabolicTroughYieldPanel":false,"showSiteInfoPanel":true,"mapTilt":0,"dailyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"mapPanelX":0,"orthographic":false,"showDailyPvYieldPanel":false,"yearlyUpdraftTowerYieldPanelY":0,"showHeliodonPanel":false,"showDailyFresnelReflectorYieldPanel":false,"heliodon":false,"showMapPanel":false,"shadowEnabled":true,"dailyFresnelReflectorYieldPanelY":0,"showYearlyFresnelReflectorYieldPanel":false,"weatherPanelX":0,"yearlyHeliostatYieldPanelX":0,"dailyLightSensorPanelY":0,"showDiurnalTemperaturePanel":false,"showDailyUpdraftTowerYieldPanel":false,"mapPanelY":0,"dailyPvYieldPanelY":0,"showStickyNotePanel":false,"yearlyUpdraftTowerYieldPanelX":0,"yearlyFresnelReflectorYieldPanelX":0,"groundColor":"#16A5A5","dailyHeliostatYieldPanelX":0,"stickyNotePanelX":0,"dailyUpdraftTowerYieldPanelY":0,"showElevationAngle":true,"yearlyFresnelReflectorYieldPanelY":0,"showYearlyHeliostatYieldPanel":false,"mapZoom":18,"panCenter":[7.187719821125536,18.770050283059465,6.961313205634463],"visibilityResultsPanelY":0,"showZenithAngle":true,"stickyNotePanelY":0,"showDesignInfoPanel":true,"yearlyPvYieldPanelY":0,"dailyUpdraftTowerYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"showYearlyLightSensorPanel":false,"heliodonPanelX":0,"theme":"Desert","yearlyLightSensorPanelShowDaylight":false,"groundImage":false,"showAzimuthAngle":true,"ambientLightIntensity":0.1,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"showDailyParabolicDishYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"solarRadiationHeatMapMaxValue":5,"showYearlyPvYieldPanel":false,"yearlyLightSensorPanelShowClearness":false,"showSolarPanelVisibilityResultsPanel":false,"diurnalTemperaturePanelY":0,"yearlyHeliostatYieldPanelY":0,"cameraZoom":13.26840862578125,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[21.857600787569247,2.944578579032461,0.0000029447094632855078],"cameraPosition2D":[21.857600787569247,2.944428572365064,150],"yearlyLightSensorPanelX":0,"showDailyParabolicTroughYieldPanel":false,"waterSurface":false,"showEconomicsPanel":false,"showEvolutionPanel":false,"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":0,"y":0,"width":400,"height":300},"dailyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":360},"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"visibilityResultsPanelRect":{"x":0,"y":0,"width":600,"height":470},"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"yearlyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"dailyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":640,"height":550},"yearlyUpdraftTowerYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},495:function(e){e.exports=JSON.parse('{"docid":"1VPKxyH9hMKodx5PZBsKF9","time":"02/02/2023 08:19 pm","timestamp":1675387154116,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"9/15/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.0145505850910366,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground","color":"#ffffff"},{"rotation":[0,0,0],"normal":[0,0,1],"showLabel":false,"label":"Row1","cy":-0.38935296591314916,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"cz":0.5000000074505806,"type":"Solar Panel","id":"c2J7QZr1z68dpk33yTT2Sd","orientation":"Landscape","cx":0.01688904665567762,"relativeAzimuth":0,"trackerType":"None","poleSpacing":3,"selected":false,"lz":0.046,"lx":17.138,"poleHeight":1,"drawSunBeam":true,"ly":2.092,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X21-335-BLK"},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":2.092,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":false,"label":"Row2","tiltAngle":0.5235987755982988,"poleSpacing":3,"rotation":[0,0,0],"lx":17.138,"selected":false,"orientation":"Landscape","cx":0.013031122906363104,"relativeAzimuth":0,"cy":-0.18800180696869379,"poleHeight":1,"drawSunBeam":true,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X21-335-BLK"},{"poleRadius":0.05,"type":"Solar Panel","lx":17.138,"lz":0.046,"relativeAzimuth":0,"drawSunBeam":true,"rotation":[0,0,0],"ly":2.092,"normal":[0,0,1],"poleSpacing":3,"cx":0.014926747515468942,"trackerType":"None","cy":0.014703568726943495,"label":"Row3","cz":0.5000000074506161,"orientation":"Landscape","showLabel":false,"selected":false,"poleHeight":1,"tiltAngle":0.5235987755982988,"id":"mAv2C19w4RJA4u6knYxU3u","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X21-335-BLK"},{"orientation":"Landscape","lx":17.138,"showLabel":false,"id":"jLa9TCA6bfQFuaoHYKZtr7","poleHeight":1,"drawSunBeam":true,"cy":0.18975053307599946,"selected":false,"ly":1.596,"label":"Row4","poleSpacing":3,"cx":0.012922602074816969,"type":"Solar Panel","cz":0.5000000074506161,"rotation":[0,0,0],"lz":0.046,"poleRadius":0.05,"trackerType":"None","tiltAngle":0.5235987755982988,"normal":[0,0,1],"relativeAzimuth":0,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X20-250-BLK"},{"tiltAngle":0.5235987755982988,"id":"nWKZve3r4PVxJM4YwShMJW","relativeAzimuth":0,"poleSpacing":3,"poleRadius":0.05,"cx":0.011234729062103974,"poleHeight":1,"type":"Solar Panel","trackerType":"None","label":"Row5","lz":0.046,"normal":[0,0,1],"showLabel":false,"cz":0.5000000074505806,"selected":false,"orientation":"Landscape","lx":17.138,"ly":1.596,"rotation":[0,0,0],"cy":0.35915527919266454,"drawSunBeam":true,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"SPR-X20-250-BLK"},{"type":"Human","name":"Jack","cx":-8.559844752666184,"cy":-5.056987011387983,"cz":0.05000000074505784,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"tmVJY65HF3sgVftctUAMHa","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Grassland","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"forestgreen","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[-10.001667461924015,-11.422813610974892,1.2577590090789499],"panCenter":[0.22138352296916342,-0.3133299860057419,1.2290156417830225],"orthographic":false,"enableRotate":true,"cameraZoom":45.44146361606706,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"waterSurface":true,"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":69}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Floatovoltaics"]}')},496:function(e){e.exports=JSON.parse('{"docid":"nXWtB4rWbhWvkvZtVhSWZF","time":"02/02/2023 08:30 pm","timestamp":1675387805969,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":21.26999081653234,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-157.79987618634874,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"4303 Diamond Head Rd, Honolulu, HI 96816, United States","date":"9/15/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"cy":0.0145505850910366,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground","textureType":"Foundation Texture #3"},{"rotation":[0,0,0],"normal":[0,0,1],"showLabel":false,"label":"Row1","cy":-0.38935296591314916,"poleRadius":0.05,"tiltAngle":0.5235987755982988,"cz":0.5000000074505806,"type":"Solar Panel","id":"c2J7QZr1z68dpk33yTT2Sd","orientation":"Landscape","cx":0.01688904665567762,"relativeAzimuth":0,"trackerType":"None","poleSpacing":3,"selected":false,"lz":0.046,"lx":17.712,"poleHeight":1,"drawSunBeam":true,"ly":1.984,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-350P-FG"},{"poleRadius":0.05,"type":"Solar Panel","lx":17.712,"lz":0.046,"relativeAzimuth":0,"drawSunBeam":true,"rotation":[0,0,0],"ly":1.984,"normal":[0,0,1],"poleSpacing":3,"cx":0.01109811276060147,"trackerType":"None","cy":-0.00188664318968728,"label":"Row3","cz":0.5000000074506161,"orientation":"Landscape","showLabel":false,"selected":false,"poleHeight":1,"tiltAngle":0.5235987755982988,"id":"mAv2C19w4RJA4u6knYxU3u","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-350P-FG"},{"tiltAngle":0.5235987755982988,"id":"nWKZve3r4PVxJM4YwShMJW","relativeAzimuth":0,"poleSpacing":3,"poleRadius":0.05,"cx":0.011234729062103974,"poleHeight":1,"type":"Solar Panel","trackerType":"None","label":"Row5","lz":0.046,"normal":[0,0,1],"showLabel":false,"cz":0.5000000074505806,"selected":false,"orientation":"Landscape","lx":17.712,"ly":1.984,"rotation":[0,0,0],"cy":0.35915527919266454,"drawSunBeam":true,"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-350P-FG"},{"type":"Foundation","cx":0.3190918347725322,"cy":-2.2556492768451117,"cz":0.15,"lx":17.098921077121087,"ly":1.3533895061041852,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gczoe9MamkUMzTbQUC2KQN","textureType":"Foundation Texture #4"},{"type":"Foundation","cx":0.28073712728172673,"cy":2.9801823965779324,"cz":0.15,"lx":17.098921077121087,"ly":1.3533895061041852,"lz":0.3,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #4","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"1Tke71vAoWuRt2r5v2CSYZ","selected":false},{"type":"Tree","name":"Dogwood","cx":7.740549835438854,"cy":0.017840498094405355,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"35HtXQRVRTJqsvcy71eZBd","selected":false},{"type":"Tree","name":"Dogwood","cx":-7.914181447469746,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"fmSSfxugyyXcaFPGp5J2GH","selected":false},{"type":"Tree","name":"Dogwood","cx":-6.507390701525628,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"r1axrjm2UGjTBQPRnRKw1U","selected":false},{"type":"Tree","name":"Dogwood","cx":-5.10059995558151,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"o6SdXUMbUBjNMc2SCs1Pqu","selected":false},{"type":"Tree","name":"Dogwood","cx":-3.693809209637392,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"nkBbAZdoKvnThFLy1td116","selected":false},{"type":"Tree","name":"Dogwood","cx":-2.2870184636932738,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"srkmySETFJsYm7J8quA3u2","selected":false},{"type":"Tree","name":"Dogwood","cx":-0.8802277177491555,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"2kmwtuQn7hFn7tffKEXSXb","selected":false},{"type":"Tree","name":"Dogwood","cx":0.5265630281949627,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"fG9ydmQQYpah6b1GcbZ59Q","selected":false},{"type":"Tree","name":"Dogwood","cx":1.933353774139081,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"cgtEAVRi5nWuhmKxX6g4z5","selected":false},{"type":"Tree","name":"Dogwood","cx":3.340144520083199,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"przZJKcdsmf3AyEn87SwPT","selected":false},{"type":"Tree","name":"Dogwood","cx":4.746935266027317,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"wUrT7zxrNMXpZdhUKyq5x6","selected":false},{"type":"Tree","name":"Dogwood","cx":6.153726011971435,"cy":-0.08805764356760193,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1Tke71vAoWuRt2r5v2CSYZ","id":"wntymhbHuaV7gtGi2EKDo7","selected":false},{"type":"Tree","name":"Dogwood","cx":-7.921728516250141,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"v9KQQQuSFRs8JqvZtTpA91","selected":false},{"type":"Tree","name":"Dogwood","cx":-6.514937770306023,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"i9DpJbmib5K1p7nV3kHbAn","selected":false},{"type":"Tree","name":"Dogwood","cx":-5.108147024361905,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"abX7uxAMQEagSgZXGMDfc4","selected":false},{"type":"Tree","name":"Dogwood","cx":-3.701356278417787,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"8jDYNfHuAJ7p879PSFKFS7","selected":false},{"type":"Tree","name":"Dogwood","cx":-2.294565532473669,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"pFBywXTiVuv1AmsiPtaaxP","selected":false},{"type":"Tree","name":"Dogwood","cx":-0.8877747865295509,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"o4cGsZNPakmckwZS1qrg9m","selected":false},{"type":"Tree","name":"Dogwood","cx":0.5190159594145674,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"34A3P6HT9WYg8AhiSpDvJ2","selected":false},{"type":"Tree","name":"Dogwood","cx":1.9258067053586856,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"fjnQ1uMpj1Uu2GoJFhim85","selected":false},{"type":"Tree","name":"Dogwood","cx":3.332597451302804,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"pPYcKdZTgMJwPHDdttFX1J","selected":false},{"type":"Tree","name":"Dogwood","cx":4.739388197246922,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"f7JCh9VAUmcsaYDVz921MP","selected":false},{"type":"Tree","name":"Dogwood","cx":6.14617894319104,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"dXMAvKBiQuUkM6raCwK6oQ","selected":false},{"type":"Tree","name":"Dogwood","cx":7.552969689135158,"cy":-0.05952638858756654,"cz":0.15,"lx":1.4067907459441182,"lz":0.8956183337957155,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gczoe9MamkUMzTbQUC2KQN","id":"jLd4TSy4qBALW8xPSrjLrR","selected":false},{"type":"Human","name":"Jack","cx":4.64411436627465,"cy":-1.2366715485892947,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"hYuqwxLBfjhYZrxPJu2S8L","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":21,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[18.48895144187419,-11.785046125916908,7.149509433378907],"panCenter":[-0.011430693478356556,-0.017971518365828498,0],"orthographic":false,"enableRotate":true,"cameraZoom":45.44146361606706,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.2201113364586017,47.99999980190954],"panCenter2D":[2.68477267877577,-0.22006333432578373,5.501827899659354e-7],"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showMapPanel":false,"solarRadiationHeatMapMaxValue":4,"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":205,"height":68}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Agrivoltaics"]}')},497:function(e){e.exports=JSON.parse('{"docid":"3kTPvbTLo3JfCvHCNFYb8C","time":"02/02/2023 05:19 pm","timestamp":1675376390119,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"10/01/2022 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true},"elements":[{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0001687190273044117,"cy":-0.1827633083380377,"cz":0.5000000074505806,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"snQKvKf7xPrhuT28Bo2tYv","selected":false,"dailyYield":20.344194814255086,"label":"R22"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0005055611729018629,"cy":0.005909338720999285,"cz":0.5000000074506161,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"s6gwZqoX59Afjq9iWzuivT","selected":false,"drawSunBeam":false,"dailyYield":20.344194814255086,"label":"R23"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0008424033184993142,"cy":0.19458198578003624,"cz":0.5000000074506517,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pbozwPgQw2bzssDtJKTqSk","selected":false,"dailyYield":20.301130494002802,"label":"R24"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0001681231182930395,"cy":-0.37143595539707464,"cz":0.5000000074505451,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"3nSBw847J9tSxs8CwWughr","selected":false,"label":"R21","dailyYield":20.423474876035336},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640967653,"cy":0.38325463283907324,"cz":0.5000000074506872,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7nkGUQpHaM9zN22MJgfSvf","foundationId":"7nkGUQpHaM9zN22MJgfSvf","id":"pu9LeYFSmjuxaejn2VSzZ1","selected":false,"dailyYield":20.34600992389522,"label":"R25"},{"type":"Foundation","cx":9.631391045182012,"cy":-0.034724141127635555,"cz":0.05,"lx":18.175146995703113,"ly":15,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7nkGUQpHaM9zN22MJgfSvf","selected":false},{"type":"Human","name":"Jack","cx":-0.1594284211117477,"cy":-6.960741063855943,"cz":-1.7763568394002505e-15,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"d3bJG1MfPQqauwCeM9B8UL","selected":false,"ly":0.6},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0001687190273044117,"cy":-0.23276330833803774,"cz":0.5000000074505806,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"oPGVYYGkGqjKAWacgXTr35","selected":false,"dailyYield":11.705639294931665,"label":"R12"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0001681231182930395,"cy":-0.37143595539707464,"cz":0.5000000074505451,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"aiWW32QVkCjCBwtDMtjsXr","selected":false,"dailyYield":20.423474876035336,"label":"R11"},{"type":"Foundation","cx":-9.466959404203182,"cy":-0.00920136097199542,"cz":0.05,"lx":18.175146995703113,"ly":15,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","id":"7LGxrgEwehUWBo5dH7C67q","selected":false},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0005055611729018629,"cy":-0.09409066127900084,"cz":0.5000000074506161,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"gFDw5Wxzxz1fZY32qoSLoy","selected":false,"dailyYield":11.694143838550957,"label":"R13"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0008424033184993142,"cy":0.044581985780036054,"cz":0.5000000074506517,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"3seUSu69aBJbCMJ1QTweLi","selected":false,"dailyYield":11.705639294931665,"label":"R14"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0011792454640967656,"cy":0.18325463283907295,"cz":0.5000000074506872,"lx":15.744,"ly":1.984,"lz":0.046,"trackerType":"None","tiltAngle":0.5235987755982988,"relativeAzimuth":0,"orientation":"Landscape","poleRadius":0.05,"poleHeight":1,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7LGxrgEwehUWBo5dH7C67q","foundationId":"7LGxrgEwehUWBo5dH7C67q","id":"hgGFwiEpscwf16U1io4zpD","selected":false,"dailyYield":11.705639294931665,"label":"R15"}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#16cda5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":true,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[24.035965357730035,-22.736672617703796,26.412316296073463],"panCenter":[14.509957884993852,2.01433946065165,2.596734324796276],"orthographic":false,"enableRotate":true,"cameraZoom":27.207482839996143,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"solarRadiationHeatMapMaxValue":4.5,"dailyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":253,"height":65}},"graphState":{"dailyPvIndividualOutputs":true,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of interrow spacing"]}')},498:function(e){e.exports=JSON.parse('{"docid":"69tJrD9Uz8P8feZdzUtyXN","time":"05/20/2022 12:16 pm","timestamp":1653063377435,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":37.44574069680563,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-6.249946169311531,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"41800 Sanl\xfacar la Mayor, Seville, Spain","date":"3/22/2022 11:00:00 AM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":5,"cspTimesPerHour":1,"cspGridCellSize":5},"elements":[{"cy":53.463080949514506,"normal":[0,0,1],"lz":0.5,"ly":806.586647395053,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":11.016365885808142,"cz":0.25,"rotation":[0,0,0],"lx":870.6680312936733,"selected":false,"parentId":"Ground","locked":false,"solarPowerTower":{"towerHeight":40,"towerRadious":4}},{"type":"Human","name":"Jack","cx":-19.167451192300774,"cy":-309.3414199054706,"cz":0,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.8},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.0019164258394133288,"cy":-0.4158344145798274,"cz":0,"lx":12,"ly":10,"lz":0.1,"showLabel":false,"label":"4","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":25.59597205852084,"yearlyYield":311.4614380820491,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.007376001317235639,"cy":-0.36554470178529136,"cz":0,"lx":12,"ly":10,"lz":0.1,"showLabel":false,"label":"3","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":28.888231364804646,"yearlyYield":341.6536704139208,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.20537660531292481,"cy":-0.4193704100106933,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"label":"2","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":false,"dailyYield":23.314190283597984,"yearlyYield":285.77957159626914,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.09582112405795708,"cy":-0.4382290523086443,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"label":"1","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":false,"dailyYield":29.108913473883288,"yearlyYield":347.0340046876023,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.054863159129938666,"cy":-0.464159685468327,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kTbu5NQZzH6fiJzt2zLCpV","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.11037999199881661,"cy":-0.46023080165625374,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ugqyZH3Bjuab2xu6Qr2AeU","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.112199850491424,"cy":-0.3934397768510106,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k7rmzdYXVhRoVennqPqJYd","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.11802339766776783,"cy":-0.41308419591137624,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jSyunViQPLX4rv6KUBXXTZ","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.15769631280660995,"cy":-0.4511943688884857,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q1mgBumMQuofVfZ58dfPgn","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.039576347792036205,"cy":-0.442943712883132,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1BaYAuYZtqhDEGCFRqXDcs","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.02792925343934858,"cy":-0.3761526880778888,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4sC4oY8P4gCm2XiADRkgDQ","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.07725856743336128,"cy":-0.42251351706035173,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k2hvdFozuZeFRMXA2gCxru","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.08781374669048435,"cy":-0.3977615490442911,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5gLYoZoHmvvc2dfNpBoMHu","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.10419247312395133,"cy":-0.3682949204537425,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qoUTmK9iTzsVRu26aQmb6S","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1445933316598364,"cy":-0.3553296038739013,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aaDc1Nt2XKdpoCZWcocB2i","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.005363008131016386,"cy":-0.38597489760807163,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bLKFf4eYJctoWDbAWu1oSp","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1314903505130629,"cy":-0.4657312389931562,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"svsNMecQbfU155PmYUZ3Lt","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.12457488824115463,"cy":-0.36004426444838894,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5WMpX8TYy1KfLhVCYdMj1p","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.16424780337999675,"cy":-0.38518912084565715,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rLs3CXHWy1yv3CpNwWpHSg","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.16934340715929755,"cy":-0.4067979818120592,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iYKv2L4bbvL99cSYqy9g78","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.04086139758121251,"cy":-0.3297918590954259,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6h32hqP5LZJr3g6KkvENFf","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.05978792590432987,"cy":-0.38361756732082763,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hJpPNqZeYCYBc9ZnrtL8rd","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.014291463589143885,"cy":-0.3961899955194619,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oKHW4guazpWYWFUbcAtx78","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.015554215689618007,"cy":-0.40483353990602267,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jGpvLznPcPbkxgRNT7LmEG","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.030306218324089352,"cy":-0.40876242371809585,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7v652Vk2Y4W8Ugs74iPYyx","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.18645007698980745,"cy":-0.40994108886171765,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wmMQERU6EmYPAHq1HGq5G1","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1646117750785182,"cy":-0.42172774029793714,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qmEBaJnQ1mYuWRgutUUj45","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.025574586243310056,"cy":-0.3482576130121696,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hgFFjf5NE1fWwscAHtJz9W","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.14677716185096534,"cy":-0.38086734865237665,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5E44DCctaDCtPRiHgiN8Co","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1871780203868504,"cy":-0.38833222789531546,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h3FAf2Pb5iRxcMgjsAapYN","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.2064685204084893,"cy":-0.39697577228187636,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"phQzzL3Mgfme6Exr5WqXA9","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.227942850621257,"cy":-0.40640509343085185,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gSGxJne57KgDvvhX1w8m4S","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.068887218367367,"cy":-0.33686384995715757,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nvkfziKtbczLEbZ9noiReH","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.09873289764612901,"cy":-0.34629317110613306,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e7BrgrYuxziAFGXqE8Paiu","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.04595700136051335,"cy":-0.3631873714980474,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6E7Q93GeP3kP1LK9YLZv9E","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.07815734783531385,"cy":-0.44765837345761983,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nSCCumTcS91dqnMuiik1qm","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.07980636932301162,"cy":-0.37300958102823034,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pmLUXug8LEht87AKuCxfbz","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.2483252657384603,"cy":-0.4201561867731079,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o54KAWAv76mbgsJ1MBkyC5","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.09999564974660309,"cy":-0.4610165784186685,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"f7h8FDUa15ALkGHaRaG5Hv","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.19736922794545209,"cy":-0.4417650477395101,"cz":0,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2waE2goJnuKsD2ZPsCBxqm","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.05542026552207203,"cy":-0.4134770842925835,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w5ovRP3PCZ5upU3ukAjjLY","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.22393916193752067,"cy":-0.43233572659053454,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jLzYFijeuhoktLs4FcLsmr","selected":false,"drawSunBeam":true,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.020285847770397398,"cy":-0.4260495124912175,"cz":0.5000000074506517,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"b3S1EEPjMRL48HLhjJkhr2","selected":false,"drawSunBeam":true,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.08890566178604883,"cy":-0.3231127566149015,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aqxtvZXmbpAutc5KFCX7w3","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.034844715711256906,"cy":-0.3985473258067056,"cz":0.5000000074506517,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qn5fUEqKYEJLMaMGhD5V2c","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.1817184449090281,"cy":-0.4291926195408761,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4t86vx9fAWouPiFQswUJGQ","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.073789687453056,"cy":-0.4728032298548879,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rufeUy74dsTyxkeFYKX4qa","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.028850331530003406,"cy":-0.37536691131547417,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6GXoab5MEeebRm4uGu1EG9","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":0.04030429118907922,"cy":-0.42172774029793714,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w5TEya7XNeGuhPop6Pj6Es","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.11838736936628931,"cy":-0.43272861497174187,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eDoKDbTtFpnA5S8UAeT5JD","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.13840581278497113,"cy":-0.41740596810465674,"cz":0.5000000074505806,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bybZmMq5HCRUCdJHjru2JV","selected":false,"drawSunBeam":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.13513006749827772,"cy":-0.4437294899555085,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hrEeQaibYaP57iKo4xufR4","selected":false,"towerId":"nHq7VyAiKvgNuPDrDMejYk"},{"type":"Heliostat","cx":-0.043409199470862934,"cy":-0.38833222820527735,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eMTdANgm4PdxeiHcfwzGxe","selected":false},{"type":"Heliostat","cx":0.05923081951219652,"cy":-0.3989402144978749,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t2umoGg8VspP5qdugHevfe","selected":false},{"type":"Heliostat","cx":0.05959479121071805,"cy":-0.4232992941327282,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xgWhQhAtyB8sh6AEqfnLMB","selected":false},{"type":"Heliostat","cx":0.05886684781367504,"cy":-0.44569393186154516,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4PiJNb4AiKgYWDFqfiLnsX","selected":false},{"type":"Heliostat","cx":0.08325295161461468,"cy":-0.4268352895635941,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uiJMkxjENj2xtf6Ek94NEJ","selected":false},{"type":"Heliostat","cx":0.10472728182738246,"cy":-0.4370503874749841,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xu9CszAWnNUQxfgY6e4BuN","selected":false},{"type":"Heliostat","cx":0.05013152704915935,"cy":-0.37222380457577764,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mNvmxvTfLNasgrJJBceUa2","selected":false},{"type":"Heliostat","cx":0.01773804588074696,"cy":-0.3392211805543633,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mPHMz8Zez8DHnqXVJDdKqX","selected":false},{"type":"Heliostat","cx":-0.11802339766776783,"cy":-0.3368638502671194,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3u148SBduXqFBbKh774JFp","selected":false},{"type":"Heliostat","cx":-0.16570369017408268,"cy":-0.3584727112335216,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dkiRia21pNiw2ZZ9ehmvPz","selected":false},{"type":"Heliostat","cx":-0.20901632229813968,"cy":-0.3702593626697411,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nCzcUVZHj8SBGWmTxeVCdH","selected":false},{"type":"Heliostat","cx":-0.2290347657168215,"cy":-0.37968868381871645,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1A8dsYXQfAQaXjXYHYypfP","selected":false},{"type":"Heliostat","cx":-0.186086105291286,"cy":-0.36318737180800925,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sWF3MtvJScjs42n3JPJzBs","selected":false},{"type":"Heliostat","cx":-0.15988014299773887,"cy":-0.3368638502671194,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qJ6i6BJYiz4BtphokxmqSr","selected":false},{"type":"Heliostat","cx":-0.13767786938792817,"cy":-0.33450651997987546,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8VArq9h668zQsZacfABpJx","selected":false},{"type":"Heliostat","cx":-0.10965204860177363,"cy":-0.3180052079691684,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hDWFzcdWPkLhpNc2qDGY97","selected":false},{"type":"Heliostat","cx":-0.07798651083040421,"cy":-0.3034683378644978,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g3osCpGC4VNFjdLEnR9ssL","selected":false},{"type":"Heliostat","cx":-0.04304522777234147,"cy":-0.29953945405242466,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5bEZH7wqmT7kFk43Sb7TJN","selected":false},{"type":"Heliostat","cx":-0.060515869301372795,"cy":-0.3164336544443391,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5KkN2FL8QnM1J53hB4Xn2H","selected":false},{"type":"Heliostat","cx":-0.02521061454478851,"cy":-0.3168265428255464,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kDCxHQF3XiaNTHNK5V66Ez","selected":false},{"type":"Heliostat","cx":-0.008467916412800107,"cy":-0.3022896727208758,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"crvXHP85BpYy7AfrCdfGqQ","selected":false},{"type":"Heliostat","cx":0.004635064733973385,"cy":-0.32154120340003417,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3MtreSAAK1C6J96mEDGMf5","selected":false},{"type":"Heliostat","cx":-0.012107633398015015,"cy":-0.33332785483625366,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e5jtkdQkg5vLr79YkGmJpg","selected":false},{"type":"Heliostat","cx":0.02574542324821971,"cy":-0.3105403287262294,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1YLAcSLk3xfAp4c5r9jnnW","selected":false},{"type":"Heliostat","cx":0.011550527005881632,"cy":-0.2956105702403515,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w1pjfJGLPZSQFpNzSdhVtD","selected":false},{"type":"Heliostat","cx":0.03520868740977837,"cy":-0.33214918969263163,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4HHLNX7pc8ynVjLa3M1tpQ","selected":false},{"type":"Heliostat","cx":0.045035923269858516,"cy":-0.3510078319905826,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ePKj6YLxFoSXibXbQUndAB","selected":false},{"type":"Heliostat","cx":0.043944008174294044,"cy":-0.3046470030081197,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6nSgZWsKWCHiVuWk3E9WHV","selected":false},{"type":"Heliostat","cx":0.030477055328999,"cy":-0.2865741374725833,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kT5YZAVhbb3hZCQWannx3E","selected":false},{"type":"Heliostat","cx":0.01737407418222549,"cy":-0.2677154951746322,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"giZWyJupVbt7L3N3Exx6KE","selected":false},{"type":"Heliostat","cx":-0.005556142824628219,"cy":-0.2783234814672297,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bzoJ5edfakL2yrcp9BQhB9","selected":false},{"type":"Heliostat","cx":-0.026302529640352984,"cy":-0.2865741374725833,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rKs5TmBLfGe1R4gmQLWbCL","selected":false},{"type":"Heliostat","cx":-0.062335727793980285,"cy":-0.29089590966586376,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2CFM3oUCe7xRVZWhn2bpoF","selected":false},{"type":"Heliostat","cx":-0.09727701085204306,"cy":-0.2999323424308765,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n3zXksYZLyDrdVy3Mr5bjz","selected":false},{"type":"Heliostat","cx":-0.1307624071160199,"cy":-0.3136834357758604,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tKTj5ruzDm2LDUQttBKZuC","selected":false},{"type":"Heliostat","cx":-0.15332865242435212,"cy":-0.30975455196378715,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8Wrax3edyeNcguwLnRGXNE","selected":false},{"type":"Heliostat","cx":-0.11765942596924632,"cy":-0.2912887980470435,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xe4keTpM3Nxqxi8VTBVkBA","selected":false},{"type":"Heliostat","cx":-0.10382850142542982,"cy":-0.2704657138430559,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cu8vDmF3mr6d486SRs8SVM","selected":false},{"type":"Heliostat","cx":-0.08453800140379099,"cy":-0.2779305930859948,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qVS1NQxjbM2xAQU2dHHvRU","selected":false},{"type":"Heliostat","cx":-0.0641555862865877,"cy":-0.2637866113625315,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bdggQyC48dvj95izyNr5AC","selected":false},{"type":"Heliostat","cx":-0.045593029661991816,"cy":-0.27360882089271443,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vPgz2pQL9AveqJGFTntUuC","selected":false},{"type":"Heliostat","cx":-0.02448267114774558,"cy":-0.2598577275504585,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4WD9oiEgpbrtpGdNkRWVx7","selected":false},{"type":"Heliostat","cx":0.054863159129938666,"cy":-0.2763590395611656,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1w2pYGTGqA6behkJEfLcAj","selected":false},{"type":"Heliostat","cx":-0.13949772788053558,"cy":-0.2932532399530801,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n8mK23ihYB6sUrakd88UX1","selected":false},{"type":"Heliostat","cx":-0.17553092603416284,"cy":-0.3140763241570676,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gzBAFojWt7yjzaVPbVngNE","selected":false},{"type":"Heliostat","cx":-0.18353830340163557,"cy":-0.33725673864829914,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qW18dh2SyEZXtSs5ZncgMF","selected":false},{"type":"Heliostat","cx":-0.20610454870996778,"cy":-0.34236428760399423,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1MzjLhQ1k16rfXY1x49HYf","selected":false},{"type":"Heliostat","cx":-0.16570369017408268,"cy":-0.28696702585376305,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"smNLCMky9o9MmdQJkRyv9F","selected":false},{"type":"Heliostat","cx":-0.2516010110251537,"cy":-0.39068955849252135,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nyYdfe47Tnu2fkkQUpKj1e","selected":false},{"type":"Heliostat","cx":0.057410961019589084,"cy":-0.323898533687278,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rZGMeCkjHUbBEScHVmXvBY","selected":false},{"type":"Heliostat","cx":0.0650543666885403,"cy":-0.3466860597973021,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6UVpSPL6NHwkMTGMAGWMbc","selected":false},{"type":"Heliostat","cx":0.06942202707079821,"cy":-0.3675091440012898,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vUjENc3i3UFtAwACin59Nf","selected":false},{"type":"Heliostat","cx":0.09089635728356589,"cy":-0.38793933982407003,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bYd2te8sj3qc6nKgdBwKUp","selected":false},{"type":"Heliostat","cx":0.09053238558504442,"cy":-0.3682949207637044,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"x5qvaDTKu24dWCcZ1x9b4h","selected":false},{"type":"Heliostat","cx":0.0861647252027866,"cy":-0.3459002830348876,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sYrumHzsSzJLGjGWnmW78L","selected":false},{"type":"Heliostat","cx":0.07997720632792127,"cy":-0.32154120340003417,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3atSERmb5y2o1fPkn3U3Sb","selected":false},{"type":"Heliostat","cx":0.06651025348262624,"cy":-0.2967892353839734,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q8fwLHL82vQ4h4iHmsSoAx","selected":false},{"type":"Heliostat","cx":0.09089635728356589,"cy":-0.2963963470027661,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rUX6PqLyYSPibFZmVVGKj1","selected":false},{"type":"Heliostat","cx":0.09853976295251717,"cy":-0.32154120340003417,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a71RHg1a5mbtqFmRR1LeB1","selected":false},{"type":"Heliostat","cx":0.10763905541555435,"cy":-0.34629317141609495,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rCZjDPu6hrV9hwK1sMBx7P","selected":false},{"type":"Heliostat","cx":0.11091480070224773,"cy":-0.37104513943215556,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3YTfKHrGkuKHP7GdujyydA","selected":false},{"type":"Heliostat","cx":0.10982288560668325,"cy":-0.39383266554217977,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kT6EXQ8Utyx3h6apaMYxSG","selected":false},{"type":"Heliostat","cx":0.11091480070224773,"cy":-0.41544152650858196,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nStqgmJn2aLSvqHghG4Pbp","selected":false},{"type":"Heliostat","cx":0.1287494139298006,"cy":-0.421727740607899,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2E7Vc7NyKu7SLYD6MSVgmr","selected":false},{"type":"Heliostat","cx":0.1251096969445857,"cy":-0.44294371319309384,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iJhGibH8hVHt3XFxuZ2EVR","selected":false},{"type":"Heliostat","cx":0.14003253658396672,"cy":-0.4547303646293133,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6ZA3XqcWxDfsN537EKY5vj","selected":false},{"type":"Heliostat","cx":0.14913182904700392,"cy":-0.4311570617568746,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4cKpMCMNmB9Ss7pKbSCSsB","selected":false},{"type":"Heliostat","cx":0.16660247057603533,"cy":-0.4445152667179231,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w54968Xiwo6dPjYZQGbBrb","selected":false},{"type":"Heliostat","cx":0.17278998945090057,"cy":-0.4213348522266917,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6dckGmumPNSkFhq8gMs3qu","selected":false},{"type":"Heliostat","cx":0.1920804894725394,"cy":-0.4354788339501549,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cwVuAxoZiUC1H5Wje2gfod","selected":false},{"type":"Heliostat","cx":0.15095168753961133,"cy":-0.40561931697839915,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ozYpByUV6vBaKhUdY2r3nZ","selected":false},{"type":"Heliostat","cx":0.13238913091501553,"cy":-0.39697577259181077,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3E8kv3kvDQYPCgHGrTc3BH","selected":false},{"type":"Heliostat","cx":0.1316611875179725,"cy":-0.37379535810057923,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"umYgCpqMpXPc71s29rAX3g","selected":false},{"type":"Heliostat","cx":0.1298413290253651,"cy":-0.35022205522814037,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4yFSXLahhMtG3gK56eWGg1","selected":false},{"type":"Heliostat","cx":0.1251096969445857,"cy":-0.327041640736909,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aTpNU9JuuqwPxdobYW4pBR","selected":false},{"type":"Heliostat","cx":0.1174662912756345,"cy":-0.29757501214636045,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gNvHaW33K459kqY9u7BepY","selected":false},{"type":"Heliostat","cx":0.15131565923813287,"cy":-0.35650826932745744,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8qgkQF7DCx79d2LxBy7hix","selected":false},{"type":"Heliostat","cx":0.15167963093665435,"cy":-0.38243890248714013,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mPQfhExNEGN2zwyjRVpTpq","selected":false},{"type":"Heliostat","cx":0.17388190454646504,"cy":-0.39540421906698137,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pDgnwEkgpE6PGtyJCXjDhU","selected":false},{"type":"Heliostat","cx":0.1786135366272444,"cy":-0.3682949207636769,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cRreS1UagGBcRUbiWtwtBd","selected":false},{"type":"Heliostat","cx":0.19535623475923283,"cy":-0.40719087050320085,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s7q7X6xUdhEACPxPGQCEo9","selected":false},{"type":"Heliostat","cx":0.19826800834740468,"cy":-0.3726166929569573,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gFGfHzaaJc5xaE2fHD963c","selected":false},{"type":"Heliostat","cx":0.2153746781779146,"cy":-0.41819174517700564,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nw8E1dCRxuQCPzw91T7NeE","selected":false},{"type":"Heliostat","cx":-0.22794285062125708,"cy":-0.3557224925650703,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jrTEnFovS1iifhRBBxC77v","selected":false},{"type":"Heliostat","cx":-0.27198342614235704,"cy":-0.405226428597192,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1HaVkVgC69Exxa4P4AuMRU","selected":false},{"type":"Heliostat","cx":-0.2483252657384603,"cy":-0.3565082693274851,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qspACkTkjBfrx3FAarHvtL","selected":false},{"type":"Heliostat","cx":-0.23267448270203633,"cy":-0.32979185940538763,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7itXceUu3MAQZY9syuA2us","selected":false},{"type":"Heliostat","cx":-0.21302001098187603,"cy":-0.30739722167657085,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w8VQxzaXGr6shiYCtL94LK","selected":false},{"type":"Heliostat","cx":-0.19045376567354383,"cy":-0.2877528026162052,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mYnEgxKjquMfzKB4NWPwU3","selected":false},{"type":"Heliostat","cx":-0.16424780337999675,"cy":-0.26850127193704687,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e9bXB5WFMrZz7h5xt76LKd","selected":false},{"type":"Heliostat","cx":-0.13804184108644962,"cy":-0.25632173211962017,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gtNeJEcTRyufHLL6AokGYa","selected":false},{"type":"Heliostat","cx":-0.11074396369733809,"cy":-0.2464995225894373,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6fwRxb24K57nabopN8NEmN","selected":false},{"type":"Heliostat","cx":-0.08126225611709761,"cy":-0.23549864791563258,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aUiiaf5Cq9kXkR5KzivtS2","selected":false},{"type":"Heliostat","cx":-0.05141657683833565,"cy":-0.23274842924718137,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wXCs59HycWywP6dVX3RxFD","selected":false},{"type":"Heliostat","cx":-0.023390756052181078,"cy":-0.23156976410080404,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uQNYdG6Cfa2DE4YjEyjiXC","selected":false},{"type":"Heliostat","cx":0.008274781719188292,"cy":-0.2315697641035319,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"obhiNFSAxtYYjH2nQGrkoa","selected":false},{"type":"Heliostat","cx":0.035208687409778276,"cy":-0.2406061968713278,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iY6QUX8HJxFfcjwEAuVe3x","selected":false},{"type":"Heliostat","cx":0.06177862140184686,"cy":-0.24846396449547406,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gxxQzBr3C3fZtBLQB4XzAE","selected":false},{"type":"Heliostat","cx":0.0887125270924369,"cy":-0.26221505783772997,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpt9FEDEbwRR242xB1y6tv","selected":false},{"type":"Heliostat","cx":0.11528246108450549,"cy":-0.2802879233732664,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fPPU5HqYqZdh2QetXJ2p7A","selected":false},{"type":"Heliostat","cx":0.13894062148840217,"cy":-0.2991465656684621,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"esagbCU76EkkhqebaZmmUf","selected":false},{"type":"Heliostat","cx":0.15932303660560546,"cy":-0.31918387311276286,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"prTqpkxvMuTWkeLJ8y2CgD","selected":false},{"type":"Heliostat","cx":0.17970545172280875,"cy":-0.3443287295100309,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u7j14TV18gpXBNzei9H8w2","selected":false},{"type":"Heliostat","cx":0.2022716970311409,"cy":-0.3498291668469332,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5JiM8J57ngXan5UMty5HT8","selected":false},{"type":"Heliostat","cx":0.21937836686165088,"cy":-0.37968868381871645,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uUofaDUcmMKbxLFL1oxkSL","selected":false},{"type":"Heliostat","cx":0.23976078197885417,"cy":-0.38911800496769194,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uJfXK4rjScs7gFncayPnY8","selected":false,"drawSunBeam":true},{"type":"Heliostat","cx":0.22410999894243014,"cy":-0.35611538094627776,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dzS7KY8fPB4mrrF8bFf3Lo","selected":false},{"type":"Heliostat","cx":0.24776815934632693,"cy":-0.36358026018921674,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vNqpyqbCLz9tXo7A7xujcB","selected":false},{"type":"Heliostat","cx":0.26997043295613765,"cy":-0.3726166929569849,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4ko5XUjuP9RKm463DmDooY","selected":false},{"type":"Heliostat","cx":0.1840731121050666,"cy":-0.32468431044969276,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"77xeiEQazj2KRhrDXmVzHK","selected":false},{"type":"Heliostat","cx":0.20554744231783434,"cy":-0.3258629755933147,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pQy87m9iTvmkmNKh4GrwyX","selected":false},{"type":"Heliostat","cx":0.22993354611877403,"cy":-0.3317563013114243,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xeup3LyMyTrCKir2W1QKdM","selected":false},{"type":"Heliostat","cx":0.25468362161823516,"cy":-0.3392211805543633,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qrKKoaqQCswPARya6NG7Vs","selected":false},{"type":"Heliostat","cx":0.27797781032361035,"cy":-0.3423642876040219,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pfjQmBxWC1Ae9mM7CjmUUs","selected":false},{"type":"Heliostat","cx":0.16150686679673432,"cy":-0.2956105702403516,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6aCwPMcxiojnSCdYJ4wNko","selected":false},{"type":"Heliostat","cx":0.1848010555021095,"cy":-0.29875367729001007,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"auwCCmHc32MJvNubS1T1L3","selected":false},{"type":"Heliostat","cx":0.20991510270009217,"cy":-0.2979679005275954,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cb6NtvzZtpvN9xsruY7hxj","selected":false},{"type":"Heliostat","cx":0.18334516870802356,"cy":-0.2696799370806689,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h9tGbEHGsevbnpUXRoj68w","selected":false},{"type":"Heliostat","cx":0.16041495170116993,"cy":-0.2724301557491201,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"woL52bcsabXgpYHzS37qFg","selected":false},{"type":"Heliostat","cx":0.13821267809135915,"cy":-0.2743945976551566,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3nJXEXXtvwSxAapdRK8NEU","selected":false},{"type":"Heliostat","cx":0.11164274409929059,"cy":-0.25592884373841296,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dcTSduTDfjsNkLxPMwiTbk","selected":false},{"type":"Heliostat","cx":0.1320251592164939,"cy":-0.24807107611426668,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sBMKWzPqqAL7Zab4fQ5qqk","selected":false},{"type":"Heliostat","cx":0.156775234715955,"cy":-0.24453508068340082,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uQW7nfUe52sF2ZYqMceBPR","selected":false},{"type":"Heliostat","cx":0.10618316862146829,"cy":-0.23274842924718148,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gDJUNMNv2fBuCXvNz8J9xz","selected":false},{"type":"Heliostat","cx":0.12947735732684348,"cy":-0.22449777324182785,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"d6wJ1UkGVratdvd1YcRyf5","selected":false},{"type":"Heliostat","cx":0.08398089501165754,"cy":-0.2402133084901204,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pnwY9vWpqTutfMQk6qVUEd","selected":false},{"type":"Heliostat","cx":0.07488160254862036,"cy":-0.2170328939961335,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9yJRVguxm2r3mSoLCoLCTo","selected":false},{"type":"Heliostat","cx":0.054135215732895585,"cy":-0.2276408802914864,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bcvVnYRe7XAmehyShvHG4A","selected":false},{"type":"Heliostat","cx":0.09671990445990958,"cy":-0.20838934961232802,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dt7UVCgK4oYcArc7w2oh6S","selected":false},{"type":"Heliostat","cx":-0.2708915110467926,"cy":-0.3631873718080094,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fP7CoUPJXXfAbKaQg7Vxiz","selected":false},{"type":"Heliostat","cx":-0.29382172805364637,"cy":-0.3702593626697411,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q3QCtRsjU5g348zquVGT6U","selected":false},{"type":"Heliostat","cx":-0.3000092469285116,"cy":-0.3459002830348876,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"npmRnivscsJpT65RjQuyWE","selected":false},{"type":"Heliostat","cx":-0.3254872658250157,"cy":-0.350222055228168,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aMe7m5ym2D1ye9JGywHJp4","selected":false},{"type":"Heliostat","cx":-0.3061967658033769,"cy":-0.31643365444433913,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"x6jK1HT196nDZpyUbLsgr1","selected":false},{"type":"Heliostat","cx":-0.28144669030391567,"cy":-0.31289765901347333,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gFEgPjqWAT6jwNBL8DPadb","selected":false},{"type":"Heliostat","cx":-0.27416725633348593,"cy":-0.3372567386483267,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g65dCH4Q2jLJsbDZ61ZYsF","selected":false},{"type":"Heliostat","cx":-0.25087306762811074,"cy":-0.33293496645504633,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eac2nmUN2zb5BwB2jyKPsx","selected":false},{"type":"Heliostat","cx":-0.2559686714074116,"cy":-0.3101474403450222,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2AwKtqmv9rBFEMsfpNMYmE","selected":false},{"type":"Heliostat","cx":-0.2574245582014975,"cy":-0.28500258394775413,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5CasrCRncJRWJd761ErCUY","selected":false},{"type":"Heliostat","cx":-0.23158256760647195,"cy":-0.25828617402565685,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9ZPBVxh6yErf9tk1x8bcei","selected":false},{"type":"Heliostat","cx":-0.23413036949612234,"cy":-0.28382391880413216,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qMvixKdLEKLj2KdxZ4Qc5j","selected":false},{"type":"Heliostat","cx":-0.23303845440055787,"cy":-0.30739722167657096,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vHCBTramJGKkCoc17G8w6M","selected":false},{"type":"Heliostat","cx":-0.21047220909222566,"cy":-0.28539547232896145,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jcFjeFAEwtPS1NdpSqySNN","selected":false},{"type":"Heliostat","cx":-0.2075604355040538,"cy":-0.2598577275504861,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"odG4uWtszFcFLXppnq6LTE","selected":false},{"type":"Heliostat","cx":-0.18572213359276454,"cy":-0.26535816488738845,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aiJA7beNej5o6BHcnWJBqC","selected":false},{"type":"Heliostat","cx":-0.18171844490902817,"cy":-0.23707020113050004,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1VU7yTZrVeHM5DLMgFzzbW","selected":false},{"type":"Heliostat","cx":-0.20464866191588185,"cy":-0.23353420600959607,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uUYHVbTbxr4tecMfV6CqzJ","selected":false},{"type":"Heliostat","cx":-0.15660439771104553,"cy":-0.25042840640151054,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"brUZr84cwNpf9Pv6XatvDd","selected":false},{"type":"Heliostat","cx":-0.13003446371897695,"cy":-0.23707020144046193,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6k3sEssXxYQA6FoYB2hbhc","selected":false},{"type":"Heliostat","cx":-0.10091672783725796,"cy":-0.22567643838544985,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dpK548QXB9AsPut3M9Vcnb","selected":false},{"type":"Heliostat","cx":-0.06961516176441004,"cy":-0.22174755457334913,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rtAwYocNSDA6e4Za64GAHv","selected":false},{"type":"Heliostat","cx":-0.03831359569156213,"cy":-0.21860444752369065,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jkbGDBANcy5EkzJfgAS6kT","selected":false},{"type":"Heliostat","cx":-0.009559831508364626,"cy":-0.21388978694920285,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uiJqTbavrRHEj1q5r4U8Sg","selected":false},{"type":"Heliostat","cx":0.025017479851176642,"cy":-0.21624711723644674,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tuZYTjdonfFPX1bpg7y2ib","selected":false},{"type":"Heliostat","cx":0.04430797987281548,"cy":-0.2056391309438493,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"r4K4Z2bUpqY9FZaarCV1EY","selected":false},{"type":"Heliostat","cx":0.06578231008558323,"cy":-0.19267381436400796,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tJMsMVYvUGopRwcThFGEkr","selected":false},{"type":"Heliostat","cx":0.009730668513274195,"cy":-0.19856714008211768,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1EfzqCs8cXPwvLAwQzbRpo","selected":false},{"type":"Heliostat","cx":-0.025938557941831565,"cy":-0.19660269817608111,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"75CWYjqVhH1TfFGgb42qY2","selected":false},{"type":"Heliostat","cx":0.028657196836391532,"cy":-0.1824587164526178,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tPC5C2vfzREdHf8vqzTMzw","selected":false},{"type":"Heliostat","cx":-0.005920114523149727,"cy":-0.17892272102175202,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9vv8piBWmfsjf8ThwaysgA","selected":false},{"type":"Heliostat","cx":-0.04013345418416953,"cy":-0.17970849778692202,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pLA5NWUpepKR65o6v964r9","selected":false},{"type":"Heliostat","cx":-0.07507473724223238,"cy":-0.1867804886459258,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mUep51aC7r6anQJ2Y69oWq","selected":false},{"type":"Heliostat","cx":-0.10783219010916623,"cy":-0.1950311446512794,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v8aDpwcpvGcDg3v8p4qNKb","selected":false},{"type":"Heliostat","cx":-0.14240950146870754,"cy":-0.2009244703693891,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8BebM2PFswwW6mD8cum1bR","selected":false},{"type":"Heliostat","cx":-0.17407503924007692,"cy":-0.2162471172364743,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6RzznrEY6WFg8gVGqs15oP","selected":false},{"type":"Heliostat","cx":-0.05760409571320095,"cy":-0.19738847493852332,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aLcHwQEUZ4M4zGv7CBgFgZ","selected":false},{"type":"Heliostat","cx":-0.08672183159491996,"cy":-0.20485335418146225,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9oqQfqaBV4xJeZR3tB1T2T","selected":false},{"type":"Heliostat","cx":-0.12093517125593976,"cy":-0.21742578238009624,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5txUysL5P5gEVTjd4qAbBd","selected":false},{"type":"Heliostat","cx":-0.15078085053470172,"cy":-0.22567643838544985,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nxjHGtH2QdDPPuNWARdYaV","selected":false},{"type":"Heliostat","cx":0.08580075350426505,"cy":-0.18324449321506,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3MqWmh3QRvAPZiVFebexdQ","selected":false},{"type":"Heliostat","cx":-0.02266281265513821,"cy":-0.15770674843658467,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5EhLWiwwn5wwEm8Cab5Rch","selected":false},{"type":"Heliostat","cx":-0.1322182939101059,"cy":-0.17381517206608452,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jbXdsdAziZsqZTJyYSaySe","selected":false},{"type":"Heliostat","cx":-0.3302995564539437,"cy":-0.3232776394449547,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pzkMpsvKdJRAhMZuBmbsKe","selected":false},{"type":"Heliostat","cx":-0.2919615095342722,"cy":-0.2642858401101529,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oySBSMeHYHH3hssNqfJFt4","selected":false},{"type":"Heliostat","cx":-0.3097864662694538,"cy":-0.2904751246399958,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpTYVzTYQTHThRcwDXQgp7","selected":false},{"type":"Heliostat","cx":-0.27314627742491365,"cy":-0.24237235713620253,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5jcBZmRyCrqNubtcJcYmJ3","selected":false},{"type":"Heliostat","cx":-0.2508650815059366,"cy":-0.22045887416225235,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ihBmE1AmF8hgbvfU54TBod","selected":false},{"type":"Heliostat","cx":-0.22660333483860592,"cy":-0.20175224235522163,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vNktHzm8eVBrmY9ceJEyKh","selected":false},{"type":"Heliostat","cx":-0.20333186354545205,"cy":-0.1835800857426775,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aXsDLYWFiK5tzWC7G7kV8N","selected":false},{"type":"Heliostat","cx":-0.17659442844267947,"cy":-0.16968373068602616,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wrEAnzFvbwLn8hcqMNt2T6","selected":false},{"type":"Heliostat","cx":-0.15183754408826042,"cy":-0.1589942267962943,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aHFiestWCCRbctVu4eYUBx","selected":false},{"type":"Heliostat","cx":-0.12212928286295759,"cy":-0.14937367329553564,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iQyvk9vYygwnymNpLwA1ob","selected":false},{"type":"Heliostat","cx":-0.09242102163765474,"cy":-0.14349444615618318,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wU6MsDbikDwda4SfGFTpkJ","selected":false},{"type":"Heliostat","cx":-0.06518844884779378,"cy":-0.13761521901683066,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1MMFkArxgEmQhKrKtjXQNe","selected":false},{"type":"Heliostat","cx":-0.03647046299666775,"cy":-0.13547731823888426,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nMNiG48VARtnEA4MPhmCia","selected":false},{"type":"Heliostat","cx":-0.0057719263971881,"cy":-0.13547731823888426,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"juXSYXCPjT1kSTpJyz4PZH","selected":false},{"type":"Heliostat","cx":0.021955784079761214,"cy":-0.1392186446002904,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xm44c3baqJPcnjTqQboEwN","selected":false},{"type":"Heliostat","cx":0.05265432067924076,"cy":-0.1461668221286161,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ez6bNdTTq8NKVxiW1kxkEB","selected":false},{"type":"Heliostat","cx":0.07939175578201328,"cy":-0.15525290043488818,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jAsrrCW77dFgPQqWJowsZq","selected":false},{"type":"Heliostat","cx":0.10563405319769754,"cy":-0.1664768795191066,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6p95wM2zt7dF6VyVSYTa8Y","selected":false},{"type":"Heliostat","cx":0.13286662598755838,"cy":-0.18251113535370433,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"urDco6achFzxwb6nW5NRE4","selected":false},{"type":"Heliostat","cx":0.15811864802906586,"cy":-0.1980109159938155,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nbH94KdABoDtfJEKfjLTiP","selected":false},{"type":"Heliostat","cx":0.18089498163513137,"cy":-0.21244174624495343,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ovcrGPa9SJFbnrGQ2a6DuR","selected":false},{"type":"Heliostat","cx":0.20218590217993174,"cy":-0.23328627882993053,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jA29coTpxRTwbmADu66SZT","selected":false},{"type":"Heliostat","cx":0.2234768227247321,"cy":-0.25626871219285396,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wYgH98FR9WAhRGHRksz5bD","selected":false},{"type":"Heliostat","cx":0.24229205483409053,"cy":-0.2840614223061567,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rvQJA6SbPF1oUJTEumsFBN","selected":false},{"type":"Heliostat","cx":0.26061214925636067,"cy":-0.30757833086356673,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xxokrXE6rBVWV3B4eJnjZt","selected":false},{"type":"Heliostat","cx":0.2848738959236912,"cy":-0.3102507068359997,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sAxtEYsJmsyoXdPfmuc1s8","selected":false},{"type":"Heliostat","cx":0.31161133102646393,"cy":-0.3118541324194594,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8T4wmqCeWkBAqrmuSXUrRA","selected":false},{"type":"Heliostat","cx":0.2932912366041937,"cy":-0.2824579967226693,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ai9GvKeDbhVcVvUsoTBxvk","selected":false},{"type":"Heliostat","cx":0.26655380150142116,"cy":-0.2813890463336962,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oWG4eo4MGzPtqFQEAGgS9P","selected":false},{"type":"Heliostat","cx":0.24823370707915113,"cy":-0.25680318738731295,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uxuSeH1NdDDYDjVawn2W68","selected":false},{"type":"Heliostat","cx":0.22545737347308564,"cy":-0.2290104772740102,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dDuuVxV3oBzq3KrPvkBjRs","selected":false},{"type":"Heliostat","cx":0.20367131524119686,"cy":-0.20816594468903316,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rx1WFJ81DESFNcvGrHsJMP","selected":false},{"type":"Heliostat","cx":0.17990470626095456,"cy":-0.19052826327097566,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7sGn2cqtWU3Mo7BvT3jFuk","selected":false},{"type":"Heliostat","cx":0.15415754653235875,"cy":-0.17075268107497177,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rSmf7fDWBvbLdzxL8Xzz7s","selected":false},{"type":"Heliostat","cx":0.1279152491166746,"cy":-0.1536494748514009,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dADXAPCfntwkJab6qq7kB9","selected":false},{"type":"Heliostat","cx":0.10117781401390209,"cy":-0.14082207018372264,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qou5NZoEiG4Sej8W4a1Evy","selected":false},{"type":"Heliostat","cx":0.07097441510151088,"cy":-0.12959809109950424,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qF5JaFWnyFcKW3nRxNY7TE","selected":false},{"type":"Heliostat","cx":0.040771016189119595,"cy":-0.12158096318220536,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nCPi7SMXhZTpGxpiwtL6iF","selected":false},{"type":"Heliostat","cx":0.009082204215463229,"cy":-0.11730516162631263,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dWzE58GviTnatfkWEWzyMi","selected":false},{"type":"Heliostat","cx":-0.022606607758193117,"cy":-0.11409831045939309,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iRKu923infq42Wt4hBDmAr","selected":false},{"type":"Heliostat","cx":-0.050829455922230794,"cy":-0.11677068643182602,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"r8JJG8wHFXqt3Yp7tKGhqZ","selected":false},{"type":"Heliostat","cx":-0.08251826789588713,"cy":-0.11890858720977243,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g3m5iCgTUTpwZiaw5ii9jU","selected":false},{"type":"Heliostat","cx":-0.11371194218245514,"cy":-0.12532228954361152,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tVUTkzfhBEXpMMHQ6aFPP9","selected":false},{"type":"Heliostat","cx":-0.1429250657206696,"cy":-0.13333941746091038,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jeTo5Man4ER6UL6bLqzkta","selected":false},{"type":"Heliostat","cx":-0.17065277619761887,"cy":-0.14456339654512879,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1uJtuaoB5NwSgpmJn71K67","selected":false},{"type":"Heliostat","cx":-0.19887562436165657,"cy":-0.16006317718799537,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6d39qoKyMNYsyCCMsCYFgb","selected":false},{"type":"Heliostat","cx":-0.2251179217773408,"cy":-0.17716638340883842,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"c47HFaS15SjhNgAVfkMtKh","selected":false},{"type":"Heliostat","cx":-0.2503699438188482,"cy":-0.19373511443792277,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6Fhdsjojq36iUtNfZyfuJE","selected":false},{"type":"Heliostat","cx":-0.27463169048617886,"cy":-0.21618307260635958,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pBiw2NAG9iHHT94xeKa2u3","selected":false},{"type":"Heliostat","cx":-0.29790316177933274,"cy":-0.23969998116376964,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u5PnNPgs1h8UTrfgpBZ8T6","selected":false},{"type":"Heliostat","cx":-0.3172135315757796,"cy":-0.2642858401101529,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rtSVS5mzodLcSXkBDvsbCD","selected":false},{"type":"Heliostat","cx":-0.33602876368513807,"cy":-0.2904751246399958,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2PEu3vmBctRcCsffaLpmHw","selected":false},{"type":"Heliostat","cx":-0.3642516118491758,"cy":-0.2894061742510226,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8DjkoLAZDwTnx8LtXHyg96","selected":false},{"type":"Heliostat","cx":-0.34395096667855213,"cy":-0.2621479393322064,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xggSKm6cv18X25oTxPwZS6","selected":false},{"type":"Heliostat","cx":-0.3241454591950169,"cy":-0.2343552292189037,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"74PzS5xWGKsEmxZBzdP32Z","selected":false},{"type":"Heliostat","cx":-0.3003788502147747,"cy":-0.2103038454670071,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iX6zZTVdQx5UJP9MjNZAnh","selected":false},{"type":"Heliostat","cx":-0.2766122412345324,"cy":-0.18785588729857022,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sbLC2rgU8AGXKtdt3DXoPT","selected":false},{"type":"Heliostat","cx":-0.2503699438188482,"cy":-0.1654079291301334,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4JaLAH32GnHtvkVTVkWkbH","selected":false},{"type":"Heliostat","cx":-0.22412764640316404,"cy":-0.1461668221286161,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ekeh4M3jaMmHQZ3b3gvsRs","selected":false},{"type":"Heliostat","cx":-0.19392424749077278,"cy":-0.13173599187747817,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tkth3AnLMPCi7hv9DghmT5","selected":false},{"type":"Heliostat","cx":-0.16372084857838157,"cy":-0.11623621123736702,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o3q136vYQwnzoP6GsZr4LR","selected":false},{"type":"Heliostat","cx":-0.13401258735307872,"cy":-0.10661565773660836,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7Q5q7ho8EHkiogsarQwdbr","selected":false},{"type":"Heliostat","cx":-0.09836267388271532,"cy":-0.09913300501379609,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jEaDTazLRHkWPu4uHy6TK8","selected":false},{"type":"Heliostat","cx":-0.06914955034450089,"cy":-0.09325377787444358,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4BSC1a2V48rvTMuzLPRYCD","selected":false},{"type":"Heliostat","cx":0.0937507487075764,"cy":-0.11623621123736702,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hj6QoYH2tKJMaowWF4Jso4","selected":false},{"type":"Heliostat","cx":0.05958624829847807,"cy":-0.10394328176690322,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nZGBsGGWLjxKfGS9cc7oqY","selected":false},{"type":"Heliostat","cx":0.026907160950645,"cy":-0.09752957943033631,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8ZY8shpFLkqdci1tNW1GoZ","selected":false},{"type":"Heliostat","cx":0.04869321918253367,"cy":-0.07668504684535922,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pya46vaM37X8xjgxnFRbmD","selected":false},{"type":"Heliostat","cx":0.037305052379500936,"cy":-0.047823386343083335,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sk9aYQ4ZatkgcWnoBw73BS","selected":false},{"type":"Heliostat","cx":0.32316626777261265,"cy":-0.2887703826060557,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v6iF1wnA1zBqaP8XCMzytA","selected":false},{"type":"Heliostat","cx":0.302689663582776,"cy":-0.2521615907181474,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7hRAbWEjhuuAWAcgNF2XiW","selected":false},{"type":"Heliostat","cx":-0.3022663286455178,"cy":-0.036768285775775254,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uosW5t7FWQ4a7eUdsD1TcQ","selected":false},{"type":"Heliostat","cx":0.27316237198008403,"cy":-0.2524973897551937,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4LmAuM9HRhZTEdxYDj2FKM","selected":false},{"type":"Heliostat","cx":0.1526283445468355,"cy":-0.14381713160256596,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hUgdPZt8vUMBFhHDDodoRf","selected":false},{"type":"Heliostat","cx":0.2526006849473534,"cy":-0.22571000218238366,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jj8uZxps5DeUSntdLoNoRc","selected":false},{"type":"Foundation","cx":-10.492368727264438,"cy":-365.24616728285855,"cz":3,"lx":55.33009592617107,"ly":28.860277897658587,"lz":6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarStructure":2,"solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{"towerHeight":115,"towerRadius":4},"id":"nHq7VyAiKvgNuPDrDMejYk","selected":false},{"type":"Heliostat","cx":-0.033635036707480734,"cy":-0.09478696259320521,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3n8DXtghY7C9fg7wtQN9mm","selected":false},{"type":"Heliostat","cx":-0.0021782029294463968,"cy":-0.09478696259320521,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3HRyeRtdwXWAfFooG7khA8","selected":false},{"type":"Heliostat","cx":-0.018309912559207595,"cy":-0.06910229279682685,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9dMgqBzGAqQQo74ehqtuvW","selected":false},{"type":"Heliostat","cx":-0.05218650278170614,"cy":-0.0712789597287233,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sM7ZRjDyGbb93H3X5XLsiN","selected":false},{"type":"Heliostat","cx":-0.08767626396718083,"cy":-0.07432629343337838,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hGv3aS4uYRq5Hg62cAQgof","selected":false},{"type":"Heliostat","cx":-0.12074626870819129,"cy":-0.07998562745630922,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"knf1JFPLgyb2dGzcbU3Hfe","selected":false},{"type":"Heliostat","cx":-0.15341298070845777,"cy":-0.09173962888855014,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eMVGrjZpnunqsrM98ZgPH2","selected":false},{"type":"Heliostat","cx":-0.07235113981890764,"cy":-0.04428828977320709,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xe6PEzZpz5DHRWEZokrjXg","selected":false},{"type":"Heliostat","cx":-0.055412844707658386,"cy":-0.014685619499415072,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7T7JfLgLbNJk4NRXzvFZJj","selected":false},{"type":"Heliostat","cx":-0.036861378633433015,"cy":-0.040805622682172714,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xyTpPrGnJXHGmcyUmTs8AF","selected":false},{"type":"Heliostat","cx":0.016373263144779018,"cy":-0.07302029327424049,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1ak6Ue1atJ663QehAMdMAS","selected":false},{"type":"Heliostat","cx":0.08412644358977613,"cy":-0.0873862950247572,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gCkqrGtT5r5WgEKYq1za1b","selected":false},{"type":"Heliostat","cx":0.11598657010855452,"cy":-0.09826962968423955,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"huYwsUKyEQrq59ExuTrPfF","selected":false},{"type":"Heliostat","cx":0.12243925396045897,"cy":-0.1265662997988937,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xrCktsCv7shjx1gwsg6JbF","selected":false},{"type":"Heliostat","cx":0.0014456646770545306,"cy":-0.04437383909501622,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wwcyQu2t5aJGnwR9kKd4wM","selected":false},{"type":"Heliostat","cx":-0.10818001791234799,"cy":-0.05010814303981461,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iKhLi69geSKfMMuqgo2q5J","selected":false},{"type":"Heliostat","cx":-0.1453658221387092,"cy":-0.05740634806046707,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pzSKSvuwPWAxvfQT9qwaND","selected":false},{"type":"Heliostat","cx":-0.17892963244691829,"cy":-0.06965690649074628,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eFq75cYfVvsfdd6UUfTojE","selected":false},{"type":"Heliostat","cx":-0.21249344275512747,"cy":-0.0842533165293234,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mrkR4hEhbnkEw1KxqSjipf","selected":false},{"type":"Heliostat","cx":-0.18738095158927312,"cy":-0.1022381789016456,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eA11DgH7cfBxpC8D2vjzCt","selected":false},{"type":"Heliostat","cx":-0.21925449806901132,"cy":-0.11657393876364154,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pehZwiBvURwYNmynuVV2oZ","selected":false},{"type":"Heliostat","cx":-0.2460572530633366,"cy":-0.10145622836371855,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cFxirFbRdujaw5Fc4RE5MD","selected":false},{"type":"Heliostat","cx":-0.25064511202632916,"cy":-0.13481945131527276,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4ypECbseMr3f8LhqjYosMu","selected":false},{"type":"Heliostat","cx":-0.2764820019758139,"cy":-0.15645341619792116,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1cNTjGeFgiYqFUnXdLBRx6","selected":false},{"type":"Heliostat","cx":-0.27696493449823417,"cy":-0.12309019324636697,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cW4SyxcnHNPzxbSE2LWbQ5","selected":false},{"type":"Heliostat","cx":-0.30642381836587107,"cy":-0.14654870938417855,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"17jGJ68AWAZgPARxJ6UPKN","selected":false},{"type":"Heliostat","cx":-0.09514083980700053,"cy":-0.016484269908978957,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k736gpzLunYF9CA2xNNwgF","selected":false},{"type":"Heliostat","cx":-0.13256811029457188,"cy":-0.02508572582617652,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bPf2FbThrjxqWcoYgrYC2A","selected":false},{"type":"Heliostat","cx":-0.015939906130075388,"cy":-0.0141384182951978,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"th3tqLRe84Jqrqfr3ZWX4Z","selected":false},{"type":"Heliostat","cx":0.021245898096285794,"cy":-0.01596296955036091,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"snGFqY54yf3wZYGqvNzdSK","selected":false},{"type":"Heliostat","cx":0.06012196615111797,"cy":-0.021957923674468315,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"p1BLYib9F5TuccAF143Meb","selected":false},{"type":"Heliostat","cx":-0.17023684704335335,"cy":-0.034469132281301135,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eFbcBWFKK11qf1tsDuwKoR","selected":false},{"type":"Heliostat","cx":-0.20790558379213483,"cy":-0.0493261925019151,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"44juECoBc4iyV5WsYrieZZ","selected":false},{"type":"Heliostat","cx":-0.24243525914518455,"cy":-0.06652910433631024,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"abfBabbkXEUrKZnAsNhn3Y","selected":false},{"type":"Heliostat","cx":-0.2759990694533937,"cy":-0.08790241903964963,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eAEEf1jS8EeUmfDXwtgbsh","selected":false},{"type":"Heliostat","cx":-0.3090799472391825,"cy":-0.11214288571263284,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rYpKyT7tWdyjcNbsGsDtpP","selected":false},{"type":"Heliostat","cx":-0.3390217636292396,"cy":-0.13898985418418947,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h7WTnDPjYZa2yv9AbeqYi8","selected":false},{"type":"Heliostat","cx":-0.30346193456733533,"cy":-0.18027347486919182,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tpzWYwzqd7mz7PeBQzCqEF","selected":false},{"type":"Heliostat","cx":-0.3273202794054188,"cy":-0.20565406429518426,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nV956oZbqiSHUewdzFEGwb","selected":false},{"type":"Heliostat","cx":-0.35187017047069313,"cy":-0.23327411749405838,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eotKsPbyYbFr8f4YZHBPV5","selected":false},{"type":"Heliostat","cx":-0.3729623304000133,"cy":-0.26388012239010805,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4xcMmwR2N7YaJDgjrvx9Tg","selected":false},{"type":"Heliostat","cx":-0.38229820446708945,"cy":-0.23140789768332368,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sfWCB3P6rkqZa4YAEd5bcf","selected":false},{"type":"Heliostat","cx":-0.3594771789697922,"cy":-0.200428648825127,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vHAMJhEkjkYLc4RSjerC3B","selected":false},{"type":"Heliostat","cx":-0.3328526492229454,"cy":-0.1713156197776651,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qTSMmo3sfM3tmeNsXwJ95x","selected":false},{"type":"Heliostat","cx":-0.3674299605824867,"cy":-0.16832966808048952,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kijHzENJV8TJe21WNjQuUC","selected":false},{"type":"Heliostat","cx":-0.3916340785341656,"cy":-0.19893567297653922,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"49c4EBZdrrGLx2C1jkrU34","selected":false},{"type":"Heliostat","cx":-0.400278406374051,"cy":-0.16571696034546088,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nmEdqVEsjHqXFAfs271Hv4","selected":false},{"type":"Heliostat","cx":-0.3712334648320363,"cy":-0.13063202790364783,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iXeSufYc6rqYVyGdq4x3at","selected":false},{"type":"Heliostat","cx":-0.2761458585932977,"cy":-0.05187755189064192,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bevRTnppC9h4ebQw9qu31Y","selected":false},{"type":"Heliostat","cx":-0.1969638155799482,"cy":-0.01529964360024112,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"etWFnXE45z2CNE1YXRNVxb","selected":false},{"type":"Heliostat","cx":-0.11501558765783529,"cy":0.010080945825751317,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpZi9pr2vKF4BbVGupqEXc","selected":false},{"type":"Heliostat","cx":-0.40753964175955465,"cy":-0.12764607620647225,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7YdgbS7MbyK8fpmsbE8Fq6","selected":false},{"type":"Heliostat","cx":-0.417912835167417,"cy":-0.0933076316889531,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3mPyk4qt31Y1bUaJMpdRT5","selected":false},{"type":"Heliostat","cx":-0.38056933889911243,"cy":-0.10039926696974508,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"boS825hvqkSAd3EMruDUop","selected":false},{"type":"Heliostat","cx":-0.35532790160664735,"cy":-0.07501867754375265,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6neahnPeogbncgiTuDRsB6","selected":false},{"type":"Heliostat","cx":-0.32870337185980053,"cy":-0.05337052773647434,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6JURGXaMnDK92DSmeMdQDb","selected":false},{"type":"Heliostat","cx":-0.3892136667389977,"cy":-0.06531433452790446,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5mdtK7mbfjWr2ZwvqtMZoW","selected":false},{"type":"Heliostat","cx":-0.3608602714241738,"cy":-0.03956050113976511,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7iLWKe2jZRMk3NyRqmNQUd","selected":false},{"type":"Heliostat","cx":-0.3318153298821592,"cy":-0.018658839259536052,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6ZLXjXtPYgTp5YsiDKt92R","selected":false},{"type":"Heliostat","cx":-0.30346193456733533,"cy":-0.00036988511433561826,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n8SHGbk2vJK2DPuaoNHYXh","selected":false},{"type":"Heliostat","cx":-0.27545431236610685,"cy":-0.0197785711459769,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2SSpgdAk9FyHtarh2kemjh","selected":false},{"type":"Heliostat","cx":-0.427940255461684,"cy":-0.05598323547423079,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cxfJsRXsJGHcRLJiW1ZC4T","selected":false},{"type":"Heliostat","cx":-0.3978579945788831,"cy":-0.026123718502475,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"983fNrC7GvsmHKyDBU7uKS","selected":false},{"type":"Heliostat","cx":-0.3660468681281051,"cy":-0.000743129076482581,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aCoTGoQTygQRfEwZWp9pEu","selected":false},{"type":"Heliostat","cx":-0.24986710196004633,"cy":-0.005222056622245941,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rAPfaS9ZavWB56qRknahL4","selected":false},{"type":"Heliostat","cx":-0.27545431236610685,"cy":0.01642609318227701,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7aTwzASE97BSxQ69zqRKB9","selected":false},{"type":"Heliostat","cx":-0.22013061419084085,"cy":0.007468238090750264,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6d8F7whR2UWQ5Rpw6zgpoS","selected":false},{"type":"Heliostat","cx":-0.24779246327847385,"cy":0.03135585166815488,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gs9ZBEK1748RpsjnfsZckK","selected":false},{"type":"Heliostat","cx":-0.21840174862286374,"cy":0.042926414494710276,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2QLnVz31nbfJHbaqyshx4N","selected":false},{"type":"Heliostat","cx":-0.19316031133039863,"cy":0.019038800917305643,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bT2uoRqcV2JsvxKNXGq7Tp","selected":false},{"type":"Heliostat","cx":-0.16411536978838387,"cy":0.029116387895273214,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wDnu6VsXGRf96DxoNbPRXh","selected":false},{"type":"Heliostat","cx":-0.18797371462646742,"cy":0.052630757510530896,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7fXVXPkHvH4EiWQgs5X5EV","selected":false},{"type":"Heliostat","cx":-0.1578914537436665,"cy":0.06233510052635154,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iVLsKahc6Jz8H79epHER9m","selected":false},{"type":"Heliostat","cx":-0.13472465513277385,"cy":0.03658126713821217,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2W1dZKG5G4kdvvYuTKg6J8","selected":false},{"type":"Heliostat","cx":-0.10637125981794995,"cy":0.041806682608269405,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8RbNvvwi1FQxJhzm68oxMb","selected":false},{"type":"Heliostat","cx":-0.07594322582155359,"cy":0.04628561015403278,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rv9MXPBD3e63TfH2kDubmC","selected":false},{"type":"Heliostat","cx":-0.03064694794055447,"cy":0.016426093179521616,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eoYDEHmumqWS9SMAreWLME","selected":false},{"type":"Heliostat","cx":-0.0451694187115619,"cy":0.04889831788903389,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nisA2ZxiN5cGyrqqmqFcTt","selected":false},{"type":"Heliostat","cx":-0.4355472639607831,"cy":-0.018285595297416656,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9uTLgXRt31u5LbkmoNmmzh","selected":false},{"type":"Heliostat","cx":-0.44280849934628674,"cy":0.024264216387335374,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"arUmBddCd3ZN9RM4YvwTeh","selected":false},{"type":"Heliostat","cx":-0.40096995260124174,"cy":0.009707701863604397,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"voKSeBcj1DBKGLLTkPQVxi","selected":false},{"type":"Heliostat","cx":-0.3681215068096776,"cy":0.038074242986772415,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"55CnZxFzVkzTP2ZZcBc3GF","selected":false},{"type":"Heliostat","cx":-0.4082311879867454,"cy":0.05337724543479727,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"72WvPCXQWgeW6smtGCDqkn","selected":false},{"type":"Heliostat","cx":-0.4500697347317904,"cy":0.06793375995852818,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2C1jZdwUGxFZt8JTCcp2dF","selected":false},{"type":"Heliostat","cx":-0.40892273421393627,"cy":0.097793276930284,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pUaEdfwMSZ7FJNPu8MbTVu","selected":false},{"type":"Heliostat","cx":-0.37192501105922715,"cy":0.07763810297434884,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rqc5Shh25yv3QUcC5PJfr7","selected":false},{"type":"Heliostat","cx":-0.3352730610181133,"cy":0.019412044879425033,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3cBVQbPPnpMt6C62XatwGo","selected":false},{"type":"Heliostat","cx":-0.3058823463625032,"cy":0.03956721883536021,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8B4aaX12Cwz7SWukzQHxfu","selected":false},{"type":"Heliostat","cx":-0.3359646072453042,"cy":0.05897590486975687,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8js9abopRBUDoNq8C8Vkee","selected":false},{"type":"Heliostat","cx":-0.30415348079452614,"cy":0.07726485901222946,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wSFcW9Bi2CEV2NiqkVLGgK","selected":false},{"type":"Heliostat","cx":-0.2761458585932977,"cy":0.05748292901568581,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oEtkxCk7V55pZMXbYEUFoy","selected":false},{"type":"Heliostat","cx":-0.3373476996996858,"cy":0.09891300881948024,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7JVKmoPwsr4YiKcdWdSdzy","selected":false},{"type":"Heliostat","cx":-0.24433473214251972,"cy":0.06979997976653508,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i7yUerNEdQNGoZikCwAKi5","selected":false},{"type":"Heliostat","cx":-0.27234235434374815,"cy":0.09443408127096152,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gK1KuDQ1xA1jepW3pkMSYy","selected":false},{"type":"Heliostat","cx":-0.21321515191893256,"cy":0.08472973825514087,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"b4J6Xf2MrSmiCKmRPp5JwY","selected":false},{"type":"Heliostat","cx":-0.1807124792409637,"cy":0.09406083730881452,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nKkV64v1XzdkrnhFcrMZoK","selected":false},{"type":"Heliostat","cx":-0.24053122789297018,"cy":0.10787086390825154,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xgNnXwqvuHbn1SRpxKx5iF","selected":false},{"type":"Heliostat","cx":-0.14820980656299493,"cy":0.10301869240034127,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h9437PNFcensdgYCPvaUZ9","selected":false},{"type":"Heliostat","cx":-0.12573455417929308,"cy":0.07054646769355681,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mN7BSbm2K54or4ve2veKYY","selected":false},{"type":"Heliostat","cx":-0.09599806641008757,"cy":0.0757718831636141,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vnVRMYugJhGEe7GvuV5yNs","selected":false},{"type":"Heliostat","cx":-0.11466981454423983,"cy":0.1086173518325455,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bccxZepk5qSe634uWX42ei","selected":false},{"type":"Heliostat","cx":-0.061766528164141625,"cy":0.07913107882293664,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i6mjvJmXWoNbbtScNe4jLc","selected":false},{"type":"Heliostat","cx":-0.02995540171336369,"cy":0.07987756674723054,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kgFQrpmB4Uo3QRzYrM9z5D","selected":false},{"type":"Heliostat","cx":-0.016470250283142505,"cy":0.04889831788903389,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"i8SzwQJPy7H5YyXTGe1xVc","selected":false},{"type":"Heliostat","cx":-0.0026393257393260423,"cy":0.016426093182249437,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"apvcd8RadTsSXecLmteBdy","selected":false},{"type":"Heliostat","cx":0.015340876167635433,"cy":0.046658854116152185,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"12C7onFbSbSHFPJc8uUrKy","selected":false},{"type":"Heliostat","cx":0.03332107807459691,"cy":0.07539863920146715,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gb2pH6ANCuJC8qsYCvxT6m","selected":false},{"type":"Heliostat","cx":0.0015099516238188731,"cy":0.0757718831636141,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tkeABsZCEiybQvrrxUR8jq","selected":false},{"type":"Heliostat","cx":0.044731590823245536,"cy":0.04329965845682966,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hg9DPmH5cjxeCBJWkCFhVc","selected":false},{"type":"Heliostat","cx":0.06340333895739782,"cy":0.07017322373140988,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oJz5XyB57AT2gBG4awFXj6","selected":false},{"type":"Heliostat","cx":0.05095550686796301,"cy":0.10936383975683939,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tHRNmQUNj6K1TnE56YNmfY","selected":false},{"type":"Heliostat","cx":0.01983592664437585,"cy":0.11197654749186799,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpjExf4xnHsCihbG1Z3uYw","selected":false},{"type":"Heliostat","cx":-0.01301251914718843,"cy":0.11421601126474966,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sBN5FEivyAsVk4UNG51jA7","selected":false},{"type":"Heliostat","cx":-0.04551519182515727,"cy":0.11048357164328021,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8pUZKWg5usB1LmJ4FqHgif","selected":false},{"type":"Heliostat","cx":-0.08147559563908026,"cy":0.1112300595675741,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"23RBiRbrVGDew4P5junKUY","selected":false},{"type":"Heliostat","cx":0.07446807859245108,"cy":0.03732775506247852,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tDUutW1fYKC3zU8km6x7oT","selected":false},{"type":"Heliostat","cx":0.08172931397795467,"cy":0.0033625545071062956,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"t5hoPXGgvmAKCC98bFLoS1","selected":false},{"type":"Heliostat","cx":0.07101034745649691,"cy":-0.05411701566352362,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ffh2ust2D3LvEonm64PhVV","selected":false},{"type":"Heliostat","cx":0.09735040458634132,"cy":-0.0309061006268814,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1vWwMCYh2GFGH8H8yyPFj7","selected":false},{"type":"Heliostat","cx":0.10692860717901208,"cy":-0.06523213814288877,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a7CNQPaFqLRU1KsDr6sWL1","selected":false},{"type":"Heliostat","cx":0.13259819012736962,"cy":-0.0433131021386913,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dWyjm3KRE2b2cp2DQn99im","selected":false},{"type":"Heliostat","cx":0.1417932646163335,"cy":-0.07970697324000028,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4BSY8QjyTYnsJg4VvVw4dF","selected":false},{"type":"Heliostat","cx":0.14447516134228128,"cy":-0.11237874388776634,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pWN8hVQSUWP9zSJ9mBA4u6","selected":false},{"type":"Heliostat","cx":0.17282664101658657,"cy":-0.09790390879065478,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vwjTwcPDdQ84YqGSgB7GCM","selected":false},{"type":"Heliostat","cx":0.16899535997951837,"cy":-0.05944220410404414,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2uj8zbaPpR6EuihS2a1eyt","selected":false},{"type":"Heliostat","cx":0.16516407894245005,"cy":-0.027184000173338437,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jTBqs9gubADDLHUczweTht","selected":false},{"type":"Heliostat","cx":0.17704105015736168,"cy":-0.13098924615548113,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9rczuT28G81XBnJWyv8p47","selected":false},{"type":"Heliostat","cx":0.18010607498701633,"cy":-0.1611796165036406,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"c3Mvio8y22xwBSB8LsByak","selected":false},{"type":"Heliostat","cx":0.20424314552054657,"cy":-0.08136124010826916,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ir46DZVbKinR95v215bS7Z","selected":false},{"type":"Heliostat","cx":0.20424314552054657,"cy":-0.11775511120957816,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"njGEA2SJu4eVEC5eQQDDW1","selected":false},{"type":"Heliostat","cx":0.20615878603908072,"cy":-0.1537354155938268,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9KeeMj5e9pcmeJWLsZy8iA","selected":false},{"type":"Heliostat","cx":0.20769129845390802,"cy":-0.18020368548568788,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8fkWUtc7gCzjPcENNAC8Zy","selected":false},{"type":"Heliostat","cx":0.23106211278002461,"cy":-0.2037769883581267,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uuc6jUmEutuWsardRqMkFX","selected":false},{"type":"Heliostat","cx":0.23144524088373142,"cy":-0.172759484578602,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sE5cQvdygFYu5rEEvgstNz","selected":false},{"type":"Heliostat","cx":0.23336088140226557,"cy":-0.1396741472137756,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tBMpyUhxX17cCUPtBhbcxe","selected":false},{"type":"Heliostat","cx":0.23451026571338607,"cy":-0.10493454298070795,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dqzcMfJ4ym9JvrApbs8TiH","selected":false},{"type":"Heliostat","cx":0.239107802957868,"cy":-0.06978137203057995,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9wqmsXX7SDkbVjcEEQp2vy","selected":false},{"type":"Heliostat","cx":0.263628001595105,"cy":-0.1322299463066897,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ca7PcPtrbnFPvGWK55EzEv","selected":false},{"type":"Heliostat","cx":0.26247861728398447,"cy":-0.166555983822697,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8xXw6WsWAYY3TxnJd1hKSR","selected":false},{"type":"Heliostat","cx":0.2574979519357958,"cy":-0.20005488790458376,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tGtL7cXW4ctq2Uq6fzc5Ri","selected":false},{"type":"Heliostat","cx":0.29197948126941037,"cy":-0.15414898231088717,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2r3Fu8Vht4LfDNGkzD7AvK","selected":false},{"type":"Heliostat","cx":0.28814820023234206,"cy":-0.1930242537145581,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uFPPCk3ug65jVcFFKfczUf","selected":false},{"type":"Heliostat","cx":0.2801025100544987,"cy":-0.2236281907770225,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rW95SzX5M1aYg6UfYWzGAM","selected":false},{"type":"Heliostat","cx":0.10462983855677109,"cy":0.02864750662977845,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dRWphEN9DXnANHh3HGV9Tw","selected":false},{"type":"Heliostat","cx":0.09505163596410039,"cy":0.06380067757990648,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"f3KHqcW8BgK3tf3keNrHS8","selected":false},{"type":"Heliostat","cx":0.12646814046806035,"cy":0.055942909955760275,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1mJ8JwzL5NHxUYw6Tb4Etj","selected":false},{"type":"Heliostat","cx":0.13068254960883546,"cy":0.019135472137390887,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3pkNWKyy5jkQRFLV2tqeZu","selected":false},{"type":"Heliostat","cx":0.15635213255719296,"cy":0.04270877500982969,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gMemMLxQbof4Hnm4rEqFfH","selected":false},{"type":"Heliostat","cx":0.1513714672090042,"cy":0.08571971358410398,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pBbkhYbWAwoxYepnBMn2ZE","selected":false},{"type":"Heliostat","cx":0.1820217155055505,"cy":0.07124487848974785,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3PFAWYvLqr3uBjfJT2HqhF","selected":false},{"type":"Heliostat","cx":0.1617159260090886,"cy":0.005901337191487905,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wAsMtRtTkzAZzoJ2RJuqNS","selected":false},{"type":"Heliostat","cx":0.1866192527500325,"cy":0.03030177349804736,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n8Qqyi38hh2Cq2Rg8LRWsK","selected":false},{"type":"Heliostat","cx":0.1881517651648598,"cy":-0.0065056643203219655,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aTmzkSNn2tGVv3B7EjqNq9","selected":false},{"type":"Heliostat","cx":0.21420447621692415,"cy":0.016240505117996153,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oboEC75Sh6grnL1ugtrAZQ","selected":false},{"type":"Heliostat","cx":0.21267196380209683,"cy":0.05635647667009271,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"txMcY9WtX2FmTTTqJTDcKZ","selected":false},{"type":"Heliostat","cx":0.21535386052804464,"cy":-0.01932623254921973,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xeQUeinFn2YWLHA81FyBh1","selected":false},{"type":"Heliostat","cx":0.2433222120986431,"cy":-0.0007157302815049064,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mX9ZXrGRLU9CBRLNchW8ou","selected":false},{"type":"Heliostat","cx":0.2417896996838158,"cy":-0.03628246794869324,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rJwEb8gHQVFi61bjjyYKc7","selected":false},{"type":"Heliostat","cx":0.241406571580109,"cy":0.0398138079904074,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9XuvM5Tt9pWjTTWzyKkrHv","selected":false},{"type":"Heliostat","cx":0.241406571580109,"cy":0.07744837924289738,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3YjVMHkvo8t3pPXSKyVA2j","selected":false},{"type":"Heliostat","cx":0.27205681987665525,"cy":0.05842431025812222,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"c4jmXgazz6s47tNDfcuR2H","selected":false},{"type":"Heliostat","cx":0.27320620418777575,"cy":0.02037617228857191,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fzYUTKuZB2g898qPKopLu6","selected":false},{"type":"Heliostat","cx":0.27090743556553476,"cy":-0.01973979926628006,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ezm9yDFEjEYm2TtNgfysUH","selected":false},{"type":"Heliostat","cx":0.26516051400993235,"cy":-0.053652270065227096,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a8WSwg1KasTJjpUskv4dYS","selected":false},{"type":"Heliostat","cx":0.29044696885458304,"cy":-0.07350347248412291,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ghekwWKHGiE7zrCodtNu1D","selected":false},{"type":"Heliostat","cx":0.2958107623064787,"cy":-0.03876386825105522,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rNNdsfuPqE1EPczC46MeS2","selected":false},{"type":"Heliostat","cx":0.3004082995509606,"cy":0.00011140315261576157,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4Chbg5MtX5989PatXAvQ1e","selected":false},{"type":"Heliostat","cx":0.30423958058802886,"cy":0.0385731078392264,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2W9vhrDsJ8DwZBrvsuaxMH","selected":false},{"type":"Heliostat","cx":0.33450670078086836,"cy":0.012518404664425633,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eRsGbJw5AvY9EH6xgwRHFB","selected":false},{"type":"Heliostat","cx":0.33297418836604104,"cy":-0.023875466436883364,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"83tmu295aDGPuUQDG8irif","selected":false},{"type":"Heliostat","cx":0.32224660146224987,"cy":-0.06399143799173532,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9j8V5Vajb7oyLaPxiuJtfW","selected":false},{"type":"Heliostat","cx":0.31573342369923374,"cy":-0.09831747550774267,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"itsvnfebiYWqAJ69gutWHW","selected":false},{"type":"Heliostat","cx":0.3590268994181054,"cy":-0.05075730304580478,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wz22ek3hjYTur5JCY2Nij9","selected":false},{"type":"Heliostat","cx":0.38929401961094495,"cy":-0.08053410667414851,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2ztRUM2FUvLR438Y5J9EgX","selected":false},{"type":"Heliostat","cx":0.3490655687217279,"cy":-0.08963257444947577,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"471Dah549XrTt5dob8iJnR","selected":false},{"type":"Heliostat","cx":0.37588453598120586,"cy":-0.12023651151194013,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"p1pbcbEdVAG2P5ABxQu5Ke","selected":false},{"type":"Heliostat","cx":0.3402536223364709,"cy":-0.12478574539960376,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"47fgpHN5zioMupSTaZWDSp","selected":false},{"type":"Heliostat","cx":0.3647738209737079,"cy":-0.15249471544264584,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pCDe1bzWHZ6jS57fAK8pwn","selected":false},{"type":"Heliostat","cx":0.3295260354326796,"cy":-0.15828464948149043,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uCcRtCsumKV9DfWxadqTW5","selected":false},{"type":"Heliostat","cx":0.3574943870032782,"cy":-0.19219712028043748,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ayXH3c1sFzNjaSdMZ81p9c","selected":false},{"type":"Heliostat","cx":0.3184153204251815,"cy":-0.18640718624159286,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4evv7fQdgSNSipNwTWwGwC","selected":false},{"type":"Heliostat","cx":0.3437017752698323,"cy":-0.22156035719172085,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rAh8823N9Vwi6vKYFAJd2C","selected":false},{"type":"Heliostat","cx":0.3122852707658723,"cy":-0.22280105734290184,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5PCkHADofgHMwo1pjfyL9y","selected":false},{"type":"Heliostat","cx":0.3333573164697478,"cy":-0.2554728279906679,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3xqoNyUGDK5ydaeVXeiyKG","selected":false},{"type":"Heliostat","cx":0.39810596599620196,"cy":-0.04538093572674829,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aW5zhg7bZS1fUR7XJst2Gi","selected":false},{"type":"Heliostat","cx":0.36630633338853513,"cy":-0.01353629851037508,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gQLhow3fXWpMkfRe8wtCzu","selected":false},{"type":"Heliostat","cx":0.40883355289999307,"cy":-0.007332797754470145,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"knRosv43m5AQ9razdiCqcM","selected":false},{"type":"Heliostat","cx":0.3735857673589649,"cy":0.024511839459175226,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eEqU4FAzLxkJH9Tf34bQUP","selected":false},{"type":"Heliostat","cx":0.3402536223364709,"cy":0.05304794293633799,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hZpNgZfZfytEBxpebNdzEb","selected":false},{"type":"Heliostat","cx":0.3053889648991494,"cy":0.07662124580877676,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6EPw6254wjubgGXjScbc35","selected":false},{"type":"Heliostat","cx":0.27129056366924165,"cy":0.09729958166179327,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"79MBztAVAqPVNos51gf6eg","selected":false},{"type":"Heliostat","cx":0.24293908399493633,"cy":0.11673721736362871,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eXofdMYHTSynXhcqPKpjbV","selected":false},{"type":"Heliostat","cx":0.20960693897244223,"cy":0.09026894747176761,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cj1HzxwMYNjCeedqVrynoE","selected":false},{"type":"Heliostat","cx":0.20769129845390807,"cy":0.13162561917780058,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8SqHt7enenNVrryGKLRHHj","selected":false},{"type":"Heliostat","cx":0.41956113980378434,"cy":0.0365052742539248,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qoiTBXczJ25keVDxYZkuSh","selected":false},{"type":"Heliostat","cx":0.38009894512198106,"cy":0.07000417833581148,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7VCY1aEW3s9HeKvSty5XL2","selected":false},{"type":"Heliostat","cx":0.41956113980378434,"cy":0.088201113886466,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fbUybRMcP7qMoBEYqmnx6h","selected":false},{"type":"Heliostat","cx":0.3444680314772459,"cy":0.0993674152470949,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sxsUBxLvQKPU2sAKzPcwC8","selected":false},{"type":"Heliostat","cx":0.3820145856405152,"cy":0.12335428483659402,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5V4WAQXnKXNyTXXR6qBDXx","selected":false},{"type":"Heliostat","cx":0.3069214773139766,"cy":0.12459498498777499,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"utggTKHEx3AjG5Z1EoMDCs","selected":false},{"type":"Heliostat","cx":0.3452342876846595,"cy":0.14775472114315344,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uPUupWhDTobXtkfAk4CHMp","selected":false},{"type":"Heliostat","cx":0.1758916658462413,"cy":0.10929301645654278,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v4iP1MonNTVEo1nyN2hwab","selected":false},{"type":"Heliostat","cx":0.1410270084089199,"cy":0.12045931781717169,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8V8hDrjxrjeZN3UkWbonBQ","selected":false},{"type":"Heliostat","cx":0.118422450290217,"cy":0.09564531479355189,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bqVYQHX1yQnt7BZjYd9afT","selected":false},{"type":"Heliostat","cx":0.08585656147513654,"cy":0.10308951570063785,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3YF4NAGXk4jm9beYYTb7SN","selected":false},{"type":"Heliostat","cx":0.10999363200866677,"cy":0.12873065215837826,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7s9yjAjPK8QCDpuAxkaDQK","selected":false},{"type":"Heliostat","cx":0.13528008685331744,"cy":0.15892102250378232,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ueGb2uspjMAYZriJiCCScw","selected":false},{"type":"Heliostat","cx":0.17091100049805252,"cy":0.1489954212943344,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kR8wrTUausCmyTieuq4dHH","selected":false},{"type":"Heliostat","cx":0.2735893322914826,"cy":0.14279192053842946,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"m8S6ZiPTBsqdQVioZbCw5M","selected":false},{"type":"Heliostat","cx":0.23719216243933391,"cy":0.16222955624026494,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4MeKS14wCpVzh8CtWpLZum","selected":false},{"type":"Heliostat","cx":0.20117812069089197,"cy":0.17753152477149714,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fCUJrfBrQ7HRvGk8i2jeaR","selected":false},{"type":"Heliostat","cx":0.310752758351045,"cy":0.1696737571473509,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3hbDt2ugbLLKbd29gwYrUC","selected":false},{"type":"Heliostat","cx":0.38546273857387664,"cy":0.17008732386441117,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hvEWWKEMAmdPXEoa4V4QAu","selected":false},{"type":"Heliostat","cx":0.09811666079375506,"cy":0.17091445729853186,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aV6CVn4L6wr2GaKZrT1Vjm","selected":false},{"type":"Heliostat","cx":0.0739795902602248,"cy":0.13658841978252445,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"r3m2DEYQLd3mBwfFtEcVau","selected":false},{"type":"Heliostat","cx":0.0375824204080761,"cy":0.14237835382136915,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e3Lco1rBEM6kMAUmL9NLgr","selected":false},{"type":"Heliostat","cx":0.06248574714901997,"cy":0.1758772579032558,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"18MGWB6ff2CJeKikAUYJnL","selected":false},{"type":"Heliostat","cx":0.0031008910744615347,"cy":0.14610045427766746,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fYFCkzek2ccB6Pe6iDrEb1","selected":false},{"type":"Heliostat","cx":-0.029464997740618924,"cy":0.1469275877090603,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6K52upKmX7aSVP2ujZ9n2m","selected":false},{"type":"Heliostat","cx":-0.06624529569647447,"cy":0.14527332084081898,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5tcTbFYhFAxjhJQRk4KSQo","selected":false},{"type":"Heliostat","cx":0.02685483350428495,"cy":0.18084005850797985,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"n61CQiJbnjFcrmJ4Qd5q6E","selected":false},{"type":"Heliostat","cx":-0.013373617384932066,"cy":0.18249432537622118,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rtxr56Ffqv7oisuWAfzE9f","selected":false},{"type":"Heliostat","cx":-0.05015391534078766,"cy":0.18290789209603692,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ssnbBpNmb57x9QcPXWiUPm","selected":false},{"type":"Heliostat","cx":-0.089616110022591,"cy":0.18166719193937264,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"abSokmDd3oxiagFbwYw4gT","selected":false},{"type":"Heliostat","cx":-0.09881118451155492,"cy":0.14320548725548987,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wuQC7dYsNVP7PrDHN1NRGs","selected":false},{"type":"Heliostat","cx":-0.12524702366732607,"cy":0.17753152477149722,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6aJAfZK2dApF6de3TZNo36","selected":false},{"type":"Heliostat","cx":-0.13827337919335825,"cy":0.1365884197825246,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"xqsuyu9jqMNNR21mXVQ1a5","selected":false},{"type":"Heliostat","cx":-0.17275490852697287,"cy":0.12997135230955933,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"swiDJhjoNyhP63XMsVg6ur","selected":false},{"type":"Heliostat","cx":-0.16087793731206115,"cy":0.17050089058147164,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aWi6rcrzKqVDW7CfrF1871","selected":false},{"type":"Heliostat","cx":-0.19804136337162356,"cy":0.1618159895232047,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iYUqz4sh2LFY1owPxxLGX1","selected":false},{"type":"Heliostat","cx":-0.23597104563859955,"cy":0.14899542129433452,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vv5n4PmfmBKXSGGNbevTey","selected":false},{"type":"Heliostat","cx":-0.14402030074896066,"cy":0.21144399557044424,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6afKxsaAMJBNRnAKoKzPU4","selected":false},{"type":"Heliostat","cx":-0.18654752026041868,"cy":0.2039997946633583,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1YsLhxgaZg9Q87hZLXmeRs","selected":false},{"type":"Heliostat","cx":-0.22486033063110153,"cy":0.19200635986860873,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2d8xeYnZjcK5AiBTwEWzgx","selected":false},{"type":"Heliostat","cx":-0.1091556433116393,"cy":0.21930176319459052,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vckAj7b593ahoDXTD68N3y","selected":false},{"type":"Heliostat","cx":-0.07045970483724957,"cy":0.22095603006283185,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6pp7NwNe4PgJKBVJsV7dGd","selected":false},{"type":"Heliostat","cx":-0.03214689446656673,"cy":0.22095603006283185,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1pADApoC8hWnpbvYEvM5UA","selected":false},{"type":"Heliostat","cx":0.010763453148598107,"cy":0.2197153299116508,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4PGQjGdFqm6pw32fwJZufu","selected":false},{"type":"Heliostat","cx":0.04831000731186732,"cy":0.21847462976046983,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oR8yoN1AtfF6iLT3X2SqWy","selected":false},{"type":"Heliostat","cx":0.08930471440849803,"cy":0.21061686213632358,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nETqDwZvxQ1dJWeqM7Z2dH","selected":false},{"type":"Heliostat","cx":0.12608501236435357,"cy":0.20151839436099633,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o4tZaxHBZHKFtmG7xSce1i","selected":false},{"type":"Heliostat","cx":0.16363156652762278,"cy":0.19117922643448812,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"csmW9k51tdyoZ24jFE76GS","selected":false},{"type":"Heliostat","cx":0.19543119913528956,"cy":0.22385099708225412,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pBFBKRX26RSYKyWNZJF5qd","selected":false},{"type":"Heliostat","cx":0.23336088140226563,"cy":0.20772189511690126,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vRw1xgf1Qf5Yz5VVToBzXd","selected":false},{"type":"Heliostat","cx":0.2716736917729485,"cy":0.1899385262833071,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rEtpBVboMR7XjEgcux4547","selected":false},{"type":"Heliostat","cx":0.3076877335213904,"cy":0.21888819647753016,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2FCByMFsbYZPgKoVW6ncqW","selected":false},{"type":"Heliostat","cx":0.34791618441060734,"cy":0.19490132688803105,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7CpYfRknsBW7rVbRGTPnhL","selected":false},{"type":"Heliostat","cx":0.3460005438920733,"cy":0.24494289965233088,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dMS3yRiwnF88dhiVtoh9c5","selected":false},{"type":"Heliostat","cx":0.3015576838620812,"cy":0.27223830297831264,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dbBWX8iuPtZmjpKk4PQdKc","selected":false},{"type":"Heliostat","cx":0.26937492315070755,"cy":0.23708513202818465,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dYZSyQzqqkq28acBvqThmF","selected":false},{"type":"Heliostat","cx":0.22838021605407682,"cy":0.2548685008617788,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pQGbd5QAk8pPfgDRf2pnvw","selected":false},{"type":"Heliostat","cx":0.2640111296988119,"cy":0.29002167181190686,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gKRa4wpCCZ2YuQXE517nZ2","selected":false},{"type":"Heliostat","cx":0.21880201346140607,"cy":0.3073914739284407,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"uCywX5XZ4CUAJkRyS3FniH","selected":false},{"type":"Heliostat","cx":0.1858529965426188,"cy":0.2709976028271317,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2UPLQMCooiMhFJtDN26CC2","selected":false},{"type":"Heliostat","cx":0.15405336393495203,"cy":0.23584443187700366,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9gstuVGZgNt34bwx4fWbUR","selected":false},{"type":"Heliostat","cx":0.14370890513486767,"cy":0.28423173777306227,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4b4VML3sa7hnY6ghXF3UUH","selected":false},{"type":"Heliostat","cx":0.11229240063090776,"cy":0.24783786667175325,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wgdCGQw8TMgPeJVmJu1z5p","selected":false},{"type":"Heliostat","cx":0.1007985575197029,"cy":0.2896081050948465,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"waxnrKabumqfqY9nszwBCu","selected":false},{"type":"Heliostat","cx":0.0728302059491044,"cy":0.25652276773002014,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sYDz76fyRaQEPaspZ2rJP4","selected":false},{"type":"Heliostat","cx":0.17512540963882764,"cy":0.3206256088743712,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pazgCfCXnKgDa4L3VRZcx5","selected":false},{"type":"Heliostat","cx":0.031452370748766875,"cy":0.2598313014665028,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"r7WAJSEpjF1v6Y8RpDz5PJ","selected":false},{"type":"Heliostat","cx":0.05788820990453806,"cy":0.2991201395872341,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9eZTFADerf4QWheHy8QGKH","selected":false},{"type":"Heliostat","cx":0.011912837459718613,"cy":0.3049100736260787,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sNRuKArsN6PvUBVAmpBhxu","selected":false},{"type":"Heliostat","cx":-0.03214689446656673,"cy":0.30821860736256135,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ofECbbJ9gme6LxsuNXNjgk","selected":false},{"type":"Heliostat","cx":-0.009542336347863806,"cy":0.2635534019200458,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"v9J8DuLJH4a96cz44K2xmP","selected":false},{"type":"Heliostat","cx":-0.05206955585932177,"cy":0.26313983520298545,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9a9woYxqpxa3DPpGkexnDn","selected":false},{"type":"Heliostat","cx":-0.07505724208173149,"cy":0.3049100736260787,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"btMDteQZ9ZwHR2ZJEJPqTR","selected":false},{"type":"Heliostat","cx":-0.11835071780060315,"cy":0.30036083973841504,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3R6fjmFqnVAn6gX7NVbg6T","selected":false},{"type":"Heliostat","cx":-0.09344739105965931,"cy":0.2598313014665028,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"biLXxZamzgN1buUB8TsZqZ","selected":false},{"type":"Heliostat","cx":-0.13520835436370363,"cy":0.25445493414471854,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fExb7vHaSjiVqB5MGACC4u","selected":false},{"type":"Heliostat","cx":-0.16241044972688845,"cy":0.2958116058507515,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iAmRb8oDGZX392ae33MR49","selected":false},{"type":"Heliostat","cx":-0.17581993335662746,"cy":0.24783786667175325,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mCVU3AM9GsiHSTf2zAYpNn","selected":false},{"type":"Heliostat","cx":-0.20608705354946694,"cy":0.28423173777306227,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"fafqHSKwkZ9Lc6KNcub1iX","selected":false},{"type":"Heliostat","cx":-0.21604838424584447,"cy":0.23832583217936565,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5x5ryjAFNyLBQJSPDZiNxM","selected":false},{"type":"Heliostat","cx":0.25404979900243435,"cy":0.34089037801032746,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hZqvYxemtzLuX56szXzxj2","selected":false},{"type":"Heliostat","cx":0.2092238108687354,"cy":0.35784661340980095,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1xzWMVcb7QUgsZhom23ZBM","selected":false},{"type":"Heliostat","cx":0.16094966980167502,"cy":0.3719078817898521,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9oP1tTsujTz46mZLAksbU8","selected":false},{"type":"Heliostat","cx":0.14600767375710866,"cy":0.4215358878370917,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rpxoJLLKw2wmcNRpjJPBjy","selected":false},{"type":"Heliostat","cx":0.09543476406780727,"cy":0.4322886224806602,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"mCWXPsVjzjnqeov6whWkEo","selected":false,"drawSunBeam":true},{"type":"Heliostat","cx":0.11420804114944189,"cy":0.38307418315048103,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"dk9gN4h4BRr8fGtZgsJuDT","selected":false},{"type":"Heliostat","cx":0.12991629340142186,"cy":0.3313783435179399,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2fgVoHVNeFxumUFrk5quEU","selected":false},{"type":"Heliostat","cx":0.0651676438749678,"cy":0.38969125062344634,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"it8NqwMqJ6jLPQz4dBWJb8","selected":false},{"type":"Heliostat","cx":0.044861854378505865,"cy":0.4393192566706859,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"udHusEwmFchV5kUtJf1ukS","selected":false},{"type":"Heliostat","cx":0.08240840854177511,"cy":0.33799541099090513,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bsUzfzqGGE9YRc9SxnYgmz","selected":false},{"type":"Heliostat","cx":-0.005711055310795511,"cy":0.4422142236901082,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2WagAkKFSQwtBhzW9SCBZ3","selected":false},{"type":"Heliostat","cx":0.01765975901532106,"cy":0.39465405122817027,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"s4VCdFSKVUwKw3ks2MUqmg","selected":false},{"type":"Heliostat","cx":0.03796554851178297,"cy":0.3470938787662324,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h4ZiHa7nr4i5m7fVtmuGTu","selected":false},{"type":"Heliostat","cx":-0.009542336347863788,"cy":0.3524702460880167,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5oXHCCp9pagPTxNZv7YAhZ","selected":false},{"type":"Heliostat","cx":-0.0306143820517394,"cy":0.39217265092580833,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ksbrcBfUU1XjRMYnvbmKvL","selected":false},{"type":"Heliostat","cx":-0.057433349311217394,"cy":0.44510919070953053,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pkwk8jYFuWA8JrrVEXSciw","selected":false},{"type":"Heliostat","cx":-0.10800625900051879,"cy":0.4397328233877463,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"myZ6zveEJCX5Y5KUd9UqJc","selected":false},{"type":"Heliostat","cx":-0.08157041984474761,"cy":0.39258621764286866,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"8N7G24rjGiwUS1qdSwqWKB","selected":false},{"type":"Heliostat","cx":-0.05321894017044227,"cy":0.34916171235153404,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wnaxBMjLgw16qhsxW87N2s","selected":false},{"type":"Heliostat","cx":-0.1597285530009407,"cy":0.4327021891977206,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"tdAXmudejXgsfZaFTCJpea","selected":false},{"type":"Heliostat","cx":-0.12869517660068752,"cy":0.3876234170381447,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2EGGmcigKerWkATYn21Drn","selected":false},{"type":"Heliostat","cx":-0.10072682503008903,"cy":0.3462667453321118,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9JRkgoqFZPzpaDJN7QVEqw","selected":false},{"type":"Heliostat","cx":-0.14746845368232211,"cy":0.3425446448785688,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"cemUSZgbciSABHXVUHVMRB","selected":false},{"type":"Heliostat","cx":-0.18118372680852307,"cy":0.38472845001872236,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7Nd9N6VpCiem7PLD9aoKJQ","selected":false},{"type":"Heliostat","cx":-0.22677597114963569,"cy":0.3748028488092745,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o3vFhXc352dZa6eBcXkn8H","selected":false},{"type":"Heliostat","cx":-0.1896125450900733,"cy":0.3330326103861812,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qXuuzbNe6dHacfosrcjkG6","selected":false},{"type":"Heliostat","cx":-0.2401854547793747,"cy":0.32021204215731097,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wvrbYM3ECPeNyPcjQDEFVt","selected":false},{"type":"Heliostat","cx":-0.27275134359445513,"cy":0.3603280137121629,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1fzbQMf2vnYzc5rpFpv9Mm","selected":false},{"type":"Heliostat","cx":-0.2830958023945396,"cy":0.3082186073598336,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"vzTr4LtFarEKYTmcYc1SSn","selected":false},{"type":"Heliostat","cx":-0.24669863254239083,"cy":0.2709976028271317,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bQQNRPpyECMqE968rws9s7","selected":false},{"type":"Heliostat","cx":-0.2555105789276479,"cy":0.2234374303651939,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"a1ChAzJsqXt2MPj8g71s9i","selected":false},{"type":"Heliostat","cx":-0.28960898015755565,"cy":0.25776346788120114,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ggq4FyzZAgUPjfnxC8sMSU","selected":false},{"type":"Heliostat","cx":-0.2949727736094512,"cy":0.20689476168278068,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2po6rWGbCxwy8HhxH4B5M3","selected":false},{"type":"Heliostat","cx":-0.2624068847943708,"cy":0.17918579163973858,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bdrrNnoWhgNP5mRf3i2NL1","selected":false},{"type":"Heliostat","cx":-0.3256230219059975,"cy":0.2887809716607258,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7YMmZ4VphoH7t76dfCNrKp","selected":false},{"type":"Heliostat","cx":-0.3685333695211623,"cy":0.26727550237358866,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wUtNWA5JuxbJLty1PFij2c","selected":false,"drawSunBeam":true},{"type":"Heliostat","cx":-0.3294543029430657,"cy":0.2370851320281846,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wA8tWR4u3NMA7wqZrTD6LS","selected":false},{"type":"Heliostat","cx":-0.37083213814340327,"cy":0.2184746297604698,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"u1tc8oJuXA2enopmwuzjK2","selected":false},{"type":"Heliostat","cx":-0.4110605890326203,"cy":0.19448776017097064,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"98Xke4ooFncN8FqBo7DDy6","selected":false},{"type":"Heliostat","cx":-0.45282155233666466,"cy":0.11466938377832708,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g3sLafsCK4ZvzmX9XjWqLu","selected":false},{"type":"Heliostat","cx":-0.4110605890326203,"cy":0.14858185457727408,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6fL2zFNvEirpGcgDGmSR7Q","selected":false},{"type":"Heliostat","cx":-0.369299625728576,"cy":0.17298229088383354,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1La1dF2UsKPBp333zXfnQM","selected":false},{"type":"Heliostat","cx":-0.3344349682912545,"cy":0.19241992658566903,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ccVk8kW1m7tdavAe7fX2do","selected":false},{"type":"Heliostat","cx":-0.373897162973058,"cy":0.12170001796835267,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7dYAamQSthGA7dsTStGx64","selected":false},{"type":"Heliostat","cx":-0.33520122449866824,"cy":0.14692758770903283,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k7an2wysM5Qh3AkEZpGd37","selected":false},{"type":"Heliostat","cx":-0.30071969516505365,"cy":0.16512452325968727,"cz":0.5000000000000142,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qMwJPZfpHaQqaVGyt8my77","selected":false},{"type":"Heliostat","cx":-0.3041678480984151,"cy":0.11880505094893035,"cz":0.5,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"sEhiU97pJ6gWPJXqqojWa4","selected":false},{"type":"Heliostat","cx":-0.2666212939351459,"cy":0.13493415291428323,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rbZK8YX7uyaHE3smRfE1iQ","selected":false},{"type":"Heliostat","cx":-0.20443321752274124,"cy":0.12247070829736166,"cz":0.5000000000000284,"lx":12,"ly":10,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","towerId":"nHq7VyAiKvgNuPDrDMejYk","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5JbmNCtS7jdpAREuUBBsWM","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":16,"axes":false,"theme":"Desert","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#b3b3b3","groundPanelY":0,"groundImage":true,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[106.52962106579803,-544.1172181902157,79.8149873216779],"panCenter":[0.9854234887700954,-25.135454432654125,13.426370895100769],"orthographic":false,"enableRotate":true,"cameraZoom":1.5388995055342627,"showInstructionPanel":true,"showMapPanel":false,"cameraPosition2D":[16.412888127805086,-91.5557196774778,49.9998886695533],"panCenter2D":[16.412888127805086,-91.55566967525533,-0.00011133037453072694],"solarRadiationHeatMapMaxValue":4,"showDailyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},499:function(e){e.exports=JSON.parse('{"docid":"vL1ZUsNydJJmwct15vHcrF","time":"05/19/2022 06:27 pm","timestamp":1652999233628,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022 10:15:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.804781891550604,"longitude":-114.97646752496185,"address":"602 Eldorado Valley Dr, Boulder City, NV 89005, USA","timesPerHour":1,"pvGridCellSize":0.25,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":10,"airAttenuationCoefficient":0.01,"cspGridCellSize":2},"elements":[{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"7L9JEMbgdkHJqyQYNhEPJq","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"irFPLxmMLT6rFDoJKoiKhb","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"8eu7vDhv6KUhHi9npAWqM9","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"qipbq8ah3yAaXFiTtNqwjz","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"8jsKzdYVfC5Vf4Nnu5jMbP","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"9VBTZXtWX26kqjkAsCS6nu","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"aUYdyUNGi8bnHineP3zqz5","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"bEQifGheSWzXErCQEX5jc9","selected":false,"dailyYield":2225.1916629818006},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"r4v1okttD44Z3thaT999zr","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"vbsjU2syn8u3VcPEUEvfUL","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"rS9gedRi7TPFSNSehAoH5T","selected":false,"dailyYield":2184.0618993549374},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fjnWik4gwK6dVzpp4PS9CN","foundationId":"fjnWik4gwK6dVzpp4PS9CN","id":"oYPRYVsGHKMvvbMQksPZAx","selected":false,"dailyYield":2167.4086752704884},{"type":"Foundation","cx":-268.72128837305235,"cy":192.4499625139658,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fjnWik4gwK6dVzpp4PS9CN","selected":false},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"somwUXH46rWWj2iEWaBpTH","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"f6fusQGihys5Uk5wRLiqtW","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"xxRJM6MpW6jZoZtDe4gxTL","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"67cNGKEATuXayJC7fa4ov6","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"jTDbg2GsKFSXSL5kfEKwFM","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"otoVZiatBWpjEMBHcFE1vB","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"a61aJ1UFYsWt4ci4mKq9SJ","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"3oeacHzGeVf2rX3iv6QkKf","selected":false,"dailyYield":2183.952515711261},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"j4UdupxMbEhx9RPqd3Kxbe","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"eU127LCRTi1gGCpMprsZjB","selected":false,"dailyYield":2183.9840846216266},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"9dKhxKmMz8HYSCd8thjHfi","selected":false,"dailyYield":2184.0494263190526},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"h3DXKV7Y684i3thRma6wLu","foundationId":"h3DXKV7Y684i3thRma6wLu","id":"8niYJz4X5kqK7PxotD8v8w","selected":false,"dailyYield":2184.0217279415574},{"type":"Foundation","cx":-96.65608919286746,"cy":194.42114792003463,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"h3DXKV7Y684i3thRma6wLu","selected":false},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"bzpE1WucZoTcJnrQaFWosk","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"b18nYFHTAeTLPg9V3TAu6r","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"vnJbcrncrmPTTZtSNizQZx","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"uuobSx6wZMqJ4o9dEx6874","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"fkkZPubbk2sVhakgHyJg8p","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"nKo71iVf2HXcRbr4UCGY4B","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"s73CuihHSMyjifPJZbc7fj","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"bPUahAh6uikU5BjNj3PBL4","selected":false,"dailyYield":2184.314471867017},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"uwbEdmDhH9hKvJBzSqoFEi","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"ek8zDL6MWZ5xk3JieUZvVt","selected":false,"dailyYield":2183.9840846216266},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"4f3PT1Wrj5UjbZFwB43q6Q","selected":false,"dailyYield":2184.0494263190526},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fiH8AWThFS5EVx7AwfngqL","foundationId":"fiH8AWThFS5EVx7AwfngqL","id":"bV9jU3U5EG7hj1ZR9htRmc","selected":false,"dailyYield":2184.0217279415574},{"type":"Foundation","cx":76.81490256290738,"cy":193.91833345117703,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fiH8AWThFS5EVx7AwfngqL","selected":false},{"type":"Parabolic Trough","cx":-0.04454509140457573,"cy":-0.0080567453075295,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"t8xtXgJ4zQkhGJAogmq8d9","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.028178433926039068,"cy":-0.008139307894208355,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"bUFAb96RGW7QwKBQMcxVPN","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.11348203554423389,"cy":-0.009985318932966891,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"6rj3ikzy3Q8n2yfz1CwRXN","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1829903788505871,"cy":-0.009114355848154284,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"1WNeTRgxoSTT2DQJu5yyHb","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.25148985811792923,"cy":-0.010411589149102113,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"cWDWPkRX7GebUfNP1qoDPY","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.3213430444980177,"cy":-0.00840045293698594,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"dC1wGpGBnzJBEAzPE8gK7z","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.38740964968714997,"cy":-0.009828258759322559,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"jLCGM5EGeijybwhJJbzYWo","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.4537412982117307,"cy":-0.010542161670490834,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"fofxsexPNsKCB5DuhFZbhA","selected":false,"dailyYield":2184.249130169591},{"type":"Parabolic Trough","cx":0.09586378956336611,"cy":-0.00872263828398791,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"scR8HVKLnxMfg5qeM5Lugw","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.1635491452006934,"cy":-0.0072948324616512175,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"aJRfgV9p4QZ5EqYhzKMsGH","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.22988079372527398,"cy":-0.0072948324616512175,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"jbKhaZc18QopEFA48QhFGz","selected":false,"dailyYield":2184.0618993549374},{"type":"Parabolic Trough","cx":0.3002735635880945,"cy":-0.008008735372819492,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"gfBbYgpDbuSQ6xjoAfmVTg","selected":false,"dailyYield":2186.5619099124656},{"type":"Foundation","cx":265.415477246936,"cy":192.50545738235357,"cz":0.05,"lx":211.2723746451423,"ly":400.6159826636368,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"v1v8XPTexYoFXFrbQfvcXN","selected":false},{"type":"Parabolic Trough","cx":0.3626690294198999,"cy":-0.005427557483579055,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"kni2ZMXaAJJiwviDVB1raV","selected":false,"dailyYield":2186.372284672933},{"type":"Parabolic Trough","cx":0.4327954824820787,"cy":-0.005427557483579055,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"v1v8XPTexYoFXFrbQfvcXN","foundationId":"v1v8XPTexYoFXFrbQfvcXN","id":"bETGj1xEbbAb2BVse1AQM2","selected":false,"dailyYield":2207.463112852368},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"s7kVKBTAaDo2hjd87z12j1","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"2TcdonCE1i3zpYReX2SoLR","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"a2NWUVKnwbFux2PYtz5CHH","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"t3XK5N3foFHRBevW4hQYeH","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"gX7yumpKKrmXnqYJweAwxw","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"wydrS5X5dqpbWyrqFYtYX6","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"ko9LprY6zErxhRNVTa6b2k","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"tUbG4wALaTZBXqDzrZWjJa","selected":false,"dailyYield":2225.1916629818006},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"cwror37w56snxd6Cu57GYv","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"djRCaY4JYizuqL9V1t1Ef7","selected":false,"dailyYield":2186.416326619183},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"wUb1oL88fa6vEHWZxPkspJ","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"er6dYYMfRpcyAunmGzAVCk","foundationId":"er6dYYMfRpcyAunmGzAVCk","id":"8CofMvmPY2z5bBHdRWwYyh","selected":false,"dailyYield":2184.2214642544664},{"type":"Foundation","cx":-274.1742441205048,"cy":-205.8730240503783,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"er6dYYMfRpcyAunmGzAVCk","selected":false},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"jrgrdJiY66ubYTKCaCxqTB","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"fs8ejjGyyEChaC8Ehk8T4z","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"wXPY3K4zXtXUdVp4EU5wHC","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"woCUpwEYEVwQQqjCWLCbcb","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"8fA8M4gu6FFx9kstBhM3Gh","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"vdKSaNvMHXQ6c4CUhsUbjJ","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"nfHAWXJBNrnZk4SZXBZRwQ","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"oG9kEtQxTKYAx4RBkRru4e","selected":false,"dailyYield":2200.564116598536},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"eZZfAVvGcJQ4hyoRBRAHxH","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"1fvahJfFg2KKz9NtwScfEZ","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"whVGRaA9vi5x7rhQNFg1yE","selected":false,"dailyYield":2184.0618993549374},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"7yEBa2PPK1oKGZhA24cAWz","foundationId":"7yEBa2PPK1oKGZhA24cAWz","id":"c9Dk9vaeTmZUcYmk8LG9yA","selected":false,"dailyYield":2184.142140950794},{"type":"Foundation","cx":-99.03928963053315,"cy":-203.22690478352843,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"7yEBa2PPK1oKGZhA24cAWz","selected":false},{"type":"Parabolic Trough","cx":0.03316589475856172,"cy":-0.010780769866564623,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"9xAb6RCYhCVXhVokdoTNnm","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.11829771071037172,"cy":-0.010862875281584672,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"mQojvngU3MK9E1WnMgnuYU","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.047533262963747026,"cy":-0.012698664451544644,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"fdpnWcCJudkZEj98eat8mA","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.1289013135714454,"cy":-0.011832524127915169,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"eXpPJSpHuPPrV44B7sxjrT","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.20908836494541524,"cy":-0.013122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"bKjSqKtUrMBiHDZpPLvptN","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.29086009671339874,"cy":-0.011122574292725078,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"bUtfJ12cGNMZZLy3onCpbF","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3681991702518812,"cy":-0.01254247396310519,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"1coPe9Q5rGuZ2WSaiij8Le","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.44584850955856004,"cy":-0.01325242379829521,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"2yk58NVaRPhqHjxMFDwXYo","selected":false,"drawSunBeam":true,"dailyYield":2184.5259546735324},{"type":"Parabolic Trough","cx":0.1975317304110644,"cy":-0.01144297561120463,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"6x4yDGfJw4eCZ7ekCPhjNt","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.27676575011175697,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"xvTNCko8YFvfGqK1kgUt12","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.35441508941843575,"cy":-0.010023075940824447,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"gVdwmaY8duSTrt1vAsGAxn","selected":false,"dailyYield":2184.0618993549374},{"type":"Parabolic Trough","cx":0.4368184699071563,"cy":-0.010733025776014468,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"k36HZDupiVkAR6X1Ux85J2","foundationId":"k36HZDupiVkAR6X1Ux85J2","id":"nYEBq3ov1hbfwdFnEPb7Kh","selected":false,"dailyYield":2167.507403284107},{"type":"Foundation","cx":75.63743844199865,"cy":-205.7462806691912,"cz":0.05,"lx":180.47861093274906,"ly":402.84665494366976,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"k36HZDupiVkAR6X1Ux85J2","selected":false},{"type":"Parabolic Trough","cx":-0.033179547828226484,"cy":-0.00957350532887952,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"ezm6CU1apADueQgyTsSmZn","selected":false,"dailyYield":2184.0376473630754},{"type":"Parabolic Trough","cx":0.0413587397995383,"cy":-0.009655416682255636,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"kevGPawVmfF7HkTwPXwpqF","selected":false,"dailyYield":2184.10105124523},{"type":"Parabolic Trough","cx":-0.1038367629054752,"cy":-0.011486866841637427,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"uandqWKZFgnXJhXCrgQ2QQ","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":-0.17507963599701507,"cy":-0.010622773698636264,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"kpSVEzPLMTEAVhEWUE8vrF","selected":false,"dailyYield":2186.481668316609},{"type":"Parabolic Trough","cx":-0.2452884695865472,"cy":-0.01190977474353469,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"xzPQyiCUDpURAjVcdpLis1","selected":false,"dailyYield":2184.1530697342855},{"type":"Parabolic Trough","cx":-0.3168847910580943,"cy":-0.009914501877400738,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"1oovrq6jnWYwDxtZ3cBFmK","selected":false,"dailyYield":2183.917234353839},{"type":"Parabolic Trough","cx":-0.3846000399791258,"cy":-0.011331045519871718,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"royQeirmSLt4FSVKZM7K9n","selected":false,"dailyYield":2184.1029890605014},{"type":"Parabolic Trough","cx":-0.45258694619787027,"cy":-0.012039317341107171,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"eHq1QWB15jeB3RweUWBig1","selected":false,"dailyYield":2183.9634444947524},{"type":"Parabolic Trough","cx":0.11073313390029775,"cy":-0.01023414590591861,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"bX6TtHS7whnu5gLA4WYDBw","selected":false,"dailyYield":2184.142140950794},{"type":"Parabolic Trough","cx":0.18010752800105748,"cy":-0.00881760226344756,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"vfvomP4GJj2bUfaeRmSTnY","selected":false,"dailyYield":2183.9965576575114},{"type":"Parabolic Trough","cx":0.24809443421980182,"cy":-0.00881760226344756,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"aKsJXH85Pv1TJFkCUcHtaj","selected":false,"dailyYield":2184.074372390822},{"type":"Parabolic Trough","cx":0.3202438040845918,"cy":-0.009525874084683014,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"5d1oEf681m2BEya8bQE3Zu","selected":false,"dailyYield":2186.5619099124656},{"type":"Foundation","cx":260.2382130043768,"cy":-203.83085358802796,"cz":0.05,"lx":206.12858677265922,"ly":403.80106579029473,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"Foundation Texture #1","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"tnLBLu28SYP7t6wfKCqrkm","selected":false},{"type":"Parabolic Trough","cx":0.38472948235042653,"cy":-0.006082018282359512,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"35zz9s2izu4bSZ895qaY5m","selected":false,"dailyYield":2186.4500637242113},{"type":"Parabolic Trough","cx":0.45459040213804675,"cy":-0.0025158234685137603,"cz":0.5000000074505806,"lx":4.7,"ly":390,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"absorberTubeRadius":0.05,"moduleLength":10,"latusRectum":6,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"tnLBLu28SYP7t6wfKCqrkm","foundationId":"tnLBLu28SYP7t6wfKCqrkm","id":"8LPfuFyav4kWtBZ6BHp2RQ","selected":false,"dailyYield":2207.323568286619}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":false,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":16,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Desert","autoRotate":false,"groundColor":"#999999","groundPanelY":0,"heliodon":false,"axes":false,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":true,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"hybrid","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[415.56554854788317,378.8681570116889,50.208533152612546],"panCenter":[53.36331727441414,25.641045916575948,4.010932124381785],"orthographic":false,"enableRotate":true,"cameraZoom":1.3888568037446718,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[7.614289529137672,-228.9673229029426,19.999771022501545],"panCenter2D":[7.614289529137672,-228.96730290205363,-0.00022897748026825466],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":5.5,"showSunAngles":true,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":true,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":1,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelX":-5,"dailyParabolicTroughYieldPanelY":5,"showYearlyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},500:function(e){e.exports=JSON.parse('{"docid":"anrFxSGH61K9md1hspSx6c","time":"02/02/2023 12:15 pm","timestamp":1675358110494,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022, 2:30:00 PM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":42.2844063,"longitude":-71.3488548,"address":"Natick, MA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.5},"elements":[{"type":"Foundation","cx":0.08101414969184528,"cy":-0.061088068754476144,"cz":0.05,"lx":30,"ly":30,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"1jWhHcaUD3hYBmq8heF7Mt","textureType":"Foundation Texture #2"},{"type":"Parabolic Dish","reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"latusRectum":15,"relativeAzimuth":0,"tiltAngle":0,"structureType":2,"receiverRadius":0.25,"receiverPoleRadius":0.1,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.0015648838470118183,"cy":0.002268855297546398,"cz":0.5000000074505806,"lx":8,"ly":8,"lz":0.1,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"1jWhHcaUD3hYBmq8heF7Mt","foundationId":"1jWhHcaUD3hYBmq8heF7Mt","id":"n6Wes9AHD6Nu1BFW2ixX6c","selected":false,"dailyYield":58.654024482322484},{"type":"Cuboid","cx":-0.0385404512454377,"cy":0.14330355436037368,"cz":0.5,"lx":1.410367011670566,"ly":1.229722993301011,"lz":1,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"wjK4XRngAZ84SKTN23jchz"},{"type":"Human","name":"Judd","cx":1.5445606997476098,"cy":-3.0401084333788013,"cz":0.05000000074505806,"lx":0.6,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"1jWhHcaUD3hYBmq8heF7Mt","id":"weMPyi8cZcMft87uExNbWN","selected":false}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":true,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":18,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Default","autoRotate":false,"groundColor":"#16cda5","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":false,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"roadmap","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[-2.420183280635814,-15.878268188373001,3.8943744657694412],"panCenter":[2.874525283798386,1.555148727597212,3.8943744657694412],"orthographic":false,"enableRotate":true,"cameraZoom":31.733468832186784,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[0,-0.000020000888987681265,19.999999999989623],"panCenter2D":[0,0,0],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":5,"showSunAngles":false,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":false,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"showYearlyParabolicTroughYieldPanel":false,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"showDailyParabolicDishYieldPanel":true,"showYearlyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"stickyNotePanelRect":{"x":0,"y":0,"width":200,"height":60},"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Parabolic dish"]}')},501:function(e){e.exports=JSON.parse('{"docid":"7ug2PMzZs8KHaJfo9T19XG","time":"11/13/2022 05:52 pm","timestamp":1668379966922,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"5/22/2022 11:30:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":40.50104939260215,"longitude":-112.3735469155903,"address":"West Maint. & Supply Road, Tooele, UT 84074, USA","timesPerHour":1,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":5,"cspGridCellSize":1,"cspTimesPerHour":1},"elements":[{"type":"Foundation","cx":-47.0206360597426,"cy":68.67019638501287,"cz":0.05,"lx":46.5768885127422,"ly":135.19445156274705,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"cZGzTuNW8Aam7msowwUroB","selected":false},{"type":"Parabolic Dish","reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"latusRectum":8,"relativeAzimuth":0,"tiltAngle":0,"structureType":1,"receiverRadius":0.2,"receiverPoleRadius":0.05,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.30761593322410435,"cy":0.2695290878919692,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"fopwswffzD41xMfw42A9HH","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.02814798372485404,"cy":0.3300697435564625,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"uhQ2BDDLEGyfXHXM3T8D4J","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.015122118824723977,"cy":0.2725477934518696,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"1hU2B3tRaXiQA6qMShWWWm","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":-0.3100390677195005,"cy":0.3278398594863607,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"iEABxF7nkChkFiL5Znzw6T","selected":false,"dailyYield":55.267670961749594},{"type":"Parabolic Dish","cx":-0.309076286400796,"cy":0.20865185910064502,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"6dujuDwUqfLaFeQofWwJLp","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.30842094785613033,"cy":0.4471386572368095,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"cxNbMe5Q6mxcWpM69s2zVD","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.3641465280539995,"cy":0.44914206870604134,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"nvnv9aQWWLSS8NFmBnHLYH","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.021675504271373644,"cy":0.4499260123244368,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"1XvYz7yo4kDAwFbbyEVu6r","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.3641465280539995,"cy":0.39329601584788454,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"iAqeVhRsv4EEemyXLxRT7n","selected":false,"dailyYield":54.746079474767235},{"type":"Parabolic Dish","cx":-0.31489342730961073,"cy":0.3858168453090086,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"8887sGWkY9DPe6zPB7DCjw","selected":false,"dailyYield":55.365730353380805},{"type":"Parabolic Dish","cx":0.36706723440738265,"cy":0.33342502224319376,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"w4H13nunp4KXu5rLSjHetr","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.021675504271373644,"cy":0.3919490265017887,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"8A9nZ4G6EMbXmR2ypdZPtC","selected":false,"dailyYield":54.566999890968724},{"type":"Parabolic Dish","cx":-0.3119969927541789,"cy":0.15179957105585468,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"9xvM5C54F1GdXuQmPkbXHv","selected":false,"dailyYield":55.20229803399546},{"type":"Parabolic Dish","cx":0.36852758758407417,"cy":0.21317991744049564,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"dWXjd19yWhBU5KYeV4ep7R","selected":false,"dailyYield":54.63098088367212},{"type":"Parabolic Dish","cx":0.36852758758407417,"cy":0.2740571462318198,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"9RH7D4KCkHBkHBB3Jq4YBh","selected":false,"dailyYield":54.43625403546045},{"type":"Parabolic Dish","cx":0.019503178354798405,"cy":0.21317991744049564,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"pPqHXoZxFqCJhooD9iRhGL","selected":false,"drawSunBeam":false,"dailyYield":54.56560795591798},{"type":"Parabolic Dish","cx":0.029710257140191706,"cy":0.151618028448374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"dW2wLBrURiiyxfn6F6TVAM","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.38263449035227737,"cy":0.15356864871672385,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"4FQ9iN4DZGms63ywmg5spd","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.3118902038832707,"cy":0.033930573598891456,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"5oj8TRyAKMqMp8sgE67FVE","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":0.025935666410650624,"cy":0.09374962715399743,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"vmGfUGiMyftJojwfX2GBR5","selected":false,"dailyYield":54.56560795591798},{"type":"Parabolic Dish","cx":-0.3005664316946478,"cy":0.0924492136417643,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"oYSwSfAfrKU47Vyq9eDs5P","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":0.37131071816365446,"cy":0.09570021542996741,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"ngsGcTkVVzJ7SPc4n5EF9z","selected":false,"dailyYield":54.43625403546045},{"type":"Parabolic Dish","cx":0.3788598996227365,"cy":0.036531432615737686,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"3kBsJoTshaWDzS9NKouLiE","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":0.029710257140191706,"cy":0.03523101910350445,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"o4R1QpEifXnNSRVbUJpY2N","selected":false,"dailyYield":54.56560795591798},{"type":"Parabolic Dish","cx":-0.3043410224241887,"cy":-0.03499134254946713,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"wg9A7xFWVB5Q2Pe6NVpsFv","selected":false,"dailyYield":55.333043889503735},{"type":"Parabolic Dish","cx":0.03159755250496232,"cy":-0.03434113579335057,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"nMbKYu7cUV1STfkS1t9GBe","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":0.37131071816365446,"cy":-0.03109010201276759,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"1uAa3xWKSo4ZMy4qgrtWHV","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.30245372705941853,"cy":-0.0954605708683097,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"4W4HyJzntbsbMubTzJ5xuB","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":-0.2949045456003364,"cy":-0.15202852665807323,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"hLUWjDDawa9Bq5bGdgVF6r","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":-0.2967918409651067,"cy":-0.2150985820013824,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"38LakMABYvqqhWZJbnchb8","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.2949045456003364,"cy":-0.2716665697835258,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"qS3hKai5cPy6hqmvjMrrT8","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.03159755250496217,"cy":-0.09285974384384334,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"7N2it6fkLMZs5QL5wVYmmH","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.03159755250496217,"cy":-0.15137835189433643,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"jY7wFhgsoDdty76ov6d7Pd","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":0.03537214323450325,"cy":-0.20924675318871294,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"u2YWuzVpBajQANuw9UfAwL","selected":false,"dailyYield":54.45190129987361},{"type":"Parabolic Dish","cx":0.04292132469358527,"cy":-0.27101636302740917,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"3S1KK6FChNE8gvYazHEnpd","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":0.04103402932881465,"cy":-0.33018517783401885,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"uLmHzExRSUXhHpNKBjVRrt","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3864090810818183,"cy":-0.09285971185146352,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"3cxdvSGi3uCkPtzjoDyARg","selected":false,"dailyYield":54.58264715538189},{"type":"Parabolic Dish","cx":0.38074719498750675,"cy":-0.15332894017030646,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"s6fcxcWAD6NVtUZVHCQQ4L","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.38074719498750675,"cy":-0.21249775497691611,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"bSdLYguwQYmYpDu9RumiMQ","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.38452178571704776,"cy":-0.2697159495151761,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"2fyj3BUAEUoyYeFCWw7srW","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3901836718113594,"cy":-0.3295349710779023,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"sjmKi4AsX1sdYN2tTKwmA4","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":0.051333272176731434,"cy":-0.38693722362249716,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"3uEbgTc72rFmahkwgqJg8W","selected":false,"dailyYield":55.12127784182816},{"type":"Parabolic Dish","cx":0.059035555614381244,"cy":-0.44796941122274353,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"nRqAdpZ4TZQVjnRmHw48uX","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.3902337434333181,"cy":-0.38516817470654796,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"cfsJe9Yug6u3x3oBayEheP","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":0.3902337434333181,"cy":-0.4453158378488198,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"cZGzTuNW8Aam7msowwUroB","foundationId":"cZGzTuNW8Aam7msowwUroB","id":"wMxTgYHNjkaxthyYgYTQP9","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"i9fZCix4TrJKhgCcneBYW4","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"n7aRSWWeY5wBNzZ53XV5uA","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"jWLZDGd195KJE8SWN597fk","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"76YP5Bkbjqbnqsg1JSHTGc","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"b9eyjomDdJAvbQ4GXbRhbG","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"9soCdCwnL8Bku7MHtRFFFr","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"tFv5W1XKGRjyGCtxQnPjfn","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"e5TE4DCQ6xiHjtxHX6wtr3","selected":false,"dailyYield":54.63098088367212},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"vsS27cuHcFevK1BdwYeKu3","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"hre13LuXsebRJ1ojBkKSgR","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"xrGCkZHLfRSASP6ZwrmBJr","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"nCfyMKMf1W4ncpysKWy2VY","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"mNMLU3z9EypRpQKmc6xPri","selected":false,"dailyYield":54.53292149204091},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"7g2aMKZxh6mDuScjaSitCf","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"woNtmkrzdE6LQEpkJkkk15","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"gQJWvo8v2H3LF9QwKDg5pS","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"psqWbKt21osCHgusR75ZRM","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"qA6D1GimsUYSX5jHTZtGrL","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"rFR9awpETFNeLqanJsWtLB","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"79pQRAYjXXzrw8FMTxx7da","selected":false,"dailyYield":54.53292149204091},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"j29brne3bouFE3K9xbRzf8","selected":false,"dailyYield":54.37088110770631},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"fEsQhg9meEj7fn6FyQr2kS","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"grDso13WfqFPnwde3tTooZ","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"5znkiYKSLhmEUCEWv7SMww","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"h7EfHGkuVpHhLEE2L8UnPe","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"tWy5pSLVYjou9HU9WNjk3B","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"oMmcyG29c8iK7NppnVHGcx","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"uCXv9kmZSPkBfAiRp688jH","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"2MLMRe971ACXtPr6TKkSZ9","selected":false,"dailyYield":54.45190129987361},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"m63BuQNzvckE5zp32Pnw8p","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"8HmQpAPE5ybDjjJmWPgtJy","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"p7X7PWYKqawwVRyKWEqpsP","foundationId":"p7X7PWYKqawwVRyKWEqpsP","id":"pofnF8e5Bn6CnkFwwsd2mb","selected":false,"dailyYield":54.663667347549186},{"type":"Foundation","cx":-7.983643923093517,"cy":68.40825112249922,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"p7X7PWYKqawwVRyKWEqpsP","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"1Kr8Pa7CfCGfY9Tn1nbTfC","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"oRpi5CP9ZYynPy6bNyVZvx","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"bnjSVLBE8yuyRmD59Vpj5M","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"mxrBwLk3PBAc6DLtdHY9PG","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tCEaJXp5M1wEhEUpBtW2dn","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"nMM6ewc9ExA5TMPbfnv6Kz","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"n8s1FzD8MfqqBcK6r49KaJ","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"nH9Zop5fMNGnprvUp4Lndb","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"jkAXkFfxDNxSdMms1xtkQh","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"wrcKx46bR9u7RcdSgcckCp","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"wS66DR1C6Yem5chszyHNyX","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"mYGta2zZcv5wvFcomHB8h7","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tK1eBhmW8y1nnsX8W3X9ga","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"8Ci425obALWeV7icrEGMh3","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"3A2AjfypMamwJFRbA3fDpb","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"iWsTN7vg5oFv8hHDnyjZDQ","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"gXTojLu2Qyb637Ho6JL7Kf","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tavpWfYoXMz3qMPdKYuYus","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"vR6bFNvW7QL6DHxH3K21u5","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"jSCfJsog1e1sNpYz5PNhWW","selected":false,"dailyYield":54.615333619258955},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"eUyRyq3GvSH1aXZPres9zE","selected":false,"dailyYield":54.599686354845794},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"rDZgMEP11vSsiXW54EeeEC","selected":false,"dailyYield":54.56699989096873},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"fbaSKG8oqr7FZVwDxb6HR5","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"xAycaD99dwN2jw1eYE8Ajm","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"jgSWeMLe27dY6x2hNzCmsw","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"sgwE3sAhyMWCJxEUC5V8m2","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"hNVN4iBp2cmmnSn75ekkgF","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tWdCrzBigxazk84saCEaTV","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"kQJuw3tnnSYASf2nicv61Q","selected":false,"dailyYield":54.56699989096873},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"qJWMwjmsMFnGLQ7tP8657U","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"tsiY8ux1n2J8yeqE2sunzz","selected":false,"dailyYield":54.746079474767235},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"gEQRhWXA3HL6aJzGgTrAzv","foundationId":"gEQRhWXA3HL6aJzGgTrAzv","id":"wJKc8tsYNihwhLcJrfyUHp","selected":false,"dailyYield":54.794413203057466},{"type":"Foundation","cx":24.06375725188695,"cy":69.025369785858,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"gEQRhWXA3HL6aJzGgTrAzv","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"1tz7amW9Vt4xEPqwef91Qx","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"sqvvuQJTZHqqySn6E4yYzm","selected":false,"dailyYield":54.69635381142626},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"28us4Wgm2qjx3DCcTdFLVV","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"mpqP9TF6Vrg7VCqRfcMiQu","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"f5qiT4VRUPdGpUjZXcsCx4","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"nTXZjqhzJBfTANgYD9vqjQ","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"rgnTEBGw6Vs7Duns1brscG","selected":false,"dailyYield":54.92515905856574},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"tGKA519iyUSWpQ8wVPNFJY","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"36gvqnTqAbkoRPjVMK7ems","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"viuvE72Bw3v6bsArR6wpDL","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"ii2gGoQHtGShTH1opfyXnJ","selected":false,"dailyYield":54.810060467470635},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"wcNvEizmbvgCX8phLyizju","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"jxCiGYqKr7CGg8yTBhpkCm","selected":false,"dailyYield":54.66366734754919},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"aSt2wCgvcriyqmRzVHYc9K","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"b579K6wcGsFkd5krT6NwtR","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"2tXe7mE16iWBsHUwW9t9aQ","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"aEUirhH7z57xAhv18Lb7W8","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"4dXM3M8KmCej1LF8VHJ82Q","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"h15HDWZymQfADqEotRv4LM","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"x3Jjg4ZJhqJ9gBq8UJG8Yi","selected":false,"dailyYield":54.69635381142626},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"qfDWqhtKKj8PExp7dtRJhP","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"dQzc3rdMh6sEoS53j5m6LC","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"dFarDxb3HPmwwaAxStasmq","selected":false,"dailyYield":54.810060467470635},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"gJLG93xPyBxAvQZy1eFr9c","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"5gNcrnds5MDuA88znfoVWr","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"7mL5Pz5pqsdiMAMyaHTbZn","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"3Uic4JFDxCdyp5oDg5ZLjd","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"14ENGCWNQVrrvGhEToEBLF","selected":false,"dailyYield":54.59829441979505},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"qMfSQPipp6HAYm2FfTRsJk","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"xxoYKaPf4MobsN7VjTosNC","selected":false,"dailyYield":54.810060467470635},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"9MQxESnXS7CKvarDbKvrgD","selected":false,"dailyYield":54.50162696321459},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4cePh2t5mTkfEKXcWmB48u","foundationId":"4cePh2t5mTkfEKXcWmB48u","id":"cVpFdWbUmKZPYFqiQr279G","selected":false,"dailyYield":54.663667347549186},{"type":"Foundation","cx":59.02948227812328,"cy":69.3080716212459,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4cePh2t5mTkfEKXcWmB48u","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"jesMtDuJVoPzLUmYETT89Y","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"97DnJZE3VTJfvvv6WzSRBx","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"vLPycCjUNJMSVTRtdj87XE","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"jPB61vSkRGEcXezoyJ9S3X","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"jULEb9dCHn3aTywUeHy3Qk","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"9Pa2h5sxqEBhqE3KgZbB6Y","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"se2JtcnQNE96z1Aum4EP1p","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"qfZULw2aGPUTLCVySZhcyp","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"qWNJdtQvxfzJj25Q9ioKpB","selected":false,"dailyYield":54.90951179415258},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"bxmvcGXZuBN8ktU47D4qP6","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"aNn3VE1DQvLpKgE5hUztNH","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"4mrZamvWvRpkYyqFS7RJH7","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"kiUHJLZUPqkGhKHBaWrqz7","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"uGSXR3GUiGp8nT3strVk7J","selected":false,"dailyYield":54.90951179415258},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"a1tN8yxLHdTXbX8ex2fpZB","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"s5oswXys4g8p8gmSXQvhkY","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"3D6zM2RHwSJFo7RfUTRyjT","selected":false,"dailyYield":54.90811985910184},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"cAzviKAUbsLWBdNTADoifP","selected":false,"dailyYield":55.13692510624132},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"ohGxTVAnBTQUju6j187cfL","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"jGoKYV4BSgv6J6296BizzQ","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"pPTV9qje8c7Wfg3GZqDMP2","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"x7uhR1kYgxibupXzAN9oWq","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"inz76DVy6KaN3KVR3CkPpG","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"dY4oZaF8y7JXdRxLLuqg9F","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"gmBkncxUG8PdQJo2VaespL","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"qirhM6vbtt83tpYszhnTaf","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"mRdCjwmZtRhDjNaoHZAsP7","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"bXjnb3U4gRd6Gra55HizMY","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"gTiRGPwLKRdtjktFgKt9hU","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"fFcZ5RiAU7SbEZpodham4W","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"rtWNXEr4TFs128rHeq3GAn","selected":false,"dailyYield":54.94219825802965},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6ufo5pBdzXZ7dduj1GnnjN","foundationId":"6ufo5pBdzXZ7dduj1GnnjN","id":"t2MHCbHPUk4iMrfBGmBEg8","selected":false,"dailyYield":54.99053198631988},{"type":"Foundation","cx":90.89697850456658,"cy":69.75067573550228,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6ufo5pBdzXZ7dduj1GnnjN","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"fBXFhCMe9NByYzvxwGHn6i","selected":false,"dailyYield":55.267670961749594},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"4XR37wV3Mcb5e4xnto9S5W","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"bF47T7o7w6UzeEcadSPaEe","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"vDEGXq7dyykKUFPikw7ZQv","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"ib8cPgm3UdpJKVhC7u74X9","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"fZnwkYdYn246TusSuwFy5d","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"npP5tD7NGDuPXSYzaKJSef","selected":false,"dailyYield":55.31739662509057},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"fyCVrUXjd49v6w3fUmCpmi","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"aEvUZ9jmc1SE9AqaTs83sz","selected":false,"dailyYield":54.40356757158338},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"c1aNagv3k5EwQhxqv1nQKW","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"3NCPuFUbbF4P3Uet9iqrKg","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"6sXkkWHPNQdQZGhmwNLthw","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"dC6pSLCpcbcZtkkLTZbGAP","selected":false,"dailyYield":55.20229803399546},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"sNDitQDQ2BGYEwghGZPxAc","selected":false,"dailyYield":54.40356757158338},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"3AapXAvkjJa5rztXETgT3X","selected":false,"dailyYield":54.58264715538189},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"1sKKkXtyuaMN8kgH5vX2ow","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"pJSWbff7eW8x3ExEm8MBdv","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"j6c75GwBD7xrTUdv8qzwcW","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"2DRktLVHmu4BwC4tYrV1hj","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"nRxkdY7Y2yR2SriqiuWofB","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"x5RkBxY41nZxXDJuxoiDZr","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"pixrQQvfkddWpaEq8muTrJ","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"jnLvvVhZEPeAJ2hpXvtXHJ","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"4xUoTNJFMJTerAQEErQ895","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"rkAQYL64Uuf379mtTX5GQL","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"rSMGuNL6giL7Nj4oWDSndP","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"3mr4Yjw79aApbRSuyrtamK","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"nHYzCZrgSVVxvF52MMmEG2","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"idcvngByfHJwgkBsh65JbP","selected":false,"dailyYield":55.15396430570523},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"pKoUwgWmomU9tDX1avSdQc","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"7LDpCzc3zBHLv6JhymAwbQ","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzMWxWAUm13nPZAnV26ojB","foundationId":"dzMWxWAUm13nPZAnV26ojB","id":"dowp1omeYXWab3j1K1meZc","selected":false,"dailyYield":54.58264715538189},{"type":"Foundation","cx":-136.49179476446375,"cy":-67.2349056273395,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"dzMWxWAUm13nPZAnV26ojB","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"dKV8idVwG1PoPzaqAJySn3","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"1ahCnzARH22rtYMg3xC75a","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"bGQnA5qfcBJLc7EFesifJ5","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"6abDjWSHbyPb8tqD7whFWE","selected":false,"dailyYield":55.62722206439736},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"pMaHgYpvL812956oXKBJ9T","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"vxBLBNexEATeuUVFW6UUb7","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"uEpK7NuFxhDZu1zciefV9E","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"adThs3Jwyt44gCESDNcupo","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"wJBFAEWUBufYWoCYyAAkDL","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"6fBBqnwyNxUJ2Mv27sMzNz","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"xku6MhBdpC6odzRtL5Rhsi","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"dCqY1YvNDa7QjZLsD7an8D","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"6yKCwMuBAuUpAxR3UkM2qV","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"9QuEw2Qd3kdbe2VGUtFG6d","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"fDUJgpBZqufUYAcgUpEYy4","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"7tpsaUo8qyex4qWWrRQa3Y","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"ac73uiJL9mDwp2h2qMBea1","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"pvYusR6DDwKSrhWjzrsGjq","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"fUxcXs6rResj8vGRQz5ADd","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"34XDNLYmgiixgYDTAvdY6U","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"eKnBHRagP12sRw2eHV4EFo","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"cKEXyvhTD3Jnxtg5cg1jRA","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"ngLd2mnBcPdF96nEdG4hH9","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"4YV65NmWmmduXoMXuWXF1E","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"dS2vQTwT6npH9US2Zjk7gd","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"nMbEzttfGVfwZJkAqwxiCa","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"tj5fHasfEFBxmjBHiSYX8G","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"2EuhpNKcNgCnC7mXhnzorq","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"dv9DT41y2eu8dhEh4A3yNF","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"7eHHdrZwkycM3igK47ofVH","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"pCMNdpEm3dUbZoYetGhdYY","selected":false,"dailyYield":54.680706547013095},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"bpYaYqzqY3rwTa3pPHPzsL","foundationId":"bpYaYqzqY3rwTa3pPHPzsL","id":"22NmQZ1gAa9u2oawRCihVS","selected":false,"dailyYield":54.696353811426256},{"type":"Foundation","cx":-105.74245630035185,"cy":-67.46785516115864,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"bpYaYqzqY3rwTa3pPHPzsL","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"1D6qDwX2642TSZjwoFxp1o","selected":false,"dailyYield":54.90811985910184},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"79HAKLb1ozK2c7orEPVJkH","selected":false,"dailyYield":54.97349278685597},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"5Vymv5eq4ELiQdmdiH3zah","selected":false,"dailyYield":55.561849136643225},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"pQHHxi2uivDT6Eyv2TuxUD","selected":false,"dailyYield":55.561849136643225},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"wYhFkccfy25pvdRqXmjnun","selected":false,"dailyYield":54.778765938644305},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"aPgo7xUpbQpZnXsiNJF8SA","selected":false,"dailyYield":54.680706547013095},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"rc8sJmCgWcU8UzU4JU3Kw6","selected":false,"dailyYield":55.12127784182816},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"5uahGH6BqWfKU45xu5Z7hc","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"nsB8mr2bSHrM3jbtnehkjJ","selected":false,"dailyYield":54.53431342709166},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"mLbDv1g21nFPG8JjeviDLa","selected":false,"dailyYield":54.9408063229789},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"jkmjUdZvVvxK9WkLnnBg8p","selected":false,"dailyYield":54.9408063229789},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"ouSXNghPew3qYnTQVWfbqs","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"nrR2uHdaQAetCD1csDMzph","selected":false,"dailyYield":54.90811985910183},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"ckYt1vWJgk2MaNakWvCWDB","selected":false,"dailyYield":54.50162696321459},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"1FbV4HWSJjuWDo48s8WtNC","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"pGqN7t92fsi5d33uxuhFsb","selected":false,"dailyYield":54.97349278685597},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"9L7EiSKGotVbt799fBQeRb","selected":false,"dailyYield":54.90811985910183},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"bZ4hdZiNXSoXxokpbfP7nE","selected":false,"dailyYield":54.66366734754919},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"9hsKHsCGSPXrbjVLVZXWCf","selected":false,"dailyYield":55.00617925073305},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"wMRsqsB2mCNkXsKr5ZvPtC","selected":false,"dailyYield":54.9408063229789},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"suUFWEjxFaYuPL9peoDRUZ","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"1br5Ptt8Qo5SkEHqCXrKQH","selected":false,"dailyYield":54.89247259468868},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"xeafcWLVFe1one4Js1pXaR","selected":false,"dailyYield":54.90811985910184},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"3j8HSQdHpYxreAKw5y5Bkz","selected":false,"dailyYield":54.58264715538189},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"bC1ox3NKLCGdZfDSV4qRXK","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"hkihnoDGLJybUfZp35LbaG","selected":false,"dailyYield":54.58264715538189},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"dYLEbK9Ss1w4eXNB1RSBGR","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"ji6Bm928LBgZcFZDw5fDhy","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"gm6jD4HivZTs4uDmzromYL","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"hZR3rVvnhKsbGZa4pLQ11g","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"eyyDyyuNjfTg6Y8wmcxG2q","selected":false,"dailyYield":54.42060677104729},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"6669FrAcRV3S1zPTB9p18F","foundationId":"6669FrAcRV3S1zPTB9p18F","id":"7PGJWm4Bn6jqjn5Eb529RY","selected":false,"dailyYield":54.58264715538189},{"type":"Foundation","cx":-69.6352785584022,"cy":-65.93887331983836,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"6669FrAcRV3S1zPTB9p18F","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"iS8NizYAfM6n6dgKCGDkwv","selected":false,"dailyYield":54.74468753971649},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"5Ye58UjYKG719ktcep3oWk","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"ukPSHKyKbjrFbSUb7RzBEh","selected":false,"dailyYield":55.463789745012015},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"gCVedoD7SGFMxpqX1BUzZW","selected":false,"dailyYield":55.496476208889085},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"jbPAKMEf4mqFWYPZcJDbNe","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"p7dszGFjLEqeSwRLS7YHf1","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"aT4txGfZfiz8jnLoTt526b","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"sUsodPeEocPvCNDkqZrChb","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"8sk1PSP4vENQgztEKC8ci1","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"wqNWA2TwVSjRxwkYLtZDGZ","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"wH4wDZFpfKNiNZpVSSMhFY","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"oFBt69EzGbvtWDmu6DoojJ","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"kVJKwRjK96o6qVyyzwvEUm","selected":false,"dailyYield":54.679314611962354},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"wBrBDkpM8dEK4tQLmeUW6y","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"oo6K8agu94JQM84kjwrLGA","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"4irYSEA5i5W5Qi3FuQt5ih","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"af8MTE54DUeM1YcvKoYVA6","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"4LjL7VHsRNfpcY2YcLMhwp","selected":false,"dailyYield":54.8427469313477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"ourSR4BHMyPDVKp3JHbdTq","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"k7JMDUAGSNprBURCCpXbTb","selected":false,"dailyYield":54.744687539716494},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"rzQQtjfoDHwc96srYFxFk9","selected":false,"dailyYield":54.48458776375068},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"kbtkW68kECiya1MGK4SY4y","selected":false,"dailyYield":54.66366734754919},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"79XY6D5Gd3dVECNy7jBKbr","selected":false,"dailyYield":54.744687539716494},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"8bnYakac6VrGEmETQMhGbi","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"2tr95qfXgv3jeidzJqoEEV","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"1T5fYcG2xLGDVaN4z2JSWd","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"czRX6XaVxvjtAd645B3nWJ","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"vThmrfLj2hfoaoHNntpY8P","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"mCVKJe8iq8UGLRopTPrpSP","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"kuonS1nfmLfp2iiXTgTfic","selected":false,"dailyYield":54.744687539716494},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"q3pJDWhsopJsaMjH8Z3EdK","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"vDDupUZXQLcUBaqR8LHXzz","foundationId":"vDDupUZXQLcUBaqR8LHXzz","id":"xdV86xg96dfo2s3n5YjM1n","selected":false,"dailyYield":54.59829441979505},{"type":"Foundation","cx":-37.95414195901416,"cy":-67.00195609352035,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"vDDupUZXQLcUBaqR8LHXzz","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"eUEn8apMEdg9tiLabGz99t","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"paR3Ac8yX4Wj7SiJJdFXph","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"2Y1fnFxyWV8UXrjDxD5Hyx","selected":false,"drawSunBeam":true,"dailyYield":55.20229803399546},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"v8QgWidDb6xTCTfyAfsDG2","selected":false,"dailyYield":55.2676709617496},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"ftqZQ7zoxGXDJ4KzFQVvaR","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"2uCAP6MhpPQYVndbGTMe2B","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"8938SbXAZNkxeYq1PAuYkn","selected":false,"dailyYield":54.599686354845794},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"rvoQ2mMYFP66Qhmnt8EKxF","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"f7SvtPUPo466Q4gJ9TnSPn","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"3kyNNxHidQMjQts3HyRhrm","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"pxogXCDeccjCLr1EFcuCgo","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"hBNssdFnqaWt58JWz26Zha","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"heoastLWiYga5S3WuMv9kh","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"aTSKWJPxGZKnFrLPA4VLgM","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"rtnU9Cenb7sZyKwXZGLfCQ","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"2ueZ5Jrv5E5nXkCc6dxQAF","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"jqQxC81KzsmLW8AWVEDxZ5","selected":false,"dailyYield":54.729040275303326},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"dm73L8CEvXMjt8jmGDoHDz","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"wc6yJGXKbguZXGWm3uUiyz","selected":false,"dailyYield":54.663667347549186},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"5Mbqu9AgKWy9HDTcgGMTCX","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"vmwgb4DfHsDq31536bgoww","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"2hsXtqWkNaFi1euvqpPnYN","selected":false,"dailyYield":54.56699989096873},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"gCnCmzsBCPWaiJfR4rk7n1","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"mF2657hxSjuxtSYkQnHSaP","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"pdqUKVseiHvsXYpZYBkscF","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"qAF8msFvwwguymfMBR3wwa","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"7n56hxe7QepqRevx5NngGN","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"9P9xnvWAP12WSQGPWr2xtb","selected":false,"dailyYield":54.696353811426256},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"ejCEMdNfsxgvQCqAEDzhBb","selected":false,"dailyYield":54.46894049933752},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"ff9EG4MNoewWubqd37E7fM","selected":false,"dailyYield":54.630980883672116},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"7bnM4YQJTBLfksD89FPHBy","selected":false,"dailyYield":54.582647155381885},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"mfej18wHzwCMqBLG9Vysw1","foundationId":"mfej18wHzwCMqBLG9Vysw1","id":"t2yUPd5YBp4D1eifVJ5Nzq","selected":false,"dailyYield":54.663667347549186},{"type":"Foundation","cx":-6.040055825807073,"cy":-66.303127392908,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"mfej18wHzwCMqBLG9Vysw1","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"qXxaLHK5jDA7AhqzmRAQ66","selected":false,"dailyYield":54.615333619258955},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"rjuAkDcMzUTa9fqXQamSY4","selected":false,"dailyYield":54.566999890968724},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"j87SthvfTm3rDWWm41tUR5","selected":false,"dailyYield":55.23498449787253},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"uh2HZmC683cEXyJZGLkwBJ","selected":false,"dailyYield":55.30035742562667},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"81esia6veGyAKewVMXNFHX","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"s14QyCHUodJj48ZcvmrHtn","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"87ZJEPRDaSsfRqqgULdNjb","selected":false,"dailyYield":54.48597969880142},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"eJdVsoPdU4es7XLBMBBB1n","selected":false,"dailyYield":54.85978613081161},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"fhL62UbzsRCcxH8gsKRMND","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"8iHidnxMDDHGCmryeJeacP","selected":false,"dailyYield":54.566999890968724},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"8RJziVcJjiF46EfKhhZeBN","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"hyYrjR5SLCyDEXyYT3xm9u","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"rJnFSCbaHKosPa2KmZE9Bu","selected":false,"dailyYield":54.534313427091654},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"txjJKa7MeCk6ee1keKR2Rt","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"sH5mM8WkA56CcEGporWH7S","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"hscqrLUfgPLdvLYLhecu3y","selected":false,"dailyYield":54.534313427091654},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"veWgK95yByHQ4KaXLUaYWX","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"oXFe1NucST916GSaKbGmVx","selected":false,"dailyYield":54.87543339522477},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"vyDbfHhDVVzLr6jCioEpsj","selected":false,"dailyYield":54.549960691504815},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"dyGU6GJcmCDKizMLYr19T4","selected":false,"dailyYield":54.501626963214584},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"v2i5cyjr9QNrJ63D31A2tc","selected":false,"dailyYield":54.51866616267849},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"hpHcG6Em2ns9Vehj3Lz45w","selected":false,"dailyYield":54.632372818722864},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"tvqvfScTkqwPcBBULnCSx5","selected":false,"dailyYield":54.566999890968724},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"rzPF17veSWTTiShfLGYVnU","selected":false,"dailyYield":54.761726739180396},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"7WUADDEEsLzZqJqEVL3xoM","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"aMLXH9cc7xjM8uQE7opRzx","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"2jBk9rtEn52EHUGX1e9utM","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"w9pxWfrZ7fBmNWnpSTPcQo","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"5qn6ZfWHFWZniAFZBD5G63","selected":false,"dailyYield":54.599686354845794},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"781z6sw1H3T6mBvH3ivKWb","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"gPpckDefdadY3m2KfYR5uB","selected":false,"dailyYield":54.746079474767235},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"4r9eq18jPmAo6KNP48KE97","foundationId":"4r9eq18jPmAo6KNP48KE97","id":"2GF8pwx5gfMGBNrvsV4cmE","selected":false,"dailyYield":54.82709966693454},{"type":"Foundation","cx":24.942232172123894,"cy":-65.13837972381286,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"4r9eq18jPmAo6KNP48KE97","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"v8WDAYVaovBCxpzwf6YKeb","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"pCnVs2rYUiypfZGE44GDhJ","selected":false,"dailyYield":54.744687539716494},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"5UiMA8kgZaGL6jjafYMSVr","selected":false,"dailyYield":55.36573035338081},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"dhsidTNuvFYqFyM52G8UzE","selected":false,"dailyYield":55.20229803399546},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"g7Z62RhyigqxTzLzSkQGs3","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"qK59nEiAwb2wPANvX4dXSK","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"r3JeuhY8zBG7SMPQtUacQZ","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"c4ZyVQcaD3vFS8aULE9spN","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"24MgYUmNGEdTzMEVjyvfWF","selected":false,"dailyYield":54.43625403546045},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"h2bAX5kxShkvLfLaLDJQnm","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"wSzqjZ1GP4g9CcLekersFg","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"t1LDu4rZgpXXmkj2eWc9T6","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"19vo4GuhGG7PWJqkt5ZWcD","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"qMnf48SWj4EjJpDb7yeb5y","selected":false,"dailyYield":54.43625403546045},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"qiNpaX9J1nJiB8PCJHwymU","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"rSdy4au4BWa65hP34cwhoZ","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"hPCibkbgsWPQByvQM8s8hM","selected":false,"dailyYield":54.77737400359356},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"8t16ViMQHmuRQ58XsMeEsu","selected":false,"dailyYield":54.81006046747063},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"m1UycnGk9QvgoR2crWwbud","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"jVNiFDPeT2ctjGPL4mv22f","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"cSWfM55n5PeKkoqEpPtaHH","selected":false,"dailyYield":54.72904027530333},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"uJwZ7KjG5UFJTZAN98LQcB","selected":false,"dailyYield":54.69635381142626},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"fBg69qhp7ssDM4U3Vakj97","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"dSLRdtVjTfCKhzP9vT6G4u","selected":false,"dailyYield":54.61533361925896},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"4a2kYuMS6iygwh4hTzF2xm","selected":false,"dailyYield":54.51727422762775},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"9N9XBekvGdtNubUKdz9bn6","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"tq9YQmjCLAfqC4otgQvkux","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"gfvtY6D8uZN4TPnY24yVxr","selected":false,"dailyYield":54.54996069150482},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"bPqXD8n7NUMT1fhPbkkkN5","selected":false,"dailyYield":54.72904027530333},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"jZr1iAB28GDzKvvD8ExZeZ","selected":false,"dailyYield":54.712001075839424},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"dFApM3YHu3Y78M2Xo4kwFU","selected":false,"dailyYield":54.50162696321459},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kduQAydye3uLbFTr64JfDC","foundationId":"kduQAydye3uLbFTr64JfDC","id":"rmGs8zD7XyqBcjkDXAjzGQ","selected":false,"dailyYield":54.61533361925896},{"type":"Foundation","cx":60.35056131261639,"cy":-65.60427879145091,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"kduQAydye3uLbFTr64JfDC","selected":false},{"type":"Parabolic Dish","cx":-0.22100527317131652,"cy":0.33100278061122,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"kv7G6eNq8xQ9gr29A4PgeE","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":-0.24090921965595855,"cy":0.2737966666151151,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"1gywdTnVmZkqwtFNXrcTHj","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.44942131464739804,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"5DvXaqZe44KDk9xuKtfUm8","selected":false,"dailyYield":55.365730353380805},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.45020095386197445,"cz":0.5000000074505451,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"ixZhNJFXp4ZR66ypWaNH9v","selected":false,"dailyYield":55.300357425626665},{"type":"Parabolic Dish","cx":0.29241146318514283,"cy":0.3938818960388984,"cz":0.5000000074506161,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"4LbWLkGdGxj7kuRG5UeWgn","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.29687439776958735,"cy":0.33433963644960585,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"fCdWydwEmsHE8uPjWYkvre","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.23089543291523743,"cy":0.3925423026150978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"537SCeuwcrKy3Yf9ezzr62","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"8iemrXgtr1quNdAfyKBdCA","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.2991058650618095,"cy":0.27529773198291246,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"c3kXvdwXEFnYcE9YGUQyxm","selected":false,"dailyYield":54.90951179415258},{"type":"Parabolic Dish","cx":-0.23421481777929223,"cy":0.21475476214842174,"cz":0.5000000074506517,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"uP29oRRT6aV7MGQx7YvD6o","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.15353089138090986,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"1AcDNXSU7HvWkLg54AmFDz","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.3206616726734455,"cy":0.15547080136712269,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"voUCWzXArc2R6oHvJaWZdi","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.2243857661955081,"cy":0.09598022845659912,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"oCzzzbWTzWQYAhZxeXvaLR","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":0.0979201066260928,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"uJ1SiuCEyFqZex6ZUex4r6","selected":false,"dailyYield":54.90951179415258},{"type":"Parabolic Dish","cx":0.3148939749076366,"cy":0.039076202194359505,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"1zp4QY7bN2mj5X1sZr69Xj","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.21861806842969897,"cy":0.03778292887021764,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"qpi2nj28QCtj6dALbpHWKm","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.2157342195467943,"cy":-0.031407225788088515,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"595KUQMKKkRujsK9vxKPHq","selected":false,"dailyYield":54.94080632297891},{"type":"Parabolic Dish","cx":0.30335857937601857,"cy":-0.028174042477733953,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"oSWo7sjDPAaDfzLRN5A2vW","selected":false,"dailyYield":55.13692510624132},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.08960452537446978,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"4yJVmHfw54xdbao6TurGH1","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.21573421954679453,"cy":-0.14780182496085137,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"5AQCSNeCEvo9GSvshqiwuv","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":-0.2099665217809854,"cy":-0.20535248788516208,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"iFNGVF4BnRB2CiUTeAUcpc","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.1984311262493674,"cy":-0.26678293896517913,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"uLsXN2FSFMdKv3wb2Xhtda","selected":false,"dailyYield":54.713393010890165},{"type":"Parabolic Dish","cx":-0.2013149751322721,"cy":-0.3256268752136316,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"7fwh5kRqQ3ekm4dzKpbxi3","selected":false,"dailyYield":54.82709966693454},{"type":"Parabolic Dish","cx":0.32642937043925435,"cy":-0.08960449355775071,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"kQtV2faB3UjVkaBSkjbaPM","selected":false,"dailyYield":55.02321845019695},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.1497417031303451,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"5a3j4AZWQSeQLoFe28cTFR","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3177778237905408,"cy":-0.20858563937879757,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"nXQKckZPXqHpq5g6AGp4mk","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3235455215563498,"cy":-0.2654896656410374,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"49gRZ5Q4VK9aZWKDCVqk5f","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":0.3321970682050635,"cy":-0.3249802385515608,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"a6rEesiKY3XGANAtD57SGu","selected":false,"dailyYield":54.99053198631988},{"type":"Parabolic Dish","cx":-0.18557739608865548,"cy":-0.3820673122117616,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"mmg6zETUeomJsq2ezeHSSw","selected":false,"dailyYield":54.648020083136025},{"type":"Parabolic Dish","cx":-0.1738080557394403,"cy":-0.4427643900219344,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"6JQVhnyM7L2LNEiJt7duty","selected":false,"dailyYield":54.794413203057466},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.38030797662306093,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"v8HDepiPpBYKNZPDtGgLgR","selected":false,"dailyYield":54.94219825802965},{"type":"Parabolic Dish","cx":0.33227357927680473,"cy":-0.4401253866388834,"cz":0.5000000074505806,"lx":6,"ly":6,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"receiverRadius":0.2,"structureType":1,"latusRectum":8,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"jQu4gCDNGHwChoQvBCFcvf","foundationId":"jQu4gCDNGHwChoQvBCFcvf","id":"kSEgPj4rJC7X5s13VYJGGv","selected":false,"dailyYield":54.99053198631988},{"type":"Foundation","cx":91.09989977672836,"cy":-65.83722832526995,"cz":0.05,"lx":30.481606132911146,"ly":135.9408628549677,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"jQu4gCDNGHwChoQvBCFcvf","selected":false}],"view":{"weatherPanelX":0,"heliodonPanelY":0,"showStickyNotePanel":false,"dailyPvYieldPanelX":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"mapZoom":17,"showHeliodonPanel":false,"showWeatherPanel":false,"yearlyLightSensorPanelY":0,"heliodonPanelX":0,"theme":"Desert","autoRotate":false,"groundColor":"#999999","groundPanelY":0,"heliodon":false,"axes":true,"showDailyPvYieldPanel":false,"mapWeatherStations":false,"dailyPvYieldPanelY":0,"showGroundPanel":false,"mapTilt":0,"yearlyLightSensorPanelX":0,"showYearlyPvYieldPanel":false,"groundPanelX":0,"groundImage":true,"dailyLightSensorPanelX":0,"showSiteInfoPanel":true,"mapType":"hybrid","showYearlyLightSensorPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"cameraPosition":[169.9816352402022,-225.19055272845807,79.13890608436596],"panCenter":[-50.39035725869241,30.655635102579282,0],"orthographic":false,"enableRotate":true,"cameraZoom":4.292775278858744,"stickyNotePanelX":0,"stickyNotePanelY":0,"cameraPosition2D":[45.20884161437947,-65.0727374045762,19.999927173198625],"panCenter2D":[45.20884161437947,-65.07271740368721,-0.00007282678642197909],"showSolarRadiationHeatmap":false,"showSolarPanelVisibilityResultsPanel":false,"solarRadiationHeatMapMaxValue":8,"showSunAngles":false,"showMapPanel":false,"showDesignInfoPanel":true,"showInstructionPanel":true,"mapPanelX":0,"mapPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":1,"visibilityResultsPanelY":0,"showDailyParabolicTroughYieldPanel":false,"dailyParabolicTroughYieldPanelX":-34,"dailyParabolicTroughYieldPanelY":188,"showYearlyParabolicTroughYieldPanel":false,"yearlyParabolicTroughYieldPanelX":null,"yearlyParabolicTroughYieldPanelY":null,"showDailyParabolicDishYieldPanel":false,"dailyParabolicDishYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":[]}')},502:function(e){e.exports=JSON.parse('{"docid":"cNGvmw7bdpjvKSnH8CxjiH","time":"02/02/2023 02:10 pm","timestamp":1675365059016,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"6/22/2022, 3:30:00 PM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.6869752,"longitude":-105.937799,"address":"Santa Fe, NM, USA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.5},"elements":[{"type":"Foundation","cx":-0.042674723134280335,"cy":-0.130761486142406,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"solarStructure":1,"locked":false,"solarAbsorberPipe":{"absorberHeight":16,"apertureWidth":1},"labelSize":1},{"type":"Fresnel Reflector","reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.05,"cx":-0.02756165965335064,"cy":0.003002736834484595,"cz":0,"lx":2,"ly":30,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"vb4n6chMKJoqTfuUfT9HH9","selected":false,"dailyYield":74.96105824171634,"yearlyYield":2328.274834535053,"label":"8","labelHeight":1,"labelSize":1},{"type":"Human","name":"Jack","cx":-4.020481691228474,"cy":-25.616774473884036,"cz":0,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wt2ieHLPLyg2Q2E8VLix1e","selected":false,"ly":0.6},{"type":"Fresnel Reflector","cx":0.028169913107493977,"cy":0.003853312047257671,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"hqQUyB5jvcbC5wykbyrwVq","selected":false,"drawSunBeam":true,"dailyYield":75.30871550026608,"yearlyYield":2365.489808480604,"label":"9","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.0839014858683386,"cy":0.004703887260030747,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"3QNPRzuCQDcJYCHp3jv7xP","selected":false,"label":"10","dailyYield":74.47712896106862,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.1396330586291832,"cy":0.0055544624728038235,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"7vdajwavThEwB2PVAxNNhu","selected":false,"drawSunBeam":true,"label":"11","dailyYield":72.69243415263071,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.19536463139002783,"cy":0.0064050376855769,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"ca329ZjJaCCUxbohPB9JNR","selected":false,"drawSunBeam":true,"label":"12","dailyYield":71.32847705730514,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.2510962041508724,"cy":0.007255612898349976,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"wH1sLWUJu5DwjfBKCjHRy5","selected":false,"drawSunBeam":true,"label":"13","dailyYield":69.36645769952737,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.30682777691171703,"cy":0.008106188111123052,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"888jdzXbxdzvyBwsKnBVQU","selected":false,"drawSunBeam":true,"label":"14","dailyYield":68.18367399690828,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.36255934967256165,"cy":0.008956763323896128,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"cLuiFeXqEUWZCxdsSWep75","selected":false,"drawSunBeam":true,"label":"15","dailyYield":66.51612857330484,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"2orgkforac6TmBbX5ogLWg","selected":false,"drawSunBeam":true,"label":"16","dailyYield":66.9454970041269,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.08329323241419526,"cy":0.0021521616217115187,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"qkYArzf5uqu6DZf4wA39gd","selected":false,"drawSunBeam":true,"label":"7","dailyYield":74.46542587169182,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.13902480517503987,"cy":0.0013015864089384425,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"gBW2TdctGGDx3xkrVbnnt2","selected":false,"drawSunBeam":true,"label":"6","dailyYield":73.42005146962971,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.1947563779358845,"cy":0.00045101119616536636,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"t8gE1dpvae7236xzWXFCVz","selected":false,"drawSunBeam":true,"label":"5","dailyYield":71.56039677787652,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.25048795069672913,"cy":-0.0003995640166077098,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"jfpJVaw3pqTBMP5EqV8WHg","selected":false,"drawSunBeam":true,"label":"4","dailyYield":69.76216278634425,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.30621952345757375,"cy":-0.001250139229380786,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"cwXPC6JNrmx1jM5HPN3Bnj","selected":false,"drawSunBeam":true,"label":"3","dailyYield":68.34763018099684,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.36195109621841837,"cy":-0.002100714442153862,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"nQed4eP7gteAwQE8ekQJF7","selected":false,"drawSunBeam":true,"label":"2","dailyYield":66.89178735911106,"labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"gGEdWUHCti1PrRxJ7JDarq","selected":false,"drawSunBeam":true,"label":"1","dailyYield":66.97552153518168,"labelHeight":1,"labelSize":1}],"view":{"orthographic":false,"enableRotate":true,"ambientLightIntensity":0.1,"cameraPosition":[-0.18166570108404656,-45.01608727927176,13.053612747101962],"cameraPosition2D":[0,-0.000020000888987681265,150],"panCenter":[0.5652994261175363,0.42897477312561383,2.1550210855619265],"panCenter2D":[0,0,0],"cameraZoom":17.679830776572036,"axes":true,"solarRadiationHeatMapMaxValue":10,"shadowEnabled":true,"theme":"Default","heliodon":false,"showSunAngles":false,"groundImage":false,"groundColor":"#16cda5","showMapPanel":false,"showHeliodonPanel":false,"showWeatherPanel":false,"showStickyNotePanel":true,"showSiteInfoPanel":true,"showDesignInfoPanel":false,"showInstructionPanel":false,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showDailyPvYieldPanel":false,"showYearlyPvYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"autoRotate":false,"heliodonPanelX":0,"heliodonPanelY":0,"mapPanelX":0,"mapPanelY":0,"weatherPanelX":0,"weatherPanelY":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyLightSensorPanelX":0,"dailyLightSensorPanelY":0,"yearlyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"mapZoom":18,"mapType":"roadmap","mapTilt":0,"mapWeatherStations":false,"showDailyFresnelReflectorYieldPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":-1274,"yearlyFresnelReflectorYieldPanelY":14,"dailyFresnelReflectorYieldPanelX":-19,"dailyFresnelReflectorYieldPanelY":157,"stickyNotePanelRect":{"x":0,"y":0,"width":245,"height":60},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":721,"height":335}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":true,"yearlyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Linear Fresnel reflectors"]}')},503:function(e){e.exports=JSON.parse('{"docid":"msDnM7uBZhbQmJD2hxtJqt","time":"02/03/2023 04:30 pm","timestamp":1675459824362,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"6/22/2022, 12:00:00 PM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.6869752,"longitude":-105.937799,"address":"Santa Fe, NM, USA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.5},"elements":[{"type":"Foundation","cx":0.9362263534654288,"cy":-0.12687492649763793,"cz":0.05,"lx":27,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"locked":false,"solarAbsorberPipe":{"absorberHeight":10}},{"type":"Human","name":"Juro","cx":5.337210314381737,"cy":22.31208205622077,"cz":0,"lx":0.6,"lz":1.9,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wt2ieHLPLyg2Q2E8VLix1e","selected":false,"ly":0.6},{"type":"Fresnel Reflector","cx":-0.35253117677918383,"cy":-0.011856551439747325,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"3QNPRzuCQDcJYCHp3jv7xP","selected":false,"label":"W7","dailyYield":31.890222330203017,"drawSunBeam":true,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.2286832373106403,"cy":-0.011005976226974253,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"7vdajwavThEwB2PVAxNNhu","selected":false,"drawSunBeam":true,"label":"W6","dailyYield":31.891895315467107,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.10483529784209675,"cy":-0.010155401014201173,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"ca329ZjJaCCUxbohPB9JNR","selected":false,"drawSunBeam":true,"label":"W5","dailyYield":31.73416130809442,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.019012641626446784,"cy":-0.009304825801428097,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"wH1sLWUJu5DwjfBKCjHRy5","selected":false,"drawSunBeam":true,"label":"W4","dailyYield":31.73416130809442,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.14286058109499036,"cy":-0.00845425058865502,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"888jdzXbxdzvyBwsKnBVQU","selected":false,"drawSunBeam":true,"label":"W3","dailyYield":31.73416130809442,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.26670852056353395,"cy":-0.007603675375881946,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"cLuiFeXqEUWZCxdsSWep75","selected":false,"drawSunBeam":true,"label":"W2","dailyYield":31.794492804033993,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.3905564600320776,"cy":-0.006753100163108869,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"2orgkforac6TmBbX5ogLWg","selected":false,"drawSunBeam":true,"label":"W1","dailyYield":31.9307477575622,"receiverId":"1X6Dcn8HZPSPCzJkugC2rm","labelHeight":1,"labelSize":1},{"type":"Foundation","cx":14.471950838588711,"cy":-0.06574070597754514,"cz":0.25,"lx":2.9789007603004762,"ly":40,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"1X6Dcn8HZPSPCzJkugC2rm","selected":false,"locked":false,"solarAbsorberPipe":{"absorberHeight":10}},{"type":"Fresnel Reflector","cx":-0.35253117677918383,"cy":-0.011856551439747325,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"9VYUH8fPAbbYtPyjX2bXhM","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":32.07623689276002,"labelHeight":1,"labelSize":1,"label":"E7"},{"type":"Fresnel Reflector","cx":-0.2286832373106403,"cy":-0.011005976226974253,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"oZQVT7upKS5gxcv41KySPP","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":32.022177742145026,"label":"E6","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":-0.10483529784209675,"cy":-0.010155401014201173,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"fscHgrZH2yNiKzCaZR3ZeJ","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.827123715972846,"label":"E5","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.019012641626446784,"cy":-0.009304825801428097,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"jnn6CBMvkkU1925yAPrHAB","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.827443563442092,"label":"E4","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.14286058109499036,"cy":-0.00845425058865502,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"hJhtsSd1FMChUsTYyy5v9N","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.827443563442092,"labelHeight":1,"labelSize":1,"label":"E3"},{"type":"Fresnel Reflector","cx":0.26670852056353395,"cy":-0.007603675375881946,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"6CbyGsZ43oQRJAfjen8bXu","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.946909343510214,"label":"E2","labelHeight":1,"labelSize":1},{"type":"Fresnel Reflector","cx":0.3905564600320776,"cy":-0.006753100163108869,"cz":0,"lx":1,"ly":32,"lz":0.1,"reflectance":0.9,"moduleLength":2,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"uPxivXJTh4z2zMrqhzNvo3","foundationId":"uPxivXJTh4z2zMrqhzNvo3","id":"rKXjH4ndrtiJLk3pNba97R","selected":false,"receiverId":"qFoXmrcbqf43nhfNvsKiMV","drawSunBeam":true,"dailyYield":31.888037304879255,"label":"E1","labelHeight":1,"labelSize":1},{"type":"Foundation","cx":-0.5305173175473676,"cy":-0.07406922653934842,"cz":0.05,"lx":27,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","id":"uPxivXJTh4z2zMrqhzNvo3","selected":false,"solarAbsorberPipe":{"absorberHeight":10}},{"type":"Foundation","cx":-13.207999911998343,"cy":-0.09629786579027738,"cz":0.25,"lx":2.9789007603004762,"ly":40,"lz":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"qFoXmrcbqf43nhfNvsKiMV","selected":false,"solarAbsorberPipe":{"absorberHeight":10}}],"view":{"orthographic":false,"enableRotate":true,"ambientLightIntensity":0.1,"cameraPosition":[-3.9192694742317027,38.575338391462196,5.805467125820184],"cameraPosition2D":[0.0944682441377376,-0.000020000888987681265,150],"panCenter":[-5.512894960875013,0.5401536354068696,3.9025189352350482],"panCenter2D":[0.0944682441377376,0,0],"cameraZoom":14.400332666460274,"axes":true,"solarRadiationHeatMapMaxValue":10,"shadowEnabled":true,"theme":"Default","heliodon":false,"showSunAngles":false,"groundImage":false,"groundColor":"#16cda5","showMapPanel":false,"showHeliodonPanel":false,"showWeatherPanel":false,"showStickyNotePanel":true,"showSiteInfoPanel":true,"showDesignInfoPanel":false,"showInstructionPanel":false,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showDailyPvYieldPanel":false,"showYearlyPvYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"autoRotate":false,"heliodonPanelX":0,"heliodonPanelY":0,"mapPanelX":0,"mapPanelY":0,"weatherPanelX":0,"weatherPanelY":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyLightSensorPanelX":0,"dailyLightSensorPanelY":0,"yearlyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"mapZoom":18,"mapType":"roadmap","mapTilt":0,"mapWeatherStations":false,"showDailyFresnelReflectorYieldPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":-1274,"yearlyFresnelReflectorYieldPanelY":14,"dailyFresnelReflectorYieldPanelX":-19,"dailyFresnelReflectorYieldPanelY":157,"stickyNotePanelRect":{"x":0,"y":0,"width":379,"height":67},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":701,"height":335}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":true,"yearlyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Linear Fresnel reflectors with two absorbers"]}')},504:function(e){e.exports=JSON.parse('{"docid":"91fFrr9emvLvmNx1sW7PMh","time":"02/03/2023 04:20 pm","timestamp":1675459240163,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022, 10:30:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.6869752,"longitude":-105.937799,"address":"Santa Fe, NM, USA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.4},"elements":[{"type":"Human","name":"Jack","cx":-33.39710614584251,"cy":-0.9610066908384169,"cz":0,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wt2ieHLPLyg2Q2E8VLix1e","selected":false,"ly":0.6},{"type":"Foundation","cx":0,"cy":-25.811344633762367,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"dzfAzy3H4GMkDSbVLaRN5i","selected":false,"solarAbsorberPipe":{"absorberHeight":10}},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzfAzy3H4GMkDSbVLaRN5i","foundationId":"dzfAzy3H4GMkDSbVLaRN5i","id":"rBPLpQDftUWGq1uWVpV2JQ","selected":false,"dailyYield":46.64633299683992,"drawSunBeam":true,"label":"Lo2","yearlyYield":547.7275410650782,"labelHeight":4,"labelSize":2},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzfAzy3H4GMkDSbVLaRN5i","foundationId":"dzfAzy3H4GMkDSbVLaRN5i","id":"1FVTFf1Rdrpbt8TCGDL47X","selected":false,"dailyYield":46.68721550672282,"label":"Lo1","drawSunBeam":true,"yearlyYield":547.8648836504849,"labelHeight":4,"labelSize":2},{"type":"Foundation","cx":0.20390682574577923,"cy":26.830878562482944,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"5Xds31NJFC5WSWmddVnFan","selected":false,"solarAbsorberPipe":{"absorberHeight":20}},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5Xds31NJFC5WSWmddVnFan","foundationId":"5Xds31NJFC5WSWmddVnFan","id":"t7wce5cujudUUycMCvBAKg","selected":false,"dailyYield":52.29842954176333,"drawSunBeam":true,"label":"Hi2","labelHeight":4,"labelSize":2},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"5Xds31NJFC5WSWmddVnFan","foundationId":"5Xds31NJFC5WSWmddVnFan","id":"pU7aF7BDdSD7JUWEzZrwg7","selected":false,"dailyYield":52.33859564683257,"drawSunBeam":true,"label":"Hi1","labelHeight":4,"labelSize":2}],"view":{"orthographic":false,"enableRotate":true,"ambientLightIntensity":0.1,"cameraPosition":[53.11784569640703,-95.69780414866537,24.112920613071175],"cameraPosition2D":[0,-0.000020000888987681265,19.999999999987022],"panCenter":[0.3487591244720869,-0.08601128946324002,0],"panCenter2D":[0,0,0],"cameraZoom":4.904200711979575,"axes":true,"solarRadiationHeatMapMaxValue":6.5,"shadowEnabled":true,"theme":"Default","heliodon":false,"showSunAngles":false,"groundImage":false,"groundColor":"#16cda5","showMapPanel":false,"showHeliodonPanel":false,"showWeatherPanel":false,"showStickyNotePanel":true,"showSiteInfoPanel":true,"showDesignInfoPanel":false,"showInstructionPanel":false,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showDailyPvYieldPanel":false,"showYearlyPvYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"autoRotate":false,"heliodonPanelX":0,"heliodonPanelY":0,"mapPanelX":0,"mapPanelY":0,"weatherPanelX":0,"weatherPanelY":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyLightSensorPanelX":0,"dailyLightSensorPanelY":0,"yearlyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"mapZoom":18,"mapType":"roadmap","mapTilt":0,"mapWeatherStations":false,"showDailyFresnelReflectorYieldPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":-1274,"yearlyFresnelReflectorYieldPanelY":14,"dailyFresnelReflectorYieldPanelX":-19,"dailyFresnelReflectorYieldPanelY":157,"stickyNotePanelRect":{"x":0,"y":0,"width":404,"height":64},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":true},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of height of absorber pipe for Fresnel reflectors"]}')},505:function(e){e.exports=JSON.parse('{"docid":"vKXC3Vu98tLTj5EYPySBoM","time":"02/03/2023 04:23 pm","timestamp":1675459380199,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"name":"default","date":"9/22/2022, 11:00:00 AM","ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"latitude":35.6869752,"longitude":-105.937799,"address":"Santa Fe, NM, USA","airAttenuationCoefficient":0.01,"timesPerHour":4,"pvGridCellSize":0.5,"discretization":"Approximate","solarPanelVisibilityGridCellSize":0.2,"solarRadiationHeatmapGridCellSize":0.5,"cspTimesPerHour":4,"cspGridCellSize":0.4},"elements":[{"type":"Human","name":"June","cx":-33.350601086935164,"cy":22.419888505407727,"cz":1.7763568394002505e-15,"lx":0.65,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"wt2ieHLPLyg2Q2E8VLix1e","selected":false,"ly":0.6},{"type":"Foundation","cx":0,"cy":-25.811344633762367,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"dzfAzy3H4GMkDSbVLaRN5i","selected":false,"solarAbsorberPipe":{"absorberHeight":20}},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzfAzy3H4GMkDSbVLaRN5i","foundationId":"dzfAzy3H4GMkDSbVLaRN5i","id":"rBPLpQDftUWGq1uWVpV2JQ","selected":false,"dailyYield":52.29842954176333,"drawSunBeam":true,"label":"NS-E","yearlyYield":547.7275410650782,"labelHeight":4,"labelSize":2},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"dzfAzy3H4GMkDSbVLaRN5i","foundationId":"dzfAzy3H4GMkDSbVLaRN5i","id":"1FVTFf1Rdrpbt8TCGDL47X","selected":false,"dailyYield":52.33859564683257,"label":"NS-W","drawSunBeam":true,"yearlyYield":547.8648836504849,"labelHeight":4,"labelSize":2},{"type":"Foundation","cx":0.20390682574577923,"cy":26.830878562482944,"cz":0.05,"lx":60,"ly":40,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"Ground","textureType":"No Foundation Texture","solarStructure":1,"id":"5Xds31NJFC5WSWmddVnFan","selected":false,"solarAbsorberPipe":{"absorberHeight":20}},{"type":"Fresnel Reflector","cx":0.41829092243340626,"cy":0.009807338536669204,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"5Xds31NJFC5WSWmddVnFan","foundationId":"5Xds31NJFC5WSWmddVnFan","id":"t7wce5cujudUUycMCvBAKg","selected":false,"dailyYield":51.241946460146316,"drawSunBeam":true,"label":"EW-N","labelHeight":4,"labelSize":2},{"type":"Fresnel Reflector","cx":-0.417682668979263,"cy":-0.0029512896549269384,"cz":0,"lx":2,"ly":30,"lz":0.1,"reflectance":0.9,"absorptance":0.95,"opticalEfficiency":0.7,"thermalEfficiency":0.3,"moduleLength":3,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.05,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,1.5707963267948966],"parentId":"5Xds31NJFC5WSWmddVnFan","foundationId":"5Xds31NJFC5WSWmddVnFan","id":"pU7aF7BDdSD7JUWEzZrwg7","selected":false,"dailyYield":36.12397534329661,"drawSunBeam":true,"label":"EW-S","labelHeight":4,"labelSize":2}],"view":{"orthographic":false,"enableRotate":true,"ambientLightIntensity":0.1,"cameraPosition":[33.85725619257774,-80.53017579058466,26.560297986535087],"cameraPosition2D":[0,-0.000020000888987681265,19.999999999987022],"panCenter":[0.3777068394391828,-0.13846137164171785,0],"panCenter2D":[0,0,0],"cameraZoom":4.904200711979575,"axes":true,"solarRadiationHeatMapMaxValue":6.5,"shadowEnabled":true,"theme":"Default","heliodon":false,"showSunAngles":false,"groundImage":false,"groundColor":"#16cda5","showMapPanel":false,"showHeliodonPanel":false,"showWeatherPanel":false,"showStickyNotePanel":true,"showSiteInfoPanel":true,"showDesignInfoPanel":false,"showInstructionPanel":false,"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":false,"showDailyPvYieldPanel":false,"showYearlyPvYieldPanel":false,"showSolarPanelVisibilityResultsPanel":false,"showDailyParabolicTroughYieldPanel":false,"showYearlyParabolicTroughYieldPanel":false,"showDailyParabolicDishYieldPanel":false,"showYearlyParabolicDishYieldPanel":false,"autoRotate":false,"heliodonPanelX":0,"heliodonPanelY":0,"mapPanelX":0,"mapPanelY":0,"weatherPanelX":0,"weatherPanelY":0,"stickyNotePanelX":0,"stickyNotePanelY":0,"dailyLightSensorPanelX":0,"dailyLightSensorPanelY":0,"yearlyLightSensorPanelX":0,"yearlyLightSensorPanelY":0,"dailyPvYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyPvYieldPanelY":0,"visibilityResultsPanelX":0,"visibilityResultsPanelY":0,"dailyParabolicTroughYieldPanelX":0,"dailyParabolicTroughYieldPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"yearlyParabolicTroughYieldPanelY":0,"dailyParabolicDishYieldPanelX":0,"dailyParabolicDishYieldPanelY":0,"yearlyParabolicDishYieldPanelX":0,"yearlyParabolicDishYieldPanelY":0,"mapZoom":18,"mapType":"roadmap","mapTilt":0,"mapWeatherStations":false,"showDailyFresnelReflectorYieldPanel":true,"showYearlyFresnelReflectorYieldPanel":false,"yearlyFresnelReflectorYieldPanelX":-1274,"yearlyFresnelReflectorYieldPanelY":14,"dailyFresnelReflectorYieldPanelX":-5,"dailyFresnelReflectorYieldPanelY":2,"stickyNotePanelRect":{"x":0,"y":0,"width":362,"height":61},"dailyFresnelReflectorYieldPanelRect":{"x":0,"y":0,"width":600,"height":400}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":true,"yearlyFresnelReflectorIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of azimuths of Fresnel reflectors"]}')},506:function(e){e.exports=JSON.parse('{"docid":"5syPiYyaezKe2cX7XoDs2h","time":"05/07/2023 07:59 pm","timestamp":1683503972972,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":33.4483771,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-112.0740373,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Phoenix, AZ, USA","date":"3/22/2022, 1:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1},"elements":[{"cy":-0.041483328317633114,"normal":[0,0,1],"lz":0.1,"ly":56,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.10913665374106213,"cz":0.05,"rotation":[0,0,0],"lx":48,"selected":false,"parentId":"Ground","solarStructure":2,"locked":true,"solarPowerTower":{"towerHeight":20}},{"type":"Human","name":"Jack","cx":3.2193530626125146,"cy":-2.9734078597551292,"cz":0.05000000074505806,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.8},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":0.0004895609926147317,"cy":-0.20737855784061227,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"label":"S1","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":25.54362655315038,"yearlyYield":311.4614380820491,"labelHeight":2,"labelSize":2},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":-0.000773921356256882,"cy":0.4327509634160523,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"label":"N2","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":28.83063075372236,"yearlyYield":341.6536704139208,"labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.0027886687628078007,"cy":-0.41384481120536054,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"label":"S2","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":true,"dailyYield":23.21442400772718,"yearlyYield":285.77957159626914,"labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.003581112158779376,"cy":0.2256213567639617,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"label":"N1","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":true,"dailyYield":29.15082293688426,"yearlyYield":347.0340046876023,"labelHeight":2,"labelSize":2}],"sceneRadius":35,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#68ccca","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-59.813021886337346,-1.4084528562656211,7.556432837410264],"panCenter":[-1.9086832692892528,-2.9483395065245706,7.55643283741026],"orthographic":false,"enableRotate":true,"cameraZoom":7.169718448170838,"showInstructionPanel":false,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,50.00001246725703],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":8.5,"showDailyHeliostatYieldPanel":true,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelRect":{"x":2,"y":4,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":315,"height":67},"solarRadiationHeatMapReflectionOnly":false},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":true,"yearlyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Cosine efficiency of heliostats"]}')},507:function(e){e.exports=JSON.parse('{"docid":"gHMiemdnJcFMUxpQfVjjPt","time":"05/08/2023 09:52 am","timestamp":1683553944140,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":33.4483771,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-112.0740373,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Phoenix, AZ, USA","date":"3/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1},"elements":[{"cy":-0.1414833283176331,"normal":[0,0,1],"lz":0.1,"ly":100,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.06913665374106212,"cz":0.05,"rotation":[0,0,0],"lx":48,"selected":false,"parentId":"Ground","solarStructure":2,"locked":false,"solarPowerTower":{"towerHeight":20}},{"type":"Human","name":"Jack","cx":3.2193530626125146,"cy":-2.9734078597551292,"cz":0.05000000074505806,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.8},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.1,"cx":0.0016316459694108918,"cy":0.056499757261125036,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":28.86248835017146,"yearlyYield":311.4614380820491,"label":"F","labelHeight":2,"labelSize":2},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.1,"cx":0.001226078643743118,"cy":0.16634053951298922,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":22.075493423258955,"yearlyYield":341.6536704139208,"label":"D","labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.0015794497286664832,"cy":0.22263738972537034,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.1,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":true,"dailyYield":17.32894620185682,"yearlyYield":285.77957159626914,"label":"C","labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.001581112158779376,"cy":0.10634795978781855,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.1,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":true,"dailyYield":21.79675399494804,"yearlyYield":347.0340046876023,"label":"E","labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.0009487537946118556,"cy":0.2775217218176491,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.1,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"orwNVrz2FK5fQamnSTQ7NK","selected":false,"drawSunBeam":true,"label":"B","dailyYield":14.05825681568513,"labelHeight":2,"labelSize":2},{"type":"Heliostat","cx":0.00207089526046105,"cy":0.32972836846468156,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.1,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7KyZAKPiHLomhbx7U5u64Y","selected":false,"drawSunBeam":true,"label":"A","dailyYield":11.010081200524054,"labelSize":2,"labelHeight":2}],"sceneRadius":63,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-56.03492924888614,-3.1393903550330142,35.62950235618159],"panCenter":[-1.9088390832554354,-2.9523520368213196,7.55643283741026],"orthographic":false,"enableRotate":true,"cameraZoom":10.266841665590098,"showInstructionPanel":false,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,150],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":9,"showDailyHeliostatYieldPanel":true,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelRect":{"x":6,"y":-5,"width":531,"height":342},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":397,"height":62},"solarRadiationHeatMapReflectionOnly":true},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":true,"yearlyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Shadowing and blocking among heliostats"]}')},508:function(e){e.exports=JSON.parse('{"docid":"gtHUqK811PpHW2AhT3pgKh","time":"05/07/2023 08:01 pm","timestamp":1683504079394,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":33.4483771,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-112.0740373,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Phoenix, AZ, USA","date":"3/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1},"elements":[{"cy":0.09432031355470513,"normal":[0,0,1],"lz":0.1,"ly":100,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-23.979659433364148,"cz":0.05,"rotation":[0,0,0],"lx":48,"selected":false,"parentId":"Ground","solarStructure":2,"locked":false,"solarPowerTower":{"towerHeight":10}},{"type":"Human","name":"Jade","cx":3.2193530626125146,"cy":-2.9734078597551292,"cz":0.05000000074505806,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.6,"ly":0.6,"lz":1.6},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":0.0016316459694108918,"cy":0.056499757261125036,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":29.12957022220564,"yearlyYield":311.4614380820491,"label":"L6","labelHeight":4,"labelSize":2},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":true,"poleHeight":0.2,"poleRadius":0.2,"cx":0.001226078643743118,"cy":0.16634053951298922,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":12.632105204416524,"yearlyYield":341.6536704139208,"label":"L4","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.0015794497286664832,"cy":0.22263738972537034,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":true,"dailyYield":8.640669150547245,"yearlyYield":285.77957159626914,"label":"L3","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.001581112158779376,"cy":0.10634795978781855,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":true,"dailyYield":15.667514658355707,"yearlyYield":347.0340046876023,"label":"L5","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.0009487537946118556,"cy":0.2775217218176491,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"orwNVrz2FK5fQamnSTQ7NK","selected":false,"drawSunBeam":true,"label":"L2","dailyYield":4.958857907473794,"labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.00207089526046105,"cy":0.32972836846468156,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7KyZAKPiHLomhbx7U5u64Y","selected":false,"drawSunBeam":true,"label":"L1","dailyYield":2.355020886123749,"labelHeight":4,"labelSize":2},{"type":"Human","name":"Jack","cx":3.2193530626125146,"cy":-2.9734078597551292,"cz":0.05000000074505806,"lx":0.6,"ly":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"e6VoeQYymGEdypZkwyg1QM","selected":false},{"type":"Heliostat","cx":0.0016316459694108918,"cy":0.056499757261125036,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"j3sWeAPDp1y53hV9TKpY1X","selected":false,"drawSunBeam":true,"dailyYield":28.834554606358278,"label":"H6","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.001226078643743118,"cy":0.16634053951298922,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"txZLYrcQ93XFhrpdAsV7Mp","selected":false,"drawSunBeam":true,"dailyYield":22.049770857324166,"label":"H4","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.0015794497286664832,"cy":0.22263738972537034,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"9uaB6ZaFJqdfwW82X3mBGL","selected":false,"drawSunBeam":true,"dailyYield":17.30899182389923,"label":"H3","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.001581112158779376,"cy":0.10634795978781855,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"wQcg7xgoQBPNeT1VLa2pPS","selected":false,"drawSunBeam":true,"dailyYield":21.74570231867697,"label":"H5","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.0009487537946118556,"cy":0.2775217218176491,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"xcPfzQdhBUHxAytCA4wYay","selected":false,"drawSunBeam":true,"dailyYield":14.042308959831052,"label":"H2","labelHeight":4,"labelSize":2},{"type":"Heliostat","cx":0.00207089526046105,"cy":0.32972836846468156,"cz":0.5000000074505806,"lx":4,"ly":6,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"kyxcYJvhUNP9YHtYNAZTvQ","foundationId":"kyxcYJvhUNP9YHtYNAZTvQ","id":"5otXu1RaMdbKFrMqe75zLT","selected":false,"drawSunBeam":true,"dailyYield":10.99900401218998,"label":"H1","labelHeight":4,"labelSize":2},{"type":"Foundation","cx":23.933804465569864,"cy":-0.09788249795398585,"cz":0.05,"lx":48,"ly":100,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarStructure":2,"id":"kyxcYJvhUNP9YHtYNAZTvQ","selected":false,"solarPowerTower":{"towerHeight":20}}],"sceneRadius":63,"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-65.26004925031205,-40.981584348790705,10.926967172602236],"panCenter":[-8.555794568197623,-11.649776058982166,4.3178318413222065],"orthographic":false,"enableRotate":true,"cameraZoom":10.266841665590098,"showInstructionPanel":false,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,50.00001246725564],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":6,"showDailyHeliostatYieldPanel":true,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":252,"height":65},"solarRadiationHeatMapReflectionOnly":true},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":true,"yearlyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of tower height"]}')},509:function(e){e.exports=JSON.parse('{"docid":"nAyY3ZutnSxurzmrfiodKh","time":"02/02/2023 02:25 pm","timestamp":1675365924087,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":33.4483771,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-112.0740373,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Phoenix, AZ, USA","date":"6/22/2022, 1:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":1},"elements":[{"cy":34.18220646310374,"normal":[0,0,1],"lz":0.5,"ly":87.56100860949408,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":0.8683182685289808,"cz":0.25,"rotation":[0,0,0],"lx":168.62126759233155,"selected":false,"parentId":"Ground","locked":true,"solarPowerTower":{"towerHeight":40}},{"type":"Human","name":"Jamelia","cx":-3.2033162315728436,"cy":-1.3034178512198427,"cz":2,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"eskWrngRsrfsVxitmEFwUG","id":"qnU7wNUFWabF7Yh9Ri8Vn5","selected":false,"lx":0.65,"ly":0.42,"lz":1.8},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":0.34571115088529475,"cy":-0.2182979146294524,"cz":0,"lx":6,"ly":8,"lz":0.1,"showLabel":false,"label":"4","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"9caRxtuWoQpc52Rcvx4m2Y","selected":false,"dailyYield":54.973155818694394,"yearlyYield":311.4614380820491,"towerId":"eskWrngRsrfsVxitmEFwUG"},{"type":"Heliostat","reflectance":0.9,"relativeAzimuth":0,"tiltAngle":0,"drawSunBeam":false,"poleHeight":0.2,"poleRadius":0.2,"cx":0.1244528472135859,"cy":-0.060705471204835396,"cz":0,"lx":6,"ly":8,"lz":0.1,"showLabel":false,"label":"3","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"3qHYF54uoRjqCcVSRMJa3K","selected":false,"dailyYield":54.692955030942635,"yearlyYield":341.6536704139208,"towerId":"eskWrngRsrfsVxitmEFwUG"},{"type":"Heliostat","cx":-0.30243530092478804,"cy":-0.29658463647807665,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"label":"2","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"g1F68TNqBqLxmye4TdM9aX","selected":false,"drawSunBeam":false,"dailyYield":55.22294044579748,"yearlyYield":285.77957159626914,"towerId":"eskWrngRsrfsVxitmEFwUG"},{"type":"Heliostat","cx":-0.00477734244411093,"cy":-0.22770720532833247,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"label":"1","normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hdPEQL9d6tCZYhADdWFZfX","selected":false,"drawSunBeam":false,"dailyYield":55.6028165469799,"yearlyYield":347.0340046876023,"towerId":"eskWrngRsrfsVxitmEFwUG"},{"type":"Heliostat","cx":0.2323986704109312,"cy":-0.30954026005156543,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kTbu5NQZzH6fiJzt2zLCpV","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":53.246534571972845},{"type":"Heliostat","cx":0.17980321076544034,"cy":-0.22890280592338727,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"ugqyZH3Bjuab2xu6Qr2AeU","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":53.9189143477242},{"type":"Heliostat","cx":-0.07007093092536987,"cy":-0.1429741712580097,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k7rmzdYXVhRoVennqPqJYd","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.28401806609266},{"type":"Heliostat","cx":-0.12643026558915396,"cy":-0.19914857752993684,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jSyunViQPLX4rv6KUBXXTZ","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.779971752065364},{"type":"Heliostat","cx":-0.18298718147417048,"cy":-0.27344375998511217,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"q1mgBumMQuofVfZ58dfPgn","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.56772790131693},{"type":"Heliostat","cx":0.28321098315789156,"cy":-0.26509916393356936,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"1BaYAuYZtqhDEGCFRqXDcs","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.94218222804658},{"type":"Heliostat","cx":0.06201663035944478,"cy":-0.01790276609260683,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4sC4oY8P4gCm2XiADRkgDQ","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.12412968997117},{"type":"Heliostat","cx":-0.005144086859809518,"cy":-0.11674424075888257,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"k2hvdFozuZeFRMXA2gCxru","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.06448667864852},{"type":"Heliostat","cx":-0.07326553095576034,"cy":-0.027001203548432953,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5gLYoZoHmvvc2dfNpBoMHu","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.30383700152939},{"type":"Heliostat","cx":-0.13103631875140445,"cy":-0.07211289731219922,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qoUTmK9iTzsVRu26aQmb6S","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.69974218752444},{"type":"Heliostat","cx":-0.1817498408877485,"cy":-0.14097184690480072,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aaDc1Nt2XKdpoCZWcocB2i","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.61502536288546},{"type":"Heliostat","cx":0.18334603588670687,"cy":-0.11254934524412023,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bLKFf4eYJctoWDbAWu1oSp","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.28829012678498},{"type":"Heliostat","cx":0.22982519862747094,"cy":-0.18140829483672175,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"svsNMecQbfU155PmYUZ3Lt","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.28883413506117},{"type":"Heliostat","cx":-0.11063137798263967,"cy":0.05978827549506581,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5WMpX8TYy1KfLhVCYdMj1p","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.62627922938169},{"type":"Heliostat","cx":-0.17545943143758383,"cy":-0.015603192528220722,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rLs3CXHWy1yv3CpNwWpHSg","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.26549812503945},{"type":"Heliostat","cx":-0.24132724425771757,"cy":-0.08265006449996429,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"iYKv2L4bbvL99cSYqy9g78","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.848591160974706},{"type":"Heliostat","cx":0.03729458715293578,"cy":0.08164735499997032,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6h32hqP5LZJr3g6KkvENFf","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.08288958631672},{"type":"Heliostat","cx":0.11635572065921955,"cy":0.046540137502459215,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hJpPNqZeYCYBc9ZnrtL8rd","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.96978366441096},{"type":"Heliostat","cx":0.18181232346843626,"cy":-0.01341062139199849,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"oKHW4guazpWYWFUbcAtx78","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.07324281354023},{"type":"Heliostat","cx":0.23064844077878674,"cy":-0.07172825838065355,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jGpvLznPcPbkxgRNT7LmEG","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":53.5263467357541},{"type":"Heliostat","cx":0.2818686549678243,"cy":-0.14348403247835934,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7v652Vk2Y4W8Ugs74iPYyx","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.3806127412903},{"type":"Heliostat","cx":-0.3082401794844816,"cy":-0.16518710728023572,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"wmMQERU6EmYPAHq1HGq5G1","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.09853407023647},{"type":"Heliostat","cx":-0.24347189333908248,"cy":-0.21316221673228722,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qmEBaJnQ1mYuWRgutUUj45","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.81901883725212},{"type":"Heliostat","cx":-0.00513145231321694,"cy":0.17906460190084825,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"hgFFjf5NE1fWwscAHtJz9W","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.9869366347695},{"type":"Heliostat","cx":-0.09086411123830242,"cy":0.16501351230124764,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"5E44DCctaDCtPRiHgiN8Co","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.67185579391978},{"type":"Heliostat","cx":-0.17172399438050032,"cy":0.1304794438850842,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"h3FAf2Pb5iRxcMgjsAapYN","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.424415155619826},{"type":"Heliostat","cx":-0.24560426470951535,"cy":0.057288487088492074,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"phQzzL3Mgfme6Exr5WqXA9","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.464335531506855},{"type":"Heliostat","cx":-0.3116400576517767,"cy":-0.015193358806695577,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"gSGxJne57KgDvvhX1w8m4S","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.33972665483218},{"type":"Heliostat","cx":0.08972170224219679,"cy":0.15564611828308753,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nvkfziKtbczLEbZ9noiReH","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.803611978337365},{"type":"Heliostat","cx":0.171198129873129,"cy":0.11877020207620374,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"e7BrgrYuxziAFGXqE8Paiu","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.234951957822524},{"type":"Heliostat","cx":0.23017733494925166,"cy":0.06724953811712991,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6E7Q93GeP3kP1LK9YLZv9E","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.62121496362152},{"type":"Heliostat","cx":0.2879404739413306,"cy":-0.00008679777502193404,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"nSCCumTcS91dqnMuiik1qm","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.104806039406704},{"type":"Heliostat","cx":-0.04193210541538864,"cy":0.08393432126519293,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"pmLUXug8LEht87AKuCxfbz","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.86211984880036},{"type":"Heliostat","cx":-0.37846374011465295,"cy":-0.11835014001933214,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o54KAWAv76mbgsJ1MBkyC5","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.835251993794415},{"type":"Heliostat","cx":0.34465672899242206,"cy":-0.0914088308517547,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"f7h8FDUa15ALkGHaRaG5Hv","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.60557336298944},{"type":"Heliostat","cx":-0.3756811771658677,"cy":-0.2797037551261536,"cz":0,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"2waE2goJnuKsD2ZPsCBxqm","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.239096027800045},{"type":"Heliostat","cx":-0.0055636104805840934,"cy":0.0022188088978148607,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w5ovRP3PCZ5upU3ukAjjLY","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.57798820659272},{"type":"Heliostat","cx":-0.431634308052032,"cy":-0.21576415823811107,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"jLzYFijeuhoktLs4FcLsmr","selected":false,"drawSunBeam":true,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":56.655113036860335},{"type":"Heliostat","cx":0.3946630399862396,"cy":-0.19563113598332482,"cz":0.5000000074506517,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"b3S1EEPjMRL48HLhjJkhr2","selected":false,"drawSunBeam":true,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.25718216433262},{"type":"Heliostat","cx":0.12498761867946595,"cy":-0.17981546405024668,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"aqxtvZXmbpAutc5KFCX7w3","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.07130415709169},{"type":"Heliostat","cx":0.07239701626792935,"cy":-0.14059769948158687,"cz":0.5000000074506517,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qn5fUEqKYEJLMaMGhD5V2c","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.18946575400989},{"type":"Heliostat","cx":-0.24287237174377305,"cy":-0.3185781749765691,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"4t86vx9fAWouPiFQswUJGQ","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.72330556669799},{"type":"Heliostat","cx":0.18153469158750113,"cy":-0.3291164926045614,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"rufeUy74dsTyxkeFYKX4qa","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.045757801118675},{"type":"Heliostat","cx":0.12559565172148782,"cy":-0.27759582864548765,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"6GXoab5MEeebRm4uGu1EG9","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.60344034574142},{"type":"Heliostat","cx":0.062360215351212084,"cy":-0.2448099515806225,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"w5TEya7XNeGuhPop6Pj6Es","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":55.12631354865891},{"type":"Heliostat","cx":-0.072015086935624,"cy":-0.24832272412328657,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"eDoKDbTtFpnA5S8UAeT5JD","selected":false,"drawSunBeam":true,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.944324146238436},{"type":"Heliostat","cx":-0.12856215984365912,"cy":-0.30569800901213173,"cz":0.5000000074505806,"lx":6,"ly":8,"lz":0.1,"reflectance":0.9,"tiltAngle":0,"relativeAzimuth":0,"poleRadius":0.2,"poleHeight":0.2,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"bybZmMq5HCRUCdJHjru2JV","selected":false,"drawSunBeam":false,"towerId":"eskWrngRsrfsVxitmEFwUG","dailyYield":54.723474182002164},{"type":"Foundation","cx":0.18915570284600136,"cy":-14.72071217951015,"cz":2,"lx":10,"ly":10,"lz":4,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"eskWrngRsrfsVxitmEFwUG","solarStructure":2,"locked":true,"solarPowerTower":{"towerHeight":40}},{"type":"Human","name":"Jett","cx":-77.63892197350822,"cy":-41.607852899711375,"cz":0.2499999999999991,"lx":0.6,"lz":1.85,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"ipe6xTyA51gao39GpL4FGX","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Desert","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1205,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":17,"groundColor":"#b3b3b3","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-114.20211728357525,-13.511893921234794,7.261369217489994],"panCenter":[-1.8505902264752938,-3.0386998652965884,7.261369217489986],"orthographic":false,"enableRotate":true,"cameraZoom":4.292775278858745,"showInstructionPanel":false,"showMapPanel":false,"cameraPosition2D":[30.004072506948148,24.229268474745034,50.000024229971295],"panCenter2D":[30.004072506948148,24.2293184769675,0.00002423000647812703],"solarRadiationHeatMapMaxValue":10,"showDailyHeliostatYieldPanel":true,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":364,"height":67}},"graphState":{"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar power tower surrounded by heliostats"]}')},510:function(e){e.exports=JSON.parse('{"docid":"cyN6tPCHQrmsUsTWTWV7Bq","time":"02/01/2023 08:28 pm","timestamp":1675301282345,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"date":"6/22/2022, 12:00:00 PM","timesPerHour":6,"address":"Tucson, AZ, USA","latitude":32.2226066,"longitude":-110.9747108,"name":"default","orthographic":false,"cameraZoom":35,"ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"noAnimationForSensorDataCollection":true,"noAnimationForHeatmapSimulation":true},"elements":[{"selected":false,"cz":0,"cx":-2.454909082526056,"type":"Human","id":"3NsNQgPftGsbYSoSRa2zV4","normal":[0,1,0],"cy":-1.9037352844719955,"name":"Jaye","rotation":[0,0,0],"parentId":"Ground","lx":0.6,"ly":0.6,"lz":1.65},{"cx":0.20566332108722207,"color":"gray","cz":1.3564241923192988,"type":"Cuboid","lz":2.7128483846385976,"normal":[0,0,1],"faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"ly":3.646712311386908,"cy":0.10935014088128625,"rotation":[0,0,0],"lx":2.2290047878920136,"id":"2QtCNEmEF6Mcs3vbbR96ZT","selected":false,"parentId":"Ground"},{"ly":0.1,"selected":false,"type":"Sensor","showLabel":false,"normal":[0,0,1],"lz":0.01,"rotation":[0,0,0],"lx":0.1,"cz":0.5000000000000002,"cx":-0.007027589631907428,"cy":0.03130304552555022,"id":"iqgmPt2Nm3r4bW8A7g6DJy","label":"Predicted (Hor.)","parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"},{"lz":0.01,"showLabel":false,"rotation":[0,0,0],"cy":-0.4999999988722324,"selected":false,"id":"1GCXGRbm6nuTH23uA8Yngz","cx":0.021624712729279145,"normal":[0,-1,0],"cz":0.03360969587566309,"ly":0.1,"type":"Sensor","label":"Predicted (Ver.)","lx":0.1,"parentId":"2QtCNEmEF6Mcs3vbbR96ZT","foundationId":"2QtCNEmEF6Mcs3vbbR96ZT"}],"view":{"showDailyLightSensorPanel":false,"showYearlyLightSensorPanel":true,"autoRotate":false,"showGroundPanel":false,"yearlyLightSensorPanelY":4,"stickyNotePanelX":6,"mapType":"roadmap","weatherPanelY":0,"shadowEnabled":true,"theme":"Default","stickyNotePanelY":0,"mapWeatherStations":false,"groundColor":"#16cda5","heliodon":false,"dailyLightSensorPanelX":-19,"axes":true,"showWeatherPanel":false,"dailyLightSensorPanelY":15,"mapTilt":0,"heliodonPanelX":-1235,"groundPanelY":0,"heliodonPanelY":7,"groundImage":false,"mapZoom":16,"showStickyNotePanel":true,"groundPanelX":0,"weatherPanelX":0,"yearlyLightSensorPanelX":-8,"showHeliodonPanel":false,"cameraPosition":[8.133880295141486,-8.174433278152733,4.6847078485248606],"panCenter":[4.464757127641991,2.597260416450505,0.5357741885065452],"orthographic":false,"enableRotate":true,"cameraZoom":28.63945562104857,"cameraPosition2D":[0,-0.00004000177797536253,39.99999999997991],"panCenter2D":[0,0,0],"showMapPanel":false,"yearlyLightSensorPanelRect":{"x":0,"y":0,"width":600,"height":500},"stickyNotePanelRect":{"x":-5,"y":5,"width":339,"height":74}},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Solar radiation: Prediction vs. Measurement"]}')},511:function(e){e.exports=JSON.parse('{"docid":"gbXM1tEmZzS8k1fXMr7e4c","time":"02/04/2023 12:04 pm","timestamp":1675530248432,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"12/22/2023, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Denver, CO, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":39.7392358,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-104.990251,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-0.8479752220394552,"cy":-6.151925396723704,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-0.00341839393728538,"cy":0.6271804028246559,"cz":0.05,"lx":10,"ly":10,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":4},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"","showLabel":false,"labelHeight":8.5,"labelSize":0.8,"rValue":5.283308619189682},{"type":"Wall","cx":-2.220446049250313e-16,"cy":2.5,"cz":2.2408122612280286,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[3.9999999999999996,2.5,0],"rightPoint":[-4,2.5,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":3.999999999999999,"cy":-0.49999999999999956,"cz":2.2301039869226305,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[3.9999999999999982,-3.499999999999999,0],"rightPoint":[4,2.5,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":2.220446049250313e-16,"cy":-3.4999999999999996,"cz":2.268765007024547,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-3.9999999999999996,-3.499999999999999,0],"rightPoint":[4,-3.5,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-4.000000000000001,"cy":-0.49999999999999956,"cz":2.228839888904333,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-4,2.5,0],"rightPoint":[-4.000000000000002,-3.499999999999999,0],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Window","cx":-0.25,"cy":0.3,"cz":0,"lx":0.375,"ly":0.2,"lz":0.7407407407407407,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#cccccc","tint":"#73D8FF","opacity":0.21,"uValue":1.98,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"5cYjXS4vMUpWUASfp6LsaY"},{"type":"Window","cx":0.25,"cy":0.3,"cz":0,"lx":0.375,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"edHVWga9uF8kxRK4efRqds","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj","wugyuZMsPdNUQJ1PdoxEGD","py4fscALBHuoNNVWKoXS9c","xi9Zz1pobWAhkAdtkZFZBZ"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"vBPx8vrh1SNvECDHWBPRBR","volumetricHeatCapacity":0.1,"ceiling":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-5.192350773225651,-4.0711716850268145,-0.000004027338022569633],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-5.192350773225651,-4.071321691694211,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[7.8185785102529906,-10.621731483534056,2.062041901327996],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":453,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":45.441463616067075,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-1194,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.8531721737261184,2.5703581157054773,0.7819560454316943],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-277,"y":233,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":true,"yearlyBuildingEnergyPanelRect":{"x":-2,"y":5,"width":775,"height":342},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-2,"y":0,"width":225,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["BESTEST Case 600"]}')},512:function(e){e.exports=JSON.parse('{"docid":"rSjWfLHkJUuBXYDJVZ7K7Z","time":"02/03/2023 07:07 pm","timestamp":1675469237287,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"12/22/2023, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Denver, CO, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":39.7392358,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-104.990251,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-0.8479752220394552,"cy":-6.151925396723704,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-0.00341839393728538,"cy":0.6271804028246559,"cz":0.05,"lx":10,"ly":8,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":4},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"","showLabel":false,"labelHeight":8.5,"labelSize":0.8,"rValue":5.283308619189682},{"type":"Wall","cx":-2.220446049250313e-16,"cy":2.5,"cz":2.2408122612280286,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[3.9999999999999996,2.5,0],"rightPoint":[-4,2.5,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":3.999999999999999,"cy":-0.49999999999999956,"cz":2.2301039869226305,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[3.9999999999999982,-3.499999999999999,0],"rightPoint":[4,2.5,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":2.220446049250313e-16,"cy":-3.4999999999999996,"cz":2.268765007024547,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-3.9999999999999996,-3.499999999999999,0],"rightPoint":[4,-3.5,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-4.000000000000001,"cy":-0.49999999999999956,"cz":2.228839888904333,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-4,2.5,0],"rightPoint":[-4.000000000000002,-3.499999999999999,0],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Window","cx":-0.25,"cy":0.3,"cz":0,"lx":0.375,"ly":0.2,"lz":0.7407407407407407,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"color":"#cccccc","tint":"#73D8FF","opacity":0.21,"uValue":1.98,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"5cYjXS4vMUpWUASfp6LsaY"},{"type":"Window","cx":0.25,"cy":0.3,"cz":0,"lx":0.375,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"edHVWga9uF8kxRK4efRqds","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj","wugyuZMsPdNUQJ1PdoxEGD","py4fscALBHuoNNVWKoXS9c","xi9Zz1pobWAhkAdtkZFZBZ"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"vBPx8vrh1SNvECDHWBPRBR","volumetricHeatCapacity":0.1,"ceiling":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[12.940867975227082,3.763083016970702,0.000003785257595501958],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[12.940867975227082,3.7629330102992693,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[10.826418732519464,-13.023829528886234,2.75514975469418],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":713,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":41.010920913500534,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-1192,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[3.447654823068404,9.854417213021707,0.03152947137006695],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-168,"y":465,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":true,"yearlyBuildingEnergyPanelRect":{"x":-32,"y":11,"width":775,"height":342},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-4,"y":0,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["BESTEST Case 610"]}')},513:function(e){e.exports=JSON.parse('{"docid":"hCJ4qTBLMgzCCrmVBvT6Er","time":"02/04/2023 12:05 pm","timestamp":1675530329920,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"12/22/2023, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Denver, CO, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":39.7392358,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-104.990251,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-0.8479752220394552,"cy":-6.151925396723704,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-0.00341839393728538,"cy":0.6271804028246559,"cz":0.05,"lx":10,"ly":10,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":4},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"","showLabel":false,"labelHeight":8.5,"labelSize":0.8,"rValue":5.283308619189682},{"type":"Wall","cx":-2.220446049250313e-16,"cy":2.5,"cz":2.2408122612280286,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[3.9999999999999996,2.5,0],"rightPoint":[-4,2.5,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":3.999999999999999,"cy":-0.49999999999999956,"cz":2.2301039869226305,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[3.9999999999999982,-3.499999999999999,0],"rightPoint":[4,2.5,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":2.220446049250313e-16,"cy":-3.4999999999999996,"cz":2.268765007024547,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-3.9999999999999996,-3.499999999999999,0],"rightPoint":[4,-3.5,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-4.000000000000001,"cy":-0.49999999999999956,"cz":2.228839888904333,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-4,2.5,0],"rightPoint":[-4.000000000000002,-3.499999999999999,0],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj","wugyuZMsPdNUQJ1PdoxEGD","py4fscALBHuoNNVWKoXS9c","xi9Zz1pobWAhkAdtkZFZBZ"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"vBPx8vrh1SNvECDHWBPRBR","volumetricHeatCapacity":0.1,"ceiling":false},{"type":"Window","cx":0,"cy":0.3,"cz":0,"lx":0.5000000000000001,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kUbRYwVoGDc7GFwgriV2eg","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Window","cx":0,"cy":0.3,"cz":0,"lx":0.5000000000000001,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2bnQyuWKAaZeiivebKX7uN","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-5.192350773225651,-4.0711716850268145,-0.000004027338022569633],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-5.192350773225651,-4.071321691694211,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[11.427289283038643,-11.277019680971108,2.795880222169619],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":453,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":45.441463616067075,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-1194,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[1.8699123691558452,2.578944652142625,0.7819560454316943],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-277,"y":233,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":true,"yearlyBuildingEnergyPanelRect":{"x":-2,"y":5,"width":775,"height":342},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-5,"y":-2,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["BESTEST Case 620"]}')},514:function(e){e.exports=JSON.parse('{"docid":"67HXdfbAHrwMfJ2uYxYEr9","time":"02/04/2023 12:05 pm","timestamp":1675530342623,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"12/22/2023, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Denver, CO, USA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":39.7392358,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-104.990251,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-0.8479752220394552,"cy":-6.151925396723704,"cz":0,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-0.00341839393728538,"cy":0.6271804028246559,"cz":0.05,"lx":10,"ly":10,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":4},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"","showLabel":false,"labelHeight":8.5,"labelSize":0.8,"rValue":5.283308619189682},{"type":"Wall","cx":-2.220446049250313e-16,"cy":2.5,"cz":2.2408122612280286,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[3.9999999999999996,2.5,0],"rightPoint":[-4,2.5,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":3.999999999999999,"cy":-0.49999999999999956,"cz":2.2301039869226305,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[3.9999999999999982,-3.499999999999999,0],"rightPoint":[4,2.5,0],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":2.220446049250313e-16,"cy":-3.4999999999999996,"cz":2.268765007024547,"lx":8,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-3.9999999999999996,-3.499999999999999,0],"rightPoint":[4,-3.5,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-4.000000000000001,"cy":-0.49999999999999956,"cz":2.228839888904333,"lx":5.999999999999999,"ly":0.2,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-4,2.5,0],"rightPoint":[-4.000000000000002,-3.499999999999999,0],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"vBPx8vrh1SNvECDHWBPRBR","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-0.05384985471511783,"cy":1.4780044124957141,"cz":2.2408122612280286,"lx":1,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":[],"rightJoints":["kFtcq9qJ814nEePHMgSpYL"],"leftPoint":[0.44615014528488217,1.4780044124957141,0.1],"rightPoint":[-0.5538498547151178,1.4780044124957141,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"pEW367Y1exs7be2pbQHztg","parentId":"pVKekTH3vBaJDuKFqWJNR3","foundationId":"pVKekTH3vBaJDuKFqWJNR3","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"sEJTDSykek3p5kyccPdUdD","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Foundation","cx":4.561959864141299,"cy":0.16041396503555294,"cz":0.05,"lx":2.922675695011217,"ly":3.0478862418425114,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3},"labelHeight":8.5,"labelSize":0.8,"showLabel":false,"id":"pVKekTH3vBaJDuKFqWJNR3","selected":false,"rValue":5.283308619189682},{"type":"Wall","cx":-0.05384985471511783,"cy":-1.5219955875042859,"cz":2.2408122612280286,"lx":1.004987562112089,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["kFtcq9qJ814nEePHMgSpYL"],"rightJoints":[],"leftPoint":[-0.5538498547151178,-1.5219955875042859,0.1],"rightPoint":[0.44615014528488217,-1.5219955875042859,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"vX5VrXQkMJaYbWcrM1Z6Lz","parentId":"pVKekTH3vBaJDuKFqWJNR3","foundationId":"pVKekTH3vBaJDuKFqWJNR3","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"sEJTDSykek3p5kyccPdUdD","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-0.5538498547151178,"cy":-0.021995587504285874,"cz":0,"lx":2.9999999999999996,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Empty","leftJoints":["pEW367Y1exs7be2pbQHztg"],"rightJoints":["vX5VrXQkMJaYbWcrM1Z6Lz"],"leftPoint":[-0.5538498547151178,1.4780044124957137,0.1],"rightPoint":[-0.5538498547151178,-1.5219955875042859,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"kFtcq9qJ814nEePHMgSpYL","parentId":"pVKekTH3vBaJDuKFqWJNR3","foundationId":"pVKekTH3vBaJDuKFqWJNR3","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"sEJTDSykek3p5kyccPdUdD","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["vX5VrXQkMJaYbWcrM1Z6Lz","kFtcq9qJ814nEePHMgSpYL","pEW367Y1exs7be2pbQHztg"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"pVKekTH3vBaJDuKFqWJNR3","foundationId":"pVKekTH3vBaJDuKFqWJNR3","id":"sEJTDSykek3p5kyccPdUdD","ceiling":false},{"type":"Window","cx":0,"cy":0.3,"cz":0,"lx":0.5000000000000001,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"jr5eRruUgVNaMyJ4BgMJfz","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Window","cx":0,"cy":0.3,"cz":0,"lx":0.5000000000000001,"ly":0.2,"lz":0.7407407407407407,"uValue":1.98,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"#cccccc","frame":false,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"85V2NYuPDyi8cjwzsRQJ5n","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.21,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Wall","cx":-0.05384985471511783,"cy":1.4780044124957141,"cz":2.2408122612280286,"lx":1,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":[],"rightJoints":["4vW6e4BZW3jyozPbqjnt5D"],"leftPoint":[0.44615014528488217,1.4780044124957141,0.1],"rightPoint":[-0.5538498547151178,1.4780044124957141,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"wAZYpbu3zMiGQjV2LpAcDG","parentId":"93LBsy6WnVM9PgJ49pUP7g","foundationId":"93LBsy6WnVM9PgJ49pUP7g","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pKTG8B6HTAm7A7dtN3ZbsU","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-0.05384985471511783,"cy":-1.5219955875042859,"cz":2.2408122612280286,"lx":1.004987562112089,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["4vW6e4BZW3jyozPbqjnt5D"],"rightJoints":[],"leftPoint":[-0.5538498547151178,-1.5219955875042859,0.1],"rightPoint":[0.44615014528488217,-1.5219955875042859,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"7vsveQVeKqeZenZ1pDApJC","parentId":"93LBsy6WnVM9PgJ49pUP7g","foundationId":"93LBsy6WnVM9PgJ49pUP7g","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pKTG8B6HTAm7A7dtN3ZbsU","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"type":"Wall","cx":-0.5538498547151178,"cy":-0.021995587504285874,"cz":0,"lx":2.9999999999999996,"ly":0.1,"lz":2.7,"rValue":2.13,"volumetricHeatCapacity":0.1,"fill":"Empty","leftJoints":["wAZYpbu3zMiGQjV2LpAcDG"],"rightJoints":["7vsveQVeKqeZenZ1pDApJC"],"leftPoint":[-0.5538498547151178,1.4780044124957137,0.1],"rightPoint":[-0.5538498547151178,-1.5219955875042859,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"id":"4vW6e4BZW3jyozPbqjnt5D","parentId":"93LBsy6WnVM9PgJ49pUP7g","foundationId":"93LBsy6WnVM9PgJ49pUP7g","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"pKTG8B6HTAm7A7dtN3ZbsU","leftRoofHeight":2.7,"rightRoofHeight":2.7,"selected":false,"eavesLength":0,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":2.7,"rightTopPartialHeight":2.7},{"id":"pKTG8B6HTAm7A7dtN3ZbsU","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"color":"#4d4d4d","rValue":4,"sideColor":"#4d4d4d","normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"93LBsy6WnVM9PgJ49pUP7g","foundationId":"93LBsy6WnVM9PgJ49pUP7g","roofType":"Pyramid","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["7vsveQVeKqeZenZ1pDApJC","4vW6e4BZW3jyozPbqjnt5D","wAZYpbu3zMiGQjV2LpAcDG"],"selected":false,"ceiling":false},{"type":"Foundation","cx":-4.58324969491131,"cy":0.09837545208621207,"cz":0.05,"lx":2.922675695011217,"ly":3.0478862418425114,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-3.141592653589793],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3},"labelHeight":8.5,"labelSize":0.8,"showLabel":false,"id":"93LBsy6WnVM9PgJ49pUP7g","selected":false,"rValue":5.283308619189682},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":0,"thickness":0.1,"rValue":4,"roofType":"Pyramid","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj","wugyuZMsPdNUQJ1PdoxEGD","py4fscALBHuoNNVWKoXS9c","xi9Zz1pobWAhkAdtkZFZBZ"],"textureType":"No Roof Texture","color":"#4d4d4d","sideColor":"#4d4d4d","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"vBPx8vrh1SNvECDHWBPRBR","volumetricHeatCapacity":0.1,"ceiling":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-1.0768229629118022,2.7613875173197986,0.0000027683726328203026],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-1.0768229629118022,2.7612375106561817,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[14.12898513990324,-7.74877596104179,2.534986637546045],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":453,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":75.89554049207445,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-1194,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[4.485245288976777,3.6907945473464463,2.058363039574734],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":false,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-1262,"y":232,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":true,"yearlyBuildingEnergyPanelRect":{"x":-32,"y":11,"width":775,"height":342},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-3,"y":-3,"width":200,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["BESTEST Case 630"]}')},515:function(e){e.exports=JSON.parse('{"docid":"1mt3H85vSeLycnvzEbiGLF","timestamp":1647905546466,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":39.0042841,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":-3.3716443,"ground":{"albedo":0.32,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"13200 Manzanares, Ciudad Real, Spain","date":"6/8/2022 2:30:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":2,"sutGridCellSize":5,"diurnalTemperatureModel":2,"highestTemperatureTimeInMinutes":930,"noAnimationForSolarUpdraftTowerSimulation":true,"noAnimationForSensorDataCollection":true,"noAnimationForHeatmapSimulation":false,"airConvectiveCoefficient":10},"elements":[{"cy":0.8227637571854691,"normal":[0,0,1],"lz":0.5,"ly":250,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.8016636577985707,"cz":0.05,"rotation":[0,0,0],"lx":250,"selected":false,"parentId":"Ground","solarReceiverHeight":20,"locked":false,"solarStructure":3,"color":"#cccccc","solarUpdraftTower":{"collectorHeight":2,"collectorRadius":122,"chimneyHeight":195,"chimneyRadius":5,"collectorEmissivity":0.9,"collectorTransmissivity":0.8,"turbineEfficiency":0.3}},{"type":"Sensor","cx":-0.4159783264084858,"cy":0.39987868253676767,"cz":0.5000000074505806,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o2v8sLskiRxHNQMJYgmnf4","selected":false},{"type":"Human","name":"Jack","cx":-101.47750420174262,"cy":106.72814742414681,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"nRWqXrYCJwuMMKPznon3yj","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":19,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":50,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":-605,"showGroundPanel":false,"showHeliodonPanel":true,"heliodon":false,"weatherPanelY":53,"heliodonPanelX":-1226,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":60,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-1231,"weatherPanelX":606,"heliodonPanelY":482,"groundColor":"#68ccca","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[-286.26711514248836,-379.63764367710024,88.70698003902253],"panCenter":[31.318634005291777,-33.73977035496972,57.75472306965425],"orthographic":false,"enableRotate":true,"cameraZoom":1.8893648827547527,"showInstructionPanel":true,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,50.00001246725617],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":7,"showDailyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"showDailyUpdraftTowerYieldPanel":true,"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelX":1237,"diurnalTemperaturePanelY":239,"dailyUpdraftTowerYieldPanelX":-3,"dailyUpdraftTowerYieldPanelY":18},"notes":[]}')},516:function(e){e.exports=JSON.parse('{"docid":"snT8RSM4bna2exT4SbrKpx","timestamp":1647994374708,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":25.206789542006906,"solarPanelGridCellSize":0.5,"timesPerHour":4,"longitude":55.273800285141746,"ground":{"albedo":0.32,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Dubai - United Arab Emirates","date":"4/22/2022 1:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"solarRadiationHeatmapGridCellSize":2,"sutGridCellSize":5,"diurnalTemperatureModel":2,"highestTemperatureTimeInMinutes":930,"noAnimationForSolarUpdraftTowerSimulation":true,"noAnimationForSensorDataCollection":true,"noAnimationForHeatmapSimulation":false,"airConvectiveCoefficient":10},"elements":[{"cy":-14.779474133308753,"normal":[0,0,1],"lz":0.5,"ly":264.0330484296776,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-13.154176421163392,"cz":0.05,"rotation":[0,0,0],"lx":454.50633176715684,"selected":false,"parentId":"Ground","solarReceiverHeight":20,"locked":false,"solarStructure":3,"color":"#16a5a5","solarUpdraftTower":{"collectorHeight":2,"collectorRadius":122,"chimneyHeight":195,"chimneyRadius":5,"collectorEmissivity":0.9,"collectorTransmissivity":0.8,"turbineEfficiency":0.3},"textureType":"No Foundation Texture"},{"type":"Sensor","cx":-0.11120328110703694,"cy":0.21015039060624294,"cz":0.5000000074505806,"lx":0.1,"ly":0.1,"lz":0.01,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"o2v8sLskiRxHNQMJYgmnf4","selected":false},{"type":"Cuboid","cx":2.1177379727110406,"cy":160.51534566937434,"cz":74.09390657882601,"lx":78.30098332647403,"ly":55.99394288505539,"lz":148.18781315765202,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.025752033646721628],"parentId":"Ground","selected":false,"id":"2EhrboeXntUZKiBN3HjSix"},{"type":"Cuboid","cx":50.66161337498563,"cy":207.36077727687461,"cz":32.43138091159533,"lx":145.9842111895511,"ly":125.02724353031309,"lz":64.86276182319067,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.13048951214355942],"parentId":"Ground","id":"6Xn8R7eKSnxRxHnYpiNTaj","selected":false},{"type":"Cuboid","cx":-72.11151802635683,"cy":193.1105351858589,"cz":37.54389418882869,"lx":180.92996331753585,"ly":104.88750828847839,"lz":75.08778837765738,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.4372817352121965],"parentId":"Ground","id":"qmmFDRVBHd8n28gezjkd3v","selected":false},{"type":"Cuboid","cx":153.53794529088543,"cy":135.2714939761318,"cz":28.458907280218547,"lx":236.41206811774626,"ly":73.3973881158558,"lz":56.917814560437094,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-1.0889289069735497],"parentId":"Ground","id":"6WFEHvBHfcw1hyoqbdVq2Q","selected":false},{"type":"Cuboid","cx":197.28140665982946,"cy":-49.22558984875294,"cz":23.43801759070747,"lx":72.3188854798575,"ly":208.05225786437427,"lz":46.87603518141494,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,-0.13048951214355942],"parentId":"Ground","id":"wVZSZy2dQew3t36trixDr8","selected":false},{"type":"Cuboid","cx":-201.1839566931086,"cy":103.76736037364329,"cz":23.43801759070747,"lx":180.92996331753585,"ly":104.88750828847839,"lz":46.87603518141494,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0.7727363696866378],"parentId":"Ground","id":"1QdVXZ9PmC9w7nnsHyZH8T","selected":false},{"type":"Cuboid","cx":-255.36665065884822,"cy":-36.73723769206747,"cz":18.59922423283554,"lx":225.13779640089743,"ly":104.62558934593119,"lz":37.19844846567108,"color":"#ffffff","faceColors":["#ffffff","#ffffff","#ffffff","#ffffff","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,1.5327638573782314],"parentId":"Ground","id":"raZT6wgNraS3Vp9bqR82TD","selected":false}],"view":{"yearlyPvYieldPanelX":-25,"autoRotate":false,"mapZoom":18,"axes":false,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-4,"dailyLightSensorPanelY":50,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":16,"yearlyLightSensorPanelX":-605,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":53,"heliodonPanelX":-1226,"dailyPvYieldPanelY":3,"mapWeatherStations":false,"yearlyLightSensorPanelY":60,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-1231,"weatherPanelX":606,"heliodonPanelY":482,"groundColor":"#68ccca","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[-90.01171835895659,-555.4483085712341,96.07353497556753],"panCenter":[-9.153086630446868,47.334689777283224,96.07353497556753],"orthographic":false,"enableRotate":true,"cameraZoom":1.8893648827547527,"showInstructionPanel":true,"showMapPanel":false,"cameraPosition2D":[8.410285062152344,12.466838396919735,50.00001246725617],"panCenter2D":[8.410285062152344,12.466888399142201,0.000012467288726847116],"solarRadiationHeatMapMaxValue":5,"showDailyHeliostatYieldPanel":false,"dailyHeliostatYieldPanelX":null,"dailyHeliostatYieldPanelY":null,"showYearlyHeliostatYieldPanel":false,"showDailyUpdraftTowerYieldPanel":false,"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelX":1237,"diurnalTemperaturePanelY":239,"dailyUpdraftTowerYieldPanelX":-3,"dailyUpdraftTowerYieldPanelY":18},"notes":[]}')},517:function(e){e.exports=JSON.parse('{"docid":"vW4e6RYtysT2Mk4RJsMwWK","timestamp":1647108232108,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"longitude":-110.90092954103089,"solarRadiationHeatmapGridCellSize":1,"discretization":"Approximate","timesPerHour":4,"date":"9/22/2022 1:15:00 PM","name":"default","solarPanelVisibilityGridCellSize":0.2,"airAttenuationCoefficient":0.01,"pvGridCellSize":0.5,"latitude":32.15910168004556,"address":"4346 E Irvington Rd, Tucson, AZ 85714, USA","ground":{"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0],"thermalDiffusivity":0.05,"albedo":0.3},"cspTimesPerHour":4,"cspGridCellSize":1},"elements":[{"textureType":"No Foundation Texture","lz":0.1,"ly":428,"cx":-12.823413575842814,"locked":false,"type":"Foundation","id":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"lx":111.22000916830105,"solarAbsorberPipe":{"absorberHeight":16,"apertureWidth":1},"rotation":[0,0,0],"parentId":"Ground","cz":0.05,"cy":-21.37347182127145,"normal":[0,0,1]},{"reflectance":0.9,"label":"1","absorptance":0.95,"poleHeight":0.2,"selected":false,"drawSunBeam":true,"poleRadius":0.05,"type":"Fresnel Reflector","relativeAzimuth":0,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","parentId":"kxHYpYsUs7XEocuTYAj1Qu","cx":-0.4012211769217936,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","ly":420,"showLabel":false,"cz":0,"dailyYield":148.93207880790618,"cy":0.006680793972906053,"opticalEfficiency":0.7,"moduleLength":20,"lx":2.5,"lz":0.1,"normal":[0,0,1],"tiltAngle":0,"thermalEfficiency":0.3,"rotation":[0,0,0],"id":"gGEdWUHCti1PrRxJ7JDarq"},{"poleRadius":0.05,"rotation":[0,0,0],"relativeAzimuth":0,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"reflectance":0.9,"tiltAngle":0,"cz":0,"cx":-0.3742476132399176,"showLabel":false,"ly":420,"normal":[0,0,1],"poleHeight":0.2,"selected":false,"lz":0.1,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"3xn438z3EMLSwNjb9D63WM","lx":2.5,"type":"Fresnel Reflector","cy":0.006680793972906053,"drawSunBeam":true},{"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"poleHeight":0.2,"id":"bLwgNAfScj3MbJ3LCbgVeJ","cx":0.4118441240173573,"rotation":[0,0,0],"receiverId":"jbxC2ET67y7TWpMwnYUQpG","ly":420,"poleRadius":0.05,"reflectance":0.9,"cy":0.006920168618473448,"tiltAngle":0,"cz":0.5000000074505806,"lz":0.1,"moduleLength":20,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","showLabel":false,"drawSunBeam":true,"normal":[0,0,1],"lx":2.5,"type":"Fresnel Reflector","selected":false},{"lz":0.1,"cy":0.006920164646334277,"cx":0.38874501986607163,"ly":420,"reflectance":0.9,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"n7GLSN9b7KQJT3M3e1Gbd6","lx":2.5,"moduleLength":20,"tiltAngle":0,"normal":[0,0,1],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleHeight":0.2,"cz":0.5000000074506161,"rotation":[0,0,0],"relativeAzimuth":0,"drawSunBeam":true,"selected":false,"poleRadius":0.05,"type":"Fresnel Reflector","showLabel":false},{"selected":false,"parentId":"Ground","type":"Cuboid","color":"gray","cx":-52.4956763602033,"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"cz":2.295137859741913,"ly":6.761851189958324,"id":"2ef4fdCaFagjkM5oc3rwcu","faceColors":["gray","gray","gray","gray","gray","gray"],"lx":17.519341460326316,"rotation":[0,0,0],"cy":209.0290599516856,"normal":[0,0,1],"lz":4.590275719483826},{"ly":420,"rotation":[0,0,0],"poleHeight":0.2,"lz":0.1,"moduleLength":20,"cz":0.5000000074506517,"id":"8GG67NKVFrvbH3J8prHsci","showLabel":false,"poleRadius":0.05,"selected":false,"reflectance":0.9,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","normal":[0,0,1],"type":"Fresnel Reflector","parentId":"kxHYpYsUs7XEocuTYAj1Qu","tiltAngle":0,"cy":0.006920160674195108,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cx":0.3629408980758779,"relativeAzimuth":0,"drawSunBeam":true,"lx":2.5},{"lx":2.5,"moduleLength":20,"type":"Fresnel Reflector","relativeAzimuth":0,"cy":0.006920156702055938,"poleHeight":0.2,"poleRadius":0.05,"cz":0.5000000074506872,"selected":false,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","normal":[0,0,1],"showLabel":false,"rotation":[0,0,0],"id":"iiCPQvzxSxVKeMzjiCWt4r","drawSunBeam":true,"lz":0.1,"reflectance":0.9,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cx":0.33443175864677654,"ly":420,"tiltAngle":0,"parentId":"kxHYpYsUs7XEocuTYAj1Qu"},{"type":"Fresnel Reflector","normal":[0,0,1],"id":"48A3HEC1e87s6pvydn6P2h","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","ly":420,"poleHeight":0.2,"selected":false,"cx":0.3059226192176751,"rotation":[0,0,0],"tiltAngle":0,"relativeAzimuth":0,"lx":2.5,"cy":0.006920152729916776,"lz":0.1,"moduleLength":20,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleRadius":0.05,"drawSunBeam":true,"cz":0.5000000074507227,"showLabel":false,"reflectance":0.9,"parentId":"kxHYpYsUs7XEocuTYAj1Qu"},{"normal":[0,0,1],"rotation":[0,0,0],"poleHeight":0.2,"type":"Fresnel Reflector","id":"p9gJ8g2kx38fJVQXUT5Mgz","cx":0.27741347978857367,"moduleLength":20,"relativeAzimuth":0,"showLabel":false,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cz":0.5000000074507582,"lx":2.5,"reflectance":0.9,"poleRadius":0.05,"selected":false,"lz":0.1,"ly":420,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","cy":0.0069201487577776055,"tiltAngle":0,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","drawSunBeam":true},{"relativeAzimuth":0,"showLabel":false,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074507938,"selected":false,"normal":[0,0,1],"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0],"moduleLength":20,"poleRadius":0.05,"drawSunBeam":true,"cy":0.006920144785638444,"tiltAngle":0,"id":"nUiryBqcmAQ2AAWDiEELcv","cx":0.24890434035947226,"lz":0.1,"ly":420,"poleHeight":0.2,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","reflectance":0.9,"type":"Fresnel Reflector","lx":2.5},{"ly":420,"reflectance":0.9,"poleRadius":0.05,"showLabel":false,"type":"Fresnel Reflector","relativeAzimuth":0,"normal":[0,0,1],"receiverId":"jbxC2ET67y7TWpMwnYUQpG","parentId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074508293,"poleHeight":0.2,"cx":0.22039520093037082,"selected":false,"tiltAngle":0,"moduleLength":20,"lx":2.5,"rotation":[0,0,0],"cy":0.006920140813499274,"drawSunBeam":true,"lz":0.1,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"c1WTMXLtugeCdJwSfZWMz9"},{"poleHeight":0.2,"ly":420,"lx":2.5,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","showLabel":false,"selected":false,"relativeAzimuth":0,"cz":0.5000000074508648,"drawSunBeam":true,"rotation":[0,0,0],"poleRadius":0.05,"cx":0.1918860615012694,"type":"Fresnel Reflector","lz":0.1,"id":"3Kj4GK5Z8rMjFhG7kwoBBb","tiltAngle":0,"reflectance":0.9,"normal":[0,0,1],"cy":0.006920136841360104,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"receiverId":"jbxC2ET67y7TWpMwnYUQpG"},{"receiverId":"jbxC2ET67y7TWpMwnYUQpG","relativeAzimuth":0,"cx":0.16337692207216795,"tiltAngle":0,"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"poleHeight":0.2,"drawSunBeam":true,"type":"Fresnel Reflector","cz":0.5000000074509003,"poleRadius":0.05,"id":"gRmwqsLeYTEckzUeWsqBhN","showLabel":false,"normal":[0,0,1],"lx":2.5,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"reflectance":0.9,"lz":0.1,"cy":0.006920132869220934,"ly":420},{"cz":0.5000000074509359,"cy":0.006920128897081764,"drawSunBeam":true,"type":"Fresnel Reflector","ly":420,"selected":false,"poleHeight":0.2,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleRadius":0.05,"tiltAngle":0,"cx":0.13486778264306654,"lz":0.1,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","showLabel":false,"id":"joT2iHz7uZVy7UaUNMCzBF","moduleLength":20,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"lx":2.5,"rotation":[0,0,0],"reflectance":0.9,"normal":[0,0,1]},{"normal":[0,0,1],"id":"itX4GCN56fDPamdgJYAmwQ","selected":false,"lx":2.5,"drawSunBeam":true,"showLabel":false,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074509714,"cx":0.10635864321396508,"lz":0.1,"cy":0.006920124924942602,"poleHeight":0.2,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","type":"Fresnel Reflector","rotation":[0,0,0],"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","tiltAngle":0,"poleRadius":0.05,"moduleLength":20,"relativeAzimuth":0,"ly":420,"reflectance":0.9},{"type":"Fresnel Reflector","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","poleHeight":0.2,"cy":0.00692012095280344,"cz":0.5000000074510069,"ly":420,"relativeAzimuth":0,"drawSunBeam":true,"moduleLength":20,"lx":2.5,"showLabel":false,"id":"5e4g29VTk26fuKRVWuNgRz","parentId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0],"cx":0.07784950378486367,"poleRadius":0.05,"lz":0.1,"tiltAngle":0,"reflectance":0.9,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","selected":false,"normal":[0,0,1]},{"id":"sBjhkF3pMtT3cQ3g1UR96e","cz":0.5000000074510424,"cx":0.049340364355762216,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleHeight":0.2,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","type":"Fresnel Reflector","ly":420,"normal":[0,0,1],"showLabel":false,"relativeAzimuth":0,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"lz":0.1,"cy":0.006920116980664271,"reflectance":0.9,"tiltAngle":0,"moduleLength":20,"rotation":[0,0,0],"lx":2.5,"drawSunBeam":true,"poleRadius":0.05},{"poleHeight":0.2,"poleRadius":0.05,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cy":0.0069201130085251,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","lz":0.1,"showLabel":false,"ly":420,"selected":false,"reflectance":0.9,"moduleLength":20,"rotation":[0,0,0],"lx":2.5,"tiltAngle":0,"cz":0.500000007451078,"type":"Fresnel Reflector","normal":[0,0,1],"cx":0.020831224926660816,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","id":"h3TzeZk2YVWTGe9knmBmhc","drawSunBeam":true,"relativeAzimuth":0},{"cy":0.0069201090363859305,"poleRadius":0.05,"drawSunBeam":true,"lx":2.5,"normal":[0,0,1],"tiltAngle":0,"rotation":[0,0,0],"moduleLength":20,"showLabel":false,"poleHeight":0.2,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"selected":false,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","id":"kWfcmDULgEQa34dEtRx2UT","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","ly":420,"reflectance":0.9,"cz":0.5000000074511135,"cx":-0.007677914502440628,"lz":0.1,"type":"Fresnel Reflector"},{"reflectance":0.9,"rotation":[0,0,0],"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","ly":420,"type":"Fresnel Reflector","normal":[0,0,1],"tiltAngle":0,"id":"wQ8RFzz864QiELuFRWM7ge","poleHeight":0.2,"cz":0.500000007451149,"drawSunBeam":true,"cx":-0.03618705393154207,"selected":false,"showLabel":false,"lz":0.1,"cy":0.00692010506424676,"moduleLength":20,"lx":2.5,"poleRadius":0.05,"parentId":"kxHYpYsUs7XEocuTYAj1Qu"},{"poleHeight":0.2,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","parentId":"kxHYpYsUs7XEocuTYAj1Qu","cy":0.006920101092107599,"id":"rCD4HDT8779Y925QdUv6gZ","cx":-0.06469619336064349,"drawSunBeam":true,"selected":false,"lx":2.5,"poleRadius":0.05,"cz":0.5000000074511846,"relativeAzimuth":0,"type":"Fresnel Reflector","normal":[0,0,1],"lz":0.1,"reflectance":0.9,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","tiltAngle":0,"rotation":[0,0,0],"ly":420,"showLabel":false,"moduleLength":20},{"ly":420,"poleHeight":0.2,"normal":[0,0,1],"cx":-0.0932053327897449,"id":"dMUsSHLikspa8gopdzHskY","poleRadius":0.05,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","drawSunBeam":true,"reflectance":0.9,"moduleLength":20,"cy":0.0069200971199684285,"showLabel":false,"tiltAngle":0,"rotation":[0,0,0],"type":"Fresnel Reflector","parentId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","lx":2.5,"cz":0.5000000074512201,"selected":false,"lz":0.1},{"rotation":[0,0,0],"receiverId":"jbxC2ET67y7TWpMwnYUQpG","reflectance":0.9,"type":"Fresnel Reflector","cy":0.006920093147829267,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","lz":0.1,"lx":2.5,"relativeAzimuth":0,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","drawSunBeam":true,"tiltAngle":0,"poleHeight":0.2,"normal":[0,0,1],"selected":false,"moduleLength":20,"cx":-0.12171447221884638,"showLabel":false,"id":"rTyFuBNMkgb6TQ1G9Eh8gm","poleRadius":0.05,"cz":0.5000000074512556,"ly":420},{"poleRadius":0.05,"normal":[0,0,1],"showLabel":false,"cz":0.5000000074512911,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"type":"Fresnel Reflector","selected":false,"rotation":[0,0,0],"tiltAngle":0,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","drawSunBeam":true,"id":"j5bFm4KL8wLSLUYpWvdxLo","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","ly":420,"cx":-0.15022361164794779,"lz":0.1,"cy":0.006920089175690097,"relativeAzimuth":0,"poleHeight":0.2,"lx":2.5,"reflectance":0.9},{"cx":-0.1787327510770492,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","lx":2.5,"drawSunBeam":true,"reflectance":0.9,"tiltAngle":0,"lz":0.1,"cy":0.006920085203550927,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0],"cz":0.5000000074513267,"relativeAzimuth":0,"showLabel":false,"poleRadius":0.05,"selected":false,"type":"Fresnel Reflector","normal":[0,0,1],"id":"4yDr3h7mFtSP1gWovYHUdL","poleHeight":0.2,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","ly":420,"moduleLength":20},{"cy":0.006920081231411757,"id":"cdAqNd7wifCFLgGsKrvuwz","moduleLength":20,"drawSunBeam":true,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","normal":[0,0,1],"poleHeight":0.2,"poleRadius":0.05,"relativeAzimuth":0,"tiltAngle":0,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","lx":2.5,"rotation":[0,0,0],"parentId":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"cz":0.5000000074513622,"lz":0.1,"type":"Fresnel Reflector","showLabel":false,"cx":-0.2072418905061506,"reflectance":0.9,"ly":420},{"rotation":[0,0,0],"lz":0.1,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074513977,"moduleLength":20,"reflectance":0.9,"relativeAzimuth":0,"selected":false,"tiltAngle":0,"ly":420,"poleRadius":0.05,"showLabel":false,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","drawSunBeam":true,"poleHeight":0.2,"type":"Fresnel Reflector","cx":-0.23575102993525202,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","normal":[0,0,1],"lx":2.5,"id":"ptAVmbmDJoFnE5rNDPcxp1","cy":0.006920077259272587},{"cx":-0.26426016936435354,"reflectance":0.9,"normal":[0,0,1],"receiverId":"jbxC2ET67y7TWpMwnYUQpG","tiltAngle":0,"type":"Fresnel Reflector","parentId":"kxHYpYsUs7XEocuTYAj1Qu","drawSunBeam":true,"poleRadius":0.05,"poleHeight":0.2,"id":"9PPkqgZe4ooTSBcdbEhq2S","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","cz":0.5000000074514332,"rotation":[0,0,0],"moduleLength":20,"cy":0.006920073287133425,"relativeAzimuth":0,"lz":0.1,"showLabel":false,"selected":false,"lx":2.5,"ly":420},{"lx":2.5,"drawSunBeam":true,"selected":false,"cx":-0.29276930879345486,"poleRadius":0.05,"reflectance":0.9,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","cy":0.006920069314994255,"cz":0.5000000074514688,"relativeAzimuth":0,"lz":0.1,"ly":420,"id":"1bynbmDmRsgQT44LeFTqV2","type":"Fresnel Reflector","foundationId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0],"tiltAngle":0,"moduleLength":20,"poleHeight":0.2,"normal":[0,0,1],"showLabel":false,"parentId":"kxHYpYsUs7XEocuTYAj1Qu"},{"id":"biqZtWn8yKbuhMZsTFnzzy","poleRadius":0.05,"ly":420,"normal":[0,0,1],"moduleLength":20,"receiverId":"jbxC2ET67y7TWpMwnYUQpG","showLabel":false,"reflectance":0.9,"cy":0.006920065342855094,"poleHeight":0.2,"cx":-0.32127844822255636,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","selected":false,"type":"Fresnel Reflector","rotation":[0,0,0],"lz":0.1,"cz":0.5000000074515043,"lx":2.5,"tiltAngle":0,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","relativeAzimuth":0,"drawSunBeam":true},{"receiverId":"jbxC2ET67y7TWpMwnYUQpG","poleRadius":0.05,"cz":0.5000000074515398,"tiltAngle":0,"drawSunBeam":true,"cx":-0.3497875876516578,"poleHeight":0.2,"ly":420,"lx":2.5,"foundationId":"kxHYpYsUs7XEocuTYAj1Qu","moduleLength":20,"showLabel":false,"type":"Fresnel Reflector","reflectance":0.9,"selected":false,"id":"aimBT6csAE8smo4euxDmP5","lz":0.1,"normal":[0,0,1],"relativeAzimuth":0,"cy":0.006920061370715923,"parentId":"kxHYpYsUs7XEocuTYAj1Qu","rotation":[0,0,0]},{"solarReceiverTubePoleNumber":20,"type":"Foundation","solarReceiverPipePoleNumber":20,"normal":[0,0,1],"rotation":[0,0,0],"cx":-11.949347995041327,"selected":false,"parentId":"Ground","lz":0.3,"lx":19.21993989325236,"cy":-3.4906385434141205,"id":"jbxC2ET67y7TWpMwnYUQpG","ly":480,"solarStructure":1,"solarReceiver":1,"cz":0.15,"solarAbsorberPipe":{"absorberHeight":30,"apertureWidth":2}}],"view":{"cameraZoom":1.8506178062217107,"yearlyPvYieldPanelX":0,"mapZoom":17,"dailyFresnelReflectorYieldPanelX":-19,"dailyParabolicTroughYieldPanelX":0,"dailyLightSensorPanelX":0,"yearlyParabolicDishYieldPanelX":0,"showDailyFresnelReflectorYieldPanel":false,"enableRotate":true,"panCenter2D":[-6.944992442475207,210.55314744205262,0.00021056250655402935],"showStickyNotePanel":false,"groundColor":"#16cda5","showSunAngles":false,"mapWeatherStations":false,"dailyParabolicTroughYieldPanelY":0,"showDailyParabolicTroughYieldPanel":false,"yearlyLightSensorPanelY":0,"weatherPanelX":0,"yearlyFresnelReflectorYieldPanelY":14,"ambientLightIntensity":0.1,"dailyParabolicDishYieldPanelY":0,"dailyFresnelReflectorYieldPanelY":157,"showWeatherPanel":false,"theme":"Desert","showSolarPanelVisibilityResultsPanel":false,"yearlyLightSensorPanelX":0,"mapPanelX":0,"showYearlyParabolicTroughYieldPanel":false,"yearlyParabolicDishYieldPanelY":0,"heliodonPanelY":0,"dailyParabolicDishYieldPanelX":0,"mapType":"hybrid","cameraPosition":[-11.739626637843958,-271.93399896309415,13.091291354471094],"showDesignInfoPanel":true,"autoRotate":false,"panCenter":[-7.09913291540988,-65.13626844138287,2.897505917600467],"yearlyFresnelReflectorYieldPanelX":-1274,"stickyNotePanelX":0,"visibilityResultsPanelX":0,"showYearlyLightSensorPanel":false,"mapTilt":0,"dailyPvYieldPanelY":0,"dailyLightSensorPanelY":0,"solarRadiationHeatMapMaxValue":5,"heliodonPanelX":0,"weatherPanelY":0,"showYearlyParabolicDishYieldPanel":false,"yearlyParabolicTroughYieldPanelY":0,"dailyPvYieldPanelX":0,"stickyNotePanelY":0,"showDailyParabolicDishYieldPanel":false,"showDailyLightSensorPanel":false,"shadowEnabled":true,"heliodon":false,"yearlyParabolicTroughYieldPanelX":0,"yearlyPvYieldPanelY":0,"showSiteInfoPanel":true,"cameraPosition2D":[-6.944992442475207,210.55312744116364,20.00021056248858],"showHeliodonPanel":false,"showYearlyPvYieldPanel":false,"axes":true,"showMapPanel":false,"visibilityResultsPanelY":0,"groundImage":true,"orthographic":false,"showInstructionPanel":true,"showDailyPvYieldPanel":false,"mapPanelY":0,"showYearlyFresnelReflectorYieldPanel":false},"notes":[]}')},518:function(e){e.exports=JSON.parse('{"docid":"hAq2dzLGp1A3Vt7sTTtJuZ","time":"02/03/2023 10:55 am","timestamp":1675439758247,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"3/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Exact","daysPerYear":4},"elements":[{"cy":0.0145505850910366,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground"},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":-0.0005841111979264266,"cy":-0.00026543983321941996,"cz":0.5000000074505806,"lx":5.952,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":3,"showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7DsYGoVdCY8aoR5rFbLhk4","selected":false,"label":"Angle","dailyYield":8.732880750124766,"yearlyYield":102.12421657496768},{"type":"Human","name":"Jack","cx":5.511511655556145,"cy":-3.5932139876710405,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"ahAnqHX5Nd7eDufkMtRUNs","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-67,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":66,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[9.289940609671005,-7.003850253956084,4.906951597024065],"panCenter":[0.4252296602758445,0.31861282138619734,0.10164740914205853],"orthographic":false,"enableRotate":true,"cameraZoom":45.44146361606706,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,150],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"showEvolutionPanel":true,"solarRadiationHeatMapMaxValue":6,"evolutionPanelX":-13,"evolutionPanelY":8,"evolutionPanelRect":{"x":0,"y":0,"width":498,"height":340},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":279,"height":88}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"selectionMethod":1,"searchMethod":1,"populationSize":30,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Find the optimal tilt angle \\nfor a single row of solar panels"]}')},519:function(e){e.exports=JSON.parse('{"docid":"fuDyjFnfZyxqES42bpME47","time":"02/03/2023 11:00 am","timestamp":1675440031518,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":4,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"3/22/2022, 12:00:00 PM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Exact","daysPerYear":4},"elements":[{"cy":-0.04544941490896341,"normal":[0,0,1],"lz":0.1,"ly":13.545143032428694,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":-0.011003166716293603,"cz":0.05,"rotation":[0,0,0],"lx":18.837452107330996,"selected":false,"parentId":"Ground"},{"lz":0.046,"id":"p4rL1ADSA1RFVZR7Amc4tY","ly":1.968,"cz":0.5000000074505806,"type":"Solar Panel","poleRadius":0.05,"showLabel":true,"label":"Row1","tiltAngle":0,"poleSpacing":2,"rotation":[0,0,0],"lx":5.952,"selected":false,"orientation":"Portrait","cx":0.0013098263256093668,"relativeAzimuth":0,"cy":-0.3333857365792726,"poleHeight":1.2,"drawSunBeam":false,"normal":[0,0,1],"trackerType":"None","parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","pvModelName":"CS6X-355P-FG","dailyYield":3.8430599051077174,"yearlyYield":87.98498978626,"labelSize":0.5,"labelHeight":1},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0013098263256093668,"cy":-0.1107906814186029,"cz":0.5000000074505806,"lx":5.952,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"qBcTvR11rnyGD32ejzSTUo","selected":false,"dailyYield":3.8430599051077174,"label":"Row2","yearlyYield":88.73443715558736,"labelHeight":1,"labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0012559240227253744,"cy":0.11410898246472086,"cz":0.5000000074505806,"lx":5.952,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"7DsYGoVdCY8aoR5rFbLhk4","selected":false,"label":"Row3","dailyYield":3.8430599051077174,"yearlyYield":102.12190598796778,"labelHeight":1,"labelSize":0.5},{"type":"Solar Panel","pvModelName":"CS6X-355P-FG","cx":0.0019112216145152992,"cy":0.33130578714934544,"cz":0.5000000074505806,"lx":5.952,"ly":1.968,"lz":0.046,"trackerType":"None","tiltAngle":0,"relativeAzimuth":0,"orientation":"Portrait","poleRadius":0.05,"poleHeight":1.2,"poleSpacing":2,"showLabel":true,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","id":"kKhGuKqmYo8sGFHt2CpVtE","selected":false,"label":"Row4","dailyYield":3.8430599051077174,"yearlyYield":87.95400017679898,"labelHeight":1,"labelSize":0.5},{"type":"Human","name":"Jack","cx":5.511511655556145,"cy":-3.5932139876710405,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"ahAnqHX5Nd7eDufkMtRUNs","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-1274,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":false,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":3,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[14.323665130331175,-8.426692001879298,3.5655944521137717],"panCenter":[1.684900046296442,2.3084248015304936,0.043382642438776854],"orthographic":false,"enableRotate":true,"cameraZoom":33.40365140230188,"showInstructionPanel":false,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"showEvolutionPanel":true,"solarRadiationHeatMapMaxValue":6,"evolutionPanelX":3,"evolutionPanelY":4,"evolutionPanelRect":{"x":0,"y":0,"width":565,"height":359},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":322,"height":91}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":2,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":20,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":2,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":20,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Find optimal tilt angles \\nfor multiple rows of solar panels"]}')},520:function(e){e.exports=JSON.parse('{"docid":"oAxppoDRPqDySUVvwUxAX9","time":"02/08/2023 12:26 pm","timestamp":1675877184356,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":1,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"3/22/2022, 12:00:00\u202fPM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Approximate","daysPerYear":4},"elements":[{"cy":0.01692723373211437,"normal":[0,0,1],"lz":0.1,"ly":28.838141151400354,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":0.11281543499276836,"cz":0.05,"rotation":[0,0,0],"lx":27.003966694548705,"selected":false,"parentId":"Ground","textureType":"Foundation Texture #2","locked":true},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#68ccca","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.2777369741577272,"y":-0.4507918846693325},{"x":-0.46289495692954535,"y":-0.3294248387968199},{"x":-0.46289495692954535,"y":0.3294248387968199},{"x":-0.2592211758805454,"y":0.46813003407969145},{"x":0.44437915865236355,"y":0.46813003407969145},{"x":0.44437915865236355,"y":-0.4507918846693325},{"x":-0.018515798277181816,"y":-0.4507918846693325},{"x":-0.018515798277181816,"y":-0.20805779292430732},{"x":0.11109478966309089,"y":-0.20805779292430732},{"x":0.11109478966309089,"y":0},{"x":-0.1296105879402727,"y":0},{"x":-0.1296105879402727,"y":-0.4507918846693325}],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"filled":true,"selectedIndex":6,"id":"u4ViXg39ZL8tds2AfD2o6U","textureType":"No Polygon Texture","locked":true},{"type":"Human","name":"Jack","cx":-12.151272035486986,"cy":-13.311260979474763,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"rrK38LJKu6CVWVjf2zV1b2","selected":false,"ly":0.6}],"view":{"yearlyPvYieldPanelX":-1278,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":47,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[13.612389493613348,-45.59589484534075,13.195602276977187],"panCenter":[14.4714120590319,-3.416758286517111,0],"orthographic":false,"enableRotate":true,"cameraZoom":15.475618750000002,"showInstructionPanel":false,"cameraPosition2D":[4.762164053203386,1.2445149902232375,150],"panCenter2D":[4.762164053203386,1.244664996889924,0.0000020723025878093974],"showEvolutionPanel":true,"solarRadiationHeatMapMaxValue":3.5,"evolutionPanelX":-3,"evolutionPanelY":5,"showEconomicsPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":520,"height":318},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":290,"height":86},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"solarPanelShininess":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":2,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"notes":["Generative design of a solar farm \\nin an arbitrary shape"]}')},521:function(e){e.exports=JSON.parse('{"docid":"wdLWJpkLqaNK26sDZ4kU9P","time":"02/08/2023 12:31 pm","timestamp":1675877477724,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.2844063,"pvGridCellSize":0.5,"timesPerHour":1,"longitude":-71.3488548,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"Natick, MA","date":"3/22/2022, 12:00:00\u202fPM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"discretization":"Approximate","daysPerYear":4},"elements":[{"cy":0.01692723373211437,"normal":[0,0,1],"lz":0.1,"ly":28.838141151400354,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":0.11281543499276836,"cz":0.05,"rotation":[0,0,0],"lx":27.003966694548705,"selected":false,"parentId":"Ground","textureType":"Foundation Texture #2","locked":true},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#68ccca","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.2777369741577272,"y":-0.4507918846693325},{"x":-0.46289495692954535,"y":-0.3294248387968199},{"x":-0.46289495692954535,"y":0.3294248387968199},{"x":-0.2592211758805454,"y":0.46813003407969145},{"x":0.44437915865236355,"y":0.46813003407969145},{"x":0.44437915865236355,"y":-0.4507918846693325},{"x":-0.018515798277181816,"y":-0.4507918846693325},{"x":-0.018515798277181816,"y":-0.20805779292430732},{"x":0.11109478966309089,"y":-0.20805779292430732},{"x":0.11109478966309089,"y":0},{"x":-0.1296105879402727,"y":0},{"x":-0.1296105879402727,"y":-0.4507918846693325}],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"filled":true,"selectedIndex":6,"id":"u4ViXg39ZL8tds2AfD2o6U","textureType":"No Polygon Texture","locked":true},{"type":"Human","name":"Jack","cx":-12.151272035486986,"cy":-13.311260979474763,"cz":0.05000000074505806,"lx":0.6,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"of4fAMi2p9MKmo6JDUYnfX","id":"rrK38LJKu6CVWVjf2zV1b2","selected":false,"ly":0.6},{"type":"Cuboid","cx":-0.11397611677121855,"cy":-3.067571806666861,"cz":2,"lx":5.2532346498753135,"ly":4.048511424070542,"lz":4,"color":"#808080","faceColors":["#808080","#808080","#808080","#808080","#808080","#808080"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"ky59NZpXJyTcUSib43iVfq","locked":true}],"view":{"yearlyPvYieldPanelX":-1278,"autoRotate":false,"mapZoom":16,"axes":true,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-1280,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":47,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-548,"dailyPvYieldPanelY":11,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-14,"groundColor":"#16a5a5","groundPanelY":0,"groundImage":false,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"roadmap","cameraPosition":[14.904063706626683,-45.61046168179694,13.166442421440415],"panCenter":[14.528251370304552,-3.4151425205700146,0],"orthographic":false,"enableRotate":true,"cameraZoom":17.147500000000004,"showInstructionPanel":false,"cameraPosition2D":[4.762164053203386,1.2445149902246018,150],"panCenter2D":[4.762164053203386,1.244664996889924,0.0000020723025878093974],"showEvolutionPanel":true,"solarRadiationHeatMapMaxValue":3.5,"evolutionPanelX":-3,"evolutionPanelY":5,"showEconomicsPanel":false,"evolutionPanelRect":{"x":0,"y":0,"width":520,"height":318},"showStickyNotePanel":true,"stickyNotePanelRect":{"x":0,"y":0,"width":344,"height":83},"yearlyPvYieldPanelRect":{"x":0,"y":0,"width":600,"height":400},"solarPanelShininess":0},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":3,"pvModelName":"CS6X-355P-FG","rowAxis":"Left-Right","orientation":"Landscape","margin":0},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"notes":["Generative design of a solar farm \\nin an arbitrary shape with a nearby structure"]}')},522:function(e){e.exports=JSON.parse('{"docid":"njsXMFnx8AbzYmZZZSFsP4","time":"02/08/2023 12:40 pm","timestamp":1675878006595,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"latitude":42.58194950125034,"pvGridCellSize":1.5,"timesPerHour":1,"longitude":-71.76008801772156,"ground":{"albedo":0.3,"thermalDiffusivity":0.05,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"address":"275 Pleasant St, Lunenburg, MA 01462, USA","date":"10/15/2021, 12:00:00\u202fPM","name":"default","orthographic":false,"cameraZoom":35.16173831821251,"noAnimationForSolarPanelSimulation":true,"noAnimationForHeatmapSimulation":true,"daysPerYear":4},"elements":[{"cy":-2.2367402479910083,"normal":[0,0,1],"lz":0.1,"ly":269.55803876661787,"id":"of4fAMi2p9MKmo6JDUYnfX","type":"Foundation","cx":2.681119516922017,"cz":0.05,"rotation":[0,0,0],"lx":132.51400330167655,"selected":false,"parentId":"Ground"},{"type":"Polygon","cx":0,"cy":0,"cz":0,"lx":0.4,"ly":0.4,"lz":0.4,"color":"#999999","normal":[0,0,1],"rotation":[0,0,0],"vertices":[{"x":-0.4199120685653116,"y":0.07319581727959533},{"x":-0.42368525470067964,"y":0.35513880940011766},{"x":-0.31048967063963856,"y":0.35699369750617377},{"x":-0.19729408657859754,"y":0.4701418719755939},{"x":0.015092744541472141,"y":0.47114157893824127},{"x":0.19997886517450586,"y":0.3116212018174194},{"x":0.23016435425745013,"y":0.06306619560590632},{"x":0.09432965338420088,"y":0.061211307499850244},{"x":0.10187602565493695,"y":0.014839104848448545},{"x":0.19997886517450586,"y":-0.033387985909009224},{"x":0.33581356604775514,"y":-0.03709776212112136},{"x":0.38109179967217155,"y":-0.27637832780235416},{"x":0.45655552237953223,"y":-0.27637832780235416},{"x":0.45655552237953223,"y":-0.408075383332335},{"x":0.29430851855870677,"y":-0.40993027143839106},{"x":0.29430851855870677,"y":-0.4451731454534563},{"x":-0.06414416430125659,"y":-0.4451731454534563},{"x":-0.06791735043662463,"y":-0.4767062432564095},{"x":-0.32449400764165104,"y":-0.4767062432564095},{"x":-0.25280347106965834,"y":-0.3190407542416437},{"x":-0.25657665720502637,"y":-0.16508504143899005},{"x":-0.16602018995619355,"y":-0.16508504143899005},{"x":-0.1633354113602852,"y":-0.09559900037150687},{"x":-0.3029432983689025,"y":-0.0937441122654508},{"x":-0.3406751597225829,"y":0.01940406220396935}],"parentId":"of4fAMi2p9MKmo6JDUYnfX","foundationId":"of4fAMi2p9MKmo6JDUYnfX","selected":false,"filled":true,"selectedIndex":6,"id":"1mf9SJGR5RjzYzk7AYxvf2","lineColor":"#f44e3b","opacity":0.1},{"type":"Cuboid","cx":-27.296734459596976,"cy":-41.20962464677464,"cz":1.25,"lx":5.828598670924802,"ly":8.305908945480084,"lz":2.5,"color":"gray","faceColors":["gray","gray","gray","gray","gray","gray"],"textureTypes":["No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture","No Facade Texture"],"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","selected":false,"id":"55Wp5i8LU9QiCSoSTSkhSV"}],"view":{"yearlyPvYieldPanelX":-1249,"autoRotate":false,"mapZoom":17,"axes":false,"theme":"Default","showSiteInfoPanel":true,"showDesignInfoPanel":true,"showWeatherPanel":false,"groundPanelX":0,"dailyPvYieldPanelX":-3,"dailyLightSensorPanelY":232,"showDailyLightSensorPanel":false,"mapTilt":0,"yearlyPvYieldPanelY":65,"yearlyLightSensorPanelX":0,"showGroundPanel":false,"showHeliodonPanel":false,"heliodon":false,"weatherPanelY":0,"heliodonPanelX":-1175,"dailyPvYieldPanelY":8,"mapWeatherStations":false,"yearlyLightSensorPanelY":0,"showPvDailyYieldPanel":true,"showYearlyPvYieldPanel":false,"dailyLightSensorPanelX":-240,"weatherPanelX":0,"heliodonPanelY":-33,"groundColor":"#68ccca","groundPanelY":0,"groundImage":true,"showDailyPvYieldPanel":false,"shadowEnabled":true,"showYearlyLightSensorPanel":false,"mapType":"hybrid","cameraPosition":[145.94862814334945,-106.4764934595526,163.4608323959844],"panCenter":[85.94985190690319,3.43019898834619,0],"orthographic":false,"enableRotate":true,"cameraZoom":9.75349958231059,"showInstructionPanel":true,"cameraPosition2D":[2.68477267877577,-0.19810500302601344,47.99999980190954],"panCenter2D":[2.68477267877577,-0.19805700089319547,5.501827899659354e-7],"showMapPanel":false,"showEvolutionPanel":true,"showEconomicsPanel":false,"evolutionPanelX":null,"evolutionPanelY":null,"evolutionPanelRect":{"x":0,"y":0,"width":640,"height":400}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Left-Right","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":6,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":5,"minimumTiltAngle":0,"maximumTiltAngle":1.5707963267948966},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"objectiveFunctionType":6,"selectionMethod":1,"searchMethod":1,"populationSize":10,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"},"particleSwarmOptimizationParams":{"objectiveFunctionType":6,"searchMethod":1,"vmax":0.01,"swarmSize":20,"maximumSteps":10,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1,"problem":"Solar Panel Array"}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.3},"notes":[]}')},523:function(e){e.exports=JSON.parse('{"docid":"qzzjGfFHSUFSwo9GQJs9Mb","time":"02/04/2023 01:27 pm","timestamp":1675535240483,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"S","showLabel":true,"labelHeight":8.5,"labelSize":0.8},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.1133234476758727,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#808080","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#ffffff","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#808080","width":0.5},"selected":false},{"type":"Wall","cx":0.10882625565358328,"cy":6.456179282384522,"cz":2.2408122612280286,"lx":15.961175461262725,"ly":0.2,"lz":5.192316659049364,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[8.089413986284946,6.456179282384521,0],"rightPoint":[-7.871761474977779,6.4561792823845225,0],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":5.192316659049364,"rightRoofHeight":5.192316659049364,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.192316659049364,"rightTopPartialHeight":5.192316659049364},{"type":"Wall","cx":8.089413986284946,"cy":-0.15071949165393628,"cz":2.2301039869226305,"lx":13.213797548076919,"ly":0.2,"lz":5.192316659049364,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[8.089413986284942,-6.757618265692395,0],"rightPoint":[8.089413986284947,6.4561792823845225,0],"relativeAngle":1.5707963267948961,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":5.192316659049364,"rightRoofHeight":5.192316659049364,"centerRoofHeight":[0,8.657123351013743],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.192316659049364,"rightTopPartialHeight":5.192316659049364},{"type":"Wall","cx":-7.871761474977779,"cy":-0.15071949165393628,"cz":2.228839888904333,"lx":13.213797548076919,"ly":0.2,"lz":5.192316659049364,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-7.871761474977778,6.4561792823845225,0],"rightPoint":[-7.871761474977779,-6.757618265692395,0],"relativeAngle":-1.5707963267948968,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":5.192316659049364,"rightRoofHeight":5.192316659049364,"centerRoofHeight":[0,8.657123351013743],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.192316659049364,"rightTopPartialHeight":5.192316659049364},{"type":"Wall","cx":0.10882625565358417,"cy":-6.757618265692395,"cz":2.268765007024547,"lx":15.961175461262727,"ly":0.2,"lz":5.192316659049364,"rValue":2.641654309594841,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-7.871761474977779,-6.757618265692395,0],"rightPoint":[8.089413986284947,-6.757618265692395,0],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"#ffffff","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":5.192316659049364,"rightRoofHeight":5.192316659049364,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":5.192316659049364,"rightTopPartialHeight":5.192316659049364},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#808080","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#808080","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.1133234476758727,"ceiling":false},{"type":"Foundation","cx":-13.996646874999989,"cy":0.06415311833261989,"cz":0.05,"lx":21.734456249999983,"ly":19.033724999999986,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"labelHeight":10,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"L","showLabel":true},{"type":"Door","cx":0,"cy":0,"cz":-0.15370387000018937,"lx":0.12530405450738497,"ly":0,"lz":0.6925922599996213,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"tciKLNsRDLeHZNmeb31ucG"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"gLG7BoTZHSewPba87UV4Za"}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-23.305173327292444,-30.91478882666535,7.039269079297642],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[5.635542831447647,8.464690688330043,3.125544256683276],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-2,"y":-2,"width":200,"height":87}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of house size\\n\u623f\u5b50\u5927\u5c0f\u7684\u5f71\u97ff"]}')},524:function(e){e.exports=JSON.parse('{"docid":"6D1PNtCu8dQATzUSZDdPKf","time":"05/22/2023 10:33 am","timestamp":1684766015061,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"SE","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0.7853981633974483],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.1133234476758727,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#cccccc","tint":"#009ce0","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#009ce0","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#009ce0","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#ffffff","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#009ce0","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.1133234476758727,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,-0.7853981633974483],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":3},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"SW","showLabel":true,"color":"#808080"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"3wrKU52naWH6NwzeW6vGwm"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"9C29UNsLxSuEbxTnestrd8"}],"sceneRadius":28,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":true,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[3.1651364435149425,-31.942224578560552,3.8771204506826087],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[10.838986266637484,1.4239280652904787,3.8771204506826087],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"weatherPanelRect":{"x":0,"y":0,"width":500,"height":500},"stickyNotePanelRect":{"x":-5,"y":0,"width":269,"height":92}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of house orientation\\n\u623f\u5c4b\u671d\u5411\u7684\u5f71\u97ff"]}')},525:function(e){e.exports=JSON.parse('{"docid":"gRqNfJd8beo5ietdqmmTM2","time":"05/22/2023 10:35 am","timestamp":1684766140952,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"\ud83d\udc4e","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"#cccccc","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":3.5222057461264544,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":3.5222057461264544,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":3.5222057461264544,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":3.5222057461264544,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"#cccccc","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"#009ce0","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":3.5222057461264544,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"\ud83d\udc4d","showLabel":true,"color":"#808080"},{"type":"Door","cx":-0.020833333333333332,"cy":0,"cz":-0.125,"lx":0.125,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"vNVpqbsNF7tYjDx7E7kMLR"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"xpWZ6k69MtomLyhCbBynNa"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-18.39191326488849,-28.88082266775545,4.500680104409036],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[9.06975830834568,5.812472797471483,4.500680104409029],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-2,"y":-1,"width":243,"height":90}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of insulation\\n\u623f\u5c4b\u9694\u71b1\u6027\u7684\u5f71\u97ff"]}')},526:function(e){e.exports=JSON.parse('{"docid":"2b6To2exbyQMzsnyC5zQ4h","time":"05/22/2023 10:37 am","timestamp":1684766230048,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":9.345387499999994,"cy":0.10743784147400248,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"B","showLabel":true,"labelHeight":6.5,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Foundation","cx":-9.302518749999996,"cy":0.06403695851719249,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"hvacSystem":{"thermostatSetpoint":20},"label":"A","labelHeight":6.5,"showLabel":true,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"No Roof Texture","color":"#cccccc","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"wqKadTHiLAV8a3mAejBhVp","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"2bkzpWVFhyLy2B93eQe6LC"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2qrmNqnNqMrnaf9yVKwntp","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"hQgFUEAKKCuxnfg7DfAtUD"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3F32WEzwgnaEKesshW1B9d","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"fPNsZAwsuY65jcgPGD7JxY"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"pMhyfs2o4fEnaE7UjB8PVu"}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-12.301199186500163,-22.5861615760567,3.4543056235043506],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[6.0653741729769015,2.261846946588245,3.4543056235043506],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-3,"y":-4,"width":278,"height":87}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of roof color \\n\u5c4b\u9802\u9854\u8272\u7684\u5f71\u97ff"]}')},527:function(e){e.exports=JSON.parse('{"docid":"gyoLQ5RfiYexA7q1ehdofm","time":"05/22/2023 10:45 am","timestamp":1684766701791,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jacqueline","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.43,"lz":1.78,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":9.345387499999994,"cy":0.10743784147400248,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"B","showLabel":true,"labelHeight":7,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"color":"#808080","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Foundation","cx":-9.302518749999996,"cy":0.06403695851719249,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"hvacSystem":{"thermostatSetpoint":20},"label":"A","labelHeight":7,"showLabel":true,"labelSize":0.8,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.1,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.8,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"No Roof Texture","color":"#808080","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"wqKadTHiLAV8a3mAejBhVp","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"2bkzpWVFhyLy2B93eQe6LC"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2qrmNqnNqMrnaf9yVKwntp","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"hQgFUEAKKCuxnfg7DfAtUD"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3F32WEzwgnaEKesshW1B9d","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"uPY2H1vbzdvDNNQKsQzM2R"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"qj1uppbZ68e6DUdrkgfzdA"}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-11.365944827281202,-27.884282052116806,4.909032289220344],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[8.512452835588759,2.1768673048896354,4.909032289220344],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-1,"y":0,"width":284,"height":88}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of eaves overhang\\n\u5c4b\u7c37\u5ef6\u7533\u9577\u5ea6\u7684\u5f71\u97ff"]}')},528:function(e){e.exports=JSON.parse('{"docid":"iJM88uQ7kfN8BTPGSVD3jV","time":"05/22/2023 10:47 am","timestamp":1684766839823,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"A","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#666666"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.8177645969011635,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#009ce0","opacity":0.65,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#009ce0","opacity":0.65,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#009ce0","opacity":0.35,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#009ce0","opacity":0.35,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.8177645969011635,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"B","showLabel":true,"color":"#666666"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"rRMpmcwQNzvRYmkTWpEhiw"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"jyiupxyxWNzhU4yRrTPHU1"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-16.77287507225449,-24.274336266873924,5.320155603217975],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[10.498836843888402,4.793969537181787,2.890808814152251],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-5,"y":-1,"width":421,"height":65}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of solar heat gain coefficients (SHGC) of windows"]}')},529:function(e){e.exports=JSON.parse('{"docid":"6nLDNj8vM4d4LSQKVT9SXo","time":"05/22/2023 10:49 am","timestamp":1684766960725,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"20\u2103","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#999999"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.641654309594841,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.641654309594841,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":25},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"25\u2103","showLabel":true,"color":"#999999"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"1TYVF9JTXJtxWba41xgetC"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"afEtgeFVMoeDZdyxJU1psm"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-21.828926822512322,-33.873528421784314,4.788669771967834],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[11.438181824994281,-4.700464851624883,4.788669771967831],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-1,"y":0,"width":277,"height":63}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of thermostat setpoint"]}')},530:function(e){e.exports=JSON.parse('{"docid":"uQrNcHUUR7GCUfUbuFogjq","time":"02/04/2023 01:39 pm","timestamp":1675535990373,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"7/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jamelia","cx":-4.3683434199366005,"cy":-14.38651482103353,"cz":0,"lx":0.65,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.65},{"type":"Foundation","cx":-13.228758971915111,"cy":0.10702186833261693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":5},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"A","showLabel":true,"labelHeight":9,"labelSize":0.8,"color":"#666666"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"6YiUmdowinEDGE2jXwEcty","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":6.0818182264215075,"cy":-0.11406220740522244,"cz":2.2301039869226305,"lx":9.999999999999998,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.0818182264215075,-5.1140622074052215,0.1],"rightPoint":[6.081818226421507,4.885937792594777,0.1],"relativeAngle":1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"6YiUmdowinEDGE2jXwEcty","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.046374836825025],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"6YiUmdowinEDGE2jXwEcty","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.046374836825025],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"6YiUmdowinEDGE2jXwEcty","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.375,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.6,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H","uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333337,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Door","cx":0,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #6","color":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"gLG7BoTZHSewPba87UV4Za","uValue":1.135652},{"type":"Window","cx":-0.16666666666666666,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"vLVbxQBoEhW71qxT8m1C96","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.16666666666666666,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"26QzSovJr2WkHKUiErU1ER","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"dZ11kEn33ciPLMqva4wYhW","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.16666666666666666,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"oEPM7Qer3dagcgAZgTd83X","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.16666666666666666,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nJe6q1fYHpVb61zzuXMiiq","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"atbMWVsRWU1gP4pFd8UmqE","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4Xcrc4Qc969xumwjdaTpEv","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9r471ngxUS5HfZPQXAbspz","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.30833333333333335,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"nuMh9HUjsyggQDkK4K4z9r","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5TzjYq921EthYvgGjhkd95","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"i86kfMa5D3a95EHYr74Cik","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.30833333333333335,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fes2JVoykppGjYbeBaK1t6","parentId":"wugyuZMsPdNUQJ1PdoxEGD","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.35833333333333334,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hRvyn5tFnyKbZGmExP8ZBN","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.35833333333333334,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fHUqZ9dwKm5QsdBz4rQhkH","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"hVPD3ovUCMHizYi7hHMynX","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"92r9RVUcqNvqTSSqzXVWe8","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"88LWhfUeptGcLDGkhffTYu","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"jJyncTarX8t32trtWmHYJ8","parentId":"xi9Zz1pobWAhkAdtkZFZBZ","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"tbGfuWPSK8hFimiixh3gnq","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":2.0463748368250254,"thickness":0.2,"rValue":2.8177645969011635,"roofType":"Gable","roofStructure":"Default","wallsId":["s4gNJy8vD8tdJGQTaw6DQj"],"textureType":"Roof Texture Default","color":"#333333","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"6YiUmdowinEDGE2jXwEcty","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"volumetricHeatCapacity":0.2,"ceiling":false},{"type":"Window","cx":0.375,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"uPf27SYtJ3oEqK8uLnnYC4","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0,"cy":0.3,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"41qtH3jyhy6TAYrTpcQ22r","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"c15PoZLmaL9G5281NC3Bky","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.3,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"e8J6XhFvtnTfamsfk7MdQo","parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Door","cx":-4.625929269271485e-18,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1.135652,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"s4gNJy8vD8tdJGQTaw6DQj","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1Z9wCTEw4evBfgBWBx239G"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["iUbSPuuaLHTe92zf2RbbzH"],"rightJoints":["b2z6LAysW1ypLiK23VhMbQ"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"t5aKJuTWqFhNtovV6QcVDQ","parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"5ujWfCT94pVpZ6u8JCHaJM","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.375,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"6XAyQ1Y5un66zE9fws5TBK","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"5Fr8WLjKhMXxtEUSo3U3cz","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bFA3kdwdbv23kgNuvqrBLu","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2peuf57tgQn8h8KDddojmU","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pRLjDR4NSZstZSY2CyZhG6","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Door","cx":-4.625929269271485e-18,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"color":"#ffffff","textureType":"Door Texture #1","filled":true,"doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"fRfZQadrT6sohNBtnZQnjD","parentId":"t5aKJuTWqFhNtovV6QcVDQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","selected":false,"uValue":1.135652},{"type":"Wall","cx":6.0818182264215075,"cy":-0.11406220740522244,"cz":2.2301039869226305,"lx":9.999999999999998,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["t1vsyYVv6oASAroVbtBJh8"],"rightJoints":["t5aKJuTWqFhNtovV6QcVDQ"],"leftPoint":[6.0818182264215075,-5.1140622074052215,0.1],"rightPoint":[6.081818226421507,4.885937792594777,0.1],"relativeAngle":1.5707963267948968,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"iUbSPuuaLHTe92zf2RbbzH","parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"5ujWfCT94pVpZ6u8JCHaJM","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.046374836825025],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.35833333333333334,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"twjCCVvcJUWUtdX8G6XaEz","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.35833333333333334,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"fJ9ef8TPTGwzuoD998nCxH","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"75FMXmZGkavm2QX1w7Rd2n","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"digHAxUKfqtzZ8Hf1JBrDE","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"pUavBYiArb55RaZvTqEZ7s","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bMNcD6i8MyPWUstcj4RLAn","parentId":"iUbSPuuaLHTe92zf2RbbzH","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["t5aKJuTWqFhNtovV6QcVDQ"],"rightJoints":["t1vsyYVv6oASAroVbtBJh8"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"b2z6LAysW1ypLiK23VhMbQ","parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"5ujWfCT94pVpZ6u8JCHaJM","leftRoofHeight":6,"rightRoofHeight":6,"centerRoofHeight":[0,8.046374836825025],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":0.3416666666666667,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"7af2qg5wEnfy5x3dVwJDa9","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8pzbRVzHdUJ21tt86EiuYq","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"9Rqpx9csAi6gzvsKmMevD7","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.3416666666666667,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"sRtEGAvWiVdZjNF7cbimyK","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.008333333333333337,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"cYa823h2xpVhLafAMFJLLp","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.30833333333333335,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"eCrrhs7nC8ZLgf3kozqASz","parentId":"b2z6LAysW1ypLiK23VhMbQ","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":6,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.25,"fill":"Full","leftJoints":["b2z6LAysW1ypLiK23VhMbQ"],"rightJoints":["iUbSPuuaLHTe92zf2RbbzH"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"Wall Texture Default","color":"#ffffe0","normal":[0,0,1],"rotation":[0,0,0],"id":"t1vsyYVv6oASAroVbtBJh8","parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"5ujWfCT94pVpZ6u8JCHaJM","leftRoofHeight":6,"rightRoofHeight":6,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":6,"rightTopPartialHeight":6},{"type":"Window","cx":-0.375,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"xoY2sZ3zu3yaqNq4svSL83","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333337,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"shVdFBTLP3GUxKo2h9rQPd","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Door","cx":0,"cy":0,"cz":-0.2916666666666667,"lx":0.16666666666666666,"ly":0,"lz":0.4166666666666667,"color":"#ffffff","textureType":"Door Texture #6","filled":true,"doorType":"Default","archHeight":1,"normal":[0,1,0],"rotation":[0,0,0],"id":"miHyMDSBYSuj5NSFDxZf2d","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","selected":false,"uValue":1.135652},{"type":"Window","cx":-0.16666666666666666,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"izobe4AEhigpZU6WX5N4k5","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.16666666666666666,"cy":0.1,"cz":0.2916666666666667,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"o5YP1zidq8SX6PcUxxaAjL","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.375,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"4GhJEysBwSqkSWJpqyaJ48","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":-0.16666666666666666,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"aAGJp2q5U3FuWTdYaSVjDf","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.16666666666666666,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"twPsG5mQU2qWwH6PZR3MFv","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"type":"Window","cx":0.375,"cy":0.1,"cz":-0.2083333333333333,"lx":0.08333333333333333,"ly":0.2,"lz":0.24999999999999992,"mullion":true,"mullionWidth":0.06,"mullionSpacing":0.6,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"1Gwnr8y8qnWjyqse356de2","parentId":"t1vsyYVv6oASAroVbtBJh8","foundationId":"9Lzok59gfWu44BJHP6NeDv","tint":"#73D8FF","opacity":0.6,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false,"uValue":1.7034779999999998},{"id":"5ujWfCT94pVpZ6u8JCHaJM","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":2.0463748368250254,"color":"#333333","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"9Lzok59gfWu44BJHP6NeDv","foundationId":"9Lzok59gfWu44BJHP6NeDv","roofType":"Gable","roofStructure":"Default","textureType":"Roof Texture Default","thickness":0.2,"wallsId":["t5aKJuTWqFhNtovV6QcVDQ"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.8177645969011635,"volumetricHeatCapacity":0.2,"ceiling":false},{"type":"Foundation","cx":13.117837499999993,"cy":-0.021318315185384407,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":5},"labelHeight":9,"labelSize":0.8,"showLabel":true,"id":"9Lzok59gfWu44BJHP6NeDv","selected":false,"label":"B","color":"#666666"},{"type":"Solar Panel","pvModelName":"SPR-X21-335-BLK","trackerType":"None","relativeAzimuth":0,"tiltAngle":0.5235987755982988,"orientation":"Landscape","drawSunBeam":true,"poleHeight":10,"poleRadius":0.05,"poleSpacing":3,"cx":0.017473997824250177,"cy":-0.1848238594563359,"cz":7.203451961471109,"lx":10.906,"ly":4.184,"lz":0.046,"showLabel":false,"normal":[-2.5496209749856465e-17,-0.3787787636615868,0.9254872490742375],"rotation":[0.38847637916043065,0,-2.220446049250313e-16],"color":"#fff","frameColor":"white","parentType":"Roof","parentId":"5ujWfCT94pVpZ6u8JCHaJM","foundationId":"9Lzok59gfWu44BJHP6NeDv","id":"m7muU5PcHHSqA6qooFMWMX","selected":false}],"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-21.205706148898816,-34.501280243521734,7.541149435690317],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[7.9613043217859705,4.9057140700953275,7.541149435690313],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":675,"height":408},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":-1091,"y":218,"width":775,"height":342},"stickyNotePanelRect":{"x":-3,"y":-2,"width":275,"height":63}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"notes":["Effect of rooftop solar panels"]}')},531:function(e){e.exports=JSON.parse('{"docid":"4VyiQ32UEi5Uhg2actsJ7k","time":"05/22/2023 10:52 am","timestamp":1684767120478,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"7/1/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":9.345387499999994,"cy":0.10743784147400248,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"Uninsulated floor","showLabel":true,"labelHeight":7,"labelSize":0.5,"color":"#808080","rValue":1.7611028730632272},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"color":"#808080","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Foundation","cx":-9.302518749999996,"cy":0.06403695851719249,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"id":"fbqvzYqiEy79jeL8wsadib","selected":false,"hvacSystem":{"thermostatSetpoint":20},"label":"Insulated floor","labelHeight":7,"showLabel":true,"labelSize":0.5,"color":"#808080","rValue":3.5222057461264544},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"leftJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"rightJoints":["2RETAxyRMzZBEQkBGms56R"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"giYTP9Qg6uJ3yfkS1RoDqG","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"leftJoints":["beHqET5NN8aNdsuBncMpY7"],"rightJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"pPpJHGJ2bGVqLdA1FpXi4V","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"leftJoints":["giYTP9Qg6uJ3yfkS1RoDqG"],"rightJoints":["beHqET5NN8aNdsuBncMpY7"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"2RETAxyRMzZBEQkBGms56R","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,5.99872672326696],"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"leftJoints":["2RETAxyRMzZBEQkBGms56R"],"rightJoints":["pPpJHGJ2bGVqLdA1FpXi4V"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"beHqET5NN8aNdsuBncMpY7","parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","selected":false,"roofId":"wqKadTHiLAV8a3mAejBhVp","wallStructure":"Default","structureSpacing":2,"structureWidth":0.1,"structureColor":"white","opacity":0.5,"fill":"Full","rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"leftRoofHeight":4,"rightRoofHeight":4,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":1.9987267232669597,"thickness":0.2,"roofType":"Gable","roofStructure":"Default","wallsId":["beHqET5NN8aNdsuBncMpY7"],"textureType":"No Roof Texture","color":"#808080","sideColor":"#ffffff","selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"fbqvzYqiEy79jeL8wsadib","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"wqKadTHiLAV8a3mAejBhVp","ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"2bkzpWVFhyLy2B93eQe6LC"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"2qrmNqnNqMrnaf9yVKwntp","parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"hQgFUEAKKCuxnfg7DfAtUD"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3F32WEzwgnaEKesshW1B9d","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"beHqET5NN8aNdsuBncMpY7","foundationId":"fbqvzYqiEy79jeL8wsadib","id":"3uhARcmLhJJ7AF4oGmRXFJ"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #1","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"rJ589nLaG9XWmTRZhwLvTz"}],"sceneRadius":22,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-17.829241192466892,-21.107034059971184,4.718921354569243],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[4.327600264578368,2.7041849125647666,4.718921354569243],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":true,"diurnalTemperaturePanelRect":{"x":-1,"y":1,"width":517,"height":333},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"heatFluxScaleFactor":10,"stickyNotePanelRect":{"x":-2,"y":344,"width":517,"height":60}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of ground temperature and floor insulation"]}')},532:function(e){e.exports=JSON.parse('{"docid":"gTE5M2QuRpvxtj7gFjQvBp","time":"05/22/2023 10:53 am","timestamp":1684767216212,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.5,"date":"6/10/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":4,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Jack","cx":-6.628211467880927,"cy":-10.2119938102408,"cz":4.440892098500626e-16,"lx":0.42,"lz":1.8,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":11.171058971915114,"cy":0.06430302499558693,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"A","showLabel":true,"labelHeight":8.5,"labelSize":0.8,"color":"#666666"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.641654309594841,"ceiling":false},{"type":"Window","cx":-0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.5,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"1KMGfKAaAbRXUc5v152G7H"},{"type":"Window","cx":0.2916666666666667,"cy":0.3,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"8WmW65wXvFqVAFHZJFWsjr","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Tree","name":"Maple","cx":11.597557786217195,"cy":-9.10270743636709,"cz":0,"lx":11.852806241793175,"lz":12.934464914753796,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"Ground","id":"o3k54VQM47Q54nSJAwrmEn","selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi1N2ddsqnGWnubKQgsZki"],"rightJoints":["2mKkmtjixue6mVK8C5qdJT"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"adSAr7Jscp2bREMCNnKie9","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["14k9EDHAzKUWAkBFT1miXA"],"rightJoints":["adSAr7Jscp2bREMCNnKie9"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"xi1N2ddsqnGWnubKQgsZki","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["adSAr7Jscp2bREMCNnKie9"],"rightJoints":["14k9EDHAzKUWAkBFT1miXA"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"2mKkmtjixue6mVK8C5qdJT","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"centerRoofHeight":[0,7.4648066919643785],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":4,"rValue":1.7611028730632272,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["2mKkmtjixue6mVK8C5qdJT"],"rightJoints":["xi1N2ddsqnGWnubKQgsZki"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#cccccc","normal":[0,0,1],"rotation":[0,0,0],"id":"14k9EDHAzKUWAkBFT1miXA","parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"w7eDFcjLuyPhMChKfhs6jB","leftRoofHeight":4,"rightRoofHeight":4,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":4,"rightTopPartialHeight":4},{"type":"Window","cx":-0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"szq2y8vnCqxebu1Sp5dC5N","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.2916666666666667,"cy":0.1,"cz":0,"lx":0.16666666666666666,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"bm2Jq3Yh33GneBgsKAvMp7","parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","tint":"#73D8FF","opacity":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"id":"w7eDFcjLuyPhMChKfhs6jB","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":3.4648066919643785,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"4TcV7zx5NzstoQTaTqoAzt","foundationId":"4TcV7zx5NzstoQTaTqoAzt","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.2,"wallsId":["14k9EDHAzKUWAkBFT1miXA"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":2.641654309594841,"ceiling":false},{"type":"Foundation","cx":-11.120691028084872,"cy":-0.06445313166738242,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20},"labelHeight":8.5,"labelSize":0.8,"id":"4TcV7zx5NzstoQTaTqoAzt","selected":false,"label":"B","showLabel":true,"color":"#666666"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #14","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"14k9EDHAzKUWAkBFT1miXA","foundationId":"4TcV7zx5NzstoQTaTqoAzt","id":"p8R6iYpCmdMa5Cs4zuS1P6"},{"type":"Door","cx":0,"cy":0,"cz":-0.125,"lx":0.16666666666666666,"ly":0,"lz":0.75,"doorType":"Default","filled":true,"archHeight":1,"textureType":"Door Texture #14","color":"#ffffff","uValue":1,"selected":false,"lineWidth":0.2,"lineColor":"#000000","showLabel":false,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"56LE4zBekLnvJc9jFEm7Yu"}],"sceneRadius":24,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[-0.042868749999999976,0,0],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[-0.042868749999999976,-0.0001500066673827405,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-25.541858353538785,-23.926978121750373,5.679305436989464],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[13.47063227815913,1.5150691532035274,5.679305436989461],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":5.5,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-5,"y":7,"width":600,"height":360},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"stickyNotePanelRect":{"x":-3,"y":-2,"width":203,"height":64}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Effect of trees"]}')},533:function(e){e.exports=JSON.parse('{"docid":"21TNkEaRQtmkMpHquDpRhe","time":"03/21/2023 12:30 pm","timestamp":1679416202848,"userid":"QWecNcxhyvP6j6sBN11hBsfZDau1","owner":null,"email":null,"world":{"solarRadiationHeatmapGridCellSize":0.25,"date":"1/22/2022, 12:00:00 PM","cspTimesPerHour":4,"noAnimationForHeatmapSimulation":false,"cspGridCellSize":0.5,"dustLoss":0.05,"address":"Natick, MA","cspDaysPerYear":4,"ground":{"thermalDiffusivity":0.05,"albedo":0.3,"snowReflectionFactors":[0,0,0,0,0,0,0,0,0,0,0,0]},"daysPerYear":12,"latitude":42.2844063,"noAnimationForSensorDataCollection":false,"timesPerHour":1,"discretization":"Approximate","airAttenuationCoefficient":0.01,"noAnimationForSolarPanelSimulation":false,"solarPanelVisibilityGridCellSize":0.2,"pvGridCellSize":0.5,"name":"default","longitude":-71.3488548,"diurnalTemperatureModel":2},"elements":[{"type":"Human","name":"Judd","cx":2.5001103094985826,"cy":-6.058721988130646,"cz":0.030962420627473897,"lx":0.544,"lz":1.68,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","id":"3LYQCPYTZ6WYqLSGF4X7Lr","selected":false,"ly":0.42},{"type":"Foundation","cx":-10.117024999999996,"cy":0.27838070851727714,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":5},"id":"iFATUUjMA7c8wHKwioiCvi","selected":false,"label":"No Ceiling","showLabel":true,"labelHeight":6,"labelSize":0.5,"color":"#808080"},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"rightJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"s4gNJy8vD8tdJGQTaw6DQj","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["py4fscALBHuoNNVWKoXS9c"],"rightJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"xi9Zz1pobWAhkAdtkZFZBZ","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,5.068830689450057],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["s4gNJy8vD8tdJGQTaw6DQj"],"rightJoints":["py4fscALBHuoNNVWKoXS9c"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"wugyuZMsPdNUQJ1PdoxEGD","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,5.068830689450057],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["wugyuZMsPdNUQJ1PdoxEGD"],"rightJoints":["xi9Zz1pobWAhkAdtkZFZBZ"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"py4fscALBHuoNNVWKoXS9c","parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"45EQZzpZDmcCPwStDm4gUQ","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"id":"45EQZzpZDmcCPwStDm4gUQ","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"rise":2.068830689450057,"color":"#4d4d4d","sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"iFATUUjMA7c8wHKwioiCvi","foundationId":"iFATUUjMA7c8wHKwioiCvi","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["py4fscALBHuoNNVWKoXS9c"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"rValue":1.7611028730632272,"ceiling":false},{"type":"Window","cx":-0.3125,"cy":0.3,"cz":0.08333333333333333,"lx":0.125,"ly":0.2,"lz":0.5,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"selected":false,"lineWidth":0.2,"lineColor":"black","showLabel":false,"color":"white","tint":"#73D8FF","opacity":0.55,"uValue":2,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","id":"hQgFUEAKKCuxnfg7DfAtUD"},{"type":"Window","cx":0.3125,"cy":0.3,"cz":0.08333333333333333,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"3F32WEzwgnaEKesshW1B9d","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":-0.029166666666666664,"cy":0,"cz":-0.08333333333333333,"lx":0.10833333333333334,"ly":0,"lz":0.8333333333333334,"color":"white","uValue":1.7034779999999998,"textureType":"Door Texture #17","filled":true,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"9j89u3pSufVm3Q5kpF4NcM","parentId":"py4fscALBHuoNNVWKoXS9c","foundationId":"iFATUUjMA7c8wHKwioiCvi","selected":false},{"type":"Human","name":"Jena","cx":2.5001103094985826,"cy":-6.058721988130646,"cz":0.030962420627473897,"lx":0.695,"ly":0.42,"lz":1.6,"normal":[0,1,0],"rotation":[0,0,0],"parentId":"cfvC81ormzBEgA9Ah4eP3v","id":"34EHkp2Lb8b2vnEKfniznR","selected":false},{"type":"Wall","cx":0.08181822642150738,"cy":4.8859377925947785,"cz":2.2408122612280286,"lx":12,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["rHyZXvwyEPAa7dU7nYmXpR"],"rightJoints":["jvSvdwWqKHJqgaZtgavr3X"],"leftPoint":[6.081818226421507,4.885937792594777,0.1],"rightPoint":[-5.9181817735784925,4.8859377925947785,0.1],"relativeAngle":3.141592653589793,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"8NQNpFkXNGAXtcTwXhtHNW","parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gCFHHnVKnRgFUFksjrmZCm","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":6.081818226421506,"cy":-0.114062207405222,"cz":2.2301039869226305,"lx":10,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["sb7GHiMmhgNyZJdQ71BL5y"],"rightJoints":["8NQNpFkXNGAXtcTwXhtHNW"],"leftPoint":[6.081818226421504,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,4.8859377925947785,0.1],"relativeAngle":1.5707963267948963,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"rHyZXvwyEPAa7dU7nYmXpR","parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gCFHHnVKnRgFUFksjrmZCm","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,5.068830689450057],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":-5.9181817735784925,"cy":-0.114062207405222,"cz":2.228839888904333,"lx":10,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["8NQNpFkXNGAXtcTwXhtHNW"],"rightJoints":["sb7GHiMmhgNyZJdQ71BL5y"],"leftPoint":[-5.918181773578492,4.8859377925947785,0.1],"rightPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"relativeAngle":4.71238898038469,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"jvSvdwWqKHJqgaZtgavr3X","parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gCFHHnVKnRgFUFksjrmZCm","leftRoofHeight":3,"rightRoofHeight":3,"centerRoofHeight":[0,5.068830689450057],"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Wall","cx":0.08181822642150782,"cy":-5.1140622074052215,"cz":2.268765007024547,"lx":12,"ly":0.2,"lz":3,"rValue":2.1133234476758727,"volumetricHeatCapacity":0.1,"fill":"Full","leftJoints":["jvSvdwWqKHJqgaZtgavr3X"],"rightJoints":["rHyZXvwyEPAa7dU7nYmXpR"],"leftPoint":[-5.9181817735784925,-5.1140622074052215,0.1],"rightPoint":[6.0818182264215075,-5.1140622074052215,0.1],"relativeAngle":0,"textureType":"No Wall Texture","color":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"id":"sb7GHiMmhgNyZJdQ71BL5y","parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","wallStructure":"Default","structureSpacing":2,"structureColor":"white","structureWidth":0.1,"opacity":0.5,"roofId":"gCFHHnVKnRgFUFksjrmZCm","leftRoofHeight":3,"rightRoofHeight":3,"selected":false,"eavesLength":0.2,"parapet":{"display":false,"color":"white","textureType":"No Wall Texture","parapetHeight":1,"copingsWidth":0.5,"copingsHeight":0.1},"leftUnfilledHeight":0.5,"rightUnfilledHeight":0.5,"leftTopPartialHeight":3,"rightTopPartialHeight":3},{"type":"Window","cx":-0.3125,"cy":0.1,"cz":0.08333333333333333,"lx":0.125,"ly":0.2,"lz":0.5,"uValue":2,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"q6p3CCHJFvsqrEsXwbRh1R","parentId":"sb7GHiMmhgNyZJdQ71BL5y","foundationId":"cfvC81ormzBEgA9Ah4eP3v","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Window","cx":0.3125,"cy":0.1,"cz":0.08333333333333333,"lx":0.125,"ly":0.2,"lz":0.5,"mullion":true,"mullionWidth":0.06,"mullionSpacing":1,"mullionColor":"white","frame":true,"frameWidth":0.1,"windowType":"Default","archHeight":1,"color":"white","normal":[0,0,1],"rotation":[0,0,0],"id":"j1XnXywfGpFArNKZPbAhkm","parentId":"sb7GHiMmhgNyZJdQ71BL5y","foundationId":"cfvC81ormzBEgA9Ah4eP3v","tint":"#73D8FF","opacity":0.55,"shutter":{"showLeft":false,"showRight":false,"color":"grey","width":0.5},"selected":false},{"type":"Door","cx":4.625929269271485e-18,"cy":0,"cz":-0.08333333333333333,"lx":0.10833333333333334,"ly":0,"lz":0.8333333333333334,"color":"white","uValue":1.7034779999999998,"textureType":"Door Texture #17","filled":true,"doorType":"Arched","archHeight":1,"normal":[0,0,1],"rotation":[0,0,0],"id":"6uoZg4uoFLaTiYnPcJZ3V9","parentId":"sb7GHiMmhgNyZJdQ71BL5y","foundationId":"cfvC81ormzBEgA9Ah4eP3v","selected":false},{"id":"gCFHHnVKnRgFUFksjrmZCm","type":"Roof","cx":0,"cy":0,"cz":0,"lx":0,"ly":0,"lz":0,"ceiling":true,"rise":2.068830689450057,"color":"#4d4d4d","rValue":1.7611028730632272,"sideColor":"#ffffff","normal":[0,0,1],"rotation":[0,0,0],"parentId":"cfvC81ormzBEgA9Ah4eP3v","foundationId":"cfvC81ormzBEgA9Ah4eP3v","roofType":"Gable","roofStructure":"Default","textureType":"No Roof Texture","thickness":0.1,"wallsId":["sb7GHiMmhgNyZJdQ71BL5y"],"ridgeLeftPoint":[0,1],"ridgeRightPoint":[0,1],"selected":false,"ceilingRValue":3.5222057461264544},{"type":"Foundation","cx":10.177578528084874,"cy":0.23562811833261754,"cz":0.05,"lx":16.34049294383023,"ly":14.404432132963985,"lz":0.1,"normal":[0,0,1],"rotation":[0,0,0],"parentId":"Ground","color":"#808080","solarUpdraftTower":{},"solarAbsorberPipe":{},"solarPowerTower":{},"hvacSystem":{"thermostatSetpoint":20,"temperatureThreshold":5},"labelHeight":6,"labelSize":0.5,"showLabel":true,"id":"cfvC81ormzBEgA9Ah4eP3v","selected":false,"label":"Insulated Ceiling"}],"sceneRadius":23,"view":{"dailyPvYieldPanelX":0,"mapPanelY":0,"dailyFresnelReflectorYieldPanelX":0,"panCenter2D":[0,0.08573749999997851,4.287065548240426e-8],"yearlyHeliostatYieldPanelY":0,"mapPanelX":0,"yearlyHeliostatYieldPanelX":0,"cameraPosition2D":[0,0.08558749333259577,150],"theme":"Default","showDesignInfoPanel":false,"weatherPanelX":0,"dailyParabolicTroughYieldPanelX":0,"mapWeatherStations":false,"stickyNotePanelX":0,"showDailyHeliostatYieldPanel":false,"mapZoom":18,"showYearlyParabolicTroughYieldPanel":false,"dailyHeliostatYieldPanelX":0,"showDailyParabolicDishYieldPanel":false,"cameraPosition":[-19.73331041183491,-15.606053038152623,2.569638957524864],"showYearlyHeliostatYieldPanel":false,"orthographic":false,"dailyHeliostatYieldPanelY":0,"dailyParabolicTroughYieldPanelY":0,"heliodonPanelY":439,"yearlyParabolicTroughYieldPanelY":0,"showWeatherPanel":false,"groundImage":false,"yearlyLightSensorPanelX":0,"ambientLightIntensity":0.1,"yearlyFresnelReflectorYieldPanelX":0,"enableRotate":true,"dailyLightSensorPanelX":0,"heliodon":false,"solarRadiationHeatMapReflectionOnly":false,"cameraZoom":23.327015599941696,"mapType":"roadmap","showMapPanel":false,"yearlyParabolicDishYieldPanelY":0,"showSiteInfoPanel":true,"showDailyParabolicTroughYieldPanel":false,"showDailyFresnelReflectorYieldPanel":false,"showYearlyLightSensorPanel":false,"autoRotate":false,"heliodonPanelX":-14,"showStickyNotePanel":true,"showDailyLightSensorPanel":false,"visibilityResultsPanelX":0,"yearlyPvYieldPanelY":0,"showDailyPvYieldPanel":false,"visibilityResultsPanelY":0,"showSunAngles":false,"dailyFresnelReflectorYieldPanelY":0,"weatherPanelY":0,"dailyLightSensorPanelY":0,"groundColor":"#16a5a5","mapTilt":0,"showYearlyPvYieldPanel":false,"dailyParabolicDishYieldPanelY":0,"yearlyLightSensorPanelY":0,"yearlyParabolicTroughYieldPanelX":0,"dailyPvYieldPanelY":0,"yearlyPvYieldPanelX":0,"yearlyParabolicDishYieldPanelX":0,"shadowEnabled":true,"showInstructionPanel":false,"panCenter":[3.388120187568702,1.9907625161279443,1.1720990830439746],"yearlyFresnelReflectorYieldPanelY":0,"showHeliodonPanel":false,"axes":true,"solarRadiationHeatMapMaxValue":3,"dailyParabolicDishYieldPanelX":0,"showSolarPanelVisibilityResultsPanel":false,"stickyNotePanelY":0,"showYearlyParabolicDishYieldPanel":false,"showYearlyFresnelReflectorYieldPanel":false,"showDailyBuildingEnergyPanel":true,"directLightIntensity":1,"dailyBuildingEnergyPanelRect":{"x":-2,"y":3,"width":510,"height":354},"showDiurnalTemperaturePanel":false,"diurnalTemperaturePanelRect":{"x":0,"y":0,"width":600,"height":400},"showYearlyBuildingEnergyPanel":false,"yearlyBuildingEnergyPanelRect":{"x":0,"y":0,"width":600,"height":400},"heatFluxScaleFactor":2,"stickyNotePanelRect":{"x":-4,"y":2,"width":397,"height":65}},"graphState":{"dailyPvIndividualOutputs":false,"yearlyPvIndividualOutputs":false,"dailyParabolicDishIndividualOutputs":false,"yearlyParabolicDishIndividualOutputs":false,"dailyParabolicTroughIndividualOutputs":false,"yearlyParabolicTroughIndividualOutputs":false,"dailyFresnelReflectorIndividualOutputs":false,"yearlyFresnelReflectorIndividualOutputs":false,"dailyHeliostatIndividualOutputs":false,"yearlyHeliostatIndividualOutputs":false,"dailyUpdraftTowerIndividualOutputs":false,"yearlyUpdraftTowerIndividualOutputs":false},"evolutionMethod":1,"solarPanelArrayLayoutParams":{"pvModelName":"SPR-X21-335-BLK","rowAxis":"Zonal","orientation":"Landscape","tiltAngle":0,"rowsPerRack":1,"interRowSpacing":2,"poleHeight":1,"poleSpacing":3},"solarPanelArrayLayoutConstraints":{"minimumInterRowSpacing":2,"maximumInterRowSpacing":10,"minimumRowsPerRack":1,"maximumRowsPerRack":6,"minimumTiltAngle":-1.5707963267948966,"maximumTiltAngle":1.5707963267948966,"poleHeight":1,"poleSpacing":5,"orientation":"Landscape","pvModelName":"CS6X-355P-FG","rowAxis":"Zonal"},"evolutionaryAlgorithmState":{"geneticAlgorithmParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"selectionMethod":1,"searchMethod":1,"populationSize":20,"maximumGenerations":5,"selectionRate":0.5,"crossoverRate":0.5,"mutationRate":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1},"particleSwarmOptimizationParams":{"problem":"Solar Panel Tilt Angle","objectiveFunctionType":1,"searchMethod":1,"swarmSize":20,"maximumSteps":5,"vmax":0.01,"inertia":0.8,"cognitiveCoefficient":0.1,"socialCoefficient":0.1,"convergenceThreshold":0.01,"localSearchRadius":0.1}},"economicsParams":{"projectLifeSpan":25,"electricitySellingPrice":0.25,"operationalCostPerUnit":0.15},"modelType":"Unknown","modelAuthor":null,"modelLabel":null,"modelDescription":null,"notes":["Thermal envelope vs. building envelope"]}')},584:function(e,t,l){},601:function(e,t,l){},791:function(e,t,l){"use strict";l.r(t);var a={};l.r(a),l.d(a,"pvModelName",(function(){return Gl})),l.d(a,"rowAxis",(function(){return Xl})),l.d(a,"rowWidth",(function(){return Bl})),l.d(a,"interRowSpacing",(function(){return Kl})),l.d(a,"margin",(function(){return ql})),l.d(a,"poleHeight",(function(){return Ql})),l.d(a,"poleSpacing",(function(){return Zl})),l.d(a,"tiltAngle",(function(){return _l})),l.d(a,"orientation",(function(){return $l}));var o={};l.r(o),l.d(o,"navigationView",(function(){return ea})),l.d(o,"shadowEnabled",(function(){return ta})),l.d(o,"solarPanelShininess",(function(){return la})),l.d(o,"windowShininess",(function(){return aa})),l.d(o,"heatFluxScaleFactor",(function(){return oa})),l.d(o,"heatFluxColor",(function(){return ia})),l.d(o,"heatFluxWidth",(function(){return ra})),l.d(o,"solarRadiationHeatmapMaxValue",(function(){return na})),l.d(o,"solarRadiationHeatmapReflectionOnly",(function(){return ca})),l.d(o,"axes",(function(){return sa})),l.d(o,"ambientLightIntensity",(function(){return da})),l.d(o,"directLightIntensity",(function(){return ua})),l.d(o,"theme",(function(){return fa})),l.d(o,"showAzimuthAngle",(function(){return ha})),l.d(o,"showElevationAngle",(function(){return pa})),l.d(o,"showZenithAngle",(function(){return ya})),l.d(o,"autoRotate",(function(){return ga})),l.d(o,"groundImage",(function(){return ma})),l.d(o,"groundImageType",(function(){return wa})),l.d(o,"groundColor",(function(){return xa})),l.d(o,"waterSurface",(function(){return va})),l.d(o,"orthographic",(function(){return ba})),l.d(o,"enableRotate",(function(){return Aa})),l.d(o,"cameraPosition",(function(){return Ta})),l.d(o,"cameraPosition2D",(function(){return Pa})),l.d(o,"panCenter",(function(){return Sa})),l.d(o,"panCenter2D",(function(){return ja})),l.d(o,"cameraZoom",(function(){return Ha})),l.d(o,"heliodon",(function(){return za})),l.d(o,"showSunAngles",(function(){return Ra})),l.d(o,"mapZoom",(function(){return Da})),l.d(o,"mapTilt",(function(){return Ma})),l.d(o,"mapType",(function(){return Wa})),l.d(o,"showSiteInfoPanel",(function(){return Ia})),l.d(o,"showDesignInfoPanel",(function(){return Ca})),l.d(o,"showInstructionPanel",(function(){return Oa})),l.d(o,"showHeliodonPanel",(function(){return Fa})),l.d(o,"heliodonPanelX",(function(){return ka})),l.d(o,"heliodonPanelY",(function(){return Ya})),l.d(o,"showMapPanel",(function(){return La})),l.d(o,"mapPanelX",(function(){return Ea})),l.d(o,"mapPanelY",(function(){return Ua})),l.d(o,"showWeatherPanel",(function(){return Na})),l.d(o,"weatherPanelRect",(function(){return Va})),l.d(o,"showDiurnalTemperaturePanel",(function(){return Ja})),l.d(o,"diurnalTemperaturePanelRect",(function(){return Ga})),l.d(o,"showStickyNotePanel",(function(){return Xa})),l.d(o,"stickyNotePanelRect",(function(){return Ba})),l.d(o,"showDailyBuildingEnergyPanel",(function(){return Ka})),l.d(o,"dailyBuildingEnergyPanelRect",(function(){return qa})),l.d(o,"showYearlyBuildingEnergyPanel",(function(){return Qa})),l.d(o,"yearlyBuildingEnergyPanelRect",(function(){return Za})),l.d(o,"showDailyLightSensorPanel",(function(){return _a})),l.d(o,"dailyLightSensorPanelRect",(function(){return $a})),l.d(o,"showYearlyLightSensorPanel",(function(){return eo})),l.d(o,"yearlyLightSensorPanelRect",(function(){return to})),l.d(o,"yearlyLightSensorPanelShowDaylight",(function(){return lo})),l.d(o,"yearlyLightSensorPanelShowClearness",(function(){return ao})),l.d(o,"showDailyPvYieldPanel",(function(){return oo})),l.d(o,"dailyPvYieldPanelRect",(function(){return io})),l.d(o,"showYearlyPvYieldPanel",(function(){return ro})),l.d(o,"yearlyPvYieldPanelRect",(function(){return no})),l.d(o,"showVisibilityResultsPanel",(function(){return co})),l.d(o,"visibilityResultsPanelRect",(function(){return so})),l.d(o,"showDailyParabolicTroughYieldPanel",(function(){return uo})),l.d(o,"dailyParabolicTroughYieldPanelRect",(function(){return fo})),l.d(o,"showYearlyParabolicTroughYieldPanel",(function(){return ho})),l.d(o,"yearlyParabolicTroughYieldPanelRect",(function(){return po})),l.d(o,"showDailyParabolicDishYieldPanel",(function(){return yo})),l.d(o,"dailyParabolicDishYieldPanelRect",(function(){return go})),l.d(o,"showYearlyParabolicDishYieldPanel",(function(){return mo})),l.d(o,"yearlyParabolicDishYieldPanelRect",(function(){return wo})),l.d(o,"showDailyFresnelReflectorYieldPanel",(function(){return xo})),l.d(o,"dailyFresnelReflectorYieldPanelRect",(function(){return vo})),l.d(o,"showYearlyFresnelReflectorYieldPanel",(function(){return bo})),l.d(o,"yearlyFresnelReflectorYieldPanelRect",(function(){return Ao})),l.d(o,"showDailyHeliostatYieldPanel",(function(){return To})),l.d(o,"dailyHeliostatYieldPanelRect",(function(){return Po})),l.d(o,"showYearlyHeliostatYieldPanel",(function(){return So})),l.d(o,"yearlyHeliostatYieldPanelRect",(function(){return jo})),l.d(o,"showDailyUpdraftTowerYieldPanel",(function(){return Ho})),l.d(o,"dailyUpdraftTowerYieldPanelRect",(function(){return zo})),l.d(o,"showYearlyUpdraftTowerYieldPanel",(function(){return Ro})),l.d(o,"yearlyUpdraftTowerYieldPanelRect",(function(){return Do})),l.d(o,"showEvolutionPanel",(function(){return Mo})),l.d(o,"evolutionPanelRect",(function(){return Wo}));var i={};l.r(i),l.d(i,"latitude",(function(){return Io})),l.d(i,"longitude",(function(){return Co})),l.d(i,"date",(function(){return Oo})),l.d(i,"leafDayOfYear1",(function(){return Fo})),l.d(i,"leafDayOfYear2",(function(){return ko})),l.d(i,"ground",(function(){return Yo})),l.d(i,"address",(function(){return Lo})),l.d(i,"countryCode",(function(){return Eo})),l.d(i,"airAttenuationCoefficient",(function(){return Uo})),l.d(i,"airConvectiveCoefficient",(function(){return No})),l.d(i,"timesPerHour",(function(){return Vo})),l.d(i,"daysPerYear",(function(){return Jo})),l.d(i,"monthlyIrradianceLosses",(function(){return Go})),l.d(i,"discretization",(function(){return Xo})),l.d(i,"diurnalTemperatureModel",(function(){return Bo})),l.d(i,"highestTemperatureTimeInMinutes",(function(){return Ko})),l.d(i,"solarRadiationHeatmapGridCellSize",(function(){return qo})),l.d(i,"pvGridCellSize",(function(){return Qo})),l.d(i,"solarPanelVisibilityGridCellSize",(function(){return Zo})),l.d(i,"cspTimesPerHour",(function(){return _o})),l.d(i,"cspDaysPerYear",(function(){return $o})),l.d(i,"cspGridCellSize",(function(){return ei})),l.d(i,"sutTimesPerHour",(function(){return ti})),l.d(i,"sutDaysPerYear",(function(){return li})),l.d(i,"sutGridCellSize",(function(){return ai})),l.d(i,"noAnimationForHeatmapSimulation",(function(){return oi})),l.d(i,"noAnimationForThermalSimulation",(function(){return ii})),l.d(i,"noAnimationForSensorDataCollection",(function(){return ri})),l.d(i,"noAnimationForSolarPanelSimulation",(function(){return ni})),l.d(i,"noAnimationForSolarUpdraftTowerSimulation",(function(){return ci}));var r=l(1),n=l.n(r),c=l(52),s=l.n(c),d=(l(584),l(23)),u=l(4),f=l(2),h=l(8),p=l(130),y=l.n(p),g=l(50),m=l.n(g),w=l(100),x=l.n(w),v=l(235),b=l.n(v),A=l(351),T=l(800),P=l(408);A.a.use(P.a).use(T.a).init({debug:!0,fallbackLng:"en",interpolation:{escapeValue:!1},resources:{en:{translation:{name:{IFI:"Institute for Future Intelligence",Aladdin:"Aladdin",Tagline:"Aladdin: Reimagining Design with Explainable AI \u2014 Institute for Future Intelligence"},cookie:{Statement:"By clicking Accept, you agree to our use of cookies to improve your experience with Aladdin.",Accept:"Accept"},aboutUs:{ProductBroughtToYouBy:"This product is brought to you by",TermsOfService:"Terms of Service",PrivacyPolicy:"Privacy Policy",Software:"Software",Content:"Content",Research:"Research",Support:"Support",Acknowledgment:"Acknowledgment",FundingInformation:"The National Science Foundation (NSF) generously provided funding for the research and development of this product through grants #2105695, #2131097, and #2301164. Any opinions, findings, and conclusions or recommendations expressed in this product, however, are those of the authors and do not necessarily reflect the views of NSF.",Contact:"For more information, please contact Charles Xie (charles@intofuture.org).",Translators:"Translators"},word:{LastUpdate:"Last Update",Small:"Small",Medium:"Medium",Large:"Large",Design:"Design",Information:"Information",Type:"Type",Text:"Text",FontSize:"Font Size",FontColor:"Font Color",Model:"Model",Models:"Models",Upload:"Upload",ClickCount:"Click Count",Share:"Share",AlreadyLike:"Already like",Like:"Like",MustLogInToLike:"Must log in to like",AllRightsReserved:"All Rights Reserved",MeterAbbreviation:"m",Version:"Version",VersionInitial:"V",Options:"Options",Maximum:"Maximum",Minimum:"Minimum",MaximumNumber:"Maximum Number",MinimumNumber:"Minimum Number",MaximumValue:"Maximum Value",MinimumValue:"Minimum Value",Or:"Or",None:"None",High:"High",Partial:"Partial",Teacher:"Teacher",Class:"Class",Total:"Total",Leaderboard:"Leaderboard",Latest:"Latest",Range:"Range",SIUnit:"SI Unit",USUnit:"US Unit",ThermalTransmittance:"Thermal Transmittance",ThermalResistance:"Thermal Resistance",UValue:"U-Value",RValue:"R-Value",VolumetricHeatCapacity:"Volumetric Heat Capacity",BuildingHVACSystem:"Building HVAC System",ThermostatSetpoint:"Thermostat Setpoint",TemperatureToleranceThreshold:"Tolerance Threshold",TemperatureToleranceThresholdExplanation:"Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.",Press:"Press",Open:"Open",Save:"Save",SaveAsImage:"Save as Image",SaveAsCsv:"Save as CSV",Update:"Update",Paste:"Paste",Copy:"Copy",Cut:"Cut",Delete:"Delete",Lock:"Lock",Translucent:"Translucent",Color:"Color",Texture:"Texture",Size:"Size",Thickness:"Thickness",Yes:"Yes",No:"No",OK:"OK",Cancel:"Cancel",Apply:"Apply",Close:"Close",ApplyTo:"Apply to",Run:"Run",Pause:"Pause",Resume:"Resume",Clear:"Clear",Warning:"Warning",Caution:"Caution",Reminder:"Reminder",Length:"Length",Width:"Width",Height:"Height",Radius:"Radius",Angle:"Angle",Azimuth:"Azimuth",Coordinates:"Coordinates",Weather:"Weather",Show:"Show",Animate:"Animate",Date:"Date",Time:"Time",Title:"Title",Owner:"Owner",Action:"Action",Rename:"Rename",Location:"Location",Latitude:"Latitude",Month:"Month",Day:"Day",Hour:"Hour",Daylight:"Daylight",Radiation:"Radiation",Temperature:"Temperature",kWh:"kWh",dollar:"dollar",MeterPerSecond:"m/s",NorthInitial:"N",SouthInitial:"S",EastInitial:"E",WestInitial:"W",Fixed:"Fixed",Elements:"Elements",Energy:"Energy",Unknown:"Unknown",Label:"Label",Description:"Description",NoDescription:"No description",MaximumCharacters:"Maximum characters",Author:"Author",Publisher:"Publisher",Building:"Building",ResidentialBuilding:"Residential Building",CommercialBuilding:"Commercial Building",SchoolBuilding:"School Building",TouristAttraction:"Tourist Attraction",UnderConstruction:"Under Construction",Photovoltaic:"Photovoltaic",Anonymous:"Anonymous",Nickname:"Nickname",Pin:"Pin",Unpin:"Unpin"},shared:{NoTexture:"No Texture",FoundationElement:"Foundation",CuboidElement:"Cuboid",PolygonElement:"Polygon",SensorElement:"Sensor",SolarPanelElement:"Solar Panel",WaterHeaterElement:"Water Heater",ParabolicDishElement:"Parabolic Dish",ParabolicTroughElement:"Parabolic Trough",FresnelReflectorElement:"Fresnel Reflector",HeliostatElement:"Heliostat",WindTurbineElement:"Wind Turbine",LightElement:"Light",ElementLocked:"Locked",ModelType:"Model Type",OutputBreakdown:"Breakdown",MoreResults:"More Results"},message:{ModelNotFound:"Model not found",CannotSignIn:"Cannot sign in",CannotSignOut:"Cannot sign out",YourAccountWasCreated:"Your account was created.",CannotCreateAccount:"Cannot create an account",YourAccountSettingsWereSaved:"Your account settings were saved.",CannotSaveYourAccountSettings:"Cannot save your account settings",CannotSaveYourFileToCloud:"Cannot save your file to the cloud",CannotCreateNewProject:"Cannot create a new project",CannotCreateNewProjectWithoutTitle:"Cannot create a new project without a title",CannotOpenYourProjects:"Cannot open your projects",CannotOpenProject:"Cannot open the project",CannotDeleteProject:"Cannot delete the project",CannotRenameProject:"Cannot rename the project",CannotAddDesignToProject:"Cannot add this design to the project",CannotAddDesignToProjectOwnedByOthers:"Cannot add this design to a project owned by others",DesignRemovedFromProject:"The design was successfully removed from the project",CannotRemoveDesignFromProject:"Cannot remove this design from the project",CannotUpdateProject:"Cannot update the project",CannotFetchProjectData:"Cannot fetch project data",TitleUsedChooseDifferentOne:"This title has been used. Choose a different one",CloudFileWithTitleExistsDoYouWantToOverwrite:"A cloud file with the title exists. Do you want to overwrite it?",CloudFileNotFound:"The cloud file was not found",CannotLoadModelsOnMap:"Cannot load models on map",CannotLoadLeaderboard:"Cannot load leaderboard",CannotPublishModelOnMap:"Cannot publish model on map",CannotLikeModelFromMap:"Cannot like model from map",CannotDeleteModelFromMap:"Cannot delete model from map",ModelDeletedFromMap:"Model is deleted from map",DoYouWantToDeleteModelFromMap:"Do you want to delete the model from map?",CannotOpenCloudFile:"Cannot open the cloud file",CannotReadCloudFile:"Cannot read the cloud file",CannotWriteCloudFile:"Cannot write the cloud file",CloudFileCopied:"Cloud file copied",CannotOpenCloudFolder:"Cannot open your cloud folder",CannotDeleteCloudFile:"Cannot delete the cloud file",CannotRenameCloudFile:"Cannot rename the cloud file",DoYouWantToSaveChanges:"Do you want to save changes?",NotApplicableToSelectedAction:"Not Applicable to Selected Action",ThisElementIsLocked:"This element is locked.",ThisCannotBeUndone:"This cannot be undone.",AzimuthOfNorthIsZero:"Azimuth of north is 0\xb0",CounterclockwiseAzimuthIsPositive:"Counter-clockwise is positive",MoveCancelledBecauseOfOverlap:"Move cancelled because of overlap.",MoveOutsideBoundaryCancelled:"Move outside the boundary cancelled.",RotationCancelledBecauseOfOverlap:"Rotation cancelled because of overlap.",RotationOutsideBoundaryCancelled:"Rotation outside the boundary cancelled.",ResizingCancelledBecauseOfOverlap:"Resizing cancelled because of overlap.",ResizingOutsideBoundaryCancelled:"Resizing outside the boundary cancelled.",CannotPasteOutsideBoundary:"Cannot paste outside the boundary.",CannotPasteBecauseOfOverlap:"Cannot paste because of overlap.",CannotMoveObjectTooFar:"Cannot move object too far.",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"Existing solar panels will be removed before applying the new layout.",DoYouWantToContinue:"Do you want to continue?",SolarPanelsCannotIntersectWithGround:"Solar panels cannot intersect with the ground.",SolarPanelsCannotOverlapWithOneAnother:"Solar panels cannot overlap with one another.",ScreenshotSaved:"A screenshot was saved.",CsvFileSaved:"A CSV file was saved.",SimulationStarted:"Simulation started.",SimulationCompleted:"Simulation completed.",SimulationAborted:"Simulation aborted.",SimulationPaused:"Simulation paused.",CancelSimulation:"Cancel simulation",PauseSimulation:"Pause simulation",ResumeSimulation:"Resume simulation",SimulationWillNotStartDueToErrors:"Simulation will not start due to errors",SimulationWillStartDespiteWarnings:"Simulation will start despite warnings.",EvolutionStarted:"Evolution started.",EvolutionCompleted:"Evolution completed.",EvolutionAborted:"Evolution aborted.",EvolutionPaused:"Evolution paused.",EncounterEvolutionError:"Encountered an evolution error.",CancelEvolution:"Cancel evolution",PauseEvolution:"Pause evolution",ResumeEvolution:"Resume evolution",ConvergenceThresholdHasBeenReached:"The convergence threshold has been reached.",MaximumNumberOfGenerationsHasBeenReached:"The maximum number of generations has been reached.",MaximumNumberOfStepsHasBeenReached:"The maximum number of steps has been reached.",ObjectiveFunctionTypeError:"The current objective function is not supported by this operation. Please start from the menu.",WallsAreNotAtSameHeight:"Walls are not at the same height.",WallsAreNotPerpendicular:"Walls are not perpendicular.",WallsAreNotConnected:"Walls are not connected.",WallsNumberNeedToBeFour:"The number of walls needs to be four.",BuildingContainsEmptyWall:"Building contains one or more empty wall.",BuildingRoofMissing:"Building has a missing roof.",UnknownErrors:"Unknown errors."},menu:{AnalysisOptions:"Analysis Options",option:{GridCellSize:"Grid Cell Size",SamplingFrequency:"Sampling Frequency",TimesPerHour:"Times per Hour",DaysPerYear:"Days per Year"},mainMenu:"Main Menu",cloudMenu:"Cloud Menu",projectSubMenu:"Project",project:{CreateNewProject:"Create New Project",OpenProject:"Open Project",SaveProjectAs:"Save Project As",YouMustLogInToCreateProject:"You must log in to create a new project",YouMustLogInToOpenProject:"You must log in to open a project"},fileSubMenu:"File",file:{CreateNewFile:"Create New File",OpenLocalFile:"Open Local File",SaveAsLocalFile:"Save as Local File",SavingAbortedMustHaveValidFileName:"Saving aborted! You must have a valid file name",OpenCloudFile:"Open Cloud File",SaveCloudFile:"Save Cloud File",SaveAsCloudFile:"Save as Cloud File",SavingAbortedMustHaveValidTitle:"Saving aborted! You must have a valid title for a cloud file",ToSaveYourWorkPleaseSignIn:"To save your work, please sign in.",TakeScreenshot:"Take Screenshot",UseCloudFileName:"Use Cloud File Name",PublishOnModelsMap:"Publish on Models Map",PublishedOnModelsMap:"Your model has been published on the Models Map",UpdatedOnModelsMap:"Your model has been updated on the Models Map",YouMustLogInToPublishYourModel:"You must log in to publish your model",YouCannotPublishAModelThatYouDoNotOwn:"You cannot publish a model that you do not own",YouMustSaveModelOnCloudBeforePublishingIt:"You must save the model on the cloud before publishing it"},editSubMenu:"Edit",edit:{Undo:"Undo",Redo:"Redo"},viewSubMenu:"View",view:{NavigationView:"Navigation View",TwoDimensionalView:"2D View",ResetView:"Reset",ZoomIn:"Zoom In",ZoomOut:"Zoom Out",AutoRotate:"Auto rotate",ShowShadow:"Show Shadow",ShowSurfaceShininess:"Show Surface Shininess",TranslucentFloatingWindows:"Translucent Floating Windows",accessoriesSubMenu:"Accessories",accessories:{SiteInformation:"Site Information",DesignInformation:"Design Information",Instruction:"Instruction",StickyNote:"Sticky Note",Note:"Note"}},settingsSubMenu:"Settings",settings:{WeatherData:"Weather Data",DiurnalTemperature:"Diurnal Temperature",Heliodon:"Heliodon",SunAndTime:"Sun & Time"},benchmarksSubMenu:"Benchmarks",benchmarks:{SolarRadiationPredictionVsMeasurement:"Solar Radiation Prediction vs. Measurement",BESTESTCase600:"Building Energy Simulation Test: BESTEST Case 600",BESTESTCase610:"Building Energy Simulation Test: BESTEST Case 610",BESTESTCase620:"Building Energy Simulation Test: BESTEST Case 620",BESTESTCase630:"Building Energy Simulation Test: BESTEST Case 630"},graph:{LineWidth:"Line Width",SymbolSize:"Symbol Size",BarCategoryGap:"Bar Category Gap",ShowHorizontalGridLines:"Show Horizontal Grid Lines",ShowVerticalGridLines:"Show Vertical Grid Lines"},analysisSubMenu:"Analysis",physicsSubMenu:"Physics",physics:{DailySolarRadiationHeatmap:"Daily Solar Radiation Heatmap",SolarRadiationHeatmapOptions:"Solar Radiation Heatmap Options",SolarRadiationHeatmapGridCellSize:"Solar Radiation Heatmap Grid Cell Size",SolarRadiationHeatmapMaxValue:"Solar Radiation Heatmap Maximum Value",SolarRadiationHeatmapNoAnimation:"No Animation for Static Model",ReflectionHeatmap:"Reflection Heatmap"},sensorSubMenu:"Sensor",sensor:{CollectDailyData:"Collect Daily Data",CollectYearlyData:"Collect Yearly Data",SensorSimulationNoAnimation:"No Animation for Collecting Sensor Data"},buildingSubMenu:"Building",building:{AnalyzeDailyBuildingEnergy:"Analyze Daily Building Energy",AnalyzeYearlyBuildingEnergy:"Analyze Yearly Building Energy",EnergyAnalysisOptions:"Energy Analysis Options",EnergyGridCellSize:"Energy Grid Cell Size",BuildingEnergySimulationNoAnimation:"No Animation for Building Energy Simulation"},solarPanelSubMenu:"Solar Panel",solarPanel:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield",AnalyzeVisibility:"Analyze Visibility",PanelDiscretization:"Panel Discretization",Exact:"Exact",Approximate:"Approximate",EnergyGridCellSize:"Energy Grid Cell Size",VisibilityGridCellSize:"View Factor Grid Cell Size",EnergyAnalysisOptions:"Energy Analysis Options",VisibilityAnalysisOptions:"Visibility Analysis Options",SolarPanelSimulationNoAnimation:"No Animation for Solar Panel Simulation"},parabolicTroughSubMenu:"Parabolic Trough",parabolicTrough:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},parabolicDishSubMenu:"Parabolic Dish",parabolicDish:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},fresnelReflectorSubMenu:"Fresnel Reflector",fresnelReflector:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},heliostatSubMenu:"Heliostat",heliostat:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},solarUpdraftTowerSubMenu:"Solar Updraft Tower",solarUpdraftTower:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield",SolarUpdraftTowerSimulationNoAnimation:"No Animation for Solar Updraft Tower Simulation"},tutorialsSubMenu:"Tutorials",solarEnergyScienceSubMenu:"Solar Science",solarEnergyScienceTutorials:{SunAngles:"Sun Angles Relative to an Observer on the Ground",InsolationAndClimate:"Insolation and Climate",SolarRadiationToBox:"Solar Radiation to a Box"},buildingScienceSubMenu:"Building Science",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"Thermal Envelope vs. Building Envelope",EffectOfSizeOnBuildingEnergy:"Effect of Size on Building Energy",EffectOfOrientationOnBuildingEnergy:"Effect of Orientation on Building Energy",EffectOfInsulationOnBuildingEnergy:"Effect of Insulation on Building Energy",EffectOfRoofColorOnBuildingEnergy:"Effect of Roof Color on Building Energy",EffectOfEavesOverhangLengthOnBuildingEnergy:"Effect of Eaves Overhang Length on Building Energy",EffectOfWindowSHGCOnBuildingEnergy:"Effect of Window Solar Heat Gain on Building Energy",EffectOfThermostatSetpointOnBuildingEnergy:"Effect of Thermostat Setpoint on Building Energy",EffectOfSolarPanelsOnBuildingEnergy:"Effect of Solar Panels on Building Energy",EffectOfGroundTemperatureOnBuildingEnergy:"Effect of Ground Temperature on Building Energy",EffectOfTreesOnBuildingEnergy:"Effect of Trees on Building Energy"},buildingDesignSubMenu:"Building Design",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"Cape Cod Style House with Shed Dormer",MansardRoofWithDormers:"Mansard Roof with Dormers",GableRoofVsHipRoof:"Gable Roof vs. Hip Roof",ColonialVsSaltbox:"Colonial vs. Saltbox",GambrelRoofVsMansardRoof:"Gambrel Roof vs. Mansard Roof",CombinationRoofVsBonnetRoof:"Combination Roof vs. Bonnet Roof",DutchGableRoof:"Dutch Gable Roof",GableAndValleyRoof:"Gable and Valley Roof",ClerestoryRoof:"Clerestory Roof",MonitorRoof:"Monitor Roof",AFrameHouse:"A-Frame House",HalfTimberedHouse:"Half-Timbered House",AllBasicRoofTypes:"All Basic Roof Types"},photovoltaicSolarPowerSubMenu:"Photovoltaic Solar Power",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"Effect of Tilt Angle of a Solar Panel",EffectOfAzimuthOfSolarPanel:"Effect of Azimuth of a Solar Panel",SolarPanelTypes:"Solar Panel Types",VerticalBifacialSolarPanels:"Vertical Bifacial Solar Panels",CompareMonofacialAndBifacialSolarPanels:"Monofacial vs. Bifacial Solar Panels",SolarTrackers:"Solar Trackers",CoveringGroundWithSolarPanels:"Why Just Covering the Ground with Solar Panels is not a Good Idea",InterRowSpacingOfSolarPanelArray:"Effect of Inter-Row Spacing in a Solar Panel Array",EffectOfOrientationOfSolarPanels:"Effect of Orientation of Solar Panels",SolarPanelArrayAutomaticLayout:"Solar Panel Array Automatic Layout"},concentratedSolarPowerSubMenu:"Concentrated Solar Power",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"Effect of Azimuth of a Parabolic Trough",EffectOfLatusRectumOfParabolicTrough:"Effect of Latus Rectum of a Parabolic Trough",FocusSunlightWithParabolicDish:"Focus Sunlight with a Parabolic Dish",LinearFresnelReflectors:"Linear Fresnel Reflectors",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"Effect of Absorber Pipe Height for Linear Fresnel Reflectors",EffectOfAzimuthOfLinearFresnelReflectors:"Effect of Azimuth of Linear Fresnel Reflectors",LinearFresnelReflectorsWithTwoAbsorbers:"Linear Fresnel Reflectors with Two Absorbers",CosineEfficiencyOfHeliostats:"Cosine Efficiency of Heliostats",ShadowingAndBlockingOfHeliostats:"Shadowing and Blocking of Heliostats",EffectSolarPowerTowerHeight:"Effect of Solar Power Tower Height",SolarPowerTower:"Solar Power Tower"},otherTypesOfSolarPowerSubMenu:"Other Types of Solar Power",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"Solar Updraft Tower"},generativeDesignSubMenu:"Generative Design",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Monofacial Solar Panel Array",BifacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Bifacial Solar Panel Array",OutputOfSolarPanelArrayInDifferentPlaces:"The Output of a Solar Panel Array in Different Places",SimpleSolarFarmParetoFront:"The Pareto Front for Designing a Simple Solar Farm"},examplesSubMenu:"Examples",solarEnergySubMenu:"Solar Energy",solarEnergyExamples:{SunBeamAndHeliodon:"Sun Beam and Heliodon",RooftopSolarPanels:"Rooftop Solar Panels",NevadaSolarOneParabolicTroughArray:"Nevada Solar One Parabolic Trough Array",TooeleParabolicDishArray:"Tooele Parabolic Dish Array",PS10SolarPowerTower:"PS10 Solar Power Tower",TucsonLinearFresnelReflectors:"Tucson Linear Fresnel Reflectors",SolarCanopyFormFactors:"Solar Canopy Form Factors",SolarCanopyOverBleachers:"Solar Canopy Over Bleachers",SolarCanopyOverGarage:"Solar Canopy Over Garage",SolarBusStop:"Solar Bus Stop",SolarFacadeTesla:"Tesla Solar Fa\xe7ade",BuildingIntegratedPhotovoltaics:"Building-Integrated Photovoltaics",Floatovoltaics:"Floatovoltaics",Agrivoltaics:"Agrivoltaics",VegetativeBuffer:"Vegetative Buffer",RainbowSwashSolarFarmBostonMA:"Rainbow Swash Solar Farm in Boston, MA",MickeyMouseSolarFarmOrlandoFL:"Mickey Mouse Solar Farm in Orlando, FL",SolarPanelsOverCanalBakersfieldCA:"Hypothetical Solar Panels Over Canal in Bakersfield, CA",SolarNoiseBarrierLexingtonMA:"Hypothetical Solar Noise Barrier in Lexington, MA",HSATSolarTrackersRaleighNC:"Horizontal Single Axis Trackers (HSAT) in Raleigh, NC",AADATSolarTrackersLancasterCA:"Azimuth\u2013Altitude Dual Axis Trackers (AADAT) in Lancaster, CA",SolarUpdraftTowerInCity:"Solar Updraft Tower in City"},builtEnvironmentSubMenu:"Built Environment",residentialBuildingsSubMenu:"Residential Buildings",residentialBuildingExamples:{ColonialHouse:"Colonial House",DutchColonialHouse:"Dutch Colonial House",TShapedHouse:"T-Shaped House",CapeCodHouseWithGarage:"Cape Cod House with Garage",Solarium:"Solarium",Church1:"Church 1",Cathedral1:"Cathedral 1",Cathedral2:"Cathedral 2",Mosque1:"Mosque 1",AdobeTaosHouse:"Adobe Taos House",RanchHouse:"Ranch House",BonnetHouse:"Bonnet House",BarnStyleHouse:"Barn Style House",ModernHouse:"Modern House",ButterflyRoofHouse:"Butterfly Roof House"},commercialBuildingsSubMenu:"Commercial Buildings",commercialBuildingExamples:{WhiteHouse:"White House",BilimMersinTurkiye:"BILIM, Mersin, Turkiye",SpanishStyleHotel:"Spanish Style Hotel",ApartmentBuilding:"Apartment Building",OfficeBuilding:"Office Building",Hotel:"Hotel"},buildingComplexesSubMenu:"Building Complexes",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"South Burlington High School, VT",MescaleroApacheSchoolNewMexico:"Mescalero Apache School, NM"},urbanPlanningSubMenu:"Urban Planning",urbanPlanningExamples:{Heatmap1:"Heatmap"},otherBuildingsSubMenu:"Other Buildings",otherBuildingExamples:{Greenhouse:"Greenhouse",Pavilion:"Pavilion in a Park",OctagonalPagoda:"Octagonal Pagoda",OceanFront:"Ocean Front",EgyptianPyramids:"Egyptian Pyramids",MayanPyramid:"Mayan Pyramid",SiOSePol:"Si-o-se-pol",StackedCuboids:"Stacked Cuboids"},artificialIntelligenceSubMenu:"Artificial Intelligence",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"Optimizing the Tilt Angle of a Solar Panel Row",OptimizingTiltAnglesOfMultipleSolarPanelRows:"Optimizing the Tilt Angles of Multiple Solar Panel Rows",SolarFarmGenerativeDesign:"Solar Farm Generative Design",SolarFarmGenerativeDesignWithBlock:"Solar Farm Generative Design in the Presence of a Block",FitchburgSolarFarmGenerativeDesign:"Fitchburg Solar Farm Generative Design"},languageSubMenu:"Language",publicSubMenu:"Public",ModelsGallery:"Models Gallery",ModelsMap:"Models Map",AboutUs:"About Us"},avatarMenu:{AccountSettings:"Account Settings",PrivacyStatementTitle:"User Privacy Protection Statement",PrivacyStatement:"When you sign in, your Google ID is used to create and access your Aladdin account. Only a random alphanumeric string is stored in our database as a reference. No personally identifiable data such as your name or email is ever gathered. For more information, see our ",SignIn:"Sign In",SignOut:"Sign Out",IfYouAreAStudent:"If you are a student"},skyMenu:{Axes:"Axes",Theme:"Theme",ThemeDefault:"Default",ThemeDesert:"Desert",ThemeDune:"Dune",ThemeForest:"Forest",ThemeGrassland:"Grassland",ThemeHill:"Hill",ThemeLake:"Lake",ThemeMountain:"Mountain",ThemeRural:"Rural",SunlightAttenuationCoefficientInAir:"Sunlight Attenuation Coefficient in Air",ConvectiveCoefficientOfAir:"Convective Coefficient of Air",HighestTemperatureTimeInMinutes:"Highest Temperature Time (Minutes)",SelectSunAnglesToShow:"Select Sun Angles to Show",ShowAzimuthAngle:"Show Azimuth Angle",ShowElevationAngle:"Show Elevation Angle",ShowZenithAngle:"Show Zenith Angle",DirectLightBrightnessAtNoon:"Direct Light Brightness at Noon",AmbientLightBrightnessAtNoon:"Ambient Light Brightness at Noon"},groundMenu:{MonthlyIrradianceLoss:"Monthly Irradiance Loss",Vegetation:"Vegetation",LeafOutDay:"Leaf-Out Day",LeafOffDay:"Leaf-Off Day",Albedo:"Albedo",ImageOnGround:"Image on Ground",WaterSurface:"Water Surface",RemoveAllUnlockedTrees:"Remove All Unlocked Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedPeople:"Remove All Unlocked People",RemoveAllUnlockedFoundations:"Remove All Unlocked Foundations",RemoveAllUnlockedCuboids:"Remove All Unlocked Cuboids",DoYouReallyWantToRemoveAllPeople:"Do you really want to remove all the people who are not locked",DoYouReallyWantToRemoveAllTrees:"Do you really want to remove all the trees that are not locked",DoYouReallyWantToRemoveAllFlowers:"Do you really want to remove all the flowers that are not locked",DoYouReallyWantToRemoveAllSolarPanels:"Do you really want to remove all the solar panels that are not locked",DoYouReallyWantToRemoveAllFoundations:"Do you really want to remove all the foundations that are not locked",DoYouReallyWantToRemoveAllCuboids:"Do you really want to remove all the cuboids that are not locked",LockAllElements:"Lock All Elements",UnlockAllElements:"Unlock All Elements"},labelSubMenu:{Label:"Label",LabelText:"Label Text",LabelHeight:"Label Height",LabelSize:"Label Size",LabelFontSize:"Font Size",LabelColor:"Label Color",KeepShowingLabel:"Keep Showing Label"},foundationMenu:{RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedParabolicTroughs:"Remove All Unlocked Parabolic Troughs",RemoveAllUnlockedParabolicDishes:"Remove All Unlocked Parabolic Dishes",RemoveAllUnlockedFresnelReflectors:"Remove All Unlocked Fresnel Reflectors",RemoveAllUnlockedHeliostats:"Remove All Unlocked Heliostats",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",RemoveAllUnlockedLights:"Remove All Unlocked Lights",RemoveAllUnlockedWalls:"Remove All Unlocked Walls",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",RemoveAllUnlockedPolygons:"Remove All Unlocked Polygons",RemoveAllUnlockedHumans:"Remove All Unlocked Humans",RemoveAllUnlockedTrees:"Remove All Unlocked Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"Racks",Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",SolarPanels:"Solar Panels",SolarPanelArray:"Solar Panel Array",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"Do you really want to remove all the solar panels on this foundation that are not locked",ParabolicTroughs:"Parabolic Troughs",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"Do you really want to remove all the parabolic troughs on this foundation that are not locked",ParabolicDishes:"Parabolic Dishes",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"Do you really want to remove all the parabolic dishes on this foundation that are not locked",FresnelReflectors:"Fresnel Reflectors",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"Do you really want to remove all the Fresnel reflectors on this foundation that are not locked",Heliostats:"Heliostats",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"Do you really want to remove all the heliostats on this foundation that are not locked",Sensors:"Sensors",DoYouReallyWantToRemoveAllSensorsOnFoundation:"Do you really want to remove all the sensors on this foundation that are not locked",Lights:"Lights",DoYouReallyWantToRemoveAllLightsOnFoundation:"Do you really want to remove all the lights on this foundation that are not locked",Walls:"Walls",DoYouReallyWantToRemoveAllWallsOnFoundation:"Do you really want to remove all the walls on this foundation that are not locked",Windows:"Windows",DoYouReallyWantToRemoveAllWindowsOnFoundation:"Do you really want to remove all the windows on this foundation that are not locked",Doors:"Doors",DoYouReallyWantToRemoveAllDoorsOnFoundation:"Do you really want to remove all the doors on this foundation that are not locked",Polygons:"Polygons",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"Do you really want to remove all the polygons on this foundation that are not locked",Humans:"Humans",DoYouReallyWantToRemoveAllHumansOnFoundation:"Do you really want to remove all the humans on this foundation who are not locked",Trees:"Trees",DoYouReallyWantToRemoveAllTreesOnFoundation:"Do you really want to remove all the trees on this foundation that are not locked",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnFoundation:"Do you really want to remove all the flowers on this foundation that are not locked",OnlyThisFoundation:"Only This Foundation",AllConnectedFoundations:"All Connected Foundations",AllSelectedFoundations:"All Selected Foundations",AllFoundations:"All Foundations",AddPolygon:"Add Polygon",SolarStructure:"Solar Structure",GroupMaster:"Group Master",LockAllElementsOnThisFoundation:"Lock All Elements on This Foundation",UnlockAllElementsOnThisFoundation:"Unlock All Elements on This Foundation",GroundFloorRValue:"Ground Floor R-Value",OnlyThisGroundFloor:"Only This Ground Floor",AllGroundFloors:"All Ground Floors"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"Receiver Tower for Heliostats",ReceiverTowerPhysicalProperties:"Physical Properties of Receiver Tower",ReceiverTowerHeight:"Height of Receiver Tower",ReceiverTowerRadius:"Radius of Receiver Tower",ReceiverAbsorptance:"Absorptance of Receiver",ReceiverOpticalEfficiency:"Optical Efficiency of Receiver",ReceiverThermalEfficiency:"Thermal Efficiency of Receiver"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"Absorber Pipe for Fresnel Reflectors",AbsorberPipePhysicalProperties:"Physical Properties of Absorber Pipe",AbsorberHeight:"Height of Absorber Pipe",AbsorberApertureWidth:"Aperture Width of Absorber Pipe",AbsorberPipePoleNumber:"Pole Number for Absorber Pipe",AbsorberAbsorptance:"Absorptance of Absorber",AbsorberOpticalEfficiency:"Optical Efficiency of Absorber",AbsorberThermalEfficiency:"Thermal Efficiency of Absorber"},solarUpdraftTowerMenu:{SolarUpdraftTower:"Solar Updraft Tower",SolarUpdraftTowerPhysicalProperties:"Physical Properties of Solar Updraft Tower",SolarUpdraftTowerChimneyHeight:"Solar Updraft Tower Chimney Height",SolarUpdraftTowerChimneyRadius:"Solar Updraft Tower Chimney Radius",SolarUpdraftTowerCollectorHeight:"Solar Updraft Tower Collector Height",SolarUpdraftTowerCollectorRadius:"Solar Updraft Tower Collector Radius",SolarUpdraftTowerCollectorTransmissivity:"Solar Updraft Tower Collector Transmissivity",SolarUpdraftTowerCollectorEmissivity:"Solar Updraft Tower Collector Emissivity",SolarUpdraftTowerDischargeCoefficient:"Solar Updraft Tower Discharge Coefficient",SolarUpdraftTowerTurbineEfficiency:"Solar Updraft Tower Turbine Efficiency"},cuboidMenu:{Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",RemoveAllUnlockedPolygons:"Remove All Unlocked Polygons",RemoveAllUnlockedHumans:"Remove All Unlocked Humans",RemoveAllUnlockedTrees:"Remove All Unlocked Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"Racks",SolarPanels:"Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"Do you really want to remove all the solar panels on this cuboid that are not locked",Sensors:"Sensors",DoYouReallyWantToRemoveAllSensorsOnCuboid:"Do you really want to remove all the sensors on this cuboid that are not locked",Polygons:"Polygons",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"Do you really want to remove all the polygons on this cuboid that are not locked",Humans:"Humans",DoYouReallyWantToRemoveAllHumansOnCuboid:"Do you really want to remove all the humans on this cuboid who are not locked",Trees:"Trees",DoYouReallyWantToRemoveAllTreesOnCuboid:"Do you really want to remove all the trees on this cuboid that are not locked",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnCuboid:"Do you really want to remove all the flowers on this cuboid that are not locked",OnlyThisCuboid:"Only This Cuboid",AllCuboidsOnSameSurface:"All Cuboids on Same Surface",AllCuboidsAboveSameBase:"All Cuboids Above Same Base",AllSelectedCuboids:"All Selected Cuboids",AllCuboids:"All Cuboids",OnlyThisSide:"Only This Side",AllSidesOfThisCuboid:"All Sides of This Cuboid",AllSidesOfSelectedCuboids:"All Sides of Selected Cuboids",AllSidesOfAllCuboids:"All Sides of All Cuboids",AddPolygon:"Add Polygon",Stackable:"Stackable",GroupMaster:"Group Master"},polygonMenu:{Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",TextBox:"Text Box",FontOutlineColor:"Font Outline Color",FontOutlineWidth:"Font Outline Width",FontStrokeColor:"Font Stroke Color",FontStrokeWidth:"Font Stroke Width",NoOutline:"No Outline",Shiny:"Shiny",Filled:"Filled",FillTexture:"Fill Texture",FillColor:"Fill Color",Opacity:"Opacity",LineColor:"Line Color",LineWidth:"Line Width",LineStyle:"Line Style",SolidLine:"Solid Line",DashedLine:"Dashed Line",DottedLine:"Dotted Line",InsertVertexBeforeIndex:"Insert Vertex Before Index",InsertVertexAfterIndex:"Insert Vertex After Index",DeleteVertex:"Delete Vertex",OnlyThisPolygon:"Only This Polygon",AllPolygonsOnSurface:"All Polygons on the Same Surface",AllPolygonsAboveFoundation:"All Polygons Above Foundation",AllSelectedPolygons:"All Selected Polygons",AllPolygons:"All Polygons",Layout:"Layout",SolarPanelArrayLayout:"Solar Panel Array Layout",SolarPanelArrayLayoutParametricDesign:"Solar Panel Array Layout: Parametric Design",SolarPanelArrayLayoutGenerativeDesign:"Solar Panel Array Layout: Generative Design",SolarPanelArrayModel:"Solar Panel Model",SolarPanelArrayOrientation:"Orientation",SolarPanelArrayTiltAngle:"Tilt Angle",SolarPanelArrayRowWidth:"Row Width",SolarPanelArrayInterRowSpacing:"Inter-Row Spacing",SolarPanelArrayRowSpacing:"Row Spacing",SolarPanelArrayRowAxis:"Row Axis",SolarPanelArrayLeftRightRowAxis:"Left-Right (Relative)",SolarPanelArrayUpDownRowAxis:"Up-Down (Relative)",SolarPanelArrayEastWestRowAxis:"East-West (Absolute)",SolarPanelArrayNorthSouthRowAxis:"North-South (Absolute)",SolarPanelArrayMargin:"Margin",SolarPanelArrayPoleHeight:"Pole Height",SolarPanelArrayPoleSpacing:"Pole Spacing",SolarPanelArrayTotalYearlyCost:"Total Cost",SolarPanelArrayTotalYearlyRevenue:"Total Revenue",SolarPanelArrayTotalYearlyYield:"Total Yield",SolarPanelArrayMeanYearlyYield:"Mean Yield",SolarPanelArrayYearlyProfit:"Profit",LayoutNotAcceptedCheckYourParameters:"This layout is not accepted. Please check your parameters."},optimizationMenu:{Optimization:"Optimization",Parameters:"Parameters",Variables:"Variables",Constants:"Constants",GeneticAlgorithm:"Genetic Algorithm",GeneticAlgorithmSettings:"Genetic Algorithm Settings",ParticleSwarmOptimization:"Particle Swarm Optimization",ParticleSwarmOptimizationSettings:"Particle Swarm Optimization Settings",SolarPanelTiltAngleOptimization:"Solar Panel Tilt Angle Optimization",SolarPanelArrayLayout:"Solar Panel Array Layout",Generation:"Generation",Gene:"Gene",NormalizedVariables:"Normalized Variables",Objective:"Objective",ObjectiveFunctionDailyTotalYield:"Daily Total Yield",ObjectiveFunctionYearlyTotalYield:"Yearly Total Yield",ObjectiveFunctionDailyMeanYield:"Daily Mean Yield",ObjectiveFunctionYearlyMeanYield:"Yearly Mean Yield",ObjectiveFunctionDailyProfit:"Daily Profit",ObjectiveFunctionYearlyProfit:"Yearly Profit",GeneticAlgorithmSelectionMethod:"Genetic Algorithm Selection Method",RouletteWheel:"Roulette Wheel",Tournament:"Tournament",SearchMethod:"Search Method",GlobalSearchUniformSelection:"Global Search Uniform Selection",LocalSearchRandomOptimization:"Local Search Random Optimization",PopulationSize:"Population Size",MaximumGenerations:"Maximum Generations",SelectionRate:"Selection Rate",CrossoverRate:"Crossover Rate",MutationRate:"Mutation Rate",Step:"Step",SwarmSize:"Swarm Size",MaximumSteps:"Maximum Steps",MaximumVelocity:"Maximum Velocity",InertiaWeight:"Inertia Weight",CognitiveCoefficient:"Cognitive Coefficient",SocialCoefficient:"Social Coefficient",ConvergenceThreshold:"Convergence Threshold for Termination",LocalSearchRadius:"Local Search Radius",RowsPerRackRange:"Range for Rows per Rack",TiltAngleRange:"Range for Tilt Angle",InterRowSpacingRange:"Range for Inter-Row Spacing",ClickTargetPolygonToActivate:"Click Target Polygon to Activate",ClickTargetFoundationToActivate:"Click Target Foundation to Activate"},treeMenu:{ShowModel:"Show Model",Flip:"Flip",Type:"Type",Spread:"Spread"},flowerMenu:{Flip:"Flip",Type:"Type",Spread:"Spread"},peopleMenu:{ChangePerson:"Change Person",Flip:"Flip",Observer:"Observer",ViewFromThisPerson:"View from This Person"},lightMenu:{Color:"Color",Intensity:"Intensity",Decay:"Decay",MaximumDistance:"Distance",Inside:"Inside"},solarCollectorMenu:{RelativeAzimuth:"Relative Azimuth",Pole:"Pole",PoleHeight:"Pole Height",PoleRadius:"Pole Radius",ExtraPoleHeight:"Extra Pole Height",ExtraPoleHeightInAdditionToHalfWidth:"Extra Pole Height in Addition to Half Width",DrawSunBeam:"Draw Sun Beam"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"Reflector Reflectance",ReceiverAbsorptance:"Receiver Absorptance",ReflectorOpticalEfficiency:"Reflector Optical Efficiency",ReceiverThermalEfficiency:"Receiver Thermal Efficiency"},solarPanelMenu:{InverterEfficiency:"Inverter Efficiency",InverterEfficiencyExplained:"The efficiency for converting direct current (DC) to alternating current (AC).",DcToAcSizeRatio:"DC-to-AC Size Ratio",DcToAcSizeRatioExplained:"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.",ChangePvModel:"Change PV Model",Orientation:"Orientation",Portrait:"Portrait",Landscape:"Landscape",FrameColor:"Frame Color",Panels:"panels",PanelsWide:"panels wide",PanelsLong:"panels long",TiltAngle:"Tilt Angle",SouthFacingIsPositive:"South facing is positive",Tracker:"Tracker",SolarTrackerFollowsSun:"A tracker follows the sun to increase solar panel outputs.",PoleSpacing:"Pole Spacing",NoTracker:"No Tracker",HorizontalSingleAxisTracker:"Horizontal Single Axis Tracker",VerticalSingleAxisTracker:"Vertical Single Axis Tracker",AltazimuthDualAxisTracker:"Altazimuth Dual Axis Tracker",OnlyThisSolarPanel:"Only This Solar Panel",AllSolarPanelsOnSurface:"All Solar Panels on the Same Surface",AllSolarPanelsAboveFoundation:"All Solar Panels Above the Same Foundation",AllSelectedSolarPanels:"All Selected Solar Panels",AllSolarPanels:"All Solar Panels"},pvModelPanel:{SolarPanelSpecs:"Solar Panel Specs",Model:"Model",PanelSize:"Panel Size",Cells:"Cells",CellType:"Cell Type",Monocrystalline:"Monocrystalline",Polycrystalline:"Polycrystalline",ThinFilm:"Thin Film",Bifacial:"Bifacial",BifacialityFactor:"Bifaciality Factor",Black:"Black",Blue:"Blue",ShadeTolerance:"Shade Tolerance",SolarCellEfficiency:"Solar Cell Efficiency",NominalOperatingCellTemperature:"Nominal Operating Cell Temperature",TemperatureCoefficientOfPmax:"Temperature Coefficient of Pmax"},parabolicTroughMenu:{ModuleLength:"Module Length",Modules:"modules",ModulesLong:"modules long",LatusRectum:"Latus Rectum",OnlyThisParabolicTrough:"Only This Parabolic Trough",AllParabolicTroughsAboveFoundation:"All Parabolic Troughs Above the Same Foundation",AllSelectedParabolicTroughs:"All Selected Parabolic Troughs",AllParabolicTroughs:"All Parabolic Troughs"},fresnelReflectorMenu:{AbsorberPipe:"Absorber Pipe",SelectAbsorberToReflectSunlightTo:"Select Absorber to Reflect Sunlight to",ModuleLength:"Module Length",Modules:"modules",ModulesLong:"modules long",OnlyThisFresnelReflector:"Only This Fresnel Reflector",AllFresnelReflectorsAboveFoundation:"All Fresnel Reflectors Above the Same Foundation",AllSelectedFresnelReflectors:"All Selected Fresnel Reflectors",AllFresnelReflectors:"All Fresnel Reflectors"},heliostatMenu:{Tower:"Tower",SelectTowerToReflectSunlightTo:"Select Tower to Reflect Sunlight to",OnlyThisHeliostat:"Only This Heliostat",AllHeliostatsAboveFoundation:"All Heliostats Above the Same Foundation",AllSelectedHeliostats:"All Selected Heliostats",AllHeliostats:"All Heliostats"},parabolicDishMenu:{ReceiverStructure:"Receiver Structure",CentralPole:"Central Pole",CentralPoleWithTripod:"Central Pole with Tripod",Quadrupod:"Quadrupod",RimDiameter:"Rim Diameter",LatusRectum:"Latus Rectum",ExtraPoleHeightInAdditionToRadius:"Extra Pole Height in Addition to Radius",OnlyThisParabolicDish:"Only This Parabolic Dish",AllParabolicDishesAboveFoundation:"All Parabolic Dishes Above the Same Foundation",AllSelectedParabolicDishes:"All Selected Parabolic Dishes",AllParabolicDishes:"All Parabolic Dishes"},wallMenu:{TextureDefault:"Default",Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",SizeOfWall:"Size of Wall",OnlyThisWall:"Only This Wall",AllConnectedWalls:"All Connected Walls",AllWallsAboveFoundation:"All Walls Above the Same Foundation",AllSelectedWalls:"All Selected Walls",AllWalls:"All Walls",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisWall:"Do you really want to remove all the windows on this wall",Doors:"Doors",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",DoYouReallyWantToRemoveAllDoorsOnThisWall:"Do you really want to remove all the doors on this wall",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"Do you really want to remove all the solar panels on this wall",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisWall:"Do you really want to remove all the sensors on this wall",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisWall:"Do you really want to remove all the lights on this wall",LockAllPolygons:"Lock All Polygons",UnlockAllPolygons:"Unlock All Polygons",RemoveAllUnlockedPolygons:"Remove All Unlocked Polygons",WallStructure:"Wall Structure",DefaultStructure:"Default",StudStructure:"Stud",PillarStructure:"Pillar",Opacity:"Opacity",StructureSpacing:"Structure Spacing",StructureWidth:"Structure Width",StructureThickness:"Structure Thickness",StructureColor:"Structure Color",Color:"Wall Color",Height:"Height",Thickness:"Thickness",Texture:"Texture",AllLightsOnWallInside:"All Lights on Wall Inside",AllLightsOnWallOutside:"All Lights on Wall Outside",Fill:"Fill",Full:"Full",Partial:"Partial",Empty:"Empty",OpenToOutside:"Open to Outside",EavesLength:"Eaves Overhang Length",Parapet:"Parapet",ParapetColor:"Parapet Color",ParapetTexture:"Parapet Texture",ParapetHeight:"Parapet Height",CopingsHeight:"Copings Height",CopingsWidth:"Copings Width"},windowMenu:{OnlyThisWindow:"Only This Window",AllWindowsOnSurface:"All Windows on the Same Surface",AllWindowsAboveFoundation:"All Windows Above the Same Foundation",AllSelectedWindows:"All Selected Windows",AllWindows:"All Windows",Width:"Width",Height:"Height",Setback:"Setback from Exterior Surface",RelativeToWallThickness:"Relative to wall thickness",Mullion:"Mullion",HorizontalMullion:"Horizontal Mullion",VerticalMullion:"Vertical Mullion",MullionWidth:"Mullion Width",HorizontalMullionSpacing:"Horizontal Mullion Spacing",VerticalMullionSpacing:"Vertical Mullion Spacing",MullionColor:"Mullion Color",Tint:"Tint",Opacity:"Opacity",SolarHeatGainCoefficient:"Solar heat gain coefficient (SHGC) = 1 - opacity",Shutter:"Shutter",LeftShutter:"Left Shutter",RightShutter:"Right Shutter",BothShutters:"Both Shutters",ShutterWidth:"Relative Width",ShutterColor:"Shutter Color",Frame:"Frame",FrameWidth:"Frame Width",SillWidth:"Sill Width",Color:"Frame Color",WindowType:"Window Type",Default:"Default",Arched:"Arched",Polygonal:"Polygonal",Interior:"Interior",Empty:"Empty"},roofMenu:{TextureDefault:"Default",Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",OnlyThisRoof:"Only This Roof",AllRoofsAboveFoundation:"All Roofs Above the Same Foundation",AllSelectedRoofs:"All Selected Roofs",AllRoofs:"All Roofs",OnlyThisCeiling:"Only This Ceiling",AllCeilingsAboveFoundation:"All Ceilings Above the Same Foundation",AllCeilings:"All Ceilings",EavesOverhangLength:"Eaves Overhang Length",RafterSpacing:"Rafter Spacing",RafterWidth:"Rafter Width",RafterThickness:"Rafter Thickness",RafterColor:"Rafter Color",RoofColor:"Roof Color",RoofSideColor:"Roof Side Color",GlassTint:"Glass Tint",Opacity:"Opacity",RoofStructure:"Roof Structure",DefaultStructure:"Default",RafterStructure:"Rafter",GlassStructure:"Glass",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"Do you really want to remove all the solar panels on this roof",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"Do you really want to remove all the windows on this roof",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"Do you really want to remove all the sensors on this roof",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisRoof:"Do you really want to remove all the lights on this roof",AllLightsOnRoofInside:"All Lights on Roof Inside",AllLightsOnRoofOutside:"All Lights on Roof Outside",Rise:"Rise",Ceiling:"Ceiling",RoofRValue:"Roof R-Value",CeilingRValue:"Ceiling R-Value"},doorMenu:{TextureDefault:"Default",Texture01:"Texture 1",Texture02:"Texture 2",Texture03:"Texture 3",Texture04:"Texture 4",Texture05:"Texture 5",Texture06:"Texture 6",Texture07:"Texture 7",Texture08:"Texture 8",Texture09:"Texture 9",Texture10:"Texture 10",Texture11:"Texture 11",Texture12:"Texture 12",Texture13:"Texture 13",Texture14:"Texture 14",Texture15:"Texture 15",Texture16:"Texture 16",Texture17:"Texture 17",OnlyThisDoor:"Only This Door",AllDoorsOnWall:"All Doors on the Same Wall",AllDoorsAboveFoundation:"All Doors Above the Same Foundation",AllSelectedDoors:"All Selected Doors",AllDoors:"All Doors",DoorType:"Door Type",Default:"Default",Arched:"Arched",Filled:"Filled",FrameColor:"Frame Color",Interior:"Interior"},siteInfoPanel:{High:"High",Low:"Low"},designInfoPanel:{NumberOfSelectedHeliostats:"Number of selected heliostats",NumberOfSelectedSolarPanels:"Number of selected solar panels",ElectricityGeneratedDailyBySolarPanels:"Electricity generated daily by these solar panels",SceneDiameter:"Scene diameter",BuildingArea:"Building area"},visualizationControlPanel:{ColorContrast:"Color Contrast",FluxScale:"Flux Scale",ClickUpOrDownArrowButtonsToChange:"Click up or down arrow buttons to change"},instructionPanel:{Rotate:"Rotate",DragMouse:"Drag mouse",Zoom:"Zoom",MouseWheelOrKeys:"Rotate mouse wheel or press Ctrl+[ or Ctrl+]",MouseWheelOrKeysMac:"Rotate mouse wheel or press \u2318+[ or \u2318+]",Pan:"Pan",HoldCtrlDragMouse:"Hold Ctrl and drag mouse",HoldMetaDragMouse:"Hold \u2318 and drag mouse",Enter2DMode:"Enter 2D mode",Exit2DMode:"Exit 2D mode",NavigationMode:"Navigation mode",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",MoveForwardBack:"Move forward/back",MoveForwardBackInstruction:"Press W/S",MoveLeftRight:"Move left/right",MoveLeftRightInstruction:"Press A/D",MoveUpDown:"Move up/down",MoveUpDownInstruction:"Press Z/X",Turn:"Turn",TurnInstruction:"Press arrow keys",ResetView:"Reset",AutoRotate:"Auto rotate",StartOrStop:"Press F4 to start or stop"},mapPanel:{ImageOnGround:"Image on Ground",WeatherStations:"Weather Stations",WeatherStationsNote:"Turn this off to speed up",Coordinates:"Coordinates",Zoom:"Zoom"},visibilityPanel:{SolarPanelVisibility:"Solar Panel Visibility",Observer:"Observer",VantagePoint:"Vantage Point",ItemizedVisibilityByFields:"Itemized by Fields",TotalVisibility:"Total"},sensorPanel:{LightSensor:"Light Sensor",WeatherDataFrom:"Weather Data from"},buildingEnergyPanel:{DailyBuildingEnergy:"Daily Building Energy",YearlyBuildingEnergy:"Yearly Building Energy",Heater:"Heater",AC:"AC",SolarPanel:"Solar Panel",Net:"Net"},solarPanelYieldPanel:{SolarPanelDailyYield:"Solar Panel Daily Yield",SolarPanelYearlyYield:"Solar Panel Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualSolarPanels:"Show outputs of individual solar panels",Profit:"Profit",TotalCost:"Total Cost",TotalRevenue:"Total Revenue",TotalYield:"Total Yield",MeanYield:"Mean Yield",ModuleCount:"Module Count"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"Parabolic Trough Daily Yield",ParabolicTroughYearlyYield:"Parabolic Trough Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualParabolicTroughs:"Show outputs of individual parabolic troughs"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"Parabolic Dish Daily Yield",ParabolicDishYearlyYield:"Parabolic Dish Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualParabolicDishes:"Show outputs of individual parabolic dishes"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"Fresnel Reflector Daily Yield",FresnelReflectorYearlyYield:"Fresnel Reflector Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualFresnelReflectors:"Show outputs of individual Fresnel feflectors"},heliostatYieldPanel:{HeliostatDailyYield:"Heliostat Daily Yield",HeliostatYearlyYield:"Heliostat Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualHeliostats:"Show outputs of individual heliostats"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"Solar Updraft Tower Daily Yield",UpdraftTowerYearlyYield:"Solar Updraft Tower Yearly Yield",ChimneyAirTemperature:"Chimney Air Temperature",ChimneyWindSpeed:"Chimney Wind Speed",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualUpdraftTowers:"Show outputs of individual updraft towers"},heliodonPanel:{SunAndTimeSettings:"Sun & Time Settings",SunAngles:"Angles",TwentyFourHours:"24 Hours"},cloudFilePanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyLikes:"My Likes",MyCloudFiles:"My Cloud Files",GenerateLink:"Generate Link",LinkGeneratedInClipBoard:"A link was generated in the clip board",DoYouReallyWantToDelete:"Do you really want to delete",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"If this file has been shared or published, renaming it breaks existing links"},projectListPanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project was generated in the clip board",DoYouReallyWantToDeleteProject:"Do you really want to delete Project",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"If this project has been shared or published, renaming it breaks existing links"},projectPanel:{ProjectSettings:"Project Settings",ThumbnailImageSize:"Thumbnail Image Size",ProjectByOtherPeople:"Project by Other People",Project:"Project",ProjectType:"Type",ProjectDescription:"Description",MakeDescriptionEditable:"Make this description editable",MakeDescriptionNonEditable:"Make this description non-editable",DoubleClickToMakeDescriptionEditable:"Double-click to make this description editable",SolarPanelArray:"Solar Panel Array",CurateCurrentDesign:"Curate current design",UpdateSelectedDesign:"Update selected design",RemoveSelectedDesign:"Remove selected design",ClickToFlipSortingOrder:"Click to flip the sorting order",DesignNotShownInSolutionSpaceClickToShow:"This design is not shown in solution space; click to show",DesignShownInSolutionSpaceClickToHide:"This design is shown in solution space; click to hide",DistributionInSolutionSpace:"Distribution in the Solution Space",ChooseSolutionSpace:"Choose solution space",ChooseDataColoring:"Choose data coloring",SameColorForAllDesigns:"Same color for all designs",OneColorForEachDesign:"One color for each design",SolutionSpaceScreenshot:"Take a screenshot of the solution space",ScatteredPlotScreenshot:"Take a screenshot of the scattered plot",SingleClickToSelectDoubleClickToOpen:"Single-click to select, double-click to open.",SingleClickToDeselectDoubleClickToOpen:"Single-click to deselect, double-click to open.",GenerateScatteredPlot:"Generate Scattered Plot",SelectXAxis:"Select X Axis",SelectYAxis:"Select Y Axis"},accountSettingsPanel:{MyAccountSettings:"My Account Settings",MyID:"My \ud83c\udd94",ClickToCopyMyID:"Click to copy my ID",IDInClipBoard:"Your ID was copied and is ready to paste.",StoreMyNameInMyFilesWhenSaving:"Store my name in my files when saving",DoYouReallyWantToShowYourNameInYourFiles:"Do you really want to show your display name in your files?",SignFileDisclaimer:"If yes, your display name may be seen by anyone who can access your files.",Likes:"Likes",AllPublished:"All Published",PublishedUnderAliases:"Aliases",UserCount:"User Count",SchoolID:"School ID",ClassID:"Class ID"},weatherPanel:{SunshineHours:"Sunshine"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"Select Air Temperature Model",Sinusoidal:"Sinusoidal"},economicsPanel:{EconomicsParameters:"Economics Parameters",ElectricitySellingPrice:"Electricity Selling Price",OperationalCostPerUnit:"Operational Cost per Unit",SellingPrice:"Selling Price",UnitCost:"Unit Cost"},navigationPanel:{NavigationParameters:"Navigation Parameters",MinimumMoveSpeed:"Minimum Move Speed",MinimumTurnSpeed:"Minimum Turn Speed"},yearlyLightSensorPanel:{SkyClearness:"Clearness",ShowDaylightResults:"Show daylight results",ShowSkyClearnessResults:"Show sky clearness results",ShowAverageDailySolarRadiation:"Show average daily solar radiation"},analysisManager:{NoSensorForCollectingData:"There is no sensor for collecting data.",NoSolarPanelForAnalysis:"There is no solar panel for analysis.",NoObserverForVisibilityAnalysis:"There is no observer for visibility analysis.",NoWaterHeaterForAnalysis:"There is no water heater for analysis.",NoParabolicDishForAnalysis:"There is no parabolic dish for analysis.",NoParabolicTroughForAnalysis:"There is no parabolic trough for analysis.",NoFresnelReflectorForAnalysis:"There is no Fresnel reflector for analysis.",NoHeliostatForAnalysis:"There is no heliostat for analysis.",NoSolarUpdraftTowerForAnalysis:"There is no solar updraft tower for analysis.",NoBuildingForAnalysis:"There is no building for analysis."},toolbar:{CloudFile:"Cloud file",Select:"Select",AddFoundation:"Add foundation",AddWall:"Add wall",AddWindow:"Add window",AddDoor:"Add door",AddPyramidRoof:"Add pyramid roof",AddGableRoof:"Add gable roof",AddHipRoof:"Add hip roof",AddGambrelRoof:"Add gambrel roof",AddMansardRoof:"Add Mansard roof",AddCuboid:"Add cuboid",AddSensor:"Add sensor",AddSolarPanel:"Add solar panel",AddWaterHeater:"Add water heater",AddParabolicDish:"Add parabolic dish",AddParabolicTrough:"Add parabolic trough",AddFresnelReflector:"Add Fresnel reflector",AddHeliostat:"Add heliostat",AddWindTurbine:"Add wind turbine",AddLight:"Add light",AddTree:"Add tree",AddFlower:"Add flower",AddPeople:"Add people",DoubleClickToLockThisModeForNextAction:"Double-click to lock this mode for next action",ClickToUnlockThisModeForNextAction:"Click to unlock this mode for next action",ManipulateGroup:"Manipulate a group",ClearScene:"Clear scene",ShowSunAndTimeSettings:"Show sun and time settings",SpatialAnalysisOfEnergy:"Spatial analysis of energy",DoYouReallyWantToClearContent:"Do you really want to clear the content",ClickForMoreButtons:"Click for more buttons",SwitchToAddingFoundation:"Switch to Adding Foundation",SwitchToAddingCuboid:"Switch to Adding Cuboid",SwitchToAddingWall:"Switch to Adding Wall",SwitchToAddingWindow:"Switch to Adding Window",SwitchToAddingDoor:"Switch to Adding Door",SwitchToAddingPyramidRoof:"Switch to Adding Pyramid Roof",SwitchToAddingGableRoof:"Switch to Adding Gable Roof",SwitchToAddingHipRoof:"Switch to Adding Hip Roof",SwitchToAddingGambrelRoof:"Switch to Adding Gambrel Roof",SwitchToAddingMansardRoof:"Switch to Adding Mansard Roof",SwitchToAddingSolarPanel:"Switch to Adding Solar Panel",SwitchToAddingSensor:"Switch to Adding Sensor",SwitchToAddingWaterHeater:"Switch to Adding Water Heater",SwitchToAddingParabolicDish:"Switch to Adding Parabolic Dish",SwitchToAddingParabolicTrough:"Switch to Adding Parabolic Trough",SwitchToAddingFresnelReflector:"Switch to Adding Fresnel Reflector",SwitchToAddingHeliostat:"Switch to Adding Heliostat",SwitchToAddingWindTurbine:"Switch to Adding Wind Turbine",SwitchToAddingLight:"Switch to Adding Light",SwitchToAddingTree:"Switch to Adding Tree",SwitchToAddingFlower:"Switch to Adding Flower",SwitchToAddingPeople:"Switch to Adding People"},tooltip:{gotoIFI:"Go to Institute for Future Intelligence",visitAladdinHomePage:"Visit Aladdin Homepage",clickToOpenMenu:"Click to open main menu",clickToAccessAccountSettings:"Click to access account settings"},tree:{Apple:"Apple",Birch:"Birch",Coconut:"Coconut",Dogwood:"Dogwood",Elm:"Elm",FanPalm:"Fan Palm",Linden:"Linden",Magnolia:"Magnolia",Maple:"Maple",Oak:"Oak",Pine:"Pine",Spruce:"Spruce"},flower:{Bellflower:"Bellflower",Boxwood:"Boxwood",CactusCombo1:"Cactus Combo 1",CactusCombo2:"Cactus Combo 2",CactusCombo3:"Cactus Combo 3",CactusCombo4:"Cactus Combo 4",Hibiscus:"Hibiscus",Hosta:"Hosta",Hydrangea:"Hydrangea",Peony:"Peony",RedRose:"Red Rose",Spirea:"Spirea",Sunflower:"Sunflower",TallBush:"Tall Bush",Tulip:"Tulip",WhiteFlower:"White Flower",YellowFlower:"Yellow Flower"},people:{Jaah:"Jaah",Jack:"Jack",Jacob:"Jacob",Jacqueline:"Jacqueline",Jade:"Jade",Jamelia:"Jamelia",James:"James",Jane:"Jane",Jaya:"Jaya",Jaye:"Jaye",Jeanette:"Jeanette",Jedi:"Jedi",Jeff:"Jeff",Jena:"Jena",Jennifer:"Jennifer",Jess:"Jess",Jett:"Jett",Jill:"Jill",Jiya:"Jiya",Joan:"Joan",Jocelyn:"Jocelyn",Joel:"Joel",Joey:"Joey",John:"John",Jonathon:"Jonathon",Jose:"Jose",Joseph:"Joseph",Joshua:"Joshua",Judd:"Judd",Judy:"Judy",Julia:"Julia",Julio:"Julio",Jumapili:"Jumapili",June:"June",Juro:"Juro",Justin:"Justin"},compass:{N:"N",S:"S",W:"W",E:"E"},month:{January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"},modelsMap:{SearchByPublisher:"Search by publisher",SearchByLabel:"Search by label",MyPublishedModels:"My Published Models",TotalNumberOfUserPublishedModels:"Total number of user-published models",SortFromOldestToNewest:"Sort from oldest to newest",SortFromNewestToOldest:"Sort from newest to oldest",ModelsFoundOnThisSite:"models found on this site",ShowModelsPublishedByThisAuthor:"Show the models published by this author"}}},zh_cn:{translation:{name:{IFI:"\u672a\u6765\u667a\u80fd\u7814\u7a76\u6240",Aladdin:"\u963f\u62c9\u4e01",Tagline:"\u963f\u62c9\u4e01: \u63a2\u7d22\u4eba\u5de5\u667a\u80fd\u65f6\u4ee3\u7684\u8bbe\u8ba1\u8f6f\u4ef6 \u2014 \u672a\u6765\u667a\u80fd\u7814\u7a76\u6240\u7814\u53d1"},cookie:{Statement:"\u58f0\u660e\uff1a\u4e3a\u4e86\u6539\u5584\u60a8\u7684\u7528\u6237\u4f53\u9a8c\uff0c\u963f\u62c9\u4e01\u91c7\u7528cookie\u50a8\u5b58\u5c11\u91cf\u6570\u636e\u3002",Accept:"\u540c\u610f"},aboutUs:{ProductBroughtToYouBy:"\u672a\u6765\u667a\u80fd\u7814\u7a76\u6240\u8363\u8a89\u51fa\u54c1",TermsOfService:"\u670d\u52a1\u6761\u6b3e",PrivacyPolicy:"\u9690\u79c1\u653f\u7b56",Software:"\u8f6f\u4ef6",Content:"\u8bfe\u4ef6",Research:"\u7814\u7a76",Support:"\u670d\u52a1",Acknowledgment:"\u9e23\u8c22",FundingInformation:"\u672c\u4ea7\u54c1\u7684\u7814\u53d1\u627f\u8499\u7f8e\u56fd\u56fd\u5bb6\u79d1\u5b66\u57fa\u91d1\u4f1a\u6177\u6168\u8d44\u52a9\uff08\u9879\u76ee\u53f7#2105695\uff0c#2131097\uff0c#2301164\uff09\u3002\u672c\u4ea7\u54c1\u7684\u4efb\u4f55\u89c2\u70b9\u6216\u7ed3\u8bba\u4ec5\u4ee3\u8868\u521b\u4f5c\u8005\u4e2a\u4eba\u610f\u89c1\u3002",Contact:"\u5982\u60a8\u9700\u8981\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u8054\u7cfb Charles Xie (charles@intofuture.org)\u3002\u6211\u4eec\u4f1a\u5c3d\u5feb\u56de\u590d\u3002",Translators:"\u7ffb\u8bd1"},word:{LastUpdate:"\u4e0a\u4e00\u6b21\u66f4\u65b0",Small:"\u5c0f",Medium:"\u4e2d",Large:"\u5927",Design:"\u8bbe\u8ba1",Information:"\u4fe1\u606f",Type:"\u7c7b\u522b",Text:"\u6587\u5b57",FontSize:"\u5b57\u4f53\u5927\u5c0f",FontColor:"\u5b57\u4f53\u989c\u8272",Model:"\u6a21\u578b",Models:"\u6a21\u578b",Upload:"\u4e0a\u4f20",ClickCount:"\u70b9\u51fb\u6570",Share:"\u5206\u4eab",AlreadyLike:"\u5df2\u70b9\u8d5e",Like:"\u70b9\u8d5e",MustLogInToLike:"\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u70b9\u8d5e",AllRightsReserved:"\u7248\u6743\u6240\u6709",MeterAbbreviation:"\u7c73",Version:"\u7248\u672c",VersionInitial:"\u7248\u672c",Options:"\u9009\u9879",Maximum:"\u6700\u5927",Minimum:"\u6700\u5c0f",MaximumNumber:"\u6700\u591a",MinimumNumber:"\u6700\u5c11",MaximumValue:"\u6700\u5927\u503c",MinimumValue:"\u6700\u5c0f\u503c",Or:"\u6216",None:"\u65e0",High:"\u9ad8",Partial:"\u90e8\u5206",Teacher:"\u8001\u5e08",Class:"\u73ed\u7ea7",Total:"\u603b\u6570",Leaderboard:"\u7528\u6236\u6392\u884c\u699c",Latest:"\u6700\u65b0",Range:"\u8303\u56f4",SIUnit:"\u56fd\u9645\u5355\u4f4d\u5236",USUnit:"\u7f8e\u56fd\u5355\u4f4d\u5236",ThermalTransmittance:"\u70ed\u900f\u8fc7\u7387",ThermalResistance:"\u70ed\u963b",UValue:"U\u503c",RValue:"R\u503c",VolumetricHeatCapacity:"\u5bb9\u79ef\u70ed\u5bb9",BuildingHVACSystem:"\u5efa\u7b51\u7269\u6696\u901a\u7a7a\u8c03\u7cfb\u7edf",ThermostatSetpoint:"\u6052\u6e29\u5668\u8bbe\u5b9a\u503c",TemperatureToleranceThreshold:"\u6e29\u5ea6\u5fcd\u8010\u9608\u503c",TemperatureToleranceThresholdExplanation:"\u5f53\u65e5\u6700\u4f4e\u5916\u9762\u6e29\u5ea6\u9ad8\u4e8e\u6052\u6e29\u5668\u8bbe\u5b9a\u503c\u51cf\u53bb\u6b64\u9608\u503c\uff0c\u6696\u6c14\u4e0d\u5f00\u3002\n\u5f53\u65e5\u6700\u9ad8\u5916\u9762\u6e29\u5ea6\u4f4e\u4e8e\u6052\u6e29\u5668\u8bbe\u5b9a\u503c\u52a0\u4e0a\u6b64\u9608\u503c\uff0c\u7a7a\u8c03\u4e0d\u5f00\u3002",Press:"\u6309",Open:"\u6253\u5f00",Save:"\u4fdd\u5b58",SaveAsImage:"\u4fdd\u5b58\u4e3a\u56fe\u50cf",SaveAsCsv:"\u4fdd\u5b58\u4e3aCSV",Update:"\u5237\u65b0",Paste:"\u7c98\u8d34",Copy:"\u590d\u5236",Cut:"\u526a\u5207",Delete:"\u5220\u9664",Lock:"\u56fa\u5b9a",Translucent:"\u534a\u900f\u660e",Color:"\u989c\u8272",Texture:"\u6750\u8d28",Thickness:"\u539a\u5ea6",Size:"\u5c3a\u5bf8",Yes:"\u662f",No:"\u4e0d",OK:"\u786e\u5b9a",Cancel:"\u53d6\u6d88",Apply:"\u5e94\u7528",Close:"\u5173\u95ed",ApplyTo:"\u9002\u7528\u4e8e",Run:"\u8fd0\u884c",Pause:"\u6682\u505c",Resume:"\u7ee7\u7eed",Clear:"\u6e05\u7a7a",Warning:"\u8b66\u544a",Caution:"\u5c0f\u5fc3",Reminder:"\u63d0\u9192",Length:"\u957f\u5ea6",Width:"\u5bbd\u5ea6",Height:"\u9ad8\u5ea6",Radius:"\u534a\u5f84",Angle:"\u89d2\u5ea6",Azimuth:"\u65b9\u4f4d\u89d2",Coordinates:"\u5750\u6807",Weather:"\u5929\u6c14",Show:"\u663e\u793a",Animate:"\u52a8\u753b",Date:"\u65e5\u671f",Time:"\u65f6\u95f4",Title:"\u6807\u9898",Owner:"\u6240\u6709\u8005",Action:"\u64cd\u4f5c",Rename:"\u6539\u540d",Location:"\u4f4d\u7f6e",Latitude:"\u7eac\u5ea6",Month:"\u6708\u4efd",Day:"\u5929",Hour:"\u5c0f\u65f6",Daylight:"\u767d\u5929\u957f\u5ea6",Radiation:"\u8f90\u5c04",Temperature:"\u6e29\u5ea6",kWh:"\u5343\u74e6\u65f6",dollar:"\u5143",MeterPerSecond:"\u7c73/\u79d2",NorthInitial:"\u5317",SouthInitial:"\u5357",EastInitial:"\u4e1c",WestInitial:"\u897f",Fixed:"\u56fa\u5b9a",Elements:"\u90e8\u4ef6",Energy:"\u80fd\u91cf",Unknown:"\u672a\u77e5",Label:"\u6807\u7b7e",Description:"\u63cf\u8ff0",NoDescription:"\u65e0\u63cf\u8ff0",MaximumCharacters:"\u6700\u591a\u5b57\u7b26\u6570",Author:"\u4f5c\u8005",Publisher:"\u53d1\u5e03\u8005",Building:"\u5efa\u7b51",ResidentialBuilding:"\u4f4f\u5b85\u5efa\u7b51",CommercialBuilding:"\u5546\u7528\u5efa\u7b51",SchoolBuilding:"\u5b66\u6821\u5efa\u7b51",TouristAttraction:"\u65c5\u6e38\u666f\u70b9",UnderConstruction:"\u5728\u5efa",Photovoltaic:"\u5149\u4f0f",Anonymous:"\u65e0\u540d\u6c0f",Nickname:"\u522b\u540d",Pin:"\u7f6e\u9876",Unpin:"\u89e3\u9664\u7f6e\u9876"},shared:{NoTexture:"\u65e0\u6750\u8d28",FoundationElement:"\u5730\u57fa",CuboidElement:"\u957f\u65b9\u4f53",PolygonElement:"\u591a\u8fb9\u5f62",SensorElement:"\u4f20\u611f\u5668",SolarPanelElement:"\u5149\u4f0f\u677f",WaterHeaterElement:"\u592a\u9633\u80fd\u70ed\u6c34\u5668",ParabolicDishElement:"\u629b\u7269\u7ebf\u789f",ParabolicTroughElement:"\u629b\u7269\u7ebf\u69fd",FresnelReflectorElement:"\u83f2\u6d85\u8033\u53cd\u5c04\u955c",HeliostatElement:"\u5b9a\u65e5\u955c",WindTurbineElement:"\u98ce\u529b\u6da1\u8f6e\u673a",LightElement:"\u7535\u706f",ElementLocked:"\u56fa\u5b9a",ModelType:"\u6a21\u578b\u7c7b\u522b",OutputBreakdown:"\u5206\u5217\u53d1\u7535\u91cf",MoreResults:"\u66f4\u591a\u7ed3\u679c"},message:{ModelNotFound:"\u6ca1\u6709\u627e\u5230\u6a21\u578b",CannotSignIn:"\u767b\u5f55\u5931\u8d25",CannotSignOut:"\u9000\u51fa\u5931\u8d25",YourAccountWasCreated:"\u6210\u529f\u5efa\u7acb\u60a8\u7684\u8d26\u53f7\u3002",CannotCreateAccount:"\u65e0\u6cd5\u521b\u5efa\u8d26\u53f7",YourAccountSettingsWereSaved:"\u60a8\u7684\u8d26\u53f7\u8bbe\u5b9a\u5df2\u4fdd\u5b58\u3002",CannotSaveYourAccountSettings:"\u60a8\u7684\u8d26\u53f7\u8bbe\u5b9a\u65e0\u6cd5\u4fdd\u5b58",CannotSaveYourFileToCloud:"\u65e0\u6cd5\u4fdd\u5b58\u60a8\u7684\u6587\u4ef6\u5230\u4e91\u7aef",CannotCreateNewProject:"\u65e0\u6cd5\u521b\u5efa\u65b0\u9879\u76ee",CannotCreateNewProjectWithoutTitle:"\u6ca1\u6709\u6807\u9898, \u65e0\u6cd5\u521b\u5efa\u65b0\u9879\u76ee",CannotOpenYourProjects:"\u65e0\u6cd5\u6253\u5f00\u60a8\u7684\u9879\u76ee\u5217\u8868",CannotOpenProject:"\u65e0\u6cd5\u6253\u5f00\u9879\u76ee",CannotDeleteProject:"\u65e0\u6cd5\u5220\u9664\u9879\u76ee",CannotRenameProject:"\u65e0\u6cd5\u7ed9\u9879\u76ee\u6539\u540d",CannotAddDesignToProject:"\u65e0\u6cd5\u628a\u6b64\u8bbe\u8ba1\u52a0\u5230\u9879\u76ee\u91cc",CannotAddDesignToProjectOwnedByOthers:"\u4e0d\u80fd\u628a\u6b64\u8bbe\u8ba1\u52a0\u5230\u522b\u4eba\u7684\u9879\u76ee\u91cc",DesignRemovedFromProject:"\u8bbe\u8ba1\u88ab\u6210\u529f\u5730\u4ece\u9879\u76ee\u91cc\u5220\u9664",CannotRemoveDesignFromProject:"\u65e0\u6cd5\u628a\u6b64\u8bbe\u8ba1\u4ece\u9879\u76ee\u91cc\u5220\u9664",CannotUpdateProject:"\u65e0\u6cd5\u66f4\u65b0\u9879\u76ee",CannotFetchProjectData:"\u65e0\u6cd5\u53d6\u5f97\u9879\u76ee\u6570\u636e",TitleUsedChooseDifferentOne:"\u6b64\u6807\u9898\u5df2\u7ecf\u88ab\u4f7f\u7528, \u8bf7\u91c7\u7528\u4e0d\u540c\u7684\u6807\u9898",CloudFileWithTitleExistsDoYouWantToOverwrite:"\u4f7f\u7528\u6b64\u6807\u9898\u7684\u4e91\u6587\u4ef6\u5df2\u7ecf\u5b58\u5728\uff0c\u60a8\u786e\u5b9a\u8981\u8986\u76d6\u5b83\u5417\uff1f",CloudFileNotFound:"\u627e\u4e0d\u5230\u6b64\u4e91\u7aef\u6587\u4ef6",CannotLoadModelsOnMap:"\u65e0\u6cd5\u4e0b\u8f7d\u5730\u56fe\u4e0a\u7684\u6a21\u578b",CannotLoadLeaderboard:"\u65e0\u6cd5\u4e0b\u8f7d\u6392\u884c\u699c",CannotPublishModelOnMap:"\u6a21\u578b\u65e0\u6cd5\u53d1\u5e03\u5230\u5730\u56fe\u4e0a",CannotLikeModelFromMap:"\u65e0\u6cd5\u70b9\u8d5e\u5730\u56fe\u4e0a\u7684\u6a21\u578b",CannotDeleteModelFromMap:"\u65e0\u6cd5\u5220\u9664\u5730\u56fe\u4e0a\u7684\u6a21\u578b",ModelDeletedFromMap:"\u6a21\u578b\u5df2\u4ece\u5730\u56fe\u4e0a\u5220\u9664",DoYouWantToDeleteModelFromMap:"\u60a8\u8981\u5220\u9664\u5730\u56fe\u4e0a\u7684\u8fd9\u4e2a\u6a21\u578b\u5417\uff1f",CannotOpenCloudFile:"\u6b64\u4e91\u7aef\u6587\u4ef6\u65e0\u6cd5\u6253\u5f00",CannotReadCloudFile:"\u65e0\u6cd5\u8bfb\u53d6\u6b64\u4e91\u7aef\u6587\u4ef6",CannotWriteCloudFile:"\u65e0\u6cd5\u5b58\u50a8\u6b64\u4e91\u7aef\u6587\u4ef6",CloudFileCopied:"\u62f7\u8d1d\u4e91\u7aef\u6587\u4ef6",CannotOpenCloudFolder:"\u60a8\u7684\u4e91\u7aef\u6587\u4ef6\u5939\u65e0\u6cd5\u6253\u5f00",CannotDeleteCloudFile:"\u65e0\u6cd5\u5220\u9664\u6b64\u4e91\u7aef\u6587\u4ef6",CannotRenameCloudFile:"\u6b64\u4e91\u7aef\u6587\u4ef6\u7684\u540d\u5b57\u65e0\u6cd5\u66f4\u6539",DoYouWantToSaveChanges:"\u60a8\u8981\u4fdd\u5b58\u5f53\u524d\u6587\u4ef6\u5417\uff1f",NotApplicableToSelectedAction:"\u6b64\u503c\u4e0d\u9002\u7528\u4e8e\u5f53\u524d\u9009\u62e9\u8303\u56f4",ThisElementIsLocked:"\u8fd9\u4e2a\u90e8\u4ef6\u88ab\u9501\u5b9a\u3002",ThisCannotBeUndone:"\u8fd9\u4e2a\u64cd\u4f5c\u4e00\u65e6\u6267\u884c\u5c31\u4e0d\u80fd\u64a4\u9500\u3002",AzimuthOfNorthIsZero:"\u6b63\u5317\u7684\u65b9\u4f4d\u89d2\u4e3a\u96f6\u5ea6",CounterclockwiseAzimuthIsPositive:"\u9006\u65f6\u9488\u4e3a\u6b63",MoveCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u53e0\uff0c\u79fb\u52a8\u53d6\u6d88\u3002",MoveOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u79fb\u52a8\u53d6\u6d88\u3002",RotationCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u53e0\uff0c\u65cb\u8f6c\u53d6\u6d88\u3002",RotationOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u65cb\u8f6c\u53d6\u6d88\u3002",ResizingCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u53e0\uff0c\u5c3a\u5bf8\u8c03\u6574\u53d6\u6d88\u3002",ResizingOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u5c3a\u5bf8\u8c03\u6574\u53d6\u6d88\u3002",CannotPasteOutsideBoundary:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u4e0d\u80fd\u590d\u5236\u3002",CannotPasteBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u53e0\uff0c\u4e0d\u80fd\u590d\u5236\u3002",CannotMoveObjectTooFar:"\u4f4d\u7f6e\u592a\u8fdc\uff0c\u79fb\u52a8\u53d6\u6d88\u3002",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"\u91c7\u7528\u65b0\u5e03\u5c40\u4e4b\u524d\u5fc5\u987b\u79fb\u9664\u73b0\u6709\u7684\u5149\u4f0f\u677f\u3002",DoYouWantToContinue:"\u60a8\u60f3\u7ee7\u7eed\u5417\uff1f",SolarPanelsCannotIntersectWithGround:"\u5149\u4f0f\u677f\u4e0d\u80fd\u548c\u5730\u9762\u63a5\u89e6\u3002",SolarPanelsCannotOverlapWithOneAnother:"\u5149\u4f0f\u677f\u4e0d\u80fd\u91cd\u53e0\u3002",ScreenshotSaved:"\u622a\u5c4f\u56fe\u7247\u4fdd\u5b58\u5728\u4e0b\u8f7d\u6587\u4ef6\u5939\u91cc\u3002",CsvFileSaved:"CSV\u4fdd\u5b58\u5728\u4e0b\u8f7d\u6587\u4ef6\u5939\u91cc\u3002",SimulationStarted:"\u6a21\u62df\u5f00\u59cb\u3002",SimulationCompleted:"\u6a21\u62df\u7ed3\u675f\u3002",SimulationAborted:"\u6a21\u62df\u53d6\u6d88\u3002",SimulationPaused:"\u6a21\u62df\u6682\u505c\u3002",CancelSimulation:"\u53d6\u6d88\u6a21\u62df",PauseSimulation:"\u6682\u505c\u6a21\u62df",ResumeSimulation:"\u7ee7\u7eed\u6a21\u62df",SimulationWillNotStartDueToErrors:"\u7531\u4e8e\u9519\u8bef\u6a21\u62df\u65e0\u6cd5\u8fd0\u884c",SimulationWillStartDespiteWarnings:"\u53d1\u73b0\u95ee\u9898\uff0c\u4f46\u6a21\u62df\u4ecd\u7136\u5c06\u8fd0\u884c\u3002",EvolutionStarted:"\u6f14\u5316\u5f00\u59cb\u3002",EvolutionCompleted:"\u6f14\u5316\u7ed3\u675f\u3002",EvolutionAborted:"\u6f14\u5316\u53d6\u6d88\u3002",EvolutionPaused:"\u6f14\u5316\u6682\u505c\u3002",EncounterEvolutionError:"\u6f14\u5316\u51fa\u9519\u3002",CancelEvolution:"\u53d6\u6d88\u6f14\u5316",PauseEvolution:"\u6682\u505c\u6f14\u5316",ResumeEvolution:"\u7ee7\u7eed\u6f14\u5316",ConvergenceThresholdHasBeenReached:"\u6536\u655b\u9608\u503c\u5df2\u8fbe\u5230\u3002",MaximumNumberOfGenerationsHasBeenReached:"\u6700\u5927\u4e16\u4ee3\u6570\u5df2\u8fbe\u5230\u3002",MaximumNumberOfStepsHasBeenReached:"\u6700\u5927\u6b65\u6570\u5df2\u8fbe\u5230\u3002",ObjectiveFunctionTypeError:"\u6b64\u64cd\u4f5c\u4e0d\u652f\u6301\u5f53\u524d\u7684\u76ee\u6807\u51fd\u6570\u3002\u8bf7\u4ece\u83dc\u5355\u542f\u52a8\u6b64\u529f\u80fd\u3002",WallsAreNotAtSameHeight:"\u5899\u4f53\u9ad8\u5ea6\u4e0d\u540c\u3002",WallsAreNotPerpendicular:"\u5899\u4f53\u4e0d\u5782\u76f4\u3002",WallsAreNotConnected:"\u5899\u4f53\u4e0d\u76f8\u8fde\u3002",WallsNumberNeedToBeFour:"\u5899\u4f53\u6570\u91cf\u5fc5\u987b\u4e3a\u56db\u4e2a\u3002",BuildingContainsEmptyWall:"\u5efa\u7b51\u7269\u6709\u7a7a\u5899\u3002",BuildingRoofMissing:"\u5efa\u7b51\u7269\u6ca1\u6709\u5c4b\u9876\u3002",UnknownErrors:"\u672a\u77e5\u9519\u8bef\u3002"},menu:{AnalysisOptions:"\u5206\u6790\u9009\u9879",option:{GridCellSize:"\u8ba1\u7b97\u7f51\u683c\u7684\u5c3a\u5bf8",SamplingFrequency:"\u91c7\u6837\u9891\u7387",TimesPerHour:"\u6bcf\u5c0f\u65f6\u91c7\u6837\u6b21\u6570",DaysPerYear:"\u6bcf\u4e00\u5e74\u91c7\u6837\u5929\u6570"},mainMenu:"\u4e3b\u83dc\u5355",cloudMenu:"\u4e91\u83dc\u5355",projectSubMenu:"\u9879\u76ee",project:{CreateNewProject:"\u521b\u5efa\u65b0\u9879\u76ee",OpenProject:"\u6253\u5f00\u9879\u76ee",SaveProjectAs:"\u53e6\u5b58\u9879\u76ee\u4e3a",YouMustLogInToCreateProject:"\u60a8\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u521b\u5efa\u9879\u76ee",YouMustLogInToOpenProject:"\u60a8\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u6253\u5f00\u9879\u76ee"},fileSubMenu:"\u6587\u4ef6",file:{CreateNewFile:"\u521b\u5efa\u65b0\u6587\u4ef6",OpenLocalFile:"\u6253\u5f00\u672c\u5730\u6587\u4ef6",SaveAsLocalFile:"\u4fdd\u5b58\u4e3a\u672c\u5730\u6587\u4ef6",SavingAbortedMustHaveValidFileName:"\u6587\u4ef6\u540d\u65e0\u6548\uff0c\u4fdd\u5b58\u5931\u8d25",OpenCloudFile:"\u6253\u5f00\u4e91\u7aef\u6587\u4ef6",SaveCloudFile:"\u4fdd\u5b58\u4e91\u7aef\u6587\u4ef6",SaveAsCloudFile:"\u4fdd\u5b58\u4e3a\u4e91\u7aef\u6587\u4ef6",SavingAbortedMustHaveValidTitle:"\u4e91\u7aef\u6587\u4ef6\u540d\u65e0\u6548\uff0c\u4fdd\u5b58\u5931\u8d25",ToSaveYourWorkPleaseSignIn:"\u4e3a\u4e86\u4fdd\u5b58\u60a8\u7684\u4e91\u7aef\u6587\u4ef6\uff0c\u8bf7\u60a8\u5148\u767b\u5f55\u3002",TakeScreenshot:"\u622a\u5c4f",UseCloudFileName:"\u91c7\u7528\u4e91\u7aef\u6587\u4ef6\u540d",PublishOnModelsMap:"\u53d1\u5e03\u5230\u5730\u56fe\u4e0a",PublishedOnModelsMap:"\u60a8\u7684\u6a21\u578b\u6210\u529f\u53d1\u5e03\u5230\u5730\u56fe\u4e0a",UpdatedOnModelsMap:"\u60a8\u7684\u6a21\u578b\u66f4\u65b0\u6210\u529f",YouMustLogInToPublishYourModel:"\u60a8\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u53d1\u5e03\u6a21\u578b",YouCannotPublishAModelThatYouDoNotOwn:"\u60a8\u4e0d\u80fd\u53d1\u5e03\u4ed6\u4eba\u7684\u6a21\u578b",YouMustSaveModelOnCloudBeforePublishingIt:"\u60a8\u5fc5\u987b\u5148\u628a\u6b64\u6a21\u578b\u4fdd\u5b58\u5728\u4e91\u7aef\u624d\u80fd\u53d1\u5e03\u5b83"},editSubMenu:"\u7f16\u8f91",edit:{Undo:"\u64a4\u9500",Redo:"\u91cd\u505a"},viewSubMenu:"\u89c6\u754c",view:{NavigationView:"\u5bfc\u822a\u6a21\u5f0f",TwoDimensionalView:"\u4e8c\u7ef4\u6a21\u5f0f",ResetView:"\u91cd\u7f6e\u89c6\u89d2",ZoomIn:"\u653e\u5927",ZoomOut:"\u7f29\u5c0f",AutoRotate:"\u81ea\u52a8\u65cb\u8f6c",ShowShadow:"\u663e\u793a\u9634\u5f71",ShowSurfaceShininess:"\u663e\u793a\u8868\u9762\u5149\u6cfd",TranslucentFloatingWindows:"\u900f\u660e\u6d6e\u52a8\u7a97\u53e3",accessoriesSubMenu:"\u914d\u4ef6",accessories:{SiteInformation:"\u4f4d\u7f6e\u4fe1\u606f",DesignInformation:"\u8bbe\u8ba1\u4fe1\u606f",Instruction:"\u64cd\u4f5c\u8bf4\u660e",StickyNote:"\u4fbf\u7b7e",Note:"\u4fbf\u7b7e"}},settingsSubMenu:"\u8bbe\u7f6e",settings:{WeatherData:"\u6c14\u8c61\u6570\u636e",DiurnalTemperature:"\u663c\u591c\u6e29\u5ea6",Heliodon:"\u65e5\u5f71\u4eea",SunAndTime:"\u592a\u9633\u548c\u65f6\u95f4"},benchmarksSubMenu:"\u57fa\u51c6",benchmarks:{SolarRadiationPredictionVsMeasurement:"\u592a\u9633\u80fd\u8f90\u5c04\u6a21\u578b\u9884\u6d4b\u548c\u5b9e\u9645\u6d4b\u91cf\u7684\u5bf9\u6bd4",BESTESTCase600:"\u5efa\u7b51\u7269\u80fd\u8017\u6a21\u62df\u6d4b\u8bd5\uff1aBESTEST\u6848\u4f8b600",BESTESTCase610:"\u5efa\u7b51\u7269\u80fd\u8017\u6a21\u62df\u6d4b\u8bd5\uff1aBESTEST\u6848\u4f8b610",BESTESTCase620:"\u5efa\u7b51\u7269\u80fd\u8017\u6a21\u62df\u6d4b\u8bd5\uff1aBESTEST\u6848\u4f8b620",BESTESTCase630:"\u5efa\u7b51\u7269\u80fd\u8017\u6a21\u62df\u6d4b\u8bd5\uff1aBESTEST\u6848\u4f8b630"},graph:{LineWidth:"\u7ebf\u6761\u5bbd\u5ea6",SymbolSize:"\u7b26\u53f7\u5927\u5c0f",BarCategoryGap:"\u76f4\u6761\u95f4\u9699",ShowHorizontalGridLines:"\u663e\u793a\u683c\u5b50\u7684\u6c34\u5e73\u7ebf\u6761",ShowVerticalGridLines:"\u663e\u793a\u683c\u5b50\u7684\u7ad6\u76f4\u7ebf\u6761"},analysisSubMenu:"\u5206\u6790",physicsSubMenu:"\u7269\u7406",physics:{DailySolarRadiationHeatmap:"\u5f53\u65e5\u592a\u9633\u8f90\u5c04\u603b\u91cf\u5206\u5e03\u70ed\u56fe",SolarRadiationHeatmapOptions:"\u592a\u9633\u8f90\u5c04\u70ed\u56fe\u9009\u9879",SolarRadiationHeatmapGridCellSize:"\u592a\u9633\u8f90\u5c04\u70ed\u56fe\u7f51\u683c\u7684\u5c3a\u5bf8",SolarRadiationHeatmapMaxValue:"\u592a\u9633\u8f90\u5c04\u70ed\u56fe\u6700\u5927\u503c",SolarRadiationHeatmapNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b",ReflectionHeatmap:"\u53cd\u5c04\u70ed\u56fe"},sensorSubMenu:"\u4f20\u611f\u5668",sensor:{CollectDailyData:"\u6536\u96c6\u5f53\u5929\u6570\u636e",CollectYearlyData:"\u6536\u96c6\u5168\u5e74\u6570\u636e",SensorSimulationNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b"},buildingSubMenu:"\u5efa\u7b51\u7269",building:{AnalyzeDailyBuildingEnergy:"\u5efa\u7b51\u7269\u5f53\u5929\u80fd\u8017\u5206\u6790",AnalyzeYearlyBuildingEnergy:"\u5efa\u7b51\u7269\u5168\u5e74\u80fd\u8017\u5206\u6790",EnergyAnalysisOptions:"\u80fd\u8017\u5206\u6790\u9009\u9879",EnergyGridCellSize:"\u8ba1\u7b97\u7f51\u683c\u7684\u5c3a\u5bf8",BuildingEnergySimulationNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b"},solarPanelSubMenu:"\u592a\u9633\u80fd\u5149\u4f0f\u677f",solarPanel:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa",AnalyzeVisibility:"\u5206\u6790\u53ef\u89c1\u5ea6",PanelDiscretization:"\u5149\u4f0f\u677f\u79bb\u6563\u5316\u65b9\u6cd5",Exact:"\u51c6\u786e",Approximate:"\u8fd1\u4f3c",EnergyGridCellSize:"\u8ba1\u7b97\u7f51\u683c\u7684\u5c3a\u5bf8",VisibilityGridCellSize:"\u89c6\u754c\u56e0\u5b50\u8ba1\u7b97\u7f51\u683c\u7684\u5c3a\u5bf8",EnergyAnalysisOptions:"\u80fd\u91cf\u5206\u6790\u9009\u9879",VisibilityAnalysisOptions:"\u53ef\u89c1\u5ea6\u5206\u6790\u9009\u9879",SolarPanelSimulationNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b"},parabolicTroughSubMenu:"\u629b\u7269\u7ebf\u69fd",parabolicTrough:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa"},parabolicDishSubMenu:"\u629b\u7269\u7ebf\u789f",parabolicDish:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa"},fresnelReflectorSubMenu:"\u83f2\u6d85\u5c14\u53cd\u5c04\u955c",fresnelReflector:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa"},heliostatSubMenu:"\u5b9a\u65e5\u955c",heliostat:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa"},solarUpdraftTowerSubMenu:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854",solarUpdraftTower:{AnalyzeDailyYield:"\u5206\u6790\u5f53\u5929\u4ea7\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u4ea7\u51fa",SolarUpdraftTowerSimulationNoAnimation:"\u82e5\u65e0\u79fb\u52a8\u90e8\u4ef6\u5219\u7701\u7565\u52a8\u753b"},tutorialsSubMenu:"\u6559\u7a0b",solarEnergyScienceSubMenu:"\u592a\u9633\u80fd\u79d1\u5b66",solarEnergyScienceTutorials:{SunAngles:"\u592a\u9633\u76f8\u5bf9\u4e8e\u5730\u9762\u89c2\u5bdf\u8005\u7684\u89d2\u5ea6",InsolationAndClimate:"\u592a\u9633\u8f90\u5c04\u548c\u6c14\u5019\u7684\u5173\u7cfb",SolarRadiationToBox:"\u4e00\u4e2a\u957f\u65b9\u4f53\u53d7\u5230\u7684\u592a\u9633\u80fd\u8f90\u5c04\u5206\u6790"},buildingScienceSubMenu:"\u5efa\u7b51\u79d1\u5b66",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"\u623f\u5c4b\u7684\u70ed\u5b66\u5c01\u5957\u548c\u56f4\u62a4\u5c01\u5957",EffectOfSizeOnBuildingEnergy:"\u623f\u5c4b\u5927\u5c0f\u5bf9\u80fd\u8017\u7684\u5f71\u54cd",EffectOfOrientationOnBuildingEnergy:"\u623f\u5c4b\u65b9\u4f4d\u5bf9\u80fd\u8017\u7684\u5f71\u54cd",EffectOfInsulationOnBuildingEnergy:"\u623f\u5c4b\u9694\u70ed\u5bf9\u80fd\u8017\u7684\u5f71\u54cd",EffectOfRoofColorOnBuildingEnergy:"\u5c4b\u9876\u989c\u8272\u5bf9\u5efa\u7b51\u7269\u80fd\u8017\u7684\u5f71\u54cd",EffectOfEavesOverhangLengthOnBuildingEnergy:"\u5c4b\u6a90\u5ef6\u4f38\u957f\u5ea6\u5bf9\u5efa\u7b51\u7269\u80fd\u8017\u7684\u5f71\u54cd",EffectOfWindowSHGCOnBuildingEnergy:"\u7a97\u6237\u592a\u9633\u80fd\u8f93\u5165\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd",EffectOfThermostatSetpointOnBuildingEnergy:"\u6052\u6e29\u5668\u8bbe\u5b9a\u503c\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd",EffectOfSolarPanelsOnBuildingEnergy:"\u5149\u4f0f\u677f\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd",EffectOfGroundTemperatureOnBuildingEnergy:"\u5730\u8868\u6e29\u5ea6\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd",EffectOfTreesOnBuildingEnergy:"\u6811\u836b\u5bf9\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u54cd"},buildingDesignSubMenu:"\u5efa\u7b51\u8bbe\u8ba1",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"\u6709\u68da\u9876\u7a97\u7684\u79d1\u5fb7\u89d2\u98ce\u683c\u7684\u4f4f\u5b85",MansardRoofWithDormers:"\u6709\u5929\u7a97\u7684\u6298\u7ebf\u5c4b\u9876",GableRoofVsHipRoof:"\u53cc\u5761\u5c4b\u9876\u548c\u56db\u5761\u5c4b\u9876\u7684\u5bf9\u6bd4",ColonialVsSaltbox:"\u6b96\u6c11\u5730\u98ce\u683c\u548c\u76d0\u76d2\u98ce\u683c\u7684\u5bf9\u6bd4",GambrelRoofVsMansardRoof:"\u590d\u659c\u5c4b\u9876\u548c\u6298\u7ebf\u5c4b\u9876\u7684\u5bf9\u6bd4",CombinationRoofVsBonnetRoof:"\u7ec4\u5408\u5c4b\u9876\u548c\u5e3d\u6a90\u5c4b\u9876\u7684\u5bf9\u6bd4",DutchGableRoof:"\u8377\u5170\u53cc\u5761\u5c4b\u9876",GableAndValleyRoof:"\u5761\u8c37\u5c4b\u9876",ClerestoryRoof:"\u5929\u7a97\u5c4b\u9876",MonitorRoof:"\u91c7\u5149\u5c4b\u9876",AFrameHouse:"A\u5b57\u5f62\u623f\u5b50",HalfTimberedHouse:"\u534a\u6728\u9aa8\u67b6\u623f\u5b50",AllBasicRoofTypes:"\u6240\u6709\u7684\u57fa\u672c\u5c4b\u9876\u7c7b\u578b"},photovoltaicSolarPowerSubMenu:"\u5149\u4f0f\u53d1\u7535",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"\u5149\u4f0f\u677f\u503e\u659c\u89d2\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",EffectOfAzimuthOfSolarPanel:"\u5149\u4f0f\u677f\u65b9\u4f4d\u89d2\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",SolarPanelTypes:"\u5149\u4f0f\u677f\u7c7b\u578b",VerticalBifacialSolarPanels:"\u7ad6\u76f4\u7684\u53cc\u9762\u5149\u4f0f\u677f",CompareMonofacialAndBifacialSolarPanels:"\u5355\u9762\u5149\u4f0f\u677f\u548c\u53cc\u9762\u5149\u4f0f\u677f\u7684\u5bf9\u6bd4",SolarTrackers:"\u81ea\u52a8\u8ffd\u65e5\u5668",CoveringGroundWithSolarPanels:"\u4e3a\u4ec0\u4e48\u6211\u4eec\u4e0d\u7b80\u5355\u5730\u7528\u5149\u4f0f\u677f\u8986\u76d6\u5730\u9762",InterRowSpacingOfSolarPanelArray:"\u5149\u4f0f\u677f\u9635\u5217\u884c\u95f4\u8ddd\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",EffectOfOrientationOfSolarPanels:"\u5149\u4f0f\u677f\u6392\u5217\u65b9\u5411\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",SolarPanelArrayAutomaticLayout:"\u5149\u4f0f\u677f\u81ea\u52a8\u6392\u5217"},concentratedSolarPowerSubMenu:"\u5149\u70ed\u53d1\u7535",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"\u629b\u7269\u7ebf\u69fd\u65b9\u4f4d\u89d2\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",EffectOfLatusRectumOfParabolicTrough:"\u629b\u7269\u7ebf\u69fd\u901a\u5f84\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",FocusSunlightWithParabolicDish:"\u7528\u629b\u7269\u7ebf\u789f\u805a\u7126\u967d\u5149",LinearFresnelReflectors:"\u7528\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u805a\u7126\u967d\u5149",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"\u5438\u70ed\u7ba1\u7684\u5b89\u88c5\u9ad8\u5ea6\u5bf9\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u53d1\u7535\u91cf\u7684\u5f71\u54cd",EffectOfAzimuthOfLinearFresnelReflectors:"\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u65b9\u4f4d\u89d2\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",LinearFresnelReflectorsWithTwoAbsorbers:"\u914d\u5907\u4e24\u4e2a\u5438\u6536\u7ba1\u7684\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u9635\u5217",CosineEfficiencyOfHeliostats:"\u5b9a\u65e5\u955c\u7684\u4f59\u5f26\u6548\u7387",ShadowingAndBlockingOfHeliostats:"\u5b9a\u65e5\u955c\u7684\u9634\u5f71\u548c\u906e\u6321",EffectSolarPowerTowerHeight:"\u5438\u6536\u5854\u9ad8\u5ea6\u5bf9\u53d1\u7535\u91cf\u7684\u5f71\u54cd",SolarPowerTower:"\u5854\u5f0f\u5149\u70ed\u53d1\u7535\u7ad9"},otherTypesOfSolarPowerSubMenu:"\u5176\u5b83\u7c7b\u578b\u7684\u592a\u9633\u80fd\u53d1\u7535",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854"},generativeDesignSubMenu:"\u751f\u6210\u5f0f\u8bbe\u8ba1",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"\u5355\u9762\u5149\u4f0f\u677f\u9635\u5217\u7684\u503e\u659c\u89d2",BifacialSolarPanelArrayTiltAngle:"\u53cc\u9762\u5149\u4f0f\u677f\u9635\u5217\u7684\u503e\u659c\u89d2",OutputOfSolarPanelArrayInDifferentPlaces:"\u4e00\u4e2a\u5149\u4f0f\u677f\u9635\u5217\u5728\u4e0d\u540c\u5730\u533a\u7684\u4ea7\u51fa",SimpleSolarFarmParetoFront:"\u7b80\u5355\u592a\u9633\u80fd\u519c\u573a\u8bbe\u8ba1\u7684\u5e15\u7d2f\u6258\u524d\u6cbf"},examplesSubMenu:"\u4f8b\u5b50",solarEnergySubMenu:"\u592a\u9633\u80fd",solarEnergyExamples:{SunBeamAndHeliodon:"\u592a\u9633\u5149\u675f\u548c\u65e5\u5f71\u4eea",RooftopSolarPanels:"\u5c4b\u9876\u5149\u4f0f\u677f",NevadaSolarOneParabolicTroughArray:"\u5185\u534e\u8fbe\u5dde\u592a\u9633\u80fd\u4e00\u53f7\u7684\u629b\u7269\u7ebf\u69fd\u9635\u5217",TooeleParabolicDishArray:"\u72b9\u4ed6\u5dde\u56fe\u57c3\u52d2\u7684\u629b\u7269\u7ebf\u789f\u9635\u5217",PS10SolarPowerTower:"\u897f\u73ed\u7259\u585e\u7ef4\u5229\u4e9a\u7684PS10\u592a\u9633\u80fd\u53d1\u7535\u5854",TucsonLinearFresnelReflectors:"\u4e9a\u5229\u6851\u90a3\u5dde\u56fe\u68ee\u7684\u76f4\u7ebf\u5f0f\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u9635\u5217",SolarCanopyFormFactors:"\u592a\u9633\u80fd\u5929\u7bf7\u5916\u5f62\u8bbe\u8ba1",SolarCanopyOverBleachers:"\u770b\u53f0\u592a\u9633\u80fd\u5929\u7bf7",SolarCanopyOverGarage:"\u8f66\u5e93\u592a\u9633\u80fd\u5929\u7bf7",SolarBusStop:"\u592a\u9633\u80fd\u5019\u8f66\u4ead",SolarFacadeTesla:"\u7279\u65af\u62c9\u5149\u4f0f\u5899",BuildingIntegratedPhotovoltaics:"\u5efa\u7b51\u6574\u5408\u5149\u4f0f",Floatovoltaics:"\u6d6e\u52a8\u5149\u4f0f",Agrivoltaics:"\u519c\u4e1a\u5149\u4f0f",VegetativeBuffer:"\u592a\u9633\u80fd\u519c\u573a\u7eff\u5316\u5e26",RainbowSwashSolarFarmBostonMA:"\u9a6c\u8428\u8bf8\u585e\u5dde\u6ce2\u58eb\u987f\u5f69\u8679\u6fc0\u6d41\u65c1\u8fb9\u7684\u5149\u4f0f\u677f\u9635\u5217",MickeyMouseSolarFarmOrlandoFL:"\u4f5b\u7f57\u91cc\u8fbe\u5dde\u5965\u5170\u591a\u7684\u7c73\u8001\u9f20\u5f62\u72b6\u5149\u4f0f\u677f\u9635\u5217",SolarPanelsOverCanalBakersfieldCA:"\u52a0\u5229\u798f\u5c3c\u4e9a\u5dde\u8d1d\u514b\u65af\u83f2\u5c14\u5fb7\u704c\u6e89\u6e20\u4e0a\u5047\u60f3\u7684\u5149\u4f0f\u677f\u9635\u5217",SolarNoiseBarrierLexingtonMA:"\u9a6c\u8428\u8bf8\u585e\u5dde\u5217\u514b\u661f\u6566\u9ad8\u901f\u516c\u8def\u566a\u97f3\u5899\u4e0a\u5047\u60f3\u7684\u5149\u4f0f\u677f",HSATSolarTrackersRaleighNC:"\u5317\u5361\u7f57\u6765\u7eb3\u5dde\u7f57\u5229\u7684\u4e00\u4e2a\u6c34\u5e73\u65b9\u5411\u5355\u8f74\u65cb\u8f6c\u8ffd\u65e5\u5149\u4f0f\u677f\u9635\u5217\uff08HSAT\uff09",AADATSolarTrackersLancasterCA:"\u52a0\u5229\u798f\u5c3c\u4e9a\u5dde\u5170\u5f00\u65af\u7279\u7684\u4e00\u4e2a\u53cc\u8f74\u65cb\u8f6c\u8ffd\u65e5\u5149\u4f0f\u677f\u9635\u5217\uff08AADAT\uff09",SolarUpdraftTowerInCity:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u5728\u57ce\u5e02\u4e2d\u7684\u5e94\u7528"},builtEnvironmentSubMenu:"\u5efa\u9020\u73af\u5883",residentialBuildingsSubMenu:"\u4f4f\u5b85\u5efa\u7b51",residentialBuildingExamples:{ColonialHouse:"\u6b96\u6c11\u5730\u98ce\u683c\u7684\u4f4f\u5b85",DutchColonialHouse:"\u8377\u5170\u6b96\u6c11\u5730\u98ce\u683c\u7684\u4f4f\u5b85",TShapedHouse:"T\u5b57\u578b\u623f\u5b50",CapeCodHouseWithGarage:"\u6709\u8f66\u5e93\u7684\u79d1\u5fb7\u89d2\u98ce\u683c\u7684\u4f4f\u5b85",Solarium:"\u6709\u65e5\u5149\u6d74\u5ba4\u7684\u623f\u5b50",Church1:"\u6559\u5802\u4f8b\u4e00",Cathedral1:"\u4e3b\u6559\u5ea7\u5802\u4f8b\u4e00",Cathedral2:"\u4e3b\u6559\u5ea7\u5802\u4f8b\u4e8c",Mosque1:"\u6e05\u771f\u5bfa\u4f8b\u4e00",AdobeTaosHouse:"\u9676\u65af\u571f\u576f\u623f",RanchHouse:"\u7267\u573a\u98ce\u683c\u7684\u4f4f\u5b85",BonnetHouse:"\u6709\u5e3d\u6a90\u5c4b\u9876\u7684\u4f4f\u5b85",BarnStyleHouse:"\u8c37\u4ed3\u5f0f\u98ce\u683c\u7684\u4f4f\u5b85",ModernHouse:"\u73b0\u4ee3\u98ce\u683c\u7684\u4f4f\u5b85",ButterflyRoofHouse:"\u8774\u8776\u578b\u5c4b\u9876\u7684\u4f4f\u5b85"},commercialBuildingsSubMenu:"\u5546\u7528\u5efa\u7b51",commercialBuildingExamples:{WhiteHouse:"\u767d\u5bab",BilimMersinTurkiye:"\u571f\u8033\u5176\u6885\u5c14\u8f9b\u79d1\u5b66\u6559\u80b2\u4e2d\u5fc3",SpanishStyleHotel:"\u897f\u73ed\u7259\u98ce\u683c\u65c5\u9986",ApartmentBuilding:"\u516c\u5bd3\u697c",OfficeBuilding:"\u529e\u516c\u697c",Hotel:"\u65c5\u9986"},buildingComplexesSubMenu:"\u5efa\u7b51\u7fa4",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"\u4f5b\u8499\u7279\u5dde\u5357\u4f2f\u7075\u987f\u9ad8\u4e2d",MescaleroApacheSchoolNewMexico:"\u65b0\u58a8\u897f\u54e5\u5dde\u6885\u65af\u5361\u52d2\u7f57\u963f\u5e15\u5947\u5b66\u6821"},urbanPlanningSubMenu:"\u57ce\u5e02\u89c4\u5212",urbanPlanningExamples:{Heatmap1:"\u70ed\u56fe\u4f8b\u4e00"},otherBuildingsSubMenu:"\u5176\u5b83\u5efa\u7b51",otherBuildingExamples:{Greenhouse:"\u6e29\u5ba4",Pavilion:"\u516c\u56ed\u7684\u4ead\u5b50",OctagonalPagoda:"\u516b\u89d2\u5854",OceanFront:"\u6d77\u8fb9",EgyptianPyramids:"\u57c3\u53ca\u91d1\u5b57\u5854",MayanPyramid:"\u739b\u96c5\u91d1\u5b57\u5854",SiOSePol:"\u4e09\u5341\u4e09\u5b54\u6865",StackedCuboids:"\u5806\u780c\u957f\u65b9\u4f53"},artificialIntelligenceSubMenu:"\u4eba\u5de5\u667a\u80fd",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"\u4f18\u5316\u5355\u6392\u5149\u4f0f\u677f\u7684\u503e\u659c\u89d2",OptimizingTiltAnglesOfMultipleSolarPanelRows:"\u4f18\u5316\u591a\u6392\u5149\u4f0f\u677f\u7684\u503e\u659c\u89d2",SolarFarmGenerativeDesign:"\u751f\u6210\u5f0f\u8bbe\u8ba1\u592a\u9633\u80fd\u519c\u573a",SolarFarmGenerativeDesignWithBlock:"\u751f\u6210\u5f0f\u8bbe\u8ba1\u592a\u9633\u80fd\u519c\u573a\uff1a\u5468\u8fb9\u6709\u5efa\u7b51\u7269\u7684\u60c5\u51b5",FitchburgSolarFarmGenerativeDesign:"\u751f\u6210\u5f0f\u8bbe\u8ba1\u592a\u9633\u80fd\u519c\u573a\uff1a\u771f\u5b9e\u4e16\u754c\u6848\u4f8b"},languageSubMenu:"\u8bed\u8a00",publicSubMenu:"\u516c\u5171",ModelsGallery:"\u6a21\u578b\u753b\u5eca",ModelsMap:"\u6a21\u578b\u5730\u56fe",AboutUs:"\u5173\u4e8e\u6211\u4eec"},avatarMenu:{AccountSettings:"\u8d26\u53f7\u8bbe\u5b9a",PrivacyStatementTitle:"\u7528\u6237\u9690\u79c1\u4fdd\u62a4\u58f0\u660e",PrivacyStatement:"\u767b\u5f55\u9700\u8981\u91c7\u7528\u60a8\u7684\u8c37\u6b4cID\u5efa\u7acb\u6216\u8fdb\u5165\u60a8\u7684\u963f\u62c9\u4e01\u8d26\u6237\u3002 \u6211\u4eec\u53ea\u50a8\u5b58\u4e00\u4e2a\u968f\u673a\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a\u60a8\u7684ID\u3002 \u4efb\u4f55\u5173\u4e8e\u60a8\u7684\u53ef\u8fa8\u8bc6\u7684\u4e2a\u4eba\u4fe1\u606f\u90fd\u6ca1\u6709\u88ab\u6536\u96c6\u3002 \u8be6\u60c5\u8bf7\u53c2\u8003\u6211\u4eec\u7684",SignIn:"\u767b\u5f55",SignOut:"\u9000\u51fa\u8d26\u53f7",IfYouAreAStudent:"\u5982\u679c\u60a8\u662f\u4e00\u4e2a\u5b66\u751f"},skyMenu:{Axes:"\u663e\u793a\u5750\u6807\u8f74",Theme:"\u73af\u5883\u4e3b\u9898",ThemeDefault:"\u9ed8\u8ba4",ThemeDesert:"\u6c99\u6f20",ThemeDune:"\u6c99\u4e18",ThemeForest:"\u68ee\u6797",ThemeGrassland:"\u8349\u539f",ThemeHill:"\u4e18\u9675",ThemeLake:"\u6e56\u6cca",ThemeMountain:"\u5c71\u8109",ThemeRural:"\u7530\u56ed",SunlightAttenuationCoefficientInAir:"\u9633\u5149\u5728\u7a7a\u6c14\u4e2d\u4f20\u64ad\u7684\u8870\u51cf\u7cfb\u6570",ConvectiveCoefficientOfAir:"\u7a7a\u6c14\u5bf9\u6d41\u4f20\u70ed\u7cfb\u6570",HighestTemperatureTimeInMinutes:"\u6700\u9ad8\u6c14\u6e29\u65f6\u95f4(\u5206\u949f)",SelectSunAnglesToShow:"\u9009\u62e9\u592a\u9633\u89d2\u5ea6\u663e\u793a",ShowAzimuthAngle:"\u663e\u793a\u65b9\u4f4d\u89d2",ShowElevationAngle:"\u663e\u793a\u9ad8\u5ea6\u89d2",ShowZenithAngle:"\u663e\u793a\u5929\u9876\u89d2",DirectLightBrightnessAtNoon:"\u6b63\u5348\u76f4\u5c04\u5149\u7167\u5ea6",AmbientLightBrightnessAtNoon:"\u6b63\u5348\u73af\u5883\u5149\u7167\u5ea6"},groundMenu:{MonthlyIrradianceLoss:"\u6708\u4efd\u8f90\u5c04\u5ea6\u635f\u5931\u6bd4",Vegetation:"\u690d\u88ab",LeafOutDay:"\u6811\u53f6\u957f\u51fa\u7684\u65e5\u5b50",LeafOffDay:"\u6811\u53f6\u8131\u843d\u7684\u65e5\u5b50",Albedo:"\u53cd\u7167\u7387",ImageOnGround:"\u5730\u9762\u663e\u793a\u56fe\u50cf",WaterSurface:"\u6c34\u9762",RemoveAllUnlockedTrees:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728",RemoveAllUnlockedFlowers:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedPeople:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedFoundations:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5730\u57fa",RemoveAllUnlockedCuboids:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u957f\u65b9\u4f53",DoYouReallyWantToRemoveAllPeople:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u5417",DoYouReallyWantToRemoveAllTrees:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728\u5417",DoYouReallyWantToRemoveAllFlowers:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u5417",DoYouReallyWantToRemoveAllSolarPanels:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",DoYouReallyWantToRemoveAllFoundations:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5730\u57fa\u5417",DoYouReallyWantToRemoveAllCuboids:"\u4f60\u786e\u5b9a\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u957f\u65b9\u4f53\u5417",LockAllElements:"\u56fa\u5b9a\u6240\u6709\u7684\u90e8\u4ef6",UnlockAllElements:"\u89e3\u9664\u6240\u6709\u7684\u56fa\u5b9a"},labelSubMenu:{Label:"\u6807\u7b7e",LabelText:"\u6807\u7b7e\u7684\u5185\u5bb9",LabelHeight:"\u6807\u7b7e\u7684\u9ad8\u5ea6",LabelSize:"\u6807\u7b7e\u7684\u5927\u5c0f",LabelFontSize:"\u5b57\u4f53\u7684\u5927\u5c0f",LabelColor:"\u6807\u7b7e\u7684\u989c\u8272",KeepShowingLabel:"\u663e\u793a\u6807\u7b7e"},foundationMenu:{RemoveAllUnlockedSolarPanels:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedParabolicTroughs:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u629b\u7269\u7ebf\u69fd",RemoveAllUnlockedParabolicDishes:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u629b\u7269\u7ebf\u789f",RemoveAllUnlockedFresnelReflectors:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c",RemoveAllUnlockedHeliostats:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5b9a\u65e5\u955c",RemoveAllUnlockedSensors:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668",RemoveAllUnlockedLights:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f",RemoveAllUnlockedWalls:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5899",RemoveAllUnlockedWindows:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6237",RemoveAllUnlockedDoors:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u95e8",RemoveAllUnlockedPolygons:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62",RemoveAllUnlockedHumans:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedTrees:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728",RemoveAllUnlockedFlowers:"\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",Racks:"\u652f\u67b6",Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",SolarPanels:"\u5149\u4f0f\u677f",SolarPanelArray:"\u5149\u4f0f\u677f\u9635\u5217",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",ParabolicTroughs:"\u629b\u7269\u7ebf\u69fd",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u629b\u7269\u7ebf\u69fd\u5417",ParabolicDishes:"\u629b\u7269\u7ebf\u789f",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u629b\u7269\u7ebf\u789f\u5417",FresnelReflectors:"\u83f2\u6d85\u8033\u53cd\u5c04\u955c",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u5417",Heliostats:"\u5b9a\u65e5\u955c",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5b9a\u65e5\u955c\u5417",Sensors:"\u4f20\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668\u5417",Lights:"\u7535\u706f",DoYouReallyWantToRemoveAllLightsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f\u5417",Walls:"\u5899",DoYouReallyWantToRemoveAllWallsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5899\u5417",Windows:"\u7a97\u6237",DoYouReallyWantToRemoveAllWindowsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6237\u5417",Doors:"\u95e8",DoYouReallyWantToRemoveAllDoorsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u95e8\u5417",Polygons:"\u591a\u8fb9\u5f62",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62\u5417",Humans:"\u4eba\u7269",DoYouReallyWantToRemoveAllHumansOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u5417",Trees:"\u6811\u6728",DoYouReallyWantToRemoveAllTreesOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728\u5417",Flowers:"\u82b1\u8349",DoYouReallyWantToRemoveAllFlowersOnFoundation:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u5417",OnlyThisFoundation:"\u53ea\u8fd9\u5757\u5730\u57fa",AllSelectedFoundations:"\u6240\u6709\u9009\u4e2d\u7684\u5730\u57fa",AllConnectedFoundations:"\u6240\u6709\u76f8\u8fde\u7684\u5730\u57fa",AllFoundations:"\u6240\u6709\u7684\u5730\u57fa",AddPolygon:"\u6dfb\u52a0\u591a\u8fb9\u5f62",SolarStructure:"\u592a\u9633\u80fd\u6784\u578b",GroupMaster:"\u4e3b\u5730\u57fa",LockAllElementsOnThisFoundation:"\u56fa\u5b9a\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u7684\u90e8\u4ef6",UnlockAllElementsOnThisFoundation:"\u89e3\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u7684\u56fa\u5b9a",GroundFloorRValue:"\u5efa\u7b51\u7269\u5730\u677f\u7684R\u503c",OnlyThisGroundFloor:"\u53ea\u8fd9\u4e2a\u5efa\u7b51\u7269\u7684\u5730\u677f",AllGroundFloors:"\u6240\u6709\u5efa\u7b51\u7269\u7684\u5730\u677f"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"\u548c\u5b9a\u65e5\u955c\u914d\u5957\u7684\u5438\u6536\u5854",ReceiverTowerPhysicalProperties:"\u592a\u9633\u80fd\u5438\u6536\u5854\u7684\u7269\u7406\u6027\u8d28",ReceiverTowerHeight:"\u592a\u9633\u80fd\u5438\u6536\u5854\u7684\u9ad8\u5ea6",ReceiverTowerRadius:"\u592a\u9633\u80fd\u5438\u6536\u5854\u7684\u534a\u5f84",ReceiverAbsorptance:"\u592a\u9633\u80fd\u5438\u6536\u5668\u7684\u5438\u6536\u7387",ReceiverOpticalEfficiency:"\u592a\u9633\u80fd\u5438\u6536\u5668\u7684\u5149\u6548\u7387",ReceiverThermalEfficiency:"\u592a\u9633\u80fd\u5438\u6536\u5668\u7684\u70ed\u6548\u7387"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"\u548c\u83f2\u6d85\u5c14\u53cd\u5c04\u955c\u914d\u5957\u7684\u5438\u6536\u7ba1",AbsorberPipePhysicalProperties:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u7269\u7406\u6027\u8d28",AbsorberHeight:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u5b89\u88c5\u9ad8\u5ea6",AbsorberApertureWidth:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u5b54\u5f84",AbsorberPipePoleNumber:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u652f\u67f1\u6570\u91cf",AbsorberAbsorptance:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u5438\u6536\u7387",AbsorberOpticalEfficiency:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u5149\u6548\u7387",AbsorberThermalEfficiency:"\u592a\u9633\u80fd\u5438\u6536\u7ba1\u7684\u70ed\u6548\u7387"},solarUpdraftTowerMenu:{SolarUpdraftTower:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854",SolarUpdraftTowerPhysicalProperties:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u7684\u7269\u7406\u6027\u8d28",SolarUpdraftTowerChimneyHeight:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u70df\u56f1\u7684\u9ad8\u5ea6",SolarUpdraftTowerChimneyRadius:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u70df\u56f1\u7684\u534a\u5f84",SolarUpdraftTowerCollectorHeight:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u96c6\u70ed\u68da\u7684\u9ad8\u5ea6",SolarUpdraftTowerCollectorRadius:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u96c6\u70ed\u68da\u7684\u534a\u5f84",SolarUpdraftTowerCollectorTransmissivity:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u96c6\u70ed\u68da\u7684\u900f\u5c04\u7387",SolarUpdraftTowerCollectorEmissivity:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u96c6\u70ed\u68da\u7684\u53d1\u5c04\u7387",SolarUpdraftTowerDischargeCoefficient:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u7684\u6d41\u91cf\u7cfb\u6570",SolarUpdraftTowerTurbineEfficiency:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u7684\u6da1\u8f6e\u673a\u6548\u7387"},cuboidMenu:{Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedSensors:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668",RemoveAllUnlockedPolygons:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62",RemoveAllUnlockedHumans:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedTrees:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728",RemoveAllUnlockedFlowers:"\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",Racks:"\u652f\u67b6",SolarPanels:"\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",Sensors:"\u4f20\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668\u5417",Polygons:"\u591a\u8fb9\u5f62",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62\u5417",Humans:"\u4eba\u7269",DoYouReallyWantToRemoveAllHumansOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u5417",Trees:"\u6811\u6728",DoYouReallyWantToRemoveAllTreesOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6811\u6728\u5417",Flowers:"\u82b1\u8349",DoYouReallyWantToRemoveAllFlowersOnCuboid:"\u4f60\u786e\u5b9a\u5220\u9664\u6b64\u957f\u65b9\u4f53\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u5417",OnlyThisCuboid:"\u53ea\u8fd9\u4e2a\u957f\u65b9\u4f53",AllCuboidsOnSameSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u957f\u65b9\u4f53",AllCuboidsAboveSameBase:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u957f\u65b9\u4f53",AllSelectedCuboids:"\u6240\u6709\u9009\u4e2d\u7684\u957f\u65b9\u4f53",AllCuboids:"\u6240\u6709\u7684\u957f\u65b9\u4f53",OnlyThisSide:"\u53ea\u8fd9\u4e2a\u8868\u9762",AllSidesOfThisCuboid:"\u8fd9\u4e2a\u957f\u65b9\u4f53\u6240\u6709\u7684\u4fa7\u9762",AllSidesOfSelectedCuboids:"\u6240\u6709\u9009\u4e2d\u957f\u65b9\u4f53\u6240\u6709\u7684\u4fa7\u9762",AllSidesOfAllCuboids:"\u6240\u6709\u7684\u957f\u65b9\u4f53\u6240\u6709\u7684\u4fa7\u9762",AddPolygon:"\u6dfb\u52a0\u591a\u8fb9\u5f62",Stackable:"\u53ef\u5806\u780c",GroupMaster:"\u4e3b\u957f\u65b9\u4f53"},polygonMenu:{Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",TextBox:"\u6587\u5b57\u6846",FontOutlineColor:"\u5b57\u4f53\u8f6e\u5ed3\u989c\u8272",FontOutlineWidth:"\u5b57\u4f53\u8f6e\u5ed3\u7ebf\u5bbd",FontStrokeColor:"\u5b57\u4f53\u63cf\u8fb9\u989c\u8272",FontStrokeWidth:"\u5b57\u4f53\u63cf\u8fb9\u7ebf\u5bbd",NoOutline:"\u65e0\u8f6e\u5ed3\u7ebf",Shiny:"\u5149\u6cfd",Filled:"\u586b\u5145",FillTexture:"\u586b\u5145\u6750\u8d28",FillColor:"\u586b\u5145\u989c\u8272",Opacity:"\u906e\u5149\u5ea6",LineColor:"\u7ebf\u6761\u989c\u8272",LineWidth:"\u7ebf\u6761\u5bbd\u5ea6",LineStyle:"\u7ebf\u6761\u6837\u5f0f",SolidLine:"\u5b9e\u7ebf",DashedLine:"\u865a\u7ebf",DottedLine:"\u70b9\u7ebf",InsertVertexBeforeIndex:"\u524d\u9762\u63d2\u5165\u9876\u70b9",InsertVertexAfterIndex:"\u540e\u9762\u63d2\u5165\u9876\u70b9",DeleteVertex:"\u79fb\u9664\u9876\u70b9",OnlyThisPolygon:"\u53ea\u8fd9\u4e2a\u591a\u8fb9\u5f62",AllPolygonsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u591a\u8fb9\u5f62",AllPolygonsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u591a\u8fb9\u5f62",AllSelectedPolygons:"\u6240\u6709\u9009\u4e2d\u7684\u591a\u8fb9\u5f62",AllPolygons:"\u6240\u6709\u7684\u591a\u8fb9\u5f62",Layout:"\u5e03\u5c40",SolarPanelArrayLayout:"\u5149\u4f0f\u677f\u9635\u5217\u5e03\u5c40",SolarPanelArrayLayoutParametricDesign:"\u5149\u4f0f\u677f\u9635\u5217\u5e03\u5c40\u53c2\u6570\u5316\u8bbe\u8ba1",SolarPanelArrayLayoutGenerativeDesign:"\u5149\u4f0f\u677f\u9635\u5217\u5e03\u5c40\u751f\u6210\u5f0f\u8bbe\u8ba1",SolarPanelArrayModel:"\u5149\u4f0f\u677f\u578b\u53f7",SolarPanelArrayOrientation:"\u6392\u5217\u65b9\u5411",SolarPanelArrayTiltAngle:"\u503e\u659c\u89d2\u5ea6",SolarPanelArrayRowWidth:"\u884c\u5bbd\u5ea6",SolarPanelArrayInterRowSpacing:"\u884c\u95f4\u8ddd",SolarPanelArrayRowSpacing:"\u884c\u95f4\u8ddd",SolarPanelArrayRowAxis:"\u884c\u8f74\u65b9\u5411",SolarPanelArrayLeftRightRowAxis:"\u5de6\u53f3\u65b9\u5411(\u76f8\u5bf9)",SolarPanelArrayUpDownRowAxis:"\u4e0a\u4e0b\u65b9\u5411(\u76f8\u5bf9)",SolarPanelArrayEastWestRowAxis:"\u4e1c\u897f\u65b9\u5411(\u7edd\u5bf9)",SolarPanelArrayNorthSouthRowAxis:"\u5357\u5317\u65b9\u5411(\u7edd\u5bf9)",SolarPanelArrayMargin:"\u8fb9\u7f18\u4f59\u5730",SolarPanelArrayPoleHeight:"\u652f\u67b6\u9ad8\u5ea6",SolarPanelArrayPoleSpacing:"\u652f\u67f1\u95f4\u9694",SolarPanelArrayTotalYearlyCost:"\u5168\u5e74\u603b\u6210\u672c",SolarPanelArrayTotalYearlyRevenue:"\u5168\u5e74\u603b\u6536\u5165",SolarPanelArrayTotalYearlyYield:"\u5168\u5e74\u603b\u53d1\u7535\u91cf",SolarPanelArrayMeanYearlyYield:"\u5e73\u5747\u5e74\u53d1\u7535\u91cf",SolarPanelArrayYearlyProfit:"\u5168\u5e74\u5229\u6da6",LayoutNotAcceptedCheckYourParameters:"\u6055\u4e0d\u80fd\u91c7\u7528\u6b64\u5e03\u5c40\u3002\u8bf7\u68c0\u67e5\u60a8\u7684\u53c2\u6570\u8bbe\u7f6e\u3002"},optimizationMenu:{Optimization:"\u4f18\u5316",Parameters:"\u53c2\u6570",Variables:"\u53d8\u91cf",Constants:"\u5e38\u91cf",GeneticAlgorithm:"\u9057\u4f20\u7b97\u6cd5",GeneticAlgorithmSettings:"\u9057\u4f20\u7b97\u6cd5\u8bbe\u5b9a",ParticleSwarmOptimization:"\u7c92\u5b50\u7fa4\u4f18\u5316",ParticleSwarmOptimizationSettings:"\u7c92\u5b50\u7fa4\u4f18\u5316\u8bbe\u5b9a",SolarPanelTiltAngleOptimization:"\u5149\u4f0f\u677f\u503e\u659c\u89d2\u5ea6\u4f18\u5316",SolarPanelArrayLayout:"\u5149\u4f0f\u677f\u9635\u5217\u5e03\u5c40",Generation:"\u4e16\u4ee3",Gene:"\u57fa\u56e0",NormalizedVariables:"\u6807\u51c6\u5316\u53d8\u91cf",Objective:"\u76ee\u6807\u51fd\u6570",ObjectiveFunctionDailyTotalYield:"\u5f53\u65e5\u603b\u4ea7\u51fa",ObjectiveFunctionYearlyTotalYield:"\u5168\u5e74\u603b\u4ea7\u51fa",ObjectiveFunctionDailyMeanYield:"\u5f53\u65e5\u5e73\u5747\u4ea7\u51fa",ObjectiveFunctionYearlyMeanYield:"\u5168\u5e74\u5e73\u5747\u4ea7\u51fa",ObjectiveFunctionDailyProfit:"\u5f53\u65e5\u5229\u6da6",ObjectiveFunctionYearlyProfit:"\u5168\u5e74\u5229\u6da6",GeneticAlgorithmSelectionMethod:"\u9057\u4f20\u7b97\u6cd5\u9009\u62e9\u65b9\u6cd5",RouletteWheel:"\u8f6e\u76d8\u5236",Tournament:"\u6dd8\u6c70\u5236",SearchMethod:"\u641c\u7d22\u65b9\u6cd5",GlobalSearchUniformSelection:"\u5168\u5c40\u641c\u7d22\u5747\u5300\u53d6\u6837",LocalSearchRandomOptimization:"\u5c40\u90e8\u641c\u7d22\u968f\u673a\u4f18\u5316",PopulationSize:"\u79cd\u7fa4\u4e2a\u4f53\u6570\u76ee",MaximumGenerations:"\u6700\u5927\u4e16\u4ee3\u6570\u76ee",SelectionRate:"\u9009\u62e9\u6982\u7387",CrossoverRate:"\u4ea4\u914d\u6982\u7387",MutationRate:"\u7a81\u53d8\u6982\u7387",Step:"\u6b65\u6570",SwarmSize:"\u7c92\u5b50\u6570\u76ee",MaximumSteps:"\u6700\u5927\u6b65\u6570",MaximumVelocity:"\u6700\u5927\u901f\u5ea6",InertiaWeight:"\u60ef\u6027\u6743\u91cd",CognitiveCoefficient:"\u8ba4\u77e5\u7cfb\u6570",SocialCoefficient:"\u793e\u4f1a\u7cfb\u6570",ConvergenceThreshold:"\u7ec8\u6b62\u6761\u4ef6\u7684\u6536\u655b\u9608\u503c",LocalSearchRadius:"\u5c40\u90e8\u641c\u7d22\u7684\u534a\u5f84",RowsPerRackRange:"\u5355\u4e2a\u652f\u67b6\u4e0a\u5149\u4f0f\u677f\u884c\u6570\u7684\u53d8\u5316\u8303\u56f4",TiltAngleRange:"\u5149\u4f0f\u677f\u503e\u659c\u89d2\u5ea6\u7684\u53d8\u5316\u8303\u56f4",InterRowSpacingRange:"\u5149\u4f0f\u677f\u9635\u5217\u884c\u95f4\u8ddd\u7684\u53d8\u5316\u8303\u56f4",ClickTargetPolygonToActivate:"\u70b9\u51fb\u76ee\u6807\u591a\u8fb9\u5f62\u6fc0\u6d3b",ClickTargetFoundationToActivate:"\u70b9\u51fb\u76ee\u6807\u5730\u57fa\u6fc0\u6d3b"},treeMenu:{ShowModel:"\u663e\u793a\u8fd1\u4f3c\u6a21\u578b",Flip:"\u7ffb\u8f6c",Type:"\u6811\u79cd",Spread:"\u6811\u51a0\u76f4\u5f84"},flowerMenu:{Flip:"\u7ffb\u8f6c",Type:"\u54c1\u79cd",Spread:"\u76f4\u5f84"},peopleMenu:{ChangePerson:"\u6539\u53d8\u4eba\u7269",Flip:"\u8f6c\u8eab",Observer:"\u89c2\u5bdf\u8005",ViewFromThisPerson:"\u89c6\u89d2\u79fb\u5230\u6b64\u4eba\u4f4d\u7f6e"},lightMenu:{Color:"\u989c\u8272",Intensity:"\u4eae\u5ea6",Decay:"\u8870\u51cf",MaximumDistance:"\u6700\u5927\u8ddd\u79bb",Inside:"\u5185\u90e8"},solarCollectorMenu:{RelativeAzimuth:"\u76f8\u5bf9\u65b9\u4f4d\u89d2",Pole:"\u652f\u67f1",PoleHeight:"\u652f\u67f1\u9ad8\u5ea6",PoleRadius:"\u652f\u67f1\u534a\u5f84",ExtraPoleHeight:"\u989d\u5916\u7684\u652f\u67f1\u9ad8\u5ea6",ExtraPoleHeightInAdditionToHalfWidth:"\u5bbd\u5ea6\u4e00\u534a\u989d\u5916\u7684\u652f\u67f1\u9ad8\u5ea6",DrawSunBeam:"\u663e\u793a\u5149\u675f"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"\u53cd\u5c04\u5668\u955c\u9762\u53cd\u5c04\u7387",ReceiverAbsorptance:"\u63a5\u6536\u5668\u5438\u6536\u7387",ReflectorOpticalEfficiency:"\u53cd\u5c04\u5668\u5149\u6548\u7387",ReceiverThermalEfficiency:"\u63a5\u6536\u5668\u70ed\u6548\u7387"},solarPanelMenu:{InverterEfficiency:"\u9006\u53d8\u5668\u6548\u7387",InverterEfficiencyExplained:"\u76f4\u6d41\u7535\u8f6c\u6362\u4e3a\u4ea4\u6d41\u7535\u7684\u6548\u7387\u3002",DcToAcSizeRatio:"\u76f4\u6d41-\u4ea4\u6d41\u5bb9\u91cf\u6bd4\u4f8b",DcToAcSizeRatioExplained:"\u76f4\u6d41\u7535\u5bb9\u91cf\u548c\u4ea4\u6d41\u7535\u5bb9\u91cf\u7684\u6bd4\u4f8b\u3002",ChangePvModel:"\u6539\u53d8\u5149\u4f0f\u677f\u578b\u53f7",Orientation:"\u6392\u5217\u65b9\u5411",Portrait:"\u7eb5\u5411",Landscape:"\u6a6b\u5411",FrameColor:"\u6846\u67b6\u989c\u8272",Panels:"\u5757",PanelsWide:"\u5757\u5149\u4f0f\u677f\u5bbd",PanelsLong:"\u5757\u5149\u4f0f\u677f\u957f",TiltAngle:"\u503e\u659c\u89d2\u5ea6",SouthFacingIsPositive:"\u671d\u5357\u4e3a\u6b63",Tracker:"\u8ffd\u65e5\u7cfb\u7edf",SolarTrackerFollowsSun:"\u8ffd\u65e5\u7cfb\u7edf\u63d0\u9ad8\u5149\u4f0f\u677f\u4ea7\u51fa\u3002",PoleSpacing:"\u652f\u67f1\u95f4\u9694",NoTracker:"\u65e0\u8ffd\u65e5\u7cfb\u7edf",HorizontalSingleAxisTracker:"\u6c34\u5e73\u5355\u8f74\u8ffd\u65e5\u7cfb\u7edf",VerticalSingleAxisTracker:"\u7ad6\u76f4\u5355\u8f74\u8ffd\u65e5\u7cfb\u7edf",AltazimuthDualAxisTracker:"\u5730\u5e73\u53cc\u8f74\u8ffd\u65e5\u7cfb\u7edf",OnlyThisSolarPanel:"\u53ea\u8fd9\u4e2a\u5149\u4f0f\u677f",AllSolarPanelsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u5149\u4f0f\u677f",AllSolarPanelsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5149\u4f0f\u677f",AllSelectedSolarPanels:"\u6240\u6709\u9009\u4e2d\u7684\u5149\u4f0f\u677f",AllSolarPanels:"\u6240\u6709\u7684\u5149\u4f0f\u677f"},pvModelPanel:{SolarPanelSpecs:"\u5149\u4f0f\u677f\u578b\u53f7\u6027\u80fd",Model:"\u578b\u53f7",PanelSize:"\u5c3a\u5bf8",Cells:"\u7535\u6c60\u7d44",CellType:"\u5149\u4f0f\u7535\u6c60\u7c7b\u578b",Monocrystalline:"\u5355\u6676\u7845",Polycrystalline:"\u591a\u6676\u7845",ThinFilm:"\u8584\u819c",Bifacial:"\u53cc\u9762",BifacialityFactor:"\u53cc\u9762\u6027\u56e0\u5b50",Black:"\u9ed1\u8272",Blue:"\u84dd\u8272",ShadeTolerance:"\u9634\u5f71\u8010\u53d7\u5ea6",SolarCellEfficiency:"\u5149\u4f0f\u7535\u6c60\u6548\u7387",NominalOperatingCellTemperature:"\u540d\u4e49\u7535\u6c60\u8fd0\u884c\u6e29\u5ea6",TemperatureCoefficientOfPmax:"Pmax\u6e29\u5ea6\u7cfb\u6570"},parabolicTroughMenu:{ModuleLength:"\u6a21\u5757\u957f\u5ea6",Modules:"\u6a21\u5757",ModulesLong:"\u6a21\u5757\u957f",LatusRectum:"\u901a\u5f84",OnlyThisParabolicTrough:"\u53ea\u8fd9\u4e2a\u629b\u7269\u7ebf\u69fd",AllParabolicTroughsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u629b\u7269\u7ebf\u69fd",AllSelectedParabolicTroughs:"\u6240\u6709\u9009\u4e2d\u7684\u629b\u7269\u7ebf\u69fd",AllParabolicTroughs:"\u6240\u6709\u7684\u629b\u7269\u7ebf\u69fd"},fresnelReflectorMenu:{AbsorberPipe:"\u5438\u6536\u7ba1",SelectAbsorberToReflectSunlightTo:"\u9009\u62e9\u9633\u5149\u53cd\u5c04\u5230\u7684\u5438\u6536\u7ba1",ModuleLength:"\u6a21\u5757\u957f\u5ea6",Modules:"\u6a21\u5757",ModulesLong:"\u6a21\u5757\u957f",OnlyThisFresnelReflector:"\u53ea\u8fd9\u4e2a\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AllFresnelReflectorsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AllSelectedFresnelReflectors:"\u6240\u6709\u9009\u4e2d\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AllFresnelReflectors:"\u6240\u6709\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c"},heliostatMenu:{Tower:"\u5438\u6536\u5854",SelectTowerToReflectSunlightTo:"\u9009\u62e9\u9633\u5149\u53cd\u5c04\u5230\u7684\u5438\u6536\u5854",OnlyThisHeliostat:"\u53ea\u8fd9\u4e2a\u5b9a\u65e5\u955c",AllHeliostatsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5b9a\u65e5\u955c",AllSelectedHeliostats:"\u6240\u6709\u9009\u4e2d\u7684\u5b9a\u65e5\u955c",AllHeliostats:"\u6240\u6709\u7684\u5b9a\u65e5\u955c"},parabolicDishMenu:{ReceiverStructure:"\u63a5\u6536\u5668\u7ed3\u6784",CentralPole:"\u4e2d\u5fc3\u76f4\u67f1",CentralPoleWithTripod:"\u4e09\u811a\u67b6\u548c\u4e2d\u5fc3\u76f4\u67f1",Quadrupod:"\u56db\u811a\u67b6",RimDiameter:"\u5916\u5708\u76f4\u5f84",LatusRectum:"\u901a\u5f84",ExtraPoleHeightInAdditionToRadius:"\u534a\u5f84\u4e4b\u5916\u989d\u5916\u7684\u652f\u67b6\u9ad8\u5ea6",OnlyThisParabolicDish:"\u53ea\u8fd9\u4e2a\u629b\u7269\u7ebf\u789f",AllParabolicDishesAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u629b\u7269\u7ebf\u789f",AllSelectedParabolicDishes:"\u6240\u6709\u9009\u4e2d\u7684\u629b\u7269\u7ebf\u789f",AllParabolicDishes:"\u6240\u6709\u7684\u629b\u7269\u7ebf\u789f"},wallMenu:{TextureDefault:"\u9ed8\u8ba4\u6750\u8d28",Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",SizeOfWall:"\u5899\u7684\u5c3a\u5bf8",OnlyThisWall:"\u53ea\u8fd9\u5835\u5899",AllConnectedWalls:"\u6240\u6709\u8fde\u63a5\u7684\u5899",AllWallsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5899",AllSelectedWalls:"\u6240\u6709\u9009\u4e2d\u7684\u5899",AllWalls:"\u6240\u6709\u7684\u5899",Windows:"\u7a97\u6237",LockAllWindows:"\u56fa\u5b9a\u6240\u6709\u7684\u7a97\u6237",UnlockAllWindows:"\u89e3\u9664\u6240\u6709\u7684\u7a97\u6237\u56fa\u5b9a",RemoveAllUnlockedWindows:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6237",DoYouReallyWantToRemoveAllWindowsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6237\u5417",Doors:"\u95e8",RemoveAllUnlockedDoors:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u95e8",DoYouReallyWantToRemoveAllDoorsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u95e8\u5417",SolarPanels:"\u5149\u4f0f\u677f",LockAllSolarPanels:"\u56fa\u5b9a\u6240\u6709\u7684\u5149\u4f0f\u677f",UnlockAllSolarPanels:"\u89e3\u9664\u6240\u6709\u7684\u5149\u4f0f\u677f\u56fa\u5b9a",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",Sensors:"\u4f20\u611f\u5668",LockAllSensors:"\u56fa\u5b9a\u6240\u6709\u7684\u4f20\u611f\u5668",UnlockAllSensors:"\u89e3\u9664\u6240\u6709\u7684\u4f20\u611f\u5668\u56fa\u5b9a",RemoveAllUnlockedSensors:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668\u5417",Lights:"\u7535\u706f",RemoveAllUnlockedLights:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f",DoYouReallyWantToRemoveAllLightsOnThisWall:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f\u5417",LockAllPolygons:"\u56fa\u5b9a\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u7684\u591a\u8fb9\u5f62",UnlockAllPolygons:"\u89e3\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u7684\u591a\u8fb9\u5f62\u56fa\u5b9a",RemoveAllUnlockedPolygons:"\u5220\u9664\u8fd9\u5835\u5899\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u8fb9\u5f62",WallStructure:"\u5899\u7ed3\u6784",DefaultStructure:"\u9ed8\u8ba4",StudStructure:"\u5899\u67f1",PillarStructure:"\u5706\u67f1",Opacity:"\u906e\u5149\u5ea6",StructureSpacing:"\u7ed3\u6784\u95f4\u8ddd",StructureWidth:"\u7ed3\u6784\u5bbd\u5ea6",StructureThickness:"\u7ed3\u6784\u539a\u5ea6",StructureColor:"\u7ed3\u6784\u989c\u8272",Color:"\u7246\u4f53\u989c\u8272",Height:"\u9ad8\u5ea6",Thickness:"\u539a\u5ea6",Texture:"\u6750\u8d28",AllLightsOnWallInside:"\u6240\u6709\u7535\u706f\u5728\u7246\u5185",AllLightsOnWallOutside:"\u6240\u6709\u7535\u706f\u5728\u7246\u5916",Fill:"\u586b\u5145",Full:"\u5168\u90e8",Partial:"\u90e8\u5206",Empty:"\u7a7a\u767d",OpenToOutside:"\u5bf9\u5916\u9762\u5f00\u653e",EavesLength:"\u5c4b\u6a90\u5ef6\u4f38\u957f\u5ea6",Parapet:"\u5973\u5899",ParapetColor:"\u5973\u5899\u989c\u8272",ParapetTexture:"\u5973\u5899\u6750\u8d28",ParapetHeight:"\u5973\u5899\u9ad8\u5ea6",CopingsHeight:"\u9876\u76d6\u9ad8\u5ea6",CopingsWidth:"\u9876\u76d6\u5bbd\u5ea6"},windowMenu:{OnlyThisWindow:"\u53ea\u8fd9\u4e2a\u7a97\u6237",AllWindowsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u7a97\u6237",AllWindowsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u7a97\u6237",AllSelectedWindows:"\u6240\u6709\u9009\u4e2d\u7684\u7a97\u6237",AllWindows:"\u6240\u6709\u7684\u7a97\u6237",Width:"\u5bbd\u5ea6",Height:"\u9ad8\u5ea6",Setback:"\u79bb\u5899\u4f53\u5916\u8868\u9762\u7684\u8ddd\u79bb",RelativeToWallThickness:"\u76f8\u5bf9\u4e8e\u5899\u7684\u539a\u5ea6",Mullion:"\u76f4\u68c2",HorizontalMullion:"\u6c34\u5e73\u7684\u76f4\u68c2",VerticalMullion:"\u7ad6\u76f4\u7684\u76f4\u68c2",MullionWidth:"\u76f4\u68c2\u5bbd\u5ea6",HorizontalMullionSpacing:"\u6c34\u5e73\u76f4\u68c2\u7684\u95f4\u8ddd",VerticalMullionSpacing:"\u7ad6\u76f4\u76f4\u68c2\u7684\u95f4\u8ddd",MullionColor:"\u76f4\u68c2\u989c\u8272",Tint:"\u7740\u8272",Opacity:"\u4e0d\u900f\u660e\u5ea6",SolarHeatGainCoefficient:"\u592a\u9633\u8f90\u5c04\u70ed\u83b7\u53d6\u7cfb\u6570(SHGC) = 1 - \u4e0d\u900f\u660e\u5ea6",Shutter:"\u767e\u53f6\u7a97",LeftShutter:"\u5de6\u4fa7\u767e\u53f6\u7a97",RightShutter:"\u53f3\u4fa7\u767e\u53f6\u7a97",BothShutters:"\u4e24\u4fa7\u767e\u53f6\u7a97",ShutterWidth:"\u76f8\u5bf9\u5bbd\u5ea6",ShutterColor:"\u767e\u53f6\u7a97\u989c\u8272",Frame:"\u8fb9\u6846",FrameWidth:"\u8fb9\u6846\u5bbd\u5ea6",SillWidth:"\u7a97\u53f0\u5bbd\u5ea6",Color:"\u8fb9\u6846\u989c\u8272",WindowType:"\u7a97\u6237\u79cd\u7c7b",Default:"\u9ed8\u8ba4",Arched:"\u62f1\u5f62",Polygonal:"\u591a\u8fb9\u5f62",Interior:"\u5185\u7a97",Empty:"\u7a7a\u767d"},roofMenu:{TextureDefault:"\u9ed8\u8ba4\u6750\u8d28",Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",OnlyThisRoof:"\u53ea\u8fd9\u4e2a\u5c4b\u9876",AllRoofsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5c4b\u9876",AllSelectedRoofs:"\u6240\u6709\u9009\u4e2d\u7684\u5c4b\u9876",AllRoofs:"\u6240\u6709\u7684\u5c4b\u9876",OnlyThisCeiling:"\u53ea\u8fd9\u4e2a\u5929\u82b1\u677f",AllCeilingsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5929\u82b1\u677f",AllCeilings:"\u6240\u6709\u7684\u5929\u82b1\u677f",EavesOverhangLength:"\u5c4b\u6a90\u5ef6\u4f38\u957f\u5ea6",RafterSpacing:"\u5c4b\u693d\u95f4\u8ddd",RafterWidth:"\u5c4b\u693d\u5bbd\u5ea6",RafterThickness:"\u5c4b\u693d\u539a\u5ea6",RafterColor:"\u5c4b\u693d\u989c\u8272",RoofColor:"\u5c4b\u9876\u989c\u8272",RoofSideColor:"\u5c4b\u9876\u4fa7\u9762\u989c\u8272",GlassTint:"\u73bb\u7483\u989c\u8272",Opacity:"\u906e\u5149\u5ea6",RoofStructure:"\u5c4b\u9876\u7ed3\u6784",DefaultStructure:"\u9ed8\u8ba4",RafterStructure:"\u5c4b\u693d",GlassStructure:"\u73bb\u7483",SolarPanels:"\u5149\u4f0f\u677f",LockAllSolarPanels:"\u56fa\u5b9a\u6240\u6709\u7684\u5149\u4f0f\u677f",UnlockAllSolarPanels:"\u89e3\u9664\u6240\u6709\u7684\u5149\u4f0f\u677f\u56fa\u5b9a",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u5417",Windows:"\u5929\u7a97",LockAllWindows:"\u56fa\u5b9a\u6240\u6709\u7684\u5929\u7a97",UnlockAllWindows:"\u89e3\u9664\u6240\u6709\u7684\u5929\u7a97\u56fa\u5b9a",RemoveAllUnlockedWindows:"\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5929\u7a97",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5929\u7a97\u5417",Sensors:"\u4f20\u611f\u5668",LockAllSensors:"\u56fa\u5b9a\u6240\u6709\u7684\u4f20\u611f\u5668",UnlockAllSensors:"\u89e3\u9664\u6240\u6709\u7684\u4f20\u611f\u5668\u56fa\u5b9a",RemoveAllUnlockedSensors:"\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4f20\u611f\u5668\u5417",Lights:"\u7535\u706f",RemoveAllUnlockedLights:"\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f",DoYouReallyWantToRemoveAllLightsOnThisRoof:"\u4f60\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7535\u706f\u5417",AllLightsOnRoofInside:"\u6240\u6709\u7535\u706f\u5728\u5c4b\u9876\u5185",AllLightsOnRoofOutside:"\u6240\u6709\u7535\u706f\u5728\u5c4b\u9876\u5916",Rise:"\u76f8\u5bf9\u9ad8\u5ea6",Ceiling:"\u5929\u82b1\u677f",RoofRValue:"\u5c4b\u9876R\u503c",CeilingRValue:"\u5929\u82b1\u677fR\u503c"},doorMenu:{TextureDefault:"\u9ed8\u8ba4\u6750\u8d28",Texture01:"\u4e00\u53f7\u6750\u8d28",Texture02:"\u4e8c\u53f7\u6750\u8d28",Texture03:"\u4e09\u53f7\u6750\u8d28",Texture04:"\u56db\u53f7\u6750\u8d28",Texture05:"\u4e94\u53f7\u6750\u8d28",Texture06:"\u516d\u53f7\u6750\u8d28",Texture07:"\u4e03\u53f7\u6750\u8d28",Texture08:"\u516b\u53f7\u6750\u8d28",Texture09:"\u4e5d\u53f7\u6750\u8d28",Texture10:"\u5341\u53f7\u6750\u8d28",Texture11:"\u5341\u4e00\u53f7\u6750\u8d28",Texture12:"\u5341\u4e8c\u53f7\u6750\u8d28",Texture13:"\u5341\u4e09\u53f7\u6750\u8d28",Texture14:"\u5341\u56db\u53f7\u6750\u8d28",Texture15:"\u5341\u4e94\u53f7\u6750\u8d28",Texture16:"\u5341\u516d\u53f7\u6750\u8d28",Texture17:"\u5341\u4e03\u53f7\u6750\u8d28",OnlyThisDoor:"\u53ea\u8fd9\u4e2a\u95e8",AllDoorsOnWall:"\u540c\u4e00\u9762\u5899\u4e0a\u6240\u6709\u7684\u95e8",AllDoorsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u95e8",AllSelectedDoors:"\u6240\u6709\u9009\u4e2d\u7684\u95e8",AllDoors:"\u6240\u6709\u7684\u95e8",DoorType:"\u95e8\u79cd\u7c7b",Default:"\u9ed8\u8ba4",Arched:"\u62f1\u5f62",Filled:"\u586b\u5145",FrameColor:"\u95e8\u6846\u989c\u8272",Interior:"\u5185\u95e8"},siteInfoPanel:{High:"\u6700\u9ad8\u6e29\u5ea6",Low:"\u6700\u4f4e\u6e29\u5ea6"},designInfoPanel:{NumberOfSelectedHeliostats:"\u9009\u4e2d\u7684\u5b9a\u65e5\u955c\u603b\u6570",NumberOfSelectedSolarPanels:"\u9009\u4e2d\u7684\u5149\u4f0f\u677f\u603b\u6570",ElectricityGeneratedDailyBySolarPanels:"\u8fd9\u4e9b\u5149\u4f0f\u677f\u7684\u65e5\u53d1\u7535\u91cf",SceneDiameter:"\u573a\u666f\u76f4\u5f84",BuildingArea:"\u5efa\u7b51\u9762\u79ef"},visualizationControlPanel:{ColorContrast:"\u70ed\u56fe\u989c\u8272\u5bf9\u6bd4\u5ea6",FluxScale:"\u70ed\u901a\u91cf\u957f\u5ea6",ClickUpOrDownArrowButtonsToChange:"\u70b9\u51fb\u4e0a\u4e0b\u7bad\u5934\u6539\u53d8\u53c2\u6570"},instructionPanel:{Rotate:"\u65cb\u8f6c",DragMouse:"\u62d6\u52a8\u9f20\u6807",Zoom:"\u7f29\u653e",MouseWheelOrKeys:"\u9f20\u6807\u6eda\u8f6e\u6216\u8005Ctrl+[\u548cCtrl+]",MouseWheelOrKeysMac:"\u9f20\u6807\u6eda\u8f6e\u6216\u8005\u2318+[\u548c\u2318+]",Pan:"\u5e73\u79fb",HoldCtrlDragMouse:"\u6309\u4e0bCtrl\u952e\u5e76\u62d6\u52a8\u9f20\u6807",HoldMetaDragMouse:"\u6309\u4e0b\u2318\u952e\u5e76\u62d6\u52a8\u9f20\u6807",Enter2DMode:"\u9032\u5165\u4e8c\u7ef4\u6a21\u5f0f",Exit2DMode:"\u9000\u51fa\u4e8c\u7ef4\u6a21\u5f0f",NavigationMode:"\u5bfc\u822a\u6a21\u5f0f",EnableNavigation:"\u9032\u5165\u5bfc\u822a\u6a21\u5f0f",DisableNavigation:"\u9000\u51fa\u5bfc\u822a\u6a21\u5f0f",MoveForwardBack:"\u524d\u540e\u79fb\u52a8",MoveForwardBackInstruction:"\u6309W/S\u952e",MoveLeftRight:"\u5de6\u53f3\u79fb\u52a8",MoveLeftRightInstruction:"\u6309A/D\u952e",MoveUpDown:"\u4e0a\u4e0b\u79fb\u52a8",MoveUpDownInstruction:"\u6309Z/X\u952e",Turn:"\u62d0\u5f2f",TurnInstruction:"\u6309\u65b9\u5411\u952e",ResetView:"\u91cd\u7f6e\u89c6\u89d2",AutoRotate:"\u81ea\u52a8\u65cb\u8f6c",StartOrStop:"\u6309F4\u952e\u542f\u52a8\u6216\u505c\u6b62"},mapPanel:{ImageOnGround:"\u5730\u9762\u663e\u793a\u56fe\u50cf",WeatherStations:"\u6c14\u8c61\u7ad9",WeatherStationsNote:"\u5173\u95ed\u6b64\u9009\u9879\u4ee5\u63d0\u9ad8\u5730\u56fe\u901f\u5ea6",Coordinates:"\u7ecf\u7eac\u5ea6\u5750\u6807",Zoom:"\u653e\u5927\u7a0b\u5ea6"},visibilityPanel:{SolarPanelVisibility:"\u5149\u4f0f\u677f\u5bf9\u89c2\u5bdf\u8005\u7684\u53ef\u89c1\u5ea6",Observer:"\u89c2\u5bdf\u8005",VantagePoint:"\u89c2\u5bdf\u4f4d\u7f6e",ItemizedVisibilityByFields:"\u6bcf\u4e2a\u573a\u7684\u53ef\u89c1\u5ea6",TotalVisibility:"\u603b\u53ef\u89c1\u5ea6"},sensorPanel:{LightSensor:"\u5149\u4f20\u611f\u5668",WeatherDataFrom:"\u6c14\u8c61\u6570\u636e\u6765\u81ea"},buildingEnergyPanel:{DailyBuildingEnergy:"\u5efa\u7b51\u7269\u65e5\u80fd\u8017",YearlyBuildingEnergy:"\u5efa\u7b51\u7269\u5e74\u80fd\u8017",Heater:"\u6696\u6c14",AC:"\u7a7a\u8c03",SolarPanel:"\u5149\u4f0f",Net:"\u51c0\u80fd\u8017"},solarPanelYieldPanel:{SolarPanelDailyYield:"\u5149\u4f0f\u65e5\u53d1\u7535\u91cf",SolarPanelYearlyYield:"\u5149\u4f0f\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualSolarPanels:"\u663e\u793a\u6bcf\u884c\u5149\u4f0f\u677f\u5355\u72ec\u53d1\u7535\u91cf",Profit:"\u5229\u6da6",TotalCost:"\u603b\u6210\u672c",TotalRevenue:"\u603b\u6536\u5165",TotalYield:"\u603b\u53d1\u7535\u91cf",MeanYield:"\u5e73\u5747\u53d1\u7535\u91cf",ModuleCount:"\u5149\u4f0f\u677f\u603b\u6570"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"\u629b\u7269\u7ebf\u69fd\u65e5\u53d1\u7535\u91cf",ParabolicTroughYearlyYield:"\u629b\u7269\u7ebf\u69fd\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualParabolicTroughs:"\u663e\u793a\u6bcf\u884c\u629b\u7269\u7ebf\u69fd\u5355\u72ec\u53d1\u7535\u91cf"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"\u629b\u7269\u7ebf\u789f\u65e5\u53d1\u7535\u91cf",ParabolicDishYearlyYield:"\u629b\u7269\u7ebf\u789f\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualParabolicDishes:"\u663e\u793a\u6bcf\u4e2a\u629b\u7269\u7ebf\u789f\u5355\u72ec\u53d1\u7535\u91cf"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u65e5\u53d1\u7535\u91cf",FresnelReflectorYearlyYield:"\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualFresnelReflectors:"\u663e\u793a\u6bcf\u4e2a\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u5355\u72ec\u53d1\u7535\u91cf"},heliostatYieldPanel:{HeliostatDailyYield:"\u5b9a\u65e5\u955c\u65e5\u53d1\u7535\u91cf",HeliostatYearlyYield:"\u5b9a\u65e5\u955c\u5e74\u53d1\u7535\u91cf",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualHeliostats:"\u663e\u793a\u6bcf\u4e2a\u5b9a\u65e5\u955c\u5355\u72ec\u53d1\u7535\u91cf"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u65e5\u53d1\u7535\u91cf",UpdraftTowerYearlyYield:"\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u5e74\u53d1\u7535\u91cf",ChimneyAirTemperature:"\u70df\u56f1\u7a7a\u6c14\u6e29\u5ea6",ChimneyWindSpeed:"\u70df\u56f1\u98ce\u901f",Yield:"\u53d1\u7535\u91cf",YieldPerHour:"\u6bcf\u5c0f\u65f6\u53d1\u7535\u91cf",DailyTotal:"\u65e5\u53d1\u7535\u603b\u91cf",YearlyTotal:"\u5e74\u53d1\u7535\u603b\u91cf",ShowOutputsOfIndividualUpdraftTowers:"\u663e\u793a\u6bcf\u4e2a\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u5355\u72ec\u53d1\u7535\u91cf"},heliodonPanel:{SunAndTimeSettings:"\u592a\u9633\u548c\u65f6\u95f4\u8bbe\u7f6e",SunAngles:"\u89d2\u5ea6",TwentyFourHours:"24\u5c0f\u65f6"},cloudFilePanel:{CopyTitle:"\u62f7\u8d1d\u6807\u9898",TitleCopiedToClipBoard:"\u6807\u9898\u62f7\u8d1d\u5230\u526a\u8d34\u677f",SearchByTitle:"\u6309\u6807\u9898\u641c\u7d22",MyLikes:"\u6211\u559c\u6b22\u7684\u6a21\u578b",MyCloudFiles:"\u6211\u7684\u4e91\u6587\u4ef6",GenerateLink:"\u751f\u6210\u94fe\u63a5",LinkGeneratedInClipBoard:"\u94fe\u63a5\u751f\u6210\u5230\u526a\u8d34\u677f",DoYouReallyWantToDelete:"\u60a8\u786e\u5b9a\u5220\u9664\u6b64\u6587\u4ef6",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"\u5982\u679c\u6b64\u6587\u4ef6\u5df2\u88ab\u5206\u4eab\u6216\u53d1\u5e03, \u6539\u540d\u4f1a\u4f7f\u5df2\u6709\u94fe\u63a5\u5931\u6548"},projectListPanel:{CopyTitle:"\u62f7\u8d1d\u6807\u9898",TitleCopiedToClipBoard:"\u6807\u9898\u62f7\u8d1d\u5230\u526a\u8d34\u677f",SearchByTitle:"\u6309\u6807\u9898\u641c\u7d22",MyProjects:"\u6211\u7684\u9879\u76ee",GenerateProjectLink:"\u751f\u6210\u9879\u76ee\u94fe\u63a5",ProjectLinkGeneratedInClipBoard:"\u9879\u76ee\u94fe\u63a5\u751f\u6210\u5230\u526a\u8d34\u677f",DoYouReallyWantToDeleteProject:"\u60a8\u786e\u5b9a\u5220\u9664\u9879\u76ee",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"\u5982\u679c\u6b64\u9879\u76ee\u5df2\u88ab\u5206\u4eab\u6216\u53d1\u5e03, \u6539\u540d\u4f1a\u4f7f\u5df2\u6709\u94fe\u63a5\u5931\u6548"},projectPanel:{ProjectSettings:"\u9879\u76ee\u8bbe\u5b9a",ThumbnailImageSize:"\u7f29\u7565\u56fe\u5927\u5c0f",ProjectByOtherPeople:"\u522b\u4eba\u7684\u9879\u76ee",Project:"\u9879\u76ee",ProjectType:"\u7c7b\u522b",ProjectDescription:"\u63cf\u8ff0",MakeDescriptionEditable:"\u7f16\u8f91\u63cf\u8ff0",MakeDescriptionNonEditable:"\u4e0d\u7f16\u8f91\u63cf\u8ff0",DoubleClickToMakeDescriptionEditable:"\u53cc\u51fb\u6b64\u63cf\u8ff0\u6fc0\u6d3b\u7f16\u8f91\u529f\u80fd",SolarPanelArray:"\u5149\u4f0f\u677f\u9635\u5217\u8bbe\u8ba1",CurateCurrentDesign:"\u6536\u85cf\u5f53\u524d\u8bbe\u8ba1",UpdateSelectedDesign:"\u66f4\u65b0\u9009\u4e2d\u8bbe\u8ba1",RemoveSelectedDesign:"\u5220\u9664\u9009\u4e2d\u8bbe\u8ba1",ClickToFlipSortingOrder:"\u70b9\u51fb\u9006\u8f6c\u6392\u5e8f\u65b9\u5411",DesignNotShownInSolutionSpaceClickToShow:"\u6b64\u8bbe\u8ba1\u76ee\u524d\u4e0d\u663e\u793a\u5728\u8bbe\u8ba1\u7a7a\u95f4\u5185\uff0c\u70b9\u51fb\u663e\u793a",DesignShownInSolutionSpaceClickToHide:"\u6b64\u8bbe\u8ba1\u76ee\u524d\u663e\u793a\u5728\u8bbe\u8ba1\u7a7a\u95f4\u5185,\u70b9\u51fb\u9690\u85cf",DistributionInSolutionSpace:"\u65b9\u6848\u5728\u8bbe\u8ba1\u7a7a\u95f4\u91cc\u7684\u5206\u5e03",ChooseSolutionSpace:"\u9009\u62e9\u8bbe\u8ba1\u7a7a\u95f4",ChooseDataColoring:"\u9009\u62e9\u6570\u636e\u7740\u8272",SameColorForAllDesigns:"\u6240\u6709\u8bbe\u8ba1\u4e00\u4e2a\u989c\u8272",OneColorForEachDesign:"\u6bcf\u4e2a\u8bbe\u8ba1\u4e00\u4e2a\u989c\u8272",SolutionSpaceScreenshot:"\u8bbe\u8ba1\u7a7a\u95f4\u622a\u56fe",ScatteredPlotScreenshot:"\u6563\u70b9\u56fe\u622a\u56fe",SingleClickToSelectDoubleClickToOpen:"\u5355\u51fb\u9009\u62e9\uff0c\u53cc\u51fb\u6253\u5f00\u3002",SingleClickToDeselectDoubleClickToOpen:"\u5355\u51fb\u53d6\u6d88\u9009\u62e9\uff0c\u53cc\u51fb\u6253\u5f00\u3002",GenerateScatteredPlot:"\u751f\u6210\u6563\u70b9\u56fe",SelectXAxis:"\u9009\u62e9X\u8f74",SelectYAxis:"\u9009\u62e9Y\u8f74"},accountSettingsPanel:{MyAccountSettings:"\u6211\u7684\u8d26\u6237\u8bbe\u5b9a",MyID:"\u6211\u7684\ud83c\udd94",ClickToCopyMyID:"\u70b9\u51fb\u6b64\u5904\u62f7\u8d1d\u6211\u7684ID",IDInClipBoard:"\u60a8\u73b0\u5728\u53ef\u4ee5\u7c98\u8d34ID\u4e86\u3002",StoreMyNameInMyFilesWhenSaving:"\u4fdd\u5b58\u6587\u4ef6\u65f6\u7b7e\u4e0a\u6211\u7684\u5927\u540d",DoYouReallyWantToShowYourNameInYourFiles:"\u60a8\u786e\u5b9a\u5728\u60a8\u7684\u6587\u4ef6\u91cc\u4fdd\u5b58\u60a8\u7684\u5927\u540d\u5417\uff1f",SignFileDisclaimer:"\u5982\u679c\u60a8\u9009\u62e9\u4fdd\u5b58\uff0c\u60a8\u7684\u5927\u540d\u53ef\u80fd\u88ab\u6240\u6709\u6253\u5f00\u60a8\u7684\u6587\u4ef6\u7684\u4eba\u770b\u5230\u3002",Likes:"\u70b9\u8d5e\u603b\u6570",AllPublished:"\u53d1\u5e03\u603b\u6570",PublishedUnderAliases:"\u522b\u540d\u53d1\u5e03",UserCount:"\u7528\u6237\u603b\u6570",SchoolID:"\u5b66\u6821\u7f16\u53f7",ClassID:"\u73ed\u7ea7\u7f16\u53f7"},weatherPanel:{SunshineHours:"\u65e5\u7167\u65f6\u95f4"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"\u9009\u62e9\u6c14\u6e29\u6a21\u578b",Sinusoidal:"\u6b63\u5f26\u51fd\u6570"},economicsPanel:{EconomicsParameters:"\u7ecf\u6d4e\u5b66\u53c2\u6570",ElectricitySellingPrice:"\u9500\u552e\u7535\u4ef7",OperationalCostPerUnit:"\u5355\u4f4d\u8fd0\u884c\u6210\u672c",SellingPrice:"\u9500\u552e\u7535\u4ef7",UnitCost:"\u5355\u4f4d\u6210\u672c"},navigationPanel:{NavigationParameters:"\u5bfc\u822a\u6a21\u5f0f\u53c2\u6570",MinimumMoveSpeed:"\u6700\u5c0f\u79fb\u52a8\u901f\u5ea6",MinimumTurnSpeed:"\u6700\u5c0f\u62d0\u5f2f\u901f\u5ea6"},yearlyLightSensorPanel:{SkyClearness:"\u5929\u7a7a\u6e05\u6670\u5ea6",ShowDaylightResults:"\u663e\u793a\u65e5\u7167\u65f6\u95f4\u7ed3\u679c",ShowSkyClearnessResults:"\u663e\u793a\u5929\u7a7a\u6e05\u6670\u5ea6\u7ed3\u679c",ShowAverageDailySolarRadiation:"\u663e\u793a\u65e5\u5e73\u5747\u8f90\u5c04\u7ed3\u679c"},analysisManager:{NoSensorForCollectingData:"\u6ca1\u6709\u4f20\u611f\u5668\u6536\u96c6\u6570\u636e\u3002",NoSolarPanelForAnalysis:"\u6ca1\u6709\u5149\u4f0f\u677f\u53ef\u4ee5\u5206\u6790\u3002",NoObserverForVisibilityAnalysis:"\u6ca1\u6709\u627e\u5230\u53ef\u89c1\u5ea6\u5206\u6790\u7684\u89c2\u5bdf\u8005\u3002",NoWaterHeaterForAnalysis:"\u6c92\u6709\u592a\u9633\u80fd\u70ed\u6c34\u5668\u53ef\u4ee5\u5206\u6790\u3002",NoParabolicDishForAnalysis:"\u6c92\u6709\u629b\u7269\u7ebf\u789f\u53ef\u4ee5\u5206\u6790\u3002",NoParabolicTroughForAnalysis:"\u6c92\u6709\u629b\u7269\u7ebf\u69fd\u53ef\u4ee5\u5206\u6790\u3002",NoFresnelReflectorForAnalysis:"\u6c92\u6709\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u53ef\u4ee5\u5206\u6790\u3002",NoHeliostatForAnalysis:"\u6c92\u6709\u5b9a\u65e5\u955c\u53ef\u4ee5\u5206\u6790\u3002",NoSolarUpdraftTowerForAnalysis:"\u6c92\u6709\u592a\u9633\u80fd\u4e0a\u5347\u6c14\u6d41\u5854\u53ef\u4ee5\u5206\u6790\u3002",NoBuildingForAnalysis:"\u6c92\u6709\u5efa\u7b51\u7269\u53ef\u4ee5\u5206\u6790\u3002"},toolbar:{CloudFile:"\u4e91\u6587\u4ef6",Select:"\u9009\u62e9",AddFoundation:"\u6dfb\u52a0\u5730\u57fa",AddWall:"\u6dfb\u52a0\u5899\u4f53",AddWindow:"\u6dfb\u52a0\u7a97\u6237",AddDoor:"\u6dfb\u52a0\u95e8",AddPyramidRoof:"\u6dfb\u52a0\u91d1\u5b57\u5854\u5c4b\u9876",AddGableRoof:"\u6dfb\u52a0\u53cc\u5761\u5c4b\u9876",AddHipRoof:"\u6dfb\u52a0\u56db\u5761\u5c4b\u9876",AddGambrelRoof:"\u6dfb\u52a0\u590d\u659c\u5c4b\u9876",AddMansardRoof:"\u6dfb\u52a0\u6298\u7ebf\u5c4b\u9876",AddCuboid:"\u6dfb\u52a0\u957f\u65b9\u4f53",AddSensor:"\u6dfb\u52a0\u4f20\u611f\u5668",AddSolarPanel:"\u6dfb\u52a0\u5149\u4f0f\u677f",AddWaterHeater:"\u6dfb\u52a0\u592a\u9633\u80fd\u70ed\u6c34\u5668",AddParabolicDish:"\u6dfb\u52a0\u629b\u7269\u7ebf\u789f",AddParabolicTrough:"\u6dfb\u52a0\u629b\u7269\u7ebf\u69fd",AddFresnelReflector:"\u6dfb\u52a0\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AddHeliostat:"\u6dfb\u52a0\u5b9a\u65e5\u955c",AddWindTurbine:"\u6dfb\u52a0\u98ce\u529b\u6da1\u8f6e\u673a",AddLight:"\u6dfb\u52a0\u7535\u706f",AddTree:"\u6dfb\u52a0\u6811\u6728",AddFlower:"\u6dfb\u52a0\u82b1\u8349",AddPeople:"\u6dfb\u52a0\u4eba\u7269",DoubleClickToLockThisModeForNextAction:"\u53cc\u51fb\u6309\u94ae\u7ed9\u4e0b\u4e2a\u52a8\u4f5c\u9501\u5b9a\u6b64\u6a21\u5f0f",ClickToUnlockThisModeForNextAction:"\u70b9\u51fb\u6309\u94ae\u8ba9\u52a8\u4f5c\u5b8c\u6210\u5373\u79bb\u5f00\u6b64\u6a21\u5f0f",ManipulateGroup:"\u6574\u4f53\u64cd\u4f5c\u4e00\u4e2a\u7ec4",ClearScene:"\u6e05\u7a7a\u573a\u666f",ShowSunAndTimeSettings:"\u663e\u793a\u592a\u9633\u548c\u65f6\u95f4\u8bbe\u7f6e",SpatialAnalysisOfEnergy:"\u80fd\u91cf\u7684\u7a7a\u95f4\u5206\u6790",DoYouReallyWantToClearContent:"\u60a8\u786e\u5b9a\u6e05\u7a7a\u573a\u666f\u5417",ClickForMoreButtons:"\u70b9\u51fb\u6b64\u5904\u5207\u6362\u5230\u66f4\u591a\u7684\u6309\u94ae\u6a21\u5f0f",SwitchToAddingFoundation:"\u5207\u6362\u5230\u6dfb\u52a0\u5730\u57fa\u6a21\u5f0f",SwitchToAddingCuboid:"\u5207\u6362\u5230\u6dfb\u52a0\u957f\u65b9\u4f53\u6a21\u5f0f",SwitchToAddingWall:"\u5207\u6362\u5230\u6dfb\u52a0\u5899\u4f53\u6a21\u5f0f",SwitchToAddingWindow:"\u5207\u6362\u5230\u6dfb\u52a0\u7a97\u6237\u6a21\u5f0f",SwitchToAddingDoor:"\u5207\u6362\u5230\u6dfb\u52a0\u95e8\u6a21\u5f0f",SwitchToAddingPyramidRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u91d1\u5b57\u5854\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingGableRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u53cc\u5761\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingHipRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u56db\u5761\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingGambrelRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u590d\u659c\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingMansardRoof:"\u5207\u6362\u5230\u6dfb\u52a0\u6298\u7ebf\u5c4b\u9876\u6a21\u5f0f",SwitchToAddingSolarPanel:"\u5207\u6362\u5230\u6dfb\u52a0\u5149\u4f0f\u677f\u6a21\u5f0f",SwitchToAddingSensor:"\u5207\u6362\u5230\u6dfb\u52a0\u4f20\u611f\u5668\u6a21\u5f0f",SwitchToAddingWaterHeater:"\u5207\u6362\u5230\u6dfb\u52a0\u592a\u9633\u80fd\u70ed\u6c34\u5668\u6a21\u5f0f",SwitchToAddingParabolicDish:"\u5207\u6362\u5230\u6dfb\u52a0\u629b\u7269\u7ebf\u789f\u6a21\u5f0f",SwitchToAddingParabolicTrough:"\u5207\u6362\u5230\u6dfb\u52a0\u629b\u7269\u7ebf\u69fd\u6a21\u5f0f",SwitchToAddingFresnelReflector:"\u5207\u6362\u5230\u6dfb\u52a0\u83f2\u6d85\u8033\u53cd\u5c04\u955c\u6a21\u5f0f",SwitchToAddingHeliostat:"\u5207\u6362\u5230\u6dfb\u52a0\u5b9a\u65e5\u955c\u6a21\u5f0f",SwitchToAddingWindTurbine:"\u5207\u6362\u5230\u6dfb\u52a0\u98ce\u529b\u6da1\u8f6e\u673a\u6a21\u5f0f",SwitchToAddingLight:"\u5207\u6362\u5230\u6dfb\u52a0\u7535\u706f\u6a21\u5f0f",SwitchToAddingTree:"\u5207\u6362\u5230\u6dfb\u52a0\u6811\u6728\u6a21\u5f0f",SwitchToAddingFlower:"\u5207\u6362\u5230\u6dfb\u52a0\u82b1\u8349\u6a21\u5f0f",SwitchToAddingPeople:"\u5207\u6362\u5230\u6dfb\u52a0\u4eba\u7269\u6a21\u5f0f"},tooltip:{gotoIFI:"\u8bbf\u95ee\u672a\u6765\u667a\u80fd\u7814\u7a76\u6240",visitAladdinHomePage:"\u8bbf\u95ee\u963f\u62c9\u4e01\u4e3b\u9875",clickToOpenMenu:"\u70b9\u51fb\u6253\u5f00\u4e3b\u83dc\u5355",clickToAccessAccountSettings:"\u70b9\u51fb\u6253\u5f00\u8d26\u53f7\u8bbe\u5b9a"},tree:{Apple:"\u82f9\u679c\u6811",Birch:"\u767d\u6866",Coconut:"\u6930\u5b50\u6811",Dogwood:"\u8331\u8438",Elm:"\u6986\u6811",FanPalm:"\u6247\u53f6\u68d5\u6988",Linden:"\u83e9\u63d0",Magnolia:"\u7389\u5170",Maple:"\u67ab\u6811",Oak:"\u6a61\u6811",Pine:"\u677e\u6811",Spruce:"\u4e91\u6749"},flower:{Bellflower:"\u94c3\u5170",Boxwood:"\u9ec4\u6768",CactusCombo1:"\u4ed9\u4eba\u638c\u7ec4\u5408\u4e00",CactusCombo2:"\u4ed9\u4eba\u638c\u7ec4\u5408\u4e8c",CactusCombo3:"\u4ed9\u4eba\u638c\u7ec4\u5408\u4e09",CactusCombo4:"\u4ed9\u4eba\u638c\u7ec4\u5408\u56db",Hibiscus:"\u6728\u69ff",Hosta:"\u7389\u7c2a",Hydrangea:"\u7ee3\u7403\u82b1",Peony:"\u7261\u4e39",RedRose:"\u7ea2\u73ab\u7470",Spirea:"\u7ee3\u7ebf\u83ca",Sunflower:"\u5411\u65e5\u8475",TallBush:"\u9ad8\u704c\u6728",Tulip:"\u90c1\u91d1\u9999",WhiteFlower:"\u767d\u82b1",YellowFlower:"\u9ec4\u82b1"},people:{Jaah:"\u8d3e\u963f",Jack:"\u6770\u514b",Jacob:"\u96c5\u5404\u5e03",Jacqueline:"\u6770\u594e\u7433",Jade:"\u7f8e\u7389",Jamelia:"\u6d01\u7c73\u8389\u96c5",James:"\u8a79\u59c6\u65af",Jane:"\u7b80",Jaya:"\u4f73\u5a05",Jaye:"\u6770\u4f0a",Jeanette:"\u73cd\u59ae\u7279",Jedi:"\u6770\u8fea",Jeff:"\u6770\u592b",Jena:"\u73cd\u5a1c",Jennifer:"\u73cd\u5c3c\u5f17",Jess:"\u6770\u897f",Jett:"\u6770\u7279",Jill:"\u5409\u5c14",Jiya:"\u5409\u5a05",Joan:"\u743c",Jocelyn:"\u4e54\u65af\u6797",Joel:"\u4e54\u5c14",Joey:"\u4e54\u4f0a",John:"\u7ea6\u7ff0",Jonathon:"\u4e54\u7eb3\u68ee",Jose:"\u4f55\u585e",Joseph:"\u7ea6\u745f\u592b",Joshua:"\u7ea6\u4e66\u4e9a",Judd:"\u8d3e\u5fb7",Judy:"\u6731\u8482",Julia:"\u6731\u8389\u5a05",Julio:"\u80e1\u91cc\u5965",Jumapili:"\u7956\u739b\u5339\u8389",June:"\u51c6\u536b",Juro:"\u6731\u8bfa",Justin:"\u8d3e\u65af\u6c40"},compass:{N:"\u5317",S:"\u5357",W:"\u897f",E:"\u4e1c"},month:{January:"\u4e00\u6708",February:"\u4e8c\u6708",March:"\u4e09\u6708",April:"\u56db\u6708",May:"\u4e94\u6708",June:"\u516d\u6708",July:"\u4e03\u6708",August:"\u516b\u6708",September:"\u4e5d\u6708",October:"\u5341\u6708",November:"\u5341\u4e00\u6708",December:"\u5341\u4e8c\u6708"},modelsMap:{SearchByPublisher:"\u6309\u53d1\u5e03\u8005\u641c\u7d22",SearchByLabel:"\u6309\u6807\u7b7e\u641c\u7d22",MyPublishedModels:"\u6211\u53d1\u5e03\u7684\u6a21\u578b",TotalNumberOfUserPublishedModels:"\u7528\u6237\u53d1\u5e03\u7684\u6a21\u578b\u603b\u6570",SortFromOldestToNewest:"\u4ece\u65e9\u5230\u665a\u6392\u5e8f",SortFromNewestToOldest:"\u4ece\u665a\u5230\u65e9\u6392\u5e8f",ModelsFoundOnThisSite:"\u4e2a\u6a21\u578b\u5728\u6b64\u4f4d\u7f6e",ShowModelsPublishedByThisAuthor:"\u5c55\u793a\u6b64\u7528\u6237\u53d1\u5e03\u7684\u6a21\u578b"}}},zh_tw:{translation:{name:{IFI:"\u672a\u4f86\u667a\u80fd\u7814\u7a76\u6240",Aladdin:"\u963f\u62c9\u4e01",Tagline:"\u963f\u62c9\u4e01: \u63a2\u7d22\u4eba\u5de5\u667a\u6167\u6642\u4ee3\u7684\u8a2d\u8a08\u8edf\u9ad4 \u2014 \u672a\u4f86\u667a\u80fd\u7814\u7a76\u6240\u7814\u767c"},cookie:{Statement:"\u8072\u660e\uff1a\u70ba\u4e86\u6539\u5584\u60a8\u7684\u7528\u6236\u9ad4\u9a57\uff0c\u963f\u62c9\u4e01\u63a1\u7528cookie\u5132\u5b58\u5c11\u91cf\u6578\u64da\u3002",Accept:"\u540c\u610f"},aboutUs:{ProductBroughtToYouBy:"\u672a\u4f86\u667a\u80fd\u7814\u7a76\u6240\u69ae\u8b7d\u51fa\u54c1",TermsOfService:"\u670d\u52d9\u689d\u6b3e",PrivacyPolicy:"\u96b1\u79c1\u653f\u7b56",Software:"\u8edf\u9ad4",Content:"\u8ab2\u4ef6",Research:"\u7814\u7a76",Support:"\u670d\u52d9",Acknowledgment:"\u9cf4\u8b1d",FundingInformation:"\u672c\u7522\u54c1\u7684\u7814\u767c\u627f\u8499\u7f8e\u570b\u570b\u5bb6\u79d1\u5b78\u57fa\u91d1\u6703\u6177\u6168\u8cc7\u52a9\uff08\u9805\u76ee\u865f#2105695\uff0c#2131097\uff0c#2301164\uff09\u3002\u672c\u7522\u54c1\u7684\u4efb\u4f55\u89c0\u9ede\u6216\u7d50\u8ad6\u50c5\u4ee3\u8868\u5275\u4f5c\u8005\u500b\u4eba\u610f\u898b\u3002",Contact:"\u5982\u60a8\u9700\u8981\u66f4\u591a\u8cc7\u8a0a\uff0c\u8acb\u806f\u7e6b Charles Xie (charles@intofuture.org)\u3002\u6211\u5011\u6703\u76e1\u5feb\u56de\u590d\u3002",Translators:"\u7ffb\u8b6f"},word:{LastUpdate:"\u4e0a\u4e00\u6b21\u66f4\u65b0",Small:"\u5c0f",Medium:"\u4e2d",Large:"\u5927",Design:"\u8a2d\u8a08",Information:"\u8cc7\u8a0a",Type:"\u985e\u522b",Text:"\u6587\u5b57",FontSize:"\u5b57\u9ad4\u5927\u5c0f",FontColor:"\u5b57\u9ad4\u984f\u8272",Model:"\u6a21\u578b",Models:"\u6a21\u578b",Upload:"\u4e0a\u50b3",ClickCount:"\u9ede\u64ca\u6578",Share:"\u5206\u4eab",AlreadyLike:"\u5df2\u9ede\u8d0a",Like:"\u9ede\u8d0a",MustLogInToLike:"\u5fc5\u9808\u767b\u9304\u624d\u80fd\u9ede\u8d0a",AllRightsReserved:"\u7248\u6b0a\u6240\u6709",MeterAbbreviation:"\u7c73",Version:"\u7248\u672c",VersionInitial:"\u7248\u672c",Options:"\u9078\u9805",Maximum:"\u6700\u5927",Minimum:"\u6700\u5c0f",MaximumNumber:"\u6700\u591a",MinimumNumber:"\u6700\u5c11",MaximumValue:"\u6700\u5927\u503c",MinimumValue:"\u6700\u5c0f\u503c",Or:"\u6216",None:"\u7121",High:"\u9ad8",Partial:"\u90e8\u5206",Teacher:"\u8001\u5e2b",Class:"\u73ed\u7d1a",Total:"\u7e3d\u6578",Leaderboard:"\u7528\u6236\u6392\u884c\u699c",Latest:"\u6700\u65b0",Range:"\u7bc4\u570d",SIUnit:"\u570b\u969b\u55ae\u4f4d\u5236",USUnit:"\u7f8e\u570b\u55ae\u4f4d\u5236",ThermalTransmittance:"\u71b1\u900f\u904e\u7387",ThermalResistance:"\u71b1\u963b",UValue:"U\u503c",RValue:"R\u503c",VolumetricHeatCapacity:"\u5bb9\u7a4d\u71b1\u5bb9",BuildingHVACSystem:"\u5efa\u7bc9\u7269\u6696\u901a\u7a7a\u8abf\u7cfb\u7d71",ThermostatSetpoint:"\u6046\u6eab\u5668\u8a2d\u5b9a\u503c",TemperatureToleranceThreshold:"\u6eab\u5ea6\u5fcd\u8010\u95be\u503c",TemperatureToleranceThresholdExplanation:"\u7576\u65e5\u6700\u4f4e\u5916\u9762\u6eab\u5ea6\u9ad8\u65bc\u6046\u6eab\u5668\u8a2d\u5b9a\u503c\u6e1b\u53bb\u6b64\u95be\u503c\uff0c\u6696\u6c23\u4e0d\u958b\u3002\n\u7576\u65e5\u6700\u9ad8\u5916\u9762\u6eab\u5ea6\u4f4e\u65bc\u6046\u6eab\u5668\u8a2d\u5b9a\u503c\u52a0\u4e0a\u6b64\u95be\u503c\uff0c\u7a7a\u8abf\u4e0d\u958b\u3002",Press:"\u6309",Open:"\u6253\u958b",Save:"\u4fdd\u5b58",SaveAsImage:"\u4fdd\u5b58\u70ba\u5716\u50cf",SaveAsCsv:"\u4fdd\u5b58\u70baCSV",Update:"\u5237\u65b0",Paste:"\u7c98\u8cbc",Copy:"\u8907\u88fd",Cut:"\u526a\u5207",Delete:"\u5220\u9664",Lock:"\u56fa\u5b9a",Translucent:"\u534a\u900f\u660e",Color:"\u984f\u8272",Texture:"\u6750\u8cea",Thickness:"\u539a\u5ea6",Size:"\u5c3a\u5bf8",Yes:"\u662f",No:"\u4e0d",OK:"\u78ba\u5b9a",Cancel:"\u53d6\u6d88",Apply:"\u61c9\u7528",Close:"\u95dc\u9589",ApplyTo:"\u9069\u7528\u65bc",Run:"\u904b\u884c",Pause:"\u66ab\u505c",Resume:"\u7e7c\u7e8c",Clear:"\u6e05\u7a7a",Warning:"\u8b66\u544a",Caution:"\u5c0f\u5fc3",Reminder:"\u63d0\u9192",Length:"\u9577\u5ea6",Width:"\u5bec\u5ea6",Height:"\u9ad8\u5ea6",Radius:"\u534a\u5f91",Angle:"\u89d2\u5ea6",Azimuth:"\u65b9\u4f4d\u89d2",Coordinates:"\u5750\u6a19",Weather:"\u5929\u6c23",Show:"\u986f\u793a",Animate:"\u52d5\u756b",Date:"\u65e5\u671f",Time:"\u6642\u9593",Title:"\u6a19\u984c",Owner:"\u6240\u6709\u8005",Action:"\u64cd\u4f5c",Rename:"\u6539\u540d",Location:"\u4f4d\u7f6e",Latitude:"\u7def\u5ea6",Month:"\u6708\u4efd",Day:"\u5929",Hour:"\u5c0f\u6642",Daylight:"\u767d\u5929\u9577\u5ea6",Radiation:"\u8f3b\u5c04",Temperature:"\u6e29\u5ea6",kWh:"\u5343\u74e6\u6642",dollar:"\u5143",MeterPerSecond:"\u7c73/\u79d2",NorthInitial:"\u5317",SouthInitial:"\u5357",EastInitial:"\u6771",WestInitial:"\u897f",Fixed:"\u56fa\u5b9a",Elements:"\u90e8\u4ef6",Energy:"\u80fd\u91cf",Unknown:"\u672a\u77e5",Label:"\u6a19\u7c64",Description:"\u63cf\u8ff0",NoDescription:"\u7121\u63cf\u8ff0",MaximumCharacters:"\u6700\u591a\u5b57\u7b26\u6578",Author:"\u4f5c\u8005",Publisher:"\u767c\u5e03\u8005",Building:"\u5efa\u7bc9",ResidentialBuilding:"\u4f4f\u5b85\u5efa\u7bc9",CommercialBuilding:"\u5546\u7528\u5efa\u7bc9",SchoolBuilding:"\u5b78\u6821\u5efa\u7bc9",TouristAttraction:"\u65c5\u904a\u666f\u9ede",UnderConstruction:"\u5728\u5efa",Photovoltaic:"\u5149\u4f0f",Anonymous:"\u7121\u540d\u6c0f",Nickname:"\u522b\u540d",Pin:"\u7f6e\u9802",Unpin:"\u89e3\u9664\u7f6e\u9802"},shared:{NoTexture:"\u7121\u6750\u8cea",FoundationElement:"\u5730\u57fa",CuboidElement:"\u9577\u65b9\u9ad4",PolygonElement:"\u591a\u908a\u5f62",SensorElement:"\u50b3\u611f\u5668",SolarPanelElement:"\u5149\u4f0f\u677f",WaterHeaterElement:"\u592a\u967d\u80fd\u71b1\u6c34\u5668",ParabolicDishElement:"\u62cb\u7269\u7dda\u789f",ParabolicTroughElement:"\u62cb\u7269\u7dda\u69fd",FresnelReflectorElement:"\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",HeliostatElement:"\u5b9a\u65e5\u93e1",WindTurbineElement:"\u98a8\u529b\u6e26\u8f2a\u6a5f",LightElement:"\u96fb\u71c8",ElementLocked:"\u56fa\u5b9a",ModelType:"\u6a21\u578b\u985e\u522b",OutputBreakdown:"\u5206\u5217\u767c\u96fb\u91cf",MoreResults:"\u66f4\u591a\u7d50\u679c"},message:{ModelNotFound:"\u6c92\u6709\u627e\u5230\u6a21\u578b",CannotSignIn:"\u767b\u9304\u5931\u6557",CannotSignOut:"\u9000\u51fa\u5931\u6557",YourAccountWasCreated:"\u6210\u529f\u5efa\u7acb\u60a8\u7684\u8cec\u865f\u3002",CannotCreateAccount:"\u7121\u6cd5\u5275\u5efa\u8cec\u865f",YourAccountSettingsWereSaved:"\u60a8\u7684\u8cec\u865f\u8a2d\u5b9a\u5df2\u4fdd\u5b58\u3002",CannotSaveYourAccountSettings:"\u60a8\u7684\u8cec\u865f\u8a2d\u5b9a\u7121\u6cd5\u4fdd\u5b58",CannotSaveYourFileToCloud:"\u7121\u6cd5\u4fdd\u5b58\u60a8\u7684\u6587\u6a94\u5230\u96f2\u7aef",CannotCreateNewProject:"\u7121\u6cd5\u5275\u5efa\u65b0\u9805\u76ee",CannotCreateNewProjectWithoutTitle:"\u6c92\u6709\u6a19\u984c, \u7121\u6cd5\u5275\u5efa\u65b0\u9805\u76ee",CannotOpenYourProjects:"\u7121\u6cd5\u6253\u958b\u60a8\u7684\u9805\u76ee\u5217\u8868",CannotOpenProject:"\u7121\u6cd5\u6253\u958b\u9805\u76ee",CannotDeleteProject:"\u7121\u6cd5\u522a\u9664\u9805\u76ee",CannotRenameProject:"\u7121\u6cd5\u7d66\u9805\u76ee\u6539\u540d",CannotAddDesignToProject:"\u7121\u6cd5\u628a\u6b64\u8a2d\u8a08\u52a0\u5230\u9805\u76ee\u88e1",CannotAddDesignToProjectOwnedByOthers:"\u4e0d\u80fd\u628a\u6b64\u8a2d\u8a08\u52a0\u5230\u5225\u4eba\u7684\u9805\u76ee\u88e1",DesignRemovedFromProject:"\u8a2d\u8a08\u88ab\u6210\u529f\u5730\u5f9e\u9805\u76ee\u88e1\u522a\u9664",CannotRemoveDesignFromProject:"\u7121\u6cd5\u628a\u6b64\u8a2d\u8a08\u5f9e\u9805\u76ee\u88e1\u522a\u9664",CannotUpdateProject:"\u7121\u6cd5\u66f4\u65b0\u9805\u76ee",CannotFetchProjectData:"\u7121\u6cd5\u53d6\u5f97\u9805\u76ee\u6578\u64da",TitleUsedChooseDifferentOne:"\u6b64\u6a19\u984c\u5df2\u7d93\u88ab\u4f7f\u7528, \u8acb\u63a1\u7528\u4e0d\u540c\u7684\u6a19\u984c",CloudFileWithTitleExistsDoYouWantToOverwrite:"\u4f7f\u7528\u6b64\u6a19\u984c\u7684\u96f2\u6587\u6a94\u5df2\u7d93\u5b58\u5728\uff0c\u60a8\u78ba\u5b9a\u8981\u8986\u84cb\u5b83\u55ce\uff1f",CloudFileNotFound:"\u627e\u4e0d\u5230\u6b64\u4e91\u7aef\u6587\u6a94",CannotLoadModelsOnMap:"\u7121\u6cd5\u4e0b\u8f09\u5730\u5716\u4e0a\u7684\u6a21\u578b",CannotLoadLeaderboard:"\u7121\u6cd5\u4e0b\u8f09\u6392\u884c\u699c",CannotPublishModelOnMap:"\u6a21\u578b\u7121\u6cd5\u767c\u4f48\u5230\u5730\u5716\u4e0a",CannotLikeModelFromMap:"\u7121\u6cd5\u9ede\u8d0a\u5730\u5716\u4e0a\u7684\u6a21\u578b",CannotDeleteModelFromMap:"\u7121\u6cd5\u5220\u9664\u5730\u5716\u4e0a\u7684\u6a21\u578b",ModelDeletedFromMap:"\u6a21\u578b\u5df2\u5f9e\u5730\u5716\u4e0a\u522a\u9664",DoYouWantToDeleteModelFromMap:"\u60a8\u8981\u5220\u9664\u5730\u5716\u4e0a\u7684\u9019\u500b\u6a21\u578b\u55ce\uff1f",CannotOpenCloudFile:"\u6b64\u4e91\u7aef\u6587\u6a94\u7121\u6cd5\u6253\u958b",CannotReadCloudFile:"\u7121\u6cd5\u8b80\u53d6\u6b64\u4e91\u7aef\u6587\u6a94",CannotWriteCloudFile:"\u7121\u6cd5\u5b58\u5132\u6b64\u4e91\u7aef\u6587\u6a94",CloudFileCopied:"\u62f7\u8c9d\u4e91\u7aef\u6587\u6a94",CannotOpenCloudFolder:"\u60a8\u7684\u96f2\u7aef\u6587\u6a94\u593e\u7121\u6cd5\u6253\u958b",CannotDeleteCloudFile:"\u7121\u6cd5\u522a\u9664\u6b64\u4e91\u7aef\u6587\u6a94",CannotRenameCloudFile:"\u6b64\u4e91\u7aef\u6587\u6a94\u7684\u540d\u5b57\u7121\u6cd5\u66f4\u6539",DoYouWantToSaveChanges:"\u60a8\u8981\u4fdd\u5b58\u7576\u524d\u6587\u6a94\u55ce\uff1f",NotApplicableToSelectedAction:"\u6b64\u503c\u4e0d\u9069\u7528\u65bc\u7576\u524d\u9078\u64c7\u7bc4\u570d",ThisElementIsLocked:"\u9019\u500b\u90e8\u4ef6\u88ab\u9396\u5b9a\u3002",ThisCannotBeUndone:"\u9019\u500b\u64cd\u4f5c\u4e00\u65e6\u57f7\u884c\u5c31\u4e0d\u80fd\u64a4\u92b7\u3002",AzimuthOfNorthIsZero:"\u6b63\u5317\u7684\u65b9\u4f4d\u89d2\u70ba\u96f6\u5ea6",CounterclockwiseAzimuthIsPositive:"\u9006\u6642\u91dd\u70ba\u6b63",MoveCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u758a\uff0c\u79fb\u52d5\u53d6\u6d88\u3002",MoveOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u79fb\u52d5\u53d6\u6d88\u3002",RotationCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u758a\uff0c\u65cb\u8f49\u53d6\u6d88\u3002",RotationOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u65cb\u8f49\u53d6\u6d88\u3002",ResizingCancelledBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u758a\uff0c\u5c3a\u5bf8\u8abf\u6574\u53d6\u6d88\u3002",ResizingOutsideBoundaryCancelled:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u5c3a\u5bf8\u8abf\u6574\u53d6\u6d88\u3002",CannotPasteOutsideBoundary:"\u4f4d\u7f6e\u51fa\u754c\uff0c\u4e0d\u80fd\u8907\u5236\u3002",CannotPasteBecauseOfOverlap:"\u4f4d\u7f6e\u91cd\u758a\uff0c\u4e0d\u80fd\u8907\u5236\u3002",CannotMoveObjectTooFar:"\u4f4d\u7f6e\u592a\u9060\uff0c\u79fb\u52d5\u53d6\u6d88\u3002",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"\u63a1\u7528\u65b0\u4f48\u5c40\u4e4b\u524d\u5fc5\u9808\u79fb\u9664\u73fe\u6709\u7684\u5149\u4f0f\u677f\u3002",DoYouWantToContinue:"\u60a8\u60f3\u7e7c\u7e8c\u55ce\uff1f",SolarPanelsCannotIntersectWithGround:"\u5149\u4f0f\u677f\u4e0d\u80fd\u548c\u5730\u9762\u63a5\u89f8\u3002",SolarPanelsCannotOverlapWithOneAnother:"\u5149\u4f0f\u677f\u4e0d\u80fd\u91cd\u758a\u3002",ScreenshotSaved:"\u622a\u5c4f\u5716\u7247\u4fdd\u5b58\u5728\u4e0b\u8f09\u6587\u6a94\u593e\u88e1\u3002",CsvFileSaved:"CSV\u4fdd\u5b58\u5728\u4e0b\u8f09\u6587\u6a94\u593e\u88e1\u3002",SimulationStarted:"\u6a21\u64ec\u958b\u59cb\u3002",SimulationCompleted:"\u6a21\u64ec\u7d50\u675f\u3002",SimulationAborted:"\u6a21\u64ec\u53d6\u6d88\u3002",SimulationPaused:"\u6a21\u64ec\u66ab\u505c\u3002",CancelSimulation:"\u53d6\u6d88\u6a21\u64ec",PauseSimulation:"\u66ab\u505c\u6a21\u64ec",ResumeSimulation:"\u7e7c\u7e8c\u6a21\u64ec",SimulationWillNotStartDueToErrors:"\u7531\u65bc\u932f\u8aa4\u6a21\u64ec\u7121\u6cd5\u904b\u884c",SimulationWillStartDespiteWarnings:"\u767c\u73fe\u554f\u984c\uff0c\u4f46\u6a21\u64ec\u4ecd\u7136\u5c07\u904b\u884c\u3002",EvolutionStarted:"\u6f14\u5316\u958b\u59cb\u3002",EvolutionCompleted:"\u6f14\u5316\u7d50\u675f\u3002",EvolutionAborted:"\u6f14\u5316\u53d6\u6d88\u3002",EvolutionPaused:"\u6f14\u5316\u66ab\u505c\u3002",EncounterEvolutionError:"\u6f14\u5316\u51fa\u932f\u3002",CancelEvolution:"\u53d6\u6d88\u6f14\u5316",PauseEvolution:"\u66ab\u505c\u6f14\u5316",ResumeEvolution:"\u7e7c\u7e8c\u6f14\u5316",ConvergenceThresholdHasBeenReached:"\u6536\u6582\u95be\u503c\u5df2\u9054\u5230\u3002",MaximumNumberOfGenerationsHasBeenReached:"\u6700\u5927\u4e16\u4ee3\u6578\u5df2\u9054\u5230\u3002",MaximumNumberOfStepsHasBeenReached:"\u6700\u5927\u6b65\u6578\u5df2\u9054\u5230\u3002",ObjectiveFunctionTypeError:"\u6b64\u64cd\u4f5c\u4e0d\u652f\u6301\u7576\u524d\u7684\u76ee\u6a19\u51fd\u6578\u3002\u8acb\u5f9e\u83dc\u55ae\u555f\u52d5\u6b64\u529f\u80fd\u3002",WallsAreNotAtSameHeight:"\u58bb\u9ad4\u9ad8\u5ea6\u4e0d\u540c\u3002",WallsAreNotPerpendicular:"\u58bb\u9ad4\u4e0d\u5782\u76f4\u3002",WallsAreNotConnected:"\u58bb\u9ad4\u4e0d\u76f8\u9023\u3002",WallsNumberNeedToBeFour:"\u58bb\u9ad4\u6578\u91cf\u5fc5\u9808\u70ba\u56db\u500b\u3002",BuildingContainsEmptyWall:"\u5efa\u7bc9\u7269\u6709\u7a7a\u7246\u3002",BuildingRoofMissing:"\u5efa\u7bc9\u7269\u6c92\u6709\u5c4b\u9802\u3002",UnknownErrors:"\u672a\u77e5\u932f\u8aa4\u3002"},menu:{AnalysisOptions:"\u5206\u6790\u9078\u9805",option:{GridCellSize:"\u8a08\u7b97\u7db2\u683c\u7684\u5c3a\u5bf8",SamplingFrequency:"\u63a1\u6a23\u983b\u7387",TimesPerHour:"\u6bcf\u5c0f\u6642\u63a1\u6a23\u6b21\u6578",DaysPerYear:"\u6bcf\u4e00\u5e74\u63a1\u6a23\u5929\u6578"},mainMenu:"\u4e3b\u83dc\u55ae",cloudMenu:"\u96f2\u83dc\u55ae",projectSubMenu:"\u9805\u76ee",project:{CreateNewProject:"\u5275\u5efa\u65b0\u9805\u76ee",OpenProject:"\u6253\u958b\u9805\u76ee",SaveProjectAs:"\u53e6\u5b58\u9805\u76ee\u70ba",YouMustLogInToCreateProject:"\u60a8\u5fc5\u9808\u767b\u9304\u624d\u80fd\u5275\u5efa\u9805\u76ee",YouMustLogInToOpenProject:"\u60a8\u5fc5\u9808\u767b\u9304\u624d\u80fd\u6253\u958b\u9805\u76ee"},fileSubMenu:"\u6587\u6a94",file:{CreateNewFile:"\u5275\u5efa\u65b0\u6587\u6a94",OpenLocalFile:"\u6253\u958b\u672c\u5730\u6587\u6a94",SaveAsLocalFile:"\u4fdd\u5b58\u70ba\u672c\u5730\u6587\u6a94",SavingAbortedMustHaveValidFileName:"\u6587\u6a94\u540d\u7121\u6548\uff0c\u4fdd\u5b58\u5931\u6557",OpenCloudFile:"\u6253\u958b\u96f2\u7aef\u6587\u6a94",SaveCloudFile:"\u4fdd\u5b58\u96f2\u7aef\u6587\u6a94",SaveAsCloudFile:"\u4fdd\u5b58\u70ba\u96f2\u7aef\u6587\u6a94",SavingAbortedMustHaveValidTitle:"\u96f2\u7aef\u6587\u6a94\u540d\u7121\u6548\uff0c\u4fdd\u5b58\u5931\u6557",ToSaveYourWorkPleaseSignIn:"\u70ba\u4e86\u4fdd\u5b58\u60a8\u7684\u96f2\u7aef\u6587\u6a94\uff0c\u8acb\u60a8\u5148\u767b\u9304\u3002",TakeScreenshot:"\u622a\u5c4f",UseCloudFileName:"\u63a1\u7528\u96f2\u7aef\u6587\u4ef6\u540d",PublishOnModelsMap:"\u767c\u4f48\u5230\u5730\u5716\u4e0a",PublishedOnModelsMap:"\u60a8\u7684\u6a21\u578b\u6210\u529f\u767c\u4f48\u5230\u5730\u5716\u4e0a",UpdatedOnModelsMap:"\u60a8\u7684\u6a21\u578b\u66f4\u65b0\u6210\u529f",YouMustLogInToPublishYourModel:"\u60a8\u5fc5\u9808\u767b\u9304\u624d\u80fd\u767c\u5e03\u6a21\u578b",YouCannotPublishAModelThatYouDoNotOwn:"\u60a8\u4e0d\u80fd\u767c\u5e03\u4ed6\u4eba\u7684\u6a21\u578b",YouMustSaveModelOnCloudBeforePublishingIt:"\u60a8\u5fc5\u9808\u5148\u628a\u6b64\u6a21\u578b\u4fdd\u5b58\u5728\u96f2\u7aef\u624d\u80fd\u767c\u5e03\u5b83"},editSubMenu:"\u7de8\u8f2f",edit:{Undo:"\u64a4\u92b7",Redo:"\u91cd\u505a"},viewSubMenu:"\u8996\u754c",view:{NavigationView:"\u5c0e\u822a\u6a21\u5f0f",TwoDimensionalView:"\u4e8c\u7dad\u6a21\u5f0f",ResetView:"\u91cd\u7f6e\u8996\u89d2",ZoomIn:"\u653e\u5927",ZoomOut:"\u7e2e\u5c0f",AutoRotate:"\u81ea\u52d5\u65cb\u8f49",ShowShadow:"\u986f\u793a\u9670\u5f71",ShowSurfaceShininess:"\u986f\u793a\u8868\u9762\u5149\u6fa4",TranslucentFloatingWindows:"\u900f\u660e\u6d6e\u52d5\u7a97\u53e3",accessoriesSubMenu:"\u914d\u4ef6",accessories:{SiteInformation:"\u4f4d\u7f6e\u8cc7\u8a0a",DesignInformation:"\u8a2d\u8a08\u8cc7\u8a0a",Instruction:"\u64cd\u4f5c\u8aaa\u660e",StickyNote:"\u4fbf\u7c3d",Note:"\u4fbf\u7c3d"}},settingsSubMenu:"\u8a2d\u7f6e",settings:{WeatherData:"\u6c23\u8c61\u6578\u64da",DiurnalTemperature:"\u665d\u591c\u6eab\u5ea6",Heliodon:"\u65e5\u5f71\u5100",SunAndTime:"\u592a\u967d\u548c\u6642\u9593"},benchmarksSubMenu:"\u57fa\u6e96",benchmarks:{SolarRadiationPredictionVsMeasurement:"\u592a\u967d\u80fd\u8f3b\u5c04\u6a21\u578b\u9810\u6e2c\u548c\u5be6\u969b\u6e2c\u91cf\u7684\u5c0d\u6bd4",BESTESTCase600:"\u5efa\u7bc9\u7269\u80fd\u8017\u6a21\u64ec\u6e2c\u8a66\uff1aBESTEST\u6848\u4f8b600",BESTESTCase610:"\u5efa\u7bc9\u7269\u80fd\u8017\u6a21\u64ec\u6e2c\u8a66\uff1aBESTEST\u6848\u4f8b610",BESTESTCase620:"\u5efa\u7bc9\u7269\u80fd\u8017\u6a21\u64ec\u6e2c\u8a66\uff1aBESTEST\u6848\u4f8b620",BESTESTCase630:"\u5efa\u7bc9\u7269\u80fd\u8017\u6a21\u64ec\u6e2c\u8a66\uff1aBESTEST\u6848\u4f8b630"},graph:{LineWidth:"\u7dda\u689d\u5bec\u5ea6",SymbolSize:"\u7b26\u865f\u5927\u5c0f",BarCategoryGap:"\u76f4\u689d\u9593\u9699",ShowHorizontalGridLines:"\u986f\u793a\u683c\u5b50\u7684\u6c34\u5e73\u7dda\u689d",ShowVerticalGridLines:"\u986f\u793a\u683c\u5b50\u7684\u8c4e\u76f4\u7dda\u689d"},analysisSubMenu:"\u5206\u6790",physicsSubMenu:"\u7269\u7406",physics:{DailySolarRadiationHeatmap:"\u7576\u65e5\u592a\u967d\u8f3b\u5c04\u7e3d\u91cf\u5206\u4f48\u71b1\u5716",SolarRadiationHeatmapOptions:"\u592a\u967d\u8f3b\u5c04\u71b1\u5716\u9078\u9805",SolarRadiationHeatmapGridCellSize:"\u592a\u967d\u8f3b\u5c04\u71b1\u5716\u7db2\u683c\u7684\u5c3a\u5bf8",SolarRadiationHeatmapMaxValue:"\u592a\u967d\u8f3b\u5c04\u71b1\u5716\u6700\u5927\u503c",SolarRadiationHeatmapNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b",ReflectionHeatmap:"\u53cd\u5c04\u71b1\u5716"},sensorSubMenu:"\u50b3\u611f\u5668",sensor:{CollectDailyData:"\u6536\u96c6\u7576\u5929\u6578\u64da",CollectYearlyData:"\u6536\u96c6\u5168\u5e74\u6578\u64da",SensorSimulationNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b"},buildingSubMenu:"\u5efa\u7bc9\u7269",building:{AnalyzeDailyBuildingEnergy:"\u5efa\u7bc9\u7269\u7576\u5929\u80fd\u8017\u5206\u6790",AnalyzeYearlyBuildingEnergy:"\u5efa\u7bc9\u7269\u5168\u5e74\u80fd\u8017\u5206\u6790",EnergyAnalysisOptions:"\u80fd\u8017\u5206\u6790\u9078\u9805",EnergyGridCellSize:"\u8a08\u7b97\u7db2\u683c\u7684\u5c3a\u5bf8",BuildingEnergySimulationNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b"},solarPanelSubMenu:"\u592a\u967d\u80fd\u5149\u4f0f\u677f",solarPanel:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa",AnalyzeVisibility:"\u5206\u6790\u53ef\u898b\u5ea6",PanelDiscretization:"\u5149\u4f0f\u677f\u96e2\u6563\u5316\u65b9\u6cd5",Exact:"\u6e96\u78ba",Approximate:"\u8fd1\u4f3c",EnergyGridCellSize:"\u8a08\u7b97\u7db2\u683c\u7684\u5c3a\u5bf8",VisibilityGridCellSize:"\u8996\u754c\u56e0\u5b50\u8a08\u7b97\u7db2\u683c\u7684\u5c3a\u5bf8",EnergyAnalysisOptions:"\u80fd\u91cf\u5206\u6790\u9078\u9805",VisibilityAnalysisOptions:"\u53ef\u898b\u5ea6\u5206\u6790\u9078\u9805",SolarPanelSimulationNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b"},parabolicTroughSubMenu:"\u62cb\u7269\u7dda\u69fd",parabolicTrough:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa"},parabolicDishSubMenu:"\u62cb\u7269\u7dda\u789f",parabolicDish:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa"},fresnelReflectorSubMenu:"\u83f2\u6d85\u723e\u53cd\u5c04\u93e1",fresnelReflector:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa"},heliostatSubMenu:"\u5b9a\u65e5\u93e1",heliostat:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa"},solarUpdraftTowerSubMenu:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854",solarUpdraftTower:{AnalyzeDailyYield:"\u5206\u6790\u7576\u5929\u7522\u51fa",AnalyzeYearlyYield:"\u5206\u6790\u5168\u5e74\u7522\u51fa",SolarUpdraftTowerSimulationNoAnimation:"\u82e5\u7121\u79fb\u52d5\u90e8\u4ef6\u5247\u7701\u7565\u52d5\u756b"},tutorialsSubMenu:"\u6559\u7a0b",solarEnergyScienceSubMenu:"\u592a\u967d\u80fd\u79d1\u5b78",solarEnergyScienceTutorials:{SunAngles:"\u592a\u967d\u76f8\u5c0d\u65bc\u5730\u9762\u89c0\u5bdf\u8005\u7684\u89d2\u5ea6",InsolationAndClimate:"\u592a\u967d\u8f3b\u5c04\u548c\u6c23\u5019\u7684\u95dc\u4fc2",SolarRadiationToBox:"\u4e00\u500b\u9577\u65b9\u9ad4\u53d7\u5230\u7684\u592a\u967d\u80fd\u8f3b\u5c04\u5206\u6790"},buildingScienceSubMenu:"\u5efa\u7bc9\u79d1\u5b78",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"\u623f\u5c4b\u7684\u71b1\u5b78\u5c01\u5957\u548c\u570d\u8b77\u5c01\u5957",EffectOfSizeOnBuildingEnergy:"\u623f\u5c4b\u5927\u5c0f\u5c0d\u80fd\u8017\u7684\u5f71\u97ff",EffectOfOrientationOnBuildingEnergy:"\u623f\u5c4b\u65b9\u4f4d\u5c0d\u80fd\u8017\u7684\u5f71\u97ff",EffectOfInsulationOnBuildingEnergy:"\u623f\u5c4b\u9694\u71b1\u5c0d\u80fd\u8017\u7684\u5f71\u97ff",EffectOfRoofColorOnBuildingEnergy:"\u5c4b\u9802\u984f\u8272\u5c0d\u5efa\u7bc9\u7269\u80fd\u8017\u7684\u5f71\u97ff",EffectOfEavesOverhangLengthOnBuildingEnergy:"\u5c4b\u7c37\u5ef6\u4f38\u9577\u5ea6\u5c0d\u5efa\u7bc9\u7269\u80fd\u8017\u7684\u5f71\u97ff",EffectOfWindowSHGCOnBuildingEnergy:"\u7a97\u6236\u592a\u967d\u80fd\u8f38\u5165\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff",EffectOfThermostatSetpointOnBuildingEnergy:"\u6046\u6eab\u5668\u8a2d\u5b9a\u503c\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff",EffectOfSolarPanelsOnBuildingEnergy:"\u5149\u4f0f\u677f\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff",EffectOfGroundTemperatureOnBuildingEnergy:"\u5730\u8868\u6e29\u5ea6\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff",EffectOfTreesOnBuildingEnergy:"\u6a39\u852d\u5c0d\u623f\u5c4b\u80fd\u8017\u7684\u5f71\u97ff"},buildingDesignSubMenu:"\u5efa\u7bc9\u8a2d\u8a08",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"\u6709\u68da\u9802\u7a97\u7684\u79d1\u5fb7\u89d2\u98a8\u683c\u7684\u4f4f\u5b85",MansardRoofWithDormers:"\u6709\u5929\u7a97\u7684\u6298\u7dda\u5c4b\u9802",GableRoofVsHipRoof:"\u96d9\u5761\u5c4b\u9802\u548c\u56db\u5761\u5c4b\u9876\u7684\u5c0d\u6bd4",ColonialVsSaltbox:"\u6b96\u6c11\u5730\u98a8\u683c\u548c\u9e7d\u76d2\u98a8\u683c\u7684\u5c0d\u6bd4",GambrelRoofVsMansardRoof:"\u590d\u659c\u5c4b\u9876\u548c\u6298\u7dda\u5c4b\u9802\u7684\u5c0d\u6bd4",CombinationRoofVsBonnetRoof:"\u7d44\u5408\u5c4b\u9802\u548c\u5e3d\u7c37\u5c4b\u9802\u7684\u5c0d\u6bd4",DutchGableRoof:"\u8377\u862d\u96d9\u5761\u5c4b\u9802",GableAndValleyRoof:"\u5761\u8c37\u5c4b\u9802",ClerestoryRoof:"\u5929\u7a97\u5c4b\u9802",MonitorRoof:"\u63a1\u5149\u5c4b\u9802",AFrameHouse:"A\u5b57\u5f62\u623f\u5b50",HalfTimberedHouse:"\u534a\u6728\u9aa8\u67b6\u623f\u5b50",AllBasicRoofTypes:"\u6240\u6709\u7684\u57fa\u672c\u5c4b\u9802\u985e\u578b"},photovoltaicSolarPowerSubMenu:"\u5149\u4f0f\u767c\u96fb",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"\u5149\u4f0f\u677f\u50be\u659c\u89d2\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",EffectOfAzimuthOfSolarPanel:"\u5149\u4f0f\u677f\u65b9\u4f4d\u89d2\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",SolarPanelTypes:"\u5149\u4f0f\u677f\u985e\u578b",VerticalBifacialSolarPanels:"\u8c4e\u76f4\u7684\u96d9\u9762\u5149\u4f0f\u677f",CompareMonofacialAndBifacialSolarPanels:"\u55ae\u9762\u5149\u4f0f\u677f\u548c\u96d9\u9762\u5149\u4f0f\u677f\u7684\u5c0d\u6bd4",SolarTrackers:"\u81ea\u52d5\u8ffd\u65e5\u5668",CoveringGroundWithSolarPanels:"\u70ba\u4ec0\u9ebc\u6211\u5011\u4e0d\u7c21\u55ae\u5730\u7528\u5149\u4f0f\u677f\u8986\u84cb\u5730\u9762",InterRowSpacingOfSolarPanelArray:"\u5149\u4f0f\u677f\u9663\u5217\u884c\u9593\u8ddd\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",EffectOfOrientationOfSolarPanels:"\u5149\u4f0f\u677f\u6392\u5217\u65b9\u5411\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",SolarPanelArrayAutomaticLayout:"\u5149\u4f0f\u677f\u81ea\u52d5\u6392\u5217"},concentratedSolarPowerSubMenu:"\u5149\u71b1\u767c\u96fb",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"\u62cb\u7269\u7dda\u69fd\u65b9\u4f4d\u89d2\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",EffectOfLatusRectumOfParabolicTrough:"\u62cb\u7269\u7dda\u69fd\u901a\u5f91\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",FocusSunlightWithParabolicDish:"\u7528\u62cb\u7269\u7dda\u789f\u805a\u7126\u9633\u5149",LinearFresnelReflectors:"\u7528\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u805a\u7126\u9633\u5149",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"\u5438\u71b1\u7ba1\u7684\u5b89\u88c5\u9ad8\u5ea6\u5c0d\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u767c\u96fb\u91cf\u7684\u5f71\u97ff",EffectOfAzimuthOfLinearFresnelReflectors:"\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u65b9\u4f4d\u89d2\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",LinearFresnelReflectorsWithTwoAbsorbers:"\u914d\u5099\u5169\u500b\u5438\u6536\u7ba1\u7684\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u9663\u5217",CosineEfficiencyOfHeliostats:"\u5b9a\u65e5\u93e1\u7684\u9918\u5f26\u6548\u7387",ShadowingAndBlockingOfHeliostats:"\u5b9a\u65e5\u93e1\u7684\u9670\u5f71\u548c\u906e\u64cb",EffectSolarPowerTowerHeight:"\u5438\u6536\u5854\u9ad8\u5ea6\u5c0d\u767c\u96fb\u91cf\u7684\u5f71\u97ff",SolarPowerTower:"\u5854\u5f0f\u5149\u71b1\u767c\u96fb\u7ad9"},otherTypesOfSolarPowerSubMenu:"\u5176\u5b83\u985e\u578b\u7684\u592a\u967d\u80fd\u767c\u96fb",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854"},generativeDesignSubMenu:"\u751f\u6210\u5f0f\u8a2d\u8a08",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"\u55ae\u9762\u5149\u4f0f\u677f\u9663\u5217\u7684\u50be\u659c\u89d2",BifacialSolarPanelArrayTiltAngle:"\u96d9\u9762\u5149\u4f0f\u677f\u9663\u5217\u7684\u50be\u659c\u89d2",OutputOfSolarPanelArrayInDifferentPlaces:"\u4e00\u500b\u5149\u4f0f\u677f\u9663\u5217\u5728\u4e0d\u540c\u5730\u5340\u7684\u7522\u51fa",SimpleSolarFarmParetoFront:"\u7c21\u55ae\u592a\u967d\u80fd\u8fb2\u5834\u8a2d\u8a08\u7684\u5e15\u7d2f\u6258\u524d\u6cbf"},examplesSubMenu:"\u4f8b\u5b50",solarEnergySubMenu:"\u592a\u967d\u80fd",solarEnergyExamples:{SunBeamAndHeliodon:"\u592a\u967d\u5149\u675f\u548c\u65e5\u5f71\u5100",RooftopSolarPanels:"\u5c4b\u9802\u5149\u4f0f\u677f",NevadaSolarOneParabolicTroughArray:"\u5167\u83ef\u9054\u5dde\u592a\u967d\u80fd\u4e00\u865f\u7684\u62cb\u7269\u7dda\u69fd\u9663\u5217",TooeleParabolicDishArray:"\u7336\u4ed6\u5dde\u5716\u57c3\u52d2\u7684\u62cb\u7269\u7dda\u789f\u9663\u5217",PS10SolarPowerTower:"\u897f\u73ed\u7259\u585e\u7dad\u5229\u4e9e\u7684PS10\u592a\u967d\u80fd\u767c\u96fb\u5854",TucsonLinearFresnelReflectors:"\u4e9e\u5229\u6851\u90a3\u5dde\u5716\u68ee\u7684\u76f4\u7dda\u5f0f\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u9663\u5217",SolarCanopyFormFactors:"\u592a\u967d\u80fd\u5929\u7bf7\u5916\u5f62\u8a2d\u8a08",SolarCanopyOverBleachers:"\u770b\u53f0\u592a\u967d\u80fd\u5929\u7bf7",SolarCanopyOverGarage:"\u8eca\u5eab\u592a\u967d\u80fd\u5929\u7bf7",SolarBusStop:"\u592a\u967d\u80fd\u5019\u8eca\u4ead",SolarFacadeTesla:"\u7279\u65af\u62c9\u5149\u4f0f\u7246",BuildingIntegratedPhotovoltaics:"\u5efa\u7bc9\u6574\u5408\u5149\u4f0f",Floatovoltaics:"\u6d6e\u52d5\u5149\u4f0f",Agrivoltaics:"\u8fb2\u696d\u5149\u4f0f",VegetativeBuffer:"\u592a\u967d\u80fd\u8fb2\u5834\u7eff\u5316\u5e26",RainbowSwashSolarFarmBostonMA:"\u99ac\u85a9\u8af8\u585e\u5dde\u6ce2\u58eb\u9813\u5f69\u8679\u6fc0\u6d41\u65c1\u908a\u7684\u5149\u4f0f\u677f\u9663\u5217",MickeyMouseSolarFarmOrlandoFL:"\u4f5b\u7f85\u91cc\u9054\u5dde\u5967\u862d\u591a\u7684\u7c73\u8001\u9f20\u5f62\u72c0\u5149\u4f0f\u677f\u9663\u5217",SolarPanelsOverCanalBakersfieldCA:"\u52a0\u5229\u798f\u5c3c\u4e9e\u5dde\u8c9d\u514b\u65af\u83f2\u723e\u5fb7\u704c\u6e89\u6e20\u4e0a\u5047\u60f3\u7684\u5149\u4f0f\u677f\u9663\u5217",SolarNoiseBarrierLexingtonMA:"\u99ac\u85a9\u8af8\u585e\u5dde\u5217\u524b\u661f\u6566\u9ad8\u901f\u516c\u8def\u566a\u97f3\u7246\u4e0a\u5047\u60f3\u7684\u5149\u4f0f\u677f",HSATSolarTrackersRaleighNC:"\u5317\u5361\u7f85\u4f86\u7d0d\u5dde\u7f85\u5229\u7684\u4e00\u500b\u6c34\u5e73\u65b9\u5411\u55ae\u8ef8\u65cb\u8f49\u8ffd\u65e5\u5149\u4f0f\u677f\u9663\u5217\uff08HSAT\uff09",AADATSolarTrackersLancasterCA:"\u52a0\u5229\u798f\u5c3c\u4e9e\u5dde\u862d\u958b\u65af\u7279\u7684\u4e00\u500b\u96d9\u8ef8\u65cb\u8f49\u8ffd\u65e5\u5149\u4f0f\u677f\u9663\u5217\uff08AADAT\uff09",SolarTrackersInRealWorld:"\u6a21\u64ec",SolarUpdraftTowerInCity:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u5728\u57ce\u5e02\u4e2d\u7684\u61c9\u7528"},builtEnvironmentSubMenu:"\u5efa\u9020\u74b0\u5883",residentialBuildingsSubMenu:"\u4f4f\u5b85\u5efa\u7bc9",residentialBuildingExamples:{ColonialHouse:"\u6b96\u6c11\u5730\u98a8\u683c\u7684\u4f4f\u5b85",DutchColonialHouse:"\u8377\u862d\u6b96\u6c11\u5730\u98a8\u683c\u7684\u4f4f\u5b85",TShapedHouse:"T\u5b57\u578b\u623f\u5b50",CapeCodHouseWithGarage:"\u6709\u8eca\u5eab\u7684\u79d1\u5fb7\u89d2\u98a8\u683c\u7684\u4f4f\u5b85",Solarium:"\u6709\u65e5\u5149\u6d74\u5ba4\u7684\u623f\u5b50",Church1:"\u6559\u5802\u4f8b\u4e00",Cathedral1:"\u4e3b\u6559\u5ea7\u5802\u4f8b\u4e00",Cathedral2:"\u4e3b\u6559\u5ea7\u5802\u4f8b\u4e8c",Mosque1:"\u6e05\u771f\u5bfa\u4f8b\u4e00",AdobeTaosHouse:"\u9676\u65af\u571f\u576f\u623f",RanchHouse:"\u7267\u5834\u98a8\u683c\u7684\u4f4f\u5b85",BonnetHouse:"\u6709\u5e3d\u7c37\u5c4b\u9802\u7684\u4f4f\u5b85",BarnStyleHouse:"\u7a40\u5009\u5f0f\u98a8\u683c\u7684\u4f4f\u5b85",ModernHouse:"\u73fe\u4ee3\u98a8\u683c\u7684\u4f4f\u5b85",ButterflyRoofHouse:"\u8774\u8776\u578b\u5c4b\u9802\u7684\u4f4f\u5b85"},commercialBuildingsSubMenu:"\u5546\u7528\u5efa\u7bc9",commercialBuildingExamples:{WhiteHouse:"\u767d\u5bab",BilimMersinTurkiye:"\u571f\u8033\u5176\u6885\u723e\u8f9b\u79d1\u5b78\u6559\u80b2\u4e2d\u5fc3",SpanishStyleHotel:"\u897f\u73ed\u7259\u98a8\u683c\u65c5\u9928",ApartmentBuilding:"\u516c\u5bd3\u6a13",OfficeBuilding:"\u5beb\u5b57\u6a13",Hotel:"\u65c5\u9928"},buildingComplexesSubMenu:"\u5efa\u7bc9\u7fa4",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"\u4f5b\u8499\u7279\u5dde\u5357\u4f2f\u9748\u9813\u9ad8\u4e2d",MescaleroApacheSchoolNewMexico:"\u65b0\u58a8\u897f\u54e5\u5dde\u6885\u65af\u5361\u52d2\u7f85\u963f\u5e15\u5947\u5b78\u6821"},urbanPlanningSubMenu:"\u57ce\u5e02\u898f\u5283",urbanPlanningExamples:{Heatmap1:"\u71b1\u5716\u4f8b\u4e00"},otherBuildingsSubMenu:"\u5176\u5b83\u5efa\u7bc9",otherBuildingExamples:{Greenhouse:"\u6eab\u5ba4",Pavilion:"\u516c\u5712\u7684\u4ead\u5b50",OctagonalPagoda:"\u516b\u89d2\u5854",OceanFront:"\u6d77\u908a",EgyptianPyramids:"\u57c3\u53ca\u91d1\u5b57\u5854",MayanPyramid:"\u746a\u96c5\u91d1\u5b57\u5854",SiOSePol:"\u4e09\u5341\u4e09\u5b54\u6a4b",StackedCuboids:"\u5806\u780c\u9577\u65b9\u9ad4"},artificialIntelligenceSubMenu:"\u4eba\u5de5\u667a\u6167",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"\u512a\u5316\u55ae\u6392\u5149\u4f0f\u677f\u7684\u50be\u659c\u89d2",OptimizingTiltAnglesOfMultipleSolarPanelRows:"\u512a\u5316\u591a\u6392\u5149\u4f0f\u677f\u7684\u50be\u659c\u89d2",SolarFarmGenerativeDesign:"\u751f\u6210\u5f0f\u8a2d\u8a08\u592a\u967d\u80fd\u8fb2\u5834",SolarFarmGenerativeDesignWithBlock:"\u751f\u6210\u5f0f\u8a2d\u8a08\u592a\u967d\u80fd\u8fb2\u5834\uff1a\u5468\u908a\u6709\u5efa\u7bc9\u7269\u7684\u60c5\u6cc1",FitchburgSolarFarmGenerativeDesign:"\u751f\u6210\u5f0f\u8a2d\u8a08\u592a\u967d\u80fd\u8fb2\u5834\uff1a\u771f\u5be6\u4e16\u754c\u6848\u4f8b"},languageSubMenu:"\u8a9e\u8a00",publicSubMenu:"\u516c\u5171",ModelsGallery:"\u6a21\u578b\u756b\u5eca",ModelsMap:"\u6a21\u578b\u5730\u5716",AboutUs:"\u95dc\u65bc\u6211\u5011"},avatarMenu:{AccountSettings:"\u8cec\u865f\u8a2d\u5b9a",PrivacyStatementTitle:"\u7528\u6236\u96b1\u79c1\u6b0a\u4fdd\u8b77\u8072\u660e",PrivacyStatement:"\u767b\u9304\u9700\u8981\u63a1\u7528\u60a8\u7684\u8c37\u6b4cID\u5efa\u7acb\u6216\u9032\u5165\u60a8\u7684\u963f\u62c9\u4e01\u8cec\u6236\u3002 \u6211\u5011\u53ea\u5132\u5b58\u4e00\u500b\u96a8\u6a5f\u7684\u5b57\u7b26\u4e32\u4f5c\u70ba\u60a8\u7684ID\u3002 \u4efb\u4f55\u95dc\u65bc\u60a8\u7684\u53ef\u8fa8\u8b58\u7684\u500b\u4eba\u4fe1\u606f\u90fd\u6c92\u6709\u88ab\u6536\u96c6\u3002 \u8a73\u60c5\u8acb\u53c3\u8003\u6211\u5011\u7684",SignIn:"\u767b\u9304",SignOut:"\u9000\u51fa\u8cec\u865f",IfYouAreAStudent:"\u5982\u679c\u60a8\u662f\u4e00\u500b\u5b78\u751f"},skyMenu:{Axes:"\u986f\u793a\u5750\u6a19\u8ef8",Theme:"\u74b0\u5883\u4e3b\u984c",ThemeDefault:"\u9ed8\u8a8d",ThemeDesert:"\u6c99\u6f20",ThemeDune:"\u6c99\u4e18",ThemeForest:"\u68ee\u6797",ThemeGrassland:"\u8349\u539f",ThemeHill:"\u4e18\u9675",ThemeLake:"\u6e56\u6cca",ThemeMountain:"\u5c71\u8108",ThemeRural:"\u7530\u5712",SunlightAttenuationCoefficientInAir:"\u967d\u5149\u5728\u7a7a\u6c23\u4e2d\u50b3\u64ad\u7684\u8870\u6e1b\u4fc2\u6578",ConvectiveCoefficientOfAir:"\u7a7a\u6c23\u5c0d\u6d41\u50b3\u71b1\u4fc2\u6578",HighestTemperatureTimeInMinutes:"\u6700\u9ad8\u6c23\u6eab\u6642\u9593(\u5206\u9418)",SelectSunAnglesToShow:"\u9078\u64c7\u592a\u967d\u89d2\u5ea6\u986f\u793a",ShowAzimuthAngle:"\u986f\u793a\u65b9\u4f4d\u89d2",ShowElevationAngle:"\u986f\u793a\u9ad8\u5ea6\u89d2",ShowZenithAngle:"\u986f\u793a\u5929\u9802\u89d2",DirectLightBrightnessAtNoon:"\u6b63\u5348\u76f4\u5c04\u5149\u7167\u5ea6",AmbientLightBrightnessAtNoon:"\u6b63\u5348\u74b0\u5883\u5149\u7167\u5ea6"},groundMenu:{MonthlyIrradianceLoss:"\u6708\u4efd\u8f3b\u5c04\u5ea6\u640d\u5931\u6bd4",Vegetation:"\u690d\u88ab",LeafOutDay:"\u6a39\u8449\u9577\u51fa\u7684\u65e5\u5b50",LeafOffDay:"\u6a39\u8449\u812b\u843d\u7684\u65e5\u5b50",Albedo:"\u53cd\u7167\u7387",ImageOnGround:"\u5730\u9762\u986f\u793a\u5716\u50cf",WaterSurface:"\u6c34\u9762",RemoveAllUnlockedTrees:"\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728",RemoveAllUnlockedFlowers:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",RemoveAllUnlockedSolarPanels:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedPeople:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedFoundations:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5730\u57fa",RemoveAllUnlockedCuboids:"\u5220\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9577\u65b9\u9ad4",DoYouReallyWantToRemoveAllPeople:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u55ce",DoYouReallyWantToRemoveAllTrees:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728\u55ce",DoYouReallyWantToRemoveAllFlowers:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u55ce",DoYouReallyWantToRemoveAllSolarPanels:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",DoYouReallyWantToRemoveAllFoundations:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5730\u57fa\u55ce",DoYouReallyWantToRemoveAllCuboids:"\u4f60\u78ba\u5b9a\u522a\u9664\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9577\u65b9\u9ad4\u55ce",LockAllElements:"\u56fa\u5b9a\u6240\u6709\u7684\u90e8\u4ef6",UnlockAllElements:"\u89e3\u9664\u6240\u6709\u7684\u56fa\u5b9a"},labelSubMenu:{Label:"\u6a19\u7c64",LabelText:"\u6a19\u7c64\u7684\u5185\u5bb9",LabelHeight:"\u6a19\u7c64\u7684\u9ad8\u5ea6",LabelSize:"\u6a19\u7c64\u7684\u5927\u5c0f",LabelFontSize:"\u5b57\u9ad4\u7684\u5927\u5c0f",LabelColor:"\u6a19\u7c64\u7684\u984f\u8272",KeepShowingLabel:"\u986f\u793a\u6a19\u7c64"},foundationMenu:{RemoveAllUnlockedSolarPanels:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedParabolicTroughs:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u62cb\u7269\u7dda\u69fd",RemoveAllUnlockedParabolicDishes:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u62cb\u7269\u7dda\u789f",RemoveAllUnlockedFresnelReflectors:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",RemoveAllUnlockedHeliostats:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5b9a\u65e5\u93e1",RemoveAllUnlockedSensors:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668",RemoveAllUnlockedLights:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8",RemoveAllUnlockedWalls:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7246",RemoveAllUnlockedWindows:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6236",RemoveAllUnlockedDoors:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9580",RemoveAllUnlockedPolygons:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62",RemoveAllUnlockedHumans:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedTrees:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728",RemoveAllUnlockedFlowers:"\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",Racks:"\u652f\u67b6",Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",SolarPanels:"\u5149\u4f0f\u677f",SolarPanelArray:"\u5149\u4f0f\u677f\u9663\u5217",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",ParabolicTroughs:"\u62cb\u7269\u7dda\u69fd",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u62cb\u7269\u7dda\u69fd\u55ce",ParabolicDishes:"\u62cb\u7269\u7dda\u789f",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u62cb\u7269\u7dda\u789f\u55ce",FresnelReflectors:"\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u55ce",Heliostats:"\u5b9a\u65e5\u93e1",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5b9a\u65e5\u93e1\u55ce",Sensors:"\u50b3\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668\u55ce",Lights:"\u96fb\u71c8",DoYouReallyWantToRemoveAllLightsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8\u55ce",Walls:"\u7246",DoYouReallyWantToRemoveAllWallsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7246\u55ce",Windows:"\u7a97\u6236",DoYouReallyWantToRemoveAllWindowsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6236\u55ce",Doors:"\u9580",DoYouReallyWantToRemoveAllDoorsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9580\u55ce",Polygons:"\u591a\u908a\u5f62",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62\u55ce",Humans:"\u4eba\u7269",DoYouReallyWantToRemoveAllHumansOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u55ce",Trees:"\u6a39\u6728",DoYouReallyWantToRemoveAllTreesOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728\u55ce",Flowers:"\u82b1\u8349",DoYouReallyWantToRemoveAllFlowersOnFoundation:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u55ce",OnlyThisFoundation:"\u53ea\u9019\u584a\u5730\u57fa",AllConnectedFoundations:"\u6240\u6709\u76f8\u9023\u7684\u5730\u57fa",AllSelectedFoundations:"\u6240\u6709\u9078\u4e2d\u7684\u5730\u57fa",AllFoundations:"\u6240\u6709\u7684\u5730\u57fa",AddPolygon:"\u6dfb\u52a0\u591a\u908a\u5f62",SolarStructure:"\u592a\u967d\u80fd\u69cb\u578b",GroupMaster:"\u4e3b\u5730\u57fa",LockAllElementsOnThisFoundation:"\u56fa\u5b9a\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u7684\u90e8\u4ef6",UnlockAllElementsOnThisFoundation:"\u89e3\u9664\u6b64\u5730\u57fa\u4e0a\u6240\u6709\u7684\u56fa\u5b9a",GroundFloorRValue:"\u5efa\u7bc9\u7269\u5730\u677f\u7684R\u503c",OnlyThisGroundFloor:"\u53ea\u9019\u500b\u5efa\u7bc9\u7269\u7684\u5730\u677f",AllGroundFloors:"\u6240\u6709\u5efa\u7bc9\u7269\u7684\u5730\u677f"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"\u548c\u5b9a\u65e5\u93e1\u914d\u5957\u7684\u5438\u6536\u5854",ReceiverTowerPhysicalProperties:"\u592a\u967d\u80fd\u5438\u6536\u5854\u7684\u7269\u7406\u6027\u8cea",ReceiverTowerHeight:"\u592a\u967d\u80fd\u5438\u6536\u5854\u7684\u9ad8\u5ea6",ReceiverTowerRadius:"\u592a\u967d\u80fd\u5438\u6536\u5854\u7684\u534a\u5f91",ReceiverAbsorptance:"\u592a\u967d\u80fd\u5438\u6536\u5668\u7684\u5438\u6536\u7387",ReceiverOpticalEfficiency:"\u592a\u967d\u80fd\u5438\u6536\u5668\u7684\u5149\u6548\u7387",ReceiverThermalEfficiency:"\u592a\u967d\u80fd\u5438\u6536\u5668\u7684\u71b1\u6548\u7387"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"\u548c\u83f2\u6d85\u723e\u53cd\u5c04\u93e1\u914d\u5957\u7684\u5438\u6536\u7ba1",AbsorberPipePhysicalProperties:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u7269\u7406\u6027\u8cea",AbsorberHeight:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u5b89\u88c5\u9ad8\u5ea6",AbsorberApertureWidth:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u5b54\u5f91",AbsorberPipePoleNumber:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u652f\u67f1\u6578\u91cf",AbsorberAbsorptance:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u5438\u6536\u7387",AbsorberOpticalEfficiency:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u5149\u6548\u7387",AbsorberThermalEfficiency:"\u592a\u967d\u80fd\u5438\u6536\u7ba1\u7684\u71b1\u6548\u7387"},solarUpdraftTowerMenu:{SolarUpdraftTower:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854",SolarUpdraftTowerPhysicalProperties:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7684\u7269\u7406\u6027\u8cea",SolarUpdraftTowerChimneyHeight:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7159\u56ea\u7684\u9ad8\u5ea6",SolarUpdraftTowerChimneyRadius:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7159\u56ea\u7684\u534a\u5f91",SolarUpdraftTowerCollectorHeight:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u96c6\u71b1\u68da\u7684\u9ad8\u5ea6",SolarUpdraftTowerCollectorRadius:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u96c6\u71b1\u68da\u7684\u534a\u5f91",SolarUpdraftTowerCollectorTransmissivity:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u96c6\u71b1\u68da\u7684\u900f\u5c04\u7387",SolarUpdraftTowerCollectorEmissivity:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u96c6\u71b1\u68da\u7684\u767c\u5c04\u7387",SolarUpdraftTowerDischargeCoefficient:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7684\u6d41\u91cf\u4fc2\u6578",SolarUpdraftTowerTurbineEfficiency:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u7684\u6e26\u8f2a\u6a5f\u6548\u7387"},cuboidMenu:{Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",RemoveAllUnlockedSolarPanels:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",RemoveAllUnlockedSensors:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668",RemoveAllUnlockedPolygons:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62",RemoveAllUnlockedHumans:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269",RemoveAllUnlockedTrees:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728",RemoveAllUnlockedFlowers:"\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349",Racks:"\u652f\u67b6",SolarPanels:"\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",Sensors:"\u50b3\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668\u55ce",Polygons:"\u591a\u908a\u5f62",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62\u55ce",Humans:"\u4eba\u7269",DoYouReallyWantToRemoveAllHumansOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u4eba\u7269\u55ce",Trees:"\u6a39\u6728",DoYouReallyWantToRemoveAllTreesOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u6a39\u6728\u55ce",Flowers:"\u82b1\u8349",DoYouReallyWantToRemoveAllFlowersOnCuboid:"\u4f60\u78ba\u5b9a\u522a\u9664\u6b64\u9577\u65b9\u9ad4\u8868\u9762\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u82b1\u8349\u55ce",OnlyThisCuboid:"\u53ea\u9019\u500b\u9577\u65b9\u9ad4",AllCuboidsOnSameSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u9577\u65b9\u9ad4",AllCuboidsAboveSameBase:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u9577\u65b9\u9ad4",AllSelectedCuboids:"\u6240\u6709\u9078\u4e2d\u7684\u9577\u65b9\u9ad4",AllCuboids:"\u6240\u6709\u7684\u9577\u65b9\u9ad4",OnlyThisSide:"\u53ea\u9019\u500b\u8868\u9762",AllSidesOfThisCuboid:"\u9019\u500b\u9577\u65b9\u9ad4\u6240\u6709\u7684\u5074\u9762",AllSidesOfSelectedCuboids:"\u6240\u6709\u9078\u4e2d\u9577\u65b9\u9ad4\u6240\u6709\u7684\u5074\u9762",AllSidesOfAllCuboids:"\u6240\u6709\u7684\u9577\u65b9\u9ad4\u6240\u6709\u7684\u5074\u9762",AddPolygon:"\u6dfb\u52a0\u591a\u908a\u5f62",Stackable:"\u53ef\u5806\u780c",GroupMaster:"\u4e3b\u9577\u65b9\u9ad4"},polygonMenu:{Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",TextBox:"\u6587\u5b57\u6846",FontOutlineColor:"\u5b57\u9ad4\u8f2a\u5ed3\u984f\u8272",FontOutlineWidth:"\u5b57\u9ad4\u8f2a\u5ed3\u7dda\u5bec",FontStrokeColor:"\u5b57\u9ad4\u63cf\u908a\u984f\u8272",FontStrokeWidth:"\u5b57\u9ad4\u63cf\u908a\u7dda\u5bec",NoOutline:"\u7121\u8f2a\u5ed3\u7dda",Shiny:"\u5149\u6fa4",Filled:"\u586b\u5145",FillTexture:"\u586b\u5145\u6750\u8cea",FillColor:"\u586b\u5145\u984f\u8272",Opacity:"\u906e\u5149\u5ea6",LineColor:"\u7dda\u689d\u984f\u8272",LineWidth:"\u7dda\u689d\u5bec\u5ea6",LineStyle:"\u7dda\u689d\u6a23\u5f0f",SolidLine:"\u5be6\u7dda",DashedLine:"\u865b\u7dda",DottedLine:"\u9ede\u7dda",InsertVertexBeforeIndex:"\u524d\u9762\u63d2\u5165\u9802\u9ede",InsertVertexAfterIndex:"\u5f8c\u9762\u63d2\u5165\u9802\u9ede",DeleteVertex:"\u79fb\u9664\u9802\u9ede",OnlyThisPolygon:"\u53ea\u9019\u500b\u591a\u908a\u5f62",AllPolygonsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u591a\u908a\u5f62",AllPolygonsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u591a\u908a\u5f62",AllSelectedPolygons:"\u6240\u6709\u9078\u4e2d\u7684\u591a\u908a\u5f62",AllPolygons:"\u6240\u6709\u7684\u591a\u908a\u5f62",Layout:"\u4f48\u5c40",SolarPanelArrayLayout:"\u5149\u4f0f\u677f\u9663\u5217\u4f48\u5c40",SolarPanelArrayLayoutParametricDesign:"\u5149\u4f0f\u677f\u9663\u5217\u4f48\u5c40\u53c3\u6578\u5316\u8a2d\u8a08",SolarPanelArrayLayoutGenerativeDesign:"\u5149\u4f0f\u677f\u9663\u5217\u4f48\u5c40\u751f\u6210\u5f0f\u8a2d\u8a08",SolarPanelArrayModel:"\u5149\u4f0f\u677f\u578b\u865f",SolarPanelArrayOrientation:"\u6392\u5217\u65b9\u5411",SolarPanelArrayTiltAngle:"\u50be\u659c\u89d2\u5ea6",SolarPanelArrayRowWidth:"\u884c\u5bec\u5ea6",SolarPanelArrayInterRowSpacing:"\u884c\u9593\u8ddd",SolarPanelArrayRowSpacing:"\u884c\u9593\u8ddd",SolarPanelArrayRowAxis:"\u884c\u8ef8\u65b9\u5411",SolarPanelArrayLeftRightRowAxis:"\u5de6\u53f3\u65b9\u5411(\u76f8\u5c0d)",SolarPanelArrayUpDownRowAxis:"\u4e0a\u4e0b\u65b9\u5411(\u76f8\u5c0d)",SolarPanelArrayEastWestRowAxis:"\u6771\u897f\u65b9\u5411(\u7d55\u5c0d)",SolarPanelArrayNorthSouthRowAxis:"\u5357\u5317\u65b9\u5411(\u7d55\u5c0d)",SolarPanelArrayMargin:"\u908a\u7de3\u9918\u5730",SolarPanelArrayPoleHeight:"\u652f\u67b6\u9ad8\u5ea6",SolarPanelArrayPoleSpacing:"\u652f\u67f1\u9593\u9694",SolarPanelArrayTotalYearlyCost:"\u5168\u5e74\u7e3d\u6210\u672c",SolarPanelArrayTotalYearlyRevenue:"\u5168\u5e74\u7e3d\u6536\u5165",SolarPanelArrayTotalYearlyYield:"\u5168\u5e74\u7e3d\u767c\u96fb\u91cf",SolarPanelArrayMeanYearlyYield:"\u5e73\u5747\u5e74\u767c\u96fb\u91cf",SolarPanelArrayYearlyProfit:"\u5168\u5e74\u5229\u6f64",LayoutNotAcceptedCheckYourParameters:"\u6055\u4e0d\u80fd\u63a1\u7528\u6b64\u4f48\u5c40\u3002\u8acb\u6aa2\u67e5\u60a8\u7684\u53c3\u6578\u8a2d\u7f6e\u3002"},optimizationMenu:{Optimization:"\u512a\u5316",Parameters:"\u53c3\u6578",Variables:"\u8b8a\u91cf",Constants:"\u5e38\u91cf",GeneticAlgorithm:"\u907a\u50b3\u7b97\u6cd5",GeneticAlgorithmSettings:"\u907a\u50b3\u7b97\u6cd5\u8a2d\u5b9a",ParticleSwarmOptimization:"\u7c92\u5b50\u7fa4\u512a\u5316",ParticleSwarmOptimizationSettings:"\u7c92\u5b50\u7fa4\u512a\u5316\u8a2d\u5b9a",SolarPanelTiltAngleOptimization:"\u5149\u4f0f\u677f\u50be\u659c\u89d2\u5ea6\u512a\u5316",SolarPanelArrayLayout:"\u5149\u4f0f\u677f\u9663\u5217\u4f48\u5c40",Generation:"\u4e16\u4ee3",Gene:"\u57fa\u56e0",NormalizedVariables:"\u6a19\u6e96\u5316\u8b8a\u91cf",Objective:"\u76ee\u6a19\u51fd\u6578",ObjectiveFunctionDailyTotalYield:"\u7576\u65e5\u7e3d\u7522\u51fa",ObjectiveFunctionYearlyTotalYield:"\u5168\u5e74\u7e3d\u7522\u51fa",ObjectiveFunctionDailyMeanYield:"\u7576\u65e5\u5e73\u5747\u7522\u51fa",ObjectiveFunctionYearlyMeanYield:"\u5168\u5e74\u5e73\u5747\u7522\u51fa",ObjectiveFunctionDailyProfit:"\u7576\u65e5\u5229\u6f64",ObjectiveFunctionYearlyProfit:"\u5168\u5e74\u5229\u6f64",GeneticAlgorithmSelectionMethod:"\u907a\u50b3\u7b97\u6cd5\u9078\u64c7\u65b9\u6cd5",RouletteWheel:"\u8f2a\u76e4\u5236",Tournament:"\u6dd8\u6c70\u5236",SearchMethod:"\u641c\u7d22\u65b9\u6cd5",GlobalSearchUniformSelection:"\u5168\u5c40\u641c\u7d22\u5747\u52fb\u53d6\u6a23",LocalSearchRandomOptimization:"\u5c40\u90e8\u641c\u7d22\u96a8\u6a5f\u512a\u5316",PopulationSize:"\u7a2e\u7fa4\u500b\u9ad4\u6578\u76ee",MaximumGenerations:"\u6700\u5927\u4e16\u4ee3\u6578\u76ee",SelectionRate:"\u9078\u64c7\u6982\u7387",CrossoverRate:"\u4ea4\u914d\u6982\u7387",MutationRate:"\u7a81\u8b8a\u6982\u7387",Step:"\u6b65\u6578",SwarmSize:"\u7c92\u5b50\u6578\u76ee",MaximumSteps:"\u6700\u5927\u6b65\u6578",MaximumVelocity:"\u6700\u5927\u901f\u5ea6",InertiaWeight:"\u6163\u6027\u6b0a\u91cd",CognitiveCoefficient:"\u8a8d\u77e5\u4fc2\u6578",SocialCoefficient:"\u793e\u6703\u4fc2\u6578",ConvergenceThreshold:"\u7d42\u6b62\u689d\u4ef6\u7684\u6536\u6582\u95be\u503c",LocalSearchRadius:"\u5c40\u90e8\u641c\u7d22\u7684\u534a\u5f91",RowsPerRackRange:"\u55ae\u500b\u652f\u67b6\u4e0a\u5149\u4f0f\u677f\u884c\u6578\u7684\u8b8a\u5316\u7bc4\u570d",TiltAngleRange:"\u5149\u4f0f\u677f\u50be\u659c\u89d2\u5ea6\u7684\u8b8a\u5316\u7bc4\u570d",InterRowSpacingRange:"\u5149\u4f0f\u677f\u9663\u5217\u884c\u9593\u8ddd\u7684\u8b8a\u5316\u7bc4\u570d",ClickTargetPolygonToActivate:"\u9ede\u64ca\u76ee\u6a19\u591a\u908a\u5f62\u6fc0\u6d3b",ClickTargetFoundationToActivate:"\u9ede\u64ca\u76ee\u6a19\u5730\u57fa\u6fc0\u6d3b"},treeMenu:{ShowModel:"\u986f\u793a\u8fd1\u4f3c\u6a21\u578b",Flip:"\u7ffb\u8f49",Type:"\u6a39\u7a2e",Spread:"\u6a39\u51a0\u76f4\u5f91"},flowerMenu:{Flip:"\u7ffb\u8f49",Type:"\u54c1\u7a2e",Spread:"\u76f4\u5f91"},peopleMenu:{ChangePerson:"\u6539\u8b8a\u4eba\u7269",Flip:"\u8f49\u8eab",Observer:"\u89c0\u5bdf\u8005",ViewFromThisPerson:"\u8996\u89d2\u79fb\u5230\u6b64\u4eba\u4f4d\u7f6e"},lightMenu:{Color:"\u984f\u8272",Intensity:"\u4eae\u5ea6",Decay:"\u8870\u51cf",MaximumDistance:"\u6700\u5927\u8ddd\u96e2",Inside:"\u5185\u90e8"},solarCollectorMenu:{RelativeAzimuth:"\u76f8\u5c0d\u65b9\u4f4d\u89d2",Pole:"\u652f\u67f1",PoleHeight:"\u652f\u67f1\u9ad8\u5ea6",PoleRadius:"\u652f\u67f1\u534a\u5f91",ExtraPoleHeight:"\u984d\u5916\u7684\u652f\u67f1\u9ad8\u5ea6",ExtraPoleHeightInAdditionToHalfWidth:"\u5bec\u5ea6\u4e00\u534a\u984d\u5916\u7684\u652f\u67f1\u9ad8\u5ea6",DrawSunBeam:"\u986f\u793a\u5149\u675f"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"\u53cd\u5c04\u5668\u93e1\u9762\u53cd\u5c04\u7387",ReceiverAbsorptance:"\u63a5\u6536\u5668\u5438\u6536\u7387",ReflectorOpticalEfficiency:"\u53cd\u5c04\u5668\u5149\u6548\u7387",ReceiverThermalEfficiency:"\u63a5\u6536\u5668\u71b1\u6548\u7387"},solarPanelMenu:{InverterEfficiency:"\u9006\u8b8a\u5668\u6548\u7387",InverterEfficiencyExplained:"\u76f4\u6d41\u96fb\u8f49\u63db\u70ba\u4ea4\u6d41\u96fb\u7684\u6548\u7387\u3002",DcToAcSizeRatio:"\u76f4\u6d41-\u4ea4\u6d41\u5bb9\u91cf\u6bd4\u4f8b",DcToAcSizeRatioExplained:"\u76f4\u6d41\u96fb\u5bb9\u91cf\u548c\u4ea4\u6d41\u96fb\u5bb9\u91cf\u7684\u6bd4\u4f8b\u3002",ChangePvModel:"\u6539\u8b8a\u5149\u4f0f\u677f\u578b\u865f",Orientation:"\u6392\u5217\u65b9\u5411",Portrait:"\u7e31\u5411",Landscape:"\u6a6b\u5411",FrameColor:"\u6846\u67b6\u984f\u8272",Panels:"\u584a",PanelsWide:"\u584a\u5149\u4f0f\u677f\u5bec",PanelsLong:"\u584a\u5149\u4f0f\u677f\u9577",TiltAngle:"\u50be\u659c\u89d2\u5ea6",SouthFacingIsPositive:"\u671d\u5357\u70ba\u6b63",Tracker:"\u8ffd\u65e5\u7cfb\u7d71",SolarTrackerFollowsSun:"\u8ffd\u65e5\u7cfb\u7d71\u63d0\u9ad8\u5149\u4f0f\u677f\u7522\u51fa\u3002",PoleSpacing:"\u652f\u67f1\u9593\u9694",NoTracker:"\u7121\u8ffd\u65e5\u7cfb\u7d71",HorizontalSingleAxisTracker:"\u6c34\u5e73\u55ae\u8ef8\u8ffd\u65e5\u7cfb\u7d71",VerticalSingleAxisTracker:"\u8c4e\u76f4\u55ae\u8ef8\u8ffd\u65e5\u7cfb\u7d71",AltazimuthDualAxisTracker:"\u5730\u5e73\u96d9\u8ef8\u8ffd\u65e5\u7cfb\u7d71",OnlyThisSolarPanel:"\u53ea\u9019\u500b\u5149\u4f0f\u677f",AllSolarPanelsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u5149\u4f0f\u677f",AllSolarPanelsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5149\u4f0f\u677f",AllSelectedSolarPanels:"\u6240\u6709\u9078\u4e2d\u7684\u5149\u4f0f\u677f",AllSolarPanels:"\u6240\u6709\u7684\u5149\u4f0f\u677f"},pvModelPanel:{SolarPanelSpecs:"\u5149\u4f0f\u677f\u578b\u865f\u6027\u80fd",Model:"\u578b\u865f",PanelSize:"\u5c3a\u5bf8",Cells:"\u96fb\u6c60\u7d44",CellType:"\u5149\u4f0f\u96fb\u6c60\u985e\u578b",Monocrystalline:"\u55ae\u6676\u77fd",Polycrystalline:"\u591a\u6676\u77fd",ThinFilm:"\u8584\u819c",Bifacial:"\u96d9\u9762",BifacialityFactor:"\u96d9\u9762\u6027\u56e0\u5b50",Black:"\u9ed1\u8272",Blue:"\u85cd\u8272",ShadeTolerance:"\u9670\u5f71\u8010\u53d7\u5ea6",SolarCellEfficiency:"\u5149\u4f0f\u96fb\u6c60\u6548\u7387",NominalOperatingCellTemperature:"\u540d\u7fa9\u96fb\u6c60\u904b\u884c\u6eab\u5ea6",TemperatureCoefficientOfPmax:"Pmax\u6eab\u5ea6\u4fc2\u6578"},parabolicTroughMenu:{ModuleLength:"\u6a21\u584a\u9577\u5ea6",Modules:"\u6a21\u584a",ModulesLong:"\u6a21\u584a\u9577",LatusRectum:"\u901a\u5f91",OnlyThisParabolicTrough:"\u53ea\u9019\u500b\u62cb\u7269\u7dda\u69fd",AllParabolicTroughsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u62cb\u7269\u7dda\u69fd",AllSelectedParabolicTroughs:"\u6240\u6709\u9078\u4e2d\u7684\u629b\u7269\u7ebf\u69fd",AllParabolicTroughs:"\u6240\u6709\u7684\u62cb\u7269\u7dda\u69fd"},fresnelReflectorMenu:{AbsorberPipe:"\u5438\u6536\u7ba1",SelectAbsorberToReflectSunlightTo:"\u9078\u64c7\u967d\u5149\u53cd\u5c04\u5230\u7684\u5438\u6536\u7ba1",ModuleLength:"\u6a21\u584a\u9577\u5ea6",Modules:"\u6a21\u584a",ModulesLong:"\u6a21\u584a\u9577",OnlyThisFresnelReflector:"\u53ea\u9019\u500b\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",AllFresnelReflectorsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",AllSelectedFresnelReflectors:"\u6240\u6709\u9078\u4e2d\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u955c",AllFresnelReflectors:"\u6240\u6709\u7684\u83f2\u6d85\u8033\u53cd\u5c04\u93e1"},heliostatMenu:{Tower:"\u5438\u6536\u5854",SelectTowerToReflectSunlightTo:"\u9078\u64c7\u967d\u5149\u53cd\u5c04\u5230\u7684\u5438\u6536\u5854",OnlyThisHeliostat:"\u53ea\u9019\u500b\u5b9a\u65e5\u93e1",AllHeliostatsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5b9a\u65e5\u93e1",AllSelectedHeliostats:"\u6240\u6709\u9078\u4e2d\u7684\u5b9a\u65e5\u955c",AllHeliostats:"\u6240\u6709\u7684\u5b9a\u65e5\u93e1"},parabolicDishMenu:{ReceiverStructure:"\u63a5\u6536\u5668\u7d50\u69cb",CentralPole:"\u4e2d\u5fc3\u76f4\u67f1",CentralPoleWithTripod:"\u4e09\u8173\u67b6\u548c\u4e2d\u5fc3\u76f4\u67f1",Quadrupod:"\u56db\u811a\u67b6",RimDiameter:"\u5916\u5708\u76f4\u5f91",LatusRectum:"\u901a\u5f91",ExtraPoleHeightInAdditionToRadius:"\u534a\u5f91\u4e4b\u5916\u984d\u5916\u7684\u652f\u67b6\u9ad8\u5ea6",OnlyThisParabolicDish:"\u53ea\u9019\u500b\u62cb\u7269\u7dda\u789f",AllParabolicDishesAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u62cb\u7269\u7dda\u789f",AllSelectedParabolicDishes:"\u6240\u6709\u9078\u4e2d\u7684\u629b\u7269\u7ebf\u789f",AllParabolicDishes:"\u6240\u6709\u7684\u62cb\u7269\u7dda\u789f"},wallMenu:{TextureDefault:"\u9ed8\u8a8d\u6750\u8cea",Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",SizeOfWall:"\u7246\u7684\u5c3a\u5bf8",OnlyThisWall:"\u53ea\u9019\u5835\u7246",AllConnectedWalls:"\u6240\u6709\u9023\u63a5\u7684\u7246",AllWallsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u7246",AllSelectedWalls:"\u6240\u6709\u9078\u4e2d\u7684\u5899",AllWalls:"\u6240\u6709\u7684\u7246",Windows:"\u7a97\u6236",LockAllWindows:"\u56fa\u5b9a\u6240\u6709\u7684\u7a97\u6236",UnlockAllWindows:"\u89e3\u9664\u6240\u6709\u7684\u7a97\u6236\u56fa\u5b9a",RemoveAllUnlockedWindows:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6236",DoYouReallyWantToRemoveAllWindowsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u7a97\u6236\u55ce",Doors:"\u9580",RemoveAllUnlockedDoors:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9580",DoYouReallyWantToRemoveAllDoorsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u9580\u55ce",SolarPanels:"\u5149\u4f0f\u677f",LockAllSolarPanels:"\u56fa\u5b9a\u6240\u6709\u7684\u5149\u4f0f\u677f",UnlockAllSolarPanels:"\u89e3\u9664\u6240\u6709\u7684\u5149\u4f0f\u677f\u56fa\u5b9a",RemoveAllUnlockedSolarPanels:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",Sensors:"\u50b3\u611f\u5668",LockAllSensors:"\u56fa\u5b9a\u6240\u6709\u7684\u50b3\u611f\u5668",UnlockAllSensors:"\u89e3\u9664\u6240\u6709\u7684\u50b3\u611f\u5668\u56fa\u5b9a",RemoveAllUnlockedSensors:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668\u55ce",Lights:"\u96fb\u71c8",RemoveAllUnlockedLights:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8",DoYouReallyWantToRemoveAllLightsOnThisWall:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8\u55ce",LockAllPolygons:"\u56fa\u5b9a\u9019\u5835\u7246\u4e0a\u6240\u6709\u7684\u591a\u908a\u5f62",UnlockAllPolygons:"\u89e3\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u7684\u591a\u908a\u5f62\u56fa\u5b9a",RemoveAllUnlockedPolygons:"\u522a\u9664\u9019\u5835\u7246\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u591a\u908a\u5f62",WallStructure:"\u7246\u7d50\u69cb",DefaultStructure:"\u9ed8\u8a8d",StudStructure:"\u7246\u67f1",PillarStructure:"\u5713\u67f1",Opacity:"\u906e\u5149\u5ea6",StructureSpacing:"\u7d50\u69cb\u9593\u8ddd",StructureWidth:"\u7d50\u69cb\u5bec\u5ea6",StructureThickness:"\u7d50\u69cb\u539a\u5ea6",StructureColor:"\u7d50\u69cb\u989c\u8272",Color:"\u7246\u4f53\u989c\u8272",Height:"\u9ad8\u5ea6",Thickness:"\u539a\u5ea6",Texture:"\u6750\u8cea",AllLightsOnWallInside:"\u6240\u6709\u96fb\u71c8\u5728\u7246\u5167",AllLightsOnWallOutside:"\u6240\u6709\u96fb\u71c8\u5728\u7246\u5916",Fill:"\u586b\u5145",Full:"\u5168\u90e8",Partial:"\u90e8\u5206",Empty:"\u7a7a\u767d",OpenToOutside:"\u5c0d\u5916\u9762\u958b\u653e",EavesLength:"\u5c4b\u7c37\u5ef6\u4f38\u9577\u5ea6",Parapet:"\u5973\u7246",ParapetColor:"\u5973\u7246\u989c\u8272",ParapetTexture:"\u5973\u7246\u6750\u8cea",ParapetHeight:"\u5973\u7246\u9ad8\u5ea6",CopingsHeight:"\u9802\u84cb\u9ad8\u5ea6",CopingsWidth:"\u9802\u84cb\u5bec\u5ea6"},windowMenu:{OnlyThisWindow:"\u53ea\u9019\u500b\u7a97\u6236",AllWindowsOnSurface:"\u540c\u4e00\u8868\u9762\u4e0a\u6240\u6709\u7684\u7a97\u6236",AllWindowsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u7a97\u6236",AllSelectedWindows:"\u6240\u6709\u9078\u4e2d\u7684\u7a97\u6237",AllWindows:"\u6240\u6709\u7684\u7a97\u6236",Width:"\u5bec\u5ea6",Height:"\u9ad8\u5ea6",Setback:"\u96e2\u7246\u9ad4\u5916\u8868\u9762\u7684\u8ddd\u96e2",RelativeToWallThickness:"\u76f8\u5c0d\u65bc\u7246\u7684\u539a\u5ea6",Mullion:"\u76f4\u6afa",HorizontalMullion:"\u6c34\u5e73\u7684\u76f4\u6afa",VerticalMullion:"\u8c4e\u76f4\u7684\u76f4\u6afa",MullionWidth:"\u76f4\u6afa\u5bec\u5ea6",HorizontalMullionSpacing:"\u6c34\u5e73\u76f4\u6afa\u7684\u9593\u8ddd",VerticalMullionSpacing:"\u8c4e\u76f4\u76f4\u6afa\u7684\u9593\u8ddd",MullionColor:"\u76f4\u6afa\u989c\u8272",Tint:"\u8457\u8272",Opacity:"\u4e0d\u900f\u660e\u5ea6",SolarHeatGainCoefficient:"\u592a\u967d\u8f3b\u5c04\u71b1\u7372\u53d6\u4fc2\u6578(SHGC) = 1 - \u4e0d\u900f\u660e\u5ea6",Shutter:"\u767e\u8449\u7a97",LeftShutter:"\u5de6\u5074\u767e\u8449\u7a97",RightShutter:"\u53f3\u5074\u767e\u8449\u7a97",BothShutters:"\u5169\u5074\u767e\u8449\u7a97",ShutterWidth:"\u76f8\u5c0d\u5bec\u5ea6",ShutterColor:"\u767e\u8449\u7a97\u984f\u8272",Frame:"\u908a\u6846",FrameWidth:"\u908a\u6846\u5bec\u5ea6",SillWidth:"\u7a97\u53f0\u5bec\u5ea6",Color:"\u908a\u6846\u9854\u8272",WindowType:"\u7a97\u6236\u7a2e\u985e",Default:"\u9ed8\u8a8d",Arched:"\u62f1\u5f62",Polygonal:"\u591a\u908a\u5f62",Interior:"\u5185\u7a97",Empty:"\u7a7a\u767d"},roofMenu:{TextureDefault:"\u9ed8\u8a8d\u6750\u8cea",Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",OnlyThisRoof:"\u53ea\u9019\u500b\u5c4b\u9876",AllRoofsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5c4b\u9876",AllSelectedRoofs:"\u6240\u6709\u9078\u4e2d\u7684\u5c4b\u9876",AllRoofs:"\u6240\u6709\u7684\u5c4b\u9876",OnlyThisCeiling:"\u53ea\u9019\u500b\u5929\u82b1\u677f",AllCeilingsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u5929\u82b1\u677f",AllCeilings:"\u6240\u6709\u7684\u5929\u82b1\u677f",EavesOverhangLength:"\u5c4b\u7c37\u5ef6\u4f38\u9577\u5ea6",RafterSpacing:"\u5c4b\u693d\u9593\u8ddd",RafterWidth:"\u5c4b\u693d\u5bec\u5ea6",RafterThickness:"\u5c4b\u693d\u539a\u5ea6",RafterColor:"\u5c4b\u693d\u989c\u8272",RoofColor:"\u5c4b\u9876\u989c\u8272",RoofSideColor:"\u5c4b\u9876\u5074\u9762\u989c\u8272",GlassTint:"\u73bb\u7483\u984f\u8272",Opacity:"\u906e\u5149\u5ea6",RoofStructure:"\u5c4b\u9802\u7d50\u69cb",DefaultStructure:"\u9ed8\u8a8d",RafterStructure:"\u5c4b\u693d",GlassStructure:"\u73bb\u7483",SolarPanels:"\u5149\u4f0f\u677f",LockAllSolarPanels:"\u56fa\u5b9a\u6240\u6709\u7684\u5149\u4f0f\u677f",UnlockAllSolarPanels:"\u89e3\u9664\u6240\u6709\u7684\u5149\u4f0f\u677f\u56fa\u5b9a",RemoveAllUnlockedSolarPanels:"\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5149\u4f0f\u677f\u55ce",Windows:"\u5929\u7a97",LockAllWindows:"\u56fa\u5b9a\u6240\u6709\u7684\u5929\u7a97",UnlockAllWindows:"\u89e3\u9664\u6240\u6709\u7684\u5929\u7a97\u56fa\u5b9a",RemoveAllUnlockedWindows:"\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5929\u7a97",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u5929\u7a97\u55ce",Sensors:"\u50b3\u611f\u5668",LockAllSensors:"\u56fa\u5b9a\u6240\u6709\u7684\u50b3\u611f\u5668",UnlockAllSensors:"\u89e3\u9664\u6240\u6709\u7684\u50b3\u611f\u5668\u56fa\u5b9a",RemoveAllUnlockedSensors:"\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u50b3\u611f\u5668\u55ce",Lights:"\u96fb\u71c8",RemoveAllUnlockedLights:"\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8",DoYouReallyWantToRemoveAllLightsOnThisRoof:"\u4f60\u78ba\u5b9a\u522a\u9664\u9019\u500b\u5c4b\u9876\u4e0a\u6240\u6709\u975e\u56fa\u5b9a\u7684\u96fb\u71c8\u55ce",AllLightsOnRoofInside:"\u6240\u6709\u96fb\u71c8\u5728\u5c4b\u9802\u5167",AllLightsOnRoofOutside:"\u6240\u6709\u96fb\u71c8\u5728\u5c4b\u9802\u5916",Rise:"\u76f8\u5c0d\u9ad8\u5ea6",Ceiling:"\u5929\u82b1\u677f",RoofRValue:"\u5c4b\u9876R\u503c",CeilingRValue:"\u5929\u82b1\u677fR\u503c"},doorMenu:{TextureDefault:"\u9ed8\u8a8d\u6750\u8cea",Texture01:"\u4e00\u865f\u6750\u8cea",Texture02:"\u4e8c\u865f\u6750\u8cea",Texture03:"\u4e09\u865f\u6750\u8cea",Texture04:"\u56db\u865f\u6750\u8cea",Texture05:"\u4e94\u865f\u6750\u8cea",Texture06:"\u516d\u865f\u6750\u8cea",Texture07:"\u4e03\u865f\u6750\u8cea",Texture08:"\u516b\u865f\u6750\u8cea",Texture09:"\u4e5d\u865f\u6750\u8cea",Texture10:"\u5341\u865f\u6750\u8cea",Texture11:"\u5341\u4e00\u865f\u6750\u8cea",Texture12:"\u5341\u4e8c\u865f\u6750\u8cea",Texture13:"\u5341\u4e09\u865f\u6750\u8cea",Texture14:"\u5341\u56db\u865f\u6750\u8cea",Texture15:"\u5341\u4e94\u865f\u6750\u8cea",Texture16:"\u5341\u516d\u865f\u6750\u8cea",Texture17:"\u5341\u4e03\u865f\u6750\u8cea",OnlyThisDoor:"\u53ea\u9019\u500b\u9580",AllDoorsOnWall:"\u540c\u4e00\u9762\u7246\u4e0a\u6240\u6709\u7684\u9580",AllDoorsAboveFoundation:"\u540c\u4e00\u5730\u57fa\u4e0a\u6240\u6709\u7684\u9580",AllSelectedDoors:"\u6240\u6709\u9078\u4e2d\u7684\u95e8",AllDoors:"\u6240\u6709\u7684\u9580",DoorType:"\u9580\u7a2e\u985e",Default:"\u9ed8\u8a8d",Arched:"\u62f1\u5f62",Filled:"\u586b\u5145",FrameColor:"\u9580\u6846\u984f\u8272",Interior:"\u5167\u9580"},siteInfoPanel:{High:"\u6700\u9ad8\u6eab\u5ea6",Low:"\u6700\u4f4e\u6e29\u5ea6"},designInfoPanel:{NumberOfSelectedHeliostats:"\u9078\u4e2d\u7684\u5b9a\u65e5\u93e1\u7e3d\u6578",NumberOfSelectedSolarPanels:"\u9078\u4e2d\u7684\u5149\u4f0f\u677f\u7e3d\u6578",ElectricityGeneratedDailyBySolarPanels:"\u9019\u4e9b\u5149\u4f0f\u677f\u7684\u65e5\u767c\u96fb\u91cf",SceneDiameter:"\u5834\u666f\u76f4\u5f91",BuildingArea:"\u5efa\u7bc9\u9762\u7a4d"},visualizationControlPanel:{ColorContrast:"\u71b1\u5716\u984f\u8272\u5c0d\u6bd4\u5ea6",FluxScale:"\u71b1\u901a\u91cf\u9577\u5ea6",ClickUpOrDownArrowButtonsToChange:"\u9ede\u64ca\u4e0a\u4e0b\u7bad\u982d\u6539\u8b8a\u53c3\u6578"},instructionPanel:{Rotate:"\u65cb\u8f49",DragMouse:"\u62d6\u52d5\u6ed1\u9f20",Zoom:"\u7f29\u653e",MouseWheelOrKeys:"\u6ed1\u9f20\u6efe\u8f2a\u6216\u8005Ctrl+[\u548cCtrl+]",MouseWheelOrKeysMac:"\u6ed1\u9f20\u6efe\u8f2a\u6216\u8005\u2318+[\u548c\u2318+]",Pan:"\u5e73\u79fb",HoldCtrlDragMouse:"\u6309\u4e0bCtrl\u9375\u4e26\u62d6\u52d5\u6ed1\u9f20",HoldMetaDragMouse:"\u6309\u4e0b\u2318\u9375\u4e26\u62d6\u52d5\u6ed1\u9f20",Enter2DMode:"\u9032\u5165\u4e8c\u7dad\u6a21\u5f0f",Exit2DMode:"\u9000\u51fa\u4e8c\u7dad\u6a21\u5f0f",NavigationMode:"\u5c0e\u822a\u6a21\u5f0f",EnableNavigation:"\u9032\u5165\u5c0e\u822a\u6a21\u5f0f",DisableNavigation:"\u9000\u51fa\u5c0e\u822a\u6a21\u5f0f",MoveForwardBack:"\u524d\u5f8c\u79fb\u52d5",MoveForwardBackInstruction:"\u6309W/S\u9375",MoveLeftRight:"\u5de6\u53f3\u79fb\u52d5",MoveLeftRightInstruction:"\u6309A/D\u9375",MoveUpDown:"\u4e0a\u4e0b\u79fb\u52d5",MoveUpDownInstruction:"\u6309Z/X\u9375",Turn:"\u62d0\u5f4e",TurnInstruction:"\u6309\u65b9\u5411\u9375",ResetView:"\u91cd\u7f6e\u8996\u89d2",AutoRotate:"\u81ea\u52d5\u65cb\u8f49",StartOrStop:"\u6309F4\u9375\u555f\u52d5\u6216\u505c\u6b62"},mapPanel:{ImageOnGround:"\u5730\u9762\u986f\u793a\u5716\u50cf",WeatherStations:"\u6c23\u8c61\u7ad9",WeatherStationsNote:"\u95dc\u9589\u6b64\u9078\u9805\u4ee5\u63d0\u9ad8\u5730\u5716\u901f\u5ea6",Coordinates:"\u7d93\u7def\u5ea6\u5750\u6a19",Zoom:"\u653e\u5927\u7a0b\u5ea6"},visibilityPanel:{SolarPanelVisibility:"\u5149\u4f0f\u677f\u5c0d\u89c0\u5bdf\u8005\u7684\u53ef\u898b\u5ea6",Observer:"\u89c0\u5bdf\u8005",VantagePoint:"\u89c0\u5bdf\u4f4d\u7f6e",ItemizedVisibilityByFields:"\u6bcf\u500b\u5834\u7684\u53ef\u898b\u5ea6",TotalVisibility:"\u7e3d\u53ef\u898b\u5ea6"},sensorPanel:{LightSensor:"\u5149\u50b3\u611f\u5668",WeatherDataFrom:"\u6c23\u8c61\u6578\u64da\u4f86\u81ea"},buildingEnergyPanel:{DailyBuildingEnergy:"\u5efa\u7bc9\u7269\u65e5\u80fd\u8017",YearlyBuildingEnergy:"\u5efa\u7bc9\u7269\u5e74\u80fd\u8017",Heater:"\u6696\u6c23",AC:"\u7a7a\u8abf",SolarPanel:"\u5149\u4f0f",Net:"\u6de8\u80fd\u8017"},solarPanelYieldPanel:{SolarPanelDailyYield:"\u5149\u4f0f\u65e5\u767c\u96fb\u91cf",SolarPanelYearlyYield:"\u5149\u4f0f\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualSolarPanels:"\u986f\u793a\u6bcf\u884c\u5149\u4f0f\u677f\u55ae\u7368\u767c\u96fb\u91cf",Profit:"\u5229\u6f64",TotalCost:"\u7e3d\u6210\u672c",TotalRevenue:"\u7e3d\u6536\u5165",TotalYield:"\u7e3d\u767c\u96fb\u91cf",MeanYield:"\u5e73\u5747\u767c\u96fb\u91cf",ModuleCount:"\u5149\u4f0f\u677f\u7e3d\u6578"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"\u62cb\u7269\u7dda\u69fd\u65e5\u767c\u96fb\u91cf",ParabolicTroughYearlyYield:"\u62cb\u7269\u7dda\u69fd\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualParabolicTroughs:"\u986f\u793a\u6bcf\u884c\u62cb\u7269\u7dda\u69fd\u55ae\u7368\u767c\u96fb\u91cf"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"\u62cb\u7269\u7dda\u789f\u65e5\u767c\u96fb\u91cf",ParabolicDishYearlyYield:"\u62cb\u7269\u7dda\u789f\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualParabolicDishes:"\u986f\u793a\u6bcf\u500b\u62cb\u7269\u7dda\u789f\u55ae\u7368\u767c\u96fb\u91cf"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u65e5\u767c\u96fb\u91cf",FresnelReflectorYearlyYield:"\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualFresnelReflectors:"\u986f\u793a\u6bcf\u500b\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u55ae\u7368\u767c\u96fb\u91cf"},heliostatYieldPanel:{HeliostatDailyYield:"\u5b9a\u65e5\u93e1\u65e5\u767c\u96fb\u91cf",HeliostatYearlyYield:"\u5b9a\u65e5\u93e1\u5e74\u767c\u96fb\u91cf",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualHeliostats:"\u986f\u793a\u6bcf\u500b\u5b9a\u65e5\u93e1\u55ae\u7368\u767c\u96fb\u91cf"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u65e5\u767c\u96fb\u91cf",UpdraftTowerYearlyYield:"\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u5e74\u767c\u96fb\u91cf",ChimneyAirTemperature:"\u7159\u56ea\u7a7a\u6c23\u6eab\u5ea6",ChimneyWindSpeed:"\u7159\u56ea\u98a8\u901f",Yield:"\u767c\u96fb\u91cf",YieldPerHour:"\u6bcf\u5c0f\u6642\u767c\u96fb\u91cf",DailyTotal:"\u65e5\u767c\u96fb\u7e3d\u91cf",YearlyTotal:"\u5e74\u767c\u96fb\u7e3d\u91cf",ShowOutputsOfIndividualUpdraftTowers:"\u986f\u793a\u6bcf\u500b\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u55ae\u7368\u767c\u96fb\u91cf"},heliodonPanel:{SunAndTimeSettings:"\u592a\u967d\u548c\u6642\u9593\u8a2d\u7f6e",SunAngles:"\u89d2\u5ea6",TwentyFourHours:"24\u5c0f\u6642"},cloudFilePanel:{CopyTitle:"\u62f7\u8c9d\u6a19\u984c",TitleCopiedToClipBoard:"\u6a19\u984c\u62f7\u8c9d\u5230\u526a\u8cbc\u677f",SearchByTitle:"\u6309\u6a19\u984c\u641c\u7d22",MyLikes:"\u6211\u559c\u6b61\u7684\u6a21\u578b",MyCloudFiles:"\u6211\u7684\u96f2\u6587\u4ef6",GenerateLink:"\u751f\u6210\u93c8\u63a5",LinkGeneratedInClipBoard:"\u93c8\u63a5\u751f\u6210\u5230\u526a\u8cbc\u677f",DoYouReallyWantToDelete:"\u60a8\u78ba\u5b9a\u522a\u9664\u6b64\u6587\u6a94",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"\u5982\u679c\u6b64\u6587\u6a94\u5df2\u88ab\u5206\u4eab\u6216\u767c\u5e03, \u6539\u540d\u6703\u4f7f\u5df2\u6709\u93c8\u63a5\u5931\u6548"},projectListPanel:{CopyTitle:"\u62f7\u8c9d\u6a19\u984c",TitleCopiedToClipBoard:"\u6a19\u984c\u62f7\u8c9d\u5230\u526a\u8cbc\u677f",SearchByTitle:"\u6309\u6a19\u984c\u641c\u7d22",MyProjects:"\u6211\u7684\u9805\u76ee",GenerateProjectLink:"\u751f\u6210\u9805\u76ee\u93c8\u63a5",ProjectLinkGeneratedInClipBoard:"\u9805\u76ee\u93c8\u63a5\u751f\u6210\u5230\u526a\u8cbc\u677f",DoYouReallyWantToDeleteProject:"\u60a8\u78ba\u5b9a\u522a\u9664\u9805\u76ee",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"\u5982\u679c\u6b64\u9805\u76ee\u5df2\u88ab\u5206\u4eab\u6216\u767c\u5e03, \u6539\u540d\u6703\u4f7f\u5df2\u6709\u93c8\u63a5\u5931\u6548"},projectPanel:{ProjectSettings:"\u9805\u76ee\u8a2d\u5b9a",ThumbnailImageSize:"\u7e2e\u7565\u5716\u5927\u5c0f",ProjectByOtherPeople:"\u5225\u4eba\u7684\u9805\u76ee",Project:"\u9805\u76ee",ProjectType:"\u985e\u522b",ProjectDescription:"\u63cf\u8ff0",MakeDescriptionEditable:"\u7de8\u8f2f\u63cf\u8ff0",MakeDescriptionNonEditable:"\u4e0d\u7de8\u8f2f\u63cf\u8ff0",DoubleClickToMakeDescriptionEditable:"\u96d9\u64ca\u6b64\u63cf\u8ff0\u6fc0\u6d3b\u7de8\u8f2f\u529f\u80fd",SolarPanelArray:"\u5149\u4f0f\u677f\u9663\u5217\u8a2d\u8a08",CurateCurrentDesign:"\u6536\u85cf\u7576\u524d\u8a2d\u8a08",UpdateSelectedDesign:"\u66f4\u65b0\u9078\u4e2d\u8a2d\u8a08",RemoveSelectedDesign:"\u522a\u9664\u9078\u4e2d\u8a2d\u8a08",ClickToFlipSortingOrder:"\u9ede\u64ca\u9006\u8f49\u6392\u5e8f\u65b9\u5411",DesignNotShownInSolutionSpaceClickToShow:"\u6b64\u8a2d\u8a08\u76ee\u524d\u4e0d\u986f\u793a\u5728\u8a2d\u8a08\u7a7a\u9593\u5167\uff0c\u9ede\u64ca\u986f\u793a",DesignShownInSolutionSpaceClickToHide:"\u6b64\u8a2d\u8a08\u76ee\u524d\u986f\u793a\u5728\u8a2d\u8a08\u7a7a\u9593\u5167,\u9ede\u64ca\u96b1\u85cf",DistributionInSolutionSpace:"\u65b9\u6848\u5728\u8a2d\u8a08\u7a7a\u9593\u88e1\u7684\u5206\u4f48",ChooseSolutionSpace:"\u9078\u64c7\u8a2d\u8a08\u7a7a\u9593",ChooseDataColoring:"\u9078\u64c7\u6578\u64da\u8457\u8272",SameColorForAllDesigns:"\u6240\u6709\u8a2d\u8a08\u4e00\u500b\u984f\u8272",OneColorForEachDesign:"\u6bcf\u500b\u8a2d\u8a08\u4e00\u500b\u984f\u8272",SolutionSpaceScreenshot:"\u8a2d\u8a08\u7a7a\u9593\u622a\u5716",ScatteredPlotScreenshot:"\u6563\u9ede\u5716\u622a\u5716",SingleClickToSelectDoubleClickToOpen:"\u55ae\u64ca\u9078\u64c7\uff0c\u96d9\u64ca\u6253\u958b\u3002",SingleClickToDeselectDoubleClickToOpen:"\u55ae\u64ca\u53d6\u6d88\u9078\u64c7\uff0c\u96d9\u64ca\u6253\u958b\u3002",GenerateScatteredPlot:"\u751f\u6210\u6563\u9ede\u5716",SelectXAxis:"\u9078\u64c7X\u8ef8",SelectYAxis:"\u9078\u64c7Y\u8ef8"},accountSettingsPanel:{MyAccountSettings:"\u6211\u7684\u8cec\u6236\u8a2d\u5b9a",MyID:"\u6211\u7684\ud83c\udd94",ClickToCopyMyID:"\u9ede\u64ca\u6b64\u8655\u62f7\u8c9d\u6211\u7684ID",IDInClipBoard:"\u60a8\u73fe\u5728\u53ef\u4ee5\u7c98\u8cbcID\u4e86\u3002",StoreMyNameInMyFilesWhenSaving:"\u4fdd\u5b58\u6587\u6a94\u6642\u7c64\u4e0a\u6211\u7684\u5927\u540d",DoYouReallyWantToShowYourNameInYourFiles:"\u60a8\u78ba\u5b9a\u5728\u60a8\u7684\u6587\u6a94\u88e1\u4fdd\u5b58\u60a8\u7684\u5927\u540d\u55ce\uff1f",SignFileDisclaimer:"\u5982\u679c\u60a8\u9078\u64c7\u4fdd\u5b58\uff0c\u60a8\u7684\u5927\u540d\u53ef\u80fd\u88ab\u6240\u6709\u6253\u958b\u60a8\u7684\u6587\u6a94\u7684\u4eba\u770b\u5230\u3002",Likes:"\u9ede\u8d0a\u7e3d\u6578",AllPublished:"\u767c\u4f48\u7e3d\u6578",PublishedUnderAliases:"\u522b\u540d\u767c\u4f48",UserCount:"\u7528\u6236\u7e3d\u6578",SchoolID:"\u5b78\u6821\u7de8\u865f",ClassID:"\u73ed\u7d1a\u7de8\u865f"},weatherPanel:{SunshineHours:"\u65e5\u7167\u6642\u9593"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"\u9078\u64c7\u6c23\u6eab\u6a21\u578b",Sinusoidal:"\u6b63\u5f26\u51fd\u6578"},economicsPanel:{EconomicsParameters:"\u7d93\u6fdf\u5b78\u53c3\u6578",ElectricitySellingPrice:"\u92b7\u552e\u96fb\u50f9",OperationalCostPerUnit:"\u55ae\u4f4d\u904b\u884c\u6210\u672c",SellingPrice:"\u92b7\u552e\u96fb\u50f9",UnitCost:"\u55ae\u4f4d\u6210\u672c"},navigationPanel:{NavigationParameters:"\u5c0e\u822a\u6a21\u5f0f\u53c3\u6578",MinimumMoveSpeed:"\u6700\u5c0f\u79fb\u52d5\u901f\u5ea6",MinimumTurnSpeed:"\u6700\u5c0f\u62d0\u5f4e\u901f\u5ea6"},yearlyLightSensorPanel:{SkyClearness:"\u5929\u7a7a\u6e05\u6670\u5ea6",ShowDaylightResults:"\u986f\u793a\u65e5\u7167\u6642\u9593\u7d50\u679c",ShowSkyClearnessResults:"\u986f\u793a\u5929\u7a7a\u6e05\u6670\u5ea6\u7d50\u679c",ShowAverageDailySolarRadiation:"\u986f\u793a\u65e5\u5e73\u5747\u8f3b\u5c04\u7d50\u679c"},analysisManager:{NoSensorForCollectingData:"\u6c92\u6709\u50b3\u611f\u5668\u6536\u96c6\u6578\u64da\u3002",NoSolarPanelForAnalysis:"\u6c92\u6709\u5149\u4f0f\u677f\u53ef\u4ee5\u5206\u6790\u3002",NoObserverForVisibilityAnalysis:"\u6c92\u6709\u627e\u5230\u53ef\u898b\u5ea6\u5206\u6790\u7684\u89c0\u5bdf\u8005\u3002",NoWaterHeaterForAnalysis:"\u6c92\u6709\u592a\u967d\u80fd\u71b1\u6c34\u5668\u53ef\u4ee5\u5206\u6790\u3002",NoParabolicDishForAnalysis:"\u6c92\u6709\u62cb\u7269\u7dda\u789f\u53ef\u4ee5\u5206\u6790\u3002",NoParabolicTroughForAnalysis:"\u6c92\u6709\u62cb\u7269\u7dda\u69fd\u53ef\u4ee5\u5206\u6790\u3002",NoFresnelReflectorForAnalysis:"\u6c92\u6709\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u53ef\u4ee5\u5206\u6790\u3002",NoHeliostatForAnalysis:"\u6c92\u6709\u5b9a\u65e5\u93e1\u53ef\u4ee5\u5206\u6790\u3002",NoSolarUpdraftTowerForAnalysis:"\u6c92\u6709\u592a\u967d\u80fd\u4e0a\u5347\u6c23\u6d41\u5854\u53ef\u4ee5\u5206\u6790\u3002",NoBuildingForAnalysis:"\u6c92\u6709\u5efa\u7bc9\u7269\u53ef\u4ee5\u5206\u6790\u3002"},toolbar:{CloudFile:"\u96f2\u6587\u6a94",Select:"\u9078\u64c7",AddFoundation:"\u6dfb\u52a0\u5730\u57fa",AddWall:"\u6dfb\u52a0\u7246\u9ad4",AddWindow:"\u6dfb\u52a0\u7a97\u6236",AddDoor:"\u6dfb\u52a0\u9580",AddPyramidRoof:"\u6dfb\u52a0\u91d1\u5b57\u5854\u5c4b\u9802",AddGableRoof:"\u6dfb\u52a0\u96d9\u5761\u5c4b\u9802",AddHipRoof:"\u6dfb\u52a0\u56db\u5761\u5c4b\u9876",AddGambrelRoof:"\u6dfb\u52a0\u590d\u659c\u5c4b\u9876",AddMansardRoof:"\u6dfb\u52a0\u6298\u7dda\u5c4b\u9876",AddCuboid:"\u6dfb\u52a0\u9577\u65b9\u9ad4",AddSensor:"\u6dfb\u52a0\u50b3\u611f\u5668",AddSolarPanel:"\u6dfb\u52a0\u5149\u4f0f\u677f",AddWaterHeater:"\u6dfb\u52a0\u592a\u967d\u80fd\u71b1\u6c34\u5668",AddParabolicDish:"\u6dfb\u52a0\u62cb\u7269\u7dda\u789f",AddParabolicTrough:"\u6dfb\u52a0\u62cb\u7269\u7dda\u69fd",AddFresnelReflector:"\u6dfb\u52a0\u83f2\u6d85\u8033\u53cd\u5c04\u93e1",AddHeliostat:"\u6dfb\u52a0\u5b9a\u65e5\u93e1",AddWindTurbine:"\u6dfb\u52a0\u98a8\u529b\u6e26\u8f2a\u6a5f",AddLight:"\u6dfb\u52a0\u96fb\u71c8",AddTree:"\u6dfb\u52a0\u6a39\u6728",AddFlower:"\u6dfb\u52a0\u82b1\u8349",AddPeople:"\u6dfb\u52a0\u4eba\u7269",DoubleClickToLockThisModeForNextAction:"\u96d9\u64ca\u6309\u9215\u7d66\u4e0b\u500b\u52d5\u4f5c\u9396\u5b9a\u6b64\u6a21\u5f0f",ClickToUnlockThisModeForNextAction:"\u9ede\u64ca\u6309\u9215\u8b93\u52d5\u4f5c\u5b8c\u6210\u5373\u96e2\u958b\u6b64\u6a21\u5f0f",ManipulateGroup:"\u6574\u9ad4\u64cd\u4f5c\u4e00\u500b\u7d44",ClearScene:"\u6e05\u7a7a\u5834\u666f",ShowSunAndTimeSettings:"\u986f\u793a\u592a\u967d\u548c\u6642\u9593\u8a2d\u7f6e",SpatialAnalysisOfEnergy:"\u80fd\u91cf\u7684\u7a7a\u9593\u5206\u6790",DoYouReallyWantToClearContent:"\u60a8\u78ba\u5b9a\u6e05\u7a7a\u5834\u666f\u55ce",ClickForMoreButtons:"\u9ede\u64ca\u6b64\u8655\u5207\u63db\u5230\u66f4\u591a\u7684\u6309\u9215\u6a21\u5f0f",SwitchToAddingFoundation:"\u5207\u63db\u5230\u6dfb\u52a0\u5730\u57fa\u6a21\u5f0f",SwitchToAddingCuboid:"\u5207\u63db\u5230\u6dfb\u52a0\u9577\u65b9\u9ad4\u6a21\u5f0f",SwitchToAddingWall:"\u5207\u63db\u5230\u6dfb\u52a0\u7246\u9ad4\u6a21\u5f0f",SwitchToAddingWindow:"\u5207\u63db\u5230\u6dfb\u52a0\u7a97\u6236\u6a21\u5f0f",SwitchToAddingDoor:"\u5207\u63db\u5230\u6dfb\u52a0\u9580\u6a21\u5f0f",SwitchToAddingPyramidRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u91d1\u5b57\u5854\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingGableRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u96d9\u5761\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingHipRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u56db\u5761\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingGambrelRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u590d\u659c\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingMansardRoof:"\u5207\u63db\u5230\u6dfb\u52a0\u6298\u7dda\u5c4b\u9802\u6a21\u5f0f",SwitchToAddingSolarPanel:"\u5207\u63db\u5230\u6dfb\u52a0\u5149\u4f0f\u677f\u6a21\u5f0f",SwitchToAddingSensor:"\u5207\u63db\u5230\u6dfb\u52a0\u50b3\u611f\u5668\u6a21\u5f0f",SwitchToAddingWaterHeater:"\u5207\u63db\u5230\u6dfb\u52a0\u592a\u967d\u80fd\u71b1\u6c34\u5668\u6a21\u5f0f",SwitchToAddingParabolicDish:"\u5207\u63db\u5230\u6dfb\u52a0\u62cb\u7269\u7dda\u789f\u6a21\u5f0f",SwitchToAddingParabolicTrough:"\u5207\u63db\u5230\u6dfb\u52a0\u62cb\u7269\u7dda\u69fd\u6a21\u5f0f",SwitchToAddingFresnelReflector:"\u5207\u63db\u5230\u6dfb\u52a0\u83f2\u6d85\u8033\u53cd\u5c04\u93e1\u6a21\u5f0f",SwitchToAddingHeliostat:"\u5207\u63db\u5230\u6dfb\u52a0\u5b9a\u65e5\u93e1\u6a21\u5f0f",SwitchToAddingWindTurbine:"\u5207\u63db\u5230\u6dfb\u52a0\u98a8\u529b\u6e26\u8f2a\u6a5f\u6a21\u5f0f",SwitchToAddingLight:"\u5207\u63db\u5230\u6dfb\u52a0\u96fb\u71c8\u6a21\u5f0f",SwitchToAddingTree:"\u5207\u63db\u5230\u6dfb\u52a0\u6a39\u6728\u6a21\u5f0f",SwitchToAddingFlower:"\u5207\u63db\u5230\u6dfb\u52a0\u82b1\u8349\u6a21\u5f0f",SwitchToAddingPeople:"\u5207\u63db\u5230\u6dfb\u52a0\u4eba\u7269\u6a21\u5f0f"},tooltip:{gotoIFI:"\u8a2a\u554f\u672a\u4f86\u667a\u80fd\u7814\u7a76\u6240",visitAladdinHomePage:"\u8a2a\u554f\u963f\u62c9\u4e01\u4e3b\u9801",clickToOpenMenu:"\u9ede\u64ca\u6253\u958b\u4e3b\u83dc\u55ae",clickToAccessAccountSettings:"\u9ede\u64ca\u6253\u958b\u8cec\u865f\u8a2d\u5b9a"},tree:{Apple:"\u860b\u679c\u6a39",Birch:"\u767d\u6a3a",Coconut:"\u6930\u5b50\u6a39",Dogwood:"\u8331\u8438",Elm:"\u6986\u6a39",FanPalm:"\u6247\u8449\u68d5\u6ada",Linden:"\u83e9\u63d0",Magnolia:"\u7389\u862d",Maple:"\u6953\u6a39",Oak:"\u6a61\u6a39",Pine:"\u677e\u6a39",Spruce:"\u96f2\u6749"},flower:{Bellflower:"\u9234\u862d",Boxwood:"\u9ec3\u694a",CactusCombo1:"\u4ed9\u4eba\u638c\u7d44\u5408\u4e00",CactusCombo2:"\u4ed9\u4eba\u638c\u7d44\u5408\u4e8c",CactusCombo3:"\u4ed9\u4eba\u638c\u7d44\u5408\u4e09",CactusCombo4:"\u4ed9\u4eba\u638c\u7d44\u5408\u56db",Hibiscus:"\u6728\u69ff",Hosta:"\u7389\u7c2a",Hydrangea:"\u7e61\u7403\u82b1",Peony:"\u7261\u4e39",RedRose:"\u7d05\u73ab\u7470",Spirea:"\u7e61\u7dda\u83ca",Sunflower:"\u5411\u65e5\u8475",TallBush:"\u9ad8\u704c\u6728",Tulip:"\u9b31\u91d1\u9999",WhiteFlower:"\u767d\u82b1",YellowFlower:"\u9ec4\u82b1"},people:{Jaah:"\u8cc8\u963f",Jack:"\u5091\u514b",Jacob:"\u96c5\u5404\u5e03",Jacqueline:"\u6770\u594e\u7433",Jade:"\u7f8e\u7389",Jamelia:"\u6f54\u7c73\u8389\u96c5",James:"\u8a79\u59c6\u65af",Jane:"\u7c21",Jaya:"\u4f73\u5a6d",Jaye:"\u5091\u4f0a",Jeanette:"\u73cd\u59ae\u7279",Jedi:"\u5091\u8fea",Jeff:"\u5091\u592b",Jena:"\u73cd\u5a1c",Jennifer:"\u73cd\u5c3c\u5f17",Jess:"\u5091\u897f",Jett:"\u5091\u7279",Jill:"\u5409\u723e",Jiya:"\u5409\u5a05",Joan:"\u74ca",Jocelyn:"\u55ac\u65af\u6797",Joel:"\u55ac\u723e",Joey:"\u55ac\u4f0a",John:"\u7d04\u7ff0",Jonathon:"\u55ac\u7d0d\u68ee",Jose:"\u4f55\u585e",Joseph:"\u7d04\u745f\u592b",Joshua:"\u7d04\u66f8\u4e9e",Judd:"\u8cc8\u5fb7",Judy:"\u6731\u8482",Julia:"\u6731\u8389\u5a6d",Julio:"\u80e1\u91cc\u5965",Jumapili:"\u7956\u746a\u5339\u8389",June:"\u6e96\u885b",Juro:"\u6731\u8afe",Justin:"\u8cc8\u65af\u6c40"},compass:{N:"\u5317",S:"\u5357",W:"\u897f",E:"\u6771"},month:{January:"\u4e00\u6708",February:"\u4e8c\u6708",March:"\u4e09\u6708",April:"\u56db\u6708",May:"\u4e94\u6708",June:"\u516d\u6708",July:"\u4e03\u6708",August:"\u516b\u6708",September:"\u4e5d\u6708",October:"\u5341\u6708",November:"\u5341\u4e00\u6708",December:"\u5341\u4e8c\u6708"},modelsMap:{SearchByPublisher:"\u6309\u767c\u5e03\u8005\u641c\u7d22",SearchByLabel:"\u6309\u6a19\u7c64\u641c\u7d22",MyPublishedModels:"\u6211\u767c\u5e03\u7684\u6a21\u578b",TotalNumberOfUserPublishedModels:"\u7528\u6236\u767c\u5e03\u7684\u6a21\u578b\u7e3d\u6578",SortFromOldestToNewest:"\u5f9e\u65e9\u5230\u665a\u6392\u5e8f",SortFromNewestToOldest:"\u5f9e\u665a\u5230\u65e9\u6392\u5e8f",ModelsFoundOnThisSite:"\u500b\u6a21\u578b\u5728\u6b64\u4f4d\u7f6e",ShowModelsPublishedByThisAuthor:"\u5c55\u793a\u6b64\u7528\u6236\u767c\u5e03\u7684\u6a21\u578b"}}},es:{translation:{name:{IFI:"Instituto de inteligencia futura",Aladdin:"Aladdin",Tagline:"Aladdin: Reimagining Design with Explainable AI \u2014 Institute for Future Intelligence"},cookie:{Statement:"Clicando Aceptar, autoriza el uso de cookies para mejora la experiencia con Aladdin",Accept:"Aceptar"},aboutUs:{ProductBroughtToYouBy:"Este producto esta hecho por",TermsOfService:"T\xe9rminos de servicio",PrivacyPolicy:"Pol\xedtica de privacidad",Software:"Programa",Content:"Contenido",Research:"Investigaci\xf3n",Support:"Ayuda",Acknowledgment:"Agradecimientos",FundingInformation:"La National Science Foundation (NSF) proporcion\xf3 generosamente fondos para la investigaci\xf3n y el desarrollo de este producto a trav\xe9s de las subvenciones con n\xfamero #2105695, #2131097, y #2301164. Sin embargo, todas las opiniones, hallazgos y conclusiones o recomendaciones expresados en este producto pertenecen a los autores y no reflejan necesariamente los puntos de vista de la NSF.",Contact:"Para m\xe1s informaci\xf3n, por favor contacte con Charles Xie (charles@intofuture.org).",Translators:"Translators"},word:{LastUpdate:"Last Update",Small:"Small",Medium:"Medium",Large:"Large",Design:"Design",Information:"Information",Type:"Type",Text:"Text",FontSize:"Font Size",FontColor:"Font Color",Model:"Model",Models:"Models",Upload:"Upload",ClickCount:"Click Count",Share:"Share",AlreadyLike:"Already like",Like:"Like",MustLogInToLike:"Must log in to like",AllRightsReserved:"Todos los derechos reservados",MeterAbbreviation:"m",Version:"Versi\xf3n",VersionInitial:"V",Options:"Opciones",Maximum:"Maximum",Minimum:"Minimum",MaximumNumber:"N\xfamero m\xe1ximo",MinimumNumber:"Minimum Number",MaximumValue:"Maximum Value",MinimumValue:"Minimum Value",Or:"O",None:"Ninguno",High:"High",Partial:"Partial",Teacher:"Profesor",Class:"Clase",Total:"Total",Leaderboard:"Leaderboard",Latest:"Latest",Range:"Rango",SIUnit:"SI Unit",USUnit:"US Unit",ThermalTransmittance:"Thermal Transmittance",ThermalResistance:"Thermal Resistance",UValue:"U-Value",RValue:"R-Value",VolumetricHeatCapacity:"Volumetric Heat Capacity",BuildingHVACSystem:"Building HVAC System",ThermostatSetpoint:"Thermostat Setpoint",TemperatureToleranceThreshold:"Tolerance Threshold",TemperatureToleranceThresholdExplanation:"Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.",Press:"Press",Open:"Abrir",Save:"Guardar",SaveAsImage:"Guardar como imagen",SaveAsCsv:"Save as CSV",Update:"Actualizar",Paste:"Pegar",Copy:"Copiar",Cut:"Cortar",Delete:"Eliminar",Lock:"Cerrar con llave",Translucent:"Translucent",Color:"Color",Texture:"Textura",Size:"Tama\xf1o",Thickness:"Grosor",Yes:"S\xed",No:"No",OK:"OK",Cancel:"Cancelar",Apply:"Aplicar",Close:"Cerrar",ApplyTo:"Aplicar a",Run:"Run",Pause:"Pause",Resume:"Resume",Clear:"Limpiar",Warning:"Aviso",Caution:"Caution",Reminder:"Reminder",Length:"Longitud",Width:"Ancho",Height:"Altura",Radius:"Radius",Angle:"\xc1ngulo",Azimuth:"Azimut",Coordinates:"Coordinates",Weather:"Tiempo",Show:"Mostrar",Animate:"Animar",Date:"Fecha",Time:"Tiempo",Title:"T\xedtulo",Owner:"Propietario",Action:"Acci\xf3n",Rename:"Renombrar",Location:"Location",Latitude:"Latitud",Month:"Mes",Day:"D\xeda",Hour:"Hora",Daylight:"Luz solar",Radiation:"Radiaci\xf3n",Temperature:"Temperatura",kWh:"kWh",dollar:"dollar",MeterPerSecond:"m/s",NorthInitial:"N",SouthInitial:"S",EastInitial:"E",WestInitial:"O",Fixed:"Fixed",Elements:"Elements",Energy:"Energy",Unknown:"Unknown",Label:"Label",Description:"Description",NoDescription:"No description",MaximumCharacters:"Maximum characters",Author:"Author",Publisher:"Publisher",Building:"Building",ResidentialBuilding:"Residential Building",CommercialBuilding:"Commercial Building",SchoolBuilding:"School Building",TouristAttraction:"Tourist Attraction",UnderConstruction:"Under Construction",Photovoltaic:"Photovoltaic",Anonymous:"Anonymous",Nickname:"Nickname",Pin:"Pin",Unpin:"Unpin"},shared:{NoTexture:"Sin textura",FoundationElement:"Bases",CuboidElement:"Cuboide",PolygonElement:"Pol\xedgon",SensorElement:"Sensor",SolarPanelElement:"Panel solar",WaterHeaterElement:"Water Heater",ParabolicDishElement:"Parabolic Dish",ParabolicTroughElement:"Parabolic Trough",FresnelReflectorElement:"Fresnel Reflector",HeliostatElement:"Heliostat",WindTurbineElement:"Wind Turbine",LightElement:"Light",ElementLocked:"Bloqueado",ModelType:"Model Type",OutputBreakdown:"Breakdown",MoreResults:"More Results"},message:{ModelNotFound:"Model not found",CannotSignIn:"Cannot sign in",CannotSignOut:"Cannot sign out",YourAccountWasCreated:"Your account was created.",CannotCreateAccount:"Cannot create an account",YourAccountSettingsWereSaved:"Your account settings were saved.",CannotSaveYourAccountSettings:"Cannot save your account settings",CannotSaveYourFileToCloud:"Cannot save your file to the cloud",CannotCreateNewProject:"Cannot create a new project",CannotCreateNewProjectWithoutTitle:"Cannot create a new project without a title",CannotOpenYourProjects:"Cannot open your projects",CannotOpenProject:"Cannot open the project",CannotDeleteProject:"Cannot delete the project",CannotRenameProject:"Cannot rename the project",CannotAddDesignToProject:"Cannot add this design to the project",CannotAddDesignToProjectOwnedByOthers:"Cannot add this design to a project owned by others",DesignRemovedFromProject:"The design was successfully removed from the project",CannotRemoveDesignFromProject:"Cannot remove this design from the project",CannotUpdateProject:"Cannot update the project",CannotFetchProjectData:"Cannot fetch project data",TitleUsedChooseDifferentOne:"This title has been used. Choose a different one",CloudFileWithTitleExistsDoYouWantToOverwrite:"A cloud file with the title exists. Do you want to overwrite it?",CloudFileNotFound:"The cloud file was not found",CannotLoadModelsOnMap:"Cannot load models on map",CannotLoadLeaderboard:"Cannot load leaderboard",CannotPublishModelOnMap:"Cannot publish model on map",CannotLikeModelFromMap:"Cannot like model from map",CannotDeleteModelFromMap:"Cannot delete model from map",ModelDeletedFromMap:"Model is deleted from map",DoYouWantToDeleteModelFromMap:"Do you want to delete the model from map?",CannotOpenCloudFile:"Cannot open the cloud file",CannotReadCloudFile:"Cannot read the cloud file",CannotWriteCloudFile:"Cannot write the cloud file",CloudFileCopied:"Cloud file copied",CannotOpenCloudFolder:"Cannot open your cloud folder",CannotDeleteCloudFile:"Cannot delete the cloud file",CannotRenameCloudFile:"Cannot rename the cloud file",DoYouWantToSaveChanges:"\xbfQuieres guardar los cambios?",NotApplicableToSelectedAction:"No se aplica a la acci\xf3n seleccionada",ThisElementIsLocked:"Este elemento est\xe1 bloqueado",ThisCannotBeUndone:"Esto no se puede deshacer",AzimuthOfNorthIsZero:"Azimut del norte es 0\xb0",CounterclockwiseAzimuthIsPositive:"Hacia la izquierda es positivo",MoveCancelledBecauseOfOverlap:"Move cancelled because of overlap.",MoveOutsideBoundaryCancelled:"Move outside the boundary cancelled.",RotationCancelledBecauseOfOverlap:"Rotation cancelled because of overlap.",RotationOutsideBoundaryCancelled:"Rotation outside the boundary cancelled.",ResizingCancelledBecauseOfOverlap:"Resizing cancelled because of overlap.",ResizingOutsideBoundaryCancelled:"Resizing outside the boundary cancelled.",CannotPasteOutsideBoundary:"Cannot paste outside this surface.",CannotPasteBecauseOfOverlap:"Cannot paste because of overlap.",CannotMoveObjectTooFar:"Cannot move object too far.",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"Existing solar panels will be removed before applying the new layout.",DoYouWantToContinue:"Do you want to continue?",SolarPanelsCannotIntersectWithGround:"Solar panels cannot intersect with the ground.",SolarPanelsCannotOverlapWithOneAnother:"Solar panels cannot overlap with one another.",ScreenshotSaved:"A screenshot was saved.",CsvFileSaved:"A CSV file was saved.",SimulationStarted:"Simulation started.",SimulationCompleted:"Simulation completed.",SimulationAborted:"Simulation aborted.",SimulationPaused:"Simulation paused.",CancelSimulation:"Cancel simulation",PauseSimulation:"Pause simulation",ResumeSimulation:"Resume simulation",SimulationWillNotStartDueToErrors:"Simulation will not start due to errors",SimulationWillStartDespiteWarnings:"Simulation will start despite warnings.",EvolutionStarted:"Evolution started.",EvolutionCompleted:"Evolution completed.",EvolutionAborted:"Evolution aborted.",EvolutionPaused:"Evolution paused.",EncounterEvolutionError:"Encountered an evolution error.",CancelEvolution:"Cancel evolution",PauseEvolution:"Pause evolution",ResumeEvolution:"Resume evolution",ConvergenceThresholdHasBeenReached:"The convergence threshold has been reached.",MaximumNumberOfGenerationsHasBeenReached:"The maximum number of generations has been reached.",MaximumNumberOfStepsHasBeenReached:"The maximum number of steps has been reached.",ObjectiveFunctionTypeError:"The current objective function is not supported by this operation. Please start from the menu.",WallsAreNotAtSameHeight:"Walls are not at the same height.",WallsAreNotPerpendicular:"Walls are not perpendicular.",WallsAreNotConnected:"Walls are not connected.",WallsNumberNeedToBeFour:"The number of walls needs to be four.",BuildingContainsEmptyWall:"Building contains one or more empty wall.",BuildingRoofMissing:"Building has a missing roof.",UnknownErrors:"Unknown errors."},menu:{AnalysisOptions:"Analysis Options",option:{GridCellSize:"Grid Cell Size",SamplingFrequency:"Frecuencia de muestreo",TimesPerHour:"Veces per hora",DaysPerYear:"Days per Year"},mainMenu:"Menu principal",cloudMenu:"Men\xfa en la nube",projectSubMenu:"Project",project:{CreateNewProject:"Create New Project",OpenProject:"Open Project",SaveProjectAs:"Save Project As",YouMustLogInToCreateProject:"You must log in to create a new project",YouMustLogInToOpenProject:"You must log in to open a project"},fileSubMenu:"Archivo",file:{CreateNewFile:"Crear nuevo archivo",OpenLocalFile:"Abrir archivo local",SaveAsLocalFile:"Guardar como archivo local",SavingAbortedMustHaveValidFileName:"!Error guardando! Debes tener un nombre de archivo v\xe1lido",OpenCloudFile:"Abrir archivo en la nube",SaveCloudFile:"Guardar archivo en la nube",SaveAsCloudFile:"Guardar como archivo en la nube",SavingAbortedMustHaveValidTitle:"!Error guardando! Debes tener un t\xedtulo v\xe1lido para el archivo en la nube",ToSaveYourWorkPleaseSignIn:"Para guardar tu trabajo, por favor reg\xedstrese.",TakeScreenshot:"Hacer captura de pantalla",UseCloudFileName:"Use Cloud File Name",PublishOnModelsMap:"Publish on Models Map",PublishedOnModelsMap:"Your model has been published on the Models Map",UpdatedOnModelsMap:"Your model has been updated on the Models Map",YouMustLogInToPublishYourModel:"You must log in to publish your model",YouCannotPublishAModelThatYouDoNotOwn:"You cannot publish a model that you do not own",YouMustSaveModelOnCloudBeforePublishingIt:"You must save the model on the cloud before publishing it"},editSubMenu:"Editar",edit:{Undo:"Deshacer",Redo:"Repetir"},viewSubMenu:"Vista",view:{NavigationView:"Navigation View",TwoDimensionalView:"Vista 2D",ResetView:"Resetear",ZoomIn:"Acercar",ZoomOut:"Alejar",AutoRotate:"Auto rotaci\xf3n",ShowShadow:"Mostrar sombra",ShowSurfaceShininess:"Show Surface Shininess",TranslucentFloatingWindows:"Translucent Floating Windows",accessoriesSubMenu:"Accessories",accessories:{SiteInformation:"Informaci\xf3n del sitio",DesignInformation:"Informaci\xf3n de dise\xf1o",Instruction:"Instrucci\xf3n",StickyNote:"Nota adhesiva",Note:"Nota"}},settingsSubMenu:"Settings",settings:{WeatherData:"Datos del tiempo",DiurnalTemperature:"Diurnal Temperature",Heliodon:"Heliodon",SunAndTime:"Sun & Time"},benchmarksSubMenu:"Benchmarks",benchmarks:{SolarRadiationPredictionVsMeasurement:"Solar Radiation Prediction vs. Measurement",BESTESTCase600:"Building Energy Simulation Test: BESTEST Case 600",BESTESTCase610:"Building Energy Simulation Test: BESTEST Case 610",BESTESTCase620:"Building Energy Simulation Test: BESTEST Case 620",BESTESTCase630:"Building Energy Simulation Test: BESTEST Case 630"},graph:{LineWidth:"Line Width",SymbolSize:"Symbol Size",BarCategoryGap:"Bar Category Gap",ShowHorizontalGridLines:"Show Horizontal Grid Lines",ShowVerticalGridLines:"Show Vertical Grid Lines"},analysisSubMenu:"An\xe1lisis",physicsSubMenu:"Physics",physics:{DailySolarRadiationHeatmap:"Daily Solar Radiation Heatmap",SolarRadiationHeatmapOptions:"Solar Radiation Heatmap Options",SolarRadiationHeatmapGridCellSize:"Solar Radiation Heatmap Grid Cell Size",SolarRadiationHeatmapMaxValue:"Solar Radiation Heatmap Maximum Value",SolarRadiationHeatmapNoAnimation:"No Animation for Static Model",ReflectionHeatmap:"Reflection Heatmap"},sensorSubMenu:"Sensores",sensor:{CollectDailyData:"Recoger datos diarios",CollectYearlyData:"Recoger datos anuales",SensorSimulationNoAnimation:"No Animation for Collecting Sensor Data"},buildingSubMenu:"Building",building:{AnalyzeDailyBuildingEnergy:"Analyze Daily Building Energy",AnalyzeYearlyBuildingEnergy:"Analyze Yearly Building Energy",EnergyAnalysisOptions:"Energy Analysis Options",EnergyGridCellSize:"Energy Grid Cell Size",BuildingEnergySimulationNoAnimation:"No Animation for Building Energy Simulation"},solarPanelSubMenu:"Paneles solares",solarPanel:{AnalyzeDailyYield:"Analizar el rendimiento diario",AnalyzeYearlyYield:"Analizar el rendimiento anual",AnalyzeVisibility:"Analyze Visibility",PanelDiscretization:"Discretizaci\xf3n del panel",Exact:"Exacto",Approximate:"Aproximado",EnergyGridCellSize:"Energy Grid Cell Size",VisibilityGridCellSize:"View Factor Grid Cell Size",EnergyAnalysisOptions:"Energy Analysis Options",VisibilityAnalysisOptions:"Visibility Analysis Options",SolarPanelSimulationNoAnimation:"No Animation for Solar Panel Simulation"},parabolicTroughSubMenu:"Parabolic Trough",parabolicTrough:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},parabolicDishSubMenu:"Parabolic Dish",parabolicDish:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},fresnelReflectorSubMenu:"Fresnel Reflector",fresnelReflector:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},heliostatSubMenu:"Heliostat",heliostat:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield"},solarUpdraftTowerSubMenu:"Solar Updraft Tower",solarUpdraftTower:{AnalyzeDailyYield:"Analyze Daily Yield",AnalyzeYearlyYield:"Analyze Yearly Yield",SolarUpdraftTowerSimulationNoAnimation:"No Animation for Solar Updraft Tower Simulation"},tutorialsSubMenu:"Tutorials",solarEnergyScienceSubMenu:"Solar Science",solarEnergyScienceTutorials:{SunAngles:"\xc1ngulos solares relativos a un observador en el suelo",InsolationAndClimate:"Insolation and Climate",SolarRadiationToBox:"Radiaci\xf3n solar a una caja"},buildingScienceSubMenu:"Building Science",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"Thermal Envelope vs. Building Envelope",EffectOfSizeOnBuildingEnergy:"Effect of Size on Building Energy",EffectOfOrientationOnBuildingEnergy:"Effect of Orientation on Building Energy",EffectOfInsulationOnBuildingEnergy:"Effect of Insulation on Building Energy",EffectOfRoofColorOnBuildingEnergy:"Effect of Roof Color on Building Energy",EffectOfEavesOverhangLengthOnBuildingEnergy:"Effect of Eaves Overhang Length on Building Energy",EffectOfWindowSHGCOnBuildingEnergy:"Effect of Window Solar Heat Gain on Building Energy",EffectOfThermostatSetpointOnBuildingEnergy:"Effect of Thermostat Setpoint on Building Energy",EffectOfSolarPanelsOnBuildingEnergy:"Effect of Solar Panels on Building Energy",EffectOfGroundTemperatureOnBuildingEnergy:"Effect of Ground Temperature on Building Energy",EffectOfTreesOnBuildingEnergy:"Effect of Trees on Building Energy"},buildingDesignSubMenu:"Building Design",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"Cape Cod Style House with Shed Dormer",MansardRoofWithDormers:"Mansard Roof with Dormers",GableRoofVsHipRoof:"Gable Roof vs. Hip Roof",ColonialVsSaltbox:"Colonial vs. Saltbox",GambrelRoofVsMansardRoof:"Gambrel Roof vs. Mansard Roof",CombinationRoofVsBonnetRoof:"Combination Roof vs. Bonnet Roof",DutchGableRoof:"Dutch Gable Roof",GableAndValleyRoof:"Gable and Valley Roof",ClerestoryRoof:"Clerestory Roof",MonitorRoof:"Monitor Roof",AFrameHouse:"A-Frame House",HalfTimberedHouse:"Half-Timbered House",AllBasicRoofTypes:"All Basic Roof Types"},photovoltaicSolarPowerSubMenu:"Photovoltaic Solar Power",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"Effect of Tilt Angle",EffectOfAzimuthOfSolarPanel:"Effect of Azimuth",SolarPanelTypes:"Solar Panel Types",VerticalBifacialSolarPanels:"Vertical Bifacial Solar Panels",CompareMonofacialAndBifacialSolarPanels:"Monofacial vs. Bifacial Solar Panels",SolarTrackers:"Seguidores solares",CoveringGroundWithSolarPanels:"Why Just Covering the Ground with Solar Panels is not a Good Idea",InterRowSpacingOfSolarPanelArray:"Effect of Inter-Row Spacing in a Solar Panel Array",EffectOfOrientationOfSolarPanels:"Effect of Orientation of Solar Panels",SolarPanelArrayAutomaticLayout:"Solar Panel Array Automatic Layout"},concentratedSolarPowerSubMenu:"Concentrated Solar Power",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"Effect of Azimuth of a Parabolic Trough",EffectOfLatusRectumOfParabolicTrough:"Effect of Latus Rectum of a Parabolic Trough",FocusSunlightWithParabolicDish:"Focus Sunlight with a Parabolic Dish",LinearFresnelReflectors:"Linear Fresnel Reflectors",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"Effect of Absorber Pipe Height for Linear Fresnel Reflectors",EffectOfAzimuthOfLinearFresnelReflectors:"Effect of Azimuth of Linear Fresnel Reflectors",LinearFresnelReflectorsWithTwoAbsorbers:"Linear Fresnel Reflectors with Two Absorbers",CosineEfficiencyOfHeliostats:"Cosine Efficiency of Heliostats",ShadowingAndBlockingOfHeliostats:"Shadowing and Blocking of Heliostats",EffectSolarPowerTowerHeight:"Effect of Solar Power Tower Height",SolarPowerTower:"Solar Power Tower"},otherTypesOfSolarPowerSubMenu:"Other Types of Solar Power",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"Solar Updraft Tower"},generativeDesignSubMenu:"Generative Design",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Monofacial Solar Panel Array",BifacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Bifacial Solar Panel Array",OutputOfSolarPanelArrayInDifferentPlaces:"The Output of a Solar Panel Array in Different Places",SimpleSolarFarmParetoFront:"The Pareto Front for Designing a Simple Solar Farm"},examplesSubMenu:"Ejemplos",solarEnergySubMenu:"Energ\xeda Solar",solarEnergyExamples:{SunBeamAndHeliodon:"Rayo de sol y heliodon",RooftopSolarPanels:"Rooftop Solar Panels",NevadaSolarOneParabolicTroughArray:"Nevada Solar One Parabolic Trough Array",TooeleParabolicDishArray:"Tooele Parabolic Dish Array",PS10SolarPowerTower:"PS10 Solar Power Tower",TucsonLinearFresnelReflectors:"Tucson Linear Fresnel Reflectors",SolarCanopyFormFactors:"Solar Canopy Form Factors",SolarCanopyOverBleachers:"Solar Canopy Over Bleachers",SolarCanopyOverGarage:"Solar Canopy Over Garage",SolarBusStop:"Solar Bus Stop",SolarFacadeTesla:"Tesla Solar Fa\xe7ade",BuildingIntegratedPhotovoltaics:"Building-Integrated Photovoltaics",Floatovoltaics:"Floatovoltaics",Agrivoltaics:"Agrivoltaics",VegetativeBuffer:"Vegetative Buffer",RainbowSwashSolarFarmBostonMA:"Rainbow Swash Solar Farm in Boston, MA",MickeyMouseSolarFarmOrlandoFL:"Mickey Mouse Solar Farm in Orlando, FL",SolarPanelsOverCanalBakersfieldCA:"Hypothetical Solar Panels Over Canal in Bakersfield, CA",SolarNoiseBarrierLexingtonMA:"Hypothetical Solar Noise Barrier in Lexington, MA",HSATSolarTrackersRaleighNC:"Horizontal Single Axis Trackers (HSAT) in Raleigh, NC",AADATSolarTrackersLancasterCA:"Azimuth\u2013Altitude Dual Axis Trackers (AADAT) in Lancaster, CA",SolarUpdraftTowerInCity:"Solar Updraft Tower in City"},builtEnvironmentSubMenu:"Built Environment",residentialBuildingsSubMenu:"Residential Buildings",residentialBuildingExamples:{ColonialHouse:"Colonial House",DutchColonialHouse:"Dutch Colonial House",TShapedHouse:"T-Shaped House",CapeCodHouseWithGarage:"Cape Cod House with Garage",Solarium:"Solarium",Church1:"Church 1",Cathedral1:"Cathedral 1",Cathedral2:"Cathedral 2",Mosque1:"Mosque 1",AdobeTaosHouse:"Adobe Taos House",RanchHouse:"Ranch House",BonnetHouse:"Bonnet House",BarnStyleHouse:"Barn Style House",ModernHouse:"Modern House",ButterflyRoofHouse:"Butterfly Roof House"},commercialBuildingsSubMenu:"Commercial Buildings",commercialBuildingExamples:{WhiteHouse:"White House",BilimMersinTurkiye:"BILIM, Mersin, Turkiye",SpanishStyleHotel:"Spanish Style Hotel",ApartmentBuilding:"Apartment Building",OfficeBuilding:"Edificio de oficinas",Hotel:"Hotel"},buildingComplexesSubMenu:"Building Complexes",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"South Burlington High School, VT",MescaleroApacheSchoolNewMexico:"Mescalero Apache School, NM"},urbanPlanningSubMenu:"Urban Planning",urbanPlanningExamples:{Heatmap1:"Heatmap"},otherBuildingsSubMenu:"Other Buildings",otherBuildingExamples:{Greenhouse:"Greenhouse",Pavilion:"Pavilion in a Park",OctagonalPagoda:"Octagonal Pagoda",OceanFront:"Ocean Front",EgyptianPyramids:"Egyptian Pyramids",MayanPyramid:"Mayan Pyramid",SiOSePol:"Si-o-se-pol",StackedCuboids:"Stacked Cuboids"},artificialIntelligenceSubMenu:"Artificial Intelligence",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"Optimizing the Tilt Angle of a Solar Panel Row",OptimizingTiltAnglesOfMultipleSolarPanelRows:"Optimizing the Tilt Angles of Multiple Solar Panel Rows",SolarFarmGenerativeDesign:"Solar Farm Generative Design",SolarFarmGenerativeDesignWithBlock:"Solar Farm Generative Design in the Presence of a Block",FitchburgSolarFarmGenerativeDesign:"Fitchburg Solar Farm Generative Design"},languageSubMenu:"Idioma",publicSubMenu:"Public",ModelsGallery:"Models Gallery",ModelsMap:"Models Map",AboutUs:"Sobre nosotros"},avatarMenu:{AccountSettings:"Configuraciones de la cuenta",PrivacyStatementTitle:"User Privacy Protection Statement",PrivacyStatement:"When you sign in, your Google ID is used to create and access your Aladdin account. Only a random alphanumeric string is stored in our database as a reference. No personally identifiable data such as your name or email is ever gathered. For more information, see our ",SignIn:"Iniciar sesi\xf3n",SignOut:"Desconectar",IfYouAreAStudent:"Si eres un estudiante"},skyMenu:{Axes:"Ejes",Theme:"Tema",ThemeDefault:"Por defecto",ThemeDesert:"Desierto",ThemeDune:"Dune",ThemeForest:"Bosque",ThemeGrassland:"Campo",ThemeHill:"Hill",ThemeLake:"Lake",ThemeMountain:"Mountain",ThemeRural:"Rural",SunlightAttenuationCoefficientInAir:"Sunlight Attenuation Coefficient in Air",ConvectiveCoefficientOfAir:"Convective Coefficient of Air",HighestTemperatureTimeInMinutes:"Highest Temperature Time (Minutes)",SelectSunAnglesToShow:"Select Sun Angles to Show",ShowAzimuthAngle:"Show Azimuth Angle",ShowElevationAngle:"Show Elevation Angle",ShowZenithAngle:"Show Zenith Angle",DirectLightBrightnessAtNoon:"Direct Light Brightness at Noon",AmbientLightBrightnessAtNoon:"Ambient Light Brightness at Noon"},groundMenu:{MonthlyIrradianceLoss:"Monthly Irradiance Loss",Vegetation:"Vegetation",LeafOutDay:"Leaf-Out Day",LeafOffDay:"Leaf-Off Day",Albedo:"Albedo",ImageOnGround:"Imagen en el suelo",WaterSurface:"Water Surface",RemoveAllUnlockedTrees:"Eliminar todos los \xe1rboles",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedPeople:"Eliminar toda la gente",RemoveAllUnlockedFoundations:"Eliminar todos las bases",RemoveAllUnlockedCuboids:"Eliminar todos los cuboides",DoYouReallyWantToRemoveAllPeople:"Est\xe1s seguro que quieres eliminar a toda la gente who are not locked",DoYouReallyWantToRemoveAllTrees:"Est\xe1s seguro que quieres eliminar todos los \xe1rboles that are not locked",DoYouReallyWantToRemoveAllFlowers:"Do you really want to remove all the flowers that are not locked",DoYouReallyWantToRemoveAllSolarPanels:"Do you really want to remove all the solar panels that are not locked",DoYouReallyWantToRemoveAllFoundations:"Est\xe1s seguro que quieres eliminar todas las bases that are not locked",DoYouReallyWantToRemoveAllCuboids:"Est\xe1s seguro que quieres eliminar todos los cuboides that are not locked",LockAllElements:"Lock All Elements",UnlockAllElements:"Unlock All Elements"},labelSubMenu:{Label:"Etiqueta",LabelText:"Label Text",LabelHeight:"Label Height",LabelSize:"Label Size",LabelFontSize:"Font Size",LabelColor:"Label Color",KeepShowingLabel:"Seguir mostrando etiqueta"},foundationMenu:{RemoveAllUnlockedSolarPanels:"Eliminar todos los paneles solares",RemoveAllUnlockedParabolicTroughs:"Remove All Unlocked Parabolic Troughs",RemoveAllUnlockedParabolicDishes:"Remove All Unlocked Parabolic Dishes",RemoveAllUnlockedFresnelReflectors:"Remove All Unlocked Fresnel Reflectors",RemoveAllUnlockedHeliostats:"Remove All Unlocked Heliostats",RemoveAllUnlockedSensors:"Eliminar todos los sensores",RemoveAllUnlockedLights:"Remove All Unlocked Lights",RemoveAllUnlockedWalls:"Eliminar todas las paredes",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",RemoveAllUnlockedPolygons:"Eliminar todos los pol\xedgonos",RemoveAllUnlockedHumans:"Remove All Humans",RemoveAllUnlockedTrees:"Remove All Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"Rejillas",Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",SolarPanels:"Paneles solares",SolarPanelArray:"Solar Panel Array",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"Est\xe1s seguro que quieres eliminar todos los paneles solares en esta base that are not locked",ParabolicTroughs:"Parabolic Troughs",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"Do you really want to remove all the parabolic troughs on this foundation that are not locked",ParabolicDishes:"Parabolic Dishes",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"Do you really want to remove all the parabolic dishes on this foundation that are not locked",FresnelReflectors:"Fresnel Reflectors",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"Do you really want to remove all the Fresnel reflectors on this foundation that are not locked",Heliostats:"Heliostats",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"Do you really want to remove all the heliostats on this foundation that are not locked",Sensors:"Sensores",DoYouReallyWantToRemoveAllSensorsOnFoundation:"Est\xe1s seguro que quieres eliminar todos los sensores de esta base",Lights:"Lights",DoYouReallyWantToRemoveAllLightsOnFoundation:"Do you really want to remove all the lights on this foundation that are not locked",Walls:"Paredes",DoYouReallyWantToRemoveAllWallsOnFoundation:"Est\xe1s seguro que quieres eliminar todas las paredes de esta base that are not locked",Windows:"Windows",DoYouReallyWantToRemoveAllWindowsOnFoundation:"Do you really want to remove all the windows on this foundation that are not locked",Doors:"Doors",DoYouReallyWantToRemoveAllDoorsOnFoundation:"Do you really want to remove all the doors on this foundation that are not locked",Polygons:"Pol\xedgonos",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"Est\xe1s seguro que quieres eliminar todos los pol\xedgonos de esta base that are not locked",Humans:"Humans",DoYouReallyWantToRemoveAllHumansOnFoundation:"Do you really want to remove all the humans on this foundation who are not locked",Trees:"Trees",DoYouReallyWantToRemoveAllTreesOnFoundation:"Do you really want to remove all the trees on this foundation that are not locked",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnFoundation:"Do you really want to remove all the flowers on this foundation that are not locked",OnlyThisFoundation:"Solamente esta base",AllConnectedFoundations:"Todas las bases conectadas",AllSelectedFoundations:"All Selected Foundations",AllFoundations:"Todas las bases",AddPolygon:"A\xf1adir pol\xedgono",SolarStructure:"Solar Structure",GroupMaster:"Group Master",LockAllElementsOnThisFoundation:"Lock All Elements on This Foundation",UnlockAllElementsOnThisFoundation:"Unlock All Elements on This Foundation",GroundFloorRValue:"Ground Floor R-Value",OnlyThisGroundFloor:"Only This Ground Floor",AllGroundFloors:"All Ground Floors"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"Receiver Tower for Heliostats",ReceiverTowerPhysicalProperties:"Physical Properties of Receiver Tower",ReceiverTowerHeight:"Height of Receiver Tower",ReceiverTowerRadius:"Radius of Receiver Tower",ReceiverAbsorptance:"Absorptance of Receiver",ReceiverOpticalEfficiency:"Optical Efficiency of Receiver",ReceiverThermalEfficiency:"Thermal Efficiency of Receiver"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"Absorber Pipe for Fresnel Reflectors",AbsorberPipePhysicalProperties:"Physical Properties of Absorber Pipe",AbsorberHeight:"Height of Absorber Pipe",AbsorberApertureWidth:"Aperture Width of Absorber Pipe",AbsorberPipePoleNumber:"Pole Number for Absorber Pipe",AbsorberAbsorptance:"Absorptance of Absorber",AbsorberOpticalEfficiency:"Optical Efficiency of Absorber",AbsorberThermalEfficiency:"Thermal Efficiency of Absorber"},solarUpdraftTowerMenu:{SolarUpdraftTower:"Solar Updraft Tower",SolarUpdraftTowerPhysicalProperties:"Physical Properties of Solar Updraft Tower",SolarUpdraftTowerChimneyHeight:"Solar Updraft Tower Chimney Height",SolarUpdraftTowerChimneyRadius:"Solar Updraft Tower Chimney Radius",SolarUpdraftTowerCollectorHeight:"Solar Updraft Tower Collector Height",SolarUpdraftTowerCollectorRadius:"Solar Updraft Tower Collector Radius",SolarUpdraftTowerCollectorTransmissivity:"Solar Updraft Tower Collector Transmissivity",SolarUpdraftTowerCollectorEmissivity:"Solar Updraft Tower Collector Emissivity",SolarUpdraftTowerDischargeCoefficient:"Solar Updraft Tower Discharge Coefficient",SolarUpdraftTowerTurbineEfficiency:"Solar Updraft Tower Turbine Efficiency"},cuboidMenu:{Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",RemoveAllUnlockedSolarPanels:"Eliminar todos los paneles solares",RemoveAllUnlockedSensors:"Eliminar todos los sensores",RemoveAllUnlockedPolygons:"Eliminar todos los pol\xedgonos",RemoveAllUnlockedHumans:"Remove All Humans",RemoveAllUnlockedTrees:"Remove All Trees",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"Rejillas",SolarPanels:"Paneles solares",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"Est\xe1s seguro que quieres eliminar todos los paneles solares de este cuboide that are not locked",Sensors:"Sensores",DoYouReallyWantToRemoveAllSensorsOnCuboid:"Est\xe1s seguro que quieres eliminar todos los sensores de este cuboide that are not locked",Polygons:"Pol\xedgonos",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"Est\xe1s seguro que quieres eliminar todos los pol\xedgonos de este cuboide that are not locked",Humans:"Humans",DoYouReallyWantToRemoveAllHumansOnCuboid:"Do you really want to remove all the humans on this cuboid who are not locked",Trees:"Trees",DoYouReallyWantToRemoveAllTreesOnCuboid:"Do you really want to remove all the trees on this cuboid that are not locked",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnCuboid:"Do you really want to remove all the flowers on this cuboid that are not locked",OnlyThisCuboid:"Solamente este cuboide",AllCuboidsOnSameSurface:"All Cuboids on Same Surface",AllCuboidsAboveSameBase:"All Cuboids above Same Base",AllSelectedCuboids:"All Selected Cuboids",AllCuboids:"Todos los cuboides",OnlyThisSide:"Solamente este lado",AllSidesOfThisCuboid:"Todos los lados en este cuboide",AllSidesOfSelectedCuboids:"All Sides of Selected Cuboids",AllSidesOfAllCuboids:"Todos los lados en todos los cuboides",AddPolygon:"A\xf1adir pol\xedgono",Stackable:"Stackable",GroupMaster:"Group Master"},polygonMenu:{Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",TextBox:"Text Box",FontOutlineColor:"Font Outline Color",FontOutlineWidth:"Font Outline Width",FontStrokeColor:"Font Stroke Color",FontStrokeWidth:"Font Stroke Width",NoOutline:"No Outline",Shiny:"Shiny",Filled:"Rellenar",FillTexture:"Rellenar textura",FillColor:"Rellenar color",Opacity:"Opacity",LineColor:"Color de la l\xednea",LineWidth:"Line Width",LineStyle:"Line Style",SolidLine:"Solid Line",DashedLine:"Dashed Line",DottedLine:"Dotted Line",InsertVertexBeforeIndex:"A\xf1adir v\xe9rtice antes del \xedndice",InsertVertexAfterIndex:"A\xf1adir v\xe9rtice despu\xe9s del \xedndice",DeleteVertex:"Eliminar v\xe9rtice",OnlyThisPolygon:"Solamente este pol\xedgono",AllPolygonsOnSurface:"All Polygons on the Same Surface",AllPolygonsAboveFoundation:"Todos los pol\xedgonos sobre la base",AllSelectedPolygons:"All Selected Polygons",AllPolygons:"Todos los pol\xedgonos",Layout:"Layout",SolarPanelArrayLayout:"Solar Panel Array Layout",SolarPanelArrayLayoutParametricDesign:"Solar Panel Array Layout: Parametric Design",SolarPanelArrayLayoutGenerativeDesign:"Solar Panel Array Layout: Generative Design",SolarPanelArrayModel:"Solar Panel Model",SolarPanelArrayOrientation:"Orientation",SolarPanelArrayTiltAngle:"Tilt Angle",SolarPanelArrayRowWidth:"Row Width",SolarPanelArrayInterRowSpacing:"Inter-Row Spacing",SolarPanelArrayRowSpacing:"Row Spacing",SolarPanelArrayRowAxis:"Row Axis",SolarPanelArrayLeftRightRowAxis:"Left-Right (Relative)",SolarPanelArrayUpDownRowAxis:"Up-Down (Relative)",SolarPanelArrayEastWestRowAxis:"East-West (Absolute)",SolarPanelArrayNorthSouthRowAxis:"North-South (Absolute)",SolarPanelArrayMargin:"Margin",SolarPanelArrayPoleHeight:"Pole Height",SolarPanelArrayPoleSpacing:"Pole Spacing",SolarPanelArrayTotalYearlyCost:"Total Cost",SolarPanelArrayTotalYearlyRevenue:"Total Revenue",SolarPanelArrayTotalYearlyYield:"Total Yield",SolarPanelArrayMeanYearlyYield:"Mean Yield",SolarPanelArrayYearlyProfit:"Profit",LayoutNotAcceptedCheckYourParameters:"This layout is not accepted. Please check your parameters."},optimizationMenu:{Optimization:"Optimization",Parameters:"Parameters",Variables:"Variables",Constants:"Constants",GeneticAlgorithm:"Genetic Algorithm",GeneticAlgorithmSettings:"Genetic Algorithm Settings",ParticleSwarmOptimization:"Particle Swarm Optimization",ParticleSwarmOptimizationSettings:"Particle Swarm Optimization Settings",SolarPanelTiltAngleOptimization:"Solar Panel Tilt Angle Optimization",SolarPanelArrayLayout:"Solar Panel Array Layout",Generation:"Generation",Gene:"Gene",NormalizedVariables:"Normalized Variables",Objective:"Objective",ObjectiveFunctionDailyTotalYield:"Daily Total Yield",ObjectiveFunctionYearlyTotalYield:"Yearly Total Yield",ObjectiveFunctionDailyMeanYield:"Daily Mean Yield",ObjectiveFunctionYearlyMeanYield:"Yearly Mean Yield",ObjectiveFunctionDailyProfit:"Daily Profit",ObjectiveFunctionYearlyProfit:"Yearly Profit",GeneticAlgorithmSelectionMethod:"Genetic Algorithm Selection Method",RouletteWheel:"Roulette Wheel",Tournament:"Tournament",SearchMethod:"Search Method",GlobalSearchUniformSelection:"Global Search Uniform Selection",LocalSearchRandomOptimization:"Local Search Random Optimization",PopulationSize:"Population Size",MaximumGenerations:"Maximum Generations",SelectionRate:"Selection Rate",CrossoverRate:"Crossover Rate",MutationRate:"Mutation Rate",Step:"Step",SwarmSize:"Swarm Size",MaximumSteps:"Maximum Steps",MaximumVelocity:"Maximum Velocity",InertiaWeight:"Inertia Weight",CognitiveCoefficient:"Cognitive Coefficient",SocialCoefficient:"Social Coefficient",ConvergenceThreshold:"Convergence Threshold for Termination",LocalSearchRadius:"Local Search Radius",RowsPerRackRange:"Range for Rows per Rack",TiltAngleRange:"Range for Tilt Angle",InterRowSpacingRange:"Range for Inter-Row Spacing",ClickTargetPolygonToActivate:"Click Target Polygon to Activate",ClickTargetFoundationToActivate:"Click Target Foundation to Activate"},treeMenu:{ShowModel:"Mostrar modelo",Flip:"Flip",Type:"Tipo",Spread:"Extender"},flowerMenu:{Flip:"Flip",Type:"Type",Spread:"Spread"},peopleMenu:{ChangePerson:"Cambiar persona",Flip:"Flip",Observer:"Observer",ViewFromThisPerson:"View from This Person"},lightMenu:{Color:"Color",Intensity:"Intensity",Decay:"Decay",MaximumDistance:"Distance",Inside:"Inside"},solarCollectorMenu:{RelativeAzimuth:"Azimut relativa",Pole:"Pole",PoleHeight:"Altura del poste",PoleRadius:"Pole Radius",ExtraPoleHeight:"Extra Pole Height",ExtraPoleHeightInAdditionToHalfWidth:"Extra Pole Height in Addition to Half Width",DrawSunBeam:"Dibujar rayo del sol"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"Reflector Reflectance",ReceiverAbsorptance:"Receiver Absorptance",ReflectorOpticalEfficiency:"Reflector Optical Efficiency",ReceiverThermalEfficiency:"Receiver Thermal Efficiency"},solarPanelMenu:{InverterEfficiency:"Inverter Efficiency",InverterEfficiencyExplained:"The efficiency for converting direct current (DC) to alternating current (AC).",DcToAcSizeRatio:"DC-to-AC Size Ratio",DcToAcSizeRatioExplained:"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.",ChangePvModel:"Cambiar modelo PV",Orientation:"Orientaci\xf3n",Portrait:"Vertical",Landscape:"Horizontal",FrameColor:"Frame Color",Panels:"paneles",PanelsWide:"ancho paneles",PanelsLong:"longitud paneles",TiltAngle:"Inclinar \xe1ngulo",SouthFacingIsPositive:"Orientado al sur es positivo",Tracker:"Seguidor",SolarTrackerFollowsSun:"Un seguidor sigue el sol para incrementar las salidas de los paneles solares",PoleSpacing:"Espaciado entre postes",NoTracker:"Sin seguimiento",HorizontalSingleAxisTracker:"Seguidor horizontal de eje \xfanico",VerticalSingleAxisTracker:"Seguidor vertical de eje \xfanico",AltazimuthDualAxisTracker:"Seguidor de doble eje altazimutal",OnlyThisSolarPanel:"Solamente este panel solar",AllSolarPanelsOnSurface:"Todos los paneles solares en la misma superficie",AllSolarPanelsAboveFoundation:"Todos los paneles solares sobre la misma base",AllSelectedSolarPanels:"All Selected Solar Panels",AllSolarPanels:"Todos los paneles solares"},pvModelPanel:{SolarPanelSpecs:"Especificaciones del panel solar",Model:"Modelo",PanelSize:"Tama\xf1o del panel",Cells:"Celdas",CellType:"Tipo de celda",Monocrystalline:"Monocristalino",Polycrystalline:"Policristalino",ThinFilm:"Pel\xedcula delgada",Bifacial:"Bifacial",BifacialityFactor:"Bifaciality Factor",Black:"Negro",Blue:"Azul",ShadeTolerance:"Tolerancia a la sombra",SolarCellEfficiency:"Eficiencia de la c\xe9lula solar",NominalOperatingCellTemperature:"Temperatura nominal de la celda de funcionamiento",TemperatureCoefficientOfPmax:"Coeficiente de temperatura de Pmax"},parabolicTroughMenu:{ModuleLength:"Module Length",Modules:"modules",ModulesLong:"modules long",LatusRectum:"Latus Rectum",OnlyThisParabolicTrough:"Only This Parabolic Trough",AllParabolicTroughsAboveFoundation:"All Parabolic Troughs Above the Same Foundation",AllSelectedParabolicTroughs:"All Selected Parabolic Troughs",AllParabolicTroughs:"All Parabolic Troughs"},fresnelReflectorMenu:{AbsorberPipe:"Absorber Pipe",SelectAbsorberToReflectSunlightTo:"Select Absorber to Reflect Sunlight to",ModuleLength:"Module Length",Modules:"modules",ModulesLong:"modules long",OnlyThisFresnelReflector:"Only This Fresnel Reflector",AllFresnelReflectorsAboveFoundation:"All Fresnel Reflectors Above the Same Foundation",AllSelectedFresnelReflectors:"All Selected Fresnel Reflectors",AllFresnelReflectors:"All Fresnel Reflectors"},heliostatMenu:{Tower:"Tower",SelectTowerToReflectSunlightTo:"Select Tower to Reflect Sunlight to",OnlyThisHeliostat:"Only This Heliostat",AllHeliostatsAboveFoundation:"All Heliostats Above the Same Foundation",AllSelectedHeliostats:"All Selected Heliostats",AllHeliostats:"All Heliostats"},parabolicDishMenu:{ReceiverStructure:"Receiver Structure",CentralPole:"Central Pole",CentralPoleWithTripod:"Central Pole with Tripod",Quadrupod:"Quadrupod",RimDiameter:"Rim Diameter",LatusRectum:"Latus Rectum",ExtraPoleHeightInAdditionToRadius:"Extra Pole Height in Addition to Radius",OnlyThisParabolicDish:"Only This Parabolic Dish",AllParabolicDishesAboveFoundation:"All Parabolic Dishes Above the Same Foundation",AllSelectedParabolicDishes:"All Selected Parabolic Dishes",AllParabolicDishes:"All Parabolic Dishes"},wallMenu:{TextureDefault:"Por defecto",Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",SizeOfWall:"Tama\xf1o de la pared",OnlyThisWall:"Solamente esta pared",AllConnectedWalls:"All Connected Walls",AllWallsAboveFoundation:"Todas las paredes sobre la misma base",AllSelectedWalls:"All Selected Walls",AllWalls:"Todo paredes",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisWall:"Do you really want to remove all the windows on this wall",Doors:"Doors",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",DoYouReallyWantToRemoveAllDoorsOnThisWall:"Do you really want to remove all the doors on this wall",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"Do you really want to remove all the solar panels on this wall",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisWall:"Do you really want to remove all the sensors on this wall",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisWall:"Do you really want to remove all the lights on this wall",LockAllPolygons:"Lock All Polygons",UnlockAllPolygons:"Unlock All Polygons",RemoveAllUnlockedPolygons:"Eliminar todos los pol\xedgonos",WallStructure:"Wall Structure",DefaultStructure:"Default",StudStructure:"Stud",PillarStructure:"Pillar",Opacity:"Opacity",StructureSpacing:"Structure Spacing",StructureWidth:"Structure Width",StructureThickness:"Structure Thickness",StructureColor:"Structure Color",Color:"Wall Color",Height:"Altura",Thickness:"Thickness",Texture:"Texture",AllLightsOnWallInside:"All Lights on Wall Inside",AllLightsOnWallOutside:"All Lights on Wall Outside",Fill:"Fill",Full:"Full",Partial:"Partial",Empty:"Empty",OpenToOutside:"Open to Outside",EavesLength:"Eaves Overhang Length",Parapet:"Parapet",ParapetColor:"Parapet Color",ParapetTexture:"Parapet Texture",ParapetHeight:"Parapet Height",CopingsHeight:"Copings Height",CopingsWidth:"Copings Width"},windowMenu:{OnlyThisWindow:"Only This Window",AllWindowsOnSurface:"All Windows on the Same Surface",AllWindowsAboveFoundation:"All Windows Above the Same Foundation",AllSelectedWindows:"All Selected Windows",AllWindows:"All Windows",Width:"Ancho",Height:"Altura",Setback:"Setback from Exterior Surface",RelativeToWallThickness:"Relative to wall thickness",Mullion:"Mullion",HorizontalMullion:"Horizontal Mullion",VerticalMullion:"Vertical Mullion",MullionWidth:"Mullion Width",HorizontalMullionSpacing:"Horizontal Mullion Spacing",VerticalMullionSpacing:"Vertical Mullion Spacing",MullionColor:"Mullion Color",Tint:"Tint",Opacity:"Opacity",SolarHeatGainCoefficient:"Solar heat gain coefficient (SHGC) = 1 - opacity",Shutter:"Shutter",LeftShutter:"Left Shutter",RightShutter:"Right Shutter",BothShutters:"Both Shutters",ShutterWidth:"Relative Width",ShutterColor:"Shutter Color",Frame:"Frame",FrameWidth:"Frame Width",SillWidth:"Sill Width",Color:"Frame Color",WindowType:"Window Type",Default:"Default",Arched:"Arched",Polygonal:"Polygonal",Interior:"Interior",Empty:"Empty"},roofMenu:{TextureDefault:"Por defecto",Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",OnlyThisRoof:"Only This Wall",AllRoofsAboveFoundation:"All Walls Above the Same Foundation",AllSelectedRoofs:"All Selected Roofs",AllRoofs:"All Roofs",OnlyThisCeiling:"Only This Ceiling",AllCeilingsAboveFoundation:"All Ceilings Above the Same Foundation",AllCeilings:"All Ceilings",EavesOverhangLength:"Eaves Overhang Length",RafterSpacing:"Rafter Spacing",RafterWidth:"Rafter Width",RafterThickness:"Rafter Thickness",RafterColor:"Rafter Color",RoofColor:"Roof Color",RoofSideColor:"Roof Side Color",GlassTint:"Glass Tint",Opacity:"Opacity",RoofStructure:"Roof Structure",DefaultStructure:"Default",RafterStructure:"Rafter",GlassStructure:"Glass",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"Do you really want to remove all the solar panels on this roof",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"Do you really want to remove all the windows on this roof",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"Do you really want to remove all the sensors on this roof",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisRoof:"Do you really want to remove all the lights on this roof",AllLightsOnRoofInside:"All Lights on Roof Inside",AllLightsOnRoofOutside:"All Lights on Roof Outside",Rise:"Rise",Ceiling:"Ceiling",RoofRValue:"Roof R-Value",CeilingRValue:"Ceiling R-Value"},doorMenu:{TextureDefault:"Por defecto",Texture01:"Textura 1",Texture02:"Textura 2",Texture03:"Textura 3",Texture04:"Textura 4",Texture05:"Textura 5",Texture06:"Textura 6",Texture07:"Textura 7",Texture08:"Textura 8",Texture09:"Textura 9",Texture10:"Textura 10",Texture11:"Textura 11",Texture12:"Textura 12",Texture13:"Textura 13",Texture14:"Textura 14",Texture15:"Textura 15",Texture16:"Textura 16",Texture17:"Textura 17",OnlyThisDoor:"Only This Door",AllDoorsOnWall:"All Doors on the Same Wall",AllDoorsAboveFoundation:"All Doors Above the Same Foundation",AllSelectedDoors:"All Selected Doors",AllDoors:"All Doors",DoorType:"Door Type",Default:"Default",Arched:"Arched",Filled:"Filled",FrameColor:"Frame Color",Interior:"Interior"},siteInfoPanel:{High:"Alto",Low:"Bajo"},designInfoPanel:{NumberOfSelectedHeliostats:"Number of selected heliostats",NumberOfSelectedSolarPanels:"Number of selected solar panels",ElectricityGeneratedDailyBySolarPanels:"Electricity generated daily by these solar panels",SceneDiameter:"Scene diameter",BuildingArea:"Building area"},visualizationControlPanel:{ColorContrast:"Color Contrast",FluxScale:"Flux Scale",ClickUpOrDownArrowButtonsToChange:"Click up or down arrow buttons to change"},instructionPanel:{Rotate:"Rotar",DragMouse:"Arrastrar el rat\xf3n",Zoom:"Zoom",MouseWheelOrKeys:"Girar el mouse o presionar Ctrl+[ o Ctrl+]",MouseWheelOrKeysMac:"Girar el mouse o presionar \u2318+[ o \u2318+]",Pan:"Panor\xe1mica",HoldCtrlDragMouse:"Mantener Ctrl y mover el rat\xf3n",HoldMetaDragMouse:"Hold \u2318 and drag mouse",Enter2DMode:"Enter 2D mode",Exit2DMode:"Exit 2D mode",NavigationMode:"Navigation mode",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",MoveForwardBack:"Move forward/back",MoveForwardBackInstruction:"Press W/S",MoveLeftRight:"Move left/right",MoveLeftRightInstruction:"Press A/D",MoveUpDown:"Move up/down",MoveUpDownInstruction:"Press Z/X",Turn:"Turn",TurnInstruction:"Press arrow keys",ResetView:"Reset",AutoRotate:"Auto rotar",StartOrStop:"Presiona F4 para empezar o parar"},mapPanel:{ImageOnGround:"Imagen en el suelo",WeatherStations:"Weather Stations",WeatherStationsNote:"Turn this off to speed up",Coordinates:"Coordenadas",Zoom:"Zoom"},visibilityPanel:{SolarPanelVisibility:"Solar Panel Visibility",Observer:"Observer",VantagePoint:"Vantage Point",ItemizedVisibilityByFields:"Itemized by Fields",TotalVisibility:"Total"},sensorPanel:{LightSensor:"Sensor de luz",WeatherDataFrom:"Datos metereol\xf3gicos de"},buildingEnergyPanel:{DailyBuildingEnergy:"Daily Building Energy",YearlyBuildingEnergy:"Yearly Building Energy",Heater:"Heater",AC:"AC",SolarPanel:"Solar Panel",Net:"Net"},solarPanelYieldPanel:{SolarPanelDailyYield:"Rendimiento diario del panel solar",SolarPanelYearlyYield:"Rendimiento anual del panel solar",Yield:"Rendimiento",YieldPerHour:"Rendimiento por hora",DailyTotal:"Total diario",YearlyTotal:"Total anual",ShowOutputsOfIndividualSolarPanels:"Mostrar salidas de paneles solares individuales",Profit:"Profit",TotalCost:"Total Cost",TotalRevenue:"Total Revenue",TotalYield:"Total Yield",MeanYield:"Mean Yield",ModuleCount:"Module Count"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"Parabolic Trough Daily Yield",ParabolicTroughYearlyYield:"Parabolic Trough Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualParabolicTroughs:"Show outputs of individual parabolic troughs"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"Parabolic Dish Daily Yield",ParabolicDishYearlyYield:"Parabolic Dish Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualParabolicDishes:"Show outputs of individual parabolic dishes"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"Fresnel Reflector Daily Yield",FresnelReflectorYearlyYield:"Fresnel Reflector Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualFresnelReflectors:"Show outputs of individual Fresnel feflectors"},heliostatYieldPanel:{HeliostatDailyYield:"Heliostat Daily Yield",HeliostatYearlyYield:"Heliostat Yearly Yield",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualHeliostats:"Show outputs of individual heliostats"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"Solar Updraft Tower Daily Yield",UpdraftTowerYearlyYield:"Solar Updraft Tower Yearly Yield",ChimneyAirTemperature:"Chimney Air Temperature",ChimneyWindSpeed:"Chimney Wind Speed",Yield:"Yield",YieldPerHour:"Yield per Hour",DailyTotal:"Daily Total",YearlyTotal:"Yearly Total",ShowOutputsOfIndividualUpdraftTowers:"Show outputs of individual updraft towers"},heliodonPanel:{SunAndTimeSettings:"Sun & Time Settings",SunAngles:"\xc1ngulos",TwentyFourHours:"24 Hours"},cloudFilePanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyLikes:"My Likes",MyCloudFiles:"Mis archivos en la nube",GenerateLink:"Generar enlace",LinkGeneratedInClipBoard:"Se ha generado un enlace en el portapapeles",DoYouReallyWantToDelete:"Est\xe1s seguro que quieres eliminar",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"If this file has been shared or published, renaming it breaks existing links"},projectListPanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project was generated in the clip board",DoYouReallyWantToDeleteProject:"Do you really want to delete Project",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"If this project has been shared or published, renaming it breaks existing links"},projectPanel:{ProjectSettings:"Project Settings",ThumbnailImageSize:"Thumbnail Image Size",ProjectByOtherPeople:"Project by Other People",Project:"Project",ProjectType:"Type",ProjectDescription:"Description",MakeDescriptionEditable:"Make this description editable",MakeDescriptionNonEditable:"Make this description non-editable",DoubleClickToMakeDescriptionEditable:"Double-click to make this description editable",SolarPanelArray:"Solar Panel Array",CurateCurrentDesign:"Curate current design",UpdateSelectedDesign:"Update selected design",RemoveSelectedDesign:"Remove selected design",ClickToFlipSortingOrder:"Click to flip the sorting order",DesignNotShownInSolutionSpaceClickToShow:"This design is not shown in solution space; click to show",DesignShownInSolutionSpaceClickToHide:"This design is shown in solution space; click to hide",DistributionInSolutionSpace:"Distribution in the Solution Space",ChooseSolutionSpace:"Choose solution space",ChooseDataColoring:"Choose data coloring",SameColorForAllDesigns:"Same color for all designs",OneColorForEachDesign:"One color for each design",SolutionSpaceScreenshot:"Take a screenshot of the solution space",ScatteredPlotScreenshot:"Take a screenshot of the scattered plot",SingleClickToSelectDoubleClickToOpen:"Single-click to select, double-click to open.",SingleClickToDeselectDoubleClickToOpen:"Single-click to deselect, double-click to open.",GenerateScatteredPlot:"Generate Scattered Plot",SelectXAxis:"Select X Axis",SelectYAxis:"Select Y Axis"},accountSettingsPanel:{MyAccountSettings:"Configuraci\xf3n de mi cuenta",MyID:"My \ud83c\udd94",ClickToCopyMyID:"Click to copy my ID",IDInClipBoard:"Your ID was copied and is ready to paste.",StoreMyNameInMyFilesWhenSaving:"Store my name in my files when saving",DoYouReallyWantToShowYourNameInYourFiles:"Do you really want to show your display name in your files?",SignFileDisclaimer:"If yes, your display name may be seen by anyone who can access your files.",Likes:"Likes",AllPublished:"All Published",PublishedUnderAliases:"Aliases",UserCount:"User Count",SchoolID:"School ID",ClassID:"Class ID"},weatherPanel:{SunshineHours:"Luz solar"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"Select Air Temperature Model",Sinusoidal:"Sinusoidal"},economicsPanel:{EconomicsParameters:"Economics Parameters",ElectricitySellingPrice:"Electricity Selling Price",OperationalCostPerUnit:"Operational Cost per Unit",SellingPrice:"Selling Price",UnitCost:"Unit Cost"},navigationPanel:{NavigationParameters:"Navigation Parameters",MinimumMoveSpeed:"Minimum Move Speed",MinimumTurnSpeed:"Minimum Turn Speed"},yearlyLightSensorPanel:{SkyClearness:"Claridad",ShowDaylightResults:"Mostrar resultados de la luz solar",ShowSkyClearnessResults:"Mostrar resultados de claridad del cielo",ShowAverageDailySolarRadiation:"Mostrar la radiaci\xf3n solar diaria promedio"},analysisManager:{NoSensorForCollectingData:"Sin sensor para recopilar datos",NoSolarPanelForAnalysis:"Sin panel solar para el an\xe1lisis",NoObserverForVisibilityAnalysis:"There is no observer for visibility analysis.",NoWaterHeaterForAnalysis:"There is no water heater for analysis.",NoParabolicDishForAnalysis:"There is no parabolic dish for analysis.",NoParabolicTroughForAnalysis:"There is no parabolic trough for analysis.",NoFresnelReflectorForAnalysis:"There is no Fresnel reflector for analysis.",NoHeliostatForAnalysis:"There is no heliostat for analysis.",NoSolarUpdraftTowerForAnalysis:"There is no solar updraft tower for analysis.",NoBuildingForAnalysis:"There is no building for analysis."},toolbar:{CloudFile:"Archivo en la nube",Select:"Seleccionar",AddFoundation:"A\xf1adir base",AddWall:"A\xf1adir pared",AddWindow:"A\xf1adir ventana",AddDoor:"A\xf1adir door",AddPyramidRoof:"Add pyramid roof",AddGableRoof:"Add gable roof",AddHipRoof:"Add hip roof",AddGambrelRoof:"Add gambrel roof",AddMansardRoof:"Add mansard roof",AddCuboid:"A\xf1adir cuboid",AddSensor:"A\xf1adir sensor",AddSolarPanel:"A\xf1adir panel solar",AddWaterHeater:"Add water heater",AddParabolicDish:"Add parabolic dish",AddParabolicTrough:"Add parabolic trough",AddFresnelReflector:"Add Fresnel reflector",AddHeliostat:"Add heliostat",AddWindTurbine:"Add wind turbine",AddLight:"Add light",AddTree:"A\xf1adir \xe1rbol",AddFlower:"Add flower",AddPeople:"A\xf1adir gente",DoubleClickToLockThisModeForNextAction:"Double-click to lock this mode for next action",ClickToUnlockThisModeForNextAction:"Click to unlock this mode for next action",ManipulateGroup:"Manipulate a group",ClearScene:"Clear escena",ShowSunAndTimeSettings:"Show sun and time settings",SpatialAnalysisOfEnergy:"Spatial analysis of energy",DoYouReallyWantToClearContent:"Est\xe1s seguro que quieres borrar el contenido",ClickForMoreButtons:"Click for more buttons",SwitchToAddingFoundation:"Switch to Adding Foundation",SwitchToAddingCuboid:"Switch to Adding Cuboid",SwitchToAddingWall:"Switch to Adding Wall",SwitchToAddingWindow:"Switch to Adding Window",SwitchToAddingDoor:"Switch to Adding Door",SwitchToAddingPyramidRoof:"Switch to Adding Pyramid Roof",SwitchToAddingGableRoof:"Switch to Adding Gable Roof",SwitchToAddingHipRoof:"Switch to Adding Hip Roof",SwitchToAddingGambrelRoof:"Switch to Adding Gambrel Roof",SwitchToAddingMansardRoof:"Switch to Adding Mansard Roof",SwitchToAddingSolarPanel:"Switch to Adding Solar Panel",SwitchToAddingSensor:"Switch to Adding Sensor",SwitchToAddingWaterHeater:"Switch to Adding Water Heater",SwitchToAddingParabolicDish:"Switch to Adding Parabolic Dish",SwitchToAddingParabolicTrough:"Switch to Adding Parabolic Trough",SwitchToAddingFresnelReflector:"Switch to Adding Fresnel Reflector",SwitchToAddingHeliostat:"Switch to Adding Heliostat",SwitchToAddingWindTurbine:"Switch to Adding Wind Turbine",SwitchToAddingLight:"Switch to Adding Light",SwitchToAddingTree:"Switch to Adding Tree",SwitchToAddingFlower:"Switch to Adding Flower",SwitchToAddingPeople:"Switch to Adding People"},tooltip:{gotoIFI:"Ver Institute for Future Intelligence",visitAladdinHomePage:"Visita la p\xe1gina de Aladdin",clickToOpenMenu:"Haz clic para abrir el men\xfa principal",clickToAccessAccountSettings:"Click to access account settings"},tree:{Apple:"Apple",Birch:"Birch",Coconut:"Coconut",Dogwood:"Cerezo silvestre",Elm:"Olmo",FanPalm:"Fan Palm",Linden:"Tilo",Magnolia:"Magnolia",Maple:"Arce",Oak:"Roble",Pine:"Pino",Spruce:"Spruce"},flower:{Bellflower:"Bellflower",Boxwood:"Boxwood",CactusCombo1:"Cactus Combo 1",CactusCombo2:"Cactus Combo 2",CactusCombo3:"Cactus Combo 3",CactusCombo4:"Cactus Combo 4",Hibiscus:"Hibiscus",Hosta:"Hosta",Hydrangea:"Hydrangea",Peony:"Peony",RedRose:"Red Rose",Spirea:"Spirea",Sunflower:"Sunflower",TallBush:"Tall Bush",Tulip:"Tulip",WhiteFlower:"White Flower",YellowFlower:"Yellow Flower"},people:{Jaah:"Jaah",Jack:"Jack",Jacob:"Jacob",Jacqueline:"Jacqueline",Jade:"Jade",Jamelia:"Jamelia",James:"James",Jane:"Jane",Jaya:"Jaya",Jaye:"Jaye",Jeanette:"Jeanette",Jedi:"Jedi",Jeff:"Jeff",Jena:"Jena",Jennifer:"Jennifer",Jess:"Jess",Jett:"Jett",Jill:"Jill",Jiya:"Jiya",Joan:"Joan",Jocelyn:"Jocelyn",Joel:"Joel",Joey:"Joey",John:"John",Jonathon:"Jonathon",Jose:"Jose",Joseph:"Joseph",Joshua:"Joshua",Judd:"Judd",Judy:"Judy",Julia:"Julia",Julio:"Julio",Jumapili:"Jumapili",June:"June",Juro:"Juro",Justin:"Justin"},compass:{N:"N",S:"S",W:"W",E:"E"},month:{January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"},modelsMap:{SearchByPublisher:"Search by publisher",SearchByLabel:"Search by label",MyPublishedModels:"My Published Models",TotalNumberOfUserPublishedModels:"Total number of user-published models",SortFromOldestToNewest:"Sort from oldest to newest",SortFromNewestToOldest:"Sort from newest to oldest",ModelsFoundOnThisSite:"models found on this site",ShowModelsPublishedByThisAuthor:"Show the models published by this author"}}},tr:{translation:{name:{IFI:"Yar\u0131n\u0131n Zekas\u0131 Enstit\xfcs\xfc",Aladdin:"Aladdin",Tagline:"Aladdin: A\xe7\u0131klanabilir Yapay Zeka ile Tasar\u0131m\u0131 Yeniden Hayal Et \u2014 Yar\u0131n\u0131n Zekas\u0131 Enstit\xfcs\xfc"},cookie:{Statement:"Kabul Ete t\u0131klayarak, iyi bir Aladdin deneyimi i\xe7in \xe7erez kullan\u0131m\u0131n\u0131 kabul etmi\u015f olursunuz.",Accept:"Kabul Et"},aboutUs:{ProductBroughtToYouBy:"Geli\u015ftiriciler",TermsOfService:"Hizmet \u015eartlar\u0131",PrivacyPolicy:"Gizlilik Politikas\u0131",Software:"Yaz\u0131l\u0131m",Content:"\u0130\xe7erik",Research:"Ara\u015ft\u0131rma",Support:"Destek",Acknowledgment:"Onay",FundingInformation:"Ulusal Bilim Vakf\u0131 (NSF), #2105695, #2131097, ve #2301164 numaral\u0131 fon destekleriyle mevcut \xfcr\xfcn\xfcn ara\u015ft\u0131rma ve geli\u015ftirme \xe7al\u0131\u015fmalar\u0131na c\xf6mert bir mali kaynak sa\u011flam\u0131\u015ft\u0131r. Bununla birlikte \xfcr\xfcnde ifade edilen herhangi bir g\xf6r\xfc\u015f, bulgu ve sonu\xe7 veya \xf6neri yazarlar\u0131n kendi g\xf6r\xfc\u015fleridir. NSF'nin kurumsal g\xf6r\xfc\u015flerini yans\u0131tmayabilir.",Contact:"Daha fazla bilgi i\xe7in l\xfctfen Charles Xie (charles@intofuture.org) ile ileti\u015fime ge\xe7iniz.",Translators:"\xc7evirmenler"},word:{LastUpdate:"Last Update",Small:"Small",Medium:"Medium",Large:"Large",Design:"Design",Information:"Information",Type:"Type",Text:"Text",FontSize:"Font Size",FontColor:"Font Color",Model:"Model",Models:"Models",Upload:"Upload",ClickCount:"Click Count",Share:"Share",AlreadyLike:"Already like",Like:"Like",MustLogInToLike:"Must log in to like",AllRightsReserved:"T\xfcm Haklar\u0131 Sakl\u0131d\u0131r.",MeterAbbreviation:"m",Version:"S\xfcr\xfcm",VersionInitial:"S",Options:"Se\xe7enekler",Maximum:"Maximum",Minimum:"Minimum",MaximumNumber:"Maksimum Say\u0131",MinimumNumber:"Minimum Say\u0131",MaximumValue:"Maksimum De\u011fer",MinimumValue:"Minimum De\u011fer",Or:"Veya",None:"Hi\xe7biri",High:"Y\xfcksek",Partial:"K\u0131smi",Teacher:"\xd6\u011fretmen",Class:"S\u0131n\u0131f",Total:"Toplam",Leaderboard:"Leaderboard",Latest:"Latest",Range:"Aral\u0131k",SIUnit:"SI Unit",USUnit:"US Unit",ThermalTransmittance:"Thermal Transmittance",ThermalResistance:"Thermal Resistance",UValue:"U-Value",RValue:"R-Value",VolumetricHeatCapacity:"Volumetric Heat Capacity",BuildingHVACSystem:"Building HVAC System",ThermostatSetpoint:"Thermostat Setpoint",TemperatureToleranceThreshold:"Tolerance Threshold",TemperatureToleranceThresholdExplanation:"Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.",Press:"T\u0131kla",Open:"A\xe7",Save:"Kaydet",SaveAsImage:"Resim Olarak Kaydet",SaveAsCsv:"Save as CSV",Update:"G\xfcncelle",Paste:"Yap\u0131\u015ft\u0131r",Copy:"Kopyala",Cut:"Kes",Delete:"Sil",Lock:"Kilitle",Translucent:"Yar\u0131 Saydam",Color:"Renk",Texture:"Doku",Size:"Boyut",Thickness:"Kal\u0131nl\u0131k",Yes:"Evet",No:"Hay\u0131r",OK:"Tamam",Cancel:"\u0130ptal",Apply:"Uygula",Close:"Kapat",ApplyTo:"Uygula",Run:"\xc7al\u0131\u015ft\u0131r",Pause:"Duraklat",Resume:"S\xfcrd\xfcr",Clear:"Temizle",Warning:"Uyar\u0131",Caution:"Caution",Reminder:"Hat\u0131rlat\u0131c\u0131",Length:"Uzunluk",Width:"Geni\u015flik",Height:"Y\xfckseklik",Radius:"Yar\u0131\xe7ap",Angle:"A\xe7\u0131",Azimuth:"Azimut",Coordinates:"Koordinatlar",Weather:"Hava Durumu",Show:"G\xf6ster",Animate:"Oynat",Date:"Tarih",Time:"Saat",Title:"Ba\u015fl\u0131k",Owner:"Sahibi",Action:"Eylem",Rename:"Yeniden Adland\u0131r",Location:"Konum",Latitude:"Enlem",Month:"Ay",Day:"G\xfcn",Hour:"Saat",Daylight:"G\xfcn I\u015f\u0131\u011f\u0131",Radiation:"I\u015f\u0131n\u0131m",Temperature:"S\u0131cakl\u0131k",kWh:"kWh",dollar:"dollar",MeterPerSecond:"m/s",NorthInitial:"N",SouthInitial:"S",EastInitial:"E",WestInitial:"W",Fixed:"Sabit",Elements:"\xd6\u011feler",Energy:"Energy",Unknown:"Unknown",Label:"Label",Description:"Description",NoDescription:"No description",MaximumCharacters:"Maximum characters",Author:"Author",Publisher:"Publisher",Building:"Building",ResidentialBuilding:"Residential Building",CommercialBuilding:"Commercial Building",SchoolBuilding:"School Building",TouristAttraction:"Tourist Attraction",UnderConstruction:"Under Construction",Photovoltaic:"Photovoltaic",Anonymous:"Anonymous",Nickname:"Nickname",Pin:"Pin",Unpin:"Unpin"},shared:{NoTexture:"Doku Yok",FoundationElement:"Temel",CuboidElement:"K\xfcbik",PolygonElement:"Poligon",SensorElement:"Sens\xf6r",SolarPanelElement:"G\xfcne\u015f Paneli",WaterHeaterElement:"Su Is\u0131t\u0131c\u0131",ParabolicDishElement:"Parabolik \xc7anak",ParabolicTroughElement:"Parabolik Oluk",FresnelReflectorElement:"Fresnel Reflekt\xf6r",HeliostatElement:"Heliostat",WindTurbineElement:"Wind Turbine",LightElement:"Light",ElementLocked:"Kilitli",ModelType:"Model Type",OutputBreakdown:"Breakdown",MoreResults:"More Results"},message:{ModelNotFound:"Model not found",CannotSignIn:"Oturum a\xe7\u0131lam\u0131yor",CannotSignOut:"\xc7\u0131k\u0131\u015f yap\u0131lam\u0131yor",YourAccountWasCreated:"Hesab\u0131n\u0131z olu\u015fturuldu",CannotCreateAccount:"Hesap olu\u015fturulam\u0131yor",YourAccountSettingsWereSaved:"Hesap ayarlar\u0131n\u0131z kaydedildi.",CannotSaveYourAccountSettings:"Hesap ayarlar\u0131n\u0131z kaydedilemiyor",CannotSaveYourFileToCloud:"Dosyan\u0131z buluta kaydedilemiyor",CannotCreateNewProject:"Cannot create a new project",CannotCreateNewProjectWithoutTitle:"Cannot create a new project without a title",CannotOpenYourProjects:"Cannot open your projects",CannotOpenProject:"Cannot open the project",CannotDeleteProject:"Cannot delete the project",CannotRenameProject:"Cannot rename the project",CannotAddDesignToProject:"Cannot add this design to the project",CannotAddDesignToProjectOwnedByOthers:"Cannot add this design to a project owned by others",DesignRemovedFromProject:"The design was successfully removed from the project",CannotRemoveDesignFromProject:"Cannot remove this design from the project",CannotUpdateProject:"Cannot update the project",CannotFetchProjectData:"Cannot fetch project data",TitleUsedChooseDifferentOne:"This title has been used. Choose a different one",CloudFileWithTitleExistsDoYouWantToOverwrite:"A cloud file with the title exists. Do you want to overwrite it?",CloudFileNotFound:"Bulut dosyas\u0131 bulunamad\u0131",CannotLoadModelsOnMap:"Cannot load models on map",CannotLoadLeaderboard:"Cannot load leaderboard",CannotPublishModelOnMap:"Cannot publish model on map",CannotLikeModelFromMap:"Cannot like model from map",CannotDeleteModelFromMap:"Cannot delete model from map",ModelDeletedFromMap:"Model is deleted from map",DoYouWantToDeleteModelFromMap:"Do you want to delete the model from map?",CannotOpenCloudFile:"Bulut dosyas\u0131 a\xe7\u0131lam\u0131yor",CannotReadCloudFile:"Cannot read the cloud file",CannotWriteCloudFile:"Cannot write the cloud file",CloudFileCopied:"Cloud file copied",CannotOpenCloudFolder:"Bulut klas\xf6r\xfcn\xfcz a\xe7\u0131lam\u0131yor",CannotDeleteCloudFile:"Bulut dosyas\u0131 silinemiyor",CannotRenameCloudFile:"Bulut dosyas\u0131 yeniden adland\u0131r\u0131lam\u0131yor",DoYouWantToSaveChanges:"De\u011fi\u015fiklikleri kaydetmek istiyor musunuz?",NotApplicableToSelectedAction:"Se\xe7ili eyleme uygulanamaz",ThisElementIsLocked:"Bu \xf6\u011fe kilitli.",ThisCannotBeUndone:"Geri al\u0131namaz.",AzimuthOfNorthIsZero:"Kuzey y\xf6n\xfcn\xfcn azimut a\xe7\u0131s\u0131 0 \xc2\xb0 derecedir.",CounterclockwiseAzimuthIsPositive:"Saat y\xf6n\xfcn\xfcn tersi y\xf6nde azimut a\xe7\u0131s\u0131 pozitiftir.",MoveCancelledBecauseOfOverlap:"\xc7ak\u0131\u015fma nedeniyle ta\u015f\u0131ma iptal edildi.",MoveOutsideBoundaryCancelled:"Alan d\u0131\u015f\u0131na \xe7\u0131kan ta\u015f\u0131ma iptal edildi.",RotationCancelledBecauseOfOverlap:"\xc7ak\u0131\u015fma nedeniyle d\xf6nd\xfcrme iptal edildi.",RotationOutsideBoundaryCancelled:"Alan d\u0131\u015f\u0131 d\xf6nd\xfcrme iptal edildi.",ResizingCancelledBecauseOfOverlap:"\xc7ak\u0131\u015fma nedeniyle yeniden boyutland\u0131rma iptal edildi.",ResizingOutsideBoundaryCancelled:"Alan d\u0131\u015f\u0131nda yeniden boyutland\u0131rma iptal edildi.",CannotPasteOutsideBoundary:"Alan\u0131n d\u0131\u015f\u0131na yap\u0131\u015ft\u0131r\u0131lamaz.",CannotPasteBecauseOfOverlap:"\xc7ak\u0131\u015fma nedeniyle yap\u0131\u015ft\u0131r\u0131lam\u0131yor.",CannotMoveObjectTooFar:"Nesne buraya ta\u015f\u0131namaz.",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"Yeni yerle\u015fim d\xfczeni uygulanmadan \xf6nce mevcut g\xfcne\u015f panelleri kald\u0131r\u0131lacakt\u0131r.",DoYouWantToContinue:"Devam etmek istiyor musunuz?",SolarPanelsCannotIntersectWithGround:"G\xfcne\u015f panelleri zeminle kesi\u015femez.",SolarPanelsCannotOverlapWithOneAnother:"G\xfcne\u015f panelleri birbiriyle \xf6rt\xfc\u015femez.",ScreenshotSaved:"Ekran g\xf6r\xfcnt\xfcs\xfc kaydedildi.",CsvFileSaved:"A CSV file was saved.",SimulationStarted:"Sim\xfclasyon ba\u015flad\u0131.",SimulationCompleted:"Sim\xfclasyon tamamland\u0131.",SimulationAborted:"Sim\xfclasyon iptal edildi.",SimulationPaused:"Sim\xfclasyon duraklat\u0131ld\u0131.",CancelSimulation:"Sim\xfclasyonu iptal et",PauseSimulation:"Sim\xfclasyonu duraklat",ResumeSimulation:"Sim\xfclasyonu devam ettir",SimulationWillNotStartDueToErrors:"Simulation will not start due to errors",SimulationWillStartDespiteWarnings:"Simulation will start despite warnings.",EvolutionStarted:"Evrim ba\u015flad\u0131.",EvolutionCompleted:"Evrim tamamland\u0131.",EvolutionAborted:"Evrim iptal edildi.",EvolutionPaused:"Evrim duraklat\u0131ld\u0131.",EncounterEvolutionError:"Evrim hatas\u0131yla kar\u015f\u0131la\u015f\u0131ld\u0131.",CancelEvolution:"Evrimi iptal et",PauseEvolution:"Evrimi duraklat",ResumeEvolution:"Evrime devam et",ConvergenceThresholdHasBeenReached:"Yak\u0131nsama e\u015fi\u011fine ula\u015f\u0131ld\u0131.",MaximumNumberOfGenerationsHasBeenReached:"Maksimum nesil say\u0131s\u0131na ula\u015f\u0131ld\u0131.",MaximumNumberOfStepsHasBeenReached:"Maksimum ad\u0131m say\u0131s\u0131na ula\u015f\u0131ld\u0131.",ObjectiveFunctionTypeError:"Ge\xe7erli i\u015flev desteklenmiyor. L\xfctfen men\xfcden ba\u015flat\u0131n\u0131z.",WallsAreNotAtSameHeight:"Walls are not at same height.",WallsAreNotPerpendicular:"Walls are not perpendicular.",WallsAreNotConnected:"Walls are not connected.",WallsNumberNeedToBeFour:"The number of walls needs to be four.",BuildingContainsEmptyWall:"Building contains one or more empty wall.",BuildingRoofMissing:"Building has a missing roof.",UnknownErrors:"Unknown errors."},menu:{AnalysisOptions:"Analiz Se\xe7enekleri",option:{GridCellSize:"H\xfccre Boyutu",SamplingFrequency:"\xd6rneklem Frekans\u0131",TimesPerHour:"x 1/saat",DaysPerYear:"G\xfcn Say\u0131s\u0131 / Y\u0131l"},mainMenu:"Ana Men\xfc",cloudMenu:"Bulut Men\xfcs\xfc",projectSubMenu:"Project",project:{CreateNewProject:"Create New Project",OpenProject:"Open Project",SaveProjectAs:"Save Project As",YouMustLogInToCreateProject:"You must log in to create a new project",YouMustLogInToOpenProject:"You must log in to open a project"},fileSubMenu:"Dosya",file:{CreateNewFile:"Yeni Dosya Olu\u015ftur",OpenLocalFile:"Yerel Dosya A\xe7",SaveAsLocalFile:"Yerel Dosya Olarak Kaydet",SavingAbortedMustHaveValidFileName:"Kaydetme iptal edildi! Ge\xe7erli bir dosya ad\u0131 kullan\u0131n\u0131z.",OpenCloudFile:"Bulut Dosyas\u0131 A\xe7",SaveCloudFile:"Bulut Dosyas\u0131n\u0131 Kaydet",SaveAsCloudFile:"Bulut Dosyas\u0131 Olarak Kaydet",SavingAbortedMustHaveValidTitle:"Kaydetme iptal edildi! Dosya ad\u0131 ge\xe7ersiz!",ToSaveYourWorkPleaseSignIn:"\xc7al\u0131\u015fman\u0131z\u0131 kaydetmek i\xe7in l\xfctfen oturum a\xe7\u0131n\u0131z.",TakeScreenshot:"Ekran g\xf6r\xfcnt\xfcs\xfc al",UseCloudFileName:"Bulut Dosya Ad\u0131n\u0131 Kullan",PublishOnModelsMap:"Publish on Models Map",PublishedOnModelsMap:"Your model has been published on the Models Map",UpdatedOnModelsMap:"Your model has been updated on the Models Map",YouMustLogInToPublishYourModel:"You must log in to publish your model",YouCannotPublishAModelThatYouDoNotOwn:"You cannot publish a model that you do not own",YouMustSaveModelOnCloudBeforePublishingIt:"You must save the model on the cloud before publishing it"},editSubMenu:"D\xfczen",edit:{Undo:"Geri Al",Redo:"Yinele"},viewSubMenu:"G\xf6r\xfcn\xfcm",view:{NavigationView:"Navigation View",TwoDimensionalView:"2D",ResetView:"Yenile",ZoomIn:"Yakla\u015f",ZoomOut:"Uzakla\u015f",AutoRotate:"Otomatik D\xf6nd\xfcr",ShowShadow:"G\xf6lge",ShowSurfaceShininess:"Show Surface Shininess",TranslucentFloatingWindows:"Y\xfczer Pencere",accessoriesSubMenu:"Accessories",accessories:{SiteInformation:"Konum Bilgisi",DesignInformation:"Izgara H\xfccre Say\u0131s\u0131",Instruction:"Yard\u0131m",StickyNote:"Notlar",Note:"Notlar"}},settingsSubMenu:"Settings",settings:{WeatherData:"Hava Durumu",DiurnalTemperature:"G\xfcnl\xfck S\u0131cakl\u0131k",Heliodon:"Heliodon",SunAndTime:"G\xfcne\u015f & Zaman"},benchmarksSubMenu:"Deneysel",benchmarks:{SolarRadiationPredictionVsMeasurement:"G\xfcne\u015f I\u015f\u0131n\u0131m Tahmini Vs. \xd6l\xe7\xfcm\xfc ",BESTESTCase600:"Building Energy Simulation Test: BESTEST Case 600",BESTESTCase610:"Building Energy Simulation Test: BESTEST Case 610",BESTESTCase620:"Building Energy Simulation Test: BESTEST Case 620",BESTESTCase630:"Building Energy Simulation Test: BESTEST Case 630"},graph:{LineWidth:"\xc7izgi Kal\u0131nl\u0131\u011f\u0131",SymbolSize:"Sembol Boyutu",BarCategoryGap:"Bar Category Gap",ShowHorizontalGridLines:"Yatay Izgara \xc7izgilerini G\xf6ster",ShowVerticalGridLines:"Dikey Izgara \xc7izgilerini G\xf6ster"},analysisSubMenu:"Analiz",physicsSubMenu:"Fizik",physics:{DailySolarRadiationHeatmap:"G\xfcnl\xfck Is\u0131 Haritas\u0131",SolarRadiationHeatmapOptions:"Is\u0131 Haritas\u0131 Se\xe7enekleri",SolarRadiationHeatmapGridCellSize:"H\xfccre Boyutu",SolarRadiationHeatmapMaxValue:"I\u015f\u0131n\u0131m Maksimum De\u011fer",SolarRadiationHeatmapNoAnimation:"Animasyon Yok",ReflectionHeatmap:"Yans\u0131ma Is\u0131 Haritas\u0131"},sensorSubMenu:"Sens\xf6rler",sensor:{CollectDailyData:"G\xfcnl\xfck Veri Topla",CollectYearlyData:"Y\u0131ll\u0131k Veri Topla",SensorSimulationNoAnimation:"Animasyon Yok"},buildingSubMenu:"Building",building:{AnalyzeDailyBuildingEnergy:"Analyze Daily Building Energy",AnalyzeYearlyBuildingEnergy:"Analyze Yearly Building Energy",EnergyAnalysisOptions:"Energy Analysis Options",EnergyGridCellSize:"Energy Grid Cell Size",BuildingEnergySimulationNoAnimation:"No Animation for Building Energy Simulation"},solarPanelSubMenu:"G\xfcne\u015f Panelleri",solarPanel:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi",AnalyzeVisibility:"G\xf6r\xfcn\xfcm Analizi",PanelDiscretization:"Panel Ayr\u0131kla\u015ft\u0131rma",Exact:"Kesin",Approximate:"\tYakla\u015f\u0131k",EnergyGridCellSize:"H\xfccre Boyutu",VisibilityGridCellSize:"H\xfccre Boyutu",EnergyAnalysisOptions:"Enerji Analiz Se\xe7enekleri",VisibilityAnalysisOptions:"G\xf6r\xfcn\xfcm Analiz Se\xe7enekleri",SolarPanelSimulationNoAnimation:"Animasyon Yok"},parabolicTroughSubMenu:"Parabolik Oluk",parabolicTrough:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi"},parabolicDishSubMenu:"Parabolik \xc7anak",parabolicDish:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi"},fresnelReflectorSubMenu:"Fresnel Yans\u0131t\u0131c\u0131",fresnelReflector:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi"},heliostatSubMenu:"Heliostat",heliostat:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi"},solarUpdraftTowerSubMenu:"Solar Updraft Kulesi",solarUpdraftTower:{AnalyzeDailyYield:"G\xfcnl\xfck \xdcretim Analizi",AnalyzeYearlyYield:"Y\u0131ll\u0131k \xdcretim Analizi",SolarUpdraftTowerSimulationNoAnimation:"Animasyon Yok"},tutorialsSubMenu:"\xd6\u011frenme Merkezi",solarEnergyScienceSubMenu:"G\xfcne\u015f Bilimi",solarEnergyScienceTutorials:{SunAngles:"G\xf6zlemciye G\xf6re G\xfcne\u015f A\xe7\u0131lar\u0131",InsolationAndClimate:"G\xfcne\u015flenme ve \u0130klim",SolarRadiationToBox:"Kutu G\xfcne\u015f I\u015f\u0131n\u0131m\u0131"},buildingScienceSubMenu:"Building Science",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"Thermal Envelope vs. Building Envelope",EffectOfSizeOnBuildingEnergy:"Effect of Size on Building Energy",EffectOfOrientationOnBuildingEnergy:"Effect of Orientation on Building Energy",EffectOfInsulationOnBuildingEnergy:"Effect of Insulation on Building Energy",EffectOfRoofColorOnBuildingEnergy:"Effect of Roof Color on Building Energy",EffectOfEavesOverhangLengthOnBuildingEnergy:"Effect of Eaves Overhang Length on Building Energy",EffectOfWindowSHGCOnBuildingEnergy:"Effect of Window Solar Heat Gain on Building Energy",EffectOfThermostatSetpointOnBuildingEnergy:"Effect of Thermostat Setpoint on Building Energy",EffectOfSolarPanelsOnBuildingEnergy:"Effect of Solar Panels on Building Energy",EffectOfGroundTemperatureOnBuildingEnergy:"Effect of Ground Temperature on Building Energy",EffectOfTreesOnBuildingEnergy:"Effect of Trees on Building Energy"},buildingDesignSubMenu:"Bina Tasar\u0131m\u0131",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:"\xc7at\u0131 Pencereli Cape Cod Evi",MansardRoofWithDormers:"Mansard Roof with Dormers",GableRoofVsHipRoof:"Be\u015fik \xc7at\u0131 vs. K\u0131rma \xc7at\u0131",ColonialVsSaltbox:"Koloni vs. Tuz Kutusu",GambrelRoofVsMansardRoof:"Flemenk \xc7at\u0131 vs. Mansart \xc7at\u0131",CombinationRoofVsBonnetRoof:"Combination Roof vs. Bonnet Roof",DutchGableRoof:"Dutch Gable Roof",GableAndValleyRoof:"Gable and Valley Roof",ClerestoryRoof:"Clerestory Roof",MonitorRoof:"Monitor Roof",AFrameHouse:"A-Frame House",HalfTimberedHouse:"Half-Timbered House",AllBasicRoofTypes:"T\xfcm \xc7at\u0131 Tipleri"},photovoltaicSolarPowerSubMenu:"Fotovoltaik G\xfcne\u015f Enerjisi",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"G\xfcne\u015f Paneli E\u011fim A\xe7\u0131s\u0131 Etkisi",EffectOfAzimuthOfSolarPanel:"G\xfcne\u015f Paneli Azimut A\xe7\u0131s\u0131 Etkisi",SolarPanelTypes:"Solar Panel Types",VerticalBifacialSolarPanels:"Vertical Bifacial Solar Panels",CompareMonofacialAndBifacialSolarPanels:"Monofacial vs. Bifacial Solar Panels",SolarTrackers:"G\xfcne\u015f \u0130zleyiciler",CoveringGroundWithSolarPanels:"Sadece g\xfcne\u015f panellerini kullanarak y\xfczeyi kaplamak neden iyi bir fikir de\u011fildir?",InterRowSpacingOfSolarPanelArray:"G\xfcne\u015f Paneli Dizi Aras\u0131 Bo\u015fluk Etkisi",EffectOfOrientationOfSolarPanels:"G\xfcne\u015f Panelleri Y\xf6n Etkisi",SolarPanelArrayAutomaticLayout:"Solar Panel Array Automatic Layout"},concentratedSolarPowerSubMenu:"Yo\u011funla\u015ft\u0131r\u0131lm\u0131\u015f G\xfcne\u015f Enerjisi",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"Parabolik Oluk Azimut A\xe7\u0131s\u0131 Etkisi",EffectOfLatusRectumOfParabolicTrough:"Parabolik Oluk \xd6zkiri\u015f Etkisi",FocusSunlightWithParabolicDish:"G\xfcne\u015f I\u015f\u0131\u011f\u0131n\u0131 Parabolik \xc7anakla Odaklama",LinearFresnelReflectors:"Do\u011frusal Fresnel Reflekt\xf6rler",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"Do\u011frusal Fresnel Reflekt\xf6rlerde So\u011furucu Boru Y\xfckseklik Etkisi",EffectOfAzimuthOfLinearFresnelReflectors:"Do\u011frusal Fresnel Reflekt\xf6rlerde Azimut A\xe7\u0131s\u0131 Etkisi",LinearFresnelReflectorsWithTwoAbsorbers:"\u0130ki So\u011furuculu Do\u011frusal Fresnel Reflekt\xf6rler",CosineEfficiencyOfHeliostats:"Heliostatlar\u0131n Kosin\xfcs Verimlili\u011fi",ShadowingAndBlockingOfHeliostats:"Heliostatlarda G\xf6lgeleme ve Engellenme",EffectSolarPowerTowerHeight:"G\xfcne\u015f G\xfc\xe7 Kulesi Y\xfckseklik Etkisi",SolarPowerTower:"G\xfcne\u015f G\xfc\xe7 Kulesi"},otherTypesOfSolarPowerSubMenu:"Di\u011fer G\xfcne\u015f G\xfcc\xfc T\xfcrleri",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"Solar Updraft Kulesi"},generativeDesignSubMenu:"Generative Design",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Monofacial Solar Panel Array",BifacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Bifacial Solar Panel Array",OutputOfSolarPanelArrayInDifferentPlaces:"The Output of a Solar Panel Array in Different Places",SimpleSolarFarmParetoFront:"The Pareto Front for Designing a Simple Solar Farm"},examplesSubMenu:"\xd6rnekler",solarEnergySubMenu:"G\xfcne\u015f Enerjisi",solarEnergyExamples:{SunBeamAndHeliodon:"G\xfcne\u015f I\u015f\u0131n\u0131 ve Heliodon",RooftopSolarPanels:"\xc7at\u0131 \xdcst\xfc G\xfcne\u015f Panelleri",NevadaSolarOneParabolicTroughArray:"Nevada Eyaletinde Parabolik Oluk Dizisi",TooeleParabolicDishArray:"Tooele \u015eehrinde Parabolik \xc7anak Dizisi",PS10SolarPowerTower:"PS10 G\xfcne\u015f G\xfc\xe7 Kulesi",TucsonLinearFresnelReflectors:"Tucson \u015eehrinde Do\u011frusal Fresnel Reflekt\xf6rleri",SolarCanopyFormFactors:"Solar G\xf6lgelik Bi\xe7im Etkileri",SolarCanopyOverBleachers:"Tir\xfcb\xfcn \xdczeri Solar G\xf6lgelik",SolarCanopyOverGarage:"Solar Canopy Over Garage",SolarBusStop:"Solar Otob\xfcs Dura\u011f\u0131",SolarFacadeTesla:"Tesla Solar Fa\xe7ade",BuildingIntegratedPhotovoltaics:"Building-Integrated Photovoltaics",Floatovoltaics:"Floatovoltaics",Agrivoltaics:"Agrivoltaics",VegetativeBuffer:"Bitkisel Tampon",RainbowSwashSolarFarmBostonMA:"Rainbow Swash Solar Farm in Boston, MA",MickeyMouseSolarFarmOrlandoFL:"Mickey Mouse Solar Farm in Orlando, FL",SolarPanelsOverCanalBakersfieldCA:"Bakersfield \u015eehrinde Kanal \xdczerindeki Varsay\u0131msal G\xfcne\u015f Panelleri",SolarNoiseBarrierLexingtonMA:"Lexington Kasabas\u0131nda Varsay\u0131msal G\xfcne\u015f G\xfcr\xfclt\xfc Bariyeri",HSATSolarTrackersRaleighNC:"Raleigh \u015eehrinde Yatay Tek Eksenli \u0130zleyiciler (HSAT)",AADATSolarTrackersLancasterCA:"Lancaster \u015eehrinde Azimut\u2013\u0130rtifa \xc7ift Eksenli \u0130zleyiciler (AADAT)",SolarUpdraftTowerInCity:"\u015eehir Solar Updraft Kulesi"},builtEnvironmentSubMenu:"Yap\u0131l\u0131 \xc7evre",residentialBuildingsSubMenu:"Konut in\u015faatlar\u0131",residentialBuildingExamples:{ColonialHouse:"Colonial House",DutchColonialHouse:"Flemenk Koloni Evi",TShapedHouse:"T-Shaped House",CapeCodHouseWithGarage:"Cape Cod House with Garage",Solarium:"Solaryum",Church1:"Kilise 1",Cathedral1:"Cathedral 1",Cathedral2:"Cathedral 2",Mosque1:"Mosque 1",AdobeTaosHouse:"Adobe Taos House",RanchHouse:"Ranch House",BonnetHouse:"Bonnet House",BarnStyleHouse:"\xc7iftlik Evi",ModernHouse:"Modern House",ButterflyRoofHouse:"Butterfly Roof House"},commercialBuildingsSubMenu:"Ticari Binalar",commercialBuildingExamples:{WhiteHouse:"White House",BilimMersinTurkiye:"Yeni\u015fehir Belediyesi Bilim ve Sanat Merkezi",SpanishStyleHotel:"Spanish Style Hotel",ApartmentBuilding:"Apartment Building",OfficeBuilding:"Ofis Binas\u0131",Hotel:"Hotel"},buildingComplexesSubMenu:"Building Complexes",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"G\xfcney Burlington Lisesi",MescaleroApacheSchoolNewMexico:"Mescalero Apache School, NM"},urbanPlanningSubMenu:"\u015eehir Planlamas\u0131",urbanPlanningExamples:{Heatmap1:"Is\u0131 Haritas\u0131"},otherBuildingsSubMenu:"Other Buildings",otherBuildingExamples:{Greenhouse:"Sera",Pavilion:"Park Kamelyas\u0131",OctagonalPagoda:"Octagonal Pagoda",OceanFront:"Ocean Front",EgyptianPyramids:"Egyptian Pyramids",MayanPyramid:"Mayan Pyramid",SiOSePol:"Si-o-se-pol",StackedCuboids:"Stacked Cuboids"},artificialIntelligenceSubMenu:"Yapay Zeka",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"G\xfcne\u015f Paneli S\u0131ra E\u011fim A\xe7\u0131s\u0131 Optimize Etme",OptimizingTiltAnglesOfMultipleSolarPanelRows:"\xc7oklu G\xfcne\u015f Paneli S\u0131ra E\u011fim A\xe7\u0131s\u0131 Optimize Etme",SolarFarmGenerativeDesign:"G\xfcne\u015f Tarlas\u0131 Tasar\u0131m\u0131",SolarFarmGenerativeDesignWithBlock:"Blok Varl\u0131\u011f\u0131nda G\xfcne\u015f Tarlas\u0131 Tasar\u0131m\u0131",FitchburgSolarFarmGenerativeDesign:"Fitchburg G\xfcne\u015f Tarlas\u0131 Tasar\u0131m\u0131"},languageSubMenu:"Dil",publicSubMenu:"Public",ModelsGallery:"Models Gallery",ModelsMap:"Models Map",AboutUs:"Hakk\u0131m\u0131zda"},avatarMenu:{AccountSettings:"Hesap Ayarlar\u0131",PrivacyStatementTitle:"User Privacy Protection Statement",PrivacyStatement:"Oturum a\xe7t\u0131\u011f\u0131n\u0131zda, Aladdin hesab\u0131n\u0131z\u0131 olu\u015fturmak ve hesab\u0131n\u0131za eri\u015fmek i\xe7in Google Kimli\u011finiz kullan\u0131l\u0131r. Veritaban\u0131m\u0131zda referans olarak yaln\u0131zca rastgele bir alfasay\u0131sal dize depolan\u0131r. Ad\u0131n\u0131z veya e-posta adresiniz gibi ki\u015fisel olarak tan\u0131mlanabilir hi\xe7bir veri toplanmaz. Daha fazla bilgi i\xe7in ",SignIn:"Kay\u0131t Ol",SignOut:"Oturum Kapat",IfYouAreAStudent:"E\u011fer \xd6\u011frenciyseniz"},skyMenu:{Axes:"Eksenler",Theme:"Tema",ThemeDefault:"Varsay\u0131lan",ThemeDesert:"\xc7\xf6l",ThemeDune:"Dune",ThemeForest:"Orman",ThemeGrassland:"\xc7ay\u0131r",ThemeHill:"Hill",ThemeLake:"Lake",ThemeMountain:"Mountain",ThemeRural:"Rural",SunlightAttenuationCoefficientInAir:"Havan G\xfcne\u015f I\u015f\u0131\u011f\u0131 Zay\u0131flatma Katsay\u0131s\u0131",ConvectiveCoefficientOfAir:"Havan Is\u0131 \u0130letkenlik Katsay\u0131s\u0131",HighestTemperatureTimeInMinutes:"En Y\xfcksek S\u0131cakl\u0131k S\xfcresi (Dakika)",SelectSunAnglesToShow:"G\xf6sterilecek G\xfcne\u015f A\xe7\u0131lar\u0131n\u0131 Se\xe7in",ShowAzimuthAngle:"Azimut A\xe7\u0131s\u0131n\u0131 G\xf6ster",ShowElevationAngle:"Y\xfckselme A\xe7\u0131s\u0131n\u0131 G\xf6ster",ShowZenithAngle:"Zenit A\xe7\u0131s\u0131n\u0131 G\xf6ster",DirectLightBrightnessAtNoon:"Direct Light Brightness at Noon",AmbientLightBrightnessAtNoon:"Ambient Light Brightness at Noon"},groundMenu:{MonthlyIrradianceLoss:"Monthly Irradiance Loss",Vegetation:"Vegetation",LeafOutDay:"Leaf-Out Day",LeafOffDay:"Leaf-Off Day",Albedo:"Albedo",ImageOnGround:"Yer G\xf6r\xfcnt\xfcs\xfc",WaterSurface:"Water Surface",RemoveAllUnlockedTrees:"T\xfcm A\u011fa\xe7lar\u0131 Kald\u0131r",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedPeople:"T\xfcm Ki\u015fileri Kald\u0131r",RemoveAllUnlockedFoundations:"T\xfcm Temelleri Kald\u0131r",RemoveAllUnlockedCuboids:"T\xfcm K\xfcbikleri Kald\u0131r",DoYouReallyWantToRemoveAllPeople:"T\xfcm Ki\u015fileri Kald\u0131rmak \u0130stiyor Musunuz?",DoYouReallyWantToRemoveAllTrees:"T\xfcm A\u011fa\xe7lar\u0131 Kald\u0131rmak \u0130stiyor Musunuz?",DoYouReallyWantToRemoveAllFlowers:"Do you really want to remove all the flowers that are not locked",DoYouReallyWantToRemoveAllSolarPanels:"Do you really want to remove all the solar panels that are not locked",DoYouReallyWantToRemoveAllFoundations:"T\xfcm Temelleri Kald\u0131rmak \u0130stiyor Musunuz?",DoYouReallyWantToRemoveAllCuboids:"T\xfcm K\xfcbikleri Kald\u0131rmak \u0130stiyor Musunuz?",LockAllElements:"T\xfcm \xd6\u011feleri Kilitle",UnlockAllElements:"T\xfcm \xd6\u011felerin Kilidini A\xe7"},labelSubMenu:{Label:"Etiket",LabelText:"Label Text",LabelHeight:"Label Height",LabelSize:"Label Size",LabelFontSize:"Font Size",LabelColor:"Label Color",KeepShowingLabel:"Etiketi G\xf6stermeye Devam Et"},foundationMenu:{RemoveAllUnlockedSolarPanels:"T\xfcm Kilitlenmemi\u015f G\xfcne\u015f Panellerini Kald\u0131r",RemoveAllUnlockedParabolicTroughs:"T\xfcm Kilitlenmemi\u015f Parabolik Oluklar\u0131 Kald\u0131r",RemoveAllUnlockedParabolicDishes:"T\xfcm Kilitlenmemi\u015f Parabolik \xc7anaklar\u0131 Kald\u0131r",RemoveAllUnlockedFresnelReflectors:"T\xfcm Kilitlenmemi\u015f Fresnel Reflekt\xf6rleri Kald\u0131r",RemoveAllUnlockedHeliostats:"T\xfcm Kilitlenmemi\u015f Heliostatlar\u0131 Kald\u0131r",RemoveAllUnlockedSensors:"T\xfcm Kilitlenmemi\u015f Sens\xf6rleri Kald\u0131r",RemoveAllUnlockedLights:"Remove All Unlocked Lights",RemoveAllUnlockedWalls:"T\xfcm Kilitlenmemi\u015f Duvarlar\u0131 Kald\u0131r",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",RemoveAllUnlockedDoors:"Remove All Unlocked Doors",RemoveAllUnlockedPolygons:"T\xfcm Kilitlenmemi\u015f \xc7okgenleri Kald\u0131r",RemoveAllUnlockedHumans:"T\xfcm Kilitlenmemi\u015f \u0130nsanlar\u0131 Kald\u0131r",RemoveAllUnlockedTrees:"T\xfcm Kilitlenmemi\u015f A\u011fa\xe7lar\u0131 Kald\u0131r",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"\xc7er\xe7eveler",Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",SolarPanels:"G\xfcne\u015f Panelleri",SolarPanelArray:"Solar Panel Array",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:" Se\xe7ili temel \xfczerindeki t\xfcm g\xfcne\u015f panellerini kald\u0131rmak istiyor musunuz?",ParabolicTroughs:"Parabolik Oluklar",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm parabolik oluklar\u0131 kald\u0131rmak istiyor musunuz?",ParabolicDishes:"Parabolik \xc7anaklar",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm parabolik \xe7anaklar\u0131 kald\u0131rmak istiyor musunuz?",FresnelReflectors:"Fresnel Reflekt\xf6rler",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm Fresnel reflekt\xf6rlerini kald\u0131rmak istiyor musunuz?",Heliostats:"Heliostatlar",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm heliostatlar\u0131 kald\u0131rmak istiyor musunuz?",Sensors:"Sens\xf6rler",DoYouReallyWantToRemoveAllSensorsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm sens\xf6rleri kald\u0131rmak istiyor musunuz?",Lights:"Lights",DoYouReallyWantToRemoveAllLightsOnFoundation:"Do you really want to remove all the lights on this foundation that are not locked",Walls:"Duvarlar",DoYouReallyWantToRemoveAllWallsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm duvarlar\u0131 kald\u0131rmak istiyor musunuz? ",Windows:"Windows",DoYouReallyWantToRemoveAllWindowsOnFoundation:"Do you really want to remove all the windows on this foundation that are not locked",Doors:"Doors",DoYouReallyWantToRemoveAllDoorsOnFoundation:"Do you really want to remove all the doors on this foundation that are not locked",Polygons:"Poligonlar",DoYouReallyWantToRemoveAllPolygonsOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm poligonlar\u0131 kald\u0131rmak istiyor musunuz?",Humans:"Ki\u015filer",DoYouReallyWantToRemoveAllHumansOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm insanlar\u0131 kald\u0131rmak istiyor musunuz?",Trees:"A\u011fa\xe7lar",DoYouReallyWantToRemoveAllTreesOnFoundation:" Se\xe7ili temel \xfczerinde kilitli olmayan t\xfcm a\u011fa\xe7lar\u0131 kald\u0131rmak istiyor musunuz?",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnFoundation:"Do you really want to remove all the flowers on this foundation that are not locked",OnlyThisFoundation:"Sadece Se\xe7ili Temel",AllConnectedFoundations:"T\xfcm Ba\u011flant\u0131l\u0131 Temeller",AllSelectedFoundations:"All Selected Foundations",AllFoundations:"T\xfcm Temeller",AddPolygon:"Poligon Ekle",SolarStructure:"Solar Yap\u0131 Se\xe7in",GroupMaster:"Grup Y\xf6neticisi",LockAllElementsOnThisFoundation:" Se\xe7ili temel \xfczerindeki t\xfcm \xf6\u011feleri kilitle",UnlockAllElementsOnThisFoundation:" Se\xe7ili temel \xfczerindeki t\xfcm \xf6\u011felerin kilidini a\xe7",GroundFloorRValue:"Ground Floor R-Value",OnlyThisGroundFloor:"Only This Ground Floor",AllGroundFloors:"All Ground Floors"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"Heliostat Al\u0131c\u0131 Kulesi",ReceiverTowerPhysicalProperties:"Al\u0131c\u0131 Kule Fiziksel \xd6zellikler",ReceiverTowerHeight:"Al\u0131c\u0131 Kule Y\xfckseklik",ReceiverTowerRadius:"Al\u0131c\u0131 Kule Yar\u0131\xe7ap",ReceiverAbsorptance:"Al\u0131c\u0131 Absorbsiyon",ReceiverOpticalEfficiency:"Al\u0131c\u0131 Optik Verim",ReceiverThermalEfficiency:"Al\u0131c\u0131 Termal Verim"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"Fresnel Reflekt\xf6r So\u011furucu Boru",AbsorberPipePhysicalProperties:"So\u011furucu Boru Fiziksel \xd6zellikler",AbsorberHeight:"So\u011furucu Boru Y\xfckseklik",AbsorberApertureWidth:"So\u011furucu boru diyafram geni\u015fli\u011fi",AbsorberPipePoleNumber:"So\u011furucu Boru Say\u0131s\u0131",AbsorberAbsorptance:"So\u011furucu Absorbsiyonu",AbsorberOpticalEfficiency:"So\u011furucu Optik Verimlilik",AbsorberThermalEfficiency:"So\u011furucu Is\u0131l Verimlilik"},solarUpdraftTowerMenu:{SolarUpdraftTower:"Solar Updraft Kulesi",SolarUpdraftTowerPhysicalProperties:"Solar Updraft Kulesi Fiziksel \xd6zellikler",SolarUpdraftTowerChimneyHeight:"Solar Updraft Kulesi Baca Y\xfcksekli\u011fi",SolarUpdraftTowerChimneyRadius:"Solar Updraft Kulesi Baca Yar\u0131\xe7ap\u0131",SolarUpdraftTowerCollectorHeight:"Solar Updraft Kulesi Collector Height",SolarUpdraftTowerCollectorRadius:"Solar Updraft Kulesi Kollekt\xf6r Yar\u0131\xe7ap\u0131",SolarUpdraftTowerCollectorTransmissivity:"Solar Updraft Kulesi Kollekt\xf6r Ge\xe7irgenli\u011fi",SolarUpdraftTowerCollectorEmissivity:"Solar Updraft Kulesi Kollekt\xf6r Emisivite",SolarUpdraftTowerDischargeCoefficient:"Solar Updraft Kulesi De\u015farj Katsay\u0131s\u0131",SolarUpdraftTowerTurbineEfficiency:"Solar Updraft Kulesi T\xfcrbin Verimlili\u011fi"},cuboidMenu:{Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",RemoveAllUnlockedSolarPanels:"T\xfcm Kilitlenmemi\u015f G\xfcne\u015f Panellerini Kald\u0131r",RemoveAllUnlockedSensors:"T\xfcm Kilitlenmemi\u015f Sens\xf6rleri Kald\u0131r",RemoveAllUnlockedPolygons:"T\xfcm Kilitlenmemi\u015f Poligonlar\u0131 Kald\u0131r",RemoveAllUnlockedHumans:"T\xfcm Kilitlenmemi\u015f Ki\u015fileri Kald\u0131r",RemoveAllUnlockedTrees:"T\xfcm Kilitlenmemi\u015f A\u011fa\xe7lar\u0131 Kald\u0131r",RemoveAllUnlockedFlowers:"Remove All Unlocked Flowers",Racks:"\xc7er\xe7eveler",SolarPanels:"G\xfcne\u015f Panelleri",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm g\xfcne\u015f panellerini kald\u0131rmak istiyor musunuz?",Sensors:"Sens\xf6rler",DoYouReallyWantToRemoveAllSensorsOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm sens\xf6rleri kald\u0131rmak istiyor musunuz?",Polygons:"Poligonlar",DoYouReallyWantToRemoveAllPolygonsOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm poligonlar\u0131 kald\u0131rmak istiyor musunuz?",Humans:"\u0130nsanlar",DoYouReallyWantToRemoveAllHumansOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm insanlar\u0131 kald\u0131rmak istiyor musunuz?",Trees:"A\u011fa\xe7lar",DoYouReallyWantToRemoveAllTreesOnCuboid:" Se\xe7ili k\xfcbik \xfczerinde kilitlenmemi\u015f t\xfcm a\u011fa\xe7lar\u0131 kald\u0131rmak istiyor musunuz?",Flowers:"Flowers",DoYouReallyWantToRemoveAllFlowersOnCuboid:"Do you really want to remove all the flowers on this cuboid that are not locked",OnlyThisCuboid:"Sadece Se\xe7ili K\xfcbik",AllCuboidsOnSameSurface:"All Cuboids on Same Surface",AllCuboidsAboveSameBase:"All Cuboids above Same Base",AllSelectedCuboids:"All Selected Cuboids",AllCuboids:"T\xfcm K\xfcbikler",OnlyThisSide:"Sadece Se\xe7ili Y\xfczey",AllSidesOfThisCuboid:"Se\xe7ili K\xfcbik T\xfcm Y\xfczeyler",AllSidesOfSelectedCuboids:"All Sides of Selected Cuboids",AllSidesOfAllCuboids:"B\xfct\xfcn K\xfcbik Y\xfczeyleri ",AddPolygon:"Poligon Ekle",Stackable:"Stackable",GroupMaster:"Group Master"},polygonMenu:{Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",TextBox:"Text Box",FontOutlineColor:"Font Outline Color",FontOutlineWidth:"Font Outline Width",FontStrokeColor:"Font Stroke Color",FontStrokeWidth:"Font Stroke Width",NoOutline:"No Outline",Shiny:"Shiny",Filled:"Dolgu",FillTexture:"Dolgu Dokusu",FillColor:"Dolgu Rengi",Opacity:"Opakl\u0131k",LineColor:"\xc7izgi Rengi",LineWidth:"\xc7izgi Kal\u0131nl\u0131\u011f\u0131",LineStyle:"\xc7izgi Stili",SolidLine:"D\xfcz \xe7izgi",DashedLine:"Kesik \xe7izgi",DottedLine:"Noktal\u0131 \xe7izgi",InsertVertexBeforeIndex:"\u0130ndeksten \xd6nce Tepe Noktas\u0131 Ekle",InsertVertexAfterIndex:"\u0130ndeksten Sonra Tepe Noktas\u0131 Ekle",DeleteVertex:"Tepe Noktas\u0131 Sil",OnlyThisPolygon:"Sadece Se\xe7ili Poligon",AllPolygonsOnSurface:"T\xfcm Poligonlar Ayn\u0131 Y\xfczeyde",AllPolygonsAboveFoundation:"Temel \xdczerindeki T\xfcm Poligonlar",AllSelectedPolygons:"All Selected Polygons",AllPolygons:"T\xfcm Poligonlar",Layout:"D\xfczen",SolarPanelArrayLayout:"G\xfcne\u015f Paneli Dizi D\xfczeni",SolarPanelArrayLayoutParametricDesign:"G\xfcne\u015f Paneli Dizi D\xfczeni: Parametrik Tasar\u0131m",SolarPanelArrayLayoutGenerativeDesign:"G\xfcne\u015f Paneli Dizi D\xfczeni: \xdcretici Tasar\u0131m",SolarPanelArrayModel:"G\xfcne\u015f Paneli Modeli",SolarPanelArrayOrientation:"Oryantasyon",SolarPanelArrayTiltAngle:"E\u011fim A\xe7\u0131s\u0131",SolarPanelArrayRowWidth:"Dizi S\u0131ra Geni\u015fli\u011fi",SolarPanelArrayInterRowSpacing:"Dizi S\u0131ra Aras\u0131 Bo\u015fluk",SolarPanelArrayRowSpacing:"Row Spacing",SolarPanelArrayRowAxis:"Dizi S\u0131ra Ekseni",SolarPanelArrayLeftRightRowAxis:"Left-Right (Relative)",SolarPanelArrayUpDownRowAxis:"Up-Down (Relative)",SolarPanelArrayEastWestRowAxis:"Do\u011fu-Bat\u0131 (Absolute)",SolarPanelArrayNorthSouthRowAxis:"Kuzey-G\xfcney (Absolute)",SolarPanelArrayMargin:"Margin",SolarPanelArrayPoleHeight:"Direk Y\xfckseklik",SolarPanelArrayPoleSpacing:"Direk Aral\u0131k",SolarPanelArrayTotalYearlyCost:"Total Cost",SolarPanelArrayTotalYearlyRevenue:"Total Revenue",SolarPanelArrayTotalYearlyYield:"Total Yield",SolarPanelArrayMeanYearlyYield:"Mean Yield",SolarPanelArrayYearlyProfit:"Profit",LayoutNotAcceptedCheckYourParameters:"Bu yerle\u015fim d\xfczeni uygulanamaz. L\xfctfen parametrelerinizi kontrol edin."},optimizationMenu:{Optimization:"Optimizasyon",Parameters:"Parametreler",Variables:"De\u011fi\u015fkenler",Constants:"Sabitler",GeneticAlgorithm:"Genetik Algoritma",GeneticAlgorithmSettings:"Genetik Algoritma Ayar\u0131",ParticleSwarmOptimization:"Par\xe7ac\u0131k S\xfcr\xfc Optimizasyon",ParticleSwarmOptimizationSettings:"Par\xe7ac\u0131k S\xfcr\xfc Optimizasyon Ayar\u0131",SolarPanelTiltAngleOptimization:"G\xfcne\u015f Paneli E\u011fim A\xe7\u0131s\u0131 Optimizasyonu",SolarPanelArrayLayout:"G\xfcne\u015f Paneli Dizi D\xfczeni",Generation:"Nesil",Gene:"Gen",NormalizedVariables:"Normalle\u015ftirilmi\u015f De\u011fi\u015fkenler",Objective:"Ama\xe7",ObjectiveFunctionDailyTotalYield:"G\xfcnl\xfck Toplam \xdcretim",ObjectiveFunctionYearlyTotalYield:"Y\u0131ll\u0131k Toplam \xdcretim",ObjectiveFunctionDailyMeanYield:"G\xfcnl\xfck Ortalama \xdcretim",ObjectiveFunctionYearlyMeanYield:"Y\u0131ll\u0131k Ortalama \xdcretim",ObjectiveFunctionDailyProfit:"G\xfcnl\xfck Kazan\xe7",ObjectiveFunctionYearlyProfit:"Y\u0131ll\u0131k Kazan\xe7",GeneticAlgorithmSelectionMethod:"Genetik Algoritma Se\xe7im Y\xf6ntemi",RouletteWheel:"Rulet \xc7ark\u0131",Tournament:"Turnuva",SearchMethod:"Arama Y\xf6ntemi",GlobalSearchUniformSelection:"K\xfcresel Arama Standart Se\xe7im",LocalSearchRandomOptimization:"Yerel Arama Rastgele Optimizasyon",PopulationSize:"Pop\xfclasyon Boyutu",MaximumGenerations:"Maksimum Nesil",SelectionRate:"Se\xe7im Oran\u0131",CrossoverRate:"Ge\xe7i\u015f Oran\u0131",MutationRate:"Mutasyon Oran\u0131",Step:"Ad\u0131m",SwarmSize:"S\xfcr\xfc Boyutu",MaximumSteps:"Maksimum Ad\u0131m",MaximumVelocity:"Maksimum H\u0131z",InertiaWeight:"Atalet A\u011f\u0131rl\u0131\u011f\u0131",CognitiveCoefficient:"Bili\u015fsel Katsay\u0131",SocialCoefficient:"Sosyal Katsay\u0131",ConvergenceThreshold:"Sonland\u0131rma i\xe7in Yak\u0131nsama E\u015fi\u011fi",LocalSearchRadius:"Yerel Arama Yar\u0131\xe7ap\u0131",RowsPerRackRange:"Raf Ba\u015f\u0131na S\u0131ra Aral\u0131\u011f\u0131",TiltAngleRange:"E\u011fim A\xe7\u0131s\u0131 Aral\u0131\u011f\u0131",InterRowSpacingRange:"S\u0131ra Aras\u0131 Aral\u0131k Ranj\u0131",ClickTargetPolygonToActivate:"Etkinle\u015ftirmek i\xe7in Hedef Poligona T\u0131klay\u0131n\u0131z",ClickTargetFoundationToActivate:"Etkinle\u015ftirmek i\xe7in Hedef Temele T\u0131klay\u0131n\u0131z"},treeMenu:{ShowModel:"Modeli G\xf6ster",Flip:"Flip",Type:"T\xfcr",Spread:"Yay\u0131l\u0131m"},flowerMenu:{Flip:"Flip",Type:"Type",Spread:"Spread"},peopleMenu:{ChangePerson:"Ki\u015fi De\u011fi\u015ftir",Flip:"Flip",Observer:"G\xf6zlemci",ViewFromThisPerson:" Se\xe7ili Ki\u015fiye G\xf6re Perspektif"},lightMenu:{Color:"Color",Intensity:"Intensity",Decay:"Decay",MaximumDistance:"Distance",Inside:"Inside"},solarCollectorMenu:{RelativeAzimuth:"G\xf6receli Azimut A\xe7\u0131s\u0131",Pole:"Pole",PoleHeight:"Direk Y\xfcksekli\u011fi",PoleRadius:"Pole Radius",ExtraPoleHeight:"Ekstra Direk Y\xfcksekli\u011fi",ExtraPoleHeightInAdditionToHalfWidth:"Yar\u0131m Geni\u015fli\u011fe Ek Ekstra Direk Y\xfcksekli\u011fi",DrawSunBeam:"G\xfcne\u015f I\u015f\u0131n\u0131 \xc7iz"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"Reflekt\xf6r Yans\u0131ma",ReceiverAbsorptance:"Al\u0131c\u0131 Absorbsiyonu",ReflectorOpticalEfficiency:"Reflekt\xf6r Optik Verimlili\u011fi",ReceiverThermalEfficiency:"Al\u0131c\u0131 Termal Verimlili\u011fi"},solarPanelMenu:{InverterEfficiency:"Inverter Efficiency",InverterEfficiencyExplained:"The efficiency for converting direct current (DC) to alternating current (AC).",DcToAcSizeRatio:"DC-to-AC Size Ratio",DcToAcSizeRatioExplained:"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.",ChangePvModel:"PV Modelini De\u011fi\u015ftir",Orientation:"Oryantasyon",Portrait:"Portre",Landscape:"Peyzaj",FrameColor:"Frame Color",Panels:"Paneller",PanelsWide:"Panel Geni\u015fli\u011fi",PanelsLong:"Panel Uzunlu\u011fu",TiltAngle:"E\u011fim A\xe7\u0131s\u0131",SouthFacingIsPositive:"G\xfcney y\xf6n\xfcnde a\xe7\u0131 pozitiftir.",Tracker:"\u0130zleyici",SolarTrackerFollowsSun:"G\xfcne\u015f paneli verimini art\u0131rmak i\xe7in bir g\xfcne\u015f izleme sistemi g\xfcne\u015fi s\xfcrekli takip eder.",PoleSpacing:"Direk Aral\u0131\u011f\u0131",NoTracker:"\u0130zleme Sistemi Yok",HorizontalSingleAxisTracker:"Yatay Tek Eksenli \u0130zleme Sistemi",VerticalSingleAxisTracker:"Dikey Tek Eksenli \u0130zleme Sistemi",AltazimuthDualAxisTracker:"Altazimut \xc7ift Eksenli \u0130zleme Sistemi",OnlyThisSolarPanel:"Sadece Se\xe7ili G\xfcne\u015f Paneli",AllSolarPanelsOnSurface:"T\xfcm G\xfcne\u015f Panelleri Ayn\u0131 Y\xfczeyde",AllSolarPanelsAboveFoundation:"T\xfcm G\xfcne\u015f Panelleri Ayn\u0131 Temel \xdczerinde",AllSelectedSolarPanels:"All Selected Solar Panels",AllSolarPanels:"T\xfcm G\xfcne\u015f Panelleri"},pvModelPanel:{SolarPanelSpecs:"G\xfcne\u015f Paneli \xd6zellikleri",Model:"Model",PanelSize:"Panel Boyutu",Cells:"H\xfccreler",CellType:"H\xfccre Tipi",Monocrystalline:"Monokristal",Polycrystalline:"Polikristal",ThinFilm:"\u0130nce Katman",Bifacial:"Bifacial",BifacialityFactor:"Bifaciality Factor",Black:"Siyah",Blue:"Mavi",ShadeTolerance:"G\xf6lge Tolerans\u0131",SolarCellEfficiency:"G\xfcne\u015f Pili Verimlili\u011fi",NominalOperatingCellTemperature:"Nominal \xc7al\u0131\u015fma H\xfccresi S\u0131cakl\u0131\u011f\u0131",TemperatureCoefficientOfPmax:"Pmax S\u0131cakl\u0131k Katsay\u0131s\u0131"},parabolicTroughMenu:{ModuleLength:"Mod\xfcl Uzunlu\u011fu",Modules:"Mod\xfcller",ModulesLong:"Mod\xfcllerin Uzunlu\u011fu",LatusRectum:"\xd6zkiri\u015f",OnlyThisParabolicTrough:"Sadece Se\xe7ili Parabolik Oluk",AllParabolicTroughsAboveFoundation:"Ayn\u0131 Temelin \xdczerindeki T\xfcm Parabolik Oluklar",AllSelectedParabolicTroughs:"All Selected Parabolic Troughs",AllParabolicTroughs:"T\xfcm Parabolik Oluklar"},fresnelReflectorMenu:{AbsorberPipe:"So\u011furucu Boru",SelectAbsorberToReflectSunlightTo:"G\xfcne\u015f I\u015f\u0131\u011f\u0131 Yans\u0131t\u0131lacak So\u011furucuyu Se\xe7in",ModuleLength:"Mod\xfcl Uzunlu\u011fu",Modules:"Mod\xfcller",ModulesLong:"Mod\xfcllerin Uzunlu\u011fu",OnlyThisFresnelReflector:"Sadece Se\xe7ili Fresnel Reflekt\xf6r",AllFresnelReflectorsAboveFoundation:"Ayn\u0131 Temel \xdczerindeki T\xfcm Fresnel Reflekt\xf6rler",AllSelectedFresnelReflectors:"All Selected Fresnel Reflectors",AllFresnelReflectors:"T\xfcm Fresnel Reflekt\xf6rler"},heliostatMenu:{Tower:"Kule",SelectTowerToReflectSunlightTo:"G\xfcne\u015f I\u015f\u0131\u011f\u0131 Yans\u0131t\u0131lacak Kuleyi Se\xe7in",OnlyThisHeliostat:"Sadece Se\xe7ili Heliostat",AllHeliostatsAboveFoundation:"Ayn\u0131 Temel \xdczerindeki T\xfcm Heliostatlar",AllSelectedHeliostats:"All Selected Heliostats",AllHeliostats:"T\xfcm Heliostatlar"},parabolicDishMenu:{ReceiverStructure:"Al\u0131c\u0131 Yap\u0131s\u0131",CentralPole:"Merkez Direk",CentralPoleWithTripod:"Tripodlu Merkez Direk",Quadrupod:"D\xf6rt Ayakl\u0131",RimDiameter:"Kasnak \xc7ap\u0131",LatusRectum:"\xd6zkiri\u015f",ExtraPoleHeightInAdditionToRadius:"Yar\u0131\xe7apa Ek Olarak Ekstra Direk Y\xfcksekli\u011fi",OnlyThisParabolicDish:"Sadece Se\xe7ili Parabolik \xc7anak",AllParabolicDishesAboveFoundation:"Ayn\u0131 Temel \xdczerindeki T\xfcm Parabolik \xc7anaklar",AllSelectedParabolicDishes:"All Selected Parabolic Dishes",AllParabolicDishes:"T\xfcm Parabolik \xc7anaklar"},wallMenu:{TextureDefault:"Varsay\u0131lan",Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",SizeOfWall:"Duvar Boyutu",OnlyThisWall:"Sadece Se\xe7ili Duvar",AllConnectedWalls:"All Connected Walls",AllWallsAboveFoundation:" Ayn\u0131 Temel \xdczerindeki T\xfcm Duvarlar",AllSelectedWalls:"All Selected Walls",AllWalls:"T\xfcm Duvarlar",Windows:"Pencereler",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Kilitlenmemi\u015f T\xfcm Pencereleri Kald\u0131r",DoYouReallyWantToRemoveAllWindowsOnThisWall:" Se\xe7ili duvardaki t\xfcm pencereleri kald\u0131rmak istiyor musunuz?",Doors:"Kap\u0131lar",RemoveAllUnlockedDoors:"T\xfcm Kilitlenmemi\u015f Kap\u0131lar\u0131 Kald\u0131r",DoYouReallyWantToRemoveAllDoorsOnThisWall:" Se\xe7ili duvardaki t\xfcm kap\u0131lar\u0131 kald\u0131rmak istiyor musun?",SolarPanels:"G\xfcne\u015f Panelleri",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Kilitlenmemi\u015f T\xfcm G\xfcne\u015f Panellerini Kald\u0131r",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:" Se\xe7ili duvardaki t\xfcm g\xfcne\u015f panellerini kald\u0131rmak istiyor musunuz?",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisWall:"Do you really want to remove all the sensors on this wall",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisWall:"Do you really want to remove all the lights on this wall",LockAllPolygons:"Lock All Polygons",UnlockAllPolygons:"Unlock All Polygons",RemoveAllUnlockedPolygons:"T\xfcm Kilitlenmemi\u015f Poligonlar\u0131 Kald\u0131r",WallStructure:"Duvar Yap\u0131s\u0131",DefaultStructure:"Varsay\u0131lan",StudStructure:"Ah\u015fap Dikme",PillarStructure:"Pillar",Opacity:"Opakl\u0131k",StructureSpacing:"Structure Spacing",StructureWidth:"Structure Width",StructureThickness:"Structure Thickness",StructureColor:"Structure Color",Color:"Wall Color",Height:"Height",Thickness:"Thickness",Texture:"Texture",AllLightsOnWallInside:"All Lights on Wall Inside",AllLightsOnWallOutside:"All Lights on Wall Outside",Fill:"Fill",Full:"Full",Partial:"Partial",Empty:"Empty",OpenToOutside:"Open to Outside",EavesLength:"Eaves Overhang Length",Parapet:"Parapet",ParapetColor:"Parapet Color",ParapetTexture:"Parapet Texture",ParapetHeight:"Parapet Height",CopingsHeight:"Copings Height",CopingsWidth:"Copings Width"},windowMenu:{OnlyThisWindow:"Sadece Bu Pencere",AllWindowsOnSurface:"All Windows on the Same Surface",AllWindowsAboveFoundation:"Ayn\u0131 Temelin \xdczerindeki T\xfcm Pencereler",AllSelectedWindows:"All Selected Windows",AllWindows:"T\xfcm Pencereler",Width:"Geni\u015flik",Height:"Y\xfckseklik",Setback:"Setback from Exterior Surface",RelativeToWallThickness:"Relative to wall thickness",Mullion:"Tiriz",HorizontalMullion:"Horizontal Mullion",VerticalMullion:"Vertical Mullion",MullionWidth:"Tiriz Geni\u015fli\u011fi",HorizontalMullionSpacing:"Horizontal Mullion Spacing",VerticalMullionSpacing:"Vertical Mullion Spacing",MullionColor:"Mullion Color",Tint:"Ton",Opacity:"Opakl\u0131k",SolarHeatGainCoefficient:"Solar heat gain coefficient (SHGC) = 1 - opacity",Shutter:"Kepenk",LeftShutter:"Sol Kepenk",RightShutter:"Sa\u011f Kepenk",BothShutters:"Kepenkler",ShutterWidth:"Geni\u015flik",ShutterColor:"Kepenk Rengi",Frame:"Frame",FrameWidth:"Frame Width",SillWidth:"Sill Width",Color:"Frame Color",WindowType:"Window Type",Default:"Default",Arched:"Arched",Polygonal:"Polygonal",Interior:"Interior",Empty:"Empty"},roofMenu:{TextureDefault:"Varsay\u0131lan",Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",OnlyThisRoof:"Sadece Se\xe7ili \xc7at\u0131",AllRoofsAboveFoundation:"Ayn\u0131 Temelin \xdczerinde T\xfcm \xc7at\u0131lar",AllSelectedRoofs:"All Selected Roofs",AllRoofs:"T\xfcm \xc7at\u0131lar",OnlyThisCeiling:"Only This Ceiling",AllCeilingsAboveFoundation:"All Ceilings Above the Same Foundation",AllCeilings:"All Ceilings",EavesOverhangLength:"Eaves Overhang Length",RafterSpacing:"Mertek Aral\u0131\u011f\u0131",RafterWidth:"Mertek Geni\u015fli\u011fi",RafterThickness:"Mertek Kal\u0131nl\u0131\u011f\u0131",RafterColor:"Mertek Rengi",RoofColor:"\xc7at\u0131 Rengi",RoofSideColor:"Roof Side Color",GlassTint:"Cam Tonu",Opacity:"Opakl\u0131k",RoofStructure:"\xc7at\u0131 Yap\u0131s\u0131",DefaultStructure:"Varsay\u0131lan",RafterStructure:"Mertek",GlassStructure:"Cam",SolarPanels:"Solar Panels",LockAllSolarPanels:"Lock All Solar Panels",UnlockAllSolarPanels:"Unlock All Solar Panels",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"Do you really want to remove all the solar panels on this roof",Windows:"Windows",LockAllWindows:"Lock All Windows",UnlockAllWindows:"Unlock All Windows",RemoveAllUnlockedWindows:"Remove All Unlocked Windows",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"Do you really want to remove all the windows on this roof",Sensors:"Sensors",LockAllSensors:"Lock All Sensors",UnlockAllSensors:"Unlock All Sensors",RemoveAllUnlockedSensors:"Remove All Unlocked Sensors",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"Do you really want to remove all the sensors on this roof",Lights:"Lights",RemoveAllUnlockedLights:"Remove All Unlocked Lights",DoYouReallyWantToRemoveAllLightsOnThisRoof:"Do you really want to remove all the lights on this roof",AllLightsOnRoofInside:"All Lights on Roof Inside",AllLightsOnRoofOutside:"All Lights on Roof Outside",Rise:"Rise",Ceiling:"Ceiling",RoofRValue:"Roof R-Value",CeilingRValue:"Ceiling R-Value"},doorMenu:{TextureDefault:"Varsay\u0131lan",Texture01:"Doku 1",Texture02:"Doku 2",Texture03:"Doku 3",Texture04:"Doku 4",Texture05:"Doku 5",Texture06:"Doku 6",Texture07:"Doku 7",Texture08:"Doku 8",Texture09:"Doku 9",Texture10:"Doku 10",Texture11:"Doku 11",Texture12:"Doku 12",Texture13:"Doku 13",Texture14:"Doku 14",Texture15:"Doku 15",Texture16:"Doku 16",Texture17:"Doku 17",OnlyThisDoor:"Sadece Se\xe7ili Kap\u0131",AllDoorsOnWall:"Ayn\u0131 Duvardaki T\xfcm Kap\u0131lar",AllDoorsAboveFoundation:"Ayn\u0131 Temelin \xdcst\xfcndeki T\xfcm Kap\u0131lar",AllSelectedDoors:"All Selected Doors",AllDoors:"T\xfcm Kap\u0131lar",DoorType:"Door Type",Default:"Default",Arched:"Arched",Filled:"Filled",FrameColor:"Frame Color",Interior:"Interior"},siteInfoPanel:{High:"Y\xfcksek",Low:"D\xfc\u015f\xfck"},designInfoPanel:{NumberOfSelectedHeliostats:"Se\xe7ilen heliostat say\u0131s\u0131",NumberOfSelectedSolarPanels:"Se\xe7ilen g\xfcne\u015f paneli say\u0131s\u0131",ElectricityGeneratedDailyBySolarPanels:"G\xfcne\u015f panellerinin g\xfcnl\xfck elektrik \xfcretimi",SceneDiameter:"Scene diameter",BuildingArea:"Building area"},visualizationControlPanel:{ColorContrast:"Renk Kontrast\u0131",FluxScale:"Flux Scale",ClickUpOrDownArrowButtonsToChange:"De\u011fi\u015ftirmek i\xe7in yukar\u0131 veya a\u015fa\u011f\u0131 ok butonlar\u0131na t\u0131klay\u0131n\u0131z"},instructionPanel:{Rotate:"D\xf6nd\xfcrme",DragMouse:"Sol T\u0131k + S\xfcr\xfckle",Zoom:"Yak\u0131nla\u015ft\u0131rma",MouseWheelOrKeys:"Tekerlek veya Ctrl+[ veya Ctrl+]",MouseWheelOrKeysMac:"Tekerlek veya \u2318+[ veya \u2318+]",Pan:"Ekran Kayd\u0131rma",HoldCtrlDragMouse:"Ctrl + S\xfcr\xfckle",HoldMetaDragMouse:"Hold \u2318 and drag mouse",Enter2DMode:"Enter 2D mode",Exit2DMode:"Exit 2D mode",NavigationMode:"Navigation mode",EnableNavigation:"Enable navigation",DisableNavigation:"Disable navigation",MoveForwardBack:"Move forward/back",MoveForwardBackInstruction:"Press W/S",MoveLeftRight:"Move left/right",MoveLeftRightInstruction:"Press A/D",MoveUpDown:"Move up/down",MoveUpDownInstruction:"Press Z/X",Turn:"Turn",TurnInstruction:"Press arrow keys",ResetView:"Yeniden Ba\u015flat",AutoRotate:"Otomatik D\xf6nd\xfcrme",StartOrStop:"Ba\u015flat veya Durdur (F4)"},mapPanel:{ImageOnGround:"Y\xfczey G\xf6r\xfcn\xfcm\xfc",WeatherStations:"Referans",WeatherStationsNote:"Turn this off to speed up",Coordinates:"Koordinatlar",Zoom:"B\xfcy\xfct"},visibilityPanel:{SolarPanelVisibility:"G\xfcne\u015f Paneli G\xf6r\xfcn\xfcm",Observer:"G\xf6zlemci",VantagePoint:"Referans Noktas\u0131",ItemizedVisibilityByFields:"Alana \xd6zel Perspektif",TotalVisibility:"Toplam"},sensorPanel:{LightSensor:"I\u015f\u0131k Sens\xf6r\xfc",WeatherDataFrom:"Hava Durumu"},buildingEnergyPanel:{DailyBuildingEnergy:"Daily Building Energy",YearlyBuildingEnergy:"Yearly Building Energy",Heater:"Heater",AC:"AC",SolarPanel:"Solar Panel",Net:"Net"},solarPanelYieldPanel:{SolarPanelDailyYield:"G\xfcne\u015f Paneli G\xfcnl\xfck \xdcretim",SolarPanelYearlyYield:"G\xfcne\u015f Paneli Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualSolarPanels:"Herbir g\xfcne\u015f panelinin \xfcretimini g\xf6ster",Profit:"Kazan\xe7",TotalCost:"Total Cost",TotalRevenue:"Total Revenue",TotalYield:"Total Yield",MeanYield:"Mean Yield",ModuleCount:"Module Count"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"Parabolik Oluk G\xfcnl\xfck \xdcretim",ParabolicTroughYearlyYield:"Parabolik Oluk Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualParabolicTroughs:"Herbir parabolik olu\u011fun \xfcretimini g\xf6ster"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"Parabolik \xc7anak G\xfcnl\xfck \xdcretim",ParabolicDishYearlyYield:"Parabolik \xc7anak Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualParabolicDishes:"Herbir parabolik \xe7ana\u011f\u0131n \xfcretimini g\xf6ster"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"Fresnel Reflekt\xf6r G\xfcnl\xfck \xdcretim",FresnelReflectorYearlyYield:"Fresnel Reflekt\xf6r Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualFresnelReflectors:"Herbir Fresnel yans\u0131t\u0131c\u0131s\u0131n\u0131n \xfcretimini g\xf6ster"},heliostatYieldPanel:{HeliostatDailyYield:"Heliostat G\xfcnl\xfck \xdcretim",HeliostatYearlyYield:"Heliostat Y\u0131ll\u0131k \xdcretim",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualHeliostats:"Herbir heliostat\u0131n \xfcretimini g\xf6ster"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"Solar Updraft Kulesi G\xfcnl\xfck \xdcretimi",UpdraftTowerYearlyYield:"Solar Updraft Kulesi Y\u0131ll\u0131k \xdcretimi",ChimneyAirTemperature:"Baca Hava S\u0131cakl\u0131\u011f\u0131",ChimneyWindSpeed:"Baca R\xfczgar H\u0131z\u0131",Yield:"\xdcretim",YieldPerHour:"Saatlik \xdcretim",DailyTotal:"G\xfcnl\xfck Toplam",YearlyTotal:"Y\u0131ll\u0131k Toplam",ShowOutputsOfIndividualUpdraftTowers:"Herbir updraft kulesinin \xfcretimini g\xf6ster"},heliodonPanel:{SunAndTimeSettings:"G\xfcne\u015f & Saat Ayarlar\u0131",SunAngles:"A\xe7\u0131lar",TwentyFourHours:"24 Hours"},cloudFilePanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyLikes:"My Likes",MyCloudFiles:"Bulut Dosyalar\u0131m",GenerateLink:"Link Olu\u015ftur",LinkGeneratedInClipBoard:"Klip Panosunda Olu\u015fturulan Link",DoYouReallyWantToDelete:"Ger\xe7ekten silmek istiyor musun?",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"If this file has been shared or published, renaming it breaks existing links"},projectListPanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"Search by title",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project was generated in the clip board",DoYouReallyWantToDeleteProject:"Do you really want to delete Project",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"If this project has been shared or published, renaming it breaks existing links"},projectPanel:{ProjectSettings:"Project Settings",ThumbnailImageSize:"Thumbnail Image Size",ProjectByOtherPeople:"Project by Other People",Project:"Project",ProjectType:"Type",ProjectDescription:"Description",MakeDescriptionEditable:"Make this description editable",MakeDescriptionNonEditable:"Make this description non-editable",DoubleClickToMakeDescriptionEditable:"Double-click to make this description editable",SolarPanelArray:"Solar Panel Array",CurateCurrentDesign:"Curate current design",UpdateSelectedDesign:"Update selected design",RemoveSelectedDesign:"Remove selected design",ClickToFlipSortingOrder:"Click to flip the sorting order",DesignNotShownInSolutionSpaceClickToShow:"This design is not shown in solution space; click to show",DesignShownInSolutionSpaceClickToHide:"This design is shown in solution space; click to hide",DistributionInSolutionSpace:"Distribution in the Solution Space",ChooseSolutionSpace:"Choose solution space",ChooseDataColoring:"Choose data coloring",SameColorForAllDesigns:"Same color for all designs",OneColorForEachDesign:"One color for each design",SolutionSpaceScreenshot:"Take a screenshot of the solution space",ScatteredPlotScreenshot:"Take a screenshot of the scattered plot",SingleClickToSelectDoubleClickToOpen:"Single-click to select, double-click to open.",SingleClickToDeselectDoubleClickToOpen:"Single-click to deselect, double-click to open.",GenerateScatteredPlot:"Generate Scattered Plot",SelectXAxis:"Select X Axis",SelectYAxis:"Select Y Axis"},accountSettingsPanel:{MyAccountSettings:"Hesap Ayarlar\u0131m",MyID:"Bilgilerim",ClickToCopyMyID:"Bilgilerinizi kopyalamak i\xe7in t\u0131klay\u0131n",IDInClipBoard:"Ki\u015fisel bilgileriniz kopyaland\u0131 ve yap\u0131\u015ft\u0131rmaya haz\u0131r.",StoreMyNameInMyFilesWhenSaving:"Kaydederken, ad\u0131m\u0131 dosyalar\u0131ma ekle",DoYouReallyWantToShowYourNameInYourFiles:"Dosyalar\u0131n\u0131zda isminizin g\xf6sterilmesini istiyor musunuz?",SignFileDisclaimer:"Evet ise, isiminiz dosyalar\u0131n\u0131za eri\u015fimi olan b\xfct\xfcn ki\u015filer taraf\u0131ndan g\xf6r\xfclebilir.",Likes:"Likes",AllPublished:"All Published",PublishedUnderAliases:"Aliases",UserCount:"Kullan\u0131c\u0131 Say\u0131s\u0131",SchoolID:"Okul",ClassID:"S\u0131n\u0131f"},weatherPanel:{SunshineHours:"G\xfcnd\xfcz Saatleri"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"Model Se\xe7",Sinusoidal:"Sin\xfczoidal"},economicsPanel:{EconomicsParameters:"Ekonomik Parametreler",ElectricitySellingPrice:"Elektrik Sat\u0131\u015f Fiyat\u0131",OperationalCostPerUnit:"Birim Ba\u015f\u0131na \u0130\u015fletme Maliyeti",SellingPrice:"Selling Price",UnitCost:"Unit Cost"},navigationPanel:{NavigationParameters:"Navigation Parameters",MinimumMoveSpeed:"Minimum Move Speed",MinimumTurnSpeed:"Minimum Turn Speed"},yearlyLightSensorPanel:{SkyClearness:"G\xf6ky\xfcz\xfc A\xe7\u0131kl\u0131\u011f\u0131",ShowDaylightResults:"G\xfcn I\u015f\u0131\u011f\u0131 Sonu\xe7lar\u0131n\u0131 G\xf6ster",ShowSkyClearnessResults:"G\xf6ky\xfcz\xfc A\xe7\u0131kl\u0131\u011f\u0131 Sonu\xe7lar\u0131n\u0131 G\xf6ster",ShowAverageDailySolarRadiation:"G\xfcnl\xfck ortalama g\xfcne\u015f I\u015f\u0131n\u0131m\u0131n\u0131 g\xf6ster"},analysisManager:{NoSensorForCollectingData:"Veri toplamak i\xe7in sens\xf6r yok.",NoSolarPanelForAnalysis:"Analiz i\xe7in g\xfcne\u015f paneli yok.",NoObserverForVisibilityAnalysis:"G\xf6r\xfcn\xfcrl\xfck analizi i\xe7in g\xf6zlemci yok.",NoWaterHeaterForAnalysis:"Analiz i\xe7in su \u0131s\u0131t\u0131c\u0131s\u0131 yok",NoParabolicDishForAnalysis:"Analiz i\xe7in parabolik \xe7anak yok",NoParabolicTroughForAnalysis:"Analiz i\xe7in parabolik oluk yok.",NoFresnelReflectorForAnalysis:"Analiz i\xe7in Fresnel reflekt\xf6r\xfc yok.",NoHeliostatForAnalysis:"Analiz i\xe7in heliostat yok.",NoSolarUpdraftTowerForAnalysis:"Analiz i\xe7in Solar Updraft Kulesi yok.",NoBuildingForAnalysis:"There is no building for analysis."},toolbar:{CloudFile:"Bulut Dosyas\u0131",Select:"Se\xe7",AddFoundation:"Temel Ekle",AddWall:"Duvar Ekle",AddWindow:"Pencere Ekle",AddDoor:"Kap\u0131 Ekle",AddPyramidRoof:"Piramit \xc7at\u0131 Ekle",AddGableRoof:"Be\u015fik \xc7at\u0131 Ekle",AddHipRoof:"K\u0131rma \xc7at\u0131 Ekle",AddGambrelRoof:"Flemenk \xc7at\u0131 Ekle",AddMansardRoof:"Mansart \xc7at\u0131 Ekle",AddCuboid:"K\xfcbik Ekle",AddSensor:"Sens\xf6r Ekle",AddSolarPanel:"G\xfcne\u015f Paneli Ekle",AddWaterHeater:"Su Is\u0131t\u0131c\u0131 Ekle",AddParabolicDish:"Parabolik \xc7anak Ekle",AddParabolicTrough:"Parabolik Oluk Ekle",AddFresnelReflector:"Fresnel Reflekt\xf6r\xfc Ekle",AddHeliostat:"Heliostat Ekle",AddWindTurbine:"Add wind turbine",AddLight:"Add light",AddTree:"A\u011fa\xe7 Ekle",AddFlower:"Add flower",AddPeople:"\u0130nsan Ekle",DoubleClickToLockThisModeForNextAction:"Double-click to lock this mode for next action",ClickToUnlockThisModeForNextAction:"Click to unlock this mode for next action",ManipulateGroup:"\xd6l\xe7eklendirme",ClearScene:"Her\u015feyi Sil",ShowSunAndTimeSettings:"G\xfcne\u015f & Zaman Ayarlar\u0131n\u0131 G\xf6ster",SpatialAnalysisOfEnergy:"Spatial analysis of energy",DoYouReallyWantToClearContent:"\u0130\xe7eri\u011fi silmek istiyor musunuz",ClickForMoreButtons:"Daha fazla buton i\xe7in t\u0131klay\u0131n",SwitchToAddingFoundation:"Temel Ekle ",SwitchToAddingCuboid:"K\xfcbik Ekle ",SwitchToAddingWall:"Duvar Ekle",SwitchToAddingWindow:"Pencere Eklemeyi'A\xe7",SwitchToAddingDoor:"Kap\u0131 Ekle",SwitchToAddingPyramidRoof:"Piramit \xc7at\u0131 Ekle",SwitchToAddingGableRoof:"Be\u015fik \xc7at\u0131 Ekle",SwitchToAddingHipRoof:"K\u0131rma \xc7at\u0131 Ekle",SwitchToAddingGambrelRoof:"Flemenk \xc7at\u0131 Ekle",SwitchToAddingMansardRoof:"Mansart \xc7at\u0131 Ekle",SwitchToAddingSolarPanel:"G\xfcne\u015f Paneli Ekle",SwitchToAddingSensor:"Sens\xf6r Ekle",SwitchToAddingWaterHeater:"Su Is\u0131t\u0131c\u0131 Ekle",SwitchToAddingParabolicDish:"Parabolik \xc7anak Ekle",SwitchToAddingParabolicTrough:"Parabolik Oluk Ekle",SwitchToAddingFresnelReflector:"Fresnel Reflekt\xf6r Ekle",SwitchToAddingHeliostat:"Heliostat Ekle",SwitchToAddingWindTurbine:"Switch to Adding Wind Turbine",SwitchToAddingLight:"Switch to Adding Light",SwitchToAddingTree:"A\u011fa\xe7 Ekle",SwitchToAddingFlower:"Switch to Adding Flower",SwitchToAddingPeople:"Ki\u015fi Ekle"},tooltip:{gotoIFI:"Yar\u0131n\u0131n Zekas\u0131 Enstit\xfcs\xfcne Git",visitAladdinHomePage:"Aladdin Ana Sayfas\u0131n\u0131 Ziyaret Edin",clickToOpenMenu:"Ana Men\xfcy\xfc A\xe7mak \u0130\xe7in T\u0131klay\u0131n\u0131z",clickToAccessAccountSettings:"Click to access account settings"},tree:{Apple:"Apple",Birch:"Birch",Coconut:"Coconut",Dogwood:"K\u0131z\u0131lc\u0131k A\u011fac\u0131",Elm:"Karaa\u011fa\xe7",FanPalm:"Fan Palm",Linden:"Ihlamur A\u011fac\u0131",Magnolia:"Magnolia",Maple:"Ak\xe7aa\u011fa\xe7",Oak:"Me\u015fe A\u011fac\u0131",Pine:"\xc7am",Spruce:"Ala\xe7am"},flower:{Bellflower:"Bellflower",Boxwood:"Boxwood",CactusCombo1:"Cactus Combo 1",CactusCombo2:"Cactus Combo 2",CactusCombo3:"Cactus Combo 3",CactusCombo4:"Cactus Combo 4",Hibiscus:"Hibiscus",Hosta:"Hosta",Hydrangea:"Hydrangea",Peony:"Peony",RedRose:"Red Rose",Spirea:"Spirea",Sunflower:"Sunflower",TallBush:"Tall Bush",Tulip:"Tulip",WhiteFlower:"White Flower",YellowFlower:"Yellow Flower"},people:{Jaah:"Ata",Jack:"Mete",Jacob:"Jacob",Jacqueline:"Beril",Jade:"Ece",Jamelia:"Bilge",James:"James",Jane:"Jane",Jaya:"Asya",Jaye:"Aylin",Jeanette:"Jeanette",Jedi:"Alp",Jeff:"Kaya",Jena:"Nehir",Jennifer:"Defne",Jess:"Zeynep",Jett:"Umut",Jill:"Jill",Jiya:"Elif",Joan:"Ezgi",Jocelyn:"Jocelyn",Joel:"Cenk",Joey:"Azra",John:"Can",Jonathon:"Jonathon",Jose:"Mert",Joseph:"Joseph",Joshua:"Joshua",Judd:"Ozan",Judy:"Judy",Julia:"Julia",Julio:"Bulut",Jumapili:"Umay",June:"Naz",Juro:"Efe",Justin:"Justin"},compass:{N:"N",S:"S",W:"W",E:"E"},month:{January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"},modelsMap:{SearchByPublisher:"Search by publisher",SearchByLabel:"Search by label",MyPublishedModels:"My Published Models",TotalNumberOfUserPublishedModels:"Total number of user-published models",SortFromOldestToNewest:"Sort from oldest to newest",SortFromNewestToOldest:"Sort from newest to oldest",ModelsFoundOnThisSite:"models found on this site",ShowModelsPublishedByThisAuthor:"Show the models published by this author"}}},ua:{translation:{name:{IFI:"\u0406\u043d\u0441\u0442\u0438\u0442\u0443\u0442 \u0406\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u041c\u0430\u0439\u0431\u0443\u0442\u043d\u044c\u043e\u0433\u043e",Aladdin:"Aladdin",Tagline:"Aladdin: \u041f\u0435\u0440\u0435\u043e\u0441\u043c\u0438\u0441\u043b\u0435\u043d\u043d\u044f \u0414\u0438\u0437\u0430\u0439\u043d\u0443 \u0437 \u041f\u043e\u044f\u0441\u043d\u044e\u0432\u0430\u043b\u044c\u043d\u0438\u043c \u0428\u0442\u0443\u0447\u043d\u0438\u043c \u0406\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u043e\u043c - \u0406\u043d\u0441\u0442\u0438\u0442\u0443\u0442 \u0406\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u041c\u0430\u0439\u0431\u0443\u0442\u043d\u044c\u043e\u0433\u043e"},cookie:{Statement:"\u041d\u0430\u0442\u0438\u0441\u043d\u0443\u0432\u0448\u0438 \xab\u041f\u0440\u0438\u0439\u043d\u044f\u0442\u0438\xbb, \u0432\u0438 \u043f\u043e\u0433\u043e\u0434\u0436\u0443\u0454\u0442\u0435\u0441\u044f \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f\u043c \u0444\u0430\u0439\u043b\u0456\u0432 cookie \u0434\u043b\u044f \u043f\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044f \u0432\u0430\u0448\u043e\u0433\u043e \u0434\u043e\u0441\u0432\u0456\u0434\u0443 \u0437 Aladdin.",Accept:"\u041f\u0440\u0438\u0439\u043d\u044f\u0442\u0438"},aboutUs:{ProductBroughtToYouBy:"\u0426\u0435\u0439 \u041f\u0440\u043e\u0434\u0443\u043a\u0442 \u0411\u0443\u043b\u043e \u0421\u0442\u0432\u043e\u0440\u0435\u043d\u043e:",TermsOfService:"\u0423\u043c\u043e\u0432\u0438 \u0412\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f",PrivacyPolicy:"\u041f\u043e\u043b\u0456\u0442\u0438\u043a\u0430 \u041a\u043e\u043d\u0444\u0456\u0434\u0435\u043d\u0446\u0456\u0439\u043d\u043e\u0441\u0442\u0456",Software:"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043d\u0435 \u0417\u0430\u0431\u0435\u0437\u043f\u0435\u0447\u0435\u043d\u043d\u044f",Content:"\u041c\u0430\u0442\u0435\u0440\u0456\u0430\u043b\u0438",Research:"\u0414\u043e\u0441\u043b\u0456\u0434\u0436\u0435\u043d\u043d\u044f",Support:"\u041f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0430",Acknowledgment:"\u041f\u043e\u0434\u044f\u043a\u0430",FundingInformation:"\u041d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u0438\u0439 \u041d\u0430\u0443\u043a\u043e\u0432\u0438\u0439 \u0424\u043e\u043d\u0434 (\u041d\u041d\u0424, C\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0456 \u0428\u0442\u0430\u0442\u0438 \u0410\u043c\u0435\u0440\u0438\u043a\u0438) \u043d\u0430\u0434\u0430\u0432 \u0444\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u0443 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u043b\u0456\u0434\u0436\u0435\u043d\u043d\u044f \u0442\u0430 \u0440\u043e\u0437\u0440\u043e\u0431\u043a\u0438 \u0446\u044c\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0443 \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e \u0433\u0440\u0430\u043d\u0442\u0456\u0432 \u21162105695, \u21162131097, \u0442\u0430 \u2116#2301164. \u041e\u0434\u043d\u0430\u043a, \u0431\u0443\u0434\u044c-\u044f\u043a\u0456 \u043f\u043e\u0433\u043b\u044f\u0434\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u0442\u0430 \u0432\u0438\u0441\u043d\u043e\u0432\u043a\u0438, \u0432\u0438\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u0456 \u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0456, \u043d\u0430\u043b\u0435\u0436\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0430\u043c \u0456 \u043c\u043e\u0436\u0443\u0442\u044c \u043d\u0435 \u043f\u043e\u0432\u043d\u0456\u0441\u0442\u044e \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u0438 \u043f\u043e\u0433\u043b\u044f\u0434\u0438 \u041d\u041d\u0424.",Contact:"\u0414\u043b\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0434\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u043e\u0457 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0457, \u0431\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0437\u0432\u0435\u0440\u043d\u0456\u0442\u044c\u0441\u044f \u0434\u043e Charles Xie (charles@intofuture.org).",Translators:"\u041f\u0435\u0440\u0435\u043a\u043b\u0430\u0434"},word:{LastUpdate:"Last Update",Small:"Small",Medium:"Medium",Large:"Large",Design:"Design",Information:"Information",Type:"Type",Text:"\u0422\u0435\u043a\u0441\u0442",FontSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0428\u0440\u0438\u0444\u0442\u0443",FontColor:"\u041a\u043e\u043b\u0456\u0440 \u0428\u0440\u0438\u0444\u0442\u0443",Model:" \u041c\u043e\u0434\u0435\u043b\u044c",Models:"\u041c\u043e\u0434\u0435\u043b\u0456",Upload:"\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438",ClickCount:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u041f\u0456\u0434\u0440\u0430\u0445\u0443\u0432\u0430\u0442\u0438",Share:"\u041f\u043e\u0434\u0456\u043b\u0438\u0442\u0438\u0441\u044c",AlreadyLike:"\u0412\u043f\u043e\u0434\u043e\u0431\u0430\u043d\u043e",Like:"\u0412\u043f\u043e\u0434\u043e\u0431\u0430\u0442\u0438",MustLogInToLike:"\u041f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u0423\u0432\u0456\u0439\u0442\u0438, \u0449\u043e\u0431 \u0412\u043f\u043e\u0434\u043e\u0431\u0430\u0442\u0438",AllRightsReserved:"\u0423\u0441\u0456 \u041f\u0440\u0430\u0432\u0430 \u0417\u0430\u0445\u0438\u0449\u0435\u043d\u043e",MeterAbbreviation:"\u043c",Version:"\u0412\u0435\u0440\u0441\u0456\u044f",VersionInitial:"\u0412",Options:"\u041e\u043f\u0446\u0456\u0457",Maximum:"\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c",Minimum:"\u041c\u0456\u043d\u0456\u043c\u0443\u043c",MaximumNumber:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0435 \u0427\u0438\u0441\u043b\u043e",MinimumNumber:"\u041c\u0456\u043d\u0456\u043c\u0430\u043b\u044c\u043d\u0435 \u0427\u0438\u0441\u043b\u043e",MaximumValue:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0435 \u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f",MinimumValue:"\u041c\u0456\u043d\u0456\u043c\u0430\u043b\u044c\u043d\u0435 \u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f",Or:"\u0410\u0431\u043e",None:"\u0416\u043e\u0434\u0435\u043d",High:"\u0412\u0438\u0441\u043e\u043a\u0438\u0439",Partial:"\u0427\u0430\u0441\u0442\u043a\u043e\u0432\u0438\u0439",Teacher:"\u0412\u0447\u0438\u0442\u0435\u043b\u044c",Class:"\u041a\u043b\u0430\u0441",Total:"\u0412\u0441\u044c\u043e\u0433\u043e",Leaderboard:"\u0422\u0430\u0431\u043b\u0438\u0446\u044f \u041b\u0456\u0434\u0435\u0440\u0456\u0432",Latest:"\u041e\u0441\u0442\u0430\u043d\u043d\u0454",Range:"\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d",SIUnit:"SI \u041e\u0434\u0438\u043d\u0438\u0446\u044f",USUnit:"US \u041e\u0434\u0438\u043d\u0438\u0446\u044f",ThermalTransmittance:"\u0422\u0435\u043f\u043b\u043e\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430",ThermalResistance:"\u0422\u0435\u0440\u043c\u0456\u0447\u043d\u0438\u0439 \u041e\u043f\u0456\u0440",UValue:"U-\u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f",RValue:"R-\u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f",VolumetricHeatCapacity:"\u041e\u0431'\u0454\u043c\u043d\u0430 \u0422\u0435\u043f\u043b\u043e\u0454\u043c\u043d\u0456\u0441\u0442\u044c",BuildingHVACSystem:"\u041f\u043e\u0431\u0443\u0434\u043e\u0432\u0430 \u0421\u0438\u0441\u0442\u0435\u043c\u0438 \u041e\u043f\u0430\u043b\u0435\u043d\u043d\u044f, \u0412\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0456\u0457 \u0442\u0430 \u041a\u043e\u043d\u0434\u0438\u0446\u0456\u044e\u0432\u0430\u043d\u043d\u044f \u041f\u043e\u0432\u0456\u0442\u0440\u044f (\u041e\u0412\u041a)",ThermostatSetpoint:"\u0417\u0430\u0434\u0430\u043d\u0430 \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0422\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u0430",TemperatureToleranceThreshold:"\u041f\u043e\u0440\u043e\u0433\u043e\u0432\u0435 \u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0412\u0456\u0434\u0445\u0438\u043b\u0435\u043d\u043d\u044f \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438",TemperatureToleranceThresholdExplanation:"\u041e\u0431\u0456\u0433\u0440\u0456\u0432\u0430\u0447 \u043d\u0435 \u043f\u0440\u0430\u0446\u044e\u0432\u0430\u0442\u0438\u043c\u0435, \u044f\u043a\u0449\u043e \u043d\u0430\u0439\u043d\u0438\u0436\u0447\u0430 \u0437\u043e\u0432\u043d\u0456\u0448\u043d\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0434\u043d\u044f \u0432\u0438\u0449\u0430 \u0437\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043de, \u044f\u043a\u0449\u043e \u0432\u0456\u0434 \u0437\u0430\u0434\u0430\u043d\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u0432\u0456\u0434\u043d\u044f\u0442\u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f. \u041a\u043e\u043d\u0434\u0438\u0446\u0456\u043e\u043d\u0435\u0440 \u043d\u0435 \u043f\u0440\u0430\u0446\u044e\u0432\u0430\u0442\u0438\u043c\u0435, \u044f\u043a\u0449\u043e \u043d\u0430\u0439\u0432\u0438\u0449\u0430 \u0437\u043e\u0432\u043d\u0456\u0448\u043d\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u0434\u043d\u044f \u043d\u0438\u0436\u0447\u0430 \u0437\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u0435, \u044f\u043a\u0449\u043e \u0432\u0456\u0434 \u0437\u0430\u0434\u0430\u043d\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u0432\u0456\u0434\u043d\u044f\u0442\u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f.",Press:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c",Open:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438",Save:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438",SaveAsImage:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u044f\u043a \u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",SaveAsCsv:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u044f\u043a CSV",Update:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438",Paste:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438",Copy:"\u041a\u043e\u043f\u0456\u044e\u0432\u0430\u0442\u0438",Cut:"\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438",Delete:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438",Lock:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438",Translucent:"\u041f\u0456\u0432\u043f\u0440\u043e\u0437\u043e\u0440\u0438\u0439",Color:"\u041a\u043e\u043b\u0456\u0440",Texture:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430",Size:"\u0420\u043e\u0437\u043c\u0456\u0440",Thickness:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430",Yes:"\u0422\u0430\u043a",No:"\u041d\u0456",OK:"\u041e\u041a",Cancel:"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438",Apply:"\u0417\u0430\u0441\u0442\u043e\u0441\u0443\u0432\u0430\u0442\u0438",Close:"\u0417\u0430\u043a\u0440\u0438\u0442\u0438",ApplyTo:"\u0417\u0430\u0441\u0442\u043e\u0441\u0443\u0432\u0430\u0442\u0438 \u0414\u043e",Run:"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438",Pause:"\u041f\u0430\u0443\u0437\u0430",Resume:"\u0412\u0456\u0434\u043d\u043e\u0432\u0438\u0442\u0438",Clear:"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438",Warning:"\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u0436\u0435\u043d\u043d\u044f",Caution:"\u041e\u0431\u0435\u0440\u0435\u0436\u043d\u043e",Reminder:"\u041d\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043d\u043d\u044f",Length:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430",Width:"\u0428\u0438\u0440\u0438\u043d\u0430",Height:"\u0412\u0438\u0441\u043e\u0442\u0430",Radius:"\u0420\u0430\u0434\u0456\u0443\u0441",Angle:"\u041a\u0443\u0442",Azimuth:"\u0410\u0437\u0438\u043c\u0443\u0442",Coordinates:"\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0438",Weather:"\u041f\u043e\u0433\u043e\u0434\u0430",Show:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438",Animate:"\u0410\u043d\u0456\u043c\u0443\u0432\u0430\u0442\u0438",Date:"\u0414\u0430\u0442\u0430",Time:"\u0427\u0430\u0441",Title:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",Owner:"\u0412\u043b\u0430\u0441\u043d\u0438\u043a",Action:"\u0414\u0456\u044f",Rename:"\u041f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438",Location:"\u041c\u0456\u0441\u0446\u0435\u0437\u043d\u0430\u0445\u043e\u0434\u0436\u0435\u043d\u043d\u044f",Latitude:"\u0428\u0438\u0440\u043e\u0442\u0430",Month:"\u041c\u0456\u0441\u044f\u0446\u044c",Day:"\u0414\u0435\u043d\u044c",Hour:"\u0413\u043e\u0434\u0438\u043d\u0430",Daylight:"\u0414\u0435\u043d\u043d\u0435 \u0441\u0432\u0456\u0442\u043b\u043e",Radiation:"\u0420\u0430\u0434\u0456\u0430\u0446\u0456\u0439\u043d\u0435 \u0412\u0438\u043f\u0440\u043e\u043c\u0456\u043d\u044e\u0432\u0430\u043d\u043d\u044f",Temperature:"\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430",kWh:"\u043a\u0412\u0442-\u0433\u043e\u0434",dollar:"\u0434\u043e\u043b\u0430\u0440",MeterPerSecond:"\u043c/\u0441",NorthInitial:"\u041f\u0456\u0432\u043d\u0456\u0447",SouthInitial:"\u041f\u0456\u0432\u0434\u0435\u043d\u044c",EastInitial:"\u0421\u0445\u0456\u0434",WestInitial:"\u0417\u0430\u0445\u0456\u0434",Fixed:"\u0424\u0456\u043a\u0441\u043e\u0432\u0430\u043d\u0438\u0439",Elements:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442\u0438",Energy:"\u0415\u043d\u0435\u0440\u0433\u0456\u044f",Unknown:"\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u043e",Label:"\u041c\u0456\u0442\u043a\u0430",Description:"\u041e\u043f\u0438\u0441",NoDescription:"\u0411\u0435\u0437 \u043e\u043f\u0438\u0441\u0443",MaximumCharacters:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u0456\u0432",Author:"\u0410\u0432\u0442\u043e\u0440",Publisher:"\u0412\u0438\u0434\u0430\u0432\u0435\u0446\u044c",Building:"\u0411\u0443\u0434\u0456\u0432\u043b\u044f",ResidentialBuilding:"\u0416\u0438\u0442\u043b\u043e\u0432\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f",CommercialBuilding:"\u041a\u043e\u043c\u0435\u0440\u0446\u0456\u0439\u043d\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f",SchoolBuilding:"\u0428\u043a\u0456\u043b\u044c\u043d\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f",TouristAttraction:"\u0422\u0443\u0440\u0438\u0441\u0442\u0438\u0447\u043d\u0430 \u0432\u0438\u0437\u043d\u0430\u0447\u043d\u0430 \u043f\u0430\u043c'\u044f\u0442\u043a\u0430",UnderConstruction:"\u0412 \u0441\u0442\u0430\u0434\u0456\u0457 \u0431\u0443\u0434\u0456\u0432\u043d\u0438\u0446\u0442\u0432\u0430",Photovoltaic:"\u0424\u043e\u0442\u043e\u0435\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u043d\u0438\u0439",Anonymous:"\u0410\u043d\u043e\u043d\u0456\u043c\u043d\u0438\u0439",Nickname:"\u041d\u0456\u043a\u043d\u0435\u0439\u043c",Pin:"\u0417\u0430\u043a\u0440\u0456\u043f\u0438\u0442\u0438",Unpin:"\u0412\u0456\u0434\u043a\u0440\u0456\u043f\u0438\u0442\u0438"},shared:{NoTexture:"\u0411\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438",FoundationElement:"\u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442",CuboidElement:"\u041f\u0430\u0440\u0430\u043b\u0435\u043b\u0435\u043f\u0456\u043f\u0435\u0434",PolygonElement:"\u0411\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0438\u043a",SensorElement:"\u0421\u0435\u043d\u0441\u043e\u0440",SolarPanelElement:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c",WaterHeaterElement:"\u0412\u043e\u0434\u043e\u043d\u0430\u0433\u0440\u0456\u0432\u0430\u0447",ParabolicDishElement:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0430 \u0442\u0430\u0440\u0456\u043b\u043a\u0430",ParabolicTroughElement:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",FresnelReflectorElement:"\u0412\u0456\u0434\u0431\u0438\u0432\u0430\u0447 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",HeliostatElement:"\u0413\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442",WindTurbineElement:"\u0412\u0456\u0442\u0440\u043e\u0432\u0430 \u0442\u0443\u0440\u0431\u0456\u043d\u0430",LightElement:"\u0421\u0432\u0456\u0442\u043b\u043e",ElementLocked:"\u0417\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u043e",ModelType:"\u0422\u0438\u043f \u043c\u043e\u0434\u0435\u043b\u0456",OutputBreakdown:"Breakdown",MoreResults:"More Results"},message:{ModelNotFound:"\u041c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e",CannotSignIn:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0443\u0432\u0456\u0439\u0442\u0438",CannotSignOut:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0438\u0439\u0442\u0438",YourAccountWasCreated:"\u0412\u0430\u0448 \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0438\u0441 \u0431\u0443\u0432 \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0439",CannotCreateAccount:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0438\u0441",YourAccountSettingsWereSaved:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443 \u0431\u0443\u043b\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0456",CannotSaveYourAccountSettings:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443",CannotSaveYourFileToCloud:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0432\u0430\u0448 \u0444\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",CannotCreateNewProject:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043d\u043e\u0432\u0438\u0439 \u043f\u0440\u043e\u0454\u043a\u0442",CannotCreateNewProjectWithoutTitle:"Cannot create a new project without a title",CannotOpenYourProjects:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0432\u0430\u0448\u0456 \u043f\u0440\u043e\u0454\u043a\u0442\u0438",CannotOpenProject:"Cannot open the project",CannotDeleteProject:"Cannot delete the project",CannotRenameProject:"Cannot rename the project",CannotAddDesignToProject:"Cannot add this design to the project",CannotAddDesignToProjectOwnedByOthers:"Cannot add this design to a project owned by others",DesignRemovedFromProject:"The design was successfully removed from the project",CannotRemoveDesignFromProject:"Cannot remove this design from the project",CannotUpdateProject:"Cannot update the project",CannotFetchProjectData:"Cannot fetch project data",TitleUsedChooseDifferentOne:"\u0426\u044f \u043d\u0430\u0437\u0432\u0430 \u0431\u0443\u043b\u0430 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0430. \u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u0456\u043d\u0448\u0443",CloudFileWithTitleExistsDoYouWantToOverwrite:"\u0425\u043c\u0430\u0440\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u0437 \u0442\u0430\u043a\u043e\u044e \u0436 \u043d\u0430\u0437\u0432\u043e\u044e \u0432\u0436\u0435 \u0456\u0441\u043d\u0443\u0454. \u0412\u0438 \u0445\u043e\u0447\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u0438 \u0439\u043e\u0433\u043e?",CloudFileNotFound:"\u0424\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456 \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e",CannotLoadModelsOnMap:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0456 \u043d\u0430 \u043a\u0430\u0440\u0442\u0443",CannotLoadLeaderboard:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044e \u043b\u0456\u0434\u0435\u0440\u0456\u0432",CannotPublishModelOnMap:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043a\u0430\u0440\u0442\u0456",CannotLikeModelFromMap:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u043e\u0446\u0456\u043d\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437 \u043a\u0430\u0440\u0442\u0438",CannotDeleteModelFromMap:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437 \u043a\u0430\u0440\u0442\u0438",ModelDeletedFromMap:"\u041c\u043e\u0434\u0435\u043b\u044c \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u0430 \u0437 \u043a\u0430\u0440\u0442\u0438",DoYouWantToDeleteModelFromMap:"\u0412\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437 \u043a\u0430\u0440\u0442\u0438?",CannotOpenCloudFile:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0444\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",CannotReadCloudFile:"Cannot read the cloud file",CannotWriteCloudFile:"Cannot write the cloud file",CloudFileCopied:"Cloud file copied",CannotOpenCloudFolder:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u043f\u0430\u043f\u043a\u0443 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",CannotDeleteCloudFile:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0444\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",CannotRenameCloudFile:"\u041d\u0435 \u0432\u0434\u0430\u0454\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438 \u0444\u0430\u0439\u043b \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",DoYouWantToSaveChanges:"\u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0437\u043c\u0456\u043d\u0438?",NotApplicableToSelectedAction:"\u041d\u0435 \u0437\u0430\u0441\u0442\u043e\u0441\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u0434\u043e \u043e\u0431\u0440\u0430\u043d\u043e\u0457 \u0434\u0456\u0457",ThisElementIsLocked:"\u0426\u0435\u0439 \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u0439.",ThisCannotBeUndone:"\u0426\u0435 \u043d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0441\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438.",AzimuthOfNorthIsZero:"\u0410\u0437\u0438\u043c\u0443\u0442 \u043f\u0456\u0432\u043d\u043e\u0447\u0456 \u0434\u043e\u0440\u0456\u0432\u043d\u044e\u0454 0\xb0",CounterclockwiseAzimuthIsPositive:"\u0410\u0437\u0438\u043c\u0443\u0442 \u0454 \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u0438\u043c \u043f\u0440\u043e\u0442\u0438 \u0433\u043e\u0434\u0438\u043d\u043d\u0438\u043a\u043e\u0432\u043e\u0457 \u0441\u0442\u0440\u0456\u043b\u043a\u0438.",MoveCancelledBecauseOfOverlap:"\u041f\u0435\u0440\u0435\u043c\u0456\u0449\u0435\u043d\u043d\u044f \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f.",MoveOutsideBoundaryCancelled:"\u041f\u0435\u0440\u0435\u043c\u0456\u0449\u0435\u043d\u043d\u044f \u0437\u0430 \u043c\u0435\u0436\u0456 \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u043e.",RotationCancelledBecauseOfOverlap:"\u0420\u043e\u0442\u0430\u0446\u0456\u044e \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f.",RotationOutsideBoundaryCancelled:"\u0420\u043e\u0442\u0430\u0446\u0456\u044f \u0437\u0430 \u043c\u0435\u0436\u0456 \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u0430.",ResizingCancelledBecauseOfOverlap:"\u0417\u043c\u0456\u043d\u0430 \u0440\u043e\u0437\u043c\u0456\u0440\u0443 \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f.",ResizingOutsideBoundaryCancelled:"\u0417\u043c\u0456\u043d\u0430 \u0440\u043e\u0437\u043c\u0456\u0440\u0443 \u0437\u0430 \u043c\u0435\u0436\u0456 \u0441\u043a\u0430\u0441\u043e\u0432\u0430\u043d\u0430.",CannotPasteOutsideBoundary:"\u041d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0437\u0430 \u043c\u0435\u0436\u0456.",CannotPasteBecauseOfOverlap:"\u041d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f.",CannotMoveObjectTooFar:"\u041d\u0435 \u043c\u043e\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0456\u0441\u0442\u0438\u0442\u0438 \u043e\u0431'\u0454\u043a\u0442 \u0437\u0430\u043d\u0430\u0434\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e.",ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:"\u0406\u0441\u043d\u0443\u044e\u0447\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u0431\u0443\u0434\u0443\u0442\u044c \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u0456 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0441\u0442\u043e\u0441\u0443\u0432\u0430\u043d\u043d\u044f\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u043a\u0435\u0442\u0443.",DoYouWantToContinue:"\u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438?",SolarPanelsCannotIntersectWithGround:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0435 \u043c\u043e\u0436\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u0442\u0438\u043d\u0430\u0442\u0438\u0441\u044f \u0437 \u0437\u0435\u043c\u043b\u0435\u044e.",SolarPanelsCannotOverlapWithOneAnother:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0435 \u043c\u043e\u0436\u0443\u0442\u044c \u043d\u0430\u043a\u043b\u0430\u0434\u0430\u0442\u0438\u0441\u044f \u043e\u0434\u043d\u0430 \u043d\u0430 \u043e\u0434\u043d\u0443.",ScreenshotSaved:"\u0417\u043d\u0456\u043c\u043e\u043a \u0435\u043a\u0440\u0430\u043d\u0430 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e.",CsvFileSaved:"CSV \u0444\u0430\u0439\u043b \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043e.",SimulationStarted:"\u0420\u043e\u0437\u043f\u043e\u0447\u0430\u0442\u043e \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e.",SimulationCompleted:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e.",SimulationAborted:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e \u043f\u0435\u0440\u0435\u0440\u0432\u0430\u043d\u043e.",SimulationPaused:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e \u043f\u0440\u0438\u0437\u0443\u043f\u0438\u043d\u0435\u043d\u043e.",CancelSimulation:"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e",PauseSimulation:"\u041f\u0440\u0438\u0437\u0443\u043f\u0438\u043d\u0438\u0442\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e",ResumeSimulation:"\u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044e",SimulationWillNotStartDueToErrors:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044f \u043d\u0435 \u0440\u043e\u0437\u043f\u043e\u0447\u043d\u0435\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043c\u0438\u043b\u043a\u0438",SimulationWillStartDespiteWarnings:"\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044f \u0440\u043e\u0437\u043f\u043e\u0447\u043d\u0435\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0432\u0430\u0436\u0430\u044e\u0447\u0438 \u043d\u0430 \u043f\u043e\u043f\u0435\u0440\u0435\u0434\u0436\u0435\u043d\u043d\u044f.",EvolutionStarted:"\u0415\u0432\u043e\u043b\u044e\u0446\u0456\u044e \u0440\u043e\u0437\u043f\u043e\u0447\u0430\u0442\u043e.",EvolutionCompleted:"\u0415\u0432\u043e\u043b\u044e\u0446\u0456\u044e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e.",EvolutionAborted:"\u0415\u0432\u043e\u043b\u044e\u0446\u0456\u044e \u043f\u0435\u0440\u0435\u0440\u0432\u0430\u043d\u043e.",EvolutionPaused:"\u0415\u0432\u043e\u043b\u044e\u0446\u0456\u044e \u043f\u0440\u0438\u0437\u0443\u043f\u0438\u043d\u0435\u043d\u043e.",EncounterEvolutionError:"\u0421\u0442\u0430\u043b\u0430\u0441\u044f \u043f\u043e\u043c\u0438\u043b\u043a\u0430 \u0435\u0432\u043e\u043b\u044e\u0446\u0456\u0457.",CancelEvolution:"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0435\u0432\u043e\u043b\u044e\u0446\u0456\u044e",PauseEvolution:"\u041f\u0440\u0438\u0437\u0443\u043f\u0438\u043d\u0438\u0442\u0438 \u0435\u0432\u043e\u043b\u044e\u0446\u0456\u044e",ResumeEvolution:"\u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438 \u0435\u0432\u043e\u043b\u044e\u0446\u0456\u044e",ConvergenceThresholdHasBeenReached:"\u0414\u043e\u0441\u044f\u0433\u043d\u0443\u0442\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0437\u0431\u0456\u0436\u043d\u043e\u0441\u0442\u0456.",MaximumNumberOfGenerationsHasBeenReached:"\u0414\u043e\u0441\u044f\u0433\u043d\u0443\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043f\u043e\u043a\u043e\u043b\u0456\u043d\u044c.",MaximumNumberOfStepsHasBeenReached:"\u0414\u043e\u0441\u044f\u0433\u043d\u0443\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043a\u0440\u043e\u043a\u0456\u0432.",ObjectiveFunctionTypeError:"\u041f\u043e\u0442\u043e\u0447\u043d\u0430 \u0446\u0456\u043b\u044c\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0456\u044f \u043d\u0435 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u0454\u0442\u044c\u0441\u044f \u0446\u0456\u0454\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0456\u0454\u044e. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0440\u043e\u0437\u043f\u043e\u0447\u043d\u0456\u0442\u044c \u0437 \u043c\u0435\u043d\u044e.",WallsAreNotAtSameHeight:"\u0421\u0442\u0456\u043d\u0438 \u043d\u0435 \u0437\u043d\u0430\u0445\u043e\u0434\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0430\u043a\u043e\u0432\u0456\u0439 \u0432\u0438\u0441\u043e\u0442\u0456.",WallsAreNotPerpendicular:"\u0421\u0442\u0456\u043d\u0438 \u043d\u0435 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u0456.",WallsAreNotConnected:"\u0421\u0442\u0456\u043d\u0438 \u043d\u0435 \u0437'\u0454\u0434\u043d\u0430\u043d\u0456.",WallsNumberNeedToBeFour:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0441\u0442\u0456\u043d \u043c\u0430\u0454 \u0434\u043e\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u0442\u0438 \u0447\u043e\u0442\u0438\u0440\u0438.",BuildingContainsEmptyWall:"\u0411\u0443\u0434\u0456\u0432\u043b\u044f \u043c\u0456\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0430\u0431\u043e \u043a\u0456\u043b\u044c\u043a\u0430 \u043f\u043e\u0440\u043e\u0436\u043d\u0456\u0445 \u0441\u0442\u0456\u043d.",BuildingRoofMissing:"\u0423 \u0431\u0443\u0434\u0456\u0432\u043b\u0456 \u0432\u0456\u0434\u0441\u0443\u0442\u043d\u0456\u0439 \u0434\u0430\u0445.",UnknownErrors:"\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u0456 \u043f\u043e\u043c\u0438\u043b\u043a\u0438."},menu:{AnalysisOptions:"\u041e\u043f\u0446\u0456\u0457 \u0430\u043d\u0430\u043b\u0456\u0437\u0443",option:{GridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0441\u0456\u0442\u043a\u0438",SamplingFrequency:"\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u0432\u0438\u0431\u0456\u0440\u043a\u0438",TimesPerHour:"\u0420\u0430\u0437\u0456\u0432 \u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DaysPerYear:"\u0414\u043d\u0456\u0432 \u043d\u0430 \u0440\u0456\u043a"},mainMenu:"\u0413\u043e\u043b\u043e\u0432\u043d\u0435 \u041c\u0435\u043d\u044e",cloudMenu:"\u041c\u0435\u043d\u044e \u0425\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0421\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0430",projectSubMenu:"\u041f\u0440\u043e\u0454\u043a\u0442",project:{CreateNewProject:"\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u041d\u043e\u0432\u0438\u0439 \u041f\u0440\u043e\u0454\u043a\u0442",OpenProject:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u041f\u0440\u043e\u0454\u043a\u0442",SaveProjectAs:"Save Project As",YouMustLogInToCreateProject:"\u0412\u0438 \u043f\u043e\u0432\u0438\u043d\u043d\u0456 \u0443\u0432\u0456\u0439\u0442\u0438, \u0449\u043e\u0431 \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043d\u043e\u0432\u0438\u0439 \u043f\u0440\u043e\u0454\u043a\u0442",YouMustLogInToOpenProject:"\u0412\u0438 \u043f\u043e\u0432\u0438\u043d\u043d\u0456 \u0443\u0432\u0456\u0439\u0442\u0438, \u0449\u043e\u0431 \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u043f\u0440\u043e\u0454\u043a\u0442"},fileSubMenu:"\u0424\u0430\u0439\u043b",file:{CreateNewFile:"\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043d\u043e\u0432\u0438\u0439",OpenLocalFile:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e",SaveAsLocalFile:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u044f\u043a",SavingAbortedMustHaveValidFileName:"\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u044f \u043f\u0435\u0440\u0435\u0440\u0432\u0430\u043d\u043e! \u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043c\u0430\u0442\u0438 \u0434\u0456\u0439\u0441\u043d\u0435 \u0456\u043c'\u044f \u0444\u0430\u0439\u043b\u0443",OpenCloudFile:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",SaveCloudFile:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",SaveAsCloudFile:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",SavingAbortedMustHaveValidTitle:"\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u044f \u043f\u0435\u0440\u0435\u0440\u0432\u0430\u043d\u043e! \u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043c\u0430\u0442\u0438 \u0434\u0456\u0439\u0441\u043d\u0438\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u043b\u044f \u0445\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0443",ToSaveYourWorkPleaseSignIn:"\u0429\u043e\u0431 \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0432\u0430\u0448\u0443 \u0440\u043e\u0431\u043e\u0442\u0443, \u0431\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u0443\u0432\u0456\u0439\u0434\u0456\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.",TakeScreenshot:"\u0417\u0440\u043e\u0431\u0438\u0442\u0438 \u0437\u043d\u0456\u043c\u043e\u043a \u0435\u043a\u0440\u0430\u043d\u0430",UseCloudFileName:"\u0412\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u0456\u043c'\u044f \u0444\u0430\u0439\u043b\u0443 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",PublishOnModelsMap:"\u041e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0456 \u043c\u043e\u0434\u0435\u043b\u0435\u0439",PublishedOnModelsMap:"\u0412\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u043b\u043e \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043a\u0430\u0440\u0442\u0456 \u043c\u043e\u0434\u0435\u043b\u0435\u0439",UpdatedOnModelsMap:"\u0412\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u043b\u0430 \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0456 \u043c\u043e\u0434\u0435\u043b\u0435\u0439",YouMustLogInToPublishYourModel:"\u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u0443\u0432\u0456\u0439\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0449\u043e\u0431 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u0441\u0432\u043e\u044e \u043c\u043e\u0434\u0435\u043b\u044c",YouCannotPublishAModelThatYouDoNotOwn:"\u0412\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c, \u044f\u043a\u043e\u044e \u043d\u0435 \u0432\u043e\u043b\u043e\u0434\u0456\u0454\u0442\u0435",YouMustSaveModelOnCloudBeforePublishingIt:"\u0412\u0430\u043c \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456 \u043f\u0435\u0440\u0435\u0434 \u0457\u0457 \u043f\u0443\u0431\u043b\u0456\u043a\u0430\u0446\u0456\u0454\u044e"},editSubMenu:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438",edit:{Undo:"\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438",Redo:"\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0438"},viewSubMenu:"\u041f\u0435\u0440\u0435\u0433\u043b\u044f\u0434",view:{NavigationView:"Navigation View",TwoDimensionalView:"2D \u0412\u0438\u0433\u043b\u044f\u0434",ResetView:"\u0421\u043a\u0438\u043d\u0443\u0442\u0438",ZoomIn:"\u0417\u0431\u0456\u043b\u044c\u0448\u0438\u0442\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431",ZoomOut:"\u0417\u043c\u0435\u043d\u0448\u0438\u0442\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431",AutoRotate:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0438\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442",ShowShadow:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0442\u0456\u043d\u044c",ShowSurfaceShininess:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0431\u043b\u0438\u0441\u043a \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",TranslucentFloatingWindows:"\u041d\u0430\u043f\u0456\u0432\u043f\u0440\u043e\u0437\u043e\u0440\u0456 \u043f\u043b\u0430\u0432\u0430\u044e\u0447\u0456 \u0432\u0456\u043a\u043d\u0430",accessoriesSubMenu:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438",accessories:{SiteInformation:"\u0406\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u044f \u043f\u0440\u043e \u043c\u0456\u0441\u0446\u0435",DesignInformation:"\u0406\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u044f \u043f\u0440\u043e \u0434\u0438\u0437\u0430\u0439\u043d",Instruction:"\u0406\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0456\u044f",StickyNote:"\u041f\u0440\u0438\u043c\u0456\u0442\u043a\u0430",Note:"\u041f\u0440\u0438\u043c\u0456\u0442\u043a\u0430"}},settingsSubMenu:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f",settings:{WeatherData:"\u0414\u0430\u043d\u0456 \u043f\u0440\u043e \u043f\u043e\u0433\u043e\u0434\u0443",DiurnalTemperature:"\u0414\u043e\u0431\u043e\u0432\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430",Heliodon:"\u0413\u0435\u043b\u0456\u043e\u0434\u043e\u043d",SunAndTime:"\u0421\u043e\u043d\u0446\u0435 \u0442\u0430 \u0447\u0430\u0441"},benchmarksSubMenu:"\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438",benchmarks:{SolarRadiationPredictionVsMeasurement:"\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u0457 \u043f\u043e\u0440\u0456\u0432\u043d\u044f\u043d\u043e \u0437 \u0432\u0438\u043c\u0456\u0440\u044e\u0432\u0430\u043d\u043d\u044f\u043c",BESTESTCase600:"\u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0435\u043d\u0435\u0440\u0433\u043e\u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c: BESTEST Case 600",BESTESTCase610:"\u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0435\u043d\u0435\u0440\u0433\u043e\u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c: BESTEST Case 610",BESTESTCase620:"\u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0435\u043d\u0435\u0440\u0433\u043e\u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c: BESTEST Case 620",BESTESTCase630:"\u0422\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0435\u043d\u0435\u0440\u0433\u043e\u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c: BESTEST Case 630"},graph:{LineWidth:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u043b\u0456\u043d\u0456\u0457",SymbolSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u0443",BarCategoryGap:"\u0412\u0456\u0434\u0441\u0442\u0443\u043f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0456\u0439 \u0441\u0442\u043e\u0432\u043f\u0446\u0456\u0432",ShowHorizontalGridLines:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0456 \u043b\u0456\u043d\u0456\u0457 \u0441\u0456\u0442\u043a\u0438",ShowVerticalGridLines:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0456 \u043b\u0456\u043d\u0456\u0457 \u0441\u0456\u0442\u043a\u0438"},analysisSubMenu:"\u0410\u043d\u0430\u043b\u0456\u0437",physicsSubMenu:"\u0424\u0456\u0437\u0438\u043a\u0430",physics:{DailySolarRadiationHeatmap:"\u0429\u043e\u0434\u0435\u043d\u043d\u0430 \u043a\u0430\u0440\u0442\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u0457",SolarRadiationHeatmapOptions:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u043a\u0430\u0440\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u0457",SolarRadiationHeatmapGridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u0457",SolarRadiationHeatmapMaxValue:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0456",SolarRadiationHeatmapNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0457 \u043c\u043e\u0434\u0435\u043b\u0456",ReflectionHeatmap:"\u041a\u0430\u0440\u0442\u0430 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044c"},sensorSubMenu:"\u0414\u0430\u0442\u0447\u0438\u043a",sensor:{CollectDailyData:"\u0417\u0431\u0438\u0440\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0456 \u0434\u0430\u043d\u0456",CollectYearlyData:"\u0417\u0431\u0438\u0440\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0456 \u0434\u0430\u043d\u0456",SensorSimulationNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0434\u043b\u044f \u0437\u0431\u043e\u0440\u0443 \u0434\u0430\u043d\u0438\u0445 \u0434\u0430\u0442\u0447\u0438\u043a\u0430"},buildingSubMenu:"\u0411\u0443\u0434\u0456\u0432\u043b\u044f",building:{AnalyzeDailyBuildingEnergy:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0443 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",AnalyzeYearlyBuildingEnergy:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0443 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EnergyAnalysisOptions:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0430\u043d\u0430\u043b\u0456\u0437\u0443 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",EnergyGridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0441\u0456\u0442\u043a\u0438",BuildingEnergySimulationNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0441\u0438\u043c\u0443\u043b\u044e\u0432\u0430\u0442\u0438 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456"},solarPanelSubMenu:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c",solarPanel:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeVisibility:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u0456\u0441\u0442\u044c",PanelDiscretization:"\u0414\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0456\u044f \u043f\u0430\u043d\u0435\u043b\u0456",Exact:"\u0422\u043e\u0447\u043d\u0438\u0439",Approximate:"\u041d\u0430\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0439",EnergyGridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0441\u0456\u0442\u043a\u0438 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",VisibilityGridCellSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0441\u0456\u0442\u043a\u0438 \u043a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0456",EnergyAnalysisOptions:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0430\u043d\u0430\u043b\u0456\u0437\u0443 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",VisibilityAnalysisOptions:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0430\u043d\u0430\u043b\u0456\u0437\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0456",SolarPanelSimulationNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u0457 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456"},parabolicTroughSubMenu:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",parabolicTrough:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434"},parabolicDishSubMenu:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0434\u0438\u0441\u043a",parabolicDish:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434"},fresnelReflectorSubMenu:"\u0412\u0456\u0434\u0431\u0438\u0432\u0430\u0447 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",fresnelReflector:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434"},heliostatSubMenu:"\u0413\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442",heliostat:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434"},solarUpdraftTowerSubMenu:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c",solarUpdraftTower:{AnalyzeDailyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",AnalyzeYearlyYield:"\u0410\u043d\u0430\u043b\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0449\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",SolarUpdraftTowerSimulationNoAnimation:"\u041d\u0435\u043c\u0430\u0454 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0457 \u0441\u0438\u043c\u0443\u043b\u044e\u0432\u0430\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0443 \u0432\u0435\u0436\u0443 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c"},tutorialsSubMenu:"\u041f\u043e\u0441\u0456\u0431\u043d\u0438\u043a\u0438",solarEnergyScienceSubMenu:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u043d\u0430\u0443\u043a\u0430",solarEnergyScienceTutorials:{SunAngles:"\u041a\u0443\u0442\u0438 \u0441\u043e\u043d\u0446\u044f \u0432\u0456\u0434\u043d\u043e\u0441\u043d\u043e \u0441\u043f\u043e\u0441\u0442\u0435\u0440\u0456\u0433\u0430\u0447\u0430 \u043d\u0430 \u0437\u0435\u043c\u043b\u0456",InsolationAndClimate:"\u0406\u043d\u0441\u043e\u043b\u044f\u0446\u0456\u044f \u0442\u0430 \u043a\u043b\u0456\u043c\u0430\u0442",SolarRadiationToBox:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u044f \u0432 \u043a\u043e\u0440\u043e\u0431\u043a\u0443"},buildingScienceSubMenu:"\u041d\u0430\u0443\u043a\u0430 \u043f\u0440\u043e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",buildingScienceTutorials:{ThermalEnvelopeVsBuildingEnvelope:"\u0422\u0435\u043f\u043b\u043e\u0437\u0430\u0445\u0438\u0441\u043d\u0430 \u043e\u0431\u043e\u043b\u043e\u043d\u043a\u0430 \u043f\u0440\u043e\u0442\u0438 \u0431\u0443\u0434\u0456\u0432\u0435\u043b\u044c\u043d\u043e\u0457 \u043e\u0431\u043e\u043b\u043e\u043d\u043a\u0438",EffectOfSizeOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0440\u043e\u0437\u043c\u0456\u0440\u0443 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfOrientationOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0457 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfInsulationOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0456\u043d\u0441\u043e\u043b\u044f\u0446\u0456\u0457 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfRoofColorOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u043a\u043e\u043b\u044c\u043e\u0440\u0443 \u0434\u0430\u0445\u0443 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfEavesOverhangLengthOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0434\u043e\u0432\u0436\u0438\u043d\u0438 \u0432\u0438\u0441\u0442\u0443\u043f\u0443 \u043a\u0430\u0440\u043d\u0438\u0437\u0443 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfWindowSHGCOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u043a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043f\u043b\u043e\u0437\u0438\u0441\u043a\u0443 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfThermostatSetpointOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0437\u0430\u0434\u0430\u043d\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u043d\u0430 \u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0442\u0456 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfSolarPanelsOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfGroundTemperatureOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 \u0433\u0440\u0443\u043d\u0442\u0443 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456",EffectOfTreesOnBuildingEnergy:"\u0412\u043f\u043b\u0438\u0432 \u0434\u0435\u0440\u0435\u0432 \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044e \u0431\u0443\u0434\u0456\u0432\u043b\u0456"},buildingDesignSubMenu:"\u0414\u0438\u0437\u0430\u0439\u043d \u0431\u0443\u0434\u0456\u0432\u043b\u0456",buildingDesignTutorials:{CapeCodStyleHouseWithShedDormer:'\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0441\u0442\u0438\u043b\u0456 \u041a\u0435\u0439\u043f \u041a\u043e\u0434 \u0437 \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0454\u043c \u0442\u0438\u043f\u0443 "\u0448\u0435\u0434-\u0434\u043e\u0440\u043c\u0435\u0440"',MansardRoofWithDormers:"\u041c\u0430\u043d\u0441\u0430\u0440\u0434\u0430 \u0437 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0438\u043c\u0438 \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u044f\u043c\u0438",GableRoofVsHipRoof:"\u0421\u0445\u0438\u043b\u043e\u0432\u0438\u0439 \u0434\u0430\u0445 \u043f\u0440\u043e\u0442\u0438 \u0434\u0432\u043e\u0441\u0445\u0438\u043b\u0438\u0445 \u0434\u0430\u0445\u0456\u0432",ColonialVsSaltbox:"\u041a\u043e\u043b\u043e\u043d\u0456\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u0442\u0438\u043b\u044c \u043f\u0440\u043e\u0442\u0438 \u0441\u0442\u0438\u043b\u044e Saltbox",GambrelRoofVsMansardRoof:"\u041f\u0456\u0432\u0448\u0430\u0440\u043e\u0432\u0438\u0439 \u0434\u0430\u0445 \u043f\u0440\u043e\u0442\u0438 \u043c\u0430\u043d\u0441\u0430\u0440\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0445\u0443",CombinationRoofVsBonnetRoof:"\u041a\u043e\u043c\u0431\u0456\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u0430\u0445 \u043f\u0440\u043e\u0442\u0438 \u043a\u0430\u043f\u043e\u0442\u043d\u043e\u0433\u043e \u0434\u0430\u0445\u0443",DutchGableRoof:"\u0413\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0434\u0430\u0445 \u0437 \u0440\u0438\u043a\u0435\u0442\u043e\u043c",GableAndValleyRoof:"\u0421\u0445\u0438\u043b\u043e\u0432\u0438\u0439 \u0442\u0430 \u0434\u043e\u043b\u0438\u043d\u043d\u0438\u0439 \u0434\u0430\u0445",ClerestoryRoof:"\u041a\u043b\u0435\u0440\u0435\u0441\u0442\u043e\u0440\u043d\u0438\u0439 \u0434\u0430\u0445",MonitorRoof:"\u041c\u043e\u043d\u0456\u0442\u043e\u0440\u043d\u0438\u0439 \u0434\u0430\u0445",AFrameHouse:'\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0444\u043e\u0440\u043c\u0456 \u043b\u0456\u0442\u0435\u0440\u0438 "\u0410"',HalfTimberedHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0437 \u043d\u0430\u043f\u0456\u0432\u0434\u0435\u0440\u0435\u0432'\u044f\u043d\u0438\u043c\u0438 \u0441\u0442\u0456\u043d\u0430\u043c\u0438",AllBasicRoofTypes:"\u0423\u0441\u0456 \u043e\u0441\u043d\u043e\u0432\u043d\u0456 \u0442\u0438\u043f\u0438 \u0434\u0430\u0445\u0456\u0432"},photovoltaicSolarPowerSubMenu:"\u0424\u043e\u0442\u043e\u0435\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u043d\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f",photovoltaicSolarPowerTutorials:{EffectOfTiltAngleOfSolarPanel:"\u0412\u043f\u043b\u0438\u0432 \u043a\u0443\u0442\u0430 \u043d\u0430\u0445\u0438\u043b\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",EffectOfAzimuthOfSolarPanel:"\u0412\u043f\u043b\u0438\u0432 \u0430\u0437\u0438\u043c\u0443\u0442\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",SolarPanelTypes:"\u0422\u0438\u043f\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",VerticalBifacialSolarPanels:"Vertical Bifacial Solar Panels",CompareMonofacialAndBifacialSolarPanels:"Monofacial vs. Bifacial Solar Panels",SolarTrackers:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u0442\u0440\u0435\u043a\u0435\u0440\u0438",CoveringGroundWithSolarPanels:"\u0427\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043a\u0440\u0438\u0442\u0442\u044f \u0437\u0435\u043c\u043b\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u044f\u043c\u0438 - \u043d\u0435 \u043d\u0430\u0439\u043a\u0440\u0430\u0449\u0430 \u0456\u0434\u0435\u044f",InterRowSpacingOfSolarPanelArray:"\u0412\u043f\u043b\u0438\u0432 \u043c\u0456\u0436\u0440\u044f\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0443 \u0432 \u043c\u0430\u0441\u0438\u0432\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",EffectOfOrientationOfSolarPanels:"\u0412\u043f\u043b\u0438\u0432 \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0457 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarPanelArrayAutomaticLayout:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435 \u0440\u043e\u0437\u043c\u0456\u0449\u0435\u043d\u043d\u044f \u043c\u0430\u0441\u0438\u0432\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439"},concentratedSolarPowerSubMenu:"\u041a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u043e\u0432\u0430\u043d\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f",concentratedSolarPowerTutorials:{EffectOfAzimuthOfParabolicTrough:"\u0412\u043f\u043b\u0438\u0432 \u0430\u0437\u0438\u043c\u0443\u0442\u0443 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430",EffectOfLatusRectumOfParabolicTrough:"\u0412\u043f\u043b\u0438\u0432 \u043f\u0440\u044f\u043c\u043e\u0457 \u043b\u0456\u043d\u0456\u0457 \u043d\u0430 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",FocusSunlightWithParabolicDish:"\u0424\u043e\u043a\u0443\u0441\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u0441\u0432\u0456\u0442\u043b\u0430 \u0437\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u043e\u044e \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0443",LinearFresnelReflectors:"\u041b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",EffectOfAbsorberPipeHeightForLinearFresnelReflectors:"\u0412\u043f\u043b\u0438\u0432 \u0432\u0438\u0441\u043e\u0442\u0438 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u044e\u0447\u043e\u0457 \u0442\u0440\u0443\u0431\u043a\u0438 \u043d\u0430 \u043b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",EffectOfAzimuthOfLinearFresnelReflectors:"\u0412\u043f\u043b\u0438\u0432 \u0430\u0437\u0438\u043c\u0443\u0442\u0443 \u043d\u0430 \u043b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",LinearFresnelReflectorsWithTwoAbsorbers:"\u041b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u0437 \u0434\u0432\u043e\u043c\u0430 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u044e\u0447\u0438\u043c\u0438 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438",CosineEfficiencyOfHeliostats:"\u041a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432",ShadowingAndBlockingOfHeliostats:"\u0417\u0430\u0442\u0456\u043d\u0435\u043d\u043d\u044f \u0442\u0430 \u0431\u043b\u043e\u043a\u0443\u0432\u0430\u043d\u043d\u044f \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432",EffectSolarPowerTowerHeight:"\u0412\u043f\u043b\u0438\u0432 \u0432\u0438\u0441\u043e\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c",SolarPowerTower:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c"},otherTypesOfSolarPowerSubMenu:"\u0406\u043d\u0448\u0456 \u0442\u0438\u043f\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",otherTypesOfSolarPowerTutorials:{SolarUpdraftTower:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c"},generativeDesignSubMenu:"Generative Design",generativeDesignTutorials:{MonofacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Monofacial Solar Panel Array",BifacialSolarPanelArrayTiltAngle:"The Tilt Angle of a Bifacial Solar Panel Array",OutputOfSolarPanelArrayInDifferentPlaces:"The Output of a Solar Panel Array in Different Places",SimpleSolarFarmParetoFront:"The Pareto Front for Designing a Simple Solar Farm"},examplesSubMenu:"\u041f\u0440\u0438\u043a\u043b\u0430\u0434\u0438",solarEnergySubMenu:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f",solarEnergyExamples:{SunBeamAndHeliodon:"\u041f\u0440\u043e\u043c\u0456\u043d\u044c \u0441\u043e\u043d\u0446\u044f \u0442\u0430 \u0433\u0435\u043b\u0456\u043e\u0434\u043e\u043d",RooftopSolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0434\u0430\u0445\u0443",NevadaSolarOneParabolicTroughArray:"\u041c\u0430\u0441\u0438\u0432 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0456\u0432 Nevada Solar One",TooeleParabolicDishArray:"\u041c\u0430\u0441\u0438\u0432 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0442\u0430\u0440\u0456\u043b\u043e\u043a Tooele",PS10SolarPowerTower:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0435\u0442\u0438\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 PS10",TucsonLinearFresnelReflectors:"\u041b\u0456\u043d\u0456\u0439\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u0432 Tucson",SolarCanopyFormFactors:"\u0424\u043e\u0440\u043c\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u0437\u0438\u0440\u043a\u0456\u0432",SolarCanopyOverBleachers:"\u0421\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u0437\u0438\u0440\u043e\u043a \u043d\u0430\u0434 \u0442\u0440\u0438\u0431\u0443\u043d\u0430\u043c\u0438",SolarCanopyOverGarage:"\u0421\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u0437\u0438\u0440\u043e\u043a \u043d\u0430\u0434 \u0433\u0430\u0440\u0430\u0436\u0435\u043c",SolarBusStop:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u0430 \u0437\u0443\u043f\u0438\u043d\u043a\u0430",SolarFacadeTesla:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0444\u0430\u0441\u0430\u0434\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c Tesla",BuildingIntegratedPhotovoltaics:"\u0412\u0431\u0443\u0434\u043e\u0432\u0430\u043d\u0456 \u0444\u043e\u0442\u043e\u0435\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u043d\u0456 \u0441\u0438\u0441\u0442\u0435\u043c\u0438 \u0432 \u0431\u0443\u0434\u0456\u0432\u043b\u0456",Floatovoltaics:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u043f\u043b\u0430\u0432\u0443\u0447\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445",Agrivoltaics:"\u0410\u0433\u0440\u043e\u0432\u043e\u043b\u044c\u0442\u0430\u0457\u043a\u0430",VegetativeBuffer:"\u0412\u0435\u0433\u0435\u0442\u0430\u0442\u0438\u0432\u043d\u0430 \u0437\u043e\u043d\u0430",RainbowSwashSolarFarmBostonMA:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0444\u0435\u0440\u043c\u0430 Rainbow Swash \u0432 Boston, MA",MickeyMouseSolarFarmOrlandoFL:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0444\u0435\u0440\u043c\u0430 \u041c\u0456\u043a\u043a\u0456 \u041c\u0430\u0443\u0441\u0430 \u0432 Orlando, FL",SolarPanelsOverCanalBakersfieldCA:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430\u0434 \u043a\u0430\u043d\u0430\u043b\u043e\u043c \u0432 Bakersfield, CA",SolarNoiseBarrierLexingtonMA:"\u0421\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u0448\u0443\u043c\u043e\u0432\u0438\u0439 \u0431\u0430\u0440'\u0454\u0440 \u0432 Lexington, MA",HSATSolarTrackersRaleighNC:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u0442\u0440\u0435\u043a\u0435\u0440\u0438 \u0437 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u044e \u0432\u0456\u0441\u0441\u044e \u0432 Raleign, NC",AADATSolarTrackersLancasterCA:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u0442\u0440\u0435\u043a\u0435\u0440\u0438 \u0437 \u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u044e-\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u044e \u0432\u0456\u0441\u0441\u044e \u0432 Lancaster, CA",SolarUpdraftTowerInCity:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0438\u043c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043c \u0443 \u043c\u0456\u0441\u0442\u0456"},builtEnvironmentSubMenu:"\u0417\u0430\u0431\u0443\u0434\u043e\u0432\u0430\u043d\u0435 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0435",residentialBuildingsSubMenu:"\u0416\u0438\u0442\u043b\u043e\u0432\u0456 \u0431\u0443\u0434\u0456\u0432\u043b\u0456",residentialBuildingExamples:{ColonialHouse:"\u041a\u043e\u043b\u043e\u043d\u0456\u0430\u043b\u044c\u043d\u0438\u0439 \u0431\u0443\u0434\u0438\u043d\u043e\u043a",DutchColonialHouse:"\u0413\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043b\u043e\u043d\u0456\u0430\u043b\u044c\u043d\u0438\u0439 \u0431\u0443\u0434\u0438\u043d\u043e\u043a",TShapedHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0444\u043e\u0440\u043c\u0456 \u043b\u0456\u0442\u0435\u0440\u0438 \u0422",CapeCodHouseWithGarage:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0441\u0442\u0438\u043b\u0456 Cape Cod \u0437 \u0433\u0430\u0440\u0430\u0436\u0435\u043c",Solarium:"\u0421\u043e\u043b\u044f\u0440\u0456\u0439",Church1:"\u0426\u0435\u0440\u043a\u0432\u0430 1",Cathedral1:"\u0421\u043e\u0431\u043e\u0440 1",Cathedral2:"\u0421\u043e\u0431\u043e\u0440 2",Mosque1:"\u041c\u0435\u0447\u0435\u0442\u044c 1",AdobeTaosHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0437 \u0430\u0434\u043e\u0431\u0435 \u0432 \u0441\u0442\u0438\u043b\u0456 Taos",RanchHouse:"Ranch House",BonnetHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0432 \u0441\u0442\u0438\u043b\u0456 Bonnet",BarnStyleHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0443 \u0441\u0442\u0438\u043b\u0456 \u0430\u043c\u0431\u0430\u0440\u0430",ModernHouse:"\u0421\u0443\u0447\u0430\u0441\u043d\u0438\u0439 \u0431\u0443\u0434\u0438\u043d\u043e\u043a",ButterflyRoofHouse:"\u0411\u0443\u0434\u0438\u043d\u043e\u043a \u0437 \u043c\u0435\u0442\u0435\u043b\u0438\u043a\u043e\u0432\u0438\u043c \u0434\u0430\u0445\u043e\u043c"},commercialBuildingsSubMenu:"\u041a\u043e\u043c\u0435\u0440\u0446\u0456\u0439\u043d\u0456 \u0431\u0443\u0434\u0456\u0432\u043b\u0456",commercialBuildingExamples:{WhiteHouse:"\u0411\u0456\u043b\u0438\u0439 \u0414\u0456\u043c",BilimMersinTurkiye:"Bilim, Mersin, \u0422\u0443\u0440\u0435\u0447\u0447\u0438\u043d\u0430",SpanishStyleHotel:"\u0413\u043e\u0442\u0435\u043b\u044c \u0432 \u0456\u0441\u043f\u0430\u043d\u0441\u044c\u043a\u043e\u043c\u0443 \u0441\u0442\u0438\u043b\u0456",ApartmentBuilding:"\u0411\u0430\u0433\u0430\u0442\u043e\u043a\u0432\u0430\u0440\u0442\u0438\u0440\u043d\u0438\u0439 \u0431\u0443\u0434\u0438\u043d\u043e\u043a",OfficeBuilding:"\u041e\u0444\u0456\u0441\u043d\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u044f",Hotel:"\u0413\u043e\u0442\u0435\u043b\u044c"},buildingComplexesSubMenu:"\u0411\u0443\u0434\u0456\u0432\u0435\u043b\u044c\u043d\u0456 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0438",buildingComplexExamples:{SouthBurlingtonHighSchoolVermont:"South Burlington High School, Vermont",MescaleroApacheSchoolNewMexico:"Mescalero Apache School, New Mexico"},urbanPlanningSubMenu:"\u041c\u0456\u0441\u044c\u043a\u0435 \u043f\u043b\u0430\u043d\u0443\u0432\u0430\u043d\u043d\u044f",urbanPlanningExamples:{Heatmap1:"\u0422\u0435\u043f\u043b\u043e\u0432\u0430 \u043a\u0430\u0440\u0442\u0430"},otherBuildingsSubMenu:"\u0406\u043d\u0448\u0456 \u0431\u0443\u0434\u0456\u0432\u043b\u0456",otherBuildingExamples:{Greenhouse:"\u0422\u0435\u043f\u043b\u0438\u0446\u044f",Pavilion:"\u041f\u0430\u0432\u0456\u043b\u044c\u0439\u043e\u043d \u0443 \u043f\u0430\u0440\u043a\u0443",OctagonalPagoda:"\u0412\u043e\u0441\u044c\u043c\u0438\u043a\u0443\u0442\u043d\u0430 \u043f\u0430\u0433\u043e\u0434\u0430",OceanFront:"\u0411\u0443\u0434\u0456\u0432\u043b\u044f \u0431\u0456\u043b\u044f \u043e\u043a\u0435\u0430\u043d\u0443",EgyptianPyramids:"\u0404\u0433\u0438\u043f\u0435\u0442\u0441\u044c\u043a\u0456 \u043f\u0456\u0440\u0430\u043c\u0456\u0434\u0438",MayanPyramid:"\u041f\u0456\u0440\u0430\u043c\u0456\u0434\u0430 \u041c\u0430\u044f",SiOSePol:"Si-O-Se-Pol",StackedCuboids:"\u0421\u0442\u0435\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438"},artificialIntelligenceSubMenu:"\u0428\u0442\u0443\u0447\u043d\u0438\u0439 \u0456\u043d\u0442\u0435\u043b\u0435\u043a\u0442",artificialIntelligenceExamples:{OptimizingTiltAngleOfOneSolarPanelRow:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f \u043a\u0443\u0442\u0430 \u043d\u0430\u0445\u0438\u043b\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",OptimizingTiltAnglesOfMultipleSolarPanelRows:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f \u043a\u0443\u0442\u0456\u0432 \u043d\u0430\u0445\u0438\u043b\u0443 \u0434\u0435\u043a\u0456\u043b\u044c\u043a\u043e\u0445 \u0440\u044f\u0434\u0456\u0432 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarFarmGenerativeDesign:"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0444\u0435\u0440\u043c\u0438",SolarFarmGenerativeDesignWithBlock:"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0444\u0435\u0440\u043c\u0438 \u0432 \u043f\u0440\u0438\u0441\u0443\u0442\u043d\u043e\u0441\u0442\u0456 \u043f\u0435\u0440\u0435\u0448\u043a\u043e\u0434\u0438",FitchburgSolarFarmGenerativeDesign:"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0444\u0435\u0440\u043c\u0438 \u0443 Fitchburg"},languageSubMenu:"\u041c\u043e\u0432\u0430",publicSubMenu:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u043e\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e",ModelsGallery:"\u0413\u0430\u043b\u0435\u0440\u0435\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439",ModelsMap:"\u041a\u0430\u0440\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439",AboutUs:"\u041f\u0440\u043e \u043d\u0430\u0441"},avatarMenu:{AccountSettings:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443",PrivacyStatementTitle:"User Privacy Protection Statement",PrivacyStatement:"\u041a\u043e\u043b\u0438 \u0432\u0438 \u0443\u0432\u0456\u0439\u0434\u0435\u0442\u0435, \u0432\u0430\u0448 Google ID \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u0434\u043e \u0432\u0430\u0448\u043e\u0433\u043e \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443 Aladdin. \u0412 \u043d\u0430\u0448\u0456\u0439 \u0431\u0430\u0437\u0456 \u0434\u0430\u043d\u0438\u0445 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u0435 \u0432\u0438\u043f\u0430\u0434\u043a\u043e\u0432\u0438\u0439 \u0430\u043b\u0444\u0430\u0432\u0456\u0442\u043d\u043e-\u0446\u0438\u0444\u0440\u043e\u0432\u0438\u0439 \u0440\u044f\u0434\u043e\u043a \u044f\u043a \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f. \u041c\u0438 \u043d\u0456\u043a\u043e\u043b\u0438 \u043d\u0435 \u0437\u0431\u0438\u0440\u0430\u0454\u043c\u043e \u043e\u0441\u043e\u0431\u0438\u0441\u0442\u043e \u0456\u0434\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u043e\u0432\u0430\u043d\u0443 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u044e, \u0442\u0430\u043a\u0443 \u044f\u043a \u0432\u0430\u0448\u0435 \u0456\u043c'\u044f \u0430\u0431\u043e \u0435\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430 \u043f\u043e\u0448\u0442\u0430. \u0414\u043b\u044f \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u044f \u0434\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u043e\u0457 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0457 \u043e\u0437\u043d\u0430\u0439\u043e\u043c\u0442\u0435\u0441\u044c \u0437 \u043d\u0430\u0448\u043e\u044e ",SignIn:"\u0423\u0432\u0456\u0439\u0442\u0438",SignOut:"\u0412\u0438\u0439\u0442\u0438",IfYouAreAStudent:"\u042f\u043a\u0449\u043e \u0432\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442"},skyMenu:{Axes:"\u0412\u0456\u0441\u0456",Theme:"\u0422\u0435\u043c\u0430\u0442\u0438\u043a\u0430",ThemeDefault:"\u0417\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c",ThemeDesert:"\u041f\u0443\u0441\u0442\u0435\u043b\u044f",ThemeDune:"\u0414\u044e\u043d\u0430",ThemeForest:"\u041b\u0456\u0441",ThemeGrassland:"\u0421\u0442\u0435\u043f",ThemeHill:"\u041f\u0430\u0433\u043e\u0440\u0431",ThemeLake:"\u041e\u0437\u0435\u0440\u043e",ThemeMountain:"\u0413\u043e\u0440\u0430",ThemeRural:"\u0421\u0456\u043b\u044c\u0441\u044c\u043a\u0430 \u043c\u0456\u0441\u0446\u0435\u0432\u0456\u0441\u0442\u044c",SunlightAttenuationCoefficientInAir:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u0437\u0430\u0442\u0443\u0445\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u0441\u0432\u0456\u0442\u043b\u0430 \u0443 \u043f\u043e\u0432\u0456\u0442\u0440\u0456",ConvectiveCoefficientOfAir:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u043a\u043e\u043d\u0432\u0435\u043a\u0446\u0456\u0457 \u043f\u043e\u0432\u0456\u0442\u0440\u044f",HighestTemperatureTimeInMinutes:"\u0427\u0430\u0441 \u043d\u0430\u0439\u0432\u0438\u0449\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 (\u0445\u0432\u0438\u043b\u0438\u043d\u0438)",SelectSunAnglesToShow:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043a\u0443\u0442\u0438 \u0441\u043e\u043d\u0446\u044f, \u044f\u043a\u0456 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0438",ShowAzimuthAngle:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0430\u0437\u0438\u043c\u0443\u0442\u043d\u0438\u0439 \u043a\u0443\u0442",ShowElevationAngle:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0432\u0438\u0441\u043e\u0442\u043d\u0438\u0439 \u043a\u0443\u0442",ShowZenithAngle:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0437\u0435\u043d\u0456\u0442\u043d\u0438\u0439 \u043a\u0443\u0442",DirectLightBrightnessAtNoon:"Direct Light Brightness at Noon",AmbientLightBrightnessAtNoon:"Ambient Light Brightness at Noon"},groundMenu:{MonthlyIrradianceLoss:"Monthly Irradiance Loss",Vegetation:"\u0420\u043e\u0441\u043b\u0438\u043d\u043d\u0456\u0441\u0442\u044c",LeafOutDay:"\u0414\u0435\u043d\u044c \u0440\u043e\u0437\u043f\u0443\u0441\u043a\u0430\u043d\u043d\u044f \u043b\u0438\u0441\u0442\u044f",LeafOffDay:"\u0414\u0435\u043d\u044c \u043e\u043f\u0430\u0434\u0430\u043d\u043d\u044f \u043b\u0438\u0441\u0442\u044f",Albedo:"\u0410\u043b\u044c\u0431\u0435\u0434\u043e",ImageOnGround:"\u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",WaterSurface:"\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u044f \u0432\u043e\u0434\u0438",RemoveAllUnlockedTrees:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0435\u0440\u0435\u0432\u0430",RemoveAllUnlockedFlowers:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0432\u0456\u0442\u0438",RemoveAllUnlockedSolarPanels:"Remove All Unlocked Solar Panels",RemoveAllUnlockedPeople:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043b\u044e\u0434\u0435\u0439",RemoveAllUnlockedFoundations:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0438",RemoveAllUnlockedCuboids:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438",DoYouReallyWantToRemoveAllPeople:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u043b\u044e\u0434\u0435\u0439, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",DoYouReallyWantToRemoveAllTrees:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0435\u0440\u0435\u0432\u0430, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",DoYouReallyWantToRemoveAllFlowers:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u0432\u0456\u0442\u0438, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",DoYouReallyWantToRemoveAllSolarPanels:"Do you really want to remove all the solar panels that are not locked",DoYouReallyWantToRemoveAllFoundations:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0438, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",DoYouReallyWantToRemoveAllCuboids:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438, \u0449\u043e \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",LockAllElements:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438",UnlockAllElements:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438"},labelSubMenu:{Label:"\u041c\u0456\u0442\u043a\u0430",LabelText:"\u0422\u0435\u043a\u0441\u0442 \u043c\u0456\u0442\u043a\u0438",LabelHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u043c\u0456\u0442\u043a\u0438",LabelSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043c\u0456\u0442\u043a\u0438",LabelFontSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443",LabelColor:"\u041a\u043e\u043b\u0456\u0440 \u043c\u0456\u0442\u043a\u0438",KeepShowingLabel:"\u0417\u0430\u043b\u0438\u0448\u0430\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u044e \u043c\u0456\u0442\u043a\u0443"},foundationMenu:{RemoveAllUnlockedSolarPanels:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",RemoveAllUnlockedParabolicTroughs:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438",RemoveAllUnlockedParabolicDishes:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0430\u043d\u0442\u0435\u043d\u0438",RemoveAllUnlockedFresnelReflectors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",RemoveAllUnlockedHeliostats:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438",RemoveAllUnlockedSensors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438",RemoveAllUnlockedLights:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043e\u0441\u0432\u0456\u0442\u043b\u044e\u0432\u0430\u043b\u044c\u043d\u0456 \u043f\u0440\u0438\u043b\u0430\u0434\u0438",RemoveAllUnlockedWalls:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u0442\u0456\u043d\u0438",RemoveAllUnlockedWindows:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0432\u0456\u043a\u043d\u0430",RemoveAllUnlockedDoors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0432\u0435\u0440\u0456",RemoveAllUnlockedPolygons:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",RemoveAllUnlockedHumans:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043b\u044e\u0434\u0435\u0439",RemoveAllUnlockedTrees:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0435\u0440\u0435\u0432\u0430",RemoveAllUnlockedFlowers:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043d\u0435\u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0432\u0456\u0442\u0438",Racks:"\u0421\u0442\u0435\u043b\u0430\u0436\u0456",Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",SolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",SolarPanelArray:"Solar Panel Array",DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",ParabolicTroughs:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438",DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",ParabolicDishes:"\u041f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0430\u043d\u0442\u0435\u043d\u0438",DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0430\u043d\u0442\u0435\u043d\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",FresnelReflectors:"\u0412\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Heliostats:"\u0413\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438",DoYouReallyWantToRemoveAllHeliostatsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Sensors:"\u0414\u0430\u0442\u0447\u0438\u043a\u0438",DoYouReallyWantToRemoveAllSensorsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Lights:"\u0421\u0432\u0456\u0442\u0438\u043b\u044c\u043d\u0438\u043a\u0438",DoYouReallyWantToRemoveAllLightsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0432\u0456\u0442\u0438\u043b\u044c\u043d\u0438\u043a\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Walls:"\u0421\u0442\u0456\u043d\u0438",DoYouReallyWantToRemoveAllWallsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0442\u0456\u043d\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Windows:"\u0412\u0456\u043a\u043d\u0430",DoYouReallyWantToRemoveAllWindowsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Doors:"\u0414\u0432\u0435\u0440\u0456",DoYouReallyWantToRemoveAllDoorsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0432\u0435\u0440\u0456 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Polygons:"\u0411\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0438\u043a\u0438",DoYouReallyWantToRemoveAllPolygonsOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0431\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0438\u043a\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Humans:"\u041b\u044e\u0434\u0438",DoYouReallyWantToRemoveAllHumansOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u043b\u044e\u0434\u0435\u0439 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Trees:"\u0414\u0435\u0440\u0435\u0432\u0430",DoYouReallyWantToRemoveAllTreesOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",Flowers:"\u041a\u0432\u0456\u0442\u0438",DoYouReallyWantToRemoveAllFlowersOnFoundation:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u0432\u0456\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0454 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u043c\u0438",OnlyThisFoundation:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442",AllConnectedFoundations:"\u0412\u0441\u0456 \u043f\u043e\u0432\u2019\u044f\u0437\u0430\u043d\u0456 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0438",AllSelectedFoundations:"All Selected Foundations",AllFoundations:"\u0412\u0441\u0456 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0438",AddPolygon:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0431\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0438\u043a",SolarStructure:"\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443",GroupMaster:"\u0413\u0440\u0443\u043f\u043e\u0432\u0438\u0439 \u043c\u0430\u0439\u0441\u0442\u0435\u0440",LockAllElementsOnThisFoundation:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456",UnlockAllElementsOnThisFoundation:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0456",GroundFloorRValue:"\u0422\u0435\u043f\u043b\u043e\u043f\u0440\u043e\u0432\u0456\u0434\u043d\u0456\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u0438\u0442\u0442\u044f \u0446\u043e\u043a\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u0443",OnlyThisGroundFloor:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u043e\u043a\u043e\u043b\u044c\u043d\u0438\u0439 \u043f\u043e\u0432\u0435\u0440\u0445",AllGroundFloors:"\u0412\u0441\u0456 \u0446\u043e\u043a\u043e\u043b\u044c\u043d\u0456 \u043f\u043e\u0432\u0435\u0440\u0445\u0438"},solarPowerTowerMenu:{ReceiverTowerForHeliostats:"\u0412\u0435\u0436\u0430 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430 \u0434\u043b\u044f \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432",ReceiverTowerPhysicalProperties:"\u0424\u0456\u0437\u0438\u0447\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u0432\u0435\u0436\u0456 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverTowerHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0432\u0435\u0436\u0456 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverTowerRadius:"\u0420\u0430\u0434\u0456\u0443\u0441 \u0432\u0435\u0436\u0456 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverAbsorptance:"\u041f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverOpticalEfficiency:"\u041e\u043f\u0442\u0438\u0447\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReceiverThermalEfficiency:"\u0422\u0435\u043f\u043b\u043e\u0432\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430"},solarAbsorberPipeMenu:{AbsorberPipeForFresnelReflectors:"\u0422\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u0456\u0434 \u0434\u043b\u044f \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456\u0432 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",AbsorberPipePhysicalProperties:"\u0424\u0456\u0437\u0438\u0447\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u0442\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0442\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberApertureWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u043e\u0442\u0432\u043e\u0440\u0443 \u0442\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberPipePoleNumber:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043f\u043e\u043b\u044e\u0441\u0456\u0432 \u0434\u043b\u044f \u0442\u0440\u0443\u0431\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberAbsorptance:"\u0421\u0438\u043b\u0430 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",AbsorberOpticalEfficiency:"\u041e\u043f\u0442\u0438\u0447\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u0447\u0430",AbsorberThermalEfficiency:"\u0422\u0435\u043f\u043b\u043e\u0432\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u0447\u0430"},solarUpdraftTowerMenu:{SolarUpdraftTower:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u0432\u0435\u0436\u0430 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerPhysicalProperties:"\u0424\u0456\u0437\u0438\u0447\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerChimneyHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0434\u0438\u043c\u043e\u0432\u043e\u0457 \u0442\u0440\u0443\u0431\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerChimneyRadius:"\u0420\u0430\u0434\u0456\u0443\u0441 \u0434\u0438\u043c\u043e\u0432\u043e\u0457 \u0442\u0440\u0443\u0431\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerCollectorHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerCollectorRadius:"\u0420\u0430\u0434\u0456\u0443\u0441 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerCollectorTransmissivity:"\u041f\u0440\u043e\u043d\u0438\u043a\u043d\u0456\u0441\u0442\u044c \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerCollectorEmissivity:"\u0412\u0438\u043f\u0440\u043e\u043c\u0456\u043d\u044e\u0432\u0430\u043d\u0456\u0441\u0442\u044c \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerDischargeCoefficient:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u0432\u0438\u043a\u0438\u0434\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c",SolarUpdraftTowerTurbineEfficiency:"\u0415\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u0442\u0443\u0440\u0431\u0456\u043d\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0437 \u0442\u044f\u0433\u043e\u0432\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c"},cuboidMenu:{Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",RemoveAllUnlockedSolarPanels:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",RemoveAllUnlockedSensors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438",RemoveAllUnlockedPolygons:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",RemoveAllUnlockedHumans:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043b\u044e\u0434\u0435\u0439",RemoveAllUnlockedTrees:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0435\u0440\u0435\u0432\u0430",RemoveAllUnlockedFlowers:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043a\u0432\u0456\u0442\u0438",Racks:"\u0421\u0442\u0456\u0439\u043a\u0438",SolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Sensors:"\u0421\u0435\u043d\u0441\u043e\u0440\u0438",DoYouReallyWantToRemoveAllSensorsOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Polygons:"\u041f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",DoYouReallyWantToRemoveAllPolygonsOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Humans:"\u041b\u044e\u0434\u0438",DoYouReallyWantToRemoveAllHumansOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456\u0445 \u043b\u044e\u0434\u0435\u0439 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Trees:"\u0414\u0435\u0440\u0435\u0432\u0430",DoYouReallyWantToRemoveAllTreesOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",Flowers:"\u041a\u0432\u0456\u0442\u0438",DoYouReallyWantToRemoveAllFlowersOnCuboid:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u0432\u0456\u0442\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u043a\u0443\u0431\u043e\u0457\u0434\u0456, \u044f\u043a\u0456 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456",OnlyThisCuboid:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u043a\u0443\u0431\u043e\u0457\u0434",AllCuboidsOnSameSurface:"\u0423\u0441\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438 \u043d\u0430 \u043e\u0434\u043d\u0456\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",AllCuboidsAboveSameBase:"\u0423\u0441\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438 \u043d\u0430\u0434 \u0442\u0456\u0454\u044e \u0436 \u043e\u0441\u043d\u043e\u0432\u043e\u044e",AllSelectedCuboids:"All Selected Cuboids",AllCuboids:"\u0412\u0441\u0456 \u043a\u0443\u0431\u043e\u0457\u0434\u0438",OnlyThisSide:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430",AllSidesOfThisCuboid:"\u0412\u0441\u0456 \u0441\u0442\u043e\u0440\u043e\u043d\u0438 \u0446\u044c\u043e\u0433\u043e \u043a\u0443\u0431\u043e\u0457\u0434\u0430",AllSidesOfSelectedCuboids:"All Sides of Selected Cuboids",AllSidesOfAllCuboids:"\u0412\u0441\u0456 \u0441\u0442\u043e\u0440\u043e\u043d\u0438 \u0432\u0441\u0456\u0445 \u043a\u0443\u0431\u043e\u0457\u0434\u0456\u0432",AddPolygon:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u043e\u043b\u0456\u0433\u043e\u043d",Stackable:"\u0421\u0442\u0435\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u0435",GroupMaster:"\u041c\u0430\u0439\u0441\u0442\u0435\u0440 \u0433\u0440\u0443\u043f\u0438"},polygonMenu:{Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",TextBox:"\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u0435 \u043f\u043e\u043b\u0435",FontOutlineColor:"\u041a\u043e\u043b\u0456\u0440 \u043a\u043e\u043d\u0442\u0443\u0440\u0443 \u0448\u0440\u0438\u0444\u0442\u0443",FontOutlineWidth:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u0443 \u0448\u0440\u0438\u0444\u0442\u0443",FontStrokeColor:"\u041a\u043e\u043b\u0456\u0440 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0448\u0440\u0438\u0444\u0442\u0443",FontStrokeWidth:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0448\u0440\u0438\u0444\u0442\u0443",NoOutline:"\u0411\u0435\u0437 \u043a\u043e\u043d\u0442\u0443\u0440\u0443",Shiny:"\u0411\u043b\u0438\u0441\u043a\u0443\u0447\u0438\u0439",Filled:"\u0417\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u0438\u0439",FillTexture:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0437\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u043d\u044f",FillColor:"\u041a\u043e\u043b\u0456\u0440 \u0437\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u043d\u044f",Opacity:"\u041f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",LineColor:"\u041a\u043e\u043b\u0456\u0440 \u043b\u0456\u043d\u0456\u0457",LineWidth:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u043b\u0456\u043d\u0456\u0457",LineStyle:"\u0421\u0442\u0438\u043b\u044c \u043b\u0456\u043d\u0456\u0457",SolidLine:"\u0421\u0443\u0446\u0456\u043b\u044c\u043d\u0430 \u043b\u0456\u043d\u0456\u044f",DashedLine:"\u041f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u0430 \u043b\u0456\u043d\u0456\u044f",DottedLine:"\u0422\u043e\u0447\u043a\u043e\u0432\u0430 \u043b\u0456\u043d\u0456\u044f",InsertVertexBeforeIndex:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043f\u0435\u0440\u0435\u0434 \u0456\u043d\u0434\u0435\u043a\u0441\u043e\u043c",InsertVertexAfterIndex:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043f\u0456\u0441\u043b\u044f \u0456\u043d\u0434\u0435\u043a\u0441\u0443",DeleteVertex:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0443",OnlyThisPolygon:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u043f\u043e\u043b\u0456\u0433\u043e\u043d",AllPolygonsOnSurface:"\u0412\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438 \u043d\u0430 \u0446\u0456\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",AllPolygonsAboveFoundation:"\u0412\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438 \u0432\u0438\u0449\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0443",AllSelectedPolygons:"All Selected Polygons",AllPolygons:"\u0412\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",Layout:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f",SolarPanelArrayLayout:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarPanelArrayLayoutParametricDesign:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d",SolarPanelArrayLayoutGenerativeDesign:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439: \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0438\u0439 \u0434\u0438\u0437\u0430\u0439\u043d",SolarPanelArrayModel:"\u041c\u043e\u0434\u0435\u043b\u044c \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",SolarPanelArrayOrientation:"\u041e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u044f",SolarPanelArrayTiltAngle:"\u041a\u0443\u0442 \u043d\u0430\u0445\u0438\u043b\u0443",SolarPanelArrayRowWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u044f\u0434\u0443",SolarPanelArrayInterRowSpacing:"\u041c\u0456\u0436\u0440\u044f\u0434\u043a\u043e\u0432\u0438\u0439 \u0456\u043d\u0442\u0435\u0440\u0432\u0430\u043b",SolarPanelArrayRowSpacing:"Row Spacing",SolarPanelArrayRowAxis:"\u0412\u0456\u0441\u044c \u0440\u044f\u0434\u0443",SolarPanelArrayLeftRightRowAxis:"\u041d\u0430\u043b\u0456\u0432\u043e-\u041d\u0430\u043f\u0440\u0430\u0432\u043e (\u0432\u0456\u0434\u043d\u043e\u0441\u043d\u0435)",SolarPanelArrayUpDownRowAxis:"\u0412\u0433\u043e\u0440\u0443-\u0412\u043d\u0438\u0437 (\u0432\u0456\u0434\u043d\u043e\u0441\u043d\u0435)",SolarPanelArrayEastWestRowAxis:"\u0421\u0445\u0456\u0434-\u0417\u0430\u0445\u0456\u0434 (\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0435)",SolarPanelArrayNorthSouthRowAxis:"\u041f\u0456\u0432\u043d\u0456\u0447-\u041f\u0456\u0432\u0434\u0435\u043d\u044c (\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0435)",SolarPanelArrayMargin:"\u0412\u0456\u0434\u0441\u0442\u0443\u043f",SolarPanelArrayPoleHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430",SolarPanelArrayPoleSpacing:"\u0406\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u0456\u0436 \u0441\u0442\u043e\u0432\u043f\u0430\u043c\u0438",SolarPanelArrayTotalYearlyCost:"Total Cost",SolarPanelArrayTotalYearlyRevenue:"Total Revenue",SolarPanelArrayTotalYearlyYield:"Total Yield",SolarPanelArrayMeanYearlyYield:"Mean Yield",SolarPanelArrayYearlyProfit:"Profit",LayoutNotAcceptedCheckYourParameters:"\u0426\u0435 \u0440\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u043d\u0435 \u043f\u0440\u0438\u0439\u043c\u0430\u0454\u0442\u044c\u0441\u044f. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u043f\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0432\u0430\u0448\u0456 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438."},optimizationMenu:{Optimization:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f",Parameters:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438",Variables:"\u0417\u043c\u0456\u043d\u043d\u0456",Constants:"\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438",GeneticAlgorithm:"\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u043d\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c",GeneticAlgorithmSettings:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443",ParticleSwarmOptimization:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f \u0440\u043e\u0454\u043c \u0447\u0430\u0441\u0442\u0438\u043d\u043e\u043a",ParticleSwarmOptimizationSettings:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u0457 \u0440\u043e\u0454\u043c \u0447\u0430\u0441\u0442\u0438\u043d\u043e\u043a",SolarPanelTiltAngleOptimization:"\u041e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u044f \u043a\u0443\u0442\u0430 \u043d\u0430\u0445\u0438\u043b\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarPanelArrayLayout:"\u0420\u043e\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",Generation:"\u041f\u043e\u043a\u043e\u043b\u0456\u043d\u043d\u044f",Gene:"\u0413\u0435\u043d",NormalizedVariables:"\u041d\u043e\u0440\u043c\u0430\u043b\u0456\u0437\u043e\u0432\u0430\u043d\u0456 \u0437\u043c\u0456\u043d\u043d\u0456",Objective:"\u0426\u0456\u043b\u044c",ObjectiveFunctionDailyTotalYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",ObjectiveFunctionYearlyTotalYield:"\u0429\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434",ObjectiveFunctionDailyMeanYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0441\u0435\u0440\u0435\u0434\u043d\u0456\u0439 \u0434\u043e\u0445\u0456\u0434",ObjectiveFunctionYearlyMeanYield:"\u0429\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u0441\u0435\u0440\u0435\u0434\u043d\u0456\u0439 \u0434\u043e\u0445\u0456\u0434",ObjectiveFunctionDailyProfit:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u043f\u0440\u0438\u0431\u0443\u0442\u043e\u043a",ObjectiveFunctionYearlyProfit:"\u0429\u043e\u0440\u0456\u0447\u043d\u0438\u0439 \u043f\u0440\u0438\u0431\u0443\u0442\u043e\u043a",GeneticAlgorithmSelectionMethod:"\u041c\u0435\u0442\u043e\u0434 \u0432\u0438\u0431\u043e\u0440\u0443 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443",RouletteWheel:"\u0412\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u043d\u0435 \u043a\u043e\u043b\u0435\u0441\u043e",Tournament:"\u0422\u0443\u0440\u043d\u0456\u0440",SearchMethod:"\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u0448\u0443\u043a\u0443",GlobalSearchUniformSelection:"\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0438\u0439 \u043f\u043e\u0448\u0443\u043a \u0437 \u043e\u0434\u043d\u043e\u0440\u0456\u0434\u043d\u0438\u043c \u0432\u0438\u0431\u043e\u0440\u043e\u043c",LocalSearchRandomOptimization:"\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0438\u0439 \u043f\u043e\u0448\u0443\u043a \u0432\u0438\u043f\u0430\u0434\u043a\u043e\u0432\u043e\u0457 \u043e\u043f\u0442\u0438\u043c\u0456\u0437\u0430\u0446\u0456\u0457",PopulationSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044f",MaximumGenerations:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043f\u043e\u043a\u043e\u043b\u0456\u043d\u044c",SelectionRate:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u0432\u0456\u0434\u0431\u043e\u0440\u0443",CrossoverRate:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u0441\u0445\u0440\u0435\u0449\u0443\u0432\u0430\u043d\u043d\u044f",MutationRate:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u043c\u0443\u0442\u0430\u0446\u0456\u0457",Step:"\u041a\u0440\u043e\u043a",SwarmSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0440\u043e\u044e",MaximumSteps:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043a\u0440\u043e\u043a\u0456\u0432",MaximumVelocity:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u0448\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c",InertiaWeight:"\u0412\u0430\u0433\u0430 \u0456\u043d\u0435\u0440\u0446\u0456\u0457",CognitiveCoefficient:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u043a\u043e\u0433\u043d\u0456\u0442\u0438\u0432\u043d\u043e\u0457 \u0444\u0443\u043d\u043a\u0446\u0456\u0457",SocialCoefficient:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u0441\u043e\u0446\u0456\u0430\u043b\u044c\u043d\u043e\u0457 \u0432\u0437\u0430\u0454\u043c\u043e\u0434\u0456\u0457",ConvergenceThreshold:"\u041f\u043e\u0440\u0456\u0433 \u0437\u0431\u0456\u0436\u043d\u043e\u0441\u0442\u0456 \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044f",LocalSearchRadius:"\u0420\u0430\u0434\u0456\u0443\u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0448\u0443\u043a\u0443",RowsPerRackRange:"\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u0440\u044f\u0434\u0456\u0432 \u043d\u0430 \u0441\u0442\u0435\u043b\u0430\u0436",TiltAngleRange:"\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u043a\u0443\u0442\u0430 \u043d\u0430\u0445\u0438\u043b\u0443",InterRowSpacingRange:"\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u043c\u0456\u0436\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0456\u0436\u043a\u0443",ClickTargetPolygonToActivate:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043d\u0430 \u0446\u0456\u043b\u044c\u043e\u0432\u0438\u0439 \u043f\u043e\u043b\u0456\u0433\u043e\u043d \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0456\u0457",ClickTargetFoundationToActivate:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043d\u0430 \u0446\u0456\u043b\u044c\u043e\u0432\u0438\u0439 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0456\u0457"},treeMenu:{ShowModel:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c",Flip:"\u041f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u0438",Type:"\u0422\u0438\u043f",Spread:"\u0420\u043e\u0437\u043f\u043e\u0432\u0441\u044e\u0434\u0436\u0435\u043d\u043d\u044f"},flowerMenu:{Flip:"\u041f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u0438",Type:"\u0422\u0438\u043f",Spread:"\u0420\u043e\u0437\u043f\u043e\u0432\u0441\u044e\u0434\u0436\u0435\u043d\u043d\u044f"},peopleMenu:{ChangePerson:"\u0417\u043c\u0456\u043d\u0438\u0442\u0438 \u043e\u0441\u043e\u0431\u0443",Flip:"\u041f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u0438",Observer:"\u0421\u043f\u043e\u0441\u0442\u0435\u0440\u0456\u0433\u0430\u0447",ViewFromThisPerson:"\u041f\u0435\u0440\u0435\u0433\u043b\u044f\u043d\u0443\u0442\u0438 \u0437 \u0446\u0456\u0454\u0457 \u043e\u0441\u043e\u0431\u0438"},lightMenu:{Color:"\u041a\u043e\u043b\u0456\u0440",Intensity:"\u0406\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u0456\u0441\u0442\u044c",Decay:"\u0417\u0430\u0442\u0443\u0445\u0430\u043d\u043d\u044f",MaximumDistance:"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u0432\u0456\u0434\u0441\u0442\u0430\u043d\u044c",Inside:"\u0423\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0456"},solarCollectorMenu:{RelativeAzimuth:"\u0412\u0456\u0434\u043d\u043e\u0441\u043d\u0438\u0439 \u0430\u0437\u0438\u043c\u0443\u0442",Pole:"\u0421\u0442\u043e\u0432\u043f",PoleHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430",PoleRadius:"Pole Radius",ExtraPoleHeight:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0430 \u0432\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430",ExtraPoleHeightInAdditionToHalfWidth:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0430 \u0432\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430 \u043d\u0430 \u0434\u043e\u0434\u0430\u0442\u043e\u043a \u0434\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0438 \u0448\u0438\u0440\u0438\u043d\u0438",DrawSunBeam:"\u041d\u0430\u043c\u0430\u043b\u044e\u0432\u0430\u0442\u0438 \u043f\u0440\u043e\u043c\u0456\u043d\u044c \u0441\u043e\u043d\u0446\u044f"},concentratedSolarPowerCollectorMenu:{ReflectorReflectance:"\u0412\u0456\u0434\u0431\u0438\u0432\u0430\u043d\u043d\u044f \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430",ReceiverAbsorptance:"\u041f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",ReflectorOpticalEfficiency:"\u041e\u043f\u0442\u0438\u0447\u043d\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430",ReceiverThermalEfficiency:"\u0422\u0435\u043f\u043b\u043e\u0432\u0430 \u0435\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430"},solarPanelMenu:{InverterEfficiency:"Inverter Efficiency",InverterEfficiencyExplained:"The efficiency for converting direct current (DC) to alternating current (AC).",DcToAcSizeRatio:"DC-to-AC Size Ratio",DcToAcSizeRatioExplained:"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.",ChangePvModel:"\u0417\u043c\u0456\u043d\u0438\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c",Orientation:"\u041e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u044f",Portrait:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430",Landscape:"\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430",FrameColor:"\u041a\u043e\u043b\u0456\u0440 \u0440\u0430\u043c\u043a\u0438",Panels:"\u043f\u0430\u043d\u0435\u043b\u0456",PanelsWide:"\u043f\u0430\u043d\u0435\u043b\u0456 \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0456",PanelsLong:"\u043f\u0430\u043d\u0435\u043b\u0456 \u043f\u043e \u0434\u043e\u0432\u0436\u0438\u043d\u0456",TiltAngle:"\u041a\u0443\u0442 \u043d\u0430\u0445\u0438\u043b\u0443",SouthFacingIsPositive:"\u041f\u0456\u0432\u0434\u0435\u043d\u044c \u0432\u0432\u0430\u0436\u0430\u0454\u0442\u044c\u0441\u044f \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u0438\u043c",Tracker:"\u0422\u0440\u0435\u043a\u0435\u0440",SolarTrackerFollowsSun:"\u0422\u0440\u0435\u043a\u0435\u0440 \u0441\u043b\u0456\u0434\u043a\u0443\u0454 \u0437\u0430 \u0441\u043e\u043d\u0446\u0435\u043c \u0434\u043b\u044f \u0437\u0431\u0456\u043b\u044c\u0448\u0435\u043d\u043d\u044f \u0432\u0438\u0445\u043e\u0434\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439.",PoleSpacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u0441\u0442\u043e\u0432\u043f\u0430\u043c\u0438",NoTracker:"\u0411\u0435\u0437 \u0442\u0440\u0435\u043a\u0435\u0440\u0430",HorizontalSingleAxisTracker:"\u0422\u0440\u0435\u043a\u0435\u0440 \u0437 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u044e \u043e\u0434\u043d\u043e\u043e\u0441\u0435\u0432\u043e\u044e \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0454\u044e",VerticalSingleAxisTracker:"\u0422\u0440\u0435\u043a\u0435\u0440 \u0437 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u044e \u043e\u0434\u043d\u043e\u043e\u0441\u0435\u0432\u043e\u044e \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0454\u044e",AltazimuthDualAxisTracker:"\u0422\u0440\u0435\u043a\u0435\u0440 \u0437 \u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u043e-\u0430\u043b\u044c\u0442\u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u044e \u0434\u0432\u043e\u043e\u0441\u0435\u0432\u043e\u044e \u043e\u0440\u0456\u0454\u043d\u0442\u0430\u0446\u0456\u0454\u044e",OnlyThisSolarPanel:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c",AllSolarPanelsOnSurface:"\u0412\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u043e\u0434\u043d\u0456\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u0456",AllSolarPanelsAboveFoundation:"\u0412\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430\u0434 \u043e\u0434\u043d\u0456\u0454\u044e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedSolarPanels:"All Selected Solar Panels",AllSolarPanels:"\u0412\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456"},pvModelPanel:{SolarPanelSpecs:"\u0422\u0435\u0445\u043d\u0456\u0447\u043d\u0456 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",Model:"\u041c\u043e\u0434\u0435\u043b\u044c",PanelSize:"\u0420\u043e\u0437\u043c\u0456\u0440 \u043f\u0430\u043d\u0435\u043b\u0456",Cells:"\u041a\u043e\u043c\u0456\u0440\u043a\u0438",CellType:"\u0422\u0438\u043f \u043a\u043e\u043c\u0456\u0440\u043e\u043a",Monocrystalline:"\u041c\u043e\u043d\u043e\u043a\u0440\u0438\u0441\u0442\u0430\u043b\u0456\u0447\u043d\u0456",Polycrystalline:"\u041f\u043e\u043b\u0456\u043a\u0440\u0438\u0441\u0442\u0430\u043b\u0456\u0447\u043d\u0456",ThinFilm:"\u0422\u043e\u043d\u043a\u043e\u043f\u043b\u0456\u0432\u043a\u043e\u0432\u0456",Bifacial:"Bifacial",BifacialityFactor:"Bifaciality Factor",Black:"\u0427\u043e\u0440\u043d\u0438\u0439",Blue:"\u0421\u0438\u043d\u0456\u0439",ShadeTolerance:"\u0421\u0442\u0456\u0439\u043a\u0456\u0441\u0442\u044c \u0434\u043e \u0437\u0430\u0442\u0456\u043d\u0435\u043d\u043d\u044f",SolarCellEfficiency:"\u0415\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0456\u0441\u0442\u044c \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043a\u043e\u043c\u0456\u0440\u043a\u0438",NominalOperatingCellTemperature:"\u041d\u043e\u043c\u0456\u043d\u0430\u043b\u044c\u043d\u0430 \u0440\u043e\u0431\u043e\u0447\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043a\u043e\u043c\u0456\u0440\u043a\u0438",TemperatureCoefficientOfPmax:"\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u0438\u0439 \u043a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 Pmax"},parabolicTroughMenu:{ModuleLength:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044f",Modules:"\u043c\u043e\u0434\u0443\u043b\u0456",ModulesLong:"\u043c\u043e\u0434\u0443\u043b\u0456\u0432 \u0443 \u0434\u043e\u0432\u0436\u0438\u043d\u0443",LatusRectum:"\u0412\u0435\u043b\u0438\u043a\u0430 \u043f\u0456\u0432\u0432\u0456\u0441\u044c",OnlyThisParabolicTrough:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",AllParabolicTroughsAboveFoundation:"\u0423\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438 \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedParabolicTroughs:"All Selected Parabolic Troughs",AllParabolicTroughs:"\u0423\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0438"},fresnelReflectorMenu:{AbsorberPipe:"\u0422\u0440\u0443\u0431\u0430 \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u043d\u043d\u044f",SelectAbsorberToReflectSunlightTo:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043f\u043e\u0433\u043b\u0438\u043d\u0430\u0447, \u0434\u043e \u044f\u043a\u043e\u0433\u043e \u0431\u0443\u0434\u0435 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0442\u0438\u0441\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0435 \u0441\u0432\u0456\u0442\u043b\u043e",ModuleLength:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044f",Modules:"\u043c\u043e\u0434\u0443\u043b\u0456",ModulesLong:"\u043c\u043e\u0434\u0443\u043b\u0456\u0432 \u0443 \u0434\u043e\u0432\u0436\u0438\u043d\u0443",OnlyThisFresnelReflector:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",AllFresnelReflectorsAboveFoundation:"\u0423\u0441\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedFresnelReflectors:"All Selected Fresnel Reflectors",AllFresnelReflectors:"\u0423\u0441\u0456 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456 \u0424\u0440\u0435\u043d\u0435\u043b\u044f"},heliostatMenu:{Tower:"\u0412\u0435\u0436\u0430",SelectTowerToReflectSunlightTo:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u0432\u0435\u0436\u0443, \u0434\u043e \u044f\u043a\u043e\u0457 \u0431\u0443\u0434\u0435 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0442\u0438\u0441\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u0435 \u0441\u0432\u0456\u0442\u043b\u043e",OnlyThisHeliostat:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442",AllHeliostatsAboveFoundation:"\u0423\u0441\u0456 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438 \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedHeliostats:"All Selected Heliostats",AllHeliostats:"\u0423\u0441\u0456 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0438"},parabolicDishMenu:{ReceiverStructure:"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u0439\u043c\u0430\u0447\u0430",CentralPole:"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u0442\u043e\u0432\u043f",CentralPoleWithTripod:"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u0442\u043e\u0432\u043f \u0437 \u0442\u0440\u0438\u043d\u043e\u0433\u043e\u044e",Quadrupod:"\u0427\u043e\u0442\u0438\u0440\u0438\u043d\u043e\u0433\u0430",RimDiameter:"\u0414\u0456\u0430\u043c\u0435\u0442\u0440 \u043e\u0431\u043e\u0434\u0443",LatusRectum:"\u0412\u0435\u043b\u0438\u043a\u0430 \u043f\u0456\u0432\u0432\u0456\u0441\u044c",ExtraPoleHeightInAdditionToRadius:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0430 \u0432\u0438\u0441\u043e\u0442\u0430 \u0441\u0442\u043e\u0432\u043f\u0430 \u043f\u043b\u044e\u0441 \u0440\u0430\u0434\u0456\u0443\u0441",OnlyThisParabolicDish:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0430 \u0442\u0430\u0440\u0456\u043b\u043a\u0430",AllParabolicDishesAboveFoundation:"\u0423\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0442\u0430\u0440\u0456\u043b\u043a\u0438 \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedParabolicDishes:"All Selected Parabolic Dishes",AllParabolicDishes:"\u0423\u0441\u0456 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0456 \u0442\u0430\u0440\u0456\u043b\u043a\u0438"},wallMenu:{TextureDefault:"\u0422\u0438\u043f\u043e\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430",Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",SizeOfWall:"\u0420\u043e\u0437\u043c\u0456\u0440 \u0441\u0442\u0456\u043d\u0438",OnlyThisWall:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u0441\u0442\u0456\u043d\u0430",AllConnectedWalls:"\u0412\u0441\u0456 \u043f\u043e\u0432'\u044f\u0437\u0430\u043d\u0456 \u0441\u0442\u0456\u043d\u0438",AllWallsAboveFoundation:"\u0412\u0441\u0456 \u0441\u0442\u0456\u043d\u0438 \u043d\u0430\u0434 \u0446\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedWalls:"All Selected Walls",AllWalls:"\u0412\u0441\u0456 \u0441\u0442\u0456\u043d\u0438",Windows:"\u0412\u0456\u043a\u043d\u0430",LockAllWindows:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",UnlockAllWindows:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",RemoveAllUnlockedWindows:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0432\u0456\u043a\u043d\u0430",DoYouReallyWantToRemoveAllWindowsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",Doors:"\u0414\u0432\u0435\u0440\u0456",RemoveAllUnlockedDoors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0432\u0435\u0440\u0456",DoYouReallyWantToRemoveAllDoorsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0432\u0435\u0440\u0456 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",SolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",LockAllSolarPanels:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",UnlockAllSolarPanels:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",RemoveAllUnlockedSolarPanels:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",Sensors:"\u0414\u0430\u0442\u0447\u0438\u043a\u0438",LockAllSensors:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438",UnlockAllSensors:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438",RemoveAllUnlockedSensors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438",DoYouReallyWantToRemoveAllSensorsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",Lights:"\u041b\u0430\u043c\u043f\u0438",RemoveAllUnlockedLights:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043b\u0430\u043c\u043f\u0438",DoYouReallyWantToRemoveAllLightsOnThisWall:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",LockAllPolygons:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",UnlockAllPolygons:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",RemoveAllUnlockedPolygons:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043f\u043e\u043b\u0456\u0433\u043e\u043d\u0438",WallStructure:"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0456\u043d\u0438",DefaultStructure:"\u0422\u0438\u043f\u043e\u0432\u0430",StudStructure:"\u0421\u0442\u0443\u0434",PillarStructure:"\u041f\u0456\u043b\u0430\u0440",Opacity:"\u041d\u0435\u043f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",StructureSpacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438",StructureWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438",StructureThickness:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438",StructureColor:"\u041a\u043e\u043b\u0456\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438",Color:"\u041a\u043e\u043b\u0456\u0440 \u0441\u0442\u0456\u043d\u0438",Height:"\u0412\u0438\u0441\u043e\u0442\u0430",Thickness:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430",Texture:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430",AllLightsOnWallInside:"\u0412\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u0432\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0456 \u0441\u0442\u0456\u043d\u0438",AllLightsOnWallOutside:"\u0412\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u0437\u0437\u043e\u0432\u043d\u0456 \u0441\u0442\u0456\u043d\u0438",Fill:"\u0417\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u043d\u044f",Full:"\u041f\u043e\u0432\u043d\u0435",Partial:"\u0427\u0430\u0441\u0442\u043a\u043e\u0432\u0435",Empty:"\u041f\u043e\u0440\u043e\u0436\u043d\u0454",OpenToOutside:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0435 \u043d\u0430 \u0437\u043e\u0432\u043d\u0456\u0448\u043d\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443",EavesLength:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430 \u043a\u0430\u0440\u043d\u0438\u0437\u0443",Parapet:"\u041f\u0435\u0440\u0438\u043b\u0430",ParapetColor:"\u041a\u043e\u043b\u0456\u0440 \u043f\u0435\u0440\u0438\u043b",ParapetTexture:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043f\u0435\u0440\u0438\u043b",ParapetHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u043f\u0435\u0440\u0438\u043b",CopingsHeight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u043f\u0430\u0440\u043a\u0430\u043d\u0443",CopingsWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u043f\u0430\u0440\u043a\u0430\u043d\u0443"},windowMenu:{OnlyThisWindow:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435 \u0432\u0456\u043a\u043d\u043e",AllWindowsOnSurface:"All Windows on the Same Surface",AllWindowsAboveFoundation:"\u0412\u0441\u0456 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430\u0434 \u043e\u0434\u043d\u0456\u0454\u044e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedWindows:"All Selected Windows",AllWindows:"\u0412\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",Width:"\u0428\u0438\u0440\u0438\u043d\u0430",Height:"\u0412\u0438\u0441\u043e\u0442\u0430",Setback:"Setback from Exterior Surface",RelativeToWallThickness:"Relative to wall thickness",Mullion:"\u0420\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u0438\u0439 \u0441\u0442\u043e\u0432\u043f\u0435\u0446\u044c",HorizontalMullion:"Horizontal Mullion",VerticalMullion:"Vertical Mullion",MullionWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u0432\u043f\u0446\u044f",HorizontalMullionSpacing:"Horizontal Mullion Spacing",VerticalMullionSpacing:"Vertical Mullion Spacing",MullionColor:"\u041a\u043e\u043b\u0456\u0440 \u0440\u043e\u0437\u0434\u0456\u043b\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u0432\u043f\u0446\u044f",Tint:"\u0412\u0456\u0434\u0442\u0456\u043d\u043e\u043a",Opacity:"\u041d\u0435\u043f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",SolarHeatGainCoefficient:"\u041a\u043e\u0435\u0444\u0456\u0446\u0456\u0454\u043d\u0442 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043f\u043b\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f (SHGC) = 1 - \u043d\u0435\u043f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",Shutter:"\u0416\u0430\u043b\u044e\u0437\u0456",LeftShutter:"\u041b\u0456\u0432\u0435 \u0436\u0430\u043b\u044e\u0437\u0456",RightShutter:"\u041f\u0440\u0430\u0432\u0435 \u0436\u0430\u043b\u044e\u0437\u0456",BothShutters:"\u041e\u0431\u0438\u0434\u0432\u0456 \u0436\u0430\u043b\u044e\u0437\u0456",ShutterWidth:"\u0412\u0456\u0434\u043d\u043e\u0441\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430",ShutterColor:"\u041a\u043e\u043b\u0456\u0440 \u0436\u0430\u043b\u044e\u0437\u0456",Frame:"\u0420\u0430\u043c\u043a\u0430",FrameWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u0430\u043c\u043a\u0438",SillWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u043f\u0456\u0434\u0432\u0456\u043a\u043e\u043d\u043d\u044f",Color:"\u041a\u043e\u043b\u0456\u0440 \u0440\u0430\u043c\u043a\u0438",WindowType:"\u0422\u0438\u043f \u0432\u0456\u043a\u043d\u0430",Default:"\u0422\u0438\u043f\u043e\u0432\u0435",Arched:"\u0410\u0440\u043a\u043e\u0432\u0435",Polygonal:"\u0411\u0430\u0433\u0430\u0442\u043e\u043a\u0443\u0442\u043d\u0435",Interior:"\u0406\u043d\u0442\u0435\u0440'\u0454\u0440",Empty:"\u041f\u043e\u0440\u043e\u0436\u043d\u0454"},roofMenu:{TextureDefault:"\u0422\u0438\u043f\u043e\u0432\u0435",Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",OnlyThisRoof:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0434\u0430\u0445",AllRoofsAboveFoundation:"\u0412\u0441\u0456 \u0434\u0430\u0445\u0438 \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedRoofs:"All Selected Roofs",AllRoofs:"\u0412\u0441\u0456 \u0434\u0430\u0445\u0438",OnlyThisCeiling:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u044f \u0441\u0442\u0435\u043b\u044f",AllCeilingsAboveFoundation:"\u0412\u0441\u0456 \u0441\u0442\u0435\u043b\u0456 \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllCeilings:"\u0412\u0441\u0456 \u0441\u0442\u0435\u043b\u0456",EavesOverhangLength:"\u0414\u043e\u0432\u0436\u0438\u043d\u0430 \u0432\u0438\u0441\u0442\u0443\u043f\u0443 \u043a\u0430\u0440\u043d\u0438\u0437\u0443",RafterSpacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u0441\u0442\u0440\u043e\u043f\u0438\u043b\u0430\u043c\u0438",RafterWidth:"\u0428\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043f\u0438\u043b\u0430",RafterThickness:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043f\u0438\u043b\u0430",RafterColor:"\u041a\u043e\u043b\u0456\u0440 \u0441\u0442\u0440\u043e\u043f\u0438\u043b\u0430",RoofColor:"\u041a\u043e\u043b\u0456\u0440 \u0434\u0430\u0445\u0443",RoofSideColor:"\u041a\u043e\u043b\u0456\u0440 \u0431\u043e\u043a\u043e\u0432\u043e\u0457 \u0447\u0430\u0441\u0442\u0438\u043d\u0438 \u0434\u0430\u0445\u0443",GlassTint:"\u041a\u043e\u043b\u0456\u0440 \u0441\u043a\u043b\u0430",Opacity:"\u041d\u0435\u043f\u0440\u043e\u0437\u043e\u0440\u0456\u0441\u0442\u044c",RoofStructure:"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u0445\u0443",DefaultStructure:"\u0422\u0438\u043f\u043e\u0432\u0430",RafterStructure:"\u0421\u0442\u0440\u043e\u043f\u0438\u043b\u043e",GlassStructure:"\u0421\u043a\u043b\u043e",SolarPanels:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",LockAllSolarPanels:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",UnlockAllSolarPanels:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",RemoveAllUnlockedSolarPanels:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456",DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u043e\u043d\u044f\u0447\u043d\u0456 \u043f\u0430\u043d\u0435\u043b\u0456 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0434\u0430\u0445\u0443",Windows:"\u0412\u0456\u043a\u043d\u0430",LockAllWindows:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",UnlockAllWindows:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430",RemoveAllUnlockedWindows:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0432\u0456\u043a\u043d\u0430",DoYouReallyWantToRemoveAllWindowsOnThisRoof:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u043a\u043d\u0430 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0434\u0430\u0445\u0443",Sensors:"\u0421\u0435\u043d\u0441\u043e\u0440\u0438",LockAllSensors:"\u0417\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438",UnlockAllSensors:"\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438",RemoveAllUnlockedSensors:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438",DoYouReallyWantToRemoveAllSensorsOnThisRoof:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043d\u0441\u043e\u0440\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0434\u0430\u0445\u0443",Lights:"\u041b\u0430\u043c\u043f\u0438",RemoveAllUnlockedLights:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u0456 \u043b\u0430\u043c\u043f\u0438",DoYouReallyWantToRemoveAllLightsOnThisRoof:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0434\u0430\u0445\u0443",AllLightsOnRoofInside:"\u0412\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u043d\u0430 \u0434\u0430\u0445\u0443 \u0432\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0456",AllLightsOnRoofOutside:"\u0412\u0441\u0456 \u043b\u0430\u043c\u043f\u0438 \u043d\u0430 \u0434\u0430\u0445\u0443 \u0437\u0437\u043e\u0432\u043d\u0456",Rise:"\u041f\u0456\u0434\u043d\u0456\u043c\u0430\u043d\u043d\u044f",Ceiling:"\u0421\u0442\u0435\u043b\u044f",RoofRValue:"\u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f R \u0434\u043b\u044f \u0434\u0430\u0445\u0443",CeilingRValue:"\u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f R \u0434\u043b\u044f \u0441\u0442\u0435\u043b\u0456"},doorMenu:{TextureDefault:"\u0417\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c",Texture01:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 1",Texture02:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 2",Texture03:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 3",Texture04:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 4",Texture05:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 5",Texture06:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 6",Texture07:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 7",Texture08:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 8",Texture09:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 9",Texture10:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 10",Texture11:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 11",Texture12:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 12",Texture13:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 13",Texture14:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 14",Texture15:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 15",Texture16:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 16",Texture17:"\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 17",OnlyThisDoor:"\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0456 \u0434\u0432\u0435\u0440\u0456",AllDoorsOnWall:"\u0412\u0441\u0456 \u0434\u0432\u0435\u0440\u0456 \u043d\u0430 \u0446\u0456\u0439 \u0441\u0442\u0456\u043d\u0456",AllDoorsAboveFoundation:"\u0412\u0441\u0456 \u0434\u0432\u0435\u0440\u0456 \u043d\u0430\u0434 \u0442\u0438\u043c \u0441\u0430\u043c\u0438\u043c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c",AllSelectedDoors:"All Selected Doors",AllDoors:"\u0412\u0441\u0456 \u0434\u0432\u0435\u0440\u0456",DoorType:"\u0422\u0438\u043f \u0434\u0432\u0435\u0440\u0435\u0439",Default:"\u0417\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c",Arched:"\u0410\u0440\u043a\u043e\u0432\u0456",Filled:"\u0417\u0430\u043f\u043e\u0432\u043d\u0435\u043d\u0456",FrameColor:"\u041a\u043e\u043b\u0456\u0440 \u0440\u0430\u043c\u043a\u0438",Interior:"\u0406\u043d\u0442\u0435\u0440'\u0454\u0440"},siteInfoPanel:{High:"\u0412\u0438\u0441\u043e\u043a\u043e",Low:"\u041d\u0438\u0437\u044c\u043a\u043e"},designInfoPanel:{NumberOfSelectedHeliostats:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0438\u0431\u0440\u0430\u043d\u0438\u0445 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432",NumberOfSelectedSolarPanels:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0432\u0438\u0431\u0440\u0430\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",ElectricityGeneratedDailyBySolarPanels:"\u0415\u043b\u0435\u043a\u0442\u0440\u0438\u043a\u0430, \u0449\u043e \u0433\u0435\u043d\u0435\u0440\u0443\u0454\u0442\u044c\u0441\u044f \u0449\u043e\u0434\u0435\u043d\u043d\u043e \u0446\u0438\u043c\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u044f\u043c\u0438",SceneDiameter:"\u0414\u0456\u0430\u043c\u0435\u0442\u0440 \u0441\u0446\u0435\u043d\u0438",BuildingArea:"\u041f\u043b\u043e\u0449\u0430 \u0431\u0443\u0434\u0456\u0432\u043b\u0456"},visualizationControlPanel:{ColorContrast:"\u041a\u043e\u043d\u0442\u0440\u0430\u0441\u0442 \u043a\u043e\u043b\u044c\u043e\u0440\u0443",FluxScale:"\u0428\u043a\u0430\u043b\u0430 \u043f\u043e\u0442\u043e\u043a\u0443",ClickUpOrDownArrowButtonsToChange:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0456 \u0441\u0442\u0440\u0456\u043b\u043a\u0430\u043c\u0438 \u0432\u0433\u043e\u0440\u0443 \u0430\u0431\u043e \u0432\u043d\u0438\u0437 \u0449\u043e\u0431 \u0437\u043c\u0456\u043d\u0438\u0442\u0438"},instructionPanel:{Rotate:"\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438",DragMouse:"\u041f\u0435\u0440\u0435\u0442\u044f\u0433\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e",Zoom:"\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043d\u043d\u044f",MouseWheelOrKeys:"\u041e\u0431\u0435\u0440\u0442\u0430\u0439\u0442\u0435 \u043a\u043e\u043b\u0435\u0441\u043e \u043c\u0438\u0448\u0456 \u0430\u0431\u043e \u043d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c Ctrl+[ \u0430\u0431\u043e Ctrl+]",MouseWheelOrKeysMac:"\u041e\u0431\u0435\u0440\u0442\u0430\u0439\u0442\u0435 \u043a\u043e\u043b\u0435\u0441\u043e \u043c\u0438\u0448\u0456 \u0430\u0431\u043e \u043d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u2318+[ \u0430\u0431\u043e \u2318+]",Pan:"\u041f\u0435\u0440\u0435\u043c\u0456\u0449\u0435\u043d\u043d\u044f",HoldCtrlDragMouse:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0456 \u0443\u0442\u0440\u0438\u043c\u0443\u0439\u0442\u0435 Ctrl, \u043f\u0435\u0440\u0435\u0442\u044f\u0433\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e",HoldMetaDragMouse:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0456 \u0443\u0442\u0440\u0438\u043c\u0443\u0439\u0442\u0435 \u2318, \u043f\u0435\u0440\u0435\u0442\u044f\u0433\u043d\u0456\u0442\u044c \u043c\u0438\u0448\u0435\u044e",Enter2DMode:"\u0412\u0432\u0456\u0439\u0442\u0438 \u0432 2D \u0440\u0435\u0436\u0438\u043c",Exit2DMode:"\u0412\u0438\u0439\u0442\u0438 \u0437 2D \u0440\u0435\u0436\u0438\u043c\u0443",NavigationMode:"\u0420\u0435\u0436\u0438\u043c \u043d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u0457",EnableNavigation:"\u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438 \u043d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u044e",DisableNavigation:"\u0412\u0438\u043c\u043a\u043d\u0443\u0442\u0438 \u043d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u044e",MoveForwardBack:"\u0420\u0443\u0445\u0430\u0442\u0438\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434/\u043d\u0430\u0437\u0430\u0434",MoveForwardBackInstruction:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c W/S",MoveLeftRight:"\u0420\u0443\u0445\u0430\u0442\u0438\u0441\u044f \u0432\u043b\u0456\u0432\u043e/\u0432\u043f\u0440\u0430\u0432\u043e",MoveLeftRightInstruction:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c A/D",MoveUpDown:"\u0420\u0443\u0445\u0430\u0442\u0438\u0441\u044f \u0432\u0433\u043e\u0440\u0443/\u0432\u043d\u0438\u0437",MoveUpDownInstruction:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c Z/X",Turn:"\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438",TurnInstruction:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043a\u043b\u0430\u0432\u0456\u0448\u0456 \u0437\u0456 \u0441\u0442\u0440\u0456\u043b\u043a\u0430\u043c\u0438",ResetView:"\u0421\u043a\u0438\u043d\u0443\u0442\u0438",AutoRotate:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0438\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442",StartOrStop:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c F4, \u0449\u043e\u0431 \u043f\u043e\u0447\u0430\u0442\u0438 \u0430\u0431\u043e \u0437\u0443\u043f\u0438\u043d\u0438\u0442\u0438"},mapPanel:{ImageOnGround:"\u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0430 \u0437\u0435\u043c\u043b\u0456",WeatherStations:"\u041c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0456\u0457",WeatherStationsNote:"\u0412\u0438\u043c\u043a\u043d\u0456\u0442\u044c \u0446\u0435, \u0449\u043e\u0431 \u043f\u0440\u0438\u0441\u043a\u043e\u0440\u0438\u0442\u0438",Coordinates:"\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0438",Zoom:"\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043d\u043d\u044f"},visibilityPanel:{SolarPanelVisibility:"\u0412\u0438\u0434\u0438\u043c\u0456\u0441\u0442\u044c \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",Observer:"\u0421\u043f\u043e\u0441\u0442\u0435\u0440\u0456\u0433\u0430\u0447",VantagePoint:"\u0422\u043e\u0447\u043a\u0430 \u043e\u0433\u043b\u044f\u0434\u0443",ItemizedVisibilityByFields:"\u0420\u043e\u0437\u0433\u043e\u0440\u043d\u0443\u0442\u0438\u0439 \u0437\u0430 \u043f\u043e\u043b\u044f\u043c\u0438",TotalVisibility:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0430 \u0432\u0438\u0434\u0438\u043c\u0456\u0441\u0442\u044c"},sensorPanel:{LightSensor:"\u0414\u0430\u0442\u0447\u0438\u043a \u043e\u0441\u0432\u0456\u0442\u043b\u0435\u043d\u043e\u0441\u0442\u0456",WeatherDataFrom:"\u041c\u0435\u0442\u0435\u043e\u0434\u0430\u043d\u0456 \u0437"},buildingEnergyPanel:{DailyBuildingEnergy:"\u0429\u043e\u0434\u0435\u043d\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f \u0431\u0443\u0434\u0456\u0432\u043b\u0456",YearlyBuildingEnergy:"\u0420\u0456\u0447\u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0456\u044f \u0431\u0443\u0434\u0456\u0432\u043b\u0456",Heater:"\u041e\u0431\u0456\u0433\u0440\u0456\u0432\u0430\u0447",AC:"\u041a\u043e\u043d\u0434\u0438\u0446\u0456\u043e\u043d\u0435\u0440",SolarPanel:"\u0421\u043e\u043d\u044f\u0447\u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c",Net:"\u0412\u0441\u044c\u043e\u0433\u043e"},solarPanelYieldPanel:{SolarPanelDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",SolarPanelYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualSolarPanels:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439",Profit:"\u041f\u0440\u0438\u0431\u0443\u0442\u043e\u043a",TotalCost:"Total Cost",TotalRevenue:"Total Revenue",TotalYield:"Total Yield",MeanYield:"Mean Yield",ModuleCount:"Module Count"},parabolicTroughYieldPanel:{ParabolicTroughDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0456\u0432",ParabolicTroughYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0456\u0432",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualParabolicTroughs:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0456\u0432"},parabolicDishYieldPanel:{ParabolicDishDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0442\u0430\u0440\u0456\u043b\u043e\u043a",ParabolicDishYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0442\u0430\u0440\u0456\u043b\u043e\u043a",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualParabolicDishes:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0445 \u0442\u0430\u0440\u0456\u043b\u043e\u043a"},fresnelReflectorYieldPanel:{FresnelReflectorDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",FresnelReflectorYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualFresnelReflectors:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0456\u0432 \u0424\u0440\u0435\u043d\u0435\u043b\u044f"},heliostatYieldPanel:{HeliostatDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0443",HeliostatYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0443",Yield:"\u0414\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualHeliostats:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0456\u0432"},updraftTowerYieldPanel:{UpdraftTowerDailyYield:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456",UpdraftTowerYearlyYield:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0434\u043e\u0445\u0456\u0434 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456",ChimneyAirTemperature:"\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043f\u043e\u0432\u0456\u0442\u0440\u044f \u0443 \u0434\u0438\u043c\u043e\u0432\u0456\u0439 \u0442\u0440\u0443\u0431\u0456",ChimneyWindSpeed:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u0432\u0456\u0442\u0440\u0443 \u0443 \u0434\u0438\u043c\u043e\u0432\u0456\u0439 \u0442\u0440\u0443\u0431\u0456",Yield:"\u0434\u043e\u0445\u0456\u0434",YieldPerHour:"\u0414\u043e\u0445\u0456\u0434 \u0437\u0430 \u0433\u043e\u0434\u0438\u043d\u0443",DailyTotal:"\u0429\u043e\u0434\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",YearlyTotal:"\u0420\u0456\u0447\u043d\u0438\u0439 \u0437\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439",ShowOutputsOfIndividualUpdraftTowers:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0434\u043e\u0445\u0456\u0434 \u043e\u043a\u0440\u0435\u043c\u0438\u0445 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0445 \u0432\u0435\u0436"},heliodonPanel:{SunAndTimeSettings:"\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0421\u043e\u043d\u0446\u044f \u0442\u0430 \u0427\u0430\u0441\u0443",SunAngles:"\u041a\u0443\u0442\u0438 \u0421\u043e\u043d\u0446\u044f",TwentyFourHours:"24 \u0413\u043e\u0434\u0438\u043d\u0438"},cloudFilePanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u043d\u0430\u0437\u0432\u043e\u044e",MyLikes:"\u041c\u043e\u0457 \u0432\u043f\u043e\u0434\u043e\u0431\u0430\u043d\u043d\u044f",MyCloudFiles:"\u041c\u043e\u0457 \u0444\u0430\u0439\u043b\u0438 \u0443 \u0445\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0435\u0434\u043e\u0432\u0438\u0449\u0456",GenerateLink:"\u0421\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f",LinkGeneratedInClipBoard:"\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u0431\u0443\u043b\u043e \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043e \u0442\u0430 \u0441\u043a\u043e\u043f\u0456\u0439\u043e\u0432\u0430\u043d\u043e \u0434\u043e \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0456\u043d\u0443",DoYouReallyWantToDelete:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438",IfSharedOrPublishedRenamingFileBreaksExistingLinks:"\u042f\u043a\u0449\u043e \u0446\u0435\u0439 \u0444\u0430\u0439\u043b \u0431\u0443\u043b\u043e \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u043e \u0430\u0431\u043e \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u043e, \u0437\u043c\u0456\u043d\u0430 \u0439\u043e\u0433\u043e \u043d\u0430\u0437\u0432\u0438 \u043f\u043e\u0440\u0443\u0448\u0438\u0442\u044c \u043d\u0430\u044f\u0432\u043d\u0456 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f"},projectListPanel:{CopyTitle:"Copy Title",TitleCopiedToClipBoard:"The title was copied to the clip board",SearchByTitle:"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u043d\u0430\u0437\u0432\u043e\u044e",MyProjects:"My Projects",GenerateProjectLink:"Generate Project Link",ProjectLinkGeneratedInClipBoard:"A link to the project was generated in the clip board",DoYouReallyWantToDeleteProject:"Do you really want to delete Project",IfSharedOrPublishedRenamingProjectBreaksExistingLinks:"If this project has been shared or published, renaming it breaks existing links"},projectPanel:{ProjectSettings:"Project Settings",ThumbnailImageSize:"Thumbnail Image Size",ProjectByOtherPeople:"Project by Other People",Project:"Project",ProjectType:"\u0422\u0438\u043f \u043f\u0440\u043e\u0454\u043a\u0442\u0443",ProjectDescription:"Description",MakeDescriptionEditable:"Make this description editable",MakeDescriptionNonEditable:"Make this description non-editable",DoubleClickToMakeDescriptionEditable:"Double-click to make this description editable",SolarPanelArray:"Solar Panel Array",CurateCurrentDesign:"Curate current design",UpdateSelectedDesign:"Update selected design",RemoveSelectedDesign:"Remove selected design",ClickToFlipSortingOrder:"Click to flip the sorting order",DesignNotShownInSolutionSpaceClickToShow:"This design is not shown in solution space; click to show",DesignShownInSolutionSpaceClickToHide:"This design is shown in solution space; click to hide",DistributionInSolutionSpace:"Distribution in the Solution Space",ChooseSolutionSpace:"Choose solution space",ChooseDataColoring:"Choose data coloring",SameColorForAllDesigns:"Same color for all designs",OneColorForEachDesign:"One color for each design",SolutionSpaceScreenshot:"Take a screenshot of the solution space",ScatteredPlotScreenshot:"Take a screenshot of the scattered plot",SingleClickToSelectDoubleClickToOpen:"Single-click to select, double-click to open.",SingleClickToDeselectDoubleClickToOpen:"Single-click to deselect, double-click to open.",GenerateScatteredPlot:"Generate Scattered Plot",SelectXAxis:"Select X Axis",SelectYAxis:"Select Y Axis"},accountSettingsPanel:{MyAccountSettings:"\u041c\u043e\u0457 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443",MyID:"\u041c\u043e\u0454 \ud83c\udd94",ClickToCopyMyID:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c, \u0449\u043e\u0431 \u0441\u043a\u043e\u043f\u0456\u044e\u0432\u0430\u0442\u0438 \u043c\u043e\u0454 ID",IDInClipBoard:"\u0412\u0430\u0448 ID \u0431\u0443\u043b\u043e \u0441\u043a\u043e\u043f\u0456\u0439\u043e\u0432\u0430\u043d\u0435 \u0456 \u0433\u043e\u0442\u043e\u0432\u0435 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438.",StoreMyNameInMyFilesWhenSaving:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043c\u043e\u0454 \u0456\u043c'\u044f \u0432 \u043c\u043e\u0457\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u043f\u0440\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u0456",DoYouReallyWantToShowYourNameInYourFiles:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u0438 \u0432\u0430\u0448\u0435 \u0456\u043c'\u044f \u0432 \u0444\u0430\u0439\u043b\u0430\u0445?",SignFileDisclaimer:"\u042f\u043a\u0449\u043e \u0442\u0430\u043a, \u0432\u0430\u0448\u0435 \u0456\u043c'\u044f \u0437\u043c\u043e\u0436\u0435 \u0431\u0430\u0447\u0438\u0442\u0438 \u0431\u0443\u0434\u044c-\u0445\u0442\u043e, \u0445\u0442\u043e \u043c\u0430\u0442\u0438\u043c\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0432\u0430\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u0456\u0432.",Likes:"\u0412\u043f\u043e\u0434\u043e\u0431\u0430\u043d\u043d\u044f",AllPublished:"\u0423\u0441\u0456 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0456",PublishedUnderAliases:"\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0456\u043c\u0438",UserCount:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432",SchoolID:"ID \u0428\u043a\u043e\u043b\u0438",ClassID:"ID \u041a\u043b\u0430\u0441\u0443"},weatherPanel:{SunshineHours:"\u0421\u043e\u043d\u044f\u0447\u043d\u0456 \u0433\u043e\u0434\u0438\u043d\u0438"},diurnalTemperaturePanel:{SelectAirTemperatureModel:"\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0432\u0456\u0442\u0440\u044f\u043d\u043e\u0457 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438",Sinusoidal:"\u0421\u0438\u043d\u0443\u0441\u043e\u0457\u0434\u0430\u043b\u044c\u043d\u0430"},economicsPanel:{EconomicsParameters:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0435\u043a\u043e\u043d\u043e\u043c\u0456\u043a\u0438",ElectricitySellingPrice:"\u0426\u0456\u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u0436\u0443 \u0435\u043b\u0435\u043a\u0442\u0440\u043e\u0435\u043d\u0435\u0440\u0433\u0456\u0457",OperationalCostPerUnit:"\u041e\u043f\u0435\u0440\u0430\u0446\u0456\u0439\u043d\u0456 \u0432\u0438\u0442\u0440\u0430\u0442\u0438 \u0437\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044e",SellingPrice:"Selling Price",UnitCost:"Unit Cost"},navigationPanel:{NavigationParameters:"Navigation Parameters",MinimumMoveSpeed:"Minimum Move Speed",MinimumTurnSpeed:"Minimum Turn Speed"},yearlyLightSensorPanel:{SkyClearness:"\u042f\u0441\u043d\u0456\u0441\u0442\u044c \u043d\u0435\u0431\u0430",ShowDaylightResults:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u0456\u0442\u043b\u0435\u043d\u043d\u044f",ShowSkyClearnessResults:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u044f\u0441\u043d\u043e\u0441\u0442\u0456 \u043d\u0435\u0431\u0430",ShowAverageDailySolarRadiation:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0441\u0435\u0440\u0435\u0434\u043d\u044e \u0449\u043e\u0434\u0435\u043d\u043d\u0443 \u0441\u043e\u043d\u044f\u0447\u043d\u0443 \u0440\u0430\u0434\u0456\u0430\u0446\u0456\u044e"},analysisManager:{NoSensorForCollectingData:"\u041d\u0435\u043c\u0430\u0454 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0434\u043b\u044f \u0437\u0431\u043e\u0440\u0443 \u0434\u0430\u043d\u0438\u0445.",NoSolarPanelForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoObserverForVisibilityAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0441\u043f\u043e\u0441\u0442\u0435\u0440\u0456\u0433\u0430\u0447\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0456.",NoWaterHeaterForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0432\u043e\u0434\u043e\u043d\u0430\u0433\u0440\u0456\u0432\u0430\u0447\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoParabolicDishForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0457 \u0442\u0430\u0440\u0456\u043b\u043a\u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoParabolicTroughForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoFresnelReflectorForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430 \u0424\u0440\u0435\u043d\u0435\u043b\u044f \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoHeliostatForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoSolarUpdraftTowerForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u0432\u0435\u0436\u0456 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443.",NoBuildingForAnalysis:"\u041d\u0435\u043c\u0430\u0454 \u0431\u0443\u0434\u0456\u0432\u043b\u0456 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0456\u0437\u0443."},toolbar:{CloudFile:"\u0425\u043c\u0430\u0440\u043d\u0438\u0439 \u0444\u0430\u0439\u043b",Select:"\u0412\u0438\u0431\u0440\u0430\u0442\u0438",AddFoundation:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442",AddWall:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0441\u0442\u0456\u043d\u0443",AddWindow:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0432\u0456\u043a\u043d\u043e",AddDoor:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u0432\u0435\u0440\u0456",AddPyramidRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u0456\u0440\u0430\u043c\u0456\u0434\u0430\u043b\u044c\u043d\u0438\u0439 \u0434\u0430\u0445",AddGableRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0448\u0430\u0442\u0440\u043e\u0432\u0438\u0439 \u0434\u0430\u0445",AddHipRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0447\u043e\u0442\u0438\u0440\u0438\u0445\u0438\u043b\u0438\u0439 \u0434\u0430\u0445",AddGambrelRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u0432\u043e\u0441\u0445\u0438\u043b\u0438\u0439 \u0434\u0430\u0445",AddMansardRoof:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043c\u0430\u043d\u0441\u0430\u0440\u0434\u043d\u0438\u0439 \u0434\u0430\u0445",AddCuboid:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u0440\u044f\u043c\u043e\u043a\u0443\u0442\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0435\u043f\u0456\u043f\u0435\u0434",AddSensor:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u0430\u0442\u0447\u0438\u043a",AddSolarPanel:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0441\u043e\u043d\u044f\u0447\u043d\u0443 \u043f\u0430\u043d\u0435\u043b\u044c",AddWaterHeater:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0432\u043e\u0434\u043e\u043d\u0430\u0433\u0440\u0456\u0432\u0430\u0447",AddParabolicDish:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0443 \u0442\u0430\u0440\u0456\u043b\u043a\u0443",AddParabolicTrough:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u0438\u0439 \u0441\u043e\u043d\u044f\u0447\u043d\u0438\u0439 \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440",AddFresnelReflector:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",AddHeliostat:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442",AddWindTurbine:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0432\u0456\u0442\u0440\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440",AddLight:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0441\u0432\u0456\u0442\u043b\u043e",AddTree:"\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u0435\u0440\u0435\u0432\u043e",AddFlower:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043a\u0432\u0456\u0442\u043a\u0443",AddPeople:"\u0414\u043e\u0434\u0430\u0442\u0438 \u043b\u044e\u0434\u0435\u0439",DoubleClickToLockThisModeForNextAction:"\u041f\u043e\u0434\u0432\u0456\u0439\u043d\u0435 \u043a\u043b\u0430\u0446\u0430\u043d\u043d\u044f, \u0449\u043e\u0431 \u0437\u0430\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457 \u0434\u0456\u0457",ClickToUnlockThisModeForNextAction:"\u041a\u043b\u0430\u0446\u043d\u0456\u0442\u044c, \u0449\u043e\u0431 \u0440\u043e\u0437\u0431\u043b\u043e\u043a\u0443\u0432\u0430\u0442\u0438 \u0446\u0435\u0439 \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457 \u0434\u0456\u0457",ManipulateGroup:"\u041c\u0430\u043d\u0456\u043f\u0443\u043b\u044e\u0432\u0430\u0442\u0438 \u0433\u0440\u0443\u043f\u043e\u044e",ClearScene:"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0441\u0446\u0435\u043d\u0443",ShowSunAndTimeSettings:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0421\u043e\u043d\u0446\u044f \u0442\u0430 \u0427\u0430\u0441\u0443",SpatialAnalysisOfEnergy:"\u041f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432\u0438\u0439 \u0430\u043d\u0430\u043b\u0456\u0437 \u0435\u043d\u0435\u0440\u0433\u0456\u0457",DoYouReallyWantToClearContent:"\u0412\u0438 \u0434\u0456\u0439\u0441\u043d\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0432\u043c\u0456\u0441\u0442",ClickForMoreButtons:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u0434\u043b\u044f \u0434\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u0438\u0445 \u043a\u043d\u043e\u043f\u043e\u043a",SwitchToAddingFoundation:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0443",SwitchToAddingCuboid:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043f\u0440\u044f\u043c\u043e\u043a\u0443\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0435\u043f\u0456\u043f\u0435\u0434\u0443",SwitchToAddingWall:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0441\u0442\u0456\u043d\u0438",SwitchToAddingWindow:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0432\u0456\u043a\u043d\u0430",SwitchToAddingDoor:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0434\u0432\u0435\u0440\u0435\u0439",SwitchToAddingPyramidRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043f\u0456\u0440\u0430\u043c\u0456\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0430\u0445\u0443",SwitchToAddingGableRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0448\u0430\u0442\u0440\u043e\u0432\u043e\u0433\u043e \u0434\u0430\u0445\u0443",SwitchToAddingHipRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0447\u043e\u0442\u0438\u0440\u0438\u0445\u0438\u043b\u0438\u0439 \u0434\u0430\u0445\u0443",SwitchToAddingGambrelRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0434\u0432\u043e\u0441\u0445\u0438\u043b\u0438\u0439 \u0434\u0430\u0445\u0443",SwitchToAddingMansardRoof:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043c\u0430\u043d\u0441\u0430\u0440\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0445\u0443",SwitchToAddingSolarPanel:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0457 \u043f\u0430\u043d\u0435\u043b\u0456",SwitchToAddingSensor:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430",SwitchToAddingWaterHeater:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0432\u043e\u0434\u043e\u043d\u0430\u0433\u0440\u0456\u0432\u0430\u0447\u0430",SwitchToAddingParabolicDish:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0457 \u0442\u0430\u0440\u0456\u043b\u043a\u0438",SwitchToAddingParabolicTrough:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0456\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043d\u044f\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0435\u043a\u0442\u043e\u0440\u0430",SwitchToAddingFresnelReflector:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0432\u0456\u0434\u0431\u0438\u0432\u0430\u0447\u0430 \u0424\u0440\u0435\u043d\u0435\u043b\u044f",SwitchToAddingHeliostat:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0433\u0435\u043b\u0456\u043e\u0441\u0442\u0430\u0442\u0430",SwitchToAddingWindTurbine:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0432\u0456\u0442\u0440\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430",SwitchToAddingLight:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043e\u0441\u0432\u0456\u0442\u043b\u0435\u043d\u043d\u044f",SwitchToAddingTree:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u0434\u0435\u0440\u0435\u0432\u0430",SwitchToAddingFlower:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043a\u0432\u0456\u0442\u043a\u0438",SwitchToAddingPeople:"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0438\u0441\u044f \u043d\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u043d\u043d\u044f \u043b\u044e\u0434\u0435\u0439"},tooltip:{gotoIFI:"\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043e \u0406\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u0443 \u0406\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443 \u041c\u0430\u0439\u0431\u0443\u0442\u043d\u044c\u043e\u0433\u043e",visitAladdinHomePage:"\u0412\u0456\u0434\u0432\u0456\u0434\u0430\u0442\u0438 \u0434\u043e\u043c\u0430\u0448\u043d\u044e \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u0443 Aladdin",clickToOpenMenu:"\u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0441\u0442\u044c, \u0449\u043e\u0431 \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0413\u043e\u043b\u043e\u0432\u043d\u0435 \u041c\u0435\u043d\u044e",clickToAccessAccountSettings:"Click to access account settings"},tree:{Apple:"\u042f\u0431\u043b\u0443\u043d\u044f",Birch:"\u0411\u0435\u0440\u0435\u0437\u0430",Coconut:"\u041a\u043e\u043a\u043e\u0441",Dogwood:"\u0414\u0435\u0440\u0435\u043d",Elm:"\u0412'\u044f\u0437",FanPalm:"\u0412\u0456\u044f\u043b\u044c\u043d\u0430 \u043f\u0430\u043b\u044c\u043c\u0430",Linden:"\u041b\u0438\u043f\u0430",Magnolia:"\u041c\u0430\u0433\u043d\u043e\u043b\u0456\u044f",Maple:"\u041a\u043b\u0435\u043d",Oak:"\u0414\u0443\u0431",Pine:"\u0421\u043e\u0441\u043d\u0430",Spruce:"\u042f\u043b\u0438\u043d\u0430"},flower:{Bellflower:"\u0414\u0437\u0432\u043e\u043d\u0438\u043a",Boxwood:"\u0421\u0430\u043c\u0448\u0438\u0442",CactusCombo1:"\u041a\u0430\u043a\u0442\u0443\u0441 \u041a\u043e\u043c\u0431\u043e 1",CactusCombo2:"\u041a\u0430\u043a\u0442\u0443\u0441 \u041a\u043e\u043c\u0431\u043e 2",CactusCombo3:"\u041a\u0430\u043a\u0442\u0443\u0441 \u041a\u043e\u043c\u0431\u043e 3",CactusCombo4:"\u041a\u0430\u043a\u0442\u0443\u0441 \u041a\u043e\u043c\u0431\u043e 4",Hibiscus:"\u0413\u0456\u0431\u0456\u0441\u043a\u0443\u0441",Hosta:"\u0413\u043e\u0441\u0442\u0430",Hydrangea:"\u0413\u043e\u0440\u0442\u0435\u043d\u0437\u0456\u044f",Peony:"\u041f\u0456\u0432\u043e\u043d\u0456\u044f",RedRose:"\u0427\u0435\u0440\u0432\u043e\u043d\u0430 \u0442\u0440\u043e\u044f\u043d\u0434\u0430",Spirea:"\u0421\u043f\u0456\u0440\u0435\u044f",Sunflower:"\u0421\u043e\u043d\u044f\u0448\u043d\u0438\u043a",TallBush:"\u0412\u0438\u0441\u043e\u043a\u0438\u0439 \u043a\u0443\u0449",Tulip:"\u0422\u044e\u043b\u044c\u043f\u0430\u043d",WhiteFlower:"\u0411\u0456\u043b\u0430 \u043a\u0432\u0456\u0442\u043a\u0430",YellowFlower:"\u0416\u043e\u0432\u0442\u0430 \u043a\u0432\u0456\u0442\u043a\u0430"},people:{Jaah:"\u0410\u0440\u0442\u0435\u043c",Jack:"\u0412\u0456\u0442\u0430\u043b\u0456\u0439",Jacob:"\u042f\u0440\u043e\u0441\u043b\u0430\u0432",Jacqueline:"\u041e\u043b\u0435\u043d\u0430",Jade:"\u041e\u043b\u044c\u0433\u0430",Jamelia:"\u041e\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430",James:"\u0410\u043d\u0434\u0440\u0456\u0439",Jane:"\u0412\u0456\u043a\u0442\u043e\u0440\u0456\u044f",Jaya:"\u0406\u0440\u0438\u043d\u0430",Jaye:"\u041d\u0430\u0437\u0430\u0440",Jeanette:"\u0421\u043e\u043b\u043e\u043c\u0456\u044f",Jedi:"\u0404\u0432\u0433\u0435\u043d",Jeff:"\u041f\u0430\u0432\u043b\u043e",Jena:"\u041b\u044e\u0431\u043e\u0432",Jennifer:"\u0422\u0435\u0442\u044f\u043d\u0430",Jess:"\u0417\u043b\u0430\u0442\u0430",Jett:"\u0421\u0435\u0440\u0433\u0456\u0439",Jill:"\u041d\u0430\u0434\u0456\u044f",Jiya:"\u041c\u0430\u0440\u0438\u043d\u0430",Joan:"\u0406\u0432\u0430\u043d\u043d\u0430",Jocelyn:"\u0410\u043d\u0430\u0441\u0442\u0430\u0441\u0456\u044f",Joel:"\u0412\u043e\u043b\u043e\u0434\u0438\u043c\u0438\u0440",Joey:"\u0412\u0435\u0440\u043e\u043d\u0456\u043a\u0430",John:"\u0406\u0432\u0430\u043d",Jonathon:"\u041f\u0435\u0442\u0440\u043e",Jose:"\u041c\u0438\u043a\u0438\u0442\u0430",Joseph:"\u0412\u0456\u043a\u0442\u043e\u0440",Joshua:"\u041c\u0438\u0445\u0430\u0439\u043b\u043e",Judd:"\u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432",Judy:"\u041c\u0430\u0440\u0456\u044f",Julia:"\u042e\u043b\u0456\u044f",Julio:"\u0414\u043c\u0438\u0442\u0440\u043e",Jumapili:"\u041c\u0430\u0440\u0442\u0430",June:"\u0410\u043d\u043d\u0430",Juro:"\u042e\u0440\u0456\u0439",Justin:"\u0411\u043e\u0433\u0434\u0430\u043d"},compass:{N:"\u041f\u043d",S:"\u041f\u0434",W:"\u0417x",E:"\u0421\u0445"},month:{January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"},modelsMap:{SearchByPublisher:"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u0432\u0438\u0440\u043e\u0431\u043d\u0438\u043a\u043e\u043c",SearchByLabel:"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u043c\u0456\u0442\u043a\u043e\u044e",MyPublishedModels:"\u041c\u043e\u0457 \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0456 \u043c\u043e\u0434\u0435\u043b\u0456",TotalNumberOfUserPublishedModels:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0430 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0438\u0445 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u043c\u0438",SortFromOldestToNewest:"\u0421\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0432\u0456\u0434 \u043d\u0430\u0439\u0434\u0430\u0432\u043d\u0456\u0448\u0438\u0445 \u0434\u043e \u043d\u0430\u0439\u043d\u043e\u0432\u0456\u0448\u0438\u0445",SortFromNewestToOldest:"\u0421\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0432\u0456\u0434 \u043d\u0430\u0439\u043d\u043e\u0432\u0456\u0448\u0438\u0445 \u0434\u043e \u043d\u0430\u0439\u0434\u0430\u0432\u043d\u0456\u0448\u0438\u0445",ModelsFoundOnThisSite:"\u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0430 \u0446\u044c\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u0456",ShowModelsPublishedByThisAuthor:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0456, \u043e\u043f\u0443\u0431\u043b\u0456\u043a\u043e\u0432\u0430\u043d\u0456 \u0446\u0438\u043c \u0430\u0432\u0442\u043e\u0440\u043e\u043c"}}}}});var S,j,H,z,R,D,M,W,I,C,O,F,k,Y,L,E,U,N,V,J,G,X,B,K,q,Q,Z,_,$,ee,te,le,ae,oe,ie,re,ne,ce,se,de,ue,fe,he,pe,ye,ge,me=A.a,we=l(272),xe=l.n(we),ve=l.p+"static/media/weather.b0a3f5ef.csv",be=l.p+"static/media/solar_radiation_horizontal.38eaf9ed.csv",Ae=l.p+"static/media/solar_radiation_vertical.522681a8.csv",Te=l.p+"static/media/pvmodules.3e173704.csv",Pe=l(71),Se=l(24),je=l(412),He=l(11),ze=l(40),Re=l(15),De=l(16),Me=l(3),We={type:"change"},Ie={type:"start"},Ce={type:"end"},Oe=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a){var o;Object(He.a)(this,l),o=t.call(this),void 0===a&&console.warn('THREE.OrbitControls: The second parameter "domElement" is now mandatory.'),a===document&&console.error('THREE.OrbitControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.'),o.object=e,o.domElement=a,o.domElement.style.touchAction="none",o.enabled=!0,o.target=new Me.Vector3,o.minDistance=0,o.maxDistance=1/0,o.minZoom=0,o.maxZoom=1/0,o.minPolarAngle=0,o.maxPolarAngle=Math.PI,o.minAzimuthAngle=-1/0,o.maxAzimuthAngle=1/0,o.enableDamping=!1,o.dampingFactor=.05,o.enableZoom=!0,o.zoomSpeed=1,o.enableRotate=!0,o.rotateSpeed=1,o.enablePan=!0,o.panSpeed=1,o.screenSpacePanning=!0,o.keyPanSpeed=7,o.autoRotate=!1,o.autoRotateSpeed=2,o.moveSpeed=1,o.turnSpeed=1,o.keys={MOVE_LEFT:"KeyA",MOVE_RIGHT:"KeyD",MOVE_FORWARD:"KeyW",MOVE_BACKWARD:"KeyS",MOVE_UP:"KeyZ",MOVE_DOWN:"KeyX",ROTATE_LEFT:"ArrowLeft",ROTATE_UP:"ArrowUp",ROTATE_RIGHT:"ArrowRight",ROTATE_DOWN:"ArrowDown"},o.mouseButtons={LEFT:Me.MOUSE.ROTATE,MIDDLE:Me.MOUSE.DOLLY,RIGHT:Me.MOUSE.PAN},o.touches={ONE:Me.TOUCH.ROTATE,TWO:Me.TOUCH.DOLLY_PAN},o.target0=o.target.clone(),o.position0=o.object.position.clone(),o.zoom0=o.object.zoom,o._domElementKeyEvents=null,o.getPolarAngle=function(){return s.phi},o.getAzimuthalAngle=function(){return s.theta},o.getDistance=function(){return this.object.position.distanceTo(this.target)},o.listenToKeyEvents=function(e){e.addEventListener("keydown",$),this._domElementKeyEvents=e,S=!1,j=0},o.removeKeyEvents=function(){null!==i._domElementKeyEvents&&i._domElementKeyEvents.removeEventListener("keydown",$)},o.saveState=function(){i.target0.copy(i.target),i.position0.copy(i.object.position),i.zoom0=i.object.zoom},o.reset=function(){i.target.copy(i.target0),i.object.position.copy(i.position0),i.object.zoom=i.zoom0,i.object.updateProjectionMatrix(),i.dispatchEvent(We),i.update(),n=r.NONE},o.update=function(){var t=new Me.Vector3,l=(new Me.Quaternion).setFromUnitVectors(e.up,new Me.Vector3(0,1,0)),a=l.clone().invert(),o=new Me.Vector3,p=new Me.Quaternion,y=2*Math.PI;return function(){var e=i.object.position;t.copy(e).sub(i.target),t.applyQuaternion(l),s.setFromVector3(t),i.autoRotate&&n===r.NONE&&z(2*Math.PI/60/60*i.autoRotateSpeed),i.enableDamping?(s.theta+=d.theta*i.dampingFactor,s.phi+=d.phi*i.dampingFactor):(s.theta+=d.theta,s.phi+=d.phi);var g=i.minAzimuthAngle,m=i.maxAzimuthAngle;return isFinite(g)&&isFinite(m)&&(g<-Math.PI?g+=y:g>Math.PI&&(g-=y),m<-Math.PI?m+=y:m>Math.PI&&(m-=y),s.theta=g<=m?Math.max(g,Math.min(m,s.theta)):s.theta>(g+m)/2?Math.max(g,s.theta):Math.min(m,s.theta)),s.phi=Math.max(i.minPolarAngle,Math.min(i.maxPolarAngle,s.phi)),s.makeSafe(),s.radius*=u,s.radius=Math.max(i.minDistance,Math.min(i.maxDistance,s.radius)),!0===i.enableDamping?i.target.addScaledVector(f,i.dampingFactor):i.target.add(f),t.setFromSpherical(s),t.applyQuaternion(a),e.copy(i.target).add(t),i.object.lookAt(i.target),!0===i.enableDamping?(d.theta*=1-i.dampingFactor,d.phi*=1-i.dampingFactor,f.multiplyScalar(1-i.dampingFactor)):(d.set(0,0,0),f.set(0,0,0)),u=1,!!(h||o.distanceToSquared(i.object.position)>c||8*(1-p.dot(i.object.quaternion))>c)&&(i.dispatchEvent(We),o.copy(i.object.position),p.copy(i.object.quaternion),h=!1,!0)}}(),o.dispose=function(){i.domElement.removeEventListener("contextmenu",ee),i.domElement.removeEventListener("pointerdown",K),i.domElement.removeEventListener("pointercancel",Z),i.domElement.removeEventListener("wheel",_),i.domElement.removeEventListener("pointermove",q),i.domElement.removeEventListener("pointerup",Q),null!==i._domElementKeyEvents&&i._domElementKeyEvents.removeEventListener("keydown",$)};var i=Object(ze.a)(o),r={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},n=r.NONE,c=1e-6,s=new Me.Spherical,d=new Me.Spherical,u=1,f=new Me.Vector3,h=!1,p=new Me.Vector2,y=new Me.Vector2,g=new Me.Vector2,m=new Me.Vector2,w=new Me.Vector2,x=new Me.Vector2,v=new Me.Vector2,b=new Me.Vector2,A=new Me.Vector2,T=[],P={},S=!1,j=0;function H(){return Math.pow(.95,i.zoomSpeed)}function z(e){d.theta-=e}function R(e){d.phi-=e}var D=function(){var e=new Me.Vector3;return function(t,l){e.setFromMatrixColumn(l,0),e.multiplyScalar(-t),f.add(e)}}(),M=function(){var e=new Me.Vector3;return function(t,l){!0===i.screenSpacePanning?e.setFromMatrixColumn(l,1):(e.setFromMatrixColumn(l,0),e.crossVectors(i.object.up,e)),e.multiplyScalar(t),f.add(e)}}(),W=function(){var e=new Me.Vector3;return function(t,l){var a=i.domElement;if(i.object.isPerspectiveCamera){var o=i.object.position;e.copy(o).sub(i.target);var r=e.length();r*=Math.tan(i.object.fov/2*Math.PI/180),D(2*t*r/a.clientHeight,i.object.matrix),M(2*l*r/a.clientHeight,i.object.matrix)}else i.object.isOrthographicCamera?(D(t*(i.object.right-i.object.left)/i.object.zoom/a.clientWidth,i.object.matrix),M(l*(i.object.top-i.object.bottom)/i.object.zoom/a.clientHeight,i.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),i.enablePan=!1)}}(),I=function(){var e=new Me.Vector3;return function(t){var l=i.object;e.setFromMatrixColumn(l.matrix,1),e.multiplyScalar(.1*t),l.position.add(e),l.position.z=Math.max(0,l.position.z),i.dispatchEvent(We),i.dispatchEvent(Ce)}}(),C=function(){var e=new Me.Vector3;return function(t){var l=i.object;e.setFromMatrixColumn(l.matrix,0),e.crossVectors(l.up,e),e.multiplyScalar(.1*t),l.position.add(e),i.dispatchEvent(We),i.dispatchEvent(Ce)}}(),O=function(){var e=new Me.Vector3;return function(t){var l=i.object;e.setFromMatrixColumn(l.matrix,0),e.multiplyScalar(.1*t),l.position.add(e),i.dispatchEvent(We),i.dispatchEvent(Ce)}}(),F=function(){var e=new Me.Euler(0,0,0,"ZXY");return function(t){var l=i.object;e.setFromQuaternion(l.quaternion),Math.abs(Math.abs(e.z-j)-Math.PI)<.01&&(S=!S),S?e.x-=.01*t:e.x+=.01*t,e.x=Math.max(.1,e.x),j=e.z,l.quaternion.setFromEuler(e),i.dispatchEvent(We),i.dispatchEvent(Ce)}}(),k=function(){var e=new Me.Euler(0,0,0,"ZXY");return function(t){var l=i.object;e.setFromQuaternion(l.quaternion),e.z-=.01*t,l.quaternion.setFromEuler(e),i.dispatchEvent(We),i.dispatchEvent(Ce)}}();function Y(e){i.object.isPerspectiveCamera?u/=e:i.object.isOrthographicCamera?(i.object.zoom=Math.max(i.minZoom,Math.min(i.maxZoom,i.object.zoom*e)),i.object.updateProjectionMatrix(),h=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),i.enableZoom=!1)}function L(e){i.object.isPerspectiveCamera?u*=e:i.object.isOrthographicCamera?(i.object.zoom=Math.max(i.minZoom,Math.min(i.maxZoom,i.object.zoom/e)),i.object.updateProjectionMatrix(),h=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),i.enableZoom=!1)}function E(e){p.set(e.clientX,e.clientY)}function U(e){m.set(e.clientX,e.clientY)}function N(){if(1===T.length)p.set(T[0].pageX,T[0].pageY);else{var e=.5*(T[0].pageX+T[1].pageX),t=.5*(T[0].pageY+T[1].pageY);p.set(e,t)}}function V(){if(1===T.length)m.set(T[0].pageX,T[0].pageY);else{var e=.5*(T[0].pageX+T[1].pageX),t=.5*(T[0].pageY+T[1].pageY);m.set(e,t)}}function J(){var e=T[0].pageX-T[1].pageX,t=T[0].pageY-T[1].pageY,l=Math.sqrt(e*e+t*t);v.set(0,l)}function G(e){if(1===T.length)y.set(e.pageX,e.pageY);else{var t=ae(e),l=.5*(e.pageX+t.x),a=.5*(e.pageY+t.y);y.set(l,a)}g.subVectors(y,p).multiplyScalar(i.rotateSpeed);var o=i.domElement;z(2*Math.PI*g.x/o.clientHeight),R(2*Math.PI*g.y/o.clientHeight),p.copy(y)}function X(e){if(1===T.length)w.set(e.pageX,e.pageY);else{var t=ae(e),l=.5*(e.pageX+t.x),a=.5*(e.pageY+t.y);w.set(l,a)}x.subVectors(w,m).multiplyScalar(i.panSpeed),W(x.x,x.y),m.copy(w)}function B(e){var t=ae(e),l=e.pageX-t.x,a=e.pageY-t.y,o=Math.sqrt(l*l+a*a);b.set(0,o),A.set(0,Math.pow(b.y/v.y,i.zoomSpeed)),Y(A.y),v.copy(b)}function K(e){!1!==i.enabled&&(0===T.length&&(i.domElement.setPointerCapture(e.pointerId),i.domElement.addEventListener("pointermove",q),i.domElement.addEventListener("pointerup",Q)),function(e){T.push(e)}(e),"touch"===e.pointerType?function(e){switch(le(e),T.length){case 1:switch(i.touches.ONE){case Me.TOUCH.ROTATE:if(!1===i.enableRotate)return;N(),n=r.TOUCH_ROTATE;break;case Me.TOUCH.PAN:if(!1===i.enablePan)return;V(),n=r.TOUCH_PAN;break;default:n=r.NONE}break;case 2:switch(i.touches.TWO){case Me.TOUCH.DOLLY_PAN:if(!1===i.enableZoom&&!1===i.enablePan)return;i.enableZoom&&J(),i.enablePan&&V(),n=r.TOUCH_DOLLY_PAN;break;case Me.TOUCH.DOLLY_ROTATE:if(!1===i.enableZoom&&!1===i.enableRotate)return;i.enableZoom&&J(),i.enableRotate&&N(),n=r.TOUCH_DOLLY_ROTATE;break;default:n=r.NONE}break;default:n=r.NONE}n!==r.NONE&&i.dispatchEvent(Ie)}(e):function(e){var t;switch(e.button){case 0:t=i.mouseButtons.LEFT;break;case 1:t=i.mouseButtons.MIDDLE;break;case 2:t=i.mouseButtons.RIGHT;break;default:t=-1}switch(t){case Me.MOUSE.DOLLY:if(!1===i.enableZoom)return;!function(e){v.set(e.clientX,e.clientY)}(e),n=r.DOLLY;break;case Me.MOUSE.ROTATE:if(i.object.isOrthographicCamera){if(!1===i.enablePan)return;U(e),n=r.PAN}else if(e.ctrlKey||e.metaKey){if(!1===i.enablePan)return;U(e),n=r.PAN}else{if(!1===i.enableRotate)return;E(e),n=r.ROTATE}break;case Me.MOUSE.PAN:if(e.ctrlKey||e.metaKey){if(!1===i.enableRotate)return;E(e),n=r.ROTATE}else{if(!1===i.enablePan)return;U(e),n=r.PAN}break;default:n=r.NONE}n!==r.NONE&&i.dispatchEvent(Ie)}(e))}function q(e){!1!==i.enabled&&("touch"===e.pointerType?function(e){switch(le(e),n){case r.TOUCH_ROTATE:if(!1===i.enableRotate)return;G(e),i.update();break;case r.TOUCH_PAN:if(!1===i.enablePan)return;X(e),i.update();break;case r.TOUCH_DOLLY_PAN:if(!1===i.enableZoom&&!1===i.enablePan)return;!function(e){i.enableZoom&&B(e),i.enablePan&&X(e)}(e),i.update();break;case r.TOUCH_DOLLY_ROTATE:if(!1===i.enableZoom&&!1===i.enableRotate)return;!function(e){i.enableZoom&&B(e),i.enableRotate&&G(e)}(e),i.update();break;default:n=r.NONE}}(e):function(e){if(!1===i.enabled)return;switch(n){case r.ROTATE:if(!1===i.enableRotate)return;!function(e){y.set(e.clientX,e.clientY),g.subVectors(y,p).multiplyScalar(i.rotateSpeed);var t=i.domElement;z(2*Math.PI*g.x/t.clientHeight),R(2*Math.PI*g.y/t.clientHeight),p.copy(y),i.update()}(e);break;case r.DOLLY:if(!1===i.enableZoom)return;!function(e){b.set(e.clientX,e.clientY),A.subVectors(b,v),A.y>0?Y(H()):A.y<0&&L(H()),v.copy(b),i.update()}(e);break;case r.PAN:if(!1===i.enablePan)return;!function(e){w.set(e.clientX,e.clientY),x.subVectors(w,m).multiplyScalar(i.panSpeed),W(x.x,x.y),m.copy(w),i.update()}(e)}}(e))}function Q(e){te(e),0===T.length&&(i.domElement.releasePointerCapture(e.pointerId),i.domElement.removeEventListener("pointermove",q),i.domElement.removeEventListener("pointerup",Q)),i.dispatchEvent(Ce),n=r.NONE}function Z(e){te(e)}function _(e){!1!==i.enabled&&!1!==i.enableZoom&&n===r.NONE&&(e.preventDefault(),i.dispatchEvent(Ie),function(e){e.deltaY<0?L(H()):e.deltaY>0&&Y(H()),i.update()}(e),i.dispatchEvent(Ce))}function $(e){!1!==i.enabled&&!1!==i.enablePan&&function(e){switch(e.code){case i.keys.MOVE_FORWARD:C(i.moveSpeed);break;case i.keys.MOVE_BACKWARD:C(-i.moveSpeed);break;case i.keys.MOVE_UP:I(i.moveSpeed);break;case i.keys.MOVE_DOWN:I(-i.moveSpeed);break;case i.keys.MOVE_RIGHT:O(i.moveSpeed);break;case i.keys.MOVE_LEFT:O(-i.moveSpeed);break;case i.keys.ROTATE_UP:F(i.turnSpeed);break;case i.keys.ROTATE_DOWN:F(-i.turnSpeed);break;case i.keys.ROTATE_LEFT:k(-i.turnSpeed);break;case i.keys.ROTATE_RIGHT:k(i.turnSpeed)}}(e)}function ee(e){!1!==i.enabled&&e.preventDefault()}function te(e){delete P[e.pointerId];for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:1,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:8,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1;Object(He.a)(this,l),(e=t.call(this)).type="ParabolicCylinderGeometry",e.parameters={semilatusRectum:a,width:o,height:i,widthSegments:r,lengthSegments:n};var c=Object(ze.a)(e);r=Math.floor(r),n=Math.floor(n);var s=[],d=[],u=[],f=[],h=0,p=[],y=i/2,g=0;function m(){for(var e=new Me.Vector3,t=new Me.Vector3,l=0,m=1/r,w=o/a,x=0;x<=n;x++){for(var v=[],b=x/n,A=0;A<=r;A++){var T=A*m-.5,P=T*w;t.x=a*P,t.y=-b*i+y,t.z=a*P*P/2,d.push(t.x,t.y,t.z),e.set(-a*P,0,a).normalize(),u.push(e.x,e.y,e.z),f.push(T- -.5,1-b),v.push(h++)}p.push(v)}for(var S=0;S0&&void 0!==arguments[0]?arguments[0]:1,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:16,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:4;Object(He.a)(this,l),(e=t.call(this)).type="ParaboloidGeometry",e.parameters={semilatusRectum:a,rimRadius:o,radialSegments:i,depthSegments:r},i=Math.max(3,Math.floor(i)),r=Math.max(2,Math.floor(r));for(var n,c,s=0,d=[],u=new Me.Vector3,f=new Me.Vector3,h=new Me.Vector3,p=new Me.Vector3,y=[],g=[],m=[],w=[],x=2*Math.PI,v=o/a,b=1/r,A=0;A<=r;A++){for(var T=[],P=A*b,S=P*v,j=0;j<=i;j++){var H=j/i;n=Math.cos(H*x),c=Math.sin(H*x),u.x=a*n*S,u.y=a*c*S,u.z=a*S*S/2,g.push(u.x,u.y,u.z),h.set(a*c,-a*n,a*S).normalize(),p.set(n,c,0),f.crossVectors(h,p),m.push(f.x,f.y,f.z),w.push(.5*P*n+.5,.5*P*c+.5),T.push(s++)}d.push(T)}for(var z=0;zthis.x&&ethis.y&&t6&&void 0!==arguments[6]?arguments[6]:0,u=arguments.length>7&&void 0!==arguments[7]?arguments[7]:0,f=0;switch(e.type){case V.Cuboid:s=e.id;break;case V.Wall:s=e.parentId,f=e.ly;break;case V.Roof:s=e.parentId,f=e.thickness}var p=Ew.getState().actionState;return{type:V.Window,cx:t,cy:l,cz:a,lx:d,ly:f,lz:u,leftShutter:p.windowShutterLeft,rightShutter:p.windowShutterRight,shutterColor:p.windowShutterColor,shutterWidth:p.windowShutterWidth,horizontalMullion:p.windowHorizontalMullion,verticalMullion:p.windowVerticalMullion,mullionWidth:p.windowMullionWidth,horizontalMullionSpacing:p.windowHorizontalMullionSpacing,verticalMullionSpacing:p.windowVerticalMullionSpacing,mullionColor:p.windowMullionColor,frame:p.windowFrame,frameWidth:p.windowFrameWidth,sillWidth:Vm.isTypeRoof(o)?0:p.windowSillWidth,windowType:p.windowType,empty:p.windowEmpty,interior:p.windowInterior,archHeight:p.windowArchHeight,selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,color:null!==(r=p.windowColor)&&void 0!==r?r:"#ffffff",tint:null!==(n=p.windowTint)&&void 0!==n?n:"#73D8FF",opacity:void 0!==p.windowOpacity?p.windowOpacity:.5,uValue:null!==(c=p.windowUValue)&&void 0!==c?c:.5,normal:[0,-1,0],rotation:i?Object(h.a)(i):[0,0,0],parentId:e.id,parentType:o,foundationId:s,id:m.a.generate()}}},{key:"makeDoor",value:function(e){var t,l,a,o;switch(e.type){case V.Cuboid:o=e.id;break;case V.Wall:o=e.parentId}var i=Ew.getState().actionState;return{type:V.Door,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,doorType:i.doorType,filled:i.doorFilled,interior:i.doorInterior,archHeight:i.doorArchHeight,textureType:null!==(t=i.doorTexture)&&void 0!==t?t:fe.Default,color:null!==(l=i.doorColor)&&void 0!==l?l:"#ffffff",uValue:null!==(a=i.doorUValue)&&void 0!==a?a:.5,selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,1,0],rotation:[0,0,0],parentId:e.id,foundationId:o,id:m.a.generate()}}},{key:"makePyramidRoof",value:function(e,t){var l,a,o,i,r,n,c=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(l=c.roofCeiling)&&void 0!==l&&l,rise:c.roofRise<0?2:c.roofRise,thickness:null!==(a=c.roofThickness)&&void 0!==a?a:.2,rValue:null!==(o=c.roofRValue)&&void 0!==o?o:3,color:null!==(i=c.roofColor)&&void 0!==i?i:"#454769",sideColor:null!==(r=c.roofSideColor)&&void 0!==r?r:"#ffffff",textureType:null!==(n=c.roofTexture)&&void 0!==n?n:he.Default,roofType:It.Pyramid,roofStructure:Ct.Default,wallsId:Object(h.a)(e),selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate()}}},{key:"makeGableRoof",value:function(e,t){var l,a,o,i,r,n,c=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(l=c.roofCeiling)&&void 0!==l&&l,rise:c.roofRise<0?2:c.roofRise,thickness:null!==(a=c.roofThickness)&&void 0!==a?a:.2,rValue:null!==(o=c.roofRValue)&&void 0!==o?o:3,color:null!==(i=c.roofColor)&&void 0!==i?i:"#454769",sideColor:null!==(r=c.roofSideColor)&&void 0!==r?r:"#ffffff",textureType:null!==(n=c.roofTexture)&&void 0!==n?n:he.Default,roofType:It.Gable,roofStructure:Ct.Default,wallsId:Object(h.a)(e),selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate(),ridgeLeftPoint:[0,1],ridgeRightPoint:[0,1]}}},{key:"makeHipRoof",value:function(e,t,l){var a,o,i,r,n,c,s=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(a=s.roofCeiling)&&void 0!==a&&a,rise:s.roofRise<0?2:s.roofRise,thickness:null!==(o=s.roofThickness)&&void 0!==o?o:.2,rValue:null!==(i=s.roofRValue)&&void 0!==i?i:3,color:null!==(r=s.roofColor)&&void 0!==r?r:"#454769",sideColor:null!==(n=s.roofSideColor)&&void 0!==n?n:"#ffffff",textureType:null!==(c=s.roofTexture)&&void 0!==c?c:he.Default,roofType:It.Hip,roofStructure:Ct.Default,wallsId:Object(h.a)(e),selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate(),leftRidgeLength:(null!==l&&void 0!==l?l:2)/2,rightRidgeLength:(null!==l&&void 0!==l?l:2)/2}}},{key:"makeGambrelRoof",value:function(e,t){var l,a,o,i,r,n,c=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(l=c.roofCeiling)&&void 0!==l&&l,rise:c.roofRise<0?2:c.roofRise,thickness:null!==(a=c.roofThickness)&&void 0!==a?a:.2,rValue:null!==(o=c.roofRValue)&&void 0!==o?o:3,color:null!==(i=c.roofColor)&&void 0!==i?i:"#454769",sideColor:null!==(r=c.roofSideColor)&&void 0!==r?r:"#ffffff",textureType:null!==(n=c.roofTexture)&&void 0!==n?n:he.Default,roofType:It.Gambrel,roofStructure:Ct.Default,wallsId:Object(h.a)(e),topRidgePoint:[0,1],frontRidgePoint:[.35,.5],backRidgePoint:[.35,.5],selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate()}}},{key:"makeMansardRoof",value:function(e,t){var l,a,o,i,r,n,c=Ew.getState().actionState;return{type:V.Roof,cx:0,cy:0,cz:0,lx:0,ly:0,lz:0,ceiling:null!==(l=c.roofCeiling)&&void 0!==l&&l,rise:c.roofRise<0?2:c.roofRise,thickness:null!==(a=c.roofThickness)&&void 0!==a?a:.2,rValue:null!==(o=c.roofRValue)&&void 0!==o?o:3,color:null!==(i=c.roofColor)&&void 0!==i?i:"#454769",sideColor:null!==(r=c.roofSideColor)&&void 0!==r?r:"#ffffff",textureType:null!==(n=c.roofTexture)&&void 0!==n?n:he.Default,roofType:It.Mansard,roofStructure:Ct.Default,wallsId:Object(h.a)(e),ridgeWidth:1,selected:!1,lineWidth:.2,lineColor:"#000000",showLabel:!1,normal:[0,0,1],rotation:[0,0,0],parentId:t.id,foundationId:t.id,id:m.a.generate()}}}]),e}(),Jl=l(839),Gl=function(e){return e.solarPanelArrayLayoutParams.pvModelName},Xl=function(e){return e.solarPanelArrayLayoutParams.rowAxis},Bl=function(e){return e.solarPanelArrayLayoutParams.rowsPerRack},Kl=function(e){return e.solarPanelArrayLayoutParams.interRowSpacing},ql=function(e){return e.solarPanelArrayLayoutParams.margin},Ql=function(e){return e.solarPanelArrayLayoutParams.poleHeight},Zl=function(e){return e.solarPanelArrayLayoutParams.poleSpacing},_l=function(e){return e.solarPanelArrayLayoutParams.tiltAngle},$l=function(e){return e.solarPanelArrayLayoutParams.orientation},ea=function(e){return e.viewState.navigationView},ta=function(e){return e.viewState.shadowEnabled},la=function(e){return e.viewState.solarPanelShininess},aa=function(e){return e.viewState.windowShininess},oa=function(e){return e.viewState.heatFluxScaleFactor},ia=function(e){return e.viewState.heatFluxColor},ra=function(e){return e.viewState.heatFluxWidth},na=function(e){return e.viewState.solarRadiationHeatMapMaxValue},ca=function(e){return e.viewState.solarRadiationHeatMapReflectionOnly},sa=function(e){return e.viewState.axes},da=function(e){return e.viewState.ambientLightIntensity},ua=function(e){return e.viewState.directLightIntensity},fa=function(e){return e.viewState.theme},ha=function(e){return e.viewState.showAzimuthAngle},pa=function(e){return e.viewState.showElevationAngle},ya=function(e){return e.viewState.showZenithAngle},ga=function(e){return e.viewState.autoRotate},ma=function(e){return e.viewState.groundImage},wa=function(e){return e.viewState.groundImageType},xa=function(e){return e.viewState.groundColor},va=function(e){return e.viewState.waterSurface},ba=function(e){return e.viewState.orthographic},Aa=function(e){return e.viewState.enableRotate},Ta=function(e){return e.viewState.cameraPosition},Pa=function(e){return e.viewState.cameraPosition2D},Sa=function(e){return e.viewState.panCenter},ja=function(e){return e.viewState.panCenter2D},Ha=function(e){return e.viewState.cameraZoom},za=function(e){return e.viewState.heliodon},Ra=function(e){return e.viewState.showSunAngles},Da=function(e){return e.viewState.mapZoom},Ma=function(e){return e.viewState.mapTilt},Wa=function(e){return e.viewState.mapType},Ia=function(e){return e.viewState.showSiteInfoPanel},Ca=function(e){return e.viewState.showDesignInfoPanel},Oa=function(e){return e.viewState.showInstructionPanel},Fa=function(e){return e.viewState.showHeliodonPanel},ka=function(e){return e.viewState.heliodonPanelX},Ya=function(e){return e.viewState.heliodonPanelY},La=function(e){return e.viewState.showMapPanel},Ea=function(e){return e.viewState.mapPanelX},Ua=function(e){return e.viewState.mapPanelY},Na=function(e){return e.viewState.showWeatherPanel},Va=function(e){return e.viewState.weatherPanelRect},Ja=function(e){return e.viewState.showDiurnalTemperaturePanel},Ga=function(e){return e.viewState.diurnalTemperaturePanelRect},Xa=function(e){return e.viewState.showStickyNotePanel},Ba=function(e){return e.viewState.stickyNotePanelRect},Ka=function(e){return e.viewState.showDailyBuildingEnergyPanel},qa=function(e){return e.viewState.dailyBuildingEnergyPanelRect},Qa=function(e){return e.viewState.showYearlyBuildingEnergyPanel},Za=function(e){return e.viewState.yearlyBuildingEnergyPanelRect},_a=function(e){return e.viewState.showDailyLightSensorPanel},$a=function(e){return e.viewState.dailyLightSensorPanelRect},eo=function(e){return e.viewState.showYearlyLightSensorPanel},to=function(e){return e.viewState.yearlyLightSensorPanelRect},lo=function(e){return e.viewState.yearlyLightSensorPanelShowDaylight},ao=function(e){return e.viewState.yearlyLightSensorPanelShowClearness},oo=function(e){return e.viewState.showDailyPvYieldPanel},io=function(e){return e.viewState.dailyPvYieldPanelRect},ro=function(e){return e.viewState.showYearlyPvYieldPanel},no=function(e){return e.viewState.yearlyPvYieldPanelRect},co=function(e){return e.viewState.showSolarPanelVisibilityResultsPanel},so=function(e){return e.viewState.visibilityResultsPanelRect},uo=function(e){return e.viewState.showDailyParabolicTroughYieldPanel},fo=function(e){return e.viewState.dailyParabolicTroughYieldPanelRect},ho=function(e){return e.viewState.showYearlyParabolicTroughYieldPanel},po=function(e){return e.viewState.yearlyParabolicTroughYieldPanelRect},yo=function(e){return e.viewState.showDailyParabolicDishYieldPanel},go=function(e){return e.viewState.dailyParabolicDishYieldPanelRect},mo=function(e){return e.viewState.showYearlyParabolicDishYieldPanel},wo=function(e){return e.viewState.yearlyParabolicDishYieldPanelRect},xo=function(e){return e.viewState.showDailyFresnelReflectorYieldPanel},vo=function(e){return e.viewState.dailyFresnelReflectorYieldPanelRect},bo=function(e){return e.viewState.showYearlyFresnelReflectorYieldPanel},Ao=function(e){return e.viewState.yearlyFresnelReflectorYieldPanelRect},To=function(e){return e.viewState.showDailyHeliostatYieldPanel},Po=function(e){return e.viewState.dailyHeliostatYieldPanelRect},So=function(e){return e.viewState.showYearlyHeliostatYieldPanel},jo=function(e){return e.viewState.yearlyHeliostatYieldPanelRect},Ho=function(e){return e.viewState.showDailyUpdraftTowerYieldPanel},zo=function(e){return e.viewState.dailyUpdraftTowerYieldPanelRect},Ro=function(e){return e.viewState.showYearlyUpdraftTowerYieldPanel},Do=function(e){return e.viewState.yearlyUpdraftTowerYieldPanelRect},Mo=function(e){return e.viewState.showEvolutionPanel},Wo=function(e){return e.viewState.evolutionPanelRect},Io=function(e){return e.world.latitude},Co=function(e){return e.world.longitude},Oo=function(e){return e.world.date},Fo=function(e){return e.world.leafDayOfYear1},ko=function(e){return e.world.leafDayOfYear2},Yo=function(e){return e.world.ground},Lo=function(e){return e.world.address},Eo=function(e){return e.world.countryCode},Uo=function(e){return e.world.airAttenuationCoefficient},No=function(e){return e.world.airConvectiveCoefficient},Vo=function(e){return e.world.timesPerHour},Jo=function(e){return e.world.daysPerYear},Go=function(e){return e.world.monthlyIrradianceLosses},Xo=function(e){return e.world.discretization},Bo=function(e){return e.world.diurnalTemperatureModel},Ko=function(e){return e.world.highestTemperatureTimeInMinutes},qo=function(e){return e.world.solarRadiationHeatmapGridCellSize},Qo=function(e){return e.world.pvGridCellSize},Zo=function(e){return e.world.solarPanelVisibilityGridCellSize},_o=function(e){return e.world.cspTimesPerHour},$o=function(e){return e.world.cspDaysPerYear},ei=function(e){return e.world.cspGridCellSize},ti=function(e){return e.world.sutTimesPerHour},li=function(e){return e.world.sutDaysPerYear},ai=function(e){return e.world.sutGridCellSize},oi=function(e){return e.world.noAnimationForHeatmapSimulation},ii=function(e){return e.world.noAnimationForThermalSimulation},ri=function(e){return e.world.noAnimationForSensorDataCollection},ni=function(e){return e.world.noAnimationForSolarPanelSimulation},ci=function(e){return e.world.noAnimationForSolarUpdraftTowerSimulation},si=function(e){return e.set},di=function(e){return e.user},ui=function(e){return e.userCount},fi=function(e){return e.showEconomicsPanel},hi=function(e){return e.showNavigationPanel},pi=function(e){return e.minimumNavigationMoveSpeed},yi=function(e){return e.minimumNavigationTurnSpeed},gi=function(e){return e.navigationMoveSpeed},mi=function(e){return e.navigationTurnSpeed},wi=function(e){return e.getHeatmap},xi=function(e){return e.setHeatmap},vi=function(e){return e.clearHeatmaps},bi=function(e){return e.flagOfDailySimulation},Ai=function(e){return e.hourlyHeatExchangeArrayMap},Ti=function(e){return e.setHourlyHeatExchangeArray},Pi=function(e){return e.hourlySolarHeatGainArrayMap},Si=function(e){return e.setHourlySolarHeatGainArray},ji=function(e){return e.hourlySolarPanelOutputArrayMap},Hi=function(e){return e.setHourlySolarPanelOutputArray},zi=function(e){return e.getRoofSegmentVertices},Ri=function(e){return e.getRoofSegmentVerticesWithoutOverhang},Di=function(e){return e.changed},Mi=function(e){return e.setChanged},Wi=function(e){return e.setSkipChange},Ii=function(e){return e.applyCount},Ci=function(e){return e.setApplyCount},Oi=function(e){return e.revertApply},Fi=function(e){return e.elements},ki=function(e){return e.notes},Yi=function(e){return e.pvModules},Li=function(e){return e.loadPvModules},Ei=function(e){return e.getPvModule},Ui=function(e){return e.floatingWindowOpacity},Ni=function(e){return e.selectedFloatingWindow},Vi=function(e){return e.language},Ji=function(e){return e.locale},Gi=function(e){return e.loggable},Xi=function(e){return e.actionInfo},Bi=function(e){return e.currentUndoable},Ki=function(e){return e.openModelsMap},qi=function(e){return e.modelsMapLatitude},Qi=function(e){return e.modelsMapLongitude},Zi=function(e){return e.modelsMapZoom},_i=function(e){return e.modelsMapTilt},$i=function(e){return e.modelsMapType},er=function(e){return e.modelsMapWeatherStations},tr=function(e){return e.showCloudFileTitleDialog},lr=function(e){return e.showCloudFileTitleDialogFlag},ar=function(e){return e.cloudFile},or=function(e){return e.latestModelSite},ir=function(e){return e.modelSites},rr=function(e){return e.peopleModels},nr=function(e){return e.saveCloudFileFlag},cr=function(e){return e.createProjectFlag},sr=function(e){return e.saveProjectFlag},dr=function(e){return e.curateDesignToProjectFlag},ur=function(e){return e.showProjectsFlag},fr=function(e){return e.updateProjectsFlag},hr=function(e){return e.modelsMapFlag},pr=function(e){return e.leaderboardFlag},yr=function(e){return e.showLeaderboard},gr=function(e){return e.publishOnModelsMapFlag},mr=function(e){return e.listCloudFilesFlag},wr=function(e){return e.localContentToImportAfterCloudFileUpdate},xr=function(e){return e.localFileName},vr=function(e){return e.createNewFileFlag},br=function(e){return e.openLocalFileFlag},Ar=function(e){return e.saveLocalFileDialogVisible},Tr=function(e){return e.fileChanged},Pr=function(e){return e.undoManager},Sr=function(e){return e.addUndoable},jr=function(e){return e.importContent},Hr=function(e){return e.exportContent},zr=function(e){return e.clearContent},Rr=function(e){return e.createEmptyFile},Dr=function(e){return e.aabb},Mr=function(e){return e.animateSun},Wr=function(e){return e.animate24Hours},Ir=function(e){return e.runDailyThermalSimulation},Cr=function(e){return e.pauseDailyThermalSimulation},Or=function(e){return e.runYearlyThermalSimulation},Fr=function(e){return e.pauseYearlyThermalSimulation},kr=function(e){return e.clearDailySimulationResultsFlag},Yr=function(e){return e.clearYearlySimulationResultsFlag},Lr=function(e){return e.runDynamicSimulation},Er=function(e){return e.runStaticSimulation},Ur=function(e){return e.pauseSimulation},Nr=function(e){return e.runEvolution},Vr=function(e){return e.pauseEvolution},Jr=function(e){return e.objectiveEvaluationIndex},Gr=function(e){return e.evolutionMethod},Xr=function(e){return e.updateSceneRadiusFlag},Br=function(e){return e.updateSceneRadius},Kr=function(e){return e.sceneRadius},qr=function(e){return e.cameraDirection},Qr=function(e){return e.getCameraDirection},Zr=function(e){return e.getElementById},_r=function(e){return e.getFoundation},$r=function(e){return e.getParent},en=function(e){return e.getChildren},tn=function(e){return e.getChildrenOfType},ln=function(e){return e.selectedElement},an=function(e){return e.selectedElementIdSet},on=function(e){return e.getSelectedElement},rn=function(e){return e.overlapWithSibling},nn=function(e){return e.selectedSideIndex},cn=function(e){return e.setElementPosition},sn=function(e){return e.setElementSize},dn=function(e){return e.setElementNormal},un=function(e){return e.updateAllElementLocks},fn=function(e){return e.updateElementLockByFoundationId},hn=function(e){return e.updateElementLockByParentId},pn=function(e){return e.updateElementLockById},yn=function(e){return e.updateElementReferenceById},gn=function(e){return e.updateElementLabelById},mn=function(e){return e.updateElementShowLabelById},wn=function(e){return e.updateElementCxById},xn=function(e){return e.updateElementCyById},vn=function(e){return e.updateElementCzById},bn=function(e){return e.updateElementCzForAll},An=function(e){return e.updateElementLxById},Tn=function(e){return e.updateElementLxAboveFoundation},Pn=function(e){return e.updateElementLxForAll},Sn=function(e){return e.updateElementLyById},jn=function(e){return e.updateElementLyAboveFoundation},Hn=function(e){return e.updateElementLyForAll},zn=function(e){return e.updateElementLzById},Rn=function(e){return e.updateElementLzForAll},Dn=function(e){return e.updateElementColorById},Mn=function(e){return e.updateElementColorOnSurface},Wn=function(e){return e.updateElementColorAboveFoundation},In=function(e){return e.updateElementColorForAll},Cn=function(e){return e.updateElementLineColorById},On=function(e){return e.updateElementLineColorOnSurface},Fn=function(e){return e.updateElementLineColorAboveFoundation},kn=function(e){return e.updateElementLineColorForAll},Yn=function(e){return e.updateElementLineWidthById},Ln=function(e){return e.updateElementLineWidthOnSurface},En=function(e){return e.updateElementLineWidthAboveFoundation},Un=function(e){return e.updateElementLineWidthForAll},Nn=function(e){return e.updateElementRotationById},Vn=function(e){return e.updateElementRotationForAll},Jn=function(e){return e.foundationActionScope},Gn=function(e){return e.setFoundationActionScope},Xn=function(e){return e.polygonActionScope},Bn=function(e){return e.setPolygonActionScope},Kn=function(e){return e.updatePolygonVertexPositionById},qn=function(e){return e.updatePolygonVerticesById},Qn=function(e){return e.cuboidActionScope},Zn=function(e){return e.setCuboidActionScope},_n=function(e){return e.solarPanelActionScope},$n=function(e){return e.setSolarPanelActionScope},ec=function(e){return e.updateSolarCollectorDailyYieldById},tc=function(e){return e.updateSolarCollectorYearlyYieldById},lc=function(e){return e.updateSolarPanelTiltAngleById},ac=function(e){return e.updateSolarCollectorDrawSunBeamById},oc=function(e){return e.updateSolarCollectorDrawSunBeamAboveFoundation},ic=function(e){return e.updateSolarCollectorDrawSunBeamForAll},rc=function(e){return e.updateSolarCollectorRelativeAzimuthById},nc=function(e){return e.updateSolarCollectorRelativeAzimuthOnSurface},cc=function(e){return e.updateSolarCollectorRelativeAzimuthAboveFoundation},sc=function(e){return e.updateSolarCollectorRelativeAzimuthForAll},dc=function(e){return e.updateSolarCollectorPoleHeightById},uc=function(e){return e.updateSolarCollectorPoleHeightOnSurface},fc=function(e){return e.updateSolarCollectorPoleHeightAboveFoundation},hc=function(e){return e.updateSolarCollectorPoleHeightForAll},pc=function(e){return e.updateSolarCollectorPoleRadiusById},yc=function(e){return e.updateSolarCollectorPoleRadiusAboveFoundation},gc=function(e){return e.updateSolarCollectorPoleRadiusForAll},mc=function(e){return e.updateCspReflectanceById},wc=function(e){return e.updateCspReflectanceAboveFoundation},xc=function(e){return e.updateCspReflectanceForAll},vc=function(e){return e.updateParabolicCollectorAbsorptanceById},bc=function(e){return e.updateParabolicCollectorAbsorptanceAboveFoundation},Ac=function(e){return e.updateParabolicCollectorAbsorptanceForAll},Tc=function(e){return e.updateParabolicCollectorOpticalEfficiencyById},Pc=function(e){return e.updateParabolicCollectorOpticalEfficiencyAboveFoundation},Sc=function(e){return e.updateParabolicCollectorOpticalEfficiencyForAll},jc=function(e){return e.updateParabolicCollectorThermalEfficiencyById},Hc=function(e){return e.updateParabolicCollectorThermalEfficiencyAboveFoundation},zc=function(e){return e.updateParabolicCollectorThermalEfficiencyForAll},Rc=function(e){return e.parabolicTroughActionScope},Dc=function(e){return e.setParabolicTroughActionScope},Mc=function(e){return e.fresnelReflectorActionScope},Wc=function(e){return e.setFresnelReflectorActionScope},Ic=function(e){return e.heliostatActionScope},Cc=function(e){return e.setHeliostatActionScope},Oc=function(e){return e.updateSolarReceiverById},Fc=function(e){return e.updateSolarReceiverAboveFoundation},kc=function(e){return e.updateSolarReceiverForAll},Yc=function(e){return e.parabolicDishActionScope},Lc=function(e){return e.setParabolicDishActionScope},Ec=function(e){return e.updateParabolaLatusRectumById},Uc=function(e){return e.updateParabolaLatusRectumAboveFoundation},Nc=function(e){return e.updateParabolaLatusRectumForAll},Vc=function(e){return e.updateModuleLengthById},Jc=function(e){return e.updateModuleLengthAboveFoundation},Gc=function(e){return e.updateModuleLengthForAll},Xc=function(e){return e.updateInsideLightById},Bc=function(e){return e.updateInsideLightsByParentId},Kc=function(e){return e.copyElementById},qc=function(e){return e.removeElementById},Qc=function(e){return e.removeElementsByType},Zc=function(e){return e.clearDeletedElements},_c=function(e){return e.countElementsByReferenceId},$c=function(e){return e.removeElementsByReferenceId},es=function(e){return e.removeAllChildElementsByType},ts=function(e){return e.removeAllElementsOnFoundationByType},ls=function(e){return e.pasteElementsToPoint},as=function(e){return e.pasteElementsByKey},os=function(e){return e.elementsToPaste},is=function(e){return e.selectMe},rs=function(e){return e.selectNone},ns=function(e){return e.addElement},cs=function(e){return e.objectTypeToAdd},ss=function(e){return e.actionModeLock},ds=function(e){return e.countElementsByType},us=function(e){return e.countSolarStructuresByType},fs=function(e){return e.countObservers},hs=function(e){return e.countAllOffspringsByTypeAtOnce},ps=function(e){return e.countSolarPanelsOnRack},ys=function(e){return e.selectedElementAngle},gs=function(e){return e.waiting},ms=function(e){return e.simulationInProgress},ws=function(e){return e.simulationPaused},xs=function(e){return e.evolutionInProgress},vs=function(e){return e.evolutionPaused},bs=function(e){return e.contextMenuObjectType},As=function(e){return e.enableFineGrid},Ts=function(e){return e.setEnableFineGrid},Ps=function(e){return e.showCloudFilePanel},Ss=function(e){return e.projectInfo},js=function(e){return e.projectView},Hs=function(e){return e.showProjectListPanel},zs=function(e){return e.showModelsGallery},Rs=function(e){return e.showAccountSettingsPanel},Ds=function(e){return e.showLikesPanel},Ms=function(e){return e.showPublishedModelsPanel},Ws=function(e){return e.weatherData},Is=function(e){return e.loadWeatherData},Cs=function(e){return e.getWeather},Os=function(e){return e.loadHorizontalSolarRadiationData},Fs=function(e){return e.getHorizontalSolarRadiation},ks=function(e){return e.loadVerticalSolarRadiationData},Ys=function(e){return e.getVerticalSolarRadiation},Ls=function(e){return e.getClosestCity},Es=function(e){return e.sunlightDirection},Us=function(e){return e.setSunlightDirection},Ns=function(e){return e.showSolarRadiationHeatmap},Vs=function(e){return e.showHeatFluxes},Js=function(e){return e.runSolarPanelVisibilityAnalysis},Gs=function(e){return e.solarPanelVisibilityResults},Xs=function(e){return e.runDailySimulationForSolarPanels},Bs=function(e){return e.runDailySimulationForSolarPanelsLastStep},Ks=function(e){return e.runYearlySimulationForSolarPanels},qs=function(e){return e.runYearlySimulationForSolarPanelsLastStep},Qs=function(e){return e.pauseDailySimulationForSolarPanels},Zs=function(e){return e.pauseYearlySimulationForSolarPanels},_s=function(e){return e.dailyPvYield},$s=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyPvIndividualOutputs},ed=function(e){return e.setDailyPvYield},td=function(e){return e.yearlyPvYield},ld=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyPvIndividualOutputs},ad=function(e){return e.setYearlyPvYield},od=function(e){return e.solarPanelLabels},id=function(e){return e.setSolarPanelLabels},rd=function(e){return e.setTotalBuildingHeater},nd=function(e){return e.setTotalBuildingAc},cd=function(e){return e.setTotalBuildingSolarPanel},sd=function(e){return e.runDailySimulationForParabolicTroughs},dd=function(e){return e.runYearlySimulationForParabolicTroughs},ud=function(e){return e.pauseDailySimulationForParabolicTroughs},fd=function(e){return e.pauseYearlySimulationForParabolicTroughs},hd=function(e){return e.dailyParabolicTroughYield},pd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyParabolicTroughIndividualOutputs},yd=function(e){return e.setDailyParabolicTroughYield},gd=function(e){return e.yearlyParabolicTroughYield},md=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyParabolicTroughIndividualOutputs},wd=function(e){return e.setYearlyParabolicTroughYield},xd=function(e){return e.parabolicTroughLabels},vd=function(e){return e.setParabolicTroughLabels},bd=function(e){return e.runDailySimulationForFresnelReflectors},Ad=function(e){return e.runYearlySimulationForFresnelReflectors},Td=function(e){return e.pauseDailySimulationForFresnelReflectors},Pd=function(e){return e.pauseYearlySimulationForFresnelReflectors},Sd=function(e){return e.dailyFresnelReflectorYield},jd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyFresnelReflectorIndividualOutputs},Hd=function(e){return e.setDailyFresnelReflectorYield},zd=function(e){return e.yearlyFresnelReflectorYield},Rd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyFresnelReflectorIndividualOutputs},Dd=function(e){return e.setYearlyFresnelReflectorYield},Md=function(e){return e.fresnelReflectorLabels},Wd=function(e){return e.setFresnelReflectorLabels},Id=function(e){return e.runDailySimulationForHeliostats},Cd=function(e){return e.runYearlySimulationForHeliostats},Od=function(e){return e.pauseDailySimulationForHeliostats},Fd=function(e){return e.pauseYearlySimulationForHeliostats},kd=function(e){return e.dailyHeliostatYield},Yd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyHeliostatIndividualOutputs},Ld=function(e){return e.setDailyHeliostatYield},Ed=function(e){return e.yearlyHeliostatYield},Ud=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyHeliostatIndividualOutputs},Nd=function(e){return e.setYearlyHeliostatYield},Vd=function(e){return e.heliostatLabels},Jd=function(e){return e.setHeliostatLabels},Gd=function(e){return e.runDailySimulationForUpdraftTower},Xd=function(e){return e.runYearlySimulationForUpdraftTower},Bd=function(e){return e.pauseDailySimulationForUpdraftTower},Kd=function(e){return e.pauseYearlySimulationForUpdraftTower},qd=function(e){return e.dailyUpdraftTowerResults},Qd=function(e){return e.dailyUpdraftTowerYield},Zd=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyUpdraftTowerIndividualOutputs},_d=function(e){return e.setDailyUpdraftTowerResults},$d=function(e){return e.setDailyUpdraftTowerYield},eu=function(e){return e.yearlyUpdraftTowerYield},tu=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyUpdraftTowerIndividualOutputs},lu=function(e){return e.setYearlyUpdraftTowerYield},au=function(e){return e.updraftTowerLabels},ou=function(e){return e.setUpdraftTowerLabels},iu=function(e){return e.runDailySimulationForParabolicDishes},ru=function(e){return e.runYearlySimulationForParabolicDishes},nu=function(e){return e.pauseDailySimulationForParabolicDishes},cu=function(e){return e.pauseYearlySimulationForParabolicDishes},su=function(e){return e.dailyParabolicDishYield},du=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.dailyParabolicDishIndividualOutputs},uu=function(e){return e.setDailyParabolicDishYield},fu=function(e){return e.yearlyParabolicDishYield},hu=function(e){var t;return null===(t=e.graphState)||void 0===t?void 0:t.yearlyParabolicDishIndividualOutputs},pu=function(e){return e.setYearlyParabolicDishYield},yu=function(e){return e.parabolicDishLabels},gu=function(e){return e.setParabolicDishLabels},mu=function(e){return e.runDailyLightSensor},wu=function(e){return e.pauseDailyLightSensor},xu=function(e){return e.runYearlyLightSensor},vu=function(e){return e.pauseYearlyLightSensor},bu=function(e){return e.dailyLightSensorData},Au=function(e){return e.setDailyLightSensorData},Tu=function(e){return e.yearlyLightSensorData},Pu=function(e){return e.setYearlyLightSensorData},Su=function(e){return e.sensorLabels},ju=function(e){return e.setSensorLabels},Hu=function(e){return e.hoveredHandle},zu=function(e){return e.moveHandleType},Ru=function(e){return e.resizeHandleType},Du=function(e){return e.getResizeHandlePosition},Mu=function(e){return e.rotateHandleType},Wu=function(e){return e.resizeAnchor},Iu=function(e){return e.isAddingElement},Cu=function(e){return e.addedFoundationId},Ou=function(e){return e.deletedFoundationId},Fu=function(e){return e.addedCuboidId},ku=function(e){return e.deletedCuboidId},Yu=function(e){return e.addedWallId},Lu=function(e){return e.deletedWallId},Eu=function(e){return e.deletedRoofId},Uu=function(e){return e.deletedRoofIdSet},Nu=function(e){return e.autoDeletedRoofIdSet},Vu=function(e){return e.autoDeletedRoofs},Ju=function(e){return e.autoDeletedChild},Gu=function(e){return e.groupActionMode},Xu=function(e){return e.groupActionUpdateFlag},Bu=function(e){return e.addedWindowId},Ku=function(e){return e.addedDoorId},qu=function(e){return e.updateWallMapOnFoundationFlag},Qu=function(e){return e.wallActionScope},Zu=function(e){return e.roofActionScope},_u=function(e){return e.windowActionScope},$u=function(e){return e.doorActionScope},ef=function(e){return e.setRoofActionScope},tf=function(e){return e.updateWallLeftJointsById},lf=function(e){return e.updateWallRightJointsById},af=function(e){return e.updateWallLeftPointById},of=function(e){return e.updateRoofStructureById},rf=function(e){return e.economicsParams},nf=function(e){return e.fittestIndividualResults},cf=function(e){return e.setFittestIndividualResults},sf=function(e){return e.variableLabels},df=function(e){return e.setVariableLabels},uf=function(e){return e.evolutionaryAlgorithmState},ff=function(e){return e.solarPanelArrayLayoutConstraints},hf=function(e){return e.geneticAlgorithmWizardSelectedTab},pf=function(e){return e.particleSwarmOptimizationWizardSelectedTab},yf=function(e){return e.setPrimitiveStore},gf=l(0),mf=n.a.memo((function(e){var t=e.hx,l=e.hy,a=e.hz,i=e.position,n=e.rotation,c=Ew(As),s=Ew(o.groundImage),d=s?"#888888":"#444444",f=Math.max(t,l),h=Object(r.useState)(Math.floor(f/50)+1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(.5),w=Object(u.a)(m,2),x=w[0],v=w[1];Object(r.useEffect)((function(){c?(g((Math.floor(f/25)+1)*gt),v(s?.05:.1)):(g((Math.floor(f/25)+1)*mt),v(5*(s?.05:.1)))}),[c,f]);var b=Object(r.useMemo)((function(){for(var e=[0],l=y;l<=t;l+=y)e.push(l),e.push(-l);return e}),[y,t]),A=Object(r.useMemo)((function(){for(var e=[0],t=y;t<=l;t+=y)e.push(t),e.push(-t);return e}),[y,l]);return Object(gf.jsxs)("group",{position:null!==i&&void 0!==i?i:[0,0,a+.01],rotation:n,children:[b.map((function(e){return Object(gf.jsx)(Jl.a,{points:[[e,-l,0],[e,l,0]],color:d,lineWidth:x,userData:{unintersectable:!0}},e)})),A.map((function(e){return Object(gf.jsx)(Jl.a,{points:[[-t,e,0],[t,e,0]],color:d,lineWidth:x,userData:{unintersectable:!0}},e)}))]})})),wf=function(e){var t=e.x,l=e.z,a=e.handleType,o=e.scale,i=void 0===o?[1,1,1]:o,n=Ew(si),c=Ew(Ru),s=Object(r.useRef)(),d=Object(r.useState)("white"),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(u.a)(i,3),g=y[0],m=y[1],w=y[2];return Object(r.useEffect)((function(){p(c===a?"red":"white")}),[c]),Object(gf.jsx)(Lt.a,{ref:s,name:a,args:[.2*g,.2*m,.2*w],position:[t,0,l],onPointerEnter:function(){p("red"),n((function(e){e.hoveredHandle=a}))},onPointerLeave:function(){null===c&&p("white"),n((function(e){e.hoveredHandle=null}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:h})})},xf=n.a.memo(wf),vf=function(e){var t=e.handleType,l=Ew(zu),a=Object(r.useRef)(),o=Object(r.useState)("white"),i=Object(u.a)(o,2),n=i[0],c=i[1];return Object(r.useEffect)((function(){l===B.Mid?c("red"):c("white")}),[l]),Object(gf.jsx)(Lt.h,{ref:a,name:t,args:[.1,6,6],onPointerEnter:function(){c("red")},onPointerLeave:function(){null===l&&c("white")},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:n})})},bf=n.a.memo(vf),Af=l(166),Tf=y()((function(e,t){return{setPrimitiveStore:function(t,l){e((function(e){void 0!==e[t]?e[t]=l:console.error("key ".concat(t," is not defined in PrimitiveStoreState"))}))},changed:!1,setChanged:function(t){e((function(e){e.changed=t}))},skipChange:!0,setSkipChange:function(t){e((function(e){e.skipChange=t}))},waiting:!1,showEconomicsPanel:!1,showNavigationPanel:!1,saveCloudFileFlag:!1,setSaveCloudFileFlag:function(t){e((function(e){e.saveCloudFileFlag=t}))},listCloudFilesFlag:!1,saveLocalFileDialogVisible:!1,modelsMapFlag:!1,leaderboardFlag:!1,showLeaderboard:!1,publishOnModelsMapFlag:!1,modelsMapWeatherStations:!1,createProjectFlag:!1,saveProjectFlag:!1,curateDesignToProjectFlag:!1,showProjectsFlag:!1,updateProjectsFlag:!1,showProjectListPanel:!1,projectImagesUpdateFlag:!1,projectType:M.SOLAR_PANEL_ARRAY,projectTitle:null,projectDescription:null,userCount:0,showCloudFilePanel:!1,openModelsMap:!1,showModelsGallery:!1,showAccountSettingsPanel:!1,showLikesPanel:!1,showPublishedModelsPanel:!1,animateSun:!1,simulationInProgress:!1,simulationPaused:!1,evolutionInProgress:!1,evolutionPaused:!1,runEvolution:!1,pauseEvolution:!1,objectiveEvaluationIndex:0,runDailyThermalSimulation:!1,pauseDailyThermalSimulation:!1,runYearlyThermalSimulation:!1,pauseYearlyThermalSimulation:!1,clearDailySimulationResultsFlag:!1,clearYearlySimulationResultsFlag:!1,runDynamicSimulation:!1,runStaticSimulation:!1,pauseSimulation:!1,runDailySimulationForParabolicDishes:!1,runYearlySimulationForParabolicDishes:!1,pauseDailySimulationForParabolicDishes:!1,pauseYearlySimulationForParabolicDishes:!1,runDailySimulationForParabolicTroughs:!1,runYearlySimulationForParabolicTroughs:!1,pauseDailySimulationForParabolicTroughs:!1,pauseYearlySimulationForParabolicTroughs:!1,runDailySimulationForFresnelReflectors:!1,runYearlySimulationForFresnelReflectors:!1,pauseDailySimulationForFresnelReflectors:!1,pauseYearlySimulationForFresnelReflectors:!1,runDailySimulationForHeliostats:!1,runYearlySimulationForHeliostats:!1,pauseDailySimulationForHeliostats:!1,pauseYearlySimulationForHeliostats:!1,runSolarPanelVisibilityAnalysis:!1,runDailySimulationForSolarPanels:!1,pauseDailySimulationForSolarPanels:!1,runYearlySimulationForSolarPanels:!1,pauseYearlySimulationForSolarPanels:!1,runDailySimulationForSolarPanelsLastStep:!1,runYearlySimulationForSolarPanelsLastStep:!1,runDailyLightSensor:!1,pauseDailyLightSensor:!1,runYearlyLightSensor:!1,pauseYearlyLightSensor:!1,runDailySimulationForUpdraftTower:!1,runYearlySimulationForUpdraftTower:!1,pauseDailySimulationForUpdraftTower:!1,pauseYearlySimulationForUpdraftTower:!1,flagOfDailySimulation:!1,showSolarRadiationHeatmap:!1,showHeatFluxes:!1,duringCameraInteraction:!1,navigationMoveSpeed:3,navigationTurnSpeed:3,elementBeingCanceledId:null,showWallIntersectionPlaneId:null,oldParentId:null,oldFoundationId:null,selectedElementId:null,foundationMovedFlag:!1,updateFoundationMovedFlag:function(){e((function(e){e.foundationMovedFlag=!e.foundationMovedFlag}))},isCameraUnderGround:!1}})),Pf=y()((function(e,t){return{roofSegmentVerticesMap:new Map,setRoofSegmentVertices:function(t,l){e((function(e){e.roofSegmentVerticesMap.set(t,Object(h.a)(l))}))},getRoofSegmentVertices:function(e){return t().roofSegmentVerticesMap.get(e)},deleteRoofSegmentVertices:function(t){e((function(e){e.roofSegmentVerticesMap.delete(t)}))},roofSegmentVerticesWithoutOverhangMap:new Map,setRoofSegmentVerticesWithoutOverhang:function(t,l){e((function(e){e.roofSegmentVerticesWithoutOverhangMap.set(t,l)}))},getRoofSegmentVerticesWithoutOverhang:function(e){return t().roofSegmentVerticesWithoutOverhangMap.get(e)},deleteRoofSegmentVerticesWithoutOverhang:function(t){e((function(e){e.roofSegmentVerticesWithoutOverhangMap.delete(t)}))},dailyLightSensorData:[],setDailyLightSensorData:function(t){e((function(e){e.dailyLightSensorData=Object(h.a)(t)}))},yearlyLightSensorData:[],setYearlyLightSensorData:function(t){e((function(e){e.yearlyLightSensorData=Object(h.a)(t)}))},sensorLabels:[],setSensorLabels:function(t){e((function(e){e.sensorLabels=Object(h.a)(t)}))},dailyPvYield:[],setDailyPvYield:function(t){e((function(e){e.dailyPvYield=Object(h.a)(t)})),Tf.setState((function(e){e.runEvolution&&e.objectiveEvaluationIndex++}))},sumDailyPvYield:function(){var e,t=0,l=Object(f.a)(this.dailyPvYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},getDailyPvProfit:function(){var e=this.sumDailyPvYield(),t=Tw.countAllSolarPanels();return e*Ew.getState().economicsParams.electricitySellingPrice-t*Ew.getState().economicsParams.operationalCostPerUnit},yearlyPvYield:[],setYearlyPvYield:function(t){e((function(e){e.yearlyPvYield=Object(h.a)(t)})),Tf.setState((function(e){e.runEvolution&&e.objectiveEvaluationIndex++}))},sumYearlyPvYield:function(){var e,t,l,a=0,o=Object(f.a)(this.yearlyPvYield);try{for(o.s();!(l=o.n()).done;){var i=l.value;for(var r in i)i.hasOwnProperty(r)&&"Month"!==r&&(a+=i[r])}}catch(n){o.e(n)}finally{o.f()}return a*(12/(null!==(e=null===(t=Ew.getState().world)||void 0===t?void 0:t.daysPerYear)&&void 0!==e?e:6))},getYearlyPvProfit:function(){var e=Tw.countAllSolarPanels();return this.sumYearlyPvYield()*Ew.getState().economicsParams.electricitySellingPrice-e*Ew.getState().economicsParams.operationalCostPerUnit*365},solarPanelLabels:[],setSolarPanelLabels:function(t){e((function(e){e.solarPanelLabels=Object(h.a)(t)}))},solarPanelVisibilityResults:new Map,setSolarPanelVisibilityResult:function(t,l){e((function(e){e.solarPanelVisibilityResults.set(t,l)}))},clearSolarPanelVisibilityResults:function(){e((function(e){e.solarPanelVisibilityResults=new Map}))},dailyParabolicDishYield:[],setDailyParabolicDishYield:function(t){e((function(e){e.dailyParabolicDishYield=Object(h.a)(t)}))},sumDailyParabolicDishYield:function(){var e,t=0,l=Object(f.a)(this.dailyParabolicDishYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyParabolicDishYield:[],setYearlyParabolicDishYield:function(t){e((function(e){e.yearlyParabolicDishYield=Object(h.a)(t)}))},sumYearlyParabolicDishYield:function(){var e,t=0,l=Object(f.a)(this.yearlyParabolicDishYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},parabolicDishLabels:[],setParabolicDishLabels:function(t){e((function(e){e.parabolicDishLabels=Object(h.a)(t)}))},dailyParabolicTroughYield:[],setDailyParabolicTroughYield:function(t){e((function(e){e.dailyParabolicTroughYield=Object(h.a)(t)}))},sumDailyParabolicTroughYield:function(){var e,t=0,l=Object(f.a)(this.dailyParabolicTroughYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyParabolicTroughYield:[],setYearlyParabolicTroughYield:function(t){e((function(e){e.yearlyParabolicTroughYield=Object(h.a)(t)}))},sumYearlyParabolicTroughYield:function(){var e,t=0,l=Object(f.a)(this.yearlyParabolicTroughYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},parabolicTroughLabels:[],setParabolicTroughLabels:function(t){e((function(e){e.parabolicTroughLabels=Object(h.a)(t)}))},dailyFresnelReflectorYield:[],setDailyFresnelReflectorYield:function(t){e((function(e){e.dailyFresnelReflectorYield=Object(h.a)(t)}))},sumDailyFresnelReflectorYield:function(){var e,t=0,l=Object(f.a)(this.dailyFresnelReflectorYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyFresnelReflectorYield:[],setYearlyFresnelReflectorYield:function(t){e((function(e){e.yearlyFresnelReflectorYield=Object(h.a)(t)}))},sumYearlyFresnelReflectorYield:function(){var e,t=0,l=Object(f.a)(this.yearlyFresnelReflectorYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},fresnelReflectorLabels:[],setFresnelReflectorLabels:function(t){e((function(e){e.fresnelReflectorLabels=Object(h.a)(t)}))},dailyHeliostatYield:[],setDailyHeliostatYield:function(t){e((function(e){e.dailyHeliostatYield=Object(h.a)(t)}))},sumDailyHeliostatYield:function(){var e,t=0,l=Object(f.a)(this.dailyHeliostatYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyHeliostatYield:[],setYearlyHeliostatYield:function(t){e((function(e){e.yearlyHeliostatYield=Object(h.a)(t)}))},sumYearlyHeliostatYield:function(){var e,t=0,l=Object(f.a)(this.yearlyHeliostatYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},heliostatLabels:[],setHeliostatLabels:function(t){e((function(e){e.heliostatLabels=Object(h.a)(t)}))},dailyUpdraftTowerResults:[],dailyUpdraftTowerYield:[],setDailyUpdraftTowerResults:function(t){e((function(e){e.dailyUpdraftTowerResults=Object(h.a)(t)}))},setDailyUpdraftTowerYield:function(t){e((function(e){e.dailyUpdraftTowerYield=Object(h.a)(t)}))},sumDailyUpdraftTowerYield:function(){var e,t=0,l=Object(f.a)(this.dailyUpdraftTowerYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Hour"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},yearlyUpdraftTowerYield:[],setYearlyUpdraftTowerYield:function(t){e((function(e){e.yearlyUpdraftTowerYield=Object(h.a)(t)}))},sumYearlyUpdraftTowerYield:function(){var e,t=0,l=Object(f.a)(this.yearlyUpdraftTowerYield);try{for(l.s();!(e=l.n()).done;){var a=e.value;for(var o in a)a.hasOwnProperty(o)&&"Month"!==o&&(t+=a[o])}}catch(i){l.e(i)}finally{l.f()}return t},updraftTowerLabels:[],setUpdraftTowerLabels:function(t){e((function(e){e.updraftTowerLabels=Object(h.a)(t)}))},heatmaps:new Map,setHeatmap:function(t,l){e((function(e){e.heatmaps.set(t,l)}))},getHeatmap:function(e){return t().heatmaps.get(e)},hourlyHeatExchangeArrayMap:new Map,setHourlyHeatExchangeArray:function(t,l){e((function(e){e.hourlyHeatExchangeArrayMap.set(t,l)}))},hourlySolarHeatGainArrayMap:new Map,setHourlySolarHeatGainArray:function(t,l){e((function(e){e.hourlySolarHeatGainArrayMap.set(t,l)}))},hourlySolarPanelOutputArrayMap:new Map,setHourlySolarPanelOutputArray:function(t,l){e((function(e){e.hourlySolarPanelOutputArrayMap.set(t,l)}))},totalBuildingHeater:0,setTotalBuildingHeater:function(t){e((function(e){e.totalBuildingHeater=t}))},totalBuildingAc:0,setTotalBuildingAc:function(t){e((function(e){e.totalBuildingAc=t}))},totalBuildingSolarPanel:0,setTotalBuildingSolarPanel:function(t){e((function(e){e.totalBuildingSolarPanel=t}))},clearHeatmaps:function(){e((function(e){e.heatmaps.clear()}))},clearDataStore:function(){e((function(e){e.heatmaps=new Map,e.hourlyHeatExchangeArrayMap=new Map,e.hourlySolarHeatGainArrayMap=new Map,e.hourlySolarPanelOutputArrayMap=new Map,e.solarPanelVisibilityResults=new Map,e.dailyLightSensorData=[],e.yearlyLightSensorData=[],e.sensorLabels=[],e.dailyPvYield=[],e.yearlyPvYield=[],e.solarPanelLabels=[],e.dailyParabolicDishYield=[],e.yearlyParabolicDishYield=[],e.parabolicDishLabels=[],e.dailyParabolicTroughYield=[],e.yearlyParabolicTroughYield=[],e.parabolicTroughLabels=[],e.dailyFresnelReflectorYield=[],e.yearlyFresnelReflectorYield=[],e.fresnelReflectorLabels=[],e.dailyHeliostatYield=[],e.yearlyHeliostatYield=[],e.heliostatLabels=[],e.dailyUpdraftTowerYield=[],e.dailyUpdraftTowerResults=[],e.yearlyUpdraftTowerYield=[],e.updraftTowerLabels=[]}))},clearRoofVerticesMap:function(){e((function(e){e.roofSegmentVerticesMap.clear(),e.roofSegmentVerticesWithoutOverhangMap.clear()}))}}})),Sf="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEASwzc1iU9gAAABRJREFUCJlj/P//PwMSYGJABaTyAer2AwfmvmPmAAAAAElFTkSuQmCC",jf=l.p+"static/media/roof_01.1418beb1.png",Hf=l.p+"static/media/roof_02.055d6e06.png",zf=l.p+"static/media/roof_03.1d45e089.png",Rf=l.p+"static/media/roof_04.20dee2dd.png",Df=l.p+"static/media/roof_05.34757ec1.png",Mf=l.p+"static/media/roof_06.0fce42da.png",Wf=l.p+"static/media/roof_07.d0b809f8.png",If=new Me.MeshStandardMaterial({color:"white",side:Me.FrontSide}),Cf=n.a.memo((function(e){var t=e.dimension,l=e.mullionData,a=e.shadowEnabled,o=Object(u.a)(t,4),i=o[0],n=(o[1],o[2]),c=o[3],s=Math.min(c,n,i/2),d=l.width,f=l.horizontalMullionSpacing,h=l.verticalMullionSpacing,p=l.color,y=d/2,g=Object(r.useMemo)((function(){return Math.atan2(i/2,s)}),[i,s]),m=Object(r.useMemo)((function(){if(0===s||0===i)return 0;var e=s/2+Math.pow(i,2)/(8*s),t=e-s,l=Math.PI-g,a=Math.pow(t,2),o=Math.pow(e,2),r=a+o-2*a*Math.pow(Math.sin(l),2)-2*t*Math.sqrt((o-a*Math.pow(Math.sin(l),2))*Math.pow(Math.cos(l),2));return Math.sqrt(r)}),[i,s,g]),w=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:p})}),[p]),x=function(e,t){var l=e*t/(i/2),a=l/2+Math.pow(2*t,2)/(8*l),o=Math.acos(Math.min(1,t/a)),r=Math.PI-o,n=new Me.EllipseCurve(0,l-a,a,a,o,r,!1,0).getPoints(24).map((function(e){return new Me.Vector3(e.x,e.y)}));return new Me.CatmullRomCurve3(n)},v=Object(r.useMemo)((function(){var e=[],t=Math.round(i/h)-1;if(t<=0||0===d)return null;var l=i/(t+1),a=l/2;t%2!==0&&(e.push(0),a=l);for(var o=0;o0&&(null===A||void 0===A?void 0:A.map((function(e,t){if(null===e)return null;var l=e.shape,o=e.path;return Object(gf.jsx)(Lt.e,{position:[0,y/2,n/2-s],rotation:[vt,0,0],args:[l,{extrudePath:o,steps:12,bevelEnabled:!1}],castShadow:a,receiveShadow:a,children:w},t)}))),m>0&&Object(gf.jsxs)(gf.Fragment,{children:[T(s,0),T(m,g),T(m,-g)]})]})})),Of=n.a.memo((function(e){var t=e.dimension,l=e.frameData,a=e.shadowEnabled,o=Object(u.a)(t,4),i=o[0],n=(o[1],o[2]),c=o[3],s=i/2,d=Math.min(c,n,s),f=l.color,p=l.width,y=l.sillWidth,g=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:f})}),[f]),m=p/2,w=m/2,x=i+3*p,v=p,b=Object(r.useMemo)((function(){var e=s+p,t=s,l=d+p,a=l/2+Math.pow(2*e,2)/(8*l),o=Math.acos(Math.min(1,e/a)),i=Math.PI-o,r=l-a,n=d,c=n/2+Math.pow(2*t,2)/(8*n),u=Math.acos(Math.min(1,t/c)),f=Math.PI-u,y=n-c,g=new Me.EllipseCurve(0,r,a,a,o,i,!1,0).getPoints(36),m=new Me.EllipseCurve(0,y,c,c,f,u,!0,0).getPoints(36);return new Me.Shape([].concat(Object(h.a)(g),Object(h.a)(m)))}),[c,n,i,p]);return Object(gf.jsxs)("group",{name:"Window Frame Group",position:[0,-w/2,0],children:[d>.1?Object(gf.jsx)(Lt.e,{position:[0,w/2,n/2-d],rotation:[vt,0,0],args:[b,{depth:w,steps:1,bevelEnabled:!1}],castShadow:a,receiveShadow:a,children:g}):Object(gf.jsx)(Lt.a,{position:[0,0,n/2],args:[i+2*p,w,p],castShadow:a,receiveShadow:a,children:g}),Object(gf.jsx)(Lt.a,{position:[-i/2-m,0,-d/2],args:[p,w,n-d],castShadow:a,receiveShadow:a,children:g}),Object(gf.jsx)(Lt.a,{position:[i/2+m,0,-d/2],args:[p,w,n-d],castShadow:a,receiveShadow:a,children:g}),Object(gf.jsx)(Lt.a,{position:[0,0,-n/2-(0===y?0:v/2)],args:0===y?[i+2*p,w,p]:[x,null!==y&&void 0!==y?y:p,v],castShadow:a,receiveShadow:a,children:g})]})})),Ff=n.a.memo((function(e){var t=e.cy,l=e.dimension,a=e.wireframeData,o=e.drawBottom,i=Object(u.a)(l,4),n=i[0],c=(i[1],i[2]),s=i[3],d=a.lineWidth,f=a.lineColor,h=a.selected,p=a.locked,y=a.opacity,g=d/20,m=d/5,w=n/2,x=c/2,v=Math.min(s,c,w),b=function(e,t){var l=e/2+Math.pow(2*t,2)/(8*e),a=Math.acos(Math.min(1,t/l)),o=Math.PI-a,i=new Me.EllipseCurve(0,e-l,l,l,a,o,!1,0).getPoints(24).map((function(e){return new Me.Vector3(e.x,e.y)}));return new Me.CatmullRomCurve3(i)},A=Object(r.useMemo)((function(){return new Me.MeshStandardMaterial({color:f})}),[f]),T=Object(r.useMemo)((function(){return new Me.MeshStandardMaterial({color:yt})}),[]),P=function(e,t){return Object(gf.jsxs)(gf.Fragment,{children:[v>.1?Object(gf.jsx)(Lt.e,{position:[0,0,c/2-v],rotation:[vt,0,0],args:[(l=e,(new Me.Shape).moveTo(0,l).quadraticCurveTo(l,l,l,0).quadraticCurveTo(l,-l,0,-l).quadraticCurveTo(-l,-l,-l,0).quadraticCurveTo(-l,l,0,l)),{extrudePath:b(v,w),steps:24,bevelEnabled:!1}],material:t}):Object(gf.jsx)(Lt.d,{args:[e,e,n,6,1],rotation:[0,0,vt],position:[0,0,x-e/2],material:t}),o&&Object(gf.jsx)(Lt.d,{args:[e,e,n,6,1],rotation:[0,0,vt],position:[0,0,-x],material:t}),Object(gf.jsx)(Lt.d,{args:[e,e,c-v,6,1],rotation:[vt,vt,0],position:[w,0,-v/2],material:t}),Object(gf.jsx)(Lt.d,{args:[e,e,c-v,6,1],rotation:[vt,vt,0],position:[-w,0,-v/2],material:t})]});var l};return Object(gf.jsxs)("group",{name:"Window Wireframe Group",children:[y>0&&Object(gf.jsx)("group",{position:[0,t,0],children:P(g,A)}),p&&h&&P(m,T)]})})),kf=function(e){var t=e.id,l=e.dimension,a=e.position,i=e.mullionData,c=e.frameData,s=e.wireframeData,d=e.leftShutter,f=e.rightShutter,h=e.shutterColor,p=e.shutterWidth,y=e.glassMaterial,g=e.showHeatFluxes,m=e.area,w=e.empty,x=e.interior,v=e.foundation,b=Ew.getState().world,A=Ew(o.heatFluxScaleFactor),T=Ew(o.heatFluxColor),P=Ew(o.heatFluxWidth),S=Ew(o.shadowEnabled),j=Pf(Ai),H=Object(r.useRef)(0),z=Object(r.useRef)(),R=Object(u.a)(l,4),D=R[0],M=R[1],W=R[2],I=R[3],C=Object(u.a)(a,3),O=(C[0],C[1]),F=(C[2],function(e,t){if(I>0){var l=.5*D,a=.5*W,o=Math.min(I,W,l),i=.5*(o+l*l/o);if(Math.abs(e)-a)return!0;var r=t-(W-i-a);return e*e+r*r3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i=new Me.Shape,r=e/2,n=t/2,c=Math.min(l,t,r);if(i.moveTo(a-r,o-n),i.lineTo(a+r,o-n),i.lineTo(a+r,o+n-c),c>.01){var s=c/2+Math.pow(e,2)/(8*c),d=a,u=o+n-s,f=Math.acos(Math.min(1,r/s)),h=Math.PI-f;i.absarc(d,u,s,f,h,!1)}else i.lineTo(a-r,o+n);return i.closePath(),i},Lf=n.a.memo(kf),Ef=new Me.MeshStandardMaterial({color:"white",side:Me.DoubleSide}),Uf=new Me.Euler(0,0,-vt),Nf=n.a.memo((function(e){var t=e.dimension,l=e.polygonTop,a=e.frameData,o=e.shadowEnabled,i=Object(u.a)(t,3),n=i[0],c=(i[1],i[2]),s=Object(u.a)(l,2),d=s[0],f=s[1],h=a.color,p=a.width,y=a.sillWidth,g=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:h})}),[h]),m=n/2,w=c/2,x=p/2/2,v=n+3*p,b=p,A=Object(r.useMemo)((function(){var e=new Me.Vector3(m,-w),t=new Me.Vector3(m,w),l=new Me.Vector3(-m,w),a=new Me.Vector3(-m,-w);return[e,t,new Me.Vector3(d*n,f+w),l,a]}),[m,w,d,f]),T=Object(r.useMemo)((function(){for(var e=[],t=1;t=0;a--){var o=A[a];e.lineTo(o.x,o.y)}return e.closePath(),e}),[A,T]);return Object(gf.jsxs)("group",{name:"Window Frame Group",position:[0,-x/2,0],children:[Object(gf.jsx)(Lt.e,{position:[0,x/2,0],rotation:[vt,0,0],args:[P,{steps:1,depth:x,bevelEnabled:!1}],children:g}),Object(gf.jsx)(Lt.a,{position:[0,0,-c/2-(0===y?0:b/2)],args:0===y?[n+2*p,x,p]:[v,null!==y&&void 0!==y?y:p,b],castShadow:o,receiveShadow:o,children:g})]})})),Vf=function(e){var t=e.id,l=e.dimension,a=e.polygonTop,i=e.position,c=e.glassMaterial,s=e.empty,d=e.interior,f=e.wireframeData,h=e.frameData,p=e.leftShutter,y=e.rightShutter,g=e.shutterColor,m=e.shutterWidth,w=e.area,x=e.showHeatFluxes,v=e.foundation,b=Ew.getState().world,A=Ew(o.heatFluxScaleFactor),T=Ew(o.heatFluxColor),P=Ew(o.heatFluxWidth),S=Pf(Ai),j=Object(r.useRef)(0),H=Object(r.useRef)(),z=Object(u.a)(i,3),R=(z[0],z[1]),D=(z[2],Object(u.a)(l,3)),M=D[0],W=D[1],I=D[2],C=l.map((function(e){return e/2})),O=Object(u.a)(C,3),F=O[0],k=O[1],Y=O[2],L=Object(u.a)(a,2),E=L[0],U=L[1],N=f.lineWidth,V=f.lineColor,J=f.selected,G=f.locked,X=(f.opacity,E*M),B=Math.hypot(U,F-X),K=Math.asin(U/B),q=Math.hypot(U,F+X),Q=-Math.asin(U/q),Z=Ew(o.shadowEnabled),_=function(e,t){var l=.5*M,o=.5*(I+a[1]),i=a[1],r=[{x:-l,y:-o},{x:l,y:-o},{x:l,y:o-i},{x:M*a[0],y:o},{x:-l,y:o-i}];return Tw.isPointInside(e,t,r)},$=Object(r.useMemo)((function(){var e;if(x&&!d&&(!v||!v.notBuilding)){var l=S.get(t);if(l){var o=l.reduce((function(e,t){return e+t}),0);if(0!==w){var i=4*(null!==(e=b.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),r=I+a[1],n=Math.max(2,Math.round(M/i)),c=Math.max(2,Math.round(r/i)),s=M/n,u=r/c,f=o/w*(null!==A&&void 0!==A?A:_e);j.current=f<0?1:0,H.current=Tw.getEuler(Rt,Ht,"YXZ",Math.sign(f)*vt);var h=[],p=a[1]/2;if(f<0)for(var y=0;y1&&void 0!==arguments[1]?arguments[1]:0;return Object(gf.jsx)(Lt.d,{args:[oe,oe,e,3,1],position:[t,ie,0],rotation:[0,0,vt],material:ae})},ne=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return Object(gf.jsx)(Lt.f,{args:[e,W],position:[t,0,0],material:Ef,receiveShadow:Z,castShadow:Z})};return Object(gf.jsxs)(gf.Fragment,{children:[!s&&Object(gf.jsxs)("mesh",{name:"Triangle Glass Plane",position:[0,R,0],rotation:[vt,0,0],children:[Object(gf.jsx)("shapeBufferGeometry",{args:[le]}),c]}),h.showFrame&&Object(gf.jsx)(Nf,{dimension:l,polygonTop:a,frameData:h,shadowEnabled:Z}),Object(gf.jsx)(Cg,{cx:te,lx:ee,lz:I,color:g,showLeft:p,showRight:y,spacing:h.showFrame?h.width/2:0}),Object(gf.jsxs)("group",{position:[0,k,.001-Y],children:[ne(M),re(M)]}),Object(gf.jsxs)("group",{position:[.001-F,k,0],rotation:[0,vt,0],children:[ne(I),re(I)]}),Object(gf.jsxs)("group",{position:[F-.001,k,0],rotation:[0,-vt,0],children:[ne(I),re(I)]}),Object(gf.jsxs)("group",{position:[.001-F,k,Y-.01],rotation:[0,Q,0],children:[ne(q,q/2),re(q,q/2)]}),Object(gf.jsxs)("group",{position:[F-.001,k,Y-.01],rotation:[0,K,0],children:[ne(B,-B/2),re(B,-B/2)]}),$&&$.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==P&&void 0!==P?P:et,color:null!==T&&void 0!==T?T:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:e[j.current].clone().add(new Me.Vector3(0,0===j.current?-.1:.1,0)),args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=H.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==T&&void 0!==T?T:$e})})]},t)}))]})},Jf=function(e,t,l,a){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=new Me.Shape;return r.moveTo(o-e,i-t),r.lineTo(o+e,i-t),r.lineTo(o+e,i+t),r.lineTo(o+l,i+t+a),r.lineTo(o-e,i+t),r.closePath(),r},Gf=n.a.memo(Vf),Xf=function(e){var t=e.id,l=e.index,a=e.foundationModel,i=e.roofType,c=e.segment,s=e.centroid,d=e.thickness,h=e.color,p=e.sideColor,y=e.texture,g=e.heatmap,m=e.windows,w=Ew(tn),x=Tf(Vs),v=Ew(o.heatFluxScaleFactor),b=Ew(o.heatFluxColor),A=Ew(o.heatFluxWidth),T=Pf(Ri),P=Wp(),S=P.transparent,j=P.opacity,H=Object(r.useRef)(0),z=Object(r.useRef)(),R=Object(r.useRef)(),D=Ew.getState().world,M=Pf.getState().hourlyHeatExchangeArrayMap,W=c.points,I=Object(r.useMemo)((function(){if(x){var e=T(t);if(e){var l=[],a=new Me.Vector3(0,0,d+.1);switch(i){case It.Hip:case It.Pyramid:var o,r=Object(f.a)(e);try{for(r.s();!(o=r.n()).done;){var n=o.value,c=[];c.push(n[0].clone().sub(s).add(a)),c.push(n[1].clone().sub(s).add(a)),l.push(c)}}catch(z){r.e(z)}finally{r.f()}break;case It.Mansard:var h,p=Object(f.a)(e.entries());try{for(p.s();!(h=p.n()).done;){var y=Object(u.a)(h.value,2),g=y[0],m=y[1];if(g!==e.length-1){var w=[];w.push(m[0].clone().sub(s).add(a)),w.push(m[1].clone().sub(s).add(a)),l.push(w)}}}catch(z){p.e(z)}finally{p.f()}break;case It.Gambrel:var v,b=Object(f.a)(e.entries());try{for(b.s();!(v=b.n()).done;){var A=Object(u.a)(v.value,2),P=A[0],S=A[1];if(0===P||3===P){var j=[];j.push(S[0].clone().sub(s).add(a)),j.push(S[1].clone().sub(s).add(a)),l.push(j)}var H=[];H.push(S[0].clone().sub(s).add(a)),H.push(S[3].clone().sub(s).add(a)),l.push(H),(H=[]).push(S[1].clone().sub(s).add(a)),H.push(S[2].clone().sub(s).add(a)),l.push(H)}}catch(z){b.e(z)}finally{b.f()}}return l}}}),[x]),C=Object(r.useMemo)((function(){var e;if(x&&(!a||!a.notBuilding)){var o=M.get(t+"-"+l);if(o){var i=o.reduce((function(e,t){return e+t}),0),r=T(t);if(r&&r[l]){var n=Object(u.a)(W,5),c=n[0],d=(n[1],n[2],n[3],n[4].z-c.z),h=r[l].map((function(e){return e.clone().sub(s).add(new Me.Vector3(0,0,d))}));if(h){var p,y=[],g=Object(f.a)(h);try{for(g.s();!(p=g.n()).done;){var m=p.value;y.push({x:m.x,y:m.y})}}catch(ue){g.e(ue)}finally{g.f()}var b=4*(null!==(e=D.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),A=h[0].clone(),P=h[1].clone(),S=h[2].clone(),j=(new Me.Vector3).subVectors(P,A),I=(new Me.Vector3).subVectors(S,A),C=(new Me.Vector3).subVectors(S,P),O=j.length(),F=(new Me.Vector3).crossVectors(I,C).length()/O,k=Math.max(2,Math.floor(O/b)),Y=Math.max(2,Math.floor(F/b));j.normalize(),I.normalize(),C.normalize();var L=(new Me.Vector3).crossVectors(I,C).normalize(),E=j.multiplyScalar(.5*O/k),U=(new Me.Vector3).crossVectors(L,j).normalize().multiplyScalar(.5*F/Y),N=A.clone().add(E).add(U);E.multiplyScalar(2),U.multiplyScalar(2),z.current=L.clone().multiplyScalar(.1);var J=[],G=new Me.Vector3,X=4===h.length?Tw.getTriangleArea(h[0],h[1],h[2])+Tw.getTriangleArea(h[2],h[3],h[0]):Tw.getTriangleArea(h[0],h[1],h[2]);if(0!==X){var B=w(V.Window,t),K=T(t);if(K&&K[l]&&(B=B.filter((function(e){var t=e,a=t.cy+(t.windowType===Yt.Polygonal&&t.polygonTop?t.polygonTop[1]/2:0);return Vm.onSegment(K[l],e.cx,a)}))),B&&B.length>0){var q,Q=Object(f.a)(B);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;X-=Tw.getWindowArea(Z)}}catch(ue){Q.e(ue)}finally{Q.f()}}var _,$=i/X*(null!==v&&void 0!==v?v:_e);H.current=$<0?1:0,R.current=Tw.getEuler(Rt,L,"YXZ",-Math.sign($)*vt);for(var ee=0;ee0){var ae,oe=G.x+s.x,ie=G.y+s.y,re=Object(f.a)(B);try{for(re.s();!(ae=re.n()).done;){var ne=ae.value,ce=Vm.getRelativeWindowVerticesOnRoof(ne),se=Tw.getPoints(ce);if(Tw.isPointInside(oe,ie,se)){_=!1;break}}}catch(ue){re.e(ue)}finally{re.f()}}if(_&&Tw.isPointInside(G.x,G.y,y)){var de=[];$<0?(de.push(G.clone()),de.push(G.clone().add(L.clone().multiplyScalar(-$)))):(de.push(G.clone()),de.push(G.clone().add(L.clone().multiplyScalar($)))),J.push(de)}}return J}}}}}}),[x,v]);return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Bf,{id:t,index:l,segment:c,color:h,sideColor:p,texture:y,heatmap:g,transparent:S,opacity:j,windows:m,centroid:s}),I&&I.map((function(e,t){return Object(gf.jsx)(Jl.a,{points:e,color:"gray",lineWidth:.5,dashed:!0,dashSize:.2,gapSize:.1,receiveShadow:!1,castShadow:!1,name:"Overhang Boundary "+t},t)})),C&&C.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==A&&void 0!==A?A:et,color:null!==b&&void 0!==b?b:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:z.current?e[H.current].clone().add(z.current):e[0],args:[.06,.2,4,1],name:"Normal Vector Arrow Head "+t,rotation:null!==(l=R.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==b&&void 0!==b?b:$e})})]},t)}))]})},Bf=n.a.memo((function(e){var t,l=e.id,a=e.index,i=e.segment,n=e.color,c=e.sideColor,s=e.texture,d=e.heatmap,p=e.transparent,y=e.opacity,g=e.windows,m=e.centroid,w=Ew(o.shadowEnabled),x=Tf(Ns),v=Object(r.useRef)(null),b=i.points,A=x?d:s,T=6===b.length,P=8===b.length,S=Object(r.useMemo)((function(){return g.map((function(e){var t=new Me.Vector3(e.lx,e.lz,2*e.ly),l=new Me.Vector3(e.cx,e.cy,e.cz).sub(m),a=(new Me.Euler).fromArray([].concat(Object(h.a)(e.rotation),["ZXY"]));if(e.windowType===Yt.Polygonal){var o,i=null!==(o=e.polygonTop)&&void 0!==o?o:Fg,r=Object(u.a)(i,2),n=r[0],c=r[1],s=t.x/2,d=t.y/2,f=n*t.x,p=Jf(s,d,f,c),y=new Me.Mesh(new Me.ExtrudeBufferGeometry([p],{steps:1,depth:t.z,bevelEnabled:!1})),g=new Me.Vector3(0,0,-t.z).applyEuler(a);return y.position.copy(l.clone().add(g)),y.rotation.copy(a),y.updateMatrix(),y}if(e.windowType===Yt.Arched){var w=Yf(t.x,t.y,e.archHeight),x=new Me.Mesh(new Me.ExtrudeBufferGeometry([w],{steps:1,depth:t.z,bevelEnabled:!1})),v=new Me.Vector3(0,0,-t.z).applyEuler(a);return x.position.copy(l.clone().add(v)),x.rotation.copy(a),x.updateMatrix(),x}var b=new Me.Mesh(new Me.BoxBufferGeometry(t.x,t.y,t.z));return b.position.copy(l),b.rotation.copy(a),b.updateMatrix(),b}))}),[g,m]),j=null!==(t=z())&&void 0!==t?t:6,H=Object(r.useMemo)((function(){return Array(j).fill(0)}),[j]);if(Object(r.useEffect)((function(){z()}),[]),!T&&!P)return null;function z(){if(v.current&&(T||P)){var e=v.current.geometry;e.index=null,e.clearGroups();var t=[],l=[],a=0,o=0;if(T){var i=b.slice(b.length/2);G(i),x?X():function(e){var t=Object(u.a)(e,3),a=t[0],o=t[1],i=t[2],r=(new Me.Vector3).subVectors(o,a),n=r.length(),c=(new Me.Vector3).subVectors(i,a),s=new Me.Vector2(o.x-a.x,o.y-a.y).length(),d=0,f=r.dot(c)/n,h=r.clone().cross(c).length()/n;l.push(0,0,s,d,f,h)}(i),B(3),G(b.slice(0,b.length/2).reverse()),l.push(0,0,1,0,0,1),B(3),K([[0,1,4,3],[1,2,5,4],[2,0,3,5]])}else{if(!P)throw new Error("segment is neither quad nor tri");var r=b.slice(b.length/2),n=R(r),c=Object(u.a)(n,2),s=c[0],d=c[1];G(s),G(d);var p=Object(u.a)(r,4),y=p[0],m=p[1],w=p[2],A=p[3],j=s[2].equals(A);if(x)X(j);else{var H=(new Me.Vector3).subVectors(m,y),z=(new Me.Vector3).subVectors(w,y),D=(new Me.Vector3).subVectors(A,y),M=new Me.Vector2(m.x-y.x,m.y-y.y).length(),W=M,I=H.dot(z)/M,C=H.clone().cross(z).length()/M,O=H.dot(D)/M,F=H.clone().cross(D).length()/M;j?(l.push(0,0,W,0,O,F),l.push(W,0,I,C,O,F)):(l.push(0,0,W,0,I,C),l.push(0,0,I,C,O,F))}B(6);var k=R(b.slice(0,b.length/2)),Y=Object(u.a)(k,2),L=Y[0],E=Y[1];G(L.reverse()),G(E.reverse()),l.push(0,0,1,0,0,1),l.push(0,1,1,0,1,1),B(6),K([[0,1,5,4],[1,2,6,5],[2,3,7,6],[3,0,4,7]])}if(e.setAttribute("position",new Me.Float32BufferAttribute(t,3)),e.setAttribute("uv",new Me.Float32BufferAttribute(l,2)),e.computeVertexNormals(),e.computeBoundingSphere(),g.length>0){for(var U=[],N=0;N0&&void 0!==arguments[0]&&arguments[0],t=(new Me.Vector3).subVectors(b[1],b[0]),a=t.length();t.normalize();var o=(new Me.Vector3).subVectors(b[2],b[0]);if(T){var i=o.dot(t)/a;l.push(0,0,1,0,i,1)}else if(P){var r=(new Me.Vector3).subVectors(b[3],b[0]),n=r.dot(t)/a,c=o.dot(t)/a;e?(l.push(0,0,1,0,n,1),l.push(1,0,c,1,n,1)):(l.push(0,0,1,0,c,1),l.push(0,0,c,1,n,1))}}function B(t){e.addGroup(a,t,o++),a+=t}function K(e){var a,o=Object(f.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value,r=Object(u.a)(i,4),n=r[0],c=r[1],s=r[2],d=r[3],p=[n,c,d].reduce((function(e,t){return e.concat(b[t].x,b[t].y,b[t].z)}),[]),y=[d,c,s].reduce((function(e,t){return e.concat(b[t].x,b[t].y,b[t].z)}),[]);t.push.apply(t,Object(h.a)(p)),t.push.apply(t,Object(h.a)(y)),l.push(0,0,1,0,0,1),l.push(0,1,1,0,1,1),B(6)}}catch(g){o.e(g)}finally{o.f()}}}function R(e){var t=Object(u.a)(e,4),l=t[0],a=t[1],o=t[2],i=t[3],r=Tw.distanceFromPointToLine2D(i,l,a),n=Tw.distanceFromPointToLine2D(o,l,a),c=[],s=[];return Math.abs(r-n)<.01?l.z>a.z?(c.push(l,a,o),s.push(l,o,i)):(c.push(l,a,i),s.push(a,o,i)):r<=n?(c.push(l,a,i),s.push(a,o,i)):(c.push(l,a,o),s.push(l,o,i)),[c,s]}var D=function(){return Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:A,transparent:p,opacity:y})},M=function(){return Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:n,map:A,transparent:p,opacity:y})},W=function(){return Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:c,transparent:p,opacity:y})},I=w&&!x;return Object(gf.jsx)("mesh",{ref:v,name:"Buffer Roof Segment ".concat(a),uuid:l+"-"+a,userData:{simulation:!0},receiveShadow:I,castShadow:I,frustumCulled:!1,children:H.map((function(e,t){return 0!==t?Object(gf.jsx)(W,{},"side"+t):x?Object(gf.jsx)(D,{},"heatmap"+t):Object(gf.jsx)(M,{},"texture"+t)}))})})),Kf=n.a.memo(Xf),qf=function(e){var t=e.cz,l=e.points,a=new Me.Shape;a.moveTo(l[0].x,l[0].y);var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value,n=r.x,c=r.y;a.lineTo(n,c)}}catch(s){i.e(s)}finally{i.f()}return a.closePath(),Object(gf.jsx)(Lt.e,{scale:.99,position:[0,0,t],args:[a,{steps:1,depth:.1,bevelEnabled:!1}],children:Object(gf.jsx)("meshStandardMaterial",{side:Me.DoubleSide,color:"white"})})},Qf=n.a.memo(qf),Zf=l(88),_f=function(e){return Ew((function(t){return t.selectedElementIdSet.has(e)&&!t.groupActionMode}))},$f=function(){return{lng:Ew(Vi)}},eh=new Me.Vector3,th=new Me.Euler,lh=new Me.Vector3,ah=new Me.Vector3(0,0,1),oh=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor;if(0===t.length)return null;for(var i=[],r=new Me.Vector3(0,0,l),n=0;n0&&a.rightPoint.length>0&&(a.leftPoint[0]!==a.rightPoint[0]||a.leftPoint[1]!==a.rightPoint[1])){var o=[],i=Vm.getWallHeight($,l),r=i.lh,n=i.rh;ee.current||(0===l&&(r=$[0].lz),l===$.length-1&&(n=$[$.length-1].lz));var c=Vm.getIntersectionPoint(ne[(l+ne.length-1)%ne.length].leftPoint,ne[(l+ne.length-1)%ne.length].rightPoint,ne[l].leftPoint,ne[l].rightPoint).setZ(r-t).sub(ie),s=Vm.getIntersectionPoint(ne[l].leftPoint,ne[l].rightPoint,ne[(l+1)%ne.length].leftPoint,ne[(l+1)%ne.length].rightPoint).setZ(n-t).sub(ie),d=new Me.Vector3(a.cx,a.cy).sub(ie.clone().setZ(0)).length();o.push(c,s,lh),o.push(c.clone().add(ce),s.clone().add(ce),lh.clone().add(ce)),e.push({points:o,angle:-a.relativeAngle,length:d})}}if(!ee.current){var u=ne.length-1,f=Vm.getIntersectionPoint(ne[u-1].leftPoint,ne[u-1].rightPoint,ne[u].leftPoint,ne[u].rightPoint).setZ($[$.length-1].lz-t).sub(ie),h=Vm.getIntersectionPoint(ne[u].leftPoint,ne[u].rightPoint,ne[0].leftPoint,ne[0].rightPoint).setZ($[0].lz-t).sub(ie),p=Math.atan2(h.y-f.y,h.x-f.x);p=p>=0?p:(bt+p)%bt;var y=(new Me.Vector3).addVectors(f,h).setZ(0).divideScalar(2).length(),g=[];g.push(f,h,lh),g.push(f.clone().add(ce),h.clone().add(ce),lh.clone().add(ce)),e.push({points:g,angle:-p,length:y})}return e}),[$,oe,w]),de=Object(r.useMemo)((function(){var e=[];if(0===$.length)return e;e.push((new Me.Vector3).fromArray($[0].leftPoint));var t,l=Object(f.a)($);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push((new Me.Vector3).fromArray(a.rightPoint))}}catch(o){l.e(o)}finally{l.f()}return e}),[$]),ue=0;if(l){a=l.cx,i=l.cy,ue=l.rotation[2];var fe=-Math.atan2(k.position.x-a,k.position.y-i)-ue;eh.set(oe.x,oe.y,ae),th.set(-vt,0,fe,"ZXY")}var pe=Ep();Object(r.useEffect)((function(){if(!pe&&(Ew.getState().addedRoofIdSet.has(c)&&$.length>=2&&function(e,t){if(e.length!==t.size)return!0;var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(!t.has(o.id))return!0}}catch(i){a.e(i)}finally{a.f()}return!1}($,Z))){var e=$.map((function(e){return e.id})),t=new Set(e);C((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Roof)i.id===c&&(i.wallsId=e);else if(i.type===V.Wall&&Z.has(i.id)&&!t.has(i.id)){var r=i;r.roofId=null,r.leftRoofHeight=void 0,r.rightRoofHeight=void 0}}}catch(n){o.e(n)}finally{o.f()}})),Ew.getState().deleteAddedRoofId(c)}}),[Z]),Object(r.useEffect)((function(){if($.length>1){if(Ew.getState().addedRoofIdSet.has(c)){for(var e=function(e){C((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===$[e].id&&o.type===V.Wall){var i=o;i.roofId=c,i.leftRoofHeight=void 0,i.rightRoofHeight=void 0;break}}}catch(r){a.e(r)}finally{a.f()}}))},t=0;t<$.length;t++)e(t);Ew.getState().deleteAddedRoofId(c)}}else O(c,!1,!1,!0)}),[$]),Np(l,c,se,ie,ae,w);var ye=function(){if($.length<2)return!1;var e,t=$[0].lz,l=Object(f.a)($);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(Math.abs(a.lz-t)>.01)return!1}}catch(d){l.e(d)}finally{l.f()}var o,i=Object(f.a)(se);try{for(i.s();!(o=i.n()).done;){var r=o.value,n=Object(u.a)(r.points,2),c=n[0],s=n[1];if(Math.abs(c.z)>.01||Math.abs(s.z)>.01)return!1}}catch(d){i.e(d)}finally{i.f()}return!0},me=Object(r.useState)(ye),we=Object(u.a)(me,2),xe=we[0],ve=we[1];Object(r.useEffect)((function(){ve(ye())}),[$,ae]);var be=Tf(Ns),Ae=Ew(o.solarRadiationHeatmapMaxValue),Te=Pf(wi),Pe=Object(r.useState)([]),je=Object(u.a)(Pe,2),He=je[0],ze=je[1],Re=Object(r.useState)(null),De=Object(u.a)(Re,2),We=De[0],Ie=De[1],Ce=Ew(is),Oe=kp(c,ie,se,xe,It.Pyramid);Object(r.useEffect)((function(){if(be)if(xe){var e=Te(c);if(e){var t=Tw.fetchHeatmapTexture(e,null!==Ae&&void 0!==Ae?Ae:5);if(t){var a=Oe();if(a&&a.length>0&&l){var o,i=new Me.Euler(0,0,l.rotation[2],"ZYX"),r=Number.MAX_VALUE,n=Number.MAX_VALUE,s=-Number.MAX_VALUE,d=-Number.MAX_VALUE,u=Object(f.a)(a);try{for(u.s();!(o=u.n()).done;){var h,p=o.value,y=Object(f.a)(p);try{for(y.s();!(h=y.n()).done;){var g=h.value.clone().applyEuler(i);g.x>s&&(s=g.x),g.xd&&(d=g.y),g.y0){var A=[];if(Oe()){for(var T=0;T0&&l.rightPoint.length>0&&(l.leftPoint[0]!==l.rightPoint[0]||l.leftPoint[1]!==l.rightPoint[1])){var a=Vm.getWallHeight($,t),o=a.lh,i=a.rh;ee.current||(0===t&&(o=$[0].lz),t===$.length-1&&(i=$[$.length-1].lz));var r=new Me.Vector3(l.leftPoint[0],l.leftPoint[1],o),n=new Me.Vector3(l.rightPoint[0],l.rightPoint[1],i);e.push([r,n,ie.clone()])}}if(!ee.current){var s=$[0],d=$[$.length-1],u=new Me.Vector3(d.rightPoint[0],d.rightPoint[1],d.lz),h=new Me.Vector3(s.leftPoint[0],s.leftPoint[1],s.lz);e.push([u,h,ie.clone()])}if(xe){var p,y=[],g=Object(f.a)(e);try{for(g.s();!(p=g.n()).done;){var m=p.value;y.push(m[0].clone())}}catch(w){g.e(w)}finally{g.f()}Pf.getState().setRoofSegmentVerticesWithoutOverhang(c,[y])}else Pf.getState().setRoofSegmentVerticesWithoutOverhang(c,e)}));var Fe=Ew((function(e){return e.elements.filter((function(e){return e.parentId===c&&e.type===V.Window}))}),Zf.a),ke=Vp(c,l,ie,se),Ye=d===he.Default||d===he.NoTexture?p:"white";return Object(gf.jsxs)("group",{name:"Pyramid Roof Group ".concat(c),children:[Object(gf.jsx)("group",{name:"Pyramid Roof Segments Group ".concat(c),userData:ke,position:[oe.x,oe.y,ae],onPointerDown:function(e){Ap(e,l.id,c,se,ie)},onPointerMove:function(e){Pp(e,c)},onPointerUp:function(e){Tp(e,t)},onContextMenu:function(e){Sp(e,c)},children:xe?Object(gf.jsx)(Bp,{id:c,foundationModel:l,roofType:P,roofSegments:se,center:ie,thickness:w,lineWidth:b,lineColor:T,sideColor:g,color:Ye,textureType:d,heatmap:We}):Object(gf.jsxs)(gf.Fragment,{children:[se.map((function(e,t){var a=e.points;if(a.length>0){var o=Object(u.a)(a,2),i=o[0],r=o[1];if(i.distanceTo(r)>.1)return Object(gf.jsx)("group",{name:"Roof segment ".concat(t),children:Object(gf.jsx)(Kf,{id:c,index:t,foundationModel:l,roofType:P,segment:e,centroid:ie,thickness:w,color:Ye,sideColor:g,texture:D,heatmap:He&&t0&&Object(gf.jsx)(Qf,{points:de,cz:$[0].lz}),M&&!x&&Object(gf.jsx)(jp,{position:[oe.x,oe.y,ae+w+.15],onPointerDown:function(e){Ce(t.id,e,X.Select),G(!0),Et.getState().setEnableOrbitController(!1),q.current=!0,Q.current=H,C((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=ae+t.thickness}))},onPointerUp:function(){G(!1),Et.getState().setEnableOrbitController(!0)},onPointerOver:function(){C((function(e){e.hoveredHandle=ge.Top,e.selectedElementHeight=ae+t.thickness,e.selectedElementX=oe.x,e.selectedElementY=oe.y}))}}),J&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:B,args:[1e3,100],visible:!1,rotation:th,position:eh,onPointerMove:function(e){if(B.current&&q.current&&l){!function(e){E.x=e.offsetX/Y.domElement.clientWidth*2-1,E.y=-e.offsetY/Y.domElement.clientHeight*2+1,L.setFromCamera(E,k)}(e);var a=L.intersectObjects([B.current]);if(a[0]){var o=a[0].point;if(o.z<.001)return;var i=Math.max(0,o.z-l.lz-.3-le);Ew.getState().updateRoofRiseById(c,i,ae+t.thickness)}}},onPointerUp:function(e){wp(c,Q.current,H),G(!1),Et.getState().setEnableOrbitController(!0),q.current=!1}})]})},rh=n.a.memo(ih,zp),nh=function(e,t,l){var a=l.left,o=l.right,i=l.center,r=l.centerLeft,n=l.centerRight,c=e/2,s=t/2,d=[{x:-c,y:a-s},{x:-c,y:-s},{x:c,y:-s},{x:c,y:o-s}];if(n){var f=Object(u.a)(n,2),h=f[0],p=f[1];d.push({x:h*e,y:p-s})}if(i){var y=Object(u.a)(i,2),g=y[0],m=y[1];d.push({x:g*e,y:m-s})}if(r){var w=Object(u.a)(r,2),x=w[0],v=w[1];d.push({x:x*e,y:v-s})}return d},ch=function(e,t){var l,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Wall&&o.foundationId===t&&e.has(o.id)){var i=e.get(o.id);if(i){var r,n=o,c=nh(n.lx,n.lz,i),s=Object(f.a)(Ew.getState().elements);try{for(s.s();!(r=s.n()).done;){var d=r.value;if(d.parentId===n.id){var h=d.cx,p=d.cz,y=d.lx,g=d.ly,m=d.lz;if(h*=n.lx,p*=n.lz,d.type!==V.SolarPanel?(y*=n.lx,m*=n.lz):m=g,d.type===V.Window&&d.windowType===Yt.Polygonal){var w,x=null!==(w=d.polygonTop)&&void 0!==w?w:Fg,v=Object(u.a)(x,2),b=v[0],A=v[1],T=h+b*y,P=p+m/2+A;if(!Tw.isPointInside(T,P,c))return!1}if(!Tw.isElementInsideWall(new Me.Vector3(h,0,p),y,m,c,d.type===V.Door))return!1}}}catch(S){s.e(S)}finally{s.f()}}}}}catch(S){a.e(S)}finally{a.f()}return!0},sh=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor;if(0===t.length)return null;var i=[],r=new Me.Vector3(0,0,l),n=t[0].points,c=t[1].points,s=t[2].points,d=t[3].points;i.push(c[3],c[0],n[0],n[1],n[2],c[2],s[0],d[0],d[1],s[1],c[3]);var u=Math.abs(n[0].z)<.15,f=Object(gf.jsx)(Jl.a,{points:i,lineWidth:a,color:o}),h=Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:[c[0],c[1]],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[c[2],c[3]],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[s[2],s[3]],lineWidth:a,color:o})]});return Object(gf.jsxs)(gf.Fragment,{children:[f,!u&&h,Object(gf.jsxs)("group",{position:[0,0,l],children:[f,!u&&h]}),Object(gf.jsx)(Jl.a,{points:[n[0],n[0].clone().add(r)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[n[1],n[1].clone().add(r)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[d[0],d[0].clone().add(r)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[d[1],d[1].clone().add(r)],lineWidth:a,color:o})]})})),dh=new Me.Vector3,uh=new Me.Euler,fh=new Me.Vector2,hh=new Me.Vector3(0,0,1),ph=function(e){var t=e.roofModel,l=e.foundationModel,a=t.id,i=t.cx,n=t.cy,c=t.lz,s=t.wallsId,d=t.parentId,p=t.topRidgeLeftPoint,y=t.frontRidgeLeftPoint,g=t.backRidgeLeftPoint,m=t.topRidgePoint,w=t.frontRidgePoint,x=t.backRidgePoint,v=t.textureType,b=t.color,A=void 0===b?"white":b,T=t.sideColor,P=void 0===T?"white":T,S=t.thickness,j=void 0===S?.2:S,H=t.locked,z=t.lineColor,R=void 0===z?"black":z,D=t.lineWidth,M=void 0===D?.2:D,W=t.roofType,I=t.rise,C=void 0===I?c:I,O=t.ceiling,F=void 0!==O&&O;void 0===m&&(m=p?Object(h.a)(p):[0,1]),void 0===w&&(w=y?Object(h.a)(y):[.35,.5]),void 0===x&&(x=g?Object(h.a)(g):[.35,.5]);var k=_f(a),Y=Vm.getWireframetStyle(R,M,k,H),L=Object(u.a)(Y,2);R=L[0],M=L[1];var E=Ew(si),U=Ew(qc),N=Mp(v),J=Object(r.useState)(ge.Null),G=Object(u.a)(J,2),B=G[0],q=G[1],Q=Object(r.useState)(!1),Z=Object(u.a)(Q,2),_=Z[0],$=Z[1],ee=Object(r.useRef)(null),te=Object(Se.f)(),le=te.gl,ae=te.camera,oe=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),ie=Object(r.useMemo)((function(){return new Me.Vector2}),[]),re=Object(r.useRef)([0,0]),ne=Object(r.useRef)(C),ce=Object(r.useRef)(!1),se=C<.01,de=function(e,t,l){E((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&r.type===V.Roof&&r.roofType===It.Gambrel){var n=r;switch(t){case ge.FrontLeft:case ge.FrontRight:n.frontRidgePoint=Object(h.a)(l);break;case ge.TopLeft:case ge.TopRight:n.topRidgePoint=Object(h.a)(l);break;case ge.BackLeft:case ge.BackRight:n.backRidgePoint=Object(h.a)(l)}break}}}catch(c){i.e(c)}finally{i.f()}}))},ue=function(e,t,l,a){var o={name:"Resize Gambrel Roof Ridge",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldVal:Object(h.a)(l),newVal:Object(h.a)(a),type:t,undo:function(){de(o.resizedElementId,o.type,o.oldVal)},redo:function(){de(o.resizedElementId,o.type,o.newVal)}};Ew.getState().addUndoable(o)},fe=function(e,t){$(!0),Et.getState().setEnableOrbitController(!1),dh.set(e.x,e.y,e.z).add(He),l&&t&&uh.set(vt,0,t.relativeAngle,"ZXY")},pe=function(e,t,l){var a=new Me.Vector2(e.cx,e.cy),o=Vm.getComposedWallCenter(t),i=Vm.getComposedWallLength(t),r=new Me.Vector2(o.x,o.y).rotateAround(fh,e.rotation[2]).add(a),n=e.rotation[2]+t.relativeAngle,c=new Me.Vector2(l.x,l.y).sub(r).rotateAround(fh,-n).x/i;return Math.min(Math.abs(c),.5)*(c>=0?1:-1)},ye=function(e,t,l,a){if(!e)return new Me.Vector3;var o=Vm.getComposedWallLength(e),i=new Me.Euler(0,0,e.relativeAngle),r=new Me.Vector3(t*o,0,0),n=je;a&&(n=l*(je-a.lz)+a.lz);var c=Vm.getComposedWallCenter(e);return new Me.Vector3(c.x,c.y,n).add(r.applyEuler(i))},me=function(e,t){var l,a,o=e[t];return 0===t||2===t?(l=o.lz,a=o.lz):1===t?(l=e[0].lz,a=e[2].lz):(l=e[2].lz,a=e[0].lz),{lh:l,rh:a}},we=function(e){return e.id===a&&e.type===V.Roof&&e.roofType===It.Gambrel},xe=function(e,t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value,i=o.start,r=o.end,n=o.k,c=o.b;if(t>=i&&t<=r)return n*t+c}}catch(s){a.e(s)}finally{a.f()}return null},ve=function(e,t,l,a,o,i,r){if(1===l||3===l){for(var n=3===l,c=me(t,l),s=n?o:r,d=function(e,t,l,a,o,i,r,n){var c=e[t],s=me(e,t),d=s.lh,u=s.rh,f=(new Me.Vector3).subVectors(c.leftPoint,c.rightPoint).length(),h=f/2,p=function(e){return e*f+h},y=function(e,t){return e*(l-t)+t},g=[new Me.Vector2(p(-i[0]),y(i[1],a)),new Me.Vector2(p(r[0]),l),new Me.Vector2(p(n[0]),y(n[1],o)),new Me.Vector2(f,u)];return g.map((function(e,t){return function(e,t){var l=t.x-e.x,a=(t.y-e.y)/l,o=e.y-a*e.x;return{start:e.x,end:t.x,k:a,b:o}}(0===t?new Me.Vector2(0,d):g[t-1],e)}))}(t,l,a,c.lh,c.rh,n?r:o,n?i:[-i[0],i[1]],s),u=d.slice(1).map((function(e){return e.start})),f=t[l],p=f.wallsId.reduce((function(e,t){var l=Ew.getState().elements.find((function(e){return e.id===t}));return l?[].concat(Object(h.a)(e),[l.lx+e[e.length-1]]):e}),[0]),y=0;y=w&&j<=x){var H=(j-T)/A,z=xe(d,j);null!==z&&(0===S?P.centerLeft=[H,z]:1===S?P.center=[H,z]:2===S&&(P.centerRight=[H,z]))}}e.set(g,P)}}return e}},be=function(e,t,l,a,o){var i=new Map;return ve(i,e,1,t,l,a,o),ve(i,e,3,t,l,a,o),i},Ae=Cp(s[0],d),Te=Op(Ae,C,!0),Pe=Te.highestWallHeight,je=Te.topZ;Lp(t,Pe);var He=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae.map((function(e){return{x:e.leftPoint.x,y:e.leftPoint.y}})),t=Tw.calculatePolygonCentroid(e);return new Me.Vector3(t.x,t.y,je)}),[Ae,je]),ze=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[3],t=m,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,a,o).sub(He)}),[Ae,He,m]),Re=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[1],t=m,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,-a,o).sub(He)}),[Ae,He,m]),De=Object(r.useMemo)((function(){return(new Me.Vector3).addVectors(ze,Re).divideScalar(2)}),[ze,Re]),We=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[3],t=w,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,a,o,Ae[0]).sub(He)}),[Ae,He,w]),Ie=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[1],t=w,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,-a,o,Ae[0]).sub(He)}),[Ae,He,w]),Ce=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[1],t=x,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,a,o,Ae[2]).sub(He)}),[Ae,He,x]),Oe=Object(r.useMemo)((function(){if(!Ae||4!==Ae.length)return new Me.Vector3;var e=Ae[3],t=x,l=Object(u.a)(t,2),a=l[0],o=l[1];return ye(e,-a,o,Ae[2]).sub(He)}),[Ae,He,x]),Fe=Object(r.useMemo)((function(){return Ae&&4===Ae.length?Ae.map((function(e){return Vm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)})):[]}),[Ae]),ke=Object(r.useMemo)((function(){return hh.clone().multiplyScalar(j)}),[j]),Ye=Object(r.useMemo)((function(){var e,t,l,a,o=[];if(!Ae||4!==Ae.length)return o;var i=Object(u.a)(Ae,4),r=i[0],n=(i[1],i[2]),c=(i[3],Object(u.a)(Fe,4)),s=c[0],d=c[1],f=c[2],h=c[3],p=r.leftPoint,y=r.rightPoint,g=n.leftPoint,m=n.rightPoint,w=p.clone().add(s),x=y.clone().add(s),v=m.clone().add(h),b=p.clone().add(h),A=y.clone().add(d),T=g.clone().add(d),P=g.clone().add(f),S=m.clone().add(f),j=[],H=me(Ae,0),z=H.lh,R=H.rh,D=Vm.getDistance(p,y,We.clone().add(He)),M=Math.min((null!==(e=r.eavesLength)&&void 0!==e?e:0)/D*(We.clone().add(He).z-z),z),W=Vm.getDistance(p,y,Ie.clone().add(He)),I=Math.min((null!==(t=r.eavesLength)&&void 0!==t?t:0)/W*(Ie.clone().add(He).z-R),R),C=Vm.getIntersectionPoint(v,b,w,x).setZ(z-M).sub(He),O=Vm.getIntersectionPoint(w,x,A,T).setZ(R-I).sub(He),F=Vm.getIntersectionPoint(We,Ie,v.clone().sub(He),b.clone().sub(He)).setZ(We.z),k=Vm.getIntersectionPoint(Ie,We,A.clone().sub(He),T.clone().sub(He)).setZ(Ie.z);j.push(C,O,k,F),j.push(C.clone().add(ke),O.clone().add(ke),k.clone().add(ke),F.clone().add(ke));var Y=Vm.getComposedWallCenter(r),L=-r.relativeAngle,E=new Me.Vector3(Y.x,Y.y).sub(De.clone().setZ(0)).length();o.push({points:j,angle:L,length:E});var U=[],N=Vm.getIntersectionPoint(ze,Re,v.clone().sub(He),b.clone().sub(He)).setZ(ze.z),V=Vm.getIntersectionPoint(ze,Re,A.clone().sub(He),T.clone().sub(He)).setZ(Re.z);U.push(F,k,V,N),U.push(F.clone().add(ke),k.clone().add(ke),V.clone().add(ke),N.clone().add(ke)),o.push({points:U,angle:L,length:E});var J=-n.relativeAngle,G=me(Ae,2),X=G.lh,B=G.rh,K=Vm.getDistance(g,m,Ce.clone().add(He)),q=Math.min((null!==(l=n.eavesLength)&&void 0!==l?l:0)/K*(Ce.clone().add(He).z-X),X),Q=Vm.getDistance(g,m,Oe.clone().add(He)),Z=Math.min((null!==(a=n.eavesLength)&&void 0!==a?a:0)/Q*(Oe.clone().add(He).z-B),B),_=Vm.getIntersectionPoint(A,T,P,S).setZ(X-q).sub(He),$=Vm.getIntersectionPoint(P,S,v,b).setZ(B-Z).sub(He),ee=Vm.getIntersectionPoint(Ce,Oe,A.clone().sub(He),T.clone().sub(He)).setZ(Oe.z),te=Vm.getIntersectionPoint(Oe,Ce,v.clone().sub(He),b.clone().sub(He)).setZ(Oe.z),le=Vm.getComposedWallCenter(n),ae=new Me.Vector3(le.x,le.y).sub(De.clone().setZ(0)).length(),oe=[];oe.push(ee,te,N,V),oe.push(ee.clone().add(ke),te.clone().add(ke),N.clone().add(ke),V.clone().add(ke)),o.push({points:oe,angle:J,length:ae});var ie=[];return ie.push(_,$,te,ee),ie.push(_.clone().add(ke),$.clone().add(ke),te.clone().add(ke),ee.clone().add(ke)),o.push({points:ie,angle:J,length:ae}),o}),[Ae,je,j,m,w,x]),Le=Object(r.useMemo)((function(){return Ae&&4===Ae.length?Ae.map((function(e){return e.leftPoint})):null}),[Ae]);Object(r.useEffect)((function(){Ae&&4===Ae.length||U(a,!1,!1,!0)}),[Ae]);var Ee=Ep();Object(r.useEffect)((function(){4===(null===Ae||void 0===Ae?void 0:Ae.length)&&(!Ew.getState().addedRoofIdSet.has(a)&&Ee||(se?function(e){var t,l=new Set,a=Object(f.a)(e);try{for(a.s();!(t=a.n()).done;)t.value.wallsId.forEach((function(e){return l.add(e)}))}catch(o){a.e(o)}finally{a.f()}E((function(e){var t,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Wall&&i.foundationId===d&&l.has(i.id)){var r=i;r.leftRoofHeight=je,r.rightRoofHeight=je,r.centerLeftRoofHeight=void 0,r.centerRightRoofHeight=void 0,r.centerRoofHeight=void 0}}}catch(o){a.e(o)}finally{a.f()}}))}(Ae):function(e,t,l,o,i){var r=new Set(e[0].wallsId),n=new Set(e[2].wallsId),c=be(e,t,l,o,i);E((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&i.foundationId===d)if(r.has(i.id)){var s=i,h=me(e,0),p=h.lh,y=h.rh;s.roofId=a,s.leftRoofHeight=p,s.rightRoofHeight=y}else if(n.has(i.id)){var g=i,m=me(e,2),w=m.lh,x=m.rh;g.roofId=a,g.leftRoofHeight=w,g.rightRoofHeight=x}else if(c.has(i.id)){var v=c.get(i.id);if(v){var b=i,A=v.left,T=v.right,P=v.center,S=v.centerLeft,j=v.centerRight;if(b.roofId=a,b.leftRoofHeight=A,b.rightRoofHeight=T,S){var H=Object(u.a)(S,2),z=H[0],R=H[1];b.centerLeftRoofHeight?(b.centerLeftRoofHeight[0]=z,b.centerLeftRoofHeight[1]=R):b.centerLeftRoofHeight=[z,R]}else b.centerLeftRoofHeight=void 0;if(P){var D=Object(u.a)(P,2),M=D[0],W=D[1];b.centerRoofHeight?(b.centerRoofHeight[0]=M,b.centerRoofHeight[1]=W):b.centerRoofHeight=[M,W]}else b.centerRoofHeight=void 0;if(j){var I=Object(u.a)(j,2),C=I[0],O=I[1];b.centerRightRoofHeight?(b.centerRightRoofHeight[0]=C,b.centerRightRoofHeight[1]=O):b.centerRightRoofHeight=[C,O]}else b.centerRightRoofHeight=void 0}}}}catch(F){o.e(F)}finally{o.f()}}))}(Ae,je,w,m,x),bp(l,a,Ye,He,je,j,se),Ew.getState().deleteAddedRoofId(a)))}),[Ye]),Up(l,a,Ye,He,je,j,se);var Ue=kp(a,He,Ye,se,It.Gambrel);Yp((function(){var e=[];if(!Ae||4!==Ae.length)return e;var t=Ae.map((function(e,t,l){return new Me.Vector3(e.leftPoint.x,e.leftPoint.y,me(l,t).lh)})),l=We.clone().add(He),o=Ie.clone().add(He),i=Ce.clone().add(He),r=Oe.clone().add(He),n=ze.clone().add(He),c=Re.clone().add(He);e.push([t[0],t[1],o,l]),e.push([l,o,c,n]),e.push([n,c,i,r]),e.push([t[2],t[3],r,i]),se?Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,[t]):Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}));var Ne=Ew((function(e){return e.elements.filter((function(e){return e.parentId===a&&e.type===V.Window}))}),Zf.a),Ve=Ew(is),Je=Tf(Ns),Ge=Ew(o.solarRadiationHeatmapMaxValue),Xe=Pf(wi),Be=Object(r.useState)(null),Ke=Object(u.a)(Be,2),qe=Ke[0],Qe=Ke[1],Ze=Object(r.useState)([]),_e=Object(u.a)(Ze,2),$e=_e[0],et=_e[1];Object(r.useEffect)((function(){if(Je)if(se){var e=Xe(a);if(e){var t=Tw.fetchHeatmapTexture(e,null!==Ge&&void 0!==Ge?Ge:5);if(t){var o=Ue();if(o&&o.length>0&&l){var i,r=new Me.Euler(0,0,l.rotation[2],"ZYX"),n=Number.MAX_VALUE,c=Number.MAX_VALUE,s=-Number.MAX_VALUE,d=-Number.MAX_VALUE,u=Object(f.a)(o);try{for(u.s();!(i=u.n()).done;){var h,p=i.value,y=Object(f.a)(p);try{for(y.s();!(h=y.n()).done;){var g=h.value.clone().applyEuler(r);g.x>s&&(s=g.x),g.xd&&(d=g.y),g.y0){for(var A=[],T=0;T0&&Ae[0].lz===Ae[2].lz&&Le&&Object(gf.jsx)(Qf,{cz:Ae[0].lz,points:Le}),k&&!H&&Object(gf.jsxs)("group",{position:[He.x,He.y,He.z+j],children:[Object(gf.jsx)(jp,{position:[De.x,De.y,De.z],onPointerDown:function(e){if(Ve(t.id,e,X.Select),ce.current=!0,ne.current=C,$(!0),dh.set(De.x,De.y,je).add(He),l){var a=-Math.atan2(ae.position.x-i,ae.position.y-n)-l.rotation[2];uh.set(-vt,0,a,"ZXY")}q(ge.TopMid),Et.getState().setEnableOrbitController(!1),E((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=je+t.thickness}))},onPointerOver:function(){E((function(e){e.hoveredHandle=ge.TopMid,e.selectedElementHeight=je+t.thickness,e.selectedElementX=De.x,e.selectedElementY=De.y}))}}),!se&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(jp,{position:[ze.x,ze.y,ze.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(m),fe(ze,Ae[3]),q(ge.TopLeft)}}),Object(gf.jsx)(jp,{position:[Re.x,Re.y,Re.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(m),fe(Re,Ae[1]),q(ge.TopRight)}}),Object(gf.jsx)(jp,{position:[We.x,We.y,We.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(w),fe(We,Ae[3]),q(ge.FrontLeft)}}),Object(gf.jsx)(jp,{position:[Ie.x,Ie.y,Ie.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(w),fe(Ie,Ae[1]),q(ge.FrontRight)}}),Object(gf.jsx)(jp,{position:[Ce.x,Ce.y,Ce.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(x),fe(Ce,Ae[1]),q(ge.BackLeft)}}),Object(gf.jsx)(jp,{position:[Oe.x,Oe.y,Oe.z],onPointerDown:function(){ce.current=!0,re.current=Object(h.a)(x),fe(Oe,Ae[3]),q(ge.BackRight)}})]})]}),_&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:ee,args:[1e3,100],visible:!1,position:dh,rotation:uh,onPointerMove:function(e){if(ee.current&&ce.current&&Ae&&4===Ae.length){!function(e){ie.x=e.offsetX/le.domElement.clientWidth*2-1,ie.y=-e.offsetY/le.domElement.clientHeight*2+1,oe.setFromCamera(ie,ae)}(e);var o=oe.intersectObjects([ee.current]);if(o[0]&&l){var i=o[0].point;if(i.z<.001)return;switch(B){case ge.TopMid:var r=Math.max(0,i.z-l.lz-.3-Pe),n=Pe+r,c=be(Ae,n,w,m,x);ch(c,d)&&Ew.getState().updateRoofRiseById(a,r,n+t.thickness);break;case ge.FrontLeft:if(l&&Ae&&4===Ae.length){var s=Tw.clamp(pe(l,Ae[3],i),m[0]+.05,.45),u=je-Ae[0].lz,f=[s,Tw.clamp((i.z-l.lz-Ae[0].lz)/u,0,1)],h=be(Ae,je,f,m,x);ch(h,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.frontRidgePoint[0]=f[0],t.frontRidgePoint[1]=f[1])}))}break;case ge.FrontRight:if(l&&Ae&&4===Ae.length){var p=Tw.clamp(pe(l,Ae[1],i),-.45,-m[0]-.05),y=je-Ae[0].lz,g=[-p,Tw.clamp((i.z-l.lz-Ae[0].lz)/y,0,1)],v=be(Ae,je,g,m,x);ch(v,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.frontRidgePoint=[].concat(g))}))}break;case ge.TopLeft:if(l&&Ae&&4===Ae.length){var b=[Tw.clamp(pe(l,Ae[3],i),.05-x[0],w[0]-.05),m[1]],A=be(Ae,je,w,b,x);ch(A,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.topRidgePoint=[].concat(b))}))}break;case ge.TopRight:if(l&&Ae&&4===Ae.length){var T=[-Tw.clamp(pe(l,Ae[1],i),.05-w[0],x[0]-.05),m[1]],P=be(Ae,je,w,T,x);ch(P,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.topRidgePoint=[].concat(T))}))}break;case ge.BackLeft:if(l&&Ae&&4===Ae.length){var S=Tw.clamp(pe(l,Ae[1],i),.05-m[0],.45),j=je-Ae[2].lz,H=[S,Tw.clamp((i.z-l.lz-Ae[2].lz)/j,0,1)],z=be(Ae,je,w,m,H);ch(z,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.backRidgePoint=[].concat(H))}))}break;case ge.BackRight:if(l&&Ae&&4===Ae.length){var R=Tw.clamp(pe(l,Ae[3],i),-.45,m[0]-.05),D=je-Ae[2].lz,M=[-R,Tw.clamp((i.z-l.lz-Ae[2].lz)/D,0,1)],W=be(Ae,je,w,m,M);ch(W,d)&&E((function(e){var t=e.elements.find((function(e){return we(e)}));t&&(t.backRidgePoint=[].concat(M))}))}}}}},onPointerUp:function(){switch(B){case ge.TopMid:wp(a,ne.current,C);break;case ge.TopLeft:case ge.TopRight:ue(a,B,re.current,m);break;case ge.FrontLeft:case ge.FrontRight:ue(a,B,re.current,w);break;case ge.BackLeft:case ge.BackRight:ue(a,B,re.current,x)}ce.current=!1,$(!1),q(ge.Null),Et.getState().setEnableOrbitController(!0)},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,transparent:!0,opacity:.5})})]}):null},yh=n.a.memo(ph,zp),gh=new Me.Vector3,mh=new Me.Euler,wh=new Me.Vector2,xh=new Me.Vector3(0,0,1),vh=n.a.memo((function(e){var t=e.start,l=e.end,a=e.width,o=e.height,i=e.offset,n=e.color,c=Object(r.useMemo)((function(){return new Me.Vector2(t.x,t.y)}),[t]),s=Object(r.useMemo)((function(){return new Me.Vector2(l.x,l.y)}),[l]),d=Object(r.useMemo)((function(){return(new Me.Vector2).subVectors(s,c).angle()}),[c,s]),u=Object(r.useMemo)((function(){var e=new Me.Shape,a=c.distanceTo(s),i=t.z-l.z;return e.moveTo(0,0),e.lineTo(a,-i),e.lineTo(a,-i+o),e.lineTo(0,o),e.closePath(),e}),[t,l,c,s,o]);return Object(gf.jsx)("group",{position:i,children:Object(gf.jsx)(Lt.e,{args:[u,{steps:1,depth:a,bevelEnabled:!1}],position:t,rotation:[vt,0,d,"ZXY"],castShadow:!0,receiveShadow:!0,children:Object(gf.jsx)("meshStandardMaterial",{color:n})})})})),bh=function(e){var t=e.ridgeLeftPoint,l=e.ridgeRightPoint,a=e.wallArray,o=e.height,i=e.isShed,c=e.width,s=e.spacing,d=e.color,f=Object(u.a)(a,4),h=f[0],p=f[1],y=f[2],g=f[3],m=Object(r.useMemo)((function(){return(new Me.Vector3).subVectors(l,t).normalize()}),[]),w=Object(r.useMemo)((function(){var e;return t.clone().add(m.clone().multiplyScalar(-(null!==(e=g.eavesLength)&&void 0!==e?e:0)/2))}),[t,g.eavesLength]),x=Object(r.useMemo)((function(){var e;return l.clone().add(m.clone().multiplyScalar((null!==(e=p.eavesLength)&&void 0!==e?e:0)/2))}),[t,p.eavesLength]),v=h.leftPoint.clone().setZ(h.lz),b=y.rightPoint.clone().setZ(y.lz),A=Object(r.useMemo)((function(){if(a.length<4)return[];var e=(new Me.Vector3).subVectors(new Me.Vector3(h.rightPoint.x,h.rightPoint.y,h.lz),v).normalize(),o=(new Me.Vector3).subVectors(new Me.Vector3(y.leftPoint.x,y.leftPoint.y,y.lz),b).normalize(),i=t.distanceTo(l),r=(new Me.Vector3).subVectors(h.leftPoint,h.rightPoint).length(),n=(new Me.Vector3).subVectors(y.leftPoint,y.rightPoint).length(),d=c,u=Math.floor((Math.min(i,r,n)-c)/s)+2;return new Array(u).fill(0).map((function(l,a){var r,n,c;c=a===u-1?i:a*s+d;var f=t.clone().add(m.clone().multiplyScalar(c)),p=v.clone().add(e.clone().multiplyScalar(c)),g=b.clone().add(o.clone().multiplyScalar(c)),w=(new Me.Vector3).subVectors(p,f).normalize().multiplyScalar(null!==(r=h.eavesLength)&&void 0!==r?r:0),x=(new Me.Vector3).subVectors(g,f).normalize().multiplyScalar(null!==(n=y.eavesLength)&&void 0!==n?n:0);return p.add(w),g.add(x),{ridge:f,front:p,back:g}}))}),[s,t]),T=t.distanceTo(v)>t.distanceTo(b),P=new Me.Vector3(-c,0,0),S=new Me.Vector3(0,c/2,0);return Object(gf.jsxs)(gf.Fragment,{children:[A.map((function(e,t){return Object(gf.jsx)(n.a.Fragment,{children:i?T?Object(gf.jsx)(vh,{start:e.ridge,end:e.front,width:c,height:o,color:d}):Object(gf.jsx)(vh,{start:e.ridge,end:e.back,width:c,height:o,color:d}):Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(vh,{start:e.ridge,end:e.front,width:c,height:o,color:d}),Object(gf.jsx)(vh,{start:e.ridge,end:e.back,width:c,height:o,color:d,offset:P})]})},t)})),Object(gf.jsx)(vh,{start:w,end:x,width:c,height:o,color:d,offset:S})]})},Ah=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor;if(0===t.length)return null;var i,r=[],n=new Me.Vector3(0,0,l),c=1===t.length,s=Object(f.a)(t);try{for(s.s();!(i=s.n()).done;){var d=i.value,h=Object(u.a)(d.points,4),p=h[0],y=h[1],g=h[2],m=h[3];r.push(m,p,y,g),c&&r.push(m)}}catch(T){s.e(T)}finally{s.f()}var w=Math.abs(t[0].points[0].z)<.015,x=t[0].points[3],v=t[0].points[2],b=Object(gf.jsx)(Jl.a,{points:r,lineWidth:a,color:o}),A=Object(gf.jsx)(Jl.a,{points:[x,v],lineWidth:a,color:o});return Object(gf.jsxs)(gf.Fragment,{children:[b,!w&&!c&&A,Object(gf.jsxs)("group",{position:[0,0,l],children:[b,!w&&!c&&A]}),t.map((function(e,t){var l=Object(u.a)(e.points,4),i=l[0],r=l[1],s=l[2],d=l[3];return Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Jl.a,{points:[i,i.clone().add(n)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[r,r.clone().add(n)],lineWidth:a,color:o}),c&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:[s,s.clone().add(n)],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[d,d.clone().add(n)],lineWidth:a,color:o})]})]},t)}))]})})),Th=function(e){var t=e.roofModel,l=e.foundationModel,a=t.id,i=t.parentId,n=t.wallsId,c=t.lz,s=t.rise,d=void 0===s?c:s,p=t.thickness,y=void 0===p?.2:p,g=t.ridgeLeftPoint,m=t.ridgeRightPoint,w=t.textureType,x=t.color,v=void 0===x?"white":x,b=t.sideColor,A=void 0===b?"white":b,T=t.locked,P=t.lineColor,S=void 0===P?"black":P,j=t.lineWidth,H=void 0===j?.2:j,z=t.roofStructure,R=t.rafterSpacing,D=void 0===R?2:R,M=t.rafterWidth,W=void 0===M?.1:M,I=t.rafterColor,C=void 0===I?"white":I,O=t.glassTint,F=void 0===O?"#73D8FF":O,k=t.opacity,Y=void 0===k?.5:k,L=t.ceiling,E=void 0!==L&&L,U=Ew(si),N=Ew(qc),J=_f(a),G=Vm.getWireframetStyle(S,H,J,T),B=Object(u.a)(G,2);S=B[0],H=B[1];var q=Object(Se.f)(),Q=q.gl,Z=q.camera,_=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),$=Object(r.useMemo)((function(){return new Me.Vector2}),[]),ee=Object(r.useState)(!1),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useState)(ge.Null),ie=Object(u.a)(oe,2),re=ie[0],ne=ie[1],ce=Math.abs(g[0])>.45,se=Object(r.useRef)(null),de=Object(r.useRef)(g[0]),ue=Object(r.useRef)(m[0]),fe=Object(r.useRef)(d),he=Object(r.useRef)(!1),pe=function(e,t,l){U((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&r.type===V.Roof&&r.roofType===It.Gable){r.ridgeLeftPoint[0]=t,r.ridgeRightPoint[0]=l;break}}}catch(n){i.e(n)}finally{i.f()}}))},ye=function(e,t,l){var a=new Me.Vector2(e.cx,e.cy),o=(new Me.Vector3).addVectors(t.leftPoint,t.rightPoint).divideScalar(2),i=(new Me.Vector3).subVectors(t.leftPoint,t.rightPoint).length(),r=new Me.Vector2(o.x,o.y).rotateAround(wh,e.rotation[2]).add(a),n=e.rotation[2]+t.relativeAngle,c=new Me.Vector2(l.x,l.y).sub(r).rotateAround(wh,-n).x/i;return Math.min(Math.abs(c),.5)*(c>=0?1:-1)},me=function(e,t,l){if(!e)return new Me.Vector3;var a=(new Me.Vector3).subVectors(e.leftPoint,e.rightPoint).length(),o=(new Me.Vector3).addVectors(e.leftPoint,e.rightPoint).divideScalar(2),i=new Me.Euler(0,0,e.relativeAngle),r=new Me.Vector3(t*a,0,0),n=l*d+He;return new Me.Vector3(o.x,o.y,n).add(r.applyEuler(i))},we=function(e,t){var l,a,o=e[t];return 0===t||2===t?(l=o.lz,a=o.lz):1===t?(l=e[0].lz,a=e[2].lz):(l=e[2].lz,a=e[0].lz),{lh:l,rh:a}},xe=function(e,t){var l=e.slice().reverse();return ve(l,0,t-1),ve(l,t,l.length-1),l},ve=function(e,t,l){for(;tn&&(T.center=[(n-v)/A-.5,a]),e.set(w,T)}return e},Te=function(e,t,l,a){var o=new Map;return Ae(o,e,1,t,a),Ae(o,e,3,t,l),o},Pe=Cp(n[0],i),je=Op(Pe,d,!0),He=je.highestWallHeight,ze=je.topZ;Lp(t,He);var Re=Object(r.useMemo)((function(){if(null===Pe||4!==Pe.length)return new Me.Vector3;var e=Pe.map((function(e){return{x:e.leftPoint.x,y:e.leftPoint.y}})),t=Tw.calculatePolygonCentroid(e);return new Me.Vector3(t.x,t.y,ze)}),[Pe,ze]),De=Object(r.useMemo)((function(){if(null===Pe)return new Me.Vector3;var e=Pe[3],t=Object(u.a)(g,2),l=t[0],a=t[1];return me(e,l,a)}),[Pe,ze,g]),We=Object(r.useMemo)((function(){if(null===Pe)return new Me.Vector3;var e=Pe[1],t=Object(u.a)(m,2),l=t[0],a=t[1];return me(e,l,a)}),[Pe,ze,m]),Ie=Object(r.useMemo)((function(){return new Me.Vector3((De.x+We.x)/2,(De.y+We.y)/2,ze)}),[De,We]),Ce=Object(r.useMemo)((function(){return Pe&&4===Pe.length?Pe.map((function(e){return Vm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)})):null}),[Pe]),Oe=Object(r.useMemo)((function(){return xh.clone().multiplyScalar(y)}),[y]),Fe=Object(r.useMemo)((function(){var e=[];if(!Pe||4!==Pe.length||!Ce)return e;if(ce){var t,l,a,o,i=[],r=g[0]<0?0:2,n=xe(Pe,r),c=xe(Ce,r),s=Object(u.a)(n,4),d=s[0],f=(s[1],s[2]),h=(s[3],Object(u.a)(c,4)),p=h[0],y=h[1],m=h[2],w=h[3],x=d.leftPoint,v=d.rightPoint,b=f.leftPoint,A=f.rightPoint,T=x.clone().add(p),P=v.clone().add(p),S=A.clone().add(w),j=x.clone().add(w),H=v.clone().add(y),z=b.clone().add(y),R=b.clone().add(m),D=A.clone().add(m),M=we(n,0),W=M.lh,I=M.rh,C=we(n,2),O=C.lh,F=C.rh,k=Vm.getDistance(x,v,A),Y=Math.min((null!==(t=d.eavesLength)&&void 0!==t?t:0)/k*(ze-W),W),L=Vm.getDistance(x,v,b),E=Math.min((null!==(l=d.eavesLength)&&void 0!==l?l:0)/L*(ze-I),I),U=Vm.getDistance(b,A,v),N=Math.min((null!==(a=f.eavesLength)&&void 0!==a?a:0)/U*(ze-I),O),V=Vm.getDistance(b,A,x),J=Math.min((null!==(o=f.eavesLength)&&void 0!==o?o:0)/V*(ze-W),F),G=Vm.getIntersectionPoint(S,j,T,P).setZ(W-Y).sub(Re),X=Vm.getIntersectionPoint(T,P,H,z).setZ(I-E).sub(Re),B=Vm.getIntersectionPoint(H,z,R,D).setZ(ze+N).sub(Re),K=Vm.getIntersectionPoint(R,D,S,j).setZ(ze+J).sub(Re);i.push(G,X,B,K),i.push(G.clone().add(Oe),X.clone().add(Oe),B.clone().add(Oe),K.clone().add(Oe));var q=(new Me.Vector3).addVectors(d.leftPoint,d.rightPoint).divideScalar(2).clone().sub(Ie.clone().setZ(0)).length();e.push({points:i,angle:-d.relativeAngle,length:q})}else{var Q,Z,_,$,ee=Object(u.a)(Pe,4),te=ee[0],le=(ee[1],ee[2]),ae=(ee[3],Object(u.a)(Ce,4)),oe=ae[0],ie=ae[1],re=ae[2],ne=ae[3],se=te.leftPoint.clone().add(oe),de=te.rightPoint.clone().add(oe),ue=le.rightPoint.clone().add(ne),fe=te.leftPoint.clone().add(ne),he=te.rightPoint.clone().add(ie),pe=le.leftPoint.clone().add(ie),ye=le.leftPoint.clone().add(re),ge=le.rightPoint.clone().add(re),me=Vm.getIntersectionPoint(De,We,ue.clone(),fe.clone()).setZ(De.z).sub(Re),ve=Vm.getIntersectionPoint(De,We,he.clone(),pe.clone()).setZ(We.z).sub(Re),be=[],Ae=we(Pe,0),Te=Ae.lh,Se=Ae.rh,je=Vm.getDistance(te.leftPoint,te.rightPoint,De),He=Math.min((null!==(Q=te.eavesLength)&&void 0!==Q?Q:0)/je*(De.z-Te),Te),Fe=Vm.getDistance(te.leftPoint,te.rightPoint,We),ke=Math.min((null!==(Z=te.eavesLength)&&void 0!==Z?Z:0)/Fe*(We.z-Se),Se),Ye=Vm.getIntersectionPoint(ue,fe,se,de).setZ(Te-He).sub(Re),Le=Vm.getIntersectionPoint(se,de,he,pe).setZ(Se-ke).sub(Re);be.push(Ye,Le,ve,me),be.push(Ye.clone().add(Oe),Le.clone().add(Oe),ve.clone().add(Oe),me.clone().add(Oe));var Ee=(new Me.Vector3).addVectors(te.leftPoint,te.rightPoint).divideScalar(2).clone().sub(Re.clone().setZ(0)).length();e.push({points:be,angle:-te.relativeAngle,length:Ee});var Ue=[],Ne=we(Pe,2),Ve=Ne.lh,Je=Ne.rh,Ge=Vm.getDistance(le.leftPoint,le.rightPoint,We),Xe=Math.min((null!==(_=le.eavesLength)&&void 0!==_?_:0)/Ge*(We.z-Ve),Ve),Be=Vm.getDistance(le.leftPoint,le.rightPoint,De),Ke=Math.min((null!==($=le.eavesLength)&&void 0!==$?$:0)/Be*(De.z-Je),Je),qe=Vm.getIntersectionPoint(he,pe,ye,ge).setZ(Ve-Xe).sub(Re),Qe=Vm.getIntersectionPoint(ye,ge,ue,fe).setZ(Je-Ke).sub(Re);Ue.push(qe,Qe,me,ve),Ue.push(qe.clone().add(Oe),Qe.clone().add(Oe),me.clone().add(Oe),ve.clone().add(Oe));var Ze=(new Me.Vector3).addVectors(le.leftPoint,le.rightPoint).divideScalar(2).clone().sub(Re.clone().setZ(0)).length();e.push({points:Ue,angle:-le.relativeAngle,length:Ze})}return e}),[Pe,De,We,ze,y]),ke=Object(r.useMemo)((function(){return Pe&&4===Pe.length?Pe.map((function(e){return e.leftPoint})):null}),[Pe]);Object(r.useEffect)((function(){Pe&&4===Pe.length||N(a,!1,!1,!0)}),[Pe]);var Ye=Ep();Object(r.useEffect)((function(){4===(null===Pe||void 0===Pe?void 0:Pe.length)&&(!Ew.getState().addedRoofIdSet.has(a)&&Ye||(!function(e,t,l,o){var r=Object(u.a)(e,4),n=r[0],c=(r[1],r[2]),s=(r[3],new Set(n.wallsId)),d=new Set(c.wallsId),h=Te(e,t,l,o);U((function(o){var r,n=Object(f.a)(o.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&c.foundationId===i)if(s.has(c.id)){var p=c;if(p.roofId=a,.5===l[0])p.leftRoofHeight=t,p.rightRoofHeight=t,p.centerRoofHeight=void 0;else{var y=we(e,0),g=y.lh,m=y.rh;p.leftRoofHeight=g,p.rightRoofHeight=m}}else if(d.has(c.id)){var w=c;if(w.roofId=a,-.5===l[0])w.leftRoofHeight=t,w.rightRoofHeight=t,w.centerRoofHeight=void 0;else{var x=we(e,2),v=x.lh,b=x.rh;w.leftRoofHeight=v,w.rightRoofHeight=b}}else if(h.has(c.id)){var A=h.get(c.id);if(A){var T=c,P=A.left,S=A.right,j=A.center;if(T.roofId=a,T.leftRoofHeight=P,T.rightRoofHeight=S,j){var H=Object(u.a)(j,2),z=H[0],R=H[1];T.centerRoofHeight?(T.centerRoofHeight[0]=z,T.centerRoofHeight[1]=R):T.centerRoofHeight=[z,R]}else T.centerRoofHeight=void 0}}}}catch(D){n.e(D)}finally{n.f()}}))}(Pe,ze,g,m),bp(l,a,Fe,Re,ze,y),Ew.getState().deleteAddedRoofId(a)))}),[Fe]),Up(l,a,Fe,Re,ze,y);kp(a,Re,Fe,!1,It.Gable),Yp((function(){if(Pe&&4===Pe.length){var e=[];if(ce){var t=g[0]<0?0:2,l=xe(Pe,t).map((function(e,t,l){return new Me.Vector3(e.leftPoint.x,e.leftPoint.y,we(l,t).lh)}));e.push(l)}else{var o=Pe.map((function(e,t,l){return new Me.Vector3(e.leftPoint.x,e.leftPoint.y,we(l,t).lh)}));e.push([o[0],o[1],We.clone(),De.clone()]),e.push([o[2],o[3],De.clone(),We.clone()])}Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}}));var Le=Ew((function(e){return e.elements.filter((function(e){return e.parentId===a&&e.type===V.Window}))}),Zf.a),Ee=Ew(is),Ue=Tf(Ns),Ne=Ew(o.solarRadiationHeatmapMaxValue),Ve=Pf(wi),Je=Object(r.useState)([]),Ge=Object(u.a)(Je,2),Xe=Ge[0],Be=Ge[1];Object(r.useEffect)((function(){if(Ue){var e=Fe.length;if(e>0){for(var t=[],l=0;l0&&Object(gf.jsx)(Ah,{roofSegments:Fe,thickness:y,lineColor:S,lineWidth:z===Ct.Rafter?.1:H})]}),E&&d>0&&Pe[0].lz===Pe[2].lz&&ke&&Object(gf.jsx)(Qf,{cz:Pe[0].lz,points:ke}),z===Ct.Rafter&&Pe&&4===Pe.length&&Object(gf.jsx)("group",{onContextMenu:function(e){Sp(e,a)},onPointerDown:function(e){mp(e,a,i)},children:Object(gf.jsx)(bh,{ridgeLeftPoint:De,ridgeRightPoint:We,wallArray:Pe,overhang:0,isShed:ce,height:y,spacing:D,color:C,width:W})}),J&&!T&&Object(gf.jsxs)("group",{position:[0,0,y],children:[Object(gf.jsx)(jp,{position:[Ie.x,Ie.y,Ie.z+.15],onPointerDown:function(e){if(Ee(t.id,e,X.Select),he.current=!0,fe.current=d,ae(!0),gh.set(Ie.x,Ie.y,ze),l){var a=-Math.atan2(Z.position.x-l.cx,Z.position.y-l.cy)-l.rotation[2];mh.set(-vt,0,a,"ZXY")}ne(ge.Mid),Et.getState().setEnableOrbitController(!1),U((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=ze+t.thickness}))},onPointerOver:function(){U((function(e){e.hoveredHandle=ge.Mid,e.selectedElementHeight=ze+t.thickness,e.selectedElementX=Ie.x,e.selectedElementY=Ie.y}))}}),Object(gf.jsx)(jp,{position:[De.x,De.y,De.z+.15],onPointerDown:function(){if(he.current=!0,de.current=g[0],ue.current=m[0],ae(!0),gh.set(De.x,De.y,ze),l&&Pe&&Pe[3]){var e=(new Me.Vector3).subVectors(De,Z.position).normalize(),t=Math.atan2(e.z,Math.hypot(e.x,e.y)),a=Pe[3].relativeAngle;mh.set(-vt+t,0,a,"ZXY")}ne(ge.Left),Et.getState().setEnableOrbitController(!1)}}),Object(gf.jsx)(jp,{position:[We.x,We.y,We.z+.15],onPointerDown:function(){if(he.current=!0,de.current=g[0],ue.current=m[0],ae(!0),gh.set(We.x,We.y,ze),l&&Pe&&Pe[1]){var e=(new Me.Vector3).subVectors(We,Z.position).normalize(),t=Math.atan2(e.z,Math.hypot(e.x,e.y)),a=Pe[1].relativeAngle;mh.set(-vt+t,0,a,"ZXY")}ne(ge.Right),Et.getState().setEnableOrbitController(!1)}})]}),le&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:se,args:[1e3,100],visible:!1,position:gh,rotation:mh,onPointerMove:function(e){if(se.current&&he.current&&l&&Pe&&4===Pe.length){!function(e){$.x=e.offsetX/Q.domElement.clientWidth*2-1,$.y=-e.offsetY/Q.domElement.clientHeight*2+1,_.setFromCamera($,Z)}(e);var o=_.intersectObjects([se.current]);if(o[0]){var r=o[0].point;if(r.z<.001)return;switch(re){case ge.Left:var n=Pe[3];if(n){var c=ye(l,n,r);Math.abs(c)>=.45&&Math.abs(c)<.5&&(c=.45*Math.sign(c));var s=[c,g[1]],d=[-c,m[1]],u=Te(Pe,ze,s,d);ch(u,i)&&pe(a,c,-c)}break;case ge.Right:var f=Pe[1];if(f){var h=ye(l,f,r);Math.abs(h)>=.45&&Math.abs(h)<.5&&(h=.45*Math.sign(h));var p=[-h,g[1]],y=[h,m[1]],w=Te(Pe,ze,p,y);ch(w,i)&&pe(a,-h,h)}break;case ge.Mid:var x;x=ce?Math.max(0,r.z-l.lz-.3-He):r.z-l.lz-.3-He;var v=Te(Pe,He+x,g,m);ch(v,i)&&Ew.getState().updateRoofRiseById(a,x,ze+t.thickness)}}}},onPointerUp:function(){switch(re){case ge.Mid:wp(a,fe.current,d);break;case ge.Left:case ge.Right:!function(e,t,l,a,o){var i={name:"Resize Gable Roof Ridge",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldLeft:t,oldRight:l,newLeft:a,newRight:o,undo:function(){pe(i.resizedElementId,t,l)},redo:function(){pe(i.resizedElementId,a,o)}};Ew.getState().addUndoable(i)}(a,de.current,ue.current,g[0],m[0])}he.current=!1,ae(!1),ne(ge.Null),Et.getState().setEnableOrbitController(!0)},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,transparent:!0,opacity:.5})})]})},Ph=function(e){var t=e.index,l=e.id,a=e.points,i=e.centroid,c=e.angle,s=e.length,d=e.textureType,h=e.heatmaps,p=e.color,y=void 0===p?"white":p,g=e.sideColor,m=e.relativeAngle,w=e.foundation,x=e.roofStructure,v=(e.glassTint,e.opacity),b=void 0===v?.5:v,A=e.windows,T=Ew.getState().world,P=(Ew(Zr),Ew(tn)),S=Tf(Ns),j=Tf(Vs),H=Ew(o.heatFluxScaleFactor),z=Ew(o.heatFluxColor),R=Ew(o.heatFluxWidth),D=Pf(Ri),M=Pf.getState().hourlyHeatExchangeArrayMap,W=Mp(x===Ct.Rafter?he.NoTexture:d),I=Wp(x===Ct.Rafter,b),C=I.transparent,O=I.opacity,F=Object(Se.f)().invalidate,k=Object(r.useRef)(null),Y=Object(r.useRef)(null),L=Object(r.useRef)(null),E=Object(r.useRef)(null),U=Object(r.useRef)(0),N=Object(r.useRef)(),J=Object(r.useRef)(),G=Object(r.useState)(0),X=Object(u.a)(G,2),B=(X[0],X[1]),K=Object(r.useState)(0),q=Object(u.a)(K,2),Q=(q[0],q[1]),Z=Object(r.useState)(!0),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=function(e,t){return e.clone().setZ(0).distanceTo(t.clone().setZ(0))>2},le=Object(r.useMemo)((function(){if(j){var e=D(l);if(e){var t,o=[],r=Object(u.a)(a,5),n=r[0],c=(r[1],r[2],r[3],r[4].z-n.z),s=new Me.Vector3(0,0,c+.1),d=Object(f.a)(e.values());try{for(d.s();!(t=d.n()).done;){var h=t.value,p=[];p.push(h[0].clone().sub(i).add(s)),p.push(h[1].clone().sub(i).add(s)),o.push(p),(p=[]).push(h[0].clone().sub(i).add(s)),p.push(h[3].clone().sub(i).add(s)),o.push(p),(p=[]).push(h[1].clone().sub(i).add(s)),p.push(h[2].clone().sub(i).add(s)),o.push(p)}}catch(y){d.e(y)}finally{d.f()}return o}}}),[j]),ae=Object(r.useMemo)((function(){var e;if(j&&(!w||!w.notBuilding)){var o=M.get(l+"-"+t);if(o){var r=o.reduce((function(e,t){return e+t}),0),n=D(l);if(n&&n[t]){var c=Object(u.a)(a,5),s=c[0],d=(c[1],c[2],c[3],c[4].z-s.z),h=n[t].map((function(e){return e.clone().sub(i).add(new Me.Vector3(0,0,d))}));if(h){var p=Tw.getTriangleArea(h[0],h[1],h[2])+Tw.getTriangleArea(h[2],h[3],h[0]);if(0!==p){var y=P(V.Window,l),g=D(l);if(g&&g[t]&&(y=y.filter((function(e){var l=e,a=l.cy+(l.windowType===Yt.Polygonal&&l.polygonTop?l.polygonTop[1]/2:0);return Vm.onSegment(g[t],e.cx,a)}))),y&&y.length>0){var m,x=Object(f.a)(y);try{for(x.s();!(m=x.n()).done;){var v=m.value;p-=Tw.getWindowArea(v)}}catch(ne){x.e(ne)}finally{x.f()}}var b=4*(null!==(e=T.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),A=h[0].clone(),S=h[1].clone(),z=h[2].clone(),R=(new Me.Vector3).subVectors(S,A),W=(new Me.Vector3).subVectors(z,A),I=(new Me.Vector3).subVectors(z,S),C=R.length(),O=(new Me.Vector3).crossVectors(W,I).length()/C,F=Math.max(2,Math.round(C/b)),k=Math.max(2,Math.round(O/b));R.normalize(),W.normalize(),I.normalize();var Y=(new Me.Vector3).crossVectors(W,I).normalize(),L=R.multiplyScalar(.5*C/F),E=(new Me.Vector3).crossVectors(Y,R).normalize().multiplyScalar(.5*O/k),G=A.clone().add(L).add(E);L.multiplyScalar(2),E.multiplyScalar(2);var X=r/p*(null!==H&&void 0!==H?H:_e);U.current=X<0?1:0,N.current=Y.clone().multiplyScalar(.1),J.current=Tw.getEuler(Rt,Y,"YXZ",-Math.sign(X)*vt);for(var B,K=[],q=new Me.Vector3,Q=0;Q0){var $,ee=q.x+i.x,te=q.y+i.y,le=Object(f.a)(y);try{for(le.s();!($=le.n()).done;){var ae=$.value,oe=Vm.getRelativeWindowVerticesOnRoof(ae),ie=Tw.getPoints(oe);if(Tw.isPointInside(ee,te,ie)){B=!1;break}}}catch(ne){le.e(ne)}finally{le.f()}}if(B){var re=[];X<0?(re.push(q.clone()),re.push(q.clone().add(Y.clone().multiplyScalar(-X)))):(re.push(q.clone()),re.push(q.clone().add(Y.clone().multiplyScalar(X)))),K.push(re)}}return K}}}}}}),[j,H,i,a]);Object(r.useEffect)((function(){var e=Object(u.a)(a,5),t=e[0],l=e[1],o=e[2],i=e[3],r=e[4].z-t.z;if(k.current){var n=k.current.geometry;if(n){var d=new Float32Array(18),f=r+.01;d[0]=a[0].x,d[1]=a[0].y,d[2]=a[0].z+f,d[3]=a[1].x,d[4]=a[1].y,d[5]=a[1].z+f,d[6]=a[2].x,d[7]=a[2].y,d[8]=a[2].z+f,d[9]=a[2].x,d[10]=a[2].y,d[11]=a[2].z+f,d[12]=a[3].x,d[13]=a[3].y,d[14]=a[3].z+f,d[15]=a[0].x,d[16]=a[0].y,d[17]=a[0].z+f,n.setAttribute("position",new Me.Float32BufferAttribute(d,3)),n.computeVertexNormals();var h=[];h.push(0,0),h.push(1,0),h.push(1,1),h.push(1,1),h.push(0,1),h.push(0,0),n.setAttribute("uv",new Me.Float32BufferAttribute(h,2))}}if(Y.current){Y.current.geometry=new Ee(a,c,s);var p=te(t,i)&&te(l,o);if(ee(p),x===Ct.Glass&&p){var y=Tw.calculatePolygonCentroid(a.map(Tw.mapVector3ToPoint2)),g=new Me.Vector3(y.x,y.y,0),w=.25,v=(new Me.Vector3).addVectors(t,g.clone().sub(t).setZ(0).normalize().multiplyScalar(w)),b=(new Me.Vector3).addVectors(l,g.clone().sub(l).setZ(0).normalize().multiplyScalar(w)),A=(new Me.Vector3).addVectors(o,g.clone().sub(o).normalize().multiplyScalar(w)),T=(new Me.Vector3).addVectors(i,g.clone().sub(i).normalize().multiplyScalar(w)),P=[];P.push(v),P.push(b),P.push(A.setZ(b.z)),P.push(T.setZ(v.z)),P.push(v.clone().setZ(1)),P.push(b.clone().setZ(1)),P.push(A.clone().setZ(1)),P.push(T.clone().setZ(1));var S=new Me.Mesh(new Ee(P)),j=Af.a.subtract(Y.current,S);if(Y.current.geometry=j.geometry,function(e){return Math.abs(e)0&&x===Ct.Rafter||x!==Ct.Rafter)&&Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Bf,{id:l,index:t,segment:oe,color:ie,sideColor:null!==g&&void 0!==g?g:"white",texture:W,heatmap:h[t],transparent:C,opacity:O,windows:A,centroid:i})}),le&&le.map((function(e,t){return Object(gf.jsx)(Jl.a,{points:e,color:"gray",lineWidth:.5,dashed:!0,dashSize:.2,gapSize:.1,receiveShadow:!1,castShadow:!1,name:"Overhang Boundary "+t},t)})),ae&&ae.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==R&&void 0!==R?R:et,color:null!==z&&void 0!==z?z:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:N.current?e[U.current].clone().add(N.current):e[0],args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=J.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==z&&void 0!==z?z:$e})})]},t)}))]})},Sh=n.a.memo(Th,zp),jh=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor;if(0===t.length)return null;for(var i=[],r=new Me.Vector3(0,0,l),n=0;n3&&void 0!==arguments[3]&&arguments[3];I((function(o){var i,r=Object(f.a)(o.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.id===e&&n.type===V.Roof&&n.roofType===It.Hip){n.leftRidgeLength=t,n.rightRidgeLength=l,a&&(o.updateElementOnRoofFlag=!0);break}}}catch(c){r.e(c)}finally{r.f()}}))},ve=function(e,t,l,a,o){e.push(t,l,a),o&&e.push(o),e.push(t.clone().add(He),l.clone().add(He),a.clone().add(He)),o&&e.push(o.clone().add(He))},be=Object(r.useMemo)((function(){if(null===O||4!==O.length)return new Me.Vector2;var e=function(e){var t,l=[],a=Object(f.a)(e);try{for(a.s();!(t=a.n()).done;){var o=t.value;l.push({x:o.leftPoint.x,y:o.leftPoint.y})}}catch(i){a.e(i)}finally{a.f()}return l}(O),t=Tw.calculatePolygonCentroid(e);return new Me.Vector2(t.x,t.y)}),[O]),Ae=Object(r.useMemo)((function(){var e=new Me.Vector3,t=new Me.Vector3(be.x,be.y,ie),l=W(d[0]);return l&&e.setX(-Z).applyEuler(new Me.Euler(0,0,l.relativeAngle)).add(t),e}),[be,ie,Z]),Te=Object(r.useMemo)((function(){var e=new Me.Vector3,t=new Me.Vector3(be.x,be.y,ie),l=W(d[0]);return l&&e.setX(te).applyEuler(new Me.Euler(0,0,l.relativeAngle)).add(t),e}),[be,ie,te]),Pe=Object(r.useMemo)((function(){return new Me.Vector3(be.x,be.y,ie)}),[be,ie]),je=Object(r.useMemo)((function(){return null===O||4!==O.length?[]:O.map((function(e){return Vm.getComposedWallNormal(e).multiplyScalar(e.eavesLength)}))}),[O]),He=Object(r.useMemo)((function(){return Rh.clone().multiplyScalar(b)}),[b]),ze=Object(r.useMemo)((function(){return null===O||4!==O.length?null:O.map((function(e,t){return{leftPoint:e.leftPoint.clone().add(je[t]),rightPoint:e.rightPoint.clone().add(je[t])}}))}),[O,je]),Re=Object(r.useMemo)((function(){var e=[];if(null===O||4!==O.length||null===ze)return e;for(var t=function(){if(null===O||4!==O.length)return 0;for(var e=O.map((function(e){return e.leftPoint})),t=[Ae,Te,Te,Ae],l=1/0,a=0;a<4;a++){var o,i,r=O[a],n=Vm.getDistance(e[a],e[(a+1)%4],t[a]),c=Math.min((null!==(o=r.eavesLength)&&void 0!==o?o:0)/n*(t[a].z-r.lz),r.lz),s=Vm.getDistance(e[a],e[(a+1)%4],t[(a+1)%4]),d=Math.min((null!==(i=r.eavesLength)&&void 0!==i?i:0)/s*(t[(a+1)%4].z-r.lz),r.lz);l=Math.min(Math.min(c,d),l)}return Number.isNaN(l)?0:l}(),l=0;l<4;l++){var a=[],o=O[l],i=Vm.getComposedWallHeight(O,l),r=i.lh,n=i.rh,c=Vm.getIntersectionPoint(ze[(l+3)%4].leftPoint,ze[(l+3)%4].rightPoint,ze[l].leftPoint,ze[l].rightPoint).setZ(r-t).sub(Pe),s=Vm.getIntersectionPoint(ze[l].leftPoint,ze[l].rightPoint,ze[(l+1)%4].leftPoint,ze[(l+1)%4].rightPoint).setZ(n-t).sub(Pe),d=(new Me.Vector3).addVectors(o.leftPoint,o.rightPoint).divideScalar(2),u=Ae.clone().sub(Pe),f=Te.clone().sub(Pe),h=0;switch(l){case 0:h=d.clone().sub(Pe.clone().setZ(0)).length(),ve(a,c,s,f,u);break;case 1:h=d.clone().sub(Te.clone().setZ(0)).length(),ve(a,c,s,f);break;case 2:h=d.clone().sub(Pe.clone().setZ(0)).length(),ve(a,c,s,u,f);break;case 3:h=d.clone().sub(Ae.clone().setZ(0)).length(),ve(a,c,s,u)}e.push({points:a,angle:-o.relativeAngle,length:h})}return e}),[O,Ae,Te,ie,b]),De=Object(r.useMemo)((function(){return O&&4===O.length?O.map((function(e){return e.leftPoint})):null}),[O]);Object(r.useEffect)((function(){if(null===O||4!==O.length)C(a,!1,!1,!0);else if(Ew.getState().addedRoofIdSet.has(a)){for(var e=function(e){var t=new Set(O[e].wallsId);I((function(e){var l,o=Object(f.a)(e.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&t.has(i.id)){var r=i;r.roofId=a,r.leftRoofHeight=void 0,r.rightRoofHeight=void 0}}}catch(n){o.e(n)}finally{o.f()}}))},t=0;t0){var e=Re.length;if(e>0){for(var t=[],o=0;o0&&l){var d,u=new Me.Euler(0,0,l.rotation[2],"ZYX"),h=Number.MAX_VALUE,p=Number.MAX_VALUE,y=-Number.MAX_VALUE,g=-Number.MAX_VALUE,m=Object(f.a)(s);try{for(m.s();!(d=m.n()).done;){var w,x=d.value,v=Object(f.a)(x);try{for(v.s();!(w=v.n()).done;){var b=w.value.clone().applyEuler(u);b.x>y&&(y=b.x),b.xg&&(g=b.y),b.y0&&De&&Object(gf.jsx)(Qf,{cz:O[0].lz,points:De}),k&&!A&&Object(gf.jsxs)("group",{position:[0,0,b+.15],children:[Object(gf.jsx)(jp,{position:[Ae.x,Ae.y,Ae.z],onPointerDown:function(){if(fe.current=!0,U(!0),Hh.set(Ae.x,Ae.y,ie),l&&O[0]){var e=Ew.getState().cameraDirection,t=Math.atan2(e.z,e.y),a=O[0].relativeAngle;zh.set(-vt-t,0,a,"ZXY")}B(ge.Left),Et.getState().setEnableOrbitController(!1)}}),Object(gf.jsx)(jp,{position:[Pe.x,Pe.y,Pe.z],onPointerDown:function(e){if(Ce(t.id,e,X.Select),fe.current=!0,pe.current=R,U(!0),Hh.set(Pe.x,Pe.y,ie),l){var a=-Math.atan2(se.position.x-n,se.position.y-c)-l.rotation[2];zh.set(-vt,0,a,"ZXY")}B(ge.Mid),Et.getState().setEnableOrbitController(!1),I((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=ie+t.thickness}))},onPointerOver:function(){I((function(e){e.hoveredHandle=ge.Mid,e.selectedElementHeight=ie+t.thickness,e.selectedElementX=be.x,e.selectedElementY=be.y}))}}),Object(gf.jsx)(jp,{position:[Te.x,Te.y,Te.z],onPointerDown:function(){if(fe.current=!0,U(!0),Hh.set(Te.x,Te.y,ie),l&&O[0]){var e=Ew.getState().cameraDirection,t=Math.atan2(e.z,e.y),a=O[0].relativeAngle;zh.set(-vt-t,0,a,"ZXY")}B(ge.Right),Et.getState().setEnableOrbitController(!1)}})]}),E&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:re,args:[1e3,100],visible:!1,position:Hh,rotation:zh,onPointerMove:function(e){if(re.current&&fe.current){!function(e){ue.x=e.offsetX/ce.domElement.clientWidth*2-1,ue.y=-e.offsetY/ce.domElement.clientHeight*2+1,de.setFromCamera(ue,se)}(e);var o=de.intersectObjects([re.current]);if(o[0]&&l){var i=o[0].point;if(i.z<.001)return;var r=O[0],n=(new Me.Vector3).subVectors(r.rightPoint,r.leftPoint).length();switch(G){case ge.Left:var c=Pe.clone().sub(Hh).applyEuler(new Me.Euler(0,0,-zh.z)),s=i.clone().sub(new Me.Vector3(l.cx,l.cy,l.cz)).applyEuler(new Me.Euler(0,0,-l.rotation[2])).sub(Hh).applyEuler(new Me.Euler(0,0,-zh.z)),d=(new Me.Vector3).subVectors(s,c).x;_(Tw.clamp(-d,.1-te,n/2-.01));break;case ge.Right:var u=Pe.clone().sub(Hh).applyEuler(new Me.Euler(0,0,-zh.z)),f=i.clone().sub(new Me.Vector3(l.cx,l.cy,l.cz)).applyEuler(new Me.Euler(0,0,-l.rotation[2])).sub(Hh).applyEuler(new Me.Euler(0,0,-zh.z)),h=(new Me.Vector3).subVectors(f,u).x;le(Tw.clamp(h,.1-Z,n/2-.01));break;case ge.Mid:var p=Math.max(0,i.z-l.lz-.3-oe);Ew.getState().updateRoofRiseById(a,p,ie+t.thickness)}}}},onPointerUp:function(){switch(G){case ge.Mid:wp(a,pe.current,R);break;case ge.Left:case ge.Right:xe(a,Z,te),function(e,t,l,a,o){var i={name:"Resize Hip Roof Ridge",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldLeftRidgeLength:t,oldRightRidgeLength:l,newLeftRidgeLength:a,newRightRidgeLength:o,undo:function(){xe(i.resizedElementId,i.oldLeftRidgeLength,i.oldRightRidgeLength,!0)},redo:function(){xe(i.resizedElementId,i.newLeftRidgeLength,i.newRightRidgeLength,!0)}};Ew.getState().addUndoable(i)}(a,h,p,Z,te)}fe.current=!1,U(!1),B(ge.Null),Et.getState().setEnableOrbitController(!0)},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,transparent:!0,opacity:.5})})]})},Mh=n.a.memo(Dh,zp),Wh=new Me.Vector3,Ih=new Me.Euler,Ch=new Me.Vector3(0,0,1),Oh=n.a.memo((function(e){var t=e.roofSegments,l=e.thickness,a=e.lineWidth,o=e.lineColor,i=Object(r.useMemo)((function(){return t.reduce((function(e,t){return e.concat(t.points[1])}),[t[0].points[0]])}),[t]),c=Object(r.useMemo)((function(){return t.reduce((function(e,t){return e.concat(t.points[6].clone())}),[t[0].points[7].clone()])}),[t]),s=Object(r.useMemo)((function(){return Object(gf.jsx)(Jl.a,{points:i,lineWidth:a,color:o})}),[i,a,o]);if(t.length<2)return null;var d=Math.abs(t[0].points[0].z-t[0].points[3].z)<.1;return Object(gf.jsxs)(gf.Fragment,{children:[!d&&Object(gf.jsx)(Jl.a,{points:c,lineWidth:a,color:o}),s,Object(gf.jsx)("group",{position:[0,0,l],children:s}),t.map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[!d&&Object(gf.jsx)(Jl.a,{points:[e.points[7],e.points[4]],lineWidth:a,color:o}),Object(gf.jsx)(Jl.a,{points:[e.points[4],e.points[0]],lineWidth:a,color:o})]},t)}))]})})),Fh=function(e){var t=e.roofModel,l=e.foundationModel,a=t.id,i=t.wallsId,c=t.cx,s=t.cy,d=t.lz,p=t.textureType,y=t.color,g=void 0===y?"white":y,m=t.sideColor,w=void 0===m?"white":m,x=t.thickness,v=void 0===x?.2:x,b=t.locked,A=t.lineColor,T=void 0===A?"black":A,P=t.lineWidth,S=void 0===P?.2:P,j=t.roofType,H=t.foundationId,z=t.ridgeWidth,R=void 0===z?1:z,D=t.rise,M=void 0===D?d:D,W=t.ceiling,I=void 0!==W&&W,C=t.frontRidge,O=t.backRidge,F=Mp(p),k=_f(a),Y=Vm.getWireframetStyle(T,S,k,b),L=Object(u.a)(Y,2);T=L[0],S=L[1];var E=Ew(si),U=Ew(qc),N=Ew(o.shadowEnabled),J=Ew((function(e){return e.ray})),G=Ew((function(e){return e.mouse})),B=Object(r.useState)(R),q=Object(u.a)(B,2),Q=q[0],Z=q[1],_=Object(r.useState)(null),$=Object(u.a)(_,2),ee=$[0],te=$[1],le=Object(r.useState)(!1),ae=Object(u.a)(le,2),oe=ae[0],ie=ae[1],re=Object(r.useState)(ge.Null),ne=Object(u.a)(re,2),ce=ne[0],se=ne[1],de=Object(r.useState)(null),ue=Object(u.a)(de,2),fe=ue[0],pe=ue[1],ye=Object(r.useRef)(Q),me=Object(r.useRef)(M),we=Object(r.useRef)(null),xe=Object(r.useRef)(!1),ve=Object(Se.f)(),be=ve.gl,Ae=ve.camera,Te=M<.01,Pe=function(e,t){E((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Roof&&i.roofType===It.Mansard){i.ridgeWidth=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},je=Ip(H,a,i),He=je.currentWallArray,ze=je.isLoopRef,Re=Fp(He,M),De=Re.highestWallHeight,We=Re.topZ;Lp(t,De);var Ie=Object(r.useMemo)((function(){if(He.length<2)return new Me.Vector3;var e=function(e){var t,l=[],a=e.length,o=Object(f.a)(e);try{for(o.s();!(t=o.n()).done;){var i=t.value;void 0!==i.leftPoint[0]&&void 0!==i.leftPoint[1]&&l.push({x:i.leftPoint[0],y:i.leftPoint[1]})}}catch(r){o.e(r)}finally{o.f()}return ze.current||!e[a-1].rightPoint[0]&&0!==e[a-1].rightPoint[0]||!e[a-1].rightPoint[1]&&0!==e[a-1].rightPoint[1]||l.push({x:e[a-1].rightPoint[0],y:e[a-1].rightPoint[1]}),l}(He),t=Tw.calculatePolygonCentroid(e);return Number.isNaN(t.x)||Number.isNaN(t.y)?new Me.Vector3:new Me.Vector3(t.x,t.y,We)}),[He,We]),Ce=Object(r.useMemo)((function(){var e=He.map((function(e){var t;return Vm.getWallNormal(e).multiplyScalar(null!==(t=e.eavesLength)&&void 0!==t?t:0)}));if(!ze.current&&0!==e.length){var t=(new Me.Vector3).subVectors(new Me.Vector3(He[He.length-1].rightPoint[0],He[He.length-1].rightPoint[1]),new Me.Vector3(He[0].leftPoint[0],He[0].leftPoint[1])).applyEuler(Mt).normalize().multiplyScalar(.3);e.push(t)}return e}),[He]),Oe=Object(r.useMemo)((function(){var e=He.map((function(e,t){return{leftPoint:new Me.Vector3(e.leftPoint[0],e.leftPoint[1]).add(Ce[t]),rightPoint:new Me.Vector3(e.rightPoint[0],e.rightPoint[1]).add(Ce[t])}}));return ze.current||0===e.length||e.push({leftPoint:new Me.Vector3(He[He.length-1].rightPoint[0],He[He.length-1].rightPoint[1]).add(Ce[Ce.length-1]),rightPoint:new Me.Vector3(He[0].leftPoint[0],He[0].leftPoint[1]).add(Ce[Ce.length-1])}),e}),[He,Ce]),Fe=Object(r.useMemo)((function(){var e=He.map((function(e,t){var l=new Me.Vector3(e.leftPoint[0],e.leftPoint[1]),a=new Me.Vector3(e.rightPoint[0],e.rightPoint[1]),o=(new Me.Vector3).subVectors(Ie,l).setZ(0).normalize().multiplyScalar(Q),i=(new Me.Vector3).subVectors(Ie,a).setZ(0).normalize().multiplyScalar(Q);return l.add(o).setZ(We),a.add(i).setZ(We),{leftPoint:l,rightPoint:a}}));return ze.current||0===e.length||e.push({leftPoint:e[e.length-1].rightPoint,rightPoint:e[0].leftPoint}),e}),[He,Ie,Q]),ke=Object(r.useMemo)((function(){return Ch.clone().multiplyScalar(v)}),[v]),Ye=Object(r.useMemo)((function(){var e=[];if(He.length<2)return e;for(var t=function(){for(var e=1/0,t=0;t0&&a.rightPoint.length>0&&(a.leftPoint[0]!==a.rightPoint[0]||a.leftPoint[1]!==a.rightPoint[1])){var o=[],i=Vm.getWallHeight(He,l),r=i.lh,n=i.rh;ze.current||(0===l&&(r=He[0].lz),l===He.length-1&&(n=He[He.length-1].lz));var c=Vm.getIntersectionPoint(Oe[(l+Oe.length-1)%Oe.length].leftPoint,Oe[(l+Oe.length-1)%Oe.length].rightPoint,Oe[l].leftPoint,Oe[l].rightPoint).setZ(r-t).sub(Ie),s=Vm.getIntersectionPoint(Oe[l].leftPoint,Oe[l].rightPoint,Oe[(l+1)%Oe.length].leftPoint,Oe[(l+1)%Oe.length].rightPoint).setZ(n-t).sub(Ie),d=Fe[l].leftPoint.clone().sub(Ie),u=Fe[l].rightPoint.clone().sub(Ie),f=new Me.Vector3(a.cx,a.cy).sub(Ie.clone().setZ(0)).length();o.push(c,s,u,d),o.push(c.clone().add(ke),s.clone().add(ke),u.clone().add(ke),d.clone().add(ke)),e.push({points:o,angle:-a.relativeAngle,length:f})}}if(!ze.current){var h=Oe.length-1,p=Vm.getIntersectionPoint(Oe[h-1].leftPoint,Oe[h-1].rightPoint,Oe[h].leftPoint,Oe[h].rightPoint).setZ(He[He.length-1].lz-t).sub(Ie),y=Vm.getIntersectionPoint(Oe[h].leftPoint,Oe[h].rightPoint,Oe[0].leftPoint,Oe[0].rightPoint).setZ(He[0].lz-t).sub(Ie),g=Fe[h].leftPoint.clone().sub(Ie),m=Fe[h].rightPoint.clone().sub(Ie),w=Math.atan2(y.y-p.y,y.x-p.x);w=w>=0?w:(bt+w)%bt;var x=(new Me.Vector3).addVectors(p,y).setZ(0).divideScalar(2).length(),v=[];v.push(p,y,m,g),v.push(p.clone().add(ke),y.clone().add(ke),m.clone().add(ke),g.clone().add(ke)),e.push({points:v,angle:-w,length:x})}return e}),[He,We,Q,v]),Le=Object(r.useMemo)((function(){var e=new Me.Shape;if(Fe.length>0){var t=Fe[0].leftPoint.clone().sub(Ie);e.moveTo(t.x,t.y);var l,a=Object(f.a)(Fe);try{for(a.s();!(l=a.n()).done;){var o=l.value.rightPoint.clone().sub(Ie);e.lineTo(o.x,o.y)}}catch(i){a.e(i)}finally{a.f()}e.closePath()}return e}),[He,Fe]),Ee=Object(r.useMemo)((function(){var e=[];if(0===He.length)return e;e.push((new Me.Vector3).fromArray(He[0].leftPoint));var t,l=Object(f.a)(He);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push((new Me.Vector3).fromArray(a.rightPoint))}}catch(o){l.e(o)}finally{l.f()}return e}),[He]);Object(r.useEffect)((function(){R!==Q&&Z(R)}),[R]),Object(r.useEffect)((function(){if(He.length>1){if(Ew.getState().addedRoofIdSet.has(a)){for(var e=function(e){E((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.id===He[e].id&&i.type===V.Wall){var r=i;r.roofId=a,r.leftRoofHeight=void 0,r.rightRoofHeight=void 0;break}}}catch(n){o.e(n)}finally{o.f()}}))},t=0;t0&&l.rightPoint.length>0&&(l.leftPoint[0]!==l.rightPoint[0]||l.leftPoint[1]!==l.rightPoint[1])){var o=Vm.getWallHeight(He,t),i=o.lh,r=o.rh;ze.current||(0===t&&(i=He[0].lz),t===He.length-1&&(r=He[He.length-1].lz));var n=new Me.Vector3(l.leftPoint[0],l.leftPoint[1],i),c=new Me.Vector3(l.rightPoint[0],l.rightPoint[1],r),s=Fe[t].leftPoint.clone(),d=Fe[t].rightPoint.clone();e.push([n,c,d,s])}}if(!ze.current){var u=He.length-1,h=He[0],p=He[u],y=new Me.Vector3(p.rightPoint[0],p.rightPoint[1],p.lz),g=new Me.Vector3(h.leftPoint[0],h.leftPoint[1],h.lz),m=Fe[u].leftPoint.clone(),w=Fe[u].rightPoint.clone();e.push([y,g,w,m])}var x=Fe.map((function(e){return e.leftPoint.clone()}));if(e.push(x),Te){var v,b=[],A=Object(f.a)(e.slice(0,-1));try{for(A.s();!(v=A.n()).done;){var T=v.value;b.push(T[0].clone())}}catch(P){A.e(P)}finally{A.f()}Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,[b])}else Pf.getState().setRoofSegmentVerticesWithoutOverhang(a,e)}));var Ne=Ew.getState().world,Ve=Ew(is),Je=Tf(Ns),Ge=Ew(o.solarRadiationHeatmapMaxValue),Xe=Pf(wi),Be=Object(r.useState)([]),Ke=Object(u.a)(Be,2),qe=Ke[0],Qe=Ke[1],Ze=Object(r.useState)(null),tt=Object(u.a)(Ze,2),lt=tt[0],at=tt[1],ot=Object(r.useState)(!1),it=Object(u.a)(ot,2),rt=it[0],nt=it[1],ct=Tf(Vs),st=Ew(o.heatFluxScaleFactor),dt=Ew(o.heatFluxColor),ut=Ew(o.heatFluxWidth),ft=Pf(Ri),ht=Pf.getState().hourlyHeatExchangeArrayMap,pt=Object(r.useRef)(null),yt=Object(r.useRef)(0),gt=Object(r.useRef)(),mt=Object(r.useRef)(),wt=Wp(),xt=wt.transparent,At=wt.opacity;Object(r.useEffect)((function(){if(Je)if(Te){var e=Xe(a);if(e){var t=Tw.fetchHeatmapTexture(e,null!==Ge&&void 0!==Ge?Ge:5);if(t){var o=Ue();if(o&&o.length>0&&l){var i,r=new Me.Euler(0,0,l.rotation[2],"ZYX"),n=Number.MAX_VALUE,c=Number.MAX_VALUE,s=-Number.MAX_VALUE,d=-Number.MAX_VALUE,u=Object(f.a)(o);try{for(u.s();!(i=u.n()).done;){var h,p=i.value,y=Object(f.a)(p);try{for(y.s();!(h=y.n()).done;){var g=h.value.clone().applyEuler(r);g.x>s&&(s=g.x),g.xd&&(d=g.y),g.yy?y=w.x:w.xg?g=w.y:w.y0&&Object(gf.jsx)(Oh,{roofSegments:Ye,thickness:v,lineColor:T,lineWidth:S})]})}),I&&M>0&&Object(gf.jsx)(Qf,{points:Ee,cz:He[0].lz}),k&&!b&&Object(gf.jsxs)("group",{position:[Ie.x,Ie.y,Ie.z+v],children:[Object(gf.jsx)(jp,{position:[0,0,.3],onPointerDown:function(e){if(Ve(t.id,e,X.Select),xe.current=!0,me.current=M,ie(!0),Wh.set(Ie.x,Ie.y,We),l){var a=-Math.atan2(Ae.position.x-c,Ae.position.y-s)-l.rotation[2];Ih.set(-vt,0,a,"ZXY")}se(ge.Top),Et.getState().setEnableOrbitController(!1),E((function(e){e.resizeHandleType=K.Top,e.selectedElementHeight=We+t.thickness}))},onPointerOver:function(){E((function(e){e.hoveredHandle=ge.Top,e.selectedElementHeight=We+t.thickness,e.selectedElementX=Ie.x,e.selectedElementY=Ie.y}))}}),Fe.map((function(e,t){var l=e.leftPoint.clone().sub(Ie);return Object(gf.jsx)(jp,{position:[l.x,l.y,0],onPointerDown:function(){xe.current=!0,ie(!0),Wh.set(l.x,l.y,We+.15),Ih.set(0,0,0),se(ge.Ridge),pe(t),te(He.reduce((function(e,t){return Math.min(e,new Me.Vector3(t.leftPoint[0],t.leftPoint[1],We).distanceTo(Ie)-1)}),1/0)),Et.getState().setEnableOrbitController(!1),ye.current=Q}},t)}))]}),oe&&Object(gf.jsx)(Lt.f,{name:"Roof Intersection Plane",ref:we,args:[1e3,100],visible:!1,position:Wh,rotation:Ih,onPointerMove:function(e){if(we.current&&xe.current){!function(e){G.x=e.offsetX/be.domElement.clientWidth*2-1,G.y=-e.offsetY/be.domElement.clientHeight*2+1,J.setFromCamera(G,Ae)}(e);var o=J.intersectObjects([we.current]);if(o[0]&&l){var i=o[0].point;if(i.z<.001)return;switch(ce){case ge.Top:var r=Math.max(0,i.z-l.lz-.6-De);Ew.getState().updateRoofRiseById(a,r,We+t.thickness);break;case ge.Ridge:if(l&&null!==fe){var n=i.clone().applyEuler(new Me.Euler(0,0,l.rotation[2])).sub(new Me.Vector3(l.cx,l.cy)).setZ(0),c=function(e){if(e0&&l.getRangeAt(0);t.select(),document.execCommand("copy"),document.body.removeChild(t),a&&(l.removeAllRanges(),l.addRange(a))}},_h=function(){var e=Object(Eh.a)(Lh.a.mark((function e(t,l,a){var o,i,r;return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(o=window.document.getElementById(t))){e.next=11;break}return e.next=4,Vh()(o,Object(d.a)(Object(d.a)({},a),{},{removeContainer:!0}));case 4:i=e.sent,(r=document.createElement("a")).href=i.toDataURL("image/png",1),r.download="".concat(l,".png"),r.click(),e.next=12;break;case 11:throw new Error("Cannot find element with ID ".concat(t));case 12:case"end":return e.stop()}}),e)})));return function(t,l,a){return e.apply(this,arguments)}}(),$h=function(e,t){for(var l="",a=0,o=Object.keys(e[0]);a0&&void 0!==arguments[0]?arguments[0]:.3,l=Ew((function(e){return e.viewState.orthographic})),a=Ew((function(e){return e.viewState.cameraPosition})),o=Ew((function(e){return e.viewState.cameraZoom}));if(l)e=Math.max(t,15/o);else{var i=Ew.getState().viewState.panCenter,r=Object(ep.a)(Me.Vector3,Object(h.a)(i)),n=Object(ep.a)(Me.Vector3,Object(h.a)(a)),c=n.distanceTo(r);e=Math.max(t,c/100)}return e},fp=function(e,t){var l=Object(r.useMemo)((function(){return new Me.TextureLoader}),[]);return Object(r.useMemo)((function(){var a;switch(e){case ue.Default:a=tp;break;case ue.NoTexture:a=Sf;break;case ue.Texture01:a=lp;break;case ue.Texture02:a="data:image/png;base64,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";break;case ue.Texture03:a=ap;break;case ue.Texture04:a=op;break;case ue.Texture05:a=ip;break;case ue.Texture06:a=rp;break;case ue.Texture07:a=np;break;case ue.Texture08:a=cp;break;case ue.Texture09:a=sp;break;case ue.Texture10:a=dp;break;default:a=Sf}return t===Ne.Stud&&(a=Sf),l.load(a,(function(t){t.wrapS=t.wrapT=Me.RepeatWrapping,t.offset.set(0,0);var l=.6,a=.6;switch(e){case ue.Default:l=2,a=2;break;case ue.Texture03:l=2,a=1;break;case ue.Texture06:l=1,a=1}t.repeat.set(l,a),Object(Se.c)()}))}),[e])},hp=function(e){var t=Object(r.useRef)(!0);Tf((function(e){return e.foundationMovedFlag}));var l=e;if(!t.current){var a=Ew.getState().elements.find((function(t){return t.id===e.id&&t.type===V.Foundation}));a&&(l=a)}return t.current=!1,l},pp=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"addUndoableMove",value:function(){var e=Ew.getState().selectedElement;if(e){var t=Ew.getState().getElementById(e.id),l=Tf.getState().oldParentId,a=Tf.getState().oldFoundationId;if(t&&l&&a){var o=e.type===V.SolarPanel,i=e.type===V.Polygon,r={name:"Move",timestamp:Date.now(),movedElementId:t.id,movedElementType:t.type,oldCx:e.cx,oldCy:e.cy,oldCz:e.cz,newCx:t.cx,newCy:t.cy,newCz:t.cz,oldParentType:o?e.parentType:void 0,newParentType:o?t.parentType:void 0,oldParentId:l,newParentId:t.parentId,oldFoundationId:a,newFoundationId:t.foundationId,oldNormal:(new Me.Vector3).fromArray(e.normal),newNormal:(new Me.Vector3).fromArray(t.normal),oldRotation:Object(h.a)(e.rotation),newRotation:Object(h.a)(t.rotation),undo:function(){n(this.movedElementId,[this.oldCx,this.oldCy,this.oldCz],this.oldParentId,this.newParentId,this.oldFoundationId,this.oldParentType,this.oldRotation,this.oldNormal,i?e.vertices:void 0)},redo:function(){n(this.movedElementId,[this.newCx,this.newCy,this.newCz],this.newParentId,this.oldParentId,this.newFoundationId,this.newParentType,this.newRotation,this.newNormal,i?t.vertices:void 0)}};Ew.getState().addUndoable(r);var n=function(e,t,l,a,o,i,r,n,c){Ew.getState().set((function(s){var d=s.elements.find((function(t){return t.id===e}));if(d){if(d.type===V.Polygon){if(c)d.vertices=Object(h.a)(c)}else{var u=Object(h.a)(t);d.cx=u[0],d.cy=u[1],d.cz=u[2]}if(l&&a&&o&&(d.parentId=l,d.foundationId=o,i&&d.type===V.SolarPanel&&(d.parentType=i),r&&(d.rotation=Object(h.a)(r)),n&&(d.normal=[n.x,n.y,n.z]),d.type===V.Window)){var f=s.elements.find((function(e){return e.id===l})),p=s.elements.find((function(e){return e.id===a}));if(!f||!p)return;var y=d.lx*p.lx,g=d.lz*p.lz;d.lx=y/f.lx,d.lz=g/f.lz}}}))}}}}},{key:"undoInvalidOperation",value:function(){Ew.getState().set((function(e){if(e.selectedElement)for(var t=0;t0&&e.intersections[0].eventObject.name===e.eventObject.name&&(e.stopPropagation(),Ew.getState().set((function(e){if(e.groupActionMode)e.multiSelectionsMode||e.selectedElementIdSet.clear(),e.selectedElementIdSet.has(l)?e.selectedElementIdSet.delete(l):e.selectedElementIdSet.add(l);else{var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.id===t?(i.selected=!0,e.selectedElement=i,e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t))):i.selected=!1}}catch(r){o.e(r)}finally{o.f()}}})))},wp=function(e,t,l){var a={name:"Resize Roof Rise",timestamp:Date.now(),resizedElementId:e,resizedElementType:V.Roof,oldRise:t,newRise:l,undo:function(){Ew.getState().updateRoofRiseById(a.resizedElementId,a.oldRise,0)},redo:function(){Ew.getState().updateRoofRiseById(a.resizedElementId,a.newRise,0)}};Ew.getState().addUndoable(a)},xp=function(e,t){var l={lng:Ew.getState().language};return!!Vm.rooftopElementBoundaryCheck(e,t)||(Ew.getState().moveHandleType||Ew.getState().viewState.orthographic?Qh(me.t("message.MoveOutsideBoundaryCancelled",l)):Ew.getState().resizeHandleType?Qh(me.t("message.ResizingOutsideBoundaryCancelled",l)):Ew.getState().rotateHandleType&&Qh(me.t("message.RotationOutsideBoundaryCancelled",l)),!1)},vp=function(e,t,l){var a={lng:Ew.getState().language};return!!Vm.rooftopSPCollisionCheck(e,t,l)||(Ew.getState().moveHandleType||Ew.getState().viewState.orthographic?Qh(me.t("message.MoveCancelledBecauseOfOverlap",a)):Ew.getState().resizeHandleType?Qh(me.t("message.ResizingCancelledBecauseOfOverlap",a)):Ew.getState().rotateHandleType&&Qh(me.t("message.RotationCancelledBecauseOfOverlap",a)),!1)},bp=function(e,t,l,a,o,i,r){null!==e&&Ew.getState().set((function(n){if(null!==e){var c,s=Object(f.a)(n.elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.parentId===t&&d.foundationId)if(d.type===V.SolarPanel){var u=new Me.Vector3(d.cx*e.lx,d.cy*e.ly,d.cz+e.lz).clone().sub(a),p=Vm.computeState(l,u,r),y=p.segmentVertices,g=p.normal,m=p.rotation,w=void 0;w=y?Vm.getRooftopElementZ(y,u,o+i):o+i,g&&m&&void 0!==w&&(d.normal=g.toArray(),d.rotation=Object(h.a)(m),d.cz=w)}else if(d.type===V.Window){var x=new Me.Vector3(d.cx,d.cy,d.cz+e.lz).clone().sub(a),v=Vm.computeState(l,x,r),b=v.segmentVertices,A=v.normal,T=v.rotation,P=void 0;P=b?Vm.getRooftopElementZ(b,x,o+i):o+i,A&&T&&void 0!==P&&(d.rotation=Object(h.a)(T),d.cz=P)}else if(d.type===V.Sensor||d.type===V.Light){var S=new Me.Vector3(d.cx*e.lx,d.cy*e.ly,d.cz+e.lz).clone().sub(a),j=Vm.computeState(l,S,r),H=j.segmentVertices,z=j.normal,R=j.rotation,D=void 0;D=H?Vm.getRooftopElementZ(H,S,o+i):o+i,z&&R&&void 0!==D&&(d.normal=z.toArray(),d.rotation=Object(h.a)(R),d.cz=D)}}}catch(M){s.e(M)}finally{s.f()}}}))},Ap=function(e,t,l,a,o){2!==e.button&&(e.intersections[0].eventObject.name!==e.eventObject.name||(mp(e,l,t),gp(e,t,l,a,o)))},Tp=function(e,t){var l=Ew.getState().selectedElement;if(l&&Vm.isValidOnRoof(l)){var a=Ew.getState().getElementById(l.id);if(a&&Ew.getState().moveHandleType)if(e.intersections.filter((function(e){return e.eventObject.name.includes("Roof")}))[0].eventObject.userData.roofId===t.id&&a.foundationId){var o=Ew.getState().getElementById(a.foundationId);if(o)switch(a.type){case V.SolarPanel:var i=a,r=Vm.getRoofBoundaryVertices(t),n=Vm.getSolarPanelVerticesOnRoof(i,o);xp(n,r)&&vp(i,o,n)?pp.addUndoableMove():pp.undoInvalidOperation();break;case V.Sensor:case V.Light:pp.addUndoableMove()}}Ew.getState().set((function(e){e.moveHandleType=null}))}},Pp=function(e,t){var l=Ew.getState().getSelectedElement();if(l&&Vm.isValidOnRoof(l))switch(l.type){case V.Sensor:case V.Light:case V.SolarPanel:if(l.type===V.SolarPanel&&void 0===l.parentType)return;if(Ew.getState().moveHandleType){var a=e.intersections.filter((function(e){return e.eventObject.name.includes("Roof")||e.eventObject.name.includes(pp.WALL_OUTSIDE_SURFACE_MESH_NAME)}));a[0].eventObject.userData.roofId===t&&Ew.getState().set((function(e){var t,o=Object(f.a)(e.elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;if(i.id===l.id){var r=a[0].eventObject.userData,n=r.roofId,c=r.foundation,s=r.centroid,d=r.roofSegments;if(c&&s&&d&&n){var u=a[0].point,p=(new Me.Vector3).subVectors(u,new Me.Vector3(c.cx,c.cy)).applyEuler(new Me.Euler(0,0,-c.rotation[2])),y=p.clone().sub(s),g=Vm.computeState(d,y),m=g.normal,w=g.rotation;i.cx=p.x/c.lx,i.cy=p.y/c.ly,i.cz=p.z-c.lz,i.rotation=Object(h.a)(w),i.normal=m.toArray(),i.parentId=n,i.foundationId=c.id,i.type===V.SolarPanel&&(i.parentType=V.Roof,i.color="#fff"),e.selectedElement&&(e.selectedElement.parentId=n,e.selectedElement.foundationId=c.id),Tf.getState().setPrimitiveStore("showWallIntersectionPlaneId",null)}break}}}catch(x){o.e(x)}finally{o.f()}}))}}},Sp=function(e,t){e.intersections.length>0&&e.intersections[0].eventObject.name===e.eventObject.name&&(e.stopPropagation(),Ew.getState().set((function(l){l.contextMenuObjectType=V.Roof,l.pastePoint.copy(e.intersections[0].point);var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t)if(i.selected=!0,l.selectedElement=i,l.selectedElementIdSet.has(t)){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;l.selectedElementIdSet.has(c.id)&&c.type!==l.selectedElement.type&&l.selectedElementIdSet.delete(c.id)}}catch(h){n.e(h)}finally{n.f()}}else if(l.multiSelectionsMode){l.selectedElementIdSet.add(t);var s,d=Object(f.a)(l.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;l.selectedElementIdSet.has(u.id)&&u.type!==l.selectedElement.type&&l.selectedElementIdSet.delete(u.id)}}catch(h){d.e(h)}finally{d.f()}}else l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t);else i.selected=!1}}catch(h){o.e(h)}finally{o.f()}})))},jp=function(e){var t=e.position,l=e.onPointerDown,a=e.onPointerUp,o=e.onPointerOver,i=Ew(si),n=up(),c=Object(Se.f)().gl,s=Object(r.useRef)(!1),d=Object(r.useRef)(!1),h=Object(r.useRef)(!1),p=Object(r.useRef)(),y=Object(r.useState)("white"),g=Object(u.a)(y,2),m=g[0],w=g[1],x=function(e){e?(w(pt),c.domElement.style.cursor="pointer"):(w("white"),c.domElement.style.cursor="default")};Object(r.useEffect)((function(){var e=function(){d.current&&(h.current=!0),!d.current&&s.current&&x(!1),s.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var v=function(e){if(e.intersections.length>0){var t,l=Object(f.a)(e.intersections);try{for(l.s();!(t=l.n()).done;){var a=t.value.eventObject;if("Roof Handle"===a.name)return a===p.current}}catch(o){l.e(o)}finally{l.f()}}return!1};return Object(gf.jsx)(Lt.h,{name:"Roof Handle",ref:p,args:[n],position:t,onPointerMove:function(e){v(e)?(h.current=!1,d.current||(d.current=!0,x(!0))):w("white")},onPointerOut:function(e){h.current||(s.current||(e.intersections.length>0&&"Roof Handle"===e.intersections[0].eventObject.name?w("white"):x(!1)),d.current=!1,i((function(e){e.hoveredHandle=null})))},onPointerDown:function(e){v(e)&&(l&&l(e),s.current=!0)},onPointerUp:function(e){v(e)&&a&&a(e)},onPointerOver:function(e){v(e)&&o&&o(e)},onPointerLeave:function(e){v(e)&&i((function(e){e.hoveredHandle=null}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:m})})},Hp=function(e){var t=e.roofModel,l=e.foundationModel,a=Ew(qc),o=t.id,i=t.wallsId,n=t.roofType;Object(r.useEffect)((function(){0===i.length&&a(o,!1)}),[i]);return function(){switch(n){case It.Pyramid:return Object(gf.jsx)(rh,{roofModel:t,foundationModel:l});case It.Gable:return Object(gf.jsx)(Sh,{roofModel:t,foundationModel:l});case It.Hip:return Object(gf.jsx)(Mh,{roofModel:t,foundationModel:l});case It.Gambrel:return Object(gf.jsx)(yh,{roofModel:t,foundationModel:l});case It.Mansard:return Object(gf.jsx)(kh,{roofModel:t,foundationModel:l});default:return null}}()};function zp(e,t){return e.roofModel===t.roofModel&&e.foundationModel.lx===t.foundationModel.lx&&e.foundationModel.ly===t.foundationModel.ly&&e.foundationModel.lz===t.foundationModel.lz}var Rp,Dp=n.a.memo(Hp,zp),Mp=function(e){var t=Object(r.useMemo)((function(){var t;switch(e){case he.NoTexture:t=Sf;break;case he.Texture01:t=jf;break;case he.Texture02:t=Hf;break;case he.Texture03:t=zf;break;case he.Texture04:t=Rf;break;case he.Texture05:t=Df;break;case he.Texture06:t=Mf;break;case he.Texture07:t=Wf;break;default:t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC"}return(new Me.TextureLoader).load(t,(function(t){switch(t.wrapS=t.wrapT=Me.RepeatWrapping,e){case he.NoTexture:case he.Default:t.repeat.set(5,3);break;case he.Texture01:t.repeat.set(.5,.25);break;case he.Texture03:t.repeat.set(.9,.9);break;case he.Texture04:case he.Texture05:case he.Texture06:t.repeat.set(.75,.75);break;default:t.repeat.set(.5,.5)}i(t),n()}))}),[e]),l=Object(r.useState)(t),a=Object(u.a)(l,2),o=a[0],i=a[1],n=Object(Se.f)().invalidate;return o},Wp=function(e,t){var l=Ew(o.groundImage),a=Ew(o.orthographic),i=l&&a,r=i?.25:1;return{transparent:e||i,opacity:Math.min(void 0!==t?t:1,r)}},Ip=function(e,t,l){var a=Ew((function(t){return t.elements.filter((function(t){return t.foundationId===e&&t.type===V.Wall}))}),Zf.a),o=function(e){return a.find((function(t){return t.id===e}))},i=Object(r.useRef)(!1);return{currentWallArray:Object(r.useMemo)((function(){var e,a=Object(f.a)(l);try{for(a.s();!(e=a.n()).done;){var r=e.value,n=o(r);if(!n)return[];for(var c=[],s=n,d=0;n&&(!n.roofId||n.roofId===t)&&d++<100&&(c.push(n),n.leftJoints[0]);){if(n.leftJoints[0]===s.id)return c.reverse(),i.current=!0,c;n=o(n.leftJoints[0])}for(c.reverse(),n=o(s.rightJoints[0]),d=0;n&&(!n.roofId||n.roofId===t)&&d++<100&&(c.push(n),n.rightJoints[0]&&n.rightJoints[0]!==s.id);)n=o(n.rightJoints[0]);if(i.current=!1,c.length>1)return c}}catch(u){a.e(u)}finally{a.f()}return[]}),[l,a]),isLoopRef:i}},Cp=function(e,t){var l=Ew((function(e){return e.elements.filter((function(e){return e.foundationId===t&&e.type===V.Wall}))}),Zf.a);return Object(r.useMemo)((function(){for(var t=function(e){return l.find((function(t){return t.id===e}))},a=new Map,o=new Map,i=t(e),r=i,n=0,c=!1;r&&r.type===V.Wall&&n<100;){a.set(r.id,r);var s,d=r.relativeAngle.toFixed(1);if(o.has(d))null===(s=o.get(d))||void 0===s||s.push(r);else o.set(d,[r]);if(0!==r.rightJoints.length){if((r=t(r.rightJoints[0]))&&r.id===i.id){c=!0;break}n++}else r=null}if(!c||4!==o.size)return null;var h,p=[],y=Object(f.a)(o);try{for(y.s();!(h=y.n()).done;){var g,m=Object(u.a)(h.value,2),w=m[0],x=m[1],v=0,b=Object(f.a)(x);try{for(b.s();!(g=b.n()).done;){var A=g.value,T=a.get(A.leftJoints[0]),P=a.get(A.rightJoints[0]);if(T&&T.relativeAngle.toFixed(1)!==w&&v++,P&&P.relativeAngle.toFixed(1)!==w&&v++,v>2)break}}catch(C){b.e(C)}finally{b.f()}if(2!==v)return null;var S,j=null,H=null,z=0,R=-1,D=Object(f.a)(x);try{for(D.s();!(S=D.n()).done;){var M=S.value,W=a.get(M.leftJoints[0]),I=a.get(M.rightJoints[0]);z=Math.max(z,M.lz),R=Math.max(R,M.eavesLength),W&&W.relativeAngle.toFixed(1)!==w&&(j=M),I&&I.relativeAngle.toFixed(1)!==w&&(H=M)}}catch(C){D.e(C)}finally{D.f()}j&&H&&z>0&&-1!==R&&p.push({leftPoint:(new Me.Vector3).fromArray(j.leftPoint),rightPoint:(new Me.Vector3).fromArray(H.rightPoint),relativeAngle:j.relativeAngle,lz:z,eavesLength:R,wallsId:x.map((function(e){return e.id}))})}}catch(C){y.e(C)}finally{y.f()}return 4!==p.length?null:p}),[l])},Op=function(e,t,l){var a=Object(r.useMemo)((function(){return Vm.getHighestComposedWallHeight(e,l)}),[e]),o=Object(r.useMemo)((function(){return a+t}),[a,t]);return{highestWallHeight:a,topZ:o}},Fp=function(e,t,l){var a=Object(r.useMemo)((function(){return Vm.getHighestWallHeight(e,l)}),[e]),o=Object(r.useState)(t),i=Object(u.a)(o,2),n=i[0],c=i[1],s=a+n;return Object(r.useEffect)((function(){t!==n&&c(t)}),[t]),{highestWallHeight:a,topZ:s,riseInnerState:n,setRiseInnerState:c}},kp=function(e,t,l,a,o,i){var n=Tf(Lr),c=Tf(Er),s=Tf(Ir),d=function(){var r=function(e){return e.clone().add(t)},n=[];if(a)if(o===It.Gambrel)n.push(Gp(l).map(r));else{var c,s=[],d=Object(f.a)(l);try{for(d.s();!(c=d.n()).done;){var u=c.value;s.push(u.points[1].clone().add(t))}}catch(g){d.e(g)}finally{d.f()}n.push(s)}else{var h,p=Object(f.a)(l);try{for(p.s();!(h=p.n()).done;){var y=h.value.points;if(6===y.length)n.push(y.slice(3).map(r));else{if(8!==y.length)throw new Error("Invalid Roof segment data");n.push(y.slice(4).map(r))}}}catch(g){p.e(g)}finally{p.f()}i&&n.push(i)}return Pf.getState().setRoofSegmentVertices(e,n),n};return(n||c||s)&&d(),Object(r.useEffect)((function(){d()}),[l]),d},Yp=function(e){var t=Tf(Ir),l=Tf(Or);(t||l)&&e()},Lp=function(e,t){var l=Ew(Tr);Object(r.useEffect)((function(){void 0===e.rise&&Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e.id&&i.type===V.Roof){var r=i;void 0===r.rise&&(r.rise=r.lz-t,r.lz=0);break}}}catch(n){o.e(n)}finally{o.f()}}))}),[l])},Ep=function(){var e=Object(r.useRef)(!0);return!!e.current&&(e.current=!1,!0)},Up=function(e,t,l,a,o,i,n){var c=Ew((function(e){return e.updateElementOnRoofFlag}));Object(r.useEffect)((function(){c&&(bp(e,t,l,a,o,i,n),Ew.getState().setUpdateElementOnRoofFlag(!1))}),[o,i,c])},Np=function(e,t,l,a,o,i,n){!function(e,t,l,a,o,i,n){var c=Ep();Object(r.useEffect)((function(){c||bp(e,t,l,a,o,i,n)}),[l])}(e,t,l,a,o,i,n),Up(e,t,l,a,o,i,n)},Vp=function(e,t,l,a){var o=hp(t);return Object(r.useMemo)((function(){return{roofId:e,foundation:o,centroid:l,roofSegments:a}}),[e,l,a,o])},Jp=function(e,t){var l=Object(u.a)(t,4),a=l[0],o=(l[1],l[2],l[3]);e.moveTo(a.points[0].x,a.points[0].y),e.lineTo(a.points[1].x,a.points[1].y),e.lineTo(o.points[0].x,o.points[0].y),e.lineTo(o.points[1].x,o.points[1].y),e.closePath()},Gp=function(e,t){var l=[],a=Object(u.a)(e,4),o=a[0],i=(a[1],a[2],a[3]);return l.push(o.points[0].clone()),l.push(o.points[1].clone()),l.push(i.points[0].clone()),l.push(i.points[1].clone()),t?(t.push.apply(t,l),t):l},Xp=function(e){var t=e.uuid,l=e.shape,a=e.thickness,o=e.holeMeshes,i=e.simulation,n=e.castShadow,c=e.receiveShadow,s=e.children,d=Object(r.useRef)(null);if(d.current&&(d.current.geometry=new Me.ExtrudeBufferGeometry(l,{steps:1,depth:a,bevelEnabled:!1}),d.current.updateMatrix(),o.length>0)){for(var f=[],h=0;h0){var n,s=Object(f.a)(C);try{for(s.s();!(n=s.n()).done;){var d=n.value,h=new Me.Vector3(d.cx,d.cy,d.cz).sub(c);switch(d.windowType){case Yt.Polygonal:var p,y=null!==(p=d.polygonTop)&&void 0!==p?p:Fg,g=Object(u.a)(y,2),m=g[0],w=g[1],x=d.lx/2,v=d.lz/2,b=m*d.lx,A=Jf(x,v,b,w,h.x,h.y);e.holes.push(A);break;case Yt.Arched:var T=Yf(d.lx,d.lz,d.archHeight,h.x,h.y);e.holes.push(T);break;default:var P=new Me.Shape,S=d.lx/2,j=d.lz/2;P.moveTo(h.x-S,h.y-j),P.lineTo(h.x+S,h.y-j),P.lineTo(h.x+S,h.y+j),P.lineTo(h.x-S,h.y+j),P.closePath(),e.holes.push(P)}}}catch(H){s.e(H)}finally{s.f()}}return e}),[i,c,C,a]),N=Object(r.useMemo)((function(){return C.map((function(e){var t=Object(u.a)(e.rotation,3),l=t[0],a=t[1],o=t[2],i=new Me.Vector3(e.cx,e.cy,e.cz).sub(c),r=(new Me.Euler).fromArray([].concat(Object(h.a)(e.rotation),["ZXY"]));switch(e.windowType){case Yt.Polygonal:var n,s=null!==(n=e.polygonTop)&&void 0!==n?n:Fg,d=Object(u.a)(s,2),f=d[0],p=d[1],y=e.lx/2,g=e.lz/2,m=f*e.lx,w=Jf(y,g,m,p),x=new Me.Mesh(new Me.ExtrudeBufferGeometry([w],{steps:1,depth:e.ly,bevelEnabled:!1})),v=new Me.Vector3(0,0,-e.ly).applyEuler(r);return x.position.copy(i.clone().add(v)),x.rotation.copy(r),x.updateMatrix(),x;case Yt.Arched:var b=Yf(e.lx,e.lz,e.archHeight),A=new Me.Mesh(new Me.ExtrudeBufferGeometry([b],{steps:1,depth:e.ly,bevelEnabled:!1})),T=new Me.Vector3(0,0,-e.ly).applyEuler(r);return A.position.copy(i.clone().add(T)),A.rotation.copy(r),A.updateMatrix(),A;default:var P=new Me.Mesh(new Me.BoxBufferGeometry(e.lx,e.lz,2*e.ly));return P.position.copy(i),P.rotation.set(l,a,o),P.updateMatrix(),P}}))}),[C,s]),J=m===he.NoTexture&&g&&g===y,G=v&&!W,X=b&&w;return Object(gf.jsxs)(gf.Fragment,{children:[J&&!X?Object(gf.jsx)(Xp,{uuid:t,simulation:!0,shape:E,holeMeshes:N,thickness:s,castShadow:G,receiveShadow:v,children:Object(gf.jsx)("meshStandardMaterial",{color:g,transparent:W,opacity:I})}):Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("mesh",{uuid:t,userData:{simulation:!0},name:"Flat roof top shape",position:[0,0,s+.001],receiveShadow:v,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[U]}),X?Object(gf.jsx)("meshBasicMaterial",{map:w,side:Me.FrontSide}):Object(gf.jsx)("meshStandardMaterial",{map:L,color:g,transparent:W,opacity:I,side:Me.FrontSide})]}),Object(gf.jsx)(Xp,{shape:E,holeMeshes:N,thickness:s,castShadow:G,receiveShadow:v,children:Object(gf.jsx)("meshStandardMaterial",{color:null!==y&&void 0!==y?y:"white",transparent:W,opacity:I})})]}),Y,Object(gf.jsxs)("group",{position:[0,0,s],children:[Y,F.map((function(e,t){var l=[e.clone().sub(k),e];return Object(gf.jsx)(Jl.a,{points:l,lineWidth:p,color:d},t)}))]}),O&&O.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==S&&void 0!==S?S:et,color:null!==P&&void 0!==P?P:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:R.current?e[z.current].clone().add(R.current):e[0],args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=D.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==P&&void 0!==P?P:$e})})]},t)}))]})},Kp=l.p+"static/media/foundation_01.bda6fc00.png",qp=l.p+"static/media/foundation_02.a1240091.png",Qp=l.p+"static/media/foundation_03.6be5f733.png",Zp=l.p+"static/media/foundation_04.8100e8d2.png",_p=l.p+"static/media/foundation_05.8164fdc8.png",$p=l.p+"static/media/foundation_06.fc1babc0.png",ey=l.p+"static/media/foundation_07.e759a1c6.png",ty=l.p+"static/media/helvetiker_regular.typeface.9a3651b4.fnt",ly=function(e){var t=e.element,l=e.height,a=Ew(Mu),i=Ew(Hu),n=Ew(ys),c=Ew($r),s=Ew(o.groundImage),d=Object(r.useState)(),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)(10),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(0),v=Object(u.a)(x,2),b=v[0],A=v[1];Object(r.useEffect)((function(){if(a||i){var e=t.cx,o=t.cy,r=t.lx,n=t.ly;switch(t.type){case V.SolarPanel:var d=c(t);if(d){var u=e*d.lx,f=o*d.ly;p(new Me.Vector3(u,f,null!==l&&void 0!==l?l:d.lz))}break;case V.Foundation:p(new Me.Vector3(e,o,s?.1:0));break;case V.Cuboid:var h=Tw.getWorldDataById(t.id).pos,y=Tw.getWorldDataById(t.parentId).rot;p(new Me.Vector3(h.x,h.y,h.z-t.lz/2+.2)),A(y);break;default:p(new Me.Vector3(e,o,s?.2:0))}w(Math.max(5,.75*Math.hypot(r,n)))}}),[a,i]);var T=Object(Se.e)(Me.FontLoader,ty),P=.05*m,S={font:T,height:0,size:P},j=new Array(25).fill(0),H=s?"#222":"#ccc";return Object(gf.jsx)(gf.Fragment,{children:h&&Object(gf.jsxs)("group",{position:h,rotation:[vt,b,0],name:"Polar Auxiliary",children:[Object(gf.jsx)("polarGridHelper",{args:[m,24,6,120,H,H],userData:{unintersectable:!0}}),Object(gf.jsx)(Lt.g,{args:[.98*m,m,24,1,vt,n],userData:{unintersectable:!0},rotation:[-vt,0,0],children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,color:"yellow"})}),Object(gf.jsx)("group",{rotation:[0,n,0],children:Object(gf.jsx)("mesh",{position:[-.5,0,.9*-m],rotation:[-vt,0,0],userData:{unintersectable:!0},children:Object(gf.jsx)("textGeometry",{args:["".concat(-Tw.toDegrees(n).toFixed(1),"\xb0"),S]})})}),j.map((function(e,t){var l=Math.ceil(t/2)*(t%2===0?1:-1);-12===l&&(l=12);var a=function(e){return 0===e?.3*-P:e>0&&e<7?.8*-P:1.2*-P}(Math.abs(l));return Object(gf.jsx)("group",{rotation:[0,l*Math.PI/12,0],children:Object(gf.jsxs)("mesh",{position:[a,0,1.05*-m],rotation:[-vt,0,0],userData:{unintersectable:!0},children:[Object(gf.jsx)("textGeometry",{args:["".concat(-15*l,"\xb0"),S]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]})},t)}))]})})},ay=function(e){var t=e.id,l=e.position,a=e.ratio,o=e.handleType,i=e.hoverHandle,r=e.noHoverHandle,n=Ew(is),c=Ew(Mu),s=Ew(Hu)===o||c===o?pt:ht,d=Object(gf.jsx)("meshBasicMaterial",{color:s});return Object(gf.jsxs)("group",{position:l,rotation:[vt,0,0],scale:a,name:o,children:[Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.i,{args:[.15,.05,6,8,1.5*Math.PI],rotation:[vt,0,vt],children:d}),Object(gf.jsx)(Lt.c,{args:[.1,.1,6],rotation:[vt,0,0],position:[.15,0,.05],children:d}),Object(gf.jsx)(Lt.b,{args:[.05,6],rotation:[0,vt,0],position:[0,0,.15],children:d})]}),Object(gf.jsx)(Lt.f,{name:o,args:[.35,.35],position:[0,.05,0],rotation:[-vt,0,0],visible:!1,onPointerDown:function(e){n(t,e,X.Rotate)},onPointerOver:function(e){i(e,o)},onPointerOut:r})]})},oy=n.a.memo(ay),iy=function(e){var t=e.hx,l=e.hy,a=e.hz,o=e.lineColor,i=void 0===o?"black":o,r=e.lineWidth,n=void 0===r?.2:r;return Object(gf.jsx)(Jl.a,{points:[[-t,-l,-a],[t,-l,-a],[t,-l,a],[t,-l,-a],[t,l,-a],[t,l,a],[t,l,-a],[-t,l,-a],[-t,l,a],[-t,l,-a],[-t,-l,-a],[-t,-l,a],[t,-l,a],[t,l,a],[-t,l,a],[-t,-l,a]],name:"Wireframe",userData:{unintersectable:!0},lineWidth:n,color:i})},ry=n.a.memo(iy);!function(e){e.left="Left",e.right="Right",e.loop="Loop",e.null="Null"}(Rp||(Rp={}));var ny,cy=function(e){var t,l=e.element,a=e.verticalLift,i=Ew(Vi),n=Ew(o.orthographic),c=Ew(Ru),s=Ew(Hu),d=l.lx/2,u=l.ly/2,f=.2,h=.5,p=null!==(t=l.lineColor)&&void 0!==t?t:"white",y="darkorchid",g=Math.max(1,(d+u)/32),m=Object(r.useMemo)((function(){return{lng:i}}),[i]),w=Object(r.useMemo)((function(){switch(l.type){case V.Cuboid:return Math.max(.5,.1*Math.max(d,u))}return.5}),[l.type,d,u]),x=Object(r.useMemo)((function(){switch(l.type){case V.Cuboid:return n?l.lz/2+.1:-l.lz/2+.1;case V.Foundation:return l.lz+.1}return.1}),[l.type,l.lz]),v=Object(r.useMemo)((function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},backgroundColor:y,text:l.ly.toFixed(1)+me.t("word.MeterAbbreviation",m),fontSize:80,fontFace:"Times Roman",textHeight:g,position:[-d-w,0,x+a]}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d-w,-u,x],[-d-w,u,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d-w+f,.6000000000000001-u,x],[-d-w,-u,x],[-d-w-f,.6000000000000001-u,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d-w+f,u-.6000000000000001,x],[-d-w,u,x],[-d-w-f,u-.6000000000000001,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u,x],[-d-2*w,-u,x]],color:p,linewidth:h}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u,x],[-d-2*w,u,x]],color:p,linewidth:h})]})}),[d,u,x]),b=Object(r.useMemo)((function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},backgroundColor:y,text:l.ly.toFixed(1)+me.t("word.MeterAbbreviation",m),fontSize:80,fontFace:"Times Roman",textHeight:g,position:[d+w,0,x+a]}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d+w,-u,x],[d+w,u,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d+w+f,.6000000000000001-u,x],[d+w,-u,x],[d+w-f,.6000000000000001-u,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d+w+f,u-.6000000000000001,x],[d+w,u,x],[d+w-f,u-.6000000000000001,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,-u,x],[d+2*w,-u,x]],color:p,linewidth:h}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,u,x],[d+2*w,u,x]],color:p,linewidth:h})]})}),[d,u,x]),A=Object(r.useMemo)((function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},backgroundColor:y,text:l.lx.toFixed(1)+me.t("word.MeterAbbreviation",m),fontSize:80,fontFace:"Times Roman",textHeight:g,position:[0,-u-w,x+a]}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u-w,x],[d,-u-w,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[.6000000000000001-d,-u-w-f,x],[-d,-u-w,x],[.6000000000000001-d,-u-w+f,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d-.6000000000000001,-u-w-f,x],[d,-u-w,x],[d-.6000000000000001,-u-w+f,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,-u,x],[-d,-u-2*w,x]],color:p,linewidth:h}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,-u,x],[d,-u-2*w,x]],color:p,linewidth:h})]})}),[d,u,x]),T=Object(r.useMemo)((function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},backgroundColor:y,text:l.lx.toFixed(1)+me.t("word.MeterAbbreviation",m),fontSize:80,fontFace:"Times Roman",textHeight:g,position:[0,u+w,x+a]}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u+w,x],[d,u+w,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[.6000000000000001-d,u+w-f,x],[-d,u+w,x],[.6000000000000001-d,u+w+f,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d-.6000000000000001,u+w-f,x],[d,u+w,x],[d-.6000000000000001,u+w+f,x]],color:p,linewidth:1}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-d,u,x],[-d,u+2*w,x]],color:p,linewidth:h}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[d,u,x],[d,u+2*w,x]],color:p,linewidth:h})]})}),[d,u,x]);if(c)if(l.type===V.Wall)switch(c){case K.LowerLeft:case K.LowerRight:return A}else switch(c){case K.LowerLeft:return Object(gf.jsxs)(gf.Fragment,{children:[v,A]});case K.LowerRight:return Object(gf.jsxs)(gf.Fragment,{children:[b,A]});case K.UpperLeft:return Object(gf.jsxs)(gf.Fragment,{children:[v,T]});case K.UpperRight:return Object(gf.jsxs)(gf.Fragment,{children:[b,T]})}if(s)if(l.type===V.Wall)switch(s){case K.LowerLeft:case K.LowerRight:return A}else switch(s){case K.LowerLeft:return Object(gf.jsxs)(gf.Fragment,{children:[v,A]});case K.LowerRight:return Object(gf.jsxs)(gf.Fragment,{children:[b,A]});case K.UpperLeft:return Object(gf.jsxs)(gf.Fragment,{children:[v,T]});case K.UpperRight:return Object(gf.jsxs)(gf.Fragment,{children:[b,T]})}return Object(gf.jsx)(gf.Fragment,{})},sy=1.225,dy=273.15,uy=5.67e-8,fy=[.103,.104,.109,.12,.13,.137,.138,.134,.121,.111,.106,.103];!function(e){e[e.NONE=0]="NONE",e[e.KASTEN_YOUNG=1]="KASTEN_YOUNG",e[e.SPHERE_MODEL=2]="SPHERE_MODEL"}(ny||(ny={}));var hy,py=1440,yy=Math.PI/720,gy=Math.PI/182.5,my=function(){function e(t,l){Object(He.a)(this,e),this.sunrise=void 0,this.sunset=void 0,this.sunrise=t,this.sunset=l}return Object(Fe.a)(e,[{key:"daylight",value:function(){return this.sunset-this.sunrise}}]),e}(),wy=.5,xy=.1,vy=23.45/180*Math.PI,by=720,Ay=function(e){var t=Math.floor((e.getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5);return vy*Math.sin(bt*(284+t)/365.25)},Ty=function(e,t){var l=Math.tan(Tw.toRadians(t))*Math.tan(Ay(e));if(Math.abs(l)>1)return new my(0,l>0?1440:0);var a=60*Math.acos(-l)/Tw.toRadians(15);return new my(by-a,by+a)},Py=function(e){return(60*e.getHours()+e.getMinutes()-by)/by*Math.PI},Sy=function(e){return(e/by-1)*Math.PI},jy=function(e,t){return Hy(1,Py(e),Ay(e),Tw.toRadians(t)).normalize()},Hy=function(e,t,l,a){var o=Math.cos(l),i=Math.sin(l),r=Math.cos(a),n=Math.sin(a),c=Math.cos(t),s=Math.sin(t),d=Math.asin(i*n+o*c*r),u=s*o,f=r*i-c*o*n,h=Math.atan2(f,u),p=new Me.Vector3(e,h,d);return Tw.sphericalToCartesianZ(p),p.x=-p.x,p},zy=function(e,t,l,a){return function(e){var t=bt*e/365;return 1.361*(1.00011+.034221*Math.cos(t)+.00128*Math.sin(t)+719e-6*Math.cos(2*t)+77e-6*Math.sin(2*t))}(t)*Math.pow(.7,Math.pow(function(e,t,l){var a;switch(e){case ny.NONE:return 1;case ny.KASTEN_YOUNG:return a=t.angleTo(Rt),1/(Math.cos(a)+.50572*Math.pow(96.07995-a/Math.PI*180,-1.6364));default:a=t.angleTo(Rt);var o=Math.cos(a),i=708,r=l/9e3;return Math.sqrt((i+r)*(i+r)*o*o+(1417+r)*(1-r))-(i+r)*o}}(a,e,l),.678))},Ry=function(e,t,l,a){var o=0,i=l.dot(Rt),r=.5*(1+i);r>0&&(o+=fy[t]*r*a);var n=.5*Math.abs(1-i);return Tw.isZero(n)||(o+=e.albedo*n*a),o},Dy=function(e){var t,l,a,c,s,d,f,h,p,y,g,m,w,x,v,b,A=e.foundation,T=Ew(i.date),P=Ew(i.latitude),S=Tf(Mr),j=Tf(ms),H=Tf(ws),z=Tf(Ns),R=Ew(o.solarRadiationHeatmapMaxValue),D=Pf(wi),M=Object(r.useState)(null),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(),F=A.lx,k=A.ly,Y=A.lz,L=A.solarUpdraftTower,E=.016*(null!==(t=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==t?t:100),U=Object(r.useMemo)((function(){return jy(new Date(T),P)}),[T,P]),N=Object(r.useMemo)((function(){for(var e,t,l,a,o=[],i=((null!==(e=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==e?e:Math.max(3,10*Y))+Y)/2,r=null!==(t=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==t?t:Math.max(F,k),n=null!==(l=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==l?l:Math.min(F,k)/2,c=null!==(a=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==a?a:Math.max(1,.025*Math.min(F,k)),s=1.15*n,d=.5*c,u=c,f=2*c,h=4*c,p=0;p<6;p++){var y=bt/6*p,g=Math.cos(y),m=Math.sin(y),w=[];w.push(new Me.Vector3(s*g,s*m,i)),w.push(new Me.Vector3(d*g,d*m,i)),w.push(new Me.Vector3(d*g,d*m,r)),w.push(new Me.Vector3(u*g,u*m,1.02*r)),w.push(new Me.Vector3(f*g,f*m,1.04*r)),w.push(new Me.Vector3(h*g,h*m,1.06*r)),o.push({points:w})}return o}),[F,k,Y,null===L||void 0===L?void 0:L.collectorRadius,null===L||void 0===L?void 0:L.collectorHeight,null===L||void 0===L?void 0:L.chimneyRadius,null===L||void 0===L?void 0:L.chimneyHeight]),V=Object(r.useMemo)((function(){for(var e,t,l=[],a=(null!==(e=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==e?e:Math.max(3,10*Y))+Y,o=null!==(t=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==t?t:Math.min(F,k)/2,i=2*o/25,r=0;r<=25;r++){var n=[],c=r*i-o,s=Math.sqrt(o*o-c*c);n.push(new Me.Vector3(-s,c,a)),n.push(new Me.Vector3(s,c,a)),l.push({points:n})}for(var d=0;d<=25;d++){var u=[],f=d*i-o,h=Math.sqrt(o*o-f*f);u.push(new Me.Vector3(f,-h,a)),u.push(new Me.Vector3(f,h,a)),l.push({points:u})}return l}),[F,k,Y,null===L||void 0===L?void 0:L.collectorRadius,null===L||void 0===L?void 0:L.collectorHeight]);return Object(r.useEffect)((function(){if(A&&z){var e=D(A.id+"-sut");e&&C(Tw.fetchHeatmapTexture(e,null!==R&&void 0!==R?R:5))}}),[z,R]),Object(Se.d)((function(e,t){(S||j&&!H)&&U.z>0&&O.current&&O.current.children.forEach((function(e){"Streamlines"===e.name&&(e.material.uniforms.dashOffset.value-=t*E*10)}))})),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0,simulation:!0},name:"Chimney",castShadow:!0,receiveShadow:!1,args:[null!==(l=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==l?l:Math.max(1,.025*Math.min(F,k)),null!==(a=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==a?a:Math.max(1,.025*Math.min(F,k)),null!==(c=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==c?c:Math.max(F,k),16,2,!0],position:[0,0,(null!==(s=null===L||void 0===L?void 0:L.chimneyHeight)&&void 0!==s?s:Math.max(F,k))/2+Y],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Chimney Base",castShadow:!0,receiveShadow:!1,args:[null!==(d=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==d?d:Math.max(1,.025*Math.min(F,k)),1.6*(null!==(f=null===L||void 0===L?void 0:L.chimneyRadius)&&void 0!==f?f:Math.max(1,.025*Math.min(F,k))),4*(null!==(h=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==h?h:Math.max(3,10*Y)),16,2,!0],position:[0,0,2*(null!==(p=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==p?p:Math.max(3,10*Y))+Y],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Greenhouse Wall",castShadow:!0,receiveShadow:!0,args:[null!==(y=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==y?y:Math.min(F,k)/2,null!==(g=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==g?g:Math.min(F,k)/2,null!==(m=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==m?m:Math.max(3,10*Y),50,2,!0],position:[0,0,(null!==(w=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==w?w:Math.max(3,10*Y))/2+Y],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.b,{uuid:A.id+"-sut",userData:{unintersectable:!0,simulation:!0},name:"Greenhouse Ceiling",castShadow:!1,receiveShadow:!1,args:[null!==(x=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==x?x:Math.min(F,k)/2,50,0,bt],position:[0,0,Y+(null!==(v=null===L||void 0===L?void 0:L.collectorHeight)&&void 0!==v?v:Math.max(3,10*Y))],children:z&&I?Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.FrontSide,map:I}):Object(gf.jsx)("meshPhongMaterial",{attach:"material",specular:new Me.Color("white"),shininess:50,side:Me.FrontSide,color:"lightskyblue",transparent:!0,opacity:.75})}),Object(gf.jsx)(Lt.b,{userData:{unintersectable:!0},name:"Greenhouse Ground",castShadow:!1,receiveShadow:!0,args:[null!==(b=null===L||void 0===L?void 0:L.collectorRadius)&&void 0!==b?b:Math.min(F,k)/2,50,0,bt],position:[0,0,.1],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"dimgray"})}),V&&V.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Greenhouse Roof Grid Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"gray"},t)})),U.z>0&&N&&Object(gf.jsx)("group",{ref:O,children:N.map((function(e,t){var l=e.points[0].x+e.points[1].x,a=e.points[0].y+e.points[1].y,o=new Me.Euler(0,0,bt*t/N.length+vt),i=E,r=E;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{name:"Streamlines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.5,dashed:!0,dashSize:i,gapSize:r,color:"white"}),Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[E,4*E,4,2],name:"Streamline Inlet Arrow Head",position:[.1*l,.1*a,e.points[0].z],rotation:o,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[E,4*E,4,2],name:"Streamline Inlet Arrow Head",position:[.9*l,.9*a,e.points[0].z],rotation:o,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})})]},t)}))})]})},My=n.a.memo(Dy),Wy=l(802),Iy=l.p+"static/media/glow.def60647.png",Cy=function(e){var t,l,a=e.foundation,o=Ew(i.date),n=Ew(i.latitude),c=Object(Wy.a)(Iy),s=Object(r.useMemo)((function(){return jy(new Date(o),n)}),[o,n]),d=a.lz,u=a.solarPowerTower,f=null!==(t=null===u||void 0===u?void 0:u.towerRadius)&&void 0!==t?t:1,h=null!==(l=null===u||void 0===u?void 0:u.towerHeight)&&void 0!==l?l:20,p=h/10,y=1.5*f,g=2.4*Math.max(p,y);return Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Focus Tower",castShadow:!0,receiveShadow:!1,args:[f,f,h,6,2],position:[0,0,h/2+d/2],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Center Receiver",castShadow:!0,receiveShadow:!1,args:[y,y,p,10,2],position:[0,0,h+d/2],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),s.z>0&&Object(gf.jsx)("mesh",{position:[0,0,h+d/2],children:Object(gf.jsx)("sprite",{scale:[g,g,g],children:Object(gf.jsx)("spriteMaterial",{map:c,transparent:!1,color:16777215,blending:Me.AdditiveBlending,depthWrite:!1})})})]})},Oy=n.a.memo(Cy),Fy=function(e){var t,l,a,o,i=e.foundation,n=i.ly,c=i.lz,s=i.solarAbsorberPipe,d=null!==(t=null===s||void 0===s?void 0:s.absorberHeight)&&void 0!==t?t:10,u=null!==(l=null===s||void 0===s?void 0:s.apertureWidth)&&void 0!==l?l:.6,f=null!==(a=null===s||void 0===s?void 0:s.relativeLength)&&void 0!==a?a:.9,h=null!==(o=null===s||void 0===s?void 0:s.poleNumber)&&void 0!==o?o:5,p=Object(r.useMemo)((function(){for(var e=[],t=f*n/(h+1),l=1;l<=h;l++)e.push(new Me.Vector3(0,l*t-f*n/2,d/2+c/2));return e}),[n,c,h,d,f]);return Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Receiver Vertical Pipe 1",castShadow:!1,receiveShadow:!1,args:[u/4,u/4,d,6,2],position:[0,-f*n/2,d/2+c/2],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Receiver Vertical Pipe 2",castShadow:!1,receiveShadow:!1,args:[u/4,u/4,d,6,2],position:[0,f*n/2,d/2+c/2],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Receiver Horizontal Pipe",castShadow:!1,receiveShadow:!1,args:[u/2,u/2,f*n+u/2,6,2,!1,3*vt,Math.PI],position:[0,0,d+c/2-u/4],rotation:[0,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white",side:Me.DoubleSide})}),p&&p.map((function(e,t){return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Solar Receiver Pole "+t,castShadow:!1,receiveShadow:!1,args:[u/8,u/8,d,4,2],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})},t)}))]})},ky=n.a.memo(Fy),Yy=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"selectMe",value:function(e,t,l,a){var o,i,r,n;if(l.intersections.length>0&&l.intersections.filter((function(e){return!e.eventObject.name.startsWith("Wall Intersection Plane")}))[0].object===l.eventObject){var c,s=Object(f.a)(e.elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;d.id===t?(d.selected=!0,e.selectedElement=d,e.selectedElementHeight=d.lz):d.selected=!1}}catch(w){s.e(w)}finally{s.f()}if(!e.selectedElement)return;if(a===X.ContextMenu)if(e.selectedElementIdSet.has(t)){var u,h=Object(f.a)(e.elements);try{for(h.s();!(u=h.n()).done;){var p=u.value;e.selectedElementIdSet.has(p.id)&&p.type!==e.selectedElement.type&&e.selectedElementIdSet.delete(p.id)}}catch(w){h.e(w)}finally{h.f()}}else if(e.multiSelectionsMode){e.selectedElementIdSet.add(t);var y,g=Object(f.a)(e.elements);try{for(g.s();!(y=g.n()).done;){var m=y.value;e.selectedElementIdSet.has(m.id)&&m.type!==e.selectedElement.type&&e.selectedElementIdSet.delete(m.id)}}catch(w){g.e(w)}finally{g.f()}}else e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t);else e.multiSelectionsMode?e.selectedElementIdSet.has(t)?e.selectedElementIdSet.delete(t):e.selectedElementIdSet.add(t):(e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t));if(e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null,a)switch(a){case X.Move:(null===(o=e.selectedElement)||void 0===o?void 0:o.type)===V.Tree||(null===(i=e.selectedElement)||void 0===i?void 0:i.type)===V.Human?e.moveHandleType=B.Default:e.moveHandleType=l.eventObject.name;break;case X.Resize:e.resizeHandleType=l.eventObject.name;break;case X.Rotate:e.rotateHandleType=l.eventObject.name;break;case X.Select:e.selectedElementAngle=null!==(r=null===(n=l.object.parent)||void 0===n?void 0:n.rotation.z)&&void 0!==r?r:0}}}},{key:"selectNone",value:function(e){e.selectedElementIdSet.clear();var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){t.value.selected=!1}}catch(a){l.e(a)}finally{l.f()}e.selectedElement=null,e.selectedElementIdSet.clear()}},{key:"clearThenAddSelectedElementIdSet",value:function(e,t){e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t)}}]),e}(),Ly=l(124),Ey=function(e){var t=Tf(Ns),l=Ew(o.solarRadiationHeatmapMaxValue),a=Object(r.useState)(null),i=Object(u.a)(a,2),n=i[0],c=i[1];return Object(r.useEffect)((function(){if(t){var a=Pf.getState().getHeatmap(e);a&&c(Tw.fetchHeatmapTexture(a,null!==l&&void 0!==l?l:5))}}),[t,l]),n},Uy=function(e,t,l,a,o,i){var n=null!==o&&void 0!==o?o:"Black"===(null===l||void 0===l?void 0:l.color)&&"Monocrystalline"===(null===l||void 0===l?void 0:l.cellType)?"silver":"white",c=null!==i&&void 0!==i?i:"gray",s=Object(r.useMemo)((function(){if(!l)return null;var e=l.cellType,t=l.length,o=l.width,i=l.m,r=l.n,s=l.color;return a===$.portrait?Ny(e,o,t,r,i,s,n,c):Ny(e,t,o,i,r,s,n,c)}),[l,a,n,c]),d=Object(r.useState)(s),f=Object(u.a)(d,2),h=f[0],p=f[1];return Object(r.useEffect)((function(){if(s&&l){var o=l.length,i=l.width,r=Math.max(1,Math.round(e/(a===$.landscape?o:i))),n=Math.max(1,Math.round(t/(a===$.landscape?i:o)));s.repeat.set(r,n),s.wrapS=s.wrapT=Me.RepeatWrapping,p(s.clone())}}),[s,e,t]),h},Ny=function(e,t,l,a,o,i,r,n){t*=250,l*=250;var c=document.createElement("canvas"),s=[t,l];c.width=s[0],c.height=s[1];var d=c.getContext("2d");if(d){d.fillStyle=r,d.fillRect(0,0,t,l);var u=.01*Math.max(t,l);if(d.fillStyle=n,d.fillRect(u,u,t-2*u,l-2*u),d.fillStyle="Black"===i?"#000":"#01345B","Thin Film"===e){var f=.6*u;d.fillRect(f,f,t-2*f,l-2*f)}else{var h=.005*Math.max(t,l),p=u+h,y=(t-2*p-h*(a-1))/a,g=(l-2*p-h*(o-1))/o,m=.1*y,w=.1*g;if("Monocrystalline"===e)for(var x=0;x0&&Object(gf.jsxs)("group",{rotation:[-c.x,0,-c.z-n],children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[s.clone().multiplyScalar(.75),[0,0,0],y.clone().multiplyScalar(p)],name:"Sun Beam",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[y.clone().multiplyScalar(.5),s.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Tw.toDegrees(y.angleTo(s)).toFixed(1)+"\xb0",fontSize:20,fontFace:"Times Roman",textHeight:.1,position:y.clone().multiplyScalar(.75).add(s.clone().multiplyScalar(.75)).multiplyScalar(.5)}),Object(gf.jsx)("group",{position:s.clone().multiplyScalar(.75),rotation:[vt+c.x+o.x,0,c.z+o.z+n,"ZXY"],children:Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",rotation:[0,0,-o.y],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})})})),Ky=function(e){var t,l,a,o,i,n=e.id;Ew(Fi);var c=Ew(Zr),s=Ew(Vi),d=Object(r.useMemo)((function(){return{lng:s}}),[s]),u=Object(r.useMemo)((function(){return c(n)}),[n]);if(!u||!u.foundationId)return null;var f=c(u.foundationId);if(!f)return null;var h=new Me.Vector3(f.cx,f.cy,f.cz),p=new Me.Vector3(u.cx*f.lx,u.cy*f.ly,f.lz/2+u.cz+u.lz/2+u.poleHeight).applyEuler(new Me.Euler(0,0,f.rotation[2])).add(h),y=(null!==(t=null===u||void 0===u?void 0:u.label)&&void 0!==t?t:me.t("shared.SolarPanelElement",d))+((null===u||void 0===u?void 0:u.locked)?" ( + ".concat(me.t("shared.ElementLocked",d)," + )"):"")+((null===u||void 0===u?void 0:u.label)?"":"\n"+me.t("word.Coordinates",d)+": ("+p.x.toFixed(1)+", "+p.y.toFixed(1)+", "+p.z.toFixed(1)+") "+me.t("word.MeterAbbreviation",d));return Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:y,color:null!==(l=u.labelColor)&&void 0!==l?l:"white",fontSize:null!==(a=u.labelFontSize)&&void 0!==a?a:20,textHeight:null!==(o=u.labelSize)&&void 0!==o?o:.2,position:[0,0,null!==(i=u.labelHeight)&&void 0!==i?i:Math.max(u.ly/2*Math.abs(Math.sin(u.tiltAngle))+.1,.2)]})},qy=function(e){var t,l,a=e.id,i=e.pvModelName,n=void 0===i?"SPR-X21-335-BLK":i,c=e.cx,s=e.cy,d=e.cz,p=e.lx,y=e.ly,g=e.lz,m=e.tiltAngle,w=e.relativeAzimuth,x=e.poleHeight,v=e.poleRadius,b=e.poleSpacing,A=e.drawSunBeam,T=e.rotation,P=void 0===T?[0,0,0]:T,S=e.normal,j=void 0===S?[0,0,1]:S,H=e.color,z=void 0===H?"white":H,R=e.frameColor,D=e.backsheetColor,M=e.showLabel,W=void 0!==M&&M,I=e.locked,C=void 0!==I&&I,O=e.parentId,F=e.foundationId,k=e.foundationModel,Y=e.orientation,L=void 0===Y?$.portrait:Y,E=Ew(si),U=Ew(is),N=Ew(Zr),J=Tf(Ns),G=Ew(o.shadowEnabled),B=Ew(o.solarPanelShininess),Q=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,Z=Ew(Yi),_=Ew(Kr),ee=_f(a),te=Object(r.useRef)(null),le=Z[n];le&&(g=Math.max(le.thickness,.02));var ae=p/2,oe=y/2,ie=g/2,re=Ew.getState().elements.length<100?4:2,ne=-x/2-g/2,ce=Object(r.useState)(0===P[0]),se=Object(u.a)(ce,2),de=se[0],ue=se[1],fe=Object(r.useState)(!1),he=Object(u.a)(fe,2),pe=he[0],ye=he[1],ge=Object(r.useState)(!1),me=Object(u.a)(ge,2),we=me[0],xe=me[1],ve=Object(Se.f)(),be=ve.gl,Ae=ve.camera,Te=Object(r.useRef)(),Pe=Object(r.useRef)(),je=Object(r.useRef)(null),He=Object(r.useRef)(!1),ze=Object(r.useRef)(null),Re=Object(r.useRef)(null),De=Object(r.useRef)(null),We=Object(r.useRef)(null),Ie=Object(r.useRef)(null),Ce=Object(r.useRef)(null),Oe=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Fe=Object(r.useMemo)((function(){return new Me.Vector2}),[]),ke=Object(r.useMemo)((function(){return de?new Me.Vector3(c,s,d+ie+x):new Me.Vector3(c,s,d+g/2+.02)}),[c,s,d,ie,de,x,_]),Ye=Object(r.useMemo)((function(){return(new Me.Euler).fromArray([].concat(Object(h.a)(P),["ZXY"]))}),[P]),Le=Object(r.useMemo)((function(){return de?new Me.Euler(m,0,w,"ZXY"):new Me.Euler}),[m,w,de]),Ee=Object(r.useMemo)((function(){for(var e=[],t=Math.floor(.5*p/b),l=Math.floor(.5*y*Math.abs(Math.cos(m))/b),a=.5*Math.sin(m),o=Math.cos(w)*b,i=Math.sin(w)*b,r=-t;r<=t;r++)for(var n=-l;n<=l;n++){var c=r*o-n*i,s=r*i+n*o;e.push(new Me.Vector3(c,s,ne+a*b*n))}return e}),[w,m,b,p,y,x,g]);Object(r.useEffect)((function(){ue(0===P[0])}),[P]),Object(r.useEffect)((function(){if(le){var e,t;L===$.portrait?(e=Math.max(1,Math.round(p/le.width)),t=Math.max(1,Math.round(y/le.length))):(e=Math.max(1,Math.round(p/le.length)),t=Math.max(1,Math.round(y/le.width))),Pe.current=[];for(var l=p/e,a=y/t,o=0;o<=e;o++)Pe.current.push({points:[new Me.Vector3(o*l-ae,-oe,g),new Me.Vector3(o*l-ae,oe,g)]});for(var i=0;i<=t;i++)Pe.current.push({points:[new Me.Vector3(-ae,i*a-oe,g),new Me.Vector3(ae,i*a-oe,g)]})}}),[L,n,p,y,g]);var Ue=Math.max(1,(p+y)/16),Ne=st*Ue*2,Ve=dt*Ue*1.5,Je=2*Ue/3,Ge=function(){var e=Ew.getState().elements.find((function(e){return e.id===F&&e.type===V.Foundation}));e&&(ze.current=[c/e.lx,s/e.ly,d-e.lz/2],Re.current=[p,y,g],De.current=w,We.current=m,Ce.current=Object(h.a)(j),Ie.current=Object(h.a)(P),te.current=e),ye(!0),He.current=!0,Et.getState().setEnableOrbitController(!1)},Xe=function(e){Fe.x=e.offsetX/be.domElement.clientWidth*2-1,Fe.y=-e.offsetY/be.domElement.clientHeight*2+1,Oe.setFromCamera(Fe,Ae)},Be=function(e){if(Ew.getState().resizeHandleType){if(Re.current&&ze.current&&Ce.current&&Ie.current){var t={name:"Resize Solar Panel On Roof",timestamp:Date.now(),id:e.id,oldDms:Object(h.a)(Re.current),oldNor:Object(h.a)(Ce.current),oldPos:Object(h.a)(ze.current),oldRot:Object(h.a)(Ie.current),newDms:[e.lx,e.ly,e.lz],newPos:[e.cx,e.cy,e.cz],newNor:Object(h.a)(e.normal),newRot:Object(h.a)(e.rotation),undo:function(){E((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=Object(h.a)(t.oldPos);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(h.a)(t.oldDms);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.normal=Object(h.a)(t.oldNor),o.rotation=Object(h.a)(t.oldRot);break}}}catch(n){a.e(n)}finally{a.f()}}))},redo:function(){E((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=Object(h.a)(t.newPos);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(h.a)(t.newDms);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.normal=Object(h.a)(t.newNor),o.rotation=Object(h.a)(t.newRot);break}}}catch(n){a.e(n)}finally{a.f()}}))}};Ew.getState().addUndoable(t)}}else if(Ew.getState().rotateHandleType&&void 0!==De.current){var l={name:"Rotate Solar Panel On Roof",timestamp:Date.now(),oldValue:De.current,newValue:e.relativeAzimuth,changedElementId:e.id,changedElementType:e.type,undo:function(){Ew.getState().updateSolarCollectorRelativeAzimuthById(l.changedElementId,l.oldValue)},redo:function(){Ew.getState().updateSolarCollectorRelativeAzimuthById(l.changedElementId,l.newValue)}};Ew.getState().addUndoable(l)}},Ke=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===O)return a}}catch(o){l.e(o)}finally{l.f()}})),qe=Uy(p,y,le,L,R,D),Qe=Ey(a);return Ke&&Ke.type===V.Roof&&0===Ke.opacity?null:Object(gf.jsxs)("group",{name:"Solar Panel Group Grandpa "+a,rotation:Ye,position:ke,children:[Object(gf.jsxs)("group",{name:"Solar Panel Group Dad "+a,rotation:Le,children:[Object(gf.jsxs)(Lt.a,{receiveShadow:G,castShadow:G,uuid:a,ref:Te,args:[p,y,g],name:"Solar Panel",onPointerDown:function(e){2!==e.button&&Ew.getState().objectTypeToAdd===V.None&&U(a,e,X.Select)},onContextMenu:function(e){U(a,e,X.ContextMenu),E((function(t){e.intersections.length>0&&(e.intersections[0].object===Te.current&&(t.contextMenuObjectType=V.SolarPanel))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===Te.current&&xe(!0))},onPointerOut:function(e){xe(!1)},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),J&&Qe?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:Qe}):qe?Q||0===B?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",map:qe,color:z}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===le||void 0===le?void 0:le.color)?at:ot),shininess:null!==B&&void 0!==B?B:tt,side:Me.FrontSide,map:qe,color:z}):Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}),0===(null===le||void 0===le?void 0:le.bifacialityFactor)||Q||0===x&&0===m?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:z}):qe?Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===le||void 0===le?void 0:le.color)?at:ot),shininess:null!==B&&void 0!==B?B:tt,side:Me.FrontSide,map:qe,color:z}):null]}),ee&&!C&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Vy,{id:a,handleSize:Ne,parentId:O,foundationId:F}),Object(gf.jsxs)("group",{name:"Resize Handle Group",children:[Object(gf.jsx)(Jy,{pos:[-ae,0,ie],dms:[g,Ve],handleType:K.Left,initPointerDown:Ge}),Object(gf.jsx)(Jy,{pos:[ae,0,ie],dms:[g,Ve],handleType:K.Right,initPointerDown:Ge}),Object(gf.jsx)(Jy,{pos:[0,-oe,ie],dms:[g,Ve],handleType:K.Lower,initPointerDown:Ge}),Object(gf.jsx)(Jy,{pos:[0,oe,ie],dms:[g,Ve],handleType:K.Upper,initPointerDown:Ge})]})]}),Object(gf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:a,position:[0,0,xy],args:[p,y],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),J&&Qe&&Pe.current&&Pe.current.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),ee&&C&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-ae,-oe,0],[-ae,oe,0],[ae,oe,0],[ae,-oe,0],[-ae,-oe,0]],castShadow:!1,receiveShadow:!1,lineWidth:2,color:yt})]}),de&&ee&&!C&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Rotate Handle Group",rotation:[0,0,Le.z],children:[Object(gf.jsx)(Gy,{position:[0,-oe-1,0],ratio:1,handleType:q.Lower,initPointerDown:Ge}),Object(gf.jsx)(Gy,{position:[0,oe+1,0],ratio:1,handleType:q.Upper,initPointerDown:Ge})]}),Object(gf.jsx)(Xy,{rotationZ:w,tiltAngle:m,handleSize:Je,initPointerDown:Ge,handlePointerMove:function(e,t){if(He.current&&(Xe(e),t.current&&Ew.getState().rotateHandleType===q.Tilt)){var l=Oe.intersectObjects([t.current]);if(l.length>0){var o,i=l[0].point,r=null===(o=t.current.parent)||void 0===o?void 0:o.localToWorld(new Me.Vector3);if(r){var n=(new Me.Vector3).subVectors(i,r),c=n.angleTo(Rt);if(!(.5*y*Math.abs(Math.sin(c))>x)){var s,d,u=w+P[2]+(null!==(s=null===(d=te.current)||void 0===d?void 0:d.rotation[2])&&void 0!==s?s:0);c*=u%Math.PI===0?Math.sign(-n.y)*Math.sign(Math.cos(u)):Math.sign(n.x)*Math.sign(Math.sin(u)),Ew.getState().updateSolarPanelTiltAngleById(a,c)}}}}},handlePointerUp:function(){var e=N(a);if(e&&We.current&&Math.abs(e.tiltAngle-We.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:We.current,newValue:e.tiltAngle,changedElementId:a,changedElementType:V.SolarPanel,undo:function(){Ew.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.oldValue)},redo:function(){Ew.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.newValue)}};Ew.getState().addUndoable(t)}}})]}),pe&&Object(gf.jsx)(Lt.f,{ref:je,args:[1e3,1e3],visible:!1,onPointerMove:function(e){if(je.current&&He.current&&te.current&&le){Xe(e);var t=Oe.intersectObjects([je.current]);if(t.length>0){var l=t[0].point;if(l.z<.001)return;var o=Ew.getState().rotateHandleType;if(Ew.getState().resizeHandleType){var i=de?w:0,r=Ew.getState().resizeAnchor,n=new Me.Vector3(te.current.cx,te.current.cy,te.current.lz),d=(new Me.Vector3).subVectors(l,r).applyEuler(new Me.Euler(0,0,-P[2]-te.current.rotation[2]-i));E((function(e){var t,l,o,c=Object(f.a)(e.elements);try{for(c.s();!(t=c.n()).done;){var s=t.value;if(s.id===a&&te.current){switch(e.resizeHandleType){case K.Left:case K.Right:var u=s.orientation===$.landscape?le.length:le.width,h=Math.abs(d.x),p=Math.max(1,Math.ceil((h-u/2)/u))*u,y=new Me.Vector3(Math.sign(d.x)*p/2,0,0).applyEuler(new Me.Euler(0,0,P[2]+te.current.rotation[2]+i)),g=(new Me.Vector3).addVectors(r,y).sub(n).applyEuler(new Me.Euler(0,0,-te.current.rotation[2]));s.lx=p,s.cx=g.x/te.current.lx,s.cy=g.y/te.current.ly;break;case K.Upper:case K.Lower:var w=Math.abs(d.y),v=Math.abs(d.z),b=Math.hypot(w,v),A=s.orientation===$.landscape?le.width:le.length,T=Math.max(1,Math.ceil((b-A/2)/A))*A,S=new Me.Vector3(0,T*Math.sign(d.y)/2,0).applyEuler(new Me.Euler(P[0],P[1],P[2]+te.current.rotation[2]+i,"ZXY")),j=(new Me.Vector3).addVectors(r,S).sub(n).applyEuler(new Me.Euler(0,0,-te.current.rotation[2]));l=T,o=m,de&&0!==o&&.5*l*Math.abs(Math.sin(o))>x||(s.ly=T,s.cx=j.x/te.current.lx,s.cy=j.y/te.current.ly,de||(s.cz=j.z-ie))}break}}}catch(H){c.e(H)}finally{c.f()}}))}else if(o===q.Lower||o===q.Upper){var u=te.current.rotation[2],h=new Me.Vector2(te.current.cx,te.current.cy),p=new Me.Vector2(c,s).rotateAround(Dt,u),y=(new Me.Vector2).addVectors(p,h),g=Math.atan2(-l.x+y.x,l.y-y.y)-u+(o===q.Lower?Math.PI:0),v=g+(Math.abs(g)>Math.PI?-Math.sign(g)*bt:0);Ew.getState().updateSolarCollectorRelativeAzimuthById(a,v)}}}},onPointerUp:function(){if(He.current){var e=N(O);if(e&&F){var t=N(a),l=te.current;if(t&&l){var o=Vm.getRoofBoundaryVertices(e),i=Vm.getSolarPanelVerticesOnRoof(t,l);xp(i,o)&&vp(t,l,i)?Be(t):E((function(e){if(ze.current&&null!==De.current&&Ce.current&&Re.current&&Ie.current){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.id===a){var i=Object(h.a)(ze.current);o.cx=i[0],o.cy=i[1],o.cz=i[2];var r=Object(h.a)(Re.current);o.lx=r[0],o.ly=r[1],o.lz=r[2],o.relativeAzimuth=De.current,o.normal=Object(h.a)(Ce.current),o.rotation=Object(h.a)(Ie.current);break}}}catch(n){l.e(n)}finally{l.f()}}}))}}Et.getState().setEnableOrbitController(!0),He.current=!1,ye(!1),E((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null,e.updateElementOnRoofFlag=!0})),te.current=null}}}),de&&x>0&&Ee.map((function(e,t){return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[v,v,x+2*(e.z-ne)+g,re,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:z})},t)})),Object(gf.jsx)(By,{drawSunbeam:A,rotation:P,normal:j,relativeEuler:Le,fRotation:null!==(l=null===k||void 0===k?void 0:k.rotation[2])&&void 0!==l?l:0}),(we||W)&&!ee&&Object(gf.jsx)(Ky,{id:a})]})},Qy=function(e){var t=e.lx,l=e.lz,a=(e.parentId,e.id),o=e.roofId,i=Ew(Eu),n=Ew(Uu);Object(r.useEffect)((function(){o&&(i===o||n.has(o))&&Ew.getState().set((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.id===a&&o.type===V.Wall){var i=o;i.roofId=null,i.leftRoofHeight=void 0,i.rightRoofHeight=void 0,i.centerRoofHeight=void 0,i.centerLeftRoofHeight=void 0,i.centerRightRoofHeight=void 0;break}}}catch(r){l.e(r)}finally{l.f()}}))}),[o,i,n]);return Object(gf.jsx)(Lt.f,{args:[t,l],rotation:[vt,0,0],visible:!1,onPointerDown:function(e){(function(e){return!(2===e.button||Ew.getState().moveHandleType||Ew.getState().resizeHandleType||Ew.getState().objectTypeToAdd!==V.None||Ew.getState().isAddingElement())})(e)&&(Ew.getState().set((function(e){e.contextMenuObjectType=null})),Ew.getState().selectMe(a,e,X.Select))},onContextMenu:function(e){Ew.getState().selectMe(a,e,X.ContextMenu),Ew.getState().set((function(t){e.intersections.length>0&&e.intersections[0].object===e.eventObject&&(t.contextMenuObjectType=V.Wall)}))},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})})},Zy=n.a.memo(Qy),_y=function(e){var t=e.cy,l=e.size,a=e.type,o=Object(r.useState)(ft),i=Object(u.a)(o,2),n=i[0],c=i[1];return Object(gf.jsx)(Lt.h,{name:a,args:[l],position:[0,t,0],onPointerEnter:function(){c(pt)},onPointerOut:function(){c(ft)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:n})})},$y=function(e){var t=e.ply,l=e.phz,a=up();return Object(gf.jsxs)("group",{name:"Move Handle Group",position:[0,0,-l],onPointerDown:function(e){e.intersections.length>0&&e.intersections[0].eventObject.parent===e.eventObject&&(Ew.getState().set((function(t){t.moveHandleType=e.object.name})),Et.getState().setEnableOrbitController(!1))},children:[Object(gf.jsx)(_y,{cy:-a,size:a,type:B.Lower}),Object(gf.jsx)(_y,{cy:t+a,size:a,type:B.Upper})]})},eg=n.a.memo($y),tg=n.a.memo((function(e){var t=e.x,l=e.z,a=e.handleType,o=e.highLight,i=e.handleSize,n=e.partial,c=Ew(si),s=Ew(Ru),d=Ew(Yu),f=Object(r.useState)(!1),h=Object(u.a)(f,2),p=h[0],y=h[1],g=o||p||a===s||d&&(a===K.LowerRight||a===K.UpperRight)?pt:n?"#ADD8E6":ht,m=i,w=i,x=i;if(a===K.LowerRight||a===K.LowerLeft)m=1.7*i;else if(n){m*=.75,w=i/2;var v=(x=2.5*i)/4;a===K.WallPartialResizeLeft||a===K.WallPartialResizeRight?l-=v:a!==K.WallPartialResizeLeftTop&&a!==K.WallPartialResizeRightTop||(l+=v)}else w=i/2,x=1.7*i;return Object(gf.jsx)(Lt.a,{name:a,args:[m,w,x],position:[t,0,l],onPointerOver:function(){y(!0),c((function(e){e.hoveredHandle=a}))},onPointerLeave:function(){y(!1),c((function(e){e.hoveredHandle=null}))},children:Object(gf.jsx)("meshBasicMaterial",{color:g})})})),lg=n.a.memo((function(e){var t=e.id,l=e.parentLz,a=e.roofId,i=e.x,n=e.z,c=e.absAngle,s=e.leftUnfilledHeight,d=e.rightUnfilledHeight,p=e.leftTopPartialResizeHandleHeight,y=e.rightTopPartialResizeHandleHeight,g=e.fill,m=e.wallLeftHeight,w=e.wallRightHeight,x=e.highLight,v=e.leftJoints,b=e.rightJoints,A=Ew(si),T=Ew(o.orthographic),P=up(),S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(new Me.Vector3),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(new Me.Euler),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(null),Y=Object(r.useRef)(!1),L=Object(r.useRef)([2*n,s,d]),E=Object(r.useRef)(new Map),U=Object(r.useRef)(null),N=Object(r.useRef)(null),J=Object(r.useRef)([]),G=Object(r.useMemo)((function(){if(!a)return null;var e=Ew.getState().elements.find((function(e){return e.id===a&&e.type===V.Roof}));return e?e.roofType:null}),[a]);T&&(n=-n);var X=function(e){var t=Ew.getState().cameraDirection,l=Math.atan2(t.x,t.y);W(new Me.Vector3(e,0,0)),F(new Me.Euler(vt,0,-l-c,"ZXY")),z(!0)},B=function(e,t,l){var a=Object(u.a)(t,5),o=a[0],i=a[1],r=a[2],n=a[3],c=a[4];A((function(t){var a,s=Object(f.a)(t.elements);try{for(s.s();!(a=s.n()).done;){var d=a.value;if(d.id===e&&d.type===V.Wall){var u=d;d.lz=o,u.leftUnfilledHeight=i,u.rightUnfilledHeight=r,u.leftTopPartialHeight=n,u.rightTopPartialHeight=c}else if(d.type===V.Wall&&l.has(d.id)){var h=l.get(d.id);void 0!==h&&(d.lz=h,d.cz=h/2)}}}catch(p){s.e(p)}finally{s.f()}}))},q=function(){a&&(v.length>0||b.length>0)&&(G===It.Gable||G===It.Gambrel?Ew.getState().elements.forEach((function(e){e.id===v[0]&&(U.current=e.lz),e.id===b[0]&&(N.current=e.lz)})):(E.current.clear(),Ew.getState().elements.forEach((function(e){e.type===V.Wall&&e.roofId===a&&E.current.set(e.id,e.lz)}))))},Q=function(){J.current=Ew.getState().elements.filter((function(e){return e.parentId===t}))},Z=function(e,t,l,a,o){var i=function(e,t,l,a,o){var i=e.lx,r=e.lz,n=e.roofId,c=e.leftRoofHeight,s=e.rightRoofHeight,d=e.centerLeftRoofHeight,u=e.centerRightRoofHeight,f=e.centerRoofHeight,h=g===Ue.Partial,p=h?Math.min(m,a):m,y=h?Math.min(w,o):w,x=h&&(!Tw.isZero(m-p)||!Tw.isZero(w-y)),v=i/2,b=r/2,A=[];return A.push({x:-v,y:-b+t},{x:v,y:-b+l}),x?A.push({x:v,y:-b+y},{x:-v,y:-b+p}):n?(s?A.push({x:v,y:-b+s}):A.push({x:v,y:b}),u&&A.push({x:u[0]*i,y:-b+u[1]}),f&&A.push({x:f[0]*i,y:-b+f[1]}),d&&A.push({x:d[0]*i,y:-b+d[1]}),c?A.push({x:-v,y:-b+c}):A.push({x:-v,y:b})):A.push({x:v,y:b},{x:-v,y:b}),A}(e,t,l,a,o);if(J.current.length>0){var r,n=Object(f.a)(J.current);try{for(n.s();!(r=n.n()).done;){var c=r.value,s=c.cx,d=c.cz,h=c.lx,p=c.ly,y=c.lz;if(s*=e.lx,d*=e.lz,c.type!==V.SolarPanel?(h*=e.lx,y*=e.lz):y=p,c.type===V.Window&&c.windowType===Yt.Polygonal){var x,v=null!==(x=c.polygonTop)&&void 0!==x?x:Fg,b=Object(u.a)(v,2),A=b[0],T=b[1],P=s+A*h,S=d+y/2+T;if(!Tw.isPointInside(P,S,i))return!1}if(!Tw.isElementInsideWall(new Me.Vector3(s,0,d),h,y,i,c.type===V.Door))return!1}}catch(j){n.e(j)}finally{n.f()}}return!0};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Wall Resize Handle Group",onPointerDown:function(e){var t;if(!Ew.getState().addedWallId&&e.object===(null===(t=e.intersections[0])||void 0===t?void 0:t.object)){var l=e.object;switch(l.name){case K.LowerLeft:A((function(e){e.resizeAnchor.copy(l.localToWorld(new Me.Vector3(2*i,0,0)))}));break;case K.LowerRight:A((function(e){e.resizeAnchor.copy(l.localToWorld(new Me.Vector3(2*-i,0,0)))}));break;case K.UpperLeft:case K.WallPartialResizeLeft:case K.WallPartialResizeLeftTop:X(-i),q(),Q();break;case K.UpperRight:case K.WallPartialResizeRight:case K.WallPartialResizeRightTop:X(i),q(),Q();break;default:return void console.error("Wall resize handle unknown")}A((function(e){e.resizeHandleType=l.name})),Et.getState().setEnableOrbitController(!1),Y.current=!0,L.current=[2*n,s,d,p,y]}},children:[Object(gf.jsx)(tg,{x:-i,z:-n,handleType:K.LowerLeft,highLight:x,handleSize:P}),Object(gf.jsx)(tg,{x:i,z:-n,handleType:K.LowerRight,highLight:x,handleSize:P}),!T&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(tg,{x:-i,z:n,handleType:K.UpperLeft,highLight:x,handleSize:P}),Object(gf.jsx)(tg,{x:i,z:n,handleType:K.UpperRight,highLight:x,handleSize:P}),g===Ue.Partial&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(tg,{x:-i,z:-n+s,handleType:K.WallPartialResizeLeft,highLight:x,handleSize:P,partial:!0}),Object(gf.jsx)(tg,{x:i,z:-n+d,handleType:K.WallPartialResizeRight,highLight:x,handleSize:P,partial:!0}),Object(gf.jsx)(tg,{x:-i,z:-n+p,handleType:K.WallPartialResizeLeftTop,highLight:x,handleSize:P,partial:!0}),Object(gf.jsx)(tg,{x:i,z:-n+y,handleType:K.WallPartialResizeRightTop,highLight:x,handleSize:P,partial:!0})]})]})]}),H&&Object(gf.jsx)(Lt.f,{ref:k,position:M,rotation:O,args:[1e4,1e4],visible:!1,onPointerMove:function(e){if(0!==e.intersections.length&&Y.current){var o=e.intersections[0].point;switch(Ew.getState().resizeHandleType){case K.UpperLeft:case K.UpperRight:A((function(e){var i=g===Ue.Partial?Math.max(s,d):0,r=Math.max(i+P,o.z-l);if(null===G||G===It.Gable||G===It.Gambrel){if(U.current||N.current){var n,c,u=Math.abs(r-(null!==(n=U.current)&&void 0!==n?n:1/0)),h=Math.abs(r-(null!==(c=N.current)&&void 0!==c?c:1/0));u0){var i=e.elements.find((function(e){return e.id===t.leftJoints[0]&&e.type===V.Wall}));if(i&&i.fill===Ue.Partial){var n=i.rightUnfilledHeight;Math.abs(a-n)<.5&&(a=n)}}return Z(t,a,e.enableFineGrid?a:t.rightUnfilledHeight,t.leftTopPartialHeight,t.rightTopPartialHeight)&&(t.leftUnfilledHeight=a,e.enableFineGrid&&(t.rightUnfilledHeight=a)),"break"}())break}}catch(n){i.e(n)}finally{i.f()}}));break;case K.WallPartialResizeRight:A((function(e){var a,i=Object(f.a)(e.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(r.id===t&&r.type===V.Wall)if("break"===function(){var t=r,a=Tw.clamp(o.z-l,0,t.rightTopPartialHeight);if(t.rightJoints.length>0){var i=e.elements.find((function(e){return e.id===t.rightJoints[0]&&e.type===V.Wall}));if(i&&i.fill===Ue.Partial){var n=i.leftUnfilledHeight;Math.abs(a-n)<.5&&(a=n)}}return Z(t,e.enableFineGrid?a:t.leftUnfilledHeight,a,t.leftTopPartialHeight,t.rightTopPartialHeight)&&(t.rightUnfilledHeight=a,e.enableFineGrid&&(t.leftUnfilledHeight=a)),"break"}())break}}catch(n){i.e(n)}finally{i.f()}}));break;case K.WallPartialResizeLeftTop:A((function(e){var a=e.elements.find((function(e){return e.id===t&&e.type===V.Wall}));if(a){var i=Tw.clamp(o.z-l,a.leftUnfilledHeight,a.lz);if(a.leftJoints.length>0){var r=e.elements.find((function(e){return e.id===a.leftJoints[0]&&e.type===V.Wall}));if(r&&r.fill===Ue.Partial){var n=r.rightTopPartialHeight;Math.abs(i-n)<.5&&(i=n)}}Z(a,a.leftUnfilledHeight,a.rightUnfilledHeight,i,e.enableFineGrid?i:a.rightTopPartialHeight)&&(a.leftTopPartialHeight=i,e.enableFineGrid&&(a.rightTopPartialHeight=i))}}));break;case K.WallPartialResizeRightTop:A((function(e){var a=e.elements.find((function(e){return e.id===t&&e.type===V.Wall}));if(a){var i=Tw.clamp(o.z-l,a.rightUnfilledHeight,a.lz);if(a.rightJoints.length>0){var r=e.elements.find((function(e){return e.id===a.rightJoints[0]&&e.type===V.Wall}));if(r&&r.fill===Ue.Partial){var n=r.leftTopPartialHeight;Math.abs(i-n)<.5&&(i=n)}}Z(a,a.leftUnfilledHeight,a.rightUnfilledHeight,e.enableFineGrid?i:a.leftTopPartialHeight,i)&&(a.rightTopPartialHeight=i,e.enableFineGrid&&(a.leftTopPartialHeight=i))}}))}}},onPointerUp:function(){Et.getState().setEnableOrbitController(!0),z(!1),U.current=null,N.current=null,Y.current=!1;var e=new Map;a&&G!==It.Gable&&G!==It.Gambrel&&Ew.getState().elements.forEach((function(t){t.type===V.Wall&&t.roofId===a&&e.set(t.id,t.lz)}));var l={name:"Change Wall Height",timestamp:Date.now(),resizedElementId:t,resizedElementType:V.Wall,oldHeights:Object(h.a)(L.current),newHeights:[2*n,s,d,p,y],oldSameBuildingWallsHeightMap:new Map(E.current),newSameBuildingWallsHeightMap:e,undo:function(){B(this.resizedElementId,this.oldHeights,this.oldSameBuildingWallsHeightMap)},redo:function(){B(this.resizedElementId,this.newHeights,this.newSameBuildingWallsHeightMap)}};Ew.getState().addUndoable(l),A((function(e){e.actionState.wallHeight=2*n,e.resizeHandleType=null}))},children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})})]})})),ag=function(e){var t=e.wallModel,l=e.foundationModel,a=t.id,o=t.roofId,i=t.cx,r=t.cy,n=t.lx,c=t.ly,s=t.lz,u=t.relativeAngle,f=t.fill,h=t.locked,p=t.leftUnfilledHeight,y=t.rightUnfilledHeight,g=t.leftTopPartialHeight,m=t.rightTopPartialHeight,w=t.leftJoints,x=t.rightJoints,v=_f(a),b=n/2,A=s/2,T=f===Ue.Partial,P=w.length>0?t.leftRoofHeight:s,S=x.length>0?t.rightRoofHeight:s,j=null!==P&&void 0!==P?P:s,H=null!==S&&void 0!==S?S:s,z=T?Math.min(j,g):j,R=T?Math.min(H,m):H,D=0===n;return Object(gf.jsxs)("group",{name:"Wall Group ".concat(a),position:[i,r,A],rotation:[0,0,u],userData:{aabb:!0},children:[f===Ue.Empty?Object(gf.jsx)(Zy,Object(d.a)({},t)):Object(gf.jsx)(Nm,{wallModel:t,foundationModel:l}),v&&!h&&Object(gf.jsxs)(gf.Fragment,{children:[n>.5&&Object(gf.jsx)(eg,{ply:c,phz:A}),Object(gf.jsx)(lg,{id:a,parentLz:l.lz,roofId:o,absAngle:u+l.rotation[2],x:b,z:A,leftUnfilledHeight:p,rightUnfilledHeight:y,leftTopPartialResizeHandleHeight:z,rightTopPartialResizeHandleHeight:R,fill:f,wallLeftHeight:j,wallRightHeight:H,highLight:D,leftJoints:w,rightJoints:x})]})]})},og=function(e,t){return e.wallModel===t.wallModel},ig=n.a.memo(ag,og),rg="Building Group",ng=function(e){var t=e.id,l=e.lx,a=e.ly,o=e.lz,i=function(e){return e.foundationId===t&&(e.type===V.Wall||e.type===V.Roof||e.type===V.SolarPanel&&e.parentType===V.Roof||e.type===V.Window&&e.parentType===V.Roof)},r=Ew((function(e){return e.elements.filter(i)}),Zf.a);return 0===r.length?null:Object(gf.jsx)("group",{name:rg,position:[0,0,o/2],children:r.map((function(t){switch(t.type){case V.Wall:return Object(gf.jsx)(ig,{wallModel:t,foundationModel:e},t.id);case V.Roof:return Object(gf.jsx)(Dp,{roofModel:t,foundationModel:e},t.id);case V.SolarPanel:return Object(gf.jsx)(qy,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*l,cy:t.cy*a,cz:t.cz,foundationModel:e}),t.id);case V.Window:return Object(gf.jsx)(Yg,Object(d.a)(Object(d.a)({},t),{},{cz:t.cz}),t.id);default:return null}}))})},cg=function(e,t){return e.lx===t.lx&&e.ly===t.ly&&e.lz===t.lz&&e.rotation===t.rotation},sg=n.a.memo(ng,cg),dg="Foundation Group",ug=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,p=e.lx,y=void 0===p?1:p,g=e.ly,m=void 0===g?1:g,w=e.lz,x=void 0===w?.1:w,v=e.rotation,b=void 0===v?[0,0,0]:v,A=e.color,T=void 0===A?"gray":A,P=e.lineColor,S=void 0===P?"black":P,j=e.lineWidth,H=void 0===j?.2:j,z=e.locked,R=void 0!==z&&z,D=e.showLabel,M=void 0!==D&&D,W=e.textureType,I=void 0===W?se.NoTexture:W,C=e.solarStructure,O=_f(n),F=Ew(Vi),k=Ew(o.orthographic),Y=Ew(Zr),L=Ew(on),E=Ew(si),U=Ew(cn),N=Ew(sn),J=Ew(An),Q=Ew(Sn),Z=Ew(tf),_=Ew(lf),ee=Ew(af),te=Ew(rc),le=Ew(Kn),ae=Ew(qn),oe=Ew(ls),ie=Ew(os),re=Ew(qc),ne=Ew(is),ce=Ew(ns),de=Ew(Ei),ue=Ew(Lu),fe=Ew(qu),he=Ew(o.shadowEnabled),ye=Ew(o.groundImage),ge=Ew(Cu),we=Ew(Sr),xe=Ew(Iu),ve=Ew(rn),be=Ew(Hu),Ae=Tf(Ns),Te=Ew(o.solarRadiationHeatmapMaxValue),je=Ew(o.solarRadiationHeatmapReflectionOnly),He=Pf(wi),ze=Object(Se.f)(),Re=ze.camera,De=ze.gl.domElement,We=Object(r.useState)(!1),Ie=Object(u.a)(We,2),Ce=Ie[0],Oe=Ie[1],Fe=Object(r.useState)(null),ke=Object(u.a)(Fe,2),Ye=ke[0],Le=ke[1],Ee=Object(r.useState)(!1),Ue=Object(u.a)(Ee,2),Ne=Ue[0],Ve=Ue[1],Je=Object(r.useState)({show:!1,direction:null,position:null}),Ge=Object(u.a)(Je,2),Xe=Ge[0],Be=Ge[1],Ke=Object(r.useState)([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]),qe=Object(u.a)(Ke,2),Qe=qe[0],Ze=qe[1],_e=Object(r.useRef)(null),$e=Object(r.useRef)(!1),et=Object(r.useRef)(!1),tt=Object(r.useRef)(null),lt=Object(r.useRef)(Rp.null),at=Object(r.useRef)(new Map),ot=Object(r.useRef)(null),it=Object(r.useRef)(),rt=Object(r.useRef)(null),nt=Object(r.useRef)(),ct=Object(r.useRef)(),st=Object(r.useRef)(),dt=Object(r.useRef)(),gt=Object(r.useRef)(),mt=Object(r.useRef)(),wt=Object(r.useRef)(),xt=Object(r.useRef)(),Tt=Object(r.useRef)(),Pt=Object(r.useRef)(new Me.Vector3),St=Object(r.useRef)(new Me.Vector3),jt=Object(r.useRef)(new Me.Vector3(1,1,1)),Ht=Object(r.useRef)(new Me.Vector3(1,1,1)),zt=Object(r.useRef)(0),Mt=Object(r.useRef)(0),Wt=Object(r.useRef)([]),It=Object(r.useRef)([]),Ct=Object(r.useRef)([]),Ot=Object(r.useRef)([]),Ft=Object(r.useRef)([]),kt=Object(r.useRef)([]),Yt=Object(r.useMemo)((function(){return{lng:F}}),[F]),Ut=Object(r.useMemo)((function(){return new Me.Vector2}),[]),Nt=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Vt=y/2,Jt=m/2,Gt=x/2,Xt=Object(r.useMemo)((function(){return new Me.Vector3(-Vt,-Jt,Gt)}),[Vt,Jt,Gt]),Bt=Object(r.useMemo)((function(){return new Me.Vector3(-Vt,Jt,Gt)}),[Vt,Jt,Gt]),Kt=Object(r.useMemo)((function(){return new Me.Vector3(Vt,-Jt,Gt)}),[Vt,Jt,Gt]),qt=Object(r.useMemo)((function(){return new Me.Vector3(Vt,Jt,Gt)}),[Vt,Jt,Gt]),Qt=up(),Zt=Qt,_t=Qt,$t=4*Qt,el=Jt+$t,tl=Object(r.useRef)(!1),ll=Object(r.useRef)(null),al=Ew(Vu),ol=Ew(Ju),il=Object(r.useMemo)((function(){return new Me.Vector3}),[]);if(rt.current){var rl=-1;switch(rt.current.type){case V.SolarPanel:rl=rt.current.poleHeight;break;case V.ParabolicTrough:var nl=rt.current;rl=nl.poleHeight+nl.lx/2;break;case V.ParabolicDish:var cl=rt.current;rl=cl.poleHeight+cl.lx/2+cl.lx*cl.lx/(4*cl.latusRectum);break;case V.FresnelReflector:var sl=rt.current;rl=sl.poleHeight+sl.lx/2}rl>=0&&il.set(0,0,(null===e||void 0===e?void 0:e.lz)/2+rl)}Object(r.useEffect)((function(){at.current.clear();var e,t=Object(f.a)(Ew.getState().elements);try{for(t.s();!(e=t.n()).done;){var l=e.value;l.type===V.Wall&&l.parentId===n&&at.current.set(l.id,l)}}catch(a){t.e(a)}finally{t.f()}}),[fe]),Object(r.useEffect)((function(){ue&&ue===_e.current&&(at.current.delete(ue),$e.current=!1,et.current=!1,_e.current=null,E((function(e){e.addedWallId===e.deletedWallId&&(e.addedWallId=null),e.deletedWallId=null})),Et.getState().setEnableOrbitController(!0),Be({show:!1,direction:null,position:null}),Ze([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]))}),[ue]),Object(r.useEffect)((function(){if(e&&Ae){var t=He(e.id);Le(t?Tw.fetchHeatmapTexture(t,null!==Te&&void 0!==Te?Te:5):null)}}),[Ae,Te,je]),Object(r.useEffect)((function(){tl.current&&Ew.getState().getAutoDeletedElements()&&dl()}),[al,ol]);var dl=Object(Ly.debounce)((function(){if(ll.current){var e=Ew.getState().getAutoDeletedElements();if(e){var t=ll.current,l=t.wall,a=t.newAngle,o=t.newJoints,i={name:"Move Wall",timestamp:Date.now(),id:l.id,oldPoints:[Object(h.a)(Ft.current[0]),Object(h.a)(Ft.current[1])],newPoints:[Object(h.a)(l.leftPoint),Object(h.a)(l.rightPoint)],oldJoints:[Object(h.a)(Ct.current[0]),Object(h.a)(Ct.current[1])],newJoints:[Object(h.a)(o[0]),Object(h.a)(o[1])],oldAngle:zt.current,newAngle:a,flippedWallSide:lt.current,autoDeletedElements:Object(h.a)(e),undo:function(){var e=this;switch(this.flippedWallSide){case Rp.loop:bl(this.id);break;case Rp.left:var t=Y(this.newJoints[0][0]);t&&Al(t);break;case Rp.right:var l=Y(this.newJoints[1][0]);l&&Tl(l)}var a=Object(u.a)(this.oldJoints,2),o=a[0],i=a[1],r=Object(u.a)(this.newJoints,2),n=r[0],c=r[1];E((function(t){var l,a,r=Object(f.a)(t.elements);try{for(r.s();!(a=r.n()).done;){var n=a.value;if(n.id===e.id){var c=Object(u.a)(e.oldPoints,2),s=c[0],d=c[1];n.cx=(s[0]+d[0])/2,n.cy=(s[1]+d[1])/2,n.lx=Math.hypot(s[0]-d[0],s[1]-d[1]);var p=n;p.relativeAngle=e.oldAngle,p.leftPoint=Object(h.a)(s),p.rightPoint=Object(h.a)(d),p.leftJoints=Object(h.a)(o),p.rightJoints=Object(h.a)(i);break}}}catch(y){r.e(y)}finally{r.f()}t.resizeHandleType=null,(l=t.elements).push.apply(l,Object(h.a)(e.autoDeletedElements)),t.deletedRoofId=null,t.autoDeletedChild=null,t.autoDeletedRoofs=null,t.autoDeletedRoofIdSet.clear()})),o[0]!==n[0]&&E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.type===V.Wall&&(i.id===o[0]&&(i.rightJoints=[e.id]),i.id===n[0]&&(e.flippedWallSide!==Rp.left?i.rightJoints=[]:i.leftJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),i[0]!==c[0]&&E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&(o.id===i[0]&&(o.leftJoints=[e.id]),o.id===c[0]&&(e.flippedWallSide!==Rp.right?o.leftJoints=[]:o.rightJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),lt.current=Rp.null},redo:function(){var e=this,t=Object(u.a)(this.oldJoints,2),l=t[0],a=t[1],o=Object(u.a)(this.newJoints,2),i=o[0],r=o[1];switch(E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===e.id&&o.type===V.Wall){var n=Object(u.a)(e.newPoints,2),c=n[0],s=n[1];o.cx=(c[0]+s[0])/2,o.cy=(c[1]+s[1])/2,o.lx=Math.hypot(c[0]-s[0],c[1]-s[1]);var d=o;d.relativeAngle=e.newAngle,d.leftPoint=Object(h.a)(c),d.rightPoint=Object(h.a)(s),d.leftJoints=Object(h.a)(i),d.rightJoints=Object(h.a)(r);break}}}catch(p){a.e(p)}finally{a.f()}})),l[0]!==i[0]&&E((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;r.type===V.Wall&&(r.id===l[0]&&(r.rightJoints=[]),r.id===i[0]&&(e.flippedWallSide===Rp.right?r.leftJoints=[e.id]:r.rightJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),a[0]!==r[0]&&E((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type===V.Wall&&(i.id===a[0]&&(i.leftJoints=[]),i.id===r[0]&&(e.flippedWallSide===Rp.right?i.rightJoints=[e.id]:i.leftJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),this.flippedWallSide){case Rp.loop:bl(this.id);break;case Rp.left:var n=Y(this.newJoints[0][0]);n&&Tl(n);break;case Rp.right:var c=Y(this.newJoints[1][0]);c&&Al(c)}var s=new Set(this.autoDeletedElements.map((function(e){return e.id})));E((function(t){t.resizeHandleType=null,t.elements=t.elements.filter((function(e){return!s.has(e.id)}));var l=e.autoDeletedElements.find((function(e){return e.type===V.Roof}));l&&(t.deletedRoofId=l.id)})),lt.current=Rp.null}};we(i),tl.current=!1,E((function(e){e.autoDeletedRoofs=null,e.autoDeletedRoofIdSet.clear(),e.autoDeletedChild=null}))}}}),100),ul=function(e){Ut.x=e.offsetX/De.clientWidth*2-1,Ut.y=-e.offsetY/De.clientHeight*2+1,Nt.setFromCamera(Ut,Re)},fl=Object(r.useMemo)((function(){var e;switch(I){case se.Texture01:e=Kp;break;case se.Texture02:e=qp;break;case se.Texture03:e=Qp;break;case se.Texture04:e=Zp;break;case se.Texture05:e=_p;break;case se.Texture06:e=$p;break;case se.Texture07:e=ey;break;default:e=Sf}return(new Me.TextureLoader).load(e,(function(e){e.wrapS=e.wrapT=Me.RepeatWrapping;var t=function(e){switch(e){case se.Texture01:return{x:1,y:1};case se.Texture02:return{x:2,y:2};case se.Texture03:return{x:.4,y:.4};case se.Texture04:return{x:.25,y:.25};case se.Texture05:return{x:5,y:5};case se.Texture06:case se.Texture07:default:return{x:1,y:1}}}(I);e.repeat.set(y/t.x,m/t.y),gl(e)}))}),[I,y,m]),hl=Object(r.useState)(fl),pl=Object(u.a)(hl,2),yl=pl[0],gl=pl[1],ml=Object(r.useCallback)((function(e,t){Tf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(E((function(e){e.hoveredHandle=t})),Tw.isMoveHandle(t)?De.style.cursor="move":t===q.Lower||t===q.Upper?De.style.cursor="grab":De.style.cursor=Ew.getState().addedFoundationId?"crosshair":"pointer")}),[]),wl=Object(r.useCallback)((function(){E((function(e){e.hoveredHandle=null})),De.style.cursor=Ew.getState().addedFoundationId?"crosshair":"default"}),[]),xl=function(e){switch(e){case V.Human:case V.Tree:case V.Flower:case V.Polygon:case V.Sensor:case V.Light:case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:case V.WindTurbine:case V.Wall:return!0;default:return!1}},vl=function(e,t){var l=t,a=null,o=null,i=null,r=void 0;if(!Ew.getState().enableFineGrid){var n,c=Object(f.a)(at.current);try{for(c.s();!(n=c.n()).done;){var s,d,h=Object(u.a)(n.value,2),p=h[0],y=h[1];if(!(p===_e.current||rt.current&&p===rt.current.id)){var g=new Me.Vector3(y.leftPoint[0],y.leftPoint[1],0),m=new Me.Vector3(y.rightPoint[0],y.rightPoint[1],0),w=null!==(s=null===g||void 0===g?void 0:g.distanceTo(e))&&void 0!==s?s:Number.MAX_VALUE,x=null!==(d=null===m||void 0===m?void 0:m.distanceTo(e))&&void 0!==d?d:Number.MAX_VALUE,v=w<=x,b=v?w:x;b<=l+.01&&(l=b,a=v?g:m,r=v?y.leftJoints[0]:y.rightJoints[0],o=p,i=v?pe.Left:pe.Right)}}}catch(A){c.e(A)}finally{c.f()}}return{id:o,point:a,side:i,jointId:r}},bl=function(e){at.current.clear();var t,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Wall&&a.parentId===n&&at.current.set(a.id,a)}}catch(r){l.e(r)}finally{l.f()}for(var o=at.current.get(e),i=function(){var t=at.current.get(o.id);return t?(E((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.id){var i=o;i.relativeAngle=(t.relativeAngle+Math.PI)%bt,i.leftPoint=Object(h.a)(t.rightPoint),i.rightPoint=Object(h.a)(t.leftPoint),i.leftJoints=[t.rightJoints[0]],i.rightJoints=[t.leftJoints[0]];break}}}catch(r){a.e(r)}finally{a.f()}})),(o=at.current.get(o.leftJoints[0]))&&o.id===e?"break":void 0):"break"};o&&o.leftJoints.length>0;){if("break"===i())break}E((function(e){e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,Ew.getState().resizeHandleType&&(e.resizeHandleType=Ew.getState().resizeHandleType===K.LowerLeft?K.LowerRight:K.LowerLeft)})),lt.current=lt.current===Rp.null?Rp.loop:Rp.null},Al=function(e,t){at.current.clear();var l,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&o.parentId===n&&at.current.set(o.id,o)}}catch(s){a.e(s)}finally{a.f()}for(var i=e,r=e,c=function(){var e=at.current.get(r.id);if(!e)return"break";E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(e&&o.id===e.id){var i=o;i.relativeAngle=(e.relativeAngle+Math.PI)%bt,i.leftPoint=Object(h.a)(e.rightPoint),i.rightPoint=Object(h.a)(e.leftPoint),i.leftJoints=e.rightJoints.length>0?[e.rightJoints[0]]:[],i.rightJoints=e.leftJoints.length>0?[e.leftJoints[0]]:[];break}}}catch(s){a.e(s)}finally{a.f()}}));var t=void 0;if(e.leftJoints.length>0&&(t=at.current.get(e.leftJoints[0])),!t||t.id===i.id)return"break";r=t};r;){if("break"===c())break}E((function(e){if(t){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&(o.id===i.id&&(o.leftJoints=[t.id]),o.id===t.id&&(o.rightJoints=[i.id]))}}catch(s){a.e(s)}finally{a.f()}}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.resizeHandleType=K.LowerLeft})),lt.current=lt.current===Rp.null?Rp.right:Rp.null},Tl=function(e,t){at.current.clear();var l,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&o.parentId===n&&at.current.set(o.id,o)}}catch(s){a.e(s)}finally{a.f()}for(var i=e,r=e,c=function(){var e=at.current.get(r.id);if(!e)return"break";E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(e&&o.id===e.id){var i=o;i.relativeAngle=(e.relativeAngle+Math.PI)%bt,i.leftPoint=Object(h.a)(e.rightPoint),i.rightPoint=Object(h.a)(e.leftPoint),i.leftJoints=e.rightJoints.length>0?[e.rightJoints[0]]:[],i.rightJoints=e.leftJoints.length>0?[e.leftJoints[0]]:[];break}}}catch(s){a.e(s)}finally{a.f()}}));var t=void 0;if(e.rightJoints.length>0&&(t=at.current.get(e.rightJoints[0])),!t||t.id===i.id)return"break";r=t};r;){if("break"===c())break}E((function(e){if(t){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&(o.id===i.id&&(o.rightJoints=[t.id]),o.id===t.id&&(o.leftJoints=[i.id]))}}catch(s){a.e(s)}finally{a.f()}}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.resizeHandleType=K.LowerRight})),lt.current=lt.current===Rp.null?Rp.left:Rp.null},Pl=function(e){var t=void 0;at.current.clear();var l,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.id===e&&(t=o),o.type===V.Wall&&o.parentId===n&&at.current.set(o.id,o)}}catch(u){a.e(u)}finally{a.f()}for(var i=!1;t&&t.leftJoints.length>0;){var r;if((null===(r=t=at.current.get(t.leftJoints[0]))||void 0===r?void 0:r.id)===e){i=!0;break}}if(i){for(var c=0,s=0;t&&t.leftJoints.length>0;){var d=at.current.get(t.leftJoints[0]);if(c+=(3*Math.PI-(t.relativeAngle-d.relativeAngle))%bt,s+=1,(t=d).id===e)break}c>(s-2)*Math.PI+.1?bl(e):lt.current!==Rp.null&&(lt.current=Rp.loop)}return i},Sl=Object(r.useRef)(null),jl=Object(r.useRef)(null),Hl=Object(r.useRef)(!1),zl=Object(r.useRef)(!1),Rl=Object(r.useRef)(!1),Dl=function(e,t,l){var a=Math.atan2(t.y-e.y,t.x-e.x)-(l===K.LowerLeft?Math.PI:0);return a=a>=0?a:(bt+a)%bt},Ml=function(e,t){var l,a=null,o=null,i=1/0,r=1/0,n=Object(f.a)(at.current);try{for(n.s();!(l=n.n()).done;){var c=Object(u.a)(l.value,2),s=(c[0],c[1]);if(null!==rt.current&&s.id!==rt.current.id&&s.id!==t){var d=Math.abs(e.x-s.leftPoint[0]),h=Math.abs(e.x-s.rightPoint[0]),p=Math.abs(e.y-s.leftPoint[1]),y=Math.abs(e.y-s.rightPoint[1]);d<1&&dbt-a||Math.abs(o-Math.PI)1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2?arguments[2]:void 0,o=1/0,i=1/0,r=null,n=null,c=Object(f.a)(at.current);try{for(c.s();!(t=c.n()).done;){var s=Object(u.a)(t.value,2),d=(s[0],s[1]);if(null!==rt.current&&d.id!==rt.current.id&&d.id!==a){var h=Math.abs(e.x-d.leftPoint[0]),p=Math.abs(e.x-d.rightPoint[0]);h<.01&&ht.poleHeight)return!1;var r=JSON.parse(JSON.stringify(t));return r.cx=l,r.cy=a,r.lx=o,r.ly=i,Tw.isSolarCollectorWithinHorizontalSurface(r,e)},El=ye?k?.25:.75:1;return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)("group",{ref:ot,name:"".concat(dg," ").concat(n),userData:{aabb:!0},position:[c,s,Gt],rotation:[0,0,b[2]],children:[Object(gf.jsxs)(Lt.a,{castShadow:he,receiveShadow:he,uuid:n,userData:{simulation:!0,stand:!0},ref:it,name:"Foundation",args:[y,m,x],onContextMenu:function(e){E((function(t){(Yy.selectMe(t,n,e,X.ContextMenu),t.pastePoint.copy(e.intersections[0].point),t.clickObjectType=V.Foundation,t.pasteNormal=Rt,e.altKey)?t.contextMenuObjectType=null:e.intersections.length>0&&e.intersections[0].object===it.current&&(t.contextMenuObjectType=V.Foundation);t.pasteNormal=Rt}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===it.current&&Oe(!0))},onPointerDown:function(t){if(2!==t.button){E((function(e){e.contextMenuObjectType=null})),Ew.getState().objectTypeToAdd===V.Window||xe()||ne(n,t,X.Select);var l=L(),a=!1;if(t.intersections[0].object.name===V.Polygon&&Ew.getState().objectTypeToAdd!==V.None&&(a=!0),(null===l||void 0===l?void 0:l.id)===n||a)if(xl(Ew.getState().objectTypeToAdd)){if(e){Ve(!0);var o=t.intersections.filter((function(e){return!e.eventObject.name.startsWith("Wall Intersection Plane")}))[0].point,i=ce(e,o);i&&function(e){var t={name:"Add",timestamp:Date.now(),addedElement:e,undo:function(){re(t.addedElement.id,!1)},redo:function(){E((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement}))}};we(t)}(i),E((function(e){e.actionModeLock||(e.objectTypeToAdd=V.None)}))}}else Et.getState().selectNone(),Et.setState((function(e){e.foundationRef=ot}));else if(l&&l.parentId===n&&xl(l.type))switch(rt.current=l,l.type!==V.Wall||$e.current||(tt.current=Object(h.a)(Ew.getState().elements)),Ve(!0),Pt.current.set(l.cx,l.cy,l.cz),jt.current.set(l.lx,l.ly,l.lz),l.type){case V.SolarPanel:case V.ParabolicTrough:case V.FresnelReflector:zt.current=l.relativeAzimuth;break;case V.Polygon:Wt.current=l.vertices.map((function(e){return Object(d.a)({},e)}));break;case V.Wall:var r=l;zt.current=r.relativeAngle,Ct.current=[Object(h.a)(r.leftJoints),Object(h.a)(r.rightJoints)],Ft.current=[Object(h.a)(r.leftPoint),Object(h.a)(r.rightPoint)],Sl.current=r.leftJoints[0],jl.current=r.rightJoints[0],at.current.clear();var c,s=Object(f.a)(Ew.getState().elements);try{for(s.s();!(c=s.n()).done;){var u=c.value;u.type===V.Wall&&u.parentId===n&&at.current.set(u.id,u)}}catch(T){s.e(T)}finally{s.f()}}if($e.current&&_e.current&&it.current){var p=Nt.intersectObjects([it.current]);if(0===p.length)return;var y=Tw.wallRelativePosition(p[0].point,e);Qe[0].position&&(y.setX(Qe[0].position[0]),y.setY(Qe[0].position[1]));var g=vl(y,1.5),m=g.id,w=g.point,x=g.side,v=g.jointId;y=function(e,t){return Ew.getState().enableFineGrid?(e=Tw.snapToFineGrid(e),t=null):e=t||Tw.snapToNormalGrid(e),e}(y,w);var b=K.LowerRight;if(m){var A=Y(m);x===pe.Right?E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall){if(a.id===_e.current){var o=a;o.cx=y.x,o.cy=y.y,0===A.rightJoints.length&&(o.leftJoints=[A.id])}a.id===m&&0===A.rightJoints.length&&(a.rightJoints=_e.current?[_e.current]:[])}}}catch(T){l.e(T)}finally{l.f()}})):x!==pe.Left||v||(E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall){if(a.id===_e.current){var o=a;o.cx=y.x,o.cy=y.y,0===A.leftJoints.length&&(o.rightJoints=[A.id])}a.id===m&&0===A.leftJoints.length&&(a.leftJoints=_e.current?[_e.current]:[])}}}catch(T){l.e(T)}finally{l.f()}})),b=K.LowerLeft)}else U(_e.current,y.x,y.y);$e.current=!1,et.current=!0,ee(_e.current,[y.x,y.y,y.z]),E((function(t){t.resizeHandleType=b,t.resizeAnchor=Tw.wallAbsolutePosition(y,e)})),Et.getState().setEnableOrbitController(!1),rt.current=l}}else t.altKey&&ne(n,t,X.Select)},onPointerUp:function(e){if(e.altKey&&2===e.button&&ie&&ie.length>0){E((function(t){t.pastePoint.copy(e.intersections[0].point),t.clickObjectType=V.Foundation,t.pasteNormal=Rt}));var t=oe();if(t.length>0){var l={name:"Paste to Point",timestamp:Date.now(),pastedElements:t.map((function(e){return Object(d.a)({},e)})),undo:function(){var e,t=Object(f.a)(l.pastedElements);try{for(t.s();!(e=t.n()).done;){var a=e.value;re(a.id,!1)}}catch(o){t.e(o)}finally{t.f()}},redo:function(){E((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.pastedElements)),e.selectedElement=l.pastedElements[0]}))}};we(l)}}if(rt.current&&rt.current.parentId===n&&rt.current.type!==V.Tree&&rt.current.type!==V.Flower&&rt.current.type!==V.Human){var a=Y(rt.current.id);if(a){switch(a.type){case V.Wall:var o=a;if($e.current)E((function(e){e.elements.pop(),e.addedWallId=null,e.actionModeLock&&(e.objectTypeToAdd=V.Wall,Yy.selectNone(e))})),_e.current&&at.current.delete(_e.current),_e.current=null,$e.current=!1,et.current=!1;else if(et.current&&_e.current&&it.current)Et.getState().setEnableOrbitController(!0),E((function(e){e.actionModeLock&&(e.objectTypeToAdd=V.Wall,Yy.selectNone(e)),e.addedWallId=null,0===o.lx&&tt.current?(e.elements=Object(h.a)(tt.current),_e.current&&at.current.delete(_e.current)):(!function(e){var t={name:"Add",timestamp:Date.now(),addedElement:e,flippedWallSide:lt.current,undo:function(){var e=t.addedElement;if(re(e.id,!1),(t.flippedWallSide===Rp.right||t.flippedWallSide===Rp.loop)&&e.rightJoints.length>0){var l=Y(e.rightJoints[0]);l&&Tl(l)}else if(t.flippedWallSide===Rp.left&&e.leftJoints.length>0){var a=Y(e.leftJoints[0]);a&&Al(a)}},redo:function(){var e=t.addedElement;if(t.flippedWallSide===Rp.right||t.flippedWallSide===Rp.loop&&e.rightJoints.length>0){var l=Y(e.rightJoints[0]);l&&Al(l)}else if(t.flippedWallSide===Rp.left&&e.leftJoints.length>0){var a=Y(e.leftJoints[0]);a&&Tl(a)}e.rightJoints.length>0&&Z(e.rightJoints[0],[e.id]),e.leftJoints.length>0&&_(e.leftJoints[0],[e.id]),E((function(t){t.elements.push(e),t.selectedElement=e,t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag}))}};we(t)}(o),at.current.set(o.id,o))})),_e.current=null,et.current=!1;else if(Ew.getState().resizeHandleType)o.lx>.45?(at.current.set(o.id,o),St.current.set(o.cx,o.cy,o.cz),Ht.current.set(o.lx,o.ly,o.lz),Mt.current=o.relativeAngle,Ot.current=[Object(h.a)(o.leftJoints),Object(h.a)(o.rightJoints)],kt.current=[Object(h.a)(o.leftPoint),Object(h.a)(o.rightPoint)],function(e){var t=Ew.getState().getAutoDeletedElements(),l={name:"Resize Wall",timestamp:Date.now(),resizedElementId:e.id,resizedElementType:e.type,oldPosition:Pt.current.clone(),newPosition:St.current.clone(),oldDimension:jt.current.clone(),newDimension:Ht.current.clone(),oldAngle:zt.current,newAngle:Mt.current,oldJoints:[Object(h.a)(Ct.current[0]),Object(h.a)(Ct.current[1])],newJoints:[Object(h.a)(Ot.current[0]),Object(h.a)(Ot.current[1])],oldPoint:[Object(h.a)(Ft.current[0]),Object(h.a)(Ft.current[1])],newPoint:[Object(h.a)(kt.current[0]),Object(h.a)(kt.current[1])],flippedWallSide:lt.current,autoDeletedElement:t?Object(h.a)(t):[],undo:function(){switch(l.flippedWallSide){case Rp.right:if(l.newJoints[1]){var e=Y(l.newJoints[1][0]);e&&Tl(e)}break;case Rp.left:if(l.newJoints[0]){var t=Y(l.newJoints[0][0]);t&&Al(t)}break;case Rp.loop:if(l.newJoints[0]&&l.newJoints[1])bl(l.resizedElementId);else if(l.newJoints[1]){var a=Y(l.newJoints[1][0]);a&&Tl(a)}else if(l.newJoints[0]){var o=Y(l.newJoints[0][0]);o&&Al(o)}}E((function(e){var t,a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.resizedElementId){var r=i;switch(r.cx=l.oldPosition.x,r.cy=l.oldPosition.y,r.cz=l.oldPosition.z,r.lx=l.oldDimension.x,r.ly=l.oldDimension.y,r.lz=l.oldDimension.z,r.relativeAngle=l.oldAngle,r.leftJoints=Object(h.a)(l.oldJoints[0]),r.rightJoints=Object(h.a)(l.oldJoints[1]),r.leftPoint=Object(h.a)(l.oldPoint[0]),r.rightPoint=Object(h.a)(l.oldPoint[1]),l.flippedWallSide){case Rp.loop:if(l.oldJoints[0]!==l.newJoints[1]){var n,c=Object(f.a)(e.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.type===V.Wall&&(s.id===l.newJoints[1][0]&&(s.rightJoints=[]),s.id===l.oldJoints[0][0]&&(s.rightJoints=[l.resizedElementId]))}}catch(I){c.e(I)}finally{c.f()}}else if(l.oldJoints[1]!==l.newJoints[0]){var d,u=Object(f.a)(e.elements);try{for(u.s();!(d=u.n()).done;){var p=d.value;p.type===V.Wall&&(p.id===l.newJoints[0][0]&&(p.leftJoints=[]),p.id===l.oldJoints[1][0]&&(p.leftJoints=[l.resizedElementId]))}}catch(I){u.e(I)}finally{u.f()}}break;case Rp.left:case Rp.right:if(!l.oldJoints[0]&&l.newJoints[1]){var y,g=Object(f.a)(e.elements);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.Wall&&m.id===l.newJoints[1][0]){m.leftJoints=[];break}}}catch(I){g.e(I)}finally{g.f()}}else if(!l.oldJoints[1]&&l.newJoints[0]){var w,x=Object(f.a)(e.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.Wall&&v.id===l.newJoints[0][0]){v.rightJoints=[];break}}}catch(I){x.e(I)}finally{x.f()}}else if(l.flippedWallSide===Rp.left&&l.oldJoints[0]){var b,A=Object(f.a)(e.elements);try{for(A.s();!(b=A.n()).done;){var T=b.value;T.type===V.Wall&&(T.id===l.newJoints[1][0]&&(T.leftJoints=[]),T.id===l.oldJoints[0][0]&&(T.rightJoints=[r.id]))}}catch(I){A.e(I)}finally{A.f()}}else if(l.flippedWallSide===Rp.right&&l.oldJoints[1]){var P,S=Object(f.a)(e.elements);try{for(S.s();!(P=S.n()).done;){var j=P.value;j.type===V.Wall&&(j.id===l.newJoints[0][0]&&(j.rightJoints=[]),j.id===l.oldJoints[1][0]&&(j.leftJoints=[r.id]))}}catch(I){S.e(I)}finally{S.f()}}break;case Rp.null:if(l.oldJoints[0]!==l.newJoints[0]){var H,z=Object(f.a)(e.elements);try{for(z.s();!(H=z.n()).done;){var R=H.value;R.type===V.Wall&&(R.id===l.newJoints[0][0]&&(R.rightJoints=[]),R.id===l.oldJoints[0][0]&&(R.rightJoints=[r.id]))}}catch(I){z.e(I)}finally{z.f()}}if(l.oldJoints[1]!==l.newJoints[1]){var D,M=Object(f.a)(e.elements);try{for(M.s();!(D=M.n()).done;){var W=D.value;W.type===V.Wall&&(W.id===l.newJoints[1][0]&&(W.leftJoints=[]),W.id===l.oldJoints[1][0]&&(W.leftJoints=[r.id]))}}catch(I){M.e(I)}finally{M.f()}}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}break}}}catch(I){o.e(I)}finally{o.f()}(t=e.elements).push.apply(t,Object(h.a)(l.autoDeletedElement)),e.resizeHandleType=null,e.deletedRoofId=null,e.autoDeletedRoofs=null,e.autoDeletedRoofIdSet.clear(),e.autoDeletedChild=null})),lt.current=Rp.null},redo:function(){l.autoDeletedElement.length>0&&re(l.autoDeletedElement[0].id,!1,!1,!0);var e=new Set(l.autoDeletedElement.map((function(e){return e.id})));switch(E((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)}));var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.resizedElementId){var r=i;switch(r.cx=l.newPosition.x,r.cy=l.newPosition.y,r.cz=l.newPosition.z,r.lx=l.newDimension.x,r.ly=l.newDimension.y,r.lz=l.newDimension.z,l.flippedWallSide){case Rp.left:r.relativeAngle=(l.newAngle+Math.PI)%bt;var n,c=Object(f.a)(t.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Wall&&s.id===l.oldJoints[0][0]){s.rightJoints=[];break}}}catch(P){c.e(P)}finally{c.f()}break;case Rp.right:r.relativeAngle=(l.newAngle+Math.PI)%bt;var d,u=Object(f.a)(t.elements);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Wall&&p.id===l.oldJoints[1][0]){p.leftJoints=[];break}}}catch(P){u.e(P)}finally{u.f()}break;case Rp.loop:r.relativeAngle=(l.newAngle+Math.PI)%bt,r.leftJoints=Object(h.a)(l.newJoints[1]),r.rightJoints=Object(h.a)(l.newJoints[0]),r.leftPoint=Object(h.a)(l.newPoint[1]),r.rightPoint=Object(h.a)(l.newPoint[0]);var y,g=Object(f.a)(t.elements);try{for(g.s();!(y=g.n()).done;){var m=y.value;m.type===V.Wall&&(m.id===l.newJoints[0][0]&&(m.leftJoints=[r.id]),m.id===l.newJoints[1][0]&&(m.rightJoints=[r.id]))}}catch(P){g.e(P)}finally{g.f()}break;case Rp.null:if(r.relativeAngle=l.newAngle,r.leftJoints=Object(h.a)(l.newJoints[0]),r.rightJoints=Object(h.a)(l.newJoints[1]),r.leftPoint=Object(h.a)(l.newPoint[0]),r.rightPoint=Object(h.a)(l.newPoint[1]),l.oldJoints[0][0]!==l.newJoints[0][0]){var w,x=Object(f.a)(t.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;v.type===V.Wall&&(v.id===l.newJoints[0][0]&&(v.rightJoints=[r.id]),v.id===l.oldJoints[0][0]&&(v.rightJoints=[]))}}catch(P){x.e(P)}finally{x.f()}}if(l.oldJoints[1][0]!==l.newJoints[1][0]){var b,A=Object(f.a)(t.elements);try{for(A.s();!(b=A.n()).done;){var T=b.value;T.type===V.Wall&&(T.id===l.newJoints[1][0]&&(T.leftJoints=[r.id]),T.id===l.oldJoints[1][0]&&(T.leftJoints=[]))}}catch(P){A.e(P)}finally{A.f()}}t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag}break}}}catch(P){o.e(P)}finally{o.f()}t.resizeHandleType=null})),setTimeout((function(){E((function(e){e.deletedRoofId=null,e.autoDeletedRoofs=null,e.autoDeletedRoofIdSet.clear()}))})),l.flippedWallSide){case Rp.left:var t=Y(l.resizedElementId),a=Y(l.newJoints[1][0]);Tl(t,a);break;case Rp.right:var o=Y(l.resizedElementId),i=Y(l.newJoints[0][0]);Al(o,i);break;case Rp.loop:at.current.clear();var r,c=Object(f.a)(Ew.getState().elements);try{for(c.s();!(r=c.n()).done;){var s=r.value;s.type===V.Wall&&s.parentId===n&&at.current.set(s.id,s)}}catch(d){c.e(d)}finally{c.f()}bl(l.resizedElementId)}lt.current=Rp.null}};we(l),E((function(t){t.actionState.wallHeight=e.lz,t.deletedRoofId=null,t.autoDeletedRoofs=null,t.autoDeletedRoofIdSet.clear(),t.autoDeletedChild=[]}))}(o)):E((function(e){tt.current&&(e.elements=Object(h.a)(tt.current),tt.current=null)}));else if(Ew.getState().moveHandleType){var i=o.relativeAngle,r=[],c=[];if(Sl.current)if(o.leftJoints.length>0&&(Sl.current!==o.leftJoints[0]||Sl.current===o.leftJoints[0]&&Hl.current)&&_(o.leftJoints[0],[]),Hl.current)Z(Sl.current,[o.id]),c=[Sl.current];else if(r=[Sl.current],Rl.current){Z(Sl.current,[o.id]);var s=Y(Sl.current);s&&Tl(s)}else _(Sl.current,[o.id]);else o.leftJoints.length>0&&o.leftJoints[0]!==jl.current&&(r=[],_(o.leftJoints[0],[]));if(jl.current)if(o.rightJoints.length>0&&(jl.current!==o.rightJoints[0]||jl.current===o.rightJoints[0]&&Hl.current)&&o.rightJoints[0]!==Sl.current&&Z(o.rightJoints[0],[]),Hl.current)_(jl.current,[o.id]),r=[jl.current];else if(c=[jl.current],zl.current){_(jl.current,[o.id]);var p=Y(jl.current);p&&Al(p)}else Z(jl.current,[o.id]);else o.rightJoints.length>0&&o.rightJoints[0]!==Sl.current&&(c=[],Z(o.rightJoints[0],[]));E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===o.id&&a.type===V.Wall){var n=a;if(Hl.current){i=(n.relativeAngle+Math.PI)%bt,n.relativeAngle=i;var s=[Object(h.a)(n.rightPoint),Object(h.a)(n.leftPoint)];n.leftPoint=s[0],n.rightPoint=s[1]}if(0===r.length&&0===c.length)n.roofId=null;else if(r.length>0){var d=e.elements.find((function(e){return e.id===r[0]}));d&&(n.roofId=d.roofId)}else if(c.length>0){var u=e.elements.find((function(e){return e.id===c[0]}));u&&(n.roofId=u.roofId)}n.leftJoints=Object(h.a)(r),n.rightJoints=Object(h.a)(c);break}}}catch(p){l.e(p)}finally{l.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag})),Pl(o.id),function(e,t,l){if(e.roofId)tl.current=!0,ll.current={wall:e,newAngle:t,newJoints:[Object(h.a)(l[0]),Object(h.a)(l[1])]};else{var a={name:"Move Wall",timestamp:Date.now(),id:e.id,oldPoints:[Object(h.a)(Ft.current[0]),Object(h.a)(Ft.current[1])],newPoints:[Object(h.a)(e.leftPoint),Object(h.a)(e.rightPoint)],oldJoints:[Object(h.a)(Ct.current[0]),Object(h.a)(Ct.current[1])],newJoints:[Object(h.a)(l[0]),Object(h.a)(l[1])],oldAngle:zt.current,newAngle:t,flippedWallSide:lt.current,undo:function(){var e=this;switch(this.flippedWallSide){case Rp.loop:bl(this.id);break;case Rp.left:var t=Y(this.newJoints[0][0]);t&&Al(t);break;case Rp.right:var l=Y(this.newJoints[1][0]);l&&Tl(l)}var a=Object(u.a)(this.oldJoints,2),o=a[0],i=a[1],r=Object(u.a)(this.newJoints,2),n=r[0],c=r[1];E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var r=l.value;if(r.id===e.id){var n=Object(u.a)(e.oldPoints,2),c=n[0],s=n[1];r.cx=(c[0]+s[0])/2,r.cy=(c[1]+s[1])/2,r.lx=Math.hypot(c[0]-s[0],c[1]-s[1]);var d=r;d.relativeAngle=e.oldAngle,d.leftPoint=Object(h.a)(c),d.rightPoint=Object(h.a)(s),d.leftJoints=Object(h.a)(o),d.rightJoints=Object(h.a)(i);break}}}catch(p){a.e(p)}finally{a.f()}t.resizeHandleType=null})),o[0]!==n[0]&&E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.type===V.Wall&&(i.id===o[0]&&(i.rightJoints=[e.id]),i.id===n[0]&&(e.flippedWallSide!==Rp.left?i.rightJoints=[]:i.leftJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),i[0]!==c[0]&&E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type===V.Wall&&(o.id===i[0]&&(o.leftJoints=[e.id]),o.id===c[0]&&(e.flippedWallSide!==Rp.right?o.leftJoints=[]:o.rightJoints=[]))}}catch(r){a.e(r)}finally{a.f()}})),lt.current=Rp.null},redo:function(){var e=this,t=Object(u.a)(this.oldJoints,2),l=t[0],a=t[1],o=Object(u.a)(this.newJoints,2),i=o[0],r=o[1];switch(E((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===e.id&&o.type===V.Wall){var n=Object(u.a)(e.newPoints,2),c=n[0],s=n[1];o.cx=(c[0]+s[0])/2,o.cy=(c[1]+s[1])/2,o.lx=Math.hypot(c[0]-s[0],c[1]-s[1]);var d=o;d.relativeAngle=e.newAngle,d.leftPoint=Object(h.a)(c),d.rightPoint=Object(h.a)(s),d.leftJoints=Object(h.a)(i),d.rightJoints=Object(h.a)(r);break}}}catch(p){a.e(p)}finally{a.f()}})),l[0]!==i[0]&&E((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;r.type===V.Wall&&(r.id===l[0]&&(r.rightJoints=[]),r.id===i[0]&&(e.flippedWallSide===Rp.right?r.leftJoints=[e.id]:r.rightJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),a[0]!==r[0]&&E((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type===V.Wall&&(i.id===a[0]&&(i.leftJoints=[]),i.id===r[0]&&(e.flippedWallSide===Rp.right?i.rightJoints=[e.id]:i.leftJoints=[e.id]))}}catch(n){o.e(n)}finally{o.f()}})),this.flippedWallSide){case Rp.loop:bl(this.id);break;case Rp.left:var n=Y(this.newJoints[0][0]);n&&Tl(n);break;case Rp.right:var c=Y(this.newJoints[1][0]);c&&Al(c)}E((function(e){e.resizeHandleType=null})),lt.current=Rp.null}};we(a)}}(o,i,[Object(h.a)(r),Object(h.a)(c)]),Hl.current=!1,Rl.current=!1,zl.current=!1,Sl.current=null,jl.current=null}lt.current=Rp.null,E((function(e){e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag})),Be({show:!1,direction:null,position:null}),Ze([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}]);break;case V.Polygon:if(Ew.getState().moveHandleType||Ew.getState().resizeHandleType){It.current=a.vertices.map((function(e){return Object(d.a)({},e)}));var y={name:Ew.getState().moveHandleType?"Move Polygon":"Resize Polygon",timestamp:Date.now(),oldValue:Wt.current,newValue:It.current,changedElementId:a.id,changedElementType:a.type,undo:function(){ae(y.changedElementId,y.oldValue)},redo:function(){ae(y.changedElementId,y.newValue)}};we(y)}break;default:if(Ew.getState().resizeHandleType){if(St.current.set(a.cx,a.cy,a.cz),Ht.current.set(a.lx,a.ly,a.lz),St.current.distanceToSquared(Pt.current)>At||Ht.current.distanceToSquared(jt.current)>At){var g={name:"Resize",timestamp:Date.now(),resizedElementId:rt.current.id,resizedElementType:rt.current.type,oldCx:Pt.current.x,oldCy:Pt.current.y,oldCz:Pt.current.z,newCx:St.current.x,newCy:St.current.y,newCz:St.current.z,oldLx:jt.current.x,oldLy:jt.current.y,oldLz:jt.current.z,newLx:Ht.current.x,newLy:Ht.current.y,newLz:Ht.current.z,undo:function(){U(g.resizedElementId,g.oldCx,g.oldCy,g.oldCz),N(g.resizedElementId,g.oldLx,g.oldLy,g.oldLz)},redo:function(){U(g.resizedElementId,g.newCx,g.newCy,g.newCz),N(g.resizedElementId,g.newLx,g.newLy,g.newLz)}};we(g)}}else if(Ew.getState().rotateHandleType){if(Tw.isSolarCollector(rt.current)){var m=rt.current;if(Math.abs(Mt.current-zt.current)>At)if(Yl(m,Mt.current)){E((function(e){e.selectedElementAngle=Mt.current}));var w={name:"Rotate",timestamp:Date.now(),oldValue:zt.current,newValue:Mt.current,changedElementId:m.id,changedElementType:m.type,undo:function(){te(w.changedElementId,w.oldValue)},redo:function(){te(w.changedElementId,w.newValue)}};we(w)}else te(m.id,zt.current)}}else if(St.current.set(a.cx,a.cy,a.cz),St.current.distanceToSquared(Pt.current)>At){var x=!0;if(Tw.isSolarCollector(a)&&(x=kl(a,a.cx,a.cy)),x){var v={name:"Move",timestamp:Date.now(),movedElementId:a.id,movedElementType:a.type,oldCx:Pt.current.x,oldCy:Pt.current.y,oldCz:Pt.current.z,newCx:St.current.x,newCy:St.current.y,newCz:St.current.z,undo:function(){U(v.movedElementId,v.oldCx,v.oldCy,v.oldCz)},redo:function(){U(v.movedElementId,v.newCx,v.newCy,v.newCz)}};we(v)}else U(a.id,Pt.current.x,Pt.current.y,Pt.current.z)}}Ve(!1),rt.current=null,E((function(e){e.resizeHandleType=null,e.moveHandleType=null}))}}},onPointerMove:function(t){var l,a;if(e&&(!rt.current||!Tw.isSolarCollector(rt.current))){var o=Ew.getState().objectTypeToAdd;if((rt.current||_e.current||o===V.Wall)&&((null===(l=rt.current)||void 0===l?void 0:l.parentId)===n||o!==V.None)){var i=Ew.getState().moveHandleType,r=Ew.getState().resizeHandleType,c=Ew.getState().resizeAnchor;if(ul(t),it.current){var s=Nt.intersectObjects([it.current]);if(0===s.length)return;var p=s[0].point;if(rt.current&&rt.current.type&&!rt.current.locked&&s.length>0)switch(rt.current.type){case V.Sensor:case V.Light:p=Tw.relativeCoordinates(p.x,p.y,p.z,e),U(rt.current.id,p.x,p.y);break;case V.Polygon:var y=rt.current;if(i===B.Default){p=Tw.relativeCoordinates(p.x,p.y,p.z,e);var g=Tw.calculatePolygonCentroid(y.vertices),m=p.x-g.x,w=p.y-g.y,x=y.vertices.map((function(e){return Object(d.a)({},e)}));x.forEach((function(e){e.x+=m,e.y+=w})),ae(y.id,x)}else r===K.Default&&(p.x-=e.cx,p.y-=e.cy,p.applyEuler((new Me.Euler).fromArray(e.rotation.map((function(e){return-e})))),(p=Ew.getState().enableFineGrid?Tw.snapToFineGrid(p):Tw.snapToNormalGrid(p)).x/=e.lx,p.y/=e.ly,le(y.id,y.selectedIndex,p.x,p.y));break;case V.Wall:if((null===(a=Ew.getState().selectedElement)||void 0===a?void 0:a.type)!==V.Wall)break;if(!r||r!==K.LowerLeft&&r!==K.LowerRight){if(i){var v=Y(rt.current.id);if(v){p=Tw.wallRelativePosition(p,e);var b=new Me.Vector3,A=new Me.Euler(0,0,v.relativeAngle);i===B.Lower?b.setY(Qt):i===B.Upper&&b.setY(-Qt-v.ly),p.add(b.applyEuler(A));var T=(new Me.Vector3).addVectors(p,new Me.Vector3(-v.lx/2,0,0).applyEuler(A)),P=(new Me.Vector3).addVectors(p,new Me.Vector3(v.lx/2,0,0).applyEuler(A)),S=null,j=null,H=!1;Hl.current=!1,Rl.current=!1,zl.current=!1,Sl.current=null,jl.current=null;var z=function(e,t){var l="left"===t?T:P,a=(new Me.Vector3).subVectors(e,l);p.add(a),T.add(a),P.add(a)};if(!Ew.getState().enableFineGrid){var R=vl(T,1);R.point?(z(R.point,"left"),!R.id||R.jointId&&R.jointId!==v.id||(Sl.current=R.id,S=R.side===pe.Left)):Sl.current=null;var D=vl(P,1);if(D.point?(R.id||z(D.point,"right"),!D.id||D.jointId&&D.jointId!==v.id||R.id===D.id&&R.side===D.side||(jl.current=D.id,j=D.side===pe.Right)):jl.current=null,!R.point&&!D.point){var M=Ml(T),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Ml(P),F=Object(u.a)(O,2),k=F[0],L=F[1];if(null!==I||null!==k){var N=(null!==I&&void 0!==I?I:1/0)-T.x,J=(null!==k&&void 0!==k?k:1/0)-P.x,G=Math.min(N,J);T.setX(T.x+G),P.setX(P.x+G),p.setX(p.x+G),(R=vl(T,1)).point?(z(R.point,"left"),!R.id||R.jointId&&R.jointId!==v.id||(Sl.current=R.id,S=R.side===pe.Left)):Sl.current=null}if(null!==C||null!==L){var X=(null!==C&&void 0!==C?C:1/0)-T.y,q=(null!==L&&void 0!==L?L:1/0)-P.y,Q=Math.min(X,q);T.setY(T.y+Q),P.setY(P.y+Q),p.setY(p.y+Q),(D=vl(P,1)).point?(R.id||z(D.point,"right"),!D.id||D.jointId&&D.jointId!==v.id||R.id===D.id&&R.side===D.side||(jl.current=D.id,j=D.side===pe.Right)):jl.current=null}}var Z=Cl(T,0),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Cl(P,1),oe=Object(u.a)(te,2),ie=oe[0],re=oe[1];Ze(Object(Pe.a)((function(e){e[0].show=$||ee,e[1].show=ie||re}))),S&&null===j||j&&null===S||S&&j?Hl.current=!0:(S&&!1===j||j&&!1===S)&&(Rl.current=S,zl.current=j),R.point&&D.point&&(R.id===D.id&&R.side===D.side||(T.copy(R.point),P.copy(D.point),H=!0))}E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a,o=t.value;if(o.id===(null===(a=rt.current)||void 0===a?void 0:a.id)&&o.type===V.Wall){var i=o;if(H){i.cx=(T.x+P.x)/2,i.cy=(T.y+P.y)/2,i.lx=T.distanceTo(P);var r=Math.atan2(P.y-T.y,P.x-T.x);r=r>=0?r:(bt+r)%bt,i.relativeAngle=r}else i.cx=p.x,i.cy=p.y;i.leftPoint=T.toArray(),i.rightPoint=P.toArray();break}}}catch(n){l.e(n)}finally{l.f()}}))}}}else{var ne=Tw.wallRelativePosition(c,e);p=Tw.wallRelativePosition(p,e);var se,de,ue=null;if(Ew.getState().enableFineGrid)p=Tw.snapToFineGrid(p);else if(null===(se=ue=vl(p,1.5))||void 0===se?void 0:se.point)p=ue.point;else p=Tw.snapToNormalGrid(p),p=Wl(ne,p,r),(null===(de=ue=vl(p,1.5))||void 0===de?void 0:de.point)&&(p=ue.point);var fe=Dl(ne,p,r);Fl(p,fe);var he=p.distanceTo(ne),ye=(new Me.Vector3).addVectors(p,ne).divideScalar(2),ge=r===K.LowerLeft?p:ne,me=r===K.LowerLeft?ne:p;E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===rt.current.id&&a.type===V.Wall){var o=a;o.cx=ye.x,o.cy=ye.y,o.lx=he,o.relativeAngle=fe,o.leftPoint=[ge.x,ge.y,0],o.rightPoint=[me.x,me.y,0];break}}}catch(i){l.e(i)}finally{l.f()}}));var we=Y(rt.current.id);if(we)if(ue&&ue.point){if(ue.id&&ue.side&&!ue.jointId){var xe=Y(ue.id);if(xe){if(r===K.LowerLeft&&0===xe.leftJoints.length&&ue.side===pe.Left){if(we.leftJoints.length>0&&we.leftJoints[0]!==ue.id){var ve=we.leftJoints[0];E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===ve&&a.type===V.Wall){a.rightJoints=[];break}}}catch(o){l.e(o)}finally{l.f()}}))}Tl(we,xe)}else if(r===K.LowerRight&&0===xe.rightJoints.length&&ue.side===pe.Right){if(we.rightJoints.length>0&&we.rightJoints[0]!==ue.id){var be=we.rightJoints[0];E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===be&&a.type===V.Wall){a.leftJoints=[];break}}}catch(o){l.e(o)}finally{l.f()}}))}Al(we,xe)}else r===K.LowerRight&&ue.side===pe.Left&&0===xe.leftJoints.length&&xe.rightJoints[0]!==we.id?E((function(e){var t,l=null;we.rightJoints.length>0&&we.rightJoints[0]!==(null===(t=ue)||void 0===t?void 0:t.id)&&(l=we.rightJoints[0]);var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&(i.id===we.id&&(i.rightJoints=[xe.id]),i.id===xe.id&&(i.leftJoints=[we.id]),i.id===l&&(i.leftJoints=[]))}}catch(r){o.e(r)}finally{o.f()}})):r===K.LowerLeft&&ue.side===pe.Right&&0===xe.rightJoints.length&&xe.leftJoints[0]!==we.id&&E((function(e){var t,l=null;we.leftJoints.length>0&&we.leftJoints[0]!==(null===(t=ue)||void 0===t?void 0:t.id)&&(l=we.leftJoints[0]);var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&(i.id===we.id&&(i.leftJoints=[xe.id]),i.id===xe.id&&(i.rightJoints=[we.id]),i.id===l&&(i.rightJoints=[]))}}catch(r){o.e(r)}finally{o.f()}}));Pl(we.id)}}}else if(r===K.LowerRight&&we.rightJoints.length>0){var Ae=we.rightJoints[0];E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Wall&&(a.id===we.id&&(a.rightJoints=[]),a.id===Ae&&(a.leftJoints=[]))}}catch(o){l.e(o)}finally{l.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}))}else if(r===K.LowerLeft&&we.leftJoints.length>0){var Te=we.leftJoints[0];E((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Wall&&(a.id===we.id&&(a.leftJoints=[]),a.id===Te&&(a.rightJoints=[]))}}catch(o){l.e(o)}finally{l.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}))}}}if(o===V.Wall&&!$e.current){tt.current=Object(h.a)(Ew.getState().elements);var Se=ce(e,p);rt.current=Se,_e.current=Se.id,$e.current=!0,Ve(!0),Et.getState().setEnableOrbitController(!1),E((function(e){e.addedWallId=Se.id,e.objectTypeToAdd=V.None}))}if(_e.current&&$e.current){p=Tw.wallRelativePosition(s[0].point,e);var je,He=null;if(Ew.getState().enableFineGrid)p=Tw.snapToFineGrid(p);else if(null===(je=He=vl(p,1.5))||void 0===je?void 0:je.point)p=He.point;else{var ze;p=Tw.snapToNormalGrid(p);var Re=Ml(p),De=Object(u.a)(Re,2),We=De[0],Ie=De[1];null!==We&&p.setX(We),null!==Ie&&p.setY(Ie),(null===(ze=He=vl(p,1.5))||void 0===ze?void 0:ze.point)&&(p=He.point)}var Ce=Cl(p),Oe=Object(u.a)(Ce,2),Fe=Oe[0],ke=Oe[1];Ze(Object(Pe.a)((function(e){e[0].show=Fe||ke}))),U(_e.current,p.x,p.y)}}}}},onPointerOut:function(){Oe(!1),Ve(!1),rt.current&&$e.current&&(re(rt.current.id,!1),$e.current=!1,E((function(e){e.addedWallId=null,e.objectTypeToAdd=V.Wall})),rt.current=null),Be({show:!1,direction:null,position:null}),Ze([{show:!1,direction:null,position:null},{show:!1,direction:null,position:null}])},onPointerEnter:function(e){rt.current&&Tw.isPlantOrHuman(rt.current)&&(e.intersections[0].object===it.current&&Ve(!0))},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El}),Ae&&Ye?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",color:"white",map:Ye,transparent:ye,opacity:El}):Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:I===se.NoTexture?T:"white",map:yl,transparent:ye,opacity:El}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:T,transparent:ye,opacity:El})]}),rt.current&&Tw.isSolarCollector(rt.current)&&!rt.current.locked&&Object(gf.jsx)(Lt.f,{ref:nt,name:"Foundation Intersection Plane",position:il,args:[y,m],visible:!1,onPointerMove:function(t){if(nt.current&&e&&rt.current&&e){if(!Tw.isSolarCollector(rt.current))return;var l=rt.current;ul(t);var a=Nt.intersectObjects([nt.current]);if(a.length>0){var o=a[0].point,i=Ew.getState().moveHandleType,r=Ew.getState().rotateHandleType,n=Ew.getState().resizeHandleType;if(i&&e)o=Tw.relativeCoordinates(o.x,o.y,o.z,e),U(l.id,o.x,o.y);else if(r){if(r===q.Upper||r===q.Lower){var d=e.rotation[2],u=new Me.Vector2(e.cx,e.cy),f=new Me.Vector2(e.lx*l.cx,e.ly*l.cy).rotateAround(Dt,d),h=(new Me.Vector2).addVectors(f,u),p=Math.atan2(-o.x+h.x,o.y-h.y)-d+(r===q.Lower?0:Math.PI),g=p+(Math.abs(p)>Math.PI?-Math.sign(p)*bt:0);te(l.id,g),Mt.current=g}}else if(n){var w=Ew.getState().resizeAnchor,x=new Me.Vector2(o.x,o.y),v=new Me.Vector2(w.x,w.y),A=x.distanceTo(v),T=l.relativeAzimuth+b[2],P=(new Me.Vector2).subVectors(x,v),S=new Me.Vector2(c,s);if(l.type===V.SolarPanel){var j=l,H=de(j.pvModelName);switch(n){case K.Lower:case K.Upper:var z=n===K.Lower?1:-1,R=P.angle()-T+z*vt,D=A*Math.cos(R);if(j.orientation===$.portrait)D=Math.max(1,Math.ceil((D-H.length/2)/H.length))*H.length;else D=Math.max(1,Math.ceil((D-H.width/2)/H.width))*H.width;var M=w.x+z*(D*Math.sin(T))/2,W=w.y-z*(D*Math.cos(T))/2,I=new Me.Vector2(M,W),C=(new Me.Vector2).subVectors(I,S).rotateAround(Dt,-b[2]),O=C.x/y,F=C.y/m;Ll(l,O,F,l.lx,D)&&(Q(l.id,D),U(l.id,O,F));break;case K.Left:case K.Right:var k=n===K.Left?-1:1,Y=P.angle()-T+(n===K.Left?Math.PI:0),L=A*Math.cos(Y);if(j.orientation===$.portrait)L=Math.max(1,Math.ceil((L-H.width/2)/H.width))*H.width;else L=Math.max(1,Math.ceil((L-H.length/2)/H.length))*H.length;var N=w.x+k*(L*Math.cos(T))/2,G=w.y+k*(L*Math.sin(T))/2,X=new Me.Vector2(N,G),B=(new Me.Vector2).subVectors(X,S).rotateAround(Dt,-b[2]),Z=B.x/y,_=B.y/m;Ll(l,Z,_,L,l.ly)&&(J(l.id,L),U(l.id,Z,_))}}else if(l.type===V.ParabolicTrough){var ee=l;switch(n){case K.Lower:case K.Upper:var le=n===K.Lower?1:-1,ae=P.angle()-T+le*vt,oe=A*Math.cos(ae);oe=Math.max(1,Math.ceil((oe-ee.moduleLength/2)/ee.moduleLength))*ee.moduleLength;var ie=w.x+le*(oe*Math.sin(T))/2,re=w.y-le*(oe*Math.cos(T))/2,ne=new Me.Vector2(ie,re),ce=(new Me.Vector2).subVectors(ne,S).rotateAround(Dt,-b[2]),se=ce.x/y,ue=ce.y/m;Ll(l,se,ue,l.lx,oe)&&(Q(l.id,oe),U(l.id,se,ue));break;case K.Left:case K.Right:var fe=n===K.Left?-1:1,he=P.angle()-T+(n===K.Left?Math.PI:0),pe=A*Math.cos(he),ye=w.x+fe*(pe*Math.cos(T))/2,ge=w.y+fe*(pe*Math.sin(T))/2,me=new Me.Vector2(ye,ge),we=(new Me.Vector2).subVectors(me,S).rotateAround(Dt,-b[2]),xe=we.x/y,ve=we.y/m;Ll(l,xe,ve,pe,l.ly)&&(J(l.id,pe),U(l.id,xe,ve),E((function(e){e.actionState.parabolicTroughWidth=pe})))}}else if(l.type===V.FresnelReflector){var be=l;switch(n){case K.Lower:case K.Upper:var Ae=n===K.Lower?1:-1,Te=P.angle()-T+Ae*vt,Pe=A*Math.cos(Te);Pe=Math.max(1,Math.ceil((Pe-be.moduleLength/2)/be.moduleLength))*be.moduleLength;var Se=w.x+Ae*(Pe*Math.sin(T))/2,je=w.y-Ae*(Pe*Math.cos(T))/2,He=new Me.Vector2(Se,je),ze=(new Me.Vector2).subVectors(He,S).rotateAround(Dt,-b[2]),Re=ze.x/y,De=ze.y/m;Ll(l,Re,De,l.lx,Pe)&&(Q(l.id,Pe),U(l.id,Re,De));break;case K.Left:case K.Right:var We=n===K.Left?-1:1,Ie=P.angle()-T+(n===K.Left?Math.PI:0),Ce=A*Math.cos(Ie),Oe=w.x+We*(Ce*Math.cos(T))/2,Fe=w.y+We*(Ce*Math.sin(T))/2,ke=new Me.Vector2(Oe,Fe),Ye=(new Me.Vector2).subVectors(ke,S).rotateAround(Dt,-b[2]),Le=Ye.x/y,Ee=Ye.y/m;Ll(l,Le,Ee,Ce,l.ly)&&(J(l.id,Ce),U(l.id,Le,Ee),E((function(e){e.actionState.fresnelReflectorWidth=Ce})))}}else if(l.type===V.ParabolicDish){var Ue=l;switch(n){case K.Left:case K.Right:case K.Lower:case K.Upper:var Ne=Math.min(10,A);Ll(l,Ue.cx,Ue.cy,l.lx,Ne)&&(J(l.id,Ne),Q(l.id,Ne),E((function(e){e.actionState.parabolicDishRimDiameter=Ne})))}}}}}},onPointerOut:function(){if(rt.current&&Tw.isSolarCollector(rt.current)){var e=Ew.getState().getElementById(rt.current.id);Ew.getState().moveHandleType&&!kl(e,e.cx,e.cy)&&U(e.id,Pt.current.x,Pt.current.y,Pt.current.z)}}}),Ne&&Object(gf.jsxs)(gf.Fragment,{children:[Ew.getState().rotateHandleType&&rt.current&&Tw.isSolarCollector(rt.current)&&Object(gf.jsx)(ly,{element:rt.current,height:rt.current.poleHeight+Gt}),(Ew.getState().moveHandleType||Ew.getState().resizeHandleType||_e.current)&&Object(gf.jsx)(mf,{hx:Vt,hy:Jt,hz:Gt})]}),O&&Object(gf.jsx)(cy,{element:e,verticalLift:Zt}),(!O||ye)&&Object(gf.jsx)(ry,{hx:Vt,hy:Jt,hz:Gt,lineColor:ye&&k?"white":S,lineWidth:ye&&k?3*H:H}),O&&R&&Object(gf.jsx)(ry,{hx:Vt,hy:Jt,hz:Gt,lineColor:yt,lineWidth:5*H}),Xe.show&&Object(gf.jsx)("group",{position:[0,0,Gt+.01],children:Object(gf.jsx)(fg,{hx:Vt,hy:Jt,position:Xe.position,direction:Xe.direction,color:"black"})}),Object(gf.jsx)("group",{position:[0,0,Gt+.01],children:Qe.map((function(e,t){return e.show?Object(gf.jsx)(fg,{hx:Vt,hy:Jt,position:e.position,direction:e.direction,color:"yellow"},t):null}))}),O&&!R&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.a,{ref:ct,position:[Xt.x,Xt.y,0],args:[_t,_t,1.2*x],name:K.LowerLeft,onPointerDown:function(e){ne(n,e,X.Resize),ct.current&&E((function(e){var t=ct.current.localToWorld(new Me.Vector3(y,m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){ml(e,K.LowerLeft)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.LowerLeft||Ew.getState().resizeHandleType===K.LowerLeft?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:st,position:[Bt.x,Bt.y,0],args:[_t,_t,1.2*x],name:K.UpperLeft,onPointerDown:function(e){ne(n,e,X.Resize),st.current&&E((function(e){var t=st.current.localToWorld(new Me.Vector3(y,-m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){ml(e,K.UpperLeft)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.UpperLeft||Ew.getState().resizeHandleType===K.UpperLeft?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:dt,position:[Kt.x,Kt.y,0],args:[_t,_t,1.2*x],name:K.LowerRight,onPointerDown:function(e){ne(n,e,X.Resize),dt.current&&E((function(e){var t=dt.current.localToWorld(new Me.Vector3(-y,m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){ml(e,K.LowerRight)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.LowerRight||Ew.getState().resizeHandleType===K.LowerRight?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:gt,position:[qt.x,qt.y,0],args:[_t,_t,1.2*x],name:K.UpperRight,onPointerDown:function(e){ne(n,e,X.Resize),gt.current&&E((function(e){var t=gt.current.localToWorld(new Me.Vector3(-y,-m,0));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){ml(e,K.UpperRight)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===K.UpperRight||Ew.getState().resizeHandleType===K.UpperRight?pt:ht})}),!ge&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:mt,args:[Zt,6,6,0,Math.PI],position:[0,-Jt-Zt,0],name:B.Lower,onPointerDown:function(e){E((function(e){var t;e.moveHandleType=B.Lower,e.selectedElement=null!==(t=e.elements.find((function(e){return e.id===n})))&&void 0!==t?t:null;var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;e.selectedElementIdSet.has(o.id)&&!Tw.isElementAllowedMultipleMoveOnGround(o)&&e.selectedElementIdSet.delete(o.id)}}catch(i){a.e(i)}finally{a.f()}})),Et.getState().setEnableOrbitController(!1)},onPointerOver:function(e){ml(e,B.Lower)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Lower||Ew.getState().moveHandleType===B.Lower?pt:ft})}),Object(gf.jsx)(Lt.h,{ref:wt,args:[Zt,6,6,0,Math.PI],position:[0,Jt+Zt,0],name:B.Upper,onPointerDown:function(e){E((function(e){var t;e.moveHandleType=B.Upper,e.selectedElement=null!==(t=e.elements.find((function(e){return e.id===n})))&&void 0!==t?t:null;var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;e.selectedElementIdSet.has(o.id)&&!Tw.isElementAllowedMultipleMoveOnGround(o)&&e.selectedElementIdSet.delete(o.id)}}catch(i){a.e(i)}finally{a.f()}})),Et.getState().setEnableOrbitController(!1)},onPointerOver:function(e){ml(e,B.Upper)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Upper||Ew.getState().moveHandleType===B.Upper?pt:ft})}),Object(gf.jsx)(Lt.h,{ref:xt,args:[Zt,6,6,0,Math.PI],position:[-Vt-Zt,0,0],name:B.Left,onPointerDown:function(e){E((function(e){var t;e.moveHandleType=B.Left,e.selectedElement=null!==(t=e.elements.find((function(e){return e.id===n})))&&void 0!==t?t:null;var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;e.selectedElementIdSet.has(o.id)&&!Tw.isElementAllowedMultipleMoveOnGround(o)&&e.selectedElementIdSet.delete(o.id)}}catch(i){a.e(i)}finally{a.f()}})),Et.getState().setEnableOrbitController(!1)},onPointerOver:function(e){ml(e,B.Left)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Left||Ew.getState().moveHandleType===B.Left?pt:ut})}),Object(gf.jsx)(Lt.h,{ref:Tt,args:[Zt,6,6,0,Math.PI],position:[Vt+Zt,0,0],name:B.Right,onPointerDown:function(e){E((function(e){var t;e.moveHandleType=B.Right,e.selectedElement=null!==(t=e.elements.find((function(e){return e.id===n})))&&void 0!==t?t:null;var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;e.selectedElementIdSet.has(o.id)&&!Tw.isElementAllowedMultipleMoveOnGround(o)&&e.selectedElementIdSet.delete(o.id)}}catch(i){a.e(i)}finally{a.f()}})),Et.getState().setEnableOrbitController(!1)},onPointerOver:function(e){ml(e,B.Right)},onPointerOut:wl,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:be===B.Right||Ew.getState().moveHandleType===B.Right?pt:ut})}),Object(gf.jsx)(oy,{id:n,position:[0,-el,0],color:be===q.Lower||Ew.getState().rotateHandleType===q.Lower?pt:ht,ratio:$t,handleType:q.Lower,hoverHandle:ml,noHoverHandle:wl}),Object(gf.jsx)(oy,{id:n,position:[0,el,0],color:be===q.Upper||Ew.getState().rotateHandleType===q.Upper?pt:ht,ratio:$t,handleType:q.Upper,hoverHandle:ml,noHoverHandle:wl})]})]}),!ge&&Object(gf.jsxs)(gf.Fragment,{children:[(Ce||M)&&!O&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.FoundationElement",Yt))+(R?" ("+me.t("shared.ElementLocked",Yt)+")":""),color:null!==(t=null===e||void 0===e?void 0:e.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===e||void 0===e?void 0:e.labelFontSize)&&void 0!==l?l:20,fontFace:"Roboto",textHeight:null!==(a=null===e||void 0===e?void 0:e.labelSize)&&void 0!==a?a:.2,position:[0,0,null!==(i=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==i?i:Gt+.2]}),!R&&be===K.LowerLeft&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-LL",text:"LL",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[-Vt,-Jt,Gt+.2]}),!R&&be===K.UpperLeft&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-UL",text:"UL",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[-Vt,Jt,Gt+.2]}),!R&&be===K.LowerRight&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-LR",text:"LR",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[Vt,-Jt,Gt+.2]}),!R&&be===K.UpperRight&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label-UR",text:"UR",fontSize:20,fontFace:"Times Roman",textHeight:.2,position:[Vt,Jt,Gt+.2]})]}),C===G.FocusPipe&&Object(gf.jsx)(ky,{foundation:e}),C===G.FocusTower&&Object(gf.jsx)(Oy,{foundation:e}),C===G.UpdraftTower&&Object(gf.jsx)(My,{foundation:e}),Object(gf.jsx)(sg,Object(d.a)({},e))]})})},fg=function(e){var t=e.hx,l=e.hy,a=e.position,o=e.direction,i=e.color;if(null===a)return null;var r=Object(u.a)(a,2),n=r[0],c=r[1],s=[];if("x"===o)s.push([-t,c,0]),s.push([t,c,0]);else{if("y"!==o)return"xy"===o?Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:[[-t,c,0],[t,c,0]],color:i}),Object(gf.jsx)(Jl.a,{points:[[n,-l,0],[n,l,0]],color:i})]}):null;s.push([n,-l,0]),s.push([n,l,0])}return Object(gf.jsx)(Jl.a,{points:s,color:i})},hg=n.a.memo(ug),pg="Handles Intersection Plane",yg=function(e){if(e.intersections.length>0){var t,l=Object(f.a)(e.intersections);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.eventObject.name===pg)return a.point.z<0?null:a.point}}catch(o){l.e(o)}finally{l.f()}}return null},gg=function(e,t){return(new Me.Vector3).subVectors(e,new Me.Vector3(t.cx,t.cy,t.lz)).applyEuler(new Me.Euler(0,0,-t.rotation[2]))},mg=function(e,t,l,a,o){for(var i=t/2,r=l/2,n=Object(u.a)(a,3),c=n[0],s=n[1],d=n[2],f=(new Me.Euler).fromArray([c-vt,s,d,"ZXY"]),h=o.map((function(e){return{x:e.x,y:e.y}})),p=-1;p<=1;p+=2)for(var y=-1;y<=1;y+=2){var g=new Me.Vector3(i*p,0,r*y).applyEuler(f),m=(new Me.Vector3).addVectors(e,g);if(!Tw.isPointInside(m.x,m.y,h))return!1}return!0},wg=function(e){switch(e){case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:return!0}return!1},xg=function(e,t,l){Ew.getState().set((function(a){var o=a.elements.find((function(t){return t.id===e&&t.type===V.Window}));if(o){var i=Object(u.a)(t,3);o.cx=i[0],o.cy=i[1],o.cz=i[2],o.rotation=Object(h.a)(l)}}))},vg=function(e,t,l,a){Ew.getState().set((function(o){var i=o.elements.find((function(t){return t.id===e&&t.type===V.Window}));if(i){var r=Object(u.a)(t,3);i.cx=r[0],i.cy=r[1],i.cz=r[2];var n=Object(u.a)(l,3);i.lx=n[0],i.ly=n[1],i.lz=n[2],void 0!==a&&null!==a&&(i.archHeight=a)}}))},bg=function(e,t){Ew.getState().set((function(l){var a=l.elements.find((function(t){return t.id===e&&t.type===V.Window}));a&&(a.polygonTop=Object(h.a)(t))}))},Ag=function(e,t){var l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.01;if(e.type!==V.SolarPanel&&e.type!==V.Window)return null;var a=(new Me.Euler).fromArray([].concat(Object(h.a)(e.rotation),["ZXY"])),o=new Me.Vector3,i=e.lx/2+l,r=l;e.type===V.SolarPanel?(r+=e.ly/2,o.set(e.cx*t.lx,e.cy*t.ly,0)):(r+=e.lz/2,o.set(e.cx,e.cy,0));for(var n=[],c=-1;c<=1;c+=2)for(var s=-1;s<=1;s+=2){var d=new Me.Vector3(c*i,c*s*r).applyEuler(a).add(o);n.push(d)}if(e.type===V.Window&&e.windowType===Yt.Polygonal){var f,p=null!==(f=e.polygonTop)&&void 0!==f?f:Fg,y=Object(u.a)(p,2),g=y[0],m=y[1],w=new Me.Vector3(g*i,m+r).applyEuler(a).add(o);n.push(w)}return n},Tg=function(e){var t;if(e.windowType===Yt.Polygonal)return null!==(t=e.polygonTop)&&void 0!==t?t:Fg},Pg=function(e){var t=e.z,l=Object(r.useRef)(),a=Object(r.useState)("white"),o=Object(u.a)(a,2),i=o[0],n=o[1];return Object(gf.jsx)(Lt.a,{ref:l,name:K.Arch,args:[.2,.2,.2],position:[0,0,t],onPointerEnter:function(){n("red")},onPointerLeave:function(){n("white")},children:Object(gf.jsx)("meshBasicMaterial",{color:i})})},Sg=function(e){var t=e.id,l=e.parentId,a=e.foundationId,o=e.lx,i=e.lz,n=e.polygonTop,c=e.rotation,s=e.windowType,d=e.parentType,p=Ew((function(e){return e.addedWindowId})),y=Ew(Sr),g=p===t,m=d===V.Roof,w=Object(r.useRef)(null),x=Object(r.useRef)(null),v=Object(r.useRef)(null),b=Object(r.useRef)(null),A=Object(r.useRef)(null),T=Object(r.useRef)(null),P=Object(r.useRef)(null),S=Object(r.useRef)(null),j=Object(r.useRef)([]),H=Object(r.useRef)(null),z=Object(r.useRef)(null),R=Object(r.useRef)(null),D=Object(r.useRef)(null),M=Object(r.useRef)(null),W=Object(r.useState)(!1),I=Object(u.a)(W,2),C=I[0],O=I[1],F=o/2,k=i/2,Y=Object(u.a)(n,2),L=Y[0],E=Y[1],U=Object(r.useMemo)((function(){return o*L}),[o,L]),N=Ew(si),J=function(e,t,l){if(!a)return null;var o=Ew.getState().elements.find((function(e){return e.id===a&&e.type===V.Foundation}));if(!o)return null;var i=e.object.localToWorld(new Me.Vector3),r=Object(u.a)(c,3),n=r[0],s=r[1],d=r[2],f=(new Me.Euler).fromArray([n-vt,s,d+o.rotation[2],"ZXY"]),h=new Me.Vector3(t,0,l).applyEuler(f);return(new Me.Vector3).addVectors(i,h)},G=function(e){var o,i,r,n,c,s=Object(f.a)(Ew.getState().elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;d.id===t&&d.type===V.Window?i=d:d.id===a&&d.type===V.Foundation?r=d:d.id===l&&d.type===V.Roof&&(n=d)}}catch(E){s.e(E)}finally{s.f()}var u=Et.getState().contentRef;if(i&&r&&n&&u&&u.current){var p=r.id,y=u.current.children.find((function(e){return e.name==="".concat(dg," ").concat(p)}));if(y){var g=y.children.find((function(e){return e.name===rg}));if(g){var m=g.children.find((function(e){return e.name.includes("Roof")&&e.name.includes(l)}));if(m){var P=m.children[0];if(P){var W,I=Object(f.a)(Ew.getState().elements);try{for(I.s();!(W=I.n()).done;){var C=W.value;if(C.parentId===l&&C.id!==t){var O=Ag(C,r);O&&j.current.push(O)}}}catch(E){I.e(E)}finally{I.f()}var F=P.userData,k=F.centroid,Y=F.roofSegments,L=new Me.Vector3(i.cx,i.cy,i.cz+r.lz).clone().sub(k);w.current=e,x.current=r,v.current=n,T.current=Vm.getSegmentIdx(Y,L),A.current=k,b.current=Y,S.current=function(e,t,l){return l===It.Gambrel?Gp(e).map((function(e){return e.add(t)})):e.map((function(e){return e.points[0].clone().add(t)}))}(b.current,A.current,n.roofType),H.current=[i.cx,i.cy,i.cz],R.current=[i.lx,i.ly,i.lz],z.current=Object(h.a)(i.rotation),D.current=i.archHeight,M.current=null!==(o=i.polygonTop)&&void 0!==o?o:null}}}}}},X=function(){if(R.current&&H.current){var e=Ew.getState().elements.find((function(e){return e.id===t&&e.type===V.Window}));if(e){var l={name:"Resize skylight",timestamp:Date.now(),id:e.id,oldPosition:Object(h.a)(H.current),newPosition:[e.cx,e.cy,e.cz],oldDimension:Object(h.a)(R.current),newDimension:[e.lx,e.ly,e.lz],oldArchHeight:D.current,newArchHeight:e.archHeight,undo:function(){vg(this.id,this.oldPosition,this.oldDimension,this.oldArchHeight)},redo:function(){vg(this.id,this.newPosition,this.newDimension,this.newArchHeight)}};y(l)}}},q=function(e){return e.roofType!==It.Gable&&Math.abs(e.rise)<.001},Q=function(e){if(v.current&&q(v.current))return S.current;if(void 0!==e&&null!==e){var t=Pf.getState().getRoofSegmentVertices(l);if(!t)return;return t[-1===e?t.length-1:e]}},Z=function(e,t,l,a,o){for(var i=t/2,r=l/2,n=(new Me.Euler).fromArray([].concat(Object(h.a)(a),["ZXY"])),c=[],s=-1;s<=1;s+=2)for(var d=-1;d<=1;d+=2){var p=new Me.Vector3(s*i,s*d*r).applyEuler(n).add(e);c.push(p)}if(o){var y=Object(u.a)(o,2),g=y[0],m=y[1],w=new Me.Vector3(g*i*2,m+r).applyEuler(n).add(e);c.push(w)}var x,v=Object(f.a)(j.current);try{for(v.s();!(x=v.n()).done;){var b,A=x.value,T=Object(f.a)(c);try{for(T.s();!(b=T.n()).done;){var P=b.value;if(Tw.isPointInside(P.x,P.y,A))return!1}}catch(R){T.e(R)}finally{T.f()}var S,H=Object(f.a)(A);try{for(H.s();!(S=H.n()).done;){var z=S.value;if(Tw.isPointInside(z.x,z.y,c))return!1}}catch(R){H.e(R)}finally{H.f()}}}catch(R){v.e(R)}finally{v.f()}return!0},_=function(e,t,l,a,o,i){if(i){var r=Object(u.a)(i,2);return function(e,t,l,a,o,i,r){var n=l/2,c=Object(u.a)(i,3),s=c[0],d=c[1],f=c[2],h=(new Me.Euler).fromArray([s-vt,d,f,"ZXY"]),p=r.map((function(e){return{x:e.x,y:e.y}})),y=(new Me.Vector3).addVectors(e,new Me.Vector3(a*t,0,n+o).applyEuler(h));return!!Tw.isPointInside(y.x,y.y,p)&&!!mg(e,t,l,i,r)}(t,l,a,r[0],r[1],o,e)}return mg(t,l,a,o,e)};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Handle Wrapper",onPointerDown:function(e){if(m&&!g){var t=e.object.name;switch(t){case B.Mid:break;case K.LowerLeft:P.current=J(e,o,i);break;case K.LowerRight:P.current=J(e,-o,i);break;case K.UpperLeft:P.current=J(e,o,-i);break;case K.UpperRight:P.current=J(e,-o,-i);break;case K.Arch:P.current=J(e,0,-i);break;case K.Upper:break;default:return}G(t),O(!0),Et.getState().setEnableOrbitController(!1)}},children:[!g&&Object(gf.jsxs)(gf.Fragment,{children:[s===Yt.Polygonal&&Object(gf.jsx)(xf,{x:U,z:k+E,handleType:K.Upper,scale:[.5,1,1.5]}),Object(gf.jsx)(xf,{x:-F,z:k,handleType:K.UpperLeft}),Object(gf.jsx)(xf,{x:F,z:k,handleType:K.UpperRight}),Object(gf.jsx)(xf,{x:-F,z:-k,handleType:K.LowerLeft}),Object(gf.jsx)(xf,{x:F,z:-k,handleType:K.LowerRight}),s===Yt.Arched&&Object(gf.jsx)(Pg,{z:k})]}),Object(gf.jsx)(bf,{handleType:B.Mid})]}),m&&C&&Object(gf.jsx)(Lt.f,{name:pg,args:[1e3,1e3],rotation:[vt,0,0],onPointerMove:function(e){if(null!==w.current&&x.current&&v.current&&b.current&&A.current&&S.current){var a=x.current;if(w.current===B.Mid){var o=v.current,i=function(e,t,l){if(e.intersections.length>0){var a,o=Object(f.a)(e.intersections);try{for(o.s();!(a=o.n()).done;){var i,r=a.value,n=r.eventObject.name;if(n.includes("Window")&&n.includes(t)&&r.object.name!==pg)return null;if(n.includes("Roof")&&n.includes(l))return{pointer:r.point.clone(),segmentIdx:Number.parseInt(null!==(i=r.object.name.split(" ").pop())&&void 0!==i?i:"-1")}}}catch(c){o.e(c)}finally{o.f()}}return null}(e,t,l),r=new Me.Vector3;if(q(o)){var n=yg(e);if(!n)return;r.copy(n);var s=gg(r,a);N((function(e){if(S.current){var l=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(l){var a=l.lx,o=l.lz,i=l.rotation,r=S.current,n=Tg(l),c=_(r,s,a,o,i,n),d=Z(s,a,o,i,n);c&&d&&(l.cx=s.x,l.cy=s.y,l.cz=s.z)}}}))}else{if(i&&i.segmentIdx!==T.current){var d=i.pointer;r.copy(d)}else{var u=yg(e);if(!u)return;r.copy(u)}var p=gg(r,a),y=p.clone().sub(A.current),g=Vm.computeState(b.current,y),m=g.rotation,j=g.segmentVertices,H=g.segmentIdx;j?p.setZ(Vm.getRooftopElementZ(j,y,A.current.z+o.thickness)):p.setZ(A.current.z+o.thickness),N((function(e){var a=Pf.getState().getRoofSegmentVertices(l);if(a){var o=a[-1===H?a.length-1:H];if(o){var r=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(r){var n=r.lx,c=r.lz,s=Tg(r),d=_(o,p,n,c,m,s),u=Z(p,n,c,m,s);d&&u&&(r.cx=p.x,r.cy=p.y,r.cz=p.z,r.rotation=Object(h.a)(m),i&&i.segmentIdx!==T.current&&(T.current=i.segmentIdx))}}}}))}}else if(wg(w.current)){var z=Q(T.current),R=yg(e),D=P.current;if(!R||!D||!z)return;var M=gg(R,a),W=function(e,t,l){var a=(new Me.Vector3).subVectors(t,e).applyEuler(new Me.Euler(0,0,-l));return{newLx:Math.abs(a.x),newLz:Math.hypot(a.y,a.z),newCenter:(new Me.Vector3).addVectors(e,t).divideScalar(2)}}(gg(D,a),M,c[2]),I=W.newLx,C=W.newLz,O=W.newCenter;Ew.getState().set((function(e){var l=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(l){var a=Tg(l),o=_(z,O,I,C,c,a),i=Z(O,I,C,c,a);o&&i&&(l.cx=O.x,l.cy=O.y,l.cz=O.z,l.lx=I,l.lz=Math.max(.001,C))}}))}else if(w.current===K.Upper){var F=Q(T.current),k=yg(e);if(!k||!F)return;var Y=gg(k,a);N((function(e){var l=e.elements.find((function(e){return e.id===t}));if(l){var a=l.lx/2,o=l.lz/2,i=new Me.Vector3(l.cx,l.cy,l.cz),r=(new Me.Euler).fromArray([].concat(Object(h.a)(l.rotation),["ZXY"])),n=new Me.Vector3(-a,-o,0).applyEuler(r).add(i),s=new Me.Vector3(a,-o,0).applyEuler(r).add(i),d=(new Me.Vector3).subVectors(Y,n),u=(new Me.Vector3).subVectors(s,n).normalize(),f=d.clone().projectOnVector(u).applyEuler(new Me.Euler(0,0,-l.rotation[2])),p=Tw.clamp((f.x-a)/l.lx,-.5,.5),y=Vm.getDistance(n,s,Y),g=Math.hypot(y,Y.z-n.z),m=[p,Math.max(0,g-l.lz)],w=new Me.Vector3(l.cx,l.cy,l.cz),x=l.lx,v=l.lz,b=_(F,w,x,v,c,m),A=Z(w,x,v,c,m);b&&A&&(l.polygonTop=[].concat(m))}}))}else if(w.current===K.Arch){var L=yg(e),E=P.current,U=Q(T.current);if(!L||!E||!U)return;var J=gg(L,a),G=gg(E,a);N((function(e){var l=e.elements.find((function(e){return e.id===t&&e.type===V.Window}));if(l){var a=l.lx/2,o=l.lz/2,i=new Me.Vector3(l.cx,l.cy,l.cz),r=(new Me.Euler).fromArray([].concat(Object(h.a)(l.rotation),["ZXY"])),n=new Me.Vector3(-a,-o,0).applyEuler(r).add(i),s=new Me.Vector3(a,-o,0).applyEuler(r).add(i),d=Vm.getDistance(n,s,J),u=Math.hypot(d,J.z-n.z),f=Math.min(l.archHeight,l.lz,l.lx/2),p=l.lz-f;if(u>p&&u0&&Object(gf.jsx)("group",{position:[0,t,0],children:w(c/20,g)}),f&&d&&w(c/5,m)]})})),Mg=function(e){var t=e.id,l=e.dimension,a=e.position,i=e.mullionData,c=e.frameData,s=e.wireframeData,d=e.leftShutter,f=e.rightShutter,h=e.shutterColor,p=e.shutterWidth,y=e.glassMaterial,g=e.showHeatFluxes,m=e.area,w=e.empty,x=e.interior,v=e.foundation,b=Ew.getState().world,A=Ew(o.heatFluxScaleFactor),T=Ew(o.heatFluxColor),P=Ew(o.heatFluxWidth),S=Ew(o.shadowEnabled),j=Pf(Ai),H=Object(r.useRef)(0),z=Object(r.useRef)(),R=Object(u.a)(l,3),D=R[0],M=R[1],W=R[2],I=Object(u.a)(a,3),C=(I[0],I[1]),O=(I[2],Object(r.useMemo)((function(){var e;if(g&&!x&&(!v||!v.notBuilding)){var l=j.get(t);if(l){var a=l.reduce((function(e,t){return e+t}),0);if(0!==m){var o=4*(null!==(e=b.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),i=Math.max(2,Math.round(D/o)),r=Math.max(2,Math.round(W/o)),n=D/i,c=W/r,s=a/m*(null!==A&&void 0!==A?A:_e);H.current=s<0?1:0,z.current=Tw.getEuler(Rt,Ht,"YXZ",Math.sign(s)*vt);var d=[];if(s<0)for(var u=0;u0&&void 0!==arguments[0]&&arguments[0];se((function(o){if(o.groupActionMode)o.multiSelectionsMode||o.selectedElementIdSet.clear(),e.foundationId&&(o.selectedElementIdSet.has(l)?o.selectedElementIdSet.delete(l):o.selectedElementIdSet.add(e.foundationId));else{var i,r=Object(f.a)(o.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.id===t)if(n.selected=!0,o.selectedElement=n,a)if(o.selectedElementIdSet.has(t)){var c,s=Object(f.a)(o.elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;o.selectedElementIdSet.has(d.id)&&d.type!==o.selectedElement.type&&o.selectedElementIdSet.delete(d.id)}}catch(y){s.e(y)}finally{s.f()}}else if(o.multiSelectionsMode){o.selectedElementIdSet.add(t);var u,h=Object(f.a)(o.elements);try{for(h.s();!(u=h.n()).done;){var p=u.value;o.selectedElementIdSet.has(p.id)&&p.type!==o.selectedElement.type&&o.selectedElementIdSet.delete(p.id)}}catch(y){h.e(y)}finally{h.f()}}else o.selectedElementIdSet.clear(),o.selectedElementIdSet.add(t);else o.multiSelectionsMode?o.selectedElementIdSet.has(t)?o.selectedElementIdSet.delete(t):o.selectedElementIdSet.add(t):(o.selectedElementIdSet.clear(),o.selectedElementIdSet.add(t));else n.selected=!1}}catch(y){r.e(y)}finally{r.f()}}}))},ye=function(e){return e.intersections.length>0&&e.intersections[0].eventObject.name===ce&&!Ew.getState().moveHandleType&&!Ew.getState().resizeHandleType&&!Ew.getState().isAddingElement()&&Ew.getState().objectTypeToAdd===V.None},ge=function(e,t){Et.getState().setEnableOrbitController(!1),ue("showWallIntersectionPlaneId",l),se((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(new Me.Vector3(i,0,c).add(t))}))},me=Object(r.useMemo)((function(){if(ie===V.Roof){var e=Object(u.a)(p,3),t=e[0],l=e[1],a=e[2];return(new Me.Euler).fromArray([t-vt,l,a,"ZXY"])}return new Me.Euler}),[ie,p]),we=Object(r.useMemo)((function(){return Object(gf.jsx)("meshPhongMaterial",{specular:new Me.Color("white"),shininess:null!==fe&&void 0!==fe?fe:lt,color:M,side:Me.DoubleSide,opacity:I,transparent:!0})}),[fe,M,I]),xe=Object(r.useMemo)((function(){return void 0!==ae?[s,d,h,ae]:[s,d,h]}),[s,d,h,ae]),ve=Object(r.useMemo)((function(){return ie===V.Roof?[i,.05,c]:[i,n,c]}),[i,n,c,ie]),be=Object(r.useMemo)((function(){return{horizontalMullion:b,verticalMullion:T,width:S,horizontalMullionSpacing:H,verticalMullionSpacing:R,color:J}}),[b,T,S,H,R,J]),Ae=Object(r.useMemo)((function(){return{showFrame:X,width:_,color:Q,sillWidth:ee}}),[X,_,Q,ee]),Te=Object(r.useMemo)((function(){return{lineColor:x,lineWidth:m,selected:he,locked:y,opacity:I}}),[x,m,he,y,I]),Pe=Tf(Vs),Se=ie===V.Roof?n:0;return Object(gf.jsxs)("group",{name:ce,position:[i,Se,c],rotation:me,onPointerDown:function(e){if(2!==e.button&&!Ew.getState().addedWallId&&(ye(e)&&pe(),function(e){if(e.eventObject.name===ce&&e.intersections.length>0)switch(e.object.name){case B.Mid:case K.UpperLeft:case K.UpperRight:case K.LowerLeft:case K.LowerRight:case K.Arch:case K.Upper:return!0}return!1}(e))){var t=e.intersections[0].eventObject.name;switch(t){case B.Mid:Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=l,e.oldParentId=l,e.oldFoundationId=a})),se((function(e){e.moveHandleType=t,e.selectedElement=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))}));break;case K.UpperLeft:ge(t,new Me.Vector3(s/2,0,-h/2));break;case K.UpperRight:ge(t,new Me.Vector3(-s/2,0,-h/2));break;case K.LowerLeft:ge(t,new Me.Vector3(s/2,0,h/2));break;case K.LowerRight:ge(t,new Me.Vector3(-s/2,0,h/2));break;case K.Arch:ge(t,new Me.Vector3(0,0,0));break;case K.Upper:ge(t,new Me.Vector3(0,0,h/2))}}},onContextMenu:function(e){Ew.getState().addedWallId||ye(e)&&(pe(!0),se((function(e){e.contextMenuObjectType=V.Window})))},onPointerMove:function(){},children:[function(){switch(le){case Yt.Default:return Object(gf.jsx)(Wg,{id:e.id,dimension:xe,position:ve,mullionData:be,frameData:Ae,wireframeData:Te,leftShutter:O,rightShutter:k,shutterColor:L,shutterWidth:U,glassMaterial:we,showHeatFluxes:Pe,area:Tw.getWindowArea(e),empty:!!e.empty,interior:!!e.interior,foundation:de(e)});case Yt.Arched:return Object(gf.jsx)(Lf,{id:e.id,dimension:xe,position:ve,mullionData:be,frameData:Ae,wireframeData:Te,leftShutter:O,rightShutter:k,shutterColor:L,shutterWidth:U,glassMaterial:we,showHeatFluxes:Pe,area:Tw.getWindowArea(e),empty:!!e.empty,interior:!!e.interior,foundation:de(e)});case Yt.Polygonal:return Object(gf.jsx)(Gf,{id:e.id,dimension:xe,polygonTop:ne,position:ve,glassMaterial:we,empty:!!e.empty,interior:!!e.interior,wireframeData:Te,frameData:Ae,leftShutter:O,rightShutter:k,shutterColor:L,shutterWidth:U,showHeatFluxes:Pe,area:Tw.getWindowArea(e),foundation:de(e)})}}(),he&&Object(gf.jsx)(Ig,{element:e}),he&&!y&&Object(gf.jsx)(jg,{id:t,parentId:l,foundationId:a,lx:s,lz:h,polygonTop:ne,rotation:p,windowType:le,parentType:ie})]},t)},Yg=n.a.memo(kg),Lg=n.a.memo((function(e){var t=e.lineColor,l=void 0===t?"black":t,a=e.lineWidth,o=void 0===a?.2:a,i=e.hx,r=e.hz,c=e.fill,s=e.isTopPartial,d=e.leftUnfilledHeight,u=e.rightUnfilledHeight,f=e.showParapet,h=void 0!==f&&f,p=e.leftHeight,y=void 0===p?2*r:p,g=e.rightHeight,m=void 0===g?2*r:g,w=e.center,x=e.centerLeft,v=e.centerRight,b=Ew((function(e){return e.viewState.orthographic})),A=[-i,.001-r+(c===Ue.Partial?d:0),.001],T=[i,.001-r+(c===Ue.Partial?u:0),.001],P=[-i,y-r-.001,.001],S=[i,m-r-.001,.001],j=2*i,H=[];if(b)o=2,H.push(P,S);else if(h)H.push(P,A,T,S);else if(s)H.push(A,P,S,T,A);else{if(H.push(A,P),x){var z=[x[0]*j,x[1]-r,.001];H.push(z)}if(w){var R=[w[0]*j,w[1]-r,.001];H.push(R)}if(v){var D=[v[0]*j,v[1]-r,.001];H.push(D)}H.push(S,T)}return Object(gf.jsx)(n.a.Fragment,{children:Object(gf.jsx)(Jl.a,{rotation:[vt,0,0],points:H,color:l,lineWidth:o})})}));!function(e){e.Default="Default",e.Arched="Arched"}(hy||(hy={}));var Eg=n.a.memo((function(e){var t=e.dimension,l=e.lineColor,a=e.lineWidth,o=t.map((function(e){return e/2})),i=Object(u.a)(o,3),r=i[0],n=(i[1],i[2]),c=[-r,0,n+.05],s=[r,0,n+.05],d=[-r,0,-n],f=[r,0,-n];return Object(gf.jsx)(Jl.a,{points:[d,c,s,f],lineWidth:a,color:l})})),Ug=n.a.memo((function(e){var t=e.dimension,l=e.color,a=Object(u.a)(t,3),i=a[0],n=(a[1],a[2]),c=Ew(o.shadowEnabled),s=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:l})}),[l]),d=.1;return Object(gf.jsxs)("group",{name:"Door frame group",children:[Object(gf.jsx)(Lt.a,{position:[0,0,n/2],args:[i,d,d],castShadow:c,receiveShadow:c,children:s}),Object(gf.jsx)(Lt.a,{position:[-i/2+.05,0,0],args:[d,d,n],castShadow:c,receiveShadow:c,children:s}),Object(gf.jsx)(Lt.a,{position:[i/2-.05,0,0],args:[d,d,n],castShadow:c,receiveShadow:c,children:s})]})})),Ng=n.a.memo((function(e){var t=e.id,l=e.dimension,a=(e.color,e.frameColor),i=e.selected,c=e.locked,s=e.material,d=e.filled,f=e.area,h=e.showHeatFluxes,p=e.foundation,y=Ew.getState().world,g=Ew(o.heatFluxScaleFactor),m=Ew(o.heatFluxColor),w=Ew(o.heatFluxWidth),x=Ew(o.shadowEnabled),v=Pf(Ai),b=Object(r.useRef)(0),A=Object(r.useRef)(),T=Object(u.a)(l,3),P=T[0],S=(T[1],T[2]),j=Object(r.useMemo)((function(){var e;if(h&&(!p||!p.notBuilding)){var l=v.get(t);if(l){var a=l.reduce((function(e,t){return e+t}),0);if(0!==f){var o=4*(null!==(e=y.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),i=Math.max(2,Math.round(P/o)),r=Math.max(2,Math.round(S/o)),n=P/i,c=S/r,s=a/f*(null!==g&&void 0!==g?g:_e);b.current=s<0?1:0,A.current=Tw.getEuler(Rt,Ht,"YXZ",Math.sign(s)*vt);var d=[];if(s<0)for(var u=0;u0){var l=.5*T,a=.5*S,o=Math.min(j,S,l),i=.5*(o+l*l/o);if(Math.abs(e)-a)return!0;var r=t-(S-i-a);return e*e+r*r.1){var o=a/2+Math.pow(T,2)/(8*a),i=l-o,r=Math.acos(Math.min(t/o,1)),n=Math.PI-r;e.absarc(0,i,o,r,n,!1)}else e.lineTo(-t,l);if(e.lineTo(-t,-l),!s){var c=.4*T,d=.4*S,u=Math.min(.8*j,.8*S,.8*t);if(e.lineTo(-c,-l),u>.1){e.lineTo(-c,l-u);var f=u/2+Math.pow(.8*T,2)/(8*u),h=d-f,p=Math.acos(Math.min(c/f,1)),y=Math.PI-p;e.absarc(0,h,f,y,p,!0)}else e.lineTo(-c,d),e.lineTo(c,d);e.lineTo(c,-l)}return e.closePath(),e}),[T,S,j,s]),D=Object(r.useMemo)((function(){return{lineColor:"black",lineWidth:i&&a?.2:.1,opacity:1,selected:a,locked:i}}),[a,i]);return Object(gf.jsxs)("group",{name:"Arched door group",children:[Object(gf.jsx)("mesh",{name:"Arched Door Mesh",rotation:[vt,0,0],material:c,castShadow:y&&s,receiveShadow:y&&s,children:Object(gf.jsx)("shapeBufferGeometry",{args:[R]})}),s&&Object(gf.jsxs)("mesh",{name:"Arched Door Simulation Mesh",rotation:[vt,0,0],material:c,uuid:t,userData:{simulation:!0},castShadow:!1,receiveShadow:!1,visible:!1,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[R]}),Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})]}),s&&Object(gf.jsx)("mesh",{name:"Door plane mesh inside",position:[0,.1,0],rotation:[-vt,0,Math.PI],material:c,castShadow:y&&s,receiveShadow:y&&s,children:Object(gf.jsx)("shapeBufferGeometry",{args:[R]})}),Object(gf.jsx)(Ff,{cy:0,dimension:l,wireframeData:D}),Object(gf.jsx)(Ff,{cy:P,dimension:l,wireframeData:D}),z&&z.map((function(e,t){var l;return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{points:e,name:"Heat Flux "+t,lineWidth:null!==w&&void 0!==w?w:et,color:null!==m&&void 0!==m?m:$e}),";",Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},position:e[v.current].clone().add(new Me.Vector3(0,0===v.current?-.1:.1,0)),args:[.06,.2,4,1],name:"Normal Vector Arrow Head",rotation:null!==(l=b.current)&&void 0!==l?l:[0,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:null!==m&&void 0!==m?m:$e})})]},t)}))]})})),Jg="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAEACAYAAAB7+X6nAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEARs4dI3tSgAABDpJREFUeJzt2iFLq1EcgPH/keGMhoEiIhg1CAaDyWRX/AI2bXYx+gX0ExhFBLG6sCBoNGoQVkQMbxCjYeeGq4N51+57Jux5fvEwDgf27L8X3pMiIoewGhERm5ubsbS09Ntn0Qg9Pj5Gu93+G8Di4mKcnJyk3z6URmdvby9HfE2Ab2dnZ/nl5SU+Pz9/51QqanJyMubn52N3d7f/Yx8I4P39PU5PT6OqqpiYmBj9CVVMr9eLVqsVh4eHA+uNYR/e3t6O1dXVkRxMo/Hw8BC3t7f/rA8NoNVqxdHRkc8EY+T7P/8n5zycAcAZAJwBwBkAnAHAGQCcAcAZAJwBwBkAnAHAGQCcAcANfR38P1JKXjItKOdc62t6JwBc7RPgW92l0pWarE4AOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAa5TaOKWUS+2t+jgB4GqfADnnVPeeKscJAGcAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAFf720DvAZRV99tWJwBcsRtB3guoV6nJ6gSAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwC4RqmNU0q51N6qjxMArvYJkHNOde+pcpwAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAGcAcAYAN/RSaFVVcXx87LXuMVJVVaSUYnp6Oi4vL/vf7dAArq6u4vr6enSnU3G9Xi8WFhZiY2Mj3t7e+usDAczOzsbFxUU8PT3F6+vryA+pcubm5mJ5eTmen5/j4+Ojvz4QwNTUVKytrUWz2Yz9/X3v94+R+/v7vLKyEu12O3Z2dtLNzU2O+Aqg2+3GwcFBbjabsbW1lTqdTj4/P/cZYIzMzMzE+vp6uru7y51OJ3e73YiISBHhFw32Bx94jOPwP7lbAAAAAElFTkSuQmCC",Gg=l.p+"static/media/door_01.370d5c48.png",Xg=l.p+"static/media/door_02.589dadc7.png",Bg=l.p+"static/media/door_03.25d0bf9d.png",Kg=l.p+"static/media/door_04.06a40fe3.png",qg=l.p+"static/media/door_05.4515bf2c.png",Qg=l.p+"static/media/door_06.5a0271c1.png",Zg=l.p+"static/media/door_07.b3fa7c12.png",_g=l.p+"static/media/door_08.44d7e7a4.png",$g=l.p+"static/media/door_09.cc418cf3.png",em=l.p+"static/media/door_10.69a33f87.png",tm=l.p+"static/media/door_11.885157c0.png",lm=l.p+"static/media/door_12.1978a1a1.png",am=l.p+"static/media/door_13.0e06b1ac.png",om=l.p+"static/media/door_14.97d8561e.png",im=l.p+"static/media/door_15.059947bb.png",rm=l.p+"static/media/door_16.c2cd4b21.png",nm=l.p+"static/media/door_17.6410d727.png",cm=new Me.MeshStandardMaterial({color:"white",side:Me.FrontSide}),sm=n.a.memo((function(e){var t=e.dimension,l=e.doorType,a=t.map((function(e){return e/2})),o=Object(u.a)(a,3),i=o[0],r=(o[1],o[2]);return 0===i&&0===r?null:Object(gf.jsxs)("group",{name:"Door handle wrapper",children:[Object(gf.jsx)(xf,{x:-i,z:r,handleType:K.UpperLeft}),Object(gf.jsx)(xf,{x:i,z:r,handleType:K.UpperRight}),l===hy.Arched&&Object(gf.jsx)(Pg,{z:r})]})})),dm=n.a.memo((function(e){var t=e.dimension,l=Ew(o.shadowEnabled),a=Object(u.a)(t,3),i=a[0],r=a[1],n=a[2],c=t.map((function(e){return e/2})),s=Object(u.a)(c,3),d=s[0],f=s[1],h=s[2],p=function(e,t,a){return Object(gf.jsx)(Lt.f,{name:"Door seal plane",args:e,position:t,rotation:a,material:cm,receiveShadow:l})};return Object(gf.jsxs)("group",{name:"Door seal planes group",children:[p([r,n],[-d,f,0],[vt,vt,0]),p([r,n],[d,f,0],[vt,-vt,0]),p([i,r],[0,f,h],[Math.PI,0,0])]})})),um=function(e){var t=e.id,l=e.parentId,a=e.cx,i=(e.cy,e.cz),n=e.lx,c=e.ly,s=e.lz,d=e.textureType,h=e.locked,p=void 0!==h&&h,y=e.color,g=void 0===y?"white":y,m=e.doorType,w=void 0===m?hy.Default:m,x=e.archHeight,v=void 0===x?1:x,b=e.filled,A=void 0===b||b,T=e.opacity,P=void 0===T?1:T,S=e.frameColor,j=void 0===S?"white":S,H="Door Group ".concat(t),z=Ew(si),R=Tf(yf),D=Ew(o.windowShininess),M=_f(t),W=Object(r.useRef)(!1);Object(r.useEffect)((function(){var e=function(){W.current=!1};return window.addEventListener("pointerup",e),function(){return window.removeEventListener("pointerup",e)}}),[]);var I=function(){var a=arguments.length>0&&void 0!==arguments[0]&&arguments[0];z((function(o){if(o.groupActionMode)o.multiSelectionsMode||o.selectedElementIdSet.clear(),e.foundationId&&(o.selectedElementIdSet.has(l)?o.selectedElementIdSet.delete(l):o.selectedElementIdSet.add(e.foundationId));else{var i,r=Object(f.a)(o.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.id===t)if(n.selected=!0,o.selectedElement=n,a)if(o.selectedElementIdSet.has(t)){var c,s=Object(f.a)(o.elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;o.selectedElementIdSet.has(d.id)&&d.type!==o.selectedElement.type&&o.selectedElementIdSet.delete(d.id)}}catch(y){s.e(y)}finally{s.f()}}else if(o.multiSelectionsMode){o.selectedElementIdSet.add(t);var u,h=Object(f.a)(o.elements);try{for(h.s();!(u=h.n()).done;){var p=u.value;o.selectedElementIdSet.has(p.id)&&p.type!==o.selectedElement.type&&o.selectedElementIdSet.delete(p.id)}}catch(y){h.e(y)}finally{h.f()}}else o.selectedElementIdSet.clear(),o.selectedElementIdSet.add(t);else o.multiSelectionsMode?o.selectedElementIdSet.has(t)?o.selectedElementIdSet.delete(t):o.selectedElementIdSet.add(t):(o.selectedElementIdSet.clear(),o.selectedElementIdSet.add(t));else n.selected=!1}}catch(y){r.e(y)}finally{r.f()}}}))},C=function(e){return e.intersections.length>0&&e.intersections[0].eventObject.name===H&&!Ew.getState().moveHandleType&&!Ew.getState().resizeHandleType&&!Ew.getState().isAddingElement()&&Ew.getState().objectTypeToAdd===V.None},O=function(e,t){Et.getState().setEnableOrbitController(!1),R("showWallIntersectionPlaneId",l),z((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(new Me.Vector3(a,0,i).add(t)),l.selectedElement=l.elements.find((function(e){return e.selected}))}))},F=Ew(_r),k=Tf(Ns),Y=Tf(Vs),L=Ew(o.solarRadiationHeatmapMaxValue),E=Pf(wi),U=Object(r.useState)(null),N=Object(u.a)(U,2),J=N[0],G=N[1];Object(r.useEffect)((function(){if(e&&k){var t=E(e.id);if(t){var l=Tw.fetchHeatmapTexture(t,null!==L&&void 0!==L?L:5);l&&(l.wrapS=Me.RepeatWrapping,l.wrapT=Me.RepeatWrapping,l.offset.set(-n/2,-s/2),l.center.set(n/2,s/2),l.repeat.set(1/n,1/s),G(l))}}}),[k,L]);var X=function(e,t,l,a){var o=Object(r.useMemo)((function(){var t;switch(e){case fe.Default:t=Jg;break;case fe.NoTexture:t=Sf;break;case fe.Texture01:t=Gg;break;case fe.Texture02:t=Xg;break;case fe.Texture03:t=Bg;break;case fe.Texture04:t=Kg;break;case fe.Texture05:t=qg;break;case fe.Texture06:t=Qg;break;case fe.Texture07:t=Zg;break;case fe.Texture08:t=_g;break;case fe.Texture09:t=$g;break;case fe.Texture10:t=em;break;case fe.Texture11:t=tm;break;case fe.Texture12:t=lm;break;case fe.Texture13:t=am;break;case fe.Texture14:t=om;break;case fe.Texture15:t=im;break;case fe.Texture16:t=rm;break;case fe.Texture17:t=nm;break;default:t=Xg}return(new Me.TextureLoader).load(t,(function(e){void 0!==l&&void 0!==a&&(e.offset.set(.5,.5),e.repeat.set(1/l,1/a)),s(e),d()}))}),[e,t,l,a]),i=Object(r.useState)(o),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(Se.f)().invalidate;return c}(d,w,n,s),B=Object(r.useMemo)((function(){return[n,c,s,v]}),[n,c,s,v]),q=Object(r.useMemo)((function(){return k&&J&&e.filled?new Me.MeshBasicMaterial({color:g,map:J,side:Me.FrontSide}):A?d===fe.Default||d===fe.NoTexture?P<1?new Me.MeshPhongMaterial({specular:"white",shininess:null!==D&&void 0!==D?D:lt,color:g,side:Me.FrontSide,opacity:P,transparent:!0}):new Me.MeshStandardMaterial({map:X,color:g,side:Me.FrontSide}):new Me.MeshStandardMaterial({map:X,side:Me.FrontSide}):new Me.MeshStandardMaterial({opacity:g===wt?.5:0,color:g,transparent:!0,side:Me.DoubleSide})}),[k,J,g,d,X,A,P]);return Object(gf.jsxs)("group",{name:H,position:[a,0,i],onPointerDown:function(e){if(!W.current&&2!==e.button&&!Ew.getState().addedWallId&&(W.current=!0,C(e)&&I(),function(e){if(e.eventObject.name===H&&e.intersections.length>0)switch(e.object.name){case K.UpperLeft:case K.UpperRight:case K.Arch:return!0}return!1}(e))){var t=e.intersections[0].eventObject.name;switch(t){case K.UpperLeft:O(t,new Me.Vector3(n/2,0,-s/2));break;case K.UpperRight:O(t,new Me.Vector3(-n/2,0,-s/2));break;case K.Arch:O(t,new Me.Vector3(0,0,0))}}},onContextMenu:function(e){Ew.getState().addedWallId||C(e)&&(I(!0),z((function(e){e.contextMenuObjectType=V.Door})))},children:[function(){switch(w){case hy.Default:return Object(gf.jsx)(Ng,{id:t,dimension:B,color:g,frameColor:j,selected:M,locked:p,material:q,filled:A,showHeatFluxes:Y,area:Tw.getDoorArea(e),foundation:F(e)});case hy.Arched:return Object(gf.jsx)(Vg,{id:t,dimension:B,color:g,frameColor:j,selected:M,locked:p,material:q,filled:A,showHeatFluxes:Y,area:Tw.getDoorArea(e),foundation:F(e)})}}(),M&&Object(gf.jsx)(Ig,{element:e}),M&&!p&&Object(gf.jsx)(sm,{dimension:B,doorType:w}),Object(gf.jsx)(dm,{dimension:B})]})},fm=n.a.memo(um),hm=n.a.memo((function(e){var t=e.drawSunbeam,l=e.absRotation,a=e.tiltAngle,o=new Me.Vector3(0,0,1),n=Ew(i.date),c=Ew(i.latitude),s=Ew(Kr),d=Math.max(100,10*s),u=Object(r.useMemo)((function(){return jy(new Date(n),c).applyEuler(new Me.Euler(-vt-a,0,-l))}),[n,c,l,a]);return Object(gf.jsx)(gf.Fragment,{children:t&&u.z>0&&Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[o.clone().multiplyScalar(.75),[0,0,0],u.clone().multiplyScalar(d)],name:"Sun Beam",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[u.clone().multiplyScalar(.5),o.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Tw.toDegrees(u.angleTo(o)).toFixed(1)+"\xb0",fontSize:20,fontFace:"Times Roman",textHeight:.1,position:u.clone().multiplyScalar(.75).add(o.clone().multiplyScalar(.75)).multiplyScalar(.5)}),Object(gf.jsx)("group",{position:o.clone().multiplyScalar(.75),rotation:[vt,0,0],children:Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})})})),pm=function(e){var t,l,a,o,i,n=e.sp;Ew(Fi);var c=Ew(Zr),s=Ew(Vi),d=Object(r.useMemo)((function(){return{lng:s}}),[s]);if(!n.foundationId||!n.parentId)return null;var u=c(n.parentId),f=c(n.foundationId);if(!u||!f)return null;var h=new Me.Vector3(f.cx,f.cy,f.cz),p=new Me.Vector3(u.cx,u.cy,u.cz),y=new Me.Vector3(n.cx*u.lx,0,n.cz*u.lz).applyEuler(new Me.Euler(0,0,u.relativeAngle)).add(p).applyEuler(new Me.Euler(0,0,f.rotation[2])).add(h),g=(null!==(t=null===n||void 0===n?void 0:n.label)&&void 0!==t?t:me.t("shared.SolarPanelElement",d))+((null===n||void 0===n?void 0:n.locked)?" ( + ".concat(me.t("shared.ElementLocked",d)," + )"):"")+((null===n||void 0===n?void 0:n.label)?"":"\n"+me.t("word.Coordinates",d)+": ("+y.x.toFixed(1)+", "+y.y.toFixed(1)+", "+y.z.toFixed(1)+") "+me.t("word.MeterAbbreviation",d));return Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:g,color:null!==(l=n.labelColor)&&void 0!==l?l:"white",fontSize:null!==(a=n.labelFontSize)&&void 0!==a?a:20,textHeight:null!==(o=n.labelSize)&&void 0!==o?o:.2,position:[0,0,null!==(i=n.labelHeight)&&void 0!==i?i:Math.max(n.ly/2*Math.abs(Math.sin(n.tiltAngle))+.1,.2)]})},ym=function(e){var t=e.tiltAngle,l=e.handleSize,a=e.initPointerDown,o=e.handlePointerMove,i=e.handlePointerUp,n=Object(Se.f)().gl,c=Object(r.useState)(ht),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useRef)(),A=Object(r.useRef)(),T=Object(r.useMemo)((function(){return new Array(7).fill(0)}),[]),P=Ew(si);return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{name:q.Tilt,args:[l,1.1*l,18,2,0,vt],rotation:[0,-vt,0,"ZXY"],onPointerOver:function(){n.domElement.style.cursor="grab",f(pt)},onPointerOut:function(){n.domElement.style.cursor="default",f(ht)},onPointerDown:function(e){a(),e.stopPropagation(),g(!0),v(!0),P((function(e){e.rotateHandleType=q.Tilt}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide,color:d})}),y&&Object(gf.jsxs)(gf.Fragment,{children:[x&&Object(gf.jsx)(Lt.f,{name:"Solar panel tilt handle intersection plane",ref:A,args:[1e3,1e3],rotation:[0,-vt,0,"ZXY"],visible:!1,onPointerMove:function(e){o(e,A)},onPointerUp:function(){i(),v(!1),g(!1)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.g,{ref:b,name:"Solar panel tilt handle",args:[l,2*l,18,2,-0,vt],rotation:[0,-vt,0,"ZXY"],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:Me.DoubleSide})}),Object(gf.jsx)(Jl.a,{points:[[0,0,l],[0,0,1.75*l]],rotation:new Me.Euler(t,0,0,"ZXY"),lineWidth:1}),T.map((function(e,t){return Object(gf.jsxs)("group",{rotation:new Me.Euler(Math.PI/12*t-vt,0,0,"ZXY"),children:[Object(gf.jsx)(Jl.a,{points:[[0,0,1.8*l],[0,0,2*l]],color:"white",transparent:!0,opacity:.5}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(90-15*t,"\xb0"),fontSize:20*l,fontFace:"Times Roman",textHeight:.15*l,position:[0,0,1.6*l]})]},t)})),Object(gf.jsx)("group",{rotation:new Me.Euler(t,0,0,"ZXY"),children:Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(Math.floor(-t/Math.PI*180),"\xb0"),fontSize:20*l,fontFace:"Times Roman",textHeight:.2*l,position:[0,0,.75*l]})})]})]})},gm=n.a.memo((function(e){var t=e.tiltAngle,l=e.spCy,a=e.spLy,i=e.lx,n=e.nx,c=Ew(o.shadowEnabled),s=Object(r.useMemo)((function(){var e=a*Math.cos(t)/2,o=.75*a-e,i=1.5*-l,r=o-e/2,n=Math.hypot(i,r),s=Math.atan2(r,i);return Object(gf.jsx)("group",{position:[0,-o,l],rotation:[-s,0,0],children:Object(gf.jsx)(Lt.a,{args:[.05,.05,n],position:[0,0,n/2],castShadow:c,receiveShadow:c,children:Object(gf.jsx)("meshStandardMaterial",{color:"#BFBFBF"})})})}),[t,l,a]),d=Object(r.useMemo)((function(){for(var e=[],t=n%2===0?i/2:0;t0&&(e.intersections[0].object===ae.current&&(t.contextMenuObjectType=V.SolarPanel))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===ae.current&&(Y.domElement.style.cursor="move",N(!0)))},onPointerOut:function(e){Y.domElement.style.cursor="default",N(!1)},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),z&&He?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:He}):je?C||0===D?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",map:je,color:y}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===se||void 0===se?void 0:se.color)?at:ot),shininess:null!==D&&void 0!==D?D:tt,side:Me.FrontSide,map:je,color:y}):Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}),0===(null===se||void 0===se?void 0:se.bifacialityFactor)||0===S?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:y}):je?Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===se||void 0===se?void 0:se.color)?at:ot),shininess:null!==D&&void 0!==D?D:tt,side:Me.FrontSide,map:je,color:y}):null]}),z&&He&&oe.current&&oe.current.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(gf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:l,args:[d,f],position:[0,0,h],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),j&&m&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-de,-ue,0],[-de,ue,0],[de,ue,0],[de,-ue,0],[-de,-ue,0]],castShadow:!1,receiveShadow:!1,lineWidth:2,color:yt}),j&&!m&&Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)("group",{name:mm,onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].eventObject.name===mm){var t=e.object.name;switch(t){case B.Default:Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=w,e.oldParentId=w,e.oldFoundationId=x})),H((function(e){e.moveHandleType=t,e.selectedElement=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))}));break;case K.Left:Pe(t,new Me.Vector3(d/2,0,0));break;case K.Right:Pe(t,new Me.Vector3(-d/2,0,0));break;case K.Lower:Pe(t,new Me.Vector3(0,0,f/2));break;case K.Upper:Pe(t,new Me.Vector3(0,0,-f/2))}}},onPointerOver:function(e){if(e.intersections.length>0&&e.eventObject.name.includes(mm)){var t=e.object.name;Z(t),t===B.Top?Y.domElement.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?Y.domElement.style.cursor="grab":Y.domElement.style.cursor="pointer"}},onPointerOut:function(){Z(null),Y.domElement.style.cursor="default"},children:[Object(gf.jsx)(Lt.h,{position:new Me.Vector3(0,0,0),args:[Ae,6,6],name:B.Default,children:Object(gf.jsx)("meshBasicMaterial",{color:"orange"})}),Object(gf.jsx)(Lt.a,{position:[(he.x+ye.x)/2,he.y,he.z],args:[be,be,1.2*h],name:K.Lower,children:Object(gf.jsx)("meshBasicMaterial",{color:Q===K.Lower||I===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{position:[(pe.x+ge.x)/2,pe.y,pe.z],args:[be,be,1.2*h],name:K.Upper,children:Object(gf.jsx)("meshBasicMaterial",{color:Q===K.Upper||I===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{position:[he.x,(he.y+pe.y)/2,he.z],args:[be,be,1.2*h],name:K.Left,children:Object(gf.jsx)("meshBasicMaterial",{color:Q===K.Left||I===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{position:[ye.x,(ye.y+ge.y)/2,ye.z],args:[be,be,1.2*h],name:K.Right,children:Object(gf.jsx)("meshBasicMaterial",{color:Q===K.Right||I===K.Right?pt:ht})})]})}),Object(gf.jsx)(hm,{drawSunbeam:T,absRotation:P,tiltAngle:S}),(U||A)&&!j&&Object(gf.jsx)(pm,{sp:me})]}),0!==S&&se&&Object(gf.jsx)(gm,{tiltAngle:-S,spCy:c-fe,spLy:f,lx:b===$.portrait?se.width:se.length,nx:te})]}),j&&!m&&Object(gf.jsx)("group",{name:mm,position:[n,0,s+fe],rotation:we,children:Object(gf.jsx)(ym,{tiltAngle:S,handleSize:Te,initPointerDown:function(){re.current=S,ie.current=!0,Et.getState().setEnableOrbitController(!1)},handlePointerMove:function(e,t){if(ie.current&&(function(e){ce.x=e.offsetX/Y.domElement.clientWidth*2-1,ce.y=-e.offsetY/Y.domElement.clientHeight*2+1,ne.setFromCamera(ce,k)}(e),t.current&&Ew.getState().rotateHandleType===q.Tilt)){var a=ne.intersectObjects([t.current]);if(a.length>0){var o,i=a[0].point,r=null===(o=t.current.parent)||void 0===o?void 0:o.localToWorld(new Me.Vector3);if(r){var n=(new Me.Vector3).subVectors(i,r),c=n.angleTo(Rt),s=P;c=(s%Math.PI===0?Math.sign(-n.y)*Math.sign(Math.cos(s)):Math.sign(n.x)*Math.sign(Math.sin(s)))*c-vt,c=Tw.clamp(c,-vt,0),Ew.getState().updateSolarPanelTiltAngleById(l,c)}}}},handlePointerUp:function(){var e=M(l);if(e&&null!==re.current&&Math.abs(e.tiltAngle-re.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:re.current,newValue:e.tiltAngle,changedElementId:l,changedElementType:V.SolarPanel,undo:function(){Ew.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.oldValue)},redo:function(){Ew.getState().updateSolarPanelTiltAngleById(t.changedElementId,t.newValue)}};Ew.getState().addUndoable(t)}Et.getState().setEnableOrbitController(!0),ie.current=!1}})})]})},xm=n.a.memo(wm),vm=l.p+"static/media/polygon_08.acf0bf8f.png",bm=l.p+"static/media/polygon_09.26eed538.png",Am=l.p+"static/media/polygon_10.749fa717.png",Tm=l(842),Pm=function(e){var t=e.id,l=e.lz,a=void 0===l?.1:l,i=e.filled,c=void 0!==i&&i,s=e.rotation,d=void 0===s?[0,0,0]:s,h=e.normal,p=void 0===h?[0,0,1]:h,y=e.color,g=void 0===y?"yellow":y,m=e.label,w=e.text,x=e.fontSize,v=void 0===x?1:x,b=e.fontColor,A=void 0===b?"black":b,T=e.fontOutlineWidth,P=void 0===T?0:T,S=e.fontOutlineColor,j=void 0===S?"white":S,H=e.fontStrokeWidth,z=void 0===H?0:H,R=e.fontStrokeColor,D=void 0===R?"black":R,M=e.lineStyle,W=void 0===M?F.Solid:M,I=e.lineColor,C=void 0===I?"black":I,O=e.lineWidth,k=void 0===O?1:O,Y=e.locked,L=void 0!==Y&&Y,E=e.showLabel,U=void 0!==E&&E,N=e.parentId,J=e.foundationId,G=e.vertices,q=e.opacity,Q=void 0===q?1:q,Z=e.noOutline,_=void 0!==Z&&Z,$=e.shininess,ee=void 0===$?0:$,te=e.selectedIndex,le=void 0===te?-1:te,ae=e.textureType,oe=void 0===ae?ce.NoTexture:ae,ie=Ew(si),re=Ew(Vi),ne=Ew(is),se=Ew(cs),de=Ew(o.shadowEnabled),ue=_f(t),fe=Object(Se.f)().gl.domElement,he=Object(r.useState)(!1),pe=Object(u.a)(he,2),ye=pe[0],ge=pe[1],we=Object(r.useState)(0),xe=Object(u.a)(we,2),ve=xe[0],be=xe[1],Ae=Object(r.useState)(0),Te=Object(u.a)(Ae,2),Pe=Te[0],je=Te[1],He=Object(r.useState)(null),ze=Object(u.a)(He,2),Re=ze[0],De=ze[1],We=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===N)return a}}catch(o){l.e(o)}finally{l.f()}})),Oe=new Me.Vector3,Fe=new Me.Euler;if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid){var ke=Tw.getWorldDataById(Ce.id),Ye=ke.pos,Le=ke.rot;Oe.copy(Ye),Fe.set(0,0,Le)}var Ee=Ce?Math.max(1,Math.max(Ce.lx,Ce.ly)/24):1,Ue=dt*Ee,Ne=st*Ee,Ve=Object(r.useMemo)((function(){return{lng:re}}),[re]),Je=function(e,t){ie((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.selectedIndex=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Ge=Object(r.useMemo)((function(){var e=new Array;if(Ce){switch(Ce.type){case V.Foundation:var t,l=Object(f.a)(G);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.push({x:a.x*Ce.lx,y:a.y*Ce.ly})}}catch(g){l.e(g)}finally{l.f()}break;case V.Wall:var o,i=Object(f.a)(G);try{for(i.s();!(o=i.n()).done;){var r=o.value;e.push({x:r.x*Ce.lx,y:r.y*Ce.lz})}}catch(g){i.e(g)}finally{i.f()}break;case V.Cuboid:var n,c,s=(new Me.Vector3).fromArray(p);Tw.isUnitVectorX(s)?(n=Ce.lz,c=Ce.ly):Tw.isUnitVectorY(s)?(n=Ce.lx,c=Ce.lz):(n=Ce.lx,c=Ce.ly);var d,u=Object(f.a)(G);try{for(u.s();!(d=u.n()).done;){var h=d.value;e.push({x:h.x*n,y:h.y*c})}}catch(g){u.e(g)}finally{u.f()}}var y=Tw.calculatePolygonCentroid(e);be(y.x),je(y.y)}return e}),[G,Ce,p]),Xe=function(){if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid){var e=Tw.isIdentical(p,Tt);return Oe.z+(Ce.lz+(e?0:a))/2+.01}return(null===Ce||void 0===Ce?void 0:Ce.type)===V.Foundation?Ce.lz+.01:a/2+.01}(),Be=function(){if((null===Ce||void 0===Ce?void 0:Ce.type)===V.Wall)return new Me.Euler(-vt,0,Math.PI,"ZXY");var e=(new Me.Vector3).fromArray(p),t=d[2];return(null===Ce||void 0===Ce?void 0:Ce.type)===V.Cuboid&&(t=Fe.z),Tw.isSame(e,St)?new Me.Euler(0,vt,t,"ZXY"):Tw.isSame(e,jt)?new Me.Euler(0,-vt,t,"ZXY"):Tw.isSame(e,Ht)?new Me.Euler(-vt,0,t,"ZXY"):Tw.isSame(e,zt)?new Me.Euler(vt,0,t,"ZXY"):new Me.Euler(0,0,t,"ZXY")}(),Ke=function(){var e,t;if(Ce){if(Ce.type===V.Cuboid){var l=new Me.Vector3(Oe.x,Oe.y,Xe),a=(new Me.Vector3).fromArray(p),o=!1,i=new Me.Vector3;return Tw.isSame(a,St)?(o=!0,i.x=Ce.lx/2+.01):Tw.isSame(a,jt)?(o=!0,i.x=-Ce.lx/2-.01):Tw.isSame(a,Ht)?(o=!0,i.y=Ce.ly/2+.01):Tw.isSame(a,zt)&&(o=!0,i.y=-Ce.ly/2-.01),o&&(i.applyEuler(Fe),l.x=Oe.x+i.x,l.y=Oe.y+i.y,l.z=Oe.z+i.z),l}if(Ce.type===V.Wall)return new Me.Vector3(0,-.01,0)}return new Me.Vector3(null!==(e=null===Ce||void 0===Ce?void 0:Ce.cx)&&void 0!==e?e:0,null!==(t=null===Ce||void 0===Ce?void 0:Ce.cy)&&void 0!==t?t:0,Xe)}(),qe=Object(r.useMemo)((function(){var e,t=new Array,l=Object(f.a)(Ge);try{for(l.s();!(e=l.n()).done;){var a=e.value;t.push(new Me.Vector3(a.x,a.y,0))}}catch(o){l.e(o)}finally{l.f()}return t.push(new Me.Vector3(Ge[0].x,Ge[0].y,0)),t}),[Ge]),Qe=Object(r.useMemo)((function(){var e=new Me.Shape;e.moveTo(Ge[0].x,Ge[0].y);for(var t=1;t0&&(e.intersections[0].object===e.eventObject&&(De(t),t===B.Default?fe.style.cursor="move":fe.style.cursor="pointer"))}),[]),_e=Object(r.useCallback)((function(){De(null),fe.style.cursor="default"}),[]),$e=Object(r.useMemo)((function(){var e;switch(oe){case ce.Texture01:e=Kp;break;case ce.Texture02:e=qp;break;case ce.Texture03:e=Qp;break;case ce.Texture04:e=Zp;break;case ce.Texture05:e=_p;break;case ce.Texture06:e=$p;break;case ce.Texture07:e=ey;break;case ce.Texture08:e=vm;break;case ce.Texture09:e=bm;break;case ce.Texture10:e=Am;break;default:e=Sf}return(new Me.TextureLoader).load(e,(function(e){var t=function(e){switch(e){case ce.Texture01:return{x:1,y:1};case ce.Texture02:return{x:2,y:2};case ce.Texture03:return{x:.4,y:.4};case ce.Texture04:return{x:.25,y:.25};case ce.Texture05:return{x:5,y:5};case ce.Texture06:case ce.Texture07:return{x:1,y:1};case ce.Texture08:case ce.Texture09:return{x:2,y:2};case ce.Texture10:return{x:4,y:4};default:return{x:1,y:1}}}(oe);e.wrapT=e.wrapS=Me.RepeatWrapping,e.repeat.set(1/t.x,1/t.y);var l=(new Me.Vector3).fromArray(p);Tw.isSame(l,St)?e.rotation=vt:Tw.isSame(l,jt)?e.rotation=-vt:Tw.isSame(l,zt)&&(e.rotation=Math.PI),at(e)}))}),[oe,p]),et=Object(r.useState)($e),tt=Object(u.a)(et,2),lt=tt[0],at=tt[1];return Object(gf.jsxs)("group",{name:"Polygon Group "+t,rotation:Be,position:Ke,children:[c&&Object(gf.jsxs)("mesh",{uuid:t,ref:We,receiveShadow:de,castShadow:!1,name:V.Polygon,onPointerDown:function(e){2!==e.button&&se===V.None&&ne(t,e)},onContextMenu:function(e){ne(t,e,X.ContextMenu),ie((function(t){e.intersections.length>0&&(e.intersections[0].object===We.current&&(e.intersections.length>1&&t.pastePoint.copy(e.intersections[1].point),t.contextMenuObjectType=V.Polygon))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===We.current&&ge(!0))},onPointerOut:function(){ge(!1),fe.style.cursor="default"},children:[Object(gf.jsx)("shapeBufferGeometry",{attach:"geometry",args:[Qe]}),void 0===ee||0===ee?Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:oe===ce.NoTexture?g:"white",map:lt,side:Me.DoubleSide,transparent:Q<1,opacity:Q}):Object(gf.jsx)("meshPhongMaterial",{attach:"material",color:oe===ce.NoTexture?g:"white",map:lt,side:Me.FrontSide,specular:new Me.Color("white"),shininess:ee,transparent:Q<1,opacity:Q})]}),w&&Object(gf.jsx)(Tm.a,{fontSize:v,scale:[1,1,1],color:A,position:[ve,Pe,.01],rotation:[0,0,(null===Ce||void 0===Ce?void 0:Ce.type)===V.Wall?Math.PI:0],anchorX:"center",anchorY:"middle",outlineWidth:P,outlineColor:j,strokeWidth:z,strokeColor:D,children:w}),(!_||L&&ue)&&Object(gf.jsx)(Jl.a,{points:qe,color:L&&ue?yt:C,lineWidth:k,dashed:W&&W!==F.Solid,dashSize:W===F.Dashed?.3:.1,gapSize:.1,uuid:t,receiveShadow:!1,castShadow:!1,name:"Polygon Wireframe",onPointerDown:function(e){2!==e.button&&ne(t,e)},onContextMenu:function(e){se===V.None&&(ne(t,e,X.ContextMenu),ie((function(l){if(e.intersections.length>0){var a=e.intersections[0].object;"Polygon Wireframe"===a.name&&a.uuid===t&&(l.contextMenuObjectType=V.Polygon)}})))}}),!c&&Object(gf.jsx)(Jl.a,{position:[0,0,.1],points:qe,visible:!1,lineWidth:Math.min(10*k,10),receiveShadow:!1,castShadow:!1,uuid:t,name:"Polygon Enlarged Line",onPointerDown:function(e){2!==e.button&&ne(t,e)},onContextMenu:function(e){se===V.None&&(ne(t,e,X.ContextMenu),ie((function(l){if(e.intersections.length>0){var a=e.intersections[0].object;"Polygon Enlarged Line"===a.name&&a.uuid===t&&(l.contextMenuObjectType=V.Polygon)}})))}}),ue&&!L&&Object(gf.jsx)(Lt.h,{ref:Ie,position:[ve,Pe,0],args:[Ne,6,6],name:B.Default,onPointerDown:function(e){2!==e.button&&(ne(t,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=N,e.oldParentId=N,e.oldFoundationId=J})),ie((function(e){e.moveHandleType=B.Default})))},onPointerOver:function(e){Ze(e,B.Default)},onPointerOut:_e,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),ue&&!L&&Ge.map((function(e,l){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Lt.a,{userData:{vertexIndex:l},position:[e.x,e.y,0],name:K.Default,args:[Ue,Ue,a/2+(c?0:.1)],onPointerDown:function(e){2!==e.button&&(ne(t,e,X.Resize),Je(t,l),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=N,e.oldParentId=N,e.oldFoundationId=J})),ie((function(e){e.resizeHandleType=K.Default})))},onPointerOver:function(e){Ze(e,K.Default),Je(t,l)},onPointerOut:_e,onContextMenu:function(e){ie((function(l){if(e.intersections.length>0){var a=e.intersections[0].object.userData.vertexIndex;void 0!==a&&(l.contextMenuObjectType=V.PolygonVertex,Je(t,a))}}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Re!==K.Default&&Ew.getState().resizeHandleType!==K.Default||le!==l?ht:pt})}),Object(gf.jsx)("textSprite",{name:"Label "+l,text:""+l,fontSize:20*Ee,fontFace:"Times Roman",textHeight:.2*Ee,position:[e.x,e.y,.2*Ee]})]},"resize-handle-"+l)})),(ye||U)&&!ue&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:(null!==m&&void 0!==m?m:me.t("shared.PolygonElement",Ve))+(L?" ("+me.t("shared.ElementLocked",Ve)+")":""),fontSize:20*Ee,fontFace:"Times Roman",textHeight:.2*Ee,position:[0,0,a+.2]})]})},Sm={display:!1,color:"white",textureType:ue.NoTexture,parapetHeight:1,copingsWidth:.5,copingsHeight:.1},jm=function(e){var t=e.args,l=e.wallData,a=e.parapetZ,o=e.currWallPointData,i=e.leftWallPointData,n=e.rightWallPointData,c=t.display,s=t.color,d=t.textureType,f=t.parapetHeight,h=t.copingsWidth,p=t.copingsHeight,y=l.id,g=(l.parentId,l.cx),m=l.cy,w=l.hx,x=l.hy,v=l.angle,b=(l.selected,f-p),A=fp(d),T=Object(r.useMemo)((function(){var e=new Me.Vector3(-w,x-h/2),t=new Me.Vector3(w,x-h/2),l=new Me.Vector3(w,x+h/2),a=new Me.Vector3(-w,x+h/2),r=[e,t,l,a];if(n||i){var c=Hm(o);if(n&&Rm(o.rightPoint,n.leftPoint)){var s=R(c,n);s&&(t.copy(s.outerIntersection),l.copy(s.innerIntersection))}if(i&&Rm(o.leftPoint,i.rightPoint)){var d=R(c,i);d&&(e.copy(d.outerIntersection),a.copy(d.innerIntersection))}}return r}),[x,h,o,i,n]),P=Object(r.useMemo)((function(){var e=new Me.Shape,t=new Me.Vector3(-w,2*x),l=new Me.Vector3(w,2*x);if(n||i){var a=zm(o,o.ly);if(n&&Rm(o.rightPoint,n.leftPoint)){var r=D(a,n);r&&l.copy(r)}if(i&&Rm(o.leftPoint,i.rightPoint)){var c=D(a,i);c&&t.copy(c)}}return e.moveTo(-w,0),e.lineTo(w,0),e.lineTo(l.x,l.y),e.lineTo(t.x,t.y),e.closePath(),e}),[w,o,i,n]),S=Object(r.useMemo)((function(){var e=new Me.Shape;if(0===h)return e;var t=Object(u.a)(T,4),l=t[0],a=t[1],o=t[2],i=t[3];return e.moveTo(l.x,l.y),e.lineTo(a.x,a.y),e.lineTo(o.x,o.y),e.lineTo(i.x,i.y),e.closePath(),e}),[x,h,T]),j=Object(r.useMemo)((function(){return T.map((function(e){return e.toArray()}))}),[x,T]),H=Object(r.useMemo)((function(){return[new Me.Vector3(-w,0,0),new Me.Vector3(w,0,0)]}),[w]),z=Object(r.useMemo)((function(){return[new Me.Vector3,new Me.Vector3(0,0,b)]}),[b]);function R(e,t){var l=Hm(t),a=Dm(e.outerPoints.leftPoint,e.outerPoints.rightPoint,l.outerPoints.leftPoint,l.outerPoints.rightPoint);if(!a)return null;var o=Dm(e.innerPoints.leftPoint,e.innerPoints.rightPoint,l.innerPoints.leftPoint,l.innerPoints.rightPoint);return o?{innerIntersection:(new Me.Vector3).subVectors(o,new Me.Vector3(g,m)).applyEuler(new Me.Euler(0,0,-v)),outerIntersection:(new Me.Vector3).subVectors(a,new Me.Vector3(g,m)).applyEuler(new Me.Euler(0,0,-v))}:null}function D(e,t){var l=zm(t,t.ly),a=Dm(e.leftPoint,e.rightPoint,l.leftPoint,l.rightPoint);return a?(new Me.Vector3).subVectors(a,new Me.Vector3(g,m)).applyEuler(new Me.Euler(0,0,-v)):null}return c?Object(gf.jsxs)("group",{name:"Wall Parapet Group",position:[0,0,a],onContextMenu:function(e){Ew.getState().selectMe(y,e,X.ContextMenu,!0),Ew.getState().set((function(t){e.intersections.length>0&&e.intersections[0].eventObject===e.eventObject&&(t.contextMenuObjectType=V.Wall)}))},onPointerDown:function(e){2!==e.button&&e.intersections.length>0&&e.intersections[0].eventObject===e.eventObject&&(Ew.getState().moveHandleType||Ew.getState().resizeHandleType||Ew.getState().isAddingElement()||Ew.getState().selectMe(y,e,X.Select,!0))},children:[Object(gf.jsx)(Lt.e,{name:"Body Extrude Mesh",args:[P,{steps:1,depth:b,bevelEnabled:!1}],children:Object(gf.jsx)("meshStandardMaterial",{color:s,map:A})}),Object(gf.jsx)(Jl.a,{position:[w,0,0],points:z,color:"black",lineWidth:.2}),Object(gf.jsx)(Jl.a,{position:[-w,0,0],points:z,color:"black",lineWidth:.2}),Object(gf.jsx)(Jl.a,{position:[0,0,b],points:H,color:"black",lineWidth:.2}),Object(gf.jsx)(Lt.e,{name:"Copings Extrude Mesh",position:[0,0,b],args:[S,{steps:1,depth:p,bevelEnabled:!1}],children:Object(gf.jsx)("meshStandardMaterial",{color:s})}),Object(gf.jsx)(Jl.a,{position:[0,0,b+p],points:j,color:"black",lineWidth:.2}),Object(gf.jsx)(Jl.a,{position:[0,0,b],points:j,color:"black",lineWidth:.2})]}):null};function Hm(e){var t=(e.ly+e.copingsWidth)/2,l=(e.ly-e.copingsWidth)/2;return{innerPoints:zm(e,t),outerPoints:zm(e,l)}}function zm(e,t){var l=e.leftPoint,a=e.rightPoint,o=(new Me.Vector3).fromArray(l),i=(new Me.Vector3).fromArray(a),r=(new Me.Vector3).subVectors(i,o).applyEuler(new Me.Euler(0,0,vt)).normalize().clone().multiplyScalar(t);return{leftPoint:o.clone().add(r),rightPoint:i.clone().add(r)}}function Rm(e,t){return Math.abs(e[0]-t[0])0){var b,A=Object(f.a)(x);try{for(A.s();!(b=A.n()).done;){var T=b.value;w-=Tw.getWindowArea(T,t)}}catch(oe){A.e(oe)}finally{A.f()}}if(v&&v.length>0){var P,S=Object(f.a)(v);try{for(S.s();!(P=S.n()).done;){var j=P.value;w-=j.lx*j.lz*t.lx*t.lz}}catch(oe){S.e(oe)}finally{S.f()}}var H=4*(null!==(e=Ew.getState().world.solarRadiationHeatmapGridCellSize)&&void 0!==e?e:.5),z=Tw.getHighestPointOfWall(t),R=Math.max(2,Math.round(i/H)),D=Math.max(2,Math.round(z/H)),M=i/R,W=z/D,I=(z-t.lz)/2,C=r/w*(null!==d&&void 0!==d?d:_e);g.current=C<0?1:0,m.current=Tw.getEuler(Rt,Ht,"YXZ",Math.sign(C)*vt);for(var O,F=[],k=n?Tw.getPartialWallVertices(t,0):Tw.getWallVertices(t,0),Y=0;Y0){var J,G=Object(f.a)(x);try{for(G.s();!(J=G.n()).done;){var X=J.value;if(X.type===V.Window){var B=X.cx*t.lx,K=X.cz*t.lz,q=X.lx*t.lx/2,Q=X.lz*t.lz/2;if(X.windowType===Yt.Arched){if(U>=B-q&&U=K-Q&&N=B-q&&U=K-Q&&N0){var Z,_=Object(f.a)(v);try{for(_.s();!(Z=_.n()).done;){var $=Z.value,ee=$.cx*i,te=$.cz*z,le=$.lx*i/2,ae=$.lz*z/2;if(U>=ee-le&&U=te-ae&&N0?E:S,U=z.length>0?U:S;var Ae=fp(R),Te=_f(m),Pe=Ew(si),je=Ew(on),He=Ew(is),ze=Ew(Sr),Re=Ew(Iu),De=Pf(wi),We=Ew(qn),Ie=Ew(o.shadowEnabled),Ce=Ew(Uu),Oe=Ew(Nu),Fe=Ew(o.solarRadiationHeatmapMaxValue),ke=Tf(yf),Ye=Tf(Ns),Le=Tf((function(e){return e.elementBeingCanceledId})),Ee=Tf((function(e){return e.showWallIntersectionPlaneId})),Ve=Object(r.useState)(!1),Je=Object(u.a)(Ve,2),Ge=Je[0],Xe=Je[1],Be=Object(r.useState)(null),Ke=Object(u.a)(Be,2),qe=Ke[0],Qe=Ke[1],Ze=Object(Se.f)(),_e=Ze.camera,$e=Ze.gl,et=(Ze.invalidate,function(e,t,l,a){var o=function(t){return t.parentId===e||t.id===a},i=Ew((function(e){if(t){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t)return o}}catch(i){a.e(i)}finally{a.f()}}return null})),n=Ew((function(e){if(l){var t,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.id===l)return o}}catch(i){a.e(i)}finally{a.f()}}return null})),c=Ew((function(e){return JSON.stringify(e.elements.filter(o))}));return{elementsOnWall:Object(r.useMemo)((function(){return Ew.getState().elements.filter((function(e){return o(e)&&Tw.isLegalOnWall(e.type)}))}),[c]),leftWall:i,rightWall:n}}(m,H[0],z[0])),tt=et.elementsOnWall,lt=et.leftWall,at=et.rightWall,ot=hp(g),it=Object(r.useRef)(null),rt=Object(r.useRef)(null),nt=Object(r.useRef)(null),ct=Object(r.useRef)(null),st=Object(r.useRef)(null),dt=Object(r.useRef)(null),ut=Object(r.useRef)(null),ft=Object(r.useRef)(null),ht=b/2,pt=T/2,xt=S/2,bt=ot?ot.rotation[2]+j:j,At=Tw.getInnerWallOffset(lt,b,T,j,"left"),Tt=Tw.getInnerWallOffset(at,b,T,j,"right"),Pt=Q===Ne.Stud||Q===Ne.Pillar,St=null!==(t=E)&&void 0!==t?t:S,jt=null!==(l=U)&&void 0!==l?l:S,Ht=ne===Ue.Partial,zt=Ht?se:0,Rt=Ht?fe:0,Dt=Ht?Math.min(St,pe):St,Mt=Ht?Math.min(jt,ge):jt,Wt=Ht&&(!Tw.isZero(St-Dt)||!Tw.isZero(jt-Mt)),It=Ie&&!Pt,Ct=xe.display,Ot=Math.max(Dt,Mt)-xt,Ft=Object(r.useMemo)((function(){return new Me.Vector2}),[]),kt=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Ut=Object(r.useMemo)((function(){return new Me.MeshStandardMaterial({color:"white",side:Me.DoubleSide,transparent:Pt,opacity:ie})}),[Pt,ie]),Nt=Object(r.useMemo)((function(){return Tw.getHighestPointOfWall(y)}),[y.lz,y.leftRoofHeight,y.rightRoofHeight,y.centerRoofHeight,y.centerLeftRoofHeight,y.centerRightRoofHeight]),Vt=Object(r.useMemo)((function(){var e=new Me.Shape;return function(e,t,l){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,n=!(arguments.length>7&&void 0!==arguments[7])||arguments[7],c=t/2,s=l/2;Ht?e.moveTo(a-c+i,o-s+se):e.moveTo(a-c+i,o-s);if(n){var d,u=tt.filter((function(e){return e.type===V.Door})).sort((function(e,t){return e.cx-t.cx})),h=Object(f.a)(u);try{for(h.s();!(d=h.n()).done;){var p=d.value;if(p.id!==ut.current){var y=p.cx*t,g=p.cz*l,m=p.lx*t,w=p.lz*S;if(p.doorType===hy.Default)e.lineTo(a+y-m/2,o-s),e.lineTo(a+y-m/2,o-s+w),e.lineTo(a+y+m/2,o-s+w),e.lineTo(a+y+m/2,o-s);else{var x=Math.min(p.archHeight,w,m/2);if(e.lineTo(a+y-m/2,o-s),x>.1){e.lineTo(a+y-m/2,o-s+w/2-x);var v=x/2+Math.pow(m,2)/(8*x),b=y,A=o+g+w/2-v,T=Math.acos(Math.min(m/2/v,1)),P=Math.PI-T;e.absarc(b,A,v,P,T,!0)}else e.lineTo(a+y-m/2,o-s+w),e.lineTo(a+y+m/2,o-s+w);e.lineTo(a+y+m/2,o-s)}}}}catch(j){h.e(j)}finally{h.f()}}Ht?e.lineTo(a+c-r,o-s+fe):e.lineTo(a+c-r,o-s);Wt?(e.lineTo(a+c-r,o-s+Mt),e.lineTo(a-c+i,o-s+Dt)):L?(U?e.lineTo(a+c-r,U-s):e.lineTo(a+c-r,o+s),G&&e.lineTo(G[0]*t,G[1]-s),N&&e.lineTo(N[0]*t,N[1]-s),J&&e.lineTo(J[0]*t,J[1]-s),E?e.lineTo(a-c+i,E-s):e.lineTo(a-c+i,o+s)):(e.lineTo(a+c-r,o+s),e.lineTo(a-c+i,o+s));e.closePath()}(e,b,S,0,0,0,0),tt.forEach((function(t){if(t.type===V.Window&&t.id!==ut.current&&t.lx>0&&t.lz>0){var l=t,a=new Me.Shape,o=t.lx*b,i=t.lz*S,r=t.cx*b,n=t.cz*S;if(l.windowType)switch(l.windowType){case Yt.Arched:rl(a,o,i,r,n,l.archHeight);break;case Yt.Polygonal:var c,s=null!==(c=l.polygonTop)&&void 0!==c?c:Fg,d=Object(u.a)(s,2);nl(a,o,i,r,n,d[0]*o,d[1]);break;case Yt.Default:default:il(a,o,i,r,n)}else il(a,o,i,r,n);e.holes.push(a)}})),e}),[b,S,ne,se,fe,Dt,Mt,tt,E,U,N,J,G]),Jt=Object(r.useMemo)((function(){var e=new Me.Shape,t=S,l=S/2;if(Ht)e.moveTo(-ht+At,-l+se),e.lineTo(ht-Tt,-l+fe);else{e.moveTo(-ht+At,-l);var a,o=tt.filter((function(e){return e.type===V.Door})).sort((function(e,t){return e.cx-t.cx})),i=Object(f.a)(o);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(r.id!==ut.current){var n=r.cx*b,c=r.cz*t,s=r.lx*b,d=r.lz*t;if(r.doorType===hy.Default)e.lineTo(n-s/2,-l),e.lineTo(n-s/2,-l+d),e.lineTo(n+s/2,-l+d),e.lineTo(n+s/2,-l);else{var h=Math.min(r.archHeight,d,s/2);if(e.lineTo(n-s/2,-l),h>.1){e.lineTo(n-s/2,d/2-l-h);var p=h/2+Math.pow(s,2)/(8*h),y=n,g=c+d/2-p,m=Math.acos(Math.min(s/2/p,1)),w=Math.PI-m;e.absarc(y,g,p,w,m,!0)}else e.lineTo(n-s/2,-l+d),e.lineTo(n+s/2,-l+d);e.lineTo(n+s/2,-l)}}}}catch(T){i.e(T)}finally{i.f()}e.lineTo(ht-Tt,-l)}if(Wt){var x=Mt-Dt,v=(b-Tt)*x/b,A=At*x/b;e.lineTo(ht-Tt,-l+Dt+v),e.lineTo(-ht+At,-l+Dt+A)}else L?(U?e.lineTo(ht-Tt,U-l):e.lineTo(ht-Tt,l),G&&e.lineTo(G[0]*b,G[1]-l),N&&e.lineTo(N[0]*b,N[1]-l),J&&e.lineTo(J[0]*b,J[1]-l),E?e.lineTo(-ht+At,E-l):e.lineTo(-ht+At,l)):(e.lineTo(ht-Tt,l),e.lineTo(-ht+At,l));return e.closePath(),tt.forEach((function(t){if(t.type===V.Window&&t.id!==ut.current&&t.lx>0&&t.lz>0){var l=t,a=new Me.Shape,o=t.lx*b,i=t.lz*S,r=t.cx*b,n=t.cz*S;if(l.windowType)switch(l.windowType){case Yt.Arched:rl(a,o,i,r,n,l.archHeight);break;case Yt.Polygonal:var c,s=null!==(c=l.polygonTop)&&void 0!==c?c:Fg,d=Object(u.a)(s,2);nl(a,o,i,r,n,d[0]*o,d[1]);break;case Yt.Default:default:il(a,o,i,r,n)}else il(a,o,i,r,n);e.holes.push(a)}})),e}),[b,S,ne,se,fe,Dt,Mt,At,Tt,tt,L,E,U,N,J,G]),Gt=Object(r.useMemo)((function(){return Ht?(Dt+Mt)/2-xt:xt}),[xt,Ht,Dt,Mt]),Xt=Object(r.useMemo)((function(){var e=Mt-Dt;return!Ht||Math.abs(e)<.01?0:Math.atan2(e,b)}),[b,Ht,Dt,Mt]),Bt=Object(r.useMemo)((function(){var e=new Me.Shape;if(!Ht||Math.abs(Xt)<1e-4)return function(e,t,l,a,o){var i=t/2,r=l/2;e.moveTo(-i,-r),e.lineTo(i,-r),e.lineTo(i-o,r),e.lineTo(-i+a,r),e.closePath()}(e,b,T,At,Tt),e;var t=b/2,l=T/2,a=Math.cos(Xt),o=t/a,i=(t-At)/a,r=(t-Tt)/a;return e.moveTo(-o,-l),e.lineTo(o,-l),e.lineTo(r,l),e.lineTo(-i,l),e.closePath(),e}),[b,T,At,Tt,Ht,Xt]),Kt=Object(r.useMemo)((function(){var e=[],t=b/2,l=S/2;return Ht?(e.push({x:-t+At,y:-l+zt}),e.push({x:t-Tt,y:-l+Rt})):(e.push({x:-t,y:-l}),e.push({x:t,y:-l})),Wt?(e.push({x:t-Tt,y:-l+Mt}),e.push({x:-t+At,y:-l+Dt})):(U?e.push({x:t,y:U-l}):e.push({x:t,y:l}),G&&e.push({x:G[0]*b,y:G[1]-l}),N&&e.push({x:N[0]*b,y:N[1]-l}),J&&e.push({x:J[0]*b,y:J[1]-l}),E?e.push({x:-t,y:E-l}):e.push({x:-t,y:l})),e}),[b,S,ne,zt,Rt,Dt,Mt,E,U,N,J,G]),qt=Object(r.useMemo)((function(){var e=[],t=0,l=0;ne===Ue.Partial&&(l=se+ht*(t=(fe-se)/b));if(Q===Ne.Stud){for(var a=te/2-ht;a<=ht;)e.push([a,t*a+l]),a+=_;a=ht-te/2,e.push([a,t*a+l])}else if(Q===Ne.Pillar){for(var o=-ht;o<=ht;)e.push([o,t*o+l]),o+=_;e.push([ht,t*ht+l])}return e}),[Q,te,_,b,T,S,se,fe]),Qt=Object(r.useMemo)((function(){return{id:m,parentId:F,cx:w,cy:x,hx:ht,hy:pt,angle:j,selected:Te}}),[m,F,w,x,ht,pt,j,Te]),Zt=Object(r.useMemo)((function(){return{leftPoint:ve,rightPoint:be,ly:T,copingsWidth:xe.copingsWidth}}),[ve,be,T,xe.copingsWidth]),_t=Object(r.useMemo)((function(){return lt&<.parapet&<.parapet.display?{leftPoint:lt.leftPoint,rightPoint:lt.rightPoint,ly:lt.ly,copingsWidth:lt.parapet.copingsWidth}:null}),[null===lt||void 0===lt?void 0:lt.leftPoint,null===lt||void 0===lt?void 0:lt.rightPoint,null===lt||void 0===lt?void 0:lt.ly,null===lt||void 0===lt||null===(a=lt.parapet)||void 0===a?void 0:a.copingsWidth,null===lt||void 0===lt||null===(i=lt.parapet)||void 0===i?void 0:i.display]),$t=Object(r.useMemo)((function(){return at&&at.parapet&&at.parapet.display?{leftPoint:at.leftPoint,rightPoint:at.rightPoint,ly:at.ly,copingsWidth:at.parapet.copingsWidth}:null}),[null===at||void 0===at?void 0:at.leftPoint,null===at||void 0===at?void 0:at.rightPoint,null===at||void 0===at?void 0:at.ly,null===at||void 0===at||null===(n=at.parapet)||void 0===n?void 0:n.copingsWidth,null===at||void 0===at||null===(c=at.parapet)||void 0===c?void 0:c.display]);function el(e,t){var l=t.cx,a=t.cy,o=t.cz;if(ot&&void 0!==bt){var i=Tw.wallAbsolutePosition(new Me.Vector3(l,a,o),ot).setZ(S/2+ot.lz);return(new Me.Vector3).subVectors(e,i).applyEuler(new Me.Euler(0,0,-bt))}return new Me.Vector3}function tl(e){for(var t=[],l=-1;l<=1;l+=2)for(var a=-1;a<=1;a+=2){var o=l,i=l*a;switch(e.type){case V.Window:var r=e.cx*b,n=e.cz*S,c=r+o*(e.lx*b/2),s=n+i*(e.lz*S/2);t.push({x:c,y:s});break;case V.Door:var d=e.cx*b,f=e.cz*S,h=d+o*(e.lx*b/2),p=f+i*(e.lz*S/2);t.push({x:h,y:p});break;case V.SolarPanel:var y=e.cx*b,g=e.cz*S,m=y+o*(e.lx/2),w=g+i*(e.ly/2);t.push({x:m,y:w})}}if(e.type===V.Window&&e.windowType===Yt.Polygonal){var x,v=null!==(x=e.polygonTop)&&void 0!==x?x:[0,0],A=Object(u.a)(v,2),T=A[0],P=A[1];t.push({x:e.cx*b+T*e.lx*b,y:e.cz*S+e.lz*S/2+P})}return t}function ll(e,t,l,a,o){if(l<.1||a<.1)return ut.current=e,!1;if(l>b||!L&&a>S)return ut.current=e,!1;l+=.1,a+=.1;var i,r=Object(f.a)(tt);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.id!==e&&n.type!==V.Polygon){for(var c=tl(n),s=[],d=-1;d<=1;d+=2)for(var h=-1;h<=1;h+=2){var p=t.x+d*l/2,y=t.z+d*h*a/2;if(s.push({x:p,y:y}),Tw.isPointInside(p,y,c))return ut.current=e,!1}if(o){var g=Object(u.a)(o,2),m=g[0],w=g[1],x=t.x+m*l,v=t.z+a/2+w;if(s.push({x:x,y:v}),Tw.isPointInside(x,v,c))return ut.current=e,!1}var A,T=Object(f.a)(c);try{for(T.s();!(A=T.n()).done;){var P=A.value;if(Tw.isPointInside(P.x,P.y,s))return ut.current=e,!1}}catch(j){T.e(j)}finally{T.f()}}}}catch(j){r.e(j)}finally{r.f()}return ut.current=null,!0}function al(e,t,l,a,o){return!!Tw.isElementInsideWall(t,l,a,Kt,o)||(ut.current=e,!1)}function ol(e,t,l,a){var o=Object(u.a)(a,2),i=o[0],r=o[1],n=e.x+t*i,c=e.z+l/2+r;return!!Tw.isPointInside(n,c,function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!Ht)return Tw.getWallVertices(e,t);var l=e.lx/2,a=e.lz/2,o={x:-l-t,y:e.leftUnfilledHeight-a-t},i={x:l+t,y:e.rightUnfilledHeight-a-t},r={x:-l-t,y:e.leftTopPartialHeight-a+t},n={x:l+t,y:e.rightTopPartialHeight-a+t},c=[];return c.push(r,o,i,n),Wt||(e.centerRightRoofHeight&&c.push({x:e.centerRightRoofHeight[0]*e.lx,y:e.centerRightRoofHeight[1]-a+t}),e.centerRoofHeight&&c.push({x:e.centerRoofHeight[0]*e.lx,y:e.centerRoofHeight[1]-a+t}),e.centerLeftRoofHeight&&c.push({x:e.centerLeftRoofHeight[0]*e.lx,y:e.centerLeftRoofHeight[1]-a+t})),c}(y,0))}function il(e,t,l){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i=t/2,r=l/2;e.moveTo(a-i,o-r),e.lineTo(a+i,o-r),e.lineTo(a+i,o+r),e.lineTo(a-i,o+r),e.closePath()}function rl(e,t,l,a,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=t/2,n=l/2,c=Math.min(i,l,r);if(e.moveTo(a-r,o-n),e.lineTo(a+r,o-n),e.lineTo(a+r,o+n-c),c>0){var s=c/2+Math.pow(t,2)/(8*c),d=a,u=o+n-s,f=Math.acos(Math.min(1,r/s)),h=Math.PI-f;e.absarc(d,u,s,f,h,!1)}else e.lineTo(a-r,o+n);e.closePath()}function nl(e,t,l,a,o,i,r){var n=t/2,c=l/2;e.moveTo(a-n,o-c),e.lineTo(a+n,o-c),e.lineTo(a+n,o+c),e.lineTo(a+i,o+c+r),e.lineTo(a-n,o+c),e.closePath()}function cl(e){return e=Ew.getState().enableFineGrid?function(e){var t=parseFloat((Math.round(e.x/gt)*gt).toFixed(1)),l=parseFloat((Math.round(e.z/gt)*gt).toFixed(1));return new Me.Vector3(t,e.y,l)}(e):function(e){var t=parseFloat((Math.round(e.x/mt)*mt).toFixed(1)),l=parseFloat((Math.round(e.z/mt)*mt).toFixed(1));return new Me.Vector3(t,e.y,l)}(e)}function sl(e,t){var l=(new Me.Vector3).subVectors((new Me.Vector3).fromArray(e.leftPoint).setZ(0),(new Me.Vector3).fromArray(e.rightPoint).setZ(0)),a=(new Me.Vector3).subVectors((new Me.Vector3).fromArray(t.rightPoint).setZ(0),(new Me.Vector3).fromArray(t.leftPoint).setZ(0)).angleTo(l);return Math.abs(a-Math.PI/2)<.087}function dl(e,t,l,a,o){Ew.getState().set((function(i){var r,n=Object(f.a)(i.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.id===e){var s=Object(u.a)(t,3);c.cx=s[0],c.cy=s[1],c.cz=s[2];var d=Object(u.a)(l,3);if(c.lx=d[0],c.ly=d[1],c.lz=d[2],void 0!==a&&(c.type===V.Window||c.type===V.Door)&&(c.archHeight=a),void 0!==o&&c.type===V.Window){var p=c;p.windowType===Yt.Polygonal&&(p.polygonTop=Object(h.a)(o))}break}}}catch(y){n.e(y)}finally{n.f()}}))}function ul(e){return e.type===V.Window&&e.windowType===Yt.Polygonal&&e.polygonTop}function fl(e){var t={name:"Add",timestamp:Date.now(),addedElement:e,undo:function(){Ew.getState().removeElementById(e.id,!1)},redo:function(){Ew.getState().set((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement,e.deletedRoofId=null}))}};ze(t)}function hl(){Ew.getState().set((function(e){e.addedWindowId=null,e.addedDoorId=null}))}function pl(e){return e.intersections.length>0&&e.intersections[0].object===e.eventObject}function yl(e,t,l){if(Ew.getState().moveHandleType&&t&&function(e){if(!e)return!1;switch(e.type){case V.Window:case V.Door:case V.SolarPanel:case V.Light:case V.Sensor:return!0}return!1}(t)&&t.parentId!==e){var a=l.intersections.filter((function(e){return e.eventObject.name.includes(pp.WALL_OUTSIDE_SURFACE_MESH_NAME)||e.eventObject.name.includes(Og)||e.eventObject.name===Om}));if(!(a.length>0&&(a[0].eventObject.name===Om||a[0].eventObject.name.includes(Og))))return!0}return!1}function gl(e){if(Ew.getState().resizeHandleType!==K.Arch)return!1;if(e.type===V.Window){var t=e;return t.windowType===Yt.Arched&&void 0!==t.archHeight}if(e.type===V.Door){var l=e;return l.doorType===hy.Arched&&void 0!==l.archHeight}}function ml(e,t,l,a,o){var i,r=arguments.length>5&&void 0!==arguments[5]&&arguments[5],n=(new Me.Vector3).subVectors(t,e).normalize(),c=r?[t.y,e.y]:[e.y,t.y],s=Object(u.a)(c,2),d=s[0],f=s[1];if(d0;){o++;var c=l.get(n.rightJoints[0]);if(!c)break;if(t&&c.lz!==r.lz)return!1,Qh(me.t("message.WallsAreNotAtSameHeight",i)),!1;if(e&&!sl(n,c))return!1,Qh(me.t("message.WallsAreNotPerpendicular",i)),!1;if(c.id===r.id){a=!0;break}if(n=c,o>100)break}return a?!e||4===o||(Qh(me.t("message.WallsNumberNeedToBeFour",i)),!1):(Qh(me.t("message.WallsAreNotConnected",i)),!1)}function vl(){return ft.current&&ft.current.status===Mm.SettingStartPoint&&Ew.getState().moveHandleType===B.Mid}function bl(){return!(Ew.getState().moveHandleType||Ew.getState().resizeHandleType||Re())}function Al(e,t,l){var a,o;!function(e){Ft.x=e.offsetX/$e.domElement.clientWidth*2-1,Ft.y=-e.offsetY/$e.domElement.clientHeight*2+1,kt.setFromCamera(Ft,_e)}(e);var i=el(null!==(a=null===(o=(t?kt.intersectObjects([t]):e.intersections)[0])||void 0===o?void 0:o.point)&&void 0!==a?a:e.point,y),r=l?cl(i.clone().add(l)).sub(l):cl(i);return{relativePointer:i,pointerOnGrid:r}}function Tl(e){if(e){var t=e.id,l=e.type;Pe((function(e){e.elements=e.elements.filter((function(e){return e.id!==t})),e.selectedElement=null,e.moveHandleType=null,e.objectTypeToAdd=l,e.addedWindowId=null,e.addedDoorId=null})),ft.current=null}}function Pl(e){if(!e)return[0,0];switch(e.type){case V.Window:var t=Tf.getState().oldParentId;if(e.parentId!==t){var l=Ew.getState().elements.find((function(e){return e.id===t}));return l?[e.lx*l.lx/2,e.lz*l.lz/2]:[0,0]}return[e.lx*b/2,e.lz*S/2];case V.Door:return[e.lx*b/2,e.lz*S/2];case V.SolarPanel:return[e.lx/2,e.ly/2]}return[km,km]}function Sl(){var e=[];if(N){var t=N[0];if(.5===t&&void 0!==E)return e.push(new Me.Vector3(ht,N[1]-xt),new Me.Vector3(-ht,E-xt)),e;if(-.5===t&&void 0!==U)return e.push(new Me.Vector3(ht,U-xt),new Me.Vector3(-ht,N[1]-xt)),e}return void 0!==U?e.push(new Me.Vector3(ht,U-xt)):e.push(new Me.Vector3(ht,xt)),void 0!==G&&e.push(new Me.Vector3(G[0]*b,G[1]-xt)),void 0!==N&&e.push(new Me.Vector3(N[0]*b,N[1]-xt)),void 0!==J&&e.push(new Me.Vector3(J[0]*b,J[1]-xt)),void 0!==E?e.push(new Me.Vector3(-ht,E-xt)):e.push(new Me.Vector3(-ht,xt)),e}function jl(e,t){var l=null===t||void 0===t?void 0:t.ignorePadding,a=(null===t||void 0===t?void 0:t.elementHalfSize)?Object(h.a)(t.elementHalfSize):[0,0],o=l?0:km,i=l?0:km+At,r=l?0:km+Tt,n=Object(u.a)(a,2),c=n[0],s=n[1],d=-ht+c+i,f=ht-c-r,p=-xt+s+o,y=xt-s-o,g=e.clone();if(!Wt&&se===fe&&pe===ge&&(!L||E===U&&void 0===N&&void 0===J&&void 0===G)){var m=Ht?se:0,w=S-(Ht?Dt:S);return g.setX(Tw.clamp(e.x,d,f)),g.setZ(Tw.clamp(e.z,p+m,y-w)),g}var x=function(e,t,l,a,o){var i=[],r=new Me.Vector3(-ht,-xt+zt),n=new Me.Vector3(ht,-xt+Rt);if(ml(r,n,e,t,o,!0),i.push({start:new Me.Vector3(l,xt),end:new Me.Vector3(l,r.y)}),i.push({start:r.clone(),end:n.clone()}),i.push({start:new Me.Vector3(a,n.y),end:new Me.Vector3(a,xt)}),Wt){var c=new Me.Vector3(ht,-xt+Mt),s=new Me.Vector3(-ht,-xt+Dt);ml(c,s,e,t,o),i.push({start:c.clone(),end:s.clone()})}else for(var d=Sl(),u=1;u=z.x&&T<=R.x){var D=(R.y-z.y)/(R.x-z.x);b=D*T+(-D*z.x+z.y);break}}var M=new Me.Vector3(-ht,-xt+zt),W=new Me.Vector3(ht,-xt+Rt),I=(W.y-M.y)/(W.x-M.x);A=I*T+(-I*M.x+M.y)}var C=v.y>b;if(function(e,t){var l=e.getPoints().map((function(e){return{x:e.x,y:e.y}}));return!Tw.isPointInside(t.x,t.y,l)}(x,v)){var O=function(e,t){for(var l=e.getPoints(),a=t,o=1/0,i=0;i0){var r=Tw.calculatePolygonCentroid(i.vertices),n=-t.x/b-r.x,c=-t.z/S-r.y,s=i.vertices.map((function(e){return{x:e.x+n,y:e.y+c}}));a.vertices=s}}}))}function zl(e,t,l){var a=e.lx*b,o=e.lz*S,i=o/2-Math.min(e.archHeight,a/2,o),r=Math.max(0,Math.min(t.z-l.z-i,a/2)),n=i+r+o/2;return{newLz:n,newCz:new Me.Vector3(e.cx*b,e.cy,e.cz*S+(n-o)/2).z,newArchHeight:r}}function Rl(e){if(2!==e.button)if(vl()){Et.getState().setEnableOrbitController(!1),Xe(!0);var t=jl(Al(e,it.current).pointerOnGrid);Pe((function(e){var l,a;e.moveHandleType=null,(null===(l=ft.current)||void 0===l?void 0:l.type)===V.Window?(e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(t)):(null===(a=ft.current)||void 0===a?void 0:a.type)===V.Door&&(e.resizeHandleType=K.UpperRight,e.resizeAnchor.copy(t).setZ(-S/2))})),ft.current.status=Mm.SettingEndPoint}else if(pl(e)){if(Ew.getState().objectTypeToAdd!==V.None)Dl(e.point,!0);else Ew.getState().groupActionMode?(Pe((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===F}}catch(o){l.e(o)}finally{l.f()}e.multiSelectionsMode||e.selectedElementIdSet.clear(),e.selectedElementIdSet.has(F)?e.selectedElementIdSet.delete(F):e.selectedElementIdSet.add(F)})),e.stopPropagation()):bl()&&Ew.getState().selectMe(m,e,X.Select)}}function Dl(e,t){if(ot&&Ew.getState().objectTypeToAdd){var l=null;switch(Ew.getState().objectTypeToAdd){case V.PyramidRoof:!L&&xl(!1,!0)&&(l=Vl.makePyramidRoof([y.id],ot));break;case V.GableRoof:!L&&xl(!1,!1)&&(l=Vl.makeGableRoof([y.id],ot));break;case V.HipRoof:!L&&xl(!1,!0)&&(l=Vl.makeHipRoof([y.id],ot,b/2));break;case V.GambrelRoof:!L&&xl(!1,!1)&&(l=Vl.makeGambrelRoof([y.id],ot));break;case V.MansardRoof:!L&&xl(!1,!0)&&(l=Vl.makeMansardRoof([y.id],ot));break;case V.SolarPanel:if(e&&t){var a,o,i,r,n=el(e,y),c=y.relativeAngle-vt,s=Ew.getState().actionState;l=Vl.makeSolarPanel(y,Ew.getState().getPvModule(null!==(a=s.solarPanelModelName)&&void 0!==a?a:"SPR-X21-335-BLK"),n.x/b,0,n.z/S,null!==(o=s.solarPanelOrientation)&&void 0!==o?o:$.landscape,null!==(i=s.solarPanelPoleHeight)&&void 0!==i?i:1,null!==(r=s.solarPanelPoleSpacing)&&void 0!==r?r:3,0,0,new Me.Vector3(Math.cos(c),Math.sin(c),0),[0,0,0],s.solarPanelFrameColor,void 0,void 0,V.Wall)}break;case V.Sensor:if(e&&t){var d=el(e,y),u=y.relativeAngle-vt;l=Vl.makeSensor(y,(d.x-.05)/b,0,(d.z-.05)/S,new Me.Vector3(Math.cos(u),Math.sin(u),0),[0,0,0])}break;case V.Light:if(e&&t){var f=el(e,y),h=y.relativeAngle-vt,p=Ew.getState().actionState;l=Vl.makeLight(y,2,p.lightDistance,p.lightIntensity,p.lightColor,(f.x-.05)/b,0,(f.z-.05)/S,new Me.Vector3(Math.cos(h),Math.sin(h),0),[0,0,0])}}l&&(fl(l),Pe((function(e){e.elements.push(l),l&&l.type===V.Roof&&e.addedRoofIdSet.add(l.id),e.actionModeLock||(e.objectTypeToAdd=V.None)})))}}function Ml(e,t,l){st.current||(He(m,e,X.ContextMenu),Pe((function(a){e.intersections.length>0&&e.intersections[0].object===t&&(a.contextMenuObjectType=V.Wall,l&&a.pastePoint.copy(e.intersections[0].point))})),e.stopPropagation())}function Wl(e){if(2!==e.button){var t=Ew.getState().objectTypeToAdd;vl()||Re()||!pl(e)||t!==V.None?Vm.isTypeRoof(t)&&Rl(e):Ew.getState().groupActionMode?(Pe((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.id===F?a.selected=!0:a.selected=!1}}catch(o){l.e(o)}finally{l.f()}})),e.stopPropagation()):bl()&&Ew.getState().selectMe(m,e,X.Select)}}function Il(e){2!==e.button&&0!==e.intersections.length&&e.intersections[0].object===e.eventObject&&(Ew.getState().groupActionMode?Pe((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.selected=a.id===F}}catch(o){l.e(o)}finally{l.f()}e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(F)})):(function(e){return!(2===e.button||Ew.getState().addedWallId||dt.current||Ew.getState().moveHandleType||Ew.getState().resizeHandleType||Ew.getState().objectTypeToAdd!==V.None||Te||Re())}(e)&&(Pe((function(e){e.contextMenuObjectType=null})),He(m,e,X.Select)),Dl(),e.stopPropagation()))}function Cl(e){e.intersections.length>0&&e.intersections[0].object===e.eventObject&&(Pe((function(e){e.contextMenuObjectType=V.Wall})),He(m,e,X.ContextMenu),e.stopPropagation())}return Object(r.useEffect)((function(){ft.current&&ft.current.id===Le&&(ft.current=null,hl())}),[Le]),Object(r.useEffect)((function(){if(y&&Ye){var e=De(y.id);if(e){var t=Tw.fetchHeatmapTexture(e,null!==Fe&&void 0!==Fe?Fe:5);if(t){t.wrapS=Me.RepeatWrapping,t.wrapT=Me.RepeatWrapping;var l=S===Nt?0:(1-S/Nt)/2;t.offset.set(-b/2,-Nt/2-l),t.center.set(b/2,Nt/2),t.repeat.set(1/b,1/Nt),Qe(t)}}}}),[Ye,Fe]),Object(r.useEffect)((function(){L&&(Ce.has(L)||Oe.has(L))&&Ew.getState().set((function(e){var t,l=new Set,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.id===m&&o.type===V.Wall){var i=o;i.roofId=null,i.leftRoofHeight=void 0,i.rightRoofHeight=void 0,i.centerRoofHeight=void 0,i.centerLeftRoofHeight=void 0,i.centerRightRoofHeight=void 0,tt.length>0&&function(){var t=Vm.getWallPoints2D(i);tt.forEach((function(a){if(a.type!==V.Polygon){var o=a.type===V.Door,i=a.type===V.SolarPanel,r=i?a.lx-.01:a.lx*b,n=i?a.ly-.01:a.lz*S,c=new Me.Vector3(a.cx*b,0,a.cz*S);Tw.isElementInsideWall(c,r,n,t,o)||(l.add(a.id),e.autoDeletedChild?e.autoDeletedChild.push(a):e.autoDeletedChild=[a])}}))}();break}}}catch(r){a.e(r)}finally{a.f()}l.size>0?e.elements=e.elements.filter((function(e){return!l.has(e.id)})):null===e.autoDeletedChild&&(e.autoDeletedChild=[])}))}),[L,Ce,Oe]),Object(gf.jsxs)(gf.Fragment,{children:[(ie>0||Q===Ne.Default)&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("mesh",{name:"Wall Simulation Mesh",uuid:m,userData:{simulation:!0},rotation:[vt,0,0],castShadow:!1,receiveShadow:!1,visible:!1,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Vt]}),Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})]}),Object(gf.jsxs)("mesh",{name:"".concat(pp.WALL_OUTSIDE_SURFACE_MESH_NAME," ").concat(m),ref:it,rotation:[vt,0,0],castShadow:It,receiveShadow:Ie,onContextMenu:function(e){Ml(e,it.current,!0)},onPointerMove:function(e){if(function(e,t){var l=e.intersections.filter((function(e){return e.object.name!==Fm}));return l.length>0&&l[0].object.name==="".concat(pp.WALL_OUTSIDE_SURFACE_MESH_NAME," ").concat(t)}(e,m)){var t=Ew.getState().objectTypeToAdd;if((o=t)===V.Window||o===V.Door)!function(e){e&&(ft.current={id:e.id,type:e.type,status:Mm.SettingStartPoint}),Pe((function(t){e&&(t.elements.push(e),t.selectedElement=e,t.selectedElementIdSet.clear(),t.selectedElementIdSet.add(e.id),e.type===V.Window?t.addedWindowId=e.id:e.type===V.Door&&(t.addedDoorId=e.id)),t.moveHandleType=B.Mid,t.objectTypeToAdd=V.None}))}(function(e,t){if(!it.current)return null;var l=Al(e,it.current).pointerOnGrid,a=l.x/y.lx,o=l.z/y.lz;return t===V.Window?Vl.makeWindow(y,a,0,o,V.Wall):t===V.Door?Vl.makeDoor(y):null}(e,t));if(vl()){var l=jl(Al(e,it.current).pointerOnGrid);Hl(ft.current.id,l)}var a=Ew.getState().selectedElement;yl(m,a,e)&&(Pe((function(t){var l=t.elements.find((function(e){return e.id===(null===a||void 0===a?void 0:a.id)}));if(l&&(l.type!==V.SolarPanel||void 0!==l.parentType)){if(l.type===V.Window){var o=t.elements.find((function(e){return e.id===l.parentId}));if(o){var i=l.lx*o.lx,r=l.lz*o.lz;l.lx=i/b,l.lz=r/S}}var n=Al(e,it.current).pointerOnGrid,c=Pl(l),s=jl(n,{elementHalfSize:c,ignorePadding:l.type===V.SolarPanel});ll(l.id,s,2*c[0],2*c[1]),l.cx=s.x/b,l.cz=s.z/S,l.parentId=m,l.foundationId=F,t.selectedElement&&(t.selectedElement.parentId=m,t.selectedElement.foundationId=F),l.type===V.Window?(l.cy=l.id===ut.current?-.01:0,l.tint=l.id===ut.current?"red":t.selectedElement.tint):l.type===V.SolarPanel&&(l.color=l.id===ut.current?"red":"#fff",l.parentType=V.Wall)}})),ke("showWallIntersectionPlaneId",m))}else vl()&&Tl(ft.current);var o},onPointerDown:Rl,onPointerUp:function(){ft.current&&ft.current.status===Mm.SettingStartPoint&&(Pe((function(e){e.elements.pop(),e.addedDoorId=null,e.addedWindowId=null,e.moveHandleType=null,e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null)},onPointerOut:function(){vl()&&Tl(ft.current),ut.current=null},children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Vt]}),Ye&&qe?Object(gf.jsx)("meshBasicMaterial",{attach:"material",map:qe,color:"white",opacity:ie,transparent:Pt}):Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:R===ue.Default||R===ue.NoTexture?M:"white",map:Ae,transparent:Pt,opacity:ie})]}),Object(gf.jsxs)("mesh",{rotation:[vt,0,0],position:[0,.05,0],castShadow:It,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(gf.jsx)("meshStandardMaterial",{color:"white",side:Me.BackSide,transparent:Pt,opacity:ie})]}),Object(gf.jsxs)("mesh",{name:"Inside Wall",ref:rt,position:[0,T,0],rotation:[vt,0,0],castShadow:It,receiveShadow:Ie,onPointerDown:Wl,onContextMenu:function(e){Ml(e,rt.current)},children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(gf.jsx)(Ym,{transparent:Pt,color:M,opacity:ie})]}),Object(gf.jsxs)("mesh",{rotation:[vt,0,0],position:[0,T-.01,0],receiveShadow:!0,children:[Object(gf.jsx)("shapeBufferGeometry",{args:[Jt]}),Object(gf.jsx)("meshStandardMaterial",{color:"white",side:Me.FrontSide,transparent:Pt,opacity:ie})]}),(!L||Wt)&&!Ct&&Object(gf.jsx)("mesh",{name:"Top Wall",ref:nt,material:Ut,position:[0,pt,Gt],rotation:[0,-Xt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Wl,onContextMenu:function(e){Ml(e,nt.current)},children:Object(gf.jsx)("shapeBufferGeometry",{args:[Bt]})}),0===At&&Object(gf.jsx)(Lt.f,{args:[Dt-zt,T],material:Ut,position:[.01-ht,pt,-xt+zt+(Dt-zt)/2],rotation:[0,vt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Wl}),0===Tt&&Object(gf.jsx)(Lt.f,{args:[Mt-Rt,T],material:Ut,position:[ht-.01,pt,-xt+Rt+(Mt-Rt)/2],rotation:[0,vt,0],castShadow:It,receiveShadow:Ie,onPointerDown:Wl}),(Ge||Ee===m)&&(null===(s=Ew.getState().selectedElement)||void 0===s?void 0:s.parentId)===m&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.f,{ref:ct,name:Fm,args:[1e4,1e4],position:[0,T/3,0],rotation:[vt,0,0],onPointerMove:function(e){var t,l=null!==(t=Ew.getState().selectedElement)&&void 0!==t?t:je();if((null===l||void 0===l?void 0:l.parentId)===y.id)if(Ew.getState().moveHandleType){var a=l.type!==V.Polygon?new Me.Vector3(-l.lx/2*b,0,l.lz/2*S):void 0,o=Al(e,ct.current,a),i=(o.relativePointer,o.pointerOnGrid),r=Pl(l),n=jl(i,{elementHalfSize:r,ignorePadding:l.type===V.SolarPanel}),c=2*r[0],s=2*r[1];if(l.type!==V.SolarPanel&&al(l.id,n,c,s),l.type!==V.Polygon){var d,f=!0,h=void 0;if(l.type===V.Window&&l.windowType===Yt.Polygonal)f=ol(n,c,s,h=null!==(d=l.polygonTop)&&void 0!==d?d:Fg);var p=ll(l.id,n,c,s,h);ut.current=f&&p?null:l.id}Hl(l.id,n)}else if(Ew.getState().resizeHandleType){var g=Al(e,ct.current),m=g.relativePointer,w=g.pointerOnGrid,x=Ew.getState().resizeHandleType,v=Ew.getState().resizeAnchor;switch(l.type){case V.Window:var A=l,T=jl(w,{resizeAnchor:v});if(gl(A)){var P=zl(A,T,v),j=P.newLz,H=P.newCz,z=P.newArchHeight,R=new Me.Vector3(A.cx*b,0,H);ll(A.id,R,A.lx*b,j),al(A.id,R,A.lx*b,j),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.lz=j/S,t.cz=H/S,t.archHeight=z,t.cy=t.id===ut.current?-.01:.3,t.tint=t.id===ut.current?"red":A.tint)}))}else if(x===K.Upper){var D=new Me.Vector3(A.cx*b,0,A.cz*S),M=A.lx*b,W=A.lz*S,I=[Tw.clamp((w.x-v.x)/M,-.5,.5),Math.max(0,w.z-v.z)];ll(A.id,D,M,W,I)&&ol(D,M,W,I)||(ut.current=A.id),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.polygonTop=[].concat(I),t.cy=t.id===ut.current?-.01:.3,t.tint=t.id===ut.current?"red":A.tint)}))}else{var C,O=wl(0,T,v),F=O.dimensionXZ,k=O.positionXZ,Y=new Me.Vector3(k.x,0,k.z),L=!0,E=void 0;if(A.windowType===Yt.Polygonal)E=null!==(C=A.polygonTop)&&void 0!==C?C:Fg,L=ol(Y,F.x,F.z,E);ll(A.id,Y,F.x,F.z,E)&&L&&al(A.id,Y,F.x,F.z)||(ut.current=A.id),Pe((function(e){var t=e.elements.find((function(e){return e.id===A.id}));t&&(t.lx=F.x/b,t.lz=F.z/S,t.cx=k.x/b,t.cz=k.z/S,t.cy=t.id===ut.current?-.01:.3,t.tint=t.id===ut.current?"red":A.tint)}))}break;case V.Door:var U=l,N=jl(w,{resizeAnchor:v});if(gl(U)){var J=zl(U,N,v),G=J.newLz,X=J.newCz,B=J.newArchHeight,q=new Me.Vector3(U.cx*b,0,X);ll(U.id,q,U.lx*b,G),al(U.id,q,U.lx*b,G,!0),Pe((function(e){var t=e.elements.find((function(e){return e.id===U.id}));t&&(t.lz=G/S,t.cz=X/S,t.archHeight=B,t.color=t.id===ut.current?wt:l.color)}))}else{var Q=wl(0,N,v),Z=Q.dimensionXZ,_=Q.positionXZ,$=new Me.Vector3(_.x,0,_.z);ll(U.id,$,Z.x,Z.z),al(U.id,$,Z.x,Z.z,!0),Pe((function(e){var t=e.elements.find((function(e){return e.id===U.id}));t&&(t.cx=_.x/b,t.lx=Z.x/b,t.cz=(N.z-S/2)/2/S,t.lz=(N.z+S/2)/S,t.color=t.id===ut.current?wt:l.color)}))}break;case V.SolarPanel:var ee=l,te=Em(ee),le=Object(u.a)(te,2),ae=le[0],oe=le[1];if(x===K.Lower||x===K.Upper){var ie=Math.max(1,Math.round(Math.abs(m.z-v.z)/oe))*oe,re=new Me.Vector3(0,0,m.z-v.z).normalize().multiplyScalar(ie),ne=(new Me.Vector3).addVectors(v,re.clone().divideScalar(2));if(!Tw.isElementInsideWall(ne,ee.lx-.01,ie-.01,Kt))return;ll(ee.id,ne,ee.lx,Math.abs(re.z)),Pe((function(e){var t=e.elements.find((function(e){return e.id===ee.id}));t&&(t.cz=ne.z/S,t.ly=Math.abs(re.z),t.color=t.id===ut.current?"red":"#fff")}))}else if(x===K.Left||x===K.Right){var ce=Math.max(1,Math.round(Math.abs(m.x-v.x)/ae))*ae,se=new Me.Vector3(m.x-v.x,0,0).normalize().multiplyScalar(ce),de=(new Me.Vector3).addVectors(v,se.clone().divideScalar(2));if(!Tw.isElementInsideWall(de,ce-.01,ee.ly-.01,Kt))return;ll(ee.id,de,Math.abs(se.x),ee.ly),Pe((function(e){var t=e.elements.find((function(e){return e.id===ee.id}));t&&(t.cx=de.x/b,t.lx=Math.abs(se.x),t.color=t.id===ut.current?"red":"#fff")}))}break;case V.Polygon:Pe((function(e){var t=e.elements.find((function(e){return e.id===l.id}));(null===t||void 0===t?void 0:t.selectedIndex)>=0&&(t.vertices[t.selectedIndex].x=-w.x/b,t.vertices[t.selectedIndex].y=-w.z/S)}))}}},onPointerUp:function(){if(ut.current)ft.current&&ft.current.status===Mm.SettingEndPoint?(Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null):(Ew.getState().moveHandleType||Ew.getState().resizeHandleType)&&pp.undoInvalidOperation();else if(ft.current){if(ft.current.status===Mm.SettingStartPoint)Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})),ft.current=null;else if(ft.current.status===Mm.SettingEndPoint){var e=Ew.getState().elements,t=e[e.length-1];t.lx*b<.1||t.lz*S<.1?Pe((function(e){e.elements.pop(),e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type)})):(Pe((function(e){e.actionModeLock&&ft.current&&(e.objectTypeToAdd=ft.current.type,Yy.selectNone(e))})),fl(t)),ft.current=null}}else Ew.getState().moveHandleType?pp.addUndoableMove():Ew.getState().resizeHandleType&&function(){var e=Ew.getState().selectedElement;if(e){var t=Ew.getState().getElementById(e.id);if(t)switch(t.type){case V.Door:case V.Window:case V.SolarPanel:var l={name:"Resize ".concat(t.type),timestamp:Date.now(),resizedElementId:t.id,resizedElementType:t.type,oldPosition:[e.cx,e.cy,e.cz],oldDimension:[e.lx,e.ly,e.lz],newPosition:[t.cx,t.cy,t.cz],newDimension:[t.lx,t.ly,t.lz],oldArchHeight:e.type===V.Window||e.type===V.Door?e.archHeight:void 0,newArchHeight:t.type===V.Window||t.type===V.Door?t.archHeight:void 0,oldPolygonTop:ul(e)?Object(h.a)(e.polygonTop):void 0,newPolygonTop:ul(t)?Object(h.a)(t.polygonTop):void 0,undo:function(){dl(this.resizedElementId,this.oldPosition,this.oldDimension,this.oldArchHeight,this.oldPolygonTop)},redo:function(){dl(this.resizedElementId,this.newPosition,this.newDimension,this.newArchHeight,this.newPolygonTop)}};ze(l);break;case V.Polygon:var a=e,o=t,i={name:"Edit Polygon",timestamp:Date.now(),oldValue:Object(h.a)(a.vertices),newValue:Object(h.a)(o.vertices),changedElementId:o.id,changedElementType:o.type,undo:function(){We(this.changedElementId,this.oldValue)},redo:function(){We(this.changedElementId,this.newValue)}};ze(i)}}}();Et.getState().setEnableOrbitController(!0),Xe(!1),Pe((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.selectedElement=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))})),ke("showWallIntersectionPlaneId",null),ut.current=null,hl()},visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{color:"blue",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.f,{name:Om,args:[b,S],rotation:[vt,0,0],position:[0,T,0],onPointerMove:function(){},visible:!1})]}),tt.map((function(e){switch(e.type){case V.Window:return Object(gf.jsx)(Yg,Object(d.a)(Object(d.a)({},e),{},{cx:e.cx*b,cy:e.cy*T,cz:e.cz*S,lx:e.lx*b,ly:T,lz:e.lz*S}),e.id);case V.Door:return ne!==Ue.Full?null:Object(gf.jsx)(fm,Object(d.a)(Object(d.a)({},e),{},{cx:e.cx*b,cy:0,cz:e.cz*S,lx:e.lx*b,ly:T,lz:e.lz*S}),e.id);case V.SolarPanel:var t=0;return ot&&y&&(t=ot.rotation[2]+y.relativeAngle),Object(gf.jsx)("group",{position:[0,-e.lz/2,0],children:Object(gf.jsx)(xm,Object(d.a)(Object(d.a)({},e),{},{cx:e.cx*b,cz:e.cz*S,absRotation:t}))},e.id);default:return null}}))]}),tt.map((function(e){return e.type===V.Polygon&&ne!==Ue.Empty?Object(gf.jsx)(Pm,Object(d.a)({},e),e.id):null})),Q===Ne.Stud&&function(){var e=null!==N&&void 0!==N?N:[0,(Dt+Mt)/2],t=Object(u.a)(e,2),l=t[0],a=t[1],o=(l*=b)+ht,i=Math.hypot(o,a-Dt),r=-Math.atan2(a-Dt,o),n=ht-l,c=Math.hypot(n,Mt-a),s=-Math.atan2(Mt-a,n);return Object(gf.jsxs)("group",{name:"wall stud group ".concat(m),children:[qt.map((function(e,t){var o,i=Object(u.a)(e,2),r=i[0],n=i[1];return o=rl!=s>l&&t<(c-r)*(l-n)/(s-n)+r&&(a=!a)}return a}},{key:"isRoofValid",value:function(t,l,a,o,i,r){var n,c=Object(f.a)(Ew.getState().elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Wall&&s.roofId===t){var d=s,u=[];if(d.id===l)u=e.getWallPoints2D(d,o,i,r);else if(d.id===a){var h=void 0,p=void 0,y=void 0;o&&(h=[-o[0],o[1]]),r&&(p=[-r[0],r[1]]),i&&(y=[-i[0],i[1]]),u=e.getWallPoints2D(d,h,p,y)}if(d.id===l||d.id===a){var g,m=Object(f.a)(Ew.getState().elements);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.parentId===d.id){var x=w.lx/2,v=w.lz/2,b=km;w.type===V.SolarPanel&&(x=(x-.01)/d.lx,v=(w.ly/2-.01)/d.lz,b=0);var A=w.cx*d.lx-x*d.lx,T=w.cx*d.lx+x*d.lx,P=w.cz*d.lz+v*d.lz+b;if(!e.isPointInside(u,A,P)||!e.isPointInside(u,T,P))return!1}}}catch(S){m.e(S)}finally{m.f()}}}}}catch(S){c.e(S)}finally{c.f()}return!0}},{key:"getSegmentIdx",value:function(e,t){for(var l=0;li.z){var d=[n,r,o];return Tw.isPointInside(l.x,l.y,d.map(Tw.mapVector3ToPoint2))?[o,r,n]:[o,i,r]}var f=[n,r,i];return Tw.isPointInside(l.x,l.y,f.map(Tw.mapVector3ToPoint2))?[i,r,n]:[i,n,o]}if(c<=s){var h=[n,r,i];return Tw.isPointInside(l.x,l.y,h.map(Tw.mapVector3ToPoint2))?[i,r,n]:[i,n,o]}var p=[n,r,o];return Tw.isPointInside(l.x,l.y,p.map(Tw.mapVector3ToPoint2))?[o,r,n]:[o,i,r]}},{key:"getSegmentNormal",value:function(e){var t=Object(u.a)(e,3),l=t[0],a=t[1],o=t[2];return(new Me.Vector3).crossVectors((new Me.Vector3).subVectors(l,a),(new Me.Vector3).subVectors(l,o)).normalize()}},{key:"getRotationFromNormal",value:function(e){return Tw.isSame(e.normalize(),Rt)?[0,0,0]:[Math.PI/2-Math.atan2(e.z,Math.hypot(e.x,e.y)),0,Math.atan2(e.y,e.x)+Math.PI/2]}},{key:"getRooftopElementZ",value:function(e,t,l){var a=Object(u.a)(e,3),o=a[0],i=a[1],r=a[2],n=(i.y-o.y)*(r.z-o.z)-(i.z-o.z)*(r.y-o.y),c=(i.z-o.z)*(r.x-o.x)-(i.x-o.x)*(r.z-o.z),s=(i.x-o.x)*(r.y-o.y)-(i.y-o.y)*(r.x-o.x);return-(-(n*o.x+c*o.y+s*o.z)+n*t.x+c*t.y)/s+l}},{key:"computeState",value:function(t,l,a){var o=e.getSegmentIdx(t,l);if(a)return{segmentIdx:-1,segmentVertices:null,normal:new Me.Vector3(0,0,1),rotation:[0,0,0]};if(-1!==o){var i=e.getSegmentVertices(t,o,l),r=e.getSegmentNormal(i);return{segmentIdx:o,segmentVertices:i,normal:r,rotation:e.getRotationFromNormal(r)}}return{segmentIdx:-1,segmentVertices:null,normal:new Me.Vector3(0,0,1),rotation:[0,0,0]}}},{key:"getOrderedWallArrayOfRoof",value:function(e){var t,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;o.type===V.Wall&&o.roofId===e&&l.set(o.id,o)}}catch(d){a.e(d)}finally{a.f()}if(0===l.size)return{orderedWallArray:[],isLoop:!1};for(var i=l.entries().next().value[1],r=[i],n=i.rightJoints[0];n&&n!==i.id;){var c=l.get(n);if(!c)break;r.push(c),n=c.rightJoints[0]}if(n===i.id)return{orderedWallArray:r,isLoop:!0};for(n=i.leftJoints[0];n;){var s=l.get(n);if(!s)break;r.unshift(s),n=s.leftJoints[0]}return{orderedWallArray:r,isLoop:!1}}},{key:"getRoofBoundaryVertices",value:function(e){var t=Pf.getState().roofSegmentVerticesMap.get(e.id);if(!t)throw new Error;if(e.roofType!==It.Gable&&e.rise<.01)return t[0].map((function(e){return{x:e.x,y:e.y}}));switch(e.roofType){case It.Gable:return 1===t.length?t[0].map((function(e){return{x:e.x,y:e.y}})):t.reduce((function(e,t){return e.push({x:t[0].x,y:t[0].y},{x:t[1].x,y:t[1].y}),e}),[]);case It.Gambrel:return t.reduce((function(e,t,l){return 0!==l&&3!==l||e.push({x:t[0].x,y:t[0].y},{x:t[1].x,y:t[1].y}),e}),[]);case It.Mansard:return t.reduce((function(e,l,a){return a!==t.length-1&&e.push({x:l[0].x,y:l[0].y}),e}),[]);default:return t.reduce((function(e,t,l){return e.push({x:t[0].x,y:t[0].y}),e}),[])}}},{key:"getAbsoluteWindowVerticesOnRoof",value:function(e,t){var l=[],a=new Me.Vector3(e.cx,e.cy,e.cz),o=new Me.Vector3(t.cx,t.cy,t.lz);if(e.windowType===Yt.Arched){for(var i=Math.min(e.archHeight,e.lx/2,e.lz),r=-1;r<=1;r+=2)for(var n=-1;n<=1;n+=2){var c=r*n>0?new Me.Vector3(e.lx/2*r,(e.lz/2-i)*n*r,0):new Me.Vector3(e.lx/2*r,e.lz/2*n*r,0);c.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),c.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(c)}var s=new Me.Vector3(0,e.lz/2,0);s.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),s.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(s)}else{for(var d=-1;d<=1;d+=2)for(var u=-1;u<=1;u+=2){var f=new Me.Vector3(e.lx/2*d,e.lz/2*u*d,0);f.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),f.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(f)}if(e.windowType===Yt.Polygonal&&e.polygonTop){var h=new Me.Vector3(e.lx*e.polygonTop[0],e.lz/2+e.polygonTop[1],0);h.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),h.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(h)}}return l}},{key:"getRelativeWindowVerticesOnRoof",value:function(e){var t=[],l=new Me.Vector3(e.cx,e.cy,e.cz);if(e.windowType===Yt.Arched){for(var a=Math.min(e.archHeight,e.lx/2,e.lz),o=-1;o<=1;o+=2)for(var i=-1;i<=1;i+=2){var r=o*i>0?new Me.Vector3(e.lx/2*o,(e.lz/2-a)*i*o,0):new Me.Vector3(e.lx/2*o,e.lz/2*i*o,0);r.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(r)}var n=new Me.Vector3(0,e.lz/2,0);n.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(n)}else{for(var c=-1;c<=1;c+=2)for(var s=-1;s<=1;s+=2){var d=new Me.Vector3(e.lx/2*c,e.lz/2*s*c,0);d.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(d)}if(e.windowType===Yt.Polygonal&&e.polygonTop){var u=new Me.Vector3(e.lx*e.polygonTop[0],e.lz/2+e.polygonTop[1],0);u.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(l),t.push(u)}}return t}},{key:"getAbsoluteSolarPanelVerticesOnRoof",value:function(e,t){for(var l=[],a=new Me.Vector3(e.cx*t.lx,e.cy*t.ly,e.cz),o=new Me.Vector3(t.cx,t.cy,t.lz),i=-1;i<=1;i+=2)for(var r=-1;r<=1;r+=2){var n=new Me.Vector3(e.lx/2*i,e.ly/2*r*i,0);0===e.rotation[0]?n.applyEuler(new Me.Euler(e.tiltAngle,0,e.relativeAzimuth,"ZXY")).add(a):n.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),n.applyEuler(new Me.Euler(0,0,t.rotation[2],"ZXY")).add(o),l.push(n)}return l}},{key:"getSolarPanelVerticesOnRoof",value:function(e,t){for(var l=[],a=new Me.Vector3(e.cx*t.lx,e.cy*t.ly,e.cz+t.lz),o=-1;o<=1;o+=2)for(var i=-1;i<=1;i+=2){var r=new Me.Vector3(e.lx/2*o,e.ly/2*i*o,0);0===e.rotation[0]?r.applyEuler(new Me.Euler(e.tiltAngle,0,e.relativeAzimuth,"ZXY")).add(a):r.applyEuler(new Me.Euler(e.rotation[0],e.rotation[1],e.rotation[2],"ZXY")).add(a),l.push(r)}return l}},{key:"getWindowVerticesOnRoof",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,l=[],a=new Me.Vector3(e.cx,e.cy,e.cz),o=e.lx/2+t,i=e.lz/2+t,r=-1;r<=1;r+=2)for(var n=-1;n<=1;n+=2){var c=new Me.Vector3(r*o,r*n*i);c.applyEuler((new Me.Euler).fromArray([].concat(Object(h.a)(e.rotation),["ZXY"]))).add(a),l.push(c)}if(e.windowType===Yt.Polygonal){var s,d=null!==(s=e.polygonTop)&&void 0!==s?s:Fg,f=Object(u.a)(d,2),p=f[0],y=f[1],g=new Me.Vector3(p*e.lx,e.lz+y).add(a);l.push(g)}return l}},{key:"rooftopElementBoundaryCheck",value:function(e,t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(!Tw.isPointInside(o.x,o.y,t))return!1}}catch(i){a.e(i)}finally{a.f()}return!0}},{key:"rooftopWindowCollisionCheck",value:function(t,l,a){var o,i=[],r=Object(f.a)(Ew.getState().elements);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.parentId===a&&n.id!==t){var c=e.getWindowVerticesOnRoof(n);i.push(c)}}}catch(x){r.e(x)}finally{r.f()}for(var s=0,d=i;s0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(s((function(e){e.hoveredHandle=l;var a=d(t);a&&(e.selectedElementAngle=a.rotation[2],e.selectedElementHeight=a.lz)})),Tw.isMoveHandle(l)?v.domElement.style.cursor="move":l===q.Upper||l===q.Lower?v.domElement.style.cursor="grab":v.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"pointer")}),[]),k=Object(r.useCallback)((function(){s((function(e){e.hoveredHandle=null})),v.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"default"}),[]),Y=function e(t){var l=d(t);if(!l)return 0;var a=l.rotation[2];return l.parentId===xt?a:a+e(l.parentId)},L=function(e){switch(e){case V.Human:case V.Flower:case V.Tree:return!0}return!1};return Object(gf.jsxs)(gf.Fragment,{children:[I&&Object(gf.jsx)(Lt.f,{name:"Cuboid Intersection Plane",ref:D,args:[1e4,1e4],position:m.position,rotation:m.rotation,visible:!1,onPointerMove:function(e){if(D.current){var l=b.intersectObject(D.current);if(l.length){var a=l[0].point,o=Ew.getState().resizeHandleType;o?Tw.isTopResizeHandle(o)?function(e){if(null!==T.current){var l=Math.max(1,e.z-T.current);s((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&(i.lz=l,i.cz=l/2,e.selectedElementHeight=l),i.parentId===t&&L(i.type)){var r=R.current.get(i.id);r&&r[0]===Gm.Top&&(i.cz=l/2)}}}catch(n){o.e(n)}finally{o.f()}}))}}(a):Tw.isXResizeHandle(o)?function(e){s((function(l){var a,o=l.elements.find((function(e){return e.id===t}));if(o){var i=e.clone().setZ(0),r=Ew.getState().resizeAnchor.clone().setZ(0),n=(new Me.Vector3).subVectors(i,r).applyEuler(new Me.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new Me.Vector3).addVectors(i,r).multiplyScalar(.5),s=Tw.getWorldDataById(o.parentId),d=s.pos,h=s.rot,p=(new Me.Vector3).subVectors(c,d).applyEuler(new Me.Euler(0,0,-h));o.cx=p.x;var y=Math.abs(n.x);o.lx=y;var g=new Me.Vector3(p.x,p.y,o.cz).applyEuler(new Me.Euler(0,0,h)).add(d),m=o.rotation[2]+h;if(z.current.size>0){var w,x=Object(f.a)(l.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value,b=z.current.get(v.id);if(b){var A=b.clone().sub(g).applyEuler(new Me.Euler(0,0,-m));if(L(v.type)){var T=R.current.get(v.id);if(T){var P=Object(u.a)(T,2),j=P[0],H=P[1];j===Gm.Top||j===Gm.NS?v.cx=A.x:j===Gm.EW&&(v.cx=Math.sign(H)*(y/2))}}else v.type===V.Cuboid?v.cx=A.x:v.cx=A.x/y}}}catch(D){x.e(D)}finally{x.f()}}}}))}(a):Tw.isYResizeHandle(o)?function(e){s((function(l){var a,o=l.elements.find((function(e){return e.id===t}));if(o){var i=e.clone().setZ(0),r=Ew.getState().resizeAnchor.clone().setZ(0),n=(new Me.Vector3).subVectors(i,r).applyEuler(new Me.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new Me.Vector3).addVectors(i,r).multiplyScalar(.5),s=Tw.getWorldDataById(o.parentId),d=s.pos,h=s.rot,p=(new Me.Vector3).subVectors(c,d).applyEuler(new Me.Euler(0,0,-h));o.cy=p.y;var y=Math.abs(n.y);o.ly=y;var g=new Me.Vector3(p.x,p.y,o.cz).applyEuler(new Me.Euler(0,0,h)).add(d),m=o.rotation[2]+h;if(z.current.size>0){var w,x=Object(f.a)(l.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value,b=z.current.get(v.id);if(b){var A=b.clone().sub(g).applyEuler(new Me.Euler(0,0,-m));if(L(v.type)){var T=R.current.get(v.id);if(T){var P=Object(u.a)(T,2),j=P[0],H=P[1];j===Gm.Top?v.cy=A.y:j===Gm.NS?v.cy=Math.sign(H)*(y/2):j===Gm.EW&&(v.cy=A.y)}}else v.type===V.Cuboid?v.cy=A.y:v.cy=A.y/y}}}catch(D){x.e(D)}finally{x.f()}}}}))}(a):function(e){s((function(l){var a,o=l.elements.find((function(e){return e.id===t}));if(o){var i=e.clone().setZ(0),r=Ew.getState().resizeAnchor.clone().setZ(0),n=(new Me.Vector3).subVectors(i,r).applyEuler(new Me.Euler(0,0,-(null!==(a=S.current)&&void 0!==a?a:0))),c=(new Me.Vector3).addVectors(i,r).multiplyScalar(.5),s=Tw.getWorldDataById(o.parentId),d=s.pos,h=s.rot,p=(new Me.Vector3).subVectors(c,d).applyEuler(new Me.Euler(0,0,-h));o.cx=p.x,o.cy=p.y;var y=Math.abs(n.x),g=Math.abs(n.y);o.lx=y,o.ly=g;var m=new Me.Vector3(p.x,p.y,o.cz).applyEuler(new Me.Euler(0,0,h)).add(d),w=o.rotation[2]+h;if(z.current.size>0){var x,v=Object(f.a)(l.elements);try{for(v.s();!(x=v.n()).done;){var b=x.value,A=z.current.get(b.id);if(A){var T=A.clone().sub(m).applyEuler(new Me.Euler(0,0,-w));if(L(b.type)){var P=R.current.get(b.id);if(P){var j=Object(u.a)(P,2),H=j[0],D=j[1];H===Gm.Top?(b.cx=T.x,b.cy=T.y):H===Gm.NS?(b.cx=T.x,b.cy=Math.sign(D)*(g/2)):H===Gm.EW&&(b.cx=Math.sign(D)*(y/2),b.cy=T.y)}}else b.type===V.Cuboid?(b.cx=T.x,b.cy=T.y):(b.cx=T.x/y,b.cy=T.y/g)}}}catch(M){v.e(M)}finally{v.f()}}}}))}(a):Ew.getState().rotateHandleType&&function(e){if(P.current){var l=Object(u.a)(P.current,2),a=l[0],o=l[1],i=Math.atan2(a-e.x,e.y-o)+(Ew.getState().rotateHandleType===q.Upper?0:Math.PI),r=Math.abs(i)>Math.PI?-Math.sign(i)*bt:0;j.current&&(i-=j.current),Ew.getState().updateElementRotationById(t,0,0,i+r)}}(a)}}},onPointerUp:function(){w(null),T.current=null,P.current=null,S.current=null,j.current=null,H.current=null}}),Object(gf.jsxs)("group",{name:"Bottom Resize Handle Group",position:[0,0,A/2-c],onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].object.name===e.object.name||Ew.getState().addedCuboidId){var l=d(t);if(l&&l.parentId!==xt){w({position:new Me.Vector3(0,0,-c),rotation:new Me.Euler});var a=Tw.getWorldDataById(l.parentId),o=a.pos,r=a.rot;H.current=o,j.current=r,S.current=r+l.rotation[2];var n=new Me.Vector3(l.cx,l.cy,l.cz).applyEuler(new Me.Euler(0,0,r)).add(o),u=Ew.getState().elements.filter((function(e){return e.parentId===l.id&&(t=e.type,L(t)||t===V.Cuboid||Tw.isIdentical(e.normal,[0,0,1]));var t}));z.current.clear(),R.current.clear();var h,p=Object(f.a)(u);try{for(p.s();!(h=p.n()).done;){var y=h.value,g=new Me.Vector3;L(y.type)?(g.set(y.cx,y.cy,y.cz),Math.abs(y.cz-c)<.01?R.current.set(y.id,[Gm.Top,1]):Math.abs(Math.abs(y.cx)-i)<.01?R.current.set(y.id,[Gm.EW,Math.sign(y.cx)]):R.current.set(y.id,[Gm.NS,Math.sign(y.cy)])):y.type===V.Cuboid?g.set(y.cx,y.cy,y.cz):g.set(y.cx*l.lx,y.cy*l.ly,0),g.applyEuler(new Me.Euler(0,0,S.current)).add(n),z.current.set(y.id,g)}}catch(m){p.e(m)}finally{p.f()}}s((function(e){var l;e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t),e.selectedElement=null!==(l=e.elements.find((function(e){return e.id===t})))&&void 0!==l?l:null}))}},children:[Object(gf.jsx)(aw,{handleType:K.UpperLeft,position:[-i,n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.UpperRight,position:[i,n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.LowerLeft,position:[-i,-n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.LowerRight,position:[i,-n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.Left,position:[-i,0,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.Right,position:[i,0,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.Upper,position:[0,n,0],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.Lower,position:[0,-n,0],size:A,onPointerOver:F,onPointerOut:k})]}),C&&Object(gf.jsxs)("group",{name:"Cuboid Top Resize Handle Group",onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].object.name===e.object.name){var l=e.intersections[0].object,a=Ew.getState().cameraDirection,o=Math.atan2(a.x,a.y)+Y(t);w({position:l.position.clone(),rotation:new Me.Euler(-vt,o,0)});var i=l.localToWorld(new Me.Vector3);T.current=i.z-2*c;var r=Ew.getState().elements.filter((function(e){return e.parentId===t&&L(e.type)}));R.current.clear();var n,d=Object(f.a)(r);try{for(d.s();!(n=d.n()).done;){var u=n.value;(new Me.Vector3).set(u.cx,u.cy,u.cz),Math.abs(u.cz-c)<.01&&R.current.set(u.id,[Gm.Top,1])}}catch(h){d.e(h)}finally{d.f()}s((function(e){var l;e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t),e.selectedElement=null!==(l=e.elements.find((function(e){return e.id===t})))&&void 0!==l?l:null}))}},children:[Object(gf.jsx)(aw,{handleType:K.LowerLeftTop,position:[-i,-n,c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.UpperLeftTop,position:[-i,n,c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.LowerRightTop,position:[i,-n,c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(aw,{handleType:K.UpperRightTop,position:[i,n,c],size:A,onPointerOver:F,onPointerOut:k})]}),O&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Cuboid Move Handle Group",onPointerDown:function(e){if(e.intersections.length>0){var l=e.intersections[0].eventObject.name;switch(l){case B.Lower:case B.Upper:case B.Left:case B.Right:case B.Top:Ew.getState().set((function(e){var a,o=null!==(a=e.elements.find((function(e){return e.id===t})))&&void 0!==a?a:null;if(o){if(e.selectedElement=o,o.parentId===xt){var i,r=Object(f.a)(e.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;e.selectedElementIdSet.has(n.id)&&!Tw.isElementAllowedMultipleMoveOnGround(n)&&e.selectedElementIdSet.delete(n.id)}}catch(c){r.e(c)}finally{r.f()}}else e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(o.id);e.moveHandleType=l}})),Et.getState().setEnableOrbitController(!1)}}},children:[Object(gf.jsx)(lw,{handleType:B.Lower,position:[0,-n-1.2*A,-c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(lw,{handleType:B.Upper,position:[0,n+1.2*A,-c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(lw,{handleType:B.Left,position:[-i-1.2*A,0,-c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(lw,{handleType:B.Right,position:[i+1.2*A,0,-c],size:A,onPointerOver:F,onPointerOut:k}),Object(gf.jsx)(lw,{handleType:B.Top,position:[0,0,c],size:A,onPointerOver:F,onPointerOut:k})]}),Object(gf.jsxs)("group",{name:"Cuboid Rotate Handle Group",onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].object.name===e.object.name){w({position:new Me.Vector3(0,0,-c),rotation:new Me.Euler(0,0,0)});var l=e.eventObject;P.current=l.localToWorld(new Me.Vector3).toArray();var a=d(t);a&&(j.current=Y(a.parentId))}},children:[Object(gf.jsx)(oy,{id:t,handleType:q.Lower,position:M,ratio:4*A,hoverHandle:F,noHoverHandle:k}),Object(gf.jsx)(oy,{id:t,position:W,handleType:q.Upper,ratio:4*A,hoverHandle:F,noHoverHandle:k})]})]})]})},iw=n.a.memo(ow),rw="Handle Group Move & Resize",nw=function(e){var t=e.id,l=e.parentId,a=e.cx,o=e.cy,n=e.cz,c=e.lx,s=e.ly,d=e.lz,f=e.normal,h=e.locked,p=e.trackerType,y=e.tiltAngle,g=e.relativeAzimuth,m=e.poleHeight,w=e.poleRadius,x=e.poleSpacing,v=e.color,b=void 0===v?"white":v,A=_f(t),T=uw(f),P=s/2,S=T?m:0,j=Math.max(1,(c+s)/16),H=2*j/3,z=2*j/3,R=-m/2-d/2,D=Ew(si),M=Ew(lc),W=Ew(Sr),I=Ew(i.date),C=Ew(i.latitude),O=Object(Se.f)(),F=O.gl.domElement,k=O.camera,Y=O.raycaster,L=O.mouse,E=Object(r.useState)(null),U=Object(u.a)(E,2),N=U[0],J=U[1],G=Object(r.useState)(!1),X=Object(u.a)(G,2),K=X[0],Q=X[1],Z=Object(r.useRef)(!1),_=Object(r.useRef)(0),$=Object(r.useRef)(0),ee=(Object(r.useRef)(null),Object(r.useRef)(null)),le=Object(r.useRef)(),ae=Object(r.useMemo)((function(){return new Array(13).fill(0)}),[]),oe=Object(r.useMemo)((function(){return new Date(I)}),[I]),ie=Object(r.useMemo)((function(){for(var e=[],t=Math.floor(.5*c/x),l=Math.floor(.5*s*Math.abs(Math.cos(y))/x),a=.5*Math.sin(y),o=Math.cos(g)*x,i=Math.sin(g)*x,r=-t;r<=t;r++)for(var n=-l;n<=l;n++){var d=r*o-n*i,u=r*i+n*o;e.push(new Me.Vector3(d,u,R+a*x*n))}return e}),[g,y,x,c,s,R]),re=Object(r.useMemo)((function(){return dw(f)}),[f]),ne=Object(r.useMemo)((function(){if(T){if(p===te.NO_TRACKER)return new Me.Euler(y,0,g,"ZXY");var e=jy(oe,C),t=fw(l,re.z)-re.z;switch(p){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var a=Math.hypot(e.x,e.y);return new Me.Euler(Math.atan2(a,e.z),0,Math.atan2(e.y,e.x)+vt-t,"ZXY");case te.HORIZONTAL_SINGLE_AXIS_TRACKER:return new Me.Euler(0,Math.atan2(e.x,e.z),-t+(c.1,de=S>0&&T;Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),Z.current=!1,Q(!1),D((function(e){e.rotateHandleType=null,e.moveHandleType=null,e.resizeHandleType=null}))};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var ue=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(J(t),t===B.Top?F.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?F.style.cursor="grab":F.style.cursor="pointer"))},fe=function(){J(null),F.style.cursor="default"},he=function(e){return N===e||Ew.getState().rotateHandleType===e?pt:ht};return Object(gf.jsxs)("group",{name:"Solar Panel Group",position:[a,o,S+n],rotation:re,children:[Object(gf.jsx)(cw,{solarPanelModel:e,groupRotation:re,panelRotation:ne}),ce&&Object(gf.jsxs)("group",{position:[0,0,-S],rotation:[0,0,ne.z],children:[Object(gf.jsx)(oy,{id:t,position:[0,-P-H/2,S],color:he(q.Upper),ratio:H,handleType:q.Upper,hoverHandle:ue,noHoverHandle:fe}),Object(gf.jsx)(oy,{id:t,position:[0,P+H/2,S],color:he(q.Lower),ratio:H,handleType:q.Lower,hoverHandle:ue,noHoverHandle:fe})]}),se&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{name:q.Tilt,args:[z,1.1*z,18,2,-vt,Math.PI],rotation:[0,-vt,ne.z,"ZXY"],onPointerOver:function(e){ue(e,q.Tilt)},onPointerOut:function(e){fe()},onPointerDown:function(e){if(Q(!0),N){Et.getState().setEnableOrbitController(!1),Z.current=!0,_.current=y;var t=Tw.getWorldDataById(l).rot;ee.current=t}D((function(e){e.rotateHandleType=q.Tilt}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide,color:N===q.Tilt||K?pt:ht})}),K&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{ref:le,name:"Solar panel tilt handle",args:[z,2*z,18,2,-vt,Math.PI],rotation:[0,-vt,ne.z,"ZXY"],onPointerUp:function(e){if(Math.abs($.current-_.current)>At){var l={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:_.current,newValue:$.current,changedElementId:t,changedElementType:V.SolarPanel,undo:function(){M(l.changedElementId,l.oldValue)},redo:function(){M(l.changedElementId,l.newValue)}};W(l)}},onPointerMove:function(e){if(Z.current&&(Y.setFromCamera(L,k),le.current)){var l=Y.intersectObjects([le.current]);if(l.length>0){var a=l[0].point,o=le.current.parent;if(o){var i=o.localToWorld(new Me.Vector3),r=(new Me.Vector3).subVectors(a,i),n=r.angleTo(Rt);if(!(.5*s*Math.abs(Math.sin(n))>S)){var c,d=g+(null!==(c=ee.current)&&void 0!==c?c:0),u=d%Math.PI===0?Math.sign(-r.y)*Math.sign(Math.cos(d)):Math.sign(r.x)*Math.sign(Math.sin(d));M(t,n*=u),$.current=n}}}}},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:Me.DoubleSide})}),Object(gf.jsx)(Jl.a,{points:[[0,0,z],[0,0,1.75*z]],rotation:new Me.Euler(y,0,ne.z,"ZXY"),lineWidth:1}),ae.map((function(e,t){return Object(gf.jsxs)("group",{rotation:new Me.Euler(Math.PI/12*t-vt,0,ne.z,"ZXY"),children:[Object(gf.jsx)(Jl.a,{points:[[0,0,1.8*z],[0,0,2*z]],color:"white",transparent:!0,opacity:.5}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(15*t-90,"\xb0"),fontSize:20*z,fontFace:"Times Roman",textHeight:.15*z,position:[0,0,1.6*z]})]},t)})),Object(gf.jsx)("group",{rotation:new Me.Euler(y,0,ne.z,"ZXY"),children:Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(Math.floor(y/Math.PI*180),"\xb0"),fontSize:20*z,fontFace:"Times Roman",textHeight:.2*z,position:[0,0,.75*z]})})]})]}),de&&ie.map((function(e,t){return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[w,w,m+2*(e.z-R)+d,4,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:b})},t)}))]})},cw=function(e){var t,l,a,n,c,s=e.solarPanelModel,d=e.groupRotation,f=e.panelRotation,h=s.id,p=s.parentId,y=s.lx,g=s.ly,m=s.lz,w=s.cx,x=s.cy,v=s.cz,b=s.normal,A=s.tiltAngle,T=s.relativeAzimuth,P=s.trackerType,S=s.drawSunBeam,j=s.locked,H=s.showLabel,z=s.label,R=s.pvModelName,D=s.orientation,M=s.frameColor,W=s.backsheetColor,I=s.color,C=s.poleHeight,O=_f(h),F=Ew(si),k=Ew(is),Y=Ew(i.date),L=Ew(i.latitude),E=Ew(Ru),U=Ew(Vi),N=Tf(Ns),J=Ew(Yi),G=Ew(o.solarPanelShininess),Q=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,Z=Object(r.useMemo)((function(){return{lng:U}}),[U]),_=uw(b),ee=_?A:0,le=_?T:0,ae=Math.max(1,(y+g)/16),oe=dt*ae*1.5,ie=st*ae*2,re=[y,g,m].map((function(e){return e/2})),ne=Object(u.a)(re,3),ce=ne[0],se=ne[1],de=ne[2],ue=[oe,oe,1.2*m],fe=J[R];fe&&(m=Math.max(fe.thickness,.02));var he=Object(r.useMemo)((function(){return new Date(Y)}),[Y]),pe=Object(r.useMemo)((function(){return(z||me.t("shared.SolarPanelElement",Z))+(j?" ("+me.t("shared.ElementLocked",Z)+")":"")+(z?"":"\n"+me.t("word.Coordinates",Z)+": ("+w.toFixed(1)+", "+x.toFixed(1)+", "+v.toFixed(1)+") "+me.t("word.MeterAbbreviation",Z))}),[z,j,U,w,x,v]),ye=Object(r.useMemo)((function(){var e=[];if(fe){var t,l;D===$.portrait?(t=Math.max(1,Math.round(y/fe.width)),l=Math.max(1,Math.round(g/fe.length))):(t=Math.max(1,Math.round(y/fe.length)),l=Math.max(1,Math.round(g/fe.width)));for(var a=y/t,o=g/l,i=0;i<=t;i++)e.push({points:[new Me.Vector3(i*a-ce,-se,m),new Me.Vector3(i*a-ce,se,m)]});for(var r=0;r<=l;r++)e.push({points:[new Me.Vector3(-ce,r*o-se,m),new Me.Vector3(ce,r*o-se,m)]})}return e}),[fe,D,R,y,g,m]),ge=Object(r.useState)(Oe()),we=Object(u.a)(ge,2),xe=we[0],ve=we[1],be=Object(r.useState)(!1),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],je=Object(r.useState)(null),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De=Object(r.useRef)(null),We=Object(Se.f)().gl,Ie=Uy(y,g,fe,D,M,W),Ce=Ey(h);function Oe(){var e=new Me.Euler,t=fw(p,d.z);return P===te.NO_TRACKER?e.set(-d.x-ee,0,-t-le):e.set(-d.x-f.x,-f.y,-t-f.z),jy(he,L).applyEuler(e)}function Fe(e){return ze===e||E===e?pt:ht}function ke(e,t){Et.getState().setEnableOrbitController(!1),F((function(l){l.resizeHandleType=e,l.resizeAnchor.copy(t)}))}return Object(Se.d)((function(){var e=Oe();e.equals(xe)||ve(e)})),Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("group",{name:"Solar Panel Box Group",rotation:f,children:[Object(gf.jsxs)(Lt.a,{uuid:h,ref:De,args:[y,g,m],position:[0,0,de],onPointerDown:function(e){2!==e.button&&k(h,e,X.Select)},onContextMenu:function(e){k(h,e,X.ContextMenu),F((function(t){e.intersections.length>0&&(e.intersections[0].object===De.current&&(t.contextMenuObjectType=V.SolarPanel))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===De.current&&(Pe(!0),We.domElement.style.cursor="move"))},onPointerOut:function(e){Pe(!1),We.domElement.style.cursor="default"},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:"white"}),N&&Ce?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:Ce}):Ie?Q||0===G?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",map:Ie,color:I}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===fe||void 0===fe?void 0:fe.color)?at:ot),shininess:null!==G&&void 0!==G?G:tt,side:Me.FrontSide,map:Ie,color:I}):Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:I}),0===(null===fe||void 0===fe?void 0:fe.bifacialityFactor)||Q||0===C&&0===A?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:I}):Ie?Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===fe||void 0===fe?void 0:fe.color)?at:ot),shininess:null!==G&&void 0!==G?G:tt,side:Me.FrontSide,map:Ie,color:I}):null]}),O&&!j&&Object(gf.jsxs)("group",{name:rw,onPointerDown:function(e){if(e.intersections.length>0&&e.intersections[0].eventObject.name===rw){var t=e.object.name;switch(t){case B.Default:Et.getState().setEnableOrbitController(!1),F((function(e){e.moveHandleType=t,e.selectedElement=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))}));break;case K.Left:var l=e.object.localToWorld(new Me.Vector3(y,0,0));ke(t,l);break;case K.Right:var a=e.object.localToWorld(new Me.Vector3(-y,0,0));ke(t,a);break;case K.Lower:var o=e.object.localToWorld(new Me.Vector3(0,g,0));ke(t,o);break;case K.Upper:var i=e.object.localToWorld(new Me.Vector3(0,-g,0));ke(t,i)}}},onPointerOver:function(e){if(e.intersections.length>0&&e.eventObject.name.includes(rw)){var t=e.object.name;Re(t),t===B.Top?We.domElement.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?We.domElement.style.cursor="grab":We.domElement.style.cursor="pointer"}},onPointerOut:function(){Re(null),We.domElement.style.cursor="default"},children:[Object(gf.jsx)(Lt.h,{args:[ie,6,6],name:B.Default,children:Object(gf.jsx)("meshBasicMaterial",{color:"orange"})}),Object(gf.jsx)(Lt.a,{position:[0,-se,de],args:ue,name:K.Lower,children:Object(gf.jsx)("meshBasicMaterial",{color:Fe(K.Lower)})}),Object(gf.jsx)(Lt.a,{position:[0,se,de],args:ue,name:K.Upper,children:Object(gf.jsx)("meshBasicMaterial",{color:Fe(K.Upper)})}),Object(gf.jsx)(Lt.a,{position:[-ce,0,de],args:ue,name:K.Left,children:Object(gf.jsx)("meshBasicMaterial",{color:Fe(K.Left)})}),Object(gf.jsx)(Lt.a,{position:[ce,0,de],args:ue,name:K.Right,children:Object(gf.jsx)("meshBasicMaterial",{color:Fe(K.Right)})})]}),S&&xe.z>0&&Object(gf.jsx)(sw,{sunDirection:xe}),N&&Ce&&ye.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(gf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:h,args:[y,g],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),O&&j&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-ce,-se,0],[-ce,se,0],[ce,se,0],[ce,-se,0],[-ce,-se,0]],castShadow:!1,receiveShadow:!1,lineWidth:2,color:yt})]}),(Te||H)&&!O&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:pe,color:null!==(l=s.labelColor)&&void 0!==l?l:"white",fontSize:null!==(a=s.labelFontSize)&&void 0!==a?a:20,textHeight:null!==(n=s.labelSize)&&void 0!==n?n:.2,position:[0,0,null!==(c=s.labelHeight)&&void 0!==c?c:Math.max(se*Math.abs(Math.sin(A))+.1,.2)]})]})},sw=n.a.memo((function(e){var t=e.sunDirection,l=Ew(Kr),a=Object(r.useMemo)((function(){return Math.max(100,10*l)}),[l]);return Object(gf.jsxs)("group",{name:"Sun Beam Group",children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[Rt.clone().multiplyScalar(.75),[0,0,0],t.clone().multiplyScalar(a)],name:"Sun Beam",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[t.clone().multiplyScalar(.5),Rt.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Tw.toDegrees(t.angleTo(Rt)).toFixed(1)+"\xb0",fontSize:20,fontFace:"Times Roman",textHeight:.1,position:t.clone().multiplyScalar(.75).add(Rt.clone().multiplyScalar(.75)).multiplyScalar(.5)}),Object(gf.jsx)("group",{position:Rt.clone().multiplyScalar(.75),rotation:[vt,0,0],children:Object(gf.jsx)(Lt.c,{userData:{unintersectable:!0},args:[.04,.2,4,2],name:"Normal Vector Arrow Head",children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})})})]})}));function dw(e){var t=Object(u.a)(e,3),l=t[0],a=t[1];return 1===t[2]?new Me.Euler(0,0,0):0!==l?new Me.Euler(vt,0,l*vt,"ZXY"):0!==a?new Me.Euler(-a*vt,0,0):new Me.Euler}function uw(e){return Math.abs(e[2]-1)<.01}function fw(e,t){return Tw.getWorldDataById(e).rot+t}var hw=n.a.memo(nw),pw=function(e){var t,l,a,i,n,c,s=e.id,p=e.cx,y=e.cy,g=e.lx,m=void 0===g?1:g,w=e.ly,x=void 0===w?1:w,v=e.lz,b=void 0===v?1:v,A=e.color,T=void 0===A?"silver":A,P=e.lineColor,S=void 0===P?"black":P,j=e.lineWidth,H=void 0===j?.1:j,z=e.locked,R=void 0!==z&&z,D=e.showLabel,M=void 0!==D&&D,W=e.textureTypes,I=void 0===W?[de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture]:W,C=e.stackable,O=_f(s),F=Ew(si),k=Ew(Vi),Y=Ew(o.orthographic),L=Ew(Zr),E=Ew(on),U=Ew(ns),N=Ew(qc),J=Ew(An),G=Ew(Sn),Q=Ew(cn),Z=Ew(sn),_=Ew(dn),ee=Ew(is),te=Ew(rc),le=Ew(Ei),ae=Ew(o.shadowEnabled),oe=Ew(Sr),ie=Ew(Iu),re=Ew(qn),ne=Ew(Kn),ce=Ew(rn),se=Tf(Ns),ue=Ew(o.solarRadiationHeatmapMaxValue),fe=Pf(wi),he=Ew(o.groundImage),pe=Object(Se.f)(),ye=pe.camera,ge=pe.gl.domElement,we=pe.raycaster,xe=pe.mouse,ve=Object(r.useState)(null),be=Object(u.a)(ve,2),Ae=be[0],Te=be[1],Pe=Object(r.useState)(null),je=Object(u.a)(Pe,2),He=je[0],ze=je[1],Re=Object(r.useState)(null),De=Object(u.a)(Re,2),We=De[0],Ie=De[1],Ce=Object(r.useState)(null),Oe=Object(u.a)(Ce,2),Fe=Oe[0],ke=Oe[1],Ye=Object(r.useState)(null),Le=Object(u.a)(Ye,2),Ee=Le[0],Ue=Le[1],Ne=Object(r.useState)(!1),Ve=Object(u.a)(Ne,2),Je=Ve[0],Ge=Ve[1],Xe=Object(r.useState)(!1),Be=Object(u.a)(Xe,2),Ke=Be[0],qe=Be[1],Qe=Object(r.useState)(),Ze=Object(u.a)(Qe,2),_e=Ze[0],$e=Ze[1],et=Object(r.useRef)(null),tt=Object(r.useRef)(),lt=Object(r.useRef)(null),at=Object(r.useRef)(Rt),ot=Object(r.useRef)(new Me.Vector3(0,0,0)),it=Object(r.useRef)(new Me.Euler(0,0,0)),rt=Object(r.useRef)(new Me.Vector3(1,1,1)),nt=Object(r.useRef)(new Me.Vector3),ct=Object(r.useRef)(new Me.Vector3),dt=Object(r.useRef)(new Me.Vector3),ut=Object(r.useRef)(new Me.Vector3),ft=Object(r.useRef)(new Me.Vector3(1,1,1)),ht=Object(r.useRef)(new Me.Vector3(1,1,1)),pt=Object(r.useRef)(0),gt=Object(r.useRef)(0),mt=Object(r.useRef)([]),wt=Object(r.useRef)([]),xt=Object(r.useRef)(),Pt=Object(r.useRef)(new Me.Vector3),Mt=Object(r.useRef)(0),Wt=Object(r.useMemo)((function(){return{lng:k}}),[k]),It=m/2,Ct=x/2,Ot=b/2,Ft=Object(r.useMemo)((function(){return new Me.Vector3}),[]);if(lt.current&<.current.type===V.SolarPanel){var kt=uw(lt.current.normal)?lt.current.poleHeight:0;Ft.set(0,0,e.lz/2+kt)}var Yt=Object(r.useMemo)((function(){return((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.CuboidElement",Wt))+((null===e||void 0===e?void 0:e.locked)?" ("+me.t("shared.ElementLocked",Wt)+")":"")+((null===e||void 0===e?void 0:e.label)?"":"\n"+me.t("word.Coordinates",Wt)+": ("+p.toFixed(1)+", "+y.toFixed(1)+", "+(b/2).toFixed(1)+") "+me.t("word.MeterAbbreviation",Wt))}),[null===e||void 0===e?void 0:e.label,R,k,p,y,b]);Object(r.useEffect)((function(){var e=function(){lt.current=null,qe(!1),Et.getState().setEnableOrbitController(!0)};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]),Object(r.useEffect)((function(){Ew.getState().tempHumanPlant.length>0&&F((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(e.tempHumanPlant)),e.tempHumanPlant=[]}))}),[]),Object(r.useEffect)((function(){if(e&&se){var t=null!==ue&&void 0!==ue?ue:5,l=fe(e.id+"-top");l&&Te(Tw.fetchHeatmapTexture(l,t));var a=fe(e.id+"-south");a&&ze(Tw.fetchHeatmapTexture(a,t));var o=fe(e.id+"-north");o&&Ie(Tw.fetchHeatmapTexture(o,t));var i=fe(e.id+"-west");i&&ke(Tw.fetchHeatmapTexture(i,t));var r=fe(e.id+"-east");r&&Ue(Tw.fetchHeatmapTexture(r,t,!0))}}),[se,ue]);var Ut=function(e){switch(e){case de.Facade01:return Xm;case de.Facade02:return Bm;case de.Facade03:return Km;case de.Facade04:return qm;case de.Facade05:return Qm;case de.Facade06:return Zm;case de.Facade07:return _m;case de.Facade08:return $m;case de.Facade09:return ew;case de.Facade10:return tw;default:return Sf}},Nt=function(e){switch(e){case de.Facade01:case de.Facade02:return{x:14,y:6.5};case de.Facade03:return{x:10,y:12};case de.Facade04:return{x:20,y:11};case de.Facade05:return{x:15,y:10};case de.Facade06:return{x:11,y:3.5};case de.Facade07:return{x:11,y:10};case de.Facade08:return{x:16,y:9};case de.Facade09:return{x:10,y:9};case de.Facade10:return{x:12,y:9};default:return{x:1,y:1}}},Vt=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[0]):Sf,(function(e){var t=Nt(I[0]);e.repeat.set(x/t.x,b/t.y),e.rotation=vt,e.center.x=1,e.center.y=0,e.wrapS=e.wrapT=Me.RepeatWrapping,Bt(e)}))}),[I[0],x,b]),Jt=Object(r.useState)(Vt),Gt=Object(u.a)(Jt,2),Xt=Gt[0],Bt=Gt[1],Kt=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[1]):Sf,(function(e){var t=Nt(I[1]);e.repeat.set(x/t.x,b/t.y),e.rotation=-vt,e.wrapS=e.wrapT=Me.RepeatWrapping,_t(e)}))}),[I[1],x,b]),qt=Object(r.useState)(Kt),Qt=Object(u.a)(qt,2),Zt=Qt[0],_t=Qt[1],$t=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[2]):Sf,(function(e){var t=Nt(I[2]);e.repeat.set(m/t.x,b/t.y),e.rotation=Math.PI,e.center.x=0,e.center.y=1,e.wrapS=e.wrapT=Me.RepeatWrapping,al(e)}))}),[I[2],m,b]),el=Object(r.useState)($t),tl=Object(u.a)(el,2),ll=tl[0],al=tl[1],ol=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[3]):Sf,(function(e){var t=Nt(I[3]);e.repeat.set(m/t.x,b/t.y),e.wrapS=e.wrapT=Me.RepeatWrapping,cl(e)}))}),[I[3],m,b]),il=Object(r.useState)(ol),rl=Object(u.a)(il,2),nl=rl[0],cl=rl[1],sl=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(I?Ut(I[4]):Sf,(function(e){var t=Nt(I[4]);e.repeat.set(m/t.x,x/t.y),e.wrapS=e.wrapT=Me.RepeatWrapping,hl(e)}))}),[I[4],m,x]),dl=Object(r.useState)(sl),ul=Object(u.a)(dl,2),fl=ul[0],hl=ul[1];Object(r.useEffect)((function(){Object(Se.c)()}),Object(h.a)(I));var pl=function(e){at.current=e;var t=.01;Tw.isSame(at.current,Rt)?(ot.current=new Me.Vector3(0,0,Ot+t),it.current=new Me.Euler(0,0,0),rt.current.set(It,Ct,Ot)):Tw.isSame(at.current,St)?(ot.current=new Me.Vector3(It+t,0,0),it.current=new Me.Euler(0,vt,0),rt.current.set(Ot,Ct,It)):Tw.isSame(at.current,jt)?(ot.current=new Me.Vector3(-It-t,0,0),it.current=new Me.Euler(0,-vt,0),rt.current.set(Ot,Ct,It)):Tw.isSame(at.current,zt)?(ot.current=new Me.Vector3(0,-Ct-t,0),it.current=new Me.Euler(vt,0,0),rt.current.set(It,Ot,Ct)):Tw.isSame(at.current,Ht)&&(ot.current=new Me.Vector3(0,Ct+t,0),it.current=new Me.Euler(-vt,0,0),rt.current.set(It,Ot,Ct))},yl=Math.max(1,Math.max(m,x)/8),gl=st*yl,ml=Tw.isIdentical(null===(t=lt.current)||void 0===t?void 0:t.normal,Tt),wl=function(t,l,a){var o=JSON.parse(JSON.stringify(t));return o.cx=l,o.cy=a,ce(o)?(Qh(me.t("message.MoveCancelledBecauseOfOverlap",Wt)),!1):!(Tw.isIdentical(t.normal,Tt)&&!Tw.isSolarCollectorWithinHorizontalSurface(o,e))||(Qh(me.t("message.MoveOutsideBoundaryCancelled",Wt)),!1)},xl=function(t,l,a,o,i){if(0!==t.tiltAngle&&.5*i*Math.abs(Math.sin(t.tiltAngle))>t.poleHeight)return!1;var r=JSON.parse(JSON.stringify(t));return r.cx=l,r.cy=a,r.lx=o,r.ly=i,!!Tw.isSolarCollectorWithinHorizontalSurface(r,e)},vl=he?Y?.25:.75:1,bl=[se&&Ee?Ee:Xt,se&&Fe?Fe:Zt,se&&We?We:ll,se&&He?He:nl,se&&Ae?Ae:fl,null],Al=e&&e.faceColors?[0,1,2,3,4,5].map((function(t){return I&&I[t]!==de.NoTexture?se?Object(gf.jsx)("meshBasicMaterial",{side:Me.FrontSide,attachArray:"material",color:"white",map:bl[t],transparent:Y&&he,opacity:vl},t):Object(gf.jsx)("meshStandardMaterial",{side:Me.FrontSide,attachArray:"material",color:"white",map:bl[t],transparent:Y&&he,opacity:vl},t):se?Object(gf.jsx)("meshBasicMaterial",{side:Me.FrontSide,attachArray:"material",color:"white",map:bl[t],transparent:Y&&he,opacity:vl},t):Object(gf.jsx)("meshStandardMaterial",{side:Me.FrontSide,attachArray:"material",color:e.faceColors?e.faceColors[t]:T,map:bl[t],transparent:Y&&he,opacity:vl},t)})):Object(gf.jsx)("meshStandardMaterial",{side:Me.FrontSide,attach:"material",color:T,transparent:Y&&he,opacity:vl}),Tl=Object(r.useMemo)((function(){return[It,Ct,Ot]}),[It,Ct,Ot]),Pl=O&&!R;return Object(gf.jsxs)("group",{ref:et,name:"Cuboid Group "+s,userData:{aabb:!0},children:[Object(gf.jsx)(Lt.a,{castShadow:ae,receiveShadow:ae,userData:{simulation:!0,stand:!0,stackable:C},uuid:s,ref:tt,args:[m,x,b],name:"Cuboid "+s,onContextMenu:function(e){ee(s,e,X.ContextMenu),F((function(t){t.pastePoint.copy(e.intersections[0].point);var l=e.intersections[0].face;(l&&(t.pasteNormal=l.normal.clone(),Tw.isSame(l.normal,St)?t.selectedSideIndex=0:Tw.isSame(l.normal,jt)?t.selectedSideIndex=1:Tw.isSame(l.normal,Ht)?t.selectedSideIndex=2:Tw.isSame(l.normal,zt)?t.selectedSideIndex=3:Tw.isSame(l.normal,Rt)&&(t.selectedSideIndex=4)),t.clickObjectType=V.Cuboid,e.intersections.length>0)&&(e.intersections[0].object===tt.current&&(t.contextMenuObjectType=V.Cuboid))}))},onPointerDown:function(t){if(2!==t.button){ie()||ee(s,t,X.Select);var l=E(),a=!1;if(t.intersections[0].object.name===V.Polygon&&Ew.getState().objectTypeToAdd!==V.None&&(a=!0),(null===l||void 0===l?void 0:l.id)===s||a)if(function(e){switch(e){case V.Polygon:case V.Sensor:case V.Light:case V.SolarPanel:case V.Human:case V.Tree:case V.Flower:return!0}return!1}(Ew.getState().objectTypeToAdd)&&e){qe(!0);var o=function(t){var l,a=t.intersections[0];if(Ew.getState().objectTypeToAdd===V.SolarPanel){var o,i,r,n,c,d,u,f,h=a.point,p=Tw.getWorldDataById(s),y=p.pos,g=p.rot,w=(new Me.Vector3).subVectors(h,y).applyEuler(new Me.Euler(0,0,-g)),v=Vl.makeSolarPanel(e,Ew.getState().getPvModule(null!==(o=Ew.getState().actionState.solarPanelModelName)&&void 0!==o?o:"SPR-X21-335-BLK"),w.x/m,w.y/x,w.z/b,null!==(i=Ew.getState().actionState.solarPanelOrientation)&&void 0!==i?i:$.landscape,null!==(r=Ew.getState().actionState.solarPanelPoleHeight)&&void 0!==r?r:1,null!==(n=Ew.getState().actionState.solarPanelPoleSpacing)&&void 0!==n?n:3,null!==(c=Ew.getState().actionState.solarPanelTiltAngle)&&void 0!==c?c:0,null!==(d=Ew.getState().actionState.solarPanelRelativeAzimuth)&&void 0!==d?d:0,null===(u=a.face)||void 0===u?void 0:u.normal,[0,0,0],null!==(f=Ew.getState().actionState.solarPanelFrameColor)&&void 0!==f?f:"white");return F((function(e){e.elements.push(v)})),v}return U(e,a.point,null===(l=a.face)||void 0===l?void 0:l.normal)}(t);if(o){var i={name:"Add",timestamp:Date.now(),addedElement:o,undo:function(){N(i.addedElement.id,!1)},redo:function(){F((function(e){e.elements.push(i.addedElement),e.selectedElement=i.addedElement}))}};oe(i),F((function(e){e.objectTypeToAdd=V.None}))}}else Et.getState().selectNone(),Et.setState((function(e){e.cuboidRef=et}));else if(l&&l.parentId===s&&function(e){switch(e){case V.Polygon:case V.Sensor:case V.Light:case V.SolarPanel:return!0}return!1}(l.type)){qe(!0);var r,n=Tw.getWorldDataById(s),c=n.rot,u=n.pos;Pt.current.copy(u),Mt.current=c,lt.current=l;var h,p=Object(f.a)(t.intersections);try{for(p.s();!(h=p.n()).done;){var y=h.value;if(y.object===tt.current){r=y.face;break}}}catch(g){p.e(g)}finally{p.f()}switch(r&&(pl(r.normal),_e&&_e.equals(r.normal)||$e(r.normal)),Et.getState().setEnableOrbitController(!1),nt.current.x=l.cx,nt.current.y=l.cy,nt.current.z=l.cz,dt.current.fromArray(l.normal),ft.current.x=l.lx,ft.current.y=l.ly,ft.current.z=l.lz,l.type){case V.SolarPanel:pt.current=l.relativeAzimuth;break;case V.Polygon:mt.current=l.vertices.map((function(e){return Object(d.a)({},e)}))}}}},onPointerMove:function(t){if(lt.current&&e){if(lt.current.type===V.SolarPanel&&ml)return;if(lt.current.parentId===s&<.current.type&&!lt.current.locked){var l=new Me.Vector2(t.offsetX/ge.clientWidth*2-1,1-t.offsetY/ge.clientHeight*2);if(we.setFromCamera(l,ye),tt.current){var a=we.intersectObjects([tt.current]);if(a.length>0){var o=a[0].point,i=a[0].face;if(Ew.getState().moveHandleType){if(i){var r=i.normal;_e&&!_e.equals(r)&&$e(r),pl(r),_(lt.current.id,r.x,r.y,r.z)}if(o=Tw.relativeCoordinates(o.x,o.y,o.z,e),lt.current.type===V.Polygon){var n=lt.current;if(Ew.getState().moveHandleType===B.Default){var c,f,h=Tw.calculatePolygonCentroid(mt.current),p=(new Me.Vector3).fromArray(n.normal);Tw.isSame(p,St)?(c=-(h.x+o.z),f=o.y-h.y):Tw.isSame(p,jt)?(c=o.z-h.x,f=o.y-h.y):Tw.isSame(p,Ht)?(c=o.x-h.x,f=-(h.y+o.z)):Tw.isSame(p,zt)?(c=o.x-h.x,f=o.z-h.y):(c=o.x-h.x,f=o.y-h.y);var y=mt.current.map((function(e){return Object(d.a)({},e)}));y.forEach((function(e){e.x+=c,e.y+=f})),re(n.id,y)}}else Q(lt.current.id,o.x,o.y,o.z)}else if(Ew.getState().resizeHandleType)switch(lt.current.type){case V.SolarPanel:var g=lt.current,w=Em(g),v=Object(u.a)(w,2),A=v[0],T=v[1],P=Ew.getState().resizeAnchor,S=Ew.getState().resizeHandleType;if(S===K.Lower||S===K.Upper){var j=Math.max(1,Math.round(Math.abs(o.z-P.z)/T))*T,H=new Me.Vector3(0,0,o.z-P.z).normalize().multiplyScalar(j),z=(new Me.Vector3).addVectors(P,H.clone().divideScalar(2));F((function(e){var t=e.elements.find((function(e){return e.id===g.id}));t&&(t.cz=(z.z-Pt.current.z)/b,t.ly=Math.abs(H.z))}))}else if(S===K.Left||S===K.Right){var R=(new Me.Vector3).subVectors(o,P).setZ(0),D=Math.max(1,Math.round(R.length()/A))*A,M=R.clone().normalize().multiplyScalar(D),W=(new Me.Vector3).addVectors(P,M.clone().divideScalar(2)),I=(new Me.Vector3).subVectors(W,Pt.current).applyEuler(new Me.Euler(0,0,-Mt.current));F((function(e){var t=e.elements.find((function(e){return e.id===g.id}));t&&(Math.abs(Math.abs(t.normal[1])-1)<.01?t.cx=I.x/m:t.cy=I.y/x,t.lx=M.length())}))}break;case V.Polygon:if(Ew.getState().resizeHandleType===K.Default){var C,O,k=new Me.Vector3(o.x-Pt.current.x,o.y-Pt.current.y,0).applyEuler(new Me.Euler(0,0,-Mt.current,"ZXY")),Y=lt.current,L=(new Me.Vector3).fromArray(Y.normal);Tw.isSame(L,St)?(C=e.lz,O=e.ly,k.x=-o.z+Pt.current.z):Tw.isSame(L,jt)?(C=e.lz,O=e.ly,k.x=o.z-Pt.current.z):Tw.isSame(L,Ht)?(C=e.lx,O=e.lz,k.y=-o.z+Pt.current.z):Tw.isSame(L,zt)?(C=e.lx,O=e.lz,k.y=o.z-Pt.current.z):(C=e.lx,O=e.ly),(k=Ew.getState().enableFineGrid?Tw.snapToFineGrid(k):Tw.snapToNormalGrid(k)).x/=C,k.y/=O,ne(Y.id,Y.selectedIndex,k.x,k.y)}}}}}}},onPointerUp:function(){if(lt.current){var t=L(lt.current.id);if(t&&t.parentId===s){if(t.type===V.Polygon){if(Ew.getState().moveHandleType||Ew.getState().resizeHandleType){wt.current=t.vertices.map((function(e){return Object(d.a)({},e)}));var l={name:Ew.getState().moveHandleType?"Move Polygon":"Resize Polygon",timestamp:Date.now(),oldValue:mt.current,newValue:wt.current,changedElementId:t.id,changedElementType:t.type,undo:function(){re(l.changedElementId,l.oldValue)},redo:function(){re(l.changedElementId,l.newValue)}};oe(l)}}else if(Ew.getState().resizeHandleType){if(ct.current.x=t.cx,ct.current.y=t.cy,ct.current.z=t.cz,ht.current.x=t.lx,ht.current.y=t.ly,ht.current.z=t.lz,ct.current.distanceToSquared(nt.current)>At&&ht.current.distanceToSquared(ft.current)>At){var a={name:"Resize",timestamp:Date.now(),resizedElementId:lt.current.id,resizedElementType:lt.current.type,oldCx:nt.current.x,oldCy:nt.current.y,oldCz:nt.current.z,newCx:ct.current.x,newCy:ct.current.y,newCz:ct.current.z,oldLx:ft.current.x,oldLy:ft.current.y,oldLz:ft.current.z,newLx:ht.current.x,newLy:ht.current.y,newLz:ht.current.z,undo:function(){Q(a.resizedElementId,a.oldCx,a.oldCy,a.oldCz),Z(a.resizedElementId,a.oldLx,a.oldLy,a.oldLz)},redo:function(){Q(a.resizedElementId,a.newCx,a.newCy,a.newCz),Z(a.resizedElementId,a.newLx,a.newLy,a.newLz)}};oe(a)}}else if(Ew.getState().rotateHandleType){if(lt.current.type===V.SolarPanel){var o=lt.current;if(Math.abs(gt.current-pt.current)>At)if(function(t,l){var a=JSON.parse(JSON.stringify(t));return a.relativeAzimuth=l,ce(a)?(Qh(me.t("message.RotationCancelledBecauseOfOverlap",Wt)),!1):!!Tw.isSolarCollectorWithinHorizontalSurface(a,e)||(Qh(me.t("message.RotationOutsideBoundaryCancelled",Wt)),!1)}(o,gt.current)){F((function(e){e.selectedElementAngle=gt.current}));var i={name:"Rotate",timestamp:Date.now(),oldValue:pt.current,newValue:gt.current,changedElementId:o.id,changedElementType:o.type,undo:function(){te(i.changedElementId,i.oldValue)},redo:function(){te(i.changedElementId,i.newValue)}};oe(i)}else te(o.id,pt.current)}}else if(ct.current.x=t.cx,ct.current.y=t.cy,ct.current.z=t.cz,ut.current.fromArray(t.normal),ct.current.distanceToSquared(nt.current)>At){var r=!0;if(t.type===V.SolarPanel&&(r=wl(t,t.cx,t.cy)),r){var n,c={name:"Move",timestamp:Date.now(),movedElementId:lt.current.id,movedElementType:null===(n=lt.current)||void 0===n?void 0:n.type,oldCx:nt.current.x,oldCy:nt.current.y,oldCz:nt.current.z,oldNormal:dt.current.clone(),newCx:ct.current.x,newCy:ct.current.y,newCz:ct.current.z,newNormal:ut.current.clone(),undo:function(){Q(c.movedElementId,c.oldCx,c.oldCy,c.oldCz),c.oldNormal&&_(c.movedElementId,c.oldNormal.x,c.oldNormal.y,c.oldNormal.z)},redo:function(){Q(c.movedElementId,c.newCx,c.newCy,c.newCz),c.newNormal&&_(c.movedElementId,c.newNormal.x,c.newNormal.y,c.newNormal.z)}};oe(c)}else Q(t.id,nt.current.x,nt.current.y,nt.current.z)}lt.current=null}}},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===tt.current&&Ge(!0))},onPointerOut:function(){if(Ge(!1),lt.current)switch(lt.current.type){case V.Human:case V.Tree:case V.Flower:qe(!1);break;case V.SolarPanel:var e=Ew.getState().getElementById(lt.current.id);Ew.getState().moveHandleType&&!wl(e,e.cx,e.cy)&&Q(e.id,nt.current.x,nt.current.y,nt.current.z)}},onPointerEnter:function(e){lt.current&&Tw.isPlantOrHuman(lt.current)&&(e.intersections[0].object===tt.current&&qe(!0))},children:Al}),(null===(l=lt.current)||void 0===l?void 0:l.type)===V.SolarPanel&&ml&&!lt.current.locked&&Object(gf.jsx)(Lt.f,{ref:xt,name:"Cuboid Intersection Plane",position:Ft,args:[m,x],visible:!1,onPointerMove:function(t){if(xt.current&<.current&&e){if(lt.current.type!==V.SolarPanel||!ml)return;var l=lt.current;if(l.parentId!==s||l.locked)return;we.setFromCamera(xe,ye);var a=we.intersectObjects([xt.current]);if(a.length>0){var o=a[0].point.clone();if(Ew.getState().moveHandleType)o=Tw.relativeCoordinates(o.x,o.y,o.z-l.poleHeight,e),Q(l.id,o.x,o.y,o.z);else if(Ew.getState().rotateHandleType&&Ew.getState().rotateHandleType!==q.Tilt){var i=Mt.current,r=new Me.Vector2(Pt.current.x,Pt.current.y),n=new Me.Vector2(e.lx*l.cx,e.ly*l.cy).rotateAround(Dt,i),c=(new Me.Vector2).addVectors(n,r),d=-i+Math.atan2(-o.x+c.x,o.y-c.y)+(Ew.getState().rotateHandleType===q.Lower?0:Math.PI),u=d+(Math.abs(d)>Math.PI?-Math.sign(d)*bt:0);te(l.id,u),gt.current=u}else if(Ew.getState().resizeHandleType){var f=Ew.getState().resizeAnchor,h=le(l.pvModelName),p=new Me.Vector2(o.x,o.y),y=new Me.Vector2(f.x,f.y),g=p.distanceTo(y),w=l.relativeAzimuth+Mt.current,v=(new Me.Vector2).subVectors(p,y);switch(Ew.getState().resizeHandleType){case K.Lower:case K.Upper:var b=Ew.getState().resizeHandleType===K.Lower?1:-1,A=v.angle()-w+b*vt,T=g*Math.cos(A);if(l.orientation===$.portrait)T=Math.max(1,Math.ceil((T-h.length/2)/h.length))*h.length;else T=Math.max(1,Math.ceil((T-h.width/2)/h.width))*h.width;var P=f.x+b*(T*Math.sin(w))/2,S=f.y-b*(T*Math.cos(w))/2,j=new Me.Vector2(P,S),H=new Me.Vector2(Pt.current.x,Pt.current.y),z=(new Me.Vector2).subVectors(j,H).rotateAround(Dt,-Mt.current),R=z.x/m,D=z.y/x;xl(l,R,D,l.lx,T)&&(G(l.id,T),Q(l.id,R,D));break;case K.Left:case K.Right:var M=Ew.getState().resizeHandleType===K.Left?-1:1,W=v.angle()-w+(Ew.getState().resizeHandleType===K.Left?Math.PI:0),I=g*Math.cos(W);if(l.orientation===$.portrait)I=Math.max(1,Math.ceil((I-h.width/2)/h.width))*h.width;else I=Math.max(1,Math.ceil((I-h.length/2)/h.length))*h.length;var C=f.x+M*(I*Math.cos(w))/2,O=f.y+M*(I*Math.sin(w))/2,F=new Me.Vector2(C,O),k=new Me.Vector2(Pt.current.x,Pt.current.y),Y=(new Me.Vector2).subVectors(F,k).rotateAround(Dt,-Mt.current),L=Y.x/m,E=Y.y/x;xl(l,L,E,I,l.ly)&&(J(l.id,I),Q(l.id,L,E))}}}}}}),Ke&&Object(gf.jsxs)(gf.Fragment,{children:[(Ew.getState().moveHandleType||Ew.getState().resizeHandleType)&&Object(gf.jsx)(mf,{hx:rt.current.x,hy:rt.current.y,hz:rt.current.z,position:ot.current,rotation:it.current}),Ew.getState().rotateHandleType&<.current&<.current.type===V.SolarPanel&&Object(gf.jsx)(ly,{element:lt.current,height:lt.current.poleHeight+Ot})]}),O&&Object(gf.jsx)(cy,{element:e,verticalLift:gl}),(!O||he)&&Object(gf.jsx)(ry,{hx:It,hy:Ct,hz:Ot,lineColor:he&&Y?"white":S,lineWidth:he&&Y?5*H:H}),O&&R&&Object(gf.jsx)(ry,{hx:It,hy:Ct,hz:Ot,lineColor:yt,lineWidth:5*H}),Pl&&Object(gf.jsx)(iw,{id:s,args:Tl}),(Je||M)&&!O&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",text:Yt,color:null!==(a=null===e||void 0===e?void 0:e.labelColor)&&void 0!==a?a:"white",fontSize:null!==(i=null===e||void 0===e?void 0:e.labelFontSize)&&void 0!==i?i:20,fontFace:"Roboto",textHeight:null!==(n=null===e||void 0===e?void 0:e.labelSize)&&void 0!==n?n:.2,position:[0,0,Ot+(null!==(c=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==c?c:.2)]})]})},yw=n.a.memo(pw),gw=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,d=e.cz,h=e.lx,p=void 0===h?1:h,y=e.ly,g=void 0===y?1:y,m=e.lz,w=void 0===m?.1:m,x=e.rotation,v=void 0===x?[0,0,0]:x,b=e.normal,A=void 0===b?[0,0,1]:b,T=e.color,P=void 0===T?"white":T,S=e.lineColor,j=void 0===S?"black":S,H=e.lineWidth,z=void 0===H?.1:H,R=e.locked,D=void 0!==R&&R,M=e.showLabel,W=void 0!==M&&M,I=e.parentId,C=e.foundationId,O=(e.light,e.heatFlux,Ew(si)),F=Ew(Vi),k=Ew(o.shadowEnabled),Y=Ew(is),L=_f(n),E=Object(Se.f)().gl.domElement,U=Object(r.useState)(!1),N=Object(u.a)(U,2),J=N[0],G=N[1],K=Object(r.useRef)(),q=Object(r.useRef)(),Q=Object(r.useMemo)((function(){return{lng:F}}),[F]),Z=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===I)return a}}catch(o){l.e(o)}finally{l.f()}})),_=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===C)return a}}catch(o){l.e(o)}finally{l.f()}}));if(I&&Z)switch(Z.type){case V.Foundation:if(d=Z.cz+Z.lz/2,Tw.isZero(v[2]))c=Z.cx+c*Z.lx,s=Z.cy+s*Z.ly;else{var $=new Me.Vector3(c*Z.lx,s*Z.ly,0);$.applyAxisAngle(Rt,v[2]),c=Z.cx+$.x,s=Z.cy+$.y}break;case V.Wall:if((null===_||void 0===_?void 0:_.type)===V.Foundation){var ee=Tw.absoluteCoordinates(c,s,d,Z,_);c=ee.x,s=ee.y,d=ee.z}break;case V.Roof:if((null===_||void 0===_?void 0:_.type)===V.Foundation){var te=Tw.absoluteCoordinates(c,s,d,Z,_);c=te.x,s=te.y,d=te.z}}var le=w/2,ae=Object(r.useMemo)((function(){if((null===Z||void 0===Z?void 0:Z.type)===V.Wall){var e=Z,t=_?_.rotation[2]+e.relativeAngle:e.relativeAngle;return new Me.Euler(vt,0,t,"ZXY")}if((null===Z||void 0===Z?void 0:Z.type)===V.Roof)return new Me.Euler(v[0],v[1],_?_.rotation[2]+v[2]:v[2],"ZXY");if((null===Z||void 0===Z?void 0:Z.type)===V.Cuboid)return dw(A);var l=(new Me.Vector3).fromArray(A);return Tw.isSame(l,St)?new Me.Euler(0,vt,v[2],"ZXY"):Tw.isSame(l,jt)?new Me.Euler(0,-vt,v[2],"ZXY"):Tw.isSame(l,Ht)?new Me.Euler(-vt,0,v[2],"ZXY"):Tw.isSame(l,zt)?new Me.Euler(vt,0,v[2],"ZXY"):new Me.Euler(0,0,v[2])}),[A,v,null===_||void 0===_?void 0:_.rotation]),oe=Object(r.useMemo)((function(){return((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.SensorElement",Q))+((null===e||void 0===e?void 0:e.locked)?" ("+me.t("shared.ElementLocked",Q)+")":"")+"\n"+me.t("word.Coordinates",Q)+": ("+c.toFixed(1)+", "+s.toFixed(1)+", "+d.toFixed(1)+") "+me.t("word.MeterAbbreviation",Q)}),[null===e||void 0===e?void 0:e.label,D,F,c,s,d]);return Object(gf.jsxs)("group",{name:"Sensor Group "+n,rotation:ae,position:[c,s,d+le],children:[Object(gf.jsx)(Lt.a,{receiveShadow:k,uuid:n,ref:K,args:[p,g,w],name:"Sensor",onPointerDown:function(e){2!==e.button&&(Y(n,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=I,e.oldParentId=I,e.oldFoundationId=C})),O((function(e){e.moveHandleType=B.Default})))},onContextMenu:function(e){Y(n,e,X.ContextMenu),O((function(t){e.intersections.length>0&&(e.intersections[0].object===K.current&&(t.contextMenuObjectType=V.Sensor))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===K.current&&(G(!0),E.style.cursor="move"))},onPointerOut:function(){G(!1),E.style.cursor="default"},children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:(null===e||void 0===e?void 0:e.lit)?pt:P})}),Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Meter",castShadow:!1,receiveShadow:!1,args:[.3*p,.3*g,le,8,1],position:new Me.Vector3(0,0,le),rotation:[vt,0,0],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"black"})}),!L&&Object(gf.jsx)(ry,{hx:p/2,hy:g/2,hz:w/2,lineColor:j,lineWidth:z}),L&&D&&Object(gf.jsx)(ry,{hx:p/2,hy:g/2,hz:w/2,lineColor:yt,lineWidth:10*z}),L&&!D&&Object(gf.jsx)(Lt.h,{ref:q,position:new Me.Vector3(0,0,0),args:[st,6,6,0,Math.PI],name:B.Default,onPointerDown:function(e){2===e.button?(Y(n,e,X.ContextMenu),O((function(t){e.intersections.length>0&&(e.intersections[0].object===q.current&&(t.contextMenuObjectType=V.Sensor))}))):Y(n,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=I,e.oldParentId=I,e.oldFoundationId=C})),O((function(e){e.moveHandleType=B.Default}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),(J||W)&&!L&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:oe,color:null!==(t=null===e||void 0===e?void 0:e.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===e||void 0===e?void 0:e.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===e||void 0===e?void 0:e.labelSize)&&void 0!==a?a:.2,position:[0,0,w+(null!==(i=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==i?i:.2)]})]})},mw=n.a.memo(gw),ww=function(e){var t,l,a,i,n=e.id,c=e.cx,s=e.cy,d=e.cz,h=e.lx,p=void 0===h?1:h,y=e.ly,g=void 0===y?1:y,m=e.lz,w=void 0===m?.1:m,x=e.rotation,v=void 0===x?[0,0,0]:x,b=e.normal,A=void 0===b?[0,0,1]:b,T=e.color,P=void 0===T?"#ffff99":T,S=(e.lineColor,e.lineWidth),j=void 0===S?.1:S,H=e.locked,z=void 0!==H&&H,R=e.showLabel,D=void 0!==R&&R,M=e.parentId,W=e.foundationId,I=e.decay,C=void 0===I?2:I,O=e.distance,F=void 0===O?5:O,k=e.intensity,Y=void 0===k?3:k,L=e.inside,E=void 0!==L&&L,U=Ew(si),N=Ew(Vi),J=Ew(o.shadowEnabled),G=Ew(is),K=Ew(Es).z<=0,q=_f(n),Q=Object(Se.f)().gl.domElement,Z=Object(r.useState)(!1),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Object(r.useRef)(),le=Object(r.useRef)(),ae=Object(r.useMemo)((function(){return{lng:N}}),[N]),oe=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===M)return a}}catch(o){l.e(o)}finally{l.f()}})),ie=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===W)return a}}catch(o){l.e(o)}finally{l.f()}})),re=.1;if(M&&oe)switch(oe.type){case V.Foundation:if(d=oe.cz+oe.lz/2,Tw.isZero(v[2]))c=oe.cx+c*oe.lx,s=oe.cy+s*oe.ly;else{var ne=new Me.Vector3(c*oe.lx,s*oe.ly,0);ne.applyAxisAngle(Rt,v[2]),c=oe.cx+ne.x,s=oe.cy+ne.y}break;case V.Wall:if((null===ie||void 0===ie?void 0:ie.type)===V.Foundation){var ce=Tw.absoluteCoordinates(c,s,d,oe,ie);c=ce.x,s=ce.y,d=ce.z}re=oe.ly;break;case V.Roof:if((null===ie||void 0===ie?void 0:ie.type)===V.Foundation){var se=Tw.absoluteCoordinates(c,s,d,oe,ie);c=se.x,s=se.y,d=se.z}re=oe.thickness}var de=w/2,ue=Object(r.useMemo)((function(){if((null===oe||void 0===oe?void 0:oe.type)===V.Wall){var e=oe,t=ie?ie.rotation[2]+e.relativeAngle:e.relativeAngle;return new Me.Euler(vt,0,t,"ZXY")}if((null===oe||void 0===oe?void 0:oe.type)===V.Roof)return new Me.Euler(v[0],v[1],ie?ie.rotation[2]+v[2]:v[2],"ZXY");if((null===oe||void 0===oe?void 0:oe.type)===V.Cuboid)return dw(A);var l=(new Me.Vector3).fromArray(A);return Tw.isSame(l,St)?new Me.Euler(0,vt,v[2],"ZXY"):Tw.isSame(l,jt)?new Me.Euler(0,-vt,v[2],"ZXY"):Tw.isSame(l,Ht)?new Me.Euler(-vt,0,v[2],"ZXY"):Tw.isSame(l,zt)?new Me.Euler(vt,0,v[2],"ZXY"):new Me.Euler(0,0,v[2])}),[A,v,null===ie||void 0===ie?void 0:ie.rotation]),fe=Object(r.useMemo)((function(){return((null===e||void 0===e?void 0:e.label)?e.label:me.t("shared.LightElement",ae))+((null===e||void 0===e?void 0:e.locked)?" ("+me.t("shared.ElementLocked",ae)+")":"")+"\n"+me.t("word.Coordinates",ae)+": ("+c.toFixed(1)+", "+s.toFixed(1)+", "+d.toFixed(1)+") "+me.t("word.MeterAbbreviation",ae)}),[null===e||void 0===e?void 0:e.label,z,N,c,s,d]);return Object(gf.jsxs)("group",{name:"Light Group "+n,rotation:ue,position:[c,s,d],children:[K&&Object(gf.jsx)("pointLight",{color:P,name:"Point Light "+n,position:[0,0,E?-re-de:de],decay:C,distance:F,intensity:Y,castShadow:!0}),Object(gf.jsx)(Lt.d,{receiveShadow:J,userData:{unintersectable:!0},uuid:n,ref:te,position:[0,0,E?-re:0],rotation:[vt,0,0],args:[.5*p,.5*g,de,16,1],name:"Light Base",onPointerDown:function(e){2!==e.button&&(G(n,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=M,e.oldParentId=M,e.oldFoundationId=W})))},onContextMenu:function(e){G(n,e,X.ContextMenu),U((function(t){e.intersections.length>0&&(e.intersections[0].object===te.current&&(t.contextMenuObjectType=V.Light))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===te.current&&(ee(!0),Q.style.cursor="move"))},onPointerOut:function(){ee(!1),Q.style.cursor="default"},children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightgray"})}),Object(gf.jsx)(Lt.h,{userData:{unintersectable:!0},name:"Light Bulb",castShadow:!1,receiveShadow:J,args:[.3*p,8,8,0,bt,0,Math.PI],position:new Me.Vector3(0,0,E?-re-de:de),rotation:[vt,0,0],children:K?Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"}):Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),q&&z&&Object(gf.jsx)(ry,{hx:p/2,hy:g/2,hz:w/2,lineColor:yt,lineWidth:10*j}),q&&!z&&Object(gf.jsx)(Lt.h,{ref:le,position:new Me.Vector3(0,0,E?-re-de:de),args:[st,6,6,E?Math.PI:0,Math.PI],name:B.Default,onPointerDown:function(e){2===e.button?(G(n,e,X.ContextMenu),U((function(t){e.intersections.length>0&&(e.intersections[0].object===le.current&&(t.contextMenuObjectType=V.Light))}))):G(n,e,X.Move),Et.getState().setEnableOrbitController(!1),Tf.setState((function(e){e.showWallIntersectionPlaneId=M,e.oldParentId=M,e.oldFoundationId=W}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),($||D)&&!q&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:fe,color:null!==(t=null===e||void 0===e?void 0:e.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===e||void 0===e?void 0:e.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===e||void 0===e?void 0:e.labelSize)&&void 0!==a?a:.2,position:[0,0,(E?-re:0)+w+(null!==(i=null===e||void 0===e?void 0:e.labelHeight)&&void 0!==i?i:.2)]})]})},xw=n.a.memo(ww),vw="Cuboid Wrapper",bw="Cuboid Stackable Child",Aw=function e(t){var l=t.elements,a=t.cuboidModel,o=a.cx,i=a.cy,r=a.lz,n=a.rotation,c=r/2;return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)("group",{name:vw,position:[o,i,c],rotation:[0,0,n[2]],children:[Object(gf.jsx)(yw,Object(d.a)({},a)),l.map((function(t){if(function(e){return Jm(e)&&e.parentId===a.id}(t))return Object(gf.jsx)("group",{name:bw,position:[0,0,c],children:Object(gf.jsx)(e,{elements:l,cuboidModel:t})},t.id);if(t.parentId===a.id){var o=a.lx,i=a.ly,r=a.lz;switch(t.type){case V.SolarPanel:return Object(gf.jsx)(hw,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*o,cy:t.cy*i,cz:t.cz*r}),t.id);case V.Sensor:return Object(gf.jsx)(mw,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*o,cy:t.cy*i,cz:t.cz*r}),t.id);case V.Light:return Object(gf.jsx)(xw,Object(d.a)(Object(d.a)({},t),{},{cx:t.cx*o,cy:t.cy*i,cz:t.cz*r}),t.id);default:return null}}}))]})})},Tw=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"calculateProfit",value:function(e){return.001*(e.yearlyYield*e.sellingPrice-e.panelCount*e.unitCost*365)}},{key:"calculateCost",value:function(e){return e.panelCount*e.unitCost*.365}},{key:"getLatLngKey",value:function(e,t){return e.toFixed(4)+", "+t.toFixed(4)}},{key:"getModelKey",value:function(e){return e.title+", "+e.userid}},{key:"resizeCanvas",value:function(e,t,l){var a=document.createElement("canvas");a.width=t,a.height=l||t*e.height/e.width;var o=a.getContext("2d");return o&&o.drawImage(e,0,0,e.width,e.height,0,0,a.width,a.height),a}},{key:"getEuler",value:function(e,t,l,a,o,i){var r=new Me.Quaternion;r.setFromUnitVectors(e,t);var n=new Me.Euler;return n.setFromQuaternion(r),l&&(n.order=l),a&&(n.x+=a),o&&(n.y+=o),i&&(n.z+=i),n}},{key:"zero2DArray",value:function(e){for(var t=0;t0){var d,u=Object(f.a)(n);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(!h.leftJoints||0===h.leftJoints.length)return D.WALL_DISJOINED;if(!h.rightJoints||0===h.rightJoints.length)return D.WALL_DISJOINED}}catch(p){u.e(p)}finally{u.f()}}return D.COMPLETE}},{key:"calculateBuildingArea",value:function(t){var l=e.getWallPointsOfRoof(t);return e.getPolygonArea(l)}},{key:"toUValueInUS",value:function(e){return e/5.67826}},{key:"toUValueInSI",value:function(e){return 5.67826*e}},{key:"toRValueInUS",value:function(e){return 5.67826*e}},{key:"toRValueInSI",value:function(e){return e/5.67826}},{key:"fetchWaterTexture",value:function(e,t){var l=document.createElement("canvas");l.width=e,l.height=t;var a=l.getContext("2d");if(a){var o=a.createRadialGradient(e/2,t/2,0,e/2,t/2,Math.max(e,t)/2);o.addColorStop(0,"#45AAEA"),o.addColorStop(.04,"#2B65EC"),o.addColorStop(.2,"#0000FF"),a.fillStyle=o,a.fillRect(0,0,e,t)}return new Me.CanvasTexture(l)}},{key:"fetchWhiteTexture",value:function(e,t){var l=document.createElement("canvas");l.width=e,l.height=t;var a=l.getContext("2d");return a&&(a.fillStyle="white",a.fillRect(0,0,e,t)),new Me.CanvasTexture(l)}},{key:"fetchIntersectables",value:function(e){var t=[];return e.traverse((function(e){e.userData.unintersectable||t.push(e)})),t}},{key:"fetchSimulationElements",value:function(t,l){if(t.userData.simulation&&l.push(t),t.children.length>0){var a,o=Object(f.a)(t.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;e.fetchSimulationElements(i,l)}}catch(r){o.e(r)}finally{o.f()}}}},{key:"getSimulationElements",value:function(t,l,a){if(t.userData.simulation&&t.uuid!==a&&l.push(t),t.children.length>0){var o,i=Object(f.a)(t.children);try{for(i.s();!(o=i.n()).done;){var r=o.value;e.getSimulationElements(r,l,a)}}catch(n){i.e(n)}finally{i.f()}}}},{key:"hasMovingParts",value:function(e){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;){var a=t.value;switch(a.type){case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:return!0;case V.SolarPanel:if(a.trackerType!==te.NO_TRACKER)return!0}}}catch(o){l.e(o)}finally{l.f()}return!1}},{key:"onBuildingEnvelope",value:function(e){return e.type===V.Foundation||e.type===V.Window||e.type===V.Door||e.type===V.Wall||e.type===V.Roof}},{key:"getWindowArea",value:function(e,t){if(t){if(e.windowType===Yt.Arched&&e.archHeight>0){var l=.5*e.lx*t.lx,a=e.lz*t.lz,o=Math.min(e.archHeight,a,l),i=.5*(o+l*l/o),r=Math.acos(Math.min(l/i,1));return.5*(Math.PI-2*r)*i*i-l*(i-o)+(a-o)*l*2}if(e.windowType===Yt.Polygonal&&e.polygonTop){var n=e.lx*e.lz*t.lx*t.lz;return n+=e.lx*t.lx*e.polygonTop[1]/2}return e.lx*e.lz*t.lx*t.lz}if(e.windowType===Yt.Arched&&e.archHeight>0){var c=.5*e.lx,s=e.lz,d=Math.min(e.archHeight,s,c),u=.5*(d+c*c/d),f=Math.acos(Math.min(c/u,1));return.5*(Math.PI-2*f)*u*u-c*(u-d)+(s-d)*c*2}if(e.windowType===Yt.Polygonal&&e.polygonTop){var h=e.lx*e.lz;return h+=e.lx*e.polygonTop[1]/2}return e.lx*e.lz}},{key:"getDoorArea",value:function(e,t){if(t){if(e.doorType===hy.Arched&&e.archHeight>0){var l=.5*e.lx*t.lx,a=e.lz*t.lz,o=Math.min(e.archHeight,a,l),i=.5*(o+l*l/o),r=Math.acos(Math.min(l/i,1));return.5*(Math.PI-2*r)*i*i-l*(i-o)+(a-o)*l*2}return e.lx*e.lz*t.lx*t.lz}if(e.doorType===hy.Arched&&e.archHeight>0){var n=.5*e.lx,c=e.lz,s=Math.min(e.archHeight,c,n),d=.5*(s+n*n/s),u=Math.acos(Math.min(n/d,1));return.5*(Math.PI-2*u)*d*d-n*(d-s)+(c-s)*n*2}return e.lx*e.lz}},{key:"hasHeliostatOrFresnelReflectors",value:function(e){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector||a.type===V.Heliostat)return!0}}catch(o){l.e(o)}finally{l.f()}return!1}},{key:"lineIntersection",value:function(e,t,l,a){var o=t.x-e.x,i=t.y-e.y,r=o*(a.y-l.y)-(a.x-l.x)*i;if(0!==r){var n=((a.y-l.y)*(a.x-e.x)+(l.x-a.x)*(a.y-e.y))/r,c=((e.y-t.y)*(a.x-e.x)+o*(a.y-e.y))/r;if(0<=n&&n<=1&&0<=c&&c<=1)return{x:e.x+n*o,y:e.y+n*i}}}},{key:"calculateSolarRadiationColor",value:function(e,t){var l=t/(Ze.length-1),a=Math.max(0,Math.floor(e/l));a>Ze.length-2&&(a=Ze.length-2);var o=Math.min(1,(e-l*a)/l);return new Me.Color(Ze[a]).lerp(Ze[a+1],o)}},{key:"transpose",value:function(e){return e[0].map((function(t,l){return e.map((function(e){return e[l]}))}))}},{key:"clone2DArray",value:function(e){return e.map((function(e){return Object(h.a)(e)}))}},{key:"fetchHeatmapTexture",value:function(t,l,a){if(!t)return null;var o=document.createElement("canvas"),i=t.length,r=t[0].length;o.width=i,o.height=r;var n=o.getContext("2d");if(n){n.clearRect(0,0,i,r);for(var c=n.getImageData(0,0,i,r),s=c.data,d=0;dt!==s>t&&e<(c-r)*(t-n)/(s-n)+r&&(a=!a)}return a}},{key:"getPoints",value:function(e){var t,l=[],a=Object(f.a)(e);try{for(a.s();!(t=a.n()).done;){var o=t.value;l.push({x:o.x,y:o.y})}}catch(i){a.e(i)}finally{a.f()}return l}},{key:"polygonIntersections",value:function(t,l,a){for(var o,i,r,n=new Array,c=0;c0&&(l>s.x&&(l=s.x),o>s.y&&(o=s.y),a=l||Math.abs(i)>=a)return!1;var r=e.rightPoint[0],n=e.rightPoint[1];return!(Math.abs(r)>=l||Math.abs(n)>=a)}},{key:"isSensorWithin",value:function(e,t){return Math.abs(e.cx)<.5-e.lx/t.lx&&Math.abs(e.cy)<.5-e.ly/t.ly}},{key:"isSolarCollectorWithinHorizontalSurface",value:function(e,t){var l=e.cx*t.lx,a=e.cy*t.ly,o=Math.cos(e.relativeAzimuth),i=Math.sin(e.relativeAzimuth),r=.5*t.lx,n=.5*t.ly,c=.5*e.lx,s=.5*e.ly*Math.cos(e.tiltAngle),d=l+c*o-s*i,u=a+c*i+s*o;return!(Math.abs(d)>r||Math.abs(u)>n)&&(d=l+c*o+s*i,u=a+c*i-s*o,!(Math.abs(d)>r||Math.abs(u)>n)&&(d=l-c*o-s*i,u=a-c*i+s*o,!(Math.abs(d)>r||Math.abs(u)>n)&&(d=l-c*o+s*i,u=a-c*i-s*o,!(Math.abs(d)>r||Math.abs(u)>n))))}},{key:"isUnitVectorX",value:function(t){return e.isSame(t,St)||e.isSame(t,jt)}},{key:"isUnitVectorY",value:function(t){return e.isSame(t,Ht)||e.isSame(t,zt)}},{key:"isSame",value:function(e,t){return Math.abs(e.x-t.x)At)return!1;return!0}},{key:"isZero",value:function(e){return Math.abs(e)-1&&e.splice(l,1)}},{key:"fixElements",value:function(t){var l,a=[],o=Object(f.a)(t);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type||a.push(i)}}catch(s){o.e(s)}finally{o.f()}if(a.length>0){var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;e.deleteElement(t,c)}}catch(s){n.e(s)}finally{n.f()}}}},{key:"isResizingVertical",value:function(e){switch(e){case K.LowerLeftTop:case K.UpperLeftTop:case K.LowerRightTop:case K.UpperRightTop:return!0;default:return!1}}},{key:"isTopResizeHandle",value:function(e){return e===K.LowerLeftTop||e===K.LowerRightTop||e===K.UpperLeftTop||e===K.UpperRightTop||e===K.Top}},{key:"isXResizeHandle",value:function(e){return e===K.Left||e===K.Right}},{key:"isYResizeHandle",value:function(e){return e===K.Upper||e===K.Lower}},{key:"isTopResizeHandleOfWall",value:function(e){return e===K.UpperLeft||e===K.UpperRight}},{key:"isRiseHandleOfRoof",value:function(e){return e===ge.Top||e===ge.Mid||e===ge.TopMid}},{key:"isMoveHandle",value:function(e){return e===B.Default||e===B.Top||e===B.Upper||e===B.Lower||e===B.Left||e===B.Right}},{key:"snapToNormalGrid",value:function(e){var t=Math.round(e.x/mt)*mt,l=Math.round(e.y/mt)*mt;return new Me.Vector3(t,l,e.z)}},{key:"snapToFineGrid",value:function(e){var t=Math.round(e.x/gt)*gt,l=Math.round(e.y/gt)*gt;return new Me.Vector3(t,l,e.z)}},{key:"isPositionRelative",value:function(e){return e===V.SolarPanel||e===V.ParabolicTrough||e===V.ParabolicDish||e===V.FresnelReflector||e===V.Heliostat||e===V.WaterHeater||e===V.Sensor||e===V.Light||e===V.Polygon||e===V.Window||e===V.Door||e===V.Roof||e===V.Wall}},{key:"isPlantOrHuman",value:function(e){return e.type===V.Tree||e.type===V.Flower||e.type===V.Human}},{key:"isFoundationOrCuboid",value:function(e){return e.type===V.Foundation||e.type===V.Cuboid}},{key:"isSolarCollector",value:function(t){return e.isSolarCollectorType(t.type)}},{key:"isSolarCollectorType",value:function(t){return t===V.SolarPanel||t===V.WaterHeater||e.isCspCollectorType(t)}},{key:"isCspCollector",value:function(t){return e.isCspCollectorType(t.type)}},{key:"isCspCollectorType",value:function(e){return e===V.ParabolicDish||e===V.ParabolicTrough||e===V.FresnelReflector||e===V.Heliostat}},{key:"isParabolicCollector",value:function(t){return e.isParabolaType(t.type)}},{key:"isParabolaType",value:function(e){return e===V.ParabolicDish||e===V.ParabolicTrough}},{key:"isParabolicTroughOrFresnelReflector",value:function(e){return e===V.FresnelReflector||e===V.ParabolicTrough}},{key:"isHeliostatOrFresnelReflector",value:function(e){return e===V.FresnelReflector||e===V.Heliostat}},{key:"isLegalOnWall",value:function(e){switch(e){case V.Window:case V.Door:case V.Sensor:case V.Light:case V.SolarPanel:case V.Polygon:return!0}return!1}},{key:"isDescendantOf",value:function(t,l){var a=t.parentId;if(!a||a===xt)return!1;var o=Ew.getState().getElementById(a);return!!o&&(o.id===l||e.isDescendantOf(o,l))}},{key:"isElementInsideWall",value:function(t,l,a,o,i){for(var r=l/2,n=a/2,c=-1;c<=1;c+=2)for(var s=-1;s<=1;s+=2)if(!i||-1!==s){var d=t.x+r*c,u=t.z+n*s;if(!e.isPointInside(d,u,o))return!1}var h,p=[{x:t.x-r,y:t.z-n},{x:t.x-r,y:t.z+n},{x:t.x+r,y:t.z+n},{x:t.x+r,y:t.z-n}],y=Object(f.a)(o);try{for(y.s();!(h=y.n()).done;){var g=h.value;if(e.isPointInside(g.x,g.y,p))return!1}}catch(m){y.e(m)}finally{y.f()}return!0}},{key:"checkElementOnWallState",value:function(t,l){var a=1e-5,o=t.lx/2+a,i=t.lz/2+a;l&&t.type===V.SolarPanel&&(o=o/l.lx+a,i=t.ly/2/l.lz+a);var r=t.cx-o,n=t.cx+o,c=t.cz-i,s=t.cz+i;if(l&&l.type===V.Wall&&!e.isElementInsideWall(new Me.Vector3(t.cx*l.lx,t.cy,t.cz*l.lz),l.lx*o*2,l.lz*i*2,e.getWallInnerSideShapePoints(l),t.type===V.Door))return ye.OutsideBoundary;var d,u=Object(f.a)(Ew.getState().elements);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(e.isLegalOnWall(h.type)&&h.type!==V.Polygon&&h.parentId===t.parentId&&h.id!==t.id){var p=h.lx/2,y=h.lz/2;l&&h.type===V.SolarPanel&&(p/=l.lx,y=h.ly/2/l.lz);var g=h.cx-p,m=h.cx+p,w=h.cz-y,x=h.cz+y;if((r>=g&&r<=m||n>=g&&n<=m||g>=r&&g<=n||m>=r&&m<=n)&&(c>=w&&c<=x||s>=w&&s<=x||w>=c&&w<=s||x>=c&&x<=s))return ye.OverLap}}}catch(v){u.e(v)}finally{u.f()}return ye.Valid}},{key:"checkElementOnRoofState",value:function(e,t){if(e.foundationId){var l=Ew.getState().getElementById(e.foundationId);if(l){var a=Vm.getSolarPanelVerticesOnRoof(e,l),o=Vm.getRoofBoundaryVertices(t);return Vm.rooftopElementBoundaryCheck(a,o)?Vm.rooftopSPCollisionCheck(e,l,a)?ye.Valid:ye.OverLap:ye.OutsideBoundary}}return ye.Invalid}},{key:"relativeCoordinates",value:function(t,l,a,o){var i=new Me.Vector3(t,l,a);if(o.type===V.Wall){var r=new Me.Vector3(o.cx,o.cy),n=Ew.getState().getParent(o);if(n){var c=new Me.Vector3(n.cx,n.cy);r.applyEuler(new Me.Euler(0,0,n.rotation[2])).add(c).setZ(n.lz+o.lz/2),i.sub(r).applyEuler(new Me.Euler(0,0,-o.relativeAngle-n.rotation[2]))}}else{var s=e.getWorldDataById(o.id),d=s.pos,u=s.rot;i.set(t-d.x,l-d.y,a-d.z),i.applyEuler(new Me.Euler(0,0,-u))}return i.x/=o.lx,i.y/=o.ly,i.z/=o.lz,i}},{key:"absoluteCoordinates",value:function(t,l,a,o,i,r){if(o.type===V.Wall&&i){var n=o,c=i?i.rotation[2]+n.relativeAngle:n.relativeAngle;if(void 0!==c){var s=e.wallAbsolutePosition(new Me.Vector3(n.cx,n.cy,n.cz),i).setZ(n.lz/2+i.lz),d=new Me.Vector3(t*n.lx,l*n.ly,a*n.lz);if(d.applyAxisAngle(Rt,c),r){var u=r*Math.cos(c-vt),f=r*Math.sin(c-vt);return new Me.Vector3(s.x+d.x+u,s.y+d.y+f,s.z+d.z)}return new Me.Vector3(s.x+d.x,s.y+d.y,s.z+d.z)}}if(o.type===V.Roof&&i){var h=new Me.Vector3(t*i.lx,l*i.ly,a+i.lz);return h.applyEuler((new Me.Euler).fromArray(i.rotation)),h.x+=i.cx,h.y+=i.cy,h}var p=new Me.Vector3(t*o.lx,l*o.ly,a*o.lz);return p.applyEuler((new Me.Euler).fromArray(o.rotation)),p.x+=o.cx,p.y+=o.cy,p.z+=o.cz,p}},{key:"absoluteHumanOrTreeCoordinates",value:function(e,t,l,a){var o=new Me.Vector3(e,t,l);return o.applyEuler((new Me.Euler).fromArray(a.rotation)),o.x+=a.cx,o.y+=a.cy,o.z+=a.cz,o}},{key:"relativePoint",value:function(e,t){var l=new Me.Vector3(e.x-t.cx,e.y-t.cy,e.z-t.cz);return l.applyEuler((new Me.Euler).fromArray(t.rotation.map((function(e){return-e})))),l}},{key:"wallAbsolutePosition",value:function(e,t){var l=new Me.Vector3(t.cx,t.cy);return(new Me.Vector3).addVectors(l,new Me.Vector3(e.x,e.y).applyAxisAngle(Rt,t.rotation[2]))}},{key:"wallRelativePosition",value:function(e,t){var l=new Me.Vector3(t.cx,t.cy);return(new Me.Vector3).subVectors(new Me.Vector3(e.x,e.y),l).applyAxisAngle(Rt,-t.rotation[2])}},{key:"getObjectChildById",value:function(t,l){if(t){var a,o=Object(f.a)(t.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name===vw){var r=e.getStackCuboidObjectById(i,l);if(r)return r}else if(i.name.includes(l))return i}}catch(n){o.e(n)}finally{o.f()}}return null}},{key:"getStackCuboidObjectById",value:function(t,l){if(t){var a,o=Object(f.a)(t.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes(l))return i;if(i.name===bw){var r=e.getStackCuboidObjectById(i.children[0],l);if(r)return r}}}catch(n){o.e(n)}finally{o.f()}}return null}},{key:"toRadians",value:function(e){return e*(Math.PI/180)}},{key:"toDegrees",value:function(e){return e*(180/Math.PI)}},{key:"getArrayMax",value:function(e){return e.reduce((function(e,t){return Math.max(e,t)}))}},{key:"getArrayMin",value:function(e){return e.reduce((function(e,t){return Math.min(e,t)}))}},{key:"getArrayMax2D",value:function(t){return e.getArrayMax(t.map(e.getArrayMax))}},{key:"getArrayMin2D",value:function(t){return e.getArrayMin(t.map(e.getArrayMin))}},{key:"sphericalToCartesianZ",value:function(e){var t=e.x*Math.cos(e.z),l=t*Math.cos(e.y),a=t*Math.sin(e.y),o=e.x*Math.sin(e.z);return e.set(l,a,o),e}},{key:"getDistance",value:function(t,l,a,o){return t=e.toRadians(t),l=e.toRadians(l),a=e.toRadians(a),o=e.toRadians(o),Math.acos(Math.sin(l)*Math.sin(o)+Math.cos(l)*Math.cos(o)*Math.cos(Math.abs(t-a)))}},{key:"minutesIntoDay",value:function(e){return 60*e.getHours()+e.getMinutes()}},{key:"dayOfYear",value:function(e){return(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())-Date.UTC(e.getFullYear(),0,0))/864e5}},{key:"daysInYear",value:function(e){var t=e.getFullYear();return t%4===0&&t%100>0||t%400===0?366:365}},{key:"daysOfMonth",value:function(e,t){return new Date(t,e+1,0).getDate()}},{key:"fahrenheitToCelsius",value:function(e){return 5*(e-32)/9}},{key:"celsiusToFahrenheit",value:function(e){return 1.8*e+32}},{key:"getOS",value:function(){var e;return null===(e=kt.a.os)||void 0===e?void 0:e.family}},{key:"isMac",value:function(){var t=e.getOS();return!!t&&(t.includes("Mac")||t.includes("OS X"))}},{key:"isChrome",value:function(){var t=e.getOS();return!!t&&t.includes("Chrome")}},{key:"detectWebGLContext",value:function(){try{var e=document.createElement("canvas");return!!window.WebGLRenderingContext&&(!!e.getContext("webgl")||!!e.getContext("experimental-webgl"))}catch(t){return!1}}},{key:"clamp",value:function(e,t,l){return t>l?(t+l)/2:Math.min(Math.max(e,t),l)}},{key:"distanceFromPointToLine2D",value:function(e,t,l){var a,o,i=[e.x,e.y],r=i[0],n=i[1],c=[t.x,t.y],s=c[0],d=c[1],u=[l.x,l.y],f=u[0],h=u[1],p=f-s,y=h-d,g=p*p+y*y,m=-1;0!==g&&(m=((r-s)*p+(n-d)*y)/g),m<0?(a=s,o=d):m>1?(a=f,o=h):(a=s+m*p,o=d+m*y);var w=r-a,x=n-o;return Math.sqrt(w*w+x*x)}},{key:"mapVector3ToPoint2",value:function(e){return{x:e.x,y:e.y}}},{key:"getWallVertices",value:function(e,t){var l,a,o=e.lx/2,i=e.lz/2,r={x:-o-t,y:-i-t},n={x:o+t,y:-i-t},c={x:-o-t,y:(null!==(l=e.leftRoofHeight)&&void 0!==l?l:e.lz)-i+t},s={x:o+t,y:(null!==(a=e.rightRoofHeight)&&void 0!==a?a:e.lz)-i+t},d=[];return d.push(c,r,n,s),e.centerRightRoofHeight&&d.push({x:e.centerRightRoofHeight[0]*e.lx,y:e.centerRightRoofHeight[1]-i+t}),e.centerRoofHeight&&d.push({x:e.centerRoofHeight[0]*e.lx,y:e.centerRoofHeight[1]-i+t}),e.centerLeftRoofHeight&&d.push({x:e.centerLeftRoofHeight[0]*e.lx,y:e.centerLeftRoofHeight[1]-i+t}),d}},{key:"isPartialWallFull",value:function(t){var l,a;return e.isZero((null!==(l=t.leftRoofHeight)&&void 0!==l?l:t.lz)-t.leftTopPartialHeight)&&e.isZero((null!==(a=t.rightRoofHeight)&&void 0!==a?a:t.lz)-t.rightTopPartialHeight)&&e.isZero(t.leftUnfilledHeight)&&e.isZero(t.rightUnfilledHeight)}},{key:"getPartialWallVertices",value:function(t,l){if(e.isPartialWallFull(t))return e.getWallVertices(t,l);var a=t.lx/2,o=t.lz/2,i={x:-a-l,y:t.leftUnfilledHeight-o-l},r={x:a+l,y:t.rightUnfilledHeight-o-l},n={x:-a-l,y:t.leftTopPartialHeight-o+l},c={x:a+l,y:t.rightTopPartialHeight-o+l},s=[];return s.push(n,i,r,c),t.centerRightRoofHeight&&s.push({x:t.centerRightRoofHeight[0]*t.lx,y:t.centerRightRoofHeight[1]-o+l}),t.centerRoofHeight&&s.push({x:t.centerRoofHeight[0]*t.lx,y:t.centerRoofHeight[1]-o+l}),t.centerLeftRoofHeight&&s.push({x:t.centerLeftRoofHeight[0]*t.lx,y:t.centerLeftRoofHeight[1]-o+l}),s}},{key:"getHighestPointOfWall",value:function(e){var t=e.lz;return e.leftRoofHeight&&(t=Math.max(t,e.leftRoofHeight)),e.rightRoofHeight&&(t=Math.max(t,e.rightRoofHeight)),e.centerRightRoofHeight&&(t=Math.max(t,e.centerRightRoofHeight[1])),e.centerRoofHeight&&(t=Math.max(t,e.centerRoofHeight[1])),e.centerLeftRoofHeight&&(t=Math.max(t,e.centerLeftRoofHeight[1])),t}},{key:"getWallPointsOfRoof",value:function(e,t){var l=null!==t&&void 0!==t?t:Ew.getState().getElementById(e.wallsId[0]);if(!l)return[];for(var a=l,o=[];l&&(!l.roofId||l.roofId===e.id);){var i;if(o.push({x:l.leftPoint[0],y:l.leftPoint[1],eave:null!==(i=l.eavesLength)&&void 0!==i?i:0}),!l.leftJoints[0])break;if(l.leftJoints[0]===a.id)return o.reverse(),o;l=Ew.getState().getElementById(l.leftJoints[0])}for(o.reverse(),l=Ew.getState().getElementById(null===a||void 0===a?void 0:a.rightJoints[0]);l&&(!l.roofId||l.roofId===e.id);){var r;if(o.push({x:l.leftPoint[0],y:l.leftPoint[1],eave:null!==(r=l.eavesLength)&&void 0!==r?r:0}),!l.rightJoints[0]||l.rightJoints[0]===a.id)break;l=Ew.getState().getElementById(l.rightJoints[0])}return o}},{key:"getWallInnerSideShapePoints",value:function(t){var l=t.lx,a=t.ly,o=t.lz,i=t.relativeAngle,r=t.fill,n=t.leftUnfilledHeight,c=t.rightUnfilledHeight,s=t.leftRoofHeight,d=t.centerLeftRoofHeight,u=t.centerRoofHeight,f=t.centerRightRoofHeight,h=t.rightRoofHeight,p=t.leftJoints,y=t.rightJoints,g=p.length>0?Ew.getState().getElementById(p[0]):null,m=y.length>0?Ew.getState().getElementById(y[0]):null,w=g&&g.type===V.Wall?e.getInnerWallOffset(g,l,a,i,"left"):0,x=m&&m.type===V.Wall?e.getInnerWallOffset(m,l,a,i,"right"):0,v=[],b=l/2,A=o/2;return r===Ue.Partial?(v.push({x:-b+w,y:-A+n}),v.push({x:b-x,y:-A+c})):(v.push({x:-b+w,y:-A}),v.push({x:b-x,y:-A})),h?v.push({x:b-x,y:h-A}):v.push({x:b-x,y:A}),f&&v.push({x:f[0]*l,y:f[1]-A}),u&&v.push({x:u[0]*l,y:u[1]-A}),d&&v.push({x:d[0]*l,y:d[1]-A}),s?v.push({x:-b+w,y:s-A}):v.push({x:-b+w,y:A}),v}},{key:"getInnerWallOffset",value:function(e,t,l,a,o){var i=0;if(e&&e.fill!==Ue.Empty){var r="left"===o?-1:1,n=(3*Math.PI+r*(a-e.relativeAngle))%bt;n<=vt+.01&&n>0&&(i=Math.min(l/Math.tan(n)+e.ly,t))}return i}},{key:"isElementAllowedMultipleMoveOnGround",value:function(e){return e.type===V.Foundation||e.type===V.Cuboid&&e.parentId===xt}}]),e}();Tw.WATER_TEXTURE=Tw.fetchWaterTexture(100,100),Tw.WHITE_TEXTURE=Tw.fetchWhiteTexture(2,2),Tw.getAllConnectedWalls=function(e){for(var t=Ew.getState().getElementById,l=[],a=e;e&&(l.push(e),e.leftJoints[0]);){if(e.leftJoints[0]===a.id)return l;var o=t(e.leftJoints[0]);o&&o.type===V.Wall&&(e=o)}var i=t(a.rightJoints[0]);for(i&&i.type===V.Wall&&(e=i);e&&(l.push(e),e.rightJoints[0]&&e.rightJoints[0]!==a.id);){var r=t(e.rightJoints[0]);r&&(e=r)}return l},Tw.getWorldDataById=function(e){var t=Ew.getState().getElementById(e);if(!t)return{pos:new Me.Vector3,rot:0,topZ:0};var l=new Me.Vector3(t.cx,t.cy,t.cz),a=t.rotation[2],o=t.lz;if(t.parentId===xt)return{pos:l,rot:a,topZ:o};var i=Tw.getWorldDataById(t.parentId),r=i.pos,n=i.rot,c=i.topZ,s=new Me.Euler(0,0,n);return{pos:(new Me.Vector3).addVectors(l.applyEuler(s),r.clone().setZ(c)),rot:a+n,topZ:o+c}},Tw.isChild=function(e,t){var l=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=Ew.getState().getElementById(t);return!!a&&((!l||!a.locked)&&(a.parentId===e||Tw.isChild(e,a.parentId,l)))},Tw.getBaseId=function(e){var t=Ew.getState().getElementById(e);return t?t.parentId===xt?t.id:Tw.getBaseId(t.parentId):null},Tw.isElementTriggerAutoDeletion=function(e){if(e.type===V.Roof){var t=e;if(t.roofType===It.Gable||t.roofType===It.Gambrel)return!0}if(e.type!==V.Wall)return!1;var l=e;if(!l.roofId)return!1;var a=Ew.getState().getElementById(l.roofId);if(!a)return!1;switch(a.roofType){case It.Hip:case It.Gable:case It.Gambrel:return!0;case It.Pyramid:case It.Mansard:return 0!==a.wallsId.length&&a.wallsId[0]===l.id;default:return!1}};var Pw=function(){function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.name=void 0,this.date=void 0,this.ground=void 0,this.latitude=void 0,this.longitude=void 0,this.address=void 0,this.countryCode=void 0,this.leafDayOfYear1=void 0,this.leafDayOfYear2=void 0,this.airAttenuationCoefficient=void 0,this.airConvectiveCoefficient=void 0,this.timesPerHour=void 0,this.daysPerYear=void 0,this.monthlyIrradianceLosses=void 0,this.pvGridCellSize=void 0,this.discretization=void 0,this.diurnalTemperatureModel=void 0,this.highestTemperatureTimeInMinutes=void 0,this.solarPanelVisibilityGridCellSize=void 0,this.solarRadiationHeatmapGridCellSize=void 0,this.cspTimesPerHour=void 0,this.cspDaysPerYear=void 0,this.cspGridCellSize=void 0,this.sutTimesPerHour=void 0,this.sutDaysPerYear=void 0,this.sutGridCellSize=void 0,this.noAnimationForHeatmapSimulation=void 0,this.noAnimationForThermalSimulation=void 0,this.noAnimationForSensorDataCollection=void 0,this.noAnimationForSolarPanelSimulation=void 0,this.noAnimationForSolarUpdraftTowerSimulation=void 0,this.latitude=42.2844063,this.longitude=-71.3488548,this.address=Xe,this.countryCode="US",this.date=new Date((new Date).getFullYear(),5,22,12).toLocaleString("en-US"),this.name="default",this.ground={albedo:.3,thermalDiffusivity:.05,snowReflectionFactors:new Array(12).fill(0)},this.leafDayOfYear1=rt,this.leafDayOfYear2=nt,this.airAttenuationCoefficient=.01,this.airConvectiveCoefficient=5,this.timesPerHour=1,this.daysPerYear=12,this.monthlyIrradianceLosses=new Array(12).fill(.05),this.pvGridCellSize=.5,this.discretization=ae.APPROXIMATE,this.diurnalTemperatureModel=U.Sinusoidal,this.highestTemperatureTimeInMinutes=900,this.solarPanelVisibilityGridCellSize=.2,this.solarRadiationHeatmapGridCellSize=.5,this.cspTimesPerHour=1,this.cspDaysPerYear=4,this.cspGridCellSize=.5,this.sutTimesPerHour=1,this.sutDaysPerYear=4,this.sutGridCellSize=1,this.noAnimationForHeatmapSimulation=!1,this.noAnimationForThermalSimulation=!1,this.noAnimationForSensorDataCollection=!1,this.noAnimationForSolarPanelSimulation=!1,this.noAnimationForSolarUpdraftTowerSimulation=!1}return Object(Fe.a)(e,[{key:"getElements",value:function(){var e=[],t={type:V.Foundation,cx:0,cy:0,cz:.05,lx:10,ly:10,lz:.1,normal:[0,0,1],rotation:[0,0,0],parentId:xt,textureType:se.NoTexture,id:m.a.generate()};e.push(t);var l={type:V.Sensor,cx:-.1,cy:0,cz:.105,lx:.1,ly:.1,lz:.01,parentId:t.id,foundationId:t.id,normal:[0,0,1],rotation:[0,0,0],id:m.a.generate(),showLabel:!0,light:!0,heatFlux:!1};e.push(l);var a={type:V.Human,name:ne.Judd,cx:1,cy:-1,cz:0,lx:Tl.fetchWidth(ne.Jiya),lz:Tl.fetchHeight(ne.Jiya),normal:[1,0,0],rotation:[0,0,0],parentId:xt,id:m.a.generate()};return e.push(a),e}}],[{key:"resetWorldModel",value:function(e){e.latitude=42.2844063,e.longitude=-71.3488548,e.address=Xe,e.countryCode="US",e.date=new Date((new Date).getFullYear(),5,22,12).toLocaleString("en-US"),e.name="default",e.ground.albedo=.3,e.ground.thermalDiffusivity=.05,e.ground.snowReflectionFactors.fill(0),e.airAttenuationCoefficient=.01,e.airConvectiveCoefficient=5,e.timesPerHour=1,e.daysPerYear=12,e.monthlyIrradianceLosses=new Array(12).fill(.05),e.pvGridCellSize=.5,e.discretization=ae.APPROXIMATE,e.diurnalTemperatureModel=U.Sinusoidal,e.highestTemperatureTimeInMinutes=900,e.solarPanelVisibilityGridCellSize=.2,e.solarRadiationHeatmapGridCellSize=.5,e.cspTimesPerHour=1,e.cspDaysPerYear=4,e.cspGridCellSize=.5,e.sutTimesPerHour=1,e.sutDaysPerYear=4,e.sutGridCellSize=1,e.noAnimationForHeatmapSimulation=!1,e.noAnimationForThermalSimulation=!1,e.noAnimationForSensorDataCollection=!1,e.noAnimationForSolarPanelSimulation=!1,e.noAnimationForSolarUpdraftTowerSimulation=!1}}]),e}(),Sw=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"clone",value:function(t,l,a,o,i,r,n,c){var s=null;switch(l.type){case V.Polygon:t&&(s=e.clonePolygon(t,l,a,o,i,r,n));break;case V.Sensor:t&&(s=e.cloneSensor(t,l,a,o,i));break;case V.Light:t&&(s=e.cloneLight(t,l,a,o,i));break;case V.SolarPanel:t&&(s=e.cloneSolarPanel(t,l,a,o,i));break;case V.ParabolicTrough:t&&(s=e.cloneParabolicTrough(t,l,a,o,i));break;case V.ParabolicDish:t&&(s=e.cloneParabolicDish(t,l,a,o,i));break;case V.FresnelReflector:t&&(s=e.cloneFresnelReflector(t,l,a,o,i));break;case V.Heliostat:t&&(s=e.cloneHeliostat(t,l,a,o,i));break;case V.WindTurbine:t&&(s=e.cloneWindTurbine(t,l,a,o,i));break;case V.Wall:t&&(s=e.cloneWall(t,l,a,o,i));break;case V.Window:t&&(s=e.cloneWindow(t,l,a,o,i,c));break;case V.Door:t&&(s=e.cloneDoor(t,l,a,o,i));break;case V.Roof:t&&(s=e.cloneRoof(t,l,a,o,i));break;case V.Human:s=e.cloneHuman(l,a,o,i,t);break;case V.Tree:s=e.cloneTree(l,a,o,i,t);break;case V.Flower:s=e.cloneFlower(l,a,o,i,t);break;case V.Foundation:s=e.cloneFoundation(l,a,o);break;case V.Cuboid:var d=t?t.id:xt;s=e.cloneCuboid(d,l,a,o)}return s}},{key:"cloneHuman",value:function(e,t,l,a,o){var i;return{type:V.Human,name:e.name,flip:e.flip,cx:t,cy:l,cz:a,lx:e.lx,ly:e.ly,lz:e.lz,normal:Object(h.a)(e.normal),rotation:Object(h.a)(e.rotation),parentId:null!==(i=null===o||void 0===o?void 0:o.id)&&void 0!==i?i:e.parentId,id:m.a.generate()}}},{key:"cloneTree",value:function(e,t,l,a,o){var i;return{type:V.Tree,name:e.name,flip:e.flip,cx:t,cy:l,cz:a,lx:e.lx,ly:e.ly,lz:e.lz,normal:Object(h.a)(e.normal),rotation:Object(h.a)(e.rotation),parentId:null!==(i=null===o||void 0===o?void 0:o.id)&&void 0!==i?i:e.parentId,id:m.a.generate()}}},{key:"cloneFlower",value:function(e,t,l,a,o){var i;return{type:V.Flower,name:e.name,flip:e.flip,cx:t,cy:l,cz:a,lx:e.lx,ly:e.ly,lz:e.lz,normal:Object(h.a)(e.normal),rotation:Object(h.a)(e.rotation),parentId:null!==(i=null===o||void 0===o?void 0:o.id)&&void 0!==i?i:e.parentId,id:m.a.generate()}}},{key:"clonePolygon",value:function(e,t,l,a,o,i,r){var n;switch(e.type){case V.Foundation:case V.Cuboid:n=e.id;break;case V.Wall:case V.Roof:n=e.parentId}var c=t.vertices.map((function(e){return Object(d.a)({},e)})),s={type:V.Polygon,cx:l,cy:a,cz:o,lx:t.lx,ly:t.ly,lz:t.lz,filled:t.filled,noOutline:t.noOutline,color:t.color,lineColor:t.lineColor,lineWidth:t.lineWidth,opacity:t.opacity,textureType:t.textureType,text:t.text,fontSize:t.fontSize,fontColor:t.fontColor,normal:Object(h.a)(t.normal),rotation:t.parentId?Object(h.a)(e.rotation):[0,0,0],vertices:c,parentId:e.id,parentType:e.type,foundationId:n,id:m.a.generate()};if(!i){var u=l,p=a;if(e.type===V.Cuboid&&r){Tw.isSame(r,jt)?u=null!==o&&void 0!==o?o:0:Tw.isSame(r,St)?u=-(null!==o&&void 0!==o?o:0):Tw.isSame(r,zt)?p=null!==o&&void 0!==o?o:0:Tw.isSame(r,Ht)&&(p=-(null!==o&&void 0!==o?o:0));var y=r.dot((new Me.Vector3).fromArray(t.normal));if(Math.abs(y)0&&this.commands.length>this.limit&&this.commands.splice(0,this.commands.length-this.limit),this.index=this.commands.length-1)}},{key:"undo",value:function(){var e=this.commands[this.index];if(e)return this.isExecuting=!0,e.undo(),this.isExecuting=!1,this.index--,e.name}},{key:"redo",value:function(){var e=this.commands[this.index+1];if(e)return this.isExecuting=!0,e.redo(),this.isExecuting=!1,this.index++,e.name}},{key:"clear",value:function(){this.commands=[],this.index=-1}},{key:"hasUndo",value:function(){return-1!==this.index}},{key:"hasRedo",value:function(){return this.index0||this.cuboidCount>0||this.wallCount>0||this.windowCount>0||this.doorCount>0||this.humanCount>0||this.treeCount>0||this.flowerCount>0||this.polygonCount>0||this.sensorCount>0||this.insideLightCount>0||this.outsideLightCount>0||this.solarPanelCount>0||this.parabolicTroughCount>0||this.parabolicDishCount>0||this.fresnelReflectorCount>0||this.heliostatCount>0||this.solarUpdraftTowerCount>0||this.windTurbineCount>0}}]),e}(),Dw=function e(t){Object(He.a)(this,e),this[Pe.c]=!0,this.problem=void 0,this.objectiveFunctionType=void 0,this.selectionMethod=void 0,this.searchMethod=void 0,this.populationSize=void 0,this.maximumGenerations=void 0,this.selectionRate=void 0,this.crossoverRate=void 0,this.mutationRate=void 0,this.convergenceThreshold=void 0,this.localSearchRadius=void 0,this.problem=t,this.objectiveFunctionType=W.DAILY_TOTAL_OUTPUT,this.selectionMethod=C.ROULETTE_WHEEL,this.searchMethod=O.GLOBAL_SEARCH_UNIFORM_SELECTION,this.populationSize=20,this.maximumGenerations=5,this.selectionRate=.5,this.crossoverRate=.5,this.mutationRate=.1,this.convergenceThreshold=.01,this.localSearchRadius=.1},Mw=function e(t){Object(He.a)(this,e),this[Pe.c]=!0,this.problem=void 0,this.objectiveFunctionType=void 0,this.searchMethod=void 0,this.swarmSize=void 0,this.maximumSteps=void 0,this.vmax=void 0,this.inertia=void 0,this.cognitiveCoefficient=void 0,this.socialCoefficient=void 0,this.convergenceThreshold=void 0,this.localSearchRadius=void 0,this.problem=t,this.objectiveFunctionType=W.DAILY_TOTAL_OUTPUT,this.searchMethod=O.GLOBAL_SEARCH_UNIFORM_SELECTION,this.swarmSize=20,this.maximumSteps=5,this.vmax=.01,this.inertia=.8,this.cognitiveCoefficient=.1,this.socialCoefficient=.1,this.convergenceThreshold=.01,this.localSearchRadius=.1},Ww=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.geneticAlgorithmParams=void 0,this.particleSwarmOptimizationParams=void 0,this.geneticAlgorithmParams=new Dw(M.SOLAR_PANEL_TILT_ANGLE),this.particleSwarmOptimizationParams=new Mw(M.SOLAR_PANEL_TILT_ANGLE)},Iw=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.minimumInterRowSpacing=void 0,this.maximumInterRowSpacing=void 0,this.minimumRowsPerRack=void 0,this.maximumRowsPerRack=void 0,this.minimumTiltAngle=void 0,this.maximumTiltAngle=void 0,this.poleHeight=void 0,this.poleSpacing=void 0,this.orientation=void 0,this.pvModelName=void 0,this.rowAxis=void 0,this.margin=void 0,this.minimumInterRowSpacing=2,this.maximumInterRowSpacing=10,this.minimumRowsPerRack=1,this.maximumRowsPerRack=6,this.minimumTiltAngle=-vt,this.maximumTiltAngle=vt,this.poleHeight=1,this.poleSpacing=5,this.orientation=$.landscape,this.pvModelName="CS6X-355P-FG",this.rowAxis=ee.leftRight},Cw=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.projectLifeSpan=void 0,this.electricitySellingPrice=void 0,this.operationalCostPerUnit=void 0,this.projectLifeSpan=25,this.electricitySellingPrice=.25,this.operationalCostPerUnit=.15},Ow=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.humanName=void 0,this.flowerType=void 0,this.treeType=void 0,this.treeSpread=void 0,this.treeHeight=void 0,this.foundationHeight=void 0,this.foundationColor=void 0,this.foundationTexture=void 0,this.groundFloorRValue=void 0,this.cuboidHeight=void 0,this.cuboidFaceColors=void 0,this.cuboidFaceTextures=void 0,this.cuboidStackable=void 0,this.wallHeight=void 0,this.wallThickness=void 0,this.wallColor=void 0,this.wallTexture=void 0,this.wallStructure=void 0,this.wallStructureSpacing=void 0,this.wallStructureWidth=void 0,this.wallStructureColor=void 0,this.wallOpacity=void 0,this.wallRValue=void 0,this.wallVolumetricHeatCapacity=void 0,this.wallEavesLength=void 0,this.wallParapet=void 0,this.roofColor=void 0,this.roofSideColor=void 0,this.roofTexture=void 0,this.roofThickness=void 0,this.roofStructure=void 0,this.roofGlassOpacity=void 0,this.roofGlassTint=void 0,this.roofRafterWidth=void 0,this.roofRafterSpacing=void 0,this.roofRafterColor=void 0,this.roofRValue=void 0,this.roofVolumetricHeatCapacity=void 0,this.roofRise=void 0,this.roofCeiling=void 0,this.ceilingRValue=void 0,this.doorColor=void 0,this.doorFrameColor=void 0,this.doorTexture=void 0,this.doorType=void 0,this.doorArchHeight=void 0,this.doorFilled=void 0,this.doorInterior=void 0,this.doorUValue=void 0,this.doorOpacity=void 0,this.doorVolumetricHeatCapacity=void 0,this.windowWidth=void 0,this.windowHeight=void 0,this.windowColor=void 0,this.windowTint=void 0,this.windowOpacity=void 0,this.windowUValue=void 0,this.windowHorizontalMullion=void 0,this.windowVerticalMullion=void 0,this.windowMullionWidth=void 0,this.windowHorizontalMullionSpacing=void 0,this.windowVerticalMullionSpacing=void 0,this.windowMullionColor=void 0,this.windowShutterLeft=void 0,this.windowShutterRight=void 0,this.windowShutterColor=void 0,this.windowShutterWidth=void 0,this.windowFrame=void 0,this.windowFrameWidth=void 0,this.windowSillWidth=void 0,this.windowType=void 0,this.windowArchHeight=void 0,this.windowEmpty=void 0,this.windowInterior=void 0,this.solarPanelModelName=void 0,this.solarPanelOrientation=void 0,this.solarPanelPoleHeight=void 0,this.solarPanelPoleSpacing=void 0,this.solarPanelTiltAngle=void 0,this.solarPanelRelativeAzimuth=void 0,this.solarPanelFrameColor=void 0,this.parabolicDishReflectance=void 0,this.parabolicDishAbsorptance=void 0,this.parabolicDishOpticalEfficiency=void 0,this.parabolicDishThermalEfficiency=void 0,this.parabolicDishRimDiameter=void 0,this.parabolicDishLatusRectum=void 0,this.parabolicDishPoleHeight=void 0,this.parabolicDishPoleRadius=void 0,this.parabolicDishReceiverStructure=void 0,this.parabolicTroughReflectance=void 0,this.parabolicTroughAbsorptance=void 0,this.parabolicTroughOpticalEfficiency=void 0,this.parabolicTroughThermalEfficiency=void 0,this.parabolicTroughLatusRectum=void 0,this.parabolicTroughPoleHeight=void 0,this.parabolicTroughWidth=void 0,this.parabolicTroughModuleLength=void 0,this.fresnelReflectorReceiver=void 0,this.fresnelReflectorReflectance=void 0,this.fresnelReflectorPoleHeight=void 0,this.fresnelReflectorWidth=void 0,this.fresnelReflectorModuleLength=void 0,this.heliostatTower=void 0,this.heliostatReflectance=void 0,this.heliostatPoleHeight=void 0,this.heliostatPoleRadius=void 0,this.heliostatWidth=void 0,this.heliostatLength=void 0,this.lightColor=void 0,this.lightIntensity=void 0,this.lightDistance=void 0,this.humanName=ne.Jack,this.flowerType=ie.YellowFlower,this.treeType=oe.Dogwood,this.treeSpread=3,this.treeHeight=4,this.foundationHeight=.1,this.foundationColor="#808080",this.foundationTexture=se.NoTexture,this.groundFloorRValue=2,this.cuboidHeight=4,this.cuboidFaceColors=["#808080","#808080","#808080","#808080","#808080","#808080"],this.cuboidFaceTextures=[de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture],this.cuboidStackable=!1,this.wallHeight=5,this.wallThickness=.3,this.wallColor="#ffffff",this.wallTexture=ue.Default,this.wallStructure=Ne.Default,this.wallStructureSpacing=2,this.wallStructureWidth=.1,this.wallStructureColor="#ffffff",this.wallOpacity=.5,this.wallRValue=2,this.wallVolumetricHeatCapacity=.5,this.wallEavesLength=.3,this.wallParapet=Sm,this.roofColor="#454769",this.roofSideColor="#ffffff",this.roofTexture=he.Default,this.roofThickness=.2,this.roofStructure=Ct.Default,this.roofGlassOpacity=.5,this.roofGlassTint="#73D8FF",this.roofRafterWidth=.1,this.roofRafterSpacing=1,this.roofRafterColor="#ffffff",this.roofRValue=2,this.roofVolumetricHeatCapacity=.5,this.roofRise=2,this.roofCeiling=!1,this.ceilingRValue=2,this.doorColor="#ffffff",this.doorFrameColor="#ffffff",this.doorTexture=fe.Default,this.doorType=hy.Default,this.doorArchHeight=1,this.doorFilled=!0,this.doorInterior=!1,this.doorUValue=1,this.doorOpacity=1,this.doorVolumetricHeatCapacity=.5,this.windowWidth=1,this.windowHeight=1,this.windowColor="#ffffff",this.windowTint="#73D8FF",this.windowOpacity=.5,this.windowUValue=2,this.windowHorizontalMullion=!0,this.windowVerticalMullion=!0,this.windowMullionWidth=.06,this.windowHorizontalMullionSpacing=.5,this.windowVerticalMullionSpacing=.5,this.windowMullionColor="#ffffff",this.windowFrame=!1,this.windowFrameWidth=.1,this.windowSillWidth=.1,this.windowType=Yt.Default,this.windowArchHeight=1,this.windowShutterLeft=!1,this.windowShutterRight=!1,this.windowShutterColor="gray",this.windowShutterWidth=.5,this.windowEmpty=!1,this.windowInterior=!1,this.solarPanelModelName="SPR-X21-335-BLK",this.solarPanelOrientation=$.landscape,this.solarPanelPoleHeight=1,this.solarPanelPoleSpacing=3,this.solarPanelTiltAngle=0,this.solarPanelRelativeAzimuth=0,this.solarPanelFrameColor="#ffffff",this.parabolicDishReflectance=.9,this.parabolicDishAbsorptance=.95,this.parabolicDishOpticalEfficiency=.7,this.parabolicDishThermalEfficiency=.3,this.parabolicDishRimDiameter=4,this.parabolicDishLatusRectum=8,this.parabolicDishPoleHeight=.2,this.parabolicDishPoleRadius=.1,this.parabolicDishReceiverStructure=J.CentralPole,this.parabolicTroughReflectance=.9,this.parabolicTroughAbsorptance=.95,this.parabolicTroughOpticalEfficiency=.7,this.parabolicTroughThermalEfficiency=.3,this.parabolicTroughLatusRectum=2,this.parabolicTroughPoleHeight=.2,this.parabolicTroughWidth=2,this.parabolicTroughModuleLength=3,this.fresnelReflectorReceiver="None",this.fresnelReflectorReflectance=.9,this.fresnelReflectorPoleHeight=.2,this.fresnelReflectorWidth=2,this.fresnelReflectorModuleLength=3,this.heliostatTower="None",this.heliostatReflectance=.9,this.heliostatPoleHeight=.2,this.heliostatPoleRadius=.1,this.heliostatWidth=4,this.heliostatLength=2,this.lightColor="#ffff99",this.lightIntensity=3,this.lightDistance=5},Fw=function e(){Object(He.a)(this,e),this[Pe.c]=!0,this.dailyPvIndividualOutputs=void 0,this.yearlyPvIndividualOutputs=void 0,this.dailyParabolicDishIndividualOutputs=void 0,this.yearlyParabolicDishIndividualOutputs=void 0,this.dailyParabolicTroughIndividualOutputs=void 0,this.yearlyParabolicTroughIndividualOutputs=void 0,this.dailyFresnelReflectorIndividualOutputs=void 0,this.yearlyFresnelReflectorIndividualOutputs=void 0,this.dailyHeliostatIndividualOutputs=void 0,this.yearlyHeliostatIndividualOutputs=void 0,this.dailyUpdraftTowerIndividualOutputs=void 0,this.yearlyUpdraftTowerIndividualOutputs=void 0,this.dailyPvIndividualOutputs=!1,this.yearlyPvIndividualOutputs=!1,this.dailyParabolicDishIndividualOutputs=!1,this.yearlyParabolicDishIndividualOutputs=!1,this.dailyParabolicTroughIndividualOutputs=!1,this.yearlyParabolicTroughIndividualOutputs=!1,this.dailyFresnelReflectorIndividualOutputs=!1,this.yearlyFresnelReflectorIndividualOutputs=!1,this.dailyHeliostatIndividualOutputs=!1,this.yearlyHeliostatIndividualOutputs=!1,this.dailyUpdraftTowerIndividualOutputs=!1,this.yearlyUpdraftTowerIndividualOutputs=!1},kw=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"getDefaultHiddenParameters",value:function(e){return e===M.SOLAR_PANEL_ARRAY?["latitude","orientation","poleHeight"]:[]}},{key:"getVariables",value:function(e,t){if(e===M.SOLAR_PANEL_ARRAY){var l=[];return t.includes("rowWidth")||l.push("rowWidth"),t.includes("tiltAngle")||l.push("tiltAngle"),t.includes("interRowSpacing")||l.push("interRowSpacing"),t.includes("latitude")||l.push("latitude"),t.includes("orientation")||l.push("orientation"),t.includes("poleHeight")||l.push("poleHeight"),t.includes("unitCost")||l.push("unitCost"),t.includes("sellingPrice")||l.push("sellingPrice"),t.includes("totalYearlyCost")||l.push("totalYearlyCost"),t.includes("totalYearlyYield")||l.push("totalYearlyYield"),t.includes("meanYearlyYield")||l.push("meanYearlyYield"),t.includes("yearlyProfit")||l.push("yearlyProfit"),l}return[]}},{key:"getTitles",value:function(e,t,l){if(e===M.SOLAR_PANEL_ARRAY){var a=[];return l.includes("rowWidth")||a.push(me.t("polygonMenu.SolarPanelArrayRowWidth",t)),l.includes("tiltAngle")||a.push(me.t("polygonMenu.SolarPanelArrayTiltAngle",t)),l.includes("interRowSpacing")||a.push(me.t("polygonMenu.SolarPanelArrayRowSpacing",t)),l.includes("latitude")||a.push(me.t("word.Latitude",t)),l.includes("orientation")||a.push(me.t("polygonMenu.SolarPanelArrayOrientation",t)),l.includes("poleHeight")||a.push(me.t("polygonMenu.SolarPanelArrayPoleHeight",t)),l.includes("unitCost")||a.push(me.t("economicsPanel.UnitCost",t)),l.includes("sellingPrice")||a.push(me.t("economicsPanel.SellingPrice",t)),l.includes("totalYearlyCost")||a.push(me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",t)),l.includes("totalYearlyYield")||a.push(me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",t)),l.includes("meanYearlyYield")||a.push(me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",t)),l.includes("yearlyProfit")||a.push(me.t("polygonMenu.SolarPanelArrayYearlyProfit",t)),a}return[]}},{key:"getTypes",value:function(e,t){if(e===M.SOLAR_PANEL_ARRAY){var l=[];return t.includes("rowWidth")||l.push("number"),t.includes("tiltAngle")||l.push("number"),t.includes("interRowSpacing")||l.push("number"),t.includes("latitude")||l.push("number"),t.includes("orientation")||l.push("boolean"),t.includes("poleHeight")||l.push("number"),t.includes("unitCost")||l.push("number"),t.includes("sellingPrice")||l.push("number"),t.includes("totalYearlyCost")||l.push("number"),t.includes("totalYearlyYield")||l.push("number"),t.includes("meanYearlyYield")||l.push("number"),t.includes("yearlyProfit")||l.push("number"),l}return[]}},{key:"getDigits",value:function(e,t){if(e===M.SOLAR_PANEL_ARRAY){var l=[];return t.includes("rowWidth")||l.push(0),t.includes("tiltAngle")||l.push(1),t.includes("interRowSpacing")||l.push(1),t.includes("latitude")||l.push(1),t.includes("orientation")||l.push(0),t.includes("poleHeight")||l.push(1),t.includes("unitCost")||l.push(2),t.includes("sellingPrice")||l.push(2),t.includes("totalYearlyCost")||l.push(1),t.includes("totalYearlyYield")||l.push(1),t.includes("meanYearlyYield")||l.push(1),t.includes("yearlyProfit")||l.push(3),l}return[]}},{key:"getTickIntegers",value:function(e,t){if(e===M.SOLAR_PANEL_ARRAY){var l=[];return t.includes("rowWidth")||l.push(!0),t.includes("tiltAngle")||l.push(!1),t.includes("interRowSpacing")||l.push(!1),t.includes("latitude")||l.push(!1),t.includes("orientation")||l.push(!0),t.includes("poleHeight")||l.push(!1),t.includes("unitCost")||l.push(!1),t.includes("sellingPrice")||l.push(!1),t.includes("totalYearlyCost")||l.push(!1),t.includes("totalYearlyYield")||l.push(!1),t.includes("meanYearlyYield")||l.push(!1),t.includes("yearlyProfit")||l.push(!1),l}return[]}},{key:"getUnits",value:function(e,t,l){if(e===M.SOLAR_PANEL_ARRAY){var a=[];return l.includes("rowWidth")||a.push(" "+me.t("solarPanelMenu.Panels",t)),l.includes("tiltAngle")||a.push("\xb0"),l.includes("interRowSpacing")||a.push(" "+me.t("word.MeterAbbreviation",t)),l.includes("latitude")||a.push("\xb0"),l.includes("orientation")||a.push(""),l.includes("poleHeight")||a.push(" "+me.t("word.MeterAbbreviation",t)),l.includes("unitCost")||a.push(""),l.includes("sellingPrice")||a.push(""),l.includes("totalYearlyCost")||a.push("K"),l.includes("totalYearlyYield")||a.push(" MWh"),l.includes("meanYearlyYield")||a.push(" kWh"),l.includes("yearlyProfit")||a.push("K"),a}return[]}},{key:"getUnit",value:function(e,t){return"tiltAngle"===e||"latitude"===e?"\xb0":"interRowSpacing"===e||"poleHeight"===e?me.t("word.MeterAbbreviation",t):"totalYearlyYield"===e?"MWh":"meanYearlyYield"===e?"kWh":"totalYearlyCost"===e||"yearlyProfit"===e?"K":""}},{key:"setScatterData",value:function(e,t,l,a){switch(e){case"rowWidth":l[t]=a.rowsPerRack;break;case"tiltAngle":l[t]=Tw.toDegrees(a.tiltAngle);break;case"interRowSpacing":l[t]=a.interRowSpacing;break;case"latitude":l[t]=a.latitude;break;case"orientation":l[t]=a.orientation===$.landscape?0:1;break;case"poleHeight":l[t]=a.poleHeight;break;case"unitCost":l[t]=a.unitCost;break;case"sellingPrice":l[t]=a.sellingPrice;break;case"totalYearlyCost":l[t]=Tw.calculateCost(a);break;case"totalYearlyYield":l[t]=.001*a.yearlyYield;break;case"meanYearlyYield":l[t]=a.yearlyYield/a.panelCount;break;case"yearlyProfit":l[t]=Tw.calculateProfit(a)}}}]),e}(),Yw=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"updateOldFileData",value:function(e){var t,l=new Map,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;l.set(o.id,o)}}catch(P){a.e(P)}finally{a.f()}var i,r=Object(f.a)(e.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;switch(n.type){case V.Foundation:n.parentId!==xt&&(console.error("Error: "+n.parentId+" is not ground!"),n.parentId=xt);break;case V.Wall:var c=n;if(void 0===c.wallStructure&&(c.wallStructure=Ne.Default),void 0===c.structureSpacing&&(c.structureSpacing=2),void 0===c.structureWidth&&(c.structureWidth=.1),void 0===c.structureColor&&(c.structureColor="white"),void 0===c.opacity&&(c.opacity=.5),void 0===c.fill&&(c.fill=Ue.Full),void 0===c.unfilledHeight&&(c.unfilledHeight=.5),void 0===c.leftUnfilledHeight||void 0===c.rightUnfilledHeight){var s,u=null!==(s=c.unfilledHeight)&&void 0!==s?s:.5;c.leftUnfilledHeight=u,c.rightUnfilledHeight=u}if(void 0!==c.leftTopPartialHeight&&void 0!==c.rightTopPartialHeight||(c.leftTopPartialHeight=c.lz,c.rightTopPartialHeight=c.lz),void 0===c.eavesLength&&c.roofId){var p=l.get(c.roofId);if(p&&p.type===V.Roof){var y=p;c.eavesLength=void 0!==y.overhang?y.overhang:.3}else c.eavesLength=.3}if(void 0===c.parapet&&(c.parapet=Object(d.a)({},Sm)),c.roofId){var g=l.get(c.roofId);if(g&&g.type===V.Roof){var m=g;m.roofType!==It.Pyramid&&m.roofType!==It.Hip&&m.roofType!==It.Mansard||(c.leftRoofHeight=void 0,c.rightRoofHeight=void 0)}}break;case V.Window:var w,x,v=n;if(void 0===v.horizontalMullion&&(v.horizontalMullion=v.mullion),void 0===v.verticalMullion&&(v.verticalMullion=v.mullion),void 0===v.mullionWidth&&(v.mullionWidth=.06),void 0===v.horizontalMullionSpacing)v.horizontalMullionSpacing=null!==(w=v.mullionSpacing)&&void 0!==w?w:.5;if(void 0===v.verticalMullionSpacing)v.verticalMullionSpacing=null!==(x=v.mullionSpacing)&&void 0!==x?x:.5;void 0===v.tint&&(v.tint="#73D8FF"),void 0===v.opacity&&(v.opacity=.5),v.shutter&&(v.leftShutter=v.shutter.showLeft,v.rightShutter=v.shutter.showRight,v.shutterColor=v.shutter.color,v.shutterWidth=v.shutter.width,v.shutter=void 0),void 0===v.shutterColor&&(v.shutterColor="gray"),void 0===v.shutterWidth&&(v.shutterWidth=.5),void 0===v.mullionColor&&(v.mullionColor="white"),void 0===v.frame&&(v.frame=!1),void 0===v.color&&(v.color="white"),void 0===v.frameWidth&&(v.frameWidth=.1),void 0===v.windowType&&(v.windowType=Yt.Default),void 0===v.archHeight&&(v.archHeight=1);break;case V.Door:var b=n;void 0===b.doorType&&(b.doorType=hy.Default),void 0===b.archHeight&&(b.archHeight=1),void 0===b.filled&&(b.filled=!0);break;case V.Roof:var A=n;if(void 0===A.ceiling&&(A.ceiling=!1),A.roofType===It.Gambrel){var T=A;void 0===T.frontRidgePoint&&(T.frontRidgePoint=T.frontRidgeLeftPoint?Object(h.a)(T.frontRidgeLeftPoint):[.35,.5],T.frontRidgeLeftPoint=void 0,T.frontRidgeRightPoint=void 0),void 0===T.backRidgePoint&&(T.backRidgePoint=T.backRidgeLeftPoint?Object(h.a)(T.backRidgeLeftPoint):[-.35,.5],T.backRidgeLeftPoint=void 0,T.backRidgeRightPoint=void 0),void 0===T.topRidgePoint&&(T.topRidgePoint=T.topRidgeLeftPoint?Object(h.a)(T.topRidgeLeftPoint):[0,1],T.topRidgeLeftPoint=void 0,T.topRidgeRightPoint=void 0)}}}}catch(P){r.e(P)}finally{r.f()}}}]),e}();function Lw(e){return e.type===V.Foundation||e.type===V.Cuboid}Object(Pe.b)();var Ew=y()(Object(Ve.a)(Object(Ve.b)((function(e,t){var l=function(t){return e(Object(Pe.a)(t))},a=new Pw,o=a.getElements();return{set:function(e){try{l(e)}catch(t){console.log(t)}},world:a,elements:o,user:{},viewState:new jw,actionState:new Ow,graphState:new Fw,solarPanelArrayLayoutParams:new zw,solarPanelArrayLayoutConstraints:new Iw,evolutionaryAlgorithmState:new Ww,economicsParams:new Cw,geneticAlgorithmWizardSelectedTab:"1",particleSwarmOptimizationWizardSelectedTab:"1",modelType:R.UNKNOWN,modelAuthor:null,modelLabel:null,modelDescription:null,projectView:!1,projectInfo:{owner:null,title:null,description:null,type:M.SOLAR_PANEL_ARRAY,designs:new Array,ranges:new Array,hiddenParameters:kw.getDefaultHiddenParameters(M.SOLAR_PANEL_ARRAY),counter:0,dataColoring:z.ALL,selectedProperty:null,sortDescending:!1,xAxisNameScatteredPlot:null,yAxisNameScatteredPlot:null,dotSizeScatteredPlot:5,thumbnailWidth:200},projectImages:new Map,designProjectType:null,notes:[],language:"en",floatingWindowOpacity:Qe,selectedFloatingWindow:null,cloudFile:void 0,latestModelSite:void 0,modelSites:new Map,peopleModels:new Map,modelsMapLatitude:42.2844063,modelsMapLongitude:-71.3488548,modelsMapAddress:Xe,modelsMapZoom:10,modelsMapType:"roadmap",modelsMapTilt:0,minimumNavigationMoveSpeed:3,minimumNavigationTurnSpeed:3,tempHumanPlant:[],ray:new Me.Raycaster,mouse:new Me.Vector2,fileChanged:!1,applyCount:0,setApplyCount:function(e){l((function(t){t.applyCount=e}))},revertApply:function(){if(t().applyCount){for(var e=0;eu&&(i=u,l=n.id)}}}catch(h){r.e(h)}finally{r.f()}}return l},overlapWithSibling:function(e,l){var a=!1;if(void 0===l){var o=t().getParent(e);if(o){var i,r=Object(f.a)(t().elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e.type&&n.parentId===e.parentId&&n.id!==e.id)if(e.type===V.SolarPanel){if(Tw.doSolarPanelsOverlap(e,n,o)){a=!0;break}}else if(Math.abs(e.cx-n.cx)*o.lx<.5*(e.lx+n.lx)&&Math.abs(e.cy-n.cy)*o.ly<.5*(e.ly+n.ly)&&Math.abs(e.cz-n.cz)*o.lz<.5*(e.lz+n.lz)){a=!0;break}}}catch(m){r.e(m)}finally{r.f()}}}else{var c,s=l*l,d=t().getParent(e),u=Object(f.a)(t().elements);try{for(u.s();!(c=u.n()).done;){var h=c.value;if(h.type===e.type&&h.parentId===e.parentId&&h.id!==e.id){var p=(e.cx-h.cx)*(d?d.lx:1),y=(e.cy-h.cy)*(d?d.ly:1),g=(e.cz-h.cz)*(d?d.lz:1);if(p*p+y*y+g*g0&&((t.intersections.filter((function(e){return!e.eventObject.name.startsWith("Wall Intersection Plane")}))[0].object===t.eventObject||o)&&l((function(l){var o,r,n,c,s,d=Object(f.a)(l.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.id===e)if(u.selected=!0,l.selectedElement=u,l.selectedElementHeight=u.lz,l.groupActionMode){var h,p=null!==(h=u.foundationId)&&void 0!==h?h:null;!p&&Lw(u)&&(p=Tw.getBaseId(u.id)),p&&(l.multiSelectionsMode||l.selectedElementIdSet.clear(),l.selectedElementIdSet.has(p)?l.selectedElementIdSet.delete(p):l.selectedElementIdSet.add(p))}else if(a===X.ContextMenu)if(l.selectedElementIdSet.has(e)){var y,g=Object(f.a)(l.elements);try{for(g.s();!(y=g.n()).done;){var m=y.value;l.selectedElementIdSet.has(m.id)&&m.type!==l.selectedElement.type&&l.selectedElementIdSet.delete(m.id)}}catch(b){g.e(b)}finally{g.f()}}else if(l.multiSelectionsMode){l.selectedElementIdSet.add(e);var w,x=Object(f.a)(l.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;l.selectedElementIdSet.has(v.id)&&v.type!==l.selectedElement.type&&l.selectedElementIdSet.delete(v.id)}}catch(b){x.e(b)}finally{x.f()}}else l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(e);else l.multiSelectionsMode?l.selectedElementIdSet.has(e)?l.selectedElementIdSet.delete(e):l.selectedElementIdSet.add(e):(l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(e));else u.selected=!1}}catch(b){d.e(b)}finally{d.f()}if(l.moveHandleType=null,l.resizeHandleType=null,l.rotateHandleType=null,a)switch(a){case X.Move:(null===(o=l.selectedElement)||void 0===o?void 0:o.type)===V.Tree||(null===(r=l.selectedElement)||void 0===r?void 0:r.type)===V.Human?l.moveHandleType=B.Default:l.moveHandleType=t.eventObject.name,i(!1);break;case X.Resize:l.resizeHandleType=t.eventObject.name,i(!1);break;case X.Rotate:l.rotateHandleType=t.eventObject.name,i(!1);break;case X.Select:l.selectedElementAngle=null!==(n=null===(c=t.object.parent)||void 0===c?void 0:c.rotation.z)&&void 0!==n?n:0,i(!0);break;default:i(!0)}})))},updateAllElementLocks:function(e){l((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){l.value.locked=e}}catch(o){a.e(o)}finally{a.f()}}))},updateElementLockByFoundationId:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.foundationId!==e&&i.parentId!==e&&i.id!==e||(i.locked=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLockByParentId:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.parentId===e&&t===r.type&&(r.locked=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLockById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementReferenceById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.referenceId=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLabelById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.label=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementShowLabelById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.showLabel=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementColorById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.color=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementColorOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Tw.isIdentical(n.normal,a)&&!n.locked&&(n.color=o)}}catch(c){r.e(c)}finally{r.f()}}))},updateElementColorAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.color=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementColorForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLineColorById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.lineColor=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLineColorOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Tw.isIdentical(n.normal,a)&&!n.locked&&(n.lineColor=o)}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLineColorAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.lineColor=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLineColorForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lineColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLineWidthById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.lineWidth=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLineWidthOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;n.type===e&&n.parentId===t&&Tw.isIdentical(n.normal,a)&&!n.locked&&(n.lineWidth=o)}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLineWidthAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.lineWidth=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLineWidthForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lineWidth=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementCxById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.cx=t,i.type===V.SolarPanel&&i.parentType===V.Roof&&(l.updateElementOnRoofFlag=!0);break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementCyById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.cy=t,i.type===V.SolarPanel&&i.parentType===V.Roof&&(l.updateElementOnRoofFlag=!0);break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementCzById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.cz=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementCzForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.cz=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLxById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.lx=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLxAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.lx=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLxOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e&&!n.locked){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.lx=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLxForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lx=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLyById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.ly=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLyAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.ly=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLyOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e&&!n.locked){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.ly=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLyForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLzById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked){i.lz=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateElementLzAboveFoundation:function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||(r.lz=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateElementLzOnSurface:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e&&!n.locked){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.lz=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateElementLzForAll:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lz=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateElementRotationById:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;(n.id!==e||n.locked)&&(n.parentId!==e||Jm(n))||(n.rotation[0]=t,n.rotation[1]=a,n.rotation[2]=o)}}catch(c){r.e(c)}finally{r.f()}l.selectedElementAngle=o}))},updateElementRotationForAll:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e)n.locked||(n.rotation[0]=t,n.rotation[1]=a,n.rotation[2]=o);else{var c=l.getParent(n);c&&!c.locked&&c.type===e&&(n.rotation[0]=t,n.rotation[1]=a,n.rotation[2]=o)}}}catch(s){r.e(s)}finally{r.f()}}))},updateSolarCollectorDrawSunBeamById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Tw.isSolarCollector(i)){i.drawSunBeam=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorDrawSunBeamAboveFoundation:function(e,t,a){Tw.isSolarCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.foundationId!==t||r.locked||r.type===e&&(r.drawSunBeam=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateSolarCollectorDrawSunBeamForAll:function(e,t){Tw.isSolarCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.locked||i.type===e&&(i.drawSunBeam=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorRelativeAzimuthById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Tw.isSolarCollector(i)){i.relativeAzimuth=t,l.selectedElementAngle=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorRelativeAzimuthAboveFoundation:function(e,t,a){Tw.isSolarCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.foundationId!==t||r.locked||r.parentType===V.Wall||(r.relativeAzimuth=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateSolarCollectorRelativeAzimuthOnSurface:function(e,t,a,o){Tw.isSolarCollectorType(e)&&l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===e&&!n.locked){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.relativeAzimuth=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorRelativeAzimuthForAll:function(e,t){Tw.isSolarCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||i.parentType===V.Wall||(i.relativeAzimuth=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleHeightById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Tw.isSolarCollector(i)){i.poleHeight=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleHeightAboveFoundation:function(e,t,a){Tw.isSolarCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.foundationId!==t||r.locked||r.type!==e||(r.poleHeight=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateSolarCollectorPoleHeightOnSurface:function(e,t,a,o){Tw.isSolarCollectorType(e)&&l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(!n.locked&&n.type===e){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.poleHeight=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorPoleHeightForAll:function(e,t){Tw.isSolarCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.poleHeight=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleRadiusById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&Tw.isSolarCollector(i)){i.poleRadius=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorPoleRadiusAboveFoundation:function(e,t,a){Tw.isSolarCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.foundationId!==t||r.locked||r.type!==e||(r.poleRadius=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateSolarCollectorPoleRadiusOnSurface:function(e,t,a,o){Tw.isSolarCollectorType(e)&&l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(!n.locked&&n.type===e){(a?n.parentId===t&&Tw.isIdentical(n.normal,a):n.parentId===t)&&(n.poleRadius=o)}}}catch(c){r.e(c)}finally{r.f()}}))},updateSolarCollectorPoleRadiusForAll:function(e,t){Tw.isSolarCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.poleRadius=t)}}catch(r){o.e(r)}finally{o.f()}}))},clearAllSolarCollectorYields:function(){l((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(Tw.isSolarCollector(a)){var o=a;o.dailyYield=0,o.yearlyYield=0}}}catch(i){l.e(i)}finally{l.f()}}))},updateSolarCollectorDailyYieldById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isSolarCollector(i)){i.dailyYield=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateSolarCollectorYearlyYieldById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isSolarCollector(i)){i.yearlyYield=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateCspReflectanceById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isCspCollector(i)){i.reflectance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateCspReflectanceAboveFoundation:function(e,t,a){Tw.isCspCollectorType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===e&&r.foundationId===t&&(r.reflectance=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateCspReflectanceForAll:function(e,t){Tw.isCspCollectorType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===e&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorAbsorptanceById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isParabolicCollector(i)){i.absorptance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorAbsorptanceAboveFoundation:function(e,t,a){Tw.isParabolaType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===e&&r.foundationId===t&&(r.absorptance=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateParabolicCollectorAbsorptanceForAll:function(e,t){Tw.isParabolaType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===e&&(i.absorptance=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorOpticalEfficiencyById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isParabolicCollector(i)){i.opticalEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorOpticalEfficiencyAboveFoundation:function(e,t,a){Tw.isParabolaType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===e&&r.foundationId===t&&(r.opticalEfficiency=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateParabolicCollectorOpticalEfficiencyForAll:function(e,t){Tw.isParabolaType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===e&&(i.opticalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorThermalEfficiencyById:function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&Tw.isParabolicCollector(i)){i.thermalEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},updateParabolicCollectorThermalEfficiencyAboveFoundation:function(e,t,a){Tw.isParabolaType(e)&&l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===e&&r.foundationId===t&&(r.thermalEfficiency=a)}}catch(n){i.e(n)}finally{i.f()}}))},updateParabolicCollectorThermalEfficiencyForAll:function(e,t){Tw.isParabolaType(e)&&l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===e&&(i.thermalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},foundationActionScope:_.OnlyThisObject,setFoundationActionScope:function(e){l((function(t){t.foundationActionScope=e}))},cuboidActionScope:_.OnlyThisSide,setCuboidActionScope:function(e){l((function(t){t.cuboidActionScope=e}))},polygonActionScope:_.OnlyThisObject,setPolygonActionScope:function(e){l((function(t){t.polygonActionScope=e}))},updatePolygonVertexPositionById:function(e,t,a,o){l((function(l){var i,r=Object(f.a)(l.elements);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&n.id===e){var c=n;t>=0&&t0)c=null!==(l=null===(a=e.getElementById(n.leftJoints[0]))||void 0===a?void 0:a.id)&&void 0!==l?l:"";if(n.rightJoints.length>0)s=null!==(o=null===(i=e.getElementById(n.rightJoints[0]))||void 0===i?void 0:i.id)&&void 0!==o?o:"";var d,u=Object(f.a)(e.elements);try{for(u.s();!(d=u.n()).done;){var p=d.value;p.id===c?p.rightJoints=[]:p.id===s&&(p.leftJoints=[])}}catch(h){u.e(h)}finally{u.f()}e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag;break;case V.Roof:e.deletedRoofIdSet.add(t.id),Pf.getState().deleteRoofSegmentVertices(t.id),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(t.id)}return!1}return!0}))})),Array.from(i)},removeElementById:function(e,a){var o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3?arguments[3]:void 0,r=t().elements.filter((function(t){return t.id===e||Tw.isChild(e,t.id)}));return l((function(t){var l,r=Object(f.a)(t.elements);try{var n=function(){var o=l.value;if(o.id===e){if(a)if(o.type===V.Polygon){var r=Tw.calculatePolygonCentroid(o.vertices);o.cx=r.x,o.cy=r.y,t.elementsToPaste=[o]}else if(o.type===V.Window&&o.parentType===V.Wall){var n=t.elements.find((function(e){return e.id===o.parentId&&e.type===V.Wall}));if(n){var c=Object(d.a)({},o);c.lx=o.lx*n.lx,c.lz=o.lz*n.lz,t.elementsToPaste=[c]}}else t.elementsToPaste=[o];else i||(t.deletedElements=[o]);switch(o.selected=!1,o.type){case V.Roof:var s=o;t.deletedRoofId=o.id,t.deletedRoofIdSet.add(o.id),Pf.getState().deleteRoofSegmentVertices(e),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(e),i&&(t.autoDeletedRoofs?t.autoDeletedRoofs.push(s):t.autoDeletedRoofs=[s],t.autoDeletedRoofIdSet.add(s.id));break;case V.Wall:var u,h,p,y,g=o,m="",w="";if(g.leftJoints.length>0)m=null!==(u=null===(h=t.getElementById(g.leftJoints[0]))||void 0===h?void 0:h.id)&&void 0!==u?u:"";if(g.rightJoints.length>0)w=null!==(p=null===(y=t.getElementById(g.rightJoints[0]))||void 0===y?void 0:y.id)&&void 0!==p?p:"";var x,v=Object(f.a)(t.elements);try{for(v.s();!(x=v.n()).done;){var b=x.value;b.id===m?b.rightJoints=[]:b.id===w&&(b.leftJoints=[])}}catch(A){v.e(A)}finally{v.f()}t.elements=t.elements.filter((function(e){return!(e.type===V.Roof&&0===e.wallsId.length)})),t.updateWallMapOnFoundationFlag=!t.updateWallMapOnFoundationFlag,t.deletedWallId=o.id;break;case V.Foundation:t.deletedFoundationId=o.id;break;case V.Cuboid:t.deletedCuboidId=o.id}return"break"}};for(r.s();!(l=r.n()).done;){if("break"===n())break}}catch(x){r.e(x)}finally{r.f()}if(i){var c,s=Object(f.a)(t.elements);try{for(s.s();!(c=s.n()).done;){var u=c.value;Tw.isChild(e,u.id)&&(t.autoDeletedChild?t.autoDeletedChild.push(u):t.autoDeletedChild=[u])}}catch(x){s.e(x)}finally{s.f()}}else if(a){var h,p=Object(f.a)(t.elements);try{for(p.s();!(h=p.n()).done;){var y=h.value;Tw.isChild(e,y.id)&&t.elementsToPaste.push(y)}}catch(x){p.e(x)}finally{p.f()}}else{var g,m=Object(f.a)(t.elements);try{for(m.s();!(g=m.n()).done;){var w=g.value;Tw.isChild(e,w.id)&&t.deletedElements.push(w)}}catch(x){m.e(x)}finally{m.f()}}t.elements=t.elements.filter((function(t){return t.id!==e&&t.parentId!==e&&t.foundationId!==e&&!Tw.isChild(e,t.id)||(t.type===V.Roof&&(Pf.getState().deleteRoofSegmentVertices(e),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(e)),!1)})),t.selectedElementIdSet.delete(e),o&&(t.selectedElement=null,t.selectedElementIdSet.clear())})),r},removeElementsByType:function(e){l((function(t){e===V.Foundation?t.elements=t.elements.filter((function(e){return!(!e.locked&&(e.type===V.Foundation||e.foundationId))||(e.type===V.Roof&&(Pf.getState().deleteRoofSegmentVertices(e.id),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(e.id)),!1)})):t.elements=t.elements.filter((function(t){return!(!t.locked&&t.type===e)||(t.type===V.Roof&&(Pf.getState().deleteRoofSegmentVertices(t.id),Pf.getState().deleteRoofSegmentVerticesWithoutOverhang(t.id)),!1)}))}))},countElementsByType:function(e,l){var a=0;if(l){var o,i=Object(f.a)(t().elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==e||r.locked||a++}}catch(s){i.e(s)}finally{i.f()}}else{var n,c=Object(f.a)(t().elements);try{for(c.s();!(n=c.n()).done;){n.value.type===e&&a++}}catch(s){c.e(s)}finally{c.f()}}return a},countSolarStructuresByType:function(e,l){var a=0;if(l){var o,i=Object(f.a)(t().elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type!==V.Foundation||r.locked||r.solarStructure===e&&a++}}catch(d){i.e(d)}finally{i.f()}}else{var n,c=Object(f.a)(t().elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.type===V.Foundation&&s.solarStructure===e&&a++}}catch(d){c.e(d)}finally{c.f()}}return a},countObservers:function(){var e,l=0,a=Object(f.a)(t().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;o.type===V.Human&&o.observer&&l++}}catch(i){a.e(i)}finally{a.f()}return l},removeElementsByReferenceId:function(e,t){l((function(l){if(t){l.deletedElements=[];var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.referenceId===e&&l.deletedElements.push(i)}}catch(r){o.e(r)}finally{o.f()}}l.elements=l.elements.filter((function(t){return t.referenceId!==e}))}))},countElementsByReferenceId:function(e){var l,a=0,o=Object(f.a)(t().elements);try{for(o.s();!(l=o.n()).done;){l.value.referenceId===e&&a++}}catch(i){o.e(i)}finally{o.f()}return a},getChildren:function(e){var l,a=[],o=Object(f.a)(t().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.parentId===e&&a.push(i)}}catch(r){o.e(r)}finally{o.f()}return a},getChildrenOfType:function(e,l){var a,o=[],i=Object(f.a)(t().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;r.type===e&&r.parentId===l&&o.push(r)}}catch(n){i.e(n)}finally{i.f()}return o},removeAllChildElementsByType:function(e,t){l((function(l){l.elements=l.elements.filter((function(l){return l.locked||l.type!==t||l.parentId!==e})),t===V.Wall&&(l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag)}))},removeAllElementsOnFoundationByType:function(e,t){l((function(l){l.elements=l.elements.filter((function(l){return l.locked||l.type!==t||l.foundationId!==e})),t===V.Wall&&(l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag)}))},countAllElements:function(e){var l=0;if(e){var a,o=Object(f.a)(t().elements);try{for(o.s();!(a=o.n()).done;){a.value.locked||l++}}catch(i){o.e(i)}finally{o.f()}}else l=t().elements.length;return l},countAllElementsByType:function(e){var l,a=new Rw,o=Object(f.a)(t().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(!e||!i.locked)switch(i.type){case V.Foundation:i.solarStructure===G.UpdraftTower&&a.solarUpdraftTowerCount++,a.foundationCount++;break;case V.Cuboid:a.cuboidCount++;break;case V.Wall:a.wallCount++;break;case V.Window:a.windowCount++;break;case V.Door:a.doorCount++;break;case V.Human:a.humanCount++;break;case V.Tree:a.treeCount++;break;case V.Flower:a.flowerCount++;break;case V.Polygon:a.polygonCount++;break;case V.Sensor:a.sensorCount++;break;case V.Light:i.inside?a.insideLightCount++:a.outsideLightCount++;break;case V.SolarPanel:a.solarPanelCount++;var r=i,n=t().getPvModule(r.pvModelName);n&&(a.solarPanelModuleCount+=Tw.countSolarPanelsOnRack(r,n));break;case V.ParabolicDish:a.parabolicDishCount++;break;case V.ParabolicTrough:a.parabolicTroughCount++;break;case V.FresnelReflector:a.fresnelReflectorCount++;break;case V.Heliostat:a.heliostatCount++;break;case V.WindTurbine:a.windTurbineCount++}}}catch(c){o.e(c)}finally{o.f()}return a},countAllOffspringsByTypeAtOnce:function(e,l){var a,o=new Rw,i=Object(f.a)(t().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value,n=r.parentId===e||r.foundationId===e;if((l||!r.locked)&&n)switch(r.type){case V.Foundation:r.solarStructure===G.UpdraftTower&&o.solarUpdraftTowerCount++,o.foundationCount++;break;case V.Cuboid:o.cuboidCount++;break;case V.Wall:o.wallCount++;break;case V.Window:o.windowCount++;break;case V.Door:o.doorCount++;break;case V.Human:o.humanCount++;break;case V.Tree:o.treeCount++;break;case V.Flower:o.flowerCount++;break;case V.Polygon:o.polygonCount++;break;case V.Sensor:o.sensorCount++;break;case V.Light:r.inside?o.insideLightCount++:o.outsideLightCount++;break;case V.SolarPanel:o.solarPanelCount++;var c=r,s=t().getPvModule(c.pvModelName);s&&(o.solarPanelModuleCount+=Tw.countSolarPanelsOnRack(c,s));break;case V.ParabolicDish:o.parabolicDishCount++;break;case V.ParabolicTrough:o.parabolicTroughCount++;break;case V.FresnelReflector:o.fresnelReflectorCount++;break;case V.Heliostat:o.heliostatCount++;break;case V.WindTurbine:o.windTurbineCount++}}}catch(d){i.e(d)}finally{i.f()}return o},countSolarPanelsOnRack:function(e){var l,a=0,o=Object(f.a)(t().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.id===e&&i.type===V.SolarPanel){var r=i,n=t().getPvModule(r.pvModelName);if(n){a=Tw.countSolarPanelsOnRack(r,n);break}}}}catch(c){o.e(c)}finally{o.f()}return a},copyCutElements:function(){for(var e=[],l=new Map,a=new Map,o=new Map,i=function(i){var r=t().elementsToPaste[i],n=null;if(0===i){var c;if((null===(c=n=t().getElementById(r.id)?Sw.clone(t().getParent(r),r,r.cx,r.cy,r.cz):JSON.parse(JSON.stringify(r)))||void 0===c?void 0:c.type)===V.Wall){var s=n;s.roofId=void 0,s.leftRoofHeight=void 0,s.rightRoofHeight=void 0,s.centerLeftRoofHeight=void 0,s.centerRightRoofHeight=void 0,s.centerRoofHeight=void 0}}else{var d=t().elementsToPaste.find((function(e){return e.id===r.parentId}));if(d){var u,f=l.get(d.id);if(f)if(t().getElementById(r.id))(null===(u=n=Sw.clone(f,r,r.cx,r.cy,r.cz,r.type===V.Polygon))||void 0===u?void 0:u.type)===V.Window&&n.parentType===V.Wall&&(n.lx*=f.lx,n.lz*=f.lz);else n=JSON.parse(JSON.stringify(r))}}n&&(l.set(r.id,n),a.set(r.id,n.id),o.set(n.id,r.id),e.push(n))},r=0;r1){var X=l.pastePoint,B=l.copyCutElements();if(B.length>0){var K;if(B[0].type===V.Cuboid){var q=l.selectedElement;if(q&&q.type===V.Cuboid){var Q=Tw.getWorldDataById(q.id).pos;X.sub(Q),B[0].parentId=q.id}}else if(B[0].type===V.Wall){var Z=l.selectedElement;Z&&Z.type===V.Foundation&&((X=Tw.relativeCoordinates(X.x,X.y,X.z,Z)).set(X.x*Z.lx,X.y*Z.ly,0),B[0].parentId=Z.id,B[0].foundationId=Z.id)}B[0].cx=X.x,B[0].cy=X.y,B[0].cz=X.z,B[0].type===V.Foundation?B[0].cz+=B[0].lz/2:B[0].type===V.Cuboid&&(B[0].cz=B[0].lz/2),(K=l.elements).push.apply(K,Object(h.a)(B)),e.push.apply(e,Object(h.a)(B))}}e.length>0&&(l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(e[0].id),l.selectedElement=e[0])})),e},pasteElementsByKey:function(){var e=[];return l((function(l){if(l.elementsToPaste.length>0){var a=l.elementsToPaste[0],o=l.getParent(a),i=Sw.clone(o,a,a.cx,a.cy,a.cz);if(i){var r=!1;switch(i.type){case V.Door:case V.Window:if(o){var n=i.lx/2;if(i.cx+=3*n,o.type===V.Wall)for(;i.cx+n<.5;){if(Tw.checkElementOnWallState(i,o)===ye.Valid){l.elements.push(i),r=!0;break}i.cx+=n}else if(o.type===V.Roof){var c=Vm.getRotationOnRoof(o.id,new Me.Vector3(i.cx,i.cy));c&&(i.rotation=Object(h.a)(c));for(var s=Vm.getWindowVerticesOnRoof(i),d=Vm.getRoofSegmentBoundary(o.id,new Me.Vector3(i.cx,i.cy)),u=Vm.getRoofBoundaryVertices(o);Vm.rooftopElementBoundaryCheck(s,u);){if(d&&Vm.rooftopElementBoundaryCheck(s,d)&&Vm.rooftopWindowCollisionCheck(i.id,s,o.id)){l.elements.push(i),r=!0;break}i.cx+=n/2;var p=Vm.getRotationOnRoof(o.id,new Me.Vector3(i.cx,i.cy));p&&(i.rotation=Object(h.a)(p)),s=Vm.getWindowVerticesOnRoof(i),d=Vm.getRoofSegmentBoundary(o.id,new Me.Vector3(i.cx,i.cy))}}if(!r){i.cx=a.cx-3*n;var y=Vm.getRotationOnRoof(o.id,new Me.Vector3(i.cx,i.cy));if(y&&(i.rotation=Object(h.a)(y)),o.type===V.Wall){for(;i.cx-n>-.5;)if(o.type===V.Wall){if(Tw.checkElementOnWallState(i,o)===ye.Valid){l.elements.push(i),r=!0;break}i.cx-=n}}else if(o.type===V.Roof)for(var g=Vm.getWindowVerticesOnRoof(i),m=Vm.getRoofSegmentBoundary(o.id,new Me.Vector3(i.cx,i.cy)),w=Vm.getRoofBoundaryVertices(o);Vm.rooftopElementBoundaryCheck(g,w);){if(m&&Vm.rooftopElementBoundaryCheck(g,m)&&Vm.rooftopWindowCollisionCheck(i.id,g,o.id)){l.elements.push(i),r=!0;break}i.cx-=n;var x=Vm.getRotationOnRoof(o.id,new Me.Vector3(i.cx,i.cy));x&&(i.rotation=Object(h.a)(x)),g=Vm.getWindowVerticesOnRoof(i),m=Vm.getRoofSegmentBoundary(o.id,new Me.Vector3(i.cx,i.cy))}}if(!r){var v={lng:l.language};Qh(me.t("message.CannotPasteOutsideBoundary",v))}o.type===V.Roof&&r&&(l.updateElementOnRoofFlag=!0)}break;case V.Human:i.cx+=1,l.elements.push(i),l.elementsToPaste=[i],r=!0;break;case V.Tree:case V.Flower:i.cx+=i.lx,l.elements.push(i),l.elementsToPaste=[i],r=!0;break;case V.SolarPanel:case V.FresnelReflector:case V.Heliostat:case V.ParabolicDish:case V.ParabolicTrough:if(i.parentId){var b=l.getParent(i);if(b){if(b.type===V.Wall){var A=i.lx/b.lx/2;for(i.cx+=3*A;i.cx+A<.5;){if(Tw.checkElementOnWallState(i,b)===ye.Valid){l.elements.push(i),r=!0;break}i.cx+=A}if(!r)for(i.cx=a.cx-3*A;i.cx-A>-.5;){if(Tw.checkElementOnWallState(i,b)===ye.Valid){l.elements.push(i),l.elementsToPaste=[i],r=!0;break}i.cx-=A}if(!r){var T={lng:l.language};Qh(me.t("message.CannotPasteOutsideBoundary",T))}break}if(b.type===V.Roof){if(a.foundationId){var P=l.getElementById(a.foundationId);if(P){var S=Vm.getRoofBoundaryVertices(b),j=i.lx/P.lx/2;for(i.cx+=1.25*j;i.cx+j<.5;){var H=Vm.getSolarPanelVerticesOnRoof(i,P);if(Vm.rooftopElementBoundaryCheck(H,S)&&Vm.rooftopSPCollisionCheck(i,P,H)){l.elements.push(i),r=!0;break}i.cx+=1.25*j}if(!r)for(i.cx=a.cx-1.25*j;i.cx-j>-.5;){var z=Vm.getSolarPanelVerticesOnRoof(i,P);if(Vm.rooftopElementBoundaryCheck(z,S)&&Vm.rooftopSPCollisionCheck(i,P,z)){l.elements.push(i),r=!0;break}i.cx-=1.25*j}if(r)l.updateElementOnRoofFlag=!0;else{var R={lng:l.language};Qh(me.t("message.CannotPasteOutsideBoundary",R))}}}break}var D=l.findNearestSibling(a.id);if(D){var M=l.getElementById(D);if(M){var W=i.cx,I=i.cy,C=i.cz,O=M.cx-a.cx,F=M.cy-a.cy,k=M.cz-a.cz;i.cx=M.cx+O,i.cy=M.cy+F,i.cz=M.cz+k,l.overlapWithSibling(i)&&(i.cx=a.cx-O,i.cy=a.cy-F,i.cz=a.cz-k,l.overlapWithSibling(i)&&(i.cx=a.cx-2*O,i.cy=a.cy-2*F,i.cz=a.cz-2*k,l.overlapWithSibling(i)&&(i.cx=W-O,i.cy=I-F,i.cz=C-k)))}else i.cx+=i.lx/b.lx}else i.cx+=i.lx/b.lx;var Y={lng:l.language};l.overlapWithSibling(i)?Qh(me.t("message.CannotPasteBecauseOfOverlap",Y)):b.type===V.Foundation||b.type===V.Cuboid&&Tw.isIdentical(i.normal,Tt)?Tw.isSolarCollectorWithinHorizontalSurface(i,b)?(l.elements.push(i),l.elementsToPaste=[i],r=!0):Qh(me.t("message.CannotPasteOutsideBoundary",Y)):(l.elements.push(i),l.elementsToPaste=[i],r=!0)}}break;case V.Sensor:case V.Light:if(i.parentId){var L=l.getParent(i);L&&(i.cx+=i.lx/L.lx),i.cx<.5&&(l.elements.push(i),l.elementsToPaste=[i],r=!0)}break;case V.Polygon:var E,U=i,N=Object(f.a)(U.vertices);try{for(N.s();!(E=N.n()).done;){E.value.x+=.1}}catch(ge){N.e(ge)}finally{N.f()}U.cx+=.1,l.elements.push(U),l.elementsToPaste=[U],r=!0;break;case V.Cuboid:if(i.cx+=i.lx,1===l.elementsToPaste.length){var J,G=function e(l){var a,o=[],i=Object(f.a)(t().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(r.parentId===l.id)switch(o.push(r),r.type){case V.Cuboid:case V.Foundation:case V.Wall:case V.Roof:o.push.apply(o,Object(h.a)(e(r)))}}}catch(ge){i.e(ge)}finally{i.f()}return o}(a),X=new Map;e.push(i),X.set(a.id,i);var B,K=Object(f.a)(G);try{for(K.s();!(B=K.n()).done;){var q=B.value,Q=X.get(q.parentId);if(Q){var Z=Sw.clone(Q,q,q.cx,q.cy,q.cz,q.type===V.Polygon);Z&&(i.normal&&(Z.normal=Object(h.a)(q.normal)),e.push(Z),X.set(q.id,Z))}}}catch(ge){K.e(ge)}finally{K.f()}(J=l.elements).push.apply(J,e),l.elementsToPaste=[i],l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(i.id),l.selectedElement=i}else if(l.elementsToPaste.length>1){var _,$=l.copyCutElements();if($.length>0)$[0].cx+=$[0].lx,(_=l.elements).push.apply(_,Object(h.a)($)),l.elementsToPaste=Object(h.a)($),e.push.apply(e,Object(h.a)($)),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add($[0].id),l.selectedElement=$[0]}r=!1;break;case V.Foundation:if(i.cx+=i.lx,1===l.elementsToPaste.length)!function(){var o,r,n=new Map,c=new Map,s=Object(f.a)(l.elements);try{for(s.s();!(r=s.n()).done;){var d=r.value;if(d.parentId===a.id&&d.parentId!==d.id){var u=Sw.clone(i,d,d.cx,d.cy,d.cz,d.type===V.Polygon);if(u&&(i.normal&&(u.normal=Object(h.a)(d.normal)),e.push(u),(null===u||void 0===u?void 0:u.type)===V.Wall||(null===u||void 0===u?void 0:u.type)===V.Roof)){n.set(u.id,d.id),c.set(d.id,u.id);var p,y=Object(f.a)(l.elements);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.parentId===d.id){var m=Sw.clone(u,g,g.cx,g.cy,g.cz);m&&(d.normal&&(m.normal=Object(h.a)(g.normal)),e.push(m))}}}catch(ge){y.e(ge)}finally{y.f()}}}}}catch(ge){s.e(ge)}finally{s.f()}(o=l.elements).push.apply(o,e),l.elements.push(i),l.elementsToPaste=[i];var w,x=Object(f.a)(l.elements);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.Roof){var b=n.get(v.id);if(b){var A=t().getElementById(b);A&&(v.wallsId=A.wallsId.map((function(e){return c.get(e)})))}}if(v.type===V.Wall){var T=n.get(v.id);if(T){var P,S=Object(f.a)(l.elements);try{for(S.s();!(P=S.n()).done;){var j=P.value;if(j.id===T&&j.type===V.Wall){var H=j,z=c.get(H.leftJoints[0]);z&&(v.leftJoints=[z]);var R=c.get(H.rightJoints[0]);if(R&&(v.rightJoints=[R]),H.roofId){var D=c.get(H.roofId);D&&(v.roofId=D)}break}}}catch(ge){S.e(ge)}finally{S.f()}}}}}catch(ge){x.e(ge)}finally{x.f()}}();else if(l.elementsToPaste.length>1){var ee,te=l.copyCutElements();if(te.length>0)te[0].cx+=te[0].lx,(ee=l.elements).push.apply(ee,Object(h.a)(te)),e.push.apply(e,Object(h.a)(te)),l.elementsToPaste=te,l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(te[0].id),l.selectedElement=te[0]}r=!0;break;case V.Wall:var le=i,ae=new Me.Vector3(1,-1,0).applyEuler(new Me.Euler(0,0,le.relativeAngle));if(i.cx+=ae.x,i.cy+=ae.y,1===l.elementsToPaste.length){var oe,ie=new Me.Vector3(i.cx,i.cy,0),re=new Me.Vector3(i.lx/2,0,0),ne=new Me.Vector3(-i.lx/2,0,0),ce=new Me.Euler(0,0,le.relativeAngle);le.leftPoint=ie.clone().add(ne.applyEuler(ce)).toArray(),le.rightPoint=ie.clone().add(re.applyEuler(ce)).toArray(),le.roofId=void 0,le.leftRoofHeight=void 0,le.rightRoofHeight=void 0,le.centerLeftRoofHeight=void 0,le.centerRightRoofHeight=void 0,le.centerRoofHeight=void 0;var se,de=Object(f.a)(l.elements);try{for(de.s();!(se=de.n()).done;){var ue=se.value;if(ue.parentId===a.id){var fe=Sw.clone(i,ue,ue.cx,ue.cy,ue.cz,ue.type===V.Polygon);fe&&(i.normal&&(fe.normal=Object(h.a)(ue.normal)),e.push(fe))}}}catch(ge){de.e(ge)}finally{de.f()}(oe=l.elements).push.apply(oe,e),l.elements.push(i),l.elementsToPaste=[i]}else if(l.elementsToPaste.length>1){var he,pe=l.copyCutElements();if(pe.length>0)pe[0].cx+=ae.x,pe[0].cy-=ae.y,(he=l.elements).push.apply(he,Object(h.a)(pe)),e.push.apply(e,Object(h.a)(pe)),l.elementsToPaste=pe,l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(pe[0].id),l.selectedElement=pe[0]}l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag,r=!0}1===l.elementsToPaste.length&&r&&(e.push(i),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(i.id),l.selectedElement=i)}}})),e},pvModules:{},loadPvModules:function(){var e=[];b.a.parse(Te,{download:!0,complete:function(t){var a,o=Object(f.a)(t.data);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Array.isArray(i)&&i.length>1){var r={name:i[0].trim(),brand:i[1].trim(),cellType:i[2].trim(),efficiency:parseFloat(i[3].trim()),length:parseFloat(i[4].trim()),nominalLength:parseFloat(i[5].trim()),width:parseFloat(i[6].trim()),nominalWidth:parseFloat(i[7].trim()),thickness:parseFloat(i[8].trim()),m:parseFloat(i[9].trim()),n:parseFloat(i[10].trim()),pmax:parseFloat(i[11].trim()),vmpp:parseFloat(i[12].trim()),impp:parseFloat(i[13].trim()),voc:parseFloat(i[14].trim()),isc:parseFloat(i[15].trim()),pmaxTC:parseFloat(i[16].trim()),noct:parseFloat(i[17].trim()),weight:parseFloat(i[18].trim()),color:i[19].trim(),shadeTolerance:i[20].trim(),bifacialityFactor:parseFloat(i[21].trim())};e.push(r)}}}catch(n){o.e(n)}finally{o.f()}l((function(t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.pvModules[o.name]=o}}catch(n){a.e(n)}finally{a.f()}}))}})},getPvModule:function(e){return t().pvModules[e]},weatherData:{},loadWeatherData:function(){var e=[];b.a.parse(ve,{download:!0,complete:function(t){var a,o=Object(f.a)(t.data);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Array.isArray(i)&&i.length>1){for(var r=[],n=[],c=[],s=5;s<29;s++)(s-5)%2===0?r.push(parseFloat(i[s].trim())):n.push(parseFloat(i[s].trim()));for(var d=29;d<41;d++)c.push(parseFloat(i[d].trim()));var u={city:i[0].trim(),country:i[1].trim(),longitude:parseFloat(i[2].trim()),latitude:parseFloat(i[3].trim()),elevation:parseFloat(i[4].trim()),lowestTemperatures:r,highestTemperatures:n,sunshineHours:c};e.push(u)}}}catch(h){o.e(h)}finally{o.f()}l((function(t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.weatherData[o.city+", "+o.country]=o}}catch(h){a.e(h)}finally{a.f()}}))}})},getWeather:function(e){return t().weatherData[e]},horizontalSolarRadiationData:{},loadHorizontalSolarRadiationData:function(){var e=[];b.a.parse(be,{download:!0,complete:function(t){var a,o=Object(f.a)(t.data);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Array.isArray(i)&&i.length>1){for(var r=[],n=2;n<14;n++)r.push(parseFloat(i[n].trim()));var c={city:i[0].trim(),country:i[1].trim(),data:r};e.push(c)}}}catch(s){o.e(s)}finally{o.f()}l((function(t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.horizontalSolarRadiationData[o.city+", "+o.country]=o}}catch(s){a.e(s)}finally{a.f()}}))}})},getHorizontalSolarRadiation:function(e){return t().horizontalSolarRadiationData[e]},verticalSolarRadiationData:{},loadVerticalSolarRadiationData:function(){var e=[];b.a.parse(Ae,{download:!0,complete:function(t){var a,o=Object(f.a)(t.data);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Array.isArray(i)&&i.length>1){for(var r=[],n=2;n<14;n++)r.push(parseFloat(i[n].trim()));var c={city:i[0].trim(),country:i[1].trim(),data:r};e.push(c)}}}catch(s){o.e(s)}finally{o.f()}l((function(t){var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;t.verticalSolarRadiationData[o.city+", "+o.country]=o}}catch(s){a.e(s)}finally{a.f()}}))}})},getVerticalSolarRadiation:function(e){return t().verticalSolarRadiationData[e]},getClosestCity:function(e,l){var a,o=Number.MAX_VALUE,i=null,r=t().weatherData;for(var n in r)r.hasOwnProperty(n)&&(a=Tw.getDistance(l,e,r[n].longitude,r[n].latitude))0?B>=12||B<=3?_w:B>3&&B<=5?qw:B>5&&B<=9?Qw:Zw:B>=12||B<=3?Qw:B>3&&B<=5?Zw:B>5&&B<=9?_w:qw;case E.Lake:return $w;case E.Mountain:return ex;case E.Rural:return tx;default:return Jw}}),[l,w,m]),ne=Object(Wy.a)(re),ce=function(e){var t;if(e.intersections.length>0)if(e.intersections[0].object===H.current)o(),a((function(e){e.clickObjectType=V.Sky}));else{var l=n();l&&((t=l.type)===V.Foundation||t===V.Cuboid||t===V.Tree||t===V.Flower||t===V.Human)&&(z.current=l,Tw.isPlantOrHuman(z.current)&&($(Z.Vertical),te.set(-vt,0,0,"ZXY")),l.type!==V.Foundation&&l.type!==V.Cuboid&&Et.getState().setEnableOrbitController(!1))}},se=function e(t){if(!t)return"";var l=t.name.split(" ");return l[2]?l[2]:e(t.parent)},de=function(e,t){var l=Et.getState().contentRef,a=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null}(null===l||void 0===l?void 0:l.current,e.id);if(a){var o,i=Object(f.a)(a.children);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.name.includes("".concat(t.id))){var n,c;null===(n=Et.getState().contentRef)||void 0===n||null===(c=n.current)||void 0===c||c.add(r);break}}}catch(d){i.e(d)}finally{i.f()}}t.parentId=xt;var s=new Me.Vector3(t.cx,t.cy,t.cz).applyEuler(new Me.Euler(0,0,e.rotation[2])).add(W.current);t.cx=s.x,t.cy=s.y,t.cz=0,L.current.set(t.id,new Me.Vector3(s.x,s.y,0)),U.current.set(t.id,xt)},ue=function(e,t,l){if(e&&t){var a=Et.getState().contentRef;if(null===a||void 0===a?void 0:a.current){var o=Tw.getObjectChildById(a.current,t),i=Tw.getObjectChildById(t===xt?a.current:o,l);if(i){if(e===xt)a.current.add(i);else{var r=Tw.getObjectChildById(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}}},fe=function(e,t){e&&a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&!Tw.isFoundationOrCuboid(i)){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},he=function(e){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.object.userData.stand)return a}}catch(o){l.e(o)}finally{l.f()}return null},pe=function(e,t){if(e&&e.current){var l=he(t.intersections);if(l){var a=l.object,o=e.current.parent;if("Ground"===a.name){if(o&&"Content"!==o.name){var i=Et.getState().contentRef;i&&i.current&&(i.current.add(e.current),fe(xt,se(e.current)))}e.current.position.copy(l.point),Object(Se.c)()}else if(a.userData.stand){var r=a.parent;if(r){o&&o.uuid!==r.uuid&&(r.add(e.current),fe(se(r),se(e.current))),X.set(0,0,-r.rotation.z);var n=(new Me.Vector3).subVectors(l.point,r.position).applyEuler(X);e.current.position.copy(n),Object(Se.c)()}}}}},ye=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e){Tw.isFoundationOrCuboid(r)||(r.parentId=t),r.cx=l.x,r.cy=l.y,r.cz=l.z;break}}}catch(n){i.e(n)}finally{i.f()}}))};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("mesh",{ref:H,name:"Sky",rotation:[vt,0,0],scale:[1,ie,1],onContextMenu:function(e){e.intersections.length>0&&(e.intersections[0].object===H.current&&(o(),a((function(e){e.clickObjectType=V.Sky,e.contextMenuObjectType=V.Sky}))))},onPointerDown:function(e){if(2!==e.button){a((function(e){e.contextMenuObjectType=null})),ce(e);var t=z.current;if(t)switch(F.current=t.lz,W.current.set(t.cx,t.cy,t.cz),t.type){case V.Human:N.current=t.parentId;break;case V.Tree:N.current=t.parentId,O.current=t.lx;break;case V.Cuboid:W.current.set(t.cx,t.cy,t.cz),C.current.set(t.lx,t.ly,t.lz),D.current.clear();var l=new Me.Vector3(t.cx,t.cy,t.cz),o=d(t.id);if(o.length>0){k.current.clear();var i,r=t.rotation[2],n=Object(f.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;switch(c.type){case V.Tree:case V.Human:var s=new Me.Vector3(c.cx,c.cy,c.cz).applyEuler(new Me.Euler(0,0,r));s.add(l),D.current.set(c.id,s),k.current.set(c.id,new Me.Vector3(c.cx,c.cy,c.cz));break;case V.SolarPanel:case V.Sensor:if(Tw.isIdentical(c.normal,Tt)){var u=new Me.Vector3(c.cx*t.lx,c.cy*t.ly,c.cz*t.lz).applyEuler(new Me.Euler(0,0,r));u.add(l),D.current.set(c.id,u)}break;case V.Polygon:if(Tw.isIdentical(c.normal,Tt)){var h,p=c,y=[],g=Object(f.a)(p.vertices);try{for(g.s();!(h=g.n()).done;){var m=h.value,w=new Me.Vector2(m.x*t.lx,m.y*t.ly).rotateAround(Dt,r);w.add(new Me.Vector2(l.x,l.y)),y.push(w)}}catch(x){g.e(x)}finally{g.f()}M.current.set(p.id,y)}}}}catch(x){n.e(x)}finally{n.f()}}}}},children:[Object(gf.jsx)("sphereBufferGeometry",{args:[5e3,16,8,0,bt,0,vt]}),Object(gf.jsx)("meshToonMaterial",{map:ne,side:Me.BackSide,opacity:1,color:"skyblue"})]}),z.current&&_!==Z.Sky&&Object(gf.jsx)(Lt.f,{ref:R,visible:!1,name:"Sky Intersection Plane",rotation:te,position:ee,args:[1e3,1e3],onPointerMove:function(e){if(z.current&&z.current.type&&!z.current.locked){var t,l=new Me.Vector2;if(l.x=e.offsetX/j.clientWidth*2-1,l.y=-e.offsetY/j.clientHeight*2+1,G.setFromCamera(l,S),R.current&&_===Z.Vertical&&(t=G.intersectObjects([R.current]))&&t.length>0){var o=t[0].point;switch(z.current.type){case V.Tree:var i=z.current;switch(g){case K.Top:y(i.id,o.z),a((function(e){e.selectedElementHeight=Math.max(1,o.z)}));break;case K.Left:case K.Right:case K.Upper:case K.Lower:p(i.id,2*Math.hypot(o.x-i.cx,o.y-i.cy))}pe(Et.getState().treeRef,e);break;case V.Human:pe(Et.getState().humanRef,e);break;case V.Cuboid:if(Tw.isTopResizeHandle(g)){a((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a,i=t.value;if(i.id===(null===(a=z.current)||void 0===a?void 0:a.id)){i.cz=Math.max(.5,o.z/2),i.lz=Math.max(1,o.z);break}}}catch(r){l.e(r)}finally{l.f()}e.selectedElementHeight=Math.max(1,o.z)}));var r=Et.getState().cuboidRef;if(null===r||void 0===r?void 0:r.current){var n,c=Object(f.a)(r.current.children);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.name.includes("Human")||s.name.includes("Tree")){var d=D.current.get(se(s));d&&(Math.abs(F.current-d.z)<.01?s.position.setZ(Math.max(o.z/2,.5)):s.position.setZ(d.z-r.current.position.z))}}}catch(u){c.e(u)}finally{c.f()}}}}}}},onPointerUp:function(){var e,t;if(z.current){var l=h(z.current.id);if(l&&!l.locked){var o=null,i=N.current;switch(l.type){case V.Cuboid:switch(g){case K.UpperLeftTop:case K.UpperRightTop:case K.LowerLeftTop:case K.LowerRightTop:Y.current.clear(),a((function(e){e.actionState.cuboidHeight=l.lz;var t,a=Object(f.a)(e.elements);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(Tw.isPlantOrHuman(o)&&o.parentId===l.id)if(Y.current.set(o.id,l.id),Math.abs(C.current.z/2-o.cz)<.01)o.cz=l.lz/2;else{var i=o.cz+W.current.z-l.cz;Math.abs(i)>l.lz/2?de(l,o):o.cz=i}}}catch(r){a.e(r)}finally{a.f()}}));var r=d(l.id);if(r.length>0){var n,c=Object(f.a)(r);try{for(c.s();!(n=c.n()).done;){var s=n.value;L.current.set(s.id,new Me.Vector3(s.cx,s.cy,s.cz))}}catch(ie){c.e(ie)}finally{c.f()}}var m={name:"Change Cuboid Height",timestamp:Date.now(),changedElementId:l.id,changedElementType:l.type,oldValue:F.current,newValue:l.lz,oldChildrenPositionsMap:new Map(k.current),newChildrenPositionsMap:new Map(L.current),oldChildrenParentIdMap:new Map(Y.current),newChildrenParentIdMap:new Map(U.current),undo:function(){if(a((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===m.changedElementId){a.lz=m.oldValue,a.cz=m.oldValue/2;break}}}catch(ie){l.e(ie)}finally{l.f()}})),m.oldChildrenPositionsMap&&m.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(m.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),o=l[0],i=l[1],r=h(o);if((null===r||void 0===r?void 0:r.type)!==V.Polygon){var n,c;v(o,i.x,i.y,i.z);var s=null===(n=m.oldChildrenParentIdMap)||void 0===n?void 0:n.get(o),d=null===(c=m.newChildrenParentIdMap)||void 0===c?void 0:c.get(o);s&&d&&s!==d&&(ue(s,d,o),fe(s,o))}}}catch(ie){t.e(ie)}finally{t.f()}}},redo:function(){if(a((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===m.changedElementId){a.lz=m.newValue,a.cz=m.newValue/2;break}}}catch(ie){l.e(ie)}finally{l.f()}})),m.newChildrenPositionsMap&&m.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(m.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,o,i=Object(u.a)(e.value,2),r=i[0],n=i[1];v(r,n.x,n.y,n.z);var c=null===(l=m.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),s=null===(o=m.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(ue(s,c,r),fe(s,r))}}catch(ie){t.e(ie)}finally{t.f()}}}};x(m)}break;case V.Tree:switch(g){case K.Top:var w={name:"Change Tree Height",timestamp:Date.now(),changedElementId:l.id,changedElementType:l.type,oldValue:F.current,newValue:l.lz,undo:function(){y(w.changedElementId,w.oldValue)},redo:function(){y(w.changedElementId,w.newValue)}};x(w),a((function(e){e.actionState.treeHeight=l.lz}));break;case K.Left:case K.Right:case K.Lower:case K.Upper:var b={name:"Change Tree Spread",timestamp:Date.now(),changedElementId:l.id,changedElementType:l.type,oldValue:O.current,newValue:l.lx,undo:function(){p(b.changedElementId,b.oldValue)},redo:function(){p(b.changedElementId,b.newValue)}};x(b),a((function(e){e.actionState.treeSpread=l.lx}))}o=null===(e=Et.getState().treeRef)||void 0===e?void 0:e.current;break;case V.Human:o=null===(t=Et.getState().humanRef)||void 0===t?void 0:t.current}if(o){var T=G.intersectObjects(Tw.fetchIntersectables(P),!1),j=he(T);if(j){var R=j.point;if("Ground"===j.object.name)ye(l.id,xt,R),I.current.set(R.x,R.y,R.z),i=xt;else if(j.object.userData.stand){var D=se(j.object),M=j.object.parent;if(M){var E=(new Me.Vector3).subVectors(R,M.position).applyEuler(X);ye(l.id,D,E),I.current.set(E.x,E.y,E.z),i=D}}}}if(Ew.getState().moveHandleType&&Tw.isPlantOrHuman(l)&&(I.current.distanceToSquared(W.current)>At||G.intersectObjects([H.current]).length>0)){var B=!0;if(!Ew.getState().viewState.orthographic&&!(B=I.current.length().02}if(!B||function(){if(Ew.getState().viewState.orthographic)return!1;if(H.current){var e=G.intersectObjects(Tw.fetchIntersectables(P),!1);if(e.length>0){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;)if(t.value.object.userData.stand)return!1}catch(ie){l.e(ie)}finally{l.f()}}}return G.intersectObjects([H.current]).length>0}()){v(l.id,W.current.x,W.current.y,W.current.z),o&&Tw.isPlantOrHuman(l)&&o.position.copy(W.current),Tw.isPlantOrHuman(l)&&fe(N.current,l.id);var le=Et.getState().contentRef;if((null===le||void 0===le?void 0:le.current)&&N.current&&o){if(N.current===xt)le.current.add(o);else{var ae=Tw.getObjectChildById(le.current,N.current);null===ae||void 0===ae||ae.add(o)}Object(Se.c)()}Qh(me.t("message.CannotMoveObjectTooFar",J))}else{var oe={name:"Move",timestamp:Date.now(),movedElementId:l.id,movedElementType:l.type,oldCx:W.current.x,oldCy:W.current.y,oldCz:W.current.z,newCx:I.current.x,newCy:I.current.y,newCz:I.current.z,oldParentId:N.current,newParentId:i,undo:function(){v(oe.movedElementId,oe.oldCx,oe.oldCy,oe.oldCz),fe(oe.oldParentId,oe.movedElementId),ue(oe.oldParentId,oe.newParentId,oe.movedElementId)},redo:function(){v(oe.movedElementId,oe.newCx,oe.newCy,oe.newCz),fe(oe.newParentId,oe.movedElementId),ue(oe.newParentId,oe.oldParentId,oe.movedElementId)}};x(oe),A()}}}z.current=null,$(Z.Sky),a((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null})),Et.setState((function(e){e.humanRef=null,e.treeRef=null,e.setEnableOrbitController(!0)}))}},children:Object(gf.jsx)("meshStandardMaterial",{side:Me.DoubleSide})})]})},ax=n.a.memo(lx),ox=function(e){var t=e.lineWidth,l=void 0===t?1:t,a=e.endPoint,i=void 0===a?1e3:a,c=e.showTickMarks,s=void 0===c||c,d=e.showTickLabels,f=void 0===d||d,h=Ew(Dr),p=Ew(Kr),y=Ew(o.orthographic),g=Object(r.useState)(!1),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useRef)(1),b=Object(r.useRef)(10*v.current),A=Object(r.useRef)(new Array(50).fill(1)),T=.3,P="FloralWhite",S=l/2,j=Object(Se.e)(Me.FontLoader,ty),H=Math.min(1,Math.max(.5,.01*p)),z={font:j,height:0,size:H},R=y?h.max.z+.01:0;Object(r.useEffect)((function(){v.current=p<50?1:p<100?2:5,b.current=10*v.current,A.current=new Array(50).fill(1),x(!w)}),[p]);var D=function(e){return e%(5*v.current)===0?T:.1};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},name:"x axis line",points:[[-i,0,R],[i,0,R]],color:"red",lineWidth:l}),y&&s&&A.current.map((function(e,t){var l=(t+1)*v.current,a=D(l);return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[l,-a,R],[l,a,R]],color:P,lineWidth:S}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-l,-a,R],[-l,a,R]],color:P,lineWidth:S})]},l)})),y&&f&&A.current.map((function(e,t){var l=(t+1)*v.current;return l%b.current===0?Object(gf.jsxs)("mesh",{userData:{unintersectable:!0},position:[l-H,-.6-H,R],children:[Object(gf.jsx)("textGeometry",{args:[(l<10?" ":"")+l,z]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(gf.jsx)(n.a.Fragment,{},l)})),y&&f&&A.current.map((function(e,t){var l=-(t+1)*v.current;return l%b.current===0?Object(gf.jsxs)("mesh",{userData:{unintersectable:!0},position:[l-H,-.6-H,R],children:[Object(gf.jsx)("textGeometry",{args:[(l>-10?" ":"")+l,z]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(gf.jsx)(n.a.Fragment,{},l)})),Object(gf.jsx)(Jl.a,{name:"y axis line",userData:{unintersectable:!0},points:[[0,-i,R],[0,i,R]],color:"blue",lineWidth:l}),y&&s&&A.current.map((function(e,t){var l=(t+1)*v.current,a=D(l);return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-a,l,R],[a,l,R]],color:P,lineWidth:1.5*S}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-a,-l,R],[a,-l,R]],color:P,lineWidth:1.5*S})]},l)})),y&&f&&A.current.map((function(e,t){var l=(t+1)*v.current;return l%b.current===0?Object(gf.jsxs)("mesh",{userData:{unintersectable:!0},position:[-.6-2*H,l-H/2,R],children:[Object(gf.jsx)("textGeometry",{args:[l+"",z]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(gf.jsx)(n.a.Fragment,{},l)})),y&&f&&A.current.map((function(e,t){var l=-(t+1)*v.current;return l%b.current===0?Object(gf.jsxs)("mesh",{userData:{unintersectable:!0},position:[-.6-2*H,l-H/2,R],children:[Object(gf.jsx)("textGeometry",{args:[l+"",z]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]},l):Object(gf.jsx)(n.a.Fragment,{},l)})),!y&&Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},name:"z axis line",points:[[0,0,0],[0,0,i]],color:"green",lineWidth:l})]})},ix=n.a.memo(ox),rx=l(803),nx=function(e){var t,l,a,i,n,c,s=e.id,d=e.cx,h=e.cy,p=e.cz,y=e.name,g=void 0===y?ne.Jack:y,m=e.locked,w=void 0!==m&&m,x=e.flip,v=void 0!==x&&x,b=e.observer,A=void 0!==b&&b,T=e.parentId,P=!1;Ew((function(e){if(T===xt)P=!0;else{var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){if(t.value.id===T){P=!0;break}}}catch(a){l.e(a)}finally{l.f()}}}));var S=Ew(qc);Object(r.useEffect)((function(){P||S(s,!1)}),[P,s]);var j=Ew(si),H=Ew(Vi),z=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,R=Ew(is),D=Ew(Zr),M=Ew(zu),W=Ew(Hu),I=_f(s),C=Object(Se.f)().gl,O=Object(r.useState)(!1),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useState)(!1),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Et((function(e){return e.contentRef})),G=Object(r.useRef)(null),K=Object(r.useRef)(null),q=Object(r.useMemo)((function(){return{lng:H}}),[H]),Q=Object(r.useMemo)((function(){return D(s)}),[s]),Z=Object(r.useRef)(!1),_=Ew(Tr);_!==Z.current&&(Z.current=_,(null===J||void 0===J?void 0:J.current)&&G.current&&J.current.add(G.current)),Object(r.useEffect)((function(){if(T!==xt){var e=se();e&&G.current&&e.add(G.current)}}),[_]);var $=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(Tl.fetchTextureImage(g),(function(e){v&&(e.wrapS=Me.RepeatWrapping,e.repeat.x=-1),ae(e),N(!U)}))}),[g,v]),ee=Object(r.useState)($),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useMemo)((function(){return Tl.fetchWidth(g)}),[g]),ie=Object(r.useMemo)((function(){return Tl.fetchHeight(g)}),[g]),ce=Object(r.useMemo)((function(){return Tl.fetchLabel(g,q)+(w?" ("+me.t("shared.ElementLocked",q)+")":"")+"\n"+me.t("word.Coordinates",q)+": ("+d.toFixed(1)+", "+h.toFixed(1)+") "+me.t("word.MeterAbbreviation",q)}),[g,w,H,d,h]);Object(r.useEffect)((function(){var e=se();e&&G.current&&e.add(G.current)}),[J]);var se=function(){return T!==xt&&(null===J||void 0===J?void 0:J.current)?Tw.getObjectChildById(J.current,T):null};Object(Se.d)((function(e){var t=e.camera;if(G.current){var l=Tw.getWorldDataById(T).rot;if(z)G.current.rotation.set(vt,Math.PI-l,0);else{var a=t.position,o=a.x,i=a.y,r=G.current.localToWorld(new Me.Vector3),n=r.x,c=r.y;G.current.rotation.set(0,0,-Math.atan2(o-n,i-c)-l)}}}));var de=Object(r.useCallback)((function(e,t){Tf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(j((function(e){e.hoveredHandle=t,e.selectedElementHeight=Q.lz})),Tw.isMoveHandle(t)?C.domElement.style.cursor="move":C.domElement.style.cursor="pointer")}),[]),ue=Object(r.useCallback)((function(){j((function(e){e.hoveredHandle=null})),C.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"default"}),[]),fe=A?Tl.fetchGender(Q.name):re.Male,he=A?(Q.flip?-1:1)*Tl.fetchHatOffsetX(Q.name):0,pe=A?Tl.fetchHatOffsetY(Q.name):0;return P?Object(gf.jsx)("group",{ref:G,name:"Human Group "+s,userData:{aabb:!0},position:[d,h,null!==p&&void 0!==p?p:0],children:Object(gf.jsxs)("group",{position:[0,.1,ie/2],children:[Object(gf.jsx)(rx.a,{rotation:[vt,0,0],uuid:s,name:g,follow:!1,children:Object(gf.jsx)(Lt.f,{ref:K,renderOrder:3,receiveShadow:!0,name:"Human ".concat(g," plane"),args:[oe,ie],onContextMenu:function(e){R(s,e,X.ContextMenu),j((function(t){e.intersections.length>0&&(e.intersections[0].object===K.current&&(t.contextMenuObjectType=V.Human))}))},onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(R(s,e,X.Move),Et.setState((function(e){e.humanRef=G})))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===K.current&&Y(!0))},onPointerOut:function(e){Y(!1)},children:Object(gf.jsx)("meshToonMaterial",{map:le,alphaTest:.5,side:Me.DoubleSide})})}),I&&w&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-oe/2,0,-ie/2],[-oe/2,0,ie/2],[-oe/2,0,ie/2],[oe/2,0,ie/2],[oe/2,0,-ie/2],[oe/2,0,ie/2],[oe/2,0,-ie/2],[-oe/2,0,-ie/2]],castShadow:!1,receiveShadow:!1,lineWidth:.5,rotation:null===(l=K.current)||void 0===l?void 0:l.rotation,color:yt}),A&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{uuid:s,visible:!1,userData:{eyeball:!0},name:g+" eyeball",args:[oe/5,4,4,0,bt,0,bt],position:[0,0,Q.lz/2],children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide})}),Object(gf.jsx)(Lt.d,{name:"Observer hat 1",userData:{unintersectable:!0},castShadow:!1,receiveShadow:!1,args:[.1,.1,.1,16,2],position:[he,0,Q.lz/2-.05+pe],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:fe===re.Male?"gray":"hotpink"})}),Object(gf.jsx)(Lt.d,{name:"Observer hat 2",userData:{unintersectable:!0},castShadow:!1,receiveShadow:!1,args:[.2,.2,.01,16,2],position:[he,0,Q.lz/2-.1+pe],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:fe===re.Male?"gray":"hotpink"})})]}),I&&!w&&Object(gf.jsx)(Lt.h,{position:[0,0,-ie/2],args:[.4,6,6,0,Math.PI],name:B.Default,onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(R(s,e,X.Move),Et.setState((function(e){e.humanRef=G})))},onPointerEnter:function(e){de(e,B.Default)},onPointerLeave:ue,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:W===B.Default||M===B.Default?pt:ut})}),k&&!I&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:ce,color:null!==(a=null===Q||void 0===Q?void 0:Q.labelColor)&&void 0!==a?a:"white",fontSize:null!==(i=null===Q||void 0===Q?void 0:Q.labelFontSize)&&void 0!==i?i:20,textHeight:null!==(n=null===Q||void 0===Q?void 0:Q.labelSize)&&void 0!==n?n:.2,position:[0,0,ie/2+(null!==(c=null===Q||void 0===Q?void 0:Q.labelHeight)&&void 0!==c?c:.4)]})]})}):null},cx=n.a.memo(nx),sx=l.p+"static/media/apple_spring.0cad3025.png",dx=l.p+"static/media/apple_summer.46de7d87.png",ux=l.p+"static/media/apple_fall.27ba1ce5.png",fx=l.p+"static/media/apple_winter.d23599a6.png",hx=l.p+"static/media/birch_spring.6960e824.png",px=l.p+"static/media/birch_summer.59ae1138.png",yx=l.p+"static/media/birch_fall.210e663d.png",gx=l.p+"static/media/birch_winter.c4988403.png",mx=l.p+"static/media/coconut.d38cdccd.png",wx=l.p+"static/media/dogwood_spring.c53ecf05.png",xx=l.p+"static/media/dogwood_summer.8f3157af.png",vx=l.p+"static/media/dogwood_fall.cb8fd9b6.png",bx=l.p+"static/media/dogwood_winter.745583bb.png",Ax=l.p+"static/media/elm_spring.a67f6f9c.png",Tx=l.p+"static/media/elm_summer.0e729b1c.png",Px=l.p+"static/media/elm_fall.720b87ef.png",Sx=l.p+"static/media/elm_winter.49563d13.png",jx=l.p+"static/media/fan_palm.dd78413a.png",Hx=l.p+"static/media/linden_spring.073d4e74.png",zx=l.p+"static/media/linden_summer.7a1479da.png",Rx=l.p+"static/media/linden_fall.3e8bb305.png",Dx=l.p+"static/media/linden_winter.9af7eb0e.png",Mx=l.p+"static/media/magnolia_spring.8dc3ef2d.png",Wx=l.p+"static/media/magnolia_summer.00567305.png",Ix=l.p+"static/media/magnolia_fall.475b9098.png",Cx=l.p+"static/media/magnolia_winter.8a371c67.png",Ox=l.p+"static/media/maple_spring.e1e24394.png",Fx=l.p+"static/media/maple_summer.7b3e9753.png",kx=l.p+"static/media/maple_fall.5e8e43bb.png",Yx=l.p+"static/media/maple_winter.37fba60e.png",Lx=l.p+"static/media/oak_spring.3b768daa.png",Ex=l.p+"static/media/oak_summer.54230708.png",Ux=l.p+"static/media/oak_fall.ba997613.png",Nx=l.p+"static/media/oak_winter.02087599.png",Vx=l.p+"static/media/pine.80a6a140.png",Jx=l.p+"static/media/spruce.dea2071b.png",Gx=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"isEvergreen",value:function(e){return e===oe.Spruce||e===oe.Pine||e===oe.FanPalm||e===oe.Coconut}},{key:"isConic",value:function(e){return e===oe.Spruce}},{key:"fetchLabel",value:function(e,t){switch(e){case oe.Apple:return me.t("tree.Apple",t);case oe.Birch:return me.t("tree.Birch",t);case oe.Coconut:return me.t("tree.Coconut",t);case oe.Dogwood:return me.t("tree.Dogwood",t);case oe.Elm:return me.t("tree.Elm",t);case oe.FanPalm:return me.t("tree.FanPalm",t);case oe.Linden:return me.t("tree.Linden",t);case oe.Magnolia:return me.t("tree.Magnolia",t);case oe.Maple:return me.t("tree.Maple",t);case oe.Oak:return me.t("tree.Oak",t);case oe.Spruce:return me.t("tree.Spruce",t);default:return me.t("tree.Pine",t)}}},{key:"fetchTheta",value:function(e){switch(e){case oe.Apple:return.65*Math.PI;case oe.Birch:return.72*Math.PI;case oe.Coconut:return.5*Math.PI;case oe.Dogwood:return.65*Math.PI;case oe.Elm:return.78*Math.PI;case oe.FanPalm:return.52*Math.PI;case oe.Linden:return.75*Math.PI;case oe.Magnolia:return.68*Math.PI;case oe.Maple:return.65*Math.PI;case oe.Oak:return.75*Math.PI;case oe.Spruce:return Math.PI;default:return.5*Math.PI}}},{key:"fetchTextureImage",value:function(e,t,l,a,o){var i,r=a+30,n=o-30,c=l>0;switch(e){case oe.Apple:i=t>=o||t<=a?c?fx:dx:t>a&&t<=r?c?sx:ux:t>r&&t<=n?c?dx:fx:c?ux:sx;break;case oe.Birch:i=t>=o||t<=a?c?gx:px:t>a&&t<=r?c?hx:yx:t>r&&t<=n?c?px:gx:c?yx:hx;break;case oe.Coconut:i=mx;break;case oe.Dogwood:i=t>=o||t<=a?c?bx:xx:t>a&&t<=r?c?wx:vx:t>r&&t<=n?c?xx:bx:c?vx:wx;break;case oe.Elm:i=t>=o||t<=a?c?Sx:Tx:t>a&&t<=r?c?Ax:Px:t>r&&t<=n?c?Tx:Sx:c?Px:Ax;break;case oe.FanPalm:i=jx;break;case oe.Linden:i=t>=o||t<=a?c?Dx:zx:t>a&&t<=r?c?Hx:Rx:t>r&&t<=n?c?zx:Dx:c?Rx:Hx;break;case oe.Magnolia:i=t>=o||t<=a?c?Cx:Wx:t>a&&t<=r?c?Mx:Ix:t>r&&t<=n?c?Wx:Cx:c?Ix:Mx;break;case oe.Maple:i=t>=o||t<=a?c?Yx:Fx:t>a&&t<=r?c?Ox:kx:t>r&&t<=n?c?Fx:Yx:c?kx:Ox;break;case oe.Oak:i=t>=o||t<=a?c?Nx:Ex:t>a&&t<=r?c?Lx:Ux:t>r&&t<=n?c?Ex:Nx:c?Ux:Lx;break;case oe.Spruce:i=Jx;break;default:i=Vx}return i}}]),e}(),Xx=function(e){var t,l,a,n,c,s,d,h,p=e.parentId,y=e.id,g=e.cx,m=e.cy,w=e.cz,x=e.lx,v=e.lz,b=e.name,A=void 0===b?oe.Pine:b,T=e.flip,P=void 0!==T&&T,S=e.locked,j=void 0!==S&&S,H=e.showModel,z=void 0!==H&&H,R=e.showLabel,D=void 0!==R&&R,M=!1;Ew((function(e){if(p===xt)M=!0;else{var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){if(t.value.id===p){M=!0;break}}}catch(a){l.e(a)}finally{l.f()}}}));var W=Ew(qc);Object(r.useEffect)((function(){M||W(y,!1)}),[M]);var I=Ew(si),C=Ew(Vi),O=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,F=Ew(i.date),k=Ew(i.latitude),Y=null!==(l=Ew(i.leafDayOfYear1))&&void 0!==l?l:rt,L=null!==(a=Ew(i.leafDayOfYear2))&&void 0!==a?a:nt,E=Ew(o.shadowEnabled),U=Ew(is),N=Ew(Zr),J=Ew(zu),G=Ew(Ru),q=Ew(Hu),Q=_f(y),Z=Object(r.useState)(!1),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Object(r.useState)(!1),le=Object(u.a)(te,2),ae=le[0],ie=le[1],re=Object(Se.f)().gl,ne=Et((function(e){return e.contentRef})),ce=Object(r.useRef)(null),se=Object(r.useRef)(null),de=Object(r.useRef)(null),ue=Object(r.useRef)(null),fe=Object(r.useRef)(null),he=Object(r.useRef)(),pe=Object(r.useRef)(),ye=Object(r.useRef)(),ge=Object(r.useRef)(),we=Object(r.useRef)(),xe=Object(r.useMemo)((function(){return{lng:C}}),[C]),ve=Object(r.useMemo)((function(){return N(y)}),[y]),be=Object(r.useMemo)((function(){return Tw.dayOfYear(new Date(F))}),[F]),Ae=Object(r.useMemo)((function(){return!Gx.isEvergreen(ve?ve.name:oe.Dogwood)&&(k>0?beL:be>=Y&&be<=L)}),[be,Y,L,k,null===ve||void 0===ve?void 0:ve.name]),Te=Object(r.useRef)(!1),Pe=Ew(Tr);Pe!==Te.current&&(Te.current=Pe,(null===ne||void 0===ne?void 0:ne.current)&&ce.current&&ne.current.add(ce.current)),Object(r.useEffect)((function(){if(p!==xt){var e=Je();e&&ce.current&&e.add(ce.current)}}),[Pe]),Object(r.useEffect)((function(){var e=Je();e&&ce.current&&e.add(ce.current)}),[ne]);var je=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(Gx.fetchTextureImage(A,be,k,Y,L),(function(e){P&&(e.wrapS=Me.RepeatWrapping,e.repeat.x=-1),De(e),ie(!ae)}))}),[A,be,k,P,Y,L]),He=Object(r.useState)(je),ze=Object(u.a)(He,2),Re=ze[0],De=ze[1],We=Object(r.useMemo)((function(){return((null===ve||void 0===ve?void 0:ve.label)?ve.label:Gx.fetchLabel(A,xe))+(j?" ("+me.t("shared.ElementLocked",xe)+")":"")+((null===ve||void 0===ve?void 0:ve.label)?"":"\n"+me.t("word.Coordinates",xe)+": ("+g.toFixed(1)+", "+m.toFixed(1)+") "+me.t("word.MeterAbbreviation",xe))}),[null===ve||void 0===ve?void 0:ve.label,A,g,m,j,C]),Ie=Object(r.useMemo)((function(){return Gx.fetchTheta(A)}),[A]),Ce=new Me.MeshDepthMaterial({depthPacking:Me.RGBADepthPacking,map:Re,alphaTest:.1}),Oe=x/2,Fe=v/2,ke=Object(r.useMemo)((function(){return new Me.Vector3(0,0,Fe)}),[Fe]),Ye=Object(r.useMemo)((function(){return new Me.Vector3(-Oe,0,0)}),[Oe]),Le=Object(r.useMemo)((function(){return new Me.Vector3(Oe,0,0)}),[Oe]),Ee=Object(r.useMemo)((function(){return new Me.Vector3(0,-Oe,0)}),[Oe]),Ue=Object(r.useMemo)((function(){return new Me.Vector3(0,Oe,0)}),[Oe]),Ne=Object(r.useCallback)((function(e,t){Tf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(I((function(e){e.hoveredHandle=t,e.selectedElementHeight=ve.lz})),Tw.isMoveHandle(t)?re.domElement.style.cursor="move":re.domElement.style.cursor="pointer")}),[]),Ve=Object(r.useCallback)((function(){I((function(e){e.hoveredHandle=null})),re.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"default"}),[]),Je=function(){return p!==xt&&(null===ne||void 0===ne?void 0:ne.current)?Tw.getObjectChildById(ne.current,p):null};Object(Se.d)((function(e){var t=e.camera;if(se.current&&ce.current&&de.current&&fe.current){var l=Tw.getWorldDataById(p).rot,a=t.position,o=a.x,i=a.y,r=ce.current.position,n=r.x,c=r.y,s=Ew.getState().sunlightDirection,d=s.x,u=s.y;if(Je()){var f=ce.current.localToWorld(new Me.Vector3),h=Math.atan2(o-f.x,i-f.y)+l;se.current.rotation.set(vt,-h,0),fe.current.rotation.set(-vt,h,0),de.current.rotation.set(vt,-Math.atan2(d,u)-l,0)}else{var y=Math.atan2(o-n,i-c);se.current.rotation.set(vt,-y,0),fe.current.rotation.set(-vt,y,0),de.current.rotation.set(vt,-Math.atan2(d,u),0)}}}));var Ge=.30000000000000004;return Object(gf.jsx)(gf.Fragment,{children:M?Object(gf.jsx)("group",{ref:ce,name:"Tree Group "+y,userData:{aabb:!0},position:[g,m,null!==w&&void 0!==w?w:0],children:Object(gf.jsxs)("group",{position:[0,0,v/2],children:[Object(gf.jsx)(rx.a,{ref:se,uuid:y,name:A,follow:!1,children:Object(gf.jsx)(Lt.f,{args:[x,v],children:Object(gf.jsx)("meshToonMaterial",{map:Re,side:Me.DoubleSide,alphaTest:.5})})}),Object(gf.jsx)(rx.a,{ref:de,name:A+" Shadow Billboard",follow:!1,children:Object(gf.jsx)(Lt.f,{castShadow:E,args:[x,v],customDepthMaterial:Ce,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,transparent:!0,opacity:0,depthTest:!1})})}),Gx.isConic(A)?Object(gf.jsx)(Lt.c,{visible:z||O,name:A+" Model",userData:{simulation:!0},position:[0,0,A===oe.Spruce?0:.06*v],args:[x/2,v,8,8,!0],scale:[1,1,1],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",side:Me.DoubleSide,transparent:!0,opacity:.75})}):Object(gf.jsx)(Lt.h,{visible:z||O,userData:{simulation:!Ae},name:A+" Model",args:[x/2,8,8,0,bt,0,Ie],scale:[1,v/x,1],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",side:Me.DoubleSide,transparent:!0,opacity:.75})}),Object(gf.jsx)(rx.a,{ref:fe,name:"Interaction Billboard",visible:!1,position:[0,0,-v/2+.5],children:Object(gf.jsx)(Lt.f,{ref:ue,renderOrder:3,name:A+" plane",args:[x/2,v/3],rotation:[O?vt:0,0,0],onContextMenu:function(e){U(y,e,X.ContextMenu),I((function(t){e.intersections.length>0&&(e.intersections[0].object===ue.current&&(t.contextMenuObjectType=V.Tree))}))},onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(U(y,e,X.Move),Et.setState((function(e){e.treeRef=ce})))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===ue.current&&ee(!0))},onPointerOut:function(e){ee(!1)}})}),Q&&j&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-x/2,-v/2,0],[-x/2,v/2,0],[-x/2,v/2,0],[x/2,v/2,0],[x/2,-v/2,0],[x/2,v/2,0],[x/2,-v/2,0],[-x/2,-v/2,0]],castShadow:!1,receiveShadow:!1,lineWidth:.5,rotation:null===(n=se.current)||void 0===n?void 0:n.rotation,color:yt}),Q&&!j&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{position:new Me.Vector3(0,0,-v/2),args:[Ge,6,6,0,Math.PI],name:B.Default,renderOrder:2,onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(U(y,e,X.Move),Et.setState((function(e){e.treeRef=ce})))},onPointerEnter:function(e){Ne(e,B.Default)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===B.Default||J===B.Default?pt:ut})}),!O&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.a,{ref:he,name:K.Top,args:[Ge,Ge,Ge],position:ke,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Top)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Top||G===K.Top?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:pe,name:K.Left,args:[Ge,Ge,Ge],position:Ye,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Left)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Left||G===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:ye,name:K.Right,args:[Ge,Ge,Ge],position:Le,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Right)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Right||G===K.Right?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:ge,name:K.Lower,args:[Ge,Ge,Ge],position:Ee,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Lower)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Lower||G===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:we,name:K.Upper,args:[Ge,Ge,Ge],position:Ue,onPointerDown:function(e){U(y,e,X.Resize)},onPointerEnter:function(e){Ne(e,K.Upper)},onPointerLeave:Ve,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:q===K.Upper||G===K.Upper?pt:ht})})]})]}),($||D)&&!Q&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:We,color:null!==(c=null===ve||void 0===ve?void 0:ve.labelColor)&&void 0!==c?c:"white",fontSize:null!==(s=null===ve||void 0===ve?void 0:ve.labelFontSize)&&void 0!==s?s:20,textHeight:null!==(d=null===ve||void 0===ve?void 0:ve.labelSize)&&void 0!==d?d:.2,position:[0,0,v/2+(null!==(h=null===ve||void 0===ve?void 0:ve.labelHeight)&&void 0!==h?h:.4)]})]})}):null})},Bx=n.a.memo(Xx),Kx=l(58),qx=["args","children"];function Qx(e){var t=e+"Geometry";return r.forwardRef((function(e,l){var a=e.args,o=e.children,i=Object(Kx.a)(e,qx);return Object(gf.jsxs)("mesh",Object(d.a)(Object(d.a)({ref:l},i),{},{children:[Object(gf.jsx)(t,{attach:"geometry",args:a}),o]}))}))}var Zx,_x,$x,ev,tv,lv=Qx("ParabolicCylinder"),av=Qx("Paraboloid"),ov=function(e){var t,l,a,c,s=e.id,d=e.cx,h=e.cy,p=e.cz,y=e.lx,g=e.ly,m=e.lz,w=void 0===m?.1:m,x=e.reflectance,v=void 0===x?.9:x,b=e.absorberTubeRadius,A=void 0===b?.05:b,T=e.latusRectum,P=void 0===T?2:T,S=e.tiltAngle,j=e.relativeAzimuth,H=e.moduleLength,z=e.poleHeight,R=e.poleRadius,D=e.drawSunBeam,M=e.rotation,W=void 0===M?[0,0,0]:M,I=e.color,C=void 0===I?"white":I,O=e.lineColor,F=void 0===O?"black":O,k=e.lineWidth,Y=void 0===k?.5:k,L=e.showLabel,E=void 0!==L&&L,U=e.locked,N=void 0!==U&&U,J=e.parentId,G=Ew(si),Q=Ew(Vi),Z=Ew(i.date),_=Ew(i.latitude),$=Ew(Fi),ee=Tf(Ns),te=Ew(o.solarRadiationHeatmapMaxValue),le=Pf(wi),ae=Ew(o.shadowEnabled),oe=Ew(Zr),ie=Ew(is),re=Ew(Kr),ne=Ew(Ru),ce=Ew(Es),se=_f(s),de=Object(Se.f)().gl.domElement,ue=Object(r.useState)(!1),fe=Object(u.a)(ue,2),he=fe[0],pe=fe[1],ye=Object(r.useState)(null),ge=Object(u.a)(ye,2),we=ge[0],xe=ge[1],ve=Object(r.useState)(1),be=Object(u.a)(ve,2),Ae=be[0],Te=be[1],Pe=Object(r.useState)(null),je=Object(u.a)(Pe,2),He=je[0],ze=je[1],Re=Object(r.useRef)(),De=Object(r.useRef)(),We=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Oe=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(!1),Ye=Math.max(100,10*re),Le=16,Ee=ce.z<=0,Ue=Object(r.useMemo)((function(){return{lng:Q}}),[Q]),Ne=y/2,Ve=g/2,Je=w/2,Ge=z+Ne,Xe=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===J)return a}}catch(o){l.e(o)}finally{l.f()}}));if(J&&Xe)switch(Xe.type){case V.Foundation:if(p=Ge+Je+Xe.lz,Tw.isZero(W[2]))d=Xe.cx+d*Xe.lx,h=Xe.cy+h*Xe.ly;else{var Be=new Me.Vector3(d*Xe.lx,h*Xe.ly,0);Be.applyAxisAngle(Rt,W[2]),d=Xe.cx+Be.x,h=Xe.cy+Be.y}}var Ke=Ne*Ne/P,qe=.25*P,Qe=new Me.Vector3(-Ne,-Ve,Je+Ke),Ze=new Me.Vector3(-Ne,Ve,Je+Ke),_e=new Me.Vector3(Ne,-Ve,Je+Ke),$e=new Me.Vector3(Ne,Ve,Je+Ke),et=Object(r.useMemo)((function(){return oe(s)}),[s]);Object(r.useEffect)((function(){if(et&&ee){var e=le(et.id);e&&ze(Tw.fetchHeatmapTexture(e,null!==te&&void 0!==te?te:5))}}),[ee,te]),Object(r.useEffect)((function(){Te(Math.max(1,Math.round(g/H)))}),[g,H]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),ke.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var tt=Object(r.useMemo)((function(){return((null===et||void 0===et?void 0:et.label)?et.label:me.t("shared.ParabolicTroughElement",Ue))+((null===et||void 0===et?void 0:et.locked)?" ("+me.t("shared.ElementLocked",Ue)+")":"")+((null===et||void 0===et?void 0:et.label)?"":"\n"+me.t("word.Coordinates",Ue)+": ("+d.toFixed(1)+", "+h.toFixed(1)+", "+p.toFixed(1)+") "+me.t("word.MeterAbbreviation",Ue))}),[null===et||void 0===et?void 0:et.label,N,Q,d,h,p]),lt=Object(r.useMemo)((function(){return new Me.Euler(0,0,W[2],"ZXY")}),[W]),at=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(xe(t),t===B.Top?de.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?de.style.cursor="grab":de.style.cursor="pointer"))},ot=function(){xe(null),de.style.cursor="default"},it=Object(r.useMemo)((function(){return jy(new Date(Z),_)}),[Z,_]),rt=Object(r.useMemo)((function(){var e;return null===(e=oe(J))||void 0===e?void 0:e.rotation[2]}),[J]),nt=rt?it.clone().applyAxisAngle(Rt,-rt):it,ct=Object(r.useMemo)((function(){return it.z>0?new Me.Euler(0,Math.atan2(nt.x,nt.z),0,"ZXY"):new Me.Euler(S,0,j,"ZXY")}),[rt,it,S,j]),ut=Object(r.useMemo)((function(){if(it.z>0){var e=rt?Math.cos(rt):1,t=rt?Math.sin(rt):0;return-qe*(it.x*t+it.y*e)/Math.hypot(it.x,it.z)}return 0}),[it,rt,qe]),ft=new Me.Vector3(0,ut,qe).applyEuler(ct),gt=it.clone().multiplyScalar(Ye).applyEuler(new Me.Euler(-lt.x,0,-lt.z)),mt=-(Ge+w)/2,wt=Object(r.useMemo)((function(){for(var e=[],t=Math.cos(j)*H,l=Math.sin(j)*H,a=Ae/2-.5,o=0;o0&&(e.intersections[0].object===Re.current&&(t.contextMenuObjectType=V.ParabolicTrough))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===Re.current&&(pe(!0),de.style.cursor="move"))},onPointerOut:function(e){pe(!1),de.style.cursor="default"},children:ee&&He?Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.FrontSide,map:He}):Object(gf.jsx)("meshPhongMaterial",{attach:"material",specular:new Me.Color("white"),shininess:100*v,side:Me.FrontSide,color:"lightskyblue"})}),Object(gf.jsx)(lv,{receiveShadow:ae,castShadow:ae,uuid:s+" backside",ref:De,args:[P/2,y,g,Le,4],name:"Parabolic Trough Back Side",position:[0,0,-Je/2],onPointerDown:function(e){2!==e.button&&ie(s,e,X.Select)},onContextMenu:function(e){ie(s,e,X.ContextMenu),G((function(t){e.intersections.length>0&&(e.intersections[0].object===De.current&&(t.contextMenuObjectType=V.ParabolicTrough))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===De.current&&(pe(!0),de.style.cursor="move"))},onPointerOut:function(e){pe(!1),de.style.cursor="default"},children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",side:Me.BackSide,color:"white"})}),xt&&xt.map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Pt&&Object(gf.jsx)(Jl.a,{name:"Parabolic Trough Rim Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:Y,color:F}),(0===t||t===xt.length-1||Pt)&&Object(gf.jsx)(Jl.a,{name:"Parabolic Trough Focal Lines",userData:{unintersectable:!0},points:[e.points[8].clone(),e.points[8].clone().add(new Me.Vector3(0,0,qe))],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:Ee?"dimgray":"white"})]},t)})),Pt&&Object(gf.jsx)(Jl.a,{name:"Parabolic Trough Outline 1",userData:{unintersectable:!0},points:[[-Ne,-Ve,Ke],[-Ne,Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:F}),Pt&&Object(gf.jsx)(Jl.a,{name:"Parabolic Trough Outline 2",userData:{unintersectable:!0},points:[[Ne,-Ve,Ke],[Ne,Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:Y,color:F}),Object(gf.jsx)(Lt.d,{name:"Parabolic Trough Absorber Tube",uuid:s,args:[A,A,g,Pt?6:2,1],position:[0,0,qe],receiveShadow:!1,castShadow:!0,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"white"})}),Object(gf.jsx)(Lt.f,{name:"Parabolic Trough Simulation Plane",uuid:s,args:[y,g],position:[0,0,Ke],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),se&&N&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Ne,-Ve,Ke],[-Ne,Ve,Ke],[Ne,Ve,Ke],[Ne,-Ve,Ke],[-Ne,-Ve,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),se&&!N&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:We,position:new Me.Vector3(0,0,0),args:[Tt,6,6],name:B.Default,onPointerOver:function(e){at(e,B.Top)},onPointerOut:function(e){ot()},onPointerDown:function(e){2!==e.button&&ie(s,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.a,{ref:Ie,position:[(Qe.x+_e.x)/2,Qe.y,Qe.z-Ke],args:[At,At,1.2*w],name:K.Lower,onPointerDown:function(e){ie(s,e,X.Resize),Oe.current&&G((function(e){var t=Ie.current.localToWorld(new Me.Vector3(0,g,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Lower)},onPointerOut:function(e){ot()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Lower||ne===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Ce,position:[(Ze.x+$e.x)/2,Ze.y,Ze.z-Ke],args:[At,At,1.2*w],name:K.Upper,onPointerDown:function(e){ie(s,e,X.Resize),Oe.current&&G((function(e){var t=Ce.current.localToWorld(new Me.Vector3(0,-g,-Ze.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Upper)},onPointerOut:function(e){ot()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Upper||ne===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Oe,position:[Qe.x,(Qe.y+Ze.y)/2,Qe.z],args:[At,At,1.2*w],name:K.Left,onPointerDown:function(e){ie(s,e,X.Resize),Oe.current&&G((function(e){var t=Oe.current.localToWorld(new Me.Vector3(y,0,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Left)},onPointerOut:function(e){ot()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Left||ne===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Fe,position:[_e.x,(_e.y+$e.y)/2,_e.z],args:[At,At,1.2*w],name:K.Right,onPointerDown:function(e){ie(s,e,X.Resize),Oe.current&&G((function(e){var t=Fe.current.localToWorld(new Me.Vector3(-y,0,-_e.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){at(e,K.Right)},onPointerOut:function(e){ot()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:we===K.Right||ne===K.Right?pt:ht})})]})]})]}),Ge>0&&wt.map((function(e,t){return t%5===0||Pt?Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[R,R,Ge+2*(e.z-mt)+w,St,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:C})},t):Object(gf.jsx)(n.a.Fragment,{},t)})),D&&it.z>0&&Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[ft,new Me.Vector3(-.3*Ne,0,.09*Ke).applyEuler(ct),gt,new Me.Vector3(-.6*Ne,0,.36*Ke).applyEuler(ct),ft,new Me.Vector3(-.9*Ne,0,.81*Ke).applyEuler(ct),gt,new Me.Vector3(0,0,0),ft,new Me.Vector3(.3*Ne,0,.09*Ke).applyEuler(ct),gt,new Me.Vector3(.6*Ne,0,.36*Ke).applyEuler(ct),ft,new Me.Vector3(.9*Ne,0,.81*Ke).applyEuler(ct),gt],name:"Sun Beams",lineWidth:.25,color:"white"}),(he||E)&&!se&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:tt,color:null!==(t=null===et||void 0===et?void 0:et.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===et||void 0===et?void 0:et.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===et||void 0===et?void 0:et.labelSize)&&void 0!==a?a:.2,position:[0,0,null!==(c=null===et||void 0===et?void 0:et.labelHeight)&&void 0!==c?c:Math.max(Ve*Math.abs(Math.sin(et.tiltAngle))+.1,.2)]})]})},iv=n.a.memo(ov),rv=function(e){var t,l,a,c,s=e.id,d=e.cx,h=e.cy,p=e.cz,y=e.lx,g=e.ly,m=e.lz,w=void 0===m?.1:m,x=e.reflectance,v=void 0===x?.9:x,b=e.structureType,A=void 0===b?J.CentralPole:b,T=e.receiverRadius,P=void 0===T?.25:T,S=e.receiverPoleRadius,j=void 0===S?.1:S,H=e.latusRectum,z=void 0===H?2:H,R=e.tiltAngle,D=e.relativeAzimuth,M=e.poleHeight,W=e.poleRadius,I=void 0===W?.2:W,C=e.drawSunBeam,O=e.rotation,F=void 0===O?[0,0,0]:O,k=e.color,Y=void 0===k?"white":k,L=e.lineColor,E=void 0===L?"black":L,U=e.lineWidth,N=void 0===U?.25:U,G=e.showLabel,Q=void 0!==G&&G,Z=e.locked,_=void 0!==Z&&Z,$=e.parentId,ee=Ew(si),te=Ew(Vi),le=Ew(i.date),ae=Ew(i.latitude),oe=Ew(Fi),ie=Tf(Ns),re=Ew(o.solarRadiationHeatmapMaxValue),ne=Pf(wi),ce=Ew(o.shadowEnabled),se=Ew(Zr),de=Ew(is),ue=Ew(Kr),fe=Ew(Ru),he=Ew(Es),pe=_f(s),ye=Object(Se.f)().gl.domElement,ge=Object(r.useState)(!1),we=Object(u.a)(ge,2),xe=we[0],ve=we[1],be=Object(r.useState)(null),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],je=Object(r.useState)(null),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De=Object(r.useRef)(),We=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Oe=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Ye=Object(r.useRef)(!1),Le=Math.max(100,10*ue),Ee=he.z<=0,Ue=y/2,Ne=g/2,Ve=w/2,Je=M+Ue,Ge=Object(r.useMemo)((function(){return{lng:te}}),[te]),Xe=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===$)return a}}catch(o){l.e(o)}finally{l.f()}}));if($&&Xe)switch(Xe.type){case V.Foundation:if(p=Je+Ve+Xe.lz,Tw.isZero(F[2]))d=Xe.cx+d*Xe.lx,h=Xe.cy+h*Xe.ly;else{var Be=new Me.Vector3(d*Xe.lx,h*Xe.ly,0);Be.applyAxisAngle(Rt,F[2]),d=Xe.cx+Be.x,h=Xe.cy+Be.y}}var Ke=Ue*Ue/z,qe=.25*z,Qe=new Me.Vector3(-Ue,-Ne,Ve+Ke),Ze=new Me.Vector3(-Ue,Ne,Ve+Ke),_e=new Me.Vector3(Ue,-Ne,Ve+Ke),$e=new Me.Vector3(Ue,Ne,Ve+Ke),et=Object(r.useMemo)((function(){return se(s)}),[s]),tt=Object(Wy.a)(Iy),lt=P+1;Object(r.useEffect)((function(){if(et&&ie){var e=ne(et.id);e&&Re(Tw.fetchHeatmapTexture(e,null!==re&&void 0!==re?re:5))}}),[ie,re]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),Ye.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var at=Object(r.useMemo)((function(){return((null===et||void 0===et?void 0:et.label)?et.label:me.t("shared.ParabolicDishElement",Ge))+((null===et||void 0===et?void 0:et.locked)?" ("+me.t("shared.ElementLocked",Ge)+")":"")+((null===et||void 0===et?void 0:et.label)?"":"\n"+me.t("word.Coordinates",Ge)+": ("+d.toFixed(1)+", "+h.toFixed(1)+", "+p.toFixed(1)+") "+me.t("word.MeterAbbreviation",Ge))}),[null===et||void 0===et?void 0:et.label,_,te,d,h,p]),ot=Object(r.useMemo)((function(){return new Me.Euler(0,0,F[2],"ZXY")}),[F]),it=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(Pe(t),t===B.Top?ye.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?ye.style.cursor="grab":ye.style.cursor="pointer"))},rt=function(){Pe(null),ye.style.cursor="default"},nt=Object(r.useMemo)((function(){return jy(new Date(le),ae)}),[le,ae]),ct=Object(r.useMemo)((function(){var e;return null===(e=se($))||void 0===e?void 0:e.rotation[2]}),[$]),ut=ct?nt.clone().applyAxisAngle(Rt,-ct):nt,ft=Object(r.useMemo)((function(){if(nt.z>0){var e=Math.hypot(ut.x,ut.y);return new Me.Euler(Math.atan2(e,ut.z),0,Math.atan2(ut.y,ut.x)+vt,"ZXY")}return new Me.Euler(R,0,D,"ZXY")}),[nt,R,D]),gt=-(Je+w)/2,mt=oe.length<50,wt=Object(r.useMemo)((function(){var e=[];if(mt){for(var t,l,a,o=[],i=[],r=.25*Ke,n=0;n<=32;n++)t=bt*n/32,l=Math.cos(t),a=Math.sin(t),o.push(new Me.Vector3(Ue*l,Ue*a,Ke)),i.push(new Me.Vector3(Ue*l/2,Ue*a/2,r));e.push({points:o}),e.push({points:i});for(var c=0;c<12;c++){t=bt*c/12,l=Math.cos(t),a=Math.sin(t);for(var s=[],d=0;d<=8;d++){var u=0===d?0:d/8*Ue;s.push(new Me.Vector3(u*l,u*a,u*u/z+.01))}e.push({points:s})}}return e}),[Ue,z]),xt=Object(r.useMemo)((function(){if(A===J.CentralPoleWithTripod){for(var e,t=[],l=0;l<3;l++){e=bt*l/3;var a=[];a.push(new Me.Vector3(Ue*Math.cos(e),Ue*Math.sin(e),Ke)),a.push(new Me.Vector3(0,0,qe)),t.push({points:a})}return t}}),[Ue,z,A]),At=Object(r.useMemo)((function(){if(A===J.Quadrupod){for(var e,t=[],l=0;l<4;l++){e=bt*l/4;var a=[];a.push(new Me.Vector3(Ue*Math.cos(e),Ue*Math.sin(e),Ke)),a.push(new Me.Vector3(0,0,qe)),t.push({points:a})}return t}}),[Ue,z,A]),Tt=Math.max(1,(y+g)/16),Pt=dt*Tt*1.5,St=st*Tt*3,jt=nt.clone().multiplyScalar(Le),Ht=new Me.Vector3(0,0,qe).applyEuler(ft);return Object(gf.jsxs)("group",{name:"Parabolic Dish Group "+s,rotation:ot,position:[d,h,p+Ve],children:[Object(gf.jsxs)("group",{rotation:ft,children:[Object(gf.jsx)(av,{receiveShadow:ce,castShadow:ce,uuid:s,ref:De,args:[z/2,Ue,32,8],name:"Parabolic Dish Front Side",onPointerDown:function(e){2!==e.button&&de(s,e,X.Select)},onContextMenu:function(e){de(s,e,X.ContextMenu),ee((function(t){e.intersections.length>0&&(e.intersections[0].object===De.current&&(t.contextMenuObjectType=V.ParabolicDish))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===De.current&&(ve(!0),ye.style.cursor="move"))},onPointerOut:function(e){ve(!1),ye.style.cursor="default"},children:ie&&ze?Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.FrontSide,map:ze}):Object(gf.jsx)("meshPhongMaterial",{attach:"material",specular:new Me.Color("white"),shininess:100*v,side:Me.FrontSide,color:"lightskyblue"})}),Object(gf.jsx)(av,{receiveShadow:ce,castShadow:ce,uuid:s+" backside",ref:We,args:[z/2,Ue,32,8],name:"Parabolic Dish Back Side",position:[0,0,-Ve/4],onPointerDown:function(e){2!==e.button&&de(s,e,X.Select)},onContextMenu:function(e){de(s,e,X.ContextMenu),ee((function(t){e.intersections.length>0&&(e.intersections[0].object===We.current&&(t.contextMenuObjectType=V.ParabolicDish))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===We.current&&(ve(!0),ye.style.cursor="move"))},onPointerOut:function(e){ve(!1),ye.style.cursor="default"},children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",side:Me.BackSide,color:Y})}),wt&&wt.length>0&&wt.map((function(e,t){return Object(gf.jsx)(n.a.Fragment,{children:Object(gf.jsx)(Jl.a,{name:"Parabolic Dish Wireframe",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:N,color:E})},t)})),Object(gf.jsx)(Lt.d,{name:"Parabolic Dish Receiver",uuid:s,args:[P,P,.5,mt?12:4,1],rotation:[vt,0,0],position:[0,0,qe-.1],receiveShadow:!1,castShadow:!0,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),nt.z>0&&Object(gf.jsx)("mesh",{position:[0,0,qe-.1],children:Object(gf.jsx)("sprite",{scale:[lt,lt,lt],children:Object(gf.jsx)("spriteMaterial",{map:tt,transparent:!1,color:16777215,blending:Me.AdditiveBlending,depthWrite:!1})})}),(A===J.CentralPole||A===J.CentralPoleWithTripod)&&Object(gf.jsx)(Lt.d,{name:"Parabolic Dish Receiver Pole",uuid:s,args:[j,j,qe,mt?6:2,1],rotation:[vt,0,0],position:[0,0,qe/2],receiveShadow:!1,castShadow:!0,children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),A===J.CentralPoleWithTripod&&xt&&xt.map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{name:"Parabolic Dish Tripod Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:1,color:Ee?"dimgray":Y}),Object(gf.jsx)(Lt.h,{position:new Me.Vector3(e.points[0].x,e.points[0].y,e.points[0].z),args:[j/2,4,4],name:"Parabolic Dish Tripod Joint",children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})})]},t)})),A===J.Quadrupod&&At&&At.map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsx)(Jl.a,{name:"Parabolic Dish Quadrupod Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:2,color:Ee?"dimgray":Y}),Object(gf.jsx)(Lt.h,{position:new Me.Vector3(e.points[0].x,e.points[0].y,e.points[0].z),args:[j/2,4,4],name:"Parabolic Dish Quadrupod Joint",children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})})]},t)})),Object(gf.jsx)(Lt.b,{name:"Parabolic Dish Simulation Circle",uuid:s,args:[y/2,32],position:[0,0,Ke],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),pe&&_&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Ue,-Ne,Ke],[-Ue,Ne,Ke],[Ue,Ne,Ke],[Ue,-Ne,Ke],[-Ue,-Ne,Ke]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),pe&&!_&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:Ie,position:new Me.Vector3(0,0,0),args:[St,6,6],name:B.Default,onPointerOver:function(e){it(e,B.Top)},onPointerOut:function(e){rt()},onPointerDown:function(e){2!==e.button&&de(s,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.a,{ref:Ce,position:[(Qe.x+_e.x)/2,Qe.y,Qe.z],args:[Pt,Pt,1.2*w],name:K.Lower,onPointerDown:function(e){de(s,e,X.Resize),Fe.current&&ee((function(e){var t=Ce.current.localToWorld(new Me.Vector3(0,g,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Lower)},onPointerOut:function(e){rt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Lower||fe===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Oe,position:[(Ze.x+$e.x)/2,Ze.y,Ze.z],args:[Pt,Pt,1.2*w],name:K.Upper,onPointerDown:function(e){de(s,e,X.Resize),Fe.current&&ee((function(e){var t=Oe.current.localToWorld(new Me.Vector3(0,-g,-Ze.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Upper)},onPointerOut:function(e){rt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Upper||fe===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Fe,position:[Qe.x,(Qe.y+Ze.y)/2,Qe.z],args:[Pt,Pt,1.2*w],name:K.Left,onPointerDown:function(e){de(s,e,X.Resize),Fe.current&&ee((function(e){var t=Fe.current.localToWorld(new Me.Vector3(y,0,-Qe.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Left)},onPointerOut:function(e){rt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Left||fe===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:ke,position:[_e.x,(_e.y+$e.y)/2,_e.z],args:[Pt,Pt,1.2*w],name:K.Right,onPointerDown:function(e){de(s,e,X.Resize),Fe.current&&ee((function(e){var t=ke.current.localToWorld(new Me.Vector3(-y,0,-_e.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){it(e,K.Right)},onPointerOut:function(e){rt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Right||fe===K.Right?pt:ht})})]})]})]}),Je>0&&Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole",castShadow:!1,receiveShadow:!1,args:[I,I,Je+w,mt?4:2,1],position:[0,0,gt],rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:Y})}),C&&nt.z>0&&Object(gf.jsx)(Jl.a,{rotation:[-ot.x,0,-ot.z],userData:{unintersectable:!0},points:[Ht,new Me.Vector3(-.3*Ue,0,.09*Ke).applyEuler(ft),jt,new Me.Vector3(-.6*Ue,0,.36*Ke).applyEuler(ft),Ht,new Me.Vector3(-.9*Ue,0,.81*Ke).applyEuler(ft),jt,Ht,new Me.Vector3(.3*Ue,0,.09*Ke).applyEuler(ft),jt,new Me.Vector3(.6*Ue,0,.36*Ke).applyEuler(ft),Ht,new Me.Vector3(.9*Ue,0,.81*Ke).applyEuler(ft),jt],name:"Sun Beams",lineWidth:.25,color:"white"}),(xe||Q)&&!pe&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:at,color:null!==(t=null===et||void 0===et?void 0:et.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===et||void 0===et?void 0:et.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===et||void 0===et?void 0:et.labelSize)&&void 0!==a?a:.2,position:[0,0,null!==(c=null===et||void 0===et?void 0:et.labelHeight)&&void 0!==c?c:Math.max(Ne*Math.abs(Math.sin(et.tiltAngle))+.1,.2)]})]})},nv=n.a.memo(rv),cv=function(e){var t,l,a,n,c=e.id,s=e.cx,d=e.cy,h=e.cz,p=e.lx,y=e.ly,g=e.lz,m=void 0===g?.1:g,w=e.reflectance,x=void 0===w?.9:w,v=e.tiltAngle,b=e.relativeAzimuth,A=e.moduleLength,T=e.poleHeight,P=e.poleRadius,S=void 0===P?.1:P,j=e.drawSunBeam,H=e.rotation,z=void 0===H?[0,0,0]:H,R=e.color,D=void 0===R?"white":R,M=e.lineColor,W=void 0===M?"black":M,I=e.lineWidth,C=void 0===I?.5:I,O=e.showLabel,F=void 0!==O&&O,k=e.locked,Y=void 0!==k&&k,L=e.parentId,E=e.receiverId,U=Ew(si),N=Ew(Vi),J=Ew(i.date),Q=Ew(i.latitude),Z=Ew(Fi),_=Tf(Ns),$=Ew(o.solarRadiationHeatmapMaxValue),ee=Pf(wi),te=Ew(o.shadowEnabled),le=Ew(Zr),ae=Ew(is),oe=Ew(Kr),ie=Ew(Ru),re=_f(c),ne=Object(Se.f)().gl.domElement,ce=Object(r.useState)(!1),se=Object(u.a)(ce,2),de=se[0],ue=se[1],fe=Object(r.useState)(null),he=Object(u.a)(fe,2),pe=he[0],ye=he[1],ge=Object(r.useState)(1),we=Object(u.a)(ge,2),xe=we[0],ve=we[1],be=Object(r.useState)(null),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],je=Object(r.useRef)(),He=Object(r.useRef)(),ze=Object(r.useRef)(),Re=Object(r.useRef)(),De=Object(r.useRef)(),We=Object(r.useRef)(),Ie=Object(r.useRef)(!1),Ce=Math.max(100,10*oe),Oe=Object(r.useMemo)((function(){return{lng:N}}),[N]),Fe=p/2,ke=y/2,Ye=m/2,Le=T+Fe,Ee=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===L)return a}}catch(o){l.e(o)}finally{l.f()}}));if(Ee)switch(Ee.type){case V.Foundation:if(h=Le+Ye+Ee.lz,Tw.isZero(z[2]))s=Ee.cx+s*Ee.lx,d=Ee.cy+d*Ee.ly;else{var Ue=new Me.Vector3(s*Ee.lx,d*Ee.ly,0);Ue.applyAxisAngle(Rt,z[2]),s=Ee.cx+Ue.x,d=Ee.cy+Ue.y}}var Ne=new Me.Vector3(-Fe,-ke,Ye),Ve=new Me.Vector3(-Fe,ke,Ye),Je=new Me.Vector3(Fe,-ke,Ye),Ge=new Me.Vector3(Fe,ke,Ye),Xe=Object(r.useMemo)((function(){return le(c)}),[c]);Object(r.useEffect)((function(){if(Xe&&_){var e=ee(Xe.id);e&&Pe(Tw.fetchHeatmapTexture(e,null!==$&&void 0!==$?$:5))}}),[_,$]),Object(r.useEffect)((function(){ve(Math.max(1,Math.round(y/A)))}),[y,A]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),Ie.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var Be=Object(r.useMemo)((function(){return((null===Xe||void 0===Xe?void 0:Xe.label)?Xe.label:me.t("shared.FresnelReflectorElement",Oe))+((null===Xe||void 0===Xe?void 0:Xe.locked)?" ("+me.t("shared.ElementLocked",Oe)+")":"")+((null===Xe||void 0===Xe?void 0:Xe.label)?"":"\n"+me.t("word.Coordinates",Oe)+": ("+s.toFixed(1)+", "+d.toFixed(1)+", "+h.toFixed(1)+") "+me.t("word.MeterAbbreviation",Oe))}),[null===Xe||void 0===Xe?void 0:Xe.label,Y,N,s,d,h]),Ke=Object(r.useMemo)((function(){return new Me.Euler(0,0,z[2],"ZXY")}),[z]),qe=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(ye(t),t===B.Top?ne.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?ne.style.cursor="grab":ne.style.cursor="pointer"))},Qe=function(){ye(null),ne.style.cursor="default"},Ze=Object(r.useMemo)((function(){return jy(new Date(J),Q)}),[J,Q]),_e=null===Ee||void 0===Ee?void 0:Ee.rotation[2],$e=E&&E!==L?le(E):null,et=Object(r.useMemo)((function(){if($e){if($e.type===V.Foundation){var e,t=$e;if(t.solarStructure===G.FocusPipe&&t.solarAbsorberPipe)return new Me.Vector3((t.cx-s)*(_e?Math.cos(_e):1),(t.cy-d)*(_e?Math.sin(_e):0),t.cz-h+t.lz/2+(null!==(e=t.solarAbsorberPipe.absorberHeight)&&void 0!==e?e:10))}}else if(Ee&&Ee.type===V.Foundation){var l,a=Ee;if(a.solarStructure===G.FocusPipe&&a.solarAbsorberPipe)return new Me.Vector3((a.cx-s)*(_e?Math.cos(_e):1),(a.cy-d)*(_e?Math.sin(_e):0),a.cz-h+a.lz/2+(null!==(l=a.solarAbsorberPipe.absorberHeight)&&void 0!==l?l:10))}return null}),[Ee,s,d,h,E,null===$e||void 0===$e?void 0:$e.cx,null===$e||void 0===$e?void 0:$e.cy,null===$e||void 0===$e?void 0:$e.cz]),tt=Object(r.useRef)(new Me.Vector3),lt=Object(r.useMemo)((function(){if(et&&Ze.z>0){var e=_e?new Me.Vector3(Math.sin(_e),Math.cos(_e),0):new Me.Vector3(0,1,0);tt.current.set(et.x,et.y,et.z);var t=Ze.z0&&(e.intersections[0].object===je.current&&(t.contextMenuObjectType=V.FresnelReflector))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===je.current&&(ue(!0),ne.style.cursor="move"))},onPointerOut:function(e){ue(!1),ne.style.cursor="default"},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D}),_&&Te?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",side:Me.FrontSide,map:Te}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("white"),shininess:100*x,side:Me.FrontSide,color:"lightskyblue"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:D})]}),it&&it.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Fresnel Reflector Module Line",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:C,color:W},t)})),Object(gf.jsx)(Jl.a,{name:"Fresnel Reflector Outline 1",userData:{unintersectable:!0},points:[[-Fe,-ke,Ye],[-Fe,ke,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:C,color:W}),Object(gf.jsx)(Jl.a,{name:"Fresnel Reflector Outline 2",userData:{unintersectable:!0},points:[[Fe,-ke,Ye],[Fe,ke,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:C,color:W}),Object(gf.jsx)(Lt.f,{name:"Fresnel Reflector Simulation Plane",uuid:c,args:[p,y],position:[0,0,Ye],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),re&&Y&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-Fe,-ke,Ye],[-Fe,ke,Ye],[Fe,ke,Ye],[Fe,-ke,Ye],[-Fe,-ke,Ye]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),re&&!Y&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:He,position:new Me.Vector3(0,0,0),args:[ct,6,6],name:B.Default,castShadow:!1,receiveShadow:!1,onPointerOver:function(e){qe(e,B.Top)},onPointerOut:function(e){Qe()},onPointerDown:function(e){2!==e.button&&ae(c,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.a,{ref:ze,position:[(Ne.x+Je.x)/2,Ne.y,Ne.z-Ye],args:[nt,nt,1.2*m],name:K.Lower,castShadow:!1,receiveShadow:!1,onPointerDown:function(e){ae(c,e,X.Resize),De.current&&U((function(e){var t=ze.current.localToWorld(new Me.Vector3(0,y,-Ne.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Lower)},onPointerOut:function(e){Qe()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Lower||ie===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Re,position:[(Ve.x+Ge.x)/2,Ve.y,Ve.z-Ye],args:[nt,nt,1.2*m],name:K.Upper,castShadow:!1,receiveShadow:!1,onPointerDown:function(e){ae(c,e,X.Resize),De.current&&U((function(e){var t=Re.current.localToWorld(new Me.Vector3(0,-y,-Ve.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Upper)},onPointerOut:function(e){Qe()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Upper||ie===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:De,position:[Ne.x,(Ne.y+Ve.y)/2,Ne.z],args:[nt,nt,1.2*m],name:K.Left,castShadow:!1,receiveShadow:!1,onPointerDown:function(e){ae(c,e,X.Resize),De.current&&U((function(e){var t=De.current.localToWorld(new Me.Vector3(p,0,-Ne.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Left)},onPointerOut:function(e){Qe()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Left||ie===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:We,position:[Je.x,(Je.y+Ge.y)/2,Je.z],args:[nt,nt,1.2*m],name:K.Right,castShadow:!1,receiveShadow:!1,onPointerDown:function(e){ae(c,e,X.Resize),De.current&&U((function(e){var t=We.current.localToWorld(new Me.Vector3(-p,0,-Je.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){qe(e,K.Right)},onPointerOut:function(e){Qe()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:pe===K.Right||ie===K.Right?pt:ht})})]})]})]}),Le>0&&ot.map((function(e,t){var l=Z.length<100?4:2;return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[S,S,Le+2*(e.z-at)+m,l,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:D})},t)})),j&&Ze.z>0&&Object(gf.jsx)(Jl.a,{rotation:[-Ke.x,0,-Ke.z],userData:{unintersectable:!0},points:et?[tt.current,new Me.Vector3(0,0,Ye),Ze.clone().multiplyScalar(Ce)]:[new Me.Vector3(0,0,Ye),Ze.clone().multiplyScalar(Ce)],name:"Sun Beam",lineWidth:.25,color:"white",castShadow:!1,receiveShadow:!1}),(de||F)&&!re&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:Be,color:null!==(t=null===Xe||void 0===Xe?void 0:Xe.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===Xe||void 0===Xe?void 0:Xe.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===Xe||void 0===Xe?void 0:Xe.labelSize)&&void 0!==a?a:.2,castShadow:!1,receiveShadow:!1,position:[0,0,null!==(n=null===Xe||void 0===Xe?void 0:Xe.labelHeight)&&void 0!==n?n:Math.max(ke*Math.abs(Math.sin(Xe.tiltAngle))+.1,.2)]})]})},sv=n.a.memo(cv),dv=function(e){var t,l,a,n,c=e.id,s=e.cx,d=e.cy,h=e.cz,p=e.lx,y=e.ly,g=e.lz,m=void 0===g?.1:g,w=e.reflectance,x=void 0===w?.9:w,v=e.tiltAngle,b=e.relativeAzimuth,A=e.poleHeight,T=e.poleRadius,P=void 0===T?Math.min(p,y)/20:T,S=e.drawSunBeam,j=e.rotation,H=void 0===j?[0,0,0]:j,z=e.color,R=void 0===z?"white":z,D=(e.lineColor,e.lineWidth,e.showLabel),M=void 0!==D&&D,W=e.locked,I=void 0!==W&&W,C=e.parentId,O=e.towerId,F=Ew(si),k=Ew(Vi),Y=Ew(i.date),L=Ew(i.latitude),E=Ew(Fi),U=Tf(Ns),N=Ew(o.solarRadiationHeatmapMaxValue),J=Pf(wi),K=Ew(o.shadowEnabled),q=Ew(Zr),Q=Ew(is),Z=Ew(Kr),_=_f(c),$=Object(Se.f)().gl.domElement,ee=Object(r.useState)(!1),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useState)(null),ie=Object(u.a)(oe,2),re=ie[0],ne=ie[1],ce=Object(r.useRef)(),se=Object(r.useRef)(),de=Object(r.useRef)(!1),ue=Math.max(100,10*Z),fe=Object(r.useMemo)((function(){return{lng:k}}),[k]),he=p/2,pe=y/2,ye=m/2,ge=A+Math.max(he,pe),we=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===C)return a}}catch(o){l.e(o)}finally{l.f()}}));if(we)switch(we.type){case V.Foundation:if(h=ge+ye+we.lz,Tw.isZero(H[2]))s=we.cx+s*we.lx,d=we.cy+d*we.ly;else{var xe=new Me.Vector3(s*we.lx,d*we.ly,0);xe.applyAxisAngle(Rt,H[2]),s=we.cx+xe.x,d=we.cy+xe.y}}var ve=Object(r.useMemo)((function(){return q(c)}),[c]);Object(r.useEffect)((function(){if(ve&&U){var e=J(ve.id);e&&ne(Tw.fetchHeatmapTexture(e,null!==N&&void 0!==N?N:5))}}),[U,N]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),de.current=!1};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]);var be=Object(r.useMemo)((function(){return((null===ve||void 0===ve?void 0:ve.label)?ve.label:me.t("shared.HeliostatElement",fe))+((null===ve||void 0===ve?void 0:ve.locked)?" ("+me.t("shared.ElementLocked",fe)+")":"")+((null===ve||void 0===ve?void 0:ve.label)?"":"\n"+me.t("word.Coordinates",fe)+": ("+s.toFixed(1)+", "+d.toFixed(1)+", "+h.toFixed(1)+") "+me.t("word.MeterAbbreviation",fe))}),[null===ve||void 0===ve?void 0:ve.label,I,k,s,d,h]),Ae=Object(r.useMemo)((function(){return new Me.Euler(0,0,H[2],"ZXY")}),[H]),Te=Object(r.useMemo)((function(){return jy(new Date(Y),L)}),[Y,L]),Pe=null===we||void 0===we?void 0:we.rotation[2],je=O&&O!==C?q(O):null,He=Object(r.useMemo)((function(){if(je){if(je.type===V.Foundation){var e,t=je;if(t.solarStructure===G.FocusTower&&t.solarPowerTower)return new Me.Vector3(t.cx-s,t.cy-d,t.cz-h+t.lz/2+(null!==(e=t.solarPowerTower.towerHeight)&&void 0!==e?e:20))}}else if(we&&we.type===V.Foundation){var l,a=we;if(a.solarStructure===G.FocusTower&&a.solarPowerTower)return new Me.Vector3(a.cx-s,a.cy-d,a.cz-h+a.lz/2+(null!==(l=a.solarPowerTower.towerHeight)&&void 0!==l?l:20))}return null}),[we,s,d,h,O,null===je||void 0===je?void 0:je.cx,null===je||void 0===je?void 0:je.cy,null===je||void 0===je?void 0:je.cz]),ze=Object(r.useMemo)((function(){if(He&&Te.z>0){var e=He.clone().normalize().add(Te).normalize();Tw.isSame(e,Rt)&&(e=new Me.Vector3(-.001,0,1).normalize()),Pe&&e.applyAxisAngle(Rt,-Pe);var t=Math.hypot(e.x,e.y);return new Me.Euler(Math.atan2(t,e.z),0,Math.atan2(e.y,e.x)+vt,"ZXY")}return new Me.Euler(v,0,b,"ZXY")}),[He,Te,v,b,Pe,null===je||void 0===je?void 0:je.cx,null===je||void 0===je?void 0:je.cy,null===je||void 0===je?void 0:je.cz]),Re=-(ge+m)/2,De=Math.max(1,(p+y)/8),We=st*De*4;return Object(gf.jsxs)("group",{name:"Heliostat Group "+c,rotation:Ae,position:[s,d,h+ye],children:[Object(gf.jsxs)("group",{rotation:ze,children:[Object(gf.jsxs)(Lt.a,{receiveShadow:K,castShadow:K,uuid:c,ref:ce,args:[p,y,m],name:"Heliostat",onPointerDown:function(e){2!==e.button&&Q(c,e,X.Select)},onContextMenu:function(e){Q(c,e,X.ContextMenu),F((function(t){e.intersections.length>0&&(e.intersections[0].object===ce.current&&(t.contextMenuObjectType=V.Heliostat))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===ce.current&&(ae(!0),$.style.cursor="move"))},onPointerOut:function(e){ae(!1),$.style.cursor="default"},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R}),U&&re?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",side:Me.FrontSide,map:re}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("white"),shininess:100*x,side:Me.FrontSide,color:"lightskyblue"}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:R})]}),Object(gf.jsx)(Lt.f,{name:"Heliostat Simulation Plane",uuid:c,args:[p,y],position:[0,0,ye],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),_&&I&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-he,-pe,ye],[-he,pe,ye],[he,pe,ye],[he,-pe,ye],[-he,-pe,ye]],castShadow:!1,receiveShadow:!1,lineWidth:1,color:yt}),_&&!I&&Object(gf.jsx)(Lt.h,{ref:se,position:new Me.Vector3(0,0,0),args:[We,6,6],name:B.Default,castShadow:!1,receiveShadow:!1,onPointerOver:function(e){!function(e,t){e.intersections.length>0&&e.intersections[0].object===e.eventObject&&($.style.cursor=t===B.Default?"move":"pointer")}(e,B.Default)},onPointerOut:function(e){$.style.cursor="default"},onPointerDown:function(e){2!==e.button&&Q(c,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})})]}),ge>0&&Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole",castShadow:!1,receiveShadow:!1,args:[P,P,ge+m,E.length<100?4:2,1],position:new Me.Vector3(0,0,Re),rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:R})}),S&&Te.z>0&&Object(gf.jsx)(Jl.a,{rotation:[-Ae.x,0,-Ae.z],userData:{unintersectable:!0},points:He?[He,new Me.Vector3(0,0,ye),Te.clone().multiplyScalar(ue)]:[new Me.Vector3(0,0,ye),Te.clone().multiplyScalar(ue)],name:"Sun Beam",lineWidth:.25,color:"white",castShadow:!1,receiveShadow:!1}),(le||M)&&!_&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:be,color:null!==(t=null===ve||void 0===ve?void 0:ve.labelColor)&&void 0!==t?t:"white",fontSize:null!==(l=null===ve||void 0===ve?void 0:ve.labelFontSize)&&void 0!==l?l:20,textHeight:null!==(a=null===ve||void 0===ve?void 0:ve.labelSize)&&void 0!==a?a:.2,castShadow:!1,receiveShadow:!1,position:[0,0,null!==(n=null===ve||void 0===ve?void 0:ve.labelHeight)&&void 0!==n?n:Math.max(pe*Math.abs(Math.sin(ve.tiltAngle))+.1,.2)]})]})},uv=n.a.memo(dv),fv=function(e){var t,l,a,n,c,s,d=e.id,h=e.pvModelName,p=void 0===h?"SPR-X21-335-BLK":h,y=e.cx,g=e.cy,m=e.cz,w=e.lx,x=e.ly,v=e.lz,b=e.tiltAngle,A=e.relativeAzimuth,T=e.trackerType,P=void 0===T?te.NO_TRACKER:T,S=e.poleHeight,j=e.poleRadius,H=e.poleSpacing,z=e.drawSunBeam,R=e.rotation,D=void 0===R?[0,0,0]:R,M=e.normal,W=void 0===M?[0,0,1]:M,I=e.color,C=void 0===I?"white":I,O=(e.lineColor,e.lineWidth,e.showLabel),F=void 0!==O&&O,k=e.locked,Y=void 0!==k&&k,L=e.parentId,E=e.orientation,U=void 0===E?$.landscape:E,N=Ew(si),J=Ew(Vi),G=Ew(i.date),Q=Ew(i.latitude),Z=Ew(Fi),_=Tf(Ns),ee=Ew(o.shadowEnabled),le=Ew(o.solarPanelShininess),ae=Ew(Zr),oe=Ew(is),ie=Ew(lc),re=Ew(Kr),ne=Ew(Ru),ce=Ew(Mu),se=Ew(Sr),de=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,ue=Ew(Yi),fe=_f(d),he=Object(Se.f)(),pe=he.gl.domElement,ye=he.camera,ge=Object(r.useState)(!1),we=Object(u.a)(ge,2),xe=we[0],ve=we[1],be=Object(r.useState)(null),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1],je=Object(r.useState)(),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De=Object(r.useRef)(),We=Object(r.useRef)(),Ie=Object(r.useRef)(),Ce=Object(r.useRef)(),Oe=Object(r.useRef)(),Fe=Object(r.useRef)(),ke=Object(r.useRef)(),Ye=Object(r.useRef)(!1),Le=Object(r.useRef)(0),Ee=Object(r.useRef)(0),Ue=Object(r.useRef)(),Ne=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Ve=Math.max(100,10*re),Je=(new Me.Vector3).fromArray(W),Ge=ue[p],Xe=Object(r.useMemo)((function(){return{lng:J}}),[J]),Be=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===L)return a}}catch(o){l.e(o)}finally{l.f()}}));if(L&&Be)switch(Be.type){case V.Foundation:if(m=S+v/2+Be.lz,Tw.isZero(D[2]))y=Be.cx+y*Be.lx,g=Be.cy+g*Be.ly;else{var Ke=new Me.Vector3(y*Be.lx,g*Be.ly,0);Ke.applyAxisAngle(Rt,D[2]),y=Be.cx+Ke.x,g=Be.cy+Ke.y}break;case V.Cuboid:var qe=Tw.getWorldDataById(Be.id),Qe=qe.pos;qe.rot;if(Tw.isZero(D[2]))y=Qe.x+y*Be.lx,g=Qe.y+g*Be.ly;else{var Ze=new Me.Vector3(y*Be.lx,g*Be.ly,m*Be.lz);Ze.applyAxisAngle(Rt,D[2]),y=Qe.x+Ze.x,g=Qe.y+Ze.y}m=Tw.isSame(Je,Rt)?S+v/2+Be.lz:Qe.z+m*Be.lz}Ge&&(v=Math.max(Ge.thickness,.02));var _e=w/2,$e=x/2,et=v/2,lt=new Me.Vector3(-_e,-$e,et),it=new Me.Vector3(-_e,$e,et),rt=new Me.Vector3(_e,-$e,et),nt=new Me.Vector3(_e,$e,et),ct=Z.length<100?4:2,ut=ae(d);Object(r.useEffect)((function(){if(Ge){var e,t;U===$.portrait?(e=Math.max(1,Math.round(w/Ge.width)),t=Math.max(1,Math.round(x/Ge.length))):(e=Math.max(1,Math.round(w/Ge.length)),t=Math.max(1,Math.round(x/Ge.width))),Ue.current=[];for(var l=w/e,a=x/t,o=0;o<=e;o++)Ue.current.push({points:[new Me.Vector3(o*l-_e,-$e,v),new Me.Vector3(o*l-_e,$e,v)]});for(var i=0;i<=t;i++)Ue.current.push({points:[new Me.Vector3(-_e,i*a-$e,v),new Me.Vector3(_e,i*a-$e,v)]})}}),[U,p,w,x,v]),Object(r.useEffect)((function(){var e=function(){Et.getState().setEnableOrbitController(!0),Ye.current=!1,Jt(!1)};return window.addEventListener("pointerup",e),function(){window.removeEventListener("pointerup",e)}}),[]),Object(r.useEffect)((function(){Re(Tw.isSame(Je,Rt))}),[W]);var ft=Object(r.useMemo)((function(){return((null===ut||void 0===ut?void 0:ut.label)?ut.label:me.t("shared.SolarPanelElement",Xe))+((null===ut||void 0===ut?void 0:ut.locked)?" ("+me.t("shared.ElementLocked",Xe)+")":"")+((null===ut||void 0===ut?void 0:ut.label)?"":"\n"+me.t("word.Coordinates",Xe)+": ("+y.toFixed(1)+", "+g.toFixed(1)+", "+m.toFixed(1)+") "+me.t("word.MeterAbbreviation",Xe))}),[null===ut||void 0===ut?void 0:ut.label,Y,J,y,g,m]),gt=Object(r.useMemo)((function(){return Tw.isSame(Je,St)?new Me.Euler(vt,0,D[2]+vt,"ZXY"):Tw.isSame(Je,jt)?new Me.Euler(vt,0,D[2]-vt,"ZXY"):Tw.isSame(Je,Ht)?new Me.Euler(vt,0,D[2]+Math.PI,"ZXY"):Tw.isSame(Je,zt)?new Me.Euler(vt,0,D[2],"ZXY"):new Me.Euler(0,0,D[2],"ZXY")}),[W,D]),mt=function(e,t){e.intersections.length>0&&(e.intersections[0].object===e.eventObject&&(Pe(t),t===B.Top?pe.style.cursor="move":t===q.Lower||t===q.Upper||t===q.Tilt?pe.style.cursor="grab":pe.style.cursor="pointer"))},wt=function(){Pe(null),pe.style.cursor="default"},xt=Object(r.useMemo)((function(){return jy(new Date(G),Q)}),[G,Q]),bt=null===(l=ae(L))||void 0===l?void 0:l.rotation[2],Tt=bt?xt.clone().applyAxisAngle(Rt,-bt):xt,Pt=Object(r.useMemo)((function(){if(Tw.isSame(Je,Rt)){if(xt.z>0)switch(P){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var e=Math.hypot(Tt.x,Tt.y);return new Me.Euler(Math.atan2(e,Tt.z),0,Math.atan2(Tt.y,Tt.x)+vt,"ZXY");case te.HORIZONTAL_SINGLE_AXIS_TRACKER:return new Me.Euler(0,Math.atan2(Tt.x,Tt.z),w0&&(e.intersections[0].object===De.current&&(t.contextMenuObjectType=V.SolarPanel))}))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===De.current&&(ve(!0),pe.style.cursor="move"))},onPointerOut:function(e){ve(!1),pe.style.cursor="default"},children:[Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}),_&&Xt?Object(gf.jsx)("meshBasicMaterial",{attachArray:"material",map:Xt}):Gt?de||0===le?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",map:Gt,color:C}):Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===Ge||void 0===Ge?void 0:Ge.color)?at:ot),shininess:null!==le&&void 0!==le?le:tt,side:Me.FrontSide,map:Gt,color:C}):null,0===(null===Ge||void 0===Ge?void 0:Ge.bifacialityFactor)||de||0===S&&0===b?Object(gf.jsx)("meshStandardMaterial",{attachArray:"material",color:C}):Gt?Object(gf.jsx)("meshPhongMaterial",{attachArray:"material",specular:new Me.Color("Blue"===(null===Ge||void 0===Ge?void 0:Ge.color)?at:ot),shininess:null!==le&&void 0!==le?le:tt,side:Me.FrontSide,map:Gt,color:C}):null]}),_&&Xt&&Ue.current&&Ue.current.map((function(e,t){return Object(gf.jsx)(Jl.a,{name:"Solar Panel Lines",userData:{unintersectable:!0},points:e.points,castShadow:!1,receiveShadow:!1,lineWidth:.2,color:"black"},t)})),Object(gf.jsx)(Lt.f,{name:"Solar Panel Simulation Plane",uuid:d,args:[w,x],userData:{simulation:!0},receiveShadow:!1,castShadow:!1,visible:!1,children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide})}),fe&&Y&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-_e,-$e,0],[-_e,$e,0],[_e,$e,0],[_e,-$e,0],[-_e,-$e,0]],castShadow:!1,receiveShadow:!1,lineWidth:2,color:yt}),fe&&!Y&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.h,{ref:We,position:new Me.Vector3(0,0,0),args:[Ot,6,6],name:B.Default,onPointerOver:function(e){mt(e,B.Top)},onPointerOut:function(e){wt()},onPointerDown:function(e){oe(d,e,X.Move)},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"orange"})}),Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.a,{ref:Ie,position:[(lt.x+rt.x)/2,lt.y,lt.z],args:[Ct,Ct,1.2*v],name:K.Lower,onPointerDown:function(e){oe(d,e,X.Resize),Oe.current&&N((function(e){var t=Ie.current.localToWorld(new Me.Vector3(0,x,-lt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Lower)},onPointerOut:function(e){wt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Lower||ne===K.Lower?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Ce,position:[(it.x+nt.x)/2,it.y,it.z],args:[Ct,Ct,1.2*v],name:K.Upper,onPointerDown:function(e){oe(d,e,X.Resize),Oe.current&&N((function(e){var t=Ce.current.localToWorld(new Me.Vector3(0,-x,-it.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Upper)},onPointerOut:function(e){wt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Upper||ne===K.Upper?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Oe,position:[lt.x,(lt.y+it.y)/2,lt.z],args:[Ct,Ct,1.2*v],name:K.Left,onPointerDown:function(e){oe(d,e,X.Resize),Oe.current&&N((function(e){var t=Oe.current.localToWorld(new Me.Vector3(w,0,-lt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Left)},onPointerOut:function(e){wt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Left||ne===K.Left?pt:ht})}),Object(gf.jsx)(Lt.a,{ref:Fe,position:[rt.x,(rt.y+nt.y)/2,rt.z],args:[Ct,Ct,1.2*v],name:K.Right,onPointerDown:function(e){oe(d,e,X.Resize),Oe.current&&N((function(e){var t=Fe.current.localToWorld(new Me.Vector3(-w,0,-rt.z));e.resizeAnchor.copy(t)}))},onPointerOver:function(e){mt(e,K.Right)},onPointerOut:function(e){wt()},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:Te===K.Right||ne===K.Right?pt:ht})})]})]})]}),fe&&!Y&&P===te.NO_TRACKER&&ze&&Object(gf.jsxs)("group",{position:[0,0,-S],rotation:[0,0,Pt.z],children:[Object(gf.jsx)(oy,{id:d,position:[0,-$e-Ft/2,S],color:Te===q.Upper||ce===q.Upper?pt:ht,ratio:Ft,handleType:q.Upper,hoverHandle:mt,noHoverHandle:wt}),Object(gf.jsx)(oy,{id:d,position:[0,$e+Ft/2,S],color:Te===q.Lower||ce===q.Lower?pt:ht,ratio:Ft,handleType:q.Lower,hoverHandle:mt,noHoverHandle:wt})]}),fe&&!Y&&P===te.NO_TRACKER&&ze&&Math.abs(S)>.1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{name:q.Tilt,args:[kt,1.1*kt,18,2,-vt,Math.PI],rotation:[0,-vt,Pt.z,"ZXY"],onPointerOver:function(e){mt(e,q.Tilt)},onPointerOut:function(e){wt()},onPointerDown:function(e){if(Jt(!0),Te){Et.getState().setEnableOrbitController(!1),Ye.current=!0;var t=ae(d);Le.current=t.tiltAngle}N((function(e){e.rotateHandleType=q.Tilt}))},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",side:Me.DoubleSide,color:Te===q.Tilt||Vt?pt:ht})}),Vt&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Lt.g,{ref:ke,name:"Solar panel tilt handle",args:[kt,2*kt,18,2,-vt,Math.PI],rotation:[0,-vt,Pt.z,"ZXY"],onPointerDown:function(e){},onPointerUp:function(e){if(Math.abs(Ee.current-Le.current)>At){var t={name:"Set Solar Panel Tilt Angle",timestamp:Date.now(),oldValue:Le.current,newValue:Ee.current,changedElementId:d,changedElementType:V.SolarPanel,undo:function(){ie(t.changedElementId,t.oldValue)},redo:function(){ie(t.changedElementId,t.newValue)}};se(t)}},onPointerMove:function(e){if(Ye.current){var t=new Me.Vector2;if(t.x=e.offsetX/pe.clientWidth*2-1,t.y=-e.offsetY/pe.clientHeight*2+1,Ne.setFromCamera(t,ye),ke.current){var l=Ne.intersectObjects([ke.current]);if(l.length>0){var a=l[0].point,o=ke.current.parent;if(o){var i=o.position,r=(new Me.Vector3).subVectors(a,i),n=r.angleTo(Rt);if(!(.5*ut.ly*Math.abs(Math.sin(n))>ut.poleHeight)){var c=A+D[2],s=c%Math.PI===0?Math.sign(-r.y)*Math.sign(Math.cos(c)):Math.sign(r.x)*Math.sign(Math.sin(c));ie(d,n*=s),Ee.current=n}}}}}},children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",depthTest:!1,transparent:!0,opacity:.5,side:Me.DoubleSide})}),Object(gf.jsx)(Jl.a,{points:[[0,0,kt],[0,0,1.75*kt]],rotation:new Me.Euler(b,0,Pt.z,"ZXY"),lineWidth:1}),Yt.map((function(e,t){return Object(gf.jsxs)("group",{rotation:new Me.Euler(Math.PI/12*t-vt,0,Pt.z,"ZXY"),children:[Object(gf.jsx)(Jl.a,{points:[[0,0,1.8*kt],[0,0,2*kt]],color:"white",transparent:!0,opacity:.5}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(15*t-90,"\xb0"),fontSize:20*kt,fontFace:"Times Roman",textHeight:.15*kt,position:[0,0,1.6*kt]})]},t)})),Object(gf.jsx)("group",{rotation:new Me.Euler(b,0,Pt.z,"ZXY"),children:Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},text:"".concat(Math.floor(b/Math.PI*180),"\xb0"),fontSize:20*kt,fontFace:"Times Roman",textHeight:.2*kt,position:[0,0,.75*kt]})})]})]}),S>0&&ze&&Wt.map((function(e,t){return Object(gf.jsx)(Lt.d,{userData:{unintersectable:!0},name:"Pole "+t,castShadow:!1,receiveShadow:!1,args:[j,j,S+2*(e.z-Mt)+v,ct,1],position:e,rotation:[vt,0,0],children:Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:C})},t)})),z&&xt.z>0&&Object(gf.jsxs)("group",{rotation:[-gt.x,0,-gt.z],children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[Dt.clone().multiplyScalar(.75),[0,0,0],xt.clone().multiplyScalar(Ve)],name:"Sun Beam",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[xt.clone().multiplyScalar(.5),Dt.clone().multiplyScalar(.5)],name:"Angle",lineWidth:.5,color:"white"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Angle Value",text:Tw.toDegrees(xt.angleTo(Dt)).toFixed(1)+"\xb0",fontSize:20,fontFace:"Times Roman",textHeight:.1,position:xt.clone().multiplyScalar(.75).add(Dt.clone().multiplyScalar(.75)).multiplyScalar(.5)}),Object(gf.jsx)("group",{position:Dt.clone().multiplyScalar(.75),rotation:[vt+gt.x+Pt.x,0,gt.z+Pt.z,w0?eI:e>=W&&e<=I}),[D,W,I,M]),re=Object(r.useRef)(!1),ne=Ew(Tr);ne!==re.current&&(re.current=ne,(null===Z||void 0===Z?void 0:Z.current)&&_.current&&Z.current.add(_.current)),Object(r.useEffect)((function(){if(p!==xt){var e=ge();e&&_.current&&e.add(_.current)}}),[ne]),Object(r.useEffect)((function(){var e=ge();e&&_.current&&e.add(_.current)}),[Z]);var ce=Object(r.useMemo)((function(){return(new Me.TextureLoader).load(Nl.fetchTextureImage(v,oe),(function(e){A&&(e.wrapS=Me.RepeatWrapping,e.repeat.x=-1),fe(e),K(!G)}))}),[v,oe,A]),se=Object(r.useState)(ce),de=Object(u.a)(se,2),ue=de[0],fe=de[1],he=Object(r.useMemo)((function(){return Nl.fetchLabel(v,ae)+(P?" ("+me.t("shared.ElementLocked",ae)+")":"")+"\n"+me.t("word.Coordinates",ae)+": ("+g.toFixed(1)+", "+m.toFixed(1)+") "+me.t("word.MeterAbbreviation",ae)}),[v,g,m,P,z]),pe=Object(r.useCallback)((function(e,t){Tf.getState().duringCameraInteraction||e.intersections.length>0&&(e.intersections[0].object===e.eventObject||e.intersections.length>1&&e.intersections[1].object===e.eventObject)&&(H((function(e){e.hoveredHandle=t,e.selectedElementHeight=le.lz})),Tw.isMoveHandle(t)?q.domElement.style.cursor="move":q.domElement.style.cursor="pointer")}),[]),ye=Object(r.useCallback)((function(){H((function(e){e.hoveredHandle=null})),q.domElement.style.cursor=Ew.getState().addedCuboidId?"crosshair":"default"}),[]),ge=function(){return p!==xt&&(null===Z||void 0===Z?void 0:Z.current)?Tw.getObjectChildById(Z.current,p):null},we=Object(r.useMemo)((function(){return Nl.fetchSpread(v)}),[v]),xe=Object(r.useMemo)((function(){return Nl.fetchHeight(v)}),[v]);Object(Se.d)((function(e){var t=e.camera;if(_.current){var l=Tw.getWorldDataById(p).rot;if(R)$.current&&te.current&&($.current.rotation.set(vt,0,0),te.current.rotation.set(0,0,0)),_.current.rotation.set(-vt,0,0);else{if($.current&&te.current){var a=t.position,o=a.x,i=a.y,r=_.current.position,n=r.x,c=r.y;if(ge()){var s=_.current.localToWorld(new Me.Vector3),d=Math.atan2(o-s.x,i-s.y)+l;$.current.rotation.set(vt,-d,0),te.current.rotation.set(-vt,d,0)}else{var u=Math.atan2(o-n,i-c);$.current.rotation.set(vt,-u,0),te.current.rotation.set(-vt,u,0)}}_.current.rotation.set(0,0,0)}}}));return Object(gf.jsx)(gf.Fragment,{children:S?Object(gf.jsx)("group",{ref:_,name:"Flower Group "+y,userData:{aabb:!0},position:[g,m,(null!==w&&void 0!==w?w:0)+(R?.25:0)],children:Object(gf.jsxs)("group",{position:[0,0,xe/2],children:[Object(gf.jsx)(rx.a,{ref:$,uuid:y,name:v,follow:!1,rotation:[vt,0,0],children:Object(gf.jsx)(Lt.f,{args:[we,xe],receiveShadow:!0,children:Object(gf.jsx)("meshToonMaterial",{map:ue,side:Me.DoubleSide,alphaTest:.5})})}),Object(gf.jsx)(rx.a,{ref:te,name:"Interaction Billboard",visible:!1,position:[0,0,-xe/2],children:Object(gf.jsx)(Lt.f,{ref:ee,renderOrder:3,name:v+" plane",args:[we/2,2*xe],rotation:[R?vt:0,0,0],onContextMenu:function(e){C(y,e,X.ContextMenu),H((function(t){e.intersections.length>0&&(e.intersections[0].object===ee.current&&(t.contextMenuObjectType=V.Flower))}))},onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(C(y,e,X.Move),Et.setState((function(e){e.flowerRef=_})))},onPointerOver:function(e){e.intersections.length>0&&(e.intersections[0].object===ee.current&&U(!0))},onPointerOut:function(e){U(!1)}})}),Q&&P&&Object(gf.jsx)(Jl.a,{name:"Selection highlight lines",userData:{unintersectable:!0},points:[[-we/2,-xe/2,0],[-we/2,xe/2,0],[-we/2,xe/2,0],[we/2,xe/2,0],[we/2,-xe/2,0],[we/2,xe/2,0],[we/2,-xe/2,0],[-we/2,-xe/2,0]],castShadow:!1,receiveShadow:!1,lineWidth:.5,rotation:null===(n=$.current)||void 0===n?void 0:n.rotation,color:yt}),Q&&!P&&Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Lt.h,{position:new Me.Vector3(0,0,-xe/2),args:[.30000000000000004,6,6,0,Math.PI],name:B.Default,renderOrder:2,onPointerDown:function(e){2!==e.button&&e.eventObject===e.intersections[0].eventObject&&(C(y,e,X.Move),Et.setState((function(e){e.flowerRef=_})))},onPointerEnter:function(e){pe(e,B.Default)},onPointerLeave:ye,children:Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:k===B.Default||F===B.Default?pt:ut})})}),E&&!Q&&Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Label",fontFace:"Roboto",text:he,color:null!==(c=null===le||void 0===le?void 0:le.labelColor)&&void 0!==c?c:"white",fontSize:null!==(s=null===le||void 0===le?void 0:le.labelFontSize)&&void 0!==s?s:20,textHeight:null!==(d=null===le||void 0===le?void 0:le.labelSize)&&void 0!==d?d:.2,position:[0,0,xe/2+(null!==(h=null===le||void 0===le?void 0:le.labelHeight)&&void 0!==h?h:.4)]})]})}):null})},yv=n.a.memo(pv),gv=l(21),mv=l(22),wv=l(843),xv=l(94),vv=mv.a.div(Zx||(Zx=Object(gv.a)(["\n position: absolute;\n left: calc(100vw / 2 - 50px);\n width: 100px;\n bottom: 6px;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 10000; // must be larger than that of the spinner so that this can be clicked\n"]))),bv=function(){var e=Ew(si),t=Ew(Gi),l=Ew(Vi),a=Tf(ws),i=Ew(o.showDesignInfoPanel),r={lng:l};return Object(gf.jsx)(vv,{style:{bottom:i?"42px":"6px"},children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.runDailyThermalSimulation=!1,e.runYearlyThermalSimulation=!1,e.pauseDailyThermalSimulation=!1,e.pauseYearlyThermalSimulation=!1,e.runStaticSimulation=!1,e.runDynamicSimulation=!1,e.pauseSimulation=!1,e.runDailyLightSensor=!1,e.runYearlyLightSensor=!1,e.pauseDailyLightSensor=!1,e.pauseYearlyLightSensor=!1,e.runDailySimulationForSolarPanels=!1,e.runYearlySimulationForSolarPanels=!1,e.pauseDailySimulationForSolarPanels=!1,e.pauseYearlySimulationForSolarPanels=!1,e.runDailySimulationForParabolicTroughs=!1,e.runYearlySimulationForParabolicTroughs=!1,e.pauseDailySimulationForParabolicTroughs=!1,e.pauseYearlySimulationForParabolicTroughs=!1,e.runDailySimulationForParabolicDishes=!1,e.runYearlySimulationForParabolicDishes=!1,e.pauseDailySimulationForParabolicDishes=!1,e.pauseYearlySimulationForParabolicDishes=!1,e.runDailySimulationForFresnelReflectors=!1,e.runYearlySimulationForFresnelReflectors=!1,e.pauseDailySimulationForFresnelReflectors=!1,e.pauseYearlySimulationForFresnelReflectors=!1,e.runDailySimulationForHeliostats=!1,e.runYearlySimulationForHeliostats=!1,e.pauseDailySimulationForHeliostats=!1,e.pauseYearlySimulationForHeliostats=!1})),e((function(e){t&&(e.actionInfo={name:"Cancel Simulation",timestamp:(new Date).getTime()})}))},title:me.t("message.CancelSimulation",r),children:me.t("word.Cancel",r)}),!a&&Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.runDailyThermalSimulation&&(e.pauseDailyThermalSimulation=!0),e.runYearlyThermalSimulation&&(e.pauseYearlyThermalSimulation=!0),e.runDynamicSimulation&&(e.pauseSimulation=!0),e.runDailyLightSensor&&(e.pauseDailyLightSensor=!0),e.runYearlyLightSensor&&(e.pauseYearlyLightSensor=!0),e.runDailySimulationForSolarPanels&&(e.pauseDailySimulationForSolarPanels=!0),e.runYearlySimulationForSolarPanels&&(e.pauseYearlySimulationForSolarPanels=!0),e.runDailySimulationForParabolicTroughs&&(e.pauseDailySimulationForParabolicTroughs=!0),e.runYearlySimulationForParabolicTroughs&&(e.pauseYearlySimulationForParabolicTroughs=!0),e.runDailySimulationForParabolicDishes&&(e.pauseDailySimulationForParabolicDishes=!0),e.runYearlySimulationForParabolicDishes&&(e.pauseYearlySimulationForParabolicDishes=!0),e.runDailySimulationForFresnelReflectors&&(e.pauseDailySimulationForFresnelReflectors=!0),e.runYearlySimulationForFresnelReflectors&&(e.pauseYearlySimulationForFresnelReflectors=!0),e.runDailySimulationForHeliostats&&(e.pauseDailySimulationForHeliostats=!0),e.runYearlySimulationForHeliostats&&(e.pauseYearlySimulationForHeliostats=!0)})),e((function(e){t&&(e.actionInfo={name:"Pause Simulation",timestamp:(new Date).getTime()})}))},title:me.t("message.PauseSimulation",r),children:me.t("word.Pause",r)}),a&&Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.runDailyThermalSimulation&&(e.pauseDailyThermalSimulation=!1),e.runYearlyThermalSimulation&&(e.pauseYearlyThermalSimulation=!1),e.runDynamicSimulation&&(e.pauseSimulation=!1),e.runDailyLightSensor&&(e.pauseDailyLightSensor=!1),e.runYearlyLightSensor&&(e.pauseYearlyLightSensor=!1),e.runDailySimulationForSolarPanels&&(e.pauseDailySimulationForSolarPanels=!1),e.runYearlySimulationForSolarPanels&&(e.pauseYearlySimulationForSolarPanels=!1),e.runDailySimulationForParabolicTroughs&&(e.pauseDailySimulationForParabolicTroughs=!1),e.runYearlySimulationForParabolicTroughs&&(e.pauseYearlySimulationForParabolicTroughs=!1),e.runDailySimulationForParabolicDishes&&(e.pauseDailySimulationForParabolicDishes=!1),e.runYearlySimulationForParabolicDishes&&(e.pauseYearlySimulationForParabolicDishes=!1),e.runDailySimulationForFresnelReflectors&&(e.pauseDailySimulationForFresnelReflectors=!1),e.runYearlySimulationForFresnelReflectors&&(e.pauseYearlySimulationForFresnelReflectors=!1),e.runDailySimulationForHeliostats&&(e.pauseDailySimulationForHeliostats=!1),e.runYearlySimulationForHeliostats&&(e.pauseYearlySimulationForHeliostats=!1)})),e((function(e){t&&(e.actionInfo={name:"Resume Simulation",timestamp:(new Date).getTime()})}))},title:me.t("message.ResumeSimulation",r),children:me.t("word.Resume",r)})]})})},Av=n.a.memo(bv),Tv=mv.a.div(_x||(_x=Object(gv.a)(["\n position: absolute;\n left: calc(100vw / 2 - 50px);\n width: 100px;\n bottom: 6px;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 10000; // must be larger than that of the spinner so that this can be clicked\n"]))),Pv=function(){var e=Ew(si),t=Ew(Gi),l=Ew(Vi),a=Tf(vs),i=Ew(o.showDesignInfoPanel),r={lng:l};return Object(gf.jsx)(Tv,{style:{bottom:i?"42px":"6px"},children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.runStaticSimulation=!1,e.pauseSimulation=!1,e.runEvolution=!1,e.pauseEvolution=!1})),t&&e((function(e){e.actionInfo={name:"Cancel Evolution",timestamp:(new Date).getTime()}}))},title:me.t("message.CancelEvolution",r),children:me.t("word.Cancel",r)}),!a&&Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.pauseSimulation=!0,e.runEvolution&&(e.pauseEvolution=!0)})),t&&e((function(e){e.actionInfo={name:"Pause Evolution",timestamp:(new Date).getTime()}}))},title:me.t("message.PauseEvolution",r),children:me.t("word.Pause",r)}),a&&Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){e.pauseSimulation=!1,e.runEvolution&&(e.pauseEvolution=!1)})),t&&e((function(e){e.actionInfo={name:"Resume Evolution",timestamp:(new Date).getTime()}}))},title:me.t("message.ResumeEvolution",r),children:me.t("word.Resume",r)})]})})},Sv=n.a.memo(Pv),jv=l(274),Hv=Object(mv.a)(jv.a)($x||($x=Object(gv.a)(["\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.5);\n z-index: 9999;\n"]))),zv=n.a.memo((function(e){var t=e.initializing,l=Tf(gs),a=Tf(ms),o=Tf(xs),r=Tf(ws),n=Tf(vs),c=Ew(i.noAnimationForSensorDataCollection),s=Ew(i.noAnimationForSolarPanelSimulation),d=Ew(i.noAnimationForHeatmapSimulation),u=Ew(i.noAnimationForSolarUpdraftTowerSimulation),f=Ew(i.noAnimationForThermalSimulation),h=Tf(Xs),p=Tf(Ks),y=Tf(mu),g=Tf(xu),m=Tf(Gd),w=Tf(Xd),x=Tf(Lr),v=Tf(Ir),b=Tf(Or),A=Ew.getState().elements;return Object(gf.jsx)(gf.Fragment,{children:(t||l||a||o)&&Object(gf.jsxs)(gf.Fragment,{children:[a&&(!d&&x||!f&&(v||b)||!c&&(y||g)||!u&&(m||w)||!s&&(h||p)||Tw.hasMovingParts(A))&&Object(gf.jsx)(Av,{}),o&&Object(gf.jsx)(Sv,{}),Object(gf.jsx)(Hv,{spinning:!r||!n})]})})})),Rv=function(){if(!Tf.getState().waiting)return null;var e=function(){return Object(r.useEffect)((function(){return Tf.setState((function(e){e.waiting=!1})),function(){Tf.setState((function(e){e.waiting=!1}))}})),null};return Object(gf.jsx)(e,{})},Dv=function(){var e=Ew(Fi),t=Object(r.useRef)(null);return Object(r.useEffect)((function(){t&&Et.setState((function(e){e.contentRef=t}))}),[]),console.debug(e),Object(gf.jsxs)("group",{ref:t,name:"Content",children:[e.map((function(t){switch(t.type){case V.Foundation:return Object(gf.jsx)(hg,Object(d.a)({},t),t.id);case V.Sensor:var l=t;return l.parentType===V.Cuboid?null:Object(gf.jsx)(mw,Object(d.a)({},l),t.id);case V.Light:var a=t;return a.parentType===V.Cuboid?null:Object(gf.jsx)(xw,Object(d.a)({},a),t.id);case V.Cuboid:return t.parentId!==xt?null:Object(gf.jsx)(Aw,{elements:e,cuboidModel:t},t.id);case V.Human:return Object(gf.jsx)(cx,Object(d.a)({},t),t.id);case V.Tree:return Object(gf.jsx)(Bx,Object(d.a)({},t),t.id);case V.Flower:return Object(gf.jsx)(yv,Object(d.a)({},t),t.id);case V.SolarPanel:switch(t.parentType){case V.Roof:case V.Wall:case V.Cuboid:return null;default:return Object(gf.jsx)(hv,Object(d.a)({},t),t.id)}case V.ParabolicDish:return Object(gf.jsx)(nv,Object(d.a)({},t),t.id);case V.ParabolicTrough:return Object(gf.jsx)(iv,Object(d.a)({},t),t.id);case V.FresnelReflector:return Object(gf.jsx)(sv,Object(d.a)({},t),t.id);case V.Heliostat:return Object(gf.jsx)(uv,Object(d.a)({},t),t.id);case V.Polygon:switch(t.parentType){case V.Wall:return null;default:return Object(gf.jsx)(Pm,Object(d.a)({},t),t.id)}default:if(t.id)return Object(gf.jsx)(n.a.Fragment,{},t.id)}return null})),Object(gf.jsx)(Rv,{}),Object(gf.jsx)(Mv,{})]})},Mv=function(){var e=Ew(Uu);return Object(r.useEffect)((function(){Ew.getState().set((function(e){e.deletedRoofIdSet.clear()}))}),[e]),null},Wv=n.a.memo(Dv),Iv=function(){var e=Ew(si),t=Ew(on),l=Ew(en),a=Ew(cn),i=Ew(Nn),n=Ew(ns),c=Ew(Zr),s=Ew(An),p=Ew(zn),y=Ew(qc),g=Ew(Qr),m=Ew(Du),w=Ew(Sr),x=Ew(qn),v=Ew(Br),b=Ew(Vi),A=Ew(cs),T=Ew(zu),P=Ew(Ru),S=Ew(Mu),j=Ew(Wu),H=Ew(o.shadowEnabled),z=Ew(o.groundColor),R=Ew(o.waterSurface),D=Ew((function(e){return e.world.ground})),M=Ew(Ou),W=Ew(ku),I=Tf(Ns),C=Object(Se.f)(),O=C.get,F=C.scene,k=C.invalidate,Y=Object(r.useRef)(),L=Object(r.useRef)(),E=Object(r.useRef)(null),U=Object(r.useRef)(new Me.Vector3),N=Object(r.useRef)(new Me.Vector3),J=Object(r.useRef)(new Map),G=Object(r.useRef)(new Map),X=Object(r.useRef)(new Map),Q=Object(r.useRef)(new Map),_=Object(r.useRef)(new Map),$=Object(r.useRef)(new Map),ee=Object(r.useRef)(new Map),te=Object(r.useRef)(new Map),le=Object(r.useRef)(new Me.Vector3(1,1,1)),ae=Object(r.useRef)(new Me.Vector3(1,1,1)),oe=Object(r.useRef)([0,0,1]),ie=Object(r.useRef)([0,0,1]),re=Object(r.useRef)(null),ne=Object(r.useRef)(null),ce=Object(r.useRef)(new Map),se=Object(r.useRef)(new Map),de=Object(r.useRef)(new Map),ue=Object(r.useRef)(!1),fe=Object(r.useRef)(!1),he=Object(r.useRef)(!1),pe=Object(r.useRef)(!1),ye=Object(r.useRef)(!1),ge=Object(r.useRef)(new Map),we=Object(r.useRef)(new Map),xe=Object(r.useRef)(new Map),ve=Object(r.useRef)(new Me.Vector3),be=Object(r.useMemo)((function(){return{lng:b}}),[b]);Object(r.useEffect)((function(){return window.addEventListener("pointerup",_e),function(){window.removeEventListener("pointerup",_e)}}),[]),Object(r.useEffect)((function(){M&&(e((function(e){e.addedFoundationId=null,e.deletedFoundationId=null})),ue.current=!1,fe.current=!1)}),[M]),Object(r.useEffect)((function(){W&&(e((function(e){e.addedCuboidId=null,e.deletedCuboidId=null})),he.current=!1,pe.current=!1)}),[W]);var Ae=Object(Se.f)().camera,Te=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Pe=Object(r.useMemo)((function(){return new Me.Vector2}),[]),je=E.current?Math.cos(E.current.rotation[2]):1,He=E.current?Math.sin(E.current.rotation[2]):0,ze=Z.Ground,Re=Object(r.useMemo)((function(){return new Me.Vector3}),[]),De=Object(r.useMemo)((function(){return new Me.Euler}),[]),We=Object(r.useMemo)((function(){return new Me.Euler}),[]);if(E.current)if(Tw.isPlantOrHuman(E.current)){ze=Z.Vertical;var Ie=Ew.getState().viewState.orthographic?0:-vt,Ce=Ae.position,Oe=Ce.x,Fe=Ce.y,ke=-Math.atan2(Oe,Fe);De.set(Ie,0,ke,"ZXY"),Re.set(E.current.cx,E.current.cy,0)}else if(T===B.Top)ze=Z.Horizontal,Re.set(E.current.cx,E.current.cy,E.current.lz),De.set(0,0,0);else if(Tw.isMoveHandle(T)||P===K.Left||P===K.Right||P===K.Lower||P===K.Upper||P===K.LowerLeft||P===K.UpperLeft&&E.current.type!==V.Wall||P===K.LowerRight||P===K.UpperRight&&E.current.type!==V.Wall||S===q.Lower||S===q.Upper)ze=Z.Horizontal,Re.set(E.current.cx,E.current.cy,st),De.set(0,0,0);else if(P){ze=Z.Vertical;var Ye=m(E.current,P),Le=g(),Ee=-Math.atan2(Le.x,Le.y);Re.set(Ye.x,Ye.y,0),De.set(-vt,0,Ee,"ZXY")}var Ue=function(e){Pe.x=e.offsetX/O().gl.domElement.clientWidth*2-1,Pe.y=-e.offsetY/O().gl.domElement.clientHeight*2+1,Te.setFromCamera(Pe,O().camera)},Ne=function(e){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.object.userData.stand)return a}}catch(o){l.e(o)}finally{l.f()}return null},Ve=function(t,l){t&&e((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l&&i.type!==V.Foundation){i.parentId=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Je=function e(t){if(!t)return"";var l=t.name.split(" ");return l[2]?l[2]:e(t.parent)},Ge=function(e,t,l){if(e&&t){var a=Et.getState().contentRef;if(null===a||void 0===a?void 0:a.current){var o=Tw.getObjectChildById(a.current,t),i=Tw.getObjectChildById(t===xt?a.current:o,l);if(i){if(e===xt)a.current.add(i);else{var r=Tw.getObjectChildById(a.current,e);null===r||void 0===r||r.add(i)}k()}}}},Xe=function(e,t){if(e&&e.current){var l=Ne(t.intersections);if(l){var a=l.object,o=e.current.parent;if("Ground"===a.name){if(o&&"Content"!==o.name){var i=Et.getState().contentRef;i&&i.current&&(i.current.add(e.current),Ve(xt,Je(e.current)))}e.current.position.copy(l.point),k()}else if(a.userData.stand){var r=a.parent;if(r){o&&o.uuid!==r.uuid&&(r.add(e.current),Ve(Je(r),Je(e.current)));var n=Tw.getWorldDataById(Je(r)).rot;We.set(0,0,-n);var c=(new Me.Vector3).subVectors(l.point,r.localToWorld(new Me.Vector3)).applyEuler(We);e.current.position.copy(c),k()}}ye.current||(ye.current=!0)}}},Be=function(t,l,a){e((function(e){var o,i=Object(f.a)(e.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===t){Tw.isFoundationOrCuboid(r)||(r.parentId=l),r.cx=a.x,r.cy=a.y,r.cz=a.z;break}}}catch(n){i.e(n)}finally{i.f()}}))},Ke=function(e,t){var l=Et.getState().contentRef,a=Tw.getObjectChildById(null===l||void 0===l?void 0:l.current,e.id);if(a){var o,i=Object(f.a)(a.children);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.name.includes("".concat(t.id))){var n,c;null===(n=Et.getState().contentRef)||void 0===n||null===(c=n.current)||void 0===c||c.add(r);break}}}catch(d){i.e(d)}finally{i.f()}}t.parentId=xt;var s=new Me.Vector3(t.cx,t.cy,t.cz).applyEuler(new Me.Euler(0,0,e.rotation[2])).add(U.current);t.cx=s.x,t.cy=s.y,t.cz=0,G.current.set(t.id,new Me.Vector3(s.x,s.y,0)),te.current.set(t.id,xt)},qe=function(t){var a=Ew.getState().resizeHandleType;switch(t.type){case V.Tree:switch(a){case K.Top:var o={name:"Change Tree Height",timestamp:Date.now(),changedElementId:t.id,changedElementType:t.type,oldValue:le.current.z,newValue:t.lz,undo:function(){p(o.changedElementId,o.oldValue)},redo:function(){p(o.changedElementId,o.newValue)}};return w(o),void e((function(e){e.actionState.treeHeight=t.lz}));case K.Left:case K.Right:case K.Lower:case K.Upper:var i={name:"Change Tree Spread",timestamp:Date.now(),changedElementId:t.id,changedElementType:t.type,oldValue:le.current.x,newValue:t.lx,undo:function(){s(i.changedElementId,i.oldValue)},redo:function(){s(i.changedElementId,i.newValue)}};return w(i),void e((function(e){e.actionState.treeSpread=t.lx}))}break;case V.Wall:var r={name:"Change Wall Height",timestamp:Date.now(),changedElementId:t.id,changedElementType:t.type,oldValue:le.current.z,newValue:t.lz,undo:function(){p(r.changedElementId,r.oldValue)},redo:function(){p(r.changedElementId,r.newValue)}};return w(r),void e((function(e){e.actionState.wallHeight=t.lz}))}if(N.current.set(t.cx,t.cy,t.cz),ae.current.set(t.lx,t.ly,t.lz),ee.current.clear(),te.current.clear(),G.current.clear(),Q.current.clear(),$.current.clear(),e((function(e){if(t.type===V.Cuboid&&(e.actionState.cuboidHeight=t.lz),e.updateSceneRadius(),e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,t.parentId===xt){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Tw.isPlantOrHuman(o)&&o.parentId===t.id&&(ee.current.set(o.id,t.id),!Tw.isResizingVertical(Ew.getState().resizeHandleType)))if(Math.abs(le.current.z/2-o.cz)<.01){var i=new Me.Vector3(o.cx,o.cy,o.cz).applyEuler(new Me.Euler(0,0,t.rotation[2])).add(U.current).sub(N.current).applyEuler(new Me.Euler(0,0,-t.rotation[2]));Math.abs(i.x)>Math.abs(ae.current.x/2)+.01||Math.abs(i.y)>Math.abs(ae.current.y/2)+.01?Ke(t,o):(o.cx=i.x,o.cy=i.y)}else{var r=new Me.Vector3(o.cx,o.cy,o.cz),n=(new Me.Vector3).subVectors(N.current,U.current),c=(new Me.Vector3).subVectors(r,n);Math.abs(r.x/le.current.x)>.49?Math.abs(c.y)>t.ly/2+.5?Ke(t,o):(o.cx=(r.x>0?t.lx:-t.lx)/2,o.cy=c.y):Math.abs(r.y/le.current.y)>.49&&(Math.abs(c.x)>t.lx/2+.5?Ke(t,o):(o.cx=c.x,o.cy=(r.y>0?t.ly:-t.ly)/2))}}}catch(s){a.e(s)}finally{a.f()}}})),N.current.distanceToSquared(U.current)>At&&ae.current.distanceToSquared(le.current)>At){if(t.type===V.Foundation||t.type===V.Cuboid){var n=l(t.id);if(n.length>0){var h,y=Object(f.a)(n);try{for(y.s();!(h=y.n()).done;){var g=h.value;if(g.type===V.Polygon)Q.current.set(g.id,g.vertices.map((function(e){return Object(d.a)({},e)})));else{if(g.type===V.Wall){var m=g,v=new Me.Vector2(m.leftPoint[0],m.leftPoint[1]),b=new Me.Vector2(m.rightPoint[0],m.rightPoint[1]);$.current.set(g.id,[v,b])}G.current.set(g.id,new Me.Vector3(g.cx,g.cy,g.cz))}}}catch(z){y.e(z)}finally{y.f()}}if(t.type===V.Foundation){var A=at(t.id);if(A.length>0){var T,P=Object(f.a)(A);try{for(P.s();!(T=P.n()).done;){var S=T.value,j=new Me.Vector3(S.cx,S.cy);G.current.set(S.id,j)}}catch(z){P.e(z)}finally{P.f()}}}}var H=function(){if(E.current){var t={name:"Resize",timestamp:Date.now(),resizedElementId:E.current.id,resizedElementType:E.current.type,oldCx:U.current.x,oldCy:U.current.y,oldCz:U.current.z,newCx:N.current.x,newCy:N.current.y,newCz:N.current.z,oldLx:le.current.x,oldLy:le.current.y,oldLz:le.current.z,newLx:ae.current.x,newLy:ae.current.y,newLz:ae.current.z,oldChildrenPositionsMap:new Map(J.current),newChildrenPositionsMap:new Map(G.current),oldPolygonVerticesMap:new Map(X.current),newPolygonVerticesMap:new Map(Q.current),oldChildrenParentIdMap:new Map(ee.current),newChildrenParentIdMap:new Map(te.current),oldWallPointsMap:new Map(_.current),newWallPointsMap:new Map($.current),undo:function(){if(e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.resizedElementId){o.cx=t.oldCx,o.cy=t.oldCy,o.cz=t.oldCz,o.lx=t.oldLx,o.ly=t.oldLy,o.lz=t.oldLz;break}}}catch(z){a.e(z)}finally{a.f()}})),t.oldChildrenPositionsMap.size>0){var l,a=Object(f.a)(t.oldChildrenPositionsMap.entries());try{var o=function(){var a=Object(u.a)(l.value,2),o=a[0],i=a[1],r=c(o);if((null===r||void 0===r?void 0:r.type)!==V.Polygon){var n,s;e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var r=l.value;if(r.id===o){if(r.cx=i.x,r.cy=i.y,lt(r)||(r.cz=i.z),r.type===V.Wall){var n=r,c=t.oldWallPointsMap.get(n.id);c&&(n.leftPoint=[c[0].x,c[0].y,0],n.rightPoint=[c[1].x,c[1].y,0])}break}}}catch(z){a.e(z)}finally{a.f()}t.oldWallPointsMap.size>0&&(e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag)}));var d=null===(n=t.oldChildrenParentIdMap)||void 0===n?void 0:n.get(o),h=null===(s=t.newChildrenParentIdMap)||void 0===s?void 0:s.get(o);d&&h&&d!==h&&(Ge(d,h,o),Ve(d,o))}};for(a.s();!(l=a.n()).done;)o()}catch(z){a.e(z)}finally{a.f()}}if(t.oldPolygonVerticesMap.size>0){var i,r=Object(f.a)(t.oldPolygonVerticesMap.entries());try{for(r.s();!(i=r.n()).done;){var n=Object(u.a)(i.value,2),s=n[0],d=n[1],h=c(s);(null===h||void 0===h?void 0:h.type)===V.Polygon&&x(s,d)}}catch(z){r.e(z)}finally{r.f()}}},redo:function(){if(e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===t.resizedElementId){o.cx=t.newCx,o.cy=t.newCy,o.cz=t.newCz,o.lx=t.newLx,o.ly=t.newLy,o.lz=t.newLz;break}}}catch(z){a.e(z)}finally{a.f()}})),t.newChildrenPositionsMap.size>0){var l,a=Object(f.a)(t.newChildrenPositionsMap.entries());try{var o=function(){var a,o,i=Object(u.a)(l.value,2),r=i[0],n=i[1];e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.id===r){if(o.cx=n.x,o.cy=n.y,o.type===V.SolarPanel&&o.parentType===V.Roof||(o.cz=n.z),o.type===V.Wall){var i=o,c=t.newWallPointsMap.get(i.id);c&&(i.leftPoint=[c[0].x,c[0].y,0],i.rightPoint=[c[1].x,c[1].y,0])}break}}}catch(z){a.e(z)}finally{a.f()}t.newWallPointsMap.size>0&&(e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag)}));var c=null===(a=t.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=t.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(Ge(s,c,r),Ve(s,r))};for(a.s();!(l=a.n()).done;)o()}catch(z){a.e(z)}finally{a.f()}}if(t.newPolygonVerticesMap.size>0){var i,r=Object(f.a)(t.newPolygonVerticesMap.entries());try{for(r.s();!(i=r.n()).done;){var n=Object(u.a)(i.value,2),s=n[0],d=n[1],h=c(s);(null===h||void 0===h?void 0:h.type)===V.Polygon&&x(s,d)}}catch(z){r.e(z)}finally{r.f()}}}};return t}}();H&&w(H)}},Qe=function(t){e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(t.has(o.id)){var i=t.get(o.id);i&&(o.cx=i[0],o.cy=i[1],o.cz=i[2])}}}catch(r){a.e(r)}finally{a.f()}}))},Ze=function(t,l){var o,i,r;if(!t.locked){N.current.set(t.cx,t.cy,t.cz);var n=re.current,c=null;switch(Ue(l),t.type){case V.Tree:c=null===(o=Et.getState().treeRef)||void 0===o?void 0:o.current;break;case V.Flower:c=null===(i=Et.getState().flowerRef)||void 0===i?void 0:i.current;break;case V.Human:c=null===(r=Et.getState().humanRef)||void 0===r?void 0:r.current}if(c&&ye.current){var s=Te.intersectObjects(Tw.fetchIntersectables(F),!1),d=Ne(s);if(d){var u=d.point;if("Ground"===d.object.name)Be(t.id,xt,u),N.current.set(u.x,u.y,u.z),n=xt;else if(d.object.userData.stand){var p=Je(d.object),y=d.object.parent;if(y){var g=(new Me.Vector3).subVectors(u,y.localToWorld(new Me.Vector3)).applyEuler(We);Be(t.id,p,g),N.current.set(g.x,g.y,g.z),n=p}}}ye.current=!1}if(N.current.distanceToSquared(U.current)>At||0===Te.intersectObjects([Y.current]).length){var m=!0;if(!Ew.getState().viewState.orthographic&&!(m=N.current.length().02}if(!m||function(){if(Ew.getState().viewState.orthographic)return!1;if(Y.current){var e=Te.intersectObjects(O().scene.children,!0);if(e.length>0){var t,l=Object(f.a)(e);try{for(l.s();!(t=l.n()).done;)if(t.value.object.userData.stand)return!1}catch(a){l.e(a)}finally{l.f()}}}return 0===Te.intersectObjects([Y.current]).length}()){a(t.id,U.current.x,U.current.y,U.current.z),c&&Tw.isPlantOrHuman(t)&&c.position.copy(U.current),Tw.isPlantOrHuman(t)&&Ve(re.current,t.id);var S=Et.getState().contentRef;if((null===S||void 0===S?void 0:S.current)&&re.current&&c){if(re.current===xt)S.current.add(c);else{var j=Tw.getObjectChildById(S.current,re.current);null===j||void 0===j||j.add(c)}k()}Qh(me.t("message.CannotMoveObjectTooFar",be))}else{if(ge.current.size>1){xe.current.clear();var H,z=Object(f.a)(Ew.getState().elements);try{for(z.s();!(H=z.n()).done;){var R=H.value;we.current.has(R.id)&&xe.current.set(R.id,[R.cx,R.cy,R.cz])}}catch(L){z.e(L)}finally{z.f()}var D={name:"Move Foundation Group",timestamp:Date.now(),oldPositionMap:new Map(we.current),newPositionMap:new Map(xe.current),undo:function(){Qe(D.oldPositionMap)},redo:function(){Qe(D.newPositionMap)}};w(D)}else{var M=t.type===V.Cuboid,W=M?ne.current:re.current,I=M?t.parentId:n,C={name:"Move",timestamp:Date.now(),movedElementId:t.id,movedElementType:t.type,oldCx:U.current.x,oldCy:U.current.y,oldCz:U.current.z,newCx:N.current.x,newCy:N.current.y,newCz:N.current.z,oldRotation:Object(h.a)(oe.current),newRotation:Object(h.a)(t.rotation),oldParentId:W,newParentId:I,undo:function(){a(C.movedElementId,C.oldCx,C.oldCy,C.oldCz),e((function(e){var t=e.elements.find((function(e){return e.id===C.movedElementId}));t&&C.oldRotation&&(t.rotation=Object(h.a)(C.oldRotation))})),Ve(C.oldParentId,C.movedElementId),C.movedElementType&&ot(C.movedElementType)&&Ge(C.oldParentId,C.newParentId,C.movedElementId)},redo:function(){a(C.movedElementId,C.newCx,C.newCy,C.newCz),e((function(e){var t=e.elements.find((function(e){return e.id===C.movedElementId}));t&&C.newRotation&&(t.rotation=Object(h.a)(C.newRotation))})),Ve(C.newParentId,C.movedElementId),C.movedElementType&&ot(C.movedElementType)&&Ge(C.newParentId,C.oldParentId,C.movedElementId)}};w(C)}ge.current.clear(),v()}}}},_e=function(t){if(2!==t.button){if(Et.setState((function(e){e.setEnableOrbitController(!0)})),E.current){var l=c(E.current.id);if(l)if(fe.current)if(ue.current=!1,fe.current=!1,e((function(e){e.addedFoundationId=null,e.updateSceneRadius()})),l.lx<=.1||l.ly<=.1)y(l.id,!1);else{var a={name:"Add",timestamp:Date.now(),addedElement:l,undo:function(){y(a.addedElement.id,!1),v()},redo:function(){e((function(e){e.elements.push(a.addedElement),e.selectedElement=a.addedElement,e.updateSceneRadius()}))}};w(a)}else if(pe.current)if(he.current=!1,pe.current=!1,e((function(e){e.addedCuboidId=null,e.updateSceneRadius()})),l.lx<=.1||l.ly<=.1)y(l.id,!1);else{var o={name:"Add",timestamp:Date.now(),addedElement:l,undo:function(){y(o.addedElement.id,!1),v()},redo:function(){e((function(e){e.elements.push(o.addedElement),e.selectedElement=o.addedElement,e.updateSceneRadius()}))}};w(o)}else Ew.getState().resizeHandleType?qe(l):Ew.getState().rotateHandleType?function(e){ie.current=Object(h.a)(e.rotation);var t=(new Me.Vector3).fromArray(oe.current);if((new Me.Vector3).fromArray(ie.current).distanceToSquared(t)>At){var l={name:"Rotate",timestamp:Date.now(),rotatedElementId:e.id,rotatedElementType:e.type,oldRotation:oe.current,newRotation:ie.current,undo:function(){i(l.rotatedElementId,l.oldRotation[0],l.oldRotation[1],l.oldRotation[2])},redo:function(){i(l.rotatedElementId,l.newRotation[0],l.newRotation[1],l.newRotation[2])}};w(l)}}(l):Ew.getState().moveHandleType&&Ze(l,t),l.type===V.Foundation&&Tf.getState().updateFoundationMovedFlag();E.current=null}e((function(e){e.moveHandleType=null,e.resizeHandleType=null,e.rotateHandleType=null})),Et.setState((function(e){e.humanRef=null,e.treeRef=null,e.flowerRef=null}))}},$e=function(e,t){var l=Tw.getWorldDataById(e.id).pos,a=new Me.Vector3(l.x,l.y),o=(new Me.Vector3).subVectors(a,t);ge.current.set(e.id,o),we.current.set(e.id,[e.cx,e.cy,e.cz])},et=function e(t,l){var a,o=t.intersections[0].point.clone().setZ(0),i=Object(f.a)(Ew.getState().elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;!Lw(r)||r.parentId!==xt||r.locked||r.id===l.id||ge.current.has(r.id)||Tw.isChild(l.id,r.id)||Tw.isChild(r.id,l.id)||!Tw.areTwoBasesOverlapped(r,l)||($e(r,o),r.enableGroupMaster&&e(t,r)),r.id===l.id&&$e(r,o)}}catch(n){i.e(n)}finally{i.f()}},tt=function(e,t){ge.current.clear(),we.current.clear(),t.enableGroupMaster&&Ew.getState().moveHandleType&&et(e,t)},lt=function(e){return e.type===V.SolarPanel&&e.parentType===V.Roof||(e.type===V.Window&&e.parentType===V.Roof||void 0)},at=function(e){return Ew.getState().elements.filter((function(t){return t.foundationId===e&&(t.type===V.SolarPanel&&t.parentType===V.Roof||(t.type===V.Window&&t.parentType===V.Roof||(t.type===V.Sensor||t.type===V.Light||void 0)))}))},ot=function(e){return e===V.Human||e===V.Tree||e===V.Flower},it=function(e,t){if(0===e.tempHumanPlant.length){var l=e.elements.filter((function(e){return ot(e.type)&&Tw.isDescendantOf(e,t)}));e.tempHumanPlant=l;var a=new Set(l.map((function(e){return e.id})));e.elements=e.elements.filter((function(e){return!a.has(e.id)}))}},rt=function(e,t){var l=e.intersections.find((function(e){var l=e.eventObject;if(!l.name.includes("Cuboid"))return!1;var a=l.name.split(" ");return 2===a.length&&(a[1]!==t&&l.userData.stackable)}));if(l){var a=l.eventObject.name.split(" ")[1];if(!ge.current.has(a))return Tw.isChild(t,a)?void 0:l}},nt=function(e){return e===V.Foundation||e===V.Cuboid||e===V.Tree||e===V.Flower||e===V.Human},ct=function(e,t,l,a,o){if(e){var i,r=Object(f.a)(e.children);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.name.includes("Human")||n.name.includes("Tree")||n.name.includes("Flower")){var c=Je(n),s=ce.current.get(c);if(s)if(Math.abs(le.current.z/2-n.position.z)<.01){var d=(new Me.Vector3).subVectors(s,a).applyEuler(new Me.Euler(0,0,-o));n.position.setX(d.x),n.position.setY(d.y)}else{var u=(new Me.Vector3).subVectors(s,U.current).applyEuler(new Me.Euler(0,0,-o)),h=(new Me.Vector3).subVectors(a,U.current),p=(new Me.Vector3).subVectors(u,h);Math.abs(u.x/le.current.x)>.49?(n.position.setX((u.x>0?t:-t)/2),n.position.setY(p.y)):Math.abs(u.y/le.current.y)>.49&&(n.position.setX(p.x),n.position.setY((u.y>0?l:-l)/2))}}}}catch(y){r.e(y)}finally{r.f()}}},dt=function(t){if(E.current){var a=new Me.Vector2(t.x,t.y),o=new Me.Vector2(j.x,j.y),i=o.distanceTo(a),r=Math.atan2(a.x-j.x,a.y-j.y)+E.current.rotation[2],n=Math.abs(i*Math.sin(r)),c=Math.abs(i*Math.cos(r)),s=(new Me.Vector2).addVectors(a,o).multiplyScalar(.5);switch(e((function(e){if(E.current){var t,a=!1,o=Object(f.a)(e.elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;if(i.id===E.current.id){switch(i.type){case V.Cuboid:case V.Foundation:var r=l(i.id);if(r.length>0){var d,u=[],h=Object(f.a)(r);try{for(h.s();!(d=h.n()).done;){var p=d.value;if(!Tw.isPlantOrHuman(p)){var y=JSON.parse(JSON.stringify(p));if(u.push(y),Tw.isIdentical(y.normal,Tt))if(p.type===V.Wall){var g=de.current.get(p.id);if(g){var m=-i.rotation[2],w=g.centerPointAbsPos,x=g.leftPointAbsPos,v=g.rightPointAbsPos,b=(new Me.Vector2).subVectors(w,s).rotateAround(Dt,m),A=(new Me.Vector2).subVectors(x,s).rotateAround(Dt,m),T=(new Me.Vector2).subVectors(v,s).rotateAround(Dt,m);switch(P){case K.Lower:case K.Upper:y.cy=b.y;break;case K.Left:case K.Right:y.cx=b.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:y.cx=b.x,y.cy=b.y}y.leftPoint=[A.x,A.y,0],y.rightPoint=[T.x,T.y,0]}}else{var S=ce.current.get(p.id);if(S){var j=-i.rotation[2],H=(new Me.Vector2).subVectors(new Me.Vector2(S.x,S.y),s).rotateAround(Dt,j);switch(P){case K.Lower:case K.Upper:y.cy=H.y/c;break;case K.Left:case K.Right:y.cx=H.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:y.cx=H.x/n,y.cy=H.y/c}}}}}}catch(ee){h.e(ee)}finally{h.f()}var z=JSON.parse(JSON.stringify(i));switch(P){case K.Lower:case K.Upper:z.ly=c,z.cy=s.y;break;case K.Left:case K.Right:z.lx=n,z.cx=s.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:z.lx=n,z.ly=c,z.cx=s.x,z.cy=s.y}if(Tw.doesParentContainAllChildren(z,u)){switch(P){case K.Lower:case K.Upper:i.ly=c,i.cy=s.y;break;case K.Left:case K.Right:i.lx=n,i.cx=s.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:i.lx=n,i.ly=c,i.cx=s.x,i.cy=s.y}a=!0}}else if(n>.49&&c>.49){switch(P){case K.Lower:case K.Upper:i.ly=c,i.cy=s.y;break;case K.Left:case K.Right:i.lx=n,i.cx=s.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:i.lx=n,i.ly=c,i.cx=s.x,i.cy=s.y}a=!0}}break}}}catch(ee){o.e(ee)}finally{o.f()}if(a){var R,D=Object(f.a)(e.elements);try{for(D.s();!(R=D.n()).done;){var M=R.value;if(M.parentId===E.current.id)switch(M.type){case V.Wall:var W=M,I=de.current.get(M.id);if(I){var C=-E.current.rotation[2],O=I.centerPointAbsPos,F=I.leftPointAbsPos,k=I.rightPointAbsPos,Y=(new Me.Vector2).subVectors(O,s).rotateAround(Dt,C),L=(new Me.Vector2).subVectors(F,s).rotateAround(Dt,C),U=(new Me.Vector2).subVectors(k,s).rotateAround(Dt,C);switch(P){case K.Lower:case K.Upper:M.cy=Y.y;break;case K.Left:case K.Right:M.cx=Y.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:M.cx=Y.x,M.cy=Y.y}W.leftPoint=[L.x,L.y,0],W.rightPoint=[U.x,U.y,0]}break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:if(Tw.isIdentical(M.normal,Tt)){var N=ce.current.get(M.id);if(N){var J=(new Me.Vector2).subVectors(new Me.Vector2(N.x,N.y),s).rotateAround(Dt,-E.current.rotation[2]);switch(P){case K.Lower:case K.Upper:M.cy=J.y/c;break;case K.Left:case K.Right:M.cx=J.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:M.cx=J.x/n,M.cy=J.y/c}}}break;case V.Cuboid:var G=ce.current.get(M.id);if(G){var X=(new Me.Vector2).subVectors(new Me.Vector2(G.x,G.y),s).rotateAround(Dt,-E.current.rotation[2]);switch(P){case K.Lower:case K.Upper:M.cy=X.y;break;case K.Left:case K.Right:M.cx=X.x;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:M.cx=X.x,M.cy=X.y}}break;case V.Polygon:if(Tw.isIdentical(M.normal,Tt)){var B=M,q=se.current.get(B.id);q&&function(){var e=[];q.forEach((function(t){var l=(new Me.Vector2).subVectors(t,s).rotateAround(Dt,-E.current.rotation[2]);e.push({x:l.x/n,y:l.y/c})})),B.vertices=e}()}}if(M.foundationId===E.current.id&&M.type===V.SolarPanel&&M.parentType===V.Roof){var Q=ce.current.get(M.id);if(Q){var Z=(new Me.Vector2).subVectors(new Me.Vector2(Q.x,Q.y),s).rotateAround(Dt,-E.current.rotation[2]);switch(P){case K.Lower:case K.Upper:M.cy=Z.y/c;break;case K.Left:case K.Right:M.cx=Z.x/n;break;case K.LowerLeft:case K.LowerRight:case K.UpperLeft:case K.UpperRight:M.cx=Z.x/n,M.cy=Z.y/c}}}if(M.foundationId===E.current.id&&M.type===V.Window&&M.parentType===V.Roof){var _=ce.current.get(M.id);if(_){var $=(new Me.Vector2).subVectors(new Me.Vector2(_.x,_.y),s).rotateAround(Dt,-E.current.rotation[2]);M.cx=$.x,M.cy=$.y}}}}catch(ee){D.e(ee)}finally{D.f()}}}})),E.current.type){case V.Foundation:var d=Et.getState().foundationRef;(null===d||void 0===d?void 0:d.current)&&ct(null===d||void 0===d?void 0:d.current,n,c,d.current.position,E.current.rotation[2]);break;case V.Cuboid:var u=Et.getState().cuboidRef;(null===u||void 0===u?void 0:u.current)&&u.current.parent&&ct(null===u||void 0===u?void 0:u.current,n,c,u.current.parent.position,E.current.rotation[2])}}},ut=function(e){var t=E.current,l=t.cx,a=t.cy,o=Math.atan2(l-e.x,e.y-a)+(S===q.Upper?0:Math.PI),r=Math.abs(o)>Math.PI?-Math.sign(o)*bt:0;i(E.current.id,0,0,o+r)},ft=function(t){var l=ge.current.size>1;if(l)e((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(Lw(o)&&ge.current.has(o.id)){var i=ge.current.get(o.id);i&&(o.cx=t.x+i.x,o.cy=t.y+i.y)}}}catch(r){a.e(r)}finally{a.f()}}));else{var o,i,r=E.current.lx/2,n=E.current.ly/2;switch(T){case B.Top:if(l){var c=new Me.Vector3(t.x,t.y);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=c.x,a.cy=c.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(c,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,t.x,t.y);break;case B.Upper:if(o=t.x+He*n,i=t.y-je*n,l){var s=new Me.Vector3(o,i);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=s.x,a.cy=s.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(s,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,o,i);break;case B.Lower:if(o=t.x-He*n,i=t.y+je*n,l){var d=new Me.Vector3(o,i);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=d.x,a.cy=d.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(d,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,o,i);break;case B.Left:if(o=t.x+je*r,i=t.y+He*r,l){var u=new Me.Vector3(o,i);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=u.x,a.cy=u.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(u,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,o,i);break;case B.Right:if(o=t.x-je*r,i=t.y-He*r,l){var h=new Me.Vector3(o,i);e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===E.current.id)a.cx=h.x,a.cy=h.y;else if(ge.current.has(a.id)){var o=ge.current.get(a.id);if(o){var i=(new Me.Vector3).addVectors(h,o);a.cx=i.x,a.cy=i.y}}}}catch(r){l.e(r)}finally{l.f()}}))}else a(E.current.id,o,i)}}};return Object(gf.jsxs)(gf.Fragment,{children:[E.current&&ze!==Z.Ground&&Object(gf.jsx)(Lt.f,{ref:L,visible:!1,name:"Ground Intersection Plane",rotation:De,position:Re,args:[1e5,1e5],onPointerMove:function(t){var l;if(E.current&&E.current.type&&!E.current.locked&&(Ue(t),L.current&&ze===Z.Vertical&&(l=Te.intersectObjects([L.current]))&&l.length>0)){var a=l[0].point;switch(E.current.type){case V.Tree:var o=E.current;switch(P){case K.Top:p(o.id,a.z),e((function(e){e.selectedElementHeight=Math.max(1,a.z)}));break;case K.Left:case K.Right:case K.Upper:case K.Lower:s(o.id,2*Math.hypot(a.x-o.cx,a.y-o.cy))}Xe(Et.getState().treeRef,t);break;case V.Flower:Xe(Et.getState().flowerRef,t);break;case V.Human:Xe(Et.getState().humanRef,t)}}},children:Object(gf.jsx)("meshStandardMaterial",{side:Me.DoubleSide,opacity:.5,transparent:!0})}),Object(gf.jsx)(Lt.f,{receiveShadow:H,ref:Y,name:"Ground",userData:{stand:!0},rotation:[0,0,0],position:[0,0,0],args:[1e4,1e4],renderOrder:-2,onContextMenu:function(t){t.intersections.length>0&&(t.intersections[0].object===Y.current&&e((function(e){Yy.selectNone(e),e.pastePoint.copy(t.intersections[0].point),e.clickObjectType=V.Ground,e.contextMenuObjectType=V.Ground,e.pasteNormal=Rt})))},onPointerDown:function(a){if(2!==a.button&&0!==a.intersections.length&&Y.current)if(ue.current){Ue(a);var o=Te.intersectObjects([Y.current]);o.length>0&&(Et.getState().setEnableOrbitController(!1),e((function(e){e.moveHandleType=null,e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(o[0].point)})),ue.current=!1,fe.current=!0)}else if(he.current){Ue(a);var i=Te.intersectObjects([Y.current]);i.length>0&&(Et.getState().setEnableOrbitController(!1),e((function(e){if(e.moveHandleType=null,e.resizeHandleType=K.LowerRight,e.resizeAnchor.copy(i[0].point),E.current){var t,l=rt(a,null===(t=E.current)||void 0===t?void 0:t.id);if(l){var o=Te.intersectObjects([l.eventObject]);o.length>0&&e.resizeAnchor.copy(o[0].point)}}})),he.current=!1,pe.current=!0)}else{if(a.intersections[0].object===Y.current){if(Ew.getState().multiSelectionsMode||e((function(e){e.clickObjectType=V.Ground,e.selectedElement=null,Yy.selectNone(e),e.contextMenuObjectType=null})),nt(A)){var r=a.intersections[0].point,c=n(D,r),s={name:"Add",timestamp:Date.now(),addedElement:c,undo:function(){y(s.addedElement.id,!1),v()},redo:function(){e((function(e){e.elements.push(s.addedElement),e.selectedElement=s.addedElement,e.updateSceneRadius()}))}};w(s),e((function(e){e.actionModeLock||(e.objectTypeToAdd=V.None),e.updateSceneRadius()}))}}else{var u=Ew.getState().selectedElementIdSet;if(u.size>1){var p=Ew.getState().selectedElement;if(p){E.current=p,ge.current.clear();var g,m=Object(f.a)(Ew.getState().elements);try{for(m.s();!(g=m.n()).done;){var x=g.value;if(Tw.isElementAllowedMultipleMoveOnGround(x)&&u.has(x.id))if(x.enableGroupMaster)et(a,x);else{var b=a.intersections[0].point.clone().setZ(0);$e(x,b)}}}catch(lt){m.e(lt)}finally{m.f()}}}else{var T=t();if(T&&nt(T.type)){if(E.current=T,U.current.set(T.cx,T.cy,T.cz),le.current.set(T.lx,T.ly,T.lz),oe.current=Object(h.a)(T.rotation),T.type===V.Foundation||T.type===V.Cuboid){var P=l(T.id);if(J.current.clear(),X.current.clear(),_.current.clear(),P.length>0){var S,j=Object(f.a)(P);try{for(j.s();!(S=j.n()).done;){var H=S.value;if(H.type===V.Polygon)X.current.set(H.id,H.vertices.map((function(e){return Object(d.a)({},e)})));else{if(H.type===V.Wall){var z=H,R=new Me.Vector2(z.leftPoint[0],z.leftPoint[1]),M=new Me.Vector2(z.rightPoint[0],z.rightPoint[1]);_.current.set(H.id,[R,M])}J.current.set(H.id,new Me.Vector3(H.cx,H.cy,H.cz))}}}catch(lt){j.e(lt)}finally{j.f()}}if(T.type===V.Foundation){var W=at(T.id);if(W.length>0){var I,C=Object(f.a)(W);try{for(C.s();!(I=C.n()).done;){var O=I.value,F=new Me.Vector3(O.cx,O.cy);J.current.set(O.id,F)}}catch(lt){C.e(lt)}finally{C.f()}}}}switch(T.type){case V.Tree:re.current=T.parentId,le.current.set(T.lx,T.ly,T.lz);break;case V.Flower:case V.Human:re.current=T.parentId;break;case V.Cuboid:if(Lw(T)&&T.parentId===xt?tt(a,T):ge.current.clear(),ne.current=T.parentId,Ew.getState().moveHandleType){var k=Tw.getWorldDataById(T.id).rot,L=new Me.Euler(0,0,k);switch(Ew.getState().moveHandleType){case B.Right:ve.current.set(-T.lx/2,0,0).applyEuler(L);break;case B.Left:ve.current.set(T.lx/2,0,0).applyEuler(L);break;case B.Lower:ve.current.set(0,T.ly/2,0).applyEuler(L);break;case B.Upper:ve.current.set(0,-T.ly/2,0).applyEuler(L);break;default:ve.current.set(0,0,0)}}ce.current.clear();var N=Tw.getWorldDataById(T.id),G=N.pos,q=N.rot,Q=new Me.Vector3(G.x,G.y,G.z),Z=l(T.id);if(Z.length>0){var $,ee=Object(f.a)(Z);try{for(ee.s();!($=ee.n()).done;){var te=$.value;switch(te.type){case V.Cuboid:var ae=new Me.Vector3(te.cx,te.cy,te.cz).applyEuler(new Me.Euler(0,0,q));ae.add(Q),ce.current.set(te.id,ae);break;case V.Tree:case V.Flower:case V.Human:var ie=new Me.Vector3(te.cx,te.cy,te.cz).applyEuler(new Me.Euler(0,0,q));ie.add(Q),ce.current.set(te.id,ie);break;case V.SolarPanel:case V.Light:case V.Sensor:if(Tw.isIdentical(te.normal,Tt)){var ye=new Me.Vector3(te.cx*T.lx,te.cy*T.ly,te.cz*T.lz).applyEuler(new Me.Euler(0,0,q));ye.add(Q),ce.current.set(te.id,ye)}break;case V.Polygon:if(Tw.isIdentical(te.normal,Tt)){var me,we=te,xe=[],be=Object(f.a)(we.vertices);try{for(be.s();!(me=be.n()).done;){var Ae=me.value,Pe=new Me.Vector2(Ae.x*T.lx,Ae.y*T.ly).rotateAround(Dt,q);Pe.add(new Me.Vector2(Q.x,Q.y)),xe.push(Pe)}}catch(lt){be.e(lt)}finally{be.f()}se.current.set(we.id,xe)}}}}catch(lt){ee.e(lt)}finally{ee.f()}}break;case V.Foundation:Lw(T)&&tt(a,T),ce.current.clear(),se.current.clear(),de.current.clear();var Se=new Me.Vector2(T.cx,T.cy),je=new Me.Vector3(T.cx,T.cy,T.cz),He=l(T.id);if(He.length>0){var ze,Re=T.rotation[2],De=Object(f.a)(He);try{for(De.s();!(ze=De.n()).done;){var We=ze.value;switch(We.type){case V.Wall:var Ie=We,Ce=new Me.Vector2(Ie.cx,Ie.cy).rotateAround(Dt,Re);Ce.add(Se);var Oe=new Me.Vector2(Ie.leftPoint[0],Ie.leftPoint[1]).rotateAround(Dt,Re);Oe.add(Se);var Fe=new Me.Vector2(Ie.rightPoint[0],Ie.rightPoint[1]).rotateAround(Dt,Re);Fe.add(Se),de.current.set(Ie.id,{centerPointAbsPos:Ce,leftPointAbsPos:Oe,rightPointAbsPos:Fe});break;case V.Tree:case V.Flower:case V.Human:var ke=new Me.Vector3(We.cx,We.cy,We.cz).applyEuler(new Me.Euler(0,0,Re));ke.add(je),ce.current.set(We.id,ke);break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var Ye=new Me.Vector3(We.cx*T.lx,We.cy*T.ly,We.cz*T.lz).applyEuler(new Me.Euler(0,0,Re));Ye.add(je),ce.current.set(We.id,Ye);break;case V.Polygon:var Le,Ee=We,Ne=[],Ve=Object(f.a)(Ee.vertices);try{for(Ve.s();!(Le=Ve.n()).done;){var Je=Le.value,Ge=new Me.Vector2(Je.x*T.lx,Je.y*T.ly).rotateAround(Dt,Re);Ge.add(Se),Ne.push(Ge)}}catch(lt){Ve.e(lt)}finally{Ve.f()}se.current.set(Ee.id,Ne)}}}catch(lt){De.e(lt)}finally{De.f()}}var Xe=at(T.id);if(Xe.length>0){var Be,Ke=new Me.Euler(0,0,T.rotation[2]),qe=Object(f.a)(Xe);try{for(qe.s();!(Be=qe.n()).done;){var Qe=Be.value;if(Qe.type===V.Window){var Ze=new Me.Vector3(Qe.cx,Qe.cy).applyEuler(Ke);Ze.add(je),ce.current.set(Qe.id,Ze)}else{var _e=new Me.Vector3(Qe.cx*T.lx,Qe.cy*T.ly).applyEuler(Ke);_e.add(je),ce.current.set(Qe.id,_e)}}}catch(lt){qe.e(lt)}finally{qe.f()}}}}}}}},onPointerMove:function(t){var l;if(E.current&&E.current.type&&!E.current.locked)switch(Ue(t),E.current.type){case V.Foundation:L.current&&(l=Te.intersectObjects([L.current])).length>0&&(T?ft(l[0].point):P?dt(l[0].point):S&&ut(l[0].point));break;case V.Cuboid:if(L.current&&ze===Z.Horizontal&&(l=Te.intersectObjects([L.current])).length>0){var o=l[0].point.clone(),i=rt(t,E.current.id);if(T)if(ge.current.size>1)ft(o);else if(i){if(0===(l=Te.intersectObjects([i.eventObject])).length)return;o.copy(l[0].point).add(ve.current);var r=i.eventObject.name.split(" ")[1];e((function(e){var t=e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)})),l=e.selectedElement;if(t&&l){var a=Tw.getWorldDataById(r),i=a.pos,n=a.rot,c=(new Me.Vector3).subVectors(o,i);if(c.applyEuler(new Me.Euler(0,0,-n)),t.cx=c.x,t.cy=c.y,l.parentId!==r){t.parentId!==r&&it(e,t.id);var s=Tw.getWorldDataById(l.id).rot;t.rotation[2]=s-n,t.parentId=r}else t.parentId!==r&&(t.parentId!==l.parentId&&it(e,t.id),t.parentId=l.parentId,t.rotation[2]=l.rotation[2])}}))}else e((function(e){var t=e.elements.find((function(e){return e.id===E.current.id}));if(t&&t.parentId!==xt){t.parentId!==xt&&it(e,t.id);var l=Tw.getWorldDataById(t.parentId).rot;t.rotation[2]+=l,t.parentId=xt}})),ft(o);else if(P){var s=c(E.current.id);s&&s.parentId===xt&&dt(o)}}}if(Y.current){if(A!==V.None){Ue(t);var d=Te.intersectObjects([Y.current]);if(d.length>0){var u=d[0].point;switch(A){case V.Foundation:var f=n(D,u);f&&(e((function(e){e.addedFoundationId=f.id,e.objectTypeToAdd=V.None})),E.current=f,ue.current=!0);break;case V.Cuboid:var h=n(D,u);h&&(e((function(e){e.addedCuboidId=h.id,e.objectTypeToAdd=V.None})),E.current=h,he.current=!0)}}}if(E.current&&(ue.current||he.current)){Ue(t);var p=Te.intersectObjects([Y.current]);if(0===p.length)return;var y=p[0].point;if(E.current.type===V.Foundation)a(E.current.id,y.x,y.y);else if(E.current.type===V.Cuboid){var g=rt(t,E.current.id);if(g){if(0===(p=Te.intersectObjects([g.eventObject])).length)return;y.copy(p[0].point);var m=g.eventObject.name.split(" ")[1];e((function(e){var t=e.elements.find((function(e){var t;return e.id===(null===(t=E.current)||void 0===t?void 0:t.id)}));if(t){var l=Tw.getWorldDataById(m),a=l.pos,o=l.rot,i=(new Me.Vector3).subVectors(y,a);i.applyEuler(new Me.Euler(0,0,-o)),t.cx=i.x,t.cy=i.y,t.parentId=m,t.rotation[2]=-o}}))}else e((function(e){var t=e.elements.find((function(e){var t;return e.id===(null===(t=E.current)||void 0===t?void 0:t.id)}));if(t&&t.parentId!==xt){var l=Tw.getWorldDataById(t.parentId).rot;t.rotation[2]+=l,t.parentId=xt}})),a(E.current.id,y.x,y.y)}}}},children:I&&!R?Object(gf.jsx)("meshBasicMaterial",{color:z}):Object(gf.jsx)("meshStandardMaterial",{depthTest:!1,color:R?"white":z,map:R?Tw.WATER_TEXTURE:Tw.WHITE_TEXTURE,needsUpdate:!0})})]})},Cv=n.a.memo(Iv),Ov=function(e){var t,l,a,i=e.date,n=e.hourAngle,c=e.declinationAngle,s=e.worldLatitude,h=Ew(Kr),p=Ew(o.showSunAngles),y=null===(t=Ew(o.showAzimuthAngle))||void 0===t||t,g=null===(l=Ew(o.showElevationAngle))||void 0===l||l,m=null===(a=Ew(o.showZenithAngle))||void 0===a||a,w=Object(r.useState)(Tw.toRadians(42)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(Wy.a)(Iy),T=Math.max(2,.2*h),P=Math.max(.4,.025*h),S=Object(Se.e)(Me.FontLoader,ty),j=.05*h,H={font:S,height:0,size:j},z=new Array(13).fill(0);Object(r.useEffect)((function(){b(Tw.toRadians(s))}),[s]);var R=Object(r.useMemo)((function(){for(var e=new Me.BufferGeometry,t=new Me.BufferGeometry,l=[],a=[],o=bt/72,i=0,r=0;rAt&&(c=.05*h+(i%3===0?.2:0),(s=new Me.Vector3(h,n,0)).z=.002,a.push(Tw.sphericalToCartesianZ(s)),(s=new Me.Vector3(h+c,n,0)).z=.002,a.push(Tw.sphericalToCartesianZ(s))),i++}for(var d=3*l.length,u=new Float32Array(d),f=new Float32Array(d),p=new Float32Array(d),y=0;y-.01&&e.push(n)}return e}),[v,h,c]),C=function(e){for(var t=Ay(e),l=[],a=Ty(e,Tw.toDegrees(v)),o=Sy(a.sunrise),i=Sy(a.sunset),r=(i-o)/48,n=o;n-.01&&l.push(c)}return l},O=Object(r.useMemo)((function(){for(var e=[],t=0;t<=6;t++){var l=new Date(2021,0===t?11:t-1,22);e.push(C(l))}return e}),[v,h]),F=Object(r.useMemo)((function(){return Hy(h,n,c,v)}),[v,c,n,h]),k=Object(r.useMemo)((function(){return F.clone().normalize()}),[F]),Y=Object(r.useMemo)((function(){return new Me.Vector3(F.x,F.y,0).normalize()}),[F]),L=Object(r.useMemo)((function(){return Math.asin(F.z/F.length())}),[F]),E=Object(r.useMemo)((function(){var e,t=new Me.EllipseCurve(0,0,T,T,0,L,!1,0).getPoints(25),l=new Array,a=Object(f.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new Me.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[L,F]),U=Object(r.useMemo)((function(){return Math.acos(F.z/F.length())}),[F]),N=Object(r.useMemo)((function(){var e,t=new Me.EllipseCurve(0,0,.8*T,.8*T,L,vt,!1,0).getPoints(25),l=new Array,a=Object(f.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new Me.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[U,F]),V=Object(r.useMemo)((function(){var e=Math.acos(F.y/Math.hypot(F.x,F.y));return F.x>0?-e:e}),[F]),J=Object(r.useMemo)((function(){var e,t=new Me.EllipseCurve(0,0,1.2*T,1.2*T,vt,vt+V,F.x>0,0).getPoints(50),l=new Array,a=Object(f.a)(t);try{for(a.s();!(e=a.n()).done;){var o=e.value;l.push(new Me.Vector3(o.x,o.y,0))}}catch(i){a.e(i)}finally{a.f()}return l}),[V,F]),G=Object(r.useMemo)((function(){for(var e=2*vy/12,t=bt/48,l=new Me.BufferGeometry,a=0,o=[],i=[],r=-vy;rMath.PI&&(c=Math.PI),s>vy&&(s=vy);var d=Hy(h,n,r,v),u=Hy(h,c,r,v),f=Hy(h,c,s,v),p=Hy(h,n,s,v);(d.z>=0||u.z>=0||f.z>=0||p.z>=0)&&(o.push(d,u,f,p),i.push(a),i.push(a+1),i.push(a+2),i.push(a),i.push(a+2),i.push(a+3),a+=4)}return l.setFromPoints(o),l.setIndex(new Me.BufferAttribute(new Uint16Array(i),1)),l}),[v,h]),X=.05*h,B=2+5*X;return Object(gf.jsxs)("group",{children:[z.map((function(e,t){var l=Math.ceil(t/2)*(t%2===0?1:-1);-6===l&&(l=6);var a=function(e){return 0===e?.3*-j:e>0&&e<7?.8*-j:1.2*-j}(Math.abs(l));return Object(gf.jsx)("group",{rotation:[vt,l*Math.PI/6,0],children:Object(gf.jsxs)("mesh",{position:[a,0,1.1*-h],rotation:[-vt,0,0],children:[Object(gf.jsx)("textGeometry",{args:["".concat(-30*l,"\xb0"),H]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",color:"lightGray"})]})},t)})),Object(gf.jsxs)("mesh",{rotation:new Me.Euler(0,0,0),name:"Heliodon",children:[Object(gf.jsxs)("mesh",{children:[Object(gf.jsx)("bufferGeometry",Object(d.a)({},M)),Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,vertexColors:!0,polygonOffset:!0,polygonOffsetFactor:-.7,polygonOffsetUnits:-2})]}),Object(gf.jsxs)("lineSegments",{children:[Object(gf.jsx)("bufferGeometry",Object(d.a)({},W)),Object(gf.jsx)("meshBasicMaterial",{color:0})]}),Object(gf.jsxs)("mesh",{children:[I.length>3&&Object(gf.jsx)(Jl.a,{lineWidth:2,points:I,color:"yellow"}),O.filter((function(e){return e.length>3})).map((function(e,t){return Object(gf.jsx)(Jl.a,{opacity:0===t||6===t?1:.5,lineWidth:0===t||6===t?1:.5,points:e,color:"#999"},t)})),Object(gf.jsx)("mesh",{args:[G],children:Object(gf.jsx)("meshBasicMaterial",{side:Me.DoubleSide,color:[1,1,0],transparent:!0,opacity:.5,depthWrite:!1,clippingPlanes:[new Me.Plane(Ht,0)]})}),Object(gf.jsx)("mesh",{position:F,children:Object(gf.jsx)("sprite",{scale:[B,B,B],children:Object(gf.jsx)("spriteMaterial",{map:A,transparent:!1,color:16777215,blending:Me.AdditiveBlending,depthWrite:!1})})}),Object(gf.jsxs)("mesh",{position:F,children:[Object(gf.jsx)("sphereGeometry",{args:[X,10,10]}),Object(gf.jsx)("meshBasicMaterial",{color:"white"})]})]})]}),Object(gf.jsx)(Lt.f,{args:[1e4,1e4],renderOrder:-1,userData:{unintersectable:!0},children:Object(gf.jsx)("meshBasicMaterial",{transparent:!0,opacity:0})}),p&&F.z>0&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[F.x,F.y,F.z]],name:"Line from origin to sun",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[F.x,F.y,0]],name:"Line from origin to sun projection on ground",lineWidth:.5,color:"white"}),Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[F.x,F.y,0],[F.x,F.y,F.z]],name:"Line from sun projection on ground to sun",lineWidth:.5,color:"white"}),g&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:E,position:[0,0,0],rotation:new Me.Euler(vt,0,vt+V,"ZXY"),color:"white",name:"Elevation Angle Arc"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Elevation Angle",backgroundColor:"indigo",text:Tw.toDegrees(L).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:k.clone().multiplyScalar(T).add(Y.clone().multiplyScalar(T)).multiplyScalar(.65)})]}),m&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:N,position:[0,0,0],rotation:new Me.Euler(vt,0,vt+V,"ZXY"),color:"white",name:"Zenith Angle Arc"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Zenith Angle",backgroundColor:"navy",text:Tw.toDegrees(U).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:k.clone().multiplyScalar(T).add(Rt.clone().multiplyScalar(T)).multiplyScalar(.57)})]}),y&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},linewidth:.5,points:J,position:[0,0,0],color:"white",name:"Azimuth Angle Arc"}),Object(gf.jsx)("textSprite",{userData:{unintersectable:!0},name:"Azimuth Angle",backgroundColor:"firebrick",text:Tw.toDegrees(Math.abs(V-Math.PI)<1e-6?V:-V).toFixed(0)+"\xb0",fontSize:80,fontFace:"Times Roman",textHeight:P,position:Y.clone().multiplyScalar(T).add(Ht.clone().multiplyScalar(T)).multiplyScalar(1.1).add(new Me.Vector3(0,0,P/2))})]})]})]})},Fv=n.a.memo(Ov),kv=function(){var e=Ew(o.heliodon),t=Ew(Kr),l=Ew(i.latitude),a=Ew(i.date),n=Ew(Us),c=Object(r.useMemo)((function(){return new Date(a)}),[a]),s=Object(r.useMemo)((function(){return[Py(c),Ay(c)]}),[c]),d=Object(u.a)(s,2),f=d[0],h=d[1];return Object(r.useEffect)((function(){n(Hy(t,f,h,Tw.toRadians(l)))}),[l,f,h,t]),Object(gf.jsx)(gf.Fragment,{children:e&&Object(gf.jsx)(Fv,{date:new Date(a),hourAngle:f,declinationAngle:h,worldLatitude:l})})},Yv=n.a.memo(kv),Lv=l.p+"static/media/ifi-logo.eb360016.png",Ev=l(536),Uv=l.n(Ev),Nv=l(537),Vv=l.n(Nv),Jv=l(538),Gv=l.n(Jv),Xv=l(539),Bv=l.n(Xv),Kv=l(540),qv=l.n(Kv),Qv=l(183),Zv=l(836),_v=l(214),$v=l(835),eb=l(844),tb=l(296),lb=l(297),ab=l.p+"static/media/magic-lamp.b58f942d.png",ob=(l(217),function(e){var t=e.top,l=e.height,a=e.color,o=Ew(Vi),i=Object(r.useMemo)((function(){return{lng:o}}),[o]),n=t+56+"px",c=t+100+"px",s=t+205+"px";return Object(gf.jsxs)("div",{children:[Object(gf.jsxs)("div",{style:{position:"absolute",borderRadius:"20px",border:"thin",textAlign:"center",left:"15%",right:"15%",top:t+"px",height:(null!==l&&void 0!==l?l:300)+"px"},children:[Object(gf.jsx)("h2",{style:{marginTop:"20px",color:a},children:me.t("aboutUs.ProductBroughtToYouBy",i)}),Object(gf.jsxs)("p",{style:{fontSize:"12px",color:a},children:[Object(gf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-terms.html",style:{color:a},children:me.t("aboutUs.TermsOfService",i)}),"\xa0\xa0\xa0|\xa0\xa0\xa0",Object(gf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-privacy.html",style:{color:a},children:me.t("aboutUs.PrivacyPolicy",i)})]})]}),Object(gf.jsxs)("div",{children:[Object(gf.jsx)("hr",{style:{position:"absolute",left:"10%",width:"80%",marginTop:n,color:a}}),Object(gf.jsx)("table",{style:{position:"absolute",border:"none",top:c,left:"10%",width:"80%",fontSize:"small",color:a},children:Object(gf.jsx)("tbody",{children:Object(gf.jsxs)("tr",{style:{verticalAlign:"top"},children:[Object(gf.jsxs)("td",{children:[Object(gf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Software",i)}),"Xiaotong Ding",Object(gf.jsx)("br",{}),"Charles Xie",Object(gf.jsx)("br",{})]}),Object(gf.jsxs)("td",{children:[Object(gf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Content",i)}),"Elena Sereiviene",Object(gf.jsx)("br",{}),"Charles Xie",Object(gf.jsx)("br",{})]}),Object(gf.jsxs)("td",{children:[Object(gf.jsx)("h3",{style:{color:a},children:me.t("aboutUs.Support",i)}),"Elena Sereiviene",Object(gf.jsx)("br",{}),"Charles Xie",Object(gf.jsx)("br",{})]})]})})})]}),Object(gf.jsxs)("div",{style:{position:"absolute",left:"10%",marginRight:"10%",top:s,fontSize:"smaller",textAlign:"justify",color:a},children:[me.t("aboutUs.Translators",i),": ",N.Ukrainian," (Andriy Kashyrskyy), ",N.Spanish," (Alex Barco), ",N.Turkish," (Hasan Bircan)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("aboutUs.Acknowledgment",i),": ",me.t("aboutUs.FundingInformation",i)," ",me.t("aboutUs.Contact",i)]})]})}),ib=n.a.memo(ob),rb=mv.a.div(ev||(ev=Object(gv.a)(["\n position: absolute;\n top: 80px;\n left: 10px;\n display: flex;\n width: 600px;\n height: 400px;\n flex-direction: column;\n align-items: center;\n z-index: 1001;\n border-radius: 10px;\n background: dimgray;\n box-shadow: 3px 3px 3px 3px black;\n"]))),nb=function(e){var t=e.close,l=Ew(Vi);return Object(gf.jsxs)(rb,{children:[Object(gf.jsx)(ib,{top:10,color:"antiquewhite"}),Object(gf.jsx)("div",{style:{position:"absolute",fontSize:"small",color:"antiquewhite",cursor:"pointer",bottom:"10px"},onMouseDown:function(){t()},children:me.t("word.Close",{lng:l})})]})},cb=n.a.memo(nb),sb=l(232),db=l(231),ub=function(e){var t=e.name,l=Ew(si),a=Ew(Vi),o=Ew(i.cspTimesPerHour),r=Ew(i.cspDaysPerYear),n=Ew(i.cspGridCellSize),c={lng:a},s=Qv.a.SubMenu,d=db.a.Option;return Object(gf.jsx)(s,{title:me.t("menu.AnalysisOptions",c),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",c)+":"}),Object(gf.jsxs)(db.a,{style:{width:"72px"},value:null!==o&&void 0!==o?o:4,onChange:function(e){l((function(t){t.world.cspTimesPerHour=e}))},children:[Object(gf.jsx)(d,{value:1,children:"1"},1),Object(gf.jsx)(d,{value:2,children:"2"},2),Object(gf.jsx)(d,{value:3,children:"3"},3),Object(gf.jsx)(d,{value:4,children:"4"},4),Object(gf.jsx)(d,{value:6,children:"6"},6),Object(gf.jsx)(d,{value:12,children:"12"},12),Object(gf.jsx)(d,{value:30,children:"30"},30)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",c)})]},t+"-simulation-sampling-frequency"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsxs)(db.a,{style:{marginLeft:"150px",width:"72px"},value:null!==r&&void 0!==r?r:6,onChange:function(e){l((function(t){t.world.cspDaysPerYear=e})),Pf.setState((function(e){e.yearlyParabolicTroughYield=[],e.yearlyParabolicDishYield=[],e.yearlyFresnelReflectorYield=[],e.yearlyHeliostatYield=[]}))},children:[Object(gf.jsx)(d,{value:4,children:"4"},4),Object(gf.jsx)(d,{value:6,children:"6"},6),Object(gf.jsx)(d,{value:12,children:"12"},12)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",c)})]},t+"-simulation-sampling-days"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.GridCellSize",c)+":"}),Object(gf.jsx)($v.a,{min:.1,max:20,step:.05,style:{width:72},precision:2,value:null!==n&&void 0!==n?n:.5,onChange:function(e){l((function(t){t.world.cspGridCellSize=e}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",c)})]},t+"-simulation-grid-cell-size")]})},t+"-analysis-options")},fb=function(){var e=Ew(si),t=Ew.getState().elements,l=Ew(Vi),a=Ew(i.timesPerHour),o=Ew(i.daysPerYear),r=Ew(i.pvGridCellSize),n=Ew(i.discretization),c=Ew(i.noAnimationForSolarPanelSimulation),s={lng:l},d=Qv.a.SubMenu,u=db.a.Option;return Object(gf.jsx)(d,{title:me.t("menu.solarPanel.EnergyAnalysisOptions",s),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",s)+":"}),Object(gf.jsxs)(db.a,{style:{width:"72px"},value:null!==a&&void 0!==a?a:4,onChange:function(t){e((function(e){e.world.timesPerHour=t}))},children:[Object(gf.jsx)(u,{value:1,children:"1"},1),Object(gf.jsx)(u,{value:2,children:"2"},2),Object(gf.jsx)(u,{value:3,children:"3"},3),Object(gf.jsx)(u,{value:4,children:"4"},4),Object(gf.jsx)(u,{value:6,children:"6"},6),Object(gf.jsx)(u,{value:12,children:"12"},12),Object(gf.jsx)(u,{value:30,children:"30"},30)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",s)})]},"solar-panel-simulation-sampling-frequency"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsxs)(db.a,{style:{marginLeft:"150px",width:"72px"},value:null!==o&&void 0!==o?o:6,onChange:function(t){e((function(e){e.world.daysPerYear=t})),Pf.setState((function(e){e.yearlyPvYield=[]}))},children:[Object(gf.jsx)(u,{value:4,children:"4"},4),Object(gf.jsx)(u,{value:6,children:"6"},6),Object(gf.jsx)(u,{value:12,children:"12"},12)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",s)})]},"solar-panel-simulation-sampling-days"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.solarPanel.PanelDiscretization",s)+":"}),Object(gf.jsxs)(db.a,{style:{width:"165px"},value:null!==n&&void 0!==n?n:ae.APPROXIMATE,onChange:function(t){e((function(e){e.world.discretization=t}))},children:[Object(gf.jsx)(u,{value:ae.EXACT,children:me.t("menu.solarPanel.Exact",s)},ae.EXACT),Object(gf.jsx)(u,{value:ae.APPROXIMATE,children:me.t("menu.solarPanel.Approximate",s)},ae.APPROXIMATE)]})]},"solar-panel-discretization"),(!n||n===ae.APPROXIMATE)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.solarPanel.EnergyGridCellSize",s)+":"}),Object(gf.jsx)($v.a,{min:.1,max:5,step:.05,style:{width:72},precision:2,value:null!==r&&void 0!==r?r:.5,onChange:function(t){e((function(e){e.world.pvGridCellSize=t}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",s)})]},"solar-panel-simulation-grid-cell-size"),!Tw.hasMovingParts(t)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.solarPanel.SolarPanelSimulationNoAnimation",s)+":"}),Object(gf.jsx)(eb.a,{checked:c,onChange:function(t){e((function(e){e.world.noAnimationForSolarPanelSimulation=t}))}})]},"solar-panel-simulation-no-animation")]})},"solar-panel-energy-analysis-options")},hb=function(){var e=Ew(si),t=Ew.getState().elements,l=Ew(Vi),a=Ew(i.sutTimesPerHour),o=Ew(i.sutDaysPerYear),r=Ew(i.sutGridCellSize),n=Ew(i.noAnimationForSolarUpdraftTowerSimulation),c={lng:l},s=Qv.a.SubMenu,d=db.a.Option;return Object(gf.jsx)(s,{title:me.t("menu.AnalysisOptions",c),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",c)+":"}),Object(gf.jsxs)(db.a,{style:{width:"72px"},value:null!==a&&void 0!==a?a:4,onChange:function(t){e((function(e){e.world.sutTimesPerHour=t}))},children:[Object(gf.jsx)(d,{value:1,children:"1"},1),Object(gf.jsx)(d,{value:2,children:"2"},2),Object(gf.jsx)(d,{value:3,children:"3"},3),Object(gf.jsx)(d,{value:4,children:"4"},4),Object(gf.jsx)(d,{value:6,children:"6"},6),Object(gf.jsx)(d,{value:12,children:"12"},12),Object(gf.jsx)(d,{value:30,children:"30"},30)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",c)})]},"sut-simulation-sampling-frequency"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsxs)(db.a,{style:{marginLeft:"150px",width:"72px"},value:null!==o&&void 0!==o?o:6,onChange:function(t){e((function(e){e.world.sutDaysPerYear=t})),Pf.setState((function(e){e.yearlyUpdraftTowerYield=[]}))},children:[Object(gf.jsx)(d,{value:4,children:"4"},4),Object(gf.jsx)(d,{value:6,children:"6"},6),Object(gf.jsx)(d,{value:12,children:"12"},12)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",c)})]},"sut-simulation-sampling-days"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.GridCellSize",c)+":"}),Object(gf.jsx)($v.a,{min:.1,max:20,step:.1,style:{width:72},precision:1,value:null!==r&&void 0!==r?r:1,onChange:function(t){e((function(e){e.world.sutGridCellSize=t}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",c)})]},"sut-simulation-grid-cell-size"),!Tw.hasMovingParts(t)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"320px"},children:me.t("menu.solarUpdraftTower.SolarUpdraftTowerSimulationNoAnimation",c)+":"}),Object(gf.jsx)(eb.a,{checked:n,onChange:function(t){e((function(e){e.world.noAnimationForSolarUpdraftTowerSimulation=t}))}})]},"solar-updraft-tower-simulation-no-animation")]})},"sut-analysis-options")},pb=function(){var e=Ew(si),t=Ew(Vi),l=Ew(i.timesPerHour),a=Ew(i.daysPerYear),o=Ew(i.solarRadiationHeatmapGridCellSize),r={lng:t},n=Qv.a.SubMenu,c=db.a.Option;return Object(gf.jsx)(n,{title:me.t("menu.building.EnergyAnalysisOptions",r),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",r)+":"}),Object(gf.jsxs)(db.a,{style:{width:"72px"},value:null!==l&&void 0!==l?l:4,onChange:function(t){e((function(e){e.world.timesPerHour=t}))},children:[Object(gf.jsx)(c,{value:1,children:"1"},1),Object(gf.jsx)(c,{value:2,children:"2"},2),Object(gf.jsx)(c,{value:3,children:"3"},3),Object(gf.jsx)(c,{value:4,children:"4"},4),Object(gf.jsx)(c,{value:6,children:"6"},6),Object(gf.jsx)(c,{value:12,children:"12"},12),Object(gf.jsx)(c,{value:30,children:"30"},30)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",r)})]},"building-energy-simulation-sampling-frequency"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsxs)(db.a,{style:{marginLeft:"150px",width:"72px"},value:null!==a&&void 0!==a?a:6,onChange:function(t){e((function(e){e.world.daysPerYear=t}))},children:[Object(gf.jsx)(c,{value:4,children:"4"},4),Object(gf.jsx)(c,{value:6,children:"6"},6),Object(gf.jsx)(c,{value:12,children:"12"},12)]}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.DaysPerYear",r)})]},"building-energy-simulation-sampling-days"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.building.EnergyGridCellSize",r)+":"}),Object(gf.jsx)($v.a,{min:.1,max:5,step:.05,style:{width:72},precision:2,value:null!==o&&void 0!==o?o:.5,onChange:function(t){e((function(e){e.world.solarRadiationHeatmapGridCellSize=t}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",r)})]},"building-energy-simulation-grid-cell-size")]})},"building-energy-analysis-options")},yb=l(421),gb=l(422),mb=l(423),wb=l(424),xb=l(425),vb=l(426),bb=l(427),Ab=l(428),Tb=l(429),Pb=l(430),Sb=l(431),jb=l(432),Hb=l(433),zb=l(434),Rb=l(435),Db=l(436),Mb=l(437),Wb=l(438),Ib=l(439),Cb=l(440),Ob=l(441),Fb=l(442),kb=l(443),Yb=l(444),Lb=l(445),Eb=l(446),Ub=l(447),Nb=l(448),Vb=l(449),Jb=l(450),Gb=l(451),Xb=l(452),Bb=l(453),Kb=l(454),qb=l(455),Qb=l(456),Zb=l(457),_b=l(458),$b=l(459),eA=l(460),tA=l(461),lA=l(462),aA=l(463),oA=l(464),iA=l(465),rA=l(466),nA=l(467),cA=l(468),sA=l(469),dA=l(470),uA=l(471),fA=l(472),hA=l(473),pA=l(474),yA=l(475),gA=l(476),mA=l(477),wA=l(478),xA=l(479),vA=l(480),bA=l(481),AA=l(482),TA=l(483),PA=l(484),SA=l(485),jA=l(486),HA=l(487),zA=l(488),RA=l(489),DA=l(490),MA=l(491),WA=l(492),IA=l(493),CA=l(494),OA=l(495),FA=l(496),kA=l(497),YA=l(498),LA=l(499),EA=l(500),UA=l(501),NA=l(502),VA=l(503),JA=l(504),GA=l(505),XA=l(506),BA=l(507),KA=l(508),qA=l(509),QA=l(510),ZA=l(511),_A=l(512),$A=l(513),eT=l(514),tT=l(515),lT=l(516),aT=l(517),oT=l(518),iT=l(519),rT=l(520),nT=l(521),cT=l(522),sT=l(523),dT=l(524),uT=l(525),fT=l(526),hT=l(527),pT=l(528),yT=l(529),gT=l(530),mT=l(531),wT=l(532),xT=l(533);!function(e){e[e.NO_BUILDING=3]="NO_BUILDING",e[e.AT_LEAST_ONE_BAD_NO_GOOD=2]="AT_LEAST_ONE_BAD_NO_GOOD",e[e.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD=1]="AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD",e[e.OK=0]="OK"}(tv||(tv={}));var vT,bT,AT,TT=function(e,t,l){if(0===t(V.Foundation))return{status:tv.NO_BUILDING};var a,o=!1,i=!1,r=void 0,n=Object(f.a)(e);try{for(n.s();!(a=n.n()).done;){var c=a.value;if(c.type===V.Foundation){var s=c;if(s.notBuilding)continue;if(l(V.Wall,s.id).length>0){var d=Tw.getBuildingCompletionStatus(s,e);d===D.COMPLETE?o=!0:(i=!0,r=d)}else i=!0}}}catch(u){n.e(u)}finally{n.f()}return i&&!o?{status:tv.AT_LEAST_ONE_BAD_NO_GOOD,buildingCompletion:r}:i&&o?{status:tv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD}:{status:tv.OK}},PT=function(e){if(!e.color)return.5;var t=e.color.toLowerCase();if("white"===t)return.05;if("black"===t)return.95;var l=parseInt(e.color.substring(1),16),a=l>>16&255,o=l>>8&255,i=255&l,r=Math.min(a,o);r=Math.min(r,i);var n=Math.max(a,o);return n=Math.max(n,i),Math.min(.95,Math.max(.05,1-(r+n)/510))},ST=function(e,t,l,a){return t<0&&e.low>=l-a||t>0&&e.high<=l+a?0:t},jT=function(e,t,l,a,o,i){if(l===U.Sinusoidal)return.5*(e+t)-.5*(e-t)*Math.cos(yy*(i-(a-720)));var r=.5*(e+t),n=.5*(e-t),c=o.daylight();if(i>o.sunrise&&io.sunset){var u=i-o.sunset;return t+(d-t)*Math.exp(-6*u/s)}var f=i+1380-o.sunset;return t+(d-t)*Math.exp(-6*f/s)},HT=function(e,t,l){var a,o,i,r=e.getFullYear(),n=e.getMonth(),c=e.getDate(),s=Tw.daysOfMonth(n,r)/2;if(c11&&(o=0),i=(c-s)/(s+Tw.daysOfMonth(o,r)/2)}return{low:t[a]+(t[o]-t[a])*i,high:l[a]+(l[o]-l[a])*i}},zT=function(e,t,l,a,o,i,r,n,c){return function(e,t,l,a,o,i){for(var r=l.length,n=0,c=-1e3,s=1e3,d=-1e3,u=1e3,f=0;fa[f]&&(s=a[f]),u>l[f]&&(u=l[f]);n/=2*r;var h=.25*(c-s+d-u),p=i*Math.sqrt(gy/(2*o));return e>0?n-h*Math.exp(-p)*Math.cos(gy*(t-30)-p):n-h*Math.exp(-p)*Math.cos(Math.PI+gy*(t-30)-p)}(e,t,a,o,n,c)-Math.exp(-c*Math.sqrt(yy/(2*n)))*r*Math.cos(yy*(l-(i-720)-120))},RT="data:image/png;base64,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",DT="data:image/png;base64,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",MT="data:image/png;base64,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",WT="data:image/png;base64,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",IT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMGFRYh70JghAAAA3pJREFUWIXtlz2MVFUUx39ndnf2g4fDwAIiEZBAWCRAKAADFmpiYaVSkPhKCqdQGhLCNyEWhIqK5gEhVK/hoyBWWAixMGrURGQtdo0JMRBhyLDLYyHD7hyKe9/M5e278LKJbMNJJjM5957//Z97/+fcO6KqzKaVZnX11wSA7jyniPQDqTgUaAJdQI/jn1TVSUQEkDQUUFRbRQmIK0IReQv4BFgEuCBSBRrQqtjFxqAPmLJJdDkEWsAtoA7Myfh/VtXRXAI26z3A+8A1J6gCfArcBH6xCyqwBPgM+AcYAVg2OKi36vVSZWBg09jExBOLU7Y4a4B7wGFVvZsScI9gIbAZOBPFySWXZS0MzkVxsgvYmfGfiuLka+ADMlYLg5NRnBzK+L4DhoA2gbYIqybTvuzi1rpyfADVWhjs8YzNyfH9C7wrIm28NoEGvBOUy+MesKkX+Od5xgZyfL8CW4AFzxEQke4KrE2azdGcIIAnHv8w8MAzNpF1RHFyqtJfDoDB1CeqmgrwLLAC+NGJaQEbgfnATy6RJZXK3DtjY+sxx3MTeAzcAR5ZnA9txjfoHGET+BI4oqqXoSPCfmAwipNtwDaX9e4wuNAEieLkK9dfC4NvgLXAU+C+Be+qQm8DxjGVshz4A+i1YT3A38BWEflWVZspgeU2g2nWhN9sBh+7/ihOju4PgwMN0ChOTmTjamFwHJiK4uRkdmx/GJQa8AZQT0W4DridRwB4E48GGqZXLPXE3Sa/EmgY8a6EThVsAH73APXhF1o3sNgzNo6j9oz9iWl4bQKbozg57ZlcxV8FI8BDz9h/GG1NsyhODmYJrPaApObb5rfL5izzbAhYVAuDvZ7xLdApwzpwEaNccSYpMInZ6tRfcn6nDSqvU6qDl8UE+FxVF2Ivo1En4FV9hlW13QduAJHNSOyEEqZ+3TeAYC6S+5iyTeemb4Ui1rK4x6BzBKuBHRYoZdiNuSHn8vxd8BjTdN7DiDPAXLN/OSTd76yl1/yIqp6Wmb6KReQgpu0uA66r6pWZ4OQ+yXIWWwp8hKn5ScxObQfOY3Znp4iswmRWwuzSdVUdfim4qr70A3wBXKG4wC4C+4pgF30V92DOuqgFdC6gF1qhIwB+wHS1q5jbL63tNAFXpCXMMX1fBLiwCMU8v3vJbypZxTdV1feKmhmB/8tm/Z/RawLPAA7AbYJpF785AAAAAElFTkSuQmCC",CT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAAG9IFmxgAAA+9JREFUWIXFl21oW2UUx38nuWnasdJUmfRDTcOTK2WglSH2i3WjOD9MRdiGzreB4Ms2OlbBwiZMEVSaKqMTlllZrIIyQVY/iDoQHDLB6dDCcFCUm1vNhy2Kbfoia9pkPX5YO7I0L7epsAcuuc9zzvn//885z7k8EVXlZg7fTWUHrLUCiEg7sBFYBLKq+s2q4mstgYjcZ4x5JJ/Pi9/v/2V8fPwSsAMYU9WEV5xVZ0BENgCvA4uu68Zj8fRYoT0x2IWIjKrq6JoFiMgmoAsYUdVLItItInsikcjInr5znwH7S8X5fL7DXMtG7QJEpAM4YIw577pur4icBB7vP3Z5F7CrEqgxZruIBFV1vpqASl1wlzEmnUwm3wPWAzOxeHpvJbDjA50DBdOWauRQ4RCGQqHm6enp/cCGxsbG57LZ7I+5XO4sMAG4sXj6q+KYxGDX9feJiYm2ycnJVDUBZTMwNTWVAU4DR2ZnZz/3+XzNwChwEbi92P9QT8vRwnkmk/H0jSnrJCKbReTlWDz9B3B+fn7+DRF5GvgzFk8PFZE/YNv2S0UQf9csIBQKNft8vr7+Y5efWFr61xizoKqvWJY1VOxv2/a3hfNkMnlKVa/ULKCpqelgW1vbx8vzWDw9nM/n74zF024+nz9Q6FtY9+Whqp96IYcSh1BENvmtun1vvZt6oVrw4d7W05FIZFvxuuM4AVXNexFQKgM7PJJ/XYZ8m1fyFQJEJAKEqgUlBruIRCIPlTGPeyVfIQBoBy6Ucz7U0/JoqZovD8dx7gV61iKgFfirDPkJ27a/qEC+UVV/BhZEZEutAn4AugsXjg90DiQGu7Btu+S5SKVS3y29/rP0+0E0Gn3Kq4BSXbDTtu1TXoIdx3kRGA4EAmdyudyzqjq+hPE28KWqnq2GsaILVHXEcZxWx3H6KxC/6ThOg6qeUNWrItIAFO7kQ+AZL5tAVSs+wLrlx9yztQn4BAgW2K26urqfgEhR3DvAlqr41RyKQPuMMfuK1soJaAeGqmF6vhW3dXQ0BwKBB13X/chjZn8DZqt1hGcBqV8v9uZyuXOqOuc1BhgGnlyzABG5VYLrOtn62OAqyFHVMWPMoohsruTkpfavhcPhg2VsJc9Agf3uaDT6fjnsqtdyEWmpr2/oTqVSO1ez+4INXhCRGRG5X1W/L7Z7KcHz2excQlUnyxDkgavATAWMI8D2UoYbMiAiPuBhrvU9QKB+fWh3w223HBWRkldxY4zfsqw7FhYWdotIuoyAXDAY7BaRV4HfC9bP3PApFhE/sNcY0wjguq4Ac4BljClbLtd1r4TD4QbLsqSCzzxQb4y5TpjJZE7W/N/w/xr/AaOLRG68/t4OAAAAAElFTkSuQmCC",OT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAITq2rgrwAABI5JREFUWIXFl21MU1cYx/+nSCiUVrhQKND2IiGuCfISmzgWhkAhEx04MqUIjBCXbczsA8v4QIjomA41bgRZt+w1cQpIvC5ghsZBwBFmEJ0yFzNfsuHKW6FAoYRutkB79mGylGKhBSZPcj+c+/zP8/vnPOfck0sopVjP4K0rHcCGtSxGCOGl794dq4jcnLpRtFHlxQ8KLit9S7nknNW2oKioSDEzR1V+fn4qgZhRCUX7/e3ztzs6fTgu+7Gz+W6vgLe3tywzMzPVV7RRJRAIVBGxR8KW0mcV+iQAaFuxAbVaLfb05CebzeZUX19BakWVNtIdw16W2dylDCxqASFEGBUTkyRmAlVCkVCVsOPLWHeAT4u05wdDU9JSXpo2Tt+klN53aiAhMemgr0DwAcMwHnEvVq2WCwDYxHSgurpKp9Pr6ZRxqsJoNH5jn1/QgrCQ4G3KZI3HWoBjwntQX3sGLcPDyMnZF/rzjRs/NDU3jzvqHPYAj1kLuPbOIVw69xvSVKmITqyBBUBMUn76LKXXAFxcQLQfePsInB4XV2Lyz4/QXJcFgY8PMvIawZe8syCvTNZ8WF5Rke7UAN/bS7sSsG3ia1w69yomDBPIfO0ixJvLnGqFQQeulB+uOEII8QIcWmCjpAvAm66Cfa0cmpoaESQWIyOvESnbBvHjzeXnCSUHDhW/Z4oBkLXgFKjVakaZrDEsVyBM2IrzDQ0AgH25eXguagvau0Nc9Y2+e8e4zz/75A1K6fSi70B1zadfzXhmP3UVFKHdON9Qj9GxMezZsxfxCYlo7Qp2Gax/VDU7Pjpacvbst5r5d4sMqC9ckCjHtg87Tu69XYb7Dx5i186d4DEud+m/GHhwfGB0RLeX47gFTVp0HXPZ2SMSYfvr8+Ox34+juS4LAUwAMvIbkZa+y234H7+8f2V0RBfnCAeWuA3z89W3+rSDyuioLQiPO4q0F0bQdl3iFrjvXqXNaJw43FBff4w6ATk1IJfLr+Xn5Hio8wvi3ekzAEwOaGAwGPRTRkMex3FXl9I6vQ2tNut4a0vL0fjElGIguMBVuP5RFcZGxzvrak/nUkp1y+l5AMCybBohROiY7Ll715r1ysuFEeLO8uUKjWtPYejhCWi12pN1tadTXYED8ytAcEYml80QQvZTSjvsBU96V6lWq2eUyZqTjgUM/TWwWCyYMEwaLWZTYeN33PeugOeDBwD9ff1xVqv1VzacvSoJkZwihHjPCwghW6UyaVvX9a4dJ0ojt+t7P64G/u2zvrcKf5lMGB429VjMpq0c5x4ccNiEIpGoQCwWa2bnZkcopZM2apv04HmE6oZ0pXNzcy3zuqKioujH5tlKPt8rUzc09MXly83vUkot7sIBAJTSBQ+AsDBpWAsbztqkUmk7AL6jxk4rdZZz9XFWmPj7+7/NhrMmmVx2B0DsakFuGbAzsikiIuInlmUtgYGBBwF4PFMDT0zw/AP8S+Ss3CyVSbsBKJ6pATsjCoVCcYsNZ/9mGKZ4rQy49WdECNkQGBRYJvIVlQBge3t7p1a08+1rumPg/4h1/zv+B255SgboD8yRAAAAAElFTkSuQmCC",FT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAEbjpw7XgAAAlxJREFUWIXl18+LVWUcx/HX1wxdRVHhbWEgDEKSVtKAuGhhm8BFgX/A2ErkLmbR2FyGsIakjht3N8EgNFu1kAwECUpchD8KFJyhggxiRC5UFCFBi/q6uPcOp+HMnTv3XseoLzxwznOeh8/7+Xy/z3POicx0P2PdfVX/XwBExFhEfBQRp6uer7+XwnijaLYmSn3NzLx8TwGqhEtxPCJ2ZqnyY1S7ICJ2Ybpotl7pNa5Rr01k5ofd+6EdiIgnMVM0Wwf6nFJExJnMvMMQDgwgvBiNeu3dzJxhAAci4gltqydXO7cUz3Qv+gYYhXCjXvsJr2bmub4BRrRijXrtS3xRFqdHDUTEY5gqmq3pIYUP4zucxHxmjq8IEBGBH4tma/MQwu/hbbyIWZzH0cxcKI+rTEFmZkS8g+MDCH+CBh7Hp7iFlzLz+6rxvVLwAG4UzdZTfQpfwRRu4yi24LXMvNhr3rJFmJl/RcQl9ARo1Gs3tVf8OWawT9vy05n590rgK70NFxr12qVlhH9p1GuT2IFNuIY7eDozT/Uj3g8AfFwhXmAMN/EVnsfuzJzNzD/6EV6MzNSpg4e716W+t7Afh4pmK3EKm7Edn+ECnls6bzWtLPYzPsBDFQDr8Ii21SfwDV4eRrjbyinYjW2Yi4g9S4zagIO4innsyMyzq7J6mfjHNuxsvdfxJt7H73hU+zA5h9nM/HUUwotRmZd2jq/jN3yNraOwu2cNVEA8iCP4U/tg2bCmACWQcXyLOTy75gAdiI041nHjMNavKUAJ5AX8gL2jAhjZV/Gg8d//NfvXA9wFb2zsOT1cv34AAAAASUVORK5CYII=",kT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAMxZxGQCgAABAFJREFUWIXVl11sU2Ucxp//e/bRdnaZ2dZslq7lrTdIjEODgRWjF0YMciNw4RJNVOiIEqMbJCbGj4QElbBNvTFju1GjxguDCSbGaPACtkEMEcSvgOvpFtM1dGUTqqltd97HC4EU2LoOOgnP5Xn+5/973jfvxzlCEjdT6qbSb8kAfr9/bTAY7BCR2koEkHLXgIh4tNYDAFYC+EtE6owxZ0ieyOVyh5LJ5EmSZkkCBAKB+10u1yfGmB+7do5uLvaG+iODADoAkORJkodzudzhRCJxpiIBtNavKKWei/aMLCun4f7etQdEJARgluRvjuN8m8/nh5PJ5MSiAtTV1bW0tLR8CkB17Rx9sBz4HGH2KqUiAHwAUsaYYySPpNPp0Uwmk543QCgU2mRZ1rskP9y+6+ir1wOfSwP71vQppe4WkTtE5PdsNrv3igAiYoXD4fcBrI/2jAQrBZ5Lg30dr5PsvLwN/X5/u9b6FMnGpYYDAMmnjDG7qwAgFAo97/F43tjWPewDcNdSwwFARN4ZHx//rEprvc+yrPsuwpdcQ/2RPwuFwgsTExMfA/+dhBtIDv8fcAAoFAqbL8EBQNra2nR1dfVuku0i8lO0Z+SJSkMH9q3Zo5R6NpvNbpycnPyh2Lu8C3w+351er/dpEXkcQCHaM3JPheB9SqknZ2ZmVk9PT/9xtX/NOSAiNcFgcGNVVdVWAMsAHIv2jHRdD3x/79oPRGRlKpV6LJPJTM1VU/Iobm1tXeHxeLaJyMMkJ7t2jj66CPgXAALxeDxCMj9fXVmXkYjUaK23iMhWACFjzMHtu46+VAJ+HIAdj8c7F7ohy76OL6m5ubm1vr5+h1IqSvJQtGeks9gf7Os4RfJX27Y75+tRrKpyikTE29bWtt6yrEhDQ4OfpNtxHFtEVgPAUH8k5TjOQaXUQyS/s227u9wBlZwBEblNa/2miKwDMGOM+dkYc2J2dvZsTU3NMwAskh+RvN2yrIiIrCKZI/mVbdt7biiAz+cLe73ebwB8nclk+lOpVKzYX758+ZdKqYZYLPZA8XO/37/K7Xa/ZozxxePx9ST/LhVg3m9Cr9f7HskDsVhsx9VwABARm+QvInJFj0QicWJsbGwTyZlgMPhyKThQYg0YY5pJfj6fb9v2i6Uak5wUkcaFAsw7A/l8vtuyrLe01tsWalIsEanXWu+1LOuR8+fPv71gfalFGAgEVtfW1vYCcJH83hhzpFAonM5ms+eUUg4AOI5T7Xa7G10u1woAG0TkXpLHp6amui9cuHDuhgJcUjgcXkdyi4i0k/SKSDXJhov22YsjT5I8msvlDiQSidMLNl1MgGteEqlvamqqA4B0Oj1D8p9FN7mRAJXUrfdvWGn9C2kU6SwCYsgLAAAAAElFTkSuQmCC",YT="data:image/png;base64,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",LT="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wISEAMwVpeN8QAABaZJREFUWIWtll9Mk1cYxp9zvn7tKgUDaZqKq4QKJab9KojUDWK2AOI08d8GS7ZsgEaSxXnhsl0NL5bs0pi4ZEu2BC42TBZdtrhkQ8JwSDROSSWABf80BSNNqWtaawvW9mvP2cUGoe1HC9Pn8pz3PO+vPe/7no9gnWKMGdxu98779+9XqVSqbYwxiKI4YzQapyRJclJK59fjR9YaGAqFGgYGBj598OBBy5MnTwqi0ShkWQYAiKIIrVaLkpKSxNatWwebmprOmkymqy8FgHOu6e/vPzc6OvqRx+NBJBIBpRSCIKTFMcaQSqWg0+lQVlYGh8Px9eHDh08TQp7m8lflSV7U19f3282bN3fPzc1BrVZDrVYrxgqCAEEQEI/H4XK5EA6HTz59+rSec95CCAmuG4Bzrurt7b107dq13eFwGBqNJhfrsggh0Gg08Pl8GB4e3pFIJPoZY29QSp8rgq9mVF1dffb69evvBQIBiKKoBIhUKgXG2HLiNGNBwLNnzxCJRDbLsrz54sWLvyrloUqL8/PzjvHx8VNerzcr+dJdFxUVwWw2w2w2o7i4eHl9pURRhN/vx+3bt496PJ4mpVyKVzA4OPj5zMxM1n0nk0kUFhZCkiR/ZWXlT+Xl5aOEkNTs7KzV7XYfvXv3bmkwGEyDFkURDx8+xPDwcDeAK3kBGGOl3d3djZFIJM2IMYbCwkI0NjZe6ejoeJ9S+nfGua8uXLjw/dDQ0L5QKLTcJYQQLCwswOPxvB6LxcxarXYmJ8Do6GhTNBotpDT7dux2+3xnZ+fbhJBI5h6lNMA5fycQCEyOjIxUrNwTBAHRaPQVp9O5D8A3aecyjbxer2NxcRErARhjMBgMqKmp6VFKviRCSGz79u3fGo3GtHqglGJhYQF+v78uCzxzIRwOvxqPx9OqmjGGDRs2oLKycmS15Euy2Ww3CgoKlrvjPzDE43EEAoHCvADJZHJVc1EUE/kABEGIc86z1jnnSCQSWeZZABs3bgyrVCqsNFn6BW63e1c+gHv37lkXFxezRrVKpUJJSUnW6M8CKC4udmm12jQAQRDw+PFjuFyuds654uxY0vj4+IlgMJhVQ1qtFnq9/k5eALvdPqLT6VKZQyWZTMLlcklDQ0M/cs4VH7HLly+fmZiYeC0ej2ed1ev1qK6uvpoXoLS01GkymSYyZ79KpYLP58OlS5fe7e3t/WtsbOxDxpiVMWZ1Op1tPT09fw4MDHzm8/mgUqV3t1qthsFguLNp06YbmfkUJ2FDQ8M5r9f7g9vtzppqXq8XwWBw1+Tk5C6NRiNTShGPx0W/349YLJY1umVZRnl5OaxWazchJJWZSxFg586dfVNTU8fm5+ffjMViafcpiiJkWcajR4/AOReBf4tUEATFd6OgoABWq/XGnj17flfKpQhACAHnvN3v97tu3bpVpLSf+TcriTEGm80WPX78+AeEEKYUs2pFE0LmWlpajlksFiQSeds/S4lEAhaLBc3NzScIIbOrxeVsqR07dvzscDi+MxqNOQdUppLJJAwGA+rq6s47HI7zuWJzAgDAkSNHTkmSNK3RaKA04TLFOYcoipAkaaa1tfXjfPF5ASilzw8dOtRRVVWVyJwNSkomk7BYLOzAgQOduR6uNQMAwJYtW5wNDQ2ny8rKlj/FlSTLMkwmE+rr6780m83X1uK9JgAA2Lt375mampo/ioqK0l66JTHGoNPpYLfbr+/fv/+LtfquGQAA2tvbO202W0ipFhhj2LZtW6Srq6s98wP1pQFQSn3Nzc1dVVVVaa0pyzIqKirQ2Nh4MlfLvTAAANTW1v5SW1u73JqpVAp6vR51dXXn6+vr+9brt24AAGhtbf1EkqRpURQhCAIkSZpta2s78X+88s9TBRFCYj6frz0UCjlTqRQOHjzYQSmN/h+vF9L09PSesbGxt17E4x8mG2w5UeFuxAAAAABJRU5ErkJggg==",ET=l(563),UT=l(804),NT=l(805),VT=l(32),JT=l.n(VT),GT=l(534),XT=l.n(GT),BT=db.a.Option,KT=function(e){var t,l,a,o=e.setDialogVisible,i=Ew(si),n=Ew(Gi),c=Ew(Vi),s=Object(r.useState)(Ew.getState().modelType),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(r.useState)(null!==(t=Ew.getState().modelAuthor)&&void 0!==t?t:XT()()),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(null!==(l=null!==(a=Ew.getState().modelLabel)&&void 0!==a?a:Ew.getState().cloudFile)&&void 0!==l?l:null),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(Ew.getState().modelDescription),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],D=H[1],M=Object(r.useState)({left:0,top:0,bottom:0,right:0}),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(null),F=Object(r.useRef)(null),k=ET.a.TextArea,Y={lng:c};Object(r.useEffect)((function(){var e;null===(e=F.current)||void 0===e||e.focus()}),[]);return Object(gf.jsxs)(Zv.a,{width:560,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return D(!0)},onMouseOut:function(){return D(!1)},children:me.t("menu.file.PublishOnModelsMap",Y)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){o(!1)},children:me.t("word.Cancel",Y)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:F,onClick:function(){Tf.setState((function(e){e.publishOnModelsMapFlag=!0})),i((function(e){e.modelType=f,e.modelAuthor=g,e.modelLabel=v,e.modelDescription=P})),Tf.getState().setChanged(!0),n&&i((function(e){e.actionInfo={name:"Publish on Map of Models",timestamp:(new Date).getTime()}})),o(!1)},disabled:!g||!v,children:me.t("word.OK",Y)},"OK")],onCancel:function(){o(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!z,bounds:I,onStart:function(e,t){return function(e,t){if(O.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=O.current.getBoundingClientRect();C({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:O,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:me.t("shared.ModelType",Y)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:f,onChange:function(e){h(e)},children:[Object(gf.jsxs)(BT,{value:R.UNKNOWN,children:[Object(gf.jsx)("img",{alt:"Building",width:24,src:LT,style:{marginRight:"8px"}}),me.t("word.Unknown",Y)]},R.UNKNOWN),Object(gf.jsxs)(BT,{value:R.UNDER_CONSTRUCTION,children:[Object(gf.jsx)("img",{alt:"Building",width:24,src:YT,style:{marginRight:"8px"}}),me.t("word.UnderConstruction",Y)]},R.UNDER_CONSTRUCTION),Object(gf.jsxs)(BT,{value:R.RESIDENTIAL_BUILDING,children:[Object(gf.jsx)("img",{alt:"Residential Building",width:24,src:RT,style:{marginRight:"8px"}}),me.t("word.ResidentialBuilding",Y)]},R.RESIDENTIAL_BUILDING),Object(gf.jsxs)(BT,{value:R.COMMERCIAL_BUILDING,children:[Object(gf.jsx)("img",{alt:"Commercial Building",width:24,src:DT,style:{marginRight:"8px"}}),me.t("word.CommercialBuilding",Y)]},R.COMMERCIAL_BUILDING),Object(gf.jsxs)(BT,{value:R.SCHOOL_BUILDING,children:[Object(gf.jsx)("img",{alt:"School Building",width:24,src:MT,style:{marginRight:"8px"}}),me.t("word.SchoolBuilding",Y)]},R.SCHOOL_BUILDING),Object(gf.jsxs)(BT,{value:R.TOURIST_ATTRACTION,children:[Object(gf.jsx)("img",{alt:"Tourist Attraction",width:24,src:WT,style:{marginRight:"8px"}}),me.t("word.TouristAttraction",Y)]},R.TOURIST_ATTRACTION),Object(gf.jsxs)(BT,{value:R.PHOTOVOLTAIC,children:[Object(gf.jsx)("img",{alt:"Photovoltaic",width:24,src:IT,style:{marginRight:"8px"}}),me.t("word.Photovoltaic",Y)]},R.PHOTOVOLTAIC),Object(gf.jsxs)(BT,{value:R.PARABOLIC_DISH,children:[Object(gf.jsx)("img",{alt:"Parabolic Dish",width:24,src:CT,style:{marginRight:"8px"}}),me.t("shared.ParabolicDishElement",Y)]},R.PARABOLIC_DISH),Object(gf.jsxs)(BT,{value:R.PARABOLIC_TROUGH,children:[Object(gf.jsx)("img",{alt:"Parabolic Trough",width:24,src:OT,style:{marginRight:"8px"}}),me.t("shared.ParabolicTroughElement",Y)]},R.PARABOLIC_TROUGH),Object(gf.jsxs)(BT,{value:R.FRESNEL_REFLECTOR,children:[Object(gf.jsx)("img",{alt:"Fresnel Reflector",width:24,src:FT,style:{marginRight:"8px"}}),me.t("shared.FresnelReflectorElement",Y)]},R.FRESNEL_REFLECTOR),Object(gf.jsxs)(BT,{value:R.SOLAR_POWER_TOWER,children:[Object(gf.jsx)("img",{alt:"Heliostat",width:24,src:kT,style:{marginRight:"8px"}}),me.t("shared.HeliostatElement",Y)]},R.SOLAR_POWER_TOWER)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Publisher",Y),":"]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(ET.a,{maxLength:30,style:{width:"100%"},value:null!==g&&void 0!==g?g:"",onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){m(e.target.value)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Label",Y),":"]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(ET.a,{maxLength:50,style:{width:"100%"},value:null!==v&&void 0!==v?v:"",onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){b(e.target.value)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Description",Y),":",Object(gf.jsx)("br",{}),Object(gf.jsxs)("span",{style:{fontSize:"10px"},children:["(",me.t("word.MaximumCharacters",Y),": 200)"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(k,{rows:5,maxLength:200,style:{width:"100%"},value:null!==P&&void 0!==P?P:"",onChange:function(e){S(e.target.value)}})})]})]})},qT=n.a.memo(KT),QT=db.a.Option,ZT=function(e){var t,l=e.saveAs,a=e.setDialogVisible,o=Ew(si),i=Ew(Gi),n=Ew(Vi),c=Object(r.useState)(null!==(t=Ew.getState().projectInfo.type)&&void 0!==t?t:M.SOLAR_PANEL_ARRAY),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(Ew.getState().projectInfo.title),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(Ew.getState().projectInfo.description),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)({left:0,top:0,bottom:0,right:0}),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useRef)(null),D=ET.a.TextArea,W={lng:n};return Object(gf.jsxs)(Zv.a,{width:560,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return P(!0)},onMouseOut:function(){return P(!1)},children:me.t(l?"menu.project.SaveProjectAs":"menu.project.CreateNewProject",W)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){a(!1)},children:me.t("word.Cancel",W)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:function(){Tf.setState((function(e){l?e.saveProjectFlag=!0:e.createProjectFlag=!0})),Tf.setState((function(e){e.projectType=d,e.projectTitle=y,e.projectDescription=x})),i&&o((function(e){e.actionInfo={name:l?"Save Project as":"Create New Project",timestamp:(new Date).getTime()}})),a(!1)},disabled:!y,children:me.t("word.OK",W)},"OK")],onCancel:function(){a(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!T,bounds:H,onStart:function(e,t){return function(e,t){if(R.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=R.current.getBoundingClientRect();z({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:R,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:me.t("projectPanel.ProjectType",W)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(db.a,{disabled:l,style:{width:"100%"},value:d,onChange:function(e){f(e)},children:Object(gf.jsx)(QT,{value:M.SOLAR_PANEL_ARRAY,children:me.t("projectPanel.SolarPanelArray",W)},M.SOLAR_PANEL_ARRAY)})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Title",W),":"]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(ET.a,{maxLength:50,style:{width:"100%"},value:null!==y&&void 0!==y?y:"",onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){g(e.target.value)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[me.t("word.Description",W),":",Object(gf.jsx)("br",{}),Object(gf.jsxs)("span",{style:{fontSize:"10px"},children:["(",me.t("word.MaximumCharacters",W),": 200)"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:Object(gf.jsx)(D,{rows:5,maxLength:200,style:{width:"100%"},value:null!==x&&void 0!==x?x:"",onChange:function(e){v(e.target.value)}})})]})]})},_T=n.a.memo(ZT),$T=l(34),eP=(l(336),l(337),function(){var e=Object(Eh.a)(Lh.a.mark((function e(t,l,a){var o;return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o={lng:Ew.getState().language},e.next=3,$T.a.firestore().collection("users").doc(t).collection("projects").doc(l).get().then((function(e){var i,r,n=e.data();n?a({owner:t,title:e.id,timestamp:n.timestamp,description:n.description,dataColoring:null!==(i=n.dataColoring)&&void 0!==i?i:z.ALL,type:n.type,designs:n.designs,ranges:n.ranges,hiddenParameters:n.hiddenParameters,counter:null!==(r=n.counter)&&void 0!==r?r:0,selectedProperty:n.selectedProperty,sortDescending:n.sortDescending,xAxisNameScatteredPlot:n.xAxisNameScatteredPlot,yAxisNameScatteredPlot:n.yAxisNameScatteredPlot,dotSizeScatteredPlot:n.dotSizeScatteredPlot,thumbnailWidth:n.thumbnailWidth}):Qh(me.t("message.CannotOpenProject",o)+": "+l)})).catch((function(e){Qh(me.t("message.CannotOpenProject",o)+": "+e)}));case 3:case"end":return e.stop()}}),e)})));return function(t,l,a){return e.apply(this,arguments)}}()),tP=function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({ranges:$T.a.firestore.FieldValue.arrayUnion(l)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))},lP=function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({ranges:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))},aP=function(e,t,l){var a={timestamp:Date.now(),title:t,thumbnail:l};switch(e){case M.SOLAR_PANEL_ARRAY:var o=Ew.getState().world.latitude,i=Tw.countAllSolarPanels(),r=Tw.countAllSolarPanelDailyYields(),n=Tw.countAllSolarPanelYearlyYields(),c=Ew.getState().economicsParams,s=c.operationalCostPerUnit,u=c.electricitySellingPrice;a=Object(d.a)(Object(d.a)({latitude:o,unitCost:s,sellingPrice:u,panelCount:i,dailyYield:r,yearlyYield:n},a),Ew.getState().solarPanelArrayLayoutParams);break;case M.SOLAR_PANEL_TILT_ANGLE:}return a},oP=function(e,t){if(!t)return null;var l,a=[],o=Object(f.a)(t);try{for(o.s();!(l=o.n()).done;){var i=l.value,r=Object(d.a)({},i);r.title=iP(e,i.title),r.timestamp=Date.now(),a.push(r)}}catch(n){o.e(n)}finally{o.f()}return a},iP=function(e,t){var l=t.lastIndexOf(" ");return e+t.substring(l)},rP=function(e){var t=document.createElement("canvas");t.width=e.width,t.height=e.height;var l=t.getContext("2d");return l&&l.drawImage(e,1,1),t.toDataURL()},nP=function(e,t,l,a){var o={lng:Ew.getState().language};$T.a.firestore().collection("users").doc(null!==l&&void 0!==l?l:a).collection("designs").doc(e).get().then((function(e){if(e.exists){var l=e.data();l&&$T.a.firestore().collection("users").doc(a).collection("designs").doc(t).set(l).then((function(){Kh(me.t("message.CloudFileCopied",o)+": "+t)})).catch((function(e){Qh(me.t("message.CannotWriteCloudFile",o)+": "+e)}))}else Qh(me.t("message.CannotReadCloudFile",o))})).catch((function(e){Qh(me.t("message.CannotReadCloudFile",o)+": "+e)}))},cP=function(e,t,l,a,o){var i={lng:Ew.getState().language};return Ew.getState().undoManager.clear(),Tf.setState((function(e){e.waiting=!0})),$T.a.firestore().collection("users").doc(e).collection(l?"designs":"files").doc(t).get().then((function(l){var r=l.data();if(r?Ew.getState().importContent(r,t):(Kh(me.t("message.CloudFileNotFound",i)+": "+t),Ew.getState().set((function(e){e.cloudFile=void 0})),Tf.setState((function(e){e.waiting=!1}))),!a&&!o){var n=Ge+"?client=web&userid="+e+"&title="+encodeURIComponent(t);window.history.pushState({},document.title,n)}})).catch((function(e){Qh(me.t("message.CannotOpenCloudFile",i)+": "+e),Tf.setState((function(e){e.waiting=!1}))}))},sP=Qv.a.SubMenu,dP={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},uP=mv.a.div(vT||(vT=Object(gv.a)(["\n width: 100px;\n"]))),fP=mv.a.img(bT||(bT=Object(gv.a)(["\n position: absolute;\n top: 10px;\n left: 10px;\n height: 40px;\n transition: 0.5s;\n opacity: 1;\n cursor: pointer;\n user-select: none;\n\n &:hover {\n opacity: 0.5;\n }\n"]))),hP=mv.a.div(AT||(AT=Object(gv.a)(["\n position: absolute;\n top: 54px;\n left: 0;\n width: 100px;\n display: flex;\n justify-content: center;\n align-items: center;\n user-select: none;\n z-index: 9;\n"]))),pP=function(e){var t=e.viewOnly,l=e.set2DView,a=e.resetView,n=e.zoomView,c=e.setNavigationView,s=e.canvas,p=Ew(si),y=Tf(yf),g=Ew(as),m=Ew(Kc),w=Ew(qc),x=Ew(jr),v=Ew(fs),b=Ew(ds),A=Ew(tn),T=Ew(us),P=Ew(rs),S=Ew(Sr),j=Tf(Ki),H=Ew.getState().loggable,z=Ew.getState().language,R=Ew.getState().floatingWindowOpacity,M=Ew.getState().undoManager,W=Ew(i.timesPerHour),I=Ew(i.solarPanelVisibilityGridCellSize),C=Ew(i.solarRadiationHeatmapGridCellSize),O=Ew(o.solarRadiationHeatmapMaxValue),F=Ew.getState().viewState.navigationView,k=Ew.getState().viewState.orthographic,Y=Ew.getState().viewState.autoRotate,L=Ew.getState().viewState.showSiteInfoPanel,E=Ew.getState().viewState.showDesignInfoPanel,U=Ew.getState().viewState.showInstructionPanel,J=Ew.getState().viewState.showMapPanel,X=Ew.getState().viewState.showWeatherPanel,B=Ew.getState().viewState.showDiurnalTemperaturePanel,K=Tf.getState().showEconomicsPanel,q=Tf.getState().showNavigationPanel,Q=Ew.getState().viewState.showStickyNotePanel,Z=Ew.getState().viewState.showHeliodonPanel,_=Ew.getState().viewState.shadowEnabled,$=Ew.getState().viewState.solarPanelShininess,ee=Tf.getState().changed,te=Ew.getState().cloudFile,le=Ew.getState().user,ae=Ew.getState().viewState.axes,oe=Ew.getState().elementsToPaste,ie=Tf.getState().runDynamicSimulation,re=Tf.getState().runStaticSimulation,ne=Ew(i.noAnimationForHeatmapSimulation),ce=Ew(i.noAnimationForSensorDataCollection),se=Ew(o.solarRadiationHeatmapReflectionOnly),de=Ew.getState().elements,ue=Ew.getState().viewState.cameraPosition,fe=Ew.getState().viewState.panCenter,he=Ew.getState().selectedElement,pe=Ew.getState().projectInfo,ye=Ew.getState().projectView,ge=Object(r.useState)(!1),we=Object(u.a)(ge,2),ve=we[0],be=we[1],Ae=Object(r.useState)(!1),Te=Object(u.a)(Ae,2),Pe=Te[0],Se=Te[1],je=Object(r.useState)(!1),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De=Object(r.useState)(!1),Me=Object(u.a)(De,2),We=Me[0],Ie=Me[1],Ce=Object(r.useState)(!1),Oe=Object(u.a)(Ce,2),Fe=Oe[0],ke=Oe[1],Ye=Object(r.useMemo)((function(){return{lng:z}}),[z]),Le=Object(r.useMemo)((function(){return Tw.isMac()}),[]),Ee=Object(r.useMemo)((function(){var e=Tw.getOS();if(e){if(e.includes("OS X"))return"Ctrl+Alt+H";if(e.includes("Chrome"))return"Ctrl+Alt+H"}return"Ctrl+Home"}),[]),Ue=function(e){var l=function(e){var t;switch(e){case"sun_angles":t=yb;break;case"insolation_and_climate":t=gb;break;case"solar_radiation_to_box":t=mb;break;case"sun_beam_at_center":t=wb;break;case"thermal_vs_building_envelope":t=xT;break;case"effect_house_size":t=sT;break;case"effect_house_orientation":t=dT;break;case"effect_wall_roof_insulation":t=uT;break;case"effect_roof_color":t=fT;break;case"effect_eaves_overhang_length":t=hT;break;case"effect_window_shgc":t=pT;break;case"effect_thermostat_setpoint":t=yT;break;case"effect_solar_panels":t=gT;break;case"effect_ground_temperature":t=mT;break;case"effect_trees":t=wT;break;case"office_building_01":t=rA;break;case"hotel_01":t=nA;break;case"spanish_style_hotel":t=cA;break;case"apartment_building_01":t=sA;break;case"white_house":t=oA;break;case"bilim_mersin_turkiye":t=iA;break;case"south_burlington_high_school":t=dA;break;case"mescalero_apache_school":t=uA;break;case"heatmap_01":t=fA;break;case"vegetative_buffer_01":t=bA;break;case"solar_canopy_form_factors":t=RA;break;case"solar_canopy_over_bleachers":t=DA;break;case"solar_bus_stop":t=MA;break;case"solar_facade_tesla":t=CA;break;case"solar_canopy_over_garage":t=IA;break;case"bipv_01":t=WA;break;case"floatovoltaics":t=OA;break;case"agrivoltaics":t=FA;break;case"effect_tilt_angle_solar_panel":t=AA;break;case"effect_azimuth_solar_panel":t=TA;break;case"effect_azimuth_parabolic_trough":t=PA;break;case"effect_latus_rectum_parabolic_trough":t=SA;break;case"parabolic_dish_focus_sunlight":t=EA;break;case"effect_orientation_solar_panel":t=jA;break;case"solar_panel_types":t=xb;break;case"vertical_bifacial_solar_panels":t=vb;break;case"compare_monofacial_bifacial_solar_panels":t=bb;break;case"why_solar_array":t=HA;break;case"solar_panel_array_auto_layout":t=zA;break;case"inter_row_spacing":t=kA;break;case"rooftop_solar_panels":t=Ab;break;case"solar_panels_over_canal":t=zb;break;case"solar_noise_barrier":t=Hb;break;case"rainbow_swash_solar_farm":t=Tb;break;case"mickey_mouse_solar_farm":t=Pb;break;case"solar_farm_hsat_array":t=Sb;break;case"solar_farm_aadat_array":t=jb;break;case"solar_trackers":t=Rb;break;case"nevada_solar_one_parabolic_troughs":t=LA;break;case"tooele_parabolic_dish_array":t=UA;break;case"ps10_solar_power_tower":t=YA;break;case"linear_fresnel_reflectors":t=NA;break;case"linear_fresnel_reflectors_two_absorbers":t=VA;break;case"effect_absorber_pipe_height":t=JA;break;case"effect_azimuth_fresnel_reflector":t=GA;break;case"cosine_efficiency_heliostats":t=XA;break;case"shadowing_blocking_heliostats":t=BA;break;case"effect_solar_power_tower_height":t=KA;break;case"solar_power_tower":t=qA;break;case"solar_updraft_tower":t=tT;break;case"solar_updraft_tower_city":t=lT;break;case"cape_cod_with_shed_dormer":t=Mb;break;case"mansard_roof_with_dormers":t=Wb;break;case"t_shaped_house":t=Ib;break;case"all_roof_types":t=Db;break;case"a_frame_house":t=Kb;break;case"half_timbered_house":t=qb;break;case"dutch_gable_roof":t=Bb;break;case"combination_roof_vs_bonnet_roof":t=Qb;break;case"butterfly_roof_house":t=Zb;break;case"gable_roof_vs_hip_roof":t=_b;break;case"gable_and_valley_roof":t=$b;break;case"clerestory_roof":t=eA;break;case"monitor_roof":t=tA;break;case"colonial_vs_saltbox":t=lA;break;case"gambrel_roof_vs_mansard_roof":t=aA;break;case"colonial_house":t=Gb;break;case"dutch_colonial_house":t=Xb;break;case"cape_cod_with_garage":t=Cb;break;case"greenhouse":t=hA;break;case"solarium":t=Eb;break;case"pavilion":t=pA;break;case"octagonal_pagoda":t=yA;break;case"ocean_front":t=gA;break;case"mosque_01":t=Ub;break;case"church_01":t=Nb;break;case"cathedral_01":t=Vb;break;case"cathedral_02":t=Jb;break;case"adobe_taos_house":t=Ob;break;case"egyptian_pyramids":t=mA;break;case"mayan_pyramid":t=wA;break;case"si_o_se_pol":t=xA;break;case"stacked_cuboids":t=vA;break;case"barn_house":t=Yb;break;case"ranch_house":t=Fb;break;case"bonnet_house":t=kb;break;case"modern_house_01":t=Lb;break;case"solar_radiation_predicted_vs_measured":t=QA;break;case"bestest_case_600":t=ZA;break;case"bestest_case_610":t=_A;break;case"bestest_case_620":t=$A;break;case"bestest_case_630":t=eT;break;case"tucson_sundt_station":t=aT;break;case"ai_tilt_angle_one_row":t=oT;break;case"ai_tilt_angles_multiple_rows":t=iT;break;case"ai_solar_farm_design":t=rT;break;case"ai_solar_farm_design_block":t=nT;break;case"ai_fitchburg_solar_farm":t=cT}return t}(e.key);l&&(Tf.setState((function(e){e.openModelsMap=!1})),!t&&ee?Zv.a.confirm({title:me.t("message.DoYouWantToSaveChanges",Ye),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){return Je(l)},onCancel:function(){Tf.setState((function(e){e.waiting=!0})),setTimeout((function(){x(l)}),10)},okText:me.t("word.Yes",Ye),cancelText:me.t("word.No",Ye)}):(Tf.setState((function(e){e.waiting=!0})),setTimeout((function(){x(l)}),10)),H&&p((function(t){t.actionInfo={name:"Open Example: "+e.key,timestamp:(new Date).getTime()}})),t||window.history.pushState({},document.title,Ge))},Ne=function(e){p((function(t){t.projectInfo=Object(d.a)({},e),t.projectImages.clear(),t.projectView=!0})),Tf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag,e.updateProjectsFlag=!0}))},Ve=function(e,l){var a="QWecNcxhyvP6j6sBN11hBsfZDau1";e&&(eP(a,e,Ne).then((function(){cP(a,e+" "+l,!0,!0,t).then((function(){}))})),Tf.setState((function(e){e.openModelsMap=!1})),H&&p((function(t){t.actionInfo={name:"Open Example: "+e,timestamp:(new Date).getTime()}})),t||window.history.pushState({},document.title,Ge))},Je=function(e){te?(p((function(t){t.localContentToImportAfterCloudFileUpdate=e})),Tf.getState().setSaveCloudFileFlag(!0)):le.uid?p((function(t){t.localContentToImportAfterCloudFileUpdate=e,t.showCloudFileTitleDialogFlag=!t.showCloudFileTitleDialogFlag,t.showCloudFileTitleDialog=!0})):Kh(me.t("menu.file.ToSaveYourWorkPleaseSignIn",Ye))},Xe=ue[0]===ue[1]&&ue[1]===ue[2]&&0===fe[0]&&0===fe[1]&&0===fe[2],Be=oe&&oe.length>0,Ke=Ew.getState().countAllElementsByType(),Ze=Object(gf.jsxs)(Qv.a,{triggerSubMenuAction:"click",children:[!j&&Object(gf.jsxs)(sP,{title:me.t("menu.fileSubMenu",Ye),children:[!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){M.clear(),p((function(e){e.createNewFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,window.history.pushState({},document.title,Ge),H&&(e.actionInfo={name:"Create New File",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.openModelsMap=!1}))},children:[me.t("menu.file.CreateNewFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+F)"]})]},"create-new-file"),!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){M.clear(),p((function(e){e.openLocalFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.cloudFile=void 0,window.history.pushState({},document.title,Ge),H&&(e.actionInfo={name:"Open Local File",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.openModelsMap=!1}))},children:[me.t("menu.file.OpenLocalFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+O)"]}),"..."]},"open-local-file"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.saveLocalFileDialogVisible=!0})),H&&p((function(e){e.actionInfo={name:"Save as Local File",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.SaveAsLocalFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+S)"]}),"..."]},"save-local-file"),le.uid&&!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.listCloudFilesFlag=!0,e.openModelsMap=!1})),p((function(e){e.selectedFloatingWindow="cloudFilePanel"})),H&&p((function(e){e.actionInfo={name:"List Cloud Files",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.OpenCloudFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Shift+O)"]}),"..."]},"open-cloud-file"),le.uid&&te&&!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.getState().setSaveCloudFileFlag(!0),H&&p((function(e){e.actionInfo={name:"Save Cloud File",timestamp:(new Date).getTime()}}))},children:[me.t("menu.file.SaveCloudFile",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Shift+S)"]})]},"save-cloud-file"),le.uid&&!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){p((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0,H&&(e.actionInfo={name:"Save as Cloud File",timestamp:(new Date).getTime()})}))},children:[me.t("menu.file.SaveAsCloudFile",Ye),"..."]},"save-as-cloud-file"),!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e=new URLSearchParams(window.location.search).get("userid"),t=e===le.uid;le.uid&&te&&t?Se(!0):le.uid?Kh(e&&!t?me.t("menu.file.YouCannotPublishAModelThatYouDoNotOwn",Ye)+".":me.t("menu.file.YouMustSaveModelOnCloudBeforePublishingIt",Ye)+"."):Kh(me.t("menu.file.YouMustLogInToPublishYourModel",Ye)+".")},children:[me.t("menu.file.PublishOnModelsMap",Ye),"..."]},"publish-on-model-map"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){s&&(!function(e,t){var l=document.createElement("a");l.download=e,l.href=t,l.click()}("screenshot.png",s.toDataURL("image/png")),H&&p((function(e){e.actionInfo={name:"Take Screenshot",timestamp:(new Date).getTime()}})),Tf.setState((function(e){e.openModelsMap=!1})))},children:me.t("menu.file.TakeScreenshot",Ye)},"screenshot")]},"file"),!j&&!t&&le.uid&&Object(gf.jsxs)(sP,{title:me.t("menu.projectSubMenu",Ye),children:[Object(gf.jsxs)(Qv.a.Item,{onClick:function(){le.uid?(Re(!0),Tf.setState((function(e){e.openModelsMap=!1})),H&&p((function(e){e.actionInfo={name:"Create New Project",timestamp:(new Date).getTime()}}))):Kh(me.t("menu.project.YouMustLogInToCreateProject",Ye)+".")},children:[me.t("menu.project.CreateNewProject",Ye),"..."]},"create-new-project"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){le.uid?(Tf.setState((function(e){e.showProjectsFlag=!0,e.openModelsMap=!1})),p((function(e){e.selectedFloatingWindow="projectListPanel"})),H&&p((function(e){e.actionInfo={name:"Open Project",timestamp:(new Date).getTime()}}))):Kh(me.t("menu.project.YouMustLogInToOpenProject",Ye)+".")},children:[me.t("menu.project.OpenProject",Ye),"..."]},"list-project"),ye&&pe.title&&le.uid&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Ie(!0),Tf.setState((function(e){e.openModelsMap=!1})),H&&p((function(e){e.actionInfo={name:"Save Project As",timestamp:(new Date).getTime()}}))},children:[me.t("menu.project.SaveProjectAs",Ye),"..."]},"save-project-as")]},"project"),(he||Be||M.hasUndo()||M.hasRedo())&&!j&&Object(gf.jsxs)(sP,{title:me.t("menu.editSubMenu",Ye),children:[he&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){he&&(m(he.id),H&&p((function(e){e.actionInfo={name:"Copy",timestamp:(new Date).getTime(),elementId:he.id,elementType:he.type}})))},children:[me.t("word.Copy",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+C)"]})]},"copy"),he&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(he&&he.type!==V.Roof)if(he.locked)Kh(me.t("message.ThisElementIsLocked",Ye));else{var e=w(he.id,!0);if(0===e.length)return;if(Tw.isElementTriggerAutoDeletion(e[0]))Et.getState().setListenToAutoDeletionByCut(!0),Tf.getState().setPrimitiveStore("selectedElementId",he.id);else{var t={name:"Cut",timestamp:Date.now(),deletedElements:e,selectedElementId:he.id,undo:function(){var e=t.deletedElements;if(0!==e.length){var l=e.find((function(e){return e.id===t.selectedElementId}));l&&p((function(t){var a,o=Object(f.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value;t.elements.push(i)}}catch(h){o.e(h)}finally{o.f()}if(l.type===V.Wall){var r=l,n=null,c=null;if(r.leftJoints.length>0&&(n=r.leftJoints[0]),r.rightJoints.length>0&&(c=r.rightJoints[0]),n||c){var s,d=Object(f.a)(t.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;u.id===n&&u.type===V.Wall&&(u.rightJoints[0]=r.id),u.id===c&&u.type===V.Wall&&(u.leftJoints[0]=r.id)}}catch(h){d.e(h)}finally{d.f()}}}}))}},redo:function(){t.deletedElements&&t.deletedElements.length>0&&w(t.deletedElements[0].id,!0)}};S(t)}}},children:[me.t("word.Cut",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+X)"]})]},"cut"),Be&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(oe&&oe.length>0){var e=g();if(e.length>0){var t={name:"Paste by Key",timestamp:Date.now(),pastedElements:JSON.parse(JSON.stringify(e)),undo:function(){var e,l=Object(f.a)(t.pastedElements);try{for(l.s();!(e=l.n()).done;){var a=e.value;w(a.id,!1)}}catch(o){l.e(o)}finally{l.f()}},redo:function(){p((function(e){var l;(l=e.elements).push.apply(l,Object(h.a)(t.pastedElements)),e.selectedElement=t.pastedElements[0]}))}};S(t)}}},children:[me.t("word.Paste",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+V)"]})]},"paste"),M.hasUndo()&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(M.hasUndo()){var e=M.undo();e&&Kh(me.t("menu.edit.Undo",Ye)+": "+e,qe),H&&p((function(e){e.actionInfo={name:"Undo",timestamp:(new Date).getTime()}}))}},children:[me.t("menu.edit.Undo",Ye)+": "+M.getLastUndoName(),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Z)"]})]},"undo"),M.hasRedo()&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(M.hasRedo()){var e=M.redo();e&&Kh(me.t("menu.edit.Redo",Ye)+": "+e,qe),H&&p((function(e){e.actionInfo={name:"Redo",timestamp:(new Date).getTime()}}))}},children:[me.t("menu.edit.Redo",Ye)+": "+M.getLastRedoName(),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Y)"]})]},"redo")]},"edit"),!j&&Object(gf.jsxs)(sP,{title:me.t("menu.viewSubMenu",Ye),children:[!k&&!Xe&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Reset View",timestamp:Date.now(),oldCameraPosition:Object(h.a)(ue),oldPanCenter:Object(h.a)(fe),undo:function(){var t=Et.getState().orbitControlsRef;(null===t||void 0===t?void 0:t.current)&&(t.current.object.position.set(e.oldCameraPosition[0],e.oldCameraPosition[1],e.oldCameraPosition[2]),t.current.target.set(e.oldPanCenter[0],e.oldPanCenter[1],e.oldPanCenter[2]),t.current.update(),p((function(t){var l=t.viewState;l.cameraPosition=Object(h.a)(e.oldCameraPosition),l.panCenter=Object(h.a)(e.oldPanCenter)})))},redo:function(){a()}};S(e),a(),p((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.viewState.orthographic=!1}))},style:{paddingLeft:"36px"},children:[me.t("menu.view.ResetView",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Ee,")"]})]},"reset-view"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(1.1)},style:{paddingLeft:"36px"},children:[me.t("menu.view.ZoomOut",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+])"]})]},"zoom-out-view"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(.9)},style:{paddingLeft:"36px"},children:[me.t("menu.view.ZoomIn",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+[)"]})]},"zoom-in-view"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsxs)(_v.a,{checked:F,onChange:function(e){var t={name:"Toggle Navigation View",timestamp:Date.now(),checked:e.target.checked,undo:function(){c(!t.checked)},redo:function(){c(t.checked)}};S(t),c(e.target.checked),p((function(e){e.viewState.autoRotate=!1}))},children:[me.t("menu.view.NavigationView",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+Q)"]})]})},"navigation-view-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsxs)(_v.a,{checked:k,onChange:function(e){var t={name:"Toggle 2D View",timestamp:Date.now(),checked:e.target.checked,undo:function(){l(!t.checked)},redo:function(){l(t.checked)}};S(t),l(e.target.checked),p((function(e){e.viewState.autoRotate=!1}))},children:[me.t("menu.view.TwoDimensionalView",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+B)"]})]})},"orthographic-check-box"),!k&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsxs)(_v.a,{checked:Y,onChange:function(){if(!k){var e={name:"Auto Rotate",timestamp:Date.now(),checked:!Y,undo:function(){p((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.viewState.autoRotate=!e.checked}))},redo:function(){p((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.viewState.autoRotate=e.checked}))}};S(e),p((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.viewState.autoRotate=!e.viewState.autoRotate}))}},children:[me.t("menu.view.AutoRotate",Ye),Object(gf.jsxs)("span",{style:{paddingLeft:"2px",fontSize:9},children:["(",Le?"\u2318":"Ctrl","+M)"]})]})},"auto-rotate-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:ae,onChange:function(e){var t=e.target.checked,l={name:"Show Axes",timestamp:Date.now(),checked:t,undo:function(){p((function(e){e.viewState.axes=!l.checked}))},redo:function(){p((function(e){e.viewState.axes=l.checked}))}};S(l),p((function(e){e.viewState.axes=t}))},children:me.t("skyMenu.Axes",Ye)})},"axes-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:_,onChange:function(){var e={name:"Show Shadow",timestamp:Date.now(),checked:!_,undo:function(){p((function(t){t.viewState.shadowEnabled=!e.checked,t.viewState.shadowEnabled&&t.updateSceneRadius()}))},redo:function(){p((function(t){t.viewState.shadowEnabled=e.checked,t.viewState.shadowEnabled&&t.updateSceneRadius()}))}};S(e),p((function(e){e.viewState.shadowEnabled=!e.viewState.shadowEnabled,e.viewState.shadowEnabled&&e.updateSceneRadius()}))},children:me.t("menu.view.ShowShadow",Ye)})},"shadow-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:void 0===$||$>0,onChange:function(e){!function(e){var t={name:"Set Surface Shininess",timestamp:Date.now(),oldValue:null!==$&&void 0!==$?$:tt,newValue:e,undo:function(){p((function(e){e.viewState.solarPanelShininess=t.oldValue}))},redo:function(){p((function(e){e.viewState.solarPanelShininess=t.newValue}))}};S(t),p((function(t){t.viewState.solarPanelShininess=e}))}(e.target.checked?tt:0)},children:me.t("menu.view.ShowSurfaceShininess",Ye)})},"shininess-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:R<1,onChange:function(e){var t=R,l=e.target.checked?Qe:1,a={name:"Floating Window Opacity",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){p((function(e){e.floatingWindowOpacity=a.oldValue}))},redo:function(){p((function(e){e.floatingWindowOpacity=a.newValue}))}};S(a),p((function(e){e.floatingWindowOpacity=l}))},children:me.t("menu.view.TranslucentFloatingWindows",Ye)})},"translucency-check-box")]},"view"),!j&&Object(gf.jsxs)(sP,{title:me.t("menu.settingsSubMenu",Ye),children:[!Z&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Open Sun and Time Settings Panel",timestamp:Date.now(),undo:function(){p((function(e){e.viewState.showHeliodonPanel=!1}))},redo:function(){p((function(e){e.viewState.showHeliodonPanel=!0}))}};S(e),p((function(e){e.viewState.showHeliodonPanel=!0}))},children:[me.t("menu.settings.SunAndTime",Ye),"..."]},"heliodon-panel-check-box"),!J&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Open Maps",timestamp:Date.now(),undo:function(){p((function(e){e.viewState.showMapPanel=!1}))},redo:function(){p((function(e){e.viewState.showMapPanel=!0}))}};S(e),p((function(e){e.viewState.showMapPanel=!0}))},children:[me.t("word.Location",Ye),"..."]},"map-panel-check-box"),!X&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Open Weather Panel",timestamp:Date.now(),undo:function(){p((function(e){e.viewState.showWeatherPanel=!1}))},redo:function(){p((function(e){e.viewState.showWeatherPanel=!0}))}};S(e),p((function(e){e.viewState.showWeatherPanel=!0}))},children:[me.t("menu.settings.WeatherData",Ye),"..."]},"weather-panel-check-box"),!B&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){var e={name:"Open Diurnal Temperature Panel",timestamp:Date.now(),undo:function(){p((function(e){e.viewState.showDiurnalTemperaturePanel=!1}))},redo:function(){p((function(e){e.viewState.showDiurnalTemperaturePanel=!0}))}};S(e),p((function(e){e.viewState.showDiurnalTemperaturePanel=!0}))},children:[me.t("menu.settings.DiurnalTemperature",Ye),"..."]},"diurnal-temperature-panel-check-box"),!K&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.showEconomicsPanel=!0})),H&&p((function(e){e.actionInfo={name:"Open Economics Panel",timestamp:(new Date).getTime()}}))},children:[me.t("economicsPanel.EconomicsParameters",Ye),"..."]},"economics-panel-menu-item"),!q&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.showNavigationPanel=!0})),H&&p((function(e){e.actionInfo={name:"Open Navigation Panel",timestamp:(new Date).getTime()}}))},children:[me.t("navigationPanel.NavigationParameters",Ye),"..."]},"navigation-panel-menu-item")]},"settings"),!j&&Object(gf.jsxs)(sP,{title:me.t("menu.view.accessoriesSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:L,onChange:function(){var e={name:"Show Site Information",timestamp:Date.now(),checked:!L,undo:function(){p((function(t){t.viewState.showSiteInfoPanel=!e.checked}))},redo:function(){p((function(t){t.viewState.showSiteInfoPanel=e.checked}))}};S(e),p((function(e){e.viewState.showSiteInfoPanel=!e.viewState.showSiteInfoPanel}))},children:me.t("menu.view.accessories.SiteInformation",Ye)})},"site-info-panel-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:E,onChange:function(){var e={name:"Show Design Information",timestamp:Date.now(),checked:!E,undo:function(){p((function(t){t.viewState.showDesignInfoPanel=!e.checked}))},redo:function(){p((function(t){t.viewState.showDesignInfoPanel=e.checked}))}};S(e),p((function(e){e.viewState.showDesignInfoPanel=!e.viewState.showDesignInfoPanel}))},children:me.t("menu.view.accessories.DesignInformation",Ye)})},"design-info-panel-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:U,onChange:function(){var e={name:"Show Instruction Panel",timestamp:Date.now(),checked:!U,undo:function(){p((function(t){t.viewState.showInstructionPanel=!e.checked}))},redo:function(){p((function(t){t.viewState.showInstructionPanel=e.checked}))}};S(e),p((function(e){e.viewState.showInstructionPanel=!e.viewState.showInstructionPanel}))},children:me.t("menu.view.accessories.Instruction",Ye)})},"instruction-panel-check-box"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:Q,onChange:function(){var e={name:"Show Sticky Note",timestamp:Date.now(),checked:!Q,undo:function(){p((function(t){t.viewState.showStickyNotePanel=!e.checked}))},redo:function(){p((function(t){t.viewState.showStickyNotePanel=e.checked}))}};S(e),p((function(e){e.viewState.showStickyNotePanel=!e.viewState.showStickyNotePanel}))},children:me.t("menu.view.accessories.StickyNote",Ye)})},"sticky-note-panel-check-box")]},"accessories"),!j&&Ke.gotSome()&&Object(gf.jsxs)(sP,{title:me.t("menu.analysisSubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.physicsSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:!ne||Tw.hasMovingParts(de)?function(){ie||Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),y("runDynamicSimulation",!ie),H&&p((function(e){e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Dynamic)",timestamp:(new Date).getTime()}}))}),100)}:function(){re||Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),y("runStaticSimulation",!re),H&&p((function(e){e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Static)",timestamp:(new Date).getTime()}}))}),100)},children:me.t("menu.physics.DailySolarRadiationHeatmap",Ye)},"daily-solar-radiation-heatmap"),Object(gf.jsx)(sP,{title:me.t("menu.physics.SolarRadiationHeatmapOptions",Ye),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapGridCellSize",Ye)+":"}),Object(gf.jsx)($v.a,{min:.1,max:20,step:.1,style:{width:60},precision:1,value:null!==C&&void 0!==C?C:.5,onChange:function(e){p((function(t){t.world.solarRadiationHeatmapGridCellSize=e}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",Ye)})]},"solar-radiation-heatmap-grid-cell-size"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapMaxValue",Ye)+":"}),Object(gf.jsx)($v.a,{min:.5,max:50,step:.5,style:{width:60},precision:1,value:null!==O&&void 0!==O?O:5,onChange:function(e){p((function(t){t.viewState.solarRadiationHeatMapMaxValue=e}))}})]},"solar-radiation-heatmap-max-value"),Tw.hasHeliostatOrFresnelReflectors(de)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.physics.ReflectionHeatmap",Ye)+":"}),Object(gf.jsx)(eb.a,{checked:se,onChange:function(e){p((function(t){t.viewState.solarRadiationHeatMapReflectionOnly=e}))}})]},"solar-radiation-heatmap-reflection-only"),!Tw.hasMovingParts(de)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.physics.SolarRadiationHeatmapNoAnimation",Ye)+":"}),Object(gf.jsx)(eb.a,{checked:ne,onChange:function(e){p((function(t){t.world.noAnimationForHeatmapSimulation=e}))}})]},"solar-radiation-heatmap-no-animation")]})},"solar-radiation-heatmap-options")]},"physics"),Ke.sensorCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.sensorSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.Sensor)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){H&&p((function(e){e.actionInfo={name:"Collect Daily Data for Sensors",timestamp:(new Date).getTime()}})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailyLightSensor=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",Ye))},children:me.t("menu.sensor.CollectDailyData",Ye)},"sensor-collect-daily-data"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.Sensor)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){H&&p((function(e){e.actionInfo={name:"Collect Yearly Data for Sensors",timestamp:(new Date).getTime()}})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlyLightSensor=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",Ye))},children:me.t("menu.sensor.CollectYearlyData",Ye)},"sensor-collect-yearly-data"),Object(gf.jsx)(sP,{title:me.t("word.Options",Ye),children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"150px"},children:me.t("menu.option.SamplingFrequency",Ye)+":"}),Object(gf.jsx)($v.a,{min:1,max:60,step:1,style:{width:60},precision:0,value:W,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){p((function(t){t.world.timesPerHour=e}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("menu.option.TimesPerHour",Ye)})]},"sensor-simulation-sampling-frequency"),!Tw.hasMovingParts(de)&&Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"280px"},children:me.t("menu.sensor.SensorSimulationNoAnimation",Ye)+":"}),Object(gf.jsx)(eb.a,{checked:ce,onChange:function(e){p((function(t){t.world.noAnimationForSensorDataCollection=e}))}})]},"sensor-simulation-no-animation")]})},"sensor-simulation-options")]},"sensors"),Ke.wallCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.buildingSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){var e=TT(de,b,A);if(e.status!==tv.NO_BUILDING)if(e.status!==tv.AT_LEAST_ONE_BAD_NO_GOOD)e.status===tv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",Ye)),Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),H&&p((function(e){e.actionInfo={name:"Analyze Daily Building Energy",timestamp:(new Date).getTime()}})),Tf.setState((function(e){e.runDailyThermalSimulation=!0,e.simulationInProgress=!0}))}),100);else{var t;switch(e.buildingCompletion){case D.WALL_DISJOINED:t=me.t("message.WallsAreNotConnected",Ye);break;case D.WALL_EMPTY:t=me.t("message.BuildingContainsEmptyWall",Ye);break;case D.ROOF_MISSING:t=me.t("message.BuildingRoofMissing",Ye);break;default:t=me.t("message.UnknownErrors",Ye)}Qh(me.t("message.SimulationWillNotStartDueToErrors",Ye)+": "+t)}else Kh(me.t("analysisManager.NoBuildingForAnalysis",Ye))},children:me.t("menu.building.AnalyzeDailyBuildingEnergy",Ye)},"building-energy-daily-data"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){var e=TT(de,b,A);if(e.status!==tv.NO_BUILDING)if(e.status!==tv.AT_LEAST_ONE_BAD_NO_GOOD)e.status===tv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",Ye)),Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){P(),Tf.setState((function(e){e.runYearlyThermalSimulation=!0,e.simulationInProgress=!0})),H&&p((function(e){e.actionInfo={name:"Analyze Yearly Building Energy",timestamp:(new Date).getTime()}}))}),100);else{var t;switch(e.buildingCompletion){case D.WALL_DISJOINED:t=me.t("message.WallsAreNotConnected",Ye);break;case D.WALL_EMPTY:t=me.t("message.BuildingContainsEmptyWall",Ye);break;case D.ROOF_MISSING:t=me.t("message.BuildingRoofMissing",Ye);break;default:t=me.t("message.UnknownErrors",Ye)}Qh(me.t("message.SimulationWillNotStartDueToErrors",Ye)+": "+t)}else Kh(me.t("analysisManager.NoBuildingForAnalysis",Ye))},children:me.t("menu.building.AnalyzeYearlyBuildingEnergy",Ye)},"building-energy-yearly-data"),Object(gf.jsx)(pb,{})]},"buildings"),Ke.solarPanelCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.solarPanelSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.SolarPanel)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation For Solar Panels",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",Ye))},children:me.t("menu.solarPanel.AnalyzeDailyYield",Ye)},"solar-panel-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.SolarPanel)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation For Solar Panels",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",Ye))},children:me.t("menu.solarPanel.AnalyzeYearlyYield",Ye)},"solar-panel-yearly-yield"),Object(gf.jsx)(fb,{}),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==v()?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){Tf.setState((function(e){e.runSolarPanelVisibilityAnalysis=!e.runSolarPanelVisibilityAnalysis,e.simulationInProgress=!0})),H&&p((function(e){e.actionInfo={name:"Run Visibility Analysis For Solar Panels",timestamp:(new Date).getTime()}}))}),100)):Kh(me.t("analysisManager.NoObserverForVisibilityAnalysis",Ye))},children:me.t("menu.solarPanel.AnalyzeVisibility",Ye)},"solar-panel-visibility"),Object(gf.jsx)(sP,{title:me.t("menu.solarPanel.VisibilityAnalysisOptions",Ye),children:Object(gf.jsx)(Qv.a,{children:Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{paddingRight:"10px"},children:me.t("menu.solarPanel.VisibilityGridCellSize",Ye)+":"}),Object(gf.jsx)($v.a,{min:.1,max:5,step:.1,style:{width:60},precision:1,value:null!==I&&void 0!==I?I:.2,onChange:function(e){p((function(t){t.world.solarPanelVisibilityGridCellSize=e}))}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:me.t("word.MeterAbbreviation",Ye)})]},"solar-panel-visibility-grid-cell-size")})},"solar-panel-visibility-analysis-options")]},"solar-panels"),Ke.parabolicTroughCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.parabolicTroughSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.ParabolicTrough)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyParabolicTroughIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Parabolic Troughs",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForParabolicTroughs=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",Ye))},children:me.t("menu.parabolicTrough.AnalyzeDailyYield",Ye)},"parabolic-trough-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.ParabolicTrough)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyParabolicTroughIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Parabolic Troughs",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForParabolicTroughs=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",Ye))},children:me.t("menu.parabolicTrough.AnalyzeYearlyYield",Ye)},"parabolic-trough-yearly-yield"),Object(gf.jsx)(ub,{name:"parabolic-trough"})]},"parabolic-trough"),Ke.parabolicDishCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.parabolicDishSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.ParabolicDish)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyParabolicDishIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Parabolic Dishes",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForParabolicDishes=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",Ye))},children:me.t("menu.parabolicDish.AnalyzeDailyYield",Ye)},"parabolic-dish-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.ParabolicDish)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyParabolicDishIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Parabolic Dishes",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForParabolicDishes=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",Ye))},children:me.t("menu.parabolicDish.AnalyzeYearlyYield",Ye)},"parabolic-dish-yearly-yield"),Object(gf.jsx)(ub,{name:"parabolic-dish"})]},"parabolic-dish"),Ke.fresnelReflectorCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.fresnelReflectorSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.FresnelReflector)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyFresnelReflectorIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Fresnel Reflectors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForFresnelReflectors=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",Ye))},children:me.t("menu.fresnelReflector.AnalyzeDailyYield",Ye)},"fresnel-reflector-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.FresnelReflector)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyFresnelReflectorIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Fresnel Reflectors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForFresnelReflectors=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",Ye))},children:me.t("menu.fresnelReflector.AnalyzeYearlyYield",Ye)},"fresnel-reflector-yearly-yield"),Object(gf.jsx)(ub,{name:"fresnel-reflector"})]},"fresnel-reflector"),Ke.heliostatCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.heliostatSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.Heliostat)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyHeliostatIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Heliostats",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForHeliostats=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",Ye))},children:me.t("menu.heliostat.AnalyzeDailyYield",Ye)},"heliostat-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==b(V.Heliostat)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyHeliostatIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Heliostats",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForHeliostats=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",Ye))},children:me.t("menu.heliostat.AnalyzeYearlyYield",Ye)},"heliostat-yearly-yield"),Object(gf.jsx)(ub,{name:"heliostat"})]},"heliostat"),Ke.solarUpdraftTowerCount>0&&Object(gf.jsxs)(sP,{title:me.t("menu.solarUpdraftTowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==T(G.UpdraftTower)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.dailyUpdraftTowerIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Daily Simulation for Solar Updraft Tower",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForUpdraftTower=!0}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",Ye))},children:me.t("menu.solarUpdraftTower.AnalyzeDailyYield",Ye)},"solar-updraft-tower-daily-yield"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){0!==T(G.UpdraftTower)?(Kh(me.t("message.SimulationStarted",Ye)),setTimeout((function(){p((function(e){e.graphState&&(e.graphState.yearlyUpdraftTowerIndividualOutputs=!1),H&&(e.actionInfo={name:"Run Yearly Simulation for Solar Updraft Tower",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForUpdraftTower=!0}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",Ye))},children:me.t("menu.solarUpdraftTower.AnalyzeYearlyYield",Ye)},"solar-updraft-tower-yearly-yield"),Object(gf.jsx)(hb,{})]},"solar-updraft-tower")]},"analysis"),Object(gf.jsxs)(sP,{title:me.t("menu.tutorialsSubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.solarEnergyScienceSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.SunAngles",Ye)},"sun_angles"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.InsolationAndClimate",Ye)},"insolation_and_climate"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyScienceTutorials.SolarRadiationToBox",Ye)},"solar_radiation_to_box"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SunBeamAndHeliodon",Ye)},"sun_beam_at_center")]},"solar-energy-science"),Object(gf.jsxs)(sP,{title:me.t("menu.buildingScienceSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.ThermalEnvelopeVsBuildingEnvelope",Ye)},"thermal_vs_building_envelope"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfSizeOnBuildingEnergy",Ye)},"effect_house_size"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfOrientationOnBuildingEnergy",Ye)},"effect_house_orientation"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfInsulationOnBuildingEnergy",Ye)},"effect_wall_roof_insulation"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfRoofColorOnBuildingEnergy",Ye)},"effect_roof_color"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfEavesOverhangLengthOnBuildingEnergy",Ye)},"effect_eaves_overhang_length"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfWindowSHGCOnBuildingEnergy",Ye)},"effect_window_shgc"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfThermostatSetpointOnBuildingEnergy",Ye)},"effect_thermostat_setpoint"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfSolarPanelsOnBuildingEnergy",Ye)},"effect_solar_panels"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfGroundTemperatureOnBuildingEnergy",Ye)},"effect_ground_temperature"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingScienceTutorials.EffectOfTreesOnBuildingEnergy",Ye)},"effect_trees")]},"building-science"),Object(gf.jsxs)(sP,{title:me.t("menu.buildingDesignSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.CapeCodStyleHouseWithShedDormer",Ye)},"cape_cod_with_shed_dormer"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.MansardRoofWithDormers",Ye)},"mansard_roof_with_dormers"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GableRoofVsHipRoof",Ye)},"gable_roof_vs_hip_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.ColonialVsSaltbox",Ye)},"colonial_vs_saltbox"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GambrelRoofVsMansardRoof",Ye)},"gambrel_roof_vs_mansard_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.CombinationRoofVsBonnetRoof",Ye)},"combination_roof_vs_bonnet_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.DutchGableRoof",Ye)},"dutch_gable_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.GableAndValleyRoof",Ye)},"gable_and_valley_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.ClerestoryRoof",Ye)},"clerestory_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.MonitorRoof",Ye)},"monitor_roof"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.AFrameHouse",Ye)},"a_frame_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.HalfTimberedHouse",Ye)},"half_timbered_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingDesignTutorials.AllBasicRoofTypes",Ye)},"all_roof_types")]},"building-design"),Object(gf.jsxs)(sP,{title:me.t("menu.photovoltaicSolarPowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfTiltAngleOfSolarPanel",Ye)},"effect_tilt_angle_solar_panel"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfAzimuthOfSolarPanel",Ye)},"effect_azimuth_solar_panel"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarPanelTypes",Ye)},"solar_panel_types"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.VerticalBifacialSolarPanels",Ye)},"vertical_bifacial_solar_panels"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.CompareMonofacialAndBifacialSolarPanels",Ye)},"compare_monofacial_bifacial_solar_panels"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarTrackers",Ye)},"solar_trackers"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.CoveringGroundWithSolarPanels",Ye)},"why_solar_array"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.InterRowSpacingOfSolarPanelArray",Ye)},"inter_row_spacing"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.EffectOfOrientationOfSolarPanels",Ye)},"effect_orientation_solar_panel"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.photovoltaicSolarPowerTutorials.SolarPanelArrayAutomaticLayout",Ye)},"solar_panel_array_auto_layout"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.RooftopSolarPanels",Ye)},"rooftop_solar_panels"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyFormFactors",Ye)},"solar_canopy_form_factors"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.BuildingIntegratedPhotovoltaics",Ye)},"bipv_01")]},"photovoltaic-solar-power"),Object(gf.jsxs)(sP,{title:me.t("menu.concentratedSolarPowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.FocusSunlightWithParabolicDish",Ye)},"parabolic_dish_focus_sunlight"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfParabolicTrough",Ye)},"effect_azimuth_parabolic_trough"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfLatusRectumOfParabolicTrough",Ye)},"effect_latus_rectum_parabolic_trough"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.LinearFresnelReflectors",Ye)},"linear_fresnel_reflectors"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAbsorberPipeHeightForLinearFresnelReflectors",Ye)},"effect_absorber_pipe_height"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfLinearFresnelReflectors",Ye)},"effect_azimuth_fresnel_reflector"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.LinearFresnelReflectorsWithTwoAbsorbers",Ye)},"linear_fresnel_reflectors_two_absorbers"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.SolarPowerTower",Ye)},"solar_power_tower"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.CosineEfficiencyOfHeliostats",Ye)},"cosine_efficiency_heliostats"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.ShadowingAndBlockingOfHeliostats",Ye)},"shadowing_blocking_heliostats"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.concentratedSolarPowerTutorials.EffectSolarPowerTowerHeight",Ye)},"effect_solar_power_tower_height")]},"concentrated-solar-power"),Object(gf.jsx)(sP,{title:me.t("menu.otherTypesOfSolarPowerSubMenu",Ye),children:Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherTypesOfSolarPowerTutorials.SolarUpdraftTower",Ye)},"solar_updraft_tower")},"other-types-of-solar-power"),Object(gf.jsxs)(sP,{title:me.t("menu.generativeDesignSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(e){return Ve(e.key,48)},children:me.t("menu.generativeDesignTutorials.MonofacialSolarPanelArrayTiltAngle",Ye)},"Tilt Angle"),Object(gf.jsx)(Qv.a.Item,{onClick:function(e){return Ve(e.key,50)},children:me.t("menu.generativeDesignTutorials.BifacialSolarPanelArrayTiltAngle",Ye)},"Bifacial Tilt Angle"),Object(gf.jsx)(Qv.a.Item,{onClick:function(e){return Ve(e.key,0)},children:me.t("menu.generativeDesignTutorials.OutputOfSolarPanelArrayInDifferentPlaces",Ye)},"Latitude"),Object(gf.jsx)(Qv.a.Item,{onClick:function(e){return Ve(e.key,0)},children:me.t("menu.generativeDesignTutorials.SimpleSolarFarmParetoFront",Ye)},"Pareto Front")]},"generative-design")]},"tutorials"),Object(gf.jsxs)(sP,{title:me.t("menu.examplesSubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.solarEnergySubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.photovoltaicSolarPowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.VegetativeBuffer",Ye)},"vegetative_buffer_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyOverBleachers",Ye)},"solar_canopy_over_bleachers"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarCanopyOverGarage",Ye)},"solar_canopy_over_garage"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarBusStop",Ye)},"solar_bus_stop"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarFacadeTesla",Ye)},"solar_facade_tesla"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.Floatovoltaics",Ye)},"floatovoltaics"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.Agrivoltaics",Ye)},"agrivoltaics"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.RainbowSwashSolarFarmBostonMA",Ye)},"rainbow_swash_solar_farm"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.MickeyMouseSolarFarmOrlandoFL",Ye)},"mickey_mouse_solar_farm"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarPanelsOverCanalBakersfieldCA",Ye)},"solar_panels_over_canal"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarNoiseBarrierLexingtonMA",Ye)},"solar_noise_barrier"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.HSATSolarTrackersRaleighNC",Ye)},"solar_farm_hsat_array"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.AADATSolarTrackersLancasterCA",Ye)},"solar_farm_aadat_array")]},"photovoltaic-solar-power-examples"),Object(gf.jsxs)(sP,{title:me.t("menu.concentratedSolarPowerSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.NevadaSolarOneParabolicTroughArray",Ye)},"nevada_solar_one_parabolic_troughs"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.TooeleParabolicDishArray",Ye)},"tooele_parabolic_dish_array"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.TucsonLinearFresnelReflectors",Ye)},"tucson_sundt_station"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.PS10SolarPowerTower",Ye)},"ps10_solar_power_tower")]},"concentrated-solar-power-examples"),Object(gf.jsx)(sP,{title:me.t("menu.otherTypesOfSolarPowerSubMenu",Ye),children:Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.solarEnergyExamples.SolarUpdraftTowerInCity",Ye)},"solar_updraft_tower_city")},"other-types-of-solar-power-examples")]},"solar-energy"),Object(gf.jsxs)(sP,{title:me.t("menu.builtEnvironmentSubMenu",Ye),children:[Object(gf.jsxs)(sP,{title:me.t("menu.residentialBuildingsSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ColonialHouse",Ye)},"colonial_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.DutchColonialHouse",Ye)},"dutch_colonial_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.TShapedHouse",Ye)},"t_shaped_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.CapeCodHouseWithGarage",Ye)},"cape_cod_with_garage"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Solarium",Ye)},"solarium"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ButterflyRoofHouse",Ye)},"butterfly_roof_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.AdobeTaosHouse",Ye)},"adobe_taos_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.RanchHouse",Ye)},"ranch_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.BonnetHouse",Ye)},"bonnet_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.BarnStyleHouse",Ye)},"barn_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.ModernHouse",Ye)},"modern_house_01")]},"residential_buildings"),Object(gf.jsxs)(sP,{title:me.t("menu.commercialBuildingsSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.WhiteHouse",Ye)},"white_house"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.BilimMersinTurkiye",Ye)},"bilim_mersin_turkiye"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.SpanishStyleHotel",Ye)},"spanish_style_hotel"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.ApartmentBuilding",Ye)},"apartment_building_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.OfficeBuilding",Ye)},"office_building_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.commercialBuildingExamples.Hotel",Ye)},"hotel_01")]},"commercial_buildings"),Object(gf.jsxs)(sP,{title:me.t("menu.otherBuildingsSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.Greenhouse",Ye)},"greenhouse"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Church1",Ye)},"church_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Cathedral1",Ye)},"cathedral_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Cathedral2",Ye)},"cathedral_02"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.residentialBuildingExamples.Mosque1",Ye)},"mosque_01"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.Pavilion",Ye)},"pavilion"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.OctagonalPagoda",Ye)},"octagonal_pagoda"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.OceanFront",Ye)},"ocean_front"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.EgyptianPyramids",Ye)},"egyptian_pyramids"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.MayanPyramid",Ye)},"mayan_pyramid"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.SiOSePol",Ye)},"si_o_se_pol"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.otherBuildingExamples.StackedCuboids",Ye)},"stacked_cuboids")]},"other_buildings"),Object(gf.jsxs)(sP,{title:me.t("menu.buildingComplexesSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingComplexExamples.SouthBurlingtonHighSchoolVermont",Ye)},"south_burlington_high_school"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.buildingComplexExamples.MescaleroApacheSchoolNewMexico",Ye)},"mescalero_apache_school")]},"building_complexes"),Object(gf.jsx)(sP,{title:me.t("menu.urbanPlanningSubMenu",Ye),children:Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.urbanPlanningExamples.Heatmap1",Ye)},"heatmap_01")},"urban_planning")]},"built-environment"),Object(gf.jsxs)(sP,{title:me.t("menu.artificialIntelligenceSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.OptimizingTiltAngleOfOneSolarPanelRow",Ye)},"ai_tilt_angle_one_row"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.OptimizingTiltAnglesOfMultipleSolarPanelRows",Ye)},"ai_tilt_angles_multiple_rows"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.SolarFarmGenerativeDesign",Ye)},"ai_solar_farm_design"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.SolarFarmGenerativeDesignWithBlock",Ye)},"ai_solar_farm_design_block"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.artificialIntelligenceExamples.FitchburgSolarFarmGenerativeDesign",Ye)},"ai_fitchburg_solar_farm")]},"artificial-intelligence"),Object(gf.jsxs)(sP,{title:me.t("menu.benchmarksSubMenu",Ye),children:[Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.SolarRadiationPredictionVsMeasurement",Ye)},"solar_radiation_predicted_vs_measured"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase600",Ye)},"bestest_case_600"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase610",Ye)},"bestest_case_610"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase620",Ye)},"bestest_case_620"),Object(gf.jsx)(Qv.a.Item,{onClick:Ue,children:me.t("menu.benchmarks.BESTESTCase630",Ye)},"bestest_case_630")]},"benchmarks")]},"examples"),Object(gf.jsxs)(sP,{title:me.t("menu.publicSubMenu",Ye),children:[le.uid&&!t&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.showModelsGallery=!0,e.leaderboardFlag=!0,e.openModelsMap=!1}))},children:[me.t("menu.ModelsGallery",Ye),"..."]},"my-models"),!j&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.modelsMapFlag=!0,e.modelsMapWeatherStations=!1,e.openModelsMap=!0,e.showModelsGallery=!1})),H&&p((function(e){e.actionInfo={name:"Open Models Map",timestamp:(new Date).getTime()}}))},children:[me.t("menu.ModelsMap",Ye),"..."]},"models-map")]},"public"),Object(gf.jsx)(sP,{title:me.t("menu.languageSubMenu",Ye),children:Object(gf.jsxs)(tb.a.Group,{value:z,style:{height:"170px"},onChange:function(e){p((function(t){switch(t.language=e.target.value,t.language){case"zh_cn":t.locale=Uv.a;break;case"zh_tw":t.locale=Vv.a;break;case"es":t.locale=Gv.a;break;case"tr":t.locale=Bv.a;break;case"ua":t.locale=qv.a;break;default:t.locale=xe.a}}))},children:[Object(gf.jsx)(tb.a,{style:dP,value:"en",children:N.English}),Object(gf.jsx)(tb.a,{style:dP,value:"es",children:N.Spanish}),Object(gf.jsx)(tb.a,{style:dP,value:"zh_cn",children:N.ChineseSimplified}),Object(gf.jsx)(tb.a,{style:dP,value:"zh_tw",children:N.ChineseTraditional}),Object(gf.jsx)(tb.a,{style:dP,value:"tr",children:N.Turkish}),Object(gf.jsx)(tb.a,{style:dP,value:"ua",children:N.Ukrainian})]})},"language"),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){be(!0)},children:[me.t("menu.AboutUs",Ye),"..."]},"about")]});return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(lb.a,{overlay:Ze,trigger:["click"],onVisibleChange:function(e){e&&ke(!Fe)},children:Object(gf.jsxs)(uP,{children:[Object(gf.jsx)(fP,{src:ab,title:me.t("tooltip.clickToOpenMenu",Ye)}),Object(gf.jsx)(hP,{children:Object(gf.jsx)("span",{style:{fontSize:"10px",alignContent:"center",cursor:"pointer"},children:me.t("menu.mainMenu",Ye)})})]})}),ve&&Object(gf.jsx)(cb,{close:function(){return be(!1)}}),Pe&&Object(gf.jsx)(qT,{setDialogVisible:Se}),ze&&Object(gf.jsx)(_T,{saveAs:!1,setDialogVisible:Re}),We&&Object(gf.jsx)(_T,{saveAs:!0,setDialogVisible:Ie})]})},yP=n.a.memo(pP),gP=l(541),mP=l.n(gP),wP=function(){var e={lng:Ew(Vi)};return Object(gf.jsx)(mP.a,{location:"bottom",buttonText:me.t("cookie.Accept",e),cookieName:"AladdinCookieName",style:{background:"#2B373B",textAlign:"center",zIndex:99999},buttonStyle:{color:"#4e503b",fontSize:"12px"},expires:150,children:me.t("cookie.Statement",e)})},xP=.7/Math.cos(Tw.toRadians(42.2845513)),vP=function(){var e,t,l=Ew(si),a=Ew(i.latitude),n=Ew(i.longitude),c=Ew(o.mapZoom),s=Ew(o.mapType),d=Object(r.useRef)(),u=Object(Wy.a)("satellite"===s||"hybrid"===s?"https://maps.googleapis.com/maps/api/staticmap?maptype=satellite¢er="+a+","+n+"&zoom="+c+"&size="+(e=640)+"x"+e+"&scale=2&key=AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs":function(e,t,l,a){return"https://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&style=feature:poi|element:labels|visibility:off¢er="+t+","+l+"&zoom="+a+"&size="+e+"x"+e+"&scale=2&key=AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs"}(640,a,n,c));t=21===c?.5:20===c?1:Math.pow(2,20-c);var f=xP*Math.cos(Tw.toRadians(a))*t;return u?Object(gf.jsxs)("mesh",{rotation:[0,0,0],position:[0,0,0],renderOrder:-1,scale:[f,f,1],receiveShadow:!0,ref:d,onContextMenu:function(e){e.intersections.length>0&&(e.intersections[0].object===d.current&&l((function(t){Yy.selectNone(t),t.pastePoint.copy(e.intersections[0].point),t.clickObjectType=V.Ground,t.contextMenuObjectType=V.Ground,t.pasteNormal=Rt})))},children:[Object(gf.jsx)("planeBufferGeometry",{args:[100,100]}),Object(gf.jsx)("meshStandardMaterial",{attach:"material",depthTest:!1,side:Me.DoubleSide,map:u,opacity:1})]}):Object(gf.jsx)(gf.Fragment,{})},bP=n.a.memo(vP),AP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Ew(si),i=Ew(Vi),r=Ew(ls),n=Ew(os),c=Ew(qc),s=Ew(Sr),u=Tw.isMac();return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(n&&n.length>0){var e=r();if(e.length>0){var t={name:"Paste to Point",timestamp:Date.now(),pastedElements:e.map((function(e){return Object(d.a)({},e)})),undo:function(){var e,l=Object(f.a)(t.pastedElements);try{for(l.s();!(e=l.n()).done;){var a=e.value;c(a.id,!1)}}catch(o){l.e(o)}finally{l.f()}},redo:function(){o((function(e){var l;(l=e.elements).push.apply(l,Object(h.a)(t.pastedElements)),e.selectedElement=t.pastedElements[0],e.updateElementOnRoofFlag=!0}))}};s(t)}}},style:{paddingLeft:l},children:[me.t("word.Paste",{lng:i}),Object(gf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",u?"\u2318":"Ctrl","+V)"]})]},a)},TP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Ew(si),i=Ew(Vi),r=Ew(Kc),n=Ew(ln),c=Ew(Gi),s=Tw.isMac();return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n&&(r(n.id),c&&o((function(e){e.actionInfo={name:"Copy",timestamp:(new Date).getTime(),elementId:n.id,elementType:n.type}})))},style:{paddingLeft:l},children:[me.t("word.Copy",{lng:i}),Object(gf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",s?"\u2318":"Ctrl","+C)"]})]},a)},PP=function(e){var t=e.paddingLeft,l=void 0===t?"36px":t,a=e.keyName,o=Ew(si),i=Ew(Vi),n=Ew(qc),c=Ew(ln),s=Ew(Sr),d=Tw.isMac(),u=Object(r.useMemo)((function(){return{lng:i}}),[i]);return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(c&&c.type!==V.Roof)if(c.locked)Kh(me.t("message.ThisElementIsLocked",u));else{var e=n(c.id,!0);if(0===e.length)return;if(Tw.isElementTriggerAutoDeletion(e[0]))Et.getState().setListenToAutoDeletionByCut(!0),Tf.getState().setPrimitiveStore("selectedElementId",c.id);else{var t={name:"Cut",timestamp:Date.now(),deletedElements:e,selectedElementId:c.id,undo:function(){var e=t.deletedElements;if(0!==e.length){var l=e.find((function(e){return e.id===t.selectedElementId}));l&&o((function(t){var a,o=Object(f.a)(e);try{for(o.s();!(a=o.n()).done;){var i=a.value;t.elements.push(i)}}catch(h){o.e(h)}finally{o.f()}if(l.type===V.Wall){var r=l,n=null,c=null;if(r.leftJoints.length>0&&(n=r.leftJoints[0]),r.rightJoints.length>0&&(c=r.rightJoints[0]),n||c){var s,d=Object(f.a)(t.elements);try{for(d.s();!(s=d.n()).done;){var u=s.value;u.id===n&&u.type===V.Wall&&(u.rightJoints[0]=r.id),u.id===c&&u.type===V.Wall&&(u.leftJoints[0]=r.id)}}catch(h){d.e(h)}finally{d.f()}}}}))}},redo:function(){t.deletedElements&&t.deletedElements.length>0&&n(t.deletedElements[0].id,!0)}};s(t)}}},style:{paddingLeft:l},children:[me.t("word.Cut",{lng:i}),Object(gf.jsxs)("span",{style:{paddingLeft:"4px",fontSize:9},children:["(",d?"\u2318":"Ctrl","+X)"]})]},a)},SP=function(e){var t=e.keyName,l=Ew(Vi),a=Ew(pn),o=Ew(Sr),i=Ew((function(e){return e.elements.find((function(t){return e.selectedElementIdSet.has(t.id)}))})),r=function(e){i&&a(i.id,e)};return Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:null===i||void 0===i?void 0:i.locked,onChange:function(e){var t=e.target.checked,l={name:"Lock",timestamp:Date.now(),checked:t,selectedElementId:null===i||void 0===i?void 0:i.id,selectedElementType:null===i||void 0===i?void 0:i.type,undo:function(){r(!l.checked)},redo:function(){r(l.checked)}};o(l),r(t)},children:me.t("word.Lock",{lng:l})})},t)},jP=l(45),HP=l.n(jP),zP=function(e){var t,l=Object(r.useState)(null!==(t=null===e||void 0===e?void 0:e.label)&&void 0!==t?t:""),a=Object(u.a)(l,2),o=a[0],i=a[1];return Object(r.useEffect)((function(){(null===e||void 0===e?void 0:e.label)&&i(e.label)}),[null===e||void 0===e?void 0:e.id]),{labelText:o,setLabelText:i}},RP=function(e){var t=Ew(Sr),l=Ew(mn);return function(){if(e){var a={name:"Show Label for "+e.type,timestamp:Date.now(),checked:!e.showLabel,selectedElementId:e.id,selectedElementType:e.type,undo:function(){l(e.id,!a.checked)},redo:function(){l(e.id,a.checked)}};t(a),l(e.id,!e.showLabel)}}},DP=function(e,t){var l=Ew(gn),a=Ew(Sr);return function(){if(e){var o=e.label,i={name:"Set Label for "+e.type,timestamp:Date.now(),oldValue:o,newValue:t,changedElementId:e.id,changedElementType:e.type,undo:function(){l(i.changedElementId,i.oldValue)},redo:function(){l(i.changedElementId,i.newValue)}};a(i),l(e.id,t)}}},MP=function(e){var t=Ew(si),l=Ew(Sr),a=function(l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===(null===e||void 0===e?void 0:e.id)){i.labelFontSize=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return function(t){if(e){var o,i=null!==(o=e.labelFontSize)&&void 0!==o?o:20,r=t,n={name:"Set Label Font Size for "+e.type,timestamp:Date.now(),oldValue:i,newValue:r,undo:function(){a(n.oldValue)},redo:function(){a(n.newValue)}};l(n),a(r)}}},WP=function(e){var t=Ew(si),l=Ew(Sr),a=function(l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===(null===e||void 0===e?void 0:e.id)){i.labelSize=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return function(t){if(e){var o,i=null!==(o=e.labelSize)&&void 0!==o?o:.2,r=t,n={name:"Set Label Size for "+e.type,timestamp:Date.now(),oldValue:i,newValue:r,undo:function(){a(n.oldValue)},redo:function(){a(n.newValue)}};l(n),a(r)}}},IP=function(e){var t=Ew(si),l=Ew(Sr),a=function(l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===(null===e||void 0===e?void 0:e.id)){i.labelColor=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return function(t){if(e){var o,i=null!==(o=e.labelColor)&&void 0!==o?o:"white",r=t,n={name:"Set Label Color for "+e.type,timestamp:Date.now(),oldValue:i,newValue:r,undo:function(){a(n.oldValue)},redo:function(){a(n.newValue)}};l(n),a(r)}}},CP=function(e){var t=Ew(si),l=Ew(Sr),a=function(l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===(null===e||void 0===e?void 0:e.id)){i.labelHeight=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return function(t){if(e){var o,i=null!==(o=e.labelHeight)&&void 0!==o?o:e.lz/2+.2,r=t,n={name:"Set Label Height for "+e.type,timestamp:Date.now(),oldValue:i,newValue:r,undo:function(){a(n.oldValue)},redo:function(){a(n.newValue)}};l(n),a(r)}}},OP=function(e){return Ew((function(t){if(t.selectedElement)return t.elements.find((function(l){var a;return l.id===(null===(a=t.selectedElement)||void 0===a?void 0:a.id)&&l.type===e}))}))},FP=function(e){var t=Object(r.useState)(e),l=Object(u.a)(t,2),a=l[0],o=l[1];return[a,function(e){o(e.hex)}]},kP=function(e){var t=e.width,l=e.title,a=e.rejectedMessage,o=e.onApply,i=e.onClose,n=e.onClickOk,c=e.onClickCancel,s=e.children,d=Ew(Ci),f=Ew(Oi),h=$f(),p=Object(r.useState)({left:0,top:0,bottom:0,right:0}),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(!1),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useRef)(null),T=function(){n?n():(o(),i(),d(0))};Object(r.useEffect)((function(){var e=function(e){"Enter"===e.key&&T()};return window.addEventListener("keydown",e),function(){return window.removeEventListener("keydown",e)}}),[T]);var P=!!a&&a.length>0;return Object(gf.jsx)(Zv.a,{width:t,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return b(!0)},onMouseOut:function(){return b(!1)},children:[l,P&&Object(gf.jsx)("span",{style:{color:"red",fontWeight:"bold"},children:a})]}),footer:[Object(gf.jsx)(xv.a,{onClick:o,children:me.t("word.Apply",h)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){c?c():(i(),f())},children:me.t("word.Cancel",h)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:T,children:me.t("word.OK",h)},"OK")],onCancel:i,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!v,bounds:g,onStart:function(e,t){return function(e,t){if(A.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=A.current.getBoundingClientRect();m({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:A,children:e})})},children:s})},YP=l(64),LP=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Dn),i=Ew(Zr),n=Ew(In),c=Ew(Sr),s=Ew(Jn),d=Ew(Ci),h=OP(V.Foundation),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.color)&&void 0!==t?t:"#808080"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&e.has(i.id))if(void 0!==t)i.color=t;else{var r=e.get(i.id);void 0!==r&&(i.color=r)}}}catch(n){o.e(n)}finally{o.f()}}))},v=function(e){if(h&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.color)return!0}}catch(n){l.e(n)}finally{l.f()}break;case _.AllObjectsOfThisType:var o,i=Object(f.a)(Ew.getState().elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.Foundation&&!r.locked&&e!==r.color)return!0}}catch(n){i.e(n)}finally{i.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.color))return!0}return!1}(e)){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(Ew.getState().elements);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.color)&&void 0!==p?p:"#808080")}}catch(H){r.e(H)}finally{r.f()}var g={name:"Set Color for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){x(g.oldValues)},redo:function(){x(g.oldValues,g.newValue)}};c(g),x(l,e),d(Ew.getState().applyCount+1);break;case _.AllObjectsOfThisType:var m,w=new Map,v=Object(f.a)(Ew.getState().elements);try{for(v.s();!(m=v.n()).done;){var b,A=m.value;if(A.type===V.Foundation)w.set(A.id,null!==(b=A.color)&&void 0!==b?b:"#808080")}}catch(H){v.e(H)}finally{v.f()}var T={name:"Set Color for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(H){t.e(H)}finally{t.f()}},redo:function(){n(V.Foundation,T.newValue)}};c(T),n(V.Foundation,e),d(Ew.getState().applyCount+1);break;default:var P=i(h.id),S=P?P.color:h.color,j={name:"Set Color of Selected Foundation",timestamp:Date.now(),oldValue:S,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){o(j.changedElementId,j.oldValue)},redo:function(){o(j.changedElementId,j.newValue)}};c(j),o(h.id,e),d(Ew.getState().applyCount+1)}a((function(t){t.actionState.foundationColor=e}))}};return Object(gf.jsx)(kP,{width:600,title:me.t("word.Color",w),onApply:function(){v(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",w)})]})})})]})})},EP=function(e){var t,l=e.setDialogVisible,a=Ew(Vi),o=Ew(Fi),i=Ew(Zr),n=Ew(wn),c=Ew(An),s=Ew(Pn),h=Ew(qn),p=Ew(en),y=Ew(cn),g=Ew(Sr),m=Ew(Jn),w=Ew(si),x=Ew(Ii),v=Ew(Ci),b=Ew(Oi),A=OP(V.Foundation),T=Object(r.useState)(null!==(t=null===A||void 0===A?void 0:A.lx)&&void 0!==t?t:.1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(new Map),O=Object(r.useRef)(!1),F=Object(r.useRef)(),k={lng:a},Y=function(e){return!function(e){if(A){switch(m){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a,r=p(i.id);if(r.length>0&&!Tw.doesNewSizeContainAllChildren(i,r,e,i.ly))return!1}}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(o);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Foundation){var d=s,u=p(d.id);if(u.length>0&&!Tw.doesNewSizeContainAllChildren(d,u,e,d.ly))return!1}}}catch(y){c.e(y)}finally{c.f()}break;default:var h=p(A.id);if(h.length>0)return Tw.doesNewSizeContainAllChildren(A,h,e,A.ly)}return!0}}(e)},L=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},E=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(c){o.e(c)}finally{o.f()}w((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.id){i.parentId=xt;var r=new Me.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,D.current.set(i.id,new Me.Vector3(r.x,r.y,0)),z.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},U=function(e,t){var l=p(e.id),a=e.rotation[2];if(M.current.clear(),C.current.clear(),l.length>0){var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;switch(r.type){case V.Wall:break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var s=new Me.Vector2(r.cx*e.lx,r.cy*e.ly).rotateAround(Dt,a);M.current.set(r.id,s),R.current.set(r.id,new Me.Vector3(r.cx,r.cy));break;case V.Polygon:var u,y=r,g=[],m=Object(f.a)(y.vertices);try{for(m.s();!(u=m.n()).done;){var w=u.value;g.push(new Me.Vector2(w.x*e.lx,w.y*e.ly).rotateAround(Dt,a))}}catch(J){m.e(J)}finally{m.f()}C.current.set(r.id,g),W.current.set(r.id,y.vertices.map((function(e){return Object(d.a)({},e)})));break;case V.Human:case V.Tree:R.current.set(r.id,new Me.Vector3(r.cx,r.cy,r.cz))}}}catch(J){i.e(J)}finally{i.f()}}if(c(e.id,t),l.length>0){var x,v=Object(f.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;switch(b.type){case V.Wall:break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var A=M.current.get(b.id);if(A){var T=new Me.Vector2(A.x,A.y).rotateAround(Dt,-a).x/t;n(b.id,T),D.current.set(b.id,new Me.Vector3(T,b.cy))}break;case V.Polygon:var P=C.current.get(b.id);if(P){var S,j=[],z=Object(f.a)(P);try{for(z.s();!(S=z.n()).done;){var O=S.value.rotateAround(Dt,-a),F=O.x/t,k=O.y/e.ly;j.push({x:F,y:k})}}catch(J){z.e(J)}finally{z.f()}h(b.id,j),I.current.set(b.id,j.map((function(e){return Object(d.a)({},e)})))}break;case V.Human:case V.Tree:if(D.current.set(b.id,new Me.Vector3(b.cx,b.cy,b.cz)),H.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var Y=Et.getState().contentRef,U=L(null===Y||void 0===Y?void 0:Y.current,e.id);E(U,e,b)}}else if(Math.abs(Math.abs(b.cx)-e.lx/2)0?t:-t)/2;n(b.id,N),D.current.set(b.id,new Me.Vector3(N,b.cy,b.cz))}}}}catch(J){v.e(J)}finally{v.f()}}},N=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=L(null===a||void 0===a?void 0:a.current,t),i=L(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=L(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},J=function(e,t){e&&w((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},G=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.lx=t;else{var r=e.get(i.id);void 0!==r&&(i.lx=r)}}}catch(n){o.e(n)}finally{o.f()}}))},X=function(e){if(A&&function(e){if(A){switch(m){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===A||void 0===A?void 0:A.lx)-e)>At)return!0}return!1}}(e)){var t=i(A.id),l=t?t.lx:A.lx;if(F.current=void 0,O.current=Y(e),O.current)F.current=e,j(l);else switch(R.current.clear(),D.current.clear(),W.current.clear(),I.current.clear(),m){case _.AllSelectedObjectsOfThisType:var a,r=new Map,n=Object(f.a)(o);try{for(n.s();!(a=n.n()).done;){var d=a.value;d.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(d.id)&&r.set(d.id,d.lx)}}catch(K){n.e(K)}finally{n.f()}var p,w=Object(f.a)(o);try{for(w.s();!(p=w.n()).done;){var b=p.value;b.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(b.id)&&U(b,e)}}catch(K){w.e(K)}finally{w.f()}var T={name:"Set Length for Selected Foundations",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(R.current),newChildrenPositionsMap:new Map(D.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(z.current),undo:function(){if(G(T.oldSizes),T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(T.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=T.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=T.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(N(n,c,i),J(n,i))}}catch(K){t.e(K)}finally{t.f()}}if(T.oldChildrenVerticesMap&&T.oldChildrenVerticesMap.size>0){var s,d=Object(f.a)(T.oldChildrenVerticesMap.entries());try{for(d.s();!(s=d.n()).done;){var p=Object(u.a)(s.value,2),g=p[0],m=p[1];h(g,m)}}catch(K){d.e(K)}finally{d.f()}}},redo:function(){if(G(T.oldSizes,T.newSize),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(T.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=T.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=T.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(N(c,n,i),J(c,i))}}catch(K){t.e(K)}finally{t.f()}}if(T.newChildrenVerticesMap&&T.newChildrenVerticesMap.size>0){var s,d=Object(f.a)(T.newChildrenVerticesMap.entries());try{for(d.s();!(s=d.n()).done;){var p=Object(u.a)(s.value,2),g=p[0],m=p[1];h(g,m)}}catch(K){d.e(K)}finally{d.f()}}}};g(T),v(x+1);break;case _.AllObjectsOfThisType:var P,S=new Map,M=Object(f.a)(o);try{for(M.s();!(P=M.n()).done;){var C=P.value;C.type===V.Foundation&&S.set(C.id,C.lx)}}catch(K){M.e(K)}finally{M.f()}var k,L=Object(f.a)(o);try{for(L.s();!(k=L.n()).done;){var E=k.value;E.type===V.Foundation&&U(E,e)}}catch(K){L.e(K)}finally{L.f()}var X={name:"Set Length for All Foundations",timestamp:Date.now(),oldSizes:S,newSize:e,oldChildrenPositionsMap:new Map(R.current),newChildrenPositionsMap:new Map(D.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(z.current),undo:function(){var e,t=Object(f.a)(X.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(K){t.e(K)}finally{t.f()}if(X.oldChildrenPositionsMap&&X.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(X.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,s,d=Object(u.a)(i.value,2),p=d[0],g=d[1];y(p,g.x,g.y,g.z);var m=null===(n=X.oldChildrenParentIdMap)||void 0===n?void 0:n.get(p),w=null===(s=X.newChildrenParentIdMap)||void 0===s?void 0:s.get(p);m&&w&&m!==w&&(N(m,w,p),J(m,p))}}catch(K){r.e(K)}finally{r.f()}}if(X.oldChildrenVerticesMap&&X.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(X.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(K){v.e(K)}finally{v.f()}}},redo:function(){if(s(V.Foundation,X.newSize),X.newChildrenPositionsMap&&X.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(X.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=X.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=X.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(N(c,n,i),J(c,i))}}catch(K){t.e(K)}finally{t.f()}}if(X.newChildrenVerticesMap&&X.newChildrenVerticesMap.size>0){var d,p=Object(f.a)(X.newChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];h(m,w)}}catch(K){p.e(K)}finally{p.f()}}}};g(X),v(x+1);break;default:U(A,e);var B={name:"Set Foundation Length",timestamp:Date.now(),oldSize:l,newSize:e,resizedElementId:A.id,resizedElementType:A.type,oldChildrenPositionsMap:new Map(R.current),newChildrenPositionsMap:new Map(D.current),oldChildrenVerticesMap:new Map(W.current),newChildrenVerticesMap:new Map(I.current),oldChildrenParentIdMap:new Map(H.current),newChildrenParentIdMap:new Map(z.current),undo:function(){if(c(A.id,B.oldSize),B.oldChildrenPositionsMap&&B.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(B.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=B.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=B.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(N(n,s,i),J(n,i))}}catch(K){t.e(K)}finally{t.f()}}if(B.oldChildrenVerticesMap&&B.oldChildrenVerticesMap.size>0){var d,p=Object(f.a)(B.oldChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];h(m,w)}}catch(K){p.e(K)}finally{p.f()}}},redo:function(){if(c(A.id,B.newSize),B.newChildrenPositionsMap&&B.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(B.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];y(i,r.x,r.y,r.z);var n=null===(l=B.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=B.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(N(s,n,i),J(s,i))}}catch(K){t.e(K)}finally{t.f()}}if(B.newChildrenVerticesMap&&B.newChildrenVerticesMap.size>0){var d,p=Object(f.a)(B.newChildrenVerticesMap.entries());try{for(p.s();!(d=p.n()).done;){var g=Object(u.a)(d.value,2),m=g[0],w=g[1];h(m,w)}}catch(K){p.e(K)}finally{p.f()}}}};g(B),v(x+1)}}},B=function(){l(!1)},K=O.current?": "+me.t("message.NotApplicableToSelectedAction",k)+(void 0!==F.current?" ("+F.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Length",k),rejectedMessage:K,onApply:function(){X(S)},onClose:B,onClickCancel:function(){B(),b()},onClickOk:function(){X(S),O.current||(l(!1),v(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:S,onChange:j}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",k),": [0.1, 1000] ",me.t("word.MeterAbbreviation",k)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",k)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:m,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",k)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",k)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",k)})]})})})]})})},UP=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(cn),n=Ew(xn),c=Ew(Sn),s=Ew(Hn),h=Ew(qn),p=Ew(en),y=Ew(Sr),g=Ew(Jn),m=Ew(si),w=Ew(Ii),x=Ew(Ci),v=Ew(Oi),b=OP(V.Foundation),A=Object(r.useState)(null!==(t=null===b||void 0===b?void 0:b.ly)&&void 0!==t?t:.1),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),O=Object(r.useRef)(),F=$f(),k=function(e){return!function(e){if(b){switch(g){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o,r=p(i.id);if(r.length>0&&!Tw.doesNewSizeContainAllChildren(i,r,i.lx,e))return!1}}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(a);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Foundation){var d=s,u=p(d.id);if(u.length>0&&!Tw.doesNewSizeContainAllChildren(d,u,d.lx,e))return!1}}}catch(y){c.e(y)}finally{c.f()}break;default:var h=p(b.id);if(h.length>0)return Tw.doesNewSizeContainAllChildren(b,h,b.lx,e)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},L=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(c){o.e(c)}finally{o.f()}m((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.id){i.parentId=xt;var r=new Me.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new Me.Vector3(r.x,r.y,0)),H.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},E=function(e,t){var l=p(e.id),a=e.rotation[2];if(D.current.clear(),I.current.clear(),l.length>0){var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;switch(r.type){case V.Wall:break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var s=new Me.Vector2(r.cx*e.lx,r.cy*e.ly).rotateAround(Dt,a);D.current.set(r.id,s),z.current.set(r.id,new Me.Vector3(r.cx,r.cy));break;case V.Polygon:var u,y=r,g=[],m=Object(f.a)(y.vertices);try{for(m.s();!(u=m.n()).done;){var w=u.value;g.push(new Me.Vector2(w.x*e.lx,w.y*e.ly).rotateAround(Dt,a))}}catch(J){m.e(J)}finally{m.f()}I.current.set(r.id,g),M.current.set(r.id,y.vertices.map((function(e){return Object(d.a)({},e)})));break;case V.Human:case V.Tree:z.current.set(r.id,new Me.Vector3(r.cx,r.cy,r.cz))}}}catch(J){i.e(J)}finally{i.f()}}if(c(e.id,t),l.length>0){var x,v=Object(f.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;switch(b.type){case V.Wall:break;case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:case V.Sensor:var A=D.current.get(b.id);if(A){var T=new Me.Vector2(A.x,A.y).rotateAround(Dt,-a).y/t;n(b.id,T),R.current.set(b.id,new Me.Vector3(b.cx,T))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,H=[],C=Object(f.a)(P);try{for(C.s();!(S=C.n()).done;){var O=S.value.rotateAround(Dt,-a),F=O.x/e.lx,k=O.y/t;H.push({x:F,y:k})}}catch(J){C.e(J)}finally{C.f()}h(b.id,H),W.current.set(b.id,H.map((function(e){return Object(d.a)({},e)})))}break;case V.Human:case V.Tree:if(R.current.set(b.id,new Me.Vector3(b.cx,b.cy,b.cz)),j.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var E=Et.getState().contentRef,U=Y(null===E||void 0===E?void 0:E.current,e.id);L(U,e,b)}}else if(Math.abs(Math.abs(b.cy)-e.ly/2)0?t:-t)/2;n(b.id,N),R.current.set(b.id,new Me.Vector3(b.cz,N,b.cz))}}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=Y(null===a||void 0===a?void 0:a.current,t),i=Y(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=Y(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},N=function(e,t){e&&m((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},J=function(e){if(b&&function(e){if(b){switch(g){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(d){n.e(d)}finally{n.f()}break;default:if(Math.abs((null===b||void 0===b?void 0:b.ly)-e)>At)return!0}return!1}}(e)){var t=o(b.id),l=t?t.ly:b.ly;if(O.current=void 0,C.current=k(e),C.current)O.current=e,S(l);else switch(z.current.clear(),R.current.clear(),M.current.clear(),W.current.clear(),g){case _.AllSelectedObjectsOfThisType:var r,n=new Map,d=Object(f.a)(a);try{for(d.s();!(r=d.n()).done;){var p=r.value;p.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(p.id)&&n.set(p.id,p.ly)}}catch(B){d.e(B)}finally{d.f()}var m,v=Object(f.a)(a);try{for(v.s();!(m=v.n()).done;){var A=m.value;A.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(A.id)&&E(A,e)}}catch(B){v.e(B)}finally{v.f()}var T={name:"Set Width for Selected Foundations",timestamp:Date.now(),oldSizes:n,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(T.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var r,n=Object(f.a)(T.oldChildrenPositionsMap.entries());try{for(n.s();!(r=n.n()).done;){var s,d,p=Object(u.a)(r.value,2),y=p[0],g=p[1];i(y,g.x,g.y,g.z);var m=null===(s=T.oldChildrenParentIdMap)||void 0===s?void 0:s.get(y),w=null===(d=T.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(B){n.e(B)}finally{n.f()}}if(T.oldChildrenVerticesMap&&T.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(T.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],P=b[1];h(A,P)}}catch(B){v.e(B)}finally{v.f()}}},redo:function(){var e,t=Object(f.a)(T.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];c(a,T.newSize)}}catch(B){t.e(B)}finally{t.f()}if(T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var o,r=Object(f.a)(T.newChildrenPositionsMap.entries());try{for(r.s();!(o=r.n()).done;){var n,s,d=Object(u.a)(o.value,2),p=d[0],y=d[1];i(p,y.x,y.y,y.z);var g=null===(n=T.oldChildrenParentIdMap)||void 0===n?void 0:n.get(p),m=null===(s=T.newChildrenParentIdMap)||void 0===s?void 0:s.get(p);g&&m&&g!==m&&(U(m,g,p),N(m,p))}}catch(B){r.e(B)}finally{r.f()}}if(T.newChildrenVerticesMap&&T.newChildrenVerticesMap.size>0){var w,x=Object(f.a)(T.newChildrenVerticesMap.entries());try{for(x.s();!(w=x.n()).done;){var v=Object(u.a)(w.value,2),b=v[0],A=v[1];h(b,A)}}catch(B){x.e(B)}finally{x.f()}}}};y(T),x(w+1);break;case _.AllObjectsOfThisType:var P,D=new Map,I=Object(f.a)(a);try{for(I.s();!(P=I.n()).done;){var F=P.value;F.type===V.Foundation&&D.set(F.id,F.ly)}}catch(B){I.e(B)}finally{I.f()}var Y,L=Object(f.a)(a);try{for(L.s();!(Y=L.n()).done;){var J=Y.value;J.type===V.Foundation&&E(J,e)}}catch(B){L.e(B)}finally{L.f()}var G={name:"Set Width for All Foundations",timestamp:Date.now(),oldSizes:D,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(G.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}if(G.oldChildrenPositionsMap&&G.oldChildrenPositionsMap.size>0){var r,n=Object(f.a)(G.oldChildrenPositionsMap.entries());try{for(n.s();!(r=n.n()).done;){var s,d,p=Object(u.a)(r.value,2),y=p[0],g=p[1];i(y,g.x,g.y,g.z);var m=null===(s=G.oldChildrenParentIdMap)||void 0===s?void 0:s.get(y),w=null===(d=G.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(B){n.e(B)}finally{n.f()}}if(G.oldChildrenVerticesMap&&G.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(G.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(B){v.e(B)}finally{v.f()}}},redo:function(){if(s(V.Foundation,G.newSize),G.newChildrenPositionsMap&&G.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(G.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),r=o[0],n=o[1];i(r,n.x,n.y,n.z);var c=null===(l=G.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=G.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);c&&d&&c!==d&&(U(d,c,r),N(d,r))}}catch(B){t.e(B)}finally{t.f()}}if(G.newChildrenVerticesMap&&G.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(G.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(B){y.e(B)}finally{y.f()}}}};y(G),x(w+1);break;default:E(b,e);var X={name:"Set Foundation Width",timestamp:Date.now(),oldSize:l,newSize:e,resizedElementId:b.id,resizedElementType:b.type,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){if(c(b.id,X.oldSize),X.oldChildrenPositionsMap&&X.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(X.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),r=o[0],n=o[1];i(r,n.x,n.y,n.z);var s=null===(l=X.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=X.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);s&&d&&s!==d&&(U(s,d,r),N(s,r))}}catch(B){t.e(B)}finally{t.f()}}if(X.oldChildrenVerticesMap&&X.oldChildrenVerticesMap.size>0){var p,y=Object(f.a)(X.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(B){y.e(B)}finally{y.f()}}},redo:function(){if(c(b.id,X.newSize),X.newChildrenPositionsMap&&X.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(X.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),r=o[0],n=o[1];i(r,n.x,n.y,n.z);var s=null===(l=X.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(a=X.newChildrenParentIdMap)||void 0===a?void 0:a.get(r);s&&d&&s!==d&&(U(d,s,r),N(d,r))}}catch(B){t.e(B)}finally{t.f()}}if(X.newChildrenVerticesMap&&X.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(X.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(B){y.e(B)}finally{y.f()}}}};y(X),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",F)+(void 0!==O.current?" ("+O.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Width",F),rejectedMessage:X,onApply:function(){J(P)},onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},onClose:G,children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [0.1, 1000] ",me.t("word.MeterAbbreviation",F)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",F)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:g,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",F)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",F)})]})})})]})})},NP=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(cn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.lz)&&void 0!==t?t:.1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useRef)(new Map),v=Object(r.useRef)(new Map),b=Object(r.useRef)(new Map),A=Object(r.useRef)(new Map),T=$f(),P=function(e,t){a((function(l){var a=l.elements.find((function(t){return t.id===e}));a&&(a.lz=t,a.cz=t/2)}))},S=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==e||i.locked||(i.lz=t,i.cz=t/2)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},H=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(s){o.e(s)}finally{o.f()}l.parentId=xt;var c=new Me.Vector2(l.cx,l.cy).rotateAround(Dt,-t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));l.cx=c.x,l.cy=c.y,l.cz=0,A.current.set(l.id,new Me.Vector3(c.x,c.y,0)),v.current.set(l.id,xt)}},z=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.parentId===e.id&&(x.current.set(i.id,e.id),b.current.set(i.id,new Me.Vector3(i.cx,i.cy,i.cz)),Tw.isPlantOrHuman(i)))if(Math.abs(i.cz-e.lz/2)t/2){var n=Et.getState().contentRef,c=j(null===n||void 0===n?void 0:n.current,e.id);H(c,e,i)}else i.cz=r,A.current.set(i.id,new Me.Vector3(i.cx,i.cy,r))}}}catch(s){o.e(s)}finally{o.f()}}))},R=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=j(null===a||void 0===a?void 0:a.current,t),i=j(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=j(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},D=function(e,t){e&&a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},M=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.lz=t,i.cz=t/2;else{var r=e.get(i.id);void 0!==r&&(i.lz=r,i.cz=r/2)}}}catch(n){o.e(n)}finally{o.f()}}))},W=function(e){if(p&&function(e){if(p){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lz-e)>At)return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(Math.abs(d.lz-e)>At)return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(Math.abs((null===p||void 0===p?void 0:p.lz)-e)>At)return!0}return!1}}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Foundation&&!y.locked&&Ew.getState().selectedElementIdSet.has(y.id)&&l.set(y.id,y.lz)}}catch(U){r.e(U)}finally{r.f()}var g,m=Object(f.a)(o);try{for(m.s();!(g=m.n()).done;){var w=g.value;w.type===V.Foundation&&!w.locked&&Ew.getState().selectedElementIdSet.has(w.id)&&z(w,e)}}catch(U){m.e(U)}finally{m.f()}var T={name:"Set Height for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,oldChildrenPositionsMap:new Map(b.current),newChildrenPositionsMap:new Map(A.current),oldChildrenParentIdMap:new Map(x.current),newChildrenParentIdMap:new Map(v.current),undo:function(){if(M(T.oldValues),T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(T.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];s(i,r.x,r.y,r.z);var n=null===(l=T.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=T.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(n,c,i),D(n,i))}}catch(U){t.e(U)}finally{t.f()}}},redo:function(){var e=T.newValue;if(M(T.oldValues,e),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(T.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];s(r,n.x,n.y,n.z);var c=null===(a=T.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),d=null===(o=T.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&d&&c!==d&&(R(d,c,r),D(d,r))}}catch(U){l.e(U)}finally{l.f()}}}};n(T),M(l,e),h(d+1);break;case _.AllObjectsOfThisType:var j,H=new Map,W=Object(f.a)(o);try{for(W.s();!(j=W.n()).done;){var I=j.value;I.type===V.Foundation&&H.set(I.id,I.lz)}}catch(U){W.e(U)}finally{W.f()}var C,O=Object(f.a)(o);try{for(O.s();!(C=O.n()).done;){var F=C.value;F.type===V.Foundation&&z(F,e)}}catch(U){O.e(U)}finally{O.f()}var k={name:"Set Height for All Foundations",timestamp:Date.now(),oldValues:H,newValue:e,oldChildrenPositionsMap:new Map(b.current),newChildrenPositionsMap:new Map(A.current),oldChildrenParentIdMap:new Map(x.current),newChildrenParentIdMap:new Map(v.current),undo:function(){var e,t=Object(f.a)(k.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];P(a,o)}}catch(U){t.e(U)}finally{t.f()}if(k.oldChildrenPositionsMap&&k.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(k.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,d=Object(u.a)(i.value,2),h=d[0],p=d[1];s(h,p.x,p.y,p.z);var y=null===(n=k.oldChildrenParentIdMap)||void 0===n?void 0:n.get(h),g=null===(c=k.newChildrenParentIdMap)||void 0===c?void 0:c.get(h);y&&g&&y!==g&&(R(y,g,h),D(y,h))}}catch(U){r.e(U)}finally{r.f()}}},redo:function(){var e=k.newValue;if(S(V.Foundation,e),k.newChildrenPositionsMap&&k.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(k.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];s(r,n.x,n.y,n.z);var c=null===(a=k.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),d=null===(o=k.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&d&&c!==d&&(R(d,c,r),D(d,r))}}catch(U){l.e(U)}finally{l.f()}}}};n(k),S(V.Foundation,e),h(d+1);break;default:var Y=i(p.id),L=Y?Y.lz:p.lz;z(p,e),P(p.id,e);var E={name:"Set Foundation Height",timestamp:Date.now(),oldValue:L,newValue:e,oldChildrenPositionsMap:new Map(b.current),newChildrenPositionsMap:new Map(A.current),oldChildrenParentIdMap:new Map(x.current),newChildrenParentIdMap:new Map(v.current),changedElementId:p.id,changedElementType:p.type,undo:function(){if(P(E.changedElementId,E.oldValue),E.oldChildrenPositionsMap&&E.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(E.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];s(i,r.x,r.y,r.z);var n=null===(l=E.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=E.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(n,c,i),D(n,i))}}catch(U){t.e(U)}finally{t.f()}}},redo:function(){if(P(E.changedElementId,E.newValue),E.newChildrenPositionsMap&&E.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(E.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];s(i,r.x,r.y,r.z);var n=null===(l=E.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=E.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(R(c,n,i),D(c,i))}}catch(U){t.e(U)}finally{t.f()}}}};n(E),h(d+1)}a((function(t){t.actionState.foundationHeight=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Height",T),onApply:function(){W(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:10,style:{width:120},step:.1,precision:2,value:m,onChange:function(e){w(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",T),": [0.1, 10] ",me.t("word.MeterAbbreviation",T)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",T)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",T)})]})})})]})})},VP=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(Nn),n=Ew(Vn),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(p&&null!==(t=-(null===p||void 0===p?void 0:p.rotation[2]))&&void 0!==t?t:0),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.rotation[2]=t;else{var r=e.get(i.id);void 0!==r&&(i.rotation[2]=-r)}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){if(p&&function(e){if(p){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Foundation&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(-i.rotation[2]-e)>At)return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(Math.abs(-d.rotation[2]-e)>At)return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(Math.abs(-(null===p||void 0===p?void 0:p.rotation[2])-e)>At)return!0}return!1}}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(y.id)&&l.set(y.id,-y.rotation[2])}}catch(j){r.e(j)}finally{r.f()}var g={name:"Set Azimuth for All Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(g.oldValues)},redo:function(){v(g.oldValues,-g.newValue)}};c(g),v(l,-e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(a);try{for(x.s();!(m=x.n()).done;){var b=m.value;b.type===V.Foundation&&w.set(b.id,-b.rotation[2])}}catch(j){x.e(j)}finally{x.f()}var A={name:"Set Azimuth for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,0,0,-o)}}catch(j){t.e(j)}finally{t.f()}},redo:function(){n(V.Foundation,0,0,-A.newValue)}};c(A),n(V.Foundation,0,0,-e),h(d+1);break;default:var T=o(p.id),P=T?-T.rotation[2]:-p.rotation[2],S={name:"Set Foundation Azimuth",timestamp:Date.now(),oldValue:P,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){i(S.changedElementId,0,0,-S.oldValue)},redo:function(){i(S.changedElementId,0,0,-S.newValue)}};c(S),i(p.id,0,0,-e),h(d+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("word.Azimuth",x),onApply:function(){b(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:-180,max:180,style:{width:120},step:.5,precision:2,value:parseFloat(Tw.toDegrees(m).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){w(Tw.toRadians(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",paddingRight:"6px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [-180\xb0, 180\xb0]",Object(gf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",x),Object(gf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},JP="data:image/png;base64,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",GP="data:image/png;base64,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",XP=l.p+"static/media/foundation_03_menu.1a0820a4.png",BP=l.p+"static/media/foundation_04_menu.cfdf351d.png",KP=l.p+"static/media/foundation_05_menu.7f382511.png",qP="data:image/png;base64,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",QP=l.p+"static/media/foundation_07_menu.cf056d65.png",ZP=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.textureType)&&void 0!==t?t:se.NoTexture),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=db.a.Option,v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){i.textureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Foundation||o.locked||(o.textureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&e.has(i.id))if(void 0!==t)i.textureType=t;else{var r=e.get(i.id);void 0!==r&&(i.textureType=r)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(h&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.textureType)return!0}}catch(s){l.e(s)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Foundation&&!n.locked&&e!==n.textureType)return!0}}catch(s){r.e(s)}finally{r.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.textureType))return!0}return!1}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.textureType)&&void 0!==p?p:se.NoTexture)}}catch(R){r.e(R)}finally{r.f()}var g={name:"Set Texture for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(g.oldValues)},redo:function(){A(g.oldValues,g.newValue)}};n(g),A(l,e),d(s+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var T,P=m.value;if(P.type===V.Foundation)w.set(P.id,null!==(T=P.textureType)&&void 0!==T?T:se.NoTexture)}}catch(R){x.e(R)}finally{x.f()}var S={name:"Set Texture for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(R){t.e(R)}finally{t.f()}},redo:function(){b(S.newValue)}};n(S),b(e),d(s+1);break;default:var j=i(h.id),H=j?j.textureType:h.textureType,z={name:"Set Texture of Selected Foundation",timestamp:Date.now(),oldValue:H,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(z.changedElementId,z.oldValue)},redo:function(){v(z.changedElementId,z.newValue)}};n(z),v(h.id,e),d(s+1)}a((function(t){t.actionState.foundationTexture=e}))}};return Object(gf.jsx)(kP,{width:500,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:g,onChange:m,children:[Object(gf.jsxs)(x,{value:se.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",w)]},se.NoTexture),Object(gf.jsxs)(x,{value:se.Texture01,children:[Object(gf.jsx)("img",{alt:se.Texture01,src:JP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture01",w)]},se.Texture01),Object(gf.jsxs)(x,{value:se.Texture02,children:[Object(gf.jsx)("img",{alt:se.Texture02,src:GP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture02",w)]},se.Texture02),Object(gf.jsxs)(x,{value:se.Texture03,children:[Object(gf.jsx)("img",{alt:se.Texture03,src:XP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture03",w)]},se.Texture03),Object(gf.jsxs)(x,{value:se.Texture04,children:[Object(gf.jsx)("img",{alt:se.Texture04,src:BP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture04",w)]},se.Texture04),Object(gf.jsxs)(x,{value:se.Texture05,children:[Object(gf.jsx)("img",{alt:se.Texture05,src:KP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture05",w)]},se.Texture05),Object(gf.jsxs)(x,{value:se.Texture06,children:[Object(gf.jsx)("img",{alt:se.Texture06,src:qP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture06",w)]},se.Texture06),Object(gf.jsxs)(x,{value:se.Texture07,children:[Object(gf.jsx)("img",{alt:se.Texture07,src:QP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("foundationMenu.Texture07",w)]},se.Texture07)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",w)})]})})})]})})},_P=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.absorberHeight)&&void 0!==t?t:10),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberHeight=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.absorberHeight=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberHeight=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberHeight||Math.abs(i.solarAbsorberPipe.absorberHeight-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.absorberHeight||Math.abs(d.solarAbsorberPipe.absorberHeight-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.absorberHeight)||Math.abs((null===p||void 0===p?void 0:p.absorberHeight)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberHeight)&&void 0!==m?m:10)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Height for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.absorberHeight)&&void 0!==H?H:10)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Height for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.absorberHeight)&&void 0!==t?t:10:null!==(l=p.absorberHeight)&&void 0!==l?l:10;v(h.id,e);var W={name:"Set Absorber Height on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberHeight",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:50,style:{width:120},step:.5,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [1, 50] ",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},$P=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.absorberAbsorptance)&&void 0!==t?t:.95),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberAbsorptance=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.absorberAbsorptance=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberAbsorptance=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberAbsorptance||Math.abs(i.solarAbsorberPipe.absorberAbsorptance-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.absorberAbsorptance||Math.abs(d.solarAbsorberPipe.absorberAbsorptance-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.absorberAbsorptance)||Math.abs((null===p||void 0===p?void 0:p.absorberAbsorptance)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberAbsorptance)&&void 0!==m?m:.95)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Pipe Absorptance for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.absorberAbsorptance)&&void 0!==H?H:.95)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Pipe Absorptance for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.absorberAbsorptance)&&void 0!==t?t:.95:null!==(l=p.absorberAbsorptance)&&void 0!==l?l:.95;v(h.id,e);var W={name:"Set Absorber Pipe Absorptance on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberAbsorptance",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},eS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.absorberOpticalEfficiency)&&void 0!==t?t:.7),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberOpticalEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.absorberOpticalEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberOpticalEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberOpticalEfficiency||Math.abs(i.solarAbsorberPipe.absorberOpticalEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.absorberOpticalEfficiency||Math.abs(d.solarAbsorberPipe.absorberOpticalEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.absorberOpticalEfficiency)||Math.abs((null===p||void 0===p?void 0:p.absorberOpticalEfficiency)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==m?m:.7)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Optical Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==H?H:.7)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Optical Efficiency for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.absorberOpticalEfficiency)&&void 0!==t?t:.7:null!==(l=p.absorberOpticalEfficiency)&&void 0!==l?l:.7;v(h.id,e);var W={name:"Set Absorber Optical Efficiency on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberOpticalEfficiency",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},tS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.absorberThermalEfficiency)&&void 0!==t?t:.3),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberThermalEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.absorberThermalEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.absorberThermalEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.absorberThermalEfficiency||Math.abs(i.solarAbsorberPipe.absorberThermalEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.absorberThermalEfficiency||Math.abs(d.solarAbsorberPipe.absorberThermalEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.absorberThermalEfficiency)||Math.abs((null===p||void 0===p?void 0:p.absorberThermalEfficiency)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==m?m:.3)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Thermal Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==H?H:.3)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Thermal Efficiency for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.absorberThermalEfficiency)&&void 0!==t?t:.3:null!==(l=p.absorberThermalEfficiency)&&void 0!==l?l:.3;v(h.id,e);var W={name:"Set Absorber Thermal Efficiency on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarAbsorberPipeMenu.AbsorberThermalEfficiency",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},lS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.apertureWidth)&&void 0!==t?t:.6),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.apertureWidth=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.apertureWidth=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.apertureWidth=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.apertureWidth||Math.abs(i.solarAbsorberPipe.apertureWidth-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.apertureWidth||Math.abs(d.solarAbsorberPipe.apertureWidth-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.apertureWidth)||Math.abs((null===p||void 0===p?void 0:p.apertureWidth)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.apertureWidth)&&void 0!==m?m:.6)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Aperture Width for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.apertureWidth)&&void 0!==H?H:.6)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Aperture Width for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.apertureWidth)&&void 0!==t?t:.6:null!==(l=p.apertureWidth)&&void 0!==l?l:.6;v(h.id,e);var W={name:"Set Absorber Aperture Width on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberApertureWidth",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:2,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.1, 2] ",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},aS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarAbsorberPipe,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.poleNumber)&&void 0!==t?t:5),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.poleNumber=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusPipe&&(i.solarAbsorberPipe||(i.solarAbsorberPipe={}),i.solarAbsorberPipe.poleNumber=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusPipe&&(r.solarAbsorberPipe||(r.solarAbsorberPipe={}),r.solarAbsorberPipe.poleNumber=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusPipe&&i.solarAbsorberPipe&&(void 0===i.solarAbsorberPipe.poleNumber||i.solarAbsorberPipe.poleNumber!==e))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusPipe&&d.solarAbsorberPipe&&(void 0===d.solarAbsorberPipe.poleNumber||d.solarAbsorberPipe.poleNumber!==e))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.poleNumber)||(null===p||void 0===p?void 0:p.poleNumber)!==e)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarAbsorberPipe)r.set(g.id,null!==(m=w.solarAbsorberPipe.poleNumber)&&void 0!==m?m:5)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Absorber Pipe Pole Number for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarAbsorberPipe)P.set(j.id,null!==(H=z.solarAbsorberPipe.poleNumber)&&void 0!==H?H:5)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Absorber Pipe Pole Number for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarAbsorberPipe?null!==(t=D.solarAbsorberPipe.poleNumber)&&void 0!==t?t:5:null!==(l=p.poleNumber)&&void 0!==l?l:5;v(h.id,e);var W={name:"Set Absorber Pipe Pole Number on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarAbsorberPipeMenu.AbsorberPipePoleNumber",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:1,max:100,style:{width:120},step:1,precision:0,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [1, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},oS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Ew(si),c=Ew(Fi),s=Ew(Zr),d=Ew(Sr),h=Ew(Jn),p=Ew(Ii),y=Ew(Ci),g=OP(V.Foundation),m=Object(r.useState)(null!==(t=null===g||void 0===g||null===(l=g.solarUpdraftTower)||void 0===l?void 0:l.chimneyHeight)&&void 0!==t?t:Math.max(null!==(a=null===g||void 0===g?void 0:g.lx)&&void 0!==a?a:0,null!==(o=null===g||void 0===g?void 0:g.ly)&&void 0!==o?o:0)),w=Object(u.a)(m,2),x=w[0],v=w[1],b=$f(),A=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.chimneyHeight=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){n((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.chimneyHeight=e)}}}catch(r){a.e(r)}finally{a.f()}}))},P=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.chimneyHeight=t)}}}catch(n){o.e(n)}finally{o.f()}}))},S=function(e){if(g&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.chimneyHeight||Math.abs(o.solarUpdraftTower.chimneyHeight-e)>At))return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(c);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Foundation&&!n.locked){var s=n;if(s.solarStructure===G.UpdraftTower&&s.solarUpdraftTower&&(void 0===s.solarUpdraftTower.chimneyHeight||Math.abs(s.solarUpdraftTower.chimneyHeight-e)>At))return!0}}}catch(d){r.e(d)}finally{r.f()}break;default:if(g&&g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower&&(void 0===g.solarUpdraftTower.chimneyHeight||Math.abs(g.solarUpdraftTower.chimneyHeight-e)>At))return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i,r,n=o;if(n.solarStructure===G.UpdraftTower&&n.solarUpdraftTower)l.set(o.id,null!==(i=null===(r=n.solarUpdraftTower)||void 0===r?void 0:r.chimneyHeight)&&void 0!==i?i:Math.max(n.lx,n.ly))}}}catch(C){a.e(C)}finally{a.f()}var m={name:"Set Solar Chimney Height for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){P(m.oldValues,m.newValue)}};d(m),P(l,e),y(p+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(c);try{for(v.s();!(w=v.n()).done;){var b=w.value;if(b.type===V.Foundation){var S,j,H=b;if(H.solarStructure===G.UpdraftTower&&H.solarUpdraftTower)x.set(b.id,null!==(S=null===(j=H.solarUpdraftTower)||void 0===j?void 0:j.chimneyHeight)&&void 0!==S?S:Math.max(H.lx,H.ly))}}}catch(C){v.e(C)}finally{v.f()}var z={name:"Set Solar Chimney Height for All Foundations",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){T(z.newValue)}};d(z),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var R,D,M=s(g.id),W=M&&M.solarUpdraftTower?null!==(R=M.solarUpdraftTower.chimneyHeight)&&void 0!==R?R:Math.max(M.lx,M.ly):null!==(D=g.solarUpdraftTower.chimneyHeight)&&void 0!==D?D:Math.max(g.lx,g.ly);A(g.id,e);var I={name:"Set Solar Chimney Height on Foundation",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(I.changedElementId,I.oldValue)},redo:function(){A(I.changedElementId,I.newValue)}};d(I),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight",b),onApply:function(){S(x)},onClose:function(){i(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:1e3,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [1, 1000] ",me.t("word.MeterAbbreviation",b)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},iS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Ew(si),c=Ew(Fi),s=Ew(Zr),d=Ew(Sr),h=Ew(Jn),p=Ew(Ii),y=Ew(Ci),g=OP(V.Foundation),m=Object(r.useState)(null!==(t=null===g||void 0===g||null===(l=g.solarUpdraftTower)||void 0===l?void 0:l.chimneyRadius)&&void 0!==t?t:Math.max(1,.025*Math.min(null!==(a=null===g||void 0===g?void 0:g.lx)&&void 0!==a?a:0,null!==(o=null===g||void 0===g?void 0:g.ly)&&void 0!==o?o:0))),w=Object(u.a)(m,2),x=w[0],v=w[1],b=$f(),A=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.chimneyRadius=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){n((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.chimneyRadius=e)}}}catch(r){a.e(r)}finally{a.f()}}))},P=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.chimneyRadius=t)}}}catch(n){o.e(n)}finally{o.f()}}))},S=function(e){if(g&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.chimneyRadius||Math.abs(o.solarUpdraftTower.chimneyRadius-e)>At))return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(c);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Foundation&&!n.locked){var s=n;if(s.solarStructure===G.UpdraftTower&&s.solarUpdraftTower&&(void 0===s.solarUpdraftTower.chimneyRadius||Math.abs(s.solarUpdraftTower.chimneyRadius-e)>At))return!0}}}catch(d){r.e(d)}finally{r.f()}break;default:if(g&&g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower&&(void 0===g.solarUpdraftTower.chimneyRadius||Math.abs(g.solarUpdraftTower.chimneyRadius-e)>At))return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i,r,n=o;if(n.solarStructure===G.UpdraftTower&&n.solarUpdraftTower)l.set(o.id,null!==(i=null===(r=n.solarUpdraftTower)||void 0===r?void 0:r.chimneyRadius)&&void 0!==i?i:Math.max(1,.025*Math.min(n.lx,n.ly)))}}}catch(C){a.e(C)}finally{a.f()}var m={name:"Set Solar Chimney Radius for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){P(m.oldValues,m.newValue)}};d(m),P(l,e),y(p+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(c);try{for(v.s();!(w=v.n()).done;){var b=w.value;if(b.type===V.Foundation){var S,j,H=b;if(H.solarStructure===G.UpdraftTower&&H.solarUpdraftTower)x.set(b.id,null!==(S=null===(j=H.solarUpdraftTower)||void 0===j?void 0:j.chimneyRadius)&&void 0!==S?S:Math.max(1,.025*Math.min(H.lx,H.ly)))}}}catch(C){v.e(C)}finally{v.f()}var z={name:"Set Solar Chimney Radius for All Foundations",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){T(z.newValue)}};d(z),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var R,D,M=s(g.id),W=M&&M.solarUpdraftTower?null!==(R=M.solarUpdraftTower.chimneyRadius)&&void 0!==R?R:Math.max(1,.025*Math.min(M.lx,M.ly)):null!==(D=g.solarUpdraftTower.chimneyRadius)&&void 0!==D?D:Math.max(1,.025*Math.min(g.lx,g.ly));A(g.id,e);var I={name:"Set Solar Chimney Radius on Foundation",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(I.changedElementId,I.oldValue)},redo:function(){A(I.changedElementId,I.newValue)}};d(I),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius",b),onApply:function(){S(x)},onClose:function(){i(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:10,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [0.1, 10] ",me.t("word.MeterAbbreviation",b)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},rS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Ew(si),c=Ew(Fi),s=Ew(Zr),d=Ew(Sr),h=Ew(Jn),p=Ew(Ii),y=Ew(Ci),g=OP(V.Foundation),m=Object(r.useState)(null!==(t=null===g||void 0===g||null===(l=g.solarUpdraftTower)||void 0===l?void 0:l.collectorRadius)&&void 0!==t?t:Math.max(10,.5*Math.min(null!==(a=null===g||void 0===g?void 0:g.lx)&&void 0!==a?a:0,null!==(o=null===g||void 0===g?void 0:g.ly)&&void 0!==o?o:0))),w=Object(u.a)(m,2),x=w[0],v=w[1],b=$f(),A=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorRadius=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){n((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.collectorRadius=e)}}}catch(r){a.e(r)}finally{a.f()}}))},P=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorRadius=t)}}}catch(n){o.e(n)}finally{o.f()}}))},S=function(e){if(g&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(c);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.collectorRadius||Math.abs(o.solarUpdraftTower.collectorRadius-e)>At))return!0}}}catch(d){l.e(d)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(c);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Foundation&&!n.locked){var s=n;if(s.solarStructure===G.UpdraftTower&&s.solarUpdraftTower&&(void 0===s.solarUpdraftTower.collectorRadius||Math.abs(s.solarUpdraftTower.collectorRadius-e)>At))return!0}}}catch(d){r.e(d)}finally{r.f()}break;default:if(g&&g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower&&(void 0===g.solarUpdraftTower.collectorRadius||Math.abs(g.solarUpdraftTower.collectorRadius-e)>At))return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(c);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i,r=o;if(r.solarStructure===G.UpdraftTower&&r.solarUpdraftTower)l.set(o.id,null!==(i=r.solarUpdraftTower.collectorRadius)&&void 0!==i?i:Math.max(10,.5*Math.min(r.lx,r.ly)))}}}catch(W){a.e(W)}finally{a.f()}var n={name:"Set Solar Collector Radius for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(n.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){P(n.oldValues,n.newValue)}};d(n),P(l,e),y(p+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(c);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Foundation){var b,S=v;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(v.id,null!==(b=S.solarUpdraftTower.collectorRadius)&&void 0!==b?b:Math.max(10,.5*Math.min(S.lx,S.ly)))}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Collector Radius for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){T(j.newValue)}};d(j),T(e),y(p+1);break;default:if(g.solarStructure===G.UpdraftTower&&g.solarUpdraftTower){var H,z,R=s(g.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.collectorRadius)&&void 0!==H?H:Math.max(10,.5*Math.min(R.lx,R.ly)):null!==(z=g.solarUpdraftTower.collectorRadius)&&void 0!==z?z:Math.max(10,.5*Math.min(g.lx,g.ly));A(g.id,e);var M={name:"Set Solar Collector Radius on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(M.changedElementId,M.oldValue)},redo:function(){A(M.changedElementId,M.newValue)}};d(M),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius",b),onApply:function(){S(x)},onClose:function(){i(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:1e3,style:{width:120},step:1,precision:1,value:x,onChange:v}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",b),": [1, 1000] ",me.t("word.MeterAbbreviation",b)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",b)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",b)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",b)})]})})})]})})},nS=function(e){var t,l,a,o=e.setDialogVisible,i=Ew(si),n=(Ew(Vi),Ew(Fi)),c=Ew(Zr),s=Ew(Sr),d=Ew(Jn),h=(Ew(Gn),Ew(Ii)),p=Ew(Ci),y=(Ew(Oi),OP(V.Foundation)),g=Object(r.useState)(null!==(t=null===y||void 0===y||null===(l=y.solarUpdraftTower)||void 0===l?void 0:l.collectorHeight)&&void 0!==t?t:Math.max(3,10*(null!==(a=null===y||void 0===y?void 0:y.lz)&&void 0!==a?a:0))),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){i((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorHeight=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},A=function(e){i((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.collectorHeight=e)}}}catch(r){a.e(r)}finally{a.f()}}))},T=function(e,t){i((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorHeight=t)}}}catch(n){o.e(n)}finally{o.f()}}))},P=function(e){if(y&&function(e){switch(d){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(n);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.collectorHeight||Math.abs(o.solarUpdraftTower.collectorHeight-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(n);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Foundation&&!c.locked){var s=c;if(s.solarStructure===G.UpdraftTower&&s.solarUpdraftTower&&(void 0===s.solarUpdraftTower.collectorHeight||Math.abs(s.solarUpdraftTower.collectorHeight-e)>At))return!0}}}catch(u){r.e(u)}finally{r.f()}break;default:if(y&&y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower&&(void 0===y.solarUpdraftTower.collectorHeight||Math.abs(y.solarUpdraftTower.collectorHeight-e)>At))return!0}return!1}(e))switch(d){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(n);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var i,r=o;if(r.solarStructure===G.UpdraftTower&&r.solarUpdraftTower)l.set(o.id,null!==(i=r.solarUpdraftTower.collectorHeight)&&void 0!==i?i:Math.max(3,10*r.lz))}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Collector Height for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){T(g.oldValues,g.newValue)}};s(g),T(l,e),p(h+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(n);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Foundation){var P,S=v;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(v.id,null!==(P=S.solarUpdraftTower.collectorHeight)&&void 0!==P?P:Math.max(3,10*S.lz))}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Collector Height for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(j.newValue)}};s(j),A(e),p(h+1);break;default:if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower){var H,z,R=c(y.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.collectorHeight)&&void 0!==H?H:Math.max(3,10*R.lz):null!==(z=y.solarUpdraftTower.collectorHeight)&&void 0!==z?z:Math.max(3,10*y.lz);b(y.id,e);var M={name:"Set Solar Collector Height on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(M.changedElementId,M.oldValue)},redo:function(){b(M.changedElementId,M.newValue)}};s(M),p(h+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight",v),onApply:function(){P(w)},onClose:function(){o(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:20,style:{width:120},step:1,precision:1,value:w,onChange:x}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [0.1, 20] ",me.t("word.MeterAbbreviation",v)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:d,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",v)})]})})})]})})},cS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.towerHeight)&&void 0!==t?t:20),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.towerHeight=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.towerHeight=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.towerHeight=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.towerHeight||Math.abs(i.solarPowerTower.towerHeight-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.towerHeight||Math.abs(d.solarPowerTower.towerHeight-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.towerHeight)||Math.abs((null===p||void 0===p?void 0:p.towerHeight)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.towerHeight)&&void 0!==m?m:20)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Tower Height for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.towerHeight)&&void 0!==H?H:20)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Tower Height for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.towerHeight)&&void 0!==t?t:20:null!==(l=p.towerHeight)&&void 0!==l?l:20;v(h.id,e);var W={name:"Set Tower Height on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverTowerHeight",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:10,max:500,style:{width:120},step:1,precision:1,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [10, 500] ",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},sS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.towerRadius)&&void 0!==t?t:1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.towerRadius=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.towerRadius=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.towerRadius=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.towerRadius||Math.abs(i.solarPowerTower.towerRadius-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.towerRadius||Math.abs(d.solarPowerTower.towerRadius-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.towerRadius)||Math.abs((null===p||void 0===p?void 0:p.towerRadius)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.towerRadius)&&void 0!==m?m:1)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Tower Radius for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.towerRadius)&&void 0!==H?H:1)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Tower Radius for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.towerRadius)&&void 0!==t?t:1:null!==(l=p.towerRadius)&&void 0!==l?l:1;v(h.id,e);var W={name:"Set Tower Radius on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverTowerRadius",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.5,max:10,style:{width:120},step:.5,precision:1,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.5, 10] ",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},dS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.receiverAbsorptance)&&void 0!==t?t:.95),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverAbsorptance=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.receiverAbsorptance=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverAbsorptance=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverAbsorptance||Math.abs(i.solarPowerTower.receiverAbsorptance-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.receiverAbsorptance||Math.abs(d.solarPowerTower.receiverAbsorptance-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.receiverAbsorptance)||Math.abs((null===p||void 0===p?void 0:p.receiverAbsorptance)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.receiverAbsorptance)&&void 0!==m?m:.95)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Receiver Absorptance for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.receiverAbsorptance)&&void 0!==H?H:.95)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Receiver Absorptance for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.receiverAbsorptance)&&void 0!==t?t:.95:null!==(l=p.receiverAbsorptance)&&void 0!==l?l:.95;v(h.id,e);var W={name:"Set Receiver Absorptance on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarPowerTowerMenu.ReceiverAbsorptance",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},uS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.receiverOpticalEfficiency)&&void 0!==t?t:.7),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverOpticalEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.receiverOpticalEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverOpticalEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverOpticalEfficiency||Math.abs(i.solarPowerTower.receiverOpticalEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.receiverOpticalEfficiency||Math.abs(d.solarPowerTower.receiverOpticalEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.receiverOpticalEfficiency)||Math.abs((null===p||void 0===p?void 0:p.receiverOpticalEfficiency)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.receiverOpticalEfficiency)&&void 0!==m?m:.7)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Receiver Optical Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.receiverOpticalEfficiency)&&void 0!==H?H:.7)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Receiver Optical Efficiency for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.receiverOpticalEfficiency)&&void 0!==t?t:.7:null!==(l=p.receiverOpticalEfficiency)&&void 0!==l?l:.7;v(h.id,e);var W={name:"Set Receiver Optical Efficiency on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("solarPowerTowerMenu.ReceiverOpticalEfficiency",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},fS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Jn),s=Ew(Ii),d=Ew(Ci),h=OP(V.Foundation),p=null===h||void 0===h?void 0:h.solarPowerTower,y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.receiverThermalEfficiency)&&void 0!==t?t:.3),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverThermalEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.FocusTower&&(i.solarPowerTower||(i.solarPowerTower={}),i.solarPowerTower.receiverThermalEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.FocusTower&&(r.solarPowerTower||(r.solarPowerTower={}),r.solarPowerTower.receiverThermalEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){var t,l;if(h&&p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(i.solarStructure===G.FocusTower&&i.solarPowerTower&&(void 0===i.solarPowerTower.receiverThermalEfficiency||Math.abs(i.solarPowerTower.receiverThermalEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Foundation&&!s.locked){var d=s;if(d.solarStructure===G.FocusTower&&d.solarPowerTower&&(void 0===d.solarPowerTower.receiverThermalEfficiency||Math.abs(d.solarPowerTower.receiverThermalEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(void 0===(null===p||void 0===p?void 0:p.receiverThermalEfficiency)||Math.abs((null===p||void 0===p?void 0:p.receiverThermalEfficiency)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var a,r=new Map,y=Object(f.a)(o);try{for(y.s();!(a=y.n()).done;){var g=a.value;if(g.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(g.id)){var m,w=g;if(w.solarPowerTower)r.set(g.id,null!==(m=w.solarPowerTower.receiverThermalEfficiency)&&void 0!==m?m:.3)}}}catch(I){y.e(I)}finally{y.f()}var x={name:"Set Receiver Thermal Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){A(x.oldValues,x.newValue)}};n(x),A(r,e),d(s+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(o);try{for(S.s();!(T=S.n()).done;){var j=T.value;if(j.type===V.Foundation){var H,z=j;if(z.solarPowerTower)P.set(j.id,null!==(H=z.solarPowerTower.receiverThermalEfficiency)&&void 0!==H?H:.3)}}}catch(I){S.e(I)}finally{S.f()}var R={name:"Set Receiver Thermal Efficiency for All Foundations",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){b(R.newValue)}};n(R),b(e),d(s+1);break;default:var D=i(h.id),M=D&&D.solarPowerTower?null!==(t=D.solarPowerTower.receiverThermalEfficiency)&&void 0!==t?t:.3:null!==(l=p.receiverThermalEfficiency)&&void 0!==l?l:.3;v(h.id,e);var W={name:"Set Receiver Thermal Efficiency on Foundation",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};n(W),d(s+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPowerTowerMenu.ReceiverThermalEfficiency",x),onApply:function(){T(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:8,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},hS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.solarUpdraftTower)||void 0===l?void 0:l.collectorTransmissivity)&&void 0!==t?t:.9),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorTransmissivity=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.collectorTransmissivity=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorTransmissivity=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(p&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.collectorTransmissivity||Math.abs(o.solarUpdraftTower.collectorTransmissivity-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(d.solarStructure===G.UpdraftTower&&d.solarUpdraftTower&&(void 0===d.solarUpdraftTower.collectorTransmissivity||Math.abs(d.solarUpdraftTower.collectorTransmissivity-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(p&&p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower&&(void 0===p.solarUpdraftTower.collectorTransmissivity||Math.abs(p.solarUpdraftTower.collectorTransmissivity-e)>At))return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var r,y=o;if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower)l.set(o.id,null!==(r=y.solarUpdraftTower.collectorTransmissivity)&&void 0!==r?r:.9)}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Collector Transmissivity for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};c(g),A(l,e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(i);try{for(x.s();!(m=x.n()).done;){var T=m.value;if(T.type===V.Foundation){var P,S=T;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(T.id,null!==(P=S.solarUpdraftTower.collectorTransmissivity)&&void 0!==P?P:.9)}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Collector Transmissivity for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(j.newValue)}};c(j),b(e),h(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var H,z,R=n(p.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.collectorTransmissivity)&&void 0!==H?H:.9:null!==(z=p.solarUpdraftTower.collectorTransmissivity)&&void 0!==z?z:.9;v(p.id,e);var M={name:"Set Solar Collector Transmissivity on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};c(M),h(d+1)}}};return Object(gf.jsx)(kP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},pS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.solarUpdraftTower)||void 0===l?void 0:l.dischargeCoefficient)&&void 0!==t?t:.65),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.dischargeCoefficient=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.dischargeCoefficient=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.dischargeCoefficient=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(p&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.dischargeCoefficient||Math.abs(o.solarUpdraftTower.dischargeCoefficient-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(d.solarStructure===G.UpdraftTower&&d.solarUpdraftTower&&(void 0===d.solarUpdraftTower.dischargeCoefficient||Math.abs(d.solarUpdraftTower.dischargeCoefficient-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(p&&p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower&&(void 0===p.solarUpdraftTower.dischargeCoefficient||Math.abs(p.solarUpdraftTower.dischargeCoefficient-e)>At))return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var r,y=o;if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower)l.set(o.id,null!==(r=y.solarUpdraftTower.dischargeCoefficient)&&void 0!==r?r:.65)}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Chimney Discharge Coefficient for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};c(g),A(l,e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(i);try{for(x.s();!(m=x.n()).done;){var T=m.value;if(T.type===V.Foundation){var P,S=T;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(T.id,null!==(P=S.solarUpdraftTower.dischargeCoefficient)&&void 0!==P?P:.65)}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Chimney Discharge Coefficient for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(j.newValue)}};c(j),b(e),h(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var H,z,R=n(p.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.dischargeCoefficient)&&void 0!==H?H:.65:null!==(z=p.solarUpdraftTower.dischargeCoefficient)&&void 0!==z?z:.65;v(p.id,e);var M={name:"Set Solar Chimney Discharge Coefficient on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};c(M),h(d+1)}}};return Object(gf.jsx)(kP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.65,max:.7,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.65, 0.70]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},yS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.solarUpdraftTower)||void 0===l?void 0:l.turbineEfficiency)&&void 0!==t?t:.3),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.turbineEfficiency=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.turbineEfficiency=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.turbineEfficiency=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(p&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.turbineEfficiency||Math.abs(o.solarUpdraftTower.turbineEfficiency-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(d.solarStructure===G.UpdraftTower&&d.solarUpdraftTower&&(void 0===d.solarUpdraftTower.turbineEfficiency||Math.abs(d.solarUpdraftTower.turbineEfficiency-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(p&&p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower&&(void 0===p.solarUpdraftTower.turbineEfficiency||Math.abs(p.solarUpdraftTower.turbineEfficiency-e)>At))return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var r,y=o;if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower)l.set(o.id,null!==(r=y.solarUpdraftTower.turbineEfficiency)&&void 0!==r?r:.3)}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Updraft Tower Turbine Efficiency for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};c(g),A(l,e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(i);try{for(x.s();!(m=x.n()).done;){var T=m.value;if(T.type===V.Foundation){var P,S=T;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(T.id,null!==(P=S.solarUpdraftTower.turbineEfficiency)&&void 0!==P?P:.3)}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Updraft Tower Turbine Efficiency for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(j.newValue)}};c(j),b(e),h(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var H,z,R=n(p.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.turbineEfficiency)&&void 0!==H?H:.3:null!==(z=p.solarUpdraftTower.turbineEfficiency)&&void 0!==z?z:.3;v(p.id,e);var M={name:"Set Solar Updraft Tower Turbine Efficiency on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};c(M),h(d+1)}}};return Object(gf.jsx)(kP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerTurbineEfficiency",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.2,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.2, 1.0]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},gS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Sr),s=Ew(Jn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Foundation),y=Object(r.useState)(null!==(t=null===p||void 0===p||null===(l=p.solarUpdraftTower)||void 0===l?void 0:l.collectorEmissivity)&&void 0!==t?t:.95),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorEmissivity=t);break}}}catch(n){o.e(n)}finally{o.f()}}))},b=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Foundation&&!o.locked){var i=o;i.solarStructure===G.UpdraftTower&&(i.solarUpdraftTower||(i.solarUpdraftTower={}),i.solarUpdraftTower.collectorEmissivity=e)}}}catch(r){a.e(r)}finally{a.f()}}))},A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked&&e.has(i.id)){var r=i;r.solarStructure===G.UpdraftTower&&(r.solarUpdraftTower||(r.solarUpdraftTower={}),r.solarUpdraftTower.collectorEmissivity=t)}}}catch(n){o.e(n)}finally{o.f()}}))},T=function(e){if(p&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&(void 0===o.solarUpdraftTower.collectorEmissivity||Math.abs(o.solarUpdraftTower.collectorEmissivity-e)>At))return!0}}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Foundation&&!c.locked){var d=c;if(d.solarStructure===G.UpdraftTower&&d.solarUpdraftTower&&(void 0===d.solarUpdraftTower.collectorEmissivity||Math.abs(d.solarUpdraftTower.collectorEmissivity-e)>At))return!0}}}catch(u){n.e(u)}finally{n.f()}break;default:if(p&&p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower&&(void 0===p.solarUpdraftTower.collectorEmissivity||Math.abs(p.solarUpdraftTower.collectorEmissivity-e)>At))return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Foundation&&Ew.getState().selectedElementIdSet.has(o.id)){var r,y=o;if(y.solarStructure===G.UpdraftTower&&y.solarUpdraftTower)l.set(o.id,null!==(r=y.solarUpdraftTower.collectorEmissivity)&&void 0!==r?r:.95)}}}catch(W){a.e(W)}finally{a.f()}var g={name:"Set Solar Collector Emissivity for Selected Foundations",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};c(g),A(l,e),h(d+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(i);try{for(x.s();!(m=x.n()).done;){var T=m.value;if(T.type===V.Foundation){var P,S=T;if(S.solarStructure===G.UpdraftTower&&S.solarUpdraftTower)w.set(T.id,null!==(P=S.solarUpdraftTower.collectorEmissivity)&&void 0!==P?P:.95)}}}catch(W){x.e(W)}finally{x.f()}var j={name:"Set Solar Collector Emissivity for All Foundations",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(j.newValue)}};c(j),b(e),h(d+1);break;default:if(p.solarStructure===G.UpdraftTower&&p.solarUpdraftTower){var H,z,R=n(p.id),D=R&&R.solarUpdraftTower?null!==(H=R.solarUpdraftTower.collectorEmissivity)&&void 0!==H?H:.95:null!==(z=p.solarUpdraftTower.collectorEmissivity)&&void 0!==z?z:.95;v(p.id,e);var M={name:"Set Solar Collector Emissivity on Foundation",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(M.changedElementId,M.oldValue)},redo:function(){v(M.changedElementId,M.newValue)}};c(M),h(d+1)}}};return Object(gf.jsx)(kP,{width:540,title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.01,max:1,style:{width:120},step:.01,precision:2,value:m,onChange:w}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",marginLeft:"16px",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setFoundationActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("foundationMenu.AllSelectedFoundations",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllFoundations",x)})]})})})]})})},mS=db.a.Option,wS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Gi),n=Ew(Vi),c=Tf(Nr),s=Object(r.useState)(!1),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(r.useState)(!1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)({left:0,top:0,bottom:0,right:0}),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useRef)(null),T=Ew(uf).geneticAlgorithmParams,P=Object(r.useRef)(T.selectionMethod),S=Object(r.useRef)(T.searchMethod),j=Object(r.useRef)(Math.min(T.objectiveFunctionType,W.YEARLY_TOTAL_OUTPUT)),H=Object(r.useRef)(T.populationSize),z=Object(r.useRef)(T.maximumGenerations),R=Object(r.useRef)(T.mutationRate),D=Object(r.useRef)(null!==(t=T.selectionRate)&&void 0!==t?t:.5),F=Object(r.useRef)(null!==(l=T.crossoverRate)&&void 0!==l?l:.5),k=Object(r.useRef)(T.convergenceThreshold),Y=Object(r.useRef)(T.localSearchRadius),L=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=L.current)||void 0===e||e.focus()}),[]);var E={lng:n},U=function(){c||Kh(me.t("message.EvolutionStarted",E)),o((function(e){e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=M.SOLAR_PANEL_TILT_ANGLE,e.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType=j.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod=P.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod=S.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize=H.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations=z.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate=D.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate=F.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate=R.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold=k.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius=Y.current})),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!e.runEvolution})),o((function(e){e.evolutionMethod=I.GENETIC_ALGORITHM,e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=M.SOLAR_PANEL_TILT_ANGLE,i&&(e.actionInfo={name:"Run Genetic Algorithm for Solar Panel Tilt Angle",timestamp:(new Date).getTime()})}))}),100)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)(Zv.a,{width:640,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return m(!0)},onMouseOut:function(){return m(!1)},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",E)+": ",me.t("optimizationMenu.GeneticAlgorithmSettings",E)]}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){a(!1)},children:me.t("word.Cancel",E)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:L,onClick:function(){U(),a(!1)},children:me.t("word.Run",E)},"Run")],onCancel:function(){a(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!g,bounds:v,onStart:function(e,t){return function(e,t){if(A.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=A.current.getBoundingClientRect();b({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:A,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:j.current,style:{width:"100%"},value:j.current,onChange:function(e){j.current=e,h(!f)},children:[Object(gf.jsx)(mS,{value:W.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",E)},W.DAILY_TOTAL_OUTPUT),Object(gf.jsx)(mS,{value:W.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",E)},W.YEARLY_TOTAL_OUTPUT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.GeneticAlgorithmSelectionMethod",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:P.current,style:{width:"100%"},value:P.current,onChange:function(e){P.current=e,h(!f)},children:[Object(gf.jsx)(mS,{value:C.ROULETTE_WHEEL,children:me.t("optimizationMenu.RouletteWheel",E)},C.ROULETTE_WHEEL),Object(gf.jsx)(mS,{value:C.TOURNAMENT,children:me.t("optimizationMenu.Tournament",E)},C.TOURNAMENT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.PopulationSize",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:10,max:100,style:{width:"100%"},precision:0,formatter:function(e){return Number(e).toFixed(0)},value:H.current,step:1,onChange:function(e){H.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumGenerations",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:5,max:100,step:1,style:{width:"100%"},precision:0,formatter:function(e){return Number(e).toFixed(0)},value:z.current,onChange:function(e){z.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SelectionRate",E)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:D.current,step:.01,onChange:function(e){D.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CrossoverRate",E)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:F.current,step:.01,onChange:function(e){F.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MutationRate",E)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:R.current,step:.01,onChange:function(e){R.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",E)+" [0, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:k.current,step:.001,onChange:function(e){k.current=e,h(!f)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",E)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:S.current,style:{width:"100%"},value:S.current,onChange:function(e){S.current=e,h(!f)},children:[Object(gf.jsx)(mS,{value:O.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",E)},O.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(gf.jsx)(mS,{value:O.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",E)},O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),S.current===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",E)+" ([0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Y.current,step:.01,onChange:function(e){Y.current=e,h(!f)}})})]})]})})},xS=db.a.Option,vS=function(e){var t,l,a,o,i=e.setDialogVisible,n=Ew(si),c=Ew(Gi),s=Ew(Vi),d=Tf(Nr),f=Ew(uf).particleSwarmOptimizationParams,h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)({left:0,top:0,bottom:0,right:0}),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useRef)(null),j=Object(r.useRef)(Math.min(f.objectiveFunctionType,W.YEARLY_TOTAL_OUTPUT)),H=Object(r.useRef)(f.searchMethod),z=Object(r.useRef)(f.swarmSize),R=Object(r.useRef)(f.maximumSteps),D=Object(r.useRef)(null!==(t=f.vmax)&&void 0!==t?t:.01),C=Object(r.useRef)(null!==(l=f.inertia)&&void 0!==l?l:.8),F=Object(r.useRef)(null!==(a=f.cognitiveCoefficient)&&void 0!==a?a:.1),k=Object(r.useRef)(null!==(o=f.socialCoefficient)&&void 0!==o?o:.1),Y=Object(r.useRef)(f.convergenceThreshold),L=Object(r.useRef)(f.localSearchRadius),E=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=E.current)||void 0===e||e.focus()}),[]);var U={lng:s},N=function(){d||Kh(me.t("message.EvolutionStarted",U)),n((function(e){e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=M.SOLAR_PANEL_TILT_ANGLE,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType=j.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod=H.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize=z.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps=R.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient=F.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient=k.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.vmax=D.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.inertia=C.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.convergenceThreshold=Y.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.localSearchRadius=L.current})),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!e.runEvolution})),n((function(e){e.evolutionMethod=I.PARTICLE_SWARM_OPTIMIZATION,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=M.SOLAR_PANEL_TILT_ANGLE,c&&(e.actionInfo={name:"Run Particle Swarm Optimization for Solar Panel Tilt Angle",timestamp:(new Date).getTime()})}))}),100)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)(Zv.a,{width:640,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return v(!0)},onMouseOut:function(){return v(!1)},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",U)+": ",me.t("optimizationMenu.ParticleSwarmOptimizationSettings",U)]}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){i(!1)},children:me.t("word.Cancel",U)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:E,onClick:function(){N(),i(!1)},children:me.t("word.Run",U)},"Run")],onCancel:function(){i(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!x,bounds:T,onStart:function(e,t){return function(e,t){if(S.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=S.current.getBoundingClientRect();P({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:S,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",U)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:j.current,style:{width:"100%"},value:j.current,onChange:function(e){j.current=e,g(!y)},children:[Object(gf.jsx)(xS,{value:W.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",U)},W.DAILY_TOTAL_OUTPUT),Object(gf.jsx)(xS,{value:W.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",U)},W.YEARLY_TOTAL_OUTPUT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SwarmSize",U)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:10,max:100,style:{width:"100%"},precision:0,value:z.current,step:1,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){z.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumSteps",U)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:5,max:100,step:1,style:{width:"100%"},precision:0,value:R.current,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){R.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CognitiveCoefficient",U)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:F.current,step:.01,onChange:function(e){F.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SocialCoefficient",U)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:k.current,step:.01,onChange:function(e){k.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InertiaWeight",U)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:C.current,step:.01,onChange:function(e){C.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumVelocity",U)+" [0.001, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:D.current,step:.001,onChange:function(e){D.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",U)+" [0, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:Y.current,step:.001,onChange:function(e){Y.current=e,g(!y)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",U)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:H.current,style:{width:"100%"},value:H.current,onChange:function(e){H.current=e,g(!y)},children:[Object(gf.jsx)(xS,{value:O.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",U)},O.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(gf.jsx)(xS,{value:O.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",U)},O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),H.current===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",U)+" ([0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:L.current,step:.01,onChange:function(e){L.current=e,g(!y)}})})]})]})})},bS=function(e){var t,l=e.setDialogVisible,a=Ew(Vi),o=Ew(Fi),i=Ew(ln),n=Ew(Sr),c=Ew(Jn),s=Ew(Gn),d=Ew(Ii),h=Ew(Ci),p=Ew(Oi),y=Ew(Zr),g=Ew(si),m=Ew((function(e){if(i){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===i.id)return a}}catch(o){l.e(o)}finally{l.f()}}return null})),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.rValue)&&void 0!==t?t:2),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(Tw.toRValueInUS(v)),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)({left:0,top:0,bottom:0,right:0}),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useRef)(null),O={lng:a};Object(r.useEffect)((function(){var e;m&&b(null!==(e=null===m||void 0===m?void 0:m.rValue)&&void 0!==e?e:2)}),[null===m||void 0===m?void 0:m.rValue]);var F=function(e,t){g((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},k=function(e){if(m&&function(e){switch(c){case _.AllObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation&&!a.locked){var i=a;if(void 0===i.rValue||Math.abs(i.rValue-e)>At)return!0}}}catch(r){l.e(r)}finally{l.f()}break;default:if(void 0===(null===m||void 0===m?void 0:m.rValue)||Math.abs((null===m||void 0===m?void 0:m.rValue)-e)>At)return!0}return!1}(e)){switch(c){case _.AllObjectsOfThisType:var t=new Map;g((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&!i.locked){var r,n=i;t.set(i.id,null!==(r=n.rValue)&&void 0!==r?r:2),n.rValue=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set R-Value for All Ground Floors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){!function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];F(o,i)}}catch(r){l.e(r)}finally{l.f()}}(l.oldValues)},redo:function(){!function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;F(o,t)}}catch(i){a.e(i)}finally{a.f()}}(l.oldValues,l.newValue)}};n(l),h(d+1);break;default:if(m){var a,i,r=null!==(a=null!==(i=y(m.id).rValue)&&void 0!==i?i:m.rValue)&&void 0!==a?a:2,s={name:"Set Ground Floor R-Value",timestamp:Date.now(),oldValue:r,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){F(s.changedElementId,s.oldValue)},redo:function(){F(s.changedElementId,s.newValue)}};n(s),F(m.id,e),h(d+1)}}g((function(t){t.actionState.groundFloorRValue=e}))}},Y=function(){var e;b(null!==(e=null===m||void 0===m?void 0:m.rValue)&&void 0!==e?e:2),l(!1)},L=function(){k(v),l(!1),h(0)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:550,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return R(!0)},onMouseOut:function(){return R(!1)},children:[me.t("word.RValue",O)+" ","(",me.t("word.ThermalResistance",O),")"]}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){k(v)},children:me.t("word.Apply",O)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){Y(),p()},children:me.t("word.Cancel",O)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:L,children:me.t("word.OK",O)},"OK")],onCancel:Y,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!z,bounds:W,onStart:function(e,t){return function(e,t){if(C.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=C.current.getBoundingClientRect();I({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:C,children:e})})},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),S(Tw.toRValueInUS(e))},onPressEnter:L}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",O),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",O),": m\xb2\xb7\u2103/W"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toRValueInUS(.01),max:Tw.toRValueInUS(100),style:{width:120},step:.01,precision:2,value:P,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){S(e),b(Tw.toRValueInSI(e))},onPressEnter:L}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",O),": [",Tw.toRValueInUS(.01).toFixed(3),", ",Tw.toRValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",O),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return s(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("foundationMenu.OnlyThisGroundFloor",O)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("foundationMenu.AllGroundFloors",O)})]})})})]})})})},AS=n.a.memo((function(){var e,t,l,a,o,i,n,c,s,d,p=Ew(si),y=Ew(Fi),g=Ew(Sr),m=Ew(hs),w=Ew(es),x=Ew(ts),v=Ew(pn),b=Ew(fn),A=Ew(ns),T=Ew(qc),P=Ew(Ci),S=Ew(Vi),j=Ew(os),H=OP(V.Foundation),z=Object(r.useState)(!1),R=Object(u.a)(z,2),M=R[0],W=R[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useState)(!1),Y=Object(u.a)(k,2),L=Y[0],E=Y[1],U=Object(r.useState)(!1),N=Object(u.a)(U,2),J=N[0],X=N[1],B=Object(r.useState)(!1),K=Object(u.a)(B,2),q=K[0],Q=K[1],Z=Object(r.useState)(!1),_=Object(u.a)(Z,2),$=_[0],ee=_[1],te=Object(r.useState)(!1),le=Object(u.a)(te,2),ae=le[0],oe=le[1],ie=Object(r.useState)(!1),re=Object(u.a)(ie,2),ne=re[0],ce=re[1],de=Object(r.useState)(!1),ue=Object(u.a)(de,2),fe=ue[0],he=ue[1],pe=Object(r.useState)(!1),ye=Object(u.a)(pe,2),ge=ye[0],we=ye[1],xe=Object(r.useState)(!1),ve=Object(u.a)(xe,2),be=ve[0],Ae=ve[1],Te=Object(r.useState)(!1),Pe=Object(u.a)(Te,2),Se=Pe[0],je=Pe[1],He=Object(r.useState)(!1),ze=Object(u.a)(He,2),Re=ze[0],De=ze[1],We=Object(r.useState)(!1),Ie=Object(u.a)(We,2),Ce=Ie[0],Oe=Ie[1],Fe=Object(r.useState)(!1),ke=Object(u.a)(Fe,2),Ye=ke[0],Le=ke[1],Ee=Object(r.useState)(!1),Ue=Object(u.a)(Ee,2),Ne=Ue[0],Ve=Ue[1],Je=Object(r.useState)(!1),Ge=Object(u.a)(Je,2),Xe=Ge[0],Be=Ge[1],Ke=Object(r.useState)(!1),qe=Object(u.a)(Ke,2),Qe=qe[0],Ze=qe[1],_e=Object(r.useState)(!1),$e=Object(u.a)(_e,2),et=$e[0],tt=$e[1],lt=Object(r.useState)(!1),at=Object(u.a)(lt,2),ot=at[0],it=at[1],rt=Object(r.useState)(!1),nt=Object(u.a)(rt,2),ct=nt[0],st=nt[1],dt=Object(r.useState)(!1),ut=Object(u.a)(dt,2),ft=ut[0],ht=ut[1],pt=Object(r.useState)(!1),yt=Object(u.a)(pt,2),gt=yt[0],mt=yt[1],wt=Object(r.useState)(!1),xt=Object(u.a)(wt,2),vt=xt[0],bt=xt[1],At=Object(r.useState)(!1),Tt=Object(u.a)(At,2),Pt=Tt[0],St=Tt[1],jt=Object(r.useState)(!1),Ht=Object(u.a)(jt,2),zt=Ht[0],Dt=Ht[1],Mt=Object(r.useState)(!1),Wt=Object(u.a)(Mt,2),It=Wt[0],Ct=Wt[1],Ot=Object(r.useState)(!1),Ft=Object(u.a)(Ot,2),kt=Ft[0],Yt=Ft[1],Lt=zP(H),Et=Lt.labelText,Ut=Lt.setLabelText,Nt=RP(H),Vt=DP(H,Et),Jt=WP(H),Gt=MP(H),Xt=IP(H),Bt=CP(H);Object(r.useEffect)((function(){var e;H&&Zt(null===(e=H.hvacSystem)||void 0===e?void 0:e.id)}),[H]);var Kt=Object(r.useState)(null===H||void 0===H||null===(e=H.hvacSystem)||void 0===e?void 0:e.id),qt=Object(u.a)(Kt,2),Qt=qt[0],Zt=qt[1];if(!H)return null;var _t=null!==(t=null===H||void 0===H?void 0:H.solarStructure)&&void 0!==t?t:G.None,$t=H?m(H.id,!0):new Rw,el=H?m(H.id,!1):new Rw,tl={lng:S},ll=!(null===H||void 0===H?void 0:H.locked),al=function(e,t){p((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e&&!i.locked){i.solarStructure=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},ol=function(e,t){p((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e){var r=i;r.hvacSystem?r.hvacSystem.thermostatSetpoint=t:r.hvacSystem={thermostatSetpoint:t,temperatureThreshold:3};break}}}catch(n){o.e(n)}finally{o.f()}}))},il=function(e,t){p((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e){var r=i;r.hvacSystem?r.hvacSystem.temperatureThreshold=t:r.hvacSystem={thermostatSetpoint:20,temperatureThreshold:t};break}}}catch(n){o.e(n)}finally{o.f()}}))},rl=function(e,t){p((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Foundation&&i.id===e){var r=i;r.hvacSystem?r.hvacSystem.id=t:r.hvacSystem={thermostatSetpoint:20,temperatureThreshold:3,id:t};break}}}catch(n){o.e(n)}finally{o.f()}}))},nl=function(e){var t,l=null===(t=H.hvacSystem)||void 0===t?void 0:t.id,a=e&&e.trim().length>0?e:void 0,o={name:"Change HVAC ID",timestamp:Date.now(),oldValue:l,newValue:a,undo:function(){rl(H.id,o.oldValue)},redo:function(){rl(H.id,o.newValue)}};g(o),rl(H.id,a)},cl=!H.notBuilding&&Tw.getBuildingCompletionStatus(H,y)===D.COMPLETE,sl=function(){p((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===H.id){a.enableGroupMaster=!a.enableGroupMaster;break}}}catch(o){l.e(o)}finally{l.f()}e.groupActionUpdateFlag=!e.groupActionUpdateFlag}))},dl=function(){p((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===H.id){a.notBuilding=!a.notBuilding;break}}}catch(o){l.e(o)}finally{l.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){if(j&&j.length>0){var e=j[0];if(e.type===V.Human||e.type===V.Tree||e.type===V.Flower||e.type===V.Polygon||e.type===V.Sensor||e.type===V.Light||e.type===V.SolarPanel||e.type===V.WaterHeater||e.type===V.ParabolicDish||e.type===V.Heliostat||e.type===V.FresnelReflector||e.type===V.ParabolicTrough||e.type===V.WindTurbine||e.type===V.Wall)return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"foundation-paste"}),Object(gf.jsx)(TP,{keyName:"foundation-copy"}),ll&&Object(gf.jsx)(PP,{keyName:"foundation-cut"}),Object(gf.jsx)(SP,{keyName:"foundation-lock"}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:H.enableGroupMaster,onChange:function(e){var t={name:"Group Master",timestamp:Date.now(),checked:e.target.checked,selectedElementId:H.id,selectedElementType:H.type,undo:function(){return sl()},redo:function(){return sl()}};g(t),sl()},children:me.t("foundationMenu.GroupMaster",{lng:S})})},"group-master"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!H.notBuilding,onChange:function(e){var t={name:"Building",timestamp:Date.now(),checked:e.target.checked,selectedElementId:H.id,selectedElementType:H.type,undo:function(){return dl()},redo:function(){return dl()}};g(t),dl()},children:me.t("word.Building",{lng:S})})},"building"),$t.gotSome()&&Object(gf.jsxs)(HP.a,{title:me.t("word.Elements",tl),style:{paddingLeft:"24px"},children:[el.gotSome()&&Object(gf.jsx)(Qv.a.Item,{onClick:function(){var e,t=new Map,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;a.foundationId!==H.id&&a.id!==H.id||t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}b(H.id,!0);var o={name:"Lock All Offsprings",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(f.a)(o.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],r=l[1];v(a,r)}}catch(i){t.e(i)}finally{t.f()}},redo:function(){b(H.id,!0)}};g(o)},children:me.t("foundationMenu.LockAllElementsOnThisFoundation",tl)},"lock-all-offsprings"),Object(gf.jsx)(Qv.a.Item,{onClick:function(){var e,t=new Map,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;a.foundationId!==H.id&&a.id!==H.id||t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}b(H.id,!1);var o={name:"Unlock All Offsprings",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(f.a)(o.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],r=l[1];v(a,r)}}catch(i){t.e(i)}finally{t.f()}},redo:function(){b(H.id,!1)}};g(o)},children:me.t("foundationMenu.UnlockAllElementsOnThisFoundation",tl)},"unlock-all-offsprings"),el.wallCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllWallsOnFoundation",tl)+" ("+el.wallCount+" "+me.t("foundationMenu.Walls",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=new Set;Ew.getState().elements.forEach((function(t){t.locked||t.type!==V.Wall||t.parentId!==H.id&&t.foundationId!==H.id||e.add(t.id)}));var t=Ew.getState().elements.filter((function(t){return e.has(t.id)||e.has(t.parentId)}));p((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)&&!e.has(t.parentId)}))}));var l=JSON.parse(JSON.stringify(t)),a={name:"Remove All Walls on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:l,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(a.removedElements)),e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag}))},redo:function(){var e=new Set;Ew.getState().elements.forEach((function(t){t.locked||t.type!==V.Wall||t.parentId!==a.parentId||e.add(t.id)})),p((function(t){t.elements=t.elements.filter((function(t){return!e.has(t.id)&&!e.has(t.parentId)}))}))}};g(a)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedWalls",tl)," (",el.wallCount,")"]},"remove-all-walls-on-foundation"),el.windowCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllWindowsOnFoundation",tl)+" ("+el.windowCount+" "+me.t("foundationMenu.Windows",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Window&&e.foundationId===H.id}));x(H.id,V.Window);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Windows on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.Window)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedWindows",tl)," (",el.windowCount,")"]},"remove-all-windows-on-foundation"),el.doorCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllDoorsOnFoundation",tl)+" ("+el.doorCount+" "+me.t("foundationMenu.Doors",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Door&&e.foundationId===H.id}));x(H.id,V.Door);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Doors on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.Door)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedDoors",tl)," (",el.doorCount,")"]},"remove-all-doors-on-foundation"),el.sensorCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllSensorsOnFoundation",tl)+" ("+el.sensorCount+" "+me.t("foundationMenu.Sensors",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Sensor&&e.foundationId===H.id}));x(H.id,V.Sensor);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Sensors on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.Sensor)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedSensors",tl)," (",el.sensorCount,")"]},"remove-all-sensors-on-foundation"),el.insideLightCount+el.outsideLightCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllLightsOnFoundation",tl)+" ("+(el.insideLightCount+el.outsideLightCount)+" "+me.t("foundationMenu.Lights",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Light&&e.foundationId===H.id}));x(H.id,V.Light);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Lights on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.Light)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedLights",tl)," (",el.insideLightCount+el.outsideLightCount,")"]},"remove-all-lights-on-foundation"),el.solarPanelCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllSolarPanelsOnFoundation",tl)+" ("+el.solarPanelModuleCount+" "+me.t("foundationMenu.SolarPanels",tl)+", "+el.solarPanelCount+" "+me.t("foundationMenu.Racks",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.SolarPanel&&e.foundationId===H.id}));x(H.id,V.SolarPanel);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Solar Panels on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){x(l.parentId,V.SolarPanel)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedSolarPanels",tl),"\xa0 (",el.solarPanelModuleCount," ",me.t("foundationMenu.SolarPanels",tl),","," ",el.solarPanelCount," ",me.t("foundationMenu.Racks",tl),")"]},"remove-all-solar-panels-on-foundation"),el.parabolicTroughCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation",tl)+" ("+el.parabolicTroughCount+" "+me.t("foundationMenu.ParabolicTroughs",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.ParabolicTrough&&e.foundationId===H.id}));w(H.id,V.ParabolicTrough);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Parabolic Troughs on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.ParabolicTrough)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedParabolicTroughs",tl)," (",el.parabolicTroughCount,")"]},"remove-all-parabolic-troughs-on-foundation"),el.parabolicDishCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllParabolicDishesOnFoundation",tl)+" ("+el.parabolicDishCount+" "+me.t("foundationMenu.ParabolicDishes",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.ParabolicDish&&e.foundationId===H.id}));w(H.id,V.ParabolicDish);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Parabolic Dishes on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.ParabolicDish)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedParabolicDishes",tl)," (",el.parabolicDishCount,")"]},"remove-all-parabolic-dishes-on-foundation"),el.fresnelReflectorCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation",tl)+" ("+el.fresnelReflectorCount+" "+me.t("foundationMenu.FresnelReflectors",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.FresnelReflector&&e.foundationId===H.id}));w(H.id,V.FresnelReflector);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Fresnel Reflectors on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.FresnelReflector)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedFresnelReflectors",tl)," (",el.fresnelReflectorCount,")"]},"remove-all-fresnel-reflector-on-foundation"),el.heliostatCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllHeliostatsOnFoundation",tl)+" ("+el.heliostatCount+" "+me.t("foundationMenu.Heliostats",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Heliostat&&e.foundationId===H.id}));w(H.id,V.Heliostat);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Heliostats on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Heliostat)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedHeliostats",tl)," (",el.heliostatCount,")"]},"remove-all-heliostats-on-foundation"),el.polygonCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllPolygonsOnFoundation",tl)+" ("+el.polygonCount+" "+me.t("foundationMenu.Polygons",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Polygon&&e.foundationId===H.id}));w(H.id,V.Polygon);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Polygons on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Polygon)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedPolygons",tl)," (",el.polygonCount,")"]},"remove-all-polygons-on-foundation"),el.humanCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllHumansOnFoundation",tl)+" ("+el.humanCount+" "+me.t("foundationMenu.Humans",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Human&&e.parentId===H.id}));w(H.id,V.Human);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Humans on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Human)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedHumans",tl)," (",el.humanCount,")"]},"remove-all-humans-on-foundation"),el.treeCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllTreesOnFoundation",tl)+" ("+el.treeCount+" "+me.t("foundationMenu.Trees",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Tree&&e.parentId===H.id}));w(H.id,V.Tree);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Trees on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Tree)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedTrees",tl)," (",el.treeCount,")"]},"remove-all-trees-on-foundation"),el.flowerCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("foundationMenu.DoYouReallyWantToRemoveAllFlowersOnFoundation",tl)+" ("+el.flowerCount+" "+me.t("foundationMenu.Flowers",tl)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(H){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Flower&&e.parentId===H.id}));w(H.id,V.Flower);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Flowers on Foundation",timestamp:Date.now(),parentId:H.id,removedElements:t,undo:function(){p((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){w(l.parentId,V.Flower)}};g(l)}}})},children:[me.t("foundationMenu.RemoveAllUnlockedFlowers",tl)," (",el.flowerCount,")"]},"remove-all-flowers-on-foundation")]},"lock-unlock-clear-on-foundation"),ll&&(!H.textureType||H.textureType===se.NoTexture)&&Object(gf.jsxs)(gf.Fragment,{children:[M&&Object(gf.jsx)(LP,{setDialogVisible:W}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),W(!0)},children:[me.t("word.Color",tl)," ..."]},"foundation-color")]}),ll&&Object(gf.jsxs)(gf.Fragment,{children:[O&&Object(gf.jsx)(ZP,{setDialogVisible:F}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),F(!0)},children:[me.t("word.Texture",tl)," ..."]},"foundation-texture"),J&&Object(gf.jsx)(EP,{setDialogVisible:X}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),X(!0)},children:[me.t("word.Length",tl)," ..."]},"foundation-length"),L&&Object(gf.jsx)(UP,{setDialogVisible:E}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),E(!0)},children:[me.t("word.Width",tl)," ..."]},"foundation-width"),q&&Object(gf.jsx)(NP,{setDialogVisible:Q}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Q(!0)},children:[me.t("word.Height",tl)," ..."]},"foundation-height"),$&&Object(gf.jsx)(VP,{setDialogVisible:ee}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ee(!0)},children:[me.t("word.Azimuth",tl)," ..."]},"foundation-azimuth"),cl&&ae&&Object(gf.jsx)(bS,{setDialogVisible:oe}),cl&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),oe(!0)},children:[me.t("foundationMenu.GroundFloorRValue",tl)," ..."]},"ground-floor-r-value")]}),Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(H){p((function(e){e.objectTypeToAdd=V.Polygon}));var e=A(H,new Me.Vector3(H.cx,H.cy,H.lz),Rt),t={name:"Add",timestamp:Date.now(),addedElement:e,undo:function(){T(t.addedElement.id,!1)},redo:function(){p((function(e){e.elements.push(t.addedElement),e.selectedElement=t.addedElement}))}};g(t),p((function(e){e.objectTypeToAdd=V.None}))}},children:me.t("foundationMenu.AddPolygon",tl)},"add-polygon-on-foundation"),!H.notBuilding&&$t.wallCount>0&&Object(gf.jsx)(HP.a,{title:me.t("word.BuildingHVACSystem",tl),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"18px",marginTop:10},children:[Object(gf.jsx)(wv.b,{style:{width:"40px",paddingLeft:"0px",textAlign:"left"},children:"ID:"}),Object(gf.jsx)(ET.a,{style:{width:"180px"},value:Qt,onChange:function(e){var t=e.target.value;0===t.trim().length&&(t=void 0),Zt(t)},onPressEnter:function(){return nl(Qt)},onBlur:function(){return nl(Qt)}})]},"hvac-system-id"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{style:{width:"160px"},children:me.t("word.ThermostatSetpoint",tl)+":"}),Object(gf.jsx)($v.a,{min:0,max:30,step:1,style:{width:60},precision:1,value:null!==(l=null===(a=H.hvacSystem)||void 0===a?void 0:a.thermostatSetpoint)&&void 0!==l?l:20,onChange:function(e){var t,l,a=null!==(t=null===(l=H.hvacSystem)||void 0===l?void 0:l.thermostatSetpoint)&&void 0!==t?t:20,o=e,i={name:"Change Thermostat Setpoint",timestamp:Date.now(),oldValue:a,newValue:o,undo:function(){ol(H.id,i.oldValue)},redo:function(){ol(H.id,i.newValue)}};g(i),ol(H.id,o)}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:"\xb0C"})]},"thermostat-temperature"),Object(gf.jsxs)(Qv.a.Item,{children:[Object(gf.jsx)(wv.b,{title:me.t("word.TemperatureToleranceThresholdExplanation",tl),style:{width:"160px"},children:me.t("word.TemperatureToleranceThreshold",tl)+":"}),Object(gf.jsx)($v.a,{min:0,max:30,step:1,style:{width:60},precision:1,value:null!==(o=null===(i=H.hvacSystem)||void 0===i?void 0:i.temperatureThreshold)&&void 0!==o?o:3,onChange:function(e){var t,l,a=null!==(t=null===(l=H.hvacSystem)||void 0===l?void 0:l.temperatureThreshold)&&void 0!==t?t:3,o=e,i={name:"Change Temperature Tolerance Threshold",timestamp:Date.now(),oldValue:a,newValue:o,undo:function(){il(H.id,i.oldValue)},redo:function(){il(H.id,i.newValue)}};g(i),il(H.id,o)}}),Object(gf.jsx)(wv.b,{style:{paddingLeft:"10px"},children:"\xb0C"})]},"tolerance-threshold")]})},"building-hvac-system"),ll&&Object(gf.jsx)(HP.a,{title:me.t("foundationMenu.SolarStructure",tl),style:{paddingLeft:"24px"},children:Object(gf.jsx)(tb.a.Group,{value:_t,style:{paddingLeft:"12px"},onChange:function(e){if(H){var t=H.solarStructure,l=e.target.value,a={name:"Select Solar Structure for Selected Foundation",timestamp:Date.now(),oldValue:t,newValue:l,changedElementId:H.id,changedElementType:H.type,undo:function(){al(a.changedElementId,a.oldValue)},redo:function(){al(a.changedElementId,a.newValue)}};g(a),al(H.id,l)}},children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:G.None,children:me.t("word.None",tl)}),Object(gf.jsx)(tb.a,{value:G.FocusPipe,children:me.t("solarAbsorberPipeMenu.AbsorberPipeForFresnelReflectors",tl)}),Object(gf.jsx)(tb.a,{value:G.FocusTower,children:me.t("solarPowerTowerMenu.ReceiverTowerForHeliostats",tl)}),Object(gf.jsx)(tb.a,{value:G.UpdraftTower,children:me.t("solarUpdraftTowerMenu.SolarUpdraftTower",tl)})]})})},"select-solar-structure"),ll&&H.solarStructure===G.FocusPipe&&Object(gf.jsxs)(HP.a,{title:me.t("solarAbsorberPipeMenu.AbsorberPipePhysicalProperties",tl),style:{paddingLeft:"24px"},children:[ne&&Object(gf.jsx)(_P,{setDialogVisible:ce}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ce(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberHeight",tl)," ..."]},"solar-absorber-pipe-height"),fe&&Object(gf.jsx)(lS,{setDialogVisible:he}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),he(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberApertureWidth",tl)," ..."]},"solar-absorber-pipe-aperture-width"),ge&&Object(gf.jsx)(aS,{setDialogVisible:we}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),we(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberPipePoleNumber",tl)," ..."]},"foundation-solar-receiver-pipe-pole-number"),be&&Object(gf.jsx)($P,{setDialogVisible:Ae}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ae(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberAbsorptance",tl)," ..."]},"solar-absorber-pipe-absorptance"),Se&&Object(gf.jsx)(eS,{setDialogVisible:je}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),je(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberOpticalEfficiency",tl)," ..."]},"solar-absorber-optical-efficiency"),Re&&Object(gf.jsx)(tS,{setDialogVisible:De}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),De(!0)},children:[me.t("solarAbsorberPipeMenu.AbsorberThermalEfficiency",tl)," ..."]},"solar-absorber-thermal-efficiency")]},"solar-absorber-pipe-physical-properties"),ll&&H.solarStructure===G.FocusTower&&Object(gf.jsxs)(HP.a,{title:me.t("solarPowerTowerMenu.ReceiverTowerPhysicalProperties",tl),style:{paddingLeft:"24px"},children:[Ce&&Object(gf.jsx)(cS,{setDialogVisible:Oe}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Oe(!0)},children:[me.t("solarPowerTowerMenu.ReceiverTowerHeight",tl)," ..."]},"solar-power-tower-height"),Ye&&Object(gf.jsx)(sS,{setDialogVisible:Le}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Le(!0)},children:[me.t("solarPowerTowerMenu.ReceiverTowerRadius",tl)," ..."]},"solar-power-tower-radius"),Ne&&Object(gf.jsx)(dS,{setDialogVisible:Ve}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ve(!0)},children:[me.t("solarPowerTowerMenu.ReceiverAbsorptance",tl)," ..."]},"solar-power-tower-receiver-absorptance"),Xe&&Object(gf.jsx)(uS,{setDialogVisible:Be}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Be(!0)},children:[me.t("solarPowerTowerMenu.ReceiverOpticalEfficiency",tl)," ..."]},"solar-power-tower-receiver-optical-efficiency"),Qe&&Object(gf.jsx)(fS,{setDialogVisible:Ze}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Ze(!0)},children:[me.t("solarPowerTowerMenu.ReceiverThermalEfficiency",tl)," ..."]},"solar-power-tower-receiver-thermal-efficiency")]},"solar-power-tower-physical-properties"),ll&&H.solarStructure===G.UpdraftTower&&Object(gf.jsxs)(HP.a,{title:me.t("solarUpdraftTowerMenu.SolarUpdraftTowerPhysicalProperties",tl),style:{paddingLeft:"24px"},children:[et&&Object(gf.jsx)(oS,{setDialogVisible:tt}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),tt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight",tl)," ..."]},"solar-updraft-tower-chimney-height"),ot&&Object(gf.jsx)(iS,{setDialogVisible:it}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),it(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius",tl)," ..."]},"solar-updraft-tower-chimney-radius"),ct&&Object(gf.jsx)(nS,{setDialogVisible:st}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),st(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight",tl)," ..."]},"solar-updraft-tower-collector-height"),ft&&Object(gf.jsx)(rS,{setDialogVisible:ht}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),ht(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius",tl)," ..."]},"solar-updraft-tower-collector-radius"),gt&&Object(gf.jsx)(hS,{setDialogVisible:mt}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),mt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity",tl)," ..."]},"solar-updraft-tower-collector-transmissivity"),vt&&Object(gf.jsx)(gS,{setDialogVisible:bt}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),bt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity",tl)," ..."]},"solar-updraft-tower-collector-emissivity"),Pt&&Object(gf.jsx)(pS,{setDialogVisible:St}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),St(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient",tl)," ..."]},"solar-updraft-tower-discharge-coefficient"),zt&&Object(gf.jsx)(yS,{setDialogVisible:Dt}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){P(0),Dt(!0)},children:[me.t("solarUpdraftTowerMenu.SolarUpdraftTowerTurbineEfficiency",tl)," ..."]},"solar-updraft-tower-turbine-efficiency")]},"solar-updraft-tower-physical-properties"),Object(gf.jsxs)(HP.a,{title:me.t("optimizationMenu.Optimization",tl),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(HP.a,{title:me.t("optimizationMenu.GeneticAlgorithm",tl),children:el.solarPanelCount>0&&Object(gf.jsxs)(gf.Fragment,{children:[It&&Object(gf.jsx)(wS,{setDialogVisible:Ct}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Ct(!0)},style:{paddingLeft:"12px"},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",tl),"..."]},"solar-panel-tilt-angle-ga-optimizer")]})},"genetic-algorithms"),Object(gf.jsx)(HP.a,{title:me.t("optimizationMenu.ParticleSwarmOptimization",tl),children:el.solarPanelCount>0&&Object(gf.jsxs)(gf.Fragment,{children:[kt&&Object(gf.jsx)(vS,{setDialogVisible:Yt}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Yt(!0)},style:{paddingLeft:"12px"},children:[me.t("optimizationMenu.SolarPanelTiltAngleOptimization",tl),"..."]},"solar-panel-tilt-angle-pso-optimizer")]})},"particle-swarm-optimization")]},"optimization"),ll&&Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",tl),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===H||void 0===H?void 0:H.showLabel),onChange:Nt,children:me.t("labelSubMenu.KeepShowingLabel",tl)})},"foundation-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:10},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",tl)+":",value:Et,onChange:function(e){return Ut(e.target.value)},onPressEnter:Vt,onBlur:Vt})},"foundation-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",tl)+":",min:H.lz/2+.2,max:100,step:1,precision:1,value:null!==(n=H.labelHeight)&&void 0!==n?n:H.lz/2+.2,onChange:function(e){return Bt(e)}})},"foundation-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",tl)+":",min:10,max:100,step:1,precision:0,value:null!==(c=H.labelFontSize)&&void 0!==c?c:20,onChange:function(e){return Gt(e)}})},"foundation-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",tl)+":",min:.2,max:5,step:.1,precision:1,value:null!==(s=H.labelSize)&&void 0!==s?s:.2,onChange:function(e){return Jt(e)}})},"foundation-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",tl)+":",value:null!==(d=H.labelColor)&&void 0!==d?d:"#ffffff",onChange:function(e){return Xt(e.target.value)}})},"foundation-label-color")]})]},"foundation-label")]})})),TS=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Sr),c=Ew(Qn),s=Ew(Zn),d=Ew(nn),p=Ew(Ii),y=Ew(Ci),g=OP(V.Cuboid),m=Object(r.useState)(null!==(t=null===g||void 0===g?void 0:g.color)&&void 0!==t?t:"#808080"),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=$f();Object(r.useEffect)((function(){R()}),[g,d]);var j=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.Cuboid&&r.id===t&&!r.locked){var n,c=r;if(!c.faceColors)c.faceColors=new Array(6),c.faceColors.fill(null!==(n=c.color)&&void 0!==n?n:l);c.faceColors[e]=l;break}}}catch(s){i.e(s)}finally{i.f()}}))},H=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Cuboid&&i.id===e&&!i.locked){i.color=t;var r=i;r.faceColors||(r.faceColors=new Array(6));for(var n=0;n<4;n++)r.faceColors[n]=t;break}}}catch(c){o.e(c)}finally{o.f()}}))},z=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Cuboid&&!o.locked){o.color=e;var i=o;i.faceColors||(i.faceColors=new Array(6));for(var r=0;r<4;r++)i.faceColors[r]=e}}}catch(n){a.e(n)}finally{a.f()}}))},R=function(){var e;g&&(d>=0&&g.faceColors?v(g.faceColors[d]):v(null!==(e=g.color)&&void 0!==e?e:"#808080"))},D=function(e){if(g&&function(e){if(g){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Cuboid&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(o.faceColors){for(var r=0;r<4;r++)if(e!==o.faceColors[r])return!0}else if(e!==o.color)return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var n,s=Object(f.a)(i);try{for(s.s();!(n=s.n()).done;){var u=n.value;if(u.type===V.Cuboid&&!u.locked){var h=u;if(h.faceColors){for(var p=0;p<4;p++)if(e!==h.faceColors[p])return!0}else if(e!==h.color)return!0}}}catch(m){s.e(m)}finally{s.f()}break;case _.OnlyThisObject:if(g.faceColors){for(var y=0;y<4;y++)if(e!==g.faceColors[y])return!0}else if(e!==(null===g||void 0===g?void 0:g.color))return!0;break;default:if(d>=0){if(e!==((null===g||void 0===g?void 0:g.faceColors)?null===g||void 0===g?void 0:g.faceColors[d]:null===g||void 0===g?void 0:g.color))return!0}else if(e!==(null===g||void 0===g?void 0:g.color))return!0}return!1}}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var r=t.value;if(r.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(r.id)){var s=r;if(s.faceColors)l.set(r.id,Object(h.a)(s.faceColors));else{var m,w=null!==(m=s.color)&&void 0!==m?m:"#808080";l.set(r.id,[w,w,w,w,w,w])}}}}catch(X){a.e(X)}finally{a.f()}var x={name:"Set Color for Selected Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];if(o&&Array.isArray(o))for(var i=0;i=0){var J=g.faceColors?g.faceColors[d]:g.color,G={name:"Set Color for Selected Side of Cuboid",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:g.id,changedElementType:g.type,changedSideIndex:d,undo:function(){void 0!==G.changedSideIndex&&j(G.changedSideIndex,G.changedElementId,G.oldValue)},redo:function(){void 0!==G.changedSideIndex&&j(G.changedSideIndex,G.changedElementId,G.newValue)}};n(G),j(d,g.id,e),y(p+1),o((function(t){t.actionState.cuboidFaceColors||(t.actionState.cuboidFaceColors=["#808080","#808080","#808080","#808080","#808080","#808080"]),t.actionState.cuboidFaceColors[d]=e}))}}P(!T)}},M=d>=0&&(null===g||void 0===g?void 0:g.faceColors)?g.faceColors[d]:null!==(l=null===g||void 0===g?void 0:g.color)&&void 0!==l?l:"#808080";return Object(gf.jsx)(kP,{width:600,title:me.t("word.Color",S),onApply:function(){D(x),a(!1),y(0)},onClose:function(){R(),a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(YP.a,{color:null!==x&&void 0!==x?x:M,onChangeComplete:function(e){v(e.hex),P(!T)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){s(e.target.value),P(!T)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("cuboidMenu.OnlyThisSide",S)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.AllSidesOfThisCuboid",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfSelectedCuboids",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfAllCuboids",S)})]})})})]})})},PS=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(en),n=Ew(wn),c=Ew(An),s=Ew(qn),h=Ew(cn),p=Ew(Sr),y=Ew(Qn),g=Ew(Zn),m=Ew(si),w=Ew(Ii),x=Ew(Ci),v=Ew(Oi),b=OP(V.Cuboid),A=Object(r.useState)(null!==(t=null===b||void 0===b?void 0:b.lx)&&void 0!==t?t:0),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),O=Object(r.useRef)(),F=$f(),k=function(e){return!function(e){if(b){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(o.id)){var r=o,n=i(r.id);if(n.length>0&&!Tw.doesNewSizeContainAllChildren(r,n,e,r.ly))return!1}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var c,s=Object(f.a)(a);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Cuboid){var u=d,h=i(u.id);if(h.length>0&&!Tw.doesNewSizeContainAllChildren(u,h,e,u.ly))return!1}}}catch(g){s.e(g)}finally{s.f()}break;default:var p=i(b.id);if(p.length>0)return Tw.doesNewSizeContainAllChildren(b,p,e,b.ly)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},L=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(c){o.e(c)}finally{o.f()}m((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.id){i.parentId=xt;var r=new Me.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new Me.Vector3(r.x,r.y,0)),H.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},E=function(e,t){var l=i(e.id),a=e.rotation[2];if(D.current.clear(),I.current.clear(),l.length>0){var o,r=Object(f.a)(l);try{for(r.s();!(o=r.n()).done;){var u=o.value;if(Tw.isIdentical(u.normal,Tt))switch(u.type){case V.SolarPanel:case V.Sensor:var h=new Me.Vector2(u.cx*e.lx,u.cy*e.ly).rotateAround(Dt,a);D.current.set(u.id,h),z.current.set(u.id,new Me.Vector3(u.cx,u.cy));break;case V.Polygon:var p,y=u,g=[],m=Object(f.a)(y.vertices);try{for(m.s();!(p=m.n()).done;){var w=p.value;g.push(new Me.Vector2(w.x*e.lx,w.y*e.ly).rotateAround(Dt,a))}}catch(J){m.e(J)}finally{m.f()}I.current.set(u.id,g),M.current.set(u.id,y.vertices.map((function(e){return Object(d.a)({},e)})))}Tw.isPlantOrHuman(u)&&z.current.set(u.id,new Me.Vector3(u.cx,u.cy,u.cz))}}catch(J){r.e(J)}finally{r.f()}}if(c(e.id,t),l.length>0){var x,v=Object(f.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(Tw.isIdentical(b.normal,Tt))switch(b.type){case V.SolarPanel:case V.Sensor:var A=D.current.get(b.id);if(A){var T=new Me.Vector2(A.x,A.y).rotateAround(Dt,-a).x/t;n(b.id,T),R.current.set(b.id,new Me.Vector3(T,b.cy))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,H=[],C=Object(f.a)(P);try{for(C.s();!(S=C.n()).done;){var O=S.value.rotateAround(Dt,-a),F=O.x/t,k=O.y/e.ly;H.push({x:F,y:k})}}catch(J){C.e(J)}finally{C.f()}s(b.id,H),W.current.set(b.id,H.map((function(e){return Object(d.a)({},e)})))}}if(Tw.isPlantOrHuman(b))if(R.current.set(b.id,new Me.Vector3(b.cx,b.cy,b.cz)),j.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var E=Et.getState().contentRef,U=Y(null===E||void 0===E?void 0:E.current,e.id);L(U,e,b)}}else if(Math.abs(Math.abs(b.cx)-e.lx/2)0?t:-t)/2;n(b.id,N),R.current.set(b.id,new Me.Vector3(N,b.cy,b.cz))}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=Y(null===a||void 0===a?void 0:a.current,t),i=Y(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=Y(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},N=function(e,t){e&&m((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},J=function(e){if(b&&function(e){if(b){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.lx-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Cuboid&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var d,u=Object(f.a)(a);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.Cuboid&&h.parentId===(null===b||void 0===b?void 0:b.parentId)&&!h.locked){var p=h;if(Math.abs(p.lx-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;case _.AllObjectsOfThisType:case _.AllObjectsOfThisTypeAboveFoundation:break;default:if(Math.abs((null===b||void 0===b?void 0:b.lx)-e)>At)return!0}return!1}}(e)){var t=o(b.id),l=t?t.lx:b.lx;if(O.current=void 0,C.current=k(e),C.current)O.current=e,S(l);else switch(y){case _.AllSelectedObjectsOfThisType:var i,r=new Map,n=Object(f.a)(a);try{for(n.s();!(i=n.n()).done;){var d=i.value;d.type===V.Cuboid&&!d.locked&&Ew.getState().selectedElementIdSet.has(d.id)&&(r.set(d.id,d.lx),E(d,e))}}catch(G){n.e(G)}finally{n.f()}var g={name:"Set Length for Selected Cuboids",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(g.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(G){t.e(G)}finally{t.f()}if(g.oldChildrenPositionsMap&&g.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(g.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,d,p=Object(u.a)(i.value,2),y=p[0],m=p[1];h(y,m.x,m.y,m.z);var w=null===(n=g.oldChildrenParentIdMap)||void 0===n?void 0:n.get(y),x=null===(d=g.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);w&&x&&w!==x&&(U(w,x,y),N(w,y))}}catch(G){r.e(G)}finally{r.f()}}if(g.oldChildrenVerticesMap&&g.oldChildrenVerticesMap.size>0){var v,b=Object(f.a)(g.oldChildrenVerticesMap.entries());try{for(b.s();!(v=b.n()).done;){var A=Object(u.a)(v.value,2),T=A[0],P=A[1];s(T,P)}}catch(G){b.e(G)}finally{b.f()}}},redo:function(){var e,t=Object(f.a)(g.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];c(a,g.newSize)}}catch(G){t.e(G)}finally{t.f()}if(g.newChildrenPositionsMap&&g.newChildrenPositionsMap.size>0){var o,i=Object(f.a)(g.newChildrenPositionsMap.entries());try{for(i.s();!(o=i.n()).done;){var r,n,d=Object(u.a)(o.value,2),p=d[0],y=d[1];h(p,y.x,y.y,y.z);var m=null===(r=g.oldChildrenParentIdMap)||void 0===r?void 0:r.get(p),w=null===(n=g.newChildrenParentIdMap)||void 0===n?void 0:n.get(p);m&&w&&m!==w&&(U(w,m,p),N(w,p))}}catch(G){i.e(G)}finally{i.f()}}if(g.newChildrenVerticesMap&&g.newChildrenVerticesMap.size>0){var x,v=Object(f.a)(g.newChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];s(A,T)}}catch(G){v.e(G)}finally{v.f()}}}};p(g),x(w+1);break;case _.AllObjectsOfThisTypeOnSurface:var m,v=new Map,A=Object(f.a)(a);try{for(A.s();!(m=A.n()).done;){var T=m.value;T.type!==V.Cuboid||T.parentId!==b.parentId||T.locked||(v.set(T.id,T.lx),E(T,e))}}catch(G){A.e(G)}finally{A.f()}var P={name:"Set Length for All Cuboids on Surface",timestamp:Date.now(),oldSizes:v,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(P.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(G){t.e(G)}finally{t.f()}if(P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(P.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,d,p=Object(u.a)(i.value,2),y=p[0],g=p[1];h(y,g.x,g.y,g.z);var m=null===(n=P.oldChildrenParentIdMap)||void 0===n?void 0:n.get(y),w=null===(d=P.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(G){r.e(G)}finally{r.f()}}if(P.oldChildrenVerticesMap&&P.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(P.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];s(A,T)}}catch(G){v.e(G)}finally{v.f()}}},redo:function(){if(function(e){var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.type!==V.Cuboid||o.locked||o.parentId!==(null===b||void 0===b?void 0:b.parentId)||E(o,e)}}catch(G){l.e(G)}finally{l.f()}}(P.newSize),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(P.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,o,i=Object(u.a)(e.value,2),r=i[0],n=i[1];h(r,n.x,n.y,n.z);var c=null===(l=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(o=P.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&d&&c!==d&&(U(d,c,r),N(d,r))}}catch(G){t.e(G)}finally{t.f()}}if(P.newChildrenVerticesMap&&P.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(P.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];s(m,w)}}catch(G){y.e(G)}finally{y.f()}}}};p(P),x(w+1);break;case _.AllObjectsOfThisType:var D,I=new Map,F=Object(f.a)(a);try{for(F.s();!(D=F.n()).done;){var Y=D.value;Y.type!==V.Cuboid||Y.locked||(I.set(Y.id,Y.lx),E(Y,e))}}catch(G){F.e(G)}finally{F.f()}var L={name:"Set Length for All Cuboids",timestamp:Date.now(),oldSizes:I,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(L.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(G){t.e(G)}finally{t.f()}if(L.oldChildrenPositionsMap&&L.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(L.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,d,p=Object(u.a)(i.value,2),y=p[0],g=p[1];h(y,g.x,g.y,g.z);var m=null===(n=L.oldChildrenParentIdMap)||void 0===n?void 0:n.get(y),w=null===(d=L.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(G){r.e(G)}finally{r.f()}}if(L.oldChildrenVerticesMap&&L.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(L.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];s(A,T)}}catch(G){v.e(G)}finally{v.f()}}},redo:function(){var e,t=Object(f.a)(L.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];c(a,L.newSize)}}catch(G){t.e(G)}finally{t.f()}if(L.newChildrenPositionsMap&&L.newChildrenPositionsMap.size>0){var o,i=Object(f.a)(L.newChildrenPositionsMap.entries());try{for(i.s();!(o=i.n()).done;){var r,n,d=Object(u.a)(o.value,2),p=d[0],y=d[1];h(p,y.x,y.y,y.z);var g=null===(r=L.oldChildrenParentIdMap)||void 0===r?void 0:r.get(p),m=null===(n=L.newChildrenParentIdMap)||void 0===n?void 0:n.get(p);g&&m&&g!==m&&(U(m,g,p),N(m,p))}}catch(G){i.e(G)}finally{i.f()}}if(L.newChildrenVerticesMap&&L.newChildrenVerticesMap.size>0){var w,x=Object(f.a)(L.newChildrenVerticesMap.entries());try{for(x.s();!(w=x.n()).done;){var v=Object(u.a)(w.value,2),b=v[0],A=v[1];s(b,A)}}catch(G){x.e(G)}finally{x.f()}}}};p(L),x(w+1);break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:E(b,e);var J={name:"Set Cuboid Length",timestamp:Date.now(),oldSize:l,newSize:e,resizedElementId:b.id,resizedElementType:b.type,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){if(c(b.id,J.oldSize),J.oldChildrenPositionsMap&&J.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(J.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];h(i,r.x,r.y,r.z);var n=null===(l=J.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=J.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&d&&n!==d&&(U(n,d,i),N(n,i))}}catch(G){t.e(G)}finally{t.f()}}if(J.oldChildrenVerticesMap&&J.oldChildrenVerticesMap.size>0){var p,y=Object(f.a)(J.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];s(m,w)}}catch(G){y.e(G)}finally{y.f()}}},redo:function(){if(c(b.id,J.newSize),J.newChildrenPositionsMap&&J.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(J.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];h(i,r.x,r.y,r.z);var n=null===(l=J.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=J.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&d&&n!==d&&(U(d,n,i),N(d,i))}}catch(G){t.e(G)}finally{t.f()}}if(J.newChildrenVerticesMap&&J.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(J.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];s(m,w)}}catch(G){y.e(G)}finally{y.f()}}}};p(J),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",F)+(void 0!==O.current?" ("+O.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Length",F),rejectedMessage:X,onApply:function(){J(P)},onClose:G,onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:500,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [0.1, 500] ",me.t("word.MeterAbbreviation",F)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",F)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",F)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSelectedCuboids",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",F)})]})})})]})})},SS=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(en),n=Ew(cn),c=Ew(xn),s=Ew(Sn),h=Ew(qn),p=Ew(Sr),y=Ew(Qn),g=Ew(Zn),m=Ew(si),w=Ew(Ii),x=Ew(Ci),v=Ew(Oi),b=OP(V.Cuboid),A=Object(r.useState)(null!==(t=null===b||void 0===b?void 0:b.ly)&&void 0!==t?t:0),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Map),C=Object(r.useRef)(!1),O=Object(r.useRef)(),F=$f(),k=function(e){return!function(e){if(b){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(o.id)){var r=o,n=i(r.id);if(n.length>0&&!Tw.doesNewSizeContainAllChildren(r,n,r.lx,e))return!1}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var c,s=Object(f.a)(a);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Cuboid){var u=d,h=i(u.id);if(h.length>0&&!Tw.doesNewSizeContainAllChildren(u,h,u.lx,e))return!1}}}catch(g){s.e(g)}finally{s.f()}break;default:var p=i(b.id);if(p.length>0)return Tw.doesNewSizeContainAllChildren(b,p,b.lx,e)}return!0}}(e)},Y=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},L=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(c){o.e(c)}finally{o.f()}m((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===l.id){i.parentId=xt;var r=new Me.Vector2(i.cx,i.cy).rotateAround(Dt,t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));i.cx=r.x,i.cy=r.y,i.cz=0,R.current.set(i.id,new Me.Vector3(r.x,r.y,0)),H.current.set(i.id,xt);break}}}catch(c){o.e(c)}finally{o.f()}}))}},E=function(e,t){var l=i(e.id),a=e.rotation[2];if(D.current.clear(),I.current.clear(),l.length>0){var o,r=Object(f.a)(l);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(Tw.isIdentical(n.normal,Tt))switch(n.type){case V.SolarPanel:case V.Sensor:var u=new Me.Vector2(n.cx*e.lx,n.cy*e.ly).rotateAround(Dt,a);D.current.set(n.id,u),z.current.set(n.id,new Me.Vector3(n.cx,n.cy));break;case V.Polygon:var p,y=n,g=[],m=Object(f.a)(y.vertices);try{for(m.s();!(p=m.n()).done;){var w=p.value;g.push(new Me.Vector2(w.x*e.lx,w.y*e.ly).rotateAround(Dt,a))}}catch(J){m.e(J)}finally{m.f()}I.current.set(n.id,g),M.current.set(n.id,y.vertices.map((function(e){return Object(d.a)({},e)})))}Tw.isPlantOrHuman(n)&&z.current.set(n.id,new Me.Vector3(n.cx,n.cy,n.cz))}}catch(J){r.e(J)}finally{r.f()}}if(s(e.id,t),l.length>0){var x,v=Object(f.a)(l);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(Tw.isIdentical(b.normal,Tt))switch(b.type){case V.SolarPanel:case V.Sensor:var A=D.current.get(b.id);if(A){var T=new Me.Vector2(A.x,A.y).rotateAround(Dt,-a).y/t;c(b.id,T),R.current.set(b.id,new Me.Vector3(b.cx,T))}break;case V.Polygon:var P=I.current.get(b.id);if(P){var S,H=[],C=Object(f.a)(P);try{for(C.s();!(S=C.n()).done;){var O=S.value.rotateAround(Dt,-a),F=O.x/e.lx,k=O.y/t;H.push({x:F,y:k})}}catch(J){C.e(J)}finally{C.f()}h(b.id,H),W.current.set(b.id,H.map((function(e){return Object(d.a)({},e)})))}}if(Tw.isPlantOrHuman(b))if(R.current.set(b.id,new Me.Vector3(b.cx,b.cy,b.cz)),j.current.set(b.id,e.id),Math.abs(b.cz-e.lz/2)0){var E=Et.getState().contentRef,U=Y(null===E||void 0===E?void 0:E.current,e.id);L(U,e,b)}}else if(Math.abs(Math.abs(b.cy)-e.ly/2)0?t:-t)/2;c(b.id,N),R.current.set(b.id,new Me.Vector3(b.cz,N,b.cz))}}}catch(J){v.e(J)}finally{v.f()}}},U=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=Y(null===a||void 0===a?void 0:a.current,t),i=Y(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=Y(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},N=function(e,t){e&&m((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},J=function(e){if(b&&function(e){if(b){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisTypeOnSurface:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Cuboid&&c.parentId===(null===b||void 0===b?void 0:b.parentId)&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisType:var d,u=Object(f.a)(a);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.Cuboid&&!h.locked){var p=h;if(Math.abs(p.ly-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:if(Math.abs((null===b||void 0===b?void 0:b.ly)-e)>At)return!0}return!1}}(e)){var t=o(b.id),l=t?t.ly:b.ly;if(O.current=void 0,C.current=k(e),C.current)O.current=e,S(l);else switch(z.current.clear(),R.current.clear(),M.current.clear(),W.current.clear(),y){case _.AllSelectedObjectsOfThisType:var i,r=new Map,c=Object(f.a)(a);try{for(c.s();!(i=c.n()).done;){var d=i.value;d.type===V.Cuboid&&!d.locked&&Ew.getState().selectedElementIdSet.has(d.id)&&(r.set(d.id,d.ly),E(d,e))}}catch(G){c.e(G)}finally{c.f()}var g={name:"Set Width for Selected Cuboids on Surface",timestamp:Date.now(),oldSizes:r,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(g.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];s(a,o)}}catch(G){t.e(G)}finally{t.f()}if(g.oldChildrenPositionsMap&&g.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(g.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var c,d,p=Object(u.a)(i.value,2),y=p[0],m=p[1];n(y,m.x,m.y,m.z);var w=null===(c=g.oldChildrenParentIdMap)||void 0===c?void 0:c.get(y),x=null===(d=g.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);w&&x&&w!==x&&(U(w,x,y),N(w,y))}}catch(G){r.e(G)}finally{r.f()}}if(g.oldChildrenVerticesMap&&g.oldChildrenVerticesMap.size>0){var v,b=Object(f.a)(g.oldChildrenVerticesMap.entries());try{for(b.s();!(v=b.n()).done;){var A=Object(u.a)(v.value,2),T=A[0],P=A[1];h(T,P)}}catch(G){b.e(G)}finally{b.f()}}},redo:function(){var e,t=Object(f.a)(g.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];s(a,g.newSize)}}catch(G){t.e(G)}finally{t.f()}if(g.newChildrenPositionsMap&&g.newChildrenPositionsMap.size>0){var o,i=Object(f.a)(g.newChildrenPositionsMap.entries());try{for(i.s();!(o=i.n()).done;){var r,c,d=Object(u.a)(o.value,2),p=d[0],y=d[1];n(p,y.x,y.y,y.z);var m=null===(r=g.oldChildrenParentIdMap)||void 0===r?void 0:r.get(p),w=null===(c=g.newChildrenParentIdMap)||void 0===c?void 0:c.get(p);m&&w&&m!==w&&(U(w,m,p),N(w,p))}}catch(G){i.e(G)}finally{i.f()}}if(g.newChildrenVerticesMap&&g.newChildrenVerticesMap.size>0){var x,v=Object(f.a)(g.newChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(G){v.e(G)}finally{v.f()}}}};p(g),x(w+1);break;case _.AllObjectsOfThisTypeOnSurface:var m,v=new Map,A=Object(f.a)(a);try{for(A.s();!(m=A.n()).done;){var T=m.value;T.type!==V.Cuboid||T.parentId!==b.parentId||T.locked||(v.set(T.id,T.ly),E(T,e))}}catch(G){A.e(G)}finally{A.f()}var P={name:"Set Width for All Cuboids on Surface",timestamp:Date.now(),oldSizes:v,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(P.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];s(a,o)}}catch(G){t.e(G)}finally{t.f()}if(P.oldChildrenPositionsMap&&P.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(P.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var c,d,p=Object(u.a)(i.value,2),y=p[0],g=p[1];n(y,g.x,g.y,g.z);var m=null===(c=P.oldChildrenParentIdMap)||void 0===c?void 0:c.get(y),w=null===(d=P.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(G){r.e(G)}finally{r.f()}}if(P.oldChildrenVerticesMap&&P.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(P.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(G){v.e(G)}finally{v.f()}}},redo:function(){if(function(e){var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.type!==V.Cuboid||o.locked||o.parentId!==(null===b||void 0===b?void 0:b.parentId)||E(o,e)}}catch(G){l.e(G)}finally{l.f()}}(P.newSize),P.newChildrenPositionsMap&&P.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(P.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,o,i=Object(u.a)(e.value,2),r=i[0],c=i[1];n(r,c.x,c.y,c.z);var s=null===(l=P.oldChildrenParentIdMap)||void 0===l?void 0:l.get(r),d=null===(o=P.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);s&&d&&s!==d&&(U(d,s,r),N(d,r))}}catch(G){t.e(G)}finally{t.f()}}if(P.newChildrenVerticesMap&&P.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(P.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(G){y.e(G)}finally{y.f()}}}};p(P),x(w+1);break;case _.AllObjectsOfThisType:var D,I=new Map,F=Object(f.a)(a);try{for(F.s();!(D=F.n()).done;){var Y=D.value;Y.type!==V.Cuboid||Y.locked||(I.set(Y.id,Y.ly),E(Y,e))}}catch(G){F.e(G)}finally{F.f()}var L={name:"Set Width for All Cuboids on Surface",timestamp:Date.now(),oldSizes:I,newSize:e,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){var e,t=Object(f.a)(L.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];s(a,o)}}catch(G){t.e(G)}finally{t.f()}if(L.oldChildrenPositionsMap&&L.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(L.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var c,d,p=Object(u.a)(i.value,2),y=p[0],g=p[1];n(y,g.x,g.y,g.z);var m=null===(c=L.oldChildrenParentIdMap)||void 0===c?void 0:c.get(y),w=null===(d=L.newChildrenParentIdMap)||void 0===d?void 0:d.get(y);m&&w&&m!==w&&(U(m,w,y),N(m,y))}}catch(G){r.e(G)}finally{r.f()}}if(L.oldChildrenVerticesMap&&L.oldChildrenVerticesMap.size>0){var x,v=Object(f.a)(L.oldChildrenVerticesMap.entries());try{for(v.s();!(x=v.n()).done;){var b=Object(u.a)(x.value,2),A=b[0],T=b[1];h(A,T)}}catch(G){v.e(G)}finally{v.f()}}},redo:function(){var e,t=Object(f.a)(L.oldSizes.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0];l[1];s(a,L.newSize)}}catch(G){t.e(G)}finally{t.f()}if(L.newChildrenPositionsMap&&L.newChildrenPositionsMap.size>0){var o,i=Object(f.a)(L.newChildrenPositionsMap.entries());try{for(i.s();!(o=i.n()).done;){var r,c,d=Object(u.a)(o.value,2),p=d[0],y=d[1];n(p,y.x,y.y,y.z);var g=null===(r=L.oldChildrenParentIdMap)||void 0===r?void 0:r.get(p),m=null===(c=L.newChildrenParentIdMap)||void 0===c?void 0:c.get(p);g&&m&&g!==m&&(U(m,g,p),N(m,p))}}catch(G){i.e(G)}finally{i.f()}}if(L.newChildrenVerticesMap&&L.newChildrenVerticesMap.size>0){var w,x=Object(f.a)(L.newChildrenVerticesMap.entries());try{for(x.s();!(w=x.n()).done;){var v=Object(u.a)(w.value,2),b=v[0],A=v[1];h(b,A)}}catch(G){x.e(G)}finally{x.f()}}}};p(L),x(w+1);break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:E(b,e);var J={name:"Set Cuboid Width",timestamp:Date.now(),oldSize:l,newSize:e,resizedElementId:b.id,resizedElementType:b.type,oldChildrenPositionsMap:new Map(z.current),newChildrenPositionsMap:new Map(R.current),oldChildrenVerticesMap:new Map(M.current),newChildrenVerticesMap:new Map(W.current),oldChildrenParentIdMap:new Map(j.current),newChildrenParentIdMap:new Map(H.current),undo:function(){if(s(b.id,J.oldSize),J.oldChildrenPositionsMap&&J.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(J.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];n(i,r.x,r.y,r.z);var c=null===(l=J.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=J.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);c&&d&&c!==d&&(U(c,d,i),N(c,i))}}catch(G){t.e(G)}finally{t.f()}}if(J.oldChildrenVerticesMap&&J.oldChildrenVerticesMap.size>0){var p,y=Object(f.a)(J.oldChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(G){y.e(G)}finally{y.f()}}},redo:function(){if(s(b.id,J.newSize),J.newChildrenPositionsMap&&J.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(J.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];n(i,r.x,r.y,r.z);var c=null===(l=J.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),d=null===(a=J.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);c&&d&&c!==d&&(U(d,c,i),N(d,i))}}catch(G){t.e(G)}finally{t.f()}}if(J.newChildrenVerticesMap&&J.newChildrenVerticesMap.size>0){var p,y=Object(f.a)(J.newChildrenVerticesMap.entries());try{for(y.s();!(p=y.n()).done;){var g=Object(u.a)(p.value,2),m=g[0],w=g[1];h(m,w)}}catch(G){y.e(G)}finally{y.f()}}}};p(J),x(w+1)}}},G=function(){l(!1)},X=C.current?": "+me.t("message.NotApplicableToSelectedAction",F)+(void 0!==O.current?" ("+O.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Width",F),rejectedMessage:X,onApply:function(){J(P)},onClose:G,onClickCancel:function(){G(),v()},onClickOk:function(){J(P),C.current||(l(!1),x(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:500,style:{width:120},step:.5,precision:2,value:P,onChange:S}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",F),": [0.1, 500] ",me.t("word.MeterAbbreviation",F)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",F)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",F)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSelectedCuboids",F)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",F)})]})})})]})})},jS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew($r),n=Ew(Zr),c=Ew(zn),s=Ew(vn),d=Ew(Rn),h=Ew(bn),p=Ew(Sr),y=Ew(Qn),g=Ew(Zn),m=Ew(cn),w=Ew(Ii),x=Ew(Ci),v=OP(V.Cuboid),b=Object(r.useState)(null!==(t=null===v||void 0===v?void 0:v.lz)&&void 0!==t?t:0),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=$f(),D=function(e,t){c(e,t),s(e,t/2)},M=function(e){if(v){var t=i(v);if(t){var l,a=Object(f.a)(o);try{for(a.s();!(l=a.n()).done;){var r=l.value;r.type!==V.Cuboid||r.locked||r.parentId!==t.id||(c(r.id,e),s(r.id,e/2))}}catch(n){a.e(n)}finally{a.f()}}}},W=function(e){if(v){var t=Tw.getBaseId(v.id);if(t){var l,a=Object(f.a)(o);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.type!==V.Cuboid||i.locked||Tw.getBaseId(i.id)!==t||(c(i.id,e),s(i.id,e/2))}}catch(r){a.e(r)}finally{a.f()}}}},I=function(e,t){if(null===e||void 0===e)return null;var l,a=Object(f.a)(e.children);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.name.includes("".concat(t)))return o}}catch(i){a.e(i)}finally{a.f()}return null},C=function(e,t,l){if(e){var a,o=Object(f.a)(e.children);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.name.includes("".concat(l.id))){var r,n;null===(r=Et.getState().contentRef)||void 0===r||null===(n=r.current)||void 0===n||n.add(i);break}}}catch(s){o.e(s)}finally{o.f()}l.parentId=xt;var c=new Me.Vector2(l.cx,l.cy).rotateAround(Dt,-t.rotation[2]).add(new Me.Vector2(t.cx,t.cy));l.cx=c.x,l.cy=c.y,l.cz=0,z.current.set(l.id,new Me.Vector3(c.x,c.y,0)),j.current.set(l.id,xt)}},O=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.parentId===e.id&&(S.current.set(i.id,e.id),H.current.set(i.id,new Me.Vector3(i.cx,i.cy,i.cz)),Tw.isPlantOrHuman(i)))if(Math.abs(i.cz-e.lz/2)t/2){var n=Et.getState().contentRef,c=I(null===n||void 0===n?void 0:n.current,e.id);C(c,e,i)}else i.cz=r,z.current.set(i.id,new Me.Vector3(i.cx,i.cy,r))}}}catch(s){o.e(s)}finally{o.f()}}))},F=function(e,t,l){if(e&&t){var a=Et.getState().contentRef,o=I(null===a||void 0===a?void 0:a.current,t),i=I(t===xt?null===a||void 0===a?void 0:a.current:o,l);if(i&&(null===a||void 0===a?void 0:a.current)){if(e===xt)a.current.add(i);else{var r=I(a.current,e);null===r||void 0===r||r.add(i)}Object(Se.c)()}}},k=function(e,t){e&&a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t){i.parentId=e;break}}}catch(r){o.e(r)}finally{o.f()}}))},Y=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.lz=t,i.cz=t/2;else{var r=e.get(i.id);void 0!==r&&(i.lz=r,i.cz=r/2)}}}catch(n){o.e(n)}finally{o.f()}}))},L=function(e){if(v&&function(e){if(v){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Cuboid&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lz-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Cuboid&&!c.locked){var s=c;if(Math.abs(s.lz-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d=Tw.getBaseId(null===v||void 0===v?void 0:v.id);if(d&&d!==xt){var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Cuboid&&p.parentId&&p.parentId!==xt&&!p.locked){var g=p;if(d===Tw.getBaseId(g.id)&&Math.abs(g.lz-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}}break;case _.AllObjectsOfThisTypeOnSurface:var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var x=m.value;if(x.type===V.Cuboid&&x.parentId!==xt&&x.parentId===(null===v||void 0===v?void 0:v.parentId)&&!x.locked){var b=x;if(Math.abs(b.lz-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}break;default:if(Math.abs((null===v||void 0===v?void 0:v.lz)-e)>At)return!0}return!1}}(e)){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=new Map,i=Object(f.a)(o);try{for(i.s();!(t=i.n()).done;){var r=t.value;r.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(r.id)&&(l.set(r.id,r.lz),O(r,e))}}catch(Q){i.e(Q)}finally{i.f()}var c={name:"Set Height for Selected Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),undo:function(){if(Y(c.oldValues),c.oldChildrenPositionsMap&&c.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(c.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];m(i,r.x,r.y,r.z);var n=null===(l=c.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),s=null===(a=c.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&s&&n!==s&&(F(n,s,i),k(n,i))}}catch(Q){t.e(Q)}finally{t.f()}}},redo:function(){var e=c.newValue;if(Y(c.oldValues,e),c.newChildrenPositionsMap&&c.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(c.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];m(r,n.x,n.y,n.z);var s=null===(a=c.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),d=null===(o=c.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);s&&d&&s!==d&&(F(d,s,r),k(d,r))}}catch(Q){l.e(Q)}finally{l.f()}}}};p(c),Y(l,e),x(w+1);break;case _.AllObjectsOfThisType:var s,g=new Map,b=Object(f.a)(o);try{for(b.s();!(s=b.n()).done;){var A=s.value;A.type===V.Cuboid&&(g.set(A.id,A.lz),O(A,e))}}catch(Q){b.e(Q)}finally{b.f()}var T={name:"Set Height for All Cuboids",timestamp:Date.now(),oldValues:g,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(Q){t.e(Q)}finally{t.f()}if(T.oldChildrenPositionsMap&&T.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(T.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],h=s[1];m(d,h.x,h.y,h.z);var p=null===(n=T.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=T.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(F(p,y,d),k(p,d))}}catch(Q){r.e(Q)}finally{r.f()}}},redo:function(){var e=T.newValue;if(d(V.Cuboid,e),h(V.Cuboid,e/2),T.newChildrenPositionsMap&&T.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(T.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];m(r,n.x,n.y,n.z);var c=null===(a=T.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=T.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(F(s,c,r),k(s,r))}}catch(Q){l.e(Q)}finally{l.f()}}}};p(T),d(V.Cuboid,e),h(V.Cuboid,e/2),x(w+1);break;case _.AllObjectsOfThisTypeAboveFoundation:var P,R=new Map,I=Tw.getBaseId(v.id),C=Object(f.a)(o);try{for(C.s();!(P=C.n()).done;){var L=P.value;L.type===V.Cuboid&&Tw.getBaseId(L.id)===I&&(R.set(L.id,L.lz),O(L,e))}}catch(Q){C.e(Q)}finally{C.f()}var E={name:"Set Height for All Cuboids Above Same Base",timestamp:Date.now(),oldValues:R,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(Q){t.e(Q)}finally{t.f()}if(E.oldChildrenPositionsMap&&E.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(E.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],h=s[1];m(d,h.x,h.y,h.z);var p=null===(n=E.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=E.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(F(p,y,d),k(p,d))}}catch(Q){r.e(Q)}finally{r.f()}}},redo:function(){var e=E.newValue;if(W(e),E.newChildrenPositionsMap&&E.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(E.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];m(r,n.x,n.y,n.z);var c=null===(a=E.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=E.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(F(s,c,r),k(s,r))}}catch(Q){l.e(Q)}finally{l.f()}}}};p(E),W(e),x(w+1);break;case _.AllObjectsOfThisTypeOnSurface:var U,N=new Map,J=Object(f.a)(o);try{for(J.s();!(U=J.n()).done;){var G=U.value;G.type===V.Cuboid&&G.parentId===v.parentId&&(N.set(G.id,G.lz),O(G,e))}}catch(Q){J.e(Q)}finally{J.f()}var X={name:"Set Height for All Cuboids on Same Surface",timestamp:Date.now(),oldValues:N,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),undo:function(){var e,t=Object(f.a)(X.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(Q){t.e(Q)}finally{t.f()}if(X.oldChildrenPositionsMap&&X.oldChildrenPositionsMap.size>0){var i,r=Object(f.a)(X.oldChildrenPositionsMap.entries());try{for(r.s();!(i=r.n()).done;){var n,c,s=Object(u.a)(i.value,2),d=s[0],h=s[1];m(d,h.x,h.y,h.z);var p=null===(n=X.oldChildrenParentIdMap)||void 0===n?void 0:n.get(d),y=null===(c=X.newChildrenParentIdMap)||void 0===c?void 0:c.get(d);p&&y&&p!==y&&(F(p,y,d),k(p,d))}}catch(Q){r.e(Q)}finally{r.f()}}},redo:function(){var e=X.newValue;if(M(e),X.newChildrenPositionsMap&&X.newChildrenPositionsMap.size>0){var t,l=Object(f.a)(X.newChildrenPositionsMap.entries());try{for(l.s();!(t=l.n()).done;){var a,o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];m(r,n.x,n.y,n.z);var c=null===(a=X.oldChildrenParentIdMap)||void 0===a?void 0:a.get(r),s=null===(o=X.newChildrenParentIdMap)||void 0===o?void 0:o.get(r);c&&s&&c!==s&&(F(s,c,r),k(s,r))}}catch(Q){l.e(Q)}finally{l.f()}}}};p(X),M(e),x(w+1);break;default:var B=n(v.id),K=B?B.lz:v.lz;O(v,e),D(v.id,e);var q={name:"Set Cuboid Width",timestamp:Date.now(),oldValue:K,newValue:e,oldChildrenPositionsMap:new Map(H.current),newChildrenPositionsMap:new Map(z.current),oldChildrenParentIdMap:new Map(S.current),newChildrenParentIdMap:new Map(j.current),changedElementId:v.id,changedElementType:v.type,undo:function(){if(D(q.changedElementId,q.oldValue),q.oldChildrenPositionsMap&&q.oldChildrenPositionsMap.size>0){var e,t=Object(f.a)(q.oldChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];m(i,r.x,r.y,r.z);var n=null===(l=q.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=q.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(F(n,c,i),k(n,i))}}catch(Q){t.e(Q)}finally{t.f()}}},redo:function(){if(D(q.changedElementId,q.newValue),q.newChildrenPositionsMap&&q.newChildrenPositionsMap.size>0){var e,t=Object(f.a)(q.newChildrenPositionsMap.entries());try{for(t.s();!(e=t.n()).done;){var l,a,o=Object(u.a)(e.value,2),i=o[0],r=o[1];m(i,r.x,r.y,r.z);var n=null===(l=q.oldChildrenParentIdMap)||void 0===l?void 0:l.get(i),c=null===(a=q.newChildrenParentIdMap)||void 0===a?void 0:a.get(i);n&&c&&n!==c&&(F(c,n,i),k(c,i))}}catch(Q){t.e(Q)}finally{t.f()}}}};p(q),x(w+1)}a((function(t){t.actionState.cuboidHeight=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Height",R),onApply:function(){L(T)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:1e3,style:{width:120},step:.5,precision:2,value:T,onChange:P}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",R),": [0.1, 1000] ",me.t("word.MeterAbbreviation",R)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",R)}),(null===v||void 0===v?void 0:v.parentId)!==xt&&Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("cuboidMenu.AllCuboidsAboveSameBase",R)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSelectedCuboids",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",R)})]})})})]})})},HS=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(Nn),n=Ew(Sr),c=Ew(Qn),s=Ew(Zn),d=Ew(Ii),h=Ew(Ci),p=OP(V.Cuboid),y=Object(r.useState)(p&&null!==(t=-p.rotation[2])&&void 0!==t?t:0),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e){var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.type!==V.Cuboid||o.locked||o.parentId!==(null===p||void 0===p?void 0:p.parentId)||i(o.id,0,0,-e)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id))if(void 0!==t)i.rotation[2]=t;else{var r=e.get(i.id);void 0!==r&&(i.rotation[2]=-r)}}}catch(n){o.e(n)}finally{o.f()}}))},A=function(e){if(p&&function(e){var t;switch(c){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(a);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Cuboid&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=i;if(Math.abs(-r.rotation[2]-e)>At)return!0}}}catch(w){o.e(w)}finally{o.f()}break;case _.AllObjectsOfThisTypeOnSurface:var n,s=Object(f.a)(a);try{for(s.s();!(n=s.n()).done;){var d=n.value;if(d.type===V.Cuboid&&d.parentId===(null===p||void 0===p?void 0:p.parentId)&&!d.locked){var u=d;if(Math.abs(-u.rotation[2]-e)>At)return!0}}}catch(w){s.e(w)}finally{s.f()}break;case _.AllObjectsOfThisType:var h,y=Object(f.a)(a);try{for(y.s();!(h=y.n()).done;){var g=h.value;if(g.type===V.Cuboid&&!g.locked){var m=g;if(Math.abs(-m.rotation[2]-e)>At)return!0}}}catch(w){y.e(w)}finally{y.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:if(Math.abs((p&&null!==(t=-p.rotation[2])&&void 0!==t?t:0)-e)>At)return!0}return!1}(e))switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var s=t.value;s.type===V.Cuboid&&!s.locked&&Ew.getState().selectedElementIdSet.has(s.id)&&l.set(s.id,-s.rotation[2])}}catch(M){r.e(M)}finally{r.f()}var y={name:"Set Azimuth for Selected Cuboids",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(y.oldValues)},redo:function(){b(y.oldValues,-y.newValue)}};n(y),b(l,-e),h(d+1);break;case _.AllObjectsOfThisTypeOnSurface:var g,m=new Map,w=Object(f.a)(a);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type!==V.Cuboid||x.parentId!==p.parentId||x.locked||m.set(x.id,-x.rotation[2])}}catch(M){w.e(M)}finally{w.f()}var A={name:"Set Azimuth for All Cuboids on Surface",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,0,0,-o)}}catch(M){t.e(M)}finally{t.f()}},redo:function(){v(A.newValue)}};n(A),v(e),h(d+1);break;case _.AllObjectsOfThisType:var T,P=new Map,S=Object(f.a)(a);try{for(S.s();!(T=S.n()).done;){var j=T.value;j.type!==V.Cuboid||j.locked||P.set(j.id,-j.rotation[2])}}catch(M){S.e(M)}finally{S.f()}var H={name:"Set Azimuth for All Cuboids",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){b(H.oldValues)},redo:function(){b(H.oldValues,-H.newValue)}};n(H),b(P,-e),h(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:break;default:var z=o(p.id),R=z?-z.rotation[2]:-p.rotation[2],D={name:"Set Cuboid Azimuth",timestamp:Date.now(),oldValue:R,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){i(D.changedElementId,0,0,-D.oldValue)},redo:function(){i(D.changedElementId,0,0,-D.newValue)}};n(D),i(p.id,0,0,-e),h(d+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Azimuth",x),onApply:function(){A(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:-180,max:180,style:{width:120},step:.5,precision:2,value:parseFloat(Tw.toDegrees(m).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){w(Tw.toRadians(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",paddingRight:"6px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [-180\xb0, 180\xb0]",Object(gf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",x),Object(gf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){s(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.OnlyThisCuboid",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("cuboidMenu.AllCuboidsOnSameSurface",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSelectedCuboids",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllCuboids",x)})]})})})]})})},zS=l.p+"static/media/building_facade_05_menu.8fe3496b.png",RS=l.p+"static/media/building_facade_06_menu.4342d26b.png",DS=l.p+"static/media/building_facade_10_menu.de5158c9.png",MS=function(e){var t=e.setDialogVisible,l=Ew(si),a=Ew(Fi),o=Ew(Sr),i=Ew(Qn),n=Ew(Zn),c=Ew(nn),s=Ew(Ii),d=Ew(Ci),p=OP(V.Cuboid),y=Object(r.useState)(p&&p.textureTypes&&c>=0?p.textureTypes[c]:de.NoTexture),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=db.a.Option;Object(r.useEffect)((function(){p&&w(p.textureTypes&&c>=0?p.textureTypes[c]:de.NoTexture)}),[p,c]);var b=function(e,t,a){l((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.Cuboid&&r.id===t&&!r.locked){var n=r;n.textureTypes||(n.textureTypes=new Array(6),n.textureTypes.fill(de.NoTexture)),n.textureTypes[e]=a;break}}}catch(c){i.e(c)}finally{i.f()}}))},A=function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Cuboid&&i.id===e&&!i.locked){var r=i;r.textureTypes||(r.textureTypes=new Array(6),r.textureTypes.fill(de.NoTexture));for(var n=0;n<4;n++)r.textureTypes[n]=t;break}}}catch(c){o.e(c)}finally{o.f()}}))},T=function(e,t){l((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Cuboid&&!i.locked&&e.has(i.id)){var r=i;if(r.textureTypes||(r.textureTypes=new Array(6),r.textureTypes.fill(de.NoTexture)),void 0!==t)for(var n=0;n<4;n++)r.textureTypes[n]=t;else{var c=e.get(i.id);if(c&&c.length>=4)for(var s=0;s<4;s++)r.textureTypes[s]=c[s]}}}}catch(d){o.e(d)}finally{o.f()}}))},P=function(e){l((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Cuboid&&!o.locked){var i=o;i.textureTypes||(i.textureTypes=new Array(6),i.textureTypes.fill(de.NoTexture));for(var r=0;r<4;r++)i.textureTypes[r]=e}}}catch(n){a.e(n)}finally{a.f()}}))},S=function(e){if(p&&function(e){if(p){switch(i){case _.AllObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Cuboid&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var r=o;if(r.textureTypes)for(var n=0;n<4;n++)if(e!==r.textureTypes[n])return!0}}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Cuboid&&!u.locked){var h=u;if(h.textureTypes)for(var y=0;y<4;y++)if(e!==h.textureTypes[y])return!0}}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisObject:if(p.textureTypes)for(var g=0;g<4;g++)if(e!==p.textureTypes[g])return!0;break;default:if(c>=0&&p.textureTypes&&e!==p.textureTypes[c])return!0}return!1}}(e))switch(i){case _.AllSelectedObjectsOfThisType:var t,r=new Map,n=Object(f.a)(a);try{for(n.s();!(t=n.n()).done;){var y=t.value;if(y.type===V.Cuboid&&Ew.getState().selectedElementIdSet.has(y.id)){var g=y;r.set(y.id,g.textureTypes?Object(h.a)(g.textureTypes):void 0)}}}catch(W){n.e(W)}finally{n.f()}var m={name:"Set Texture for Selected Cuboids",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];if(o&&Array.isArray(o))for(var i=0;i=0){var D=p.textureTypes?p.textureTypes[c]:de.NoTexture,M={name:"Set Texture for Selected Side of Cuboid",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:p.id,changedElementType:p.type,changedSideIndex:c,undo:function(){void 0!==M.changedSideIndex&&b(M.changedSideIndex,M.changedElementId,M.oldValue)},redo:function(){void 0!==M.changedSideIndex&&b(M.changedSideIndex,M.changedElementId,M.newValue)}};o(M),b(c,p.id,e),d(s+1),l((function(t){t.actionState.cuboidFaceTextures||(t.actionState.cuboidFaceTextures=[de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture,de.NoTexture]),t.actionState.cuboidFaceTextures[c]=e}))}}};return Object(gf.jsx)(kP,{width:600,title:me.t("word.Texture",x),onApply:function(){S(m)},onClose:function(){(null===p||void 0===p?void 0:p.textureTypes)&&c>=0&&w(p.textureTypes[c]),t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:m,onChange:w,children:[Object(gf.jsxs)(v,{value:de.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",x)]},de.NoTexture),Object(gf.jsxs)(v,{value:de.Facade01,children:[Object(gf.jsx)("img",{alt:de.Facade01,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture01",x)]},de.Facade01),Object(gf.jsxs)(v,{value:de.Facade02,children:[Object(gf.jsx)("img",{alt:de.Facade02,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture02",x)]},de.Facade02),Object(gf.jsxs)(v,{value:de.Facade03,children:[Object(gf.jsx)("img",{alt:de.Facade03,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture03",x)]},de.Facade03),Object(gf.jsxs)(v,{value:de.Facade04,children:[Object(gf.jsx)("img",{alt:de.Facade04,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture04",x)]},de.Facade04),Object(gf.jsxs)(v,{value:de.Facade05,children:[Object(gf.jsx)("img",{alt:de.Facade05,src:zS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture05",x)]},de.Facade05),Object(gf.jsxs)(v,{value:de.Facade06,children:[Object(gf.jsx)("img",{alt:de.Facade06,src:RS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture06",x)]},de.Facade06),Object(gf.jsxs)(v,{value:de.Facade07,children:[Object(gf.jsx)("img",{alt:de.Facade07,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture07",x)]},de.Facade07),Object(gf.jsxs)(v,{value:de.Facade08,children:[Object(gf.jsx)("img",{alt:de.Facade08,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture08",x)]},de.Facade08),Object(gf.jsxs)(v,{value:de.Facade09,children:[Object(gf.jsx)("img",{alt:de.Facade09,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture09",x)]},de.Facade09),Object(gf.jsxs)(v,{value:de.Facade10,children:[Object(gf.jsx)("img",{alt:de.Facade10,src:DS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("cuboidMenu.Texture10",x)]},de.Facade10)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){n(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("cuboidMenu.OnlyThisSide",x)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("cuboidMenu.AllSidesOfThisCuboid",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfSelectedCuboids",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("cuboidMenu.AllSidesOfAllCuboids",x)})]})})})]})})},WS=n.a.memo((function(){var e,t,l,a,o=Ew(si),i=Ew(Vi),n=Ew(Sr),c=Ew(hs),s=Ew(es),d=Ew(Zn),p=Ew(ns),y=Ew(qc),g=Ew(Ci),m=Ew(nn),w=Ew(os),x=OP(V.Cuboid),v=Object(r.useState)(!1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useState)(!1),S=Object(u.a)(P,2),j=S[0],H=S[1],z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(!1),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),Y=k[0],L=k[1],E=Object(r.useState)(!1),U=Object(u.a)(E,2),N=U[0],J=U[1],G=zP(x),X=G.labelText,B=G.setLabelText,K=RP(x),q=DP(x,X),Q=MP(x),Z=WP(x),$=IP(x),ee=CP(x);if(!x)return null;var te=x?c(x.id,!1):new Rw,le=!(null===x||void 0===x?void 0:x.locked),ae={lng:i},oe=function(){o((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===x.id){a.enableGroupMaster=!a.enableGroupMaster;break}}}catch(o){l.e(o)}finally{l.f()}e.groupActionUpdateFlag=!e.groupActionUpdateFlag}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){if(w&&w.length>0){var e=w[0];if(e.type===V.Human||e.type===V.Tree||e.type===V.Flower||e.type===V.Polygon||e.type===V.Sensor||e.type===V.SolarPanel||e.type===V.Cuboid)return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"cuboid-paste"}),Object(gf.jsx)(TP,{keyName:"cuboid-copy"}),le&&Object(gf.jsx)(PP,{keyName:"cuboid-cut"}),Object(gf.jsx)(SP,{keyName:"cuboid-lock"}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:x.enableGroupMaster,onChange:function(e){var t={name:"Group Master",timestamp:Date.now(),checked:e.target.checked,selectedElementId:x.id,selectedElementType:x.type,undo:function(){return oe()},redo:function(){return oe()}};n(t),oe()},children:me.t("cuboidMenu.GroupMaster",{lng:i})})},"group-master"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:x.stackable,onChange:function(e){o((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===x.id){var o=!a.stackable;a.stackable=o,e.actionState.cuboidStackable=o;break}}}catch(i){l.e(i)}finally{l.f()}}))},children:me.t("cuboidMenu.Stackable",{lng:i})})},"stackable"),te.gotSome()&&Object(gf.jsxs)(HP.a,{title:me.t("word.Clear",ae),style:{paddingLeft:"24px"},children:[te.sensorCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllSensorsOnCuboid",ae)+" ("+te.sensorCount+" "+me.t("cuboidMenu.Sensors",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Sensor&&e.parentId===x.id}));s(x.id,V.Sensor);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Sensors on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Sensor)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedSensors",ae)," (",te.sensorCount," ",me.t("cuboidMenu.Sensors",ae),")"]},"remove-all-sensors-on-cuboid"),te.solarPanelCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllSolarPanelsOnCuboid",ae)+" ("+te.solarPanelModuleCount+" "+me.t("cuboidMenu.SolarPanels",ae)+", "+te.solarPanelCount+" "+me.t("cuboidMenu.Racks",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.SolarPanel&&e.parentId===x.id}));s(x.id,V.SolarPanel);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Solar Panels on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.SolarPanel)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedSolarPanels",ae),"\xa0 (",te.solarPanelModuleCount," ",me.t("cuboidMenu.SolarPanels",ae),",",te.solarPanelCount," ",me.t("cuboidMenu.Racks",ae),")"]},"remove-all-solar-panels-on-cuboid"),te.polygonCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllPolygonsOnCuboid",ae)+" ("+te.polygonCount+" "+me.t("cuboidMenu.Polygons",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Polygon&&e.parentId===x.id}));s(x.id,V.Polygon);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Polygons on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Polygon)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedPolygons",ae)," (",te.polygonCount," ",me.t("cuboidMenu.Polygons",ae),")"]},"remove-all-polygons-on-cuboid"),te.humanCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllHumansOnCuboid",ae)+" ("+te.humanCount+" "+me.t("cuboidMenu.Humans",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Human&&e.parentId===x.id}));s(x.id,V.Human);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Humans on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Human)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedHumans",ae)," (",te.humanCount," ",me.t("cuboidMenu.Humans",ae),")"]},"remove-all-humans-on-cuboid"),te.treeCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllTreesOnCuboid",ae)+" ("+te.treeCount+" "+me.t("cuboidMenu.Trees",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Tree&&e.parentId===x.id}));s(x.id,V.Tree);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Trees on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Tree)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedTrees",ae)," (",te.treeCount," ",me.t("cuboidMenu.Trees",ae),")"]},"remove-all-trees-on-cuboid"),te.flowerCount>0&&Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:me.t("cuboidMenu.DoYouReallyWantToRemoveAllFlowersOnCuboid",ae)+" ("+te.flowerCount+" "+me.t("cuboidMenu.Flowers",ae)+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){if(x){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Flower&&e.parentId===x.id}));s(x.id,V.Flower);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Flowers on Cuboid",timestamp:Date.now(),parentId:x.id,removedElements:t,undo:function(){o((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){s(l.parentId,V.Flower)}};n(l)}}})},children:[me.t("cuboidMenu.RemoveAllUnlockedFlowers",ae)," (",te.flowerCount," ",me.t("cuboidMenu.Flowers",ae),")"]},"remove-all-flowers-on-cuboid")]},"clear"),le&&(!x.textureTypes||m>=0&&x.textureTypes[m]===de.NoTexture)&&Object(gf.jsxs)(gf.Fragment,{children:[A&&Object(gf.jsx)(TS,{setDialogVisible:T}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){g(0),T(!0)},children:[me.t("word.Color",ae)," ..."]},"cuboid-color")]}),le&&Object(gf.jsxs)(gf.Fragment,{children:[j&&Object(gf.jsx)(MS,{setDialogVisible:H}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){g(0),H(!0)},children:[me.t("word.Texture",ae)," ..."]},"cuboid-texture"),C&&Object(gf.jsx)(PS,{setDialogVisible:O}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Ew.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),O(!0)},children:[me.t("word.Length",ae)," ..."]},"cuboid-length"),D&&Object(gf.jsx)(SS,{setDialogVisible:M}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Ew.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),M(!0)},children:[me.t("word.Width",ae)," ..."]},"cuboid-width"),Y&&Object(gf.jsx)(jS,{setDialogVisible:L}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Ew.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),L(!0)},children:[me.t("word.Height",ae)," ..."]},"cuboid-height"),N&&Object(gf.jsx)(HS,{setDialogVisible:J}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Ew.getState().cuboidActionScope===_.OnlyThisSide&&d(_.OnlyThisObject),g(0),J(!0)},children:[me.t("word.Azimuth",ae)," ..."]},"cuboid-azimuth")]}),Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(x){o((function(e){e.objectTypeToAdd=V.Polygon}));var e,t=Tw.getWorldDataById(x.id).pos;switch(m){case 0:e=St;break;case 1:e=jt;break;case 2:e=Ht;break;case 3:e=zt;break;default:e=Rt,t.z=x.lz}var l=p(x,t,e),a={name:"Add",timestamp:Date.now(),addedElement:l,undo:function(){y(a.addedElement.id,!1)},redo:function(){o((function(e){e.elements.push(a.addedElement),e.selectedElement=a.addedElement}))}};n(a),o((function(e){e.objectTypeToAdd=V.None}))}},children:me.t("cuboidMenu.AddPolygon",ae)},"add-polygon-on-cuboid"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===x||void 0===x?void 0:x.showLabel),onChange:K,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"cuboid-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",ae)+":",value:X,onChange:function(e){return B(e.target.value)},onPressEnter:q,onBlur:q})},"cuboid-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",ae)+":",min:.5,max:100,step:1,precision:1,value:null!==(e=x.labelHeight)&&void 0!==e?e:.5,onChange:function(e){return ee(e)}})},"cuboid-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",ae)+":",min:10,max:100,step:1,precision:0,value:null!==(t=x.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return Q(e)}})},"cuboid-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=x.labelSize)&&void 0!==l?l:.2,onChange:function(e){return Z(e)}})},"cuboid-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",ae)+":",value:null!==(a=x.labelColor)&&void 0!==a?a:"white",onChange:function(e){return $(e.target.value)}})},"cuboid-label-color")]})]},"cuboid-label")]})})),IS=n.a.memo((function(){var e,t,l,a=Ew(si),r=Ew(Fi),n=Ew(Qc),c=Ew(pn),s=Ew(un),d=Ew(Sr),p=Ew(i.latitude),y=null!==(e=Ew(i.leafDayOfYear1))&&void 0!==e?e:rt,g=null!==(t=Ew(i.leafDayOfYear2))&&void 0!==t?t:nt,m=null!==(l=Ew(i.monthlyIrradianceLosses))&&void 0!==l?l:new Array(12).fill(.05),w=Ew((function(e){return e.world.ground.albedo})),x=Ew(o.groundColor),v=Ew(o.groundImage),b=Ew(o.waterSurface),A=Ew(Vi),T=Ew(os),P={lng:A},S=Ew.getState().countAllElementsByType(!0),j=S.treeCount,H=S.flowerCount,z=S.humanCount,R=S.foundationCount,D=S.cuboidCount,M=S.solarPanelCount,W=S.gotSome(),I=function(e){a((function(t){t.viewState.waterSurface=e}))},C=function(e){a((function(t){t.viewState.groundImage=e,t.viewState.groundImageType=t.viewState.mapType}))},O=function(e){a((function(t){t.viewState.groundColor=e}))},F=function(e){a((function(t){t.world.ground.albedo=e}))},k=function(e,t){var l=m[e],o=t,i={name:"Set Irradiance Loss in "+it[e],timestamp:Date.now(),oldValue:l,newValue:o,undo:function(){a((function(t){t.world.monthlyIrradianceLosses[e]=i.oldValue}))},redo:function(){a((function(t){t.world.monthlyIrradianceLosses[e]=i.newValue}))}};d(i),a((function(t){t.world.monthlyIrradianceLosses||(t.world.monthlyIrradianceLosses=new Array(12).fill(.05)),t.world.monthlyIrradianceLosses[e]=o}))},Y=p>0;return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){if(T&&T.length>0){var e=T[0];if(e.type===V.Human||e.type===V.Tree||e.type===V.Flower||e.type===V.Cuboid||e.type===V.Foundation)return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"ground-paste"}),z>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllPeople",P)+" ("+z+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Human}));n(V.Human);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Humans",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Human)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedPeople",P)," (",z,")"]},"ground-remove-all-humans"),j>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllTrees",P)+" ("+j+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Tree}));n(V.Tree);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Trees",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Tree)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedTrees",P)," (",j,")"]},"ground-remove-all-trees"),H>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllFlowers",P)+" ("+H+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Flower}));n(V.Flower);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Flowers",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Flower)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedFlowers",P)," (",H,")"]},"ground-remove-all-flowers"),M>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllSolarPanels",P)+" ("+M+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.SolarPanel}));n(V.SolarPanel);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Solar Panels",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.SolarPanel)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedSolarPanels",P)," (",M,")"]},"ground-remove-all-solar-panels"),R>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllFoundations",P)+" ("+R+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Foundation}));n(V.Foundation);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Foundations",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Foundation)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedFoundations",P)," (",R,")"]},"ground-remove-all-foundations"),D>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){Zv.a.confirm({title:me.t("groundMenu.DoYouReallyWantToRemoveAllCuboids",P)+" ("+D+")?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var e=Ew.getState().elements.filter((function(e){return!e.locked&&e.type===V.Cuboid}));n(V.Cuboid);var t=JSON.parse(JSON.stringify(e)),l={name:"Remove All Cuboids",timestamp:Date.now(),removedElements:t,undo:function(){a((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){n(V.Cuboid)}};d(l)}})},children:[me.t("groundMenu.RemoveAllUnlockedCuboids",P)," (",D,")"]},"ground-remove-all-cuboids"),W&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){var e,t=new Map,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}s(!0);var o={name:"Lock All Elements",timestamp:Date.now(),oldValues:t,newValue:!0,undo:function(){var e,t=Object(f.a)(o.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],r=l[1];c(a,r)}}catch(i){t.e(i)}finally{t.f()}},redo:function(){s(!0)}};d(o)},children:[me.t("groundMenu.LockAllElements",P)," (",r.length,")"]},"lock-all-elements"),!W&&r.length>0&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){var e,t=new Map,l=Object(f.a)(Ew.getState().elements);try{for(l.s();!(e=l.n()).done;){var a=e.value;t.set(a.id,!!a.locked)}}catch(i){l.e(i)}finally{l.f()}s(!1);var o={name:"Lock All Elements",timestamp:Date.now(),oldValues:t,newValue:!1,undo:function(){var e,t=Object(f.a)(o.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],r=l[1];c(a,r)}}catch(i){t.e(i)}finally{t.f()}},redo:function(){s(!1)}};d(o)},children:[me.t("groundMenu.UnlockAllElements",P)," (",r.length,")"]},"unlock-all-elements"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:v,onChange:function(e){var t=e.target.checked,l={name:"Show Ground Image",timestamp:Date.now(),checked:t,undo:function(){C(!l.checked)},redo:function(){C(l.checked)}};d(l),C(t)},children:me.t("groundMenu.ImageOnGround",P)})},"image-on-ground"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:b,onChange:function(e){var t=e.target.checked,l={name:"Water Surface",timestamp:Date.now(),checked:t,undo:function(){I(!l.checked)},redo:function(){I(l.checked)}};d(l),I(t)},children:me.t("groundMenu.WaterSurface",P)})},"water-surface"),!b&&Object(gf.jsx)(HP.a,{title:me.t("word.Color",{lng:A}),style:{paddingLeft:"24px"},children:Object(gf.jsx)(YP.a,{color:x,onChangeComplete:function(e){var t=x,l=e.hex,a={name:"Set Ground Color",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){O(a.oldValue)},redo:function(){O(a.newValue)}};d(a),O(l)}})},"ground-color"),Object(gf.jsx)(HP.a,{title:me.t("groundMenu.Vegetation",{lng:A}),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:10},children:Object(gf.jsx)($v.a,{addonBefore:me.t(Y?"groundMenu.LeafOutDay":"groundMenu.LeafOffDay",P),addonAfter:"(1-150)",style:{width:"300px"},min:1,max:150,step:1,precision:0,value:y,onChange:function(e){var t=y,l=e,o={name:"Set Leaf Day 1",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){a((function(e){e.world.leafDayOfYear1=o.oldValue}))},redo:function(){a((function(e){e.world.leafDayOfYear1=o.newValue}))}};d(o),a((function(e){e.world.leafDayOfYear1=l}))}})},"leaf-out-day"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t(Y?"groundMenu.LeafOffDay":"groundMenu.LeafOutDay",P),addonAfter:"(215-365)",style:{width:"300px"},min:215,max:365,step:1,precision:0,value:g,onChange:function(e){var t=g,l=e,o={name:"Set Leaf Day 2",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){a((function(e){e.world.leafDayOfYear2=o.oldValue}))},redo:function(){a((function(e){e.world.leafDayOfYear2=o.newValue}))}};d(o),a((function(e){e.world.leafDayOfYear2=l}))}})},"leaf-shed-day")]})},"vegetation"),Object(gf.jsx)(HP.a,{title:me.t("groundMenu.MonthlyIrradianceLoss",{lng:A}),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px",marginTop:10},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.January",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[0],onChange:function(e){k(0,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.February",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[1],onChange:function(e){k(1,e)}})]},"irradiance-loss-jan"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.March",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[2],onChange:function(e){k(2,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.April",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[3],onChange:function(e){k(3,e)}})]},"irradiance-loss-mar"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.May",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[4],onChange:function(e){k(4,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.June",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[5],onChange:function(e){k(5,e)}})]},"irradiance-loss-may"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.July",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[6],onChange:function(e){k(6,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.August",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[7],onChange:function(e){k(7,e)}})]},"irradiance-loss-jul"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.September",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[8],onChange:function(e){k(8,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.October",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[9],onChange:function(e){k(9,e)}})]},"irradiance-loss-sep"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"6px"},children:[Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.November",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[10],onChange:function(e){k(10,e)}}),Object(gf.jsx)($v.a,{addonBefore:Object(gf.jsx)("span",{style:{fontFamily:"monospace"},children:me.t("month.December",P)}),style:{width:"120px"},min:0,max:1,step:.01,precision:2,value:m[11],onChange:function(e){k(11,e)}})]},"irradiance-loss-nov")]})},"monthly-irradiance-loss"),Object(gf.jsx)(Qv.a,{children:Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"60px"},children:[me.t("groundMenu.Albedo",P),":"]}),Object(gf.jsx)($v.a,{min:.05,max:1,step:.01,precision:2,value:w,onChange:function(e){if(e){var t=w,l=e,a={name:"Set Ground Albedo",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){F(a.oldValue)},redo:function(){F(a.newValue)}};d(a),F(l)}}})]},"ground-albedo")})]})})),CS=db.a.Option,OS=function(){var e,t=Ew(si),l=Ew(Vi),a=Ew(Sr),o=Ew.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},h=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Human&&i.id===e){var r=i;r.name=l,r.lx=Tl.fetchWidth(l),r.lz=Tl.fetchHeight(l);break}}}catch(n){o.e(n)}finally{o.f()}}))};return Object(gf.jsxs)(db.a,{style:{width:"140px"},value:null!==(e=null===o||void 0===o?void 0:o.name)&&void 0!==e?e:ne.Jack,onChange:function(e){if(o){var l=o.name;if(l!==e){var i={name:"Change People",timestamp:Date.now(),oldValue:l,newValue:e,changedElementId:o.id,changedElementType:o.type,undo:function(){h(i.changedElementId,i.oldValue)},redo:function(){h(i.changedElementId,i.newValue)}};a(i),h(o.id,e),t((function(t){t.actionState.humanName=e})),s(!c)}}},children:[Object(gf.jsxs)(CS,{value:ne.Jack,children:[Object(gf.jsx)("img",{alt:ne.Jack,src:Nt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jack",d)]},ne.Jack),Object(gf.jsxs)(CS,{value:ne.Jacob,children:[Object(gf.jsx)("img",{alt:ne.Jacob,src:Vt,height:20,style:{paddingRight:"16px"}})," ",me.t("people.Jacob",d)]},ne.Jacob),Object(gf.jsxs)(CS,{value:ne.Jacqueline,children:[Object(gf.jsx)("img",{alt:ne.Jacqueline,src:Jt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jacqueline",d)]},ne.Jacqueline),Object(gf.jsxs)(CS,{value:ne.Jaah,children:[Object(gf.jsx)("img",{alt:ne.Jaah,src:Ut,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jaah",d)]},ne.Jaah),Object(gf.jsxs)(CS,{value:ne.Jade,children:[Object(gf.jsx)("img",{alt:ne.Jade,src:Gt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jade",d)]},ne.Jade),Object(gf.jsxs)(CS,{value:ne.Jamelia,children:[Object(gf.jsx)("img",{alt:ne.Jamelia,src:Xt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jamelia",d)]},ne.Jamelia),Object(gf.jsxs)(CS,{value:ne.James,children:[Object(gf.jsx)("img",{alt:ne.James,src:Bt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.James",d)]},ne.James),Object(gf.jsxs)(CS,{value:ne.Jane,children:[Object(gf.jsx)("img",{alt:ne.Jane,src:Kt,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jane",d)]},ne.Jane),Object(gf.jsxs)(CS,{value:ne.Jaya,children:[Object(gf.jsx)("img",{alt:ne.Jaya,src:qt,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jaya",d)]},ne.Jaya),Object(gf.jsxs)(CS,{value:ne.Jaye,children:[Object(gf.jsx)("img",{alt:ne.Jaye,src:Qt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jaye",d)]},ne.Jaye),Object(gf.jsxs)(CS,{value:ne.Jeanette,children:[Object(gf.jsx)("img",{alt:ne.Jeanette,src:Zt,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jeanette",d)]},ne.Jeanette),Object(gf.jsxs)(CS,{value:ne.Jedi,children:[Object(gf.jsx)("img",{alt:ne.Jedi,src:_t,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jedi",d)]},ne.Jedi),Object(gf.jsxs)(CS,{value:ne.Jeff,children:[Object(gf.jsx)("img",{alt:ne.Jeff,src:$t,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jeff",d)]},ne.Jeff),Object(gf.jsxs)(CS,{value:ne.Jena,children:[Object(gf.jsx)("img",{alt:ne.Jena,src:el,height:20,style:{paddingRight:"19px"}})," ",me.t("people.Jena",d)]},ne.Jena),Object(gf.jsxs)(CS,{value:ne.Jennifer,children:[Object(gf.jsx)("img",{alt:ne.Jennifer,src:tl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jennifer",d)]},ne.Jennifer),Object(gf.jsxs)(CS,{value:ne.Jess,children:[Object(gf.jsx)("img",{alt:ne.Jess,src:ll,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jess",d)]},ne.Jess),Object(gf.jsxs)(CS,{value:ne.Jett,children:[Object(gf.jsx)("img",{alt:ne.Jett,src:al,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Jett",d)]},ne.Jett),Object(gf.jsxs)(CS,{value:ne.Jill,children:[Object(gf.jsx)("img",{alt:ne.Jill,src:ol,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jill",d)]},ne.Jill),Object(gf.jsxs)(CS,{value:ne.Jiya,children:[Object(gf.jsx)("img",{alt:ne.Jiya,src:il,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jiya",d)]},ne.Jiya),Object(gf.jsxs)(CS,{value:ne.Joan,children:[Object(gf.jsx)("img",{alt:ne.Joan,src:rl,height:20,style:{paddingRight:"8px"}})," ",me.t("people.Joan",d)]},ne.Joan),Object(gf.jsxs)(CS,{value:ne.Jocelyn,children:[Object(gf.jsx)("img",{alt:ne.Jocelyn,src:nl,height:20,style:{paddingRight:"23px"}})," ",me.t("people.Jocelyn",d)]},ne.Jocelyn),Object(gf.jsxs)(CS,{value:ne.Joel,children:[Object(gf.jsx)("img",{alt:ne.Joel,src:cl,height:20,style:{paddingRight:"7px"}})," ",me.t("people.Joel",d)]},ne.Joel),Object(gf.jsxs)(CS,{value:ne.Joey,children:[Object(gf.jsx)("img",{alt:ne.Joey,src:sl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joey",d)]},ne.Joey),Object(gf.jsxs)(CS,{value:ne.John,children:[Object(gf.jsx)("img",{alt:ne.John,src:dl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.John",d)]},ne.John),Object(gf.jsxs)(CS,{value:ne.Jonathon,children:[Object(gf.jsx)("img",{alt:ne.Jonathon,src:ul,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Jonathon",d)]},ne.Jonathon),Object(gf.jsxs)(CS,{value:ne.Jose,children:[Object(gf.jsx)("img",{alt:ne.Jose,src:fl,height:20,style:{paddingRight:"5px"}})," ",me.t("people.Jose",d)]},ne.Jose),Object(gf.jsxs)(CS,{value:ne.Joseph,children:[Object(gf.jsx)("img",{alt:ne.Joseph,src:hl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joseph",d)]},ne.Joseph),Object(gf.jsxs)(CS,{value:ne.Joshua,children:[Object(gf.jsx)("img",{alt:ne.Joshua,src:pl,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Joshua",d)]},ne.Joshua),Object(gf.jsxs)(CS,{value:ne.Judd,children:[Object(gf.jsx)("img",{alt:ne.Judd,src:yl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Judd",d)]},ne.Judd),Object(gf.jsxs)(CS,{value:ne.Judy,children:[Object(gf.jsx)("img",{alt:ne.Judy,src:gl,height:20,style:{paddingRight:"21px"}})," ",me.t("people.Judy",d)]},ne.Judy),Object(gf.jsxs)(CS,{value:ne.Julia,children:[Object(gf.jsx)("img",{alt:ne.Julia,src:ml,height:20,style:{paddingRight:"22px"}})," ",me.t("people.Julia",d)]},ne.Julia),Object(gf.jsxs)(CS,{value:ne.Julio,children:[Object(gf.jsx)("img",{alt:ne.Julio,src:wl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Julio",d)]},ne.Julio),Object(gf.jsxs)(CS,{value:ne.Jumapili,children:[Object(gf.jsx)("img",{alt:ne.Jumapili,src:xl,height:20,style:{paddingRight:"16px"}})," ",me.t("people.Jumapili",d)]},ne.Jumapili),Object(gf.jsxs)(CS,{value:ne.June,children:[Object(gf.jsx)("img",{alt:ne.June,src:vl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.June",d)]},ne.June),Object(gf.jsxs)(CS,{value:ne.Juro,children:[Object(gf.jsx)("img",{alt:ne.Juro,src:bl,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Juro",d)]},ne.Juro),Object(gf.jsxs)(CS,{value:ne.Justin,children:[Object(gf.jsx)("img",{alt:ne.Justin,src:Al,height:20,style:{paddingRight:"20px"}})," ",me.t("people.Justin",d)]},ne.Justin)]})},FS=l(305),kS=n.a.memo((function(){var e,t=Ew(si),l=Ew(Sr),a=Ew($r),i=Ew(rs),n=Ew(Vi),c=null!==(e=Ew(o.orthographic))&&void 0!==e&&e,s=OP(V.Human),d=Object(r.useState)(!1),p=Object(u.a)(d,2),y=p[0],g=p[1],m=!(null===s||void 0===s?void 0:s.locked),w=Object(r.useRef)(0),x=Object(r.useRef)(-1),v=Object(r.useRef)(!0),b=Object(r.useRef)(!1);Object(r.useEffect)((function(){if(b.current){if(v.current)return w.current=requestAnimationFrame(P),S(),function(){cancelAnimationFrame(w.current)};v.current=!0}}),[y]);var A=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Human&&i.id===e){i.flip=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Human&&i.id===e){i.observer=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function e(){requestAnimationFrame(e);var t=Date.now();t-x.current>100&&(Object(FS.c)(),x.current=t)},S=function(){if(s){var e=s.cx,l=s.cy,o=s.cz+s.lz,r=a(s);if(r){var n=Tw.absoluteHumanOrTreeCoordinates(e,l,o,r);e=n.x,l=n.y,o=n.z}var c=Ew.getState().cameraDirection.clone().normalize().multiplyScalar(.5);e+=c.x,l+=c.y;var d=Object(h.a)(Ew.getState().viewState.cameraPosition);new FS.b(d).to([e,l,o],1e3).easing(FS.a.Quadratic.In).onUpdate((function(e){!function(e,l,a){var o=Et.getState().orbitControlsRef;(null===o||void 0===o?void 0:o.current)&&(o.current.object.position.set(e,l,a),o.current.update(),t((function(t){t.viewState.cameraPosition=[e,l,a]})))}(e[0],e[1],e[2])})).onComplete((function(){i()})).start()}};return s?Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"human-copy"}),m&&Object(gf.jsx)(PP,{keyName:"human-cut"}),Object(gf.jsx)(SP,{keyName:"human-lock"}),m&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:s.observer,onChange:function(e){var t=e.target.checked,a={name:"Set Observer",timestamp:Date.now(),checked:t,selectedElementId:s.id,selectedElementType:V.Human,undo:function(){T(s.id,!a.checked)},redo:function(){T(s.id,a.checked)}};l(a),T(s.id,t)},children:me.t("peopleMenu.Observer",{lng:n})})},"human-observer"),!c&&Object(gf.jsx)(Qv.a.Item,{onClick:function(){g(!y),b.current=!0},style:{paddingLeft:"36px"},children:me.t("peopleMenu.ViewFromThisPerson",{lng:n})},"human-move-view"),m&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:s.flip,onChange:function(e){var t=e.target.checked,a={name:"Flip Human",timestamp:Date.now(),checked:t,selectedElementId:s.id,selectedElementType:V.Human,undo:function(){A(s.id,!a.checked)},redo:function(){A(s.id,a.checked)}};l(a),A(s.id,t)},children:me.t("peopleMenu.Flip",{lng:n})})},"human-flip"),m&&Object(gf.jsx)(Qv.a,{children:Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"120px"},children:[me.t("peopleMenu.ChangePerson",{lng:n}),": "]}),Object(gf.jsx)(OS,{},"humans")]},"human-change-person")})]}):null})),YS=db.a.Option,LS=function(){var e,t=Ew(si),l=Ew(Vi),a=Ew(Sr),o=Ew.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},h=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Flower&&i.id===e){var r=i;r.name=l,r.lx=Nl.fetchSpread(l),r.lz=Nl.fetchHeight(l);break}}}catch(n){o.e(n)}finally{o.f()}}))};return Object(gf.jsxs)(db.a,{style:{width:"200px"},value:null!==(e=null===o||void 0===o?void 0:o.name)&&void 0!==e?e:ie.WhiteFlower,onChange:function(e){if(o){var l=o.name;if(l!==e){var i={name:"Change Flower",timestamp:Date.now(),oldValue:l,newValue:e,changedElementId:o.id,changedElementType:o.type,undo:function(){h(i.changedElementId,i.oldValue)},redo:function(){h(i.changedElementId,i.newValue)}};a(i),h(o.id,e),t((function(t){t.actionState.flowerType=e})),s(!c)}}},children:[Object(gf.jsxs)(YS,{value:ie.WhiteFlower,children:[Object(gf.jsx)("img",{alt:ie.WhiteFlower,src:El,height:20,style:{paddingRight:"17px"}})," ",me.t("flower.WhiteFlower",d)]},ie.WhiteFlower),Object(gf.jsxs)(YS,{value:ie.YellowFlower,children:[Object(gf.jsx)("img",{alt:ie.YellowFlower,src:Ul,height:20,style:{paddingRight:"16px"}})," ",me.t("flower.YellowFlower",d)]},ie.YellowFlower),Object(gf.jsxs)(YS,{value:ie.Hibiscus,children:[Object(gf.jsx)("img",{alt:ie.Hibiscus,src:Ml,height:20,style:{paddingRight:"19px"}})," ",me.t("flower.Hibiscus",d)]},ie.Hibiscus),Object(gf.jsxs)(YS,{value:ie.Hydrangea,children:[Object(gf.jsx)("img",{alt:ie.Hydrangea,src:Wl,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Hydrangea",d)]},ie.Hydrangea),Object(gf.jsxs)(YS,{value:ie.Spirea,children:[Object(gf.jsx)("img",{alt:ie.Spirea,src:Fl,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Spirea",d)]},ie.Spirea),Object(gf.jsxs)(YS,{value:ie.Hosta,children:[Object(gf.jsx)("img",{alt:ie.Hosta,src:Il,height:20,style:{paddingRight:"18px"}})," ",me.t("flower.Hosta",d)]},ie.Hosta),Object(gf.jsxs)(YS,{value:ie.Peony,children:[Object(gf.jsx)("img",{alt:ie.Peony,src:Cl,height:20,style:{paddingRight:"17px"}})," ",me.t("flower.Peony",d)]},ie.Peony),Object(gf.jsxs)(YS,{value:ie.Boxwood,children:[Object(gf.jsx)("img",{alt:ie.Boxwood,src:jl,height:20,style:{paddingRight:"23px"}})," ",me.t("flower.Boxwood",d)]},ie.Boxwood),Object(gf.jsxs)(YS,{value:ie.TallBush,children:[Object(gf.jsx)("img",{alt:ie.TallBush,src:Yl,height:20,style:{paddingRight:"32px"}})," ",me.t("flower.TallBush",d)]},ie.TallBush),Object(gf.jsxs)(YS,{value:ie.CactusCombo1,children:[Object(gf.jsx)("img",{alt:ie.CactusCombo1,src:Hl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo1",d)]},ie.CactusCombo1),Object(gf.jsxs)(YS,{value:ie.CactusCombo2,children:[Object(gf.jsx)("img",{alt:ie.CactusCombo2,src:zl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo2",d)]},ie.CactusCombo2),Object(gf.jsxs)(YS,{value:ie.CactusCombo3,children:[Object(gf.jsx)("img",{alt:ie.CactusCombo3,src:Rl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo3",d)]},ie.CactusCombo3),Object(gf.jsxs)(YS,{value:ie.CactusCombo4,children:[Object(gf.jsx)("img",{alt:ie.CactusCombo4,src:Dl,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.CactusCombo4",d)]},ie.CactusCombo4),Object(gf.jsxs)(YS,{value:ie.RedRose,children:[Object(gf.jsx)("img",{alt:ie.RedRose,src:Ol,height:20,style:{paddingRight:"26px"}})," ",me.t("flower.RedRose",d)]},ie.RedRose),Object(gf.jsxs)(YS,{value:ie.Bellflower,children:[Object(gf.jsx)("img",{alt:ie.Bellflower,src:Sl,height:20,style:{paddingRight:"20px"}})," ",me.t("flower.Bellflower",d)]},ie.Bellflower),Object(gf.jsxs)(YS,{value:ie.Sunflower,children:[Object(gf.jsx)("img",{alt:ie.Sunflower,src:kl,height:20,style:{paddingRight:"32px"}})," ",me.t("flower.Sunflower",d)]},ie.Sunflower),Object(gf.jsxs)(YS,{value:ie.Tulip,children:[Object(gf.jsx)("img",{alt:ie.Tulip,src:Ll,height:20,style:{paddingRight:"24px"}})," ",me.t("flower.Tulip",d)]},ie.Tulip)]})},ES=function(){var e=OP(V.Flower),t=Ew(si),l=Ew(Vi),a=Ew(Sr);if(!e)return null;var o={lng:l},i=!(null===e||void 0===e?void 0:e.locked),r=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Flower&&i.id===e){i.flip=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"flower-copy"}),i&&Object(gf.jsx)(PP,{keyName:"flower-cut"}),Object(gf.jsx)(SP,{keyName:"flower-lock"}),i&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:e.flip,onChange:function(t){var l=t.target.checked,o={name:"Flip Flower",timestamp:Date.now(),checked:l,selectedElementId:e.id,selectedElementType:V.Flower,undo:function(){r(e.id,!o.checked)},redo:function(){r(e.id,o.checked)}};a(o),r(e.id,l)},children:me.t("flowerMenu.Flip",{lng:l})})},"flower-flip"),i&&Object(gf.jsx)(Qv.a,{children:Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"100px"},children:[me.t("flowerMenu.Type",o),": "]}),Object(gf.jsx)(LS,{},"flowers")]},"flower-change-type")})]})},US=function(e){var t,l,a=e.setDialogVisible,o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Cn),s=Ew(On),d=Ew(Fn),h=Ew(kn),p=Ew(Sr),y=Ew(Xn),g=Ew(Bn),m=Ew(Ii),w=Ew(Ci),x=OP(V.Polygon),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.lineColor)&&void 0!==t?t:"black"),b=Object(u.a)(v,2),A=b[0],T=b[1],P=$f(),S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.lineColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){if(x&&function(e){if(x){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.lineColor)return!0}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.lineColor)return!0}}catch(g){r.e(g)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.parentId===x.parentId&&Tw.isIdentical(d.normal,x.normal)&&!d.locked&&d.lineColor!==e)return!0}}catch(g){s.e(g)}finally{s.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Polygon&&p.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!p.locked&&p.lineColor!==e)return!0}}catch(g){h.e(g)}finally{h.f()}break;default:if(e!==(null===x||void 0===x?void 0:x.lineColor))return!0}return!1}}(e))switch(y){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,g=t.value;if(g.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(g.id))l.set(g.id,null!==(r=g.lineColor)&&void 0!==r?r:"black")}}catch(J){a.e(J)}finally{a.f()}var v={name:"Set Line Color for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){S(v.oldValues,v.newValue)}};p(v),S(l,e),w(m+1);break;case _.AllObjectsOfThisType:var b,A=new Map,T=Object(f.a)(o);try{for(T.s();!(b=T.n()).done;){var P,j=b.value;if(j.type===V.Polygon)A.set(j.id,null!==(P=j.lineColor)&&void 0!==P?P:"black")}}catch(J){T.e(J)}finally{T.f()}var H={name:"Set Line Color for All Polygons",timestamp:Date.now(),oldValues:A,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){h(V.Polygon,H.newValue)}};p(H),h(V.Polygon,e),w(m+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(x)){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.parentId===x.parentId&&Tw.isIdentical(W.normal,x.normal))R.set(W.id,null!==(M=W.lineColor)&&void 0!==M?M:"gray")}}catch(J){D.e(J)}finally{D.f()}var I={name:"Set Line Color for All Polygons on Same Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:x.parentId,normal:x.normal,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){I.groupId&&s(V.Polygon,I.groupId,I.normal,I.newValue)}};p(I),s(V.Polygon,x.parentId,x.normal,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){var C,O=new Map,F=Object(f.a)(o);try{for(F.s();!(C=F.n()).done;){var k,Y=C.value;if(Y.type===V.Polygon&&Y.foundationId===x.foundationId)O.set(Y.id,null!==(k=Y.lineColor)&&void 0!==k?k:"black")}}catch(J){F.e(J)}finally{F.f()}var L={name:"Set Line Color for All Polygons Above Foundation",timestamp:Date.now(),oldValues:O,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(L.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){L.groupId&&d(V.Polygon,L.groupId,L.newValue)}};p(L),d(V.Polygon,x.foundationId,e),w(m+1)}break;default:var E=i(x.id),U=E?E.lineColor:x.lineColor,N={name:"Set Line Color of Selected Polygon",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){c(N.changedElementId,N.oldValue)},redo:function(){c(N.changedElementId,N.newValue)}};p(N),c(x.id,e),w(m+1)}};return Object(gf.jsx)(kP,{width:600,title:me.t("polygonMenu.LineColor",P),onApply:function(){j(A)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==A&&void 0!==A?A:null===x||void 0===x?void 0:x.lineColor)&&void 0!==l?l:"black",onChangeComplete:function(e){T(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",P)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",P)})]})})})]})})},NS=function(e){var t,l,a=e.setDialogVisible,o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Dn),s=Ew(Mn),d=Ew(Wn),h=Ew(In),p=Ew(Sr),y=Ew(Xn),g=Ew(Bn),m=Ew(Ii),w=Ew(Ci),x=OP(V.Polygon),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.color)&&void 0!==t?t:"gray"),b=Object(u.a)(v,2),A=b[0],T=b[1],P=$f(),S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){if(x&&function(e){if(x){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.color)return!0}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.color)return!0}}catch(g){r.e(g)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.foundationId===x.foundationId&&!d.locked&&d.color!==e)return!0}}catch(g){s.e(g)}finally{s.f()}break;case _.AllObjectsOfThisTypeOnSurface:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Polygon&&p.parentId===x.parentId&&Tw.isIdentical(p.normal,x.normal)&&!p.locked&&p.color!==e)return!0}}catch(g){h.e(g)}finally{h.f()}break;default:if(e!==x.color)return!0}return!1}}(e))switch(y){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,g=t.value;if(g.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(g.id))l.set(g.id,null!==(r=g.color)&&void 0!==r?r:"gray")}}catch(J){a.e(J)}finally{a.f()}var v={name:"Set Fill Color for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){S(v.oldValues,v.newValue)}};p(v),S(l,e),w(m+1);break;case _.AllObjectsOfThisType:var b,A=new Map,T=Object(f.a)(o);try{for(T.s();!(b=T.n()).done;){var P,j=b.value;if(j.type===V.Polygon)A.set(j.id,null!==(P=j.color)&&void 0!==P?P:"gray")}}catch(J){T.e(J)}finally{T.f()}var H={name:"Set Fill Color for All Polygons",timestamp:Date.now(),oldValues:A,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){h(V.Polygon,H.newValue)}};p(H),h(V.Polygon,e),w(m+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.foundationId===x.foundationId)R.set(W.id,null!==(M=W.color)&&void 0!==M?M:"gray")}}catch(J){D.e(J)}finally{D.f()}var I={name:"Set Fill Color for All Polygons Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){I.groupId&&d(V.Polygon,I.groupId,I.newValue)}};p(I),d(V.Polygon,x.foundationId,e),w(m+1)}break;case _.AllObjectsOfThisTypeOnSurface:if(n(x)){var C,O=new Map,F=Object(f.a)(o);try{for(F.s();!(C=F.n()).done;){var k,Y=C.value;if(Y.type===V.Polygon&&Y.parentId===x.parentId&&Tw.isIdentical(Y.normal,x.normal))O.set(Y.id,null!==(k=Y.color)&&void 0!==k?k:"gray")}}catch(J){F.e(J)}finally{F.f()}var L={name:"Set Fill Color for All Polygons on Same Surface",timestamp:Date.now(),oldValues:O,newValue:e,groupId:x.parentId,normal:x.normal,undo:function(){var e,t=Object(f.a)(L.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){L.groupId&&s(V.Polygon,L.groupId,L.normal,L.newValue)}};p(L),s(V.Polygon,x.parentId,x.normal,e),w(m+1)}break;default:var E=i(x.id),U=E?E.color:x.color,N={name:"Set Fill Color of Selected Polygon",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){c(N.changedElementId,N.oldValue)},redo:function(){c(N.changedElementId,N.newValue)}};p(N),c(x.id,e),w(m+1)}};return Object(gf.jsx)(kP,{width:600,title:me.t("polygonMenu.FillColor",P),onApply:function(){j(A)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==A&&void 0!==A?A:null===x||void 0===x?void 0:x.color)&&void 0!==l?l:"gray",onChangeComplete:function(e){T(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:12,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",P)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",P)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",P)})]})})})]})})},VS=l.p+"static/media/polygon_08_menu.e9d3ae98.png",JS=l.p+"static/media/polygon_10_menu.e1254bdd.png",GS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(Xn),d=Ew(Bn),h=Ew(Ii),p=Ew(Ci),y=OP(V.Polygon),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.textureType)&&void 0!==t?t:ce.NoTexture),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=db.a.Option,A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Polygon&&!i.locked){i.textureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Polygon&&r.parentId===e&&Tw.isIdentical(r.normal,t)&&!r.locked&&(r.textureType=l)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Polygon||i.foundationId!==e||i.locked||(i.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Polygon||o.locked||(o.textureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},j=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.textureType)return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.textureType)return!0}}catch(m){r.e(m)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,d=Object(f.a)(o);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Polygon&&u.parentId===y.parentId&&Tw.isIdentical(u.normal,y.normal)&&!u.locked&&u.textureType!==e)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var h,p=Object(f.a)(o);try{for(p.s();!(h=p.n()).done;){var g=h.value;if(g.type===V.Polygon&&g.foundationId===y.foundationId&&!g.locked&&g.textureType!==e)return!0}}catch(m){p.e(m)}finally{p.f()}break;default:if(e!==(null===y||void 0===y?void 0:y.textureType))return!0}return!1}}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,d=t.value;if(d.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(d.id))l.set(d.id,null!==(r=d.textureType)&&void 0!==r?r:ce.NoTexture)}}catch(J){a.e(J)}finally{a.f()}var g={name:"Set Texture for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){j(g.oldValues,g.newValue)}};c(g),j(l,e),p(h+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v,b=m.value;if(b.type===V.Polygon)w.set(b.id,null!==(v=b.textureType)&&void 0!==v?v:ce.NoTexture)}}catch(J){x.e(J)}finally{x.f()}var H={name:"Set Texture for All Polygons",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){S(H.newValue)}};c(H),S(e),p(h+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(y)){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.parentId===y.parentId&&Tw.isIdentical(W.normal,y.normal))R.set(W.id,null!==(M=W.textureType)&&void 0!==M?M:ce.NoTexture)}}catch(J){D.e(J)}finally{D.f()}var I={name:"Set Texture for All Polygons on Same Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:y.parentId,normal:y.normal,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){I.groupId&&T(I.groupId,I.normal,I.newValue)}};c(I),T(y.parentId,y.normal,e),p(h+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var C,O=new Map,F=Object(f.a)(o);try{for(F.s();!(C=F.n()).done;){var k,Y=C.value;if(Y.type===V.Polygon&&Y.foundationId===y.foundationId)O.set(Y.id,null!==(k=Y.textureType)&&void 0!==k?k:ce.NoTexture)}}catch(J){F.e(J)}finally{F.f()}var L={name:"Set Texture for All Polygons Above Foundation",timestamp:Date.now(),oldValues:O,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(L.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){L.groupId&&P(L.groupId,L.newValue)}};c(L),P(y.foundationId,e),p(h+1)}break;default:var E=i(y.id),U=E?E.textureType:y.textureType,N={name:"Set Texture of Selected Polygon",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(N.changedElementId,N.oldValue)},redo:function(){A(N.changedElementId,N.newValue)}};c(N),A(y.id,e),p(h+1)}};return Object(gf.jsx)(kP,{width:500,title:me.t("polygonMenu.FillTexture",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:w,onChange:function(e){return x(e)},children:[Object(gf.jsxs)(b,{value:ce.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",v)]},ce.NoTexture),Object(gf.jsxs)(b,{value:ce.Texture01,children:[Object(gf.jsx)("img",{alt:ce.Texture01,src:JP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture01",v)]},ce.Texture01),Object(gf.jsxs)(b,{value:ce.Texture02,children:[Object(gf.jsx)("img",{alt:ce.Texture02,src:GP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture02",v)]},ce.Texture02),Object(gf.jsxs)(b,{value:ce.Texture03,children:[Object(gf.jsx)("img",{alt:ce.Texture03,src:XP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture03",v)]},ce.Texture03),Object(gf.jsxs)(b,{value:ce.Texture04,children:[Object(gf.jsx)("img",{alt:ce.Texture04,src:BP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture04",v)]},ce.Texture04),Object(gf.jsxs)(b,{value:ce.Texture05,children:[Object(gf.jsx)("img",{alt:ce.Texture05,src:KP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture05",v)]},ce.Texture05),Object(gf.jsxs)(b,{value:ce.Texture06,children:[Object(gf.jsx)("img",{alt:ce.Texture06,src:qP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture06",v)]},ce.Texture06),Object(gf.jsxs)(b,{value:ce.Texture07,children:[Object(gf.jsx)("img",{alt:ce.Texture07,src:QP,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture07",v)]},ce.Texture07),Object(gf.jsxs)(b,{value:ce.Texture08,children:[Object(gf.jsx)("img",{alt:ce.Texture08,src:VS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture08",v)]},ce.Texture08),Object(gf.jsxs)(b,{value:ce.Texture09,children:[Object(gf.jsx)("img",{alt:ce.Texture09,src:"data:image/png;base64,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",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture09",v)]},ce.Texture09),Object(gf.jsxs)(b,{value:ce.Texture10,children:[Object(gf.jsx)("img",{alt:ce.Texture10,src:JS,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("polygonMenu.Texture10",v)]},ce.Texture10)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",v)})]})})})]})})},XS=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"create",value:function(t,l,a,o,i,r,n,c,s,d,u){if(l.type!==V.Foundation&&l.type!==V.Cuboid)throw new Error("base must be a foundation or cuboid");var f=[],h=Tw.calculatePolygonBounds(t.vertices),p=(o===$.portrait?a.length:a.width)*r;if(c===ee.upDown)for(var y=Math.floor(((h.maxX()-h.minX())*l.lx-p)/n),g=h.minX()+p/(2*l.lx)+u/l.lx,m=n/l.lx,w=.5*Math.abs(Math.cos(i))*p/l.lx,x={x:0,y:-.5},v={x:0,y:.5},b=("rotation"in l?l.rotation:void 0),A=0;A<=y;A++){var T=g+A*m;x.x=v.x=T-w;var P=Tw.polygonIntersections(x,v,t.vertices).sort((function(e,t){return e.y-t.y}));x.x=v.x=T+w;var S=Tw.polygonIntersections(x,v,t.vertices).sort((function(e,t){return e.y-t.y})),j=Math.max(P.length,S.length)/2;if(j>0)for(var H=0;H0)for(var B=0;B0)return Vl.makeSolarPanel(n,c,i,(p+y)/2,n.type===V.Cuboid?.5:n.lz,$.portrait,d,u,s,vt,Rt,o,void 0,g*n.ly,r)}},{key:"makeLeftRightSegment",value:function(e,t,l,a,o,i,r,n,c,s,d,u,f){var h=Math.abs(e.x-t.x)0)return Vl.makeSolarPanel(n,c,(p+y)/2,i,n.type===V.Cuboid?.5:n.lz,$.portrait,d,u,s,0,Rt,o,void 0,g*n.lx,r)}}]),e}(),BS=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"create",value:function(e,t,l,a,o,i,r,n,c,s,d){if(t.type!==V.Foundation&&t.type!==V.Cuboid)throw new Error("base must be a foundation or cuboid");var u,h=[],p=!Tw.isZero(t.rotation[2]),y=[],g=Object(f.a)(e.vertices);try{for(g.s();!(u=g.n()).done;){var m=u.value;y.push({x:m.x*t.lx+t.cx,y:m.y*t.ly+t.cy})}}catch(He){g.e(He)}finally{g.f()}var w=p?Tw.rotatePolygon(y,t.cx,t.cy,t.rotation[2]):y,x=Tw.calculatePolygonBounds(w),v=(a===$.portrait?l.length:l.width)*i,b=.5*Math.abs(Math.cos(o))*v;if(n===ee.eastWest)for(var A=x.maxY()-x.minY(),T=Math.floor((A-2*d-v)/r),P=x.minY()+v/2+d,S={x:x.minX(),y:0},j={x:x.maxX(),y:0},H=0;H<=T;H++){var z=P+H*r;S.y=j.y=z-b;var R=Tw.polygonIntersections(S,j,w).sort((function(e,t){return e.x-t.x}));S.y=j.y=z+b;var D=Tw.polygonIntersections(S,j,w).sort((function(e,t){return e.x-t.x})),M=Math.max(R.length,D.length)/2;if(M>0)for(var W=0;W0){var q=Tw.relativeCoordinates((J+G)/2,z,0,t),Q=Vl.makeSolarPanel(t,l,q.x,q.y,t.type===V.Cuboid?.5:t.lz,$.portrait,c,s,o,-t.rotation[2],Rt,t.rotation,void 0,K,v);Q.referenceId=e.id,Tw.changeOrientation(Q,l,a),h.push(Q)}}}else if(n===ee.northSouth)for(var Z=x.maxX()-x.minX(),_=Math.floor((Z-2*d-v)/r),te=x.minX()+v/2+d,le={x:0,y:x.minY()},ae={x:0,y:x.maxY()},oe=0;oe<=_;oe++){var ie=te+oe*r;le.x=ae.x=ie-b;var re=Tw.polygonIntersections(le,ae,w).sort((function(e,t){return e.y-t.y}));le.x=ae.x=ie+b;var ne=Tw.polygonIntersections(le,ae,w).sort((function(e,t){return e.y-t.y})),ce=Math.max(re.length,ne.length)/2;if(ce>0)for(var se=0;se0){var Se=Tw.relativeCoordinates(ie,(Ae+Te)/2,0,t),je=Vl.makeSolarPanel(t,l,Se.x,Se.y,t.type===V.Cuboid?.5:t.lz,$.portrait,c,s,o,-t.rotation[2]+vt,Rt,t.rotation,void 0,Pe,v);je.referenceId=e.id,Tw.changeOrientation(je,l,a),h.push(je)}}}return h}}]),e}(),KS=db.a.Option,qS=function(e){var t,l=e.setDialogVisible,o=Ew(si),i=Ew(Vi),n=Ew(Fi),c=Ew.getState().solarPanelArrayLayoutParams,s=Ew(on),d=Ew($r),h=Ew(Yi),p=Ew(Ei),y=Ew(yn),g=Ew(_c),m=Ew($c),w=Ew(Zc),x=Ew(Sr),v=Ew(Ii),b=Ew(Ci),A=Ew(Oi),T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!1),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useState)({left:0,top:0,bottom:0,right:0}),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useRef)(null),E=Object(r.useRef)(!0),U=Object(r.useRef)(null),N=Object(r.useRef)(null),J=Object(r.useRef)(!1),G=Object(r.useRef)(Ew(a.pvModelName)),X=Object(r.useRef)(Ew(a.rowAxis)),B=Object(r.useRef)(Ew(a.orientation)),K=Object(r.useRef)(Ew(a.tiltAngle)),q=Object(r.useRef)(Ew(a.rowWidth)),Q=Object(r.useRef)(Ew(a.interRowSpacing)),Z=Object(r.useRef)(null!==(t=Ew(a.margin))&&void 0!==t?t:0),_=Object(r.useRef)(Ew(a.poleHeight)),te=Object(r.useRef)(Ew(a.poleSpacing)),le={lng:i},ae=p(G.current),oe=s();Object(r.useEffect)((function(){var e;null===(e=U.current)||void 0===e||e.focus()}),[]),Object(r.useEffect)((function(){var e;R&&(null===(e=N.current)||void 0===e||e.focus())}),[R]);var ie=function(){if((null===oe||void 0===oe?void 0:oe.type)===V.Polygon){var e=d(oe);if(e){var t=[],l=X.current===ee.eastWest||X.current===ee.northSouth?BS.create(oe,e,ae,B.current,K.current,q.current,Q.current,X.current,_.current,te.current,Z.current):XS.create(oe,e,ae,B.current,K.current,q.current,Q.current,X.current,_.current,te.current,Z.current);if(l.length>0){var a,i=Object(f.a)(l);try{var r=function(){var e=a.value;t.push(JSON.parse(JSON.stringify(e))),o((function(t){t.elements.push(e)}))};for(i.s();!(a=i.n()).done;)r()}catch(s){i.e(s)}finally{i.f()}var n={name:"Solar Panel Array Layout",timestamp:Date.now(),oldElements:Ew.getState().deletedElements,newElements:t,oldParams:{pvModelName:c.pvModelName,rowAxis:c.rowAxis,orientation:c.orientation,tiltAngle:c.tiltAngle,rowsPerRack:c.rowsPerRack,interRowSpacing:c.interRowSpacing,poleHeight:c.poleHeight,poleSpacing:c.poleSpacing,margin:c.margin},newParams:{pvModelName:G.current,rowAxis:X.current,orientation:B.current,tiltAngle:K.current,rowsPerRack:q.current,interRowSpacing:Q.current,poleHeight:_.current,poleSpacing:te.current,margin:Z.current},referenceId:oe.id,undo:function(){m(n.referenceId,!1),n.oldElements.length>0&&o((function(e){var t,l=Object(f.a)(n.oldElements);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.elements.push(a)}}catch(s){l.e(s)}finally{l.f()}})),re(n.oldParams),ne()},redo:function(){m(n.referenceId,!1),n.newElements.length>0&&o((function(e){var t,l=Object(f.a)(n.newElements);try{for(l.s();!(t=l.n()).done;){var a=t.value;e.elements.push(a)}}catch(s){l.e(s)}finally{l.f()}})),re(n.newParams),ne()}};x(n),b(v+1)}}E.current=!1,ne()}},re=function(e){var t;G.current=e.pvModelName,X.current=e.rowAxis,B.current=e.orientation,K.current=e.tiltAngle,q.current=e.rowsPerRack,Q.current=e.interRowSpacing,_.current=e.poleHeight,te.current=e.poleSpacing,Z.current=null!==(t=e.margin)&&void 0!==t?t:0},ne=function(){o((function(e){e.solarPanelArrayLayoutParams.pvModelName=G.current,e.solarPanelArrayLayoutParams.rowAxis=X.current,e.solarPanelArrayLayoutParams.orientation=B.current,e.solarPanelArrayLayoutParams.tiltAngle=K.current,e.solarPanelArrayLayoutParams.rowsPerRack=q.current,e.solarPanelArrayLayoutParams.interRowSpacing=Q.current,e.solarPanelArrayLayoutParams.poleHeight=_.current,e.solarPanelArrayLayoutParams.poleSpacing=te.current,e.solarPanelArrayLayoutParams.margin=Z.current}))},ce=function(){E.current&&(!function(){var e=(B.current===$.portrait?ae.length:ae.width)*q.current;return e*Math.abs(Math.sin(K.current))*.5>_.current?(Qh(me.t("message.SolarPanelsCannotIntersectWithGround",le)),!1):!(e>Q.current)||(Qh(me.t("message.SolarPanelsCannotOverlapWithOneAnother",le)),!1)}()?Qh(me.t("polygonMenu.LayoutNotAcceptedCheckYourParameters",le)):oe&&(!function(e){var t=n.filter((function(t){return t.type===V.SolarPanel&&t.parentId===e.parentId}));if(t.length>0){var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.referenceId!==e.id&&Tw.isPointInside(o.cx,o.cy,e.vertices)&&y(o.id,e.id)}}catch(i){a.e(i)}finally{a.f()}}}(oe),g(oe.id)>0?D(!0):(w(),ie())))};return Object(gf.jsxs)(gf.Fragment,{children:[R&&Object(gf.jsx)(Zv.a,{width:400,visible:R,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return C(!0)},onMouseOut:function(){return C(!1)},children:me.t("word.Reminder",le)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){D(!1)},children:me.t("word.Cancel",le)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:N,onClick:function(){oe&&(m(oe.id,!0),ie(),J.current&&(l(!1),b(0))),D(!1)},children:me.t("word.OK",le)},"OK")],children:me.t("message.ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout",le)+" "+me.t("message.DoYouWantToContinue",le)}),Object(gf.jsxs)(Zv.a,{width:640,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return C(!0)},onMouseOut:function(){return C(!1)},children:me.t("polygonMenu.SolarPanelArrayLayoutParametricDesign",le)}),footer:[Object(gf.jsx)(xv.a,{disabled:!E.current,onClick:function(){ce(),J.current=!1},children:me.t("word.Apply",le)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){l(!1),A(),E.current=!0,J.current=!1},children:me.t("word.Cancel",le)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:U,onClick:function(){E.current?(ce(),J.current=!0):l(!1)},children:me.t("word.OK",le)},"OK")],onCancel:function(){l(!1),E.current=!0},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!I,bounds:k,onStart:function(e,t){return function(e,t){if(L.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=L.current.getBoundingClientRect();Y({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:L,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayModel",le)+" ("+Object.keys(h).length+" "+me.t("word.Options",le)+"):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(db.a,{defaultValue:"Custom",style:{width:"100%"},value:G.current,onChange:function(e){G.current=e,E.current=!0,j(!S)},children:Object.keys(h).map((function(e){return Object(gf.jsx)(KS,{value:e,children:e+(h[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",le)+")":"")},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayRowAxis",le)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,E.current=!0,j(!S)},children:[Object(gf.jsx)(KS,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",le)},ee.leftRight),Object(gf.jsx)(KS,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",le)},ee.upDown),Object(gf.jsx)(KS,{value:ee.eastWest,children:me.t("polygonMenu.SolarPanelArrayEastWestRowAxis",le)},ee.eastWest),Object(gf.jsx)(KS,{value:ee.northSouth,children:me.t("polygonMenu.SolarPanelArrayNorthSouthRowAxis",le)},ee.northSouth)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayOrientation",le)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,E.current=!0,j(!S)},children:[Object(gf.jsx)(KS,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",le)},$.portrait),Object(gf.jsx)(KS,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",le)},$.landscape)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayTiltAngle",le)+" ([-90\xb0, 90\xb0]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:-90,max:90,style:{width:"100%"},precision:2,value:parseFloat(Tw.toDegrees(K.current).toFixed(2)),step:1,formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){K.current=Tw.toRadians(e),E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayRowWidth",le)+" ([1-100] "+me.t("solarPanelMenu.Panels",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:1,max:100,step:1,style:{width:"100%"},precision:0,formatter:function(e){return Number(e).toFixed(0)},value:q.current,onChange:function(e){q.current=e,E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayInterRowSpacing",le)+" ([1, 20] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:1,max:20,style:{width:"100%"},precision:2,value:Q.current,step:.5,onChange:function(e){Q.current=e,E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayMargin",le)+" ([0, 5] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:0,max:5,style:{width:"100%"},precision:1,value:Z.current,step:.1,onChange:function(e){Z.current=e,E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayPoleHeight",le)+" ([0, 10] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:0,max:10,style:{width:"100%"},precision:2,value:_.current,step:.1,onChange:function(e){_.current=e,E.current=!0,j(!S)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("polygonMenu.SolarPanelArrayPoleSpacing",le)+" ([2, 50] "+me.t("word.MeterAbbreviation",le)+"): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{min:2,max:50,style:{width:"100%"},precision:2,value:te.current,step:.5,onChange:function(e){te.current=e,E.current=!0,j(!S)}})})]})]})]})},QS=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(Xn),d=Ew(Bn),h=Ew(Ii),p=Ew(Ci),y=OP(V.Polygon),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.lineStyle)&&void 0!==t?t:F.Solid),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=db.a.Option,A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.lineStyle=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Polygon&&r.parentId===e&&Tw.isIdentical(r.normal,t)&&!r.locked&&(r.lineStyle=l)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Polygon||i.foundationId!==e||i.locked||(i.lineStyle=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Polygon||o.locked||(o.lineStyle=e)}}catch(i){a.e(i)}finally{a.f()}}))},j=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.lineStyle=t)}}catch(r){o.e(r)}finally{o.f()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.lineStyle)return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.lineStyle)return!0}}catch(m){r.e(m)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,d=Object(f.a)(o);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Polygon&&u.parentId===y.parentId&&Tw.isIdentical(u.normal,y.normal)&&!u.locked&&e!==u.lineStyle)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var h,p=Object(f.a)(o);try{for(p.s();!(h=p.n()).done;){var g=h.value;if(g.type===V.Polygon&&g.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!g.locked&&e!==g.lineStyle)return!0}}catch(m){p.e(m)}finally{p.f()}break;default:if(e!==(null===y||void 0===y?void 0:y.lineStyle))return!0}return!1}}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,d=t.value;if(d.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(d.id))l.set(d.id,null!==(r=d.lineStyle)&&void 0!==r?r:F.Solid)}}catch(G){a.e(G)}finally{a.f()}var g={name:"Set Line Style for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(G){t.e(G)}finally{t.f()}},redo:function(){j(g.oldValues,g.newValue)}};c(g),j(l,e),p(h+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v,b=m.value;if(b.type===V.Polygon)w.set(b.id,null!==(v=b.lineStyle)&&void 0!==v?v:F.Solid)}}catch(G){x.e(G)}finally{x.f()}var H={name:"Set Line Style for All Polygons",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(G){t.e(G)}finally{t.f()}},redo:function(){S(H.newValue)}};c(H),S(e),p(h+1);break;case _.AllObjectsOfThisTypeOnSurface:if(n(y)){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.parentId===y.parentId&&Tw.isIdentical(W.normal,y.normal))R.set(W.id,null!==(M=W.lineStyle)&&void 0!==M?M:F.Solid)}}catch(G){D.e(G)}finally{D.f()}var I={name:"Set Line Style for All Polygons on Same Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:y.parentId,normal:y.normal,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(G){t.e(G)}finally{t.f()}},redo:function(){I.groupId&&T(I.groupId,I.normal,I.newValue)}};c(I),T(y.parentId,y.normal,e),p(h+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var C,O=new Map,k=Object(f.a)(o);try{for(k.s();!(C=k.n()).done;){var Y,L=C.value;if(L.type===V.Polygon&&L.foundationId===y.foundationId)O.set(L.id,null!==(Y=L.lineStyle)&&void 0!==Y?Y:F.Solid)}}catch(G){k.e(G)}finally{k.f()}var E={name:"Set Line Style for All Polygons Above Foundation",timestamp:Date.now(),oldValues:O,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(G){t.e(G)}finally{t.f()}},redo:function(){E.groupId&&P(E.groupId,E.newValue)}};c(E),P(y.foundationId,e),p(h+1)}break;default:var U=i(y.id),N=U?U.lineStyle:y.lineStyle,J={name:"Set Line Style of Selected Polygon",timestamp:Date.now(),oldValue:N,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(J.changedElementId,J.oldValue)},redo:function(){A(J.changedElementId,J.newValue)}};c(J),A(y.id,e),p(h+1)}};return Object(gf.jsx)(kP,{width:600,title:me.t("polygonMenu.LineStyle",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsxs)(db.a,{style:{width:"200px"},value:w,onChange:function(e){return x(e)},children:[Object(gf.jsxs)(b,{value:F.Solid,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px solid dimGray"},children:" "}),me.t("polygonMenu.SolidLine",v)]},F.Solid),Object(gf.jsxs)(b,{value:F.Dashed,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px dashed dimGray"},children:" "}),me.t("polygonMenu.DashedLine",v)]},F.Dashed),Object(gf.jsxs)(b,{value:F.Dotted,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"48px",height:"1px",border:"1px dotted dimGray"},children:" "}),me.t("polygonMenu.DottedLine",v)]},F.Dotted)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",v)})]})})})]})})},ZS=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew($r),n=Ew(Yn),c=Ew(Ln),s=Ew(En),d=Ew(Un),h=Ew(Sr),p=Ew(Xn),y=Ew(Bn),g=Ew(Ii),m=Ew(Ci),w=OP(V.Polygon),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.lineWidth)&&void 0!==t?t:1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=$f(),P=db.a.Option,S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Polygon&&!i.locked&&e.has(i.id)&&(i.lineWidth=t)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){if(w&&function(e){if(w){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Polygon&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)&&e!==o.lineWidth)return!0}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(a);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Polygon&&!n.locked&&e!==n.lineWidth)return!0}}catch(g){r.e(g)}finally{r.f()}break;case _.AllObjectsOfThisTypeOnSurface:var c,s=Object(f.a)(a);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Polygon&&d.parentId===w.parentId&&Tw.isIdentical(d.normal,w.normal)&&!d.locked&&d.lineWidth!==e)return!0}}catch(g){s.e(g)}finally{s.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(a);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.Polygon&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked&&y.lineWidth!==e)return!0}}catch(g){h.e(g)}finally{h.f()}break;default:if(e!==(null===w||void 0===w?void 0:w.lineWidth))return!0}return!1}}(e))switch(p){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var y,x=t.value;if(x.type===V.Polygon&&Ew.getState().selectedElementIdSet.has(x.id))l.set(x.id,null!==(y=x.lineWidth)&&void 0!==y?y:1)}}catch(J){r.e(J)}finally{r.f()}var v={name:"Set Line Width for Selected Polygons",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){S(v.oldValues,v.newValue)}};h(v),S(l,e),m(g+1);break;case _.AllObjectsOfThisType:var b,A=new Map,T=Object(f.a)(a);try{for(T.s();!(b=T.n()).done;){var P,j=b.value;if(j.type===V.Polygon)A.set(j.id,null!==(P=j.lineWidth)&&void 0!==P?P:1)}}catch(J){T.e(J)}finally{T.f()}var H={name:"Set Line Width for All Polygons",timestamp:Date.now(),oldValues:A,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){d(V.Polygon,H.newValue)}};h(H),d(V.Polygon,e),m(g+1);break;case _.AllObjectsOfThisTypeOnSurface:if(i(w)){var z,R=new Map,D=Object(f.a)(a);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Polygon&&W.parentId===w.parentId&&Tw.isIdentical(W.normal,w.normal))R.set(W.id,null!==(M=W.lineWidth)&&void 0!==M?M:1)}}catch(J){D.e(J)}finally{D.f()}var I={name:"Set Line Width for All Polygons on Same Surface",timestamp:Date.now(),oldValues:R,newValue:e,groupId:w.parentId,normal:w.normal,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){I.groupId&&c(V.Polygon,I.groupId,I.normal,I.newValue)}};h(I),c(V.Polygon,w.parentId,w.normal,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var C,O=new Map,F=Object(f.a)(a);try{for(F.s();!(C=F.n()).done;){var k,Y=C.value;if(Y.type===V.Polygon&&Y.foundationId===w.foundationId)O.set(Y.id,null!==(k=Y.lineWidth)&&void 0!==k?k:1)}}catch(J){F.e(J)}finally{F.f()}var L={name:"Set Line Width for All Polygons Above Foundation",timestamp:Date.now(),oldValues:O,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(L.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){L.groupId&&s(V.Polygon,L.groupId,L.newValue)}};h(L),s(V.Polygon,w.foundationId,e),m(g+1)}break;default:var E=o(w.id),U=E?E.lineWidth:w.lineWidth,N={name:"Set Line Width of Selected Polygon",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(N.changedElementId,N.oldValue)},redo:function(){n(N.changedElementId,N.newValue)}};h(N),n(w.id,e),m(g+1)}};return Object(gf.jsx)(kP,{width:560,title:me.t("polygonMenu.LineWidth",T),onApply:function(){j(b),l(!1),m(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsxs)(db.a,{style:{width:"200px"},value:b,onChange:function(e){return A(e)},children:[Object(gf.jsx)(P,{value:k.One,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"1px solid dimGray"}})},k.One),Object(gf.jsx)(P,{value:k.Two,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"2px solid dimGray"}})},k.Two),Object(gf.jsx)(P,{value:k.Three,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"3px solid dimGray"}})},k.Three),Object(gf.jsx)(P,{value:k.Four,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"4px solid dimGray"}})},k.Four),Object(gf.jsx)(P,{value:k.Five,children:Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"24px",width:"100%",height:"1px",border:"5px solid dimGray"}})},k.Five)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",T)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",T)})]})})})]})})},_S=l(832),$S=l(833),ej=db.a.Option,tj=_S.a.TabPane,lj=function(e){var t,l,a,o,i,n,c,s,d,f,h=e.setDialogVisible,p=Ew(si),y=Ew(Gi),g=Ew(Vi),m=Tf(Nr),w=Ew(Yi),x=Ew(ln),v=Ew($r),b=Ew(tn),A=Ew(uf).geneticAlgorithmParams,T=Ew(ff),P=Ew(hf),S=Ew(rf),j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)(!1),F=Object(u.a)(D,2),k=F[0],Y=F[1],L=Object(r.useState)({left:0,top:0,bottom:0,right:0}),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Object(r.useRef)(null),G=Object(r.useRef)(A.objectiveFunctionType),X=Object(r.useRef)(A.selectionMethod),B=Object(r.useRef)(A.searchMethod),K=Object(r.useRef)(A.populationSize),q=Object(r.useRef)(A.maximumGenerations),Q=Object(r.useRef)(A.mutationRate),Z=Object(r.useRef)(null!==(t=A.selectionRate)&&void 0!==t?t:.5),_=Object(r.useRef)(null!==(l=A.crossoverRate)&&void 0!==l?l:.5),te=Object(r.useRef)(A.convergenceThreshold),le=Object(r.useRef)(A.localSearchRadius),ae=Object(r.useRef)(null!==(a=T.minimumTiltAngle)&&void 0!==a?a:-vt),oe=Object(r.useRef)(null!==(o=T.maximumTiltAngle)&&void 0!==o?o:vt),ie=Object(r.useRef)(T.minimumRowsPerRack),re=Object(r.useRef)(T.maximumRowsPerRack),ne=Object(r.useRef)(T.minimumInterRowSpacing),ce=Object(r.useRef)(T.maximumInterRowSpacing),se=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=se.current)||void 0===e||e.focus()}),[]);var de={lng:g},ue=Object(r.useRef)(null!==(i=T.rowAxis)&&void 0!==i?i:ee.leftRight),fe=x?v(x):void 0,he=fe?b(V.SolarPanel,fe.id):void 0,pe=Object(r.useRef)(he&&he.length>0?he[0].pvModelName:null!==(n=T.pvModelName)&&void 0!==n?n:"CS6X-355P-FG"),ye=Object(r.useRef)(he&&he.length>0?he[0].orientation:null!==(c=T.orientation)&&void 0!==c?c:$.landscape),ge=Object(r.useRef)(he&&he.length>0?he[0].poleHeight:null!==(s=T.poleHeight)&&void 0!==s?s:1),we=Object(r.useRef)(he&&he.length>0?he[0].poleSpacing:null!==(d=T.poleSpacing)&&void 0!==d?d:3),xe=Object(r.useRef)(null!==(f=T.margin)&&void 0!==f?f:0),ve=Object(r.useRef)(S.electricitySellingPrice),be=Object(r.useRef)(S.operationalCostPerUnit);Object(r.useEffect)((function(){ve.current=S.electricitySellingPrice}),[S.electricitySellingPrice]),Object(r.useEffect)((function(){be.current=S.operationalCostPerUnit}),[S.operationalCostPerUnit]);var Ae=function(){m||Kh(me.t("message.EvolutionStarted",de)),p((function(e){e.evolutionaryAlgorithmState.geneticAlgorithmParams.problem=M.SOLAR_PANEL_ARRAY,e.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType=G.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod=X.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod=B.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize=K.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations=q.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate=Z.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate=_.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate=Q.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold=te.current,e.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius=le.current,e.solarPanelArrayLayoutConstraints||(e.solarPanelArrayLayoutConstraints=new Iw),e.solarPanelArrayLayoutConstraints.minimumRowsPerRack=ie.current,e.solarPanelArrayLayoutConstraints.maximumRowsPerRack=re.current,e.solarPanelArrayLayoutConstraints.minimumTiltAngle=ae.current,e.solarPanelArrayLayoutConstraints.maximumTiltAngle=oe.current,e.solarPanelArrayLayoutConstraints.minimumInterRowSpacing=ne.current,e.solarPanelArrayLayoutConstraints.maximumInterRowSpacing=ce.current,e.solarPanelArrayLayoutConstraints.poleHeight=ge.current,e.solarPanelArrayLayoutConstraints.poleSpacing=we.current,e.solarPanelArrayLayoutConstraints.pvModelName=pe.current,e.solarPanelArrayLayoutConstraints.rowAxis=ue.current,e.solarPanelArrayLayoutConstraints.orientation=ye.current,e.solarPanelArrayLayoutConstraints.margin=xe.current,e.economicsParams.operationalCostPerUnit=be.current,e.economicsParams.electricitySellingPrice=ve.current})),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!e.runEvolution})),p((function(e){e.evolutionMethod=I.GENETIC_ALGORITHM,y&&(e.actionInfo={name:"Run Genetic Algorithm for Solar Panel Array Layout",timestamp:(new Date).getTime()})}))}),100)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:640,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return Y(!0)},onMouseOut:function(){return Y(!1)},children:me.t("optimizationMenu.SolarPanelArrayLayout",de)+": "+me.t("optimizationMenu.GeneticAlgorithmSettings",de)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){h(!1)},children:me.t("word.Cancel",de)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:se,onClick:function(){Ae(),h(!1)},children:me.t("word.Run",de)},"Run")],onCancel:function(){h(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!k,bounds:U,onStart:function(e,t){return function(e,t){if(J.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=J.current.getBoundingClientRect();N({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:J,children:e})})},children:Object(gf.jsxs)(_S.a,{defaultActiveKey:P,type:"card",onChange:function(e){p((function(t){t.geneticAlgorithmWizardSelectedTab=e}))},children:[Object(gf.jsxs)(tj,{tab:me.t("optimizationMenu.Parameters",de),children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:G.current,style:{width:"100%"},value:G.current,onChange:function(e){G.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:W.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",de)},W.DAILY_TOTAL_OUTPUT),Object(gf.jsx)(ej,{value:W.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",de)},W.YEARLY_TOTAL_OUTPUT),Object(gf.jsx)(ej,{value:W.DAILY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",de)},W.DAILY_AVERAGE_OUTPUT),Object(gf.jsx)(ej,{value:W.YEARLY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",de)},W.YEARLY_AVERAGE_OUTPUT),Object(gf.jsx)(ej,{value:W.DAILY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionDailyProfit",de)},W.DAILY_PROFIT),Object(gf.jsx)(ej,{value:W.YEARLY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",de)},W.YEARLY_PROFIT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.GeneticAlgorithmSelectionMethod",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:X.current,style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:C.ROULETTE_WHEEL,children:me.t("optimizationMenu.RouletteWheel",de)},C.ROULETTE_WHEEL),Object(gf.jsx)(ej,{value:C.TOURNAMENT,children:me.t("optimizationMenu.Tournament",de)},C.TOURNAMENT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.PopulationSize",de)+" [10, 100]:"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:10,max:100,style:{width:"100%"},precision:0,value:K.current,step:1,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){K.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumGenerations",de)+" [5, 100]:"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:5,max:100,step:1,style:{width:"100%"},precision:0,value:q.current,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){q.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SelectionRate",de)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Z.current,step:.01,onChange:function(e){Z.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CrossoverRate",de)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:_.current,step:.01,onChange:function(e){_.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MutationRate",de)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Q.current,step:.01,onChange:function(e){Q.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",de)+" (0, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:te.current,step:.001,onChange:function(e){te.current=e,R(!z)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:B.current,style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:O.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",de)},O.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(gf.jsx)(ej,{value:O.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",de)},O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),B.current===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",de)+" ([0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:le.current,step:.01,onChange:function(e){le.current=e,R(!z)}})})]})]},"1"),Object(gf.jsxs)(tj,{tab:me.t("optimizationMenu.Variables",de),children:[Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.TiltAngleRange",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){ae.current=Tw.toRadians(e[0]),oe.current=Tw.toRadians(e[1]),R(!z)},min:-90,max:90,defaultValue:[Tw.toDegrees(ae.current),Tw.toDegrees(oe.current)],marks:{"-90":{style:{fontSize:"10px"},label:"-90\xb0"},"-45":{style:{fontSize:"10px"},label:"-45\xb0"},0:{style:{fontSize:"10px"},label:"0\xb0"},45:{style:{fontSize:"10px"},label:"45\xb0"},90:{style:{fontSize:"10px"},label:"90\xb0"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.RowsPerRackRange",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){ie.current=e[0],re.current=e[1],R(!z)},min:1,max:9,defaultValue:[ie.current,re.current],marks:{1:{style:{fontSize:"10px"},label:1},2:{style:{fontSize:"10px"},label:2},3:{style:{fontSize:"10px"},label:3},4:{style:{fontSize:"10px"},label:4},5:{style:{fontSize:"10px"},label:5},6:{style:{fontSize:"10px"},label:6},7:{style:{fontSize:"10px"},label:7},8:{style:{fontSize:"10px"},label:8},9:{style:{fontSize:"10px"},label:9}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InterRowSpacingRange",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){ne.current=e[0],ce.current=e[1],R(!z)},min:1,max:10,defaultValue:[ne.current,ce.current],marks:{1:{style:{fontSize:"10px"},label:"1m"},3:{style:{fontSize:"10px"},label:"3m"},5:{style:{fontSize:"10px"},label:"5m"},7:{style:{fontSize:"10px"},label:"7m"},9:{style:{fontSize:"10px"},label:"9m"}}})})]})]},"2"),Object(gf.jsxs)(tj,{tab:me.t("optimizationMenu.Constants",de),children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"0px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayModel",de)+" ("+Object.keys(w).length+" "+me.t("word.Options",de)+"):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(db.a,{defaultValue:"Custom",style:{width:"100%"},value:pe.current,onChange:function(e){pe.current=e,R(!z)},children:Object.keys(w).map((function(e){return Object(gf.jsx)(ej,{value:e,children:e+(w[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",de)+")":"")},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayRowAxis",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:ue.current,onChange:function(e){ue.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",de)},ee.leftRight),Object(gf.jsx)(ej,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",de)},ee.upDown)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayOrientation",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:ye.current,onChange:function(e){ye.current=e,R(!z)},children:[Object(gf.jsx)(ej,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",de)},$.portrait),Object(gf.jsx)(ej,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",de)},$.landscape)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayMargin",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){xe.current=e,R(!z)},min:0,max:5,step:.1,defaultValue:xe.current,marks:{0:{style:{fontSize:"10px"},label:"0m"},1:{style:{fontSize:"10px"},label:"1m"},2:{style:{fontSize:"10px"},label:"2m"},3:{style:{fontSize:"10px"},label:"3m"},4:{style:{fontSize:"10px"},label:"4m"},5:{style:{fontSize:"10px"},label:"5m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("solarCollectorMenu.PoleHeight",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){ge.current=e,R(!z)},min:0,max:10,step:.1,defaultValue:ge.current,marks:{0:{style:{fontSize:"10px"},label:"0m"},2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("solarPanelMenu.PoleSpacing",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){we.current=e,R(!z)},min:2,max:10,step:.1,defaultValue:we.current,marks:{2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.OperationalCostPerUnit",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){be.current=e,R(!z)},min:.1,max:1,step:.01,defaultValue:be.current,marks:{.1:{style:{fontSize:"10px"},label:"10\xa2"},.3:{style:{fontSize:"10px"},label:"30\xa2"},.5:{style:{fontSize:"10px"},label:"50\xa2"},.7:{style:{fontSize:"10px"},label:"70\xa2"},.9:{style:{fontSize:"10px"},label:"90\xa2"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.ElectricitySellingPrice",de)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){ve.current=e,R(!z)},min:.1,max:1,step:.01,defaultValue:ve.current,marks:{.1:{style:{fontSize:"10px"},label:"10\xa2"},.3:{style:{fontSize:"10px"},label:"30\xa2"},.5:{style:{fontSize:"10px"},label:"50\xa2"},.7:{style:{fontSize:"10px"},label:"70\xa2"},.9:{style:{fontSize:"10px"},label:"90\xa2"}}})})]})]},"3")]})})})},aj=n.a.memo(lj),oj=db.a.Option,ij=_S.a.TabPane,rj=function(e){var t,l,a,o,i,n,c,s,d,f,h,p,y=e.setDialogVisible,g=Ew(si),m=Ew(Gi),w=Ew(Vi),x=Tf(Nr),v=Ew(Yi),b=Ew(ln),A=Ew($r),T=Ew(tn),P=Ew(uf).particleSwarmOptimizationParams,S=Ew(ff),j=Ew(pf),H=Ew(rf),z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],C=R[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),Y=k[0],L=k[1],E=Object(r.useState)({left:0,top:0,bottom:0,right:0}),U=Object(u.a)(E,2),N=U[0],J=U[1],G=Object(r.useRef)(null),X=Object(r.useRef)(P.objectiveFunctionType),B=Object(r.useRef)(P.searchMethod),K=Object(r.useRef)(P.swarmSize),q=Object(r.useRef)(P.maximumSteps),Q=Object(r.useRef)(null!==(t=P.vmax)&&void 0!==t?t:.01),Z=Object(r.useRef)(null!==(l=P.inertia)&&void 0!==l?l:.8),_=Object(r.useRef)(null!==(a=P.cognitiveCoefficient)&&void 0!==a?a:.1),te=Object(r.useRef)(null!==(o=P.socialCoefficient)&&void 0!==o?o:.1),le=Object(r.useRef)(P.convergenceThreshold),ae=Object(r.useRef)(P.localSearchRadius),oe=Object(r.useRef)(null!==(i=S.minimumTiltAngle)&&void 0!==i?i:-vt),ie=Object(r.useRef)(null!==(n=S.maximumTiltAngle)&&void 0!==n?n:vt),re=Object(r.useRef)(S.minimumRowsPerRack),ne=Object(r.useRef)(S.maximumRowsPerRack),ce=Object(r.useRef)(S.minimumInterRowSpacing),se=Object(r.useRef)(S.maximumInterRowSpacing),de=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=de.current)||void 0===e||e.focus()}),[]);var ue={lng:w},fe=Object(r.useRef)(null!==(c=S.rowAxis)&&void 0!==c?c:ee.leftRight),he=b?A(b):void 0,pe=he?T(V.SolarPanel,he.id):void 0,ye=Object(r.useRef)(pe&&pe.length>0?pe[0].pvModelName:null!==(s=S.pvModelName)&&void 0!==s?s:"CS6X-355P-FG"),ge=Object(r.useRef)(pe&&pe.length>0?pe[0].orientation:null!==(d=S.orientation)&&void 0!==d?d:$.landscape),we=Object(r.useRef)(pe&&pe.length>0?pe[0].poleHeight:null!==(f=S.poleHeight)&&void 0!==f?f:1),xe=Object(r.useRef)(pe&&pe.length>0?pe[0].poleSpacing:null!==(h=S.poleSpacing)&&void 0!==h?h:3),ve=Object(r.useRef)(null!==(p=S.margin)&&void 0!==p?p:0),be=Object(r.useRef)(H.electricitySellingPrice),Ae=Object(r.useRef)(H.operationalCostPerUnit);Object(r.useEffect)((function(){be.current=H.electricitySellingPrice}),[H.electricitySellingPrice]),Object(r.useEffect)((function(){Ae.current=H.operationalCostPerUnit}),[H.operationalCostPerUnit]);var Te=function(){x||Kh(me.t("message.EvolutionStarted",ue)),g((function(e){e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem=M.SOLAR_PANEL_ARRAY,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType=X.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod=B.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize=K.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps=q.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient=_.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient=te.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.vmax=Q.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.inertia=Z.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.convergenceThreshold=le.current,e.evolutionaryAlgorithmState.particleSwarmOptimizationParams.localSearchRadius=ae.current,e.solarPanelArrayLayoutConstraints||(e.solarPanelArrayLayoutConstraints=new Iw),e.solarPanelArrayLayoutConstraints.minimumRowsPerRack=re.current,e.solarPanelArrayLayoutConstraints.maximumRowsPerRack=ne.current,e.solarPanelArrayLayoutConstraints.minimumTiltAngle=oe.current,e.solarPanelArrayLayoutConstraints.maximumTiltAngle=ie.current,e.solarPanelArrayLayoutConstraints.minimumInterRowSpacing=ce.current,e.solarPanelArrayLayoutConstraints.maximumInterRowSpacing=se.current,e.solarPanelArrayLayoutConstraints.poleHeight=we.current,e.solarPanelArrayLayoutConstraints.poleSpacing=xe.current,e.solarPanelArrayLayoutConstraints.pvModelName=ye.current,e.solarPanelArrayLayoutConstraints.rowAxis=fe.current,e.solarPanelArrayLayoutConstraints.orientation=ge.current,e.solarPanelArrayLayoutConstraints.margin=ve.current,e.economicsParams.operationalCostPerUnit=Ae.current,e.economicsParams.electricitySellingPrice=be.current})),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!e.runEvolution})),g((function(e){e.evolutionMethod=I.PARTICLE_SWARM_OPTIMIZATION,m&&(e.actionInfo={name:"Run Particle Swarm Optimization for Solar Panel Array Layout",timestamp:(new Date).getTime()})}))}),100)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:640,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return L(!0)},onMouseOut:function(){return L(!1)},children:me.t("optimizationMenu.SolarPanelArrayLayout",ue)+": "+me.t("optimizationMenu.ParticleSwarmOptimizationSettings",ue)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){y(!1)},children:me.t("word.Cancel",ue)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:de,onClick:function(){Te(),y(!1)},children:me.t("word.Run",ue)},"Run")],onCancel:function(){y(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!Y,bounds:N,onStart:function(e,t){return function(e,t){if(G.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=G.current.getBoundingClientRect();J({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:G,children:e})})},children:Object(gf.jsxs)(_S.a,{defaultActiveKey:j,type:"card",onChange:function(e){g((function(t){t.particleSwarmOptimizationWizardSelectedTab=e}))},children:[Object(gf.jsxs)(ij,{tab:me.t("optimizationMenu.Parameters",ue),children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.Objective",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:X.current,style:{width:"100%"},value:X.current,onChange:function(e){X.current=e,C(!D)},children:[Object(gf.jsx)(oj,{value:W.DAILY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",ue)},W.DAILY_TOTAL_OUTPUT),Object(gf.jsx)(oj,{value:W.YEARLY_TOTAL_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",ue)},W.YEARLY_TOTAL_OUTPUT),Object(gf.jsx)(oj,{value:W.DAILY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",ue)},W.DAILY_AVERAGE_OUTPUT),Object(gf.jsx)(oj,{value:W.YEARLY_AVERAGE_OUTPUT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",ue)},W.YEARLY_AVERAGE_OUTPUT),Object(gf.jsx)(oj,{value:W.DAILY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionDailyProfit",ue)},W.DAILY_PROFIT),Object(gf.jsx)(oj,{value:W.YEARLY_PROFIT,children:me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",ue)},W.YEARLY_PROFIT)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SwarmSize",ue)+" [10, 100]:"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:10,max:100,style:{width:"100%"},precision:0,value:K.current,step:1,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){K.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumSteps",ue)+" [5, 100]:"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:5,max:100,step:1,style:{width:"100%"},precision:0,value:q.current,formatter:function(e){return Number(e).toFixed(0)},onChange:function(e){q.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.CognitiveCoefficient",ue)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:_.current,step:.01,onChange:function(e){_.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SocialCoefficient",ue)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:te.current,step:.01,onChange:function(e){te.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InertiaWeight",ue)+" [0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:Z.current,step:.01,onChange:function(e){Z.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.MaximumVelocity",ue)+" [0.001, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:Q.current,step:.001,onChange:function(e){Q.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.ConvergenceThreshold",ue)+" (0, 0.1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:.001,max:.1,style:{width:"100%"},precision:3,value:le.current,step:.001,onChange:function(e){le.current=e,C(!D)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.SearchMethod",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{defaultValue:B.current,style:{width:"100%"},value:B.current,onChange:function(e){B.current=e,C(!D)},children:[Object(gf.jsx)(oj,{value:O.GLOBAL_SEARCH_UNIFORM_SELECTION,children:me.t("optimizationMenu.GlobalSearchUniformSelection",ue)},O.GLOBAL_SEARCH_UNIFORM_SELECTION),Object(gf.jsx)(oj,{value:O.LOCAL_SEARCH_RANDOM_OPTIMIZATION,children:me.t("optimizationMenu.LocalSearchRandomOptimization",ue)},O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)]})})]}),B.current===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION&&Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.LocalSearchRadius",ue)+" ([0, 1]: "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($v.a,{min:0,max:1,style:{width:"100%"},precision:2,value:ae.current,step:.01,onChange:function(e){ae.current=e,C(!D)}})})]})]},"1"),Object(gf.jsxs)(ij,{tab:me.t("optimizationMenu.Variables",ue),children:[Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.TiltAngleRange",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){oe.current=Tw.toRadians(e[0]),ie.current=Tw.toRadians(e[1]),C(!D)},min:-90,max:90,defaultValue:[Tw.toDegrees(oe.current),Tw.toDegrees(ie.current)],marks:{"-90":{style:{fontSize:"10px"},label:"-90\xb0"},"-45":{style:{fontSize:"10px"},label:"-45\xb0"},0:{style:{fontSize:"10px"},label:"0\xb0"},45:{style:{fontSize:"10px"},label:"45\xb0"},90:{style:{fontSize:"10px"},label:"90\xb0"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.RowsPerRackRange",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){re.current=e[0],ne.current=e[1],C(!D)},min:1,max:9,defaultValue:[re.current,ne.current],marks:{1:{style:{fontSize:"10px"},label:1},2:{style:{fontSize:"10px"},label:2},3:{style:{fontSize:"10px"},label:3},4:{style:{fontSize:"10px"},label:4},5:{style:{fontSize:"10px"},label:5},6:{style:{fontSize:"10px"},label:6},7:{style:{fontSize:"10px"},label:7},8:{style:{fontSize:"10px"},label:8},9:{style:{fontSize:"10px"},label:9}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("optimizationMenu.InterRowSpacingRange",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{range:!0,onChange:function(e){ce.current=e[0],se.current=e[1],C(!D)},min:2,max:10,defaultValue:[ce.current,se.current],marks:{2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]})]},"2"),Object(gf.jsxs)(ij,{tab:me.t("optimizationMenu.Constants",ue),children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"0px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayModel",ue)+" ("+Object.keys(v).length+" "+me.t("word.Options",ue)+"):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)(db.a,{defaultValue:"Custom",style:{width:"100%"},value:ye.current,onChange:function(e){ye.current=e,C(!D)},children:Object.keys(v).map((function(e){return Object(gf.jsx)(oj,{value:e,children:e+(v[e].bifacialityFactor>0?" ("+me.t("pvModelPanel.Bifacial",ue)+")":"")},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayRowAxis",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:fe.current,onChange:function(e){fe.current=e,C(!D)},children:[Object(gf.jsx)(oj,{value:ee.leftRight,children:me.t("polygonMenu.SolarPanelArrayLeftRightRowAxis",ue)},ee.leftRight),Object(gf.jsx)(oj,{value:ee.upDown,children:me.t("polygonMenu.SolarPanelArrayUpDownRowAxis",ue)},ee.upDown)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"6px",paddingTop:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayOrientation",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:ge.current,onChange:function(e){ge.current=e,C(!D)},children:[Object(gf.jsx)(oj,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",ue)},$.portrait),Object(gf.jsx)(oj,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",ue)},$.landscape)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("polygonMenu.SolarPanelArrayMargin",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){ve.current=e,C(!D)},min:0,max:5,step:.1,defaultValue:ve.current,marks:{0:{style:{fontSize:"10px"},label:"0m"},1:{style:{fontSize:"10px"},label:"1m"},2:{style:{fontSize:"10px"},label:"2m"},3:{style:{fontSize:"10px"},label:"3m"},4:{style:{fontSize:"10px"},label:"4m"},5:{style:{fontSize:"10px"},label:"5m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("solarCollectorMenu.PoleHeight",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){we.current=e,C(!D)},min:0,max:10,step:.1,defaultValue:we.current,marks:{0:{style:{fontSize:"10px"},label:"0m"},2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("solarPanelMenu.PoleSpacing",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){xe.current=e,C(!D)},min:2,max:10,step:.1,defaultValue:xe.current,marks:{2:{style:{fontSize:"10px"},label:"2m"},4:{style:{fontSize:"10px"},label:"4m"},6:{style:{fontSize:"10px"},label:"6m"},8:{style:{fontSize:"10px"},label:"8m"},10:{style:{fontSize:"10px"},label:"10m"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.OperationalCostPerUnit",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){Ae.current=e,C(!D)},min:.1,max:1,step:.01,defaultValue:Ae.current,marks:{.1:{style:{fontSize:"10px"},label:"10\xa2"},.3:{style:{fontSize:"10px"},label:"30\xa2"},.5:{style:{fontSize:"10px"},label:"50\xa2"},.7:{style:{fontSize:"10px"},label:"70\xa2"},.9:{style:{fontSize:"10px"},label:"90\xa2"}}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"0px",paddingTop:"12px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:me.t("economicsPanel.ElectricitySellingPrice",ue)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:12,children:Object(gf.jsx)($S.a,{style:{paddingBottom:0,paddingTop:0,marginTop:"16px",marginBottom:"16px"},onChange:function(e){be.current=e,C(!D)},min:.1,max:1,step:.01,defaultValue:be.current,marks:{.1:{style:{fontSize:"10px"},label:"10\xa2"},.3:{style:{fontSize:"10px"},label:"30\xa2"},.5:{style:{fontSize:"10px"},label:"50\xa2"},.7:{style:{fontSize:"10px"},label:"70\xa2"},.9:{style:{fontSize:"10px"},label:"90\xa2"}}})})]})]},"3")]})})})},nj=n.a.memo(rj),cj=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Sr),o=Ew(Xn),i=Ew(Bn),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Polygon),p=Object(r.useState)(void 0!==(null===h||void 0===h?void 0:h.opacity)?h.opacity:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.opacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(o){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Polygon&&e!==i.opacity&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(m){a.e(m)}finally{a.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Polygon&&e!==c.opacity&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(l);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Polygon&&u.foundationId===h.foundationId&&e!==u.opacity&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.AllObjectsOfThisTypeOnSurface:var p,y=Object(f.a)(l);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Polygon&&g.parentId===h.parentId&&Tw.isIdentical(g.normal,h.normal)&&e!==g.opacity&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.opacity))return!0}return!1}}(e))switch(o){case _.AllSelectedObjectsOfThisType:var t,i=new Map,r=Object(f.a)(l);try{for(r.s();!(t=r.n()).done;){var d=t.value;if(d.type===V.Polygon&&!d.locked&&Ew.getState().selectedElementIdSet.has(d.id)){var u=d;i.set(d.id,u.opacity),x(u.id,e)}}}catch(L){r.e(L)}finally{r.f()}var p={name:"Set Opacity for Selected Polygons",timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){v(p.oldValues)},redo:function(){b(p.oldValues,p.newValue)}};a(p),c(n+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(l);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(w.type===V.Polygon&&!w.locked){var A=w;g.set(w.id,A.opacity),x(A.id,e)}}}catch(L){m.e(L)}finally{m.f()}var T={name:"Set Opacity for All Polygons",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};a(T),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var P,S=new Map,j=Object(f.a)(l);try{for(j.s();!(P=j.n()).done;){var H=P.value;if(H.type===V.Polygon&&H.foundationId===h.foundationId&&!H.locked){var z=H;S.set(H.id,z.opacity),x(z.id,e)}}}catch(L){j.e(L)}finally{j.f()}var R={name:"Set Opacity for All Polygons Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:h.foundationId,undo:function(){v(R.oldValues)},redo:function(){b(R.oldValues,R.newValue)}};a(R),c(n+1)}break;case _.AllObjectsOfThisTypeOnSurface:if(h.parentId){var D,M=new Map,W=Object(f.a)(l);try{for(W.s();!(D=W.n()).done;){var I=D.value;if(I.type===V.Polygon&&I.parentId===h.parentId&&Tw.isIdentical(I.normal,h.normal)&&!I.locked){var C=I;M.set(I.id,C.opacity),x(C.id,e)}}}catch(L){W.e(L)}finally{W.f()}var O={name:"Set Opacity for All Polygons Above Foundation",timestamp:Date.now(),oldValues:M,newValue:e,groupId:h.foundationId,undo:function(){v(O.oldValues)},redo:function(){b(O.oldValues,O.newValue)}};a(O),c(n+1)}break;default:if(h){var F=s(h.id),k=void 0!==F.opacity?F.opacity:void 0!==h.opacity?h.opacity:1,Y={name:"Set Polygon Opacity",timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(Y.changedElementId,Y.oldValue)},redo:function(){x(Y.changedElementId,Y.newValue)}};a(Y),x(h.id,e),c(n+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("polygonMenu.Opacity",w),onApply:function(){A(g)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.1,precision:1,value:g,formatter:function(e){return Number(e).toFixed(1)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return i(e.target.value)},value:o,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("polygonMenu.OnlyThisPolygon",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("polygonMenu.AllPolygonsOnSurface",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("polygonMenu.AllPolygonsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("polygonMenu.AllSelectedPolygons",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("polygonMenu.AllPolygons",w)})]})})})]})})},sj=n.a.memo((function(){var e,t,l,a,o,i,n,c,s=Ew(si),d=Ew(Vi),h=Ew(Sr),p=Ew(os),y=Ew(Ci),g=OP(V.Polygon),m=Object(r.useState)(null!==(e=null===g||void 0===g?void 0:g.text)&&void 0!==e?e:""),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(null!==(t=null===g||void 0===g?void 0:g.fontSize)&&void 0!==t?t:1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(null!==(l=null===g||void 0===g?void 0:g.fontColor)&&void 0!==l?l:"black"),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(null!==(a=null===g||void 0===g?void 0:g.fontOutlineColor)&&void 0!==a?a:"white"),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(null!==(o=null===g||void 0===g?void 0:g.fontOutlineWidth)&&void 0!==o?o:0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useState)(null!==(i=null===g||void 0===g?void 0:g.fontStrokeColor)&&void 0!==i?i:"black"),Y=Object(u.a)(k,2),L=Y[0],E=Y[1],U=Object(r.useState)(null!==(n=null===g||void 0===g?void 0:g.fontStrokeWidth)&&void 0!==n?n:0),N=Object(u.a)(U,2),J=N[0],G=N[1],X=Object(r.useState)(!1),B=Object(u.a)(X,2),K=B[0],q=B[1],Q=Object(r.useState)(!1),Z=Object(u.a)(Q,2),_=Z[0],$=Z[1],ee=Object(r.useState)(!1),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useState)(!1),ie=Object(u.a)(oe,2),re=ie[0],ne=ie[1],se=Object(r.useState)(!1),de=Object(u.a)(se,2),ue=de[0],fe=de[1],he=Object(r.useState)(!1),pe=Object(u.a)(he,2),ye=pe[0],ge=pe[1],we=Object(r.useState)(!1),xe=Object(u.a)(we,2),ve=xe[0],be=xe[1],Ae=Object(r.useState)(!1),Te=Object(u.a)(Ae,2),Pe=Te[0],Se=Te[1],je=Object(r.useState)(!1),He=Object(u.a)(je,2),ze=He[0],Re=He[1],De={lng:d},Me=Ew((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===(null===g||void 0===g?void 0:g.parentId))return a}}catch(o){l.e(o)}finally{l.f()}}));if(Object(r.useEffect)((function(){var e,t,l,a,o,i,r;g&&(v(null!==(e=g.text)&&void 0!==e?e:""),P(null!==(t=g.fontSize)&&void 0!==t?t:1),z(null!==(l=g.fontColor)&&void 0!==l?l:"black"),W(null!==(a=g.fontOutlineColor)&&void 0!==a?a:"white"),F(null!==(o=g.fontOutlineWidth)&&void 0!==o?o:0),E(null!==(i=g.fontStrokeColor)&&void 0!==i?i:"black"),G(null!==(r=g.fontStrokeWidth)&&void 0!==r?r:0))}),[g]),!g||!Me)return null;var We=!(null===g||void 0===g?void 0:g.locked),Ie=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.filled=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Ce=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.noOutline=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Oe=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===e){i.shininess=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},Fe=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.text=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},ke=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontSize=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ye=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Le=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontOutlineWidth=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ee=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontOutlineColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ue=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontStrokeWidth=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ne=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Polygon||(i.fontStrokeColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},Ve=function(){if(g){var e,t={name:"Set Text for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.text)&&void 0!==e?e:"",newValue:x,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Fe(g.id,t.oldValue)},redo:function(){Fe(g.id,t.newValue)}};h(t),Fe(g.id,x)}},Je=function(){if(g){var e,t={name:"Set Font Size for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontSize)&&void 0!==e?e:1,newValue:T,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){ke(g.id,t.oldValue)},redo:function(){ke(g.id,t.newValue)}};h(t),ke(g.id,T)}},Ge=function(){if(g){var e,t={name:"Set Font Color for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontColor)&&void 0!==e?e:"black",newValue:H,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ye(g.id,t.oldValue)},redo:function(){Ye(g.id,t.newValue)}};h(t),Ye(g.id,H)}},Xe=function(){if(g){var e,t={name:"Set Font Outline Width for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontOutlineWidth)&&void 0!==e?e:0,newValue:O,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Le(g.id,t.oldValue)},redo:function(){Le(g.id,t.newValue)}};h(t),Le(g.id,O)}},Be=function(){if(g){var e,t={name:"Set Font Outline Color for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontOutlineColor)&&void 0!==e?e:"white",newValue:M,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ee(g.id,t.oldValue)},redo:function(){Ee(g.id,t.newValue)}};h(t),Ee(g.id,M)}},Ke=function(){if(g){var e,t={name:"Set Font Stroke Width for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontStrokeWidth)&&void 0!==e?e:0,newValue:J,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ue(g.id,t.oldValue)},redo:function(){Ue(g.id,t.newValue)}};h(t),Ue(g.id,J)}},qe=function(){if(g){var e,t={name:"Set Font Stroke Color for Polygon",timestamp:Date.now(),oldValue:null!==(e=g.fontStrokeColor)&&void 0!==e?e:"black",newValue:L,changedElementId:g.id,changedElementType:V.Polygon,undo:function(){Ne(g.id,t.oldValue)},redo:function(){Ne(g.id,t.newValue)}};h(t),Ne(g.id,L)}};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){if(p&&p.length>0){var e=p[0];if(e.type===V.Human||e.type===V.Tree||e.type===V.Polygon||e.type===V.Sensor||e.type===V.SolarPanel)return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"polygon-paste"}),Object(gf.jsx)(TP,{keyName:"polygon-copy"}),We&&Object(gf.jsx)(PP,{keyName:"polygon-cut"}),((null===Me||void 0===Me?void 0:Me.type)===V.Foundation||(null===Me||void 0===Me?void 0:Me.type)===V.Cuboid)&&Object(gf.jsxs)(HP.a,{title:me.t("polygonMenu.Layout",De),style:{paddingLeft:"24px"},children:[ve&&Object(gf.jsx)(qS,{setDialogVisible:be}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){y(0),be(!0)},style:{paddingLeft:"36px"},children:[me.t("polygonMenu.SolarPanelArrayLayoutParametricDesign",De)," ..."]},"solar-panel-layout"),Object(gf.jsxs)(HP.a,{title:me.t("polygonMenu.SolarPanelArrayLayoutGenerativeDesign",De),style:{paddingLeft:"24px"},children:[Pe&&Object(gf.jsx)(aj,{setDialogVisible:Se}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){y(0),Se(!0)},style:{paddingLeft:"36px"},children:[me.t("optimizationMenu.GeneticAlgorithm",De)," ..."]},"solar-panel-layout-ga"),ze&&Object(gf.jsx)(nj,{setDialogVisible:Re}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){y(0),Re(!0)},style:{paddingLeft:"36px"},children:[me.t("optimizationMenu.ParticleSwarmOptimization",De)," ..."]},"solar-panel-layout-pso")]},"solar-panel-layout-ai")]},"layout"),Object(gf.jsx)(SP,{keyName:"polygon-lock"}),We&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===g||void 0===g?void 0:g.filled),onChange:function(e){if(g){var t={name:"Fill Polygon",timestamp:Date.now(),checked:!g.filled,selectedElementId:g.id,selectedElementType:V.Polygon,undo:function(){Ie(g.id,!t.checked)},redo:function(){Ie(g.id,t.checked)}};h(t),Ie(g.id,e.target.checked)}},children:me.t("polygonMenu.Filled",De)})},"polygon-filled"),We&&g.filled&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:(null!==(c=null===g||void 0===g?void 0:g.shininess)&&void 0!==c?c:0)>0,onChange:function(e){if(g){var t,l={name:"Shiny Polygon",timestamp:Date.now(),checked:(null!==(t=null===g||void 0===g?void 0:g.shininess)&&void 0!==t?t:0)>0,selectedElementId:g.id,selectedElementType:V.Polygon,undo:function(){Oe(g.id,l.checked?0:100)},redo:function(){Oe(g.id,l.checked?100:0)}};h(l),Oe(g.id,e.target.checked?100:0)}},children:me.t("polygonMenu.Shiny",De)})},"polygon-shiny"),We&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===g||void 0===g?void 0:g.noOutline),onChange:function(e){if(g){var t={name:"No Outline for Polygon",timestamp:Date.now(),checked:!g.noOutline,selectedElementId:g.id,selectedElementType:V.Polygon,undo:function(){Ce(g.id,!t.checked)},redo:function(){Ce(g.id,t.checked)}};h(t),Ce(g.id,e.target.checked)}},children:me.t("polygonMenu.NoOutline",De)})},"polygon-no-outline"),We&&Object(gf.jsxs)(gf.Fragment,{children:[K&&Object(gf.jsx)(US,{setDialogVisible:q}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),q(!0)},children:[me.t("polygonMenu.LineColor",De)," ..."]},"polygon-line-color"),_&&Object(gf.jsx)(QS,{setDialogVisible:$}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),$(!0)},children:[me.t("polygonMenu.LineStyle",De)," ..."]},"polygon-line-style"),le&&Object(gf.jsx)(ZS,{setDialogVisible:ae}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ae(!0)},children:[me.t("polygonMenu.LineWidth",De)," ..."]},"polygon-line-width")]}),We&&g.filled&&(!g.textureType||g.textureType===ce.NoTexture)&&Object(gf.jsxs)(gf.Fragment,{children:[re&&Object(gf.jsx)(NS,{setDialogVisible:ne}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ne(!0)},children:[me.t("polygonMenu.FillColor",De)," ..."]},"polygon-fill-color")]}),We&&g.filled&&Object(gf.jsxs)(gf.Fragment,{children:[ue&&Object(gf.jsx)(GS,{setDialogVisible:fe}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),fe(!0)},children:[me.t("polygonMenu.FillTexture",De)," ..."]},"polygon-texture")]}),We&&g.filled&&Object(gf.jsxs)(gf.Fragment,{children:[ye&&Object(gf.jsx)(cj,{setDialogVisible:ge}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){y(0),ge(!0)},children:[me.t("polygonMenu.Opacity",De)," ..."]},"polygon-opacity")]}),We&&Object(gf.jsx)(HP.a,{title:me.t("polygonMenu.TextBox",De),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:10},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("word.Text",De)+":",value:x,onChange:function(e){return v(e.target.value)},onPressEnter:Ve,onBlur:Ve})},"polygon-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("word.FontSize",De)+":",min:.1,max:5,step:.01,precision:2,value:T,onChange:function(e){return P(e)},onPressEnter:Je,onBlur:Je})},"polygon-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("word.FontColor",De)+":",value:H,onChange:function(e){return z(e.target.value)},onPressEnter:Ge,onBlur:Ge})},"polygon-font-color"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("polygonMenu.FontOutlineColor",De)+":",value:M,onChange:function(e){return W(e.target.value)},onPressEnter:Be,onBlur:Be})},"polygon-font-outline-color"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("polygonMenu.FontOutlineWidth",De)+":",min:0,max:1,step:.01,precision:2,value:O,onChange:function(e){return F(e)},onPressEnter:Xe,onBlur:Xe})},"polygon-font-outline-width"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("polygonMenu.FontStrokeColor",De)+":",value:L,onChange:function(e){return E(e.target.value)},onPressEnter:qe,onBlur:qe})},"polygon-font-stroke-color"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("polygonMenu.FontStrokeWidth",De)+":",min:0,max:1,step:.01,precision:2,value:J,onChange:function(e){return G(e)},onPressEnter:Ke,onBlur:Ke})},"polygon-font-stroke-width")]})},"polygon-text-box")]})})),dj=n.a.memo((function(){var e=Ew(si),t=Ew(Vi),l=OP(V.Polygon),a=Ew(qn),o=Ew(Sr);if(!l||l.selectedIndex<0)return null;var i={lng:t},r=function(t){if(l&&l.selectedIndex>=0){var i=l.vertices.map((function(e){return Object(d.a)({},e)}));switch(t){case Q.Delete:c=l.id,s=l.selectedIndex,e((function(e){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Polygon&&a.id===c){a.vertices.splice(s,1);break}}}catch(o){l.e(o)}finally{l.f()}}));break;case Q.InsertBeforeIndex:!function(t,l){e((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Polygon&&i.id===t){var r=i,n=r.vertices.length;if(l>0&&l=0&&l3&&Object(gf.jsx)(Qv.a.Item,{onClick:function(){r(Q.Delete)},children:me.t("polygonMenu.DeleteVertex",i)},"polygon-vertex-delete")]})})),uj=n.a.memo((function(){var e=Ew(Vi),t=OP(V.Sensor),l=zP(t),a=l.labelText,o=l.setLabelText,i=RP(t),r=DP(t,a);if(!t)return null;var n={lng:e};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"sensor-copy"}),Object(gf.jsx)(PP,{keyName:"sensor-cut"}),Object(gf.jsx)(SP,{keyName:"sensor-lock"}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===t||void 0===t?void 0:t.showLabel),onChange:i,children:me.t("labelSubMenu.KeepShowingLabel",n)})},"sensor-show-label"),Object(gf.jsx)(Qv.a,{children:Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",n)+":",value:a,onChange:function(e){return o(e.target.value)},onPressEnter:r,onBlur:r})},"sensor-label-text")})]})})),fj=n.a.memo((function(){var e,t,l,a=Ew(si),o=Ew(Vi),i=Ew(Sr),n=Ew($r),c=Ew(Xc),s=OP(V.Light),d=Object(r.useState)(null!==(e=null===s||void 0===s?void 0:s.intensity)&&void 0!==e?e:3),h=Object(u.a)(d,2),p=h[0],y=h[1],g=Object(r.useState)(null!==(t=null===s||void 0===s?void 0:s.distance)&&void 0!==t?t:5),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useState)(null!==(l=null===s||void 0===s?void 0:s.color)&&void 0!==l?l:"#ffff99"),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useState)(!!(null===s||void 0===s?void 0:s.inside)),S=Object(u.a)(P,2),j=S[0],H=S[1];if(!s)return null;var z={lng:o},R=s.parentId?n(s):void 0,D=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Light&&i.id===e){i.color=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},M=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Light&&i.id===e){i.intensity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},W=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Light&&i.id===e){i.distance=t;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"light-copy"}),Object(gf.jsx)(PP,{keyName:"light-cut"}),Object(gf.jsx)(SP,{keyName:"light-lock"}),R&&(R.type===V.Roof||R.type===V.Wall)&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:j,onChange:function(e){if(s){var t=e.target.checked,l={name:"Inside Light",timestamp:Date.now(),checked:t,undo:function(){c(s.id,!l.checked)},redo:function(){c(s.id,l.checked)}};i(l),c(s.id,t),H(t)}},children:me.t("lightMenu.Inside",z)})},"light-inside"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"80px"},children:[me.t("lightMenu.Intensity",z),":"]}),Object(gf.jsx)($v.a,{min:.1,max:10,step:.1,precision:1,value:p,onChange:function(e){return function(e){if(s&&e&&e!==p){var t={name:"Set Light Intensity",timestamp:Date.now(),oldValue:p,newValue:e,changedElementId:s.id,undo:function(){M(t.changedElementId,t.oldValue)},redo:function(){M(t.changedElementId,t.newValue)}};i(t),M(s.id,e),y(e),a((function(t){t.actionState.lightIntensity=e}))}}(e)}})]},"light-intensity"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"80px"},children:[me.t("lightMenu.MaximumDistance",z),":"]}),Object(gf.jsx)($v.a,{min:1,max:10,step:1,precision:1,value:w,onChange:function(e){return function(e){if(s&&e&&e!==w){var t={name:"Set Light Distance",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:s.id,undo:function(){W(t.changedElementId,t.oldValue)},redo:function(){W(t.changedElementId,t.newValue)}};i(t),W(s.id,e),x(e),a((function(t){t.actionState.lightDistance=e}))}}(e)}})]},"light-distance")]}),Object(gf.jsx)(HP.a,{title:me.t("word.Color",{lng:o}),style:{paddingLeft:"24px"},children:Object(gf.jsx)(YP.a,{color:A,onChangeComplete:function(e){if(s){var t=s.color,l=e.hex,o={name:"Set Light Color",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){D(s.id,o.oldValue)},redo:function(){D(s.id,o.newValue)}};i(o),D(s.id,l),T(l),a((function(e){e.actionState.lightColor=l}))}}})},"light-color")]})})),hj=function(){var e,t,l,a,n,c,s,d,u=Ew(si),f=Ew(Vi),h=Ew(Sr),p=Ew.getState().world,y=Ew(o.axes),g=Ew(o.theme),m=null===(e=Ew(o.showAzimuthAngle))||void 0===e||e,w=null===(t=Ew(o.showElevationAngle))||void 0===t||t,x=null===(l=Ew(o.showZenithAngle))||void 0===l||l,v=null!==(a=Ew(o.directLightIntensity))&&void 0!==a?a:1,b=null!==(n=Ew(o.ambientLightIntensity))&&void 0!==n?n:.1,A=null!==(c=Ew(i.airAttenuationCoefficient))&&void 0!==c?c:.01,T=null!==(s=Ew(i.airConvectiveCoefficient))&&void 0!==s?s:5,P=null!==(d=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==d?d:900,S={lng:f},j=Object(r.useMemo)((function(){return Ty(new Date(p.date),p.latitude)}),[p.date,p.latitude]),H={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},z=function(e){u((function(t){t.viewState.axes=e}))},R=function(e){u((function(t){t.viewState.theme=e}))},D=function(e){u((function(t){t.viewState.showAzimuthAngle=e}))},M=function(e){u((function(t){t.viewState.showElevationAngle=e}))},W=function(e){u((function(t){t.viewState.showZenithAngle=e}))},I=function(e){u((function(t){t.viewState.directLightIntensity=e}))},C=function(e){u((function(t){t.viewState.ambientLightIntensity=e}))},O=function(e){u((function(t){t.world.airAttenuationCoefficient=e}))},F=function(e){u((function(t){t.world.airConvectiveCoefficient=e}))},k=function(e){u((function(t){t.world.highestTemperatureTimeInMinutes=e}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:y,onChange:function(e){var t=e.target.checked,l={name:"Show Axes",timestamp:Date.now(),checked:t,undo:function(){z(!l.checked)},redo:function(){z(l.checked)}};h(l),z(t)},children:me.t("skyMenu.Axes",S)})},"axes"),Object(gf.jsx)(HP.a,{title:me.t("skyMenu.Theme",S),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(tb.a.Group,{value:g,style:{height:"135px"},onChange:function(e){var t=g,l=e.target.value,a={name:"Select Theme",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){R(a.oldValue)},redo:function(){R(a.newValue)}};h(a),R(l)},children:[Object(gf.jsx)(tb.a,{style:H,value:E.Default,children:me.t("skyMenu.ThemeDefault",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Desert,children:me.t("skyMenu.ThemeDesert",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Dune,children:me.t("skyMenu.ThemeDune",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Forest,children:me.t("skyMenu.ThemeForest",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Grassland,children:me.t("skyMenu.ThemeGrassland",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Hill,children:me.t("skyMenu.ThemeHill",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Lake,children:me.t("skyMenu.ThemeLake",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Mountain,children:me.t("skyMenu.ThemeMountain",S)}),Object(gf.jsx)(tb.a,{style:H,value:E.Rural,children:me.t("skyMenu.ThemeRural",S)})]})},"theme"),Object(gf.jsx)(HP.a,{title:me.t("skyMenu.SelectSunAnglesToShow",S),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:m,onChange:function(e){var t=m,l=e.target.checked,a={name:"Show Azimuth Angle "+l,timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){D(a.oldValue)},redo:function(){D(a.newValue)}};h(a),D(l)},children:me.t("skyMenu.ShowAzimuthAngle",S)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:w,onChange:function(e){var t=w,l=e.target.checked,a={name:"Show Elevation Angle "+l,timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){M(a.oldValue)},redo:function(){M(a.newValue)}};h(a),M(l)},children:me.t("skyMenu.ShowElevationAngle",S)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:x,onChange:function(e){var t=x,l=e.target.checked,a={name:"Show Zenith Angle "+l,timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){W(a.oldValue)},redo:function(){W(a.newValue)}};h(a),W(l)},children:me.t("skyMenu.ShowZenithAngle",S)})})]})},"sun-angles"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.DirectLightBrightnessAtNoon",S)+" [0.1-5]:"}),Object(gf.jsx)($v.a,{min:.1,max:5,step:.1,precision:2,value:v,onChange:function(e){if(e){var t=v,l=e,a={name:"Set Direct Light Intensity",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){I(a.oldValue)},redo:function(){I(a.newValue)}};h(a),I(l)}}})]},"direct-light-intensity"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.AmbientLightBrightnessAtNoon",S)+" [0.01-1]:"}),Object(gf.jsx)($v.a,{min:.01,max:1,step:.01,precision:2,value:b,onChange:function(e){if(e){var t=b,l=e,a={name:"Set Ambient Light Intensity",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){C(a.oldValue)},redo:function(){C(a.newValue)}};h(a),C(l)}}})]},"ambient-light-intensity"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.SunlightAttenuationCoefficientInAir",S)+":"}),Object(gf.jsx)($v.a,{min:0,max:.1,step:.001,precision:3,value:A,onChange:function(e){if(e){var t=A,l=e,a={name:"Set Sunlight Attenuation Coefficient of Air",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){O(a.oldValue)},redo:function(){O(a.newValue)}};h(a),O(l)}}})]},"air-attenuation-coefficient"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.ConvectiveCoefficientOfAir",S)+" [W/(m\xb2\xd7K)]:"}),Object(gf.jsx)($v.a,{min:2.5,max:20,step:.1,precision:2,value:T,onChange:function(e){if(e){var t=T,l=e,a={name:"Set Convective Coefficient of Air",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){F(a.oldValue)},redo:function(){F(a.newValue)}};h(a),F(l)}}})]},"air-convective-coefficient"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsx)(wv.b,{style:{width:"270px"},children:me.t("skyMenu.HighestTemperatureTimeInMinutes",S)+":"}),Object(gf.jsx)($v.a,{min:720,max:j.sunset,step:5,precision:0,value:P,onChange:function(e){if(e){var t=P,l=e,a={name:"Set Time of Highest Temperature in Minutes",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){k(a.oldValue)},redo:function(){k(a.newValue)}};h(a),k(l)}}})]},"highest-temperature-time-in-minutes")]})]})},pj=function e(){Object(He.a)(this,e),this.n=14,this.nominalStrings=new Array(this.n),this.nominalWidths=new Array(this.n),this.nominalHeights=new Array(this.n),this.cellNx=new Array(this.n),this.cellNy=new Array(this.n),this.nominalWidths[0]=.99,this.nominalHeights[0]=1.65,this.cellNx[0]=6,this.cellNy[0]=10,this.nominalWidths[1]=.99,this.nominalHeights[1]=1.96,this.cellNx[1]=6,this.cellNy[1]=12,this.nominalWidths[2]=1.05,this.nominalHeights[2]=1.56,this.cellNx[2]=8,this.cellNy[2]=12,this.nominalWidths[3]=1.31,this.nominalHeights[3]=1.96,this.cellNx[3]=8,this.cellNy[3]=12,this.nominalWidths[4]=1.07,this.nominalHeights[4]=2.07,this.cellNx[4]=8,this.cellNy[4]=16,this.nominalWidths[5]=.6,this.nominalHeights[5]=1.2,this.cellNx[5]=10,this.cellNy[5]=20,this.nominalWidths[6]=1.2,this.nominalHeights[6]=2,this.cellNx[6]=10,this.cellNy[6]=20,this.nominalWidths[7]=1,this.nominalHeights[7]=2.07,this.cellNx[7]=6,this.cellNy[7]=12,this.nominalWidths[8]=.8,this.nominalHeights[8]=1.56,this.cellNx[8]=6,this.cellNy[8]=12,this.nominalWidths[9]=.83,this.nominalHeights[9]=1.58,this.cellNx[9]=6,this.cellNy[9]=12,this.nominalWidths[10]=.99,this.nominalHeights[10]=1.31,this.cellNx[10]=6,this.cellNy[10]=8,this.nominalWidths[11]=.99,this.nominalHeights[11]=1.5,this.cellNx[11]=6,this.cellNy[11]=9,this.nominalWidths[12]=1.05,this.nominalHeights[12]=1.81,this.cellNx[12]=8,this.cellNy[12]=14,this.nominalWidths[13]=1.05,this.nominalHeights[13]=1.69,this.cellNx[13]=8,this.cellNy[13]=13;for(var t=0;t0?" ("+me.t("pvModelPanel.Bifacial",j)+")":"")},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.PanelSize",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(db.a,{disabled:!0,style:{width:"100%"},value:P,onChange:function(e){},children:pj.instance.nominalStrings.map((function(e){return Object(gf.jsx)(gj,{value:e,children:e},e)}))})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.CellType",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsxs)(db.a,{disabled:!0,style:{width:"100%"},value:H.cellType,onChange:function(e){},children:[Object(gf.jsx)(gj,{value:"Monocrystalline",children:me.t("pvModelPanel.Monocrystalline",j)},"Monocrystalline"),Object(gf.jsx)(gj,{value:"Polycrystalline",children:me.t("pvModelPanel.Polycrystalline",j)},"Polycrystalline"),Object(gf.jsx)(gj,{value:"Thin Film",children:me.t("pvModelPanel.ThinFilm",j)},"Thin Film")]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.BifacialityFactor",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{disabled:!0,style:{width:"100%"},precision:2,value:H.bifacialityFactor,onChange:function(e){}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("word.Color",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsxs)(db.a,{disabled:!0,style:{width:"100%"},value:H.color,onChange:function(e){},children:[Object(gf.jsx)(gj,{value:"Black",children:me.t("pvModelPanel.Black",j)},"Black"),Object(gf.jsx)(gj,{value:"Blue",children:me.t("pvModelPanel.Blue",j)},"Blue")]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.SolarCellEfficiency",j)+" (%):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{disabled:!0,style:{width:"100%"},precision:2,value:100*H.efficiency,onChange:function(e){}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.NominalOperatingCellTemperature",j)+" (\xb0C):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)($v.a,{disabled:!0,style:{width:"100%"},precision:1,value:H.noct,onChange:function(e){}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:13,children:me.t("pvModelPanel.TemperatureCoefficientOfPmax",j)+" (%/\xb0C):"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(ET.a,{disabled:!0,style:{width:"100%"},value:H.pmaxTC,onChange:function(e){}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:3,children:me.t("word.ApplyTo",j)+":"}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:21,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",j)})]})})})]})]})},wj=db.a.Option,xj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Ei),c=Ew($r),s=Ew(sn),d=Ew(Sr),h=Ew(_n),p=Ew($n),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.SolarPanel),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.orientation)&&void 0!==t?t:$.portrait),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useRef)(!1),P=Object(r.useRef)(),S=$f(),j=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){var r=i,n=l.pvModules[r.pvModelName];l.setSolarPanelOrientation(r,n,t),r.parentType,V.Wall;break}}}catch(c){o.e(c)}finally{o.f()}}))},H=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.foundationId===e&&!i.locked){var r=i,n=l.pvModules[r.pvModelName];l.setSolarPanelOrientation(r,n,t),r.parentType===V.Wall&&!0}}}catch(c){o.e(c)}finally{o.f()}}))},z=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.pvModules[n.pvModelName];a.setSolarPanelOrientation(n,c,l),n.parentType===V.Wall&&!0}}}}catch(s){i.e(s)}finally{i.f()}}))},R=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked){var i=o,r=t.pvModules[i.pvModelName];t.setSolarPanelOrientation(i,r,e),i.parentType===V.Wall&&!0}}}catch(n){a.e(n)}finally{a.f()}}))},D=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id)){var r=i,n=l.pvModules[r.pvModelName];l.setSolarPanelOrientation(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e){if(w){var t=n(w.pvModelName);if(e===$.portrait){var l=Math.max(1,Math.round(w.lx/t.width)),a=Math.max(1,Math.round(w.ly/t.length));s(w.id,l*t.width,a*t.length)}else{var o=Math.max(1,Math.round(w.lx/t.length)),i=Math.max(1,Math.round(w.ly/t.width));s(w.id,o*t.length,i*t.width)}j(w.id,e)}},W=function(e,t){return!function(e,t){var l=c(e);if(l){if(l.type===V.Cuboid&&!Tw.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));a.orientation=t;var o=n(a.pvModelName);if(t===$.portrait){var i=Math.max(1,Math.round(a.lx/o.width)),r=Math.max(1,Math.round(a.ly/o.length));a.lx=i*o.width,a.ly=r*o.length}else{var s=Math.max(1,Math.round(a.lx/o.length)),d=Math.max(1,Math.round(a.ly/o.width));a.lx=s*o.length,a.ly=d*o.width}return l.type===V.Wall?Tw.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Tw.checkElementOnRoofState(a,l)===ye.Valid:Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},I=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.orientation!==e)return!0}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.SolarPanel&&!n.locked&&n.orientation!==e)return!0}}catch(A){r.e(A)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.SolarPanel&&u.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!u.locked&&u.orientation!==e)return!0}}catch(A){d.e(A)}finally{d.f()}break;case _.AllObjectsOfThisTypeOnSurface:var p=c(w);if(p)if(p.type===V.Cuboid){var y,g=Object(f.a)(o);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.SolarPanel&&m.parentId===w.parentId&&Tw.isIdentical(m.normal,w.normal)&&!m.locked&&m.orientation!==e)return!0}}catch(A){g.e(A)}finally{g.f()}}else{var x,v=Object(f.a)(o);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&!b.locked&&b.orientation!==e)return!0}}catch(A){v.e(A)}finally{v.f()}}break;default:if((null===w||void 0===w?void 0:w.orientation)!==e)return!0}return!1}}(e)){switch(P.current=void 0,h){case _.AllSelectedObjectsOfThisType:T.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(r.id)&&W(r,e)){T.current=!0;break}}}catch(pe){l.e(pe)}finally{l.f()}if(T.current)P.current=e,A(w.orientation);else{var n,s=new Map,p=Object(f.a)(o);try{for(p.s();!(n=p.n()).done;){var m=n.value;m.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(m.id)&&s.set(m.id,m.orientation)}}catch(pe){p.e(pe)}finally{p.f()}var x={name:"Set Orientation for Selected Solar Panels",timestamp:Date.now(),oldValues:s,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];j(a,o)}}catch(pe){t.e(pe)}finally{t.f()}},redo:function(){D(x.oldValues,x.newValue)}};d(x),D(s,e),g(y+1)}break;case _.AllObjectsOfThisType:T.current=!1;var v,b=Object(f.a)(o);try{for(b.s();!(v=b.n()).done;){var S=v.value;if(S.type===V.SolarPanel&&W(S,e)){T.current=!0;break}}}catch(pe){b.e(pe)}finally{b.f()}if(T.current)P.current=e,A(w.orientation);else{var I,C=new Map,O=Object(f.a)(o);try{for(O.s();!(I=O.n()).done;){var F=I.value;F.type===V.SolarPanel&&C.set(F.id,F.orientation)}}catch(pe){O.e(pe)}finally{O.f()}var k={name:"Set Orientation for All Solar Panels",timestamp:Date.now(),oldValues:C,newValue:e,undo:function(){var e,t=Object(f.a)(k.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];j(a,o)}}catch(pe){t.e(pe)}finally{t.f()}},redo:function(){R(k.newValue)}};d(k),R(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var Y,L=Object(f.a)(o);try{for(L.s();!(Y=L.n()).done;){var E=Y.value;if(E.type===V.SolarPanel&&E.foundationId===w.foundationId&&W(E,e)){T.current=!0;break}}}catch(pe){L.e(pe)}finally{L.f()}if(T.current)P.current=e,A(w.orientation);else{var U,N=new Map,J=Object(f.a)(o);try{for(J.s();!(U=J.n()).done;){var G=U.value;G.type===V.SolarPanel&&G.foundationId===w.foundationId&&N.set(G.id,G.orientation)}}catch(pe){J.e(pe)}finally{J.f()}var X={name:"Set Orientation for All Solar Panels Above Foundation",timestamp:Date.now(),oldValues:N,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(X.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];j(a,o)}}catch(pe){t.e(pe)}finally{t.f()}},redo:function(){X.groupId&&H(X.groupId,X.newValue)}};d(X),H(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var B=c(w);if(B){if(T.current=!1,B.type===V.Cuboid){var K,q=Object(f.a)(o);try{for(q.s();!(K=q.n()).done;){var Q=K.value;if(Q.type===V.SolarPanel&&Q.parentId===w.parentId&&Tw.isIdentical(Q.normal,w.normal)&&W(Q,e)){T.current=!0;break}}}catch(pe){q.e(pe)}finally{q.f()}}else{var Z,$=Object(f.a)(o);try{for($.s();!(Z=$.n()).done;){var ee=Z.value;if(ee.type===V.SolarPanel&&ee.parentId===w.parentId&&W(ee,e)){T.current=!0;break}}}catch(pe){$.e(pe)}finally{$.f()}}if(T.current)P.current=e,A(w.orientation);else{var te=new Map,le=B.type===V.Cuboid;if(le){var ae,oe=Object(f.a)(o);try{for(oe.s();!(ae=oe.n()).done;){var ie=ae.value;ie.type===V.SolarPanel&&ie.parentId===w.parentId&&Tw.isIdentical(ie.normal,w.normal)&&te.set(ie.id,ie.orientation)}}catch(pe){oe.e(pe)}finally{oe.f()}}else{var re,ne=Object(f.a)(o);try{for(ne.s();!(re=ne.n()).done;){var ce=re.value;ce.type===V.SolarPanel&&ce.parentId===w.parentId&&te.set(ce.id,ce.orientation)}}catch(pe){ne.e(pe)}finally{ne.f()}}var se=le?w.normal:void 0,de={name:"Set Orientation for All Solar Panels on Surface",timestamp:Date.now(),oldValues:te,newValue:e,groupId:w.parentId,normal:se,undo:function(){var e,t=Object(f.a)(de.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];j(a,o)}}catch(pe){t.e(pe)}finally{t.f()}},redo:function(){de.groupId&&z(de.groupId,de.normal,de.newValue)}};d(de),z(w.parentId,se,e),g(y+1)}}break;default:var ue=i(w.id),fe=ue?ue.orientation:w.orientation;if(T.current=W(w,e),T.current)P.current=e,A(fe);else{var he={name:"Set Orientation of Selected Solar Panel",timestamp:Date.now(),oldValue:fe,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){M(he.oldValue)},redo:function(){M(he.newValue)}};d(he),M(e),g(y+1)}}a((function(t){t.actionState.solarPanelOrientation=e}))}},C=function(){w&&(A(w.orientation),T.current=!1,l(!1))},O=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(P.current?" ("+(P.current===$.portrait?me.t("solarPanelMenu.Portrait",S):me.t("solarPanelMenu.Landscape",S))+")":""):"";return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.Orientation",S),rejectedMessage:O,onApply:function(){I(b)},onClose:C,onClickCancel:function(){C(),m()},onClickOk:function(){I(b),T.current||(l(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:b,onChange:function(e){return A(e)},children:[Object(gf.jsx)(wj,{value:$.portrait,children:me.t("solarPanelMenu.Portrait",S)},$.portrait),Object(gf.jsx)(wj,{value:$.landscape,children:me.t("solarPanelMenu.Landscape",S)},$.landscape)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",S)})]})})})]})})},vj=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Ei),s=Ew($r),d=Ew(Sr),h=Ew(_n),p=Ew($n),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.SolarPanel),x=Object(r.useState)((null===w||void 0===w?void 0:w.orientation)===$.portrait?null!==(t=null===w||void 0===w?void 0:w.lx)&&void 0!==t?t:1:null!==(l=null===w||void 0===w?void 0:w.ly)&&void 0!==l?l:2),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(0),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useRef)(!1),z=Object(r.useRef)(),R=$f();Object(r.useEffect)((function(){if(w){var e,t=null!==(e=c(w.pvModelName))&&void 0!==e?e:c("SPR-X21-335-BLK");j(w.orientation===$.portrait?t.width:t.length)}}),[w]);var D=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){var r=i,n=l.getPvModule(r.pvModelName);i.lx=Tw.panelizeLx(r,n,t);break}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.foundationId===e&&!i.locked){var r=i,n=l.getPvModule(r.pvModelName);i.lx=Tw.panelizeLx(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},W=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.getPvModule(n.pvModelName);r.lx=Tw.panelizeLx(n,c,l)}}}}catch(s){i.e(s)}finally{i.f()}}))},I=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked){var i=o,r=t.getPvModule(i.pvModelName);o.lx=Tw.panelizeLx(i,r,e)}}}catch(n){a.e(n)}finally{a.f()}}))},C=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id)){var r=i,n=l.getPvModule(r.pvModelName);i.lx=Tw.panelizeLx(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},O=function(e,t){return!function(e,t){var l=s(e);if(l){if(l.type===V.Cuboid&&!Tw.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.lx=t,l.type===V.Wall?Tw.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Tw.checkElementOnRoofState(a,l)===ye.Valid:Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},F=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(Math.abs(o.lx-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&!c.locked){var d=c;if(Math.abs(d.lx-e)>At)return!0}}}catch(H){n.e(H)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,p=Object(f.a)(i);try{for(p.s();!(u=p.n()).done;){var y=u.value;if(y.type===V.SolarPanel&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.lx-e)>At)return!0}}}catch(H){p.e(H)}finally{p.f()}break;case _.AllObjectsOfThisTypeOnSurface:var m=s(w);if(m)if(m.type===V.Cuboid){var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&Tw.isIdentical(b.normal,w.normal)&&!b.locked){var A=b;if(Math.abs(A.lx-e)>At)return!0}}}catch(H){v.e(H)}finally{v.f()}}else{var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===w.parentId&&!S.locked){var j=S;if(Math.abs(j.lx-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.lx)-e)>At)return!0}return!1}}(e))switch(z.current=void 0,h){case _.AllSelectedObjectsOfThisType:H.current=!1;var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(a.id)&&O(a,e)){H.current=!0;break}}}catch(fe){l.e(fe)}finally{l.f()}if(H.current)z.current=e,A(w.lx);else{var o,r=new Map,c=Object(f.a)(i);try{for(c.s();!(o=c.n()).done;){var p=o.value;p.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(p.id)&&r.set(p.id,p.lx)}}catch(fe){c.e(fe)}finally{c.f()}var m={name:"Set Length for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){C(m.oldValues,m.newValue)}};d(m),C(r,e),g(y+1)}break;case _.AllObjectsOfThisType:H.current=!1;var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(b.id)&&O(b,e)){H.current=!0;break}}}catch(fe){v.e(fe)}finally{v.f()}if(H.current)z.current=e,A(w.lx);else{var T,P=new Map,S=Object(f.a)(i);try{for(S.s();!(T=S.n()).done;){var j=T.value;j.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(j.id)&&P.set(j.id,j.lx)}}catch(fe){S.e(fe)}finally{S.f()}var R={name:"Set Length for All Solar Panel Arrays",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){I(R.newValue)}};d(R),I(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){H.current=!1;var F,k=Object(f.a)(i);try{for(k.s();!(F=k.n()).done;){var Y=F.value;if(Y.type===V.SolarPanel&&Y.foundationId===w.foundationId&&O(Y,e)){H.current=!0;break}}}catch(fe){k.e(fe)}finally{k.f()}if(H.current)z.current=e,A(w.lx);else{var L,E=new Map,U=Object(f.a)(i);try{for(U.s();!(L=U.n()).done;){var N=L.value;N.type===V.SolarPanel&&N.foundationId===w.foundationId&&E.set(N.id,N.lx)}}catch(fe){U.e(fe)}finally{U.f()}var J={name:"Set Length for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:E,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(J.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){J.groupId&&M(J.groupId,J.newValue)}};d(J),M(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var G=s(w);if(G){if(H.current=!1,G.type===V.Cuboid){var X,B=Object(f.a)(i);try{for(B.s();!(X=B.n()).done;){var K=X.value;if(K.type===V.SolarPanel&&K.parentId===w.parentId&&Tw.isIdentical(K.normal,w.normal)&&O(K,e)){H.current=!0;break}}}catch(fe){B.e(fe)}finally{B.f()}}else{var q,Q=Object(f.a)(i);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;if(Z.type===V.SolarPanel&&Z.parentId===w.parentId&&O(Z,e)){H.current=!0;break}}}catch(fe){Q.e(fe)}finally{Q.f()}}if(H.current)z.current=e,A(w.lx);else{var $=new Map,ee=G.type===V.Cuboid;if(ee){var te,le=Object(f.a)(i);try{for(le.s();!(te=le.n()).done;){var ae=te.value;ae.type===V.SolarPanel&&ae.parentId===w.parentId&&Tw.isIdentical(ae.normal,w.normal)&&$.set(ae.id,ae.lx)}}catch(fe){le.e(fe)}finally{le.f()}}else{var oe,ie=Object(f.a)(i);try{for(ie.s();!(oe=ie.n()).done;){var re=oe.value;re.type===V.SolarPanel&&re.parentId===w.parentId&&$.set(re.id,re.lx)}}catch(fe){ie.e(fe)}finally{ie.f()}}var ne=ee?w.normal:void 0,ce={name:"Set Length for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:$,newValue:e,groupId:w.parentId,normal:ne,undo:function(){var e,t=Object(f.a)(ce.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){ce.groupId&&W(ce.groupId,ce.normal,ce.newValue)}};d(ce),W(w.parentId,ne,e),g(y+1)}}break;default:var se=n(w.id),de=se?se.lx:w.lx;if(H.current=O(w,e),H.current)z.current=e,A(de);else{var ue={name:"Set Solar Panel Array Length",timestamp:Date.now(),oldValue:de,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(ue.changedElementId,ue.oldValue)},redo:function(){D(ue.changedElementId,ue.newValue)}};d(ue),D(w.id,e),g(y+1)}}},k=function(){H.current=!1,a(!1)},Y=H.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Length",R),rejectedMessage:Y,onApply:function(){F(b)},onClose:k,onClickCancel:function(){k(),m()},onClickOk:function(){F(b),H.current||(a(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:S,max:100*S,step:S,style:{width:120},precision:2,value:b,onChange:function(e){A(function(e){var t=null!==e&&void 0!==e?e:1;return Math.max(1,Math.ceil((t-S/2)/S))*S}(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[Math.round(b/S)+" "+me.t("solarPanelMenu.PanelsWide",R),Object(gf.jsx)("br",{}),me.t("word.MaximumNumber",R),": 100 ",me.t("solarPanelMenu.Panels",R)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",R)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",R)})]})})})]})})},bj=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(Ei),s=Ew($r),d=Ew(Sr),h=Ew(_n),p=Ew($n),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.SolarPanel),x=Object(r.useState)((null===w||void 0===w?void 0:w.orientation)===$.portrait?null!==(t=null===w||void 0===w?void 0:w.ly)&&void 0!==t?t:2:null!==(l=null===w||void 0===w?void 0:w.lx)&&void 0!==l?l:1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(0),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useRef)(!1),z=Object(r.useRef)(),R=$f();Object(r.useEffect)((function(){if(w){var e,t=null!==(e=c(w.pvModelName))&&void 0!==e?e:c("SPR-X21-335-BLK");j(w.orientation===$.portrait?t.length:t.width),A(w.ly)}}),[w]);var D=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){var r=i,n=l.getPvModule(r.pvModelName);i.ly=Tw.panelizeLy(r,n,t);break}}}catch(c){o.e(c)}finally{o.f()}}))},M=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.foundationId===e&&!i.locked){var r=i,n=l.getPvModule(r.pvModelName);i.ly=Tw.panelizeLy(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},W=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e){var n=r,c=a.getPvModule(n.pvModelName);r.ly=Tw.panelizeLy(n,c,l)}}}}catch(s){i.e(s)}finally{i.f()}}))},I=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked){var i=o,r=t.getPvModule(i.pvModelName);o.ly=Tw.panelizeLy(i,r,e)}}}catch(n){a.e(n)}finally{a.f()}}))},C=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id)){var r=i,n=l.getPvModule(r.pvModelName);i.ly=Tw.panelizeLy(r,n,t)}}}catch(c){o.e(c)}finally{o.f()}}))},O=function(e,t){return 0!==e.tiltAngle&&.5*t*Math.abs(Math.sin(e.tiltAngle))>e.poleHeight||!function(e,t){var l=s(e);if(l){if(l.type===V.Cuboid&&!Tw.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.ly=t,l.type===V.Wall?Tw.checkElementOnWallState(a,l)===ye.Valid:l.type===V.Roof?Tw.checkElementOnRoofState(a,l)===ye.Valid:Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},F=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(Math.abs(o.ly-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&!c.locked){var d=c;if(Math.abs(d.ly-e)>At)return!0}}}catch(H){n.e(H)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,p=Object(f.a)(i);try{for(p.s();!(u=p.n()).done;){var y=u.value;if(y.type===V.SolarPanel&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.ly-e)>At)return!0}}}catch(H){p.e(H)}finally{p.f()}break;case _.AllObjectsOfThisTypeOnSurface:var m=s(w);if(m)if(m.type===V.Cuboid){var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&Tw.isIdentical(b.normal,w.normal)&&!b.locked){var A=b;if(Math.abs(A.ly-e)>At)return!0}}}catch(H){v.e(H)}finally{v.f()}}else{var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===w.parentId&&!S.locked){var j=S;if(Math.abs(j.ly-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(z.current=void 0,h){case _.AllSelectedObjectsOfThisType:H.current=!1;var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(a.id)&&O(a,e)){H.current=!0;break}}}catch(fe){l.e(fe)}finally{l.f()}if(H.current)z.current=e,A(w.ly);else{var o,r=new Map,c=Object(f.a)(i);try{for(c.s();!(o=c.n()).done;){var p=o.value;p.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(p.id)&&r.set(p.id,p.ly)}}catch(fe){c.e(fe)}finally{c.f()}var m={name:"Set Width for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){C(m.oldValues,m.newValue)}};d(m),C(r,e),g(y+1)}break;case _.AllObjectsOfThisType:H.current=!1;var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&O(b,e)){H.current=!0;break}}}catch(fe){v.e(fe)}finally{v.f()}if(H.current)z.current=e,A(w.ly);else{var T,P=new Map,S=Object(f.a)(i);try{for(S.s();!(T=S.n()).done;){var j=T.value;j.type===V.SolarPanel&&P.set(j.id,j.ly)}}catch(fe){S.e(fe)}finally{S.f()}var R={name:"Set Width for All Solar Panel Arrays",timestamp:Date.now(),oldValues:P,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){I(R.newValue)}};d(R),I(e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){H.current=!1;var F,k=Object(f.a)(i);try{for(k.s();!(F=k.n()).done;){var Y=F.value;if(Y.type===V.SolarPanel&&Y.foundationId===w.foundationId&&O(Y,e)){H.current=!0;break}}}catch(fe){k.e(fe)}finally{k.f()}if(H.current)z.current=e,A(w.ly);else{var L,E=new Map,U=Object(f.a)(i);try{for(U.s();!(L=U.n()).done;){var N=L.value;N.type===V.SolarPanel&&N.foundationId===w.foundationId&&E.set(N.id,N.ly)}}catch(fe){U.e(fe)}finally{U.f()}var J={name:"Set Width for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:E,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(J.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){J.groupId&&M(J.groupId,J.newValue)}};d(J),M(w.foundationId,e),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var G=s(w);if(G){if(H.current=!1,G.type===V.Cuboid){var X,B=Object(f.a)(i);try{for(B.s();!(X=B.n()).done;){var K=X.value;if(K.type===V.SolarPanel&&K.parentId===w.parentId&&Tw.isIdentical(K.normal,w.normal)&&O(K,e)){H.current=!0;break}}}catch(fe){B.e(fe)}finally{B.f()}}else{var q,Q=Object(f.a)(i);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;if(Z.type===V.SolarPanel&&Z.parentId===w.parentId&&O(Z,e)){H.current=!0;break}}}catch(fe){Q.e(fe)}finally{Q.f()}}if(H.current)z.current=e,A(w.ly);else{var $=new Map,ee=G.type===V.Cuboid;if(ee){var te,le=Object(f.a)(i);try{for(le.s();!(te=le.n()).done;){var ae=te.value;ae.type===V.SolarPanel&&ae.parentId===w.parentId&&Tw.isIdentical(ae.normal,w.normal)&&$.set(ae.id,ae.ly)}}catch(fe){le.e(fe)}finally{le.f()}}else{var oe,ie=Object(f.a)(i);try{for(ie.s();!(oe=ie.n()).done;){var re=oe.value;re.type===V.SolarPanel&&re.parentId===w.parentId&&$.set(re.id,re.ly)}}catch(fe){ie.e(fe)}finally{ie.f()}}var ne=ee?w.normal:void 0,ce={name:"Set Width for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:$,newValue:e,groupId:w.parentId,normal:ne,undo:function(){var e,t=Object(f.a)(ce.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];D(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){ce.groupId&&W(ce.groupId,ce.normal,ce.newValue)}};d(ce),W(w.parentId,ne,e),g(y+1)}}break;default:var se=n(w.id),de=se?se.ly:w.ly;if(H.current=O(w,e),H.current)z.current=e,A(de);else{var ue={name:"Set Solar Panel Array Width",timestamp:Date.now(),oldValue:de,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){D(ue.changedElementId,ue.oldValue)},redo:function(){D(ue.changedElementId,ue.newValue)}};d(ue),D(w.id,e),g(y+1)}}},k=function(){H.current=!1,a(!1)},Y=H.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Width",R),rejectedMessage:Y,onApply:function(){F(b)},onClose:k,onClickCancel:function(){k(),m()},onClickOk:function(){F(b),H.current||(a(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:S,max:100*S,step:S,style:{width:120},precision:2,value:b,onChange:function(e){A(function(e){var t=null!==e&&void 0!==e?e:1;return Math.max(1,Math.ceil((t-S/2)/S))*S}(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[Math.round(b/S)+" "+me.t("solarPanelMenu.PanelsLong",R),Object(gf.jsx)("br",{}),me.t("word.MaximumNumber",R),": 100 ",me.t("solarPanelMenu.Panels",R)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",R)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",R)})]})})})]})})},Aj=function(e){var t,l=e.setDialogVisible,a=e.isOnWall,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(lc),s=Ew($r),d=Ew(Sr),h=Ew(_n),p=Ew($n),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.SolarPanel),x=null!==(t=null===w||void 0===w?void 0:w.tiltAngle)&&void 0!==t?t:0,v=Object(r.useState)(a?-x:x),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&r.foundationId===e&&!r.locked){var n=r;n.parentType===V.Wall?n.tiltAngle=Math.min(0,l?-t:t):n.tiltAngle=t}}}catch(c){i.e(c)}finally{i.f()}}))},z=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)r.tiltAngle=l}}}catch(n){i.e(n)}finally{i.f()}}))},R=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked){var r=i;r.parentType===V.Wall?r.tiltAngle=Math.min(0,t?-e:e):r.tiltAngle=e}}}catch(n){o.e(n)}finally{o.f()}}))},D=function(e,t,l){Ew.getState().set((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked&&e.has(r.id)){var n=r;n.parentType===V.Wall?n.tiltAngle=Math.min(0,l?-t:t):n.tiltAngle=t}}}catch(c){i.e(c)}finally{i.f()}}))},M=function(e){if(a&&(e=-e),w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(Math.abs(o.tiltAngle-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&!c.locked){var d=c;if(Math.abs(d.tiltAngle-e)>At)return!0}}}catch(H){n.e(H)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,p=Object(f.a)(i);try{for(p.s();!(u=p.n()).done;){var y=u.value;if(y.type===V.SolarPanel&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.tiltAngle-e)>At)return!0}}}catch(H){p.e(H)}finally{p.f()}break;case _.AllObjectsOfThisTypeOnSurface:var m=s(w);if(m)if(m.type===V.Cuboid){var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===w.parentId&&Tw.isIdentical(b.normal,w.normal)&&!b.locked){var A=b;if(Math.abs(A.tiltAngle-e)>At)return!0}}}catch(H){v.e(H)}finally{v.f()}}else{var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===w.parentId&&!S.locked){var j=S;if(Math.abs(j.tiltAngle-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.tiltAngle)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,h){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&r.parentType!==V.Wall&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*r.ly*Math.abs(Math.sin(e))>r.poleHeight){P.current=!0;break}}}catch(he){l.e(he)}finally{l.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var p,m=new Map,x=Object(f.a)(i);try{for(x.s();!(p=x.n()).done;){var v=p.value;v.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(v.id)&&m.set(v.id,v.tiltAngle)}}catch(he){x.e(he)}finally{x.f()}var b={name:"Set Tilt Angle for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){D(b.oldValues,b.newValue,!a)}};d(b),D(m,e,!a),g(y+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(i);try{for(j.s();!(A=j.n()).done;){var M=A.value;if(M.type===V.SolarPanel&&M.parentType!==V.Wall&&.5*M.ly*Math.abs(Math.sin(e))>M.poleHeight){P.current=!0;break}}}catch(he){j.e(he)}finally{j.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var W,I=new Map,C=Object(f.a)(i);try{for(C.s();!(W=C.n()).done;){var O=W.value;O.type===V.SolarPanel&&I.set(O.id,O.tiltAngle)}}catch(he){C.e(he)}finally{C.f()}var F={name:"Set Tilt Angle for All Solar Panel Arrays",timestamp:Date.now(),oldValues:I,newValue:e,undo:function(){var e,t=Object(f.a)(F.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){R(F.newValue,!a)}};d(F),R(e,!a),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){P.current=!1;var k,Y=Object(f.a)(i);try{for(Y.s();!(k=Y.n()).done;){var L=k.value;if(L.type===V.SolarPanel&&L.foundationId===w.foundationId&&L.parentType!==V.Wall&&.5*L.ly*Math.abs(Math.sin(e))>L.poleHeight){P.current=!0;break}}}catch(he){Y.e(he)}finally{Y.f()}if(P.current)S.current=e,T(w.tiltAngle);else{var E,U=new Map,N=Object(f.a)(i);try{for(N.s();!(E=N.n()).done;){var J=E.value;J.type===V.SolarPanel&&J.foundationId===w.foundationId&&U.set(J.id,J.tiltAngle)}}catch(he){N.e(he)}finally{N.f()}var G={name:"Set Tilt Angle for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:U,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(G.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(he){t.e(he)}finally{t.f()}G.oldValues.size%2===0&&Ew.getState().set((function(e){}))},redo:function(){G.groupId&&H(G.groupId,G.newValue,!a)}};d(G),H(w.foundationId,e,!a),g(y+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var X=s(w);if(X){P.current=!1;var B=X.type===V.Cuboid;if(B){var K,q=Object(f.a)(i);try{for(q.s();!(K=q.n()).done;){var Q=K.value;if(Q.type===V.SolarPanel&&Q.parentId===w.parentId&&Tw.isIdentical(Q.normal,w.normal)&&.5*Q.ly*Math.abs(Math.sin(e))>Q.poleHeight){P.current=!0;break}}}catch(he){q.e(he)}finally{q.f()}}else if(w.parentType===V.Wall)P.current=!1;else{var Z,$=Object(f.a)(i);try{for($.s();!(Z=$.n()).done;){var ee=Z.value;if(ee.type===V.SolarPanel&&ee.parentId===w.parentId&&.5*ee.ly*Math.abs(Math.sin(e))>ee.poleHeight){P.current=!0;break}}}catch(he){$.e(he)}finally{$.f()}}if(P.current)S.current=e,T(w.tiltAngle);else{var te=new Map;if(B){var le,ae=Object(f.a)(i);try{for(ae.s();!(le=ae.n()).done;){var oe=le.value;oe.type===V.SolarPanel&&oe.parentId===w.parentId&&Tw.isIdentical(oe.normal,w.normal)&&te.set(oe.id,oe.tiltAngle)}}catch(he){ae.e(he)}finally{ae.f()}}else{var ie,re=Object(f.a)(i);try{for(re.s();!(ie=re.n()).done;){var ne=ie.value;ne.type===V.SolarPanel&&ne.parentId===w.parentId&&te.set(ne.id,ne.tiltAngle)}}catch(he){re.e(he)}finally{re.f()}}var ce=B?w.normal:void 0,se={name:"Set Tilt Angle for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:te,newValue:e,groupId:w.parentId,normal:ce,undo:function(){var e,t=Object(f.a)(se.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(he){t.e(he)}finally{t.f()}se.oldValues.size%2===0&&Ew.getState().set((function(e){}))},redo:function(){se.groupId&&z(se.groupId,se.normal,se.newValue)}};d(se),z(w.parentId,ce,e),g(y+1)}}break;default:var de=n(w.id),ue=de?de.tiltAngle:w.tiltAngle;if(P.current=.5*w.ly*Math.abs(Math.sin(e))>w.poleHeight,w.parentType===V.Wall&&(P.current=!1),P.current)S.current=e,T(ue);else{var fe={name:"Set Solar Panel Array Tilt Angle",timestamp:Date.now(),oldValue:ue,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){c(fe.changedElementId,fe.oldValue)},redo:function(){c(fe.changedElementId,fe.newValue)}};d(fe),c(w.id,e),g(y+1)}}o((function(t){t.actionState.solarPanelTiltAngle=e}))}},W=function(){P.current=!1,l(!1)},I=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+Tw.toDegrees(S.current).toFixed(1)+"\xb0)":null):null;return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.TiltAngle",j),rejectedMessage:I,onApply:function(){M(A)},onClose:W,onClickCancel:function(){W(),m()},onClickOk:function(){M(A),P.current||(l(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:a?0:-90,max:90,style:{width:120},precision:2,value:parseFloat(Tw.toDegrees(A).toFixed(2)),step:1,formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){T(Tw.toRadians(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [",a?"0\xb0":"-90\xb0",", 90\xb0]",Object(gf.jsx)("br",{}),me.t("solarPanelMenu.SouthFacingIsPositive",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:18,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",j)})]})})})]})})},Tj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(rc),c=Ew(nc),s=Ew(cc),d=Ew(sc),h=Ew($r),p=Ew(Sr),y=Ew(_n),g=Ew($n),m=Ew(Ii),w=Ew(Ci),x=Ew(Oi),v=OP(V.SolarPanel),b=Object(r.useRef)(!1),A=Object(r.useRef)(),T=Object(r.useState)(v&&null!==(t=-v.relativeAzimuth)&&void 0!==t?t:0),P=Object(u.a)(T,2),S=P[0],j=P[1],H=$f(),z=function(e,t){return!function(e,t){var l=h(e);if(l){if(l.type===V.Cuboid&&!Tw.isIdentical(e.normal,Tt))return!0;var a=JSON.parse(JSON.stringify(e));return a.relativeAzimuth=-t,l.type===V.Roof?Tw.checkElementOnRoofState(a,l)===ye.Valid:Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},R=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id))i.relativeAzimuth=t}}catch(r){o.e(r)}finally{o.f()}}))},D=function(e){if(v&&function(e){if(v){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&a.parentType!==V.Wall&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(-i.relativeAzimuth-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&!c.locked&&c.parentType!==V.Wall){var s=c;if(Math.abs(-s.relativeAzimuth-e)>At)return!0}}}catch(H){n.e(H)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.SolarPanel&&p.foundationId===(null===v||void 0===v?void 0:v.foundationId)&&!p.locked&&p.parentType!==V.Wall){var g=p;if(Math.abs(-g.relativeAzimuth-e)>At)return!0}}}catch(H){u.e(H)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(null===v||void 0===v?void 0:v.parentId){var m=h(v);if(m)if(m.type===V.Cuboid){var w,x=Object(f.a)(o);try{for(x.s();!(w=x.n()).done;){var b=w.value;if(b.type===V.SolarPanel&&b.parentId===v.parentId&&Tw.isIdentical(b.normal,v.normal)&&!b.locked){var A=b;if(Math.abs(-A.relativeAzimuth-e)>At)return!0}}}catch(H){x.e(H)}finally{x.f()}}else{var T,P=Object(f.a)(o);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===v.parentId&&!S.locked){var j=S;if(Math.abs(-j.relativeAzimuth-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}}break;default:if(Math.abs(-(null===v||void 0===v?void 0:v.relativeAzimuth)-e)>At)return!0}return!1}}(e)){switch(A.current=void 0,y){case _.AllSelectedObjectsOfThisType:b.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&r.parentType!==V.Wall&&Ew.getState().selectedElementIdSet.has(r.id)&&z(r,e)){b.current=!0;break}}}catch(he){l.e(he)}finally{l.f()}if(b.current)A.current=e,j(-v.relativeAzimuth);else{var g,x=new Map,T=Object(f.a)(o);try{for(T.s();!(g=T.n()).done;){var P=g.value;P.type===V.SolarPanel&&P.parentType!==V.Wall&&Ew.getState().selectedElementIdSet.has(P.id)&&x.set(P.id,-P.relativeAzimuth)}}catch(he){T.e(he)}finally{T.f()}var S={name:"Set Relative Azimuth for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,-o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){R(S.oldValues,S.newValue)}};p(S),R(x,-e),w(m+1)}break;case _.AllObjectsOfThisType:b.current=!1;var H,D=Object(f.a)(o);try{for(D.s();!(H=D.n()).done;){var M=H.value;if(M.type===V.SolarPanel&&M.parentType!==V.Wall&&z(M,e)){b.current=!0;break}}}catch(he){D.e(he)}finally{D.f()}if(b.current)A.current=e,j(-v.relativeAzimuth);else{var W,I=new Map,C=Object(f.a)(o);try{for(C.s();!(W=C.n()).done;){var O=W.value;O.type===V.SolarPanel&&O.parentType!==V.Wall&&I.set(O.id,-O.relativeAzimuth)}}catch(he){C.e(he)}finally{C.f()}var F={name:"Set Relative Azimuth for All Solar Panel Arrays",timestamp:Date.now(),oldValues:I,newValue:e,undo:function(){var e,t=Object(f.a)(F.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,-o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){d(V.SolarPanel,-F.newValue)}};p(F),d(V.SolarPanel,-e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){b.current=!1;var k,Y=Object(f.a)(o);try{for(Y.s();!(k=Y.n()).done;){var L=k.value;if(L.type===V.SolarPanel&&L.foundationId===v.foundationId&&L.parentType!==V.Wall&&z(L,e)){b.current=!0;break}}}catch(he){Y.e(he)}finally{Y.f()}if(b.current)A.current=e,j(-v.relativeAzimuth);else{var E,U=new Map,N=Object(f.a)(o);try{for(N.s();!(E=N.n()).done;){var J=E.value;J.type===V.SolarPanel&&J.foundationId===v.foundationId&&J.parentType!==V.Wall&&U.set(J.id,-J.relativeAzimuth)}}catch(he){N.e(he)}finally{N.f()}var G={name:"Set Relative Azimuth for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:U,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(f.a)(G.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,-o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){G.groupId&&s(V.SolarPanel,G.groupId,-G.newValue)}};p(G),s(V.SolarPanel,v.foundationId,-e),w(m+1)}}break;case _.AllObjectsOfThisTypeOnSurface:if(v.parentId){var X=h(v);if(X){if(b.current=!1,X.type===V.Cuboid){var B,K=Object(f.a)(o);try{for(K.s();!(B=K.n()).done;){var q=B.value;if(q.type===V.SolarPanel&&q.parentId===v.parentId&&Tw.isIdentical(q.normal,v.normal)&&z(q,e)){b.current=!0;break}}}catch(he){K.e(he)}finally{K.f()}}else{var Q,Z=Object(f.a)(o);try{for(Z.s();!(Q=Z.n()).done;){var $=Q.value;if($.type===V.SolarPanel&&$.parentId===v.parentId&&z($,e)){b.current=!0;break}}}catch(he){Z.e(he)}finally{Z.f()}}if(b.current)A.current=e,j(-v.relativeAzimuth);else{var ee=new Map,te=X.type===V.Cuboid;if(te){var le,ae=Object(f.a)(o);try{for(ae.s();!(le=ae.n()).done;){var oe=le.value;oe.type===V.SolarPanel&&oe.parentId===v.parentId&&Tw.isIdentical(oe.normal,v.normal)&&ee.set(oe.id,-oe.relativeAzimuth)}}catch(he){ae.e(he)}finally{ae.f()}}else{var ie,re=Object(f.a)(o);try{for(re.s();!(ie=re.n()).done;){var ne=ie.value;ne.type===V.SolarPanel&&ne.parentId===v.parentId&&ee.set(ne.id,-ne.relativeAzimuth)}}catch(he){re.e(he)}finally{re.f()}}var ce=te?v.normal:void 0,se={name:"Set Relative Azimuth for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:ee,newValue:e,groupId:v.parentId,normal:ce,undo:function(){var e,t=Object(f.a)(se.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,-o)}}catch(he){t.e(he)}finally{t.f()}},redo:function(){se.groupId&&c(V.SolarPanel,se.groupId,se.normal,-se.newValue)}};p(se),c(V.SolarPanel,v.parentId,ce,-e),w(m+1)}}}break;default:var de=i(v.id),ue=de?-de.relativeAzimuth:-v.relativeAzimuth;if(b.current=z(v,e),b.current)A.current=e,j(ue);else{var fe={name:"Set Solar Panel Array Relative Azimuth",timestamp:Date.now(),oldValue:ue,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){n(fe.changedElementId,-fe.oldValue)},redo:function(){n(fe.changedElementId,-fe.newValue)}};p(fe),n(v.id,-e),w(m+1)}}a((function(t){t.actionState.solarPanelRelativeAzimuth=-e}))}},M=function(){b.current=!1,l(!1)},W=b.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==A.current?" ("+Tw.toDegrees(A.current).toFixed(1)+"\xb0)":null):null;return Object(gf.jsx)(kP,{width:550,title:me.t("solarCollectorMenu.RelativeAzimuth",H),rejectedMessage:W,onApply:function(){D(S)},onClose:M,onClickCancel:function(){M(),x()},onClickOk:function(){D(S),b.current||(l(!1),w(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:-180,max:180,style:{width:120},precision:2,step:1,value:parseFloat(Tw.toDegrees(S).toFixed(2)),formatter:function(e){return"".concat(e,"\xb0")},onChange:function(e){j(Tw.toRadians(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [-180\xb0, 180\xb0]",Object(gf.jsx)("br",{}),me.t("message.AzimuthOfNorthIsZero",H),Object(gf.jsx)("br",{}),me.t("message.CounterclockwiseAzimuthIsPositive",H)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:18,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",H)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",H)})]})})})]})})},Pj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(_n),d=Ew($n),h=Ew(Ii),p=Ew(Ci),y=OP(V.SolarPanel),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.trackerType)&&void 0!==t?t:te.NO_TRACKER),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=db.a.Option,A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.trackerType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.SolarPanel||i.foundationId!==e||i.locked||(i.trackerType=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)&&(r.trackerType=l)}}}catch(n){i.e(n)}finally{i.f()}}))},S=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.SolarPanel||o.locked||(o.trackerType=e)}}catch(i){a.e(i)}finally{a.f()}}))},j=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.SolarPanel&&!i.locked&&e.has(i.id)&&(i.trackerType=t)}}catch(r){o.e(r)}finally{o.f()}}))},H=function(e){if(y&&function(e){if(y){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.trackerType!==e)return!0}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.SolarPanel&&!c.locked&&c.trackerType!==e)return!0}}catch(A){r.e(A)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.SolarPanel&&h.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!h.locked&&h.trackerType!==e)return!0}}catch(A){u.e(A)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:var p=n(y);if(p)if(p.type===V.Cuboid){var g,m=Object(f.a)(o);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.type===V.SolarPanel&&w.parentId===y.parentId&&Tw.isIdentical(w.normal,y.normal)&&!w.locked&&w.trackerType!==e)return!0}}catch(A){m.e(A)}finally{m.f()}}else{var x,v=Object(f.a)(o);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===y.parentId&&!b.locked&&b.trackerType!==e)return!0}}catch(A){v.e(A)}finally{v.f()}}break;default:if((null===y||void 0===y?void 0:y.trackerType)!==e)return!0}return!1}}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r=t.value;r.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(r.id)&&l.set(r.id,r.trackerType)}}catch(X){a.e(X)}finally{a.f()}var d={name:"Set Tracker Type for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(d.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){j(d.oldValues,d.newValue)}};c(d),j(l,e),p(h+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.SolarPanel&&m.set(x.id,x.trackerType)}}catch(X){w.e(X)}finally{w.f()}var v={name:"Set Tracker Type for All Solar Panel Arrays",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){S(v.newValue)}};c(v),S(e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var b,H=new Map,z=Object(f.a)(o);try{for(z.s();!(b=z.n()).done;){var R=b.value;R.type===V.SolarPanel&&R.foundationId===y.foundationId&&H.set(R.id,R.trackerType)}}catch(X){z.e(X)}finally{z.f()}var D={name:"Set Tracker Type for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:H,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){D.groupId&&T(D.groupId,D.newValue)}};c(D),T(y.foundationId,e),p(h+1)}break;case _.AllObjectsOfThisTypeOnSurface:var M=n(y);if(M){var W=new Map,I=M.type===V.Cuboid;if(I){var C,O=Object(f.a)(o);try{for(O.s();!(C=O.n()).done;){var F=C.value;F.type===V.SolarPanel&&F.parentId===y.parentId&&Tw.isIdentical(F.normal,y.normal)&&W.set(F.id,F.trackerType)}}catch(X){O.e(X)}finally{O.f()}}else{var k,Y=Object(f.a)(o);try{for(Y.s();!(k=Y.n()).done;){var L=k.value;L.type===V.SolarPanel&&L.parentId===y.parentId&&W.set(L.id,L.trackerType)}}catch(X){Y.e(X)}finally{Y.f()}}var E=I?y.normal:void 0,U={name:"Set Tracker Type for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:W,newValue:e,groupId:y.parentId,normal:E,undo:function(){var e,t=Object(f.a)(U.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){U.groupId&&P(U.groupId,U.normal,U.newValue)}};c(U),P(y.parentId,E,e),p(h+1)}break;default:var N=i(y.id),J=N?N.trackerType:y.trackerType,G={name:"Set Solar Panel Array Tracker Type",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){A(G.changedElementId,G.oldValue)},redo:function(){A(G.changedElementId,G.newValue)}};c(G),A(y.id,e),p(h+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.Tracker",v),onApply:function(){H(w)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsxs)(db.a,{style:{width:"120px"},value:w,onChange:function(e){return x(e)},children:[Object(gf.jsx)(b,{value:te.NO_TRACKER,title:me.t("solarPanelMenu.NoTracker",v),children:me.t("word.None",v)},"NONE"),Object(gf.jsx)(b,{value:te.HORIZONTAL_SINGLE_AXIS_TRACKER,title:me.t("solarPanelMenu.HorizontalSingleAxisTracker",v),children:"HSAT"},"HSAT"),Object(gf.jsx)(b,{value:te.VERTICAL_SINGLE_AXIS_TRACKER,title:me.t("solarPanelMenu.VerticalSingleAxisTracker",v),children:"VSAT"},"VSAT"),Object(gf.jsx)(b,{value:te.ALTAZIMUTH_DUAL_AXIS_TRACKER,title:me.t("solarPanelMenu.AltazimuthDualAxisTracker",v),children:"AADAT"},"AADAT")]}),Object(gf.jsx)("div",{style:{paddingTop:"20px",paddingRight:"10px",textAlign:"left",fontSize:"11px"},children:me.t("solarPanelMenu.SolarTrackerFollowsSun",v)})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},Sj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(dc),c=Ew(uc),s=Ew(fc),d=Ew(hc),h=Ew($r),p=Ew(Sr),y=Ew(_n),g=Ew($n),m=Ew(Ii),w=Ew(Ci),x=Ew(Oi),v=OP(V.SolarPanel),b=Object(r.useState)(null!==(t=null===v||void 0===v?void 0:v.poleHeight)&&void 0!==t?t:0),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useRef)(!1),j=Object(r.useRef)(),H=$f(),z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id))i.poleHeight=t}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(v&&function(e){if(v){switch(y){case _.AllObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.SolarPanel&&c.foundationId===(null===v||void 0===v?void 0:v.foundationId)&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(T){n.e(T)}finally{n.f()}break;case _.AllObjectsOfThisTypeOnSurface:var d=h(v);if(d)if(d.type===V.Cuboid){var u,p=Object(f.a)(o);try{for(p.s();!(u=p.n()).done;){var g=u.value;if(g.type===V.SolarPanel&&g.parentId===v.parentId&&Tw.isIdentical(g.normal,v.normal)&&!g.locked){var m=g;if(Math.abs(m.poleHeight-e)>At)return!0}}}catch(T){p.e(T)}finally{p.f()}}else{var w,x=Object(f.a)(o);try{for(x.s();!(w=x.n()).done;){var b=w.value;if(b.type===V.SolarPanel&&b.parentId===v.parentId&&!b.locked){var A=b;if(Math.abs(A.poleHeight-e)>At)return!0}}}catch(T){x.e(T)}finally{x.f()}}break;default:if(Math.abs((null===v||void 0===v?void 0:v.poleHeight)-e)>At)return!0}return!1}}(e)){switch(j.current=void 0,y){case _.AllSelectedObjectsOfThisType:S.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){S.current=!0;break}}}catch(fe){l.e(fe)}finally{l.f()}if(S.current)j.current=e,P(v.poleHeight);else{var g,x=new Map,b=Object(f.a)(o);try{for(b.s();!(g=b.n()).done;){var A=g.value;A.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(A.id)&&x.set(A.id,A.poleHeight)}}catch(fe){b.e(fe)}finally{b.f()}var T={name:"Set Pole Height for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){z(T.oldValues,T.newValue)}};p(T),z(x,e),w(m+1)}break;case _.AllObjectsOfThisType:S.current=!1;var H,R=Object(f.a)(o);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.SolarPanel&&.5*D.ly*Math.abs(Math.sin(D.tiltAngle))>e){S.current=!0;break}}}catch(fe){R.e(fe)}finally{R.f()}if(S.current)j.current=e,P(v.poleHeight);else{var M,W=new Map,I=Object(f.a)(o);try{for(I.s();!(M=I.n()).done;){var C=M.value;C.type===V.SolarPanel&&W.set(C.id,C.poleHeight)}}catch(fe){I.e(fe)}finally{I.f()}var O={name:"Set Pole Height for All Solar Panel Arrays",timestamp:Date.now(),oldValues:W,newValue:e,undo:function(){var e,t=Object(f.a)(O.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){d(V.SolarPanel,O.newValue)}};p(O),d(V.SolarPanel,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){S.current=!1;var F,k=Object(f.a)(o);try{for(k.s();!(F=k.n()).done;){var Y=F.value;if(Y.type===V.SolarPanel&&Y.foundationId===v.foundationId&&.5*Y.ly*Math.abs(Math.sin(Y.tiltAngle))>e){S.current=!0;break}}}catch(fe){k.e(fe)}finally{k.f()}if(S.current)j.current=e,P(v.poleHeight);else{var L,E=new Map,U=Object(f.a)(o);try{for(U.s();!(L=U.n()).done;){var N=L.value;N.type===V.SolarPanel&&N.foundationId===v.foundationId&&E.set(N.id,N.poleHeight)}}catch(fe){U.e(fe)}finally{U.f()}var J={name:"Set Pole Height for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:E,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(f.a)(J.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){J.groupId&&s(V.SolarPanel,J.groupId,J.newValue)}};p(J),s(V.SolarPanel,v.foundationId,e),w(m+1)}}break;case _.AllObjectsOfThisTypeOnSurface:var G=h(v);if(G){if(S.current=!1,G.type===V.Cuboid){var X,B=Object(f.a)(o);try{for(B.s();!(X=B.n()).done;){var K=X.value;if(K.type===V.SolarPanel&&K.parentId===v.parentId&&Tw.isIdentical(K.normal,v.normal)&&.5*K.ly*Math.abs(Math.sin(K.tiltAngle))>e){S.current=!0;break}}}catch(fe){B.e(fe)}finally{B.f()}}else{var q,Q=Object(f.a)(o);try{for(Q.s();!(q=Q.n()).done;){var Z=q.value;if(Z.type===V.SolarPanel&&Z.parentId===v.parentId&&.5*Z.ly*Math.abs(Math.sin(Z.tiltAngle))>e){S.current=!0;break}}}catch(fe){Q.e(fe)}finally{Q.f()}}if(S.current)j.current=e,P(v.poleHeight);else{var $=new Map,ee=G.type===V.Cuboid;if(ee){var te,le=Object(f.a)(o);try{for(le.s();!(te=le.n()).done;){var ae=te.value;ae.type===V.SolarPanel&&ae.parentId===v.parentId&&Tw.isIdentical(ae.normal,v.normal)&&$.set(ae.id,ae.poleHeight)}}catch(fe){le.e(fe)}finally{le.f()}}else{var oe,ie=Object(f.a)(o);try{for(ie.s();!(oe=ie.n()).done;){var re=oe.value;re.type===V.SolarPanel&&re.parentId===v.parentId&&$.set(re.id,re.poleHeight)}}catch(fe){ie.e(fe)}finally{ie.f()}}var ne=ee?v.normal:void 0,ce={name:"Set Pole Height for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:$,newValue:e,groupId:v.parentId,normal:ne,undo:function(){var e,t=Object(f.a)(ce.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(fe){t.e(fe)}finally{t.f()}},redo:function(){ce.groupId&&c(V.SolarPanel,ce.groupId,ce.normal,ce.newValue)}};p(ce),c(V.SolarPanel,v.parentId,ne,e),w(m+1)}}break;default:var se=i(v.id),de=se?se.poleHeight:v.poleHeight;if(S.current=.5*v.ly*Math.abs(Math.sin(v.tiltAngle))>e,S.current)j.current=e,P(de);else{var ue={name:"Set Solar Panel Array Pole Height",timestamp:Date.now(),oldValue:de,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){n(ue.changedElementId,ue.oldValue)},redo:function(){n(ue.changedElementId,ue.newValue)}};p(ue),n(v.id,e),w(m+1)}}a((function(t){t.actionState.solarPanelPoleHeight=e}))}},D=function(){S.current=!1,l(!1)},M=S.current?": "+me.t("message.NotApplicableToSelectedAction",H)+(void 0!==j.current?" ("+j.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:550,title:me.t("solarCollectorMenu.PoleHeight",H),rejectedMessage:M,onApply:function(){R(T)},onClose:D,onClickCancel:function(){D(),x()},onClickOk:function(){R(T),S.current||(l(!1),w(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:10,style:{width:120},step:.1,precision:2,value:T,onChange:P}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",H),": [0, 10] ",me.t("word.MeterAbbreviation",H)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",H)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",H)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",H)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",H)})]})})})]})})},jj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(_n),d=Ew($n),h=Ew(Ii),p=Ew(Ci),y=OP(V.SolarPanel),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.poleSpacing)&&void 0!==t?t:0),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.poleSpacing=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.foundationId===e&&!i.locked)i.poleSpacing=t}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){if(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)r.poleSpacing=l}}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked)o.poleSpacing=e}}catch(i){a.e(i)}finally{a.f()}}))},S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&!i.locked&&e.has(i.id))i.poleSpacing=t}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){if(y&&function(e){if(y){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleSpacing-e)>At)return!0}}}catch(H){l.e(H)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,c=Object(f.a)(o);try{for(c.s();!(r=c.n()).done;){var d=r.value;if(d.type===V.SolarPanel&&!d.locked){var u=d;if(Math.abs(u.poleSpacing-e)>At)return!0}}}catch(H){c.e(H)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var h,p=Object(f.a)(o);try{for(p.s();!(h=p.n()).done;){var g=h.value;if(g.type===V.SolarPanel&&g.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!g.locked){var m=g;if(Math.abs(m.poleSpacing-e)>At)return!0}}}catch(H){p.e(H)}finally{p.f()}break;case _.AllObjectsOfThisTypeOnSurface:var w=n(y);if(w)if(w.type===V.Cuboid){var x,v=Object(f.a)(o);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===y.parentId&&Tw.isIdentical(b.normal,y.normal)&&!b.locked){var A=b;if(Math.abs(A.poleSpacing-e)>At)return!0}}}catch(H){v.e(H)}finally{v.f()}}else{var T,P=Object(f.a)(o);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===y.parentId&&!S.locked){var j=S;if(Math.abs(j.poleSpacing-e)>At)return!0}}}catch(H){P.e(H)}finally{P.f()}}break;default:if(Math.abs((null===y||void 0===y?void 0:y.poleSpacing)-e)>At)return!0}return!1}}(e)){switch(s){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var d=t.value;d.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(d.id)&&l.set(d.id,d.poleSpacing)}}catch(B){r.e(B)}finally{r.f()}var g={name:"Set Pole Spacing for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){S(g.oldValues,g.newValue)}};c(g),S(l,e),p(h+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v=m.value;v.type===V.SolarPanel&&w.set(v.id,v.poleSpacing)}}catch(B){x.e(B)}finally{x.f()}var j={name:"Set Pole Spacing for All Solar Panel Arrays",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){P(j.newValue)}};c(j),P(e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var H,z=new Map,R=Object(f.a)(o);try{for(R.s();!(H=R.n()).done;){var D=H.value;D.type===V.SolarPanel&&D.foundationId===y.foundationId&&z.set(D.id,D.poleSpacing)}}catch(B){R.e(B)}finally{R.f()}var M={name:"Set Pole Spacing for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(M.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){M.groupId&&A(M.groupId,M.newValue)}};c(M),A(y.foundationId,e),p(h+1)}break;case _.AllObjectsOfThisTypeOnSurface:var W=n(y);if(W){var I=new Map,C=W.type===V.Cuboid;if(C){var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;k.type===V.SolarPanel&&k.parentId===y.parentId&&Tw.isIdentical(k.normal,y.normal)&&I.set(k.id,k.poleSpacing)}}catch(B){F.e(B)}finally{F.f()}}else{var Y,L=Object(f.a)(o);try{for(L.s();!(Y=L.n()).done;){var E=Y.value;E.type===V.SolarPanel&&E.parentId===y.parentId&&I.set(E.id,E.poleSpacing)}}catch(B){L.e(B)}finally{L.f()}}var U=C?y.normal:void 0,N={name:"Set Pole Spacing for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:I,newValue:e,groupId:y.parentId,normal:U,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&T(N.groupId,N.normal,N.newValue)}};c(N),T(y.parentId,U,e),p(h+1)}break;default:var J=i(y.id),G=J?J.poleSpacing:y.poleSpacing,X={name:"Set Solar Panel Array Pole Spacing",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b(X.changedElementId,X.oldValue)},redo:function(){b(X.changedElementId,X.newValue)}};c(X),b(y.id,e),p(h+1)}a((function(t){t.actionState.solarPanelPoleSpacing=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.PoleSpacing",v),onApply:function(){j(w),l(!1),p(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:1,style:{width:120},precision:2,value:w,onChange:x}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [1, 10] ",me.t("word.MeterAbbreviation",v)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},Hj=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew($r),s=Ew(Sr),d=Ew(_n),h=Ew($n),p=Ew(Ii),y=Ew(Ci),g=OP(V.SolarPanel),m=Object(r.useState)(null!==(t=null===g||void 0===g?void 0:g.frameColor)&&void 0!==t?t:"white"),w=Object(u.a)(m,2),x=w[0],v=w[1],b=$f(),A=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.frameColor=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.SolarPanel||i.foundationId!==e||i.locked||(i.frameColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e,t,l){o((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)&&(r.frameColor=l)}}}catch(n){i.e(n)}finally{i.f()}}))},S=function(e){o((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.SolarPanel||o.locked||(o.frameColor=e)}}catch(i){a.e(i)}finally{a.f()}}))},j=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.SolarPanel&&!i.locked&&e.has(i.id)&&(i.frameColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},H=function(e){if(g&&function(e){if(g){switch(d){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.frameColor!==e)return!0}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var o,r=Object(f.a)(i);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.SolarPanel&&!n.locked&&n.frameColor!==e)return!0}}catch(A){r.e(A)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(i);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.SolarPanel&&h.foundationId===(null===g||void 0===g?void 0:g.foundationId)&&!h.locked&&h.frameColor!==e)return!0}}catch(A){u.e(A)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:var p=c(g);if(p)if(p.type===V.Cuboid){var y,m=Object(f.a)(i);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(w.type===V.SolarPanel&&w.parentId===g.parentId&&Tw.isIdentical(w.normal,g.normal)&&!w.locked&&w.frameColor!==e)return!0}}catch(A){m.e(A)}finally{m.f()}}else{var x,v=Object(f.a)(i);try{for(v.s();!(x=v.n()).done;){var b=x.value;if(b.type===V.SolarPanel&&b.parentId===g.parentId&&!b.locked&&b.frameColor!==e)return!0}}catch(A){v.e(A)}finally{v.f()}}break;default:if((null===g||void 0===g?void 0:g.frameColor)!==e)return!0}return!1}}(e)){switch(d){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(i);try{for(a.s();!(t=a.n()).done;){var r,h=t.value;if(h.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(h.id))l.set(h.id,null!==(r=h.frameColor)&&void 0!==r?r:"white")}}catch($){a.e($)}finally{a.f()}var m={name:"Set Frame Color for Selected Solar Panels",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch($){t.e($)}finally{t.f()}},redo:function(){j(m.oldValues,m.newValue)}};s(m),j(l,e),y(p+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(i);try{for(v.s();!(w=v.n()).done;){var b,H=w.value;if(H.type===V.SolarPanel)x.set(H.id,null!==(b=H.frameColor)&&void 0!==b?b:"white")}}catch($){v.e($)}finally{v.f()}var z={name:"Set Frame Color for All Solar Panels",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch($){t.e($)}finally{t.f()}},redo:function(){S(z.newValue)}};s(z),S(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(g.foundationId){var R,D=new Map,M=Object(f.a)(i);try{for(M.s();!(R=M.n()).done;){var W,I=R.value;if(I.type===V.SolarPanel&&I.foundationId===g.foundationId)D.set(I.id,null!==(W=I.frameColor)&&void 0!==W?W:"white")}}catch($){M.e($)}finally{M.f()}var C={name:"Set Frame Color for All Solar Panels Above Foundation",timestamp:Date.now(),oldValues:D,newValue:e,groupId:g.foundationId,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch($){t.e($)}finally{t.f()}},redo:function(){C.groupId&&T(C.groupId,C.newValue)}};s(C),T(g.foundationId,e),y(p+1)}break;case _.AllObjectsOfThisTypeOnSurface:var O=c(g);if(O){var F=new Map,k=O.type===V.Cuboid;if(k){var Y,L=Object(f.a)(i);try{for(L.s();!(Y=L.n()).done;){var E,U=Y.value;if(U.type===V.SolarPanel&&U.parentId===g.parentId&&Tw.isIdentical(U.normal,g.normal))F.set(U.id,null!==(E=U.frameColor)&&void 0!==E?E:"white")}}catch($){L.e($)}finally{L.f()}}else{var N,J=Object(f.a)(i);try{for(J.s();!(N=J.n()).done;){var G,X=N.value;if(X.type===V.SolarPanel&&X.parentId===g.parentId)F.set(X.id,null!==(G=X.frameColor)&&void 0!==G?G:"white")}}catch($){J.e($)}finally{J.f()}}var B=k?g.normal:void 0,K={name:"Set Frame Color for All Solar Panels on Surface",timestamp:Date.now(),oldValues:F,newValue:e,groupId:g.parentId,normal:B,undo:function(){var e,t=Object(f.a)(K.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];A(a,o)}}catch($){t.e($)}finally{t.f()}},redo:function(){K.groupId&&P(K.groupId,K.normal,K.newValue)}};s(K),P(g.parentId,B,e),y(p+1)}break;default:var q=n(g.id),Q=q?q.frameColor:g.frameColor,Z={name:"Set Frame Color of Selected Solar Panel",timestamp:Date.now(),oldValue:Q,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){A(g.id,Z.oldValue)},redo:function(){A(g.id,Z.newValue)}};s(Z),A(g.id,e),y(p+1)}o((function(t){t.actionState.solarPanelFrameColor=e}))}};return Object(gf.jsx)(kP,{width:680,title:me.t("solarPanelMenu.FrameColor",b),onApply:function(){H(x)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:10,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==x&&void 0!==x?x:null===g||void 0===g?void 0:g.color)&&void 0!==l?l:"white",onChangeComplete:function(e){v(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:14,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){h(e.target.value)},value:d,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",b)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",b)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",b)})]})})})]})})},zj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew($r),c=Ew(Sr),s=Ew(_n),d=Ew($n),h=Ew(Ii),p=Ew(Ci),y=Ew((function(e){return e.elements.find((function(e){return e.selected&&e.type===V.SolarPanel}))})),g=Object(r.useState)(null!==(t=null===y||void 0===y?void 0:y.inverterEfficiency)&&void 0!==t?t:.95),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.inverterEfficiency=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.SolarPanel||i.foundationId!==e||i.locked||(i.inverterEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)&&(r.inverterEfficiency=l)}}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.SolarPanel||o.locked||(o.inverterEfficiency=e)}}catch(i){a.e(i)}finally{a.f()}}))},S=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.SolarPanel&&!i.locked&&e.has(i.id)&&(i.inverterEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},j=function(e){var t,l;if(y&&function(e){var t;switch(s){case _.AllSelectedObjectsOfThisType:var l,a=Object(f.a)(o);try{for(a.s();!(l=a.n()).done;){var i=l.value;if(i.type===V.SolarPanel&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r,c=i;if(Math.abs((null!==(r=c.inverterEfficiency)&&void 0!==r?r:.95)-e)>At)return!0}}}catch(I){a.e(I)}finally{a.f()}break;case _.AllObjectsOfThisType:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.SolarPanel&&!h.locked){var p,g=h;if(Math.abs((null!==(p=g.inverterEfficiency)&&void 0!==p?p:.95)-e)>At)return!0}}}catch(I){u.e(I)}finally{u.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var x=m.value;if(x.type===V.SolarPanel&&x.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!x.locked){var v,b=x;if(Math.abs((null!==(v=b.inverterEfficiency)&&void 0!==v?v:.95)-e)>At)return!0}}}catch(I){w.e(I)}finally{w.f()}break;case _.AllObjectsOfThisTypeOnSurface:var A=n(y);if(A)if(A.type===V.Cuboid){var T,P=Object(f.a)(o);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===y.parentId&&Tw.isIdentical(S.normal,y.normal)&&!S.locked){var j,H=S;if(Math.abs((null!==(j=H.inverterEfficiency)&&void 0!==j?j:.95)-e)>At)return!0}}}catch(I){P.e(I)}finally{P.f()}}else{var z,R=Object(f.a)(o);try{for(R.s();!(z=R.n()).done;){var D=z.value;if(D.type===V.SolarPanel&&D.parentId===y.parentId&&!D.locked){var M,W=D;if(Math.abs((null!==(M=W.inverterEfficiency)&&void 0!==M?M:.95)-e)>At)return!0}}}catch(I){R.e(I)}finally{R.f()}}break;default:if(Math.abs((null!==(t=null===y||void 0===y?void 0:y.inverterEfficiency)&&void 0!==t?t:.95)-e)>At)return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var a,r=new Map,d=Object(f.a)(o);try{for(d.s();!(a=d.n()).done;){var g,m=a.value;if(m.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(m.id))r.set(m.id,null!==(g=m.inverterEfficiency)&&void 0!==g?g:.95)}}catch(ee){d.e(ee)}finally{d.f()}var w={name:"Set Inverter Efficiency for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(ee){t.e(ee)}finally{t.f()}},redo:function(){S(w.oldValues,w.newValue)}};c(w),S(r,e),p(h+1);break;case _.AllObjectsOfThisType:var x,v=new Map,j=Object(f.a)(o);try{for(j.s();!(x=j.n()).done;){var H,z=x.value;if(z.type===V.SolarPanel)v.set(z.id,null!==(H=z.inverterEfficiency)&&void 0!==H?H:.95)}}catch(ee){j.e(ee)}finally{j.f()}var R={name:"Set Inverter Efficiency for All Solar Panel Arrays",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(ee){t.e(ee)}finally{t.f()}},redo:function(){P(R.newValue)}};c(R),P(e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I,C=D.value;if(C.type===V.SolarPanel&&C.foundationId===y.foundationId)M.set(C.id,null!==(I=C.inverterEfficiency)&&void 0!==I?I:.95)}}catch(ee){W.e(ee)}finally{W.f()}var O={name:"Set Inverter Efficiency for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:M,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(O.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(ee){t.e(ee)}finally{t.f()}},redo:function(){O.groupId&&A(O.groupId,O.newValue)}};c(O),A(y.foundationId,e),p(h+1)}break;case _.AllObjectsOfThisTypeOnSurface:var F=n(y);if(F){var k=new Map,Y=F.type===V.Cuboid;if(Y){var L,E=Object(f.a)(o);try{for(E.s();!(L=E.n()).done;){var U,N=L.value;if(N.type===V.SolarPanel&&N.parentId===y.parentId&&Tw.isIdentical(N.normal,y.normal))k.set(N.id,null!==(U=N.inverterEfficiency)&&void 0!==U?U:.95)}}catch(ee){E.e(ee)}finally{E.f()}}else{var J,G=Object(f.a)(o);try{for(G.s();!(J=G.n()).done;){var X,B=J.value;if(B.type===V.SolarPanel&&B.parentId===y.parentId)k.set(B.id,null!==(X=B.inverterEfficiency)&&void 0!==X?X:.95)}}catch(ee){G.e(ee)}finally{G.f()}}var K=Y?y.normal:void 0,q={name:"Set Inverter Efficiency for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:k,newValue:e,groupId:y.parentId,normal:K,undo:function(){var e,t=Object(f.a)(q.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(ee){t.e(ee)}finally{t.f()}},redo:function(){q.groupId&&T(q.groupId,q.normal,q.newValue)}};c(q),T(y.parentId,K,e),p(h+1)}break;default:var Q=i(y.id),Z=Q?null!==(t=Q.inverterEfficiency)&&void 0!==t?t:.95:null!==(l=y.inverterEfficiency)&&void 0!==l?l:.95,$={name:"Set Solar Panel Array Inverter Efficiency",timestamp:Date.now(),oldValue:Z,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){b($.changedElementId,$.oldValue)},redo:function(){b($.changedElementId,$.newValue)}};c($),b(y.id,e),p(h+1)}};return Object(gf.jsx)(kP,{width:550,title:me.t("solarPanelMenu.InverterEfficiency",v),onApply:function(){j(w)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.5,max:1,step:.01,style:{width:120},precision:2,value:w,onChange:x}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:["[0.5, 1.0]",Object(gf.jsx)("br",{}),me.t("solarPanelMenu.InverterEfficiencyExplained",v)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",v)})]})})})]})})},Rj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Vi),i=Ew(Fi),n=Ew(Zr),c=Ew($r),s=Ew(Sr),d=Ew(_n),h=Ew($n),p=Ew(Ii),y=Ew(Ci),g=Ew(Oi),m=Ew((function(e){return e.elements.find((function(e){return e.selected&&e.type===V.SolarPanel}))})),w=Object(r.useState)(!1),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(!1),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)({left:0,top:0,bottom:0,right:0}),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useRef)(null),M=Object(r.useRef)(null!==(t=null===m||void 0===m?void 0:m.dcToAcRatio)&&void 0!==t?t:1),W={lng:o};Object(r.useEffect)((function(){var e;m&&(M.current=null!==(e=m.dcToAcRatio)&&void 0!==e?e:1)}),[m.dcToAcRatio]);var I=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.SolarPanel&&i.id===e&&!i.locked){i.dcToAcRatio=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},C=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.SolarPanel||i.foundationId!==e||i.locked||(i.dcToAcRatio=t)}}catch(r){o.e(r)}finally{o.f()}}))},O=function(e,t,l){a((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.type===V.SolarPanel&&!r.locked){(t?r.parentId===e&&Tw.isIdentical(r.normal,t):r.parentId===e)&&(r.dcToAcRatio=l)}}}catch(n){i.e(n)}finally{i.f()}}))},F=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.SolarPanel||o.locked||(o.dcToAcRatio=e)}}catch(i){a.e(i)}finally{a.f()}}))},k=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.SolarPanel&&!i.locked&&e.has(i.id)&&(i.dcToAcRatio=t)}}catch(r){o.e(r)}finally{o.f()}}))},Y=function(e){var t,l;if(m&&function(e){var t;switch(d){case _.AllSelectedObjectsOfThisType:var l,a=Object(f.a)(i);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.SolarPanel&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var r,n=o;if(Math.abs((null!==(r=n.dcToAcRatio)&&void 0!==r?r:1)-e)>At)return!0}}}catch(I){a.e(I)}finally{a.f()}break;case _.AllObjectsOfThisType:var s,u=Object(f.a)(i);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.SolarPanel&&!h.locked){var p,y=h;if(Math.abs((null!==(p=y.dcToAcRatio)&&void 0!==p?p:1)-e)>At)return!0}}}catch(I){u.e(I)}finally{u.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var g,w=Object(f.a)(i);try{for(w.s();!(g=w.n()).done;){var x=g.value;if(x.type===V.SolarPanel&&x.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!x.locked){var v,b=x;if(Math.abs((null!==(v=b.dcToAcRatio)&&void 0!==v?v:1)-e)>At)return!0}}}catch(I){w.e(I)}finally{w.f()}break;case _.AllObjectsOfThisTypeOnSurface:var A=c(m);if(A)if(A.type===V.Cuboid){var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.type===V.SolarPanel&&S.parentId===m.parentId&&Tw.isIdentical(S.normal,m.normal)&&!S.locked){var j,H=S;if(Math.abs((null!==(j=H.dcToAcRatio)&&void 0!==j?j:1)-e)>At)return!0}}}catch(I){P.e(I)}finally{P.f()}}else{var z,R=Object(f.a)(i);try{for(R.s();!(z=R.n()).done;){var D=z.value;if(D.type===V.SolarPanel&&D.parentId===m.parentId&&!D.locked){var M,W=D;if(Math.abs((null!==(M=W.dcToAcRatio)&&void 0!==M?M:1)-e)>At)return!0}}}catch(I){R.e(I)}finally{R.f()}}break;default:if(Math.abs((null!==(t=null===m||void 0===m?void 0:m.dcToAcRatio)&&void 0!==t?t:1)-e)>At)return!0}return!1}(e)){switch(d){case _.AllSelectedObjectsOfThisType:var a,o=new Map,r=Object(f.a)(i);try{for(r.s();!(a=r.n()).done;){var h,g=a.value;if(g.type===V.SolarPanel&&Ew.getState().selectedElementIdSet.has(g.id))o.set(g.id,null!==(h=g.dcToAcRatio)&&void 0!==h?h:1)}}catch(le){r.e(le)}finally{r.f()}var w={name:"Set DC-AC Ratio for Selected Solar Panel Arrays",timestamp:Date.now(),oldValues:o,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];I(a,o)}}catch(le){t.e(le)}finally{t.f()}},redo:function(){k(w.oldValues,w.newValue)}};s(w),k(o,e),y(p+1);break;case _.AllObjectsOfThisType:var x,A=new Map,T=Object(f.a)(i);try{for(T.s();!(x=T.n()).done;){var P,S=x.value;if(S.type===V.SolarPanel)A.set(S.id,null!==(P=S.dcToAcRatio)&&void 0!==P?P:1)}}catch(le){T.e(le)}finally{T.f()}var j={name:"Set DC-AC Ratio for All Solar Panel Arrays",timestamp:Date.now(),oldValues:A,newValue:e,undo:function(){var e,t=Object(f.a)(j.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];I(a,o)}}catch(le){t.e(le)}finally{t.f()}},redo:function(){F(j.newValue)}};s(j),F(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var H,z=new Map,R=Object(f.a)(i);try{for(R.s();!(H=R.n()).done;){var D,M=H.value;if(M.type===V.SolarPanel&&M.foundationId===m.foundationId)z.set(M.id,null!==(D=M.dcToAcRatio)&&void 0!==D?D:1)}}catch(le){R.e(le)}finally{R.f()}var W={name:"Set DC-AC Ratio for All Solar Panel Arrays Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(W.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];I(a,o)}}catch(le){t.e(le)}finally{t.f()}},redo:function(){W.groupId&&C(W.groupId,W.newValue)}};s(W),C(m.foundationId,e),y(p+1)}break;case _.AllObjectsOfThisTypeOnSurface:var Y=c(m);if(Y){var L=new Map,E=Y.type===V.Cuboid;if(E){var U,N=Object(f.a)(i);try{for(N.s();!(U=N.n()).done;){var J,G=U.value;if(G.type===V.SolarPanel&&G.parentId===m.parentId&&Tw.isIdentical(G.normal,m.normal))L.set(G.id,null!==(J=G.dcToAcRatio)&&void 0!==J?J:1)}}catch(le){N.e(le)}finally{N.f()}}else{var X,B=Object(f.a)(i);try{for(B.s();!(X=B.n()).done;){var K,q=X.value;if(q.type===V.SolarPanel&&q.parentId===m.parentId)L.set(q.id,null!==(K=q.dcToAcRatio)&&void 0!==K?K:1)}}catch(le){B.e(le)}finally{B.f()}}var Q=E?m.normal:void 0,Z={name:"Set DC-AC Ratio for All Solar Panel Arrays on Surface",timestamp:Date.now(),oldValues:L,newValue:e,groupId:m.parentId,normal:Q,undo:function(){var e,t=Object(f.a)(Z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];I(a,o)}}catch(le){t.e(le)}finally{t.f()}},redo:function(){Z.groupId&&O(Z.groupId,Z.normal,Z.newValue)}};s(Z),O(m.parentId,Q,e),y(p+1)}break;default:var $=n(m.id),ee=$?null!==(t=$.dcToAcRatio)&&void 0!==t?t:1:null!==(l=m.dcToAcRatio)&&void 0!==l?l:1,te={name:"Set Solar Panel Array DC-AC Ratio",timestamp:Date.now(),oldValue:ee,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){I(te.changedElementId,te.oldValue)},redo:function(){I(te.changedElementId,te.newValue)}};s(te),I(m.id,e),y(p+1)}b(!v)}},L=function(){var e;M.current=null!==(e=m.dcToAcRatio)&&void 0!==e?e:1,l(!1)},E=function(){Y(M.current),l(!1),y(0)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:550,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return S(!0)},onMouseOut:function(){return S(!1)},children:me.t("solarPanelMenu.DcToAcSizeRatio",W)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){Y(M.current)},children:me.t("word.Apply",W)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){L(),g()},children:me.t("word.Cancel",W)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:E,children:me.t("word.OK",W)},"OK")],onCancel:L,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!P,bounds:z,onStart:function(e,t){return function(e,t){if(D.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=D.current.getBoundingClientRect();R({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:D,children:e})})},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:2,step:.01,style:{width:120},precision:2,value:M.current,onChange:function(e){M.current=e,b(!v)},onPressEnter:E}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:["[1.0, 2.0]",Object(gf.jsx)("br",{}),me.t("solarPanelMenu.DcToAcSizeRatioExplained",W)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){h(e.target.value),b(!v)},value:d,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("solarPanelMenu.OnlyThisSolarPanel",W)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeOnSurface,children:me.t("solarPanelMenu.AllSolarPanelsOnSurface",W)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("solarPanelMenu.AllSolarPanelsAboveFoundation",W)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("solarPanelMenu.AllSelectedSolarPanels",W)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("solarPanelMenu.AllSolarPanels",W)})]})})})]})})})},Dj=n.a.memo((function(){var e,t,l,a,o=Ew(ac),i=Ew(Sr),n=Ew(Ci),c=Ew(Vi),s=OP(V.SolarPanel),d=Object(r.useState)(!1),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)(!1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(!1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!1),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useState)(!1),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useState)(!1),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=Object(r.useState)(!1),q=Object(u.a)(K,2),Q=q[0],Z=q[1],_=Object(r.useState)(!1),$=Object(u.a)(_,2),ee=$[0],le=$[1],ae=Object(r.useState)(!1),oe=Object(u.a)(ae,2),ie=oe[0],re=oe[1],ne=zP(s),ce=ne.labelText,se=ne.setLabelText,de=RP(s),ue=DP(s,ce),fe=IP(s),he=WP(s),pe=MP(s),ye=CP(s);if(!s)return null;var ge={lng:c},we=(new Me.Vector3).fromArray(s.normal),xe=!(null===s||void 0===s?void 0:s.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"solar-panel-copy",paddingLeft:"36px"}),xe&&Object(gf.jsx)(PP,{keyName:"solar-panel-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"solar-panel-lock"}),s&&xe&&Object(gf.jsxs)(gf.Fragment,{children:[h&&Object(gf.jsx)(mj,{setDialogVisible:p}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(0),p(!0)},style:{paddingLeft:"36px"},children:[me.t("solarPanelMenu.ChangePvModel",ge)," (",s.pvModelName,") ..."]},"solar-panel-change"),m&&Object(gf.jsx)(xj,{setDialogVisible:w}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px",width:"150px"},onClick:function(){n(0),w(!0)},children:[me.t("solarPanelMenu.Orientation",ge)," ..."]},"solar-panel-orientation"),S&&Object(gf.jsx)(vj,{setDialogVisible:j}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),j(!0)},children:[me.t("word.Length",ge)," ..."]},"solar-panel-length"),b&&Object(gf.jsx)(bj,{setDialogVisible:A}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),A(!0)},children:[me.t("word.Width",ge)," ..."]},"solar-panel-width"),R&&Object(gf.jsx)(zj,{setDialogVisible:D}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),D(!0)},children:[me.t("solarPanelMenu.InverterEfficiency",ge)," ..."]},"solar-panel-inverter-efficiency"),I&&Object(gf.jsx)(Rj,{setDialogVisible:C}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),C(!0)},children:[me.t("solarPanelMenu.DcToAcSizeRatio",ge)," ..."]},"solar-panel-dc-ac-ratio"),s.parentType===V.Wall&&Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),Y(!0)},children:[me.t("solarPanelMenu.TiltAngle",ge)," ..."]},"solar-panel-tilt-angle")}),k&&Object(gf.jsx)(Aj,{setDialogVisible:Y,isOnWall:s.parentType===V.Wall}),we&&Tw.isSame(we,Rt)&&Object(gf.jsxs)(gf.Fragment,{children:[s.trackerType===te.NO_TRACKER&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),Y(!0)},children:[me.t("solarPanelMenu.TiltAngle",ge)," ..."]},"solar-panel-tilt-angle"),U&&Object(gf.jsx)(Tj,{setDialogVisible:N}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),N(!0)},children:[me.t("solarCollectorMenu.RelativeAzimuth",ge)," ..."]},"solar-panel-relative-azimuth"),s.parentType!==V.Roof&&Object(gf.jsxs)(gf.Fragment,{children:[X&&Object(gf.jsx)(Pj,{setDialogVisible:B}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),B(!0)},children:[me.t("solarPanelMenu.Tracker",ge)," ..."]},"solar-panel-tracker")]})]}),xe&&Object(gf.jsxs)(gf.Fragment,{children:[ie&&Object(gf.jsx)(Hj,{setDialogVisible:re}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){n(0),re(!0)},children:[me.t("solarPanelMenu.FrameColor",ge)," ..."]},"solar-panel-frame-color")]}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.drawSunBeam),onChange:function(e){return function(e){if(s){var t={name:"Show Sun Beam",timestamp:Date.now(),checked:!s.drawSunBeam,selectedElementId:s.id,selectedElementType:V.SolarPanel,undo:function(){o(s.id,!t.checked)},redo:function(){o(s.id,t.checked)}};i(t),o(s.id,e)}}(e.target.checked)},children:me.t("solarCollectorMenu.DrawSunBeam",ge)})},"solar-panel-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("solarCollectorMenu.Pole",ge),style:{paddingLeft:"24px"},children:[Q&&Object(gf.jsx)(Sj,{setDialogVisible:Z}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(0),Z(!0)},children:[me.t("solarCollectorMenu.PoleHeight",ge)," ..."]},"solar-panel-pole-height"),ee&&Object(gf.jsx)(jj,{setDialogVisible:le}),Object(gf.jsxs)(Qv.a.Item,{onClick:function(){n(0),le(!0)},children:[me.t("solarPanelMenu.PoleSpacing",ge)," ..."]},"solar-panel-pole-spacing")]},"solar-panel-pole"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",ge),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:de,children:me.t("labelSubMenu.KeepShowingLabel",ge)})},"solar-panel-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",ge)+":",value:ce,onChange:function(e){return se(e.target.value)},onPressEnter:ue})},"solar-panel-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",ge)+":",min:0,max:100,step:1,precision:1,value:null!==(e=s.labelHeight)&&void 0!==e?e:.5,onChange:function(e){return ye(e)}})},"solar-panel-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",ge)+":",min:10,max:100,step:1,precision:0,value:null!==(t=s.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return pe(e)}})},"solar-panel-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",ge)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=s.labelSize)&&void 0!==l?l:.2,onChange:function(e){return he(e)}})},"solar-panel-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",ge)+":",value:null!==(a=s.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return fe(e.target.value)}})},"solar-panel-label-color")]})]},"solar-panel-label")]})]})})),Mj=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(Sn),n=Ew(jn),c=Ew(Hn),s=Ew($r),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.ParabolicTrough),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.ly)&&void 0!==t?t:9),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useRef)(!1),P=Object(r.useRef)(),S=$f(),j=function(e,t){return!function(e,t){var l=s(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.ParabolicTrough&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(a);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!p.locked){var y=p;if(Math.abs(y.ly-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(P.current=void 0,h){case _.AllSelectedObjectsOfThisType:T.current=!1;var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&j(r,e)){T.current=!0;break}}}catch(X){l.e(X)}finally{l.f()}if(T.current)P.current=e,A(w.ly);else{var s,p=new Map,m=Object(f.a)(a);try{for(m.s();!(s=m.n()).done;){var x=s.value;x.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(x.id)&&p.set(x.id,x.ly)}}catch(X){m.e(X)}finally{m.f()}var v={name:"Set Length for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:p,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){H(v.oldValues,v.newValue)}};d(v),H(p,e),g(y+1)}break;case _.AllObjectsOfThisType:T.current=!1;var b,S=Object(f.a)(a);try{for(S.s();!(b=S.n()).done;){var z=b.value;if(z.type===V.ParabolicTrough&&j(z,e)){T.current=!0;break}}}catch(X){S.e(X)}finally{S.f()}if(T.current)P.current=e,A(w.ly);else{var R,D=new Map,M=Object(f.a)(a);try{for(M.s();!(R=M.n()).done;){var W=R.value;W.type===V.ParabolicTrough&&D.set(W.id,W.ly)}}catch(X){M.e(X)}finally{M.f()}var I={name:"Set Length for All Parabolic Troughs",timestamp:Date.now(),oldValues:D,newValue:e,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){c(V.ParabolicTrough,I.newValue)}};d(I),c(V.ParabolicTrough,e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var C,O=Object(f.a)(a);try{for(O.s();!(C=O.n()).done;){var F=C.value;if(F.type===V.ParabolicTrough&&F.foundationId===w.foundationId&&j(F,e)){T.current=!0;break}}}catch(X){O.e(X)}finally{O.f()}if(T.current)P.current=e,A(w.ly);else{var k,Y=new Map,L=Object(f.a)(a);try{for(L.s();!(k=L.n()).done;){var E=k.value;E.type===V.ParabolicTrough&&E.foundationId===w.foundationId&&Y.set(E.id,E.ly)}}catch(X){L.e(X)}finally{L.f()}var U={name:"Set Length for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:Y,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(U.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){U.groupId&&n(V.ParabolicTrough,U.groupId,U.newValue)}};d(U),n(V.ParabolicTrough,w.foundationId,e),g(y+1)}}break;default:var N=o(w.id),J=N?N.ly:w.ly;if(T.current=j(w,e),T.current)P.current=e,A(J);else{var G={name:"Set Parabolic Trough Length",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){i(G.changedElementId,G.oldValue)},redo:function(){i(G.changedElementId,G.newValue)}};d(G),i(w.id,e),g(y+1)}}},R=function(){T.current=!1,l(!1)};if((null===w||void 0===w?void 0:w.type)!==V.ParabolicTrough)return null;var D=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(void 0!==P.current?" ("+P.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Length",S),rejectedMessage:D,onApply:function(){z(b)},onClose:R,onClickCancel:function(){R(),m()},onClickOk:function(){z(b),T.current||(l(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:w.moduleLength,max:100*w.moduleLength,step:w.moduleLength,precision:2,style:{width:120},value:b,onChange:function(e){A(function(e){if(!w)return 1;var t=null!==e&&void 0!==e?e:1;return Math.max(1,Math.ceil((t-w.moduleLength/2)/w.moduleLength))*w.moduleLength}(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("parabolicTroughMenu.ModuleLength",S)+": "+w.moduleLength.toFixed(1)+" "+me.t("word.MeterAbbreviation",S),Object(gf.jsx)("br",{}),Math.round(b/w.moduleLength)+" "+me.t("parabolicTroughMenu.ModulesLong",S),Object(gf.jsx)("br",{}),me.t("word.Maximum",S),": 100 ",me.t("parabolicTroughMenu.Modules",S)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",S)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",S)})]})})})]})})},Wj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(An),c=Ew(Tn),s=Ew(Pn),d=Ew($r),h=Ew(Sr),p=Ew(Rc),y=Ew(Dc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicTrough),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.lx)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.lx=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicTrough&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.lx-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.lx)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Width for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.ParabolicTrough&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.lx);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicTrough&&M.set(I.id,I.lx)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Width for All Parabolic Troughs",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,C.newValue)}};h(C),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicTrough&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.lx);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicTrough&&U.foundationId===x.foundationId&&L.set(U.id,U.lx)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Width for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicTrough,N.groupId,N.newValue)}};h(N),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.lx:x.lx;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Trough Width",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughWidth=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Width",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 10 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",j)})]})})})]})})},Ij=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(dc),c=Ew(fc),s=Ew(hc),d=Ew($r),h=Ew(Sr),p=Ew(Rc),y=Ew(Dc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicTrough),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.poleHeight)&&void 0!==t?t:1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.tiltAngle=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.ParabolicTrough&&y.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var v=m.value;if(v.type===V.ParabolicTrough&&v.parentId===x.parentId&&!v.locked){var b=v;if(Math.abs(b.poleHeight-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}}break;default:if(Math.abs((null===x||void 0===x?void 0:x.poleHeight)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(f.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(b.id)&&w.set(b.id,b.poleHeight)}}catch(B){v.e(B)}finally{v.f()}var A={name:"Set Pole Height for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){H(A.oldValues,A.newValue)}};h(A),H(w,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var j,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;if(R.type===V.ParabolicTrough&&.5*R.ly*Math.abs(Math.sin(R.tiltAngle))>e){P.current=!0;break}}}catch(B){z.e(B)}finally{z.f()}if(P.current)S.current=e,T(x.poleHeight);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicTrough&&M.set(I.id,I.poleHeight)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Pole Height for All Parabolic Troughs",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,C.newValue)}};h(C),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicTrough&&k.foundationId===x.foundationId&&.5*k.ly*Math.abs(Math.sin(k.tiltAngle))>e){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.poleHeight);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicTrough&&U.foundationId===x.foundationId&&L.set(U.id,U.poleHeight)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Pole Height for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicTrough,N.groupId,N.newValue)}};h(N),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.poleHeight:x.poleHeight;if(P.current=.5*x.lx*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Trough Pole Height",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughPoleHeight=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",j),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [0, 5] ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",j)})]})})})]})})},Cj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Ec),c=Ew(Uc),s=Ew(Nc),d=Ew($r),h=Ew(Sr),p=Ew(Rc),y=Ew(Dc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicTrough),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.latusRectum)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.latusRectum=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.latusRectum=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.latusRectum-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.latusRectum-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicTrough&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.latusRectum-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.latusRectum)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.latusRectum);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.latusRectum)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Latus Rectum for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.ParabolicTrough&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.latusRectum);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicTrough&&M.set(I.id,I.latusRectum)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Latus Rectum for All Parabolic Troughs",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,C.newValue)}};h(C),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicTrough&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.latusRectum);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicTrough&&U.foundationId===x.foundationId&&L.set(U.id,U.latusRectum)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Latus Rectum for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicTrough,N.groupId,N.newValue)}};h(N),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.latusRectum:x.latusRectum;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Trough Latus Rectum",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughLatusRectum=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicTroughMenu.LatusRectum",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 20 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",j)})]})})})]})})},Oj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Vc),c=Ew(Jc),s=Ew(Gc),d=Ew($r),h=Ew(Sr),p=Ew(Rc),y=Ew(Dc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicTrough),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.moduleLength)&&void 0!==t?t:3),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.moduleLength=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.moduleLength=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.moduleLength-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.moduleLength-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicTrough&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.moduleLength-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.moduleLength)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.moduleLength);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.moduleLength)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Module Length for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.ParabolicTrough&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.moduleLength);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicTrough&&M.set(I.id,I.moduleLength)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Module Length for All Parabolic Troughs",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,C.newValue)}};h(C),s(V.ParabolicTrough,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicTrough&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.moduleLength);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicTrough&&U.foundationId===x.foundationId&&L.set(U.id,U.moduleLength)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Module Length for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicTrough,N.groupId,N.newValue)}};h(N),c(V.ParabolicTrough,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.moduleLength:x.moduleLength;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Trough Module Length",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicTroughModuleLength=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicTrough)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicTroughMenu.LatusRectum",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 10 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",j)})]})})})]})})},Fj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(mc),c=Ew(wc),s=Ew(xc),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicTrough),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.reflectance)&&void 0!==t?t:.9),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.reflectance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.reflectance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Reflectance for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&v.set(A.id,A.reflectance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Reflectance for All Parabolic Troughs",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,P.newValue)}};d(P),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicTrough&&z.foundationId===m.foundationId&&j.set(z.id,z.reflectance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Reflectance for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicTrough,R.groupId,R.newValue)}};d(R),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.reflectance:m.reflectance,W={name:"Set Parabolic Trough Reflectance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicTroughReflectance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicTrough?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},kj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(vc),c=Ew(bc),s=Ew(Ac),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicTrough),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.absorptance)&&void 0!==t?t:.95),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.absorptance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.absorptance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.absorptance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.absorptance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.absorptance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.absorptance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Absorptance for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&v.set(A.id,A.absorptance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Absorptance for All Parabolic Troughs",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,P.newValue)}};d(P),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicTrough&&z.foundationId===m.foundationId&&j.set(z.id,z.absorptance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Absorptance for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicTrough,R.groupId,R.newValue)}};d(R),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.absorptance:m.absorptance,W={name:"Set Parabolic Trough Absorptance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicTroughAbsorptance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicTrough?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},Yj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Tc),c=Ew(Pc),s=Ew(Sc),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicTrough),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.opticalEfficiency)&&void 0!==t?t:.7),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.opticalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.opticalEfficiency-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.opticalEfficiency-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.opticalEfficiency-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.opticalEfficiency)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.opticalEfficiency)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Optical Efficiency for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&v.set(A.id,A.opticalEfficiency)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Optical Efficiency for All Parabolic Troughs",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,P.newValue)}};d(P),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicTrough&&z.foundationId===m.foundationId&&j.set(z.id,z.opticalEfficiency)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Optical Efficiency for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicTrough,R.groupId,R.newValue)}};d(R),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.opticalEfficiency:m.opticalEfficiency,W={name:"Set Parabolic Trough Optical Efficiency",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicTroughOpticalEfficiency=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicTrough?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},Lj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(jc),c=Ew(Hc),s=Ew(zc),d=Ew(Sr),h=Ew(Rc),p=Ew(Dc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicTrough),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.thermalEfficiency)&&void 0!==t?t:.3),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicTrough&&!i.locked&&e.has(i.id)&&(i.thermalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicTrough&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.thermalEfficiency-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicTrough&&!c.locked){var s=c;if(Math.abs(s.thermalEfficiency-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicTrough&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.thermalEfficiency-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.thermalEfficiency)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicTrough&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.thermalEfficiency)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Thermal Efficiency for Selected Parabolic Troughs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicTrough&&v.set(A.id,A.thermalEfficiency)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Thermal Efficiency for All Parabolic Troughs",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicTrough,P.newValue)}};d(P),s(V.ParabolicTrough,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicTrough&&z.foundationId===m.foundationId&&j.set(z.id,z.thermalEfficiency)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Thermal Efficiency for All Parabolic Troughs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicTrough,R.groupId,R.newValue)}};d(R),c(V.ParabolicTrough,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.thermalEfficiency:m.thermalEfficiency,W={name:"Set Parabolic Trough Thermal Efficiency",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicTroughThermalEfficiency=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicTrough?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicTroughMenu.OnlyThisParabolicTrough",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicTroughMenu.AllParabolicTroughsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicTroughMenu.AllSelectedParabolicTroughs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicTroughMenu.AllParabolicTroughs",A)})]})})})]})})},Ej=n.a.memo((function(){var e,t,l,a,o=Ew(Vi),i=Ew(ac),n=Ew(Sr),c=Ew(Ci),s=OP(V.ParabolicTrough),d=Object(r.useState)(!1),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)(!1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(!1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!1),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useState)(!1),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useState)(!1),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=zP(s),q=K.labelText,Q=K.setLabelText,Z=RP(s),_=DP(s,q),$=WP(s),ee=MP(s),te=IP(s),le=CP(s);if(!s)return null;var ae={lng:o},oe=!(null===s||void 0===s?void 0:s.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"parabolic-trough-copy",paddingLeft:"36px"}),oe&&Object(gf.jsx)(PP,{keyName:"parabolic-trough-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"parabolic-trough-lock"}),s&&oe&&Object(gf.jsxs)(gf.Fragment,{children:[S&&Object(gf.jsx)(Mj,{setDialogVisible:j}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),j(!0)},children:[me.t("word.Length",ae)," ..."]},"parabolic-trough-length"),b&&Object(gf.jsx)(Wj,{setDialogVisible:A}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),A(!0)},children:[me.t("word.Width",ae)," ..."]},"parabolic-trough-width"),h&&Object(gf.jsx)(Oj,{setDialogVisible:p}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),p(!0)},children:[me.t("parabolicTroughMenu.ModuleLength",ae)," ..."]},"parabolic-trough-module-length"),m&&Object(gf.jsx)(Cj,{setDialogVisible:w}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),w(!0)},children:[me.t("parabolicTroughMenu.LatusRectum",ae)," ..."]},"parabolic-trough-latus-rectum"),R&&Object(gf.jsx)(Ij,{setDialogVisible:D}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),D(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",ae)," ..."]},"parabolic-trough-pole-height"),I&&Object(gf.jsx)(Fj,{setDialogVisible:C}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),C(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",ae)," ..."]},"parabolic-trough-reflectance"),k&&Object(gf.jsx)(kj,{setDialogVisible:Y}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),Y(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",ae)," ..."]},"parabolic-trough-absorptance"),U&&Object(gf.jsx)(Yj,{setDialogVisible:N}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),N(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",ae)," ..."]},"parabolic-trough-optical-efficiency"),X&&Object(gf.jsx)(Lj,{setDialogVisible:B}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),B(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",ae)," ..."]},"parabolic-trough-thermal-efficiency"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.drawSunBeam),onChange:function(e){return function(e){if(s){var t={name:"Show Sun Beam",timestamp:Date.now(),checked:!s.drawSunBeam,selectedElementId:s.id,selectedElementType:V.ParabolicTrough,undo:function(){i(s.id,!t.checked)},redo:function(){i(s.id,t.checked)}};n(t),i(s.id,e)}}(e.target.checked)},children:me.t("solarCollectorMenu.DrawSunBeam",ae)})},"parabolic-trough-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:Z,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"parabolic-trough-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.Label",ae)+":",value:q,onChange:function(e){return Q(e.target.value)},onPressEnter:_,onBlur:_})},"parabolic-trough-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(e=s.labelHeight)&&void 0!==e?e:.2,onChange:function(e){return le(e)}})},"parabolic-trough-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",ae)+":",min:10,max:100,step:1,precision:0,value:null!==(t=s.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return ee(e)}})},"parabolic-trough-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=s.labelSize)&&void 0!==l?l:.2,onChange:function(e){return $(e)}})},"parabolic-trough-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",ae)+":",value:null!==(a=s.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return te(e.target.value)}})},"parabolic-trough-label-color")]})]},"parabolic-trough-label")]})]})})),Uj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(An),c=Ew(Sn),s=Ew(Tn),d=Ew(jn),h=Ew(Pn),p=Ew(Hn),y=Ew($r),g=Ew(Sr),m=Ew(Yc),w=Ew(Lc),x=Ew(Ii),v=Ew(Ci),b=Ew(Oi),A=OP(V.ParabolicDish),T=Object(r.useState)(null!==(t=null===A||void 0===A?void 0:A.lx)&&void 0!==t?t:2),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useRef)(!1),z=Object(r.useRef)(),R=$f(),D=function(e,t){return!function(e,t){var l=y(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},M=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.lx=t,i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},W=function(e){if(A&&function(e){if(A){switch(m){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(y){l.e(y)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(y){n.e(y)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicDish&&h.foundationId===(null===A||void 0===A?void 0:A.foundationId)&&!h.locked){var p=h;if(Math.abs(p.lx-e)>At)return!0}}}catch(y){u.e(y)}finally{u.f()}break;default:if(Math.abs((null===A||void 0===A?void 0:A.lx)-e)>At)return!0}return!1}}(e)){switch(z.current=void 0,m){case _.AllSelectedObjectsOfThisType:H.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(r.id)&&D(r,e)){H.current=!0;break}}}catch(Q){l.e(Q)}finally{l.f()}if(H.current)z.current=e,j(A.lx);else{var y,w=new Map,b=Object(f.a)(o);try{for(b.s();!(y=b.n()).done;){var T=y.value;T.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(T.id)&&w.set(T.id,T.lx)}}catch(Q){b.e(Q)}finally{b.f()}var P={name:"Set Diameter for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o),c(a,o)}}catch(Q){t.e(Q)}finally{t.f()}},redo:function(){M(P.oldValues,P.newValue)}};g(P),M(w,e),v(x+1)}break;case _.AllObjectsOfThisType:H.current=!1;var S,R=Object(f.a)(o);try{for(R.s();!(S=R.n()).done;){var W=S.value;if(W.type===V.ParabolicDish&&D(W,e)){H.current=!0;break}}}catch(Q){R.e(Q)}finally{R.f()}if(H.current)z.current=e,j(A.lx);else{var I,C=new Map,O=Object(f.a)(o);try{for(O.s();!(I=O.n()).done;){var F=I.value;F.type===V.ParabolicDish&&C.set(F.id,F.lx)}}catch(Q){O.e(Q)}finally{O.f()}var k={name:"Set Diameter for All Parabolic Dishes",timestamp:Date.now(),oldValues:C,newValue:e,undo:function(){var e,t=Object(f.a)(k.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o),c(a,o)}}catch(Q){t.e(Q)}finally{t.f()}},redo:function(){h(V.ParabolicDish,k.newValue),p(V.ParabolicDish,k.newValue)}};g(k),h(V.ParabolicDish,e),p(V.ParabolicDish,e),v(x+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(A.foundationId){H.current=!1;var Y,L=Object(f.a)(o);try{for(L.s();!(Y=L.n()).done;){var E=Y.value;if(E.type===V.ParabolicDish&&E.foundationId===A.foundationId&&D(E,e)){H.current=!0;break}}}catch(Q){L.e(Q)}finally{L.f()}if(H.current)z.current=e,j(A.lx);else{var U,N=new Map,J=Object(f.a)(o);try{for(J.s();!(U=J.n()).done;){var G=U.value;G.type===V.ParabolicDish&&G.foundationId===A.foundationId&&N.set(G.id,G.lx)}}catch(Q){J.e(Q)}finally{J.f()}var X={name:"Set Diameter for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:N,newValue:e,groupId:A.foundationId,undo:function(){var e,t=Object(f.a)(X.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o),c(a,o)}}catch(Q){t.e(Q)}finally{t.f()}},redo:function(){X.groupId&&(s(V.ParabolicDish,X.groupId,X.newValue),d(V.ParabolicDish,X.groupId,X.newValue))}};g(X),s(V.ParabolicDish,A.foundationId,e),d(V.ParabolicDish,A.foundationId,e),v(x+1)}}break;default:var B=i(A.id),K=B?B.lx:A.lx;if(H.current=D(A,e),H.current)z.current=e,j(K);else{var q={name:"Set Parabolic Dish Diameter",timestamp:Date.now(),oldValue:K,newValue:e,changedElementId:A.id,changedElementType:A.type,undo:function(){n(q.changedElementId,q.oldValue),c(q.changedElementId,q.oldValue)},redo:function(){n(q.changedElementId,q.newValue),c(q.changedElementId,q.newValue)}};g(q),n(A.id,e),c(A.id,e),v(x+1)}}a((function(t){t.actionState.parabolicDishRimDiameter=e}))}},I=function(){H.current=!1,l(!1)};if((null===A||void 0===A?void 0:A.type)!==V.ParabolicDish)return null;var C=H.current?": "+me.t("message.NotApplicableToSelectedAction",R)+(void 0!==z.current?" ("+z.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicDishMenu.RimDiameter",R),rejectedMessage:C,onApply:function(){W(S)},onClose:I,onClickCancel:function(){I(),b()},onClickOk:function(){W(S),H.current||(l(!1),v(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:.5,precision:2,style:{width:120},value:S,onChange:j}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",R),": 1 ",me.t("word.MeterAbbreviation",R),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",R),": 10 ",me.t("word.MeterAbbreviation",R)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",R)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){w(e.target.value)},value:m,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",R)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",R)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",R)})]})})})]})})},Nj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(dc),c=Ew(fc),s=Ew(hc),d=Ew($r),h=Ew(Sr),p=Ew(Yc),y=Ew(Lc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicDish),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.poleHeight)&&void 0!==t?t:1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.tiltAngle=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.ParabolicDish&&y.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var v=m.value;if(v.type===V.ParabolicDish&&v.parentId===x.parentId&&!v.locked){var b=v;if(Math.abs(b.poleHeight-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}}break;default:if(Math.abs((null===x||void 0===x?void 0:x.poleHeight)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*r.ly*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(f.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(b.id)&&w.set(b.id,b.poleHeight)}}catch(B){v.e(B)}finally{v.f()}var A={name:"Set Pole Height for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){H(A.oldValues,A.newValue)}};h(A),H(w,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var j,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;if(R.type===V.ParabolicDish&&.5*R.ly*Math.abs(Math.sin(R.tiltAngle))>e){P.current=!0;break}}}catch(B){z.e(B)}finally{z.f()}if(P.current)S.current=e,T(x.poleHeight);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicDish&&M.set(I.id,I.poleHeight)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Pole Height for All Parabolic Dishes",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicDish,C.newValue)}};h(C),s(V.ParabolicDish,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicDish&&k.foundationId===x.foundationId&&.5*k.ly*Math.abs(Math.sin(k.tiltAngle))>e){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.poleHeight);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicDish&&U.foundationId===x.foundationId&&L.set(U.id,U.poleHeight)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Pole Height for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicDish,N.groupId,N.newValue)}};h(N),c(V.ParabolicDish,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.poleHeight:x.poleHeight;if(P.current=.5*x.lx*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Dish Pole Height",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicDishPoleHeight=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicDish)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicDishMenu.ExtraPoleHeightInAdditionToRadius",j),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [0, 5] ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",j)})]})})})]})})},Vj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Ec),c=Ew(Uc),s=Ew(Nc),d=Ew($r),h=Ew(Sr),p=Ew(Yc),y=Ew(Lc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.ParabolicDish),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.latusRectum)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.latusRectum=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.latusRectum=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.latusRectum-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.latusRectum-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.ParabolicDish&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.latusRectum-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.latusRectum)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.latusRectum);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.latusRectum)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Latus Rectum for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.ParabolicDish&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.latusRectum);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.ParabolicDish&&M.set(I.id,I.latusRectum)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Latus Rectum for All Parabolic Dishes",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.ParabolicDish,C.newValue)}};h(C),s(V.ParabolicDish,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.ParabolicDish&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.latusRectum);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.ParabolicDish&&U.foundationId===x.foundationId&&L.set(U.id,U.latusRectum)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Latus Rectum for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.ParabolicDish,N.groupId,N.newValue)}};h(N),c(V.ParabolicDish,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.latusRectum:x.latusRectum;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Parabolic Dish Latus Rectum",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.parabolicDishLatusRectum=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.ParabolicDish)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("parabolicDishMenu.LatusRectum",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 20 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",j)})]})})})]})})},Jj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(mc),c=Ew(wc),s=Ew(xc),d=Ew(Sr),h=Ew(Yc),p=Ew(Lc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicDish),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.reflectance)&&void 0!==t?t:.9),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicDish&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.reflectance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.reflectance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Reflectance for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&v.set(A.id,A.reflectance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Reflectance for All Parabolic Dishes",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicDish,P.newValue)}};d(P),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===m.foundationId&&j.set(z.id,z.reflectance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Reflectance for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicDish,R.groupId,R.newValue)}};d(R),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.reflectance:m.reflectance,W={name:"Set Parabolic Dish Reflectance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicDishReflectance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},Gj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(vc),c=Ew(bc),s=Ew(Ac),d=Ew(Sr),h=Ew(Yc),p=Ew(Lc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicDish),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.absorptance)&&void 0!==t?t:.95),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.absorptance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.absorptance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.absorptance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicDish&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.absorptance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.absorptance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.absorptance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Absorptance for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&v.set(A.id,A.absorptance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Absorptance for All Parabolic Dishes",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicDish,P.newValue)}};d(P),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===m.foundationId&&j.set(z.id,z.absorptance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Absorptance for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicDish,R.groupId,R.newValue)}};d(R),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.absorptance:m.absorptance,W={name:"Set Parabolic Dish Absorptance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicDishAbsorptance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},Xj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Tc),c=Ew(Pc),s=Ew(Sc),d=Ew(Sr),h=Ew(Yc),p=Ew(Lc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicDish),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.opticalEfficiency)&&void 0!==t?t:.7),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.opticalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.opticalEfficiency-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.opticalEfficiency-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicDish&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.opticalEfficiency-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.opticalEfficiency)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.opticalEfficiency)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Optical Efficiency for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&v.set(A.id,A.opticalEfficiency)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Optical Efficiency for All Parabolic Dishes",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicDish,P.newValue)}};d(P),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===m.foundationId&&j.set(z.id,z.opticalEfficiency)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Optical Efficiency for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicDish,R.groupId,R.newValue)}};d(R),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.opticalEfficiency:m.opticalEfficiency,W={name:"Set Parabolic Dish Optical Efficiency",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicDishOpticalEfficiency=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",A),onApply:function(){P(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},Bj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(jc),c=Ew(Hc),s=Ew(zc),d=Ew(Sr),h=Ew(Yc),p=Ew(Lc),y=Ew(Ii),g=Ew(Ci),m=OP(V.ParabolicDish),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.thermalEfficiency)&&void 0!==t?t:.3),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.thermalEfficiency=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.thermalEfficiency-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.thermalEfficiency-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.ParabolicDish&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.thermalEfficiency-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.thermalEfficiency)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.thermalEfficiency)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Thermal Efficiency for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.ParabolicDish&&v.set(A.id,A.thermalEfficiency)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Thermal Efficiency for All Parabolic Dishes",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.ParabolicDish,P.newValue)}};d(P),s(V.ParabolicDish,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===m.foundationId&&j.set(z.id,z.thermalEfficiency)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Thermal Efficiency for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.ParabolicDish,R.groupId,R.newValue)}};d(R),c(V.ParabolicDish,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.thermalEfficiency:m.thermalEfficiency,W={name:"Set Parabolic Dish Thermal Efficiency",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.parabolicDishThermalEfficiency=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",A)})]})})})]})})},Kj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sr),c=Ew(Yc),s=Ew(Lc),d=Ew(Ii),h=Ew(Ci),p=OP(V.ParabolicDish),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.structureType)&&void 0!==t?t:J.CentralPole),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=db.a.Option,b=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&!i.locked&&i.type===V.ParabolicDish){i.structureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.foundationId!==e||i.locked||i.type===V.ParabolicDish&&(i.structureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.locked||o.type===V.ParabolicDish&&(o.structureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},P=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.structureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.structureType!==e)return!0}}catch(h){l.e(h)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.ParabolicDish&&!n.locked&&n.structureType!==e)return!0}}catch(h){r.e(h)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.ParabolicDish&&u.foundationId===(null===p||void 0===p?void 0:p.foundationId)&&!u.locked&&u.structureType!==e)return!0}}catch(h){d.e(h)}finally{d.f()}break;default:if((null===p||void 0===p?void 0:p.structureType)!==e)return!0}return!1}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var s=t.value;s.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(s.id)&&l.set(s.id,s.structureType)}}catch(I){r.e(I)}finally{r.f()}var y={name:"Set Structure Type for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(y.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P(y.oldValues,y.newValue)}};n(y),P(l,e),h(d+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(o);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.ParabolicDish&&m.set(x.id,x.structureType)}}catch(I){w.e(I)}finally{w.f()}var v={name:"Set Structure Type for All Parabolic Dishes",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(v.newValue)}};n(v),T(e),h(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.ParabolicDish&&z.foundationId===p.foundationId&&j.set(z.id,z.structureType)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Structure Type for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:p.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];b(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&A(R.groupId,R.newValue)}};n(R),A(p.foundationId,e),h(d+1)}break;default:var D=i(p.id),M=D?D.structureType:p.structureType,W={name:"Set Parabolic Dish Structure Type",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){b(W.changedElementId,W.oldValue)},redo:function(){b(W.changedElementId,W.newValue)}};n(W),b(p.id,e),h(d+1)}a((function(t){t.actionState.parabolicDishReceiverStructure=e}))}};return(null===p||void 0===p?void 0:p.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:640,title:me.t("parabolicDishMenu.ReceiverStructure",x),onApply:function(){S(m)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsxs)(db.a,{value:m,onChange:function(e){return w(e)},children:[Object(gf.jsx)(v,{value:J.CentralPole,children:me.t("parabolicDishMenu.CentralPole",x)},J.CentralPole),Object(gf.jsx)(v,{value:J.CentralPoleWithTripod,children:me.t("parabolicDishMenu.CentralPoleWithTripod",x)},J.CentralPoleWithTripod),Object(gf.jsx)(v,{value:J.Quadrupod,children:me.t("parabolicDishMenu.Quadrupod",x)},J.Quadrupod)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){s(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",x)})]})})})]})})},qj=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(pc),c=Ew(yc),s=Ew(gc),d=Ew($r),h=Ew(Sr),p=Ew(Yc),y=Ew(Lc),g=Ew(Ii),m=Ew(Ci),w=OP(V.ParabolicDish),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.poleRadius)&&void 0!==t?t:.1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=$f(),P=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.ParabolicDish&&!i.locked&&e.has(i.id)&&(i.poleRadius=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(w&&function(e){if(w){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.ParabolicDish&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleRadius-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.ParabolicDish&&!c.locked){var s=c;if(Math.abs(s.poleRadius-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.ParabolicDish&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleRadius-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(w)){var m,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.ParabolicDish&&v.parentId===w.parentId&&!v.locked){var b=v;if(Math.abs(b.poleRadius-e)>At)return!0}}}catch(A){x.e(A)}finally{x.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.poleRadius)-e)>At)return!0}return!1}}(e)){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.ParabolicDish&&Ew.getState().selectedElementIdSet.has(y.id)&&l.set(y.id,y.poleRadius)}}catch(C){r.e(C)}finally{r.f()}var x={name:"Set Pole Radius for Selected Parabolic Dishes",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){P(x.oldValues,x.newValue)}};h(x),P(l,e),m(g+1);break;case _.AllObjectsOfThisType:var v,b=new Map,A=Object(f.a)(o);try{for(A.s();!(v=A.n()).done;){var T=v.value;T.type===V.ParabolicDish&&b.set(T.id,T.poleRadius)}}catch(C){A.e(C)}finally{A.f()}var S={name:"Set Pole Radius for All Parabolic Dishes",timestamp:Date.now(),oldValues:b,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){s(V.ParabolicDish,S.newValue)}};h(S),s(V.ParabolicDish,e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var j,H=new Map,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type===V.ParabolicDish&&R.foundationId===w.foundationId&&H.set(R.id,R.poleRadius)}}catch(C){z.e(C)}finally{z.f()}var D={name:"Set Pole Radius for All Parabolic Dishes Above Foundation",timestamp:Date.now(),oldValues:H,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){D.groupId&&c(V.ParabolicDish,D.groupId,D.newValue)}};h(D),c(V.ParabolicDish,w.foundationId,e),m(g+1)}break;default:var M=i(w.id),W=M?M.poleRadius:w.poleRadius,I={name:"Set Parabolic Dish Pole Radius",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(I.changedElementId,I.oldValue)},redo:function(){n(I.changedElementId,I.newValue)}};h(I),n(w.id,e),m(g+1)}a((function(t){t.actionState.parabolicDishPoleRadius=e}))}};return(null===w||void 0===w?void 0:w.type)!==V.ParabolicDish?null:Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.PoleRadius",T),onApply:function(){S(b)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:.5,style:{width:120},step:.01,precision:2,value:b,onChange:A}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",T),": [0.1, 0.5] ",me.t("word.MeterAbbreviation",T)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("parabolicDishMenu.OnlyThisParabolicDish",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("parabolicDishMenu.AllParabolicDishesAboveFoundation",T)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("parabolicDishMenu.AllSelectedParabolicDishes",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("parabolicDishMenu.AllParabolicDishes",T)})]})})})]})})},Qj=n.a.memo((function(){var e,t,l,a,o=Ew(Vi),i=Ew(ac),n=Ew(Sr),c=Ew(Ci),s=OP(V.ParabolicDish),d=Object(r.useState)(!1),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)(!1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(!1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(!1),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!1),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useState)(!1),F=Object(u.a)(O,2),k=F[0],Y=F[1],L=Object(r.useState)(!1),E=Object(u.a)(L,2),U=E[0],N=E[1],J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=zP(s),q=K.labelText,Q=K.setLabelText,Z=RP(s),_=DP(s,q),$=WP(s),ee=MP(s),te=IP(s),le=CP(s);if(!s)return null;var ae={lng:o},oe=!(null===s||void 0===s?void 0:s.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"parabolic-dish-copy",paddingLeft:"36px"}),oe&&Object(gf.jsx)(PP,{keyName:"parabolic-dish-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"parabolic-dish-lock"}),s&&oe&&Object(gf.jsxs)(gf.Fragment,{children:[b&&Object(gf.jsx)(Uj,{setDialogVisible:A}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),A(!0)},children:[me.t("parabolicDishMenu.RimDiameter",ae)," ..."]},"parabolic-dish-radius"),m&&Object(gf.jsx)(Vj,{setDialogVisible:w}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),w(!0)},children:[me.t("parabolicDishMenu.LatusRectum",ae)," ..."]},"parabolic-dish-latus-rectum"),h&&Object(gf.jsx)(Kj,{setDialogVisible:p}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),p(!0)},children:[me.t("parabolicDishMenu.ReceiverStructure",ae)," ..."]},"parabolic-dish-structure-type"),S&&Object(gf.jsx)(Nj,{setDialogVisible:j}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),j(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",ae)," ..."]},"parabolic-dish-pole-height"),R&&Object(gf.jsx)(qj,{setDialogVisible:D}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),D(!0)},children:[me.t("solarCollectorMenu.PoleRadius",ae)," ..."]},"parabolic-dish-pole-radius"),I&&Object(gf.jsx)(Jj,{setDialogVisible:C}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),C(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",ae)," ..."]},"parabolic-dish-reflectance"),k&&Object(gf.jsx)(Gj,{setDialogVisible:Y}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),Y(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverAbsorptance",ae)," ..."]},"parabolic-dish-absorptance"),U&&Object(gf.jsx)(Xj,{setDialogVisible:N}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),N(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency",ae)," ..."]},"parabolic-dish-optical-efficiency"),X&&Object(gf.jsx)(Bj,{setDialogVisible:B}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){c(0),B(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency",ae)," ..."]},"parabolic-dish-thermal-efficiency"),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.drawSunBeam),onChange:function(e){return function(e){if(s){var t={name:"Show Sun Beam",timestamp:Date.now(),checked:!s.drawSunBeam,selectedElementId:s.id,selectedElementType:V.ParabolicDish,undo:function(){i(s.id,!t.checked)},redo:function(){i(s.id,t.checked)}};n(t),i(s.id,e)}}(e.target.checked)},children:me.t("solarCollectorMenu.DrawSunBeam",ae)})},"parabolic-dish-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",ae),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===s||void 0===s?void 0:s.showLabel),onChange:Z,children:me.t("labelSubMenu.KeepShowingLabel",ae)})},"parabolic-dish-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",ae)+":",value:q,onChange:function(e){return Q(e.target.value)},onPressEnter:_,onBlur:_})},"parabolic-dish-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(e=s.labelHeight)&&void 0!==e?e:.2,onChange:function(e){return le(e)}})},"parabolic-dish-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",ae)+":",min:10,max:100,step:1,precision:0,value:null!==(t=s.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return ee(e)}})},"parabolic-dish-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",ae)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=s.labelSize)&&void 0!==l?l:.2,onChange:function(e){return $(e)}})},"parabolic-dish-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",ae)+":",value:null!==(a=s.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return te(e.target.value)}})},"parabolic-dish-label-color")]})]},"parabolic-dish-label")]})]})})),Zj=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Zr),i=Ew(Sn),n=Ew(jn),c=Ew(Hn),s=Ew($r),d=Ew(Sr),h=Ew(Mc),p=Ew(Wc),y=Ew(Ii),g=Ew(Ci),m=Ew(Oi),w=OP(V.FresnelReflector),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.ly)&&void 0!==t?t:9),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useRef)(!1),P=Object(r.useRef)(),S=$f(),j=function(e,t){return!function(e,t){var l=s(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(w&&function(e){if(w){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.FresnelReflector&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var i=o;if(Math.abs(i.ly-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(a);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.FresnelReflector&&p.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!p.locked){var y=p;if(Math.abs(y.ly-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===w||void 0===w?void 0:w.ly)-e)>At)return!0}return!1}}(e))switch(P.current=void 0,h){case _.AllSelectedObjectsOfThisType:T.current=!1;var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(r.id)&&j(r,e)){T.current=!0;break}}}catch(X){l.e(X)}finally{l.f()}if(T.current)P.current=e,A(w.ly);else{var s,p=new Map,m=Object(f.a)(a);try{for(m.s();!(s=m.n()).done;){var x=s.value;x.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(x.id)&&p.set(x.id,x.ly)}}catch(X){m.e(X)}finally{m.f()}var v={name:"Set Length for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:p,newValue:e,undo:function(){var e,t=Object(f.a)(v.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){H(v.oldValues,v.newValue)}};d(v),H(p,e),g(y+1)}break;case _.AllObjectsOfThisType:T.current=!1;var b,S=Object(f.a)(a);try{for(S.s();!(b=S.n()).done;){var z=b.value;if(z.type===V.FresnelReflector&&j(z,e)){T.current=!0;break}}}catch(X){S.e(X)}finally{S.f()}if(T.current)P.current=e,A(w.ly);else{var R,D=new Map,M=Object(f.a)(a);try{for(M.s();!(R=M.n()).done;){var W=R.value;W.type===V.FresnelReflector&&D.set(W.id,W.ly)}}catch(X){M.e(X)}finally{M.f()}var I={name:"Set Length for All Fresnel Reflectors",timestamp:Date.now(),oldValues:D,newValue:e,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){c(V.FresnelReflector,I.newValue)}};d(I),c(V.FresnelReflector,e),g(y+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){T.current=!1;var C,O=Object(f.a)(a);try{for(O.s();!(C=O.n()).done;){var F=C.value;if(F.type===V.FresnelReflector&&F.foundationId===w.foundationId&&j(F,e)){T.current=!0;break}}}catch(X){O.e(X)}finally{O.f()}if(T.current)P.current=e,A(w.ly);else{var k,Y=new Map,L=Object(f.a)(a);try{for(L.s();!(k=L.n()).done;){var E=k.value;E.type===V.FresnelReflector&&E.foundationId===w.foundationId&&Y.set(E.id,E.ly)}}catch(X){L.e(X)}finally{L.f()}var U={name:"Set Length for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:Y,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(U.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];i(a,o)}}catch(X){t.e(X)}finally{t.f()}},redo:function(){U.groupId&&n(V.FresnelReflector,U.groupId,U.newValue)}};d(U),n(V.FresnelReflector,w.foundationId,e),g(y+1)}}break;default:var N=o(w.id),J=N?N.ly:w.ly;if(T.current=j(w,e),T.current)P.current=e,A(J);else{var G={name:"Set Fresnel Reflector Length",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){i(G.changedElementId,G.oldValue)},redo:function(){i(G.changedElementId,G.newValue)}};d(G),i(w.id,e),g(y+1)}}},R=function(){T.current=!1,l(!1)};if((null===w||void 0===w?void 0:w.type)!==V.FresnelReflector)return null;var D=T.current?": "+me.t("message.NotApplicableToSelectedAction",S)+(void 0!==P.current?" ("+P.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Length",S),rejectedMessage:D,onApply:function(){z(b)},onClose:R,onClickCancel:function(){R(),m()},onClickOk:function(){z(b),T.current||(l(!1),g(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:w.moduleLength,max:200*w.moduleLength,step:w.moduleLength,style:{width:120},precision:2,value:b,onChange:function(e){A(function(e){if(!w)return 1;var t=null!==e&&void 0!==e?e:1;return Math.max(1,Math.ceil((t-w.moduleLength/2)/w.moduleLength))*w.moduleLength}(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("fresnelReflectorMenu.ModuleLength",S)+": "+w.moduleLength.toFixed(1)+" "+me.t("word.MeterAbbreviation",S),Object(gf.jsx)("br",{}),Math.round(b/w.moduleLength)+" "+me.t("fresnelReflectorMenu.ModulesLong",S),Object(gf.jsx)("br",{}),me.t("word.Maximum",S),": 200 ",me.t("fresnelReflectorMenu.Modules",S)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",S)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",S)})]})})})]})})},_j=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=(Ew(Vi),Ew(Fi)),i=Ew(Zr),n=Ew(An),c=Ew(Tn),s=Ew(Pn),d=Ew($r),h=Ew(Sr),p=Ew(Mc),y=Ew(Wc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.FresnelReflector),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.lx)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.lx=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.FresnelReflector&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.lx-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.lx)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Width for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.FresnelReflector&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.lx);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.FresnelReflector&&M.set(I.id,I.lx)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Width for All Fresnel Reflectors",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.FresnelReflector,C.newValue)}};h(C),s(V.FresnelReflector,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.FresnelReflector&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.lx);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.FresnelReflector&&U.foundationId===x.foundationId&&L.set(U.id,U.lx)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Width for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.FresnelReflector,N.groupId,N.newValue)}};h(N),c(V.FresnelReflector,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.lx:x.lx;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Fresnel Reflector Width",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.fresnelReflectorWidth=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.FresnelReflector)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Width",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:10,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 10 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",j)})]})})})]})})},$j=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Zr),c=Ew(dc),s=Ew(fc),d=Ew(hc),h=Ew($r),p=Ew(Sr),y=Ew(Mc),g=Ew(Wc),m=Ew(Ii),w=Ew(Ci),x=Ew(Oi),v=OP(V.FresnelReflector),b=Object(r.useState)(null!==(t=null===v||void 0===v?void 0:v.poleHeight)&&void 0!==t?t:1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useRef)(!1),j=Object(r.useRef)(),H=Object(r.useRef)(null!==(l=null===v||void 0===v?void 0:v.poleHeight)&&void 0!==l?l:1),z=$f(),R=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.poleHeight=t)}}catch(r){o.e(r)}finally{o.f()}}))},D=function(e){if(v&&function(e){if(v){switch(y){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var o=a;if(Math.abs(o.poleHeight-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(i);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(i);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.FresnelReflector&&p.foundationId===(null===v||void 0===v?void 0:v.foundationId)&&!p.locked){var g=p;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(A){u.e(A)}finally{u.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(h(v)){var m,w=Object(f.a)(i);try{for(w.s();!(m=w.n()).done;){var x=m.value;if(x.type===V.FresnelReflector&&x.parentId===v.parentId&&!x.locked){var b=x;if(Math.abs(b.poleHeight-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}}break;default:if(Math.abs((null===v||void 0===v?void 0:v.poleHeight)-e)>At)return!0}return!1}}(e)){switch(j.current=void 0,y){case _.AllSelectedObjectsOfThisType:S.current=!1;var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(a.id)&&.5*a.ly*Math.abs(Math.sin(a.tiltAngle))>e){S.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(S.current)j.current=e,H.current=v.poleHeight;else{var r,g=new Map,x=Object(f.a)(i);try{for(x.s();!(r=x.n()).done;){var b=r.value;b.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(b.id)&&g.set(b.id,b.poleHeight)}}catch(B){x.e(B)}finally{x.f()}var A={name:"Set Pole Height for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){R(A.oldValues,A.newValue)}};p(A),R(g,e),w(m+1)}break;case _.AllObjectsOfThisType:S.current=!1;var T,P=Object(f.a)(i);try{for(P.s();!(T=P.n()).done;){var z=T.value;if(z.type===V.FresnelReflector&&.5*z.ly*Math.abs(Math.sin(z.tiltAngle))>e){S.current=!0;break}}}catch(B){P.e(B)}finally{P.f()}if(S.current)j.current=e,H.current=v.poleHeight;else{var D,M=new Map,W=Object(f.a)(i);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.FresnelReflector&&M.set(I.id,I.poleHeight)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Pole Height for All Fresnel Reflectors",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){d(V.FresnelReflector,C.newValue)}};p(C),d(V.FresnelReflector,e),w(m+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(v.foundationId){S.current=!1;var O,F=Object(f.a)(i);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.FresnelReflector&&k.foundationId===v.foundationId&&.5*k.ly*Math.abs(Math.sin(k.tiltAngle))>e){S.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(S.current)j.current=e,H.current=v.poleHeight;else{var Y,L=new Map,E=Object(f.a)(i);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.FresnelReflector&&U.foundationId===v.foundationId&&L.set(U.id,U.poleHeight)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Pole Height for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:v.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];c(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&s(V.FresnelReflector,N.groupId,N.newValue)}};p(N),s(V.FresnelReflector,v.foundationId,e),w(m+1)}}break;default:var J=n(v.id),G=J?J.poleHeight:v.poleHeight;if(S.current=.5*v.lx*Math.abs(Math.sin(v.tiltAngle))>e,S.current)j.current=e,H.current=G;else{var X={name:"Set Fresnel Reflector Pole Height",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:v.id,changedElementType:v.type,undo:function(){c(X.changedElementId,X.oldValue)},redo:function(){c(X.changedElementId,X.newValue)}};p(X),c(v.id,e),w(m+1)}}o((function(t){t.actionState.fresnelReflectorPoleHeight=e}))}},M=function(){a(!1)};if((null===v||void 0===v?void 0:v.type)!==V.FresnelReflector)return null;var W=S.current?": "+me.t("message.NotApplicableToSelectedAction",z)+(void 0!==j.current?" ("+j.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",z),rejectedMessage:W,onApply:function(){D(T)},onClose:M,onClickCancel:function(){M(),x()},onClickOk:function(){D(T),S.current||(a(!1),w(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:T,onChange:P}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",z),": [0, 5] ",me.t("word.MeterAbbreviation",z)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",z)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){g(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",z)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",z)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",z)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",z)})]})})})]})})},eH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Vc),c=Ew(Jc),s=Ew(Gc),d=Ew($r),h=Ew(Sr),p=Ew(Mc),y=Ew(Wc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.FresnelReflector),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.moduleLength)&&void 0!==t?t:3),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.moduleLength=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.moduleLength=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.moduleLength-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.moduleLength-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.FresnelReflector&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.moduleLength-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.moduleLength)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.moduleLength);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.moduleLength)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Module Length for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.FresnelReflector&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.moduleLength);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.FresnelReflector&&M.set(I.id,I.moduleLength)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Module Length for All Fresnel Reflectors",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.FresnelReflector,C.newValue)}};h(C),s(V.FresnelReflector,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.FresnelReflector&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.moduleLength);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.FresnelReflector&&U.foundationId===x.foundationId&&L.set(U.id,U.moduleLength)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Module Length for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.FresnelReflector,N.groupId,N.newValue)}};h(N),c(V.FresnelReflector,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.moduleLength:x.moduleLength;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Fresnel Reflector Module Length",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.fresnelReflectorModuleLength=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.FresnelReflector)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("fresnelReflectorMenu.ModuleLength",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 10 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",j)})]})})})]})})},tH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(mc),c=Ew(wc),s=Ew(xc),d=Ew(Sr),h=Ew(Mc),p=Ew(Wc),y=Ew(Ii),g=Ew(Ci),m=OP(V.FresnelReflector),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.reflectance)&&void 0!==t?t:.9),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.FresnelReflector&&!i.locked&&e.has(i.id)&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.FresnelReflector&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.FresnelReflector&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.reflectance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.reflectance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Reflectance for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.FresnelReflector&&v.set(A.id,A.reflectance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Reflectance for All Fresnel Reflectors",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.FresnelReflector,P.newValue)}};d(P),s(V.FresnelReflector,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.FresnelReflector&&z.foundationId===m.foundationId&&j.set(z.id,z.reflectance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Reflectance for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.FresnelReflector,R.groupId,R.newValue)}};d(R),c(V.FresnelReflector,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.reflectance:m.reflectance,W={name:"Set Fresnel Reflector Reflectance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.fresnelReflectorReflectance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.FresnelReflector?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){P(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,value:v,step:.01,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",A)})]})})})]})})},lH=db.a.Option,aH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Oc),c=Ew(Fc),s=Ew(kc),d=Ew(Sr),h=Ew(Mc),p=Ew(Wc),y=Ew(Ii),g=Ew(Ci),m=OP(V.FresnelReflector),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.receiverId)&&void 0!==t?t:"None"),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=Object(r.useMemo)((function(){var e,t=[],l=Object(f.a)(o);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Foundation){var i=a;i.solarStructure===G.FocusPipe&&t.push(i.id)}}}catch(r){l.e(r)}finally{l.f()}return t}),[o]);Object(r.useEffect)((function(){if(b("None"),m)if(m.receiverId)b(m.receiverId);else{var e=i(m.parentId);e&&e.type===V.Foundation&&e.solarStructure===G.FocusPipe&&b(e.id)}}),[m]);var P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;Tw.isHeliostatOrFresnelReflector(i.type)&&(!i.locked&&e.has(i.id)&&(i.type===V.Heliostat?i.towerId=t:i.type===V.FresnelReflector&&(i.receiverId=t)))}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(m&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.FresnelReflector&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.receiverId!==e)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.FresnelReflector&&!n.locked&&n.receiverId!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.FresnelReflector&&d.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!d.locked&&d.receiverId!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if((null===m||void 0===m?void 0:m.receiverId)!==e)return!0}return!1}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.receiverId)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Receiver for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P(w.oldValues,w.newValue)}};d(w),P(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.FresnelReflector&&v.set(A.id,A.receiverId)}}catch(I){b.e(I)}finally{b.f()}var T={name:"Set Receiver for All Fresnel Reflectors",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.FresnelReflector,T.newValue)}};d(T),s(V.FresnelReflector,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.FresnelReflector&&z.foundationId===m.foundationId&&j.set(z.id,z.receiverId)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Receiver for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.FresnelReflector,R.groupId,R.newValue)}};d(R),c(V.FresnelReflector,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.receiverId:m.receiverId,W={name:"Set Receiver for Fresnel Reflector",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.fresnelReflectorReceiver=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.FresnelReflector?null:Object(gf.jsx)(kP,{width:640,title:me.t("fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo",A),onApply:function(){v&&S(v)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsx)(db.a,{style:{width:"160px"},value:v,onChange:function(e){b(e)},children:T.map((function(e,t){return Object(gf.jsx)(lH,{value:e,children:me.t("fresnelReflectorMenu.AbsorberPipe",A)+" "+(t+1)},t)}))})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",A)})]})})})]})})},oH=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Zr),o=Ew(ac),i=Ew(oc),n=Ew(ic),c=Ew(Sr),s=Ew(Mc),d=Ew(Wc),h=Ew(Ii),p=Ew(Ci),y=OP(V.FresnelReflector),g=Object(r.useState)(!!(null===y||void 0===y?void 0:y.drawSunBeam)),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;Tw.isSolarCollectorType(i.type)&&(!i.locked&&i.type===V.FresnelReflector&&e.has(i.id)&&(i.drawSunBeam=t))}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e){if(y&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.FresnelReflector&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)&&o.drawSunBeam!==e)return!0}}catch(h){a.e(h)}finally{a.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(l);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.FresnelReflector&&!n.locked&&n.drawSunBeam!==e)return!0}}catch(h){r.e(h)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,d=Object(f.a)(l);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.FresnelReflector&&u.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!u.locked&&u.drawSunBeam!==e)return!0}}catch(h){d.e(h)}finally{d.f()}break;default:if((null===y||void 0===y?void 0:y.drawSunBeam)!==e)return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,r=new Map,d=Object(f.a)(l);try{for(d.s();!(t=d.n()).done;){var g=t.value;g.type===V.FresnelReflector&&Ew.getState().selectedElementIdSet.has(g.id)&&r.set(g.id,g.drawSunBeam)}}catch(W){d.e(W)}finally{d.f()}var m={name:"Draw Sun Beam for Selected Fresnel Reflectors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(m.oldValues,m.newValue)}};c(m),b(r,e),p(h+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(l);try{for(v.s();!(w=v.n()).done;){var A=w.value;A.type===V.FresnelReflector&&x.set(A.id,A.drawSunBeam)}}catch(W){v.e(W)}finally{v.f()}var T={name:"Draw Sun Beam for All Fresnel Reflectors",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){n(V.FresnelReflector,T.newValue)}};c(T),n(V.FresnelReflector,e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var P,S=new Map,j=Object(f.a)(l);try{for(j.s();!(P=j.n()).done;){var H=P.value;H.type===V.FresnelReflector&&H.foundationId===y.foundationId&&S.set(H.id,H.drawSunBeam)}}catch(W){j.e(W)}finally{j.f()}var z={name:"Draw Sun Beam for All Fresnel Reflectors Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){z.groupId&&i(V.FresnelReflector,z.groupId,z.newValue)}};c(z),i(V.FresnelReflector,y.foundationId,e),p(h+1)}break;default:var R=a(y.id),D=R?R.drawSunBeam:y.drawSunBeam,M={name:"Draw Sun Beam for Fresnel Reflector",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){o(M.changedElementId,M.oldValue)},redo:function(){o(M.changedElementId,M.newValue)}};c(M),o(y.id,e),p(h+1)}};return(null===y||void 0===y?void 0:y.type)!==V.FresnelReflector?null:Object(gf.jsx)(kP,{width:500,title:me.t("solarCollectorMenu.DrawSunBeam",v),onApply:function(){A(w)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:4,children:Object(gf.jsx)(eb.a,{checked:w,onChange:function(e){x(e)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("fresnelReflectorMenu.OnlyThisFresnelReflector",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllSelectedFresnelReflectors",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("fresnelReflectorMenu.AllFresnelReflectors",v)})]})})})]})})},iH=n.a.memo((function(){var e,t,l,a,o=Ew(Vi),i=Ew(Ci),n=OP(V.FresnelReflector),c=Object(r.useState)(!1),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),O=C[0],F=C[1],k=zP(n),Y=k.labelText,L=k.setLabelText,E=RP(n),U=DP(n,Y),N=WP(n),J=MP(n),G=IP(n),X=CP(n);if(!n)return null;var B={lng:o},K=!(null===n||void 0===n?void 0:n.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"fresnel-reflector-copy",paddingLeft:"36px"}),K&&Object(gf.jsx)(PP,{keyName:"fresnel-reflector-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"fresnel-reflector-lock"}),n&&K&&Object(gf.jsxs)(gf.Fragment,{children:[M&&Object(gf.jsx)(aH,{setDialogVisible:W}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),W(!0)},children:[me.t("fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo",B)," ..."]},"fresnel-reflector-receiver"),x&&Object(gf.jsx)(Zj,{setDialogVisible:v}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),v(!0)},children:[me.t("word.Length",B)," ..."]},"fresnel-reflector-length"),y&&Object(gf.jsx)(_j,{setDialogVisible:g}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),g(!0)},children:[me.t("word.Width",B)," ..."]},"fresnel-reflector-width"),d&&Object(gf.jsx)(eH,{setDialogVisible:f}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),f(!0)},children:[me.t("fresnelReflectorMenu.ModuleLength",B)," ..."]},"fresnel-reflector-module-length"),T&&Object(gf.jsx)($j,{setDialogVisible:P}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),P(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",B)," ..."]},"fresnel-reflector-pole-height"),H&&Object(gf.jsx)(tH,{setDialogVisible:z}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),z(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",B)," ..."]},"fresnel-reflector-reflectance"),O&&Object(gf.jsx)(oH,{setDialogVisible:F}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),F(!0)},children:[me.t("solarCollectorMenu.DrawSunBeam",B)," ..."]},"fresnel-reflector-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",B),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===n||void 0===n?void 0:n.showLabel),onChange:E,children:me.t("labelSubMenu.KeepShowingLabel",B)})},"fresnel-reflector-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.Label",B)+":",value:Y,onChange:function(e){return L(e.target.value)},onPressEnter:U,onBlur:U})},"fresnel-reflector-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",B)+":",min:.2,max:5,step:.1,precision:1,value:null!==(e=n.labelHeight)&&void 0!==e?e:.2,onChange:function(e){return X(e)}})},"fresnel-reflector-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",B)+":",min:10,max:100,step:1,precision:0,value:null!==(t=n.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return J(e)}})},"fresnel-reflector-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",B)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=n.labelSize)&&void 0!==l?l:.2,onChange:function(e){return N(e)}})},"fresnel-reflector-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",B)+":",value:null!==(a=n.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return G(e.target.value)}})},"fresnel-reflector-label-color")]})]},"fresnel-reflector-label")]})]})})),rH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Sn),c=Ew(jn),s=Ew(Hn),d=Ew($r),h=Ew(Sr),p=Ew(Ic),y=Ew(Cc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.Heliostat),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.ly)&&void 0!==t?t:4),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.ly=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.ly-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.ly-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.Heliostat&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.ly-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.ly)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.ly);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.ly)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Width for Selected Heliostats",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.Heliostat&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.ly);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.Heliostat&&M.set(I.id,I.ly)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Width for All Heliostats",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.Heliostat,C.newValue)}};h(C),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.Heliostat&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.ly);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.Heliostat&&U.foundationId===x.foundationId&&L.set(U.id,U.ly)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Width for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.Heliostat,N.groupId,N.newValue)}};h(N),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.ly:x.ly;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Heliostat Width",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatWidth=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.Heliostat)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Width",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,precision:2,style:{width:120},value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 20 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",j)})]})})})]})})},nH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(An),c=Ew(Tn),s=Ew(Pn),d=Ew($r),h=Ew(Sr),p=Ew(Ic),y=Ew(Cc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.Heliostat),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.lx)&&void 0!==t?t:2),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){return!function(e,t){var l=d(e);if(l){var a=JSON.parse(JSON.stringify(e));return a.lx=t,Tw.isSolarCollectorWithinHorizontalSurface(a,l)}return!1}(e,t)},z=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.lx=t)}}catch(r){o.e(r)}finally{o.f()}}))},R=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.lx-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.lx-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var h=d.value;if(h.type===V.Heliostat&&h.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!h.locked){var y=h;if(Math.abs(y.lx-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===x||void 0===x?void 0:x.lx)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(r.id)&&H(r,e)){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.lx);else{var d,y=new Map,w=Object(f.a)(o);try{for(w.s();!(d=w.n()).done;){var v=d.value;v.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(v.id)&&y.set(v.id,v.lx)}}catch(B){w.e(B)}finally{w.f()}var b={name:"Set Length for Selected Heliostats",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){var e,t=Object(f.a)(b.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){z(b.oldValues,b.newValue)}};h(b),z(y,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var A,j=Object(f.a)(o);try{for(j.s();!(A=j.n()).done;){var R=A.value;if(R.type===V.Heliostat&&H(R,e)){P.current=!0;break}}}catch(B){j.e(B)}finally{j.f()}if(P.current)S.current=e,T(x.lx);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.Heliostat&&M.set(I.id,I.lx)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Length for All Heliostats",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.Heliostat,C.newValue)}};h(C),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.Heliostat&&k.foundationId===x.foundationId&&H(k,e)){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.lx);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.Heliostat&&U.foundationId===x.foundationId&&L.set(U.id,U.lx)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Length for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.Heliostat,N.groupId,N.newValue)}};h(N),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.lx:x.lx;if(P.current=H(x,e),P.current)S.current=e,T(G);else{var X={name:"Set Heliostat Length",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatLength=e}))}},D=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.Heliostat)return null;var M=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("word.Length",j),rejectedMessage:M,onApply:function(){R(A)},onClose:D,onClickCancel:function(){D(),w()},onClickOk:function(){R(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:1,max:20,step:.5,style:{width:120},precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.MinimumValue",j),": 1 ",me.t("word.MeterAbbreviation",j),Object(gf.jsx)("br",{}),me.t("word.MaximumValue",j),": 20 ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",j)})]})})})]})})},cH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(dc),c=Ew(fc),s=Ew(hc),d=Ew($r),h=Ew(Sr),p=Ew(Ic),y=Ew(Cc),g=Ew(Ii),m=Ew(Ci),w=Ew(Oi),x=OP(V.Heliostat),v=Object(r.useState)(null!==(t=null===x||void 0===x?void 0:x.poleHeight)&&void 0!==t?t:1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(!1),S=Object(r.useRef)(),j=$f(),H=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.poleHeight=t)}}catch(r){o.e(r)}finally{o.f()}}))},z=function(e){if(x&&function(e){if(x){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleHeight-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.poleHeight-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.Heliostat&&y.foundationId===(null===x||void 0===x?void 0:x.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleHeight-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(x)){var m,w=Object(f.a)(o);try{for(w.s();!(m=w.n()).done;){var v=m.value;if(v.type===V.Heliostat&&v.parentId===x.parentId&&!v.locked){var b=v;if(Math.abs(b.poleHeight-e)>At)return!0}}}catch(A){w.e(A)}finally{w.f()}}break;default:if(Math.abs((null===x||void 0===x?void 0:x.poleHeight)-e)>At)return!0}return!1}}(e)){switch(S.current=void 0,p){case _.AllSelectedObjectsOfThisType:P.current=!1;var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var r=t.value;if(r.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(r.id)&&.5*Math.max(r.lx,r.ly)*Math.abs(Math.sin(r.tiltAngle))>e){P.current=!0;break}}}catch(B){l.e(B)}finally{l.f()}if(P.current)S.current=e,T(x.poleHeight);else{var y,w=new Map,v=Object(f.a)(o);try{for(v.s();!(y=v.n()).done;){var b=y.value;b.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(b.id)&&w.set(b.id,b.poleHeight)}}catch(B){v.e(B)}finally{v.f()}var A={name:"Set Pole Height for Selected Heliostats",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(A.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){H(A.oldValues,A.newValue)}};h(A),H(w,e),m(g+1)}break;case _.AllObjectsOfThisType:P.current=!1;var j,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;if(R.type===V.Heliostat&&.5*Math.max(R.lx,R.ly)*Math.abs(Math.sin(R.tiltAngle))>e){P.current=!0;break}}}catch(B){z.e(B)}finally{z.f()}if(P.current)S.current=e,T(x.poleHeight);else{var D,M=new Map,W=Object(f.a)(o);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type===V.Heliostat&&M.set(I.id,I.poleHeight)}}catch(B){W.e(B)}finally{W.f()}var C={name:"Set Pole Height for All Heliostats",timestamp:Date.now(),oldValues:M,newValue:e,undo:function(){var e,t=Object(f.a)(C.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){s(V.Heliostat,C.newValue)}};h(C),s(V.Heliostat,e),m(g+1)}break;case _.AllObjectsOfThisTypeAboveFoundation:if(x.foundationId){P.current=!1;var O,F=Object(f.a)(o);try{for(F.s();!(O=F.n()).done;){var k=O.value;if(k.type===V.Heliostat&&k.foundationId===x.foundationId&&.5*Math.max(k.lx,k.ly)*Math.abs(Math.sin(k.tiltAngle))>e){P.current=!0;break}}}catch(B){F.e(B)}finally{F.f()}if(P.current)S.current=e,T(x.poleHeight);else{var Y,L=new Map,E=Object(f.a)(o);try{for(E.s();!(Y=E.n()).done;){var U=Y.value;U.type===V.Heliostat&&U.foundationId===x.foundationId&&L.set(U.id,U.poleHeight)}}catch(B){E.e(B)}finally{E.f()}var N={name:"Set Pole Height for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:L,newValue:e,groupId:x.foundationId,undo:function(){var e,t=Object(f.a)(N.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){N.groupId&&c(V.Heliostat,N.groupId,N.newValue)}};h(N),c(V.Heliostat,x.foundationId,e),m(g+1)}}break;default:var J=i(x.id),G=J?J.poleHeight:x.poleHeight;if(P.current=.5*Math.max(x.lx,x.ly)*Math.abs(Math.sin(x.tiltAngle))>e,P.current)S.current=e,T(G);else{var X={name:"Set Heliostat Pole Height",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:x.id,changedElementType:x.type,undo:function(){n(X.changedElementId,X.oldValue)},redo:function(){n(X.changedElementId,X.newValue)}};h(X),n(x.id,e),m(g+1)}}a((function(t){t.actionState.heliostatPoleHeight=e}))}},R=function(){P.current=!1,l(!1)};if((null===x||void 0===x?void 0:x.type)!==V.Heliostat)return null;var D=P.current?": "+me.t("message.NotApplicableToSelectedAction",j)+(void 0!==S.current?" ("+S.current.toFixed(2)+")":""):null;return Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.ExtraPoleHeightInAdditionToHalfWidth",j),rejectedMessage:D,onApply:function(){z(A)},onClose:R,onClickCancel:function(){R(),w()},onClickOk:function(){z(A),P.current||(l(!1),m(0))},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:5,style:{width:120},step:.1,precision:2,value:A,onChange:T}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",j),": [0, 5] ",me.t("word.MeterAbbreviation",j)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",j)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",j)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",j)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",j)})]})})})]})})},sH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(mc),c=Ew(wc),s=Ew(xc),d=Ew(Sr),h=Ew(Ic),p=Ew(Cc),y=Ew(Ii),g=Ew(Ci),m=OP(V.Heliostat),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.reflectance)&&void 0!==t?t:.9),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.reflectance=t)}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){if(m&&function(e){if(m){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.reflectance-e)>At)return!0}}}catch(g){l.e(g)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.reflectance-e)>At)return!0}}}catch(g){n.e(g)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(o);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Heliostat&&p.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!p.locked){var y=p;if(Math.abs(y.reflectance-e)>At)return!0}}}catch(g){u.e(g)}finally{u.f()}break;default:if(Math.abs((null===m||void 0===m?void 0:m.reflectance)-e)>At)return!0}return!1}}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.reflectance)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Reflectance for Selected Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){T(w.oldValues,w.newValue)}};d(w),T(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.Heliostat&&v.set(A.id,A.reflectance)}}catch(I){b.e(I)}finally{b.f()}var P={name:"Set Reflectance for All Heliostats",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(P.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.Heliostat,P.newValue)}};d(P),s(V.Heliostat,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.Heliostat&&z.foundationId===m.foundationId&&j.set(z.id,z.reflectance)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Reflectance for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.Heliostat,R.groupId,R.newValue)}};d(R),c(V.Heliostat,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.reflectance:m.reflectance,W={name:"Set Heliostat Reflectance",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.heliostatReflectance=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.Heliostat?null:Object(gf.jsx)(kP,{width:600,title:me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",A),onApply:function(){P(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},precision:2,step:.01,value:v,onChange:b}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",A)})]})})})]})})},dH=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Zr),o=Ew(ac),i=Ew(oc),n=Ew(ic),c=Ew(Sr),s=Ew(Ic),d=Ew(Cc),h=Ew(Ii),p=Ew(Ci),y=OP(V.Heliostat),g=Object(r.useState)(!!(null===y||void 0===y?void 0:y.drawSunBeam)),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.drawSunBeam=t)}}catch(r){o.e(r)}finally{o.f()}}))},A=function(e){if(y&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var o=t.value;if(o.type===V.Heliostat&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)&&o.drawSunBeam!==e)return!0}}catch(h){a.e(h)}finally{a.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(l);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Heliostat&&!n.locked&&n.drawSunBeam!==e)return!0}}catch(h){r.e(h)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,d=Object(f.a)(l);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(u.type===V.Heliostat&&u.foundationId===(null===y||void 0===y?void 0:y.foundationId)&&!u.locked&&u.drawSunBeam!==e)return!0}}catch(h){d.e(h)}finally{d.f()}break;default:if((null===y||void 0===y?void 0:y.drawSunBeam)!==e)return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var t,r=new Map,d=Object(f.a)(l);try{for(d.s();!(t=d.n()).done;){var g=t.value;g.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(g.id)&&r.set(g.id,g.drawSunBeam)}}catch(W){d.e(W)}finally{d.f()}var m={name:"Draw Sun Beam for Selected Heliostats",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){var e,t=Object(f.a)(m.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){b(m.oldValues,m.newValue)}};c(m),b(r,e),p(h+1);break;case _.AllObjectsOfThisType:var w,x=new Map,v=Object(f.a)(l);try{for(v.s();!(w=v.n()).done;){var A=w.value;A.type===V.Heliostat&&x.set(A.id,A.drawSunBeam)}}catch(W){v.e(W)}finally{v.f()}var T={name:"Draw Sun Beam for All Heliostats",timestamp:Date.now(),oldValues:x,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){n(V.Heliostat,T.newValue)}};c(T),n(V.Heliostat,e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(y.foundationId){var P,S=new Map,j=Object(f.a)(l);try{for(j.s();!(P=j.n()).done;){var H=P.value;H.type===V.Heliostat&&H.foundationId===y.foundationId&&S.set(H.id,H.drawSunBeam)}}catch(W){j.e(W)}finally{j.f()}var z={name:"Draw Sun Beam for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:y.foundationId,undo:function(){var e,t=Object(f.a)(z.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],i=l[1];o(a,i)}}catch(W){t.e(W)}finally{t.f()}},redo:function(){z.groupId&&i(V.Heliostat,z.groupId,z.newValue)}};c(z),i(V.Heliostat,y.foundationId,e),p(h+1)}break;default:var R=a(y.id),D=R?R.drawSunBeam:y.drawSunBeam,M={name:"Draw Sun Beam for Heliostat",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:y.id,changedElementType:y.type,undo:function(){o(M.changedElementId,M.oldValue)},redo:function(){o(M.changedElementId,M.newValue)}};c(M),o(y.id,e),p(h+1)}};return(null===y||void 0===y?void 0:y.type)!==V.Heliostat?null:Object(gf.jsx)(kP,{width:500,title:me.t("solarCollectorMenu.DrawSunBeam",v),onApply:function(){A(w)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:4,children:Object(gf.jsx)(eb.a,{checked:w,onChange:x})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",v)})]})})})]})})},uH=db.a.Option,fH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(Oc),c=Ew(Fc),s=Ew(kc),d=Ew(Sr),h=Ew(Ic),p=Ew(Cc),y=Ew(Ii),g=Ew(Ci),m=OP(V.Heliostat),w=Object(r.useState)(null!==(t=null===m||void 0===m?void 0:m.towerId)&&void 0!==t?t:"None"),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=Object(r.useMemo)((function(){var e,t=[],l=Object(f.a)(o);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Foundation){var i=a;i.solarStructure===G.FocusTower&&t.push(i.id)}}}catch(r){l.e(r)}finally{l.f()}return t}),[o]);Object(r.useEffect)((function(){if(b("None"),m)if(m.towerId)b(m.towerId);else{var e=i(m.parentId);e&&e.type===V.Foundation&&e.solarStructure===G.FocusTower&&b(e.id)}}),[m]);var P=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.towerId=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(m&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&a.towerId!==e)return!0}}catch(u){l.e(u)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Heliostat&&!n.locked&&n.towerId!==e)return!0}}catch(u){r.e(u)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Heliostat&&d.foundationId===(null===m||void 0===m?void 0:m.foundationId)&&!d.locked&&d.towerId!==e)return!0}}catch(u){s.e(u)}finally{s.f()}break;default:if((null===m||void 0===m?void 0:m.towerId)!==e)return!0}return!1}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p=t.value;p.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(p.id)&&l.set(p.id,p.towerId)}}catch(I){r.e(I)}finally{r.f()}var w={name:"Set Tower for Selected Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(w.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){P(w.oldValues,w.newValue)}};d(w),P(l,e),g(y+1);break;case _.AllObjectsOfThisType:var x,v=new Map,b=Object(f.a)(o);try{for(b.s();!(x=b.n()).done;){var A=x.value;A.type===V.Heliostat&&v.set(A.id,A.towerId)}}catch(I){b.e(I)}finally{b.f()}var T={name:"Set Tower for All Heliostats",timestamp:Date.now(),oldValues:v,newValue:e,undo:function(){var e,t=Object(f.a)(T.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){s(V.Heliostat,T.newValue)}};d(T),s(V.Heliostat,e),g(y+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(m.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type===V.Heliostat&&z.foundationId===m.foundationId&&j.set(z.id,z.towerId)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Tower for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:m.foundationId,undo:function(){var e,t=Object(f.a)(R.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(I){t.e(I)}finally{t.f()}},redo:function(){R.groupId&&c(V.Heliostat,R.groupId,R.newValue)}};d(R),c(V.Heliostat,m.foundationId,e),g(y+1)}break;default:var D=i(m.id),M=D?D.towerId:m.towerId,W={name:"Set Tower for Heliostat",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:m.id,changedElementType:m.type,undo:function(){n(W.changedElementId,W.oldValue)},redo:function(){n(W.changedElementId,W.newValue)}};d(W),n(m.id,e),g(y+1)}a((function(t){t.actionState.heliostatTower=e}))}};return(null===m||void 0===m?void 0:m.type)!==V.Heliostat?null:Object(gf.jsx)(kP,{width:600,title:me.t("heliostatMenu.SelectTowerToReflectSunlightTo",A),onApply:function(){v&&S(v),l(!1),g(0)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)(db.a,{style:{width:"120px"},value:v,onChange:b,children:T.map((function(e,t){return Object(gf.jsx)(uH,{value:e,children:me.t("heliostatMenu.Tower",A)+" "+(t+1)},t)}))})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){p(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",A)})]})})})]})})},hH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Zr),n=Ew(pc),c=Ew(yc),s=Ew(gc),d=Ew($r),h=Ew(Sr),p=Ew(Ic),y=Ew(Cc),g=Ew(Ii),m=Ew(Ci),w=OP(V.Heliostat),x=Object(r.useState)(null!==(t=null===w||void 0===w?void 0:w.poleRadius)&&void 0!==t?t:.1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=$f(),P=function(e,t){Ew.getState().set((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Heliostat&&!i.locked&&e.has(i.id)&&(i.poleRadius=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(w&&function(e){if(w){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Heliostat&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)){var i=a;if(Math.abs(i.poleRadius-e)>At)return!0}}}catch(A){l.e(A)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(o);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Heliostat&&!c.locked){var s=c;if(Math.abs(s.poleRadius-e)>At)return!0}}}catch(A){n.e(A)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(o);try{for(h.s();!(u=h.n()).done;){var y=u.value;if(y.type===V.Heliostat&&y.foundationId===(null===w||void 0===w?void 0:w.foundationId)&&!y.locked){var g=y;if(Math.abs(g.poleRadius-e)>At)return!0}}}catch(A){h.e(A)}finally{h.f()}break;case _.AllObjectsOfThisTypeOnSurface:if(d(w)){var m,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Heliostat&&v.parentId===w.parentId&&!v.locked){var b=v;if(Math.abs(b.poleRadius-e)>At)return!0}}}catch(A){x.e(A)}finally{x.f()}}break;default:if(Math.abs((null===w||void 0===w?void 0:w.poleRadius)-e)>At)return!0}return!1}}(e)){switch(p){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var y=t.value;y.type===V.Heliostat&&Ew.getState().selectedElementIdSet.has(y.id)&&l.set(y.id,y.poleRadius)}}catch(C){r.e(C)}finally{r.f()}var x={name:"Set Pole Radius for Selected Heliostats",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(x.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){P(x.oldValues,x.newValue)}};h(x),P(l,e),m(g+1);break;case _.AllObjectsOfThisType:var v,b=new Map,A=Object(f.a)(o);try{for(A.s();!(v=A.n()).done;){var T=v.value;T.type===V.Heliostat&&b.set(T.id,T.poleRadius)}}catch(C){A.e(C)}finally{A.f()}var S={name:"Set Pole Radius for All Heliostats",timestamp:Date.now(),oldValues:b,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){s(V.Heliostat,S.newValue)}};h(S),s(V.Heliostat,e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(w.foundationId){var j,H=new Map,z=Object(f.a)(o);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type===V.Heliostat&&R.foundationId===w.foundationId&&H.set(R.id,R.poleRadius)}}catch(C){z.e(C)}finally{z.f()}var D={name:"Set Pole Radius for All Heliostats Above Foundation",timestamp:Date.now(),oldValues:H,newValue:e,groupId:w.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(C){t.e(C)}finally{t.f()}},redo:function(){D.groupId&&c(V.Heliostat,D.groupId,D.newValue)}};h(D),c(V.Heliostat,w.foundationId,e),m(g+1)}break;default:var M=i(w.id),W=M?M.poleRadius:w.poleRadius,I={name:"Set Heliostat Pole Radius",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:w.id,changedElementType:w.type,undo:function(){n(I.changedElementId,I.oldValue)},redo:function(){n(I.changedElementId,I.newValue)}};h(I),n(w.id,e),m(g+1)}a((function(t){t.actionState.heliostatPoleRadius=e}))}};return(null===w||void 0===w?void 0:w.type)!==V.Heliostat?null:Object(gf.jsx)(kP,{width:600,title:me.t("solarCollectorMenu.PoleRadius",T),onApply:function(){S(b)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:.5,style:{width:120},step:.01,precision:2,value:b,onChange:A}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",T),": [0.1, 0.5] ",me.t("word.MeterAbbreviation",T)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",T)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){y(e.target.value)},value:p,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("heliostatMenu.OnlyThisHeliostat",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("heliostatMenu.AllHeliostatsAboveFoundation",T)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("heliostatMenu.AllSelectedHeliostats",T)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("heliostatMenu.AllHeliostats",T)})]})})})]})})},pH=n.a.memo((function(){var e,t,l,a,o=Ew(Vi),i=Ew(Ci),n=OP(V.Heliostat),c=Object(r.useState)(!1),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),O=C[0],F=C[1],k=zP(n),Y=k.labelText,L=k.setLabelText,E=RP(n),U=DP(n,Y),N=WP(n),J=MP(n),G=IP(n),X=CP(n);if(!n)return null;var B={lng:o},K=!(null===n||void 0===n?void 0:n.locked);return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"heliostat-copy",paddingLeft:"36px"}),K&&Object(gf.jsx)(PP,{keyName:"heliostat-cut",paddingLeft:"36px"}),Object(gf.jsx)(SP,{keyName:"heliostat-lock"}),n&&K&&Object(gf.jsxs)(gf.Fragment,{children:[O&&Object(gf.jsx)(fH,{setDialogVisible:F}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),F(!0)},children:[me.t("heliostatMenu.SelectTowerToReflectSunlightTo",B)," ..."]},"heliostat-tower"),y&&Object(gf.jsx)(nH,{setDialogVisible:g}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),g(!0)},children:[me.t("word.Length",B)," ..."]},"heliostat-length"),d&&Object(gf.jsx)(rH,{setDialogVisible:f}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),f(!0)},children:[me.t("word.Width",B)," ..."]},"heliostat-width"),x&&Object(gf.jsx)(cH,{setDialogVisible:v}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),v(!0)},children:[me.t("solarCollectorMenu.ExtraPoleHeight",B)," ..."]},"heliostat-pole-height"),T&&Object(gf.jsx)(hH,{setDialogVisible:P}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),P(!0)},children:[me.t("solarCollectorMenu.PoleRadius",B)," ..."]},"heliostat-pole-radius"),H&&Object(gf.jsx)(sH,{setDialogVisible:z}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),z(!0)},children:[me.t("concentratedSolarPowerCollectorMenu.ReflectorReflectance",B)," ..."]},"heliostat-reflectance"),M&&Object(gf.jsx)(dH,{setDialogVisible:W}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){i(0),W(!0)},children:[me.t("solarCollectorMenu.DrawSunBeam",B)," ..."]},"heliostat-draw-sun-beam"),Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",B),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===n||void 0===n?void 0:n.showLabel),onChange:E,children:me.t("labelSubMenu.KeepShowingLabel",B)})},"heliostat-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.Label",B)+":",value:Y,onChange:function(e){return L(e.target.value)},onPressEnter:U,onBlur:U})},"heliostat-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",B)+":",min:.2,max:5,step:.1,precision:1,value:null!==(e=n.labelHeight)&&void 0!==e?e:.2,onChange:function(e){return X(e)}})},"heliostat-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",B)+":",min:10,max:100,step:1,precision:0,value:null!==(t=n.labelFontSize)&&void 0!==t?t:20,onChange:function(e){return J(e)}})},"heliostat-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",B)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=n.labelSize)&&void 0!==l?l:.2,onChange:function(e){return N(e)}})},"heliostat-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",B)+":",value:null!==(a=n.labelColor)&&void 0!==a?a:"#ffffff",onChange:function(e){return G(e.target.value)}})},"heliostat-label-color")]})]},"heliostat-label")]})]})})),yH=db.a.Option,gH=function(){var e,t=Ew(si),l=Ew(Vi),a=Ew(Sr),o=Ew.getState().getSelectedElement(),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d={lng:l},h=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Tree&&i.id===e){i.name=l;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(db.a,{style:{width:"160px"},value:null!==(e=null===o||void 0===o?void 0:o.name)&&void 0!==e?e:oe.Pine,onChange:function(e){if(o){var l=o.name;if(l!==e){var i={name:"Change Tree",timestamp:Date.now(),oldValue:l,newValue:e,changedElementId:o.id,changedElementType:o.type,undo:function(){h(i.changedElementId,i.oldValue)},redo:function(){h(i.changedElementId,i.newValue)}};a(i),h(o.id,e),t((function(t){t.actionState.treeType=e})),s(!c)}}},children:[Object(gf.jsxs)(yH,{value:oe.Apple,children:[Object(gf.jsx)("img",{alt:oe.Apple,src:dx,height:20,style:{paddingRight:"8px"}})," ",me.t("tree.Apple",d)]},oe.Apple),Object(gf.jsxs)(yH,{value:oe.Birch,children:[Object(gf.jsx)("img",{alt:oe.Birch,src:px,height:20,style:{paddingRight:"20px"}})," ",me.t("tree.Birch",d)]},oe.Birch),Object(gf.jsxs)(yH,{value:oe.Coconut,children:[Object(gf.jsx)("img",{alt:oe.Coconut,src:mx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.Coconut",d)]},oe.Coconut),Object(gf.jsxs)(yH,{value:oe.Dogwood,children:[Object(gf.jsx)("img",{alt:oe.Dogwood,src:xx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Dogwood",d)]},oe.Dogwood),Object(gf.jsxs)(yH,{value:oe.Elm,children:[Object(gf.jsx)("img",{alt:oe.Elm,src:Tx,height:20,style:{paddingRight:"20px"}}),me.t("tree.Elm",d)]},oe.Elm),Object(gf.jsxs)(yH,{value:oe.FanPalm,children:[Object(gf.jsx)("img",{alt:oe.FanPalm,src:jx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.FanPalm",d)]},oe.FanPalm),Object(gf.jsxs)(yH,{value:oe.Linden,children:[Object(gf.jsx)("img",{alt:oe.Linden,src:zx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Linden",d)]},oe.Linden),Object(gf.jsxs)(yH,{value:oe.Magnolia,children:[Object(gf.jsx)("img",{alt:oe.Magnolia,src:Wx,height:20,style:{paddingRight:"10px"}})," ",me.t("tree.Magnolia",d)]},oe.Magnolia),Object(gf.jsxs)(yH,{value:oe.Maple,children:[Object(gf.jsx)("img",{alt:oe.Maple,src:Fx,height:20,style:{paddingRight:"12px"}})," ",me.t("tree.Maple",d)]},oe.Maple),Object(gf.jsxs)(yH,{value:oe.Oak,children:[Object(gf.jsx)("img",{alt:oe.Oak,src:Ex,height:20,style:{paddingRight:"17px"}}),me.t("tree.Oak",d)]},oe.Oak),Object(gf.jsxs)(yH,{value:oe.Pine,children:[Object(gf.jsx)("img",{alt:oe.Pine,src:Vx,height:20,style:{paddingRight:"18px"}})," ",me.t("tree.Pine",d)]},oe.Pine),Object(gf.jsxs)(yH,{value:oe.Spruce,children:[Object(gf.jsx)("img",{alt:oe.Spruce,src:Jx,height:20,style:{paddingRight:"20px"}})," ",me.t("tree.Spruce",d)]},oe.Spruce)]})},mH=n.a.memo((function(){var e,t,l,a,o,i,n=Ew(si),c=Ew(Vi),s=Ew(An),d=Ew(zn),h=OP(V.Tree),p=Ew(Sr),y=Object(r.useState)(null!==(e=null===h||void 0===h?void 0:h.lx)&&void 0!==e?e:1),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.lz)&&void 0!==t?t:1),v=Object(u.a)(x,2),b=v[0],A=v[1],T=zP(h),P=T.labelText,S=T.setLabelText,j=RP(h),H=DP(h,P),z=WP(h),R=MP(h),D=IP(h),M=CP(h);if(!h)return null;var W={lng:c},I=!(null===h||void 0===h?void 0:h.locked),C=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Tree&&i.id===e){i.showModel=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},O=function(e,t){n((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Tree&&i.id===e){i.flip=t;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"tree-copy"}),I&&Object(gf.jsx)(PP,{keyName:"tree-cut"}),Object(gf.jsx)(SP,{keyName:"tree-lock"}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:(null===h||void 0===h?void 0:h.showModel)&&(null===h||void 0===h?void 0:h.type)===V.Tree,onChange:function(e){return function(e){if(h){var t={name:"Show Tree Model",timestamp:Date.now(),checked:e,selectedElementId:h.id,selectedElementType:V.Tree,undo:function(){C(h.id,!t.checked)},redo:function(){C(h.id,t.checked)}};p(t),C(h.id,e)}}(e.target.checked)},children:me.t("treeMenu.ShowModel",W)})},"tree-show-model"),I&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:h.flip,onChange:function(e){var t=e.target.checked,l={name:"Flip Tree",timestamp:Date.now(),checked:t,selectedElementId:h.id,selectedElementType:V.Tree,undo:function(){O(h.id,!l.checked)},redo:function(){O(h.id,l.checked)}};p(l),O(h.id,t)},children:me.t("treeMenu.Flip",{lng:c})})},"tree-flip"),I&&Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"100px"},children:[me.t("treeMenu.Type",W),": "]}),Object(gf.jsx)(gH,{},"trees")]},"tree-change-type"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginBottom:0,marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"100px"},children:[me.t("treeMenu.Spread",W)+" ("+me.t("word.MeterAbbreviation",W)+")",":"]}),Object(gf.jsx)($v.a,{style:{width:"160px"},min:1,max:50,step:1,precision:1,value:m,onChange:function(e){return function(e){if(h&&e&&e!==m){var t={name:"Set Tree Spread",timestamp:Date.now(),oldValue:m,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){s(t.changedElementId,t.oldValue)},redo:function(){s(t.changedElementId,t.newValue)}};p(t),s(h.id,e),w(e),n((function(t){t.actionState.treeSpread=e}))}}(e)}})]},"tree-spread"),Object(gf.jsxs)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:[Object(gf.jsxs)(wv.b,{style:{width:"100px"},children:[me.t("word.Height",W)+" ("+me.t("word.MeterAbbreviation",W)+")",":"]}),Object(gf.jsx)($v.a,{style:{width:"160px"},min:1,max:30,step:1,precision:1,value:b,onChange:function(e){return function(e){if(h&&e&&e!==b){var t={name:"Set Tree Height",timestamp:Date.now(),oldValue:b,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){d(t.changedElementId,t.oldValue)},redo:function(){d(t.changedElementId,t.newValue)}};p(t),d(h.id,e),A(e),n((function(t){t.actionState.treeHeight=e}))}}(e)}})]},"tree-height")]}),I&&Object(gf.jsxs)(HP.a,{title:me.t("labelSubMenu.Label",W),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!(null===h||void 0===h?void 0:h.showLabel),onChange:j,children:me.t("labelSubMenu.KeepShowingLabel",W)})},"tree-show-label"),Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px"},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelText",W)+":",value:P,onChange:function(e){return S(e.target.value)},onPressEnter:H,onBlur:H})},"tree-label-text"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelHeight",W)+":",min:.2,max:5,step:.1,precision:1,value:null!==(l=h.labelHeight)&&void 0!==l?l:.2,onChange:function(e){return M(e)}})},"tree-label-height"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelFontSize",W)+":",min:10,max:100,step:1,precision:0,value:null!==(a=h.labelFontSize)&&void 0!==a?a:20,onChange:function(e){return R(e)}})},"tree-label-font-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)($v.a,{addonBefore:me.t("labelSubMenu.LabelSize",W)+":",min:.2,max:5,step:.1,precision:1,value:null!==(o=h.labelSize)&&void 0!==o?o:.2,onChange:function(e){return z(e)}})},"tree-label-size"),Object(gf.jsx)(Qv.a.Item,{style:{height:"36px",paddingLeft:"36px",marginTop:0},children:Object(gf.jsx)(ET.a,{addonBefore:me.t("labelSubMenu.LabelColor",W)+":",value:null!==(i=h.labelColor)&&void 0!==i?i:"#ffffff",onChange:function(e){return D(e.target.value)}})},"tree-label-color")]})]},"tree-label")]})})),wH=l(806),xH="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH5QsaESMnxG6tNgAAARJJREFUeJzt2kFqQkEQhOHpoeahXtN4rEDwCgm4EBEMARMI2YXkDAbeCaJu+wZdi/87QUHT46sZ4/Pr/dZgQ7336gxI1IKBOFHvUZ0BCUeWGQZihiPLjMaYqjMg0TzP1RmQxMNmTTE0EofjnoEY0Wq1rM6ARO3GgjhR0EOsKIIe4oSmboamboYNMaPGQKyo86NuhSPLDAMxw1eWGU0T7yFOdLn8VWdAoqfHbXUGJHF6PXLda0RjjOoMSNQaC+KEHmJGjasTK2yIGZq6GTbEDO8hZngPMcORZYaBmOEry4wWS/7b60S/3z/VGZDo5XlXnQFJnD/euO41ouv/tToDEtELvdBDzPAeYoYNMcNAzHB1YuYO6bYjJ2+wRTUAAAAASUVORK5CYII=",vH="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAIAAAAlV+npAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QsaESMX4redmgAAARNJREFUaIHt2sGtwjAQBFB2PY6ggbSc+//0AI2AOCMOiIgOkgKQENDC7mk10rwKRqvYsie2ZVk3EgNvVp2BBtxadQYacNewomCmZRjl1QGYaFgJ9nq9qzPQwDzfqzPQwPF4qM5Awx7zszoDDXy/1RF4oHdUZ6CBoffqDDQA6MuKgrnOpVForrthlPqsBLhpGUap/EvQBp+gSSVoWAk6lCZgXZfqDDSw//+rzkDDrtdbdQYa2O521RlooDUdSqMwDOqzogBoWFFwXXfC1GclwDWsMLUOCeqzErTBJ2hSCRpWAkw/LMLw+egxWxSmaarOQMNO50t1BhoYx7E6Aw29g09Qn5WArj4rDKZaOQxQRROmPivhByjbHph8EXN9AAAAAElFTkSuQmCC",bH=l.p+"static/media/wall_03_menu.39f5c56a.png",AH="data:image/png;base64,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",TH=l.p+"static/media/wall_05_menu.c887c64e.png",PH=l.p+"static/media/wall_06_menu.3dc4a0c2.png",SH="data:image/png;base64,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",jH="data:image/png;base64,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",HH=l.p+"static/media/wall_09_menu.5124ae81.png",zH=l.p+"static/media/wall_10_menu.a934991d.png",RH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew(Qu),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=$f(),p=OP(V.Wall),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.textureType)&&void 0!==t?t:ue.Default),g=Object(u.a)(y,2),m=g[0],w=g[1],x=db.a.Option,v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Wall&&i.id===e&&!i.locked){i.textureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){if(p){var t=Tw.getAllConnectedWalls(p);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.textureType=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Wall||i.foundationId!==e||i.locked||(i.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.textureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(p&&function(e){if(p){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.textureType&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.textureType&&!c.locked)return!0}}catch(w){r.e(w)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Wall&&u.foundationId===p.foundationId&&e!==u.textureType&&!u.locked)return!0}}catch(w){d.e(w)}finally{d.f()}break;case _.AllConnectedObjects:var h,y=Tw.getAllConnectedWalls(p),g=Object(f.a)(y);try{for(g.s();!(h=g.n()).done;){var m=h.value;if(e!==m.textureType&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.textureType))return!0}return!1}}(e)){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var h,y=t.value;if(y.type===V.Wall&&!y.locked&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(h=y.textureType)&&void 0!==h?h:ue.Default)}}catch(J){r.e(J)}finally{r.f()}var g={name:"Set Texture for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){P(g.oldValues,g.newValue)}};i(g),P(l,e),s(c+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var S,j=m.value;if(j.type===V.Wall&&!j.locked)w.set(j.id,null!==(S=j.textureType)&&void 0!==S?S:ue.Default)}}catch(J){x.e(J)}finally{x.f()}var H={name:"Set Texture for All Walls",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){T(H.newValue)}};i(H),T(e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M=z.value;M.type!==V.Wall||M.foundationId!==p.foundationId||M.locked||R.set(M.id,M.textureType)}}catch(J){D.e(J)}finally{D.f()}var W={name:"Set Texture for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:p.foundationId,undo:function(){var e,t=Object(f.a)(W.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){W.groupId&&A(W.groupId,W.newValue)}};i(W),A(p.foundationId,e),s(c+1)}break;case _.AllConnectedObjects:if(p){var I,C=Tw.getAllConnectedWalls(p),O=new Map,F=Object(f.a)(C);try{for(F.s();!(I=F.n()).done;){var k=I.value;O.set(k.id,k.textureType)}}catch(J){F.e(J)}finally{F.f()}var Y={name:"Set Texture for All Connected Walls",timestamp:Date.now(),oldValues:O,newValue:e,undo:function(){var e,t=Object(f.a)(Y.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){b(Y.newValue)}};i(Y),b(e),s(c+1)}break;default:if(p){var L,E=d(p.id),U=null!==(L=null===E||void 0===E?void 0:E.textureType)&&void 0!==L?L:p.textureType,N={name:"Set Texture of Selected Wall",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(N.changedElementId,N.oldValue)},redo:function(){v(N.changedElementId,N.newValue)}};i(N),v(p.id,e),s(c+1)}}a((function(t){t.actionState.wallTexture=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Texture",h),onApply:function(){S(m)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:m,onChange:w,children:[Object(gf.jsxs)(x,{value:ue.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",h)]},ue.NoTexture),Object(gf.jsxs)(x,{value:ue.Default,children:[Object(gf.jsx)("img",{alt:ue.Default,src:tp,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.TextureDefault",h)]},ue.Default),Object(gf.jsxs)(x,{value:ue.Texture01,children:[Object(gf.jsx)("img",{alt:ue.Texture01,src:xH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture01",h)]},ue.Texture01),Object(gf.jsxs)(x,{value:ue.Texture02,children:[Object(gf.jsx)("img",{alt:ue.Texture02,src:vH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture02",h)]},ue.Texture02),Object(gf.jsxs)(x,{value:ue.Texture03,children:[Object(gf.jsx)("img",{alt:ue.Texture03,src:bH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture03",h)]},ue.Texture03),Object(gf.jsxs)(x,{value:ue.Texture04,children:[Object(gf.jsx)("img",{alt:ue.Texture04,src:AH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture04",h)]},ue.Texture04),Object(gf.jsxs)(x,{value:ue.Texture05,children:[Object(gf.jsx)("img",{alt:ue.Texture05,src:TH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture05",h)]},ue.Texture05),Object(gf.jsxs)(x,{value:ue.Texture06,children:[Object(gf.jsx)("img",{alt:ue.Texture06,src:PH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture06",h)]},ue.Texture06),Object(gf.jsxs)(x,{value:ue.Texture07,children:[Object(gf.jsx)("img",{alt:ue.Texture07,src:SH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture07",h)]},ue.Texture07),Object(gf.jsxs)(x,{value:ue.Texture08,children:[Object(gf.jsx)("img",{alt:ue.Texture08,src:jH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture08",h)]},ue.Texture08),Object(gf.jsxs)(x,{value:ue.Texture09,children:[Object(gf.jsx)("img",{alt:ue.Texture09,src:HH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture09",h)]},ue.Texture09),Object(gf.jsxs)(x,{value:ue.Texture10,children:[Object(gf.jsx)("img",{alt:ue.Texture10,src:zH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture10",h)]},ue.Texture10)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",h)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",h)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",h)})]})})})]})})},DH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),r=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=OP(V.Wall),h=$f(),p=FP(null!==(t=null===d||void 0===d?void 0:d.color)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Wall&&i.id===e&&!i.locked){i.color=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},x=function(e){if(d){var t=Tw.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.color=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Wall||i.foundationId!==e||i.locked||(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.color=e)}}catch(i){a.e(i)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){if(d&&function(e){if(d){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.color&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,n=Object(f.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.color&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(o);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Wall&&h.foundationId===d.foundationId&&e!==h.color&&!h.locked)return!0}}catch(w){u.e(w)}finally{u.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(d),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.color&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.color))return!0}return!1}}(e)){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=new Map,h=Object(f.a)(o);try{for(h.s();!(t=h.n()).done;){var p,y=t.value;if(y.type===V.Wall&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.color)&&void 0!==p?p:"#ffffff")}}catch(B){h.e(B)}finally{h.f()}var g={name:"Set Color for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};i(g),A(l,e),c(n+1);break;case _.AllObjectsOfThisType:var m,T=new Map,P=Object(f.a)(o);try{for(P.s();!(m=P.n()).done;){var S,j=m.value;if(j.type===V.Wall)T.set(j.id,null!==(S=j.color)&&void 0!==S?S:"#ffffff")}}catch(B){P.e(B)}finally{P.f()}var H={name:"Set Color for All Walls",timestamp:Date.now(),oldValues:T,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){b(H.newValue)}};i(H),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Wall&&W.foundationId===d.foundationId)R.set(W.id,null!==(M=W.color)&&void 0!==M?M:"#ffffff")}}catch(B){D.e(B)}finally{D.f()}var I={name:"Set Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){I.groupId&&v(I.groupId,I.newValue)}};i(I),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:var C,O=Tw.getAllConnectedWalls(d),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y,L=C.value;F.set(L.id,null!==(Y=L.color)&&void 0!==Y?Y:"#ffffff")}}catch(B){k.e(B)}finally{k.f()}var E={name:"Set Color for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){x(E.newValue)}};i(E),x(e),c(n+1);break;default:if(d){var U,N,J=s(d.id),G=null!==(U=null!==(N=null===J||void 0===J?void 0:J.color)&&void 0!==N?N:d.color)&&void 0!==U?U:"#ffffff",X={name:"Set Color of Selected Wall",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(X.changedElementId,X.oldValue)},redo:function(){w(X.changedElementId,X.newValue)}};i(X),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("wallMenu.Color",h),onApply:function(){T(g)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:m})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:r,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",h)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",h)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",h)})]})})})]})})},MH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),r=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=OP(V.Wall),h=FP(null!==(t=null===d||void 0===d?void 0:d.structureColor)&&void 0!==t?t:"#ffffff"),p=Object(u.a)(h,2),y=p[0],g=p[1],m=$f(),w=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall&&!i.locked){i.structureColor=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},x=function(e){if(d){var t=Tw.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.structureColor=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.parentId!==e||i.type!==V.Wall||i.locked||(i.structureColor=t)}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.structureColor=e)}}catch(i){a.e(i)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){if(d&&function(e){if(d){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.structureColor&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,n=Object(f.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.structureColor&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(o);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Wall&&h.foundationId===d.foundationId&&e!==h.structureColor&&!h.locked)return!0}}catch(w){u.e(w)}finally{u.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(d),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.structureColor&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.structureColor))return!0}return!1}}(e)){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=new Map,h=Object(f.a)(o);try{for(h.s();!(t=h.n()).done;){var p,y=t.value;if(y.type===V.Wall&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.structureColor)&&void 0!==p?p:"#ffffff")}}catch(B){h.e(B)}finally{h.f()}var g={name:"Set Structure Color for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};i(g),A(l,e),c(n+1);break;case _.AllObjectsOfThisType:var m,T=new Map,P=Object(f.a)(o);try{for(P.s();!(m=P.n()).done;){var S,j=m.value;if(j.type===V.Wall)T.set(j.id,null!==(S=j.structureColor)&&void 0!==S?S:"#ffffff")}}catch(B){P.e(B)}finally{P.f()}var H={name:"Set Structure Color for All Walls",timestamp:Date.now(),oldValues:T,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){b(H.newValue)}};i(H),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Wall&&W.foundationId===d.foundationId)R.set(W.id,null!==(M=W.structureColor)&&void 0!==M?M:"#ffffff")}}catch(B){D.e(B)}finally{D.f()}var I={name:"Set Structure Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){I.groupId&&v(I.groupId,I.newValue)}};i(I),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:if(d){var C,O=Tw.getAllConnectedWalls(d),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y,L=C.value;F.set(L.id,null!==(Y=L.color)&&void 0!==Y?Y:"#ffffff")}}catch(B){k.e(B)}finally{k.f()}var E={name:"Set Structure Color for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){x(E.newValue)}};i(E),x(e),c(n+1)}break;default:if(d){var U,N,J=s(d.id),G=null!==(U=null!==(N=null===J||void 0===J?void 0:J.structureColor)&&void 0!==N?N:d.structureColor)&&void 0!==U?U:"#ffffff",X={name:"Set Structure Color of Selected Wall",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(X.changedElementId,X.oldValue)},redo:function(){w(X.changedElementId,X.newValue)}};i(X),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallStructureColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("wallMenu.StructureColor",m),onApply:function(){T(y)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:y,onChangeComplete:g})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:r,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",m)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",m)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",m)})]})})})]})})},WH=function(e){var t=e.wall,l=e.dataType,a=e.attributeKey,o=e.range,i=e.step,n=e.unit,c=e.setDialogVisible,s=Ew(Fi),d=Ew(Sr),h=Ew(Qu),p=Ew(Ii),y=Ew(Ci),g=Ew(si),m=Object(r.useRef)(t[a]),w=$f(),x=function(e){g((function(t){switch(a){case"ly":t.actionState.wallThickness=e;break;case"lz":t.actionState.wallHeight=e;break;case"opacity":t.actionState.wallOpacity=e;break;case"structureSpacing":t.actionState.wallStructureSpacing=e;break;case"structureWidth":t.actionState.wallStructureWidth=e;break;case"eavesLength":t.actionState.wallEavesLength=e}}))},v=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&r.type===V.Wall&&!r.locked){r[a]=t;break}}}catch(n){i.e(n)}finally{i.f()}})),x(t)},b=function(e){var l=Tw.getAllConnectedWalls(t);0!==l.length&&(g((function(t){var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(!r.locked){var n,c=Object(f.a)(t.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.id===r.id&&s.type===V.Wall&&(s[a]=e)}}catch(d){c.e(d)}finally{c.f()}}}}catch(d){i.e(d)}finally{i.f()}})),x(e))},A=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.parentId!==e||r.type!==V.Wall||r.locked||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}})),x(t)},T=function(e){g((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type!==V.Wall||i.locked||(i[a]=e)}}catch(r){o.e(r)}finally{o.f()}})),x(e)},P=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Wall&&!r.locked&&e.has(r.id)&&(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}})),x(t)},S=function(e){if(t&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(s);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&e!==i[a]&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(x){o.e(x)}finally{o.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(s);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&e!==c[a]&&!c.locked)return!0}}catch(x){n.e(x)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(s);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Wall&&p.foundationId===t.foundationId&&e!==p[a]&&!p.locked)return!0}}catch(x){u.e(x)}finally{u.f()}break;case _.AllConnectedObjects:var y,g=Tw.getAllConnectedWalls(t),m=Object(f.a)(g);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(e!==w[a]&&!w.locked)return!0}}catch(x){m.e(x)}finally{m.f()}break;default:if(e!==t[a])return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var o,i=new Map,r=Object(f.a)(s);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Wall&&Ew.getState().selectedElementIdSet.has(n.id)&&i.set(n.id,n[a])}}catch(L){r.e(L)}finally{r.f()}var c={name:"Set ".concat(l," for Selected Walls"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){var e,t=Object(f.a)(c.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){P(c.oldValues,c.newValue)}};d(c),P(i,e),y(p+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(s);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.Wall&&m.set(x.id,x[a])}}catch(L){w.e(L)}finally{w.f()}var S={name:"Set ".concat(l," for All Walls"),timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){T(S.newValue)}};d(S),T(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var j,H=new Map,z=Object(f.a)(s);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type===V.Wall&&R.foundationId===t.foundationId&&H.set(R.id,R[a])}}catch(L){z.e(L)}finally{z.f()}var D={name:"Set ".concat(l," for All Walls Above Foundation"),timestamp:Date.now(),oldValues:H,newValue:e,groupId:t.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){D.groupId&&A(D.groupId,D.newValue)}};d(D),A(t.foundationId,e),y(p+1)}break;case _.AllConnectedObjects:if(t){var M,W=Tw.getAllConnectedWalls(t),I=new Map,C=Object(f.a)(W);try{for(C.s();!(M=C.n()).done;){var O=M.value;I.set(O.id,O[a])}}catch(L){C.e(L)}finally{C.f()}var F={name:"Set ".concat(l," for All Connected Walls"),timestamp:Date.now(),oldValues:I,newValue:e,undo:function(){var e,t=Object(f.a)(F.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){b(F.newValue)}};d(F),b(e),y(p+1)}break;default:if(t){var k=t[a],Y={name:"Set Wall ".concat(l),timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){v(Y.changedElementId,Y.oldValue)},redo:function(){v(Y.changedElementId,Y.newValue)}};d(Y),v(t.id,e),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("wallMenu.".concat(l),w),onApply:function(){S(m.current)},onClose:function(){m.current=t[a],c()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:o[0],max:o[1],style:{width:120},step:i,precision:2,defaultValue:t[a],onChange:function(e){return m.current=e}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [",o.toString(),"] ",n]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:null!==n&&void 0!==n?n:" "}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},IH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Wall),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Tw.toRValueInUS(g)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];T(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;T(o,t)}}catch(i){a.e(i)}finally{a.f()}},j=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Wall&&e!==o.rValue&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&e!==c.rValue&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Wall&&u.foundationId===h.foundationId&&e!==u.rValue&&!u.locked)return!0}}catch(w){d.e(w)}finally{d.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(h),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.rValue&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rValue))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Wall&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p,y=u;l.set(u.id,null!==(p=y.rValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(B){r.e(B)}finally{r.f()}var g={name:"Set R-Value for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){P(g.oldValues)},redo:function(){S(g.oldValues,g.newValue)}};o(g),c(n+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Wall&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.rValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(B){x.e(B)}finally{x.f()}var j={name:"Set R-Value for All Walls",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){P(j.oldValues)},redo:function(){S(j.oldValues,j.newValue)}};o(j),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(null===h||void 0===h?void 0:h.foundationId){var H,z=new Map,R=Object(f.a)(a);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.Wall&&D.foundationId===h.foundationId&&!D.locked){var M,W=D;z.set(D.id,null!==(M=W.rValue)&&void 0!==M?M:2),T(W.id,e)}}}catch(B){R.e(B)}finally{R.f()}var I={name:"Set R-Value for All Walls Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:h.foundationId,undo:function(){P(I.oldValues)},redo:function(){S(I.oldValues,I.newValue)}};o(I),c(n+1)}break;case _.AllConnectedObjects:if(h){var C,O=Tw.getAllConnectedWalls(h),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y=C.value;if(!Y.locked){var L,E=Y;F.set(Y.id,null!==(L=E.rValue)&&void 0!==L?L:2),T(E.id,e)}}}catch(B){k.e(B)}finally{k.f()}var U={name:"Set R-Value for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){P(U.oldValues)},redo:function(){S(U.oldValues,U.newValue)}};o(U),c(n+1)}break;default:if(h){var N,J,G=null!==(N=null!==(J=s(h.id).rValue)&&void 0!==J?J:h.rValue)&&void 0!==N?N:2,X={name:"Set Wall R-Value",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){T(X.changedElementId,X.oldValue)},redo:function(){T(X.changedElementId,X.newValue)}};o(X),T(h.id,e),c(n+1)}}d((function(t){t.actionState.wallRValue=e}))}};return Object(gf.jsx)(kP,{width:550,title:"".concat(me.t("word.RValue",A)+" ","(").concat(me.t("word.ThermalResistance",A),")"),onApply:function(){j(g)},onClose:function(){var e;m(null!==(e=null===h||void 0===h?void 0:h.rValue)&&void 0!==e?e:2),l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){m(e),b(Tw.toRValueInUS(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",A),": m\xb2\xb7\u2103/W"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toRValueInUS(.01),max:Tw.toRValueInUS(100),style:{width:120},step:.01,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),m(Tw.toRValueInSI(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Tw.toRValueInUS(.01).toFixed(3),", ",Tw.toRValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",A),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",A)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",A)})]})})})]})})},CH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Wall),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.volumetricHeatCapacity)&&void 0!==t?t:.5),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.volumetricHeatCapacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Wall&&e!==o.volumetricHeatCapacity&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Wall&&u.foundationId===h.foundationId&&e!==u.volumetricHeatCapacity&&!u.locked)return!0}}catch(w){d.e(w)}finally{d.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(h),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.volumetricHeatCapacity&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.volumetricHeatCapacity))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Wall&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p,y=u;l.set(u.id,null!==(p=y.volumetricHeatCapacity)&&void 0!==p?p:.5),x(y.id,e)}}}catch(B){r.e(B)}finally{r.f()}var g={name:"Set Volumetric Heat Capacity for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(g.oldValues)},redo:function(){b(g.oldValues,g.newValue)}};o(g),c(n+1);break;case _.AllObjectsOfThisType:var m,w=new Map,A=Object(f.a)(a);try{for(A.s();!(m=A.n()).done;){var T=m.value;if(T.type===V.Wall&&!T.locked){var P,S=T;w.set(T.id,null!==(P=S.volumetricHeatCapacity)&&void 0!==P?P:.5),x(S.id,e)}}}catch(B){A.e(B)}finally{A.f()}var j={name:"Set Volumetric Heat Capacity for All Walls",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){v(j.oldValues)},redo:function(){b(j.oldValues,j.newValue)}};o(j),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(null===h||void 0===h?void 0:h.foundationId){var H,z=new Map,R=Object(f.a)(a);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.Wall&&D.foundationId===h.foundationId&&!D.locked){var M,W=D;z.set(D.id,null!==(M=W.volumetricHeatCapacity)&&void 0!==M?M:.5),x(W.id,e)}}}catch(B){R.e(B)}finally{R.f()}var I={name:"Set Volumetric Heat Capacity for All Walls Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:h.foundationId,undo:function(){v(I.oldValues)},redo:function(){b(I.oldValues,I.newValue)}};o(I),c(n+1)}break;case _.AllConnectedObjects:if(h){var C,O=Tw.getAllConnectedWalls(h),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y=C.value;if(!Y.locked){var L,E=Y;F.set(Y.id,null!==(L=E.volumetricHeatCapacity)&&void 0!==L?L:.5),x(E.id,e)}}}catch(B){k.e(B)}finally{k.f()}var U={name:"Set Volumetric Heat Capacity for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){v(U.oldValues)},redo:function(){b(U.oldValues,U.newValue)}};o(U),c(n+1)}break;default:if(h){var N,J,G=null!==(N=null!==(J=s(h.id).volumetricHeatCapacity)&&void 0!==J?J:h.volumetricHeatCapacity)&&void 0!==N?N:.5,X={name:"Set Volumetric Heat Capacity of Wall",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(X.changedElementId,X.oldValue)},redo:function(){x(X.changedElementId,X.newValue)}};o(X),x(h.id,e),c(n+1)}}d((function(t){t.actionState.wallVolumetricHeatCapacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:m}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},OH=function(e){var t=e.wall,l=e.dataType,a=e.attributeKey,o=e.range,i=e.step,n=e.unit,c=e.setDialogVisible,s=Ew(Fi),d=Ew(Sr),h=Ew(Qu),p=Ew(Ii),y=Ew(Ci),g=Ew(si),m=Object(r.useRef)(t.parapet[a]),w=$f(),x=function(e){g((function(t){switch(a){case"copingsHeight":t.actionState.wallParapet.copingsHeight=e;break;case"copingsWidth":t.actionState.wallParapet.copingsWidth=e;break;case"parapetHeight":t.actionState.wallParapet.parapetHeight=e}}))},v=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&r.type===V.Wall&&!r.locked){r.parapet[a]=t;break}}}catch(n){i.e(n)}finally{i.f()}})),x(t)},b=function(e){var l=Tw.getAllConnectedWalls(t);0!==l.length&&(g((function(t){var o,i=Object(f.a)(l);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(!r.locked){var n,c=Object(f.a)(t.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.id===r.id&&s.type===V.Wall&&(s.parapet[a]=e)}}catch(d){c.e(d)}finally{c.f()}}}}catch(d){i.e(d)}finally{i.f()}})),x(e))},A=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.parentId!==e||r.type!==V.Wall||r.locked||(r.parapet[a]=t)}}catch(n){i.e(n)}finally{i.f()}})),x(t)},T=function(e){g((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.type!==V.Wall||i.locked||(i.parapet[a]=e)}}catch(r){o.e(r)}finally{o.f()}})),x(e)},P=function(e,t){g((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.Wall&&!r.locked&&e.has(r.id)&&(r.parapet[a]=t)}}catch(n){i.e(n)}finally{i.f()}})),x(t)},S=function(e){if(t&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(s);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Wall&&e!==i.parapet[a]&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(x){o.e(x)}finally{o.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(s);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Wall&&e!==c.parapet[a]&&!c.locked)return!0}}catch(x){n.e(x)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(s);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Wall&&p.foundationId===t.foundationId&&e!==p.parapet[a]&&!p.locked)return!0}}catch(x){u.e(x)}finally{u.f()}break;case _.AllConnectedObjects:var y,g=Tw.getAllConnectedWalls(t),m=Object(f.a)(g);try{for(m.s();!(y=m.n()).done;){var w=y.value;if(e!==w.parapet[a]&&!w.locked)return!0}}catch(x){m.e(x)}finally{m.f()}break;default:if(e!==t.parapet[a])return!0}return!1}(e))switch(h){case _.AllSelectedObjectsOfThisType:var o,i=new Map,r=Object(f.a)(s);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Wall&&Ew.getState().selectedElementIdSet.has(n.id)&&i.set(n.id,n.parapet[a])}}catch(L){r.e(L)}finally{r.f()}var c={name:"Set ".concat(l," for Selected Walls"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){var e,t=Object(f.a)(c.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){P(c.oldValues,c.newValue)}};d(c),P(i,e),y(p+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(s);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type===V.Wall&&m.set(x.id,x.parapet[a])}}catch(L){w.e(L)}finally{w.f()}var S={name:"Set ".concat(l," for All Walls"),timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){var e,t=Object(f.a)(S.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){T(S.newValue)}};d(S),T(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var j,H=new Map,z=Object(f.a)(s);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type===V.Wall&&R.foundationId===t.foundationId&&H.set(R.id,R.parapet[a])}}catch(L){z.e(L)}finally{z.f()}var D={name:"Set ".concat(l," for All Walls Above Foundation"),timestamp:Date.now(),oldValues:H,newValue:e,groupId:t.foundationId,undo:function(){var e,t=Object(f.a)(D.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){D.groupId&&A(D.groupId,D.newValue)}};d(D),A(t.foundationId,e),y(p+1)}break;case _.AllConnectedObjects:if(t){var M,W=Tw.getAllConnectedWalls(t),I=new Map,C=Object(f.a)(W);try{for(C.s();!(M=C.n()).done;){var O=M.value;I.set(O.id,O.parapet[a])}}catch(L){C.e(L)}finally{C.f()}var F={name:"Set ".concat(l," for All Connected Walls"),timestamp:Date.now(),oldValues:I,newValue:e,undo:function(){var e,t=Object(f.a)(F.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(L){t.e(L)}finally{t.f()}},redo:function(){b(F.newValue)}};d(F),b(e),y(p+1)}break;default:if(t){var k=t.parapet[a],Y={name:"Set Wall ".concat(l),timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){v(Y.changedElementId,Y.oldValue)},redo:function(){v(Y.changedElementId,Y.newValue)}};d(Y),v(t.id,e),y(p+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("wallMenu.".concat(l),w),onApply:function(){S(m.current)},onClose:function(){c()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:o[0],max:o[1],style:{width:120},step:i,precision:2,defaultValue:t.parapet[a],onChange:function(e){return m.current=e}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [",o.toString(),"] ",n]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:null!==n&&void 0!==n?n:" "}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})},FH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),r=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=OP(V.Wall),h=$f(),p=FP(null!==(t=null===d||void 0===d?void 0:d.parapet.color)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall&&!i.locked){i.parapet.color=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},x=function(e){if(d){var t=Tw.getAllConnectedWalls(d);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.parapet.color=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.parentId!==e||i.type!==V.Wall||i.locked||(i.parapet.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.parapet.color=e)}}catch(i){a.e(i)}finally{a.f()}}))},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.parapet.color=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){if(d&&function(e){if(d){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.parapet.color&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,n=Object(f.a)(o);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.parapet.color&&!c.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(o);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Wall&&h.foundationId===d.foundationId&&e!==h.parapet.color&&!h.locked)return!0}}catch(w){u.e(w)}finally{u.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(d),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.parapet.color&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.parapet.color))return!0}return!1}}(e)){switch(r){case _.AllSelectedObjectsOfThisType:var t,l=new Map,h=Object(f.a)(o);try{for(h.s();!(t=h.n()).done;){var p,y=t.value;if(y.type===V.Wall&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.parapet.color)&&void 0!==p?p:"#ffffff")}}catch(B){h.e(B)}finally{h.f()}var g={name:"Set Parapet Color for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){A(g.oldValues,g.newValue)}};i(g),A(l,e),c(n+1);break;case _.AllObjectsOfThisType:var m,T=new Map,P=Object(f.a)(o);try{for(P.s();!(m=P.n()).done;){var S,j=m.value;if(j.type===V.Wall)T.set(j.id,null!==(S=j.parapet.color)&&void 0!==S?S:"#ffffff")}}catch(B){P.e(B)}finally{P.f()}var H={name:"Set Parapet Color for All Walls",timestamp:Date.now(),oldValues:T,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){b(H.newValue)}};i(H),b(e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M,W=z.value;if(W.type===V.Wall&&W.foundationId===d.foundationId)R.set(W.id,null!==(M=W.parapet.color)&&void 0!==M?M:"#ffffff")}}catch(B){D.e(B)}finally{D.f()}var I={name:"Set Parapet Color for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:d.foundationId,undo:function(){var e,t=Object(f.a)(I.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){I.groupId&&v(I.groupId,I.newValue)}};i(I),v(d.foundationId,e),c(n+1)}break;case _.AllConnectedObjects:if(d){var C,O=Tw.getAllConnectedWalls(d),F=new Map,k=Object(f.a)(O);try{for(k.s();!(C=k.n()).done;){var Y,L=C.value;F.set(L.id,null!==(Y=L.color)&&void 0!==Y?Y:"#ffffff")}}catch(B){k.e(B)}finally{k.f()}var E={name:"Set Parapet Color for All Connected Walls",timestamp:Date.now(),oldValues:F,newValue:e,undo:function(){var e,t=Object(f.a)(E.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];w(a,o)}}catch(B){t.e(B)}finally{t.f()}},redo:function(){x(E.newValue)}};i(E),x(e),c(n+1)}break;default:if(d){var U,N,J=s(d.id),G=null!==(U=null!==(N=null===J||void 0===J?void 0:J.parapet.color)&&void 0!==N?N:d.parapet.color)&&void 0!==U?U:"#ffffff",X={name:"Set Parapet Color of Selected Wall",timestamp:Date.now(),oldValue:G,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(X.changedElementId,X.oldValue)},redo:function(){w(X.changedElementId,X.newValue)}};i(X),w(d.id,e),c(n+1)}}a((function(t){t.actionState.wallParapet.color=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("wallMenu.ParapetColor",h),onApply:function(){T(g)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:m})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:r,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",h)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",h)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",h)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",h)})]})})})]})})},kH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew(Qu),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=OP(V.Wall),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.parapet.textureType)&&void 0!==t?t:ue.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=db.a.Option,v=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Wall&&i.id===e&&!i.locked){i.parapet.textureType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){if(h){var t=Tw.getAllConnectedWalls(h);0!==t.length&&a((function(l){var a,o=Object(f.a)(t);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(!i.locked){var r,n=Object(f.a)(l.elements);try{for(n.s();!(r=n.n()).done;){var c=r.value;c.id===i.id&&c.type===V.Wall&&(c.parapet.textureType=e)}}catch(s){n.e(s)}finally{n.f()}}}}catch(s){o.e(s)}finally{o.f()}}))}},A=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type!==V.Wall||i.foundationId!==e||i.locked||(i.parapet.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e){a((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;o.type!==V.Wall||o.locked||(o.parapet.textureType=e)}}catch(i){a.e(i)}finally{a.f()}}))},P=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.type===V.Wall&&!i.locked&&e.has(i.id)&&(i.parapet.textureType=t)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e){if(h&&function(e){if(h){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Wall&&e!==a.parapet.textureType&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(w){l.e(w)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Wall&&e!==c.parapet.textureType&&!c.locked)return!0}}catch(w){r.e(w)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Wall&&u.foundationId===h.foundationId&&e!==u.parapet.textureType&&!u.locked)return!0}}catch(w){d.e(w)}finally{d.f()}break;case _.AllConnectedObjects:var p,y=Tw.getAllConnectedWalls(h),g=Object(f.a)(y);try{for(g.s();!(p=g.n()).done;){var m=p.value;if(e!==m.parapet.textureType&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.parapet.textureType))return!0}return!1}}(e)){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var p,y=t.value;if(y.type===V.Wall&&!y.locked&&Ew.getState().selectedElementIdSet.has(y.id))l.set(y.id,null!==(p=y.parapet.textureType)&&void 0!==p?p:ue.Default)}}catch(J){r.e(J)}finally{r.f()}var g={name:"Set Parapet Texture for Selected Walls",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){var e,t=Object(f.a)(g.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){P(g.oldValues,g.newValue)}};i(g),P(l,e),s(c+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(o);try{for(x.s();!(m=x.n()).done;){var S,j=m.value;if(j.type===V.Wall&&!j.locked)w.set(j.id,null!==(S=j.parapet.textureType)&&void 0!==S?S:ue.Default)}}catch(J){x.e(J)}finally{x.f()}var H={name:"Set Parapet Texture for All Walls",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){var e,t=Object(f.a)(H.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){T(H.newValue)}};i(H),T(e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var z,R=new Map,D=Object(f.a)(o);try{for(D.s();!(z=D.n()).done;){var M=z.value;M.type!==V.Wall||M.foundationId!==h.foundationId||M.locked||R.set(M.id,M.parapet.textureType)}}catch(J){D.e(J)}finally{D.f()}var W={name:"Set Parapet Texture for All Walls Above Foundation",timestamp:Date.now(),oldValues:R,newValue:e,groupId:h.foundationId,undo:function(){var e,t=Object(f.a)(W.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){W.groupId&&A(W.groupId,W.newValue)}};i(W),A(h.foundationId,e),s(c+1)}break;case _.AllConnectedObjects:if(h){var I,C=Tw.getAllConnectedWalls(h),O=new Map,F=Object(f.a)(C);try{for(F.s();!(I=F.n()).done;){var k=I.value;O.set(k.id,k.parapet.textureType)}}catch(J){F.e(J)}finally{F.f()}var Y={name:"Set Parapet Texture for All Connected Walls",timestamp:Date.now(),oldValues:O,newValue:e,undo:function(){var e,t=Object(f.a)(Y.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];v(a,o)}}catch(J){t.e(J)}finally{t.f()}},redo:function(){b(Y.newValue)}};i(Y),b(e),s(c+1)}break;default:if(h){var L,E=d(h.id),U=null!==(L=null===E||void 0===E?void 0:E.parapet.textureType)&&void 0!==L?L:h.parapet.textureType,N={name:"Set Parapet Texture of Selected Wall",timestamp:Date.now(),oldValue:U,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(N.changedElementId,N.oldValue)},redo:function(){v(N.changedElementId,N.newValue)}};i(N),v(h.id,e),s(c+1)}}a((function(t){t.actionState.wallParapet.textureType=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Texture",w),onApply:function(){S(g)},onClose:function(){l()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:g,onChange:m,children:[Object(gf.jsxs)(x,{value:ue.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",w)]},ue.NoTexture),Object(gf.jsxs)(x,{value:ue.Default,children:[Object(gf.jsx)("img",{alt:ue.Default,src:tp,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.TextureDefault",w)]},ue.Default),Object(gf.jsxs)(x,{value:ue.Texture01,children:[Object(gf.jsx)("img",{alt:ue.Texture01,src:xH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture01",w)]},ue.Texture01),Object(gf.jsxs)(x,{value:ue.Texture02,children:[Object(gf.jsx)("img",{alt:ue.Texture02,src:vH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture02",w)]},ue.Texture02),Object(gf.jsxs)(x,{value:ue.Texture03,children:[Object(gf.jsx)("img",{alt:ue.Texture03,src:bH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture03",w)]},ue.Texture03),Object(gf.jsxs)(x,{value:ue.Texture04,children:[Object(gf.jsx)("img",{alt:ue.Texture04,src:AH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture04",w)]},ue.Texture04),Object(gf.jsxs)(x,{value:ue.Texture05,children:[Object(gf.jsx)("img",{alt:ue.Texture05,src:TH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture05",w)]},ue.Texture05),Object(gf.jsxs)(x,{value:ue.Texture06,children:[Object(gf.jsx)("img",{alt:ue.Texture06,src:PH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture06",w)]},ue.Texture06),Object(gf.jsxs)(x,{value:ue.Texture07,children:[Object(gf.jsx)("img",{alt:ue.Texture07,src:SH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture07",w)]},ue.Texture07),Object(gf.jsxs)(x,{value:ue.Texture08,children:[Object(gf.jsx)("img",{alt:ue.Texture08,src:jH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture08",w)]},ue.Texture08),Object(gf.jsxs)(x,{value:ue.Texture09,children:[Object(gf.jsx)("img",{alt:ue.Texture09,src:HH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture09",w)]},ue.Texture09),Object(gf.jsxs)(x,{value:ue.Texture10,children:[Object(gf.jsx)("img",{alt:ue.Texture10,src:zH,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("wallMenu.Texture10",w)]},ue.Texture10)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWallActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("wallMenu.OnlyThisWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllConnectedObjects,children:me.t("wallMenu.AllConnectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("wallMenu.AllWallsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("wallMenu.AllSelectedWalls",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("wallMenu.AllWalls",w)})]})})})]})})};!function(e){e.Height="Height",e.Opacity="Opacity",e.StructureSpacing="StructureSpacing",e.StructureWidth="StructureWidth",e.Thickness="Thickness",e.StructureColor="StructureColor",e.Color="Color",e.Texture="Texture",e.EavesLength="EavesLength",e.ParapetColor="ParapetColor",e.ParapetTexture="ParapetTexture",e.ParapetHeight="ParapetHeight",e.CopingsHeight="CopingsHeight",e.CopingsWidth="CopingsWidth"}(yj||(yj={}));var YH,LH={Height:{attributeKey:"lz",range:[.1,100],step:.1,unit:"word.MeterAbbreviation"},Opacity:{attributeKey:"opacity",range:[0,1],step:.01},StructureSpacing:{attributeKey:"structureSpacing",range:[.1,1e3],step:.1,unit:"word.MeterAbbreviation"},StructureWidth:{attributeKey:"structureWidth",range:[.01,1],step:.1,unit:"word.MeterAbbreviation"},Thickness:{attributeKey:"ly",range:[.1,1],step:.01,unit:"word.MeterAbbreviation"},EavesLength:{attributeKey:"eavesLength",range:[-.1,5],step:.01,unit:"word.MeterAbbreviation"},ParapetHeight:{attributeKey:"parapetHeight",range:[0,5],step:.01,unit:"word.MeterAbbreviation"},CopingsHeight:{attributeKey:"copingsHeight",range:[0,1],step:.01,unit:"word.MeterAbbreviation"},CopingsWidth:{attributeKey:"copingsWidth",range:[0,3],step:.01,unit:"word.MeterAbbreviation"}},EH={ParapetHeight:{attributeKey:"parapetHeight",range:[0,5],step:.01,unit:"word.MeterAbbreviation"},CopingsHeight:{attributeKey:"copingsHeight",range:[0,1],step:.01,unit:"word.MeterAbbreviation"},CopingsWidth:{attributeKey:"copingsWidth",range:[0,3],step:.01,unit:"word.MeterAbbreviation"}},UH={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},NH=n.a.memo((function(){var e=Ew(Vi),t=Ew(si),l=Ew(Ci),a=Ew(hs),o=Ew(es),i=Ew(Sr),n=Ew(pn),c=Ew(hn),s=Ew(Bc),d=Ew(Xc),p=Ew(qc),y=Ew(_r),g=OP(V.Wall),m=Object(r.useState)(null),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1];if(!g)return null;var R={lng:e},D=function(e,l){t((function(t){var a=t.elements.find((function(t){return t.id===e&&t.type===V.Wall}));a&&(a.parapet.display=l)}))},M=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall){var r=i;r.wallStructure=l,l!==Ne.Stud&&l!==Ne.Pillar||(r.opacity=0);break}}}catch(n){o.e(n)}finally{o.f()}}))},W=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall){i.fill=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},I=function(e,l){t((function(t){var a,o=Object(f.a)(t.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Wall){i.openToOutside=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},C=function(e){return Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),v(e)},children:[me.t("wallMenu.".concat(e),R)," ..."]},"wall-".concat(e))},O=function(e,l){if(0===l)return null;var a=function(e,t){return"".concat(me.t("wallMenu.DoYouReallyWantToRemoveAll".concat(e,"sOnThisWall"),R)," (").concat(t," ").concat(me.t("wallMenu.".concat(e,"s"),R),")?")},r=e.replaceAll(" ","");return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:a(r,l),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){!function(e){if(g){var l=Ew.getState().elements.filter((function(t){return!t.locked&&t.type===e&&t.parentId===g.id}));o(g.id,e);var a=JSON.parse(JSON.stringify(l)),r={name:"Remove All ".concat(e,"s on Wall"),timestamp:Date.now(),parentId:g.id,removedElements:a,undo:function(){t((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(r.removedElements))}))},redo:function(){o(r.parentId,e)}};i(r)}}(e)}})},children:[me.t("wallMenu.RemoveAllUnlocked".concat(r,"s"),R)," (",l,")"]},"remove-all-".concat(r,"s-on-wall"))},F=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(t=o.n()).done;){var r=t.value;r.parentId===g.id&&r.type===e&&a.set(r.id,!!r.locked)}}catch(d){o.e(d)}finally{o.f()}c(g.id,e,!0);var s={name:"Lock All "+l+" on Wall",timestamp:Date.now(),oldValues:a,newValue:!0,undo:function(){var e,t=Object(f.a)(s.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(d){t.e(d)}finally{t.f()}},redo:function(){c(g.id,e,!0)}};i(s)}},children:[me.t("wallMenu.LockAll".concat(l,"s"),R)," (",t,")"]},"lock-all-".concat(l,"s-on-wall"))},k=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(gf.jsx)(Qv.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(t=o.n()).done;){var r=t.value;r.parentId===g.id&&r.type===e&&a.set(r.id,!!r.locked)}}catch(d){o.e(d)}finally{o.f()}c(g.id,e,!1);var s={name:"Unlock All "+l+" on Wall",timestamp:Date.now(),oldValues:a,newValue:!0,undo:function(){var e,t=Object(f.a)(s.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(d){t.e(d)}finally{t.f()}},redo:function(){c(g.id,e,!1)}};i(s)}},children:me.t("wallMenu.UnlockAll".concat(l,"s"),R)},"unlock-all-".concat(l,"s-on-wall"))},Y=function(e,t){return 0===e?null:Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(g){var e,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;o.parentId===g.id&&o.type===V.Light&&l.set(o.id,o.inside)}}catch(n){a.e(n)}finally{a.f()}s(g.id,t);var r={name:t?"Set All Lights on Wall Inside":"Set All Lights on Wall Outside",timestamp:Date.now(),oldValues:l,newValue:!0,undo:function(){var e,t=Object(f.a)(r.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];d(a,o)}}catch(n){t.e(n)}finally{t.f()}},redo:function(){s(g.id,t)}};i(r)}},children:[me.t(t?"wallMenu.AllLightsOnWallInside":"wallMenu.AllLightsOnWallOutside",R)," (",e,")"]},t?"inside-lights-on-wall":"outside-lights-on-wall")};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){var e=Ew.getState().elementsToPaste;if(e&&e.length>0){var t=e[0];if(Tw.isLegalOnWall(t.type))return!0}return!1}()?Object(gf.jsx)(AP,{keyName:"wall-paste"}):null,Object(gf.jsx)(TP,{keyName:"wall-copy"}),!g||g.locked?null:Object(gf.jsx)(PP,{keyName:"wall-cut"}),Object(gf.jsx)(SP,{keyName:"wall-lock"}),!g.locked&&Object(gf.jsxs)(gf.Fragment,{children:[function(){switch(x){case yj.Height:case yj.Opacity:case yj.Thickness:case yj.StructureSpacing:case yj.StructureWidth:case yj.EavesLength:var e=LH[x];return e?Object(gf.jsx)(WH,{wall:g,dataType:x,attributeKey:e.attributeKey,range:e.range,step:e.step,setDialogVisible:function(){return v(null)},unit:e.unit?me.t(e.unit,R):void 0}):null;case yj.ParapetHeight:case yj.CopingsHeight:case yj.CopingsWidth:var t=EH[x];return t?Object(gf.jsx)(OH,{wall:g,dataType:x,attributeKey:t.attributeKey,range:t.range,step:t.step,setDialogVisible:function(){return v(null)},unit:t.unit?me.t(t.unit,R):void 0}):null;case yj.Color:return Object(gf.jsx)(DH,{setDialogVisible:function(){return v(null)}});case yj.StructureColor:return Object(gf.jsx)(MH,{setDialogVisible:function(){return v(null)}});case yj.ParapetColor:return Object(gf.jsx)(FH,{setDialogVisible:function(){return v(null)}});case yj.Texture:return Object(gf.jsx)(RH,{setDialogVisible:function(){return v(null)}});case yj.ParapetTexture:return Object(gf.jsx)(kH,{setDialogVisible:function(){return v(null)}})}}(),function(){var e=g?a(g.id,!0):new Rw;if(e.gotSome()&&Ew.getState().contextMenuObjectType){var t=g?a(g.id,!1):new Rw;return Object(gf.jsxs)(HP.a,{title:me.t("word.Elements",R),style:{paddingLeft:"24px"},children:[O(V.Window,t.windowCount),O(V.Door,t.doorCount),O(V.SolarPanel,t.solarPanelCount),O(V.Sensor,t.sensorCount),O(V.Light,t.insideLightCount+t.outsideLightCount),O(V.Polygon,t.polygonCount),F(V.Window,t.windowCount),k(V.Window,e.windowCount),F(V.SolarPanel,t.solarPanelCount),k(V.SolarPanel,e.solarPanelCount),F(V.Sensor,t.sensorCount),k(V.Sensor,e.sensorCount),Y(e.outsideLightCount,!0),Y(e.insideLightCount,!1),F(V.Polygon,t.polygonCount),k(V.Polygon,e.polygonCount)]},"lock-unlock-clear-on-wall")}return null}(),g?Object(gf.jsxs)(HP.a,{title:me.t("wallMenu.Parapet",R),style:{paddingLeft:"24px"},children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:g.parapet.display,onChange:function(e){var l=e.target.checked,a={name:"Parapet",timestamp:Date.now(),checked:l,selectedElementId:g.id,selectedElementType:g.type,undo:function(){D(g.id,!a.checked)},redo:function(){D(g.id,a.checked)}};i(a),D(g.id,l),t((function(e){e.actionState.wallParapet.display=l}))},children:me.t("wallMenu.Parapet",{lng:e})})},"parapet"),Object(gf.jsx)(wH.a,{plain:!0,style:{margin:"6px"}}),C(yj.ParapetColor),C(yj.ParapetTexture),C(yj.ParapetHeight),C(yj.CopingsHeight),C(yj.CopingsWidth)]},"wall-parapet"):null,function(){var e;return g?Object(gf.jsx)(HP.a,{title:me.t("wallMenu.WallStructure",R),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(tb.a.Group,{value:null!==(e=g.wallStructure)&&void 0!==e?e:Ne.Default,style:{height:"75px"},onChange:function(e){var l={name:"Select Wall Structure",timestamp:Date.now(),oldValue:g.wallStructure,newValue:e.target.value,changedElementId:g.id,changedElementType:g.type,undo:function(){M(l.changedElementId,l.oldValue)},redo:function(){M(l.changedElementId,l.newValue)}};i(l),M(g.id,e.target.value),t((function(t){t.actionState.wallStructure=e.target.value,t.actionState.wallStructure!==Ne.Stud&&t.actionState.wallStructure!==Ne.Pillar||(t.actionState.wallOpacity=0)}))},children:[Object(gf.jsx)(tb.a,{style:UH,value:Ne.Default,children:me.t("wallMenu.DefaultStructure",R)}),Object(gf.jsx)(tb.a,{style:UH,value:Ne.Stud,children:me.t("wallMenu.StudStructure",R)}),Object(gf.jsx)(tb.a,{style:UH,value:Ne.Pillar,children:me.t("wallMenu.PillarStructure",R)})]})},"wall-structure"):null}(),(null===g||void 0===g?void 0:g.wallStructure)===Ne.Stud||(null===g||void 0===g?void 0:g.wallStructure)===Ne.Pillar?Object(gf.jsxs)(gf.Fragment,{children:[C(yj.StructureSpacing),C(yj.StructureWidth),C(yj.StructureColor),C(yj.Opacity)]}):null,Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){if(g){var e=y(g);if(e){var l=function(e,t,l){var a=t.cx,o=t.cy,i=t.cz,r=l?l.rotation[2]+t.relativeAngle:t.relativeAngle;if(l&&void 0!==r){var n=Tw.wallAbsolutePosition(new Me.Vector3(a,o,i),l).setZ(t.lz/2+l.lz);return(new Me.Vector3).subVectors(e,n).applyEuler(new Me.Euler(0,0,-r))}return new Me.Vector3}(Ew.getState().pastePoint,g,e);t((function(e){e.objectTypeToAdd=V.Polygon}));var a=Vl.makePolygon(g,-l.x/g.lx,0,-l.z/g.lz,new Me.Vector3(0,0,1),[0,0,0],V.Wall);t((function(e){e.elements.push(a),e.objectTypeToAdd=V.None}));var o={name:"Add",timestamp:Date.now(),addedElement:a,undo:function(){p(o.addedElement.id,!1)},redo:function(){t((function(e){e.elements.push(o.addedElement),e.selectedElement=o.addedElement}))}};i(o),t((function(e){e.objectTypeToAdd=V.None}))}}},children:me.t("foundationMenu.AddPolygon",R)},"add-polygon-on-wall"),g?Object(gf.jsxs)(HP.a,{title:me.t("wallMenu.Fill",R),style:{paddingLeft:"24px"},children:[Object(gf.jsxs)(tb.a.Group,{value:g.fill,style:{height:"75px"},onChange:function(e){var t={name:"Select Wall Fill",timestamp:Date.now(),oldValue:g.fill,newValue:e.target.value,changedElementId:g.id,changedElementType:g.type,undo:function(){W(t.changedElementId,t.oldValue)},redo:function(){W(t.changedElementId,t.newValue)}};i(t),W(g.id,e.target.value)},children:[Object(gf.jsx)(tb.a,{style:UH,value:Ue.Full,children:me.t("wallMenu.Full",R)}),Object(gf.jsx)(tb.a,{style:UH,value:Ue.Partial,children:me.t("wallMenu.Partial",R)}),Object(gf.jsx)(tb.a,{style:UH,value:Ue.Empty,children:me.t("wallMenu.Empty",R)})]}),g.fill!==Ue.Full&&Object(gf.jsx)("div",{style:{paddingLeft:"10px",paddingTop:"10px"},children:Object(gf.jsx)(_v.a,{checked:!!g.openToOutside,onChange:function(e){var t={name:"Set Open to Outside",timestamp:Date.now(),oldValue:!!g.openToOutside,newValue:e.target.checked,changedElementId:g.id,changedElementType:g.type,undo:function(){I(t.changedElementId,t.oldValue)},redo:function(){I(t.changedElementId,t.newValue)}};i(t),I(g.id,e.target.checked)},children:me.t("wallMenu.OpenToOutside",R)})})]},"wall-fill-selection"):null,C(yj.Thickness),C(yj.Height),C(yj.EavesLength),T&&Object(gf.jsx)(IH,{setDialogVisible:P}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),P(!0)},children:[me.t("word.RValue",R)," ..."]},"wall-r-value"),H&&Object(gf.jsx)(CH,{setDialogVisible:z}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),z(!0)},children:[me.t("word.VolumetricHeatCapacity",R)," ..."]},"wall-heat-capacity"),(null===g||void 0===g?void 0:g.wallStructure)===Ne.Default?C(yj.Texture):null,!((null===g||void 0===g?void 0:g.wallStructure)===Ne.Default||void 0===(null===g||void 0===g?void 0:g.opacity)||(null===g||void 0===g?void 0:g.opacity)>0)||(null===g||void 0===g?void 0:g.textureType)!==ue.NoTexture&&(null===g||void 0===g?void 0:g.textureType)!==ue.Default?null:C(yj.Color)]})]})})),VH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(si),d=Ew(Zr),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.textureType)&&void 0!==t?t:fe.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=db.a.Option,v=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.textureType=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.textureType&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&e!==c.textureType&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===h.foundationId&&e!==u.textureType&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===h.parentId&&e!==g.textureType&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.textureType))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(Ew.getState().elements);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Door&&!p.locked&&Ew.getState().selectedElementIdSet.has(p.id))l.set(p.id,null!==(u=p.textureType)&&void 0!==u?u:fe.Default)}}catch(Y){r.e(Y)}finally{r.f()}var y={name:"Set Texture for Selected Doors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),b(l,e),c(n+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(Ew.getState().elements);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Door&&!T.locked)m.set(T.id,null!==(x=T.textureType)&&void 0!==x?x:fe.Default)}}catch(Y){w.e(Y)}finally{w.f()}var P={name:"Set Texture for All Doors",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){A(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};o(P),b(m,e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(Ew.getState().elements);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type!==V.Door||z.foundationId!==h.foundationId||z.locked||j.set(z.id,z.textureType)}}catch(Y){H.e(Y)}finally{H.f()}var R={name:"Set Texture for All Doors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){A(R.oldValues)},redo:function(){R.groupId&&b(R.oldValues,R.newValue)}};o(R),b(j,e),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var D,M=new Map,W=Object(f.a)(Ew.getState().elements);try{for(W.s();!(D=W.n()).done;){var I=D.value;I.type!==V.Door||I.parentId!==h.parentId||I.locked||M.set(I.id,I.textureType)}}catch(Y){W.e(Y)}finally{W.f()}var C={name:"Set Texture for All Doors On the Same Wall",timestamp:Date.now(),oldValues:M,newValue:e,groupId:h.parentId,undo:function(){A(C.oldValues)},redo:function(){C.groupId&&b(C.oldValues,C.newValue)}};o(C),b(M,e),c(n+1)}break;default:if(h){var O=d(h.id),F=O?O.textureType:h.textureType,k={name:"Set Texture of Selected Door",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(k.changedElementId,k.oldValue)},redo:function(){v(k.changedElementId,k.newValue)}};o(k),v(h.id,e),c(n+1)}}s((function(t){t.actionState.doorTexture=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:g,onChange:function(e){return m(e)},children:[Object(gf.jsxs)(x,{value:fe.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",w)]},fe.NoTexture),Object(gf.jsxs)(x,{value:fe.Default,children:[Object(gf.jsx)("img",{alt:fe.Default,src:Jg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.TextureDefault",w)]},fe.Default),Object(gf.jsxs)(x,{value:fe.Texture01,children:[Object(gf.jsx)("img",{alt:fe.Texture01,src:Gg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture01",w)]},fe.Texture01),Object(gf.jsxs)(x,{value:fe.Texture02,children:[Object(gf.jsx)("img",{alt:fe.Texture02,src:Xg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture02",w)]},fe.Texture02),Object(gf.jsxs)(x,{value:fe.Texture03,children:[Object(gf.jsx)("img",{alt:fe.Texture03,src:Bg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture03",w)]},fe.Texture03),Object(gf.jsxs)(x,{value:fe.Texture04,children:[Object(gf.jsx)("img",{alt:fe.Texture04,src:Kg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture04",w)]},fe.Texture04),Object(gf.jsxs)(x,{value:fe.Texture05,children:[Object(gf.jsx)("img",{alt:fe.Texture05,src:qg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture05",w)]},fe.Texture05),Object(gf.jsxs)(x,{value:fe.Texture06,children:[Object(gf.jsx)("img",{alt:fe.Texture06,src:Qg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture06",w)]},fe.Texture06),Object(gf.jsxs)(x,{value:fe.Texture07,children:[Object(gf.jsx)("img",{alt:fe.Texture07,src:Zg,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture07",w)]},fe.Texture07),Object(gf.jsxs)(x,{value:fe.Texture08,children:[Object(gf.jsx)("img",{alt:fe.Texture08,src:_g,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture08",w)]},fe.Texture08),Object(gf.jsxs)(x,{value:fe.Texture09,children:[Object(gf.jsx)("img",{alt:fe.Texture09,src:$g,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture09",w)]},fe.Texture09),Object(gf.jsxs)(x,{value:fe.Texture10,children:[Object(gf.jsx)("img",{alt:fe.Texture10,src:em,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture10",w)]},fe.Texture10),Object(gf.jsxs)(x,{value:fe.Texture11,children:[Object(gf.jsx)("img",{alt:fe.Texture11,src:tm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture11",w)]},fe.Texture11),Object(gf.jsxs)(x,{value:fe.Texture12,children:[Object(gf.jsx)("img",{alt:fe.Texture12,src:lm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture12",w)]},fe.Texture12),Object(gf.jsxs)(x,{value:fe.Texture13,children:[Object(gf.jsx)("img",{alt:fe.Texture13,src:am,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture13",w)]},fe.Texture13),Object(gf.jsxs)(x,{value:fe.Texture14,children:[Object(gf.jsx)("img",{alt:fe.Texture14,src:om,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture14",w)]},fe.Texture14),Object(gf.jsxs)(x,{value:fe.Texture15,children:[Object(gf.jsx)("img",{alt:fe.Texture15,src:im,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture15",w)]},fe.Texture15),Object(gf.jsxs)(x,{value:fe.Texture16,children:[Object(gf.jsx)("img",{alt:fe.Texture16,src:rm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture16",w)]},fe.Texture16),Object(gf.jsxs)(x,{value:fe.Texture17,children:[Object(gf.jsx)("img",{alt:fe.Texture17,src:nm,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("doorMenu.Texture17",w)]},fe.Texture17)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},JH=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew($u),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.color)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.color=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},A=function(e){if(h&&function(e){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Door&&e!==a.color&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Door&&e!==c.color&&!c.locked)return!0}}catch(m){r.e(m)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===(null===h||void 0===h?void 0:h.foundationId)&&e!==u.color&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(o);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===(null===h||void 0===h?void 0:h.parentId)&&e!==g.color&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.color))return!0}return!1}(e)){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(Ew.getState().elements);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Door&&!p.locked&&Ew.getState().selectedElementIdSet.has(p.id))l.set(p.id,null!==(u=p.color)&&void 0!==u?u:"#ffffff")}}catch(U){r.e(U)}finally{r.f()}var y={name:"Set Color for Selected Doors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(y.oldValues)},redo:function(){v(y.oldValues,y.newValue)}};i(y),v(l,e),s(c+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(Ew.getState().elements);try{for(w.s();!(g=w.n()).done;){var A,T=g.value;if(T.type===V.Door&&!T.locked)m.set(T.id,null!==(A=T.color)&&void 0!==A?A:"#ffffff")}}catch(U){w.e(U)}finally{w.f()}var P={name:"Set Color for All Doors",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){b(P.oldValues)},redo:function(){v(P.oldValues,P.newValue)}};i(P),v(m,e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(Ew.getState().elements);try{for(H.s();!(S=H.n()).done;){var z,R=S.value;if(R.type===V.Door&&R.foundationId===h.foundationId&&!h.locked)j.set(R.id,null!==(z=R.color)&&void 0!==z?z:"#ffffff")}}catch(U){H.e(U)}finally{H.f()}var D={name:"Set Color for All Doors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){b(D.oldValues)},redo:function(){D.groupId&&v(D.oldValues,D.newValue)}};i(D),v(j,e),s(c+1)}break;case _.OnlyThisSide:if(h.parentId){var M,W=new Map,I=Object(f.a)(Ew.getState().elements);try{for(I.s();!(M=I.n()).done;){var C,O=M.value;if(O.type===V.Door&&O.parentId===h.parentId&&!h.locked)W.set(O.id,null!==(C=O.color)&&void 0!==C?C:"#ffffff")}}catch(U){I.e(U)}finally{I.f()}var F={name:"Set Color for All Doors On the Same Wall",timestamp:Date.now(),oldValues:W,newValue:e,groupId:h.parentId,undo:function(){b(F.oldValues)},redo:function(){F.groupId&&v(F.oldValues,F.newValue)}};i(F),v(W,e),s(c+1)}break;default:if(h){var k,Y=d(h.id),L=null!==(k=Y?Y.color:h.color)&&void 0!==k?k:"#ffffff",E={name:"Set Color of Selected Door",timestamp:Date.now(),oldValue:L,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(E.changedElementId,E.oldValue)},redo:function(){x(E.changedElementId,E.newValue)}};i(E),x(h.id,e),s(c+1)}}a((function(t){t.actionState.doorColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("word.Color",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},GH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.uValue)&&void 0!==t?t:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Tw.toUValueInUS(g)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.uValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];T(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;T(o,t)}}catch(i){a.e(i)}finally{a.f()}},j=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.uValue&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&e!==c.uValue&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===h.foundationId&&e!==u.uValue&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===h.parentId&&e!==g.uValue&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.uValue))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked){var r,n=i;t.set(i.id,null!==(r=n.uValue)&&void 0!==r?r:1),n.uValue=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set U-Value for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){P(l.oldValues)},redo:function(){S(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i,n=o;r.set(o.id,null!==(i=n.uValue)&&void 0!==i?i:1),n.uValue=e}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set U-Value for All Doors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){P(u.oldValues)},redo:function(){S(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var p=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===h.foundationId&&!o.locked){var i,r=o;p.set(o.id,null!==(i=r.uValue)&&void 0!==i?i:1),r.uValue=e}}}catch(n){a.e(n)}finally{a.f()}}));var y={name:"Set U-Value for All Doors Above Foundation",timestamp:Date.now(),oldValues:p,newValue:e,groupId:h.foundationId,undo:function(){P(y.oldValues)},redo:function(){S(y.oldValues,y.newValue)}};o(y),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var g=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===h.parentId&&!o.locked){var i,r=o;g.set(o.id,null!==(i=r.uValue)&&void 0!==i?i:1),r.uValue=e}}}catch(n){a.e(n)}finally{a.f()}}));var m={name:"Set U-Value for All Doors On the Same Wall",timestamp:Date.now(),oldValues:g,newValue:e,groupId:h.parentId,undo:function(){P(m.oldValues)},redo:function(){S(m.oldValues,m.newValue)}};o(m),c(n+1)}break;default:if(h){var w,x,v=null!==(w=null!==(x=s(h.id).uValue)&&void 0!==x?x:h.uValue)&&void 0!==w?w:1,b={name:"Set Door U-Value",timestamp:Date.now(),oldValue:v,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){T(b.changedElementId,b.oldValue)},redo:function(){T(b.changedElementId,b.newValue)}};o(b),T(h.id,e),c(n+1)}}d((function(t){t.actionState.doorUValue=e}))}};return Object(gf.jsx)(kP,{width:550,title:"".concat(me.t("word.UValue",A)+" ","(").concat(me.t("word.ThermalTransmittance",A),")"),onApply:function(){j(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){m(e),b(Tw.toUValueInUS(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",A),": W/(m\xb2\xb7\u2103)"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toUValueInUS(.01),max:Tw.toUValueInUS(100),style:{width:120},step:.01,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),m(Tw.toUValueInSI(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Tw.toUValueInUS(.01).toFixed(3),", ",Tw.toUValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",A),": Btu/(h\xb7ft\xb2\xb7\u2109)"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",A)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",A)})]})})})]})})},XH=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Sr),o=Ew($u),i=Ew(Ii),n=Ew(Ci),c=Ew(Zr),s=Ew(si),d=Ew($r),h=OP(V.Door),p=Object(r.useMemo)((function(){var e=h?h.lx:1,t=h?d(h):null;return t?e*t.lx:e}),[null===h||void 0===h?void 0:h.lx]),y=Object(r.useState)(p),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){var r=i,n=d(r);r.lx=n?t/n.lx:t;break}}}catch(c){o.e(c)}finally{o.f()}}))},b=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},A=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},T=function(e){if(h&&function(e){if(h){switch(o){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=d(i);if(r&&e!==i.lx*r.lx)return!0}}}catch(T){a.e(T)}finally{a.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(l);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Door&&!s.locked){var u=d(s);if(u&&e!==s.lx*u.lx)return!0}}}catch(T){c.e(T)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var p,y=Object(f.a)(l);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.foundationId===h.foundationId&&!g.locked){var m=d(g);if(m&&e!==g.lx*m.lx)return!0}}}catch(T){y.e(T)}finally{y.f()}break;case _.OnlyThisSide:var w,x=Object(f.a)(l);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.Door&&v.parentId===h.parentId&&!v.locked){var b=d(v);if(b&&e!==v.lx*b.lx)return!0}}}catch(T){x.e(T)}finally{x.f()}break;default:var A=d(h);if(A&&e!==h.lx*A.lx)return!0}return!1}}(e))switch(o){case _.AllSelectedObjectsOfThisType:var t=new Map;s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=i,n=r?d(r):null;t.set(i.id,r.lx*(n?n.lx:1)),r.lx=n?e/n.lx:e}}}catch(c){o.e(c)}finally{o.f()}}));var r={name:"Set Width for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){b(r.oldValues)},redo:function(){A(r.oldValues,r.newValue)}};a(r),n(i+1);break;case _.AllObjectsOfThisType:var u=new Map;s((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i=o,r=i?d(i):null;u.set(o.id,i.lx*(r?r.lx:1)),i.lx=r?e/r.lx:e}}}catch(n){a.e(n)}finally{a.f()}}));var p={name:"Set Width for All Doors",timestamp:Date.now(),oldValues:u,newValue:e,undo:function(){b(p.oldValues)},redo:function(){A(p.oldValues,p.newValue)}};a(p),n(i+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var y=new Map;s((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===h.foundationId&&!o.locked){var i=o,r=i?d(i):null;y.set(o.id,i.lx*(r?r.lx:1)),i.lx=r?e/r.lx:e}}}catch(n){a.e(n)}finally{a.f()}}));var g={name:"Set Width for All Doors Above Foundation",timestamp:Date.now(),oldValues:y,newValue:e,groupId:h.foundationId,undo:function(){b(g.oldValues)},redo:function(){A(g.oldValues,g.newValue)}};a(g),n(i+1)}break;case _.OnlyThisSide:if(h.parentId){var m=new Map;s((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===h.parentId&&!o.locked){var i=o,r=i?d(i):null;m.set(o.id,i.lx*(r?r.lx:1)),i.lx=r?e/r.lx:e}}}catch(n){a.e(n)}finally{a.f()}}));var w={name:"Set Width for All Doors On the Same Wall",timestamp:Date.now(),oldValues:m,newValue:e,groupId:h.parentId,undo:function(){b(w.oldValues)},redo:function(){A(w.oldValues,w.newValue)}};a(w),n(i+1)}break;default:if(h){var x,T,P=c(h.id),S=h?d(P):null,j=(null!==(x=null!==(T=P.lx)&&void 0!==T?T:h.lx)&&void 0!==x?x:.1)*(S?S.lx:1),H={name:"Set Door Width",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(H.changedElementId,H.oldValue)},redo:function(){v(H.changedElementId,H.newValue)}};a(H),v(h.id,e),n(i+1)}}},P=h?d(h):null,S=P&&h?2*P.lx*Math.min(Math.abs(.5-h.cx),Math.abs(-.5-h.cx)):100;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Width",x),onApply:function(){T(m)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:S,style:{width:120},step:.1,precision:2,value:m,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return w(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",x),": [0.1, ",S.toFixed(1),"]",me.t("word.MeterAbbreviation",x)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",x)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:o,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",x)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",x)})]})})})]})})},BH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=Ew($r),p=OP(V.Door),y=Object(r.useMemo)((function(){var e=p?p.lz:1,t=p?h(p):null;return t?e*t.lz:e}),[null===p||void 0===p?void 0:p.lz]),g=Object(r.useState)(y),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){var r=i,n=h(r);r.lz=n?t/n.lz:t,n&&(r.cz=-(n.lz-t)/(2*n.lz));break}}}catch(c){o.e(c)}finally{o.f()}}))},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];b(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;b(o,t)}}catch(i){a.e(i)}finally{a.f()}},P=function(e){if(p&&function(e){if(p){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id)){var r=h(o);if(r&&e!==o.lz*r.lz)return!0}}}catch(T){l.e(T)}finally{l.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(a);try{for(c.s();!(n=c.n()).done;){var s=n.value;if(s.type===V.Door&&!s.locked){var d=h(s);if(d&&e!==s.lz*d.lz)return!0}}}catch(T){c.e(T)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,y=Object(f.a)(a);try{for(y.s();!(u=y.n()).done;){var g=u.value;if(g.type===V.Door&&g.foundationId===p.foundationId&&!g.locked){var m=h(g);if(m&&e!==g.lz*m.lz)return!0}}}catch(T){y.e(T)}finally{y.f()}break;case _.OnlyThisSide:var w,x=Object(f.a)(a);try{for(x.s();!(w=x.n()).done;){var v=w.value;if(v.type===V.Door&&v.parentId===p.parentId&&!v.locked){var b=h(v);if(b&&e!==v.lz*b.lz)return!0}}}catch(T){x.e(T)}finally{x.f()}break;default:var A=h(p);if(A&&e!==p.lz*A.lz)return!0}return!1}}(e))switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=i,n=r?h(r):null;t.set(i.id,r.lz*(n?n.lz:1)),r.lz=n?e/n.lz:e,n&&(r.cz=-(n.lz-e)/(2*n.lz))}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Height for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){A(l.oldValues)},redo:function(){T(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i=o,n=i?h(i):null;r.set(o.id,i.lz*(n?n.lz:1)),i.lz=n?e/n.lz:e,n&&(i.cz=-(n.lz-e)/(2*n.lz))}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set Height for All Doors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){A(u.oldValues)},redo:function(){T(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var y=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===p.foundationId&&!o.locked){var i=o,r=i?h(i):null;y.set(o.id,i.lz*(r?r.lz:1)),i.lz=r?e/r.lz:e,r&&(i.cz=-(r.lz-e)/(2*r.lz))}}}catch(n){a.e(n)}finally{a.f()}}));var g={name:"Set Height for All Doors Above Foundation",timestamp:Date.now(),oldValues:y,newValue:e,groupId:p.foundationId,undo:function(){A(g.oldValues)},redo:function(){T(g.oldValues,g.newValue)}};o(g),c(n+1)}break;case _.OnlyThisSide:if(p.parentId){var m=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===p.parentId&&!o.locked){var i=o,r=i?h(i):null;m.set(o.id,i.lz*(r?r.lz:1)),i.lz=r?e/r.lz:e,r&&(i.cz=-(r.lz-e)/(2*r.lz))}}}catch(n){a.e(n)}finally{a.f()}}));var w={name:"Set Height for All Doors On the Same Wall",timestamp:Date.now(),oldValues:m,newValue:e,groupId:p.parentId,undo:function(){A(w.oldValues)},redo:function(){T(w.oldValues,w.newValue)}};o(w),c(n+1)}break;default:if(p){var x,v,P=s(p.id),S=p?h(P):null,j=(null!==(x=null!==(v=P.lz)&&void 0!==v?v:p.lz)&&void 0!==x?x:.2)*(S?S.lz:1),H={name:"Set Door Height",timestamp:Date.now(),oldValue:j,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){b(H.changedElementId,H.oldValue)},redo:function(){b(H.changedElementId,H.newValue)}};o(H),b(p.id,e),c(n+1)}}},S=p?h(p):null,j=null!==(t=null===S||void 0===S?void 0:S.lz)&&void 0!==t?t:20;return Object(gf.jsx)(kP,{width:550,title:me.t("word.Height",v),onApply:function(){P(w)},onClose:function(){x(y),l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:j,style:{width:120},step:.1,precision:2,value:w,formatter:function(e){return Number(e).toFixed(2)},onChange:x}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",v),": [0.1, ",j.toFixed(1),"]",me.t("word.MeterAbbreviation",v)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",v)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",v)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",v)})]})})})]})})},KH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.volumetricHeatCapacity)&&void 0!==t?t:.5),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.volumetricHeatCapacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.volumetricHeatCapacity&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===(null===h||void 0===h?void 0:h.foundationId)&&e!==u.volumetricHeatCapacity&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===(null===h||void 0===h?void 0:h.parentId)&&e!==g.volumetricHeatCapacity&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.volumetricHeatCapacity))return!0}return!1}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r,n=i;t.set(i.id,null!==(r=n.volumetricHeatCapacity)&&void 0!==r?r:.5),n.volumetricHeatCapacity=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Volumetric Heat Capacity for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){v(l.oldValues)},redo:function(){b(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i,n=o;r.set(o.id,null!==(i=n.volumetricHeatCapacity)&&void 0!==i?i:.5),n.volumetricHeatCapacity=e}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set Volumetric Heat Capacity for All Doors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var p=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===h.foundationId&&!o.locked){var i,r=o;p.set(o.id,null!==(i=r.volumetricHeatCapacity)&&void 0!==i?i:.5),r.volumetricHeatCapacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var y={name:"Set Volumetric Heat Capacity for All Doors Above Foundation",timestamp:Date.now(),oldValues:p,newValue:e,groupId:h.foundationId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var g=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===h.parentId&&!o.locked){var i,r=o;g.set(o.id,null!==(i=r.volumetricHeatCapacity)&&void 0!==i?i:.5),r.volumetricHeatCapacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var m={name:"Set Volumetric Heat Capacity for All Doors On the Same Wall",timestamp:Date.now(),oldValues:g,newValue:e,groupId:h.parentId,undo:function(){v(m.oldValues)},redo:function(){b(m.oldValues,m.newValue)}};o(m),c(n+1)}break;default:if(h){var w,A,T=null!==(w=null!==(A=s(h.id).volumetricHeatCapacity)&&void 0!==A?A:h.volumetricHeatCapacity)&&void 0!==w?w:.5,P={name:"Set Volumetric Heat Capacity of Door",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(P.changedElementId,P.oldValue)},redo:function(){x(P.changedElementId,P.newValue)}};o(P),x(h.id,e),c(n+1)}}d((function(t){t.actionState.doorVolumetricHeatCapacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:m}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},qH=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew($u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Door),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.opacity)&&void 0!==t?t:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.opacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Door&&e!==o.opacity&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Door&&e!==c.opacity&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===h.foundationId&&e!==u.opacity&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Door&&g.parentId===h.parentId&&e!==g.opacity&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.opacity))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Door&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r,n=i;t.set(i.id,null!==(r=n.opacity)&&void 0!==r?r:1),n.opacity=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Opacity for Selected Doors",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){v(l.oldValues)},redo:function(){b(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&!o.locked){var i,n=o;r.set(o.id,null!==(i=n.opacity)&&void 0!==i?i:1),n.opacity=e}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set Opacity for All Doors",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var p=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.foundationId===h.foundationId&&!o.locked){var i,r=o;p.set(o.id,null!==(i=r.opacity)&&void 0!==i?i:1),r.opacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var y={name:"Set Opacity for All Doors Above Foundation",timestamp:Date.now(),oldValues:p,newValue:e,groupId:h.foundationId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var g=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Door&&o.parentId===h.parentId&&!o.locked){var i,r=o;g.set(o.id,null!==(i=r.opacity)&&void 0!==i?i:1),r.opacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var m={name:"Set Opacity for All Doors On the Same Wall",timestamp:Date.now(),oldValues:g,newValue:e,groupId:h.parentId,undo:function(){v(m.oldValues)},redo:function(){b(m.oldValues,m.newValue)}};o(m),c(n+1)}break;default:if(h){var w,A,T=null!==(w=null!==(A=s(h.id).opacity)&&void 0!==A?A:h.opacity)&&void 0!==w?w:1,P={name:"Set Opacity of Door",timestamp:Date.now(),oldValue:T,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(P.changedElementId,P.oldValue)},redo:function(){x(P.changedElementId,P.newValue)}};o(P),x(h.id,e),c(n+1)}}d((function(t){t.actionState.doorOpacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("wallMenu.Opacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",w)})]})})})]})})},QH=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Fi),n=Ew(Sr),c=Ew($u),s=Ew(Ii),d=Ew(Ci),h=Ew(Zr),p=OP(V.Door),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.frameColor)&&void 0!==t?t:"#ffffff"),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||i.type!==V.Door||(i.frameColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e){if(p&&function(e){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(i);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Door&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id)&&e!==a.frameColor)return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var o,r=Object(f.a)(i);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.Door&&!n.locked&&e!==n.frameColor)return!0}}catch(m){r.e(m)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(i);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Door&&u.foundationId===(null===p||void 0===p?void 0:p.foundationId)&&!u.locked&&e!==u.frameColor)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var h,y=Object(f.a)(i);try{for(y.s();!(h=y.n()).done;){var g=h.value;if(g.type===V.Door&&g.parentId===(null===p||void 0===p?void 0:p.parentId)&&!g.locked&&e!==g.frameColor)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.frameColor))return!0}return!1}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Door&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(r=u.frameColor)&&void 0!==r?r:"#ffffff")}}catch(U){a.e(U)}finally{a.f()}var y={name:"Set Color for Selected Doors",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};n(y),b(l,e),d(s+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(Ew.getState().elements);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Door&&!T.locked)m.set(T.id,null!==(x=T.frameColor)&&void 0!==x?x:"#ffffff")}}catch(U){w.e(U)}finally{w.f()}var P={name:"Set Color for All Doors",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){A(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};n(P),b(m,e),d(s+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var S,j=new Map,H=Object(f.a)(Ew.getState().elements);try{for(H.s();!(S=H.n()).done;){var z,R=S.value;if(R.type===V.Door&&R.foundationId===p.foundationId&&!p.locked)j.set(R.id,null!==(z=R.frameColor)&&void 0!==z?z:"#ffffff")}}catch(U){H.e(U)}finally{H.f()}var D={name:"Set Color for All Doors Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:p.foundationId,undo:function(){A(D.oldValues)},redo:function(){D.groupId&&b(D.oldValues,D.newValue)}};n(D),b(j,e),d(s+1)}break;case _.OnlyThisSide:if(p.parentId){var M,W=new Map,I=Object(f.a)(Ew.getState().elements);try{for(I.s();!(M=I.n()).done;){var C,O=M.value;if(O.type===V.Door&&O.parentId===p.parentId&&!p.locked)W.set(O.id,null!==(C=O.frameColor)&&void 0!==C?C:"#ffffff")}}catch(U){I.e(U)}finally{I.f()}var F={name:"Set Color for All Doors On the Same Wall",timestamp:Date.now(),oldValues:W,newValue:e,groupId:p.parentId,undo:function(){A(F.oldValues)},redo:function(){F.groupId&&b(F.oldValues,F.newValue)}};n(F),b(W,e),d(s+1)}break;default:if(p){var k,Y=h(p.id),L=null!==(k=Y?Y.frameColor:p.frameColor)&&void 0!==k?k:"#ffffff",E={name:"Set Color of Selected Door",timestamp:Date.now(),oldValue:L,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(E.changedElementId,E.oldValue)},redo:function(){v(E.changedElementId,E.newValue)}};n(E),v(p.id,e),d(s+1)}}o((function(t){t.actionState.doorColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("doorMenu.FrameColor",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==m&&void 0!==m?m:null===p||void 0===p?void 0:p.frameColor)&&void 0!==l?l:"#ffffff",onChangeComplete:function(e){w(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setDoorActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("doorMenu.OnlyThisDoor",x)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("doorMenu.AllDoorsOnWall",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("doorMenu.AllDoorsAboveFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("doorMenu.AllSelectedDoors",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("doorMenu.AllDoors",x)})]})})})]})})},ZH=n.a.memo((function(){var e=OP(V.Door),t=Ew(Vi),l=Ew(Ci),a=Ew(Sr),o=Ew(si),i=Object(r.useState)(!1),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(r.useState)(!1),h=Object(u.a)(d,2),p=h[0],y=h[1],g=Object(r.useState)(!1),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useState)(!1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useState)(!1),S=Object(u.a)(P,2),j=S[0],H=S[1],z=Object(r.useState)(!1),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(!1),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useState)(!1),k=Object(u.a)(F,2),Y=k[0],L=k[1];if(!e)return null;var E={lng:t},U="36px",N=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){i.doorType=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},J=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){i.filled=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},G=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e&&i.type===V.Door){i.interior=t;break}}}catch(r){o.e(r)}finally{o.f()}}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"door-copy"}),!e.locked&&Object(gf.jsx)(PP,{keyName:"door-cut"}),Object(gf.jsx)(SP,{keyName:"door-lock"}),!e.locked&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:e.filled,onChange:function(t){var l=t.target.checked,i={name:"Filled Door",timestamp:Date.now(),checked:l,selectedElementId:e.id,selectedElementType:e.type,undo:function(){J(e.id,!i.checked)},redo:function(){J(e.id,i.checked)}};a(i),J(e.id,l),o((function(e){e.actionState.doorFilled=l}))},children:me.t("doorMenu.Filled",E)})},"door-filled"),Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"10px"},children:Object(gf.jsx)(_v.a,{checked:!!e.interior,onChange:function(t){var l=t.target.checked,i={name:"Interior Door",timestamp:Date.now(),checked:l,selectedElementId:e.id,selectedElementType:e.type,undo:function(){G(e.id,!i.checked)},redo:function(){G(e.id,i.checked)}};a(i),G(e.id,l),o((function(e){e.actionState.doorInterior=l}))},children:me.t("doorMenu.Interior",E)})}),e?Object(gf.jsx)(HP.a,{title:me.t("doorMenu.DoorType",E),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(tb.a.Group,{value:e.doorType,style:{height:"75px"},onChange:function(t){var l={name:"Select Door Type",timestamp:Date.now(),oldValue:e.doorType,newValue:t.target.value,changedElementId:e.id,changedElementType:e.type,undo:function(){N(l.changedElementId,l.oldValue)},redo:function(){N(l.changedElementId,l.newValue)}};a(l),N(e.id,t.target.value),o((function(e){e.actionState.doorType=t.target.value}))},children:[Object(gf.jsx)(tb.a,{style:UH,value:hy.Default,children:me.t("doorMenu.Default",E)}),Object(gf.jsx)(tb.a,{style:UH,value:hy.Arched,children:me.t("doorMenu.Arched",E)})]})},"door-type"):null,A&&Object(gf.jsx)(XH,{setDialogVisible:T}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),T(!0)},children:[me.t("word.Width",E)," ..."]},"door-width"),j&&Object(gf.jsx)(BH,{setDialogVisible:H}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),H(!0)},children:[me.t("word.Height",E)," ..."]},"door-height"),e.filled&&Object(gf.jsxs)(gf.Fragment,{children:[D&&Object(gf.jsx)(GH,{setDialogVisible:M}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),M(!0)},children:[me.t("word.UValue",E)," ..."]},"door-u-value"),Y&&Object(gf.jsx)(KH,{setDialogVisible:L}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){l(0),L(!0)},children:[me.t("word.VolumetricHeatCapacity",E)," ..."]},"door-heat-capacity"),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),s(!0)},children:[me.t("word.Texture",E)," ..."]},"door-texture"),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),y(!0)},children:[me.t("word.Color",E)," ..."]},"door-color"),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),x(!0)},children:[me.t("doorMenu.FrameColor",E)," ..."]},"door-frame-color"),(e.textureType===fe.Default||e.textureType===fe.NoTexture)&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:U},onClick:function(){l(0),O(!0)},children:[me.t("wallMenu.Opacity",E)," ..."]},"door-opacity")]})]}),c&&Object(gf.jsx)(VH,{setDialogVisible:s}),p&&Object(gf.jsx)(JH,{setDialogVisible:y}),w&&Object(gf.jsx)(QH,{setDialogVisible:x}),C&&Object(gf.jsx)(qH,{setDialogVisible:O})]})})),_H=function(e){var t,l=e.window,a=e.dataType,o=e.attributeKey,i=e.setDialogVisible,r=Ew(Fi),n=Ew(si),c=Ew(Sr),s=Ew(_u),d=Ew(Ii),h=Ew(Ci),p=FP(null!==(t=l[o])&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){n((function(l){var a,i=Object(f.a)(l.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(r.id===e){r.locked||r.type!==V.Window||(r[o]=t);break}}}catch(n){i.e(n)}finally{i.f()}}))},v=function(e,t){n((function(l){var a,i=Object(f.a)(l.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;r.locked||r.type!==V.Window||r.parentId!==e||(r[o]=t)}}catch(n){i.e(n)}finally{i.f()}}))},b=function(e,t){n((function(l){var a,i=Object(f.a)(l.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;r.locked||r.type!==V.Window||r.foundationId!==e||(r[o]=t)}}catch(n){i.e(n)}finally{i.f()}}))},A=function(e){n((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var i=l.value;i.locked||i.type!==V.Window||(i[o]=e)}}catch(r){a.e(r)}finally{a.f()}}))},T=function(e,t){n((function(l){var a,i=Object(f.a)(l.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;!r.locked&&r.type===V.Window&&e.has(r.id)&&(r[o]=t)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e){if(l&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(r);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Window&&e!==i[o]&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(w){a.e(w)}finally{a.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(r);try{for(c.s();!(n=c.n()).done;){var d=n.value;if(d.type===V.Window&&e!==d[o]&&!d.locked)return!0}}catch(w){c.e(w)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(r);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Window&&p.foundationId===l.foundationId&&e!==p[o]&&!p.locked)return!0}}catch(w){h.e(w)}finally{h.f()}break;case _.OnlyThisSide:var y,g=Object(f.a)(r);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.Window&&m.parentId===l.parentId&&e!==m[o]&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==l[o])return!0}return!1}(e)){switch(s){case _.AllSelectedObjectsOfThisType:var t,i=new Map,u=Object(f.a)(r);try{for(u.s();!(t=u.n()).done;){var p=t.value;p.type===V.Window&&!p.locked&&Ew.getState().selectedElementIdSet.has(p.id)&&i.set(p.id,p[o])}}catch(L){u.e(L)}finally{u.f()}var y={name:"Set ".concat(a," for Selected Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){P(y.oldValues)},redo:function(){T(y.oldValues,y.newValue)}};c(y),T(i,e),h(d+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(r);try{for(w.s();!(g=w.n()).done;){var S=g.value;S.type!==V.Window||S.locked||m.set(S.id,S[o])}}catch(L){w.e(L)}finally{w.f()}var j={name:"Set ".concat(a," for All Windows"),timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){P(j.oldValues)},redo:function(){A(j.newValue)}};c(j),A(e),h(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(l.foundationId){var H,z=new Map,R=Object(f.a)(r);try{for(R.s();!(H=R.n()).done;){var D=H.value;D.type!==V.Window||D.foundationId!==l.foundationId||l.locked||z.set(D.id,D[o])}}catch(L){R.e(L)}finally{R.f()}var M={name:"Set ".concat(a," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:z,newValue:e,groupId:l.foundationId,undo:function(){P(M.oldValues)},redo:function(){b(M.groupId,M.newValue)}};c(M),b(l.foundationId,e),h(d+1)}break;case _.OnlyThisSide:if(l.parentId){var W,I=new Map,C=Object(f.a)(r);try{for(C.s();!(W=C.n()).done;){var O=W.value;O.type!==V.Window||O.parentId!==l.parentId||O.locked||I.set(O.id,O[o])}}catch(L){C.e(L)}finally{C.f()}var F={name:"Set ".concat(a," for All Windows On the Same Wall"),timestamp:Date.now(),oldValues:I,newValue:e,groupId:l.parentId,undo:function(){P(F.oldValues)},redo:function(){v(l.parentId,F.newValue)}};c(F),v(l.parentId,e),h(d+1)}break;default:if(l){var k=l[o],Y={name:"Set ".concat(a," of Selected window"),timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:l.id,changedElementType:l.type,undo:function(){x(Y.changedElementId,Y.oldValue)},redo:function(){x(Y.changedElementId,Y.newValue)}};c(Y),x(l.id,e),h(d+1)}}n((function(t){switch(a){case YH.Tint:t.actionState.windowTint=e;break;case YH.MullionColor:t.actionState.windowMullionColor=e;break;case YH.Color:t.actionState.windowColor=e}}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("windowMenu.".concat(a),w),onApply:function(){l[o]!==g&&S(g)},onClose:function(){i()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:null!==g&&void 0!==g?g:"#73D8FF",onChangeComplete:m})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",w)})]})})})]})})},$H=function(e){var t=e.windowModel,l=e.dataType,a=e.attributeKey,o=e.range,i=e.step,n=e.unit,c=e.note,s=e.digit,d=e.setDialogVisible,h=Ew(Fi),p=Ew(Sr),y=Ew(_u),g=Ew(Ii),m=Ew(Ci),w=Ew(si),x=Ew($r),v=Object(r.useMemo)((function(){var e=t[a],l=x(t);if(l&&t.parentType!==V.Roof){if("lx"===a)return e*l.lx;if("lz"===a)return e*l.lz}return"sillWidth"===a&&void 0===e?.2:e}),[a,t]),b=Object(r.useState)(v),A=Object(u.a)(b,2),T=A[0],P=A[1],S=$f(),j=function(e,t,l){var a=x(e);!a||"lx"!==t&&"lz"!==t||e.parentType===V.Roof?e[t]=l:e[t]=l/a[t]},H=function(e,t){w((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e){r.locked||r.type!==V.Window||j(r,a,t);break}}}catch(n){i.e(n)}finally{i.f()}}))},z=function(e,t){e&&w((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.parentId!==e||j(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},R=function(e,t){e&&w((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.foundationId!==e||j(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},D=function(e){w((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.locked||i.type!==V.Window||j(i,a,e)}}catch(r){o.e(r)}finally{o.f()}}))},M=function(e,t){w((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;!r.locked&&r.type===V.Window&&e.has(r.id)&&j(r,a,t)}}catch(n){i.e(n)}finally{i.f()}}))},W=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];H(o,i)}}catch(r){l.e(r)}finally{l.f()}},I=function(e){if(t&&function(e){switch(y){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(h);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Window&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r=i,n=x(r);if(n&&r.parentType!==V.Roof){if("lx"===a){if(e!==r[a]*n.lx)return!0}else if("lz"===a){if(e!==r[a]*n.lz)return!0}else if(e!==r[a])return!0}else if(e!==r[a])return!0}}}catch(z){o.e(z)}finally{o.f()}break;case _.AllObjectsOfThisType:var c,s=Object(f.a)(h);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.type===V.Window&&!d.locked){var u=d,p=x(u);if(p&&u.parentType!==V.Roof){if("lx"===a){if(e!==u[a]*p.lx)return!0}else if("lz"===a){if(e!==u[a]*p.lz)return!0}else if(e!==u[a])return!0}else if(e!==u[a])return!0}}}catch(z){s.e(z)}finally{s.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var g,m=Object(f.a)(h);try{for(m.s();!(g=m.n()).done;){var w=g.value;if(w.type===V.Window&&w.foundationId===t.foundationId&&!w.locked){var v=w,b=x(v);if(b&&v.parentType!==V.Roof){if("lx"===a){if(e!==v[a]*b.lx)return!0}else if("lz"===a){if(e!==v[a]*b.lz)return!0}else if(e!==v[a])return!0}else if(e!==v[a])return!0}}}catch(z){m.e(z)}finally{m.f()}break;case _.OnlyThisSide:var A,T=Object(f.a)(h);try{for(T.s();!(A=T.n()).done;){var P=A.value;if(P.type===V.Window&&P.parentId===t.parentId&&!P.locked){var S=P,j=x(S);if(j&&S.parentType!==V.Roof){if("lx"===a){if(e!==S[a]*j.lx)return!0}else if("lz"===a){if(e!==S[a]*j.lz)return!0}else if(e!==S[a])return!0}else if(e!==S[a])return!0}}}catch(z){T.e(z)}finally{T.f()}break;default:var H=x(t);if(H&&t.parentType!==V.Roof){if("lx"===a){if(e!==t[a]*H.lx)return!0}else if("lz"===a){if(e!==t[a]*H.lz)return!0}else if(e!==t[a])return!0}else if(e!==t[a])return!0}return!1}(e)){switch(y){case _.AllSelectedObjectsOfThisType:var o,i=new Map,r=Object(f.a)(h);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(n.type===V.Window&&!n.locked&&Ew.getState().selectedElementIdSet.has(n.id)){var c=n,s=x(c),d=c[a];s&&c.parentType!==V.Roof&&("lx"===a?d*=s.lx:"lz"===a&&(d*=s.lz)),i.set(n.id,d)}}}catch(te){r.e(te)}finally{r.f()}var u={name:"Set ".concat(l," for Selected Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){W(u.oldValues)},redo:function(){M(u.oldValues,u.newValue)}};p(u),M(i,e),m(g+1);break;case _.AllObjectsOfThisType:var v,b=new Map,A=Object(f.a)(h);try{for(A.s();!(v=A.n()).done;){var T=v.value;if(T.type===V.Window&&!T.locked){var P=T,S=x(P),j=P[a];S&&P.parentType!==V.Roof&&("lx"===a?j*=S.lx:"lz"===a&&(j*=S.lz)),b.set(T.id,j)}}}catch(te){A.e(te)}finally{A.f()}var I={name:"Set ".concat(l," for All Windows"),timestamp:Date.now(),oldValues:b,newValue:e,undo:function(){W(I.oldValues)},redo:function(){D(I.newValue)}};p(I),D(e),m(g+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var C,O=new Map,F=Object(f.a)(h);try{for(F.s();!(C=F.n()).done;){var k=C.value;if(k.type===V.Window&&k.foundationId===t.foundationId&&!k.locked){var Y=k,L=x(Y),E=Y[a];L&&Y.parentType!==V.Roof&&("lx"===a?E*=L.lx:"lz"===a&&(E*=L.lz)),O.set(k.id,E)}}}catch(te){F.e(te)}finally{F.f()}var U={name:"Set ".concat(l," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:O,newValue:e,groupId:t.foundationId,undo:function(){W(U.oldValues)},redo:function(){R(t.foundationId,U.newValue)}};p(U),R(t.foundationId,e),m(g+1)}break;case _.OnlyThisSide:if(t.parentId){var N,J=new Map,G=Object(f.a)(h);try{for(G.s();!(N=G.n()).done;){var X=N.value;if(X.type===V.Window&&X.parentId===t.parentId&&!X.locked){var B=X,K=x(B),q=B[a];K&&B.parentType!==V.Roof&&("lx"===a?q*=K.lx:"lz"===a&&(q*=K.lz)),J.set(X.id,q)}}}catch(te){G.e(te)}finally{G.f()}var Q={name:"Set ".concat(l," for All Windows On the Same Parent"),timestamp:Date.now(),oldValues:J,newValue:e,groupId:t.parentId,undo:function(){W(Q.oldValues)},redo:function(){z(t.parentId,Q.newValue)}};p(Q),z(t.parentId,e),m(g+1)}break;default:if(t){var Z=t[a],$=x(t);$&&t.parentType!==V.Roof&&("lx"===a?Z*=$.lx:"lz"===a&&(Z*=$.lz));var ee={name:"Set Window ".concat(l),timestamp:Date.now(),oldValue:Z,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){H(ee.changedElementId,ee.oldValue)},redo:function(){H(ee.changedElementId,ee.newValue)}};p(ee),H(t.id,e),m(g+1)}}w((function(t){switch(l){case YH.Width:t.actionState.windowWidth=e;break;case YH.Height:t.actionState.windowHeight=e;break;case YH.Opacity:t.actionState.windowOpacity=e;break;case YH.FrameWidth:t.actionState.windowFrameWidth=e;break;case YH.SillWidth:t.actionState.windowSillWidth=e;break;case YH.HorizontalMullionSpacing:t.actionState.windowHorizontalMullionSpacing=e;break;case YH.VerticalMullionSpacing:t.actionState.windowVerticalMullionSpacing=e;break;case YH.MullionWidth:t.actionState.windowMullionWidth=e}}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("windowMenu.".concat(l),S),onApply:function(){I(T)},onClose:function(){d()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:o[0],max:o[1],style:{width:120},step:i,precision:2,value:T,formatter:function(e){return Number(e).toFixed(2)},onChange:P}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",S),": [",o[0].toFixed(0===o[0]?0:null!==s&&void 0!==s?s:0),","," ",o[1].toFixed(null!==s&&void 0!==s?s:0),"] ",n," ",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{})," ",c]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:n}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:y,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",S)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",S)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",S)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",S)})]})})})]})})},ez=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(_u),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Window),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.uValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Tw.toUValueInUS(g)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.uValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];T(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;T(o,t)}}catch(i){a.e(i)}finally{a.f()}},j=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Window&&e!==o.uValue&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(m){l.e(m)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Window&&e!==c.uValue&&!c.locked)return!0}}catch(m){n.e(m)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Window&&u.foundationId===h.foundationId&&e!==u.uValue&&!u.locked)return!0}}catch(m){d.e(m)}finally{d.f()}break;case _.OnlyThisSide:var p,y=Object(f.a)(a);try{for(y.s();!(p=y.n()).done;){var g=p.value;if(g.type===V.Window&&g.parentId===h.parentId&&e!==g.uValue&&!g.locked)return!0}}catch(m){y.e(m)}finally{y.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.uValue))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Window&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p,y=u;l.set(u.id,null!==(p=y.uValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(X){r.e(X)}finally{r.f()}var g={name:"Set U-Value for Selected Windows",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){P(g.oldValues)},redo:function(){S(g.oldValues,g.newValue)}};o(g),c(n+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Window&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.uValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(X){x.e(X)}finally{x.f()}var j={name:"Set U-Value for All Windows",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){P(j.oldValues)},redo:function(){S(j.oldValues,j.newValue)}};o(j),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var H,z=new Map,R=Object(f.a)(a);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.Window&&D.foundationId===h.foundationId&&!D.locked){var M,W=D;z.set(D.id,null!==(M=W.uValue)&&void 0!==M?M:2),T(W.id,e)}}}catch(X){R.e(X)}finally{R.f()}var I={name:"Set U-Value for All Windows Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:h.foundationId,undo:function(){P(I.oldValues)},redo:function(){S(I.oldValues,I.newValue)}};o(I),c(n+1)}break;case _.OnlyThisSide:if(h.parentId){var C,O=new Map,F=Object(f.a)(a);try{for(F.s();!(C=F.n()).done;){var k=C.value;if(k.type===V.Window&&k.parentId===h.parentId&&!k.locked){var Y,L=k;O.set(k.id,null!==(Y=L.uValue)&&void 0!==Y?Y:2),T(L.id,e)}}}catch(X){F.e(X)}finally{F.f()}var E={name:"Set U-Value for All Windows On the Same Wall",timestamp:Date.now(),oldValues:O,newValue:e,groupId:h.parentId,undo:function(){P(E.oldValues)},redo:function(){S(E.oldValues,E.newValue)}};o(E),c(n+1)}break;default:if(h){var U,N,J=null!==(U=null!==(N=s(h.id).uValue)&&void 0!==N?N:h.uValue)&&void 0!==U?U:2,G={name:"Set Window U-Value",timestamp:Date.now(),oldValue:J,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){T(G.changedElementId,G.oldValue)},redo:function(){T(G.changedElementId,G.newValue)}};o(G),T(h.id,e),c(n+1)}}d((function(t){t.actionState.windowUValue=e}))}};return Object(gf.jsx)(kP,{width:550,title:"".concat(me.t("word.UValue",A)+" ","(").concat(me.t("word.ThermalTransmittance",A),")"),onApply:function(){j(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){m(e),b(Tw.toUValueInUS(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",A),": W/(m\xb2\xb7\u2103)"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toUValueInUS(.01),max:Tw.toUValueInUS(100),style:{width:120},step:.01,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),m(Tw.toUValueInSI(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Tw.toUValueInUS(.01).toFixed(3),", ",Tw.toUValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",A),": Btu/(h\xb7ft\xb2\xb7\u2109)"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",A)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",A)})]})})})]})})},tz=db.a.Option,lz=function(e){var t=e.window,l=e.dataType,a=e.attributeKey,o=e.options,i=e.optionsText,n=e.setDialogVisible,c=Ew(Fi),s=Ew(si),d=Ew(Sr),h=Ew(_u),p=Ew(Ii),y=Ew(Ci),g=Object(r.useState)(t[a]),m=Object(u.a)(g,2),w=m[0],x=m[1],v=$f(),b=function(e,t){s((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e){r.locked||r.type!==V.Window||(r[a]=t);break}}}catch(n){i.e(n)}finally{i.f()}}))},A=function(e,t){s((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.parentId!==e||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},T=function(e,t){s((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.foundationId!==e||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){s((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.locked||i.type!==V.Window||(i[a]=e)}}catch(r){o.e(r)}finally{o.f()}}))},S=function(e,t){s((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;!r.locked&&r.type===V.Window&&e.has(r.id)&&(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},j=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];b(o,i)}}catch(r){l.e(r)}finally{l.f()}},H=function(e){if(t&&function(e){switch(h){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(c);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Window&&e!==i[a]&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(w){o.e(w)}finally{o.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(c);try{for(n.s();!(r=n.n()).done;){var s=r.value;if(s.type===V.Window&&e!==s[a]&&!s.locked)return!0}}catch(w){n.e(w)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var d,u=Object(f.a)(c);try{for(u.s();!(d=u.n()).done;){var p=d.value;if(p.type===V.Window&&p.foundationId===t.foundationId&&e!==p[a]&&!p.locked)return!0}}catch(w){u.e(w)}finally{u.f()}break;case _.OnlyThisSide:var y,g=Object(f.a)(c);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.Window&&m.parentId===t.parentId&&e!==m[a]&&!m.locked)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(e!==t[a])return!0}return!1}(e)){switch(h){case _.AllSelectedObjectsOfThisType:var o,i=new Map,r=Object(f.a)(c);try{for(r.s();!(o=r.n()).done;){var n=o.value;n.type===V.Window&&!n.locked&&Ew.getState().selectedElementIdSet.has(n.id)&&i.set(n.id,n[a])}}catch(L){r.e(L)}finally{r.f()}var u={name:"Set ".concat(l," for Selected Windows"),timestamp:Date.now(),oldValues:i,newValue:e,undo:function(){j(u.oldValues)},redo:function(){S(u.oldValues,u.newValue)}};d(u),S(i,e),y(p+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(c);try{for(w.s();!(g=w.n()).done;){var x=g.value;x.type!==V.Window||x.locked||m.set(x.id,x[a])}}catch(L){w.e(L)}finally{w.f()}var v={name:"Set ".concat(l," for All Windows"),timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){j(v.oldValues)},redo:function(){P(v.newValue)}};d(v),P(e),y(p+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var H,z=new Map,R=Object(f.a)(c);try{for(R.s();!(H=R.n()).done;){var D=H.value;D.type!==V.Window||D.foundationId!==t.foundationId||t.locked||z.set(D.id,D[a])}}catch(L){R.e(L)}finally{R.f()}var M={name:"Set ".concat(l," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:z,newValue:e,groupId:t.foundationId,undo:function(){j(M.oldValues)},redo:function(){T(M.groupId,M.newValue)}};d(M),T(t.foundationId,e),y(p+1)}break;case _.OnlyThisSide:if(t.parentId){var W,I=new Map,C=Object(f.a)(c);try{for(C.s();!(W=C.n()).done;){var O=W.value;O.type!==V.Window||O.parentId!==t.parentId||O.locked||I.set(O.id,O[a])}}catch(L){C.e(L)}finally{C.f()}var F={name:"Set ".concat(l," for All Windows On the Same Wall"),timestamp:Date.now(),oldValues:I,newValue:e,groupId:t.parentId,undo:function(){j(F.oldValues)},redo:function(){A(t.parentId,F.newValue)}};d(F),A(t.parentId,e),y(p+1)}break;default:if(t){var k=t[a],Y={name:"Set ".concat(l," of Selected window"),timestamp:Date.now(),oldValue:k,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){b(Y.changedElementId,Y.oldValue)},redo:function(){b(Y.changedElementId,Y.newValue)}};d(Y),b(t.id,e),y(p+1)}}s((function(t){switch(l){case YH.Tint:t.actionState.windowTint=e;break;case YH.MullionColor:t.actionState.windowMullionColor=e;break;case YH.Color:t.actionState.windowColor=e}}))}};return Object(gf.jsx)(kP,{width:560,title:me.t("windowMenu.".concat(l),v),onApply:function(){t[a]!==w&&H(w)},onClose:function(){n()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)(db.a,{style:{width:"150px"},value:w,onChange:function(e){return x(e)},children:o.map((function(e,t){return Object(gf.jsx)(tz,{value:e,children:i[t]},e)}))})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:16,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:h,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",v)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",v)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",v)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",v)})]})})})]})})},az=function(e){var t=e.window,l=e.dataType,a=e.attributeKey,o=e.setDialogVisible,i=Ew(Fi),n=Ew(si),c=Ew(Sr),s=Ew(_u),d=Ew(Ii),h=Ew(Ci),p=Object(r.useState)(t[a]),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){n((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.id===e&&!r.locked&&r.type===V.Window){r[a]=t;break}}}catch(n){i.e(n)}finally{i.f()}}))},v=function(e,t){n((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.parentId!==e||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},b=function(e,t){n((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.locked||r.type!==V.Window||r.foundationId!==e||(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},A=function(e){n((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;i.locked||i.type!==V.Window||(i[a]=e)}}catch(r){o.e(r)}finally{o.f()}}))},T=function(e,t){n((function(l){var o,i=Object(f.a)(l.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;!r.locked&&r.type===V.Window&&e.has(r.id)&&(r[a]=t)}}catch(n){i.e(n)}finally{i.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e){if(t&&function(e){switch(s){case _.AllSelectedObjectsOfThisType:var l,o=Object(f.a)(i);try{for(o.s();!(l=o.n()).done;){var r=l.value;if(r.type===V.Window&&!r.locked&&Ew.getState().selectedElementIdSet.has(r.id)&&r[a]!==e)return!0}}catch(w){o.e(w)}finally{o.f()}break;case _.AllObjectsOfThisType:var n,c=Object(f.a)(i);try{for(c.s();!(n=c.n()).done;){var d=n.value;if(d.type===V.Window&&!d.locked&&d[a]!==e)return!0}}catch(w){c.e(w)}finally{c.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var u,h=Object(f.a)(i);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.Window&&p.foundationId===t.foundationId&&!p.locked&&p[a]!==e)return!0}}catch(w){h.e(w)}finally{h.f()}break;case _.OnlyThisSide:var y,g=Object(f.a)(i);try{for(g.s();!(y=g.n()).done;){var m=y.value;if(m.type===V.Window&&m.parentId===t.parentId&&!m.locked&&m[a]!==e)return!0}}catch(w){g.e(w)}finally{g.f()}break;default:if(t[a]!==e)return!0}return!1}(e))switch(s){case _.AllSelectedObjectsOfThisType:var o,r=new Map,n=Object(f.a)(i);try{for(n.s();!(o=n.n()).done;){var u=o.value;u.type===V.Window&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)&&r.set(u.id,u[a])}}catch(Y){n.e(Y)}finally{n.f()}var p={name:"Set ".concat(l," for Selected Windows"),timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){P(p.oldValues)},redo:function(){T(p.oldValues,p.newValue)}};c(p),T(r,e),h(d+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(i);try{for(m.s();!(y=m.n()).done;){var w=y.value;w.type!==V.Window||w.locked||g.set(w.id,w[a])}}catch(Y){m.e(Y)}finally{m.f()}var S={name:"Set ".concat(l," for All Windows"),timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){P(S.oldValues)},redo:function(){A(S.newValue)}};c(S),A(e),h(d+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(t.foundationId){var j,H=new Map,z=Object(f.a)(i);try{for(z.s();!(j=z.n()).done;){var R=j.value;R.type!==V.Window||R.foundationId!==t.foundationId||t.locked||H.set(R.id,R[a])}}catch(Y){z.e(Y)}finally{z.f()}var D={name:"Set ".concat(l," for All Windows Above Foundation"),timestamp:Date.now(),oldValues:H,newValue:e,groupId:t.foundationId,undo:function(){P(D.oldValues)},redo:function(){b(D.groupId,D.newValue)}};c(D),b(t.foundationId,e),h(d+1)}break;case _.OnlyThisSide:if(t.parentId){var M,W=new Map,I=Object(f.a)(i);try{for(I.s();!(M=I.n()).done;){var C=M.value;C.type!==V.Window||C.parentId!==t.parentId||C.locked||W.set(C.id,C[a])}}catch(Y){I.e(Y)}finally{I.f()}var O={name:"Set ".concat(l," for All Windows On the Same Wall"),timestamp:Date.now(),oldValues:W,newValue:e,groupId:t.parentId,undo:function(){P(O.oldValues)},redo:function(){v(t.parentId,O.newValue)}};c(O),v(t.parentId,e),h(d+1)}break;default:if(t){var F=t[a],k={name:"Set ".concat(l," of Selected window"),timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:t.id,changedElementType:t.type,undo:function(){x(k.changedElementId,k.oldValue)},redo:function(){x(k.changedElementId,k.newValue)}};c(k),x(t.id,e),h(d+1)}}};return Object(gf.jsx)(kP,{width:500,title:me.t("windowMenu.".concat(l),w),onApply:function(){t[a]!==g&&S(g)},onClose:function(){o()},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:4,children:Object(gf.jsx)(eb.a,{checked:g,onChange:function(e){m(e)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:20,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setWindowActionScope(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("windowMenu.OnlyThisWindow",w)}),Object(gf.jsx)(tb.a,{value:_.OnlyThisSide,children:me.t("windowMenu.AllWindowsOnSurface",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("windowMenu.AllWindowsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("windowMenu.AllSelectedWindows",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("windowMenu.AllWindows",w)})]})})})]})})};!function(e){e.Color="Color",e.Tint="Tint",e.Opacity="Opacity",e.WindowType="WindowType",e.HorizontalMullion="HorizontalMullion",e.VerticalMullion="VerticalMullion",e.MullionWidth="MullionWidth",e.HorizontalMullionSpacing="HorizontalMullionSpacing",e.VerticalMullionSpacing="VerticalMullionSpacing",e.MullionColor="MullionColor",e.Frame="Frame",e.FrameWidth="FrameWidth",e.SillWidth="SillWidth",e.Width="Width",e.Height="Height",e.Setback="Setback",e.LeftShutter="LeftShutter",e.RightShutter="RightShutter",e.ShutterColor="ShutterColor",e.ShutterWidth="ShutterWidth"}(YH||(YH={}));var oz,iz,rz,nz,cz,sz,dz,uz,fz,hz,pz,yz,gz,mz,wz,xz,vz,bz,Az={Tint:{attributeKey:"tint"},Color:{attributeKey:"color"},MullionColor:{attributeKey:"mullionColor"},ShutterColor:{attributeKey:"shutterColor"}},Tz={HorizontalMullion:{attributeKey:"horizontalMullion"},VerticalMullion:{attributeKey:"verticalMullion"},Frame:{attributeKey:"frame"},LeftShutter:{attributeKey:"leftShutter"},RightShutter:{attributeKey:"rightShutter"}},Pz={WindowType:{attributeKey:"windowType",options:[Yt.Default,Yt.Arched,Yt.Polygonal]}},Sz={Opacity:{attributeKey:"opacity",range:[0,.9],step:.1,note:"windowMenu.SolarHeatGainCoefficient",digit:1},Width:{attributeKey:"lx",range:[.1,100],step:.1,unit:"word.MeterAbbreviation",digit:1},Height:{attributeKey:"lz",range:[.1,100],step:.1,unit:"word.MeterAbbreviation",digit:1},Setback:{attributeKey:"cy",range:[0,1],step:.01,unit:"",digit:0,note:"windowMenu.RelativeToWallThickness"},MullionWidth:{attributeKey:"mullionWidth",range:[0,.2],step:.1,unit:"word.MeterAbbreviation",digit:1},ShutterWidth:{attributeKey:"shutterWidth",range:[0,.5],step:.01,unit:"",digit:1},HorizontalMullionSpacing:{attributeKey:"horizontalMullionSpacing",range:[.1,5],step:.01,unit:"word.MeterAbbreviation",digit:1},VerticalMullionSpacing:{attributeKey:"verticalMullionSpacing",range:[.1,5],step:.01,unit:"word.MeterAbbreviation",digit:1},FrameWidth:{attributeKey:"frameWidth",range:[.05,.2],step:.01,unit:"word.MeterAbbreviation",digit:2},SillWidth:{attributeKey:"sillWidth",range:[0,.5],step:.01,unit:"word.MeterAbbreviation",digit:2}},jz=n.a.memo((function(){var e=Ew(si),t=Ew(Vi),l=Ew(Sr),a=Ew(Ci),o=Ew($r),i=Object(r.useState)(null),n=Object(u.a)(i,2),c=n[0],s=n[1],d=Object(r.useState)(!1),h=Object(u.a)(d,2),p=h[0],y=h[1],g=OP(V.Window);if(!g)return null;var m={lng:t},w=g?o(g):null,x=function(t,l){e((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&i.type===V.Window){i.empty=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(t,l){e((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===t&&i.type===V.Window){i.interior=l;break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e){return Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){a(0),s(e)},children:[me.t("windowMenu.".concat(e),m)," ..."]},"window-".concat(e))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[Object(gf.jsx)(TP,{keyName:"window-copy"}),!g||g.locked?null:Object(gf.jsx)(PP,{keyName:"window-cut"}),Object(gf.jsx)(SP,{keyName:"window-lock"}),!g.locked&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:!!g.empty,onChange:function(t){var a=t.target.checked,o={name:"Empty Window",timestamp:Date.now(),checked:a,selectedElementId:g.id,selectedElementType:g.type,undo:function(){x(g.id,!o.checked)},redo:function(){x(g.id,o.checked)}};l(o),x(g.id,a),e((function(e){e.actionState.windowEmpty=a}))},children:me.t("windowMenu.Empty",m)})},"window-empty"),Object(gf.jsx)(Qv.a.Item,{style:{paddingLeft:"10px"},children:Object(gf.jsx)(_v.a,{checked:!!g.interior,onChange:function(t){var a=t.target.checked,o={name:"Interior Window",timestamp:Date.now(),checked:a,selectedElementId:g.id,selectedElementType:g.type,undo:function(){v(g.id,!o.checked)},redo:function(){v(g.id,o.checked)}};l(o),v(g.id,a),e((function(e){e.actionState.windowInterior=a}))},children:me.t("windowMenu.Interior",m)})}),b(YH.WindowType),b(YH.Width),b(YH.Height),b(YH.Setback),b(YH.Opacity),b(YH.Tint),p&&Object(gf.jsx)(ez,{setDialogVisible:y}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){a(0),y(!0)},children:[me.t("word.UValue",m)," ..."]},"window-u-value"),g?Object(gf.jsxs)(HP.a,{title:me.t("windowMenu.Mullion",m),style:{paddingLeft:"24px"},children:[b(YH.HorizontalMullion),b(YH.VerticalMullion),Object(gf.jsx)(wH.a,{plain:!0,style:{margin:"6px"}}),b(YH.HorizontalMullionSpacing),b(YH.VerticalMullionSpacing),b(YH.MullionWidth),b(YH.MullionColor)]},"window-mullion"):null,g?Object(gf.jsxs)(HP.a,{title:me.t("windowMenu.Frame",m),style:{paddingLeft:"24px"},children:[b(YH.Frame),Object(gf.jsx)(wH.a,{plain:!0,style:{margin:"6px"}}),b(YH.FrameWidth),b(YH.SillWidth),b(YH.Color)]},"window-frame"):null,g?Object(gf.jsxs)(HP.a,{title:me.t("windowMenu.Shutter",m),style:{paddingLeft:"24px"},children:[b(YH.LeftShutter),b(YH.RightShutter),b(YH.ShutterColor),b(YH.ShutterWidth)]},"window-shutter"):null,function(){switch(c){case YH.Frame:case YH.LeftShutter:case YH.RightShutter:case YH.HorizontalMullion:case YH.VerticalMullion:var e=Tz[c];return e?Object(gf.jsx)(az,{window:g,dataType:c,attributeKey:e.attributeKey,setDialogVisible:function(){return s(null)}}):null;case YH.Tint:case YH.MullionColor:case YH.ShutterColor:case YH.Color:var t=Az[c];return t?Object(gf.jsx)(_H,{window:g,dataType:c,attributeKey:t.attributeKey,setDialogVisible:function(){return s(null)}}):null;case YH.WindowType:var l=Pz[c];return l?Object(gf.jsx)(lz,{window:g,dataType:c,attributeKey:l.attributeKey,options:[Yt.Default,Yt.Arched,Yt.Polygonal],optionsText:[me.t("windowMenu.Default",m),me.t("windowMenu.Arched",m),me.t("windowMenu.Polygonal",m)],setDialogVisible:function(){return s(null)}}):null;case YH.Opacity:case YH.Width:case YH.Height:case YH.Setback:case YH.HorizontalMullionSpacing:case YH.VerticalMullionSpacing:case YH.MullionWidth:case YH.SillWidth:case YH.ShutterWidth:case YH.FrameWidth:var a,o=Sz[c];return c===YH.Width?o.range[1]=w&&g&&g.parentType!==V.Roof?2*w.lx*Math.min(Math.abs(.5-g.cx),Math.abs(-.5-g.cx)):100:c===YH.Height&&(o.range[1]=w&&g&&g.parentType!==V.Roof?2*w.lz*Math.min(Math.abs(.5-g.cz),Math.abs(-.5-g.cz)):100),o?Object(gf.jsx)($H,{windowModel:g,dataType:c,attributeKey:o.attributeKey,range:o.range,step:o.step,setDialogVisible:function(){return s(null)},unit:o.unit?me.t(o.unit,m):void 0,note:o.note?me.t(o.note,m):void 0,digit:null!==(a=o.digit)&&void 0!==a?a:0}):null}}()]})]})})),Hz=l.p+"static/media/roof_01_menu.1418beb1.png",zz=l.p+"static/media/roof_02_menu.055d6e06.png",Rz=l.p+"static/media/roof_03_menu.1d45e089.png",Dz=l.p+"static/media/roof_04_menu.20dee2dd.png",Mz=l.p+"static/media/roof_05_menu.34757ec1.png",Wz=l.p+"static/media/roof_06_menu.0fce42da.png",Iz=l.p+"static/media/roof_07_menu.d0b809f8.png",Cz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(si),d=Ew(Zr),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.textureType)&&void 0!==t?t:he.Default),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=db.a.Option,v=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.textureType=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.textureType&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.textureType&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.textureType&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.textureType))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Roof&&!p.locked&&Ew.getState().selectedElementIdSet.has(p.id))l.set(p.id,null!==(u=p.textureType)&&void 0!==u?u:he.Default)}}catch(I){r.e(I)}finally{r.f()}var y={name:"Set Texture for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),b(l,e),c(n+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(a);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Roof&&!T.locked)m.set(T.id,null!==(x=T.textureType)&&void 0!==x?x:he.Default)}}catch(I){w.e(I)}finally{w.f()}var P={name:"Set Texture for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){A(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};o(P),b(m,e),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(a);try{for(H.s();!(S=H.n()).done;){var z=S.value;z.type!==V.Roof||z.foundationId!==h.foundationId||z.locked||j.set(z.id,z.textureType)}}catch(I){H.e(I)}finally{H.f()}var R={name:"Set Texture for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){A(R.oldValues)},redo:function(){R.groupId&&b(R.oldValues,R.newValue)}};o(R),b(j,e),c(n+1)}break;default:if(h){var D=d(h.id),M=D?D.textureType:h.textureType,W={name:"Set Texture of Selected Roof",timestamp:Date.now(),oldValue:M,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){v(W.changedElementId,W.oldValue)},redo:function(){v(W.changedElementId,W.newValue)}};o(W),v(h.id,e),c(n+1)}}s((function(t){t.actionState.roofTexture=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Texture",w),onApply:function(){T(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:9,children:Object(gf.jsxs)(db.a,{style:{width:"150px"},value:g,onChange:function(e){return m(e)},children:[Object(gf.jsxs)(x,{value:he.NoTexture,children:[Object(gf.jsx)("div",{style:{display:"inline-block",verticalAlign:"middle",marginRight:"12px",width:"32px",height:"20px",border:"1px dashed dimGray"},children:" "}),me.t("shared.NoTexture",w)]},he.NoTexture),Object(gf.jsxs)(x,{value:he.Default,children:[Object(gf.jsx)("img",{alt:he.Default,src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC",height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.TextureDefault",w)]},he.Default),Object(gf.jsxs)(x,{value:he.Texture01,children:[Object(gf.jsx)("img",{alt:he.Texture01,src:Hz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture01",w)]},he.Texture01),Object(gf.jsxs)(x,{value:he.Texture02,children:[Object(gf.jsx)("img",{alt:he.Texture02,src:zz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture02",w)]},he.Texture02),Object(gf.jsxs)(x,{value:he.Texture03,children:[Object(gf.jsx)("img",{alt:he.Texture03,src:Rz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture03",w)]},he.Texture03),Object(gf.jsxs)(x,{value:he.Texture04,children:[Object(gf.jsx)("img",{alt:he.Texture04,src:Dz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture04",w)]},he.Texture04),Object(gf.jsxs)(x,{value:he.Texture05,children:[Object(gf.jsx)("img",{alt:he.Texture05,src:Mz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture05",w)]},he.Texture05),Object(gf.jsxs)(x,{value:he.Texture06,children:[Object(gf.jsx)("img",{alt:he.Texture06,src:Wz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture06",w)]},he.Texture06),Object(gf.jsxs)(x,{value:he.Texture07,children:[Object(gf.jsx)("img",{alt:he.Texture07,src:Iz,height:20,width:40,style:{paddingRight:"8px"}})," ",me.t("roofMenu.Texture07",w)]},he.Texture07)]})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:15,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Oz=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew(Zu),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.color)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.color=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},A=function(e){if(h&&function(e){if(h){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.color&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Roof&&e!==c.color&&!c.locked)return!0}}catch(p){r.e(p)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.color&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.color))return!0}return!1}}(e)){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(o);try{for(r.s();!(t=r.n()).done;){var u,p=t.value;if(p.type===V.Roof&&!p.locked)l.set(p.id,null!==(u=p.color)&&void 0!==u?u:"#ffffff")}}catch(O){r.e(O)}finally{r.f()}var y={name:"Set Color for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(y.oldValues)},redo:function(){v(y.oldValues,y.newValue)}};i(y),v(l,e),s(c+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(o);try{for(w.s();!(g=w.n()).done;){var A,T=g.value;if(T.type===V.Roof&&!T.locked)m.set(T.id,null!==(A=T.color)&&void 0!==A?A:"#ffffff")}}catch(O){w.e(O)}finally{w.f()}var P={name:"Set Color for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){b(P.oldValues)},redo:function(){v(P.oldValues,P.newValue)}};i(P),v(m,e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z,R=S.value;if(R.type===V.Roof&&R.foundationId===h.foundationId&&!h.locked)j.set(R.id,null!==(z=R.color)&&void 0!==z?z:"#ffffff")}}catch(O){H.e(O)}finally{H.f()}var D={name:"Set Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){b(D.oldValues)},redo:function(){D.groupId&&v(D.oldValues,D.newValue)}};i(D),v(j,e),s(c+1)}break;default:if(h){var M,W=d(h.id),I=null!==(M=W?W.color:h.color)&&void 0!==M?M:"#ffffff",C={name:"Set Color of Selected Roof",timestamp:Date.now(),oldValue:I,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(C.changedElementId,C.oldValue)},redo:function(){x(C.changedElementId,C.newValue)}};i(C),x(h.id,e),s(c+1)}}a((function(t){t.actionState.roofColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("roofMenu.RoofColor",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Fz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.thickness)&&void 0!==t?t:.4),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;i.id===e&&(i.thickness=t,l.updateElementOnRoofFlag=!0),i.parentId===e&&i.type===V.Window&&(i.ly=t)}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.thickness&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.thickness&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.thickness&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.thickness))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p=u;l.set(u.id,p.thickness),x(p.id,e)}}}catch(O){r.e(O)}finally{r.f()}var y={name:"Set Thickness for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(a);try{for(w.s();!(g=w.n()).done;){var A=g.value;if(A.type===V.Roof&&!A.locked){var T=A;m.set(A.id,T.thickness),x(T.id,e)}}}catch(O){w.e(O)}finally{w.f()}var P={name:"Set Thickness for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){v(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};o(P),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var S,j=new Map,H=Object(f.a)(a);try{for(H.s();!(S=H.n()).done;){var z=S.value;if(z.type===V.Roof&&z.foundationId===h.foundationId&&!z.locked){var R=z;j.set(z.id,R.thickness),x(R.id,e)}}}catch(O){H.e(O)}finally{H.f()}var D={name:"Set Thickness for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:h.foundationId,undo:function(){v(D.oldValues)},redo:function(){b(D.oldValues,D.newValue)}};o(D),c(n+1)}break;default:if(h){var M,W,I=null!==(M=null!==(W=s(h.id).thickness)&&void 0!==W?W:h.thickness)&&void 0!==M?M:.4,C={name:"Set Roof Thickness",timestamp:Date.now(),oldValue:I,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(C.changedElementId,C.oldValue)},redo:function(){x(C.changedElementId,C.newValue)}};o(C),x(h.id,e),c(n+1)}}d((function(t){t.actionState.roofThickness=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.Thickness",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.05,max:1,style:{width:120},step:.01,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.05, 1] ",me.t("word.MeterAbbreviation",w)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},kz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rafterSpacing)&&void 0!==t?t:1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rafterSpacing=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rafterSpacing&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.rafterSpacing&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.rafterSpacing&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rafterSpacing))return!0}return!1}}(e))switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var d,u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(d=u.rafterSpacing)&&void 0!==d?d:1),x(u.id,e)}}catch(C){r.e(C)}finally{r.f()}var p={name:"Set Rafter Spacing for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(p.oldValues)},redo:function(){b(p.oldValues,p.newValue)}};o(p),c(n+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(a);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&!A.locked)g.set(A.id,null!==(w=A.rafterSpacing)&&void 0!==w?w:1),x(A.id,e)}}catch(C){m.e(C)}finally{m.f()}var T={name:"Set Rafter Spacing for All Roofs",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};o(T),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var P,S=new Map,j=Object(f.a)(a);try{for(j.s();!(P=j.n()).done;){var H,z=P.value;if(z.type===V.Roof&&z.foundationId===h.foundationId&&!z.locked)S.set(z.id,null!==(H=z.rafterSpacing)&&void 0!==H?H:1),x(z.id,e)}}catch(C){j.e(C)}finally{j.f()}var R={name:"Set Rafter Spacing for All Roofs Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:h.foundationId,undo:function(){v(R.oldValues)},redo:function(){b(R.oldValues,R.newValue)}};o(R),c(n+1)}break;default:if(h){var D,M,W=null!==(D=null!==(M=s(h.id).rafterSpacing)&&void 0!==M?M:h.rafterSpacing)&&void 0!==D?D:1,I={name:"Set Roof Rafter Spacing",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(I.changedElementId,I.oldValue)},redo:function(){x(I.changedElementId,I.newValue)}};o(I),x(h.id,e),c(n+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("roofMenu.RafterSpacing",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.1,max:100,style:{width:120},step:.1,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.1, 100] ",me.t("word.MeterAbbreviation",w)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Yz=function(e){var t=e.setDialogVisible,l=Ew(Fi),a=Ew(Sr),o=Ew(Zu),i=Ew(Ii),n=Ew(Ci),c=Ew(Zr),s=Ew(si),d=OP(V.Roof),h=Object(r.useState)(void 0!==(null===d||void 0===d?void 0:d.opacity)?d.opacity:.5),p=Object(u.a)(h,2),y=p[0],g=p[1],m=$f(),w=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.opacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},x=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];w(o,i)}}catch(r){l.e(r)}finally{l.f()}},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;w(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){if(d&&function(e){if(d){switch(o){case _.AllSelectedObjectsOfThisType:var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;if(i.type===V.Roof&&e!==i.opacity&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id))return!0}}catch(p){a.e(p)}finally{a.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.opacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(l);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Roof&&h.foundationId===d.foundationId&&e!==h.opacity&&!h.locked)return!0}}catch(p){u.e(p)}finally{u.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.opacity))return!0}return!1}}(e)){switch(o){case _.AllSelectedObjectsOfThisType:var t,r=new Map,u=Object(f.a)(l);try{for(u.s();!(t=u.n()).done;){var h=t.value;if(h.type===V.Roof&&!h.locked){var p=h;r.set(h.id,p.opacity),w(p.id,e)}}}catch(C){u.e(C)}finally{u.f()}var y={name:"Set Opacity for Selected Roofs",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){x(y.oldValues)},redo:function(){v(y.oldValues,y.newValue)}};a(y),n(i+1);break;case _.AllObjectsOfThisType:var g,m=new Map,b=Object(f.a)(l);try{for(b.s();!(g=b.n()).done;){var A=g.value;if(A.type===V.Roof&&!A.locked){var T=A;m.set(A.id,T.opacity),w(T.id,e)}}}catch(C){b.e(C)}finally{b.f()}var P={name:"Set Opacity for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){x(P.oldValues)},redo:function(){v(P.oldValues,P.newValue)}};a(P),n(i+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var S,j=new Map,H=Object(f.a)(l);try{for(H.s();!(S=H.n()).done;){var z=S.value;if(z.type===V.Roof&&z.foundationId===d.foundationId&&!z.locked){var R=z;j.set(z.id,R.opacity),w(R.id,e)}}}catch(C){H.e(C)}finally{H.f()}var D={name:"Set Opacity for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:d.foundationId,undo:function(){x(D.oldValues)},redo:function(){v(D.oldValues,D.newValue)}};a(D),n(i+1)}break;default:if(d){var M=c(d.id),W=void 0!==M.opacity?M.opacity:void 0!==d.opacity?d.opacity:.5,I={name:"Set Roof Opacity",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(I.changedElementId,I.oldValue)},redo:function(){w(I.changedElementId,I.newValue)}};a(I),w(d.id,e),n(i+1)}}s((function(t){t.actionState.roofGlassOpacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("roofMenu.Opacity",m),onApply:function(){b(y)},onClose:function(){t(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:0,max:1,style:{width:120},step:.01,precision:2,value:y,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return g(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",m),": [0, 1]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:o,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",m)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",m)})]})})})]})})},Lz=function(e){var t,l,a=e.setDialogVisible,o=Ew(si),i=Ew(Vi),n=Ew(ln),c=Ew(Sr),s=Ew(Zu),d=Ew(ef),h=Ew(Ii),p=Ew(Ci),y=Ew(Oi),g=Ew(Zr),m=Object(r.useState)(null!==(t=null===n||void 0===n?void 0:n.glassTint)&&void 0!==t?t:"#73D8FF"),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)({left:0,top:0,bottom:0,right:0}),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useRef)(null),D=Object(r.useRef)(null);Object(r.useEffect)((function(){var e;null===(e=D.current)||void 0===e||e.focus()}));var M={lng:i};Object(r.useEffect)((function(){var e;n&&v(null!==(e=null===n||void 0===n?void 0:n.glassTint)&&void 0!==e?e:"#73D8FF")}),[n]);var W=function(e,t){o((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.glassTint=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},I=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;W(o,t)}}catch(i){a.e(i)}finally{a.f()}},C=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];W(o,i)}}catch(r){l.e(r)}finally{l.f()}},O=function(e){if(n)switch(s){case _.AllObjectsOfThisType:var t,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(t=a.n()).done;){var o,i=t.value;if(i.type===V.Roof&&!i.locked)l.set(i.id,null!==(o=i.glassTint)&&void 0!==o?o:"#73D8FF")}}catch(P){a.e(P)}finally{a.f()}var r={name:"Set Glass Tint for All Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){C(r.oldValues)},redo:function(){I(r.oldValues,r.newValue)}};c(r),I(l,e),p(h+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(n.foundationId){var d,u=new Map,y=Object(f.a)(Ew.getState().elements);try{for(y.s();!(d=y.n()).done;){var m,w=d.value;if(w.type===V.Roof&&w.foundationId===n.foundationId&&!n.locked)u.set(w.id,null!==(m=w.glassTint)&&void 0!==m?m:"#73D8FF")}}catch(P){y.e(P)}finally{y.f()}var x={name:"Set Glass Tint for All Roofs Above Foundation",timestamp:Date.now(),oldValues:u,newValue:e,groupId:n.foundationId,undo:function(){C(x.oldValues)},redo:function(){x.groupId&&I(x.oldValues,x.newValue)}};c(x),I(u,e),p(h+1)}break;default:if(n){var v,b=g(n.id),A=null!==(v=b?b.glassTint:n.glassTint)&&void 0!==v?v:"#73D8FF",T={name:"Set Glass Tint of Selected Roof",timestamp:Date.now(),oldValue:A,newValue:e,changedElementId:n.id,changedElementType:n.type,undo:function(){W(T.changedElementId,T.oldValue)},redo:function(){W(T.changedElementId,T.newValue)}};c(T),W(n.id,e),p(h+1)}}},F=function(){(null===n||void 0===n?void 0:n.glassTint)&&v(n.glassTint),a(!1)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:640,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return P(!0)},onMouseOut:function(){return P(!1)},children:me.t("roofMenu.GlassTint",M)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){O(x)},children:me.t("word.Apply",M)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){F(),y()},children:me.t("word.Cancel",M)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:D,onClick:function(){var e=g(n.id);e&&e.glassTint!==x&&O(x),a(!1),p(0)},children:me.t("word.OK",M)},"OK")],onCancel:F,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!T,bounds:H,onStart:function(e,t){return function(e,t){if(R.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=R.current.getBoundingClientRect();z({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:R,children:e})})},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==x&&void 0!==x?x:null===n||void 0===n?void 0:n.glassTint)&&void 0!==l?l:"#73D8FF",onChangeComplete:function(e){v(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return d(e.target.value)},value:s,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",M)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",M)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",M)})]})})})]})})})},Ez=function(e){var t,l=e.setDialogVisible,a=Ew(si),o=Ew(Fi),i=Ew(Sr),n=Ew(Zu),c=Ew(Ii),s=Ew(Ci),d=Ew(Zr),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rafterColor)&&void 0!==t?t:"#ffffff"),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){a((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.rafterColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},A=function(e){if(h&&function(e){if(h){switch(n){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.rafterColor&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c.type===V.Roof&&e!==c.rafterColor&&!c.locked)return!0}}catch(p){r.e(p)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.rafterColor&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rafterColor))return!0}return!1}}(e))switch(n){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(r=u.rafterColor)&&void 0!==r?r:"#ffffff")}}catch(C){a.e(C)}finally{a.f()}var p={name:"Set Rafter Color for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){b(p.oldValues)},redo:function(){v(p.oldValues,p.newValue)}};i(p),v(l,e),s(c+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(o);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&!A.locked)g.set(A.id,null!==(w=A.rafterColor)&&void 0!==w?w:"#ffffff")}}catch(C){m.e(C)}finally{m.f()}var T={name:"Set Rafter Color for All Roofs",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){b(T.oldValues)},redo:function(){v(T.oldValues,T.newValue)}};i(T),v(g,e),s(c+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var P,S=new Map,j=Object(f.a)(o);try{for(j.s();!(P=j.n()).done;){var H,z=P.value;if(z.type===V.Roof&&z.foundationId===h.foundationId&&!h.locked)S.set(z.id,null!==(H=z.rafterColor)&&void 0!==H?H:"#ffffff")}}catch(C){j.e(C)}finally{j.f()}var R={name:"Set Rafter Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:h.foundationId,undo:function(){b(R.oldValues)},redo:function(){R.groupId&&v(R.oldValues,R.newValue)}};i(R),v(S,e),s(c+1)}break;default:if(h){var D,M=d(h.id),W=null!==(D=M?M.rafterColor:h.rafterColor)&&void 0!==D?D:"#ffffff",I={name:"Set Rafter Color of Selected Roof",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(I.changedElementId,I.oldValue)},redo:function(){x(I.changedElementId,I.newValue)}};i(I),x(h.id,e),s(c+1)}}};return Object(gf.jsx)(kP,{width:640,title:me.t("roofMenu.RoofColor",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:g,onChangeComplete:function(e){m(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Uz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rafterWidth)&&void 0!==t?t:.1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rafterWidth=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rafterWidth&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.rafterWidth&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.rafterWidth&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rafterWidth))return!0}return!1}}(e))switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var d,u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(d=u.rafterWidth)&&void 0!==d?d:.1),x(u.id,e)}}catch(C){r.e(C)}finally{r.f()}var p={name:"Set Rafter Width for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){v(p.oldValues)},redo:function(){b(p.oldValues,p.newValue)}};o(p),c(n+1);break;case _.AllObjectsOfThisType:var y,g=new Map,m=Object(f.a)(a);try{for(m.s();!(y=m.n()).done;){var w,A=y.value;if(A.type===V.Roof&&!A.locked)g.set(A.id,null!==(w=A.rafterWidth)&&void 0!==w?w:.1),x(A.id,e)}}catch(C){m.e(C)}finally{m.f()}var T={name:"Set Rafter Width for All Roofs",timestamp:Date.now(),oldValues:g,newValue:e,undo:function(){v(T.oldValues)},redo:function(){b(T.oldValues,T.newValue)}};o(T),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var P,S=new Map,j=Object(f.a)(a);try{for(j.s();!(P=j.n()).done;){var H,z=P.value;if(z.type===V.Roof&&z.foundationId===h.foundationId&&!z.locked)S.set(z.id,null!==(H=z.rafterWidth)&&void 0!==H?H:.1),x(z.id,e)}}catch(C){j.e(C)}finally{j.f()}var R={name:"Set Rafter Width for All Roofs Above Foundation",timestamp:Date.now(),oldValues:S,newValue:e,groupId:h.foundationId,undo:function(){v(R.oldValues)},redo:function(){b(R.oldValues,R.newValue)}};o(R),c(n+1)}break;default:if(h){var D,M,W=null!==(D=null!==(M=s(h.id).rafterWidth)&&void 0!==M?M:h.rafterWidth)&&void 0!==D?D:.1,I={name:"Set Roof Rafter Width",timestamp:Date.now(),oldValue:W,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(I.changedElementId,I.oldValue)},redo:function(){x(I.changedElementId,I.newValue)}};o(I),x(h.id,e),c(n+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("roofMenu.RafterWidth",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:.01,max:1,style:{width:120},step:.01,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",w),": [0.01, 1] ",me.t("word.MeterAbbreviation",w)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",w)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Nz=function(e){var t,l,a=e.setDialogVisible,o=Ew(Fi),i=Ew(si),n=Ew(Sr),c=Ew(Zu),s=Ew(Ii),d=Ew(Ci),h=Ew(Zr),p=OP(V.Roof),y=Object(r.useState)(null!==(t=null===p||void 0===p?void 0:p.sideColor)&&void 0!==t?t:"#ffffff"),g=Object(u.a)(y,2),m=g[0],w=g[1],x=$f(),v=function(e,t){i((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.locked||(i.sideColor=t);break}}}catch(r){o.e(r)}finally{o.f()}}))},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;v(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];v(o,i)}}catch(r){l.e(r)}finally{l.f()}},T=function(e){if(p&&function(e){if(p){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(o);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Roof&&e!==a.sideColor&&!a.locked&&Ew.getState().selectedElementIdSet.has(a.id))return!0}}catch(h){l.e(h)}finally{l.f()}break;case _.AllObjectsOfThisType:var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.type===V.Roof&&e!==n.sideColor&&!n.locked)return!0}}catch(h){r.e(h)}finally{r.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(o);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===p.foundationId&&e!==u.sideColor&&!u.locked)return!0}}catch(h){d.e(h)}finally{d.f()}break;default:if(e!==(null===p||void 0===p?void 0:p.sideColor))return!0}return!1}}(e)){switch(c){case _.AllSelectedObjectsOfThisType:var t,l=new Map,a=Object(f.a)(o);try{for(a.s();!(t=a.n()).done;){var r,u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id))l.set(u.id,null!==(r=u.sideColor)&&void 0!==r?r:"#ffffff")}}catch(O){a.e(O)}finally{a.f()}var y={name:"Set Side Color for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){A(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};n(y),b(l,e),d(s+1);break;case _.AllObjectsOfThisType:var g,m=new Map,w=Object(f.a)(o);try{for(w.s();!(g=w.n()).done;){var x,T=g.value;if(T.type===V.Roof&&!T.locked)m.set(T.id,null!==(x=T.sideColor)&&void 0!==x?x:"#ffffff")}}catch(O){w.e(O)}finally{w.f()}var P={name:"Set Side Color for All Roofs",timestamp:Date.now(),oldValues:m,newValue:e,undo:function(){A(P.oldValues)},redo:function(){b(P.oldValues,P.newValue)}};n(P),b(m,e),d(s+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(p.foundationId){var S,j=new Map,H=Object(f.a)(o);try{for(H.s();!(S=H.n()).done;){var z,R=S.value;if(R.type===V.Roof&&R.foundationId===p.foundationId&&!p.locked)j.set(R.id,null!==(z=R.sideColor)&&void 0!==z?z:"#ffffff")}}catch(O){H.e(O)}finally{H.f()}var D={name:"Set Side Color for All Roofs Above Foundation",timestamp:Date.now(),oldValues:j,newValue:e,groupId:p.foundationId,undo:function(){A(D.oldValues)},redo:function(){D.groupId&&b(D.oldValues,D.newValue)}};n(D),b(j,e),d(s+1)}break;default:if(p){var M,W=h(p.id),I=null!==(M=W?W.sideColor:p.sideColor)&&void 0!==M?M:"#ffffff",C={name:"Set Side Color of Selected Roof",timestamp:Date.now(),oldValue:I,newValue:e,changedElementId:p.id,changedElementType:p.type,undo:function(){v(C.changedElementId,C.oldValue)},redo:function(){v(C.changedElementId,C.newValue)}};n(C),v(p.id,e),d(s+1)}}i((function(t){t.actionState.roofSideColor=e}))}};return Object(gf.jsx)(kP,{width:640,title:me.t("roofMenu.RoofSideColor",x),onApply:function(){T(m)},onClose:function(){a(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:11,children:Object(gf.jsx)(YP.a,{color:null!==(l=null!==m&&void 0!==m?m:null===p||void 0===p?void 0:p.sideColor)&&void 0!==l?l:"#ffffff",onChangeComplete:function(e){w(e.hex)}})}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:13,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:c,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",x)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",x)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",x)})]})})})]})})},Vz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.rValue)&&void 0!==t?t:2),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(Tw.toRValueInUS(g)),x=Object(u.a)(w,2),v=x[0],b=x[1],A=$f(),T=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.rValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},P=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];T(o,i)}}catch(r){l.e(r)}finally{l.f()}},S=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;T(o,t)}}catch(i){a.e(i)}finally{a.f()}},j=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rValue&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.rValue&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.rValue&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.rValue))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;if(u.type===V.Roof&&!u.locked&&Ew.getState().selectedElementIdSet.has(u.id)){var p,y=u;l.set(u.id,null!==(p=y.rValue)&&void 0!==p?p:2),T(y.id,e)}}}catch(Y){r.e(Y)}finally{r.f()}var g={name:"Set R-Value for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){P(g.oldValues)},redo:function(){S(g.oldValues,g.newValue)}};o(g),c(n+1);break;case _.AllObjectsOfThisType:var m,w=new Map,x=Object(f.a)(a);try{for(x.s();!(m=x.n()).done;){var v=m.value;if(v.type===V.Roof&&!v.locked){var b,A=v;w.set(v.id,null!==(b=A.rValue)&&void 0!==b?b:2),T(A.id,e)}}}catch(Y){x.e(Y)}finally{x.f()}var j={name:"Set R-Value for All Roofs",timestamp:Date.now(),oldValues:w,newValue:e,undo:function(){P(j.oldValues)},redo:function(){S(j.oldValues,j.newValue)}};o(j),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var H,z=new Map,R=Object(f.a)(a);try{for(R.s();!(H=R.n()).done;){var D=H.value;if(D.type===V.Roof&&D.foundationId===h.foundationId&&!D.locked){var M,W=D;z.set(D.id,null!==(M=W.rValue)&&void 0!==M?M:2),T(W.id,e)}}}catch(Y){R.e(Y)}finally{R.f()}var I={name:"Set R-Value for All Roofs Above Foundation",timestamp:Date.now(),oldValues:z,newValue:e,groupId:h.foundationId,undo:function(){P(I.oldValues)},redo:function(){S(I.oldValues,I.newValue)}};o(I),c(n+1)}break;default:if(h){var C,O,F=null!==(C=null!==(O=s(h.id).rValue)&&void 0!==O?O:h.rValue)&&void 0!==C?C:2,k={name:"Set Roof R-Value",timestamp:Date.now(),oldValue:F,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){T(k.changedElementId,k.oldValue)},redo:function(){T(k.changedElementId,k.newValue)}};o(k),T(h.id,e),c(n+1)}}d((function(t){t.actionState.roofRValue=e}))}};return Object(gf.jsx)(kP,{width:550,title:"".concat(me.t("roofMenu.RoofRValue",A)+" ","(").concat(me.t("word.ThermalResistance",A),")"),onApply:function(){j(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){m(e),b(Tw.toRValueInUS(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",A),": m\xb2\xb7\u2103/W"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toRValueInUS(.01),max:Tw.toRValueInUS(100),style:{width:120},step:.01,precision:2,value:v,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){b(e),m(Tw.toRValueInSI(e))}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",A),": [",Tw.toRValueInUS(.01).toFixed(3),", ",Tw.toRValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",A),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",A)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",A)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",A)})]})})})]})})},Jz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Zu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=OP(V.Roof),h=Object(r.useState)(null!==(t=null===d||void 0===d?void 0:d.rise)&&void 0!==t?t:0),p=Object(u.a)(h,2),y=p[0],g=p[1],m=$f(),w=function(e,t){Ew.getState().updateRoofRiseById(e,t),Ew.getState().set((function(e){e.updateElementOnRoofFlag=!0}))},x=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];w(o,i)}}catch(r){l.e(r)}finally{l.f()}},v=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;w(o,t)}}catch(i){a.e(i)}finally{a.f()}},b=function(e){if(d&&function(e){if(d){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.rise&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.rise&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,u=Object(f.a)(a);try{for(u.s();!(s=u.n()).done;){var h=s.value;if(h.type===V.Roof&&h.foundationId===d.foundationId&&e!==h.rise&&!h.locked)return!0}}catch(p){u.e(p)}finally{u.f()}break;default:if(e!==(null===d||void 0===d?void 0:d.rise))return!0}return!1}}(e))switch(Ew.getState().roofActionScope){case _.AllSelectedObjectsOfThisType:var t,l=new Map,r=Object(f.a)(a);try{for(r.s();!(t=r.n()).done;){var u=t.value;u.type!==V.Roof||u.locked||(l.set(u.id,u.rise),w(u.id,e))}}catch(W){r.e(W)}finally{r.f()}var h={name:"Set Rise for Selected Roofs",timestamp:Date.now(),oldValues:l,newValue:e,undo:function(){x(h.oldValues)},redo:function(){v(h.oldValues,h.newValue)}};o(h),c(n+1);break;case _.AllObjectsOfThisType:var p,y=new Map,g=Object(f.a)(a);try{for(g.s();!(p=g.n()).done;){var m=p.value;m.type!==V.Roof||m.locked||(y.set(m.id,m.rise),w(m.id,e))}}catch(W){g.e(W)}finally{g.f()}var b={name:"Set Rise for All Roofs",timestamp:Date.now(),oldValues:y,newValue:e,undo:function(){x(b.oldValues)},redo:function(){v(b.oldValues,b.newValue)}};o(b),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(d.foundationId){var A,T=new Map,P=Object(f.a)(a);try{for(P.s();!(A=P.n()).done;){var S=A.value;S.type!==V.Roof||S.foundationId!==d.foundationId||S.locked||(T.set(S.id,S.rise),w(S.id,e))}}catch(W){P.e(W)}finally{P.f()}var j={name:"Set Rise for All Roofs Above Foundation",timestamp:Date.now(),oldValues:T,newValue:e,groupId:d.foundationId,undo:function(){x(j.oldValues)},redo:function(){v(j.oldValues,j.newValue)}};o(j),c(n+1)}break;default:if(d){var H,z,R=s(d.id),D=null!==(H=null!==(z=null===R||void 0===R?void 0:R.rise)&&void 0!==z?z:null===d||void 0===d?void 0:d.rise)&&void 0!==H?H:0,M={name:"Set Roof Rise",timestamp:Date.now(),oldValue:D,newValue:e,changedElementId:d.id,changedElementType:d.type,undo:function(){w(M.changedElementId,M.oldValue)},redo:function(){w(M.changedElementId,M.newValue)}};o(M),w(d.id,e),c(n+1)}}};return Object(gf.jsx)(kP,{width:550,title:me.t("roofMenu.Rise",m),onApply:function(){b(y)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:6,children:[Object(gf.jsx)($v.a,{min:0,max:200,style:{width:120},step:.1,precision:2,value:y,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return g(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"20px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",m),": [0, 200] ",me.t("word.MeterAbbreviation",m)]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:1,style:{verticalAlign:"middle",paddingTop:"6px"},children:me.t("word.MeterAbbreviation",m)}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",m)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",m)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",m)})]})})})]})})},Gz=function(e){var t,l=e.setDialogVisible,a=Ew(Fi),o=Ew(Sr),i=Ew(Qu),n=Ew(Ii),c=Ew(Ci),s=Ew(Zr),d=Ew(si),h=OP(V.Roof),p=Object(r.useState)(null!==(t=null===h||void 0===h?void 0:h.volumetricHeatCapacity)&&void 0!==t?t:.5),y=Object(u.a)(p,2),g=y[0],m=y[1],w=$f(),x=function(e,t){d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.volumetricHeatCapacity=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},v=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];x(o,i)}}catch(r){l.e(r)}finally{l.f()}},b=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;x(o,t)}}catch(i){a.e(i)}finally{a.f()}},A=function(e){if(h&&function(e){if(h){switch(i){case _.AllSelectedObjectsOfThisType:var t,l=Object(f.a)(a);try{for(l.s();!(t=l.n()).done;){var o=t.value;if(o.type===V.Roof&&e!==o.volumetricHeatCapacity&&!o.locked&&Ew.getState().selectedElementIdSet.has(o.id))return!0}}catch(p){l.e(p)}finally{l.f()}break;case _.AllObjectsOfThisType:var r,n=Object(f.a)(a);try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.type===V.Roof&&e!==c.volumetricHeatCapacity&&!c.locked)return!0}}catch(p){n.e(p)}finally{n.f()}break;case _.AllObjectsOfThisTypeAboveFoundation:var s,d=Object(f.a)(a);try{for(d.s();!(s=d.n()).done;){var u=s.value;if(u.type===V.Roof&&u.foundationId===h.foundationId&&e!==u.volumetricHeatCapacity&&!u.locked)return!0}}catch(p){d.e(p)}finally{d.f()}break;default:if(e!==(null===h||void 0===h?void 0:h.volumetricHeatCapacity))return!0}return!1}}(e)){switch(i){case _.AllSelectedObjectsOfThisType:var t=new Map;d((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Roof&&!i.locked&&Ew.getState().selectedElementIdSet.has(i.id)){var r,n=i;t.set(i.id,null!==(r=n.volumetricHeatCapacity)&&void 0!==r?r:.5),n.volumetricHeatCapacity=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set Volumetric Heat Capacity for Selected Roofs",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){v(l.oldValues)},redo:function(){b(l.oldValues,l.newValue)}};o(l),c(n+1);break;case _.AllObjectsOfThisType:var r=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Roof&&!o.locked){var i,n=o;r.set(o.id,null!==(i=n.volumetricHeatCapacity)&&void 0!==i?i:.5),n.volumetricHeatCapacity=e}}}catch(c){a.e(c)}finally{a.f()}}));var u={name:"Set Volumetric Heat Capacity for All Roofs",timestamp:Date.now(),oldValues:r,newValue:e,undo:function(){v(u.oldValues)},redo:function(){b(u.oldValues,u.newValue)}};o(u),c(n+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(h.foundationId){var p=new Map;d((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.type===V.Roof&&o.foundationId===h.foundationId&&!o.locked){var i,r=o;p.set(o.id,null!==(i=r.volumetricHeatCapacity)&&void 0!==i?i:.5),r.volumetricHeatCapacity=e}}}catch(n){a.e(n)}finally{a.f()}}));var y={name:"Set Volumetric Heat Capacity for All Roofs Above Foundation",timestamp:Date.now(),oldValues:p,newValue:e,groupId:h.foundationId,undo:function(){v(y.oldValues)},redo:function(){b(y.oldValues,y.newValue)}};o(y),c(n+1)}break;default:if(h){var g,m,w=null!==(g=null!==(m=s(h.id).volumetricHeatCapacity)&&void 0!==m?m:h.volumetricHeatCapacity)&&void 0!==g?g:.5,A={name:"Set Volumetric Heat Capacity of Roof",timestamp:Date.now(),oldValue:w,newValue:e,changedElementId:h.id,changedElementType:h.type,undo:function(){x(A.changedElementId,A.oldValue)},redo:function(){x(A.changedElementId,A.newValue)}};o(A),x(h.id,e),c(n+1)}}d((function(t){t.actionState.roofVolumetricHeatCapacity=e}))}};return Object(gf.jsx)(kP,{width:550,title:me.t("word.VolumetricHeatCapacity",w),onApply:function(){A(g)},onClose:function(){l(!1)},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:g,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){return m(e)}}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:["kWh/(m\xb3\xb7\u2103)",Object(gf.jsx)("br",{}),Object(gf.jsx)("br",{}),me.t("word.Range",w),": [0.01, 100]"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return Ew.getState().setRoofActionScope(e.target.value)},value:i,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisRoof",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllRoofsAboveFoundation",w)}),Object(gf.jsx)(tb.a,{value:_.AllSelectedObjectsOfThisType,children:me.t("roofMenu.AllSelectedRoofs",w)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllRoofs",w)})]})})})]})})},Xz=function(e){var t,l=e.setDialogVisible,a=Ew(Vi),o=Ew(ln),i=Ew(Sr),n=Ew(Zu),c=Ew(ef),s=Ew(Ii),d=Ew(Ci),h=Ew(Oi),p=Ew(Zr),y=Ew(si),g=Ew((function(e){if(o){var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.id===o.id)return a}}catch(i){l.e(i)}finally{l.f()}}return null})),m=Object(r.useState)(null!==(t=null===g||void 0===g?void 0:g.ceilingRValue)&&void 0!==t?t:2),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(Tw.toRValueInUS(x)),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)({left:0,top:0,bottom:0,right:0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useRef)(null),C={lng:a};Object(r.useEffect)((function(){var e;g&&v(null!==(e=null===g||void 0===g?void 0:g.ceilingRValue)&&void 0!==e?e:2)}),[null===g||void 0===g?void 0:g.ceilingRValue]);var O=function(e,t){y((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.id===e){i.ceilingRValue=t;break}}}catch(r){o.e(r)}finally{o.f()}}))},F=function(e){var t,l=Object(f.a)(e.entries());try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];O(o,i)}}catch(r){l.e(r)}finally{l.f()}},k=function(e,t){var l,a=Object(f.a)(e.keys());try{for(a.s();!(l=a.n()).done;){var o=l.value;O(o,t)}}catch(i){a.e(i)}finally{a.f()}},Y=function(e){if(g){switch(n){case _.AllObjectsOfThisType:var t=new Map;y((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Roof&&!i.locked){var r,n=i;t.set(i.id,null!==(r=n.ceilingRValue)&&void 0!==r?r:2),n.ceilingRValue=e}}}catch(c){o.e(c)}finally{o.f()}}));var l={name:"Set R-Value for All Ceilings",timestamp:Date.now(),oldValues:t,newValue:e,undo:function(){F(l.oldValues)},redo:function(){k(l.oldValues,l.newValue)}};i(l),d(s+1);break;case _.AllObjectsOfThisTypeAboveFoundation:if(g.foundationId){var a=new Map;y((function(t){var l,o=Object(f.a)(t.elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(i.type===V.Roof&&i.foundationId===g.foundationId&&!i.locked){var r,n=i;a.set(i.id,null!==(r=n.ceilingRValue)&&void 0!==r?r:2),n.ceilingRValue=e}}}catch(c){o.e(c)}finally{o.f()}}));var o={name:"Set R-Value for All Ceilings Above Foundation",timestamp:Date.now(),oldValues:a,newValue:e,groupId:g.foundationId,undo:function(){F(o.oldValues)},redo:function(){k(o.oldValues,o.newValue)}};i(o),d(s+1)}break;default:if(g){var r,c,u=null!==(r=null!==(c=p(g.id).ceilingRValue)&&void 0!==c?c:g.ceilingRValue)&&void 0!==r?r:2,h={name:"Set Ceiling R-Value",timestamp:Date.now(),oldValue:u,newValue:e,changedElementId:g.id,changedElementType:g.type,undo:function(){O(h.changedElementId,h.oldValue)},redo:function(){O(h.changedElementId,h.newValue)}};i(h),O(g.id,e),d(s+1)}}y((function(t){t.actionState.roofRValue=e}))}},L=function(){var e;v(null!==(e=null===g||void 0===g?void 0:g.ceilingRValue)&&void 0!==e?e:2),l(!1)},E=function(){Y(x),l(!1),d(0)};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{width:550,visible:!0,title:Object(gf.jsxs)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return z(!0)},onMouseOut:function(){return z(!1)},children:[me.t("roofMenu.CeilingRValue",C)+" ","(",me.t("word.ThermalResistance",C),")"]}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){Y(x)},children:me.t("word.Apply",C)},"Apply"),Object(gf.jsx)(xv.a,{onClick:function(){L(),h()},children:me.t("word.Cancel",C)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:E,children:me.t("word.OK",C)},"OK")],onCancel:L,maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!H,bounds:M,onStart:function(e,t){return function(e,t){if(I.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=I.current.getBoundingClientRect();W({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:I,children:e})})},children:Object(gf.jsxs)(UT.a,{gutter:6,children:[Object(gf.jsxs)(NT.a,{className:"gutter-row",span:7,children:[Object(gf.jsx)($v.a,{min:.01,max:100,style:{width:120},step:.05,precision:2,value:x,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){v(e),P(Tw.toRValueInUS(e))},onPressEnter:E}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",C),": [0.01, 100]",Object(gf.jsx)("br",{}),me.t("word.SIUnit",C),": m\xb2\xb7\u2103/W"]}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{min:Tw.toRValueInUS(.01),max:Tw.toRValueInUS(100),style:{width:120},step:.01,precision:2,value:T,formatter:function(e){return Number(e).toFixed(2)},onChange:function(e){P(e),v(Tw.toRValueInSI(e))},onPressEnter:E}),Object(gf.jsxs)("div",{style:{paddingTop:"4px",textAlign:"left",fontSize:"11px"},children:[me.t("word.Range",C),": [",Tw.toRValueInUS(.01).toFixed(3),", ",Tw.toRValueInUS(100).toFixed(1),"]",Object(gf.jsx)("br",{}),me.t("word.USUnit",C),": h\xb7ft\xb2\xb7\u2109/Btu"]})]}),Object(gf.jsx)(NT.a,{className:"gutter-row",style:{border:"2px dashed #ccc",paddingTop:"8px",paddingLeft:"12px",paddingBottom:"8px"},span:17,children:Object(gf.jsx)(tb.a.Group,{onChange:function(e){return c(e.target.value)},value:n,children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(tb.a,{value:_.OnlyThisObject,children:me.t("roofMenu.OnlyThisCeiling",C)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisTypeAboveFoundation,children:me.t("roofMenu.AllCeilingsAboveFoundation",C)}),Object(gf.jsx)(tb.a,{value:_.AllObjectsOfThisType,children:me.t("roofMenu.AllCeilings",C)})]})})})]})})})},Bz=n.a.memo((function(){var e,t=Ew(si),l=Ew(Vi),a=Ew(of),o=Ew(hs),i=Ew(es),n=Ew(pn),c=Ew(hn),s=Ew(Bc),d=Ew(Xc),p=Ew(Ci),y=Ew(Sr),g=OP(V.Roof),m=Object(r.useState)(!1),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(!1),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useState)(!1),Y=Object(u.a)(k,2),L=Y[0],E=Y[1],U=Object(r.useState)(!1),N=Object(u.a)(U,2),J=N[0],G=N[1],X=Object(r.useState)(!1),B=Object(u.a)(X,2),K=B[0],q=B[1],Q=Object(r.useState)(!1),Z=Object(u.a)(Q,2),_=Z[0],$=Z[1],ee=Object(r.useState)(!1),te=Object(u.a)(ee,2),le=te[0],ae=te[1],oe=Object(r.useState)(!1),ie=Object(u.a)(oe,2),re=ie[0],ne=ie[1],ce=Object(r.useState)(!1),se=Object(u.a)(ce,2),de=se[0],ue=se[1],fe=Object(r.useState)(!1),pe=Object(u.a)(fe,2),ye=pe[0],ge=pe[1];if(!g)return null;var we={lng:l},xe="36px",ve={display:"block",height:"30px",paddingLeft:"10px",lineHeight:"30px"},be=function(e,l){if(0===l)return null;var a=function(e,t){return"".concat(me.t("roofMenu.DoYouReallyWantToRemoveAll".concat(e,"sOnThisRoof"),we)," (").concat(t," ").concat(me.t("roofMenu.".concat(e,"s"),we),")?")},o=e.replaceAll(" ","");return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){Zv.a.confirm({title:a(o,l),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){!function(e){if(g){var l=Ew.getState().elements.filter((function(t){return!t.locked&&t.type===e&&t.parentId===g.id}));i(g.id,e);var a=JSON.parse(JSON.stringify(l)),o={name:"Remove All ".concat(e,"s on Roof"),timestamp:Date.now(),parentId:g.id,removedElements:a,undo:function(){t((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(o.removedElements))}))},redo:function(){i(o.parentId,e)}};y(o)}}(e)}})},children:[me.t("roofMenu.RemoveAllUnlocked".concat(o,"s"),we)," (",l,")"]},"remove-all-".concat(o,"s-on-roof"))},Ae=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;i.parentId===g.id&&i.type===e&&a.set(i.id,!!i.locked)}}catch(s){o.e(s)}finally{o.f()}c(g.id,e,!0);var r={name:"Lock All "+l+" on Roof",timestamp:Date.now(),oldValues:a,newValue:!0,undo:function(){var e,t=Object(f.a)(r.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(s){t.e(s)}finally{t.f()}},redo:function(){c(g.id,e,!0)}};y(r)}},children:[me.t("roofMenu.LockAll".concat(l,"s"),we)," (",t,")"]},"lock-all-".concat(l,"s-on-roof"))},Te=function(e,t){if(0===t)return null;var l=e.replaceAll(" ","");return Object(gf.jsx)(Qv.a.Item,{onClick:function(){if(g){var t,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(t=o.n()).done;){var i=t.value;i.parentId===g.id&&i.type===e&&a.set(i.id,!!i.locked)}}catch(s){o.e(s)}finally{o.f()}c(g.id,e,!1);var r={name:"Unlock All "+l+" on Roof",timestamp:Date.now(),oldValues:a,newValue:!0,undo:function(){var e,t=Object(f.a)(r.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];n(a,o)}}catch(s){t.e(s)}finally{t.f()}},redo:function(){c(g.id,e,!1)}};y(r)}},children:me.t("roofMenu.UnlockAll".concat(l,"s"),we)},"unlock-all-".concat(l,"s-on-roof"))},Pe=function(e,t){return 0===e?null:Object(gf.jsxs)(Qv.a.Item,{onClick:function(){if(g){var e,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;o.parentId===g.id&&o.type===V.Light&&l.set(o.id,o.inside)}}catch(r){a.e(r)}finally{a.f()}s(g.id,t);var i={name:t?"Set All Lights on Roof Inside":"Set All Lights on Roof Outside",timestamp:Date.now(),oldValues:l,newValue:!0,undo:function(){var e,t=Object(f.a)(i.oldValues.entries());try{for(t.s();!(e=t.n()).done;){var l=Object(u.a)(e.value,2),a=l[0],o=l[1];d(a,o)}}catch(r){t.e(r)}finally{t.f()}},redo:function(){s(g.id,t)}};y(i)}},children:[me.t(t?"roofMenu.AllLightsOnRoofInside":"roofMenu.AllLightsOnRoofOutside",we)," (",e,")"]},t?"inside-lights-on-roof":"outside-lights-on-roof")},Se=function(e,t){Ew.getState().set((function(l){var a=l.elements.find((function(t){return t.id===e&&t.type===V.Roof}));a&&(a.ceiling=t,l.actionState.roofCeiling=t)}))};return Object(gf.jsxs)(Qv.a.ItemGroup,{children:[function(){var e=Ew.getState().elementsToPaste;if(e&&e.length>0)switch(e[0].type){case V.Window:case V.SolarPanel:case V.Sensor:case V.Light:return!0}return!1}()&&Object(gf.jsx)(AP,{keyName:"roof-paste"}),Object(gf.jsx)(SP,{keyName:"roof-lock"}),g.rise>0&&Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:g.ceiling,onChange:function(e){var t=e.target.checked,l={name:"Roof Ceiling",timestamp:Date.now(),checked:t,selectedElementId:g.id,selectedElementType:g.type,undo:function(){Se(g.id,!l.checked)},redo:function(){Se(g.id,l.checked)}};y(l),Se(g.id,t)},children:me.t("roofMenu.Ceiling",{lng:l})})},"roof-ceiling"),function(){var e=g?o(g.id,!0):new Rw;if(e.gotSome()&&Ew.getState().contextMenuObjectType){var t=g?o(g.id,!1):new Rw;return Object(gf.jsxs)(HP.a,{title:me.t("word.Elements",we),style:{paddingLeft:"24px"},children:[be(V.SolarPanel,t.solarPanelCount),be(V.Window,t.windowCount),be(V.Sensor,t.sensorCount),be(V.Light,t.insideLightCount+t.outsideLightCount),Ae(V.SolarPanel,t.solarPanelCount),Te(V.SolarPanel,e.solarPanelCount),Ae(V.Window,t.windowCount),Te(V.Window,e.windowCount),Ae(V.Sensor,t.sensorCount),Te(V.Sensor,e.sensorCount),Pe(e.outsideLightCount,!0),Pe(e.insideLightCount,!1)]},"lock-unlock-clear-on-roof")}return null}(),!g.locked&&g.roofType===It.Gable&&Object(gf.jsx)(HP.a,{title:me.t("roofMenu.RoofStructure",we),style:{paddingLeft:"24px"},children:Object(gf.jsxs)(tb.a.Group,{value:null!==(e=g.roofStructure)&&void 0!==e?e:Ct.Default,style:{height:"110px",paddingTop:"0"},onChange:function(e){var l,o={name:"Select Roof Structure",timestamp:Date.now(),oldValue:null!==(l=g.roofStructure)&&void 0!==l?l:Ct.Default,newValue:e.target.value,changedElementId:g.id,changedElementType:g.type,undo:function(){a(o.changedElementId,o.oldValue)},redo:function(){a(o.changedElementId,o.newValue)}};y(o),a(g.id,e.target.value),t((function(t){t.actionState.roofStructure=e.target.value}))},children:[Object(gf.jsx)(tb.a,{style:ve,value:Ct.Default,children:me.t("roofMenu.DefaultStructure",we)}),Object(gf.jsx)(tb.a,{style:ve,value:Ct.Rafter,children:me.t("roofMenu.RafterStructure",we)}),Object(gf.jsx)(tb.a,{style:ve,value:Ct.Glass,children:me.t("roofMenu.GlassStructure",we)})]})},"roof-structure"),!g.locked&&Object(gf.jsxs)(gf.Fragment,{children:[(g.roofStructure===Ct.Rafter||g.roofStructure===Ct.Glass)&&Object(gf.jsxs)(gf.Fragment,{children:[le&&Object(gf.jsx)(Yz,{setDialogVisible:ae}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),ae(!0)},children:[me.t("roofMenu.Opacity",we)," ..."]},"roof-opacityInput")]}),g.roofStructure===Ct.Rafter&&g.roofType===It.Gable&&Object(gf.jsxs)(gf.Fragment,{children:[H&&Object(gf.jsx)(Ez,{setDialogVisible:z}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),z(!0)},children:[me.t("roofMenu.RafterColor",we)," ..."]},"roof-rafter-color"),x&&Object(gf.jsx)(kz,{setDialogVisible:v}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),v(!0)},children:[me.t("roofMenu.RafterSpacing",we)," ..."]},"roof-rafter-spacing"),T&&Object(gf.jsx)(Uz,{setDialogVisible:P}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),P(!0)},children:[me.t("roofMenu.RafterWidth",we)," ..."]},"roof-rafter-width")]}),O&&Object(gf.jsx)(Fz,{setDialogVisible:F}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),F(!0)},children:[me.t(g.roofStructure===Ct.Rafter?"roofMenu.RafterThickness":"word.Thickness",we)," ","..."]},"roof-thickness"),g.roofStructure===Ct.Glass&&g.roofType===It.Gable&&Object(gf.jsxs)(gf.Fragment,{children:[_&&Object(gf.jsx)(Lz,{setDialogVisible:$}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),$(!0)},children:[me.t("roofMenu.GlassTint",we)," ..."]},"roof-glass-tint-selection")]}),M&&Object(gf.jsx)(Jz,{setDialogVisible:W}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),W(!0)},children:[me.t("roofMenu.Rise",we)," ..."]},"roof-rise"),(g.roofStructure!==Ct.Rafter||void 0===g.opacity||g.opacity>0)&&Object(gf.jsxs)(gf.Fragment,{children:[re&&Object(gf.jsx)(Vz,{setDialogVisible:ne}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ne(!0)},children:[me.t("roofMenu.RoofRValue",we)," ..."]},"roof-r-value"),g.ceiling&&de&&Object(gf.jsx)(Xz,{setDialogVisible:ue}),g.ceiling&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ue(!0)},children:[me.t("roofMenu.CeilingRValue",we)," ..."]},"ceiling-r-value"),ye&&Object(gf.jsx)(Gz,{setDialogVisible:ge}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:"36px"},onClick:function(){p(0),ge(!0)},children:[me.t("word.VolumetricHeatCapacity",we)," ..."]},"roof-heat-capacity")]}),g.roofStructure!==Ct.Rafter&&Object(gf.jsxs)(gf.Fragment,{children:[L&&Object(gf.jsx)(Cz,{setDialogVisible:E}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),E(!0)},children:[me.t("word.Texture",we)," ..."]},"roof-texture")]}),(g.roofStructure!==Ct.Rafter||void 0===g.opacity||g.opacity>0)&&Object(gf.jsxs)(gf.Fragment,{children:[J&&Object(gf.jsx)(Oz,{setDialogVisible:G}),(g.textureType===he.NoTexture||g.textureType===he.Default)&&Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),G(!0)},children:[me.t("roofMenu.RoofColor",we)," ..."]},"roof-color"),K&&Object(gf.jsx)(Nz,{setDialogVisible:q}),Object(gf.jsxs)(Qv.a.Item,{style:{paddingLeft:xe},onClick:function(){p(0),q(!0)},children:[me.t("roofMenu.RoofSideColor",we)," ..."]},"roof-side-color")]})]})]})})),Kz=function(e){var t=e.children,l=Ew(bs);return Object(gf.jsx)(lb.a,{trigger:["contextMenu"],overlay:function(){switch(l){case V.Ground:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(IS,{})});case V.Sky:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(hj,{})});case V.Foundation:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(AS,{})});case V.Cuboid:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(WS,{})});case V.Polygon:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(sj,{})});case V.PolygonVertex:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(dj,{})});case V.SolarPanel:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(Dj,{})});case V.ParabolicTrough:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(Ej,{})});case V.ParabolicDish:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(Qj,{})});case V.FresnelReflector:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(iH,{})});case V.Heliostat:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(pH,{})});case V.Sensor:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(uj,{})});case V.Light:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(fj,{})});case V.Human:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(kS,{})});case V.Tree:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(mH,{})});case V.Flower:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(ES,{})});case V.Wall:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(NH,{})});case V.Window:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(jz,{})});case V.Roof:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(Bz,{})});case V.Door:return Object(gf.jsx)(Qv.a,{triggerSubMenuAction:"click",children:Object(gf.jsx)(ZH,{})});default:return Object(gf.jsx)(gf.Fragment,{})}}(),children:t},"canvas-context-menu")},qz=n.a.memo(Kz),Qz=l(49),Zz=(l(727),l(831)),_z=l(834),$z=l(847),eR=l(848),tR=l(575),lR="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEQgBg4Se6gAABJlJREFUWIXtV11IXEcUPjNzZ3bXHzauvzVSAqlvrWx9KX0paEoRMcoKQmwFDSK+2NInqWVJNIi0pZCXUiiIqC8hJRCphIJaodJC+lTY0j9jmrS11tb1L3bv79w5feje7apX3W3MWw9cuHO+M+d8M3PmzAyBPKW5ublDStmMiE8jIgAAICIIISAcDn9rmuaHMzMzP+Tqj+QTvL29/WPHcTr8MEQEpRQopfSSkpLYjRs35nLxqeUaPBaLvazregciguu6twHg+2ycMSYopV2U0qqdnZ33AOB0Cei6HhVCgG3b9xYWFtr9bPr6+pbW1tY+QcRnlFKCUmqf5PfQEnR2dpYqpV5JJpP8ANQSCAQ6LMv6CRGvEELYwb5FRUXPm6b5JucchBBv7e7u/u5hxcXFEA6Hf5yamvrqSAKxWOxVwzDe55w/pZTa51wpBa7rAiEENO3wxCEipJcHAAA0TQNCCHh+KKWglAIhxKfRaLR7ZGRkYx+Brq6uc8lkcgUAmJTSQMQt/0nzl6KiIjBNE6SUGUKccyguLs6QT6VSZ0OhEFiW9cHc3NzrAFk5oOt6O2OMKaV2qqurX3rw4MF3+RCYmZmB4eFhWFxczOji8Tg0NDRk2pcuXbqm6/rbruu2xOPxN0ZHR5F64Pb2dohSCo7jPJyenv4mn+AAAISQfcEBAK5evQqEkMxXVVX1q6ZpgIj26OgoAmQtQWNj45VgMDhiWZaNiBuE/JseXsE5gQBN26oD+sw/pbQQAM5wznfb2trO9/f3b2aWoLCw8H46e4VS6qxpmpkKJ4Q4cfS2bYNSCoLB4D7ChmGA67oghADO/9lYtm3/sbe3l9o3A4hIBgcHm0OhUOmjR48ql5eX33Fdl9bU1EyXl5d/dnBXZAvnHNbW1n4zTdOpra09Z5pmJusTiUQcEWsDgcBsNBq9ZRiG2t7e/mJ8fPzhkQ7n5+cjra2t8uLFizgwMNB97PBPkAsXLnze2tqKDQ0NcT+c+ikTiUSJt6+llIWPQ4AQoiEiMMZCfnjOpdizb2lpGUDE+3fu3JnNBnp7e0u2tra6Nzc37y4tLd3N1aHvDBwlPT09TZqmXVdK3R4aGqrIxtbX1y8zxq5zzj/Kx2deBMrKys4rpYAxxqSUZ7IxXddDlmUByd53p00AABwAAER0GWPuPkeUem33UK9TJHDqkhcBrxbkUhmfCIEnIf8TOJEAIua1rU6VQDrZnCyVBgCQvg/SA7Ze+3TqgHeJME1TejrDMDY1TQOlFFBK97LtGWOOEAIYY3mdHb5ngW3bCgCUpmmsoKCgwNPPzs7eqqurO2+a5vLY2Nh6dp9IJDKl63phOBxOPDaBSCQiEVFKKbnrupmLwOrqqrW6unrNr8/Nmzf/BIBhH+jYouG7BI7jCEppKJ0D+nEOTpKss8F3sP5KTfs5lUo9FEKcSyaTnW1tbV8bhvFXvsErKipe2NjYeC6dM7u+BI/q3NTUNMg5f9e2be/BkdchAwAQCAQYIgKldK+ysvLZiYmJXw7aHHpeebKysvJlfX39ruu6L0opg4QQ+h8+YIzNlpaWvjY5OXnPL87fPnkgI7SmjToAAAAASUVORK5CYII=",aR=Zz.a.Column,oR=mv.a.div(oz||(oz=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 14;\n"]))),iR=mv.a.div(iz||(iz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 680px;\n height: 520px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n"]))),rR=mv.a.div(rz||(rz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),nR=function(e){var t=e.cloudFileArray,l=e.openCloudFile,a=e.deleteCloudFile,o=e.renameCloudFile,i=Ew(Vi),c=Ew(si),s=Ew(Ni),d=n.a.useRef(null),p=Object(r.useRef)(null),y=p.current?p.current.clientWidth+40:680,g=p.current?p.current.clientHeight+100:600,m=Object(r.useState)({x:0,y:0}),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(!1),A=Object(u.a)(b,2),T=A[0],P=A[1],S=Object(r.useState)(!1),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)({left:0,top:0,bottom:0,right:0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useState)(),Y=Object(u.a)(k,2),L=Y[0],E=Y[1],U=Object(r.useState)(),N=Object(u.a)(U,2),V=N[0],J=N[1],G=Object(r.useRef)(null),X=Object(r.useRef)(Object(h.a)(t)),B=Object(r.useState)(!1),K=Object(u.a)(B,2),q=K[0],Q=K[1],Z=ET.a.Search,_={lng:i};Object(r.useEffect)((function(){var e=function(){v({x:Math.max(0,y-window.innerWidth),y:Math.min(0,window.innerHeight-g)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){t&&(X.current=Object(h.a)(t),Q(!q))}),[t]);var $=function(){Tf.setState((function(e){e.showCloudFilePanel=!1}))},ee=function(){V&&O&&L&&(o(V,O,L),E(void 0)),P(!1)};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Zv.a,{title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return z(!0)},onMouseOut:function(){return z(!1)},children:me.t("word.Rename",_)}),visible:T,onOk:ee,onCancel:function(){P(!1),E(void 0)},modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!H,bounds:M,onStart:function(e,t){return function(e,t){if(G.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=G.current.getBoundingClientRect();W({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:G,children:e})})},children:Object(gf.jsxs)(wv.b,{direction:"vertical",style:{width:"100%"},children:[Object(gf.jsx)(ET.a,{placeholder:"Title",value:L||O,onPressEnter:ee,onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){E(e.target.value)}}),Object(gf.jsxs)("span",{style:{fontSize:"11px",color:"red"},children:[Object(gf.jsx)($z.a,{style:{marginRight:"4px"}}),me.t("word.Caution",_)+": "+me.t("cloudFilePanel.IfSharedOrPublishedRenamingFileBreaksExistingLinks",_),"."]})]})}),Object(gf.jsx)(JT.a,{nodeRef:d,handle:".handle",bounds:"parent",axis:"both",position:x,onDrag:function(e,t){v({x:Math.max(t.x,y-window.innerWidth),y:Math.min(t.y,window.innerHeight-g)})},onStop:function(e,t){},onMouseDown:function(){c((function(e){e.selectedFloatingWindow="cloudFilePanel"}))},children:Object(gf.jsx)(oR,{ref:d,style:{zIndex:"cloudFilePanel"===s?Ke:14},children:Object(gf.jsxs)(iR,{ref:p,children:[Object(gf.jsxs)(rR,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("cloudFilePanel.MyCloudFiles",_)+" ("+X.current.length+")"}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){$()},onTouchStart:function(){$()},children:me.t("word.Close",_)})]}),Object(gf.jsx)("span",{style:{direction:"ltr"},children:Object(gf.jsx)(Z,{style:{width:"50%",paddingTop:"8px",paddingBottom:"8px"},title:me.t("cloudFilePanel.SearchByTitle",_),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(t){X.current=[];var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o,i=l.value;(null===(o=i.title)||void 0===o?void 0:o.toLowerCase().includes(e.toLowerCase()))&&X.current.push(i)}}catch(r){a.e(r)}finally{a.f()}Q(!q)}}})}),Object(gf.jsxs)(Zz.a,{size:"small",style:{width:"100%",direction:"ltr"},dataSource:X.current,scroll:{y:360},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:[Object(gf.jsx)(aR,{title:me.t("word.Title",_),dataIndex:"title",width:"56%",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.title.localeCompare(t.title)},render:function(e,t){return Object(gf.jsx)(_z.a.Text,{style:{fontSize:"12px",cursor:"pointer"},title:me.t("word.Open",_),children:e})},onCell:function(e,t){return{onClick:function(){var t=window.getSelection();t&&t.toString().length>0||l(e.userid,e.title)}}}},"title"),Object(gf.jsx)(aR,{title:me.t("word.Time",_),dataIndex:"time",width:"25%",defaultSortOrder:"descend",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.timestamp-t.timestamp},render:function(e,t){return Object(gf.jsx)(_z.a.Text,{style:{fontSize:"12px"},children:e})}},"time"),Object(gf.jsx)(aR,{width:"19%",title:me.t("word.Action",_),render:function(e,t){return Object(gf.jsxs)(wv.b,{size:"middle",children:[Object(gf.jsx)("img",{title:me.t("word.Delete",_),alt:"Delete",src:lR,onClick:function(){!function(e,t){Zv.a.confirm({title:me.t("cloudFilePanel.DoYouReallyWantToDelete",_)+' "'+t+'"?',content:Object(gf.jsxs)("span",{style:{color:"red",fontWeight:"bold"},children:[Object(gf.jsx)($z.a,{style:{marginRight:"6px"}}),me.t("word.Warning",_)+": "+me.t("message.ThisCannotBeUndone",_)]}),icon:Object(gf.jsx)(eR.a,{}),onOk:function(){a(e,t);var l=new URLSearchParams(window.location.search);l.get("title")===t&&l.get("userid")===e&&window.history.pushState({},document.title,Ge)}})}(t.userid,t.title)},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)("img",{title:me.t("word.Rename",_),alt:"Rename",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEQMtUqgrwgAAA2hJREFUWIXtVktrJFUU/k7dW1WpVHfT62RAMAsRcakmMJkwdjXTREIImcVswuAwzi4rXaq/wIUgxKWPIEzDkIDEiOkOJKsIs2jEx0IQGWbjYlqhq7sr1XXvPS5SFfOaTE/b6Ka/VdW5j+/jvO4BRhjhfwZdZFxeXn6r3W6/kCTJMy9wXReFQuGbarX6aBAB8qxhbm7OD8NwK5fLQWt9bFdKwRgDKSUsyzolIAzDFwG8NxQB+/v7nUqlcqvb7b6ilDq59LaU8kqSJFtKqUZm7PV6yOfz1UHIgaeE4CIEQbDved61KIpu1Ov1nUEJz8J69pYjMLPNzNBa87DIgTQEs7Oz7vj4+BIzF7O4CyHAzE9yudzG5uamISJmZjiOs1IqlaYGIRNCwPf9PzY2Nr4mIgMAcmlpyQrD8FvHca6fTC4igtYarVbrVQA/AUeJKKVcGRsbW9FaZ/8QQvQtIkkSLC4ufgegAgCy1Wrd8zzvehRFfzLzl0QUAoBlWVBKPbFt+9djd0kJrfVWHMcNZi47jjMdRdH3RFTrh5yZ85Zl3XEc58b8/Pyt7e3t+xLAS6m7P93d3X3/ksNERFBKfVKv13fK5bLluu60Umq3Vqt92K8HKpWKllK+2+123wBw3wIQp2uH/VxgjMmngjxmBjN7/ZIDQBzHf6X3xMDpKug/kP8ClmWd6j3HAohoqOX1NBhjTnU3C4CTfqvz28+DmVsAQEQREYGIoucRkM/ni8wMIrIBQDLzb2ksbwdBMAaAgaOMV0o9bjabnzcaDUVEbIyBEOJeEARXjTGlOI5hjCkFQaAvZf1HvJskyTtSSvi+/zMASCHEZ51O57bv+68R0QfZZiICM8MY8wOAhwCgtYbrujfTcoRSCp7nTQshpvv1gNYavV7v4dTUVBUAZK1W687MzLxp2/ZdrfXLxhhkHtBaP+p0Oj9mh4UQiOO4dnh4+Htm6+fJziClhOu6BxMTEw/W1tY6QNqKDw4O2gA+vuwwM1PanD7a29v77x8jIkrSpBtqtZx7jpkZCwsLZWPM1V6vd3LpjpTyilLqAYBfMqPv+0mhUPhifX398SACzg0kq6ureaXUjud5sG372J5NRJ7n3Tw7ETWbzSKGNREVi8W2lPJuFEWvX5RgZ7wCY0wyOTn51SDkI4wwAgD8DRixkgDRtVchAAAAAElFTkSuQmCC",onClick:function(){F(t.title),J(t.userid),P(!0)},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)(tR.a,{title:me.t("cloudFilePanel.CopyTitle",_),alt:"Copy Title",onClick:function(){Zh(t.title),Bh(me.t("cloudFilePanel.TitleCopiedToClipBoard",_)+".")},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)("img",{title:me.t("cloudFilePanel.GenerateLink",_),alt:"Link",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVERwXWf787gAABKdJREFUWIXdV09o21Yc/p5kabJkpx2keMsOppd1o7A/LWyUEMe2ItvB3WguaUsp63WjUHobbMcNethhZYdeBz40sNJtrF6apB62sbOQdSVdoCWwUNzQtN5onKBYif48vR0aF8eO48TZKOy76f0+ve97T59+0iOqqh7zeDwRy7Jc1IHneQAApRStIIoiMQzj23w+/7gVhxDiicViRziO66aUPl1aWrpz+/Ztu1b3MMY+DAaDn7ZUaYP5+fksgC0NqKp6IhaLXZEk6RXGGERRRHd3d1lV1fOZTOYaAHCMMaNTcQBgjG25ReFw+JQsy98DgGEYn9i2HTYM42PGGPN6vd/F4/HjAODZizgAEELsxrFIJHKyq6vrqmmas7quD0xOTv61Ucolk8kfHMeZdV33CiHk5yYDc3NzBymlKzsRdxyHTE1NbeJGIpGTfr9/xDTN2UqlEpmenn5aX0+n0080TfvK6/VeisVirzcZmJ+fLy8sLKztxEAj2onXIAjCHCEElNKXucZiIBAQ/0txADBNM0QpBSHk0Z4zAAD9/f3DXV1dI6ZpzpbL5dDMzMxyK66qqu9JknTRNM3fJiYmHjbtwG4Rj8ffkGX5qmVZ9yuVSsS2bSeRSHyhadqbjdxQKHREEIQMpXQZwEcAsGcDlNILgiBwAE5PT08/3b9//2uCIHzG83wuGo0G68UVRckBcHVdj0xMTNz/VwzwPB+pVqsLY2NjdwGgWCzO2batCYJwgOO4bwAgGo0elWV5kjHmrq6uhorF4kzt/o4MqKo6pKrqCeBZHyCEbMrSzZs3b62trV0TRfGD4eFhH6W0hxBS0nW9v1Ao3K3n7trARtqvA7gAAJZlpRVFeTWRSAzU81zXvSOKIgAcyuVyP42Ojh6qX3lHBsLh8Cm/3z9iGMYflNLTAOA4zuX19fUVjuOuDw4O9te4PM+/bZomqtXqo+3m3LGBjZVfNU1zdnl5OZrNZp8AQD6ff2ya5nGe59cJIYkN7vuSJJ20bXssnU4/2W7eHfWBeDx+VFGUEcuy7m3VZLLZbOHs2bMHU6lUdSPtt2zbXnIc53w9jxBCzp07967ruh6e54lhGIs7MuC67ueUUpcxdrxVh0ulUtXe3t53/H5/njFGdV1Xi8Xin/WcYDD4kiiKv9euK5XKZc513ebZNrvmAUQcxymOj48/aMULhUJH/H5/Ac/e8/6tAtcIx3GoR5KkdjzCGOMBWNuJy7KcA0B3Kg4AhBDWdgcYYw4h5FdBEHoHBwcPNNb7+vqOyrKcxy5WXg/O42kfA0LIJVEUJQA/JpPJ5z1e07Skoih57HLlmwxYVsudfY7x8fFfVldXLwqCcAzAvYGBgXuapj30er03ABidigNA20dQQyaT+dq27T7btlMAQAj527KsLw3DeKtTcWCX/4Sjo6MFAIVOxbbCnr+G/z8D5XK5fSo7RKlUMhvHmjJw+PDhwJkzZ1b27du3a4HFxUXW09NDtqqtrKxgaGioqes1GQgGgw+A7c+ErRAIBFre5/P54PP5msZffAYIIfIL1Fc8PM/fKJVKOqX0eUeilEIURQ9jjNm2TWtH9X8TPM9zrutO/QMUu0XyKmJPLwAAAABJRU5ErkJggg==",onClick:function(){var e=Ge+"?client=web&userid="+t.userid+"&title="+encodeURIComponent(t.title);Zh(e),Bh(me.t("cloudFilePanel.LinkGeneratedInClipBoard",_)+".")},height:16,width:16,style:{cursor:"pointer",verticalAlign:"middle"}})]})}},"action")]})]})})})]})},cR=n.a.memo(nR),sR=Zz.a.Column,dR=mv.a.div(nz||(nz=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1001;\n"]))),uR=mv.a.div(cz||(cz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 400px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n"]))),fR=mv.a.div(sz||(sz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),hR=function(e){var t=e.likesArray,l=e.openCloudFile,a=Ew(Vi),o=n.a.useRef(null),i=Object(r.useRef)(null),c=i.current?i.current.clientWidth+40:680,s=i.current?i.current.clientHeight+100:600,d=Object(r.useState)({x:0,y:0}),f=Object(u.a)(d,2),h=f[0],p=f[1],y={lng:a};Object(r.useEffect)((function(){var e=function(){p({x:Math.max(0,c-window.innerWidth),y:Math.min(0,window.innerHeight-s)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var g=function(){Tf.setState((function(e){e.showLikesPanel=!1}))};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(JT.a,{nodeRef:o,handle:".handle",bounds:"parent",axis:"both",position:h,onDrag:function(e,t){p({x:Math.max(t.x,c-window.innerWidth),y:Math.min(t.y,window.innerHeight-s)})},onStop:function(e,t){},children:Object(gf.jsx)(dR,{ref:o,children:Object(gf.jsxs)(uR,{ref:i,children:[Object(gf.jsxs)(fR,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("cloudFilePanel.MyLikes",y)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){g()},onTouchStart:function(){g()},children:me.t("word.Close",y)})]}),Object(gf.jsx)(Zz.a,{rowKey:function(e){return e},size:"small",style:{width:"100%",direction:"ltr"},dataSource:t,scroll:{y:300},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:Object(gf.jsx)(sR,{title:me.t("word.Title",y),render:function(e,t){return Object(gf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){var e=t,a=e.lastIndexOf(", ");a>=0&&(Tf.setState((function(e){e.openModelsMap=!1})),l(e.substring(a+2),e.substring(0,a)))},children:t.substring(0,t.lastIndexOf(", "))},t)}},"title")})]})})})})},pR=n.a.memo(hR),yR=Zz.a.Column,gR=mv.a.div(dz||(dz=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1001;\n"]))),mR=mv.a.div(uz||(uz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 420px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n"]))),wR=mv.a.div(fz||(fz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),xR=function(e){var t=e.publishedModels,l=e.openCloudFile,a=Ew(Vi),o=Ew(di),i=n.a.useRef(null),c=Object(r.useRef)(null),s=c.current?c.current.clientWidth+40:680,d=c.current?c.current.clientHeight+100:600,f=Object(r.useState)({x:0,y:0}),h=Object(u.a)(f,2),p=h[0],y=h[1],g={lng:a};Object(r.useEffect)((function(){var e=function(){y({x:Math.max(0,s-window.innerWidth),y:Math.min(0,window.innerHeight-d)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var m=function(){Tf.setState((function(e){e.showPublishedModelsPanel=!1}))};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(JT.a,{nodeRef:i,handle:".handle",bounds:"parent",axis:"both",position:p,onDrag:function(e,t){y({x:Math.max(t.x,s-window.innerWidth),y:Math.min(t.y,window.innerHeight-d)})},onStop:function(e,t){},children:Object(gf.jsx)(gR,{ref:i,children:Object(gf.jsxs)(mR,{ref:c,children:[Object(gf.jsxs)(wR,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("modelsMap.MyPublishedModels",g)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){m()},onTouchStart:function(){m()},children:me.t("word.Close",g)})]}),Object(gf.jsx)(Zz.a,{rowKey:function(e){return e},size:"small",style:{width:"100%",direction:"ltr"},dataSource:t,scroll:{y:300},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:Object(gf.jsx)(yR,{title:me.t("word.Title",g),render:function(e,t){return Object(gf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){o.uid&&(Tf.setState((function(e){e.openModelsMap=!1})),l(o.uid,t))},children:t},t)}},"title")})]})})})})},vR=n.a.memo(xR),bR=(Zv.a.confirm,db.a.Option),AR=mv.a.div(hz||(hz=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1000;\n"]))),TR=mv.a.div(pz||(pz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 380px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n text-align: left;\n overflow-x: hidden;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),PR=mv.a.div(yz||(yz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),SR=function(e){var t,l,a,o,i,c,s,d,f,h=e.openCloudFile,p=Ew(si),y=Tf(yf),g=Ew(Vi),m=Ew(di),w=Tf(ui),x=Tf(Ds),v=Tf(Ms),b=n.a.useRef(null),A=Object(r.useRef)(null),T=Object(r.useRef)(null!==(t=m.schoolID)&&void 0!==t?t:j.UNKNOWN),P=Object(r.useRef)(null!==(l=m.classID)&&void 0!==l?l:H.UNKNOWN),S=A.current?A.current.clientWidth+40:640,z=A.current?A.current.clientHeight+100:600,R=Object(r.useState)({x:0,y:0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I={lng:g};Object(r.useEffect)((function(){var e=function(){W({x:Math.max(0,S-window.innerWidth),y:Math.min(0,window.innerHeight-z)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var C=function(){Tf.setState((function(e){e.showAccountSettingsPanel=!1}))},O=m&&m.email&&m.email.endsWith("intofuture.org");return Object(gf.jsxs)(gf.Fragment,{children:[x&&Object(gf.jsx)(pR,{likesArray:null!==(a=m.likes)&&void 0!==a?a:[],openCloudFile:h}),v&&Object(gf.jsx)(vR,{publishedModels:null!==(o=m.published)&&void 0!==o?o:[],openCloudFile:h}),Object(gf.jsx)(JT.a,{nodeRef:b,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){},children:Object(gf.jsx)(AR,{ref:b,children:Object(gf.jsxs)(TR,{ref:A,children:[Object(gf.jsxs)(PR,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("accountSettingsPanel.MyAccountSettings",I)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){C()},onTouchStart:function(){C()},children:me.t("word.Close",I)})]}),Object(gf.jsxs)(UT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,onClick:function(){m.uid&&(Zh(m.uid),Bh(me.t("accountSettingsPanel.IDInClipBoard",I)))},children:Object(gf.jsx)(xv.a,{title:me.t("accountSettingsPanel.ClickToCopyMyID",I),style:{cursor:"copy",borderRadius:"8px"},children:me.t("accountSettingsPanel.MyID",I)})}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:m.uid})]}),!1,Object(gf.jsxs)(UT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.SchoolID",I)}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:Object(gf.jsxs)(db.a,{style:{width:"90%"},value:T.current,onChange:function(e){T.current=e,p((function(t){t.user.schoolID=e}))},children:[Object(gf.jsx)(bR,{value:j.UNKNOWN,children:j.UNKNOWN},j.UNKNOWN),Object(gf.jsx)(bR,{value:j.SCHOOL1,children:j.SCHOOL1},j.SCHOOL1),Object(gf.jsx)(bR,{value:j.SCHOOL2,children:j.SCHOOL2},j.SCHOOL2),Object(gf.jsx)(bR,{value:j.SCHOOL3,children:j.SCHOOL3},j.SCHOOL3),Object(gf.jsx)(bR,{value:j.SCHOOL4,children:j.SCHOOL4},j.SCHOOL4),Object(gf.jsx)(bR,{value:j.SCHOOL5,children:j.SCHOOL5},j.SCHOOL5)]})})]}),Object(gf.jsxs)(UT.a,{gutter:20,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.ClassID",I)}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:Object(gf.jsxs)(db.a,{style:{width:"90%"},value:P.current,onChange:function(e){P.current=e,p((function(t){t.user.classID=e}))},children:[Object(gf.jsx)(bR,{value:H.UNKNOWN,children:H.UNKNOWN},H.UNKNOWN),Object(gf.jsx)(bR,{value:H.CLASS1,children:H.CLASS1},H.CLASS1),Object(gf.jsx)(bR,{value:H.CLASS2,children:H.CLASS2},H.CLASS2),Object(gf.jsx)(bR,{value:H.CLASS3,children:H.CLASS3},H.CLASS3),Object(gf.jsx)(bR,{value:H.CLASS4,children:H.CLASS4},H.CLASS4),Object(gf.jsx)(bR,{value:H.CLASS5,children:H.CLASS5},H.CLASS5),Object(gf.jsx)(bR,{value:H.CLASS6,children:H.CLASS6},H.CLASS6),Object(gf.jsx)(bR,{value:H.CLASS7,children:H.CLASS7},H.CLASS7),Object(gf.jsx)(bR,{value:H.CLASS8,children:H.CLASS8},H.CLASS8),Object(gf.jsx)(bR,{value:H.CLASS9,children:H.CLASS9},H.CLASS9)]})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.AllPublished",I)}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:Object(gf.jsx)("span",{style:{cursor:"pointer"},onClick:function(){y("showPublishedModelsPanel",!0)},children:null!==(i=null===(c=m.published)||void 0===c?void 0:c.length)&&void 0!==i?i:0})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingTop:"20px",paddingLeft:"20px",direction:"ltr"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:6,children:me.t("accountSettingsPanel.PublishedUnderAliases",I)}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:18,children:Object(gf.jsx)("span",{style:{fontSize:"10px"},children:null===(s=m.aliases)||void 0===s?void 0:s.map((function(e,t){return m.aliases?e+(t=0&&t.user.likes.splice(o,1)}else t.user.likes.push(l);if(t.modelSites){var i=t.modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(i){var r,n=Object(f.a)(i.values());try{for(n.s();!(r=n.n()).done;){var c=r.value;if(c.userid===e.userid&&c.title===e.title){void 0===c.likeCount&&(c.likeCount=0),c.likeCount+=a?-1:1;break}}}catch(s){n.e(s)}finally{n.f()}}}})),K(!B)}))}},re=function(e){var t=Ew.getState().modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(f.a)(t.values());try{for(a.s();!(l=a.n()).done;){var o,i=l.value;if(i.userid===e.userid&&i.title===e.title)return null!==(o=i.likeCount)&&void 0!==o?o:0}}catch(r){a.e(r)}finally{a.f()}}return 0},ne=function(e){var t=Ew.getState().modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(f.a)(t.values());try{for(a.s();!(l=a.n()).done;){var o,i=l.value;if(i.userid===e.userid&&i.title===e.title)return null!==(o=i.clickCount)&&void 0!==o?o:0}}catch(r){a.e(r)}finally{a.f()}}return 0},ce=function(e){var t=Ew.getState().modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(t){var l,a=Object(f.a)(t.values());try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.userid===e.userid&&o.title===e.title)return o.pinned}}catch(i){a.e(i)}finally{a.f()}}return!1},se=function(e,t){e.userid&&e.title&&p(e,t,(function(){m((function(l){if(l.modelSites){var a=l.modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(a){var o,i=Object(f.a)(a.values());try{for(i.s();!(o=i.n()).done;){var r=o.value;if(r.userid===e.userid&&r.title===e.title){r.pinned=t,K(!B);break}}}catch(n){i.e(n)}finally{i.f()}}}}))}))};return Object(gf.jsx)(HR.a,{mapContainerStyle:{border:"1px solid",width:"100%",height:"100%"},mapTypeId:S,options:{styles:[{featureType:"poi",elementType:"labels",stylers:[{visibility:"off"}]},{featureType:"transit",elementType:"labels",stylers:[{visibility:"off"}]}]},center:{lat:v,lng:A},zoom:T,tilt:P,onLoad:le,onUnmount:ae,onCenterChanged:function(){if(M){var e=M.getCenter();if(e){var t=e.lat(),l=e.lng();if(t!==v||l!==A){var a={name:"Set Model Map Location",timestamp:Date.now(),oldLatitude:v,newLatitude:t,oldLongitude:A,newLongitude:l,undo:function(){m((function(e){e.modelsMapLatitude=a.oldLatitude,e.modelsMapLongitude=a.oldLongitude}))},redo:function(){m((function(e){e.modelsMapLatitude=a.newLatitude,e.modelsMapLongitude=a.newLongitude}))}};w(a),m((function(e){e.modelsMapLatitude=t,e.modelsMapLongitude=l}))}}}},onZoomChanged:function(){if(M){var e=M.getZoom();if(void 0!==e&&e!==T){var t={name:"Zoom Model Map",timestamp:Date.now(),oldValue:T,newValue:e,undo:function(){m((function(e){e.modelsMapZoom=t.oldValue}))},redo:function(){m((function(e){e.modelsMapZoom=t.newValue}))}};w(t),m((function(t){t.modelsMapZoom=e}))}}},onTiltChanged:function(){if(M){var e=M.getTilt();if(void 0!==e&&e!==P){var t={name:"Tilt Model Map",timestamp:Date.now(),oldValue:P,newValue:e,undo:function(){m((function(e){e.modelsMapTilt=t.oldValue}))},redo:function(){m((function(e){e.modelsMapTilt=t.newValue}))}};w(t),m((function(t){t.modelsMapTilt=e}))}}},onMapTypeIdChanged:function(){if(M){var e=M.getMapTypeId();if(void 0!==e&&e!==S){var t={name:"Change Model Map Type",timestamp:Date.now(),oldValue:S,newValue:e,undo:function(){m((function(e){e.modelsMapType=t.oldValue}))},redo:function(){m((function(e){e.modelsMapType=t.newValue}))}};w(t),m((function(t){t.modelsMapType=e}))}}},children:Object(gf.jsxs)(gf.Fragment,{children:[H&&_.current.map((function(e,t){var l=.2*T;return Object(gf.jsx)(HR.c,{icon:{path:google.maps.SymbolPath.CIRCLE,strokeColor:"red",strokeWeight:l+2,scale:l},position:e},t)})),O&&O.size&&L&&Object(gf.jsx)(HR.b,{position:{lat:L.lat(),lng:L.lng()},children:Object(gf.jsxs)("div",{style:{border:"2px solid gainsboro",maxHeight:"400px",overflowY:"auto"},onMouseLeave:function(){F(null),E(null)},children:[O.size>1?Object(gf.jsxs)("div",{style:{background:"#dddddd",textAlign:"left",borderBottom:"1px solid gainsboro",paddingBottom:"4px",marginBottom:"4px"},children:[V?Object(gf.jsx)(WR.a,{title:me.t("modelsMap.SortFromNewestToOldest",$),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){J(!1)}}):Object(gf.jsx)(IR.a,{title:me.t("modelsMap.SortFromOldestToNewest",$),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){J(!0)}}),Object(gf.jsxs)("span",{style:{fontSize:"10px"},children:[O.size," ",me.t("modelsMap.ModelsFoundOnThisSite",$)]}),L&&Object(gf.jsxs)("span",{style:{fontSize:"10px"},children:["\xa0\u2014"," ",me.t("word.Coordinates",$)+": ("+L.lat().toFixed(4)+"\xb0, "+L.lng().toFixed(4)+"\xb0)"]})]}):"",Object(h.a)(O.keys()).sort((function(e,t){var l,a,o=O.get(e),i=O.get(t);return(null===o||void 0===o?void 0:o.pinned)&&!(null===i||void 0===i?void 0:i.pinned)?-1:(null===i||void 0===i?void 0:i.pinned)&&!(null===o||void 0===o?void 0:o.pinned)?1:(V?1:-1)*((null!==(l=null===o||void 0===o?void 0:o.timeCreated)&&void 0!==l?l:0)-(null!==(a=null===i||void 0===i?void 0:i.timeCreated)&&void 0!==a?a:0))})).map((function(e,t){var l,a=O.get(e);return a?Object(gf.jsxs)("div",{style:{padding:(null===O||void 0===O?void 0:O.size)>1?"5px 5px 20px 5px":"5px",background:t%2===0?"white":"#eeeeee"},children:[0===t&&Object(gf.jsxs)("div",{style:{fontSize:"12px",display:"block",paddingBottom:"6px"},children:[a.countryCode&&Object(gf.jsx)(kR.a,{countryCode:a.countryCode,style:{marginRight:"6px",width:"20px"},svg:!0}),null!==(l=a.address)&&void 0!==l?l:"Unknown",1===O.size&&Object(gf.jsx)("span",{style:{fontSize:"10px",display:"block",paddingTop:"10px"},children:me.t("word.Coordinates",$)+": ("+L.lat().toFixed(4)+"\xb0, "+L.lng().toFixed(4)+"\xb0)"})]}),Object(gf.jsx)(MR.a,{style:{background:ce(a)?"#FEF9EC":t%2===0?"white":"#eeeeee",width:"400px"},bordered:!1,ghost:!0,defaultActiveKey:["0"],children:Object(gf.jsx)(YR,{header:Object(gf.jsxs)(gf.Fragment,{children:[a.label,ce(a)&&Object(gf.jsx)(CR.a,{style:{marginLeft:"8px"}})]}),style:{fontSize:"12px"},children:Object(gf.jsx)("div",{style:{fontSize:"10px",display:"block",textAlign:"left"},children:Object(gf.jsxs)(wv.b,{align:"start",children:[a.thumbnailUrl&&Object(gf.jsx)("img",{alt:a.label,title:me.t("word.Open",$),src:a.thumbnailUrl,style:{border:"1px solid #222",cursor:"pointer"},onClick:function(){return oe(a)}}),Object(gf.jsxs)("div",{children:[a.description&&""!==a.description.trim()?a.description:"","\xa0\u2014\xa0 By"," ",Object(gf.jsx)("span",{style:{cursor:"pointer"},title:me.t("modelsMap.ShowModelsPublishedByThisAuthor",$),onClick:function(){i(a.author)},children:a.author&&""!==a.author?a.author:me.t("word.Anonymous",$)}),",\xa0",a.timeCreated&&Object(gf.jsx)(FR.a,{date:new Date(a.timeCreated)})]})]})})},t)}),Object(gf.jsxs)("div",{style:{marginTop:"10px",fontSize:"11px"},children:[te&&Object(gf.jsx)(gf.Fragment,{children:ce(a)?Object(gf.jsx)(OR.a,{style:{cursor:"pointer"},title:me.t("word.Unpin",$),onClick:function(){return se(a,!1)}}):Object(gf.jsx)(CR.a,{style:{cursor:"pointer"},title:me.t("word.Pin",$),onClick:function(){return se(a,!0)}})}),Object(gf.jsx)("img",{alt:"Open",onClick:function(){return oe(a)},style:{marginLeft:"10px",cursor:"pointer"},title:me.t("word.Open",$),src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVERweICJESgAAAktJREFUWIXtV02rElEYfo+pdEXq0iKNksQvdBARRjAcPxZ+3EXrFrfWzfkDUb+h/sGcVUS0aN0iFDQ3ttFwKWPIEAVtYtJwiCszp4V4mSvqeEbLxe1dnfOc532fhzPvmZmDKKVwyHAcVP1fGMAY01Kp9PRgBgAA4vH4c4zxymf91wwghLyxWOy2GcMYU4TQ1Qu8fTUhQshbq9UeBoNByYrbarXuyLL8DQAAAcCx3+93bSMynU6NyWTyYxmvVqv3Q6HQOxbDw+Ew02w2e05RFFWWRITQNUrpr8VcEITHyWSSsNQAAIhGo91cLldm7gGe589zyuXyAzvi5mA20Ov1zgAAMplMOBKJvLUrrChKptPpNJ1mUJIkZJUoSfMe43n+s11xcxM6rcirolAonHIct3ZdluUnuq5/nc1m31Op1AfzGiHkiFL6ezFnNoAQcoqi+GYZVxQF1+v1l5TSMzOOMT4fS5KEFjto20A+nz9dxkaj0d1Go/FlXc5gMHjWbrdfrFpjNsBx3CvznBByhVJqrONb9RXTKchms/eWi28S3yaYDKTT6Y9m8V2EmQ0ghI72Lc5koFKp8AAAhJDrm3iBQOAGxphijGmxWDyxqrt1E6qq+okQ4qWUTjfxfD7fzcU4kUi8h/kHb3cD3W5X24anaZq+bU2Ay/BP+N/A5TOgqupPFv6FYygIwiOPx0M1TbN80xmGQR0OB1rGwuHwLdsGksnka5bkfcTBe8DZ7/dPXC7Xsa7PX2CLbTUMY6cbi9vthvF4LFvx9nYzsht/AFhGzatwKRNAAAAAAElFTkSuQmCC",height:ee,width:ee}),Object(gf.jsx)("img",{alt:"Export link",onClick:function(){return function(e){if(e.userid&&e.title){var t=Ge+"?client=web&userid="+e.userid+"&title="+encodeURIComponent(e.title);Zh(t),Bh(me.t("cloudFilePanel.LinkGeneratedInClipBoard",$)+".")}else Qh(me.t("message.ModelNotFound",$))}(a)},style:{marginLeft:"5px",cursor:"pointer"},title:me.t("word.Share",$),src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDzUx0EsoOwAAAotJREFUWIXtl7FP20AUxr9LXhLrFKXHwNB4oiAStXFlC4kFAVmtWAJPUYfOoCydOiA2hMTAH8Cf0JU1AysSohLq0LAVPHRDSmshyHCX65A4SRGFKIkpA59k6WQ/v+93d7p3d8CIWllZMYUQ50KI88XFRXPUPCPJtu05znkAQAPQnPPAtu25JzF3HGd20HwQwnGc2VjN7/b8PojYRuKueT6fPyIilU6nVT6fP4oVYmFhYZ5zfol+bzdqtdqSYRjaMAxdq9WWAGwwxiKIy1KpND8Rc9/3E5zzRmSeSCS2AMDzPC8C8DzPA4BkMrmF/kg0fN9PTIKBZTKZUyLSXQMAgOu6axGA67pr0ftkMrlFRDqTyZwCYI8lH4ZQl8tl1zRNWym191iwUmrPNE27XC676IzGg6IhAFCv168AXA0TCwBBEHwLgmCo2InM0Th6AXgBeDYAaSHErhBiM25DIcSmEGIXQLoHUCwW/TAMt1ut1kGlUoltX69UKnOtVusgDMPtYrHo9wCEEK8BIJVKIZvNTscFkM1mp1OpFAY9EwCglJIAoLUGY0zFBcAYU1p3qnPkOVQpvk9SSmq32732qHlG/jEMw69E9CtqPznAyclJsL6+XgKAw8PDn08OMK5xpGdTiP47AAMAxhiIxpqVB0VEYKx3SmM9gHZ3PSmlIKW8jQtASnmrVKfMRJ4AgEKhsEpEGoCempr6FBdAN7cmIl0oFFaB7iqwLOs4CIKGlPJts9ncz+Vy78Mw/D5J81wu967ZbH4EACJqVKvV452dnX6AZVnLnPNr/OPaNanHMIxry7KWI9+/zu2O47y5uLj4zBj7cHNz86q7N4zV8ygH5/y31vrLzMzM/tnZ2Y/o+x/AkgU3TshK/QAAAABJRU5ErkJggg==",height:ee,width:ee}),a.userid===g.uid&&Object(gf.jsx)("img",{alt:"Delete",onClick:function(){return e=a,void Zv.a.confirm({title:me.t("message.DoYouWantToDeleteModelFromMap",$),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){s(e,(function(){m((function(t){if(t.modelSites){var l=t.modelSites.get(Tw.getLatLngKey(e.latitude,e.longitude));if(l){var a,o,i,r=void 0,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c=Object(u.a)(a.value,2),s=c[0],d=c[1];if(d.userid===e.userid&&d.title===e.title){r=s;break}}}catch(h){n.e(h)}finally{n.f()}r&&(l.delete(r),0===l.size&&(null===(o=Q.current[Z.current])||void 0===o||null===(i=o.marker)||void 0===i||i.setMap(null)))}}})),F(null),E(null)}))},onCancel:function(){},okText:me.t("word.Yes",$),cancelText:me.t("word.No",$)});var e},style:{marginLeft:"5px",cursor:"pointer"},title:me.t("word.Delete",$),src:lR,height:ee,width:ee}),g.uid?Object(gf.jsx)(gf.Fragment,{children:g.likes&&g.likes.includes(Tw.getModelKey(a))?Object(gf.jsx)("img",{alt:"Like",onClick:function(){return ie(a)},style:{marginLeft:"10px",cursor:"pointer"},title:me.t("word.AlreadyLike",$),src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDi8RWsqYHwAABAtJREFUWIXlls1rXFUYxp9z7ufcyXykM8lkJiRpvtpUNFFrSEVcTE2htCpk48aCoAuz6UoQdF0VceVGEFfWP0AXIlIkLqTQIhQRXNkP1FBJMkmTzGRm7ufj4nYmmY9MkyZxoQ+8XLj3nPN7n/fce+4L/N8l2t3cmJwe91YWXzKBM35hVYskuuGk4n8Wo7Fv+m7dutlpwcLEUzPq5so5w3ZPBcUtyL606+rmjcrYwLXM9z/e7ZjNbxdnx0q5vq9d03SoqCQECYShKKRp0s9kf15+/sULzXP/OpfPV3v7b7A7TWp6OEeAlILUNTqWtVXK9n92e/6dnrbw5adfOF9OJgoU29BgR3BndMVYyPZfrrs+OX056MuEc3SddjxGR1PpNc9XJMup1J2NV16baYAvnnpuqhpLlNkECtpc64upGldGRy8t5WcvMdHd8NzRNdqJOB1N0m8zt5pOra3lLwyGdFJUksd+pRAtoE5BgKVU0iv29njNFfMBug8rYauy0YgIYzObWwjdT06+TE1rAfsd4D5AO2rRjUfabldtjKPrrMZjtBVRh9craOr8e2pqWnYvr74OzwObvoe2nwcAAvAsA74ElJJdv9csAUBxHChVG4xY8FSlYQ3YLsyllbckPDsf5vQo9EN41AQ1FXqpDBEQ7DBeAJCOA9V24Ma74EsBAUAIACQMz5kTZdNkpFrd1UmjcxOBqkErlqCQHcc3yzV0CE0HKmVoQRCuaRqQnuftDR41QVWBvrkFhftBh9JsB9J24CVi8BUJCAm6LmREj3RMgAB8y0SgqFCLZUgE4CMS3k3SdaBsVRBEonBJyGQK0o3od8PFWveSAFzLQKAq0IvlfZe9ncJKVCGiBkqGeU+6gbcg6rhGuGeZgKqFzhkcEL0t6bhQHR9uxLomvXT2B6hKi38KARkE0IpbdecHdV+TAICA8BV8K38fjX3nqFqpOQFBQq06kDh42dupYuml0vmZnwAA67n+Lyjlno/hgwYBFoeHPgcACQAbz8x8aHdZlSMw2iIBoBJLPtgcGHq/4UFhcPhNGuaRVoEAaURYeHbmjbbZrY+MfEm19cd0eHCND3LHP+hYovVc9ipV5VCTqP39SifHr2Ivp+jy6PGvaB7OdoSdkODG8NCne31PwnfixMTHNIx6b/fYcCvC1Wzu3X3Ba1oayc3ZyUSFcu+dUh0MsHosWbk/MTL3WPCa7s/OnraTqetU9nZO1DrocrL35h+zr54+ELwuUqwNDX7kW9auLVgN7psm1wcGPllYuGccDnyHVp+cOFNJp6/T3H43KLa7ZCeT+WVlcjJ/6OCdmiPl6tjI2253cpGqTiqCbtxa3hwff+9IXO+m2/PzPcUTT1zZyGWu3Dl7tvdfA//n9A8HQo97kdEpRwAAAABJRU5ErkJggg==",height:ee,width:ee}):Object(gf.jsx)("img",{alt:"Like",onClick:function(){return ie(a)},style:{marginLeft:"10px",cursor:"pointer"},title:me.t("word.Like",$),src:DR,height:ee,width:ee})}):Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)("img",{alt:"Like",style:{marginLeft:"10px",opacity:.5},title:me.t("word.MustLogInToLike",$),src:DR,height:ee,width:ee})}),"\xa0\xa0\xa0",re(a),Object(gf.jsx)("img",{alt:"Click counter",style:{marginLeft:"10px"},title:me.t("word.ClickCount",$),src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYEwsXVr/srwAAAYVJREFUWIXt1D8vQ1EYBvDnvOf0372twTdoYuJLEIPBZLFIDFaNCZMBaSwkhg6d7VJrox/ApiEhKW1ViQhXRWh7b3vvey3CJLmC0+U+y1nOe55fTk6OQMCsbO7mjKSR8TxGRIrs/MxUNp1OO0HnvwsF3XjZaKBSvUL59Aymaax1u97Ib8t/BCBBICJISXD7fTAzawX8V0JACBg4QOkq2srlhiMqNRFNJNCyrLuN5cUjQOMN1Jut0bvH5/1a43a/1+NioVia1gq4v39wm80bVKs1+IKGSKhxrQAVUZBSQikFZg/w/Y5WwLcwACiUSsPH5UoeoDFmDz23O7eztnqiDSBZLTHk7EWtjngshrfXTlJH+SeAmaXb78OxbQjfB4Tn6QIQAAgh+GOFEEJX9xdgkPmTn9D3faxv5yejZmKBALTb7cPsamZPG6BcPh+Jx6MHldp1yjBNvLSeHAD6AEQipqKRlGVZSNoObLvbDjz7FwClFHuuCyICkQCJ4McO/BGGgBAQAkLAO6uZiizcGAzsAAAAAElFTkSuQmCC",height:ee,width:ee}),"\xa0\xa0\xa0",ne(a)]})]},t):null}))]})}),!!z&&!!z.size&&Object(gf.jsx)(HR.d,{children:function(e){return Object(gf.jsx)("div",{children:Object(h.a)(z.keys()).map((function(t,l){var a=z.get(t);if(!a||!a.size)return null;var o=Object(h.a)(a.keys()).sort((function(e,t){var l,o,i=a.get(e),r=a.get(t);return(null===i||void 0===i?void 0:i.pinned)&&!(null===r||void 0===r?void 0:r.pinned)?-1:(null===r||void 0===r?void 0:r.pinned)&&!(null===i||void 0===i?void 0:i.pinned)?1:(V?1:-1)*((null!==(l=null===i||void 0===i?void 0:i.timeCreated)&&void 0!==l?l:0)-(null!==(o=null===r||void 0===r?void 0:r.timeCreated)&&void 0!==o?o:0))})),i=a.get(o[0]);if(!i)return null;var r=LR(i);return Object(gf.jsx)(HR.c,{ref:function(e){return Q.current[l]=e},clusterer:e,icon:r?{url:r}:void 0,position:{lat:i.latitude,lng:i.longitude},onClick:function(){return oe(i)},onMouseOver:function(e){q.current=O,Z.current=l,F(a);var o=t.split(", ");E(new google.maps.LatLng(Number.parseFloat(o[0]),Number.parseFloat(o[1])))},onMouseOut:function(e){O===q.current&&(F(null),E(null))}},l)}))})}})]})})},UR=n.a.memo(ER),NR=l(855),VR=l(856),JR=l(846),GR=l(840),XR=l(853),BR=l(854),KR=function(e){var t=e.author,l=e.models,a=e.closeCallback,o=e.openCloudFile,i=Ew(di),n=Ew(Vi),c=Ew(si),s=Ew($i),d=Object(r.useRef)(l?new Map(l):new Map),p=Object(r.useState)(!1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(r.useState)(),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(!1),T=Object(u.a)(A,2),P=T[0],S=T[1],j=ET.a.Search,H=Object(r.useMemo)((function(){return{lng:n}}),[n]);Object(r.useEffect)((function(){l&&(d.current=new Map(l),m(!g))}),[l]);var z=Object(r.useMemo)((function(){var e,l=0,a=Object(f.a)(d.current.values());try{for(a.s();!(e=a.n()).done;){var o=e.value;(t||o.userid===i.uid)&&l++}}catch(r){a.e(r)}finally{a.f()}return l}),[d.current,t,i.uid,g]),R=t&&"roadmap"!==s;return 0===d.current.size?Object(gf.jsx)(GR.a,{mask:!1,headerStyle:{height:"40px",paddingLeft:"1px",paddingRight:"1px",paddingTop:"16px",paddingBottom:"12px",background:R?"#6A6B6E":"whitesmoke"},bodyStyle:{padding:"0px 4px 0px 4px",overflowY:"hidden",background:R?"#2A2B2E":"white"},style:{scrollbarColor:R?"#6A6B6E":"whitesmoke"},title:(null!==t&&void 0!==t?t:me.t("modelsMap.MyPublishedModels",H))+" (0)",placement:"bottom",visible:!0,height:"150px",onClose:function(){a()},children:Object(gf.jsx)(zR.a,{image:zR.a.PRESENTED_IMAGE_SIMPLE,style:{color:R?"lightgray":"dimgray"}})}):Object(gf.jsx)(GR.a,{extra:Object(gf.jsxs)(wv.b,{children:[P?Object(gf.jsx)(XR.a,{title:me.t("modelsMap.SortFromNewestToOldest",H),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){S(!1)}}):Object(gf.jsx)(BR.a,{title:me.t("modelsMap.SortFromOldestToNewest",H),style:{cursor:"pointer",marginLeft:"2px",marginRight:"6px"},onClick:function(){S(!0)}}),Object(gf.jsx)(j,{title:me.t("modelsMap.SearchByLabel",H),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(l){d.current.clear();var t,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var o,i=Object(u.a)(t.value,2),r=i[0],n=i[1];(null===(o=n.label)||void 0===o?void 0:o.toLowerCase().includes(e.toLowerCase()))&&d.current.set(r,n)}}catch(c){a.e(c)}finally{a.f()}m(!g)}}})]}),mask:!1,headerStyle:{height:"40px",color:R?"white":"black",background:R?"#6A6B6E":"whitesmoke",paddingLeft:"1px",paddingRight:"1px",paddingTop:"16px",paddingBottom:"12px",border:"none"},bodyStyle:{padding:"0px 4px 0px 4px",overflowY:"hidden",background:R?"#2A2B2E":"white"},title:(null!==t&&void 0!==t?t:me.t("modelsMap.MyPublishedModels",H))+" ("+z+")",placement:"bottom",visible:!0,height:"164px",onClose:function(){b(void 0),a()},children:Object(gf.jsx)("table",{children:Object(gf.jsx)("tbody",{children:Object(gf.jsx)("tr",{children:Object(h.a)(d.current.keys()).sort((function(e,t){var l,a,o=d.current.get(e),i=d.current.get(t);return o&&i?(P?-1:1)*((null!==(l=i.timeCreated)&&void 0!==l?l:0)-(null!==(a=o.timeCreated)&&void 0!==a?a:0)):0})).map((function(e,l){var a=d.current.get(e);return a&&(t||a.userid===i.uid)?Object(gf.jsx)("td",{children:Object(gf.jsxs)("div",{style:{display:"block",marginTop:"4px"},children:[Object(gf.jsx)("img",{loading:"lazy",height:"100px",width:"auto",onError:function(e){e.target.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMLDhEG5xDXZAAAAwVJREFUeJzt3aFy6kAAheHTO53ZqqDWEUVV4uLiFpVVwcXxKhV9JByqdTieABQ8QVxUryozDFCgDbun9HwuzUB28pNkE9rpw8fHB4THv9gDkH0KQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUh83jrDby+vt7Nr9e/vLw83HobOkKuEOLDpSBkFISMgpBREDIKQoY6iLUWxpjYwwjq5vch3+GcQ1EUu+W2bfH29ob1eh1xVGHQHSFlWe7FAIAkSeC9R5IkkUYVDl2Q4XB49OfGGDw/PwceTXh0QdI0PbnuL1xP6IJsNpuT67quCziSOOiCbLfbk+tWq1XAkcRBF2S5XB7s+K7rMJ/P0bZtpFGFQzft7boOs9kMSZJgMBgA+Po0dm/ognxq2/bHR4QxBsaYX3Vk0Z2y+lTXNabTKay1sYdysbsNUlUV0jSFMQbe+18zZb7LIFmWIc/z3bK1Fk3TRBzR5eiDXHu6GQ6H8N4ffZ+qqvoa1s1QBynL8qprgLUWk8nk5Po8zw+ek7GhDZJlGcqyBAA0TXP2waIxBpPJ5Oy1wjmH0WjU2zj7RhnEWovxeLxbvmRnXxLtk/eeduZFF8QYg6ZpDna+tRZ1XR99TVVVV+3gU9tgQBXk3I5K0/TgwlyW5d6Mqq9txUIV5JJPep7nyLIMwP515justXDOffv1t0Dz6MQ5d/EXUN57PD09/SjGpzzP0XUd3t/ff/xefaA4QrIsu3o66pzr7XRTFMXuqIstepBTN3Khscy8ogY5dyMXWtM00aNEC8L40I9hTNGC1HUd/dN4zFf3OyFEm2Vtt9svvz//q6IFWSwWsTZNLfosS/YpCBkFIaMgZBTkCiH+LPpB/6WNi44QMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSHzH/ERhEFb2CeRAAAAAElFTkSuQmCC"},alt:a.label,title:a.label,src:a.thumbnailUrl,style:{cursor:"pointer",borderRadius:v===a?"0":"10px",border:v===a?"2px solid "+(R?"goldenrod":"red"):"none",marginRight:"4px"},onClick:function(){b(a),o?o(a.userid,a.title):c((function(e){a&&(e.modelsMapLatitude=a.latitude,e.modelsMapLongitude=a.longitude,e.modelsMapZoom=17)}))}}),Object(gf.jsxs)("div",{children:[Object(gf.jsx)("img",{alt:a.type,src:LR(a),style:{position:"relative",left:"8px",bottom:"28px",width:"16px",height:"16px"}}),Object(gf.jsx)("span",{style:{position:"relative",left:"16px",bottom:"24px",color:"white",fontSize:"8px",fontWeight:"bold"},children:a.label?a.label.length>30?a.label.substring(0,30)+"...":a.label:"Unknown"})]})]})},l):null}))})})})})},qR=n.a.memo(KR),QR=["places"],ZR=mv.a.div(gz||(gz=Object(gv.a)(["\n position: absolute;\n top: 70px;\n left: 0;\n display: flex;\n width: 100%;\n height: calc(100% - 70px);\n flex-direction: column;\n align-items: center;\n z-index: 999;\n tab-index: 0;\n background: white;\n"]))),_R=function(e){var t,l,a=e.openCloudFile,o=e.deleteModelFromMap,i=e.likeModelFromMap,n=e.pinModelFromMap,c=Ew(di),s=Ew(Vi),d=Ew(si),p=Ew(Sr),y=Ew($i),g=Ew(qi),m=void 0!==g?g:42.2844063,w=Ew(Qi),x=void 0!==w?w:-71.3488548,v=null!==(t=Ew.getState().modelsMapAddress)&&void 0!==t?t:Xe,b=Tf(er),A=Tf(yr),T=Ew(or),P=Ew(ir),S=Ew(rr),j=Object(r.useRef)(S?new Map(S):new Map),H=Object(r.useState)(),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(!1),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(),F=Object(r.useRef)(),k=Object(r.useMemo)((function(){return{lng:s}}),[s]),Y=ET.a.Search;Object(r.useEffect)((function(){j.current=S?new Map(S):new Map,R&&(O.current=S.get(R)),C(!I)}),[S,R]);var L=Object(HR.f)({id:"google-map-script",googleMapsApiKey:"AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs",libraries:QR}),E=L.isLoaded,U=L.loadError,N=function(){Tf.setState((function(e){e.openModelsMap=!1}))},V=null===(l=c.email)||void 0===l?void 0:l.endsWith("@intofuture.org"),J=Object(r.useMemo)((function(){if(!P||!P.size)return 0;var e,t=0,l=Object(f.a)(P.values());try{for(l.s();!(e=l.n()).done;){var a;t+=null!==(a=e.value.size)&&void 0!==a?a:0}}catch(o){l.e(o)}finally{l.f()}return t}),[P]);return Object(gf.jsxs)(ZR,{onKeyDown:function(e){"Escape"===e.key&&N()},children:[E&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{style:{position:"absolute",fontSize:"medium",color:"black",cursor:"pointer",top:"-40px",left:"40%",width:"20%",height:"28px",background:"white",boxShadow:"1px 1px 1px 1px gray"},children:Object(gf.jsx)(HR.e,{onLoad:function(e){F.current=e},onPlacesChanged:function(){var e,t=null===(e=F.current)||void 0===e?void 0:e.getPlaces();if(t&&t.length>0){var l=t[0].geometry;if(l&&l.location){var a={name:"Set Model Map Location",timestamp:Date.now(),oldLatitude:m,newLatitude:l.location.lat(),oldLongitude:x,newLongitude:l.location.lng(),oldAddress:v,newAddress:t[0].formatted_address,undo:function(){d((function(e){e.modelsMapLatitude=a.oldLatitude,e.modelsMapLongitude=a.oldLongitude,e.modelsMapAddress=a.oldAddress}))},redo:function(){d((function(e){e.modelsMapLatitude=a.newLatitude,e.modelsMapLongitude=a.newLongitude,e.modelsMapAddress=a.newAddress}))}};p(a),d((function(e){l.location&&(e.modelsMapLatitude=l.location.lat(),e.modelsMapLongitude=l.location.lng()),e.modelsMapAddress=t[0].formatted_address}))}}},children:Object(gf.jsx)("input",{type:"text",placeholder:v,style:{boxSizing:"border-box",border:"1px solid transparent",width:"100%",height:"100%",fontSize:"14px",paddingLeft:"8px",paddingRight:"8px",outline:"none",textOverflow:"ellipses",position:"relative"}})})})}),E?Object(gf.jsx)(UR,{selectAuthor:function(e){D(e),Tf.setState((function(t){t.showLeaderboard||(t.leaderboardFlag=!0),e&&(O.current=j.current.get(e))}))},closeMap:N,openModel:a,deleteModel:o,likeModel:i,pinModel:n}):Object(gf.jsx)(Hv,{}),U&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{children:"Map cannot be loaded right now, sorry."})}),Object(gf.jsxs)(gf.Fragment,{children:[R&&Object(gf.jsx)(qR,{author:R,models:O.current,closeCallback:function(){D(void 0),O.current=void 0}}),A&&!R&&Object(gf.jsx)("div",{style:{position:"absolute",fontSize:"10px",color:"black",bottom:"33px",left:"5px",width:"180px",height:"360px",overflowY:"auto",padding:"6px 6px 6px 6px",background:"whitesmoke",boxShadow:"1px 1px 1px 1px gray",textAlign:"left"},children:Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(Y,{title:me.t("modelsMap.SearchByPublisher",k),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(S){j.current.clear();var t,l=Object(f.a)(S);try{for(l.s();!(t=l.n()).done;){var a=Object(u.a)(t.value,2),o=a[0],i=a[1];o.toLowerCase().includes(e.toLowerCase())&&j.current.set(o,i)}}catch(r){l.e(r)}finally{l.f()}C(!I)}}}),0===j.current.size?Object(gf.jsx)(zR.a,{image:zR.a.PRESENTED_IMAGE_SIMPLE}):Object(gf.jsx)("table",{children:Object(gf.jsx)("tbody",{children:Object(h.a)(j.current.keys()).sort((function(e,t){var l=j.current.get(e),a=j.current.get(t);return(a?a.size:0)-(l?l.size:0)})).map((function(e,t){if(t>50)return null;var l=j.current.get(e);return void 0===(null===l||void 0===l?void 0:l.size)||0===(null===l||void 0===l?void 0:l.size)?null:Object(gf.jsxs)("tr",{style:{width:"180px"},children:[Object(gf.jsx)("td",{style:{width:"150px"},children:Object(gf.jsx)(RR.a,{icon:Object(gf.jsx)(NR.a,{}),color:(null===l||void 0===l?void 0:l.size)>10?"gold":(null===l||void 0===l?void 0:l.size)>5?"lime":(null===l||void 0===l?void 0:l.size)>1?"blue":"magenta",style:{cursor:"pointer",fontSize:"10px",fontWeight:"bold",width:"130px"},onClick:function(){return D(e)},title:e,children:e.length>16?e.substring(0,15)+"...":e})}),Object(gf.jsx)("td",{children:null===l||void 0===l?void 0:l.size})]},t)}))})})]})}),Object(gf.jsx)(wv.b,{children:Object(gf.jsxs)("div",{title:me.t("modelsMap.TotalNumberOfUserPublishedModels",k)+": "+J,style:{position:"absolute",fontSize:"14px",color:"black",bottom:"6px",left:"5px",width:"180px",height:"25px",paddingTop:"2px",background:"whitesmoke",boxShadow:"1px 1px 1px 1px gray",cursor:"pointer",userSelect:"none"},onClick:function(){Tf.setState((function(e){e.showLeaderboard||(e.leaderboardFlag=!0),e.showLeaderboard=!e.showLeaderboard}))},children:[A?Object(gf.jsx)(VR.a,{title:me.t("word.Close",k),style:{marginRight:"8px"}}):Object(gf.jsx)(JR.a,{title:me.t("word.Open",k),style:{marginRight:"8px"}}),me.t("word.Leaderboard",k)]})}),T&&Object(gf.jsx)(wv.b,{children:Object(gf.jsxs)("div",{style:{position:"absolute",fontSize:"10px",color:"roadmap"===y?"black":"white",bottom:"6px",left:"188px",height:"25x",padding:"6px 6px 2px 6px",cursor:"pointer"},onClick:function(){d((function(e){T&&(e.modelsMapLatitude=T.latitude,e.modelsMapLongitude=T.longitude,e.modelsMapZoom=20)}))},children:[me.t("word.Latest",k)+": ",T.countryCode&&Object(gf.jsx)(kR.a,{countryCode:T.countryCode,style:{marginLeft:"2px",marginRight:"4px",width:"20px"},svg:!0}),T.title+", by "+T.author]})}),Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{style:{position:"absolute",fontSize:"medium",color:"black",cursor:"pointer",top:"-52px",right:c.uid?"60px":"100px",width:"64px",height:"28px",background:"orange",boxShadow:"1px 1px 1px 1px gray"},onMouseDown:function(){N()},children:me.t("word.Close",k)})}),V&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)(_v.a,{checked:b,style:{position:"absolute",fontSize:"medium",color:"black",cursor:"pointer",top:"-52px",right:"130px",width:"160px",height:"28px",background:"white",boxShadow:"1px 1px 1px 1px gray",paddingLeft:"4px"},onChange:function(){Tf.setState((function(e){e.modelsMapWeatherStations=!e.modelsMapWeatherStations}))},children:b?Object(gf.jsx)("span",{title:me.t("mapPanel.WeatherStationsNote",k),children:me.t("mapPanel.WeatherStations",k)}):Object(gf.jsx)("span",{children:me.t("mapPanel.WeatherStations",k)})})})]})]})},$R=n.a.memo(_R),eD=l(841),tD=l(570),lD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWADQTDJ/w9AAAAltJREFUWIXt1ktoVFccx/HP30xIZoJGgiDJorRZZtPFxWSrK3HhA0vA0oXLUPex62IXQqEWu1FBUSylVRe+qjvRRfFRke581hTbqqkIVq2gm+NiTmGYxJk78YWSA//NPef+v7/7f50bKSVvcy14q/R5AfMCXkZARIxGxJGI2BsRo29EQERUI2Kir6/vIg5juqurq4bDEXEsItZ0rCCl1NYwhC9xE39gsiiKwYb9QXyL+/gNk1hUyncb8Bh+wj1cwFp0tTi/GBtxFnfxHT7oSMD4+HgVG3Aat3EIY2W+pknMapzANI5heUsBRVEM5tBN4Xp/f/9WDHYKnkXIxzk993AJn2Jhw74RbM3gs/gMlZcFzyJkKTbnGrkSEVuwCJ7WarWEyVcNbSHmx0qlknANnlQqlX24il9ziHpfA3QhNuVivtLT0/NDb29vgkdIDXYNf+ELDL0C8IfYkQv6fBPrCfzX9PB/O4M/sQujcwAvz11wBydfwHgsq5htMyFVq9UD+BensKoNtIaJXO13sa2VbzzT5kCzTeFGTk9jK32UW+0GLpf0tR9PYWUuvtsDAwMHSr58AX/j61qttjOH+ZeS7x7MdXYUY43hG1OfWA9b5KzZHnZ3d18sefZcFr0dwzMmYYOQEXyFmxEx1WGKmu0b3MLv2FwUxZIZvBcVVL4TJtRbZxp7OgAfwgP1+2R9y8It2VIrcDyn5+c2Yf5HvXWXlfEdGVBqRcQIPse6DBpSnxXdqGI3vk8p3SntdC7TbXh4uF/95ryk3kGfpJRiLr46isDrWO/uX/G8gPdGwHPDy+8U7lOg5AAAAABJRU5ErkJggg==",aD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER0qAOBQywAAAilJREFUWIXt1s+LT2EUx/HXM77mh4YZopD8ygJTRlJWioXCiGTBko1YKFbsULJgYafxD1hYYWFhQ0SDRDZKVvwDQvk1HIv7TL70veZ+ry82c+punvuc83nf85x7nsOU/W+LiLYfdOMInmEM+9A1iU9L62oHNqXUSCkdyKINbMBWrMRYSml/SqnR8Qxk0H14iJPob7FnEKfwBIfQXSUDVcR34j7OY26F/f04oTieo+irBYBNuItRLKhRJxMgzzNIdQCsQOAMGnUKNcdZhZt40y7A2gwQeIn97YBgHi7iBtbg6p8AVAZBL47jHrY3rXcEoBQESfGXPFD8AY1f4nUU4FeQzbiFs5hVEu+vAEw8T7F4kpooBWirE5bY04h4Vde5DOBt3YCdAvj2vwH+mU0BlAEM4EMnBFJKhzFc9v6n4SGlNISFWIJj2IFtmFZDeASX8A67fwuQUlqvuEDmKMataYr2eg23Fd1upKLwOlxWXMcHI+JGXm8NkFIaxqIM8C1Dfc0gX/Ee1/EYGzNMK+FBxf2/BRci4lIl4IiQ57g9mIE+xfn3ZoDIUJ/y2gzsxfoc44piVNuDcxHRsu2WZSA1j0sppeU58KDiCALjWfgjevBFUbyLsQvzcRqjETFe+qVVAJo2b1IUYm8W7PEjG9MzwEw8wp2I+FwmXAsgO8xWZGNZXpr4+gG8wLWIqNyy2wZochzCaizF6yzcdo+oDZCd+9ATEeXDZU2AKfsOfE5h6rHXy3UAAAAASUVORK5CYII=",oD="data:image/png;base64,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",iD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWADcvCN3fsAAABFJJREFUWIXtl8uLHFUUxn/n1qufM2nHSTIZMhlHYxJDFAk+iEFQV7pRsxD8L8SNIi7Eta6CC4WASxdBJLiajUZX0UjA6LiY0UDUiTOZOGO/u7qqjouq6q4uG9IqOpscKGhO3fud757z3VOnRVXZTTO7Gv0OAcAe5xSRIpCKQwEfsAAn4w9UNUBEAEm3AopqNCkByYpQRA4AzwJ7gSyI1IAWRMUkmAMFbBM6lmUbjGUbcIwt/SCIfuv1rvdgCyhniEXAV6q6NpaAiBRL8GoHTit8ntk0DTwv8L3C10nWdMpx5npB8IJly7VyobwKUPQ8bTabJjTm4Xq73U1w3ATniMBNhTdVdXPAQFVJSCyU4BPgTOpL/AcrIudseDLrT96dBZ7L+6vwSlF4N7d2zoFlcjgDEdZgWqEAfJsr01JT1QqgN5I6EXfWdWvTrnskX9cGbPhKWUQKmYPeiOAXDx4QESv1Dwi04B7LdevAtRxe2YawBu2cXx3LCm1L94hI/jbVgRJwIOsM4RsDjwIzIwRExC7Csabvr6lqmAOrukJ3G34dia7aX+90VrY7/R39q+p/NjHhmZz/I7foVoC7U0d6DZ0WPAgsisg7mQ0R8FBbucuCt22RrgE8y6JaqVSBExZYc9XKiSjSzla7fSOCFrAYwinAE5GrxFcYwP+j4x+vwFFgJUugmLD6GNhgWJqmC4t9kBCuAL0QpB+G4vndex3hWKD0I7gVqvol27acIPDqUHdAAzgUxJry0oMCP4bwmIh8qqp+SuBQCB3grKr62ZyJyP0GrEj1XM5fqkFnG3Sz2XoPCJIDCYALJoQQeD+TAYAvCvB6B6aALZPQOq6wPia4KcB+F7q5WqKqbQWpOs480FLVrqo2VbWhqo0erANlVW2nPlVtcPLkpWZMbIk01Sau/5V8kCWo9qHQhZ38O4Ap29iOMfuS1Oat7sCMiOwfIX75cr8P35Xh9IBAUXgEuJRH+AlqVVtqZkwGAK4H0ervvV6D4fdhYBFsWFAsxRnK27ImBGyArnIYWBCRPQyF6QOLO4ECzIvIKeJGRRJQgIMuTPnwjIh0GNa6a+CoA3vr/f5TIuISCx1irdTCuB/E3wIR2QLOZ4DJBBoRV5K19HfaM7Iiy+5N8fKYAC+q6mzap9cyG/6vZ0VVB+m+SnxdwoSt2rZtXIPnWOJYnqcGg6hKp9HYbEfciuJrKwlYOitMYhFxX3gLhiU4DJxJgFKGds1htuIVqpFIGEaKRhFhEHYkCP0t5XEV0y05dkV9/2YEP0SAAQnik8j4+IPP/KqqfjAykPwdE5E3iNvuAnBRVS/8E5yxI9mYYPPA08A+YlFawBPAh8Rle0lE7iM+mSEuz0VVXbkteH6YGPcALwMXmFxg54HXJsGedCp2gMqEa0nWerddxYQlAL4kbiTLQJ/h3U4PkJ0hDHGZPpsEeGIRSjx+e4xvKnnF+2MGm39H4L+yXf9ndIfAn9qmRhuMvarQAAAAAElFTkSuQmCC",rD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobEDoWDDpSWAAAASVJREFUWIXtV9FOxCAQnIF+gIn+/xdq4ruW8UGIW1woePHQpJM0Rxd6M9ll6JaSsBJhKftfEEAAQVICAJJ3qYckZr6wPANbI/6AnJ18/wLgafK/nwE85nECIACvowLeM3mqYrMozyhf37A1JvZMThN7+wUBamVgz79WwK0ZcLHJP4n2ityKmsHeI5ckWv572xBobEK7oAeSGl1b1tex5efAJWC5AHcTzrjhVucMuWB2t7eeuVxwCfDwP98FJMt8AhBL+IwXzhu11Q+ckVuyUN3bcTejJDklwJBbEdGJ1ei2ZD+BbVhjHgcz55F7AuYyYAjqDAQnPiJgrQtIxuXnwKEEg/Yr9a+vOv3EV9pLCSKO3fWxKT2D44K69j0XAJ/nRvlKSgD0AUTKeVB6tWYNAAAAAElFTkSuQmCC",nD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQoxmfjAWgAAAT5JREFUWIXllzFLxEAQhb8nB8KJ2ggqNic2V1tZWIggCFr4E/0JltdobaPVCf4Caz1zhVg8mwTES9g9dkly+KqQzMx7mZnd2ZVtusRap+zAoHqQ1GoqbAt6kIHOBQwa3m/bnoWcJd0A2L6LIasrc20GYshLnADXkba1aMpALCbAKCVAb3tgAZJ2gUPg0/ZLqwIkjUvyb6DIRQ7LlWADeLU9zSkgtgQHwMR21r+PFmD7PjdxhX6ugnKHOweeA/5jYEdSiOcYeIgWUGIOvAcCF8Awwm7e9EHVgeT3Pl2NyhAknQEj27eR9gscnfdAdgGShpIuJB1JWm9VgKQ94AqYAfu2v0I+qdPwLzaBD6CInRe5BWwBU9tvsQ5ZBdh+WtZn5VfBJXCaEiC1BI+J/o2zYKlLSsQsaMTK90Ay9O9vxz/oeVnzXXquagAAAABJRU5ErkJggg==",cD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQkWF98m8gAAARlJREFUWIXtl80SwiAMhDeVq+PFF+c9PTjjtTVeQNOUlgT7c+nOdDJFQj63QCkxM7KIiAC8sZGYmXRbp4pPOmytThXfHSCoew1wxc8lDxyL62UFKDlwAfB0FNa61TqEZP+c8m93+B14QMyxWQDDQDJ6AEx5gZk5ucCFhCHFXrRZnMjj9Iu9MHVAA/QqejXUOgQASC6UAEoOrA8gILS9g4rbAQiIUVOKrdtzfRIuZicgli8Mo3Le8io3rNOtVdsHXCIit1OrOxBjRIzxOACvSM8vaWNamVw6SBQHU48g58t7nbPqHJAFrPPh8EdwApwAJ8DhAKaNqOUlsxpA3t0qx3fZ3wU7AtBFWv65kfOr0cdpy8nnX+mP0931AThFaqpKQ14AAAAAAElFTkSuQmCC",sD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQYhKPqfMgAAAytJREFUWIXd112IVVUUB/DfHitkkm57PDOOWdP0oBmFD41QCUkEvQSVaQVBzEP50JP10AcaQVlBiTBQ+FJQvQgZaNGHUlbTx6SNZn70pRZ9EPQ0zBRhNCDsHs65w+1253TuTCK4YcPl7rXW/7/X+a+1zgkpJadzdZxW9DOKQAhhTQhhSduOKaVZbVyHj3ACX+NJzK3sPwvgxb3d3a/ieE/3/ISVWIht+AqDp4QAOrEpxngEa/ESHm+yuR578CGu+d8I4G6M4lmswP3dWVfCfViGs5rs1+JbvIwLWsUMVfpACGEFHpaL9n30Yzkux9uYLH7PwS/YH2P8ZHx8fKTw35Bl2eqxsbFtKaXNmAItJRBC6MEjuAE/4y+ch/ewBVtjjM80AC3F1UV2lmJejPFXjExMTJzE7ThZPLJ30foRFDddF2P87cJFC5Nc3a/gDnQUNnNwaLrUFjaLcAs2YQeGF/RkaX7X+amId1krpxtxNMuNfscQrmxhtwz7ZiDgS7Cx0M5rjYdX1Gq13cXBD3JhZSXBBvF6mwQ68BCOYT3mQlar1Z7GBD7FqpRSqBBsCE+1AX4XDmN7jI6gs66/zb0LsoQ1bd5mF26rYHcVhrG3UH+Sd87+OoFOPIDvsFGFNloI8AAWl9j04kUcbQCu7z24OKWkI6X0Z1Gbk0UJjYYQBpWvfgT82OIshBDW42P8gUtb2HSoD8IGdR5oYjhsmjaKW/FOi/9X4yDebHHr+n60IN6VUvoHgUNNhveapo3iCTzXVJI7syz7vAQ44YsY41tYMuVbQqC+h+T62FCvDmzHTZgn74jH8WAJ8M4iwzf/K2sVCNT3G9iHVfIpt6WYiM+X+EyRm1asBYFzKxBI+KkIOCkvwzLbY3gBPaUVVRA4Rz7F/ovA/go2o/JhtbxSP2kQ0rX4rFar7S4JfrjkbAe+xJ1tNbQWpbSuIX3NINM9pu/x2MDAwNntgLckkFLS19cXGwRUloFvYoxbcVG7wKUEmup7V6H+JB9WCR9gBCtnClyJQFPnO9jT3ZWKrNwzW+D6rvROCCGEDvmr2UhK6UQlpypxqxI4VevM+Tac6fobdX01Hh9CX7YAAAAASUVORK5CYII=",dD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQMlUuCvbgAAAxBJREFUWIXN10tonFUUB/DfF6KmPjredCIm6hSnRUix+MhOxI0oqMXGlbrwgdD4oOCrGx8gIi4EoVSFooggSsGiTUHFUBFtm7a0xRYtmtZWFxFEFBx0Ud3IdfHdiR/TmclkJhgvnMXcuef8//c875fFGC3l6ltS9P8Dgf7FMpRl2d0YxB+IOB1j3DGvYoyxJ8HtOIRJvIa/yitCxCm8h/62+j0ArwkhfISDuBFX4wPsxDXy8L6LY7h00QhgObZgBg9Vq9VKuvk32NDk/NP4GTf0TACPJOAtuAwbcRwv4/w2euvxKx7sikBy8QF8XK2GtbgpxX0nrujQxih+wKsdE6hUStWLh4a24wjWJSM7EvgtXYTvAuzGLixrSQADeB6HsQmX4IXk/se6TdyC/VewH6uytFGs53E8jtMhhN21Wm0lxrEHD8cYf5uvtOdbWZYtw0/4pK+weVWWZVMjwxdNlkqltTi7VquNyctsO2Z7Bc+yrD/LsmfxvTyRN0AZm1Pz+Ftey/dgpOCyy+XuP6cHt9+Jo6VS6VOcKOzbN1QejLh/YmLirDYGpkMIt3UBfG0CPSxv0RFfYjDGSKVSquItfIH1bQw9hW0LAC6Xy+XX8V0BuC5fzRGoH8ZsiveuyvDwWBODK1MYBjoAfzIBb20CHuXteUWRwJrkpvqBE3gDQw2G92C8DfC65N6pFsB1mcV5RQKjmG44tDXdYlMB4Am83wR4FB8m17YDPiRvQlfO6dYNhGBvC6WpdKtb5Q3qKM5NesuxGSfxTBvgyRDC17jrDPIdEKjLEbwpn3p34F75IHp7Hr2TeG5sbKxphc3lAD6fx1DE7/gFfzbkTDOZkb8HWr4FigRWy2f2fAQ+6+DMdAhhbwjh+o7KNRHow6PyZ1Q74/vb/LcN3+KBBTWqhmweSTGdaQGyr8X+KbxUT86uCRSIXCef2403PtDw+5h8dqxeKHBbAgUi96Wsf8e/JRlTAh7Ezd0Cd0QgkRjAi/hRPi2PY2OvwB0TKBBZVRkensCFiwUeY3TGi+i/Xkv+bbjkBP4BGjWpnBddssUAAAAASUVORK5CYII=",uD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQMUAz6vVAAAA6FJREFUWIXF11uIlVUUB/DfV2ppytcevxm1wQknshyYhzzRS0USmCEVXZiSii5QUT4kpBQE2kWCQKGwfMikAiWxh0KsNDLSbiaZZqFpoz0MSQ8ph+ohssvu4ewjx/GcOWfGgRZ8D3ux1/r/93+tffmyGKP/08aMdsIsy87HWPwaYzzRdP5oKZBl2Xgsxa34A7/jL5yLHTHGJ+vFnTVK4PdhD2ZiHkp4DVeEEP7FvCzLVtcNjjGO+MOV+AS7MCf5JuN17MO9yXcO+vM8f/60HCME7sQ69IcQHqnxL8OPeBGTBsW04Wie50+MmIBK01ZBVmFMjFFn59Q+fIfNmDVE/HQcrSozLAK4I4G8h4tjjEIIvfgo1f+GFvNc19E+OeKylghgNrZhL+Yn33l4FYexeBjqPVUUxW58jZVDEkA71iS5l9T4FyfgNSiGqd5mzMDlRVHsbkgAS/I8P4K1mJh887E3z/MPMbsV4K6uaaWk3iklwgQcQMdg4GuxIzHtSb6LQgjvphXc3uKK25uVCFtxY3UwERumdBQx7eFLcQGeTUmWVTu+BfAlOFwUxStDlQiPY2V18LTK0bkO72AnBnC8VOrOWwS+KTXqtlZKhGswUB38jLcRB33fNOty9IygRA+EEL7FcuhJ0m+oQyDiFywcnKS7uzvHqtSsS/v6+s5uAXg+vmwv2iIeTj4vpYNhfQMCEb+FEO6sSbQQP6SSdbYAfAk2YX/Ktx4LYozGYPqfJ/7e1tXVOW5g4KgGNqlcLr+Q7voFIYSsXC7fH2P8vFEAZFk2UaWRb1bZ/1X7B+OhyvA2bBlCgYg4dUoR8WArdZ42rXgIh/BmnVwHcPfJgwj34P1mBFQeGjOayD1HZRd90SDHIazp7g75sAl0tLdFLGoAfCE2JoB68TvxGa6ujRveiygSQphb68qybFyWZcvxMX5SeRXV2luJ1NoY41Uxxk9PzZkUSHu5WQmO43DNqu9S6exNdeY+p3KRrSiVShMalaz6Kh5bLpdDCxocRMyy7DHMLYqi/dixYz3oGTTve8zCvBhj/5AZ00pmpZNp41AKpJvwGZXDqd6c7fgqATfdKSebMMaoVDIBK5JsjUjsaeB/A/14tFXg0wjU1HWmyoW0vw7QvjqqHMHLXV1dYbjgdQnUELk+ybm9BnDXIDJbQwi9IwFuSqCGyKLUVFtSeT5QuXZvORPglgnEGPX29gasxsH0rs9GAzzGOHr/hiO1Ufk3PBP7DxjivGJEQcD3AAAAAElFTkSuQmCC",fD="data:image/png;base64,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",hD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQQBIaLdeAAAAwhJREFUWIXF10tonFUUB/DfrdQXhI8bJ9pRHHTQGhQpcUCjhIKVCMWFC1sURMG6sAtdVJeCioiUIq1SF9qNzyKKtaK1vqoWQ7UVFUOVam3ioiLYgqGCSN1cF3NHQjLJPCUXDgxn7rn//znnnnPPF1JKlnItW1L0/5tACGEghLAmhHDZgnv6mYIQwkpciytxHcZwGidwTUrpz3lGKaWeBevwJfbjNRy/4PxSwg4M4Sl82NS2R+ARfIQDWI3xGOMe7K5UyrU5ew9jU18I4Dw8hyO4p1qtVkql0vMZZEMzm0qlUsWpGOPVPRHAg/gJW3AhNuEottRqtXNb2G7AsfXr15/RMYEY4y2lUulr7MYw1uIbvIXLO3BgF15om0AGeyeDj+OqnOevcHMXETwHv2LdogQwgG053PfjImzFj3igx8s7ipMxxqJpIwohbMweLsdN5XLpH3yCMzGaUtrezK7dlVI6iB0zMzMfzGV2Pd7PeR3BDTiIvXNvb48RuDM7uL2hKKs3jb9ijHuKoticPf4Fa/sIvAYHhkqDCbdmnUdwejAWCd/jlay7Fz9jsA/Al64YGnoDP+Au9Y55RYPAM3ganyHNkYcw2QPw2XiyKIqpHNXGuZ9j5L8qwKqiKD5uQiBhH7Z2AX539vjNJmfOI7A657wZgYSTGO+gxPbj0CLnHS6X629FuwQSTlSr1WIR4DJeUu8bi52zV/3xGkwpdTSQ7Jyenn55rjKEsCyE8DAmcAorF7B/FlOYSCmNpZT+QEcRSLl8Ns7y+jZM4r0WtkfxIlbMi1wnBPAbfsfteBfftth/SP0+jC6YulkN4tM2CDT2HG+xb5dc8y0vbSYwnL1rRWBysf+LothcFMUUnsBZbVXNrHyuwr787HZD4AhexyUd9Ysm5XSH+mj1djsEYowT6gPpjV11y2bKWq22HI/hmPpE2wD8btbvV9Vr/r5uW/WCBGZF4+IY484ckUfVR7DHc1ltw0Av4C0JNCTGOIYv8HdOzXCvwB0RaEilUqn2C7ghff0062Yt+dfxv1vGFje17OpaAAAAAElFTkSuQmCC",pD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFBk6Z52WNQAABWNJREFUWIW1l31IG2ccx5+c5/WSe/Jc7vLSnNE79WxMGguCUep0otGM+dZNFKa0oER0TWVQxt4obAtjwkq6QVs2EGX/DWbf1iFrOzoQBvpXRwtrKayKTNFtrHS+JBiN3m//zOI0iYltf/D883x/v+f7eZ57nnvustA+oqWlJY/juGMrKys98Xi8KTc391VVVaXu7u5/JiYmlvYzZloRDAYLZFm+xnEcCIIAoiiuqqq6LAhCzGw2gyAIkJ+f//358+fdz928paWlhhCy8p/J552dnWUAoAcAWtM0QzAY9Lrd7gs8z4PFYolVVlb6npt5e3t7GSFkjWXZ33p6erypcjs7O4+IojjDcRzslZtWAABlt9sfmkymWENDQ146NeFwWOZ5fkmW5UeaprHPBFBRUdHJMAxUVVX1Z1JXW1sbIIRATU1N1zMBWK3WnwRBWAQAOpM6TdNYQRAeOxyO8VR5VCqxr6+PXlpa8hqNxh91Ot1GJgAURcV4nh+PRCIVo6OjSR9DSgCWZU0URRlVVX2SiflWLC4u3tHr9QaMcdK9kxLg4sWLjxFCm9FoVLcfALPZLK6trWnLy8urGRe3t7dXezyeqzRNQ3Fx8c/7AZBleVwQhPmMigCAUlX1S4wxWCwWUBTlu9bW1r5k+fX19V1dXV1VO/sHBwdtHMcBxni1vLz8/cnJSSEtgKKioisMw8Dhw4dHRkZG5GR5Q0NDeQ6H49tkR21gYEDKz8+/YLFYHvA8Dzab7c/GxsaXUpofPXr0HY7jwOPxhFLldXR01DkcjoXs7GxwOp3fAEDSPQIAqLW19RjGeA5jvHr8+PHEb8fR0VFBFMWoJEmTqcyHhobMdrv9CUIIbDbbdLrvh0AgIBkMhseSJE0BwO7NX11d3aHX68HlcjWkGigYDB7BGANCCIqKiq6lY74VpaWlXXq9Hjwezyu7REVRPjOZTBAOh617DYQxfogQApPJ9Pv22bS1tb1eUlJyye/3f5Co7u7duzzP82uKogwn0sOSJIGmaf/brc3NzeV2u/0Lr9cbdrlc/lOnTlWYzeZphBBQFAWqqt4qLi7+2Gq13mFZFjiOg4aGhreTwVMUNe3xeCZ2CYWFhR+xLAter/fg9n6fz/eJXq8HhBDQNA2EEKAoChBCT5tOpwOEEBiNRvD5fG8mM0cIIYZh/sjLy7u6S/D7/S8bDAZwuVy92/vHx8e5ysrKECHkr+2mOxshJN7R0fFGKvPTp0+XEULA4XC8tUsEANpkMj0SRXE+0R3e29trU1X1q63V2Nlyc3NvpTJHCCFVVccNBsNaW1ubPWFCU1PTMYwxyLJ8JdnxcjqdJ7OysnYBsCx74dy5c7nXr1/HiSYniuKnDMOA2+1+NyVlWVnZexhjyMnJ+bWxsbF5cnLy6WoMDw/bzpw5k0PT9NJOALPZPBYIBF6z2WzzpaWlH544caKutra2oqSkZEBRlCmDwQAFBQVf7bVKCCGE/H5/gBDyN8/zwLLsiqIojwghU7Isz/b397cxDLOWAGD65s2bTlmW7xmNxq2vZjAajZCTk7NQV1d3MpFXwmW+ffv212fPnr1048aN7rm5uZqFhQU7IQQxDPPD/Pw8RggxO2vi8bgyNjYWm52dLfX5fO6ZmRm3JEm0JElzly9f/oWiqPW0Zr9XFBYWDm4du+0tOzsbvF5vfabjpfwgSRTRaPQQAOzq39zcRLFYLOMfkowAAABFo9HiRJqmaWhjY8PzQgFCodBBnU53KJm+urpa9EIB7t+/X6hpmj6ZHolE8hJetc8LIBKJOOPxeFJ9fX1dCYVCe96m2yMrQ4Dg8vJyqv89+sCBAw+mpqbupTvmv5uD6p7Um9wSAAAAAElFTkSuQmCC",yD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFCUJq76O3AAAA0VJREFUWIWt1ltoHVUUBuBvmtZgqx4iREyNaZmgIkUtjjcERTHqQxBESaHpgyg6SoWCvotiwRdBQauoVaRCEY76YMEb1qg0Fqs51lhbW6UFLyB9KCoU8cG6fZiJDumZS05zYHFm9l7rX//MXutfE4UQ9PqLomgjToQQXuwZo0cCK6Ioegt/YTmOhRAmsWCwJb1kj6LoNdmT3x5CuAWrR0dHn+gFSwhhQYYrsa+41m63z8VRXLhgvIaOEVbiPHyE+7oQexzbcp+hEMKSRSHQbrdPj+N4Fz7BThzHDlxbSL4+3zua/0/jlUUhgHXYPTExcZqsZoZHR0dTfIGX8AZ2J0ly7+Tk5EDucxa+KpI8FQKv4+4u66viOA5JkmwviXsKj9ThN+mCfhzpsr55YGBg28zMzIaSuEO4rA58aQMCJxAVF6IoWovLO53OpRVxfydJcmYdeJM3sALnz1t7GDtCCP9UxF3c6XQOLAaB93BH4X4pLsE7NXFr8X4tel2RxHHcwqEkSUZCCJIkaeFTLK8o3JtkYrVsUYQIG/F9Lkh9cRx/g+ES37PxK+5cFB2Ys8HBwTZ2TkxMnCFTw1u7tSaOJEnyfFPcxgTyBC8MDQ3N4Gs8jShN02W4Ir//DpsWghmFEERR9GjO/hh2YSqEcLxbzURRdDUeyJP+6f9W/gGPhRAOlsQN40ZcL2vr2RDCs3KA/bJZHmQ6/6VMyVaXMU/TdHkhpnTw4AJsxZ6Cf+jv7/8t39eHTnEzt1dHRkYO48EK8JA1Uun+5rwg52MHvP1fDeCDEqeQM38zTdOTWqqMQJqmQ5hqtVofVuA+WSRwDz6rcN6Sn/E5dQRwDQ5WYM3ZzUUCK/BtTcAz+KVIYj4BrJF9E9Qlnz6pDfGQTOGqAp/Dx90IYGWr1TrcIHnAbd10oE/W33XBU9jahcDnDZPvLRUi3ICfG4Ds70JgT4O4P8bHx+NKJZSJzE8NwNaUXJfZEaxrJMXYEsfxjzWAsyXX3Wwf1i9oFmBLLkRNzrXKDmBDaZ6qQYG74jj+vdfk+QNUjuUmE/Aq7JV9ATVNPot3saoWv86h+Dbkk7Ii8bRskHU971MiUCByHTbh5bnEY2Nj23E/Lloo3r/a0/48nkGnegAAAABJRU5ErkJggg==",gD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goTEAwh+C9OzQAAAjFJREFUWIW917uLVUkQwOGvro+Z8YWMiijoKOwuDBqqmBkIJiKmCj4wMjA10P/ARFhkg40WMzERRNhkzYwUBRF2BVF2faGOjI9h3BVfZdBH5qpzZ+2Ddwqae7qqT51fd1dX143M1EYiYhRHsBQ/Z+bVVo4ys7phAGeRTTuP4Ta+Oq2o2YBbXf2L2NXGUVuANXjc1T+FH2cTYBS/fKGbOysAEdHBT9OY1kRENUSbFdiBh9Pof8eZiBiu8tbiBJwwFf1ftsM42u9TMDiD7VesrnFWBRARQ4j/GVYVB7VBsxKve9iO4TnWRsRQZv7XD4Al6OV4M/7FGBbPMO4zqY2BzgzvDGK8+fhkjcMaWajMcjrZqVxMlzOz15ivpHYLVuB+D9txDGbmbzUOawGGsL2HbWNm7qv0V70Fz3Coh+1B7cfbAIxE9EwDA7MBcCkzP+BA0z/dZYuYge67AGTmTezFD41qN/Z/AsC8vgI0cgGLmufrpgqRD1psQzVAk2I/zfRGF8A7JQn1F6CRf5rf27jXPD9ReRPSsoxSjuNejOAcXuEvbEVVed52BcaUwnR+Zl5RZv7SVHD2HeAuFqATEXOUsnwTXtSWZG0BniiBOEe5H/5QaoX3WDcbAOPNu8PoZOYE3iqnYFXfAbJUpwPKrCca9Z/YoqxKfwEiYo9Smk1iWaO+gTem/8/w/QAiYhtOKkv9FC8a04SSE9ZHxDdnxDZ54BoO4u/MvNOlf6TUgcuVtPxN8hEQKBHAR+nvnAAAAABJRU5ErkJggg==",mD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gIBAAwD+wl4jAAAAs9JREFUWIXFlz1oFFEQx39vd8/Lqudyhoty8QgshOSuyHqaGMNCDmMaQcTGUoiFhY02dn4U2lloJQTBRrCwMyIoghaKkELwAwmChYUKFoIBJfErGYt9F4/19nY3F3MDU+27+f1n5r1575SI0EkzOkoHrLUMppQyAA/YD0wA20Rk938VoJQa1LC65xs+LymlbBFZjAwgIqkcKAFTwA3gAyAxPtkyXgJgATgCTANvEwDDfj2VACAHHAQuAy9WAQz7IlDUVSu3FACcAX6vAXTFe3t7pVqtLup2HQdUIzO8CfcAZuSGSWG2bVOpVDAMg7m5uS7gNfD5n4WhCjxpN2OllPT19UmtVpNSqSRKqfq3X8A5gtmjolrwoB14LpeTkZERqVarYtt2szXfgQOtBFxbDdgwDHFdV2q1mhSLxbj1S8AFoKuZgKm0cMdxZGxsTIaGhiSTyaT57e1mArYCC0kCmKYpAwMD4vu+FAqFtFW7BeSi5kBsG7q7u8X3fSmXy2JZVhrwT+Bk5B7QArYDX5sFsCxLKpWK+L4v+Xw+bdbvgb2E5kDU+D0WDtDT0yPj4+PS398vhmGkhd8jGOkqqQAFPAMkm82K53kyOjoqjuOkBS8RnH2T0Plv1QKl/Skw63meuK7bOFCS+idgMgocJ8AAZnTPbqYEC/CY4NpuCV8RoJXmGrI3gTsEd8Nm4KIuZxL4JWBDHDgs4CPwDtgXIWALcJ7gGEWBvwCH61knFVB/lO4EXgIPgSuAzV/zdDsmgEPAVV2NRnsODAMzIrIs2khiof4fBeaBN8AscB94pcGbgI1a3DBwV2c+DXQlzTjJJtxBcCsuA490+bPaNwAZgsesQbDRVgVOcgpOAN90a3ZpqEXDmW4XHjeIFOASPFJ+AGe1gLahsQJCQkzgNMFjYhYYXDcBITGDBON5ATi17gK0CItgts8DzloIUDpwx6zj/47/AFtaIekeNV/aAAAAAElFTkSuQmCC",wD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUARIGCVc1hwAABJBJREFUWIXFl12IG1UUx//n3kzcTbe72Q2FDVZyJ8lSilosUn1QKxV9KOqDfRE/wAe1H1SUQqVULCgU9UVUUPxo/QCxglpRXwRFsYXWIlppEdt1JzNJdjfWqrXbmm2SmXuPDzZLus0k01TphUDm3v85/1/ux5kbYmZcyiYuqTuA2MUmsG17iZRyKQCjta55nvfFhcRTr0uQy+VuAHAHEZEx5gciqgBYw8xHXNfd+b8BpNPpRYlE4in8+4tfKRaLR1vHx8bGuNFoXFsqlQ5GyddxCZRSy+Px+I21Wm13uVyuKKVWJRKJdcy823XdD8PiLMt6EsCaKAChM5DNZpcJITZJKb/TWiut9S4iWl+v15+Znp6eDAFWlmV5AOA4Th8z17sBdDoFVzPzsfHx8VcBDBhjTrmuuyHMHACEEOub30dHR0e7mQMdZiCZTA6nUqlHhBCLADzIzAeYeS8R/cnMbhAEP5ZKpV+b+lQqNTgyMjLTfK5Wq5lKpVLuBhC6B06ePPlXLpf7PAiC34UQwwCuZOaDWuvT8Xh8ie/7xwHMAQwNDT3dGm+MiVRjQmfAtu2VUsoNhULhAaXUOiHEFIC7gyDYWiqVvFZtJpO5JR6Pf9Xa5zjOAmae7QbQljKZTA4LITbXarXHmbkhhPgbQCMIgq2xWOy1bDa7oqlVSqn55saYj6KYhwKMjIxsYeZ3p6ampgAgCILDxpirSqWSZ4x5FEAfABCR1dz189r7UcyBNkuglFrelxjYcPTnn9bOiYj6lFIZz/PGW/qsXC73KRGtnp/UcRyLmYMoAOdtwlgstqZR819u7WPmGoD55p+0M/d9f3VU8/MAlFJKSpl03fHDYQFKKZXP59tNexMudKxdO2cPENESZj4UJs5ms3eGrDkAoF6vrxBCbLwYgMUAfpsvymQy6Vwu94aU8rOwRL7vLy2Xy98DaNi2fXNPAMaY/US0Kp1OLyKiftu2r8/n88/F4/GKEOLhkBzfAECj0fgDALTWb0op7+0JoFgsHmHmfQMDA8fz+fxsLBY7QERbwoKZea3jOLcaY/ZalrWwmcMYM2Pb9soLBgAA13V312q1xQCe7WC83XGcfsdxdjCzBtBPRHPn2RjzthDi/p4AAGBycnJ6YmLiiYmJCapWqwuaHzOkksaY9wqFwvazRxNEFANwTjEpFotHAMxE2Qtd74SVSmWupNq2vVkIsS/Ke94Ys5OINgHY00kX+VacWbZsWEp5m+u670TRe543TkSnu81CZIDLAjwGiG+Z+UzUGK31W1LKey4aYHBwMOUH+rqCfc0LUc2BuVNlOp2ISADpy6/YCH92D3/5wUx39bnNGPO6lPK+ngGUUqOsg1XBiRM7LtQcADzPO8TMp7LZ7E09AZCUDwWBv3NyZuZEu/Gzbz6ttT4VlkNr/TwR3dU2f+t9gIiEbdu3CyESWmsQkUVW/zYNepEa1bYAQggJ4CUA240xx0I0PoBtAD42xvwCAFJKVKvVr+cDSNu210spFxpjwMxERGeMMTEhRKeaMQugHwCFCc7Wjr5mxRRCoFqt7ur5v+F/1f4BnoQqMI+v2mkAAAAASUVORK5CYII=",xD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER8TbdO6QQAAAfZJREFUWIXt1k+ITWEYx/HPmaGxkIgaFmOhGyUmipomUSxnYSMb+bNkZcUOM5JITRaUiMyWMlnY2NgoMorF+LMYFpSFiJjGn6Z5LM69da5778y5f2YszK+eOp33Oe/313Pe531f5vWPlZQeImJ2AElSQH+KiP2Z9+WJEdHSQAE3MYkoRk9mfHYM1ACX4hmSWTGAHgzXAGfjQEsNYDWu5ACX4gMWN20gA/6dE5yNsw0bwCpcxK8GwKW4V7eBDPhHE+CP6KtrDbQIPIWHOJ27DbEC5zDeBPg7TmAvJjCSy4B0h3zXBHgSl7ES+zCGS+iqpwKHG4QPYx224QnuoFBl/hkNtONlHeDHRega3MZT7JhmbU1voJh0PQd4DHuwDBfwFgfRNkNXgbZKK2V6j0c1xj7jKLrRKd3nx7EhIoYiYmqGuXMZgFvS1VzST2l3FPAGI9iC3ogYiIiJPOBqWlqlTP04hGPSXh5CFzbiPh5gc4NnSIU+4QaWVDHQJv3HnbiKV9jd6AFWaw30Yj1GkyTZ+Ze5DhyRttULdEfE3fqLXKmyK1mSJO04jlO4hm9Yjl3SA2QgIr60BDzdlUz6j5/jq7Sf1zZT7ob2ASzEGemxex4dc2ogk7gVrzGKTXNuoJi8CIPFapzEgjk1kPlou3Sr7Wu5gXn9t/oDDAKDtnkUp4wAAAAASUVORK5CYII=",vD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUASQD8CFQfQAAA7ZJREFUWIXVl01oHGUcxp/nnZ01pmm2YePiR5MMM3MpRWyVCjZVexAjVQ+2vQQ8KH6AFtHgQfCjnioUrehFRTyoWPGgEaqIKPXQFi2lkCrW0mZ2N67ko9USwSSrOzvv48GkpDHZbL5a+hzn/+f/+83Ly/vOUBIuZ8xlpV+RAp7n3RaG4WaSVy2HAOvdAyQbwzB8B8B6SWMkV0k6I6mvWq0eLJVKJyTZFRHwff/WVCq131r7I8kd02uS3iW5GYAAnJB0yFp7qFAonFkWgTAMnzfGPCFpbT0DJfWS9CRVAZyy1n4r6UixWPx1QQK5XO7aTCbzsSRD8s564LPI7CXZCSAH4Jy19ijJwxMTE98PDQ39MadAEATbjTFvSPqA5IuLgc8Wa+0+kjeSvN4Y01+pVPZeJEDSCcPwLQBdADqWCzxHdltruy8IeJ63IZVK7QdwauZGW4lI6pe0m5Lg+/6TqVTqZUm5lQZPpmytfTafz7+dCoLgVcdxbrmE8D+TJHmqUCh8BPx3Em6TdORSkCX9Za3dMQUHAFOtVu83xvgATgL4ZCXA1to9kobjON6az+e/m167sAnb2trChoaGh0g+ICkGcNMywfeRfLBcLm8aHBz8bWb9f+cAybTv+/cZYx4BsBbAUQCPLwYu6X0A68fHx+8dHh7+fbaemkex53nrXNd9FMBdAIYA3LMA+OcA2vL5fKekylx9dV1Gk6uyc3JVPEkHSD5TA35cUqFQKHTPd0PWfR1PpaOj47p0Or2L5GOSDgLongH/CcAvURR1zz5hEQKtra2rm5ubu4wxnSRvIHl1kiStxphW13XDOI7PWWsPGGO2SvoyiqKeel+opkAul2vKZDKvkNwiaVTSz5L6kiQ56zjOwyQdAB9KajHGdALYCOAfSV9FUbRnSQLt7e1BOp3+BsDXlUrl9VKplJ9eD4LgC5Jroii6ffpzz/M2uq77kqTc2NhY18jIyHgtgTm/CV3XfVNSbxRFu2bCAYBkAcBJkhfNGBgY6Ovv798uabSxsfG5WnAASNWoXQPg07mKURQ9XWuwpCGS2UULVKvVHtd1PwvDMBVF0XvzDZpKNpttbmlpecEYc3e5XL5jvv6am9D3/U2O47wGoAHAMUmHkyQ5HcfxecdxEgCI49hNp9NZx3HWkdxG8mYAxycmJnoGBwfPL0lgKkEQbCG5E8AGSatJupLWAADJs5NtwwB+SJKkt1gsnp536EIEZiabzTY3NTWtAoBSqTQq6e8FD1mKwHLmyvs3XO78C2h74kwpj5OrAAAAAElFTkSuQmCC",bD="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsBFjkGPOnzBgAAA+hJREFUWIWtll1oHFUYhp/VzZrsJhs3ZDc/m2yWyQ8lP93Ek5BWNz9oWmJKvDBMBEHTi7oSRVsRQi4KXgm5qESwCImBgqjIBEFQkYJpQRRFF4R64UVxFO1VbhYiCRIpnxc5W4ZNdnamzYEDs+d8837PvOc7Zw8igteulBoFLgNSpl9eXFxUfjS9BcGIUup6MZFS6k2gCYiICD09PSPxePw1J0xVVdXQcQAEgCcdwu0l88Hx8fGrwBzwqIYdc8SPVAJ4CJcWDAafBbaARREJiMjfzvnl5eVIU1PTTHNz85VUKnWno6PjZ9M0q0UkpkN+Gh4eHnXLUZbMNM3TkUhkG3jFg5UB4FR/f//nk5OTkslkPtFuCCCmaSZ9LQFQDUg0Gv3GT0Fp8HPT09OilPqgqFNfX3/VL8AQIAsLC74q2gHxTCKR+Bc4kcvlLmgnjnThSIG6urr3lFJf3k9yx0cMA00iEtQ7Z8ETgGVZtZp45kEASmAu1dbWXj9qLlhalEtLS50A6XQ6u76+HnKtYI8tkUi07u3txQOBQJ2I/OO6C4B+yp90D9Tz+fxjpfkCOum9Nj8/P7i5ufmLUupioVC4WRy3bfuWYRgnnbG2bd8CcI7bti3Ar4ZhnCwUCsRiMWzbPgtc4eAgu+PqgGVZSU085XDlzEHoIbek3Hgqlbr3vmEYzwNf+dkFW9Fo9F2H4AWvAGtra516/AVnXF9fn3eA3t7etwCxLCuuBWa1aEclAOBxDk6/Xv07AUg2m53yDDA1NVWvRd7RX1UFSEtLy6VKAG1tbdecY/pEPOSeK4CIUFNT8wYHB8gJEaGhoeGjSCTyrRsAUJ1MJm3goohgmuYZrZH1DeBMAKSDweBYd3f3XWCoHEAmk3l1YmJCgDTQBcjAwMCKa44KAG3OJEqp39rb2zfKADyslLphGMb7JXPR+wbQQq1a7BTwoi7OhlKAlZWV1OzsrAAzSqnXAcnlci0V9SsFFBMppT6Ox+NPOHeDEwBIx2KxP0OhUDcgkUjkbS/arjeiYlNKnb99+3bn9vb293qoszQmFArNNzY2/re1tXUXYHd39wcv2p4AYrHY7zs7O6Mvr6+fBchms8+Vxuzv7/cNDg7+NTY21g1gmmbei7anJXAsw48c2P4FMKmfPwSe0s8bgCSTyU8963pMHsfHv14ikfgaaD1OgDlANjY2pFLs6upq8SJ6+tgAcrlcfTgc/syrA9Fo9NqxLoF24RwuZ7qzVoA5r7qHrmQu7RGAQCAglQKVUn94VvVKms/nw+Fw+GngZjnru7q6vgMmvWr6WoLSgixjfb9vPb8vWJYVAl46woHzfrVEhP8BzTbP9sQqXZUAAAAASUVORK5CYII=",AD=function(e){var t=Object.assign({},e);return Object(gf.jsx)("div",{style:{verticalAlign:"top",display:"inline-block",marginTop:"4px",marginRight:"8px"},children:t.children})},TD=function(){var e=Ew(si),t=Tf(yf),l=Ew(Gi),a=Ew.getState().elements,n=Ew(Vi),c=Ew(rs),s=Ew(ss),d=Ew(o.showHeliodonPanel),f=Ew(i.noAnimationForHeatmapSimulation),p=Tf(Ns),y=Ew(zr),g=Ew(cs),m=Ew(Cu),w=Ew(Fu),x=Ew(Yu),v=Ew(Bu),b=Ew(Ku),A=Ew(Sr),T=Tf(Lr),P=Tf(Er),S=Ew(Gu),j=Object(r.useState)(V.Foundation),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)(V.Wall),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useState)(V.SolarPanel),O=Object(u.a)(C,2),F=O[0],k=O[1],Y=Object(r.useMemo)((function(){return{lng:n}}),[n]),L="invert(41%) sepia(0%) saturate(0%) hue-rotate(224deg) brightness(93%) contrast(81%)",E="invert(93%) sepia(3%) saturate(1955%) hue-rotate(26deg) brightness(113%) contrast(96%)",U=function(){e((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.actionModeLock=!1}))},N=function(t){e((function(e){e.objectTypeToAdd=t,e.groupActionMode=!1,e.actionModeLock=!1})),Et.getState().setEnableOrbitController(!1),c()},J=function(e,t,l,a){var o=e.charAt(0).toLowerCase()+e.slice(1).replace(/\s+/g,"");return Object(gf.jsxs)(Qv.a.Item,{style:{userSelect:"none"},onClick:function(){l(e),N(e)},children:[Object(gf.jsx)("img",{alt:e,src:t,height:36,width:36,style:{filter:L,verticalAlign:"middle",marginRight:"10px"}}),me.t("toolbar.SwitchToAdding".concat(null!==a&&void 0!==a?a:e.replaceAll(" ","")),Y)]},"add-".concat(o,"-menu-item"))},G=function(t,l,a,o){var i=function(e){switch(e){case V.Human:case V.Tree:case V.Flower:case V.Sensor:case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:case V.WindTurbine:case V.Light:case V.Wall:case V.Window:return!0;default:return!1}}(t);return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{title:me.t("toolbar.Add".concat(null!==o&&void 0!==o?o:t.replaceAll(" ","")),Y)+(i?"\n"+(s?me.t("toolbar.ClickToUnlockThisModeForNextAction",Y):me.t("toolbar.DoubleClickToLockThisModeForNextAction",Y)):""),alt:t,src:l,height:36,width:36,style:{filter:g===t||a?E:L,cursor:"pointer",verticalAlign:"middle"},onClick:function(){N(t)},onDoubleClick:function(){i&&e((function(e){e.actionModeLock=!0}))}}),(g===t||a)&&i&&s&&Object(gf.jsx)("img",{alt:"Tiny lock",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAJCAYAAAARml2dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobECQ3lBJ92QAAANlJREFUCJkFwT1OhEAUAOA3M28SgQIJyQYC2dYrUHgJCzuzhZ2VHmNba63MVpQbb0DlBbCwoTIUkBAdTJif9/w+xczQdd1tXddvWZY9lWV5MY7jh+r7Xg3DcJzn+WStfRdCHLTWZ9m2LRHRFkL4TJKkB4A/RCRsmuZmXddr59x+miYnpbwqiuIejTF33vsdIu6EEGCtBWPMgwwhSET8yfP8saqqQxRF3957QmYGAKBt21Zm/gUAYmaBSilyzl0uy/IKAEBEkKbpF8Zx/MLMeyFEAgDMzE5r/fwPyUVuAeqNzhQAAAAASUVORK5CYII=",style:{marginLeft:"-2px",filter:g===t||a?E:L,verticalAlign:"top"}})]})},X=function(e){return Object(gf.jsx)(lb.a,{overlay:e,trigger:["click"],children:Object(gf.jsx)("span",{title:me.t("toolbar.ClickForMoreButtons",Y),style:{cursor:"pointer",verticalAlign:"middle",fontSize:"10px",marginLeft:"4px",width:"10px",height:"36px",color:"#666666",fontWeight:"bold"},children:"\u25bc"})})},B=Object(gf.jsxs)(Qv.a,{children:[J(V.Foundation,lD,R),J(V.Cuboid,aD,R),J(V.Tree,pD,R),J(V.Flower,yD,R),J(V.Human,gD,R,"People")]}),K=Object(gf.jsxs)(Qv.a,{children:[J(V.Wall,rD,I),J(V.Window,nD,I),J(V.Door,cD,I),J(V.PyramidRoof,sD,I),J(V.HipRoof,dD,I),J(V.GableRoof,hD,I),J(V.GambrelRoof,uD,I),J(V.MansardRoof,fD,I)]}),q=Object(gf.jsxs)(Qv.a,{children:[J(V.SolarPanel,iD,k),J(V.ParabolicTrough,mD,k),J(V.ParabolicDish,wD,k),J(V.FresnelReflector,xD,k),J(V.Heliostat,vD,k),J(V.Sensor,oD,k),J(V.Light,bD,k)]});return Object(gf.jsxs)("div",{children:[Object(gf.jsx)(AD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.Select",Y),alt:"Select",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFBYXpdrWjwAAA4VJREFUWIXl10uIHEUYB/B//fvr6up5d+9unNnHsOO6sw2+8MViYCMeDCKK5BajN+8ievDgwHh0wVMOihAwIoqCsEpAl8RLPBhFZUk8uB4ECRpXMOBm3MzKdLo8pEd87OzMYWZysI71+n5V3dRXpay1uJGFNzQ6AFhr0WsXCoXCYWPMOWPM6/V6PdftP9S4+wEAnAJgAVgROWWMuQkAVlZWnIEmHwJgHcA1kj8opayIfOx53ty+Mw9YBgWcFpHdcrl8hOQHKeJMLpe7eVyAMyISLy0tLYZhWBaRj5RSluTZMAyXxgE4LSJ2bm7uIAAEQTAjIh+miM8ymUw0coDnebZard7frQjDsEzy/RTxxdTU1O0jBywuLh78e2WtVjvguu57JK3W+utyuXzXyAAi8o8d6JZKpRIaY952HMdqrc8HQXDfWAEAsLy8HGit30w/x4VSqbRnv5EBAKBarZa01idIWhH5dnJy8tBYAQAwPz9f8DzvtfSc+D4MwwfHCgCAer2eM8YcT3fip1KpdHisAACIosjVWq+mO/FzsVh8dJyAbmp3Pc97EddzyKV8Pv/YfgDpOysJEekpnJ2d9Vqt1sOtVuveJEkcAO1Op5MB8GuSJJWdnZ2Xoiha39zc7Ow1vi8AAOI4Vr3atre372y32+9YazMkQfL6ykSQJElbRL7xfb/nAvoCkiSBtVYBQKPRUKurq49YayfjOF4DcAWAjeNYk/zF9/1XAVxKkkQ5jqPiOP49CIJPNzY24p4BBkxG9wCAMeZZkpcBxCLyjLUW09PTRkTWSF4xxhzpt6D/xB0gHf8RRdGtWuunSe6QvJaefN91b0jZbPZxkpbkWi6XKw0TsE6yY4x5C8BVklv5fP6o67rvKqVsJpN5CvgrQ54juau1fmiYgE8A2HTFl40xTwCAMeYYyV2SZwF4AOC67nMkreu6x5vN5r53xoEBWutXSP5G8mI+nz/ara9UKqFS6kuSNpvNHgKAYrF4h+M4F0n+6Pv+bUMB1Gq1KWPMk77vP/DvNmNMMz12TwJAs9l0tNYvK6Ws67rPAxjs5jzIFXqvMjMzs0Byi+TWwsLCTIo6RrJD8oIxpjxSAABorU+SjI0xJ0g2SZ5P/5evfN8/MHLAxMTEioi0SMZp4Kta6zcKhcLd6PPsGwqg0Wgo3/dfEJHPPc9rZLPZW6IocgcZ242r/vev4z8B5TAn+0kvIhQAAAAASUVORK5CYII=",height:36,width:36,style:{filter:g!==V.None||m||w||x||v||b||S?L:E,cursor:"pointer",verticalAlign:"middle"},onClick:U})}),Object(gf.jsx)(AD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.ManipulateGroup",Y),alt:"Group",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAR4FluLjugAAAKtJREFUWIXtl0sOgCAMRDuG+1+5riAVASkfq0lnZ9I4z0lbBMxMlgpERAAuFMyMXYa51yFNdxpLSa9QK8pJR0x66hLArKFG0gurmzC+vDeBQz4A4DeTuAFYyAGqY5hL2xutetmg/0kg6mm8WmNYSsU8AQdwAAco7oHWFlt9Wn4rgdaW0/5o9Mo8AQdQn4YzKvWPGmB0DGvNa341SwlE09oXroSSXt9pQqur2QnRTVJZNG/P0wAAAABJRU5ErkJggg==",height:36,width:36,style:{filter:S?E:L,cursor:"pointer",verticalAlign:"middle"},onClick:function(){e((function(e){e.groupActionMode||(e.objectTypeToAdd=V.None),e.groupActionMode=!e.groupActionMode}))}})}),Object(gf.jsxs)(AD,{children:[function(e){switch(e){case V.Foundation:return G(e,lD,Ew.getState().addedFoundationId);case V.Cuboid:return G(e,aD,Ew.getState().addedCuboidId);case V.Tree:return G(e,pD);case V.Flower:return G(e,yD);case V.Human:return G(e,gD,void 0,"People")}}(z),X(B)]}),Object(gf.jsxs)(AD,{children:[function(e){switch(e){case V.Wall:return G(e,rD,Ew.getState().addedWallId);case V.Window:return G(e,nD,Ew.getState().addedWindowId);case V.Door:return G(e,cD,Ew.getState().addedDoorId);case V.PyramidRoof:return G(V.PyramidRoof,sD);case V.HipRoof:return G(V.HipRoof,dD);case V.GableRoof:return G(V.GableRoof,hD);case V.GambrelRoof:return G(V.GambrelRoof,uD);case V.MansardRoof:return G(V.MansardRoof,fD)}}(W),X(K)]}),Object(gf.jsxs)(AD,{children:[function(e){switch(e){case V.SolarPanel:return G(e,iD);case V.ParabolicTrough:return G(e,mD);case V.ParabolicDish:return G(e,wD);case V.FresnelReflector:return G(e,xD);case V.Heliostat:return G(e,vD);case V.Sensor:return G(e,oD);case V.WindTurbine:return G(e,"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUAggr/uMtcAAAAzxJREFUWIXFVk1II2cYfr7vy/zEnd/EbIs6aqMxCTaKRWpNBdfG4mWPrbfem70ve9oilL0uLaUHD4XS24KXUjxUC21pj5UiFEqLDEI0WA9CYiTuMJO3hzXbVuyaySbxgYGZ7+edZ56H550PRIRWrkKhcH96enqy1fWtXhwt4uDgwD06OnrU6vpW0TKBqampb4QQ71qWVegogzByZTKZJ6Zp/nEjFgBALpf7RJKkibGxseKNKEBEEdu2S7qu1/L5vN5zBQD4six/4XnerXK5vHYTCmB2djYdjUZ9TdNoYmLitZdVoK1Nuq7/BIBkWf7OcZyxXloAAPA875dkMom5ubnC6enp7sDAwNsIEemXsmB9fd20bbsEgADQysoKATiLxWK/G4bx5cjIyL1MJjNfLBaTRMSuq8eIKCzniGmav1Wr1TQATE5OwnVdEBGEEJAkCZxzKIqCRqNxIoTYicfjPzqOs7O5ufntBfF/ioV9ezabTdbr9TgAaJoG13X/XFhY+NSyLO77Pg+CAIwxfn5+zhljchAEqqZpkqqqt68sGNaCwcHBnyORCCmKUsvlcu8RkehZCubn59/XNI00TSMAd4hIAFgeGhr6fnl5ebirKVhbW1P39vY+8zwPjuM8IKIfVFX9QJbl7Vqtdsc0zXhYO0NZYFnWPV3XyTCMh82xbDb7mHNOiqJ4qVTqza4pkM/nb3POP7dt++tKpfLxv6aGGWPgnEsnJyd9XVMgFos9icfjO5dzzRj7inNOQggSQhS6okAikVhUFGVhZmbmHfw3w9y27eFm/peWlt5qR4AXElhdXY2Oj48/SCQSd7e3tyuXpkVfX1+KiNBoNFAul9WOEwDgLS4ufri7u/vr5QnGWHB4ePgUeGZjqVRqtEOg7QZSLBZtSZKOABBjjAB81NU+cBlnZ2cpy7JeaX5EOp1+o506of8FTWxsbDz1ff/5cxAEV/f6a9C2AqOjo68TPQsFYwzHx8f+NVs6S8B13VcvegEYY6hWq70l0N/fn2tacNGqh7a2tm71jIDjOH8ZhoFIJAIigiRJzv7+vhG2zrUnItM0X7igXq9fOR6NRp/fVyoV9n/721agU2jnTNhR/A2OInIG7r+B4wAAAABJRU5ErkJggg==");case V.Light:return G(e,bD)}}(F),X(q)]}),Object(gf.jsx)(AD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.ClearScene",Y),alt:"Clear",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWASEWSoKIWAAAAZdJREFUWIXllrEuBFEUhv9fJIR3UGokCiSeQMsbkBD/NoREvIFKQ6jmUqxWqfYAEgmReAFPgYJf4c7m7q5lcNcIJ5ns3jNn5vvmzpnk0DbqjIFa6b9BYLAzQXJN0mE/YCGEOdvnbby0B/oJTySmbF+3ErZbhyRLcprLeUgygJ00V0cPMF3UIfBct0Bb/MtX0Pbp/8tX8DMCJCdIzr5x6rTvAiQ3JN1KuiB5XOaLoqDtq74KRPh+uZa0QrLZqz6rAMn1FJ5ILPWSyCZAclPSQa/zpQTJNmYWgQjf+6hO0hKArawCVeGJxG42gdhwleEAEEJYyCKQNlwIYbwiXLbP0lzXSFYRPlk2XAhhxPY9yWFJDx/AjzrzX92BkfKP7fv4+xhCGPoMHOieCWckXb5HLoqCJAngWNJyBAzafiprGo1G66bvwbsEosQkgEUAox21BlDYvklqm/HTakmQHJN0VwX+etdvDpoAmnHYPAUwXQ62AFarXN+1A18JkieSFst1pSfPtQPJTmzHJ5//zHVZduA78XcnoqrxAhsxq5juT7lFAAAAAElFTkSuQmCC",height:36,width:36,color:"#666666",style:{cursor:"pointer"},onClick:function(){Zv.a.confirm({title:me.t("toolbar.DoYouReallyWantToClearContent",Y)+"?",icon:Object(gf.jsx)(sb.a,{}),onOk:function(){var t=JSON.parse(JSON.stringify(Ew.getState().elements));y();var l={name:"Clear Scene",timestamp:Date.now(),removedElements:t,undo:function(){e((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(l.removedElements))}))},redo:function(){y()}};A(l)}}),U()}})}),Object(gf.jsx)(AD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.SpatialAnalysisOfEnergy",Y),alt:"Spatial analysis",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wEHEBw2Usn7JwAAA7JJREFUWIXF11uIlVUUB/DfOKnZpBnmQGGplWM25VhGSlkWSZeHsoeiu0WkNoEFFj1IQkVhPfWQXamwosiyCLqMdCG6kJI0RZFd6G6oNFGNXRwbh+lh7Y+zz5lznDMh04LNOd/a6/bt9d//vT/+Z2kYgu1+mJ5+K6UfW9LY6zIZF+JBdKdk1cZ7uB4n7a3EI3E23tpD0mpjG27BlHqS1GrBKKxAO5oz/S/iTf9AY0rYIFozuyLGO1iGT+oppDL5behReqstuBNnYSL2xziMTb8zsATrla/GBswcSvJG3IqdWZDncCpG1OF/MG4SbSj8N6Kt3gLOxW/JsQ9P4KB6nZM04PKKIt7AhMEcp4q+FU4v1Eh+CBbiCpyBAzG6it1VAiv9YkWvHayA87PkP2BuNrcPjsNyPInN+BGfYh3uwQ1ozXwasCaLuR5jaiVvwn2Z8V1KPZ+M2/GFwbfg12LnHJB8Z6IrzX2PebUKmK1EMttxZtK3Gojsb9CBOwRgO5JPMb8Tj4v2jcGbSd+LlbUKOEU56pswHq9n+h1YheOxAJfhYsxP/o9iV2a/OsVenOmeVoN7Ts6MHhF8vyrTdYkeN6aEG9KK7cBrOErwwd3YnXx24epUbG/SfaQcJ1ULuB8nin72p4D3ZraPGdj7dWluNJ5X3q6V+Ds9/4TT8sTVyKURW5MxJao9Jj1vEixZyF/oTP9n4LBs7kMBvsb0XBQ2QOZlk2uSw0IlBPfhXXHSjRdI/zjpFgt6Ph1vZ3G2poIWJP/+VPy0agXkLdiElqS/ThxAORAfwnlYiitxkQBuflRvw6XiRH1YeXuryqF4PzNsz+YuSUVV9v1X/F6h253inJN8m/FlmutOsWrKkixQh1jWQlrECbkRXykhvV8AbLNY/psFVecx/0l2nelFa8pcJULpxY1VbKZhDhal+eW4QHBDZfAjldizT/lOqir7CnYr3my7IJv/IlPwShbrO5xQj+Mkgey8iEUCTPXKdLysvEUrhuBvlnJAdgtubxNsV01GCcy043MDgfmseLkBUutOOAsPKD+Su/AZXhLIHil62ySuanNwRCqGwFGxcn2CLa/BnzVyDpA2wfPFpWIo41txM34x0/WJu8TUegsgrlFLUyHF2VBr9Ai+WK0EuElYq7QV+/GMrJX1fhmNxbHiIGkVFDtR9Pdnsd0+wKsC8bmMEx81BQn1iDvGMqXzZkgyIhUxX5whLXs2B4eLlSiu+p2CJ4ZVJuApscOOHu7khTSr85Nt2ORfxq1ZEqNjj0MAAAAASUVORK5CYII=",height:36,width:36,color:"#666666",style:{filter:p?E:L,cursor:"pointer",verticalAlign:"middle"},onClick:function(){p?Tf.setState((function(e){e.showSolarRadiationHeatmap=!1,e.showHeatFluxes=!1})):!f||Tw.hasMovingParts(a)?(T||Kh(me.t("message.SimulationStarted",Y)),setTimeout((function(){c(),t("runDynamicSimulation",!T),e((function(e){l&&(e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Dynamic)",timestamp:(new Date).getTime()})}))}),100)):(P||Kh(me.t("message.SimulationStarted",Y)),setTimeout((function(){c(),t("runStaticSimulation",!P),e((function(e){l&&(e.actionInfo={name:"Generate Daily Solar Radiation Heatmap (Static)",timestamp:(new Date).getTime()})}))}),100))}})}),Object(gf.jsx)(AD,{children:Object(gf.jsx)("img",{title:me.t("toolbar.ShowSunAndTimeSettings",Y),alt:"Heliodon",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVDjcggElAxQAAAy1JREFUWIXFl09oVHcQxz+zya67MYk+3IQoddfdjf9SpXhoK1RRVEovght8mBz0FB569ZSDFxX00INgQ+GVHAqFFndJPFcE6cEee1MUYZVkNf6DWCsWmt1OD/u2Pp/vJb/dRTIw8Hhv5jsz35nf7G9FVVlNia1q9E4TKBQK+4LvRCQpImeNQVS1bQUU2BZ4d7UBa4bRcQti3bErvuq7gVet+He3G1hEuoCN9aX602w2a83NzR0GBoHfgaQxUIuUF4EfgCvAkKqSz+fP0GhFUA96PuPAFHAhFLPFBLry+fz3eD0GTkUEb+ou4Jz3nA7DlHb2gIhsBJ4BdQPzPuATVb0X+rWTU+DXTCZjAUeBH/0srOTXFgMricfQE69AEREFelT176Bty6dARPpd1x22LGsQSP18bebfhafVPzObNlXL5fIjVa2p6kLDVA4BTExMMD09/VZEUFV5D9CU4lKp9A3LD5wCWhwtKrDZeLANJn/QJHBYIh0nkEgkdrYT3K+2bXctFyNyBkQkC9xtdUaCUqvXaoBEfQ89Bd5OXwpzKI4WGR8bHwMeLy4uvjx/6VLqqy++Tdfqv9y4Pns9NEhxtMjszGx4EmG0eIP0Xj9d191h0lPHceO2bR8n0ArHcUI3YdjQrfE7ZoeH97SzmGzb7vIXEjWUYcft/+xLpdK6djdjUycnJ4/4CoqZMNA07ve9ywIng7QuoyeB1Lu2OMe8NhSMEnBd90sgNjU15QfdC6wx2BtDnm3Tb6Q5V47jfG3KwEgToBP6gfVNHNu2h23bPhG0ibqS3QEsDe7tFkVVX3kYY+Vy+YFlWc/DjMIYON/p8EXgfmbCwMV4In5ARDqq3i+FQmG39/jChIEtgEpMZoCBTivPZDJHent7FxCuhTITQdfnPWt7Hvb1970BvgP2A8v+qAT8NwCn4on4byOfjijwE40LyQe2kTciEUkBp1M9qTO5XG7r/Pz824H0wB+VSuU+MAe8Bv6isTmTwJCI5JKp5O5cLre9Wq3W0hvSv1YqlcuqejuqPUZXMhHZAxxA2ItyIsounojfWvpn6Q5wG7ipqi9XxDZJ4GPKqv87/g99LxWbCpiI3gAAAABJRU5ErkJggg==",height:36,width:36,color:"#666666",style:{filter:d?E:L,cursor:"pointer",verticalAlign:"middle"},onClick:function(){var t={name:"Show Sun and Time Settings Panel",timestamp:Date.now(),checked:!d,undo:function(){e((function(e){e.viewState.showHeliodonPanel=!t.checked}))},redo:function(){e((function(e){e.viewState.showHeliodonPanel=t.checked}))}};A(t),e((function(e){e.viewState.showHeliodonPanel=!e.viewState.showHeliodonPanel}))}})})]})},PD=n.a.memo(TD),SD=mv.a.div(mz||(mz=Object(gv.a)(["\n position: absolute;\n top: 0;\n right: 10px;\n margin: 0;\n padding-bottom: 0;\n padding-top: 16px;\n display: flex;\n justify-content: center;\n align-items: center;\n user-select: none;\n z-index: 9;\n"]))),jD=function(e){var t=e.signIn,l=e.signOut,a=Ew(Vi),o=Ew(di),i=Tf(Ki),n=Object(r.useMemo)((function(){return{lng:a}}),[a]),c=Object(gf.jsxs)(Qv.a,{triggerSubMenuAction:"click",children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(){Tf.setState((function(e){e.showAccountSettingsPanel=!0}))},children:me.t("avatarMenu.AccountSettings",n)},"account"),Object(gf.jsx)(Qv.a.Item,{onClick:l,children:me.t("avatarMenu.SignOut",n)},"signOut")]});return Object(gf.jsx)(SD,{children:Object(gf.jsxs)(wv.b,{direction:"horizontal",children:[!i&&Object(gf.jsx)(PD,{}),Object(gf.jsx)("div",{style:{verticalAlign:"top"},children:o.displayName?Object(gf.jsx)(lb.a,{overlay:c,trigger:["click"],children:Object(gf.jsx)("a",{className:"ant-dropdown-link",onClick:function(e){return e.preventDefault()},title:me.t("tooltip.clickToAccessAccountSettings",n),children:Object(gf.jsx)(eD.a,{size:32,src:o.photoURL,alt:o.displayName})})}):Object(gf.jsx)(tD.a,{title:Object(gf.jsx)("div",{onClick:function(e){return e.stopPropagation()},children:me.t("avatarMenu.PrivacyStatementTitle",n)}),content:Object(gf.jsxs)("div",{style:{width:"280px",fontSize:"12px"},children:[me.t("avatarMenu.PrivacyStatement",n),Object(gf.jsx)("a",{target:"_blank",rel:"noopener noreferrer",href:"https://intofuture.org/aladdin-privacy.html",children:me.t("aboutUs.PrivacyPolicy",n)}),"."]}),children:Object(gf.jsx)(xv.a,{type:"primary",onClick:t,children:me.t("avatarMenu.SignIn",n)})})})]})})},HD=n.a.memo(jD),zD=function(e){var t=e.saveToCloud,l=e.isLoading,a=e.setTitle,o=e.getTitle,i=e.setTitleDialogVisible,n=e.isTitleDialogVisible,c=Ew(si),s=Ew(Vi),d=Object(r.useState)(!1),f=Object(u.a)(d,2),h=f[0],p=f[1],y=Object(r.useState)({left:0,top:0,bottom:0,right:0}),g=Object(u.a)(y,2),m=g[0],w=g[1],x=Object(r.useRef)(null),v={lng:s},b=function(){t(o(),!1,!0),c((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!1}))},A=function(){i(!1),c((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!1}))};return Object(gf.jsx)(Zv.a,{width:500,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return p(!0)},onMouseOut:function(){return p(!1)},children:me.t("menu.file.SaveAsCloudFile",v)}),visible:n(),footer:[Object(gf.jsx)(xv.a,{onClick:A,children:me.t("word.Cancel",v)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:b,disabled:!o(),children:me.t("word.OK",v)},"OK")],confirmLoading:l(),onCancel:A,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!h,bounds:m,onStart:function(e,t){return function(e,t){if(x.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=x.current.getBoundingClientRect();w({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:x,children:e})})},children:Object(gf.jsxs)(wv.b,{direction:"horizontal",children:[Object(gf.jsxs)("span",{children:[me.t("word.Title",v),":"]}),Object(gf.jsx)(ET.a,{style:{width:"400px"},placeholder:"Title",value:o(),onPressEnter:b,onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){a(e.target.value)}})]})})},RD=n.a.memo(zD),DD=l(573),MD=Zz.a.Column,WD=mv.a.div(wz||(wz=Object(gv.a)(["\n position: fixed;\n top: 90px;\n right: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 14;\n"]))),ID=mv.a.div(xz||(xz=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 640px;\n height: 520px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n"]))),CD=mv.a.div(vz||(vz=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),OD=function(e){var t=e.projects,l=e.setProjectState,a=e.deleteProject,o=e.renameProject,i=Ew(Vi),c=Ew(di),s=Ew(si),d=Ew(Ni),p=n.a.useRef(null),y=Object(r.useRef)(null),g=y.current?y.current.clientWidth+40:680,m=y.current?y.current.clientHeight+100:600,w=Object(r.useState)({x:0,y:0}),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)(!1),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)({left:0,top:0,bottom:0,right:0}),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useState)(),O=Object(u.a)(C,2),F=O[0],k=O[1],Y=Object(r.useState)(),L=Object(u.a)(Y,2),E=L[0],U=L[1],N=Object(r.useRef)(null),V=Object(r.useRef)(Object(h.a)(t)),J=Object(r.useState)(!1),G=Object(u.a)(J,2),X=G[0],B=G[1],K=Object(r.useState)(-1),q=Object(u.a)(K,2),Q=q[0],Z=q[1],_=ET.a.Search,$=Object(r.useMemo)((function(){return{lng:i}}),[i]);Object(r.useEffect)((function(){var e=function(){b({x:Math.max(0,g-window.innerWidth),y:Math.min(0,window.innerHeight-m)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){t&&(V.current=Object(h.a)(t),B(!X))}),[t]);var ee=function(){Tf.setState((function(e){e.showProjectListPanel=!1}))},te=function(){F&&E&&(o(F,E),U(void 0),B(!X)),S(!1)};return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Zv.a,{title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return R(!0)},onMouseOut:function(){return R(!1)},children:me.t("word.Rename",$)}),visible:P,onOk:te,onCancel:function(){S(!1),U(void 0)},modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!z,bounds:W,onStart:function(e,t){return function(e,t){if(N.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=N.current.getBoundingClientRect();I({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:N,children:e})})},children:Object(gf.jsxs)(wv.b,{direction:"vertical",style:{width:"100%"},children:[Object(gf.jsx)(ET.a,{placeholder:"Title",value:E||F,onPressEnter:te,onKeyDown:function(e){if(!Wt.test(e.key))return e.preventDefault(),!1},onChange:function(e){U(e.target.value)}}),Object(gf.jsxs)("span",{style:{fontSize:"11px",color:"red"},children:[Object(gf.jsx)($z.a,{style:{marginRight:"4px"}}),me.t("word.Caution",$)+": "+me.t("projectListPanel.IfSharedOrPublishedRenamingProjectBreaksExistingLinks",$),"."]})]})}),Object(gf.jsx)(JT.a,{nodeRef:p,handle:".handle",bounds:"parent",axis:"both",position:v,onDrag:function(e,t){b({x:Math.max(t.x,g-window.innerWidth),y:Math.min(t.y,window.innerHeight-m)})},onStop:function(e,t){},onMouseDown:function(){s((function(e){e.selectedFloatingWindow="projectListPanel"}))},children:Object(gf.jsx)(WD,{ref:p,style:{zIndex:"projectListPanel"===d?Ke:14},children:Object(gf.jsxs)(ID,{ref:y,children:[Object(gf.jsxs)(CD,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("projectListPanel.MyProjects",$)+" ("+V.current.length+")"}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){ee()},onTouchStart:function(){ee()},children:me.t("word.Close",$)})]}),Object(gf.jsx)("span",{style:{direction:"ltr"},children:Object(gf.jsx)(_,{style:{width:"50%",paddingTop:"8px",paddingBottom:"8px"},title:me.t("projectListPanel.SearchByTitle",$),allowClear:!0,size:"small",enterButton:!0,onSearch:function(e){if(t){V.current=[];var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o,i=l.value;(null===(o=i.title)||void 0===o?void 0:o.toLowerCase().includes(e.toLowerCase()))&&V.current.push(i)}}catch(r){a.e(r)}finally{a.f()}B(!X)}}})}),Object(gf.jsxs)(Zz.a,{size:"small",style:{width:"100%",direction:"ltr",verticalAlign:"top"},dataSource:V.current,scroll:{y:360},pagination:{defaultPageSize:10,showSizeChanger:!0,position:["bottomCenter"],pageSizeOptions:["10","20","50"]},children:[Object(gf.jsx)(MD,{title:me.t("word.Type",$),dataIndex:"type",width:"25%",render:function(e){return Object(gf.jsx)(_z.a.Text,{style:{fontSize:"12px",verticalAlign:"top"},children:e})},onCell:function(e,t){return{style:{background:Q===t?"lightskyblue":void 0!==t&&t%2===0?"beige":"gainsboro"}}}},"type"),Object(gf.jsx)(MD,{title:me.t("word.Title",$),dataIndex:"title",width:"50%",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.title.localeCompare(t.title)},render:function(e,t,o){var i=void 0;return Object(gf.jsxs)(wv.b,{style:{width:"100%"},children:[Object(gf.jsx)(lb.a,{overlay:Object(gf.jsxs)(Qv.a,{onMouseEnter:function(e){var t;i=null===(t=window.getSelection())||void 0===t?void 0:t.toString()},children:[Object(gf.jsx)(Qv.a.Item,{onClick:function(e){e.domEvent.preventDefault(),e.domEvent.stopPropagation(),l(t)},children:me.t("word.Open",$)}),Object(gf.jsx)(Qv.a.Item,{onClick:function(t){t.domEvent.preventDefault(),t.domEvent.stopPropagation(),i&&i.length>0?Zh(i):Zh(e),Bh(me.t("projectListPanel.TitleCopiedToClipBoard",$)+".")},children:me.t("projectListPanel.CopyTitle",$)}),Object(gf.jsx)(Qv.a.Item,{onClick:function(t){t.domEvent.preventDefault(),t.domEvent.stopPropagation(),k(e),S(!0)},children:me.t("word.Rename",$)}),Object(gf.jsx)(Qv.a.Item,{onClick:function(t){t.domEvent.preventDefault(),t.domEvent.stopPropagation(),function(e){Zv.a.confirm({title:me.t("projectListPanel.DoYouReallyWantToDeleteProject",$)+' "'+e+'"?',content:Object(gf.jsxs)("span",{style:{color:"red",fontWeight:"bold"},children:[Object(gf.jsx)($z.a,{style:{marginRight:"6px"}}),me.t("word.Warning",$)+": "+me.t("message.ThisCannotBeUndone",$)]}),icon:Object(gf.jsx)(eR.a,{}),onOk:function(){a(e)}})}(e)},children:me.t("word.Delete",$)}),Object(gf.jsx)(Qv.a.Item,{onClick:function(t){t.domEvent.preventDefault(),t.domEvent.stopPropagation();var l=Ge+"?client=web&userid="+c.uid+"&project="+encodeURIComponent(e);Zh(l),Bh(me.t("projectListPanel.ProjectLinkGeneratedInClipBoard",$)+".")},children:me.t("projectListPanel.GenerateProjectLink",$)})]}),trigger:["hover"],children:Object(gf.jsx)(DD.a,{style:{fontSize:"12px",cursor:"pointer"},onMouseEnter:function(){void 0!==o&&Z(o)},onMouseLeave:function(){Z(-1)}})}),Object(gf.jsx)(_z.a.Text,{style:{fontSize:"12px",cursor:"pointer",verticalAlign:"top"},children:e})]})},onCell:function(e,t){return{style:{background:Q===t?"lightskyblue":void 0!==t&&t%2===0?"beige":"gainsboro"}}}},"title"),Object(gf.jsx)(MD,{title:me.t("word.Time",$),dataIndex:"time",width:"25%",defaultSortOrder:"descend",sortDirections:["ascend","descend","ascend"],sorter:function(e,t){return e.timestamp-t.timestamp},render:function(e){return Object(gf.jsx)(_z.a.Text,{style:{fontSize:"12px",verticalAlign:"top"},children:e})},onCell:function(e,t){return{style:{background:Q===t?"lightskyblue":void 0!==t&&t%2===0?"beige":"gainsboro"}}}},"time")]})]})})})]})},FD=n.a.memo(OD),kD=function(e,t,l){Object(r.useEffect)((function(){e&&(t(),l())}),[e])},YD=function(e){var t=e.viewOnly,l=void 0!==t&&t,a=e.canvas,o=Ew(si),n=Tf(yf),c=Ew(Vi),s=Ew(di),p=Ew(i.latitude),y=Ew(i.longitude),g=Ew(i.address),m=Ew(i.countryCode),w=Ew(Hr),v=Tf(Ps),b=Tf(Hs),A=Tf(zs),T=Tf(Rs),P=Tf(Ki),R=Ew(ar),D=Tf(nr),W=Tf(hr),I=Tf(pr),C=Tf(gr),O=Tf(mr),F=Ew(tr),k=Ew(lr),Y=Ew(jr),L=Ew(Rr),E=Tf(Di),U=Ew(wr),N=Ew(rr),J=Tf(cr),G=Tf(sr),X=Tf(dr),B=Tf(ur),K=Tf(fr),q=Object(r.useState)(!1),Q=Object(u.a)(q,2),Z=Q[0],_=Q[1],$=Object(r.useState)(!1),ee=Object(u.a)($,2),te=ee[0],le=ee[1],ae=Object(r.useState)([]),oe=Object(u.a)(ae,2),ie=oe[0],re=oe[1],ne=Object(r.useState)([]),ce=Object(u.a)(ne,2),se=ce[0],de=ce[1],ue=Object(r.useState)(!1),fe=Object(u.a)(ue,2),he=fe[0],pe=fe[1],ye=Object(r.useState)(null!==R&&void 0!==R?R:"My Aladdin File"),ge=Object(u.a)(ye,2),we=ge[0],xe=ge[1],ve=Object(r.useState)(!1),be=Object(u.a)(ve,2),Ae=be[0],Te=be[1],Pe=Object(r.useRef)(),Se=Object(r.useRef)(),je=Object(r.useRef)(),He=Object(r.useRef)(!0),ze=Object(r.useMemo)((function(){return{lng:c}}),[c]);Object(r.useEffect)((function(){var e=0===$T.a.apps.length;return 1===$T.a.apps.length&&$T.a.apps[0].name===S.LOG_DATA&&(e=!0),e?$T.a.initializeApp({apiKey:"AIzaSyD-236qE4ix9TkH2AW_wjKSz8jgK0ukjW0",authDomain:"aladdin-316017.firebaseapp.com",projectId:"aladdin-316017",storageBucket:"aladdin-316017.appspot.com",databaseURL:"https://aladdin-316017.firebaseio.com",messagingSenderId:"169516488625",appId:"1:169516488625:web:bb0ae3c3f7c6e813250f90"}):$T.a.app(),$T.a.auth().onAuthStateChanged((function(e){var t=new URLSearchParams(window.location.search).get("title");o(e?function(l){l.user&&(l.user.uid=e.uid,l.user.displayName=e.displayName,l.user.email=e.email,l.user.photoURL=e.photoURL),l.cloudFile=null!==t&&void 0!==t?t:void 0}:function(e){e.cloudFile=null!==t&&void 0!==t?t:void 0})})),De(),window.addEventListener("popstate",Re),function(){window.removeEventListener("popstate",Re)}}),[]);var Re=function(){if(!l){var e=new URLSearchParams(window.location.search),t=e.get("userid"),a=e.get("title");t&&a&&qe(t,a,!0)}};Object(r.useEffect)((function(){if(Pe.current){var e=[];Pe.current.forEach((function(t,l){e.push({key:l.toString(),title:t.fileName,time:x()(new Date(t.timestamp)).format("MM/DD/YYYY hh:mm A"),timestamp:t.timestamp,userid:t.userid,action:""})})),e.sort((function(e,t){return t.timestamp-e.timestamp})),re(e)}}),[Pe.current]),Object(r.useEffect)((function(){if(Se.current){var e=[];Se.current.forEach((function(t,l){var a,o;e.push({key:l.toString(),owner:t.owner,title:t.title,time:x()(new Date(t.timestamp)).format("MM/DD/YYYY hh:mm A"),timestamp:t.timestamp,description:t.description,dataColoring:t.dataColoring,selectedProperty:t.selectedProperty,sortDescending:t.sortDescending,xAxisNameScatteredPlot:t.xAxisNameScatteredPlot,yAxisNameScatteredPlot:t.yAxisNameScatteredPlot,dotSizeScatteredPlot:t.dotSizeScatteredPlot,thumbnailWidth:t.thumbnailWidth,type:t.type,designs:t.designs,ranges:null!==(a=t.ranges)&&void 0!==a?a:[],hiddenParameters:null!==(o=t.hiddenParameters)&&void 0!==o?o:kw.getDefaultHiddenParameters(t.type),counter:t.counter,action:""})})),e.sort((function(e,t){return t.timestamp-e.timestamp})),de(e)}}),[Se.current,he]),Object(r.useEffect)((function(){if(je.current=new Map,s.aliases&&s.aliases.length>0){var e,t=Object(f.a)(s.aliases);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l!==s.displayName){var a=N.get(l);a&&(je.current=new Map([].concat(Object(h.a)(je.current),Object(h.a)(a))))}}}catch(i){t.e(i)}finally{t.f()}}if(s.displayName){var o=N.get(s.displayName);o&&(je.current=new Map([].concat(Object(h.a)(je.current),Object(h.a)(o))))}}),[N,s.displayName,s.aliases]),kD(D,(function(){R&&(Je(R,!1,!1),xe(R))}),(function(){return n("saveCloudFileFlag",!1)})),kD(W,(function(){Ie().then((function(){Ce().then((function(){}))}))}),(function(){return n("modelsMapFlag",!1)})),kD(I,(function(){Oe().then((function(){Ce().then((function(){}))}))}),(function(){return n("leaderboardFlag",!1)})),kD(C,(function(){if(s&&s.uid&&we){var e=new URLSearchParams(window.location.search);if(e.get("userid")===s.uid&&e.get("title")===we){var t,l={latitude:p,longitude:y,address:null!==g&&void 0!==g?g:null,countryCode:null!==m&&void 0!==m?m:null,type:Ew.getState().modelType,author:null!==(t=Ew.getState().modelAuthor)&&void 0!==t?t:s.displayName,userid:s.uid,title:we,label:Ew.getState().modelLabel,description:Ew.getState().modelDescription,timeCreated:Date.now()},i=Tw.getModelKey(l),r=$T.a.firestore().collection("models");if(r){var n=$T.a.storage().ref();if(a)Tw.resizeCanvas(a,200).toBlob((function(e){if(e){var t=n.child("images/"+i+".png").put(e,{contentType:"image/png"});t.on($T.a.storage.TaskEvent.STATE_CHANGED,(function(e){var t=e.bytesTransferred/e.totalBytes*100;t>0&&Kh(me.t("word.Upload",ze)+": "+t+"%")}),(function(e){Qh("Storage: "+e)}),(function(){t.snapshot.ref.getDownloadURL().then((function(e){var t,a=Object(d.a)(Object(d.a)({},l),{},{thumbnailUrl:e}),n=r.doc(Tw.getLatLngKey(p,y));n.get().then((function(e){if(e.exists){var t=e.data();t&&t[i]?n.set(Object(Qz.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.UpdatedOnModelsMap",ze)+".")})):n.set(Object(Qz.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.PublishedOnModelsMap",ze)+".")}))}else n.set(Object(Qz.a)({},i,a),{merge:!0}).then((function(){Bh(me.t("menu.file.PublishedOnModelsMap",ze)+".")}))})).catch((function(e){Qh(me.t("message.CannotPublishModelOnMap",ze)+": "+e)})),$T.a.firestore().collection("board").doc("people").update(Object(Qz.a)({},(null!==(t=a.author)&&void 0!==t?t:"Anonymous")+"."+Tw.getModelKey(a),a)).then((function(){o((function(e){if(e.peopleModels){var t,l=e.peopleModels.get(null!==(t=a.author)&&void 0!==t?t:"Anonymous");l&&l.set(Tw.getModelKey(a),a)}}))})),$T.a.firestore().collection("board").doc("info").set({latestModel:a},{merge:!0}).then((function(){}))}))}))}}))}$T.a.firestore().collection("users").doc(s.uid).update(Ew.getState().modelAuthor===s.displayName?{published:$T.a.firestore.FieldValue.arrayUnion(we)}:{published:$T.a.firestore.FieldValue.arrayUnion(we),aliases:$T.a.firestore.FieldValue.arrayUnion(Ew.getState().modelAuthor)}).then((function(){o((function(e){e.user&&(e.user.published||(e.user.published=[]),e.user.published.includes(we)||e.user.published.push(we),e.user.aliases||(e.user.aliases=[]),e.modelAuthor&&!e.user.aliases.includes(e.modelAuthor)&&e.modelAuthor!==s.displayName&&e.user.aliases.push(e.modelAuthor))}))}))}}}),(function(){return n("publishOnModelsMapFlag",!1)})),kD(J,(function(){if(!s||!s.uid)return;var e=Tf.getState().projectTitle;if(!e)return void Qh(me.t("message.CannotCreateNewProjectWithoutTitle",ze)+".");var t=e.trim();if(0===t.length)return void Qh(me.t("message.CannotCreateNewProjectWithoutTitle",ze)+".");Ee(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(f.a)(Se.current);try{for(i.s();!(a=i.n()).done;){if(a.value.title===t){l=!0;break}}}catch(h){i.e(h)}finally{i.f()}}if(l)Kh(me.t("message.TitleUsedChooseDifferentOne",ze)+": "+t);else if(s&&s.uid){var r,n,c=null!==(r=Tf.getState().projectType)&&void 0!==r?r:M.SOLAR_PANEL_ARRAY,d=null!==(n=Tf.getState().projectDescription)&&void 0!==n?n:null,u=(new Date).getTime();$T.a.firestore().collection("users").doc(s.uid).collection("projects").doc(t).set({owner:s.uid,timestamp:u,type:c,description:d,counter:0,designs:[],hiddenParameters:kw.getDefaultHiddenParameters(c)}).then((function(){o((function(t){t.projectView=!0,t.projectInfo.owner=s.uid,t.projectInfo.type=c,t.projectInfo.title=e,t.projectInfo.description=d,t.projectInfo.counter=0,t.projectInfo.dataColoring=z.ALL,t.projectInfo.selectedProperty=null,t.projectInfo.sortDescending=!1,t.projectInfo.xAxisNameScatteredPlot=null,t.projectInfo.yAxisNameScatteredPlot=null,t.projectInfo.dotSizeScatteredPlot=5,t.projectInfo.thumbnailWidth=200,t.projectInfo.designs=[],t.projectInfo.ranges=[],t.projectInfo.hiddenParameters=kw.getDefaultHiddenParameters(t.projectInfo.type)}))})).catch((function(e){Qh(me.t("message.CannotCreateNewProject",ze)+": "+e)})).finally((function(){b&&Ee(!1).then((function(){le(!te)})),_(!1)}))}}))}),(function(){return n("createProjectFlag",!1)})),kD(G,(function(){if(!s||!s.uid)return;var e=Tf.getState().projectTitle;if(!e)return void Qh(me.t("message.CannotCreateNewProjectWithoutTitle",ze)+".");var t=e.trim();if(0===t.length)return void Qh(me.t("message.CannotCreateNewProjectWithoutTitle",ze)+".");Ee(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(f.a)(Se.current);try{for(i.s();!(a=i.n()).done;){if(a.value.title===t){l=!0;break}}}catch(J){i.e(J)}finally{i.f()}}if(l)Kh(me.t("message.TitleUsedChooseDifferentOne",ze)+": "+t);else if(s&&s.uid){var r=Ew.getState().projectInfo.designs;if(r){var n,c,d,h,p,y,g,m,w=Tf.getState().projectType,x=Tf.getState().projectDescription,v=Ew.getState().projectInfo.owner,A=(new Date).getTime(),T=Ew.getState().projectInfo.counter,P=null!==(n=Ew.getState().projectInfo.dataColoring)&&void 0!==n?n:null,S=null!==(c=Ew.getState().projectInfo.selectedProperty)&&void 0!==c?c:null,j=!!Ew.getState().projectInfo.sortDescending,H=null!==(d=Ew.getState().projectInfo.xAxisNameScatteredPlot)&&void 0!==d?d:"rowWidth",z=null!==(h=Ew.getState().projectInfo.yAxisNameScatteredPlot)&&void 0!==h?h:"rowWidth",R=null!==(p=Ew.getState().projectInfo.dotSizeScatteredPlot)&&void 0!==p?p:5,D=null!==(y=Ew.getState().projectInfo.thumbnailWidth)&&void 0!==y?y:200,M=null!==(g=oP(t,r))&&void 0!==g?g:[],W=Object(f.a)(r.entries());try{for(W.s();!(m=W.n()).done;){var I=Object(u.a)(m.value,2),C=I[0],O=I[1];nP(O.title,M[C].title,v,s.uid)}}catch(J){W.e(J)}finally{W.f()}var F=Ew.getState().projectImages;if(F&&F.size>0){var k,Y,L=Object(f.a)(r.entries());try{for(L.s();!(Y=L.n()).done;){var E=Object(u.a)(Y.value,2),U=E[0],N=E[1],V=F.get(N.title);V&&(M[U].thumbnail=rP(V))}}catch(J){L.e(J)}finally{L.f()}$T.a.firestore().collection("users").doc(s.uid).collection("projects").doc(t).set({owner:s.uid,timestamp:A,type:w,description:x,counter:T,dataColoring:P,selectedProperty:S,sortDescending:j,xAxisNameScatteredPlot:H,yAxisNameScatteredPlot:z,dotSizeScatteredPlot:R,thumbnailWidth:D,designs:M,ranges:null!==(k=Ew.getState().projectInfo.ranges)&&void 0!==k?k:null,hiddenParameters:Ew.getState().projectInfo.hiddenParameters}).then((function(){o((function(t){t.projectView=!0,t.projectInfo.owner=s.uid,t.projectInfo.type=w,t.projectInfo.title=e,t.projectInfo.description=x,t.projectInfo.designs=M}))})).catch((function(e){Qh(me.t("message.CannotCreateNewProject",ze)+": "+e)})).finally((function(){b&&Ee(!1).then((function(){le(!te)})),_(!1)}))}}}}))}),(function(){return n("saveProjectFlag",!1)})),kD(B,(function(){Ue(!0)}),(function(){return n("showProjectsFlag",!1)})),kD(K,(function(){Ue(!1),le(!te)}),(function(){return n("updateProjectsFlag",!1)})),kD(O,(function(){if(!s.uid)return;Qe().then((function(){Tf.setState((function(e){e.showCloudFilePanel=!0}))}))}),(function(){return n("listCloudFilesFlag",!1)})),kD(X,(function(){var e=Ew.getState().projectInfo.owner;if(s.uid!==e)Kh(me.t("message.CannotAddDesignToProjectOwnedByOthers",ze));else{var t=Ew.getState().projectInfo.title;if(t){var l,i,r;_(!0);var n=null!==(l=Ew.getState().projectInfo.type)&&void 0!==l?l:M.SOLAR_PANEL_ARRAY,c=null!==(i=Ew.getState().projectInfo.thumbnailWidth)&&void 0!==i?i:200,d=null!==(r=Ew.getState().projectInfo.counter)&&void 0!==r?r:0;!function(e,t,l,i){if(!s.uid||!a)return;var r=Tw.resizeCanvas(a,i).toDataURL(),n=aP(e,l,r);$T.a.firestore().collection("users").doc(s.uid).collection("projects").doc(t).update({designs:$T.a.firestore.FieldValue.arrayUnion(n),counter:$T.a.firestore.FieldValue.increment(1)}).then((function(){o((function(e){var t;null===(t=e.projectInfo.designs)||void 0===t||t.push(n),e.projectInfo.counter++,e.designProjectType=e.projectInfo.type,e.cloudFile=n.title})),Xe(l,!0,!0)})).catch((function(e){Qh(me.t("message.CannotAddDesignToProject",ze)+": "+e)})).finally((function(){_(!1)}))}(n,t,t+" "+d,c)}}}),(function(){return n("curateDesignToProjectFlag",!1)})),Object(r.useEffect)((function(){Te(F)}),[k]),Object(r.useEffect)((function(){xe(null!==R&&void 0!==R?R:"My Aladdin File")}),[R]),Object(r.useEffect)((function(){He.current?He.current=!1:We(s)}),[s.signFile,s.schoolID,s.classID]);var De=function(){var e=new URLSearchParams(window.location.search),t=e.get("userid");if(t){var l=e.get("title"),a=e.get("project");a?(_(!0),eP(t,a,Ne).finally((function(){_(!1)})),l&&Ve(t,l)):l&&qe(t,l)}else o((function(e){e.cloudFile=void 0}))},Me=function(){var e=Object(Eh.a)(Lh.a.mark((function e(t){var l,a,i,r,n,c,s,d,u,h,p;return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return l=$T.a.firestore(),a=!1,i=!1,r=0,n=j.UNKNOWN,c=H.UNKNOWN,s=[],d=[],u=[],e.next=11,l.collection("users").get().then((function(e){r=e.size;var l,o=Object(f.a)(e.docs);try{for(o.s();!(l=o.n()).done;){var h=l.value;if(h.id===t.uid){var p=h.data();return a=!!p.signFile,i=!!p.noLogging,n=p.schoolID?p.schoolID:j.UNKNOWN,c=p.classID?p.classID:H.UNKNOWN,p.likes&&(s=p.likes),p.published&&(d=p.published),p.aliases&&(u=p.aliases),!0}}}catch(y){o.e(y)}finally{o.f()}return!1}));case 11:e.sent?(o((function(e){e.user.signFile=a,e.user.noLogging=i,e.user.schoolID=n,e.user.classID=c,e.user.likes=s,e.user.published=d,e.user.aliases=u})),Tf.setState((function(e){e.userCount=r})),t.signFile=a,t.noLogging=i,t.schoolID=n,t.classID=c,t.likes=s,t.published=d,t.aliases=u):t.uid&&l.collection("users").doc(t.uid).set({uid:t.uid,signFile:!!t.signFile,noLogging:!!t.noLogging,schoolID:null!==(h=t.schoolID)&&void 0!==h?h:j.UNKNOWN,classID:null!==(p=t.classID)&&void 0!==p?p:H.UNKNOWN,since:x()(new Date).format("MM/DD/YYYY hh:mm A"),os:Tw.getOS()}).then((function(){Kh(me.t("message.YourAccountWasCreated",ze))})).catch((function(e){Qh(me.t("message.CannotCreateAccount",ze)+": "+e)}));case 13:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),We=function(e){var t,l;e.uid&&$T.a.firestore().collection("users").doc(e.uid).update({signFile:!!e.signFile,schoolID:null!==(t=e.schoolID)&&void 0!==t?t:j.UNKNOWN,classID:null!==(l=e.classID)&&void 0!==l?l:H.UNKNOWN}).then((function(){Kh(me.t("message.YourAccountSettingsWereSaved",ze))})).catch((function(e){Qh(me.t("message.CannotSaveYourAccountSettings",ze)+": "+e)}))},Ie=function(){var e=Object(Eh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return _(!0),e.next=3,$T.a.firestore().collection("models").get().then((function(e){var t=new Map;return e.forEach((function(e){var l=e.data();if(l){var a=new Map;for(var o in l){var i;if(!l[o].countryCode)(null===(i=l[o].address)||void 0===i?void 0:i.endsWith("USA"))&&(l[o].countryCode="US");a.set(o,l[o])}t.set(e.id,a)}})),o((function(e){e.modelSites=t})),t})).catch((function(e){Qh(me.t("message.CannotLoadModelsOnMap",ze)+": "+e)})).finally((function(){_(!1)}));case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),Ce=function(){var e=Object(Eh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,$T.a.firestore().collection("board").doc("info").get().then((function(e){if(e.exists){var t=e.data();t&&t.latestModel&&o((function(e){var l,a=!1,o=t.latestModel;o.author&&(a=!!(null===(l=e.peopleModels.get(o.author))||void 0===l?void 0:l.get(Tw.getModelKey(o))));e.latestModelSite=a?o:void 0}))}})).catch((function(e){console.log(e)}));case 2:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),Oe=function(){var e=Object(Eh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return _(!0),e.next=3,$T.a.firestore().collection("board").doc("people").get().then((function(e){var t=e.data();if(t){var l=new Map;for(var a in t)l.set(a,new Map(Object.entries(t[a])));o((function(e){e.peopleModels=l}))}})).catch((function(e){Qh(me.t("message.CannotLoadLeaderboard",ze)+": "+e)})).finally((function(){_(!1)}));case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),Fe=function(e,t){var l;s&&s.uid&&($T.a.firestore().collection("models").doc(Tw.getLatLngKey(e.latitude,e.longitude)).update(Object(Qz.a)({},Tw.getModelKey(e),$T.a.firestore.FieldValue.delete())).then((function(){Bh(me.t("message.ModelDeletedFromMap",ze)),t&&t()})).catch((function(e){Qh(me.t("message.CannotDeleteModelFromMap",ze)+": "+e)})),$T.a.firestore().collection("board").doc("people").update(Object(Qz.a)({},(null!==(l=e.author)&&void 0!==l?l:"Anonymous")+"."+Tw.getModelKey(e),$T.a.firestore.FieldValue.delete())).then((function(){o((function(t){t.peopleModels&&(t.peopleModels.delete(Tw.getModelKey(e)),Tf.setState((function(e){e.leaderboardFlag=!0})))}))})),$T.a.firestore().collection("users").doc(s.uid).update({published:$T.a.firestore.FieldValue.arrayRemove(e.title)}).then((function(){o((function(t){if(t.user&&t.user.published&&t.user.published.includes(e.title)){var l=t.user.published.indexOf(e.title);l>=0&&t.user.published.splice(l,1)}}))})))},ke=function(e,t,l){if(s&&s.uid){var a=Tw.getModelKey(e);$T.a.firestore().collection("users").doc(s.uid).update(t?{likes:$T.a.firestore.FieldValue.arrayUnion(a)}:{likes:$T.a.firestore.FieldValue.arrayRemove(a)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotLikeModelFromMap",ze)+": "+e)}));var o=a+".likeCount";$T.a.firestore().collection("models").doc(Tw.getLatLngKey(e.latitude,e.longitude)).update(t?Object(Qz.a)({},o,$T.a.firestore.FieldValue.increment(1)):Object(Qz.a)({},o,$T.a.firestore.FieldValue.increment(-1))).then((function(){l&&l()})).catch((function(e){Qh(me.t("message.CannotLikeModelFromMap",ze)+": "+e)}))}},Ye=function(e,t,l){s&&s.uid&&$T.a.firestore().collection("models").doc(Tw.getLatLngKey(e.latitude,e.longitude)).update(Object(Qz.a)({},Tw.getModelKey(e)+".pinned",t)).then((function(){l&&l()})).catch((function(e){}))},Le=function(e){s&&s.uid&&$T.a.firestore().collection("models").doc(Tw.getLatLngKey(e.latitude,e.longitude)).update(Object(Qz.a)({},Tw.getModelKey(e)+".clickCount",$T.a.firestore.FieldValue.increment(1))).then((function(){})).catch((function(e){}))},Ee=function(){var e=Object(Eh.a)(Lh.a.mark((function e(t){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s.uid){e.next=2;break}return e.abrupt("return");case 2:return t||_(!0),e.next=5,$T.a.firestore().collection("users").doc(s.uid).collection("projects").get().then((function(e){var t=[];return e.forEach((function(e){var l,a,o,i,r=e.data();t.push({owner:s.uid,title:e.id,timestamp:r.timestamp,description:r.description,dataColoring:r.dataColoring,selectedProperty:r.selectedProperty,sortDescending:r.sortDescending,xAxisNameScatteredPlot:r.xAxisNameScatteredPlot,yAxisNameScatteredPlot:r.yAxisNameScatteredPlot,dotSizeScatteredPlot:r.dotSizeScatteredPlot,thumbnailWidth:r.thumbnailWidth,type:r.type,designs:null!==(l=r.designs)&&void 0!==l?l:[],ranges:null!==(a=r.ranges)&&void 0!==a?a:[],hiddenParameters:null!==(o=r.hiddenParameters)&&void 0!==o?o:kw.getDefaultHiddenParameters(r.type),counter:null!==(i=r.counter)&&void 0!==i?i:0})})),t})).catch((function(e){Qh(me.t("message.CannotOpenYourProjects",ze)+": "+e)})).finally((function(){t||_(!1)}));case 5:Se.current=e.sent;case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),Ue=function(e){s.uid&&Ee(!e).then((function(){e&&Tf.setState((function(e){e.showProjectListPanel=!0})),pe(!he)}))},Ne=function(e){o((function(t){t.projectInfo=Object(d.a)({},e),t.projectImages.clear(),t.projectView=!0})),Tf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag,e.updateProjectsFlag=!0}))},Ve=function(e,t){e&&t&&(_(!0),cP(e,t,!0,!0,l).finally((function(){_(!1)})))},Je=function(e,t,l){if(s.uid){var a=e.trim();0!==a.length?(_(!0),l?Qe().then((function(){var e=!1;if(Pe.current){var l,i=Object(f.a)(Pe.current);try{for(i.s();!(l=i.n()).done;){if(l.value.fileName===a){e=!0;break}}}catch(r){i.e(r)}finally{i.f()}}e?Zv.a.confirm({title:me.t("message.CloudFileWithTitleExistsDoYouWantToOverwrite",ze),icon:Object(gf.jsx)(eR.a,{}),onOk:function(){Xe(a,t)},onCancel:function(){o((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0}))},okText:me.t("word.Yes",ze),cancelText:me.t("word.No",ze)}):Xe(a,t)})):Xe(a,t),Te(!1)):Qh(me.t("menu.file.SavingAbortedMustHaveValidTitle",ze)+".")}},Xe=function(e,t,l){if(s.uid)try{var a=$T.a.firestore().collection("users").doc(s.uid);a&&(U&&Tf.setState((function(e){e.waiting=!0})),a.collection(l?"designs":"files").doc(e).set(w()).then((function(){if(t||(o((function(t){t.cloudFile=e})),Tf.getState().setChanged(!1)),U)"CREATE_NEW_FILE"===U?L():Y(U);else if(!l){var a=Ge+"?client=web&userid="+s.uid+"&title="+encodeURIComponent(e);window.history.pushState({},document.title,a)}v&&Qe().then((function(){le(!te)}))})).catch((function(e){Qh(me.t("message.CannotSaveYourFileToCloud",ze)+": "+e)})).finally((function(){_(!1)})))}catch(i){Qh(me.t("message.CannotSaveYourFileToCloud",ze)+": "+i),_(!1)}},Be=function(e,t){E?Zv.a.confirm({title:me.t("message.DoYouWantToSaveChanges",ze),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){R?(Je(R,!0,!1),qe(e,t)):o((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0}))},onCancel:function(){qe(e,t)},okText:me.t("word.Yes",ze),cancelText:me.t("word.No",ze)}):qe(e,t)},Ke=function(e){E?Zv.a.confirm({title:me.t("message.DoYouWantToSaveChanges",ze),icon:Object(gf.jsx)(sb.a,{}),onOk:function(){R?(Je(R,!0,!1),qe(e.userid,e.title),Le(e)):o((function(e){e.showCloudFileTitleDialogFlag=!e.showCloudFileTitleDialogFlag,e.showCloudFileTitleDialog=!0}))},onCancel:function(){qe(e.userid,e.title),Le(e)},okText:me.t("word.Yes",ze),cancelText:me.t("word.No",ze)}):(qe(e.userid,e.title),Le(e))},qe=function(e,t,a){e&&t&&(_(!0),cP(e,t,!1,a,l).finally((function(){_(!1)})))},Qe=function(){var e=Object(Eh.a)(Lh.a.mark((function e(){return Lh.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s.uid){e.next=2;break}return e.abrupt("return");case 2:return _(!0),e.next=5,$T.a.firestore().collection("users").doc(s.uid).collection("files").get().then((function(e){var t=[];return e.forEach((function(e){var l=e.data();t.push({timestamp:l.timestamp,fileName:e.id,userid:s.uid,uuid:l.docid})})),t})).catch((function(e){Qh(me.t("message.CannotOpenCloudFolder",ze)+": "+e)})).finally((function(){_(!1)}));case 5:Pe.current=e.sent;case 6:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return l?Object(gf.jsx)(gf.Fragment,{children:P&&Object(gf.jsx)($R,{openCloudFile:Ke,deleteModelFromMap:Fe,likeModelFromMap:ke,pinModelFromMap:Ye})}):Object(gf.jsxs)(gf.Fragment,{children:[Z&&Object(gf.jsx)(Hv,{}),Object(gf.jsx)(RD,{saveToCloud:Je,isLoading:function(){return Z},setTitle:xe,getTitle:function(){return we},setTitleDialogVisible:Te,isTitleDialogVisible:function(){return Ae}}),Object(gf.jsx)(HD,{signIn:function(){var e=new $T.a.auth.GoogleAuthProvider;$T.a.auth().signInWithPopup(e).then((function(e){o((function(t){e.user&&(t.user.uid=e.user.uid,t.user.email=e.user.email,t.user.displayName=e.user.displayName,t.user.photoURL=e.user.photoURL,Me(Object(d.a)({},t.user)).then((function(){})))}))})).catch((function(e){"auth/popup-closed-by-user"!==e.code&&"auth/cancelled-popup-request"!==e.code&&Qh(me.t("message.CannotSignIn",ze)+": "+e)})),o((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1}))},signOut:function(){$T.a.auth().signOut().then((function(){o((function(e){e.user.uid=null,e.user.email=null,e.user.displayName=null,e.user.photoURL=null,e.user.signFile=!1,e.user.likes=[],e.user.published=[],e.user.aliases=[],e.cloudFile=void 0})),Tf.setState((function(e){e.showCloudFilePanel=!1,e.showAccountSettingsPanel=!1,e.showModelsGallery=!1,e.showProjectListPanel=!1}))})).catch((function(e){Qh(me.t("message.CannotSignOut",ze)+": "+e)}))}}),v&&Pe.current&&Object(gf.jsx)(cR,{cloudFileArray:ie,openCloudFile:Be,deleteCloudFile:function(e,t){$T.a.firestore().collection("users").doc(e).collection("files").doc(t).delete().then((function(){re(ie.filter((function(l){return l.userid!==e||l.title!==t}))),o((function(e){t===e.cloudFile&&(e.cloudFile=void 0)}))})).catch((function(e){Qh(me.t("message.CannotDeleteCloudFile",ze)+": "+e)}))},renameCloudFile:function(e,t,l){var a=$T.a.firestore().collection("users").doc(e).collection("files");a.doc(t).get().then((function(i){if(i&&i.exists){var r=i.data();r&&a.doc(l).set(r).then((function(){a.doc(t).delete().then((function(){}));var i,r=Object(f.a)(ie);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(n.userid===e&&n.title===t){n.title=l;break}}}catch(u){r.e(u)}finally{r.f()}re(Object(h.a)(ie)),o((function(e){e.cloudFile===t&&(e.cloudFile=l)}));var c=new URLSearchParams(window.location.search);if(c.get("title")===t&&c.get("userid")===s.uid){var d=Ge+"?client=web&userid="+s.uid+"&title="+encodeURIComponent(l);window.history.pushState({},document.title,d)}}))}})).catch((function(e){Qh(me.t("message.CannotRenameCloudFile",ze)+": "+e)}))}}),b&&Se.current&&Object(gf.jsx)(FD,{projects:se,setProjectState:Ne,deleteProject:function(e){s.uid&&$T.a.firestore().collection("users").doc(s.uid).collection("projects").doc(e).delete().then((function(){if(Se.current&&s.uid){var t,l=Object(f.a)(Se.current);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.title===e&&a.designs){var i,r=Object(f.a)(a.designs);try{var n=function(){var e=i.value;o((function(t){e.title===t.cloudFile&&(t.cloudFile=void 0)})),$T.a.firestore().collection("users").doc(s.uid).collection("designs").doc(e.title).delete().then((function(){})).catch((function(e){Qh(me.t("message.CannotDeleteCloudFile",ze)+": "+e)}))};for(r.s();!(i=r.n()).done;)n()}catch(c){r.e(c)}finally{r.f()}break}}}catch(c){l.e(c)}finally{l.f()}Se.current=Se.current.filter((function(t){return t.title!==e})),le(!te)}o((function(t){e===t.projectInfo.title&&(t.projectInfo.title=null,t.projectInfo.description=null,t.projectInfo.dataColoring=z.ALL,t.projectInfo.selectedProperty=null,t.projectInfo.sortDescending=!1,t.projectInfo.xAxisNameScatteredPlot=null,t.projectInfo.yAxisNameScatteredPlot=null,t.projectInfo.dotSizeScatteredPlot=5,t.projectInfo.thumbnailWidth=200,t.projectInfo.counter=0,t.projectInfo.designs=[],t.projectInfo.ranges=[],t.projectInfo.hiddenParameters=kw.getDefaultHiddenParameters(t.projectInfo.type),t.designProjectType=null,t.projectView=!1)}))})).catch((function(e){Qh(me.t("message.CannotDeleteProject",ze)+": "+e)}))},renameProject:function(e,t){Ee(!1).then((function(){var l=!1;if(Se.current){var a,i=Object(f.a)(Se.current);try{for(i.s();!(a=i.n()).done;){if(a.value.title===t){l=!0;break}}}catch(n){i.e(n)}finally{i.f()}}if(l)Kh(me.t("message.TitleUsedChooseDifferentOne",ze)+": "+t);else{if(!s.uid)return;var r=$T.a.firestore().collection("users").doc(s.uid).collection("projects");r.doc(e).get().then((function(l){if(l&&l.exists){var a=l.data();if(a&&s.uid){var i=Object(d.a)({},a);if(a.designs&&a.designs.length>0){var c,h,p=null!==(c=oP(t,a.designs))&&void 0!==c?c:[],y=Object(f.a)(a.designs.entries());try{for(y.s();!(h=y.n()).done;){var g=Object(u.a)(h.value,2),m=g[0],w=g[1];nP(w.title,p[m].title,a.owner,s.uid)}}catch(n){y.e(n)}finally{y.f()}i.designs=p,o((function(e){e.projectInfo.designs=p}))}r.doc(t).set(i).then((function(){if(r.doc(e).delete().then((function(){})),Se.current){var l,a=[],i=Object(f.a)(Se.current);try{for(i.s();!(l=i.n()).done;){var c,s=l.value;if(s.title===e)a.push({owner:s.owner,timestamp:s.timestamp,title:t,description:s.description,type:s.type,designs:s.designs,ranges:null!==(c=s.ranges)&&void 0!==c?c:null,hiddenParameters:s.hiddenParameters,counter:s.counter});else a.push(s)}}catch(n){i.e(n)}finally{i.f()}Se.current=a,le(!te)}o((function(l){l.projectInfo.title===e&&(l.projectInfo.title=t)}))}))}}})).catch((function(e){Qh(me.t("message.CannotRenameProject",ze)+": "+e)}))}}))}}),A&&Object(gf.jsx)(qR,{author:void 0,models:je.current,openCloudFile:Be,closeCallback:function(){n("showModelsGallery",!1),je.current=void 0}}),T&&Object(gf.jsx)(jR,{openCloudFile:qe}),P&&Object(gf.jsx)($R,{openCloudFile:Ke,deleteModelFromMap:Fe,likeModelFromMap:ke,pinModelFromMap:Ye})]})},LD=n.a.memo(YD),ED=(l(730),function(){var e,t,l=Ew(Xi),a=Ew(Bi),o=Ew(di),i=Ew(ar),n=Object(r.useRef)(!0),c=Object(r.useRef)(!0),s=Object(r.useRef)(),d=null!==(e=o.schoolID)&&void 0!==e?e:j.UNKNOWN,u=null!==(t=o.classID)&&void 0!==t?t:H.UNKNOWN;return Object(r.useEffect)((function(){var e,t=void 0,l=Object(f.a)($T.a.apps);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.name===S.LOG_DATA){t=a;break}}}catch(o){l.e(o)}finally{l.f()}t||(t=$T.a.initializeApp({apiKey:"AIzaSyD-236qE4ix9TkH2AW_wjKSz8jgK0ukjW0",authDomain:"aladdin-316017.firebaseapp.com",projectId:"aladdin-316017",storageBucket:"aladdin-316017.appspot.com",databaseURL:"https://aladdin-2023.firebaseio.com",messagingSenderId:"169516488625",appId:"1:169516488625:web:bb0ae3c3f7c6e813250f90"},S.LOG_DATA)),t&&(s.current=$T.a.database(t))}),[]),Object(r.useEffect)((function(){if(n.current)n.current=!1;else if(a){var e=a.timestamp+" ("+x()(new Date(a.timestamp)).format("MM-DD-YYYY hh:mm A")+")";s.current.ref(d+"/"+u+"/"+o.uid+"/"+e).set({file:null!==i&&void 0!==i?i:"Untitled",action:JSON.stringify(a)})}}),[a,o.uid,u,d,i]),Object(r.useEffect)((function(){if(c.current)c.current=!1;else if(l){var e=l.timestamp+" ("+x()(new Date(l.timestamp)).format("MM-DD-YYYY hh:mm A")+")";s.current.ref(d+"/"+u+"/"+o.uid+"/"+e).set({file:null!==i&&void 0!==i?i:"Untitled",action:JSON.stringify(l)})}}),[l,o.uid,u,d,i]),Object(gf.jsx)(gf.Fragment,{})}),UD=n.a.memo(ED),ND=function(){var e=Ew(o.directLightIntensity),t=Ew(o.ambientLightIntensity),l=Ew(Es),a=Ew(Kr),i=2*a,n=a+100,c=Object(r.useRef)();c.current&&(c.current.shadow.camera.left=-n,c.current.shadow.camera.bottom=-n,c.current.shadow.camera.right=n,c.current.shadow.camera.top=n,c.current.shadow.camera.updateProjectionMatrix());var s=l.z>0,d=s?l.normalize().dot(Rt):0;return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("ambientLight",{intensity:.1+(s?(null!==t&&void 0!==t?t:.1)*d:0),name:"Ambient Light"}),Object(gf.jsx)("directionalLight",{ref:c,name:"Directional Light",color:"white",position:l.normalize().multiplyScalar(i),intensity:s?(null!==e&&void 0!==e?e:1)*d:0,castShadow:!0,"shadow-mapSize-height":16384,"shadow-mapSize-width":16384,"shadow-camera-near":1,"shadow-camera-far":ct})]})},VD=n.a.memo(ND),JD=function(e){var t=e.element,l=Ew(qr),a=Ew(Ru),o=Ew(Hu),i=Ew(Du),n=t.type===V.Roof,c="lightGray",s=Object(Se.e)(Me.FontLoader,ty),d={font:s,height:0,size:.2},u={font:s,height:0,size:.35},f=Object(r.useMemo)((function(){return i(t,null!==a&&void 0!==a?a:o)}),[a,o]),h=Object(r.useMemo)((function(){var e=-Math.atan2(l.x,l.y)+Math.PI;return new Me.Euler(vt,0,e,"ZXY")}),[l.x,l.y]);if(!a&&!o)return null;var p=function(){var e=t.lz;return n&&(e=Ew.getState().selectedElementHeight),Math.ceil(e)+1}(),y=function(){var e=t.lz;return n&&(e=t.rise),e.toFixed(1)+" m"}(),g=n?Ew.getState().selectedElementHeight+1:t.lz-.175,m=new Array(p+1).fill(0);return Object(gf.jsxs)("group",{position:f,rotation:h,name:"Vertical Ruler",children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[0,0,0],[0,p,0]],color:c}),Object(gf.jsxs)("mesh",{position:[-1.5,g,0],userData:{unintersectable:!0},children:[Object(gf.jsx)("textGeometry",{args:[y,u]}),Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:"white"})]}),m.map((function(e,t){var l=.2+(t%5===0?.05:0),a=Object(gf.jsx)("textGeometry",{args:["".concat(t),d]});return Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Jl.a,{userData:{unintersectable:!0},points:[[-l,t,0],[l,t,0]],lineWidth:.5,color:c}),!n&&Object(gf.jsxs)("mesh",{position:[.4,t-.125,0],userData:{unintersectable:!0},children:[a,Object(gf.jsx)("meshBasicMaterial",{attach:"material",color:c})]})]},t)}))]})},GD=function(){var e=Ew(zu),t=Ew(Mu),l=Ew(Ru),a=Ew(Hu),i=Ew(o.groundImage),n=Ew(Kr),c=Ew(Fu),s=Ew(Cu),d=Ew((function(e){if(e.selectedElement){var t=e.selectedElement.id;return e.elements.find((function(e){return e.id===t}))}})),f=Object(r.useState)(!1),h=Object(u.a)(f,2),p=h[0],y=h[1],g=Object(r.useState)(2*n),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useState)(2*n),b=Object(u.a)(v,2),A=b[0],T=b[1];Object(r.useEffect)((function(){var e=Math.floor(n/50)+1,t=2*Math.round(n/e);x(t*e),T(t)}),[n]),Object(r.useEffect)((function(){if(l){var e=Tw.isTopResizeHandle(l)||l===K.UpperLeft&&(null===d||void 0===d?void 0:d.type)===V.Wall||l===K.UpperRight&&(null===d||void 0===d?void 0:d.type)===V.Wall;y(!e)}else y(!1)}),[l]);var P=function(){if(!d)return!1;var e=d.type;return e===V.Foundation||e===V.Cuboid||e===V.Tree&&d.parentId===V.Ground||e===V.Human&&d.parentId===V.Ground},S=a===q.Lower||a===q.Upper,j=function(e){return Tw.isTopResizeHandle(e)||(null===d||void 0===d?void 0:d.type)===V.Wall&&Tw.isTopResizeHandleOfWall(e)||(null===d||void 0===d?void 0:d.type)===V.Roof&&Tw.isRiseHandleOfRoof(e)}(null!==l&&void 0!==l?l:a);return d?Object(gf.jsxs)(gf.Fragment,{children:[((p||e||Tw.isMoveHandle(a))&&!i&&P()||c||s)&&Object(gf.jsx)("gridHelper",{rotation:[vt,0,0],name:"Grid",args:[w,A,"gray","#444444"]}),(t||S)&&d&&P()&&Object(gf.jsx)(ly,{element:d}),j&&Object(gf.jsx)(JD,{element:d})]}):null},XD="black",BD="white",KD=function(e){var t=e.visible,l=void 0===t||t,a=Object(r.useRef)(null),o=$f(),i=120*window.devicePixelRatio,n=i/150,c=20*n+"px serif";return Object(r.useEffect)((function(){a.current&&Et.setState((function(e){e.compassRef=a}))}),[]),Object(r.useEffect)((function(){if(a.current){var e=a.current.getContext("2d");if(e){var t=55*n,l=10*n,r=40*n,s=5*n,d=30*n,u=1*n,f=1*n,h=15*n,p=i/2;e.clearRect(0,0,i,i),e.beginPath(),e.arc(p,p,r,0,2*Math.PI),e.lineWidth=s,e.strokeStyle=XD,e.stroke(),e.beginPath(),e.arc(p,p,d,0,2*Math.PI),e.lineWidth=u,e.strokeStyle=XD,e.stroke(),e.lineWidth=f,e.beginPath(),e.moveTo(p,p-t),e.lineTo(p-l,p-l),e.lineTo(p,p),e.fillStyle=BD,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p-t),e.lineTo(p+l,p-l),e.lineTo(p,p),e.fillStyle=XD,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p+t),e.lineTo(p-l,p+l),e.lineTo(p,p),e.fillStyle=XD,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p,p+t),e.lineTo(p+l,p+l),e.lineTo(p,p),e.fillStyle=BD,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p-t,p),e.lineTo(p-l,p-l),e.lineTo(p,p),e.fillStyle=XD,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p-t,p),e.lineTo(p-l,p+l),e.lineTo(p,p),e.fillStyle=BD,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p+t,p),e.lineTo(p+l,p-l),e.lineTo(p,p),e.fillStyle=BD,e.stroke(),e.fill(),e.beginPath(),e.moveTo(p+t,p),e.lineTo(p+l,p+l),e.lineTo(p,p),e.fillStyle=XD,e.stroke(),e.fill(),e.font=c,e.fillStyle=BD,e.textAlign="center",e.fillText("".concat(me.t("compass.N",o)),p,h),e.save(),e.translate(i,i),e.rotate(Math.PI),e.fillText("".concat(me.t("compass.S",o)),p,h),e.restore(),e.fillStyle=XD,e.save(),e.translate(0,i),e.rotate(-Math.PI/2),e.fillText("".concat(me.t("compass.W",o)),p,h),e.restore(),e.save(),e.translate(i,0),e.rotate(Math.PI/2),e.fillText("".concat(me.t("compass.E",o)),p,h),e.restore()}}}),[o]),l?Object(gf.jsx)("canvas",{ref:a,id:"compassCanvas",width:i,height:i,style:{position:"absolute",bottom:"0",right:"0",height:"".concat(120,"px"),width:"".concat(120,"px"),margin:"5px",pointerEvents:"none"}}):null},qD=n.a.memo(KD),QD=l(344),ZD=l.n(QD);!function(e){e.Move="Move",e.ResizeXY="Resize XY",e.ResizeZ="Resize Z",e.RotateUpper="Rotate Upper",e.RotateLower="Rotate Lower",e.Null="Null"}(bz||(bz={}));var _D,$D=new Me.Vector2,eM=function(e){var t=e.args,l=e.handleType,a=Object(u.a)(t,4),o=a[0],i=a[1],n=a[2],c=a[3],s=Object(r.useState)(ht),d=Object(u.a)(s,2),f=d[0],h=d[1];return Object(gf.jsx)(Lt.a,{name:l,args:[c,c,c],position:[o,i,n],onPointerOver:function(){return h(pt)},onPointerOut:function(){return h(ht)},children:Object(gf.jsx)("meshStandardMaterial",{color:f})})},tM=function(e){var t=e.args,l=e.handleType,a=Object(u.a)(t,4),o=a[0],i=a[1],n=a[2],c=a[3],s=Object(r.useState)(ht),d=Object(u.a)(s,2),f=d[0],h=d[1];return Object(gf.jsx)(Lt.h,{name:l,args:[c],position:[o,i,n],onPointerOver:function(){return h(pt)},onPointerOut:function(){return h(ht)},children:Object(gf.jsx)("meshStandardMaterial",{color:f})})},lM=function(e){var t=e.args,l=e.handleType,a=Object(u.a)(t,4),o=a[0],i=a[1],n=a[2],c=a[3],s=Object(r.useState)(ht),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(r.useMemo)((function(){return Object(gf.jsx)("meshStandardMaterial",{color:f})}),[f]);return Object(gf.jsxs)("group",{name:l,position:[o,i,n],rotation:[vt,0,0],onPointerOver:function(){return h(pt)},onPointerOut:function(){return h(ht)},scale:4*c,children:[Object(gf.jsxs)("group",{children:[Object(gf.jsx)(Lt.i,{args:[.15,.05,6,8,1.5*Math.PI],rotation:[vt,0,vt],children:p}),Object(gf.jsx)(Lt.c,{args:[.1,.1,6],rotation:[vt,0,0],position:[.15,0,.05],children:p}),Object(gf.jsx)(Lt.b,{args:[.05,6],rotation:[0,vt,0],position:[0,0,.15],children:p})]}),Object(gf.jsx)(Lt.f,{name:l,args:[.35,.35],position:[0,.05,0],rotation:[-vt,0,0],visible:!1})]})},aM=function(e){var t=e.groupedElementsIdSet,l=e.childCuboidSet,a=e.initalPosition,i=e.initalDimension,n=e.initalRotation,c=Object(u.a)(a,3),s=c[0],d=c[1],p=c[2],y=Object(u.a)(i,3),g=y[0],m=y[1],w=y[2],x=0===g?1:m/g,v=t.size>1||l.size>0,b=Object(r.useRef)(null),A=Object(r.useRef)(new Me.Vector3),T=Object(r.useRef)(new Me.Euler),P=Object(r.useRef)(new Me.Vector2),S=Object(r.useRef)(new Map),j=Object(r.useRef)(new Map),H=Object(r.useRef)(new Map),z=Object(r.useRef)(new Map),R=Object(r.useRef)(new Map),D=Object(r.useRef)(new Map),M=Object(r.useRef)(new Map),W=Object(r.useRef)(new Map),I=Object(r.useRef)(new Me.Vector3),C=Object(r.useRef)(!1),O=Object(r.useRef)(new Map),F=Object(r.useRef)(new Map),k=Object(r.useRef)(new Map),Y=Object(r.useRef)(new Map),L=Object(r.useRef)(new Map),E=Object(r.useState)(new Me.Vector3(s,d,p)),U=Object(u.a)(E,2),N=U[0],J=U[1],G=Object(r.useState)(n),X=Object(u.a)(G,2),Q=X[0],Z=X[1],_=Object(r.useState)(g/2),$=Object(u.a)(_,2),ee=$[0],te=$[1],le=Object(r.useState)(m/2),ae=Object(u.a)(le,2),oe=ae[0],ie=ae[1],re=Object(r.useState)(w),ne=Object(u.a)(re,2),ce=ne[0],se=ne[1],de=Object(r.useState)(!1),ue=Object(u.a)(de,2),fe=ue[0],he=ue[1],pe=Object(r.useState)(bz.Null),ye=Object(u.a)(pe,2),ge=ye[0],me=ye[1],we=Object(Se.f)().get,xe=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),ve=Object(r.useMemo)((function(){return new Me.Vector2}),[]),be=Ew(o.orthographic),Ae=Ew(Zr),Te=Ew(Qr),Pe=Ew(si),je=Ew(Sr);Object(r.useEffect)((function(){se(w)}),[w]),Object(r.useEffect)((function(){J(new Me.Vector3(s,d,p)),He(g,m),Z(n)}),[a,i,n]);var He=function(e,t){te(e/2),ie(t/2)},ze=function(e){he(!0),Et.getState().setEnableOrbitController(!1),C.current=!0,A.current.set(0,0,0),T.current.set(0,0,0),Ie(B.Default),e.stopPropagation()},Re=function(e,t,l){Pe((function(a){var o,i=Object(f.a)(a.elements);try{for(i.s();!(o=i.n()).done;){var r=o.value;if(Lw(r)&&e.has(r.id)){var n=e.get(r.id),c=Object(u.a)(n,4);r.cx=c[0],r.cy=c[1],r.lx=c[2],r.ly=c[3]}else if(e.has(r.parentId))switch(r.type){case V.Wall:var s=t.get(r.id);if(!s)continue;var d=r,p=s.slice(0,3),y=s.slice(3);d.cx=(p[0]+y[0])/2,d.cy=(p[1]+y[1])/2,d.lx=Math.hypot(p[0]-y[0]+(p[1]-y[1])),d.relativeAngle=Math.atan2(y[1]-p[1],y[0]-p[0]),d.leftPoint=Object(h.a)(p),d.rightPoint=Object(h.a)(y);break;case V.Window:var g=r;if(g.parentType!==V.Roof)continue;var m=l.get(r.id);if(!m)continue;var w=Object(u.a)(m,2);g.cx=w[0],g.cy=w[1]}}}catch(x){i.e(x)}finally{i.f()}a.groupActionUpdateFlag=!a.groupActionUpdateFlag,a.updateElementOnRoofFlag=!0}))},De=function(e,t){Pe((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(e.has(i.id)){var r=e.get(i.id);void 0!==r&&(i.type===V.Roof?i.rise=r:i.lz=r)}if(i.type===V.Wall&&t.has(i.id)){var n=i,c=t.get(n.id);c&&(n.leftTopPartialHeight=c.upperLeft,n.rightTopPartialHeight=c.upperRight,n.leftUnfilledHeight=c.lowerLeft,n.rightUnfilledHeight=c.lowerRight)}}}catch(s){o.e(s)}finally{o.f()}l.groupActionUpdateFlag=!l.groupActionUpdateFlag,l.updateElementOnRoofFlag=!0}))},We=function(e){Pe((function(t){var l,a=Object(f.a)(t.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(e.has(o.id)){var i=e.get(o.id);i&&(o.cx=i[0],o.cy=i[1],o.cz=i[2],o.rotation[2]=i[3])}}}catch(r){a.e(r)}finally{a.f()}t.groupActionUpdateFlag=!t.groupActionUpdateFlag}))},Ie=function(e){Pe((function(t){t.moveHandleType=e}))},Ce=function(e,a){var o=new Me.Vector2(N.x,N.y);P.current.set(e,a).rotateAround($D,Q).add(o),me(bz.ResizeXY),M.current.clear(),W.current.clear(),j.current.clear(),O.current.clear(),F.current.clear(),z.current.clear(),L.current.clear();var i,r=2*ee,n=2*oe,c=Object(f.a)(Ew.getState().elements);try{for(c.s();!(i=c.n()).done;){var s=i.value;if(Lw(s)&&(t.has(s.id)||l.has(s.id))){var d=Tw.getWorldDataById(s.id).pos;M.current.set(s.id,[(d.x-N.x)/r,(d.y-N.y)/n]),W.current.set(s.id,[s.lx/r,s.ly/n]),O.current.set(s.id,[s.cx,s.cy,s.lx,s.ly])}else if(s.foundationId&&t.has(s.foundationId)){var u=Ae(s.foundationId);if(!u)continue;switch(s.type){case V.Wall:var p=s,y=new Me.Vector2(p.leftPoint[0]/u.lx,p.leftPoint[1]/u.ly),g=new Me.Vector2(p.rightPoint[0]/u.lx,p.rightPoint[1]/u.ly);j.current.set(p.id,[y,g]),F.current.set(p.id,[].concat(Object(h.a)(p.leftPoint),Object(h.a)(p.rightPoint)));break;case V.Window:var m=s;if(m.parentType!==V.Roof)continue;z.current.set(m.id,[m.cx/u.lx,m.cy/u.ly]),L.current.set(m.id,[m.cx,m.cy])}}}}catch(w){c.e(w)}finally{c.f()}},Oe=function(e,a,o){var i=Te(),r=i.x,n=i.y;A.current.set(e,a,o),T.current.set(-vt,0,-Math.atan2(r,n)-Q,"ZXY"),me(bz.ResizeZ),S.current.clear(),k.current.clear(),H.current.clear(),Y.current.clear();var c,s=Object(f.a)(Ew.getState().elements);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(d.foundationId&&t.has(d.foundationId))if(d.type===V.Wall){S.current.set(d.id,d.lz/ce),k.current.set(d.id,d.lz);var u=d;u.fill===Ue.Partial&&(Y.current.set(u.id,{upperLeft:u.leftTopPartialHeight,upperRight:u.rightTopPartialHeight,lowerLeft:u.leftUnfilledHeight,lowerRight:u.rightUnfilledHeight}),H.current.set(u.id,{upperLeft:u.leftTopPartialHeight/ce,upperRight:u.rightTopPartialHeight/ce,lowerLeft:u.leftUnfilledHeight/ce,lowerRight:u.rightUnfilledHeight/ce}))}else d.type===V.Roof&&(S.current.set(d.id,d.rise/ce),k.current.set(d.id,d.rise));else(t.has(d.id)||l.has(d.id))&&(S.current.set(d.id,d.lz/ce),k.current.set(d.id,d.lz))}}catch(h){s.e(h)}finally{s.f()}},Fe=up(),ke=Fe/2,Ye=ce+ke-Fe/2,Le=ee+Fe,Ee=oe+Fe,Ne=oe+4*Fe;return Object(gf.jsxs)("group",{name:"Group Master",position:N,rotation:[0,0,Q],children:[Object(gf.jsxs)("group",{name:"Resize Handle Group",onPointerDown:function(e){switch(ze(e),e.object.name){case K.UpperLeft:Ce(ee,-oe);break;case K.UpperRight:Ce(-ee,-oe);break;case K.LowerLeft:Ce(ee,oe);break;case K.LowerRight:Ce(-ee,oe);break;case K.UpperLeftTop:Oe(-ee,oe,ce);break;case K.UpperRightTop:Oe(ee,oe,ce);break;case K.LowerLeftTop:Oe(-ee,-oe,ce);break;case K.LowerRightTop:Oe(ee,-oe,ce)}},children:[Object(gf.jsx)(eM,{args:[ee,oe,ke,Fe],handleType:K.UpperRight}),Object(gf.jsx)(eM,{args:[-ee,oe,ke,Fe],handleType:K.UpperLeft}),Object(gf.jsx)(eM,{args:[ee,-oe,ke,Fe],handleType:K.LowerRight}),Object(gf.jsx)(eM,{args:[-ee,-oe,ke,Fe],handleType:K.LowerLeft}),!be&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(eM,{args:[ee,oe,Ye,Fe],handleType:K.UpperRightTop}),Object(gf.jsx)(eM,{args:[-ee,oe,Ye,Fe],handleType:K.UpperLeftTop}),Object(gf.jsx)(eM,{args:[ee,-oe,Ye,Fe],handleType:K.LowerRightTop}),Object(gf.jsx)(eM,{args:[-ee,-oe,Ye,Fe],handleType:K.LowerLeftTop})]})]}),Object(gf.jsxs)("group",{name:"Move Handle Group",onPointerDown:function(e){if(ze(e),me(bz.Move),e.intersections.length>0){var l=e.intersections[0].point.clone().setZ(0);I.current.subVectors(N,l);var a,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Lw(i)&&t.has(i.id)){var r=new Me.Vector3(i.cx,i.cy),n=(new Me.Vector3).subVectors(r,l);R.current.set(i.id,n),O.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}}}catch(c){o.e(c)}finally{o.f()}}},children:[Object(gf.jsx)(tM,{args:[0,Ee,ke,Fe],handleType:B.Upper}),Object(gf.jsx)(tM,{args:[0,-Ee,ke,Fe],handleType:B.Lower}),Object(gf.jsx)(tM,{args:[Le,0,ke,Fe],handleType:B.Right}),Object(gf.jsx)(tM,{args:[-Le,0,ke,Fe],handleType:B.Left})]}),Object(gf.jsxs)("group",{name:"Rotate Handle Group",onPointerDown:function(e){if(ze(e),e.object.name===q.Lower?me(bz.RotateLower):e.object.name===q.Upper&&me(bz.RotateUpper),e.intersections.length>0){var l,a=new Me.Vector3(N.x,N.y),o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(l=o.n()).done;){var i=l.value;if(Lw(i)&&t.has(i.id)){var r=new Me.Vector3(i.cx,i.cy),n=(new Me.Vector3).subVectors(r,a);R.current.set(i.id,n),D.current.set(i.id,i.rotation[2]),O.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}t.has(i.parentId)&&O.current.set(i.id,[i.cx,i.cy,i.cz,i.rotation[2]])}}catch(c){o.e(c)}finally{o.f()}}},children:[Object(gf.jsx)(lM,{args:[0,Ne,ke,Fe],handleType:q.Upper}),Object(gf.jsx)(lM,{args:[0,-Ne,ke,Fe],handleType:q.Lower})]}),fe&&Object(gf.jsx)(Lt.f,{name:"Intersection Plane",ref:b,args:[Math.max(2.4*ee,1e3),Math.max(2.4*ee,1e3)],visible:!1,position:A.current,rotation:T.current,onPointerMove:function(e){if(b.current&&C.current){var a;a=e,ve.x=a.offsetX/we().gl.domElement.clientWidth*2-1,ve.y=-a.offsetY/we().gl.domElement.clientHeight*2+1,xe.setFromCamera(ve,we().camera);var o=xe.intersectObjects([b.current]);if(o.length>0){var i=o[0].point;switch(ge){case bz.ResizeXY:!function(e){var a=new Me.Vector2(e.x,e.y),o=P.current.clone();if(v){var i=(new Me.Vector2).subVectors(a,o),r=Math.max(1,i.length()),n=Math.sqrt(Math.pow(r,2)/(Math.pow(x,2)+1)),c=n*x,s=new Me.Vector2(n*Math.sign(i.x),c*Math.sign(i.y)).normalize().multiplyScalar(r/2).add(o);J(new Me.Vector3(s.x,s.y)),He(n,c),Pe((function(e){var a,o=new Map,i=Object(f.a)(e.elements);try{for(i.s();!(a=i.n()).done;){var r=a.value;if(Lw(r)&&(t.has(r.id)||l.has(r.id))){var d=M.current.get(r.id),h=W.current.get(r.id);if(d&&h){var p=h[0]*n,y=h[1]*c;if(r.lx=p,r.ly=y,r.parentId!==xt){var g=o.get(r.parentId);if(g){var m=g.pos,w=g.rot,x=new Me.Vector3(d[0]*n+s.x,d[1]*c+s.y),v=x.clone().sub(m).applyEuler(new Me.Euler(0,0,-w));r.cx=v.x,r.cy=v.y,o.set(r.id,{pos:x.clone(),rot:r.rotation[2]+w})}}else{var b=d[0]*n+s.x,A=d[1]*c+s.y;r.cx=b,r.cy=A,o.set(r.id,{pos:new Me.Vector3(b,A),rot:r.rotation[2]})}var T,P=Object(f.a)(e.elements);try{for(P.s();!(T=P.n()).done;){var S=T.value;if(S.foundationId===r.id)switch(S.type){case V.Wall:var H=S,R=j.current.get(H.id);if(!R)continue;var D=Object(u.a)(R,2),I=D[0],C=D[1],O=[I.x*p,I.y*y,r.lz],F=[C.x*p,C.y*y,r.lz];H.cx=(O[0]+F[0])/2,H.cy=(O[1]+F[1])/2,H.lx=Math.hypot(O[0]-F[0]+(O[1]-F[1])),H.relativeAngle=Math.atan2(F[1]-O[1],F[0]-O[0]),H.leftPoint=[].concat(O),H.rightPoint=[].concat(F);break;case V.Window:var k=S;if(k.parentType!==V.Roof)continue;var Y=z.current.get(k.id);if(!Y)continue;k.cx=Y[0]*p,k.cy=Y[1]*y}}}catch(L){P.e(L)}finally{P.f()}}}}}catch(L){i.e(L)}finally{i.f()}}))}else{var d=o.distanceTo(a),h=Math.atan2(a.x-o.x,a.y-o.y)+Q,p=Math.abs(d*Math.sin(h)),y=Math.abs(d*Math.cos(h)),g=(new Me.Vector2).addVectors(a,o).multiplyScalar(.5);J(new Me.Vector3(g.x,g.y)),He(p,y),Pe((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(t.has(o.id))o.lx=p,o.ly=y,o.cx=g.x,o.cy=g.y;else if(o.foundationId&&t.has(o.foundationId))switch(o.type){case V.Wall:var i=o,r=j.current.get(i.id);if(!r)continue;var n=Object(u.a)(r,2),c=n[0],s=n[1],d=[c.x*p,c.y*y,0],h=[s.x*p,s.y*y,0];i.cx=(d[0]+h[0])/2,i.cy=(d[1]+h[1])/2,i.lx=Math.hypot(d[0]-h[0],d[1]-h[1]),i.relativeAngle=Math.atan2(h[1]-d[1],h[0]-d[0]),i.leftPoint=[].concat(d),i.rightPoint=[].concat(h);break;case V.Window:var m=o;if(m.parentType!==V.Roof)continue;var w=z.current.get(m.id);if(!w)continue;m.cx=w[0]*p,m.cy=w[1]*y}}}catch(x){a.e(x)}finally{a.f()}}))}Ew.getState().updateElementOnRoofFn()}(i);break;case bz.ResizeZ:!function(e){if(!(e.z<.1)){var t=e.z;se(t),Pe((function(e){var l,a=Object(f.a)(e.elements);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(S.current.has(o.id))if(o.type===V.Wall){o.lz=t*S.current.get(o.id);var i=o;if(i.fill===Ue.Partial){var r=H.current.get(i.id);r&&(i.leftTopPartialHeight=t*r.upperLeft,i.rightTopPartialHeight=t*r.upperRight,i.leftUnfilledHeight=t*r.lowerLeft,i.rightUnfilledHeight=t*r.lowerRight)}}else if(o.type===V.Roof)o.rise=t*S.current.get(o.id);else if(o.type===V.Cuboid){var n=S.current.get(o.id);if(n){var c=n*t;o.lz=c,o.cz=c/2}}}}catch(s){a.e(s)}finally{a.f()}e.updateElementOnRoofFlag=!0}))}}(i);break;case bz.RotateLower:case bz.RotateUpper:!function(e){var a=new Me.Vector3(N.x,N.y),o=Math.atan2(a.x-e.x,e.y-a.y)+(ge===bz.RotateUpper?0:Math.PI),i=o+(Math.abs(o)>Math.PI?-bt:0),r=new Me.Euler(0,0,i),n=D.current.size;Pe((function(e){var o,c=Object(f.a)(e.elements);try{for(c.s();!(o=c.n()).done;){var s=o.value;if(Lw(s)&&t.has(s.id)&&!l.has(s.id)){var d=R.current.get(s.id),u=1!==n?D.current.get(s.id):0;if(d&&void 0!==u){var h=d.clone().applyEuler(r);s.cx=a.x+h.x,s.cy=a.y+h.y,s.rotation=[0,0,u+i]}}if(s.type!==V.Cuboid&&t.has(s.parentId)){var p=1!==n?D.current.get(s.parentId):0;void 0!==p&&(s.rotation=[0,0,p+i])}}}catch(y){c.e(y)}finally{c.f()}})),Z(i)}(i);break;case bz.Move:J((new Me.Vector3).addVectors(i.clone().setZ(0),I.current)),Pe((function(e){var a,o=Object(f.a)(e.elements);try{for(o.s();!(a=o.n()).done;){var r=a.value;if(Lw(r)&&t.has(r.id)&&!l.has(r.id)){var n=R.current.get(r.id);n&&(r.cx=i.x+n.x,r.cy=i.y+n.y)}}}catch(c){o.e(c)}finally{o.f()}}))}}}},onPointerUp:function(e){switch(ge){case bz.Move:case bz.RotateLower:case bz.RotateUpper:!function(){var e,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;(Lw(o)&&t.has(o.id)||t.has(o.parentId))&&l.set(o.id,[o.cx,o.cy,o.cz,o.rotation[2]])}}catch(n){a.e(n)}finally{a.f()}var i=ge===bz.Move?"Move":"Rotate",r={name:"".concat(i," Foundation Group"),timestamp:Date.now(),oldPositionMap:new Map(O.current),newPositionMap:new Map(l),undo:function(){We(r.oldPositionMap)},redo:function(){We(r.newPositionMap)}};je(r)}();break;case bz.ResizeXY:!function(){var e,t=new Map,l=new Map,a=new Map,o=Object(f.a)(Ew.getState().elements);try{for(o.s();!(e=o.n()).done;){var i=e.value;if(Lw(i)&&O.current.has(i.id))t.set(i.id,[i.cx,i.cy,i.lx,i.ly]);else if(F.current.has(i.id)){var r=i;l.set(i.id,[].concat(Object(h.a)(r.leftPoint),Object(h.a)(r.rightPoint)))}else if(L.current.has(i.id)){var n=i;if(n.parentType!==V.Roof)continue;a.set(n.id,[n.cx,n.cy])}}}catch(s){o.e(s)}finally{o.f()}var c={name:"Resize Building XY",timestamp:Date.now(),oldFoundationDataMap:new Map(O.current),newFoundationDataMap:new Map(t),oldWallPointsMap:new Map(F.current),newWallPointsMap:new Map(l),oldSkylightPosMap:new Map(L.current),newSkylightPosMap:new Map(a),undo:function(){Re(c.oldFoundationDataMap,c.oldWallPointsMap,c.oldSkylightPosMap)},redo:function(){Re(c.newFoundationDataMap,c.newWallPointsMap,c.newSkylightPosMap)}};je(c)}();break;case bz.ResizeZ:!function(){var e,t=new Map,l=new Map,a=Object(f.a)(Ew.getState().elements);try{for(a.s();!(e=a.n()).done;){var o=e.value;if(k.current.has(o.id)&&(o.type===V.Roof?t.set(o.id,o.rise):t.set(o.id,o.lz)),o.type===V.Wall&&Y.current.has(o.id)){var i=o;l.set(i.id,{lowerLeft:i.leftUnfilledHeight,lowerRight:i.rightUnfilledHeight,upperLeft:i.leftTopPartialHeight,upperRight:i.rightTopPartialHeight})}}}catch(n){a.e(n)}finally{a.f()}var r={name:"Resize Building Z",timestamp:Date.now(),oldElementHeightMap:new Map(k.current),newElementHeightMap:new Map(t),oldPartialWallHeightMap:new Map(Y.current),newPartialWallHeightMap:new Map(l),undo:function(){De(r.oldElementHeightMap,r.oldPartialWallHeightMap)},redo:function(){De(r.newElementHeightMap,r.newPartialWallHeightMap)}};je(r)}()}he(!1),Et.getState().setEnableOrbitController(!0),C.current=!1,me(bz.Null),Ie(null),Pe((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag,e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.updateElementOnRoofFlag=!0}))}}),Object(gf.jsx)("group",{name:"Wireframe Group",position:[0,0,ce/2],children:Object(gf.jsx)(ry,{hx:ee,hy:oe,hz:ce/2,lineColor:"white"})})]})},oM=n.a.memo(aM),iM=function(e){return e.parentId===xt&&(e.type===V.Foundation||e.type===V.Cuboid)},rM=function(e,t,l){var a=l.get(e),o=l.get(t);if(!a||!o)return!1;var i,r=Object(f.a)(a);try{for(r.s();!(i=r.n()).done;){var n=i.value;if(Tw.isPointInside(n.x,n.y,o))return!0}}catch(w){r.e(w)}finally{r.f()}var c,s=Object(f.a)(o);try{for(s.s();!(c=s.n()).done;){var d=c.value;if(Tw.isPointInside(d.x,d.y,a))return!0}}catch(w){s.e(w)}finally{s.f()}a.push(a[0]),o.push(o[0]);for(var u=0;u0&&a(t.leftJoints[0],[t.id]),t.rightJoints.length>0&&o(t.rightJoints[0],[t.id])}else e.type===V.Roof&&l((function(t){t.addedRoofIdSet.add(e.id)}))};for(n.s();!(r=n.n()).done;)c()}catch(d){n.e(d)}finally{n.f()}var s=null!==(e=i.find((function(e){return e.id===t.selectedElementId})))&&void 0!==e?e:null;l((function(e){var l;(l=e.elements).push.apply(l,Object(h.a)(i)),e.selectedElement=s,e.selectedElementIdSet=new Set(t.selectedElementIdSet),e.updateWallMapOnFoundationFlag=!e.updateWallMapOnFoundationFlag,e.deletedRoofId=null,e.autoDeletedRoofs=null,e.deletedRoofIdSet.clear(),e.autoDeletedRoofIdSet.clear(),e.autoDeletedChild=null}))}},redo:function(){var e=this;0!==m.deletedElements.length&&(l((function(t){var l;t.selectedElement=null!==(l=t.elements.find((function(t){return t.id===e.selectedElementId})))&&void 0!==l?l:null,t.selectedElementIdSet=new Set(e.selectedElementIdSet)})),Ew.getState().removeSelectedElements())}};i(m),l((function(e){e.selectedElement=null,e.selectedElementIdSet.clear(),e.deletedRoofId=null,e.deletedRoofIdSet.clear(),e.autoDeletedRoofs=null,e.autoDeletedRoofIdSet.clear(),e.autoDeletedChild=null})),Tf.getState().setPrimitiveStore("selectedElementId",null)}}}),50);return((null===(e=Et.getState().listenToAutoDeletionByCutRef)||void 0===e?void 0:e.current)||(null===(t=Et.getState().listenToAutoDeletionByDeleteRef)||void 0===t?void 0:t.current))&&Ew.getState().getAutoDeletedElements()&&s(),null})),PM=["left","up","right","down","shift+left","shift+up","shift+right","shift+down","ctrl+shift+left","ctrl+shift+up","ctrl+shift+right","ctrl+shift+down","meta+shift+left","meta+shift+up","meta+shift+right","meta+shift+down","ctrl+f","meta+f","ctrl+o","meta+o","ctrl+s","meta+s","ctrl+c","meta+c","ctrl+x","meta+x","ctrl+v","meta+v","ctrl+[","meta+[","ctrl+]","meta+]","ctrl+z","meta+z","ctrl+y","meta+y","ctrl+m","meta+m","ctrl+u","meta+u","ctrl+b","meta+b","shift","esc","ctrl+home","ctrl+alt+h","ctrl+shift+o","meta+shift+o","ctrl+shift+s","meta+shift+s","delete","backspace","alt+backspace","f2","f4","ctrl"],SM=function(e){var t,l=e.canvas,a=e.set2DView,i=e.setNavigationView,n=e.resetView,c=e.zoomView,s=Ew(si),d=Ew(Gi),p=Ew(rs),y=Ew(Vi),g=Ew(Pr),m=Ew(Sr),w=null!==(t=Ew(o.orthographic))&&void 0!==t&&t,x=Ew(on),v=Ew(Zr),b=Ew(Kc),A=Ew(qc),T=Ew(as),P=Ew($r),S=(Ew(wn),Ew(xn),Ew(tf)),j=Ew(lf),H=Ew(Ts),z=Ew(rn),R=Object(r.useMemo)((function(){return{lng:y}}),[y]),D=function(e,t){return l&&(l.style.cursor="default"),A(e,t)},M=function(e,t,l){var a=JSON.parse(JSON.stringify(e));if(a.cx=t,a.cy=l,e.type===V.SolarPanel&&e.parentType===V.Roof){if(e.parentId&&e.foundationId){var o=v(e.parentId),i=v(e.foundationId);if(o&&i){var r=Vm.getRoofBoundaryVertices(o),n=Vm.getSolarPanelVerticesOnRoof(a,i);if(!xp(n,r)||!vp(a,i,n))return!1}}return!0}if(z(a))return Qh(me.t("message.MoveCancelledBecauseOfOverlap",R)),!1;if(a.type===V.SolarPanel){var c=P(e);if(c&&!Tw.isSolarCollectorWithinHorizontalSurface(a,c))return Qh(me.t("message.MoveOutsideBoundaryCancelled",R)),!1}return!0},W=function(){var e=[],t=Ew.getState().selectedElementIdSet,l=x();if(!l||0===t.size)return e;if(l){var a=l.type,o=l.parentId,i=Ew.getState().elements.filter((function(e){return function(e,t){switch(e){case V.Foundation:case V.Cuboid:return t===V.Foundation||t===V.Cuboid;default:return t!==V.Foundation&&t!==V.Cuboid}}(a,e.type)&&function(e){switch(e.type){case V.Roof:case V.Door:case V.Window:return!1;case V.SolarPanel:case V.Sensor:case V.Light:var t=e;return t.parentType!==V.Wall&&t.parentType!==V.Roof&&(t.parentType!==V.Cuboid||1===t.rotation[2]);case V.Wall:var l=e;return 0===l.leftJoints.length&&0===l.rightJoints.length;default:return!0}}(e)&&e.parentId===o&&t.has(e.id)}));e.push.apply(e,Object(h.a)(i)),Lw(l)&&e.length>0&&o===xt&&function(e){var t,l=Ew.getState().elements.filter((function(e){return Lw(e)&&e.parentId===xt})),a=new Set(e.map((function(e){return e.id}))),o=new Map,i=Object(f.a)(l);try{for(i.s();!(t=i.n()).done;){var r=t.value,n=Tw.fetchFoundationVertexCoordinates(r);o.set(r.id,n)}}catch(h){i.e(h)}finally{i.f()}var c,s=function t(i){var r,n=Object(f.a)(l);try{for(n.s();!(r=n.n()).done;){var c=r.value;!a.has(c.id)&&rM(i.id,c.id,o)&&(a.add(c.id),e.push(c),c.enableGroupMaster&&t(c))}}catch(h){n.e(h)}finally{n.f()}},d=Object(f.a)(e);try{for(d.s();!(c=d.n()).done;){var u=c.value;u.enableGroupMaster&&s(u)}}catch(h){d.e(h)}finally{d.f()}}(e)}return e},I=function(e,t,l,a){switch(a){case _D.Left:return[e-l,t];case _D.Right:return[e+l,t];case _D.Up:return[e,t+l];case _D.Down:return[e,t-l]}},C=function(e,t){s((function(l){var a,o,i,r=!1,n=Object(f.a)(l.elements);try{for(n.s();!(i=n.n()).done;){var c=i.value;if(e.has(c.id)){var s=e.get(c.id);if(void 0!==s){var d=I(c.cx,c.cy,s,t),h=Object(u.a)(d,2),p=h[0],y=h[1];if(c.type===V.Wall){var g=c,m=new Me.Vector3(p-g.cx,y-g.cy),w=(new Me.Vector3).fromArray(g.leftPoint).setZ(0).add(m),x=(new Me.Vector3).fromArray(g.rightPoint).setZ(0).add(m);g.leftPoint=w.toArray(),g.rightPoint=x.toArray(),r=!0}c.cx=p,c.cy=y}}else l.selectedElementIdSet.has(c.id)&&l.selectedElementIdSet.delete(c.id)}}catch(v){n.e(v)}finally{n.f()}(null===(a=l.selectedElement)||void 0===a?void 0:a.type)===V.Cuboid||(null===(o=l.selectedElement)||void 0===o?void 0:o.type)===V.Foundation?l.groupActionUpdateFlag=!l.groupActionUpdateFlag:r&&(l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag)}))},O=function(e,t){s((function(l){var a,o=Object(f.a)(l.elements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(Tw.isFoundationOrCuboid(i)||Tw.isPlantOrHuman(i)&&i.parentId===xt){var r=I(i.cx,i.cy,e,t),n=Object(u.a)(r,2);i.cx=n[0],i.cy=n[1]}}}catch(c){o.e(c)}finally{o.f()}}))},F=function(e){return e===_D.Left?_D.Right:e===_D.Right?_D.Left:e===_D.Up?_D.Down:e===_D.Down?_D.Up:(console.error("Undo direction is possibly incorrect:",e),e)},k=function(e,t){if(w){var l=W(),a=x(),o=.1*t;if(a&&l.length>0){var i,r=new Map,n=Object(f.a)(l);try{for(n.s();!(i=n.n()).done;){var c=i.value;switch(c.type){case V.Foundation:case V.Cuboid:case V.Wall:case V.Tree:case V.Flower:case V.Human:r.set(c.id,o);break;case V.Light:case V.Sensor:var s=P(a);if(s){var d=o/s.lx,h=I(c.cx,c.cy,d,e),p=Object(u.a)(h,2),y=p[0],g=p[1],v=c.lx/(2*s.lx),b=c.lx/(2*s.ly);switch(e){case _D.Left:case _D.Right:var A=Tw.clamp(y,-.5+v,.5-v);d=Math.abs(A-a.cx);break;case _D.Up:case _D.Down:var T=Tw.clamp(g,-.5+b,.5-b);d=Math.abs(T-a.cy)}r.set(c.id,d)}break;case V.SolarPanel:case V.ParabolicDish:case V.ParabolicTrough:case V.FresnelReflector:case V.Heliostat:var S=P(c);if(S){var j=!0,H=o;switch(e){case _D.Left:case _D.Right:H=o/S.lx;break;case _D.Up:case _D.Down:H=o/S.ly}if(c.type===V.SolarPanel){var z=I(c.cx,c.cy,H,e),R=Object(u.a)(z,2),D=R[0],k=R[1];j=M(c,D,k)}if(!j)return;r.set(c.id,H)}}}}catch(E){n.e(E)}finally{n.f()}C(r,e);var Y={name:"Move Selected Elements ".concat(e," By Key"),timestamp:Date.now(),direction:e,movedElementsDisplacementMap:new Map(r),undo:function(){var e=F(Y.direction);C(Y.movedElementsDisplacementMap,e)},redo:function(){C(Y.movedElementsDisplacementMap,Y.direction)}};m(Y)}else{O(o,e);var L={name:"Move All ".concat(e," By Key"),timestamp:Date.now(),direction:e,displacement:o,undo:function(){var e=F(L.direction);O(L.displacement,e)},redo:function(){O(L.displacement,L.direction)}};m(L)}}},Y=function(e){Ew.getState().set((function(t){t.multiSelectionsMode=e}))},L=function(e){var t=x();switch(e){case"left":k(_D.Left,1);break;case"shift+left":k(_D.Left,.2);break;case"ctrl+shift+left":case"meta+shift+left":k(_D.Left,5);break;case"right":k(_D.Right,1);break;case"shift+right":k(_D.Right,.2);break;case"ctrl+shift+right":case"meta+shift+right":k(_D.Right,5);break;case"down":k(_D.Down,1);break;case"shift+down":k(_D.Down,.2);break;case"ctrl+shift+down":case"meta+shift+down":k(_D.Down,5);break;case"up":k(_D.Up,1);break;case"shift+up":k(_D.Up,.2);break;case"ctrl+shift+up":case"meta+shift+up":k(_D.Up,5);break;case"ctrl+[":case"meta+[":c(.9);break;case"ctrl+]":case"meta+]":c(1.1);break;case"ctrl+c":case"meta+c":t&&t.type!==V.Roof&&(b(t.id),s((function(e){e.selectedElementIdSet.clear(),e.selectedElementIdSet.add(t.id)})),d&&s((function(e){e.actionInfo={name:"Copy",timestamp:(new Date).getTime(),elementId:t.id,elementType:t.type}})));break;case"ctrl+x":case"meta+x":if(!t||t.type===V.Roof)break;if(t.locked)Kh(me.t("message.ThisElementIsLocked",R));else{var l=D(t.id,!0);if(0===l.length)break;if(Tw.isElementTriggerAutoDeletion(t))Et.getState().setListenToAutoDeletionByCut(!0),Tf.getState().setPrimitiveStore("selectedElementId",t.id);else{var o={name:"Cut",timestamp:Date.now(),deletedElements:l,selectedElementId:t.id,undo:function(){var e=o.deletedElements;if(0!==e.length){var t=e.find((function(e){return e.id===o.selectedElementId}));t&&s((function(l){var a;if((a=l.elements).push.apply(a,Object(h.a)(e)),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t.id),l.selectedElement=t,t.type===V.Wall){var o=t,i=null,r=null;if(o.leftJoints.length>0&&(i=o.leftJoints[0]),o.rightJoints.length>0&&(r=o.rightJoints[0]),i||r){var n,c=Object(f.a)(l.elements);try{for(c.s();!(n=c.n()).done;){var s=n.value;s.id===i&&s.type===V.Wall&&(s.rightJoints[0]=o.id),s.id===r&&s.type===V.Wall&&(s.leftJoints[0]=o.id)}}catch(d){c.e(d)}finally{c.f()}}}}))}},redo:function(){o.deletedElements&&o.deletedElements.length>0&&D(o.deletedElements[0].id,!0)}};m(o)}}break;case"ctrl+v":case"meta+v":var r=T();if(r.length>0){var u={name:"Paste by Key",timestamp:Date.now(),pastedElements:JSON.parse(JSON.stringify(r)),undo:function(){var e,t=Object(f.a)(u.pastedElements);try{for(t.s();!(e=t.n()).done;){var l=e.value;A(l.id,!1)}}catch(a){t.e(a)}finally{t.f()}},redo:function(){s((function(e){var t;(t=e.elements).push.apply(t,Object(h.a)(u.pastedElements)),e.selectedElement=u.pastedElements[0]}))}};m(u)}break;case"ctrl+alt+h":case"ctrl+home":if(!w){var y=Ew.getState().viewState.cameraPosition,v=Ew.getState().viewState.panCenter;if(y[0]!==y[1]||y[1]!==y[2]||y[0]!==y[2]||0!==v[0]||0!==v[1]||0!==v[2]){var P={name:"Reset View",timestamp:Date.now(),oldCameraPosition:Object(h.a)(y),oldPanCenter:Object(h.a)(v),undo:function(){var e=Et.getState().orbitControlsRef;(null===e||void 0===e?void 0:e.current)&&(e.current.object.position.set(P.oldCameraPosition[0],P.oldCameraPosition[1],P.oldCameraPosition[2]),e.current.target.set(P.oldPanCenter[0],P.oldPanCenter[1],P.oldPanCenter[2]),e.current.update(),s((function(e){var t=e.viewState;t.cameraPosition=Object(h.a)(P.oldCameraPosition),t.panCenter=Object(h.a)(P.oldPanCenter)})))},redo:function(){n()}};m(P),s((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.viewState.orthographic=!1})),n()}}break;case"f2":case"ctrl+b":case"meta+b":!function(){if(!Ew.getState().viewState.navigationView){var e={name:"Set 2D View",timestamp:Date.now(),checked:!w,undo:function(){a(!e.checked)},redo:function(){a(e.checked)}};m(e),a(!w),s((function(e){e.viewState.autoRotate=!1}))}}();break;case"ctrl+u":case"meta+u":!function(){if(!w){var e={name:"Set Navigation View",timestamp:Date.now(),checked:!Ew.getState().viewState.navigationView,undo:function(){i(!e.checked)},redo:function(){i(e.checked)}};m(e),i(!Ew.getState().viewState.navigationView),s((function(e){e.viewState.autoRotate=!1}))}}();break;case"f4":case"ctrl+m":case"meta+m":!function(){if(!w){var e={name:"Auto Rotate",timestamp:Date.now(),checked:!Ew.getState().viewState.autoRotate,undo:function(){s((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.viewState.autoRotate=!e.checked}))},redo:function(){s((function(t){t.objectTypeToAdd=V.None,t.groupActionMode=!1,t.viewState.autoRotate=e.checked}))}};m(e),s((function(e){e.objectTypeToAdd=V.None,e.groupActionMode=!1,e.viewState.autoRotate=!e.viewState.autoRotate}))}}();break;case"ctrl+f":case"meta+f":s((function(e){e.createNewFileFlag=!0,e.objectTypeToAdd=V.None,e.groupActionMode=!1,window.history.pushState({},document.title,Ge),d&&(e.actionInfo={name:"Create New File",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.openModelsMap=!1}));break;case"ctrl+s":case"meta+s":Tf.setState((function(e){e.saveLocalFileDialogVisible=!0})),d&&s((function(e){e.actionInfo={name:"Save Local File",timestamp:(new Date).getTime()}}));break;case"ctrl+shift+o":case"meta+shift+o":Tf.setState((function(e){e.listCloudFilesFlag=!0,e.openModelsMap=!1})),d&&s((function(e){e.actionInfo={name:"List Cloud Files",timestamp:(new Date).getTime()}}));break;case"ctrl+shift+s":case"meta+shift+s":Tf.getState().setSaveCloudFileFlag(!0),d&&s((function(e){e.actionInfo={name:"Save Cloud File",timestamp:(new Date).getTime()}}));break;case"alt+backspace":case"backspace":case"delete":var z=Ew.getState().selectedElementIdSet;if(!t||0===z.size)break;var M=Ew.getState().removeSelectedElements();if(0===M.length)break;if(function(){var e=M.filter((function(e){return e.type===V.Foundation})),t=new Set(e.map((function(e){return e.id})));return!!M.find((function(e){return!t.has(e.parentId)&&Tw.isElementTriggerAutoDeletion(e)}))}())Et.getState().setListenToAutoDeletionByDelete(!0),Tf.getState().setPrimitiveStore("selectedElementId",t.id);else{if(1===M.length){var W={name:"Delete",timestamp:Date.now(),deletedElements:Object(h.a)(M),selectedElementId:t.id,undo:function(){var e=W.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===W.selectedElementId}));if(t&&(s((function(l){var a;(a=l.elements).push.apply(a,Object(h.a)(e)),l.selectedElementIdSet.clear(),l.selectedElementIdSet.add(t.id),l.selectedElement=t,l.updateWallMapOnFoundationFlag=!l.updateWallMapOnFoundationFlag,l.deletedRoofId=null,l.deletedRoofIdSet.clear()})),t.type===V.Wall)){var l=t;l.leftJoints.length>0&&j(l.leftJoints[0],[l.id]),l.rightJoints.length>0&&S(l.rightJoints[0],[l.id])}}},redo:function(){var e=W.deletedElements;if(e&&0!==e.length){var t=e.find((function(e){return e.id===W.selectedElementId}));t&&D(t.id,!1)}}};m(W)}else{var I={name:"Delete Multiple",timestamp:Date.now(),deletedElements:Object(h.a)(M),selectedElementId:t.id,selectedElementIdSet:new Set(z),undo:function(){var e=this,t=this.deletedElements;if(t&&0!==t.length){var l=t.find((function(t){return t.id===e.selectedElementId}));if(l){s((function(a){var o;(o=a.elements).push.apply(o,Object(h.a)(t)),a.selectedElement=l,a.selectedElementIdSet=new Set(e.selectedElementIdSet),a.updateWallMapOnFoundationFlag=!a.updateWallMapOnFoundationFlag,a.deletedRoofId=null,a.deletedRoofIdSet.clear()}));var a,o=Object(f.a)(this.deletedElements);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.type===V.Wall){var r=i;r.leftJoints.length>0&&j(r.leftJoints[0],[r.id]),r.rightJoints.length>0&&S(r.rightJoints[0],[r.id])}}}catch(n){o.e(n)}finally{o.f()}}}},redo:function(){var e=this;s((function(t){var l;t.selectedElement=null!==(l=t.elements.find((function(t){return t.id===e.selectedElementId})))&&void 0!==l?l:null,t.selectedElementIdSet=new Set(e.selectedElementIdSet)})),Ew.getState().removeSelectedElements()}};m(I)}s((function(e){e.selectedElement=null,e.selectedElementIdSet.clear()}))}break;case"ctrl+z":case"meta+z":if(g.hasUndo()){var C=g.undo();Ew.getState().groupActionMode&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag})),C&&Kh(me.t("menu.edit.Undo",R)+": "+C,qe),d&&s((function(e){e.actionInfo={name:"Undo",timestamp:(new Date).getTime()}}))}break;case"ctrl+y":case"meta+y":if(g.hasRedo()){var O=g.redo();O&&Kh(me.t("menu.edit.Redo",R)+": "+O,qe),Ew.getState().groupActionMode&&s((function(e){e.groupActionUpdateFlag=!e.groupActionUpdateFlag})),d&&s((function(e){e.actionInfo={name:"Redo",timestamp:(new Date).getTime()}}))}break;case"shift":Ew.getState().viewState.navigationView&&Tf.setState((function(e){e.navigationMoveSpeed=5*Ew.getState().minimumNavigationMoveSpeed,e.navigationTurnSpeed=5*Ew.getState().minimumNavigationTurnSpeed})),H(!0);break;case"esc":var F=Ew.getState().addedFoundationId,L=Ew.getState().addedCuboidId,E=Ew.getState().addedWallId,U=Ew.getState().addedWindowId,N=Ew.getState().addedDoorId;F?A(F,!1):L?A(L,!1):E?A(E,!1):U?(A(U,!1),Tf.getState().setPrimitiveStore("elementBeingCanceledId",U)):N&&(A(N,!1),Tf.getState().setPrimitiveStore("elementBeingCanceledId",N)),s((function(e){e.objectTypeToAdd=V.None,e.actionModeLock=!1,e.moveHandleType=null,e.resizeHandleType=null,e.groupActionMode=!1})),Et.getState().setEnableOrbitController(!0),p();break;case"ctrl":Y(!0)}};Object(r.useEffect)((function(){return function(){E.current=null}}),[]);var E=Object(r.useRef)(null);return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(ZD.a,{handleKeys:PM,handleEventType:"keydown",onKeyEvent:function(e,t){t.preventDefault(),E.current!==e&&(E.current=e,L(e))}}),Object(gf.jsx)(ZD.a,{handleKeys:PM,handleEventType:"keyup",onKeyEvent:function(e,t){t.preventDefault(),E.current=null,function(e){switch(e){case"shift":Ew.getState().viewState.navigationView&&Tf.setState((function(e){e.navigationMoveSpeed=Ew.getState().minimumNavigationMoveSpeed,e.navigationTurnSpeed=Ew.getState().minimumNavigationTurnSpeed})),H(!1);break;case"ctrl+o":case"meta+o":Ew.getState().localFileDialogRequested||s((function(e){e.localFileDialogRequested=!0,e.openLocalFileFlag=!0,d&&(e.actionInfo={name:"Open Local File",timestamp:(new Date).getTime()})}));break;case"ctrl":Y(!1)}}(e)}}),Object(gf.jsx)(TM,{})]})},jM=n.a.memo(SM),HM=function(){var e=Ew(si),t=Ew(Xr),l=Object(Se.f)().scene;Object(r.useEffect)((function(){var t=l.children.filter((function(e){return"Content"===e.name})),o=[];if(t.length>0){var i,r=t[0].children,n=Object(f.a)(r);try{for(n.s();!(i=n.n()).done;){var c=i.value;a(c,o)}}catch(v){n.e(v)}finally{n.f()}}for(var s=[],d=0,u=o;d0){var p,y=new Me.Vector3,g=new Me.Vector3,m=Object(f.a)(s);try{for(m.s();!(p=m.n()).done;){var w=p.value;y.min(w.min),g.max(w.max)}}catch(v){m.e(v)}finally{m.f()}var x=Math.abs(y.x);x0){var a,o=Object(f.a)(t.children);try{for(o.s();!(a=o.n()).done;){e(a.value,l)}}catch(i){o.e(i)}finally{o.f()}}};return Object(gf.jsx)(gf.Fragment,{})},zM=n.a.memo(HM),RM=l(807),DM=l(808),MM=function(e){var t=(new Me.Vector3).subVectors(e.localToWorld(new Me.Vector3(0,0,1e3)),e.position);return 0===t.x&&0===t.y&&e.getWorldDirection(t),t},WM=function(e){var t=document.getElementById("compassCanvas");if(t){var l=MM(e).normalize(),a=(Math.atan2(l.y,l.x)+Math.PI/2)/Math.PI*180;t.style.transform="rotate(".concat(a,"deg)");var o=e.position.z<.001;o&&!Tf.getState().isCameraUnderGround?Tf.getState().setPrimitiveStore("isCameraUnderGround",!0):!o&&Tf.getState().isCameraUnderGround&&Tf.getState().setPrimitiveStore("isCameraUnderGround",!1)}},IM=function(){var e=Ew(si),t=Ew(o.orthographic),l=Ew(o.enableRotate),a=Ew(o.autoRotate),i=Ew(Tr),n=Ew(Kr),c=Ew(o.cameraPosition),s=Ew(o.cameraZoom),d=Ew(o.navigationView),u=Tf(gi),f=Tf(mi),p=Ew(lr),y=Tf(Ar),g=d&&!t,m=Math.hypot(c[0],c[1],c[2]),w=(t?50*s:10*m)*n,x=Object(r.useMemo)((function(){return new Me.Vector3(-w,-w,0)}),[w]),v=Object(r.useMemo)((function(){return new Me.Vector3(w,w,w/2)}),[w]),b=Object(Se.f)(),A=b.gl,T=b.invalidate,P=b.get,S=b.set,j=b.camera,H=Object(r.useMemo)((function(){var e=P().camera;return e.up.set(0,0,1),e}),[]),z=Object(r.useMemo)((function(){return A.domElement}),[]),R=Object(r.useRef)(null),D=Object(r.useRef)(null),M=Object(r.useRef)(null);Object(r.useEffect)((function(){Ew.getState().viewState.cameraPosition2D[2]<100&&e((function(e){e.viewState.cameraPosition2D[2]=150}))}),[]),Object(r.useEffect)((function(){R&&R.current&&Et.setState((function(e){e.orbitControlsRef=R}))}),[]),Object(r.useEffect)((function(){R.current&&(R.current.addEventListener("change",W),R.current.addEventListener("start",I),R.current.addEventListener("end",C));var e=R.current;return function(){e&&(e.removeEventListener("change",W),e.removeEventListener("start",I),e.removeEventListener("end",C))}}),[g]),Object(r.useEffect)((function(){var e=Ew.getState().viewState;if(R.current){if(D.current){if(g){var l,a,o=P().camera,i=null!==(l=e.cameraPositionNav)&&void 0!==l?l:[5,-30,1],r=null!==(a=e.cameraRotationNav)&&void 0!==a?a:[1.5374753309166491,.16505866097993566,.005476951734475092];o.position.fromArray(i),o.rotation.fromArray([].concat(Object(h.a)(r),["XYZ"]))}else{var n,c,s=O(null!==(n=e.cameraPosition)&&void 0!==n?n:[0,0,20]),d=O(null!==(c=e.panCenter)&&void 0!==c?c:[0,0,0]);D.current.position.copy(s),D.current.lookAt(d),D.current.zoom=1,t||(R.current.object=D.current,R.current.target.copy(d))}j.updateMatrixWorld(),WM(P().camera)}if(M.current){var u,f,p=O(null!==(u=e.cameraPosition2D)&&void 0!==u?u:[0,0,1e3]).setZ(1e3),y=O(null!==(f=e.panCenter2D)&&void 0!==f?f:[0,0,0]);M.current.position.copy(p),M.current.rotation.set(0,0,0),M.current.lookAt(y),M.current.zoom=e.cameraZoom,t&&(R.current.object=M.current,R.current.target.copy(y))}}}),[i]),Object(r.useEffect)((function(){if(M.current&&D.current&&R.current){var e,l,a=Ew.getState().viewState,o=R.current,i=M.current,r=D.current;if(t)i.rotation.set(0,0,0),o.object=i,o.target.copy(O(null!==(e=a.panCenter2D)&&void 0!==e?e:[0,0,0])),S({camera:i});else o.object=r,o.target.copy(O(null!==(l=a.panCenter)&&void 0!==l?l:[0,0,0])),S({camera:r}),WM(P().camera)}}),[t]),Object(r.useEffect)((function(){t&&R.current&&(M.current&&(M.current.zoom=s,R.current.object=M.current),W(),R.current.update())}),[s]);var W=function(){T(),Ew.getState().viewState.orthographic||(WM(P().camera),R.current&&R.current.target.clamp(x,v))},I=function(){Tf.setState((function(e){e.duringCameraInteraction=!0}))},C=function(){Tf.setState((function(e){e.duringCameraInteraction=!1})),e((function(e){if(R.current){var t=e.viewState,l=P().camera,a=l.position,o=R.current.target;t.orthographic?(l.zoom&&!isNaN(l.zoom)?t.cameraZoom=l.zoom:t.cameraZoom=20,t.cameraPosition2D=[a.x,a.y,150],t.panCenter2D=[o.x,o.y,o.z]):g?(t.cameraPositionNav=[a.x,a.y,a.z],t.cameraRotationNav=[l.rotation.x,l.rotation.y,l.rotation.z],e.cameraDirection=MM(l)):(t.cameraPosition=[a.x,a.y,a.z],t.panCenter=[o.x,o.y,o.z],e.cameraDirection=MM(l))}}))},O=function(e){return e&&Array.isArray(e)?new Me.Vector3(e[0],e[1],e[2]):e&&null!==e.x?new Me.Vector3(e.x,e.y,e.z):new Me.Vector3(0,0,5)};Object(Se.d)((function(e){a&&R.current&&R.current.update()}));var F=Et((function(e){return e.compassRef}));return Object(r.useEffect)((function(){WM(P().camera)}),[F]),Object(r.useEffect)((function(){R.current&&(!g||y||p?R.current.removeKeyEvents():R.current.listenToKeyEvents(window))}),[g,y,p]),Object(r.useEffect)((function(){if(R.current){var e=Ew.getState().viewState;if(g){var l,a,o=P().camera,i=null!==(l=e.cameraPositionNav)&&void 0!==l?l:[5,-30,1],r=null!==(a=e.cameraRotationNav)&&void 0!==a?a:[1.5374753309166491,.16505866097993566,.005476951734475092];o.position.fromArray(i),o.rotation.fromArray([].concat(Object(h.a)(r),["XYZ"])),o.updateMatrixWorld(),WM(P().camera)}else if(R.current&&D.current){var n,c,s=O(null!==(n=e.cameraPosition)&&void 0!==n?n:[0,0,20]),d=O(null!==(c=e.panCenter)&&void 0!==c?c:[0,0,0]);D.current.position.copy(s),D.current.lookAt(d),D.current.zoom=1,t||(R.current.object=D.current,R.current.target.copy(d)),D.current.updateMatrixWorld(),WM(D.current)}T()}}),[g]),Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(RM.a,{ref:D,fov:45,far:ct,up:[0,0,1]}),Object(gf.jsx)(DM.a,{ref:M,up:[0,0,1]}),Object(gf.jsx)("myOrbitControls",{ref:R,args:[H,z],autoRotate:a,enableRotate:l,enablePan:!0,enableZoom:!0,enableDamping:!1,maxAzimuthAngle:1/0,minAzimuthAngle:-1/0,maxPolarAngle:vt,minPolarAngle:0,moveSpeed:null!==u&&void 0!==u?u:3,turnSpeed:null!==f&&void 0!==f?f:3})]})},CM=n.a.memo(IM),OM=l(809),FM=l(810),kM=l(811),YM=l(812),LM=l(813),EM=l(814),UM=l(815),NM=l(816),VM=l(817),JM=l(818),GM=l(819),XM=l(820),BM=mv.a.div(sM||(sM=Object(gv.a)(["\n display: flex;\n flex-direction: column;\n z-index: 999;\n"]))),KM=function(e){var t=e.style,l=e.size,a=e.margin,o=e.round,i=e.handleShareWindowClose,r=Ew(di),n=Ew(Vi),c=Ew(ar),s=new URLSearchParams(window.location.search).get("userid"),d={lng:n},u=null!==c&&void 0!==c?c:me.t("name.Tagline",d),f="aladdinIFI "+(c?me.t("name.Tagline",d):""),h=Ge;return c&&(s?h+="?client=web&userid="+s+"&title="+encodeURIComponent(c):r.uid&&(h+="?client=web&userid="+r.uid+"&title="+encodeURIComponent(c))),Object(gf.jsxs)(BM,{style:t,children:[Object(gf.jsx)(OM.a,{url:h,title:u,via:f,style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(FM.a,{size:l,round:o})}),Object(gf.jsx)(kM.a,{url:h,quote:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(YM.a,{size:l,round:o})}),Object(gf.jsx)(LM.a,{url:h,title:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(EM.a,{size:l,round:o})}),Object(gf.jsx)(UM.a,{url:h,title:u,style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(NM.a,{size:l,round:o})}),Object(gf.jsx)(VM.a,{url:h,title:u,summary:f,source:me.t("name.IFI",d),style:{paddingRight:a},onShareWindowClose:i,children:Object(gf.jsx)(JM.a,{size:l,round:o})}),Object(gf.jsx)(GM.a,{url:h,title:u,onShareWindowClose:i,children:Object(gf.jsx)(XM.a,{size:l,round:o})})]})},qM=n.a.memo(KM),QM=function(){function e(t,l,a){if(Object(He.a)(this,e),this.chromosome=void 0,this.fitness=Number.NaN,this.discretizationSteps=void 0,this.chromosome=new Array(t),this.discretizationSteps=a,l)if(a)for(var o=0;oe.fitness?1:this.fitness=this.chromosome.length)throw new Error("Gene index out of bound: "+e);this.chromosome[e]=t}},{key:"getGene",value:function(e){if(e<0||e>=this.chromosome.length)throw new Error("Gene index out of bound: "+e);return this.chromosome[e]}},{key:"copyGenes",value:function(e){for(var t=Math.min(this.chromosome.length,e.chromosome.length),l=0;ll&&(l=o.fitness,e=o)}}catch(i){a.e(i)}finally{a.f()}return e}},{key:"evolve",value:function(e,t){this.selectSurvivors(e),this.crossover(t)}},{key:"selectSurvivors",value:function(e){this.survivors=[],this.sort();for(var t=Math.floor(e*this.individuals.length),l=0;l=o){a=n;break}}}catch(h){r.e(h)}finally{r.f()}var c=null;do{o=Math.random()*t,i=0;var s,d=Object(f.a)(this.survivors);try{for(d.s();!(s=d.n()).done;){var u=s.value;if((i+=u.fitness-e)>=o){u!==a&&(c=u);break}}}catch(h){d.e(h)}finally{d.f()}}while(null===c);return a&&c?new ZM(a,c):null}},{key:"selectParentsByTournament",value:function(){var e=this.survivors.length;if(e<=1)throw new Error("Must have at least two survivors to be used as parents");var t,l=e-1,a=Math.floor(Math.random()*l);do{t=Math.floor(Math.random()*l)}while(t===a);var o=this.survivors[a].fitness>this.survivors[t].fitness?a:t;a=Math.floor(Math.random()*l);do{t=Math.floor(Math.random()*l)}while(t===a);for(var i=this.survivors[a].fitness>this.survivors[t].fitness?a:t;i===o;){a=Math.floor(Math.random()*l);do{t=Math.floor(Math.random()*l)}while(t===a);i=this.survivors[a].fitness>this.survivors[t].fitness?a:t}return new ZM(this.survivors[o],this.survivors[i])}},{key:"mutate",value:function(e){if(!Tw.isZero(e)){var t=Math.floor(e*(this.individuals.length-1));for(0===t?t=1:t===this.individuals.length-1&&(t=this.individuals.length-2),this.mutants=[];this.mutants.lengthe)return!1}return!0}}]),e}(),$M=function(){function e(t,l,a,o,i,r,n,c,s,d){Object(He.a)(this,e),this.population=void 0,this.objectiveFunctionType=void 0,this.convergenceThreshold=void 0,this.minima=void 0,this.maxima=void 0,this.foundation=void 0,this.fitnessSharingRadius=.1,this.searchMethod=O.GLOBAL_SEARCH_UNIFORM_SELECTION,this.localSearchRadius=.1,this.constraints=[],this.stopped=!0,this.mutationRate=.1,this.crossoverRate=.5,this.selectionRate=.5,this.maximumGenerations=5,this.fittestOfGenerations=[],this.populationOfGenerations=[],this.outsideGenerationCounter=0,this.computeCounter=0,this.converged=!1,this.geneNames=void 0,this.population=new _M(a,i,r,d),this.objectiveFunctionType=l,this.convergenceThreshold=n,this.maximumGenerations=o,this.searchMethod=c,this.localSearchRadius=s,this.geneNames=new Array(i),this.foundation=t;var u=t.cx,f=t.cy,h=t.lx,p=t.ly;this.minima=new Array(i),this.maxima=new Array(i);for(var y=0;y=this.maximumGenerations}}]),e}(),eW=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"gaussian",value:function(){for(var e=0,t=0;0===e;)e=Math.random();for(;0===t;)t=Math.random();return Math.sqrt(-2*Math.log(e))*Math.cos(2*Math.PI*t)}},{key:"twoGaussians",value:function(){for(var e=0,t=0;0===e;)e=Math.random();for(;0===t;)t=Math.random();var l=new Array(2),a=Math.sqrt(-2*Math.log(e)),o=2*Math.PI*t;return l[0]=a*Math.cos(o),l[1]=a*Math.sin(o),l}},{key:"poisson",value:function(e){for(var t=0,l=Math.exp(-e),a=l,o=Math.random();o>a;)a+=l*=e/++t;return t}}]),e}(),tW=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a,o,i,r,n,c,s,d){var h;Object(He.a)(this,l),(h=t.call(this,a,o,i,r,e.length,n,c,s,d)).solarPanels=void 0,h.solarPanels=e;var p,y=h.population.individuals[0],g=Object(f.a)(e.entries());try{for(g.s();!(p=g.n()).done;){var m=Object(u.a)(p.value,2),w=m[0],x=m[1],v=.5*(1+x.tiltAngle/vt);if(y.setGene(w,v),h.searchMethod===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)for(var b=1;b1;)T=eW.gaussian()*h.localSearchRadius+v;A.setGene(w,T)}h.geneNames[w]="Tilt Angle ("+x.id+")"}}catch(P){g.e(P)}finally{g.f()}return h}return Object(Fe.a)(l,[{key:"applyFittest",value:function(){var e=this.population.getFittest();if(e){for(var t=0;t0&&(T.current=Object(h.a)(H.current),D(!0)))}):void 0}),[c]),Object(r.useEffect)((function(){A.current=s,s?(cancelAnimationFrame(v.current),Tf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",x))):(Tf.setState((function(e){e.evolutionPaused=!1})),R())}),[s]);var z=function(){if(d){Tf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),b.current=!1;var e=u(V.SolarPanel,d.id);H.current.length=0;var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;H.current.push(JSON.parse(JSON.stringify(o)))}}catch(s){a.e(s)}finally{a.f()}T.current=[];var i,r=[],n=Object(f.a)(e);try{for(n.s();!(i=n.n()).done;){var c=i.value;T.current.push(JSON.parse(JSON.stringify(c))),r.push(c.label)}}catch(s){n.e(s)}finally{n.f()}T.current.length>0?(P.current=new tW(T.current,d,w.objectiveFunctionType,w.populationSize,w.maximumGenerations,w.selectionMethod,w.convergenceThreshold,w.searchMethod,w.localSearchRadius),P.current.selectionRate=w.selectionRate,P.current.crossoverRate=w.crossoverRate,P.current.mutationRate=w.mutationRate,S.current=0,j.current=!1,m(r),P.current.startEvolving(),t((function(e){e.viewState.showEvolutionPanel=!0,e.selectedFloatingWindow="solarPanelOptimizationResult"}))):Qh(me.t("message.EncounterEvolutionError",x))}};Object(r.useEffect)((function(){P.current&&y&&(j.current=P.current.evolveIndividual(S.current%w.populationSize,function(){var e=0;switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:var t,l=Pf.getState().dailyPvYield,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;for(var r in i)i.hasOwnProperty(r)&&"Total"===r&&(e+=i[r])}}catch(h){a.e(h)}finally{a.f()}break;case W.YEARLY_TOTAL_OUTPUT:var n,c=Pf.getState().yearlyPvYield,s=Object(f.a)(c);try{for(s.s();!(n=s.n()).done;){var d=n.value;for(var u in d)d.hasOwnProperty(u)&&"Total"===u&&(e+=d[u])}}catch(h){s.e(h)}finally{s.f()}e*=12/o}return e}()),C(),S.current++,P.current.outsideGenerationCounter=Math.floor(S.current/w.populationSize),v.current=requestAnimationFrame(R))}),[y]);var R=function(){if(P.current&&n===I.GENETIC_ALGORITHM&&c&&!A.current){if(j.current||P.current.outsideGenerationCounter>=w.maximumGenerations){if(cancelAnimationFrame(v.current),b.current=!0,P.current.applyFittest(),C(),D(!0),Kh(me.t("message.EvolutionCompleted",x)+"\n"+(j.current?me.t("message.ConvergenceThresholdHasBeenReached",x):me.t("message.MaximumNumberOfGenerationsHasBeenReached",x))),l&&P.current){var e=P.current.population.getFittest();e&&t((function(t){var l;t.actionInfo={name:"Genetic Algorithm for Solar Panel Tilt Angle Completed",result:tW.individualToString(e),steps:null===(l=P.current)||void 0===l?void 0:l.outsideGenerationCounter,timestamp:(new Date).getTime()}}))}return}P.current.translateIndividual(S.current%w.populationSize),D(!1)}},D=function(e){Tf.setState((function(t){if(T.current)switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case W.YEARLY_TOTAL_OUTPUT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0;break;default:Qh(me.t("message.ObjectiveFunctionTypeError",x),60)}})),t((function(e){if(T.current){switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case W.YEARLY_TOTAL_OUTPUT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1);break;default:Qh(me.t("message.ObjectiveFunctionTypeError",x),60)}var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel){var o,i=a,r=Object(f.a)(T.current);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(i.id===n.id){i.tiltAngle=n.tiltAngle;break}}}catch(c){r.e(c)}finally{r.f()}}}}catch(c){l.e(c)}finally{l.f()}}})),e&&Tf.setState((function(e){e.runEvolution=!1,e.evolutionInProgress=!1,e.objectiveEvaluationIndex=0}))},C=function(){if(P.current){for(var e=[],t=0;t0){var s=P.current.populationOfGenerations[t-1];if(s)for(var d=0,u=0;u0&&e.push(l)}p(e)}};return Object(gf.jsx)(gf.Fragment,{})},aW=n.a.memo(lW),oW=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a,o,i,r,n,c,s,d,u,f,h,p,y,g,m,w,x,v,b,A,T,P){var S;if(Object(He.a)(this,l),(S=t.call(this,d,u,f,h,3,p,y,g,m)).polygon=void 0,S.pvModel=void 0,S.orientation=$.landscape,S.rowAxis=ee.leftRight,S.poleHeight=2,S.poleSpacing=5,S.bounds=void 0,S.solarPanelCount=0,S.solarRackCount=0,S.minimumInterRowSpacing=2,S.maximumInterRowSpacing=10,S.minimumRowsPerRack=1,S.maximumRowsPerRack=6,S.minimumTiltAngle=-vt,S.maximumTiltAngle=vt,S.margin=0,S.polygon=s,S.pvModel=e,S.rowAxis=a,S.orientation=o,S.poleHeight=i,S.poleSpacing=r,S.minimumInterRowSpacing=w,S.maximumInterRowSpacing=x,S.minimumRowsPerRack=v,S.maximumRowsPerRack=b,S.minimumTiltAngle=A,S.maximumTiltAngle=T,S.margin=P,S.setInterRowSpacingBounds(),S.geneNames[0]="Tilt Angle",S.geneNames[1]="Inter-Row Spacing",S.geneNames[2]="Rack Width",n&&n.length>0){var j=n[0];if(n.length>1){var H=S.population.individuals[0],z=S.maximumTiltAngle===S.minimumTiltAngle?0:(j.tiltAngle-S.minimumTiltAngle)/(S.maximumTiltAngle-S.minimumTiltAngle);H.setGene(0,z);var R=n[1],D=c?c.interRowSpacing:S.rowAxis===ee.upDown?Math.abs(j.cx-R.cx)*S.foundation.lx:Math.abs(j.cy-R.cy)*S.foundation.ly,M=S.maximumInterRowSpacing===S.minimumInterRowSpacing?0:(D-S.minimumInterRowSpacing)/(S.maximumInterRowSpacing-S.minimumInterRowSpacing);M<0?M=0:M>1&&(M=1),H.setGene(1,M);var W=c?c.rowsPerRack:Math.max(1,Math.round(j.ly/(j.orientation===$.portrait?e.length:e.width))),I=S.maximumRowsPerRack===S.minimumRowsPerRack?0:(W-S.minimumRowsPerRack)/(S.maximumRowsPerRack-S.minimumRowsPerRack);I<0?I=0:I>1&&(I=1),H.setGene(2,I)}}return S}return Object(Fe.a)(l,[{key:"setInterRowSpacingBounds",value:function(){this.bounds=Tw.calculatePolygonBounds(this.polygon.vertices)}},{key:"applyFittest",value:function(){var e=this.population.getFittest();e&&console.log("Fittest: "+this.individualToString(e)+", rack count: "+this.solarRackCount+", panel count: "+this.solarPanelCount)}},{key:"getObjectiveUnit",value:function(){switch(this.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:return"kWh";case W.YEARLY_PROFIT:case W.DAILY_PROFIT:return"dollars"}return null}},{key:"individualToString",value:function(e){var t="F("+Tw.toDegrees(e.getGene(0)*(this.maximumTiltAngle-this.minimumTiltAngle)+this.minimumTiltAngle).toFixed(3)+"\xb0, ";return t+=(e.getGene(1)*(this.maximumInterRowSpacing-this.minimumInterRowSpacing)+this.minimumInterRowSpacing).toFixed(3)+"m, ",(t+=Math.floor(e.getGene(2)*(this.maximumRowsPerRack-this.minimumRowsPerRack)+this.minimumRowsPerRack)+")")+" = "+e.fitness.toFixed(5)+" "+this.getObjectiveUnit()}},{key:"startEvolving",value:function(){this.outsideGenerationCounter=0,this.computeCounter=0,this.fittestOfGenerations.fill(null),this.setInterRowSpacingBounds()}},{key:"translateIndividualByIndex",value:function(e){return this.translateIndividual(this.population.individuals[e])}},{key:"translateBest",value:function(){var e=this.population.getFittest();return e?this.translateIndividual(e):[]}},{key:"translateIndividual",value:function(e){if(!this.bounds)return[];var t=e.getGene(0)*(this.maximumTiltAngle-this.minimumTiltAngle)+this.minimumTiltAngle,l=e.getGene(1)*(this.maximumInterRowSpacing-this.minimumInterRowSpacing)+this.minimumInterRowSpacing,a=Math.floor(e.getGene(2)*(this.maximumRowsPerRack-this.minimumRowsPerRack)+this.minimumRowsPerRack),o=XS.create(this.polygon,this.foundation,this.pvModel,this.orientation,t,a,l,this.rowAxis,this.poleHeight,this.poleSpacing,this.margin);if(this.solarPanelCount=0,this.solarRackCount=o.length,o.length>0){var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;this.solarPanelCount+=Tw.countSolarPanelsOnRack(n,this.pvModel)}}catch(c){r.e(c)}finally{r.f()}}return o}},{key:"evolveIndividual",value:function(e,t){var l=this.population.individuals.length;if(!this.converged){var a,o=this.population.individuals[e];o.fitness=t,0===this.computeCounter&&0===e&&(this.fittestOfGenerations[0]=o.getCopy());var i=Math.floor(this.computeCounter/l);console.log("Generation "+(i+1)+", individual "+e+" : "+this.individualToString(o)+", rack count: "+this.solarRackCount+", panel count: "+this.solarPanelCount);var r=null===(a=this.populationOfGenerations[i])||void 0===a?void 0:a.individuals[e];if(r){for(var n=0;n0&&v(u.id,!1),O.current.length>0&&(C.current=Object(h.a)(O.current),E(!0))}),100))}):void 0}),[c]),Object(r.useEffect)((function(){H.current=s,s?(cancelAnimationFrame(S.current),Tf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",F))):(Tf.setState((function(e){e.evolutionPaused=!1})),L())}),[s]);var Y=function(){var e,l,a,o,i,r;if(u&&k){Tf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),j.current=!1;var n=p(V.SolarPanel,k.id);O.current.length=0;var c,s=Object(f.a)(n);try{for(s.s();!(c=s.n()).done;){var d=c.value;O.current.push(JSON.parse(JSON.stringify(d)))}}catch(y){s.e(y)}finally{s.f()}z.current=new oW(x(null!==(e=A.pvModelName)&&void 0!==e?e:"CS6X-355P-FG"),null!==(l=A.rowAxis)&&void 0!==l?l:ee.leftRight,null!==(a=A.orientation)&&void 0!==a?a:$.landscape,null!==(o=A.poleHeight)&&void 0!==o?o:1,null!==(i=A.poleSpacing)&&void 0!==i?i:3,O.current,P,u,k,b.objectiveFunctionType,b.populationSize,b.maximumGenerations,b.selectionMethod,b.convergenceThreshold,b.searchMethod,b.localSearchRadius,A.minimumInterRowSpacing,A.maximumInterRowSpacing,A.minimumRowsPerRack,A.maximumRowsPerRack,A.minimumTiltAngle,A.maximumTiltAngle,null!==(r=A.margin)&&void 0!==r?r:0),z.current.selectionRate=b.selectionRate,z.current.crossoverRate=b.crossoverRate,z.current.mutationRate=b.mutationRate,R.current=0,D.current=!1,w(Object(h.a)(z.current.geneNames)),z.current.startEvolving(),t((function(e){e.viewState.showEvolutionPanel=!0,e.selectedFloatingWindow="solarPanelOptimizationResult"}))}};Object(r.useEffect)((function(){z.current&&g&&(D.current=z.current.evolveIndividual(R.current%b.populationSize,function(){var e,t=0;switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:var l,a=Pf.getState().dailyPvYield,i=Object(f.a)(a);try{for(i.s();!(l=i.n()).done;){var r=l.value;for(var n in r)r.hasOwnProperty(n)&&"Total"===n&&(t+=r[n])}}catch(y){i.e(y)}finally{i.f()}break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:var c,s=Pf.getState().yearlyPvYield,d=Object(f.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;for(var h in u)u.hasOwnProperty(h)&&"Total"===h&&(t+=u[h])}}catch(y){d.e(y)}finally{d.f()}t*=12/o}var p=null===(e=z.current)||void 0===e?void 0:e.solarPanelCount;switch(b.objectiveFunctionType){case W.DAILY_AVERAGE_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:p&&(t/=p);break;case W.DAILY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit);break;case W.YEARLY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit*365)}return t}()),U(),R.current++,z.current.outsideGenerationCounter=Math.floor(R.current/b.populationSize),S.current=requestAnimationFrame(L))}),[g]);var L=function(){if(z.current&&n===I.GENETIC_ALGORITHM&&c&&!H.current){if(D.current||z.current.outsideGenerationCounter>=b.maximumGenerations){if(cancelAnimationFrame(S.current),j.current=!0,C.current.length>0&&v(u.id,!1),C.current=z.current.translateBest(),z.current.applyFittest(),U(),E(!0),Kh(me.t("message.EvolutionCompleted",F)+"\n"+(D.current?me.t("message.ConvergenceThresholdHasBeenReached",F):me.t("message.MaximumNumberOfGenerationsHasBeenReached",F))),z.current){var e=z.current.population.getFittest();if(e){var a=e.getGene(0)*(A.maximumTiltAngle-A.minimumTiltAngle)+A.minimumTiltAngle,o=e.getGene(1)*(A.maximumInterRowSpacing-A.minimumInterRowSpacing)+A.minimumInterRowSpacing,i=Math.floor(e.getGene(2)*(A.maximumRowsPerRack-A.minimumRowsPerRack)+A.minimumRowsPerRack);t((function(e){e.solarPanelArrayLayoutParams.tiltAngle=a,e.solarPanelArrayLayoutParams.interRowSpacing=o,e.solarPanelArrayLayoutParams.rowsPerRack=i,e.solarPanelArrayLayoutParams.orientation=A.orientation,e.solarPanelArrayLayoutParams.poleHeight=A.poleHeight})),l&&t((function(t){var l,a;t.actionInfo={name:"Genetic Algorithm for Solar Panel Array Layout Completed",result:null===(l=z.current)||void 0===l?void 0:l.individualToString(e),steps:null===(a=z.current)||void 0===a?void 0:a.outsideGenerationCounter,timestamp:(new Date).getTime()}}))}}return}v(u.id,!1),setTimeout((function(){z.current&&(C.current=z.current.translateIndividualByIndex(R.current%b.populationSize)),E(!1)}),100)}},E=function(e){Tf.setState((function(t){switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){var t;switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}(t=e.elements).push.apply(t,Object(h.a)(C.current))})),e&&Tf.setState((function(e){e.runEvolution=!1,e.evolutionInProgress=!1,e.objectiveEvaluationIndex=0}))},U=function(){if(z.current){for(var e=[],t=0;t0){var n=z.current.populationOfGenerations[t-1];if(n)for(var c=0,s=0;s0&&e.push(l)}y(e)}};return Object(gf.jsx)(gf.Fragment,{})},rW=n.a.memo(iW),nW=function(){function e(t,l){Object(He.a)(this,e),this.position=void 0,this.velocity=void 0,this.fitness=Number.NaN,this.bestPositionOfParticle=void 0,this.position=new Array,this.velocity=new Array,this.bestPositionOfParticle=new Array;for(var a=0;ae.fitness?1:this.fitnesse)return!1}return!0}}]),e}(),sW=function(){function e(t,l,a,o,i,r,n,c,s){Object(He.a)(this,e),this.swarm=void 0,this.objectiveFunctionType=void 0,this.foundation=void 0,this.stopped=!0,this.inertia=.8,this.cognitiveCoefficient=.1,this.socialCoefficient=.1,this.maximumSteps=5,this.bestPositionOfSteps=[],this.bestFitnessOfSteps=[],this.swarmOfSteps=[],this.outsideStepCounter=0,this.computeCounter=0,this.convergenceThreshold=.1,this.converged=!1,this.searchMethod=O.GLOBAL_SEARCH_UNIFORM_SELECTION,this.localSearchRadius=.1,this.swarm=new cW(a,r,o),this.objectiveFunctionType=l,this.convergenceThreshold=n,this.searchMethod=c,this.localSearchRadius=s,this.maximumSteps=i,this.foundation=t,this.bestPositionOfSteps=new Array(this.maximumSteps+1),this.bestPositionOfSteps.fill(null),this.bestFitnessOfSteps=new Array(this.maximumSteps+1),this.bestFitnessOfSteps.fill(0),this.swarmOfSteps=new Array(this.maximumSteps);for(var d=0;d=this.maximumSteps}}]),e}(),dW=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a,o,i,r,n,c,s,d){var h;Object(He.a)(this,l),(h=t.call(this,a,o,i,r,n,e.length,c,s,d)).solarPanels=void 0,h.solarPanels=e;var p,y=h.swarm.particles[0],g=Object(f.a)(e.entries());try{for(g.s();!(p=g.n()).done;){var m=Object(u.a)(p.value,2),w=m[0],x=.5*(1+m[1].tiltAngle/vt);if(y.position[w]=x,h.searchMethod===O.LOCAL_SEARCH_RANDOM_OPTIMIZATION)for(var v=1;v1;)A=eW.gaussian()*h.localSearchRadius+x;b.position[w]=A}}}catch(T){g.e(T)}finally{g.f()}return h}return Object(Fe.a)(l,[{key:"applyFittest",value:function(){var e=this.swarm.bestPositionOfSwarm;if(e){for(var t=0;ti.fitness&&i.updateBestPosition(),i.fitness=t,0===this.computeCounter&&0===e&&(this.bestPositionOfSteps[0]=Object(h.a)(i.position),this.bestFitnessOfSteps[0]=t);var r=Math.floor(this.computeCounter/a);console.log("Step "+(r+1)+", particle "+e+" : "+l.particleToString(i.position,t));var n=null===(o=this.swarmOfSteps[r])||void 0===o?void 0:o.particles[e];if(n){for(var c=0;c0&&(T.current=Object(h.a)(H.current),D(!0)))}):void 0}),[c]),Object(r.useEffect)((function(){A.current=s,s?(cancelAnimationFrame(v.current),Tf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",x))):(Tf.setState((function(e){e.evolutionPaused=!1})),R())}),[s]);var z=function(){if(d){Tf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),b.current=!1;var e=u(V.SolarPanel,d.id);H.current.length=0;var l,a=Object(f.a)(e);try{for(a.s();!(l=a.n()).done;){var o=l.value;H.current.push(JSON.parse(JSON.stringify(o)))}}catch(s){a.e(s)}finally{a.f()}T.current=[];var i,r=[],n=Object(f.a)(e);try{for(n.s();!(i=n.n()).done;){var c=i.value;T.current.push(JSON.parse(JSON.stringify(c))),r.push(c.label)}}catch(s){n.e(s)}finally{n.f()}T.current.length>0?(P.current=new dW(T.current,d,w.objectiveFunctionType,w.swarmSize,w.vmax,w.maximumSteps,w.convergenceThreshold,w.searchMethod,w.localSearchRadius),P.current.inertia=w.inertia,P.current.cognitiveCoefficient=w.cognitiveCoefficient,P.current.socialCoefficient=w.socialCoefficient,S.current=0,j.current=!1,m(r),P.current.startEvolving(),t((function(e){e.viewState.showEvolutionPanel=!0,e.selectedFloatingWindow="solarPanelOptimizationResult"}))):Qh(me.t("message.EncounterEvolutionError",x))}};Object(r.useEffect)((function(){P.current&&y&&(j.current=P.current.updateParticle(S.current%w.swarmSize,function(){var e=0;switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:var t,l=Pf.getState().dailyPvYield,a=Object(f.a)(l);try{for(a.s();!(t=a.n()).done;){var i=t.value;for(var r in i)i.hasOwnProperty(r)&&"Total"===r&&(e+=i[r])}}catch(h){a.e(h)}finally{a.f()}break;case W.YEARLY_TOTAL_OUTPUT:var n,c=Pf.getState().yearlyPvYield,s=Object(f.a)(c);try{for(s.s();!(n=s.n()).done;){var d=n.value;for(var u in d)d.hasOwnProperty(u)&&"Total"===u&&(e+=d[u])}}catch(h){s.e(h)}finally{s.f()}e*=12/o}return e}()),C(),S.current++,P.current.outsideStepCounter=Math.floor(S.current/w.swarmSize),v.current=requestAnimationFrame(R))}),[y]);var R=function(){if(P.current&&n===I.PARTICLE_SWARM_OPTIMIZATION&&c&&!A.current){if(j.current||P.current.outsideStepCounter>=w.maximumSteps){if(cancelAnimationFrame(v.current),b.current=!0,P.current.applyFittest(),C(),D(!0),Kh(me.t("message.EvolutionCompleted",x)+"\n"+(j.current?me.t("message.ConvergenceThresholdHasBeenReached",x):me.t("message.MaximumNumberOfStepsHasBeenReached",x))),l&&P.current){var e=P.current.swarm.bestPositionOfSwarm,a=P.current.swarm.bestFitness;e&&a&&t((function(t){var l;t.actionInfo={name:"Particle Swarm Optimization for Solar Panel Tilt Angle Completed",result:dW.particleToString(e,a),steps:null===(l=P.current)||void 0===l?void 0:l.outsideStepCounter,timestamp:(new Date).getTime()}}))}return}P.current.translateParticle(S.current%w.swarmSize),D(!1)}},D=function(e){Tf.setState((function(t){if(T.current)switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case W.YEARLY_TOTAL_OUTPUT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){if(T.current){switch(w.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case W.YEARLY_TOTAL_OUTPUT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}var t,l=Object(f.a)(e.elements);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.SolarPanel){var o,i=a,r=Object(f.a)(T.current);try{for(r.s();!(o=r.n()).done;){var n=o.value;if(i.id===n.id){i.tiltAngle=n.tiltAngle;break}}}catch(c){r.e(c)}finally{r.f()}}}}catch(c){l.e(c)}finally{l.f()}}})),e&&Tf.setState((function(e){e.runEvolution=!1,e.evolutionInProgress=!1,e.objectiveEvaluationIndex=0}))},C=function(){if(P.current){for(var e=[],t=0;t0){var s=P.current.swarmOfSteps[t-1];if(s)for(var d=0,u=0;u0&&e.push(l)}p(e)}};return Object(gf.jsx)(gf.Fragment,{})},fW=n.a.memo(uW),hW=function(e){Object(Re.a)(l,e);var t=Object(De.a)(l);function l(e,a,o,i,r,n,c,s,d,u,f,h,p,y,g,m,w,x,v,b,A,T,P){var S;if(Object(He.a)(this,l),(S=t.call(this,d,u,f,h,p,3,y,g,m)).polygon=void 0,S.pvModel=void 0,S.orientation=$.landscape,S.rowAxis=ee.leftRight,S.relativeMargin=.01,S.poleHeight=2,S.poleSpacing=5,S.bounds=void 0,S.solarPanelCount=0,S.solarRackCount=0,S.minimumInterRowSpacing=2,S.maximumInterRowSpacing=10,S.minimumRowsPerRack=1,S.maximumRowsPerRack=6,S.minimumTiltAngle=-vt,S.maximumTiltAngle=vt,S.margin=0,S.polygon=s,S.pvModel=e,S.rowAxis=a,S.orientation=o,S.poleHeight=i,S.poleSpacing=r,S.minimumInterRowSpacing=w,S.maximumInterRowSpacing=x,S.minimumRowsPerRack=v,S.maximumRowsPerRack=b,S.minimumTiltAngle=A,S.maximumTiltAngle=T,S.margin=P,S.setInterRowSpacingBounds(),n&&n.length>0){var j=n[0];if(n.length>1){var H=S.swarm.particles[0];H.position[0]=S.maximumTiltAngle===S.minimumTiltAngle?0:(j.tiltAngle-S.minimumTiltAngle)/(S.maximumTiltAngle-S.minimumTiltAngle);var z=n[1],R=c?c.interRowSpacing:S.rowAxis===ee.upDown?Math.abs(j.cx-z.cx)*S.foundation.lx:Math.abs(j.cy-z.cy)*S.foundation.ly,D=S.maximumInterRowSpacing===S.minimumInterRowSpacing?0:(R-S.minimumInterRowSpacing)/(S.maximumInterRowSpacing-S.minimumInterRowSpacing);D<0?D=0:D>1&&(D=1),H.position[1]=D;var M=c?c.rowsPerRack:Math.max(1,Math.round(j.ly/(j.orientation===$.portrait?e.length:e.width))),W=S.maximumRowsPerRack===S.minimumRowsPerRack?0:(M-S.minimumRowsPerRack)/(S.maximumRowsPerRack-S.minimumRowsPerRack);W<0?W=0:W>1&&(W=1),H.position[2]=W}}return S}return Object(Fe.a)(l,[{key:"setInterRowSpacingBounds",value:function(){this.bounds=Tw.calculatePolygonBounds(this.polygon.vertices)}},{key:"applyFittest",value:function(){this.swarm.bestPositionOfSwarm&&console.log("Best: "+this.particleToString(this.swarm.bestPositionOfSwarm,this.swarm.bestFitness)+", rack count: "+this.solarRackCount+", panel count: "+this.solarPanelCount)}},{key:"getObjectiveUnit",value:function(){switch(this.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:return"kWh";case W.YEARLY_PROFIT:case W.DAILY_PROFIT:return"dollars"}return null}},{key:"particleToString",value:function(e,t){var l="F("+Tw.toDegrees(e[0]*(this.maximumTiltAngle-this.minimumTiltAngle)+this.minimumTiltAngle).toFixed(3)+"\xb0, ";return l+=(e[1]*(this.maximumInterRowSpacing-this.minimumInterRowSpacing)+this.minimumInterRowSpacing).toFixed(3)+"m, ",(l+=Math.floor(e[2]*(this.maximumRowsPerRack-this.minimumRowsPerRack)+this.minimumRowsPerRack)+")")+" = "+t.toFixed(5)+" "+this.getObjectiveUnit()}},{key:"startEvolving",value:function(){this.outsideStepCounter=0,this.computeCounter=0,this.bestPositionOfSteps.fill(null),this.bestFitnessOfSteps.fill(0),this.setInterRowSpacingBounds()}},{key:"translateParticleByIndex",value:function(e){return this.translatePosition(this.swarm.particles[e].position)}},{key:"translateBest",value:function(){return this.swarm.bestPositionOfSwarm?this.translatePosition(this.swarm.bestPositionOfSwarm):[]}},{key:"translatePosition",value:function(e){if(!this.bounds)return[];var t=e[0]*(this.maximumTiltAngle-this.minimumTiltAngle)+this.minimumTiltAngle,l=e[1]*(this.maximumInterRowSpacing-this.minimumInterRowSpacing)+this.minimumInterRowSpacing,a=Math.floor(e[2]*(this.maximumRowsPerRack-this.minimumRowsPerRack)+this.minimumRowsPerRack),o=XS.create(this.polygon,this.foundation,this.pvModel,this.orientation,t,a,l,this.rowAxis,this.poleHeight,this.poleSpacing,this.margin);if(this.solarPanelCount=0,this.solarRackCount=o.length,o.length>0){var i,r=Object(f.a)(o);try{for(r.s();!(i=r.n()).done;){var n=i.value;this.solarPanelCount+=Tw.countSolarPanelsOnRack(n,this.pvModel)}}catch(c){r.e(c)}finally{r.f()}}return o}},{key:"updateParticle",value:function(e,t){var l=this.swarm.particles.length;if(!this.converged){var a,o=this.swarm.particles[e];o.fitness=t,0===this.computeCounter&&0===e&&(this.bestPositionOfSteps[0]=Object(h.a)(o.position),this.bestFitnessOfSteps[0]=t);var i=Math.floor(this.computeCounter/l);console.log("Step "+(i+1)+", particle "+e+" : "+this.particleToString(o.position,t)+", rack count: "+this.solarRackCount+", panel count: "+this.solarPanelCount);var r=null===(a=this.swarmOfSteps[i])||void 0===a?void 0:a.particles[e];if(r){for(var n=0;n0&&g(u.id,!1),O.current.length>0&&(C.current=Object(h.a)(O.current),E(!0))}),100))}):void 0}),[c]),Object(r.useEffect)((function(){H.current=s,s?(cancelAnimationFrame(S.current),Tf.setState((function(e){e.evolutionPaused=!0})),Kh(me.t("message.EvolutionPaused",F))):(Tf.setState((function(e){e.evolutionPaused=!1})),L())}),[s]);var Y=function(){var e,l,a,o,i,r;if(u&&k){Tf.setState((function(e){e.evolutionInProgress=!0,e.objectiveEvaluationIndex=0})),j.current=!1;var n=p(V.SolarPanel,k.id);O.current.length=0;var c,s=Object(f.a)(n);try{for(s.s();!(c=s.n()).done;){var d=c.value;O.current.push(JSON.parse(JSON.stringify(d)))}}catch(h){s.e(h)}finally{s.f()}z.current=new hW(y(null!==(e=A.pvModelName)&&void 0!==e?e:"CS6X-355P-FG"),null!==(l=A.rowAxis)&&void 0!==l?l:ee.leftRight,null!==(a=A.orientation)&&void 0!==a?a:$.landscape,null!==(o=A.poleHeight)&&void 0!==o?o:1,null!==(i=A.poleSpacing)&&void 0!==i?i:3,O.current,P,u,k,b.objectiveFunctionType,b.swarmSize,b.vmax,b.maximumSteps,b.convergenceThreshold,b.searchMethod,b.localSearchRadius,A.minimumInterRowSpacing,A.maximumInterRowSpacing,A.minimumRowsPerRack,A.maximumRowsPerRack,A.minimumTiltAngle,A.maximumTiltAngle,null!==(r=A.margin)&&void 0!==r?r:0),z.current.inertia=b.inertia,z.current.cognitiveCoefficient=b.cognitiveCoefficient,z.current.socialCoefficient=b.socialCoefficient,R.current=0,D.current=!1,v(["Tilt Angle","Inter-Row Spacing","Rack Width"]),z.current.startEvolving(),t((function(e){e.viewState.showEvolutionPanel=!0,e.selectedFloatingWindow="solarPanelOptimizationResult"}))}};Object(r.useEffect)((function(){z.current&&w&&(D.current=z.current.updateParticle(R.current%b.swarmSize,function(){var e,t=0;switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:var l,a=Pf.getState().dailyPvYield,i=Object(f.a)(a);try{for(i.s();!(l=i.n()).done;){var r=l.value;for(var n in r)r.hasOwnProperty(n)&&"Total"===n&&(t+=r[n])}}catch(y){i.e(y)}finally{i.f()}break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:var c,s=Pf.getState().yearlyPvYield,d=Object(f.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;for(var h in u)u.hasOwnProperty(h)&&"Total"===h&&(t+=u[h])}}catch(y){d.e(y)}finally{d.f()}t*=12/o}var p=null===(e=z.current)||void 0===e?void 0:e.solarPanelCount;switch(b.objectiveFunctionType){case W.DAILY_AVERAGE_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:p&&(t/=p);break;case W.DAILY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit);break;case W.YEARLY_PROFIT:t*=T.electricitySellingPrice,p&&(t-=p*T.operationalCostPerUnit*365)}return t}()),U(),R.current++,z.current.outsideStepCounter=Math.floor(R.current/b.swarmSize),S.current=requestAnimationFrame(L))}),[w]);var L=function(){if(z.current&&n===I.PARTICLE_SWARM_OPTIMIZATION&&c&&!H.current){if(D.current||z.current.outsideStepCounter>=b.maximumSteps){if(cancelAnimationFrame(S.current),j.current=!0,C.current.length>0&&g(u.id,!1),C.current=z.current.translateBest(),z.current.applyFittest(),U(),E(!0),Kh(me.t("message.EvolutionCompleted",F)+"\n"+(D.current?me.t("message.ConvergenceThresholdHasBeenReached",F):me.t("message.MaximumNumberOfStepsHasBeenReached",F))),z.current){var e=z.current.swarm.bestPositionOfSwarm,a=z.current.swarm.bestFitness;if(e&&a){var o=e[0]*(A.maximumTiltAngle-A.minimumTiltAngle)+A.minimumTiltAngle,i=e[1]*(A.maximumInterRowSpacing-A.minimumInterRowSpacing)+A.minimumInterRowSpacing,r=Math.floor(e[2]*(A.maximumRowsPerRack-A.minimumRowsPerRack)+A.minimumRowsPerRack);t((function(e){e.solarPanelArrayLayoutParams.tiltAngle=o,e.solarPanelArrayLayoutParams.interRowSpacing=i,e.solarPanelArrayLayoutParams.rowsPerRack=r,e.solarPanelArrayLayoutParams.orientation=A.orientation,e.solarPanelArrayLayoutParams.poleHeight=A.poleHeight})),l&&t((function(t){var l,o;t.actionInfo={name:"Particle Swarm Optimization for Solar Panel Array Layout Completed",result:null===(l=z.current)||void 0===l?void 0:l.particleToString(e,a),steps:null===(o=z.current)||void 0===o?void 0:o.outsideStepCounter,timestamp:(new Date).getTime()}}))}}return}g(u.id,!1),setTimeout((function(){z.current&&(C.current=z.current.translateParticleByIndex(R.current%b.swarmSize)),E(!1)}),100)}},E=function(e){Tf.setState((function(t){switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:e?t.runDailySimulationForSolarPanelsLastStep=!0:t.runDailySimulationForSolarPanels=!0;break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:e?t.runYearlySimulationForSolarPanelsLastStep=!0:t.runYearlySimulationForSolarPanels=!0}})),t((function(e){var t;switch(b.objectiveFunctionType){case W.DAILY_TOTAL_OUTPUT:case W.DAILY_AVERAGE_OUTPUT:case W.DAILY_PROFIT:e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1);break;case W.YEARLY_TOTAL_OUTPUT:case W.YEARLY_AVERAGE_OUTPUT:case W.YEARLY_PROFIT:e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}(t=e.elements).push.apply(t,Object(h.a)(C.current))})),e&&Tf.setState((function(e){e.runEvolution=!1,e.evolutionInProgress=!1,e.objectiveEvaluationIndex=0}))},U=function(){if(z.current){for(var e=[],t=0;t0){var n=z.current.swarmOfSteps[t-1];if(n)for(var c=0,s=0;s0&&e.push(l)}m(e)}};return Object(gf.jsx)(gf.Fragment,{})},yW=n.a.memo(pW),gW=function(){var e=Ew(cs),t=Ew(Cu),l=Ew(Fu);return Object(Se.f)().gl.domElement.style.cursor=e!==V.None||l||t?"crosshair":"default",null},mW=n.a.memo(gW),wW=function(e){var t=e.width,l=void 0===t?400:t,a=e.height,n=void 0===a?400:a,c=Ew(si),s=Ew(Sr),d=Ew(i.latitude),h=Ew(i.longitude),p=Ew(o.mapZoom),y=Ew(o.mapTilt),g=Ew(o.mapType),m=Object(r.useState)(null),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useCallback)((function(e){v(e)}),[]),A=Object(r.useCallback)((function(){v(null)}),[]),T=function(){var e=new google.maps.LatLng(d,h);(new google.maps.Geocoder).geocode({location:e},(function(e,t){if(t===google.maps.GeocoderStatus.OK&&e&&e[0].address_components){c((function(t){t.world.address=e[0].formatted_address}));var l,a=Object(f.a)(e[0].address_components);try{var o=function(){var e=l.value;if("country"===e.types[0])return c((function(t){t.world.countryCode=e.short_name})),"break"};for(a.s();!(l=a.n()).done;){if("break"===o())break}}catch(i){a.e(i)}finally{a.f()}}})).then((function(){}))},P=Object(Ly.throttle)((function(){if(x){var e=x.getCenter();if(e){var t=e.lat(),l=e.lng();if(t!==d||l!==h){T();var a={name:"Set Location",timestamp:Date.now(),oldLatitude:d,newLatitude:t,oldLongitude:h,newLongitude:l,undo:function(){c((function(e){e.world.latitude=a.oldLatitude,e.world.longitude=a.oldLongitude}))},redo:function(){c((function(e){e.world.latitude=a.newLatitude,e.world.longitude=a.newLongitude}))}};s(a),c((function(e){e.world.latitude=t,e.world.longitude=l}))}}}}),200,{leading:!1,trailing:!0}),S=Object(Ly.throttle)((function(){if(x){var e=x.getZoom();if(void 0!==e&&e!==p){T();var t={name:"Zoom Map",timestamp:Date.now(),oldValue:p,newValue:e,undo:function(){c((function(e){e.viewState.mapZoom=t.oldValue}))},redo:function(){c((function(e){e.viewState.mapZoom=t.newValue}))}};s(t),c((function(t){t.viewState.mapZoom=e}))}}}),200,{leading:!1,trailing:!0});return Object(gf.jsx)(HR.a,{mapContainerStyle:{border:"1px solid",width:l+"px",height:n+"px"},mapTypeId:g,center:{lat:d,lng:h},zoom:p,tilt:y,onLoad:b,onUnmount:A,onCenterChanged:P,onZoomChanged:S,onTiltChanged:function(){if(x){var e=x.getTilt();if(void 0!==e&&e!==y){var t={name:"Tilt Map",timestamp:Date.now(),oldValue:y,newValue:e,undo:function(){c((function(e){e.viewState.mapTilt=t.oldValue}))},redo:function(){c((function(e){e.viewState.mapTilt=t.newValue}))}};s(t),c((function(t){t.viewState.mapTilt=e}))}}},onMapTypeIdChanged:function(){if(x){var e=x.getMapTypeId();if(void 0!==e&&e!==g){var t={name:"Change Map Type",timestamp:Date.now(),oldValue:g,newValue:e,undo:function(){c((function(e){e.viewState.mapType=t.oldValue,e.viewState.groundImageType=e.viewState.mapType}))},redo:function(){c((function(e){e.viewState.mapType=t.newValue,e.viewState.groundImageType=e.viewState.mapType}))}};s(t),c((function(t){t.viewState.mapType=e,t.viewState.groundImageType=e}))}}}})},xW=n.a.memo(wW),vW=["places"],bW=mv.a.div(dM||(dM=Object(gv.a)(["\n position: fixed;\n top: 40px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n"]))),AW=mv.a.div(uM||(uM=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n width: 410px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n"]))),TW=mv.a.div(fM||(fM=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),PW=function(){var e=Ew(Vi),t=Ew(si),l=Ew(Sr),a=Ew(i.address),c=Ew(i.latitude),s=Ew(i.longitude),d=Ew(o.mapPanelX),h=Ew(o.mapPanelY),p=Ew(o.groundImage),y=Ew(o.mapZoom),g=Ew(Ni),m=n.a.useRef(null),w=Object(r.useRef)(),x=Object(r.useRef)(null),v=x.current?x.current.clientWidth+40:460,b=x.current?x.current.clientHeight+40:600,A=Object(r.useState)({x:isNaN(d)?0:Math.min(d,window.innerWidth-v),y:isNaN(h)?0:Math.min(h,window.innerHeight-b)}),T=Object(u.a)(A,2),P=T[0],S=T[1],j=Object(r.useState)(!1),H=Object(u.a)(j,2),z=H[0],R=H[1],D={lng:e};Object(r.useEffect)((function(){var e=function(){S({x:Math.min(d,window.innerWidth-v),y:Math.min(h,window.innerHeight-b)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]);var M=Object(HR.f)({id:"google-map-script",googleMapsApiKey:"AIzaSyCX6AmhM9d6R1ne9E7redd86YEahX_2Scs",libraries:vW}),W=M.isLoaded,I=M.loadError,C=function(){var e={name:"Close Maps",timestamp:Date.now(),undo:function(){t((function(e){e.viewState.showMapPanel=!0}))},redo:function(){t((function(e){e.viewState.showMapPanel=!1}))}};l(e),t((function(e){e.viewState.showMapPanel=!1}))};return Object(gf.jsx)(JT.a,{nodeRef:m,handle:".handle",bounds:"parent",axis:"both",position:P,onDrag:function(e,t){S({x:Math.min(t.x,window.innerWidth-v),y:Math.min(t.y,window.innerHeight-b)})},onStop:function(e,l){t((function(e){e.viewState.mapPanelX=Math.min(l.x,window.innerWidth-v),e.viewState.mapPanelY=Math.min(l.y,window.innerHeight-b)}))},onMouseDown:function(){t((function(e){e.selectedFloatingWindow="mapPanel"}))},children:Object(gf.jsx)(bW,{ref:m,style:{zIndex:"mapPanel"===g?Ke:10},children:Object(gf.jsxs)(AW,{ref:x,children:[Object(gf.jsxs)(TW,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("word.Location",D)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){C()},onMouseDown:function(){C()},children:me.t("word.Close",D)})]}),Object(gf.jsxs)(wv.b,{direction:"vertical",children:[Object(gf.jsx)(wv.b,{style:{paddingTop:"10px"},align:"center",size:20,children:Object(gf.jsxs)(wv.b,{direction:"horizontal",children:[Object(gf.jsx)(wv.b,{children:me.t("mapPanel.ImageOnGround",D)+":"}),Object(gf.jsx)(eb.a,{title:"Show ground image",checked:p,onChange:function(e){var a={name:"Show Ground Image",timestamp:Date.now(),checked:e,undo:function(){t((function(e){e.viewState.groundImage=!a.checked}))},redo:function(){t((function(e){e.viewState.groundImage=a.checked}))}};l(a),t((function(t){t.viewState.groundImage=e}))}})]})}),W&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{children:Object(gf.jsx)(HR.e,{onLoad:function(e){w.current=e},onPlacesChanged:function(){var e,o=null===(e=w.current)||void 0===e?void 0:e.getPlaces();if(o&&o.length>0){var i=o[0].geometry;if(i&&i.location){var r={name:"Set Location",timestamp:Date.now(),oldLatitude:c,newLatitude:i.location.lat(),oldLongitude:s,newLongitude:i.location.lng(),oldAddress:a,newAddress:o[0].formatted_address,undo:function(){t((function(e){e.world.latitude=r.oldLatitude,e.world.longitude=r.oldLongitude,e.world.address=r.oldAddress})),R(!z)},redo:function(){t((function(e){e.world.latitude=r.newLatitude,e.world.longitude=r.newLongitude,e.world.address=r.newAddress})),R(!z)}};l(r),t((function(e){if(i.location&&(e.world.latitude=i.location.lat(),e.world.longitude=i.location.lng()),o[0]&&(e.world.address=o[0].formatted_address,o[0].address_components)){var t,l=Object(f.a)(o[0].address_components);try{for(l.s();!(t=l.n()).done;){var a=t.value;if("country"===a.types[0]){e.world.countryCode=a.short_name;break}}}catch(r){l.e(r)}finally{l.f()}}}))}}},children:Object(gf.jsx)("input",{type:"text",placeholder:a,style:{boxSizing:"border-box",border:"1px solid transparent",width:"400px",height:"32px",padding:"0 12px",borderRadius:"3px",boxShadow:"0 2px 6px rgba(0, 0, 0, 0.3)",fontSize:"14px",outline:"none",textOverflow:"ellipses",position:"relative"}})})})}),W?Object(gf.jsx)(wv.b,{children:Object(gf.jsxs)("div",{children:[Object(gf.jsx)(xW,{width:400,height:400}),Object(gf.jsxs)("p",{style:{paddingTop:"10px"},children:[me.t("mapPanel.Coordinates",D)+":"," (",c.toFixed(4),"\xb0,"," ",s.toFixed(4),"\xb0), \xa0",me.t("mapPanel.Zoom",D)+":"," ",y]})]})}):Object(gf.jsx)(Hv,{}),I&&Object(gf.jsx)(wv.b,{children:Object(gf.jsx)("div",{children:"Map cannot be loaded right now, sorry."})})]})]})})})},SW=n.a.memo(PW),jW=l(348),HW=l(821),zW=l(68),RW=l.n(zW),DW=mv.a.div(hM||(hM=Object(gv.a)(["\n position: absolute;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 11;\n"]))),MW=mv.a.div(pM||(pM=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 680px;\n padding: 0;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n"]))),WW=mv.a.div(yM||(yM=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),IW=function(){var e=Ew(Vi),t=Ew(si),l=Ew(Sr),a=Ew(i.date),c=Ew(i.latitude),s=Ew(i.address),d=Tf(Mr),f=Ew(Wr),h=Tf(Lr),p=Ew(o.showSunAngles),y=Ew(o.heliodon),g=Ew(o.heliodonPanelX),m=Ew(o.heliodonPanelY),w=Ew(Ni),x=n.a.useRef(null),v=Object(r.useRef)(0),b=Object(r.useRef)(-1),A=Object(r.useRef)(null),T=A.current?A.current.clientWidth+40:680,P=A.current?A.current.clientHeight+100:250,S=Object(r.useState)({x:isNaN(g)?0:Math.max(g,T-window.innerWidth),y:isNaN(m)?0:Math.min(m,window.innerHeight-P)}),j=Object(u.a)(S,2),H=j[0],z=j[1],R=Object(r.useState)(!1),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useMemo)((function(){return new Date(a)}),[a]),C=Object(r.useMemo)((function(){return Ty(I,c)}),[I,c]),O={lng:e};Object(r.useEffect)((function(){var e=function(){z({x:Math.max(g,T-window.innerWidth),y:Math.min(m,window.innerHeight-P)})};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),Object(r.useEffect)((function(){return v.current=requestAnimationFrame(F),function(){cancelAnimationFrame(v.current)}}),[d]),Object(r.useEffect)((function(){d&&0===C.sunset&&(cancelAnimationFrame(v.current),Tf.setState((function(e){e.animateSun=!1})))}),[C.sunset]);var F=function e(){var t=Ew.getState().animate24Hours;if(d){v.current=requestAnimationFrame(e);var l=Date.now();if(l-b.current>100){var a=I.getDate(),o=I.getMinutes()+60*I.getHours(),i=Ty(I,Ew.getState().world.latitude);!t&&o>i.sunset&&I.setHours(i.sunrise/60,I.getMinutes()+15),I.setHours(I.getHours(),I.getMinutes()+15),I.setDate(a),k(I,!1),b.current=l}}else cancelAnimationFrame(v.current)},k=function(e,o){var i=new Date(I);if(i.setHours(e.getHours(),e.getMinutes()),o){var r={name:"Set Time",timestamp:Date.now(),oldValue:a,newValue:i.toLocaleString(),undo:function(){t((function(e){e.world.date=r.oldValue}))},redo:function(){t((function(e){e.world.date=r.newValue}))}};l(r)}t((function(e){e.world.date=i.toLocaleString("en-US")}))},Y=function(){var e={name:"Close Sun and Time Settings Panel",timestamp:Date.now(),undo:function(){t((function(e){e.viewState.showHeliodonPanel=!0}))},redo:function(){t((function(e){e.viewState.showHeliodonPanel=!1}))}};l(e),t((function(e){e.viewState.showHeliodonPanel=!1}))},L=Object(r.useRef)(Object(Ly.throttle)((function(e){var a={name:"Set Latitude",timestamp:Date.now(),oldLatitude:c,newLatitude:e,oldAddress:s,newAddress:"",undo:function(){t((function(e){e.world.latitude=a.oldLatitude,e.world.address=a.oldAddress})),W(!M)},redo:function(){t((function(e){e.world.latitude=a.newLatitude,e.world.address=a.newAddress})),W(!M)}};l(a),t((function(t){t.world.latitude=e,t.world.address=""}))}),500,{leading:!1,trailing:!0}));return Object(gf.jsx)(JT.a,{nodeRef:x,handle:".handle",bounds:"parent",axis:"both",position:H,onDrag:function(e,t){z({x:Math.max(t.x,T-window.innerWidth),y:Math.min(t.y,window.innerHeight-P)})},onStop:function(e,l){t((function(e){e.viewState.heliodonPanelX=Math.max(l.x,T-window.innerWidth),e.viewState.heliodonPanelY=Math.min(l.y,window.innerHeight-P)}))},onMouseDown:function(){t((function(e){e.selectedFloatingWindow="heliodonPanel"}))},children:Object(gf.jsx)(DW,{ref:x,style:{zIndex:"heliodonPanel"===w?Ke:11},children:Object(gf.jsxs)(MW,{ref:A,children:[Object(gf.jsxs)(WW,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("heliodonPanel.SunAndTimeSettings",O)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){Y()},onMouseDown:function(){Y()},children:me.t("word.Close",O)})]}),Object(gf.jsxs)(wv.b,{style:{padding:"20px"},align:"baseline",size:20,children:[Object(gf.jsxs)("div",{children:[me.t("menu.settings.Heliodon",O),Object(gf.jsx)("br",{}),Object(gf.jsx)(eb.a,{checked:y,onChange:function(e){var a={name:"Show Heliodon",timestamp:Date.now(),checked:!y,undo:function(){t((function(e){e.viewState.heliodon=!a.checked,e.viewState.heliodon&&e.updateSceneRadius()}))},redo:function(){t((function(e){e.viewState.heliodon=a.checked,e.viewState.heliodon&&e.updateSceneRadius()}))}};l(a),t((function(t){t.viewState.heliodon=e,t.viewState.heliodon&&t.updateSceneRadius()}))}})]}),y&&Object(gf.jsxs)("div",{children:[Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("heliodonPanel.SunAngles",O)}),Object(gf.jsx)("br",{}),Object(gf.jsx)(eb.a,{checked:p,onChange:function(e){var a={name:"Show Sun Angles",timestamp:Date.now(),checked:!p,undo:function(){t((function(e){e.viewState.showSunAngles=!a.checked}))},redo:function(){t((function(e){e.viewState.showSunAngles=a.checked}))}};l(a),t((function(t){t.viewState.showSunAngles=e}))}})]}),C.sunset>0&&!h&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("div",{children:[me.t("word.Animate",O),Object(gf.jsx)("br",{}),Object(gf.jsx)(eb.a,{checked:d,onChange:function(e){var t={name:"Animate Heliodon",timestamp:Date.now(),checked:!d,undo:function(){Tf.setState((function(e){e.animateSun=!t.checked}))},redo:function(){Tf.setState((function(e){e.animateSun=t.checked}))}};l(t),Tf.setState((function(t){t.animateSun=e}))}})]}),d&&Object(gf.jsxs)("div",{children:[Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("heliodonPanel.TwentyFourHours",O)}),Object(gf.jsx)("br",{}),Object(gf.jsx)(eb.a,{checked:f,onChange:function(e){var a={name:"Animate 24 Hours",timestamp:Date.now(),checked:!f,undo:function(){t((function(e){e.animate24Hours=!a.checked}))},redo:function(){t((function(e){e.animate24Hours=a.checked}))}};l(a),t((function(t){t.animate24Hours=e}))}})]})]}),Object(gf.jsxs)("div",{children:[me.t("word.Date",O),Object(gf.jsx)("br",{}),Object(gf.jsx)(jW.a,{disabled:h,value:RW()(I),onChange:function(e){if(e){var o=new Date(I),i=e.toDate();o.setFullYear(i.getFullYear()),o.setMonth(i.getMonth()),o.setDate(i.getDate());var r={name:"Set Date",timestamp:Date.now(),oldValue:a,newValue:o.toString(),undo:function(){t((function(e){e.world.date=r.oldValue}))},redo:function(){t((function(e){e.world.date=r.newValue}))}};l(r),t((function(e){e.world.date=o.toLocaleString("en-US")}))}}})]}),Object(gf.jsxs)("div",{children:[me.t("word.Time",O),Object(gf.jsx)("br",{}),Object(gf.jsx)(HW.a,{disabled:h,value:RW()(I,"HH:mm"),format:"HH:mm",onChange:function(e){e&&(null===k||void 0===k||k(e.toDate(),!0))}})]}),!h&&Object(gf.jsxs)("div",{children:[me.t("word.Latitude",O),": ",c.toFixed(2),"\xb0",Object(gf.jsx)($S.a,{disabled:h,style:{width:"110px"},marks:{"-90":"-90\xb0",0:"0\xb0",90:"90\xb0"},min:-90,max:90,value:c,tooltipVisible:!1,onChange:L.current})]})]})]})})})},CW=n.a.memo(IW),OW=l(285),FW=l(824),kW=l(825),YW=l(239),LW=l(826),EW=l(554),UW=l(135),NW=l(125),VW=l(136),JW=l(234),GW=["title","titleId"];function XW(){return(XW=Object.assign||function(e){for(var t=1;t=0||(o[l]=e[l]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(o[l]=e[l])}return o}function KW(e,t){var l=e.title,a=e.titleId,o=BW(e,GW);return r.createElement("svg",XW({t:1613755944969,className:"icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg","p-id":5967,xmlnsXlink:"http://www.w3.org/1999/xlink",width:200,height:200,ref:t,"aria-labelledby":a},o),l?r.createElement("title",{id:a},l):null,gM||(gM=r.createElement("defs",null,r.createElement("style",{type:"text/css"}))),mM||(mM=r.createElement("path",{d:"M194.187431 235.50871m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z","p-id":5968})),wM||(wM=r.createElement("path",{d:"M347.505182 165.510915h552.305182v139.99559H347.505182z","p-id":5969})),xM||(xM=r.createElement("path",{d:"M194.187431 512.1129m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z","p-id":5970})),vM||(vM=r.createElement("path",{d:"M347.505182 442.115105h552.305182v139.99559H347.505182z","p-id":5971})),bM||(bM=r.createElement("path",{d:"M194.187431 788.49129m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z","p-id":5972})),AM||(AM=r.createElement("path",{d:"M347.505182 718.719294h552.305182v139.99559H347.505182z","p-id":5973})))}var qW,QW,ZW=r.forwardRef(KW),_W=(l.p,Object(mv.a)(ZW)(qW||(qW=Object(gv.a)(["\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n"])))),$W=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.changeHorizontalGrid,o=e.changeVerticalGrid,i={lng:Ew(Vi)},n=Object(r.useState)(!1),c=Object(u.a)(n,2),s=c[0],d=c[1],f=Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:t,onClick:function(){null===a||void 0===a||a(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",i)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:l,onClick:function(){null===o||void 0===o||o(!l)},children:me.t("menu.graph.ShowVerticalGridLines",i)})})]});return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(lb.a,{overlay:f,placement:"bottomRight",visible:s,onVisibleChange:function(e){d(e)},children:Object(gf.jsx)(_W,{style:{right:"32px"},onClick:function(e){e.stopPropagation()}})})})},eI=function(e){var t=e.type,l=e.dataSource,a=e.height,o=e.dataKeyAxisX,i=e.labelX,n=e.labelY,c=e.unitX,s=e.unitY,d=e.yMin,f=void 0===d?"auto":d,h=e.yMax,p=void 0===h?"auto":h,y=e.fractionDigits,g=void 0===y?2:y,m=e.referenceX,w=e.color,x=Object(r.useState)(0),v=Object(u.a)(x,2),b=v[0],A=v[1],T=Object(r.useState)(!0),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useState)(!0),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(null),W=Object(u.a)(M,2),I=W[0],C=W[1];Object(r.useEffect)((function(){if(l&&0!==l.length){var e=Array.isArray(l)?Object.keys(l[0]).length-1:Object.keys(l).length-1;b!==e&&A(e)}}),[l]);var O=Object(r.useMemo)((function(){for(var e=[],l=0;l1&&Object(gf.jsx)(JW.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(e){C(null)},onMouseEnter:function(e){C(e.dataKey)}})]})}),Object(gf.jsx)($W,{horizontalGrid:S,verticalGrid:R,changeHorizontalGrid:function(e){j(e)},changeVerticalGrid:function(e){D(e)}})]})})})},tI=l(290),lI=l(291),aI=l(827),oI=l(828),iI=["circle","square","triangle up","triangle down","triangle right","triangle left","star","diamond","hexagon"];!function(e){e[e.DOWN=0]="DOWN",e[e.UP=1]="UP",e[e.LEFT=2]="LEFT",e[e.RIGHT=3]="RIGHT"}(QW||(QW={}));var rI,nI,cI,sI,dI,uI,fI,hI,pI,yI,gI,mI,wI,xI,vI,bI,AI,TI,PI,SI,jI,HI,zI,RI,DI,MI,WI,II,CI,OI,FI,kI,YI,LI,EI,UI,NI,VI,JI,GI,XI,BI,KI,qI,QI,ZI,_I,$I,eC,tC,lC,aC,oC,iC,rC,nC,cC,sC,dC,uC,fC,hC,pC,yC,gC,mC,wC,xC,vC,bC,AC,TC,PC,SC,jC,HC,zC,RC,DC,MC,WC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);return t&&l&&i>0&&i%d===0?Object(gf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(gf.jsx)("circle",{cx:"0",cy:"0",r:"3",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})}):null},IC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);return t&&l&&i>0&&i%d===0?Object(gf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(gf.jsx)("rect",{x:"-3",y:"-3",width:"6",height:"6",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})}):null},CC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.direction,d=e.fillColor,u=Math.round(r.length/c);if(t&&l&&i>0&&i%u===0){var f;switch(s){case QW.UP:f="-4,2.5,4,2.5,0,-3.5";break;case QW.LEFT:f="2.5,4,2.5,-4,-3.5,0";break;case QW.RIGHT:f="-2.5,4,-2.5,-4,3.5,0";break;default:f="-4,-2.5,4,-2.5,0,3.5"}return Object(gf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(gf.jsx)("polygon",{points:f,style:{opacity:a,stroke:o,fill:null!==d&&void 0!==d?d:"white",strokeWidth:1}})})}return null},OC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);return t&&l&&i>0&&i%d===0?Object(gf.jsx)("svg",{x:t-10*n,y:l-10*n,width:20*n,height:20*n,viewBox:"-10 -10 20 20",children:Object(gf.jsx)("polygon",{points:"-3,0,0,5,3,0,0,-5",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})}):null},FC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);if(t&&l&&i>0&&i%d===0){var u=.05*n;return Object(gf.jsx)("svg",{x:t-100*u,y:l-100*u,width:300*u,height:300*u,viewBox:"0 0 300 300",children:Object(gf.jsx)("polygon",{points:"100,10 40,180 190,60 10,60 160,180",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})})}return null},kC=function(e){var t=e.cx,l=e.cy,a=e.opacity,o=e.stroke,i=e.index,r=e.points,n=e.scale,c=e.numberOfSymbols,s=e.fillColor,d=Math.round(r.length/c);if(t&&l&&i>0&&i%d===0){var u=.02*n;return Object(gf.jsx)("svg",{x:t-150*u,y:l-150*u,width:300*u,height:300*u,viewBox:"0 0 300 300",children:Object(gf.jsx)("polygon",{className:"hex",points:"300,150 225,280 75,280 0,150 75,20 225,20",style:{opacity:a,stroke:o,fill:null!==s&&void 0!==s?s:"white",strokeWidth:1}})})}return null},YC=function(e,t,l,a,o){switch(e){case"circle":return Object(gf.jsx)(WC,{scale:t,numberOfSymbols:l,opacity:a,fillColor:o});case"square":return Object(gf.jsx)(IC,{scale:t,numberOfSymbols:l,opacity:a,fillColor:o});case"triangle up":return Object(gf.jsx)(CC,{scale:1.1*t,numberOfSymbols:l,direction:QW.UP,opacity:a,fillColor:o});case"triangle down":return Object(gf.jsx)(CC,{scale:1.1*t,numberOfSymbols:l,direction:QW.DOWN,opacity:a,fillColor:o});case"triangle right":return Object(gf.jsx)(CC,{scale:1.1*t,numberOfSymbols:l,direction:QW.RIGHT,opacity:a,fillColor:o});case"triangle left":return Object(gf.jsx)(CC,{scale:1.1*t,numberOfSymbols:l,direction:QW.LEFT,opacity:a,fillColor:o});case"star":return Object(gf.jsx)(FC,{scale:1.25*t,numberOfSymbols:l,opacity:a,fillColor:o});case"diamond":return Object(gf.jsx)(OC,{scale:1.1*t,numberOfSymbols:l,opacity:a,fillColor:o});case"hexagon":return Object(gf.jsx)(kC,{scale:1.3*t,numberOfSymbols:l,opacity:a,fillColor:o})}},LC=Object(mv.a)(ZW)(rI||(rI=Object(gv.a)(["\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n"]))),EC=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.lineCount,o=e.lineWidth,i=e.symbolSize,n=e.changeHorizontalGrid,c=e.changeVerticalGrid,s=e.changeLineWidth,d=e.changeSymbolSize,f={lng:Ew(Vi)},h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.LineWidth",f)+":",Object(gf.jsx)($S.a,{min:0,max:10,tooltipVisible:!1,defaultValue:2*o,onChange:function(e){null===s||void 0===s||s(e/2)}})]}),Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.SymbolSize",f)+":",Object(gf.jsx)($S.a,{min:2,max:12,tooltipVisible:!1,defaultValue:5*i,onChange:function(e){null===d||void 0===d||d(e/5)}})]}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:t,onClick:function(){null===n||void 0===n||n(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",f)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:l,onClick:function(){null===c||void 0===c||c(!l)},children:me.t("menu.graph.ShowVerticalGridLines",f)})})]});return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(lb.a,{overlay:m,placement:"bottomRight",visible:y,onVisibleChange:function(e){g(e)},children:Object(gf.jsx)(LC,{style:{right:a>1?"25px":"32px"},onClick:function(e){e.stopPropagation()}})})})},UC=function(e){var t=e.type,l=e.chartType,a=void 0===l?Y.Line:l,o=e.selectedIndex,i=e.dataSource,n=e.labels,c=e.height,s=e.dataKeyAxisX,d=e.labelX,f=e.labelY,h=e.unitX,p=e.unitY,y=e.yMin,g=void 0===y?"auto":y,m=e.yMax,w=void 0===m?"auto":m,x=e.curveType,v=void 0===x?"linear":x,b=e.referenceX,A=e.fractionDigits,T=void 0===A?2:A,P=e.symbolCount,S=void 0===P?12:P,j=Object(r.useState)(0),H=Object(u.a)(j,2),z=H[0],R=H[1],D=Object(r.useState)(!0),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useState)(!0),O=Object(u.a)(C,2),F=O[0],k=O[1],E=Object(r.useState)(null),U=Object(u.a)(E,2),N=U[0],V=U[1],J=Object(r.useState)(2),G=Object(u.a)(J,2),X=G[0],B=G[1],K=Object(r.useState)(1),q=Object(u.a)(K,2),Q=q[0],Z=q[1];Object(r.useEffect)((function(){if(i&&0!==i.length){var e=Array.isArray(i)?Object.keys(i[0]).length-1:Object.keys(i).length-1;z!==e&&R(e)}else R(0)}),[z,i]);var _=Object(r.useMemo)((function(){for(var e,l=[],i=0;i0&&(s||e),isAnimationActive:!1},i))}return l}),[t,a,o,v,n,z,X,S,Q,N]),$=function(e){},ee=function(e){V(e.dataKey)},te=function(e){V(null)};return Object(gf.jsx)(gf.Fragment,{children:i&&Object(gf.jsx)("div",{id:"line-graph-"+d+"-"+f,style:{width:"100%",height:"".concat(c,"%"),position:"relative",direction:"ltr"},children:Object(gf.jsxs)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:[Object(gf.jsx)(FW.a,{width:"100%",height:"100%",children:a===Y.Area?Object(gf.jsxs)(aI.a,{data:i,onMouseDown:$,margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(YW.a,{formatter:function(e){return e.toFixed(T)+" "+p}}),Object(gf.jsx)(LW.a,{vertical:F,horizontal:W,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(EW.a,{x:b,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(UW.a,{dataKey:null!==s&&void 0!==s?s:d,fontSize:"10px",children:Object(gf.jsx)(NW.a,{value:d+(h?" ("+h+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(VW.a,{domain:[g,w],fontSize:"10px",children:Object(gf.jsx)(NW.a,{dx:-15,value:f+(p?" ("+p+")":""),offset:0,angle:-90,position:"center"})}),_,z>1&&Object(gf.jsx)(JW.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:te,onMouseEnter:ee})]}):Object(gf.jsxs)(oI.a,{data:i,onMouseDown:$,margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(YW.a,{formatter:function(e){return e.toFixed(T)+" "+p}}),Object(gf.jsx)(LW.a,{vertical:F,horizontal:W,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(EW.a,{x:b,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(UW.a,{dataKey:null!==s&&void 0!==s?s:d,fontSize:"10px",children:Object(gf.jsx)(NW.a,{value:d+(h?" ("+h+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(VW.a,{domain:[g,w],fontSize:"10px",children:Object(gf.jsx)(NW.a,{dx:-15,value:f+(p?" ("+p+")":""),offset:0,angle:-90,position:"center"})}),_,z>1&&Object(gf.jsx)(JW.a,{wrapperStyle:{fontSize:"11px"},iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:te,onMouseEnter:ee})]})}),Object(gf.jsx)(EC,{lineCount:z,symbolSize:Q,lineWidth:X,horizontalGrid:W,verticalGrid:F,changeHorizontalGrid:function(e){I(e)},changeVerticalGrid:function(e){k(e)},changeLineWidth:function(e){B(e)},changeSymbolSize:function(e){Z(e)}})]})})})},NC=mv.a.div(nI||(nI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n left: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n"]))),VC=mv.a.div(cI||(cI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 300px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n"]))),JC=mv.a.div(sI||(sI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),GC=function(e){var t,l=e.city,a=e.graphs,c=Ew(Vi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),f=Ew(Sr),h=new Date(Ew(i.date)),p=Ew(Cs),y=Ew(o.weatherPanelRect),g=Ew(Ni),m=n.a.useRef(null),w=Object(r.useRef)(null),x=Object(r.useRef)(),v=w.current?w.current.clientWidth+40:y?y.width+40:540,b=w.current?w.current.clientHeight+100:y?y.height+100:600,A=Object(r.useState)({x:y?Math.min(y.x,window.innerWidth-v):0,y:y?Math.min(y.y,window.innerHeight-b):0}),T=Object(u.a)(A,2),P=T[0],S=T[1],j={lng:c};Object(r.useEffect)((function(){S({x:Math.min(null===y||void 0===y?void 0:y.x,window.innerWidth-v),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-b)})}),[y,v,b]),Object(r.useEffect)((function(){var e=function(){S({x:Math.min(null===y||void 0===y?void 0:y.x,window.innerWidth-v),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-b)})};return window.addEventListener("resize",e),w.current&&(x.current||(x.current=new ResizeObserver((function(){d((function(e){w.current&&(e.viewState.weatherPanelRect||(e.viewState.weatherPanelRect=new Ot(0,0,500,500)),e.viewState.weatherPanelRect.width=w.current.offsetWidth,e.viewState.weatherPanelRect.height=w.current.offsetHeight)}))}))),x.current.observe(w.current)),function(){var t;window.removeEventListener("resize",e),null===(t=x.current)||void 0===t||t.disconnect()}}),[y,v,b]);var H=Object(r.useMemo)((function(){return a?Math.floor(100/a.length):100}),[a]),z=Object(r.useMemo)((function(){if(a){var e={};if(l){var t=p(l);t&&a.forEach((function(l){switch(e[l]=[],l){case L.MonthlyTemperatures:for(var a=0;a<12;a++)e[l].push({Month:it[a],Low:t.lowestTemperatures[a],High:t.highestTemperatures[a]});break;case L.SunshineHours:for(var o=0;o<12;o++)e[l].push({Month:it[o],Sunshine:t.sunshineHours[o]})}}))}return e}}),[a,l]),R=["NA",me.t("word.Temperature",j),me.t("word.Temperature",j),me.t("weatherPanel.SunshineHours",j)],D=["NA","\xb0C","\xb0C",me.t("word.Hour",j)],M=it[h.getMonth()],W=function(){var e={name:"Close Weather Panel",timestamp:Date.now(),undo:function(){d((function(e){e.viewState.showWeatherPanel=!0}))},redo:function(){d((function(e){e.viewState.showWeatherPanel=!1}))}};f(e),d((function(e){e.viewState.showWeatherPanel=!1}))};return Object(gf.jsx)(JT.a,{nodeRef:m,handle:".handle",bounds:"parent",axis:"both",position:P,onDrag:function(e,t){S({x:Math.min(t.x,window.innerWidth-v),y:Math.min(t.y,window.innerHeight-b)})},onStop:function(e,t){d((function(e){e.viewState.weatherPanelRect||(e.viewState.weatherPanelRect=new Ot(0,0,500,500)),e.viewState.weatherPanelRect.x=Math.min(t.x,window.innerWidth-v),e.viewState.weatherPanelRect.y=Math.min(t.y,window.innerHeight-b)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="weatherPanel"}))},children:Object(gf.jsx)(NC,{ref:m,style:{zIndex:"weatherPanel"===g?Ke:10},children:Object(gf.jsxs)(VC,{ref:w,style:{opacity:s,width:(y?y.width:500)+"px",height:(y?y.height:500)+"px"},children:[Object(gf.jsxs)(JC,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("word.Weather",j)+": "+((null===l||void 0===l?void 0:l.trim().endsWith(","))?null===l||void 0===l?void 0:l.trim().substring(0,(null===l||void 0===l?void 0:l.length)-2):l)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){W()},onMouseDown:function(){W()},children:me.t("word.Close",j)})]}),Object(gf.jsx)(gf.Fragment,{children:a.map((function(e){return e===L.SunshineHours?Object(gf.jsx)(eI,{type:e,dataSource:z[e],height:H,dataKeyAxisX:"Month",labelX:me.t("word.Month",j),labelY:R[e],unitY:D[e],yMin:0,fractionDigits:1,referenceX:M,color:"#FFD700"},e):Object(gf.jsx)(UC,{chartType:Y.Line,type:e,dataSource:z[e],height:H,dataKeyAxisX:"Month",labelX:me.t("word.Month",j),labelY:R[e],unitY:D[e],fractionDigits:1,referenceX:M},e)}))})]})})})},XC=n.a.memo(GC),BC=l(857),KC=l(858),qC=l(859),QC=l(860),ZC=["Daylight","Clearness"],_C=mv.a.div(dI||(dI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),$C=mv.a.div(uI||(uI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),eO=mv.a.div(fI||(fI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),tO=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),f=new Date(Ew(i.date)),h=Pf(Tu),p=Pf(Su),y=Ew(o.yearlyLightSensorPanelRect),g=Ew(ds),m=Ew(o.yearlyLightSensorPanelShowDaylight),w=Ew(o.yearlyLightSensorPanelShowClearness),x=Ew(Ni),v=Object(r.useState)(!0),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(null),S=Object(r.useRef)(),j=P.current?P.current.clientWidth+40:y?y.width+40:640,H=P.current?P.current.clientHeight+100:y?y.height+100:600,z=Object(r.useState)({x:y?Math.max(y.x,j-window.innerWidth):0,y:y?Math.min(y.y,window.innerHeight-H):0}),R=Object(u.a)(z,2),D=R[0],M=R[1],W=n.a.useRef(null),I={lng:a},C=it[f.getMonth()];Object(r.useEffect)((function(){M({x:Math.max(null===y||void 0===y?void 0:y.x,j-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-H)})}),[y,j,H]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===y||void 0===y?void 0:y.x,j-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-H)})};return window.addEventListener("resize",e),P.current&&(S.current||(S.current=new ResizeObserver((function(){d((function(e){P.current&&(e.viewState.yearlyLightSensorPanelRect||(e.viewState.yearlyLightSensorPanelRect=new Ot(0,0,600,500)),e.viewState.yearlyLightSensorPanelRect.width=P.current.offsetWidth,e.viewState.yearlyLightSensorPanelRect.height=P.current.offsetHeight)}))}))),S.current.observe(P.current)),function(){var t;window.removeEventListener("resize",e),null===(t=S.current)||void 0===t||t.disconnect()}}),[y,j,H]);var O=function(){d((function(e){e.viewState.showYearlyLightSensorPanel=!1,c&&(e.actionInfo={name:"Close Yearly Light Sensor Graph",timestamp:(new Date).getTime()})}))},F=me.t("word.Month",I),k=me.t("word.Radiation",I),E=!h||!h[0]||0===Object.keys(h[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:W,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-H)})},onStop:function(e,t){d((function(e){e.viewState.yearlyLightSensorPanelRect||(e.viewState.yearlyLightSensorPanelRect=new Ot(0,0,600,500)),e.viewState.yearlyLightSensorPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.yearlyLightSensorPanelRect.y=Math.min(t.y,window.innerHeight-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="yearlyLightSensorPanel"}))},children:Object(gf.jsx)(_C,{ref:W,style:{zIndex:"yearlyLightSensorPanel"===x?Ke:9},children:Object(gf.jsxs)($C,{ref:P,style:{opacity:s,width:(y?y.width:600)+"px",height:(y?y.height:500)+"px"},children:[Object(gf.jsxs)(eO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("sensorPanel.LightSensor",I)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",I)+" "+l+" | "+f.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){O()},onMouseDown:function(){O()},children:me.t("word.Close",I)})]}),m&&Object(gf.jsx)(UC,{type:L.DaylightData,chartType:Y.Area,dataSource:h.map((function(e){return{Month:e.Month,Daylight:e.Daylight}})),height:100,dataKeyAxisX:"Month",labelX:F,labelY:me.t("word.Daylight",I),unitY:me.t("word.Hour",I),yMin:0,curveType:"linear",fractionDigits:1,referenceX:C}),w&&Object(gf.jsx)(eI,{type:L.ClearnessData,dataSource:h.map((function(e){return{Month:e.Month,Clearness:e.Clearness}})),height:100,dataKeyAxisX:"Month",labelX:F,labelY:me.t("yearlyLightSensorPanel.SkyClearness",I),unitY:"%",yMin:0,yMax:100,fractionDigits:1,referenceX:C,color:"#66CDAA"}),A&&Object(gf.jsx)(UC,{type:L.YearlyRadiationSensorData,chartType:Y.Line,dataSource:h.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,ZC)})),labels:p,height:100,dataKeyAxisX:"Month",labelX:F,labelY:k,unitY:"kWh/m\xb2/"+me.t("word.Day",I),yMin:0,curveType:"linear",fractionDigits:2,referenceX:C}),Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",padding:"10px",direction:"ltr"},children:[Object(gf.jsxs)(wv.b,{children:[Object(gf.jsx)(eb.a,{title:me.t("yearlyLightSensorPanel.ShowDaylightResults",I),checked:m,onChange:function(e){d((function(t){t.viewState.yearlyLightSensorPanelShowDaylight=e}))}}),me.t("word.Daylight",I)]}),Object(gf.jsxs)(wv.b,{children:[Object(gf.jsx)(eb.a,{title:me.t("yearlyLightSensorPanel.ShowSkyClearnessResults",I),checked:w,onChange:function(e){d((function(t){t.viewState.yearlyLightSensorPanelShowClearness=e}))}}),me.t("yearlyLightSensorPanel.SkyClearness",I)]}),Object(gf.jsxs)(wv.b,{children:[Object(gf.jsx)(eb.a,{title:me.t("yearlyLightSensorPanel.ShowAverageDailySolarRadiation",I),checked:A,onChange:function(e){T(e)}}),me.t("word.Radiation",I)]}),Object(gf.jsxs)(wv.b,{children:[Object(gf.jsx)(xv.a,{type:"default",icon:E?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(E?"word.Run":"word.Update",I),onClick:function(){0!==g(V.Sensor)?(Kh(me.t("message.SimulationStarted",I)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Collect Yearly Data for Sensors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlyLightSensor=!0,e.pauseYearlyLightSensor=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",I))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",I),onClick:function(){_h("line-graph-"+F+"-"+k,"yearly-light-sensor",{}).then((function(){Kh(me.t("message.ScreenshotSaved",I)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Yearly Light Sensor Graph",timestamp:(new Date).getTime()}}))}))}}),h&&h.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",I),onClick:function(){$h(h,"yearly-light-sensor.csv"),Kh(me.t("message.CsvFileSaved",I)),c&&d((function(e){e.actionInfo={name:"Export Yearly Light Sensor Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})]})})})},lO=n.a.memo(tO),aO=mv.a.div(hI||(hI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),oO=mv.a.div(pI||(pI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),iO=mv.a.div(yI||(yI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),rO=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),f=new Date(Ew(i.date)),h=Pf(Su),p=Pf(bu),y=Ew(o.dailyLightSensorPanelRect),g=Ew(ds),m=Ew(Ni),w=n.a.useRef(null),x=Object(r.useRef)(null),v=Object(r.useRef)(),b=x.current?x.current.clientWidth+40:y?y.width+40:640,A=x.current?x.current.clientHeight+100:y?y.height+100:460,T=Object(r.useState)({x:y?Math.max(y.x,b-window.innerWidth):0,y:y?Math.min(y.y,window.innerHeight-A):0}),P=Object(u.a)(T,2),S=P[0],j=P[1],H={lng:a};Object(r.useEffect)((function(){j({x:Math.max(null===y||void 0===y?void 0:y.x,b-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-A)})}),[y,b,A]),Object(r.useEffect)((function(){var e=function(){j({x:Math.max(null===y||void 0===y?void 0:y.x,b-window.innerWidth),y:Math.min(null===y||void 0===y?void 0:y.y,window.innerHeight-A)})};return window.addEventListener("resize",e),x.current&&(v.current||(v.current=new ResizeObserver((function(){d((function(e){x.current&&(e.viewState.dailyLightSensorPanelRect||(e.viewState.dailyLightSensorPanelRect=new Ot(0,0,600,360)),e.viewState.dailyLightSensorPanelRect.width=x.current.offsetWidth,e.viewState.dailyLightSensorPanelRect.height=x.current.offsetHeight)}))}))),v.current.observe(x.current)),function(){var t;window.removeEventListener("resize",e),null===(t=v.current)||void 0===t||t.disconnect()}}),[y,b,A]);var z=function(){d((function(e){e.viewState.showDailyLightSensorPanel=!1,c&&(e.actionInfo={name:"Close Daily Light Sensor Graph",timestamp:(new Date).getTime()})}))},R=me.t("word.Hour",H),D=me.t("word.Radiation",H),M=!p||!p[0]||0===Object.keys(p[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:w,handle:".handle",bounds:"parent",axis:"both",position:S,onDrag:function(e,t){j({x:Math.max(t.x,b-window.innerWidth),y:Math.min(t.y,window.innerHeight-A)})},onStop:function(e,t){d((function(e){e.viewState.dailyLightSensorPanelRect||(e.viewState.dailyLightSensorPanelRect=new Ot(0,0,600,360)),e.viewState.dailyLightSensorPanelRect.x=Math.max(t.x,b-window.innerWidth),e.viewState.dailyLightSensorPanelRect.y=Math.min(t.y,window.innerHeight-A)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyLightSensorPanel"}))},children:Object(gf.jsx)(aO,{ref:w,style:{zIndex:"dailyLightSensorPanel"===m?Ke:9},children:Object(gf.jsxs)(oO,{ref:x,style:{opacity:s,width:(y?y.width:600)+"px",height:(y?y.height:360)+"px"},children:[Object(gf.jsxs)(iO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("sensorPanel.LightSensor",H)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",H)+" "+l+" | "+RW()(f).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){z()},onMouseDown:function(){z()},children:me.t("word.Close",H)})]}),Object(gf.jsx)(UC,{type:L.DailyRadiationSensorData,chartType:Y.Line,dataSource:p,labels:h,height:100,dataKeyAxisX:"Hour",labelX:R,labelY:D,unitY:"kWh/m\xb2",yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:f.getHours()}),Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Object(gf.jsx)(xv.a,{type:"default",icon:M?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(M?"word.Run":"word.Update",H),onClick:function(){0!==g(V.Sensor)?(Kh(me.t("message.SimulationStarted",H)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Collect Daily Data for Sensors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailyLightSensor=!0,e.pauseDailyLightSensor=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSensorForCollectingData",H))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",H),onClick:function(){_h("line-graph-"+R+"-"+D,"daily-light-sensor",{}).then((function(){Kh(me.t("message.ScreenshotSaved",H)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Light Sensor Graph",timestamp:(new Date).getTime()}}))}))}}),p&&p.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",H),onClick:function(){$h(p,"daily-light-sensor.csv"),Kh(me.t("message.CsvFileSaved",H)),c&&d((function(e){e.actionInfo={name:"Export Daily Light Sensor Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},nO=n.a.memo(rO),cO=mv.a.div(gI||(gI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 12;\n"]))),sO=mv.a.div(mI||(mI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 200px;\n max-width: 800px;\n min-height: 60px;\n max-height: 600px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n"]))),dO=mv.a.div(wI||(wI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),uO=ET.a.TextArea,fO=function(){var e,t=Ew(Vi),l=Ew(Sr),a=null!==(e=Ew(Ui))&&void 0!==e?e:Qe,i=Ew(si),c=Ew(ki),s=Ew(o.stickyNotePanelRect),d=Ew(Ni),f=n.a.useRef(null),h=Object(r.useRef)(null),p=Object(r.useRef)(),y=h.current?h.current.clientWidth+40:s?s.width+40:440,g=h.current?h.current.clientHeight+100:s?s.height+100:400,m=Object(r.useState)({x:s?Math.min(s.x,window.innerWidth-y):0,y:s?Math.min(s.y,window.innerHeight-g):0}),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useState)(c.length>0?c[0]:""),A=Object(u.a)(b,2),T=A[0],P=A[1],S={lng:t};Object(r.useEffect)((function(){v({x:Math.min(null===s||void 0===s?void 0:s.x,window.innerWidth-y),y:Math.min(null===s||void 0===s?void 0:s.y,window.innerHeight-g)})}),[s,y,g]),Object(r.useEffect)((function(){var e=function(){v({x:Math.min(null===s||void 0===s?void 0:s.x,window.innerWidth-y),y:Math.min(null===s||void 0===s?void 0:s.y,window.innerHeight-g)})};return window.addEventListener("resize",e),h.current&&(p.current||(p.current=new ResizeObserver((function(){i((function(e){h.current&&(e.viewState.stickyNotePanelRect||(e.viewState.stickyNotePanelRect=new Ot(0,0,400,300)),e.viewState.stickyNotePanelRect.width=h.current.offsetWidth,e.viewState.stickyNotePanelRect.height=h.current.offsetHeight)}))}))),p.current.observe(h.current)),function(){var t;window.removeEventListener("resize",e),null===(t=p.current)||void 0===t||t.disconnect()}}),[s,y,g]),Object(r.useEffect)((function(){P(c.length>0?c[0]:"")}),[c]);var j=function(){var e={name:"Close Sticky Note",timestamp:Date.now(),undo:function(){i((function(e){e.viewState.showStickyNotePanel=!0}))},redo:function(){i((function(e){e.viewState.showStickyNotePanel=!1}))}};l(e),i((function(e){e.viewState.showStickyNotePanel=!1,e.notes[0]=T}))};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(JT.a,{nodeRef:f,handle:".handle",bounds:"parent",axis:"both",position:x,onDrag:function(e,t){v({x:Math.min(t.x,window.innerWidth-y),y:Math.min(t.y,window.innerHeight-g)})},onStop:function(e,t){i((function(e){e.viewState.stickyNotePanelRect||(e.viewState.stickyNotePanelRect=new Ot(0,0,400,300)),e.viewState.stickyNotePanelRect.x=Math.min(t.x,window.innerWidth-y),e.viewState.stickyNotePanelRect.y=Math.min(t.y,window.innerHeight-g)}))},onMouseDown:function(){i((function(e){e.selectedFloatingWindow="stickyNotePanel"}))},children:Object(gf.jsx)(cO,{ref:f,style:{zIndex:"stickyNotePanel"===d?Ke:12},children:Object(gf.jsxs)(sO,{ref:h,style:{opacity:a,width:(s?s.width:400)+"px",height:(s?s.height:300)+"px"},children:[Object(gf.jsxs)(dO,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("menu.view.accessories.Note",S)}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){j()},onTouchStart:function(){j()},children:me.t("word.Close",S)})]}),Object(gf.jsx)(uO,{style:{resize:"none"},rows:100,value:T,onChange:function(e){P(e.target.value)},onBlur:function(){i((function(e){e.notes[0]=T}))},onPointerOut:function(){i((function(e){e.notes[0]=T}))}})]})})})})},hO=n.a.memo(fO),pO=l(118),yO=mv.a.div(xI||(xI=Object(gv.a)(["\n position: absolute;\n top: 80px;\n left: 10px;\n margin: auto;\n display: flex;\n justify-content: left;\n align-self: flex-start;\n align-content: flex-start;\n align-items: start;\n padding: 16px;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n"]))),gO=mv.a.div(vI||(vI=Object(gv.a)(["\n position: absolute;\n top: 0;\n left: 0;\n align-self: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n margin: auto;\n width: 310px;\n padding-bottom: 10px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n"]))),mO=function(){var e,t,l=Ew(si),a=Ew(Sr),i=Ew(Vi),r=Ew(Es),n=null!==(e=Ew(o.orthographic))&&void 0!==e&&e,c=null!==(t=Ew(o.navigationView))&&void 0!==t&&t,s={lng:i},d=r.y>0?"navajowhite":"antiquewhite",u=Tw.isMac(),f=function(e){l((function(t){t.viewState.navigationView=e,t.viewState.enableRotate=!e}))};return Object(gf.jsx)(yO,{children:Object(gf.jsxs)(gO,{style:{color:d,fontSize:c?"10px":"9px"},children:[c&&Object(gf.jsxs)("span",{style:{fontSize:"12px",paddingLeft:"6px",paddingRight:"6px",paddingTop:"2px",paddingBottom:"2px",marginBottom:"6px",background:"tomato",border:"1px solid"},children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.NavigationMode",s)}),Object(gf.jsx)(pO.a,{style:{paddingLeft:"6px",cursor:"pointer"},onClick:function(){var e={name:"Close Navigation Mode",timestamp:Date.now(),undo:function(){f(!0)},redo:function(){f(!1)}};a(e),f(!1)}})]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t(c?"instructionPanel.DisableNavigation":"instructionPanel.EnableNavigation",s)}),": ",me.t("word.Press",s)," ",u?"\u2318":"Ctrl","+U"]}),c&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.MoveForwardBack",s)}),":"," ",me.t("instructionPanel.MoveForwardBackInstruction",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.MoveLeftRight",s)}),":"," ",me.t("instructionPanel.MoveLeftRightInstruction",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.MoveUpDown",s)}),":"," ",me.t("instructionPanel.MoveUpDownInstruction",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.Turn",s)}),": ",me.t("instructionPanel.TurnInstruction",s)]})]}),!n&&!c&&Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.Rotate",s)}),": ",me.t("instructionPanel.DragMouse",s)]}),!c&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.Zoom",s)}),":"," ",me.t(u?"instructionPanel.MouseWheelOrKeysMac":"instructionPanel.MouseWheelOrKeys",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t("instructionPanel.Pan",s)}),":"," ",me.t(u?"instructionPanel.HoldMetaDragMouse":"instructionPanel.HoldCtrlDragMouse",s)]}),Object(gf.jsxs)("span",{children:[Object(gf.jsx)("b",{children:me.t(n?"instructionPanel.Exit2DMode":"instructionPanel.Enter2DMode",s)}),":"," ",me.t("word.Press",s)," ",u?"\u2318":"Ctrl","+B"]})]})]})})},wO=n.a.memo(mO),xO=l(861),vO=["Daylight","Clearness"],bO=mv.a.div(bI||(bI=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),AO=mv.a.div(AI||(AI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),TO=mv.a.div(TI||(TI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),PO=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.daysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(td),w=Ew(ld),x=Pf(od),v=Ew(ds),b=Ew(o.yearlyPvYieldPanelRect),A=Tf(Nr),T=Ew.getState().economicsParams,P=Tf(ms),S=Ew(Ni),j=n.a.useRef(null),H=Object(r.useRef)(null),z=H.current?H.current.clientWidth+40:640,R=H.current?H.current.clientHeight+100:500,D=Object(r.useState)({x:b?Math.max(b.x,z-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-R):0}),M=Object(u.a)(D,2),W=M[0],I=M[1],C=Object(r.useState)(0),O=Object(u.a)(C,2),F=O[0],k=O[1],E=Object(r.useRef)(new Map),U=Object(r.useRef)(),N=it[g.getMonth()],J={lng:c},G=v(V.SolarPanel);Object(r.useEffect)((function(){var e=0;E.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],E.current.set(o,(null!==(i=E.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}k(e)}),[m]),Object(r.useEffect)((function(){I({x:Math.max(null===b||void 0===b?void 0:b.x,z-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-R)})}),[b,z,R]),Object(r.useEffect)((function(){var e=function(){I({x:Math.max(null===b||void 0===b?void 0:b.x,z-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-R)})};return window.addEventListener("resize",e),H.current&&(U.current||(U.current=new ResizeObserver((function(){p((function(e){H.current&&(e.viewState.yearlyPvYieldPanelRect||(e.viewState.yearlyPvYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyPvYieldPanelRect.width=H.current.offsetWidth,e.viewState.yearlyPvYieldPanelRect.height=H.current.offsetHeight)}))}))),U.current.observe(H.current)),function(){var t;window.removeEventListener("resize",e),null===(t=U.current)||void 0===t||t.disconnect()}}),[b,z,R]);var X=function(){p((function(e){e.viewState.showYearlyPvYieldPanel=!1,s&&(e.actionInfo={name:"Close Solar Panel Yearly Yield Graph",timestamp:(new Date).getTime()})}))};Object(r.useEffect)((function(){G<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyPvIndividualOutputs=!1)}))}),[G,w]);var B=me.t("word.Month",J),K=me.t("solarPanelYieldPanel.Yield",J),q=Tw.countAllSolarPanels(),Q=12/y,Z=F*Q,_=q*T.operationalCostPerUnit*365,$=Z*T.electricitySellingPrice,ee=$-_,te=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:j,handle:".handle",bounds:"parent",axis:"both",position:W,onDrag:function(e,t){I({x:Math.max(t.x,z-window.innerWidth),y:Math.min(t.y,window.innerHeight-R)})},onStop:function(e,t){p((function(e){e.viewState.yearlyPvYieldPanelRect||(e.viewState.yearlyPvYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyPvYieldPanelRect.x=Math.max(t.x,z-window.innerWidth),e.viewState.yearlyPvYieldPanelRect.y=Math.min(t.y,window.innerHeight-R)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyPvYieldPanel"}))},children:Object(gf.jsx)(bO,{ref:j,style:{zIndex:"yearlyPvYieldPanel"===S?Ke:9},children:Object(gf.jsxs)(AO,{ref:H,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(TO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("solarPanelYieldPanel.SolarPanelYearlyYield",J)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",J)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){X()},onMouseDown:function(){X()},children:me.t("word.Close",J)})]}),Object(gf.jsx)(UC,{type:L.YearlyPvYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,vO)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:B,labelY:K,unitY:me.t("word.kWh",J),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!P&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&G>1&&E.current.size>0?Object(gf.jsx)(tD.a,{title:me.t("shared.OutputBreakdown",J),content:Object(h.a)(E.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*Q).toFixed(2)})]}),t===E.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",J)+": "+Z.toFixed(2)+" "+me.t("word.kWh",J)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",J)})}):Object(gf.jsxs)(gf.Fragment,{children:[Z>0&&Object(gf.jsx)(wv.b,{children:me.t("solarPanelYieldPanel.YearlyTotal",J)+": "+Z.toFixed(2)+" "+me.t("word.kWh",J)}),Z>0&&Object(gf.jsx)(tD.a,{title:me.t("shared.MoreResults",J),content:Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.ModuleCount",J)+": "}),Object(gf.jsx)(NT.a,{span:10,children:q})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.MeanYield",J)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:[(Z/q).toFixed(2)," kWh"]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalCost",J)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:["$",_.toFixed(2)]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalRevenue",J)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:["$",$.toFixed(2)]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.Profit",J)+": "}),Object(gf.jsx)(NT.a,{span:10,children:(ee>0?"$":"-$")+Math.abs(ee).toFixed(2)})]})]}),children:Object(gf.jsx)(xv.a,{type:"default",children:me.t("shared.MoreResults",J)})})]}),!A&&Object(gf.jsxs)(gf.Fragment,{children:[G>1&&Object(gf.jsx)(eb.a,{title:me.t("solarPanelYieldPanel.ShowOutputsOfIndividualSolarPanels",J),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:w,onChange:function(e){0!==G?(Kh(me.t("message.SimulationStarted",J)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyPvIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Solar Panels: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0,e.pauseYearlySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",J))}}),Object(gf.jsx)(xv.a,{type:"default",icon:te?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(te?"word.Run":"word.Update",J),onClick:function(){0!==G?(Kh(me.t("message.SimulationStarted",J)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Solar Panels",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForSolarPanels=!0,e.pauseYearlySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",J))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",J),onClick:function(){_h("line-graph-"+B+"-"+K,"yearly-pv-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",J)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Solar Panel Yearly Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",J),onClick:function(){$h(m,"yearly-pv-yield.csv"),Kh(me.t("message.CsvFileSaved",J)),s&&p((function(e){e.actionInfo={name:"Export Solar Panel Yearly Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})]})})})},SO=n.a.memo(PO),jO=mv.a.div(PI||(PI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),HO=mv.a.div(SI||(SI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),zO=mv.a.div(jI||(jI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),RO=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(_s),m=Ew($s),w=Ew(o.dailyPvYieldPanelRect),x=Pf(od),v=Tf(Nr),b=Ew.getState().economicsParams,A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=S.current?S.current.offsetWidth+40:w?w.width+40:640,H=S.current?S.current.offsetHeight+100:w?w.height+100:500,z=Object(r.useState)({x:w?Math.max(w.x,j-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-H):0}),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(0),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useRef)(new Map),k=Object(r.useRef)(),E={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],F.current.set(o,(null!==(i=F.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}O(e)}),[g]),Object(r.useEffect)((function(){M({x:Math.max(null===w||void 0===w?void 0:w.x,j-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-H)})}),[w,j,H]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===w||void 0===w?void 0:w.x,j-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-H)})};return window.addEventListener("resize",e),S.current&&(k.current||(k.current=new ResizeObserver((function(){d((function(e){S.current&&(e.viewState.dailyPvYieldPanelRect||(e.viewState.dailyPvYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyPvYieldPanelRect.width=S.current.offsetWidth,e.viewState.dailyPvYieldPanelRect.height=S.current.offsetHeight)}))}))),k.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=k.current)||void 0===t||t.disconnect()}}),[w,j,H]);var U=function(){d((function(e){e.viewState.showDailyPvYieldPanel=!1,c&&(e.actionInfo={name:"Close Solar Panel Daily Yield Graph",timestamp:(new Date).getTime()})}))},N=y(V.SolarPanel);Object(r.useEffect)((function(){N<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyPvIndividualOutputs=!1)}))}),[N,m]);var J=me.t("word.Hour",E),G=me.t("solarPanelYieldPanel.YieldPerHour",E),X=Tw.countAllSolarPanels(),B=X*b.operationalCostPerUnit,K=C*b.electricitySellingPrice,q=K-B,Q=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyPvYieldPanelRect||(e.viewState.dailyPvYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyPvYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.dailyPvYieldPanelRect.y=Math.min(t.y,window.innerHeight-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyPvYieldPanel"}))},children:Object(gf.jsx)(jO,{ref:P,style:{zIndex:"dailyPvYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(HO,{ref:S,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(zO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("solarPanelYieldPanel.SolarPanelDailyYield",E)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",E)+" "+l+" | "+RW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){U()},onMouseDown:function(){U()},children:me.t("word.Close",E)})]}),Object(gf.jsx)(UC,{type:L.DailyPvYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:J,labelY:G,unitY:me.t("word.kWh",E),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&N>1&&F.current.size>0?Object(gf.jsx)(tD.a,{title:me.t("shared.OutputBreakdown",E),content:Object(h.a)(F.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",E)+": "+C.toFixed(3)+" "+me.t("word.kWh",E)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",E)})}):Object(gf.jsxs)(gf.Fragment,{children:[C>0&&Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("solarPanelYieldPanel.DailyTotal",E)+": "+C.toFixed(3)+" "+me.t("word.kWh",E)}),C>0&&Object(gf.jsx)(tD.a,{title:me.t("shared.MoreResults",E),content:Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.ModuleCount",E)+": "}),Object(gf.jsx)(NT.a,{span:10,children:X})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.MeanYield",E)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:[(C/X).toFixed(2)," kWh"]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalCost",E)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:["$",B.toFixed(2)]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.TotalRevenue",E)+": "}),Object(gf.jsxs)(NT.a,{span:10,children:["$",K.toFixed(2)]})]}),Object(gf.jsxs)(UT.a,{style:{width:"200px"},children:[Object(gf.jsx)(NT.a,{span:14,children:me.t("solarPanelYieldPanel.Profit",E)+": "}),Object(gf.jsx)(NT.a,{span:10,children:(q>0?"$":"-$")+Math.abs(q).toFixed(2)})]})]}),children:Object(gf.jsx)(xv.a,{type:"default",children:me.t("shared.MoreResults",E)})})]}),!v&&Object(gf.jsxs)(gf.Fragment,{children:[N>1&&Object(gf.jsx)(eb.a,{title:me.t("solarPanelYieldPanel.ShowOutputsOfIndividualSolarPanels",E),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:m,onChange:function(e){0!==N?(Kh(me.t("message.SimulationStarted",E)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyPvIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Solar Panels: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0,e.pauseDailySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",E))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Q?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(Q?"word.Run":"word.Update",E),onClick:function(){0!==N?(Kh(me.t("message.SimulationStarted",E)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Solar Panels",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runDailySimulationForSolarPanels=!0,e.pauseDailySimulationForSolarPanels=!1}))}),100)):Kh(me.t("analysisManager.NoSolarPanelForAnalysis",E))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",E),onClick:function(){_h("line-graph-"+J+"-"+G,"daily-pv-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",E)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Solar Panel Daily Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",E),onClick:function(){$h(g,"daily-pv-yield.csv"),Kh(me.t("message.CsvFileSaved",E)),c&&d((function(e){e.actionInfo={name:"Export Solar Panel Daily Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})]})})})},DO=n.a.memo(RO),MO=mv.a.div(HI||(HI=Object(gv.a)(["\n position: absolute;\n bottom: 40px;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n"]))),WO=mv.a.div(zI||(zI=Object(gv.a)(["\n background: #282c34;\n position: absolute;\n top: 0;\n left: ",";\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: 240px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n"])),(function(e){return e.projectView?"calc(3 * 100vw / 4 - 120px)":"calc(100vw / 2 - 120px)"})),IO=function(){var e,t=Ew(Fi),l=Ew(ds),a=Ew(ps),o=Ew($r),i=Ew(Vi),r=Ew(Es),n=Ew(Kr),c=Ew(js),s=Ew((function(e){return null===e.selectedElement?null:e.elements.find((function(t){var l;return t.id===(null===(l=e.selectedElement)||void 0===l?void 0:l.id)}))})),d=0,u=0,f=0;if(s)if(s.type===V.SolarPanel)d=a(s.id),u=null!==(e=s.dailyYield)&&void 0!==e?e:0;else if(s.type===V.Polygon){var h=o(s);h&&(d=Tw.countAllChildSolarPanels(h.id),u=Tw.countAllChildSolarPanelDailyYields(h.id))}else d=Tw.countAllChildSolarPanels(s.id),u=Tw.countAllChildSolarPanelDailyYields(s.id),f=Tw.countAllChildElementsByType(s.id,V.Heliostat);else d=Tw.countAllSolarPanels(),u=Tw.countAllSolarPanelDailyYields(),f=l(V.Heliostat);var p={lng:i},y=r.y>0,g=y?"navajowhite":"antiquewhite",m=y?"invert(85%) sepia(45%) saturate(335%) hue-rotate(329deg) brightness(100%) contrast(101%)":"invert(95%) sepia(7%) saturate(1598%) hue-rotate(312deg) brightness(106%) contrast(96%)",w=s&&s.type===V.Foundation&&!s.notBuilding&&Tw.getBuildingCompletionStatus(s,t)===D.COMPLETE;return Object(gf.jsx)(MO,{children:Object(gf.jsx)(WO,{projectView:c,children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:g,fontSize:"10px"},children:[d>0&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{alt:"Solar panel count",title:me.t("designInfoPanel.NumberOfSelectedSolarPanels",p),src:iD,height:24,width:36,style:{paddingLeft:"10px",cursor:"pointer",filter:"invert(100%) "}}),Object(gf.jsx)("span",{children:d})]}),f>0&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{alt:"Heliostat count",title:me.t("designInfoPanel.NumberOfSelectedHeliostats",p),src:vD,height:24,width:36,style:{paddingLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",filter:"invert(100%) "}}),Object(gf.jsx)("span",{children:f})]}),u>0&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{title:me.t("designInfoPanel.ElectricityGeneratedDailyBySolarPanels",p),alt:"Electricity",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEB8ttR0cqAAAA4lJREFUWIXNl0+IHEUUxn/vdfX0jOAoSQgGIoaQRRFdEwxe1j8BD5qDNxEiJje9+CcXUUTEm6gnBVFvehA9RIISIYgJGHMyugH/rGzwoiIku1Ek4mZnprrreeje3ZlJ98x0xoMfFDRV9b7vq5pXr2rg6nGDqr4OyBQc6BSx7RDC/VNyjA4WkQeAtyqGA3C5klj1o0ajsXMqA2Z2BtgvIvuqPFaIHw4hbO/1er+NMzAWIvIIMF8yNCMi3wDRUP/1qvoLcOvU4n04parPDfU1nXN7S+Z+CLzzX4oD7FHVFyeYp8CrwOZJidd/QxE5KCKrIYSPx8Rcp6r7Qgi7gbaqLpvZvJmdAvxId6pPmtmimZ0sG9wPnAWOxnF8SwXB88AlwEraTyJysHSVeRKfBr50zt0xxqS+oKrnyLdy7ZRcAxwvhE4ARypMGIPHtg18APwgIodGCQ/jRlV9iiLDVfUYYKp6WETuK0xUGbDCPMAmVX0aaNURH8bjhfizzrkDY4T729w0omtIgAvAfBRF9wAmIqWCJf3Hp1aPouhe8tU/QX6+rxATkSpTl5vN5rZxGi6O45vjOL4rhBBUFUB7vd7ZNE0XzOy2Yt554O61IDNDZKMKm1kZd8t7vws4nyTJXBRFO8nvDwAJIXzR6XSWnPd+l/f+ISArVh2p6gqwICJryZORn4QB0SiKyLKscnVZliUA3vu93vu5EEJGXnsE+B5YGrdDhwBzzj0KLFKy7VU5UcTdOU5gJJxztxdkfwKrw+JUJ6ABF4FrpzJQ4NsJxMra+1OpNhqNHcXngxMK9rfVOI5ngCRJku11tWeAT1X1MzYq4St1DDjnHiu4torIGeBtYNM44S3Aa8Ciqr7EleXz80nEVfWN/qBWq7W1MPCjqj5TwpujED0ClG6Zc26W/LodZWCp3W6XJp5zbg9wonhhlWL4aVWGc2NK8dEJOAZ0+h+l1RVlA1+ZWaqq65VQRBARzKynqqcn4BjQcRMErCNJkpe73e4SsKXVakVAGkKIO52OV9VfQwjv1uGrDRE5APxNXmQuqupy8f0HcMk5t7suZ60dMLNjwGZVvQnohRBS51wcQojN7Ls0TRfqGqgNVT0JdMkvkgvAsqqmwJtXw1f7j2Wz2dzW7XZnkyR5GAhZlgUzey9Jkp9XVlb+qss3ydEbQJqm/wC/hxBmsyzbISJfp2n6ife+U5frf4F/AW7wkmmQi1CEAAAAAElFTkSuQmCC",height:24,width:24,style:{filter:m,marginLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)("span",{children:u.toFixed(1)+" "+me.t("word.kWh",p)})]}),!s&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{title:me.t("designInfoPanel.SceneDiameter",p),alt:"Diameter",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEDUIkXIExwAABSFJREFUWIWlV1tsFFUY/s6//5yZOUtnl13abrMb3KYSioCxNviAWblGMVFAwMQXeDJRX7xgxEQaecAHqJgYiI0PxhAviZoA8UWjxCgQEhrR+ECCWoVowwLa9EJwLdvZOT7MTLvby978k5PNzvn///v+y7kJNCDxeDwzOTnZC6DX87zlxWKxDQAsyyqUSqXftNYXHce5ODo6erkRv1XlwIEDkZaWlj1EdEYIoQFUHUIITUSXpJSvAUjW8i+qTVqW9XCxWDykte7RWkMIAa31VSL6EcCvAPKe50FKmQDQBeA+rfW9rutCaw0AN5j5Ddd132k4cinlYSIKIysB+NC27Q25XM6sZheLxVZLKfuJ6K/AVluW9WVnZ2dbvdgciUQ+D42J6DQz9zQaQDKZbCeigbBsRHTZNM1MbXTmk5ip5cFGgWeLbdsbAIzDD+hn27YrMlHRA1LKw8VicZ8QAvF4/JWxsbEj9YBEIpFcqVR6bJ4pLaUcZuYrhULhIwAJIcSZ7du3bzx16pRXoRmNRh8Kay6lPFRvhLlcLlJe79lDCKENw9iplFpLRFoIoU3T7KukqbWQUv4EQBuGMVgveCiLFi06thCBYOwFANu234TfD5NSyrumHTiO8wQRaSIqJRKJ3kYJAIBhGEerEHgRADKZjBmJRP4MAh2YNiai0wB00P1Ni2VZX1cjEOg8Dz8Lo6lUykZHR0cCwL9CCB2Pxx9tFpyIHieikVoEAMQBjAshdCwW20gTExM9QghLCDGSyWTONIm/1fO8k57nJQHcJKJPhZhZYIZhGGW64wDOaq1x586dTTAMYy8AzcynmwUHMAU/rf+YprkWAJRSA5jZzPaVG5imuR/+avsOSqn3AgLH/g84M0/GYrEN5ZOWZR0hovPMvLL8u1LqqYDAdQD4IGDa6K43DS6lLKbT6UfqNZRSrgtIawrA55XW1tZOpdTyBcBPAGAp5VQ6nd5x7dq1r+olUCqV3OAXsCzrffh1ertcKZlMtjPzKIAigG3h93g8vhWACz/yqa6urq31AodiWdYO+Bm4Ccuy9gV/vpiltwozy8gVQmxeunTpJmYOaz6VzWYbBgeASCTycuDjLJRSW4KTLz/rrF+ByrVcZOZiCJ5KpZoCDwicgJ/BfiSTyXYAU0II7TjOuioEwiV1q62tbWOz4Nls1iGiUQBaKbUFAEBE5+Hvzx/XIgDgFoBNzRKIRqNPBxm/nc1mHQCAaZq7g5tL0TCMZYHuPQsQ0PCbcNsc7zWkr69PMPMv8Mt4fHqiu7vbIKIh+CkOm7G7CgEthNC2ba9qhICUcn+AUVJKdVdMKqUeDS8kwYkFIvpDSqlN06wYUkrNzBML7BHzimmaDyLYuCzLeiv8XnElU0q9WygUnhFCIJlM7lm/fv0nw8PDDzAzu64LAGBmeJ7njYyM/D40NJSvE38lEX3reV4rM1/q7e1dMzg4ODlHq6enh4noHIJtMhqNPldvhAtJIpHYTER/w0/9jY6OjmW1bBxmPoegzlLKz9rb27ONAqdSKRvA6/DfFJqIrqdSqfvrMs7lciYzHy97io0D6I/FYqtr2S5evDitlHopbGoE98x6Ip8jpmnuBnAldEREmpl/YOYBwzBeYOYnAeyUUj4rpexn5m+I6HaZfoGZD+7atcuohlNVHMdpsW37VWa+XM/jNADOM/NRwzDuruW/6uN0tti2vVprnfM8bw2AFa7rtnueB2YeI6KrWusLQogLS5Ys+T6fz8/t8nnkP/P60xxqBkq1AAAAAElFTkSuQmCC",height:20,width:20,style:{filter:m,marginLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsx)("span",{children:2*n+" "+me.t("word.MeterAbbreviation",p)})]}),w&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("img",{title:me.t("designInfoPanel.BuildingArea",p),alt:"Area",src:"data:image/png;base64,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",height:20,width:20,style:{filter:m,marginLeft:"10px",marginTop:"4px",marginBottom:"4px",cursor:"pointer",verticalAlign:"middle"}}),Object(gf.jsxs)("span",{children:[Tw.getBuildingArea(s,t).toFixed(2)+" "+me.t("word.MeterAbbreviation",p),Object(gf.jsx)("sup",{children:"2"})]})]})]})})})},CO=n.a.memo(IO),OO=mv.a.div(RI||(RI=Object(gv.a)(["\n position: absolute;\n top: 75px;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n"]))),FO=mv.a.div(DI||(DI=Object(gv.a)(["\n position: absolute;\n top: 0;\n left: ",";\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: calc(100vw / 2);\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n"])),(function(e){return e.projectView?"calc(100vw / 2)":"calc(100vw / 4)"})),kO=function(e){var t,l=e.city,a=Ew(Vi),o=Ew(i.date),n=Ew(i.address),c=Ew(i.latitude),s=Ew(i.longitude),d=Ew(i.diurnalTemperatureModel),f=Ew(Ws),h=Ew(Es),p=null!==(t=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,y=Ew(js),g=Object(r.useState)({low:0,high:20}),m=Object(u.a)(g,2),w=m[0],v=m[1],b=Object(r.useState)(10),A=Object(u.a)(b,2),T=A[0],P=A[1],S=new Date(o),j=h.y>0,H={lng:a};Object(r.useEffect)((function(){if(l){var e=f[l];if(e){var t=HT(S,e.lowestTemperatures,e.highestTemperatures);v(t);var a=jT(t.high,t.low,d,p,z,Tw.minutesIntoDay(S));P(a)}}}),[l,o]);var z=Object(r.useMemo)((function(){return Ty(S,c)}),[o,c]),R=j?"navajowhite":"antiquewhite",D=j?"invert(85%) sepia(45%) saturate(335%) hue-rotate(329deg) brightness(100%) contrast(101%)":"invert(95%) sepia(7%) saturate(1598%) hue-rotate(312deg) brightness(106%) contrast(96%)";return Object(gf.jsx)(OO,{children:Object(gf.jsx)(FO,{projectView:y,children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:R,fontSize:"10px"},children:[Object(gf.jsx)("img",{title:me.t("word.Location",H),alt:"Location",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEAIi2s5tJQAAAvdJREFUWIW1l12IDWEYx3/PM+/MJLuSXfle2tCmxRVhw40oSW5FuXGhtCVX7smNwp0ouVBC8lFc+siFkojaXeurpLBaIp0255h9x8UMOzvmnJkznf3Xc/Ge93me//+8X88zQgl4nrc4CIIVQLe1tl1Vh6y174DBMvkKQ1W3A3eBAAgz7LmI7J8KbgNcqEOaZQ9835/fSvJbdYiqsWXNvQTmtELAqYzkl0VkG9AFdDmOsw44mSHmLiClmY0xvamENRHZ3cB/LfAxGSMie0sLILXvqnooL8BxnI3A70TcC0DLkE8DPiUSDVN8Oa8yeeVW1nNspKwbmJcY346TFcH11HhV0wIcx5mRHHueN1SQHN/334lMLJYxZmbTAkTEJsdBEHQWFRCGYVtybK0db1pAEATfgH+B1toNRQXUarX1YTixW9ba0aKxSbjAeyYO0pjrussLxr1l8iHsKSMA4GIq0TNgVk7MpVTMACWvIaq6I5Xsb8HZnOG+AriZ4X+sEUfevXaB18CSjLknwFPgF7Aa6AO8lM840RvwMoenPlT1MMWrYNqulSZOYDqp972oGWPqvoBNQUT2lRBwviXkCTxsgvwbMLvVAnqp33xMMhHZ02pyAIwxBwsIuDgl5AlcaUA+DPhTwur7/kKibZgGDGWQV+IOqtN13WUtIXVdtwc4Crwh6nJGgCWe53UD31MCdsVh90QkJGpmzjqOU7iI/UNbW9tM4BzRSzYOnBGRLcACohXAcZxN8Vyoqv1xqABzgU2x8M+xuDvxnymEdhF5HAd+Ajoa+B4ATufkexDnGgHyq6mq7mRiWb+q6i7AyQ3MgDFmDVE1/Jvv+H8+6R+sta+I7rsPdFhrbxAduvvAgIi8DsOw4nnel1qtVgVC3/dNtVqdTbR6S8Mw7AH6giDoS6V/VFT8VuADje/7GPAztkqObwXop0l0quoRorJb72M0z4aBEzTY+6J9/iJV7bXWriZqr7qAGcQ3QlV/W2t/AKPAgKoOWmsHYgEN8QfFcGW2NEnqrQAAAABJRU5ErkJggg==",height:20,width:20,style:{filter:D,cursor:"pointer",verticalAlign:"middle"}}),(null!==n&&void 0!==n?n:"")+" ("+Math.abs(c).toFixed(2)+"\xb0 "+(c>0?"N":"S")+", "+Math.abs(s).toFixed(2)+"\xb0 "+(s>0?"E":"W")+")",Object(gf.jsx)("img",{title:me.t("word.Date",H),alt:"Date",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEBEGhyLIZgAAAzBJREFUWIXN1luIVWUUB/CfepzGSZ1M50Xpihk4EQRRD01B4JRFRS9B9RCGYg9Jl4cis0iGsHmIovTJF7OHbi/ShR6CLIrASzHeRgeiCwaVQmWheTlNp4f17WZ73NtzmSP1h81Ze529vvX/1re+tRb/MaaV6OfgNvyMEy2udzdO4kgzBlPS71xcmOS/sBAfYQm+RaVJAlV8hzV4M2d3DD+WGV2NX1DLPUP4A+vq9I2e+3EY6/FnTn8Sy4qcV0TIjuDhXAT+xiyMpkVrTUZgFH34Ldl1J/1qrMRrRUZD2Fqn68fnuLJJxxlm4jMM1unfxxdFBhWx2/ozHsWNLTqHo7ipQH+RONIzMFUkYrUNZ63gcPJ1BiqCdT82nSPnU3AV9pQRqIp7f/s5InAKszFeRuACbFd8dp3CtkSikABnv2aXYT5+wE+4Tuxqp6ghs7ALPVgkaspY3RpTz+Zjrbg6ZXhJVLIhXJ7kb9Alruox3IAHk/xWwRoHMNIugW704jyRUL1i18S97xU9oEvk0oyCNdbgmaLFm6nxJ5zekH7PyUdz8rg4GrgG1+J6Efq9+KTMwVqnR6AbX+GgOP8nk/wULknyl5iOD9L70mQ7gN3J6XF8j0OJaA37cGfeeVEEqnhFJNWv+FRUsRFR49eJRjMuakdf2uEjyW4/7sOHJqpfD27Gs3gPD2FjWQTawQNihy+aaPFleC59e28ZgYpImmExJ9ya5KViZhgWCTU9fd8ncmRLA8dzRc2BzclmZlF9niaK0iDOF8PJIK4QoRxM/2fT1GNJXt6AwFa8nuTHxa1axeSPYAzv1OkuNTELwBsi7AM53UYxPRnCx206nyGKT373XaKdj4joPZGc31Vnew9qWTPqx6MtOh8X1yq7LRlOJUJb8HXSrRbZn8cYkXBv45Y2CFTFmHVc7DqPbViMDYnccIH9ghb9leKgyOpWsV4MKpPGC+I45rVg0y1K+vOdIDBPnHtRFyzDZpGYczpBgKhqNbyqcSV8OX27rFPOMzydFj6AO0ShydAjmtCO9M2KTjvPMCCmo5poRNvTe9YN9yZy/6JRuCZDZAkuTo4P4d1E6P+FfwC6bc62I7I0pgAAAABJRU5ErkJggg==",height:20,width:20,style:{filter:D,cursor:"pointer",verticalAlign:"middle"}}),x()(S).format("MM/DD hh:mm A"),Object(gf.jsx)("img",{title:me.t("word.Temperature",H),alt:"Temperature",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEBsiQc7EPQAAA4ZJREFUWIXV13+o32MUB/DXve4Wd4ZizFiMDRm7iYVhsj9QQstiasuv/Ejijxkp1krRyG1Lm0z5hygpTJrZsC0rsebXwmzpdpOw6zczM/frj3M+vs/99mXbvd+tdurb85znOZ9z3s855znP+bKf0uF4CB9gIxbjhH1l/Hj0oIaP8X7Ot2HKvgCwDn9jWrF2Gr7O34i9aXyiOO2dTfYuyr3pe6KwfQ8BjM3xHAxr2Ks8Mn6wAI7AuIb94Til4Gs5/lHMK/ozx7Ymdk7EMhz0fwBOx7tYhalYgrV4tAmAo0QeTMcNaXRUg8x5Ijdgh8iNHclPEeEcQIvz41oqeybn36p74ZJcuy9BVvI34eqcz03Zx7Al5xNxKY5DB37DLMnASKzEwbg20Q7DZwnkr5Trz/FMbC/AdxWnq2iO8OJC3JVr23B/eqanBPCCuNPXJf8ODsSklFmFy/BL7q/DD4Wx7bk2x8DcOKkwDp3oFvmgAvAsLhAump0ojxFuejuVwGvpDeIWrCkUt+PcnB+KDal3lOY0FfdgQjsW4VdsTgDvpdDORP9A8gvxYc43GhiCfnyS899xL14R+dOMvsJSzO8QpfRGfCPcfj5uxc15qqdELizLkxMeKpW3qdeInSKf4EnchpML2RXF/r85sFy4d1aeZqlw/bz0wlkiETsLI41UrVV1YCauyQPdjtHYhOdFaOdifVkHXsyxX1S1rpxvQG/uVQnW1wCihq0NgMaJxO7DgyK0i1Jui3w9O4oPekWNf0s8KndgjChQ1RWr4j6pwWCbetGpKuLDxf4ZeAIv4WcR3kHRLeK014uErQrRI8LVNTze5LsD1HNk0HRFGvhcXLsZBYAFKfNm8ncP1VgjjRUP0KeiahKJWgFYKe4/cVtq4i1oGT2dSseLvFlbGK9+m8X17MRPWN8q4yNE8r2c/JImxqvf6pSZl/yEVgDoSmWzRex/TP57XIzJ4vQViDHFNzN2pbxjVwLqsd0qGopDkv8Ib+R8hXondLSoquW3QwLQl+Oxos734UicLe5zH64q5HsKMH1aQMNF8Vid/Hz/nQNVNe1Ofsh3v6IFqbB6jJ5rYnyNuAGjReV8vVXG4TAR1+/U3XuhKLfduDLXRoq3o2ZgM9sSmiyalapPaOxwZybImugP9wqdKtq1yu29+LLgN4k/KLtNzXr43aFpuFx0ux34QsT8VdGu7z/0Dzx9+SSHmHZ4AAAAAElFTkSuQmCC",height:20,width:20,style:{filter:D,cursor:"pointer",verticalAlign:"middle"}}),w?T.toFixed(1)+"\xb0C ("+me.t("siteInfoPanel.Low",H)+":"+w.low.toFixed(1)+"\xb0C, "+me.t("siteInfoPanel.High",H)+": "+w.high.toFixed(1)+"\xb0C)":""]})})})},YO=n.a.memo(kO),LO=mv.a.div(MI||(MI=Object(gv.a)(["\n position: absolute;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 7; // must be less than other panels\n"]))),EO=mv.a.div(WI||(WI=Object(gv.a)(["\n background: #282c34;\n position: absolute;\n top: 0;\n left: calc(100vw / 2 - 100px);\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: 200px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n"]))),UO=function(){var e=Ew(si),t=Ew(Vi),l=Ew(o.solarRadiationHeatmapMaxValue),a=Ew(o.showSiteInfoPanel),i=Ew(o.heatFluxScaleFactor),r=Tf(Vs),n={lng:t};return Object(gf.jsx)(LO,{style:{top:a?"110px":"80px"},children:Object(gf.jsx)(EO,{style:{width:r?"320px":"170px",left:r?"calc(100vw / 2 - 150px)":"calc(100vw / 2 - 80px)"},children:Object(gf.jsxs)(wv.b,{direction:"horizontal",style:{color:"antiquewhite",fontSize:"10px"},children:[me.t("visualizationControlPanel.ColorContrast",n)+":",Object(gf.jsx)($v.a,{title:me.t("visualizationControlPanel.ClickUpOrDownArrowButtonsToChange",n),min:.5,max:50,step:.5,style:{width:70},precision:1,value:null!==l&&void 0!==l?l:5,onChange:function(t){e((function(e){e.viewState.solarRadiationHeatMapMaxValue=t}))}}),r&&Object(gf.jsxs)(gf.Fragment,{children:[me.t("visualizationControlPanel.FluxScale",n)+":",Object(gf.jsx)($v.a,{title:me.t("visualizationControlPanel.ClickUpOrDownArrowButtonsToChange",n),min:1,max:50,step:5,style:{width:65},precision:0,value:null!==i&&void 0!==i?i:20,onChange:function(t){e((function(e){e.viewState.heatFluxScaleFactor=t}))}})]})]})})})},NO=n.a.memo(UO),VO=Zz.a.Column,JO=mv.a.div(II||(II=Object(gv.a)(["\n position: fixed;\n top: 90px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 8;\n"]))),GO=mv.a.div(CI||(CI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),XO=mv.a.div(OI||(OI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),BO=function(){var e=Ew(Vi),t=Ew(Gi),l=Ew(si),a=new Date(Ew(i.date)),c=Ew(o.visibilityResultsPanelRect),s=Pf(Gs),d=Ew(fs),f=Ew(Ni),h=n.a.useRef(null),p=Object(r.useRef)(null),y=Object(r.useRef)(),g=p.current?p.current.clientWidth+40:c?c.width+40:640,m=p.current?p.current.clientHeight+100:c?c.height+100:570,w=Object(r.useState)({x:c?Math.max(c.x,g-window.innerWidth):0,y:c?Math.min(c.y,window.innerHeight-m):0}),x=Object(u.a)(w,2),v=x[0],b=x[1],A=Object(r.useState)([]),T=Object(u.a)(A,2),P=T[0],S=T[1],j={lng:e};Object(r.useEffect)((function(){b({x:Math.max(null===c||void 0===c?void 0:c.x,g-window.innerWidth),y:Math.min(null===c||void 0===c?void 0:c.y,window.innerHeight-m)})}),[c,g,m]),Object(r.useEffect)((function(){var e=function(){b({x:Math.max(null===c||void 0===c?void 0:c.x,g-window.innerWidth),y:Math.min(null===c||void 0===c?void 0:c.y,window.innerHeight-m)})};return window.addEventListener("resize",e),p.current&&(y.current||(y.current=new ResizeObserver((function(){l((function(e){p.current&&(e.viewState.visibilityResultsPanelRect||(e.viewState.visibilityResultsPanelRect=new Ot(0,0,600,470)),e.viewState.visibilityResultsPanelRect.width=p.current.offsetWidth,e.viewState.visibilityResultsPanelRect.height=p.current.offsetHeight)}))}))),y.current.observe(p.current)),function(){var t;window.removeEventListener("resize",e),null===(t=y.current)||void 0===t||t.disconnect()}}),[]),Object(r.useEffect)((function(){if(s){var e=[];s.forEach((function(t,l){var a=0,o="",i=0;t.forEach((function(e,t){i++,a+=e,o+=e.toFixed(2)+", "})),e.push({key:l.observer.id,observer:Tl.fetchLabel(l.observer.name,j),vantage:"("+l.position.x.toFixed(1)+", "+l.position.y.toFixed(1)+", "+l.position.z.toFixed(1)+") "+me.t("word.MeterAbbreviation",j),total:a.toFixed(2),itemized:i>1?o.substring(0,o.length-2):"---"})})),S(e)}}),[s,e]);var H=function(){l((function(e){e.viewState.showSolarPanelVisibilityResultsPanel=!1,t&&(e.actionInfo={name:"Close Visibility Results Panel",timestamp:(new Date).getTime()})}))};return Object(gf.jsx)(JT.a,{nodeRef:h,handle:".handle",bounds:"parent",axis:"both",position:v,onDrag:function(e,t){b({x:Math.max(t.x,g-window.innerWidth),y:Math.min(t.y,window.innerHeight-m)})},onStop:function(e,t){l((function(e){e.viewState.visibilityResultsPanelRect||(e.viewState.visibilityResultsPanelRect=new Ot(0,0,600,470)),e.viewState.visibilityResultsPanelRect.x=Math.max(t.x,g-window.innerWidth),e.viewState.visibilityResultsPanelRect.y=Math.min(t.y,window.innerHeight-m)}))},onMouseDown:function(){l((function(e){e.selectedFloatingWindow="visibilityResultsPanel"}))},children:Object(gf.jsx)(JO,{ref:h,style:{zIndex:"visibilityResultsPanel"===f?Ke:8},children:Object(gf.jsxs)(GO,{ref:p,style:{width:(c?c.width:600)+"px",height:(c?c.height:470)+"px"},children:[Object(gf.jsxs)(XO,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:me.t("visibilityPanel.SolarPanelVisibility",j)+" \u2014 "+RW()(a).format("h:mm A MM/DD")}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){H()},onMouseDown:function(){H()},children:me.t("word.Close",j)})]}),Object(gf.jsxs)(Zz.a,{id:"visibility-results-table",style:{width:"100%",direction:"ltr"},dataSource:P,pagination:{defaultPageSize:5,showSizeChanger:!0,pageSizeOptions:["5","10","50"]},children:[Object(gf.jsx)(VO,{title:me.t("visibilityPanel.Observer",j),dataIndex:"observer"},"observer"),Object(gf.jsx)(VO,{title:me.t("visibilityPanel.VantagePoint",j),dataIndex:"vantage"},"vantage"),Object(gf.jsx)(VO,{title:me.t("visibilityPanel.TotalVisibility",j),dataIndex:"total"},"total"),Object(gf.jsx)(VO,{title:me.t("visibilityPanel.ItemizedVisibilityByFields",j),dataIndex:"itemized"},"itemized")]}),Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(KC.a,{}),title:me.t("word.Update",j),onClick:function(){0!==d()?(Kh(me.t("message.SimulationStarted",j)),setTimeout((function(){Tf.setState((function(e){e.simulationInProgress=!0,e.runSolarPanelVisibilityAnalysis=!0})),l((function(e){t&&(e.actionInfo={name:"Run Visibility Analysis For Solar Panels",timestamp:(new Date).getTime()})}))}),100)):Kh(me.t("analysisManager.NoObserverForVisibilityAnalysis",j))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsImage",j),onClick:function(){_h("visibility-results-table","visibility-results",{}).then((function(){Kh(me.t("message.ScreenshotSaved",j))}))}})]})]})})})},KO=n.a.memo(BO),qO=["Daylight","Clearness"],QO=mv.a.div(FI||(FI=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),ZO=mv.a.div(kI||(kI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),_O=mv.a.div(YI||(YI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),$O=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(gd),w=Ew(md),x=Pf(xd),v=Ew(ds),b=Ew(o.yearlyParabolicTroughYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyParabolicTroughYieldPanelRect||(e.viewState.yearlyParabolicTroughYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyParabolicTroughYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyParabolicTroughYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyParabolicTroughYieldPanel=!1,s&&(e.actionInfo={name:"Close Parabolic Trough Yearly Yield Graph",timestamp:(new Date).getTime()})}))},J=v(V.ParabolicTrough);Object(r.useEffect)((function(){J<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyParabolicTroughIndividualOutputs=!1)}))}),[J,w]);var G=me.t("word.Month",U),X=me.t("parabolicTroughYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyParabolicTroughYieldPanelRect||(e.viewState.yearlyParabolicTroughYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyParabolicTroughYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyParabolicTroughYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyParabolicTroughYieldPanel"}))},children:Object(gf.jsx)(QO,{ref:P,style:{zIndex:"yearlyParabolicTroughYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(ZO,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(_O,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("parabolicTroughYieldPanel.ParabolicTroughYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(UC,{type:L.YearlyParabolicTroughYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,qO)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&k.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("parabolicTroughYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(gf.jsx)(eb.a,{title:me.t("parabolicTroughYieldPanel.ShowOutputsOfIndividualParabolicTroughs",U),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:w,onChange:function(e){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyParabolicTroughIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Parabolic Troughs: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForParabolicTroughs=!0,e.pauseYearlySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Parabolic Troughs",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForParabolicTroughs=!0,e.pauseYearlySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+G+"-"+X,"yearly-parabolic-trough-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Parabolic Trough Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-parabolic-trough-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Parabolic Trough Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},eF=n.a.memo($O),tF=mv.a.div(LI||(LI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),lF=mv.a.div(EI||(EI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),aF=mv.a.div(UI||(UI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),oF=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(hd),m=Ew(pd),w=Ew(o.dailyParabolicTroughYieldPanelRect),x=Pf(xd),v=Tf(ms),b=Ew(Ni),A=n.a.useRef(null),T=Object(r.useRef)(null),P=Object(r.useRef)(),S=T.current?T.current.clientWidth+40:w?w.width+40:640,j=T.current?T.current.clientHeight+100:w?w.height+100:500,H=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(0),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(new Map),F={lng:a};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],O.current.set(o,(null!==(i=O.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}C(e)}),[g]),Object(r.useEffect)((function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,S,j]),Object(r.useEffect)((function(){var e=function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),T.current&&(P.current||(P.current=new ResizeObserver((function(){d((function(e){T.current&&(e.viewState.dailyParabolicTroughYieldPanelRect||(e.viewState.dailyParabolicTroughYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyParabolicTroughYieldPanelRect.width=T.current.offsetWidth,e.viewState.dailyParabolicTroughYieldPanelRect.height=T.current.offsetHeight)}))}))),P.current.observe(T.current)),function(){var t;window.removeEventListener("resize",e),null===(t=P.current)||void 0===t||t.disconnect()}}),[w,S,j]);var k=function(){d((function(e){e.viewState.showDailyParabolicTroughYieldPanel=!1,c&&(e.actionInfo={name:"Close Parabolic Trough Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.ParabolicTrough);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyParabolicTroughIndividualOutputs=!1)}))}),[E,m]);var U=me.t("word.Hour",F),N=me.t("parabolicTroughYieldPanel.YieldPerHour",F),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:A,handle:".handle",bounds:"parent",axis:"both",position:R,onDrag:function(e,t){D({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyParabolicTroughYieldPanelRect||(e.viewState.dailyParabolicTroughYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyParabolicTroughYieldPanelRect.x=Math.max(t.x,S-window.innerWidth),e.viewState.dailyParabolicTroughYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyParabolicTroughYieldPanel"}))},children:Object(gf.jsx)(tF,{ref:A,style:{zIndex:"dailyParabolicTroughYieldPanel"===b?Ke:9},children:Object(gf.jsxs)(lF,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(aF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("parabolicTroughYieldPanel.ParabolicTroughDailyYield",F)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",F)+" "+l+" | "+RW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){k()},onMouseDown:function(){k()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(UC,{type:L.DailyParabolicTroughYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:N,unitY:me.t("word.kWh",F),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&O.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(O.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===O.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",F)+": "+I.toFixed(3)+" "+me.t("word.kWh",F)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",F)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("parabolicTroughYieldPanel.DailyTotal",F),":",I.toFixed(2)," ",me.t("word.kWh",F)]}),E>1&&Object(gf.jsx)(eb.a,{title:me.t("parabolicTroughYieldPanel.ShowOutputsOfIndividualParabolicTroughs",F),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyParabolicTroughIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Parabolic Troughs: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForParabolicTroughs=!0,e.pauseDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:J?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(J?"word.Run":"word.Update",F),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Parabolic Troughs",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForParabolicTroughs=!0,e.pauseDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicTroughForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",F),onClick:function(){_h("line-graph-"+U+"-"+N,"daily-parabolic-trough-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",F)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Parabolic Trough Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",F),onClick:function(){$h(g,"daily-parabolic-trough-yield.csv"),Kh(me.t("message.CsvFileSaved",F)),c&&d((function(e){e.actionInfo={name:"Export Daily Parabolic Trough Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},iF=n.a.memo(oF),rF=mv.a.div(NI||(NI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),nF=mv.a.div(VI||(VI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),cF=mv.a.div(JI||(JI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),sF=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(su),m=Ew(du),w=Ew(o.dailyParabolicDishYieldPanelRect),x=Pf(yu),v=Tf(ms),b=Ew(Ni),A=n.a.useRef(null),T=Object(r.useRef)(null),P=Object(r.useRef)(),S=T.current?T.current.clientWidth+40:w?w.width+40:640,j=T.current?T.current.clientHeight+100:w?w.height+100:500,H=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(0),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(new Map),F={lng:a};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],O.current.set(o,(null!==(i=O.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}C(e)}),[g]),Object(r.useEffect)((function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,S,j]),Object(r.useEffect)((function(){var e=function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),T.current&&(P.current||(P.current=new ResizeObserver((function(){d((function(e){T.current&&(e.viewState.dailyParabolicDishYieldPanelRect||(e.viewState.dailyParabolicDishYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyParabolicDishYieldPanelRect.width=T.current.offsetWidth,e.viewState.dailyParabolicDishYieldPanelRect.height=T.current.offsetHeight)}))}))),P.current.observe(T.current)),function(){var t;window.removeEventListener("resize",e),null===(t=P.current)||void 0===t||t.disconnect()}}),[w,S,j]);var k=function(){d((function(e){e.viewState.showDailyParabolicDishYieldPanel=!1,c&&(e.actionInfo={name:"Close Parabolic Dish Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.ParabolicDish);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyParabolicDishIndividualOutputs=!1)}))}),[E,m]);var U=me.t("word.Hour",F),N=me.t("parabolicDishYieldPanel.YieldPerHour",F),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:A,handle:".handle",bounds:"parent",axis:"both",position:R,onDrag:function(e,t){D({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyParabolicDishYieldPanelRect||(e.viewState.dailyParabolicDishYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyParabolicDishYieldPanelRect.x=Math.max(t.x,S-window.innerWidth),e.viewState.dailyParabolicDishYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyParabolicDishYieldPanel"}))},children:Object(gf.jsx)(rF,{ref:A,style:{zIndex:"dailyParabolicDishYieldPanel"===b?Ke:9},children:Object(gf.jsxs)(nF,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(cF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("parabolicDishYieldPanel.ParabolicDishDailyYield",F)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",F)+" "+l+" | "+RW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){k()},onMouseDown:function(){k()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(UC,{type:L.DailyParabolicDishYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:N,unitY:me.t("word.kWh",F),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&O.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(O.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===O.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",F)+": "+I.toFixed(3)+" "+me.t("word.kWh",F)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",F)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("parabolicDishYieldPanel.DailyTotal",F),":",I.toFixed(2)," ",me.t("word.kWh",F)]}),E>1&&Object(gf.jsx)(eb.a,{title:me.t("parabolicDishYieldPanel.ShowOutputsOfIndividualParabolicDishes",F),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyParabolicDishIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Parabolic Dishes: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForParabolicDishes=!0,e.pauseDailySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:J?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(J?"word.Run":"word.Update",F),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Parabolic Dishes",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForParabolicDishes=!0,e.pauseDailySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",F),onClick:function(){_h("line-graph-"+U+"-"+N,"daily-parabolic-dish-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",F)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Parabolic Dish Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",F),onClick:function(){$h(g,"daily-parabolic-dish-yield.csv"),Kh(me.t("message.CsvFileSaved",F)),c&&d((function(e){e.actionInfo={name:"Export Daily Parabolic Dish Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},dF=n.a.memo(sF),uF=["Daylight","Clearness"],fF=mv.a.div(GI||(GI=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),hF=mv.a.div(XI||(XI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),pF=mv.a.div(BI||(BI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),yF=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(fu),w=Ew(hu),x=Pf(yu),v=Ew(ds),b=Ew(o.yearlyParabolicDishYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyParabolicDishYieldPanelRect||(e.viewState.yearlyParabolicDishYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyParabolicDishYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyParabolicDishYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyParabolicDishYieldPanel=!1,s&&(e.actionInfo={name:"Close Parabolic Dish Yearly Yield Graph",timestamp:(new Date).getTime()})}))},J=v(V.ParabolicDish);Object(r.useEffect)((function(){J<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyParabolicDishIndividualOutputs=!1)}))}),[J,w]);var G=me.t("word.Month",U),X=me.t("parabolicDishYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyParabolicDishYieldPanelRect||(e.viewState.yearlyParabolicDishYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyParabolicDishYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyParabolicDishYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyParabolicDishYieldPanel"}))},children:Object(gf.jsx)(fF,{ref:P,style:{zIndex:"yearlyParabolicDishYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(hF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(pF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("parabolicDishYieldPanel.ParabolicDishYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(UC,{type:L.YearlyParabolicDishYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,uF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&k.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("parabolicDishYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(gf.jsx)(eb.a,{title:me.t("parabolicDishYieldPanel.ShowOutputsOfIndividualParabolicDishes",U),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:w,onChange:function(e){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyParabolicDishIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Parabolic Dishes: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForParabolicDishes=!0,e.pauseYearlySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Parabolic Dishes",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForParabolicDishes=!0,e.pauseYearlySimulationForParabolicDishes=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoParabolicDishForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+G+"-"+X,"yearly-parabolic-dish-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Parabolic Dish Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-parabolic-dish-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Parabolic Dish Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},gF=n.a.memo(yF),mF=mv.a.div(KI||(KI=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),wF=mv.a.div(qI||(qI=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),xF=mv.a.div(QI||(QI=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),vF=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(Sd),m=Ew(jd),w=Ew(o.dailyFresnelReflectorYieldPanelRect),x=Pf(Md),v=Tf(ms),b=Ew(Ni),A=n.a.useRef(null),T=Object(r.useRef)(null),P=Object(r.useRef)(),S=T.current?T.current.clientWidth+40:w?w.width+40:640,j=T.current?T.current.clientHeight+100:w?w.height+100:500,H=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(0),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(new Map),F={lng:a};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],O.current.set(o,(null!==(i=O.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}C(e)}),[g]),Object(r.useEffect)((function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,S,j]),Object(r.useEffect)((function(){var e=function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),T.current&&(P.current||(P.current=new ResizeObserver((function(){d((function(e){T.current&&(e.viewState.dailyFresnelReflectorYieldPanelRect||(e.viewState.dailyFresnelReflectorYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyFresnelReflectorYieldPanelRect.width=T.current.offsetWidth,e.viewState.dailyFresnelReflectorYieldPanelRect.height=T.current.offsetHeight)}))}))),P.current.observe(T.current)),function(){var t;window.removeEventListener("resize",e),null===(t=P.current)||void 0===t||t.disconnect()}}),[w,S,j]);var k=function(){d((function(e){e.viewState.showDailyFresnelReflectorYieldPanel=!1,c&&(e.actionInfo={name:"Close Fresnel Reflector Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.FresnelReflector);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyFresnelReflectorIndividualOutputs=!1)}))}),[E,m]);var U=me.t("word.Hour",F),N=me.t("fresnelReflectorYieldPanel.YieldPerHour",F),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:A,handle:".handle",bounds:"parent",axis:"both",position:R,onDrag:function(e,t){D({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyFresnelReflectorYieldPanelRect||(e.viewState.dailyFresnelReflectorYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyFresnelReflectorYieldPanelRect.x=Math.max(t.x,S-window.innerWidth),e.viewState.dailyFresnelReflectorYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyFresnelReflectorYieldPanel"}))},children:Object(gf.jsx)(mF,{ref:A,style:{zIndex:"dailyFresnelReflectorYieldPanel"===b?Ke:9},children:Object(gf.jsxs)(wF,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(xF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("fresnelReflectorYieldPanel.FresnelReflectorDailyYield",F)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",F)+" "+l+" | "+RW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){k()},onMouseDown:function(){k()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(UC,{type:L.DailyFresnelReflectorYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:N,unitY:me.t("word.kWh",F),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&O.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(O.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===O.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",F)+": "+I.toFixed(3)+" "+me.t("word.kWh",F)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",F)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("fresnelReflectorYieldPanel.DailyTotal",F),":",I.toFixed(2)," ",me.t("word.kWh",F)]}),E>1&&Object(gf.jsx)(eb.a,{title:me.t("fresnelReflectorYieldPanel.ShowOutputsOfIndividualFresnelReflectors",F),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyFresnelReflectorIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Fresnel Reflectors: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForFresnelReflectors=!0,e.pauseDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:J?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(J?"word.Run":"word.Update",F),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Fresnel Reflectors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForFresnelReflectors=!0,e.pauseDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",F),onClick:function(){_h("line-graph-"+U+"-"+N,"daily-fresnel-reflector-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",F)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Fresnel Reflector Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",F),onClick:function(){$h(g,"daily-fresnel-yield.csv"),Kh(me.t("message.CsvFileSaved",F)),c&&d((function(e){e.actionInfo={name:"Export Daily Fresnel Reflector Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},bF=n.a.memo(vF),AF=["Daylight","Clearness"],TF=mv.a.div(ZI||(ZI=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),PF=mv.a.div(_I||(_I=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),SF=mv.a.div($I||($I=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),jF=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(zd),w=Ew(Rd),x=Pf(Md),v=Ew(ds),b=Ew(o.yearlyFresnelReflectorYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyFresnelReflectorYieldPanelRect||(e.viewState.yearlyFresnelReflectorYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyFresnelReflectorYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyFresnelReflectorYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyFresnelReflectorYieldPanel=!1,s&&(e.actionInfo={name:"Close Fresnel Reflector Yearly Yield Graph",timestamp:(new Date).getTime()})}))},J=v(V.FresnelReflector);Object(r.useEffect)((function(){J<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyFresnelReflectorIndividualOutputs=!1)}))}),[J,w]);var G=me.t("word.Month",U),X=me.t("fresnelReflectorYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyFresnelReflectorYieldPanelRect||(e.viewState.yearlyFresnelReflectorYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyFresnelReflectorYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyFresnelReflectorYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyFresnelReflectorYieldPanel"}))},children:Object(gf.jsx)(TF,{ref:P,style:{zIndex:"yearlyFresnelReflectorYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(PF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(SF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("fresnelReflectorYieldPanel.FresnelReflectorYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(UC,{type:L.YearlyFresnelReflectorYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,AF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&k.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("fresnelReflectorYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(gf.jsx)(eb.a,{title:me.t("fresnelReflectorYieldPanel.ShowOutputsOfIndividualFresnelReflectors",U),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:w,onChange:function(e){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyFresnelReflectorIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Fresnel Reflectors: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForFresnelReflectors=!0,e.pauseYearlySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Fresnel Reflectors",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForFresnelReflectors=!0,e.pauseYearlySimulationForFresnelReflectors=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoFresnelReflectorForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+G+"-"+X,"yearly-fresnel-reflector-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Fresnel Reflector Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-fresnel-reflector-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Fresnel Reflector Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},HF=n.a.memo(jF),zF=mv.a.div(eC||(eC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),RF=mv.a.div(tC||(tC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),DF=mv.a.div(lC||(lC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),MF=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(ds),g=Pf(kd),m=Ew(Yd),w=Ew(o.dailyHeliostatYieldPanelRect),x=Pf(Vd),v=Tf(ms),b=Ew(Ni),A=n.a.useRef(null),T=Object(r.useRef)(null),P=Object(r.useRef)(),S=T.current?T.current.clientWidth+40:w?w.width+40:640,j=T.current?T.current.clientHeight+100:w?w.height+100:500,H=Object(r.useState)({x:w?Math.max(w.x,S-window.innerWidth):0,y:w?Math.min(w.y,window.innerHeight-j):0}),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(0),W=Object(u.a)(M,2),I=W[0],C=W[1],O=Object(r.useRef)(new Map),F={lng:a};Object(r.useEffect)((function(){var e=0;O.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],O.current.set(o,(null!==(i=O.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}C(e)}),[g]),Object(r.useEffect)((function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})}),[w,S,j]),Object(r.useEffect)((function(){var e=function(){D({x:Math.max(null===w||void 0===w?void 0:w.x,S-window.innerWidth),y:Math.min(null===w||void 0===w?void 0:w.y,window.innerHeight-j)})};return window.addEventListener("resize",e),T.current&&(P.current||(P.current=new ResizeObserver((function(){d((function(e){T.current&&(e.viewState.dailyHeliostatYieldPanelRect||(e.viewState.dailyHeliostatYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyHeliostatYieldPanelRect.width=T.current.offsetWidth,e.viewState.dailyHeliostatYieldPanelRect.height=T.current.offsetHeight)}))}))),P.current.observe(T.current)),function(){var t;window.removeEventListener("resize",e),null===(t=P.current)||void 0===t||t.disconnect()}}),[w,S,j]);var k=function(){d((function(e){e.viewState.showDailyHeliostatYieldPanel=!1,c&&(e.actionInfo={name:"Close Heliostat Daily Yield Graph",timestamp:(new Date).getTime()})}))},E=y(V.Heliostat);Object(r.useEffect)((function(){E<2&&m&&d((function(e){e.graphState&&(e.graphState.dailyHeliostatIndividualOutputs=!1)}))}),[E,m]);var U=me.t("word.Hour",F),N=me.t("heliostatYieldPanel.YieldPerHour",F),J=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:A,handle:".handle",bounds:"parent",axis:"both",position:R,onDrag:function(e,t){D({x:Math.max(t.x,S-window.innerWidth),y:Math.min(t.y,window.innerHeight-j)})},onStop:function(e,t){d((function(e){e.viewState.dailyHeliostatYieldPanelRect||(e.viewState.dailyHeliostatYieldPanelRect=new Ot(0,0,600,400)),e.viewState.dailyHeliostatYieldPanelRect.x=Math.max(t.x,S-window.innerWidth),e.viewState.dailyHeliostatYieldPanelRect.y=Math.min(t.y,window.innerHeight-j)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailyHeliostatYieldPanel"}))},children:Object(gf.jsx)(zF,{ref:A,style:{zIndex:"dailyHeliostatYieldPanel"===b?Ke:9},children:Object(gf.jsxs)(RF,{ref:T,style:{opacity:s,width:(w?w.width:600)+"px",height:(w?w.height:400)+"px"},children:[Object(gf.jsxs)(DF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("heliostatYieldPanel.HeliostatDailyYield",F)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",F)+" "+l+" | "+RW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){k()},onMouseDown:function(){k()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(UC,{type:L.DailyHeliostatYield,chartType:m?Y.Line:Y.Area,dataSource:g,labels:x,height:100,dataKeyAxisX:"Hour",labelX:U,labelY:N,unitY:me.t("word.kWh",F),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!v&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[m&&E>1&&O.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(O.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===O.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",F)+": "+I.toFixed(3)+" "+me.t("word.kWh",F)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",F)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("heliostatYieldPanel.DailyTotal",F),":",I.toFixed(2)," ",me.t("word.kWh",F)]}),E>1&&Object(gf.jsx)(eb.a,{title:me.t("heliostatYieldPanel.ShowOutputsOfIndividualHeliostats",F),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:m,onChange:function(e){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(t){t.graphState&&(t.graphState.dailyHeliostatIndividualOutputs=e),c&&(t.actionInfo={name:"Run Daily Simulation For Heliostats: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForHeliostats=!0,e.pauseDailySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:J?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(J?"word.Run":"word.Update",F),onClick:function(){0!==E?(Kh(me.t("message.SimulationStarted",F)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Heliostats",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForHeliostats=!0,e.pauseDailySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",F))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",F),onClick:function(){_h("line-graph-"+U+"-"+N,"daily-heliostat-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",F)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Heliostat Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",F),onClick:function(){$h(g,"daily-heliostat-yield.csv"),Kh(me.t("message.CsvFileSaved",F)),c&&d((function(e){e.actionInfo={name:"Export Daily Heliostat Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},WF=n.a.memo(MF),IF=["Daylight","Clearness"],CF=mv.a.div(aC||(aC=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),OF=mv.a.div(oC||(oC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),FF=mv.a.div(iC||(iC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),kF=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.cspDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(Ed),w=Ew(Ud),x=Pf(Vd),v=Ew(ds),b=Ew(o.yearlyHeliostatYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyHeliostatYieldPanelRect||(e.viewState.yearlyHeliostatYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyHeliostatYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyHeliostatYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyHeliostatYieldPanel=!1,s&&(e.actionInfo={name:"Close Heliostat Yearly Yield Graph",timestamp:(new Date).getTime()})}))},J=v(V.Heliostat);Object(r.useEffect)((function(){J<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyHeliostatIndividualOutputs=!1)}))}),[J,w]);var G=me.t("word.Month",U),X=me.t("heliostatYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyHeliostatYieldPanelRect||(e.viewState.yearlyHeliostatYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyHeliostatYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyHeliostatYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlyHeliostatYieldPanel"}))},children:Object(gf.jsx)(CF,{ref:P,style:{zIndex:"yearlyHeliostatYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(OF,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(FF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("heliostatYieldPanel.HeliostatYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(UC,{type:L.YearlyHeliostatYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,IF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:G,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[w&&J>1&&k.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("heliostatYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),J>1&&Object(gf.jsx)(eb.a,{title:me.t("heliostatYieldPanel.ShowOutputsOfIndividualHeliostats",U),checkedChildren:Object(gf.jsx)(xO.a,{}),unCheckedChildren:Object(gf.jsx)(xO.a,{}),checked:w,onChange:function(e){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(t){t.graphState&&(t.graphState.yearlyHeliostatIndividualOutputs=e),s&&(t.actionInfo={name:"Run Yearly Simulation For Heliostats: "+(e?"Individual":"Total"),timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForHeliostats=!0,e.pauseYearlySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==J?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Heliostats",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runYearlySimulationForHeliostats=!0,e.pauseYearlySimulationForHeliostats=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoHeliostatForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+G+"-"+X,"yearly-heliostat-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Heliostat Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-heliostat-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Heliostat Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},YF=n.a.memo(kF),LF=function(e){var t=e.dataSource,l=e.height,a=e.dataKeyAxisX,o=e.labelX,i=e.labelY1,n=e.labelY2,c=e.unitX,s=e.unitY1,d=e.unitY2,f=e.yMin1,h=void 0===f?"auto":f,p=e.yMax1,y=void 0===p?"auto":p,g=e.yMin2,m=void 0===g?"auto":g,w=e.yMax2,x=void 0===w?"auto":w,v=e.curveType,b=void 0===v?"linear":v,A=e.referenceX,T=e.fractionDigits,P=void 0===T?2:T,S=e.symbolCount,j=void 0===S?12:S,H=Object(r.useState)(0),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useState)(null),W=Object(u.a)(M,2),I=W[0],C=W[1];Object(r.useEffect)((function(){if(t&&0!==t.length){var e=Array.isArray(t)?Object.keys(t[0]).length-1:Object.keys(t).length-1;e--,R!==e/2&&D(e/2)}}),[t]);var O=Object(r.useMemo)((function(){var e,t=[];t.push(Object(gf.jsx)(lI.a,{yAxisId:"left",type:b,name:"T_Ambient",dataKey:"T_Ambient",stroke:Be[0],strokeDasharray:"5 5",opacity:.5,strokeWidth:2,dot:!1,isAnimationActive:!1},"ambient-temperature"));for(var l=0;l0&&(i||e),isAnimationActive:!1},"left-"+l)),a="V_Tower"+(l+1),i=YC(iI[2*l+1],1,j,o=null===I||I===a?1:.25),t.push(Object(gf.jsx)(lI.a,{yAxisId:"right",type:b,name:a,dataKey:a,stroke:Be[2*l+1],opacity:o,strokeWidth:2,dot:j>0&&(i||e),isAnimationActive:!1},"right-"+l))}return t}),[b,R,2,j,1,I]);return Object(gf.jsx)(gf.Fragment,{children:t&&Object(gf.jsx)("div",{id:"biaxial-line-graph-"+o+"-"+i+"-"+n,style:{width:"100%",height:"".concat(l,"%"),position:"relative",direction:"ltr"},children:Object(gf.jsx)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:Object(gf.jsx)(FW.a,{width:"100%",height:"100%",children:Object(gf.jsxs)(oI.a,{data:t,onMouseDown:function(){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(YW.a,{formatter:function(e){return e.toFixed(P)}}),Object(gf.jsx)(LW.a,{vertical:!0,horizontal:!0,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(EW.a,{yAxisId:"left",x:A,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(UW.a,{dataKey:null!==a&&void 0!==a?a:o,fontSize:"10px",children:Object(gf.jsx)(NW.a,{value:o+(c?" ("+c+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(VW.a,{domain:[h,y],yAxisId:"left",fontSize:"10px",children:Object(gf.jsx)(NW.a,{dx:-15,value:i+(s?" ("+s+")":""),offset:0,angle:-90,position:"center"})}),Object(gf.jsx)(VW.a,{domain:[m,x],yAxisId:"right",orientation:"right",fontSize:"10px",children:Object(gf.jsx)(NW.a,{dx:15,value:n+(d?" ("+d+")":""),offset:0,angle:-90,position:"center"})}),O,R>1&&Object(gf.jsx)(JW.a,{iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(){C(null)},onMouseEnter:function(e){C(e.dataKey)}})]})})})})})},EF=mv.a.div(rC||(rC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),UF=mv.a.div(nC||(nC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),NF=mv.a.div(cC||(cC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),VF=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),p=new Date(Ew(i.date)),y=Ew(us),g=Pf(Qd),m=Pf(qd),w=Ew(Zd),x=Ew(o.dailyUpdraftTowerYieldPanelRect),v=Pf(au),b=Tf(ms),A=Ew(Ni),T=n.a.useRef(null),P=Object(r.useRef)(null),S=Object(r.useRef)(),j=P.current?P.current.clientWidth+40:x?x.width+40:680,H=P.current?P.current.clientHeight+100:x?x.height+100:650,z=Object(r.useState)({x:x?Math.max(x.x,j-window.innerWidth):0,y:x?Math.min(x.y,window.innerHeight-H):0}),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(0),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useRef)(new Map),k={lng:a};Object(r.useEffect)((function(){var e=0;F.current.clear();var t,l=Object(f.a)(g);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Hour"!==o)e+=a[o],F.current.set(o,(null!==(i=F.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}O(e)}),[g]),Object(r.useEffect)((function(){M({x:Math.max(null===x||void 0===x?void 0:x.x,j-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-H)})}),[x,j,H]),Object(r.useEffect)((function(){var e=function(){M({x:Math.max(null===x||void 0===x?void 0:x.x,j-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-H)})};return window.addEventListener("resize",e),P.current&&(S.current||(S.current=new ResizeObserver((function(){d((function(e){P.current&&(e.viewState.dailyUpdraftTowerYieldPanelRect||(e.viewState.dailyUpdraftTowerYieldPanelRect=new Ot(0,0,640,550)),e.viewState.dailyUpdraftTowerYieldPanelRect.width=P.current.offsetWidth,e.viewState.dailyUpdraftTowerYieldPanelRect.height=P.current.offsetHeight)}))}))),S.current.observe(P.current)),function(){var t;window.removeEventListener("resize",e),null===(t=S.current)||void 0===t||t.disconnect()}}),[x,j,H]);var E=function(){d((function(e){e.viewState.showDailyUpdraftTowerYieldPanel=!1,c&&(e.actionInfo={name:"Close Solar Updraft Tower Daily Yield Graph",timestamp:(new Date).getTime()})}))},U=y(G.UpdraftTower);Object(r.useEffect)((function(){U<2&&w&&d((function(e){e.graphState&&(e.graphState.dailyUpdraftTowerIndividualOutputs=!1)}))}),[U,w]);var N=me.t("word.Hour",k),V=me.t("updraftTowerYieldPanel.YieldPerHour",k),J=me.t("updraftTowerYieldPanel.ChimneyAirTemperature",k),X=me.t("updraftTowerYieldPanel.ChimneyWindSpeed",k),B=!g||!g[0]||0===Object.keys(g[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:T,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){M({x:Math.max(t.x,j-window.innerWidth),y:Math.min(t.y,window.innerHeight-H)})},onStop:function(e,t){d((function(e){e.viewState.dailyUpdraftTowerYieldPanelRect||(e.viewState.dailyUpdraftTowerYieldPanelRect=new Ot(0,0,640,550)),e.viewState.dailyUpdraftTowerYieldPanelRect.x=Math.max(t.x,j-window.innerWidth),e.viewState.dailyUpdraftTowerYieldPanelRect.y=Math.min(t.y,window.innerHeight-H)}))},onMouseDown:function(){d((function(e){e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"}))},children:Object(gf.jsx)(EF,{ref:T,style:{zIndex:"dailySolarUpdraftTowerYieldPanel"===A?Ke:9},children:Object(gf.jsxs)(UF,{ref:P,style:{opacity:s,width:(x?x.width:640)+"px",height:(x?x.height:550)+"px"},children:[Object(gf.jsxs)(NF,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("updraftTowerYieldPanel.UpdraftTowerDailyYield",k)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",k)+" "+l+" | "+RW()(p).format("MM/DD")})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",k)})]}),Object(gf.jsx)(UC,{type:L.DailyUpdraftTowerYield,chartType:w?Y.Line:Y.Area,dataSource:g,labels:v,height:100,dataKeyAxisX:"Hour",labelX:N,labelY:V,unitY:me.t("word.kWh",k),yMin:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),Object(gf.jsx)(LF,{dataSource:m,height:100,dataKeyAxisX:"Hour",labelX:N,labelY1:J,labelY2:X,unitY1:"\xb0C",unitY2:me.t("word.MeterPerSecond",k),yMin1:0,yMin2:0,curveType:"linear",fractionDigits:2,symbolCount:24,referenceX:p.getHours()}),!b&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[U>1&&F.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(F.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:e[1].toFixed(3)})]}),t===F.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",k)+": "+C.toFixed(3)+" "+me.t("word.kWh",k)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",k)})}):Object(gf.jsxs)(wv.b,{style:{cursor:"default"},children:[me.t("updraftTowerYieldPanel.DailyTotal",k),":",C.toFixed(2)," ",me.t("word.kWh",k)]}),Object(gf.jsx)(xv.a,{type:"default",icon:B?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(B?"word.Run":"word.Update",k),onClick:function(){0!==U?(Kh(me.t("message.SimulationStarted",k)),setTimeout((function(){d((function(e){c&&(e.actionInfo={name:"Run Daily Simulation For Solar Updraft Tower",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.runDailySimulationForUpdraftTower=!0,e.pauseDailySimulationForUpdraftTower=!1,e.simulationInProgress=!0}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",k))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",k),onClick:function(){_h("line-graph-"+N+"-"+V,"daily-updraft-tower-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",k)),c&&d((function(e){e.actionInfo={name:"Take Screenshot of Daily Updraft Tower Yield Graph",timestamp:(new Date).getTime()}}))}))}}),g&&g.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",k),onClick:function(){$h(g,"daily-updraft-tower-yield.csv"),Kh(me.t("message.CsvFileSaved",k)),c&&d((function(e){e.actionInfo={name:"Export Daily Updraft Tower Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},JF=n.a.memo(VF),GF=mv.a.div(sC||(sC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n"]))),XF=mv.a.div(dC||(dC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n"]))),BF=mv.a.div(uC||(uC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),KF=function(e){var t,l,a,c=e.city,s=Ew(Vi),d=Ew(Sr),f=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,h=Ew(si),p=new Date(Ew(i.date)),y=Ew(i.latitude),g=Ew(i.ground),m=null!==(l=Ew(i.diurnalTemperatureModel))&&void 0!==l?l:U.Sinusoidal,w=null!==(a=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==a?a:900,v=Ew(Cs),b=Ew(o.diurnalTemperaturePanelRect),A=Ew(Ni),T=n.a.useRef(null),P=Object(r.useRef)(null),S=Object(r.useRef)(),j=P.current?P.current.clientWidth+40:b?b.width+40:640,H=P.current?P.current.clientHeight+100:b?b.height+100:500,z=Object(r.useState)({x:b?Math.min(b.x,window.innerWidth-j):0,y:b?Math.min(b.y,window.innerHeight-H):0}),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(m),I=Object(u.a)(W,2),C=I[0],O=I[1],F={lng:s};Object(r.useEffect)((function(){M({x:Math.min(null===b||void 0===b?void 0:b.x,window.innerWidth-j),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-H)})}),[b,j,H]),Object(r.useEffect)((function(){var e=function(){M({x:Math.min(null===b||void 0===b?void 0:b.x,window.innerWidth-j),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-H)})};return window.addEventListener("resize",e),P.current&&(S.current||(S.current=new ResizeObserver((function(){h((function(e){P.current&&(e.viewState.diurnalTemperaturePanelRect||(e.viewState.diurnalTemperaturePanelRect=new Ot(0,0,600,400)),e.viewState.diurnalTemperaturePanelRect.width=P.current.offsetWidth,e.viewState.diurnalTemperaturePanelRect.height=P.current.offsetHeight)}))}))),S.current.observe(P.current)),function(){var t;window.removeEventListener("resize",e),null===(t=S.current)||void 0===t||t.disconnect()}}),[b,j,H]);var k=Object(r.useMemo)((function(){var e=[];if(c){var t=v(c);if(t)for(var l=Ty(p,y),a=0;a<24;a++){var o;p.setHours(a);var i=HT(p,t.lowestTemperatures,t.highestTemperatures),r=Tw.minutesIntoDay(p);e.push({Hour:a,Sinusoidal:jT(i.high,i.low,U.Sinusoidal,w,l,r),PartonLogan:jT(i.high,i.low,U.PartonLogan,w,l,r),Ground:zT(y,Tw.dayOfYear(p),r,t.lowestTemperatures,t.highestTemperatures,w,.5*(i.high-i.low),null!==(o=g.thermalDiffusivity)&&void 0!==o?o:.05,1)})}}return e}),[c,w,m,p.getMonth(),p.getDate()]),E=function(){var e={name:"Close Diurnal Temperature Panel",timestamp:Date.now(),undo:function(){h((function(e){e.viewState.showDiurnalTemperaturePanel=!0}))},redo:function(){h((function(e){e.viewState.showDiurnalTemperaturePanel=!1}))}};d(e),h((function(e){e.viewState.showDiurnalTemperaturePanel=!1}))};return Object(gf.jsx)(JT.a,{nodeRef:T,handle:".handle",bounds:"parent",axis:"both",position:D,onDrag:function(e,t){M({x:Math.min(t.x,window.innerWidth-j),y:Math.min(t.y,window.innerHeight-H)})},onStop:function(e,t){h((function(e){e.viewState.diurnalTemperaturePanelRect||(e.viewState.diurnalTemperaturePanelRect=new Ot(0,0,600,400)),e.viewState.diurnalTemperaturePanelRect.x=Math.min(t.x,window.innerWidth-j),e.viewState.diurnalTemperaturePanelRect.y=Math.min(t.y,window.innerHeight-H)}))},onMouseDown:function(){h((function(e){e.selectedFloatingWindow="diurnalTemperaturePanel"}))},children:Object(gf.jsx)(GF,{ref:T,style:{zIndex:"diurnalTemperaturePanel"===A?Ke:10},children:Object(gf.jsxs)(XF,{ref:P,style:{opacity:f,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)(BF,{className:"handle",children:[Object(gf.jsx)("span",{children:me.t("menu.settings.DiurnalTemperature",F)+": "+c+" | "+x()(p).format("MM/DD")}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){E()},onMouseDown:function(){E()},children:me.t("word.Close",F)})]}),Object(gf.jsx)(UC,{chartType:Y.Line,type:L.HourlyTemperatures,selectedIndex:C-U.Sinusoidal,dataSource:k,height:100,dataKeyAxisX:"Hour",labelX:me.t("word.Hour",F),labelY:me.t("word.Temperature",F),unitY:"\xb0C",fractionDigits:1,referenceX:p.getHours()}),Object(gf.jsxs)(wv.b,{style:{alignSelf:"center"},children:[Object(gf.jsx)(wv.b,{children:me.t("diurnalTemperaturePanel.SelectAirTemperatureModel",F)}),Object(gf.jsxs)(tb.a.Group,{onChange:function(e){var t=C,l=e.target.value,a={name:"Change Diurnal Temperature Model",timestamp:Date.now(),oldValue:t,newValue:l,undo:function(){O(a.oldValue),h((function(e){e.world.diurnalTemperatureModel=a.oldValue}))},redo:function(){O(a.newValue),h((function(e){e.world.diurnalTemperatureModel=a.newValue}))}};d(a),O(l),h((function(e){e.world.diurnalTemperatureModel=l}))},value:C,children:[Object(gf.jsx)(tb.a,{value:U.Sinusoidal,children:me.t("diurnalTemperaturePanel.Sinusoidal",F)}),Object(gf.jsx)(tb.a,{value:U.PartonLogan,children:"Parton-Logan"})]})]})]})})})},qF=n.a.memo(KF),QF=["Daylight","Clearness"],ZF=mv.a.div(fC||(fC=Object(gv.a)(["\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),_F=mv.a.div(hC||(hC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),$F=mv.a.div(pC||(pC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),ek=function(e){var t,l,a=e.city,c=Ew(Vi),s=Ew(Gi),d=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,p=Ew(si),y=null!==(l=Ew(i.sutDaysPerYear))&&void 0!==l?l:6,g=new Date(Ew(i.date)),m=Pf(eu),w=Ew(tu),x=Pf(au),v=Ew(us),b=Ew(o.yearlyUpdraftTowerYieldPanelRect),A=Tf(ms),T=Ew(Ni),P=n.a.useRef(null),S=Object(r.useRef)(null),j=Object(r.useRef)(),H=S.current?S.current.clientWidth+40:b?b.width+40:640,z=S.current?S.current.clientHeight+100:b?b.height+100:500,R=Object(r.useState)({x:b?Math.max(b.x,H-window.innerWidth):0,y:b?Math.min(b.y,window.innerHeight-z):0}),D=Object(u.a)(R,2),M=D[0],W=D[1],I=Object(r.useState)(0),C=Object(u.a)(I,2),O=C[0],F=C[1],k=Object(r.useRef)(new Map),E=it[g.getMonth()],U={lng:c};Object(r.useEffect)((function(){var e=0;k.current.clear();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;for(var o in a){var i;if(a.hasOwnProperty(o))if("Month"!==o)e+=a[o],k.current.set(o,(null!==(i=k.current.get(o))&&void 0!==i?i:0)+a[o])}}}catch(r){l.e(r)}finally{l.f()}F(e)}),[m]),Object(r.useEffect)((function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})}),[b,H,z]),Object(r.useEffect)((function(){var e=function(){W({x:Math.max(null===b||void 0===b?void 0:b.x,H-window.innerWidth),y:Math.min(null===b||void 0===b?void 0:b.y,window.innerHeight-z)})};return window.addEventListener("resize",e),S.current&&(j.current||(j.current=new ResizeObserver((function(){p((function(e){S.current&&(e.viewState.yearlyUpdraftTowerYieldPanelRect||(e.viewState.yearlyUpdraftTowerYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyUpdraftTowerYieldPanelRect.width=S.current.offsetWidth,e.viewState.yearlyUpdraftTowerYieldPanelRect.height=S.current.offsetHeight)}))}))),j.current.observe(S.current)),function(){var t;window.removeEventListener("resize",e),null===(t=j.current)||void 0===t||t.disconnect()}}),[b,H,z]);var N=function(){p((function(e){e.viewState.showYearlyUpdraftTowerYieldPanel=!1,s&&(e.actionInfo={name:"Close Solar Updraft Tower Yearly Yield Graph",timestamp:(new Date).getTime()})}))},V=v(G.UpdraftTower);Object(r.useEffect)((function(){V<2&&w&&p((function(e){e.graphState&&(e.graphState.yearlyUpdraftTowerIndividualOutputs=!1)}))}),[V,w]);var J=me.t("word.Month",U),X=me.t("updraftTowerYieldPanel.Yield",U),B=12/y,K=!m||!m[0]||0===Object.keys(m[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:P,handle:".handle",bounds:"parent",axis:"both",position:M,onDrag:function(e,t){W({x:Math.max(t.x,H-window.innerWidth),y:Math.min(t.y,window.innerHeight-z)})},onStop:function(e,t){p((function(e){e.viewState.yearlyUpdraftTowerYieldPanelRect||(e.viewState.yearlyUpdraftTowerYieldPanelRect=new Ot(0,0,600,400)),e.viewState.yearlyUpdraftTowerYieldPanelRect.x=Math.max(t.x,H-window.innerWidth),e.viewState.yearlyUpdraftTowerYieldPanelRect.y=Math.min(t.y,window.innerHeight-z)}))},onMouseDown:function(){p((function(e){e.selectedFloatingWindow="yearlySolarUpdraftTowerYieldPanel"}))},children:Object(gf.jsx)(ZF,{ref:P,style:{zIndex:"yearlySolarUpdraftTowerYieldPanel"===T?Ke:9},children:Object(gf.jsxs)(_F,{ref:S,style:{opacity:d,width:(b?b.width:600)+"px",height:(b?b.height:400)+"px"},children:[Object(gf.jsxs)($F,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("updraftTowerYieldPanel.UpdraftTowerYearlyYield",U)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",U)+" "+a+" | "+g.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){N()},onMouseDown:function(){N()},children:me.t("word.Close",U)})]}),Object(gf.jsx)(UC,{type:L.YearlyUpdraftTowerYield,chartType:w?Y.Line:Y.Area,dataSource:m.map((function(e){e.Daylight,e.Clearness;return Object(Kx.a)(e,QF)})),labels:x,height:100,dataKeyAxisX:"Month",labelX:J,labelY:X,unitY:me.t("word.kWh",U),yMin:0,curveType:"linear",fractionDigits:2,referenceX:E}),!A&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[V>1&&k.current.size>0?Object(gf.jsx)(tD.a,{title:Object(h.a)(k.current.entries()).map((function(e,t){return Object(gf.jsxs)(n.a.Fragment,{children:[Object(gf.jsxs)(UT.a,{style:{textAlign:"right"},children:[Object(gf.jsx)(NT.a,{span:16,style:{textAlign:"right",paddingRight:"8px"},children:e[0]+": "}),Object(gf.jsx)(NT.a,{span:8,children:(e[1]*B).toFixed(2)})]}),t===k.current.size-1&&Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)("hr",{}),Object(gf.jsx)("div",{style:{textAlign:"right"},children:me.t("word.Total",U)+": "+(O*B).toFixed(2)+" "+me.t("word.kWh",U)})]})]},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"pointer",border:"2px solid #ccc",padding:"4px"},children:me.t("shared.OutputBreakdown",U)})}):Object(gf.jsxs)(wv.b,{children:[me.t("updraftTowerYieldPanel.YearlyTotal",U),":",(O*B).toFixed(2)," ",me.t("word.kWh",U)]}),Object(gf.jsx)(xv.a,{type:"default",icon:K?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(K?"word.Run":"word.Update",U),onClick:function(){0!==V?(Kh(me.t("message.SimulationStarted",U)),setTimeout((function(){p((function(e){s&&(e.actionInfo={name:"Run Yearly Simulation For Solar Updraft Tower",timestamp:(new Date).getTime()})})),Tf.setState((function(e){e.simulationInProgress=!0,e.runYearlySimulationForUpdraftTower=!0,e.pauseYearlySimulationForUpdraftTower=!1}))}),100)):Kh(me.t("analysisManager.NoSolarUpdraftTowerForAnalysis",U))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",U),onClick:function(){_h("line-graph-"+J+"-"+X,"yearly-updraft-tower-yield",{}).then((function(){Kh(me.t("message.ScreenshotSaved",U)),s&&p((function(e){e.actionInfo={name:"Take Screenshot of Yearly Updraft Tower Yield Graph",timestamp:(new Date).getTime()}}))}))}}),m&&m.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",U),onClick:function(){$h(m,"yearly-updraft-tower-yield.csv"),Kh(me.t("message.CsvFileSaved",U)),s&&p((function(e){e.actionInfo={name:"Export Yearly Updraft Tower Yield Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},tk=n.a.memo(ek),lk=function(e){var t=e.dataSource,l=e.labels,a=e.height,o=e.dataKeyAxisX,i=e.labelX,n=e.labelY1,c=e.labelY2,s=e.unitX,d=e.unitY1,f=e.unitY2,h=e.yMin1,p=void 0===h?"auto":h,y=e.yMax1,g=void 0===y?"auto":y,m=e.yMin2,w=void 0===m?"auto":m,x=e.yMax2,v=void 0===x?"auto":x,b=e.curveType,A=void 0===b?"linear":b,T=e.referenceX,P=e.fractionDigits,S=void 0===P?2:P,j=Ew(ff),H=Object(r.useState)(null),z=Object(u.a)(H,2),R=z[0],D=z[1],M=Object(r.useRef)([]),W=Object(r.useMemo)((function(){if(!t||0===t.length)return[];var e,a=Object.keys(t[0]).length-1,o=t[1]?Object.keys(t[1]).length-1:a,i=t.length,r=[],n=a-1,c=(o-a)/n;M.current.length=0;for(var s=0;s0&&(f||e),isAnimationActive:!1},"left-"+s)),M.current.push({id:d,type:"line",value:d,color:Be[s]})}else if(s===n){var h="Objective",p=null===R||R===h?1:.25,y=YC(iI[s],1,i,p);r.push(Object(gf.jsx)(lI.a,{yAxisId:"right",type:A,name:h,dataKey:h,stroke:Be[s],opacity:p,strokeWidth:2,dot:i>0&&(y||e),isAnimationActive:!1},"right")),M.current.push({id:h,type:"line",value:h,color:Be[n]})}else{var g=Math.floor((s-a)/c),m="Individual"+(s+1),w=YC(iI[g],.5,i,.5,Be[g]);r.push(Object(gf.jsx)(lI.a,{yAxisId:"left",type:A,name:m,dataKey:m,opacity:.5,stroke:Be[g],strokeWidth:0,dot:w||e,isAnimationActive:!1},"left-"+s))}return r}),[t,A,2,1,R]);return Object(gf.jsx)(gf.Fragment,{children:t&&Object(gf.jsx)("div",{id:"biaxial-line-graph-"+i+"-"+n+"-"+c,style:{width:"100%",height:"".concat(a,"%"),position:"relative",direction:"ltr"},children:Object(gf.jsx)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:Object(gf.jsx)(FW.a,{width:"100%",height:"100%",children:Object(gf.jsxs)(oI.a,{data:t,onMouseDown:function(){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(YW.a,{formatter:function(e){return e.toFixed(S)},content:function(e){var t=e.active,l=e.payload;return t&&l?l.map((function(e){var t,l;return(null===(t=e.name)||void 0===t?void 0:t.toString().startsWith("Individual"))?null:(l="Tilt Angle"===e.name?Tw.toDegrees(e.value*(j.maximumTiltAngle-j.minimumTiltAngle)+j.minimumTiltAngle).toFixed(S)+"\xb0":"Inter-Row Spacing"===e.name?(e.value*(j.maximumInterRowSpacing-j.minimumInterRowSpacing)+j.minimumInterRowSpacing).toFixed(S)+"m":"Rack Width"===e.name?Math.floor(e.value*(j.maximumRowsPerRack-j.minimumRowsPerRack)+j.minimumRowsPerRack)+" panels":"Objective"===e.name?e.value.toFixed(S)+" "+f:e.value.toFixed(S),Object(gf.jsxs)("div",{children:[e.name,": ",l]},e.name))})):null}}),Object(gf.jsx)(LW.a,{vertical:!0,horizontal:!0,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(EW.a,{yAxisId:"left",x:T,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(UW.a,{dataKey:null!==o&&void 0!==o?o:i,style:{fontSize:"10px"},children:Object(gf.jsx)(NW.a,{value:i+(s?" ("+s+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(VW.a,{domain:[p,g],yAxisId:"left",style:{fontSize:"10px"},children:Object(gf.jsx)(NW.a,{dx:-20,value:n+(d?" ("+d+")":""),offset:0,angle:-90,position:"center"})}),Object(gf.jsx)(VW.a,{domain:[w,v],yAxisId:"right",orientation:"right",style:{fontSize:"10px"},children:Object(gf.jsx)(NW.a,{dx:30,value:c+(f?" ("+f+")":""),offset:0,angle:-90,position:"center"})}),W,Object(gf.jsx)(JW.a,{payload:M.current,iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(){D(null)},onMouseEnter:function(e){D(e.id)}})]})})})})})},ak=mv.a.div(yC||(yC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 8;\n"]))),ok=mv.a.div(gC||(gC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),ik=mv.a.div(mC||(mC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),rk=function(){var e,t=Ew(Vi),l=Ew(Gi),a=null!==(e=Ew(Ui))&&void 0!==e?e:Qe,i=Ew(si),c=Ew(nf),s=Ew(sf),d=Ew(o.evolutionPanelRect),f=Ew(ln),h=Ew(Gr),p=Ew.getState().evolutionaryAlgorithmState,y=Tf(ms),g=Tf(xs),m=Ew(Ni),w=n.a.useRef(null),x=Object(r.useRef)(null),v=Object(r.useRef)(),b=x.current?x.current.clientWidth+40:d?d.width+40:680,A=x.current?x.current.clientHeight+100:d?d.height+100:500,T=Object(r.useState)({x:d?Math.max(d.x,b-window.innerWidth):0,y:d?Math.min(d.y,window.innerHeight-A):0}),P=Object(u.a)(T,2),S=P[0],j=P[1],H=Object(r.useMemo)((function(){return{lng:t}}),[t]);Object(r.useEffect)((function(){j({x:Math.max(null===d||void 0===d?void 0:d.x,b-window.innerWidth),y:Math.min(null===d||void 0===d?void 0:d.y,window.innerHeight-A)})}),[d,b,A]),Object(r.useEffect)((function(){var e=function(){j({x:Math.max(null===d||void 0===d?void 0:d.x,b-window.innerWidth),y:Math.min(null===d||void 0===d?void 0:d.y,window.innerHeight-A)})};return window.addEventListener("resize",e),x.current&&(v.current||(v.current=new ResizeObserver((function(){i((function(e){x.current&&(e.viewState.evolutionPanelRect||(e.viewState.evolutionPanelRect=new Ot(0,0,640,400)),e.viewState.evolutionPanelRect.width=x.current.offsetWidth,e.viewState.evolutionPanelRect.height=x.current.offsetHeight)}))}))),v.current.observe(x.current)),function(){var t;window.removeEventListener("resize",e),null===(t=v.current)||void 0===t||t.disconnect()}}),[d,b,A]);var z=function(){i((function(e){e.viewState.showEvolutionPanel=!1,l&&(e.actionInfo={name:"Close Solar Panel Optimization Graph",timestamp:(new Date).getTime()})}))},R=Object(r.useMemo)((function(){return h&&h!==I.GENETIC_ALGORITHM?p.particleSwarmOptimizationParams:p.geneticAlgorithmParams}),[h,p]),D=Object(r.useMemo)((function(){return me.t(h===I.GENETIC_ALGORITHM?"optimizationMenu.Generation":"optimizationMenu.Step",H)}),[h,H]),C=Object(r.useMemo)((function(){return R.problem===M.SOLAR_PANEL_TILT_ANGLE?me.t("solarPanelMenu.TiltAngle",H):me.t("optimizationMenu.NormalizedVariables",H)}),[R.problem,H]),O=Object(r.useMemo)((function(){return R.problem===M.SOLAR_PANEL_TILT_ANGLE?"\xb0":""}),[R.problem]),F=Object(r.useMemo)((function(){return R.problem!==M.SOLAR_PANEL_ARRAY||R.objectiveFunctionType!==W.DAILY_PROFIT&&R.objectiveFunctionType!==W.YEARLY_PROFIT?me.t("word.kWh",H):me.t("word.dollar",H)}),[R.problem,R.objectiveFunctionType,H]),k=Object(r.useMemo)((function(){switch(R.objectiveFunctionType){case W.DAILY_PROFIT:return me.t("optimizationMenu.ObjectiveFunctionDailyProfit",H);case W.YEARLY_PROFIT:return me.t("optimizationMenu.ObjectiveFunctionYearlyProfit",H);case W.DAILY_AVERAGE_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionDailyMeanYield",H);case W.YEARLY_AVERAGE_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionYearlyMeanYield",H);case W.DAILY_TOTAL_OUTPUT:return me.t("optimizationMenu.ObjectiveFunctionDailyTotalYield",H)}return me.t("optimizationMenu.ObjectiveFunctionYearlyTotalYield",H)}),[R.objectiveFunctionType,H]),Y=Object(r.useMemo)((function(){return!!f&&(R.problem===M.SOLAR_PANEL_TILT_ANGLE?f.type===V.Foundation:R.problem===M.SOLAR_PANEL_ARRAY&&f.type===V.Polygon)}),[R.problem,f]),L=Object(r.useMemo)((function(){return R.problem===M.SOLAR_PANEL_ARRAY?me.t("optimizationMenu.ClickTargetPolygonToActivate",H):me.t("optimizationMenu.ClickTargetFoundationToActivate",H)}),[R.problem,H]),E=Object(r.useMemo)((function(){var e="";return R.problem===M.SOLAR_PANEL_TILT_ANGLE&&(e+=me.t("optimizationMenu.SolarPanelTiltAngleOptimization",H)),R.problem===M.SOLAR_PANEL_ARRAY&&(e+=me.t("optimizationMenu.SolarPanelArrayLayout",H)),e+=": ",e+=h===I.GENETIC_ALGORITHM?me.t("optimizationMenu.GeneticAlgorithm",H):me.t("optimizationMenu.ParticleSwarmOptimization",H)}),[R.problem,h,H]);return Object(gf.jsx)(JT.a,{nodeRef:w,handle:".handle",bounds:"parent",axis:"both",position:S,onDrag:function(e,t){j({x:Math.max(t.x,b-window.innerWidth),y:Math.min(t.y,window.innerHeight-A)})},onStop:function(e,t){i((function(e){e.viewState.evolutionPanelRect||(e.viewState.evolutionPanelRect=new Ot(0,0,640,400)),e.viewState.evolutionPanelRect.x=Math.max(t.x,b-window.innerWidth),e.viewState.evolutionPanelRect.y=Math.min(t.y,window.innerHeight-A)}))},onMouseDown:function(){i((function(e){e.selectedFloatingWindow="solarPanelOptimizationResult"}))},children:Object(gf.jsx)(ak,{ref:w,style:{zIndex:"solarPanelOptimizationResult"===m?Ke:9},children:Object(gf.jsxs)(ok,{ref:x,style:{opacity:a,width:(d?d.width:640)+"px",height:(d?d.height:400)+"px"},children:[Object(gf.jsxs)(ik,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsx)("span",{children:E}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){z()},onMouseDown:function(){z()},children:me.t("word.Close",H)})]}),Object(gf.jsx)(lk,{dataSource:c,labels:s,height:100,dataKeyAxisX:"Step",labelX:D,labelY1:C,labelY2:k,unitY1:O,unitY2:F,curveType:"linear",fractionDigits:2}),!y&&!g&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[Y&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(BR.a,{}),title:me.t("word.Run",H),onClick:function(){Kh(me.t("message.EvolutionStarted",H)),setTimeout((function(){Tf.setState((function(e){e.runEvolution=!0,e.pauseEvolution=!1,e.evolutionInProgress=!0})),l&&i((function(e){var t;R.problem===M.SOLAR_PANEL_ARRAY?h===I.GENETIC_ALGORITHM?t="Run Genetic Algorithm for Solar Panel Array Layout":h===I.PARTICLE_SWARM_OPTIMIZATION&&(t="Run Particle Swarm Optimization for Solar Panel Array Layout"):R.problem===M.SOLAR_PANEL_TILT_ANGLE&&(h===I.GENETIC_ALGORITHM?t="Run Genetic Algorithm for Solar Panel Tilt Angle":h===I.PARTICLE_SWARM_OPTIMIZATION&&(t="Run Particle Swarm Optimization for Solar Panel Tilt Angle")),t&&(e.actionInfo={name:t,timestamp:(new Date).getTime()})}))}),100)}}),!Y&&Object(gf.jsx)("span",{children:L}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",H),onClick:function(){_h("biaxial-line-graph-"+D+"-"+C+"-"+k,"solar-panel-tilt-angle-evolution",{}).then((function(){Kh(me.t("message.ScreenshotSaved",H))}))}})]})]})})})},nk=n.a.memo(rk),ck=function(e){var t=e.setDialogVisible,l=Ew(si),a=Ew(Vi),o=Ew(rf),i=Ew(Sr),n=Object(r.useState)(!1),c=Object(u.a)(n,2),s=c[0],d=c[1],f=Object(r.useState)(!1),h=Object(u.a)(f,2),p=h[0],y=h[1],g=Object(r.useState)({left:0,top:0,bottom:0,right:0}),m=Object(u.a)(g,2),w=m[0],x=m[1],v=Object(r.useRef)(null),b=Object(r.useRef)(null),A=Object(r.useRef)(o.electricitySellingPrice),T=Object(r.useRef)(o.operationalCostPerUnit),P={lng:a};Object(r.useEffect)((function(){var e;null===(e=b.current)||void 0===e||e.focus()}),[]);return Object(gf.jsxs)(Zv.a,{width:500,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return y(!0)},onMouseOut:function(){return y(!1)},children:me.t("economicsPanel.EconomicsParameters",P)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){t(!1)},children:me.t("word.Cancel",P)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:b,onClick:function(){!function(){var e=o.electricitySellingPrice,t=A.current;if(e!==t){var a={name:"Electricity Selling Price",timestamp:Date.now(),oldValue:e,newValue:t,undo:function(){l((function(e){e.economicsParams.electricitySellingPrice=a.oldValue}))},redo:function(){l((function(e){e.economicsParams.electricitySellingPrice=a.newValue}))}};i(a),l((function(e){e.economicsParams.electricitySellingPrice=t}))}var r=o.operationalCostPerUnit,n=T.current;if(r!==n){var c={name:"Operational Cost per Unit",timestamp:Date.now(),oldValue:r,newValue:n,undo:function(){l((function(e){e.economicsParams.operationalCostPerUnit=c.oldValue}))},redo:function(){l((function(e){e.economicsParams.operationalCostPerUnit=c.newValue}))}};i(c),l((function(e){e.economicsParams.operationalCostPerUnit=n}))}}(),t(!1)},children:me.t("word.OK",P)},"OK")],onCancel:function(){t(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!p,bounds:w,onStart:function(e,t){return function(e,t){if(v.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=v.current.getBoundingClientRect();x({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:v,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:me.t("economicsPanel.ElectricitySellingPrice",P)+" ([0.1, 1]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)($v.a,{min:.1,max:1,style:{width:"100%"},precision:2,value:A.current,step:.01,formatter:function(e){return"$".concat(e,"/kWh")},onChange:function(e){A.current=e,d(!s)},onBlur:function(e){var t=e.target.value.replace("$","").replace("/kWh",""),l=parseFloat(t);A.current=Number.isNaN(l)?.1:l,d(!s)},onPressEnter:function(e){var t=e.target.value.replace("$","").replace("/kWh",""),l=parseFloat(t);A.current=Number.isNaN(l)?.1:l,d(!s)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:me.t("economicsPanel.OperationalCostPerUnit",P)+" ([0.1, 1]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)($v.a,{min:.1,max:1,style:{width:"100%"},precision:2,value:T.current,step:.01,formatter:function(e){return"$".concat(e,"/day")},onChange:function(e){T.current=e,d(!s)},onBlur:function(e){var t=e.target.value.replace("$","").replace("/day",""),l=parseFloat(t);T.current=Number.isNaN(l)?.1:l,d(!s)},onPressEnter:function(e){var t=e.target.value.replace("$","").replace("/day",""),l=parseFloat(t);T.current=Number.isNaN(l)?.1:l,d(!s)}})})]})]})},sk=n.a.memo(ck),dk=function(e,t,l){var a=Ew.getState().elements,o=Ew(_r),i=Ew(Zr),n=Tf(bi),c=Pf(Ai),s=Pf(Pi),d=Pf(ji),u=[],h=[],p=Object(r.useRef)(new Map),y=Object(r.useRef)(new Map),g=Object(r.useRef)(new Map);return Object(r.useEffect)((function(){var r=HT(e,t.lowestTemperatures,t.highestTemperatures);p.current.clear(),y.current.clear(),g.current.clear();for(var n=0;n<24;n++){var m,w={},x=new Map,v=Object(f.a)(a);try{for(v.s();!(m=v.n()).done;){var b=m.value;if(Tw.onBuildingEnvelope(b)){var A=c.get(b.id);if(A){var T=b.type===V.Foundation?b:o(b);if(T&&!T.notBuilding&&Tw.getBuildingCompletionStatus(T,a)===D.COMPLETE){var P,S,j,H=x.get(T.id);if(!H)H=l?{heater:0,ac:0,geothermal:0,solarPanel:0,label:null===(P=T.label)||void 0===P?void 0:P.trim()}:{heater:0,ac:0,geothermal:0,label:null===(S=T.label)||void 0===S?void 0:S.trim()},x.set(T.id,H),(null===(j=T.hvacSystem)||void 0===j?void 0:j.id)?T.hvacSystem.id&&T.hvacSystem.id.length>0&&!h.includes(T.hvacSystem.id)&&h.push(T.hvacSystem.id):T.label&&T.label.length>0&&!h.includes(T.label)&&h.push(T.label);b.type===V.Foundation?H.geothermal+=A[n]:A[n]<0?H.heater+=A[n]:H.ac+=A[n]}}}}}catch(Se){v.e(Se)}finally{v.f()}var z,R=Object(f.a)(a);try{for(R.s();!(z=R.n()).done;){var M=z.value;if(M.type===V.Foundation){var W=M;if(!W.notBuilding&&Tw.getBuildingCompletionStatus(W,a)!==D.COMPLETE)continue;var I=x.get(M.id);if(I){var C=s.get(M.id);if(C&&(I.heater<0?(I.heater+=C[n],I.heater>0&&(I.heater=0)):I.ac>0&&(I.ac+=C[n])),void 0!==I.solarPanel){var O=d.get(M.id);O&&(I.solarPanel+=O[n])}}}}}catch(Se){R.e(Se)}finally{R.f()}if(x.size>1){var F,k=1,Y=Object(f.a)(x.keys());try{for(Y.s();!(F=Y.n()).done;){var L=F.value;w.Hour=n;var E=x.get(L);if(E){var U=i(L);if(U&&U.type===V.Foundation){var N=U;if(!N.notBuilding&&Tw.getBuildingCompletionStatus(N,a)===D.COMPLETE){var J,G,X,B,K,q,Q=null!==(J=null===(G=N.hvacSystem)||void 0===G?void 0:G.thermostatSetpoint)&&void 0!==J?J:20,Z=null!==(X=null===(B=N.hvacSystem)||void 0===B?void 0:B.temperatureThreshold)&&void 0!==X?X:3,_=null!==(K=null===(q=N.hvacSystem)||void 0===q?void 0:q.id)&&void 0!==K?K:E.label&&""!==E.label?E.label:k.toString();_===k.toString()&&k++;var $=Math.abs(ST(r,E.heater,Q,Z)),ee=ST(r,E.ac,Q,Z);$>0?($-=E.geothermal)<0&&($=0):ee>0&&(ee+=E.geothermal)<0&&(ee=0);var te="Heater "+_;w[te]?w[te]=w[te]+$:w[te]=$;var le="AC "+_;if(w[le]?w[le]=w[le]+ee:w[le]=ee,void 0!==E.solarPanel){var ae="Solar "+_;w[ae]?w[ae]=w[ae]-E.solarPanel:w[ae]=-E.solarPanel}var oe,ie,re="Net "+_;if(w[re])w[re]=w[re]+$+ee-(null!==(oe=E.solarPanel)&&void 0!==oe?oe:0);else w[re]=$+ee-(null!==(ie=E.solarPanel)&&void 0!==ie?ie:0);var ne=p.current.get(_);void 0===ne&&(ne=0),ne+=$,p.current.set(_,ne),void 0===(ne=y.current.get(_))&&(ne=0),ne+=ee,y.current.set(_,ne),l&&(void 0===(ne=g.current.get(_))&&(ne=0),ne+=E.solarPanel,g.current.set(_,ne))}}}}}catch(Se){Y.e(Se)}finally{Y.f()}}else{var ce,se=Object(f.a)(x.keys());try{for(se.s();!(ce=se.n()).done;){var de=ce.value;w.Hour=n;var ue=x.get(de);if(ue){var fe=i(de);if(fe&&fe.type===V.Foundation){var he=fe;if(!he.notBuilding&&Tw.getBuildingCompletionStatus(he,a)===D.COMPLETE){var pe,ye,ge,me,we,xe=null!==(pe=null===(ye=he.hvacSystem)||void 0===ye?void 0:ye.thermostatSetpoint)&&void 0!==pe?pe:20,ve=null!==(ge=null===(me=he.hvacSystem)||void 0===me?void 0:me.temperatureThreshold)&&void 0!==ge?ge:3,be=Math.abs(ST(r,ue.heater,xe,ve)),Ae=ST(r,ue.ac,xe,ve);be>0?(be-=ue.geothermal)<0&&(be=0):Ae>0&&(Ae+=ue.geothermal)<0&&(Ae=0),w.Heater=be,w.AC=Ae,void 0!==ue.solarPanel&&(w.Solar=-ue.solarPanel),w.Net=be+Ae-(null!==(we=ue.solarPanel)&&void 0!==we?we:0);var Te="default",Pe=p.current.get(Te);void 0===Pe&&(Pe=0),Pe+=be,p.current.set(Te,Pe),void 0===(Pe=y.current.get(Te))&&(Pe=0),Pe+=Ae,y.current.set(Te,Pe),l&&(void 0===(Pe=g.current.get(Te))&&(Pe=0),Pe+=ue.solarPanel,g.current.set(Te,Pe))}}}}}catch(Se){se.e(Se)}finally{se.f()}}u.push(w)}}),[n]),{sum:u,sumHeaterMap:p.current,sumAcMap:y.current,sumSolarPanelMap:g.current,dataLabels:h}},uk=l(829),fk=Object(mv.a)(ZW)(wC||(wC=Object(gv.a)(["\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n"]))),hk=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.lineWidth,o=e.symbolSize,i=e.barCategoryGap,n=e.changeHorizontalGrid,c=e.changeVerticalGrid,s=e.changeLineWidth,d=e.changeSymbolSize,f=e.changeBarCategoryGap,h={lng:Ew(Vi)},p=Object(r.useState)(!1),y=Object(u.a)(p,2),g=y[0],m=y[1],w=Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.LineWidth",h)+":",Object(gf.jsx)($S.a,{min:0,max:10,tooltipVisible:!1,defaultValue:2*a,onChange:function(e){null===s||void 0===s||s(e/2)}})]}),Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.SymbolSize",h)+":",Object(gf.jsx)($S.a,{min:2,max:12,tooltipVisible:!1,defaultValue:5*o,onChange:function(e){null===d||void 0===d||d(e/5)}})]}),Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.BarCategoryGap",h)+":",Object(gf.jsx)($S.a,{min:0,max:20,tooltipVisible:!1,defaultValue:i,onChange:function(e){null===f||void 0===f||f(e)}})]}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:t,onClick:function(){null===n||void 0===n||n(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",h)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:l,onClick:function(){null===c||void 0===c||c(!l)},children:me.t("menu.graph.ShowVerticalGridLines",h)})})]});return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(lb.a,{overlay:w,placement:"bottomRight",visible:g,onVisibleChange:function(e){m(e)},children:Object(gf.jsx)(fk,{style:{right:"25px"},onClick:function(e){e.stopPropagation()}})})})},pk=function(e){var t=e.type,l=e.dataSource,a=e.hasSolarPanels,o=e.labels,i=e.height,n=e.dataKeyAxisX,c=e.labelX,s=e.labelY,d=e.unitX,f=e.unitY,h=e.yMin,p=void 0===h?"auto":h,y=e.yMax,g=void 0===y?"auto":y,m=e.curveType,w=void 0===m?"linear":m,x=e.referenceX,v=e.fractionDigits,b=void 0===v?2:v,A=e.symbolCount,T=void 0===A?12:A,P=Object(r.useState)(0),S=Object(u.a)(P,2),j=S[0],H=S[1],z=Object(r.useState)(),R=Object(u.a)(z,2),D=R[0],M=R[1],W=Object(r.useState)(!0),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useState)(!0),k=Object(u.a)(F,2),Y=k[0],L=k[1],E=Object(r.useState)(null),U=Object(u.a)(E,2),N=U[0],V=U[1],J=Object(r.useState)(2),G=Object(u.a)(J,2),X=G[0],B=G[1],K=Object(r.useState)(1),q=Object(u.a)(K,2),Q=q[0],Z=q[1],_=Object(r.useState)(2),$=Object(u.a)(_,2),ee=$[0],te=$[1];Object(r.useEffect)((function(){if(l&&0!==l.length){var e=a?4:3,t=(Array.isArray(l)?Object.keys(l[0]).length-1:Object.keys(l).length-1)/e;if(j!==t&&H(t),1===t&&l[0])for(var o in l[0])if(o.startsWith("Heater")){M(o.length>6?o.substring(6).trim():void 0);break}}}),[l]);var le=Object(r.useMemo)((function(){for(var e,t=[],l=a?4:3,i="gray",r=0;r1?o[r*l]:D?"Heater "+D:"Heater";t.push(Object(gf.jsx)(OW.a,{name:n,dataKey:n,stroke:i,fill:"#FA8072",opacity:null===N||N===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l)),n=j>1?o[r*l+1]:D?"AC "+D:"AC",t.push(Object(gf.jsx)(OW.a,{name:n,dataKey:n,stroke:i,fill:"#00BFFF",opacity:null===N||N===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l+1)),a&&(n=j>1?o[r*l+2]:D?"Solar "+D:"Solar",t.push(Object(gf.jsx)(OW.a,{name:n,dataKey:n,stroke:i,fill:"#3CB371",opacity:null===N||N===n?1:.25,strokeWidth:1,isAnimationActive:!1,stackId:"stack"+r},r*l+2)))}for(var c=l-1,s=0;s1?o[s*l+c]:D?"Net "+D:"Net",u=YC(iI[s],Q,T,null===N||N===d?1:.25);0===s&&(e=u),t.push(Object(gf.jsx)(lI.a,{type:w,name:d,dataKey:d,stroke:Be[s],opacity:null===N||N===d?1:.25,strokeWidth:X,dot:T>0&&(u||e),isAnimationActive:!1},s*l+c))}return t}),[t,w,o,j,D,X,T,Q,N]);return Object(gf.jsx)(gf.Fragment,{children:l&&Object(gf.jsx)("div",{id:"line-graph-"+c+"-"+s,style:{width:"100%",height:"".concat(i,"%"),position:"relative",direction:"ltr"},children:Object(gf.jsxs)("div",{style:{userSelect:"none",width:"100%",height:"100%",position:"absolute",top:0,left:0},children:[Object(gf.jsx)(FW.a,{width:"100%",height:"100%",children:Object(gf.jsxs)(uk.a,{data:l,stackOffset:"sign",barGap:0,barCategoryGap:ee,onMouseDown:function(e){},margin:{top:5,right:30,left:20,bottom:30},children:[Object(gf.jsx)(YW.a,{formatter:function(e){return e.toFixed(b)+" "+f}}),Object(gf.jsx)(LW.a,{vertical:Y,horizontal:C,stroke:"rgba(128, 128, 128, 0.3)"}),Object(gf.jsx)(EW.a,{x:x,stroke:"orange",strokeWidth:2}),Object(gf.jsx)(UW.a,{dataKey:null!==n&&void 0!==n?n:c,fontSize:"10px",children:Object(gf.jsx)(NW.a,{value:c+(d?" ("+d+")":""),offset:0,position:"bottom"})}),Object(gf.jsx)(VW.a,{domain:[p,g],fontSize:"10px",children:Object(gf.jsx)(NW.a,{dx:-15,value:s+(f?" ("+f+")":""),offset:0,angle:-90,position:"center"})}),le,Object(gf.jsx)(EW.a,{y:0,stroke:"#888"}),j>0&&Object(gf.jsx)(JW.a,{wrapperStyle:{fontSize:"11px"},iconType:"plainline",verticalAlign:"top",height:36,onMouseLeave:function(e){V(null)},onMouseEnter:function(e){V(e.dataKey)}})]})}),Object(gf.jsx)(hk,{symbolSize:Q,lineWidth:X,barCategoryGap:ee,horizontalGrid:C,verticalGrid:Y,changeHorizontalGrid:function(e){O(e)},changeVerticalGrid:function(e){L(e)},changeLineWidth:function(e){B(e)},changeSymbolSize:function(e){Z(e)},changeBarCategoryGap:function(e){te(e)}})]})})})},yk=mv.a.div(xC||(xC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),gk=mv.a.div(vC||(vC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),mk=mv.a.div(bC||(bC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),wk=function(e){var t,l=e.city,a=Ew(Vi),c=Ew(Gi),s=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,d=Ew(si),h=Ew(rs),p=Ew(Cs),y=new Date(Ew(i.date)),g=Ew(o.dailyBuildingEnergyPanelRect),m=Tf(bi),w=Tf(Ir),x=Tf(kr),v=Tf(ms),b=Tw.hasSolarPanels(Ew.getState().elements),A=Pf(rd),T=Pf(nd),P=Pf(cd),S=Ew(Ni),j=n.a.useRef(null),H=Object(r.useRef)(null),z=Object(r.useRef)(),R=H.current?H.current.clientWidth+40:g?g.width+40:640,M=H.current?H.current.clientHeight+100:g?g.height+100:460,W=Object(r.useState)({x:g?Math.max(g.x,R-window.innerWidth):0,y:g?Math.min(g.y,window.innerHeight-M):0}),I=Object(u.a)(W,2),C=I[0],O=I[1],F=Object(r.useState)([]),k=Object(u.a)(F,2),Y=k[0],E=k[1],U=Object(r.useState)(0),N=Object(u.a)(U,2),V=N[0],J=N[1],G=Object(r.useState)(0),X=Object(u.a)(G,2),B=X[0],K=X[1],q=Object(r.useState)(0),Q=Object(u.a)(q,2),Z=Q[0],_=Q[1],$=Object(r.useState)(0),ee=Object(u.a)($,2),te=ee[0],le=ee[1],ae=Object(r.useState)(["Heater","AC","Net"]),oe=Object(u.a)(ae,2),ie=oe[0],re=oe[1],ne={lng:a},ce=p(null!==l&&void 0!==l?l:"Boston MA, USA"),se=Object(r.useRef)([]),de=Object(r.useRef)([]),ue=Object(r.useRef)([]),fe=Object(r.useRef)([]);Object(r.useEffect)((function(){w&&he()}),[w]),Object(r.useEffect)((function(){he()}),[x]);var he=function(){E([]),J(0),K(0),_(0),le(0),re([])},pe=dk(y,ce,b),ye=pe.sum,ge=pe.sumHeaterMap,we=pe.sumAcMap,xe=pe.sumSolarPanelMap,ve=pe.dataLabels;Object(r.useEffect)((function(){E(ye);var e=0,t=0,l=0,a=ge.size>1;if(ge){se.current=[];var o,i=Object(f.a)(ge.keys());try{for(i.s();!(o=i.n()).done;){var r=o.value,n=ge.get(r);n&&(e+=n,a&&se.current.push(r+": "+n.toFixed(2)+" "+me.t("word.kWh",ne)))}}catch(C){i.e(C)}finally{i.f()}}if(we){de.current=[];var c,s=Object(f.a)(we.keys());try{for(s.s();!(c=s.n()).done;){var d=c.value,u=we.get(d);u&&(t+=u,a&&de.current.push(d+": "+u.toFixed(2)+" "+me.t("word.kWh",ne)))}}catch(C){s.e(C)}finally{s.f()}}if(xe&&xe.size>0){ue.current=[];var h,p=Object(f.a)(xe.keys());try{for(p.s();!(h=p.n()).done;){var y=h.value,g=xe.get(y);g&&(l+=g,a&&ue.current.push(y+": "+g.toFixed(2)+" "+me.t("word.kWh",ne)))}}catch(C){p.e(C)}finally{p.f()}}if(ge&&we&&xe){fe.current=[];var m,w=Object(f.a)(ge.keys());try{for(w.s();!(m=w.n()).done;){var x=m.value,v=0,S=ge.get(x),j=we.get(x),H=xe.get(x);S&&(v+=S),j&&(v+=j),H&&(v-=H),a&&fe.current.push(x+": "+v.toFixed(2)+" "+me.t("word.kWh",ne))}}catch(C){w.e(C)}finally{w.f()}}J(e),K(t),_(l),le(e+t-l),A(e),T(t),P(l);var z=(Object.keys(ye[0]).length-1)/(b?4:3);if(z>1){for(var R=[],D=0,M=0;M0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",ne),onClick:function(){$h(Y,"daily-building-energy.csv"),Kh(me.t("message.CsvFileSaved",ne)),c&&d((function(e){e.actionInfo={name:"Export Daily Building Energy Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},xk=n.a.memo(wk),vk=mv.a.div(AC||(AC=Object(gv.a)(["\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n"]))),bk=mv.a.div(TC||(TC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n"]))),Ak=mv.a.div(PC||(PC=Object(gv.a)(["\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n"]))),Tk=function(e){var t,l,a=e.city,c=Ew.getState().world,s=Ew(Cs),d=Ew(Vi),p=Ew(Gi),y=null!==(t=Ew(Ui))&&void 0!==t?t:Qe,g=Ew(si),m=Ew(rs),w=new Date(Ew(i.date)),x=Ew(o.yearlyBuildingEnergyPanelRect),v=Tf(bi),b=Tf(Or),A=Tf(Yr),T=Tf(ms),P=Tw.hasSolarPanels(Ew.getState().elements),S=Pf(rd),j=Pf(nd),H=Pf(cd),z=Ew(Ni),R=Object(r.useRef)(null),M=Object(r.useRef)(),W=R.current?R.current.clientWidth+40:x?x.width+40:640,I=R.current?R.current.clientHeight+100:x?x.height+100:600,C=Object(r.useState)({x:x?Math.max(x.x,W-window.innerWidth):0,y:x?Math.min(x.y,window.innerHeight-I):0}),O=Object(u.a)(C,2),F=O[0],k=O[1],Y=n.a.useRef(null),E={lng:d},U=s(null!==a&&void 0!==a?a:"Boston MA, USA"),N=it[w.getMonth()],V=null!==(l=c.daysPerYear)&&void 0!==l?l:6,J=12/V,G=Object(r.useState)(0),X=Object(u.a)(G,2),B=X[0],K=X[1],q=Object(r.useState)(0),Q=Object(u.a)(q,2),Z=Q[0],_=Q[1],$=Object(r.useState)(0),ee=Object(u.a)($,2),te=ee[0],le=ee[1],ae=Object(r.useState)(0),oe=Object(u.a)(ae,2),ie=oe[0],re=oe[1],ne=Object(r.useState)(["Heater","AC","Solar","Net"]),ce=Object(u.a)(ne,2),se=ce[0],de=ce[1],ue=Object(r.useState)([]),fe=Object(u.a)(ue,2),he=fe[0],pe=fe[1],ye=dk(w,U,P),ge=ye.sum,we=ye.sumHeaterMap,xe=ye.sumAcMap,ve=ye.sumSolarPanelMap,be=ye.dataLabels,Ae=Object(r.useRef)(new Array(V).fill({})),Te=Object(r.useRef)(new Array(V).fill(0)),Pe=Object(r.useRef)(new Array(V).fill(0)),Se=Object(r.useRef)(new Array(V).fill(0)),je=Object(r.useRef)(new Array(V).fill(0)),He=Object(r.useRef)([]),ze=Object(r.useRef)([]),Re=Object(r.useRef)([]),De=Object(r.useRef)([]);Object(r.useEffect)((function(){Me()}),[V,A]),Object(r.useEffect)((function(){b&&Me()}),[b]);var Me=function(){Ae.current=new Array(V).fill({}),Te.current=new Array(V).fill(0),Pe.current=new Array(V).fill(0),Se.current=new Array(V).fill(0),je.current=new Array(V).fill(0),pe([]),K(0),_(0),le(0),re(0),de([])};Object(r.useEffect)((function(){var e=w.getMonth()/J,t=(Object.keys(ge[0]).length-1)/(P?4:3);if(He.current=[],ze.current=[],De.current=[],Re.current=[],t>1){var l,a=new Map,o=new Map,i=new Map,r=new Map,n=Object(f.a)(ge);try{for(n.s();!(l=n.n()).done;)for(var c=l.value,s=0,d=0;d6&&(Q=" "+Z.substring(6).trim());break}var $="Heater"+Q,ee="AC"+Q,te="Net"+Q;if(P){var ae="Solar"+Q,oe=0;de([$,ee,ae,te]);var ie,ne=Object(f.a)(ge);try{for(ne.s();!(ie=ne.n()).done;){var ce=ie.value;X+=ce[$],B+=ce[ee],oe+=ce[ae],q+=ce[te]}}catch(qe){ne.e(qe)}finally{ne.f()}var se={};se.Month=it[w.getMonth()],se[$]=30*X,se[ee]=30*B,se[ae]=30*oe,se[te]=30*q,Ae.current[e]=se}else{de([$,ee,te]);var ue,fe=Object(f.a)(ge);try{for(fe.s();!(ue=fe.n()).done;){var he=ue.value;X+=he[$],B+=he[ee],q+=he[te]}}catch(qe){fe.e(qe)}finally{fe.f()}var ye={};ye.Month=it[w.getMonth()],ye[$]=30*X,ye[ee]=30*B,ye[te]=30*q,Ae.current[e]=ye}}pe(Object(h.a)(Ae.current));var Me=0;if(we){var We,Ie=Object(f.a)(we.keys());try{for(Ie.s();!(We=Ie.n()).done;){var Ce,Oe=We.value;Me+=null!==(Ce=we.get(Oe))&&void 0!==Ce?Ce:0}}catch(qe){Ie.e(qe)}finally{Ie.f()}}var Fe=0;if(xe){var ke,Ye=Object(f.a)(xe.keys());try{for(Ye.s();!(ke=Ye.n()).done;){var Le,Ee=ke.value;Fe+=null!==(Le=xe.get(Ee))&&void 0!==Le?Le:0}}catch(qe){Ye.e(qe)}finally{Ye.f()}}var Ue=0;if(ve&&P){var Ne,Ve=Object(f.a)(ve.keys());try{for(Ve.s();!(Ne=Ve.n()).done;){var Je,Ge=Ne.value;Ue+=null!==(Je=ve.get(Ge))&&void 0!==Je?Je:0}}catch(qe){Ve.e(qe)}finally{Ve.f()}}Te.current[e]=Me*J*30,Pe.current[e]=Fe*J*30,Se.current[e]=Ue*J*30,je.current[e]=Te.current[e]+Pe.current[e]-Se.current[e];var Xe=Te.current.slice(0,e+1).reduce((function(e,t){return e+t}),0);K(Xe);var Be=Pe.current.slice(0,e+1).reduce((function(e,t){return e+t}),0);_(Be);var Ke=Se.current.slice(0,e+1).reduce((function(e,t){return e+t}),0);le(Ke),re(je.current.slice(0,e+1).reduce((function(e,t){return e+t}),0)),S(Xe),j(Be),H(Ke),Tf.getState().showSolarRadiationHeatmap||Pf.getState().clearDataStore()}),[v]),Object(r.useEffect)((function(){k({x:Math.max(null===x||void 0===x?void 0:x.x,W-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-I)})}),[x,W,I]),Object(r.useEffect)((function(){var e=function(){k({x:Math.max(null===x||void 0===x?void 0:x.x,W-window.innerWidth),y:Math.min(null===x||void 0===x?void 0:x.y,window.innerHeight-I)})};return window.addEventListener("resize",e),R.current&&(M.current||(M.current=new ResizeObserver((function(){g((function(e){R.current&&(e.viewState.yearlyBuildingEnergyPanelRect||(e.viewState.yearlyBuildingEnergyPanelRect=new Ot(0,0,600,500)),e.viewState.yearlyBuildingEnergyPanelRect.width=R.current.offsetWidth,e.viewState.yearlyBuildingEnergyPanelRect.height=R.current.offsetHeight)}))}))),M.current.observe(R.current)),function(){var t;window.removeEventListener("resize",e),null===(t=M.current)||void 0===t||t.disconnect()}}),[x,W,I]);var We=function(){g((function(e){e.viewState.showYearlyBuildingEnergyPanel=!1,p&&(e.actionInfo={name:"Close Yearly Building Energy Graph",timestamp:(new Date).getTime()})}))},Ie=me.t("word.Month",E),Ce=me.t("word.Energy",E),Oe=!he||!he[0]||0===Object.keys(he[0]).length;return Object(gf.jsx)(JT.a,{nodeRef:Y,handle:".handle",bounds:"parent",axis:"both",position:F,onDrag:function(e,t){k({x:Math.max(t.x,W-window.innerWidth),y:Math.min(t.y,window.innerHeight-I)})},onStop:function(e,t){g((function(e){e.viewState.yearlyBuildingEnergyPanelRect||(e.viewState.yearlyBuildingEnergyPanelRect=new Ot(0,0,600,360)),e.viewState.yearlyBuildingEnergyPanelRect.x=Math.max(t.x,W-window.innerWidth),e.viewState.yearlyBuildingEnergyPanelRect.y=Math.min(t.y,window.innerHeight-I)}))},onMouseDown:function(){g((function(e){e.selectedFloatingWindow="yearlyBuildingEnergyPanel"}))},children:Object(gf.jsx)(vk,{ref:Y,style:{zIndex:"yearlyBuildingEnergyPanel"===z?Ke:9},children:Object(gf.jsxs)(bk,{ref:R,style:{opacity:y,width:(x?x.width:600)+"px",height:(x?x.height:400)+"px"},children:[Object(gf.jsxs)(Ak,{className:"handle",style:{direction:"ltr"},children:[Object(gf.jsxs)("span",{children:[me.t("buildingEnergyPanel.YearlyBuildingEnergy",E)+": ",Object(gf.jsx)("span",{style:{fontSize:"10px"},children:me.t("sensorPanel.WeatherDataFrom",E)+" "+a+" | "+w.getFullYear()})]}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onTouchStart:function(){We()},onMouseDown:function(){We()},children:me.t("word.Close",E)})]}),Object(gf.jsx)(pk,{type:L.YearlyBuildingEnergy,dataSource:he,hasSolarPanels:P,labels:se,height:100,dataKeyAxisX:"Month",labelX:Ie,labelY:Ce,unitY:me.t("word.kWh",E),yMin:0,curveType:"linear",fractionDigits:2,referenceX:N}),!T&&Object(gf.jsxs)(wv.b,{style:{alignSelf:"center",direction:"ltr"},children:[0===He.current.length?Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.Heater",E)+": "+B.toFixed(0)}):Object(gf.jsx)(tD.a,{content:He.current.map((function(e,t){return Object(gf.jsx)("div",{children:e},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.Heater",E)+": "+B.toFixed(0)})}),0===ze.current.length?Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.AC",E)+": "+Z.toFixed(0)}):Object(gf.jsx)(tD.a,{content:ze.current.map((function(e,t){return Object(gf.jsx)("div",{children:e},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.AC",E)+": "+Z.toFixed(0)})}),0!==te&&Object(gf.jsx)(gf.Fragment,{children:0===Re.current.length?Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.SolarPanel",E)+": "+te.toFixed(0)}):Object(gf.jsx)(tD.a,{content:Re.current.map((function(e,t){return Object(gf.jsx)("div",{children:e},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.SolarPanel",E)+": "+te.toFixed(0)})})}),0===De.current.length?Object(gf.jsx)(wv.b,{style:{cursor:"default"},children:me.t("buildingEnergyPanel.Net",E)+": "+ie.toFixed(0)}):Object(gf.jsx)(tD.a,{content:De.current.map((function(e,t){return Object(gf.jsx)("div",{children:e},t)})),children:Object(gf.jsx)(wv.b,{style:{cursor:"help"},children:me.t("buildingEnergyPanel.Net",E)+": "+ie.toFixed(0)})}),Object(gf.jsx)(xv.a,{type:"default",icon:Oe?Object(gf.jsx)(BC.a,{}):Object(gf.jsx)(KC.a,{}),title:me.t(Oe?"word.Run":"word.Update",E),onClick:function(){var e=Ew.getState().elements,t=Ew.getState().countElementsByType,l=Ew.getState().getChildrenOfType,a=TT(e,t,l);if(a.status!==tv.NO_BUILDING)if(a.status!==tv.AT_LEAST_ONE_BAD_NO_GOOD)a.status===tv.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD&&qh(me.t("message.SimulationWillStartDespiteWarnings",E)),Kh(me.t("message.SimulationStarted",E)),setTimeout((function(){m(),Tf.setState((function(e){e.runYearlyThermalSimulation=!0,e.pauseYearlyThermalSimulation=!1,e.simulationInProgress=!0})),g((function(e){p&&(e.actionInfo={name:"Run Yearly Building Energy Analysis",timestamp:(new Date).getTime()})}))}),100);else{var o="";switch(a.buildingCompletion){case D.WALL_DISJOINED:o=me.t("message.WallsAreNotConnected",E);break;case D.WALL_EMPTY:o=me.t("message.BuildingContainsEmptyWall",E);break;case D.ROOF_MISSING:o=me.t("message.BuildingRoofMissing",E);break;default:o=me.t("message.UnknownErrors",E)}Qh(me.t("message.SimulationWillNotStartDueToErrors",E)+": "+o)}else Kh(me.t("analysisManager.NoBuildingForAnalysis",E))}}),Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(qC.a,{}),title:me.t("word.SaveAsImage",E),onClick:function(){_h("line-graph-"+Ie+"-"+Ce,"yearly-building-energy",{}).then((function(){Kh(me.t("message.ScreenshotSaved",E)),p&&g((function(e){e.actionInfo={name:"Take Screenshot of Yearly Building Energy Graph",timestamp:(new Date).getTime()}}))}))}}),Ae.current&&Ae.current.length>0&&Object(gf.jsx)(xv.a,{type:"default",icon:Object(gf.jsx)(QC.a,{}),title:me.t("word.SaveAsCsv",E),onClick:function(){$h(Ae.current,"yearly-building-energy.csv"),Kh(me.t("message.CsvFileSaved",E)),p&&g((function(e){e.actionInfo={name:"Export Yearly Building Energy Result as CSV",timestamp:(new Date).getTime()}}))}})]})]})})})},Pk=n.a.memo(Tk),Sk=function(e){var t=e.setDialogVisible,l=Ew(si),a=Ew(Vi),o=Ew(Sr),i=Ew(pi),n=Ew(yi),c=Object(r.useState)(!1),s=Object(u.a)(c,2),d=s[0],f=s[1],h=Object(r.useState)(!1),p=Object(u.a)(h,2),y=p[0],g=p[1],m=Object(r.useState)({left:0,top:0,bottom:0,right:0}),w=Object(u.a)(m,2),x=w[0],v=w[1],b=Object(r.useRef)(null),A=Object(r.useRef)(null),T=Object(r.useRef)(i),P=Object(r.useRef)(n),S={lng:a};Object(r.useEffect)((function(){var e;null===(e=A.current)||void 0===e||e.focus()}),[]);var j=function(e){l((function(t){t.minimumNavigationMoveSpeed=e})),Tf.setState((function(t){t.navigationMoveSpeed=e}))},H=function(e){l((function(t){t.minimumNavigationTurnSpeed=e})),Tf.setState((function(t){t.navigationTurnSpeed=e}))};return Object(gf.jsxs)(Zv.a,{width:500,visible:!0,title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return g(!0)},onMouseOut:function(){return g(!1)},children:me.t("navigationPanel.NavigationParameters",S)}),footer:[Object(gf.jsx)(xv.a,{onClick:function(){t(!1)},children:me.t("word.Cancel",S)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",ref:A,onClick:function(){!function(){var e=i,t=T.current;if(e!==t){var l={name:"Minimum Navigation Move Speed",timestamp:Date.now(),oldValue:e,newValue:t,undo:function(){j(l.oldValue)},redo:function(){j(l.newValue)}};o(l),j(t)}var a=n,r=P.current;if(a!==r){var c={name:"Minimum Navigation Turn Speed",timestamp:Date.now(),oldValue:a,newValue:r,undo:function(){H(c.oldValue)},redo:function(){H(c.newValue)}};o(c),H(r)}}(),t(!1)},children:me.t("word.OK",S)},"OK")],onCancel:function(){t(!1)},maskClosable:!1,destroyOnClose:!1,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!y,bounds:x,onStart:function(e,t){return function(e,t){if(b.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=b.current.getBoundingClientRect();v({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:b,children:e})})},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:me.t("navigationPanel.MinimumMoveSpeed",S)+" ([1, 10]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)($v.a,{min:1,max:10,style:{width:"100%"},precision:0,value:T.current,step:1,onChange:function(e){T.current=e,f(!d)},onBlur:function(e){var t=e.target.value,l=parseFloat(t);T.current=Number.isNaN(l)?3:l,f(!d)},onPressEnter:function(e){var t=e.target.value,l=parseFloat(t);T.current=Number.isNaN(l)?3:l,f(!d)}})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{className:"gutter-row",span:16,children:me.t("navigationPanel.MinimumTurnSpeed",S)+" ([1, 5]): "}),Object(gf.jsx)(NT.a,{className:"gutter-row",span:8,children:Object(gf.jsx)($v.a,{min:1,max:5,style:{width:"100%"},precision:0,value:P.current,step:1,onChange:function(e){P.current=e,f(!d)},onBlur:function(e){var t=e.target.value,l=parseFloat(t);P.current=Number.isNaN(l)?3:l,f(!d)},onPressEnter:function(e){var t=e.target.value,l=parseFloat(t);P.current=Number.isNaN(l)?3:l,f(!d)}})})]})]})},jk=n.a.memo(Sk),Hk=function(){var e,t=Ew(o.showSiteInfoPanel),l=Ew(o.showDesignInfoPanel),a=Ew(o.showInstructionPanel),n=Ew(o.showMapPanel),c=Ew(o.showHeliodonPanel),s=Ew(o.showStickyNotePanel),d=Ew(o.showWeatherPanel),f=Ew(o.showDiurnalTemperaturePanel),h=Tf(fi),p=Tf(hi),y=Tf(Ns),g=Ew(o.showDailyLightSensorPanel),m=Ew(o.showYearlyLightSensorPanel),w=Ew(o.showDailyPvYieldPanel),x=Ew(o.showYearlyPvYieldPanel),v=Ew(o.showVisibilityResultsPanel),b=Ew(o.showDailyParabolicTroughYieldPanel),A=Ew(o.showYearlyParabolicTroughYieldPanel),T=Ew(o.showDailyParabolicDishYieldPanel),P=Ew(o.showYearlyParabolicDishYieldPanel),S=Ew(o.showDailyFresnelReflectorYieldPanel),j=Ew(o.showYearlyFresnelReflectorYieldPanel),H=Ew(o.showDailyHeliostatYieldPanel),z=Ew(o.showYearlyHeliostatYieldPanel),R=Ew(o.showDailyUpdraftTowerYieldPanel),D=Ew(o.showYearlyUpdraftTowerYieldPanel),M=Ew(o.showDailyBuildingEnergyPanel),W=Ew(o.showYearlyBuildingEnergyPanel),I=Ew(o.showEvolutionPanel),C=Ew(js),O=Ew(i.latitude),F=Ew(i.longitude),k=Ew(Ls),Y=null!==(e=Ew(o.navigationView))&&void 0!==e&&e,E=Object(r.useState)("Boston MA, USA"),U=Object(u.a)(E,2),N=U[0],V=U[1];return Object(r.useEffect)((function(){var e;V(null!==(e=k(O,F))&&void 0!==e?e:"Boston MA, USA")}),[O,F]),Object(gf.jsxs)(gf.Fragment,{children:[n&&Object(gf.jsx)(SW,{}),c&&Object(gf.jsx)(CW,{}),s&&Object(gf.jsx)(hO,{}),t&&Object(gf.jsx)(YO,{city:N}),l&&Object(gf.jsx)(CO,{}),(a||Y)&&!C&&Object(gf.jsx)(wO,{}),d&&Object(gf.jsx)(XC,{city:N,graphs:[L.MonthlyTemperatures,L.SunshineHours]}),f&&Object(gf.jsx)(qF,{city:N}),h&&Object(gf.jsx)(sk,{setDialogVisible:function(e){Tf.setState((function(t){t.showEconomicsPanel=e}))}}),p&&Object(gf.jsx)(jk,{setDialogVisible:function(e){Tf.setState((function(t){t.showNavigationPanel=e}))}}),m&&Object(gf.jsx)(lO,{city:N}),g&&Object(gf.jsx)(nO,{city:N}),x&&Object(gf.jsx)(SO,{city:N}),w&&Object(gf.jsx)(DO,{city:N}),v&&Object(gf.jsx)(KO,{}),A&&Object(gf.jsx)(eF,{city:N}),b&&Object(gf.jsx)(iF,{city:N}),P&&Object(gf.jsx)(gF,{city:N}),T&&Object(gf.jsx)(dF,{city:N}),S&&Object(gf.jsx)(bF,{city:N}),j&&Object(gf.jsx)(HF,{city:N}),H&&Object(gf.jsx)(WF,{city:N}),z&&Object(gf.jsx)(YF,{city:N}),R&&Object(gf.jsx)(JF,{city:N}),D&&Object(gf.jsx)(tk,{city:N}),M&&Object(gf.jsx)(xk,{city:N}),W&&Object(gf.jsx)(Pk,{city:N}),y&&Object(gf.jsx)(NO,{}),I&&Object(gf.jsx)(nk,{})]})},zk=n.a.memo(Hk),Rk=function(){function e(){Object(He.a)(this,e)}return Object(Fe.a)(e,null,[{key:"computeSolarPanelOutput",value:function(e,t,l,a,o,i,r,n,c){var s,d=o.parentType===V.Roof,u=o.parentType===V.Wall;d&&(i=r);var f=u?Tw.absoluteCoordinates(o.cx,o.cy,o.cz,i,r,o.lz):Tw.absoluteCoordinates(o.cx,o.cy,o.cz,i),h=i.rotation[2],p=o.tiltAngle,y=h+o.relativeAzimuth,g=!0;if(d&&(f.z=o.cz+o.lz+.02+i.cz+i.lz/2,Tw.isZero(o.rotation[0])?f.z+=o.poleHeight:(p=o.rotation[0],y=h,g=!1)),u&&!Tw.isZero(o.tiltAngle)){var m=i,w=(r?r.rotation[2]+m.relativeAngle:m.relativeAngle)-vt,x=o.ly*Math.abs(Math.sin(o.tiltAngle))/2;f.x+=x*Math.cos(w),f.y+=x*Math.sin(w)}var v,b,A,T,P,S=(new Me.Vector3).fromArray(o.normal),j=e.getMonth(),H=Tw.dayOfYear(e),z=null!==(s=t.solarRadiationHeatmapGridCellSize)&&void 0!==s?s:.5;t.discretization===ae.EXACT?(v=o.lx,b=o.ly,o.orientation===$.portrait?(A=Math.max(1,Math.round(o.lx/a.width)),T=Math.max(1,Math.round(o.ly/a.length)),A*=a.n,T*=a.m):(A=Math.max(1,Math.round(o.lx/a.length)),T=Math.max(1,Math.round(o.ly/a.width)),A*=a.m,T*=a.n),P=o.lx/A):(v=o.lx,b=o.ly,(A=Math.max(2,Math.round(o.lx/z)))%2!==0&&(A+=1),(T=Math.max(2,Math.round(o.ly/z)))%2!==0&&(T+=1),P=z);var R=v/A,D=b/T,M=f.x-(v-P)/2,W=f.y-(b-P)/2,I=d||u?f.z:i.lz+o.poleHeight+o.lz,C=new Me.Vector2(f.x,f.y),O=new Me.Vector3,F=Array.from(Array(A),(function(){return new Array(T)})),k=new Me.Euler(d&&!g?0:p,0,y,"ZYX");if(o.trackerType!==te.NO_TRACKER){var Y=h?l.clone().applyAxisAngle(Rt,-h):l.clone();switch(o.trackerType){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var L=(new Me.Quaternion).setFromUnitVectors(Rt,Y);(k=(new Me.Euler).setFromQuaternion(L)).z+=y;break;case te.HORIZONTAL_SINGLE_AXIS_TRACKER:var E=(new Me.Quaternion).setFromUnitVectors(Rt,new Me.Vector3(Y.x,0,Y.z).normalize());(k=(new Me.Euler).setFromQuaternion(E)).z+=y;break;case te.VERTICAL_SINGLE_AXIS_TRACKER:var U=new Me.Vector3(Y.x,-Y.y,0).normalize(),N=Math.acos(Ht.dot(U))*Math.sign(U.x);k=new Me.Euler(o.tiltAngle,0,N+h,"ZYX");break;case te.TILTED_SINGLE_AXIS_TRACKER:}}S.applyEuler(k),d&&!g&&(k.x=o.rotation[0],k.z=o.rotation[2]+h),u&&(k.x=vt+o.tiltAngle,k.z=i.relativeAngle+h);for(var J=zy(l,H,n,ny.SPHERE_MODEL),G=Ry(t.ground,j,S,J),X=S.dot(l),B=new Me.Vector2,K=new Me.Vector3,q=0;q0&&(B.set(M+q*R,W+Q*D),K.set(B.x-C.x,B.y-C.y,0),K.applyEuler(k),O.set(f.x+K.x,f.y+K.y,I+K.z),c(o.id,O,l)<0&&(F[q][Q]+=X*J));var Z=0;switch(a.shadeTolerance){case le.NONE:for(var _=Number.MAX_VALUE,ee=0;ee0){var N,J=Object(f.a)(r);try{for(J.s();!(N=J.n()).done;){var G=N.value;if(G.type===V.Window){var X=G.cx*o.lx,B=G.cz*o.lz,K=G.lx*o.lx/2,q=G.lz*o.lz/2,Q=G;if(Q.windowType===Yt.Arched){var Z=P.clone().add(new Me.Vector3(Q.cx*o.lx,0,Q.cz*o.lz));e.pointWithinArch(z,Q.lx,Q.lz,Q.archHeight,Z)&&(p=!1)}else if(U.x>=X-K&&U.x=B-q&&U.y0){var _,$=Object(f.a)(n);try{for($.s();!(_=$.n()).done;){var ee=_.value;if(ee.type===V.Door){var te=ee.cx*o.lx,le=ee.cz*o.lz,ae=ee.lx*o.lx/2,oe=ee.lz*o.lz/2,ie=ee;if(ie.doorType===hy.Arched){var re=P.clone().add(new Me.Vector3(ie.cx*o.lx,0,ie.cz*o.lz));e.pointWithinArch(z,ie.lx,ie.lz,ie.archHeight,re)&&(p=!1)}else if(U.x>=te-ae&&U.x=le-oe&&U.y0){var ne,ce=Object(f.a)(c);try{for(ce.s();!(ne=ce.n()).done;){var se=ne.value,de=se.cx*o.lx,ue=se.cz*o.lz,fe=se.lx/2,he=se.ly/2;if(U.x>=de-fe&&U.x=ue-he&&U.ywy||ye<0)&&pe&&(O[k][Y]+=I),C>0&&ye<0&&(F[k][Y]+=C*W,pe&&(O[k][Y]+=C*W))}}}return{intensity:O,unitArea:b*A,heatmap:F}}},{key:"computeDoorSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c){var s,d=Tw.dayOfYear(t),u=null!==(s=l.solarRadiationHeatmapGridCellSize)&&void 0!==s?s:.5,f=o.lx*i.lx,h=o.lz*i.lz,p=Math.max(2,Math.round(f/u)),y=Math.max(2,Math.round(h/u)),g=f/p,m=h/y,w=r.rotation[2]+i.relativeAngle,x=Tw.wallAbsolutePosition(new Me.Vector3(i.cx,i.cy,i.cz),r).setZ(i.lz/2+r.lz).clone().add(new Me.Vector3(o.cx*i.lx,0,o.cz*i.lz)),v=new Me.Vector3(Math.cos(w-vt),Math.sin(w-vt),0),b=g*Math.cos(w),A=g*Math.sin(w),T=new Me.Vector3,P=zy(a,d,n,ny.SPHERE_MODEL),S=Ry(l.ground,t.getMonth(),v,P),j=v.dot(a),H=Array(p).fill(0).map((function(){return Array(y).fill(0)}));if(o.doorType===hy.Arched)for(var z=0;z0&&c(o.id,T,a)<0&&(H[z][R]+=j*P))}else for(var W=0;W0){var C=W-p/2+.5,O=I-y/2+.5;T.set(x.x+C*b,x.y+C*A,x.z+O*m),c(o.id,T,a)<0&&(H[W][I]+=j*P)}return{intensity:H,unitArea:g*m}}},{key:"pointWithinArch",value:function(e,t,l,a,o){if(a>0){var i=.5*t,r=Math.min(a,l,i),n=.5*(r+i*i/r),c=e.x-o.x,s=e.y-o.y,d=c*c+s*s,u=e.z-o.z;return d-l/2||d+(u=e.z-(l-n))*u0&&c(o.id,T,a)<0&&(H[z][R]+=j*P))}else for(var W=0;W0){var C=W-p/2+.5,O=I-y/2+.5;T.set(x.x+C*b,x.y+C*A,x.z+O*m),c(o.id,T,a)<0&&(H[W][I]+=j*P)}return{intensity:H,unitArea:g*m}}},{key:"computeRoofWindowSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c){var s,d=Tw.dayOfYear(t),u=null!==(s=l.solarRadiationHeatmapGridCellSize)&&void 0!==s?s:.5,f=o.lx,h=o.lz,p=Math.max(2,Math.round(f/u)),y=Math.max(2,Math.round(h/u)),g=f/p,m=h/y,w=new Me.Vector3(o.cx,o.cy,o.cz).applyEuler(new Me.Euler(0,0,r.rotation[2]));w.x+=r.cx,w.y+=r.cy,w.z+=r.lz;var x=new Me.Euler(o.rotation[0],o.rotation[1],o.rotation[2]+r.rotation[2],"ZXY"),v=new Me.Vector3(0,0,1).applyEuler(x),b=new Me.Vector3,A=zy(a,d,n,ny.SPHERE_MODEL),T=Ry(l.ground,t.getMonth(),v,A),P=v.dot(a),S=Array(p).fill(0).map((function(){return Array(y).fill(0)}));if(o.windowType===Yt.Arched)for(var j=0;j0&&c(o.id,b,a)<0&&(S[j][H]+=P*A))}else for(var M=0;M0){var I=M-p/2+.5,C=W-y/2+.5,O=new Me.Vector3(I,C,0);O.applyEuler(x),b.set(w.x+O.x,w.y+O.y,w.z+O.z),c(o.id,b,a)<0&&(S[M][W]+=P*A)}return{intensity:S,unitArea:g*m}}},{key:"computePyramidRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,h,p);var g,m=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,w=Tw.dayOfYear(t),x=new Me.Euler(0,0,c.rotation[2],"ZYX"),v=zy(a,w,h,ny.SPHERE_MODEL),b=[],A=[],T=Object(f.a)(n.entries());try{var P=function(){var i=Object(u.a)(g.value,2),n=i[0],f=i[1],h=o.id+"-"+n,y=f[0].clone().applyEuler(x),w=f[1].clone().applyEuler(x),T=f[2].clone().applyEuler(x),P=(new Me.Vector3).subVectors(w,y),S=(new Me.Vector3).subVectors(T,y),j=(new Me.Vector3).subVectors(T,w),H=P.length(),z=(new Me.Vector3).crossVectors(S,j).length()/H,R=Math.max(2,Math.round(H/m)),D=Math.max(2,Math.round(z/m)),M=Array(R).fill(0).map((function(){return Array(D).fill(0)}));b.push(M),P.normalize();var W=R*S.dot(P)/H;S.normalize(),j.normalize();var I=(new Me.Vector3).crossVectors(S,j).normalize(),C=P.multiplyScalar(.5*H/R),O=(new Me.Vector3).crossVectors(I,P).normalize().multiplyScalar(.5*z/D),F=new Me.Vector3(c.cx+y.x,c.cy+y.y,c.lz+y.z+xy+(r?o.thickness:0));F.add(C).add(O),C.multiplyScalar(2),O.multiplyScalar(2),A.push(C.length()*O.length());var k=new Me.Vector3,Y=[],L=.01;Y.push({x:-.01,y:-.01}),Y.push({x:R+L,y:-.01}),Y.push({x:W,y:D+L});for(var E=Ry(l.ground,t.getMonth(),I,v),U=I.dot(a),N=0;Nwy||X<0)&&(M[N][J]+=E),U>0&&X<0&&(M[N][J]+=U*v)}}};for(T.s();!(g=T.n()).done;)P()}catch(S){T.e(S)}finally{T.f()}return{segmentIntensities:b,segmentUnitArea:A}}},{key:"computeHipRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,h,p);var g,m=Tw.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new Me.Euler(0,0,c.rotation[2],"ZYX"),v=zy(a,m,h,ny.SPHERE_MODEL),b=[],A=[],T=Object(f.a)(n.entries());try{var P=function(){var i=Object(u.a)(g.value,2),n=i[0],h=i[1],y=o.id+"-"+n,m=h[0].clone().applyEuler(x),T=h[1].clone().applyEuler(x),P=h[2].clone().applyEuler(x),S=(new Me.Vector3).subVectors(T,m),j=(new Me.Vector3).subVectors(P,m),H=(new Me.Vector3).subVectors(P,T),z=S.length(),R=(new Me.Vector3).crossVectors(j,H).length()/z,D=Math.max(2,Math.round(z/w)),M=Math.max(2,Math.round(R/w)),W=Array(D).fill(0).map((function(){return Array(M).fill(0)}));b.push(W),S.normalize();var I=D*j.dot(S)/z;j.normalize(),H.normalize();var C=(new Me.Vector3).crossVectors(j,H).normalize(),O=S.multiplyScalar(.5*z/D),F=(new Me.Vector3).crossVectors(C,S).normalize().multiplyScalar(.5*R/M),k=new Me.Vector3,Y=new Me.Vector3(c.cx+m.x,c.cy+m.y,c.lz+m.z+xy+(r?o.thickness:0));Y.add(O).add(F),O.multiplyScalar(2),F.multiplyScalar(2),A.push(O.length()*F.length());var L,E=Ry(l.ground,t.getMonth(),C,v),U=C.dot(a),N=[],V=Object(f.a)(h);try{for(V.s();!(L=V.n()).done;){var J=L.value;N.push({x:J.x,y:J.y})}}catch(ae){V.e(ae)}finally{V.f()}if(n%2===0)for(var G=0;Gwy||q<0)&&(W[G][B]+=E),U>0&&q<0&&(W[G][B]+=U*v)}}else{var Q=[],Z=.01;Q.push({x:-.01,y:-.01}),Q.push({x:D+Z,y:-.01}),Q.push({x:I,y:M+Z});for(var _=0;_wy||le<0)&&(W[_][ee]+=E),U>0&&le<0&&(W[_][ee]+=U*v)}}}};for(T.s();!(g=T.n()).done;)P()}catch(S){T.e(S)}finally{T.f()}return{segmentIntensities:b,segmentUnitArea:A}}},{key:"computeGambrelRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,h,p);var g,m=Tw.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new Me.Euler(0,0,c.rotation[2],"ZYX"),v=zy(a,m,h,ny.SPHERE_MODEL),b=[],A=[],T=Object(f.a)(n.entries());try{var P=function(){var i=Object(u.a)(g.value,2),n=i[0],f=i[1],h=o.id+"-"+n,y=f[0].clone().applyEuler(x),m=f[1].clone().applyEuler(x),T=f[2].clone().applyEuler(x),P=(new Me.Vector3).subVectors(m,y),S=(new Me.Vector3).subVectors(T,y),j=(new Me.Vector3).subVectors(T,m),H=P.length(),z=(new Me.Vector3).crossVectors(S,j).length()/H,R=Math.max(2,Math.round(H/w)),D=Math.max(2,Math.round(z/w)),M=Array(R).fill(0).map((function(){return Array(D).fill(0)}));b.push(M),P.normalize(),S.normalize(),j.normalize();var W=(new Me.Vector3).crossVectors(S,j).normalize(),I=P.multiplyScalar(.5*H/R),C=(new Me.Vector3).crossVectors(W,P).normalize().multiplyScalar(.5*z/D),O=new Me.Vector3(c.cx+y.x,c.cy+y.y,c.lz+y.z+xy+(r?o.thickness:0));O.add(I).add(C),I.multiplyScalar(2),C.multiplyScalar(2),A.push(I.length()*C.length());for(var F=new Me.Vector3,k=Ry(l.ground,t.getMonth(),W,v),Y=W.dot(a),L=0;Lwy||N<0)&&(M[L][U]+=k),Y>0&&N<0&&(M[L][U]+=Y*v)}};for(T.s();!(g=T.n()).done;)P()}catch(S){T.e(S)}finally{T.f()}return{segmentIntensities:b,segmentUnitArea:A}}},{key:"computeMansardRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h,p){var y;if(i)return e.computeFlatRoofSolarRadiationEnergy(t,l,a,o,r,n,c,s,d,h,p);var g,m=Tw.dayOfYear(t),w=null!==(y=l.solarRadiationHeatmapGridCellSize)&&void 0!==y?y:.5,x=new Me.Euler(0,0,c.rotation[2],"ZYX"),v=zy(a,m,h,ny.SPHERE_MODEL),b=[],A=[],T=Object(f.a)(n.entries());try{for(T.s();!(g=T.n()).done;){var P=Object(u.a)(g.value,2),S=P[0],j=P[1],H=o.id+"-"+S;S===n.length-1?function(){var i,n=Number.MAX_VALUE,u=Number.MAX_VALUE,h=-Number.MAX_VALUE,y=-Number.MAX_VALUE,g=Object(f.a)(j);try{for(g.s();!(i=g.n()).done;){var m=i.value.clone().applyEuler(x);m.x>h&&(h=m.x),m.xy&&(y=m.y),m.ywy||k<0)&&(D[O][F]+=I),C>0&&k<0&&(D[O][F]+=C*v)}}}():function(){var i=j[0].clone().applyEuler(x),n=j[1].clone().applyEuler(x),u=j[2].clone().applyEuler(x),f=(new Me.Vector3).subVectors(n,i),h=(new Me.Vector3).subVectors(u,i),y=(new Me.Vector3).subVectors(u,n),g=f.length(),m=(new Me.Vector3).crossVectors(h,y).length()/g,T=Math.max(2,Math.round(g/w)),P=Math.max(2,Math.round(m/w)),S=Array(T).fill(0).map((function(){return Array(P).fill(0)}));b.push(S),f.normalize(),h.normalize(),y.normalize();var z=(new Me.Vector3).crossVectors(h,y).normalize(),R=f.multiplyScalar(.5*g/T),D=(new Me.Vector3).crossVectors(z,f).normalize().multiplyScalar(.5*m/P),M=new Me.Vector3(c.cx+i.x,c.cy+i.y,c.lz+i.z+xy+(r?o.thickness:0));M.add(R).add(D),R.multiplyScalar(2),D.multiplyScalar(2),A.push(R.length()*D.length());for(var W=new Me.Vector3,I=Ry(l.ground,t.getMonth(),z,v),C=z.dot(a),O=0;Owy||Y<0)&&(S[O][k]+=I),C>0&&Y<0&&(S[O][k]+=C*v)}}()}}catch(z){T.e(z)}finally{T.f()}return{segmentIntensities:b,segmentUnitArea:A}}},{key:"computeFlatRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,u){var h,p,y=Tw.dayOfYear(t),g=null!==(h=l.solarRadiationHeatmapGridCellSize)&&void 0!==h?h:.5,m=new Me.Euler(0,0,n.rotation[2],"ZYX"),w=zy(a,y,d,ny.SPHERE_MODEL),x=[],v=[],b=Number.MAX_VALUE,A=Number.MAX_VALUE,T=-Number.MAX_VALUE,P=-Number.MAX_VALUE,S=Object(f.a)(r);try{for(S.s();!(p=S.n()).done;){var j,H=p.value,z=Object(f.a)(H);try{for(z.s();!(j=z.n()).done;){var R=j.value.clone().applyEuler(m);R.x>T&&(T=R.x),R.xP&&(P=R.y),R.ywy||N<0)&&(C[E][U]+=Y),L>0&&N<0&&(C[E][U]+=L*w)}}return{segmentIntensities:x,segmentUnitArea:v}}},{key:"computeGableRoofSolarRadiationEnergy",value:function(t,l,a,o,i,r,n,c,s,d,h){var p,y,g=Tw.dayOfYear(t),m=null!==(p=l.solarRadiationHeatmapGridCellSize)&&void 0!==p?p:.5,w=new Me.Euler(0,0,n.rotation[2],"ZYX"),x=zy(a,g,d,ny.SPHERE_MODEL),v=[],b=[],A=Object(f.a)(r.entries());try{var T=function(){var r=Object(u.a)(y.value,2),d=r[0],f=r[1],p=o.id+"-"+d,g=f[0].clone().applyEuler(w),A=f[1].clone().applyEuler(w),T=f[2].clone().applyEuler(w),P=(new Me.Vector3).subVectors(A,g),S=(new Me.Vector3).subVectors(T,g),j=(new Me.Vector3).subVectors(T,A),H=P.length(),z=(new Me.Vector3).crossVectors(S,j).length()/H,R=Math.max(2,Math.round(H/m)),D=Math.max(2,Math.round(z/m)),M=Array(R).fill(0).map((function(){return Array(D).fill(0)}));v.push(M),P.normalize(),S.normalize(),j.normalize();var W=(new Me.Vector3).crossVectors(S,j).normalize(),I=P.multiplyScalar(.5*H/R),C=(new Me.Vector3).crossVectors(W,P).normalize().multiplyScalar(.5*z/D),O=new Me.Vector3(n.cx+g.x,n.cy+g.y,n.lz+g.z+xy+(i?o.thickness:0));O.add(I).add(C),I.multiplyScalar(2),C.multiplyScalar(2),b.push(I.length()*C.length());for(var F=new Me.Vector3,k=Ry(l.ground,t.getMonth(),W,x),Y=W.dot(a),L=0;Lwy||N<0)&&(M[L][U]+=k),Y>0&&N<0&&(M[L][U]+=Y*x)}};for(A.s();!(y=A.n()).done;)T()}catch(P){A.e(P)}finally{A.f()}return{segmentIntensities:v,segmentUnitArea:b}}},{key:"isPointRoof",value:function(e,t,l,a){if(t&&t.length>0){var o,i=Object(f.a)(t);try{for(i.s();!(o=i.n()).done;){var r=o.value,n=Vm.getAbsoluteWindowVerticesOnRoof(r,a),c=Tw.getPoints(n);if(Tw.isPointInside(e.x,e.y,c))return!1}}catch(y){i.e(y)}finally{i.f()}}if(l&&l.length>0){var s,d=Object(f.a)(l);try{for(d.s();!(s=d.n()).done;){var u=s.value,h=Vm.getAbsoluteSolarPanelVerticesOnRoof(u,a),p=Tw.getPoints(h);if(Tw.isPointInside(e.x,e.y,p))return!1}}catch(y){d.e(y)}finally{d.f()}}return!0}}]),e}(),Dk=function(e){var t,l,a,o,i=e.city,n=Ew(si),c=Tf(yf),s=Ew(Cs),d=Ew(_r),p=Ew($r),y=Ew(tn),g=Ew(Ei),m=Pf(xi),w=Pf(Ri),x=Pf(zi),v=Pf(Ti),b=Pf(Si),A=Pf(Hi),T=Ew(Vi),P=Ew(Gi),S=Tf(Ir),j=Tf(Cr),H=Tf(Or),z=Tf(Fr),R=Ew.getState().world,D=Ew.getState().elements,M=!!R.noAnimationForThermalSimulation,W=null!==(t=R.highestTemperatureTimeInMinutes)&&void 0!==t?t:900,I=Object(r.useRef)(0),C=Object(r.useRef)(!1),O=Object(r.useRef)(new Date(R.date)),F=Object(r.useRef)(0),k=Object(r.useRef)(!1),Y=Object(r.useRef)(new Date(R.date)),L=Object(r.useRef)(0),E=Object(r.useRef)({high:20,low:0}),N=Object(r.useRef)(20),J=Object(r.useRef)(20),G=Object(r.useRef)(new Map),X=Object(r.useRef)(new Map),B=Object(r.useRef)(new Map),K=Object(r.useRef)([]),q=Object(r.useRef)([]),Q=Object(r.useRef)(),Z=Object(r.useRef)(),_=Object(r.useRef)(0),$=Object(r.useRef)(new Map),ee=Object(r.useMemo)((function(){return{lng:T}}),[T]),te=Object(r.useMemo)((function(){return s(null!==i&&void 0!==i?i:"Boston MA, USA")}),[i]),le=new Date(R.date),ae=i?null===te||void 0===te?void 0:te.elevation:0,oe=null!==(l=R.monthlyIrradianceLosses)&&void 0!==l?l:new Array(12).fill(.05),ie=null!==(a=R.timesPerHour)&&void 0!==a?a:4,re=60/ie,ne=null!==(o=R.daysPerYear)&&void 0!==o?o:6,ce=12/ne,se=Object(Se.f)().scene,de=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),ue=function(e,t,l){if(K.current.length>1){q.current.length=0,de.set(t,l);var a=K.current.filter((function(t){return t.uuid!==e}));if(de.intersectObjects(a,!1,q.current),q.current.length>0)return q.current[0].distance}return-1},fe=function(){var e=se.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;K.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,K.current)}}catch(i){a.e(i)}finally{a.f()}}},he=function(e,t){var l=G.current.get(e);l||(l=new Array(24).fill(0),G.current.set(e,l)),l[le.getHours()]+=t},pe=function(){var e,t=Object(f.a)(D);try{for(t.s();!(e=t.n()).done;){var l,a,o,i=e.value;if(Tw.onBuildingEnvelope(i))null===(l=G.current.get(i.id))||void 0===l||l.fill(0);if(i.type===V.Roof){var r,n=Object(f.a)(G.current.keys());try{for(n.s();!(r=n.n()).done;){var c,s=r.value;if(s!==i.id&&s.startsWith(i.id))null===(c=G.current.get(s))||void 0===c||c.fill(0)}}catch(d){n.e(d)}finally{n.f()}}if(i.type===V.Foundation)null===(a=X.current.get(i.id))||void 0===a||a.fill(0),null===(o=B.current.get(i.id))||void 0===o||o.fill(0)}}catch(d){t.e(d)}finally{t.f()}},ye=function(){$.current.clear()};Object(r.useEffect)((function(){if(S){if(!M||Tw.hasMovingParts(D))return fe(),we(),I.current=requestAnimationFrame(ve),function(){cancelAnimationFrame(I.current),C.current||(Kh(me.t("message.SimulationAborted",ee)),n((function(e){e.world.date=O.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),k.current=!1};ge()}}),[S]),Object(r.useEffect)((function(){k.current=j,j?(Y.current=new Date(le.getTime()),cancelAnimationFrame(I.current),c("simulationPaused",!0),Kh(me.t("message.SimulationPaused",ee))):(c("simulationPaused",!1),le.setHours(le.getHours(),le.getMinutes()+re),ve())}),[j]);var ge=function(){ze()},we=function(){k.current?(le.setTime(Y.current.getTime()),k.current=!1):(O.current=new Date(R.date),L.current=Tw.dayOfYear(le),le.setHours(0,re/2)),C.current=!1,pe(),ye()},xe=function(){var e,t=Object(f.a)(D);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(Tw.onBuildingEnvelope(l)||l.type===V.SolarPanel){var a=G.current.get(l.id);a&&v(l.id,Object(h.a)(a));var o=$.current.get(l.id);o&&m(l.id,o.map((function(e){return Object(h.a)(e)})))}if(l.type===V.Roof){var i,r=Object(f.a)(G.current.keys());try{for(r.s();!(i=r.n()).done;){var c=i.value;if(c!==l.id&&c.startsWith(l.id)){var s=G.current.get(c);s&&v(c,Object(h.a)(s));var d=$.current.get(c);d&&m(c,d.map((function(e){return Object(h.a)(e)})))}}}catch(p){r.e(p)}finally{r.f()}}if(l.type===V.Foundation){var u=X.current.get(l.id);u&&b(l.id,Object(h.a)(u)),(u=B.current.get(l.id))&&A(l.id,Object(h.a)(u))}}}catch(p){t.e(p)}finally{t.f()}Tf.setState((function(e){e.flagOfDailySimulation=!e.flagOfDailySimulation,e.runYearlyThermalSimulation||(e.showSolarRadiationHeatmap=!0,e.showHeatFluxes=!0)})),P&&!H&&setTimeout((function(){n((function(e){var t=Pf.getState().totalBuildingHeater,l=Pf.getState().totalBuildingAc,a=Pf.getState().totalBuildingSolarPanel;e.actionInfo={name:"Daily Building Energy Analysis Completed",result:{Heater:t.toFixed(2),AC:l.toFixed(2),SolarPanel:a.toFixed(2),Net:(t+l-a).toFixed(2)},timestamp:(new Date).getTime()}}))}),10)},ve=function e(){if(S&&!k.current){if(le.getMinutes()+60*le.getHours()+(Tw.dayOfYear(le)-L.current)*py+re>py)return ze(),cancelAnimationFrame(I.current),n((function(e){e.world.date=O.current.toLocaleString("en-US"),e.viewState.showDailyBuildingEnergyPanel=!0,e.selectedFloatingWindow="dailyBuildingEnergyPanel"})),Tf.setState((function(e){e.runDailyThermalSimulation=!1,e.simulationPaused=!1,e.simulationInProgress=!1})),Kh(me.t("message.SimulationCompleted",ee)),C.current=!0,void xe();n((function(e){e.world.date=le.toLocaleString("en-US")})),ze(),I.current=requestAnimationFrame(e),le.setHours(le.getHours(),le.getMinutes()+re)}},be=Object(r.useState)(le.getMonth()),Ae=Object(u.a)(be,2),Te=Ae[0],Pe=Ae[1];Object(r.useEffect)((function(){setTimeout((function(){fe()}),200)}),[Te]),Object(r.useEffect)((function(){if(H){if(!M||Tw.hasMovingParts(D))return je(),Pe(le.getMonth()),fe(),I.current=requestAnimationFrame(He),function(){cancelAnimationFrame(I.current),C.current||(Kh(me.t("message.SimulationAborted",ee)),n((function(e){e.world.date=O.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),k.current=!1};setTimeout((function(){}),50)}}),[H]),Object(r.useEffect)((function(){k.current=z,z?(Y.current=new Date(le.getTime()),cancelAnimationFrame(I.current),c("simulationPaused",!0),Kh(me.t("message.SimulationPaused",ee))):(c("simulationPaused",!1),le.setHours(le.getHours(),le.getMinutes()+re),He())}),[z]);var je=function(){k.current?(le.setTime(Y.current.getTime()),k.current=!1):(O.current=new Date(R.date),F.current=0,le.setMonth(0,22),L.current=Tw.dayOfYear(le),le.setHours(0,re/2),n((function(e){e.viewState.showYearlyBuildingEnergyPanel=!0,e.selectedFloatingWindow="yearlyBuildingEnergyPanel",e.world.date=le.toLocaleString("en-US")}))),pe(),ye(),C.current=!1},He=function e(){if(H&&!k.current)if(le.getMinutes()+60*le.getHours()+(Tw.dayOfYear(le)-L.current)*pyAt?te.sunshineHours[le.getMonth()]/(30*e*ie):0,Q.current=Hy(1,Py(le),Ay(le),Tw.toRadians(R.latitude)).normalize();var t,l=Object(f.a)(D);try{for(l.s();!(t=l.n()).done;){var a=t.value;switch(a.type){case V.Door:Ie(a);break;case V.Window:De(a),We(a);break;case V.Wall:Ce(a);break;case V.Roof:var o=a;ke(o),Oe(o);break;case V.SolarPanel:Re(a)}}}catch(i){l.e(i)}finally{l.f()}},Re=function(e){var t=d(e);if(t){var l=p(e);if(l){var a=g(e.pvModelName);if(Q.current&&Q.current.z>0){var o=Rk.computeSolarPanelOutput(le,R,Q.current,a,e,l,t,ae,ue),i=function(e,t){var l=t.efficiency;return"Monocrystalline"===t.cellType&&(l*=.95),l*(1+t.pmaxTC*(e-25))}(N.current,a)*function(){if(!Z.current)throw new Error("sun minutes not set");var e=Z.current.daylight()/60;return e>At?te.sunshineHours[le.getMonth()]/(30*e*ie):0}()*function(e){var t;if(!g(e.pvModelName))throw new Error("PV model not found");return e.lx*e.ly*(null!==(t=e.inverterEfficiency)&&void 0!==t?t:.95)*(1-oe[le.getMonth()])}(e);if(function(e,t){var l=B.current.get(e);l||(l=new Array(24).fill(0),B.current.set(e,l)),l[le.getHours()]+=t}(t.id,o.average*i),S){for(var r=0;r0){for(var r=Rk.computeRoofWindowSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),n=0;n0){for(var s=Rk.computeWallWindowSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),u=0;u0){for(var f=Rk.computeDoorSolarRadiationEnergy(le,R,Q.current,e,l,t,ae,ue),y=0;y0){for(var b=4===(c?u.length:s.length),A=y(V.SolarPanel,e.id),T=Rk.computeWallSolarRadiationEnergy(le,R,Q.current,e,t,m,w,A,b?0:1,ae,ue),P=0;P0){var I,C=Object(f.a)(m);try{for(C.s();!(I=C.n()).done;){var O=I.value;g-=Tw.getWindowArea(O,e)}}catch(X){C.e(X)}finally{C.f()}}if(w&&w.length>0){var F,k=Object(f.a)(w);try{for(k.s();!(F=k.n()).done;){var Y=F.value;g-=Y.lx*Y.lz*e.lx*e.lz}}catch(X){k.e(X)}finally{k.f()}}var L=Tw.isZero(v)||Tw.isZero(x)?0:v*x/((null!==(r=e.volumetricHeatCapacity)&&void 0!==r?r:.5)*g*e.ly),E=(N.current+L-i)*g/(null!==(n=e.rValue)&&void 0!==n?n:2)*.001/ie;c&&e.openToOutside&&(E+=(N.current-i)*(p-g)*50*.001/ie),he(e.id,E)}else if(e.openToOutside){var U=Tw.getWallVertices(e,0),J=Tw.getPolygonArea(U),G=N.current-i;he(e.id,G*J*50*.001/ie)}}},Oe=function(e){var t,l,a,o=d(e);if(o){var i=null!==(t=null===(l=o.hvacSystem)||void 0===l?void 0:l.thermostatSetpoint)&&void 0!==t?t:20,r=Tw.calculateBuildingArea(e),n=J.current-i;he(o.id,n*r/(null!==(a=o.rValue)&&void 0!==a?a:2)*.001/ie)}},Fe=function(e,t,l){var a,o,i=1/(null!==(a=e.rValue)&&void 0!==a?a:2),r=1/(null!==(o=e.ceilingRValue)&&void 0!==o?o:2);return(i*t+r*l)/(i+r)},ke=function(e){var t=d(e);if(t){var l=w(e.id);if(l){var a=void 0;switch(e.roofType){case It.Pyramid:a=Ye(e,l,t);break;case It.Hip:a=Le(e,l,t);break;case It.Gable:a=Je(e,l,t);break;case It.Gambrel:a=Ee(e,l,t);break;case It.Mansard:a=Ve(e,l,t)}if(a){var o,i,r,n=null!==(o=null===(i=t.hvacSystem)||void 0===i?void 0:i.thermostatSetpoint)&&void 0!==o?o:20,c=0,s=Object(f.a)(a.entries());try{for(s.s();!(r=s.n()).done;){var h,p=Object(u.a)(r.value,2),y=p[0],g=p[1],m=(g.surfaceTemperature-(e.ceiling?Fe(e,g.surfaceTemperature,n):n))*g.totalArea/(null!==(h=e.rValue)&&void 0!==h?h:2)*.001/ie;he(e.id+"-"+y,m),c+=m}}catch(x){s.e(x)}finally{s.f()}he(e.id,c)}}}},Ye=function(e,t,l){if(e.roofType!==It.Pyramid)throw new Error("roof is not pyramid");var a=t.length;if(0!==a){var o,i=!0,r=t[0][0].z,n=Object(f.a)(t);try{for(n.s();!(o=n.n()).done;){var c,s=o.value,d=Object(f.a)(s);try{for(d.s();!(c=d.n()).done;){var u=c.value;if(Math.abs(u.z-r)>.01){i=!1;break}}}catch(me){d.e(me)}finally{d.f()}}}catch(me){n.e(me)}finally{n.f()}var p=i?1:a,g=y(V.Window,e.id),m=[];if(i){var w,v=0,b=Object(f.a)(t);try{for(b.s();!(w=b.n()).done;){var A,T=w.value,P=[],j=Object(f.a)(T);try{for(j.s();!(A=j.n()).done;){var H=A.value;P.push(Tw.mapVector3ToPoint2(H))}}catch(me){j.e(me)}finally{j.f()}v+=Tw.getPolygonArea(P)}}catch(me){b.e(me)}finally{b.f()}if(g.length>0){var z,D=Object(f.a)(g);try{for(D.s();!(z=D.n()).done;){var M=z.value;v-=M.lx*M.lz}}catch(me){D.e(me)}finally{D.f()}v<0&&(v=0)}m.push(v)}else{var W,I=Object(f.a)(t);try{for(I.s();!(W=I.n()).done;){var C=W.value,O=Tw.getTriangleArea(C[0],C[1],C[2]);if(g.length>0){var F,k=Object(f.a)(g);try{for(k.s();!(F=k.n()).done;){var Y=F.value;Vm.onSegment(C,Y.cx,Y.cy)&&(O-=Y.lx*Y.lz)}}catch(me){k.e(me)}finally{k.f()}O<0&&(O=0)}m.push(O)}}catch(me){I.e(me)}finally{I.f()}}var L=PT(e),E=Array(p).fill(0);if(Q.current&&Q.current.z>0){for(var U=y(V.SolarPanel,e.id),J=Rk.computePyramidRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,g,U,ae,ue),G=0;G.01){i=!1;break}}}catch(re){d.e(re)}finally{d.f()}}}catch(re){n.e(re)}finally{n.f()}var p,g=i?1:a,m=[],w=y(V.Window,e.id),v=Object(f.a)(t);try{for(v.s();!(p=v.n()).done;){var b=p.value,A=0;if(3===b.length?A=Tw.getTriangleArea(b[0],b[1],b[2]):4===b.length&&(A=Tw.getTriangleArea(b[0],b[1],b[2])+Tw.getTriangleArea(b[2],b[3],b[0])),w.length>0){var T,P=Object(f.a)(w);try{for(P.s();!(T=P.n()).done;){var j=T.value;Vm.onSegment(b,j.cx,j.cy)&&(A-=j.lx*j.lz)}}catch(re){P.e(re)}finally{P.f()}A<0&&(A=0)}m.push(A)}}catch(re){v.e(re)}finally{v.f()}var H=i?[m.reduce((function(e,t){return e+t}),0)]:m,z=PT(e),D=Array(g).fill(0);if(Q.current&&Q.current.z>0){for(var M=y(V.SolarPanel,e.id),W=Rk.computeHipRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,w,M,ae,ue),I=0;I.01){i=!1;break}}}catch(ie){d.e(ie)}finally{d.f()}}}catch(ie){n.e(ie)}finally{n.f()}var p,g=i?1:a,m=[],w=y(V.Window,e.id),v=Object(f.a)(t);try{for(v.s();!(p=v.n()).done;){var b=p.value,A=Tw.getTriangleArea(b[0],b[1],b[2])+Tw.getTriangleArea(b[2],b[3],b[0]);if(w.length>0){var T,P=Object(f.a)(w);try{for(P.s();!(T=P.n()).done;){var j=T.value;Vm.onSegment(b,j.cx,j.cy)&&(A-=j.lx*j.lz)}}catch(ie){P.e(ie)}finally{P.f()}A<0&&(A=0)}m.push(A)}}catch(ie){v.e(ie)}finally{v.f()}var H=i?[m.reduce((function(e,t){return e+t}),0)]:m,z=PT(e),D=Array(g).fill(0);if(Q.current&&Q.current.z>0){for(var M=y(V.SolarPanel,e.id),W=Rk.computeGambrelRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,w,M,ae,ue),I=0;I.01){i=!1;break}}}catch(pe){d.e(pe)}finally{d.f()}}}catch(pe){n.e(pe)}finally{n.f()}for(var p=i?1:a,g=[],m=y(V.Window,e.id),w=0;w0){var A,T=Object(f.a)(m);try{for(T.s();!(A=T.n()).done;){var P=A.value;Vm.onSegment(v,P.cx,P.cy)&&(b-=P.lx*P.lz)}}catch(pe){T.e(pe)}finally{T.f()}b<0&&(b=0)}g.push(b)}var j,H=t[a-1],z=new Array,D=Object(f.a)(H);try{for(D.s();!(j=D.n()).done;){var M=j.value;z.push({x:M.x,y:M.y})}}catch(pe){D.e(pe)}finally{D.f()}var W=Tw.getPolygonArea(z);if(m.length>0){for(var I=m.length-1;I>=0;I--){var C=m[I];Vm.onSegment(H,C.cx,C.cy)&&(W-=C.lx*C.lz,m.splice(I,1))}W<0&&(W=0)}g.push(W);var O=i?[g.reduce((function(e,t){return e+t}),0)]:g,F=PT(e),k=Array(p).fill(0);if(Q.current&&Q.current.z>0){for(var Y=y(V.SolarPanel,e.id),L=Rk.computeMansardRoofSolarRadiationEnergy(le,R,Q.current,e,i,!0,t,l,m,Y,ae,ue),E=0;E0){var d,u=Object(f.a)(i);try{for(u.s();!(d=u.n()).done;){var p=d.value;Vm.onSegment(c,p.cx,p.cy)&&(s-=p.lx*p.lz)}}catch(J){u.e(J)}finally{u.f()}s<0&&(s=0)}r.push(s)}}catch(J){n.e(J)}finally{n.f()}var g=PT(e),m=Array(a).fill(0);if(Q.current&&Q.current.z>0){for(var w=y(V.SolarPanel,e.id),v=Rk.computeGableRoofSolarRadiationEnergy(le,R,Q.current,e,!0,t,l,i,w,ae,ue),b=0;b0&&(h(),H(),Tf.setState((function(e){e.runStaticSimulation=!1,e.simulationInProgress=!1,e.showSolarRadiationHeatmap=!0})),Kh(me.t("message.SimulationCompleted",m)))}),[p]);var j=function(e,t,l){if(P.current.length>1){S.current.length=0,A.set(t,l);var a=P.current.filter((function(t){return t.uuid!==e}));return A.intersectObjects(a,!1,S.current),S.current.length>0}return!1},H=function(){!function(){var e=g.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;P.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,P.current)}}catch(i){a.e(i)}finally{a.f()}}}();var e,t=Object(f.a)(i);try{for(t.s();!(e=t.n()).done;){var l=e.value;switch(l.type){case V.Foundation:var a=l;R(a),a.solarStructure===G.UpdraftTower&&D(a);break;case V.Cuboid:z(l);break;case V.SolarPanel:M(l);break;case V.Wall:W(l);break;case V.Door:I(l);break;case V.Roof:var o=l;switch(o.roofType){case It.Pyramid:C(o);break;case It.Gable:L(o);break;case It.Gambrel:F(o);break;case It.Mansard:O(o);break;case It.Hip:k(o)}}}}catch(r){t.e(r)}finally{t.f()}},z=function(e){var t=x.getFullYear(),l=x.getMonth(),a=x.getDate(),i=Tw.dayOfYear(x),r=e.lx,n=e.ly,s=e.lz,u=Math.max(2,Math.round(r/T)),f=Math.max(2,Math.round(n/T)),h=Math.max(2,Math.round(s/T)),p=r/u,y=n/f,g=s/h,m=c(e),A=e.cx,P=e.cy,S=e.cz;if(m&&m.type===V.Cuboid){var H=Tw.getWorldDataById(e.id);A=H.pos.x,P=H.pos.y,S=H.pos.z}for(var z=Array(u).fill(0).map((function(){return Array(f).fill(0)})),R=Array(u).fill(0).map((function(){return Array(h).fill(0)})),D=Array(u).fill(0).map((function(){return Array(h).fill(0)})),M=Array(f).fill(0).map((function(){return Array(h).fill(0)})),W=Array(f).fill(0).map((function(){return Array(h).fill(0)})),I=Rt,C=zt.clone().applyAxisAngle(Rt,e.rotation[2]),O=Ht.clone().applyAxisAngle(Rt,e.rotation[2]),F=jt.clone().applyAxisAngle(Rt,e.rotation[2]),k=St.clone().applyAxisAngle(Rt,e.rotation[2]),Y=new Me.Vector3,L=0,U=new Me.Vector2(A,P),N=new Me.Vector2,J=P-n/2,G=P+n/2,X=A-r/2,B=A+r/2,K=0;K<24;K++)for(var q=0;q0){L++;for(var _=zy(Z,i,v,ny.SPHERE_MODEL),$=Ry(o.ground,l,I,_),ee=I.dot(Z),te=A-r/2,le=P-n/2,ae=S+s/2,oe=0;oe0&&(N.set(te+(oe+.5)*p,le+(ie+.5)*y),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,ae),j(e.id,Y,Z)||(z[oe][ie]+=ee*_));te=A-r/2,le=S-s/2,$=Ry(o.ground,l,C,_),ee=C.dot(Z);for(var re=0;re0&&(N.set(te+(re+.5)*p,J),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,le+(ne+.5)*g),j(e.id,Y,Z)||(R[re][ne]+=ee*_));$=Ry(o.ground,l,O,_),ee=O.dot(Z);for(var ce=0;ce0&&(N.set(te+(ce+.5)*p,G),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,le+(h-(se+.5))*g),j(e.id,Y,Z)||(D[ce][se]+=ee*_));te=P-n/2,le=S-s/2,$=Ry(o.ground,l,F,_),ee=F.dot(Z);for(var de=0;de0&&(N.set(X,te+(de+.5)*y),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,le+(ue+.5)*g),j(e.id,Y,Z)||(M[de][ue]+=ee*_));$=Ry(o.ground,l,k,_),ee=k.dot(Z);for(var fe=0;fe0&&(N.set(B,te+(fe+.5)*y),N.rotateAround(U,e.rotation[2]),Y.set(N.x,N.y,le+(he+.5)*g),j(e.id,Y,Z)||(W[fe][he]+=ee*_))}}M=Tw.transpose(M),W=Tw.transpose(W);var pe=L*b/60,ye=pe>At?w.sunshineHours[l]/(30*pe*o.timesPerHour):0;E(z,ye),E(R,ye),E(D,ye),E(M,ye),E(W,ye),d(e.id+"-top",z),d(e.id+"-south",R),d(e.id+"-north",D),d(e.id+"-west",M),d(e.id+"-east",W)},R=function(e){for(var t=x.getFullYear(),l=x.getMonth(),a=x.getDate(),i=Tw.dayOfYear(x),r=e.lx,n=e.ly,c=e.lz,s=Math.max(2,Math.round(r/T)),u=Math.max(2,Math.round(n/T)),f=r/s,h=n/u,p=e.cx-r/2,y=e.cy-n/2,g=new Me.Vector2(e.cx,e.cy),m=new Me.Vector3,A=Array(s).fill(0).map((function(){return Array(u).fill(0)})),P=0,S=0;S<24;S++)for(var H=0;H0){P++;for(var D=zy(R,i,v,ny.SPHERE_MODEL),M=Ry(o.ground,l,Rt,D),W=Rt.dot(R),I=new Me.Vector2,C=0;C0&&(I.set(p+(C+.5)*f,y+(O+.5)*h),I.rotateAround(g,e.rotation[2]),m.set(I.x,I.y,c),j(e.id,m,R)||(A[C][O]+=W*D))}}var F=P*b/60,k=F>At?w.sunshineHours[l]/(30*F*o.timesPerHour):0;E(A,k),d(e.id,A)},D=function(e){var t=e.solarUpdraftTower;if(t){for(var l,a,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),c=Tw.dayOfYear(x),s=t.collectorRadius,u=Math.max(2,Math.round(2*s/T)),f=e.cx-s+T/2,h=e.cy-s+T/2,p=e.lz+t.collectorHeight,y=Array(u).fill(0).map((function(){return Array(u).fill(0)})),g=new Me.Vector3(0,0,p),m=s*s,A=0,P=0;P<24;P++)for(var S=0;S0){A++;for(var R=zy(z,c,v,ny.SPHERE_MODEL),D=Ry(o.ground,r,Rt,R),M=Rt.dot(z),W=0;Wm||(y[W][I]+=D,M>0&&(j(e.id+"-sut",g,z)||(y[W][I]+=M*R)))}}}var C=A*b/60,O=C>At?w.sunshineHours[r]/(30*C*o.timesPerHour):0;E(y,O),d(e.id+"-sut",y)}},M=function(e){if(e.trackerType!==te.NO_TRACKER)throw new Error("trackers cannot use static simulation");var t=c(e);if(!t)throw new Error("parent of solar panel does not exist");var l=e.parentType===V.Roof,a=e.parentType===V.Wall;if(l&&!(t=s(t)))throw new Error("foundation of solar panel does not exist");var i=a?Tw.absoluteCoordinates(e.cx,e.cy,e.cz,t,s(e),e.lz):Tw.absoluteCoordinates(e.cx,e.cy,e.cz,t),r=(new Me.Vector3).fromArray(e.normal),n=t.rotation[2],u=n+e.relativeAzimuth,f=e.tiltAngle,h=!0;if(l&&(i.z=e.cz+e.lz+.02+t.cz+t.lz/2,Tw.isZero(e.rotation[0])?i.z+=e.poleHeight:(f=e.rotation[0],u=n,h=!1)),a&&!Tw.isZero(e.tiltAngle)){var p=t,y=s(t),g=(y?y.rotation[2]+p.relativeAngle:p.relativeAngle)-vt,m=e.ly*Math.abs(Math.sin(e.tiltAngle))/2;i.x+=m*Math.cos(g),i.y+=m*Math.sin(g)}var A=new Me.Euler(l&&!h?0:f,0,u,"ZYX");r.applyEuler(A);var P=x.getFullYear(),S=x.getMonth(),H=x.getDate(),z=Tw.dayOfYear(x),R=e.lx,D=e.ly,M=Math.max(2,Math.round(e.lx/T)),W=Math.max(2,Math.round(e.ly/T)),I=R/M,C=D/W,O=i.x-(R-T)/2,F=i.y-(D-T)/2,k=l||a?i.z:t.lz+e.poleHeight+e.lz,Y=new Me.Vector2(i.x,i.y),L=new Me.Vector3,U=Array(M).fill(0).map((function(){return Array(W).fill(0)})),N=0;l&&!h&&(A.x=e.rotation[0],A.z=e.rotation[2]+n),a&&(A.x=vt+e.tiltAngle,A.z=t.relativeAngle+n);for(var J=0;J<24;J++)for(var G=0;G0){N++;for(var K=zy(B,z,v,ny.SPHERE_MODEL),q=Ry(o.ground,S,r,K),Q=r.dot(B),Z=new Me.Vector2,_=new Me.Vector3,$=0;$0&&(Z.set(O+$*I,F+ee*C),_.set(Z.x-Y.x,Z.y-Y.y,0),_.applyEuler(A),L.set(i.x+_.x,i.y+_.y,k+_.z),j(e.id,L,B)||(U[$][ee]+=Q*K))}}var le=N*b/60,ae=le>At?w.sunshineHours[S]/(30*le*o.timesPerHour):0;E(U,ae),d(e.id,U)},W=function(e){var t=s(e);if(!t)throw new Error("foundation of wall not found");for(var l=x.getFullYear(),a=x.getMonth(),i=x.getDate(),r=Tw.dayOfYear(x),n=e.lx,c=Tw.getHighestPointOfWall(e),u=Math.max(2,Math.round(n/T)),f=Math.max(2,Math.round(c/T)),h=n/u,p=c/f,y=t.rotation[2]+e.relativeAngle,g=Tw.wallAbsolutePosition(new Me.Vector3(e.cx,e.cy,c/2),t).setZ(c/2+t.lz),m=new Me.Vector3(Math.cos(y-vt),Math.sin(y-vt),0),A=new Me.Vector3,P=Array(u).fill(0).map((function(){return Array(f).fill(0)})),S=0,H=h*Math.cos(y),z=h*Math.sin(y),R=Tw.getWallVertices(e,2),D=(c-e.lz)/2,M=0;M<24;M++)for(var W=0;W0){S++;for(var O=zy(C,r,v,ny.SPHERE_MODEL),F=Ry(o.ground,a,m,O),k=m.dot(C),Y=0;Y0&&(A.set(g.x+U*H,g.y+U*z,g.z+N*p),j(e.id,A,C)||(P[Y][L]+=k*O)))}}}var V=S*b/60,J=V>At?w.sunshineHours[a]/(30*V*o.timesPerHour):0;E(P,J),d(e.id,P)},I=function(e){var t=s(e);if(!t)throw new Error("foundation of door not found");var l=c(e);if(!l)throw new Error("parent of door not found");for(var a=l,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),u=Tw.dayOfYear(x),f=e.lx*a.lx,h=e.lz*a.lz,p=Math.max(2,Math.round(f/T)),y=Math.max(2,Math.round(h/T)),g=f/p,m=h/y,A=t.rotation[2]+a.relativeAngle,P=Tw.wallAbsolutePosition(new Me.Vector3(a.cx,a.cy,a.cz),t).setZ(a.lz/2+t.lz).clone().add(new Me.Vector3(e.cx*a.lx,0,e.cz*a.lz)),S=new Me.Vector3(Math.cos(A-vt),Math.sin(A-vt),0),H=new Me.Vector3,z=Array(p).fill(0).map((function(){return Array(y).fill(0)})),R=0,D=g*Math.cos(A),M=g*Math.sin(A),W=0;W<24;W++)for(var I=0;I0){R++;var F=zy(O,u,v,ny.SPHERE_MODEL),k=Ry(o.ground,r,S,F),Y=S.dot(O);if(e.doorType===hy.Arched)for(var L=0;L0&&(j(e.id,H,O)||(z[L][U]+=Y*F)))}else for(var J=0;J0&&(H.set(P.x+X*D,P.y+X*M,P.z+B*m),j(e.id,H,O)||(z[J][G]+=Y*F))}}}var K=R*b/60,q=K>At?w.sunshineHours[r]/(30*K*o.timesPerHour):0;E(z,q),d(e.id,z)},C=function(e){if(e.roofType!==It.Pyramid)throw new Error("roof is not pyramid");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=!0,r=l[0][0].z,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c,h=a.value,p=Object(f.a)(h);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(M){p.e(M)}finally{p.f()}}}catch(M){n.e(M)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),H=Tw.dayOfYear(x),z=new Me.Euler(0,0,t.rotation[2],"ZYX"),R=Object(f.a)(l.entries());try{var D=function(){var l=Object(u.a)(m.value,2),a=l[0],i=l[1],r=e.id+"-"+a,n=i[0].clone().applyEuler(z),c=i[1].clone().applyEuler(z),s=i[2].clone().applyEuler(z),f=(new Me.Vector3).subVectors(c,n),h=(new Me.Vector3).subVectors(s,n),p=(new Me.Vector3).subVectors(s,c),y=f.length(),g=(new Me.Vector3).crossVectors(h,p).length()/y,x=Math.max(2,Math.round(y/T)),R=Math.max(2,Math.round(g/T)),D=Array(x).fill(0).map((function(){return Array(R).fill(0)}));f.normalize(),h.normalize(),p.normalize();var M=(new Me.Vector3).crossVectors(h,p).normalize(),W=f.multiplyScalar(.5*y/x),I=(new Me.Vector3).crossVectors(M,f).normalize().multiplyScalar(.5*g/R),C=new Me.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+xy);C.add(W).add(I),W.multiplyScalar(2),I.multiplyScalar(2);for(var O=0,F=new Me.Vector3,k=0;k<24;k++)for(var Y=0;Y0){O++;for(var N=zy(U,H,v,ny.SPHERE_MODEL),V=Ry(o.ground,P,M,N),J=M.dot(U),G=0;G0&&(F.copy(C).add(X).add(I.clone().multiplyScalar(B)),j(r,F,U)||(D[G][B]+=J*N))}}var K=O*b/60,q=K>At?w.sunshineHours[P]/(30*K*o.timesPerHour):0;E(D,q),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(M){R.e(M)}finally{R.f()}}}},O=function(e){if(e.roofType!==It.Mansard)throw new Error("roof is not mansard");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=!0,r=l[0][0].z,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c,h=a.value,p=Object(f.a)(h);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(C){p.e(C)}finally{p.f()}}}catch(C){n.e(C)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),H=Tw.dayOfYear(x),z=new Me.Euler(0,0,t.rotation[2],"ZYX"),R=Object(f.a)(l.entries());try{for(R.s();!(m=R.n()).done;){var D=Object(u.a)(m.value,2),M=D[0],W=D[1],I=e.id+"-"+M;M===l.length-1?function(){var e,l=Number.MAX_VALUE,a=Number.MAX_VALUE,i=-Number.MAX_VALUE,r=-Number.MAX_VALUE,n=Object(f.a)(W);try{for(n.s();!(e=n.n()).done;){var c=e.value.clone().applyEuler(z);c.x>i&&(i=c.x),c.xr&&(r=c.y),c.y0){x++;for(var k=zy(F,H,v,ny.SPHERE_MODEL),Y=Ry(o.ground,P,Rt,k),L=Rt.dot(F),U=0;U0&&(R.y=m.y+N*y,j(I,R,F)||(g[U][N]+=L*k))}}}var V=x*b/60,J=V>At?w.sunshineHours[P]/(30*V*o.timesPerHour):0;E(g,J),d(I,g)}():function(){var e=W[0].clone().applyEuler(z),l=W[1].clone().applyEuler(z),a=W[2].clone().applyEuler(z),i=(new Me.Vector3).subVectors(l,e),r=(new Me.Vector3).subVectors(a,e),n=(new Me.Vector3).subVectors(a,l),c=i.length(),s=(new Me.Vector3).crossVectors(r,n).length()/c,u=Math.max(2,Math.round(c/T)),f=Math.max(2,Math.round(s/T)),h=Array(u).fill(0).map((function(){return Array(f).fill(0)}));i.normalize(),r.normalize(),n.normalize();var p=(new Me.Vector3).crossVectors(r,n).normalize(),y=i.multiplyScalar(.5*c/u),g=(new Me.Vector3).crossVectors(p,i).normalize().multiplyScalar(.5*s/f),m=new Me.Vector3(t.cx+e.x,t.cy+e.y,t.lz+e.z+xy);m.add(y).add(g),y.multiplyScalar(2),g.multiplyScalar(2);for(var x=0,R=new Me.Vector3,D=0;D<24;D++)for(var M=0;M0){x++;for(var F=zy(O,H,v,ny.SPHERE_MODEL),k=Ry(o.ground,P,p,F),Y=p.dot(O),L=0;L0&&(R.copy(m).add(U).add(g.clone().multiplyScalar(N)),j(I,R,O)||(h[L][N]+=Y*F))}}var V=x*b/60,J=V>At?w.sunshineHours[P]/(30*V*o.timesPerHour):0;E(h,J),d(I,h)}()}}catch(C){R.e(C)}finally{R.f()}}}},F=function(e){if(e.roofType!==It.Gambrel)throw new Error("roof is not gambrel");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=!0,r=l[0][0].z,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c,h=a.value,p=Object(f.a)(h);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(M){p.e(M)}finally{p.f()}}}catch(M){n.e(M)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),H=Tw.dayOfYear(x),z=new Me.Euler(0,0,t.rotation[2],"ZYX"),R=Object(f.a)(l.entries());try{var D=function(){var l=Object(u.a)(m.value,2),a=l[0],i=l[1],r=e.id+"-"+a,n=i[0].clone().applyEuler(z),c=i[1].clone().applyEuler(z),s=i[2].clone().applyEuler(z),f=(new Me.Vector3).subVectors(c,n),h=(new Me.Vector3).subVectors(s,n),p=(new Me.Vector3).subVectors(s,c),y=f.length(),g=(new Me.Vector3).crossVectors(h,p).length()/y,x=Math.max(2,Math.round(y/T)),R=Math.max(2,Math.round(g/T)),D=Array(x).fill(0).map((function(){return Array(R).fill(0)}));f.normalize(),h.normalize(),p.normalize();var M=(new Me.Vector3).crossVectors(h,p).normalize(),W=f.multiplyScalar(.5*y/x),I=(new Me.Vector3).crossVectors(M,f).normalize().multiplyScalar(.5*g/R),C=new Me.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+xy);C.add(W).add(I),W.multiplyScalar(2),I.multiplyScalar(2);for(var O=0,F=new Me.Vector3,k=0;k<24;k++)for(var Y=0;Y0){O++;for(var N=zy(U,H,v,ny.SPHERE_MODEL),V=Ry(o.ground,P,M,N),J=M.dot(U),G=0;G0&&(F.copy(C).add(X).add(I.clone().multiplyScalar(B)),j(r,F,U)||(D[G][B]+=J*N))}}var K=O*b/60,q=K>At?w.sunshineHours[P]/(30*K*o.timesPerHour):0;E(D,q),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(M){R.e(M)}finally{R.f()}}}},k=function(e){if(e.roofType!==It.Hip)throw new Error("roof is not hip");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=!0,r=l[0][0].z,n=Object(f.a)(l);try{for(n.s();!(a=n.n()).done;){var c,h=a.value,p=Object(f.a)(h);try{for(p.s();!(c=p.n()).done;){var g=c.value;if(Math.abs(g.z-r)>.01){i=!1;break}}}catch(M){p.e(M)}finally{p.f()}}}catch(M){n.e(M)}finally{n.f()}if(i)Y(e,t,l);else{var m,A=x.getFullYear(),P=x.getMonth(),S=x.getDate(),H=Tw.dayOfYear(x),z=new Me.Euler(0,0,t.rotation[2],"ZYX"),R=Object(f.a)(l.entries());try{var D=function(){var l=Object(u.a)(m.value,2),a=l[0],i=l[1],r=e.id+"-"+a,n=i[0].clone().applyEuler(z),c=i[1].clone().applyEuler(z),s=i[2].clone().applyEuler(z),f=(new Me.Vector3).subVectors(c,n),h=(new Me.Vector3).subVectors(s,n),p=(new Me.Vector3).subVectors(s,c),y=f.length(),g=(new Me.Vector3).crossVectors(h,p).length()/y,x=Math.max(2,Math.round(y/T)),R=Math.max(2,Math.round(g/T)),D=Array(x).fill(0).map((function(){return Array(R).fill(0)}));f.normalize(),h.normalize(),p.normalize();var M=(new Me.Vector3).crossVectors(h,p).normalize(),W=f.multiplyScalar(.5*y/x),I=(new Me.Vector3).crossVectors(M,f).normalize().multiplyScalar(.5*g/R),C=0,O=new Me.Vector3,F=new Me.Vector3(t.cx+n.x,t.cy+n.y,t.lz+n.z+xy);if(F.add(W).add(I),W.multiplyScalar(2),I.multiplyScalar(2),a%2===0)for(var k=0;k<24;k++)for(var Y=0;Y0){C++;for(var N=zy(U,H,v,ny.SPHERE_MODEL),V=Ry(o.ground,P,M,N),J=M.dot(U),G=0;G0&&(O.copy(F).add(X).add(I.clone().multiplyScalar(B)),j(r,O,U)||(D[G][B]+=J*N))}}else for(var K=0;K<24;K++)for(var q=0;q0){C++;for(var _=zy(Z,H,v,ny.SPHERE_MODEL),$=Ry(o.ground,P,M,_),ee=M.dot(Z),te=0;te0&&(O.copy(F).add(le).add(I.clone().multiplyScalar(ae)),j(r,O,Z)||(D[te][ae]+=ee*_))}}var oe=C*b/60,ie=oe>At?w.sunshineHours[P]/(30*oe*o.timesPerHour):0;E(D,ie),d(r,D)};for(R.s();!(m=R.n()).done;)D()}catch(M){R.e(M)}finally{R.f()}}}},Y=function(e,t,l){var a,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),c=Tw.dayOfYear(x),s=new Me.Euler(0,0,t.rotation[2],"ZYX"),u=l[0][0].z,h=Number.MAX_VALUE,p=Number.MAX_VALUE,y=-Number.MAX_VALUE,g=-Number.MAX_VALUE,m=Object(f.a)(l);try{for(m.s();!(a=m.n()).done;){var A,P=a.value,S=Object(f.a)(P);try{for(S.s();!(A=S.n()).done;){var H=A.value.clone().applyEuler(s);H.x>y&&(y=H.x),H.xg&&(g=H.y),H.y0){C++;for(var U=zy(L,c,v,ny.SPHERE_MODEL),N=Ry(o.ground,r,Rt,U),V=Rt.dot(L),J=0;J0&&(O.y=I.y+G*M,j(e.id,O,L)||(W[J][G]+=V*U))}}}var X=C*b/60,B=X>At?w.sunshineHours[r]/(30*X*o.timesPerHour):0;E(W,B),d(e.id,W)},L=function(e){if(e.roofType!==It.Gable)throw new Error("roof is not gable");var t=s(e);if(!t)throw new Error("foundation of wall not found");var l=y(e.id);if(l&&0!==l.length){var a,i=x.getFullYear(),r=x.getMonth(),n=x.getDate(),c=Tw.dayOfYear(x),h=new Me.Euler(0,0,t.rotation[2],"ZYX"),p=Object(f.a)(l.entries());try{var g=function(){var l=Object(u.a)(a.value,2),s=l[0],f=l[1],p=e.id+"-"+s,y=f[0].clone().applyEuler(h),g=f[1].clone().applyEuler(h),m=f[2].clone().applyEuler(h),x=(new Me.Vector3).subVectors(g,y),A=(new Me.Vector3).subVectors(m,y),P=(new Me.Vector3).subVectors(m,g),S=x.length(),H=(new Me.Vector3).crossVectors(A,P).length()/S,z=Math.max(2,Math.round(S/T)),R=Math.max(2,Math.round(H/T)),D=Array(z).fill(0).map((function(){return Array(R).fill(0)}));x.normalize(),A.normalize(),P.normalize();var M=(new Me.Vector3).crossVectors(A,P).normalize(),W=x.multiplyScalar(.5*S/z),I=(new Me.Vector3).crossVectors(M,x).normalize().multiplyScalar(.5*H/R),C=new Me.Vector3(t.cx+y.x,t.cy+y.y,t.lz+y.z+xy);C.add(W).add(I),W.multiplyScalar(2),I.multiplyScalar(2);for(var O=0,F=new Me.Vector3,k=0;k<24;k++)for(var Y=0;Y0){O++;for(var N=zy(U,c,v,ny.SPHERE_MODEL),V=Ry(o.ground,r,M,N),J=M.dot(U),G=0;G0&&(F.copy(C).add(X).add(I.clone().multiplyScalar(B)),j(p,F,U)||(D[G][B]+=J*N))}}var K=O*b/60,q=K>At?w.sunshineHours[r]/(30*K*o.timesPerHour):0;E(D,q),d(p,D)};for(p.s();!(a=p.n()).done;)g()}catch(m){p.e(m)}finally{p.f()}}},E=function(e,t){for(var l=0;l=Y.sunset)return cancelAnimationFrame(W.current),Tf.setState((function(e){e.runDynamicSimulation=!1})),a((function(e){e.world.date=C.current.toLocaleString("en-US")})),Kh(me.t("message.SimulationCompleted",T)),I.current=!0,function(){m();var e,t=Y.daylight()/60,l=t>At?P.sunshineHours[S.getMonth()]/(30*t*c.timesPerHour):0,a=Object(f.a)(s);try{for(a.s();!(e=a.n()).done;){var o=e.value;switch(o.type){case V.Foundation:case V.Wall:case V.Door:case V.SolarPanel:case V.ParabolicTrough:case V.ParabolicDish:case V.FresnelReflector:case V.Heliostat:var i=O.current.get(o.id);if(i){for(var r=0;r0){if(d.roofType===It.Pyramid||d.roofType===It.Mansard||d.roofType===It.Gambrel||d.roofType===It.Hip){var p,y=!0,w=u[0][0].z,x=Object(f.a)(u);try{for(x.s();!(p=x.n()).done;){var v,A=p.value,T=Object(f.a)(A);try{for(T.s();!(v=T.n()).done;){var j=v.value;if(Math.abs(j.z-w)>.01){y=!1;break}}}catch(J){T.e(J)}finally{T.f()}}}catch(J){x.e(J)}finally{x.f()}if(y){var H=O.current.get(d.id);if(H){for(var z=0;z1){M.current.length=0,z.set(t,l);var a=D.current.filter((function(t){return t.uuid!==e}));return z.intersectObjects(a,!1,M.current),M.current.length>0}return!1},J=function(){var e=A.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;D.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,D.current)}}catch(i){a.e(i)}finally{a.f()}}},X=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=Tw.dayOfYear(S),a=e.lx,o=e.ly,i=e.lz,r=Math.max(2,Math.round(a/R)),n=Math.max(2,Math.round(o/R)),s=Math.max(2,Math.round(i/R)),d=a/r,u=o/n,f=i/s,h=O.current.get(e.id+"-top");h&&h.length===r&&h[0].length===n||(h=Array(r).fill(0).map((function(){return Array(n).fill(0)})),O.current.set(e.id+"-top",h));var y=O.current.get(e.id+"-south");y&&y.length===r&&y[0].length===s||(y=Array(r).fill(0).map((function(){return Array(s).fill(0)})),O.current.set(e.id+"-south",y));var g=O.current.get(e.id+"-north");g&&g.length===r&&g[0].length===s||(g=Array(r).fill(0).map((function(){return Array(s).fill(0)})),O.current.set(e.id+"-north",g));var m=O.current.get(e.id+"-west");m&&m.length===n&&m[0].length===s||(m=Array(n).fill(0).map((function(){return Array(s).fill(0)})),O.current.set(e.id+"-west",m));var w=O.current.get(e.id+"-east");w&&w.length===n&&w[0].length===s||(w=Array(n).fill(0).map((function(){return Array(s).fill(0)})),O.current.set(e.id+"-east",w));var x=Rt,v=zt.clone().applyAxisAngle(Rt,e.rotation[2]),b=Ht.clone().applyAxisAngle(Rt,e.rotation[2]),A=jt.clone().applyAxisAngle(Rt,e.rotation[2]),T=St.clone().applyAxisAngle(Rt,e.rotation[2]),P=p(e),H=e.cx,z=e.cy,D=e.cz;if(P&&P.type===V.Cuboid){var M=Tw.getWorldDataById(e.id);H=M.pos.x,z=M.pos.y,D=M.pos.z}for(var W=new Me.Vector3,I=new Me.Vector2(H,z),C=new Me.Vector2,F=z-o/2,k=z+o/2,Y=H-a/2,L=H+a/2,E=zy(t,l,j,ny.SPHERE_MODEL),U=Ry(c.ground,S.getMonth(),x,E),J=x.dot(t),G=H-a/2,X=z-o/2,B=D+i/2,K=0;K0&&(C.set(G+(K+.5)*d,X+(q+.5)*u),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,B),N(e.id,W,t)||(h[K][q]+=J*E));G=H-a/2,X=D-i/2,U=Ry(c.ground,S.getMonth(),v,E),J=v.dot(t);for(var Q=0;Q0&&(C.set(G+(Q+.5)*d,F),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,X+(Z+.5)*f),N(e.id,W,t)||(y[Q][Z]+=J*E));U=Ry(c.ground,S.getMonth(),b,E),J=b.dot(t);for(var _=0;_0&&(C.set(G+(_+.5)*d,k),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,X+(s-($+.5))*f),N(e.id,W,t)||(g[_][$]+=J*E));G=z-o/2,X=D-i/2,U=Ry(c.ground,S.getMonth(),A,E),J=A.dot(t);for(var ee=0;ee0&&(C.set(Y,G+(ee+.5)*u),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,X+(te+.5)*f),N(e.id,W,t)||(m[ee][te]+=J*E));U=Ry(c.ground,S.getMonth(),T,E),J=T.dot(t);for(var le=0;le0&&(C.set(L,G+(le+.5)*u),C.rotateAround(I,e.rotation[2]),W.set(C.x,C.y,X+(ae+.5)*f),N(e.id,W,t)||(w[le][ae]+=J*E))}},B=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=Tw.dayOfYear(S),a=e.lx,o=e.ly,i=e.lz,r=Math.max(2,Math.round(a/R)),n=Math.max(2,Math.round(o/R)),s=a/r,d=o/n,u=e.cx-a/2,f=e.cy-o/2,h=new Me.Vector2(e.cx,e.cy),p=new Me.Vector3,y=O.current.get(e.id);y&&y.length===r&&y[0].length===n||(y=Array(r).fill(0).map((function(){return Array(n).fill(0)})),O.current.set(e.id,y));for(var g=zy(t,l,j,ny.SPHERE_MODEL),m=Ry(c.ground,S.getMonth(),Rt,g),w=Rt.dot(t),x=new Me.Vector2,v=0;v0&&(x.set(u+(v+.5)*s,f+(b+.5)*d),x.rotateAround(h,e.rotation[2]),p.set(x.x,x.y,i),N(e.id,p,t)||(y[v][b]+=w*g))}},K=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=Tw.dayOfYear(S),o=e.lx,i=Tw.getHighestPointOfWall(e),r=Math.max(2,Math.round(o/R)),n=Math.max(2,Math.round(i/R)),s=o/r,d=i/n,u=l.rotation[2]+e.relativeAngle,f=Tw.wallAbsolutePosition(new Me.Vector3(e.cx,e.cy,e.cz),l).setZ(i/2+l.lz),h=new Me.Vector3(Math.cos(u-vt),Math.sin(u-vt),0),p=s*Math.cos(u),g=s*Math.sin(u),m=new Me.Vector3,w=O.current.get(e.id);w&&w.length===r&&w[0].length===n||(w=Array(r).fill(0).map((function(){return Array(n).fill(0)})),O.current.set(e.id,w));for(var x=Tw.getWallVertices(e,1),v=(i-e.lz)/2,b=zy(t,a,j,ny.SPHERE_MODEL),A=Ry(c.ground,S.getMonth(),h,b),T=h.dot(t),P=0;P0&&(m.set(f.x+z*p,f.y+z*g,f.z+D*d),N(e.id,m,t)||(w[P][H]+=T*b)))}}},q=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of door not found");var a=p(e);if(!a)throw new Error("parent of door not found");var o=Tw.dayOfYear(S),i=a,r=e.lx*i.lx,n=e.lz*i.lz,s=Math.max(2,Math.round(r/R)),d=Math.max(2,Math.round(n/R)),u=r/s,f=n/d,h=l.rotation[2]+i.relativeAngle,g=Tw.wallAbsolutePosition(new Me.Vector3(i.cx,i.cy,i.cz),l).setZ(i.lz/2+l.lz).clone().add(new Me.Vector3(e.cx*i.lx,0,e.cz*i.lz)),m=new Me.Vector3(Math.cos(h-vt),Math.sin(h-vt),0),w=u*Math.cos(h),x=u*Math.sin(h),v=new Me.Vector3,b=O.current.get(e.id);b&&b.length===s&&b[0].length===d||(b=Array(s).fill(0).map((function(){return Array(d).fill(0)})),O.current.set(e.id,b));var A=zy(t,o,j,ny.SPHERE_MODEL),T=Ry(c.ground,S.getMonth(),m,A),P=m.dot(t);if(e.doorType===hy.Arched)for(var H=0;H0&&(N(e.id,v,t)||(b[H][z]+=P*A)))}else for(var W=0;W0){var C=W-s/2+.5,F=I-d/2+.5;v.set(g.x+C*w,g.y+C*x,g.z+F*f),N(e.id,v,t)||(b[W][I]+=P*A)}}},Q=function(e,t,l,a){var o,i=a[0][0].z,r=Tw.dayOfYear(S),n=zy(e,r,j,ny.SPHERE_MODEL),s=new Me.Euler(0,0,l.rotation[2],"ZYX"),d=Number.MAX_VALUE,u=Number.MAX_VALUE,h=-Number.MAX_VALUE,p=-Number.MAX_VALUE,y=Object(f.a)(a);try{for(y.s();!(o=y.n()).done;){var g,m=o.value,w=Object(f.a)(m);try{for(w.s();!(g=w.n()).done;){var x=g.value.clone().applyEuler(s);x.x>h&&(h=x.x),x.xp&&(p=x.y),x.y0&&(z.y=H.y+I*T,N(t.id,z,e)||(P[W][I]+=M*n))}},Z=function(e){if(e.roofType!==It.Pyramid)throw new Error("roof is not pyramid");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=!0,r=a[0][0].z,n=Object(f.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,h=Object(f.a)(d);try{for(h.s();!(s=h.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){h.e(T)}finally{h.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Tw.dayOfYear(S),w=new Me.Euler(0,0,l.rotation[2],"ZYX"),x=zy(t,m,j,ny.SPHERE_MODEL),v=Object(f.a)(a.entries());try{var A=function(){var a=Object(u.a)(g.value,2),o=a[0],i=a[1],r=e.id+"-"+o,n=i[0].clone().applyEuler(w),s=i[1].clone().applyEuler(w),d=i[2].clone().applyEuler(w),f=(new Me.Vector3).subVectors(s,n),h=(new Me.Vector3).subVectors(d,n),p=(new Me.Vector3).subVectors(d,s),y=f.length(),m=(new Me.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=O.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),O.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new Me.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),j=(new Me.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),H=new Me.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+xy);H.add(P).add(j),P.multiplyScalar(2),j.multiplyScalar(2);for(var z=new Me.Vector3,D=Ry(c.ground,S.getMonth(),T,x),M=T.dot(t),W=0;W0&&(z.copy(H).add(I).add(j.clone().multiplyScalar(C)),N(r,z,t)||(A[W][C]+=M*x))};for(v.s();!(g=v.n()).done;)A()}catch(T){v.e(T)}finally{v.f()}}}}},_=function(e){if(e.roofType!==It.Mansard)throw new Error("roof is not mansard");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=!0,r=a[0][0].z,n=Object(f.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,h=Object(f.a)(d);try{for(h.s();!(s=h.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(z){h.e(z)}finally{h.f()}}}catch(z){n.e(z)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Tw.dayOfYear(S),w=new Me.Euler(0,0,l.rotation[2],"ZYX"),x=zy(t,m,j,ny.SPHERE_MODEL),v=Object(f.a)(a.entries());try{for(v.s();!(g=v.n()).done;){var A=Object(u.a)(g.value,2),T=A[0],P=A[1],H=e.id+"-"+T;T===a.length-1?function(){var e,a=Number.MAX_VALUE,o=Number.MAX_VALUE,i=-Number.MAX_VALUE,r=-Number.MAX_VALUE,n=Object(f.a)(P);try{for(n.s();!(e=n.n()).done;){var s=e.value.clone().applyEuler(w);s.x>i&&(i=s.x),s.xr&&(r=s.y),s.y0&&(v.y=m.y+j*y,N(H,v,t)||(g[T][j]+=A*x))}}():function(){var e=P[0].clone().applyEuler(w),a=P[1].clone().applyEuler(w),o=P[2].clone().applyEuler(w),i=(new Me.Vector3).subVectors(a,e),r=(new Me.Vector3).subVectors(o,e),n=(new Me.Vector3).subVectors(o,a),s=i.length(),d=(new Me.Vector3).crossVectors(r,n).length()/s,u=Math.max(2,Math.round(s/R)),f=Math.max(2,Math.round(d/R)),h=O.current.get(H);h&&h.length===u&&h[0].length===f||(h=Array(u).fill(0).map((function(){return Array(f).fill(0)})),O.current.set(H,h)),i.normalize(),r.normalize(),n.normalize();var p=(new Me.Vector3).crossVectors(r,n).normalize(),y=i.multiplyScalar(.5*s/u),g=(new Me.Vector3).crossVectors(p,i).normalize().multiplyScalar(.5*d/f),m=new Me.Vector3(l.cx+e.x,l.cy+e.y,l.lz+e.z+xy);m.add(y).add(g),y.multiplyScalar(2),g.multiplyScalar(2);for(var v=new Me.Vector3,b=Ry(c.ground,S.getMonth(),p,x),A=p.dot(t),T=0;T0&&(v.copy(m).add(j).add(g.clone().multiplyScalar(z)),N(H,v,t)||(h[T][z]+=A*x))}()}}catch(z){v.e(z)}finally{v.f()}}}}},$=function(e){if(e.roofType!==It.Gambrel)throw new Error("roof is not gambrel");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=!0,r=a[0][0].z,n=Object(f.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,h=Object(f.a)(d);try{for(h.s();!(s=h.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){h.e(T)}finally{h.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Tw.dayOfYear(S),w=new Me.Euler(0,0,l.rotation[2],"ZYX"),x=zy(t,m,j,ny.SPHERE_MODEL),v=Object(f.a)(a.entries());try{var A=function(){var a=Object(u.a)(g.value,2),o=a[0],i=a[1],r=e.id+"-"+o,n=i[0].clone().applyEuler(w),s=i[1].clone().applyEuler(w),d=i[2].clone().applyEuler(w),f=(new Me.Vector3).subVectors(s,n),h=(new Me.Vector3).subVectors(d,n),p=(new Me.Vector3).subVectors(d,s),y=f.length(),m=(new Me.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=O.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),O.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new Me.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),j=(new Me.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),H=new Me.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+xy);H.add(P).add(j),P.multiplyScalar(2),j.multiplyScalar(2);for(var z=new Me.Vector3,D=Ry(c.ground,S.getMonth(),T,x),M=T.dot(t),W=0;W0&&(z.copy(H).add(I).add(j.clone().multiplyScalar(C)),N(r,z,t)||(A[W][C]+=M*x))};for(v.s();!(g=v.n()).done;)A()}catch(T){v.e(T)}finally{v.f()}}}}},ee=function(e){if(e.roofType!==It.Hip)throw new Error("roof is not hip");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=!0,r=a[0][0].z,n=Object(f.a)(a);try{for(n.s();!(o=n.n()).done;){var s,d=o.value,h=Object(f.a)(d);try{for(h.s();!(s=h.n()).done;){var p=s.value;if(Math.abs(p.z-r)>.01){i=!1;break}}}catch(T){h.e(T)}finally{h.f()}}}catch(T){n.e(T)}finally{n.f()}if(i)Q(t,e,l,a);else{var g,m=Tw.dayOfYear(S),w=new Me.Euler(0,0,l.rotation[2],"ZYX"),x=zy(t,m,j,ny.SPHERE_MODEL),v=Object(f.a)(a.entries());try{var A=function(){var a=Object(u.a)(g.value,2),o=a[0],i=a[1],r=e.id+"-"+o,n=i[0].clone().applyEuler(w),s=i[1].clone().applyEuler(w),d=i[2].clone().applyEuler(w),f=(new Me.Vector3).subVectors(s,n),h=(new Me.Vector3).subVectors(d,n),p=(new Me.Vector3).subVectors(d,s),y=f.length(),m=(new Me.Vector3).crossVectors(h,p).length()/y,v=Math.max(2,Math.round(y/R)),b=Math.max(2,Math.round(m/R)),A=O.current.get(r);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),O.current.set(r,A)),f.normalize(),h.normalize(),p.normalize();var T=(new Me.Vector3).crossVectors(h,p).normalize(),P=f.multiplyScalar(.5*y/v),j=(new Me.Vector3).crossVectors(T,f).normalize().multiplyScalar(.5*m/b),H=new Me.Vector3,z=new Me.Vector3(l.cx+n.x,l.cy+n.y,l.lz+n.z+xy);z.add(P).add(j),P.multiplyScalar(2),j.multiplyScalar(2);for(var D=Ry(c.ground,S.getMonth(),T,x),M=T.dot(t),W=0;W0&&(H.copy(z).add(I).add(j.clone().multiplyScalar(C)),N(r,H,t)||(A[W][C]+=M*x))};for(v.s();!(g=v.n()).done;)A()}catch(T){v.e(T)}finally{v.f()}}}}},le=function(e){if(e.roofType!==It.Gable)throw new Error("roof is not gable");var t=jy(S,c.latitude);if(!(t.z<=0)){var l=y(e);if(!l)throw new Error("foundation of wall not found");var a=b(e.id);if(a&&0!==a.length){var o,i=Tw.dayOfYear(S),r=new Me.Euler(0,0,l.rotation[2],"ZYX"),n=zy(t,i,j,ny.SPHERE_MODEL),s=Object(f.a)(a.entries());try{var d=function(){var a=Object(u.a)(o.value,2),i=a[0],s=a[1],d=e.id+"-"+i,f=s[0].clone().applyEuler(r),h=s[1].clone().applyEuler(r),p=s[2].clone().applyEuler(r),y=(new Me.Vector3).subVectors(h,f),g=(new Me.Vector3).subVectors(p,f),m=(new Me.Vector3).subVectors(p,h),w=y.length(),x=(new Me.Vector3).crossVectors(g,m).length()/w,v=Math.max(2,Math.round(w/R)),b=Math.max(2,Math.round(x/R)),A=O.current.get(d);A&&A.length===v&&A[0].length===b||(A=Array(v).fill(0).map((function(){return Array(b).fill(0)})),O.current.set(d,A)),y.normalize(),g.normalize(),m.normalize();var T=(new Me.Vector3).crossVectors(g,m).normalize(),P=y.multiplyScalar(.5*w/v),j=(new Me.Vector3).crossVectors(T,y).normalize().multiplyScalar(.5*x/b),H=new Me.Vector3(l.cx+f.x,l.cy+f.y,l.lz+f.z+xy);H.add(P).add(j),P.multiplyScalar(2),j.multiplyScalar(2);for(var z=new Me.Vector3,D=Ry(c.ground,S.getMonth(),T,n),M=T.dot(t),W=0;W0&&(z.copy(H).add(I).add(j.clone().multiplyScalar(C)),N(d,z,t)||(A[W][C]+=M*n))};for(s.s();!(o=s.n()).done;)d()}catch(h){s.e(h)}finally{s.f()}}}},ae=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=p(e);if(!l)throw new Error("parent of solar panel does not exist");var a=e.parentType===V.Roof,o=e.parentType===V.Wall;if(a&&!(l=y(l)))throw new Error("foundation of solar panel does not exist");var i=Tw.dayOfYear(S),r=o?Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l,y(e),e.lz):Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l),n=l.rotation[2],s=n+e.relativeAzimuth,d=e.tiltAngle,u=!0;if(a&&(r.z=e.cz+e.lz+.02+l.cz+l.lz/2,Tw.isZero(e.rotation[0])?r.z+=e.poleHeight:(d=e.rotation[0],s=n,u=!1)),o&&!Tw.isZero(e.tiltAngle)){var f=l,h=y(l),g=(h?h.rotation[2]+f.relativeAngle:f.relativeAngle)-vt,m=e.ly*Math.abs(Math.sin(e.tiltAngle))/2;r.x+=m*Math.cos(g),r.y+=m*Math.sin(g)}var w=(new Me.Vector3).fromArray(e.normal),x=e.lx,v=e.ly,b=Math.max(2,Math.round(e.lx/R)),A=Math.max(2,Math.round(e.ly/R)),T=x/b,P=v/A,H=r.x-(x-R)/2,z=r.y-(v-R)/2,D=a||o?r.z:l.lz+e.poleHeight+e.lz,M=new Me.Vector2(r.x,r.y),W=new Me.Vector3,I=O.current.get(e.id);I&&I.length===b&&I[0].length===A||(I=Array(b).fill(0).map((function(){return Array(A).fill(0)})),O.current.set(e.id,I));var C=new Me.Euler(a&&!u?0:d,0,s,"ZYX");if(e.trackerType!==te.NO_TRACKER){var F=n?t.clone().applyAxisAngle(Rt,-n):t.clone();switch(e.trackerType){case te.ALTAZIMUTH_DUAL_AXIS_TRACKER:var k=(new Me.Quaternion).setFromUnitVectors(Rt,F);(C=(new Me.Euler).setFromQuaternion(k)).z+=s;break;case te.HORIZONTAL_SINGLE_AXIS_TRACKER:var Y=(new Me.Quaternion).setFromUnitVectors(Rt,new Me.Vector3(F.x,0,F.z).normalize());(C=(new Me.Euler).setFromQuaternion(Y)).z+=s;break;case te.VERTICAL_SINGLE_AXIS_TRACKER:if(Math.abs(e.tiltAngle)>.001){var L=new Me.Vector3(F.x,-F.y,0).normalize(),E=Math.acos(Ht.dot(L))*Math.sign(L.x);C=new Me.Euler(e.tiltAngle,0,E+n,"ZYX")}break;case te.TILTED_SINGLE_AXIS_TRACKER:}}w.applyEuler(C),a&&!u&&(C.x=e.rotation[0],C.z=e.rotation[2]+n),o&&(C.x=vt+e.tiltAngle,C.z=l.relativeAngle+n);for(var U=zy(t,i,j,ny.SPHERE_MODEL),J=Ry(c.ground,S.getMonth(),w,U),G=w.dot(t),X=new Me.Vector2,B=new Me.Vector3,K=0;K0&&(X.set(H+K*T,z+q*P),B.set(X.x-M.x,X.y-M.y,0),B.applyEuler(C),W.set(r.x+B.x,r.y+B.y,D+B.z),N(e.id,W,t)||(I[K][q]+=G*U))}},oe=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=p(e);if(!l)throw new Error("parent of parabolic trough does not exist");var a=Tw.dayOfYear(S),o=Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l),i=(new Me.Vector3).fromArray(e.normal),r=i.clone(),n=e.lx,s=e.ly,d=n*n/(4*e.latusRectum),u=e.poleHeight+n/2,f=Math.max(2,Math.round(e.lx/R)),h=Math.max(2,Math.round(e.ly/R)),y=n/f,g=s/h,m=o.x-(n-R)/2,w=o.y-(s-R)/2,x=l.lz+u+e.lz+d,v=new Me.Vector2(o.x,o.y),b=new Me.Vector3,A=O.current.get(e.id);A&&A.length===f&&A[0].length===h||(A=Array(f).fill(0).map((function(){return Array(h).fill(0)})),O.current.set(e.id,A));var T=l.rotation[2],P=T+e.relativeAzimuth,H=Tw.isZero(P),z=H?1:Math.cos(P),D=H?0:Math.sin(P),M=T?t.clone().applyAxisAngle(Rt,-T):t.clone(),W=(new Me.Quaternion).setFromUnitVectors(Rt,new Me.Vector3(M.x*z,M.x*D,M.z).normalize()),I=(new Me.Euler).setFromQuaternion(W);i.copy(r.clone().applyEuler(I));for(var C=zy(t,a,j,ny.SPHERE_MODEL),F=Ry(c.ground,S.getMonth(),i,C),k=i.dot(t),Y=new Me.Vector2,L=new Me.Vector3,E=0,U=0,V=1,J=4/(e.latusRectum*e.latusRectum),G=0;G0&&(Y.set(E,w+X*g),H||Y.rotateAround(v,P),L.set(Y.x-v.x,Y.y-v.y,0),L.applyEuler(I),b.set(o.x+L.x,o.y+L.y,x+L.z),N(e.id,b,t)||(A[G][X]+=k*C*V))}}},ie=function(e){var t=jy(S,c.latitude);if(!(t.z<=0)){var l=p(e);if(!l)throw new Error("parent of parabolic dish does not exist");var a=Tw.dayOfYear(S),o=Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l),i=(new Me.Vector3).fromArray(e.normal),r=i.clone(),n=e.lx,s=e.ly,d=n*n/(4*e.latusRectum),u=e.poleHeight+n/2,f=Math.max(2,Math.round(e.lx/R)),h=Math.max(2,Math.round(e.ly/R)),y=n/f,g=s/h,m=o.x-(n-R)/2,w=o.y-(s-R)/2,x=l.lz+u+e.lz+d,v=new Me.Vector2(o.x,o.y),b=new Me.Vector3,A=O.current.get(e.id);A&&A.length===f&&A[0].length===h||(A=Array(f).fill(0).map((function(){return Array(h).fill(0)})),O.current.set(e.id,A));var T=l.rotation[2],P=T+e.relativeAzimuth,H=Tw.isZero(P),z=T?t.clone().applyAxisAngle(Rt,-T):t.clone(),D=(new Me.Quaternion).setFromUnitVectors(Rt,z),M=(new Me.Euler).setFromQuaternion(D);i.copy(r.clone().applyEuler(M));for(var W=zy(t,a,j,ny.SPHERE_MODEL),I=Ry(c.ground,S.getMonth(),i,W),C=i.dot(t),F=new Me.Vector2,k=new Me.Vector3,Y=0,L=0,E=0,U=0,V=1,J=4/(e.latusRectum*e.latusRectum),G=0;Gn/2))for(var X=0;Xs/2||(A[G][X]+=I,C>0&&(F.set(Y,L),H||F.rotateAround(v,P),k.set(F.x-v.x,F.y-v.y,0),k.applyEuler(M),b.set(o.x+k.x,o.y+k.y,x+k.z),N(e.id,b,t)||(V=1/Math.sqrt(1+(E*E+U*U)*J),A[G][X]+=C*W*V)))}},re=function(e){var t,l=jy(S,c.latitude);if(!(l.z0&&(B.set(q,b+Z*w),K.set(B.x-T.x,B.y-T.y,0),K.applyEuler(z),P.set(n.x+K.x,n.y+K.y,A+K.z),N(e.id,P,l)||N(e.id,P,D)||(H[Q][Z]+=X*U))}else for(var _=0;_0&&(B.set(q,b+$*w),K.set(B.x-T.x,B.y-T.y,0),K.applyEuler(z),P.set(n.x+K.x,n.y+K.y,A+K.z),N(e.id,P,l)||(H[_][$]+=X*U))}}}}},ne=function(e){var t,l=jy(S,c.latitude);if(!(l.z0&&(L.set(U,b+X*w),E.set(L.x-T.x,L.y-T.y,0),E.applyEuler(D),P.set(n.x+E.x,n.y+E.y,A+E.z),N(e.id,P,l)||N(e.id,P,z)||(H[J][X]+=Y*F))}else for(var B=0;B0&&(L.set(U,b+K*w),E.set(L.x-T.x,L.y-T.y,0),E.applyEuler(D),P.set(n.x+E.x,n.y+E.y,A+E.z),N(e.id,P,l)||(H[B][K]+=Y*F))}}}}},ce=function(e){var t=e.solarUpdraftTower;if(t){var l=jy(S,c.latitude);if(!(l.z<=0)){var a=Tw.dayOfYear(S),o=(new Me.Vector3).fromArray(e.normal),i=t.collectorRadius,r=Math.max(2,Math.round(2*i/R)),n=e.cx-i+R/2,s=e.cy-i+R/2,d=e.lz+t.collectorHeight,u=e.id+"-sut",f=O.current.get(u);f&&f.length===r&&f[0].length===r||(f=Array(r).fill(0).map((function(){return Array(r).fill(0)})),O.current.set(u,f));for(var h,p,y=zy(l,a,j,ny.SPHERE_MODEL),g=Ry(c.ground,S.getMonth(),o,y),m=new Me.Vector3(0,0,d),w=o.dot(l),x=i*i,v=0;vx||(f[v][b]+=g,w>0&&(N(u,m,l)||(f[v][b]+=w*y)))}}}};return Object(gf.jsx)(gf.Fragment,{})},Ok=n.a.memo(Ck),Fk=function(e){var t,l,a,i,n=e.city,c=Ew(si),s=Tf(yf),d=Ew(Gi),h=Ew(Vi),p=Ew.getState().world,y=Ew.getState().elements,g=Ew(Cs),m=Ew($r),w=Pf(yd),x=Ew(ec),v=Pf(wd),b=Ew(tc),A=Ew(pd),T=Ew(md),P=Pf(vd),S=Tf(sd),j=Tf(dd),H=Tf(ud),z=Tf(fd),R=Ew(o.showDailyParabolicTroughYieldPanel),D=Object(Se.f)().scene,M=Object(r.useMemo)((function(){return{lng:h}}),[h]),W=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===W||void 0===W?void 0:W.elevation:0,O=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,F=60/O,k=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/k,L=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),E=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,N=Object(r.useRef)([]),J=Object(r.useRef)([]),G=Object(r.useRef)(0),X=Object(r.useRef)(!1),B=Object(r.useRef)(new Date(p.date)),K=Object(r.useRef)(new Map),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(0),Z=Object(r.useRef)(!1),_=Object(r.useRef)(new Date(p.date)),$=Object(r.useMemo)((function(){return Ty(I,p.latitude)}),[p.date,p.latitude]),ee=Object(r.useRef)($),te=Tw.daysInYear(I)/12;Object(r.useEffect)((function(){if(S)return le(),G.current=requestAnimationFrame(ae),function(){cancelAnimationFrame(G.current),X.current||(Kh(me.t("message.SimulationAborted",M)),c((function(e){e.world.date=B.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),Z.current=!1}}),[S]),Object(r.useEffect)((function(){Z.current=H,H?(_.current=new Date(I.getTime()),cancelAnimationFrame(G.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(s("simulationPaused",!1),ae())}),[H]);var le=function(){Z.current?(I.setTime(_.current.getTime()),Z.current=!1):(B.current=new Date(p.date),I.setHours(Math.floor($.sunrise/60),F/2-30)),X.current=!1,ye(),ge()},ae=function e(){if(S&&!Z.current){if(I.getMinutes()+60*I.getHours()>=$.sunset)return cancelAnimationFrame(G.current),c((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showDailyParabolicTroughYieldPanel=!0,e.selectedFloatingWindow="dailyParabolicTroughYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForParabolicTroughs=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,oe(),void(d&&c((function(e){var t=Pf.getState().sumDailyParabolicTroughYield();e.actionInfo={name:"Daily Simulation for Parabolic Troughs Completed",result:{totalYield:t},details:Pf.getState().dailyParabolicTroughYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+F),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(f.a)(y);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.ParabolicTrough&&de(a)}}catch(o){l.e(o)}finally{l.f()}G.current=requestAnimationFrame(e)}},oe=function(){var e,t=ue(),l=Object(f.a)(y);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.ParabolicTrough){var o=a,i=K.current.get(o.id);if(i)for(var r=he(o)*t,n=0;n0&&(W.set(x+k*h,v+Y*y),c||W.rotateAround(A,n),O.set(W.x-A.x,W.y-A.y,0),O.applyEuler(R),T.set(o.x+O.x,o.y+O.y,b+O.z),pe(e.id,T,t)||(F+=M*D));var L=K.current.get(e.id);if(L)L[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=F/(u*f)}}},ue=function(){var e=$.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},fe=function(){var e=ee.current.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},he=function(e){return e.lx*e.ly*e.opticalEfficiency*e.thermalEfficiency*e.absorptance*e.reflectance*(1-E[I.getMonth()])},pe=function(e,t,l){if(N.current.length>1){J.current.length=0,L.set(t,l);var a=N.current.filter((function(t){return t.uuid!==e}));return L.intersectObjects(a,!1,J.current),J.current.length>0}return!1},ye=function(){var e=D.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;N.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,N.current)}}catch(i){a.e(i)}finally{a.f()}}},ge=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.ParabolicTrough){var a=K.current.get(l.id);a?a.fill(0):K.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},we=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.ParabolicTrough){var a=q.current.get(l.id);a&&a.length===k?a.fill(0):q.current.set(l.id,new Array(k).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(gf.jsx)(gf.Fragment,{})},kk=n.a.memo(Fk),Yk=function(e){var t,l,a,i,n=e.city,c=Ew(si),s=Tf(yf),d=Ew(Gi),h=Ew(Vi),p=Ew.getState().world,y=Ew.getState().elements,g=Ew(Cs),m=Ew($r),w=Pf(uu),x=Ew(ec),v=Pf(pu),b=Ew(tc),A=Ew(du),T=Ew(hu),P=Pf(gu),S=Tf(iu),j=Tf(ru),H=Tf(nu),z=Tf(cu),R=Ew(o.showDailyParabolicDishYieldPanel),D=Object(Se.f)().scene,M=Object(r.useMemo)((function(){return{lng:h}}),[h]),W=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===W||void 0===W?void 0:W.elevation:0,O=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,F=60/O,k=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/k,L=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),E=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,N=Object(r.useRef)([]),J=Object(r.useRef)([]),G=Object(r.useRef)(0),X=Object(r.useRef)(!1),B=Object(r.useRef)(new Date(p.date)),K=Object(r.useRef)(new Map),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(0),Z=Object(r.useRef)(!1),_=Object(r.useRef)(new Date(p.date)),$=Object(r.useMemo)((function(){return Ty(I,p.latitude)}),[p.date,p.latitude]),ee=Object(r.useRef)($),te=Tw.daysInYear(I)/12;Object(r.useEffect)((function(){if(S)return le(),G.current=requestAnimationFrame(ae),function(){cancelAnimationFrame(G.current),X.current||(Kh(me.t("message.SimulationAborted",M)),c((function(e){e.world.date=B.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),Z.current=!1}}),[S]),Object(r.useEffect)((function(){Z.current=H,H?(_.current=new Date(I.getTime()),cancelAnimationFrame(G.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(s("simulationPaused",!1),ae())}),[H]);var le=function(){Z.current?(I.setTime(_.current.getTime()),Z.current=!1):(B.current=new Date(p.date),I.setHours(Math.floor($.sunrise/60),F/2-30)),X.current=!1,ye(),ge()},ae=function e(){if(S&&!Z.current){if(I.getMinutes()+60*I.getHours()>=$.sunset)return cancelAnimationFrame(G.current),c((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showDailyParabolicDishYieldPanel=!0,e.selectedFloatingWindow="dailyParabolicDishYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForParabolicDishes=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),X.current=!0,oe(),void(d&&c((function(e){var t=Pf.getState().sumDailyParabolicDishYield();e.actionInfo={name:"Daily Simulation for Parabolic Dishes Completed",result:{totalYield:t},details:Pf.getState().dailyParabolicDishYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+F),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(f.a)(y);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.ParabolicDish&&de(a)}}catch(o){l.e(o)}finally{l.f()}G.current=requestAnimationFrame(e)}},oe=function(){var e,t=ue(),l=Object(f.a)(y);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.ParabolicDish){var o=a,i=K.current.get(o.id);if(i)for(var r=he(o)*t,n=0;n0&&(D.set(g+O*u,w+F*f),P||D.rotateAround(v,T),M.set(D.x-v.x,D.y-v.y,0),M.applyEuler(H),b.set(o.x+M.x,o.y+M.y,x+M.z),pe(e.id,b,t)||(W+=R*z));var k=K.current.get(e.id);if(k)k[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=W/(s*d)}}},ue=function(){var e=$.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},fe=function(){var e=ee.current.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},he=function(e){return e.lx*e.ly*e.opticalEfficiency*e.thermalEfficiency*e.absorptance*e.reflectance*(1-E[I.getMonth()])},pe=function(e,t,l){if(N.current.length>1){J.current.length=0,L.set(t,l);var a=N.current.filter((function(t){return t.uuid!==e}));return L.intersectObjects(a,!1,J.current),J.current.length>0}return!1},ye=function(){var e=D.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;N.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,N.current)}}catch(i){a.e(i)}finally{a.f()}}},ge=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.ParabolicDish){var a=K.current.get(l.id);a?a.fill(0):K.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},we=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.ParabolicDish){var a=q.current.get(l.id);a&&a.length===k?a.fill(0):q.current.set(l.id,new Array(k).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(gf.jsx)(gf.Fragment,{})},Lk=n.a.memo(Yk),Ek=function(e){var t,l,a,i,n=e.city,c=Ew(si),s=Tf(yf),d=Ew(Gi),h=Ew(Vi),p=Ew.getState().world,y=Ew.getState().elements,g=Ew(Cs),m=Ew($r),w=Pf(Hd),x=Ew(ec),v=Ew(jd),b=Pf(Dd),A=Ew(tc),T=Ew(Rd),P=Pf(Wd),S=Tf(bd),j=Tf(Ad),H=Tf(Td),z=Tf(Pd),R=Ew(o.showDailyFresnelReflectorYieldPanel),D=Object(Se.f)().scene,M=Object(r.useMemo)((function(){return{lng:h}}),[h]),W=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===W||void 0===W?void 0:W.elevation:0,O=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,F=60/O,k=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/k,L=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),E=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,N=Object(r.useRef)([]),J=Object(r.useRef)([]),X=Object(r.useRef)(0),B=Object(r.useRef)(!1),K=Object(r.useRef)(new Date(p.date)),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(new Map),Z=Object(r.useRef)(0),_=Object(r.useRef)(!1),$=Object(r.useRef)(new Date(p.date)),ee=Object(r.useMemo)((function(){return Ty(I,p.latitude)}),[p.date,p.latitude]),te=Object(r.useRef)(ee),le=Tw.daysInYear(I)/12;Object(r.useEffect)((function(){if(S)return ae(),X.current=requestAnimationFrame(oe),function(){cancelAnimationFrame(X.current),B.current||(Kh(me.t("message.SimulationAborted",M)),c((function(e){e.world.date=K.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),_.current=!1}}),[S]),Object(r.useEffect)((function(){_.current=H,H?($.current=new Date(I.getTime()),cancelAnimationFrame(X.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(s("simulationPaused",!1),oe())}),[H]);var ae=function(){_.current?(I.setTime($.current.getTime()),_.current=!1):(K.current=new Date(p.date),I.setHours(Math.floor(ee.sunrise/60),F/2-30)),B.current=!1,ge(),we()},oe=function e(){if(S&&!_.current){if(I.getMinutes()+60*I.getHours()>=ee.sunset)return cancelAnimationFrame(X.current),c((function(e){e.world.date=K.current.toLocaleString("en-US"),e.viewState.showDailyFresnelReflectorYieldPanel=!0,e.selectedFloatingWindow="dailyFresnelReflectorYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForFresnelReflectors=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),B.current=!0,ie(),void(d&&c((function(e){var t=Pf.getState().sumDailyFresnelReflectorYield();e.actionInfo={name:"Daily Simulation for Fresnel Reflectors Completed",result:{totalYield:t},details:Pf.getState().dailyFresnelReflectorYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+F),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(f.a)(y);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.FresnelReflector&&ue(a)}}catch(o){l.e(o)}finally{l.f()}X.current=requestAnimationFrame(e)}},ie=function(){var e,t=fe(),l=Object(f.a)(y);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.FresnelReflector){var o=a,i=q.current.get(o.id);if(i)for(var r=pe(o)*t,n=0;n0&&(L.set(J,A+B*v),E.set(L.x-P.x,L.y-P.y,0),E.applyEuler(r),S.set(s.x+E.x,s.y+E.y,T+E.z),ye(e.id,S,l)||ye(e.id,S,n)||(N+=Y*k))}var K=q.current.get(e.id);if(K)K[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=N/(g*w)}}}},fe=function(){var e=ee.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},he=function(){var e=te.current.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},pe=function(e){var t=m(e);if(!t)throw new Error("parent of Fresnel reflector does not exist");var l=1;if(t.type===V.Foundation){var a,o,i,r=t.solarAbsorberPipe;l*=(null!==(a=null===r||void 0===r?void 0:r.absorberOpticalEfficiency)&&void 0!==a?a:.7)*(null!==(o=null===r||void 0===r?void 0:r.absorberThermalEfficiency)&&void 0!==o?o:.3)*(null!==(i=null===r||void 0===r?void 0:r.absorberAbsorptance)&&void 0!==i?i:.95)}return e.lx*e.ly*e.reflectance*l*(1-E[I.getMonth()])},ye=function(e,t,l){if(N.current.length>1){J.current.length=0,L.set(t,l);var a=N.current.filter((function(t){return t.uuid!==e}));return L.intersectObjects(a,!1,J.current),J.current.length>0}return!1},ge=function(){var e=D.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;N.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,N.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.FresnelReflector){var a=q.current.get(l.id);a?a.fill(0):q.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},xe=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.FresnelReflector){var a=Q.current.get(l.id);a&&a.length===k?a.fill(0):Q.current.set(l.id,new Array(k).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(gf.jsx)(gf.Fragment,{})},Uk=n.a.memo(Ek),Nk=function(e){var t,l,a,i,n=e.city,c=Ew(si),s=Tf(yf),d=Ew(Gi),h=Ew(Vi),p=Ew.getState().world,y=Ew.getState().elements,g=Ew(Cs),m=Ew($r),w=Pf(Ld),x=Ew(ec),v=Ew(Yd),b=Pf(Nd),A=Ew(tc),T=Ew(Ud),P=Pf(Jd),S=Tf(Id),j=Tf(Cd),H=Tf(Od),z=Tf(Fd),R=Ew(o.showDailyHeliostatYieldPanel),D=Object(Se.f)().scene,M=Object(r.useMemo)((function(){return{lng:h}}),[h]),W=Object(r.useMemo)((function(){return g(null!==n&&void 0!==n?n:"Boston MA, USA")}),[n]),I=new Date(p.date),C=n?null===W||void 0===W?void 0:W.elevation:0,O=null!==(t=p.cspTimesPerHour)&&void 0!==t?t:4,F=60/O,k=null!==(l=p.cspDaysPerYear)&&void 0!==l?l:6,Y=12/k,L=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),E=null!==(a=p.monthlyIrradianceLosses)&&void 0!==a?a:new Array(12).fill(.05),U=null!==(i=p.cspGridCellSize)&&void 0!==i?i:.5,N=Object(r.useRef)([]),J=Object(r.useRef)([]),X=Object(r.useRef)(0),B=Object(r.useRef)(!1),K=Object(r.useRef)(new Date(p.date)),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(new Map),Z=Object(r.useRef)(0),_=Object(r.useRef)(!1),$=Object(r.useRef)(new Date(p.date)),ee=Object(r.useMemo)((function(){return Ty(I,p.latitude)}),[p.date,p.latitude]),te=Object(r.useRef)(ee),le=Tw.daysInYear(I)/12;Object(r.useEffect)((function(){if(S)return ae(),X.current=requestAnimationFrame(oe),function(){cancelAnimationFrame(X.current),B.current||(Kh(me.t("message.SimulationAborted",M)),c((function(e){e.world.date=K.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),_.current=!1}}),[S]),Object(r.useEffect)((function(){_.current=H,H?($.current=new Date(I.getTime()),cancelAnimationFrame(X.current),s("simulationPaused",!0),Kh(me.t("message.SimulationPaused",M))):(s("simulationPaused",!1),oe())}),[H]);var ae=function(){_.current?(I.setTime($.current.getTime()),_.current=!1):(K.current=new Date(p.date),I.setHours(Math.floor(ee.sunrise/60),F/2-30)),B.current=!1,ge(),we()},oe=function e(){if(S&&!_.current){if(I.getMinutes()+60*I.getHours()>=ee.sunset)return cancelAnimationFrame(X.current),c((function(e){e.world.date=K.current.toLocaleString("en-US"),e.viewState.showDailyHeliostatYieldPanel=!0,e.selectedFloatingWindow="dailyHeliostatYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForHeliostats=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",M)),B.current=!0,ie(),void(d&&c((function(e){var t=Pf.getState().sumDailyHeliostatYield();e.actionInfo={name:"Daily Simulation for Heliostats Completed",result:{totalYield:t},details:Pf.getState().dailyHeliostatYield,timestamp:(new Date).getTime()}})));I.setHours(I.getHours(),I.getMinutes()+F),c((function(e){e.world.date=I.toLocaleString("en-US")}));var t,l=Object(f.a)(y);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.Heliostat&&ue(a)}}catch(o){l.e(o)}finally{l.f()}X.current=requestAnimationFrame(e)}},ie=function(){var e,t=fe(),l=Object(f.a)(y);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Heliostat){var o=a,i=q.current.get(o.id);if(i)for(var r=pe(o)*t,n=0;n0&&(W.set(k,A+L*v),O.set(W.x-P.x,W.y-P.y,0),O.applyEuler(n),S.set(s.x+O.x,s.y+O.y,T+O.z),ye(e.id,S,l)||ye(e.id,S,r)||(F+=M*D))}var E=q.current.get(e.id);if(E)E[I.getMinutes()>=30?I.getHours()+1===24?0:I.getHours()+1:I.getHours()]+=F/(g*w)}}}},fe=function(){var e=ee.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},he=function(){var e=te.current.daylight()/60;return e>At?W.sunshineHours[I.getMonth()]/(30*e*O):0},pe=function(e){var t=m(e);if(!t)throw new Error("parent of heliostat does not exist");var l=1;if(t.type===V.Foundation){var a,o,i,r=t.solarPowerTower;l*=(null!==(a=null===r||void 0===r?void 0:r.receiverOpticalEfficiency)&&void 0!==a?a:.7)*(null!==(o=null===r||void 0===r?void 0:r.receiverThermalEfficiency)&&void 0!==o?o:.3)*(null!==(i=null===r||void 0===r?void 0:r.receiverAbsorptance)&&void 0!==i?i:.95)}return e.lx*e.ly*e.reflectance*l*(1-E[I.getMonth()])},ye=function(e,t,l){if(N.current.length>1){J.current.length=0,L.set(t,l);var a=N.current.filter((function(t){return t.uuid!==e}));return L.intersectObjects(a,!1,J.current),J.current.length>0}return!1},ge=function(){var e=D.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;N.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,N.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Heliostat){var a=q.current.get(l.id);a?a.fill(0):q.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},xe=function(){var e,t=Object(f.a)(y);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Heliostat){var a=Q.current.get(l.id);a&&a.length===k?a.fill(0):Q.current.set(l.id,new Array(k).fill(0))}}}catch(o){t.e(o)}finally{t.f()}};return Object(gf.jsx)(gf.Fragment,{})},Vk=n.a.memo(Nk),Jk=function(e){var t,l,a,n,c,s=e.city,d=Ew(si),h=Tf(yf),p=Ew(Gi),y=Ew(Vi),g=Ew.getState().world,m=Ew.getState().elements,w=Ew(Cs),x=Pf(ou),v=Pf(_d),b=Pf($d),A=Pf(lu),T=Tf(Gd),P=Tf(Bd),S=Tf(Xd),j=Tf(Kd),H=Ew(o.showDailyUpdraftTowerYieldPanel),z=Ew(i.noAnimationForSolarUpdraftTowerSimulation),R=null!==(t=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,D=null!==(l=g.sutGridCellSize)&&void 0!==l?l:1,M=Object(Se.f)().scene,W=Object(r.useMemo)((function(){return{lng:y}}),[y]),I=Object(r.useMemo)((function(){return w(null!==s&&void 0!==s?s:"Boston MA, USA")}),[s]),C=new Date(g.date),O=s?null===(a=w(s))||void 0===a?void 0:a.elevation:0,F=null!==(n=g.sutTimesPerHour)&&void 0!==n?n:4,k=60/F,Y=null!==(c=g.sutDaysPerYear)&&void 0!==c?c:6,L=12/Y,E=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),U=Object(r.useRef)([]),N=Object(r.useRef)([]),J=Object(r.useRef)(0),X=Object(r.useRef)(!1),B=Object(r.useRef)(new Date(g.date)),K=Object(r.useRef)(new Array(24).fill(0)),q=Object(r.useRef)(new Map),Q=Object(r.useRef)(new Map),Z=Object(r.useRef)(new Map),_=Object(r.useRef)(new Map),$=Object(r.useRef)(0),ee=Object(r.useRef)(!1),te=Object(r.useRef)(new Date(g.date)),le=Object(r.useRef)(0),ae=Object(r.useMemo)((function(){return Ty(C,g.latitude)}),[g.date,g.latitude]),oe=Object(r.useRef)(ae),ie=Tw.daysInYear(C)/12;Object(r.useEffect)((function(){if(T){if(!z||Tw.hasMovingParts(m))return ne(),J.current=requestAnimationFrame(ce),function(){cancelAnimationFrame(J.current),X.current||(Kh(me.t("message.SimulationAborted",W)),d((function(e){e.world.date=B.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),ee.current=!1};re()}}),[T]),Object(r.useEffect)((function(){ee.current=P,P?(te.current=new Date(C.getTime()),cancelAnimationFrame(J.current),h("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(h("simulationPaused",!1),ce())}),[P]);var re=function(){Te(),ge();var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Foundation){var a=l;a.solarStructure===G.UpdraftTower&&a.solarUpdraftTower&&ve(a)}}}catch(o){t.e(o)}finally{t.f()}d((function(e){e.viewState.showDailyUpdraftTowerYieldPanel=!0,e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,se(),p&&d((function(e){var t=Pf.getState().sumDailyUpdraftTowerYield();e.actionInfo={name:"Static Daily Simulation for Updraft Tower Completed",result:{totalYield:t},details:Pf.getState().dailyUpdraftTowerYield,timestamp:(new Date).getTime()}}))},ne=function(){ee.current?(C.setTime(te.current.getTime()),ee.current=!1):(B.current=new Date(g.date),le.current=C.getDay(),C.setHours(Math.floor(ae.sunrise/60),-k/2)),X.current=!1,Te(),ge()},ce=function e(){if(T&&!ee.current){if(C.getMinutes()+60*C.getHours()+(C.getDay()-le.current)*py+k>=ae.sunset)return cancelAnimationFrame(J.current),d((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showDailyUpdraftTowerYieldPanel=!0,e.selectedFloatingWindow="dailySolarUpdraftTowerYieldPanel"})),Tf.setState((function(e){e.runDailySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,se(),void(p&&d((function(e){var t=Pf.getState().sumDailyUpdraftTowerYield();e.actionInfo={name:"Dynamic Daily Simulation for Updraft Tower Completed",result:{totalYield:t},details:Pf.getState().dailyUpdraftTowerYield,timestamp:(new Date).getTime()}})));C.setHours(C.getHours(),C.getMinutes()+k),d((function(e){e.world.date=C.toLocaleString("en-US")}));var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation){var o=a;o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&xe(o)}}}catch(i){l.e(i)}finally{l.f()}J.current=requestAnimationFrame(e)}},se=function(){var e,t=be(),l=Object(f.a)(m);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Foundation){var o=a;if(o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower){var i,r,n,c=null!==(i=o.solarUpdraftTower.collectorTransmissivity)&&void 0!==i?i:.9,d=null!==(r=o.solarUpdraftTower.turbineEfficiency)&&void 0!==r?r:.3,u=null!==(n=o.solarUpdraftTower.dischargeCoefficient)&&void 0!==n?n:.65,h=Math.PI*o.solarUpdraftTower.chimneyRadius*o.solarUpdraftTower.chimneyRadius,p=Math.PI*o.solarUpdraftTower.collectorRadius*o.solarUpdraftTower.collectorRadius,y=1239.7*h,x=19.6134*o.solarUpdraftTower.chimneyHeight,v=q.current.get(a.id+"-sut"),b=Q.current.get(a.id+"-sut"),A=Z.current.get(a.id+"-sut");if(A&&v&&b){var T=.5*u*d*sy*h,P=new Date(g.date),S=void 0,j=void 0;s&&(S=w(s),j=HT(P,S.lowestTemperatures,S.highestTemperatures));for(var H=0;H0&&H>0&&v[H-1]>z){var M,W,I=(v[H-1]+z)/2,C=(null!==(M=g.airConvectiveCoefficient)&&void 0!==M?M:5)*p*(I-z),O=I+dy,F=O*O*O*O,k=D*D*D*D,Y=(null!==(W=o.solarUpdraftTower.collectorEmissivity)&&void 0!==W?W:.95)*uy*p*(F-k);A[H]-=C+Y,A[H]<0&&(A[H]=0)}var L=A[H]/(y*D),E=D*(1+Math.cbrt(L*L/x))-dy,U=E>z?Math.sqrt(x*((E+dy)/D-1)):0;A[H]=T*U*U*U*.001,v[H]=E,b[H]=U}}}}}}catch(N){l.e(N)}finally{l.f()}de()},de=function(){var e,t=new Map,l=0,a=[],o=Object(f.a)(m);try{for(o.s();!(e=o.n()).done;){var i=e.value;if(i.type===V.Foundation){var r=i;if(r.solarStructure===G.UpdraftTower&&r.solarUpdraftTower){l++;var n=q.current.get(i.id+"-sut");n&&t.set("Temperature Tower"+l,n);var c=Q.current.get(i.id+"-sut");c&&t.set("Wind Speed Tower"+l,c);var s=Z.current.get(i.id+"-sut");s&&(t.set("Tower"+l,s),a.push(i.label?i.label:"Tower"+l))}}}}catch(z){o.e(z)}finally{o.f()}for(var d=[],u=0;u<24;u++){var h={};h.Hour=u;for(var p=1;p<=l;p++){var y,g="Tower"+p;h[a[p-1]]=null===(y=t.get(g))||void 0===y?void 0:y[u]}d.push(h)}b(d);for(var w=[],A=0;A<24;A++){var T={};T.Hour=A,T.T_Ambient=K.current[A];for(var P=1;P<=l;P++){var S,j,H="Temperature Tower"+P;T["T_"+a[P-1]]=null===(S=t.get(H))||void 0===S?void 0:S[A],H="Wind Speed Tower"+P,T["V_"+a[P-1]]=null===(j=t.get(H))||void 0===j?void 0:j[A]}w.push(T)}v(w),x(a)};Object(r.useEffect)((function(){if(S){if(!z||Tw.hasMovingParts(m))return ue(),J.current=requestAnimationFrame(he),function(){cancelAnimationFrame(J.current),X.current||(Kh(me.t("message.SimulationAborted",W)),d((function(e){e.world.date=B.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),ee.current=!1};fe()}}),[S]),Object(r.useEffect)((function(){ee.current=j,j?(te.current=new Date(C.getTime()),cancelAnimationFrame(J.current),h("simulationPaused",!0),Kh(me.t("message.SimulationPaused",W))):(h("simulationPaused",!1),he())}),[j]);var ue=function(){ee.current?(C.setTime(te.current.getTime()),ee.current=!1):(B.current=new Date(g.date),$.current=0,C.setMonth(0,22),le.current=C.getDay(),oe.current=Ty(C,g.latitude),C.setHours(Math.floor(oe.current.sunrise/60),-k/2),d((function(e){e.world.date=C.toLocaleString("en-US")}))),X.current=!1,Te(),ge(),we()},fe=function(){Te(),ge(),we(),B.current=new Date(g.date),$.current=0;for(var e=0;e<12;e+=L){C.setMonth(e,22),oe.current=Ty(C,g.latitude),ge();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a.type===V.Foundation){var o=a;o.solarStructure===G.UpdraftTower&&o.solarUpdraftTower&&ve(o)}}}catch(i){l.e(i)}finally{l.f()}pe(),$.current++}d((function(e){e.world.date=B.current.toLocaleString("en-US"),e.viewState.showYearlyUpdraftTowerYieldPanel=!0,e.selectedFloatingWindow="yearlySolarUpdraftTowerYieldPanel"})),Tf.setState((function(e){e.runYearlySimulationForUpdraftTower=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",W)),X.current=!0,ye(),p&&d((function(e){var t=Pf.getState().sumYearlyUpdraftTowerYield();e.actionInfo={name:"Static Yearly Simulation for Updraft Tower Completed",result:{totalYield:t},details:Pf.getState().yearlyUpdraftTowerYield,timestamp:(new Date).getTime()}}))},he=function e(){if(S&&!ee.current)if(C.getMinutes()+60*C.getHours()+(C.getDay()-le.current)*py+k0&&j>0&&r[j-1]>z){var M,W,I=(r[j-1]+z)/2,O=(null!==(M=g.airConvectiveCoefficient)&&void 0!==M?M:5)*v*(I-z),F=I+dy,k=F*F*F*F,Y=D*D*D*D,L=(null!==(W=o.solarUpdraftTower.collectorEmissivity)&&void 0!==W?W:.95)*uy*v*(k-Y);i[j]-=O+L,i[j]<0&&(i[j]=0)}var E=i[j]/(b*D),U=D*(1+Math.cbrt(E*E/A))-dy,N=U>z?Math.sqrt(A*((U+dy)/D-1)):0;i[j]=T*N*N*N*.001,r[j]=U,n[j]=N}var J=_.current.get(o.id+"-sut");if(J){var X=i.reduce((function(e,t){return e+t}),0);J[$.current]+=X}}}}}}catch(B){l.e(B)}finally{l.f()}H&&de()},ye=function(){var e,t=[],l=[],a=0,o=Object(f.a)(m);try{for(o.s();!(e=o.n()).done;){var i=e.value;if(i.type===V.Foundation){var r=i;if(r.solarStructure===G.UpdraftTower&&r.solarUpdraftTower){var n=_.current.get(i.id+"-sut");n&&(t.push(n),l.push(i.label?i.label:"Tower"+ ++a))}}}}catch(v){o.e(v)}finally{o.f()}for(var c=[],s=0;s<12;s+=L){var d={};d.Month=it[s];var h,p=Object(f.a)(t.entries());try{for(p.s();!(h=p.n()).done;){var y=Object(u.a)(h.value,2),g=y[0],w=y[1];d[l[g]]=w[s/L]*ie}}catch(v){p.e(v)}finally{p.f()}c.push(d)}A(c),x(l)},ge=function(){var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Foundation){var a=l;if(a.solarStructure===G.UpdraftTower&&a.solarUpdraftTower){var o=q.current.get(l.id+"-sut");o?o.fill(0):q.current.set(l.id+"-sut",new Array(24).fill(0));var i=Q.current.get(l.id+"-sut");i?i.fill(0):Q.current.set(l.id+"-sut",new Array(24).fill(0));var r=Z.current.get(l.id+"-sut");r?r.fill(0):Z.current.set(l.id+"-sut",new Array(24).fill(0))}}}}catch(n){t.e(n)}finally{t.f()}},we=function(){var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Foundation){var a=l;if(a.solarStructure===G.UpdraftTower&&a.solarUpdraftTower){var o=_.current.get(l.id+"-sut");o&&o.length===Y?o.fill(0):_.current.set(l.id+"-sut",new Array(Y).fill(0))}}}}catch(i){t.e(i)}finally{t.f()}},xe=function(e){var t=e.solarUpdraftTower;if(t){var l=jy(C,g.latitude);if(!(l.zw||(v++,x+=p,m>0&&(Pe(e.id+"-sut",y,l)||(x+=m*h)))}v&&(x/=v);var T=C.getMinutes()>=30?C.getHours()+1===24?0:C.getHours()+1:C.getHours(),P=Math.PI*t.collectorRadius*t.collectorRadius;a[T]+=x*P}}}},ve=function(e){var t=e.solarUpdraftTower;if(t){var l=Z.current.get(e.id+"-sut");if(l)for(var a,o,i=(new Me.Vector3).fromArray(e.normal),r=C.getFullYear(),n=C.getMonth(),c=C.getDate(),s=Tw.dayOfYear(C),d=t.collectorRadius,u=Math.max(2,Math.round(2*d/D)),f=e.cx-d+D/2,h=e.cy-d+D/2,p=e.lz+t.collectorHeight,y=new Me.Vector3(0,0,p),m=d*d,w=0,x=Math.PI*t.collectorRadius*t.collectorRadius,v=0;v<24;v++){for(var b=0;b0){var P=zy(T,s,O,ny.SPHERE_MODEL),S=Ry(g.ground,n,Rt,P),j=i.dot(T);w=0;for(var H=0;Hm||(w++,l[v]+=S,j>0&&(Pe(e.id+"-sut",y,T)||(l[v]+=j*P)))}}}w&&(l[v]/=w),l[v]*=x}}},be=function(){var e=ae.daylight()/60;return e>At?I.sunshineHours[C.getMonth()]/(30*e*F):0},Ae=function(){var e=C.getMonth(),t=oe.current.daylight()/60;return t>At?I.sunshineHours[e]/(30*t*F):0},Te=function(){var e=M.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;U.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,U.current)}}catch(i){a.e(i)}finally{a.f()}}},Pe=function(e,t,l){if(U.current.length>1){N.current.length=0,E.set(t,l);var a=U.current.filter((function(t){return t.uuid!==e}));return E.intersectObjects(a,!1,N.current),N.current.length>0}return!1};return Object(gf.jsx)(gf.Fragment,{})},Gk=n.a.memo(Jk),Xk=function e(t,l){Object(He.a)(this,e),this.position=void 0,this.observer=void 0,this.position=t,this.observer=l},Bk=function(){var e,t=Ew(Vi),l=Ew.getState().world,a=Ew.getState().elements,o=Ew(si),i=Tf(yf),n=Ew($r),c=Ew(_r),s=Tf(Js),d=Object(Se.f)().scene,h={lng:t},p=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),y=null!==(e=l.solarPanelVisibilityGridCellSize)&&void 0!==e?e:.2,g=Object(r.useRef)([]),m=Object(r.useRef)([]),w=Object(r.useRef)([]);Object(r.useEffect)((function(){s&&a&&a.length>0&&(x(),i("runSolarPanelVisibilityAnalysis",!1),o((function(e){e.viewState.showSolarPanelVisibilityResultsPanel=!0,e.selectedFloatingWindow="visibilityResultsPanel"})),Kh(me.t("message.SimulationCompleted",h))),i("simulationInProgress",!1)}),[s]);var x=function(){if(Pf.getState().clearSolarPanelVisibilityResults(),function(){g.current=[];var e,t=Object(f.a)(a);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.Human){var o=l;if(o.observer){var i=n(o),r=i?Tw.absoluteHumanOrTreeCoordinates(o.cx,o.cy,o.cz,i):new Me.Vector3(o.cx,o.cy,o.cz);r.z+=o.lz,g.current.push(new Xk(r,o))}}}}catch(c){t.e(c)}finally{t.f()}}(),0!==g.current.length){!function(){var e=d.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;m.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,m.current)}}catch(i){a.e(i)}finally{a.f()}}}();var e,t=Object(f.a)(g.current);try{for(t.s();!(e=t.n()).done;){var l,o=e.value,i=new Map,r=Object(f.a)(a);try{for(r.s();!(l=r.n()).done;){var c=l.value;if(c.type===V.SolarPanel){var s=c;i.set(s.parentId,0)}}}catch(b){r.e(b)}finally{r.f()}var u,h=Object(f.a)(a);try{for(h.s();!(u=h.n()).done;){var p=u.value;if(p.type===V.SolarPanel){var y,w=p,x=null!==(y=i.get(w.parentId))&&void 0!==y?y:0;x+=100*v(w,o.position),i.set(w.parentId,x)}}}catch(b){h.e(b)}finally{h.f()}Pf.getState().setSolarPanelVisibilityResult(o,i)}}catch(b){t.e(b)}finally{t.f()}}},v=function(e,t){var l=n(e);if(!l)throw new Error("parent of solar panel does not exist");var a=!1;if(l.type===V.Roof){if(!(l=c(l)))throw new Error("foundation of solar panel does not exist");a=!0}var o=Tw.absoluteCoordinates(e.cx,e.cy,e.cz,l);a&&(o.z=e.cz+l.cz+l.lz/2);var i=(new Me.Vector3).fromArray(e.normal),r=l.rotation[2]+e.relativeAzimuth;Math.abs(e.tiltAngle)>.001&&i.applyEuler(new Me.Euler(e.tiltAngle,0,r,"ZYX"));for(var s,d=e.lx,u=e.ly*Math.cos(e.tiltAngle),f=e.ly*Math.abs(Math.sin(e.tiltAngle)),h=Math.max(2,Math.round(e.lx/y)),p=Math.max(2,Math.round(e.ly/y)),g=d/h,m=u/p,w=f/p,x=o.x-d/2,v=o.y-u/2,A=(a?o.z:e.poleHeight+o.z)-f/2,T=new Me.Vector2(o.x,o.y),P=0,S=new Me.Vector3,j=new Me.Vector3,H=new Me.Vector2,z=Tw.isZero(r),R=0;R0&&(j.normalize(),b(e.id,S,j)&&(P+=Math.abs(j.dot(i))/(s*s)));return P*y*y/(4*Math.PI)},b=function(e,t,l){if(m.current.length>1){w.current.length=0,p.set(t,l);var a=m.current.filter((function(t){return t.uuid!==e}));if(p.intersectObjects(a,!1,w.current),0===w.current.length)return!0;var o,i=Object(f.a)(w.current.entries());try{for(i.s();!(o=i.n()).done;){var r=Object(u.a)(o.value,2),n=r[0];if(r[1].object.name.endsWith("eyeball")&&0===n)return!0}}catch(c){i.e(c)}finally{i.f()}return!1}return!0};return Object(gf.jsx)(gf.Fragment,{})},Kk=n.a.memo(Bk),qk=function(e){var t,l=e.city,a=Ew(si),n=Tf(yf),c=Ew(Gi),s=Ew(Vi),d=Ew.getState().world,h=Ew.getState().elements,p=Ew($r),y=Ew(_r),g=Ew(Cs),m=Ew(Fs),w=Ew(Ys),x=Pf(ju),v=Pf(Au),b=Pf(Pu),A=Tf(mu),T=Tf(wu),P=Tf(xu),S=Tf(vu),j=Ew(o.showDailyLightSensorPanel),H=Ew(i.noAnimationForSensorDataCollection),z=Object(Se.f)().scene,R=Object(r.useMemo)((function(){return{lng:s}}),[s]),D=Object(r.useMemo)((function(){return g(null!==l&&void 0!==l?l:"Boston MA, USA")}),[l]),M=new Date(d.date),W=Object(r.useMemo)((function(){return m(null!==l&&void 0!==l?l:"Boston MA, USA")}),[l]),I=Object(r.useMemo)((function(){return w(null!==l&&void 0!==l?l:"Boston MA, USA")}),[l]),C=l?null===D||void 0===D?void 0:D.elevation:0,O=null!==(t=d.timesPerHour)&&void 0!==t?t:4,F=60/O,k=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Y=Object(r.useRef)([]),L=Object(r.useRef)([]),E=Object(r.useRef)(0),U=Object(r.useRef)(!1),N=Object(r.useRef)(new Date(d.date)),J=Object(r.useRef)(new Map),G=Object(r.useRef)(new Map),X=Object(r.useRef)(new Array(12).fill(0)),B=Object(r.useRef)(new Array(12).fill(0)),K=Object(r.useRef)(0),q=Object(r.useRef)(!1),Q=Object(r.useRef)(new Date(d.date)),Z=Object(r.useRef)(0),_=Object(r.useMemo)((function(){return Ty(M,d.latitude)}),[d.date,d.latitude]),$=Object(r.useRef)(_);Object(r.useEffect)((function(){if(A){if(!H||Tw.hasMovingParts(h))return te(),E.current=requestAnimationFrame(le),function(){cancelAnimationFrame(E.current),U.current||(Kh(me.t("message.SimulationAborted",R)),a((function(e){e.world.date=N.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),q.current=!1};ee()}}),[A]),Object(r.useEffect)((function(){q.current=T,T?(Q.current=new Date(M.getTime()),cancelAnimationFrame(E.current),n("simulationPaused",!0),Kh(me.t("message.SimulationPaused",R))):(n("simulationPaused",!1),le())}),[T]);var ee=function(){ge(),de();var e,t=Object(f.a)(h);try{for(t.s();!(e=t.n()).done;){var l=e.value;l.type===V.Sensor&&he(l)}}catch(o){t.e(o)}finally{t.f()}a((function(e){e.viewState.showDailyLightSensorPanel=!0,e.selectedFloatingWindow="dailyLightSensorPanel"})),Tf.setState((function(e){e.runDailyLightSensor=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",R)),U.current=!0,ae(),c&&a((function(e){e.actionInfo={name:"Static Daily Simulation for Sensors Completed",details:Pf.getState().dailyLightSensorData,timestamp:(new Date).getTime()}}))},te=function(){q.current?(M.setTime(Q.current.getTime()),q.current=!1):(N.current=new Date(d.date),Z.current=M.getDay(),M.setHours(Math.floor(_.sunrise/60),-F/2)),U.current=!1,ge(),de()},le=function e(){if(A&&!q.current){if(M.getMinutes()+60*M.getHours()+(M.getDay()-Z.current)*py+F>=_.sunset)return cancelAnimationFrame(E.current),a((function(e){e.world.date=N.current.toLocaleString("en-US"),e.viewState.showDailyLightSensorPanel=!0,e.selectedFloatingWindow="dailyLightSensorPanel"})),Tf.setState((function(e){e.runDailyLightSensor=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),Kh(me.t("message.SimulationCompleted",R)),U.current=!0,ae(),void(c&&a((function(e){e.actionInfo={name:"Dynamic Daily Simulation for Sensors Completed",details:Pf.getState().dailyLightSensorData,timestamp:(new Date).getTime()}})));M.setHours(M.getHours(),M.getMinutes()+F),a((function(e){e.world.date=M.toLocaleString("en-US")}));var t,l=Object(f.a)(h);try{for(l.s();!(t=l.n()).done;){var o=t.value;o.type===V.Sensor&&fe(o)}}catch(i){l.e(i)}finally{l.f()}E.current=requestAnimationFrame(e)}},ae=function(){var e,t=pe(),l=Object(f.a)(h);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.Sensor){var o=J.current.get(a.id);if(o)for(var i=0;i0&&(we(e.id,o,t)||(s+=c*n));var u=J.current.get(e.id);if(u)u[M.getMinutes()>=30?M.getHours()+1===24?0:M.getHours()+1:M.getHours()]+=s}},he=function(e){var t=p(e);if(!t)throw new Error("parent of sensor does not exist");var l=J.current.get(e.id);if(l){var a=null;t.type===V.Wall&&(a=y(e));var o=Tw.absoluteCoordinates(e.cx,e.cy,e.cz,t,a||void 0),i=(new Me.Vector3).fromArray(e.normal);i.applyAxisAngle(Rt,t.rotation[2]);for(var r=M.getFullYear(),n=M.getMonth(),c=M.getDate(),s=Tw.dayOfYear(M),u=0;u<24;u++)for(var f=0;f0){var m=zy(g,s,C,ny.SPHERE_MODEL),w=i.dot(g);w>0&&(we(e.id,o,g)||(l[u]+=w*m)),l[u]+=Ry(d.ground,n,i,m)}}}},pe=function(){var e=_.daylight()/60;return e>At?D.sunshineHours[M.getMonth()]/(30*e*O):0},ye=function(){var e=M.getMonth(),t=$.current.daylight()/60;return t>At?(X.current[e]=t,B.current[e]=D.sunshineHours[e]/(30*t),B.current[e]/O):(X.current[e]=0,B.current[e]=0,0)},ge=function(){var e=z.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;Y.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,Y.current)}}catch(i){a.e(i)}finally{a.f()}}},we=function(e,t,l){if(Y.current.length>1){L.current.length=0,k.set(t,l);var a=Y.current.filter((function(t){return t.uuid!==e}));return k.intersectObjects(a,!1,L.current),L.current.length>0}return!1};return Object(gf.jsx)(gf.Fragment,{})},Qk=n.a.memo(qk),Zk=function(e,t){var l=t.efficiency;return"Monocrystalline"===t.cellType&&(l*=.95),l*(1+t.pmaxTC*(e-25))},_k=function(e){var t,l,a,n,c,s=e.city,d=Ew(si),h=Tf(yf),p=Ew(Gi),y=Ew(Vi),g=Ew.getState().world,m=Ew.getState().elements,w=Ew(Ei),x=Ew(Cs),v=Ew($r),b=Ew(_r),A=Pf(ed),T=Ew(ec),P=Pf(ad),S=Ew(tc),j=Ew($s),H=Ew(ld),z=Pf(id),R=Tf(Xs),D=Tf(Bs),M=Tf(Qs),W=Tf(Ks),I=Tf(qs),C=Tf(Zs),O=Ew(o.showDailyPvYieldPanel),F=Ew(i.noAnimationForSolarPanelSimulation),k=null!==(t=Ew(i.highestTemperatureTimeInMinutes))&&void 0!==t?t:900,Y=Tf(Nr),L=Object(Se.f)().scene,E=Object(r.useMemo)((function(){return{lng:y}}),[y]),U=Object(r.useMemo)((function(){return x(null!==s&&void 0!==s?s:"Boston MA, USA")}),[s]),N=new Date(g.date),J=s?null===U||void 0===U?void 0:U.elevation:0,G=null!==(l=g.timesPerHour)&&void 0!==l?l:4,X=60/G,B=null!==(a=g.daysPerYear)&&void 0!==a?a:6,K=12/B,q=Object(r.useMemo)((function(){return new Me.Raycaster}),[]),Q=null!==(n=g.monthlyIrradianceLosses)&&void 0!==n?n:new Array(12).fill(.05),Z=null!==(c=g.pvGridCellSize)&&void 0!==c?c:.25,_=Object(r.useRef)([]),ee=Object(r.useRef)([]),oe=Object(r.useRef)(0),ie=Object(r.useRef)(!1),re=Object(r.useRef)(new Date(g.date)),ne=Object(r.useRef)(new Map),ce=Object(r.useRef)(new Map),se=Object(r.useRef)(0),de=Object(r.useRef)(!1),ue=Object(r.useRef)(new Date(g.date)),fe=Object(r.useRef)(0),he=Object(r.useRef)(20),pe=Object(r.useMemo)((function(){return Ty(N,g.latitude)}),[g.date,g.latitude]),ye=Object(r.useRef)(pe),ge=Tw.daysInYear(N)/12;Object(r.useEffect)((function(){if(R){if(!F||Tw.hasMovingParts(m))return xe(),oe.current=requestAnimationFrame(ve),function(){cancelAnimationFrame(oe.current),ie.current||(Kh(me.t("message.SimulationAborted",E)),d((function(e){e.world.date=re.current.toLocaleString("en-US")})),Tf.setState((function(e){e.simulationInProgress=!1,e.simulationPaused=!1}))),de.current=!1};setTimeout((function(){we(!1)}),50)}}),[R]),Object(r.useEffect)((function(){D&&F&&!Tw.hasMovingParts(m)&&setTimeout((function(){we(!0)}),50)}),[D]),Object(r.useEffect)((function(){de.current=M,M?(ue.current=new Date(N.getTime()),cancelAnimationFrame(oe.current),h("simulationPaused",!0),Kh(me.t("message.SimulationPaused",E))):(h("simulationPaused",!1),ve())}),[M]);var we=function(e){Le(),We();var t,l=Object(f.a)(m);try{for(l.s();!(t=l.n()).done;){var a=t.value;a.type===V.SolarPanel&&Re(a)}}catch(n){l.e(n)}finally{l.f()}if(d((function(t){Y||e||(t.viewState.showDailyPvYieldPanel=!0,t.selectedFloatingWindow="dailyPvYieldPanel")})),Tf.setState((function(t){e?t.runDailySimulationForSolarPanelsLastStep=!1:t.runDailySimulationForSolarPanels=!1,t.simulationInProgress=!1,t.simulationPaused=!1})),ie.current=!0,be(),!Y&&!e&&(Kh(me.t("message.SimulationCompleted",E)),p)){var o=Pf.getState().sumDailyPvYield(),i=Pf.getState().getDailyPvProfit(),r=Pf.getState().dailyPvYield;d((function(e){e.actionInfo={name:"Static Daily Simulation for Solar Panels Completed",result:{totalYield:o.toFixed(2),profit:i.toFixed(2)},details:r,timestamp:(new Date).getTime()}}))}},xe=function(){de.current?(N.setTime(ue.current.getTime()),de.current=!1):(re.current=new Date(g.date),fe.current=N.getDay(),N.setHours(Math.floor(pe.sunrise/60),-X/2)),ie.current=!1,Le(),We()},ve=function e(){if(R&&!de.current){if(N.getMinutes()+60*N.getHours()+(N.getDay()-fe.current)*py+X>=pe.sunset){if(cancelAnimationFrame(oe.current),d((function(e){e.world.date=re.current.toLocaleString("en-US"),Y||(e.viewState.showDailyPvYieldPanel=!0,e.selectedFloatingWindow="dailyPvYieldPanel")})),Tf.setState((function(e){e.runDailySimulationForSolarPanels=!1,e.simulationInProgress=!1,e.simulationPaused=!1})),ie.current=!0,be(),!Y&&(Kh(me.t("message.SimulationCompleted",E)),p)){var t=Pf.getState().sumDailyPvYield(),l=Pf.getState().getDailyPvProfit(),a=Pf.getState().dailyPvYield;d((function(e){e.actionInfo={name:"Dynamic Daily Simulation for Solar Panels Completed",result:{totalYield:t.toFixed(2),profit:l.toFixed(2)},details:a,timestamp:(new Date).getTime()}}))}return}N.setHours(N.getHours(),N.getMinutes()+X),d((function(e){e.world.date=N.toLocaleString("en-US")}));var o,i=Object(f.a)(m);try{for(i.s();!(o=i.n()).done;){var r=o.value;r.type===V.SolarPanel&&De(r)}}catch(n){i.e(n)}finally{i.f()}oe.current=requestAnimationFrame(e)}},be=function(){var e,t=Ce(),l=Object(f.a)(m);try{for(l.s();!(e=l.n()).done;){var a=e.value;if(a.type===V.SolarPanel){var o=a,i=ne.current.get(a.id);if(i)for(var r=Fe(o)*t,n=0;n0){var B=zy(U,R,J,ny.SPHERE_MODEL),K=Ry(g.ground,H,y,B),q=y.dot(U),Q=new Me.Vector2,_=new Me.Vector3;if(o.bifacialityFactor>0)for(var ee=y.clone().negate(),oe=K+Ry(g.ground,H,ee,B)*o.bifacialityFactor,ie=0;ie0?q:-q*o.bifacialityFactor)*B);else for(var ce=0;ce0&&(Q.set(W+ce*D,I+se*M),_.set(Q.x-O.x,Q.y-O.y,0),_.applyEuler(m),F.set(r.x+_.x,r.y+_.y,C+_.z),Ye(e.id,F,U)||(k[ce][se]+=q*B));var de=0;ke(E);var ue=Zk(he.current,o);switch(o.shadeTolerance){case le.NONE:for(var fe=Number.MAX_VALUE,pe=0;pe0)for(var q=P.clone().negate(),Q=G+Ry(g.ground,S,q,U)*o.bifacialityFactor,_=0;_0?X:-X*o.bifacialityFactor)*U);else for(var oe=0;oe0&&(B.set(R+oe*H,D+ie*z),K.set(B.x-W.x,B.y-W.y,0),K.applyEuler(O),I.set(r.x+K.x,r.y+K.y,M+K.z),Ye(e.id,I,i)||(C[oe][ie]+=X*U));var re=0;switch(o.shadeTolerance){case le.NONE:for(var ce=Number.MAX_VALUE,se=0;se=30?N.getHours()+1===24?0:N.getHours()+1:N.getHours()]+=Te*re/(x*A)}}},We=function(){var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.SolarPanel){var a=ne.current.get(l.id);a?a.fill(0):ne.current.set(l.id,new Array(24).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},Ie=function(){var e,t=Object(f.a)(m);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.type===V.SolarPanel){var a=ce.current.get(l.id);a&&a.length===B?a.fill(0):ce.current.set(l.id,new Array(B).fill(0))}}}catch(o){t.e(o)}finally{t.f()}},Ce=function(){var e=pe.daylight()/60;return e>At?U.sunshineHours[N.getMonth()]/(30*e*G):0},Oe=function(){var e=ye.current.daylight()/60;return e>At?U.sunshineHours[N.getMonth()]/(30*e*G):0},Fe=function(e){var t;if(!w(e.pvModelName))throw new Error("PV model not found");return e.lx*e.ly*(null!==(t=e.inverterEfficiency)&&void 0!==t?t:.95)*(1-Q[N.getMonth()])},ke=function(e){if(s){var t=x(s);if(t){var l=HT(e,t.lowestTemperatures,t.highestTemperatures);he.current=jT(l.high,l.low,g.diurnalTemperatureModel,k,Ty(e,g.latitude),Tw.minutesIntoDay(e))}}},Ye=function(e,t,l){if(_.current.length>1){ee.current.length=0,q.set(t,l);var a=_.current.filter((function(t){return t.uuid!==e}));return q.intersectObjects(a,!1,ee.current),ee.current.length>0}return!1},Le=function(){var e=L.children.filter((function(e){return"Content"===e.name}));if(e.length>0){var t=e[0].children;_.current.length=0;var l,a=Object(f.a)(t);try{for(a.s();!(l=a.n()).done;){var o=l.value;Tw.fetchSimulationElements(o,_.current)}}catch(i){a.e(i)}finally{a.f()}}};return Object(gf.jsx)(gf.Fragment,{})},$k=n.a.memo(_k),eY=function(){var e=Ew(i.latitude),t=Ew(i.longitude),l=Ew(Ls),a=Object(r.useState)("Boston MA, USA"),o=Object(u.a)(a,2),n=o[0],c=o[1];return Object(r.useEffect)((function(){var a;c(null!==(a=l(e,t))&&void 0!==a?a:"Boston MA, USA")}),[e,t]),Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(Mk,{city:n}),Object(gf.jsx)(Ik,{city:n}),Object(gf.jsx)(Ok,{city:n}),Object(gf.jsx)(Qk,{city:n}),Object(gf.jsx)($k,{city:n}),Object(gf.jsx)(Kk,{}),Object(gf.jsx)(kk,{city:n}),Object(gf.jsx)(Lk,{city:n}),Object(gf.jsx)(Uk,{city:n}),Object(gf.jsx)(Vk,{city:n}),Object(gf.jsx)(Gk,{city:n})]})},tY=n.a.memo(eY),lY=l(845),aY=l(862),oY=l(574),iY=l(863),rY=l(864),nY=l(865),cY=l(866),sY=l(867),dY=l(868),uY=l(869),fY=l(572),hY=l(301),pY=l(571),yY=l(870),gY=l(871),mY=l(872),wY="data:image/png;base64,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",xY=l(338),vY=l(91),bY=l(218),AY=l(557),TY=function(e){var t=e.yScale,l=e.tickLength,a=e.tickIntegers,o=e.variable,i=e.name,n=e.unit,c=e.type,s=e.digits,d=e.min,h=e.max,p=e.step,y=e.value,g=Ew(si),m=Ew(di),w=Ew(Vi),x=Ew(Ss),v=Object(r.useState)(!1),b=Object(u.a)(v,2),A=b[0],T=b[1],P=Object(r.useRef)(d),S=Object(r.useRef)(h);Object(r.useEffect)((function(){P.current=d}),[d]),Object(r.useEffect)((function(){S.current=h}),[h]);var j={lng:w},H=m.uid===x.owner,z=t.range(),R=Object(r.useMemo)((function(){var e=z[0]-z[1],o="number"===c?Math.floor(e/l):1;return(a?t.ticks(o).filter((function(e){return Number.isInteger(e)})):t.ticks(o)).map((function(e){return{value:e,yOffset:t(e)}}))}),[t,l,c,a]),D=function(){g((function(e){e.projectInfo.selectedProperty=e.projectInfo.selectedProperty!==o?o:null})),Tf.setState((function(e){e.updateProjectsFlag=!0}))},M=function(){H&&x.owner&&x.title?function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({selectedProperty:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(x.owner,x.title,x.selectedProperty!==o?o:null).then((function(){D()})):D()},W=function(e,t){return Object(gf.jsx)("span",{style:{display:"block",width:t+"px"},children:e})},I=function(){return Object(gf.jsx)("text",{onClick:M,x:0,y:-20,style:{fontSize:"10px",textAnchor:"middle",fill:"dimgray",cursor:"pointer",fontWeight:x.selectedProperty===o?"bold":"normal"},children:i})},C=Object(r.useMemo)((function(){return"yearlyProfit"===o||"unitCost"===o||"sellingPrice"===o||"totalYearlyCost"===o}),[o]);return Object(gf.jsxs)(gf.Fragment,{children:["orientation"!==o?Object(gf.jsx)(tD.a,{content:Object(gf.jsxs)("div",{children:[Object(gf.jsx)($v.a,{style:{width:"240px"},addonBefore:W(me.t("word.Minimum",j)+(C?" $":""),80),addonAfter:n,min:"totalYearlyCost"===o||"totalYearlyYield"===o||"meanYearlyYield"===o||"unitCost"===o||"poleHeight"===o||"interRowSpacing"===o?0:"tiltAngle"===o||"latitude"===o?-90:"rowWidth"===o?1:Number.MIN_SAFE_INTEGER,max:S.current-p,step:p,value:P.current,onChange:function(e){g((function(t){if(t.projectInfo.ranges){var l,a=-1,i=null,r=Object(f.a)(t.projectInfo.ranges.entries());try{for(r.s();!(l=r.n()).done;){var n=Object(u.a)(l.value,2),c=n[0],s=n[1];if(s.variable===o){a=c,i=s;break}}}catch(y){r.e(y)}finally{r.f()}if(a>=0&&i)t.projectInfo.ranges[a]={variable:i.variable,minimum:e,maximum:i.maximum},m.uid&&x.title&&lP(m.uid,x.title,t.projectInfo.ranges);else{var d={variable:o,minimum:e,maximum:h};t.projectInfo.ranges.push(d),m.uid&&x.title&&tP(m.uid,x.title,d)}}else{var p={variable:o,minimum:e,maximum:h};t.projectInfo.ranges=[p],m.uid&&x.title&&tP(m.uid,x.title,p)}})),P.current=e,T(!A)}}),Object(gf.jsx)("br",{}),Object(gf.jsx)($v.a,{style:{width:"240px"},addonBefore:W(me.t("word.Maximum",j)+(C?" $":""),80),addonAfter:n,min:P.current+p,max:"tiltAngle"===o||"latitude"===o?90:Number.MAX_SAFE_INTEGER,step:p,value:S.current,onChange:function(e){g((function(t){if(t.projectInfo.ranges){var l,a=-1,i=null,r=Object(f.a)(t.projectInfo.ranges.entries());try{for(r.s();!(l=r.n()).done;){var n=Object(u.a)(l.value,2),c=n[0],s=n[1];if(s.variable===o){a=c,i=s;break}}}catch(y){r.e(y)}finally{r.f()}if(a>=0&&i)t.projectInfo.ranges[a]={variable:i.variable,minimum:i.minimum,maximum:e},m.uid&&x.title&&lP(m.uid,x.title,t.projectInfo.ranges);else{var h={variable:o,minimum:d,maximum:e};t.projectInfo.ranges.push(h),m.uid&&x.title&&tP(m.uid,x.title,h)}}else{var p={variable:o,minimum:d,maximum:e};t.projectInfo.ranges=[p],m.uid&&x.title&&tP(m.uid,x.title,p)}})),S.current=e,T(!A)}})]}),children:I()}):Object(gf.jsx)(gf.Fragment,{children:I()}),void 0!==y&&Object(gf.jsx)("text",{x:0,y:-8,style:{fontSize:"9px",textAnchor:"middle",fill:"dimgray"},children:C?y.toLocaleString("en-US",{style:"currency",currency:"USD",maximumFractionDigits:s})+("yearlyProfit"===o||"totalYearlyCost"===o?"K":""):("orientation"===o?me.t(0===y?"solarPanelMenu.Landscape":"solarPanelMenu.Portrait",j)+(0===y?" (\u25ad)":" (\u25af)"):y.toFixed(s))+(""!==n?n:"")}),Object(gf.jsx)("line",{x1:0,x2:0,y1:t(d),y2:t(h),stroke:"gold",strokeWidth:10,onClick:M,style:{cursor:"pointer"},strokeOpacity:x.selectedProperty===o?.5:0}),Object(gf.jsx)("line",{x1:0,x2:0,y1:t(d),y2:t(h),stroke:"black",strokeWidth:2}),R.map((function(e){var t=e.value,l=e.yOffset;return Object(gf.jsxs)("g",{transform:"translate(0, ".concat(l,")"),shapeRendering:"crispEdges",children:[Object(gf.jsx)("line",{x1:-5,x2:0,stroke:"black",strokeWidth:1}),Object(gf.jsx)("text",{style:{fontSize:"10px",textAnchor:"start",alignmentBaseline:"central",transform:"translateX(-25px)"},children:"orientation"===o?0===t?"\u25ad":"\u25af":t},t)]},t)}))]})},PY=n.a.memo(TY),SY={top:30,right:55,bottom:36,left:55},jY=["#e0ac2b","#e85252","#6689c6","#9a6fb0","#a53253","#69b3a2","#556b2f","#8b008b","#ff1493","#d2691e","#2f4f4f","#dc143c"],HY=function(e){var t=e.id,l=e.width,a=e.height,o=e.data,i=e.types,r=e.minima,n=e.maxima,c=e.steps,s=e.variables,d=e.titles,u=e.units,f=e.digits,p=e.tickIntegers,y=e.hover,g=e.hoveredIndex,m=e.selectedIndex,w=l-SY.right-SY.left,x=a-SY.top-SY.bottom,v=Object(h.a)(new Set(o.map((function(e){return e.group})))),b=xY.b().range([0,w]).domain(s).padding(0),A={};s.forEach((function(e,t){var l,a;A[e]=vY.a().range([x,0]).domain([null!==(l=r[t])&&void 0!==l?l:0,null!==(a=n[t])&&void 0!==a?a:1])}));var T=bY.a().domain(v).range(jY),P=AY.a(),S=o.map((function(e,t){if(e.invisible)return null;var l=s.map((function(t){var l,a=A[t];return[null!==(l=b(t))&&void 0!==l?l:0,a(e[t])]})),a=P(l);return a?Object(gf.jsx)("path",{onMouseOver:function(){y(t)},d:a,stroke:e.hovered?"red":T(e.group),fill:"none",strokeWidth:e.selected?3:1,strokeDasharray:e.hovered?"5,3":"none"},t):void 0})),j=s.map((function(e,t){var l,a=A[e];return Object(gf.jsx)("g",{transform:"translate("+b(e)+",0)",children:Object(gf.jsx)(PY,{yScale:a,tickLength:40,tickIntegers:p[t],type:null!==(l=i[t])&&void 0!==l?l:"number",variable:s[t],name:d[t],unit:u[t],digits:f[t],min:r[t],max:n[t],step:c[t],value:g>=0&&!o[g].invisible?o[g][e]:m>=0&&!o[m].invisible?o[m][e]:void 0})},t)}));return Object(gf.jsx)("svg",{id:t,width:l,height:a,onContextMenu:function(e){e.stopPropagation()},children:Object(gf.jsxs)("g",{width:w,height:x,transform:"translate(".concat([SY.left,SY.top].join(","),")"),children:[S,j]})})},zY=n.a.memo(HY),RY=l(347),DY=l(161),MY=l(830),WY=l(292),IY=Object(mv.a)(ZW)(SC||(SC=Object(gv.a)(["\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n"]))),CY=function(e){var t=e.horizontalGrid,l=e.verticalGrid,a=e.symbolSize,o=e.changeHorizontalGrid,i=e.changeVerticalGrid,n=e.changeSymbolSize,c={lng:Ew(Vi)},s=Object(r.useState)(!1),d=Object(u.a)(s,2),f=d[0],h=d[1],p=Object(gf.jsxs)(Qv.a,{children:[Object(gf.jsxs)(Qv.a.Item,{children:[me.t("menu.graph.SymbolSize",c)+":",Object(gf.jsx)($S.a,{min:1,max:8,tooltipVisible:!1,value:a,onChange:function(e){null===n||void 0===n||n(e)}})]}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:t,onClick:function(){null===o||void 0===o||o(!t)},children:me.t("menu.graph.ShowHorizontalGridLines",c)})}),Object(gf.jsx)(Qv.a.Item,{children:Object(gf.jsx)(_v.a,{checked:l,onClick:function(){null===i||void 0===i||i(!l)},children:me.t("menu.graph.ShowVerticalGridLines",c)})})]});return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(lb.a,{overlay:p,placement:"bottomRight",visible:f,onVisibleChange:function(e){h(e)},children:Object(gf.jsx)(IY,{style:{top:"120px",right:"16px"},onClick:function(e){e.stopPropagation()}})})})},OY=ET.a.TextArea,FY=db.a.Option,kY=mv.a.div(jC||(jC=Object(gv.a)(["\n position: relative;\n top: 0;\n left: 0;\n width: 100%;\n height: calc(100% - 30px);\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding-bottom: 30px;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n background: white;\n"]))),YY=mv.a.div(HC||(HC=Object(gv.a)(["\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n border: none;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n overflow-y: hidden;\n"]))),LY=mv.a.div(zC||(zC=Object(gv.a)(["\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n"]))),EY=mv.a.div(RC||(RC=Object(gv.a)(["\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n"]))),UY=mv.a.div(DC||(DC=Object(gv.a)(["\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 6px;\n padding-bottom: 6px;\n background: white;\n"]))),NY=mv.a.div(MC||(MC=Object(gv.a)(["\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: flex-start;\n background: white;\n"]))),VY=function(e){var t,l,a,o,i,n,c,s,d,p,y,g,m,w,v,b,A,T,P,S,j,H=e.relativeWidth,R=e.canvas,D=Ew(si),W=Ew(di),I=Ew(Vi),C=Ew(ar),O=Ew(Ss),F=Ew(ff),k=Ew(rf),Y=Object(r.useState)(),L=Object(u.a)(Y,2),E=L[0],U=L[1],N=Object(r.useState)(),V=Object(u.a)(N,2),J=V[0],G=V[1],X=Object(r.useState)(!1),B=Object(u.a)(X,2),K=B[0],q=B[1],Q=Object(r.useState)(!1),Z=Object(u.a)(Q,2),_=Z[0],ee=Z[1],te=Object(r.useRef)(!1),le=Object(r.useRef)(null!==(t=O.description)&&void 0!==t?t:null),ae=Object(r.useRef)(!1),oe=Object(r.useRef)(!1),ie=Object(r.useRef)(null!==(l=O.dataColoring)&&void 0!==l?l:z.ALL),re=Object(r.useRef)(!1),ne=Object(r.useRef)(null!==(a=O.designs)&&void 0!==a?a:[]),ce=Object(r.useRef)(null!==(o=O.thumbnailWidth)&&void 0!==o?o:200),se=Object(r.useRef)(null!==(i=O.xAxisNameScatteredPlot)&&void 0!==i?i:"rowWidth"),de=Object(r.useRef)(null!==(n=O.yAxisNameScatteredPlot)&&void 0!==n?n:"rowWidth"),ue=Object(r.useRef)(null!==(c=O.dotSizeScatteredPlot)&&void 0!==c?c:5),fe=Object(r.useRef)(!0),he=Object(r.useRef)(!0);Object(r.useEffect)((function(){var e;se.current=null!==(e=O.xAxisNameScatteredPlot)&&void 0!==e?e:"rowWidth"}),[O.xAxisNameScatteredPlot]),Object(r.useEffect)((function(){var e;de.current=null!==(e=O.yAxisNameScatteredPlot)&&void 0!==e?e:"rowWidth"}),[O.yAxisNameScatteredPlot]),Object(r.useEffect)((function(){var e;ue.current=null!==(e=O.dotSizeScatteredPlot)&&void 0!==e?e:5}),[O.dotSizeScatteredPlot]),Object(r.useEffect)((function(){var e;ce.current=null!==(e=O.thumbnailWidth)&&void 0!==e?e:200}),[O.thumbnailWidth]);var pe=Object(r.useMemo)((function(){return{lng:I}}),[I]),ye=W.uid===O.owner;Object(r.useEffect)((function(){if(ne.current=[],O.designs){var e,t=Object(f.a)(O.designs);try{for(t.s();!(e=t.n()).done;){var l=e.value;ne.current.push(l)}}catch(i){t.e(i)}finally{t.f()}var a=O.selectedProperty;if(a){var o=O.sortDescending?1:-1;ne.current.sort((function(e,t){return a?"rowWidth"===a&&"rowsPerRack"in e&&"rowsPerRack"in t?o*(e.rowsPerRack-t.rowsPerRack):"orientation"===a?o*(("Landscape"===e[a]?0:1)-("Landscape"===t[a]?0:1)):"totalYearlyYield"===a&&"yearlyYield"in e&&"yearlyYield"in t?o*(e.yearlyYield-t.yearlyYield):"meanYearlyYield"===a&&"yearlyYield"in e&&"yearlyYield"in t?o*(e.yearlyYield/e.panelCount-t.yearlyYield/t.panelCount):"totalYearlyCost"===a?o*(Tw.calculateCost(e)-Tw.calculateCost(t)):"yearlyProfit"===a?o*(Tw.calculateProfit(e)-Tw.calculateProfit(t)):a in e&&a in t?o*(e[a]-t[a]):0:0}))}q(!K)}}),[O.designs,O.sortDescending,O.selectedProperty]),Object(r.useEffect)((function(){if(U(void 0),O.designs){var e,t=Object(f.a)(O.designs);try{for(t.s();!(e=t.n()).done;){var l=e.value;if(l.title===C){U(l);break}}}catch(a){t.e(a)}finally{t.f()}}}),[C,O.designs]),Object(r.useEffect)((function(){var e=function(){q(!K)};return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[K]);var ge=function(){D((function(e){e.projectView=!1,e.projectInfo.title=null,e.projectInfo.description=null,e.projectInfo.owner=null,e.projectImages.clear()})),U(void 0),Tf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag}))},we=function(){W.uid&&O.title&&E&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({designs:$T.a.firestore.FieldValue.arrayRemove(l)}).then((function(){Tf.setState((function(e){e.updateProjectsFlag=!0})),$T.a.firestore().collection("users").doc(e).collection("designs").doc(l.title).delete().then((function(){Ew.setState((function(e){l.title===e.cloudFile&&(e.cloudFile=void 0)})),Kh(me.t("message.DesignRemovedFromProject",a)+".")})).catch((function(e){Qh(me.t("message.CannotDeleteCloudFile",a)+": "+e)}))})).catch((function(e){Qh(me.t("message.CannotRemoveDesignFromProject",a)+": "+e)}))}(W.uid,O.title,E).then((function(){D((function(e){if(e.projectInfo.designs){var t,l=-1,a=Object(f.a)(e.projectInfo.designs.entries());try{for(a.s();!(t=a.n()).done;){var o=Object(u.a)(t.value,2),i=o[0];if(o[1].title===E.title){l=i;break}}}catch(r){a.e(r)}finally{a.f()}l>=0&&e.projectInfo.designs.splice(l,1)}}))}))},xe=window.innerHeight,ve=Math.round(800/ce.current),be=48/ve,Ae=Math.round(H*window.innerWidth/ve-be),Te=Object(r.useMemo)((function(){var e,t,l,a,o,i;return[kw.getVariables(O.type,null!==(e=O.hiddenParameters)&&void 0!==e?e:[]),kw.getTitles(O.type,pe,null!==(t=O.hiddenParameters)&&void 0!==t?t:[]),kw.getUnits(O.type,pe,null!==(l=O.hiddenParameters)&&void 0!==l?l:[]),kw.getDigits(O.type,null!==(a=O.hiddenParameters)&&void 0!==a?a:[]),kw.getTickIntegers(O.type,null!==(o=O.hiddenParameters)&&void 0!==o?o:[]),kw.getTypes(O.type,null!==(i=O.hiddenParameters)&&void 0!==i?i:[])]}),[O.type,O.hiddenParameters,_,pe]),Pe=Object(u.a)(Te,6),Se=Pe[0],je=Pe[1],He=Pe[2],ze=Pe[3],Re=Pe[4],De=Pe[5],Me=Object(r.useMemo)((function(){var e=[];if(O.designs&&O.type===M.SOLAR_PANEL_ARRAY){var t,l=Object(f.a)(O.designs);try{for(l.s();!(t=l.n()).done;){var a,o,i,r,n,c,s,d,u,h,p,y,g,m=t.value,w={};(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("rowWidth"))||(w.rowWidth=m.rowsPerRack),(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("tiltAngle"))||(w.tiltAngle=Tw.toDegrees(m.tiltAngle)),(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("interRowSpacing"))||(w.interRowSpacing=m.interRowSpacing),(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("latitude"))||(w.latitude=null!==(n=m.latitude)&&void 0!==n?n:42),(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("orientation"))||(w.orientation=m.orientation===$.landscape?0:1),(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("poleHeight"))||(w.poleHeight=m.poleHeight),(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("unitCost"))||(w.unitCost=m.unitCost),(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("sellingPrice"))||(w.sellingPrice=m.sellingPrice),(null===(h=O.hiddenParameters)||void 0===h?void 0:h.includes(""))||(w.totalYearlyCost=Tw.calculateCost(m)),(null===(p=O.hiddenParameters)||void 0===p?void 0:p.includes("totalYearlyYield"))||(w.totalYearlyYield=.001*m.yearlyYield),(null===(y=O.hiddenParameters)||void 0===y?void 0:y.includes("meanYearlyYield"))||(w.meanYearlyYield=m.yearlyYield/m.panelCount),(null===(g=O.hiddenParameters)||void 0===g?void 0:g.includes("yearlyProfit"))||(w.yearlyProfit=Tw.calculateProfit(m)),w.group=O.dataColoring===z.INDIVIDUALS?m.title:"default",w.selected=E===m,w.hovered=J===m,w.invisible=m.invisible,e.push(w)}}catch(x){l.e(x)}finally{l.f()}}return e}),[O.designs,O.type,J,E,k,O.hiddenParameters,O.dataColoring,_]),We=function(e,t){var l=t;if(O.ranges){var a,o=Object(f.a)(O.ranges);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.variable===e){var r;l=null!==(r=i.minimum)&&void 0!==r?r:t;break}}}catch(n){o.e(n)}finally{o.f()}}return l},Ie=function(e,t){var l=t;if(O.ranges){var a,o=Object(f.a)(O.ranges);try{for(o.s();!(a=o.n()).done;){var i=a.value;if(i.variable===e){var r;l=null!==(r=i.maximum)&&void 0!==r?r:t;break}}}catch(n){o.e(n)}finally{o.f()}}return l},Ce=Object(r.useMemo)((function(){if(O.type===M.SOLAR_PANEL_ARRAY&&F){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=O.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(We("rowWidth",F.minimumRowsPerRack)),(null===(t=O.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(We("tiltAngle",Tw.toDegrees(F.minimumTiltAngle))),(null===(l=O.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(We("interRowSpacing",F.minimumInterRowSpacing)),(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(We("latitude",-90)),(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(0),(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(We("poleHeight",0)),(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(We("unitCost",.1)),(null===(n=O.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(We("sellingPrice",.1)),(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(We("totalYearlyCost",0)),(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(We("totalYearlyYield",0)),(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(We("meanYearlyYield",0)),(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(We("yearlyProfit",-10)),f}return[]}),[F,O.type,O.ranges,O.hiddenParameters,_]),Oe=Object(r.useMemo)((function(){if(O.type===M.SOLAR_PANEL_ARRAY&&F){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=O.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(Ie("rowWidth",F.maximumRowsPerRack)),(null===(t=O.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(Ie("tiltAngle",Tw.toDegrees(F.maximumTiltAngle))),(null===(l=O.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(Ie("interRowSpacing",F.maximumInterRowSpacing)),(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(Ie("latitude",90)),(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(1),(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(Ie("poleHeight",5)),(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(Ie("unitCost",1)),(null===(n=O.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(Ie("sellingPrice",.5)),(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(Ie("totalYearlyCost",100)),(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(Ie("totalYearlyYield",100)),(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(Ie("meanYearlyYield",1e3)),(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(Ie("yearlyProfit",10)),f}return[]}),[F,O.type,O.ranges,O.hiddenParameters,_]),Fe=Object(r.useMemo)((function(){if(O.type===M.SOLAR_PANEL_ARRAY&&F){var e,t,l,a,o,i,r,n,c,s,d,u,f=[];return(null===(e=O.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth"))||f.push(1),(null===(t=O.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle"))||f.push(.1),(null===(l=O.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing"))||f.push(.1),(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("latitude"))||f.push(.1),(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("orientation"))||f.push(1),(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight"))||f.push(.1),(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("unitCost"))||f.push(.01),(null===(n=O.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice"))||f.push(.01),(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost"))||f.push(.1),(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield"))||f.push(1),(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield"))||f.push(1),(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit"))||f.push(.1),f}return[]}),[O.type,O.hiddenParameters,_]),ke=Object(r.useRef)(!(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("rowWidth"))),Ye=Object(r.useRef)(!(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("tiltAngle"))),Le=Object(r.useRef)(!(null===(p=O.hiddenParameters)||void 0===p?void 0:p.includes("interRowSpacing"))),Ee=Object(r.useRef)(!(null===(y=O.hiddenParameters)||void 0===y?void 0:y.includes("latitude"))),Ue=Object(r.useRef)(!(null===(g=O.hiddenParameters)||void 0===g?void 0:g.includes("orientation"))),Ne=Object(r.useRef)(!(null===(m=O.hiddenParameters)||void 0===m?void 0:m.includes("poleHeight"))),Ve=Object(r.useRef)(!(null===(w=O.hiddenParameters)||void 0===w?void 0:w.includes("unitCost"))),Je=Object(r.useRef)(!(null===(v=O.hiddenParameters)||void 0===v?void 0:v.includes("sellingPrice"))),Xe=Object(r.useRef)(!(null===(b=O.hiddenParameters)||void 0===b?void 0:b.includes("totalYearlyCost"))),Be=Object(r.useRef)(!(null===(A=O.hiddenParameters)||void 0===A?void 0:A.includes("totalYearlyYield"))),Ke=Object(r.useRef)(!(null===(T=O.hiddenParameters)||void 0===T?void 0:T.includes("meanYearlyYield"))),qe=Object(r.useRef)(!(null===(P=O.hiddenParameters)||void 0===P?void 0:P.includes("yearlyProfit")));Object(r.useEffect)((function(){var e,t,l,a,o,i,r,n,c,s,d,u;ke.current=!(null===(e=O.hiddenParameters)||void 0===e?void 0:e.includes("rowWidth")),Ye.current=!(null===(t=O.hiddenParameters)||void 0===t?void 0:t.includes("tiltAngle")),Le.current=!(null===(l=O.hiddenParameters)||void 0===l?void 0:l.includes("interRowSpacing")),Ee.current=!(null===(a=O.hiddenParameters)||void 0===a?void 0:a.includes("latitude")),Ue.current=!(null===(o=O.hiddenParameters)||void 0===o?void 0:o.includes("orientation")),Ne.current=!(null===(i=O.hiddenParameters)||void 0===i?void 0:i.includes("poleHeight")),Ve.current=!(null===(r=O.hiddenParameters)||void 0===r?void 0:r.includes("unitCost")),Je.current=!(null===(n=O.hiddenParameters)||void 0===n?void 0:n.includes("sellingPrice")),Xe.current=!(null===(c=O.hiddenParameters)||void 0===c?void 0:c.includes("totalYearlyCost")),Be.current=!(null===(s=O.hiddenParameters)||void 0===s?void 0:s.includes("totalYearlyYield")),Ke.current=!(null===(d=O.hiddenParameters)||void 0===d?void 0:d.includes("meanYearlyYield")),qe.current=!(null===(u=O.hiddenParameters)||void 0===u?void 0:u.includes("yearlyProfit")),q(!K)}),[O.hiddenParameters]),Object(r.useEffect)((function(){le.current=O.description}),[O.description]);var Qe=function(e){var t;t=e.title,D((function(e){if(e.projectInfo.designs){var l,a=Object(f.a)(e.projectInfo.designs);try{for(a.s();!(l=a.n()).done;){var o=l.value;if(o.title===t){o.invisible=!o.invisible;break}}}catch(i){a.e(i)}finally{a.f()}}})),ye&&W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};$T.a.firestore().collection("users").doc(e).collection("projects").doc(t).get().then((function(o){if(o.exists){var i=o.data();if(i){var r=[];r.push.apply(r,Object(h.a)(i.designs));var n,c=-1,s=Object(f.a)(r.entries());try{for(s.s();!(n=s.n()).done;){var d=Object(u.a)(n.value,2),p=d[0];if(d[1].title===l.title){c=p;break}}}catch(y){s.e(y)}finally{s.f()}c>=0&&(r[c].invisible=!l.invisible,$T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({designs:r}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)})))}}})).catch((function(e){Qh(me.t("message.CannotFetchProjectData",a)+": "+e)})).finally((function(){}))}(W.uid,O.title,e)},Ze=function(e,t){D((function(l){l.projectInfo.hiddenParameters&&(e?l.projectInfo.hiddenParameters.includes(t)&&l.projectInfo.hiddenParameters.splice(l.projectInfo.hiddenParameters.indexOf(t),1):l.projectInfo.hiddenParameters.includes(t)||l.projectInfo.hiddenParameters.push(t))}))},_e=function(e,t){re.current=!0,ye?W.uid&&O.title&&function(e,t,l,a){var o={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({hiddenParameters:a?$T.a.firestore.FieldValue.arrayUnion(l):$T.a.firestore.FieldValue.arrayRemove(l)}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",o)+": "+e)}))}(W.uid,O.title,t,!e).then((function(){Ze(e,t)})):Ze(e,t)},$e=function(){D((function(e){e.projectInfo.dataColoring=ie.current})),Tf.setState((function(e){e.updateProjectsFlag=!0})),q(!K)},et=function(e){ie.current=e,ye?W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({dataColoring:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,ie.current).then((function(){$e()})):$e()},tt=function(){return Object(gf.jsxs)(gf.Fragment,{children:[Object(gf.jsx)(FY,{value:"rowWidth",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowWidth",pe)})},"rowWidth"),Object(gf.jsx)(FY,{value:"tiltAngle",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTiltAngle",pe)})},"tiltAngle"),Object(gf.jsx)(FY,{value:"interRowSpacing",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowSpacing",pe)})},"interRowSpacing"),Object(gf.jsx)(FY,{value:"latitude",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Latitude",pe)})},"latitude"),Object(gf.jsx)(FY,{value:"orientation",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayOrientation",pe)})},"orientation"),Object(gf.jsx)(FY,{value:"poleHeight",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayPoleHeight",pe)})},"poleHeight"),Object(gf.jsx)(FY,{value:"unitCost",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.UnitCost",pe)})},"unitCost"),Object(gf.jsx)(FY,{value:"sellingPrice",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.SellingPrice",pe)})},"sellingPrice"),Object(gf.jsx)(FY,{value:"totalYearlyCost",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",pe)})},"totalYearlyCost"),Object(gf.jsx)(FY,{value:"totalYearlyYield",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",pe)})},"totalYearlyYield"),Object(gf.jsx)(FY,{value:"meanYearlyYield",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",pe)})},"meanYearlyYield"),Object(gf.jsx)(FY,{value:"yearlyProfit",children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayYearlyProfit",pe)})},"yearlProfit")]})},lt=Object(r.useMemo)((function(){var e=[];if(O.designs&&O.type===M.SOLAR_PANEL_ARRAY){var t,l=Object(f.a)(O.designs);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(!a.invisible&&a!==E){var o={};kw.setScatterData(se.current,"x",o,a),kw.setScatterData(de.current,"y",o,a),e.push(o)}}}catch(i){l.e(i)}finally{l.f()}}return e}),[se.current,de.current,O.designs,O.type,E]),at=Object(r.useMemo)((function(){var e=[];if(O.designs&&O.type===M.SOLAR_PANEL_ARRAY){var t,l=Object(f.a)(O.designs);try{for(l.s();!(t=l.n()).done;){var a=t.value;if(a===E){var o={};kw.setScatterData(se.current,"x",o,a),kw.setScatterData(de.current,"y",o,a),e.push(o)}}}catch(i){l.e(i)}finally{l.f()}}return e}),[se.current,de.current,O.designs,O.type,E]),ot=function(e){var t={min:0,max:1};if(O.type===M.SOLAR_PANEL_ARRAY&&F)switch(e){case"rowWidth":t.min=We("rowWidth",F.minimumRowsPerRack),t.max=Ie("rowWidth",F.maximumRowsPerRack);break;case"tiltAngle":t.min=We("tiltAngle",Tw.toDegrees(F.minimumTiltAngle)),t.max=Ie("tiltAngle",Tw.toDegrees(F.maximumTiltAngle));break;case"interRowSpacing":t.min=We("interRowSpacing",F.minimumInterRowSpacing),t.max=Ie("interRowSpacing",F.maximumInterRowSpacing);break;case"latitude":t.min=We("latitude",-90),t.max=Ie("latitude",90);break;case"orientation":t.min=0,t.max=1;break;case"poleHeight":t.min=We("poleHeight",0),t.max=Ie("poleHeight",5);break;case"unitCost":t.min=We("unitCost",.1),t.max=Ie("unitCost",1);break;case"sellingPrice":t.min=We("sellingPrice",.1),t.max=Ie("sellingPrice",.5);break;case"totalYearlyCost":t.min=We("totalYearlyCost",0),t.max=Ie("totalYearlyCost",100);break;case"totalYearlyYield":t.min=We("totalYearlyYield",0),t.max=Ie("totalYearlyYield",100);break;case"meanYearlyYield":t.min=We("meanYearlyYield",0),t.max=Ie("meanYearlyYield",1e3);break;case"yearlyProfit":t.min=We("yearlyProfit",-10),t.max=Ie("yearlyProfit",10)}return t},it=Object(r.useMemo)((function(){return ot(se.current)}),[se.current,O.ranges]),rt=Object(r.useMemo)((function(){return ot(de.current)}),[de.current,O.ranges]),nt=Object(r.useMemo)((function(){return kw.getUnit(se.current,pe)}),[se.current,pe]),ct=Object(r.useMemo)((function(){return kw.getUnit(de.current,pe)}),[de.current,pe]),st=function(e){var t=e.cx,l=e.cy;return Object(gf.jsx)(DY.a,{cx:t,cy:l,fill:"#8884d8",r:ue.current})};return Object(gf.jsx)(kY,{onContextMenu:function(e){e.stopPropagation()},children:Object(gf.jsxs)(YY,{children:[Object(gf.jsxs)(LY,{children:[Object(gf.jsx)("span",{children:(ye?me.t("projectPanel.Project",pe):me.t("projectPanel.ProjectByOtherPeople",pe))+": "+O.title+(ye?"":" ("+me.t("word.Owner",pe)+": "+(null===(S=O.owner)||void 0===S?void 0:S.substring(0,4))+"***)")+" ("+ne.current.length+")"}),Object(gf.jsx)("span",{style:{cursor:"pointer"},onMouseDown:function(){ge()},onTouchStart:function(){ge()},children:Object(gf.jsx)(pO.a,{title:me.t("word.Close",pe)})})]}),Object(gf.jsx)(MR.a,{style:{backgroundColor:"white",border:"none"},onChange:function(e){oe.current=e.length>0,q(!K)},children:Object(gf.jsx)(MR.a.Panel,{style:{backgroundColor:"white",border:"none"},header:Object(gf.jsxs)(EY,{children:[Object(gf.jsx)("span",{children:me.t("projectPanel.ProjectDescription",pe)+" | "+me.t("projectPanel.ProjectType",pe)+": "+O.type}),Object(gf.jsxs)("span",{children:[ye&&Object(gf.jsxs)(gf.Fragment,{children:[oe.current&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),te.current=!te.current,q(!K)},children:te.current?Object(gf.jsx)(aY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.MakeDescriptionNonEditable",pe)}):Object(gf.jsx)(oY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.MakeDescriptionEditable",pe)})}),Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),Tf.setState((function(e){e.curateDesignToProjectFlag=!0}))},children:Object(gf.jsx)(iY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.CurateCurrentDesign",pe)})}),E&&E.title===C&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){var t;(e.stopPropagation(),R&&W.uid&&O.title&&C)&&function(e,t,l,a,o,i){var r={lng:Ew.getState().language};return Tf.setState((function(e){e.waiting=!0})),$T.a.firestore().collection("users").doc(e).collection("designs").doc(o).set(Ew.getState().exportContent()).then((function(){if(Tf.getState().setChanged(!1),i){var n=Tw.resizeCanvas(i,a).toDataURL();$T.a.firestore().collection("users").doc(e).collection("projects").doc(l).get().then((function(a){if(a.exists){var i=a.data();if(i){var c=[];c.push.apply(c,Object(h.a)(i.designs));var s,d=-1,p=Object(f.a)(c.entries());try{for(p.s();!(s=p.n()).done;){var y=Object(u.a)(s.value,2),g=y[0];if(y[1].title===o){d=g;break}}}catch(m){p.e(m)}finally{p.f()}d>=0&&(c[d]=aP(t,o,n),$T.a.firestore().collection("users").doc(e).collection("projects").doc(l).update({designs:c}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",r)+": "+e)})).finally((function(){Ew.getState().set((function(e){e.projectInfo.designs=c})),Tf.setState((function(e){e.updateProjectsFlag=!0,e.waiting=!1}))})))}}})).catch((function(e){Qh(me.t("message.CannotFetchProjectData",r)+": "+e)})).finally((function(){}))}}))}(W.uid,O.type,O.title,null!==(t=O.thumbnailWidth)&&void 0!==t?t:200,C,R).then((function(){q(!K)}))},children:Object(gf.jsx)(rY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.UpdateSelectedDesign",pe)})}),E&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),we(),U(void 0)},children:Object(gf.jsx)(nY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.RemoveSelectedDesign",pe)})}),E&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){if(e.stopPropagation(),O.title){var t=Ge+"?client=web&userid="+W.uid+"&project="+encodeURIComponent(O.title);E&&(t+="&title="+encodeURIComponent(E.title)),Zh(t),Bh(me.t("projectListPanel.ProjectLinkGeneratedInClipBoard",pe)+".")}},children:Object(gf.jsx)(cY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectListPanel.GenerateProjectLink",pe)})})]}),O.designs&&O.designs.length>1&&O.selectedProperty&&Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){e.stopPropagation(),D((function(e){e.projectInfo.sortDescending=!e.projectInfo.sortDescending}))},children:O.sortDescending?Object(gf.jsx)(sY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.ClickToFlipSortingOrder",pe)}):Object(gf.jsx)(dY.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.ClickToFlipSortingOrder",pe)})}),Object(gf.jsx)(tD.a,{title:Object(gf.jsx)("div",{onClick:function(e){return e.stopPropagation()},children:me.t("projectPanel.ProjectSettings",pe)}),content:function(){return Object(gf.jsx)("div",{style:{width:"250px"},onClick:function(e){return e.stopPropagation()},children:Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{span:14,style:{paddingTop:"5px"},children:Object(gf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.ThumbnailImageSize",pe),": "]})}),Object(gf.jsx)(NT.a,{span:10,children:Object(gf.jsxs)(db.a,{style:{width:"100%"},value:ce.current,onChange:function(e){ce.current=e,ye?W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({thumbnailWidth:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,e).then((function(){D((function(e){e.projectInfo.thumbnailWidth=ce.current}))})):D((function(e){e.projectInfo.thumbnailWidth=ce.current})),q(!K)},children:[Object(gf.jsx)(FY,{value:100,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Small",pe)})},"small-thumbnail"),Object(gf.jsx)(FY,{value:125,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Medium",pe)})},"medium-thumbnail"),Object(gf.jsx)(FY,{value:200,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Large",pe)})},"large-thumbnail")]})})]})})},children:Object(gf.jsx)(xv.a,{style:{border:"none",padding:"4px"},onClick:function(e){return e.stopPropagation()},children:Object(gf.jsx)(uY.a,{style:{fontSize:"24px",color:"gray"}})})})]})]}),children:Object(gf.jsx)(OY,{title:te.current?void 0:me.t("projectPanel.DoubleClickToMakeDescriptionEditable",pe),bordered:te.current,readOnly:!te.current,value:null!==(j=le.current)&&void 0!==j?j:void 0,onDoubleClick:function(){te.current=!te.current,q(!K)},onChange:function(e){le.current=e.target.value,ae.current=!0,D((function(t){t.projectInfo.description=e.target.value})),q(!K)},onBlur:function(){te.current=!1,ae.current&&W.uid&&ye&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({description:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,le.current).then((function(){ae.current=!1,q(!K)}))},style:{paddingLeft:"10px",textAlign:"left",resize:te.current?"vertical":"none"}})},"1")}),ne.current.length>0&&Object(gf.jsxs)(NY,{children:[Object(gf.jsx)(lY.b,{style:{width:"100%",height:xe/2-(oe.current?160:80),paddingLeft:"4px",paddingRight:"4px",overflowX:"hidden",overflowY:"auto"},grid:{column:ve,gutter:1},dataSource:ne.current,renderItem:function(e){var t,l=e.title.lastIndexOf(" "),a=100===O.thumbnailWidth?8:125===O.thumbnailWidth?12:30;return Object(gf.jsxs)(lY.b.Item,{style:{marginBottom:"-28px"},onMouseOver:function(){G(e)},onMouseLeave:function(){G(void 0)},children:[Object(gf.jsx)("img",{loading:"eager",width:Ae+"px",height:"auto",onError:function(e){e.target.src=wY},onLoad:function(t){D((function(l){l.projectImages.set(e.title,t.target)})),Tf.setState((function(e){e.projectImagesUpdateFlag=!e.projectImagesUpdateFlag}))},alt:e.title,title:(e.timestamp?me.t("word.LastUpdate",pe)+": "+x()(new Date(e.timestamp)).format("MM-DD-YYYY hh:mm A")+"\n":"")+(E===e?me.t("projectPanel.SingleClickToDeselectDoubleClickToOpen",pe):me.t("projectPanel.SingleClickToSelectDoubleClickToOpen",pe)),src:(null===(t=e.thumbnail)||void 0===t?void 0:t.startsWith("data:image/png;base64"))?e.thumbnail:wY,style:{transition:".5s ease",opacity:J===e?.5:1,padding:"1px",cursor:"pointer",borderRadius:E===e?"0":"10px",border:E===e?"2px solid red":"none"},onDoubleClick:function(t){var l=t.target;l.src===wY&&(l.src=e.thumbnailUrl),U(e),O.owner&&cP(O.owner,e.title,!0,!0).then((function(){}))},onClick:function(t){var l=t.target;l.src===wY&&(l.src=e.thumbnailUrl),U(e!==E?e:void 0)}}),Object(gf.jsx)("div",{style:{position:"relative",left:"10px",textAlign:"left",bottom:"18px",color:"white",fontSize:"8px",fontWeight:e.title===C?"bold":"normal"},children:e.title?e.title.length>a?e.title.substring(0,Math.min(a,l))+"..."+e.title.substring(l):e.title:"Unknown"}),Object(gf.jsxs)("div",{style:{position:"relative",right:"10px",textAlign:"right",bottom:"36px",color:"white"},children:[e.title===C&&Object(gf.jsx)(fY.a,{style:{paddingRight:"4px",fontSize:"16px"}}),e.invisible?Object(gf.jsx)(hY.a,{onClick:function(){Qe(e)},style:{fontSize:"16px"},title:me.t("projectPanel.DesignNotShownInSolutionSpaceClickToShow",pe)}):Object(gf.jsx)(pY.a,{onClick:function(){Qe(e)},style:{fontSize:"16px"},title:me.t("projectPanel.DesignShownInSolutionSpaceClickToHide",pe)})]})]})}}),Object(gf.jsxs)(UY,{children:[Object(gf.jsx)("span",{style:{paddingLeft:"20px"},children:me.t("projectPanel.DistributionInSolutionSpace",pe)}),Object(gf.jsxs)("span",{children:[O.type===M.SOLAR_PANEL_ARRAY&&Object(gf.jsx)(tD.a,{title:me.t("projectPanel.ChooseSolutionSpace",pe),onVisibleChange:function(e){re.current&&(e||Tf.setState((function(e){e.updateProjectsFlag=!0})),re.current=!1)},content:Object(gf.jsxs)("div",{children:[Object(gf.jsx)(_v.a,{onChange:function(e){ke.current=e.target.checked,_e(ke.current,"rowWidth"),ee(!_)},checked:ke.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowWidth",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ye.current=e.target.checked,_e(Ye.current,"tiltAngle"),ee(!_)},checked:Ye.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTiltAngle",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Le.current=e.target.checked,_e(Le.current,"interRowSpacing"),ee(!_)},checked:Le.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayRowSpacing",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ee.current=e.target.checked,_e(Ee.current,"latitude"),ee(!_)},checked:Ee.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("word.Latitude",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ue.current=e.target.checked,_e(Ue.current,"orientation"),ee(!_)},checked:Ue.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayOrientation",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ne.current=e.target.checked,_e(Ne.current,"poleHeight"),ee(!_)},checked:Ne.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayPoleHeight",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ve.current=e.target.checked,_e(Ve.current,"unitCost"),ee(!_)},checked:Ve.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.UnitCost",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Je.current=e.target.checked,_e(Je.current,"sellingPrice"),ee(!_)},checked:Je.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("economicsPanel.SellingPrice",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Xe.current=e.target.checked,_e(Xe.current,"totalYearlyCost"),ee(!_)},checked:Xe.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyCost",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Be.current=e.target.checked,_e(Be.current,"totalYearlyYield"),ee(!_)},checked:Be.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayTotalYearlyYield",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){Ke.current=e.target.checked,_e(Ke.current,"meanYearlyYield"),ee(!_)},checked:Ke.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayMeanYearlyYield",pe)})}),Object(gf.jsx)("br",{}),Object(gf.jsx)(_v.a,{onChange:function(e){qe.current=e.target.checked,_e(qe.current,"yearlyProfit"),ee(!_)},checked:qe.current,children:Object(gf.jsx)("span",{style:{fontSize:"12px"},children:me.t("polygonMenu.SolarPanelArrayYearlyProfit",pe)})})]}),children:Object(gf.jsx)(xv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(gf.jsx)(yY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(gf.jsx)(tD.a,{title:me.t("projectPanel.ChooseDataColoring",pe),content:function(){var e;return Object(gf.jsx)("div",{children:Object(gf.jsxs)(tb.a.Group,{onChange:function(e){et(e.target.value)},value:null!==(e=O.dataColoring)&&void 0!==e?e:z.ALL,children:[Object(gf.jsx)(tb.a,{style:{fontSize:"12px"},value:z.ALL,children:me.t("projectPanel.SameColorForAllDesigns",pe)}),Object(gf.jsx)("br",{}),Object(gf.jsx)(tb.a,{style:{fontSize:"12px"},value:z.INDIVIDUALS,children:me.t("projectPanel.OneColorForEachDesign",pe)})]})})}(),children:Object(gf.jsx)(xv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(gf.jsx)(gY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(gf.jsx)(tD.a,{title:me.t("projectPanel.GenerateScatteredPlot",pe),content:Object(gf.jsxs)("div",{style:{width:"280px"},children:[Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"4px"},children:[Object(gf.jsx)(NT.a,{span:8,style:{paddingTop:"5px"},children:Object(gf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.SelectXAxis",pe),": "]})}),Object(gf.jsx)(NT.a,{span:16,children:Object(gf.jsx)(db.a,{style:{width:"100%"},value:se.current,onChange:function(e){se.current=e,ye&&W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({xAxisNameScatteredPlot:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,e).then((function(){})),q(!K)},children:tt()})})]}),Object(gf.jsxs)(UT.a,{gutter:6,style:{paddingBottom:"8px"},children:[Object(gf.jsx)(NT.a,{span:8,style:{paddingTop:"5px"},children:Object(gf.jsxs)("span",{style:{fontSize:"12px"},children:[me.t("projectPanel.SelectYAxis",pe),": "]})}),Object(gf.jsx)(NT.a,{span:16,children:Object(gf.jsx)(db.a,{style:{width:"100%"},value:de.current,onChange:function(e){de.current=e,ye&&W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({yAxisNameScatteredPlot:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,e).then((function(){})),q(!K)},children:tt()})})]}),Object(gf.jsx)(UT.a,{style:{paddingBottom:"8px"},children:Object(gf.jsxs)("div",{children:[Object(gf.jsxs)(MY.a,{id:"scattered-chart",width:280,height:240,margin:{top:0,right:0,bottom:-10,left:-10},children:[Object(gf.jsx)(LW.a,{strokeWidth:"1",stroke:"gray",horizontal:fe.current,vertical:he.current}),Object(gf.jsx)(UW.a,{dataKey:"x",fontSize:10,type:"number",domain:[it.min,it.max],name:"x",unit:nt,strokeWidth:1,stroke:"gray",tickFormatter:function(e,t){return"yearlyProfit"===se.current||"unitCost"===se.current||"sellingPrice"===se.current?"$"+e:e}}),Object(gf.jsx)(VW.a,{dataKey:"y",fontSize:10,type:"number",domain:[rt.min,rt.max],name:"y",unit:ct,strokeWidth:1,stroke:"gray",tickFormatter:function(e,t){return"yearlyProfit"===de.current||"unitCost"===de.current||"sellingPrice"===de.current?"$"+e:e}}),Object(gf.jsx)(YW.a,{cursor:{strokeDasharray:"3 3"},formatter:function(e){return e.toFixed(2)}}),Object(gf.jsx)(WY.a,{name:"All",data:lt,fill:"#8884d8",shape:Object(gf.jsx)(st,{})}),E&&Object(gf.jsx)(WY.a,{name:"Selected",data:at,fill:"red",shape:"star"})]}),Object(gf.jsx)(CY,{symbolSize:ue.current,horizontalGrid:fe.current,verticalGrid:he.current,changeHorizontalGrid:function(e){fe.current=e,q(!K)},changeVerticalGrid:function(e){he.current=e,q(!K)},changeSymbolSize:function(e){ue.current=e,ye&&W.uid&&O.title&&function(e,t,l){var a={lng:Ew.getState().language};return $T.a.firestore().collection("users").doc(e).collection("projects").doc(t).update({dotSizeScatteredPlot:l}).then((function(){})).catch((function(e){Qh(me.t("message.CannotUpdateProject",a)+": "+e)}))}(W.uid,O.title,e).then((function(){})),q(!K)}})]})}),Object(gf.jsx)(UT.a,{children:Object(gf.jsx)("span",{style:{width:"100%",textAlign:"center"},children:Object(gf.jsx)(qC.a,{style:{fontSize:"18px",color:"gray",paddingRight:"8px"},title:me.t("projectPanel.ScatteredPlotScreenshot",pe),onClick:function(){var e=document.getElementById("scattered-chart");e&&Object(RY.saveSvgAsPng)(e,"scattered-chart-"+O.title+".png").then((function(){Kh(me.t("message.ScreenshotSaved",pe))}))}})})})]}),children:Object(gf.jsx)(xv.a,{style:{border:"none",paddingRight:0,background:"white"},children:Object(gf.jsx)(mY.a,{style:{fontSize:"24px",color:"gray"}})})}),Object(gf.jsx)(xv.a,{style:{border:"none",paddingRight:"20px",background:"white"},onClick:function(){var e=document.getElementById("design-space");e&&Object(RY.saveSvgAsPng)(e,"design-space-"+O.title+".png").then((function(){Kh(me.t("message.ScreenshotSaved",pe))}))},children:Object(gf.jsx)(qC.a,{style:{fontSize:"24px",color:"gray"},title:me.t("projectPanel.SolutionSpaceScreenshot",pe)})})]})]}),Object(gf.jsx)(zY,{id:"design-space",width:H*window.innerWidth,height:xe/2-120,data:Me,types:De,minima:Ce,maxima:Oe,steps:Fe,variables:Se,titles:je,units:He,digits:ze,tickIntegers:Re,hover:function(e){O.designs&&e>=0&&e0){Tf.setState((function(e){e.waiting=!0}));var l=new FileReader;l.readAsText(t.files[0]);var o=t.files[0].name;a((function(e){e.localFileName=o})),l.onload=function(){if(l.result){var o=JSON.parse(l.result.toString());e?f&&(a((function(e){e.localContentToImportAfterCloudFileUpdate=o})),Tf.getState().setSaveCloudFileFlag(!0)):i(o)}t.value=""}}},t.click()},I=function(){x(!0),function(){var e=h.trim();if(e.length>0){e.endsWith(".ala")||(e+=".ala");var t=new Blob([JSON.stringify(o())],{type:"application/json"});return Object(Jh.saveAs)(t,e),a((function(t){t.localFileName=e,t.cloudFile=void 0})),!0}return Qh(me.t("menu.file.SavingAbortedMustHaveValidFileName",R)+"."),!1}()&&Tf.setState((function(e){e.saveLocalFileDialogVisible=!1})),x(!1)},C=function(){Tf.setState((function(e){e.saveLocalFileDialogVisible=!1}))};return Object(gf.jsx)(gf.Fragment,{children:Object(gf.jsx)(Zv.a,{title:Object(gf.jsx)("div",{style:{width:"100%",cursor:"move"},onMouseOver:function(){return T(!0)},onMouseOut:function(){return T(!1)},children:me.t("menu.file.SaveAsLocalFile",R)}),footer:f?[Object(gf.jsx)(xv.a,{onClick:function(){f&&a((function(e){e.localFileName=f,e.localFileName.endsWith(".ala")||(e.localFileName+=".ala")}))},children:me.t("menu.file.UseCloudFileName",R)},"Apply"),Object(gf.jsx)(xv.a,{onClick:C,children:me.t("word.Cancel",R)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:I,disabled:!h,children:me.t("word.OK",R)},"OK")]:[Object(gf.jsx)(xv.a,{onClick:C,children:me.t("word.Cancel",R)},"Cancel"),Object(gf.jsx)(xv.a,{type:"primary",onClick:I,disabled:!h,children:me.t("word.OK",R)},"OK")],visible:c,confirmLoading:w,onCancel:C,modalRender:function(e){return Object(gf.jsx)(JT.a,{disabled:!A,bounds:j,onStart:function(e,t){return function(e,t){if(z.current){var l=window.document.documentElement,a=l.clientWidth,o=l.clientHeight,i=z.current.getBoundingClientRect();H({left:-i.left+t.x,right:a-(i.right-t.x),top:-i.top+t.y,bottom:o-((null===i||void 0===i?void 0:i.bottom)-t.y)})}}(0,t)},children:Object(gf.jsx)("div",{ref:z,children:e})})},children:Object(gf.jsx)(ET.a,{placeholder:"File name",value:h,onPressEnter:I,onChange:function(e){a((function(t){t.localFileName=e.target.value}))}})})})},qY=n.a.memo(KY),QY=function(){var e=Ew(Ji),t=Ew((function(e){return e.world})),l=Ew((function(e){return e.elements})),a=Ew((function(e){return e.viewState})),o=Ew((function(e){return e.notes})),i=Tf(Ns),n=Tf(Vs),c=Tf(Mi),s=Tf(Wi),d=Ew(Is),u=Ew(Os),f=Ew(ks),h=Ew(Li),p=new URLSearchParams(window.location.search),y="true"===p.get("viewonly"),g="true"===p.get("map");return Object(r.useEffect)((function(){d(),u(),f(),h(),Tf.setState((function(e){e.openModelsMap=g,g&&(e.modelsMapFlag=!0,e.modelsMapWeatherStations=!1,e.leaderboardFlag=!0,e.showLeaderboard=!0)}))}),[]),Object(r.useEffect)((function(){Tf.getState().skipChange?s(!1):Tf.getState().changed||c(!0)}),[t,a,l,o]),Object(r.useEffect)((function(){i&&Tf.setState((function(e){e.showSolarRadiationHeatmap=!1})),n&&Tf.setState((function(e){e.showHeatFluxes=!1}))}),[t,l]),Object(gf.jsx)(Vw.a,{locale:e,children:Object(gf.jsxs)(Uw,{children:[y?Object(gf.jsx)(BY,{viewOnly:!0}):Object(gf.jsxs)(Nw.a,{onBeforeunload:function(){return""},children:[Object(gf.jsx)(BY,{viewOnly:!1})," "]}),Object(gf.jsx)(qY,{viewOnly:y})]})})};s.a.render(Object(gf.jsx)(n.a.StrictMode,{children:Object(gf.jsx)(QY,{})}),document.getElementById("root"))}},[[791,1,2]]]); +//# sourceMappingURL=main.c62f7be7.chunk.js.map \ No newline at end of file diff --git a/static/js/main.d3157261.chunk.js.map b/static/js/main.c62f7be7.chunk.js.map similarity index 56% rename from static/js/main.d3157261.chunk.js.map rename to static/js/main.c62f7be7.chunk.js.map index c139f7cd6..8452b7ec2 100644 --- a/static/js/main.d3157261.chunk.js.map +++ b/static/js/main.c62f7be7.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["i18n/i18n.ts","i18n/en.ts","i18n/zh_cn.ts","i18n/zh_tw.ts","i18n/es.ts","i18n/tr.ts","i18n/ua.ts","types.ts","resources/weather.csv","resources/solar_radiation_horizontal.csv","resources/solar_radiation_vertical.csv","resources/pvmodules.csv","js/MyOrbitControls.js","js/ParabolicCylinderGeometry.js","js/ParaboloidGeometry.js","js/ConvexGeometry.js","models/WallModel.ts","constants.ts","models/Rectangle.ts","models/RoofModel.ts","models/WindowModel.ts","stores/commonRef.ts","resources/jaah.png","resources/jack.png","resources/jacob.png","resources/jacqueline.png","resources/jade.png","resources/jamelia.png","resources/james.png","resources/jane.png","resources/jaya.png","resources/jaye.png","resources/jeanette.png","resources/jedi.png","resources/jeff.png","resources/jena.png","resources/jennifer.png","resources/jess.png","resources/jett.png","resources/jill.png","resources/jiya.png","resources/joan.png","resources/jocelyn.png","resources/joel.png","resources/joey.png","resources/john.png","resources/jonathon.png","resources/jose.png","resources/joseph.png","resources/joshua.png","resources/judd.png","resources/judy.png","resources/julia.png","resources/julio.png","resources/jumapili.png","resources/june.png","resources/juro.png","resources/justin.png","HumanData.ts","resources/no_leaf_shrub.png","resources/bellflower.png","resources/boxwood.png","resources/cactus_combo_1.png","resources/cactus_combo_2.png","resources/cactus_combo_3.png","resources/cactus_combo_4.png","resources/hibiscus.png","resources/hydrangea.png","resources/hosta.png","resources/peony.png","resources/red_rose.png","resources/spirea.png","resources/sunflower.png","resources/tall_bush.png","resources/tulip.png","resources/white_flower.png","resources/yellow_flower.png","FlowerData.ts","resources/no_leaf_flower.png","models/ElementModelFactory.ts","stores/selector/solarPanelArrayLayoutParams.ts","stores/selector/viewState.ts","stores/selector/world.ts","stores/selector/index.ts","views/elementGrid.tsx","views/window/windowResizeHandle.tsx","views/window/windowMoveHandle.tsx","stores/commonPrimitive.ts","stores/commonData.ts","resources/tiny_white_square.png","resources/roof_01.png","resources/roof_02.png","resources/roof_03.png","resources/roof_04.png","resources/roof_05.png","resources/roof_06.png","resources/roof_07.png","views/window/archedWindow.tsx","views/window/polygonalWindow.tsx","views/roof/roofSegment.tsx","views/roof/ceiling.tsx","views/hooks.ts","views/roof/pyramidRoof.tsx","views/roof/gambrelRoof.tsx","views/roof/gableRoof.tsx","views/roof/hipRoof.tsx","views/roof/mansardRoof.tsx","helpers.ts","resources/wall_edge.png","resources/wall_01.png","resources/wall_03.png","resources/wall_04.png","resources/wall_05.png","resources/wall_06.png","resources/wall_07.png","resources/wall_08.png","resources/wall_09.png","resources/wall_10.png","views/wall/hooks.ts","resources/wall_02.png","views/SharedUtil.ts","views/roof/roofRenderer.tsx","undo/UndoableAdd.ts","views/roof/hooks.ts","resources/roof_edge.png","views/roof/flatRoof.tsx","resources/foundation_01.png","resources/foundation_02.png","resources/foundation_03.png","resources/foundation_04.png","resources/foundation_05.png","resources/foundation_06.png","resources/foundation_07.png","fonts/helvetiker_regular.typeface.fnt","views/polarGrid.tsx","components/rotateHandle.tsx","components/wireframe.tsx","views/horizontalRuler.tsx","analysis/analysisConstants.ts","models/DoorModel.ts","analysis/SunMinutes.ts","analysis/sunTools.ts","views/solarUpdraftTower.tsx","resources/glow.png","views/solarPowerTower.tsx","views/solarReceiverPipe.tsx","stores/InnerCommonState.ts","views/solarPanel/hooks.tsx","views/solarPanel/solarPanelOnRoof.tsx","views/wall/emptyWall.tsx","views/wall/wallMoveHandleWrapper.tsx","views/wall/wallResizeHandleWrapper.tsx","views/wall/wallRenderer.tsx","views/foundation/buildingRenderer.tsx","views/foundation/foundation.tsx","views/window/windowHandleWrapper.tsx","views/window/rectangleWindow.tsx","views/rulerOnWall.tsx","views/window/window.tsx","views/wall/wallWireFrame.tsx","views/door/rectangleDoor.tsx","views/door/archedDoor.tsx","resources/door_edge.png","resources/door_01.png","resources/door_02.png","resources/door_03.png","resources/door_04.png","resources/door_05.png","resources/door_06.png","resources/door_07.png","resources/door_08.png","resources/door_09.png","resources/door_10.png","resources/door_11.png","resources/door_12.png","resources/door_13.png","resources/door_14.png","resources/door_15.png","resources/door_16.png","resources/door_17.png","views/door/door.tsx","views/door/hooks.ts","views/solarPanel/solarPanelOnWall.tsx","resources/polygon_08.png","resources/polygon_09.png","resources/polygon_10.png","views/polygon.tsx","views/wall/parapet.tsx","views/wall/wall.tsx","views/wall/wallHeatFlux.tsx","views/roof/RoofUtil.ts","models/Stackable.ts","resources/building_facade_01.png","views/cuboid/handles.tsx","resources/building_facade_02.png","resources/building_facade_03.png","resources/building_facade_04.png","resources/building_facade_05.png","resources/building_facade_06.png","resources/building_facade_07.png","resources/building_facade_08.png","resources/building_facade_09.png","resources/building_facade_10.png","components/moveHandle.tsx","components/resizeHandle.tsx","views/solarPanel/solarPanelOnCuboid.tsx","views/cuboid/cuboid.tsx","views/sensor.tsx","views/light.tsx","views/cuboid/index.tsx","Util.ts","stores/DefaultWorldModel.ts","models/ElementModelCloner.ts","stores/DefaultViewState.ts","undo/UndoManager.ts","stores/DefaultSolarPanelArrayLayoutParams.ts","stores/ElementCounter.ts","stores/DefaultGeneticAlgorithmParams.ts","stores/DefaultParticleSwarmOptimizationParams.ts","stores/DefaultEvolutionaryAlgorithmState.ts","stores/DefaultSolarPanelArrayLayoutConstraints.ts","stores/DefaultEconomicsParams.ts","stores/DefaultActionState.ts","stores/DefaultGraphState.ts","panels/ProjectUtil.ts","stores/StoreUtil.ts","models/Groupable.ts","stores/common.ts","ErrorPage.tsx","resources/daysky.jpg","resources/desert.jpg","resources/dune.jpg","resources/forest.jpg","resources/grassland.jpg","resources/hill-spring.jpg","resources/hill-summer.jpg","resources/hill-fall.jpg","resources/hill-winter.jpg","resources/lake.jpg","resources/mountain.jpg","resources/rural.jpg","views/sky.tsx","views/axes.tsx","views/human.tsx","resources/apple_spring.png","resources/apple_summer.png","resources/apple_fall.png","resources/apple_winter.png","resources/birch_spring.png","resources/birch_summer.png","resources/birch_fall.png","resources/birch_winter.png","resources/coconut.png","resources/dogwood_spring.png","resources/dogwood_summer.png","resources/dogwood_fall.png","resources/dogwood_winter.png","resources/elm_spring.png","resources/elm_summer.png","resources/elm_fall.png","resources/elm_winter.png","resources/fan_palm.png","resources/linden_spring.png","resources/linden_summer.png","resources/linden_fall.png","resources/linden_winter.png","resources/magnolia_spring.png","resources/magnolia_summer.png","resources/magnolia_fall.png","resources/magnolia_winter.png","resources/maple_spring.png","resources/maple_summer.png","resources/maple_fall.png","resources/maple_winter.png","resources/oak_spring.png","resources/oak_summer.png","resources/oak_fall.png","resources/oak_winter.png","resources/pine.png","resources/spruce.png","TreeData.ts","views/tree.tsx","views/shapes.tsx","analysis/heatTools.ts","views/parabolicTrough.tsx","views/parabolicDish.tsx","views/fresnelReflector.tsx","views/heliostat.tsx","views/solarPanel/solarPanel.tsx","views/flower.tsx","panels/simulationControlPanel.tsx","panels/evolutionControlPanel.tsx","components/spinner.tsx","waiting.tsx","elementsRenderer.tsx","views/ground.tsx","views/heliodon.tsx","views/heliodonWrapper.tsx","assets/ifi-logo.png","assets/magic-lamp.png","team.tsx","about.tsx","components/contextMenu/elementMenu/cspSimulationSettings.tsx","components/contextMenu/elementMenu/pvSimulationSettings.tsx","components/contextMenu/elementMenu/sutSimulationSettings.tsx","components/contextMenu/elementMenu/buildingEnergySimulationSettings.tsx","assets/map_residential_building.png","assets/map_commercial_building.png","assets/map_school_building.png","assets/map_tourist_attraction.png","assets/map_solar_panel.png","assets/map_parabolic_dish.png","assets/map_parabolic_trough.png","assets/map_fresnel_reflector.png","assets/map_heliostat.png","assets/map_under_construction.png","assets/map_marker.png","components/contextMenu/elementMenu/modelSiteDialog.tsx","components/contextMenu/elementMenu/createNewProjectDialog.tsx","cloudProjectUtil.ts","cloudFileUtil.ts","mainMenu.tsx","examples.ts","acceptCookie.tsx","views/groundImage.tsx","components/contextMenu/menuItems.tsx","components/contextMenu/elementMenu/menuHooks.ts","components/contextMenu/dialog.tsx","components/contextMenu/elementMenu/foundationColorSelection.tsx","components/contextMenu/elementMenu/foundationLengthInput.tsx","components/contextMenu/elementMenu/foundationWidthInput.tsx","components/contextMenu/elementMenu/foundationHeightInput.tsx","components/contextMenu/elementMenu/foundationAzimuthInput.tsx","resources/foundation_01_menu.png","resources/foundation_02_menu.png","resources/foundation_03_menu.png","resources/foundation_04_menu.png","resources/foundation_05_menu.png","resources/foundation_06_menu.png","resources/foundation_07_menu.png","components/contextMenu/elementMenu/foundationTextureSelection.tsx","components/contextMenu/elementMenu/solarAbsorberPipeHeightInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipeAbsorptanceInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipeOpticalEfficiencyInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipeThermalEfficiencyInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipeApertureWidthInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipePoleNumberInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerChimneyHeightInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerChimneyRadiusInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerCollectorRadiusInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerCollectorHeightInput.tsx","components/contextMenu/elementMenu/solarPowerTowerHeightInput.tsx","components/contextMenu/elementMenu/solarPowerTowerRadiusInput.tsx","components/contextMenu/elementMenu/solarPowerTowerReceiverAbsorptanceInput.tsx","components/contextMenu/elementMenu/solarPowerTowerReceiverOpticalEfficiencyInput.tsx","components/contextMenu/elementMenu/solarPowerTowerReceiverThermalEfficiencyInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerCollectorTransmissivityInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerDischargeCoefficientInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerTurbineEfficiencyInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerCollectorEmissivityInput.tsx","components/contextMenu/elementMenu/solarPanelTiltAngleGaWizard.tsx","components/contextMenu/elementMenu/solarPanelTiltAnglePsoWizard.tsx","components/contextMenu/elementMenu/groundFloorRValueInput.tsx","components/contextMenu/elementMenu/foundationMenu.tsx","components/contextMenu/elementMenu/cuboidColorSelection.tsx","components/contextMenu/elementMenu/cuboidLengthInput.tsx","components/contextMenu/elementMenu/cuboidWidthInput.tsx","components/contextMenu/elementMenu/cuboidHeightInput.tsx","components/contextMenu/elementMenu/cuboidAzimuthInput.tsx","resources/building_facade_05_menu.png","resources/building_facade_06_menu.png","resources/building_facade_10_menu.png","components/contextMenu/elementMenu/cuboidTextureSelection.tsx","resources/building_facade_01_menu.png","resources/building_facade_02_menu.png","resources/building_facade_03_menu.png","resources/building_facade_04_menu.png","resources/building_facade_07_menu.png","resources/building_facade_08_menu.png","resources/building_facade_09_menu.png","components/contextMenu/elementMenu/cuboidMenu.tsx","components/contextMenu/elementMenu/groundMenu.tsx","components/contextMenu/elementMenu/humanSelection.tsx","components/contextMenu/elementMenu/humanMenu.tsx","components/contextMenu/elementMenu/flowerSelection.tsx","components/contextMenu/elementMenu/flowerMenu.tsx","components/contextMenu/elementMenu/polygonLineColorSelection.tsx","components/contextMenu/elementMenu/polygonFillColorSelection.tsx","resources/polygon_08_menu.png","resources/polygon_10_menu.png","components/contextMenu/elementMenu/polygonTextureSelection.tsx","resources/polygon_09_menu.png","pd/SolarPanelLayoutRelative.ts","pd/SolarPanelLayoutAbsolute.ts","components/contextMenu/elementMenu/solarPanelLayoutWizard.tsx","components/contextMenu/elementMenu/polygonLineStyleSelection.tsx","components/contextMenu/elementMenu/polygonLineWidthSelection.tsx","components/contextMenu/elementMenu/solarPanelArrayGaWizard.tsx","components/contextMenu/elementMenu/solarPanelArrayPsoWizard.tsx","components/contextMenu/elementMenu/polygonOpacityInput.tsx","components/contextMenu/elementMenu/polygonMenu.tsx","components/contextMenu/elementMenu/polygonVertexMenu.tsx","components/contextMenu/elementMenu/sensorMenu.tsx","components/contextMenu/elementMenu/lightMenu.tsx","components/contextMenu/elementMenu/skyMenu.tsx","models/SolarPanelNominalSize.ts","components/contextMenu/elementMenu/solarPanelModelSelection.tsx","components/contextMenu/elementMenu/wallMenu.tsx","components/contextMenu/elementMenu/solarPanelOrientationSelection.tsx","components/contextMenu/elementMenu/solarPanelLengthInput.tsx","components/contextMenu/elementMenu/solarPanelWidthInput.tsx","components/contextMenu/elementMenu/solarPanelTiltAngleInput.tsx","components/contextMenu/elementMenu/solarPanelRelativeAzimuthInput.tsx","components/contextMenu/elementMenu/solarPanelTrackerSelection.tsx","components/contextMenu/elementMenu/solarPanelPoleHeightInput.tsx","components/contextMenu/elementMenu/solarPanelPoleSpacingInput.tsx","components/contextMenu/elementMenu/solarPanelFrameColorSelection.tsx","components/contextMenu/elementMenu/solarPanelInverterEfficiencyInput.tsx","components/contextMenu/elementMenu/solarPanelDcToAcRatioInput.tsx","components/contextMenu/elementMenu/solarPanleMenu.tsx","components/contextMenu/elementMenu/parabolicTroughLengthInput.tsx","components/contextMenu/elementMenu/parabolicTroughWidthInput.tsx","components/contextMenu/elementMenu/parabolicTroughPoleHeightInput.tsx","components/contextMenu/elementMenu/parabolicTroughLatusRectumInput.tsx","components/contextMenu/elementMenu/parabolicTroughModuleLengthInput.tsx","components/contextMenu/elementMenu/parabolicTroughReflectanceInput.tsx","components/contextMenu/elementMenu/parabolicTroughAbsorptanceInput.tsx","components/contextMenu/elementMenu/parabolicTroughOpticalEfficiencyInput.tsx","components/contextMenu/elementMenu/parabolicTroughThermalEfficiencyInput.tsx","components/contextMenu/elementMenu/parabolicTroughMenu.tsx","components/contextMenu/elementMenu/parabolicDishDiameterInput.tsx","components/contextMenu/elementMenu/parabolicDishPoleHeightInput.tsx","components/contextMenu/elementMenu/parabolicDishLatusRectumInput.tsx","components/contextMenu/elementMenu/parabolicDishReflectanceInput.tsx","components/contextMenu/elementMenu/parabolicDishAbsorptanceInput.tsx","components/contextMenu/elementMenu/parabolicDishOpticalEfficiencyInput.tsx","components/contextMenu/elementMenu/parabolicDishThermalEfficiencyInput.tsx","components/contextMenu/elementMenu/parabolicDishStructureTypeInput.tsx","components/contextMenu/elementMenu/parabolicDishPoleRadiusInput.tsx","components/contextMenu/elementMenu/parabolicDishMenu.tsx","components/contextMenu/elementMenu/fresnelReflectorLengthInput.tsx","components/contextMenu/elementMenu/fresnelReflectorWidthInput.tsx","components/contextMenu/elementMenu/fresnelReflectorPoleHeightInput.tsx","components/contextMenu/elementMenu/fresnelReflectorModuleLengthInput.tsx","components/contextMenu/elementMenu/fresnelReflectorReflectanceInput.tsx","components/contextMenu/elementMenu/fresnelReflectorAbsorberSelection.tsx","components/contextMenu/elementMenu/fresnelReflectorDrawSunBeamSelection.tsx","components/contextMenu/elementMenu/fresnelReflectorMenu.tsx","components/contextMenu/elementMenu/heliostatWidthInput.tsx","components/contextMenu/elementMenu/heliostatLengthInput.tsx","components/contextMenu/elementMenu/heliostatPoleHeightInput.tsx","components/contextMenu/elementMenu/heliostatReflectorReflectanceInput.tsx","components/contextMenu/elementMenu/heliostatDrawSunBeamSelection.tsx","components/contextMenu/elementMenu/heliostatTowerSelection.tsx","components/contextMenu/elementMenu/heliostatPoleRadiusInput.tsx","components/contextMenu/elementMenu/heliostatMenu.tsx","components/contextMenu/elementMenu/treeSelection.tsx","components/contextMenu/elementMenu/treeMenu.tsx","resources/wall_01_menu.png","resources/wall_02_menu.png","resources/wall_03_menu.png","resources/wall_04_menu.png","resources/wall_05_menu.png","resources/wall_06_menu.png","resources/wall_07_menu.png","resources/wall_08_menu.png","resources/wall_09_menu.png","resources/wall_10_menu.png","components/contextMenu/elementMenu/wallTextureSelection.tsx","components/contextMenu/elementMenu/wallColorSelection.tsx","components/contextMenu/elementMenu/wallStructureColorSelection.tsx","components/contextMenu/elementMenu/wallNumberInput.tsx","components/contextMenu/elementMenu/wallRValueInput.tsx","components/contextMenu/elementMenu/wallHeatCapacityInput.tsx","components/contextMenu/elementMenu/wallParapetNumberInput.tsx","components/contextMenu/elementMenu/wallParapetColorSelection.tsx","components/contextMenu/elementMenu/wallParapetTextureSelection.tsx","components/contextMenu/elementMenu/windowMenu.tsx","components/contextMenu/elementMenu/doorTextureSelection.tsx","components/contextMenu/elementMenu/doorColorSelection.tsx","components/contextMenu/elementMenu/doorUValueInput.tsx","components/contextMenu/elementMenu/doorWidthInput.tsx","components/contextMenu/elementMenu/doorHeightInput.tsx","components/contextMenu/elementMenu/doorHeatCapacityInput.tsx","components/contextMenu/elementMenu/doorOpacityInput.tsx","components/contextMenu/elementMenu/doorFrameColorSelection.tsx","components/contextMenu/elementMenu/doorMenu.tsx","components/contextMenu/elementMenu/windowColorSelection.tsx","components/contextMenu/elementMenu/windowNumberInput.tsx","components/contextMenu/elementMenu/windowUValueInput.tsx","components/contextMenu/elementMenu/windowOptionSelection.tsx","components/contextMenu/elementMenu/windowBooleanSelection.tsx","assets/menu.svg","resources/roof_01_menu.png","resources/roof_02_menu.png","resources/roof_03_menu.png","resources/roof_04_menu.png","resources/roof_05_menu.png","resources/roof_06_menu.png","resources/roof_07_menu.png","components/contextMenu/elementMenu/roofTextureSelection.tsx","resources/roof_edge_menu.png","components/contextMenu/elementMenu/roofColorSelection.tsx","components/contextMenu/elementMenu/roofThicknessInput.tsx","components/contextMenu/elementMenu/roofRafterSpacingInput.tsx","components/contextMenu/elementMenu/roofOpacityInput.tsx","components/contextMenu/elementMenu/glassTintSelection.tsx","components/contextMenu/elementMenu/roofRafterColorSelection.tsx","components/contextMenu/elementMenu/roofRafterWidthInput.tsx","components/contextMenu/elementMenu/roofSideColorSelection.tsx","components/contextMenu/elementMenu/roofRValueInput.tsx","components/contextMenu/elementMenu/roofRiseInput.tsx","components/contextMenu/elementMenu/roofHeatCapacityInput.tsx","components/contextMenu/elementMenu/ceilingRValueInput.tsx","components/contextMenu/elementMenu/roofMenu.tsx","components/contextMenu/index.tsx","assets/delete.png","panels/cloudFilePanel.tsx","assets/rename.png","assets/create_link.png","panels/likesPanel.tsx","panels/publishedModelsPanel.tsx","panels/accountSettingsPanel.tsx","assets/empty_heart.png","components/modelsMap.tsx","assets/open_file.png","assets/export_link.png","assets/red_heart.png","assets/click_count.png","modelsGallery.tsx","assets/image_load_failure.png","modelsMapWrapper.tsx","assets/foundation.png","assets/cuboid.png","assets/sensor.png","assets/solar-panel.png","assets/wall.png","assets/window.png","assets/door.png","assets/pyramid_roof.png","assets/hip_roof.png","assets/gambrel_roof.png","assets/mansard_roof.png","assets/gable_roof.png","assets/tree.png","assets/flower.png","assets/human.png","assets/parabolic_trough.png","assets/parabolic_dish.png","assets/fresnel_reflector.png","assets/heliostat.png","assets/led_light.png","mainToolBarButtons.tsx","assets/tiny_lock.png","assets/select.png","assets/group.png","assets/wind_turbine.png","assets/clear.png","assets/analyze.png","assets/heliodon.png","mainToolBar.tsx","saveCloudFileModal.tsx","panels/projectListPanel.tsx","cloudManager.tsx","actionLogger.tsx","lights.tsx","views/verticalRuler.tsx","auxiliary.tsx","compassContainer.tsx","keyboardListener.tsx","sceneRadiusCalculator.tsx","cameraController.tsx","shareLinks.tsx","ai/ga/algorithm/Individual.ts","ai/ga/algorithm/Parents.ts","ai/ga/algorithm/Population.ts","ai/ga/algorithm/OptimizerGa.ts","Random.ts","ai/ga/algorithm/SolarPanelTiltAngleOptimizerGa.ts","ai/ga/solarPanelTiltAngleGa.tsx","ai/ga/algorithm/SolarPanelArrayOptimizerGa.ts","ai/ga/solarPanelArrayGa.tsx","ai/pso/algorithm/Particle.ts","ai/pso/algorithm/Swarm.ts","ai/pso/algorithm/OptimizerPso.ts","ai/pso/algorithm/SolarPanelTiltAngleOptimizerPso.ts","ai/pso/solarPanelTiltAnglePso.tsx","ai/pso/algorithm/SolarPanelArrayOptimizerPso.ts","ai/pso/solarPanelArrayPso.tsx","navigationController.tsx","components/groundMap.tsx","panels/mapPanel.tsx","panels/heliodonPanel.tsx","components/symbols.tsx","components/barGraphMenu.tsx","components/barGraph.tsx","components/groupMaster/groupMaster.tsx","components/lineGraphMenu.tsx","components/lineGraph.tsx","panels/weatherPanel.tsx","panels/yearlyLightSensorPanel.tsx","panels/dailyLightSensorPanel.tsx","panels/stickyNotePanel.tsx","panels/instructionPanel.tsx","panels/yearlyPvYieldPanel.tsx","panels/dailyPvYieldPanel.tsx","panels/designInfoPanel.tsx","assets/light_bulb.png","assets/diameter.png","assets/area.png","panels/siteInfoPanel.tsx","assets/location.png","assets/date.png","assets/thermometer.png","panels/visualizationControlPanel.tsx","panels/visibilityResultsPanel.tsx","panels/yearlyParabolicTroughYieldPanel.tsx","panels/dailyParabolicTroughYieldPanel.tsx","panels/dailyParabolicDishYieldPanel.tsx","panels/yearlyParabolicDishYieldPanel.tsx","panels/dailyFresnelReflectorYieldPanel.tsx","panels/yearlyFresnelReflectorYieldPanel.tsx","panels/dailyHeliostatYieldPanel.tsx","panels/yearlyHeliostatYieldPanel.tsx","components/sutBiaxialLineGraph.tsx","panels/dailySolarUpdraftTowerYieldPanel.tsx","panels/diurnalTemperaturePanel.tsx","panels/yearlySolarUpdraftTowerYieldPanel.tsx","components/evolutionBiaxialLineGraph.tsx","panels/solarPanelOptimizationResult.tsx","panels/economicsPanel.tsx","analysis/energyHooks.ts","components/buildingEnergyGraphMenu.tsx","components/buildingEnergyGraph.tsx","panels/dailyBuildingEnergyPanel.tsx","panels/yearlyBuildingEnergyPanel.tsx","panels/navigationPanel.tsx","panels.tsx","analysis/SolarRadiation.ts","analysis/thermalSimulation.tsx","analysis/staticSolarRadiationSimulation.tsx","analysis/dynamicSolarRadiationSimulation.tsx","analysis/parabolicTroughSimulation.tsx","analysis/parabolicDishSimulation.tsx","analysis/fresnelReflectorSimulation.tsx","analysis/heliostatSimulation.tsx","analysis/solarUpdraftTowerSimulation.tsx","analysis/Vantage.ts","analysis/solarPanelVisibility.tsx","analysis/sensorSimulation.tsx","analysis/solarPanelSimulation.tsx","simulations.tsx","assets/image_fail_try_again.png","components/verticalAxis.tsx","components/parallelCoordinates.tsx","components/scatteredPlotMenu.tsx","panels/projectGallery.tsx","components/groupMaster/index.tsx","appCreator.tsx","assets/cloud.png","localFileManager.tsx","app.tsx","index.tsx"],"names":["i18n","use","LanguageDetector","initReactI18next","init","debug","fallbackLng","interpolation","escapeValue","resources","en","translation","name","IFI","Aladdin","Tagline","cookie","Statement","Accept","aboutUs","ProductBroughtToYouBy","TermsOfService","PrivacyPolicy","Software","Content","Research","Support","Acknowledgment","FundingInformation","Contact","Translators","word","LastUpdate","Small","Medium","Large","Design","Information","Type","Text","FontSize","FontColor","Model","Models","Upload","ClickCount","Share","AlreadyLike","Like","MustLogInToLike","AllRightsReserved","MeterAbbreviation","Version","VersionInitial","Options","Maximum","Minimum","MaximumNumber","MinimumNumber","MaximumValue","MinimumValue","Or","None","High","Partial","Teacher","Class","Total","Leaderboard","Latest","Range","SIUnit","USUnit","ThermalTransmittance","ThermalResistance","UValue","RValue","VolumetricHeatCapacity","BuildingHVACSystem","ThermostatSetpoint","TemperatureToleranceThreshold","TemperatureToleranceThresholdExplanation","Press","Open","Save","SaveAsImage","SaveAsCsv","Update","Paste","Copy","Cut","Delete","Lock","Translucent","Color","Texture","Size","Thickness","Yes","No","OK","Cancel","Apply","Close","ApplyTo","Run","Pause","Resume","Clear","Warning","Caution","Reminder","Length","Width","Height","Radius","Angle","Azimuth","Coordinates","Weather","Show","Animate","Date","Time","Title","Owner","Action","Rename","Location","Latitude","Month","Day","Hour","Daylight","Radiation","Temperature","kWh","dollar","MeterPerSecond","NorthInitial","SouthInitial","EastInitial","WestInitial","Fixed","Elements","Energy","Unknown","Label","Description","NoDescription","MaximumCharacters","Author","Publisher","Building","ResidentialBuilding","CommercialBuilding","SchoolBuilding","TouristAttraction","UnderConstruction","Photovoltaic","Anonymous","Nickname","Pin","Unpin","shared","NoTexture","FoundationElement","CuboidElement","PolygonElement","SensorElement","SolarPanelElement","WaterHeaterElement","ParabolicDishElement","ParabolicTroughElement","FresnelReflectorElement","HeliostatElement","WindTurbineElement","LightElement","ElementLocked","ModelType","OutputBreakdown","MoreResults","message","ModelNotFound","CannotSignIn","CannotSignOut","YourAccountWasCreated","CannotCreateAccount","YourAccountSettingsWereSaved","CannotSaveYourAccountSettings","CannotSaveYourFileToCloud","CannotCreateNewProject","CannotCreateNewProjectWithoutTitle","CannotOpenYourProjects","CannotOpenProject","CannotDeleteProject","CannotRenameProject","CannotAddDesignToProject","CannotAddDesignToProjectOwnedByOthers","DesignRemovedFromProject","CannotRemoveDesignFromProject","CannotUpdateProject","CannotFetchProjectData","TitleUsedChooseDifferentOne","CloudFileWithTitleExistsDoYouWantToOverwrite","CloudFileNotFound","CannotLoadModelsOnMap","CannotLoadLeaderboard","CannotPublishModelOnMap","CannotLikeModelFromMap","CannotDeleteModelFromMap","ModelDeletedFromMap","DoYouWantToDeleteModelFromMap","CannotOpenCloudFile","CannotReadCloudFile","CannotWriteCloudFile","CloudFileCopied","CannotOpenCloudFolder","CannotDeleteCloudFile","CannotRenameCloudFile","DoYouWantToSaveChanges","NotApplicableToSelectedAction","ThisElementIsLocked","ThisCannotBeUndone","AzimuthOfNorthIsZero","CounterclockwiseAzimuthIsPositive","MoveCancelledBecauseOfOverlap","MoveOutsideBoundaryCancelled","RotationCancelledBecauseOfOverlap","RotationOutsideBoundaryCancelled","ResizingCancelledBecauseOfOverlap","ResizingOutsideBoundaryCancelled","CannotPasteOutsideBoundary","CannotPasteBecauseOfOverlap","CannotMoveObjectTooFar","ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout","DoYouWantToContinue","SolarPanelsCannotIntersectWithGround","SolarPanelsCannotOverlapWithOneAnother","ScreenshotSaved","CsvFileSaved","SimulationStarted","SimulationCompleted","SimulationAborted","SimulationPaused","CancelSimulation","PauseSimulation","ResumeSimulation","SimulationWillNotStartDueToErrors","SimulationWillStartDespiteWarnings","EvolutionStarted","EvolutionCompleted","EvolutionAborted","EvolutionPaused","EncounterEvolutionError","CancelEvolution","PauseEvolution","ResumeEvolution","ConvergenceThresholdHasBeenReached","MaximumNumberOfGenerationsHasBeenReached","MaximumNumberOfStepsHasBeenReached","ObjectiveFunctionTypeError","WallsAreNotAtSameHeight","WallsAreNotPerpendicular","WallsAreNotConnected","WallsNumberNeedToBeFour","BuildingContainsEmptyWall","BuildingRoofMissing","UnknownErrors","menu","AnalysisOptions","option","GridCellSize","SamplingFrequency","TimesPerHour","DaysPerYear","mainMenu","cloudMenu","projectSubMenu","project","CreateNewProject","OpenProject","SaveProjectAs","YouMustLogInToCreateProject","YouMustLogInToOpenProject","fileSubMenu","file","CreateNewFile","OpenLocalFile","SaveAsLocalFile","SavingAbortedMustHaveValidFileName","OpenCloudFile","SaveCloudFile","SaveAsCloudFile","SavingAbortedMustHaveValidTitle","ToSaveYourWorkPleaseSignIn","TakeScreenshot","UseCloudFileName","PublishOnModelsMap","PublishedOnModelsMap","UpdatedOnModelsMap","YouMustLogInToPublishYourModel","YouCannotPublishAModelThatYouDoNotOwn","YouMustSaveModelOnCloudBeforePublishingIt","editSubMenu","edit","Undo","Redo","viewSubMenu","view","NavigationView","TwoDimensionalView","ResetView","ZoomIn","ZoomOut","AutoRotate","ShowShadow","ShowSurfaceShininess","TranslucentFloatingWindows","accessoriesSubMenu","accessories","SiteInformation","DesignInformation","Instruction","StickyNote","Note","settingsSubMenu","settings","WeatherData","DiurnalTemperature","Heliodon","SunAndTime","benchmarksSubMenu","benchmarks","SolarRadiationPredictionVsMeasurement","BESTESTCase600","BESTESTCase610","BESTESTCase620","BESTESTCase630","graph","LineWidth","SymbolSize","BarCategoryGap","ShowHorizontalGridLines","ShowVerticalGridLines","analysisSubMenu","physicsSubMenu","physics","DailySolarRadiationHeatmap","SolarRadiationHeatmapOptions","SolarRadiationHeatmapGridCellSize","SolarRadiationHeatmapMaxValue","SolarRadiationHeatmapNoAnimation","ReflectionHeatmap","sensorSubMenu","sensor","CollectDailyData","CollectYearlyData","SensorSimulationNoAnimation","buildingSubMenu","building","AnalyzeDailyBuildingEnergy","AnalyzeYearlyBuildingEnergy","EnergyAnalysisOptions","EnergyGridCellSize","BuildingEnergySimulationNoAnimation","solarPanelSubMenu","solarPanel","AnalyzeDailyYield","AnalyzeYearlyYield","AnalyzeVisibility","PanelDiscretization","Exact","Approximate","VisibilityGridCellSize","VisibilityAnalysisOptions","SolarPanelSimulationNoAnimation","parabolicTroughSubMenu","parabolicTrough","parabolicDishSubMenu","parabolicDish","fresnelReflectorSubMenu","fresnelReflector","heliostatSubMenu","heliostat","solarUpdraftTowerSubMenu","solarUpdraftTower","SolarUpdraftTowerSimulationNoAnimation","tutorialsSubMenu","solarEnergyScienceSubMenu","solarEnergyScienceTutorials","SunAngles","InsolationAndClimate","SolarRadiationToBox","buildingScienceSubMenu","buildingScienceTutorials","ThermalEnvelopeVsBuildingEnvelope","EffectOfSizeOnBuildingEnergy","EffectOfOrientationOnBuildingEnergy","EffectOfInsulationOnBuildingEnergy","EffectOfRoofColorOnBuildingEnergy","EffectOfEavesOverhangLengthOnBuildingEnergy","EffectOfWindowSHGCOnBuildingEnergy","EffectOfThermostatSetpointOnBuildingEnergy","EffectOfSolarPanelsOnBuildingEnergy","EffectOfGroundTemperatureOnBuildingEnergy","EffectOfTreesOnBuildingEnergy","buildingDesignSubMenu","buildingDesignTutorials","CapeCodStyleHouseWithShedDormer","MansardRoofWithDormers","GableRoofVsHipRoof","ColonialVsSaltbox","GambrelRoofVsMansardRoof","CombinationRoofVsBonnetRoof","DutchGableRoof","GableAndValleyRoof","ClerestoryRoof","MonitorRoof","AFrameHouse","HalfTimberedHouse","AllBasicRoofTypes","photovoltaicSolarPowerSubMenu","photovoltaicSolarPowerTutorials","EffectOfTiltAngleOfSolarPanel","EffectOfAzimuthOfSolarPanel","SolarPanelTypes","VerticalBifacialSolarPanels","CompareMonofacialAndBifacialSolarPanels","SolarTrackers","CoveringGroundWithSolarPanels","InterRowSpacingOfSolarPanelArray","EffectOfOrientationOfSolarPanels","SolarPanelArrayAutomaticLayout","concentratedSolarPowerSubMenu","concentratedSolarPowerTutorials","EffectOfAzimuthOfParabolicTrough","EffectOfLatusRectumOfParabolicTrough","FocusSunlightWithParabolicDish","LinearFresnelReflectors","EffectOfAbsorberPipeHeightForLinearFresnelReflectors","EffectOfAzimuthOfLinearFresnelReflectors","LinearFresnelReflectorsWithTwoAbsorbers","CosineEfficiencyOfHeliostats","ShadowingAndBlockingOfHeliostats","EffectSolarPowerTowerHeight","SolarPowerTower","otherTypesOfSolarPowerSubMenu","otherTypesOfSolarPowerTutorials","SolarUpdraftTower","generativeDesignSubMenu","generativeDesignTutorials","MonofacialSolarPanelArrayTiltAngle","BifacialSolarPanelArrayTiltAngle","OutputOfSolarPanelArrayInDifferentPlaces","SimpleSolarFarmParetoFront","examplesSubMenu","solarEnergySubMenu","solarEnergyExamples","SunBeamAndHeliodon","RooftopSolarPanels","NevadaSolarOneParabolicTroughArray","TooeleParabolicDishArray","PS10SolarPowerTower","TucsonLinearFresnelReflectors","SolarCanopyFormFactors","SolarCanopyOverBleachers","SolarCanopyOverGarage","SolarBusStop","SolarFacadeTesla","BuildingIntegratedPhotovoltaics","Floatovoltaics","Agrivoltaics","VegetativeBuffer","RainbowSwashSolarFarmBostonMA","MickeyMouseSolarFarmOrlandoFL","SolarPanelsOverCanalBakersfieldCA","SolarNoiseBarrierLexingtonMA","HSATSolarTrackersRaleighNC","AADATSolarTrackersLancasterCA","SolarUpdraftTowerInCity","builtEnvironmentSubMenu","residentialBuildingsSubMenu","residentialBuildingExamples","ColonialHouse","DutchColonialHouse","TShapedHouse","CapeCodHouseWithGarage","Solarium","Church1","Cathedral1","Cathedral2","Mosque1","AdobeTaosHouse","RanchHouse","BonnetHouse","BarnStyleHouse","ModernHouse","ButterflyRoofHouse","commercialBuildingsSubMenu","commercialBuildingExamples","WhiteHouse","BilimMersinTurkiye","SpanishStyleHotel","ApartmentBuilding","OfficeBuilding","Hotel","buildingComplexesSubMenu","buildingComplexExamples","SouthBurlingtonHighSchoolVermont","MescaleroApacheSchoolNewMexico","urbanPlanningSubMenu","urbanPlanningExamples","Heatmap1","otherBuildingsSubMenu","otherBuildingExamples","Greenhouse","Pavilion","OctagonalPagoda","OceanFront","EgyptianPyramids","MayanPyramid","SiOSePol","StackedCuboids","artificialIntelligenceSubMenu","artificialIntelligenceExamples","OptimizingTiltAngleOfOneSolarPanelRow","OptimizingTiltAnglesOfMultipleSolarPanelRows","SolarFarmGenerativeDesign","SolarFarmGenerativeDesignWithBlock","FitchburgSolarFarmGenerativeDesign","languageSubMenu","publicSubMenu","ModelsGallery","ModelsMap","AboutUs","avatarMenu","AccountSettings","PrivacyStatementTitle","PrivacyStatement","SignIn","SignOut","IfYouAreAStudent","skyMenu","Axes","Theme","ThemeDefault","ThemeDesert","ThemeDune","ThemeForest","ThemeGrassland","ThemeHill","ThemeLake","ThemeMountain","ThemeRural","SunlightAttenuationCoefficientInAir","ConvectiveCoefficientOfAir","HighestTemperatureTimeInMinutes","SelectSunAnglesToShow","ShowAzimuthAngle","ShowElevationAngle","ShowZenithAngle","DirectLightBrightnessAtNoon","AmbientLightBrightnessAtNoon","groundMenu","MonthlyIrradianceLoss","Vegetation","LeafOutDay","LeafOffDay","Albedo","ImageOnGround","WaterSurface","RemoveAllUnlockedTrees","RemoveAllUnlockedFlowers","RemoveAllUnlockedSolarPanels","RemoveAllUnlockedPeople","RemoveAllUnlockedFoundations","RemoveAllUnlockedCuboids","DoYouReallyWantToRemoveAllPeople","DoYouReallyWantToRemoveAllTrees","DoYouReallyWantToRemoveAllFlowers","DoYouReallyWantToRemoveAllSolarPanels","DoYouReallyWantToRemoveAllFoundations","DoYouReallyWantToRemoveAllCuboids","LockAllElements","UnlockAllElements","labelSubMenu","LabelText","LabelHeight","LabelSize","LabelFontSize","LabelColor","KeepShowingLabel","foundationMenu","RemoveAllUnlockedParabolicTroughs","RemoveAllUnlockedParabolicDishes","RemoveAllUnlockedFresnelReflectors","RemoveAllUnlockedHeliostats","RemoveAllUnlockedSensors","RemoveAllUnlockedLights","RemoveAllUnlockedWalls","RemoveAllUnlockedWindows","RemoveAllUnlockedDoors","RemoveAllUnlockedPolygons","RemoveAllUnlockedHumans","Racks","Texture01","Texture02","Texture03","Texture04","Texture05","Texture06","Texture07","Texture08","Texture09","Texture10","SolarPanels","SolarPanelArray","DoYouReallyWantToRemoveAllSolarPanelsOnFoundation","ParabolicTroughs","DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation","ParabolicDishes","DoYouReallyWantToRemoveAllParabolicDishesOnFoundation","FresnelReflectors","DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation","Heliostats","DoYouReallyWantToRemoveAllHeliostatsOnFoundation","Sensors","DoYouReallyWantToRemoveAllSensorsOnFoundation","Lights","DoYouReallyWantToRemoveAllLightsOnFoundation","Walls","DoYouReallyWantToRemoveAllWallsOnFoundation","Windows","DoYouReallyWantToRemoveAllWindowsOnFoundation","Doors","DoYouReallyWantToRemoveAllDoorsOnFoundation","Polygons","DoYouReallyWantToRemoveAllPolygonsOnFoundation","Humans","DoYouReallyWantToRemoveAllHumansOnFoundation","Trees","DoYouReallyWantToRemoveAllTreesOnFoundation","Flowers","DoYouReallyWantToRemoveAllFlowersOnFoundation","OnlyThisFoundation","AllConnectedFoundations","AllSelectedFoundations","AllFoundations","AddPolygon","SolarStructure","GroupMaster","LockAllElementsOnThisFoundation","UnlockAllElementsOnThisFoundation","GroundFloorRValue","OnlyThisGroundFloor","AllGroundFloors","solarPowerTowerMenu","ReceiverTowerForHeliostats","ReceiverTowerPhysicalProperties","ReceiverTowerHeight","ReceiverTowerRadius","ReceiverAbsorptance","ReceiverOpticalEfficiency","ReceiverThermalEfficiency","solarAbsorberPipeMenu","AbsorberPipeForFresnelReflectors","AbsorberPipePhysicalProperties","AbsorberHeight","AbsorberApertureWidth","AbsorberPipePoleNumber","AbsorberAbsorptance","AbsorberOpticalEfficiency","AbsorberThermalEfficiency","solarUpdraftTowerMenu","SolarUpdraftTowerPhysicalProperties","SolarUpdraftTowerChimneyHeight","SolarUpdraftTowerChimneyRadius","SolarUpdraftTowerCollectorHeight","SolarUpdraftTowerCollectorRadius","SolarUpdraftTowerCollectorTransmissivity","SolarUpdraftTowerCollectorEmissivity","SolarUpdraftTowerDischargeCoefficient","SolarUpdraftTowerTurbineEfficiency","cuboidMenu","DoYouReallyWantToRemoveAllSolarPanelsOnCuboid","DoYouReallyWantToRemoveAllSensorsOnCuboid","DoYouReallyWantToRemoveAllPolygonsOnCuboid","DoYouReallyWantToRemoveAllHumansOnCuboid","DoYouReallyWantToRemoveAllTreesOnCuboid","DoYouReallyWantToRemoveAllFlowersOnCuboid","OnlyThisCuboid","AllCuboidsOnSameSurface","AllCuboidsAboveSameBase","AllSelectedCuboids","AllCuboids","OnlyThisSide","AllSidesOfThisCuboid","AllSidesOfSelectedCuboids","AllSidesOfAllCuboids","Stackable","polygonMenu","TextBox","FontOutlineColor","FontOutlineWidth","FontStrokeColor","FontStrokeWidth","NoOutline","Shiny","Filled","FillTexture","FillColor","Opacity","LineColor","LineStyle","SolidLine","DashedLine","DottedLine","InsertVertexBeforeIndex","InsertVertexAfterIndex","DeleteVertex","OnlyThisPolygon","AllPolygonsOnSurface","AllPolygonsAboveFoundation","AllSelectedPolygons","AllPolygons","Layout","SolarPanelArrayLayout","SolarPanelArrayLayoutParametricDesign","SolarPanelArrayLayoutGenerativeDesign","SolarPanelArrayModel","SolarPanelArrayOrientation","SolarPanelArrayTiltAngle","SolarPanelArrayRowWidth","SolarPanelArrayInterRowSpacing","SolarPanelArrayRowSpacing","SolarPanelArrayRowAxis","SolarPanelArrayLeftRightRowAxis","SolarPanelArrayUpDownRowAxis","SolarPanelArrayEastWestRowAxis","SolarPanelArrayNorthSouthRowAxis","SolarPanelArrayMargin","SolarPanelArrayPoleHeight","SolarPanelArrayPoleSpacing","SolarPanelArrayTotalYearlyCost","SolarPanelArrayTotalYearlyRevenue","SolarPanelArrayTotalYearlyYield","SolarPanelArrayMeanYearlyYield","SolarPanelArrayYearlyProfit","LayoutNotAcceptedCheckYourParameters","optimizationMenu","Optimization","Parameters","Variables","Constants","GeneticAlgorithm","GeneticAlgorithmSettings","ParticleSwarmOptimization","ParticleSwarmOptimizationSettings","SolarPanelTiltAngleOptimization","Generation","Gene","NormalizedVariables","Objective","ObjectiveFunctionDailyTotalYield","ObjectiveFunctionYearlyTotalYield","ObjectiveFunctionDailyMeanYield","ObjectiveFunctionYearlyMeanYield","ObjectiveFunctionDailyProfit","ObjectiveFunctionYearlyProfit","GeneticAlgorithmSelectionMethod","RouletteWheel","Tournament","SearchMethod","GlobalSearchUniformSelection","LocalSearchRandomOptimization","PopulationSize","MaximumGenerations","SelectionRate","CrossoverRate","MutationRate","Step","SwarmSize","MaximumSteps","MaximumVelocity","InertiaWeight","CognitiveCoefficient","SocialCoefficient","ConvergenceThreshold","LocalSearchRadius","RowsPerRackRange","TiltAngleRange","InterRowSpacingRange","ClickTargetPolygonToActivate","ClickTargetFoundationToActivate","treeMenu","ShowModel","Flip","Spread","flowerMenu","peopleMenu","ChangePerson","Observer","ViewFromThisPerson","lightMenu","Intensity","Decay","MaximumDistance","Inside","solarCollectorMenu","RelativeAzimuth","Pole","PoleHeight","PoleRadius","ExtraPoleHeight","ExtraPoleHeightInAdditionToHalfWidth","DrawSunBeam","concentratedSolarPowerCollectorMenu","ReflectorReflectance","ReflectorOpticalEfficiency","solarPanelMenu","InverterEfficiency","InverterEfficiencyExplained","DcToAcSizeRatio","DcToAcSizeRatioExplained","ChangePvModel","Orientation","Portrait","Landscape","FrameColor","Panels","PanelsWide","PanelsLong","TiltAngle","SouthFacingIsPositive","Tracker","SolarTrackerFollowsSun","PoleSpacing","NoTracker","HorizontalSingleAxisTracker","VerticalSingleAxisTracker","AltazimuthDualAxisTracker","OnlyThisSolarPanel","AllSolarPanelsOnSurface","AllSolarPanelsAboveFoundation","AllSelectedSolarPanels","AllSolarPanels","pvModelPanel","SolarPanelSpecs","PanelSize","Cells","CellType","Monocrystalline","Polycrystalline","ThinFilm","Bifacial","BifacialityFactor","Black","Blue","ShadeTolerance","SolarCellEfficiency","NominalOperatingCellTemperature","TemperatureCoefficientOfPmax","parabolicTroughMenu","ModuleLength","Modules","ModulesLong","LatusRectum","OnlyThisParabolicTrough","AllParabolicTroughsAboveFoundation","AllSelectedParabolicTroughs","AllParabolicTroughs","fresnelReflectorMenu","AbsorberPipe","SelectAbsorberToReflectSunlightTo","OnlyThisFresnelReflector","AllFresnelReflectorsAboveFoundation","AllSelectedFresnelReflectors","AllFresnelReflectors","heliostatMenu","Tower","SelectTowerToReflectSunlightTo","OnlyThisHeliostat","AllHeliostatsAboveFoundation","AllSelectedHeliostats","AllHeliostats","parabolicDishMenu","ReceiverStructure","CentralPole","CentralPoleWithTripod","Quadrupod","RimDiameter","ExtraPoleHeightInAdditionToRadius","OnlyThisParabolicDish","AllParabolicDishesAboveFoundation","AllSelectedParabolicDishes","AllParabolicDishes","wallMenu","TextureDefault","SizeOfWall","OnlyThisWall","AllConnectedWalls","AllWallsAboveFoundation","AllSelectedWalls","AllWalls","LockAllWindows","UnlockAllWindows","DoYouReallyWantToRemoveAllWindowsOnThisWall","DoYouReallyWantToRemoveAllDoorsOnThisWall","LockAllSolarPanels","UnlockAllSolarPanels","DoYouReallyWantToRemoveAllSolarPanelsOnThisWall","LockAllSensors","UnlockAllSensors","DoYouReallyWantToRemoveAllSensorsOnThisWall","DoYouReallyWantToRemoveAllLightsOnThisWall","LockAllPolygons","UnlockAllPolygons","WallStructure","DefaultStructure","StudStructure","PillarStructure","StructureSpacing","StructureWidth","StructureThickness","StructureColor","AllLightsOnWallInside","AllLightsOnWallOutside","Fill","Full","Empty","OpenToOutside","EavesLength","Parapet","ParapetColor","ParapetTexture","ParapetHeight","CopingsHeight","CopingsWidth","windowMenu","OnlyThisWindow","AllWindowsOnSurface","AllWindowsAboveFoundation","AllSelectedWindows","AllWindows","Setback","RelativeToWallThickness","Mullion","HorizontalMullion","VerticalMullion","MullionWidth","HorizontalMullionSpacing","VerticalMullionSpacing","MullionColor","Tint","SolarHeatGainCoefficient","Shutter","LeftShutter","RightShutter","BothShutters","ShutterWidth","ShutterColor","Frame","FrameWidth","SillWidth","WindowType","Default","Arched","Polygonal","Interior","roofMenu","OnlyThisRoof","AllRoofsAboveFoundation","AllSelectedRoofs","AllRoofs","OnlyThisCeiling","AllCeilingsAboveFoundation","AllCeilings","EavesOverhangLength","RafterSpacing","RafterWidth","RafterThickness","RafterColor","RoofColor","RoofSideColor","GlassTint","RoofStructure","RafterStructure","GlassStructure","DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof","DoYouReallyWantToRemoveAllWindowsOnThisRoof","DoYouReallyWantToRemoveAllSensorsOnThisRoof","DoYouReallyWantToRemoveAllLightsOnThisRoof","AllLightsOnRoofInside","AllLightsOnRoofOutside","Rise","Ceiling","RoofRValue","CeilingRValue","doorMenu","Texture11","Texture12","Texture13","Texture14","Texture15","Texture16","Texture17","OnlyThisDoor","AllDoorsOnWall","AllDoorsAboveFoundation","AllSelectedDoors","AllDoors","DoorType","siteInfoPanel","Low","designInfoPanel","NumberOfSelectedHeliostats","NumberOfSelectedSolarPanels","ElectricityGeneratedDailyBySolarPanels","SceneDiameter","BuildingArea","visualizationControlPanel","ColorContrast","FluxScale","ClickUpOrDownArrowButtonsToChange","instructionPanel","Rotate","DragMouse","Zoom","MouseWheelOrKeys","MouseWheelOrKeysMac","Pan","HoldCtrlDragMouse","HoldMetaDragMouse","Enter2DMode","Exit2DMode","NavigationMode","EnableNavigation","DisableNavigation","MoveForwardBack","MoveForwardBackInstruction","MoveLeftRight","MoveLeftRightInstruction","MoveUpDown","MoveUpDownInstruction","Turn","TurnInstruction","StartOrStop","mapPanel","WeatherStations","WeatherStationsNote","visibilityPanel","SolarPanelVisibility","VantagePoint","ItemizedVisibilityByFields","TotalVisibility","sensorPanel","LightSensor","WeatherDataFrom","buildingEnergyPanel","DailyBuildingEnergy","YearlyBuildingEnergy","Heater","AC","SolarPanel","Net","solarPanelYieldPanel","SolarPanelDailyYield","SolarPanelYearlyYield","Yield","YieldPerHour","DailyTotal","YearlyTotal","ShowOutputsOfIndividualSolarPanels","Profit","TotalCost","TotalRevenue","TotalYield","MeanYield","ModuleCount","parabolicTroughYieldPanel","ParabolicTroughDailyYield","ParabolicTroughYearlyYield","ShowOutputsOfIndividualParabolicTroughs","parabolicDishYieldPanel","ParabolicDishDailyYield","ParabolicDishYearlyYield","ShowOutputsOfIndividualParabolicDishes","fresnelReflectorYieldPanel","FresnelReflectorDailyYield","FresnelReflectorYearlyYield","ShowOutputsOfIndividualFresnelReflectors","heliostatYieldPanel","HeliostatDailyYield","HeliostatYearlyYield","ShowOutputsOfIndividualHeliostats","updraftTowerYieldPanel","UpdraftTowerDailyYield","UpdraftTowerYearlyYield","ChimneyAirTemperature","ChimneyWindSpeed","ShowOutputsOfIndividualUpdraftTowers","heliodonPanel","SunAndTimeSettings","TwentyFourHours","cloudFilePanel","CopyTitle","TitleCopiedToClipBoard","SearchByTitle","MyLikes","MyCloudFiles","GenerateLink","LinkGeneratedInClipBoard","DoYouReallyWantToDelete","IfSharedOrPublishedRenamingFileBreaksExistingLinks","projectListPanel","MyProjects","GenerateProjectLink","ProjectLinkGeneratedInClipBoard","DoYouReallyWantToDeleteProject","IfSharedOrPublishedRenamingProjectBreaksExistingLinks","projectPanel","ProjectSettings","ThumbnailImageSize","ProjectByOtherPeople","Project","ProjectType","ProjectDescription","MakeDescriptionEditable","MakeDescriptionNonEditable","DoubleClickToMakeDescriptionEditable","CurateCurrentDesign","UpdateSelectedDesign","RemoveSelectedDesign","ClickToFlipSortingOrder","DesignNotShownInSolutionSpaceClickToShow","DesignShownInSolutionSpaceClickToHide","DistributionInSolutionSpace","ChooseSolutionSpace","ChooseDataColoring","SameColorForAllDesigns","OneColorForEachDesign","SolutionSpaceScreenshot","ScatteredPlotScreenshot","SingleClickToSelectDoubleClickToOpen","SingleClickToDeselectDoubleClickToOpen","GenerateScatteredPlot","SelectXAxis","SelectYAxis","accountSettingsPanel","MyAccountSettings","MyID","ClickToCopyMyID","IDInClipBoard","StoreMyNameInMyFilesWhenSaving","DoYouReallyWantToShowYourNameInYourFiles","SignFileDisclaimer","Likes","AllPublished","PublishedUnderAliases","UserCount","SchoolID","ClassID","weatherPanel","SunshineHours","diurnalTemperaturePanel","SelectAirTemperatureModel","Sinusoidal","economicsPanel","EconomicsParameters","ElectricitySellingPrice","OperationalCostPerUnit","SellingPrice","UnitCost","navigationPanel","NavigationParameters","MinimumMoveSpeed","MinimumTurnSpeed","yearlyLightSensorPanel","SkyClearness","ShowDaylightResults","ShowSkyClearnessResults","ShowAverageDailySolarRadiation","analysisManager","NoSensorForCollectingData","NoSolarPanelForAnalysis","NoObserverForVisibilityAnalysis","NoWaterHeaterForAnalysis","NoParabolicDishForAnalysis","NoParabolicTroughForAnalysis","NoFresnelReflectorForAnalysis","NoHeliostatForAnalysis","NoSolarUpdraftTowerForAnalysis","NoBuildingForAnalysis","toolbar","CloudFile","Select","AddFoundation","AddWall","AddWindow","AddDoor","AddPyramidRoof","AddGableRoof","AddHipRoof","AddGambrelRoof","AddMansardRoof","AddCuboid","AddSensor","AddSolarPanel","AddWaterHeater","AddParabolicDish","AddParabolicTrough","AddFresnelReflector","AddHeliostat","AddWindTurbine","AddLight","AddTree","AddFlower","AddPeople","DoubleClickToLockThisModeForNextAction","ClickToUnlockThisModeForNextAction","ManipulateGroup","ClearScene","ShowSunAndTimeSettings","SpatialAnalysisOfEnergy","DoYouReallyWantToClearContent","ClickForMoreButtons","SwitchToAddingFoundation","SwitchToAddingCuboid","SwitchToAddingWall","SwitchToAddingWindow","SwitchToAddingDoor","SwitchToAddingPyramidRoof","SwitchToAddingGableRoof","SwitchToAddingHipRoof","SwitchToAddingGambrelRoof","SwitchToAddingMansardRoof","SwitchToAddingSolarPanel","SwitchToAddingSensor","SwitchToAddingWaterHeater","SwitchToAddingParabolicDish","SwitchToAddingParabolicTrough","SwitchToAddingFresnelReflector","SwitchToAddingHeliostat","SwitchToAddingWindTurbine","SwitchToAddingLight","SwitchToAddingTree","SwitchToAddingFlower","SwitchToAddingPeople","tooltip","gotoIFI","visitAladdinHomePage","clickToOpenMenu","clickToAccessAccountSettings","tree","Apple","Birch","Coconut","Dogwood","Elm","FanPalm","Linden","Magnolia","Maple","Oak","Pine","Spruce","flower","Bellflower","Boxwood","CactusCombo1","CactusCombo2","CactusCombo3","CactusCombo4","Hibiscus","Hosta","Hydrangea","Peony","RedRose","Spirea","Sunflower","TallBush","Tulip","WhiteFlower","YellowFlower","people","Jaah","Jack","Jacob","Jacqueline","Jade","Jamelia","James","Jane","Jaya","Jaye","Jeanette","Jedi","Jeff","Jena","Jennifer","Jess","Jett","Jill","Jiya","Joan","Jocelyn","Joel","Joey","John","Jonathon","Jose","Joseph","Joshua","Judd","Judy","Julia","Julio","Jumapili","June","Juro","Justin","compass","N","S","W","E","month","January","February","March","April","May","July","August","September","October","November","December","modelsMap","SearchByPublisher","SearchByLabel","MyPublishedModels","TotalNumberOfUserPublishedModels","SortFromOldestToNewest","SortFromNewestToOldest","ModelsFoundOnThisSite","ShowModelsPublishedByThisAuthor","zh_cn","zh_tw","SolarTrackersInRealWorld","es","tr","ua","FirebaseName","DataColoring","BuildingCompletionStatus","DesignProblem","ObjectiveFunctionType","EvolutionMethod","ChartType","GraphDataType","DiurnalTemperatureModel","Language","ObjectType","ParabolicDishStructureType","ActionType","MoveHandleType","ResizeHandleType","RotateHandleType","PolygonVertexAction","IntersectionPlaneType","Scope","RowAxis","TrackerType","Discretization","TreeType","FlowerType","Gender","HumanName","PolygonTexture","FoundationTexture","CuboidTexture","WallTexture","DoorTexture","RoofTexture","WallSide","ElementState","RoofHandleType","_changeEvent","type","_startEvent","_endEvent","MyOrbitControls","object","domElement","undefined","console","warn","document","error","style","touchAction","enabled","target","Vector3","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","Math","PI","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","panSpeed","screenSpacePanning","keyPanSpeed","autoRotate","autoRotateSpeed","moveSpeed","turnSpeed","keys","MOVE_LEFT","MOVE_RIGHT","MOVE_FORWARD","MOVE_BACKWARD","MOVE_UP","MOVE_DOWN","ROTATE_LEFT","ROTATE_UP","ROTATE_RIGHT","ROTATE_DOWN","mouseButtons","LEFT","MOUSE","ROTATE","MIDDLE","DOLLY","RIGHT","PAN","touches","ONE","TOUCH","TWO","DOLLY_PAN","target0","clone","position0","position","zoom0","zoom","_domElementKeyEvents","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","getDistance","this","distanceTo","listenToKeyEvents","addEventListener","onKeyDown","reverse","oldZ","removeKeyEvents","scope","removeEventListener","saveState","copy","reset","updateProjectionMatrix","dispatchEvent","update","state","STATE","NONE","offset","quat","Quaternion","setFromUnitVectors","up","quatInverse","invert","lastPosition","lastQuaternion","twoPI","sub","applyQuaternion","setFromVector3","rotateLeft","sphericalDelta","min","max","isFinite","makeSafe","radius","scale","addScaledVector","panOffset","add","setFromSpherical","lookAt","multiplyScalar","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","onContextMenu","onPointerDown","onPointerCancel","onMouseWheel","onPointerMove","onPointerUp","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","TOUCH_DOLLY_ROTATE","Spherical","rotateStart","Vector2","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","pointers","pointerPositions","getZoomScale","pow","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","panUp","crossVectors","pan","deltaX","deltaY","element","isPerspectiveCamera","targetDistance","length","tan","fov","clientHeight","matrix","isOrthographicCamera","right","left","clientWidth","top","bottom","moveUp","_vector","camera","z","moveForward","moveRight","spinUp","_euler","Euler","setFromQuaternion","abs","x","setFromEuler","spinRight","dollyOut","dollyScale","dollyIn","handleMouseDownRotate","event","clientX","clientY","handleMouseDownPan","handleTouchStartRotate","pageX","pageY","y","handleTouchStartPan","handleTouchStartDolly","dx","dy","sqrt","handleTouchMoveRotate","getSecondPointerPosition","subVectors","handleTouchMovePan","handleTouchMoveDolly","setPointerCapture","pointerId","push","addPointer","pointerType","trackPointer","DOLLY_ROTATE","onTouchStart","mouseAction","button","handleMouseDownDolly","ctrlKey","metaKey","onMouseDown","handleTouchMoveDollyPan","handleTouchMoveDollyRotate","onTouchMove","handleMouseMoveRotate","handleMouseMoveDolly","handleMouseMovePan","onMouseMove","removePointer","releasePointerCapture","preventDefault","handleMouseWheel","code","handleKeyDown","i","splice","pointer","passive","EventDispatcher","ParabolicCylinderGeometry","semiLatusRectum","width","widthSegments","lengthSegments","parameters","semilatusRectum","height","floor","indices","vertices","normals","uvs","index","indexArray","halfHeight","groupStart","generateTorso","normal","vertex","groupCount","du","indexRow","u","t","normalize","a","b","c","d","addGroup","setIndex","setAttribute","Float32BufferAttribute","data","BufferGeometry","ParaboloidGeometry","rimRadius","radialSegments","depthSegments","cos","sin","grid","tangent1","tangent2","TWO_PI","maxY","iy","verticesRow","ix","ConvexGeometry","points","euler","faces","ConvexHull","setFromPoints","face","edge","point","head","p","applyEuler","l2","next","THREE","extend","TextSprite","WallFill","VERSION","HOME_URL","DEFAULT_ADDRESS","PRESET_COLORS","Z_INDEX_FRONT_PANEL","UNDO_SHOW_INFO_DURATION","FLOATING_WINDOW_OPACITY","SOLAR_HEATMAP_COLORS","DEFAULT_HEAT_FLUX_SCALE_FACTOR","DEFAULT_HEAT_FLUX_COLOR","DEFAULT_HEAT_FLUX_WIDTH","DEFAULT_SOLAR_PANEL_SHININESS","DEFAULT_WINDOW_SHININESS","SOLAR_PANEL_BLUE_SPECULAR","SOLAR_PANEL_BLACK_SPECULAR","MONTHS","DEFAULT_LEAF_OUT_DAY","DEFAULT_LEAF_OFF_DAY","DEFAULT_FAR","MOVE_HANDLE_RADIUS","RESIZE_HANDLE_SIZE","MOVE_HANDLE_COLOR_1","MOVE_HANDLE_COLOR_2","RESIZE_HANDLE_COLOR","HIGHLIGHT_HANDLE_COLOR","LOCKED_ELEMENT_SELECTION_COLOR","FINE_GRID_SCALE","NORMAL_GRID_SCALE","GRID_RATIO","INVALID_ELEMENT_COLOR","GROUND_ID","HALF_PI","ZERO_TOLERANCE","UNIT_VECTOR_POS_Z_ARRAY","UNIT_VECTOR_NEG_Y_ARRAY","UNIT_VECTOR_POS_X","UNIT_VECTOR_NEG_X","UNIT_VECTOR_POS_Y","UNIT_VECTOR_NEG_Y","UNIT_VECTOR_POS_Z","ORIGIN_VECTOR2","HALF_PI_Z_EULER","REGEX_ALLOWABLE_IN_NAME","RoofType","Rectangle","useRefStore","create","get","setEnableOrbitController","useStore","getState","viewState","navigationView","orbitControlsRef","current","selectNone","humanRef","treeRef","foundationRef","contentRef","compassRef","flowerRef","cuboidRef","listenToAutoDeletionByCutRef","listenToAutoDeletionByDeleteRef","setListenToAutoDeletionByCut","setListenToAutoDeletionByDelete","HumanData","Male","Female","lang","textureImg","JaahImage","JacobImage","JacquelineImage","JadeImage","JameliaImage","JamesImage","JaneImage","JayaImage","JayeImage","JeanetteImage","JediImage","JeffImage","JenaImage","JenniferImage","JessImage","JettImage","JillImage","JiyaImage","JoanImage","JocelynImage","JoelImage","JoeyImage","JohnImage","JonathonImage","JoseImage","JosephImage","JoshuaImage","JuddImage","JudyImage","JuliaImage","JulioImage","JumapiliImage","JuneImage","JuroImage","JustinImage","JackImage","FlowerData","noLeaves","NoLeafShrubImage","BoxwoodImage","TallBushImage","CactusCombo1Image","CactusCombo2Image","CactusCombo3Image","CactusCombo4Image","BellflowerImage","HibiscusImage","HydrangeaImage","HostaImage","PeonyImage","RedRoseImage","SpireaImage","SunflowerImage","TulipImage","YellowFlowerImage","WhiteFlowerImage","ElementModelFactory","parentId","Human","cx","cy","cz","lx","fetchWidth","lz","fetchHeight","rotation","id","short","generate","spread","Tree","parent","pvModel","orientation","poleHeight","poleSpacing","tiltAngle","relativeAzimuth","frameColor","ly","parentType","foundationId","Foundation","Cuboid","Wall","Roof","pvModelName","trackerType","NO_TRACKER","landscape","drawSunBeam","poleRadius","thickness","showLabel","toArray","color","Flower","fetchSpread","faceColors","faceTextures","textureTypes","stackable","actionState","cuboidStackable","selected","texture","textureType","solarAbsorberPipe","solarPowerTower","hvacSystem","thermostatSetpoint","reflectance","absorptance","opticalEfficiency","thermalEfficiency","latusRectum","moduleLength","ParabolicTrough","absorberTubeRadius","receiverStructure","ParabolicDish","structureType","receiverRadius","receiverPoleRadius","receiverId","FresnelReflector","towerId","Heliostat","WindTurbine","bladeRadius","towerRadius","towerHeight","hx","hy","rx","ry","Util","isUnitVectorX","isUnitVectorY","Polygon","filled","selectedIndex","wallThickness","wallHeight","parapet","wallParapet","eavesLength","wallEavesLength","rValue","wallRValue","fill","leftUnfilledHeight","rightUnfilledHeight","leftTopPartialHeight","rightTopPartialHeight","relativeAngle","leftPoint","rightPoint","leftJoints","rightJoints","wallTexture","wallColor","volumetricHeatCapacity","wallVolumetricHeatCapacity","wallStructure","studSpacing","wallStructureSpacing","studWidth","wallStructureWidth","studColor","wallStructureColor","opacity","wallOpacity","lineWidth","lineColor","windows","Sensor","decay","intensity","Light","Window","leftShutter","windowShutterLeft","rightShutter","windowShutterRight","shutterColor","windowShutterColor","shutterWidth","windowShutterWidth","horizontalMullion","windowHorizontalMullion","verticalMullion","windowVerticalMullion","mullionWidth","windowMullionWidth","horizontalMullionSpacing","windowHorizontalMullionSpacing","verticalMullionSpacing","windowVerticalMullionSpacing","mullionColor","windowMullionColor","frame","windowFrame","frameWidth","windowFrameWidth","sillWidth","RoofUtil","isTypeRoof","windowSillWidth","windowType","empty","windowEmpty","interior","windowInterior","archHeight","windowArchHeight","windowColor","tint","windowTint","windowOpacity","uValue","windowUValue","Door","doorType","doorFilled","doorInterior","doorArchHeight","doorTexture","doorColor","doorUValue","wallsId","ceiling","roofCeiling","rise","roofRise","roofThickness","roofRValue","roofColor","sideColor","roofSideColor","roofTexture","roofType","Pyramid","roofStructure","Gable","ridgeLeftPoint","ridgeRightPoint","ridgeLength","Hip","leftRidgeLength","rightRidgeLength","Gambrel","topRidgePoint","frontRidgePoint","backRidgePoint","Mansard","ridgeWidth","solarPanelArrayLayoutParams","rowAxis","rowWidth","rowsPerRack","interRowSpacing","margin","shadowEnabled","solarPanelShininess","windowShininess","heatFluxScaleFactor","heatFluxColor","heatFluxWidth","solarRadiationHeatmapMaxValue","solarRadiationHeatMapMaxValue","solarRadiationHeatmapReflectionOnly","solarRadiationHeatMapReflectionOnly","axes","ambientLightIntensity","directLightIntensity","theme","showAzimuthAngle","showElevationAngle","showZenithAngle","groundImage","groundImageType","groundColor","waterSurface","orthographic","cameraPosition","cameraPosition2D","panCenter","panCenter2D","cameraZoom","heliodon","showSunAngles","mapZoom","mapTilt","mapType","showSiteInfoPanel","showDesignInfoPanel","showInstructionPanel","showHeliodonPanel","heliodonPanelX","heliodonPanelY","showMapPanel","mapPanelX","mapPanelY","showWeatherPanel","weatherPanelRect","showDiurnalTemperaturePanel","diurnalTemperaturePanelRect","showStickyNotePanel","stickyNotePanelRect","showDailyBuildingEnergyPanel","dailyBuildingEnergyPanelRect","showYearlyBuildingEnergyPanel","yearlyBuildingEnergyPanelRect","showDailyLightSensorPanel","dailyLightSensorPanelRect","showYearlyLightSensorPanel","yearlyLightSensorPanelRect","yearlyLightSensorPanelShowDaylight","yearlyLightSensorPanelShowClearness","showDailyPvYieldPanel","dailyPvYieldPanelRect","showYearlyPvYieldPanel","yearlyPvYieldPanelRect","showVisibilityResultsPanel","showSolarPanelVisibilityResultsPanel","visibilityResultsPanelRect","showDailyParabolicTroughYieldPanel","dailyParabolicTroughYieldPanelRect","showYearlyParabolicTroughYieldPanel","yearlyParabolicTroughYieldPanelRect","showDailyParabolicDishYieldPanel","dailyParabolicDishYieldPanelRect","showYearlyParabolicDishYieldPanel","yearlyParabolicDishYieldPanelRect","showDailyFresnelReflectorYieldPanel","dailyFresnelReflectorYieldPanelRect","showYearlyFresnelReflectorYieldPanel","yearlyFresnelReflectorYieldPanelRect","showDailyHeliostatYieldPanel","dailyHeliostatYieldPanelRect","showYearlyHeliostatYieldPanel","yearlyHeliostatYieldPanelRect","showDailyUpdraftTowerYieldPanel","dailyUpdraftTowerYieldPanelRect","showYearlyUpdraftTowerYieldPanel","yearlyUpdraftTowerYieldPanelRect","showEvolutionPanel","evolutionPanelRect","latitude","world","longitude","date","leafDayOfYear1","leafDayOfYear2","ground","address","countryCode","airAttenuationCoefficient","airConvectiveCoefficient","timesPerHour","daysPerYear","monthlyIrradianceLosses","discretization","diurnalTemperatureModel","highestTemperatureTimeInMinutes","solarRadiationHeatmapGridCellSize","pvGridCellSize","solarPanelVisibilityGridCellSize","cspTimesPerHour","cspDaysPerYear","cspGridCellSize","sutTimesPerHour","sutDaysPerYear","sutGridCellSize","noAnimationForHeatmapSimulation","noAnimationForThermalSimulation","noAnimationForSensorDataCollection","noAnimationForSolarPanelSimulation","noAnimationForSolarUpdraftTowerSimulation","user","userCount","showEconomicsPanel","showNavigationPanel","minimumNavigationMoveSpeed","minimumNavigationTurnSpeed","navigationMoveSpeed","navigationTurnSpeed","getHeatmap","setHeatmap","clearHeatmaps","flagOfDailySimulation","hourlyHeatExchangeArrayMap","setHourlyHeatExchangeArray","hourlySolarHeatGainArrayMap","setHourlySolarHeatGainArray","hourlySolarPanelOutputArrayMap","setHourlySolarPanelOutputArray","getRoofSegmentVertices","getRoofSegmentVerticesWithoutOverhang","changed","setChanged","setSkipChange","applyCount","setApplyCount","revertApply","elements","notes","pvModules","loadPvModules","getPvModule","floatingWindowOpacity","selectedFloatingWindow","language","locale","loggable","actionInfo","currentUndoable","openModelsMap","modelsMapLatitude","modelsMapLongitude","modelsMapZoom","modelsMapTilt","modelsMapType","modelsMapWeatherStations","showCloudFileTitleDialog","showCloudFileTitleDialogFlag","cloudFile","latestModelSite","modelSites","peopleModels","saveCloudFileFlag","createProjectFlag","saveProjectFlag","curateDesignToProjectFlag","showProjectsFlag","updateProjectsFlag","modelsMapFlag","leaderboardFlag","showLeaderboard","publishOnModelsMapFlag","listCloudFilesFlag","localContentToImportAfterCloudFileUpdate","localFileName","createNewFileFlag","openLocalFileFlag","saveLocalFileDialogVisible","fileChanged","undoManager","addUndoable","importContent","exportContent","clearContent","createEmptyFile","aabb","animateSun","animate24Hours","runDailyThermalSimulation","pauseDailyThermalSimulation","runYearlyThermalSimulation","pauseYearlyThermalSimulation","clearDailySimulationResultsFlag","clearYearlySimulationResultsFlag","runDynamicSimulation","runStaticSimulation","pauseSimulation","runEvolution","pauseEvolution","objectiveEvaluationIndex","evolutionMethod","updateSceneRadiusFlag","updateSceneRadius","sceneRadius","cameraDirection","getCameraDirection","getElementById","getFoundation","getParent","getChildren","getChildrenOfType","selectedElement","selectedElementIdSet","getSelectedElement","overlapWithSibling","selectedSideIndex","setElementPosition","setElementSize","setElementNormal","updateAllElementLocks","updateElementLockByFoundationId","updateElementLockByParentId","updateElementLockById","updateElementReferenceById","updateElementLabelById","updateElementShowLabelById","updateElementCxById","updateElementCyById","updateElementCzById","updateElementCzForAll","updateElementLxById","updateElementLxAboveFoundation","updateElementLxForAll","updateElementLyById","updateElementLyAboveFoundation","updateElementLyForAll","updateElementLzById","updateElementLzForAll","updateElementColorById","updateElementColorOnSurface","updateElementColorAboveFoundation","updateElementColorForAll","updateElementLineColorById","updateElementLineColorOnSurface","updateElementLineColorAboveFoundation","updateElementLineColorForAll","updateElementLineWidthById","updateElementLineWidthOnSurface","updateElementLineWidthAboveFoundation","updateElementLineWidthForAll","updateElementRotationById","updateElementRotationForAll","foundationActionScope","setFoundationActionScope","polygonActionScope","setPolygonActionScope","updatePolygonVertexPositionById","updatePolygonVerticesById","cuboidActionScope","setCuboidActionScope","solarPanelActionScope","setSolarPanelActionScope","updateSolarCollectorDailyYieldById","updateSolarCollectorYearlyYieldById","updateSolarPanelTiltAngleById","updateSolarCollectorDrawSunBeamById","updateSolarCollectorDrawSunBeamAboveFoundation","updateSolarCollectorDrawSunBeamForAll","updateSolarCollectorRelativeAzimuthById","updateSolarCollectorRelativeAzimuthOnSurface","updateSolarCollectorRelativeAzimuthAboveFoundation","updateSolarCollectorRelativeAzimuthForAll","updateSolarCollectorPoleHeightById","updateSolarCollectorPoleHeightOnSurface","updateSolarCollectorPoleHeightAboveFoundation","updateSolarCollectorPoleHeightForAll","updateSolarCollectorPoleRadiusById","updateSolarCollectorPoleRadiusAboveFoundation","updateSolarCollectorPoleRadiusForAll","updateCspReflectanceById","updateCspReflectanceAboveFoundation","updateCspReflectanceForAll","updateParabolicCollectorAbsorptanceById","updateParabolicCollectorAbsorptanceAboveFoundation","updateParabolicCollectorAbsorptanceForAll","updateParabolicCollectorOpticalEfficiencyById","updateParabolicCollectorOpticalEfficiencyAboveFoundation","updateParabolicCollectorOpticalEfficiencyForAll","updateParabolicCollectorThermalEfficiencyById","updateParabolicCollectorThermalEfficiencyAboveFoundation","updateParabolicCollectorThermalEfficiencyForAll","parabolicTroughActionScope","setParabolicTroughActionScope","fresnelReflectorActionScope","setFresnelReflectorActionScope","heliostatActionScope","setHeliostatActionScope","updateSolarReceiverById","updateSolarReceiverAboveFoundation","updateSolarReceiverForAll","parabolicDishActionScope","setParabolicDishActionScope","updateParabolaLatusRectumById","updateParabolaLatusRectumAboveFoundation","updateParabolaLatusRectumForAll","updateModuleLengthById","updateModuleLengthAboveFoundation","updateModuleLengthForAll","updateInsideLightById","updateInsideLightsByParentId","copyElementById","removeElementById","removeElementsByType","clearDeletedElements","countElementsByReferenceId","removeElementsByReferenceId","removeAllChildElementsByType","removeAllElementsOnFoundationByType","pasteElementsToPoint","pasteElementsByKey","elementsToPaste","selectMe","addElement","objectTypeToAdd","actionModeLock","countElementsByType","countSolarStructuresByType","countObservers","countAllOffspringsByTypeAtOnce","countSolarPanelsOnRack","selectedElementAngle","waiting","simulationInProgress","simulationPaused","evolutionInProgress","evolutionPaused","contextMenuObjectType","enableFineGrid","setEnableFineGrid","showCloudFilePanel","projectInfo","projectView","showProjectListPanel","showModelsGallery","showAccountSettingsPanel","showLikesPanel","showPublishedModelsPanel","weatherData","loadWeatherData","getWeather","loadHorizontalSolarRadiationData","getHorizontalSolarRadiation","loadVerticalSolarRadiationData","getVerticalSolarRadiation","getClosestCity","sunlightDirection","setSunlightDirection","showSolarRadiationHeatmap","showHeatFluxes","runSolarPanelVisibilityAnalysis","solarPanelVisibilityResults","runDailySimulationForSolarPanels","runDailySimulationForSolarPanelsLastStep","runYearlySimulationForSolarPanels","runYearlySimulationForSolarPanelsLastStep","pauseDailySimulationForSolarPanels","pauseYearlySimulationForSolarPanels","dailyPvYield","dailyPvIndividualOutputs","graphState","setDailyPvYield","yearlyPvYield","yearlyPvIndividualOutputs","setYearlyPvYield","solarPanelLabels","setSolarPanelLabels","setTotalBuildingHeater","setTotalBuildingAc","setTotalBuildingSolarPanel","runDailySimulationForParabolicTroughs","runYearlySimulationForParabolicTroughs","pauseDailySimulationForParabolicTroughs","pauseYearlySimulationForParabolicTroughs","dailyParabolicTroughYield","dailyParabolicTroughIndividualOutputs","setDailyParabolicTroughYield","yearlyParabolicTroughYield","yearlyParabolicTroughIndividualOutputs","setYearlyParabolicTroughYield","parabolicTroughLabels","setParabolicTroughLabels","runDailySimulationForFresnelReflectors","runYearlySimulationForFresnelReflectors","pauseDailySimulationForFresnelReflectors","pauseYearlySimulationForFresnelReflectors","dailyFresnelReflectorYield","dailyFresnelReflectorIndividualOutputs","setDailyFresnelReflectorYield","yearlyFresnelReflectorYield","yearlyFresnelReflectorIndividualOutputs","setYearlyFresnelReflectorYield","fresnelReflectorLabels","setFresnelReflectorLabels","runDailySimulationForHeliostats","runYearlySimulationForHeliostats","pauseDailySimulationForHeliostats","pauseYearlySimulationForHeliostats","dailyHeliostatYield","dailyHeliostatIndividualOutputs","setDailyHeliostatYield","yearlyHeliostatYield","yearlyHeliostatIndividualOutputs","setYearlyHeliostatYield","heliostatLabels","setHeliostatLabels","runDailySimulationForUpdraftTower","runYearlySimulationForUpdraftTower","pauseDailySimulationForUpdraftTower","pauseYearlySimulationForUpdraftTower","dailyUpdraftTowerResults","dailyUpdraftTowerYield","dailyUpdraftTowerIndividualOutputs","setDailyUpdraftTowerResults","setDailyUpdraftTowerYield","yearlyUpdraftTowerYield","yearlyUpdraftTowerIndividualOutputs","setYearlyUpdraftTowerYield","updraftTowerLabels","setUpdraftTowerLabels","runDailySimulationForParabolicDishes","runYearlySimulationForParabolicDishes","pauseDailySimulationForParabolicDishes","pauseYearlySimulationForParabolicDishes","dailyParabolicDishYield","dailyParabolicDishIndividualOutputs","setDailyParabolicDishYield","yearlyParabolicDishYield","yearlyParabolicDishIndividualOutputs","setYearlyParabolicDishYield","parabolicDishLabels","setParabolicDishLabels","runDailyLightSensor","pauseDailyLightSensor","runYearlyLightSensor","pauseYearlyLightSensor","dailyLightSensorData","setDailyLightSensorData","yearlyLightSensorData","setYearlyLightSensorData","sensorLabels","setSensorLabels","hoveredHandle","moveHandleType","resizeHandleType","getResizeHandlePosition","rotateHandleType","resizeAnchor","isAddingElement","addedFoundationId","deletedFoundationId","addedCuboidId","deletedCuboidId","addedWallId","deletedWallId","deletedRoofId","deletedRoofIdSet","autoDeletedRoofIdSet","autoDeletedRoofs","autoDeletedChild","groupActionMode","groupActionUpdateFlag","addedWindowId","addedDoorId","updateWallMapOnFoundationFlag","wallActionScope","roofActionScope","windowActionScope","doorActionScope","setRoofActionScope","updateWallLeftJointsById","updateWallRightJointsById","updateWallLeftPointById","updateRoofStructureById","economicsParams","fittestIndividualResults","setFittestIndividualResults","variableLabels","setVariableLabels","evolutionaryAlgorithmState","solarPanelArrayLayoutConstraints","geneticAlgorithmWizardSelectedTab","particleSwarmOptimizationWizardSelectedTab","setPrimitiveStore","ElementGrid","React","memo","hz","Selector","maxSize","useState","step","setStep","setLineWidth","useEffect","pointsX","useMemo","pointsY","map","value","Line","userData","unintersectable","WindowResizeHandle","handleType","setCommonStore","handleRef","useRef","setColor","ref","args","onPointerEnter","onPointerLeave","attach","WindowMoveHandle","Mid","usePrimitiveStore","key","val","skipChange","setSaveCloudFileFlag","projectImagesUpdateFlag","projectType","SOLAR_PANEL_ARRAY","projectTitle","projectDescription","duringCameraInteraction","elementBeingCanceledId","showWallIntersectionPlaneId","oldParentId","oldFoundationId","selectedElementId","foundationMovedFlag","updateFoundationMovedFlag","isCameraUnderGround","useDataStore","roofSegmentVerticesMap","Map","setRoofSegmentVertices","deleteRoofSegmentVertices","delete","roofSegmentVerticesWithoutOverhangMap","setRoofSegmentVerticesWithoutOverhang","deleteRoofSegmentVerticesWithoutOverhang","labels","setState","sumDailyPvYield","sum","datum","prop","hasOwnProperty","getDailyPvProfit","dailyYield","solarPanelNumber","countAllSolarPanels","electricitySellingPrice","operationalCostPerUnit","sumYearlyPvYield","getYearlyPvProfit","setSolarPanelVisibilityResult","vantage","result","clearSolarPanelVisibilityResults","sumDailyParabolicDishYield","sumYearlyParabolicDishYield","sumDailyParabolicTroughYield","sumYearlyParabolicTroughYield","sumDailyFresnelReflectorYield","sumYearlyFresnelReflectorYield","sumDailyHeliostatYield","sumYearlyHeliostatYield","sumDailyUpdraftTowerYield","sumYearlyUpdraftTowerYield","heatmaps","totalBuildingHeater","heater","totalBuildingAc","ac","totalBuildingSolarPanel","clear","clearDataStore","clearRoofVerticesMap","sealPlanesMaterial","MeshStandardMaterial","side","FrontSide","dimension","mullionData","ah","mullionRadius","radialMullionAngle","atan2","radialMullionLength","r","aSquare","bSquare","cSquare","material","drawArchMullionPath","h","startAngle","acos","endAngle","EllipseCurve","getPoints","v2","CatmullRomCurve3","verticalMullions","arr","dividers","round","num","horizontalMullions","totalDist","number","ceil","curr","archMullions","shape","Shape","moveTo","quadraticCurveTo","idx","path","renderRadialMullion","receiveShadow","castShadow","item","extrudePath","steps","bevelEnabled","frameData","halfWidth","depth","sillLength","sillThickness","archedFrameShape","x1","x2","h1","r1","startAngle1","endAngle1","y1","h2","r2","startAngle2","endAngle2","y2","points1","points2","ArchedWireframe","wireframeData","drawBottom","locked","thinLine","boldLine","drawArchedPath","highLightMaterial","renderLines","mat","ArchedWindow","glassMaterial","area","foundation","heatFluxArrowHead","heatFluxArrowEuler","pointWithinArch","dz","heatFluxes","notBuilding","heat","reduce","cellSize","nx","nz","getEuler","sign","vectors","kx","kz","rz","widthShutter","heightShutter","shutterPosX","shutterPosZ","glassShape","getArchedWindowShape","renderSealPlane","showFrame","showLeft","showRight","spacing","Fragment","s","lineTo","cX","cY","absarc","closePath","DoubleSide","polygonTop","topX","topH","innerPoints","botRight","topRight","topLeft","botLeft","outerPoints","p1","p2","n","edgesAfterOffset","start","end","edge1","edge2","getIntersectionPoint","PolygonalWindow","absTopX","topRightLength","hypot","topRightRotation","asin","topLeftLength","topLeftRotation","pointWithinPolygon","shiftZ","isPointInside","bz","shutterLength","getPolygonWindowShape","wireframeMaterial","wireframeWidth","wireframeCy","renderWireframeLine","tx","th","RoofSegment","foundationModel","segment","centroid","heatmap","useTransparent","transparent","heatFluxArrowLength","overhangLines","segments","lines","thicknessVector","seg","entries","wallLeft","projectedVertices","s0","s1","s2","v10","v20","v21","length10","m","dm","dn","v0","origin","getTriangleArea","segmentsWithoutOverhang","filter","e","w","wcy","onSegment","getWindowArea","isRoof","dmp","q","ox","oy","getRelativeWindowVerticesOnRoof","BufferRoofSegment","dashed","dashSize","gapSize","topLayerTexture","isTri","isQuad","holeMeshes","fromArray","DEFAULT_POLYGONTOP","holeMesh","Mesh","ExtrudeBufferGeometry","updateMatrix","BoxBufferGeometry","materialGroupNumber","render","materialArray","Array","geometry","clearGroups","positions","vertexIndex","materialIndex","topLayerPoints","slice","addPositions","addHeatmapUVs","ab","lab","ub","vb","uc","vc","cross","addUVs","buildSideSurface","Error","triangulate","triTopLower","triTopUpper","ta","tb","tc","td","isLowerLeft","equals","ad","ud","vd","triBotLower","triBotUpper","computeVertexNormals","computeBoundingSphere","operationBuffer","CSG","subtract","resultMesh","pop","groups","mid","v30","verticesNumber","surfacePointIndices","tri1","acc","concat","tri2","dDis","distanceFromPointToLine2D","cDis","lower","upper","HeatMapMaterial","attachArray","TopLayerMaterial","SideSurfaceMaterial","enableShadow","uuid","simulation","frustumCulled","_","useSelected","has","useLanguage","lng","intersectionPlanePosition","intersectionPlaneRotation","zeroVector","zVector3","PyramidRoofWireframe","roofSegments","peripheryPoints","periphery","isFlat","PyramidRoof","roofModel","useRoofTexture","getWireframetStyle","useThree","gl","ray","Raycaster","mouse","showIntersectionPlane","setShowIntersectionPlane","intersectionPlaneRef","isPointerDownRef","oldRiseRef","prevWallsIdSet","Set","useMultiCurrWallArray","currentWallArray","isLoopRef","useRoofHeight","highestWallHeight","topZ","useUpdateOldRoofFiles","centerPoint","wallArray","getWallPoint","calculatePolygonCentroid","Number","isNaN","centerPointV3","overhangs","res","wall","getWallNormal","wallPointsAfterOffset","overhangHeight","dLeft","overhangHeightLeft","dRight","overhangHeightRight","getOverhangHeight","getWallHeight","lh","rh","wallLeftPointAfterOverhang","setZ","wallRightPointAfterOverhang","leftPointAfterOverhang","rightPointAfterOverhang","addVectors","divideScalar","ceilingPoints","isFirstRender","useIsFirstRender","addedRoofIdSet","wallsIdSet","size","needUpdateWallsId","newWallsIdArray","newWallsIdSet","roofId","leftRoofHeight","rightRoofHeight","deleteAddedRoofId","useUpdateRooftopElements","checkIsFlatRoof","isFlatRoof","setIsFlatRoof","heatmapTextures","setHeatmapTextures","flatHeatmapTexture","setFlatHeatmapTexture","updateSegmentVertices","useUpdateSegmentVerticesMap","fetchHeatmapTexture","segmentVertices","minX","MAX_VALUE","minY","maxX","vcx","vcy","wrapT","wrapS","RepeatWrapping","center","repeat","textures","useUpdateSegmentVerticesWithoutOverhangMap","wallLeftPoint","wallRightPoint","firstWall","lastWall","shallow","useUserData","topLayerColor","handlePointerDown","handlePointerMove","handlePointerUp","handleContextMenu","Top","selectedElementHeight","onPointerOver","selectedElementX","selectedElementY","visible","offsetX","offsetY","setFromCamera","setRayCast","intersects","intersectObjects","newRise","updateRoofRiseById","addUndoableResizeRoofRise","areRoofsEqual","getWallShapePoints","wallHeights","centerLeft","centerRight","crX","crY","clX","clY","isRoofValid","wallHeightsMap","wallShapePoints","child","px","pz","isElementInsideWall","GambrelRoofWireframe","frontSideSegmentPoints","frontTopSegmentPoints","backTopSegmentPoints","backSideSegmentPoints","ridges","zeroVector2","GambrelRoof","topRidgeLeftPoint","frontRidgeLeftPoint","backRidgeLeftPoint","Null","roofHandleType","setRoofHandleType","enableIntersectionPlane","setEnableIntersectionPlane","oldRidgeVal","updateRidge","elemId","gr","FrontLeft","FrontRight","TopLeft","TopRight","BackLeft","BackRight","handleUndoableResizeRidge","oldVal","newVal","undoable","timestamp","now","resizedElementId","resizedElementType","undo","redo","setInterSectionPlane","handlePointV3","getRelPos","foundationCenter","wallCenter","getComposedWallCenter","wallLength","getComposedWallLength","wallAbsCenter","rotateAround","wallAbsAngle","getRidgePoint","currWall","ph","sideWall","isThisIdAndType","getYOnEdge","edges","k","setSideWallHeightsMap","composedWalls","isLeftSide","roofEdges","leftBaseHeight","rightBaseHeight","midPoint","composedWall","halfLength","getX","getY","baseHeight","startPoint","endPoint","getEdgeLine","getRoofSideEdges","roofPointsX","wallPointsX","currId","find","wallStartX","wallEndX","wallStartY","wallEndY","wallCenterX","roofPointX","getSideWallHeightsMap","useComposedWallArray","useComposedRoofHeight","topRidgeLeftPointV3","topRidgeRightPointV3","topRidgeMidPointV3","frontRidgeLeftPointV3","frontRidgeRightPointV3","backRidgeLeftPointV3","backRidgeRightPointV3","getComposedWallNormal","frontWall","backWall","frontOverhang","rightOverhang","backOverhang","leftOverhang","wallPoint0","wallPoint1","wallPoint2","wallPoint3","frontWallLeftPointAfterOffset","frontWallRightPointAfterOffset","leftWallLeftPointAfterOffset","leftWallRightPointAfterOffset","rightWallLeftPointAfterOffset","rightWallRightPointAfterOffset","backWallLeftPointAfterOffset","backWallRightPointAfterOffset","frontSidePoints","frontWallLh","frontWallRh","d0","overhangHeight0","d1","overhangHeight1","frontWallLeftPointAfterOverhang","frontWallRightPointAfterOverhang","frontRidgeLeftPointAfterOverhang","frontRidgeRightPointAfterOverhang","frontCenter","frontAngle","frontSideLength","frontTopPoints","topRidgeLeftPointAfterOverhang","topRidgeRightPointAfterOverhang","backAngle","backWallLh","backWallRh","d2","overhangHeight2","d3","overhangHeight3","backWallLeftPointAfterOverhang","backWallRightPointAfterOverhang","backRidgeLeftPointAfterOverhang","backRidgeRightPointAfterOverhang","backCenter","backSideLength","backTopPoints","backSidePoints","idSet","forEach","centerLeftRoofHeight","centerRightRoofHeight","centerRoofHeight","updateFlatRoofWalls","frontWallsIdSet","backWallsIdSet","sideWallHeightsMap","updateWalls","updateRooftopElements","useUpdateRooftopElementsByContextMenuChanges","wallPoints","ridgeFLPoint","ridgeFRPoint","ridgeBLPoint","ridgeBRPoint","ridgeTLPoint","ridgeTRPoint","TopMid","newTopZ","clamp","hDiff","newFrontRidgePoint","roof","newTopRidgePoint","newBackRidgePoint","RafterUnit","startV2","endV2","rotationZ","Rafter","isShed","rightWall","leftWall","ridgeUnitVector","ridgeLeftPointAfterOverhang","ridgeRightPointAfterOverhang","frontWallLeftPoint","backWallRightPoint","array","frontWallUnitVector","backWallUnitVector","frontWallLength","backWallLength","len","ridge","front","back","showFront","offsetTop","GableRoofWireframe","leftRoof","rightRoof","rightRidge","leftRidge","GableRoof","rafterSpacing","rafterWidth","rafterColor","glassTint","oldRidgeLeft","oldRidgeRight","updateRoofTopRidge","getShiftedArr","swap","j","temp","setGabledWallHeightsMap","ridgePoint","ridgeX","leftHalfK","leftHalfB","rightHalfK","rightHalfB","leftX","rightX","getGabledWallsHeightsMap","ridgeLeftPointV3","leftComposedWall","ridgeRightPointV3","rightComposedWall","ridgeMidPoint","shiftedWallArray","shiftedOverhangs","frontPoints","frontLength","backPoints","backLength","gabledWallsHeightsMap","gabledWallHeights","handleRoofBodyPointerDown","overhang","dir","rX","rZ","Left","Right","newRidgeLeftPoint","newRidgeRightPoint","oldLeft","oldRight","newLeft","newRight","handleUndoableResizeTopRidge","_opacity","invalidate","heatmapMeshRef","bulkMeshRef","planeRef","mullionRef","setMullionLx","setMullionLz","show","setShow","checkValid","v1","values","wallRight","ridgeRight","ridgeLeft","geo","Float32Array","zOffset","isValid","Glass","mapVector3ToPoint2","centerV3","wl","wr","rr","rl","resMesh","isNorthWest","rotationX","angleTo","rotationY","HipRoofWireframe","HipRoof","leftRidgeLengthCurr","setLeftRidgeLengthCurr","rightRidgeLengthCurr","setRightRidgeLengthCurr","setHipRoofRidgeLength","manualUpdate","updateElementOnRoofFlag","makeSegment","vector","p3","p4","centroid2D","getWallsPoint2","setX","getComposedWallHeight","ridgeLPoint","ridgeRPoint","midPointVector","oldLeftRidgeLength","oldRightRidgeLength","newLeftRidgeLength","newRightRidgeLength","handleUndoableResizeRidgeLength","MansardRoofWireframe","ridgePoints","wallLine","MansardRoof","frontRidge","backRidge","setWidth","maxWidth","setMaxWidth","ridgeHandleIndex","setRidgeHandleIndex","oldWidth","getWallPoint2","wallPointsAfterOverhang","leftDiff","rightDiff","topRidgeShape","el","lastIdx","ridgeVertices","updateFlag","setUpdateFlag","topSurfaceMeshRef","extractPoints","getPolygonArea","noTextureAndOneColor","Ridge","wallPoint","getWallPointFromHandleIdx","addUndoableResizeRidge","visitIFI","window","open","visitHomepage","showSuccess","msg","duration","success","content","className","marginTop","onClick","destroy","showInfo","info","showWarning","warning","showError","copyTextToClipboard","text","textArea","createElement","body","appendChild","selection","getSelection","rangeCount","getRangeAt","select","execCommand","removeChild","removeAllRanges","addRange","screenshot","elementId","options","source","html2canvas","removeContainer","canvas","href","toDataURL","download","click","saveCsv","fileName","Object","o","blob","Blob","saveAs","useHandleSize","handleSize","useWallTexture","textureLoader","TextureLoader","WallTextureDefault","WallTexture00","WallTexture01","WallTexture03","WallTexture04","WallTexture05","WallTexture06","WallTexture07","WallTexture08","WallTexture09","WallTexture10","Stud","load","repeatX","repeatY","useLatestFoundation","isFirstRenderRef","latestFoundation","SharedUtil","oldElement","newElement","isSolarPanel","isPolygon","undoableMove","movedElementId","movedElementType","oldCx","oldCy","oldCz","newCx","newCy","newCz","oldParentType","newParentType","newParentId","newFoundationId","oldNormal","newNormal","oldRotation","newRotation","setUndoRedoMove","pos","oldParent","newParent","absLx","absLz","WALL_OUTSIDE_SURFACE_MESH_NAME","addUndoableAddRooftopElement","elem","undoableAdd","addedElement","handleAddElementOnRoof","intersections","intersection","eventObject","includes","getPointerOnRoof","posRelToFoundation","posRelToCentroid","computeState","makeSolarPanel","solarPanelModelName","solarPanelOrientation","solarPanelPoleHeight","solarPanelPoleSpacing","solarPanelTiltAngle","solarPanelRelativeAzimuth","solarPanelFrameColor","makeWindow","makeSensor","makeLight","lightDistance","lightIntensity","lightColor","stopPropagation","multiSelectionsMode","oldRise","spBoundaryCheck","solarPanelVertices","wallVertices","rooftopElementBoundaryCheck","spCollisionCheck","sp","spVertices","rooftopSPCollisionCheck","isFlatGambrel","getRooftopElementZ","isValidOnRoof","boundaryVertices","getRoofBoundaryVertices","getSolarPanelVerticesOnRoof","addUndoableMove","undoInvalidOperation","intersectionObjects","pastePoint","RoofHandle","roofHandleSize","pointerDownRef","hoveredRef","haveFiredEvent","setHeightLight","cursor","isFirstHandle","onPointerOut","RoofRenderer","renderRoof","prev","FlippedWallSide","RoofTexture00","RoofTexture01","RoofTexture02","RoofTexture03","RoofTexture04","RoofTexture05","RoofTexture06","RoofTexture07","setTexture","_transparent","fId","wallsOnSameFoundation","getWallOnSameFoundation","wid","startWall","wId","wallMap","rotationMap","count","isLoop","toFixed","rot","walls","lw","rw","leftMostWall","rightMostWall","highestLz","longestEavesLength","composedWallArray","isGabled","getHighestComposedWallHeight","ignoreSide","getHighestWallHeight","riseInnerState","setRiseInnerState","mansardTop","relToFoundation","getRoofPointsOfGambrelRoof","setUpdateElementOnRoofFlag","rId","useUpdateRooftopElementsByControlPoints","drawShapeOfGambrelRoof","frontSide","backSide","TopExtrude","children","setUpdate","useUpdateAfterMounted","FlatRoof","wireFramePoints","maxZ","shapeWithHoles","hole","holes","showHeatmap","PolarGrid","rotateHandle","setPosition","setRadius","setRotation","currParent","rcx","rcy","getWorldDataById","font","useLoader","FontLoader","helvetikerFont","fontSize","textGeometryParams","tickLabels","toDegrees","times","getOffset","RotateHandle","ratio","hoverHandle","noHoverHandle","rotationHandleLMesh","Wireframe","AirMass","HorizontalRuler","verticalLift","rulerArrowOffset","rulerTickMarkWidth","labelBackgroundColor","rulerOffset","ll2ul","backgroundColor","fontFace","textHeight","linewidth","lr2ur","ll2lr","ul2ur","LowerLeft","LowerRight","UpperLeft","UpperRight","AIR_DENSITY","KELVIN_AT_ZERO_CELSIUS","STEFAN_BOLTZMANN_CONSTANT","ASHRAE_C","MINUTES_OF_DAY","OMEGA_DAY","OMEGA_YEAR","SunMinutes","sunrise","sunset","AMBIENT_LIGHT_THRESHOLD","ROOFTOP_SOLAR_PANEL_OFFSET","TILT_ANGLE","HALF_DAY_MINUTES","computeDeclinationAngle","days","getTime","getFullYear","computeSunriseAndSunsetInMinutes","toRadians","computeHourAngle","getHours","getMinutes","computeHourAngleAtMinute","minutes","getSunDirection","computeSunLocation","hourAngle","declinationAngle","cosDec","sinDec","cosLat","sinLat","cosHou","sinHou","altitudeAngle","xAzm","yAzm","azimuthAngle","coords","sphericalToCartesianZ","calculatePeakRadiation","sunDirection","dayOfYear","altitude","airMassType","getExtraterrestrialRadiation","zenithAngle","KASTEN_YOUNG","computeAirMass","calculateDiffuseAndReflectedRadiation","peakRadiation","viewFactorWithSky","viewFactorWithGround","isZero","albedo","animate","heatmapTexture","setHeatmapTexture","streamlinesRef","arrowRadius","collectorRadius","streamlines","airInletZ","collectorHeight","airOutletZ","chimneyHeight","chimneyRadius","airInletR1","airInletR2","airOutletR1","airOutletR2","airOutletR3","line","gridLines","delta","useFrame","uniforms","dashOffset","specular","shininess","lineData","glowTexture","useTexture","GlowImage","receiverHeight","haloSize","blending","AdditiveBlending","depthWrite","SolarReceiverPipe","absorberHeight","apertureWidth","relativeLength","poleNumber","solarReceiverPipePoles","InnerCommonStoreState","action","obj","startsWith","ContextMenu","Move","Resize","useSolarPanelHeatmapTexture","useSolarPanelTexture","customizedFrameColor","customizedBacksheetColor","cellType","backsheetColor","canvasTexture","portrait","drawSolarPanelCanvasTexture","ny","ctx","getContext","fillStyle","fillRect","padding","gap","cellSizeX","cellSizeY","beginPath","CanvasTexture","MoveHandle","ResizeHandle","dms","initPointerDown","Upper","Lower","localToWorld","TiltHandle","showTiltAngle","setShowTiltAngle","tiltHandleRef","degree","Tilt","depthTest","Sunbeam","drawSunbeam","relativeEuler","fRotation","normalVector","sunBeamLength","fCenter","labelText","label","labelColor","labelFontSize","labelSize","labelHeight","SolarPanelOnRoof","latestFoundationRef","radialSegmentsPole","poleZ","drawPole","setDrawPole","hovered","setHovered","baseRef","solarPanelLinesRef","oldPosRef","oldDmsRef","oldAziRef","oldTiltRef","oldRotRef","oldNorRef","poles","poleArray","poleNx","poleNy","sinTilt","cosAz","sinAz","xi","yi","mx","my","baseSize","moveHandleSize","resizeHandleSize","tiltHandleSize","AddUndoableOperation","undoableResize","oldDms","oldNor","oldPos","oldRot","newDms","newPos","newNor","newRot","undoableRotate","oldValue","newValue","changedElementId","changedElementType","bifacialityFactor","cv","undoableChange","azimuth","anchor","newLy","newTAngle","unitLength","dl","l","pr","pc","cc","wc","newAzimuth","EmptyWall","wallModel","checkIfCanSelectMe","WallMoveHandleWrapper","ply","phz","WallResizeHandle","highLight","partial","addedWallID","WallPartialResizeLeft","WallPartialResizeRight","WallPartialResizeLeftTop","WallPartialResizeRightTop","WallResizeHandleWrapper","parentLz","absAngle","leftTopPartialResizeHandleHeight","rightTopPartialResizeHandleHeight","wallLeftHeight","wallRightHeight","setIntersectionPlanePosition","setIntersectionPlaneRotation","oldHeightsRef","oldSameBuildingWallsHeightMapRef","leftWallLzRef","rightWallLzRef","childElements","setIntersectionPlane","updateUndoChange","sameBuildingWallsHeightMap","getConnectedWallsHeight","getChildElements","isPartialWallValid","isPartial","realWallLeftHeight","realWallRightHeight","isTopPartial","resizeHandleObject","minZ","newLz","newUnfilledHeight","leftWallRightUnfilledHeight","rightWallLeftUnfilledHeight","newTopPartialResizeHandleHeight","leftWallPartialResizeRightTop","rightWallPartialResizeLeftTop","newSameBuildingWallsHeightMap","undoableChangeHeight","oldHeights","newHeights","oldSameBuildingWallsHeightMap","WallRenderer","areEqual","BUILDING_GROUP_NAME","BuildingRenderer","isBuildingParts","buildingParts","areEuqal","FOUNDATION_GROUP_NAME","solarStructure","pasteElements","deletedWallID","addedFoundationID","showGrid","setShowGrid","direction","wallAuxToAxis","setWallAuxToAxis","wallAuxToWallArray","setWallAuxToWallArray","addedWallIdRef","isSettingWallStartPointRef","isSettingWallEndPointRef","elementsStateBeforeResizingRef","flippedWallSide","null","wallMapOnFoundation","groupRef","grabRef","intersectPlaneRef","resizeHandleLLRef","resizeHandleULRef","resizeHandleLRRef","resizeHandleURRef","moveHandleLowerRef","moveHandleUpperRef","moveHandleLeftRef","moveHandleRightRef","oldPositionRef","newPositionRef","oldDimensionRef","newDimensionRef","oldAzimuthRef","newAzimuthRef","oldVerticesRef","newVerticesRef","oldJointsRef","newJointsRef","oldPointRef","newPointRef","positionLL","positionUL","positionLR","positionUR","handleRadius","moveHandleRadius","resizeHandleRadius","rotateHandleRadius","rotateHandlePosition","listenToAutoDeletionRef","undoableMoveWallArgsRef","trough","dish","reflector","getAutoDeletedElements","handleUndoMoveWallWithAutoDeletion","debounce","autoDeletedElements","newAngle","newJoints","oldPoints","newPoints","oldJoints","oldAngle","loop","flipWallLoop","flipWallsClockwise","flipWallsCounterClockwise","oldLeftJoints","oldRightJoints","newLeftJoints","newRightJoints","deletedRoof","FoundationTexture01","FoundationTexture02","FoundationTexture03","FoundationTexture04","FoundationTexture05","FoundationTexture06","FoundationTexture07","FoundationTexture00","param","fetchRepeatDividers","useCallback","handle","isMoveHandle","legalOnFoundation","findMagnetPoint","minDist","targetPoint","targetID","targetSide","jointId","distStart","distEnd","flag","dist","currentWallId","wallCopy","targetWall","flipWallHead","flipWall","flipWallCopy","nextWall","checkWallLoop","isClosed","totalAngle","totalNumber","wallNewLeftJointIdRef","wallNewRightJointIdRef","flipCurrWallRef","flipRightHandSideWallRef","flipLeftHandSideWallRef","getWallAngleByPointer","alignToWall","targetId","alignedX","alignedY","leftXDiff","rightXDiff","leftYDiff","rightYDiff","alignPointer","alignedToWallX","alignedToWallY","ALIGN_ANGLE_THRESHOLD","alignToAxis","alignedToAxisX","alignedToAxisY","getClosestAlignedPoint","val1","val2","checkAndSetPosAlignToWall","produce","draft","setShowWallAux","toWall","toAxis","handleShowAuxiliary","isAlignedToWallX","isAlignedToWallY","checkAndSetPosAlignToAxis","isAlignedToAxisX","isAlignedToAxisY","isSolarCollectorNewPositionOk","sc","JSON","parse","stringify","isSolarCollectorWithinHorizontalSurface","isSolarCollectorNewAzimuthOk","az","isSolarCollectorNewSizeOk","stand","clickObjectType","pasteNormal","altKey","bypass","handleUndoableAdd","wallRelativePosition","setY","targetJointId","snapToFineGrid","snapToNormalGrid","updatePointer","wallAbsolutePosition","pastedElements","undoablePaste","handleUndoableAddWall","autoDeletedElement","oldPosition","newPosition","oldDimension","newDimension","oldPoint","newPoint","deletedIdSet","setTimeout","handleUndoableResizeWall","newLeftWall","newRightWall","handleUndoableMoveWall","undoableEditPolygon","oldLx","oldLy","oldLz","newLx","isSolarCollector","collector","accept","relativeCoordinates","polygon","handleOffset","leftFlip","rightFlip","stretched","updateWallPointAfterSnap","magnetOffset","leftTarget","rightTarget","leftAlignedToWallX","leftAlignedToWallY","rightAlignedToWallX","rightAlignedToWallY","leftDiffX","rightDiffX","diffX","leftDiffY","rightDiffY","diffY","isLeftAlignedToWallX","isLeftAlignedToWallY","isRightAlignedToWallX","isRightAlignedToWallY","relativeCenter","detachId","targetWallId","addedWall","isPlantOrHuman","wp","resizeAnchor2D","rp","wbc","dyl","wcx","rc","dxl","parabolicTroughWidth","fresnelReflectorWidth","diameter","parabolicDishRimDiameter","wallAuxToWall","isElementAllowedMultipleMoveOnGround","FocusPipe","FocusTower","UpdraftTower","WallAuxiliaryLine","INTERSECTION_PLANE_NAME","getPointerOnIntersectionPlane","getPosRelToFoundation","isRectWindowInsideVertices","boundaryPoint2","isResizeHandle","setUndoableMove","setUndoableResize","setUndoableResizePolygonTop","getElementVerticesOnRoof","getPolygonTop","ArchResizeHandle","Arch","WindowHandleWrapper","isSettingNewWindow","isOnRoof","handleTypeRef","foundationModelRef","roofModelRef","roofSegmentsRef","roofCentroidRef","currRoofSegmentIdxRef","resizeAnchorWorldPosRef","roofBoundaryVerticesRef","roofChildVertices2DRef","oldRotationRef","oldArchHeight","oldPolygonTop","getResizeAnchor","worldPosition","setRefDataBeforePointerMove","windowModel","foundationGroup","buildingGroup","roofGroup","segmentGroup","getSegmentIdx","roofCentroid","addUndoableResize","newArchHeight","getBoundary","segmentIdx","collisionCheck","currentVertices","targetVertices","currentVertex","targetVertex","boundaryCheck","boundary","topVertex","isPolygonalWindowInsideVertices","dataOnRoof","windowId","eventObjectName","parseInt","split","getDataOnRoof","pointerOnIntersectionPlane","newCenter","insideBoundary","noCollision","pointerOnRoof","anchorWorldPos","pointerRelToFoundation","diffVector","getNewResizedData","whx","whz","lowerLeftPoint","lowerRightPoint","pointerRelToLowerLeft","botNormal","topXRelToLeft","projectOnVector","newTopX","topToBotDist2D","topToBotDist","newPolygonTop","anchorRelToFoundation","rectHeight","anchorToCenterNormal","addUndoableReizePolygonTop","wireframeRadius","RectangleWindow","RulerOnWall","yOffset","WINDOW_GROUP_NAME","GROUP_NAME","isContextMenu","isAllowedToSelectMe","onClickResizeHandle","dimensionData","positionData","positionY","isClickedOnHandles","renderWindow","WallWireFrame","showParapet","leftHeight","rightHeight","lowerLeft","lowerRight","upperLeft","upperRight","cl","cr","DoorWireFrame","ul","ur","ll","lr","DoorFrame","RectangleDoor","doorShape","ArchedDoor","ihx","ihz","iah","DoorHandleWrapper","DoorSealPlanes","doorModel","DoorTextureDefault","DoorTexture00","DoorTexture01","DoorTexture02","DoorTexture03","DoorTexture04","DoorTexture05","DoorTexture06","DoorTexture07","DoorTexture08","DoorTexture09","DoorTexture10","DoorTexture11","DoorTexture12","DoorTexture13","DoorTexture14","DoorTexture15","DoorTexture16","DoorTexture17","useDoorTexture","doorMaterial","MeshBasicMaterial","MeshPhongMaterial","getDoorArea","renderDoor","absRotation","wCenter","showIntersection","Mount","spCy","spLy","mountUnit","halfLz","startZ","HANDLE_GROUP_NAME","SolarPanelOnWall","setHoveredHandle","setNx","fontColor","fontOutlineWidth","fontOutlineColor","fontStrokeWidth","fontStrokeColor","lineStyle","Solid","noOutline","centerX","setCenterX","centerY","setCenterY","centerRef","cuboidWorldPosition","cuboidWorldRotation","updatePolygonSelectedIndexById","absoluteVertices","av","isIdentical","getCz","isSame","sideFace","shift","getPosition","PolygonTexture01","PolygonTexture02","PolygonTexture03","PolygonTexture04","PolygonTexture05","PolygonTexture06","PolygonTexture07","PolygonTexture08","PolygonTexture09","PolygonTexture10","PolygonTexture00","params","anchorX","anchorY","outlineWidth","outlineColor","strokeWidth","strokeColor","Dashed","PolygonVertex","DEFAULT_PARAPET_SETTINGS","display","parapetHeight","copingsWidth","copingsHeight","wallData","parapetZ","currWallPointData","leftWallPointData","rightWallPointData","bodyHeight","copingsPoints","outerLeft","outerRight","innerRight","innerLeft","currWallCopingsPoints","getCopingsPoints","isSamePoint","copingsInterSectionPoints","getCopingsIntersectionPoints","outerIntersection","innerIntersection","bodyShape","currWallInnerPoint","getWallPointsAfterOffset","rel","getBodyRelativeIntersectionPoint","copingsShape","copingsWireframePoints","bodyHorizontalWireframePoints","bodyVerticalWireframePoints","currCopingsPoints","sideWallPointData","sideWallCopingsPoints","currPoints","sideWallPoints","wallPointData","innerOffset","outerOffset","leftPointV3","rightPointV3","v3","v4","k1","k2","x0","y0","ElBeingAddedStatus","WallHeatFlux","isPartialWallFull","frameVertices","getWallVertices","partialWallVertices","getPartialWallVertices","frameArea","doors","getHighestPointOfWall","halfDif","isWall","WALL_BLOCK_PLANE","WALL_INTERSECTION_PLANE_NAME","WALL_PADDING","InsideWallMaterial","night","BackSide","structureSpacing","structureWidth","structureColor","leftWallId","rightWallId","isElementTriggerWallChange","elementsTriggerChange","elementsOnWall","isLegalOnWall","useElements","outsideWallRef","insideWallRef","topSurfaceRef","addedWindowIdRef","invalidElementIdRef","elBeingAddedRef","leftOffset","getInnerWallOffset","rightOffset","Pillar","realLeftUnfilledHeight","realRightUnfilledHeight","whiteMaterialDouble","zmax","outsideWallShape","wallShape","drawDoorShape","sort","door","dcx","dcy","dlx","dly","drawWallShape","windowShape","wlx","wly","drawArchWindow","drawPolygonalWindow","drawRectWindow","insideWallShape","dh","rightOffsetHeight","leftOffsetHeight","topSurfaceHeight","topSurfaceRotationY","topWallShape","drawTopSurface","tHx","tInnerLeftHx","tInnerRightHx","outerWallPoints2D","structureUnitArray","wallDataToParapet","currWallPointDataToParapet","leftWallPointDataToParapet","rightWallPointDataToParapet","getRelativePosOnWall","wallAbsPos","getElementVerticesOnWall","signX","signY","checkCollision","elx","elz","pointX","pointY","checkInsideBoundary","eLx","eLz","isDoor","checkPolygonTopInsideBoundary","wLx","wLz","topPointX","topPointY","getWallBoundary","getPositionOnGrid","parseFloat","checkPerpendicular","vLeft","setElementPosDms","hasPolygonTop","resetBeingAddedChildId","isFirstIntersectedObject","ifChildNeedsChangeParent","wallId","isChildType","isArchedResize","offsetWallEdgePoints","elHx","elHy","isWallPoints","edgeVector","offsetVector","getDiagonalResizedData","diagonal","dimensionXZ","positionXZ","isValidToAddRoof","rect","sameHeight","isSettingElementStartPoint","status","SettingStartPoint","getPointer","object3D","diagonalVector","relativePositionOnWall","positionOnGrid","relativePointer","pointerOnGrid","resetToAddingNewObjectStatus","elBeingAdded","getElementHalfSize","getRoofPoints","roofPoints","getBoundedPointer","ignorePadding","elementHalfSize","leftPadding","rightPadding","elHz","boundingMinX","boundingMaxX","boundingMinZ","boundingMaxZ","boundedPointer","botHeight","topHeight","boundedShape","edgesPoints","botLeftPoint","botRightPoint","topRightPoint","topLeftPoint","getBoundedShape","pointer2D","isElementOutside","isPointerOutsideShape","closestPoint","closestDistance","edgeStart","edgeDirection","edgeLengthSq","lengthSq","toStart","projectionFactor","closestEdgePoint","distanceSq","getClosestPointOnPolygon","moveElement","pg","newVertices","getArchedResizedData","archedElement","wlz","archHeightBottom","handleWallBodyPointerDown","SettingEndPoint","addElementByClick","makePyramidRoof","makeGableRoof","makeHipRoof","makeGambrelRoof","makeMansardRoof","mesh","canPaste","handleWallSideSurfacePointerDown","handleStudPointerDown","handleStudContextMenu","invalidateIdSet","getWallPoints2D","intersectedWalls","isFirstIntersectedWall","objectType","setElementHasBeenAdded","makeDoor","makeNewMovingElement","isInside","isvalid","isPolygonTopInside","getSolarPanelUnitLength","unitX","unitY","oldPg","newPg","handleUndoableResize","wallCenterPos","wallCenterHeight","leftLength","leftRotationY","rightLength","rightRotationY","renderStuds","topBarThickness","renderPillars","A","B","C","wallPoints2D","inside","xj","yj","currWallId","counterWallId","ch","NaN","leftDis","rightDis","upperHalf","roofHeight","getSegmentVertices","getSegmentNormal","getRotationFromNormal","orderedWallArray","wall0","nextId","unshift","elementVertices","currVertices","targetElementsVertices","getWindowVerticesOnRoof","sp2Vertices","i1","from1","to1","i2","from2","to2","lineIntersection","maxWallHeight","isStackableModel","CuboidFace","handleColor","Handles","intersectionPlaneData","setIntersectionPlaneData","raycaster","cuboidWorldBottomHeight","parentWorldRotation","parentWorldPosition","childPositionMap","childSideMap","lowerRotateHandlePosition","upperRotateHandlePosition","showTopResizeHandles","showMoveAndRotateHandles","cm","getWorldRotation","isHumanOrPlant","intersectObject","isTopResizeHandle","resizeLz","isXResizeHandle","cuboid","worldCenter","currWorldPosition","currWorldRotation","childWorldPosition","relPos","NS","EW","resizeLx","isYResizeHandle","resizeLy","resizeXY","handleRotate","parentWorldPos","parentWorldRot","worldPos","handleObject","topHandleWorldPosition","LowerLeftTop","UpperLeftTop","LowerRightTop","UpperRightTop","handleGroup","SolarPanelOnCuboid","solarPanelModel","isTop","isSolarPanelOnTopFace","actualPoleHeight","rotateHandleSize","pointerDown","oldTiltAngleRef","newTiltAngleRef","parentWorldRotationRef","dateObject","groupRotation","panelRotation","getWorldRotationZ","ALTAZIMUTH_DUAL_AXIS_TRACKER","HORIZONTAL_SINGLE_AXIS_TRACKER","VERTICAL_SINGLE_AXIS_TRACKER","showRotateHandle","showTiltHandle","showPoles","getRotateHandleColor","ov","SolarPanelBoxGroup","actualTiltAngle","actualRelativeAzimuth","resizeHandleArgs","solarPanelLines","getRelativeSunDirection","relativeSunDirection","setRelativeSunDirection","worldRotationZ","getResizeHandleColor","newRelativeSunDirection","selfRotation","cuboidModel","updateSolarPanelRelativeAzimuthById","heatmapTextureTop","setHeatmapTextureTop","heatmapTextureSouth","setHeatmapTextureSouth","heatmapTextureNorth","setHeatmapTextureNorth","heatmapTextureWest","setHeatmapTextureWest","heatmapTextureEast","setHeatmapTextureEast","setNormal","faceNormalRef","gridPositionRef","gridRotationRef","gridDimensionRef","oldNormalRef","newNormalRef","worldPositionRef","worldRotationRef","tempHumanPlant","maxValue","heatmapTop","heatmapSouth","heatmapNorth","heatmapWest","heatmapEast","fetchTextureImage","Facade01","Facade_Texture_01","Facade02","Facade_Texture_02","Facade03","Facade_Texture_03","Facade04","Facade_Texture_04","Facade05","Facade_Texture_05","Facade06","Facade_Texture_06","Facade07","Facade_Texture_07","Facade08","Facade_Texture_08","Facade09","Facade_Texture_09","Facade10","Facade_Texture_10","Facade_Texture_00","textureLoaderEast","setTextureEast","textureEast","textureLoaderWest","setTextureWest","textureWest","textureLoaderNorth","setTextureNorth","textureNorth","textureLoaderSouth","setTextureSouth","textureSouth","textureLoaderTop","setTextureTop","textureTop","setupGridParams","aboveDistance","onTopSurface","isSolarPanelNewPositionOk","isSolarPanelNewSizeOk","materials","handleArgs","showHandles","legalAddToCuboid","diff","handleAddElement","legalOnCuboid","isSolarPanelNewAzimuthOk","sensorModel","light","heatFlux","applyAxisAngle","absoluteCoordinates","lit","lightModel","parentThickness","CUBOID_WRAPPER_NAME","CUBOID_STACKABLE_CHILD","CuboidRenderer","isStackableChild","design","yearlyYield","sellingPrice","panelCount","unitCost","lat","model","title","userid","newWidth","newHeight","resizedCanvas","drawImage","from","to","order","rotateX","rotateY","rotateZ","Triangle","getArea","total","calculateBuildingArea","hasRoof","ROOF_MISSING","WALL_DISJOINED","COMPLETE","getWallPointsOfRoof","uValueInSI","uValueInUS","rValueInSI","rValueInUS","grd","createRadialGradient","addColorStop","scene","objects","traverse","fetchSimulationElements","getSimulationElements","determinant","lambda","gamma","valuePerColorRange","colorIndex","scalar","lerp","array2d","col","row","flip","clearRect","imageData","getImageData","pixels","calculateSolarRadiationColor","off","g","putImageData","rack","excludeLocked","f1","f2","fetchFoundationVertexCoordinates","xc","yc","cosaz","sinaz","sp1","sp2","fetchSolarPanelVertexCoordinates","pts","first","last","f","nPts","twiceArea","polygonModel","angleInRadian","rotatedVertices","childAbsPosMap","absPos","childrenClone","childClone","childAbsPos","relativePos","parentClone","doesParentContainAllChildren","isSensorWithin","isWallWithin","indexOf","found","deleteElement","WaterHeater","isSolarCollectorType","isCspCollectorType","isParabolaType","isDescendantOf","boundingPoints","elementPoints","eMinX","eMaxX","eMinZ","eMaxZ","getWallInnerSideShapePoints","OutsideBoundary","ehx","ehz","tMinX","tMaxX","tMinZ","tMaxZ","OverLap","Valid","Invalid","parentPos","grandParent","grandParentPos","getStackCuboidObjectById","wrapper","degrees","radians","getArrayMax","getArrayMin","sphereCoords","lng1","lat1","lng2","lat2","UTC","getMonth","getDate","year","platform","os","family","getOS","WebGLRenderingContext","l1","xx","yy","D","len_sq","eave","deltaAngle","WATER_TEXTURE","fetchWaterTexture","WHITE_TEXTURE","fetchWhiteTexture","getAllConnectedWalls","currPos","currRot","currTopZ","worldRot","worldTopZ","isChild","baseId","childId","checkLock","getBaseId","isElementTriggerAutoDeletion","DefaultWorldModel","immerable","toLocaleString","thermalDiffusivity","snowReflectionFactors","APPROXIMATE","woman","worldModel","ElementModelCloner","noMove","clonePolygon","cloneSensor","cloneLight","cloneSolarPanel","cloneParabolicTrough","cloneParabolicDish","cloneFresnelReflector","cloneHeliostat","cloneWindTurbine","cloneWall","cloneWindow","cloneDoor","cloneRoof","cloneHuman","cloneTree","cloneFlower","cloneFoundation","cloneCuboid","human","pm","translatePolygonCenterTo","windTurbine","enableGroupMaster","newRoof","ceilingRValue","newGambrelRoof","oldGambrelRoof","DefaultViewState","cameraPositionNav","cameraRotationNav","UndoManager","commands","limit","isExecuting","command","DefaultSolarPanelArrayLayoutParams","leftRight","ElementCounter","foundationCount","cuboidCount","wallCount","windowCount","doorCount","humanCount","treeCount","flowerCount","polygonCount","sensorCount","insideLightCount","outsideLightCount","solarPanelCount","solarPanelModuleCount","parabolicDishCount","parabolicTroughCount","fresnelReflectorCount","heliostatCount","solarUpdraftTowerCount","windTurbineCount","DefaultGeneticAlgorithmParams","problem","objectiveFunctionType","selectionMethod","searchMethod","populationSize","maximumGenerations","selectionRate","crossoverRate","mutationRate","convergenceThreshold","localSearchRadius","DAILY_TOTAL_OUTPUT","ROULETTE_WHEEL","GLOBAL_SEARCH_UNIFORM_SELECTION","DefaultParticleSwarmOptimizationParams","swarmSize","maximumSteps","vmax","inertia","cognitiveCoefficient","socialCoefficient","DefaultEvolutionaryAlgorithmState","geneticAlgorithmParams","particleSwarmOptimizationParams","SOLAR_PANEL_TILT_ANGLE","DefaultSolarPanelArrayLayoutConstraints","minimumInterRowSpacing","maximumInterRowSpacing","minimumRowsPerRack","maximumRowsPerRack","minimumTiltAngle","maximumTiltAngle","DefaultEconomicsParams","projectLifeSpan","DefaultActionState","humanName","flowerType","treeType","treeSpread","treeHeight","foundationHeight","foundationColor","foundationTexture","groundFloorRValue","cuboidHeight","cuboidFaceColors","cuboidFaceTextures","roofGlassOpacity","roofGlassTint","roofRafterWidth","roofRafterSpacing","roofRafterColor","roofVolumetricHeatCapacity","doorFrameColor","doorOpacity","doorVolumetricHeatCapacity","windowWidth","windowHeight","parabolicDishReflectance","parabolicDishAbsorptance","parabolicDishOpticalEfficiency","parabolicDishThermalEfficiency","parabolicDishLatusRectum","parabolicDishPoleHeight","parabolicDishPoleRadius","parabolicDishReceiverStructure","parabolicTroughReflectance","parabolicTroughAbsorptance","parabolicTroughOpticalEfficiency","parabolicTroughThermalEfficiency","parabolicTroughLatusRectum","parabolicTroughPoleHeight","parabolicTroughModuleLength","fresnelReflectorReceiver","fresnelReflectorReflectance","fresnelReflectorPoleHeight","fresnelReflectorModuleLength","heliostatTower","heliostatReflectance","heliostatPoleHeight","heliostatPoleRadius","heliostatWidth","heliostatLength","DefaultGraphState","ProjectUtil","hidden","variable","axis","calculateCost","calculateProfit","StoreUtil","elementMap","unfilledHeight","mullion","mullionSpacing","shutter","gambrelRoof","frontRidgeRightPoint","backRidgeRightPoint","topRidgeRightPoint","isGroupable","enableMapSet","devtools","persist","immerSet","fn","defaultWorldModel","defaultElements","getElements","log","modelType","UNKNOWN","modelAuthor","modelLabel","modelDescription","owner","description","designs","ranges","hiddenParameters","getDefaultHiddenParameters","counter","dataColoring","ALL","selectedProperty","sortDescending","xAxisNameScatteredPlot","yAxisNameScatteredPlot","dotSizeScatteredPlot","thumbnailWidth","projectImages","designProjectType","modelsMapAddress","GENETIC_ALGORITHM","updateOldFileData","fixElements","docid","time","dayjs","format","uid","signFile","displayName","email","resetWorldModel","resetViewState","Box3","findNearestSibling","foundId","me","distanceSquare","sq","threshold","overlap","doSolarPanelsOverlap","thresholdSquared","parentPosition","parentRotation","handlePosition","referenceId","updateElementLxOnSurface","updateElementLyOnSurface","updateElementLzAboveFoundation","updateElementLzOnSurface","draw","updateSolarCollectorPoleRadiusOnSurface","clearAllSolarCollectorYields","isCspCollector","isParabolicCollector","OnlyThisObject","setSolarPanelOrientation","isHeliostatOrFresnelReflector","isParabolicTroughOrFresnelReflector","setWallActionScope","setWindowActionScope","setDoorActionScope","updateWallRelativeAngleById","joints","updateWallRightPointById","structure","makeHuman","makeTree","makeFlower","polygonParentModel","polygonRelativeCoordinates","makePolygon","sensorParentModel","sensorRelativeCoordinates","lightParentModel","lightRelativeCoordinates","solarPanelParentModel","solarPanelRelativeCoordinates","parabolicTroughParentModel","parabolicTroughRelativeCoordinates","makeParabolicTrough","parabolicDishParentModel","parabolicDishRelativeCoordinates","makeParabolicDish","fresnelReflectorParentModel","fresnelReflectorRelativeCoordinates","makeFresnelReflector","heliostatParentModel","heliostatRelativeCoordinates","makeHeliostat","makeFoundation","makeCuboid","wallParentModel","makeWall","deletedElements","parentWall","copiedWindow","removeSelectedElements","selectedIdSet","selectedIds","deletedElementSet","deletedElementIdSet","currentWall","cut","autoDeleted","removed","observer","cache","countAllElements","countAllElementsByType","ancestorId","includingLocked","idOk","copyCutElements","copiedElements","elementsMapOldToNew","elementsMapNewToOld","oldElem","newElem","oldRoofId","oldWallId","elemToPaste","isPositionRelative","approved","getAllChildren","newChild","grandChild","newGrandChild","oldRoof","checkElementOnWallState","vrx","vlx","getRotationOnRoof","windowVertices","getRoofSegmentBoundary","rooftopWindowCollisionCheck","relativePoint","cutElements","roofVertices","nearestNeighborId","nearestNeighbor","oldX","oldY","pvModels","Papa","pvmodules","complete","results","isArray","pv","trim","brand","efficiency","nominalLength","nominalWidth","pmax","vmpp","impp","voc","isc","pmaxTC","noct","weight","shadeTolerance","weather","lows","highs","sun","wm","city","country","elevation","lowestTemperatures","highestTemperatures","sunshineHours","location","horizontalSolarRadiationData","radiationData","solar_radiation_horizontal","sr","verticalSolarRadiationData","solar_radiation_vertical","wd","setSceneRadius","updateWallMapOnFoundation","updateElementOnRoofFn","setGroupActionMode","enUS","setCreateNewFileFlag","setOpenLocalFileFlag","localFileDialogRequested","pvModelDialogVisible","getStorage","URLSearchParams","search","sessionStorage","localStorage","whitelist","ErrorPage","props","hasError","errorInfo","reload","marginLeft","clearCacheAndReload","Component","Sky","meshRef","absPosMapRef","polygonsAbsPosMapRef","oldWidthRef","oldHeightRef","oldChildrenPositionsMapRef","oldChildrenParentIdMapRef","newChildrenPositionsMapRef","newChildrenParentIdMapRef","oldHumanOrTreeParentIdRef","elementParentRotation","intersectionPlaneType","setIntersectionPlaneType","intersectionPlaneAngle","Vertical","cameraDir","Desert","Dune","Forest","Grassland","Hill","Lake","Mountain","Rural","DesertImage","DuneImage","ForestImage","GrasslandImage","HillWinterImage","HillSpringImage","HillSummerImage","HillFallImage","LakeImage","MountainImage","RuralImage","DefaultImage","clickSky","getObjectId","nameArray","handleDetachParent","parentObject","getObjectChildById","attachToGroup","attachParentId","currParentId","currParentObj","currObj","attachParentObj","setParentIdById","isFoundationOrCuboid","getIntersectionToStand","handleTreeOrHumanRefMove","elementRef","intersectionObj","elementParentRef","intersectionObjGroup","handleSetElementState","standObjId","cuboidCenter","cuboidChildren","centerAbsPos","vertexAbsPosArray","vertexAbsPos","newHumanOrTreeParentId","newRelZ","oldChildrenPositionsMap","newChildrenPositionsMap","oldChildrenParentIdMap","newChildrenParentIdMap","undoableChangeSpread","fetchIntersectables","intersectionObjId","moveOk","screenPosition","screenLx","screenLy","screenLz","isMoveToSky","showTickMarks","showTickLabels","tickIntervalRef","labelIntervalRef","arrayRef","majorTickLength","tickMarkColor","tickMarkLineWidth","cameraZ","fetchTickLength","isRender","humanModel","fileChangedRef","fileChangedState","getParentObject","fetchLabel","cameraX","cameraY","currX","currY","gender","fetchGender","hatOffsetX","fetchHatOffsetX","hatOffsetY","fetchHatOffsetY","Billboard","follow","renderOrder","alphaTest","eyeball","TreeData","leafOutDay","leafOffDay","lastDayOfSpring","lastDayOfSummer","northernHemisphere","AppleWinterImage","AppleSummerImage","AppleSpringImage","AppleFallImage","BirchWinterImage","BirchSummerImage","BirchSpringImage","BirchFallImage","CoconutImage","DogwoodWinterImage","DogwoodSummerImage","DogwoodSpringImage","DogwoodFallImage","ElmWinterImage","ElmSummerImage","ElmSpringImage","ElmFallImage","FanPalmImage","LindenWinterImage","LindenSummerImage","LindenSpringImage","LindenFallImage","MagnoliaWinterImage","MagnoliaSummerImage","MagnoliaSpringImage","MagnoliaFallImage","MapleWinterImage","MapleSummerImage","MapleSpringImage","MapleFallImage","OakWinterImage","OakSummerImage","OakSpringImage","OakFallImage","SpruceImage","PineImage","showModel","solidTreeRef","shadowTreeRef","trunkMeshRef","interactionPlaneRef","resizeHandleTopRef","resizeHandleLeftRef","resizeHandleRightRef","resizeHandleLowerRef","resizeHandleUpperRef","treeModel","isEvergreen","fetchTheta","customDepthMaterial","MeshDepthMaterial","depthPacking","RGBADepthPacking","positionTop","positionLeft","positionRight","positionLower","positionUpper","sunlightX","sunlightY","isConic","El","CheckStatus","ParabolicCylinder","Paraboloid","numberOfModules","setNumberOfModules","frontSideRef","backSideRef","moveHandleRef","parabolaSegments","focalLength","rotatedSunDirection","reflectedLightShift","cosRot","sinRot","focusPoint","sunPoint","moduleLines","t0","dt","detailed","haloRadius","wireframeLines","outer","inner","depth4","tripodLines","quadrupodLines","focalPoint","receiver","receiverCenter","shiftedReceiverCenter","rotationAxis","sunDirectionClone","tower","faceUp","setFaceUp","panelNormal","interactionMeshRef","flowerModel","Container","styled","div","SimulationControlPanel","EvolutionControlPanel","Spin","initializing","hasMovingParts","spinning","EndWaiting","End","ElementsRenderer","ClearDeletedRoofIdSet","Ground","setElementRotation","groundModel","getThree","groundPlaneRef","oldPolygonVerticesMapRef","newPolygonVerticesMapRef","oldWallPointsMapRef","newWallPointsMapRef","newRotationRef","oldHumanOrPlantParentIdRef","oldCuboidParentIdRef","wallsAbsPosMapRef","isSettingFoundationStartPointRef","isSettingFoundationEndPointRef","isSettingCuboidStartPointRef","isSettingCuboidEndPointRef","isHumanOrPlantMovedRef","baseGroupRelPosMapRef","baseGroupOldPosMapRef","baseGroupNewPosMapRef","moveHandleWorldDiffV3Ref","cosAngle","sinAngle","Horizontal","handlePlantOrHumanRefMove","intersectionObjGroupWorldRotation","resizeElementOnPointerUp","isResizingVertical","newRelativePos","oldRelativePos","elementsOnRoof","getRooftopChildren","centerRelPos","oldPolygonVerticesMap","newPolygonVerticesMap","oldWallPointsMap","newWallPointsMap","isRoofTopElement","updateBaseGroupPosition","moveElementOnPointerUp","newHumanOrPlantParentId","oldPositionMap","newPositionMap","isCuboid","rotatedElementId","rotatedElementType","rotateElementOnPointerUp","setBasePosMap","checkOverlapWithAllBases","currElem","areTwoBasesOverlapped","handleGroupMaster","handleTempHumanPlantChild","getFirstStackableCuboid","firstIntersectedCuboidObject","intersect","firstIntersectedCuboidObjectId","legalOnGround","handleHumanAndPlantPositionFixedOnParent","handleResize","sizeOk","centerPointAbsPos","leftPointAbsPos","rightPointAbsPos","centerPointRelativePos","leftPointRelativePos","rightPointRelativePos","verticesAbsPos","centerPos","relPosToFoundation","handleMove","isMultipleMove","foundationCenterV2","foundationChildren","parentAbsPos","parentAbsRot","currAbsRot","needsUpdate","worldLatitude","setLatitude","angleArcRadius","angleLabelHeight","baseGeometry","lineGeometry","basePoints","tickPoints","basePositions","baseNormals","baseColors","BufferAttribute","sunPathPoints","sunMinutes","getSunPathPointsByDate","day","decline","pointArraySunPaths","sunPosition","sunDirectionOnGround","elevationAngle","elevationAngleArcPoints","points3D","zenithAngleArcPoints","azimuthAngleArcPoints","sunbeltGeometry","declinationStep","hourStep","verticesCount","Uint16Array","sunRadius","vertexColors","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","clippingPlanes","Plane","HeliodonWrapper","heliodonRadius","dateString","Team","linePos","top100","top200","borderRadius","border","textAlign","verticalAlign","marginRight","Ukrainian","Spanish","Turkish","About","close","CspSimulationSettings","SubMenu","Menu","Option","Item","onChange","paddingLeft","precision","PvSimulationSettings","gridCellSize","EXACT","checked","SutSimulationSettings","noAnimation","BuildingEnergySimulationSettings","checkBuilding","NO_BUILDING","atLeastOneGood","atLeastOneBad","errorType","completionStatus","getBuildingCompletionStatus","AT_LEAST_ONE_BAD_NO_GOOD","buildingCompletion","AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD","getLightAbsorption","lc","toLowerCase","bigint","substring","adjustEnergyUsage","outsideTemperatureRange","heatExchange","setpoint","low","high","getOutsideTemperatureAtMinute","hi","lo","minute","mean","ampl","daylight","temperatureAtSunset","minutesAfterSunset","exp","computeOutsideTemperature","los","his","month1","month2","currentYear","currentMonth","dayInMonth","halfOfCurrentMonth","daysOfMonth","halfOfPreviousMonth","getGroundTemperatureAtMinute","airTemperatureFluctuationAmplitudeOfDay","average","hiMax","hiMin","loMax","loMin","amplitude","calculateTemperatureOnDay","ModelSiteDialog","setDialogVisible","setModelType","generateRandomAnimal","setModelAuthor","setModelLabel","setModelDescription","dragEnabled","setDragEnabled","bounds","setBounds","dragRef","okButtonRef","TextArea","Input","focus","onMouseOver","onMouseOut","footer","disabled","onCancel","maskClosable","destroyOnClose","modalRender","modal","onStart","uiData","documentElement","targetRect","getBoundingClientRect","gutter","paddingBottom","span","alt","src","UnknownIcon","UNDER_CONSTRUCTION","UnderConstructionIcon","RESIDENTIAL_BUILDING","ResidentialBuildingIcon","COMMERCIAL_BUILDING","CommercialBuildingIcon","SCHOOL_BUILDING","SchoolBuildingIcon","TOURIST_ATTRACTION","TouristAttractionIcon","PHOTOVOLTAIC","SolarPanelIcon","PARABOLIC_DISH","ParabolicDishIcon","PARABOLIC_TROUGH","ParabolicTroughIcon","FRESNEL_REFLECTOR","FresnelReflectorIcon","SOLAR_POWER_TOWER","HeliostatIcon","maxLength","test","rows","CreateNewProjectDialog","setProjectType","setProjectTitle","setProjectDescription","fetchProject","setProjectState","firebase","firestore","collection","doc","then","catch","range","FieldValue","arrayUnion","updateRanges","createDesign","thumbnail","countAllSolarPanelDailyYields","countAllSolarPanelYearlyYields","economicParams","changeDesignTitles","projectDesigns","newDesigns","createDesignTitle","designTitle","lastIndexOf","image","copyDesign","original","exists","loadCloudFile","ofProject","popState","viewOnly","newUrl","encodeURIComponent","history","pushState","radioStyle","lineHeight","MainMenuContainer","StyledImage","img","LabelContainer","MainMenu","set2DView","resetView","zoomView","setNavigationView","setAboutUs","modelSiteDialogVisible","setModelSiteDialogVisible","createNewProjectDialogVisible","setCreateNewProjectDialogVisible","saveProjectAsDialogVisible","setSaveProjectAsDialogVisible","updateMenuFlag","setUpdateMenuFlag","isMac","keyHome","loadFile","input","sun_angles","insolation_and_climate","solar_radiation_to_box","sun_beam_at_center","thermal_vs_building_envelope","effect_house_size","effect_house_orientation","effect_wall_roof_insulation","effect_roof_color","effect_eaves_overhang_length","effect_window_shgc","effect_thermostat_setpoint","effect_solar_panels","effect_ground_temperature","effect_trees","office_building_01","hotel_01","spanish_style_hotel","apartment_building_01","white_house","bilim_mersin_turkiye","south_burlington_high_school","mescalero_apache_school","heatmap_01","vegetative_buffer_01","solar_canopy_form_factors","solar_canopy_over_bleachers","solar_bus_stop","solar_facade_tesla","solar_canopy_over_garage","bipv_01","floatovoltaics","agrivoltaics","effect_tilt_angle_solar_panel","effect_azimuth_solar_panel","effect_azimuth_parabolic_trough","effect_latus_rectum_parabolic_trough","parabolic_dish_focus_sunlight","effect_orientation_solar_panel","solar_panel_types","vertical_bifacial_solar_panels","compare_monofacial_bifacial_solar_panels","why_solar_array","solar_panel_array_auto_layout","inter_row_spacing","rooftop_solar_panels","solar_panels_over_canal","solar_noise_barrier","rainbow_swash_solar_farm","mickey_mouse_solar_farm","solar_farm_hsat_array","solar_farm_aadat_array","solar_trackers","nevada_solar_one_parabolic_troughs","tooele_parabolic_dish_array","ps10_solar_power_tower","linear_fresnel_reflectors","linear_fresnel_reflectors_two_absorbers","effect_absorber_pipe_height","effect_azimuth_fresnel_reflector","cosine_efficiency_heliostats","shadowing_blocking_heliostats","effect_solar_power_tower_height","solar_power_tower","solar_updraft_tower","solar_updraft_tower_city","cape_cod_with_shed_dormer","mansard_roof_with_dormers","t_shaped_house","all_roof_types","a_frame_house","half_timbered_house","dutch_gable_roof","combination_roof_vs_bonnet_roof","butterfly_roof_house","gable_roof_vs_hip_roof","gable_and_valley_roof","clerestory_roof","monitor_roof","colonial_vs_saltbox","gambrel_roof_vs_mansard_roof","colonial_house","dutch_colonial_house","cape_cod_with_garage","greenhouse","solarium","pavilion","octagonal_pagoda","ocean_front","mosque_01","church_01","cathedral_01","cathedral_02","adobe_taos_house","egyptian_pyramids","mayan_pyramid","si_o_se_pol","stacked_cuboids","barn_house","ranch_house","bonnet_house","modern_house_01","solar_radiation_predicted_vs_measured","bestest_case_600","bestest_case_610","bestest_case_620","bestest_case_630","tucson_sundt_station","ai_tilt_angle_one_row","ai_tilt_angles_multiple_rows","ai_solar_farm_design","ai_solar_farm_design_block","ai_fitchburg_solar_farm","getExample","Modal","confirm","icon","ExclamationCircleOutlined","onOk","saveAndImport","okText","cancelText","loadProject","designIndex","process","viewAlreadyReset","readyToPaste","elementCounter","triggerSubMenuAction","urlId","matched","imgUrl","saveImage","hasUndo","hasRedo","elementType","undoableCut","commandName","getLastUndoName","getLastRedoName","undoableResetView","oldCameraPosition","oldPanCenter","undoableCheck","setSurfaceShininess","oldOpacity","newOpacity","gotSome","hasHeliostatOrFresnelReflectors","formatter","checkResult","WALL_EMPTY","paddingRight","Group","zhCN","zhTW","esES","trTR","ukUA","English","ChineseSimplified","ChineseTraditional","overlay","trigger","onVisibleChange","logo","alignContent","AcceptCookie","buttonText","cookieName","background","zIndex","buttonStyle","expires","MERCATOR_PROJECTION_SCALE_CONSTANT","GroundImage","zoomScale","groundImageRef","getRoadMap","keyName","lockElement","on","selectedElementType","useLabel","setLabelText","useLabelShow","useLabelText","oldLabel","useLabelFontSize","updateFontSize","oldSize","newSize","useLabelSize","updateLabelSize","useLabelColor","updateLabelColor","oldColor","newColor","useLabelHeight","updateLabelHeight","oldHeight","useSelectedElement","useColorPicker","selectedColor","setSelectedColor","colorResult","hex","Dialog","rejectedMessage","onApply","onClose","onClickOk","onClickCancel","handleClickOk","showRejectMessage","fontWeight","FoundationColorSelection","actionScope","updateInMap","updateColor","AllSelectedObjectsOfThisType","AllObjectsOfThisType","needChange","oldColorsSelected","undoableChangeSelected","oldValues","oldColorsAll","undoableChangeAll","onChangeComplete","paddingTop","FoundationLengthInput","inputValue","setInputValue","denormalizedPosMapRef","oldChildrenVerticesMapRef","newChildrenVerticesMapRef","denormalizedVerticesMapRef","rejectRef","rejectedValue","rejectChange","doesNewSizeContainAllChildren","containsAllChildren","updateLxWithChildren","newX","newY","attachToObjectGroup","updateLxInMap","setLx","oldLxsSelected","oldSizes","oldChildrenVerticesMap","newChildrenVerticesMap","ps","vs","oldLxsAll","FoundationWidthInput","denormalizedPositionMapRef","updateLyWithChildren","updateLy","oldLysSelected","oldLysAll","FoundationHeightInput","updateLzAndCzById","updateLzAndCzForAll","updateCzOfChildren","updateLzAndCzInMap","setLz","oldLzsSelected","oldLzsAll","FoundationAzimuthInput","updateAzimuth","oldAzimuthsSelected","oldAzimuthsAll","oldAzimuth","FoundationTextureSelection","selectedTexture","setSelectedTexture","updateFoundationTextureById","updateFoundationTextureForAll","updateTextureInMap","updateTexture","oldTexturesSelected","oldTexturesAll","oldTexture","Foundation_Texture_01_Menu","Foundation_Texture_02_Menu","Foundation_Texture_03_Menu","Foundation_Texture_04_Menu","Foundation_Texture_05_Menu","Foundation_Texture_06_Menu","Foundation_Texture_07_Menu","SolarAbsorberPipeHeightInput","absorberPipe","updateById","updateForAll","setAbsorberHeight","oldValuesSelected","oldValuesAll","SolarAbsorberPipeAbsorptanceInput","absorberAbsorptance","updateAbsorptance","SolarAbsorberPipeOpticalEfficiencyInput","absorberOpticalEfficiency","setOpticalEfficiency","oe","SolarAbsorberPipeThermalEfficiencyInput","absorberThermalEfficiency","setThermalEfficiency","te","SolarAbsorberPipeApertureWidthInput","updateApertureWidth","aw","SolarAbsorberPipePoleNumberInput","setPoleNumber","pn","SolarUpdraftTowerChimneyHeightInput","updateChimneyHeightById","updateChimneyHeightForAll","setChimneyHeight","SolarUpdraftTowerChimneyRadiusInput","updateChimneyRadiusById","updateChimneyRadiusForAll","setChimneyRadius","SolarUpdraftTowerCollectorRadiusInput","updateCollectorRadiusById","updateCollectorRadiusForAll","setCollectorRadius","SolarUpdraftTowerCollectorHeightInput","updateCollectorHeightById","updateCollectorHeightForAll","setCollectorHeight","SolarPowerTowerHeightInput","powerTower","setTowerHeight","SolarPowerTowerRadiusInput","setTowerRadius","SolarPowerTowerReceiverAbsorptanceInput","receiverAbsorptance","setAbsorptance","SolarPowerTowerReceiverOpticalEfficiencyInput","receiverOpticalEfficiency","updateOpticalEfficiency","SolarPowerTowerReceiverThermalEfficiencyInput","receiverThermalEfficiency","SolarUpdraftTowerCollectorTransmissivityInput","collectorTransmissivity","transmissivity","setTransmissivity","ct","SolarUpdraftTowerDischargeCoefficientInput","dischargeCoefficient","coefficient","setCoefficient","dc","SolarUpdraftTowerTurbineEfficiencyInput","turbineEfficiency","setEfficiency","SolarUpdraftTowerCollectorEmissivityInput","collectorEmissivity","emissivity","setEmissivity","ce","SolarPanelTiltAngleGaWizard","selectionMethodRef","searchMethodRef","objectiveFunctionTypeRef","YEARLY_TOTAL_OUTPUT","populationSizeRef","maximumGenerationsRef","mutationRateRef","selectionRateRef","crossoverRateRef","convergenceThresholdRef","localSearchRadiusRef","run","defaultValue","TOURNAMENT","LOCAL_SEARCH_RANDOM_OPTIMIZATION","SolarPanelTiltAnglePsoWizard","swarmSizeRef","maximumStepsRef","vmaxRef","inertiaRef","cognitiveCoefficientRef","socialCoefficientRef","PARTICLE_SWARM_OPTIMIZATION","GroundFloorRValueInput","setActionScope","toRValueInUS","inputValueUS","setInputValueUS","setValue","undoInMap","handleOk","onPressEnter","toRValueInSI","FoundationMenu","countAllOffspringsByType","colorDialogVisible","setColorDialogVisible","textureDialogVisible","setTextureDialogVisible","widthDialogVisible","setWidthDialogVisible","lengthDialogVisible","setLengthDialogVisible","heightDialogVisible","setHeightDialogVisible","azimuthDialogVisible","setAzimuthDialogVisible","rValueDialogVisible","setRValueDialogVisible","solarAbsorberPipeHeightDialogVisible","setSolarAbsorberPipeHeightDialogVisible","solarAbsorberPipeApertureWidthDialogVisible","setSolarAbsorberPipeApertureWidthDialogVisible","solarAbsorberPipePoleNumberDialogVisible","setSolarAbsorberPipePoleNumberDialogVisible","solarAbsorberPipeAbsorptanceDialogVisible","setSolarAbsorberPipeAbsorptanceDialogVisible","solarAbsorberPipeOpticalEfficiencyDialogVisible","setSolarAbsorberPipeOpticalEfficiencyDialogVisible","solarAbsorberPipeThermalEfficiencyDialogVisible","setSolarAbsorberPipeThermalEfficiencyDialogVisible","solarPowerTowerHeightDialogVisible","setSolarPowerTowerHeightDialogVisible","solarPowerTowerRadiusDialogVisible","setSolarPowerTowerRadiusDialogVisible","solarPowerTowerReceiverAbsorptanceDialogVisible","setSolarPowerTowerReceiverAbsorptanceDialogVisible","solarPowerTowerReceiverOpticalEfficiencyDialogVisible","setSolarPowerTowerReceiverOpticalEfficiencyDialogVisible","solarPowerTowerReceiverThermalEfficiencyDialogVisible","setSolarPowerTowerReceiverThermalEfficiencyDialogVisible","chimneyHeightDialogVisible","setChimneyHeightDialogVisible","chimneyRadiusDialogVisible","setChimneyRadiusDialogVisible","collectorHeightDialogVisible","setCollectorHeightDialogVisible","collectorRadiusDialogVisible","setCollectorRadiusDialogVisible","collectorTransmissivityDialogVisible","setCollectorTransmissivityDialogVisible","collectorEmissivityDialogVisible","setCollectorEmissivityDialogVisible","dischargeCoefficientDialogVisible","setDischargeCoefficientDialogVisible","turbineEfficiencyDialogVisible","setTurbineEfficiencyDialogVisible","solarPanelTiltAngleGaWizardVisible","setSolarPanelTiltAngleGaWizardVisible","solarPanelTiltAnglePsoWizardVisible","setSolarPanelTiltAnglePsoWizardVisible","updateLabelText","setLabelSize","setLabelFontSize","setLabelColor","setLabelHeight","setHvacId","hvacId","selectedSolarStructure","counterAll","counterUnlocked","editable","updateFoundationSolarStructureById","updateFoundationThermostatSetpointById","temperatureThreshold","updateFoundationTemperatureThresholdById","updateHvacIdByFoundationId","updateHvacId","isBuilding","toggleGroupMaster","toggleBuilding","ItemGroup","legalToPaste","oldLocks","undoableLockAllElements","removedElements","undoableRemoveAllWallChildren","undoableRemoveAllWindowGrandchildren","undoableRemoveAllDoorGrandchildren","undoableRemoveAllSensorChildren","undoableRemoveAllLightChildren","undoableRemoveAllSolarPanelChildren","undoableRemoveAllParabolicTroughChildren","undoableRemoveAllParabolicDishChildren","undoableRemoveAllFresnelReflectorChildren","undoableRemoveAllHeliostatChildren","undoableRemoveAllPolygonChildren","undoableRemoveAllHumanChildren","undoableRemoveAllTreeChildren","undoableRemoveAllFlowerChildren","onBlur","addonBefore","CuboidColorSelection","updateSelectedColor","updateCuboidColorBySide","updateCuboidColorById","updateCuboidColorForAll","colors","oldColors","changedSideIndex","currentColor","CuboidLengthInput","AllObjectsOfThisTypeOnSurface","AllObjectsOfThisTypeAboveFoundation","updateOnSurface","rejectMessage","CuboidWidthInput","setLy","CuboidHeightInput","updateLzAndCz","updateLzAndCzOnSurface","updateLzAndCzAboveBase","CuboidAzimuthInput","setAzimuth","CuboidTextureSelection","updateCuboidTextureBySide","updateCuboidTextureById","updateCuboidTextureInMap","updateCuboidTextureForAll","oldTextures","CuboidTexture05Icon","CuboidTexture06Icon","CuboidTexture10Icon","CuboidMenu","GroundMenu","setWaterSurface","setGroundImage","setGroundColor","setAlbedo","setMonthlyIrradianceLoss","northHemisphere","undoableRemoveAll","addonAfter","oldDay","newDay","fontFamily","oldAlbedo","newAlbedo","HumanSelection","updateHumanNameById","oldPerson","HumanMenu","animationFlag","setAnimationFlag","requestRef","previousFrameTime","firstCall","animateMove","requestAnimationFrame","tween","cancelAnimationFrame","updateHumanFlipById","yes","updateHumanObserverById","currentFrameTime","absoluteHumanOrTreeCoordinates","cam","originalPosition","Tween","easing","Easing","Quadratic","In","onUpdate","moveCamera","onComplete","FlowerSelection","updateFlowerTypeById","oldFlower","FlowerMenu","updateFlowerFlipById","PolygonLineColorSelection","oldLineColorsOnSurface","undoableChangeOnSurface","groupId","oldLineColorsAboveFoundation","undoableChangeAboveFoundation","PolygonFillColorSelection","updateElementFillColorById","updateElementFillColorOnSurface","updateElementFillColorAboveFoundation","updateElementFillColorForAll","oldFillColorsAboveFoundation","oldFillColorsOnSurface","PolygonTextureSelection","updatePolygonTextureById","updatePolygonTextureOnSurface","updatePolygonTextureAboveFoundation","updatePolygonTextureForAll","oldTexturesOnSurface","oldTexturesAboveFoundation","Polygon_Texture_01_Menu","Polygon_Texture_02_Menu","Polygon_Texture_03_Menu","Polygon_Texture_04_Menu","Polygon_Texture_05_Menu","Polygon_Texture_06_Menu","Polygon_Texture_07_Menu","Polygon_Texture_08_Menu","Polygon_Texture_10_Menu","SolarPanelLayoutRelative","base","solarPanels","calculatePolygonBounds","upDown","polygonIntersections","numberOfSegments","panel","makeUpDownSegment","changeOrientation","makeLeftRightSegment","q1","q2","shorter","SolarPanelLayoutAbsolute","rotated","verticesRotated","rotatePolygon","eastWest","g1","g2","cp","northSouth","SolarPanelLayoutWizard","warningDialogVisible","setWarningDialogVisible","changedRef","warningOkButtonRef","okButtonClickedRef","pvModelNameRef","rowAxisRef","orientationRef","tiltAngleRef","rowsPerRackRef","interRowSpacingRef","marginRef","poleHeightRef","poleSpacingRef","reference","layout","newElements","undoableLayout","oldElements","oldParams","newParams","setParams","updateStoreParams","apply","isLayoutOk","existingSolarPanels","referenceExistingSolarPanels","PolygonLineStyleSelection","selectedLineStyle","setSelectedLineStyle","updatePolygonLineStyleById","updatePolygonLineStyleOnSurface","updatePolygonLineStyleAboveFoundation","updatePolygonLineStyleForAll","setLineStyle","oldLineStylesSelected","oldLineStylesAll","oldLineStylesOnSurface","oldLineStylesAboveFoundation","oldStyle","Dotted","PolygonLineWidthSelection","selectedLineWidth","setSelectedLineWidth","oldLineWidthsSelected","oldLineWidthsAll","oldLineWidthsOnSurface","oldLineWidthsAboveFoundation","One","Two","Three","Four","Five","TabPane","Tabs","SolarPanelArrayGaWizard","constraints","minimumTiltAngleRef","maximumTiltAngleRef","minimumRowsPerRackRef","maximumRowsPerRackRef","minimumInterRowSpacingRef","maximumInterRowSpacingRef","originalSolarPanels","electricitySellingPriceRef","operationalCostPerUnitRef","defaultActiveKey","tab","DAILY_AVERAGE_OUTPUT","YEARLY_AVERAGE_OUTPUT","DAILY_PROFIT","YEARLY_PROFIT","marks","marginBottom","SolarPanelArrayPsoWizard","PolygonOpacityInput","setInput","updateOpacityById","oldValuesAboveFoundation","oldValuesOnSurface","updatedPolygon","PolygonMenu","textContent","setTextContent","textSize","setTextSize","textColor","setTextColor","textOutlineColor","setTextOutlineColor","textOutlineWidth","setTextOutlineWidth","textStrokeColor","setTextStrokeColor","textStrokeWidth","setTextStrokeWidth","lineColorDialogVisible","setLineColorDialogVisible","lineStyleDialogVisible","setLineStyleDialogVisible","lineWidthDialogVisible","setLineWidthDialogVisible","fillColorDialogVisible","setFillColorDialogVisible","opacityDialogVisible","setOpacityDialogVisible","solarPanelLayoutWizardVisible","setSolarPanelLayoutWizardVisible","solarPanelLayoutGaWizardVisible","setSolarPanelLayoutGaWizardVisible","solarPanelLayoutPsoWizardVisible","setSolarPanelLayoutPsoWizardVisible","updateFilledById","updateNoOutlineById","updateShininessById","updateTextById","updateFontSizeById","updateFontColorById","updateFontOutlineWidthById","updateFontOutlineColorById","updateFontStrokeWidthById","updateFontStrokeColorById","changeText","changeFontSize","changeFontColor","changeFontOutlineWidth","changeFontOutlineColor","changeFontStrokeWidth","changeFontStrokeColor","PolygonVertexMenu","changeVertex","oldVertices","InsertBeforeIndex","insertPolygonVertexBeforeIndex","InsertAfterIndex","insertPolygonVertexAfterIndex","SensorMenu","LightMenu","updateLightInsideById","inputIntensity","setInputIntensity","inputDistance","setInputDistance","inputColor","setInputColor","inputInside","setInputInside","updateLightColorById","updateLightIntensityById","updateLightDistanceById","setIntensity","setDistance","SkyMenu","setAxes","setTheme","setShowAzimuthAngle","setShowElevationAngle","setShowZenithAngle","setDirectLightIntensity","setAmbientLightIntensity","setAirAttenuationCoefficient","setAirConvectiveCoefficient","setHighestTemperatureTimeInMinutes","oldTheme","newTheme","oldAttenuationCoefficient","newAttenuationCoefficient","oldConvectiveCoefficient","newConvectiveCoefficient","oldMinutes","newMinutes","SolarPanelNominalSize","nominalStrings","nominalWidths","nominalHeights","cellNx","cellNy","instance","DataType","SolarPanelModelSelection","selectedPvModel","setSelectedPvModel","panelSizeString","setPanelSizeString","updateSolarPanelModelById","updateSolarPanelModelAboveFoundation","updateSolarPanelModelOnSurface","updateSolarPanelModelForAll","setPvModel","oldModelsSelected","oldModelsAll","oldModelsAboveFoundation","oldModelsOnSurface","isParentCuboid","oldModel","SolarPanelOrientationSelection","selectedOrientation","setSelectedOrientation","updateSolarPanelOrientationById","updateSolarPanelOrientationAboveFoundation","updateSolarPanelOrientationOnSurface","updateSolarPanelOrientationForAll","checkElementOnRoofState","withinParent","setOrientation","oldOrientationsSelected","oldOrientationsAll","oldOrientationsAboveFoundation","oldOrientationsOnSurface","oldOrientation","SolarPanelLengthInput","setDx","updateSolarPanelLxById","panelizeLx","updateSolarPanelLxAboveFoundation","updateSolarPanelLxOnSurface","updateSolarPanelLxForAll","setLength","oldLengthsSelected","oldLengthsAll","oldLengthsAboveFoundation","oldLengthsOnSurface","oldLength","panelize","SolarPanelWidthInput","setDy","updateSolarPanelLyById","panelizeLy","updateSolarPanelLyAboveFoundation","updateSolarPanelLyOnSurface","updateSolarPanelLyForAll","oldWidthsSelected","oldWidthsAll","oldWidthsAboveFoundation","oldWidthsOnSurface","SolarPanelTiltAngleInput","isOnWall","updateSolarPanelTiltAngleAboveFoundation","isReverse","updateSolarPanelTiltAngleOnSurface","updateSolarPanelTiltAngleForAll","setTiltAngle","oldTiltAnglesSelected","oldTiltAnglesAll","oldTiltAnglesAboveFoundation","oldTiltAnglesOnSurface","oldTiltAngle","SolarPanelRelativeAzimuthInput","updateRelativeAzimuthById","updateRelativeAzimuthOnSurface","updateRelativeAzimuthAboveFoundation","updateRelativeAzimuthForAll","setRelativeAzimuth","oldRelativeAzimuthsSelected","ra","oldRelativeAzimuthsAll","oldRelativeAzimuthsAboveFoundation","oldRelativeAzimuthsOnSurface","oldRelativeAzimuth","SolarPanelTrackerSelection","selectedTrackerType","setSelectedTrackerType","updateSolarPanelTrackerTypeById","updateSolarPanelTrackerTypeAboveFoundation","updateSolarPanelTrackerTypeOnSurface","updateSolarPanelTrackerTypeForAll","setTrackerType","tracker","oldTrackerTypesSelected","tt","oldTrackerTypesAll","oldTrackerTypesAboveFoundation","oldTrackerTypesOnSurface","oldTrackerType","SolarPanelPoleHeightInput","updatePoleHeightById","updatePoleHeightOnSurface","updatePoleHeightAboveFoundation","updatePoleHeightForAll","setPoleHeight","oldPoleHeightsSelected","oldPoleHeightsAll","oldPoleHeightsAboveFoundation","oldPoleHeightsOnSurface","oldPoleHeight","SolarPanelPoleSpacingInput","updateSolarPanelPoleSpacingById","updateSolarPanelPoleSpacingAboveFoundation","updateSolarPanelPoleSpacingOnSurface","updateSolarPanelPoleSpacingForAll","setPoleSpacing","oldPoleSpacingsSelected","oldPoleSpacingsAll","oldPoleSpacingsAboveFoundation","oldPoleSpacingsOnSurface","oldPoleSpacing","SolarPanelFrameColorSelection","updateSolarPanelFrameColorById","updateSolarPanelFrameColorAboveFoundation","updateSolarPanelFrameColorOnSurface","updateSolarPanelFrameColorForAll","setFrameColor","oldFrameColorsSelected","fc","oldFrameColorsAll","oldFrameColorsAboveFoundation","oldFrameColorsOnSurface","oldFrameColor","SolarPanelInverterEfficiencyInput","inverterEfficiency","updateInverterEfficiencyById","updateInverterEfficiencyAboveFoundation","updateInverterEfficiencyOnSurface","updateInverterEfficiencyForAll","setInverterEfficiency","SolarPanelDcToAcRatioInput","inputDcToAcRatioRef","dcToAcRatio","updateDcToAcRatioById","updateDcToAcRatioAboveFoundation","updateDcToAcRatioOnSurface","updateDcToAcRatioForAll","setDcToAcRatio","ok","SolarPanelMenu","setPvModelDialogVisible","orientationDialogVisible","setOrientationDialogVisible","inverterEfficiencyDialogVisible","setInverterEfficiencyDialogVisible","dcAcRatioDialogVisible","setDcAcRatioDialogVisible","tiltDialogVisible","setTiltDialogVisible","trackerDialogVisible","setTrackerDialogVisible","poleHeightDialogVisible","setPoleHeightDialogVisible","poleSpacingDialogVisible","setPoleSpacingDialogVisible","frameColorDialogVisible","setFrameColorDialogVisible","ParabolicTroughLengthInput","updateLyById","updateLyAboveFoundation","updateLyForAll","modularize","ParabolicTroughWidthInput","updateLxById","updateLxAboveFoundation","updateLxForAll","ParabolicTroughPoleHeightInput","pt","ParabolicTroughLatusRectumInput","updateLatusRectumById","updateLatusRectumAboveFoundation","updateLatusRectumForAll","setLatusRectum","oldLatusRectumsSelected","oldLatusRectumsAll","oldLatusRectumsAboveFoundation","oldLatusRectum","ParabolicTroughModuleLengthInput","setModuleLength","oldModuleLengthsSelected","ml","oldModuleLengthsAll","oldModuleLengthsAboveFoundation","oldModuleLength","ParabolicTroughReflectanceInput","updateAboveFoundation","setReflectance","oldReflectancesSelected","rf","oldReflectancesAll","oldReflectancesAboveFoundation","oldReflectance","ParabolicTroughAbsorptanceInput","oldAbsorptancesSelected","oldAbsorptancesAll","oldAbsorptancesAboveFoundation","oldAbsorptance","ParabolicTroughOpticalEfficiencyInput","oldOpticalEfficienciesSelected","oldOpticalEfficienciesAll","oldOpticalEfficienciesAboveFoundation","oldOpticalEfficiency","ParabolicTroughThermalEfficiencyInput","oldThermalEfficienciesSelected","oldThermalEfficienciesAll","oldThermalEfficienciesAboveFoundation","oldThermalEfficiency","ParabolicTroughMenu","moduleLengthDialogVisible","setModuleLengthDialogVisible","latusRectumDialogVisible","setLatusRectumDialogVisible","reflectanceDialogVisible","setReflectanceDialogVisible","absorptanceDialogVisible","setAbsorptanceDialogVisible","opticalEfficiencyDialogVisible","setOpticalEfficiencyDialogVisible","thermalEfficiencyDialogVisible","setThermalEfficiencyDialogVisible","ParabolicDishDiameterInput","setDiameter","oldDiametersSelected","di","oldDiametersAll","oldDiametersAboveFoundation","oldDiameter","ParabolicDishPoleHeightInput","ParabolicDishLatusRectumInput","ParabolicDishReflectanceInput","ParabolicDishAbsorptanceInput","pd","ParabolicDishOpticalEfficiencyInput","ParabolicDishThermalEfficiencyInput","ParabolicDishStructureTypeInput","inputStructureType","setInputStructureType","setStructureType","oldStructureTypesSelected","st","oldStructureTypesAll","oldStructureTypesAboveFoundation","oldStructureType","ParabolicDishPoleRadiusInput","updatePoleRadiusById","updatePoleRadiusAboveFoundation","updatePoleRadiusForAll","setPoleRadius","ParabolicDishMenu","structureTypeDialogVisible","setStructureTypeDialogVisible","diameterDialogVisible","setDiameterDialogVisible","poleRadiusDialogVisible","setPoleRadiusDialogVisible","FresnelReflectorLengthInput","FresnelReflectorWidthInput","FresnelReflectorPoleHeightInput","inputPoleHeightRef","fr","FresnelReflectorModuleLengthInput","FresnelReflectorReflectanceInput","FresnelReflectorAbsorberSelection","selectedReceiverId","setSelectedReceiverId","pipes","pipeIds","setReceiverId","ti","FresnelReflectorDrawSunBeamSelection","sunBeam","setSunBeam","setDrawSunBeam","sb","FresnelReflectorMenu","receiverDialogVisible","setReceiverDialogVisible","sunBeamDialogVisible","setSunBeamDialogVisible","HeliostatWidthInput","HeliostatLengthInput","HeliostatPoleHeightInput","hs","HeliostatReflectanceInput","HeliostatDrawSunBeamSelection","HeliostatTowerSelection","selectedTowerId","setSelectedTowerId","towers","towerIds","setTowerId","HeliostatPoleRadiusInput","oldPoleRadius","HeliostatMenu","towerDialogVisible","setTowerDialogVisible","TreeSelection","updateTreeTypeById","oldTree","AppleImage","BirchImage","DogwoodImage","ElmImage","LindenImage","MagnoliaImage","MapleImage","OakImage","TreeMenu","inputSpread","setInputSpread","inputHeight","setInputHeight","updateTreeShowModelById","updateTreeFlipById","showTreeModel","setSpread","setHeight","WallTextureSelection","updateConnectedWalls","connectedWalls","AllConnectedObjects","wt","oldValuesConnectedWalls","undoableChangeConnectedWalls","wh","updatedWall","WallTextureDefaultIcon","WallTexture01Icon","WallTexture02Icon","WallTexture03Icon","WallTexture04Icon","WallTexture05Icon","WallTexture06Icon","WallTexture07Icon","WallTexture08Icon","WallTexture09Icon","WallTexture10Icon","WallColorSelection","onColorChange","oldColorsAboveFoundation","WallStructureColorSelection","WallNumberInput","dataType","attributeKey","unit","inputRef","updateActionState","updateValue","toString","WallRValueInput","WallHeatCapacityInput","WallParapetNumberInput","WallParapetColorSelection","WallParapetTextureSelection","WindowDataType","DialogSetting","ParapetDialogSetting","WallMenu","updateElementUnlockByParentId","setDataType","heatCapacityDialogVisible","setHeatCapacityDialogVisible","updateParapetDisplayById","updateWallStructureById","updateWallFillById","updateOpenToOutsideById","openToOutside","renderMenuItem","renderClearItem","titleText","objectTypeText","replaceAll","undoableRemoveAllChildren","handleClearOk","renderLockItem","undoableLockAllElementsOfType","renderUnlockItem","undoableUnlockAllElementsOfType","renderInsideLightItem","undoableInsideLightsOnWall","setting","renderDialogs","renderElementsSubMenu","plain","renderStructureSubMenu","DoorTextureSelection","updateTextureById","undoTextureInMap","oldTexturesOnSameWall","undoableChangeOnSameWall","updatedDoor","DoorTextureDefaultIcon","DoorTexture01Icon","DoorTexture02Icon","DoorTexture03Icon","DoorTexture04Icon","DoorTexture05Icon","DoorTexture06Icon","DoorTexture07Icon","DoorTexture08Icon","DoorTexture09Icon","DoorTexture10Icon","DoorTexture11Icon","DoorTexture12Icon","DoorTexture13Icon","DoorTexture14Icon","DoorTexture15Icon","DoorTexture16Icon","DoorTexture17Icon","DoorColorSelection","updateColorById","updateColorInMap","undoColorInMap","oldColorsOnSameWall","DoorUValueInput","toUValueInUS","toUValueInSI","DoorWidthInput","currentValue","DoorHeightInput","DoorHeatCapacityInput","DoorOpacityInput","DoorFrameColorSelection","DoorMenu","uValueDialogVisible","setUValueDialogVisible","updateDoorTypeById","updateDoorFilledById","updateInteriorById","WindowColorSelection","selectedItem","onItemChange","updateOnSameWall","WindowNumberInput","note","digit","oldValuesOnSameWall","undoableChangeOnSameParent","WindowUValueInput","WindowOptionSelection","optionsText","selectedOption","setSelectedOption","WindowBooleanSelection","setSelected","_defs","_path","_path2","_path3","_path4","_path5","_path6","ColorDialogSettings","BooleanDialogSettings","OptionDialogSettings","NumberDialogSettings","WindowMenu","updateEmptyWindowById","RoofTextureSelection","updatedRoof","RoofTexture01Icon","RoofTexture02Icon","RoofTexture03Icon","RoofTexture04Icon","RoofTexture05Icon","RoofTexture06Icon","RoofTexture07Icon","RoofColorSelection","RoofThicknessInput","inputLength","setInputLength","setThickness","oldThicknessSelected","oldThicknessAll","oldThicknessAboveFoundation","oldThickness","RoofRafterSpacingInput","updateRoofRafterSpacingById","setRafterSpacing","oldSpacingSelected","oldSpacingAll","oldSpacingAboveFoundation","oldSpacing","RoofOpacityInput","GlassTintSelection","selectedTint","setSelectedTint","updateTintById","undoTintInMap","setTint","oldTintsAll","oldTintsAboveFoundation","oldTint","RoofRafterWidthInput","oldValSelected","oldValAll","oldValAboveFoundation","RoofSideColorSelection","selectedSideColor","setSelectedSideColor","updateSideColorById","updateSideColorInMap","undoSideColorInMap","setSideColor","RoofRValueInput","RoofRiseInput","setRise","RoofHeatCapacityInput","CeilingRValueInput","RoofMenu","rafterSpacingDialogVisible","setRafterSpacingDialogVisible","rafterWidthDialogVisible","setRafterWidthDialogVisible","rafterColorDialogVisible","setRafterColorDialogVisible","riseDialogVisible","setRiseDialogVisible","thicknessDialogVisible","setThicknessDialogVisible","roofColorDialogVisible","setRoofColorDialogVisible","roofSideColorDialogVisible","setRoofSideColorDialogVisible","glassTintDialogVisible","setGlassTintDialogVisible","roofRValueDialogVisible","setRoofRValueDialogVisible","ceilingRValueDialogVisible","setCeilingRValueDialogVisible","undoableInsideLightsOnRoof","updateRoofCeiling","DropdownContextMenu","contextMenu","Column","Table","ColumnWrapper","Header","CloudFilePanel","cloudFileArray","openCloudFile","deleteCloudFile","renameCloudFile","nodeRef","wrapperRef","wOffset","hOffset","curPosition","setCurPosition","renameDialogVisible","setRenameDialogVisible","oldTitle","setOldTitle","newTitle","setNewTitle","setUserid","filesRef","recountFlag","setRecountFlag","Search","innerWidth","innerHeight","closePanel","renameFile","placeholder","WarningOutlined","onDrag","ui","onStop","allowClear","enterButton","onSearch","dataSource","scroll","pagination","defaultPageSize","showSizeChanger","pageSizeOptions","dataIndex","sortDirections","sorter","localeCompare","record","onCell","defaultSortOrder","DeleteImage","QuestionCircleOutlined","deleteFile","CopyOutlined","url","LikesPanel","likesArray","rowKey","PublishedModelsPanel","publishedModels","AccountSettingsPanel","schoolIdRef","schoolID","classIdRef","classID","superuser","endsWith","likes","published","SCHOOL1","SCHOOL2","SCHOOL3","SCHOOL4","SCHOOL5","CLASS1","CLASS2","CLASS3","CLASS4","CLASS5","CLASS6","CLASS7","CLASS8","CLASS9","aliases","Panel","Collapse","getIconUrl","site","selectAuthor","closeMap","openModel","deleteModel","likeModel","pinModel","mapWeatherStations","setMap","selectedSite","setSelectedSite","selectedLocation","setSelectedLocation","ascendingOrder","setAscendingOrder","previousSiteRef","markersRef","selectedMarkerIndexRef","cities","imageSize","ifiUser","onLoad","google","maps","LatLng","loadCities","setMapTypeId","onUnmount","openModelSite","likeModelSite","modelKey","getModelKey","liked","modelsOfSite","getLatLngKey","likeCount","getLikeCount","getClickCount","clickCount","isPinned","pinned","pinModelSite","mapContainerStyle","mapTypeId","styles","featureType","stylers","visibility","tilt","onCenterChanged","getCenter","undoableChangeLocation","oldLatitude","newLatitude","oldLongitude","newLongitude","onZoomChanged","getZoom","onTiltChanged","getTilt","onMapTypeIdChanged","typeId","getMapTypeId","SymbolPath","CIRCLE","strokeWeight","maxHeight","overflowY","onMouseLeave","borderBottom","DownCircleOutlined","UpCircleOutlined","modelA","modelB","timeCreated","svg","bordered","ghost","header","PushpinOutlined","align","thumbnailUrl","author","PushpinFilled","shareModelSite","marker","DeleteIcon","EmptyHeartIcon","clusterer","iconUrl","models","closeCallback","modelsRef","selectedModel","setSelectedModel","countModels","dark","mask","headerStyle","bodyStyle","scrollbarColor","placement","PRESENTED_IMAGE_SIMPLE","extra","LeftCircleOutlined","RightCircleOutlined","loading","onError","libraries","ModelsMapWrapper","deleteModelFromMap","likeModelFromMap","pinModelFromMap","peopleModelsRef","selectedAuthor","setSelectedAuthor","authorModelsRef","searchBox","useJsApiLoader","googleMapsApiKey","isLoaded","loadError","modelSitesCount","boxShadow","onPlacesChanged","places","getPlaces","oldAddress","newAddress","formatted_address","boxSizing","outline","textOverflow","countA","countB","UserOutlined","userSelect","VerticalAlignBottomOutlined","VerticalAlignTopOutlined","ToolBarButton","MainToolBarButtons","groupAction","category1Flag","setCategory1Flag","category2Flag","setCategory2Flag","category3Flag","setCategory3Flag","defaultFilter","selectFilter","resetToSelectMode","setMode","menuItem","srcImg","setFlag","replacingText","charAt","replace","buttonImg","addedElemId","needLock","needToLock","onDoubleClick","dropdownButton","category1Menu","FoundationImage","CuboidImage","TreeImage","FlowerImage","HumanImage","category2Menu","WallImage","WindowImage","DoorImage","PyramidRoofImage","HipRoofImage","GableRoofImage","GambrelRoofImage","MansardRoofImage","category3Menu","SolarPanelImage","ParabolicTroughImage","ParabolicDishImage","FresnelReflectorImage","HeliostatImage","SensorImage","LightImage","category1Button","category2Button","category3Button","undoableClearContent","ButtonsContainer","MainToolBar","signIn","signOut","photoURL","SaveCloudFileModal","saveToCloud","isLoading","setTitle","getTitle","setTitleDialogVisible","isTitleDialogVisible","confirmLoading","ProjectListPanel","projects","deleteProject","renameProject","projectsRef","setSelectedIndex","changeProjectTitle","onMouseEnter","menuInfo","domEvent","confirmDeleteProject","CaretDownOutlined","useFlag","CloudManager","publishOnMapFlag","setLoading","setCloudFileArray","projectArray","setProjectArray","updateProjectArrayFlag","setUpdateProjectArrayFlag","titleDialogVisible","cloudFiles","myProjects","firstAccountSettings","initialize","apps","LOG_DATA","initializeApp","apiKey","authDomain","projectId","storageBucket","databaseURL","messagingSenderId","appId","app","auth","onAuthStateChanged","handlePopStateEvent","fetchModelSites","fetchLatest","fetchPeopleModels","storageRef","storage","resizeCanvas","toBlob","uploadTask","put","contentType","TaskEvent","STATE_CHANGED","snapshot","progress","bytesTransferred","totalBytes","getDownloadURL","downloadURL","m2","merge","latestModel","fetchMyProjects","exist","finally","listMyProjects","fetchMyCloudFiles","projectOwner","increment","saveToCloudWithoutCheckingExistence","addDesignToProject","saveAccountSettings","openDesignFile","registerUser","noLogging","querySnapshot","docs","docData","since","existing","deleteFromModelsMap","successCallback","arrayRemove","likeModelsMap","like","likeCountPath","pinModelsMap","countClicksModelsMap","silent","checkExistence","openCloudFileWithSaveReminder","openCloudFileWithSaveReminderFromMap","provider","GoogleAuthProvider","signInWithPopup","files","newData","newArray","ActionLogger","firstCallUndo","firstCallAction","databaseRef","database","positionExtent","cameraExtent","shadow","VerticalRuler","textGeometryParamsTickLabel","rulerLength","getRulerLength","heightText","getHeightText","textPositionZ","textGeometry","Auxiliary","gridSize","setGridSize","gridDivisions","setDivisions","divisions","changeHeight","showPolarGridByHover","showVerticalRuler","isTopResizeHandleOfWall","isRiseHandleOfRoof","showVerticalRulerHelper","BLACK","WHITE","Compass","canvasRef","CANVAS_SIZE","devicePixelRatio","FONT","pointerLength","pointerHalfWidth","outerRingRadius","outerRingWidth","innerRingRadius","innerRingWidth","fontToEdge","arc","strokeStyle","stroke","fillText","save","translate","rotate","restore","pointerEvents","AutoDeletionListener","handleUndoAutoDeletion","manualDeletedElements","manualCutElements","listenToAutoDeletionByCut","listenToAutoDeletionByDelete","combined","undoName","undoableDeleteMultiple","handleKeys","KeyboardListener","moveStepAbsolute","removeElement","isNewPositionOk","moveLeft","displacement","halfLx","undoableMoveLeft","undoableMoveAllLeft","undoableMoveRight","undoableMoveAllRight","halfLy","undoableMoveUp","undoableMoveAllUp","moveDown","undoableMoveDown","undoableMoveAllDown","setMultiSelectionMode","toggle2DView","toggleNatigationView","toggleAutoRotate","foundations","foundationsIdSet","ifNeedTriggerAutoDeletion","undoableDelete","keyNameRef","handleEventType","onKeyEvent","handleKeyUp","SceneRadiusCalculator","components","fetchAabbElements","boxes","setFromObject","box","getWorldDirection","setCompassRotation","dircXY","deg","transform","CameraController","enabledNavigationControls","cameraPositionLength","panRadius","minPan","maxPan","initialOrbitCamera","initialOrbitDomElement","orbitControlRef","persCameraRef","orthCameraRef","onInteractionStart","onInteractionEnd","oc","positionNav","rotationNav","getVector","updateMatrixWorld","orbitControl","orthCam","persCam","targetPosition","compassMounted","PerspectiveCamera","far","OrthographicCamera","ShareLinkContainer","ShareLinks","handleShareWindowClose","via","TwitterShareButton","onShareWindowClose","TwitterIcon","FacebookShareButton","quote","FacebookIcon","RedditShareButton","RedditIcon","LineShareButton","LineIcon","LinkedinShareButton","summary","LinkedinIcon","WhatsappShareButton","WhatsappIcon","Individual","randomize","discretizationSteps","chromosome","fitness","random","individual","Parents","dad","mom","Population","chromosomeLength","individuals","savedGeneration","violations","beta","survivors","mutants","compare","sigma","nicheCount","share","copyGenes","best","selectSurvivors","crossover","imax","numberOfSurvivers","lowestFitness","sumOfFitness","newBorn","oldFolks","selectParentsByTournament","selectParentsByRouletteWheel","childIndex","child1","child2","getGene","mi","setGene","roulettWheelPosition","spinWheel","n1","OptimizerGa","population","minima","maxima","fitnessSharingRadius","stopped","fittestOfGenerations","populationOfGenerations","outsideGenerationCounter","computeCounter","converged","geneNames","setMinMax","Random","SolarPanelTiltAngleOptimizerGa","firstBorn","normalizedValue","gaussian","getFittest","gene","individualToString","indexOfIndividual","getCopy","generation","savedIndividual","saveGenes","evolve","detectViolations","restoreGenes","isNominallyConverged","mutate","SolarPanelTiltAngleGa","geneLabels","setGeneLabels","evolutionCompletedRef","pauseRef","solarPanelsRef","optimizerRef","individualIndexRef","convergedRef","initialSolarPanelsRef","runCallback","osp","startEvolving","evolveIndividual","getTotal","updateResults","applyFittest","translateIndividual","lastStep","fg","trimmed","SolarPanelArrayOptimizerGa","initialSolarPanels","initialLayoutParams","solarRackCount","setInterRowSpacingBounds","gene1","gene2","gene3","getObjectiveUnit","SolarPanelArrayGa","economics","currentLayoutParams","solarPanelArrayRef","initialSolarPanelArrayRef","translateBest","translateIndividualByIndex","Particle","velocity","bestPositionOfParticle","Swarm","particles","bestPositionOfSwarm","bestFitness","OptimizerPso","particleDimension","swarm","bestPositionOfSteps","bestFitnessOfSteps","swarmOfSteps","outsideStepCounter","SolarPanelTiltAngleOptimizerPso","firstParticle","particle","particleToString","indexOfParticle","updateBestPosition","savedParticle","moveSwarm","SolarPanelTiltAnglePso","setFittestParticleResults","particleLabels","setParticleLabels","particleIndexRef","updateParticle","bestPosition","translateParticle","ss","SolarPanelArrayOptimizerPso","relativeMargin","normalizedInterRowSpacing","normalizedRowsPerRack","translatePosition","SolarPanelArrayPso","translateParticleByIndex","NavigationController","GroundMap","updateAddress","latlng","Geocoder","geocode","GeocoderStatus","address_components","types","short_name","throttle","leading","trailing","MapPanel","HeliodonPanel","runSimulation","sunriseAndSunsetInMinutes","continuous","totalMinutes","setHours","setDate","changeTime","onLatitudeChangeRef","moment","toDate","setFullYear","setMonth","tooltipVisible","_extends","assign","arguments","prototype","call","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","SvgMenu","_ref","svgRef","titleId","viewBox","xmlns","xmlnsXlink","Direction","ForwardRef","StyledMenuSVG","MenuSVG","BarGraphMenu","horizontalGrid","verticalGrid","changeHorizontalGrid","changeVerticalGrid","setVisible","BarGraph","dataKeyAxisX","labelX","labelY","yMin","yMax","fractionDigits","referenceX","dataSetCount","setDataSetCount","horizontalGridLines","setHorizontalGridLines","verticalGridLines","setVerticalGridLines","legendDataKey","setLegendDataKey","getBars","bars","MonthlyTemperatures","HourlyTemperatures","DaylightData","ClearnessData","DailyRadiationSensorData","YearlyRadiationSensorData","Bar","dataKey","isAnimationActive","ResponsiveContainer","BarChart","Tooltip","CartesianGrid","vertical","horizontal","ReferenceLine","XAxis","YAxis","domain","Legend","iconType","SYMBOLS","Operation","CircleSymbol","numberOfSymbols","fillColor","interval","SquareSymbol","TriangleSymbol","pointsString","UP","DiamondSymbol","StarSymbol","HexagonSymbol","createSymbol","DOWN","LineGraphMenu","lineCount","symbolSize","changeLineWidth","changeSymbolSize","LineGraph","chartType","curveType","symbolCount","setLineCount","setSymbolSize","getRepresentations","defaultSymbol","representations","DailyPvYield","YearlyPvYield","DailyParabolicTroughYield","YearlyParabolicTroughYield","DailyParabolicDishYield","YearlyParabolicDishYield","DailyFresnelReflectorYield","YearlyFresnelReflectorYield","DailyHeliostatYield","YearlyHeliostatYield","DailyUpdraftTowerYield","YearlyUpdraftTowerYield","symbol","isMeasured","Area","strokeDasharray","onMouseEnterLegend","onMouseLeaveLegend","AreaChart","LineChart","wrapperStyle","WeatherPanel","graphs","panelRect","resizeObserverRef","handleWindowResize","ResizeObserver","offsetWidth","offsetHeight","observe","disconnect","responsiveHeight","getData","Sunshine","yNames","yUnits","YearlyLightSensorPanel","sensorData","daylightGraph","clearnessGraph","radiationGraph","setRadiationGraph","emptyGraph","Clearness","alignSelf","CaretRightOutlined","ReloadOutlined","CameraOutlined","SaveOutlined","DailyLightSensorPanel","StickyNotePanel","setText","resize","InstructionPanel","navigation","CloseOutlined","undoableAction","YearlyPvYieldPanel","individualOutputs","setSum","panelSumRef","yearScaleFactor","totalYield","totalCost","totalRevenue","totalProfit","checkedChildren","UnorderedListOutlined","unCheckedChildren","DailyPvYieldPanel","DesignInfoPanel","solarPanelDailyYield","countAllChildSolarPanels","countAllChildSolarPanelDailyYields","countAllChildElementsByType","daytime","getBuildingArea","SiteInfoPanel","dailyTemperatures","setDailyTemperatures","currentTemperature","setCurrentTemperature","minutesIntoDay","VisualizationControlPanel","VisibilityResultsPanel","resultArray","setResultArray","fieldString","field","itemized","YearlyParabolicTroughYieldPanel","troughSumRef","DailyParabolicTroughYieldPanel","DailyParabolicDishYieldPanel","dishSumRef","YearlyParabolicDishYieldPanel","DailyFresnelReflectorYieldPanel","reflectorSumRef","YearlyFresnelReflectorYieldPanel","DailyHeliostatYieldPanel","heliostatSumRef","YearlyHeliostatYieldPanel","SutBiaxialLineGraph","labelY1","labelY2","unitY1","unitY2","yMin1","yMax1","yMin2","yMax2","getLines","yAxisId","DailySolarUpdraftTowerYieldPanel","dailyResults","towerSumRef","towerCount","labelHour","labelYield","labelTemperature","labelSpeed","DiurnalTemperaturePanel","PartonLogan","newModel","YearlySolarUpdraftTowerYieldPanel","EvolutionBiaxialLineGraph","payloadRef","fittestLineCount","totalLineCount","lastFittestLineIndex","individualCount","varIndex","active","payload","SolarPanelOptimizationResult","labelAxisX","labelVariable","labelObjective","buttonEnabled","hint","representationName","EconomicsPanel","oldPrice","newPrice","oldCost","newCost","useDailyEnergySorter","hasSolarPanels","dataLabels","sumHeaterMapRef","sumAcMapRef","sumSolarPanelMapRef","energy","onBuildingEnvelope","exchange","energyUsage","geothermal","adjustedHeat","adjustedAc","heaterId","acId","solarId","netId","sumHeaterMap","sumAcMap","sumSolarPanelMap","BuildingEnergyGraphMenu","barCategoryGap","changeBarCategoryGap","BuildingEnergyGraph","buildingCount","setBuildingCount","buildingId","setBuildingId","setBarCategoryGap","barStrokeColor","stackId","ComposedChart","stackOffset","barGap","DailyBuildingEnergyPanel","runDailySimulation","setData","heaterSum","setHeaterSum","acSum","setAcSum","solarPanelSum","setSolarPanelSum","netSum","setNetSum","setLabels","tooltipHeaterBreakdown","tooltipAcBreakdown","tooltipSolarPanelBreakdown","tooltipNetBreakdown","clearResults","sumHeater","sumAc","sumSolarPanel","multiple","net","countBuildings","YearlyBuildingEnergyPanel","runYearlySimulation","monthInterval","resultRef","heaterSumRef","acSumRef","solarPanelSumRef","netSumRef","indexOfMonth","heaterMap","acMap","solarPanelMap","netMap","totalHeater","totalAc","totalSolarPanel","totalNet","bid","NavigationPanel","minimumMoveSpeed","minimumTurnSpeed","minimumMoveSpeedRef","minimumTurnSpeedRef","setMinimumMoveSpeed","setMinimumTurnSpeed","oldMoveSpeed","newMoveSpeed","oldTurnSpeed","newTurnSpeed","worldLongitude","setCity","SolarRadiation","distanceToClosestObject","rooftop","walltop","zRot","flat","an","dr","dCell","z0","center2d","cellOutputs","normalEuler","qRotAADAT","qRotHSAT","TILTED_SINGLE_AXIS_TRACKER","SPHERE_MODEL","indirectRadiation","v2d","dv","ky","min1","PARTIAL","min2","dxcos","dxsin","polygonWithMargin","kx2","kz2","absWindowPos","absDoorPos","insidePolygon","unitArea","absWallAngle","dis","withoutOverhang","computeFlatRoofSolarRadiationEnergy","segmentIntensities","segmentUnitAreas","relativePolygon","within","isPointRoof","segmentUnitArea","h0","getAbsoluteWindowVerticesOnRoof","getAbsoluteSolarPanelVerticesOnRoof","ThermalSimulation","pauseDailySimulation","pauseYearlySimulation","simulationCompletedRef","originalDateRef","sampledDayRef","pausedDateRef","dayRef","outsideTemperatureRangeRef","currentOutsideTemperatureRef","currentGroundTemperatureRef","hourlyHeatExchangeArrayMapRef","hourlySolarHeatGainArrayMapRef","hourlySolarPanelOutputArrayMapRef","objectsRef","intersectionsRef","sunDirectionRef","sunMinutesRef","scaleFactorRef","solarHeatmapRef","minuteInterval","fetchObjects","updateHeatExchangeNow","resetHourlyMaps","resetSolarHeatMaps","initDaily","calculateDaily","staticCalculateDaily","computeNow","setTime","finishDaily","monthIndex","setMonthIndex","initYearly","simulateYearly","currentTime","updateTemperature","calculateDoor","calculateWindow","calculateSolarHeatGain","calculateWall","calculateRoof","calculateFloor","calculateSolarPanel","computeSolarPanelOutput","factor","temperature","getPanelEfficiency","getTimeFactor","getElementFactor","output","updateSolarPanelOutputNow","solarHeatmap","deltaT","totalSolarHeat","computeRoofWindowSolarRadiationEnergy","computeWallWindowSolarRadiationEnergy","gain","updateSolarHeatGainNow","absorption","computeDoorSolarRadiationEnergy","extraT","filledArea","rectangular","computeWallSolarRadiationEnergy","floorArea","calculateAtticTemperature","outsideTemperature","roofU","ceilingU","roofSegmentResults","calculatePyramidRoof","calculateHipRoof","calculateGableRoof","calculateGambrelRoof","calculateMansardRoof","segmentResult","segmentHeatExchange","surfaceTemperature","totalArea","totalAreas","totalSolarHeats","computePyramidRoofSolarRadiationEnergy","heatmapResults","areas","computeHipRoofSolarRadiationEnergy","computeGambrelRoofSolarRadiationEnergy","iw","computeMansardRoofSolarRadiationEnergy","computeGableRoofSolarRadiationEnergy","StaticSolarRadiationSimulation","generateHeatmaps","inShadow","generateHeatmapForFoundation","generateHeatmapForSolarUpdraftTower","generateHeatmapForCuboid","generateHeatmapForSolarPanel","generateHeatmapForWall","generateHeatmapForDoor","generateHeatmapForPyramidRoof","generateHeatmapForGableRoof","generateHeatmapForGambrelRoof","generateHeatmapForMansardRoof","generateHeatmapForHipRoof","worldData","topCellOutputTotals","southCellOutputTotals","northCellOutputTotals","westCellOutputTotals","eastCellOutputTotals","normalTop","normalSouth","normalNorth","normalWest","normalEast","vec","southY","northY","westX","eastX","transpose","scaleFactor","applyScaleFactor","cellOutputTotals","rsq","generateHeatmapForFlatRoof","DynamicSolarRadiationSimulation","cellOutputsMapRef","simulate","setCuboidHeatmap","clone2DArray","updateHeatmaps","calculateFresnelReflector","calculateHeliostat","calculateFoundation","calculateSolarUpdraftTower","calculateCuboid","calculateParabolicTrough","calculateParabolicDish","cellOutputsTop","cellOutputsSouth","cellOutputsNorth","cellOutputsWest","cellOutputsEast","calculateFlatRoof","originalNormal","zRotZero","qRot","tmpX","disX","areaRatio","lr2","ku","kv","tmpY","disY","reflectorToReceiver","heliostatToReceiver","ParabolicTroughSimulation","setDailyYield","updateDailyYield","setYearlyYield","updateYearlyYield","dailyIndividualOutputs","yearlyIndividualOutputs","dailyOutputsMapRef","yearlyOutputsMapRef","daysInYear","simulateDaily","resetDailyOutputsMap","details","calculateYield","timeFactor","generateDailyYieldData","resetYearlyOutputsMap","finishMonthly","generateYearlyYieldData","getTimeFactorByMonth","sumDaily","resultArr","troughId","yearlyResult","ParabolicDishSimulation","dishId","FresnelReflectorSimulation","systemEfficiency","reflectorId","HeliostatSimulation","heliostatId","SolarUpdraftTowerSimulation","setDailyResults","showDailyUpdraftTowerPanel","dailyAmbientTemperaturesRef","dailyChimneyInletAirTemperaturesMapRef","dailyWindSpeedsMapRef","staticSimulateDaily","resetDailyMaps","calculateYieldWithoutAnimation","getDay","chimneyArea","collectorArea","dca","speedFactor","chimneyInletTemperatures","windSpeeds","outputs","powerFactor","ambientTemperature","tAmbientK","tCollector","convectiveLoss","tCollectorK","tCollector4","tAmbient4","radiationLoss","cbrt","speed","generateDailyData","staticSimulateYearly","resetYearlyMap","generateYearlyData","airTemperatures","yields","yearlyOutput","countPoints","cur","Vantage","runAnalysis","vantagesRef","analyze","fetchVantages","resultMap","vf","getViewFactor","integral","isVisible","panelId","SensorSimulation","measuredHorizontalRadiation","measuredVerticalRadiation","dailyDataMapRef","yearlyDataMapRef","daylightArrayRef","clearnessArrayRef","resetDailyDataMap","calculateMeasurementWithoutAnimation","calculateMeasurement","resetYearlyDataMap","hasHorizontalSensor","hasVerticalSensor","includeHorizontalMeasurement","includeVerticalMeasurement","sensorId","SolarPanelSimulation","runDailySimulationLastStep","runYearlySimulationLastStep","currentTemperatureRef","totalDailyYield","dailyProfit","dailyYieldArray","profit","totalYearlyYield","yearlyProfit","yearlyYieldArray","frontIndirectRadiation","backsideNormal","negate","eff","Simulations","VerticalAxis","yScale","tickLength","tickIntegers","digits","minRef","maxRef","isOwner","ticks","numberOfTicks","tick","isInteger","localSelect","updateSelectedProperty","createLabel","createTitle","textAnchor","money","MIN_SAFE_INTEGER","minimum","maximum","MAX_SAFE_INTEGER","currency","maximumFractionDigits","strokeOpacity","shapeRendering","alignmentBaseline","MARGIN","COLORS","ParallelCoordinates","variables","titles","units","hover","hoveredIndex","boundsWidth","boundsHeight","allGroups","group","xScale","d3Scale","yScales","colorScale","lineGenerator","d3Shape","allLines","series","invisible","allCoordinates","allAxes","join","ScatteredPlotMenu","SubHeader","SolutionSpaceHeader","SubContainer","ProjectGallery","relativeWidth","selectedDesign","setSelectedDesign","hoveredDesign","setHoveredDesign","updateHiddenFlag","setUpdateHiddenFlag","descriptionTextAreaEditableRef","descriptionRef","descriptionChangedRef","descriptionExpandedRef","dataColoringSelectionRef","parameterSelectionChangedRef","thumbnailSizeRef","xAxisRef","yAxisRef","dotSizeRef","scatterChartHorizontalLinesRef","scatterChartVerticalLinesRef","prefix","closeProject","removeSelectedDesign","removeDesignFromProject","totalHeight","imageColumns","imageGap","imageWidth","getVariables","getTitles","getUnits","getDigits","getTickIntegers","getTypes","INDIVIDUALS","getMin","getMax","rowWidthSelectionRef","tiltAngleSelectionRef","rowSpacingSelectionRef","latitudeSelectionRef","orientationSelectionRef","poleHeightSelectionRef","unitCostSelectionRef","sellingPriceSelectionRef","costSelectionRef","totalYieldSelectionRef","meanYieldSelectionRef","profitSelectionRef","toggleDesignVisibility","updatedDesigns","updateDesignVisibility","localSelectParameter","parameter","selectParameter","hiddenParameter","updateHiddenParameters","localSelectDataColoring","selectDataColoring","updateDataColoring","createAxisOptions","scatterData","setScatterData","selectedData","getBound","axisName","bound","xMinMax","yMinMax","xUnit","getUnit","yUnit","RenderDot","Dot","EditFilled","EditOutlined","ImportOutlined","updateDesign","CloudUploadOutlined","DeleteOutlined","LinkOutlined","SortAscendingOutlined","SortDescendingOutlined","updateThumbnailWidth","SettingOutlined","readOnly","updateDescription","overflowX","column","renderItem","lastSpaceIndex","labelDisplayLength","ImageLoadFailureIcon","transition","FolderOpenOutlined","CheckCircleOutlined","CheckCircleFilled","CarryOutOutlined","createChooseDataColoringContent","BgColorsOutlined","updateXAxisNameScatteredPlot","updateYAxisNameScatteredPlot","ScatterChart","tickFormatter","Scatter","updateDotSizeScatteredPlot","saveSvgAsPng","DotChartOutlined","groupedElementsIdSet","childCuboidSet","initalPosition","initalDimension","initalRotation","aspectRatio","lockAspectRatio","intersectionPlanePositionRef","intersectionPlaneRotationRef","resizeAnchorRef","elementHeightMapRef","wallRelPointsMapRef","partialWallHeightMapRef","skylightRelPosMapRef","baseRelPosMapRef","baseRotationMapRef","basePosRatioMapRef","baseDmsRatioMapRef","resizerCenterRelPosRef","foundatonOldDataMapRef","wallOldPointsMapRef","elementOldHeightMapRef","oldPartialWallHeightMapRef","oldSkyligthPosMapRef","setHx","setHy","operation","setOperation","setDimension","setCommonStoreHandleType","updateUndoableResizeXY","foundationDataMap","wallPointsMap","skyligthPosMap","updateUndoableResizeZ","heightMap","partialWallHeightMap","partialWallHeight","updateFoundationGroupPosition","pointerDownBottomResizeHandle","positionV2","ResizeXY","currLx","currLy","leftPointRelative","rightPointRelative","pointerDonwTopResizeHandle","ResizeZ","bottomHanldeZ","topHanldeZ","moveHanldeX","moveHnadleY","resizeHandleY","RotateLower","RotateUpper","resizerCenter","elemCenter","diagonalDistance","tempWorldDataMap","posRatio","dmsRatio","parentWorldData","relativePosition","leftRelPoint","rightRelPoint","heightRatio","resizeZ","rotateAngle","groupSize","oldCenter","foundationNewDataMap","wallNewPointsMap","newSkylightPosMap","undoableReizeXY","oldFoundationDataMap","newFoundationDataMap","oldSkylightPosMap","addUndoableResizeXY","newHeightMap","newPartialWallHeightMap","undoableResizeZ","oldElementHeightMap","newElementHeightMap","oldPartialWallHeightMap","addUndoableReseizeZ","isBaseElement","bId1","bId2","verticesMap","GroupMasterController","selectedBaseElements","baseIdSet","getSelectedBaseElements","allBaseElements","allBaseElementsVerticesMap","cuboidParentIdMap","getElementsData","groupIdSet","groupElements","selectedBase","checkOverlapWithOtherBases","groupElementsVertices","childCuboidIdSet","maxChildHeight","maxBaseZ","getCuboidParentId","getGroupedBasesData","baseElement","pId","GroupMasterWrapper","AppCreator","setInitializing","canvasRelativeWidth","setCanvasRelativeWidth","oldZoom","newZoom","undoableCameraChange","newCameraPosition","newZ","isCloudFileOwner","overflow","ifiLogo","defaultSize","pane1Style","minWidth","pane2Style","resizerStyle","backgroundImage","shadows","preserveDrawingBuffer","logarithmicDepthBuffer","frameloop","fallback","LocalFileManager","setConfirmLoading","createNewFile","readLocalFile","loadLocalFile","saveFirst","onfocus","fileDialog","onchange","reader","FileReader","readAsText","onload","performOkAction","writeLocalFile","performCancelAction","App","onBeforeunload","ReactDOM","StrictMode"],"mappings":"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AAA,E,sCAAAA,E,uCAAAA,M,cAcAypC,O,uBAAAA,I,+BAAAA,I,mCAAAA,I,4BAAAA,M,cAOAC,K,gDAAAA,E,uCAAAA,M,cAKAC,O,2CAAAA,I,6CAAAA,I,+CAAAA,I,iDAAAA,I,+BAAAA,I,kCAAAA,M,cASAC,O,yCAAAA,I,8DAAAA,M,cAKA7kB,O,mCAAAA,I,4BAAAA,M,cAKAG,O,qEAAAA,I,uEAAAA,I,kEAAAA,M,cAMA3D,O,iBAAAA,I,mBAAAA,I,oBAAAA,M,cAMAtX,O,aAAAA,I,aAAAA,I,iBAAAA,I,eAAAA,I,gBAAAA,M,cAoBA4/B,O,eAAAA,I,gBAAAA,M,cAKAC,O,2CAAAA,I,6CAAAA,I,iCAAAA,I,+BAAAA,I,iCAAAA,I,yDAAAA,I,uDAAAA,I,iCAAAA,I,+BAAAA,I,4DAAAA,I,0DAAAA,I,wDAAAA,I,sDAAAA,I,8DAAAA,I,4DAAAA,I,gDAAAA,I,8CAAAA,I,sDAAAA,I,oDAAAA,I,gDAAAA,I,+CAAAA,M,cAwBAhzB,K,kBAAAA,E,gBAAAA,E,YAAAA,E,gBAAAA,E,sBAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,eAAAA,M,cAYAizB,O,2BAAAA,I,8BAAAA,M,cAKAC,K,kBAAAA,E,6CAAAA,E,8CAAAA,E,uBAAAA,E,qBAAAA,E,0EAAAA,M,cASAC,K,UAAAA,E,gBAAAA,E,wBAAAA,E,YAAAA,E,gBAAAA,E,YAAAA,E,YAAAA,E,2BAAAA,E,uBAAAA,E,mBAAAA,E,2BAAAA,E,2BAAAA,E,gBAAAA,E,yBAAAA,E,2BAAAA,E,+BAAAA,E,mCAAAA,E,qCAAAA,E,sBAAAA,E,2BAAAA,E,gBAAAA,E,cAAAA,E,YAAAA,E,gBAAAA,E,kBAAAA,E,+BAAAA,E,cAAAA,E,aAAAA,M,cA+BAC,O,6BAAAA,I,iDAAAA,I,0BAAAA,M,cAMA3sB,O,eAAAA,I,yBAAAA,I,2BAAAA,I,gCAAAA,M,cAOA4sB,K,gBAAAA,E,YAAAA,E,gBAAAA,E,gBAAAA,E,2BAAAA,M,cAQAC,K,sBAAAA,E,0BAAAA,E,0BAAAA,E,wBAAAA,E,0BAAAA,E,sBAAAA,E,uBAAAA,M,cAUAC,K,qCAAAA,E,qCAAAA,E,uCAAAA,E,uCAAAA,E,4CAAAA,E,4CAAAA,E,8CAAAA,E,8CAAAA,E,4BAAAA,E,4BAAAA,E,0BAAAA,E,4BAAAA,E,wBAAAA,E,wBAAAA,E,0BAAAA,E,wDAAAA,E,0DAAAA,E,+DAAAA,E,kEAAAA,M,cAsBAC,K,4BAAAA,E,4BAAAA,E,2BAAAA,M,cAMAC,K,uBAAAA,E,+CAAAA,E,8CAAAA,M,cAMAC,K,wBAAAA,E,oBAAAA,E,gBAAAA,E,WAAAA,M,cAOAC,O,mCAAAA,I,iEAAAA,I,6EAAAA,I,+CAAAA,I,6CAAAA,I,+BAAAA,I,gEAAAA,M,cAUAliB,K,oBAAAA,E,uBAAAA,M,cAKAmiB,K,qBAAAA,E,yBAAAA,E,uBAAAA,E,kBAAAA,Q,cAOAC,K,kBAAAA,E,sCAAAA,E,qCAAAA,E,oCAAAA,E,mCAAAA,Q,cAQAngB,K,YAAAA,E,YAAAA,E,mBAAAA,Q,cAMAogB,K,cAAAA,E,2BAAAA,Q,cAKAC,K,cAAAA,E,cAAAA,E,kBAAAA,E,kBAAAA,E,UAAAA,E,mBAAAA,E,gBAAAA,E,oBAAAA,E,cAAAA,E,UAAAA,E,YAAAA,E,iBAAAA,Q,cAeAC,K,wBAAAA,E,kBAAAA,E,8BAAAA,E,8BAAAA,E,8BAAAA,E,8BAAAA,E,oBAAAA,E,cAAAA,E,sBAAAA,E,cAAAA,E,mBAAAA,E,gBAAAA,E,sBAAAA,E,qBAAAA,E,cAAAA,E,2BAAAA,E,8BAAAA,Q,cAoBAC,K,YAAAA,E,gBAAAA,E,eAAAA,Q,cAMAC,K,YAAAA,E,YAAAA,E,cAAAA,E,wBAAAA,E,YAAAA,E,kBAAAA,E,cAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,kBAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,gBAAAA,E,YAAAA,E,gBAAAA,E,YAAAA,E,YAAAA,E,cAAAA,E,cAAAA,E,oBAAAA,E,YAAAA,E,YAAAA,E,iBAAAA,Q,cAuCAC,K,+BAAAA,E,+BAAAA,E,+BAAAA,E,+BAAAA,E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","file":"static/js/main.d3157261.chunk.js","sourcesContent":["/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { i18n_en } from './en';\nimport { i18n_zh_cn } from './zh_cn';\nimport { i18n_zh_tw } from './zh_tw';\nimport { i18n_es } from './es';\nimport { i18n_tr } from './tr';\nimport { i18n_ua } from './ua';\n\ni18n\n // detect user language\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\n .use(LanguageDetector)\n // pass the i18n instance to react-i18next.\n .use(initReactI18next)\n // init i18next\n // for all options read: https://www.i18next.com/overview/configuration-options\n .init({\n debug: true,\n fallbackLng: 'en',\n interpolation: {\n escapeValue: false, // not needed for react as it escapes by default\n },\n resources: {\n en: i18n_en,\n zh_cn: i18n_zh_cn,\n zh_tw: i18n_zh_tw,\n es: i18n_es,\n tr: i18n_tr,\n ua: i18n_ua,\n },\n });\n\nexport default i18n;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_en = {\r\n translation: {\r\n name: {\r\n IFI: 'Institute for Future Intelligence',\r\n Aladdin: 'Aladdin',\r\n Tagline: 'Aladdin: Reimagining Design with Explainable AI — Institute for Future Intelligence',\r\n },\r\n\r\n cookie: {\r\n Statement: 'By clicking Accept, you agree to our use of cookies to improve your experience with Aladdin.',\r\n Accept: 'Accept',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: 'This product is brought to you by',\r\n TermsOfService: 'Terms of Service',\r\n PrivacyPolicy: 'Privacy Policy',\r\n Software: 'Software',\r\n Content: 'Content',\r\n Research: 'Research',\r\n Support: 'Support',\r\n Acknowledgment: 'Acknowledgment',\r\n FundingInformation:\r\n 'The National Science Foundation (NSF) generously provided funding for the research and development of this product through grants #2105695, #2131097, and #2301164. Any opinions, findings, and conclusions or recommendations expressed in this product, however, are those of the authors and do not necessarily reflect the views of NSF.',\r\n Contact: 'For more information, please contact Charles Xie (charles@intofuture.org).',\r\n Translators: 'Translators',\r\n },\r\n\r\n word: {\r\n LastUpdate: 'Last Update',\r\n Small: 'Small',\r\n Medium: 'Medium',\r\n Large: 'Large',\r\n Design: 'Design',\r\n Information: 'Information',\r\n Type: 'Type',\r\n Text: 'Text',\r\n FontSize: 'Font Size',\r\n FontColor: 'Font Color',\r\n Model: 'Model',\r\n Models: 'Models',\r\n Upload: 'Upload',\r\n ClickCount: 'Click Count',\r\n Share: 'Share',\r\n AlreadyLike: 'Already like',\r\n Like: 'Like',\r\n MustLogInToLike: 'Must log in to like',\r\n AllRightsReserved: 'All Rights Reserved',\r\n MeterAbbreviation: 'm',\r\n Version: 'Version',\r\n VersionInitial: 'V',\r\n Options: 'Options',\r\n Maximum: 'Maximum',\r\n Minimum: 'Minimum',\r\n MaximumNumber: 'Maximum Number',\r\n MinimumNumber: 'Minimum Number',\r\n MaximumValue: 'Maximum Value',\r\n MinimumValue: 'Minimum Value',\r\n Or: 'Or',\r\n None: 'None',\r\n High: 'High',\r\n Partial: 'Partial',\r\n Teacher: 'Teacher',\r\n Class: 'Class',\r\n Total: 'Total',\r\n Leaderboard: 'Leaderboard',\r\n Latest: 'Latest',\r\n Range: 'Range',\r\n SIUnit: 'SI Unit',\r\n USUnit: 'US Unit',\r\n ThermalTransmittance: 'Thermal Transmittance',\r\n ThermalResistance: 'Thermal Resistance',\r\n UValue: 'U-Value',\r\n RValue: 'R-Value',\r\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\r\n BuildingHVACSystem: 'Building HVAC System',\r\n ThermostatSetpoint: 'Thermostat Setpoint',\r\n TemperatureToleranceThreshold: 'Tolerance Threshold',\r\n TemperatureToleranceThresholdExplanation:\r\n 'Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.',\r\n Press: 'Press',\r\n Open: 'Open',\r\n Save: 'Save',\r\n SaveAsImage: 'Save as Image',\r\n SaveAsCsv: 'Save as CSV',\r\n Update: 'Update',\r\n Paste: 'Paste',\r\n Copy: 'Copy',\r\n Cut: 'Cut',\r\n Delete: 'Delete',\r\n Lock: 'Lock',\r\n Translucent: 'Translucent',\r\n Color: 'Color',\r\n Texture: 'Texture',\r\n Size: 'Size',\r\n Thickness: 'Thickness',\r\n Yes: 'Yes',\r\n No: 'No',\r\n OK: 'OK',\r\n Cancel: 'Cancel',\r\n Apply: 'Apply',\r\n Close: 'Close',\r\n ApplyTo: 'Apply to',\r\n Run: 'Run',\r\n Pause: 'Pause',\r\n Resume: 'Resume',\r\n Clear: 'Clear',\r\n Warning: 'Warning',\r\n Caution: 'Caution',\r\n Reminder: 'Reminder',\r\n Length: 'Length',\r\n Width: 'Width',\r\n Height: 'Height',\r\n Radius: 'Radius',\r\n Angle: 'Angle',\r\n Azimuth: 'Azimuth',\r\n Coordinates: 'Coordinates',\r\n Weather: 'Weather',\r\n Show: 'Show',\r\n Animate: 'Animate',\r\n Date: 'Date',\r\n Time: 'Time',\r\n Title: 'Title',\r\n Owner: 'Owner',\r\n Action: 'Action',\r\n Rename: 'Rename',\r\n Location: 'Location',\r\n Latitude: 'Latitude',\r\n Month: 'Month',\r\n Day: 'Day',\r\n Hour: 'Hour',\r\n Daylight: 'Daylight',\r\n Radiation: 'Radiation',\r\n Temperature: 'Temperature',\r\n kWh: 'kWh',\r\n dollar: 'dollar',\r\n MeterPerSecond: 'm/s',\r\n NorthInitial: 'N',\r\n SouthInitial: 'S',\r\n EastInitial: 'E',\r\n WestInitial: 'W',\r\n Fixed: 'Fixed',\r\n Elements: 'Elements',\r\n Energy: 'Energy',\r\n Unknown: 'Unknown',\r\n Label: 'Label',\r\n Description: 'Description',\r\n NoDescription: 'No description',\r\n MaximumCharacters: 'Maximum characters',\r\n Author: 'Author',\r\n Publisher: 'Publisher',\r\n Building: 'Building',\r\n ResidentialBuilding: 'Residential Building',\r\n CommercialBuilding: 'Commercial Building',\r\n SchoolBuilding: 'School Building',\r\n TouristAttraction: 'Tourist Attraction',\r\n UnderConstruction: 'Under Construction',\r\n Photovoltaic: 'Photovoltaic',\r\n Anonymous: 'Anonymous',\r\n Nickname: 'Nickname',\r\n Pin: 'Pin',\r\n Unpin: 'Unpin',\r\n },\r\n\r\n shared: {\r\n NoTexture: 'No Texture',\r\n FoundationElement: 'Foundation',\r\n CuboidElement: 'Cuboid',\r\n PolygonElement: 'Polygon',\r\n SensorElement: 'Sensor',\r\n SolarPanelElement: 'Solar Panel',\r\n WaterHeaterElement: 'Water Heater',\r\n ParabolicDishElement: 'Parabolic Dish',\r\n ParabolicTroughElement: 'Parabolic Trough',\r\n FresnelReflectorElement: 'Fresnel Reflector',\r\n HeliostatElement: 'Heliostat',\r\n WindTurbineElement: 'Wind Turbine',\r\n LightElement: 'Light',\r\n ElementLocked: 'Locked',\r\n ModelType: 'Model Type',\r\n OutputBreakdown: 'Breakdown',\r\n MoreResults: 'More Results',\r\n },\r\n\r\n message: {\r\n ModelNotFound: 'Model not found',\r\n CannotSignIn: 'Cannot sign in',\r\n CannotSignOut: 'Cannot sign out',\r\n YourAccountWasCreated: 'Your account was created.',\r\n CannotCreateAccount: 'Cannot create an account',\r\n YourAccountSettingsWereSaved: 'Your account settings were saved.',\r\n CannotSaveYourAccountSettings: 'Cannot save your account settings',\r\n CannotSaveYourFileToCloud: 'Cannot save your file to the cloud',\r\n CannotCreateNewProject: 'Cannot create a new project',\r\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\r\n CannotOpenYourProjects: 'Cannot open your projects',\r\n CannotOpenProject: 'Cannot open the project',\r\n CannotDeleteProject: 'Cannot delete the project',\r\n CannotRenameProject: 'Cannot rename the project',\r\n CannotAddDesignToProject: 'Cannot add this design to the project',\r\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\r\n DesignRemovedFromProject: 'The design was successfully removed from the project',\r\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\r\n CannotUpdateProject: 'Cannot update the project',\r\n CannotFetchProjectData: 'Cannot fetch project data',\r\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\r\n CloudFileNotFound: 'The cloud file was not found',\r\n CannotLoadModelsOnMap: 'Cannot load models on map',\r\n CannotLoadLeaderboard: 'Cannot load leaderboard',\r\n CannotPublishModelOnMap: 'Cannot publish model on map',\r\n CannotLikeModelFromMap: 'Cannot like model from map',\r\n CannotDeleteModelFromMap: 'Cannot delete model from map',\r\n ModelDeletedFromMap: 'Model is deleted from map',\r\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\r\n CannotOpenCloudFile: 'Cannot open the cloud file',\r\n CannotReadCloudFile: 'Cannot read the cloud file',\r\n CannotWriteCloudFile: 'Cannot write the cloud file',\r\n CloudFileCopied: 'Cloud file copied',\r\n CannotOpenCloudFolder: 'Cannot open your cloud folder',\r\n CannotDeleteCloudFile: 'Cannot delete the cloud file',\r\n CannotRenameCloudFile: 'Cannot rename the cloud file',\r\n DoYouWantToSaveChanges: 'Do you want to save changes?',\r\n NotApplicableToSelectedAction: 'Not Applicable to Selected Action',\r\n ThisElementIsLocked: 'This element is locked.',\r\n ThisCannotBeUndone: 'This cannot be undone.',\r\n AzimuthOfNorthIsZero: 'Azimuth of north is 0°',\r\n CounterclockwiseAzimuthIsPositive: 'Counter-clockwise is positive',\r\n MoveCancelledBecauseOfOverlap: 'Move cancelled because of overlap.',\r\n MoveOutsideBoundaryCancelled: 'Move outside the boundary cancelled.',\r\n RotationCancelledBecauseOfOverlap: 'Rotation cancelled because of overlap.',\r\n RotationOutsideBoundaryCancelled: 'Rotation outside the boundary cancelled.',\r\n ResizingCancelledBecauseOfOverlap: 'Resizing cancelled because of overlap.',\r\n ResizingOutsideBoundaryCancelled: 'Resizing outside the boundary cancelled.',\r\n CannotPasteOutsideBoundary: 'Cannot paste outside the boundary.',\r\n CannotPasteBecauseOfOverlap: 'Cannot paste because of overlap.',\r\n CannotMoveObjectTooFar: 'Cannot move object too far.',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\r\n 'Existing solar panels will be removed before applying the new layout.',\r\n DoYouWantToContinue: 'Do you want to continue?',\r\n SolarPanelsCannotIntersectWithGround: 'Solar panels cannot intersect with the ground.',\r\n SolarPanelsCannotOverlapWithOneAnother: 'Solar panels cannot overlap with one another.',\r\n ScreenshotSaved: 'A screenshot was saved.',\r\n CsvFileSaved: 'A CSV file was saved.',\r\n SimulationStarted: 'Simulation started.',\r\n SimulationCompleted: 'Simulation completed.',\r\n SimulationAborted: 'Simulation aborted.',\r\n SimulationPaused: 'Simulation paused.',\r\n CancelSimulation: 'Cancel simulation',\r\n PauseSimulation: 'Pause simulation',\r\n ResumeSimulation: 'Resume simulation',\r\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\r\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\r\n EvolutionStarted: 'Evolution started.',\r\n EvolutionCompleted: 'Evolution completed.',\r\n EvolutionAborted: 'Evolution aborted.',\r\n EvolutionPaused: 'Evolution paused.',\r\n EncounterEvolutionError: 'Encountered an evolution error.',\r\n CancelEvolution: 'Cancel evolution',\r\n PauseEvolution: 'Pause evolution',\r\n ResumeEvolution: 'Resume evolution',\r\n ConvergenceThresholdHasBeenReached: 'The convergence threshold has been reached.',\r\n MaximumNumberOfGenerationsHasBeenReached: 'The maximum number of generations has been reached.',\r\n MaximumNumberOfStepsHasBeenReached: 'The maximum number of steps has been reached.',\r\n ObjectiveFunctionTypeError:\r\n 'The current objective function is not supported by this operation. Please start from the menu.',\r\n WallsAreNotAtSameHeight: 'Walls are not at the same height.',\r\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\r\n WallsAreNotConnected: 'Walls are not connected.',\r\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\r\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\r\n BuildingRoofMissing: 'Building has a missing roof.',\r\n UnknownErrors: 'Unknown errors.',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: 'Analysis Options',\r\n option: {\r\n GridCellSize: 'Grid Cell Size',\r\n SamplingFrequency: 'Sampling Frequency',\r\n TimesPerHour: 'Times per Hour',\r\n DaysPerYear: 'Days per Year',\r\n },\r\n mainMenu: 'Main Menu',\r\n cloudMenu: 'Cloud Menu',\r\n projectSubMenu: 'Project',\r\n project: {\r\n CreateNewProject: 'Create New Project',\r\n OpenProject: 'Open Project',\r\n SaveProjectAs: 'Save Project As',\r\n YouMustLogInToCreateProject: 'You must log in to create a new project',\r\n YouMustLogInToOpenProject: 'You must log in to open a project',\r\n },\r\n fileSubMenu: 'File',\r\n file: {\r\n CreateNewFile: 'Create New File',\r\n OpenLocalFile: 'Open Local File',\r\n SaveAsLocalFile: 'Save as Local File',\r\n SavingAbortedMustHaveValidFileName: 'Saving aborted! You must have a valid file name',\r\n OpenCloudFile: 'Open Cloud File',\r\n SaveCloudFile: 'Save Cloud File',\r\n SaveAsCloudFile: 'Save as Cloud File',\r\n SavingAbortedMustHaveValidTitle: 'Saving aborted! You must have a valid title for a cloud file',\r\n ToSaveYourWorkPleaseSignIn: 'To save your work, please sign in.',\r\n TakeScreenshot: 'Take Screenshot',\r\n UseCloudFileName: 'Use Cloud File Name',\r\n PublishOnModelsMap: 'Publish on Models Map',\r\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\r\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\r\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\r\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\r\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\r\n },\r\n editSubMenu: 'Edit',\r\n edit: {\r\n Undo: 'Undo',\r\n Redo: 'Redo',\r\n },\r\n viewSubMenu: 'View',\r\n view: {\r\n NavigationView: 'Navigation View',\r\n TwoDimensionalView: '2D View',\r\n ResetView: 'Reset',\r\n ZoomIn: 'Zoom In',\r\n ZoomOut: 'Zoom Out',\r\n AutoRotate: 'Auto rotate',\r\n ShowShadow: 'Show Shadow',\r\n ShowSurfaceShininess: 'Show Surface Shininess',\r\n TranslucentFloatingWindows: 'Translucent Floating Windows',\r\n accessoriesSubMenu: 'Accessories',\r\n accessories: {\r\n SiteInformation: 'Site Information',\r\n DesignInformation: 'Design Information',\r\n Instruction: 'Instruction',\r\n StickyNote: 'Sticky Note',\r\n Note: 'Note',\r\n },\r\n },\r\n settingsSubMenu: 'Settings',\r\n settings: {\r\n WeatherData: 'Weather Data',\r\n DiurnalTemperature: 'Diurnal Temperature',\r\n Heliodon: 'Heliodon',\r\n SunAndTime: 'Sun & Time',\r\n },\r\n benchmarksSubMenu: 'Benchmarks',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: 'Solar Radiation Prediction vs. Measurement',\r\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\r\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\r\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\r\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\r\n },\r\n graph: {\r\n LineWidth: 'Line Width',\r\n SymbolSize: 'Symbol Size',\r\n BarCategoryGap: 'Bar Category Gap',\r\n ShowHorizontalGridLines: 'Show Horizontal Grid Lines',\r\n ShowVerticalGridLines: 'Show Vertical Grid Lines',\r\n },\r\n analysisSubMenu: 'Analysis',\r\n physicsSubMenu: 'Physics',\r\n physics: {\r\n DailySolarRadiationHeatmap: 'Daily Solar Radiation Heatmap',\r\n SolarRadiationHeatmapOptions: 'Solar Radiation Heatmap Options',\r\n SolarRadiationHeatmapGridCellSize: 'Solar Radiation Heatmap Grid Cell Size',\r\n SolarRadiationHeatmapMaxValue: 'Solar Radiation Heatmap Maximum Value',\r\n SolarRadiationHeatmapNoAnimation: 'No Animation for Static Model',\r\n ReflectionHeatmap: 'Reflection Heatmap',\r\n },\r\n sensorSubMenu: 'Sensor',\r\n sensor: {\r\n CollectDailyData: 'Collect Daily Data',\r\n CollectYearlyData: 'Collect Yearly Data',\r\n SensorSimulationNoAnimation: 'No Animation for Collecting Sensor Data',\r\n },\r\n buildingSubMenu: 'Building',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\r\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\r\n },\r\n solarPanelSubMenu: 'Solar Panel',\r\n solarPanel: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n AnalyzeVisibility: 'Analyze Visibility',\r\n PanelDiscretization: 'Panel Discretization',\r\n Exact: 'Exact',\r\n Approximate: 'Approximate',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n VisibilityGridCellSize: 'View Factor Grid Cell Size',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n VisibilityAnalysisOptions: 'Visibility Analysis Options',\r\n SolarPanelSimulationNoAnimation: 'No Animation for Solar Panel Simulation',\r\n },\r\n parabolicTroughSubMenu: 'Parabolic Trough',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n parabolicDishSubMenu: 'Parabolic Dish',\r\n parabolicDish: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n fresnelReflectorSubMenu: 'Fresnel Reflector',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n heliostatSubMenu: 'Heliostat',\r\n heliostat: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n solarUpdraftTowerSubMenu: 'Solar Updraft Tower',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n SolarUpdraftTowerSimulationNoAnimation: 'No Animation for Solar Updraft Tower Simulation',\r\n },\r\n\r\n tutorialsSubMenu: 'Tutorials',\r\n\r\n solarEnergyScienceSubMenu: 'Solar Science',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: 'Sun Angles Relative to an Observer on the Ground',\r\n InsolationAndClimate: 'Insolation and Climate',\r\n SolarRadiationToBox: 'Solar Radiation to a Box',\r\n },\r\n\r\n buildingScienceSubMenu: 'Building Science',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\r\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\r\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\r\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\r\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\r\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\r\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\r\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\r\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\r\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\r\n },\r\n\r\n buildingDesignSubMenu: 'Building Design',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: 'Cape Cod Style House with Shed Dormer',\r\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\r\n GableRoofVsHipRoof: 'Gable Roof vs. Hip Roof',\r\n ColonialVsSaltbox: 'Colonial vs. Saltbox',\r\n GambrelRoofVsMansardRoof: 'Gambrel Roof vs. Mansard Roof',\r\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\r\n DutchGableRoof: 'Dutch Gable Roof',\r\n GableAndValleyRoof: 'Gable and Valley Roof',\r\n ClerestoryRoof: 'Clerestory Roof',\r\n MonitorRoof: 'Monitor Roof',\r\n AFrameHouse: 'A-Frame House',\r\n HalfTimberedHouse: 'Half-Timbered House',\r\n AllBasicRoofTypes: 'All Basic Roof Types',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: 'Photovoltaic Solar Power',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: 'Effect of Tilt Angle of a Solar Panel',\r\n EffectOfAzimuthOfSolarPanel: 'Effect of Azimuth of a Solar Panel',\r\n SolarPanelTypes: 'Solar Panel Types',\r\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\r\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\r\n SolarTrackers: 'Solar Trackers',\r\n CoveringGroundWithSolarPanels: 'Why Just Covering the Ground with Solar Panels is not a Good Idea',\r\n InterRowSpacingOfSolarPanelArray: 'Effect of Inter-Row Spacing in a Solar Panel Array',\r\n EffectOfOrientationOfSolarPanels: 'Effect of Orientation of Solar Panels',\r\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: 'Concentrated Solar Power',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: 'Effect of Azimuth of a Parabolic Trough',\r\n EffectOfLatusRectumOfParabolicTrough: 'Effect of Latus Rectum of a Parabolic Trough',\r\n FocusSunlightWithParabolicDish: 'Focus Sunlight with a Parabolic Dish',\r\n LinearFresnelReflectors: 'Linear Fresnel Reflectors',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\r\n 'Effect of Absorber Pipe Height for Linear Fresnel Reflectors',\r\n EffectOfAzimuthOfLinearFresnelReflectors: 'Effect of Azimuth of Linear Fresnel Reflectors',\r\n LinearFresnelReflectorsWithTwoAbsorbers: 'Linear Fresnel Reflectors with Two Absorbers',\r\n CosineEfficiencyOfHeliostats: 'Cosine Efficiency of Heliostats',\r\n ShadowingAndBlockingOfHeliostats: 'Shadowing and Blocking of Heliostats',\r\n EffectSolarPowerTowerHeight: 'Effect of Solar Power Tower Height',\r\n SolarPowerTower: 'Solar Power Tower',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: 'Other Types of Solar Power',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: 'Solar Updraft Tower',\r\n },\r\n\r\n generativeDesignSubMenu: 'Generative Design',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\r\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\r\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\r\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\r\n },\r\n\r\n examplesSubMenu: 'Examples',\r\n\r\n solarEnergySubMenu: 'Solar Energy',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: 'Sun Beam and Heliodon',\r\n RooftopSolarPanels: 'Rooftop Solar Panels',\r\n NevadaSolarOneParabolicTroughArray: 'Nevada Solar One Parabolic Trough Array',\r\n TooeleParabolicDishArray: 'Tooele Parabolic Dish Array',\r\n PS10SolarPowerTower: 'PS10 Solar Power Tower',\r\n TucsonLinearFresnelReflectors: 'Tucson Linear Fresnel Reflectors',\r\n SolarCanopyFormFactors: 'Solar Canopy Form Factors',\r\n SolarCanopyOverBleachers: 'Solar Canopy Over Bleachers',\r\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\r\n SolarBusStop: 'Solar Bus Stop',\r\n SolarFacadeTesla: 'Tesla Solar Façade',\r\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\r\n Floatovoltaics: 'Floatovoltaics',\r\n Agrivoltaics: 'Agrivoltaics',\r\n VegetativeBuffer: 'Vegetative Buffer',\r\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\r\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\r\n SolarPanelsOverCanalBakersfieldCA: 'Hypothetical Solar Panels Over Canal in Bakersfield, CA',\r\n SolarNoiseBarrierLexingtonMA: 'Hypothetical Solar Noise Barrier in Lexington, MA',\r\n HSATSolarTrackersRaleighNC: 'Horizontal Single Axis Trackers (HSAT) in Raleigh, NC',\r\n AADATSolarTrackersLancasterCA: 'Azimuth–Altitude Dual Axis Trackers (AADAT) in Lancaster, CA',\r\n SolarUpdraftTowerInCity: 'Solar Updraft Tower in City',\r\n },\r\n\r\n builtEnvironmentSubMenu: 'Built Environment',\r\n residentialBuildingsSubMenu: 'Residential Buildings',\r\n residentialBuildingExamples: {\r\n ColonialHouse: 'Colonial House',\r\n DutchColonialHouse: 'Dutch Colonial House',\r\n TShapedHouse: 'T-Shaped House',\r\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\r\n Solarium: 'Solarium',\r\n Church1: 'Church 1',\r\n Cathedral1: 'Cathedral 1',\r\n Cathedral2: 'Cathedral 2',\r\n Mosque1: 'Mosque 1',\r\n AdobeTaosHouse: 'Adobe Taos House',\r\n RanchHouse: 'Ranch House',\r\n BonnetHouse: 'Bonnet House',\r\n BarnStyleHouse: 'Barn Style House',\r\n ModernHouse: 'Modern House',\r\n ButterflyRoofHouse: 'Butterfly Roof House',\r\n },\r\n commercialBuildingsSubMenu: 'Commercial Buildings',\r\n commercialBuildingExamples: {\r\n WhiteHouse: 'White House',\r\n BilimMersinTurkiye: 'BILIM, Mersin, Turkiye',\r\n SpanishStyleHotel: 'Spanish Style Hotel',\r\n ApartmentBuilding: 'Apartment Building',\r\n OfficeBuilding: 'Office Building',\r\n Hotel: 'Hotel',\r\n },\r\n buildingComplexesSubMenu: 'Building Complexes',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, VT',\r\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\r\n },\r\n urbanPlanningSubMenu: 'Urban Planning',\r\n urbanPlanningExamples: {\r\n Heatmap1: 'Heatmap',\r\n },\r\n otherBuildingsSubMenu: 'Other Buildings',\r\n otherBuildingExamples: {\r\n Greenhouse: 'Greenhouse',\r\n Pavilion: 'Pavilion in a Park',\r\n OctagonalPagoda: 'Octagonal Pagoda',\r\n OceanFront: 'Ocean Front',\r\n EgyptianPyramids: 'Egyptian Pyramids',\r\n MayanPyramid: 'Mayan Pyramid',\r\n SiOSePol: 'Si-o-se-pol',\r\n StackedCuboids: 'Stacked Cuboids',\r\n },\r\n\r\n artificialIntelligenceSubMenu: 'Artificial Intelligence',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: 'Optimizing the Tilt Angle of a Solar Panel Row',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Optimizing the Tilt Angles of Multiple Solar Panel Rows',\r\n SolarFarmGenerativeDesign: 'Solar Farm Generative Design',\r\n SolarFarmGenerativeDesignWithBlock: 'Solar Farm Generative Design in the Presence of a Block',\r\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Solar Farm Generative Design',\r\n },\r\n\r\n languageSubMenu: 'Language',\r\n publicSubMenu: 'Public',\r\n ModelsGallery: 'Models Gallery',\r\n ModelsMap: 'Models Map',\r\n AboutUs: 'About Us',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: 'Account Settings',\r\n PrivacyStatementTitle: 'User Privacy Protection Statement',\r\n PrivacyStatement:\r\n 'When you sign in, your Google ID is used to create and access your Aladdin account. Only a random alphanumeric string is stored in our database as a reference. No personally identifiable data such as your name or email is ever gathered. For more information, see our ',\r\n SignIn: 'Sign In',\r\n SignOut: 'Sign Out',\r\n IfYouAreAStudent: 'If you are a student',\r\n },\r\n\r\n skyMenu: {\r\n Axes: 'Axes',\r\n Theme: 'Theme',\r\n ThemeDefault: 'Default',\r\n ThemeDesert: 'Desert',\r\n ThemeDune: 'Dune',\r\n ThemeForest: 'Forest',\r\n ThemeGrassland: 'Grassland',\r\n ThemeHill: 'Hill',\r\n ThemeLake: 'Lake',\r\n ThemeMountain: 'Mountain',\r\n ThemeRural: 'Rural',\r\n SunlightAttenuationCoefficientInAir: 'Sunlight Attenuation Coefficient in Air',\r\n ConvectiveCoefficientOfAir: 'Convective Coefficient of Air',\r\n HighestTemperatureTimeInMinutes: 'Highest Temperature Time (Minutes)',\r\n SelectSunAnglesToShow: 'Select Sun Angles to Show',\r\n ShowAzimuthAngle: 'Show Azimuth Angle',\r\n ShowElevationAngle: 'Show Elevation Angle',\r\n ShowZenithAngle: 'Show Zenith Angle',\r\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\r\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\r\n Vegetation: 'Vegetation',\r\n LeafOutDay: 'Leaf-Out Day',\r\n LeafOffDay: 'Leaf-Off Day',\r\n Albedo: 'Albedo',\r\n ImageOnGround: 'Image on Ground',\r\n WaterSurface: 'Water Surface',\r\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedPeople: 'Remove All Unlocked People',\r\n RemoveAllUnlockedFoundations: 'Remove All Unlocked Foundations',\r\n RemoveAllUnlockedCuboids: 'Remove All Unlocked Cuboids',\r\n DoYouReallyWantToRemoveAllPeople: 'Do you really want to remove all the people who are not locked',\r\n DoYouReallyWantToRemoveAllTrees: 'Do you really want to remove all the trees that are not locked',\r\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\r\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\r\n DoYouReallyWantToRemoveAllFoundations: 'Do you really want to remove all the foundations that are not locked',\r\n DoYouReallyWantToRemoveAllCuboids: 'Do you really want to remove all the cuboids that are not locked',\r\n LockAllElements: 'Lock All Elements',\r\n UnlockAllElements: 'Unlock All Elements',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: 'Label',\r\n LabelText: 'Label Text',\r\n LabelHeight: 'Label Height',\r\n LabelSize: 'Label Size',\r\n LabelFontSize: 'Font Size',\r\n LabelColor: 'Label Color',\r\n KeepShowingLabel: 'Keep Showing Label',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedParabolicTroughs: 'Remove All Unlocked Parabolic Troughs',\r\n RemoveAllUnlockedParabolicDishes: 'Remove All Unlocked Parabolic Dishes',\r\n RemoveAllUnlockedFresnelReflectors: 'Remove All Unlocked Fresnel Reflectors',\r\n RemoveAllUnlockedHeliostats: 'Remove All Unlocked Heliostats',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n RemoveAllUnlockedWalls: 'Remove All Unlocked Walls',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\r\n RemoveAllUnlockedHumans: 'Remove All Unlocked Humans',\r\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Racks',\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n SolarPanels: 'Solar Panels',\r\n SolarPanelArray: 'Solar Panel Array',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\r\n 'Do you really want to remove all the solar panels on this foundation that are not locked',\r\n ParabolicTroughs: 'Parabolic Troughs',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\r\n 'Do you really want to remove all the parabolic troughs on this foundation that are not locked',\r\n ParabolicDishes: 'Parabolic Dishes',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\r\n 'Do you really want to remove all the parabolic dishes on this foundation that are not locked',\r\n FresnelReflectors: 'Fresnel Reflectors',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\r\n 'Do you really want to remove all the Fresnel reflectors on this foundation that are not locked',\r\n Heliostats: 'Heliostats',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\r\n 'Do you really want to remove all the heliostats on this foundation that are not locked',\r\n Sensors: 'Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\r\n 'Do you really want to remove all the sensors on this foundation that are not locked',\r\n Lights: 'Lights',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation:\r\n 'Do you really want to remove all the lights on this foundation that are not locked',\r\n Walls: 'Walls',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation:\r\n 'Do you really want to remove all the walls on this foundation that are not locked',\r\n Windows: 'Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\r\n 'Do you really want to remove all the windows on this foundation that are not locked',\r\n Doors: 'Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\r\n 'Do you really want to remove all the doors on this foundation that are not locked',\r\n Polygons: 'Polygons',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\r\n 'Do you really want to remove all the polygons on this foundation that are not locked',\r\n Humans: 'Humans',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation:\r\n 'Do you really want to remove all the humans on this foundation who are not locked',\r\n Trees: 'Trees',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation:\r\n 'Do you really want to remove all the trees on this foundation that are not locked',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\r\n 'Do you really want to remove all the flowers on this foundation that are not locked',\r\n OnlyThisFoundation: 'Only This Foundation',\r\n AllConnectedFoundations: 'All Connected Foundations',\r\n AllSelectedFoundations: 'All Selected Foundations',\r\n AllFoundations: 'All Foundations',\r\n AddPolygon: 'Add Polygon',\r\n SolarStructure: 'Solar Structure',\r\n GroupMaster: 'Group Master',\r\n LockAllElementsOnThisFoundation: 'Lock All Elements on This Foundation',\r\n UnlockAllElementsOnThisFoundation: 'Unlock All Elements on This Foundation',\r\n GroundFloorRValue: 'Ground Floor R-Value',\r\n OnlyThisGroundFloor: 'Only This Ground Floor',\r\n AllGroundFloors: 'All Ground Floors',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: 'Receiver Tower for Heliostats',\r\n ReceiverTowerPhysicalProperties: 'Physical Properties of Receiver Tower',\r\n ReceiverTowerHeight: 'Height of Receiver Tower',\r\n ReceiverTowerRadius: 'Radius of Receiver Tower',\r\n ReceiverAbsorptance: 'Absorptance of Receiver',\r\n ReceiverOpticalEfficiency: 'Optical Efficiency of Receiver',\r\n ReceiverThermalEfficiency: 'Thermal Efficiency of Receiver',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: 'Absorber Pipe for Fresnel Reflectors',\r\n AbsorberPipePhysicalProperties: 'Physical Properties of Absorber Pipe',\r\n AbsorberHeight: 'Height of Absorber Pipe',\r\n AbsorberApertureWidth: 'Aperture Width of Absorber Pipe',\r\n AbsorberPipePoleNumber: 'Pole Number for Absorber Pipe',\r\n AbsorberAbsorptance: 'Absorptance of Absorber',\r\n AbsorberOpticalEfficiency: 'Optical Efficiency of Absorber',\r\n AbsorberThermalEfficiency: 'Thermal Efficiency of Absorber',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: 'Solar Updraft Tower',\r\n SolarUpdraftTowerPhysicalProperties: 'Physical Properties of Solar Updraft Tower',\r\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Tower Chimney Height',\r\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Tower Chimney Radius',\r\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Tower Collector Height',\r\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Tower Collector Radius',\r\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Tower Collector Transmissivity',\r\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Tower Collector Emissivity',\r\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Tower Discharge Coefficient',\r\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Tower Turbine Efficiency',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\r\n RemoveAllUnlockedHumans: 'Remove All Unlocked Humans',\r\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Racks',\r\n SolarPanels: 'Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\r\n 'Do you really want to remove all the solar panels on this cuboid that are not locked',\r\n Sensors: 'Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\r\n 'Do you really want to remove all the sensors on this cuboid that are not locked',\r\n Polygons: 'Polygons',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\r\n 'Do you really want to remove all the polygons on this cuboid that are not locked',\r\n Humans: 'Humans',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid:\r\n 'Do you really want to remove all the humans on this cuboid who are not locked',\r\n Trees: 'Trees',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid:\r\n 'Do you really want to remove all the trees on this cuboid that are not locked',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\r\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\r\n OnlyThisCuboid: 'Only This Cuboid',\r\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\r\n AllCuboidsAboveSameBase: 'All Cuboids Above Same Base',\r\n AllSelectedCuboids: 'All Selected Cuboids',\r\n AllCuboids: 'All Cuboids',\r\n OnlyThisSide: 'Only This Side',\r\n AllSidesOfThisCuboid: 'All Sides of This Cuboid',\r\n AllSidesOfSelectedCuboids: 'All Sides of Selected Cuboids',\r\n AllSidesOfAllCuboids: 'All Sides of All Cuboids',\r\n AddPolygon: 'Add Polygon',\r\n Stackable: 'Stackable',\r\n GroupMaster: 'Group Master',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n TextBox: 'Text Box',\r\n FontOutlineColor: 'Font Outline Color',\r\n FontOutlineWidth: 'Font Outline Width',\r\n FontStrokeColor: 'Font Stroke Color',\r\n FontStrokeWidth: 'Font Stroke Width',\r\n NoOutline: 'No Outline',\r\n Shiny: 'Shiny',\r\n Filled: 'Filled',\r\n FillTexture: 'Fill Texture',\r\n FillColor: 'Fill Color',\r\n Opacity: 'Opacity',\r\n LineColor: 'Line Color',\r\n LineWidth: 'Line Width',\r\n LineStyle: 'Line Style',\r\n SolidLine: 'Solid Line',\r\n DashedLine: 'Dashed Line',\r\n DottedLine: 'Dotted Line',\r\n InsertVertexBeforeIndex: 'Insert Vertex Before Index',\r\n InsertVertexAfterIndex: 'Insert Vertex After Index',\r\n DeleteVertex: 'Delete Vertex',\r\n OnlyThisPolygon: 'Only This Polygon',\r\n AllPolygonsOnSurface: 'All Polygons on the Same Surface',\r\n AllPolygonsAboveFoundation: 'All Polygons Above Foundation',\r\n AllSelectedPolygons: 'All Selected Polygons',\r\n AllPolygons: 'All Polygons',\r\n Layout: 'Layout',\r\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\r\n SolarPanelArrayLayoutParametricDesign: 'Solar Panel Array Layout: Parametric Design',\r\n SolarPanelArrayLayoutGenerativeDesign: 'Solar Panel Array Layout: Generative Design',\r\n SolarPanelArrayModel: 'Solar Panel Model',\r\n SolarPanelArrayOrientation: 'Orientation',\r\n SolarPanelArrayTiltAngle: 'Tilt Angle',\r\n SolarPanelArrayRowWidth: 'Row Width',\r\n SolarPanelArrayInterRowSpacing: 'Inter-Row Spacing',\r\n SolarPanelArrayRowSpacing: 'Row Spacing',\r\n SolarPanelArrayRowAxis: 'Row Axis',\r\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\r\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\r\n SolarPanelArrayEastWestRowAxis: 'East-West (Absolute)',\r\n SolarPanelArrayNorthSouthRowAxis: 'North-South (Absolute)',\r\n SolarPanelArrayMargin: 'Margin',\r\n SolarPanelArrayPoleHeight: 'Pole Height',\r\n SolarPanelArrayPoleSpacing: 'Pole Spacing',\r\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\r\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\r\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\r\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\r\n SolarPanelArrayYearlyProfit: 'Profit',\r\n LayoutNotAcceptedCheckYourParameters: 'This layout is not accepted. Please check your parameters.',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: 'Optimization',\r\n Parameters: 'Parameters',\r\n Variables: 'Variables',\r\n Constants: 'Constants',\r\n GeneticAlgorithm: 'Genetic Algorithm',\r\n GeneticAlgorithmSettings: 'Genetic Algorithm Settings',\r\n ParticleSwarmOptimization: 'Particle Swarm Optimization',\r\n ParticleSwarmOptimizationSettings: 'Particle Swarm Optimization Settings',\r\n SolarPanelTiltAngleOptimization: 'Solar Panel Tilt Angle Optimization',\r\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\r\n Generation: 'Generation',\r\n Gene: 'Gene',\r\n NormalizedVariables: 'Normalized Variables',\r\n Objective: 'Objective',\r\n ObjectiveFunctionDailyTotalYield: 'Daily Total Yield',\r\n ObjectiveFunctionYearlyTotalYield: 'Yearly Total Yield',\r\n ObjectiveFunctionDailyMeanYield: 'Daily Mean Yield',\r\n ObjectiveFunctionYearlyMeanYield: 'Yearly Mean Yield',\r\n ObjectiveFunctionDailyProfit: 'Daily Profit',\r\n ObjectiveFunctionYearlyProfit: 'Yearly Profit',\r\n GeneticAlgorithmSelectionMethod: 'Genetic Algorithm Selection Method',\r\n RouletteWheel: 'Roulette Wheel',\r\n Tournament: 'Tournament',\r\n SearchMethod: 'Search Method',\r\n GlobalSearchUniformSelection: 'Global Search Uniform Selection',\r\n LocalSearchRandomOptimization: 'Local Search Random Optimization',\r\n PopulationSize: 'Population Size',\r\n MaximumGenerations: 'Maximum Generations',\r\n SelectionRate: 'Selection Rate',\r\n CrossoverRate: 'Crossover Rate',\r\n MutationRate: 'Mutation Rate',\r\n Step: 'Step',\r\n SwarmSize: 'Swarm Size',\r\n MaximumSteps: 'Maximum Steps',\r\n MaximumVelocity: 'Maximum Velocity',\r\n InertiaWeight: 'Inertia Weight',\r\n CognitiveCoefficient: 'Cognitive Coefficient',\r\n SocialCoefficient: 'Social Coefficient',\r\n ConvergenceThreshold: 'Convergence Threshold for Termination',\r\n LocalSearchRadius: 'Local Search Radius',\r\n RowsPerRackRange: 'Range for Rows per Rack',\r\n TiltAngleRange: 'Range for Tilt Angle',\r\n InterRowSpacingRange: 'Range for Inter-Row Spacing',\r\n ClickTargetPolygonToActivate: 'Click Target Polygon to Activate',\r\n ClickTargetFoundationToActivate: 'Click Target Foundation to Activate',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: 'Show Model',\r\n Flip: 'Flip',\r\n Type: 'Type',\r\n Spread: 'Spread',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: 'Flip',\r\n Type: 'Type',\r\n Spread: 'Spread',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: 'Change Person',\r\n Flip: 'Flip',\r\n Observer: 'Observer',\r\n ViewFromThisPerson: 'View from This Person',\r\n },\r\n\r\n lightMenu: {\r\n Color: 'Color',\r\n Intensity: 'Intensity',\r\n Decay: 'Decay',\r\n MaximumDistance: 'Distance',\r\n Inside: 'Inside',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: 'Relative Azimuth',\r\n Pole: 'Pole',\r\n PoleHeight: 'Pole Height',\r\n PoleRadius: 'Pole Radius',\r\n ExtraPoleHeight: 'Extra Pole Height',\r\n ExtraPoleHeightInAdditionToHalfWidth: 'Extra Pole Height in Addition to Half Width',\r\n DrawSunBeam: 'Draw Sun Beam',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: 'Reflector Reflectance',\r\n ReceiverAbsorptance: 'Receiver Absorptance',\r\n ReflectorOpticalEfficiency: 'Reflector Optical Efficiency',\r\n ReceiverThermalEfficiency: 'Receiver Thermal Efficiency',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: 'Inverter Efficiency',\r\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\r\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\r\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\r\n ChangePvModel: 'Change PV Model',\r\n Orientation: 'Orientation',\r\n Portrait: 'Portrait',\r\n Landscape: 'Landscape',\r\n FrameColor: 'Frame Color',\r\n Panels: 'panels',\r\n PanelsWide: 'panels wide',\r\n PanelsLong: 'panels long',\r\n TiltAngle: 'Tilt Angle',\r\n SouthFacingIsPositive: 'South facing is positive',\r\n Tracker: 'Tracker',\r\n SolarTrackerFollowsSun: 'A tracker follows the sun to increase solar panel outputs.',\r\n PoleSpacing: 'Pole Spacing',\r\n NoTracker: 'No Tracker',\r\n HorizontalSingleAxisTracker: 'Horizontal Single Axis Tracker',\r\n VerticalSingleAxisTracker: 'Vertical Single Axis Tracker',\r\n AltazimuthDualAxisTracker: 'Altazimuth Dual Axis Tracker',\r\n OnlyThisSolarPanel: 'Only This Solar Panel',\r\n AllSolarPanelsOnSurface: 'All Solar Panels on the Same Surface',\r\n AllSolarPanelsAboveFoundation: 'All Solar Panels Above the Same Foundation',\r\n AllSelectedSolarPanels: 'All Selected Solar Panels',\r\n AllSolarPanels: 'All Solar Panels',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: 'Solar Panel Specs',\r\n Model: 'Model',\r\n PanelSize: 'Panel Size',\r\n Cells: 'Cells',\r\n CellType: 'Cell Type',\r\n Monocrystalline: 'Monocrystalline',\r\n Polycrystalline: 'Polycrystalline',\r\n ThinFilm: 'Thin Film',\r\n Bifacial: 'Bifacial',\r\n BifacialityFactor: 'Bifaciality Factor',\r\n Black: 'Black',\r\n Blue: 'Blue',\r\n ShadeTolerance: 'Shade Tolerance',\r\n SolarCellEfficiency: 'Solar Cell Efficiency',\r\n NominalOperatingCellTemperature: 'Nominal Operating Cell Temperature',\r\n TemperatureCoefficientOfPmax: 'Temperature Coefficient of Pmax',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: 'Module Length',\r\n Modules: 'modules',\r\n ModulesLong: 'modules long',\r\n LatusRectum: 'Latus Rectum',\r\n OnlyThisParabolicTrough: 'Only This Parabolic Trough',\r\n AllParabolicTroughsAboveFoundation: 'All Parabolic Troughs Above the Same Foundation',\r\n AllSelectedParabolicTroughs: 'All Selected Parabolic Troughs',\r\n AllParabolicTroughs: 'All Parabolic Troughs',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: 'Absorber Pipe',\r\n SelectAbsorberToReflectSunlightTo: 'Select Absorber to Reflect Sunlight to',\r\n ModuleLength: 'Module Length',\r\n Modules: 'modules',\r\n ModulesLong: 'modules long',\r\n OnlyThisFresnelReflector: 'Only This Fresnel Reflector',\r\n AllFresnelReflectorsAboveFoundation: 'All Fresnel Reflectors Above the Same Foundation',\r\n AllSelectedFresnelReflectors: 'All Selected Fresnel Reflectors',\r\n AllFresnelReflectors: 'All Fresnel Reflectors',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: 'Tower',\r\n SelectTowerToReflectSunlightTo: 'Select Tower to Reflect Sunlight to',\r\n OnlyThisHeliostat: 'Only This Heliostat',\r\n AllHeliostatsAboveFoundation: 'All Heliostats Above the Same Foundation',\r\n AllSelectedHeliostats: 'All Selected Heliostats',\r\n AllHeliostats: 'All Heliostats',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: 'Receiver Structure',\r\n CentralPole: 'Central Pole',\r\n CentralPoleWithTripod: 'Central Pole with Tripod',\r\n Quadrupod: 'Quadrupod',\r\n RimDiameter: 'Rim Diameter',\r\n LatusRectum: 'Latus Rectum',\r\n ExtraPoleHeightInAdditionToRadius: 'Extra Pole Height in Addition to Radius',\r\n OnlyThisParabolicDish: 'Only This Parabolic Dish',\r\n AllParabolicDishesAboveFoundation: 'All Parabolic Dishes Above the Same Foundation',\r\n AllSelectedParabolicDishes: 'All Selected Parabolic Dishes',\r\n AllParabolicDishes: 'All Parabolic Dishes',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: 'Default',\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n SizeOfWall: 'Size of Wall',\r\n OnlyThisWall: 'Only This Wall',\r\n AllConnectedWalls: 'All Connected Walls',\r\n AllWallsAboveFoundation: 'All Walls Above the Same Foundation',\r\n AllSelectedWalls: 'All Selected Walls',\r\n AllWalls: 'All Walls',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Do you really want to remove all the windows on this wall',\r\n Doors: 'Doors',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Do you really want to remove all the doors on this wall',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Do you really want to remove all the solar panels on this wall',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\r\n LockAllPolygons: 'Lock All Polygons',\r\n UnlockAllPolygons: 'Unlock All Polygons',\r\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\r\n WallStructure: 'Wall Structure',\r\n DefaultStructure: 'Default',\r\n StudStructure: 'Stud',\r\n PillarStructure: 'Pillar',\r\n Opacity: 'Opacity',\r\n StructureSpacing: 'Structure Spacing',\r\n StructureWidth: 'Structure Width',\r\n StructureThickness: 'Structure Thickness',\r\n StructureColor: 'Structure Color',\r\n Color: 'Wall Color',\r\n Height: 'Height',\r\n Thickness: 'Thickness',\r\n Texture: 'Texture',\r\n AllLightsOnWallInside: 'All Lights on Wall Inside',\r\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\r\n Fill: 'Fill',\r\n Full: 'Full',\r\n Partial: 'Partial',\r\n Empty: 'Empty',\r\n OpenToOutside: 'Open to Outside',\r\n EavesLength: 'Eaves Overhang Length',\r\n Parapet: 'Parapet',\r\n ParapetColor: 'Parapet Color',\r\n ParapetTexture: 'Parapet Texture',\r\n ParapetHeight: 'Parapet Height',\r\n CopingsHeight: 'Copings Height',\r\n CopingsWidth: 'Copings Width',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: 'Only This Window',\r\n AllWindowsOnSurface: 'All Windows on the Same Surface',\r\n AllWindowsAboveFoundation: 'All Windows Above the Same Foundation',\r\n AllSelectedWindows: 'All Selected Windows',\r\n AllWindows: 'All Windows',\r\n Width: 'Width',\r\n Height: 'Height',\r\n Setback: 'Setback from Exterior Surface',\r\n RelativeToWallThickness: 'Relative to wall thickness',\r\n Mullion: 'Mullion',\r\n HorizontalMullion: 'Horizontal Mullion',\r\n VerticalMullion: 'Vertical Mullion',\r\n MullionWidth: 'Mullion Width',\r\n HorizontalMullionSpacing: 'Horizontal Mullion Spacing',\r\n VerticalMullionSpacing: 'Vertical Mullion Spacing',\r\n MullionColor: 'Mullion Color',\r\n Tint: 'Tint',\r\n Opacity: 'Opacity',\r\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\r\n Shutter: 'Shutter',\r\n LeftShutter: 'Left Shutter',\r\n RightShutter: 'Right Shutter',\r\n BothShutters: 'Both Shutters',\r\n ShutterWidth: 'Relative Width',\r\n ShutterColor: 'Shutter Color',\r\n Frame: 'Frame',\r\n FrameWidth: 'Frame Width',\r\n SillWidth: 'Sill Width',\r\n Color: 'Frame Color',\r\n WindowType: 'Window Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Polygonal: 'Polygonal',\r\n Interior: 'Interior',\r\n Empty: 'Empty',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: 'Default',\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n OnlyThisRoof: 'Only This Roof',\r\n AllRoofsAboveFoundation: 'All Roofs Above the Same Foundation',\r\n AllSelectedRoofs: 'All Selected Roofs',\r\n AllRoofs: 'All Roofs',\r\n OnlyThisCeiling: 'Only This Ceiling',\r\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\r\n AllCeilings: 'All Ceilings',\r\n EavesOverhangLength: 'Eaves Overhang Length',\r\n RafterSpacing: 'Rafter Spacing',\r\n RafterWidth: 'Rafter Width',\r\n RafterThickness: 'Rafter Thickness',\r\n RafterColor: 'Rafter Color',\r\n RoofColor: 'Roof Color',\r\n RoofSideColor: 'Roof Side Color',\r\n GlassTint: 'Glass Tint',\r\n Opacity: 'Opacity',\r\n RoofStructure: 'Roof Structure',\r\n DefaultStructure: 'Default',\r\n RafterStructure: 'Rafter',\r\n GlassStructure: 'Glass',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\r\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\r\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\r\n Rise: 'Rise',\r\n Ceiling: 'Ceiling',\r\n RoofRValue: 'Roof R-Value',\r\n CeilingRValue: 'Ceiling R-Value',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: 'Default',\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n Texture11: 'Texture 11',\r\n Texture12: 'Texture 12',\r\n Texture13: 'Texture 13',\r\n Texture14: 'Texture 14',\r\n Texture15: 'Texture 15',\r\n Texture16: 'Texture 16',\r\n Texture17: 'Texture 17',\r\n OnlyThisDoor: 'Only This Door',\r\n AllDoorsOnWall: 'All Doors on the Same Wall',\r\n AllDoorsAboveFoundation: 'All Doors Above the Same Foundation',\r\n AllSelectedDoors: 'All Selected Doors',\r\n AllDoors: 'All Doors',\r\n DoorType: 'Door Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Filled: 'Filled',\r\n FrameColor: 'Frame Color',\r\n Interior: 'Interior',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: 'High',\r\n Low: 'Low',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: 'Number of selected heliostats',\r\n NumberOfSelectedSolarPanels: 'Number of selected solar panels',\r\n ElectricityGeneratedDailyBySolarPanels: 'Electricity generated daily by these solar panels',\r\n SceneDiameter: 'Scene diameter',\r\n BuildingArea: 'Building area',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: 'Color Contrast',\r\n FluxScale: 'Flux Scale',\r\n ClickUpOrDownArrowButtonsToChange: 'Click up or down arrow buttons to change',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: 'Rotate',\r\n DragMouse: 'Drag mouse',\r\n Zoom: 'Zoom',\r\n MouseWheelOrKeys: 'Rotate mouse wheel or press Ctrl+[ or Ctrl+]',\r\n MouseWheelOrKeysMac: 'Rotate mouse wheel or press ⌘+[ or ⌘+]',\r\n Pan: 'Pan',\r\n HoldCtrlDragMouse: 'Hold Ctrl and drag mouse',\r\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\r\n Enter2DMode: 'Enter 2D mode',\r\n Exit2DMode: 'Exit 2D mode',\r\n NavigationMode: 'Navigation mode',\r\n EnableNavigation: 'Enable navigation',\r\n DisableNavigation: 'Disable navigation',\r\n MoveForwardBack: 'Move forward/back',\r\n MoveForwardBackInstruction: 'Press W/S',\r\n MoveLeftRight: 'Move left/right',\r\n MoveLeftRightInstruction: 'Press A/D',\r\n MoveUpDown: 'Move up/down',\r\n MoveUpDownInstruction: 'Press Z/X',\r\n Turn: 'Turn',\r\n TurnInstruction: 'Press arrow keys',\r\n ResetView: 'Reset',\r\n AutoRotate: 'Auto rotate',\r\n StartOrStop: 'Press F4 to start or stop',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: 'Image on Ground',\r\n WeatherStations: 'Weather Stations',\r\n WeatherStationsNote: 'Turn this off to speed up',\r\n Coordinates: 'Coordinates',\r\n Zoom: 'Zoom',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: 'Solar Panel Visibility',\r\n Observer: 'Observer',\r\n VantagePoint: 'Vantage Point',\r\n ItemizedVisibilityByFields: 'Itemized by Fields',\r\n TotalVisibility: 'Total',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: 'Light Sensor',\r\n WeatherDataFrom: 'Weather Data from',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: 'Daily Building Energy',\r\n YearlyBuildingEnergy: 'Yearly Building Energy',\r\n Heater: 'Heater',\r\n AC: 'AC',\r\n SolarPanel: 'Solar Panel',\r\n Net: 'Net',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: 'Solar Panel Daily Yield',\r\n SolarPanelYearlyYield: 'Solar Panel Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualSolarPanels: 'Show outputs of individual solar panels',\r\n Profit: 'Profit',\r\n TotalCost: 'Total Cost',\r\n TotalRevenue: 'Total Revenue',\r\n TotalYield: 'Total Yield',\r\n MeanYield: 'Mean Yield',\r\n ModuleCount: 'Module Count',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: 'Parabolic Trough Daily Yield',\r\n ParabolicTroughYearlyYield: 'Parabolic Trough Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualParabolicTroughs: 'Show outputs of individual parabolic troughs',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: 'Parabolic Dish Daily Yield',\r\n ParabolicDishYearlyYield: 'Parabolic Dish Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualParabolicDishes: 'Show outputs of individual parabolic dishes',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: 'Fresnel Reflector Daily Yield',\r\n FresnelReflectorYearlyYield: 'Fresnel Reflector Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualFresnelReflectors: 'Show outputs of individual Fresnel feflectors',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: 'Heliostat Daily Yield',\r\n HeliostatYearlyYield: 'Heliostat Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualHeliostats: 'Show outputs of individual heliostats',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: 'Solar Updraft Tower Daily Yield',\r\n UpdraftTowerYearlyYield: 'Solar Updraft Tower Yearly Yield',\r\n ChimneyAirTemperature: 'Chimney Air Temperature',\r\n ChimneyWindSpeed: 'Chimney Wind Speed',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualUpdraftTowers: 'Show outputs of individual updraft towers',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: 'Sun & Time Settings',\r\n SunAngles: 'Angles',\r\n TwentyFourHours: '24 Hours',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyLikes: 'My Likes',\r\n MyCloudFiles: 'My Cloud Files',\r\n GenerateLink: 'Generate Link',\r\n LinkGeneratedInClipBoard: 'A link was generated in the clip board',\r\n DoYouReallyWantToDelete: 'Do you really want to delete',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\r\n 'If this file has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyProjects: 'My Projects',\r\n GenerateProjectLink: 'Generate Project Link',\r\n ProjectLinkGeneratedInClipBoard: 'A link to the project was generated in the clip board',\r\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\r\n 'If this project has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: 'Project Settings',\r\n ThumbnailImageSize: 'Thumbnail Image Size',\r\n ProjectByOtherPeople: 'Project by Other People',\r\n Project: 'Project',\r\n ProjectType: 'Type',\r\n ProjectDescription: 'Description',\r\n MakeDescriptionEditable: 'Make this description editable',\r\n MakeDescriptionNonEditable: 'Make this description non-editable',\r\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\r\n SolarPanelArray: 'Solar Panel Array',\r\n CurateCurrentDesign: 'Curate current design',\r\n UpdateSelectedDesign: 'Update selected design',\r\n RemoveSelectedDesign: 'Remove selected design',\r\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\r\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\r\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\r\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\r\n ChooseSolutionSpace: 'Choose solution space',\r\n ChooseDataColoring: 'Choose data coloring',\r\n SameColorForAllDesigns: 'Same color for all designs',\r\n OneColorForEachDesign: 'One color for each design',\r\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\r\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\r\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\r\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\r\n GenerateScatteredPlot: 'Generate Scattered Plot',\r\n SelectXAxis: 'Select X Axis',\r\n SelectYAxis: 'Select Y Axis',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: 'My Account Settings',\r\n MyID: 'My 🆔',\r\n ClickToCopyMyID: 'Click to copy my ID',\r\n IDInClipBoard: 'Your ID was copied and is ready to paste.',\r\n StoreMyNameInMyFilesWhenSaving: 'Store my name in my files when saving',\r\n DoYouReallyWantToShowYourNameInYourFiles: 'Do you really want to show your display name in your files?',\r\n SignFileDisclaimer: 'If yes, your display name may be seen by anyone who can access your files.',\r\n Likes: 'Likes',\r\n AllPublished: 'All Published',\r\n PublishedUnderAliases: 'Aliases',\r\n UserCount: 'User Count',\r\n SchoolID: 'School ID',\r\n ClassID: 'Class ID',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: 'Sunshine',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: 'Select Air Temperature Model',\r\n Sinusoidal: 'Sinusoidal',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: 'Economics Parameters',\r\n ElectricitySellingPrice: 'Electricity Selling Price',\r\n OperationalCostPerUnit: 'Operational Cost per Unit',\r\n SellingPrice: 'Selling Price',\r\n UnitCost: 'Unit Cost',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: 'Navigation Parameters',\r\n MinimumMoveSpeed: 'Minimum Move Speed',\r\n MinimumTurnSpeed: 'Minimum Turn Speed',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: 'Clearness',\r\n ShowDaylightResults: 'Show daylight results',\r\n ShowSkyClearnessResults: 'Show sky clearness results',\r\n ShowAverageDailySolarRadiation: 'Show average daily solar radiation',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: 'There is no sensor for collecting data.',\r\n NoSolarPanelForAnalysis: 'There is no solar panel for analysis.',\r\n NoObserverForVisibilityAnalysis: 'There is no observer for visibility analysis.',\r\n NoWaterHeaterForAnalysis: 'There is no water heater for analysis.',\r\n NoParabolicDishForAnalysis: 'There is no parabolic dish for analysis.',\r\n NoParabolicTroughForAnalysis: 'There is no parabolic trough for analysis.',\r\n NoFresnelReflectorForAnalysis: 'There is no Fresnel reflector for analysis.',\r\n NoHeliostatForAnalysis: 'There is no heliostat for analysis.',\r\n NoSolarUpdraftTowerForAnalysis: 'There is no solar updraft tower for analysis.',\r\n NoBuildingForAnalysis: 'There is no building for analysis.',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: 'Cloud file',\r\n Select: 'Select',\r\n AddFoundation: 'Add foundation',\r\n AddWall: 'Add wall',\r\n AddWindow: 'Add window',\r\n AddDoor: 'Add door',\r\n AddPyramidRoof: 'Add pyramid roof',\r\n AddGableRoof: 'Add gable roof',\r\n AddHipRoof: 'Add hip roof',\r\n AddGambrelRoof: 'Add gambrel roof',\r\n AddMansardRoof: 'Add Mansard roof',\r\n AddCuboid: 'Add cuboid',\r\n AddSensor: 'Add sensor',\r\n AddSolarPanel: 'Add solar panel',\r\n AddWaterHeater: 'Add water heater',\r\n AddParabolicDish: 'Add parabolic dish',\r\n AddParabolicTrough: 'Add parabolic trough',\r\n AddFresnelReflector: 'Add Fresnel reflector',\r\n AddHeliostat: 'Add heliostat',\r\n AddWindTurbine: 'Add wind turbine',\r\n AddLight: 'Add light',\r\n AddTree: 'Add tree',\r\n AddFlower: 'Add flower',\r\n AddPeople: 'Add people',\r\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\r\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\r\n ManipulateGroup: 'Manipulate a group',\r\n ClearScene: 'Clear scene',\r\n ShowSunAndTimeSettings: 'Show sun and time settings',\r\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\r\n DoYouReallyWantToClearContent: 'Do you really want to clear the content',\r\n ClickForMoreButtons: 'Click for more buttons',\r\n SwitchToAddingFoundation: 'Switch to Adding Foundation',\r\n SwitchToAddingCuboid: 'Switch to Adding Cuboid',\r\n SwitchToAddingWall: 'Switch to Adding Wall',\r\n SwitchToAddingWindow: 'Switch to Adding Window',\r\n SwitchToAddingDoor: 'Switch to Adding Door',\r\n SwitchToAddingPyramidRoof: 'Switch to Adding Pyramid Roof',\r\n SwitchToAddingGableRoof: 'Switch to Adding Gable Roof',\r\n SwitchToAddingHipRoof: 'Switch to Adding Hip Roof',\r\n SwitchToAddingGambrelRoof: 'Switch to Adding Gambrel Roof',\r\n SwitchToAddingMansardRoof: 'Switch to Adding Mansard Roof',\r\n SwitchToAddingSolarPanel: 'Switch to Adding Solar Panel',\r\n SwitchToAddingSensor: 'Switch to Adding Sensor',\r\n SwitchToAddingWaterHeater: 'Switch to Adding Water Heater',\r\n SwitchToAddingParabolicDish: 'Switch to Adding Parabolic Dish',\r\n SwitchToAddingParabolicTrough: 'Switch to Adding Parabolic Trough',\r\n SwitchToAddingFresnelReflector: 'Switch to Adding Fresnel Reflector',\r\n SwitchToAddingHeliostat: 'Switch to Adding Heliostat',\r\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\r\n SwitchToAddingLight: 'Switch to Adding Light',\r\n SwitchToAddingTree: 'Switch to Adding Tree',\r\n SwitchToAddingFlower: 'Switch to Adding Flower',\r\n SwitchToAddingPeople: 'Switch to Adding People',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: 'Go to Institute for Future Intelligence',\r\n visitAladdinHomePage: 'Visit Aladdin Homepage',\r\n clickToOpenMenu: 'Click to open main menu',\r\n clickToAccessAccountSettings: 'Click to access account settings',\r\n },\r\n\r\n tree: {\r\n Apple: 'Apple',\r\n Birch: 'Birch',\r\n Coconut: 'Coconut',\r\n Dogwood: 'Dogwood',\r\n Elm: 'Elm',\r\n FanPalm: 'Fan Palm',\r\n Linden: 'Linden',\r\n Magnolia: 'Magnolia',\r\n Maple: 'Maple',\r\n Oak: 'Oak',\r\n Pine: 'Pine',\r\n Spruce: 'Spruce',\r\n },\r\n\r\n flower: {\r\n Bellflower: 'Bellflower',\r\n Boxwood: 'Boxwood',\r\n CactusCombo1: 'Cactus Combo 1',\r\n CactusCombo2: 'Cactus Combo 2',\r\n CactusCombo3: 'Cactus Combo 3',\r\n CactusCombo4: 'Cactus Combo 4',\r\n Hibiscus: 'Hibiscus',\r\n Hosta: 'Hosta',\r\n Hydrangea: 'Hydrangea',\r\n Peony: 'Peony',\r\n RedRose: 'Red Rose',\r\n Spirea: 'Spirea',\r\n Sunflower: 'Sunflower',\r\n TallBush: 'Tall Bush',\r\n Tulip: 'Tulip',\r\n WhiteFlower: 'White Flower',\r\n YellowFlower: 'Yellow Flower',\r\n },\r\n\r\n people: {\r\n Jaah: 'Jaah',\r\n Jack: 'Jack',\r\n Jacob: 'Jacob',\r\n Jacqueline: 'Jacqueline',\r\n Jade: 'Jade',\r\n Jamelia: 'Jamelia',\r\n James: 'James',\r\n Jane: 'Jane',\r\n Jaya: 'Jaya',\r\n Jaye: 'Jaye',\r\n Jeanette: 'Jeanette',\r\n Jedi: 'Jedi',\r\n Jeff: 'Jeff',\r\n Jena: 'Jena',\r\n Jennifer: 'Jennifer',\r\n Jess: 'Jess',\r\n Jett: 'Jett',\r\n Jill: 'Jill',\r\n Jiya: 'Jiya',\r\n Joan: 'Joan',\r\n Jocelyn: 'Jocelyn',\r\n Joel: 'Joel',\r\n Joey: 'Joey',\r\n John: 'John',\r\n Jonathon: 'Jonathon',\r\n Jose: 'Jose',\r\n Joseph: 'Joseph',\r\n Joshua: 'Joshua',\r\n Judd: 'Judd',\r\n Judy: 'Judy',\r\n Julia: 'Julia',\r\n Julio: 'Julio',\r\n Jumapili: 'Jumapili',\r\n June: 'June',\r\n Juro: 'Juro',\r\n Justin: 'Justin',\r\n },\r\n\r\n compass: {\r\n N: 'N',\r\n S: 'S',\r\n W: 'W',\r\n E: 'E',\r\n },\r\n\r\n month: {\r\n January: 'Jan',\r\n February: 'Feb',\r\n March: 'Mar',\r\n April: 'Apr',\r\n May: 'May',\r\n June: 'Jun',\r\n July: 'Jul',\r\n August: 'Aug',\r\n September: 'Sep',\r\n October: 'Oct',\r\n November: 'Nov',\r\n December: 'Dec',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: 'Search by publisher',\r\n SearchByLabel: 'Search by label',\r\n MyPublishedModels: 'My Published Models',\r\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\r\n SortFromOldestToNewest: 'Sort from oldest to newest',\r\n SortFromNewestToOldest: 'Sort from newest to oldest',\r\n ModelsFoundOnThisSite: 'models found on this site',\r\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_zh_cn = {\r\n translation: {\r\n name: {\r\n IFI: '未来智能研究所',\r\n Aladdin: '阿拉丁',\r\n Tagline: '阿拉丁: 探索人工智能时代的设计软件 — 未来智能研究所研发',\r\n },\r\n\r\n cookie: {\r\n Statement: '声明:为了改善您的用户体验,阿拉丁采用cookie储存少量数据。',\r\n Accept: '同意',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: '未来智能研究所荣誉出品',\r\n TermsOfService: '服务条款',\r\n PrivacyPolicy: '隐私政策',\r\n Software: '软件',\r\n Content: '课件',\r\n Research: '研究',\r\n Support: '服务',\r\n Acknowledgment: '鸣谢',\r\n FundingInformation:\r\n '本产品的研发承蒙美国国家科学基金会慷慨资助(项目号#2105695,#2131097,#2301164)。本产品的任何观点或结论仅代表创作者个人意见。',\r\n Contact: '如您需要更多信息,请联系 Charles Xie (charles@intofuture.org)。我们会尽快回复。',\r\n Translators: '翻译',\r\n },\r\n\r\n word: {\r\n LastUpdate: '上一次更新',\r\n Small: '小',\r\n Medium: '中',\r\n Large: '大',\r\n Design: '设计',\r\n Information: '信息',\r\n Type: '类别',\r\n Text: '文字',\r\n FontSize: '字体大小',\r\n FontColor: '字体颜色',\r\n Model: '模型',\r\n Models: '模型',\r\n Upload: '上传',\r\n ClickCount: '点击数',\r\n Share: '分享',\r\n AlreadyLike: '已点赞',\r\n Like: '点赞',\r\n MustLogInToLike: '必须登录才能点赞',\r\n AllRightsReserved: '版权所有',\r\n MeterAbbreviation: '米',\r\n Version: '版本',\r\n VersionInitial: '版本',\r\n Options: '选项',\r\n Maximum: '最大',\r\n Minimum: '最小',\r\n MaximumNumber: '最多',\r\n MinimumNumber: '最少',\r\n MaximumValue: '最大值',\r\n MinimumValue: '最小值',\r\n Or: '或',\r\n None: '无',\r\n High: '高',\r\n Partial: '部分',\r\n Teacher: '老师',\r\n Class: '班级',\r\n Total: '总数',\r\n Leaderboard: '用戶排行榜',\r\n Latest: '最新',\r\n Range: '范围',\r\n SIUnit: '国际单位制',\r\n USUnit: '美国单位制',\r\n ThermalTransmittance: '热透过率',\r\n ThermalResistance: '热阻',\r\n UValue: 'U值',\r\n RValue: 'R值',\r\n VolumetricHeatCapacity: '容积热容',\r\n BuildingHVACSystem: '建筑物暖通空调系统',\r\n ThermostatSetpoint: '恒温器设定值',\r\n TemperatureToleranceThreshold: '温度忍耐阈值',\r\n TemperatureToleranceThresholdExplanation:\r\n '当日最低外面温度高于恒温器设定值减去此阈值,暖气不开。\\n当日最高外面温度低于恒温器设定值加上此阈值,空调不开。',\r\n Press: '按',\r\n Open: '打开',\r\n Save: '保存',\r\n SaveAsImage: '保存为图像',\r\n SaveAsCsv: '保存为CSV',\r\n Update: '刷新',\r\n Paste: '粘贴',\r\n Copy: '复制',\r\n Cut: '剪切',\r\n Delete: '删除',\r\n Lock: '固定',\r\n Translucent: '半透明',\r\n Color: '颜色',\r\n Texture: '材质',\r\n Thickness: '厚度',\r\n Size: '尺寸',\r\n Yes: '是',\r\n No: '不',\r\n OK: '确定',\r\n Cancel: '取消',\r\n Apply: '应用',\r\n Close: '关闭',\r\n ApplyTo: '适用于',\r\n Run: '运行',\r\n Pause: '暂停',\r\n Resume: '继续',\r\n Clear: '清空',\r\n Warning: '警告',\r\n Caution: '小心',\r\n Reminder: '提醒',\r\n Length: '长度',\r\n Width: '宽度',\r\n Height: '高度',\r\n Radius: '半径',\r\n Angle: '角度',\r\n Azimuth: '方位角',\r\n Coordinates: '坐标',\r\n Weather: '天气',\r\n Show: '显示',\r\n Animate: '动画',\r\n Date: '日期',\r\n Time: '时间',\r\n Title: '标题',\r\n Owner: '所有者',\r\n Action: '操作',\r\n Rename: '改名',\r\n Location: '位置',\r\n Latitude: '纬度',\r\n Month: '月份',\r\n Day: '天',\r\n Hour: '小时',\r\n Daylight: '白天长度',\r\n Radiation: '辐射',\r\n Temperature: '温度',\r\n kWh: '千瓦时',\r\n dollar: '元',\r\n MeterPerSecond: '米/秒',\r\n NorthInitial: '北',\r\n SouthInitial: '南',\r\n EastInitial: '东',\r\n WestInitial: '西',\r\n Fixed: '固定',\r\n Elements: '部件',\r\n Energy: '能量',\r\n Unknown: '未知',\r\n Label: '标签',\r\n Description: '描述',\r\n NoDescription: '无描述',\r\n MaximumCharacters: '最多字符数',\r\n Author: '作者',\r\n Publisher: '发布者',\r\n Building: '建筑',\r\n ResidentialBuilding: '住宅建筑',\r\n CommercialBuilding: '商用建筑',\r\n SchoolBuilding: '学校建筑',\r\n TouristAttraction: '旅游景点',\r\n UnderConstruction: '在建',\r\n Photovoltaic: '光伏',\r\n Anonymous: '无名氏',\r\n Nickname: '别名',\r\n Pin: '置顶',\r\n Unpin: '解除置顶',\r\n },\r\n\r\n shared: {\r\n NoTexture: '无材质',\r\n FoundationElement: '地基',\r\n CuboidElement: '长方体',\r\n PolygonElement: '多边形',\r\n SensorElement: '传感器',\r\n SolarPanelElement: '光伏板',\r\n WaterHeaterElement: '太阳能热水器',\r\n ParabolicDishElement: '抛物线碟',\r\n ParabolicTroughElement: '抛物线槽',\r\n FresnelReflectorElement: '菲涅耳反射镜',\r\n HeliostatElement: '定日镜',\r\n WindTurbineElement: '风力涡轮机',\r\n LightElement: '电灯',\r\n ElementLocked: '固定',\r\n ModelType: '模型类别',\r\n OutputBreakdown: '分列发电量',\r\n MoreResults: '更多结果',\r\n },\r\n\r\n message: {\r\n ModelNotFound: '没有找到模型',\r\n CannotSignIn: '登录失败',\r\n CannotSignOut: '退出失败',\r\n YourAccountWasCreated: '成功建立您的账号。',\r\n CannotCreateAccount: '无法创建账号',\r\n YourAccountSettingsWereSaved: '您的账号设定已保存。',\r\n CannotSaveYourAccountSettings: '您的账号设定无法保存',\r\n CannotSaveYourFileToCloud: '无法保存您的文件到云端',\r\n CannotCreateNewProject: '无法创建新项目',\r\n CannotCreateNewProjectWithoutTitle: '没有标题, 无法创建新项目',\r\n CannotOpenYourProjects: '无法打开您的项目列表',\r\n CannotOpenProject: '无法打开项目',\r\n CannotDeleteProject: '无法删除项目',\r\n CannotRenameProject: '无法给项目改名',\r\n CannotAddDesignToProject: '无法把此设计加到项目里',\r\n CannotAddDesignToProjectOwnedByOthers: '不能把此设计加到别人的项目里',\r\n DesignRemovedFromProject: '设计被成功地从项目里删除',\r\n CannotRemoveDesignFromProject: '无法把此设计从项目里删除',\r\n CannotUpdateProject: '无法更新项目',\r\n CannotFetchProjectData: '无法取得项目数据',\r\n TitleUsedChooseDifferentOne: '此标题已经被使用, 请采用不同的标题',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: '使用此标题的云文件已经存在,您确定要覆盖它吗?',\r\n CloudFileNotFound: '找不到此云端文件',\r\n CannotLoadModelsOnMap: '无法下载地图上的模型',\r\n CannotLoadLeaderboard: '无法下载排行榜',\r\n CannotPublishModelOnMap: '模型无法发布到地图上',\r\n CannotLikeModelFromMap: '无法点赞地图上的模型',\r\n CannotDeleteModelFromMap: '无法删除地图上的模型',\r\n ModelDeletedFromMap: '模型已从地图上删除',\r\n DoYouWantToDeleteModelFromMap: '您要删除地图上的这个模型吗?',\r\n CannotOpenCloudFile: '此云端文件无法打开',\r\n CannotReadCloudFile: '无法读取此云端文件',\r\n CannotWriteCloudFile: '无法存储此云端文件',\r\n CloudFileCopied: '拷贝云端文件',\r\n CannotOpenCloudFolder: '您的云端文件夹无法打开',\r\n CannotDeleteCloudFile: '无法删除此云端文件',\r\n CannotRenameCloudFile: '此云端文件的名字无法更改',\r\n DoYouWantToSaveChanges: '您要保存当前文件吗?',\r\n NotApplicableToSelectedAction: '此值不适用于当前选择范围',\r\n ThisElementIsLocked: '这个部件被锁定。',\r\n ThisCannotBeUndone: '这个操作一旦执行就不能撤销。',\r\n AzimuthOfNorthIsZero: '正北的方位角为零度',\r\n CounterclockwiseAzimuthIsPositive: '逆时针为正',\r\n MoveCancelledBecauseOfOverlap: '位置重叠,移动取消。',\r\n MoveOutsideBoundaryCancelled: '位置出界,移动取消。',\r\n RotationCancelledBecauseOfOverlap: '位置重叠,旋转取消。',\r\n RotationOutsideBoundaryCancelled: '位置出界,旋转取消。',\r\n ResizingCancelledBecauseOfOverlap: '位置重叠,尺寸调整取消。',\r\n ResizingOutsideBoundaryCancelled: '位置出界,尺寸调整取消。',\r\n CannotPasteOutsideBoundary: '位置出界,不能复制。',\r\n CannotPasteBecauseOfOverlap: '位置重叠,不能复制。',\r\n CannotMoveObjectTooFar: '位置太远,移动取消。',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout: '采用新布局之前必须移除现有的光伏板。',\r\n DoYouWantToContinue: '您想继续吗?',\r\n SolarPanelsCannotIntersectWithGround: '光伏板不能和地面接触。',\r\n SolarPanelsCannotOverlapWithOneAnother: '光伏板不能重叠。',\r\n ScreenshotSaved: '截屏图片保存在下载文件夹里。',\r\n CsvFileSaved: 'CSV保存在下载文件夹里。',\r\n SimulationStarted: '模拟开始。',\r\n SimulationCompleted: '模拟结束。',\r\n SimulationAborted: '模拟取消。',\r\n SimulationPaused: '模拟暂停。',\r\n CancelSimulation: '取消模拟',\r\n PauseSimulation: '暂停模拟',\r\n ResumeSimulation: '继续模拟',\r\n SimulationWillNotStartDueToErrors: '由于错误模拟无法运行',\r\n SimulationWillStartDespiteWarnings: '发现问题,但模拟仍然将运行。',\r\n EvolutionStarted: '演化开始。',\r\n EvolutionCompleted: '演化结束。',\r\n EvolutionAborted: '演化取消。',\r\n EvolutionPaused: '演化暂停。',\r\n EncounterEvolutionError: '演化出错。',\r\n CancelEvolution: '取消演化',\r\n PauseEvolution: '暂停演化',\r\n ResumeEvolution: '继续演化',\r\n ConvergenceThresholdHasBeenReached: '收敛阈值已达到。',\r\n MaximumNumberOfGenerationsHasBeenReached: '最大世代数已达到。',\r\n MaximumNumberOfStepsHasBeenReached: '最大步数已达到。',\r\n ObjectiveFunctionTypeError: '此操作不支持当前的目标函数。请从菜单启动此功能。',\r\n WallsAreNotAtSameHeight: '墙体高度不同。',\r\n WallsAreNotPerpendicular: '墙体不垂直。',\r\n WallsAreNotConnected: '墙体不相连。',\r\n WallsNumberNeedToBeFour: '墙体数量必须为四个。',\r\n BuildingContainsEmptyWall: '建筑物有空墙。',\r\n BuildingRoofMissing: '建筑物没有屋顶。',\r\n UnknownErrors: '未知错误。',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: '分析选项',\r\n option: {\r\n GridCellSize: '计算网格的尺寸',\r\n SamplingFrequency: '采样频率',\r\n TimesPerHour: '每小时采样次数',\r\n DaysPerYear: '每一年采样天数',\r\n },\r\n mainMenu: '主菜单',\r\n cloudMenu: '云菜单',\r\n projectSubMenu: '项目',\r\n project: {\r\n CreateNewProject: '创建新项目',\r\n OpenProject: '打开项目',\r\n SaveProjectAs: '另存项目为',\r\n YouMustLogInToCreateProject: '您必须登录才能创建项目',\r\n YouMustLogInToOpenProject: '您必须登录才能打开项目',\r\n },\r\n fileSubMenu: '文件',\r\n file: {\r\n CreateNewFile: '创建新文件',\r\n OpenLocalFile: '打开本地文件',\r\n SaveAsLocalFile: '保存为本地文件',\r\n SavingAbortedMustHaveValidFileName: '文件名无效,保存失败',\r\n OpenCloudFile: '打开云端文件',\r\n SaveCloudFile: '保存云端文件',\r\n SaveAsCloudFile: '保存为云端文件',\r\n SavingAbortedMustHaveValidTitle: '云端文件名无效,保存失败',\r\n ToSaveYourWorkPleaseSignIn: '为了保存您的云端文件,请您先登录。',\r\n TakeScreenshot: '截屏',\r\n UseCloudFileName: '采用云端文件名',\r\n PublishOnModelsMap: '发布到地图上',\r\n PublishedOnModelsMap: '您的模型成功发布到地图上',\r\n UpdatedOnModelsMap: '您的模型更新成功',\r\n YouMustLogInToPublishYourModel: '您必须登录才能发布模型',\r\n YouCannotPublishAModelThatYouDoNotOwn: '您不能发布他人的模型',\r\n YouMustSaveModelOnCloudBeforePublishingIt: '您必须先把此模型保存在云端才能发布它',\r\n },\r\n editSubMenu: '编辑',\r\n edit: {\r\n Undo: '撤销',\r\n Redo: '重做',\r\n },\r\n viewSubMenu: '视界',\r\n view: {\r\n NavigationView: '导航模式',\r\n TwoDimensionalView: '二维模式',\r\n ResetView: '重置视角',\r\n ZoomIn: '放大',\r\n ZoomOut: '缩小',\r\n AutoRotate: '自动旋转',\r\n ShowShadow: '显示阴影',\r\n ShowSurfaceShininess: '显示表面光泽',\r\n TranslucentFloatingWindows: '透明浮动窗口',\r\n accessoriesSubMenu: '配件',\r\n accessories: {\r\n SiteInformation: '位置信息',\r\n DesignInformation: '设计信息',\r\n Instruction: '操作说明',\r\n StickyNote: '便签',\r\n Note: '便签',\r\n },\r\n },\r\n settingsSubMenu: '设置',\r\n settings: {\r\n WeatherData: '气象数据',\r\n DiurnalTemperature: '昼夜温度',\r\n Heliodon: '日影仪',\r\n SunAndTime: '太阳和时间',\r\n },\r\n benchmarksSubMenu: '基准',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: '太阳能辐射模型预测和实际测量的对比',\r\n BESTESTCase600: '建筑物能耗模拟测试:BESTEST案例600',\r\n BESTESTCase610: '建筑物能耗模拟测试:BESTEST案例610',\r\n BESTESTCase620: '建筑物能耗模拟测试:BESTEST案例620',\r\n BESTESTCase630: '建筑物能耗模拟测试:BESTEST案例630',\r\n },\r\n graph: {\r\n LineWidth: '线条宽度',\r\n SymbolSize: '符号大小',\r\n BarCategoryGap: '直条间隙',\r\n ShowHorizontalGridLines: '显示格子的水平线条',\r\n ShowVerticalGridLines: '显示格子的竖直线条',\r\n },\r\n analysisSubMenu: '分析',\r\n physicsSubMenu: '物理',\r\n physics: {\r\n DailySolarRadiationHeatmap: '当日太阳辐射总量分布热图',\r\n SolarRadiationHeatmapOptions: '太阳辐射热图选项',\r\n SolarRadiationHeatmapGridCellSize: '太阳辐射热图网格的尺寸',\r\n SolarRadiationHeatmapMaxValue: '太阳辐射热图最大值',\r\n SolarRadiationHeatmapNoAnimation: '若无移动部件则省略动画',\r\n ReflectionHeatmap: '反射热图',\r\n },\r\n sensorSubMenu: '传感器',\r\n sensor: {\r\n CollectDailyData: '收集当天数据',\r\n CollectYearlyData: '收集全年数据',\r\n SensorSimulationNoAnimation: '若无移动部件则省略动画',\r\n },\r\n buildingSubMenu: '建筑物',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: '建筑物当天能耗分析',\r\n AnalyzeYearlyBuildingEnergy: '建筑物全年能耗分析',\r\n EnergyAnalysisOptions: '能耗分析选项',\r\n EnergyGridCellSize: '计算网格的尺寸',\r\n BuildingEnergySimulationNoAnimation: '若无移动部件则省略动画',\r\n },\r\n solarPanelSubMenu: '太阳能光伏板',\r\n solarPanel: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n AnalyzeVisibility: '分析可见度',\r\n PanelDiscretization: '光伏板离散化方法',\r\n Exact: '准确',\r\n Approximate: '近似',\r\n EnergyGridCellSize: '计算网格的尺寸',\r\n VisibilityGridCellSize: '视界因子计算网格的尺寸',\r\n EnergyAnalysisOptions: '能量分析选项',\r\n VisibilityAnalysisOptions: '可见度分析选项',\r\n SolarPanelSimulationNoAnimation: '若无移动部件则省略动画',\r\n },\r\n parabolicTroughSubMenu: '抛物线槽',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n },\r\n parabolicDishSubMenu: '抛物线碟',\r\n parabolicDish: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n },\r\n fresnelReflectorSubMenu: '菲涅尔反射镜',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n },\r\n heliostatSubMenu: '定日镜',\r\n heliostat: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n },\r\n solarUpdraftTowerSubMenu: '太阳能上升气流塔',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n SolarUpdraftTowerSimulationNoAnimation: '若无移动部件则省略动画',\r\n },\r\n\r\n tutorialsSubMenu: '教程',\r\n\r\n solarEnergyScienceSubMenu: '太阳能科学',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: '太阳相对于地面观察者的角度',\r\n InsolationAndClimate: '太阳辐射和气候的关系',\r\n SolarRadiationToBox: '一个长方体受到的太阳能辐射分析',\r\n },\r\n\r\n buildingScienceSubMenu: '建筑科学',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: '房屋的热学封套和围护封套',\r\n EffectOfSizeOnBuildingEnergy: '房屋大小对能耗的影响',\r\n EffectOfOrientationOnBuildingEnergy: '房屋方位对能耗的影响',\r\n EffectOfInsulationOnBuildingEnergy: '房屋隔热对能耗的影响',\r\n EffectOfRoofColorOnBuildingEnergy: '屋顶颜色对建筑物能耗的影响',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: '屋檐延伸长度对建筑物能耗的影响',\r\n EffectOfWindowSHGCOnBuildingEnergy: '窗户太阳能输入对房屋能耗的影响',\r\n EffectOfThermostatSetpointOnBuildingEnergy: '恒温器设定值对房屋能耗的影响',\r\n EffectOfSolarPanelsOnBuildingEnergy: '光伏板对房屋能耗的影响',\r\n EffectOfGroundTemperatureOnBuildingEnergy: '地表温度对房屋能耗的影响',\r\n EffectOfTreesOnBuildingEnergy: '树荫对房屋能耗的影响',\r\n },\r\n\r\n buildingDesignSubMenu: '建筑设计',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: '有棚顶窗的科德角风格的住宅',\r\n MansardRoofWithDormers: '有天窗的折线屋顶',\r\n GableRoofVsHipRoof: '双坡屋顶和四坡屋顶的对比',\r\n ColonialVsSaltbox: '殖民地风格和盐盒风格的对比',\r\n GambrelRoofVsMansardRoof: '复斜屋顶和折线屋顶的对比',\r\n CombinationRoofVsBonnetRoof: '组合屋顶和帽檐屋顶的对比',\r\n DutchGableRoof: '荷兰双坡屋顶',\r\n GableAndValleyRoof: '坡谷屋顶',\r\n ClerestoryRoof: '天窗屋顶',\r\n MonitorRoof: '采光屋顶',\r\n AFrameHouse: 'A字形房子',\r\n HalfTimberedHouse: '半木骨架房子',\r\n AllBasicRoofTypes: '所有的基本屋顶类型',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: '光伏发电',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: '光伏板倾斜角对发电量的影响',\r\n EffectOfAzimuthOfSolarPanel: '光伏板方位角对发电量的影响',\r\n SolarPanelTypes: '光伏板类型',\r\n VerticalBifacialSolarPanels: '竖直的双面光伏板',\r\n CompareMonofacialAndBifacialSolarPanels: '单面光伏板和双面光伏板的对比',\r\n SolarTrackers: '自动追日器',\r\n CoveringGroundWithSolarPanels: '为什么我们不简单地用光伏板覆盖地面',\r\n InterRowSpacingOfSolarPanelArray: '光伏板阵列行间距对发电量的影响',\r\n EffectOfOrientationOfSolarPanels: '光伏板排列方向对发电量的影响',\r\n SolarPanelArrayAutomaticLayout: '光伏板自动排列',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: '光热发电',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: '抛物线槽方位角对发电量的影响',\r\n EffectOfLatusRectumOfParabolicTrough: '抛物线槽通径对发电量的影响',\r\n FocusSunlightWithParabolicDish: '用抛物线碟聚焦陽光',\r\n LinearFresnelReflectors: '用直线式菲涅尔反射镜聚焦陽光',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors: '吸热管的安装高度对直线式菲涅尔反射镜发电量的影响',\r\n EffectOfAzimuthOfLinearFresnelReflectors: '直线式菲涅尔反射镜方位角对发电量的影响',\r\n LinearFresnelReflectorsWithTwoAbsorbers: '配备两个吸收管的直线式菲涅尔反射镜阵列',\r\n CosineEfficiencyOfHeliostats: '定日镜的余弦效率',\r\n ShadowingAndBlockingOfHeliostats: '定日镜的阴影和遮挡',\r\n EffectSolarPowerTowerHeight: '吸收塔高度对发电量的影响',\r\n SolarPowerTower: '塔式光热发电站',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: '其它类型的太阳能发电',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: '太阳能上升气流塔',\r\n },\r\n\r\n generativeDesignSubMenu: '生成式设计',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: '单面光伏板阵列的倾斜角',\r\n BifacialSolarPanelArrayTiltAngle: '双面光伏板阵列的倾斜角',\r\n OutputOfSolarPanelArrayInDifferentPlaces: '一个光伏板阵列在不同地区的产出',\r\n SimpleSolarFarmParetoFront: '简单太阳能农场设计的帕累托前沿',\r\n },\r\n\r\n examplesSubMenu: '例子',\r\n\r\n solarEnergySubMenu: '太阳能',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: '太阳光束和日影仪',\r\n RooftopSolarPanels: '屋顶光伏板',\r\n NevadaSolarOneParabolicTroughArray: '内华达州太阳能一号的抛物线槽阵列',\r\n TooeleParabolicDishArray: '犹他州图埃勒的抛物线碟阵列',\r\n PS10SolarPowerTower: '西班牙塞维利亚的PS10太阳能发电塔',\r\n TucsonLinearFresnelReflectors: '亚利桑那州图森的直线式菲涅尔反射镜阵列',\r\n SolarCanopyFormFactors: '太阳能天篷外形设计',\r\n SolarCanopyOverBleachers: '看台太阳能天篷',\r\n SolarCanopyOverGarage: '车库太阳能天篷',\r\n SolarBusStop: '太阳能候车亭',\r\n SolarFacadeTesla: '特斯拉光伏墙',\r\n BuildingIntegratedPhotovoltaics: '建筑整合光伏',\r\n Floatovoltaics: '浮动光伏',\r\n Agrivoltaics: '农业光伏',\r\n VegetativeBuffer: '太阳能农场绿化带',\r\n RainbowSwashSolarFarmBostonMA: '马萨诸塞州波士顿彩虹激流旁边的光伏板阵列',\r\n MickeyMouseSolarFarmOrlandoFL: '佛罗里达州奥兰多的米老鼠形状光伏板阵列',\r\n SolarPanelsOverCanalBakersfieldCA: '加利福尼亚州贝克斯菲尔德灌溉渠上假想的光伏板阵列',\r\n SolarNoiseBarrierLexingtonMA: '马萨诸塞州列克星敦高速公路噪音墙上假想的光伏板',\r\n HSATSolarTrackersRaleighNC: '北卡罗来纳州罗利的一个水平方向单轴旋转追日光伏板阵列(HSAT)',\r\n AADATSolarTrackersLancasterCA: '加利福尼亚州兰开斯特的一个双轴旋转追日光伏板阵列(AADAT)',\r\n SolarUpdraftTowerInCity: '太阳能上升气流塔在城市中的应用',\r\n },\r\n\r\n builtEnvironmentSubMenu: '建造环境',\r\n residentialBuildingsSubMenu: '住宅建筑',\r\n residentialBuildingExamples: {\r\n ColonialHouse: '殖民地风格的住宅',\r\n DutchColonialHouse: '荷兰殖民地风格的住宅',\r\n TShapedHouse: 'T字型房子',\r\n CapeCodHouseWithGarage: '有车库的科德角风格的住宅',\r\n Solarium: '有日光浴室的房子',\r\n Church1: '教堂例一',\r\n Cathedral1: '主教座堂例一',\r\n Cathedral2: '主教座堂例二',\r\n Mosque1: '清真寺例一',\r\n AdobeTaosHouse: '陶斯土坯房',\r\n RanchHouse: '牧场风格的住宅',\r\n BonnetHouse: '有帽檐屋顶的住宅',\r\n BarnStyleHouse: '谷仓式风格的住宅',\r\n ModernHouse: '现代风格的住宅',\r\n ButterflyRoofHouse: '蝴蝶型屋顶的住宅',\r\n },\r\n commercialBuildingsSubMenu: '商用建筑',\r\n commercialBuildingExamples: {\r\n WhiteHouse: '白宫',\r\n BilimMersinTurkiye: '土耳其梅尔辛科学教育中心',\r\n SpanishStyleHotel: '西班牙风格旅馆',\r\n ApartmentBuilding: '公寓楼',\r\n OfficeBuilding: '办公楼',\r\n Hotel: '旅馆',\r\n },\r\n buildingComplexesSubMenu: '建筑群',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: '佛蒙特州南伯灵顿高中',\r\n MescaleroApacheSchoolNewMexico: '新墨西哥州梅斯卡勒罗阿帕奇学校',\r\n },\r\n urbanPlanningSubMenu: '城市规划',\r\n urbanPlanningExamples: {\r\n Heatmap1: '热图例一',\r\n },\r\n otherBuildingsSubMenu: '其它建筑',\r\n otherBuildingExamples: {\r\n Greenhouse: '温室',\r\n Pavilion: '公园的亭子',\r\n OctagonalPagoda: '八角塔',\r\n OceanFront: '海边',\r\n EgyptianPyramids: '埃及金字塔',\r\n MayanPyramid: '玛雅金字塔',\r\n SiOSePol: '三十三孔桥',\r\n StackedCuboids: '堆砌长方体',\r\n },\r\n\r\n artificialIntelligenceSubMenu: '人工智能',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: '优化单排光伏板的倾斜角',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: '优化多排光伏板的倾斜角',\r\n SolarFarmGenerativeDesign: '生成式设计太阳能农场',\r\n SolarFarmGenerativeDesignWithBlock: '生成式设计太阳能农场:周边有建筑物的情况',\r\n FitchburgSolarFarmGenerativeDesign: '生成式设计太阳能农场:真实世界案例',\r\n },\r\n\r\n languageSubMenu: '语言',\r\n publicSubMenu: '公共',\r\n ModelsGallery: '模型画廊',\r\n ModelsMap: '模型地图',\r\n AboutUs: '关于我们',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: '账号设定',\r\n PrivacyStatementTitle: '用户隐私保护声明',\r\n PrivacyStatement:\r\n '登录需要采用您的谷歌ID建立或进入您的阿拉丁账户。 我们只储存一个随机的字符串作为您的ID。 任何关于您的可辨识的个人信息都没有被收集。 详情请参考我们的',\r\n SignIn: '登录',\r\n SignOut: '退出账号',\r\n IfYouAreAStudent: '如果您是一个学生',\r\n },\r\n\r\n skyMenu: {\r\n Axes: '显示坐标轴',\r\n Theme: '环境主题',\r\n ThemeDefault: '默认',\r\n ThemeDesert: '沙漠',\r\n ThemeDune: '沙丘',\r\n ThemeForest: '森林',\r\n ThemeGrassland: '草原',\r\n ThemeHill: '丘陵',\r\n ThemeLake: '湖泊',\r\n ThemeMountain: '山脉',\r\n ThemeRural: '田园',\r\n SunlightAttenuationCoefficientInAir: '阳光在空气中传播的衰减系数',\r\n ConvectiveCoefficientOfAir: '空气对流传热系数',\r\n HighestTemperatureTimeInMinutes: '最高气温时间(分钟)',\r\n SelectSunAnglesToShow: '选择太阳角度显示',\r\n ShowAzimuthAngle: '显示方位角',\r\n ShowElevationAngle: '显示高度角',\r\n ShowZenithAngle: '显示天顶角',\r\n DirectLightBrightnessAtNoon: '正午直射光照度',\r\n AmbientLightBrightnessAtNoon: '正午环境光照度',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: '月份辐射度损失比',\r\n Vegetation: '植被',\r\n LeafOutDay: '树叶长出的日子',\r\n LeafOffDay: '树叶脱落的日子',\r\n Albedo: '反照率',\r\n ImageOnGround: '地面显示图像',\r\n WaterSurface: '水面',\r\n RemoveAllUnlockedTrees: '删除所有非固定的树木',\r\n RemoveAllUnlockedFlowers: '删除所有非固定的花草',\r\n RemoveAllUnlockedSolarPanels: '删除所有非固定的光伏板',\r\n RemoveAllUnlockedPeople: '删除所有非固定的人物',\r\n RemoveAllUnlockedFoundations: '删除所有非固定的地基',\r\n RemoveAllUnlockedCuboids: '删除所有非固定的长方体',\r\n DoYouReallyWantToRemoveAllPeople: '你确定删除所有非固定的人物吗',\r\n DoYouReallyWantToRemoveAllTrees: '你确定删除所有非固定的树木吗',\r\n DoYouReallyWantToRemoveAllFlowers: '你确定删除所有非固定的花草吗',\r\n DoYouReallyWantToRemoveAllSolarPanels: '你确定删除所有非固定的光伏板吗',\r\n DoYouReallyWantToRemoveAllFoundations: '你确定删除所有非固定的地基吗',\r\n DoYouReallyWantToRemoveAllCuboids: '你确定删除所有非固定的长方体吗',\r\n LockAllElements: '固定所有的部件',\r\n UnlockAllElements: '解除所有的固定',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: '标签',\r\n LabelText: '标签的内容',\r\n LabelHeight: '标签的高度',\r\n LabelSize: '标签的大小',\r\n LabelFontSize: '字体的大小',\r\n LabelColor: '标签的颜色',\r\n KeepShowingLabel: '显示标签',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: '删除此地基上所有非固定的光伏板',\r\n RemoveAllUnlockedParabolicTroughs: '删除此地基上所有非固定的抛物线槽',\r\n RemoveAllUnlockedParabolicDishes: '删除此地基上所有非固定的抛物线碟',\r\n RemoveAllUnlockedFresnelReflectors: '删除此地基上所有非固定的菲涅耳反射镜',\r\n RemoveAllUnlockedHeliostats: '删除此地基上所有非固定的定日镜',\r\n RemoveAllUnlockedSensors: '删除此地基上所有非固定的传感器',\r\n RemoveAllUnlockedLights: '删除此地基上所有非固定的电灯',\r\n RemoveAllUnlockedWalls: '删除此地基上所有非固定的墙',\r\n RemoveAllUnlockedWindows: '删除此地基上所有非固定的窗户',\r\n RemoveAllUnlockedDoors: '删除此地基上所有非固定的门',\r\n RemoveAllUnlockedPolygons: '删除此地基上所有非固定的多边形',\r\n RemoveAllUnlockedHumans: '删除此地基上所有非固定的人物',\r\n RemoveAllUnlockedTrees: '删除此地基上所有非固定的树木',\r\n RemoveAllUnlockedFlowers: '删除此地基上所有非固定的花草',\r\n Racks: '支架',\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n SolarPanels: '光伏板',\r\n SolarPanelArray: '光伏板阵列',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation: '你确定删除此地基上所有非固定的光伏板吗',\r\n ParabolicTroughs: '抛物线槽',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation: '你确定删除此地基上所有非固定的抛物线槽吗',\r\n ParabolicDishes: '抛物线碟',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation: '你确定删除此地基上所有非固定的抛物线碟吗',\r\n FresnelReflectors: '菲涅耳反射镜',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation: '你确定删除此地基上所有非固定的菲涅耳反射镜吗',\r\n Heliostats: '定日镜',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation: '你确定删除此地基上所有非固定的定日镜吗',\r\n Sensors: '传感器',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation: '你确定删除此地基上所有非固定的传感器吗',\r\n Lights: '电灯',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation: '你确定删除此地基上所有非固定的电灯吗',\r\n Walls: '墙',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation: '你确定删除此地基上所有非固定的墙吗',\r\n Windows: '窗户',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation: '你确定删除此地基上所有非固定的窗户吗',\r\n Doors: '门',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation: '你确定删除此地基上所有非固定的门吗',\r\n Polygons: '多边形',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation: '你确定删除此地基上所有非固定的多边形吗',\r\n Humans: '人物',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation: '你确定删除此地基上所有非固定的人物吗',\r\n Trees: '树木',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation: '你确定删除此地基上所有非固定的树木吗',\r\n Flowers: '花草',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation: '你确定删除此地基上所有非固定的花草吗',\r\n OnlyThisFoundation: '只这块地基',\r\n AllSelectedFoundations: '所有选中的地基',\r\n AllConnectedFoundations: '所有相连的地基',\r\n AllFoundations: '所有的地基',\r\n AddPolygon: '添加多边形',\r\n SolarStructure: '太阳能构型',\r\n GroupMaster: '主地基',\r\n LockAllElementsOnThisFoundation: '固定此地基上所有的部件',\r\n UnlockAllElementsOnThisFoundation: '解除此地基上所有的固定',\r\n GroundFloorRValue: '建筑物地板的R值',\r\n OnlyThisGroundFloor: '只这个建筑物的地板',\r\n AllGroundFloors: '所有建筑物的地板',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: '和定日镜配套的吸收塔',\r\n ReceiverTowerPhysicalProperties: '太阳能吸收塔的物理性质',\r\n ReceiverTowerHeight: '太阳能吸收塔的高度',\r\n ReceiverTowerRadius: '太阳能吸收塔的半径',\r\n ReceiverAbsorptance: '太阳能吸收器的吸收率',\r\n ReceiverOpticalEfficiency: '太阳能吸收器的光效率',\r\n ReceiverThermalEfficiency: '太阳能吸收器的热效率',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: '和菲涅尔反射镜配套的吸收管',\r\n AbsorberPipePhysicalProperties: '太阳能吸收管的物理性质',\r\n AbsorberHeight: '太阳能吸收管的安装高度',\r\n AbsorberApertureWidth: '太阳能吸收管的孔径',\r\n AbsorberPipePoleNumber: '太阳能吸收管的支柱数量',\r\n AbsorberAbsorptance: '太阳能吸收管的吸收率',\r\n AbsorberOpticalEfficiency: '太阳能吸收管的光效率',\r\n AbsorberThermalEfficiency: '太阳能吸收管的热效率',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: '太阳能上升气流塔',\r\n SolarUpdraftTowerPhysicalProperties: '太阳能上升气流塔的物理性质',\r\n SolarUpdraftTowerChimneyHeight: '太阳能上升气流塔烟囱的高度',\r\n SolarUpdraftTowerChimneyRadius: '太阳能上升气流塔烟囱的半径',\r\n SolarUpdraftTowerCollectorHeight: '太阳能上升气流塔集热棚的高度',\r\n SolarUpdraftTowerCollectorRadius: '太阳能上升气流塔集热棚的半径',\r\n SolarUpdraftTowerCollectorTransmissivity: '太阳能上升气流塔集热棚的透射率',\r\n SolarUpdraftTowerCollectorEmissivity: '太阳能上升气流塔集热棚的发射率',\r\n SolarUpdraftTowerDischargeCoefficient: '太阳能上升气流塔的流量系数',\r\n SolarUpdraftTowerTurbineEfficiency: '太阳能上升气流塔的涡轮机效率',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n RemoveAllUnlockedSolarPanels: '删除此长方体表面上所有非固定的光伏板',\r\n RemoveAllUnlockedSensors: '删除此长方体表面上所有非固定的传感器',\r\n RemoveAllUnlockedPolygons: '删除此长方体表面上所有非固定的多边形',\r\n RemoveAllUnlockedHumans: '删除此长方体表面上所有非固定的人物',\r\n RemoveAllUnlockedTrees: '删除此长方体表面上所有非固定的树木',\r\n RemoveAllUnlockedFlowers: '删除此长方体表面上所有非固定的花草',\r\n Racks: '支架',\r\n SolarPanels: '光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid: '你确定删除此长方体表面上所有非固定的光伏板吗',\r\n Sensors: '传感器',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid: '你确定删除此长方体表面上所有非固定的传感器吗',\r\n Polygons: '多边形',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid: '你确定删除此长方体表面上所有非固定的多边形吗',\r\n Humans: '人物',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid: '你确定删除此长方体表面上所有非固定的人物吗',\r\n Trees: '树木',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid: '你确定删除此长方体表面上所有非固定的树木吗',\r\n Flowers: '花草',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid: '你确定删除此长方体表面上所有非固定的花草吗',\r\n OnlyThisCuboid: '只这个长方体',\r\n AllCuboidsOnSameSurface: '同一表面上所有的长方体',\r\n AllCuboidsAboveSameBase: '同一地基上所有的长方体',\r\n AllSelectedCuboids: '所有选中的长方体',\r\n AllCuboids: '所有的长方体',\r\n OnlyThisSide: '只这个表面',\r\n AllSidesOfThisCuboid: '这个长方体所有的侧面',\r\n AllSidesOfSelectedCuboids: '所有选中长方体所有的侧面',\r\n AllSidesOfAllCuboids: '所有的长方体所有的侧面',\r\n AddPolygon: '添加多边形',\r\n Stackable: '可堆砌',\r\n GroupMaster: '主长方体',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n TextBox: '文字框',\r\n FontOutlineColor: '字体轮廓颜色',\r\n FontOutlineWidth: '字体轮廓线宽',\r\n FontStrokeColor: '字体描边颜色',\r\n FontStrokeWidth: '字体描边线宽',\r\n NoOutline: '无轮廓线',\r\n Shiny: '光泽',\r\n Filled: '填充',\r\n FillTexture: '填充材质',\r\n FillColor: '填充颜色',\r\n Opacity: '遮光度',\r\n LineColor: '线条颜色',\r\n LineWidth: '线条宽度',\r\n LineStyle: '线条样式',\r\n SolidLine: '实线',\r\n DashedLine: '虚线',\r\n DottedLine: '点线',\r\n InsertVertexBeforeIndex: '前面插入顶点',\r\n InsertVertexAfterIndex: '后面插入顶点',\r\n DeleteVertex: '移除顶点',\r\n OnlyThisPolygon: '只这个多边形',\r\n AllPolygonsOnSurface: '同一表面上所有的多边形',\r\n AllPolygonsAboveFoundation: '同一地基上所有的多边形',\r\n AllSelectedPolygons: '所有选中的多边形',\r\n AllPolygons: '所有的多边形',\r\n Layout: '布局',\r\n SolarPanelArrayLayout: '光伏板阵列布局',\r\n SolarPanelArrayLayoutParametricDesign: '光伏板阵列布局参数化设计',\r\n SolarPanelArrayLayoutGenerativeDesign: '光伏板阵列布局生成式设计',\r\n SolarPanelArrayModel: '光伏板型号',\r\n SolarPanelArrayOrientation: '排列方向',\r\n SolarPanelArrayTiltAngle: '倾斜角度',\r\n SolarPanelArrayRowWidth: '行宽度',\r\n SolarPanelArrayInterRowSpacing: '行间距',\r\n SolarPanelArrayRowSpacing: '行间距',\r\n SolarPanelArrayRowAxis: '行轴方向',\r\n SolarPanelArrayLeftRightRowAxis: '左右方向(相对)',\r\n SolarPanelArrayUpDownRowAxis: '上下方向(相对)',\r\n SolarPanelArrayEastWestRowAxis: '东西方向(绝对)',\r\n SolarPanelArrayNorthSouthRowAxis: '南北方向(绝对)',\r\n SolarPanelArrayMargin: '边缘余地',\r\n SolarPanelArrayPoleHeight: '支架高度',\r\n SolarPanelArrayPoleSpacing: '支柱间隔',\r\n SolarPanelArrayTotalYearlyCost: '全年总成本',\r\n SolarPanelArrayTotalYearlyRevenue: '全年总收入',\r\n SolarPanelArrayTotalYearlyYield: '全年总发电量',\r\n SolarPanelArrayMeanYearlyYield: '平均年发电量',\r\n SolarPanelArrayYearlyProfit: '全年利润',\r\n LayoutNotAcceptedCheckYourParameters: '恕不能采用此布局。请检查您的参数设置。',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: '优化',\r\n Parameters: '参数',\r\n Variables: '变量',\r\n Constants: '常量',\r\n GeneticAlgorithm: '遗传算法',\r\n GeneticAlgorithmSettings: '遗传算法设定',\r\n ParticleSwarmOptimization: '粒子群优化',\r\n ParticleSwarmOptimizationSettings: '粒子群优化设定',\r\n SolarPanelTiltAngleOptimization: '光伏板倾斜角度优化',\r\n SolarPanelArrayLayout: '光伏板阵列布局',\r\n Generation: '世代',\r\n Gene: '基因',\r\n NormalizedVariables: '标准化变量',\r\n Objective: '目标函数',\r\n ObjectiveFunctionDailyTotalYield: '当日总产出',\r\n ObjectiveFunctionYearlyTotalYield: '全年总产出',\r\n ObjectiveFunctionDailyMeanYield: '当日平均产出',\r\n ObjectiveFunctionYearlyMeanYield: '全年平均产出',\r\n ObjectiveFunctionDailyProfit: '当日利润',\r\n ObjectiveFunctionYearlyProfit: '全年利润',\r\n GeneticAlgorithmSelectionMethod: '遗传算法选择方法',\r\n RouletteWheel: '轮盘制',\r\n Tournament: '淘汰制',\r\n SearchMethod: '搜索方法',\r\n GlobalSearchUniformSelection: '全局搜索均匀取样',\r\n LocalSearchRandomOptimization: '局部搜索随机优化',\r\n PopulationSize: '种群个体数目',\r\n MaximumGenerations: '最大世代数目',\r\n SelectionRate: '选择概率',\r\n CrossoverRate: '交配概率',\r\n MutationRate: '突变概率',\r\n Step: '步数',\r\n SwarmSize: '粒子数目',\r\n MaximumSteps: '最大步数',\r\n MaximumVelocity: '最大速度',\r\n InertiaWeight: '惯性权重',\r\n CognitiveCoefficient: '认知系数',\r\n SocialCoefficient: '社会系数',\r\n ConvergenceThreshold: '终止条件的收敛阈值',\r\n LocalSearchRadius: '局部搜索的半径',\r\n RowsPerRackRange: '单个支架上光伏板行数的变化范围',\r\n TiltAngleRange: '光伏板倾斜角度的变化范围',\r\n InterRowSpacingRange: '光伏板阵列行间距的变化范围',\r\n ClickTargetPolygonToActivate: '点击目标多边形激活',\r\n ClickTargetFoundationToActivate: '点击目标地基激活',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: '显示近似模型',\r\n Flip: '翻转',\r\n Type: '树种',\r\n Spread: '树冠直径',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: '翻转',\r\n Type: '品种',\r\n Spread: '直径',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: '改变人物',\r\n Flip: '转身',\r\n Observer: '观察者',\r\n ViewFromThisPerson: '视角移到此人位置',\r\n },\r\n\r\n lightMenu: {\r\n Color: '颜色',\r\n Intensity: '亮度',\r\n Decay: '衰减',\r\n MaximumDistance: '最大距离',\r\n Inside: '内部',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: '相对方位角',\r\n Pole: '支柱',\r\n PoleHeight: '支柱高度',\r\n PoleRadius: '支柱半径',\r\n ExtraPoleHeight: '额外的支柱高度',\r\n ExtraPoleHeightInAdditionToHalfWidth: '宽度一半额外的支柱高度',\r\n DrawSunBeam: '显示光束',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: '反射器镜面反射率',\r\n ReceiverAbsorptance: '接收器吸收率',\r\n ReflectorOpticalEfficiency: '反射器光效率',\r\n ReceiverThermalEfficiency: '接收器热效率',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: '逆变器效率',\r\n InverterEfficiencyExplained: '直流电转换为交流电的效率。',\r\n DcToAcSizeRatio: '直流-交流容量比例',\r\n DcToAcSizeRatioExplained: '直流电容量和交流电容量的比例。',\r\n ChangePvModel: '改变光伏板型号',\r\n Orientation: '排列方向',\r\n Portrait: '纵向',\r\n Landscape: '橫向',\r\n FrameColor: '框架颜色',\r\n Panels: '块',\r\n PanelsWide: '块光伏板宽',\r\n PanelsLong: '块光伏板长',\r\n TiltAngle: '倾斜角度',\r\n SouthFacingIsPositive: '朝南为正',\r\n Tracker: '追日系统',\r\n SolarTrackerFollowsSun: '追日系统提高光伏板产出。',\r\n PoleSpacing: '支柱间隔',\r\n NoTracker: '无追日系统',\r\n HorizontalSingleAxisTracker: '水平单轴追日系统',\r\n VerticalSingleAxisTracker: '竖直单轴追日系统',\r\n AltazimuthDualAxisTracker: '地平双轴追日系统',\r\n OnlyThisSolarPanel: '只这个光伏板',\r\n AllSolarPanelsOnSurface: '同一表面上所有的光伏板',\r\n AllSolarPanelsAboveFoundation: '同一地基上所有的光伏板',\r\n AllSelectedSolarPanels: '所有选中的光伏板',\r\n AllSolarPanels: '所有的光伏板',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: '光伏板型号性能',\r\n Model: '型号',\r\n PanelSize: '尺寸',\r\n Cells: '电池組',\r\n CellType: '光伏电池类型',\r\n Monocrystalline: '单晶硅',\r\n Polycrystalline: '多晶硅',\r\n ThinFilm: '薄膜',\r\n Bifacial: '双面',\r\n BifacialityFactor: '双面性因子',\r\n Black: '黑色',\r\n Blue: '蓝色',\r\n ShadeTolerance: '阴影耐受度',\r\n SolarCellEfficiency: '光伏电池效率',\r\n NominalOperatingCellTemperature: '名义电池运行温度',\r\n TemperatureCoefficientOfPmax: 'Pmax温度系数',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: '模块长度',\r\n Modules: '模块',\r\n ModulesLong: '模块长',\r\n LatusRectum: '通径',\r\n OnlyThisParabolicTrough: '只这个抛物线槽',\r\n AllParabolicTroughsAboveFoundation: '同一地基上所有的抛物线槽',\r\n AllSelectedParabolicTroughs: '所有选中的抛物线槽',\r\n AllParabolicTroughs: '所有的抛物线槽',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: '吸收管',\r\n SelectAbsorberToReflectSunlightTo: '选择阳光反射到的吸收管',\r\n ModuleLength: '模块长度',\r\n Modules: '模块',\r\n ModulesLong: '模块长',\r\n OnlyThisFresnelReflector: '只这个菲涅耳反射镜',\r\n AllFresnelReflectorsAboveFoundation: '同一地基上所有的菲涅耳反射镜',\r\n AllSelectedFresnelReflectors: '所有选中的菲涅耳反射镜',\r\n AllFresnelReflectors: '所有的菲涅耳反射镜',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: '吸收塔',\r\n SelectTowerToReflectSunlightTo: '选择阳光反射到的吸收塔',\r\n OnlyThisHeliostat: '只这个定日镜',\r\n AllHeliostatsAboveFoundation: '同一地基上所有的定日镜',\r\n AllSelectedHeliostats: '所有选中的定日镜',\r\n AllHeliostats: '所有的定日镜',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: '接收器结构',\r\n CentralPole: '中心直柱',\r\n CentralPoleWithTripod: '三脚架和中心直柱',\r\n Quadrupod: '四脚架',\r\n RimDiameter: '外圈直径',\r\n LatusRectum: '通径',\r\n ExtraPoleHeightInAdditionToRadius: '半径之外额外的支架高度',\r\n OnlyThisParabolicDish: '只这个抛物线碟',\r\n AllParabolicDishesAboveFoundation: '同一地基上所有的抛物线碟',\r\n AllSelectedParabolicDishes: '所有选中的抛物线碟',\r\n AllParabolicDishes: '所有的抛物线碟',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: '默认材质',\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n SizeOfWall: '墙的尺寸',\r\n OnlyThisWall: '只这堵墙',\r\n AllConnectedWalls: '所有连接的墙',\r\n AllWallsAboveFoundation: '同一地基上所有的墙',\r\n AllSelectedWalls: '所有选中的墙',\r\n AllWalls: '所有的墙',\r\n Windows: '窗户',\r\n LockAllWindows: '固定所有的窗户',\r\n UnlockAllWindows: '解除所有的窗户固定',\r\n RemoveAllUnlockedWindows: '删除这堵墙上所有非固定的窗户',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: '你确定删除这堵墙上所有非固定的窗户吗',\r\n Doors: '门',\r\n RemoveAllUnlockedDoors: '删除这堵墙上所有非固定的门',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: '你确定删除这堵墙上所有非固定的门吗',\r\n SolarPanels: '光伏板',\r\n LockAllSolarPanels: '固定所有的光伏板',\r\n UnlockAllSolarPanels: '解除所有的光伏板固定',\r\n RemoveAllUnlockedSolarPanels: '删除这堵墙上所有非固定的光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: '你确定删除这堵墙上所有非固定的光伏板吗',\r\n Sensors: '传感器',\r\n LockAllSensors: '固定所有的传感器',\r\n UnlockAllSensors: '解除所有的传感器固定',\r\n RemoveAllUnlockedSensors: '删除这堵墙上所有非固定的传感器',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: '你确定删除这堵墙上所有非固定的传感器吗',\r\n Lights: '电灯',\r\n RemoveAllUnlockedLights: '删除这堵墙上所有非固定的电灯',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: '你确定删除这堵墙上所有非固定的电灯吗',\r\n LockAllPolygons: '固定这堵墙上所有的多边形',\r\n UnlockAllPolygons: '解除这堵墙上所有的多边形固定',\r\n RemoveAllUnlockedPolygons: '删除这堵墙上所有非固定的多边形',\r\n WallStructure: '墙结构',\r\n DefaultStructure: '默认',\r\n StudStructure: '墙柱',\r\n PillarStructure: '圆柱',\r\n Opacity: '遮光度',\r\n StructureSpacing: '结构间距',\r\n StructureWidth: '结构宽度',\r\n StructureThickness: '结构厚度',\r\n StructureColor: '结构颜色',\r\n Color: '牆体颜色',\r\n Height: '高度',\r\n Thickness: '厚度',\r\n Texture: '材质',\r\n AllLightsOnWallInside: '所有电灯在牆内',\r\n AllLightsOnWallOutside: '所有电灯在牆外',\r\n Fill: '填充',\r\n Full: '全部',\r\n Partial: '部分',\r\n Empty: '空白',\r\n OpenToOutside: '对外面开放',\r\n EavesLength: '屋檐延伸长度',\r\n Parapet: '女墙',\r\n ParapetColor: '女墙颜色',\r\n ParapetTexture: '女墙材质',\r\n ParapetHeight: '女墙高度',\r\n CopingsHeight: '顶盖高度',\r\n CopingsWidth: '顶盖宽度',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: '只这个窗户',\r\n AllWindowsOnSurface: '同一表面上所有的窗户',\r\n AllWindowsAboveFoundation: '同一地基上所有的窗户',\r\n AllSelectedWindows: '所有选中的窗户',\r\n AllWindows: '所有的窗户',\r\n Width: '宽度',\r\n Height: '高度',\r\n Setback: '离墙体外表面的距离',\r\n RelativeToWallThickness: '相对于墙的厚度',\r\n Mullion: '直棂',\r\n HorizontalMullion: '水平的直棂',\r\n VerticalMullion: '竖直的直棂',\r\n MullionWidth: '直棂宽度',\r\n HorizontalMullionSpacing: '水平直棂的间距',\r\n VerticalMullionSpacing: '竖直直棂的间距',\r\n MullionColor: '直棂颜色',\r\n Tint: '着色',\r\n Opacity: '不透明度',\r\n SolarHeatGainCoefficient: '太阳辐射热获取系数(SHGC) = 1 - 不透明度',\r\n Shutter: '百叶窗',\r\n LeftShutter: '左侧百叶窗',\r\n RightShutter: '右侧百叶窗',\r\n BothShutters: '两侧百叶窗',\r\n ShutterWidth: '相对宽度',\r\n ShutterColor: '百叶窗颜色',\r\n Frame: '边框',\r\n FrameWidth: '边框宽度',\r\n SillWidth: '窗台宽度',\r\n Color: '边框颜色',\r\n WindowType: '窗户种类',\r\n Default: '默认',\r\n Arched: '拱形',\r\n Polygonal: '多边形',\r\n Interior: '内窗',\r\n Empty: '空白',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: '默认材质',\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n OnlyThisRoof: '只这个屋顶',\r\n AllRoofsAboveFoundation: '同一地基上所有的屋顶',\r\n AllSelectedRoofs: '所有选中的屋顶',\r\n AllRoofs: '所有的屋顶',\r\n OnlyThisCeiling: '只这个天花板',\r\n AllCeilingsAboveFoundation: '同一地基上所有的天花板',\r\n AllCeilings: '所有的天花板',\r\n EavesOverhangLength: '屋檐延伸长度',\r\n RafterSpacing: '屋椽间距',\r\n RafterWidth: '屋椽宽度',\r\n RafterThickness: '屋椽厚度',\r\n RafterColor: '屋椽颜色',\r\n RoofColor: '屋顶颜色',\r\n RoofSideColor: '屋顶侧面颜色',\r\n GlassTint: '玻璃颜色',\r\n Opacity: '遮光度',\r\n RoofStructure: '屋顶结构',\r\n DefaultStructure: '默认',\r\n RafterStructure: '屋椽',\r\n GlassStructure: '玻璃',\r\n SolarPanels: '光伏板',\r\n LockAllSolarPanels: '固定所有的光伏板',\r\n UnlockAllSolarPanels: '解除所有的光伏板固定',\r\n RemoveAllUnlockedSolarPanels: '删除这个屋顶上所有非固定的光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: '你确定删除这个屋顶上所有非固定的光伏板吗',\r\n Windows: '天窗',\r\n LockAllWindows: '固定所有的天窗',\r\n UnlockAllWindows: '解除所有的天窗固定',\r\n RemoveAllUnlockedWindows: '删除这个屋顶上所有非固定的天窗',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: '你确定删除这个屋顶上所有非固定的天窗吗',\r\n Sensors: '传感器',\r\n LockAllSensors: '固定所有的传感器',\r\n UnlockAllSensors: '解除所有的传感器固定',\r\n RemoveAllUnlockedSensors: '删除这个屋顶上所有非固定的传感器',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: '你确定删除这个屋顶上所有非固定的传感器吗',\r\n Lights: '电灯',\r\n RemoveAllUnlockedLights: '删除这个屋顶上所有非固定的电灯',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: '你确定删除这个屋顶上所有非固定的电灯吗',\r\n AllLightsOnRoofInside: '所有电灯在屋顶内',\r\n AllLightsOnRoofOutside: '所有电灯在屋顶外',\r\n Rise: '相对高度',\r\n Ceiling: '天花板',\r\n RoofRValue: '屋顶R值',\r\n CeilingRValue: '天花板R值',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: '默认材质',\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n Texture11: '十一号材质',\r\n Texture12: '十二号材质',\r\n Texture13: '十三号材质',\r\n Texture14: '十四号材质',\r\n Texture15: '十五号材质',\r\n Texture16: '十六号材质',\r\n Texture17: '十七号材质',\r\n OnlyThisDoor: '只这个门',\r\n AllDoorsOnWall: '同一面墙上所有的门',\r\n AllDoorsAboveFoundation: '同一地基上所有的门',\r\n AllSelectedDoors: '所有选中的门',\r\n AllDoors: '所有的门',\r\n DoorType: '门种类',\r\n Default: '默认',\r\n Arched: '拱形',\r\n Filled: '填充',\r\n FrameColor: '门框颜色',\r\n Interior: '内门',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: '最高温度',\r\n Low: '最低温度',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: '选中的定日镜总数',\r\n NumberOfSelectedSolarPanels: '选中的光伏板总数',\r\n ElectricityGeneratedDailyBySolarPanels: '这些光伏板的日发电量',\r\n SceneDiameter: '场景直径',\r\n BuildingArea: '建筑面积',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: '热图颜色对比度',\r\n FluxScale: '热通量长度',\r\n ClickUpOrDownArrowButtonsToChange: '点击上下箭头改变参数',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: '旋转',\r\n DragMouse: '拖动鼠标',\r\n Zoom: '缩放',\r\n MouseWheelOrKeys: '鼠标滚轮或者Ctrl+[和Ctrl+]',\r\n MouseWheelOrKeysMac: '鼠标滚轮或者⌘+[和⌘+]',\r\n Pan: '平移',\r\n HoldCtrlDragMouse: '按下Ctrl键并拖动鼠标',\r\n HoldMetaDragMouse: '按下⌘键并拖动鼠标',\r\n Enter2DMode: '進入二维模式',\r\n Exit2DMode: '退出二维模式',\r\n NavigationMode: '导航模式',\r\n EnableNavigation: '進入导航模式',\r\n DisableNavigation: '退出导航模式',\r\n MoveForwardBack: '前后移动',\r\n MoveForwardBackInstruction: '按W/S键',\r\n MoveLeftRight: '左右移动',\r\n MoveLeftRightInstruction: '按A/D键',\r\n MoveUpDown: '上下移动',\r\n MoveUpDownInstruction: '按Z/X键',\r\n Turn: '拐弯',\r\n TurnInstruction: '按方向键',\r\n ResetView: '重置视角',\r\n AutoRotate: '自动旋转',\r\n StartOrStop: '按F4键启动或停止',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: '地面显示图像',\r\n WeatherStations: '气象站',\r\n WeatherStationsNote: '关闭此选项以提高地图速度',\r\n Coordinates: '经纬度坐标',\r\n Zoom: '放大程度',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: '光伏板对观察者的可见度',\r\n Observer: '观察者',\r\n VantagePoint: '观察位置',\r\n ItemizedVisibilityByFields: '每个场的可见度',\r\n TotalVisibility: '总可见度',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: '光传感器',\r\n WeatherDataFrom: '气象数据来自',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: '建筑物日能耗',\r\n YearlyBuildingEnergy: '建筑物年能耗',\r\n Heater: '暖气',\r\n AC: '空调',\r\n SolarPanel: '光伏',\r\n Net: '净能耗',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: '光伏日发电量',\r\n SolarPanelYearlyYield: '光伏年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualSolarPanels: '显示每行光伏板单独发电量',\r\n Profit: '利润',\r\n TotalCost: '总成本',\r\n TotalRevenue: '总收入',\r\n TotalYield: '总发电量',\r\n MeanYield: '平均发电量',\r\n ModuleCount: '光伏板总数',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: '抛物线槽日发电量',\r\n ParabolicTroughYearlyYield: '抛物线槽年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualParabolicTroughs: '显示每行抛物线槽单独发电量',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: '抛物线碟日发电量',\r\n ParabolicDishYearlyYield: '抛物线碟年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualParabolicDishes: '显示每个抛物线碟单独发电量',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: '菲涅耳反射镜日发电量',\r\n FresnelReflectorYearlyYield: '菲涅耳反射镜年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualFresnelReflectors: '显示每个菲涅耳反射镜单独发电量',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: '定日镜日发电量',\r\n HeliostatYearlyYield: '定日镜年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualHeliostats: '显示每个定日镜单独发电量',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: '太阳能上升气流塔日发电量',\r\n UpdraftTowerYearlyYield: '太阳能上升气流塔年发电量',\r\n ChimneyAirTemperature: '烟囱空气温度',\r\n ChimneyWindSpeed: '烟囱风速',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualUpdraftTowers: '显示每个太阳能上升气流塔单独发电量',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: '太阳和时间设置',\r\n SunAngles: '角度',\r\n TwentyFourHours: '24小时',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: '拷贝标题',\r\n TitleCopiedToClipBoard: '标题拷贝到剪贴板',\r\n SearchByTitle: '按标题搜索',\r\n MyLikes: '我喜欢的模型',\r\n MyCloudFiles: '我的云文件',\r\n GenerateLink: '生成链接',\r\n LinkGeneratedInClipBoard: '链接生成到剪贴板',\r\n DoYouReallyWantToDelete: '您确定删除此文件',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks: '如果此文件已被分享或发布, 改名会使已有链接失效',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: '拷贝标题',\r\n TitleCopiedToClipBoard: '标题拷贝到剪贴板',\r\n SearchByTitle: '按标题搜索',\r\n MyProjects: '我的项目',\r\n GenerateProjectLink: '生成项目链接',\r\n ProjectLinkGeneratedInClipBoard: '项目链接生成到剪贴板',\r\n DoYouReallyWantToDeleteProject: '您确定删除项目',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks: '如果此项目已被分享或发布, 改名会使已有链接失效',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: '项目设定',\r\n ThumbnailImageSize: '缩略图大小',\r\n ProjectByOtherPeople: '别人的项目',\r\n Project: '项目',\r\n ProjectType: '类别',\r\n ProjectDescription: '描述',\r\n MakeDescriptionEditable: '编辑描述',\r\n MakeDescriptionNonEditable: '不编辑描述',\r\n DoubleClickToMakeDescriptionEditable: '双击此描述激活编辑功能',\r\n SolarPanelArray: '光伏板阵列设计',\r\n CurateCurrentDesign: '收藏当前设计',\r\n UpdateSelectedDesign: '更新选中设计',\r\n RemoveSelectedDesign: '删除选中设计',\r\n ClickToFlipSortingOrder: '点击逆转排序方向',\r\n DesignNotShownInSolutionSpaceClickToShow: '此设计目前不显示在设计空间内,点击显示',\r\n DesignShownInSolutionSpaceClickToHide: '此设计目前显示在设计空间内,点击隐藏',\r\n DistributionInSolutionSpace: '方案在设计空间里的分布',\r\n ChooseSolutionSpace: '选择设计空间',\r\n ChooseDataColoring: '选择数据着色',\r\n SameColorForAllDesigns: '所有设计一个颜色',\r\n OneColorForEachDesign: '每个设计一个颜色',\r\n SolutionSpaceScreenshot: '设计空间截图',\r\n ScatteredPlotScreenshot: '散点图截图',\r\n SingleClickToSelectDoubleClickToOpen: '单击选择,双击打开。',\r\n SingleClickToDeselectDoubleClickToOpen: '单击取消选择,双击打开。',\r\n GenerateScatteredPlot: '生成散点图',\r\n SelectXAxis: '选择X轴',\r\n SelectYAxis: '选择Y轴',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: '我的账户设定',\r\n MyID: '我的🆔',\r\n ClickToCopyMyID: '点击此处拷贝我的ID',\r\n IDInClipBoard: '您现在可以粘贴ID了。',\r\n StoreMyNameInMyFilesWhenSaving: '保存文件时签上我的大名',\r\n DoYouReallyWantToShowYourNameInYourFiles: '您确定在您的文件里保存您的大名吗?',\r\n SignFileDisclaimer: '如果您选择保存,您的大名可能被所有打开您的文件的人看到。',\r\n Likes: '点赞总数',\r\n AllPublished: '发布总数',\r\n PublishedUnderAliases: '别名发布',\r\n UserCount: '用户总数',\r\n SchoolID: '学校编号',\r\n ClassID: '班级编号',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: '日照时间',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: '选择气温模型',\r\n Sinusoidal: '正弦函数',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: '经济学参数',\r\n ElectricitySellingPrice: '销售电价',\r\n OperationalCostPerUnit: '单位运行成本',\r\n SellingPrice: '销售电价',\r\n UnitCost: '单位成本',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: '导航模式参数',\r\n MinimumMoveSpeed: '最小移动速度',\r\n MinimumTurnSpeed: '最小拐弯速度',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: '天空清晰度',\r\n ShowDaylightResults: '显示日照时间结果',\r\n ShowSkyClearnessResults: '显示天空清晰度结果',\r\n ShowAverageDailySolarRadiation: '显示日平均辐射结果',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: '没有传感器收集数据。',\r\n NoSolarPanelForAnalysis: '没有光伏板可以分析。',\r\n NoObserverForVisibilityAnalysis: '没有找到可见度分析的观察者。',\r\n NoWaterHeaterForAnalysis: '沒有太阳能热水器可以分析。',\r\n NoParabolicDishForAnalysis: '沒有抛物线碟可以分析。',\r\n NoParabolicTroughForAnalysis: '沒有抛物线槽可以分析。',\r\n NoFresnelReflectorForAnalysis: '沒有菲涅耳反射镜可以分析。',\r\n NoHeliostatForAnalysis: '沒有定日镜可以分析。',\r\n NoSolarUpdraftTowerForAnalysis: '沒有太阳能上升气流塔可以分析。',\r\n NoBuildingForAnalysis: '沒有建筑物可以分析。',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: '云文件',\r\n Select: '选择',\r\n AddFoundation: '添加地基',\r\n AddWall: '添加墙体',\r\n AddWindow: '添加窗户',\r\n AddDoor: '添加门',\r\n AddPyramidRoof: '添加金字塔屋顶',\r\n AddGableRoof: '添加双坡屋顶',\r\n AddHipRoof: '添加四坡屋顶',\r\n AddGambrelRoof: '添加复斜屋顶',\r\n AddMansardRoof: '添加折线屋顶',\r\n AddCuboid: '添加长方体',\r\n AddSensor: '添加传感器',\r\n AddSolarPanel: '添加光伏板',\r\n AddWaterHeater: '添加太阳能热水器',\r\n AddParabolicDish: '添加抛物线碟',\r\n AddParabolicTrough: '添加抛物线槽',\r\n AddFresnelReflector: '添加菲涅耳反射镜',\r\n AddHeliostat: '添加定日镜',\r\n AddWindTurbine: '添加风力涡轮机',\r\n AddLight: '添加电灯',\r\n AddTree: '添加树木',\r\n AddFlower: '添加花草',\r\n AddPeople: '添加人物',\r\n DoubleClickToLockThisModeForNextAction: '双击按钮给下个动作锁定此模式',\r\n ClickToUnlockThisModeForNextAction: '点击按钮让动作完成即离开此模式',\r\n ManipulateGroup: '整体操作一个组',\r\n ClearScene: '清空场景',\r\n ShowSunAndTimeSettings: '显示太阳和时间设置',\r\n SpatialAnalysisOfEnergy: '能量的空间分析',\r\n DoYouReallyWantToClearContent: '您确定清空场景吗',\r\n ClickForMoreButtons: '点击此处切换到更多的按钮模式',\r\n SwitchToAddingFoundation: '切换到添加地基模式',\r\n SwitchToAddingCuboid: '切换到添加长方体模式',\r\n SwitchToAddingWall: '切换到添加墙体模式',\r\n SwitchToAddingWindow: '切换到添加窗户模式',\r\n SwitchToAddingDoor: '切换到添加门模式',\r\n SwitchToAddingPyramidRoof: '切换到添加金字塔屋顶模式',\r\n SwitchToAddingGableRoof: '切换到添加双坡屋顶模式',\r\n SwitchToAddingHipRoof: '切换到添加四坡屋顶模式',\r\n SwitchToAddingGambrelRoof: '切换到添加复斜屋顶模式',\r\n SwitchToAddingMansardRoof: '切换到添加折线屋顶模式',\r\n SwitchToAddingSolarPanel: '切换到添加光伏板模式',\r\n SwitchToAddingSensor: '切换到添加传感器模式',\r\n SwitchToAddingWaterHeater: '切换到添加太阳能热水器模式',\r\n SwitchToAddingParabolicDish: '切换到添加抛物线碟模式',\r\n SwitchToAddingParabolicTrough: '切换到添加抛物线槽模式',\r\n SwitchToAddingFresnelReflector: '切换到添加菲涅耳反射镜模式',\r\n SwitchToAddingHeliostat: '切换到添加定日镜模式',\r\n SwitchToAddingWindTurbine: '切换到添加风力涡轮机模式',\r\n SwitchToAddingLight: '切换到添加电灯模式',\r\n SwitchToAddingTree: '切换到添加树木模式',\r\n SwitchToAddingFlower: '切换到添加花草模式',\r\n SwitchToAddingPeople: '切换到添加人物模式',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: '访问未来智能研究所',\r\n visitAladdinHomePage: '访问阿拉丁主页',\r\n clickToOpenMenu: '点击打开主菜单',\r\n clickToAccessAccountSettings: '点击打开账号设定',\r\n },\r\n\r\n tree: {\r\n Apple: '苹果树',\r\n Birch: '白桦',\r\n Coconut: '椰子树',\r\n Dogwood: '茱萸',\r\n Elm: '榆树',\r\n FanPalm: '扇叶棕榈',\r\n Linden: '菩提',\r\n Magnolia: '玉兰',\r\n Maple: '枫树',\r\n Oak: '橡树',\r\n Pine: '松树',\r\n Spruce: '云杉',\r\n },\r\n\r\n flower: {\r\n Bellflower: '铃兰',\r\n Boxwood: '黄杨',\r\n CactusCombo1: '仙人掌组合一',\r\n CactusCombo2: '仙人掌组合二',\r\n CactusCombo3: '仙人掌组合三',\r\n CactusCombo4: '仙人掌组合四',\r\n Hibiscus: '木槿',\r\n Hosta: '玉簪',\r\n Hydrangea: '绣球花',\r\n Peony: '牡丹',\r\n RedRose: '红玫瑰',\r\n Spirea: '绣线菊',\r\n Sunflower: '向日葵',\r\n TallBush: '高灌木',\r\n Tulip: '郁金香',\r\n WhiteFlower: '白花',\r\n YellowFlower: '黄花',\r\n },\r\n\r\n people: {\r\n Jaah: '贾阿',\r\n Jack: '杰克',\r\n Jacob: '雅各布',\r\n Jacqueline: '杰奎琳',\r\n Jade: '美玉',\r\n Jamelia: '洁米莉雅',\r\n James: '詹姆斯',\r\n Jane: '简',\r\n Jaya: '佳娅',\r\n Jaye: '杰伊',\r\n Jeanette: '珍妮特',\r\n Jedi: '杰迪',\r\n Jeff: '杰夫',\r\n Jena: '珍娜',\r\n Jennifer: '珍尼弗',\r\n Jess: '杰西',\r\n Jett: '杰特',\r\n Jill: '吉尔',\r\n Jiya: '吉娅',\r\n Joan: '琼',\r\n Jocelyn: '乔斯林',\r\n Joel: '乔尔',\r\n Joey: '乔伊',\r\n John: '约翰',\r\n Jonathon: '乔纳森',\r\n Jose: '何塞',\r\n Joseph: '约瑟夫',\r\n Joshua: '约书亚',\r\n Judd: '贾德',\r\n Judy: '朱蒂',\r\n Julia: '朱莉娅',\r\n Julio: '胡里奥',\r\n Jumapili: '祖玛匹莉',\r\n June: '准卫',\r\n Juro: '朱诺',\r\n Justin: '贾斯汀',\r\n },\r\n\r\n compass: {\r\n N: '北',\r\n S: '南',\r\n W: '西',\r\n E: '东',\r\n },\r\n\r\n month: {\r\n January: '一月',\r\n February: '二月',\r\n March: '三月',\r\n April: '四月',\r\n May: '五月',\r\n June: '六月',\r\n July: '七月',\r\n August: '八月',\r\n September: '九月',\r\n October: '十月',\r\n November: '十一月',\r\n December: '十二月',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: '按发布者搜索',\r\n SearchByLabel: '按标签搜索',\r\n MyPublishedModels: '我发布的模型',\r\n TotalNumberOfUserPublishedModels: '用户发布的模型总数',\r\n SortFromOldestToNewest: '从早到晚排序',\r\n SortFromNewestToOldest: '从晚到早排序',\r\n ModelsFoundOnThisSite: '个模型在此位置',\r\n ShowModelsPublishedByThisAuthor: '展示此用户发布的模型',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_zh_tw = {\r\n translation: {\r\n name: {\r\n IFI: '未來智能研究所',\r\n Aladdin: '阿拉丁',\r\n Tagline: '阿拉丁: 探索人工智慧時代的設計軟體 — 未來智能研究所研發',\r\n },\r\n\r\n cookie: {\r\n Statement: '聲明:為了改善您的用戶體驗,阿拉丁採用cookie儲存少量數據。',\r\n Accept: '同意',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: '未來智能研究所榮譽出品',\r\n TermsOfService: '服務條款',\r\n PrivacyPolicy: '隱私政策',\r\n Software: '軟體',\r\n Content: '課件',\r\n Research: '研究',\r\n Support: '服務',\r\n Acknowledgment: '鳴謝',\r\n FundingInformation:\r\n '本產品的研發承蒙美國國家科學基金會慷慨資助(項目號#2105695,#2131097,#2301164)。本產品的任何觀點或結論僅代表創作者個人意見。',\r\n Contact: '如您需要更多資訊,請聯繫 Charles Xie (charles@intofuture.org)。我們會盡快回复。',\r\n Translators: '翻譯',\r\n },\r\n\r\n word: {\r\n LastUpdate: '上一次更新',\r\n Small: '小',\r\n Medium: '中',\r\n Large: '大',\r\n Design: '設計',\r\n Information: '資訊',\r\n Type: '類别',\r\n Text: '文字',\r\n FontSize: '字體大小',\r\n FontColor: '字體顏色',\r\n Model: '模型',\r\n Models: '模型',\r\n Upload: '上傳',\r\n ClickCount: '點擊數',\r\n Share: '分享',\r\n AlreadyLike: '已點贊',\r\n Like: '點贊',\r\n MustLogInToLike: '必須登錄才能點贊',\r\n AllRightsReserved: '版權所有',\r\n MeterAbbreviation: '米',\r\n Version: '版本',\r\n VersionInitial: '版本',\r\n Options: '選項',\r\n Maximum: '最大',\r\n Minimum: '最小',\r\n MaximumNumber: '最多',\r\n MinimumNumber: '最少',\r\n MaximumValue: '最大值',\r\n MinimumValue: '最小值',\r\n Or: '或',\r\n None: '無',\r\n High: '高',\r\n Partial: '部分',\r\n Teacher: '老師',\r\n Class: '班級',\r\n Total: '總數',\r\n Leaderboard: '用戶排行榜',\r\n Latest: '最新',\r\n Range: '範圍',\r\n SIUnit: '國際單位制',\r\n USUnit: '美國單位制',\r\n ThermalTransmittance: '熱透過率',\r\n ThermalResistance: '熱阻',\r\n UValue: 'U值',\r\n RValue: 'R值',\r\n VolumetricHeatCapacity: '容積熱容',\r\n BuildingHVACSystem: '建築物暖通空調系統',\r\n ThermostatSetpoint: '恆溫器設定值',\r\n TemperatureToleranceThreshold: '溫度忍耐閾值',\r\n TemperatureToleranceThresholdExplanation:\r\n '當日最低外面溫度高於恆溫器設定值減去此閾值,暖氣不開。\\n當日最高外面溫度低於恆溫器設定值加上此閾值,空調不開。',\r\n Press: '按',\r\n Open: '打開',\r\n Save: '保存',\r\n SaveAsImage: '保存為圖像',\r\n SaveAsCsv: '保存為CSV',\r\n Update: '刷新',\r\n Paste: '粘貼',\r\n Copy: '複製',\r\n Cut: '剪切',\r\n Delete: '删除',\r\n Lock: '固定',\r\n Translucent: '半透明',\r\n Color: '顏色',\r\n Texture: '材質',\r\n Thickness: '厚度',\r\n Size: '尺寸',\r\n Yes: '是',\r\n No: '不',\r\n OK: '確定',\r\n Cancel: '取消',\r\n Apply: '應用',\r\n Close: '關閉',\r\n ApplyTo: '適用於',\r\n Run: '運行',\r\n Pause: '暫停',\r\n Resume: '繼續',\r\n Clear: '清空',\r\n Warning: '警告',\r\n Caution: '小心',\r\n Reminder: '提醒',\r\n Length: '長度',\r\n Width: '寬度',\r\n Height: '高度',\r\n Radius: '半徑',\r\n Angle: '角度',\r\n Azimuth: '方位角',\r\n Coordinates: '坐標',\r\n Weather: '天氣',\r\n Show: '顯示',\r\n Animate: '動畫',\r\n Date: '日期',\r\n Time: '時間',\r\n Title: '標題',\r\n Owner: '所有者',\r\n Action: '操作',\r\n Rename: '改名',\r\n Location: '位置',\r\n Latitude: '緯度',\r\n Month: '月份',\r\n Day: '天',\r\n Hour: '小時',\r\n Daylight: '白天長度',\r\n Radiation: '輻射',\r\n Temperature: '温度',\r\n kWh: '千瓦時',\r\n dollar: '元',\r\n MeterPerSecond: '米/秒',\r\n NorthInitial: '北',\r\n SouthInitial: '南',\r\n EastInitial: '東',\r\n WestInitial: '西',\r\n Fixed: '固定',\r\n Elements: '部件',\r\n Energy: '能量',\r\n Unknown: '未知',\r\n Label: '標籤',\r\n Description: '描述',\r\n NoDescription: '無描述',\r\n MaximumCharacters: '最多字符數',\r\n Author: '作者',\r\n Publisher: '發布者',\r\n Building: '建築',\r\n ResidentialBuilding: '住宅建築',\r\n CommercialBuilding: '商用建築',\r\n SchoolBuilding: '學校建築',\r\n TouristAttraction: '旅遊景點',\r\n UnderConstruction: '在建',\r\n Photovoltaic: '光伏',\r\n Anonymous: '無名氏',\r\n Nickname: '别名',\r\n Pin: '置頂',\r\n Unpin: '解除置頂',\r\n },\r\n\r\n shared: {\r\n NoTexture: '無材質',\r\n FoundationElement: '地基',\r\n CuboidElement: '長方體',\r\n PolygonElement: '多邊形',\r\n SensorElement: '傳感器',\r\n SolarPanelElement: '光伏板',\r\n WaterHeaterElement: '太陽能熱水器',\r\n ParabolicDishElement: '拋物線碟',\r\n ParabolicTroughElement: '拋物線槽',\r\n FresnelReflectorElement: '菲涅耳反射鏡',\r\n HeliostatElement: '定日鏡',\r\n WindTurbineElement: '風力渦輪機',\r\n LightElement: '電燈',\r\n ElementLocked: '固定',\r\n ModelType: '模型類别',\r\n OutputBreakdown: '分列發電量',\r\n MoreResults: '更多結果',\r\n },\r\n\r\n message: {\r\n ModelNotFound: '沒有找到模型',\r\n CannotSignIn: '登錄失敗',\r\n CannotSignOut: '退出失敗',\r\n YourAccountWasCreated: '成功建立您的賬號。',\r\n CannotCreateAccount: '無法創建賬號',\r\n YourAccountSettingsWereSaved: '您的賬號設定已保存。',\r\n CannotSaveYourAccountSettings: '您的賬號設定無法保存',\r\n CannotSaveYourFileToCloud: '無法保存您的文檔到雲端',\r\n CannotCreateNewProject: '無法創建新項目',\r\n CannotCreateNewProjectWithoutTitle: '沒有標題, 無法創建新項目',\r\n CannotOpenYourProjects: '無法打開您的項目列表',\r\n CannotOpenProject: '無法打開項目',\r\n CannotDeleteProject: '無法刪除項目',\r\n CannotRenameProject: '無法給項目改名',\r\n CannotAddDesignToProject: '無法把此設計加到項目裡',\r\n CannotAddDesignToProjectOwnedByOthers: '不能把此設計加到別人的項目裡',\r\n DesignRemovedFromProject: '設計被成功地從項目裡刪除',\r\n CannotRemoveDesignFromProject: '無法把此設計從項目裡刪除',\r\n CannotUpdateProject: '無法更新項目',\r\n CannotFetchProjectData: '無法取得項目數據',\r\n TitleUsedChooseDifferentOne: '此標題已經被使用, 請採用不同的標題',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: '使用此標題的雲文檔已經存在,您確定要覆蓋它嗎?',\r\n CloudFileNotFound: '找不到此云端文檔',\r\n CannotLoadModelsOnMap: '無法下載地圖上的模型',\r\n CannotLoadLeaderboard: '無法下載排行榜',\r\n CannotPublishModelOnMap: '模型無法發佈到地圖上',\r\n CannotLikeModelFromMap: '無法點贊地圖上的模型',\r\n CannotDeleteModelFromMap: '無法删除地圖上的模型',\r\n ModelDeletedFromMap: '模型已從地圖上刪除',\r\n DoYouWantToDeleteModelFromMap: '您要删除地圖上的這個模型嗎?',\r\n CannotOpenCloudFile: '此云端文檔無法打開',\r\n CannotReadCloudFile: '無法讀取此云端文檔',\r\n CannotWriteCloudFile: '無法存儲此云端文檔',\r\n CloudFileCopied: '拷貝云端文檔',\r\n CannotOpenCloudFolder: '您的雲端文檔夾無法打開',\r\n CannotDeleteCloudFile: '無法刪除此云端文檔',\r\n CannotRenameCloudFile: '此云端文檔的名字無法更改',\r\n DoYouWantToSaveChanges: '您要保存當前文檔嗎?',\r\n NotApplicableToSelectedAction: '此值不適用於當前選擇範圍',\r\n ThisElementIsLocked: '這個部件被鎖定。',\r\n ThisCannotBeUndone: '這個操作一旦執行就不能撤銷。',\r\n AzimuthOfNorthIsZero: '正北的方位角為零度',\r\n CounterclockwiseAzimuthIsPositive: '逆時針為正',\r\n MoveCancelledBecauseOfOverlap: '位置重疊,移動取消。',\r\n MoveOutsideBoundaryCancelled: '位置出界,移動取消。',\r\n RotationCancelledBecauseOfOverlap: '位置重疊,旋轉取消。',\r\n RotationOutsideBoundaryCancelled: '位置出界,旋轉取消。',\r\n ResizingCancelledBecauseOfOverlap: '位置重疊,尺寸調整取消。',\r\n ResizingOutsideBoundaryCancelled: '位置出界,尺寸調整取消。',\r\n CannotPasteOutsideBoundary: '位置出界,不能複制。',\r\n CannotPasteBecauseOfOverlap: '位置重疊,不能複制。',\r\n CannotMoveObjectTooFar: '位置太遠,移動取消。',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout: '採用新佈局之前必須移除現有的光伏板。',\r\n DoYouWantToContinue: '您想繼續嗎?',\r\n SolarPanelsCannotIntersectWithGround: '光伏板不能和地面接觸。',\r\n SolarPanelsCannotOverlapWithOneAnother: '光伏板不能重疊。',\r\n ScreenshotSaved: '截屏圖片保存在下載文檔夾裡。',\r\n CsvFileSaved: 'CSV保存在下載文檔夾裡。',\r\n SimulationStarted: '模擬開始。',\r\n SimulationCompleted: '模擬結束。',\r\n SimulationAborted: '模擬取消。',\r\n SimulationPaused: '模擬暫停。',\r\n CancelSimulation: '取消模擬',\r\n PauseSimulation: '暫停模擬',\r\n ResumeSimulation: '繼續模擬',\r\n SimulationWillNotStartDueToErrors: '由於錯誤模擬無法運行',\r\n SimulationWillStartDespiteWarnings: '發現問題,但模擬仍然將運行。',\r\n EvolutionStarted: '演化開始。',\r\n EvolutionCompleted: '演化結束。',\r\n EvolutionAborted: '演化取消。',\r\n EvolutionPaused: '演化暫停。',\r\n EncounterEvolutionError: '演化出錯。',\r\n CancelEvolution: '取消演化',\r\n PauseEvolution: '暫停演化',\r\n ResumeEvolution: '繼續演化',\r\n ConvergenceThresholdHasBeenReached: '收斂閾值已達到。',\r\n MaximumNumberOfGenerationsHasBeenReached: '最大世代數已達到。',\r\n MaximumNumberOfStepsHasBeenReached: '最大步數已達到。',\r\n ObjectiveFunctionTypeError: '此操作不支持當前的目標函數。請從菜單啟動此功能。',\r\n WallsAreNotAtSameHeight: '墻體高度不同。',\r\n WallsAreNotPerpendicular: '墻體不垂直。',\r\n WallsAreNotConnected: '墻體不相連。',\r\n WallsNumberNeedToBeFour: '墻體數量必須為四個。',\r\n BuildingContainsEmptyWall: '建築物有空牆。',\r\n BuildingRoofMissing: '建築物沒有屋頂。',\r\n UnknownErrors: '未知錯誤。',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: '分析選項',\r\n option: {\r\n GridCellSize: '計算網格的尺寸',\r\n SamplingFrequency: '採樣頻率',\r\n TimesPerHour: '每小時採樣次數',\r\n DaysPerYear: '每一年採樣天數',\r\n },\r\n mainMenu: '主菜單',\r\n cloudMenu: '雲菜單',\r\n projectSubMenu: '項目',\r\n project: {\r\n CreateNewProject: '創建新項目',\r\n OpenProject: '打開項目',\r\n SaveProjectAs: '另存項目為',\r\n YouMustLogInToCreateProject: '您必須登錄才能創建項目',\r\n YouMustLogInToOpenProject: '您必須登錄才能打開項目',\r\n },\r\n fileSubMenu: '文檔',\r\n file: {\r\n CreateNewFile: '創建新文檔',\r\n OpenLocalFile: '打開本地文檔',\r\n SaveAsLocalFile: '保存為本地文檔',\r\n SavingAbortedMustHaveValidFileName: '文檔名無效,保存失敗',\r\n OpenCloudFile: '打開雲端文檔',\r\n SaveCloudFile: '保存雲端文檔',\r\n SaveAsCloudFile: '保存為雲端文檔',\r\n SavingAbortedMustHaveValidTitle: '雲端文檔名無效,保存失敗',\r\n ToSaveYourWorkPleaseSignIn: '為了保存您的雲端文檔,請您先登錄。',\r\n TakeScreenshot: '截屏',\r\n UseCloudFileName: '採用雲端文件名',\r\n PublishOnModelsMap: '發佈到地圖上',\r\n PublishedOnModelsMap: '您的模型成功發佈到地圖上',\r\n UpdatedOnModelsMap: '您的模型更新成功',\r\n YouMustLogInToPublishYourModel: '您必須登錄才能發布模型',\r\n YouCannotPublishAModelThatYouDoNotOwn: '您不能發布他人的模型',\r\n YouMustSaveModelOnCloudBeforePublishingIt: '您必須先把此模型保存在雲端才能發布它',\r\n },\r\n editSubMenu: '編輯',\r\n edit: {\r\n Undo: '撤銷',\r\n Redo: '重做',\r\n },\r\n viewSubMenu: '視界',\r\n view: {\r\n NavigationView: '導航模式',\r\n TwoDimensionalView: '二維模式',\r\n ResetView: '重置視角',\r\n ZoomIn: '放大',\r\n ZoomOut: '縮小',\r\n AutoRotate: '自動旋轉',\r\n ShowShadow: '顯示陰影',\r\n ShowSurfaceShininess: '顯示表面光澤',\r\n TranslucentFloatingWindows: '透明浮動窗口',\r\n accessoriesSubMenu: '配件',\r\n accessories: {\r\n SiteInformation: '位置資訊',\r\n DesignInformation: '設計資訊',\r\n Instruction: '操作說明',\r\n StickyNote: '便簽',\r\n Note: '便簽',\r\n },\r\n },\r\n settingsSubMenu: '設置',\r\n settings: {\r\n WeatherData: '氣象數據',\r\n DiurnalTemperature: '晝夜溫度',\r\n Heliodon: '日影儀',\r\n SunAndTime: '太陽和時間',\r\n },\r\n benchmarksSubMenu: '基準',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: '太陽能輻射模型預測和實際測量的對比',\r\n BESTESTCase600: '建築物能耗模擬測試:BESTEST案例600',\r\n BESTESTCase610: '建築物能耗模擬測試:BESTEST案例610',\r\n BESTESTCase620: '建築物能耗模擬測試:BESTEST案例620',\r\n BESTESTCase630: '建築物能耗模擬測試:BESTEST案例630',\r\n },\r\n graph: {\r\n LineWidth: '線條寬度',\r\n SymbolSize: '符號大小',\r\n BarCategoryGap: '直條間隙',\r\n ShowHorizontalGridLines: '顯示格子的水平線條',\r\n ShowVerticalGridLines: '顯示格子的豎直線條',\r\n },\r\n analysisSubMenu: '分析',\r\n physicsSubMenu: '物理',\r\n physics: {\r\n DailySolarRadiationHeatmap: '當日太陽輻射總量分佈熱圖',\r\n SolarRadiationHeatmapOptions: '太陽輻射熱圖選項',\r\n SolarRadiationHeatmapGridCellSize: '太陽輻射熱圖網格的尺寸',\r\n SolarRadiationHeatmapMaxValue: '太陽輻射熱圖最大值',\r\n SolarRadiationHeatmapNoAnimation: '若無移動部件則省略動畫',\r\n ReflectionHeatmap: '反射熱圖',\r\n },\r\n sensorSubMenu: '傳感器',\r\n sensor: {\r\n CollectDailyData: '收集當天數據',\r\n CollectYearlyData: '收集全年數據',\r\n SensorSimulationNoAnimation: '若無移動部件則省略動畫',\r\n },\r\n buildingSubMenu: '建築物',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: '建築物當天能耗分析',\r\n AnalyzeYearlyBuildingEnergy: '建築物全年能耗分析',\r\n EnergyAnalysisOptions: '能耗分析選項',\r\n EnergyGridCellSize: '計算網格的尺寸',\r\n BuildingEnergySimulationNoAnimation: '若無移動部件則省略動畫',\r\n },\r\n solarPanelSubMenu: '太陽能光伏板',\r\n solarPanel: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n AnalyzeVisibility: '分析可見度',\r\n PanelDiscretization: '光伏板離散化方法',\r\n Exact: '準確',\r\n Approximate: '近似',\r\n EnergyGridCellSize: '計算網格的尺寸',\r\n VisibilityGridCellSize: '視界因子計算網格的尺寸',\r\n EnergyAnalysisOptions: '能量分析選項',\r\n VisibilityAnalysisOptions: '可見度分析選項',\r\n SolarPanelSimulationNoAnimation: '若無移動部件則省略動畫',\r\n },\r\n parabolicTroughSubMenu: '拋物線槽',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n },\r\n parabolicDishSubMenu: '拋物線碟',\r\n parabolicDish: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n },\r\n fresnelReflectorSubMenu: '菲涅爾反射鏡',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n },\r\n heliostatSubMenu: '定日鏡',\r\n heliostat: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n },\r\n solarUpdraftTowerSubMenu: '太陽能上升氣流塔',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n SolarUpdraftTowerSimulationNoAnimation: '若無移動部件則省略動畫',\r\n },\r\n\r\n tutorialsSubMenu: '教程',\r\n\r\n solarEnergyScienceSubMenu: '太陽能科學',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: '太陽相對於地面觀察者的角度',\r\n InsolationAndClimate: '太陽輻射和氣候的關係',\r\n SolarRadiationToBox: '一個長方體受到的太陽能輻射分析',\r\n },\r\n\r\n buildingScienceSubMenu: '建築科學',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: '房屋的熱學封套和圍護封套',\r\n EffectOfSizeOnBuildingEnergy: '房屋大小對能耗的影響',\r\n EffectOfOrientationOnBuildingEnergy: '房屋方位對能耗的影響',\r\n EffectOfInsulationOnBuildingEnergy: '房屋隔熱對能耗的影響',\r\n EffectOfRoofColorOnBuildingEnergy: '屋頂顏色對建築物能耗的影響',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: '屋簷延伸長度對建築物能耗的影響',\r\n EffectOfWindowSHGCOnBuildingEnergy: '窗戶太陽能輸入對房屋能耗的影響',\r\n EffectOfThermostatSetpointOnBuildingEnergy: '恆溫器設定值對房屋能耗的影響',\r\n EffectOfSolarPanelsOnBuildingEnergy: '光伏板對房屋能耗的影響',\r\n EffectOfGroundTemperatureOnBuildingEnergy: '地表温度對房屋能耗的影響',\r\n EffectOfTreesOnBuildingEnergy: '樹蔭對房屋能耗的影響',\r\n },\r\n\r\n buildingDesignSubMenu: '建築設計',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: '有棚頂窗的科德角風格的住宅',\r\n MansardRoofWithDormers: '有天窗的折線屋頂',\r\n GableRoofVsHipRoof: '雙坡屋頂和四坡屋顶的對比',\r\n ColonialVsSaltbox: '殖民地風格和鹽盒風格的對比',\r\n GambrelRoofVsMansardRoof: '复斜屋顶和折線屋頂的對比',\r\n CombinationRoofVsBonnetRoof: '組合屋頂和帽簷屋頂的對比',\r\n DutchGableRoof: '荷蘭雙坡屋頂',\r\n GableAndValleyRoof: '坡谷屋頂',\r\n ClerestoryRoof: '天窗屋頂',\r\n MonitorRoof: '採光屋頂',\r\n AFrameHouse: 'A字形房子',\r\n HalfTimberedHouse: '半木骨架房子',\r\n AllBasicRoofTypes: '所有的基本屋頂類型',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: '光伏發電',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: '光伏板傾斜角對發電量的影響',\r\n EffectOfAzimuthOfSolarPanel: '光伏板方位角對發電量的影響',\r\n SolarPanelTypes: '光伏板類型',\r\n VerticalBifacialSolarPanels: '豎直的雙面光伏板',\r\n CompareMonofacialAndBifacialSolarPanels: '單面光伏板和雙面光伏板的對比',\r\n SolarTrackers: '自動追日器',\r\n CoveringGroundWithSolarPanels: '為什麼我們不簡單地用光伏板覆蓋地面',\r\n InterRowSpacingOfSolarPanelArray: '光伏板陣列行間距對發電量的影響',\r\n EffectOfOrientationOfSolarPanels: '光伏板排列方向對發電量的影響',\r\n SolarPanelArrayAutomaticLayout: '光伏板自動排列',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: '光熱發電',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: '拋物線槽方位角對發電量的影響',\r\n EffectOfLatusRectumOfParabolicTrough: '拋物線槽通徑對發電量的影響',\r\n FocusSunlightWithParabolicDish: '用拋物線碟聚焦阳光',\r\n LinearFresnelReflectors: '用直線式菲涅爾反射鏡聚焦阳光',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors: '吸熱管的安装高度對直線式菲涅爾反射鏡發電量的影響',\r\n EffectOfAzimuthOfLinearFresnelReflectors: '直線式菲涅爾反射鏡方位角對發電量的影響',\r\n LinearFresnelReflectorsWithTwoAbsorbers: '配備兩個吸收管的直線式菲涅爾反射鏡陣列',\r\n CosineEfficiencyOfHeliostats: '定日鏡的餘弦效率',\r\n ShadowingAndBlockingOfHeliostats: '定日鏡的陰影和遮擋',\r\n EffectSolarPowerTowerHeight: '吸收塔高度對發電量的影響',\r\n SolarPowerTower: '塔式光熱發電站',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: '其它類型的太陽能發電',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: '太陽能上升氣流塔',\r\n },\r\n\r\n generativeDesignSubMenu: '生成式設計',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: '單面光伏板陣列的傾斜角',\r\n BifacialSolarPanelArrayTiltAngle: '雙面光伏板陣列的傾斜角',\r\n OutputOfSolarPanelArrayInDifferentPlaces: '一個光伏板陣列在不同地區的產出',\r\n SimpleSolarFarmParetoFront: '簡單太陽能農場設計的帕累托前沿',\r\n },\r\n\r\n examplesSubMenu: '例子',\r\n\r\n solarEnergySubMenu: '太陽能',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: '太陽光束和日影儀',\r\n RooftopSolarPanels: '屋頂光伏板',\r\n NevadaSolarOneParabolicTroughArray: '內華達州太陽能一號的拋物線槽陣列',\r\n TooeleParabolicDishArray: '猶他州圖埃勒的拋物線碟陣列',\r\n PS10SolarPowerTower: '西班牙塞維利亞的PS10太陽能發電塔',\r\n TucsonLinearFresnelReflectors: '亞利桑那州圖森的直線式菲涅爾反射鏡陣列',\r\n SolarCanopyFormFactors: '太陽能天篷外形設計',\r\n SolarCanopyOverBleachers: '看台太陽能天篷',\r\n SolarCanopyOverGarage: '車庫太陽能天篷',\r\n SolarBusStop: '太陽能候車亭',\r\n SolarFacadeTesla: '特斯拉光伏牆',\r\n BuildingIntegratedPhotovoltaics: '建築整合光伏',\r\n Floatovoltaics: '浮動光伏',\r\n Agrivoltaics: '農業光伏',\r\n VegetativeBuffer: '太陽能農場绿化带',\r\n RainbowSwashSolarFarmBostonMA: '馬薩諸塞州波士頓彩虹激流旁邊的光伏板陣列',\r\n MickeyMouseSolarFarmOrlandoFL: '佛羅里達州奧蘭多的米老鼠形狀光伏板陣列',\r\n SolarPanelsOverCanalBakersfieldCA: '加利福尼亞州貝克斯菲爾德灌溉渠上假想的光伏板陣列',\r\n SolarNoiseBarrierLexingtonMA: '馬薩諸塞州列剋星敦高速公路噪音牆上假想的光伏板',\r\n HSATSolarTrackersRaleighNC: '北卡羅來納州羅利的一個水平方向單軸旋轉追日光伏板陣列(HSAT)',\r\n AADATSolarTrackersLancasterCA: '加利福尼亞州蘭開斯特的一個雙軸旋轉追日光伏板陣列(AADAT)',\r\n SolarTrackersInRealWorld: '模擬',\r\n SolarUpdraftTowerInCity: '太陽能上升氣流塔在城市中的應用',\r\n },\r\n\r\n builtEnvironmentSubMenu: '建造環境',\r\n residentialBuildingsSubMenu: '住宅建築',\r\n residentialBuildingExamples: {\r\n ColonialHouse: '殖民地風格的住宅',\r\n DutchColonialHouse: '荷蘭殖民地風格的住宅',\r\n TShapedHouse: 'T字型房子',\r\n CapeCodHouseWithGarage: '有車庫的科德角風格的住宅',\r\n Solarium: '有日光浴室的房子',\r\n Church1: '教堂例一',\r\n Cathedral1: '主教座堂例一',\r\n Cathedral2: '主教座堂例二',\r\n Mosque1: '清真寺例一',\r\n AdobeTaosHouse: '陶斯土坯房',\r\n RanchHouse: '牧場風格的住宅',\r\n BonnetHouse: '有帽簷屋頂的住宅',\r\n BarnStyleHouse: '穀倉式風格的住宅',\r\n ModernHouse: '現代風格的住宅',\r\n ButterflyRoofHouse: '蝴蝶型屋頂的住宅',\r\n },\r\n commercialBuildingsSubMenu: '商用建築',\r\n commercialBuildingExamples: {\r\n WhiteHouse: '白宫',\r\n BilimMersinTurkiye: '土耳其梅爾辛科學教育中心',\r\n SpanishStyleHotel: '西班牙風格旅館',\r\n ApartmentBuilding: '公寓樓',\r\n OfficeBuilding: '寫字樓',\r\n Hotel: '旅館',\r\n },\r\n buildingComplexesSubMenu: '建築群',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: '佛蒙特州南伯靈頓高中',\r\n MescaleroApacheSchoolNewMexico: '新墨西哥州梅斯卡勒羅阿帕奇學校',\r\n },\r\n urbanPlanningSubMenu: '城市規劃',\r\n urbanPlanningExamples: {\r\n Heatmap1: '熱圖例一',\r\n },\r\n otherBuildingsSubMenu: '其它建築',\r\n otherBuildingExamples: {\r\n Greenhouse: '溫室',\r\n Pavilion: '公園的亭子',\r\n OctagonalPagoda: '八角塔',\r\n OceanFront: '海邊',\r\n EgyptianPyramids: '埃及金字塔',\r\n MayanPyramid: '瑪雅金字塔',\r\n SiOSePol: '三十三孔橋',\r\n StackedCuboids: '堆砌長方體',\r\n },\r\n\r\n artificialIntelligenceSubMenu: '人工智慧',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: '優化單排光伏板的傾斜角',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: '優化多排光伏板的傾斜角',\r\n SolarFarmGenerativeDesign: '生成式設計太陽能農場',\r\n SolarFarmGenerativeDesignWithBlock: '生成式設計太陽能農場:周邊有建築物的情況',\r\n FitchburgSolarFarmGenerativeDesign: '生成式設計太陽能農場:真實世界案例',\r\n },\r\n\r\n languageSubMenu: '語言',\r\n publicSubMenu: '公共',\r\n ModelsGallery: '模型畫廊',\r\n ModelsMap: '模型地圖',\r\n AboutUs: '關於我們',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: '賬號設定',\r\n PrivacyStatementTitle: '用戶隱私權保護聲明',\r\n PrivacyStatement:\r\n '登錄需要採用您的谷歌ID建立或進入您的阿拉丁賬戶。 我們只儲存一個隨機的字符串作為您的ID。 任何關於您的可辨識的個人信息都沒有被收集。 詳情請參考我們的',\r\n SignIn: '登錄',\r\n SignOut: '退出賬號',\r\n IfYouAreAStudent: '如果您是一個學生',\r\n },\r\n\r\n skyMenu: {\r\n Axes: '顯示坐標軸',\r\n Theme: '環境主題',\r\n ThemeDefault: '默認',\r\n ThemeDesert: '沙漠',\r\n ThemeDune: '沙丘',\r\n ThemeForest: '森林',\r\n ThemeGrassland: '草原',\r\n ThemeHill: '丘陵',\r\n ThemeLake: '湖泊',\r\n ThemeMountain: '山脈',\r\n ThemeRural: '田園',\r\n SunlightAttenuationCoefficientInAir: '陽光在空氣中傳播的衰減係數',\r\n ConvectiveCoefficientOfAir: '空氣對流傳熱係數',\r\n HighestTemperatureTimeInMinutes: '最高氣溫時間(分鐘)',\r\n SelectSunAnglesToShow: '選擇太陽角度顯示',\r\n ShowAzimuthAngle: '顯示方位角',\r\n ShowElevationAngle: '顯示高度角',\r\n ShowZenithAngle: '顯示天頂角',\r\n DirectLightBrightnessAtNoon: '正午直射光照度',\r\n AmbientLightBrightnessAtNoon: '正午環境光照度',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: '月份輻射度損失比',\r\n Vegetation: '植被',\r\n LeafOutDay: '樹葉長出的日子',\r\n LeafOffDay: '樹葉脫落的日子',\r\n Albedo: '反照率',\r\n ImageOnGround: '地面顯示圖像',\r\n WaterSurface: '水面',\r\n RemoveAllUnlockedTrees: '刪除所有非固定的樹木',\r\n RemoveAllUnlockedFlowers: '删除所有非固定的花草',\r\n RemoveAllUnlockedSolarPanels: '删除所有非固定的光伏板',\r\n RemoveAllUnlockedPeople: '删除所有非固定的人物',\r\n RemoveAllUnlockedFoundations: '删除所有非固定的地基',\r\n RemoveAllUnlockedCuboids: '删除所有非固定的長方體',\r\n DoYouReallyWantToRemoveAllPeople: '你確定刪除所有非固定的人物嗎',\r\n DoYouReallyWantToRemoveAllTrees: '你確定刪除所有非固定的樹木嗎',\r\n DoYouReallyWantToRemoveAllFlowers: '你確定刪除所有非固定的花草嗎',\r\n DoYouReallyWantToRemoveAllSolarPanels: '你確定刪除所有非固定的光伏板嗎',\r\n DoYouReallyWantToRemoveAllFoundations: '你確定刪除所有非固定的地基嗎',\r\n DoYouReallyWantToRemoveAllCuboids: '你確定刪除所有非固定的長方體嗎',\r\n LockAllElements: '固定所有的部件',\r\n UnlockAllElements: '解除所有的固定',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: '標籤',\r\n LabelText: '標籤的内容',\r\n LabelHeight: '標籤的高度',\r\n LabelSize: '標籤的大小',\r\n LabelFontSize: '字體的大小',\r\n LabelColor: '標籤的顏色',\r\n KeepShowingLabel: '顯示標籤',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: '刪除此地基上所有非固定的光伏板',\r\n RemoveAllUnlockedParabolicTroughs: '刪除此地基上所有非固定的拋物線槽',\r\n RemoveAllUnlockedParabolicDishes: '刪除此地基上所有非固定的拋物線碟',\r\n RemoveAllUnlockedFresnelReflectors: '刪除此地基上所有非固定的菲涅耳反射鏡',\r\n RemoveAllUnlockedHeliostats: '刪除此地基上所有非固定的定日鏡',\r\n RemoveAllUnlockedSensors: '刪除此地基上所有非固定的傳感器',\r\n RemoveAllUnlockedLights: '刪除此地基上所有非固定的電燈',\r\n RemoveAllUnlockedWalls: '刪除此地基上所有非固定的牆',\r\n RemoveAllUnlockedWindows: '刪除此地基上所有非固定的窗戶',\r\n RemoveAllUnlockedDoors: '刪除此地基上所有非固定的門',\r\n RemoveAllUnlockedPolygons: '刪除此地基上所有非固定的多邊形',\r\n RemoveAllUnlockedHumans: '刪除此地基上所有非固定的人物',\r\n RemoveAllUnlockedTrees: '刪除此地基上所有非固定的樹木',\r\n RemoveAllUnlockedFlowers: '刪除此地基上所有非固定的花草',\r\n Racks: '支架',\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n SolarPanels: '光伏板',\r\n SolarPanelArray: '光伏板陣列',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation: '你確定刪除此地基上所有非固定的光伏板嗎',\r\n ParabolicTroughs: '拋物線槽',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation: '你確定刪除此地基上所有非固定的拋物線槽嗎',\r\n ParabolicDishes: '拋物線碟',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation: '你確定刪除此地基上所有非固定的拋物線碟嗎',\r\n FresnelReflectors: '菲涅耳反射鏡',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation: '你確定刪除此地基上所有非固定的菲涅耳反射鏡嗎',\r\n Heliostats: '定日鏡',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation: '你確定刪除此地基上所有非固定的定日鏡嗎',\r\n Sensors: '傳感器',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation: '你確定刪除此地基上所有非固定的傳感器嗎',\r\n Lights: '電燈',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation: '你確定刪除此地基上所有非固定的電燈嗎',\r\n Walls: '牆',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation: '你確定刪除此地基上所有非固定的牆嗎',\r\n Windows: '窗戶',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation: '你確定刪除此地基上所有非固定的窗戶嗎',\r\n Doors: '門',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation: '你確定刪除此地基上所有非固定的門嗎',\r\n Polygons: '多邊形',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation: '你確定刪除此地基上所有非固定的多邊形嗎',\r\n Humans: '人物',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation: '你確定刪除此地基上所有非固定的人物嗎',\r\n Trees: '樹木',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation: '你確定刪除此地基上所有非固定的樹木嗎',\r\n Flowers: '花草',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation: '你確定刪除此地基上所有非固定的花草嗎',\r\n OnlyThisFoundation: '只這塊地基',\r\n AllConnectedFoundations: '所有相連的地基',\r\n AllSelectedFoundations: '所有選中的地基',\r\n AllFoundations: '所有的地基',\r\n AddPolygon: '添加多邊形',\r\n SolarStructure: '太陽能構型',\r\n GroupMaster: '主地基',\r\n LockAllElementsOnThisFoundation: '固定此地基上所有的部件',\r\n UnlockAllElementsOnThisFoundation: '解除此地基上所有的固定',\r\n GroundFloorRValue: '建築物地板的R值',\r\n OnlyThisGroundFloor: '只這個建築物的地板',\r\n AllGroundFloors: '所有建築物的地板',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: '和定日鏡配套的吸收塔',\r\n ReceiverTowerPhysicalProperties: '太陽能吸收塔的物理性質',\r\n ReceiverTowerHeight: '太陽能吸收塔的高度',\r\n ReceiverTowerRadius: '太陽能吸收塔的半徑',\r\n ReceiverAbsorptance: '太陽能吸收器的吸收率',\r\n ReceiverOpticalEfficiency: '太陽能吸收器的光效率',\r\n ReceiverThermalEfficiency: '太陽能吸收器的熱效率',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: '和菲涅爾反射鏡配套的吸收管',\r\n AbsorberPipePhysicalProperties: '太陽能吸收管的物理性質',\r\n AbsorberHeight: '太陽能吸收管的安装高度',\r\n AbsorberApertureWidth: '太陽能吸收管的孔徑',\r\n AbsorberPipePoleNumber: '太陽能吸收管的支柱數量',\r\n AbsorberAbsorptance: '太陽能吸收管的吸收率',\r\n AbsorberOpticalEfficiency: '太陽能吸收管的光效率',\r\n AbsorberThermalEfficiency: '太陽能吸收管的熱效率',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: '太陽能上升氣流塔',\r\n SolarUpdraftTowerPhysicalProperties: '太陽能上升氣流塔的物理性質',\r\n SolarUpdraftTowerChimneyHeight: '太陽能上升氣流塔煙囪的高度',\r\n SolarUpdraftTowerChimneyRadius: '太陽能上升氣流塔煙囪的半徑',\r\n SolarUpdraftTowerCollectorHeight: '太陽能上升氣流塔集熱棚的高度',\r\n SolarUpdraftTowerCollectorRadius: '太陽能上升氣流塔集熱棚的半徑',\r\n SolarUpdraftTowerCollectorTransmissivity: '太陽能上升氣流塔集熱棚的透射率',\r\n SolarUpdraftTowerCollectorEmissivity: '太陽能上升氣流塔集熱棚的發射率',\r\n SolarUpdraftTowerDischargeCoefficient: '太陽能上升氣流塔的流量係數',\r\n SolarUpdraftTowerTurbineEfficiency: '太陽能上升氣流塔的渦輪機效率',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n RemoveAllUnlockedSolarPanels: '刪除此長方體表面上所有非固定的光伏板',\r\n RemoveAllUnlockedSensors: '刪除此長方體表面上所有非固定的傳感器',\r\n RemoveAllUnlockedPolygons: '刪除此長方體表面上所有非固定的多邊形',\r\n RemoveAllUnlockedHumans: '刪除此長方體表面上所有非固定的人物',\r\n RemoveAllUnlockedTrees: '刪除此長方體表面上所有非固定的樹木',\r\n RemoveAllUnlockedFlowers: '刪除此長方體表面上所有非固定的花草',\r\n Racks: '支架',\r\n SolarPanels: '光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid: '你確定刪除此長方體表面上所有非固定的光伏板嗎',\r\n Sensors: '傳感器',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid: '你確定刪除此長方體表面上所有非固定的傳感器嗎',\r\n Polygons: '多邊形',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid: '你確定刪除此長方體表面上所有非固定的多邊形嗎',\r\n Humans: '人物',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid: '你確定刪除此長方體表面上所有非固定的人物嗎',\r\n Trees: '樹木',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid: '你確定刪除此長方體表面上所有非固定的樹木嗎',\r\n Flowers: '花草',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid: '你確定刪除此長方體表面上所有非固定的花草嗎',\r\n OnlyThisCuboid: '只這個長方體',\r\n AllCuboidsOnSameSurface: '同一表面上所有的長方體',\r\n AllCuboidsAboveSameBase: '同一地基上所有的長方體',\r\n AllSelectedCuboids: '所有選中的長方體',\r\n AllCuboids: '所有的長方體',\r\n OnlyThisSide: '只這個表面',\r\n AllSidesOfThisCuboid: '這個長方體所有的側面',\r\n AllSidesOfSelectedCuboids: '所有選中長方體所有的側面',\r\n AllSidesOfAllCuboids: '所有的長方體所有的側面',\r\n AddPolygon: '添加多邊形',\r\n Stackable: '可堆砌',\r\n GroupMaster: '主長方體',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n TextBox: '文字框',\r\n FontOutlineColor: '字體輪廓顏色',\r\n FontOutlineWidth: '字體輪廓線寬',\r\n FontStrokeColor: '字體描邊顏色',\r\n FontStrokeWidth: '字體描邊線寬',\r\n NoOutline: '無輪廓線',\r\n Shiny: '光澤',\r\n Filled: '填充',\r\n FillTexture: '填充材質',\r\n FillColor: '填充顏色',\r\n Opacity: '遮光度',\r\n LineColor: '線條顏色',\r\n LineWidth: '線條寬度',\r\n LineStyle: '線條樣式',\r\n SolidLine: '實線',\r\n DashedLine: '虛線',\r\n DottedLine: '點線',\r\n InsertVertexBeforeIndex: '前面插入頂點',\r\n InsertVertexAfterIndex: '後面插入頂點',\r\n DeleteVertex: '移除頂點',\r\n OnlyThisPolygon: '只這個多邊形',\r\n AllPolygonsOnSurface: '同一表面上所有的多邊形',\r\n AllPolygonsAboveFoundation: '同一地基上所有的多邊形',\r\n AllSelectedPolygons: '所有選中的多邊形',\r\n AllPolygons: '所有的多邊形',\r\n Layout: '佈局',\r\n SolarPanelArrayLayout: '光伏板陣列佈局',\r\n SolarPanelArrayLayoutParametricDesign: '光伏板陣列佈局參數化設計',\r\n SolarPanelArrayLayoutGenerativeDesign: '光伏板陣列佈局生成式設計',\r\n SolarPanelArrayModel: '光伏板型號',\r\n SolarPanelArrayOrientation: '排列方向',\r\n SolarPanelArrayTiltAngle: '傾斜角度',\r\n SolarPanelArrayRowWidth: '行寬度',\r\n SolarPanelArrayInterRowSpacing: '行間距',\r\n SolarPanelArrayRowSpacing: '行間距',\r\n SolarPanelArrayRowAxis: '行軸方向',\r\n SolarPanelArrayLeftRightRowAxis: '左右方向(相對)',\r\n SolarPanelArrayUpDownRowAxis: '上下方向(相對)',\r\n SolarPanelArrayEastWestRowAxis: '東西方向(絕對)',\r\n SolarPanelArrayNorthSouthRowAxis: '南北方向(絕對)',\r\n SolarPanelArrayMargin: '邊緣餘地',\r\n SolarPanelArrayPoleHeight: '支架高度',\r\n SolarPanelArrayPoleSpacing: '支柱間隔',\r\n SolarPanelArrayTotalYearlyCost: '全年總成本',\r\n SolarPanelArrayTotalYearlyRevenue: '全年總收入',\r\n SolarPanelArrayTotalYearlyYield: '全年總發電量',\r\n SolarPanelArrayMeanYearlyYield: '平均年發電量',\r\n SolarPanelArrayYearlyProfit: '全年利潤',\r\n LayoutNotAcceptedCheckYourParameters: '恕不能採用此佈局。請檢查您的參數設置。',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: '優化',\r\n Parameters: '參數',\r\n Variables: '變量',\r\n Constants: '常量',\r\n GeneticAlgorithm: '遺傳算法',\r\n GeneticAlgorithmSettings: '遺傳算法設定',\r\n ParticleSwarmOptimization: '粒子群優化',\r\n ParticleSwarmOptimizationSettings: '粒子群優化設定',\r\n SolarPanelTiltAngleOptimization: '光伏板傾斜角度優化',\r\n SolarPanelArrayLayout: '光伏板陣列佈局',\r\n Generation: '世代',\r\n Gene: '基因',\r\n NormalizedVariables: '標準化變量',\r\n Objective: '目標函數',\r\n ObjectiveFunctionDailyTotalYield: '當日總產出',\r\n ObjectiveFunctionYearlyTotalYield: '全年總產出',\r\n ObjectiveFunctionDailyMeanYield: '當日平均產出',\r\n ObjectiveFunctionYearlyMeanYield: '全年平均產出',\r\n ObjectiveFunctionDailyProfit: '當日利潤',\r\n ObjectiveFunctionYearlyProfit: '全年利潤',\r\n GeneticAlgorithmSelectionMethod: '遺傳算法選擇方法',\r\n RouletteWheel: '輪盤制',\r\n Tournament: '淘汰制',\r\n SearchMethod: '搜索方法',\r\n GlobalSearchUniformSelection: '全局搜索均勻取樣',\r\n LocalSearchRandomOptimization: '局部搜索隨機優化',\r\n PopulationSize: '種群個體數目',\r\n MaximumGenerations: '最大世代數目',\r\n SelectionRate: '選擇概率',\r\n CrossoverRate: '交配概率',\r\n MutationRate: '突變概率',\r\n Step: '步數',\r\n SwarmSize: '粒子數目',\r\n MaximumSteps: '最大步數',\r\n MaximumVelocity: '最大速度',\r\n InertiaWeight: '慣性權重',\r\n CognitiveCoefficient: '認知係數',\r\n SocialCoefficient: '社會係數',\r\n ConvergenceThreshold: '終止條件的收斂閾值',\r\n LocalSearchRadius: '局部搜索的半徑',\r\n RowsPerRackRange: '單個支架上光伏板行數的變化範圍',\r\n TiltAngleRange: '光伏板傾斜角度的變化範圍',\r\n InterRowSpacingRange: '光伏板陣列行間距的變化範圍',\r\n ClickTargetPolygonToActivate: '點擊目標多邊形激活',\r\n ClickTargetFoundationToActivate: '點擊目標地基激活',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: '顯示近似模型',\r\n Flip: '翻轉',\r\n Type: '樹種',\r\n Spread: '樹冠直徑',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: '翻轉',\r\n Type: '品種',\r\n Spread: '直徑',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: '改變人物',\r\n Flip: '轉身',\r\n Observer: '觀察者',\r\n ViewFromThisPerson: '視角移到此人位置',\r\n },\r\n\r\n lightMenu: {\r\n Color: '顏色',\r\n Intensity: '亮度',\r\n Decay: '衰减',\r\n MaximumDistance: '最大距離',\r\n Inside: '内部',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: '相對方位角',\r\n Pole: '支柱',\r\n PoleHeight: '支柱高度',\r\n PoleRadius: '支柱半徑',\r\n ExtraPoleHeight: '額外的支柱高度',\r\n ExtraPoleHeightInAdditionToHalfWidth: '寬度一半額外的支柱高度',\r\n DrawSunBeam: '顯示光束',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: '反射器鏡面反射率',\r\n ReceiverAbsorptance: '接收器吸收率',\r\n ReflectorOpticalEfficiency: '反射器光效率',\r\n ReceiverThermalEfficiency: '接收器熱效率',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: '逆變器效率',\r\n InverterEfficiencyExplained: '直流電轉換為交流電的效率。',\r\n DcToAcSizeRatio: '直流-交流容量比例',\r\n DcToAcSizeRatioExplained: '直流電容量和交流電容量的比例。',\r\n ChangePvModel: '改變光伏板型號',\r\n Orientation: '排列方向',\r\n Portrait: '縱向',\r\n Landscape: '橫向',\r\n FrameColor: '框架顏色',\r\n Panels: '塊',\r\n PanelsWide: '塊光伏板寬',\r\n PanelsLong: '塊光伏板長',\r\n TiltAngle: '傾斜角度',\r\n SouthFacingIsPositive: '朝南為正',\r\n Tracker: '追日系統',\r\n SolarTrackerFollowsSun: '追日系統提高光伏板產出。',\r\n PoleSpacing: '支柱間隔',\r\n NoTracker: '無追日系統',\r\n HorizontalSingleAxisTracker: '水平單軸追日系統',\r\n VerticalSingleAxisTracker: '豎直單軸追日系統',\r\n AltazimuthDualAxisTracker: '地平雙軸追日系統',\r\n OnlyThisSolarPanel: '只這個光伏板',\r\n AllSolarPanelsOnSurface: '同一表面上所有的光伏板',\r\n AllSolarPanelsAboveFoundation: '同一地基上所有的光伏板',\r\n AllSelectedSolarPanels: '所有選中的光伏板',\r\n AllSolarPanels: '所有的光伏板',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: '光伏板型號性能',\r\n Model: '型號',\r\n PanelSize: '尺寸',\r\n Cells: '電池組',\r\n CellType: '光伏電池類型',\r\n Monocrystalline: '單晶矽',\r\n Polycrystalline: '多晶矽',\r\n ThinFilm: '薄膜',\r\n Bifacial: '雙面',\r\n BifacialityFactor: '雙面性因子',\r\n Black: '黑色',\r\n Blue: '藍色',\r\n ShadeTolerance: '陰影耐受度',\r\n SolarCellEfficiency: '光伏電池效率',\r\n NominalOperatingCellTemperature: '名義電池運行溫度',\r\n TemperatureCoefficientOfPmax: 'Pmax溫度係數',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: '模塊長度',\r\n Modules: '模塊',\r\n ModulesLong: '模塊長',\r\n LatusRectum: '通徑',\r\n OnlyThisParabolicTrough: '只這個拋物線槽',\r\n AllParabolicTroughsAboveFoundation: '同一地基上所有的拋物線槽',\r\n AllSelectedParabolicTroughs: '所有選中的抛物线槽',\r\n AllParabolicTroughs: '所有的拋物線槽',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: '吸收管',\r\n SelectAbsorberToReflectSunlightTo: '選擇陽光反射到的吸收管',\r\n ModuleLength: '模塊長度',\r\n Modules: '模塊',\r\n ModulesLong: '模塊長',\r\n OnlyThisFresnelReflector: '只這個菲涅耳反射鏡',\r\n AllFresnelReflectorsAboveFoundation: '同一地基上所有的菲涅耳反射鏡',\r\n AllSelectedFresnelReflectors: '所有選中的菲涅耳反射镜',\r\n AllFresnelReflectors: '所有的菲涅耳反射鏡',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: '吸收塔',\r\n SelectTowerToReflectSunlightTo: '選擇陽光反射到的吸收塔',\r\n OnlyThisHeliostat: '只這個定日鏡',\r\n AllHeliostatsAboveFoundation: '同一地基上所有的定日鏡',\r\n AllSelectedHeliostats: '所有選中的定日镜',\r\n AllHeliostats: '所有的定日鏡',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: '接收器結構',\r\n CentralPole: '中心直柱',\r\n CentralPoleWithTripod: '三腳架和中心直柱',\r\n Quadrupod: '四脚架',\r\n RimDiameter: '外圈直徑',\r\n LatusRectum: '通徑',\r\n ExtraPoleHeightInAdditionToRadius: '半徑之外額外的支架高度',\r\n OnlyThisParabolicDish: '只這個拋物線碟',\r\n AllParabolicDishesAboveFoundation: '同一地基上所有的拋物線碟',\r\n AllSelectedParabolicDishes: '所有選中的抛物线碟',\r\n AllParabolicDishes: '所有的拋物線碟',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: '默認材質',\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n SizeOfWall: '牆的尺寸',\r\n OnlyThisWall: '只這堵牆',\r\n AllConnectedWalls: '所有連接的牆',\r\n AllWallsAboveFoundation: '同一地基上所有的牆',\r\n AllSelectedWalls: '所有選中的墙',\r\n AllWalls: '所有的牆',\r\n Windows: '窗戶',\r\n LockAllWindows: '固定所有的窗戶',\r\n UnlockAllWindows: '解除所有的窗戶固定',\r\n RemoveAllUnlockedWindows: '刪除這堵牆上所有非固定的窗戶',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: '你確定刪除這堵牆上所有非固定的窗戶嗎',\r\n Doors: '門',\r\n RemoveAllUnlockedDoors: '刪除這堵牆上所有非固定的門',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: '你確定刪除這堵牆上所有非固定的門嗎',\r\n SolarPanels: '光伏板',\r\n LockAllSolarPanels: '固定所有的光伏板',\r\n UnlockAllSolarPanels: '解除所有的光伏板固定',\r\n RemoveAllUnlockedSolarPanels: '刪除這堵牆上所有非固定的光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: '你確定刪除這堵牆上所有非固定的光伏板嗎',\r\n Sensors: '傳感器',\r\n LockAllSensors: '固定所有的傳感器',\r\n UnlockAllSensors: '解除所有的傳感器固定',\r\n RemoveAllUnlockedSensors: '刪除這堵牆上所有非固定的傳感器',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: '你確定刪除這堵牆上所有非固定的傳感器嗎',\r\n Lights: '電燈',\r\n RemoveAllUnlockedLights: '刪除這堵牆上所有非固定的電燈',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: '你確定刪除這堵牆上所有非固定的電燈嗎',\r\n LockAllPolygons: '固定這堵牆上所有的多邊形',\r\n UnlockAllPolygons: '解除這堵牆上所有的多邊形固定',\r\n RemoveAllUnlockedPolygons: '刪除這堵牆上所有非固定的多邊形',\r\n WallStructure: '牆結構',\r\n DefaultStructure: '默認',\r\n StudStructure: '牆柱',\r\n PillarStructure: '圓柱',\r\n Opacity: '遮光度',\r\n StructureSpacing: '結構間距',\r\n StructureWidth: '結構寬度',\r\n StructureThickness: '結構厚度',\r\n StructureColor: '結構颜色',\r\n Color: '牆体颜色',\r\n Height: '高度',\r\n Thickness: '厚度',\r\n Texture: '材質',\r\n AllLightsOnWallInside: '所有電燈在牆內',\r\n AllLightsOnWallOutside: '所有電燈在牆外',\r\n Fill: '填充',\r\n Full: '全部',\r\n Partial: '部分',\r\n Empty: '空白',\r\n OpenToOutside: '對外面開放',\r\n EavesLength: '屋簷延伸長度',\r\n Parapet: '女牆',\r\n ParapetColor: '女牆颜色',\r\n ParapetTexture: '女牆材質',\r\n ParapetHeight: '女牆高度',\r\n CopingsHeight: '頂蓋高度',\r\n CopingsWidth: '頂蓋寬度',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: '只這個窗戶',\r\n AllWindowsOnSurface: '同一表面上所有的窗戶',\r\n AllWindowsAboveFoundation: '同一地基上所有的窗戶',\r\n AllSelectedWindows: '所有選中的窗户',\r\n AllWindows: '所有的窗戶',\r\n Width: '寬度',\r\n Height: '高度',\r\n Setback: '離牆體外表面的距離',\r\n RelativeToWallThickness: '相對於牆的厚度',\r\n Mullion: '直櫺',\r\n HorizontalMullion: '水平的直櫺',\r\n VerticalMullion: '豎直的直櫺',\r\n MullionWidth: '直櫺寬度',\r\n HorizontalMullionSpacing: '水平直櫺的間距',\r\n VerticalMullionSpacing: '豎直直櫺的間距',\r\n MullionColor: '直櫺颜色',\r\n Tint: '著色',\r\n Opacity: '不透明度',\r\n SolarHeatGainCoefficient: '太陽輻射熱獲取係數(SHGC) = 1 - 不透明度',\r\n Shutter: '百葉窗',\r\n LeftShutter: '左側百葉窗',\r\n RightShutter: '右側百葉窗',\r\n BothShutters: '兩側百葉窗',\r\n ShutterWidth: '相對寬度',\r\n ShutterColor: '百葉窗顏色',\r\n Frame: '邊框',\r\n FrameWidth: '邊框寬度',\r\n SillWidth: '窗台寬度',\r\n Color: '邊框顔色',\r\n WindowType: '窗戶種類',\r\n Default: '默認',\r\n Arched: '拱形',\r\n Polygonal: '多邊形',\r\n Interior: '内窗',\r\n Empty: '空白',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: '默認材質',\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n OnlyThisRoof: '只這個屋顶',\r\n AllRoofsAboveFoundation: '同一地基上所有的屋顶',\r\n AllSelectedRoofs: '所有選中的屋顶',\r\n AllRoofs: '所有的屋顶',\r\n OnlyThisCeiling: '只這個天花板',\r\n AllCeilingsAboveFoundation: '同一地基上所有的天花板',\r\n AllCeilings: '所有的天花板',\r\n EavesOverhangLength: '屋簷延伸長度',\r\n RafterSpacing: '屋椽間距',\r\n RafterWidth: '屋椽寬度',\r\n RafterThickness: '屋椽厚度',\r\n RafterColor: '屋椽颜色',\r\n RoofColor: '屋顶颜色',\r\n RoofSideColor: '屋顶側面颜色',\r\n GlassTint: '玻璃顏色',\r\n Opacity: '遮光度',\r\n RoofStructure: '屋頂結構',\r\n DefaultStructure: '默認',\r\n RafterStructure: '屋椽',\r\n GlassStructure: '玻璃',\r\n SolarPanels: '光伏板',\r\n LockAllSolarPanels: '固定所有的光伏板',\r\n UnlockAllSolarPanels: '解除所有的光伏板固定',\r\n RemoveAllUnlockedSolarPanels: '刪除這個屋顶上所有非固定的光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: '你確定刪除這個屋顶上所有非固定的光伏板嗎',\r\n Windows: '天窗',\r\n LockAllWindows: '固定所有的天窗',\r\n UnlockAllWindows: '解除所有的天窗固定',\r\n RemoveAllUnlockedWindows: '刪除這個屋顶上所有非固定的天窗',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: '你確定刪除這個屋顶上所有非固定的天窗嗎',\r\n Sensors: '傳感器',\r\n LockAllSensors: '固定所有的傳感器',\r\n UnlockAllSensors: '解除所有的傳感器固定',\r\n RemoveAllUnlockedSensors: '刪除這個屋顶上所有非固定的傳感器',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: '你確定刪除這個屋顶上所有非固定的傳感器嗎',\r\n Lights: '電燈',\r\n RemoveAllUnlockedLights: '刪除這個屋顶上所有非固定的電燈',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: '你確定刪除這個屋顶上所有非固定的電燈嗎',\r\n AllLightsOnRoofInside: '所有電燈在屋頂內',\r\n AllLightsOnRoofOutside: '所有電燈在屋頂外',\r\n Rise: '相對高度',\r\n Ceiling: '天花板',\r\n RoofRValue: '屋顶R值',\r\n CeilingRValue: '天花板R值',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: '默認材質',\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n Texture11: '十一號材質',\r\n Texture12: '十二號材質',\r\n Texture13: '十三號材質',\r\n Texture14: '十四號材質',\r\n Texture15: '十五號材質',\r\n Texture16: '十六號材質',\r\n Texture17: '十七號材質',\r\n OnlyThisDoor: '只這個門',\r\n AllDoorsOnWall: '同一面牆上所有的門',\r\n AllDoorsAboveFoundation: '同一地基上所有的門',\r\n AllSelectedDoors: '所有選中的门',\r\n AllDoors: '所有的門',\r\n DoorType: '門種類',\r\n Default: '默認',\r\n Arched: '拱形',\r\n Filled: '填充',\r\n FrameColor: '門框顏色',\r\n Interior: '內門',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: '最高溫度',\r\n Low: '最低温度',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: '選中的定日鏡總數',\r\n NumberOfSelectedSolarPanels: '選中的光伏板總數',\r\n ElectricityGeneratedDailyBySolarPanels: '這些光伏板的日發電量',\r\n SceneDiameter: '場景直徑',\r\n BuildingArea: '建築面積',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: '熱圖顏色對比度',\r\n FluxScale: '熱通量長度',\r\n ClickUpOrDownArrowButtonsToChange: '點擊上下箭頭改變參數',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: '旋轉',\r\n DragMouse: '拖動滑鼠',\r\n Zoom: '缩放',\r\n MouseWheelOrKeys: '滑鼠滾輪或者Ctrl+[和Ctrl+]',\r\n MouseWheelOrKeysMac: '滑鼠滾輪或者⌘+[和⌘+]',\r\n Pan: '平移',\r\n HoldCtrlDragMouse: '按下Ctrl鍵並拖動滑鼠',\r\n HoldMetaDragMouse: '按下⌘鍵並拖動滑鼠',\r\n Enter2DMode: '進入二維模式',\r\n Exit2DMode: '退出二維模式',\r\n NavigationMode: '導航模式',\r\n EnableNavigation: '進入導航模式',\r\n DisableNavigation: '退出導航模式',\r\n MoveForwardBack: '前後移動',\r\n MoveForwardBackInstruction: '按W/S鍵',\r\n MoveLeftRight: '左右移動',\r\n MoveLeftRightInstruction: '按A/D鍵',\r\n MoveUpDown: '上下移動',\r\n MoveUpDownInstruction: '按Z/X鍵',\r\n Turn: '拐彎',\r\n TurnInstruction: '按方向鍵',\r\n ResetView: '重置視角',\r\n AutoRotate: '自動旋轉',\r\n StartOrStop: '按F4鍵啟動或停止',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: '地面顯示圖像',\r\n WeatherStations: '氣象站',\r\n WeatherStationsNote: '關閉此選項以提高地圖速度',\r\n Coordinates: '經緯度坐標',\r\n Zoom: '放大程度',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: '光伏板對觀察者的可見度',\r\n Observer: '觀察者',\r\n VantagePoint: '觀察位置',\r\n ItemizedVisibilityByFields: '每個場的可見度',\r\n TotalVisibility: '總可見度',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: '光傳感器',\r\n WeatherDataFrom: '氣象數據來自',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: '建築物日能耗',\r\n YearlyBuildingEnergy: '建築物年能耗',\r\n Heater: '暖氣',\r\n AC: '空調',\r\n SolarPanel: '光伏',\r\n Net: '淨能耗',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: '光伏日發電量',\r\n SolarPanelYearlyYield: '光伏年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualSolarPanels: '顯示每行光伏板單獨發電量',\r\n Profit: '利潤',\r\n TotalCost: '總成本',\r\n TotalRevenue: '總收入',\r\n TotalYield: '總發電量',\r\n MeanYield: '平均發電量',\r\n ModuleCount: '光伏板總數',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: '拋物線槽日發電量',\r\n ParabolicTroughYearlyYield: '拋物線槽年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualParabolicTroughs: '顯示每行拋物線槽單獨發電量',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: '拋物線碟日發電量',\r\n ParabolicDishYearlyYield: '拋物線碟年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualParabolicDishes: '顯示每個拋物線碟單獨發電量',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: '菲涅耳反射鏡日發電量',\r\n FresnelReflectorYearlyYield: '菲涅耳反射鏡年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualFresnelReflectors: '顯示每個菲涅耳反射鏡單獨發電量',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: '定日鏡日發電量',\r\n HeliostatYearlyYield: '定日鏡年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualHeliostats: '顯示每個定日鏡單獨發電量',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: '太陽能上升氣流塔日發電量',\r\n UpdraftTowerYearlyYield: '太陽能上升氣流塔年發電量',\r\n ChimneyAirTemperature: '煙囪空氣溫度',\r\n ChimneyWindSpeed: '煙囪風速',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualUpdraftTowers: '顯示每個太陽能上升氣流塔單獨發電量',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: '太陽和時間設置',\r\n SunAngles: '角度',\r\n TwentyFourHours: '24小時',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: '拷貝標題',\r\n TitleCopiedToClipBoard: '標題拷貝到剪貼板',\r\n SearchByTitle: '按標題搜索',\r\n MyLikes: '我喜歡的模型',\r\n MyCloudFiles: '我的雲文件',\r\n GenerateLink: '生成鏈接',\r\n LinkGeneratedInClipBoard: '鏈接生成到剪貼板',\r\n DoYouReallyWantToDelete: '您確定刪除此文檔',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks: '如果此文檔已被分享或發布, 改名會使已有鏈接失效',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: '拷貝標題',\r\n TitleCopiedToClipBoard: '標題拷貝到剪貼板',\r\n SearchByTitle: '按標題搜索',\r\n MyProjects: '我的項目',\r\n GenerateProjectLink: '生成項目鏈接',\r\n ProjectLinkGeneratedInClipBoard: '項目鏈接生成到剪貼板',\r\n DoYouReallyWantToDeleteProject: '您確定刪除項目',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks: '如果此項目已被分享或發布, 改名會使已有鏈接失效',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: '項目設定',\r\n ThumbnailImageSize: '縮略圖大小',\r\n ProjectByOtherPeople: '別人的項目',\r\n Project: '項目',\r\n ProjectType: '類别',\r\n ProjectDescription: '描述',\r\n MakeDescriptionEditable: '編輯描述',\r\n MakeDescriptionNonEditable: '不編輯描述',\r\n DoubleClickToMakeDescriptionEditable: '雙擊此描述激活編輯功能',\r\n SolarPanelArray: '光伏板陣列設計',\r\n CurateCurrentDesign: '收藏當前設計',\r\n UpdateSelectedDesign: '更新選中設計',\r\n RemoveSelectedDesign: '刪除選中設計',\r\n ClickToFlipSortingOrder: '點擊逆轉排序方向',\r\n DesignNotShownInSolutionSpaceClickToShow: '此設計目前不顯示在設計空間內,點擊顯示',\r\n DesignShownInSolutionSpaceClickToHide: '此設計目前顯示在設計空間內,點擊隱藏',\r\n DistributionInSolutionSpace: '方案在設計空間裡的分佈',\r\n ChooseSolutionSpace: '選擇設計空間',\r\n ChooseDataColoring: '選擇數據著色',\r\n SameColorForAllDesigns: '所有設計一個顏色',\r\n OneColorForEachDesign: '每個設計一個顏色',\r\n SolutionSpaceScreenshot: '設計空間截圖',\r\n ScatteredPlotScreenshot: '散點圖截圖',\r\n SingleClickToSelectDoubleClickToOpen: '單擊選擇,雙擊打開。',\r\n SingleClickToDeselectDoubleClickToOpen: '單擊取消選擇,雙擊打開。',\r\n GenerateScatteredPlot: '生成散點圖',\r\n SelectXAxis: '選擇X軸',\r\n SelectYAxis: '選擇Y軸',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: '我的賬戶設定',\r\n MyID: '我的🆔',\r\n ClickToCopyMyID: '點擊此處拷貝我的ID',\r\n IDInClipBoard: '您現在可以粘貼ID了。',\r\n StoreMyNameInMyFilesWhenSaving: '保存文檔時籤上我的大名',\r\n DoYouReallyWantToShowYourNameInYourFiles: '您確定在您的文檔裡保存您的大名嗎?',\r\n SignFileDisclaimer: '如果您選擇保存,您的大名可能被所有打開您的文檔的人看到。',\r\n Likes: '點贊總數',\r\n AllPublished: '發佈總數',\r\n PublishedUnderAliases: '别名發佈',\r\n UserCount: '用戶總數',\r\n SchoolID: '學校編號',\r\n ClassID: '班級編號',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: '日照時間',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: '選擇氣溫模型',\r\n Sinusoidal: '正弦函數',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: '經濟學參數',\r\n ElectricitySellingPrice: '銷售電價',\r\n OperationalCostPerUnit: '單位運行成本',\r\n SellingPrice: '銷售電價',\r\n UnitCost: '單位成本',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: '導航模式參數',\r\n MinimumMoveSpeed: '最小移動速度',\r\n MinimumTurnSpeed: '最小拐彎速度',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: '天空清晰度',\r\n ShowDaylightResults: '顯示日照時間結果',\r\n ShowSkyClearnessResults: '顯示天空清晰度結果',\r\n ShowAverageDailySolarRadiation: '顯示日平均輻射結果',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: '沒有傳感器收集數據。',\r\n NoSolarPanelForAnalysis: '沒有光伏板可以分析。',\r\n NoObserverForVisibilityAnalysis: '沒有找到可見度分析的觀察者。',\r\n NoWaterHeaterForAnalysis: '沒有太陽能熱水器可以分析。',\r\n NoParabolicDishForAnalysis: '沒有拋物線碟可以分析。',\r\n NoParabolicTroughForAnalysis: '沒有拋物線槽可以分析。',\r\n NoFresnelReflectorForAnalysis: '沒有菲涅耳反射鏡可以分析。',\r\n NoHeliostatForAnalysis: '沒有定日鏡可以分析。',\r\n NoSolarUpdraftTowerForAnalysis: '沒有太陽能上升氣流塔可以分析。',\r\n NoBuildingForAnalysis: '沒有建築物可以分析。',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: '雲文檔',\r\n Select: '選擇',\r\n AddFoundation: '添加地基',\r\n AddWall: '添加牆體',\r\n AddWindow: '添加窗戶',\r\n AddDoor: '添加門',\r\n AddPyramidRoof: '添加金字塔屋頂',\r\n AddGableRoof: '添加雙坡屋頂',\r\n AddHipRoof: '添加四坡屋顶',\r\n AddGambrelRoof: '添加复斜屋顶',\r\n AddMansardRoof: '添加折線屋顶',\r\n AddCuboid: '添加長方體',\r\n AddSensor: '添加傳感器',\r\n AddSolarPanel: '添加光伏板',\r\n AddWaterHeater: '添加太陽能熱水器',\r\n AddParabolicDish: '添加拋物線碟',\r\n AddParabolicTrough: '添加拋物線槽',\r\n AddFresnelReflector: '添加菲涅耳反射鏡',\r\n AddHeliostat: '添加定日鏡',\r\n AddWindTurbine: '添加風力渦輪機',\r\n AddLight: '添加電燈',\r\n AddTree: '添加樹木',\r\n AddFlower: '添加花草',\r\n AddPeople: '添加人物',\r\n DoubleClickToLockThisModeForNextAction: '雙擊按鈕給下個動作鎖定此模式',\r\n ClickToUnlockThisModeForNextAction: '點擊按鈕讓動作完成即離開此模式',\r\n ManipulateGroup: '整體操作一個組',\r\n ClearScene: '清空場景',\r\n ShowSunAndTimeSettings: '顯示太陽和時間設置',\r\n SpatialAnalysisOfEnergy: '能量的空間分析',\r\n DoYouReallyWantToClearContent: '您確定清空場景嗎',\r\n ClickForMoreButtons: '點擊此處切換到更多的按鈕模式',\r\n SwitchToAddingFoundation: '切換到添加地基模式',\r\n SwitchToAddingCuboid: '切換到添加長方體模式',\r\n SwitchToAddingWall: '切換到添加牆體模式',\r\n SwitchToAddingWindow: '切換到添加窗戶模式',\r\n SwitchToAddingDoor: '切換到添加門模式',\r\n SwitchToAddingPyramidRoof: '切換到添加金字塔屋頂模式',\r\n SwitchToAddingGableRoof: '切換到添加雙坡屋頂模式',\r\n SwitchToAddingHipRoof: '切換到添加四坡屋頂模式',\r\n SwitchToAddingGambrelRoof: '切換到添加复斜屋頂模式',\r\n SwitchToAddingMansardRoof: '切換到添加折線屋頂模式',\r\n SwitchToAddingSolarPanel: '切換到添加光伏板模式',\r\n SwitchToAddingSensor: '切換到添加傳感器模式',\r\n SwitchToAddingWaterHeater: '切換到添加太陽能熱水器模式',\r\n SwitchToAddingParabolicDish: '切換到添加拋物線碟模式',\r\n SwitchToAddingParabolicTrough: '切換到添加拋物線槽模式',\r\n SwitchToAddingFresnelReflector: '切換到添加菲涅耳反射鏡模式',\r\n SwitchToAddingHeliostat: '切換到添加定日鏡模式',\r\n SwitchToAddingWindTurbine: '切換到添加風力渦輪機模式',\r\n SwitchToAddingLight: '切換到添加電燈模式',\r\n SwitchToAddingTree: '切換到添加樹木模式',\r\n SwitchToAddingFlower: '切換到添加花草模式',\r\n SwitchToAddingPeople: '切換到添加人物模式',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: '訪問未來智能研究所',\r\n visitAladdinHomePage: '訪問阿拉丁主頁',\r\n clickToOpenMenu: '點擊打開主菜單',\r\n clickToAccessAccountSettings: '點擊打開賬號設定',\r\n },\r\n\r\n tree: {\r\n Apple: '蘋果樹',\r\n Birch: '白樺',\r\n Coconut: '椰子樹',\r\n Dogwood: '茱萸',\r\n Elm: '榆樹',\r\n FanPalm: '扇葉棕櫚',\r\n Linden: '菩提',\r\n Magnolia: '玉蘭',\r\n Maple: '楓樹',\r\n Oak: '橡樹',\r\n Pine: '松樹',\r\n Spruce: '雲杉',\r\n },\r\n\r\n flower: {\r\n Bellflower: '鈴蘭',\r\n Boxwood: '黃楊',\r\n CactusCombo1: '仙人掌組合一',\r\n CactusCombo2: '仙人掌組合二',\r\n CactusCombo3: '仙人掌組合三',\r\n CactusCombo4: '仙人掌組合四',\r\n Hibiscus: '木槿',\r\n Hosta: '玉簪',\r\n Hydrangea: '繡球花',\r\n Peony: '牡丹',\r\n RedRose: '紅玫瑰',\r\n Spirea: '繡線菊',\r\n Sunflower: '向日葵',\r\n TallBush: '高灌木',\r\n Tulip: '鬱金香',\r\n WhiteFlower: '白花',\r\n YellowFlower: '黄花',\r\n },\r\n\r\n people: {\r\n Jaah: '賈阿',\r\n Jack: '傑克',\r\n Jacob: '雅各布',\r\n Jacqueline: '杰奎琳',\r\n Jade: '美玉',\r\n Jamelia: '潔米莉雅',\r\n James: '詹姆斯',\r\n Jane: '簡',\r\n Jaya: '佳婭',\r\n Jaye: '傑伊',\r\n Jeanette: '珍妮特',\r\n Jedi: '傑迪',\r\n Jeff: '傑夫',\r\n Jena: '珍娜',\r\n Jennifer: '珍尼弗',\r\n Jess: '傑西',\r\n Jett: '傑特',\r\n Jill: '吉爾',\r\n Jiya: '吉娅',\r\n Joan: '瓊',\r\n Jocelyn: '喬斯林',\r\n Joel: '喬爾',\r\n Joey: '喬伊',\r\n John: '約翰',\r\n Jonathon: '喬納森',\r\n Jose: '何塞',\r\n Joseph: '約瑟夫',\r\n Joshua: '約書亞',\r\n Judd: '賈德',\r\n Judy: '朱蒂',\r\n Julia: '朱莉婭',\r\n Julio: '胡里奥',\r\n Jumapili: '祖瑪匹莉',\r\n June: '準衛',\r\n Juro: '朱諾',\r\n Justin: '賈斯汀',\r\n },\r\n\r\n compass: {\r\n N: '北',\r\n S: '南',\r\n W: '西',\r\n E: '東',\r\n },\r\n\r\n month: {\r\n January: '一月',\r\n February: '二月',\r\n March: '三月',\r\n April: '四月',\r\n May: '五月',\r\n June: '六月',\r\n July: '七月',\r\n August: '八月',\r\n September: '九月',\r\n October: '十月',\r\n November: '十一月',\r\n December: '十二月',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: '按發布者搜索',\r\n SearchByLabel: '按標籤搜索',\r\n MyPublishedModels: '我發布的模型',\r\n TotalNumberOfUserPublishedModels: '用戶發布的模型總數',\r\n SortFromOldestToNewest: '從早到晚排序',\r\n SortFromNewestToOldest: '從晚到早排序',\r\n ModelsFoundOnThisSite: '個模型在此位置',\r\n ShowModelsPublishedByThisAuthor: '展示此用戶發布的模型',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_es = {\r\n translation: {\r\n name: {\r\n IFI: 'Instituto de inteligencia futura',\r\n Aladdin: 'Aladdin',\r\n Tagline: 'Aladdin: Reimagining Design with Explainable AI — Institute for Future Intelligence',\r\n },\r\n\r\n cookie: {\r\n Statement: 'Clicando Aceptar, autoriza el uso de cookies para mejora la experiencia con Aladdin',\r\n Accept: 'Aceptar',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: 'Este producto esta hecho por',\r\n TermsOfService: 'Términos de servicio',\r\n PrivacyPolicy: 'Política de privacidad',\r\n Software: 'Programa',\r\n Content: 'Contenido',\r\n Research: 'Investigación',\r\n Support: 'Ayuda',\r\n Acknowledgment: 'Agradecimientos',\r\n FundingInformation:\r\n 'La National Science Foundation (NSF) proporcionó generosamente fondos para la investigación y el desarrollo de este producto a través de las subvenciones con número #2105695, #2131097, y #2301164. Sin embargo, todas las opiniones, hallazgos y conclusiones o recomendaciones expresados en este producto pertenecen a los autores y no reflejan necesariamente los puntos de vista de la NSF.',\r\n Contact: 'Para más información, por favor contacte con Charles Xie (charles@intofuture.org).',\r\n Translators: 'Translators',\r\n },\r\n\r\n word: {\r\n LastUpdate: 'Last Update',\r\n Small: 'Small',\r\n Medium: 'Medium',\r\n Large: 'Large',\r\n Design: 'Design',\r\n Information: 'Information',\r\n Type: 'Type',\r\n Text: 'Text',\r\n FontSize: 'Font Size',\r\n FontColor: 'Font Color',\r\n Model: 'Model',\r\n Models: 'Models',\r\n Upload: 'Upload',\r\n ClickCount: 'Click Count',\r\n Share: 'Share',\r\n AlreadyLike: 'Already like',\r\n Like: 'Like',\r\n MustLogInToLike: 'Must log in to like',\r\n AllRightsReserved: 'Todos los derechos reservados',\r\n MeterAbbreviation: 'm',\r\n Version: 'Versión',\r\n VersionInitial: 'V',\r\n Options: 'Opciones',\r\n Maximum: 'Maximum',\r\n Minimum: 'Minimum',\r\n MaximumNumber: 'Número máximo',\r\n MinimumNumber: 'Minimum Number',\r\n MaximumValue: 'Maximum Value',\r\n MinimumValue: 'Minimum Value',\r\n Or: 'O',\r\n None: 'Ninguno',\r\n High: 'High',\r\n Partial: 'Partial',\r\n Teacher: 'Profesor',\r\n Class: 'Clase',\r\n Total: 'Total',\r\n Leaderboard: 'Leaderboard',\r\n Latest: 'Latest',\r\n Range: 'Rango',\r\n SIUnit: 'SI Unit',\r\n USUnit: 'US Unit',\r\n ThermalTransmittance: 'Thermal Transmittance',\r\n ThermalResistance: 'Thermal Resistance',\r\n UValue: 'U-Value',\r\n RValue: 'R-Value',\r\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\r\n BuildingHVACSystem: 'Building HVAC System',\r\n ThermostatSetpoint: 'Thermostat Setpoint',\r\n TemperatureToleranceThreshold: 'Tolerance Threshold',\r\n TemperatureToleranceThresholdExplanation:\r\n 'Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.',\r\n Press: 'Press',\r\n Open: 'Abrir',\r\n Save: 'Guardar',\r\n SaveAsImage: 'Guardar como imagen',\r\n SaveAsCsv: 'Save as CSV',\r\n Update: 'Actualizar',\r\n Paste: 'Pegar',\r\n Copy: 'Copiar',\r\n Cut: 'Cortar',\r\n Delete: 'Eliminar',\r\n Lock: 'Cerrar con llave',\r\n Translucent: 'Translucent',\r\n Color: 'Color',\r\n Texture: 'Textura',\r\n Size: 'Tamaño',\r\n Thickness: 'Grosor',\r\n Yes: 'Sí',\r\n No: 'No',\r\n OK: 'OK',\r\n Cancel: 'Cancelar',\r\n Apply: 'Aplicar',\r\n Close: 'Cerrar',\r\n ApplyTo: 'Aplicar a',\r\n Run: 'Run',\r\n Pause: 'Pause',\r\n Resume: 'Resume',\r\n Clear: 'Limpiar',\r\n Warning: 'Aviso',\r\n Caution: 'Caution',\r\n Reminder: 'Reminder',\r\n Length: 'Longitud',\r\n Width: 'Ancho',\r\n Height: 'Altura',\r\n Radius: 'Radius',\r\n Angle: 'Ángulo',\r\n Azimuth: 'Azimut',\r\n Coordinates: 'Coordinates',\r\n Weather: 'Tiempo',\r\n Show: 'Mostrar',\r\n Animate: 'Animar',\r\n Date: 'Fecha',\r\n Time: 'Tiempo',\r\n Title: 'Título',\r\n Owner: 'Propietario',\r\n Action: 'Acción',\r\n Rename: 'Renombrar',\r\n Location: 'Location',\r\n Latitude: 'Latitud',\r\n Month: 'Mes',\r\n Day: 'Día',\r\n Hour: 'Hora',\r\n Daylight: 'Luz solar',\r\n Radiation: 'Radiación',\r\n Temperature: 'Temperatura',\r\n kWh: 'kWh',\r\n dollar: 'dollar',\r\n MeterPerSecond: 'm/s',\r\n NorthInitial: 'N',\r\n SouthInitial: 'S',\r\n EastInitial: 'E',\r\n WestInitial: 'O',\r\n Fixed: 'Fixed',\r\n Elements: 'Elements',\r\n Energy: 'Energy',\r\n Unknown: 'Unknown',\r\n Label: 'Label',\r\n Description: 'Description',\r\n NoDescription: 'No description',\r\n MaximumCharacters: 'Maximum characters',\r\n Author: 'Author',\r\n Publisher: 'Publisher',\r\n Building: 'Building',\r\n ResidentialBuilding: 'Residential Building',\r\n CommercialBuilding: 'Commercial Building',\r\n SchoolBuilding: 'School Building',\r\n TouristAttraction: 'Tourist Attraction',\r\n UnderConstruction: 'Under Construction',\r\n Photovoltaic: 'Photovoltaic',\r\n Anonymous: 'Anonymous',\r\n Nickname: 'Nickname',\r\n Pin: 'Pin',\r\n Unpin: 'Unpin',\r\n },\r\n\r\n shared: {\r\n NoTexture: 'Sin textura',\r\n FoundationElement: 'Bases',\r\n CuboidElement: 'Cuboide',\r\n PolygonElement: 'Polígon',\r\n SensorElement: 'Sensor',\r\n SolarPanelElement: 'Panel solar',\r\n WaterHeaterElement: 'Water Heater',\r\n ParabolicDishElement: 'Parabolic Dish',\r\n ParabolicTroughElement: 'Parabolic Trough',\r\n FresnelReflectorElement: 'Fresnel Reflector',\r\n HeliostatElement: 'Heliostat',\r\n WindTurbineElement: 'Wind Turbine',\r\n LightElement: 'Light',\r\n ElementLocked: 'Bloqueado',\r\n ModelType: 'Model Type',\r\n OutputBreakdown: 'Breakdown',\r\n MoreResults: 'More Results',\r\n },\r\n\r\n message: {\r\n ModelNotFound: 'Model not found',\r\n CannotSignIn: 'Cannot sign in',\r\n CannotSignOut: 'Cannot sign out',\r\n YourAccountWasCreated: 'Your account was created.',\r\n CannotCreateAccount: 'Cannot create an account',\r\n YourAccountSettingsWereSaved: 'Your account settings were saved.',\r\n CannotSaveYourAccountSettings: 'Cannot save your account settings',\r\n CannotSaveYourFileToCloud: 'Cannot save your file to the cloud',\r\n CannotCreateNewProject: 'Cannot create a new project',\r\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\r\n CannotOpenYourProjects: 'Cannot open your projects',\r\n CannotOpenProject: 'Cannot open the project',\r\n CannotDeleteProject: 'Cannot delete the project',\r\n CannotRenameProject: 'Cannot rename the project',\r\n CannotAddDesignToProject: 'Cannot add this design to the project',\r\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\r\n DesignRemovedFromProject: 'The design was successfully removed from the project',\r\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\r\n CannotUpdateProject: 'Cannot update the project',\r\n CannotFetchProjectData: 'Cannot fetch project data',\r\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\r\n CloudFileNotFound: 'The cloud file was not found',\r\n CannotLoadModelsOnMap: 'Cannot load models on map',\r\n CannotLoadLeaderboard: 'Cannot load leaderboard',\r\n CannotPublishModelOnMap: 'Cannot publish model on map',\r\n CannotLikeModelFromMap: 'Cannot like model from map',\r\n CannotDeleteModelFromMap: 'Cannot delete model from map',\r\n ModelDeletedFromMap: 'Model is deleted from map',\r\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\r\n CannotOpenCloudFile: 'Cannot open the cloud file',\r\n CannotReadCloudFile: 'Cannot read the cloud file',\r\n CannotWriteCloudFile: 'Cannot write the cloud file',\r\n CloudFileCopied: 'Cloud file copied',\r\n CannotOpenCloudFolder: 'Cannot open your cloud folder',\r\n CannotDeleteCloudFile: 'Cannot delete the cloud file',\r\n CannotRenameCloudFile: 'Cannot rename the cloud file',\r\n DoYouWantToSaveChanges: '¿Quieres guardar los cambios?',\r\n NotApplicableToSelectedAction: 'No se aplica a la acción seleccionada',\r\n ThisElementIsLocked: 'Este elemento está bloqueado',\r\n ThisCannotBeUndone: 'Esto no se puede deshacer',\r\n AzimuthOfNorthIsZero: 'Azimut del norte es 0°',\r\n CounterclockwiseAzimuthIsPositive: 'Hacia la izquierda es positivo',\r\n MoveCancelledBecauseOfOverlap: 'Move cancelled because of overlap.',\r\n MoveOutsideBoundaryCancelled: 'Move outside the boundary cancelled.',\r\n RotationCancelledBecauseOfOverlap: 'Rotation cancelled because of overlap.',\r\n RotationOutsideBoundaryCancelled: 'Rotation outside the boundary cancelled.',\r\n ResizingCancelledBecauseOfOverlap: 'Resizing cancelled because of overlap.',\r\n ResizingOutsideBoundaryCancelled: 'Resizing outside the boundary cancelled.',\r\n CannotPasteOutsideBoundary: 'Cannot paste outside this surface.',\r\n CannotPasteBecauseOfOverlap: 'Cannot paste because of overlap.',\r\n CannotMoveObjectTooFar: 'Cannot move object too far.',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\r\n 'Existing solar panels will be removed before applying the new layout.',\r\n DoYouWantToContinue: 'Do you want to continue?',\r\n SolarPanelsCannotIntersectWithGround: 'Solar panels cannot intersect with the ground.',\r\n SolarPanelsCannotOverlapWithOneAnother: 'Solar panels cannot overlap with one another.',\r\n ScreenshotSaved: 'A screenshot was saved.',\r\n CsvFileSaved: 'A CSV file was saved.',\r\n SimulationStarted: 'Simulation started.',\r\n SimulationCompleted: 'Simulation completed.',\r\n SimulationAborted: 'Simulation aborted.',\r\n SimulationPaused: 'Simulation paused.',\r\n CancelSimulation: 'Cancel simulation',\r\n PauseSimulation: 'Pause simulation',\r\n ResumeSimulation: 'Resume simulation',\r\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\r\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\r\n EvolutionStarted: 'Evolution started.',\r\n EvolutionCompleted: 'Evolution completed.',\r\n EvolutionAborted: 'Evolution aborted.',\r\n EvolutionPaused: 'Evolution paused.',\r\n EncounterEvolutionError: 'Encountered an evolution error.',\r\n CancelEvolution: 'Cancel evolution',\r\n PauseEvolution: 'Pause evolution',\r\n ResumeEvolution: 'Resume evolution',\r\n ConvergenceThresholdHasBeenReached: 'The convergence threshold has been reached.',\r\n MaximumNumberOfGenerationsHasBeenReached: 'The maximum number of generations has been reached.',\r\n MaximumNumberOfStepsHasBeenReached: 'The maximum number of steps has been reached.',\r\n ObjectiveFunctionTypeError:\r\n 'The current objective function is not supported by this operation. Please start from the menu.',\r\n WallsAreNotAtSameHeight: 'Walls are not at the same height.',\r\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\r\n WallsAreNotConnected: 'Walls are not connected.',\r\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\r\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\r\n BuildingRoofMissing: 'Building has a missing roof.',\r\n UnknownErrors: 'Unknown errors.',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: 'Analysis Options',\r\n option: {\r\n GridCellSize: 'Grid Cell Size',\r\n SamplingFrequency: 'Frecuencia de muestreo',\r\n TimesPerHour: 'Veces per hora',\r\n DaysPerYear: 'Days per Year',\r\n },\r\n mainMenu: 'Menu principal',\r\n cloudMenu: 'Menú en la nube',\r\n projectSubMenu: 'Project',\r\n project: {\r\n CreateNewProject: 'Create New Project',\r\n OpenProject: 'Open Project',\r\n SaveProjectAs: 'Save Project As',\r\n YouMustLogInToCreateProject: 'You must log in to create a new project',\r\n YouMustLogInToOpenProject: 'You must log in to open a project',\r\n },\r\n fileSubMenu: 'Archivo',\r\n file: {\r\n CreateNewFile: 'Crear nuevo archivo',\r\n OpenLocalFile: 'Abrir archivo local',\r\n SaveAsLocalFile: 'Guardar como archivo local',\r\n SavingAbortedMustHaveValidFileName: '!Error guardando! Debes tener un nombre de archivo válido',\r\n OpenCloudFile: 'Abrir archivo en la nube',\r\n SaveCloudFile: 'Guardar archivo en la nube',\r\n SaveAsCloudFile: 'Guardar como archivo en la nube',\r\n SavingAbortedMustHaveValidTitle: '!Error guardando! Debes tener un título válido para el archivo en la nube',\r\n ToSaveYourWorkPleaseSignIn: 'Para guardar tu trabajo, por favor regístrese.',\r\n TakeScreenshot: 'Hacer captura de pantalla',\r\n UseCloudFileName: 'Use Cloud File Name',\r\n PublishOnModelsMap: 'Publish on Models Map',\r\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\r\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\r\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\r\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\r\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\r\n },\r\n editSubMenu: 'Editar',\r\n edit: {\r\n Undo: 'Deshacer',\r\n Redo: 'Repetir',\r\n },\r\n viewSubMenu: 'Vista',\r\n view: {\r\n NavigationView: 'Navigation View',\r\n TwoDimensionalView: 'Vista 2D',\r\n ResetView: 'Resetear',\r\n ZoomIn: 'Acercar',\r\n ZoomOut: 'Alejar',\r\n AutoRotate: 'Auto rotación',\r\n ShowShadow: 'Mostrar sombra',\r\n ShowSurfaceShininess: 'Show Surface Shininess',\r\n TranslucentFloatingWindows: 'Translucent Floating Windows',\r\n accessoriesSubMenu: 'Accessories',\r\n accessories: {\r\n SiteInformation: 'Información del sitio',\r\n DesignInformation: 'Información de diseño',\r\n Instruction: 'Instrucción',\r\n StickyNote: 'Nota adhesiva',\r\n Note: 'Nota',\r\n },\r\n },\r\n settingsSubMenu: 'Settings',\r\n settings: {\r\n WeatherData: 'Datos del tiempo',\r\n DiurnalTemperature: 'Diurnal Temperature',\r\n Heliodon: 'Heliodon',\r\n SunAndTime: 'Sun & Time',\r\n },\r\n benchmarksSubMenu: 'Benchmarks',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: 'Solar Radiation Prediction vs. Measurement',\r\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\r\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\r\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\r\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\r\n },\r\n graph: {\r\n LineWidth: 'Line Width',\r\n SymbolSize: 'Symbol Size',\r\n BarCategoryGap: 'Bar Category Gap',\r\n ShowHorizontalGridLines: 'Show Horizontal Grid Lines',\r\n ShowVerticalGridLines: 'Show Vertical Grid Lines',\r\n },\r\n analysisSubMenu: 'Análisis',\r\n physicsSubMenu: 'Physics',\r\n physics: {\r\n DailySolarRadiationHeatmap: 'Daily Solar Radiation Heatmap',\r\n SolarRadiationHeatmapOptions: 'Solar Radiation Heatmap Options',\r\n SolarRadiationHeatmapGridCellSize: 'Solar Radiation Heatmap Grid Cell Size',\r\n SolarRadiationHeatmapMaxValue: 'Solar Radiation Heatmap Maximum Value',\r\n SolarRadiationHeatmapNoAnimation: 'No Animation for Static Model',\r\n ReflectionHeatmap: 'Reflection Heatmap',\r\n },\r\n sensorSubMenu: 'Sensores',\r\n sensor: {\r\n CollectDailyData: 'Recoger datos diarios',\r\n CollectYearlyData: 'Recoger datos anuales',\r\n SensorSimulationNoAnimation: 'No Animation for Collecting Sensor Data',\r\n },\r\n buildingSubMenu: 'Building',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\r\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\r\n },\r\n solarPanelSubMenu: 'Paneles solares',\r\n solarPanel: {\r\n AnalyzeDailyYield: 'Analizar el rendimiento diario',\r\n AnalyzeYearlyYield: 'Analizar el rendimiento anual',\r\n AnalyzeVisibility: 'Analyze Visibility',\r\n PanelDiscretization: 'Discretización del panel',\r\n Exact: 'Exacto',\r\n Approximate: 'Aproximado',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n VisibilityGridCellSize: 'View Factor Grid Cell Size',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n VisibilityAnalysisOptions: 'Visibility Analysis Options',\r\n SolarPanelSimulationNoAnimation: 'No Animation for Solar Panel Simulation',\r\n },\r\n parabolicTroughSubMenu: 'Parabolic Trough',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n parabolicDishSubMenu: 'Parabolic Dish',\r\n parabolicDish: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n fresnelReflectorSubMenu: 'Fresnel Reflector',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n heliostatSubMenu: 'Heliostat',\r\n heliostat: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n solarUpdraftTowerSubMenu: 'Solar Updraft Tower',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n SolarUpdraftTowerSimulationNoAnimation: 'No Animation for Solar Updraft Tower Simulation',\r\n },\r\n\r\n tutorialsSubMenu: 'Tutorials',\r\n\r\n solarEnergyScienceSubMenu: 'Solar Science',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: 'Ángulos solares relativos a un observador en el suelo',\r\n InsolationAndClimate: 'Insolation and Climate',\r\n SolarRadiationToBox: 'Radiación solar a una caja',\r\n },\r\n\r\n buildingScienceSubMenu: 'Building Science',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\r\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\r\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\r\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\r\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\r\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\r\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\r\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\r\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\r\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\r\n },\r\n\r\n buildingDesignSubMenu: 'Building Design',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: 'Cape Cod Style House with Shed Dormer',\r\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\r\n GableRoofVsHipRoof: 'Gable Roof vs. Hip Roof',\r\n ColonialVsSaltbox: 'Colonial vs. Saltbox',\r\n GambrelRoofVsMansardRoof: 'Gambrel Roof vs. Mansard Roof',\r\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\r\n DutchGableRoof: 'Dutch Gable Roof',\r\n GableAndValleyRoof: 'Gable and Valley Roof',\r\n ClerestoryRoof: 'Clerestory Roof',\r\n MonitorRoof: 'Monitor Roof',\r\n AFrameHouse: 'A-Frame House',\r\n HalfTimberedHouse: 'Half-Timbered House',\r\n AllBasicRoofTypes: 'All Basic Roof Types',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: 'Photovoltaic Solar Power',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: 'Effect of Tilt Angle',\r\n EffectOfAzimuthOfSolarPanel: 'Effect of Azimuth',\r\n SolarPanelTypes: 'Solar Panel Types',\r\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\r\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\r\n SolarTrackers: 'Seguidores solares',\r\n CoveringGroundWithSolarPanels: 'Why Just Covering the Ground with Solar Panels is not a Good Idea',\r\n InterRowSpacingOfSolarPanelArray: 'Effect of Inter-Row Spacing in a Solar Panel Array',\r\n EffectOfOrientationOfSolarPanels: 'Effect of Orientation of Solar Panels',\r\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: 'Concentrated Solar Power',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: 'Effect of Azimuth of a Parabolic Trough',\r\n EffectOfLatusRectumOfParabolicTrough: 'Effect of Latus Rectum of a Parabolic Trough',\r\n FocusSunlightWithParabolicDish: 'Focus Sunlight with a Parabolic Dish',\r\n LinearFresnelReflectors: 'Linear Fresnel Reflectors',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\r\n 'Effect of Absorber Pipe Height for Linear Fresnel Reflectors',\r\n EffectOfAzimuthOfLinearFresnelReflectors: 'Effect of Azimuth of Linear Fresnel Reflectors',\r\n LinearFresnelReflectorsWithTwoAbsorbers: 'Linear Fresnel Reflectors with Two Absorbers',\r\n CosineEfficiencyOfHeliostats: 'Cosine Efficiency of Heliostats',\r\n ShadowingAndBlockingOfHeliostats: 'Shadowing and Blocking of Heliostats',\r\n EffectSolarPowerTowerHeight: 'Effect of Solar Power Tower Height',\r\n SolarPowerTower: 'Solar Power Tower',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: 'Other Types of Solar Power',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: 'Solar Updraft Tower',\r\n },\r\n\r\n generativeDesignSubMenu: 'Generative Design',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\r\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\r\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\r\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\r\n },\r\n\r\n examplesSubMenu: 'Ejemplos',\r\n\r\n solarEnergySubMenu: 'Energía Solar',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: 'Rayo de sol y heliodon',\r\n RooftopSolarPanels: 'Rooftop Solar Panels',\r\n NevadaSolarOneParabolicTroughArray: 'Nevada Solar One Parabolic Trough Array',\r\n TooeleParabolicDishArray: 'Tooele Parabolic Dish Array',\r\n PS10SolarPowerTower: 'PS10 Solar Power Tower',\r\n TucsonLinearFresnelReflectors: 'Tucson Linear Fresnel Reflectors',\r\n SolarCanopyFormFactors: 'Solar Canopy Form Factors',\r\n SolarCanopyOverBleachers: 'Solar Canopy Over Bleachers',\r\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\r\n SolarBusStop: 'Solar Bus Stop',\r\n SolarFacadeTesla: 'Tesla Solar Façade',\r\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\r\n Floatovoltaics: 'Floatovoltaics',\r\n Agrivoltaics: 'Agrivoltaics',\r\n VegetativeBuffer: 'Vegetative Buffer',\r\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\r\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\r\n SolarPanelsOverCanalBakersfieldCA: 'Hypothetical Solar Panels Over Canal in Bakersfield, CA',\r\n SolarNoiseBarrierLexingtonMA: 'Hypothetical Solar Noise Barrier in Lexington, MA',\r\n HSATSolarTrackersRaleighNC: 'Horizontal Single Axis Trackers (HSAT) in Raleigh, NC',\r\n AADATSolarTrackersLancasterCA: 'Azimuth–Altitude Dual Axis Trackers (AADAT) in Lancaster, CA',\r\n SolarUpdraftTowerInCity: 'Solar Updraft Tower in City',\r\n },\r\n\r\n builtEnvironmentSubMenu: 'Built Environment',\r\n residentialBuildingsSubMenu: 'Residential Buildings',\r\n residentialBuildingExamples: {\r\n ColonialHouse: 'Colonial House',\r\n DutchColonialHouse: 'Dutch Colonial House',\r\n TShapedHouse: 'T-Shaped House',\r\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\r\n Solarium: 'Solarium',\r\n Church1: 'Church 1',\r\n Cathedral1: 'Cathedral 1',\r\n Cathedral2: 'Cathedral 2',\r\n Mosque1: 'Mosque 1',\r\n AdobeTaosHouse: 'Adobe Taos House',\r\n RanchHouse: 'Ranch House',\r\n BonnetHouse: 'Bonnet House',\r\n BarnStyleHouse: 'Barn Style House',\r\n ModernHouse: 'Modern House',\r\n ButterflyRoofHouse: 'Butterfly Roof House',\r\n },\r\n commercialBuildingsSubMenu: 'Commercial Buildings',\r\n commercialBuildingExamples: {\r\n WhiteHouse: 'White House',\r\n BilimMersinTurkiye: 'BILIM, Mersin, Turkiye',\r\n SpanishStyleHotel: 'Spanish Style Hotel',\r\n ApartmentBuilding: 'Apartment Building',\r\n OfficeBuilding: 'Edificio de oficinas',\r\n Hotel: 'Hotel',\r\n },\r\n buildingComplexesSubMenu: 'Building Complexes',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, VT',\r\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\r\n },\r\n urbanPlanningSubMenu: 'Urban Planning',\r\n urbanPlanningExamples: {\r\n Heatmap1: 'Heatmap',\r\n },\r\n otherBuildingsSubMenu: 'Other Buildings',\r\n otherBuildingExamples: {\r\n Greenhouse: 'Greenhouse',\r\n Pavilion: 'Pavilion in a Park',\r\n OctagonalPagoda: 'Octagonal Pagoda',\r\n OceanFront: 'Ocean Front',\r\n EgyptianPyramids: 'Egyptian Pyramids',\r\n MayanPyramid: 'Mayan Pyramid',\r\n SiOSePol: 'Si-o-se-pol',\r\n StackedCuboids: 'Stacked Cuboids',\r\n },\r\n\r\n artificialIntelligenceSubMenu: 'Artificial Intelligence',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: 'Optimizing the Tilt Angle of a Solar Panel Row',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Optimizing the Tilt Angles of Multiple Solar Panel Rows',\r\n SolarFarmGenerativeDesign: 'Solar Farm Generative Design',\r\n SolarFarmGenerativeDesignWithBlock: 'Solar Farm Generative Design in the Presence of a Block',\r\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Solar Farm Generative Design',\r\n },\r\n\r\n languageSubMenu: 'Idioma',\r\n publicSubMenu: 'Public',\r\n ModelsGallery: 'Models Gallery',\r\n ModelsMap: 'Models Map',\r\n AboutUs: 'Sobre nosotros',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: 'Configuraciones de la cuenta',\r\n PrivacyStatementTitle: 'User Privacy Protection Statement',\r\n PrivacyStatement:\r\n 'When you sign in, your Google ID is used to create and access your Aladdin account. Only a random alphanumeric string is stored in our database as a reference. No personally identifiable data such as your name or email is ever gathered. For more information, see our ',\r\n SignIn: 'Iniciar sesión',\r\n SignOut: 'Desconectar',\r\n IfYouAreAStudent: 'Si eres un estudiante',\r\n },\r\n\r\n skyMenu: {\r\n Axes: 'Ejes',\r\n Theme: 'Tema',\r\n ThemeDefault: 'Por defecto',\r\n ThemeDesert: 'Desierto',\r\n ThemeDune: 'Dune',\r\n ThemeForest: 'Bosque',\r\n ThemeGrassland: 'Campo',\r\n ThemeHill: 'Hill',\r\n ThemeLake: 'Lake',\r\n ThemeMountain: 'Mountain',\r\n ThemeRural: 'Rural',\r\n SunlightAttenuationCoefficientInAir: 'Sunlight Attenuation Coefficient in Air',\r\n ConvectiveCoefficientOfAir: 'Convective Coefficient of Air',\r\n HighestTemperatureTimeInMinutes: 'Highest Temperature Time (Minutes)',\r\n SelectSunAnglesToShow: 'Select Sun Angles to Show',\r\n ShowAzimuthAngle: 'Show Azimuth Angle',\r\n ShowElevationAngle: 'Show Elevation Angle',\r\n ShowZenithAngle: 'Show Zenith Angle',\r\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\r\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\r\n Vegetation: 'Vegetation',\r\n LeafOutDay: 'Leaf-Out Day',\r\n LeafOffDay: 'Leaf-Off Day',\r\n Albedo: 'Albedo',\r\n ImageOnGround: 'Imagen en el suelo',\r\n WaterSurface: 'Water Surface',\r\n RemoveAllUnlockedTrees: 'Eliminar todos los árboles',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedPeople: 'Eliminar toda la gente',\r\n RemoveAllUnlockedFoundations: 'Eliminar todos las bases',\r\n RemoveAllUnlockedCuboids: 'Eliminar todos los cuboides',\r\n DoYouReallyWantToRemoveAllPeople: 'Estás seguro que quieres eliminar a toda la gente who are not locked',\r\n DoYouReallyWantToRemoveAllTrees: 'Estás seguro que quieres eliminar todos los árboles that are not locked',\r\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\r\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\r\n DoYouReallyWantToRemoveAllFoundations: 'Estás seguro que quieres eliminar todas las bases that are not locked',\r\n DoYouReallyWantToRemoveAllCuboids: 'Estás seguro que quieres eliminar todos los cuboides that are not locked',\r\n LockAllElements: 'Lock All Elements',\r\n UnlockAllElements: 'Unlock All Elements',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: 'Etiqueta',\r\n LabelText: 'Label Text',\r\n LabelHeight: 'Label Height',\r\n LabelSize: 'Label Size',\r\n LabelFontSize: 'Font Size',\r\n LabelColor: 'Label Color',\r\n KeepShowingLabel: 'Seguir mostrando etiqueta',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: 'Eliminar todos los paneles solares',\r\n RemoveAllUnlockedParabolicTroughs: 'Remove All Unlocked Parabolic Troughs',\r\n RemoveAllUnlockedParabolicDishes: 'Remove All Unlocked Parabolic Dishes',\r\n RemoveAllUnlockedFresnelReflectors: 'Remove All Unlocked Fresnel Reflectors',\r\n RemoveAllUnlockedHeliostats: 'Remove All Unlocked Heliostats',\r\n RemoveAllUnlockedSensors: 'Eliminar todos los sensores',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n RemoveAllUnlockedWalls: 'Eliminar todas las paredes',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\r\n RemoveAllUnlockedHumans: 'Remove All Humans',\r\n RemoveAllUnlockedTrees: 'Remove All Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Rejillas',\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n SolarPanels: 'Paneles solares',\r\n SolarPanelArray: 'Solar Panel Array',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\r\n 'Estás seguro que quieres eliminar todos los paneles solares en esta base that are not locked',\r\n ParabolicTroughs: 'Parabolic Troughs',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\r\n 'Do you really want to remove all the parabolic troughs on this foundation that are not locked',\r\n ParabolicDishes: 'Parabolic Dishes',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\r\n 'Do you really want to remove all the parabolic dishes on this foundation that are not locked',\r\n FresnelReflectors: 'Fresnel Reflectors',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\r\n 'Do you really want to remove all the Fresnel reflectors on this foundation that are not locked',\r\n Heliostats: 'Heliostats',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\r\n 'Do you really want to remove all the heliostats on this foundation that are not locked',\r\n Sensors: 'Sensores',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\r\n 'Estás seguro que quieres eliminar todos los sensores de esta base',\r\n Lights: 'Lights',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation:\r\n 'Do you really want to remove all the lights on this foundation that are not locked',\r\n Walls: 'Paredes',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation:\r\n 'Estás seguro que quieres eliminar todas las paredes de esta base that are not locked',\r\n Windows: 'Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\r\n 'Do you really want to remove all the windows on this foundation that are not locked',\r\n Doors: 'Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\r\n 'Do you really want to remove all the doors on this foundation that are not locked',\r\n Polygons: 'Polígonos',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\r\n 'Estás seguro que quieres eliminar todos los polígonos de esta base that are not locked',\r\n Humans: 'Humans',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation:\r\n 'Do you really want to remove all the humans on this foundation who are not locked',\r\n Trees: 'Trees',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation:\r\n 'Do you really want to remove all the trees on this foundation that are not locked',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\r\n 'Do you really want to remove all the flowers on this foundation that are not locked',\r\n OnlyThisFoundation: 'Solamente esta base',\r\n AllConnectedFoundations: 'Todas las bases conectadas',\r\n AllSelectedFoundations: 'All Selected Foundations',\r\n AllFoundations: 'Todas las bases',\r\n AddPolygon: 'Añadir polígono',\r\n SolarStructure: 'Solar Structure',\r\n GroupMaster: 'Group Master',\r\n LockAllElementsOnThisFoundation: 'Lock All Elements on This Foundation',\r\n UnlockAllElementsOnThisFoundation: 'Unlock All Elements on This Foundation',\r\n GroundFloorRValue: 'Ground Floor R-Value',\r\n OnlyThisGroundFloor: 'Only This Ground Floor',\r\n AllGroundFloors: 'All Ground Floors',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: 'Receiver Tower for Heliostats',\r\n ReceiverTowerPhysicalProperties: 'Physical Properties of Receiver Tower',\r\n ReceiverTowerHeight: 'Height of Receiver Tower',\r\n ReceiverTowerRadius: 'Radius of Receiver Tower',\r\n ReceiverAbsorptance: 'Absorptance of Receiver',\r\n ReceiverOpticalEfficiency: 'Optical Efficiency of Receiver',\r\n ReceiverThermalEfficiency: 'Thermal Efficiency of Receiver',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: 'Absorber Pipe for Fresnel Reflectors',\r\n AbsorberPipePhysicalProperties: 'Physical Properties of Absorber Pipe',\r\n AbsorberHeight: 'Height of Absorber Pipe',\r\n AbsorberApertureWidth: 'Aperture Width of Absorber Pipe',\r\n AbsorberPipePoleNumber: 'Pole Number for Absorber Pipe',\r\n AbsorberAbsorptance: 'Absorptance of Absorber',\r\n AbsorberOpticalEfficiency: 'Optical Efficiency of Absorber',\r\n AbsorberThermalEfficiency: 'Thermal Efficiency of Absorber',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: 'Solar Updraft Tower',\r\n SolarUpdraftTowerPhysicalProperties: 'Physical Properties of Solar Updraft Tower',\r\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Tower Chimney Height',\r\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Tower Chimney Radius',\r\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Tower Collector Height',\r\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Tower Collector Radius',\r\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Tower Collector Transmissivity',\r\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Tower Collector Emissivity',\r\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Tower Discharge Coefficient',\r\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Tower Turbine Efficiency',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n RemoveAllUnlockedSolarPanels: 'Eliminar todos los paneles solares',\r\n RemoveAllUnlockedSensors: 'Eliminar todos los sensores',\r\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\r\n RemoveAllUnlockedHumans: 'Remove All Humans',\r\n RemoveAllUnlockedTrees: 'Remove All Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Rejillas',\r\n SolarPanels: 'Paneles solares',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\r\n 'Estás seguro que quieres eliminar todos los paneles solares de este cuboide that are not locked',\r\n Sensors: 'Sensores',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\r\n 'Estás seguro que quieres eliminar todos los sensores de este cuboide that are not locked',\r\n Polygons: 'Polígonos',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\r\n 'Estás seguro que quieres eliminar todos los polígonos de este cuboide that are not locked',\r\n Humans: 'Humans',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid:\r\n 'Do you really want to remove all the humans on this cuboid who are not locked',\r\n Trees: 'Trees',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid:\r\n 'Do you really want to remove all the trees on this cuboid that are not locked',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\r\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\r\n OnlyThisCuboid: 'Solamente este cuboide',\r\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\r\n AllCuboidsAboveSameBase: 'All Cuboids above Same Base',\r\n AllSelectedCuboids: 'All Selected Cuboids',\r\n AllCuboids: 'Todos los cuboides',\r\n OnlyThisSide: 'Solamente este lado',\r\n AllSidesOfThisCuboid: 'Todos los lados en este cuboide',\r\n AllSidesOfSelectedCuboids: 'All Sides of Selected Cuboids',\r\n AllSidesOfAllCuboids: 'Todos los lados en todos los cuboides',\r\n AddPolygon: 'Añadir polígono',\r\n Stackable: 'Stackable',\r\n GroupMaster: 'Group Master',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n TextBox: 'Text Box',\r\n FontOutlineColor: 'Font Outline Color',\r\n FontOutlineWidth: 'Font Outline Width',\r\n FontStrokeColor: 'Font Stroke Color',\r\n FontStrokeWidth: 'Font Stroke Width',\r\n NoOutline: 'No Outline',\r\n Shiny: 'Shiny',\r\n Filled: 'Rellenar',\r\n FillTexture: 'Rellenar textura',\r\n FillColor: 'Rellenar color',\r\n Opacity: 'Opacity',\r\n LineColor: 'Color de la línea',\r\n LineWidth: 'Line Width',\r\n LineStyle: 'Line Style',\r\n SolidLine: 'Solid Line',\r\n DashedLine: 'Dashed Line',\r\n DottedLine: 'Dotted Line',\r\n InsertVertexBeforeIndex: 'Añadir vértice antes del índice',\r\n InsertVertexAfterIndex: 'Añadir vértice después del índice',\r\n DeleteVertex: 'Eliminar vértice',\r\n OnlyThisPolygon: 'Solamente este polígono',\r\n AllPolygonsOnSurface: 'All Polygons on the Same Surface',\r\n AllPolygonsAboveFoundation: 'Todos los polígonos sobre la base',\r\n AllSelectedPolygons: 'All Selected Polygons',\r\n AllPolygons: 'Todos los polígonos',\r\n Layout: 'Layout',\r\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\r\n SolarPanelArrayLayoutParametricDesign: 'Solar Panel Array Layout: Parametric Design',\r\n SolarPanelArrayLayoutGenerativeDesign: 'Solar Panel Array Layout: Generative Design',\r\n SolarPanelArrayModel: 'Solar Panel Model',\r\n SolarPanelArrayOrientation: 'Orientation',\r\n SolarPanelArrayTiltAngle: 'Tilt Angle',\r\n SolarPanelArrayRowWidth: 'Row Width',\r\n SolarPanelArrayInterRowSpacing: 'Inter-Row Spacing',\r\n SolarPanelArrayRowSpacing: 'Row Spacing',\r\n SolarPanelArrayRowAxis: 'Row Axis',\r\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\r\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\r\n SolarPanelArrayEastWestRowAxis: 'East-West (Absolute)',\r\n SolarPanelArrayNorthSouthRowAxis: 'North-South (Absolute)',\r\n SolarPanelArrayMargin: 'Margin',\r\n SolarPanelArrayPoleHeight: 'Pole Height',\r\n SolarPanelArrayPoleSpacing: 'Pole Spacing',\r\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\r\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\r\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\r\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\r\n SolarPanelArrayYearlyProfit: 'Profit',\r\n LayoutNotAcceptedCheckYourParameters: 'This layout is not accepted. Please check your parameters.',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: 'Optimization',\r\n Parameters: 'Parameters',\r\n Variables: 'Variables',\r\n Constants: 'Constants',\r\n GeneticAlgorithm: 'Genetic Algorithm',\r\n GeneticAlgorithmSettings: 'Genetic Algorithm Settings',\r\n ParticleSwarmOptimization: 'Particle Swarm Optimization',\r\n ParticleSwarmOptimizationSettings: 'Particle Swarm Optimization Settings',\r\n SolarPanelTiltAngleOptimization: 'Solar Panel Tilt Angle Optimization',\r\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\r\n Generation: 'Generation',\r\n Gene: 'Gene',\r\n NormalizedVariables: 'Normalized Variables',\r\n Objective: 'Objective',\r\n ObjectiveFunctionDailyTotalYield: 'Daily Total Yield',\r\n ObjectiveFunctionYearlyTotalYield: 'Yearly Total Yield',\r\n ObjectiveFunctionDailyMeanYield: 'Daily Mean Yield',\r\n ObjectiveFunctionYearlyMeanYield: 'Yearly Mean Yield',\r\n ObjectiveFunctionDailyProfit: 'Daily Profit',\r\n ObjectiveFunctionYearlyProfit: 'Yearly Profit',\r\n GeneticAlgorithmSelectionMethod: 'Genetic Algorithm Selection Method',\r\n RouletteWheel: 'Roulette Wheel',\r\n Tournament: 'Tournament',\r\n SearchMethod: 'Search Method',\r\n GlobalSearchUniformSelection: 'Global Search Uniform Selection',\r\n LocalSearchRandomOptimization: 'Local Search Random Optimization',\r\n PopulationSize: 'Population Size',\r\n MaximumGenerations: 'Maximum Generations',\r\n SelectionRate: 'Selection Rate',\r\n CrossoverRate: 'Crossover Rate',\r\n MutationRate: 'Mutation Rate',\r\n Step: 'Step',\r\n SwarmSize: 'Swarm Size',\r\n MaximumSteps: 'Maximum Steps',\r\n MaximumVelocity: 'Maximum Velocity',\r\n InertiaWeight: 'Inertia Weight',\r\n CognitiveCoefficient: 'Cognitive Coefficient',\r\n SocialCoefficient: 'Social Coefficient',\r\n ConvergenceThreshold: 'Convergence Threshold for Termination',\r\n LocalSearchRadius: 'Local Search Radius',\r\n RowsPerRackRange: 'Range for Rows per Rack',\r\n TiltAngleRange: 'Range for Tilt Angle',\r\n InterRowSpacingRange: 'Range for Inter-Row Spacing',\r\n ClickTargetPolygonToActivate: 'Click Target Polygon to Activate',\r\n ClickTargetFoundationToActivate: 'Click Target Foundation to Activate',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: 'Mostrar modelo',\r\n Flip: 'Flip',\r\n Type: 'Tipo',\r\n Spread: 'Extender',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: 'Flip',\r\n Type: 'Type',\r\n Spread: 'Spread',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: 'Cambiar persona',\r\n Flip: 'Flip',\r\n Observer: 'Observer',\r\n ViewFromThisPerson: 'View from This Person',\r\n },\r\n\r\n lightMenu: {\r\n Color: 'Color',\r\n Intensity: 'Intensity',\r\n Decay: 'Decay',\r\n MaximumDistance: 'Distance',\r\n Inside: 'Inside',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: 'Azimut relativa',\r\n Pole: 'Pole',\r\n PoleHeight: 'Altura del poste',\r\n PoleRadius: 'Pole Radius',\r\n ExtraPoleHeight: 'Extra Pole Height',\r\n ExtraPoleHeightInAdditionToHalfWidth: 'Extra Pole Height in Addition to Half Width',\r\n DrawSunBeam: 'Dibujar rayo del sol',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: 'Reflector Reflectance',\r\n ReceiverAbsorptance: 'Receiver Absorptance',\r\n ReflectorOpticalEfficiency: 'Reflector Optical Efficiency',\r\n ReceiverThermalEfficiency: 'Receiver Thermal Efficiency',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: 'Inverter Efficiency',\r\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\r\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\r\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\r\n ChangePvModel: 'Cambiar modelo PV',\r\n Orientation: 'Orientación',\r\n Portrait: 'Vertical',\r\n Landscape: 'Horizontal',\r\n FrameColor: 'Frame Color',\r\n Panels: 'paneles',\r\n PanelsWide: 'ancho paneles',\r\n PanelsLong: 'longitud paneles',\r\n TiltAngle: 'Inclinar ángulo',\r\n SouthFacingIsPositive: 'Orientado al sur es positivo',\r\n Tracker: 'Seguidor',\r\n SolarTrackerFollowsSun: 'Un seguidor sigue el sol para incrementar las salidas de los paneles solares',\r\n PoleSpacing: 'Espaciado entre postes',\r\n NoTracker: 'Sin seguimiento',\r\n HorizontalSingleAxisTracker: 'Seguidor horizontal de eje único',\r\n VerticalSingleAxisTracker: 'Seguidor vertical de eje único',\r\n AltazimuthDualAxisTracker: 'Seguidor de doble eje altazimutal',\r\n OnlyThisSolarPanel: 'Solamente este panel solar',\r\n AllSolarPanelsOnSurface: 'Todos los paneles solares en la misma superficie',\r\n AllSolarPanelsAboveFoundation: 'Todos los paneles solares sobre la misma base',\r\n AllSelectedSolarPanels: 'All Selected Solar Panels',\r\n AllSolarPanels: 'Todos los paneles solares',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: 'Especificaciones del panel solar',\r\n Model: 'Modelo',\r\n PanelSize: 'Tamaño del panel',\r\n Cells: 'Celdas',\r\n CellType: 'Tipo de celda',\r\n Monocrystalline: 'Monocristalino',\r\n Polycrystalline: 'Policristalino',\r\n ThinFilm: 'Película delgada',\r\n Bifacial: 'Bifacial',\r\n BifacialityFactor: 'Bifaciality Factor',\r\n Black: 'Negro',\r\n Blue: 'Azul',\r\n ShadeTolerance: 'Tolerancia a la sombra',\r\n SolarCellEfficiency: 'Eficiencia de la célula solar',\r\n NominalOperatingCellTemperature: 'Temperatura nominal de la celda de funcionamiento',\r\n TemperatureCoefficientOfPmax: 'Coeficiente de temperatura de Pmax',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: 'Module Length',\r\n Modules: 'modules',\r\n ModulesLong: 'modules long',\r\n LatusRectum: 'Latus Rectum',\r\n OnlyThisParabolicTrough: 'Only This Parabolic Trough',\r\n AllParabolicTroughsAboveFoundation: 'All Parabolic Troughs Above the Same Foundation',\r\n AllSelectedParabolicTroughs: 'All Selected Parabolic Troughs',\r\n AllParabolicTroughs: 'All Parabolic Troughs',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: 'Absorber Pipe',\r\n SelectAbsorberToReflectSunlightTo: 'Select Absorber to Reflect Sunlight to',\r\n ModuleLength: 'Module Length',\r\n Modules: 'modules',\r\n ModulesLong: 'modules long',\r\n OnlyThisFresnelReflector: 'Only This Fresnel Reflector',\r\n AllFresnelReflectorsAboveFoundation: 'All Fresnel Reflectors Above the Same Foundation',\r\n AllSelectedFresnelReflectors: 'All Selected Fresnel Reflectors',\r\n AllFresnelReflectors: 'All Fresnel Reflectors',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: 'Tower',\r\n SelectTowerToReflectSunlightTo: 'Select Tower to Reflect Sunlight to',\r\n OnlyThisHeliostat: 'Only This Heliostat',\r\n AllHeliostatsAboveFoundation: 'All Heliostats Above the Same Foundation',\r\n AllSelectedHeliostats: 'All Selected Heliostats',\r\n AllHeliostats: 'All Heliostats',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: 'Receiver Structure',\r\n CentralPole: 'Central Pole',\r\n CentralPoleWithTripod: 'Central Pole with Tripod',\r\n Quadrupod: 'Quadrupod',\r\n RimDiameter: 'Rim Diameter',\r\n LatusRectum: 'Latus Rectum',\r\n ExtraPoleHeightInAdditionToRadius: 'Extra Pole Height in Addition to Radius',\r\n OnlyThisParabolicDish: 'Only This Parabolic Dish',\r\n AllParabolicDishesAboveFoundation: 'All Parabolic Dishes Above the Same Foundation',\r\n AllSelectedParabolicDishes: 'All Selected Parabolic Dishes',\r\n AllParabolicDishes: 'All Parabolic Dishes',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: 'Por defecto',\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n SizeOfWall: 'Tamaño de la pared',\r\n OnlyThisWall: 'Solamente esta pared',\r\n AllConnectedWalls: 'All Connected Walls',\r\n AllWallsAboveFoundation: 'Todas las paredes sobre la misma base',\r\n AllSelectedWalls: 'All Selected Walls',\r\n AllWalls: 'Todo paredes',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Do you really want to remove all the windows on this wall',\r\n Doors: 'Doors',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Do you really want to remove all the doors on this wall',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Do you really want to remove all the solar panels on this wall',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\r\n LockAllPolygons: 'Lock All Polygons',\r\n UnlockAllPolygons: 'Unlock All Polygons',\r\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\r\n WallStructure: 'Wall Structure',\r\n DefaultStructure: 'Default',\r\n StudStructure: 'Stud',\r\n PillarStructure: 'Pillar',\r\n Opacity: 'Opacity',\r\n StructureSpacing: 'Structure Spacing',\r\n StructureWidth: 'Structure Width',\r\n StructureThickness: 'Structure Thickness',\r\n StructureColor: 'Structure Color',\r\n Color: 'Wall Color',\r\n Height: 'Altura',\r\n Thickness: 'Thickness',\r\n Texture: 'Texture',\r\n AllLightsOnWallInside: 'All Lights on Wall Inside',\r\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\r\n Fill: 'Fill',\r\n Full: 'Full',\r\n Partial: 'Partial',\r\n Empty: 'Empty',\r\n OpenToOutside: 'Open to Outside',\r\n EavesLength: 'Eaves Overhang Length',\r\n Parapet: 'Parapet',\r\n ParapetColor: 'Parapet Color',\r\n ParapetTexture: 'Parapet Texture',\r\n ParapetHeight: 'Parapet Height',\r\n CopingsHeight: 'Copings Height',\r\n CopingsWidth: 'Copings Width',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: 'Only This Window',\r\n AllWindowsOnSurface: 'All Windows on the Same Surface',\r\n AllWindowsAboveFoundation: 'All Windows Above the Same Foundation',\r\n AllSelectedWindows: 'All Selected Windows',\r\n AllWindows: 'All Windows',\r\n Width: 'Ancho',\r\n Height: 'Altura',\r\n Setback: 'Setback from Exterior Surface',\r\n RelativeToWallThickness: 'Relative to wall thickness',\r\n Mullion: 'Mullion',\r\n HorizontalMullion: 'Horizontal Mullion',\r\n VerticalMullion: 'Vertical Mullion',\r\n MullionWidth: 'Mullion Width',\r\n HorizontalMullionSpacing: 'Horizontal Mullion Spacing',\r\n VerticalMullionSpacing: 'Vertical Mullion Spacing',\r\n MullionColor: 'Mullion Color',\r\n Tint: 'Tint',\r\n Opacity: 'Opacity',\r\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\r\n Shutter: 'Shutter',\r\n LeftShutter: 'Left Shutter',\r\n RightShutter: 'Right Shutter',\r\n BothShutters: 'Both Shutters',\r\n ShutterWidth: 'Relative Width',\r\n ShutterColor: 'Shutter Color',\r\n Frame: 'Frame',\r\n FrameWidth: 'Frame Width',\r\n SillWidth: 'Sill Width',\r\n Color: 'Frame Color',\r\n WindowType: 'Window Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Polygonal: 'Polygonal',\r\n Interior: 'Interior',\r\n Empty: 'Empty',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: 'Por defecto',\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n OnlyThisRoof: 'Only This Wall',\r\n AllRoofsAboveFoundation: 'All Walls Above the Same Foundation',\r\n AllSelectedRoofs: 'All Selected Roofs',\r\n AllRoofs: 'All Roofs',\r\n OnlyThisCeiling: 'Only This Ceiling',\r\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\r\n AllCeilings: 'All Ceilings',\r\n EavesOverhangLength: 'Eaves Overhang Length',\r\n RafterSpacing: 'Rafter Spacing',\r\n RafterWidth: 'Rafter Width',\r\n RafterThickness: 'Rafter Thickness',\r\n RafterColor: 'Rafter Color',\r\n RoofColor: 'Roof Color',\r\n RoofSideColor: 'Roof Side Color',\r\n GlassTint: 'Glass Tint',\r\n Opacity: 'Opacity',\r\n RoofStructure: 'Roof Structure',\r\n DefaultStructure: 'Default',\r\n RafterStructure: 'Rafter',\r\n GlassStructure: 'Glass',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\r\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\r\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\r\n Rise: 'Rise',\r\n Ceiling: 'Ceiling',\r\n RoofRValue: 'Roof R-Value',\r\n CeilingRValue: 'Ceiling R-Value',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: 'Por defecto',\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n Texture11: 'Textura 11',\r\n Texture12: 'Textura 12',\r\n Texture13: 'Textura 13',\r\n Texture14: 'Textura 14',\r\n Texture15: 'Textura 15',\r\n Texture16: 'Textura 16',\r\n Texture17: 'Textura 17',\r\n OnlyThisDoor: 'Only This Door',\r\n AllDoorsOnWall: 'All Doors on the Same Wall',\r\n AllDoorsAboveFoundation: 'All Doors Above the Same Foundation',\r\n AllSelectedDoors: 'All Selected Doors',\r\n AllDoors: 'All Doors',\r\n DoorType: 'Door Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Filled: 'Filled',\r\n FrameColor: 'Frame Color',\r\n Interior: 'Interior',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: 'Alto',\r\n Low: 'Bajo',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: 'Number of selected heliostats',\r\n NumberOfSelectedSolarPanels: 'Number of selected solar panels',\r\n ElectricityGeneratedDailyBySolarPanels: 'Electricity generated daily by these solar panels',\r\n SceneDiameter: 'Scene diameter',\r\n BuildingArea: 'Building area',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: 'Color Contrast',\r\n FluxScale: 'Flux Scale',\r\n ClickUpOrDownArrowButtonsToChange: 'Click up or down arrow buttons to change',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: 'Rotar',\r\n DragMouse: 'Arrastrar el ratón',\r\n Zoom: 'Zoom',\r\n MouseWheelOrKeys: 'Girar el mouse o presionar Ctrl+[ o Ctrl+]',\r\n MouseWheelOrKeysMac: 'Girar el mouse o presionar ⌘+[ o ⌘+]',\r\n Pan: 'Panorámica',\r\n HoldCtrlDragMouse: 'Mantener Ctrl y mover el ratón',\r\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\r\n Enter2DMode: 'Enter 2D mode',\r\n Exit2DMode: 'Exit 2D mode',\r\n NavigationMode: 'Navigation mode',\r\n EnableNavigation: 'Enable navigation',\r\n DisableNavigation: 'Disable navigation',\r\n MoveForwardBack: 'Move forward/back',\r\n MoveForwardBackInstruction: 'Press W/S',\r\n MoveLeftRight: 'Move left/right',\r\n MoveLeftRightInstruction: 'Press A/D',\r\n MoveUpDown: 'Move up/down',\r\n MoveUpDownInstruction: 'Press Z/X',\r\n Turn: 'Turn',\r\n TurnInstruction: 'Press arrow keys',\r\n ResetView: 'Reset',\r\n AutoRotate: 'Auto rotar',\r\n StartOrStop: 'Presiona F4 para empezar o parar',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: 'Imagen en el suelo',\r\n WeatherStations: 'Weather Stations',\r\n WeatherStationsNote: 'Turn this off to speed up',\r\n Coordinates: 'Coordenadas',\r\n Zoom: 'Zoom',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: 'Solar Panel Visibility',\r\n Observer: 'Observer',\r\n VantagePoint: 'Vantage Point',\r\n ItemizedVisibilityByFields: 'Itemized by Fields',\r\n TotalVisibility: 'Total',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: 'Sensor de luz',\r\n WeatherDataFrom: 'Datos metereológicos de',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: 'Daily Building Energy',\r\n YearlyBuildingEnergy: 'Yearly Building Energy',\r\n Heater: 'Heater',\r\n AC: 'AC',\r\n SolarPanel: 'Solar Panel',\r\n Net: 'Net',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: 'Rendimiento diario del panel solar',\r\n SolarPanelYearlyYield: 'Rendimiento anual del panel solar',\r\n Yield: 'Rendimiento',\r\n YieldPerHour: 'Rendimiento por hora',\r\n DailyTotal: 'Total diario',\r\n YearlyTotal: 'Total anual',\r\n ShowOutputsOfIndividualSolarPanels: 'Mostrar salidas de paneles solares individuales',\r\n Profit: 'Profit',\r\n TotalCost: 'Total Cost',\r\n TotalRevenue: 'Total Revenue',\r\n TotalYield: 'Total Yield',\r\n MeanYield: 'Mean Yield',\r\n ModuleCount: 'Module Count',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: 'Parabolic Trough Daily Yield',\r\n ParabolicTroughYearlyYield: 'Parabolic Trough Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualParabolicTroughs: 'Show outputs of individual parabolic troughs',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: 'Parabolic Dish Daily Yield',\r\n ParabolicDishYearlyYield: 'Parabolic Dish Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualParabolicDishes: 'Show outputs of individual parabolic dishes',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: 'Fresnel Reflector Daily Yield',\r\n FresnelReflectorYearlyYield: 'Fresnel Reflector Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualFresnelReflectors: 'Show outputs of individual Fresnel feflectors',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: 'Heliostat Daily Yield',\r\n HeliostatYearlyYield: 'Heliostat Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualHeliostats: 'Show outputs of individual heliostats',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: 'Solar Updraft Tower Daily Yield',\r\n UpdraftTowerYearlyYield: 'Solar Updraft Tower Yearly Yield',\r\n ChimneyAirTemperature: 'Chimney Air Temperature',\r\n ChimneyWindSpeed: 'Chimney Wind Speed',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualUpdraftTowers: 'Show outputs of individual updraft towers',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: 'Sun & Time Settings',\r\n SunAngles: 'Ángulos',\r\n TwentyFourHours: '24 Hours',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyLikes: 'My Likes',\r\n MyCloudFiles: 'Mis archivos en la nube',\r\n GenerateLink: 'Generar enlace',\r\n LinkGeneratedInClipBoard: 'Se ha generado un enlace en el portapapeles',\r\n DoYouReallyWantToDelete: 'Estás seguro que quieres eliminar',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\r\n 'If this file has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyProjects: 'My Projects',\r\n GenerateProjectLink: 'Generate Project Link',\r\n ProjectLinkGeneratedInClipBoard: 'A link to the project was generated in the clip board',\r\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\r\n 'If this project has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: 'Project Settings',\r\n ThumbnailImageSize: 'Thumbnail Image Size',\r\n ProjectByOtherPeople: 'Project by Other People',\r\n Project: 'Project',\r\n ProjectType: 'Type',\r\n ProjectDescription: 'Description',\r\n MakeDescriptionEditable: 'Make this description editable',\r\n MakeDescriptionNonEditable: 'Make this description non-editable',\r\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\r\n SolarPanelArray: 'Solar Panel Array',\r\n CurateCurrentDesign: 'Curate current design',\r\n UpdateSelectedDesign: 'Update selected design',\r\n RemoveSelectedDesign: 'Remove selected design',\r\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\r\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\r\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\r\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\r\n ChooseSolutionSpace: 'Choose solution space',\r\n ChooseDataColoring: 'Choose data coloring',\r\n SameColorForAllDesigns: 'Same color for all designs',\r\n OneColorForEachDesign: 'One color for each design',\r\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\r\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\r\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\r\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\r\n GenerateScatteredPlot: 'Generate Scattered Plot',\r\n SelectXAxis: 'Select X Axis',\r\n SelectYAxis: 'Select Y Axis',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: 'Configuración de mi cuenta',\r\n MyID: 'My 🆔',\r\n ClickToCopyMyID: 'Click to copy my ID',\r\n IDInClipBoard: 'Your ID was copied and is ready to paste.',\r\n StoreMyNameInMyFilesWhenSaving: 'Store my name in my files when saving',\r\n DoYouReallyWantToShowYourNameInYourFiles: 'Do you really want to show your display name in your files?',\r\n SignFileDisclaimer: 'If yes, your display name may be seen by anyone who can access your files.',\r\n Likes: 'Likes',\r\n AllPublished: 'All Published',\r\n PublishedUnderAliases: 'Aliases',\r\n UserCount: 'User Count',\r\n SchoolID: 'School ID',\r\n ClassID: 'Class ID',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: 'Luz solar',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: 'Select Air Temperature Model',\r\n Sinusoidal: 'Sinusoidal',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: 'Economics Parameters',\r\n ElectricitySellingPrice: 'Electricity Selling Price',\r\n OperationalCostPerUnit: 'Operational Cost per Unit',\r\n SellingPrice: 'Selling Price',\r\n UnitCost: 'Unit Cost',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: 'Navigation Parameters',\r\n MinimumMoveSpeed: 'Minimum Move Speed',\r\n MinimumTurnSpeed: 'Minimum Turn Speed',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: 'Claridad',\r\n ShowDaylightResults: 'Mostrar resultados de la luz solar',\r\n ShowSkyClearnessResults: 'Mostrar resultados de claridad del cielo',\r\n ShowAverageDailySolarRadiation: 'Mostrar la radiación solar diaria promedio',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: 'Sin sensor para recopilar datos',\r\n NoSolarPanelForAnalysis: 'Sin panel solar para el análisis',\r\n NoObserverForVisibilityAnalysis: 'There is no observer for visibility analysis.',\r\n NoWaterHeaterForAnalysis: 'There is no water heater for analysis.',\r\n NoParabolicDishForAnalysis: 'There is no parabolic dish for analysis.',\r\n NoParabolicTroughForAnalysis: 'There is no parabolic trough for analysis.',\r\n NoFresnelReflectorForAnalysis: 'There is no Fresnel reflector for analysis.',\r\n NoHeliostatForAnalysis: 'There is no heliostat for analysis.',\r\n NoSolarUpdraftTowerForAnalysis: 'There is no solar updraft tower for analysis.',\r\n NoBuildingForAnalysis: 'There is no building for analysis.',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: 'Archivo en la nube',\r\n Select: 'Seleccionar',\r\n AddFoundation: 'Añadir base',\r\n AddWall: 'Añadir pared',\r\n AddWindow: 'Añadir ventana',\r\n AddDoor: 'Añadir door',\r\n AddPyramidRoof: 'Add pyramid roof',\r\n AddGableRoof: 'Add gable roof',\r\n AddHipRoof: 'Add hip roof',\r\n AddGambrelRoof: 'Add gambrel roof',\r\n AddMansardRoof: 'Add mansard roof',\r\n AddCuboid: 'Añadir cuboid',\r\n AddSensor: 'Añadir sensor',\r\n AddSolarPanel: 'Añadir panel solar',\r\n AddWaterHeater: 'Add water heater',\r\n AddParabolicDish: 'Add parabolic dish',\r\n AddParabolicTrough: 'Add parabolic trough',\r\n AddFresnelReflector: 'Add Fresnel reflector',\r\n AddHeliostat: 'Add heliostat',\r\n AddWindTurbine: 'Add wind turbine',\r\n AddLight: 'Add light',\r\n AddTree: 'Añadir árbol',\r\n AddFlower: 'Add flower',\r\n AddPeople: 'Añadir gente',\r\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\r\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\r\n ManipulateGroup: 'Manipulate a group',\r\n ClearScene: 'Clear escena',\r\n ShowSunAndTimeSettings: 'Show sun and time settings',\r\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\r\n DoYouReallyWantToClearContent: 'Estás seguro que quieres borrar el contenido',\r\n ClickForMoreButtons: 'Click for more buttons',\r\n SwitchToAddingFoundation: 'Switch to Adding Foundation',\r\n SwitchToAddingCuboid: 'Switch to Adding Cuboid',\r\n SwitchToAddingWall: 'Switch to Adding Wall',\r\n SwitchToAddingWindow: 'Switch to Adding Window',\r\n SwitchToAddingDoor: 'Switch to Adding Door',\r\n SwitchToAddingPyramidRoof: 'Switch to Adding Pyramid Roof',\r\n SwitchToAddingGableRoof: 'Switch to Adding Gable Roof',\r\n SwitchToAddingHipRoof: 'Switch to Adding Hip Roof',\r\n SwitchToAddingGambrelRoof: 'Switch to Adding Gambrel Roof',\r\n SwitchToAddingMansardRoof: 'Switch to Adding Mansard Roof',\r\n SwitchToAddingSolarPanel: 'Switch to Adding Solar Panel',\r\n SwitchToAddingSensor: 'Switch to Adding Sensor',\r\n SwitchToAddingWaterHeater: 'Switch to Adding Water Heater',\r\n SwitchToAddingParabolicDish: 'Switch to Adding Parabolic Dish',\r\n SwitchToAddingParabolicTrough: 'Switch to Adding Parabolic Trough',\r\n SwitchToAddingFresnelReflector: 'Switch to Adding Fresnel Reflector',\r\n SwitchToAddingHeliostat: 'Switch to Adding Heliostat',\r\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\r\n SwitchToAddingLight: 'Switch to Adding Light',\r\n SwitchToAddingTree: 'Switch to Adding Tree',\r\n SwitchToAddingFlower: 'Switch to Adding Flower',\r\n SwitchToAddingPeople: 'Switch to Adding People',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: 'Ver Institute for Future Intelligence',\r\n visitAladdinHomePage: 'Visita la página de Aladdin',\r\n clickToOpenMenu: 'Haz clic para abrir el menú principal',\r\n clickToAccessAccountSettings: 'Click to access account settings',\r\n },\r\n\r\n tree: {\r\n Apple: 'Apple',\r\n Birch: 'Birch',\r\n Coconut: 'Coconut',\r\n Dogwood: 'Cerezo silvestre',\r\n Elm: 'Olmo',\r\n FanPalm: 'Fan Palm',\r\n Linden: 'Tilo',\r\n Magnolia: 'Magnolia',\r\n Maple: 'Arce',\r\n Oak: 'Roble',\r\n Pine: 'Pino',\r\n Spruce: 'Spruce',\r\n },\r\n\r\n flower: {\r\n Bellflower: 'Bellflower',\r\n Boxwood: 'Boxwood',\r\n CactusCombo1: 'Cactus Combo 1',\r\n CactusCombo2: 'Cactus Combo 2',\r\n CactusCombo3: 'Cactus Combo 3',\r\n CactusCombo4: 'Cactus Combo 4',\r\n Hibiscus: 'Hibiscus',\r\n Hosta: 'Hosta',\r\n Hydrangea: 'Hydrangea',\r\n Peony: 'Peony',\r\n RedRose: 'Red Rose',\r\n Spirea: 'Spirea',\r\n Sunflower: 'Sunflower',\r\n TallBush: 'Tall Bush',\r\n Tulip: 'Tulip',\r\n WhiteFlower: 'White Flower',\r\n YellowFlower: 'Yellow Flower',\r\n },\r\n\r\n people: {\r\n Jaah: 'Jaah',\r\n Jack: 'Jack',\r\n Jacob: 'Jacob',\r\n Jacqueline: 'Jacqueline',\r\n Jade: 'Jade',\r\n Jamelia: 'Jamelia',\r\n James: 'James',\r\n Jane: 'Jane',\r\n Jaya: 'Jaya',\r\n Jaye: 'Jaye',\r\n Jeanette: 'Jeanette',\r\n Jedi: 'Jedi',\r\n Jeff: 'Jeff',\r\n Jena: 'Jena',\r\n Jennifer: 'Jennifer',\r\n Jess: 'Jess',\r\n Jett: 'Jett',\r\n Jill: 'Jill',\r\n Jiya: 'Jiya',\r\n Joan: 'Joan',\r\n Jocelyn: 'Jocelyn',\r\n Joel: 'Joel',\r\n Joey: 'Joey',\r\n John: 'John',\r\n Jonathon: 'Jonathon',\r\n Jose: 'Jose',\r\n Joseph: 'Joseph',\r\n Joshua: 'Joshua',\r\n Judd: 'Judd',\r\n Judy: 'Judy',\r\n Julia: 'Julia',\r\n Julio: 'Julio',\r\n Jumapili: 'Jumapili',\r\n June: 'June',\r\n Juro: 'Juro',\r\n Justin: 'Justin',\r\n },\r\n\r\n compass: {\r\n N: 'N',\r\n S: 'S',\r\n W: 'W',\r\n E: 'E',\r\n },\r\n\r\n month: {\r\n January: 'Jan',\r\n February: 'Feb',\r\n March: 'Mar',\r\n April: 'Apr',\r\n May: 'May',\r\n June: 'Jun',\r\n July: 'Jul',\r\n August: 'Aug',\r\n September: 'Sep',\r\n October: 'Oct',\r\n November: 'Nov',\r\n December: 'Dec',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: 'Search by publisher',\r\n SearchByLabel: 'Search by label',\r\n MyPublishedModels: 'My Published Models',\r\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\r\n SortFromOldestToNewest: 'Sort from oldest to newest',\r\n SortFromNewestToOldest: 'Sort from newest to oldest',\r\n ModelsFoundOnThisSite: 'models found on this site',\r\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_tr = {\r\n translation: {\r\n name: {\r\n IFI: 'Yarının Zekası Enstitüsü',\r\n Aladdin: 'Aladdin',\r\n Tagline: 'Aladdin: Açıklanabilir Yapay Zeka ile Tasarımı Yeniden Hayal Et — Yarının Zekası Enstitüsü',\r\n },\r\n\r\n cookie: {\r\n Statement: 'Kabul Ete tıklayarak, iyi bir Aladdin deneyimi için çerez kullanımını kabul etmiş olursunuz.',\r\n Accept: 'Kabul Et',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: 'Geliştiriciler',\r\n TermsOfService: 'Hizmet Şartları',\r\n PrivacyPolicy: 'Gizlilik Politikası',\r\n Software: 'Yazılım',\r\n Content: 'İçerik',\r\n Research: 'Araştırma',\r\n Support: 'Destek',\r\n Acknowledgment: 'Onay',\r\n FundingInformation:\r\n \"Ulusal Bilim Vakfı (NSF), #2105695, #2131097, ve #2301164 numaralı fon destekleriyle mevcut ürünün araştırma ve geliştirme çalışmalarına cömert bir mali kaynak sağlamıştır. Bununla birlikte üründe ifade edilen herhangi bir görüş, bulgu ve sonuç veya öneri yazarların kendi görüşleridir. NSF'nin kurumsal görüşlerini yansıtmayabilir.\",\r\n Contact: 'Daha fazla bilgi için lütfen Charles Xie (charles@intofuture.org) ile iletişime geçiniz.',\r\n Translators: 'Çevirmenler',\r\n },\r\n\r\n word: {\r\n LastUpdate: 'Last Update',\r\n Small: 'Small',\r\n Medium: 'Medium',\r\n Large: 'Large',\r\n Design: 'Design',\r\n Information: 'Information',\r\n Type: 'Type',\r\n Text: 'Text',\r\n FontSize: 'Font Size',\r\n FontColor: 'Font Color',\r\n Model: 'Model',\r\n Models: 'Models',\r\n Upload: 'Upload',\r\n ClickCount: 'Click Count',\r\n Share: 'Share',\r\n AlreadyLike: 'Already like',\r\n Like: 'Like',\r\n MustLogInToLike: 'Must log in to like',\r\n AllRightsReserved: 'Tüm Hakları Saklıdır.',\r\n MeterAbbreviation: 'm',\r\n Version: 'Sürüm',\r\n VersionInitial: 'S',\r\n Options: 'Seçenekler',\r\n Maximum: 'Maximum',\r\n Minimum: 'Minimum',\r\n MaximumNumber: 'Maksimum Sayı',\r\n MinimumNumber: 'Minimum Sayı',\r\n MaximumValue: 'Maksimum Değer',\r\n MinimumValue: 'Minimum Değer',\r\n Or: 'Veya',\r\n None: 'Hiçbiri',\r\n High: 'Yüksek',\r\n Partial: 'Kısmi',\r\n Teacher: 'Öğretmen',\r\n Class: 'Sınıf',\r\n Total: 'Toplam',\r\n Leaderboard: 'Leaderboard',\r\n Latest: 'Latest',\r\n Range: 'Aralık',\r\n SIUnit: 'SI Unit',\r\n USUnit: 'US Unit',\r\n ThermalTransmittance: 'Thermal Transmittance',\r\n ThermalResistance: 'Thermal Resistance',\r\n UValue: 'U-Value',\r\n RValue: 'R-Value',\r\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\r\n BuildingHVACSystem: 'Building HVAC System',\r\n ThermostatSetpoint: 'Thermostat Setpoint',\r\n TemperatureToleranceThreshold: 'Tolerance Threshold',\r\n TemperatureToleranceThresholdExplanation:\r\n 'Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.',\r\n Press: 'Tıkla',\r\n Open: 'Aç',\r\n Save: 'Kaydet',\r\n SaveAsImage: 'Resim Olarak Kaydet',\r\n SaveAsCsv: 'Save as CSV',\r\n Update: 'Güncelle',\r\n Paste: 'Yapıştır',\r\n Copy: 'Kopyala',\r\n Cut: 'Kes',\r\n Delete: 'Sil',\r\n Lock: 'Kilitle',\r\n Translucent: 'Yarı Saydam',\r\n Color: 'Renk',\r\n Texture: 'Doku',\r\n Size: 'Boyut',\r\n Thickness: 'Kalınlık',\r\n Yes: 'Evet',\r\n No: 'Hayır',\r\n OK: 'Tamam',\r\n Cancel: 'İptal',\r\n Apply: 'Uygula',\r\n Close: 'Kapat',\r\n ApplyTo: 'Uygula',\r\n Run: 'Çalıştır',\r\n Pause: 'Duraklat',\r\n Resume: 'Sürdür',\r\n Clear: 'Temizle',\r\n Warning: 'Uyarı',\r\n Caution: 'Caution',\r\n Reminder: 'Hatırlatıcı',\r\n Length: 'Uzunluk',\r\n Width: 'Genişlik',\r\n Height: 'Yükseklik',\r\n Radius: 'Yarıçap',\r\n Angle: 'Açı',\r\n Azimuth: 'Azimut',\r\n Coordinates: 'Koordinatlar',\r\n Weather: 'Hava Durumu',\r\n Show: 'Göster',\r\n Animate: 'Oynat',\r\n Date: 'Tarih',\r\n Time: 'Saat',\r\n Title: 'Başlık',\r\n Owner: 'Sahibi',\r\n Action: 'Eylem',\r\n Rename: 'Yeniden Adlandır',\r\n Location: 'Konum',\r\n Latitude: 'Enlem',\r\n Month: 'Ay',\r\n Day: 'Gün',\r\n Hour: 'Saat',\r\n Daylight: 'Gün Işığı',\r\n Radiation: 'Işınım',\r\n Temperature: 'Sıcaklık',\r\n kWh: 'kWh',\r\n dollar: 'dollar',\r\n MeterPerSecond: 'm/s',\r\n NorthInitial: 'N',\r\n SouthInitial: 'S',\r\n EastInitial: 'E',\r\n WestInitial: 'W',\r\n Fixed: 'Sabit',\r\n Elements: 'Öğeler',\r\n Energy: 'Energy',\r\n Unknown: 'Unknown',\r\n Label: 'Label',\r\n Description: 'Description',\r\n NoDescription: 'No description',\r\n MaximumCharacters: 'Maximum characters',\r\n Author: 'Author',\r\n Publisher: 'Publisher',\r\n Building: 'Building',\r\n ResidentialBuilding: 'Residential Building',\r\n CommercialBuilding: 'Commercial Building',\r\n SchoolBuilding: 'School Building',\r\n TouristAttraction: 'Tourist Attraction',\r\n UnderConstruction: 'Under Construction',\r\n Photovoltaic: 'Photovoltaic',\r\n Anonymous: 'Anonymous',\r\n Nickname: 'Nickname',\r\n Pin: 'Pin',\r\n Unpin: 'Unpin',\r\n },\r\n\r\n shared: {\r\n NoTexture: 'Doku Yok',\r\n FoundationElement: 'Temel',\r\n CuboidElement: 'Kübik',\r\n PolygonElement: 'Poligon',\r\n SensorElement: 'Sensör',\r\n SolarPanelElement: 'Güneş Paneli',\r\n WaterHeaterElement: 'Su Isıtıcı',\r\n ParabolicDishElement: 'Parabolik Çanak',\r\n ParabolicTroughElement: 'Parabolik Oluk',\r\n FresnelReflectorElement: 'Fresnel Reflektör',\r\n HeliostatElement: 'Heliostat',\r\n WindTurbineElement: 'Wind Turbine',\r\n LightElement: 'Light',\r\n ElementLocked: 'Kilitli',\r\n ModelType: 'Model Type',\r\n OutputBreakdown: 'Breakdown',\r\n MoreResults: 'More Results',\r\n },\r\n\r\n message: {\r\n ModelNotFound: 'Model not found',\r\n CannotSignIn: 'Oturum açılamıyor',\r\n CannotSignOut: 'Çıkış yapılamıyor',\r\n YourAccountWasCreated: 'Hesabınız oluşturuldu',\r\n CannotCreateAccount: 'Hesap oluşturulamıyor',\r\n YourAccountSettingsWereSaved: 'Hesap ayarlarınız kaydedildi.',\r\n CannotSaveYourAccountSettings: 'Hesap ayarlarınız kaydedilemiyor',\r\n CannotSaveYourFileToCloud: 'Dosyanız buluta kaydedilemiyor',\r\n CannotCreateNewProject: 'Cannot create a new project',\r\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\r\n CannotOpenYourProjects: 'Cannot open your projects',\r\n CannotOpenProject: 'Cannot open the project',\r\n CannotDeleteProject: 'Cannot delete the project',\r\n CannotRenameProject: 'Cannot rename the project',\r\n CannotAddDesignToProject: 'Cannot add this design to the project',\r\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\r\n DesignRemovedFromProject: 'The design was successfully removed from the project',\r\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\r\n CannotUpdateProject: 'Cannot update the project',\r\n CannotFetchProjectData: 'Cannot fetch project data',\r\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\r\n CloudFileNotFound: 'Bulut dosyası bulunamadı',\r\n CannotLoadModelsOnMap: 'Cannot load models on map',\r\n CannotLoadLeaderboard: 'Cannot load leaderboard',\r\n CannotPublishModelOnMap: 'Cannot publish model on map',\r\n CannotLikeModelFromMap: 'Cannot like model from map',\r\n CannotDeleteModelFromMap: 'Cannot delete model from map',\r\n ModelDeletedFromMap: 'Model is deleted from map',\r\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\r\n CannotOpenCloudFile: 'Bulut dosyası açılamıyor',\r\n CannotReadCloudFile: 'Cannot read the cloud file',\r\n CannotWriteCloudFile: 'Cannot write the cloud file',\r\n CloudFileCopied: 'Cloud file copied',\r\n CannotOpenCloudFolder: 'Bulut klasörünüz açılamıyor',\r\n CannotDeleteCloudFile: 'Bulut dosyası silinemiyor',\r\n CannotRenameCloudFile: 'Bulut dosyası yeniden adlandırılamıyor',\r\n DoYouWantToSaveChanges: 'Değişiklikleri kaydetmek istiyor musunuz?',\r\n NotApplicableToSelectedAction: 'Seçili eyleme uygulanamaz',\r\n ThisElementIsLocked: 'Bu öğe kilitli.',\r\n ThisCannotBeUndone: 'Geri alınamaz.',\r\n AzimuthOfNorthIsZero: 'Kuzey yönünün azimut açısı 0 ° derecedir.',\r\n CounterclockwiseAzimuthIsPositive: 'Saat yönünün tersi yönde azimut açısı pozitiftir.',\r\n MoveCancelledBecauseOfOverlap: 'Çakışma nedeniyle taşıma iptal edildi.',\r\n MoveOutsideBoundaryCancelled: 'Alan dışına çıkan taşıma iptal edildi.',\r\n RotationCancelledBecauseOfOverlap: 'Çakışma nedeniyle döndürme iptal edildi.',\r\n RotationOutsideBoundaryCancelled: 'Alan dışı döndürme iptal edildi.',\r\n ResizingCancelledBecauseOfOverlap: 'Çakışma nedeniyle yeniden boyutlandırma iptal edildi.',\r\n ResizingOutsideBoundaryCancelled: 'Alan dışında yeniden boyutlandırma iptal edildi.',\r\n CannotPasteOutsideBoundary: 'Alanın dışına yapıştırılamaz.',\r\n CannotPasteBecauseOfOverlap: 'Çakışma nedeniyle yapıştırılamıyor.',\r\n CannotMoveObjectTooFar: 'Nesne buraya taşınamaz.',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\r\n 'Yeni yerleşim düzeni uygulanmadan önce mevcut güneş panelleri kaldırılacaktır.',\r\n DoYouWantToContinue: 'Devam etmek istiyor musunuz?',\r\n SolarPanelsCannotIntersectWithGround: 'Güneş panelleri zeminle kesişemez.',\r\n SolarPanelsCannotOverlapWithOneAnother: 'Güneş panelleri birbiriyle örtüşemez.',\r\n ScreenshotSaved: 'Ekran görüntüsü kaydedildi.',\r\n CsvFileSaved: 'A CSV file was saved.',\r\n SimulationStarted: 'Simülasyon başladı.',\r\n SimulationCompleted: 'Simülasyon tamamlandı.',\r\n SimulationAborted: 'Simülasyon iptal edildi.',\r\n SimulationPaused: 'Simülasyon duraklatıldı.',\r\n CancelSimulation: 'Simülasyonu iptal et',\r\n PauseSimulation: 'Simülasyonu duraklat',\r\n ResumeSimulation: 'Simülasyonu devam ettir',\r\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\r\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\r\n EvolutionStarted: 'Evrim başladı.',\r\n EvolutionCompleted: 'Evrim tamamlandı.',\r\n EvolutionAborted: 'Evrim iptal edildi.',\r\n EvolutionPaused: 'Evrim duraklatıldı.',\r\n EncounterEvolutionError: 'Evrim hatasıyla karşılaşıldı.',\r\n CancelEvolution: 'Evrimi iptal et',\r\n PauseEvolution: 'Evrimi duraklat',\r\n ResumeEvolution: 'Evrime devam et',\r\n ConvergenceThresholdHasBeenReached: 'Yakınsama eşiğine ulaşıldı.',\r\n MaximumNumberOfGenerationsHasBeenReached: 'Maksimum nesil sayısına ulaşıldı.',\r\n MaximumNumberOfStepsHasBeenReached: 'Maksimum adım sayısına ulaşıldı.',\r\n ObjectiveFunctionTypeError: 'Geçerli işlev desteklenmiyor. Lütfen menüden başlatınız.',\r\n WallsAreNotAtSameHeight: 'Walls are not at same height.',\r\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\r\n WallsAreNotConnected: 'Walls are not connected.',\r\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\r\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\r\n BuildingRoofMissing: 'Building has a missing roof.',\r\n UnknownErrors: 'Unknown errors.',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: 'Analiz Seçenekleri',\r\n option: {\r\n GridCellSize: 'Hücre Boyutu',\r\n SamplingFrequency: 'Örneklem Frekansı',\r\n TimesPerHour: 'x 1/saat',\r\n DaysPerYear: 'Gün Sayısı / Yıl',\r\n },\r\n mainMenu: 'Ana Menü',\r\n cloudMenu: 'Bulut Menüsü',\r\n projectSubMenu: 'Project',\r\n project: {\r\n CreateNewProject: 'Create New Project',\r\n OpenProject: 'Open Project',\r\n SaveProjectAs: 'Save Project As',\r\n YouMustLogInToCreateProject: 'You must log in to create a new project',\r\n YouMustLogInToOpenProject: 'You must log in to open a project',\r\n },\r\n fileSubMenu: 'Dosya',\r\n file: {\r\n CreateNewFile: 'Yeni Dosya Oluştur',\r\n OpenLocalFile: 'Yerel Dosya Aç',\r\n SaveAsLocalFile: 'Yerel Dosya Olarak Kaydet',\r\n SavingAbortedMustHaveValidFileName: 'Kaydetme iptal edildi! Geçerli bir dosya adı kullanınız.',\r\n OpenCloudFile: 'Bulut Dosyası Aç',\r\n SaveCloudFile: 'Bulut Dosyasını Kaydet',\r\n SaveAsCloudFile: 'Bulut Dosyası Olarak Kaydet',\r\n SavingAbortedMustHaveValidTitle: 'Kaydetme iptal edildi! Dosya adı geçersiz!',\r\n ToSaveYourWorkPleaseSignIn: 'Çalışmanızı kaydetmek için lütfen oturum açınız.',\r\n TakeScreenshot: 'Ekran görüntüsü al',\r\n UseCloudFileName: 'Bulut Dosya Adını Kullan',\r\n PublishOnModelsMap: 'Publish on Models Map',\r\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\r\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\r\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\r\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\r\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\r\n },\r\n editSubMenu: 'Düzen',\r\n edit: {\r\n Undo: 'Geri Al',\r\n Redo: 'Yinele',\r\n },\r\n viewSubMenu: 'Görünüm',\r\n view: {\r\n NavigationView: 'Navigation View',\r\n TwoDimensionalView: '2D',\r\n ResetView: 'Yenile',\r\n ZoomIn: 'Yaklaş',\r\n ZoomOut: 'Uzaklaş',\r\n AutoRotate: 'Otomatik Döndür',\r\n ShowShadow: 'Gölge',\r\n ShowSurfaceShininess: 'Show Surface Shininess',\r\n TranslucentFloatingWindows: 'Yüzer Pencere',\r\n accessoriesSubMenu: 'Accessories',\r\n accessories: {\r\n SiteInformation: 'Konum Bilgisi',\r\n DesignInformation: 'Izgara Hücre Sayısı',\r\n Instruction: 'Yardım',\r\n StickyNote: 'Notlar',\r\n Note: 'Notlar',\r\n },\r\n },\r\n settingsSubMenu: 'Settings',\r\n settings: {\r\n WeatherData: 'Hava Durumu',\r\n DiurnalTemperature: 'Günlük Sıcaklık',\r\n Heliodon: 'Heliodon',\r\n SunAndTime: 'Güneş & Zaman',\r\n },\r\n benchmarksSubMenu: 'Deneysel',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: 'Güneş Işınım Tahmini Vs. Ölçümü ',\r\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\r\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\r\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\r\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\r\n },\r\n graph: {\r\n LineWidth: 'Çizgi Kalınlığı',\r\n SymbolSize: 'Sembol Boyutu',\r\n BarCategoryGap: 'Bar Category Gap',\r\n ShowHorizontalGridLines: 'Yatay Izgara Çizgilerini Göster',\r\n ShowVerticalGridLines: 'Dikey Izgara Çizgilerini Göster',\r\n },\r\n analysisSubMenu: 'Analiz',\r\n physicsSubMenu: 'Fizik',\r\n physics: {\r\n DailySolarRadiationHeatmap: 'Günlük Isı Haritası',\r\n SolarRadiationHeatmapOptions: 'Isı Haritası Seçenekleri',\r\n SolarRadiationHeatmapGridCellSize: 'Hücre Boyutu',\r\n SolarRadiationHeatmapMaxValue: 'Işınım Maksimum Değer',\r\n SolarRadiationHeatmapNoAnimation: 'Animasyon Yok',\r\n ReflectionHeatmap: 'Yansıma Isı Haritası',\r\n },\r\n sensorSubMenu: 'Sensörler',\r\n sensor: {\r\n CollectDailyData: 'Günlük Veri Topla',\r\n CollectYearlyData: 'Yıllık Veri Topla',\r\n SensorSimulationNoAnimation: 'Animasyon Yok',\r\n },\r\n buildingSubMenu: 'Building',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\r\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\r\n },\r\n solarPanelSubMenu: 'Güneş Panelleri',\r\n solarPanel: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n AnalyzeVisibility: 'Görünüm Analizi',\r\n PanelDiscretization: 'Panel Ayrıklaştırma',\r\n Exact: 'Kesin',\r\n Approximate: '\tYaklaşık',\r\n EnergyGridCellSize: 'Hücre Boyutu',\r\n VisibilityGridCellSize: 'Hücre Boyutu',\r\n EnergyAnalysisOptions: 'Enerji Analiz Seçenekleri',\r\n VisibilityAnalysisOptions: 'Görünüm Analiz Seçenekleri',\r\n SolarPanelSimulationNoAnimation: 'Animasyon Yok',\r\n },\r\n parabolicTroughSubMenu: 'Parabolik Oluk',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n },\r\n parabolicDishSubMenu: 'Parabolik Çanak',\r\n parabolicDish: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n },\r\n fresnelReflectorSubMenu: 'Fresnel Yansıtıcı',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n },\r\n heliostatSubMenu: 'Heliostat',\r\n heliostat: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n },\r\n solarUpdraftTowerSubMenu: 'Solar Updraft Kulesi',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n SolarUpdraftTowerSimulationNoAnimation: 'Animasyon Yok',\r\n },\r\n\r\n tutorialsSubMenu: 'Öğrenme Merkezi',\r\n\r\n solarEnergyScienceSubMenu: 'Güneş Bilimi',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: 'Gözlemciye Göre Güneş Açıları',\r\n InsolationAndClimate: 'Güneşlenme ve İklim',\r\n SolarRadiationToBox: 'Kutu Güneş Işınımı',\r\n },\r\n\r\n buildingScienceSubMenu: 'Building Science',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\r\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\r\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\r\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\r\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\r\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\r\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\r\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\r\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\r\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\r\n },\r\n\r\n buildingDesignSubMenu: 'Bina Tasarımı',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: 'Çatı Pencereli Cape Cod Evi',\r\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\r\n GableRoofVsHipRoof: 'Beşik Çatı vs. Kırma Çatı',\r\n ColonialVsSaltbox: 'Koloni vs. Tuz Kutusu',\r\n GambrelRoofVsMansardRoof: 'Flemenk Çatı vs. Mansart Çatı',\r\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\r\n DutchGableRoof: 'Dutch Gable Roof',\r\n GableAndValleyRoof: 'Gable and Valley Roof',\r\n ClerestoryRoof: 'Clerestory Roof',\r\n MonitorRoof: 'Monitor Roof',\r\n AFrameHouse: 'A-Frame House',\r\n HalfTimberedHouse: 'Half-Timbered House',\r\n AllBasicRoofTypes: 'Tüm Çatı Tipleri',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: 'Fotovoltaik Güneş Enerjisi',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: 'Güneş Paneli Eğim Açısı Etkisi',\r\n EffectOfAzimuthOfSolarPanel: 'Güneş Paneli Azimut Açısı Etkisi',\r\n SolarPanelTypes: 'Solar Panel Types',\r\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\r\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\r\n SolarTrackers: 'Güneş İzleyiciler',\r\n CoveringGroundWithSolarPanels:\r\n 'Sadece güneş panellerini kullanarak yüzeyi kaplamak neden iyi bir fikir değildir?',\r\n InterRowSpacingOfSolarPanelArray: 'Güneş Paneli Dizi Arası Boşluk Etkisi',\r\n EffectOfOrientationOfSolarPanels: 'Güneş Panelleri Yön Etkisi',\r\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: 'Yoğunlaştırılmış Güneş Enerjisi',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: 'Parabolik Oluk Azimut Açısı Etkisi',\r\n EffectOfLatusRectumOfParabolicTrough: 'Parabolik Oluk Özkiriş Etkisi',\r\n FocusSunlightWithParabolicDish: 'Güneş Işığını Parabolik Çanakla Odaklama',\r\n LinearFresnelReflectors: 'Doğrusal Fresnel Reflektörler',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\r\n 'Doğrusal Fresnel Reflektörlerde Soğurucu Boru Yükseklik Etkisi',\r\n EffectOfAzimuthOfLinearFresnelReflectors: 'Doğrusal Fresnel Reflektörlerde Azimut Açısı Etkisi',\r\n LinearFresnelReflectorsWithTwoAbsorbers: 'İki Soğuruculu Doğrusal Fresnel Reflektörler',\r\n CosineEfficiencyOfHeliostats: 'Heliostatların Kosinüs Verimliliği',\r\n ShadowingAndBlockingOfHeliostats: 'Heliostatlarda Gölgeleme ve Engellenme',\r\n EffectSolarPowerTowerHeight: 'Güneş Güç Kulesi Yükseklik Etkisi',\r\n SolarPowerTower: 'Güneş Güç Kulesi',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: 'Diğer Güneş Gücü Türleri',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: 'Solar Updraft Kulesi',\r\n },\r\n\r\n generativeDesignSubMenu: 'Generative Design',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\r\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\r\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\r\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\r\n },\r\n\r\n examplesSubMenu: 'Örnekler',\r\n\r\n solarEnergySubMenu: 'Güneş Enerjisi',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: 'Güneş Işını ve Heliodon',\r\n RooftopSolarPanels: 'Çatı Üstü Güneş Panelleri',\r\n NevadaSolarOneParabolicTroughArray: 'Nevada Eyaletinde Parabolik Oluk Dizisi',\r\n TooeleParabolicDishArray: 'Tooele Şehrinde Parabolik Çanak Dizisi',\r\n PS10SolarPowerTower: 'PS10 Güneş Güç Kulesi',\r\n TucsonLinearFresnelReflectors: 'Tucson Şehrinde Doğrusal Fresnel Reflektörleri',\r\n SolarCanopyFormFactors: 'Solar Gölgelik Biçim Etkileri',\r\n SolarCanopyOverBleachers: 'Tirübün Üzeri Solar Gölgelik',\r\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\r\n SolarBusStop: 'Solar Otobüs Durağı',\r\n SolarFacadeTesla: 'Tesla Solar Façade',\r\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\r\n Floatovoltaics: 'Floatovoltaics',\r\n Agrivoltaics: 'Agrivoltaics',\r\n VegetativeBuffer: 'Bitkisel Tampon',\r\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\r\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\r\n SolarPanelsOverCanalBakersfieldCA: 'Bakersfield Şehrinde Kanal Üzerindeki Varsayımsal Güneş Panelleri',\r\n SolarNoiseBarrierLexingtonMA: 'Lexington Kasabasında Varsayımsal Güneş Gürültü Bariyeri',\r\n HSATSolarTrackersRaleighNC: 'Raleigh Şehrinde Yatay Tek Eksenli İzleyiciler (HSAT)',\r\n AADATSolarTrackersLancasterCA: 'Lancaster Şehrinde Azimut–İrtifa Çift Eksenli İzleyiciler (AADAT)',\r\n SolarUpdraftTowerInCity: 'Şehir Solar Updraft Kulesi',\r\n },\r\n\r\n builtEnvironmentSubMenu: 'Yapılı Çevre',\r\n residentialBuildingsSubMenu: 'Konut inşaatları',\r\n residentialBuildingExamples: {\r\n ColonialHouse: 'Colonial House',\r\n DutchColonialHouse: 'Flemenk Koloni Evi',\r\n TShapedHouse: 'T-Shaped House',\r\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\r\n Solarium: 'Solaryum',\r\n Church1: 'Kilise 1',\r\n Cathedral1: 'Cathedral 1',\r\n Cathedral2: 'Cathedral 2',\r\n Mosque1: 'Mosque 1',\r\n AdobeTaosHouse: 'Adobe Taos House',\r\n RanchHouse: 'Ranch House',\r\n BonnetHouse: 'Bonnet House',\r\n BarnStyleHouse: 'Çiftlik Evi',\r\n ModernHouse: 'Modern House',\r\n ButterflyRoofHouse: 'Butterfly Roof House',\r\n },\r\n commercialBuildingsSubMenu: 'Ticari Binalar',\r\n commercialBuildingExamples: {\r\n WhiteHouse: 'White House',\r\n BilimMersinTurkiye: 'Yenişehir Belediyesi Bilim ve Sanat Merkezi',\r\n SpanishStyleHotel: 'Spanish Style Hotel',\r\n ApartmentBuilding: 'Apartment Building',\r\n OfficeBuilding: 'Ofis Binası',\r\n Hotel: 'Hotel',\r\n },\r\n buildingComplexesSubMenu: 'Building Complexes',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: 'Güney Burlington Lisesi',\r\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\r\n },\r\n urbanPlanningSubMenu: 'Şehir Planlaması',\r\n urbanPlanningExamples: {\r\n Heatmap1: 'Isı Haritası',\r\n },\r\n otherBuildingsSubMenu: 'Other Buildings',\r\n otherBuildingExamples: {\r\n Greenhouse: 'Sera',\r\n Pavilion: 'Park Kamelyası',\r\n OctagonalPagoda: 'Octagonal Pagoda',\r\n OceanFront: 'Ocean Front',\r\n EgyptianPyramids: 'Egyptian Pyramids',\r\n MayanPyramid: 'Mayan Pyramid',\r\n SiOSePol: 'Si-o-se-pol',\r\n StackedCuboids: 'Stacked Cuboids',\r\n },\r\n\r\n artificialIntelligenceSubMenu: 'Yapay Zeka',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: 'Güneş Paneli Sıra Eğim Açısı Optimize Etme',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Çoklu Güneş Paneli Sıra Eğim Açısı Optimize Etme',\r\n SolarFarmGenerativeDesign: 'Güneş Tarlası Tasarımı',\r\n SolarFarmGenerativeDesignWithBlock: 'Blok Varlığında Güneş Tarlası Tasarımı',\r\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Güneş Tarlası Tasarımı',\r\n },\r\n\r\n languageSubMenu: 'Dil',\r\n publicSubMenu: 'Public',\r\n ModelsGallery: 'Models Gallery',\r\n ModelsMap: 'Models Map',\r\n AboutUs: 'Hakkımızda',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: 'Hesap Ayarları',\r\n PrivacyStatementTitle: 'User Privacy Protection Statement',\r\n PrivacyStatement:\r\n 'Oturum açtığınızda, Aladdin hesabınızı oluşturmak ve hesabınıza erişmek için Google Kimliğiniz kullanılır. Veritabanımızda referans olarak yalnızca rastgele bir alfasayısal dize depolanır. Adınız veya e-posta adresiniz gibi kişisel olarak tanımlanabilir hiçbir veri toplanmaz. Daha fazla bilgi için ',\r\n SignIn: 'Kayıt Ol',\r\n SignOut: 'Oturum Kapat',\r\n IfYouAreAStudent: 'Eğer Öğrenciyseniz',\r\n },\r\n\r\n skyMenu: {\r\n Axes: 'Eksenler',\r\n Theme: 'Tema',\r\n ThemeDefault: 'Varsayılan',\r\n ThemeDesert: 'Çöl',\r\n ThemeDune: 'Dune',\r\n ThemeForest: 'Orman',\r\n ThemeGrassland: 'Çayır',\r\n ThemeHill: 'Hill',\r\n ThemeLake: 'Lake',\r\n ThemeMountain: 'Mountain',\r\n ThemeRural: 'Rural',\r\n SunlightAttenuationCoefficientInAir: 'Havan Güneş Işığı Zayıflatma Katsayısı',\r\n ConvectiveCoefficientOfAir: 'Havan Isı İletkenlik Katsayısı',\r\n HighestTemperatureTimeInMinutes: 'En Yüksek Sıcaklık Süresi (Dakika)',\r\n SelectSunAnglesToShow: 'Gösterilecek Güneş Açılarını Seçin',\r\n ShowAzimuthAngle: 'Azimut Açısını Göster',\r\n ShowElevationAngle: 'Yükselme Açısını Göster',\r\n ShowZenithAngle: 'Zenit Açısını Göster',\r\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\r\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\r\n Vegetation: 'Vegetation',\r\n LeafOutDay: 'Leaf-Out Day',\r\n LeafOffDay: 'Leaf-Off Day',\r\n Albedo: 'Albedo',\r\n ImageOnGround: 'Yer Görüntüsü',\r\n WaterSurface: 'Water Surface',\r\n RemoveAllUnlockedTrees: 'Tüm Ağaçları Kaldır',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedPeople: 'Tüm Kişileri Kaldır',\r\n RemoveAllUnlockedFoundations: 'Tüm Temelleri Kaldır',\r\n RemoveAllUnlockedCuboids: 'Tüm Kübikleri Kaldır',\r\n DoYouReallyWantToRemoveAllPeople: 'Tüm Kişileri Kaldırmak İstiyor Musunuz?',\r\n DoYouReallyWantToRemoveAllTrees: 'Tüm Ağaçları Kaldırmak İstiyor Musunuz?',\r\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\r\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\r\n DoYouReallyWantToRemoveAllFoundations: 'Tüm Temelleri Kaldırmak İstiyor Musunuz?',\r\n DoYouReallyWantToRemoveAllCuboids: 'Tüm Kübikleri Kaldırmak İstiyor Musunuz?',\r\n LockAllElements: 'Tüm Öğeleri Kilitle',\r\n UnlockAllElements: 'Tüm Öğelerin Kilidini Aç',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: 'Etiket',\r\n LabelText: 'Label Text',\r\n LabelHeight: 'Label Height',\r\n LabelSize: 'Label Size',\r\n LabelFontSize: 'Font Size',\r\n LabelColor: 'Label Color',\r\n KeepShowingLabel: 'Etiketi Göstermeye Devam Et',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: 'Tüm Kilitlenmemiş Güneş Panellerini Kaldır',\r\n RemoveAllUnlockedParabolicTroughs: 'Tüm Kilitlenmemiş Parabolik Olukları Kaldır',\r\n RemoveAllUnlockedParabolicDishes: 'Tüm Kilitlenmemiş Parabolik Çanakları Kaldır',\r\n RemoveAllUnlockedFresnelReflectors: 'Tüm Kilitlenmemiş Fresnel Reflektörleri Kaldır',\r\n RemoveAllUnlockedHeliostats: 'Tüm Kilitlenmemiş Heliostatları Kaldır',\r\n RemoveAllUnlockedSensors: 'Tüm Kilitlenmemiş Sensörleri Kaldır',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n RemoveAllUnlockedWalls: 'Tüm Kilitlenmemiş Duvarları Kaldır',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Çokgenleri Kaldır',\r\n RemoveAllUnlockedHumans: 'Tüm Kilitlenmemiş İnsanları Kaldır',\r\n RemoveAllUnlockedTrees: 'Tüm Kilitlenmemiş Ağaçları Kaldır',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Çerçeveler',\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n SolarPanels: 'Güneş Panelleri',\r\n SolarPanelArray: 'Solar Panel Array',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\r\n ' Seçili temel üzerindeki tüm güneş panellerini kaldırmak istiyor musunuz?',\r\n ParabolicTroughs: 'Parabolik Oluklar',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm parabolik olukları kaldırmak istiyor musunuz?',\r\n ParabolicDishes: 'Parabolik Çanaklar',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm parabolik çanakları kaldırmak istiyor musunuz?',\r\n FresnelReflectors: 'Fresnel Reflektörler',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm Fresnel reflektörlerini kaldırmak istiyor musunuz?',\r\n Heliostats: 'Heliostatlar',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm heliostatları kaldırmak istiyor musunuz?',\r\n Sensors: 'Sensörler',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm sensörleri kaldırmak istiyor musunuz?',\r\n Lights: 'Lights',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation:\r\n 'Do you really want to remove all the lights on this foundation that are not locked',\r\n Walls: 'Duvarlar',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm duvarları kaldırmak istiyor musunuz? ',\r\n Windows: 'Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\r\n 'Do you really want to remove all the windows on this foundation that are not locked',\r\n Doors: 'Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\r\n 'Do you really want to remove all the doors on this foundation that are not locked',\r\n Polygons: 'Poligonlar',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm poligonları kaldırmak istiyor musunuz?',\r\n Humans: 'Kişiler',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm insanları kaldırmak istiyor musunuz?',\r\n Trees: 'Ağaçlar',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm ağaçları kaldırmak istiyor musunuz?',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\r\n 'Do you really want to remove all the flowers on this foundation that are not locked',\r\n OnlyThisFoundation: 'Sadece Seçili Temel',\r\n AllConnectedFoundations: 'Tüm Bağlantılı Temeller',\r\n AllSelectedFoundations: 'All Selected Foundations',\r\n AllFoundations: 'Tüm Temeller',\r\n AddPolygon: 'Poligon Ekle',\r\n SolarStructure: 'Solar Yapı Seçin',\r\n GroupMaster: 'Grup Yöneticisi',\r\n LockAllElementsOnThisFoundation: ' Seçili temel üzerindeki tüm öğeleri kilitle',\r\n UnlockAllElementsOnThisFoundation: ' Seçili temel üzerindeki tüm öğelerin kilidini aç',\r\n GroundFloorRValue: 'Ground Floor R-Value',\r\n OnlyThisGroundFloor: 'Only This Ground Floor',\r\n AllGroundFloors: 'All Ground Floors',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: 'Heliostat Alıcı Kulesi',\r\n ReceiverTowerPhysicalProperties: 'Alıcı Kule Fiziksel Özellikler',\r\n ReceiverTowerHeight: 'Alıcı Kule Yükseklik',\r\n ReceiverTowerRadius: 'Alıcı Kule Yarıçap',\r\n ReceiverAbsorptance: 'Alıcı Absorbsiyon',\r\n ReceiverOpticalEfficiency: 'Alıcı Optik Verim',\r\n ReceiverThermalEfficiency: 'Alıcı Termal Verim',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: 'Fresnel Reflektör Soğurucu Boru',\r\n AbsorberPipePhysicalProperties: 'Soğurucu Boru Fiziksel Özellikler',\r\n AbsorberHeight: 'Soğurucu Boru Yükseklik',\r\n AbsorberApertureWidth: 'Soğurucu boru diyafram genişliği',\r\n AbsorberPipePoleNumber: 'Soğurucu Boru Sayısı',\r\n AbsorberAbsorptance: 'Soğurucu Absorbsiyonu',\r\n AbsorberOpticalEfficiency: 'Soğurucu Optik Verimlilik',\r\n AbsorberThermalEfficiency: 'Soğurucu Isıl Verimlilik',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: 'Solar Updraft Kulesi',\r\n SolarUpdraftTowerPhysicalProperties: 'Solar Updraft Kulesi Fiziksel Özellikler',\r\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Kulesi Baca Yüksekliği',\r\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Kulesi Baca Yarıçapı',\r\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Kulesi Collector Height',\r\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Kulesi Kollektör Yarıçapı',\r\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Kulesi Kollektör Geçirgenliği',\r\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Kulesi Kollektör Emisivite',\r\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Kulesi Deşarj Katsayısı',\r\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Kulesi Türbin Verimliliği',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n RemoveAllUnlockedSolarPanels: 'Tüm Kilitlenmemiş Güneş Panellerini Kaldır',\r\n RemoveAllUnlockedSensors: 'Tüm Kilitlenmemiş Sensörleri Kaldır',\r\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Poligonları Kaldır',\r\n RemoveAllUnlockedHumans: 'Tüm Kilitlenmemiş Kişileri Kaldır',\r\n RemoveAllUnlockedTrees: 'Tüm Kilitlenmemiş Ağaçları Kaldır',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Çerçeveler',\r\n SolarPanels: 'Güneş Panelleri',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm güneş panellerini kaldırmak istiyor musunuz?',\r\n Sensors: 'Sensörler',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm sensörleri kaldırmak istiyor musunuz?',\r\n Polygons: 'Poligonlar',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm poligonları kaldırmak istiyor musunuz?',\r\n Humans: 'İnsanlar',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm insanları kaldırmak istiyor musunuz?',\r\n Trees: 'Ağaçlar',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm ağaçları kaldırmak istiyor musunuz?',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\r\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\r\n OnlyThisCuboid: 'Sadece Seçili Kübik',\r\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\r\n AllCuboidsAboveSameBase: 'All Cuboids above Same Base',\r\n AllSelectedCuboids: 'All Selected Cuboids',\r\n AllCuboids: 'Tüm Kübikler',\r\n OnlyThisSide: 'Sadece Seçili Yüzey',\r\n AllSidesOfThisCuboid: 'Seçili Kübik Tüm Yüzeyler',\r\n AllSidesOfSelectedCuboids: 'All Sides of Selected Cuboids',\r\n AllSidesOfAllCuboids: 'Bütün Kübik Yüzeyleri ',\r\n AddPolygon: 'Poligon Ekle',\r\n Stackable: 'Stackable',\r\n GroupMaster: 'Group Master',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n TextBox: 'Text Box',\r\n FontOutlineColor: 'Font Outline Color',\r\n FontOutlineWidth: 'Font Outline Width',\r\n FontStrokeColor: 'Font Stroke Color',\r\n FontStrokeWidth: 'Font Stroke Width',\r\n NoOutline: 'No Outline',\r\n Shiny: 'Shiny',\r\n Filled: 'Dolgu',\r\n FillTexture: 'Dolgu Dokusu',\r\n FillColor: 'Dolgu Rengi',\r\n Opacity: 'Opaklık',\r\n LineColor: 'Çizgi Rengi',\r\n LineWidth: 'Çizgi Kalınlığı',\r\n LineStyle: 'Çizgi Stili',\r\n SolidLine: 'Düz çizgi',\r\n DashedLine: 'Kesik çizgi',\r\n DottedLine: 'Noktalı çizgi',\r\n InsertVertexBeforeIndex: 'İndeksten Önce Tepe Noktası Ekle',\r\n InsertVertexAfterIndex: 'İndeksten Sonra Tepe Noktası Ekle',\r\n DeleteVertex: 'Tepe Noktası Sil',\r\n OnlyThisPolygon: 'Sadece Seçili Poligon',\r\n AllPolygonsOnSurface: 'Tüm Poligonlar Aynı Yüzeyde',\r\n AllPolygonsAboveFoundation: 'Temel Üzerindeki Tüm Poligonlar',\r\n AllSelectedPolygons: 'All Selected Polygons',\r\n AllPolygons: 'Tüm Poligonlar',\r\n Layout: 'Düzen',\r\n SolarPanelArrayLayout: 'Güneş Paneli Dizi Düzeni',\r\n SolarPanelArrayLayoutParametricDesign: 'Güneş Paneli Dizi Düzeni: Parametrik Tasarım',\r\n SolarPanelArrayLayoutGenerativeDesign: 'Güneş Paneli Dizi Düzeni: Üretici Tasarım',\r\n SolarPanelArrayModel: 'Güneş Paneli Modeli',\r\n SolarPanelArrayOrientation: 'Oryantasyon',\r\n SolarPanelArrayTiltAngle: 'Eğim Açısı',\r\n SolarPanelArrayRowWidth: 'Dizi Sıra Genişliği',\r\n SolarPanelArrayInterRowSpacing: 'Dizi Sıra Arası Boşluk',\r\n SolarPanelArrayRowSpacing: 'Row Spacing',\r\n SolarPanelArrayRowAxis: 'Dizi Sıra Ekseni',\r\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\r\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\r\n SolarPanelArrayEastWestRowAxis: 'Doğu-Batı (Absolute)',\r\n SolarPanelArrayNorthSouthRowAxis: 'Kuzey-Güney (Absolute)',\r\n SolarPanelArrayMargin: 'Margin',\r\n SolarPanelArrayPoleHeight: 'Direk Yükseklik',\r\n SolarPanelArrayPoleSpacing: 'Direk Aralık',\r\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\r\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\r\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\r\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\r\n SolarPanelArrayYearlyProfit: 'Profit',\r\n LayoutNotAcceptedCheckYourParameters: 'Bu yerleşim düzeni uygulanamaz. Lütfen parametrelerinizi kontrol edin.',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: 'Optimizasyon',\r\n Parameters: 'Parametreler',\r\n Variables: 'Değişkenler',\r\n Constants: 'Sabitler',\r\n GeneticAlgorithm: 'Genetik Algoritma',\r\n GeneticAlgorithmSettings: 'Genetik Algoritma Ayarı',\r\n ParticleSwarmOptimization: 'Parçacık Sürü Optimizasyon',\r\n ParticleSwarmOptimizationSettings: 'Parçacık Sürü Optimizasyon Ayarı',\r\n SolarPanelTiltAngleOptimization: 'Güneş Paneli Eğim Açısı Optimizasyonu',\r\n SolarPanelArrayLayout: 'Güneş Paneli Dizi Düzeni',\r\n Generation: 'Nesil',\r\n Gene: 'Gen',\r\n NormalizedVariables: 'Normalleştirilmiş Değişkenler',\r\n Objective: 'Amaç',\r\n ObjectiveFunctionDailyTotalYield: 'Günlük Toplam Üretim',\r\n ObjectiveFunctionYearlyTotalYield: 'Yıllık Toplam Üretim',\r\n ObjectiveFunctionDailyMeanYield: 'Günlük Ortalama Üretim',\r\n ObjectiveFunctionYearlyMeanYield: 'Yıllık Ortalama Üretim',\r\n ObjectiveFunctionDailyProfit: 'Günlük Kazanç',\r\n ObjectiveFunctionYearlyProfit: 'Yıllık Kazanç',\r\n GeneticAlgorithmSelectionMethod: 'Genetik Algoritma Seçim Yöntemi',\r\n RouletteWheel: 'Rulet Çarkı',\r\n Tournament: 'Turnuva',\r\n SearchMethod: 'Arama Yöntemi',\r\n GlobalSearchUniformSelection: 'Küresel Arama Standart Seçim',\r\n LocalSearchRandomOptimization: 'Yerel Arama Rastgele Optimizasyon',\r\n PopulationSize: 'Popülasyon Boyutu',\r\n MaximumGenerations: 'Maksimum Nesil',\r\n SelectionRate: 'Seçim Oranı',\r\n CrossoverRate: 'Geçiş Oranı',\r\n MutationRate: 'Mutasyon Oranı',\r\n Step: 'Adım',\r\n SwarmSize: 'Sürü Boyutu',\r\n MaximumSteps: 'Maksimum Adım',\r\n MaximumVelocity: 'Maksimum Hız',\r\n InertiaWeight: 'Atalet Ağırlığı',\r\n CognitiveCoefficient: 'Bilişsel Katsayı',\r\n SocialCoefficient: 'Sosyal Katsayı',\r\n ConvergenceThreshold: 'Sonlandırma için Yakınsama Eşiği',\r\n LocalSearchRadius: 'Yerel Arama Yarıçapı',\r\n RowsPerRackRange: 'Raf Başına Sıra Aralığı',\r\n TiltAngleRange: 'Eğim Açısı Aralığı',\r\n InterRowSpacingRange: 'Sıra Arası Aralık Ranjı',\r\n ClickTargetPolygonToActivate: 'Etkinleştirmek için Hedef Poligona Tıklayınız',\r\n ClickTargetFoundationToActivate: 'Etkinleştirmek için Hedef Temele Tıklayınız',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: 'Modeli Göster',\r\n Flip: 'Flip',\r\n Type: 'Tür',\r\n Spread: 'Yayılım',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: 'Flip',\r\n Type: 'Type',\r\n Spread: 'Spread',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: 'Kişi Değiştir',\r\n Flip: 'Flip',\r\n Observer: 'Gözlemci',\r\n ViewFromThisPerson: ' Seçili Kişiye Göre Perspektif',\r\n },\r\n\r\n lightMenu: {\r\n Color: 'Color',\r\n Intensity: 'Intensity',\r\n Decay: 'Decay',\r\n MaximumDistance: 'Distance',\r\n Inside: 'Inside',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: 'Göreceli Azimut Açısı',\r\n Pole: 'Pole',\r\n PoleHeight: 'Direk Yüksekliği',\r\n PoleRadius: 'Pole Radius',\r\n ExtraPoleHeight: 'Ekstra Direk Yüksekliği',\r\n ExtraPoleHeightInAdditionToHalfWidth: 'Yarım Genişliğe Ek Ekstra Direk Yüksekliği',\r\n DrawSunBeam: 'Güneş Işını Çiz',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: 'Reflektör Yansıma',\r\n ReceiverAbsorptance: 'Alıcı Absorbsiyonu',\r\n ReflectorOpticalEfficiency: 'Reflektör Optik Verimliliği',\r\n ReceiverThermalEfficiency: 'Alıcı Termal Verimliliği',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: 'Inverter Efficiency',\r\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\r\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\r\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\r\n ChangePvModel: 'PV Modelini Değiştir',\r\n Orientation: 'Oryantasyon',\r\n Portrait: 'Portre',\r\n Landscape: 'Peyzaj',\r\n FrameColor: 'Frame Color',\r\n Panels: 'Paneller',\r\n PanelsWide: 'Panel Genişliği',\r\n PanelsLong: 'Panel Uzunluğu',\r\n TiltAngle: 'Eğim Açısı',\r\n SouthFacingIsPositive: 'Güney yönünde açı pozitiftir.',\r\n Tracker: 'İzleyici',\r\n SolarTrackerFollowsSun: 'Güneş paneli verimini artırmak için bir güneş izleme sistemi güneşi sürekli takip eder.',\r\n PoleSpacing: 'Direk Aralığı',\r\n NoTracker: 'İzleme Sistemi Yok',\r\n HorizontalSingleAxisTracker: 'Yatay Tek Eksenli İzleme Sistemi',\r\n VerticalSingleAxisTracker: 'Dikey Tek Eksenli İzleme Sistemi',\r\n AltazimuthDualAxisTracker: 'Altazimut Çift Eksenli İzleme Sistemi',\r\n OnlyThisSolarPanel: 'Sadece Seçili Güneş Paneli',\r\n AllSolarPanelsOnSurface: 'Tüm Güneş Panelleri Aynı Yüzeyde',\r\n AllSolarPanelsAboveFoundation: 'Tüm Güneş Panelleri Aynı Temel Üzerinde',\r\n AllSelectedSolarPanels: 'All Selected Solar Panels',\r\n AllSolarPanels: 'Tüm Güneş Panelleri',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: 'Güneş Paneli Özellikleri',\r\n Model: 'Model',\r\n PanelSize: 'Panel Boyutu',\r\n Cells: 'Hücreler',\r\n CellType: 'Hücre Tipi',\r\n Monocrystalline: 'Monokristal',\r\n Polycrystalline: 'Polikristal',\r\n ThinFilm: 'İnce Katman',\r\n Bifacial: 'Bifacial',\r\n BifacialityFactor: 'Bifaciality Factor',\r\n Black: 'Siyah',\r\n Blue: 'Mavi',\r\n ShadeTolerance: 'Gölge Toleransı',\r\n SolarCellEfficiency: 'Güneş Pili Verimliliği',\r\n NominalOperatingCellTemperature: 'Nominal Çalışma Hücresi Sıcaklığı',\r\n TemperatureCoefficientOfPmax: 'Pmax Sıcaklık Katsayısı',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: 'Modül Uzunluğu',\r\n Modules: 'Modüller',\r\n ModulesLong: 'Modüllerin Uzunluğu',\r\n LatusRectum: 'Özkiriş',\r\n OnlyThisParabolicTrough: 'Sadece Seçili Parabolik Oluk',\r\n AllParabolicTroughsAboveFoundation: 'Aynı Temelin Üzerindeki Tüm Parabolik Oluklar',\r\n AllSelectedParabolicTroughs: 'All Selected Parabolic Troughs',\r\n AllParabolicTroughs: 'Tüm Parabolik Oluklar',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: 'Soğurucu Boru',\r\n SelectAbsorberToReflectSunlightTo: 'Güneş Işığı Yansıtılacak Soğurucuyu Seçin',\r\n ModuleLength: 'Modül Uzunluğu',\r\n Modules: 'Modüller',\r\n ModulesLong: 'Modüllerin Uzunluğu',\r\n OnlyThisFresnelReflector: 'Sadece Seçili Fresnel Reflektör',\r\n AllFresnelReflectorsAboveFoundation: 'Aynı Temel Üzerindeki Tüm Fresnel Reflektörler',\r\n AllSelectedFresnelReflectors: 'All Selected Fresnel Reflectors',\r\n AllFresnelReflectors: 'Tüm Fresnel Reflektörler',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: 'Kule',\r\n SelectTowerToReflectSunlightTo: 'Güneş Işığı Yansıtılacak Kuleyi Seçin',\r\n OnlyThisHeliostat: 'Sadece Seçili Heliostat',\r\n AllHeliostatsAboveFoundation: 'Aynı Temel Üzerindeki Tüm Heliostatlar',\r\n AllSelectedHeliostats: 'All Selected Heliostats',\r\n AllHeliostats: 'Tüm Heliostatlar',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: 'Alıcı Yapısı',\r\n CentralPole: 'Merkez Direk',\r\n CentralPoleWithTripod: 'Tripodlu Merkez Direk',\r\n Quadrupod: 'Dört Ayaklı',\r\n RimDiameter: 'Kasnak Çapı',\r\n LatusRectum: 'Özkiriş',\r\n ExtraPoleHeightInAdditionToRadius: 'Yarıçapa Ek Olarak Ekstra Direk Yüksekliği',\r\n OnlyThisParabolicDish: 'Sadece Seçili Parabolik Çanak',\r\n AllParabolicDishesAboveFoundation: 'Aynı Temel Üzerindeki Tüm Parabolik Çanaklar',\r\n AllSelectedParabolicDishes: 'All Selected Parabolic Dishes',\r\n AllParabolicDishes: 'Tüm Parabolik Çanaklar',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: 'Varsayılan',\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n SizeOfWall: 'Duvar Boyutu',\r\n OnlyThisWall: 'Sadece Seçili Duvar',\r\n AllConnectedWalls: 'All Connected Walls',\r\n AllWallsAboveFoundation: ' Aynı Temel Üzerindeki Tüm Duvarlar',\r\n AllSelectedWalls: 'All Selected Walls',\r\n AllWalls: 'Tüm Duvarlar',\r\n Windows: 'Pencereler',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Kilitlenmemiş Tüm Pencereleri Kaldır',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: ' Seçili duvardaki tüm pencereleri kaldırmak istiyor musunuz?',\r\n Doors: 'Kapılar',\r\n RemoveAllUnlockedDoors: 'Tüm Kilitlenmemiş Kapıları Kaldır',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: ' Seçili duvardaki tüm kapıları kaldırmak istiyor musun?',\r\n SolarPanels: 'Güneş Panelleri',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Kilitlenmemiş Tüm Güneş Panellerini Kaldır',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:\r\n ' Seçili duvardaki tüm güneş panellerini kaldırmak istiyor musunuz?',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\r\n LockAllPolygons: 'Lock All Polygons',\r\n UnlockAllPolygons: 'Unlock All Polygons',\r\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Poligonları Kaldır',\r\n WallStructure: 'Duvar Yapısı',\r\n DefaultStructure: 'Varsayılan',\r\n StudStructure: 'Ahşap Dikme',\r\n PillarStructure: 'Pillar',\r\n Opacity: 'Opaklık',\r\n StructureSpacing: 'Structure Spacing',\r\n StructureWidth: 'Structure Width',\r\n StructureThickness: 'Structure Thickness',\r\n StructureColor: 'Structure Color',\r\n Color: 'Wall Color',\r\n Height: 'Height',\r\n Thickness: 'Thickness',\r\n Texture: 'Texture',\r\n AllLightsOnWallInside: 'All Lights on Wall Inside',\r\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\r\n Fill: 'Fill',\r\n Full: 'Full',\r\n Partial: 'Partial',\r\n Empty: 'Empty',\r\n OpenToOutside: 'Open to Outside',\r\n EavesLength: 'Eaves Overhang Length',\r\n Parapet: 'Parapet',\r\n ParapetColor: 'Parapet Color',\r\n ParapetTexture: 'Parapet Texture',\r\n ParapetHeight: 'Parapet Height',\r\n CopingsHeight: 'Copings Height',\r\n CopingsWidth: 'Copings Width',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: 'Sadece Bu Pencere',\r\n AllWindowsOnSurface: 'All Windows on the Same Surface',\r\n AllWindowsAboveFoundation: 'Aynı Temelin Üzerindeki Tüm Pencereler',\r\n AllSelectedWindows: 'All Selected Windows',\r\n AllWindows: 'Tüm Pencereler',\r\n Width: 'Genişlik',\r\n Height: 'Yükseklik',\r\n Setback: 'Setback from Exterior Surface',\r\n RelativeToWallThickness: 'Relative to wall thickness',\r\n Mullion: 'Tiriz',\r\n HorizontalMullion: 'Horizontal Mullion',\r\n VerticalMullion: 'Vertical Mullion',\r\n MullionWidth: 'Tiriz Genişliği',\r\n HorizontalMullionSpacing: 'Horizontal Mullion Spacing',\r\n VerticalMullionSpacing: 'Vertical Mullion Spacing',\r\n MullionColor: 'Mullion Color',\r\n Tint: 'Ton',\r\n Opacity: 'Opaklık',\r\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\r\n Shutter: 'Kepenk',\r\n LeftShutter: 'Sol Kepenk',\r\n RightShutter: 'Sağ Kepenk',\r\n BothShutters: 'Kepenkler',\r\n ShutterWidth: 'Genişlik',\r\n ShutterColor: 'Kepenk Rengi',\r\n Frame: 'Frame',\r\n FrameWidth: 'Frame Width',\r\n SillWidth: 'Sill Width',\r\n Color: 'Frame Color',\r\n WindowType: 'Window Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Polygonal: 'Polygonal',\r\n Interior: 'Interior',\r\n Empty: 'Empty',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: 'Varsayılan',\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n OnlyThisRoof: 'Sadece Seçili Çatı',\r\n AllRoofsAboveFoundation: 'Aynı Temelin Üzerinde Tüm Çatılar',\r\n AllSelectedRoofs: 'All Selected Roofs',\r\n AllRoofs: 'Tüm Çatılar',\r\n OnlyThisCeiling: 'Only This Ceiling',\r\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\r\n AllCeilings: 'All Ceilings',\r\n EavesOverhangLength: 'Eaves Overhang Length',\r\n RafterSpacing: 'Mertek Aralığı',\r\n RafterWidth: 'Mertek Genişliği',\r\n RafterThickness: 'Mertek Kalınlığı',\r\n RafterColor: 'Mertek Rengi',\r\n RoofColor: 'Çatı Rengi',\r\n RoofSideColor: 'Roof Side Color',\r\n GlassTint: 'Cam Tonu',\r\n Opacity: 'Opaklık',\r\n RoofStructure: 'Çatı Yapısı',\r\n DefaultStructure: 'Varsayılan',\r\n RafterStructure: 'Mertek',\r\n GlassStructure: 'Cam',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\r\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\r\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\r\n Rise: 'Rise',\r\n Ceiling: 'Ceiling',\r\n RoofRValue: 'Roof R-Value',\r\n CeilingRValue: 'Ceiling R-Value',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: 'Varsayılan',\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n Texture11: 'Doku 11',\r\n Texture12: 'Doku 12',\r\n Texture13: 'Doku 13',\r\n Texture14: 'Doku 14',\r\n Texture15: 'Doku 15',\r\n Texture16: 'Doku 16',\r\n Texture17: 'Doku 17',\r\n OnlyThisDoor: 'Sadece Seçili Kapı',\r\n AllDoorsOnWall: 'Aynı Duvardaki Tüm Kapılar',\r\n AllDoorsAboveFoundation: 'Aynı Temelin Üstündeki Tüm Kapılar',\r\n AllSelectedDoors: 'All Selected Doors',\r\n AllDoors: 'Tüm Kapılar',\r\n DoorType: 'Door Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Filled: 'Filled',\r\n FrameColor: 'Frame Color',\r\n Interior: 'Interior',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: 'Yüksek',\r\n Low: 'Düşük',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: 'Seçilen heliostat sayısı',\r\n NumberOfSelectedSolarPanels: 'Seçilen güneş paneli sayısı',\r\n ElectricityGeneratedDailyBySolarPanels: 'Güneş panellerinin günlük elektrik üretimi',\r\n SceneDiameter: 'Scene diameter',\r\n BuildingArea: 'Building area',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: 'Renk Kontrastı',\r\n FluxScale: 'Flux Scale',\r\n ClickUpOrDownArrowButtonsToChange: 'Değiştirmek için yukarı veya aşağı ok butonlarına tıklayınız',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: 'Döndürme',\r\n DragMouse: 'Sol Tık + Sürükle',\r\n Zoom: 'Yakınlaştırma',\r\n MouseWheelOrKeys: 'Tekerlek veya Ctrl+[ veya Ctrl+]',\r\n MouseWheelOrKeysMac: 'Tekerlek veya ⌘+[ veya ⌘+]',\r\n Pan: 'Ekran Kaydırma',\r\n HoldCtrlDragMouse: 'Ctrl + Sürükle',\r\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\r\n Enter2DMode: 'Enter 2D mode',\r\n Exit2DMode: 'Exit 2D mode',\r\n NavigationMode: 'Navigation mode',\r\n EnableNavigation: 'Enable navigation',\r\n DisableNavigation: 'Disable navigation',\r\n MoveForwardBack: 'Move forward/back',\r\n MoveForwardBackInstruction: 'Press W/S',\r\n MoveLeftRight: 'Move left/right',\r\n MoveLeftRightInstruction: 'Press A/D',\r\n MoveUpDown: 'Move up/down',\r\n MoveUpDownInstruction: 'Press Z/X',\r\n Turn: 'Turn',\r\n TurnInstruction: 'Press arrow keys',\r\n ResetView: 'Yeniden Başlat',\r\n AutoRotate: 'Otomatik Döndürme',\r\n StartOrStop: 'Başlat veya Durdur (F4)',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: 'Yüzey Görünümü',\r\n WeatherStations: 'Referans',\r\n WeatherStationsNote: 'Turn this off to speed up',\r\n Coordinates: 'Koordinatlar',\r\n Zoom: 'Büyüt',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: 'Güneş Paneli Görünüm',\r\n Observer: 'Gözlemci',\r\n VantagePoint: 'Referans Noktası',\r\n ItemizedVisibilityByFields: 'Alana Özel Perspektif',\r\n TotalVisibility: 'Toplam',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: 'Işık Sensörü',\r\n WeatherDataFrom: 'Hava Durumu',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: 'Daily Building Energy',\r\n YearlyBuildingEnergy: 'Yearly Building Energy',\r\n Heater: 'Heater',\r\n AC: 'AC',\r\n SolarPanel: 'Solar Panel',\r\n Net: 'Net',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: 'Güneş Paneli Günlük Üretim',\r\n SolarPanelYearlyYield: 'Güneş Paneli Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualSolarPanels: 'Herbir güneş panelinin üretimini göster',\r\n Profit: 'Kazanç',\r\n TotalCost: 'Total Cost',\r\n TotalRevenue: 'Total Revenue',\r\n TotalYield: 'Total Yield',\r\n MeanYield: 'Mean Yield',\r\n ModuleCount: 'Module Count',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: 'Parabolik Oluk Günlük Üretim',\r\n ParabolicTroughYearlyYield: 'Parabolik Oluk Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualParabolicTroughs: 'Herbir parabolik oluğun üretimini göster',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: 'Parabolik Çanak Günlük Üretim',\r\n ParabolicDishYearlyYield: 'Parabolik Çanak Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualParabolicDishes: 'Herbir parabolik çanağın üretimini göster',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: 'Fresnel Reflektör Günlük Üretim',\r\n FresnelReflectorYearlyYield: 'Fresnel Reflektör Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualFresnelReflectors: 'Herbir Fresnel yansıtıcısının üretimini göster',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: 'Heliostat Günlük Üretim',\r\n HeliostatYearlyYield: 'Heliostat Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualHeliostats: 'Herbir heliostatın üretimini göster',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: 'Solar Updraft Kulesi Günlük Üretimi',\r\n UpdraftTowerYearlyYield: 'Solar Updraft Kulesi Yıllık Üretimi',\r\n ChimneyAirTemperature: 'Baca Hava Sıcaklığı',\r\n ChimneyWindSpeed: 'Baca Rüzgar Hızı',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualUpdraftTowers: 'Herbir updraft kulesinin üretimini göster',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: 'Güneş & Saat Ayarları',\r\n SunAngles: 'Açılar',\r\n TwentyFourHours: '24 Hours',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyLikes: 'My Likes',\r\n MyCloudFiles: 'Bulut Dosyalarım',\r\n GenerateLink: 'Link Oluştur',\r\n LinkGeneratedInClipBoard: 'Klip Panosunda Oluşturulan Link',\r\n DoYouReallyWantToDelete: 'Gerçekten silmek istiyor musun?',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\r\n 'If this file has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyProjects: 'My Projects',\r\n GenerateProjectLink: 'Generate Project Link',\r\n ProjectLinkGeneratedInClipBoard: 'A link to the project was generated in the clip board',\r\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\r\n 'If this project has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: 'Project Settings',\r\n ThumbnailImageSize: 'Thumbnail Image Size',\r\n ProjectByOtherPeople: 'Project by Other People',\r\n Project: 'Project',\r\n ProjectType: 'Type',\r\n ProjectDescription: 'Description',\r\n MakeDescriptionEditable: 'Make this description editable',\r\n MakeDescriptionNonEditable: 'Make this description non-editable',\r\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\r\n SolarPanelArray: 'Solar Panel Array',\r\n CurateCurrentDesign: 'Curate current design',\r\n UpdateSelectedDesign: 'Update selected design',\r\n RemoveSelectedDesign: 'Remove selected design',\r\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\r\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\r\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\r\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\r\n ChooseSolutionSpace: 'Choose solution space',\r\n ChooseDataColoring: 'Choose data coloring',\r\n SameColorForAllDesigns: 'Same color for all designs',\r\n OneColorForEachDesign: 'One color for each design',\r\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\r\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\r\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\r\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\r\n GenerateScatteredPlot: 'Generate Scattered Plot',\r\n SelectXAxis: 'Select X Axis',\r\n SelectYAxis: 'Select Y Axis',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: 'Hesap Ayarlarım',\r\n MyID: 'Bilgilerim',\r\n ClickToCopyMyID: 'Bilgilerinizi kopyalamak için tıklayın',\r\n IDInClipBoard: 'Kişisel bilgileriniz kopyalandı ve yapıştırmaya hazır.',\r\n StoreMyNameInMyFilesWhenSaving: 'Kaydederken, adımı dosyalarıma ekle',\r\n DoYouReallyWantToShowYourNameInYourFiles: 'Dosyalarınızda isminizin gösterilmesini istiyor musunuz?',\r\n SignFileDisclaimer: 'Evet ise, isiminiz dosyalarınıza erişimi olan bütün kişiler tarafından görülebilir.',\r\n Likes: 'Likes',\r\n AllPublished: 'All Published',\r\n PublishedUnderAliases: 'Aliases',\r\n UserCount: 'Kullanıcı Sayısı',\r\n SchoolID: 'Okul',\r\n ClassID: 'Sınıf',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: 'Gündüz Saatleri',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: 'Model Seç',\r\n Sinusoidal: 'Sinüzoidal',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: 'Ekonomik Parametreler',\r\n ElectricitySellingPrice: 'Elektrik Satış Fiyatı',\r\n OperationalCostPerUnit: 'Birim Başına İşletme Maliyeti',\r\n SellingPrice: 'Selling Price',\r\n UnitCost: 'Unit Cost',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: 'Navigation Parameters',\r\n MinimumMoveSpeed: 'Minimum Move Speed',\r\n MinimumTurnSpeed: 'Minimum Turn Speed',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: 'Gökyüzü Açıklığı',\r\n ShowDaylightResults: 'Gün Işığı Sonuçlarını Göster',\r\n ShowSkyClearnessResults: 'Gökyüzü Açıklığı Sonuçlarını Göster',\r\n ShowAverageDailySolarRadiation: 'Günlük ortalama güneş Işınımını göster',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: 'Veri toplamak için sensör yok.',\r\n NoSolarPanelForAnalysis: 'Analiz için güneş paneli yok.',\r\n NoObserverForVisibilityAnalysis: 'Görünürlük analizi için gözlemci yok.',\r\n NoWaterHeaterForAnalysis: 'Analiz için su ısıtıcısı yok',\r\n NoParabolicDishForAnalysis: 'Analiz için parabolik çanak yok',\r\n NoParabolicTroughForAnalysis: 'Analiz için parabolik oluk yok.',\r\n NoFresnelReflectorForAnalysis: 'Analiz için Fresnel reflektörü yok.',\r\n NoHeliostatForAnalysis: 'Analiz için heliostat yok.',\r\n NoSolarUpdraftTowerForAnalysis: 'Analiz için Solar Updraft Kulesi yok.',\r\n NoBuildingForAnalysis: 'There is no building for analysis.',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: 'Bulut Dosyası',\r\n Select: 'Seç',\r\n AddFoundation: 'Temel Ekle',\r\n AddWall: 'Duvar Ekle',\r\n AddWindow: 'Pencere Ekle',\r\n AddDoor: 'Kapı Ekle',\r\n AddPyramidRoof: 'Piramit Çatı Ekle',\r\n AddGableRoof: 'Beşik Çatı Ekle',\r\n AddHipRoof: 'Kırma Çatı Ekle',\r\n AddGambrelRoof: 'Flemenk Çatı Ekle',\r\n AddMansardRoof: 'Mansart Çatı Ekle',\r\n AddCuboid: 'Kübik Ekle',\r\n AddSensor: 'Sensör Ekle',\r\n AddSolarPanel: 'Güneş Paneli Ekle',\r\n AddWaterHeater: 'Su Isıtıcı Ekle',\r\n AddParabolicDish: 'Parabolik Çanak Ekle',\r\n AddParabolicTrough: 'Parabolik Oluk Ekle',\r\n AddFresnelReflector: 'Fresnel Reflektörü Ekle',\r\n AddHeliostat: 'Heliostat Ekle',\r\n AddWindTurbine: 'Add wind turbine',\r\n AddLight: 'Add light',\r\n AddTree: 'Ağaç Ekle',\r\n AddFlower: 'Add flower',\r\n AddPeople: 'İnsan Ekle',\r\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\r\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\r\n ManipulateGroup: 'Ölçeklendirme',\r\n ClearScene: 'Herşeyi Sil',\r\n ShowSunAndTimeSettings: 'Güneş & Zaman Ayarlarını Göster',\r\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\r\n DoYouReallyWantToClearContent: 'İçeriği silmek istiyor musunuz',\r\n ClickForMoreButtons: 'Daha fazla buton için tıklayın',\r\n SwitchToAddingFoundation: 'Temel Ekle ',\r\n SwitchToAddingCuboid: 'Kübik Ekle ',\r\n SwitchToAddingWall: 'Duvar Ekle',\r\n SwitchToAddingWindow: \"Pencere Eklemeyi'Aç\",\r\n SwitchToAddingDoor: 'Kapı Ekle',\r\n SwitchToAddingPyramidRoof: 'Piramit Çatı Ekle',\r\n SwitchToAddingGableRoof: 'Beşik Çatı Ekle',\r\n SwitchToAddingHipRoof: 'Kırma Çatı Ekle',\r\n SwitchToAddingGambrelRoof: 'Flemenk Çatı Ekle',\r\n SwitchToAddingMansardRoof: 'Mansart Çatı Ekle',\r\n SwitchToAddingSolarPanel: 'Güneş Paneli Ekle',\r\n SwitchToAddingSensor: 'Sensör Ekle',\r\n SwitchToAddingWaterHeater: 'Su Isıtıcı Ekle',\r\n SwitchToAddingParabolicDish: 'Parabolik Çanak Ekle',\r\n SwitchToAddingParabolicTrough: 'Parabolik Oluk Ekle',\r\n SwitchToAddingFresnelReflector: 'Fresnel Reflektör Ekle',\r\n SwitchToAddingHeliostat: 'Heliostat Ekle',\r\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\r\n SwitchToAddingLight: 'Switch to Adding Light',\r\n SwitchToAddingTree: 'Ağaç Ekle',\r\n SwitchToAddingFlower: 'Switch to Adding Flower',\r\n SwitchToAddingPeople: 'Kişi Ekle',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: 'Yarının Zekası Enstitüsüne Git',\r\n visitAladdinHomePage: 'Aladdin Ana Sayfasını Ziyaret Edin',\r\n clickToOpenMenu: 'Ana Menüyü Açmak İçin Tıklayınız',\r\n clickToAccessAccountSettings: 'Click to access account settings',\r\n },\r\n\r\n tree: {\r\n Apple: 'Apple',\r\n Birch: 'Birch',\r\n Coconut: 'Coconut',\r\n Dogwood: 'Kızılcık Ağacı',\r\n Elm: 'Karaağaç',\r\n FanPalm: 'Fan Palm',\r\n Linden: 'Ihlamur Ağacı',\r\n Magnolia: 'Magnolia',\r\n Maple: 'Akçaağaç',\r\n Oak: 'Meşe Ağacı',\r\n Pine: 'Çam',\r\n Spruce: 'Alaçam',\r\n },\r\n\r\n flower: {\r\n Bellflower: 'Bellflower',\r\n Boxwood: 'Boxwood',\r\n CactusCombo1: 'Cactus Combo 1',\r\n CactusCombo2: 'Cactus Combo 2',\r\n CactusCombo3: 'Cactus Combo 3',\r\n CactusCombo4: 'Cactus Combo 4',\r\n Hibiscus: 'Hibiscus',\r\n Hosta: 'Hosta',\r\n Hydrangea: 'Hydrangea',\r\n Peony: 'Peony',\r\n RedRose: 'Red Rose',\r\n Spirea: 'Spirea',\r\n Sunflower: 'Sunflower',\r\n TallBush: 'Tall Bush',\r\n Tulip: 'Tulip',\r\n WhiteFlower: 'White Flower',\r\n YellowFlower: 'Yellow Flower',\r\n },\r\n\r\n people: {\r\n Jaah: 'Ata',\r\n Jack: 'Mete',\r\n Jacob: 'Jacob',\r\n Jacqueline: 'Beril',\r\n Jade: 'Ece',\r\n Jamelia: 'Bilge',\r\n James: 'James',\r\n Jane: 'Jane',\r\n Jaya: 'Asya',\r\n Jaye: 'Aylin',\r\n Jeanette: 'Jeanette',\r\n Jedi: 'Alp',\r\n Jeff: 'Kaya',\r\n Jena: 'Nehir',\r\n Jennifer: 'Defne',\r\n Jess: 'Zeynep',\r\n Jett: 'Umut',\r\n Jill: 'Jill',\r\n Jiya: 'Elif',\r\n Joan: 'Ezgi',\r\n Jocelyn: 'Jocelyn',\r\n Joel: 'Cenk',\r\n Joey: 'Azra',\r\n John: 'Can',\r\n Jonathon: 'Jonathon',\r\n Jose: 'Mert',\r\n Joseph: 'Joseph',\r\n Joshua: 'Joshua',\r\n Judd: 'Ozan',\r\n Judy: 'Judy',\r\n Julia: 'Julia',\r\n Julio: 'Bulut',\r\n Jumapili: 'Umay',\r\n June: 'Naz',\r\n Juro: 'Efe',\r\n Justin: 'Justin',\r\n },\r\n\r\n compass: {\r\n N: 'N',\r\n S: 'S',\r\n W: 'W',\r\n E: 'E',\r\n },\r\n\r\n month: {\r\n January: 'Jan',\r\n February: 'Feb',\r\n March: 'Mar',\r\n April: 'Apr',\r\n May: 'May',\r\n June: 'Jun',\r\n July: 'Jul',\r\n August: 'Aug',\r\n September: 'Sep',\r\n October: 'Oct',\r\n November: 'Nov',\r\n December: 'Dec',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: 'Search by publisher',\r\n SearchByLabel: 'Search by label',\r\n MyPublishedModels: 'My Published Models',\r\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\r\n SortFromOldestToNewest: 'Sort from oldest to newest',\r\n SortFromNewestToOldest: 'Sort from newest to oldest',\r\n ModelsFoundOnThisSite: 'models found on this site',\r\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_ua = {\r\n translation: {\r\n name: {\r\n IFI: 'Інститут Інтелекту Майбутнього',\r\n Aladdin: 'Aladdin',\r\n Tagline: 'Aladdin: Переосмислення Дизайну з Пояснювальним Штучним Інтелектом - Інститут Інтелекту Майбутнього',\r\n },\r\n\r\n cookie: {\r\n Statement:\r\n 'Натиснувши «Прийняти», ви погоджуєтеся з використанням файлів cookie для покращення вашого досвіду з Aladdin.',\r\n Accept: 'Прийняти',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: 'Цей Продукт Було Створено:',\r\n TermsOfService: 'Умови Використання',\r\n PrivacyPolicy: 'Політика Конфіденційності',\r\n Software: 'Програмне Забезпечення',\r\n Content: 'Матеріали',\r\n Research: 'Дослідження',\r\n Support: 'Підтримка',\r\n Acknowledgment: 'Подяка',\r\n FundingInformation:\r\n 'Національний Науковий Фонд (ННФ, Cполучені Штати Америки) надав фінансову підтримку для дослідження та розробки цього продукту за допомогою грантів №2105695, №2131097, та №#2301164. Однак, будь-які погляди, результати та висновки, висловлені у продукті, належать авторам і можуть не повністю відображати погляди ННФ.',\r\n Contact: 'Для отримання додаткової інформації, будь ласка, зверніться до Charles Xie (charles@intofuture.org).',\r\n Translators: 'Переклад',\r\n },\r\n\r\n word: {\r\n LastUpdate: 'Last Update',\r\n Small: 'Small',\r\n Medium: 'Medium',\r\n Large: 'Large',\r\n Design: 'Design',\r\n Information: 'Information',\r\n Type: 'Type',\r\n Text: 'Текст',\r\n FontSize: 'Розмір Шрифту',\r\n FontColor: 'Колір Шрифту',\r\n Model: ' Модель',\r\n Models: 'Моделі',\r\n Upload: 'Завантажити',\r\n ClickCount: 'Натисніть Підрахувати',\r\n Share: 'Поділитись',\r\n AlreadyLike: 'Вподобано',\r\n Like: 'Вподобати',\r\n MustLogInToLike: 'Потрібно Увійти, щоб Вподобати',\r\n AllRightsReserved: 'Усі Права Захищено',\r\n MeterAbbreviation: 'м',\r\n Version: 'Версія',\r\n VersionInitial: 'В',\r\n Options: 'Опції',\r\n Maximum: 'Максимум',\r\n Minimum: 'Мінімум',\r\n MaximumNumber: 'Максимальне Число',\r\n MinimumNumber: 'Мінімальне Число',\r\n MaximumValue: 'Максимальне Значення',\r\n MinimumValue: 'Мінімальне Значення',\r\n Or: 'Або',\r\n None: 'Жоден',\r\n High: 'Високий',\r\n Partial: 'Частковий',\r\n Teacher: 'Вчитель',\r\n Class: 'Клас',\r\n Total: 'Всього',\r\n Leaderboard: 'Таблиця Лідерів',\r\n Latest: 'Останнє',\r\n Range: 'Діапазон',\r\n SIUnit: 'SI Одиниця',\r\n USUnit: 'US Одиниця',\r\n ThermalTransmittance: 'Теплопередача',\r\n ThermalResistance: 'Термічний Опір',\r\n UValue: 'U-Значення',\r\n RValue: 'R-Значення',\r\n VolumetricHeatCapacity: \"Об'ємна Теплоємність\",\r\n BuildingHVACSystem: 'Побудова Системи Опалення, Вентиляції та Кондиціювання Повітря (ОВК)',\r\n ThermostatSetpoint: 'Задана Температура Термостата',\r\n TemperatureToleranceThreshold: 'Порогове Значення Допустимого Відхилення Температури',\r\n TemperatureToleranceThresholdExplanation:\r\n 'Обігрівач не працюватиме, якщо найнижча зовнішня температура дня вища за значення отриманe, якщо від заданої температури відняти порогове значення. Кондиціонер не працюватиме, якщо найвища зовнішня температура дня нижча за значення отримане, якщо від заданої температури відняти порогове значення.',\r\n Press: 'Натисніть',\r\n Open: 'Відкрити',\r\n Save: 'Зберегти',\r\n SaveAsImage: 'Зберегти як Зображення',\r\n SaveAsCsv: 'Зберегти як CSV',\r\n Update: 'Оновити',\r\n Paste: 'Вставити',\r\n Copy: 'Копіювати',\r\n Cut: 'Вирізати',\r\n Delete: 'Видалити',\r\n Lock: 'Заблокувати',\r\n Translucent: 'Півпрозорий',\r\n Color: 'Колір',\r\n Texture: 'Текстура',\r\n Size: 'Розмір',\r\n Thickness: 'Товщина',\r\n Yes: 'Так',\r\n No: 'Ні',\r\n OK: 'ОК',\r\n Cancel: 'Скасувати',\r\n Apply: 'Застосувати',\r\n Close: 'Закрити',\r\n ApplyTo: 'Застосувати До',\r\n Run: 'Запустити',\r\n Pause: 'Пауза',\r\n Resume: 'Відновити',\r\n Clear: 'Очистити',\r\n Warning: 'Попередження',\r\n Caution: 'Обережно',\r\n Reminder: 'Нагадування',\r\n Length: 'Довжина',\r\n Width: 'Ширина',\r\n Height: 'Висота',\r\n Radius: 'Радіус',\r\n Angle: 'Кут',\r\n Azimuth: 'Азимут',\r\n Coordinates: 'Координати',\r\n Weather: 'Погода',\r\n Show: 'Показати',\r\n Animate: 'Анімувати',\r\n Date: 'Дата',\r\n Time: 'Час',\r\n Title: 'Заголовок',\r\n Owner: 'Власник',\r\n Action: 'Дія',\r\n Rename: 'Перейменувати',\r\n Location: 'Місцезнаходження',\r\n Latitude: 'Широта',\r\n Month: 'Місяць',\r\n Day: 'День',\r\n Hour: 'Година',\r\n Daylight: 'Денне світло',\r\n Radiation: 'Радіаційне Випромінювання',\r\n Temperature: 'Температура',\r\n kWh: 'кВт-год',\r\n dollar: 'долар',\r\n MeterPerSecond: 'м/с',\r\n NorthInitial: 'Північ',\r\n SouthInitial: 'Південь',\r\n EastInitial: 'Схід',\r\n WestInitial: 'Захід',\r\n Fixed: 'Фіксований',\r\n Elements: 'Елементи',\r\n Energy: 'Енергія',\r\n Unknown: 'Невідомо',\r\n Label: 'Мітка',\r\n Description: 'Опис',\r\n NoDescription: 'Без опису',\r\n MaximumCharacters: 'Максимальна кількість символів',\r\n Author: 'Автор',\r\n Publisher: 'Видавець',\r\n Building: 'Будівля',\r\n ResidentialBuilding: 'Житлова будівля',\r\n CommercialBuilding: 'Комерційна будівля',\r\n SchoolBuilding: 'Шкільна будівля',\r\n TouristAttraction: \"Туристична визначна пам'ятка\",\r\n UnderConstruction: 'В стадії будівництва',\r\n Photovoltaic: 'Фотоелектричний',\r\n Anonymous: 'Анонімний',\r\n Nickname: 'Нікнейм',\r\n Pin: 'Закріпити',\r\n Unpin: 'Відкріпити',\r\n },\r\n\r\n shared: {\r\n NoTexture: 'Без текстури',\r\n FoundationElement: 'Фундамент',\r\n CuboidElement: 'Паралелепіпед',\r\n PolygonElement: 'Багатокутник',\r\n SensorElement: 'Сенсор',\r\n SolarPanelElement: 'Сонячна панель',\r\n WaterHeaterElement: 'Водонагрівач',\r\n ParabolicDishElement: 'Параболічна тарілка',\r\n ParabolicTroughElement: 'Параболічний сонячний колектор',\r\n FresnelReflectorElement: 'Відбивач Френеля',\r\n HeliostatElement: 'Геліостат',\r\n WindTurbineElement: 'Вітрова турбіна',\r\n LightElement: 'Світло',\r\n ElementLocked: 'Заблоковано',\r\n ModelType: 'Тип моделі',\r\n OutputBreakdown: 'Breakdown',\r\n MoreResults: 'More Results',\r\n },\r\n\r\n message: {\r\n ModelNotFound: 'Модель не знайдено',\r\n CannotSignIn: 'Не вдається увійти',\r\n CannotSignOut: 'Не вдається вийти',\r\n YourAccountWasCreated: 'Ваш обліковий запис був створений',\r\n CannotCreateAccount: 'Не вдається створити обліковий запис',\r\n YourAccountSettingsWereSaved: 'Налаштування облікового запису були збережені',\r\n CannotSaveYourAccountSettings: 'Не вдається зберегти налаштування облікового запису',\r\n CannotSaveYourFileToCloud: 'Не вдається зберегти ваш файл у хмарному середовищі',\r\n CannotCreateNewProject: 'Не вдається створити новий проєкт',\r\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\r\n CannotOpenYourProjects: 'Не вдається відкрити ваші проєкти',\r\n CannotOpenProject: 'Cannot open the project',\r\n CannotDeleteProject: 'Cannot delete the project',\r\n CannotRenameProject: 'Cannot rename the project',\r\n CannotAddDesignToProject: 'Cannot add this design to the project',\r\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\r\n DesignRemovedFromProject: 'The design was successfully removed from the project',\r\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\r\n CannotUpdateProject: 'Cannot update the project',\r\n CannotFetchProjectData: 'Cannot fetch project data',\r\n TitleUsedChooseDifferentOne: 'Ця назва була використана. Виберіть іншу',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite:\r\n 'Хмарний файл з такою ж назвою вже існує. Ви хочете перезаписати його?',\r\n CloudFileNotFound: 'Файл у хмарному середовищі не знайдено',\r\n CannotLoadModelsOnMap: 'Не вдається завантажити моделі на карту',\r\n CannotLoadLeaderboard: 'Не вдається завантажити таблицю лідерів',\r\n CannotPublishModelOnMap: 'Не вдається опублікувати модель на карті',\r\n CannotLikeModelFromMap: 'Не вдається оцінити модель з карти',\r\n CannotDeleteModelFromMap: 'Не вдається видалити модель з карти',\r\n ModelDeletedFromMap: 'Модель видалена з карти',\r\n DoYouWantToDeleteModelFromMap: 'Ви бажаєте видалити модель з карти?',\r\n CannotOpenCloudFile: 'Не вдається відкрити файл у хмарному середовищі',\r\n CannotReadCloudFile: 'Cannot read the cloud file',\r\n CannotWriteCloudFile: 'Cannot write the cloud file',\r\n CloudFileCopied: 'Cloud file copied',\r\n CannotOpenCloudFolder: 'Не вдається відкрити папку у хмарному середовищі',\r\n CannotDeleteCloudFile: 'Не вдається видалити файл у хмарному середовищі',\r\n CannotRenameCloudFile: 'Не вдається перейменувати файл у хмарному середовищі',\r\n DoYouWantToSaveChanges: 'Бажаєте зберегти зміни?',\r\n NotApplicableToSelectedAction: 'Не застосовується до обраної дії',\r\n ThisElementIsLocked: 'Цей елемент заблокований.',\r\n ThisCannotBeUndone: 'Це не можна скасувати.',\r\n AzimuthOfNorthIsZero: 'Азимут півночі дорівнює 0°',\r\n CounterclockwiseAzimuthIsPositive: 'Азимут є позитивним проти годинникової стрілки.',\r\n MoveCancelledBecauseOfOverlap: 'Переміщення скасовано через перекриття.',\r\n MoveOutsideBoundaryCancelled: 'Переміщення за межі скасовано.',\r\n RotationCancelledBecauseOfOverlap: 'Ротацію скасовано через перекриття.',\r\n RotationOutsideBoundaryCancelled: 'Ротація за межі скасована.',\r\n ResizingCancelledBecauseOfOverlap: 'Зміна розміру скасована через перекриття.',\r\n ResizingOutsideBoundaryCancelled: 'Зміна розміру за межі скасована.',\r\n CannotPasteOutsideBoundary: 'Не можна вставити за межі.',\r\n CannotPasteBecauseOfOverlap: 'Не можна вставити через перекриття.',\r\n CannotMoveObjectTooFar: \"Не можна перемістити об'єкт занадто далеко.\",\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\r\n 'Існуючі сонячні панелі будуть видалені перед застосуванням нового макету.',\r\n DoYouWantToContinue: 'Бажаєте продовжити?',\r\n SolarPanelsCannotIntersectWithGround: 'Сонячні панелі не можуть перетинатися з землею.',\r\n SolarPanelsCannotOverlapWithOneAnother: 'Сонячні панелі не можуть накладатися одна на одну.',\r\n ScreenshotSaved: 'Знімок екрана збережено.',\r\n CsvFileSaved: 'CSV файл збережено.',\r\n SimulationStarted: 'Розпочато симуляцію.',\r\n SimulationCompleted: 'Симуляцію завершено.',\r\n SimulationAborted: 'Симуляцію перервано.',\r\n SimulationPaused: 'Симуляцію призупинено.',\r\n CancelSimulation: 'Скасувати симуляцію',\r\n PauseSimulation: 'Призупинити симуляцію',\r\n ResumeSimulation: 'Продовжити симуляцію',\r\n SimulationWillNotStartDueToErrors: 'Симуляція не розпочнеться через помилки',\r\n SimulationWillStartDespiteWarnings: 'Симуляція розпочнеться незважаючи на попередження.',\r\n EvolutionStarted: 'Еволюцію розпочато.',\r\n EvolutionCompleted: 'Еволюцію завершено.',\r\n EvolutionAborted: 'Еволюцію перервано.',\r\n EvolutionPaused: 'Еволюцію призупинено.',\r\n EncounterEvolutionError: 'Сталася помилка еволюції.',\r\n CancelEvolution: 'Скасувати еволюцію',\r\n PauseEvolution: 'Призупинити еволюцію',\r\n ResumeEvolution: 'Продовжити еволюцію',\r\n ConvergenceThresholdHasBeenReached: 'Досягнуто порогове значення збіжності.',\r\n MaximumNumberOfGenerationsHasBeenReached: 'Досягнуто максимальну кількість поколінь.',\r\n MaximumNumberOfStepsHasBeenReached: 'Досягнуто максимальну кількість кроків.',\r\n ObjectiveFunctionTypeError:\r\n 'Поточна цільова функція не підтримується цією операцією. Будь ласка, розпочніть з меню.',\r\n WallsAreNotAtSameHeight: 'Стіни не знаходяться на однаковій висоті.',\r\n WallsAreNotPerpendicular: 'Стіни не перпендикулярні.',\r\n WallsAreNotConnected: \"Стіни не з'єднані.\",\r\n WallsNumberNeedToBeFour: 'Кількість стін має дорівнювати чотири.',\r\n BuildingContainsEmptyWall: 'Будівля містить одну або кілька порожніх стін.',\r\n BuildingRoofMissing: 'У будівлі відсутній дах.',\r\n UnknownErrors: 'Невідомі помилки.',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: 'Опції аналізу',\r\n option: {\r\n GridCellSize: 'Розмір комірки сітки',\r\n SamplingFrequency: 'Частота вибірки',\r\n TimesPerHour: 'Разів на годину',\r\n DaysPerYear: 'Днів на рік',\r\n },\r\n mainMenu: 'Головне Меню',\r\n cloudMenu: 'Меню Хмарного Середовища',\r\n projectSubMenu: 'Проєкт',\r\n project: {\r\n CreateNewProject: 'Створити Новий Проєкт',\r\n OpenProject: 'Відкрити Проєкт',\r\n SaveProjectAs: 'Save Project As',\r\n YouMustLogInToCreateProject: 'Ви повинні увійти, щоб створити новий проєкт',\r\n YouMustLogInToOpenProject: 'Ви повинні увійти, щоб відкрити проєкт',\r\n },\r\n fileSubMenu: 'Файл',\r\n file: {\r\n CreateNewFile: 'Створити новий',\r\n OpenLocalFile: 'Відкрити локально',\r\n SaveAsLocalFile: 'Зберегти як',\r\n SavingAbortedMustHaveValidFileName: \"Збереження перервано! Вам потрібно мати дійсне ім'я файлу\",\r\n OpenCloudFile: 'Відкрити у хмарному середовищі',\r\n SaveCloudFile: 'Зберегти у хмарному середовищі',\r\n SaveAsCloudFile: 'Зберегти у хмарному середовищі',\r\n SavingAbortedMustHaveValidTitle: 'Збереження перервано! Вам потрібно мати дійсний заголовок для хмарного файлу',\r\n ToSaveYourWorkPleaseSignIn: 'Щоб зберегти вашу роботу, будь ласка, увійдіть в систему.',\r\n TakeScreenshot: 'Зробити знімок екрана',\r\n UseCloudFileName: \"Використовувати ім'я файлу у хмарному середовищі\",\r\n PublishOnModelsMap: 'Опублікувати на карті моделей',\r\n PublishedOnModelsMap: 'Вашу модель було опубліковано на карті моделей',\r\n UpdatedOnModelsMap: 'Ваша модель була оновлена на карті моделей',\r\n YouMustLogInToPublishYourModel: 'Вам потрібно увійти в систему, щоб опублікувати свою модель',\r\n YouCannotPublishAModelThatYouDoNotOwn: 'Ви не можете опублікувати модель, якою не володієте',\r\n YouMustSaveModelOnCloudBeforePublishingIt:\r\n 'Вам потрібно зберегти модель у хмарному середовищі перед її публікацією',\r\n },\r\n editSubMenu: 'Редагувати',\r\n edit: {\r\n Undo: 'Скасувати',\r\n Redo: 'Повторити',\r\n },\r\n viewSubMenu: 'Перегляд',\r\n view: {\r\n NavigationView: 'Navigation View',\r\n TwoDimensionalView: '2D Вигляд',\r\n ResetView: 'Скинути',\r\n ZoomIn: 'Збільшити масштаб',\r\n ZoomOut: 'Зменшити масштаб',\r\n AutoRotate: 'Автоматичний поворот',\r\n ShowShadow: 'Показати тінь',\r\n ShowSurfaceShininess: 'Показати блиск поверхні',\r\n TranslucentFloatingWindows: 'Напівпрозорі плаваючі вікна',\r\n accessoriesSubMenu: 'Додаткові елементи',\r\n accessories: {\r\n SiteInformation: 'Інформація про місце',\r\n DesignInformation: 'Інформація про дизайн',\r\n Instruction: 'Інструкція',\r\n StickyNote: 'Примітка',\r\n Note: 'Примітка',\r\n },\r\n },\r\n settingsSubMenu: 'Налаштування',\r\n settings: {\r\n WeatherData: 'Дані про погоду',\r\n DiurnalTemperature: 'Добова температура',\r\n Heliodon: 'Геліодон',\r\n SunAndTime: 'Сонце та час',\r\n },\r\n benchmarksSubMenu: 'Бенчмарки',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: 'Прогнозування сонячної радіації порівняно з вимірюванням',\r\n BESTESTCase600: 'Тестування енергоефективності будівель: BESTEST Case 600',\r\n BESTESTCase610: 'Тестування енергоефективності будівель: BESTEST Case 610',\r\n BESTESTCase620: 'Тестування енергоефективності будівель: BESTEST Case 620',\r\n BESTESTCase630: 'Тестування енергоефективності будівель: BESTEST Case 630',\r\n },\r\n graph: {\r\n LineWidth: 'Товщина лінії',\r\n SymbolSize: 'Розмір символу',\r\n BarCategoryGap: 'Відступ категорій стовпців',\r\n ShowHorizontalGridLines: 'Показати горизонтальні лінії сітки',\r\n ShowVerticalGridLines: 'Показати вертикальні лінії сітки',\r\n },\r\n analysisSubMenu: 'Аналіз',\r\n physicsSubMenu: 'Фізика',\r\n physics: {\r\n DailySolarRadiationHeatmap: 'Щоденна карта сонячної радіації',\r\n SolarRadiationHeatmapOptions: 'Параметри карти сонячної радіації',\r\n SolarRadiationHeatmapGridCellSize: 'Розмір комірки на карті сонячної радіації',\r\n SolarRadiationHeatmapMaxValue: 'Максимальне значення на карті',\r\n SolarRadiationHeatmapNoAnimation: 'Немає анімації для статичної моделі',\r\n ReflectionHeatmap: 'Карта відображень',\r\n },\r\n sensorSubMenu: 'Датчик',\r\n sensor: {\r\n CollectDailyData: 'Збирати щоденні дані',\r\n CollectYearlyData: 'Збирати щорічні дані',\r\n SensorSimulationNoAnimation: 'Немає анімації для збору даних датчика',\r\n },\r\n buildingSubMenu: 'Будівля',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: 'Аналізувати щоденну енергію будівлі',\r\n AnalyzeYearlyBuildingEnergy: 'Аналізувати щорічну енергію будівлі',\r\n EnergyAnalysisOptions: 'Параметри аналізу енергії',\r\n EnergyGridCellSize: 'Розмір комірки сітки',\r\n BuildingEnergySimulationNoAnimation: 'Немає анімації симулювати енергію будівлі',\r\n },\r\n solarPanelSubMenu: 'Сонячна панель',\r\n solarPanel: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n AnalyzeVisibility: 'Аналізувати видимість',\r\n PanelDiscretization: 'Дискретизація панелі',\r\n Exact: 'Точний',\r\n Approximate: 'Наближений',\r\n EnergyGridCellSize: 'Розмір комірки сітки енергії',\r\n VisibilityGridCellSize: 'Розмір комірки сітки коефіцієнта видимості',\r\n EnergyAnalysisOptions: 'Параметри аналізу енергії',\r\n VisibilityAnalysisOptions: 'Параметри аналізу видимості',\r\n SolarPanelSimulationNoAnimation: 'Немає анімації для симуляції сонячної панелі',\r\n },\r\n parabolicTroughSubMenu: 'Параболічний сонячний колектор',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n },\r\n parabolicDishSubMenu: 'Параболічний диск',\r\n parabolicDish: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n },\r\n fresnelReflectorSubMenu: 'Відбивач Френеля',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n },\r\n heliostatSubMenu: 'Геліостат',\r\n heliostat: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n },\r\n solarUpdraftTowerSubMenu: 'Сонячна вежа з використаним повітрям',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n SolarUpdraftTowerSimulationNoAnimation: 'Немає анімації симулювати сонячну вежу з використаним повітрям',\r\n },\r\n\r\n tutorialsSubMenu: 'Посібники',\r\n\r\n solarEnergyScienceSubMenu: 'Сонячна наука',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: 'Кути сонця відносно спостерігача на землі',\r\n InsolationAndClimate: 'Інсоляція та клімат',\r\n SolarRadiationToBox: 'Сонячна радіація в коробку',\r\n },\r\n\r\n buildingScienceSubMenu: 'Наука про будівлі',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: 'Теплозахисна оболонка проти будівельної оболонки',\r\n EffectOfSizeOnBuildingEnergy: 'Вплив розміру на енергію будівлі',\r\n EffectOfOrientationOnBuildingEnergy: 'Вплив орієнтації на енергію будівлі',\r\n EffectOfInsulationOnBuildingEnergy: 'Вплив інсоляції на енергію будівлі',\r\n EffectOfRoofColorOnBuildingEnergy: 'Вплив кольору даху на енергію будівлі',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Вплив довжини виступу карнизу на енергію будівлі',\r\n EffectOfWindowSHGCOnBuildingEnergy: 'Вплив коефіцієнта сонячного теплозиску вікна на енергію будівлі',\r\n EffectOfThermostatSetpointOnBuildingEnergy: 'Вплив заданої температури на термостаті на енергію будівлі',\r\n EffectOfSolarPanelsOnBuildingEnergy: 'Вплив сонячних панелей на енергію будівлі',\r\n EffectOfGroundTemperatureOnBuildingEnergy: 'Вплив температури грунту на енергію будівлі',\r\n EffectOfTreesOnBuildingEnergy: 'Вплив дерев на енергію будівлі',\r\n },\r\n\r\n buildingDesignSubMenu: 'Дизайн будівлі',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: 'Будинок у стилі Кейп Код з пристроєм типу \"шед-дормер\"',\r\n MansardRoofWithDormers: 'Мансарда з горизонтальними пристроями',\r\n GableRoofVsHipRoof: 'Схиловий дах проти двосхилих дахів',\r\n ColonialVsSaltbox: 'Колоніальний стиль проти стилю Saltbox',\r\n GambrelRoofVsMansardRoof: 'Півшаровий дах проти мансардного даху',\r\n CombinationRoofVsBonnetRoof: 'Комбінований дах проти капотного даху',\r\n DutchGableRoof: 'Голландський дах з рикетом',\r\n GableAndValleyRoof: 'Схиловий та долинний дах',\r\n ClerestoryRoof: 'Клересторний дах',\r\n MonitorRoof: 'Моніторний дах',\r\n AFrameHouse: 'Будинок у формі літери \"А\"',\r\n HalfTimberedHouse: \"Будинок з напівдерев'яними стінами\",\r\n AllBasicRoofTypes: 'Усі основні типи дахів',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: 'Фотоелектрична сонячна енергія',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: 'Вплив кута нахилу сонячної панелі',\r\n EffectOfAzimuthOfSolarPanel: 'Вплив азимуту сонячної панелі',\r\n SolarPanelTypes: 'Типи сонячних панелей',\r\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\r\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\r\n SolarTrackers: 'Сонячні трекери',\r\n CoveringGroundWithSolarPanels: 'Чому просто покриття землі сонячними панелями - не найкраща ідея',\r\n InterRowSpacingOfSolarPanelArray: 'Вплив міжрядного простору в масиві сонячних панелей',\r\n EffectOfOrientationOfSolarPanels: 'Вплив орієнтації сонячних панелей',\r\n SolarPanelArrayAutomaticLayout: 'Автоматичне розміщення масиву сонячних панелей',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: 'Концентрована сонячна енергія',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: 'Вплив азимуту параболічного сонячного колектора',\r\n EffectOfLatusRectumOfParabolicTrough: 'Вплив прямої лінії на параболічний сонячний колектор',\r\n FocusSunlightWithParabolicDish: 'Фокусування сонячного світла за допомогою параболічного диску',\r\n LinearFresnelReflectors: 'Лінійні відбивачі Френеля',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\r\n 'Вплив висоти поглинаючої трубки на лінійні відбивачі Френеля',\r\n EffectOfAzimuthOfLinearFresnelReflectors: 'Вплив азимуту на лінійні відбивачі Френеля',\r\n LinearFresnelReflectorsWithTwoAbsorbers: 'Лінійні відбивачі Френеля з двома поглинаючими елементами',\r\n CosineEfficiencyOfHeliostats: 'Косинусна ефективність геліостатів',\r\n ShadowingAndBlockingOfHeliostats: 'Затінення та блокування геліостатів',\r\n EffectSolarPowerTowerHeight: 'Вплив висоти сонячної вежі з використаним повітрям',\r\n SolarPowerTower: 'Сонячна вежа з використаним повітрям',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: 'Інші типи сонячної енергії',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: 'Сонячна вежа з використаним повітрям',\r\n },\r\n\r\n generativeDesignSubMenu: 'Generative Design',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\r\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\r\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\r\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\r\n },\r\n\r\n examplesSubMenu: 'Приклади',\r\n\r\n solarEnergySubMenu: 'Сонячна енергія',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: 'Промінь сонця та геліодон',\r\n RooftopSolarPanels: 'Сонячні панелі на даху',\r\n NevadaSolarOneParabolicTroughArray: 'Масив параболічних сонячних колекторів Nevada Solar One',\r\n TooeleParabolicDishArray: 'Масив параболічних тарілок Tooele',\r\n PS10SolarPowerTower: 'Сонячна енергетична вежа PS10',\r\n TucsonLinearFresnelReflectors: 'Лінійні відбивачі Френеля в Tucson',\r\n SolarCanopyFormFactors: 'Форми сонячних козирків',\r\n SolarCanopyOverBleachers: 'Сонячний козирок над трибунами',\r\n SolarCanopyOverGarage: 'Сонячний козирок над гаражем',\r\n SolarBusStop: 'Сонячна автобусна зупинка',\r\n SolarFacadeTesla: 'Сонячна фасадна панель Tesla',\r\n BuildingIntegratedPhotovoltaics: 'Вбудовані фотоелектричні системи в будівлі',\r\n Floatovoltaics: 'Сонячні панелі на плавучих платформах',\r\n Agrivoltaics: 'Агровольтаїка',\r\n VegetativeBuffer: 'Вегетативна зона',\r\n RainbowSwashSolarFarmBostonMA: 'Сонячна ферма Rainbow Swash в Boston, MA',\r\n MickeyMouseSolarFarmOrlandoFL: 'Сонячна ферма Міккі Мауса в Orlando, FL',\r\n SolarPanelsOverCanalBakersfieldCA: 'Сонячні панелі над каналом в Bakersfield, CA',\r\n SolarNoiseBarrierLexingtonMA: \"Сонячний шумовий бар'єр в Lexington, MA\",\r\n HSATSolarTrackersRaleighNC: 'Сонячні трекери з горизонтальною віссю в Raleign, NC',\r\n AADATSolarTrackersLancasterCA: 'Сонячні трекери з азимутальною-вертикальною віссю в Lancaster, CA',\r\n SolarUpdraftTowerInCity: 'Сонячна вежа з використаним повітрям у місті',\r\n },\r\n\r\n builtEnvironmentSubMenu: 'Забудоване середовище',\r\n residentialBuildingsSubMenu: 'Житлові будівлі',\r\n residentialBuildingExamples: {\r\n ColonialHouse: 'Колоніальний будинок',\r\n DutchColonialHouse: 'Голландський колоніальний будинок',\r\n TShapedHouse: 'Будинок у формі літери Т',\r\n CapeCodHouseWithGarage: 'Будинок у стилі Cape Cod з гаражем',\r\n Solarium: 'Солярій',\r\n Church1: 'Церква 1',\r\n Cathedral1: 'Собор 1',\r\n Cathedral2: 'Собор 2',\r\n Mosque1: 'Мечеть 1',\r\n AdobeTaosHouse: 'Будинок з адобе в стилі Taos',\r\n RanchHouse: 'Ranch House',\r\n BonnetHouse: 'Будинок в стилі Bonnet',\r\n BarnStyleHouse: 'Будинок у стилі амбара',\r\n ModernHouse: 'Сучасний будинок',\r\n ButterflyRoofHouse: 'Будинок з метеликовим дахом',\r\n },\r\n commercialBuildingsSubMenu: 'Комерційні будівлі',\r\n commercialBuildingExamples: {\r\n WhiteHouse: 'Білий Дім',\r\n BilimMersinTurkiye: 'Bilim, Mersin, Туреччина',\r\n SpanishStyleHotel: 'Готель в іспанському стилі',\r\n ApartmentBuilding: 'Багатоквартирний будинок',\r\n OfficeBuilding: 'Офісна будівля',\r\n Hotel: 'Готель',\r\n },\r\n buildingComplexesSubMenu: 'Будівельні комплекси',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, Vermont',\r\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, New Mexico',\r\n },\r\n urbanPlanningSubMenu: 'Міське планування',\r\n urbanPlanningExamples: {\r\n Heatmap1: 'Теплова карта',\r\n },\r\n otherBuildingsSubMenu: 'Інші будівлі',\r\n otherBuildingExamples: {\r\n Greenhouse: 'Теплиця',\r\n Pavilion: 'Павільйон у парку',\r\n OctagonalPagoda: 'Восьмикутна пагода',\r\n OceanFront: 'Будівля біля океану',\r\n EgyptianPyramids: 'Єгипетські піраміди',\r\n MayanPyramid: 'Піраміда Мая',\r\n SiOSePol: 'Si-O-Se-Pol',\r\n StackedCuboids: 'Стековані кубоїди',\r\n },\r\n\r\n artificialIntelligenceSubMenu: 'Штучний інтелект',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: 'Оптимізація кута нахилу одного ряду сонячних панелей',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Оптимізація кутів нахилу декількох рядів сонячних панелей',\r\n SolarFarmGenerativeDesign: 'Генеративний дизайн сонячної ферми',\r\n SolarFarmGenerativeDesignWithBlock: 'Генеративний дизайн сонячної ферми в присутності перешкоди',\r\n FitchburgSolarFarmGenerativeDesign: 'Генеративний дизайн сонячної ферми у Fitchburg',\r\n },\r\n languageSubMenu: 'Мова',\r\n publicSubMenu: 'Загальнодоступно',\r\n ModelsGallery: 'Галерея моделей',\r\n ModelsMap: 'Карта моделей',\r\n AboutUs: 'Про нас',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: 'Налаштування облікового запису',\r\n PrivacyStatementTitle: 'User Privacy Protection Statement',\r\n PrivacyStatement:\r\n \"Коли ви увійдете, ваш Google ID використовується для створення та доступу до вашого облікового запису Aladdin. В нашій базі даних зберігається лише випадковий алфавітно-цифровий рядок як посилання. Ми ніколи не збираємо особисто ідентифіковану інформацію, таку як ваше ім'я або електронна пошта. Для отримання додаткової інформації ознайомтесь з нашою \",\r\n SignIn: 'Увійти',\r\n SignOut: 'Вийти',\r\n IfYouAreAStudent: 'Якщо ви студент',\r\n },\r\n\r\n skyMenu: {\r\n Axes: 'Вісі',\r\n Theme: 'Тематика',\r\n ThemeDefault: 'За замовчуванням',\r\n ThemeDesert: 'Пустеля',\r\n ThemeDune: 'Дюна',\r\n ThemeForest: 'Ліс',\r\n ThemeGrassland: 'Степ',\r\n ThemeHill: 'Пагорб',\r\n ThemeLake: 'Озеро',\r\n ThemeMountain: 'Гора',\r\n ThemeRural: 'Сільська місцевість',\r\n SunlightAttenuationCoefficientInAir: 'Коефіцієнт затухання сонячного світла у повітрі',\r\n ConvectiveCoefficientOfAir: 'Коефіцієнт конвекції повітря',\r\n HighestTemperatureTimeInMinutes: 'Час найвищої температури (хвилини)',\r\n SelectSunAnglesToShow: 'Виберіть кути сонця, які показати',\r\n ShowAzimuthAngle: 'Показати азимутний кут',\r\n ShowElevationAngle: 'Показати висотний кут',\r\n ShowZenithAngle: 'Показати зенітний кут',\r\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\r\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\r\n Vegetation: 'Рослинність',\r\n LeafOutDay: 'День розпускання листя',\r\n LeafOffDay: 'День опадання листя',\r\n Albedo: 'Альбедо',\r\n ImageOnGround: 'Зображення на поверхні',\r\n WaterSurface: 'Поверхня води',\r\n RemoveAllUnlockedTrees: 'Видалити всі розблоковані дерева',\r\n RemoveAllUnlockedFlowers: 'Видалити всі розблоковані квіти',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedPeople: 'Видалити всіх розблокованих людей',\r\n RemoveAllUnlockedFoundations: 'Видалити всі розблоковані фундаменти',\r\n RemoveAllUnlockedCuboids: 'Видалити всі розблоковані кубоїди',\r\n DoYouReallyWantToRemoveAllPeople: 'Ви дійсно хочете видалити всіх людей, що не заблоковані',\r\n DoYouReallyWantToRemoveAllTrees: 'Ви дійсно хочете видалити всі дерева, що не заблоковані',\r\n DoYouReallyWantToRemoveAllFlowers: 'Ви дійсно хочете видалити всі квіти, що не заблоковані',\r\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\r\n DoYouReallyWantToRemoveAllFoundations: 'Ви дійсно хочете видалити всі фундаменти, що не заблоковані',\r\n DoYouReallyWantToRemoveAllCuboids: 'Ви дійсно хочете видалити всі кубоїди, що не заблоковані',\r\n LockAllElements: 'Заблокувати всі елементи',\r\n UnlockAllElements: 'Розблокувати всі елементи',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: 'Мітка',\r\n LabelText: 'Текст мітки',\r\n LabelHeight: 'Висота мітки',\r\n LabelSize: 'Розмір мітки',\r\n LabelFontSize: 'Розмір шрифту',\r\n LabelColor: 'Колір мітки',\r\n KeepShowingLabel: 'Залишати видимою мітку',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: 'Видалити всі незаблоковані сонячні панелі',\r\n RemoveAllUnlockedParabolicTroughs: 'Видалити всі незаблоковані параболічні сонячні колектори',\r\n RemoveAllUnlockedParabolicDishes: 'Видалити всі незаблоковані параболічні антени',\r\n RemoveAllUnlockedFresnelReflectors: 'Видалити всі незаблоковані відбивачі Френеля',\r\n RemoveAllUnlockedHeliostats: 'Видалити всі незаблоковані геліостати',\r\n RemoveAllUnlockedSensors: 'Видалити всі незаблоковані датчики',\r\n RemoveAllUnlockedLights: 'Видалити всі незаблоковані освітлювальні прилади',\r\n RemoveAllUnlockedWalls: 'Видалити всі незаблоковані стіни',\r\n RemoveAllUnlockedWindows: 'Видалити всі незаблоковані вікна',\r\n RemoveAllUnlockedDoors: 'Видалити всі незаблоковані двері',\r\n RemoveAllUnlockedPolygons: 'Видалити всі незаблоковані полігони',\r\n RemoveAllUnlockedHumans: 'Видалити всіх незаблокованих людей',\r\n RemoveAllUnlockedTrees: 'Видалити всі незаблоковані дерева',\r\n RemoveAllUnlockedFlowers: 'Видалити всі незаблоковані квіти',\r\n Racks: 'Стелажі',\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n SolarPanels: 'Сонячні панелі',\r\n SolarPanelArray: 'Solar Panel Array',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому фундаменті, які не є заблокованими',\r\n ParabolicTroughs: 'Параболічні сонячні колектори',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі параболічні сонячні колектори на цьому фундаменті, які не є заблокованими',\r\n ParabolicDishes: 'Параболічні антени',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі параболічні антени на цьому фундаменті, які не є заблокованими',\r\n FresnelReflectors: 'Відбивачі Френеля',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі відбивачі Френеля на цьому фундаменті, які не є заблокованими',\r\n Heliostats: 'Геліостати',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі геліостати на цьому фундаменті, які не є заблокованими',\r\n Sensors: 'Датчики',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі датчики на цьому фундаменті, які не є заблокованими',\r\n Lights: 'Світильники',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі світильники на цьому фундаменті, які не є заблокованими',\r\n Walls: 'Стіни',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі стіни на цьому фундаменті, які не є заблокованими',\r\n Windows: 'Вікна',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі вікна на цьому фундаменті, які не є заблокованими',\r\n Doors: 'Двері',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі двері на цьому фундаменті, які не є заблокованими',\r\n Polygons: 'Багатокутники',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі багатокутники на цьому фундаменті, які не є заблокованими',\r\n Humans: 'Люди',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation:\r\n 'Ви дійсно бажаєте видалити всіх людей на цьому фундаменті, які не є заблокованими',\r\n Trees: 'Дерева',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі дерева на цьому фундаменті, які не є заблокованими',\r\n Flowers: 'Квіти',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі квіти на цьому фундаменті, які не є заблокованими',\r\n OnlyThisFoundation: 'Тільки цей фундамент',\r\n AllConnectedFoundations: 'Всі пов’язані фундаменти',\r\n AllSelectedFoundations: 'All Selected Foundations',\r\n AllFoundations: 'Всі фундаменти',\r\n AddPolygon: 'Додати багатокутник',\r\n SolarStructure: 'Вибрати сонячну структуру',\r\n GroupMaster: 'Груповий майстер',\r\n LockAllElementsOnThisFoundation: 'Заблокувати всі елементи на цьому фундаменті',\r\n UnlockAllElementsOnThisFoundation: 'Розблокувати всі елементи на цьому фундаменті',\r\n GroundFloorRValue: 'Теплопровідність перекриття цокольного поверху',\r\n OnlyThisGroundFloor: 'Тільки цокольний поверх',\r\n AllGroundFloors: 'Всі цокольні поверхи',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: 'Вежа приймача для геліостатів',\r\n ReceiverTowerPhysicalProperties: 'Фізичні властивості вежі приймача',\r\n ReceiverTowerHeight: 'Висота вежі приймача',\r\n ReceiverTowerRadius: 'Радіус вежі приймача',\r\n ReceiverAbsorptance: 'Поглинання приймача',\r\n ReceiverOpticalEfficiency: 'Оптична ефективність приймача',\r\n ReceiverThermalEfficiency: 'Теплова ефективність приймача',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: 'Трубопровід для відбивачів Френеля',\r\n AbsorberPipePhysicalProperties: 'Фізичні властивості трубопроводу поглинання',\r\n AbsorberHeight: 'Висота трубопроводу поглинання',\r\n AbsorberApertureWidth: 'Ширина отвору трубопроводу поглинання',\r\n AbsorberPipePoleNumber: 'Кількість полюсів для трубопроводу поглинання',\r\n AbsorberAbsorptance: 'Сила поглинання',\r\n AbsorberOpticalEfficiency: 'Оптична ефективність поглинача',\r\n AbsorberThermalEfficiency: 'Теплова ефективність поглинача',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: 'Сонячна вежа з тяговим потоком',\r\n SolarUpdraftTowerPhysicalProperties: 'Фізичні властивості сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerChimneyHeight: 'Висота димової труби сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerChimneyRadius: 'Радіус димової труби сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerCollectorHeight: 'Висота колектора сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerCollectorRadius: 'Радіус колектора сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerCollectorTransmissivity: 'Проникність колектора сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerCollectorEmissivity: 'Випромінюваність колектора сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerDischargeCoefficient: 'Коефіцієнт викиду сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerTurbineEfficiency: 'Ефективність турбіни сонячної вежі з тяговим потоком',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\r\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані сенсори',\r\n RemoveAllUnlockedPolygons: 'Видалити всі розблоковані полігони',\r\n RemoveAllUnlockedHumans: 'Видалити всіх розблокованих людей',\r\n RemoveAllUnlockedTrees: 'Видалити всі розблоковані дерева',\r\n RemoveAllUnlockedFlowers: 'Видалити всі розблоковані квіти',\r\n Racks: 'Стійки',\r\n SolarPanels: 'Сонячні панелі',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому кубоїді, які не заблоковані',\r\n Sensors: 'Сенсори',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі сенсори на цьому кубоїді, які не заблоковані',\r\n Polygons: 'Полігони',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі полігони на цьому кубоїді, які не заблоковані',\r\n Humans: 'Люди',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid:\r\n 'Ви дійсно бажаєте видалити всіх людей на цьому кубоїді, які не заблоковані',\r\n Trees: 'Дерева',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі дерева на цьому кубоїді, які не заблоковані',\r\n Flowers: 'Квіти',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі квіти на цьому кубоїді, які не заблоковані',\r\n OnlyThisCuboid: 'Тільки цей кубоїд',\r\n AllCuboidsOnSameSurface: 'Усі кубоїди на одній поверхні',\r\n AllCuboidsAboveSameBase: 'Усі кубоїди над тією ж основою',\r\n AllSelectedCuboids: 'All Selected Cuboids',\r\n AllCuboids: 'Всі кубоїди',\r\n OnlyThisSide: 'Тільки ця сторона',\r\n AllSidesOfThisCuboid: 'Всі сторони цього кубоїда',\r\n AllSidesOfSelectedCuboids: 'All Sides of Selected Cuboids',\r\n AllSidesOfAllCuboids: 'Всі сторони всіх кубоїдів',\r\n AddPolygon: 'Додати полігон',\r\n Stackable: 'Стекабельне',\r\n GroupMaster: 'Майстер групи',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n TextBox: 'Текстове поле',\r\n FontOutlineColor: 'Колір контуру шрифту',\r\n FontOutlineWidth: 'Товщина контуру шрифту',\r\n FontStrokeColor: 'Колір обводки шрифту',\r\n FontStrokeWidth: 'Товщина обводки шрифту',\r\n NoOutline: 'Без контуру',\r\n Shiny: 'Блискучий',\r\n Filled: 'Заповнений',\r\n FillTexture: 'Текстура заповнення',\r\n FillColor: 'Колір заповнення',\r\n Opacity: 'Прозорість',\r\n LineColor: 'Колір лінії',\r\n LineWidth: 'Товщина лінії',\r\n LineStyle: 'Стиль лінії',\r\n SolidLine: 'Суцільна лінія',\r\n DashedLine: 'Пунктирна лінія',\r\n DottedLine: 'Точкова лінія',\r\n InsertVertexBeforeIndex: 'Вставити вершину перед індексом',\r\n InsertVertexAfterIndex: 'Вставити вершину після індексу',\r\n DeleteVertex: 'Видалити вершину',\r\n OnlyThisPolygon: 'Тільки цей полігон',\r\n AllPolygonsOnSurface: 'Всі полігони на цій поверхні',\r\n AllPolygonsAboveFoundation: 'Всі полігони вище фундаменту',\r\n AllSelectedPolygons: 'All Selected Polygons',\r\n AllPolygons: 'Всі полігони',\r\n Layout: 'Розташування',\r\n SolarPanelArrayLayout: 'Розташування сонячних панелей',\r\n SolarPanelArrayLayoutParametricDesign: 'Розташування сонячних панелей: параметричний дизайн',\r\n SolarPanelArrayLayoutGenerativeDesign: 'Розташування сонячних панелей: генеративний дизайн',\r\n SolarPanelArrayModel: 'Модель сонячної панелі',\r\n SolarPanelArrayOrientation: 'Орієнтація',\r\n SolarPanelArrayTiltAngle: 'Кут нахилу',\r\n SolarPanelArrayRowWidth: 'Ширина ряду',\r\n SolarPanelArrayInterRowSpacing: 'Міжрядковий інтервал',\r\n SolarPanelArrayRowSpacing: 'Row Spacing',\r\n SolarPanelArrayRowAxis: 'Вісь ряду',\r\n SolarPanelArrayLeftRightRowAxis: 'Наліво-Направо (відносне)',\r\n SolarPanelArrayUpDownRowAxis: 'Вгору-Вниз (відносне)',\r\n SolarPanelArrayEastWestRowAxis: 'Схід-Захід (абсолютне)',\r\n SolarPanelArrayNorthSouthRowAxis: 'Північ-Південь (абсолютне)',\r\n SolarPanelArrayMargin: 'Відступ',\r\n SolarPanelArrayPoleHeight: 'Висота стовпа',\r\n SolarPanelArrayPoleSpacing: 'Інтервал між стовпами',\r\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\r\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\r\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\r\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\r\n SolarPanelArrayYearlyProfit: 'Profit',\r\n LayoutNotAcceptedCheckYourParameters: 'Це розташування не приймається. Будь ласка, перевірте ваші параметри.',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: 'Оптимізація',\r\n Parameters: 'Параметри',\r\n Variables: 'Змінні',\r\n Constants: 'Константи',\r\n GeneticAlgorithm: 'Генетичний алгоритм',\r\n GeneticAlgorithmSettings: 'Налаштування генетичного алгоритму',\r\n ParticleSwarmOptimization: 'Оптимізація роєм частинок',\r\n ParticleSwarmOptimizationSettings: 'Налаштування оптимізації роєм частинок',\r\n SolarPanelTiltAngleOptimization: 'Оптимізація кута нахилу сонячних панелей',\r\n SolarPanelArrayLayout: 'Розташування сонячних панелей',\r\n Generation: 'Покоління',\r\n Gene: 'Ген',\r\n NormalizedVariables: 'Нормалізовані змінні',\r\n Objective: 'Ціль',\r\n ObjectiveFunctionDailyTotalYield: 'Щоденний загальний дохід',\r\n ObjectiveFunctionYearlyTotalYield: 'Щорічний загальний дохід',\r\n ObjectiveFunctionDailyMeanYield: 'Щоденний середній дохід',\r\n ObjectiveFunctionYearlyMeanYield: 'Щорічний середній дохід',\r\n ObjectiveFunctionDailyProfit: 'Щоденний прибуток',\r\n ObjectiveFunctionYearlyProfit: 'Щорічний прибуток',\r\n GeneticAlgorithmSelectionMethod: 'Метод вибору для генетичного алгоритму',\r\n RouletteWheel: 'Велосипедне колесо',\r\n Tournament: 'Турнір',\r\n SearchMethod: 'Метод пошуку',\r\n GlobalSearchUniformSelection: 'Глобальний пошук з однорідним вибором',\r\n LocalSearchRandomOptimization: 'Локальний пошук випадкової оптимізації',\r\n PopulationSize: 'Розмір населення',\r\n MaximumGenerations: 'Максимальна кількість поколінь',\r\n SelectionRate: 'Швидкість відбору',\r\n CrossoverRate: 'Швидкість схрещування',\r\n MutationRate: 'Швидкість мутації',\r\n Step: 'Крок',\r\n SwarmSize: 'Розмір рою',\r\n MaximumSteps: 'Максимальна кількість кроків',\r\n MaximumVelocity: 'Максимальна швидкість',\r\n InertiaWeight: 'Вага інерції',\r\n CognitiveCoefficient: 'Коефіцієнт когнітивної функції',\r\n SocialCoefficient: 'Коефіцієнт соціальної взаємодії',\r\n ConvergenceThreshold: 'Поріг збіжності для завершення',\r\n LocalSearchRadius: 'Радіус локального пошуку',\r\n RowsPerRackRange: 'Діапазон для рядів на стелаж',\r\n TiltAngleRange: 'Діапазон для кута нахилу',\r\n InterRowSpacingRange: 'Діапазон для міжрядкового проміжку',\r\n ClickTargetPolygonToActivate: 'Натисніть на цільовий полігон для активації',\r\n ClickTargetFoundationToActivate: 'Натисніть на цільовий фундамент для активації',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: 'Показати модель',\r\n Flip: 'Перевернути',\r\n Type: 'Тип',\r\n Spread: 'Розповсюдження',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: 'Перевернути',\r\n Type: 'Тип',\r\n Spread: 'Розповсюдження',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: 'Змінити особу',\r\n Flip: 'Перевернути',\r\n Observer: 'Спостерігач',\r\n ViewFromThisPerson: 'Переглянути з цієї особи',\r\n },\r\n\r\n lightMenu: {\r\n Color: 'Колір',\r\n Intensity: 'Інтенсивність',\r\n Decay: 'Затухання',\r\n MaximumDistance: 'Максимальна відстань',\r\n Inside: 'Усередині',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: 'Відносний азимут',\r\n Pole: 'Стовп',\r\n PoleHeight: 'Висота стовпа',\r\n PoleRadius: 'Pole Radius',\r\n ExtraPoleHeight: 'Додаткова висота стовпа',\r\n ExtraPoleHeightInAdditionToHalfWidth: 'Додаткова висота стовпа на додаток до половини ширини',\r\n DrawSunBeam: 'Намалювати промінь сонця',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: 'Відбивання відбивача',\r\n ReceiverAbsorptance: 'Поглинання приймача',\r\n ReflectorOpticalEfficiency: 'Оптична ефективність відбивача',\r\n ReceiverThermalEfficiency: 'Теплова ефективність приймача',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: 'Inverter Efficiency',\r\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\r\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\r\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\r\n ChangePvModel: 'Змінити модель',\r\n Orientation: 'Орієнтація',\r\n Portrait: 'Вертикальна',\r\n Landscape: 'Горизонтальна',\r\n FrameColor: 'Колір рамки',\r\n Panels: 'панелі',\r\n PanelsWide: 'панелі по ширині',\r\n PanelsLong: 'панелі по довжині',\r\n TiltAngle: 'Кут нахилу',\r\n SouthFacingIsPositive: 'Південь вважається позитивним',\r\n Tracker: 'Трекер',\r\n SolarTrackerFollowsSun: 'Трекер слідкує за сонцем для збільшення виходу сонячних панелей.',\r\n PoleSpacing: 'Відстань між стовпами',\r\n NoTracker: 'Без трекера',\r\n HorizontalSingleAxisTracker: 'Трекер з горизонтальною одноосевою орієнтацією',\r\n VerticalSingleAxisTracker: 'Трекер з вертикальною одноосевою орієнтацією',\r\n AltazimuthDualAxisTracker: 'Трекер з азимутально-альтазимутальною двоосевою орієнтацією',\r\n OnlyThisSolarPanel: 'Тільки ця сонячна панель',\r\n AllSolarPanelsOnSurface: 'Всі сонячні панелі на одній поверхні',\r\n AllSolarPanelsAboveFoundation: 'Всі сонячні панелі над однією фундаментом',\r\n AllSelectedSolarPanels: 'All Selected Solar Panels',\r\n AllSolarPanels: 'Всі сонячні панелі',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: 'Технічні характеристики сонячної панелі',\r\n Model: 'Модель',\r\n PanelSize: 'Розмір панелі',\r\n Cells: 'Комірки',\r\n CellType: 'Тип комірок',\r\n Monocrystalline: 'Монокристалічні',\r\n Polycrystalline: 'Полікристалічні',\r\n ThinFilm: 'Тонкоплівкові',\r\n Bifacial: 'Bifacial',\r\n BifacialityFactor: 'Bifaciality Factor',\r\n Black: 'Чорний',\r\n Blue: 'Синій',\r\n ShadeTolerance: 'Стійкість до затінення',\r\n SolarCellEfficiency: 'Ефективність сонячної комірки',\r\n NominalOperatingCellTemperature: 'Номінальна робоча температура комірки',\r\n TemperatureCoefficientOfPmax: 'Температурний коефіцієнт Pmax',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: 'Довжина модуля',\r\n Modules: 'модулі',\r\n ModulesLong: 'модулів у довжину',\r\n LatusRectum: 'Велика піввісь',\r\n OnlyThisParabolicTrough: 'Тільки цей параболічний сонячний колектор',\r\n AllParabolicTroughsAboveFoundation: 'Усі параболічні сонячні колектори над цим фундаментом',\r\n AllSelectedParabolicTroughs: 'All Selected Parabolic Troughs',\r\n AllParabolicTroughs: 'Усі параболічні сонячні колектори',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: 'Труба поглинання',\r\n SelectAbsorberToReflectSunlightTo: 'Виберіть поглинач, до якого буде відбиватися сонячне світло',\r\n ModuleLength: 'Довжина модуля',\r\n Modules: 'модулі',\r\n ModulesLong: 'модулів у довжину',\r\n OnlyThisFresnelReflector: 'Тільки цей відбивач Френеля',\r\n AllFresnelReflectorsAboveFoundation: 'Усі відбивачі Френеля над цим фундаментом',\r\n AllSelectedFresnelReflectors: 'All Selected Fresnel Reflectors',\r\n AllFresnelReflectors: 'Усі відбивачі Френеля',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: 'Вежа',\r\n SelectTowerToReflectSunlightTo: 'Виберіть вежу, до якої буде відбиватися сонячне світло',\r\n OnlyThisHeliostat: 'Тільки цей геліостат',\r\n AllHeliostatsAboveFoundation: 'Усі геліостати над цим фундаментом',\r\n AllSelectedHeliostats: 'All Selected Heliostats',\r\n AllHeliostats: 'Усі геліостати',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: 'Структура приймача',\r\n CentralPole: 'Центральний стовп',\r\n CentralPoleWithTripod: 'Центральний стовп з триногою',\r\n Quadrupod: 'Чотиринога',\r\n RimDiameter: 'Діаметр ободу',\r\n LatusRectum: 'Велика піввісь',\r\n ExtraPoleHeightInAdditionToRadius: 'Додаткова висота стовпа плюс радіус',\r\n OnlyThisParabolicDish: 'Тільки ця параболічна тарілка',\r\n AllParabolicDishesAboveFoundation: 'Усі параболічні тарілки над цим фундаментом',\r\n AllSelectedParabolicDishes: 'All Selected Parabolic Dishes',\r\n AllParabolicDishes: 'Усі параболічні тарілки',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: 'Типова текстура',\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n SizeOfWall: 'Розмір стіни',\r\n OnlyThisWall: 'Тільки ця стіна',\r\n AllConnectedWalls: \"Всі пов'язані стіни\",\r\n AllWallsAboveFoundation: 'Всі стіни над цим фундаментом',\r\n AllSelectedWalls: 'All Selected Walls',\r\n AllWalls: 'Всі стіни',\r\n Windows: 'Вікна',\r\n LockAllWindows: 'Заблокувати всі вікна',\r\n UnlockAllWindows: 'Розблокувати всі вікна',\r\n RemoveAllUnlockedWindows: 'Видалити всі розблоковані вікна',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Ви дійсно бажаєте видалити всі вікна на цій стіні',\r\n Doors: 'Двері',\r\n RemoveAllUnlockedDoors: 'Видалити всі розблоковані двері',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Ви дійсно бажаєте видалити всі двері на цій стіні',\r\n SolarPanels: 'Сонячні панелі',\r\n LockAllSolarPanels: 'Заблокувати всі сонячні панелі',\r\n UnlockAllSolarPanels: 'Розблокувати всі сонячні панелі',\r\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Ви дійсно бажаєте видалити всі сонячні панелі на цій стіні',\r\n Sensors: 'Датчики',\r\n LockAllSensors: 'Заблокувати всі датчики',\r\n UnlockAllSensors: 'Розблокувати всі датчики',\r\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані датчики',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Ви дійсно бажаєте видалити всі датчики на цій стіні',\r\n Lights: 'Лампи',\r\n RemoveAllUnlockedLights: 'Видалити всі розблоковані лампи',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Ви дійсно бажаєте видалити всі лампи на цій стіні',\r\n LockAllPolygons: 'Заблокувати всі полігони',\r\n UnlockAllPolygons: 'Розблокувати всі полігони',\r\n RemoveAllUnlockedPolygons: 'Видалити всі розблоковані полігони',\r\n WallStructure: 'Структура стіни',\r\n DefaultStructure: 'Типова',\r\n StudStructure: 'Студ',\r\n PillarStructure: 'Пілар',\r\n Opacity: 'Непрозорість',\r\n StructureSpacing: 'Відстань між структурами',\r\n StructureWidth: 'Ширина структури',\r\n StructureThickness: 'Товщина структури',\r\n StructureColor: 'Колір структури',\r\n Color: 'Колір стіни',\r\n Height: 'Висота',\r\n Thickness: 'Товщина',\r\n Texture: 'Текстура',\r\n AllLightsOnWallInside: 'Всі лампи всередині стіни',\r\n AllLightsOnWallOutside: 'Всі лампи ззовні стіни',\r\n Fill: 'Заповнення',\r\n Full: 'Повне',\r\n Partial: 'Часткове',\r\n Empty: 'Порожнє',\r\n OpenToOutside: 'Відкрите на зовнішню сторону',\r\n EavesLength: 'Довжина карнизу',\r\n Parapet: 'Перила',\r\n ParapetColor: 'Колір перил',\r\n ParapetTexture: 'Текстура перил',\r\n ParapetHeight: 'Висота перил',\r\n CopingsHeight: 'Висота паркану',\r\n CopingsWidth: 'Ширина паркану',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: 'Тільки це вікно',\r\n AllWindowsOnSurface: 'All Windows on the Same Surface',\r\n AllWindowsAboveFoundation: 'Всі вікна над однією фундаментом',\r\n AllSelectedWindows: 'All Selected Windows',\r\n AllWindows: 'Всі вікна',\r\n Width: 'Ширина',\r\n Height: 'Висота',\r\n Setback: 'Setback from Exterior Surface',\r\n RelativeToWallThickness: 'Relative to wall thickness',\r\n Mullion: 'Розділовий стовпець',\r\n HorizontalMullion: 'Horizontal Mullion',\r\n VerticalMullion: 'Vertical Mullion',\r\n MullionWidth: 'Ширина розділового стовпця',\r\n HorizontalMullionSpacing: 'Horizontal Mullion Spacing',\r\n VerticalMullionSpacing: 'Vertical Mullion Spacing',\r\n MullionColor: 'Колір розділового стовпця',\r\n Tint: 'Відтінок',\r\n Opacity: 'Непрозорість',\r\n SolarHeatGainCoefficient: 'Коефіцієнт сонячного теплового навантаження (SHGC) = 1 - непрозорість',\r\n Shutter: 'Жалюзі',\r\n LeftShutter: 'Ліве жалюзі',\r\n RightShutter: 'Праве жалюзі',\r\n BothShutters: 'Обидві жалюзі',\r\n ShutterWidth: 'Відносна ширина',\r\n ShutterColor: 'Колір жалюзі',\r\n Frame: 'Рамка',\r\n FrameWidth: 'Ширина рамки',\r\n SillWidth: 'Ширина підвіконня',\r\n Color: 'Колір рамки',\r\n WindowType: 'Тип вікна',\r\n Default: 'Типове',\r\n Arched: 'Аркове',\r\n Polygonal: 'Багатокутне',\r\n Interior: \"Інтер'єр\",\r\n Empty: 'Порожнє',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: 'Типове',\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n OnlyThisRoof: 'Тільки цей дах',\r\n AllRoofsAboveFoundation: 'Всі дахи над одним фундаментом',\r\n AllSelectedRoofs: 'All Selected Roofs',\r\n AllRoofs: 'Всі дахи',\r\n OnlyThisCeiling: 'Тільки ця стеля',\r\n AllCeilingsAboveFoundation: 'Всі стелі над одним фундаментом',\r\n AllCeilings: 'Всі стелі',\r\n EavesOverhangLength: 'Довжина виступу карнизу',\r\n RafterSpacing: 'Відстань між стропилами',\r\n RafterWidth: 'Ширина стропила',\r\n RafterThickness: 'Товщина стропила',\r\n RafterColor: 'Колір стропила',\r\n RoofColor: 'Колір даху',\r\n RoofSideColor: 'Колір бокової частини даху',\r\n GlassTint: 'Колір скла',\r\n Opacity: 'Непрозорість',\r\n RoofStructure: 'Структура даху',\r\n DefaultStructure: 'Типова',\r\n RafterStructure: 'Стропило',\r\n GlassStructure: 'Скло',\r\n SolarPanels: 'Сонячні панелі',\r\n LockAllSolarPanels: 'Заблокувати всі сонячні панелі',\r\n UnlockAllSolarPanels: 'Розблокувати всі сонячні панелі',\r\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому даху',\r\n Windows: 'Вікна',\r\n LockAllWindows: 'Заблокувати всі вікна',\r\n UnlockAllWindows: 'Розблокувати всі вікна',\r\n RemoveAllUnlockedWindows: 'Видалити всі розблоковані вікна',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Ви дійсно бажаєте видалити всі вікна на цьому даху',\r\n Sensors: 'Сенсори',\r\n LockAllSensors: 'Заблокувати всі сенсори',\r\n UnlockAllSensors: 'Розблокувати всі сенсори',\r\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані сенсори',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Ви дійсно бажаєте видалити всі сенсори на цьому даху',\r\n Lights: 'Лампи',\r\n RemoveAllUnlockedLights: 'Видалити всі розблоковані лампи',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Ви дійсно бажаєте видалити всі лампи на цьому даху',\r\n AllLightsOnRoofInside: 'Всі лампи на даху всередині',\r\n AllLightsOnRoofOutside: 'Всі лампи на даху ззовні',\r\n Rise: 'Піднімання',\r\n Ceiling: 'Стеля',\r\n RoofRValue: 'Значення R для даху',\r\n CeilingRValue: 'Значення R для стелі',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: 'За замовчуванням',\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n Texture11: 'Текстура 11',\r\n Texture12: 'Текстура 12',\r\n Texture13: 'Текстура 13',\r\n Texture14: 'Текстура 14',\r\n Texture15: 'Текстура 15',\r\n Texture16: 'Текстура 16',\r\n Texture17: 'Текстура 17',\r\n OnlyThisDoor: 'Тільки ці двері',\r\n AllDoorsOnWall: 'Всі двері на цій стіні',\r\n AllDoorsAboveFoundation: 'Всі двері над тим самим фундаментом',\r\n AllSelectedDoors: 'All Selected Doors',\r\n AllDoors: 'Всі двері',\r\n DoorType: 'Тип дверей',\r\n Default: 'За замовчуванням',\r\n Arched: 'Аркові',\r\n Filled: 'Заповнені',\r\n FrameColor: 'Колір рамки',\r\n Interior: \"Інтер'єр\",\r\n },\r\n\r\n siteInfoPanel: {\r\n High: 'Високо',\r\n Low: 'Низько',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: 'Кількість вибраних геліостатів',\r\n NumberOfSelectedSolarPanels: 'Кількість вибраних сонячних панелей',\r\n ElectricityGeneratedDailyBySolarPanels: 'Електрика, що генерується щоденно цими сонячними панелями',\r\n SceneDiameter: 'Діаметр сцени',\r\n BuildingArea: 'Площа будівлі',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: 'Контраст кольору',\r\n FluxScale: 'Шкала потоку',\r\n ClickUpOrDownArrowButtonsToChange: 'Натисніть кнопки зі стрілками вгору або вниз щоб змінити',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: 'Повернути',\r\n DragMouse: 'Перетягніть мишею',\r\n Zoom: 'Масштабування',\r\n MouseWheelOrKeys: 'Обертайте колесо миші або натисніть Ctrl+[ або Ctrl+]',\r\n MouseWheelOrKeysMac: 'Обертайте колесо миші або натисніть ⌘+[ або ⌘+]',\r\n Pan: 'Переміщення',\r\n HoldCtrlDragMouse: 'Натисніть і утримуйте Ctrl, перетягніть мишею',\r\n HoldMetaDragMouse: 'Натисніть і утримуйте ⌘, перетягніть мишею',\r\n Enter2DMode: 'Ввійти в 2D режим',\r\n Exit2DMode: 'Вийти з 2D режиму',\r\n NavigationMode: 'Режим навігації',\r\n EnableNavigation: 'Увімкнути навігацію',\r\n DisableNavigation: 'Вимкнути навігацію',\r\n MoveForwardBack: 'Рухатися вперед/назад',\r\n MoveForwardBackInstruction: 'Натисніть W/S',\r\n MoveLeftRight: 'Рухатися вліво/вправо',\r\n MoveLeftRightInstruction: 'Натисніть A/D',\r\n MoveUpDown: 'Рухатися вгору/вниз',\r\n MoveUpDownInstruction: 'Натисніть Z/X',\r\n Turn: 'Повернути',\r\n TurnInstruction: 'Натисніть клавіші зі стрілками',\r\n ResetView: 'Скинути',\r\n AutoRotate: 'Автоматичний поворот',\r\n StartOrStop: 'Натисніть F4, щоб почати або зупинити',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: 'Зображення на землі',\r\n WeatherStations: 'Метеостанції',\r\n WeatherStationsNote: 'Вимкніть це, щоб прискорити',\r\n Coordinates: 'Координати',\r\n Zoom: 'Масштабування',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: 'Видимість сонячних панелей',\r\n Observer: 'Спостерігач',\r\n VantagePoint: 'Точка огляду',\r\n ItemizedVisibilityByFields: 'Розгорнутий за полями',\r\n TotalVisibility: 'Загальна видимість',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: 'Датчик освітленості',\r\n WeatherDataFrom: 'Метеодані з',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: 'Щоденна енергія будівлі',\r\n YearlyBuildingEnergy: 'Річна енергія будівлі',\r\n Heater: 'Обігрівач',\r\n AC: 'Кондиціонер',\r\n SolarPanel: 'Сонячна панель',\r\n Net: 'Всього',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: 'Щоденний дохід сонячних панелей',\r\n SolarPanelYearlyYield: 'Річний дохід сонячних панелей',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualSolarPanels: 'Показати дохід окремих сонячних панелей',\r\n Profit: 'Прибуток',\r\n TotalCost: 'Total Cost',\r\n TotalRevenue: 'Total Revenue',\r\n TotalYield: 'Total Yield',\r\n MeanYield: 'Mean Yield',\r\n ModuleCount: 'Module Count',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: 'Щоденний дохід параболічних сонячних колекторів',\r\n ParabolicTroughYearlyYield: 'Річний дохід параболічних сонячних колекторів',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualParabolicTroughs: 'Показати дохід окремих параболічних сонячних колекторів',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: 'Щоденний дохід параболічних тарілок',\r\n ParabolicDishYearlyYield: 'Річний дохід параболічних тарілок',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualParabolicDishes: 'Показати дохід окремих параболічних тарілок',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: 'Щоденний дохід відбивача Френеля',\r\n FresnelReflectorYearlyYield: 'Річний дохід відбивача Френеля',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualFresnelReflectors: 'Показати дохід окремих відбивачів Френеля',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: 'Щоденний дохід геліостату',\r\n HeliostatYearlyYield: 'Річний дохід геліостату',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualHeliostats: 'Показати дохід окремих геліостатів',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: 'Щоденний дохід сонячної вежі',\r\n UpdraftTowerYearlyYield: 'Річний дохід сонячної вежі',\r\n ChimneyAirTemperature: 'Температура повітря у димовій трубі',\r\n ChimneyWindSpeed: 'Швидкість вітру у димовій трубі',\r\n Yield: 'дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualUpdraftTowers: 'Показати дохід окремих сонячних веж',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: 'Налаштування Сонця та Часу',\r\n SunAngles: 'Кути Сонця',\r\n TwentyFourHours: '24 Години',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Пошук за назвою',\r\n MyLikes: 'Мої вподобання',\r\n MyCloudFiles: 'Мої файли у хмарному середовищі',\r\n GenerateLink: 'Створити посилання',\r\n LinkGeneratedInClipBoard: 'Посилання було створено та скопійовано до буферу обміну',\r\n DoYouReallyWantToDelete: 'Ви дійсно бажаєте видалити',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\r\n 'Якщо цей файл було відкрито або опубліковано, зміна його назви порушить наявні посилання',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Пошук за назвою',\r\n MyProjects: 'My Projects',\r\n GenerateProjectLink: 'Generate Project Link',\r\n ProjectLinkGeneratedInClipBoard: 'A link to the project was generated in the clip board',\r\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\r\n 'If this project has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: 'Project Settings',\r\n ThumbnailImageSize: 'Thumbnail Image Size',\r\n ProjectByOtherPeople: 'Project by Other People',\r\n Project: 'Project',\r\n ProjectType: 'Тип проєкту',\r\n ProjectDescription: 'Description',\r\n MakeDescriptionEditable: 'Make this description editable',\r\n MakeDescriptionNonEditable: 'Make this description non-editable',\r\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\r\n SolarPanelArray: 'Solar Panel Array',\r\n CurateCurrentDesign: 'Curate current design',\r\n UpdateSelectedDesign: 'Update selected design',\r\n RemoveSelectedDesign: 'Remove selected design',\r\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\r\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\r\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\r\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\r\n ChooseSolutionSpace: 'Choose solution space',\r\n ChooseDataColoring: 'Choose data coloring',\r\n SameColorForAllDesigns: 'Same color for all designs',\r\n OneColorForEachDesign: 'One color for each design',\r\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\r\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\r\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\r\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\r\n GenerateScatteredPlot: 'Generate Scattered Plot',\r\n SelectXAxis: 'Select X Axis',\r\n SelectYAxis: 'Select Y Axis',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: 'Мої налаштування облікового запису',\r\n MyID: 'Моє 🆔',\r\n ClickToCopyMyID: 'Натисніть, щоб скопіювати моє ID',\r\n IDInClipBoard: 'Ваш ID було скопійоване і готове для вставки.',\r\n StoreMyNameInMyFilesWhenSaving: \"Зберігати моє ім'я в моїх файлах при збереженні\",\r\n DoYouReallyWantToShowYourNameInYourFiles: \"Ви дійсно бажаєте відображати ваше ім'я в файлах?\",\r\n SignFileDisclaimer: \"Якщо так, ваше ім'я зможе бачити будь-хто, хто матиме доступ до ваших файлів.\",\r\n Likes: 'Вподобання',\r\n AllPublished: 'Усі опубліковані',\r\n PublishedUnderAliases: 'Псевдоніми',\r\n UserCount: 'Кількість користувачів',\r\n SchoolID: 'ID Школи',\r\n ClassID: 'ID Класу',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: 'Сонячні години',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: 'Виберіть модель повітряної температури',\r\n Sinusoidal: 'Синусоїдальна',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: 'Параметри економіки',\r\n ElectricitySellingPrice: 'Ціна продажу електроенергії',\r\n OperationalCostPerUnit: 'Операційні витрати за одиницю',\r\n SellingPrice: 'Selling Price',\r\n UnitCost: 'Unit Cost',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: 'Navigation Parameters',\r\n MinimumMoveSpeed: 'Minimum Move Speed',\r\n MinimumTurnSpeed: 'Minimum Turn Speed',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: 'Ясність неба',\r\n ShowDaylightResults: 'Показати результати денного освітлення',\r\n ShowSkyClearnessResults: 'Показати результати ясності неба',\r\n ShowAverageDailySolarRadiation: 'Показати середню щоденну сонячну радіацію',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: 'Немає датчика для збору даних.',\r\n NoSolarPanelForAnalysis: 'Немає сонячної панелі для аналізу.',\r\n NoObserverForVisibilityAnalysis: 'Немає спостерігача для аналізу видимості.',\r\n NoWaterHeaterForAnalysis: 'Немає водонагрівача для аналізу.',\r\n NoParabolicDishForAnalysis: 'Немає параболічної тарілки для аналізу.',\r\n NoParabolicTroughForAnalysis: 'Немає параболічного сонячного колектора для аналізу.',\r\n NoFresnelReflectorForAnalysis: 'Немає відбивача Френеля для аналізу.',\r\n NoHeliostatForAnalysis: 'Немає геліостата для аналізу.',\r\n NoSolarUpdraftTowerForAnalysis: 'Немає сонячної вежі для аналізу.',\r\n NoBuildingForAnalysis: 'Немає будівлі для аналізу.',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: 'Хмарний файл',\r\n Select: 'Вибрати',\r\n AddFoundation: 'Додати фундамент',\r\n AddWall: 'Додати стіну',\r\n AddWindow: 'Додати вікно',\r\n AddDoor: 'Додати двері',\r\n AddPyramidRoof: 'Додати пірамідальний дах',\r\n AddGableRoof: 'Додати шатровий дах',\r\n AddHipRoof: 'Додати чотирихилий дах',\r\n AddGambrelRoof: 'Додати двосхилий дах',\r\n AddMansardRoof: 'Додати мансардний дах',\r\n AddCuboid: 'Додати прямокутний паралелепіпед',\r\n AddSensor: 'Додати датчик',\r\n AddSolarPanel: 'Додати сонячну панель',\r\n AddWaterHeater: 'Додати водонагрівач',\r\n AddParabolicDish: 'Додати параболічну тарілку',\r\n AddParabolicTrough: 'Додати параболічний сонячний колектор',\r\n AddFresnelReflector: 'Додати відбивач Френеля',\r\n AddHeliostat: 'Додати геліостат',\r\n AddWindTurbine: 'Додати вітрогенератор',\r\n AddLight: 'Додати світло',\r\n AddTree: 'Додати дерево',\r\n AddFlower: 'Додати квітку',\r\n AddPeople: 'Додати людей',\r\n DoubleClickToLockThisModeForNextAction: 'Подвійне клацання, щоб заблокувати цей режим для наступної дії',\r\n ClickToUnlockThisModeForNextAction: 'Клацніть, щоб розблокувати цей режим для наступної дії',\r\n ManipulateGroup: 'Маніпулювати групою',\r\n ClearScene: 'Очистити сцену',\r\n ShowSunAndTimeSettings: 'Показати налаштування Сонця та Часу',\r\n SpatialAnalysisOfEnergy: 'Просторовий аналіз енергії',\r\n DoYouReallyWantToClearContent: 'Ви дійсно бажаєте очистити вміст',\r\n ClickForMoreButtons: 'Натисніть для додаткових кнопок',\r\n SwitchToAddingFoundation: 'Переключитися на додавання фундаменту',\r\n SwitchToAddingCuboid: 'Переключитися на додавання прямокутного паралелепіпеду',\r\n SwitchToAddingWall: 'Переключитися на додавання стіни',\r\n SwitchToAddingWindow: 'Переключитися на додавання вікна',\r\n SwitchToAddingDoor: 'Переключитися на додавання дверей',\r\n SwitchToAddingPyramidRoof: 'Переключитися на додавання пірамідального даху',\r\n SwitchToAddingGableRoof: 'Переключитися на додавання шатрового даху',\r\n SwitchToAddingHipRoof: 'Переключитися на додавання чотирихилий даху',\r\n SwitchToAddingGambrelRoof: 'Переключитися на додавання двосхилий даху',\r\n SwitchToAddingMansardRoof: 'Переключитися на додавання мансардного даху',\r\n SwitchToAddingSolarPanel: 'Переключитися на додавання сонячної панелі',\r\n SwitchToAddingSensor: 'Переключитися на додавання датчика',\r\n SwitchToAddingWaterHeater: 'Переключитися на додавання водонагрівача',\r\n SwitchToAddingParabolicDish: 'Переключитися на додавання параболічної тарілки',\r\n SwitchToAddingParabolicTrough: 'Переключитися на додавання параболічного сонячного колектора',\r\n SwitchToAddingFresnelReflector: 'Переключитися на додавання відбивача Френеля',\r\n SwitchToAddingHeliostat: 'Переключитися на додавання геліостата',\r\n SwitchToAddingWindTurbine: 'Переключитися на додавання вітрогенератора',\r\n SwitchToAddingLight: 'Переключитися на додавання освітлення',\r\n SwitchToAddingTree: 'Переключитися на додавання дерева',\r\n SwitchToAddingFlower: 'Переключитися на додавання квітки',\r\n SwitchToAddingPeople: 'Переключитися на додавання людей',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: 'Перейти до Інституту Інтелекту Майбутнього',\r\n visitAladdinHomePage: 'Відвідати домашню сторінку Aladdin',\r\n clickToOpenMenu: 'Натисність, щоб відкрити Головне Меню',\r\n clickToAccessAccountSettings: 'Click to access account settings',\r\n },\r\n\r\n tree: {\r\n Apple: 'Яблуня',\r\n Birch: 'Береза',\r\n Coconut: 'Кокос',\r\n Dogwood: 'Дерен',\r\n Elm: \"В'яз\",\r\n FanPalm: 'Віяльна пальма',\r\n Linden: 'Липа',\r\n Magnolia: 'Магнолія',\r\n Maple: 'Клен',\r\n Oak: 'Дуб',\r\n Pine: 'Сосна',\r\n Spruce: 'Ялина',\r\n },\r\n\r\n flower: {\r\n Bellflower: 'Дзвоник',\r\n Boxwood: 'Самшит',\r\n CactusCombo1: 'Кактус Комбо 1',\r\n CactusCombo2: 'Кактус Комбо 2',\r\n CactusCombo3: 'Кактус Комбо 3',\r\n CactusCombo4: 'Кактус Комбо 4',\r\n Hibiscus: 'Гібіскус',\r\n Hosta: 'Госта',\r\n Hydrangea: 'Гортензія',\r\n Peony: 'Півонія',\r\n RedRose: 'Червона троянда',\r\n Spirea: 'Спірея',\r\n Sunflower: 'Соняшник',\r\n TallBush: 'Високий кущ',\r\n Tulip: 'Тюльпан',\r\n WhiteFlower: 'Біла квітка',\r\n YellowFlower: 'Жовта квітка',\r\n },\r\n\r\n people: {\r\n Jaah: 'Артем',\r\n Jack: 'Віталій',\r\n Jacob: 'Ярослав',\r\n Jacqueline: 'Олена',\r\n Jade: 'Ольга',\r\n Jamelia: 'Олександра',\r\n James: 'Андрій',\r\n Jane: 'Вікторія',\r\n Jaya: 'Ірина',\r\n Jaye: 'Назар',\r\n Jeanette: 'Соломія',\r\n Jedi: 'Євген',\r\n Jeff: 'Павло',\r\n Jena: 'Любов',\r\n Jennifer: 'Тетяна',\r\n Jess: 'Злата',\r\n Jett: 'Сергій',\r\n Jill: 'Надія',\r\n Jiya: 'Марина',\r\n Joan: 'Іванна',\r\n Jocelyn: 'Анастасія',\r\n Joel: 'Володимир',\r\n Joey: 'Вероніка',\r\n John: 'Іван',\r\n Jonathon: 'Петро',\r\n Jose: 'Микита',\r\n Joseph: 'Віктор',\r\n Joshua: 'Михайло',\r\n Judd: 'Владислав',\r\n Judy: 'Марія',\r\n Julia: 'Юлія',\r\n Julio: 'Дмитро',\r\n Jumapili: 'Марта',\r\n June: 'Анна',\r\n Juro: 'Юрій',\r\n Justin: 'Богдан',\r\n },\r\n\r\n compass: {\r\n N: 'Пн',\r\n S: 'Пд',\r\n W: 'Зx',\r\n E: 'Сх',\r\n },\r\n\r\n month: {\r\n January: 'Jan',\r\n February: 'Feb',\r\n March: 'Mar',\r\n April: 'Apr',\r\n May: 'May',\r\n June: 'Jun',\r\n July: 'Jul',\r\n August: 'Aug',\r\n September: 'Sep',\r\n October: 'Oct',\r\n November: 'Nov',\r\n December: 'Dec',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: 'Пошук за виробником',\r\n SearchByLabel: 'Пошук за міткою',\r\n MyPublishedModels: 'Мої опубліковані моделі',\r\n TotalNumberOfUserPublishedModels: 'Загальна кількість моделей, опублікованих користувачами',\r\n SortFromOldestToNewest: 'Сортувати від найдавніших до найновіших',\r\n SortFromNewestToOldest: 'Сортувати від найновіших до найдавніших',\r\n ModelsFoundOnThisSite: 'моделей знайдено на цьому сайті',\r\n ShowModelsPublishedByThisAuthor: 'Показати моделі, опубліковані цим автором',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { extend, Object3DNode } from '@react-three/fiber';\r\nimport TextSprite from 'three-spritetext';\r\nimport { MyOrbitControls } from './js/MyOrbitControls';\r\nimport { ParabolicCylinderGeometry } from './js/ParabolicCylinderGeometry';\r\nimport { ParaboloidGeometry } from './js/ParaboloidGeometry';\r\nimport { ConvexGeometry } from './js/ConvexGeometry';\r\nimport { Vector2 } from 'three';\r\n\r\n// Extend makes these JSX elements (with the first character lower-cased)\r\nextend({ TextSprite });\r\nextend({ MyOrbitControls });\r\nextend({ ParabolicCylinderGeometry });\r\nextend({ ParaboloidGeometry });\r\nextend({ ConvexGeometry });\r\n\r\ndeclare global {\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n textSprite: Object3DNode;\r\n myOrbitControls: Object3DNode;\r\n parabolicCylinderGeometry: Object3DNode;\r\n paraboloidGeometry: Object3DNode;\r\n convexGeometry: Object3DNode;\r\n }\r\n }\r\n}\r\n\r\nexport interface User {\r\n displayName: string | null;\r\n email: string | null;\r\n photoURL: string | null;\r\n uid: string | null;\r\n signFile: boolean;\r\n noLogging: boolean;\r\n schoolID: SchoolID;\r\n classID: ClassID;\r\n likes?: string[];\r\n published?: string[];\r\n aliases?: string[];\r\n}\r\n\r\nexport enum FirebaseName {\r\n FILES = 'Files',\r\n LOG_DATA = 'Log Data',\r\n}\r\n\r\nexport interface ModelSite {\r\n userid: string;\r\n title: string;\r\n latitude: number;\r\n longitude: number;\r\n address?: string;\r\n countryCode?: string;\r\n type?: string;\r\n author?: string;\r\n label?: string;\r\n description?: string;\r\n likeCount?: number;\r\n clickCount?: number;\r\n timeCreated?: number;\r\n pinned?: boolean;\r\n thumbnailUrl?: string;\r\n hashtags?: string;\r\n}\r\n\r\nexport interface Design {\r\n timestamp: number;\r\n title: string;\r\n thumbnail: string; // PNG Base64 data\r\n [key: string]: any;\r\n}\r\n\r\nexport enum SchoolID {\r\n UNKNOWN = 'UNKNOWN SCHOOL',\r\n SCHOOL1 = 'SCHOOL 1',\r\n SCHOOL2 = 'SCHOOL 2',\r\n SCHOOL3 = 'SCHOOL 3',\r\n SCHOOL4 = 'SCHOOL 4',\r\n SCHOOL5 = 'SCHOOL 5',\r\n}\r\n\r\nexport enum ClassID {\r\n UNKNOWN = 'UNKNOWN CLASS',\r\n CLASS1 = 'CLASS 1',\r\n CLASS2 = 'CLASS 2',\r\n CLASS3 = 'CLASS 3',\r\n CLASS4 = 'CLASS 4',\r\n CLASS5 = 'CLASS 5',\r\n CLASS6 = 'CLASS 6',\r\n CLASS7 = 'CLASS 7',\r\n CLASS8 = 'CLASS 8',\r\n CLASS9 = 'CLASS 9',\r\n}\r\n\r\nexport interface CloudFileInfo {\r\n readonly timestamp: number;\r\n readonly fileName: string;\r\n readonly uuid: string;\r\n readonly userid: string;\r\n}\r\n\r\nexport enum DataColoring {\r\n ALL = 0,\r\n INDIVIDUALS = 1,\r\n GROUPS = 2,\r\n}\r\n\r\nexport interface Range {\r\n variable: string;\r\n minimum: number;\r\n maximum: number;\r\n}\r\n\r\n// use null for undefined, as we need to persist this in Firebase\r\nexport interface ProjectInfo {\r\n owner: string | null;\r\n timestamp: number;\r\n title: string | null;\r\n description: string | null;\r\n type: DesignProblem;\r\n designs: Design[] | null;\r\n ranges: Range[] | null;\r\n hiddenParameters: string[] | null;\r\n counter: number;\r\n dataColoring: DataColoring;\r\n selectedProperty: string | null;\r\n sortDescending: boolean | null;\r\n xAxisNameScatteredPlot: string | null;\r\n yAxisNameScatteredPlot: string | null;\r\n dotSizeScatteredPlot: number | null;\r\n thumbnailWidth: number | null;\r\n}\r\n\r\nexport interface ActionInfo {\r\n readonly timestamp: number;\r\n readonly name: string;\r\n readonly elementId?: string;\r\n readonly elementType?: ObjectType;\r\n readonly result?: any;\r\n readonly details?: any;\r\n readonly steps?: number;\r\n}\r\n\r\nexport enum ModelType {\r\n UNKNOWN = 'Unknown',\r\n UNDER_CONSTRUCTION = 'Under Construction',\r\n RESIDENTIAL_BUILDING = 'Residential Building',\r\n COMMERCIAL_BUILDING = 'Commercial Building',\r\n SCHOOL_BUILDING = 'School Building',\r\n TOURIST_ATTRACTION = 'Tourist Attraction',\r\n PHOTOVOLTAIC = 'Photovoltaic',\r\n PARABOLIC_DISH = 'Parabolic Dish',\r\n PARABOLIC_TROUGH = 'Parabolic Trough',\r\n FRESNEL_REFLECTOR = 'Fresnel Reflector',\r\n SOLAR_POWER_TOWER = 'Solar Power Tower',\r\n}\r\n\r\nexport enum BuildingCompletionStatus {\r\n COMPLETE,\r\n ROOF_MISSING,\r\n WALL_DISJOINED,\r\n WALL_EMPTY,\r\n}\r\n\r\nexport enum DesignProblem {\r\n SOLAR_PANEL_TILT_ANGLE = 'Solar Panel Tilt Angle',\r\n SOLAR_PANEL_ARRAY = 'Solar Panel Array',\r\n}\r\n\r\nexport enum ObjectiveFunctionType {\r\n DAILY_TOTAL_OUTPUT = 1,\r\n YEARLY_TOTAL_OUTPUT = 2,\r\n DAILY_AVERAGE_OUTPUT = 3,\r\n YEARLY_AVERAGE_OUTPUT = 4,\r\n DAILY_PROFIT = 5,\r\n YEARLY_PROFIT = 6,\r\n}\r\n\r\nexport enum EvolutionMethod {\r\n GENETIC_ALGORITHM = 1,\r\n PARTICLE_SWARM_OPTIMIZATION = 2,\r\n}\r\n\r\nexport enum GeneticAlgorithmSelectionMethod {\r\n ROULETTE_WHEEL = 1,\r\n TOURNAMENT = 2,\r\n}\r\n\r\nexport enum SearchMethod {\r\n GLOBAL_SEARCH_UNIFORM_SELECTION = 1,\r\n LOCAL_SEARCH_RANDOM_OPTIMIZATION = 2, // https://en.wikipedia.org/wiki/Random_optimization\r\n GLOBAL_SEARCH_FITNESS_SHARING = 3, // https://stackoverflow.com/questions/13775810/what-is-niching-scheme\r\n}\r\n\r\nexport enum LineStyle {\r\n Solid = 1,\r\n Dashed = 2,\r\n Dotted = 3,\r\n}\r\n\r\nexport enum LineWidth {\r\n One = 1,\r\n Two = 2,\r\n Three = 3,\r\n Four = 4,\r\n Five = 5,\r\n}\r\n\r\nexport interface DatumEntry {\r\n [key: string]: number | undefined | string | boolean;\r\n}\r\n\r\nexport interface EnergyUsage {\r\n heater: number;\r\n ac: number;\r\n solarPanel: number;\r\n geothermal: number;\r\n label?: string;\r\n}\r\n\r\nexport enum ChartType {\r\n Line = 1,\r\n Area = 2,\r\n}\r\n\r\nexport enum GraphDataType {\r\n HourlyTemperatures = 1,\r\n MonthlyTemperatures = 2,\r\n SunshineHours = 3,\r\n DaylightData = 4,\r\n ClearnessData = 5,\r\n YearlyRadiationSensorData = 6,\r\n DailyRadiationSensorData = 7,\r\n YearlyPvYield = 8,\r\n DailyPvYield = 9,\r\n YearlyParabolicTroughYield = 10,\r\n DailyParabolicTroughYield = 11,\r\n YearlyParabolicDishYield = 12,\r\n DailyParabolicDishYield = 13,\r\n YearlyFresnelReflectorYield = 14,\r\n DailyFresnelReflectorYield = 15,\r\n YearlyHeliostatYield = 16,\r\n DailyHeliostatYield = 17,\r\n YearlyUpdraftTowerYield = 18,\r\n DailyUpdraftTowerYield = 19,\r\n YearlyBuildingEnergy = 20,\r\n DailyBuildingEnergy = 21,\r\n}\r\n\r\nexport enum Theme {\r\n Default = 'Default',\r\n Desert = 'Desert',\r\n Dune = 'Dune',\r\n Forest = 'Forest',\r\n Grassland = 'Grassland',\r\n Hill = 'Hill',\r\n Lake = 'Lake',\r\n Mountain = 'Mountain',\r\n Rural = 'Rural',\r\n}\r\n\r\nexport enum DiurnalTemperatureModel {\r\n Sinusoidal = 1,\r\n PartonLogan = 2, // https://www.sciencedirect.com/science/article/abs/pii/0002157181901059\r\n}\r\n\r\nexport enum Language {\r\n English = 'English',\r\n ChineseSimplified = '简体中文',\r\n ChineseTraditional = '繁体中文',\r\n Turkish = 'Türkçe',\r\n Spanish = 'Español',\r\n Ukrainian = 'Українська',\r\n}\r\n\r\nexport enum ObjectType {\r\n Sky = 'Sky',\r\n Ground = 'Ground',\r\n Foundation = 'Foundation',\r\n Wall = 'Wall',\r\n Window = 'Window',\r\n Door = 'Door',\r\n Roof = 'Roof',\r\n PyramidRoof = 'Pyramid Roof',\r\n GableRoof = 'Gable Roof',\r\n HipRoof = 'Hip Roof',\r\n GambrelRoof = 'Gambrel Roof',\r\n MansardRoof = 'Mansard Roof',\r\n Sensor = 'Sensor',\r\n SolarPanel = 'Solar Panel',\r\n WaterHeater = 'Water Heater',\r\n ParabolicDish = 'Parabolic Dish',\r\n ParabolicTrough = 'Parabolic Trough',\r\n FresnelReflector = 'Fresnel Reflector',\r\n Heliostat = 'Heliostat',\r\n WindTurbine = 'Wind Turbine',\r\n Cuboid = 'Cuboid',\r\n Human = 'Human',\r\n Tree = 'Tree',\r\n Flower = 'Flower',\r\n Polygon = 'Polygon',\r\n PolygonVertex = 'Polygon Vertex',\r\n Light = 'Light',\r\n None = 'None',\r\n}\r\n\r\nexport enum ParabolicDishStructureType {\r\n CentralPole = 1,\r\n CentralPoleWithTripod = 2,\r\n Quadrupod = 3,\r\n}\r\n\r\nexport enum SolarStructure {\r\n None = 0,\r\n FocusPipe = 1,\r\n FocusTower = 2,\r\n UpdraftTower = 3,\r\n}\r\n\r\nexport enum ActionType {\r\n Select = 'Select',\r\n Move = 'Move',\r\n Resize = 'Resize',\r\n Rotate = 'Rotate',\r\n ContextMenu = 'ContextMenu',\r\n}\r\n\r\nexport enum MoveHandleType {\r\n Default = 'Move Handle', // used when there is only one handle for moving\r\n Lower = 'Move Handle Lower',\r\n Upper = 'Move Handle Upper',\r\n Left = 'Move Handle Left',\r\n Right = 'Move Handle Right',\r\n Top = 'Move Handle Top',\r\n Mid = 'Move Handle Mid',\r\n}\r\n\r\nexport enum ResizeHandleType {\r\n LowerLeft = 'Resize Handle Lower Left',\r\n UpperLeft = 'Resize Handle Upper Left',\r\n LowerRight = 'Resize Handle Lower Right',\r\n UpperRight = 'Resize Handle Upper Right',\r\n LowerLeftTop = 'Resize Handle Lower Left Top',\r\n UpperLeftTop = 'Resize Handle Upper Left Top',\r\n LowerRightTop = 'Resize Handle Lower Right Top',\r\n UpperRightTop = 'Resize Handle Upper Right Top',\r\n Lower = 'Resize Handle Lower',\r\n Upper = 'Resize Handle Upper',\r\n Left = 'Resize Handle Left',\r\n Right = 'Resize Handle Right',\r\n Top = 'Resize Handle Top',\r\n Default = 'Resize Handle', // used for resizing a polygon\r\n Arch = 'Resize Handle Arch',\r\n WallPartialResizeLeft = 'Wall Partial Resize Handle Left',\r\n WallPartialResizeRight = 'Wall Partial Resize Handle Right',\r\n WallPartialResizeLeftTop = 'Wall Partial Resize Handle Left Top',\r\n WallPartialResizeRightTop = 'Wall Partial Resize Handle Right Top',\r\n}\r\n\r\nexport enum RotateHandleType {\r\n Lower = 'Rotate Handle Lower',\r\n Upper = 'Rotate Handle Upper',\r\n Tilt = 'Rotate Handle Tilt',\r\n}\r\n\r\nexport enum PolygonVertexAction {\r\n Delete = 'Delete Vertex',\r\n InsertBeforeIndex = 'Insert Vertex Before Index',\r\n InsertAfterIndex = 'Insert Vertex After Index',\r\n}\r\n\r\nexport enum IntersectionPlaneType {\r\n Horizontal = 'Horizontal',\r\n Vertical = 'Vertical',\r\n Ground = 'Ground',\r\n Sky = 'Sky',\r\n}\r\n\r\nexport enum Scope {\r\n OnlyThisObject = 1,\r\n AllObjectsOfThisTypeOnSurface = 2,\r\n AllObjectsOfThisTypeAboveFoundation = 3,\r\n AllObjectsOfThisType = 4,\r\n AllConnectedObjects = 5,\r\n OnlyThisSide = 6, // same wall\r\n AllSelectedObjectsOfThisType = 7,\r\n}\r\n\r\nexport enum Orientation {\r\n portrait = 'Portrait',\r\n landscape = 'Landscape',\r\n}\r\n\r\nexport enum RowAxis {\r\n eastWest = 'East-West', // absolute\r\n northSouth = 'North-South', // absolute\r\n leftRight = 'Left-Right', // relative to the parent\r\n upDown = 'Up-Down', // relative to the parent\r\n}\r\n\r\nexport enum TrackerType {\r\n NO_TRACKER = 'None',\r\n HORIZONTAL_SINGLE_AXIS_TRACKER = 'HSAT',\r\n ALTAZIMUTH_DUAL_AXIS_TRACKER = 'AADAT',\r\n VERTICAL_SINGLE_AXIS_TRACKER = 'VSAT',\r\n TILTED_SINGLE_AXIS_TRACKER = 'TSAT',\r\n}\r\n\r\nexport enum ShadeTolerance {\r\n NONE = 'None',\r\n HIGH = 'High',\r\n PARTIAL = 'Partial',\r\n}\r\n\r\nexport enum Discretization {\r\n EXACT = 'Exact',\r\n APPROXIMATE = 'Approximate',\r\n}\r\n\r\nexport enum TreeType {\r\n Apple = 'Apple',\r\n Birch = 'Birch',\r\n Coconut = 'Coconut',\r\n Dogwood = 'Dogwood',\r\n Elm = 'Elm',\r\n FanPalm = 'Fan Palm',\r\n Linden = 'Linden',\r\n Magnolia = 'Magnolia',\r\n Maple = 'Maple',\r\n Oak = 'Oak',\r\n Pine = 'Pine',\r\n Spruce = 'Spruce',\r\n}\r\n\r\nexport enum FlowerType {\r\n Bellflower = 'Bellflower',\r\n Boxwood = 'Boxwood',\r\n CactusCombo1 = 'Cactus Combo 1',\r\n CactusCombo2 = 'Cactus Combo 2',\r\n CactusCombo3 = 'Cactus Combo 3',\r\n CactusCombo4 = 'Cactus Combo 4',\r\n Hibiscus = 'Hibiscus',\r\n Hosta = 'Hosta',\r\n Hydrangea = 'Hydrangea',\r\n Peony = 'Peony',\r\n RedRose = 'Red Rose',\r\n Spirea = 'Spirea',\r\n Sunflower = 'Sunflower',\r\n TallBush = 'Tall Bush',\r\n Tulip = 'Tulip',\r\n WhiteFlower = 'White Flower',\r\n YellowFlower = 'Yellow Flower',\r\n}\r\n\r\nexport enum Gender {\r\n Male = 'Male',\r\n Female = 'Female',\r\n Other = 'Other',\r\n}\r\n\r\nexport enum HumanName {\r\n Jaah = 'Jaah',\r\n Jack = 'Jack',\r\n Jacob = 'Jacob',\r\n Jacqueline = 'Jacqueline',\r\n Jade = 'Jade',\r\n Jamelia = 'Jamelia',\r\n James = 'James',\r\n Jane = 'Jane',\r\n Jaya = 'Jaya',\r\n Jaye = 'Jaye',\r\n Jeanette = 'Jeanette',\r\n Jedi = 'Jedi',\r\n Jeff = 'Jeff',\r\n Jena = 'Jena',\r\n Jennifer = 'Jennifer',\r\n Jess = 'Jess',\r\n Jett = 'Jett',\r\n Jill = 'Jill',\r\n Jiya = 'Jiya',\r\n Jocelyn = 'Jocelyn',\r\n Joan = 'Joan',\r\n Joel = 'Joel',\r\n Joey = 'Joey',\r\n John = 'John',\r\n Jonathon = 'Jonathon',\r\n Joseph = 'Joseph',\r\n Jose = 'Jose',\r\n Joshua = 'Joshua',\r\n Judd = 'Judd',\r\n Judy = 'Judy',\r\n Julia = 'Julia',\r\n Julio = 'Julio',\r\n Jumapili = 'Jumapili',\r\n June = 'June',\r\n Juro = 'Juro',\r\n Justin = 'Justin',\r\n}\r\n\r\nexport enum PolygonTexture {\r\n Texture01 = 'Polygon Texture #1',\r\n Texture02 = 'Polygon Texture #2',\r\n Texture03 = 'Polygon Texture #3',\r\n Texture04 = 'Polygon Texture #4',\r\n Texture05 = 'Polygon Texture #5',\r\n Texture06 = 'Polygon Texture #6',\r\n Texture07 = 'Polygon Texture #7',\r\n Texture08 = 'Polygon Texture #8',\r\n Texture09 = 'Polygon Texture #9',\r\n Texture10 = 'Polygon Texture #10',\r\n NoTexture = 'No Polygon Texture',\r\n}\r\n\r\nexport enum FoundationTexture {\r\n Texture01 = 'Foundation Texture #1',\r\n Texture02 = 'Foundation Texture #2',\r\n Texture03 = 'Foundation Texture #3',\r\n Texture04 = 'Foundation Texture #4',\r\n Texture05 = 'Foundation Texture #5',\r\n Texture06 = 'Foundation Texture #6',\r\n Texture07 = 'Foundation Texture #7',\r\n Texture08 = 'Foundation Texture #8',\r\n Texture09 = 'Foundation Texture #9',\r\n Texture10 = 'Foundation Texture #10',\r\n NoTexture = 'No Foundation Texture',\r\n}\r\n\r\nexport enum CuboidTexture {\r\n Facade01 = 'Facade #1',\r\n Facade02 = 'Facade #2',\r\n Facade03 = 'Facade #3',\r\n Facade04 = 'Facade #4',\r\n Facade05 = 'Facade #5',\r\n Facade06 = 'Facade #6',\r\n Facade07 = 'Facade #7',\r\n Facade08 = 'Facade #8',\r\n Facade09 = 'Facade #9',\r\n Facade10 = 'Facade #10',\r\n NoTexture = 'No Facade Texture',\r\n}\r\n\r\nexport enum WallTexture {\r\n Default = 'Wall Texture Default',\r\n Texture01 = 'Wall Texture #1',\r\n Texture02 = 'Wall Texture #2',\r\n Texture03 = 'Wall Texture #3',\r\n Texture04 = 'Wall Texture #4',\r\n Texture05 = 'Wall Texture #5',\r\n Texture06 = 'Wall Texture #6',\r\n Texture07 = 'Wall Texture #7',\r\n Texture08 = 'Wall Texture #8',\r\n Texture09 = 'Wall Texture #9',\r\n Texture10 = 'Wall Texture #10',\r\n NoTexture = 'No Wall Texture',\r\n}\r\n\r\nexport enum DoorTexture {\r\n Default = 'Door Texture Default',\r\n Texture01 = 'Door Texture #1',\r\n Texture02 = 'Door Texture #2',\r\n Texture03 = 'Door Texture #3',\r\n Texture04 = 'Door Texture #4',\r\n Texture05 = 'Door Texture #5',\r\n Texture06 = 'Door Texture #6',\r\n Texture07 = 'Door Texture #7',\r\n Texture08 = 'Door Texture #8',\r\n Texture09 = 'Door Texture #9',\r\n Texture10 = 'Door Texture #10',\r\n Texture11 = 'Door Texture #11',\r\n Texture12 = 'Door Texture #12',\r\n Texture13 = 'Door Texture #13',\r\n Texture14 = 'Door Texture #14',\r\n Texture15 = 'Door Texture #15',\r\n Texture16 = 'Door Texture #16',\r\n Texture17 = 'Door Texture #17',\r\n NoTexture = 'No Door Texture',\r\n}\r\n\r\nexport enum RoofTexture {\r\n Default = 'Roof Texture Default',\r\n Texture01 = 'Roof Texture #1',\r\n Texture02 = 'Roof Texture #2',\r\n Texture03 = 'Roof Texture #3',\r\n Texture04 = 'Roof Texture #4',\r\n Texture05 = 'Roof Texture #5',\r\n Texture06 = 'Roof Texture #6',\r\n Texture07 = 'Roof Texture #7',\r\n NoTexture = 'No Roof Texture',\r\n}\r\n\r\nexport enum WallSide {\r\n Left = 'Left',\r\n Right = 'Right',\r\n}\r\n\r\nexport enum ElementState {\r\n Valid = 'Valid',\r\n OverLap = 'OverLap',\r\n OutsideBoundary = 'OutsideBoundary',\r\n Invalid = 'Invalid',\r\n}\r\n\r\nexport type WallAbsPos = {\r\n leftPointAbsPos: Vector2;\r\n rightPointAbsPos: Vector2;\r\n centerPointAbsPos: Vector2;\r\n};\r\n\r\nexport enum RoofHandleType {\r\n Mid = 'Mid',\r\n Left = 'Left',\r\n Right = 'Right',\r\n TopMid = 'TopMid',\r\n TopLeft = 'TopLeft',\r\n TopRight = 'TopRight',\r\n FrontLeft = 'FrontLeft',\r\n FrontRight = 'FrontRight',\r\n BackLeft = 'BackLeft',\r\n BackRight = 'BackRight',\r\n Top = 'Top',\r\n Ridge = 'Ridge',\r\n Null = 'Null',\r\n}\r\n\r\nexport interface OldRooftopElementData {\r\n parentId: string;\r\n foundationId?: string;\r\n position: number[];\r\n rotation: number[];\r\n normal: number[];\r\n}\r\n\r\nexport type BoxArgs = [width?: number | undefined, height?: number | undefined, depth?: number | undefined];\r\n","export default __webpack_public_path__ + \"static/media/weather.b0a3f5ef.csv\";","export default __webpack_public_path__ + \"static/media/solar_radiation_horizontal.38eaf9ed.csv\";","export default __webpack_public_path__ + \"static/media/solar_radiation_vertical.522681a8.csv\";","export default __webpack_public_path__ + \"static/media/pvmodules.3e173704.csv\";","import {\r\n Euler,\r\n EventDispatcher,\r\n MOUSE,\r\n Quaternion,\r\n Spherical,\r\n TOUCH,\r\n Vector2,\r\n Vector3\r\n} from 'three';\r\n\r\n// This set of controls performs orbiting, dollying (zooming), and panning.\r\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n//\r\n// Orbit - left mouse / touch: one-finger move\r\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\r\n// Pan - right mouse, or left mouse + ctrl/meta, or arrow keys / touch: two-finger move\r\n\r\nconst _changeEvent = { type: 'change' };\r\nconst _startEvent = { type: 'start' };\r\nconst _endEvent = { type: 'end' };\r\n\r\nclass MyOrbitControls extends EventDispatcher {\r\n\r\n constructor( object, domElement ) {\r\n\r\n super();\r\n\r\n if ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter \"domElement\" is now mandatory.' );\r\n if ( domElement === document ) console.error( 'THREE.OrbitControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.' );\r\n\r\n this.object = object;\r\n this.domElement = domElement;\r\n this.domElement.style.touchAction = 'none'; // disable touch scroll\r\n\r\n // Set to false to disable this control\r\n this.enabled = true;\r\n\r\n // \"target\" sets the location of focus, where the object orbits around\r\n this.target = new Vector3();\r\n\r\n // How far you can dolly in and out ( PerspectiveCamera only )\r\n this.minDistance = 0;\r\n this.maxDistance = Infinity;\r\n\r\n // How far you can zoom in and out ( OrthographicCamera only )\r\n this.minZoom = 0;\r\n this.maxZoom = Infinity;\r\n\r\n // How far you can orbit vertically, upper and lower limits.\r\n // Range is 0 to Math.PI radians.\r\n this.minPolarAngle = 0; // radians\r\n this.maxPolarAngle = Math.PI; // radians\r\n\r\n // How far you can orbit horizontally, upper and lower limits.\r\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\r\n this.minAzimuthAngle = - Infinity; // radians\r\n this.maxAzimuthAngle = Infinity; // radians\r\n\r\n // Set to true to enable damping (inertia)\r\n // If damping is enabled, you must call controls.update() in your animation loop\r\n this.enableDamping = false;\r\n this.dampingFactor = 0.05;\r\n\r\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\r\n // Set to false to disable zooming\r\n this.enableZoom = true;\r\n this.zoomSpeed = 1.0;\r\n\r\n // Set to false to disable rotating\r\n this.enableRotate = true;\r\n this.rotateSpeed = 1.0;\r\n\r\n // Set to false to disable panning\r\n this.enablePan = true;\r\n this.panSpeed = 1.0;\r\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\r\n this.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\r\n\r\n // Set to true to automatically rotate around the target\r\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\r\n this.autoRotate = false;\r\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\r\n\r\n // The four arrow keys\r\n this.moveSpeed = 1;\r\n this.turnSpeed = 1;\r\n this.keys = {\r\n MOVE_LEFT: 'KeyA',\r\n MOVE_RIGHT: 'KeyD',\r\n MOVE_FORWARD: 'KeyW',\r\n MOVE_BACKWARD: 'KeyS',\r\n MOVE_UP: 'KeyZ',\r\n MOVE_DOWN: 'KeyX',\r\n ROTATE_LEFT: 'ArrowLeft',\r\n ROTATE_UP: 'ArrowUp',\r\n ROTATE_RIGHT: 'ArrowRight',\r\n ROTATE_DOWN: 'ArrowDown'\r\n };\r\n\r\n // Mouse buttons\r\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\r\n\r\n // Touch fingers\r\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\r\n\r\n // for reset\r\n this.target0 = this.target.clone();\r\n this.position0 = this.object.position.clone();\r\n this.zoom0 = this.object.zoom;\r\n\r\n // the target DOM element for key events\r\n this._domElementKeyEvents = null;\r\n\r\n //\r\n // public methods\r\n //\r\n\r\n this.getPolarAngle = function () {\r\n\r\n return spherical.phi;\r\n\r\n };\r\n\r\n this.getAzimuthalAngle = function () {\r\n\r\n return spherical.theta;\r\n\r\n };\r\n\r\n this.getDistance = function () {\r\n\r\n return this.object.position.distanceTo( this.target );\r\n\r\n };\r\n\r\n this.listenToKeyEvents = function ( domElement ) {\r\n\r\n domElement.addEventListener( 'keydown', onKeyDown );\r\n this._domElementKeyEvents = domElement;\r\n\r\n reverse = false;\r\n oldZ = 0\r\n\r\n };\r\n\r\n this.removeKeyEvents = function () {\r\n\r\n if ( scope._domElementKeyEvents !== null ) {\r\n\r\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\r\n\r\n }\r\n\r\n }\r\n\r\n this.saveState = function () {\r\n\r\n scope.target0.copy( scope.target );\r\n scope.position0.copy( scope.object.position );\r\n scope.zoom0 = scope.object.zoom;\r\n\r\n };\r\n\r\n this.reset = function () {\r\n\r\n scope.target.copy( scope.target0 );\r\n scope.object.position.copy( scope.position0 );\r\n scope.object.zoom = scope.zoom0;\r\n\r\n scope.object.updateProjectionMatrix();\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.update();\r\n\r\n state = STATE.NONE;\r\n\r\n };\r\n\r\n // this method is exposed, but perhaps it would be better if we can make it private...\r\n this.update = function () {\r\n\r\n const offset = new Vector3();\r\n\r\n // so camera.up is the orbit axis\r\n const quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\r\n const quatInverse = quat.clone().invert();\r\n\r\n const lastPosition = new Vector3();\r\n const lastQuaternion = new Quaternion();\r\n\r\n const twoPI = 2 * Math.PI;\r\n\r\n return function update() {\r\n\r\n const position = scope.object.position;\r\n\r\n offset.copy( position ).sub( scope.target );\r\n\r\n // rotate offset to \"y-axis-is-up\" space\r\n offset.applyQuaternion( quat );\r\n\r\n // angle from z-axis around y-axis\r\n spherical.setFromVector3( offset );\r\n\r\n if ( scope.autoRotate && state === STATE.NONE ) {\r\n\r\n rotateLeft( getAutoRotationAngle() );\r\n\r\n }\r\n\r\n if ( scope.enableDamping ) {\r\n\r\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\r\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\r\n\r\n } else {\r\n\r\n spherical.theta += sphericalDelta.theta;\r\n spherical.phi += sphericalDelta.phi;\r\n\r\n }\r\n\r\n // restrict theta to be between desired limits\r\n\r\n let min = scope.minAzimuthAngle;\r\n let max = scope.maxAzimuthAngle;\r\n\r\n if ( isFinite( min ) && isFinite( max ) ) {\r\n\r\n if ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\r\n\r\n if ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\r\n\r\n if ( min <= max ) {\r\n\r\n spherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\r\n\r\n } else {\r\n\r\n spherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\r\n Math.max( min, spherical.theta ) :\r\n Math.min( max, spherical.theta );\r\n\r\n }\r\n\r\n }\r\n\r\n // restrict phi to be between desired limits\r\n spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\r\n\r\n spherical.makeSafe();\r\n\r\n\r\n spherical.radius *= scale;\r\n\r\n // restrict radius to be between desired limits\r\n spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\r\n\r\n // move target to panned location\r\n\r\n if ( scope.enableDamping === true ) {\r\n\r\n scope.target.addScaledVector( panOffset, scope.dampingFactor );\r\n\r\n } else {\r\n\r\n scope.target.add( panOffset );\r\n\r\n }\r\n\r\n offset.setFromSpherical( spherical );\r\n\r\n // rotate offset back to \"camera-up-vector-is-up\" space\r\n offset.applyQuaternion( quatInverse );\r\n\r\n position.copy( scope.target ).add( offset );\r\n\r\n scope.object.lookAt( scope.target );\r\n\r\n if ( scope.enableDamping === true ) {\r\n\r\n sphericalDelta.theta *= ( 1 - scope.dampingFactor );\r\n sphericalDelta.phi *= ( 1 - scope.dampingFactor );\r\n\r\n panOffset.multiplyScalar( 1 - scope.dampingFactor );\r\n\r\n } else {\r\n\r\n sphericalDelta.set( 0, 0, 0 );\r\n\r\n panOffset.set( 0, 0, 0 );\r\n\r\n }\r\n\r\n scale = 1;\r\n\r\n // update condition is:\r\n // min(camera displacement, camera rotation in radians)^2 > EPS\r\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\r\n\r\n if ( zoomChanged ||\r\n lastPosition.distanceToSquared( scope.object.position ) > EPS ||\r\n 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n lastPosition.copy( scope.object.position );\r\n lastQuaternion.copy( scope.object.quaternion );\r\n zoomChanged = false;\r\n\r\n return true;\r\n\r\n }\r\n\r\n return false;\r\n\r\n };\r\n\r\n }();\r\n\r\n this.dispose = function () {\r\n\r\n scope.domElement.removeEventListener( 'contextmenu', onContextMenu );\r\n\r\n scope.domElement.removeEventListener( 'pointerdown', onPointerDown );\r\n scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );\r\n scope.domElement.removeEventListener( 'wheel', onMouseWheel );\r\n\r\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\r\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\r\n\r\n\r\n if ( scope._domElementKeyEvents !== null ) {\r\n\r\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\r\n\r\n }\r\n\r\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\r\n\r\n };\r\n\r\n //\r\n // internals\r\n //\r\n\r\n const scope = this;\r\n\r\n const STATE = {\r\n NONE: - 1,\r\n ROTATE: 0,\r\n DOLLY: 1,\r\n PAN: 2,\r\n TOUCH_ROTATE: 3,\r\n TOUCH_PAN: 4,\r\n TOUCH_DOLLY_PAN: 5,\r\n TOUCH_DOLLY_ROTATE: 6\r\n };\r\n\r\n let state = STATE.NONE;\r\n\r\n const EPS = 0.000001;\r\n\r\n // current position in spherical coordinates\r\n const spherical = new Spherical();\r\n const sphericalDelta = new Spherical();\r\n\r\n let scale = 1;\r\n const panOffset = new Vector3();\r\n let zoomChanged = false;\r\n\r\n const rotateStart = new Vector2();\r\n const rotateEnd = new Vector2();\r\n const rotateDelta = new Vector2();\r\n\r\n const panStart = new Vector2();\r\n const panEnd = new Vector2();\r\n const panDelta = new Vector2();\r\n\r\n const dollyStart = new Vector2();\r\n const dollyEnd = new Vector2();\r\n const dollyDelta = new Vector2();\r\n\r\n const pointers = [];\r\n const pointerPositions = {};\r\n\r\n // navigation\r\n let reverse = false;\r\n let oldZ = 0;\r\n\r\n function getAutoRotationAngle() {\r\n\r\n return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\r\n\r\n }\r\n\r\n function getZoomScale() {\r\n\r\n return Math.pow( 0.95, scope.zoomSpeed );\r\n\r\n }\r\n\r\n function rotateLeft( angle ) {\r\n\r\n sphericalDelta.theta -= angle;\r\n\r\n }\r\n\r\n function rotateUp( angle ) {\r\n\r\n sphericalDelta.phi -= angle;\r\n\r\n }\r\n\r\n const panLeft = function () {\r\n\r\n const v = new Vector3();\r\n\r\n return function panLeft( distance, objectMatrix ) {\r\n\r\n v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\r\n v.multiplyScalar( - distance );\r\n\r\n panOffset.add( v );\r\n\r\n };\r\n\r\n }();\r\n\r\n const panUp = function () {\r\n\r\n const v = new Vector3();\r\n\r\n return function panUp( distance, objectMatrix ) {\r\n\r\n if ( scope.screenSpacePanning === true ) {\r\n\r\n v.setFromMatrixColumn( objectMatrix, 1 );\r\n\r\n } else {\r\n\r\n v.setFromMatrixColumn( objectMatrix, 0 );\r\n v.crossVectors( scope.object.up, v );\r\n\r\n }\r\n\r\n v.multiplyScalar( distance );\r\n\r\n panOffset.add( v );\r\n\r\n };\r\n\r\n }();\r\n\r\n // deltaX and deltaY are in pixels; right and down are positive\r\n const pan = function () {\r\n\r\n const offset = new Vector3();\r\n\r\n return function pan( deltaX, deltaY ) {\r\n\r\n const element = scope.domElement;\r\n\r\n if ( scope.object.isPerspectiveCamera ) {\r\n\r\n // perspective\r\n const position = scope.object.position;\r\n offset.copy( position ).sub( scope.target );\r\n let targetDistance = offset.length();\r\n\r\n // half of the fov is center to top of screen\r\n targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\r\n\r\n // we use only clientHeight here so aspect ratio does not distort speed\r\n panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\r\n panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\r\n\r\n } else if ( scope.object.isOrthographicCamera ) {\r\n\r\n // orthographic\r\n panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\r\n panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\r\n\r\n } else {\r\n\r\n // camera neither orthographic nor perspective\r\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\r\n scope.enablePan = false;\r\n\r\n }\r\n\r\n };\r\n\r\n }();\r\n\r\n const moveUp = function() {\r\n\r\n const _vector = new Vector3();\r\n\r\n return function moveUp( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _vector.setFromMatrixColumn( camera.matrix, 1 );\r\n\r\n _vector.multiplyScalar( distance * 0.1 );\r\n\r\n camera.position.add(_vector)\r\n\r\n camera.position.z = Math.max(0, camera.position.z);\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n }();\r\n\r\n const moveForward = function() {\r\n\r\n const _vector = new Vector3();\r\n\r\n return function moveForward( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _vector.setFromMatrixColumn( camera.matrix, 0 );\r\n\r\n _vector.crossVectors( camera.up, _vector );\r\n\r\n _vector.multiplyScalar( distance * 0.1 );\r\n\r\n camera.position.add(_vector)\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n }();\r\n\r\n const moveRight = function() {\r\n\r\n const _vector = new Vector3();\r\n\r\n return function moveRight( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _vector.setFromMatrixColumn( camera.matrix, 0 );\r\n\r\n _vector.multiplyScalar( distance * 0.1 );\r\n\r\n camera.position.add( _vector );\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n }();\r\n\r\n const spinUp = function() {\r\n\r\n const _euler = new Euler( 0, 0, 0, 'ZXY' );\r\n\r\n return function spinUp( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _euler.setFromQuaternion( camera.quaternion );\r\n\r\n if ( Math.abs( Math.abs( _euler.z - oldZ ) - Math.PI ) < 0.01 ) {\r\n\r\n reverse = !reverse;\r\n\r\n }\r\n\r\n if ( reverse ) {\r\n\r\n _euler.x -= 0.01 * distance;\r\n\r\n } else {\r\n\r\n _euler.x += 0.01 * distance;\r\n\r\n }\r\n\r\n _euler.x = Math.max(0.1, _euler.x);\r\n\r\n oldZ = _euler.z;\r\n\r\n camera.quaternion.setFromEuler( _euler );\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n }();\r\n\r\n const spinRight = function() {\r\n\r\n const _euler = new Euler( 0, 0, 0, 'ZXY' );\r\n\r\n return function rotateRight( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _euler.setFromQuaternion( camera.quaternion );\r\n\r\n _euler.z -= 0.01 * distance;\r\n\r\n camera.quaternion.setFromEuler( _euler );\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n }();\r\n\r\n function dollyOut( dollyScale ) {\r\n\r\n if ( scope.object.isPerspectiveCamera ) {\r\n\r\n scale /= dollyScale;\r\n\r\n } else if ( scope.object.isOrthographicCamera ) {\r\n\r\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\r\n scope.object.updateProjectionMatrix();\r\n zoomChanged = true;\r\n\r\n } else {\r\n\r\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\r\n scope.enableZoom = false;\r\n\r\n }\r\n\r\n }\r\n\r\n function dollyIn( dollyScale ) {\r\n\r\n if ( scope.object.isPerspectiveCamera ) {\r\n\r\n scale *= dollyScale;\r\n\r\n } else if ( scope.object.isOrthographicCamera ) {\r\n\r\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\r\n scope.object.updateProjectionMatrix();\r\n zoomChanged = true;\r\n\r\n } else {\r\n\r\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\r\n scope.enableZoom = false;\r\n\r\n }\r\n\r\n }\r\n\r\n //\r\n // event callbacks - update the object state\r\n //\r\n\r\n function handleMouseDownRotate( event ) {\r\n\r\n rotateStart.set( event.clientX, event.clientY );\r\n\r\n }\r\n\r\n function handleMouseDownDolly( event ) {\r\n\r\n dollyStart.set( event.clientX, event.clientY );\r\n\r\n }\r\n\r\n function handleMouseDownPan( event ) {\r\n\r\n panStart.set( event.clientX, event.clientY );\r\n\r\n }\r\n\r\n function handleMouseMoveRotate( event ) {\r\n\r\n rotateEnd.set( event.clientX, event.clientY );\r\n\r\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\r\n\r\n const element = scope.domElement;\r\n\r\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\r\n\r\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\r\n\r\n rotateStart.copy( rotateEnd );\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n function handleMouseMoveDolly( event ) {\r\n\r\n dollyEnd.set( event.clientX, event.clientY );\r\n\r\n dollyDelta.subVectors( dollyEnd, dollyStart );\r\n\r\n if ( dollyDelta.y > 0 ) {\r\n\r\n dollyOut( getZoomScale() );\r\n\r\n } else if ( dollyDelta.y < 0 ) {\r\n\r\n dollyIn( getZoomScale() );\r\n\r\n }\r\n\r\n dollyStart.copy( dollyEnd );\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n function handleMouseMovePan( event ) {\r\n\r\n panEnd.set( event.clientX, event.clientY );\r\n\r\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\r\n\r\n pan( panDelta.x, panDelta.y );\r\n\r\n panStart.copy( panEnd );\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n function handleMouseWheel( event ) {\r\n\r\n if ( event.deltaY < 0 ) {\r\n\r\n dollyIn( getZoomScale() );\r\n\r\n } else if ( event.deltaY > 0 ) {\r\n\r\n dollyOut( getZoomScale() );\r\n\r\n }\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n function handleKeyDown( event ) {\r\n\r\n let needsUpdate = false;\r\n\r\n switch ( event.code ) {\r\n\r\n case scope.keys.MOVE_FORWARD:\r\n moveForward(scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_BACKWARD:\r\n moveForward(-scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_UP:\r\n moveUp(scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_DOWN:\r\n moveUp(-scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_RIGHT:\r\n moveRight(scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_LEFT:\r\n moveRight(-scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.ROTATE_UP:\r\n spinUp(scope.turnSpeed);\r\n break;\r\n\r\n case scope.keys.ROTATE_DOWN:\r\n spinUp(-scope.turnSpeed);\r\n break;\r\n\r\n case scope.keys.ROTATE_LEFT:\r\n spinRight( -scope.turnSpeed );\r\n break;\r\n\r\n case scope.keys.ROTATE_RIGHT:\r\n spinRight( scope.turnSpeed );\r\n break;\r\n\r\n }\r\n\r\n if ( needsUpdate ) {\r\n\r\n // prevent the browser from scrolling on cursor keys\r\n event.preventDefault();\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n function handleTouchStartRotate() {\r\n\r\n if ( pointers.length === 1 ) {\r\n\r\n rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\r\n\r\n } else {\r\n\r\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\r\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\r\n\r\n rotateStart.set( x, y );\r\n\r\n }\r\n\r\n }\r\n\r\n function handleTouchStartPan() {\r\n\r\n if ( pointers.length === 1 ) {\r\n\r\n panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\r\n\r\n } else {\r\n\r\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\r\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\r\n\r\n panStart.set( x, y );\r\n\r\n }\r\n\r\n }\r\n\r\n function handleTouchStartDolly() {\r\n\r\n const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;\r\n const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;\r\n\r\n const distance = Math.sqrt( dx * dx + dy * dy );\r\n\r\n dollyStart.set( 0, distance );\r\n\r\n }\r\n\r\n function handleTouchStartDollyPan() {\r\n\r\n if ( scope.enableZoom ) handleTouchStartDolly();\r\n\r\n if ( scope.enablePan ) handleTouchStartPan();\r\n\r\n }\r\n\r\n function handleTouchStartDollyRotate() {\r\n\r\n if ( scope.enableZoom ) handleTouchStartDolly();\r\n\r\n if ( scope.enableRotate ) handleTouchStartRotate();\r\n\r\n }\r\n\r\n function handleTouchMoveRotate( event ) {\r\n\r\n if ( pointers.length === 1 ) {\r\n\r\n rotateEnd.set( event.pageX, event.pageY );\r\n\r\n } else {\r\n\r\n const position = getSecondPointerPosition( event );\r\n\r\n const x = 0.5 * ( event.pageX + position.x );\r\n const y = 0.5 * ( event.pageY + position.y );\r\n\r\n rotateEnd.set( x, y );\r\n\r\n }\r\n\r\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\r\n\r\n const element = scope.domElement;\r\n\r\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\r\n\r\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\r\n\r\n rotateStart.copy( rotateEnd );\r\n\r\n }\r\n\r\n function handleTouchMovePan( event ) {\r\n\r\n if ( pointers.length === 1 ) {\r\n\r\n panEnd.set( event.pageX, event.pageY );\r\n\r\n } else {\r\n\r\n const position = getSecondPointerPosition( event );\r\n\r\n const x = 0.5 * ( event.pageX + position.x );\r\n const y = 0.5 * ( event.pageY + position.y );\r\n\r\n panEnd.set( x, y );\r\n\r\n }\r\n\r\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\r\n\r\n pan( panDelta.x, panDelta.y );\r\n\r\n panStart.copy( panEnd );\r\n\r\n }\r\n\r\n function handleTouchMoveDolly( event ) {\r\n\r\n const position = getSecondPointerPosition( event );\r\n\r\n const dx = event.pageX - position.x;\r\n const dy = event.pageY - position.y;\r\n\r\n const distance = Math.sqrt( dx * dx + dy * dy );\r\n\r\n dollyEnd.set( 0, distance );\r\n\r\n dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\r\n\r\n dollyOut( dollyDelta.y );\r\n\r\n dollyStart.copy( dollyEnd );\r\n\r\n }\r\n\r\n function handleTouchMoveDollyPan( event ) {\r\n\r\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\r\n\r\n if ( scope.enablePan ) handleTouchMovePan( event );\r\n\r\n }\r\n\r\n function handleTouchMoveDollyRotate( event ) {\r\n\r\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\r\n\r\n if ( scope.enableRotate ) handleTouchMoveRotate( event );\r\n\r\n }\r\n\r\n //\r\n // event handlers - FSM: listen for events and reset state\r\n //\r\n\r\n function onPointerDown( event ) {\r\n\r\n if ( scope.enabled === false ) return;\r\n\r\n if ( pointers.length === 0 ) {\r\n\r\n scope.domElement.setPointerCapture( event.pointerId );\r\n\r\n scope.domElement.addEventListener( 'pointermove', onPointerMove );\r\n scope.domElement.addEventListener( 'pointerup', onPointerUp );\r\n\r\n }\r\n\r\n //\r\n\r\n addPointer( event );\r\n\r\n if ( event.pointerType === 'touch' ) {\r\n\r\n onTouchStart( event );\r\n\r\n } else {\r\n\r\n onMouseDown( event );\r\n\r\n }\r\n\r\n }\r\n\r\n function onPointerMove( event ) {\r\n\r\n if ( scope.enabled === false ) return;\r\n\r\n if ( event.pointerType === 'touch' ) {\r\n\r\n onTouchMove( event );\r\n\r\n } else {\r\n\r\n onMouseMove( event );\r\n\r\n }\r\n\r\n }\r\n\r\n function onPointerUp( event ) {\r\n\r\n removePointer( event );\r\n\r\n if ( pointers.length === 0 ) {\r\n\r\n scope.domElement.releasePointerCapture( event.pointerId );\r\n\r\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\r\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\r\n\r\n }\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n function onPointerCancel( event ) {\r\n\r\n removePointer( event );\r\n\r\n }\r\n\r\n function onMouseDown( event ) {\r\n\r\n let mouseAction;\r\n\r\n switch ( event.button ) {\r\n\r\n case 0:\r\n\r\n mouseAction = scope.mouseButtons.LEFT;\r\n break;\r\n\r\n case 1:\r\n\r\n mouseAction = scope.mouseButtons.MIDDLE;\r\n break;\r\n\r\n case 2:\r\n\r\n mouseAction = scope.mouseButtons.RIGHT;\r\n break;\r\n\r\n default:\r\n\r\n mouseAction = - 1;\r\n\r\n }\r\n\r\n switch ( mouseAction ) {\r\n\r\n case MOUSE.DOLLY:\r\n\r\n if ( scope.enableZoom === false ) return;\r\n\r\n handleMouseDownDolly( event );\r\n\r\n state = STATE.DOLLY;\r\n\r\n break;\r\n\r\n case MOUSE.ROTATE:\r\n\r\n // XIE: Default to pan in 2D mode\r\n if(scope.object.isOrthographicCamera) {\r\n\r\n if (scope.enablePan === false) return;\r\n\r\n handleMouseDownPan(event);\r\n\r\n state = STATE.PAN;\r\n\r\n } else {\r\n\r\n if (event.ctrlKey || event.metaKey) {\r\n\r\n if (scope.enablePan === false) return;\r\n\r\n handleMouseDownPan(event);\r\n\r\n state = STATE.PAN;\r\n\r\n } else {\r\n\r\n if (scope.enableRotate === false) return;\r\n\r\n handleMouseDownRotate(event);\r\n\r\n state = STATE.ROTATE;\r\n\r\n }\r\n\r\n }\r\n\r\n break;\r\n\r\n case MOUSE.PAN:\r\n\r\n if ( event.ctrlKey || event.metaKey ) {\r\n\r\n if ( scope.enableRotate === false ) return;\r\n\r\n handleMouseDownRotate( event );\r\n\r\n state = STATE.ROTATE;\r\n\r\n } else {\r\n\r\n if ( scope.enablePan === false ) return;\r\n\r\n handleMouseDownPan( event );\r\n\r\n state = STATE.PAN;\r\n\r\n }\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n if ( state !== STATE.NONE ) {\r\n\r\n scope.dispatchEvent( _startEvent );\r\n\r\n }\r\n\r\n }\r\n\r\n function onMouseMove( event ) {\r\n\r\n if ( scope.enabled === false ) return;\r\n\r\n switch ( state ) {\r\n\r\n case STATE.ROTATE:\r\n\r\n if ( scope.enableRotate === false ) return;\r\n\r\n handleMouseMoveRotate( event );\r\n\r\n break;\r\n\r\n case STATE.DOLLY:\r\n\r\n if ( scope.enableZoom === false ) return;\r\n\r\n handleMouseMoveDolly( event );\r\n\r\n break;\r\n\r\n case STATE.PAN:\r\n\r\n if ( scope.enablePan === false ) return;\r\n\r\n handleMouseMovePan( event );\r\n\r\n break;\r\n\r\n }\r\n\r\n }\r\n\r\n function onMouseWheel( event ) {\r\n\r\n if ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\r\n\r\n event.preventDefault();\r\n\r\n scope.dispatchEvent( _startEvent );\r\n\r\n handleMouseWheel( event );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n function onKeyDown( event ) {\r\n\r\n if ( scope.enabled === false || scope.enablePan === false ) return;\r\n\r\n handleKeyDown( event );\r\n\r\n }\r\n\r\n function onTouchStart( event ) {\r\n\r\n trackPointer( event );\r\n\r\n switch ( pointers.length ) {\r\n\r\n case 1:\r\n\r\n switch ( scope.touches.ONE ) {\r\n\r\n case TOUCH.ROTATE:\r\n\r\n if ( scope.enableRotate === false ) return;\r\n\r\n handleTouchStartRotate();\r\n\r\n state = STATE.TOUCH_ROTATE;\r\n\r\n break;\r\n\r\n case TOUCH.PAN:\r\n\r\n if ( scope.enablePan === false ) return;\r\n\r\n handleTouchStartPan();\r\n\r\n state = STATE.TOUCH_PAN;\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n break;\r\n\r\n case 2:\r\n\r\n switch ( scope.touches.TWO ) {\r\n\r\n case TOUCH.DOLLY_PAN:\r\n\r\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\r\n\r\n handleTouchStartDollyPan();\r\n\r\n state = STATE.TOUCH_DOLLY_PAN;\r\n\r\n break;\r\n\r\n case TOUCH.DOLLY_ROTATE:\r\n\r\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\r\n\r\n handleTouchStartDollyRotate();\r\n\r\n state = STATE.TOUCH_DOLLY_ROTATE;\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n if ( state !== STATE.NONE ) {\r\n\r\n scope.dispatchEvent( _startEvent );\r\n\r\n }\r\n\r\n }\r\n\r\n function onTouchMove( event ) {\r\n\r\n trackPointer( event );\r\n\r\n switch ( state ) {\r\n\r\n case STATE.TOUCH_ROTATE:\r\n\r\n if ( scope.enableRotate === false ) return;\r\n\r\n handleTouchMoveRotate( event );\r\n\r\n scope.update();\r\n\r\n break;\r\n\r\n case STATE.TOUCH_PAN:\r\n\r\n if ( scope.enablePan === false ) return;\r\n\r\n handleTouchMovePan( event );\r\n\r\n scope.update();\r\n\r\n break;\r\n\r\n case STATE.TOUCH_DOLLY_PAN:\r\n\r\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\r\n\r\n handleTouchMoveDollyPan( event );\r\n\r\n scope.update();\r\n\r\n break;\r\n\r\n case STATE.TOUCH_DOLLY_ROTATE:\r\n\r\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\r\n\r\n handleTouchMoveDollyRotate( event );\r\n\r\n scope.update();\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n }\r\n\r\n function onContextMenu( event ) {\r\n\r\n if ( scope.enabled === false ) return;\r\n\r\n event.preventDefault();\r\n\r\n }\r\n\r\n function addPointer( event ) {\r\n\r\n pointers.push( event );\r\n\r\n }\r\n\r\n function removePointer( event ) {\r\n\r\n delete pointerPositions[ event.pointerId ];\r\n\r\n for ( let i = 0; i < pointers.length; i ++ ) {\r\n\r\n if ( pointers[ i ].pointerId === event.pointerId ) {\r\n\r\n pointers.splice( i, 1 );\r\n return;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function trackPointer( event ) {\r\n\r\n let position = pointerPositions[ event.pointerId ];\r\n\r\n if ( position === undefined ) {\r\n\r\n position = new Vector2();\r\n pointerPositions[ event.pointerId ] = position;\r\n\r\n }\r\n\r\n position.set( event.pageX, event.pageY );\r\n\r\n }\r\n\r\n function getSecondPointerPosition( event ) {\r\n\r\n const pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ];\r\n\r\n return pointerPositions[ pointer.pointerId ];\r\n\r\n }\r\n\r\n //\r\n\r\n scope.domElement.addEventListener( 'contextmenu', onContextMenu );\r\n\r\n scope.domElement.addEventListener( 'pointerdown', onPointerDown );\r\n scope.domElement.addEventListener( 'pointercancel', onPointerCancel );\r\n scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );\r\n\r\n // force an update at start\r\n\r\n this.update();\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n// This set of controls performs orbiting, dollying (zooming), and panning.\r\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n// This is very similar to OrbitControls, another set of touch behavior\r\n//\r\n// Orbit - right mouse, or left mouse + ctrl/meta / touch: two-finger rotate\r\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\r\n// Pan - left mouse, or arrow keys / touch: one-finger move\r\n\r\nclass MapControls extends MyOrbitControls {\r\n\r\n constructor( object, domElement ) {\r\n\r\n super( object, domElement );\r\n\r\n this.screenSpacePanning = false; // pan orthogonal to world-space direction camera.up\r\n\r\n this.mouseButtons.LEFT = MOUSE.PAN;\r\n this.mouseButtons.RIGHT = MOUSE.ROTATE;\r\n\r\n this.touches.ONE = TOUCH.PAN;\r\n this.touches.TWO = TOUCH.DOLLY_ROTATE;\r\n\r\n }\r\n\r\n}\r\n\r\nexport { MyOrbitControls, MapControls };\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport {BufferGeometry, Float32BufferAttribute, Vector3} from \"three\";\n\nclass ParabolicCylinderGeometry extends BufferGeometry {\n\n constructor( semiLatusRectum = 1, width = 2, length = 3, widthSegments = 8, lengthSegments = 1) {\n\n super();\n this.type = 'ParabolicCylinderGeometry';\n\n this.parameters = {\n semilatusRectum: semiLatusRectum,\n width: width,\n height: length,\n widthSegments: widthSegments,\n lengthSegments: lengthSegments,\n };\n\n const scope = this;\n widthSegments = Math.floor( widthSegments );\n lengthSegments = Math.floor( lengthSegments );\n\n // buffers\n const indices = [];\n const vertices = [];\n const normals = [];\n const uvs = [];\n\n // helper variables\n let index = 0;\n const indexArray = [];\n const halfHeight = length / 2;\n let groupStart = 0;\n\n // generate geometry\n generateTorso();\n\n // build geometry\n this.setIndex( indices );\n this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n function generateTorso() {\n\n const normal = new Vector3();\n const vertex = new Vector3();\n let groupCount = 0;\n const u0 = -0.5;\n const du = 1 / widthSegments;\n const max = width/semiLatusRectum;\n\n // generate vertices, normals and uvs\n // the parametric equation of a parabola y = x^2/(4a) is x = 2at, y = at^2, where 2a is the semi-latus rectum\n for ( let y = 0; y <= lengthSegments; y ++ ) {\n const indexRow = [];\n const v = y / lengthSegments;\n // current row\n for ( let x = 0; x <= widthSegments; x ++ ) {\n const u = u0 + x * du;\n const t = u * max;\n // vertex\n vertex.x = semiLatusRectum * t;\n vertex.y = - v * length + halfHeight;\n vertex.z = semiLatusRectum * t * t / 2;\n vertices.push( vertex.x, vertex.y, vertex.z );\n\n // normal vector: (-dy/du, dx/du), tangential vector: (dx/du, dy/du)\n normal.set( -semiLatusRectum * t, 0, semiLatusRectum ).normalize();\n normals.push( normal.x, normal.y, normal.z );\n\n // uv (make sure that u and v are within 0 and 1)\n uvs.push( u - u0, 1 - v );\n\n // save index of vertex in respective row\n indexRow.push( index ++ );\n }\n\n // now save vertices of the row in our index array\n indexArray.push( indexRow );\n\n }\n\n // generate indices\n for ( let x = 0; x < widthSegments; x ++ ) {\n for ( let y = 0; y < lengthSegments; y ++ ) {\n // we use the index array to access the correct indices\n const a = indexArray[ y ][ x ];\n const b = indexArray[ y + 1 ][ x ];\n const c = indexArray[ y + 1 ][ x + 1 ];\n const d = indexArray[ y ][ x + 1 ];\n // faces\n indices.push( a, b, d );\n indices.push( b, c, d );\n // update group counter\n groupCount += 6;\n }\n }\n\n // add a group to the geometry. this will ensure multi material support\n scope.addGroup( groupStart, groupCount, 0 );\n\n // calculate new start value for groups\n groupStart += groupCount;\n\n }\n\n }\n\n static fromJSON( data ) {\n return new ParabolicCylinderGeometry( data.semiLatusRectum, data.width, data.height, data.widthSegments, data.lengthSegments );\n }\n\n}\n\nexport { ParabolicCylinderGeometry };\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport {BufferGeometry, Float32BufferAttribute, Vector3} from \"three\";\n\n// paraboloid of revolution: z = (x^2 + y^2) / a, where a is the latus rectum (twice of the semi-latus rectum)\n\nclass ParaboloidGeometry extends BufferGeometry {\n\n constructor( semiLatusRectum = 1, rimRadius = 1, radialSegments = 16, depthSegments = 4) {\n\n super();\n this.type = 'ParaboloidGeometry';\n\n this.parameters = {\n semilatusRectum: semiLatusRectum,\n rimRadius: rimRadius,\n radialSegments: radialSegments,\n depthSegments: depthSegments\n };\n\n radialSegments = Math.max( 3, Math.floor( radialSegments ) );\n depthSegments = Math.max( 2, Math.floor( depthSegments ) );\n\n let index = 0;\n const grid = [];\n\n const vertex = new Vector3();\n const normal = new Vector3();\n const tangent1 = new Vector3();\n const tangent2 = new Vector3();\n\n // buffers\n\n const indices = [];\n const vertices = [];\n const normals = [];\n const uvs = [];\n\n const TWO_PI = Math.PI * 2;\n const maxY = rimRadius / semiLatusRectum;\n const dy = 1 / depthSegments;\n let cos, sin;\n\n // generate vertices, normals and uvs\n\n for ( let iy = 0; iy <= depthSegments; iy ++ ) {\n\n const verticesRow = [];\n\n const v = iy * dy;\n const t = v * maxY;\n\n // special case for the bottom\n // let uOffset = 0;\n // if ( iy === 0) {\n // uOffset = 0.5 / radialSegments;\n // }\n\n for ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n const u = ix / radialSegments;\n cos = Math.cos( u * TWO_PI );\n sin = Math.sin( u * TWO_PI );\n\n // vertex\n vertex.x = semiLatusRectum * cos * t;\n vertex.y = semiLatusRectum * sin * t;\n vertex.z = semiLatusRectum * t * t / 2;\n vertices.push( vertex.x, vertex.y, vertex.z );\n\n // tangential vectors\n tangent1.set(semiLatusRectum * sin, -semiLatusRectum * cos, semiLatusRectum * t).normalize();\n tangent2.set(cos, sin, 0);\n\n // normal vector\n normal.crossVectors(tangent1, tangent2);\n normals.push( normal.x, normal.y, normal.z );\n\n // uv\n uvs.push( 0.5 * v * cos + 0.5, 0.5 * v * sin + 0.5 );\n\n verticesRow.push( index ++ );\n\n }\n\n grid.push( verticesRow );\n\n }\n\n // indices\n for ( let iy = 0; iy < depthSegments; iy ++ ) {\n for ( let ix = 0; ix < radialSegments; ix ++ ) {\n const a = grid[ iy ][ ix + 1 ];\n const b = grid[ iy ][ ix ];\n const c = grid[ iy + 1 ][ ix ];\n const d = grid[ iy + 1 ][ ix + 1 ];\n if ( iy !== 0) indices.push( a, b, d );\n if ( iy !== depthSegments - 1) {\n indices.push( b, c, d );\n } else if ( iy === depthSegments - 1) {\n indices.push( a, b, c);\n indices.push( a, c, d );\n }\n }\n }\n\n // build geometry\n this.setIndex( indices );\n this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n }\n\n static fromJSON( data ) {\n return new ParaboloidGeometry(data.semiLatusRectum, data.rimRadius, data.radialSegments, data.depthSegments);\n }\n\n}\n\nexport { ParaboloidGeometry };\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport * as THREE from 'three';\nimport { Euler } from 'three';\nimport { ConvexHull } from 'three/examples/jsm/math/ConvexHull.js';\n\nclass ConvexGeometry extends THREE.BufferGeometry {\n constructor(points, angle, length) {\n super();\n\n const vertices = [];\n const normals = [];\n const uvs = [];\n const euler = new Euler(0, 0, angle);\n\n const convexHull = new ConvexHull().setFromPoints(points);\n\n const faces = convexHull.faces;\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i];\n let edge = face.edge;\n do {\n const point = edge.head().point;\n vertices.push(point.x, point.y, point.z);\n normals.push(face.normal.x, face.normal.y, face.normal.z);\n\n const p = point.clone().applyEuler(euler);\n\n const l2 = Math.sqrt(length * length + p.z * p.z);\n const y = p.y * l2 / length;\n uvs.push(p.x, y);\n\n edge = edge.next;\n } while (edge !== face.edge);\n }\n\n this.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n this.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));\n this.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));\n }\n}\n\nexport { ConvexGeometry };\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport { ElementModel } from './ElementModel';\nimport { WallTexture } from 'src/types';\n\nexport interface WallModel extends ElementModel {\n // using ly as wall thickness\n relativeAngle: number;\n leftPoint: number[];\n rightPoint: number[];\n leftJoints: string[];\n rightJoints: string[];\n textureType: WallTexture;\n\n roofId?: string | null;\n leftRoofHeight?: number;\n rightRoofHeight?: number;\n centerRoofHeight?: number[]; // [x, h];\n centerLeftRoofHeight?: number[]; // [x, h];\n centerRightRoofHeight?: number[]; // [x, h];\n\n wallStructure?: WallStructure;\n structureSpacing?: number;\n structureWidth?: number;\n structureColor?: string;\n\n opacity?: number;\n rValue: number;\n volumetricHeatCapacity: number;\n\n fill: WallFill;\n leftUnfilledHeight: number;\n rightUnfilledHeight: number;\n leftTopPartialHeight: number;\n rightTopPartialHeight: number;\n\n // When a wall is not full (partial or empty), is it open to the outside?\n // If so, this would result in a lot of heat exchange. By default, it is not.\n openToOutside?: boolean;\n\n eavesLength: number;\n\n parapet: ParapetArgs;\n\n // old property\n unfilledHeight?: number;\n}\n\nexport interface ParapetArgs {\n display: boolean;\n color: string;\n textureType: WallTexture;\n parapetHeight: number;\n copingsWidth: number;\n copingsHeight: number;\n}\n\nexport enum WallFill {\n Full = 'Full',\n Partial = 'Partial',\n Empty = 'Empty',\n}\n\nexport enum WallStructure {\n Default = 'Default',\n Stud = 'Stud',\n Pillar = 'Pillar',\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Color, Euler, Vector2, Vector3 } from 'three';\n\nexport const VERSION = '1.4.3';\n\nexport const isProd = process.env.NODE_ENV === 'production';\n\nexport const HOME_URL: string = isProd\n ? 'https://institute-for-future-intelligence.github.io/aladdin/'\n : 'http://localhost:3000/aladdin';\n\nexport const DEFAULT_ADDRESS = 'Natick, MA';\nexport const PRESET_COLORS = ['#627682', '#8884d8', '#f97356', '#1bc32c', '#c6502d', '#82ca9d', '#3eaec0', '#445111'];\n\nexport const Z_INDEX_FRONT_PANEL = 15;\n\nexport const UNDO_SHOW_INFO_DURATION = 0.5;\nexport const FLOATING_WINDOW_OPACITY = 0.8;\nexport const BLUE = new Color(0, 0, 1);\nexport const GREEN = new Color(0, 1, 0);\nexport const YELLOW = new Color(1, 1, 0);\nexport const RED = new Color(1, 0, 0);\nexport const SOLAR_HEATMAP_COLORS = [BLUE, GREEN, YELLOW, RED];\nexport const DEFAULT_HEAT_FLUX_SCALE_FACTOR = 20;\nexport const DEFAULT_HEAT_FLUX_COLOR = 'gray';\nexport const DEFAULT_HEAT_FLUX_WIDTH = 0.5;\nexport const DEFAULT_HEAT_FLUX_DENSITY_FACTOR = 4;\n\nexport const DEFAULT_GROUND_FLOOR_R_VALUE = 2;\nexport const DEFAULT_WALL_R_VALUE = 2;\nexport const DEFAULT_ROOF_R_VALUE = 2;\nexport const DEFAULT_CEILING_R_VALUE = 2;\nexport const DEFAULT_WINDOW_U_VALUE = 2;\nexport const DEFAULT_DOOR_U_VALUE = 1;\nexport const DEFAULT_FOUNDATION_SLAB_DEPTH = 1;\n\nexport const DEFAULT_SOLAR_PANEL_SHININESS = 100;\nexport const DEFAULT_WINDOW_SHININESS = 200;\nexport const SOLAR_PANEL_BLUE_SPECULAR = '#3BB9FF';\nexport const SOLAR_PANEL_BLACK_SPECULAR = '#36454F';\n\nexport const DEFAULT_MODEL_MAP_ZOOM = 10;\nexport const LAT_LNG_FRACTION_DIGITS = 4;\n\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nexport const DEFAULT_LEAF_OUT_DAY = 105;\nexport const DEFAULT_LEAF_OFF_DAY = 320;\n\nexport const DEFAULT_SKY_RADIUS = 5000;\nexport const DEFAULT_FOV = 45;\nexport const DEFAULT_FAR = 10_000;\nexport const STARLIGHT_INTENSITY = 0.1;\n\nexport const MOVE_HANDLE_RADIUS = 0.1;\nexport const RESIZE_HANDLE_SIZE = 0.16;\n\nexport const MOVE_HANDLE_COLOR_1 = 'orange';\nexport const MOVE_HANDLE_COLOR_2 = 'orchid';\nexport const MOVE_HANDLE_COLOR_3 = 'pink';\nexport const RESIZE_HANDLE_COLOR = 'white';\nexport const HIGHLIGHT_HANDLE_COLOR = 'red';\nexport const LOCKED_ELEMENT_SELECTION_COLOR = 'yellow';\n\nexport const GRID_RATIO = 5;\nexport const FINE_GRID_SCALE = 0.1;\nexport const NORMAL_GRID_SCALE = GRID_RATIO * FINE_GRID_SCALE;\n\n// solar panel texture\nexport const RESOLUTION = 250;\nexport const MARGIN_PERCENT = 0.01;\nexport const GAP_PERCENT = 0.005;\nexport const SOLAR_PANEL_CELL_COLOR_BLACK = '#000';\nexport const SOLAR_PANEL_CELL_COLOR_BLUE = '#01345B';\n\nexport const INVALID_ELEMENT_COLOR = '#fe6f5e';\n\nexport const GROUND_ID = 'Ground';\n\nexport const HALF_PI = Math.PI / 2;\n\nexport const TWO_PI = Math.PI * 2;\n\nexport const ZERO_TOLERANCE = 0.0001;\n\nexport const UNIT_VECTOR_POS_Z_ARRAY = [0, 0, 1];\n\nexport const UNIT_VECTOR_NEG_Y_ARRAY = [0, -1, 0];\n\nexport const UNIT_VECTOR_POS_X = new Vector3(1, 0, 0);\n\nexport const UNIT_VECTOR_NEG_X = new Vector3(-1, 0, 0);\n\nexport const UNIT_VECTOR_POS_Y = new Vector3(0, 1, 0);\n\nexport const UNIT_VECTOR_NEG_Y = new Vector3(0, -1, 0);\n\nexport const UNIT_VECTOR_POS_Z = new Vector3(0, 0, 1);\n\nexport const UNIT_VECTOR_NEG_Z = new Vector3(0, 0, -1);\n\nexport const ORIGIN_VECTOR2 = new Vector2(0, 0);\n\nexport const ORIGIN_VECTOR3 = new Vector3(0, 0, 0);\n\nexport const PARABOLIC_DISH_STRUCTURE_CENTRAL_POLE = 1;\n\nexport const PARABOLIC_DISH_STRUCTURE_TRIPOD = 2;\n\nexport const HALF_PI_Z_EULER = new Euler(0, 0, HALF_PI);\n\nexport const REGEX_ALLOWABLE_IN_NAME = /^[A-Za-z0-9\\s-_()!?%&,]*$/;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nexport class Rectangle {\n x: number;\n y: number;\n width: number;\n height: number;\n\n constructor(x: number, y: number, width: number, height: number) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n centerX(): number {\n return this.x + this.width / 2;\n }\n\n centerY(): number {\n return this.y + this.height / 2;\n }\n\n minX(): number {\n return this.x;\n }\n\n maxX(): number {\n return this.x + this.width;\n }\n\n minY(): number {\n return this.y;\n }\n\n maxY(): number {\n return this.y + this.height;\n }\n\n contains(x: number, y: number): boolean {\n return x > this.x && x < this.x + this.width && y > this.y && y < this.y + this.height;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { RoofTexture } from 'src/types';\nimport { ElementModel } from './ElementModel';\n\nexport interface RoofModel extends ElementModel {\n wallsId: string[];\n roofType: RoofType;\n roofStructure?: RoofStructure;\n textureType: RoofTexture;\n thickness: number;\n sideColor?: string;\n rafterSpacing?: number;\n rafterWidth?: number;\n rafterColor?: string;\n glassTint?: string;\n opacity?: number;\n rValue: number;\n volumetricHeatCapacity: number;\n rise: number;\n ceiling: boolean;\n ceilingRValue?: number;\n // old files\n overhang?: number;\n}\n\nexport interface PyramidRoofModel extends RoofModel {}\nexport interface GableRoofModel extends RoofModel {\n ridgeLeftPoint: number[];\n ridgeRightPoint: number[];\n}\nexport interface HipRoofModel extends RoofModel {\n rightRidgeLength: number;\n leftRidgeLength: number;\n}\n\nexport interface GambrelRoofModel extends RoofModel {\n // [x, h] from left side view\n topRidgePoint: number[];\n frontRidgePoint: number[]; // x >= 0\n backRidgePoint: number[]; // x <= 0\n // old files\n topRidgeLeftPoint?: number[];\n topRidgeRightPoint?: number[];\n frontRidgeLeftPoint?: number[];\n frontRidgeRightPoint?: number[];\n backRidgeLeftPoint?: number[];\n backRidgeRightPoint?: number[];\n}\n\nexport interface MansardRoofModel extends RoofModel {\n ridgeWidth: number;\n // old files\n frontRidge?: number;\n backRidge?: number;\n}\n\nexport interface Point3 {\n x: number;\n y: number;\n z: number;\n}\n\nexport enum RoofType {\n Pyramid = 'Pyramid',\n Gable = 'Gable',\n Hip = 'Hip',\n Gambrel = 'Gambrel',\n Mansard = 'Mansard',\n}\n\nexport enum RoofStructure {\n Default = 'Default',\n Rafter = 'Rafter',\n Glass = 'Glass',\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { ObjectType } from 'src/types';\nimport { ElementModel } from './ElementModel';\n\nexport interface WindowModel extends ElementModel {\n // solar heat gain coefficient (https://en.wikipedia.org/wiki/Solar_gain) = 1 - opacity\n opacity: number;\n tint: string;\n uValue: number;\n setback?: number;\n\n shutter: ShutterProps | undefined; // backward compatibility\n leftShutter: boolean;\n rightShutter: boolean;\n shutterColor: string;\n shutterWidth: number;\n\n mullion: boolean;\n horizontalMullion: boolean;\n verticalMullion: boolean;\n mullionSpacing: number;\n horizontalMullionSpacing: number;\n verticalMullionSpacing: number;\n mullionWidth: number;\n mullionColor: string;\n\n // frameColor is using color\n frame: boolean;\n frameWidth: number;\n sillWidth: number;\n\n windowType: WindowType;\n archHeight: number;\n\n parentType?: ObjectType.Wall | ObjectType.Roof;\n\n // polygonal window top vertex position [x, h], x is relative to center(from -0.5 to 0.5), h is absolute\n polygonTop?: number[];\n\n // if empty, it is a hole on its parent (roof or window)\n empty?: boolean;\n\n // Is this window inside a building? If yes, this will be no heat exchange. By default, it is not.\n interior?: boolean;\n}\n\n// backward compatibility\nexport interface ShutterProps {\n showLeft: boolean;\n showRight: boolean;\n color: string;\n width: number;\n}\n\nexport enum WindowType {\n Default = 'Default',\n Arched = 'Arched',\n Circular = 'Circular',\n Polygonal = 'Polygonal',\n}\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { RefObject } from 'react';\r\nimport { MyOrbitControls } from 'src/js/MyOrbitControls';\r\nimport { Group } from 'three';\r\nimport create from 'zustand';\r\nimport { useStore } from './common';\r\n\r\nexport interface RefStoreState {\r\n setEnableOrbitController: (b: boolean) => void;\r\n selectNone: () => void;\r\n contentRef: RefObject | null;\r\n compassRef: React.MutableRefObject | null;\r\n orbitControlsRef: RefObject | null;\r\n humanRef: RefObject | null;\r\n treeRef: RefObject | null;\r\n flowerRef: RefObject | null;\r\n foundationRef: RefObject | null;\r\n cuboidRef: RefObject | null;\r\n listenToAutoDeletionByDeleteRef: React.MutableRefObject | null;\r\n listenToAutoDeletionByCutRef: React.MutableRefObject | null;\r\n setListenToAutoDeletionByDelete: (b: boolean) => void;\r\n setListenToAutoDeletionByCut: (b: boolean) => void;\r\n}\r\n\r\nexport const useRefStore = create((set, get) => {\r\n return {\r\n setEnableOrbitController: (b: boolean) => {\r\n if (useStore.getState().viewState.navigationView) {\r\n return;\r\n }\r\n set((state) => {\r\n if (state.orbitControlsRef?.current) {\r\n state.orbitControlsRef.current.enabled = b;\r\n }\r\n });\r\n },\r\n selectNone: () => {\r\n set((state) => {\r\n state.humanRef = null;\r\n state.treeRef = null;\r\n state.foundationRef = null;\r\n });\r\n },\r\n contentRef: null,\r\n compassRef: null,\r\n orbitControlsRef: null,\r\n humanRef: null,\r\n treeRef: null,\r\n flowerRef: null,\r\n foundationRef: null,\r\n cuboidRef: null,\r\n listenToAutoDeletionByCutRef: null,\r\n listenToAutoDeletionByDeleteRef: null,\r\n setListenToAutoDeletionByCut: (b: boolean) => {\r\n const listenToAutoDeletionByCutRef = get().listenToAutoDeletionByCutRef;\r\n if (listenToAutoDeletionByCutRef) {\r\n listenToAutoDeletionByCutRef.current = b;\r\n }\r\n },\r\n setListenToAutoDeletionByDelete: (b: boolean) => {\r\n const listenToAutoDeletionByDeleteRef = get().listenToAutoDeletionByDeleteRef;\r\n if (listenToAutoDeletionByDeleteRef) {\r\n listenToAutoDeletionByDeleteRef.current = b;\r\n }\r\n },\r\n };\r\n});\r\n","export default __webpack_public_path__ + \"static/media/jaah.640ec7e4.png\";","export default __webpack_public_path__ + \"static/media/jack.fc5a1084.png\";","export default __webpack_public_path__ + \"static/media/jacob.f94b08ea.png\";","export default __webpack_public_path__ + \"static/media/jacqueline.90e4de66.png\";","export default __webpack_public_path__ + \"static/media/jade.7796c8cb.png\";","export default __webpack_public_path__ + \"static/media/jamelia.c18980a7.png\";","export default __webpack_public_path__ + \"static/media/james.bfd0036f.png\";","export default __webpack_public_path__ + \"static/media/jane.70c22fdf.png\";","export default __webpack_public_path__ + \"static/media/jaya.8e2e76b3.png\";","export default __webpack_public_path__ + \"static/media/jaye.b4a735cc.png\";","export default __webpack_public_path__ + \"static/media/jeanette.3152b17d.png\";","export default __webpack_public_path__ + \"static/media/jedi.c8e9053b.png\";","export default __webpack_public_path__ + \"static/media/jeff.fa34a949.png\";","export default __webpack_public_path__ + \"static/media/jena.330f8f74.png\";","export default __webpack_public_path__ + \"static/media/jennifer.db10d3b3.png\";","export default __webpack_public_path__ + \"static/media/jess.1b71461e.png\";","export default __webpack_public_path__ + \"static/media/jett.f742e41c.png\";","export default __webpack_public_path__ + \"static/media/jill.969e03db.png\";","export default __webpack_public_path__ + \"static/media/jiya.e86fd321.png\";","export default __webpack_public_path__ + \"static/media/joan.0eb4e36d.png\";","export default __webpack_public_path__ + \"static/media/jocelyn.cc2d66a0.png\";","export default __webpack_public_path__ + \"static/media/joel.979c7679.png\";","export default __webpack_public_path__ + \"static/media/joey.929d0c2b.png\";","export default __webpack_public_path__ + \"static/media/john.940131e1.png\";","export default __webpack_public_path__ + \"static/media/jonathon.4b1921a2.png\";","export default __webpack_public_path__ + \"static/media/jose.65247d55.png\";","export default __webpack_public_path__ + \"static/media/joseph.516ed377.png\";","export default __webpack_public_path__ + \"static/media/joshua.716b0462.png\";","export default __webpack_public_path__ + \"static/media/judd.b6a25f04.png\";","export default __webpack_public_path__ + \"static/media/judy.f092e7c8.png\";","export default __webpack_public_path__ + \"static/media/julia.42ea554a.png\";","export default __webpack_public_path__ + \"static/media/julio.8bb18e89.png\";","export default __webpack_public_path__ + \"static/media/jumapili.26e47d67.png\";","export default __webpack_public_path__ + \"static/media/june.827a5c6e.png\";","export default __webpack_public_path__ + \"static/media/juro.c5460006.png\";","export default __webpack_public_path__ + \"static/media/justin.490b3c19.png\";","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport JaahImage from './resources/jaah.png';\nimport JackImage from './resources/jack.png';\nimport JacobImage from './resources/jacob.png';\nimport JacquelineImage from './resources/jacqueline.png';\nimport JadeImage from './resources/jade.png';\nimport JameliaImage from './resources/jamelia.png';\nimport JamesImage from './resources/james.png';\nimport JaneImage from './resources/jane.png';\nimport JayaImage from './resources/jaya.png';\nimport JayeImage from './resources/jaye.png';\nimport JeanetteImage from './resources/jeanette.png';\nimport JediImage from './resources/jedi.png';\nimport JeffImage from './resources/jeff.png';\nimport JenaImage from './resources/jena.png';\nimport JenniferImage from './resources/jennifer.png';\nimport JessImage from './resources/jess.png';\nimport JettImage from './resources/jett.png';\nimport JillImage from './resources/jill.png';\nimport JiyaImage from './resources/jiya.png';\nimport JoanImage from './resources/joan.png';\nimport JocelynImage from './resources/jocelyn.png';\nimport JoelImage from './resources/joel.png';\nimport JoeyImage from './resources/joey.png';\nimport JohnImage from './resources/john.png';\nimport JonathonImage from './resources/jonathon.png';\nimport JoseImage from './resources/jose.png';\nimport JosephImage from './resources/joseph.png';\nimport JoshuaImage from './resources/joshua.png';\nimport JuddImage from './resources/judd.png';\nimport JudyImage from './resources/judy.png';\nimport JuliaImage from './resources/julia.png';\nimport JulioImage from './resources/julio.png';\nimport JumapiliImage from './resources/jumapili.png';\nimport JuneImage from './resources/june.png';\nimport JuroImage from './resources/juro.png';\nimport JustinImage from './resources/justin.png';\n\nimport { Gender, HumanName } from './types';\nimport i18n from './i18n/i18n';\n\nexport class HumanData {\n static fetchGender(name: string): Gender {\n switch (name) {\n case HumanName.Jaah:\n return Gender.Male;\n case HumanName.Jacqueline:\n return Gender.Female;\n case HumanName.Jade:\n return Gender.Female;\n case HumanName.Jamelia:\n return Gender.Female;\n case HumanName.James:\n return Gender.Male;\n case HumanName.Jane:\n return Gender.Female;\n case HumanName.Jaya:\n return Gender.Female;\n case HumanName.Jaye:\n return Gender.Male;\n case HumanName.Jeanette:\n return Gender.Female;\n case HumanName.Jedi:\n return Gender.Male;\n case HumanName.Jeff:\n return Gender.Male;\n case HumanName.Jena:\n return Gender.Female;\n case HumanName.Jennifer:\n return Gender.Female;\n case HumanName.Jess:\n return Gender.Female;\n case HumanName.Jett:\n return Gender.Male;\n case HumanName.Jill:\n return Gender.Female;\n case HumanName.Jiya:\n return Gender.Female;\n case HumanName.Joan:\n return Gender.Female;\n case HumanName.Jocelyn:\n return Gender.Female;\n case HumanName.Joel:\n return Gender.Male;\n case HumanName.Joey:\n return Gender.Female;\n case HumanName.John:\n return Gender.Male;\n case HumanName.Jonathon:\n return Gender.Male;\n case HumanName.Jose:\n return Gender.Male;\n case HumanName.Joseph:\n return Gender.Male;\n case HumanName.Joshua:\n return Gender.Male;\n case HumanName.Judd:\n return Gender.Male;\n case HumanName.Judy:\n return Gender.Female;\n case HumanName.Julia:\n return Gender.Female;\n case HumanName.Julio:\n return Gender.Male;\n case HumanName.Jumapili:\n return Gender.Female;\n case HumanName.June:\n return Gender.Female;\n case HumanName.Juro:\n return Gender.Male;\n case HumanName.Justin:\n return Gender.Male;\n default:\n return Gender.Male;\n }\n }\n\n static fetchLabel(name: string, lang: {}): string {\n switch (name) {\n case HumanName.Jaah:\n return i18n.t('people.Jaah', lang);\n case HumanName.Jacob:\n return i18n.t('people.Jacob', lang);\n case HumanName.Jacqueline:\n return i18n.t('people.Jacqueline', lang);\n case HumanName.Jade:\n return i18n.t('people.Jade', lang);\n case HumanName.Jamelia:\n return i18n.t('people.Jamelia', lang);\n case HumanName.James:\n return i18n.t('people.James', lang);\n case HumanName.Jane:\n return i18n.t('people.Jane', lang);\n case HumanName.Jaya:\n return i18n.t('people.Jaya', lang);\n case HumanName.Jaye:\n return i18n.t('people.Jaye', lang);\n case HumanName.Jeanette:\n return i18n.t('people.Jeanette', lang);\n case HumanName.Jedi:\n return i18n.t('people.Jedi', lang);\n case HumanName.Jeff:\n return i18n.t('people.Jeff', lang);\n case HumanName.Jena:\n return i18n.t('people.Jena', lang);\n case HumanName.Jennifer:\n return i18n.t('people.Jennifer', lang);\n case HumanName.Jess:\n return i18n.t('people.Jess', lang);\n case HumanName.Jett:\n return i18n.t('people.Jett', lang);\n case HumanName.Jill:\n return i18n.t('people.Jill', lang);\n case HumanName.Jiya:\n return i18n.t('people.Jiya', lang);\n case HumanName.Joan:\n return i18n.t('people.Joan', lang);\n case HumanName.Jocelyn:\n return i18n.t('people.Jocelyn', lang);\n case HumanName.Joel:\n return i18n.t('people.Joel', lang);\n case HumanName.Joey:\n return i18n.t('people.Joey', lang);\n case HumanName.John:\n return i18n.t('people.John', lang);\n case HumanName.Jonathon:\n return i18n.t('people.Jonathon', lang);\n case HumanName.Jose:\n return i18n.t('people.Jose', lang);\n case HumanName.Joseph:\n return i18n.t('people.Joseph', lang);\n case HumanName.Joshua:\n return i18n.t('people.Joshua', lang);\n case HumanName.Judd:\n return i18n.t('people.Judd', lang);\n case HumanName.Judy:\n return i18n.t('people.Judy', lang);\n case HumanName.Julia:\n return i18n.t('people.Julia', lang);\n case HumanName.Julio:\n return i18n.t('people.Julio', lang);\n case HumanName.Jumapili:\n return i18n.t('people.Jumapili', lang);\n case HumanName.June:\n return i18n.t('people.June', lang);\n case HumanName.Juro:\n return i18n.t('people.Juro', lang);\n case HumanName.Justin:\n return i18n.t('people.Justin', lang);\n default:\n return i18n.t('people.Jack', lang);\n }\n }\n\n static fetchHatOffsetY(name: string): number {\n switch (name) {\n case HumanName.Jonathon:\n return -0.22;\n }\n return 0;\n }\n\n static fetchHatOffsetX(name: string): number {\n switch (name) {\n case HumanName.Jaah:\n return -0.05;\n case HumanName.Jack:\n return -0.05;\n case HumanName.Jacob:\n return 0.09;\n case HumanName.Jade:\n return -0.04;\n case HumanName.Jaya:\n return 0.04;\n case HumanName.Jaye:\n return 0;\n case HumanName.Jamelia:\n return 0.05;\n case HumanName.Jane:\n return 0.02;\n case HumanName.Jeanette:\n return 0.08;\n case HumanName.Jedi:\n return -0.02;\n case HumanName.Jeff:\n return -0.05;\n case HumanName.Jena:\n return 0.05;\n case HumanName.Jennifer:\n return 0.02;\n case HumanName.Jess:\n return 0.01;\n case HumanName.Jett:\n return -0.04;\n case HumanName.Jill:\n return -0.03;\n case HumanName.Jiya:\n return -0.03;\n case HumanName.Joan:\n return -0.45;\n case HumanName.Jocelyn:\n return -0.01;\n case HumanName.Joel:\n return -0.48;\n case HumanName.Joey:\n return 0.01;\n case HumanName.John:\n return 0.01;\n case HumanName.Jonathon:\n return 0.02;\n case HumanName.Jose:\n return 0.05;\n case HumanName.Joseph:\n return 0.05;\n case HumanName.Joshua:\n return -0.01;\n case HumanName.Judy:\n return 0.02;\n case HumanName.Julia:\n return -0.02;\n case HumanName.Jumapili:\n return -0.04;\n case HumanName.June:\n return -0.1;\n case HumanName.Juro:\n return -0.08;\n case HumanName.Justin:\n return -0.06;\n default:\n return 0;\n }\n }\n\n static fetchHeight(name: string): number {\n switch (name) {\n case HumanName.Jaah:\n return 1.78;\n case HumanName.Jack:\n return 1.8;\n case HumanName.Jacob:\n return 1.82;\n case HumanName.Jacqueline:\n return 1.78;\n case HumanName.Jade:\n return 1.6;\n case HumanName.James:\n return 1.75;\n case HumanName.Jane:\n return 1.67;\n case HumanName.Jaya:\n return 1.55;\n case HumanName.Jaye:\n return 1.65;\n case HumanName.Jamelia:\n return 1.8;\n case HumanName.Jeanette:\n return 1.62;\n case HumanName.Jedi:\n return 1.75;\n case HumanName.Jeff:\n return 1.65;\n case HumanName.Jena:\n return 1.6;\n case HumanName.Jennifer:\n return 1.7;\n case HumanName.Jess:\n return 1.5;\n case HumanName.Jett:\n return 1.85;\n case HumanName.Jill:\n return 1.71;\n case HumanName.Jiya:\n return 1.74;\n case HumanName.Joan:\n return 1.68;\n case HumanName.Jocelyn:\n return 1.72;\n case HumanName.Joel:\n return 1.75;\n case HumanName.Joey:\n return 1.72;\n case HumanName.John:\n return 1.85;\n case HumanName.Jonathon:\n return 1.9;\n case HumanName.Jose:\n return 1.6;\n case HumanName.Joseph:\n return 1.88;\n case HumanName.Joshua:\n return 1.79;\n case HumanName.Judd:\n return 1.68;\n case HumanName.Judy:\n return 1.75;\n case HumanName.Julia:\n return 1.71;\n case HumanName.Julio:\n return 1.76;\n case HumanName.Jumapili:\n return 1.65;\n case HumanName.June:\n return 1.85;\n case HumanName.Juro:\n return 1.72;\n case HumanName.Justin:\n return 1.755;\n default:\n return 1.8;\n }\n }\n\n static fetchWidth(name: string): number {\n switch (name) {\n case HumanName.Jaah:\n return 0.74;\n case HumanName.Jack:\n return 0.42;\n case HumanName.Jacqueline:\n return 0.43;\n case HumanName.Jacob:\n return 0.8;\n case HumanName.Jade:\n return 0.48;\n case HumanName.James:\n return 0.472;\n case HumanName.Jane:\n return 0.4;\n case HumanName.Jaya:\n return 0.6;\n case HumanName.Jaye:\n return 0.55;\n case HumanName.Jamelia:\n return 0.65;\n case HumanName.Jeanette:\n return 0.4;\n case HumanName.Jedi:\n return 0.56;\n case HumanName.Jena:\n return 0.695;\n case HumanName.Jennifer:\n return 0.45;\n case HumanName.Jess:\n return 0.43;\n case HumanName.Jill:\n return 0.42;\n case HumanName.Joan:\n return 1.7;\n case HumanName.Jocelyn:\n return 0.4;\n case HumanName.Joel:\n return 1.8;\n case HumanName.Joey:\n return 0.462;\n case HumanName.John:\n return 0.6;\n case HumanName.Jonathon:\n return 0.6;\n case HumanName.Jose:\n return 2;\n case HumanName.Joseph:\n return 0.6;\n case HumanName.Joshua:\n return 0.5;\n case HumanName.Judd:\n return 0.544;\n case HumanName.Judy:\n return 0.41;\n case HumanName.Julia:\n return 0.43;\n case HumanName.Julio:\n return 0.5;\n case HumanName.Jumapili:\n return 0.75;\n case HumanName.June:\n return 0.65;\n case HumanName.Juro:\n return 0.494;\n case HumanName.Justin:\n return 0.6;\n default:\n return 0.6;\n }\n }\n\n static fetchTextureImage(name: string) {\n let textureImg;\n switch (name) {\n case HumanName.Jaah:\n textureImg = JaahImage;\n break;\n case HumanName.Jacob:\n textureImg = JacobImage;\n break;\n case HumanName.Jacqueline:\n textureImg = JacquelineImage;\n break;\n case HumanName.Jade:\n textureImg = JadeImage;\n break;\n case HumanName.Jamelia:\n textureImg = JameliaImage;\n break;\n case HumanName.James:\n textureImg = JamesImage;\n break;\n case HumanName.Jane:\n textureImg = JaneImage;\n break;\n case HumanName.Jaya:\n textureImg = JayaImage;\n break;\n case HumanName.Jaye:\n textureImg = JayeImage;\n break;\n case HumanName.Jeanette:\n textureImg = JeanetteImage;\n break;\n case HumanName.Jedi:\n textureImg = JediImage;\n break;\n case HumanName.Jeff:\n textureImg = JeffImage;\n break;\n case HumanName.Jena:\n textureImg = JenaImage;\n break;\n case HumanName.Jennifer:\n textureImg = JenniferImage;\n break;\n case HumanName.Jess:\n textureImg = JessImage;\n break;\n case HumanName.Jett:\n textureImg = JettImage;\n break;\n case HumanName.Jill:\n textureImg = JillImage;\n break;\n case HumanName.Jiya:\n textureImg = JiyaImage;\n break;\n case HumanName.Joan:\n textureImg = JoanImage;\n break;\n case HumanName.Jocelyn:\n textureImg = JocelynImage;\n break;\n case HumanName.Joel:\n textureImg = JoelImage;\n break;\n case HumanName.Joey:\n textureImg = JoeyImage;\n break;\n case HumanName.John:\n textureImg = JohnImage;\n break;\n case HumanName.Jonathon:\n textureImg = JonathonImage;\n break;\n case HumanName.Jose:\n textureImg = JoseImage;\n break;\n case HumanName.Joseph:\n textureImg = JosephImage;\n break;\n case HumanName.Joshua:\n textureImg = JoshuaImage;\n break;\n case HumanName.Judd:\n textureImg = JuddImage;\n break;\n case HumanName.Judy:\n textureImg = JudyImage;\n break;\n case HumanName.Julia:\n textureImg = JuliaImage;\n break;\n case HumanName.Julio:\n textureImg = JulioImage;\n break;\n case HumanName.Jumapili:\n textureImg = JumapiliImage;\n break;\n case HumanName.June:\n textureImg = JuneImage;\n break;\n case HumanName.Juro:\n textureImg = JuroImage;\n break;\n case HumanName.Justin:\n textureImg = JustinImage;\n break;\n default:\n textureImg = JackImage;\n }\n return textureImg;\n }\n}\n","export default __webpack_public_path__ + \"static/media/no_leaf_shrub.7b01fa4a.png\";","export default __webpack_public_path__ + \"static/media/bellflower.de03e9de.png\";","export default __webpack_public_path__ + \"static/media/boxwood.4de70ffb.png\";","export default __webpack_public_path__ + \"static/media/cactus_combo_1.21a73758.png\";","export default __webpack_public_path__ + \"static/media/cactus_combo_2.8b5298f8.png\";","export default __webpack_public_path__ + \"static/media/cactus_combo_3.2627c12d.png\";","export default __webpack_public_path__ + \"static/media/cactus_combo_4.731b15b4.png\";","export default __webpack_public_path__ + \"static/media/hibiscus.771d3166.png\";","export default __webpack_public_path__ + \"static/media/hydrangea.9367eebd.png\";","export default __webpack_public_path__ + \"static/media/hosta.744059f3.png\";","export default __webpack_public_path__ + \"static/media/peony.f379953c.png\";","export default __webpack_public_path__ + \"static/media/red_rose.6fbd03bc.png\";","export default __webpack_public_path__ + \"static/media/spirea.f1823a2e.png\";","export default __webpack_public_path__ + \"static/media/sunflower.2bfc3ca1.png\";","export default __webpack_public_path__ + \"static/media/tall_bush.5b2dde31.png\";","export default __webpack_public_path__ + \"static/media/tulip.595dc3b9.png\";","export default __webpack_public_path__ + \"static/media/white_flower.7c33e894.png\";","export default __webpack_public_path__ + \"static/media/yellow_flower.3da8cdb9.png\";","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport NoLeafFlowerImage from './resources/no_leaf_flower.png';\nimport NoLeafShrubImage from './resources/no_leaf_shrub.png';\nimport BellflowerImage from './resources/bellflower.png';\nimport BoxwoodImage from './resources/boxwood.png';\nimport CactusCombo1Image from './resources/cactus_combo_1.png';\nimport CactusCombo2Image from './resources/cactus_combo_2.png';\nimport CactusCombo3Image from './resources/cactus_combo_3.png';\nimport CactusCombo4Image from './resources/cactus_combo_4.png';\nimport HibiscusImage from './resources/hibiscus.png';\nimport HydrangeaImage from './resources/hydrangea.png';\nimport HostaImage from './resources/hosta.png';\nimport PeonyImage from './resources/peony.png';\nimport RedRoseImage from './resources/red_rose.png';\nimport SpireaImage from './resources/spirea.png';\nimport SunflowerImage from './resources/sunflower.png';\nimport TallBushImage from './resources/tall_bush.png';\nimport TulipImage from './resources/tulip.png';\nimport WhiteFlowerImage from './resources/white_flower.png';\nimport YellowFlowerImage from './resources/yellow_flower.png';\nimport { FlowerType } from './types';\nimport i18n from './i18n/i18n';\n\nexport class FlowerData {\n static fetchSpread(name: string): number {\n switch (name) {\n case FlowerType.Bellflower:\n return 0.45;\n case FlowerType.Boxwood:\n return 1.6;\n case FlowerType.CactusCombo1:\n return 1;\n case FlowerType.CactusCombo2:\n return 1;\n case FlowerType.CactusCombo3:\n return 1;\n case FlowerType.CactusCombo4:\n return 1;\n case FlowerType.Hosta:\n return 1;\n case FlowerType.Hibiscus:\n return 2;\n case FlowerType.Hydrangea:\n return 2;\n case FlowerType.Peony:\n return 1.5;\n case FlowerType.RedRose:\n return 0.5;\n case FlowerType.Spirea:\n return 1.8;\n case FlowerType.Sunflower:\n return 1;\n case FlowerType.TallBush:\n return 1;\n case FlowerType.Tulip:\n return 0.4;\n case FlowerType.YellowFlower:\n return 2;\n default:\n return 0.8;\n }\n }\n\n static fetchHeight(name: string): number {\n switch (name) {\n case FlowerType.Bellflower:\n return 0.4;\n case FlowerType.Boxwood:\n return 1.44;\n case FlowerType.CactusCombo1:\n return 1.18;\n case FlowerType.CactusCombo2:\n return 1.35;\n case FlowerType.CactusCombo3:\n return 1.24;\n case FlowerType.CactusCombo4:\n return 1.35;\n case FlowerType.Hosta:\n return 0.7;\n case FlowerType.Hibiscus:\n return 1.7;\n case FlowerType.Hydrangea:\n return 1.5;\n case FlowerType.Peony:\n return 1;\n case FlowerType.RedRose:\n return 0.8;\n case FlowerType.Spirea:\n return 1.6;\n case FlowerType.Sunflower:\n return 2;\n case FlowerType.TallBush:\n return 2;\n case FlowerType.Tulip:\n return 0.7;\n case FlowerType.YellowFlower:\n return 1.4;\n default:\n return 0.5;\n }\n }\n\n static fetchLabel(name: string, lang: {}): string {\n switch (name) {\n case FlowerType.Bellflower:\n return i18n.t('flower.Bellflower', lang);\n case FlowerType.Boxwood:\n return i18n.t('flower.Boxwood', lang);\n case FlowerType.CactusCombo1:\n return i18n.t('flower.CactusCombo1', lang);\n case FlowerType.CactusCombo2:\n return i18n.t('flower.CactusCombo2', lang);\n case FlowerType.CactusCombo3:\n return i18n.t('flower.CactusCombo3', lang);\n case FlowerType.CactusCombo4:\n return i18n.t('flower.CactusCombo4', lang);\n case FlowerType.Hibiscus:\n return i18n.t('flower.Hibiscus', lang);\n case FlowerType.Hydrangea:\n return i18n.t('flower.Hydrangea', lang);\n case FlowerType.Hosta:\n return i18n.t('flower.Hosta', lang);\n case FlowerType.Peony:\n return i18n.t('flower.Peony', lang);\n case FlowerType.RedRose:\n return i18n.t('flower.RedRose', lang);\n case FlowerType.Spirea:\n return i18n.t('flower.Spirea', lang);\n case FlowerType.Sunflower:\n return i18n.t('flower.Sunflower', lang);\n case FlowerType.TallBush:\n return i18n.t('flower.TallBush', lang);\n case FlowerType.Tulip:\n return i18n.t('flower.Tulip', lang);\n case FlowerType.YellowFlower:\n return i18n.t('flower.YellowFlower', lang);\n default:\n return i18n.t('flower.WhiteFlower', lang);\n }\n }\n\n static fetchTextureImage(name: string, noLeaves: boolean) {\n if (noLeaves) {\n if (\n name === FlowerType.Hibiscus ||\n name === FlowerType.Hydrangea ||\n name === FlowerType.YellowFlower ||\n name === FlowerType.Spirea\n ) {\n return NoLeafShrubImage;\n }\n if (name === FlowerType.Boxwood) {\n return BoxwoodImage;\n }\n if (name === FlowerType.TallBush) {\n return TallBushImage;\n }\n if (name === FlowerType.CactusCombo1) {\n return CactusCombo1Image;\n }\n if (name === FlowerType.CactusCombo2) {\n return CactusCombo2Image;\n }\n if (name === FlowerType.CactusCombo3) {\n return CactusCombo3Image;\n }\n if (name === FlowerType.CactusCombo4) {\n return CactusCombo4Image;\n }\n return NoLeafFlowerImage;\n }\n let textureImg;\n switch (name) {\n case FlowerType.Bellflower:\n textureImg = BellflowerImage;\n break;\n case FlowerType.Boxwood:\n textureImg = BoxwoodImage;\n break;\n case FlowerType.CactusCombo1:\n textureImg = CactusCombo1Image;\n break;\n case FlowerType.CactusCombo2:\n textureImg = CactusCombo2Image;\n break;\n case FlowerType.CactusCombo3:\n textureImg = CactusCombo3Image;\n break;\n case FlowerType.CactusCombo4:\n textureImg = CactusCombo4Image;\n break;\n case FlowerType.Hibiscus:\n textureImg = HibiscusImage;\n break;\n case FlowerType.Hydrangea:\n textureImg = HydrangeaImage;\n break;\n case FlowerType.Hosta:\n textureImg = HostaImage;\n break;\n case FlowerType.Peony:\n textureImg = PeonyImage;\n break;\n case FlowerType.RedRose:\n textureImg = RedRoseImage;\n break;\n case FlowerType.Spirea:\n textureImg = SpireaImage;\n break;\n case FlowerType.Sunflower:\n textureImg = SunflowerImage;\n break;\n case FlowerType.TallBush:\n textureImg = TallBushImage;\n break;\n case FlowerType.Tulip:\n textureImg = TulipImage;\n break;\n case FlowerType.YellowFlower:\n textureImg = YellowFlowerImage;\n break;\n default:\n textureImg = WhiteFlowerImage;\n }\n return textureImg;\n }\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAAHQCAYAAADZHROTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goJEQgA7kxGWwAAB2BJREFUeJzt3DGrZHcdx+HfX7a0SJFiiwUDJrhNIOkstlCImCJFQBshL8AXEFBIFdLEal+EvgALxTZgQIvABtIEohAwRYqUW1gsnBTzQSyWMPfeuTkzu88Dl9vNfKf58L/nnLlr27YBYOYHew8AOBeCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIHf2HsDzZa11Z2YezMxPZ+bHM3P3/37uzcxXM/P1zHzT73/PzMcz889t2/67x2aeH2vbtr038Ixba700M2/OzC9n5o2Z+eE1XubxHML415n5y7ZtX55oHvyPIHJr1lovz8x7M/POnPavkScz86eZ+cO2bZ+f8HV5zgkiJ7fWuj8zv5vTh/Bp/jwz72/b9uktvw/PAUHkpNZav5+ZD+b7vT79ZGY+nEMYn3yP78szRhA5ibXW3Zn54xyuEe7l45n5zbZtX+24gQvmsRtubK31s5l5NPvGcOZw9/qztdZbO+/gQjkhciNrrQcz87e53p3j2/JkZn6xbdtHew/hsggi19bNk7/PzIt7b3mKxzPz823bPtl7CJdDELmWrhk+msMD1efq6zlE0aM5HEUQuZa11j/m8G2Tc/f5zLzq7jPHcFOFK1tr/XYuI4YzM/dn5t29R3AZnBC5krXWizPzxcy8sPeWK3g8h1Pil3sP4bw5IXJVD+eyYjhzuAP+cO8RnD8nRI621ro3M//Ze8cNvO4rfnwXJ0Su4td7D7ihX+09gPPmhMjR1lqPZua1vXfcwL+2bXtl7xGcLydEjtK/8rrkGM7MvLzWuvTPwC0SRI719t4DTuTNvQdwvgSRY/1o7wEn8pO9B3C+BJFjvbT3gBO5t/cAzpcgcqxnJSTPyufgFnwLGlmHQ3j8ZX8AAAAASUVORK5CYII=\"","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport {\n CuboidTexture,\n DoorTexture,\n FlowerType,\n FoundationTexture,\n HumanName,\n ObjectType,\n Orientation,\n ParabolicDishStructureType,\n RoofTexture,\n TrackerType,\n TreeType,\n WallTexture,\n} from '../types';\nimport short from 'short-uuid';\nimport { Vector3 } from 'three';\nimport { ElementModel } from './ElementModel';\nimport { HumanModel } from './HumanModel';\nimport { TreeModel } from './TreeModel';\nimport { FlowerModel } from './FlowerModel';\nimport { SensorModel } from './SensorModel';\nimport { CuboidModel } from './CuboidModel';\nimport { FoundationModel } from './FoundationModel';\nimport { SolarPanelModel } from './SolarPanelModel';\nimport { PvModel } from './PvModel';\nimport { WallFill, WallModel, WallStructure } from './WallModel';\nimport {\n GableRoofModel,\n GambrelRoofModel,\n HipRoofModel,\n MansardRoofModel,\n PyramidRoofModel,\n RoofModel,\n RoofStructure,\n RoofType,\n} from './RoofModel';\nimport { GROUND_ID } from '../constants';\nimport { WindowModel } from './WindowModel';\nimport { Point2 } from './Point2';\nimport { PolygonModel } from './PolygonModel';\nimport { Util } from '../Util';\nimport { HumanData } from '../HumanData';\nimport { ParabolicTroughModel } from './ParabolicTroughModel';\nimport { ParabolicDishModel } from './ParabolicDishModel';\nimport { FresnelReflectorModel } from './FresnelReflectorModel';\nimport { HeliostatModel } from './HeliostatModel';\nimport { DoorModel } from './DoorModel';\nimport { WindTurbineModel } from './WindTurbineModel';\nimport { FlowerData } from '../FlowerData';\nimport { LightModel } from './LightModel';\nimport { HvacSystem } from './HvacSystem';\nimport { useStore } from 'src/stores/common';\nimport { RoofUtil } from '../views/roof/RoofUtil';\n\nexport class ElementModelFactory {\n static makeHuman(name: HumanName, parentId: string, x: number, y: number, z?: number) {\n return {\n type: ObjectType.Human,\n name: name ?? HumanName.Jack,\n cx: x,\n cy: y,\n cz: z,\n lx: HumanData.fetchWidth(name ?? HumanName.Jack),\n lz: HumanData.fetchHeight(name ?? HumanName.Jack),\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parentId,\n id: short.generate() as string,\n } as HumanModel;\n }\n\n static makeTree(type: TreeType, spread: number, height: number, parentId: string, x: number, y: number, z?: number) {\n return {\n type: ObjectType.Tree,\n name: type ?? TreeType.Dogwood,\n cx: x,\n cy: y,\n cz: z,\n lx: spread ?? 3,\n lz: height ?? 4,\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parentId,\n id: short.generate() as string,\n } as TreeModel;\n }\n\n static makeSolarPanel(\n parent: ElementModel,\n pvModel: PvModel,\n x: number,\n y: number,\n z?: number,\n orientation?: Orientation,\n poleHeight?: number,\n poleSpacing?: number,\n tiltAngle?: number,\n relativeAzimuth?: number,\n normal?: Vector3,\n rotation?: number[],\n frameColor?: string,\n lx?: number,\n ly?: number,\n parentType?: ObjectType,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n parentType = ObjectType.Foundation;\n break;\n case ObjectType.Cuboid:\n foundationId = parent.id;\n parentType = ObjectType.Cuboid;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.SolarPanel,\n pvModelName: pvModel.name,\n trackerType: TrackerType.NO_TRACKER,\n relativeAzimuth: relativeAzimuth ?? 0,\n tiltAngle: tiltAngle ?? 0,\n orientation: orientation ?? Orientation.landscape,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 1,\n poleRadius: 0.05,\n poleSpacing: poleSpacing ?? 3,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? (orientation === Orientation.landscape ? pvModel.length : pvModel.width),\n ly: ly ?? (orientation === Orientation.landscape ? pvModel.width : pvModel.length),\n lz: pvModel.thickness,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n color: '#fff',\n frameColor: frameColor ?? 'white',\n parentType: parentType,\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as SolarPanelModel;\n }\n\n static makeFlower(name: FlowerType, parentId: string, x: number, y: number, z?: number) {\n return {\n type: ObjectType.Flower,\n name: name ?? FlowerType.YellowFlower,\n cx: x,\n cy: y,\n cz: z,\n lx: FlowerData.fetchSpread(name ?? FlowerType.YellowFlower),\n lz: FlowerData.fetchHeight(name ?? FlowerType.YellowFlower),\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parentId,\n id: short.generate() as string,\n } as FlowerModel;\n }\n\n static makeCuboid(x: number, y: number, height: number, faceColors: string[], faceTextures: CuboidTexture[]) {\n return {\n type: ObjectType.Cuboid,\n cx: x,\n cy: y,\n cz: height ? height / 2 : 2,\n lx: 0.1,\n ly: 0.1,\n lz: height ?? 4,\n color: '#808080',\n faceColors: faceColors ?? ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'],\n textureTypes: faceTextures ?? [\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n ],\n stackable: useStore.getState().actionState.cuboidStackable,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: GROUND_ID,\n selected: false,\n id: short.generate() as string,\n } as CuboidModel;\n }\n\n static makeFoundation(x: number, y: number, height: number, color: string, texture: FoundationTexture) {\n return {\n type: ObjectType.Foundation,\n cx: x,\n cy: y,\n cz: height ? height / 2 : 0.05,\n lx: 0,\n ly: 0,\n lz: height ?? 0.1,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: GROUND_ID,\n selected: false,\n color: color ?? '#808080',\n textureType: texture ?? FoundationTexture.NoTexture,\n solarUpdraftTower: {},\n solarAbsorberPipe: {},\n solarPowerTower: {},\n hvacSystem: { thermostatSetpoint: 20 } as HvacSystem,\n id: short.generate() as string,\n } as FoundationModel;\n }\n\n static makeParabolicTrough(\n parent: ElementModel,\n reflectance: number,\n absorptance: number,\n opticalEfficiency: number,\n thermalEfficiency: number,\n latusRectum: number,\n poleHeight: number,\n moduleLength: number,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n lx?: number,\n ly?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.ParabolicTrough,\n reflectance: reflectance ?? 0.9,\n absorptance: absorptance ?? 0.95,\n opticalEfficiency: opticalEfficiency ?? 0.7,\n thermalEfficiency: thermalEfficiency ?? 0.3,\n moduleLength: moduleLength ?? 3,\n latusRectum: latusRectum ?? 2,\n relativeAzimuth: 0,\n tiltAngle: 0,\n absorberTubeRadius: 0.05,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width\n poleRadius: 0.05,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? 2,\n ly: ly ?? 9, // north-south alignment by default\n lz: 0.1,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as ParabolicTroughModel;\n }\n\n static makeParabolicDish(\n parent: ElementModel,\n reflectance: number,\n absorptance: number,\n opticalEfficiency: number,\n thermalEfficiency: number,\n latusRectum: number,\n poleHeight: number,\n receiverStructure: ParabolicDishStructureType,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n lx?: number,\n ly?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.ParabolicDish,\n reflectance: reflectance ?? 0.9,\n absorptance: absorptance ?? 0.95,\n opticalEfficiency: opticalEfficiency ?? 0.7,\n thermalEfficiency: thermalEfficiency ?? 0.3,\n moduleLength: 3,\n latusRectum: latusRectum ?? 8,\n relativeAzimuth: 0,\n tiltAngle: 0,\n structureType: receiverStructure ?? ParabolicDishStructureType.CentralPole,\n receiverRadius: 0.25,\n receiverPoleRadius: 0.1,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to the radius (half of lx or ly)\n poleRadius: 0.2,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? 4, // diameter of the rim\n ly: ly ?? 4, // diameter of the rim (identical to lx)\n lz: 0.1,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as ParabolicDishModel;\n }\n\n static makeFresnelReflector(\n parent: ElementModel,\n receiverId: string,\n reflectance: number,\n poleHeight: number,\n moduleLength: number,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n lx?: number,\n ly?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.FresnelReflector,\n receiverId: receiverId ?? 'None',\n reflectance: reflectance ?? 0.9,\n moduleLength: moduleLength ?? 3,\n relativeAzimuth: 0,\n tiltAngle: 0,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width\n poleRadius: 0.05,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? 2,\n ly: ly ?? 9, // north-south alignment by default\n lz: 0.1,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as FresnelReflectorModel;\n }\n\n static makeHeliostat(\n parent: ElementModel,\n towerId: string,\n reflectance: number,\n poleHeight: number,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n lx?: number,\n ly?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.Heliostat,\n towerId: towerId ?? 'None',\n reflectance: reflectance ?? 0.9,\n relativeAzimuth: 0,\n tiltAngle: 0,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width or height, whichever is larger\n poleRadius: 0.1,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? 2,\n ly: ly ?? 4,\n lz: 0.1,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as HeliostatModel;\n }\n\n static makeWindTurbine(parentId: string, x: number, y: number, z?: number) {\n return {\n type: ObjectType.WindTurbine,\n bladeRadius: 10,\n towerRadius: 0.5,\n towerHeight: 20,\n cx: x,\n cy: y,\n cz: z,\n lx: 3,\n lz: 15,\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parentId,\n id: short.generate() as string,\n } as WindTurbineModel;\n }\n\n static makePolygon(\n parent: ElementModel,\n x: number,\n y: number,\n z: number,\n normal?: Vector3,\n rotation?: number[],\n parentType?: ObjectType,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n const hx = 0.2;\n const hy = 0.2;\n const hz = 0.2;\n let rx = x;\n let ry = y;\n // if the parent is a cuboid, determine the 2D coordinates within each face\n if (parent.type === ObjectType.Cuboid && normal) {\n if (Util.isUnitVectorX(normal)) {\n // west and east face\n rx = z;\n } else if (Util.isUnitVectorY(normal)) {\n // south and north face\n ry = z;\n }\n } else if (parent.type === ObjectType.Wall) {\n ry = z;\n }\n return {\n type: ObjectType.Polygon,\n cx: rx,\n cy: ry,\n cz: 0,\n lx: 2 * hx,\n ly: 2 * hy,\n lz: 2 * hz,\n color: '#ffffff',\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n vertices: [\n { x: Math.max(-0.5, rx - hx), y: Math.max(-0.5, ry - hy) } as Point2,\n { x: Math.max(-0.5, rx - hx), y: Math.min(0.5, ry + hy) } as Point2,\n { x: Math.min(0.5, rx + hx), y: Math.min(0.5, ry + hy) } as Point2,\n { x: Math.min(0.5, rx + hx), y: Math.max(-0.5, ry - hy) } as Point2,\n ],\n parentId: parent.id,\n parentType: parentType,\n foundationId: foundationId,\n selected: false,\n filled: true,\n selectedIndex: -1,\n id: short.generate() as string,\n } as PolygonModel;\n }\n\n static makeWall(parent: ElementModel, x: number, y: number, z?: number, normal?: Vector3) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Wall,\n cx: x,\n cy: y,\n cz: z,\n lx: 0,\n ly: actionState.wallThickness ?? 0.3,\n lz: actionState.wallHeight ?? 5,\n parapet: actionState.wallParapet,\n eavesLength: actionState.wallEavesLength ?? 0.3,\n rValue: actionState.wallRValue ?? 3,\n fill: WallFill.Full,\n leftUnfilledHeight: 0.5,\n rightUnfilledHeight: 0.5,\n leftTopPartialHeight: actionState.wallHeight - 0.5,\n rightTopPartialHeight: actionState.wallHeight - 0.5,\n relativeAngle: 0,\n leftPoint: [],\n rightPoint: [],\n leftJoints: [],\n rightJoints: [],\n textureType: actionState.wallTexture ?? WallTexture.Default,\n color: actionState.wallColor ?? '#ffffff',\n volumetricHeatCapacity: actionState.wallVolumetricHeatCapacity ?? 0.5,\n wallStructure: actionState.wallStructure ?? WallStructure.Default,\n studSpacing: actionState.wallStructureSpacing ?? 2,\n studWidth: actionState.wallStructureWidth ?? 0.1,\n studColor: actionState.wallStructureColor ?? '#ffffff',\n opacity: actionState.wallOpacity !== undefined ? actionState.wallOpacity : 0.5,\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n windows: [],\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n } as WallModel;\n }\n\n static makeSensor(parent: ElementModel, x: number, y: number, z?: number, normal?: Vector3, rotation?: number[]) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Sensor,\n cx: x,\n cy: y,\n cz: z,\n lx: 0.1,\n ly: 0.1,\n lz: 0.01,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n parentType: parent.type,\n id: short.generate() as string,\n } as SensorModel;\n }\n\n static makeLight(\n parent: ElementModel,\n decay: number,\n distance: number,\n intensity: number,\n color: string,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Light,\n decay: decay ?? 2,\n distance: distance ?? 5,\n intensity: intensity ?? 3,\n color: color ?? '#ffff99',\n cx: x,\n cy: y,\n cz: z,\n lx: 0.16,\n ly: 0.16,\n lz: 0.08,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n parentType: parent.type,\n id: short.generate() as string,\n } as LightModel;\n }\n\n static makeWindow(\n parent: ElementModel,\n cx: number,\n cy: number,\n cz: number,\n parentType: ObjectType,\n rotation?: number[],\n lx = 0,\n lz = 0,\n ) {\n let foundationId;\n let ly = 0;\n switch (parent.type) {\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n foundationId = parent.parentId;\n ly = parent.ly;\n break;\n case ObjectType.Roof:\n foundationId = parent.parentId;\n ly = (parent as RoofModel).thickness;\n break;\n }\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Window,\n cx: cx,\n cy: cy,\n cz: cz,\n lx: lx,\n ly: ly,\n lz: lz,\n leftShutter: actionState.windowShutterLeft,\n rightShutter: actionState.windowShutterRight,\n shutterColor: actionState.windowShutterColor,\n shutterWidth: actionState.windowShutterWidth,\n horizontalMullion: actionState.windowHorizontalMullion,\n verticalMullion: actionState.windowVerticalMullion,\n mullionWidth: actionState.windowMullionWidth,\n horizontalMullionSpacing: actionState.windowHorizontalMullionSpacing,\n verticalMullionSpacing: actionState.windowVerticalMullionSpacing,\n mullionColor: actionState.windowMullionColor,\n frame: actionState.windowFrame,\n frameWidth: actionState.windowFrameWidth,\n sillWidth: RoofUtil.isTypeRoof(parentType) ? 0 : actionState.windowSillWidth,\n windowType: actionState.windowType,\n empty: actionState.windowEmpty,\n interior: actionState.windowInterior,\n archHeight: actionState.windowArchHeight,\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n color: actionState.windowColor ?? '#ffffff', // frame color\n tint: actionState.windowTint ?? '#73D8FF', // glass color\n opacity: actionState.windowOpacity !== undefined ? actionState.windowOpacity : 0.5,\n uValue: actionState.windowUValue ?? 0.5,\n normal: [0, -1, 0],\n rotation: rotation ? [...rotation] : [0, 0, 0],\n parentId: parent.id,\n parentType: parentType,\n foundationId: foundationId,\n id: short.generate() as string,\n } as WindowModel;\n }\n\n static makeDoor(parent: ElementModel) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n foundationId = parent.parentId;\n break;\n }\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Door,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n doorType: actionState.doorType,\n filled: actionState.doorFilled,\n interior: actionState.doorInterior,\n archHeight: actionState.doorArchHeight,\n textureType: actionState.doorTexture ?? DoorTexture.Default,\n color: actionState.doorColor ?? '#ffffff',\n uValue: actionState.doorUValue ?? 0.5,\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as DoorModel;\n }\n\n static makePyramidRoof(wallsId: string[], parent: ElementModel) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Pyramid,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n } as PyramidRoofModel;\n }\n\n static makeGableRoof(wallsId: string[], parent: ElementModel) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Gable,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n ridgeLeftPoint: [0, 1],\n ridgeRightPoint: [0, 1],\n } as GableRoofModel;\n }\n\n static makeHipRoof(wallsId: string[], parent: ElementModel, ridgeLength: number) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Hip,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n leftRidgeLength: (ridgeLength ?? 2) / 2,\n rightRidgeLength: (ridgeLength ?? 2) / 2,\n } as HipRoofModel;\n }\n\n static makeGambrelRoof(wallsId: string[], parent: ElementModel) {\n const xPercent = 0.35;\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Gambrel,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n topRidgePoint: [0, 1],\n frontRidgePoint: [xPercent, 0.5],\n backRidgePoint: [xPercent, 0.5],\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n } as GambrelRoofModel;\n }\n\n static makeMansardRoof(wallsId: string[], parent: ElementModel) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Mansard,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n ridgeWidth: 1,\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n } as MansardRoofModel;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { CommonStoreState } from '../common';\n\nexport const pvModelName = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.pvModelName;\nexport const rowAxis = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.rowAxis;\nexport const rowWidth = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.rowsPerRack;\nexport const interRowSpacing = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.interRowSpacing;\nexport const margin = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.margin;\nexport const poleHeight = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.poleHeight;\nexport const poleSpacing = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.poleSpacing;\nexport const tiltAngle = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.tiltAngle;\nexport const orientation = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.orientation;\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { CommonStoreState } from '../common';\n\nexport const navigationView = (state: CommonStoreState) => state.viewState.navigationView;\n\nexport const shadowEnabled = (state: CommonStoreState) => state.viewState.shadowEnabled;\n\nexport const solarPanelShininess = (state: CommonStoreState) => state.viewState.solarPanelShininess;\n\nexport const windowShininess = (state: CommonStoreState) => state.viewState.windowShininess;\n\nexport const heatFluxScaleFactor = (state: CommonStoreState) => state.viewState.heatFluxScaleFactor;\n\nexport const heatFluxColor = (state: CommonStoreState) => state.viewState.heatFluxColor;\n\nexport const heatFluxWidth = (state: CommonStoreState) => state.viewState.heatFluxWidth;\n\nexport const solarRadiationHeatmapMaxValue = (state: CommonStoreState) => state.viewState.solarRadiationHeatMapMaxValue;\n\nexport const solarRadiationHeatmapReflectionOnly = (state: CommonStoreState) =>\n state.viewState.solarRadiationHeatMapReflectionOnly;\n\nexport const axes = (state: CommonStoreState) => state.viewState.axes;\n\nexport const ambientLightIntensity = (state: CommonStoreState) => state.viewState.ambientLightIntensity;\n\nexport const directLightIntensity = (state: CommonStoreState) => state.viewState.directLightIntensity;\n\nexport const theme = (state: CommonStoreState) => state.viewState.theme;\n\nexport const showAzimuthAngle = (state: CommonStoreState) => state.viewState.showAzimuthAngle;\n\nexport const showElevationAngle = (state: CommonStoreState) => state.viewState.showElevationAngle;\n\nexport const showZenithAngle = (state: CommonStoreState) => state.viewState.showZenithAngle;\n\nexport const autoRotate = (state: CommonStoreState) => state.viewState.autoRotate;\n\nexport const groundImage = (state: CommonStoreState) => state.viewState.groundImage;\n\nexport const groundImageType = (state: CommonStoreState) => state.viewState.groundImageType;\n\nexport const groundColor = (state: CommonStoreState) => state.viewState.groundColor;\n\nexport const waterSurface = (state: CommonStoreState) => state.viewState.waterSurface;\n\nexport const orthographic = (state: CommonStoreState) => state.viewState.orthographic;\n\nexport const enableRotate = (state: CommonStoreState) => state.viewState.enableRotate;\n\nexport const cameraPosition = (state: CommonStoreState) => state.viewState.cameraPosition;\n\nexport const cameraPosition2D = (state: CommonStoreState) => state.viewState.cameraPosition2D;\n\nexport const panCenter = (state: CommonStoreState) => state.viewState.panCenter;\n\nexport const panCenter2D = (state: CommonStoreState) => state.viewState.panCenter2D;\n\nexport const cameraZoom = (state: CommonStoreState) => state.viewState.cameraZoom;\n\nexport const heliodon = (state: CommonStoreState) => state.viewState.heliodon;\n\nexport const showSunAngles = (state: CommonStoreState) => state.viewState.showSunAngles;\n\nexport const mapZoom = (state: CommonStoreState) => state.viewState.mapZoom;\n\nexport const mapTilt = (state: CommonStoreState) => state.viewState.mapTilt;\n\nexport const mapType = (state: CommonStoreState) => state.viewState.mapType;\n\nexport const showSiteInfoPanel = (state: CommonStoreState) => state.viewState.showSiteInfoPanel;\n\nexport const showDesignInfoPanel = (state: CommonStoreState) => state.viewState.showDesignInfoPanel;\n\nexport const showInstructionPanel = (state: CommonStoreState) => state.viewState.showInstructionPanel;\n\nexport const showHeliodonPanel = (state: CommonStoreState) => state.viewState.showHeliodonPanel;\n\nexport const heliodonPanelX = (state: CommonStoreState) => state.viewState.heliodonPanelX;\n\nexport const heliodonPanelY = (state: CommonStoreState) => state.viewState.heliodonPanelY;\n\nexport const showMapPanel = (state: CommonStoreState) => state.viewState.showMapPanel;\n\nexport const mapPanelX = (state: CommonStoreState) => state.viewState.mapPanelX;\n\nexport const mapPanelY = (state: CommonStoreState) => state.viewState.mapPanelY;\n\nexport const showWeatherPanel = (state: CommonStoreState) => state.viewState.showWeatherPanel;\n\nexport const weatherPanelRect = (state: CommonStoreState) => state.viewState.weatherPanelRect;\n\nexport const showDiurnalTemperaturePanel = (state: CommonStoreState) => state.viewState.showDiurnalTemperaturePanel;\n\nexport const diurnalTemperaturePanelRect = (state: CommonStoreState) => state.viewState.diurnalTemperaturePanelRect;\n\nexport const showStickyNotePanel = (state: CommonStoreState) => state.viewState.showStickyNotePanel;\n\nexport const stickyNotePanelRect = (state: CommonStoreState) => state.viewState.stickyNotePanelRect;\n\nexport const showDailyBuildingEnergyPanel = (state: CommonStoreState) => state.viewState.showDailyBuildingEnergyPanel;\n\nexport const dailyBuildingEnergyPanelRect = (state: CommonStoreState) => state.viewState.dailyBuildingEnergyPanelRect;\n\nexport const showYearlyBuildingEnergyPanel = (state: CommonStoreState) => state.viewState.showYearlyBuildingEnergyPanel;\n\nexport const yearlyBuildingEnergyPanelRect = (state: CommonStoreState) => state.viewState.yearlyBuildingEnergyPanelRect;\n\nexport const showDailyLightSensorPanel = (state: CommonStoreState) => state.viewState.showDailyLightSensorPanel;\n\nexport const dailyLightSensorPanelRect = (state: CommonStoreState) => state.viewState.dailyLightSensorPanelRect;\n\nexport const showYearlyLightSensorPanel = (state: CommonStoreState) => state.viewState.showYearlyLightSensorPanel;\n\nexport const yearlyLightSensorPanelRect = (state: CommonStoreState) => state.viewState.yearlyLightSensorPanelRect;\n\nexport const yearlyLightSensorPanelShowDaylight = (state: CommonStoreState) =>\n state.viewState.yearlyLightSensorPanelShowDaylight;\n\nexport const yearlyLightSensorPanelShowClearness = (state: CommonStoreState) =>\n state.viewState.yearlyLightSensorPanelShowClearness;\n\nexport const showDailyPvYieldPanel = (state: CommonStoreState) => state.viewState.showDailyPvYieldPanel;\n\nexport const dailyPvYieldPanelRect = (state: CommonStoreState) => state.viewState.dailyPvYieldPanelRect;\n\nexport const showYearlyPvYieldPanel = (state: CommonStoreState) => state.viewState.showYearlyPvYieldPanel;\n\nexport const yearlyPvYieldPanelRect = (state: CommonStoreState) => state.viewState.yearlyPvYieldPanelRect;\n\nexport const showVisibilityResultsPanel = (state: CommonStoreState) =>\n state.viewState.showSolarPanelVisibilityResultsPanel;\n\nexport const visibilityResultsPanelRect = (state: CommonStoreState) => state.viewState.visibilityResultsPanelRect;\n\nexport const showDailyParabolicTroughYieldPanel = (state: CommonStoreState) =>\n state.viewState.showDailyParabolicTroughYieldPanel;\n\nexport const dailyParabolicTroughYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.dailyParabolicTroughYieldPanelRect;\n\nexport const showYearlyParabolicTroughYieldPanel = (state: CommonStoreState) =>\n state.viewState.showYearlyParabolicTroughYieldPanel;\n\nexport const yearlyParabolicTroughYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.yearlyParabolicTroughYieldPanelRect;\n\nexport const showDailyParabolicDishYieldPanel = (state: CommonStoreState) =>\n state.viewState.showDailyParabolicDishYieldPanel;\n\nexport const dailyParabolicDishYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.dailyParabolicDishYieldPanelRect;\n\nexport const showYearlyParabolicDishYieldPanel = (state: CommonStoreState) =>\n state.viewState.showYearlyParabolicDishYieldPanel;\n\nexport const yearlyParabolicDishYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.yearlyParabolicDishYieldPanelRect;\n\nexport const showDailyFresnelReflectorYieldPanel = (state: CommonStoreState) =>\n state.viewState.showDailyFresnelReflectorYieldPanel;\n\nexport const dailyFresnelReflectorYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.dailyFresnelReflectorYieldPanelRect;\n\nexport const showYearlyFresnelReflectorYieldPanel = (state: CommonStoreState) =>\n state.viewState.showYearlyFresnelReflectorYieldPanel;\n\nexport const yearlyFresnelReflectorYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.yearlyFresnelReflectorYieldPanelRect;\n\nexport const showDailyHeliostatYieldPanel = (state: CommonStoreState) => state.viewState.showDailyHeliostatYieldPanel;\n\nexport const dailyHeliostatYieldPanelRect = (state: CommonStoreState) => state.viewState.dailyHeliostatYieldPanelRect;\n\nexport const showYearlyHeliostatYieldPanel = (state: CommonStoreState) => state.viewState.showYearlyHeliostatYieldPanel;\n\nexport const yearlyHeliostatYieldPanelRect = (state: CommonStoreState) => state.viewState.yearlyHeliostatYieldPanelRect;\n\nexport const showDailyUpdraftTowerYieldPanel = (state: CommonStoreState) =>\n state.viewState.showDailyUpdraftTowerYieldPanel;\n\nexport const dailyUpdraftTowerYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.dailyUpdraftTowerYieldPanelRect;\n\nexport const showYearlyUpdraftTowerYieldPanel = (state: CommonStoreState) =>\n state.viewState.showYearlyUpdraftTowerYieldPanel;\n\nexport const yearlyUpdraftTowerYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.yearlyUpdraftTowerYieldPanelRect;\n\nexport const showEvolutionPanel = (state: CommonStoreState) => state.viewState.showEvolutionPanel;\n\nexport const evolutionPanelRect = (state: CommonStoreState) => state.viewState.evolutionPanelRect;\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { CommonStoreState } from '../common';\n\nexport const latitude = (state: CommonStoreState) => state.world.latitude;\n\nexport const longitude = (state: CommonStoreState) => state.world.longitude;\n\nexport const date = (state: CommonStoreState) => state.world.date;\n\nexport const leafDayOfYear1 = (state: CommonStoreState) => state.world.leafDayOfYear1;\n\nexport const leafDayOfYear2 = (state: CommonStoreState) => state.world.leafDayOfYear2;\n\nexport const ground = (state: CommonStoreState) => state.world.ground;\n\nexport const address = (state: CommonStoreState) => state.world.address;\n\nexport const countryCode = (state: CommonStoreState) => state.world.countryCode;\n\nexport const airAttenuationCoefficient = (state: CommonStoreState) => state.world.airAttenuationCoefficient;\n\nexport const airConvectiveCoefficient = (state: CommonStoreState) => state.world.airConvectiveCoefficient;\n\nexport const timesPerHour = (state: CommonStoreState) => state.world.timesPerHour;\n\nexport const daysPerYear = (state: CommonStoreState) => state.world.daysPerYear;\n\nexport const monthlyIrradianceLosses = (state: CommonStoreState) => state.world.monthlyIrradianceLosses;\n\nexport const discretization = (state: CommonStoreState) => state.world.discretization;\n\nexport const diurnalTemperatureModel = (state: CommonStoreState) => state.world.diurnalTemperatureModel;\n\nexport const highestTemperatureTimeInMinutes = (state: CommonStoreState) => state.world.highestTemperatureTimeInMinutes;\n\nexport const solarRadiationHeatmapGridCellSize = (state: CommonStoreState) =>\n state.world.solarRadiationHeatmapGridCellSize;\n\nexport const pvGridCellSize = (state: CommonStoreState) => state.world.pvGridCellSize;\n\nexport const solarPanelVisibilityGridCellSize = (state: CommonStoreState) =>\n state.world.solarPanelVisibilityGridCellSize;\n\nexport const cspTimesPerHour = (state: CommonStoreState) => state.world.cspTimesPerHour;\n\nexport const cspDaysPerYear = (state: CommonStoreState) => state.world.cspDaysPerYear;\n\nexport const cspGridCellSize = (state: CommonStoreState) => state.world.cspGridCellSize;\n\nexport const sutTimesPerHour = (state: CommonStoreState) => state.world.sutTimesPerHour;\n\nexport const sutDaysPerYear = (state: CommonStoreState) => state.world.sutDaysPerYear;\n\nexport const sutGridCellSize = (state: CommonStoreState) => state.world.sutGridCellSize;\n\nexport const noAnimationForHeatmapSimulation = (state: CommonStoreState) => state.world.noAnimationForHeatmapSimulation;\n\nexport const noAnimationForThermalSimulation = (state: CommonStoreState) => state.world.noAnimationForThermalSimulation;\n\nexport const noAnimationForSensorDataCollection = (state: CommonStoreState) =>\n state.world.noAnimationForSensorDataCollection;\n\nexport const noAnimationForSolarPanelSimulation = (state: CommonStoreState) =>\n state.world.noAnimationForSolarPanelSimulation;\n\nexport const noAnimationForSolarUpdraftTowerSimulation = (state: CommonStoreState) =>\n state.world.noAnimationForSolarUpdraftTowerSimulation;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { CommonStoreState } from '../common';\r\nimport { PrimitiveStoreState } from '../commonPrimitive';\r\nimport { DataStoreState } from '../commonData';\r\n\r\nexport const set = (state: CommonStoreState) => state.set;\r\n\r\nexport const user = (state: CommonStoreState) => state.user;\r\n\r\nexport const userCount = (state: PrimitiveStoreState) => state.userCount;\r\n\r\nexport const showEconomicsPanel = (state: PrimitiveStoreState) => state.showEconomicsPanel;\r\n\r\nexport const showNavigationPanel = (state: PrimitiveStoreState) => state.showNavigationPanel;\r\n\r\nexport const minimumNavigationMoveSpeed = (state: CommonStoreState) => state.minimumNavigationMoveSpeed;\r\n\r\nexport const minimumNavigationTurnSpeed = (state: CommonStoreState) => state.minimumNavigationTurnSpeed;\r\n\r\nexport const navigationMoveSpeed = (state: PrimitiveStoreState) => state.navigationMoveSpeed;\r\n\r\nexport const navigationTurnSpeed = (state: PrimitiveStoreState) => state.navigationTurnSpeed;\r\n\r\nexport const getHeatmap = (state: DataStoreState) => state.getHeatmap;\r\n\r\nexport const setHeatmap = (state: DataStoreState) => state.setHeatmap;\r\n\r\nexport const clearHeatmaps = (state: DataStoreState) => state.clearHeatmaps;\r\n\r\nexport const clearDataStore = (state: DataStoreState) => state.clearDataStore;\r\n\r\nexport const flagOfDailySimulation = (state: PrimitiveStoreState) => state.flagOfDailySimulation;\r\n\r\nexport const hourlyHeatExchangeArrayMap = (state: DataStoreState) => state.hourlyHeatExchangeArrayMap;\r\n\r\nexport const setHourlyHeatExchangeArray = (state: DataStoreState) => state.setHourlyHeatExchangeArray;\r\n\r\nexport const hourlySolarHeatGainArrayMap = (state: DataStoreState) => state.hourlySolarHeatGainArrayMap;\r\n\r\nexport const setHourlySolarHeatGainArray = (state: DataStoreState) => state.setHourlySolarHeatGainArray;\r\n\r\nexport const hourlySolarPanelOutputArrayMap = (state: DataStoreState) => state.hourlySolarPanelOutputArrayMap;\r\n\r\nexport const setHourlySolarPanelOutputArray = (state: DataStoreState) => state.setHourlySolarPanelOutputArray;\r\n\r\nexport const getRoofSegmentVertices = (state: DataStoreState) => state.getRoofSegmentVertices;\r\n\r\nexport const getRoofSegmentVerticesWithoutOverhang = (state: DataStoreState) =>\r\n state.getRoofSegmentVerticesWithoutOverhang;\r\n\r\nexport const changed = (state: PrimitiveStoreState) => state.changed;\r\n\r\nexport const setChanged = (state: PrimitiveStoreState) => state.setChanged;\r\n\r\nexport const setSkipChange = (state: PrimitiveStoreState) => state.setSkipChange;\r\n\r\nexport const applyCount = (state: CommonStoreState) => state.applyCount;\r\n\r\nexport const setApplyCount = (state: CommonStoreState) => state.setApplyCount;\r\n\r\nexport const revertApply = (state: CommonStoreState) => state.revertApply;\r\n\r\nexport const elements = (state: CommonStoreState) => state.elements;\r\n\r\nexport const notes = (state: CommonStoreState) => state.notes;\r\n\r\nexport const pvModules = (state: CommonStoreState) => state.pvModules;\r\n\r\nexport const loadPvModules = (state: CommonStoreState) => state.loadPvModules;\r\n\r\nexport const getPvModule = (state: CommonStoreState) => state.getPvModule;\r\n\r\nexport const floatingWindowOpacity = (state: CommonStoreState) => state.floatingWindowOpacity;\r\n\r\nexport const selectedFloatingWindow = (state: CommonStoreState) => state.selectedFloatingWindow;\r\n\r\nexport const language = (state: CommonStoreState) => state.language;\r\n\r\nexport const locale = (state: CommonStoreState) => state.locale;\r\n\r\nexport const loggable = (state: CommonStoreState) => state.loggable;\r\n\r\nexport const actionInfo = (state: CommonStoreState) => state.actionInfo;\r\n\r\nexport const currentUndoable = (state: CommonStoreState) => state.currentUndoable;\r\n\r\nexport const openModelsMap = (state: PrimitiveStoreState) => state.openModelsMap;\r\n\r\nexport const modelsMapLatitude = (state: CommonStoreState) => state.modelsMapLatitude;\r\n\r\nexport const modelsMapLongitude = (state: CommonStoreState) => state.modelsMapLongitude;\r\n\r\nexport const modelsMapZoom = (state: CommonStoreState) => state.modelsMapZoom;\r\n\r\nexport const modelsMapTilt = (state: CommonStoreState) => state.modelsMapTilt;\r\n\r\nexport const modelsMapType = (state: CommonStoreState) => state.modelsMapType;\r\n\r\nexport const modelsMapWeatherStations = (state: PrimitiveStoreState) => state.modelsMapWeatherStations;\r\n\r\nexport const showCloudFileTitleDialog = (state: CommonStoreState) => state.showCloudFileTitleDialog;\r\n\r\nexport const showCloudFileTitleDialogFlag = (state: CommonStoreState) => state.showCloudFileTitleDialogFlag;\r\n\r\nexport const cloudFile = (state: CommonStoreState) => state.cloudFile;\r\n\r\nexport const latestModelSite = (state: CommonStoreState) => state.latestModelSite;\r\n\r\nexport const modelSites = (state: CommonStoreState) => state.modelSites;\r\n\r\nexport const peopleModels = (state: CommonStoreState) => state.peopleModels;\r\n\r\nexport const saveCloudFileFlag = (state: PrimitiveStoreState) => state.saveCloudFileFlag;\r\n\r\nexport const createProjectFlag = (state: PrimitiveStoreState) => state.createProjectFlag;\r\n\r\nexport const saveProjectFlag = (state: PrimitiveStoreState) => state.saveProjectFlag;\r\n\r\nexport const curateDesignToProjectFlag = (state: PrimitiveStoreState) => state.curateDesignToProjectFlag;\r\n\r\nexport const showProjectsFlag = (state: PrimitiveStoreState) => state.showProjectsFlag;\r\n\r\nexport const updateProjectsFlag = (state: PrimitiveStoreState) => state.updateProjectsFlag;\r\n\r\nexport const modelsMapFlag = (state: PrimitiveStoreState) => state.modelsMapFlag;\r\n\r\nexport const leaderboardFlag = (state: PrimitiveStoreState) => state.leaderboardFlag;\r\n\r\nexport const showLeaderboard = (state: PrimitiveStoreState) => state.showLeaderboard;\r\n\r\nexport const publishOnModelsMapFlag = (state: PrimitiveStoreState) => state.publishOnModelsMapFlag;\r\n\r\nexport const listCloudFilesFlag = (state: PrimitiveStoreState) => state.listCloudFilesFlag;\r\n\r\nexport const localContentToImportAfterCloudFileUpdate = (state: CommonStoreState) =>\r\n state.localContentToImportAfterCloudFileUpdate;\r\n\r\nexport const localFileName = (state: CommonStoreState) => state.localFileName;\r\n\r\nexport const createNewFileFlag = (state: CommonStoreState) => state.createNewFileFlag;\r\n\r\nexport const openLocalFileFlag = (state: CommonStoreState) => state.openLocalFileFlag;\r\n\r\nexport const saveLocalFileDialogVisible = (state: PrimitiveStoreState) => state.saveLocalFileDialogVisible;\r\n\r\nexport const fileChanged = (state: CommonStoreState) => state.fileChanged;\r\n\r\nexport const undoManager = (state: CommonStoreState) => state.undoManager;\r\n\r\nexport const addUndoable = (state: CommonStoreState) => state.addUndoable;\r\n\r\nexport const importContent = (state: CommonStoreState) => state.importContent;\r\n\r\nexport const exportContent = (state: CommonStoreState) => state.exportContent;\r\n\r\nexport const clearContent = (state: CommonStoreState) => state.clearContent;\r\n\r\nexport const createEmptyFile = (state: CommonStoreState) => state.createEmptyFile;\r\n\r\nexport const aabb = (state: CommonStoreState) => state.aabb;\r\n\r\nexport const animateSun = (state: PrimitiveStoreState) => state.animateSun;\r\n\r\nexport const animate24Hours = (state: CommonStoreState) => state.animate24Hours;\r\n\r\nexport const runDailyThermalSimulation = (state: PrimitiveStoreState) => state.runDailyThermalSimulation;\r\n\r\nexport const pauseDailyThermalSimulation = (state: PrimitiveStoreState) => state.pauseDailyThermalSimulation;\r\n\r\nexport const runYearlyThermalSimulation = (state: PrimitiveStoreState) => state.runYearlyThermalSimulation;\r\n\r\nexport const pauseYearlyThermalSimulation = (state: PrimitiveStoreState) => state.pauseYearlyThermalSimulation;\r\n\r\nexport const clearDailySimulationResultsFlag = (state: PrimitiveStoreState) => state.clearDailySimulationResultsFlag;\r\n\r\nexport const clearYearlySimulationResultsFlag = (state: PrimitiveStoreState) => state.clearYearlySimulationResultsFlag;\r\n\r\nexport const runDynamicSimulation = (state: PrimitiveStoreState) => state.runDynamicSimulation;\r\n\r\nexport const runStaticSimulation = (state: PrimitiveStoreState) => state.runStaticSimulation;\r\n\r\nexport const pauseSimulation = (state: PrimitiveStoreState) => state.pauseSimulation;\r\n\r\nexport const runEvolution = (state: PrimitiveStoreState) => state.runEvolution;\r\n\r\nexport const pauseEvolution = (state: PrimitiveStoreState) => state.pauseEvolution;\r\n\r\nexport const objectiveEvaluationIndex = (state: PrimitiveStoreState) => state.objectiveEvaluationIndex;\r\n\r\nexport const evolutionMethod = (state: CommonStoreState) => state.evolutionMethod;\r\n\r\nexport const updateSceneRadiusFlag = (state: CommonStoreState) => state.updateSceneRadiusFlag;\r\n\r\nexport const updateSceneRadius = (state: CommonStoreState) => state.updateSceneRadius;\r\n\r\nexport const sceneRadius = (state: CommonStoreState) => state.sceneRadius;\r\n\r\nexport const cameraDirection = (state: CommonStoreState) => state.cameraDirection;\r\n\r\nexport const getCameraDirection = (state: CommonStoreState) => state.getCameraDirection;\r\n\r\nexport const getElementById = (state: CommonStoreState) => state.getElementById;\r\n\r\nexport const getFoundation = (state: CommonStoreState) => state.getFoundation;\r\n\r\nexport const getParent = (state: CommonStoreState) => state.getParent;\r\n\r\nexport const getChildren = (state: CommonStoreState) => state.getChildren;\r\n\r\nexport const getChildrenOfType = (state: CommonStoreState) => state.getChildrenOfType;\r\n\r\nexport const selectedElement = (state: CommonStoreState) => state.selectedElement;\r\n\r\nexport const selectedElementIdSet = (state: CommonStoreState) => state.selectedElementIdSet;\r\n\r\nexport const getSelectedElement = (state: CommonStoreState) => state.getSelectedElement;\r\n\r\nexport const overlapWithSibling = (state: CommonStoreState) => state.overlapWithSibling;\r\n\r\nexport const selectedSideIndex = (state: CommonStoreState) => state.selectedSideIndex;\r\n\r\nexport const setElementPosition = (state: CommonStoreState) => state.setElementPosition;\r\n\r\nexport const setElementSize = (state: CommonStoreState) => state.setElementSize;\r\n\r\nexport const setElementNormal = (state: CommonStoreState) => state.setElementNormal;\r\n\r\nexport const updateAllElementLocks = (state: CommonStoreState) => state.updateAllElementLocks;\r\n\r\nexport const updateElementLockByFoundationId = (state: CommonStoreState) => state.updateElementLockByFoundationId;\r\n\r\nexport const updateElementLockByParentId = (state: CommonStoreState) => state.updateElementLockByParentId;\r\n\r\nexport const updateElementLockById = (state: CommonStoreState) => state.updateElementLockById;\r\n\r\nexport const updateElementReferenceById = (state: CommonStoreState) => state.updateElementReferenceById;\r\n\r\nexport const updateElementLabelById = (state: CommonStoreState) => state.updateElementLabelById;\r\n\r\nexport const updateElementShowLabelById = (state: CommonStoreState) => state.updateElementShowLabelById;\r\n\r\nexport const updateElementCxById = (state: CommonStoreState) => state.updateElementCxById;\r\n\r\nexport const updateElementCyById = (state: CommonStoreState) => state.updateElementCyById;\r\n\r\nexport const updateElementCzById = (state: CommonStoreState) => state.updateElementCzById;\r\n\r\nexport const updateElementCzForAll = (state: CommonStoreState) => state.updateElementCzForAll;\r\n\r\nexport const updateElementLxById = (state: CommonStoreState) => state.updateElementLxById;\r\n\r\nexport const updateElementLxAboveFoundation = (state: CommonStoreState) => state.updateElementLxAboveFoundation;\r\n\r\nexport const updateElementLxForAll = (state: CommonStoreState) => state.updateElementLxForAll;\r\n\r\nexport const updateElementLyById = (state: CommonStoreState) => state.updateElementLyById;\r\n\r\nexport const updateElementLyAboveFoundation = (state: CommonStoreState) => state.updateElementLyAboveFoundation;\r\n\r\nexport const updateElementLyForAll = (state: CommonStoreState) => state.updateElementLyForAll;\r\n\r\nexport const updateElementLzById = (state: CommonStoreState) => state.updateElementLzById;\r\n\r\nexport const updateElementLzForAll = (state: CommonStoreState) => state.updateElementLzForAll;\r\n\r\nexport const updateElementColorById = (state: CommonStoreState) => state.updateElementColorById;\r\n\r\nexport const updateElementColorOnSurface = (state: CommonStoreState) => state.updateElementColorOnSurface;\r\n\r\nexport const updateElementColorAboveFoundation = (state: CommonStoreState) => state.updateElementColorAboveFoundation;\r\n\r\nexport const updateElementColorForAll = (state: CommonStoreState) => state.updateElementColorForAll;\r\n\r\nexport const updateElementLineColorById = (state: CommonStoreState) => state.updateElementLineColorById;\r\n\r\nexport const updateElementLineColorOnSurface = (state: CommonStoreState) => state.updateElementLineColorOnSurface;\r\n\r\nexport const updateElementLineColorAboveFoundation = (state: CommonStoreState) =>\r\n state.updateElementLineColorAboveFoundation;\r\n\r\nexport const updateElementLineColorForAll = (state: CommonStoreState) => state.updateElementLineColorForAll;\r\n\r\nexport const updateElementLineWidthById = (state: CommonStoreState) => state.updateElementLineWidthById;\r\n\r\nexport const updateElementLineWidthOnSurface = (state: CommonStoreState) => state.updateElementLineWidthOnSurface;\r\n\r\nexport const updateElementLineWidthAboveFoundation = (state: CommonStoreState) =>\r\n state.updateElementLineWidthAboveFoundation;\r\n\r\nexport const updateElementLineWidthForAll = (state: CommonStoreState) => state.updateElementLineWidthForAll;\r\n\r\nexport const updateElementRotationById = (state: CommonStoreState) => state.updateElementRotationById;\r\n\r\nexport const updateElementRotationForAll = (state: CommonStoreState) => state.updateElementRotationForAll;\r\n\r\nexport const foundationActionScope = (state: CommonStoreState) => state.foundationActionScope;\r\n\r\nexport const setFoundationActionScope = (state: CommonStoreState) => state.setFoundationActionScope;\r\n\r\nexport const polygonActionScope = (state: CommonStoreState) => state.polygonActionScope;\r\n\r\nexport const setPolygonActionScope = (state: CommonStoreState) => state.setPolygonActionScope;\r\n\r\nexport const updatePolygonVertexPositionById = (state: CommonStoreState) => state.updatePolygonVertexPositionById;\r\n\r\nexport const updatePolygonVerticesById = (state: CommonStoreState) => state.updatePolygonVerticesById;\r\n\r\nexport const cuboidActionScope = (state: CommonStoreState) => state.cuboidActionScope;\r\n\r\nexport const setCuboidActionScope = (state: CommonStoreState) => state.setCuboidActionScope;\r\n\r\nexport const solarPanelActionScope = (state: CommonStoreState) => state.solarPanelActionScope;\r\n\r\nexport const setSolarPanelActionScope = (state: CommonStoreState) => state.setSolarPanelActionScope;\r\n\r\nexport const updateSolarCollectorDailyYieldById = (state: CommonStoreState) => state.updateSolarCollectorDailyYieldById;\r\n\r\nexport const updateSolarCollectorYearlyYieldById = (state: CommonStoreState) =>\r\n state.updateSolarCollectorYearlyYieldById;\r\n\r\nexport const updateSolarPanelTiltAngleById = (state: CommonStoreState) => state.updateSolarPanelTiltAngleById;\r\n\r\nexport const updateSolarCollectorDrawSunBeamById = (state: CommonStoreState) =>\r\n state.updateSolarCollectorDrawSunBeamById;\r\n\r\nexport const updateSolarCollectorDrawSunBeamAboveFoundation = (state: CommonStoreState) =>\r\n state.updateSolarCollectorDrawSunBeamAboveFoundation;\r\n\r\nexport const updateSolarCollectorDrawSunBeamForAll = (state: CommonStoreState) =>\r\n state.updateSolarCollectorDrawSunBeamForAll;\r\n\r\nexport const updateSolarCollectorRelativeAzimuthById = (state: CommonStoreState) =>\r\n state.updateSolarCollectorRelativeAzimuthById;\r\n\r\nexport const updateSolarCollectorRelativeAzimuthOnSurface = (state: CommonStoreState) =>\r\n state.updateSolarCollectorRelativeAzimuthOnSurface;\r\n\r\nexport const updateSolarCollectorRelativeAzimuthAboveFoundation = (state: CommonStoreState) =>\r\n state.updateSolarCollectorRelativeAzimuthAboveFoundation;\r\n\r\nexport const updateSolarCollectorRelativeAzimuthForAll = (state: CommonStoreState) =>\r\n state.updateSolarCollectorRelativeAzimuthForAll;\r\n\r\nexport const updateSolarCollectorPoleHeightById = (state: CommonStoreState) => state.updateSolarCollectorPoleHeightById;\r\n\r\nexport const updateSolarCollectorPoleHeightOnSurface = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleHeightOnSurface;\r\n\r\nexport const updateSolarCollectorPoleHeightAboveFoundation = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleHeightAboveFoundation;\r\n\r\nexport const updateSolarCollectorPoleHeightForAll = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleHeightForAll;\r\n\r\nexport const updateSolarCollectorPoleRadiusById = (state: CommonStoreState) => state.updateSolarCollectorPoleRadiusById;\r\n\r\nexport const updateSolarCollectorPoleRadiusAboveFoundation = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleRadiusAboveFoundation;\r\n\r\nexport const updateSolarCollectorPoleRadiusForAll = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleRadiusForAll;\r\n\r\nexport const updateCspReflectanceById = (state: CommonStoreState) => state.updateCspReflectanceById;\r\n\r\nexport const updateCspReflectanceAboveFoundation = (state: CommonStoreState) =>\r\n state.updateCspReflectanceAboveFoundation;\r\n\r\nexport const updateCspReflectanceForAll = (state: CommonStoreState) => state.updateCspReflectanceForAll;\r\n\r\nexport const updateParabolicCollectorAbsorptanceById = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorAbsorptanceById;\r\n\r\nexport const updateParabolicCollectorAbsorptanceAboveFoundation = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorAbsorptanceAboveFoundation;\r\n\r\nexport const updateParabolicCollectorAbsorptanceForAll = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorAbsorptanceForAll;\r\n\r\nexport const updateParabolicCollectorOpticalEfficiencyById = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorOpticalEfficiencyById;\r\n\r\nexport const updateParabolicCollectorOpticalEfficiencyAboveFoundation = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorOpticalEfficiencyAboveFoundation;\r\n\r\nexport const updateParabolicCollectorOpticalEfficiencyForAll = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorOpticalEfficiencyForAll;\r\n\r\nexport const updateParabolicCollectorThermalEfficiencyById = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorThermalEfficiencyById;\r\n\r\nexport const updateParabolicCollectorThermalEfficiencyAboveFoundation = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorThermalEfficiencyAboveFoundation;\r\n\r\nexport const updateParabolicCollectorThermalEfficiencyForAll = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorThermalEfficiencyForAll;\r\n\r\nexport const parabolicTroughActionScope = (state: CommonStoreState) => state.parabolicTroughActionScope;\r\n\r\nexport const setParabolicTroughActionScope = (state: CommonStoreState) => state.setParabolicTroughActionScope;\r\n\r\nexport const fresnelReflectorActionScope = (state: CommonStoreState) => state.fresnelReflectorActionScope;\r\n\r\nexport const setFresnelReflectorActionScope = (state: CommonStoreState) => state.setFresnelReflectorActionScope;\r\n\r\nexport const heliostatActionScope = (state: CommonStoreState) => state.heliostatActionScope;\r\n\r\nexport const setHeliostatActionScope = (state: CommonStoreState) => state.setHeliostatActionScope;\r\n\r\nexport const updateSolarReceiverById = (state: CommonStoreState) => state.updateSolarReceiverById;\r\n\r\nexport const updateSolarReceiverAboveFoundation = (state: CommonStoreState) => state.updateSolarReceiverAboveFoundation;\r\n\r\nexport const updateSolarReceiverForAll = (state: CommonStoreState) => state.updateSolarReceiverForAll;\r\n\r\nexport const parabolicDishActionScope = (state: CommonStoreState) => state.parabolicDishActionScope;\r\n\r\nexport const setParabolicDishActionScope = (state: CommonStoreState) => state.setParabolicDishActionScope;\r\n\r\nexport const updateParabolaLatusRectumById = (state: CommonStoreState) => state.updateParabolaLatusRectumById;\r\n\r\nexport const updateParabolaLatusRectumAboveFoundation = (state: CommonStoreState) =>\r\n state.updateParabolaLatusRectumAboveFoundation;\r\n\r\nexport const updateParabolaLatusRectumForAll = (state: CommonStoreState) => state.updateParabolaLatusRectumForAll;\r\n\r\nexport const updateModuleLengthById = (state: CommonStoreState) => state.updateModuleLengthById;\r\n\r\nexport const updateModuleLengthAboveFoundation = (state: CommonStoreState) => state.updateModuleLengthAboveFoundation;\r\n\r\nexport const updateModuleLengthForAll = (state: CommonStoreState) => state.updateModuleLengthForAll;\r\n\r\nexport const updateInsideLightById = (state: CommonStoreState) => state.updateInsideLightById;\r\n\r\nexport const updateInsideLightsByParentId = (state: CommonStoreState) => state.updateInsideLightsByParentId;\r\n\r\nexport const copyElementById = (state: CommonStoreState) => state.copyElementById;\r\n\r\nexport const removeElementById = (state: CommonStoreState) => state.removeElementById;\r\n\r\nexport const removeElementsByType = (state: CommonStoreState) => state.removeElementsByType;\r\n\r\nexport const clearDeletedElements = (state: CommonStoreState) => state.clearDeletedElements;\r\n\r\nexport const countElementsByReferenceId = (state: CommonStoreState) => state.countElementsByReferenceId;\r\n\r\nexport const removeElementsByReferenceId = (state: CommonStoreState) => state.removeElementsByReferenceId;\r\n\r\nexport const removeAllChildElementsByType = (state: CommonStoreState) => state.removeAllChildElementsByType;\r\n\r\nexport const removeAllElementsOnFoundationByType = (state: CommonStoreState) =>\r\n state.removeAllElementsOnFoundationByType;\r\n\r\nexport const pasteElementsToPoint = (state: CommonStoreState) => state.pasteElementsToPoint;\r\n\r\nexport const pasteElementsByKey = (state: CommonStoreState) => state.pasteElementsByKey;\r\n\r\nexport const elementsToPaste = (state: CommonStoreState) => state.elementsToPaste;\r\n\r\nexport const selectMe = (state: CommonStoreState) => state.selectMe;\r\n\r\nexport const selectNone = (state: CommonStoreState) => state.selectNone;\r\n\r\nexport const addElement = (state: CommonStoreState) => state.addElement;\r\n\r\nexport const objectTypeToAdd = (state: CommonStoreState) => state.objectTypeToAdd;\r\n\r\nexport const actionModeLock = (state: CommonStoreState) => state.actionModeLock;\r\n\r\nexport const countElementsByType = (state: CommonStoreState) => state.countElementsByType;\r\n\r\nexport const countSolarStructuresByType = (state: CommonStoreState) => state.countSolarStructuresByType;\r\n\r\nexport const countObservers = (state: CommonStoreState) => state.countObservers;\r\n\r\nexport const countAllElements = (state: CommonStoreState) => state.countAllElements;\r\n\r\nexport const countAllElementsByType = (state: CommonStoreState) => state.countAllElementsByType;\r\n\r\nexport const countAllOffspringsByTypeAtOnce = (state: CommonStoreState) => state.countAllOffspringsByTypeAtOnce;\r\n\r\nexport const countSolarPanelsOnRack = (state: CommonStoreState) => state.countSolarPanelsOnRack;\r\n\r\nexport const selectedElementAngle = (state: CommonStoreState) => state.selectedElementAngle;\r\n\r\nexport const selectedElementHeight = (state: CommonStoreState) => state.selectedElementHeight;\r\n\r\nexport const waiting = (state: PrimitiveStoreState) => state.waiting;\r\n\r\nexport const simulationInProgress = (state: PrimitiveStoreState) => state.simulationInProgress;\r\n\r\nexport const simulationPaused = (state: PrimitiveStoreState) => state.simulationPaused;\r\n\r\nexport const evolutionInProgress = (state: PrimitiveStoreState) => state.evolutionInProgress;\r\n\r\nexport const evolutionPaused = (state: PrimitiveStoreState) => state.evolutionPaused;\r\n\r\nexport const contextMenuObjectType = (state: CommonStoreState) => state.contextMenuObjectType;\r\n\r\nexport const localFileDialogRequested = (state: CommonStoreState) => state.localFileDialogRequested;\r\n\r\nexport const enableFineGrid = (state: CommonStoreState) => state.enableFineGrid;\r\n\r\nexport const setEnableFineGrid = (state: CommonStoreState) => state.setEnableFineGrid;\r\n\r\nexport const showCloudFilePanel = (state: PrimitiveStoreState) => state.showCloudFilePanel;\r\n\r\nexport const projectInfo = (state: CommonStoreState) => state.projectInfo;\r\n\r\nexport const projectView = (state: CommonStoreState) => state.projectView;\r\n\r\nexport const showProjectListPanel = (state: PrimitiveStoreState) => state.showProjectListPanel;\r\n\r\nexport const showModelsGallery = (state: PrimitiveStoreState) => state.showModelsGallery;\r\n\r\nexport const showAccountSettingsPanel = (state: PrimitiveStoreState) => state.showAccountSettingsPanel;\r\n\r\nexport const showLikesPanel = (state: PrimitiveStoreState) => state.showLikesPanel;\r\n\r\nexport const showPublishedModelsPanel = (state: PrimitiveStoreState) => state.showPublishedModelsPanel;\r\n\r\n// science\r\nexport const weatherData = (state: CommonStoreState) => state.weatherData;\r\n\r\nexport const loadWeatherData = (state: CommonStoreState) => state.loadWeatherData;\r\n\r\nexport const getWeather = (state: CommonStoreState) => state.getWeather;\r\n\r\nexport const loadHorizontalSolarRadiationData = (state: CommonStoreState) => state.loadHorizontalSolarRadiationData;\r\n\r\nexport const getHorizontalSolarRadiation = (state: CommonStoreState) => state.getHorizontalSolarRadiation;\r\n\r\nexport const loadVerticalSolarRadiationData = (state: CommonStoreState) => state.loadVerticalSolarRadiationData;\r\n\r\nexport const getVerticalSolarRadiation = (state: CommonStoreState) => state.getVerticalSolarRadiation;\r\n\r\nexport const getClosestCity = (state: CommonStoreState) => state.getClosestCity;\r\n\r\nexport const sunlightDirection = (state: CommonStoreState) => state.sunlightDirection;\r\n\r\nexport const setSunlightDirection = (state: CommonStoreState) => state.setSunlightDirection;\r\n\r\nexport const showSolarRadiationHeatmap = (state: PrimitiveStoreState) => state.showSolarRadiationHeatmap;\r\n\r\nexport const showHeatFluxes = (state: PrimitiveStoreState) => state.showHeatFluxes;\r\n\r\n// solar panels (PV)\r\n\r\nexport const runSolarPanelVisibilityAnalysis = (state: PrimitiveStoreState) => state.runSolarPanelVisibilityAnalysis;\r\n\r\nexport const solarPanelVisibilityResults = (state: DataStoreState) => state.solarPanelVisibilityResults;\r\n\r\nexport const runDailySimulationForSolarPanels = (state: PrimitiveStoreState) => state.runDailySimulationForSolarPanels;\r\n\r\nexport const runDailySimulationForSolarPanelsLastStep = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForSolarPanelsLastStep;\r\n\r\nexport const runYearlySimulationForSolarPanels = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForSolarPanels;\r\n\r\nexport const runYearlySimulationForSolarPanelsLastStep = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForSolarPanelsLastStep;\r\n\r\nexport const pauseDailySimulationForSolarPanels = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForSolarPanels;\r\n\r\nexport const pauseYearlySimulationForSolarPanels = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForSolarPanels;\r\n\r\nexport const dailyPvYield = (state: DataStoreState) => state.dailyPvYield;\r\n\r\nexport const dailyPvIndividualOutputs = (state: CommonStoreState) => state.graphState?.dailyPvIndividualOutputs;\r\n\r\nexport const setDailyPvYield = (state: DataStoreState) => state.setDailyPvYield;\r\n\r\nexport const yearlyPvYield = (state: DataStoreState) => state.yearlyPvYield;\r\n\r\nexport const yearlyPvIndividualOutputs = (state: CommonStoreState) => state.graphState?.yearlyPvIndividualOutputs;\r\n\r\nexport const setYearlyPvYield = (state: DataStoreState) => state.setYearlyPvYield;\r\n\r\nexport const solarPanelLabels = (state: DataStoreState) => state.solarPanelLabels;\r\n\r\nexport const setSolarPanelLabels = (state: DataStoreState) => state.setSolarPanelLabels;\r\n\r\nexport const setTotalBuildingHeater = (state: DataStoreState) => state.setTotalBuildingHeater;\r\n\r\nexport const setTotalBuildingAc = (state: DataStoreState) => state.setTotalBuildingAc;\r\n\r\nexport const setTotalBuildingSolarPanel = (state: DataStoreState) => state.setTotalBuildingSolarPanel;\r\n\r\nexport const updateElementOnRoofFlag = (state: CommonStoreState) => state.updateElementOnRoofFlag;\r\n\r\n// parabolic troughs (CSP)\r\n\r\nexport const runDailySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForParabolicTroughs;\r\n\r\nexport const runYearlySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForParabolicTroughs;\r\n\r\nexport const pauseDailySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForParabolicTroughs;\r\n\r\nexport const pauseYearlySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForParabolicTroughs;\r\n\r\nexport const dailyParabolicTroughYield = (state: DataStoreState) => state.dailyParabolicTroughYield;\r\n\r\nexport const dailyParabolicTroughIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyParabolicTroughIndividualOutputs;\r\n\r\nexport const setDailyParabolicTroughYield = (state: DataStoreState) => state.setDailyParabolicTroughYield;\r\n\r\nexport const yearlyParabolicTroughYield = (state: DataStoreState) => state.yearlyParabolicTroughYield;\r\n\r\nexport const yearlyParabolicTroughIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyParabolicTroughIndividualOutputs;\r\n\r\nexport const setYearlyParabolicTroughYield = (state: DataStoreState) => state.setYearlyParabolicTroughYield;\r\n\r\nexport const parabolicTroughLabels = (state: DataStoreState) => state.parabolicTroughLabels;\r\n\r\nexport const setParabolicTroughLabels = (state: DataStoreState) => state.setParabolicTroughLabels;\r\n\r\n// Fresnel reflectors (CSP)\r\n\r\nexport const runDailySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForFresnelReflectors;\r\n\r\nexport const runYearlySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForFresnelReflectors;\r\n\r\nexport const pauseDailySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForFresnelReflectors;\r\n\r\nexport const pauseYearlySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForFresnelReflectors;\r\n\r\nexport const dailyFresnelReflectorYield = (state: DataStoreState) => state.dailyFresnelReflectorYield;\r\n\r\nexport const dailyFresnelReflectorIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyFresnelReflectorIndividualOutputs;\r\n\r\nexport const setDailyFresnelReflectorYield = (state: DataStoreState) => state.setDailyFresnelReflectorYield;\r\n\r\nexport const yearlyFresnelReflectorYield = (state: DataStoreState) => state.yearlyFresnelReflectorYield;\r\n\r\nexport const yearlyFresnelReflectorIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyFresnelReflectorIndividualOutputs;\r\n\r\nexport const setYearlyFresnelReflectorYield = (state: DataStoreState) => state.setYearlyFresnelReflectorYield;\r\n\r\nexport const fresnelReflectorLabels = (state: DataStoreState) => state.fresnelReflectorLabels;\r\n\r\nexport const setFresnelReflectorLabels = (state: DataStoreState) => state.setFresnelReflectorLabels;\r\n\r\n// heliostats (CSP)\r\n\r\nexport const runDailySimulationForHeliostats = (state: PrimitiveStoreState) => state.runDailySimulationForHeliostats;\r\n\r\nexport const runYearlySimulationForHeliostats = (state: PrimitiveStoreState) => state.runYearlySimulationForHeliostats;\r\n\r\nexport const pauseDailySimulationForHeliostats = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForHeliostats;\r\n\r\nexport const pauseYearlySimulationForHeliostats = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForHeliostats;\r\n\r\nexport const dailyHeliostatYield = (state: DataStoreState) => state.dailyHeliostatYield;\r\n\r\nexport const dailyHeliostatIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyHeliostatIndividualOutputs;\r\n\r\nexport const setDailyHeliostatYield = (state: DataStoreState) => state.setDailyHeliostatYield;\r\n\r\nexport const yearlyHeliostatYield = (state: DataStoreState) => state.yearlyHeliostatYield;\r\n\r\nexport const yearlyHeliostatIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyHeliostatIndividualOutputs;\r\n\r\nexport const setYearlyHeliostatYield = (state: DataStoreState) => state.setYearlyHeliostatYield;\r\n\r\nexport const heliostatLabels = (state: DataStoreState) => state.heliostatLabels;\r\n\r\nexport const setHeliostatLabels = (state: DataStoreState) => state.setHeliostatLabels;\r\n\r\n// solar updraft towers\r\n\r\nexport const runDailySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForUpdraftTower;\r\n\r\nexport const runYearlySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForUpdraftTower;\r\n\r\nexport const pauseDailySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForUpdraftTower;\r\n\r\nexport const pauseYearlySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForUpdraftTower;\r\n\r\nexport const dailyUpdraftTowerResults = (state: DataStoreState) => state.dailyUpdraftTowerResults;\r\n\r\nexport const dailyUpdraftTowerYield = (state: DataStoreState) => state.dailyUpdraftTowerYield;\r\n\r\nexport const dailyUpdraftTowerIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyUpdraftTowerIndividualOutputs;\r\n\r\nexport const setDailyUpdraftTowerResults = (state: DataStoreState) => state.setDailyUpdraftTowerResults;\r\n\r\nexport const setDailyUpdraftTowerYield = (state: DataStoreState) => state.setDailyUpdraftTowerYield;\r\n\r\nexport const yearlyUpdraftTowerYield = (state: DataStoreState) => state.yearlyUpdraftTowerYield;\r\n\r\nexport const yearlyUpdraftTowerIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyUpdraftTowerIndividualOutputs;\r\n\r\nexport const setYearlyUpdraftTowerYield = (state: DataStoreState) => state.setYearlyUpdraftTowerYield;\r\n\r\nexport const updraftTowerLabels = (state: DataStoreState) => state.updraftTowerLabels;\r\n\r\nexport const setUpdraftTowerLabels = (state: DataStoreState) => state.setUpdraftTowerLabels;\r\n\r\n// parabolic dishes (CSP)\r\n\r\nexport const runDailySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForParabolicDishes;\r\n\r\nexport const runYearlySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForParabolicDishes;\r\n\r\nexport const pauseDailySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForParabolicDishes;\r\n\r\nexport const pauseYearlySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForParabolicDishes;\r\n\r\nexport const dailyParabolicDishYield = (state: DataStoreState) => state.dailyParabolicDishYield;\r\n\r\nexport const dailyParabolicDishIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyParabolicDishIndividualOutputs;\r\n\r\nexport const setDailyParabolicDishYield = (state: DataStoreState) => state.setDailyParabolicDishYield;\r\n\r\nexport const yearlyParabolicDishYield = (state: DataStoreState) => state.yearlyParabolicDishYield;\r\n\r\nexport const yearlyParabolicDishIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyParabolicDishIndividualOutputs;\r\n\r\nexport const setYearlyParabolicDishYield = (state: DataStoreState) => state.setYearlyParabolicDishYield;\r\n\r\nexport const parabolicDishLabels = (state: DataStoreState) => state.parabolicDishLabels;\r\n\r\nexport const setParabolicDishLabels = (state: DataStoreState) => state.setParabolicDishLabels;\r\n\r\n// sensors\r\n\r\nexport const runDailyLightSensor = (state: PrimitiveStoreState) => state.runDailyLightSensor;\r\n\r\nexport const pauseDailyLightSensor = (state: PrimitiveStoreState) => state.pauseDailyLightSensor;\r\n\r\nexport const runYearlyLightSensor = (state: PrimitiveStoreState) => state.runYearlyLightSensor;\r\n\r\nexport const pauseYearlyLightSensor = (state: PrimitiveStoreState) => state.pauseYearlyLightSensor;\r\n\r\nexport const dailyLightSensorData = (state: DataStoreState) => state.dailyLightSensorData;\r\n\r\nexport const setDailyLightSensorData = (state: DataStoreState) => state.setDailyLightSensorData;\r\n\r\nexport const yearlyLightSensorData = (state: DataStoreState) => state.yearlyLightSensorData;\r\n\r\nexport const setYearlyLightSensorData = (state: DataStoreState) => state.setYearlyLightSensorData;\r\n\r\nexport const sensorLabels = (state: DataStoreState) => state.sensorLabels;\r\n\r\nexport const setSensorLabels = (state: DataStoreState) => state.setSensorLabels;\r\n\r\n// handles\r\n\r\nexport const hoveredHandle = (state: CommonStoreState) => state.hoveredHandle;\r\n\r\nexport const moveHandleType = (state: CommonStoreState) => state.moveHandleType;\r\n\r\nexport const resizeHandleType = (state: CommonStoreState) => state.resizeHandleType;\r\n\r\nexport const getResizeHandlePosition = (state: CommonStoreState) => state.getResizeHandlePosition;\r\n\r\nexport const rotateHandleType = (state: CommonStoreState) => state.rotateHandleType;\r\n\r\nexport const resizeAnchor = (state: CommonStoreState) => state.resizeAnchor;\r\n\r\n// elements\r\n\r\nexport const isAddingElement = (state: CommonStoreState) => state.isAddingElement;\r\n\r\nexport const addedFoundationId = (state: CommonStoreState) => state.addedFoundationId;\r\n\r\nexport const deletedFoundationId = (state: CommonStoreState) => state.deletedFoundationId;\r\n\r\nexport const addedCuboidId = (state: CommonStoreState) => state.addedCuboidId;\r\n\r\nexport const deletedCuboidId = (state: CommonStoreState) => state.deletedCuboidId;\r\n\r\nexport const addedWallId = (state: CommonStoreState) => state.addedWallId;\r\n\r\nexport const deletedWallId = (state: CommonStoreState) => state.deletedWallId;\r\n\r\nexport const deletedRoofId = (state: CommonStoreState) => state.deletedRoofId;\r\n\r\nexport const deletedRoofIdSet = (state: CommonStoreState) => state.deletedRoofIdSet;\r\n\r\nexport const autoDeletedRoofIdSet = (state: CommonStoreState) => state.autoDeletedRoofIdSet;\r\n\r\nexport const autoDeletedRoofs = (state: CommonStoreState) => state.autoDeletedRoofs;\r\n\r\nexport const autoDeletedChild = (state: CommonStoreState) => state.autoDeletedChild;\r\n\r\nexport const groupActionMode = (state: CommonStoreState) => state.groupActionMode;\r\n\r\nexport const groupActionUpdateFlag = (state: CommonStoreState) => state.groupActionUpdateFlag;\r\n\r\nexport const addedWindowId = (state: CommonStoreState) => state.addedWindowId;\r\n\r\nexport const addedDoorId = (state: CommonStoreState) => state.addedDoorId;\r\n\r\nexport const updateWallMapOnFoundationFlag = (state: CommonStoreState) => state.updateWallMapOnFoundationFlag;\r\n\r\nexport const wallActionScope = (state: CommonStoreState) => state.wallActionScope;\r\n\r\nexport const roofActionScope = (state: CommonStoreState) => state.roofActionScope;\r\n\r\nexport const windowActionScope = (state: CommonStoreState) => state.windowActionScope;\r\n\r\nexport const doorActionScope = (state: CommonStoreState) => state.doorActionScope;\r\n\r\nexport const setWallActionScope = (state: CommonStoreState) => state.setWallActionScope;\r\n\r\nexport const setRoofActionScope = (state: CommonStoreState) => state.setRoofActionScope;\r\n\r\nexport const setDoorActionScope = (state: CommonStoreState) => state.setDoorActionScope;\r\n\r\nexport const setWindowActionScope = (state: CommonStoreState) => state.setWindowActionScope;\r\n\r\nexport const updateWallLeftJointsById = (state: CommonStoreState) => state.updateWallLeftJointsById;\r\n\r\nexport const updateWallRightJointsById = (state: CommonStoreState) => state.updateWallRightJointsById;\r\n\r\nexport const updateWallLeftPointById = (state: CommonStoreState) => state.updateWallLeftPointById;\r\n\r\nexport const updateRoofRiseById = (state: CommonStoreState) => state.updateRoofRiseById;\r\n\r\nexport const updateRoofStructureById = (state: CommonStoreState) => state.updateRoofStructureById;\r\n\r\nexport * as solarPanelArrayLayoutParams from './solarPanelArrayLayoutParams';\r\n\r\nexport const economicsParams = (state: CommonStoreState) => state.economicsParams;\r\n\r\n// genetic algorithms and particle swarm optimization\r\n\r\nexport const fittestIndividualResults = (state: CommonStoreState) => state.fittestIndividualResults;\r\n\r\nexport const setFittestIndividualResults = (state: CommonStoreState) => state.setFittestIndividualResults;\r\n\r\nexport const variableLabels = (state: CommonStoreState) => state.variableLabels;\r\n\r\nexport const setVariableLabels = (state: CommonStoreState) => state.setVariableLabels;\r\n\r\nexport const evolutionaryAlgorithmState = (state: CommonStoreState) => state.evolutionaryAlgorithmState;\r\n\r\nexport const solarPanelArrayLayoutConstraints = (state: CommonStoreState) => state.solarPanelArrayLayoutConstraints;\r\n\r\nexport const geneticAlgorithmWizardSelectedTab = (state: CommonStoreState) => state.geneticAlgorithmWizardSelectedTab;\r\n\r\nexport const particleSwarmOptimizationWizardSelectedTab = (state: CommonStoreState) =>\r\n state.particleSwarmOptimizationWizardSelectedTab;\r\n\r\nexport const setPrimitiveStore = (state: PrimitiveStoreState) => state.setPrimitiveStore;\r\n\r\nexport * as viewState from './viewState';\r\n\r\nexport * as world from './world';\r\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Line } from '@react-three/drei';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { GRID_RATIO, FINE_GRID_SCALE, NORMAL_GRID_SCALE } from '../constants';\nimport { Euler, Vector3 } from 'three';\n\ninterface ElementGridProps {\n hx: number;\n hy: number;\n hz: number;\n position?: Vector3;\n rotation?: Euler;\n}\n\nexport const ElementGrid = React.memo(({ hx, hy, hz, position, rotation }: ElementGridProps) => {\n const enableFineGrid = useStore(Selector.enableFineGrid);\n const groundImage = useStore(Selector.viewState.groundImage);\n const lineColor = groundImage ? '#888888' : '#444444';\n\n const maxSize = Math.max(hx, hy);\n const [step, setStep] = useState(Math.floor(maxSize / 50) + 1);\n const [lineWidth, setLineWidth] = useState(0.5);\n\n useEffect(() => {\n if (enableFineGrid) {\n setStep((Math.floor(maxSize / 25) + 1) * FINE_GRID_SCALE);\n setLineWidth(groundImage ? 0.05 : 0.1);\n } else {\n setStep((Math.floor(maxSize / 25) + 1) * NORMAL_GRID_SCALE);\n setLineWidth((groundImage ? 0.05 : 0.1) * GRID_RATIO);\n }\n }, [enableFineGrid, maxSize]);\n\n const pointsX = useMemo(() => {\n const p: number[] = [0];\n for (let i = step; i <= hx; i += step) {\n p.push(i);\n p.push(-i);\n }\n return p;\n }, [step, hx]);\n\n const pointsY = useMemo(() => {\n const p: number[] = [0];\n for (let i = step; i <= hy; i += step) {\n p.push(i);\n p.push(-i);\n }\n return p;\n }, [step, hy]);\n\n return (\n \n {pointsX.map((value) => {\n return (\n \n );\n })}\n {pointsY.map((value) => {\n return (\n \n );\n })}\n \n );\n});\n\nexport default React.memo(ElementGrid);\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Mesh } from 'three';\r\nimport { Box } from '@react-three/drei';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ResizeHandleType } from 'src/types';\r\nimport * as Selector from 'src/stores/selector';\r\n\r\ninterface WindowResizeHandleProps {\r\n x: number;\r\n z: number;\r\n handleType: ResizeHandleType;\r\n scale?: number[];\r\n}\r\n\r\nexport const WINDOW_RESIZE_HANDLE_SIZE = 0.2;\r\n\r\nconst WindowResizeHandle = ({ x, z, handleType, scale = [1, 1, 1] }: WindowResizeHandleProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n\r\n const handleRef = useRef();\r\n\r\n const [color, setColor] = useState('white');\r\n\r\n const [a, b, c] = scale;\r\n\r\n useEffect(() => {\r\n if (resizeHandleType === handleType) {\r\n setColor('red');\r\n } else {\r\n setColor('white');\r\n }\r\n }, [resizeHandleType]);\r\n\r\n return (\r\n {\r\n setColor('red');\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handleType;\r\n });\r\n }}\r\n onPointerLeave={() => {\r\n if (resizeHandleType === null) {\r\n setColor('white');\r\n }\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WindowResizeHandle);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Mesh } from 'three';\r\nimport { Sphere } from '@react-three/drei';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { MoveHandleType } from 'src/types';\r\n\r\ninterface WindowMoveHandleProps {\r\n handleType: MoveHandleType;\r\n}\r\n\r\nconst WindowMoveHandle = ({ handleType }: WindowMoveHandleProps) => {\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n\r\n const handleRef = useRef();\r\n\r\n const [color, setColor] = useState('white');\r\n\r\n useEffect(() => {\r\n if (moveHandleType === MoveHandleType.Mid) {\r\n setColor('red');\r\n } else {\r\n setColor('white');\r\n }\r\n }, [moveHandleType]);\r\n\r\n return (\r\n {\r\n setColor('red');\r\n }}\r\n onPointerLeave={() => {\r\n if (moveHandleType === null) {\r\n setColor('white');\r\n }\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WindowMoveHandle);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport create from 'zustand';\r\nimport { DesignProblem } from '../types';\r\n\r\n// avoid using undefined value in the store for now.\r\nexport interface PrimitiveStoreState {\r\n setPrimitiveStore: (key: K, val: V) => void;\r\n\r\n changed: boolean;\r\n setChanged: (b: boolean) => void;\r\n skipChange: boolean;\r\n setSkipChange: (b: boolean) => void;\r\n\r\n waiting: boolean;\r\n\r\n showEconomicsPanel: boolean;\r\n showNavigationPanel: boolean;\r\n\r\n saveCloudFileFlag: boolean;\r\n setSaveCloudFileFlag: (b: boolean) => void;\r\n listCloudFilesFlag: boolean;\r\n saveLocalFileDialogVisible: boolean;\r\n\r\n modelsMapFlag: boolean;\r\n leaderboardFlag: boolean;\r\n showLeaderboard: boolean;\r\n publishOnModelsMapFlag: boolean;\r\n modelsMapWeatherStations: boolean;\r\n\r\n createProjectFlag: boolean;\r\n saveProjectFlag: boolean;\r\n curateDesignToProjectFlag: boolean;\r\n showProjectsFlag: boolean;\r\n updateProjectsFlag: boolean;\r\n showProjectListPanel: boolean;\r\n projectImagesUpdateFlag: boolean;\r\n\r\n // These stores the settings from createNewProjectDialog.tsx, because we don't want to overwrite\r\n // the local state in the common store yet. Don't be confused with commonStore's projectInfo.\r\n projectType: DesignProblem;\r\n projectTitle: string | null;\r\n projectDescription: string | null;\r\n\r\n userCount: number;\r\n showCloudFilePanel: boolean;\r\n openModelsMap: boolean;\r\n showModelsGallery: boolean;\r\n showAccountSettingsPanel: boolean;\r\n showLikesPanel: boolean;\r\n showPublishedModelsPanel: boolean;\r\n\r\n animateSun: boolean;\r\n\r\n simulationInProgress: boolean;\r\n simulationPaused: boolean;\r\n evolutionInProgress: boolean;\r\n evolutionPaused: boolean;\r\n\r\n runEvolution: boolean;\r\n pauseEvolution: boolean;\r\n objectiveEvaluationIndex: number; // index for evaluating objective function in genetic algorithms\r\n\r\n runDailyThermalSimulation: boolean;\r\n pauseDailyThermalSimulation: boolean;\r\n runYearlyThermalSimulation: boolean;\r\n pauseYearlyThermalSimulation: boolean;\r\n clearDailySimulationResultsFlag: boolean;\r\n clearYearlySimulationResultsFlag: boolean;\r\n\r\n runDynamicSimulation: boolean;\r\n runStaticSimulation: boolean;\r\n pauseSimulation: boolean;\r\n\r\n runDailySimulationForParabolicDishes: boolean;\r\n runYearlySimulationForParabolicDishes: boolean;\r\n pauseDailySimulationForParabolicDishes: boolean;\r\n pauseYearlySimulationForParabolicDishes: boolean;\r\n\r\n runDailySimulationForParabolicTroughs: boolean;\r\n runYearlySimulationForParabolicTroughs: boolean;\r\n pauseDailySimulationForParabolicTroughs: boolean;\r\n pauseYearlySimulationForParabolicTroughs: boolean;\r\n\r\n runDailySimulationForFresnelReflectors: boolean;\r\n runYearlySimulationForFresnelReflectors: boolean;\r\n pauseDailySimulationForFresnelReflectors: boolean;\r\n pauseYearlySimulationForFresnelReflectors: boolean;\r\n\r\n runDailySimulationForHeliostats: boolean;\r\n runYearlySimulationForHeliostats: boolean;\r\n pauseDailySimulationForHeliostats: boolean;\r\n pauseYearlySimulationForHeliostats: boolean;\r\n\r\n runSolarPanelVisibilityAnalysis: boolean;\r\n runDailySimulationForSolarPanels: boolean;\r\n pauseDailySimulationForSolarPanels: boolean;\r\n runYearlySimulationForSolarPanels: boolean;\r\n pauseYearlySimulationForSolarPanels: boolean;\r\n runDailySimulationForSolarPanelsLastStep: boolean;\r\n runYearlySimulationForSolarPanelsLastStep: boolean;\r\n\r\n runDailyLightSensor: boolean;\r\n pauseDailyLightSensor: boolean;\r\n runYearlyLightSensor: boolean;\r\n pauseYearlyLightSensor: boolean;\r\n\r\n runDailySimulationForUpdraftTower: boolean;\r\n runYearlySimulationForUpdraftTower: boolean;\r\n pauseDailySimulationForUpdraftTower: boolean;\r\n pauseYearlySimulationForUpdraftTower: boolean;\r\n\r\n flagOfDailySimulation: boolean; // used as a flag to notify that daily results are ready\r\n\r\n showSolarRadiationHeatmap: boolean;\r\n showHeatFluxes: boolean;\r\n\r\n duringCameraInteraction: boolean;\r\n\r\n navigationMoveSpeed: number;\r\n navigationTurnSpeed: number;\r\n\r\n // element being deleted by esc when adding\r\n elementBeingCanceledId: string | null;\r\n\r\n showWallIntersectionPlaneId: string | null;\r\n\r\n oldParentId: string | null;\r\n oldFoundationId: string | null | undefined;\r\n\r\n // used for listen to auto deletion\r\n selectedElementId: string | null;\r\n\r\n foundationMovedFlag: boolean;\r\n updateFoundationMovedFlag: () => void;\r\n\r\n isCameraUnderGround: boolean;\r\n}\r\n\r\nexport const usePrimitiveStore = create((set, get) => {\r\n return {\r\n setPrimitiveStore(key, val) {\r\n set((state) => {\r\n if (state[key] !== undefined) {\r\n state[key] = val;\r\n } else {\r\n console.error(`key ${key} is not defined in PrimitiveStoreState`);\r\n }\r\n });\r\n },\r\n\r\n changed: false,\r\n setChanged(b) {\r\n set((state: PrimitiveStoreState) => {\r\n state.changed = b;\r\n });\r\n },\r\n skipChange: true,\r\n setSkipChange(b) {\r\n set((state: PrimitiveStoreState) => {\r\n state.skipChange = b;\r\n });\r\n },\r\n\r\n waiting: false,\r\n\r\n showEconomicsPanel: false,\r\n showNavigationPanel: false,\r\n\r\n saveCloudFileFlag: false,\r\n setSaveCloudFileFlag(b) {\r\n set((state) => {\r\n state.saveCloudFileFlag = b;\r\n });\r\n },\r\n listCloudFilesFlag: false,\r\n saveLocalFileDialogVisible: false,\r\n\r\n modelsMapFlag: false,\r\n leaderboardFlag: false,\r\n showLeaderboard: false,\r\n publishOnModelsMapFlag: false,\r\n modelsMapWeatherStations: false,\r\n\r\n createProjectFlag: false,\r\n saveProjectFlag: false,\r\n curateDesignToProjectFlag: false,\r\n showProjectsFlag: false,\r\n updateProjectsFlag: false,\r\n showProjectListPanel: false,\r\n projectImagesUpdateFlag: false,\r\n projectType: DesignProblem.SOLAR_PANEL_ARRAY,\r\n projectTitle: null,\r\n projectDescription: null,\r\n\r\n userCount: 0,\r\n showCloudFilePanel: false,\r\n openModelsMap: false,\r\n showModelsGallery: false,\r\n showAccountSettingsPanel: false,\r\n showLikesPanel: false,\r\n showPublishedModelsPanel: false,\r\n\r\n animateSun: false,\r\n\r\n simulationInProgress: false,\r\n simulationPaused: false,\r\n evolutionInProgress: false,\r\n evolutionPaused: false,\r\n\r\n runEvolution: false,\r\n pauseEvolution: false,\r\n objectiveEvaluationIndex: 0,\r\n\r\n runDailyThermalSimulation: false,\r\n pauseDailyThermalSimulation: false,\r\n runYearlyThermalSimulation: false,\r\n pauseYearlyThermalSimulation: false,\r\n clearDailySimulationResultsFlag: false,\r\n clearYearlySimulationResultsFlag: false,\r\n\r\n runDynamicSimulation: false,\r\n runStaticSimulation: false,\r\n pauseSimulation: false,\r\n\r\n runDailySimulationForParabolicDishes: false,\r\n runYearlySimulationForParabolicDishes: false,\r\n pauseDailySimulationForParabolicDishes: false,\r\n pauseYearlySimulationForParabolicDishes: false,\r\n\r\n runDailySimulationForParabolicTroughs: false,\r\n runYearlySimulationForParabolicTroughs: false,\r\n pauseDailySimulationForParabolicTroughs: false,\r\n pauseYearlySimulationForParabolicTroughs: false,\r\n\r\n runDailySimulationForFresnelReflectors: false,\r\n runYearlySimulationForFresnelReflectors: false,\r\n pauseDailySimulationForFresnelReflectors: false,\r\n pauseYearlySimulationForFresnelReflectors: false,\r\n\r\n runDailySimulationForHeliostats: false,\r\n runYearlySimulationForHeliostats: false,\r\n pauseDailySimulationForHeliostats: false,\r\n pauseYearlySimulationForHeliostats: false,\r\n\r\n runSolarPanelVisibilityAnalysis: false,\r\n runDailySimulationForSolarPanels: false,\r\n pauseDailySimulationForSolarPanels: false,\r\n runYearlySimulationForSolarPanels: false,\r\n pauseYearlySimulationForSolarPanels: false,\r\n runDailySimulationForSolarPanelsLastStep: false,\r\n runYearlySimulationForSolarPanelsLastStep: false,\r\n\r\n runDailyLightSensor: false,\r\n pauseDailyLightSensor: false,\r\n runYearlyLightSensor: false,\r\n pauseYearlyLightSensor: false,\r\n\r\n runDailySimulationForUpdraftTower: false,\r\n runYearlySimulationForUpdraftTower: false,\r\n pauseDailySimulationForUpdraftTower: false,\r\n pauseYearlySimulationForUpdraftTower: false,\r\n\r\n flagOfDailySimulation: false,\r\n\r\n showSolarRadiationHeatmap: false,\r\n showHeatFluxes: false,\r\n\r\n duringCameraInteraction: false,\r\n\r\n navigationMoveSpeed: 3,\r\n navigationTurnSpeed: 3,\r\n\r\n elementBeingCanceledId: null,\r\n\r\n showWallIntersectionPlaneId: null,\r\n\r\n oldParentId: null,\r\n oldFoundationId: null,\r\n\r\n selectedElementId: null,\r\n\r\n foundationMovedFlag: false,\r\n updateFoundationMovedFlag() {\r\n set((state) => {\r\n state.foundationMovedFlag = !state.foundationMovedFlag;\r\n });\r\n },\r\n\r\n isCameraUnderGround: false,\r\n };\r\n});\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport create from 'zustand';\nimport { DatumEntry } from '../types';\nimport { Vantage } from '../analysis/Vantage';\nimport { Util } from '../Util';\nimport { useStore } from './common';\nimport { usePrimitiveStore } from './commonPrimitive';\nimport { Vector3 } from 'three';\n\nexport interface DataStoreState {\n dailyLightSensorData: DatumEntry[];\n setDailyLightSensorData: (data: DatumEntry[]) => void;\n yearlyLightSensorData: DatumEntry[];\n setYearlyLightSensorData: (data: DatumEntry[]) => void;\n sensorLabels: string[];\n setSensorLabels: (labels: string[]) => void;\n\n dailyPvYield: DatumEntry[];\n setDailyPvYield: (data: DatumEntry[]) => void;\n sumDailyPvYield: () => number;\n getDailyPvProfit: () => number;\n yearlyPvYield: DatumEntry[];\n setYearlyPvYield: (data: DatumEntry[]) => void;\n sumYearlyPvYield: () => number;\n getYearlyPvProfit: () => number;\n solarPanelLabels: string[];\n setSolarPanelLabels: (labels: string[]) => void;\n solarPanelVisibilityResults: Map>;\n setSolarPanelVisibilityResult: (vantage: Vantage, result: Map) => void;\n clearSolarPanelVisibilityResults: () => void;\n\n dailyParabolicDishYield: DatumEntry[];\n setDailyParabolicDishYield: (data: DatumEntry[]) => void;\n sumDailyParabolicDishYield: () => number;\n yearlyParabolicDishYield: DatumEntry[];\n setYearlyParabolicDishYield: (data: DatumEntry[]) => void;\n sumYearlyParabolicDishYield: () => number;\n parabolicDishLabels: string[];\n setParabolicDishLabels: (labels: string[]) => void;\n\n dailyParabolicTroughYield: DatumEntry[];\n setDailyParabolicTroughYield: (data: DatumEntry[]) => void;\n sumDailyParabolicTroughYield: () => number;\n yearlyParabolicTroughYield: DatumEntry[];\n setYearlyParabolicTroughYield: (data: DatumEntry[]) => void;\n sumYearlyParabolicTroughYield: () => number;\n parabolicTroughLabels: string[];\n setParabolicTroughLabels: (labels: string[]) => void;\n\n dailyFresnelReflectorYield: DatumEntry[];\n setDailyFresnelReflectorYield: (data: DatumEntry[]) => void;\n sumDailyFresnelReflectorYield: () => number;\n yearlyFresnelReflectorYield: DatumEntry[];\n setYearlyFresnelReflectorYield: (data: DatumEntry[]) => void;\n sumYearlyFresnelReflectorYield: () => number;\n fresnelReflectorLabels: string[];\n setFresnelReflectorLabels: (labels: string[]) => void;\n\n dailyHeliostatYield: DatumEntry[];\n setDailyHeliostatYield: (data: DatumEntry[]) => void;\n sumDailyHeliostatYield: () => number;\n yearlyHeliostatYield: DatumEntry[];\n setYearlyHeliostatYield: (data: DatumEntry[]) => void;\n sumYearlyHeliostatYield: () => number;\n heliostatLabels: string[];\n setHeliostatLabels: (labels: string[]) => void;\n\n dailyUpdraftTowerResults: DatumEntry[];\n dailyUpdraftTowerYield: DatumEntry[];\n setDailyUpdraftTowerResults: (data: DatumEntry[]) => void;\n setDailyUpdraftTowerYield: (data: DatumEntry[]) => void;\n sumDailyUpdraftTowerYield: () => number;\n yearlyUpdraftTowerYield: DatumEntry[];\n setYearlyUpdraftTowerYield: (data: DatumEntry[]) => void;\n sumYearlyUpdraftTowerYield: () => number;\n updraftTowerLabels: string[];\n setUpdraftTowerLabels: (labels: string[]) => void;\n\n // store the calculated heat map on the surface of an element\n heatmaps: Map;\n setHeatmap: (id: string, data: number[][]) => void;\n getHeatmap: (id: string) => number[][] | undefined;\n clearHeatmaps: () => void;\n\n // store the calculated hourly heat exchange result between inside and outside through an element of a building\n hourlyHeatExchangeArrayMap: Map;\n setHourlyHeatExchangeArray: (id: string, data: number[]) => void;\n\n // store the calculated results for hourly solar heat gains of a building through windows\n hourlySolarHeatGainArrayMap: Map;\n setHourlySolarHeatGainArray: (id: string, data: number[]) => void;\n\n // store the calculated results for hourly solar panel outputs of a building through windows\n hourlySolarPanelOutputArrayMap: Map;\n setHourlySolarPanelOutputArray: (id: string, data: number[]) => void;\n\n // for logger: store the calculated total heater, AC, and solar panel results of building energy analysis\n totalBuildingHeater: number;\n setTotalBuildingHeater: (heater: number) => void;\n totalBuildingAc: number;\n setTotalBuildingAc: (ac: number) => void;\n totalBuildingSolarPanel: number;\n setTotalBuildingSolarPanel: (solarPanel: number) => void;\n\n roofSegmentVerticesMap: Map; // key: roofId, val: [segmentIndex][vertex]\n setRoofSegmentVertices: (id: string, vertices: Vector3[][]) => void;\n getRoofSegmentVertices: (id: string) => Vector3[][] | undefined;\n deleteRoofSegmentVertices: (id: string) => void;\n\n roofSegmentVerticesWithoutOverhangMap: Map; // key: roofId, val: [segmentIndex][vertex]\n setRoofSegmentVerticesWithoutOverhang: (id: string, vertices: Vector3[][]) => void;\n getRoofSegmentVerticesWithoutOverhang: (id: string) => Vector3[][] | undefined;\n deleteRoofSegmentVerticesWithoutOverhang: (id: string) => void;\n\n clearDataStore: () => void;\n clearRoofVerticesMap: () => void;\n}\n\nexport const useDataStore = create((set, get) => {\n return {\n roofSegmentVerticesMap: new Map(),\n setRoofSegmentVertices(id, vertices) {\n // this set doesn't mutate map, so it won't cause re-render. But its value is updated when we are using it.\n set((state) => {\n state.roofSegmentVerticesMap.set(id, [...vertices]);\n });\n },\n getRoofSegmentVertices(id) {\n return get().roofSegmentVerticesMap.get(id);\n },\n deleteRoofSegmentVertices(id) {\n set((state) => {\n state.roofSegmentVerticesMap.delete(id);\n });\n },\n\n roofSegmentVerticesWithoutOverhangMap: new Map(),\n setRoofSegmentVerticesWithoutOverhang(id, vertices) {\n // this set mutate map, so it won't cause re-render. But its value is updated when we are using it.\n set((state) => {\n state.roofSegmentVerticesWithoutOverhangMap.set(id, vertices);\n });\n },\n getRoofSegmentVerticesWithoutOverhang(id) {\n return get().roofSegmentVerticesWithoutOverhangMap.get(id);\n },\n deleteRoofSegmentVerticesWithoutOverhang(id) {\n set((state) => {\n state.roofSegmentVerticesWithoutOverhangMap.delete(id);\n });\n },\n\n dailyLightSensorData: [],\n setDailyLightSensorData(data) {\n set((state) => {\n state.dailyLightSensorData = [...data];\n });\n },\n yearlyLightSensorData: [],\n setYearlyLightSensorData(data) {\n set((state) => {\n state.yearlyLightSensorData = [...data];\n });\n },\n sensorLabels: [],\n setSensorLabels(labels) {\n set((state) => {\n state.sensorLabels = [...labels];\n });\n },\n\n dailyPvYield: [],\n setDailyPvYield(data) {\n set((state) => {\n state.dailyPvYield = [...data];\n });\n // increment the index of objective evaluation to notify the genetic algorithm that\n // this simulation has completed and the result has been reported to the common store\n usePrimitiveStore.setState((state) => {\n if (state.runEvolution) {\n state.objectiveEvaluationIndex++;\n }\n });\n },\n sumDailyPvYield() {\n let sum = 0;\n for (const datum of this.dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n getDailyPvProfit() {\n const dailyYield = this.sumDailyPvYield();\n const solarPanelNumber = Util.countAllSolarPanels();\n return (\n dailyYield * useStore.getState().economicsParams.electricitySellingPrice -\n solarPanelNumber * useStore.getState().economicsParams.operationalCostPerUnit\n );\n },\n yearlyPvYield: [],\n setYearlyPvYield(data) {\n set((state) => {\n state.yearlyPvYield = [...data];\n });\n // increment the index of objective evaluation to notify the genetic algorithm that\n // this simulation has completed and the result has been reported to the common store\n usePrimitiveStore.setState((state) => {\n if (state.runEvolution) {\n state.objectiveEvaluationIndex++;\n }\n });\n },\n sumYearlyPvYield() {\n let sum = 0;\n for (const datum of this.yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n const yearScaleFactor = 12 / (useStore.getState().world?.daysPerYear ?? 6);\n return sum * yearScaleFactor;\n },\n getYearlyPvProfit() {\n const solarPanelNumber = Util.countAllSolarPanels();\n const yearlyYield = this.sumYearlyPvYield();\n return (\n yearlyYield * useStore.getState().economicsParams.electricitySellingPrice -\n solarPanelNumber * useStore.getState().economicsParams.operationalCostPerUnit * 365\n );\n },\n solarPanelLabels: [],\n setSolarPanelLabels(labels) {\n set((state) => {\n state.solarPanelLabels = [...labels];\n });\n },\n solarPanelVisibilityResults: new Map>(),\n setSolarPanelVisibilityResult(vantage, result) {\n set((state) => {\n state.solarPanelVisibilityResults.set(vantage, result);\n });\n },\n clearSolarPanelVisibilityResults() {\n set((state) => {\n // must create a new map in order for the dependency on it to change for re-rendering\n state.solarPanelVisibilityResults = new Map>();\n });\n },\n\n dailyParabolicDishYield: [],\n setDailyParabolicDishYield(data) {\n set((state) => {\n state.dailyParabolicDishYield = [...data];\n });\n },\n sumDailyParabolicDishYield() {\n let sum = 0;\n for (const datum of this.dailyParabolicDishYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyParabolicDishYield: [],\n setYearlyParabolicDishYield(data) {\n set((state) => {\n state.yearlyParabolicDishYield = [...data];\n });\n },\n sumYearlyParabolicDishYield() {\n let sum = 0;\n for (const datum of this.yearlyParabolicDishYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n parabolicDishLabels: [],\n setParabolicDishLabels(labels) {\n set((state) => {\n state.parabolicDishLabels = [...labels];\n });\n },\n\n dailyParabolicTroughYield: [],\n setDailyParabolicTroughYield(data) {\n set((state) => {\n state.dailyParabolicTroughYield = [...data];\n });\n },\n sumDailyParabolicTroughYield() {\n let sum = 0;\n for (const datum of this.dailyParabolicTroughYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyParabolicTroughYield: [],\n setYearlyParabolicTroughYield(data) {\n set((state) => {\n state.yearlyParabolicTroughYield = [...data];\n });\n },\n sumYearlyParabolicTroughYield() {\n let sum = 0;\n for (const datum of this.yearlyParabolicTroughYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n parabolicTroughLabels: [],\n setParabolicTroughLabels(labels) {\n set((state) => {\n state.parabolicTroughLabels = [...labels];\n });\n },\n\n dailyFresnelReflectorYield: [],\n setDailyFresnelReflectorYield(data) {\n set((state) => {\n state.dailyFresnelReflectorYield = [...data];\n });\n },\n sumDailyFresnelReflectorYield() {\n let sum = 0;\n for (const datum of this.dailyFresnelReflectorYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyFresnelReflectorYield: [],\n setYearlyFresnelReflectorYield(data) {\n set((state) => {\n state.yearlyFresnelReflectorYield = [...data];\n });\n },\n sumYearlyFresnelReflectorYield() {\n let sum = 0;\n for (const datum of this.yearlyFresnelReflectorYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n fresnelReflectorLabels: [],\n setFresnelReflectorLabels(labels) {\n set((state) => {\n state.fresnelReflectorLabels = [...labels];\n });\n },\n\n dailyHeliostatYield: [],\n setDailyHeliostatYield(data) {\n set((state) => {\n state.dailyHeliostatYield = [...data];\n });\n },\n sumDailyHeliostatYield() {\n let sum = 0;\n for (const datum of this.dailyHeliostatYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyHeliostatYield: [],\n setYearlyHeliostatYield(data) {\n set((state) => {\n state.yearlyHeliostatYield = [...data];\n });\n },\n sumYearlyHeliostatYield() {\n let sum = 0;\n for (const datum of this.yearlyHeliostatYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n heliostatLabels: [],\n setHeliostatLabels(labels) {\n set((state) => {\n state.heliostatLabels = [...labels];\n });\n },\n\n dailyUpdraftTowerResults: [],\n dailyUpdraftTowerYield: [],\n setDailyUpdraftTowerResults(data) {\n set((state) => {\n state.dailyUpdraftTowerResults = [...data];\n });\n },\n setDailyUpdraftTowerYield(data) {\n set((state) => {\n state.dailyUpdraftTowerYield = [...data];\n });\n },\n sumDailyUpdraftTowerYield() {\n let sum = 0;\n for (const datum of this.dailyUpdraftTowerYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyUpdraftTowerYield: [],\n setYearlyUpdraftTowerYield(data) {\n set((state) => {\n state.yearlyUpdraftTowerYield = [...data];\n });\n },\n sumYearlyUpdraftTowerYield() {\n let sum = 0;\n for (const datum of this.yearlyUpdraftTowerYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n updraftTowerLabels: [],\n setUpdraftTowerLabels(labels) {\n set((state) => {\n state.updraftTowerLabels = [...labels];\n });\n },\n\n heatmaps: new Map(),\n setHeatmap(id, data) {\n set((state) => {\n state.heatmaps.set(id, data);\n });\n },\n getHeatmap(id) {\n return get().heatmaps.get(id);\n },\n\n hourlyHeatExchangeArrayMap: new Map(),\n setHourlyHeatExchangeArray(id, data) {\n set((state) => {\n state.hourlyHeatExchangeArrayMap.set(id, data);\n });\n },\n\n hourlySolarHeatGainArrayMap: new Map(),\n setHourlySolarHeatGainArray(id, data) {\n set((state) => {\n state.hourlySolarHeatGainArrayMap.set(id, data);\n });\n },\n\n hourlySolarPanelOutputArrayMap: new Map(),\n setHourlySolarPanelOutputArray(id, data) {\n set((state) => {\n state.hourlySolarPanelOutputArrayMap.set(id, data);\n });\n },\n\n totalBuildingHeater: 0,\n setTotalBuildingHeater: (heater: number) => {\n set((state) => {\n state.totalBuildingHeater = heater;\n });\n },\n\n totalBuildingAc: 0,\n setTotalBuildingAc: (ac: number) => {\n set((state) => {\n state.totalBuildingAc = ac;\n });\n },\n\n totalBuildingSolarPanel: 0,\n setTotalBuildingSolarPanel: (solarPanel: number) => {\n set((state) => {\n state.totalBuildingSolarPanel = solarPanel;\n });\n },\n\n clearHeatmaps() {\n set((state) => {\n state.heatmaps.clear();\n });\n },\n\n clearDataStore() {\n set((state) => {\n // create a new empty map in the following\n // do not just clear it as it may not trigger re-rendering\n\n state.heatmaps = new Map();\n state.hourlyHeatExchangeArrayMap = new Map();\n state.hourlySolarHeatGainArrayMap = new Map();\n state.hourlySolarPanelOutputArrayMap = new Map();\n state.solarPanelVisibilityResults = new Map>();\n\n // create a new empty array in the following\n // do not just set the length to zero as it will not trigger re-rendering\n\n state.dailyLightSensorData = [];\n state.yearlyLightSensorData = [];\n state.sensorLabels = [];\n\n state.dailyPvYield = [];\n state.yearlyPvYield = [];\n state.solarPanelLabels = [];\n\n state.dailyParabolicDishYield = [];\n state.yearlyParabolicDishYield = [];\n state.parabolicDishLabels = [];\n\n state.dailyParabolicTroughYield = [];\n state.yearlyParabolicTroughYield = [];\n state.parabolicTroughLabels = [];\n\n state.dailyFresnelReflectorYield = [];\n state.yearlyFresnelReflectorYield = [];\n state.fresnelReflectorLabels = [];\n\n state.dailyHeliostatYield = [];\n state.yearlyHeliostatYield = [];\n state.heliostatLabels = [];\n\n state.dailyUpdraftTowerYield = [];\n state.dailyUpdraftTowerResults = [];\n state.yearlyUpdraftTowerYield = [];\n state.updraftTowerLabels = [];\n });\n },\n clearRoofVerticesMap() {\n set((state) => {\n state.roofSegmentVerticesMap.clear();\n state.roofSegmentVerticesWithoutOverhangMap.clear();\n });\n },\n };\n});\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEASwzc1iU9gAAABRJREFUCJlj/P//PwMSYGJABaTyAer2AwfmvmPmAAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/roof_01.1418beb1.png\";","export default __webpack_public_path__ + \"static/media/roof_02.055d6e06.png\";","export default __webpack_public_path__ + \"static/media/roof_03.1d45e089.png\";","export default __webpack_public_path__ + \"static/media/roof_04.20dee2dd.png\";","export default __webpack_public_path__ + \"static/media/roof_05.34757ec1.png\";","export default __webpack_public_path__ + \"static/media/roof_06.0fce42da.png\";","export default __webpack_public_path__ + \"static/media/roof_07.d0b809f8.png\";","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef } from 'react';\nimport { CatmullRomCurve3, EllipseCurve, Euler, FrontSide, MeshStandardMaterial, Shape, Vector3 } from 'three';\nimport { Box, Cone, Cylinder, Extrude, Line, Plane } from '@react-three/drei';\nimport { useStore } from 'src/stores/common';\nimport * as Selector from 'src/stores/selector';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { FrameDataType, MullionDataType, Shutter, WireframeDataType } from './window';\nimport { Util } from '../../Util';\nimport { useDataStore } from '../../stores/commonData';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface ArchedWindowProps {\n id: string;\n dimension: number[];\n position: number[];\n mullionData: MullionDataType;\n frameData: FrameDataType;\n wireframeData: WireframeDataType;\n leftShutter: boolean;\n rightShutter: boolean;\n shutterColor: string;\n shutterWidth: number;\n glassMaterial: JSX.Element;\n showHeatFluxes: boolean;\n area: number;\n empty: boolean;\n interior: boolean;\n foundation: FoundationModel | null;\n}\n\ninterface MullionProps {\n dimension: number[];\n mullionData: MullionDataType;\n shadowEnabled: boolean;\n}\n\ninterface FrameProps {\n dimension: number[];\n frameData: FrameDataType;\n shadowEnabled: boolean;\n}\n\ninterface ArchedWireframeProps {\n cy: number;\n dimension: number[];\n wireframeData: WireframeDataType;\n drawBottom?: boolean;\n}\n\ntype ArgsType = [x: number, y: number, z: number];\n\nconst sealPlanesMaterial = new MeshStandardMaterial({ color: 'white', side: FrontSide });\n\nconst Mullion = React.memo(({ dimension, mullionData, shadowEnabled }: MullionProps) => {\n const [lx, ly, lz, archHeight] = dimension;\n const ah = Math.min(archHeight, lz, lx / 2);\n\n const { width, horizontalMullionSpacing, verticalMullionSpacing, color } = mullionData;\n\n const radialSegments = 3;\n const heightSegments = 1;\n const mullionRadius = width / 2;\n const radialMullionAngle = useMemo(() => Math.atan2(lx / 2, ah), [lx, ah]);\n const radialMullionLength = useMemo(() => {\n if (ah === 0 || lx === 0) {\n return 0;\n }\n const r = ah / 2 + lx ** 2 / (8 * ah);\n const a = r - ah;\n const angle = Math.PI - radialMullionAngle;\n const aSquare = a ** 2;\n const bSquare = r ** 2;\n const cSquare =\n aSquare +\n bSquare -\n 2 * aSquare * Math.sin(angle) ** 2 -\n 2 * a * Math.sqrt((bSquare - aSquare * Math.sin(angle) ** 2) * Math.cos(angle) ** 2);\n return Math.sqrt(cSquare);\n }, [lx, ah, radialMullionAngle]);\n\n const material = useMemo(() => , [color]);\n\n const drawArchMullionShape = (radius: number) => {\n return new Shape()\n .moveTo(0, radius)\n .quadraticCurveTo(radius, radius, radius, 0)\n .quadraticCurveTo(radius, -radius, 0, -radius)\n .quadraticCurveTo(-radius, -radius, -radius, 0)\n .quadraticCurveTo(-radius, radius, 0, radius);\n };\n\n const drawArchMullionPath = (ah: number, x: number) => {\n const h = (ah * x) / (lx / 2);\n const r = h / 2 + (x * 2) ** 2 / (8 * h);\n const startAngle = Math.acos(Math.min(1, x / r));\n const endAngle = Math.PI - startAngle;\n const points = new EllipseCurve(0, h - r, r, r, startAngle, endAngle, false, 0)\n .getPoints(24)\n .map((v2) => new Vector3(v2.x, v2.y));\n return new CatmullRomCurve3(points);\n };\n\n const verticalMullions = useMemo(() => {\n const arr: number[] = [];\n const dividers = Math.round(lx / verticalMullionSpacing) - 1;\n if (dividers <= 0 || width === 0) {\n return null;\n }\n const step = lx / (dividers + 1);\n let x = step / 2;\n if (dividers % 2 !== 0) {\n arr.push(0);\n x = step;\n }\n for (let num = 0; num < Math.floor(dividers / 2); num++, x += step) {\n arr.push(x, -x);\n }\n return arr;\n }, [lx, width, verticalMullionSpacing]);\n\n const horizontalMullions = useMemo(() => {\n const arr: number[] = [];\n if (width === 0) {\n return arr;\n }\n const top = lz / 2 - ah; // include\n const totalDist = lz - ah;\n const number = Math.ceil(totalDist / horizontalMullionSpacing);\n let curr = top;\n for (let i = 0; i < number; i++) {\n arr.push(curr);\n curr -= horizontalMullionSpacing;\n }\n return arr;\n }, [lx, lz, ah, width, horizontalMullionSpacing]);\n\n const archMullions = useMemo(() => {\n const arr: number[] = [];\n\n const dividers = Math.round(lx / verticalMullionSpacing) - 1;\n if (dividers <= 0 || width === 0) {\n return null;\n }\n const step = lx / (dividers + 1);\n let x = step / 2;\n if (dividers % 2 !== 0) {\n x = step;\n }\n for (let num = 0; num < Math.floor(dividers / 2); num++, x += step) {\n if (x !== 0) {\n arr.push(x);\n }\n }\n\n const shape = drawArchMullionShape(mullionRadius / 2);\n\n return arr.map((x, idx) => {\n if (ah < lx / 4 && idx % 2 === 1) {\n return null;\n }\n if (ah < lx / 6 && idx % 3 !== 0) {\n return null;\n }\n return { shape, path: drawArchMullionPath(ah, x) };\n });\n }, [lx, lz, ah, width, verticalMullionSpacing]);\n\n const renderRadialMullion = (length: number, angle: number) => {\n return (\n \n \n {material}\n \n \n );\n };\n\n return (\n \n {mullionData.horizontalMullion &&\n horizontalMullions.map((z, index) => (\n \n {material}\n \n ))}\n {mullionData.verticalMullion &&\n verticalMullions?.map((x, index) => (\n \n {material}\n \n ))}\n {ah > 0 &&\n archMullions?.map((item, index) => {\n if (item === null) return null;\n const { shape, path } = item;\n return (\n \n {material}\n \n );\n })}\n {radialMullionLength > 0 && (\n <>\n {renderRadialMullion(ah, 0)}\n {renderRadialMullion(radialMullionLength, radialMullionAngle)}\n {renderRadialMullion(radialMullionLength, -radialMullionAngle)}\n \n )}\n \n );\n});\n\nconst Frame = React.memo(({ dimension, frameData, shadowEnabled }: FrameProps) => {\n const [lx, ly, lz, archHeight] = dimension;\n const hx = lx / 2;\n const ah = Math.min(archHeight, lz, hx);\n\n const { color, width, sillWidth } = frameData;\n const material = useMemo(() => , [color]);\n\n const halfWidth = width / 2;\n const depth = halfWidth / 2;\n const sillLength = lx + width * 3;\n const sillThickness = width;\n\n const archedFrameShape = useMemo(() => {\n const [x1, x2] = [hx + width, hx];\n\n const h1 = ah + width;\n const r1 = h1 / 2 + (x1 * 2) ** 2 / (8 * h1);\n const startAngle1 = Math.acos(Math.min(1, x1 / r1));\n const endAngle1 = Math.PI - startAngle1;\n const y1 = h1 - r1;\n\n const h2 = ah;\n const r2 = h2 / 2 + (x2 * 2) ** 2 / (8 * h2);\n const startAngle2 = Math.acos(Math.min(1, x2 / r2));\n const endAngle2 = Math.PI - startAngle2;\n const y2 = h2 - r2;\n\n const points1 = new EllipseCurve(0, y1, r1, r1, startAngle1, endAngle1, false, 0).getPoints(36);\n const points2 = new EllipseCurve(0, y2, r2, r2, endAngle2, startAngle2, true, 0).getPoints(36);\n\n return new Shape([...points1, ...points2]);\n }, [archHeight, lz, lx, width]);\n\n return (\n \n {/* top */}\n {ah > 0.1 ? (\n \n {material}\n \n ) : (\n \n {material}\n \n )}\n\n {/* left */}\n \n {material}\n \n\n {/* right */}\n \n {material}\n \n\n {/* bottom */}\n \n {material}\n \n \n );\n});\n\nexport const ArchedWireframe = React.memo(({ cy, dimension, wireframeData, drawBottom }: ArchedWireframeProps) => {\n const [lx, ly, lz, archHeight] = dimension;\n const { lineWidth, lineColor, selected, locked, opacity } = wireframeData;\n\n const thinLine = lineWidth / 20;\n const boldLine = lineWidth / 5;\n\n const hx = lx / 2;\n const hz = lz / 2;\n const ah = Math.min(archHeight, lz, hx);\n\n const radialSegments = 6;\n const heightSegments = 1;\n\n const drawArchedPath = (ah: number, x: number) => {\n const r = ah / 2 + (x * 2) ** 2 / (8 * ah);\n const startAngle = Math.acos(Math.min(1, x / r));\n const endAngle = Math.PI - startAngle;\n const points = new EllipseCurve(0, ah - r, r, r, startAngle, endAngle, false, 0)\n .getPoints(24)\n .map((v2) => new Vector3(v2.x, v2.y));\n return new CatmullRomCurve3(points);\n };\n\n const drawCircleShape = (radius: number) => {\n return new Shape()\n .moveTo(0, radius)\n .quadraticCurveTo(radius, radius, radius, 0)\n .quadraticCurveTo(radius, -radius, 0, -radius)\n .quadraticCurveTo(-radius, -radius, -radius, 0)\n .quadraticCurveTo(-radius, radius, 0, radius);\n };\n\n const material = useMemo(() => new MeshStandardMaterial({ color: lineColor }), [lineColor]);\n const highLightMaterial = useMemo(() => new MeshStandardMaterial({ color: LOCKED_ELEMENT_SELECTION_COLOR }), []);\n\n const renderLines = (width: number, mat: MeshStandardMaterial) => {\n return (\n <>\n {/* top */}\n {ah > 0.1 ? (\n \n ) : (\n \n )}\n\n {/* bottom */}\n {drawBottom && (\n \n )}\n\n {/* right */}\n \n\n {/* left */}\n \n \n );\n };\n\n return (\n \n {opacity > 0 && {renderLines(thinLine, material)}}\n {locked && selected && renderLines(boldLine, highLightMaterial)}\n \n );\n});\n\nconst ArchedWindow = ({\n id,\n dimension,\n position,\n mullionData,\n frameData,\n wireframeData,\n leftShutter,\n rightShutter,\n shutterColor,\n shutterWidth,\n glassMaterial,\n showHeatFluxes,\n area,\n empty,\n interior,\n foundation,\n}: ArchedWindowProps) => {\n const world = useStore.getState().world;\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [lx, ly, lz, archHeight] = dimension;\n const [cx, cy, cz] = position;\n\n const pointWithinArch = (x: number, z: number) => {\n if (archHeight > 0) {\n const hx = 0.5 * lx;\n const hz = 0.5 * lz;\n const ah = Math.min(archHeight, lz, hx); // actual arch height\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\n // check if the point is within the rectangular part\n if (Math.abs(x) < hx && z < hz - ah && z > -hz) {\n return true;\n }\n // check if the point is within the arch part\n const dz = z - (lz - r - hz);\n return x * x + dz * dz < r * r;\n }\n return true;\n };\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes || interior) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinArch(rx, rz)) {\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, intensity, rz));\n vectors.push(v);\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinArch(rx, rz)) {\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, -intensity, rz));\n vectors.push(v);\n }\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const widthShutter = useMemo(() => shutterWidth * lx, [lx, shutterWidth]);\n const heightShutter = useMemo(() => lz - Math.min(archHeight, lz, lx / 2), [lx, lz, archHeight]);\n const shutterPosX = useMemo(\n () => ((widthShutter + frameData.width + lx) / 2) * 1.025,\n [lx, widthShutter, frameData.width],\n );\n const shutterPosZ = useMemo(() => -Math.min(archHeight, lz, lx / 2) / 2, [lz, heightShutter]);\n\n const glassShape = useMemo(() => getArchedWindowShape(lx, lz, archHeight), [lx, lz, archHeight]);\n\n const renderSealPlane = (args: [width: number, height: number], position: ArgsType, rotation?: ArgsType) => (\n \n );\n\n return (\n <>\n {!empty && (\n \n \n \n {glassMaterial}\n \n\n {(mullionData.horizontalMullion || mullionData.verticalMullion) && archHeight !== undefined && (\n \n )}\n \n )}\n\n {frameData.showFrame && }\n\n \n\n \n\n {renderSealPlane([ly, lz], [-lx / 2, ly / 2, 0], [HALF_PI, HALF_PI, 0])}\n {renderSealPlane([ly, lz], [lx / 2, ly / 2, 0], [HALF_PI, -HALF_PI, 0])}\n {/* {renderSealPlane([lx, ly], [0, ly / 2, lz / 2], [Math.PI, 0, 0])} */}\n {renderSealPlane([lx, ly], [0, ly / 2, -lz / 2])}\n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n};\n\nexport const getArchedWindowShape = (lx: number, lz: number, archHeight: number, cx = 0, cy = 0) => {\n const s = new Shape();\n const hx = lx / 2;\n const hz = lz / 2;\n const ah = Math.min(archHeight, lz, hx);\n s.moveTo(cx - hx, cy - hz);\n s.lineTo(cx + hx, cy - hz);\n s.lineTo(cx + hx, cy + hz - ah);\n if (ah > 0.01) {\n const r = ah / 2 + lx ** 2 / (8 * ah);\n const [cX, cY] = [cx, cy + hz - r];\n const startAngle = Math.acos(Math.min(1, hx / r));\n const endAngle = Math.PI - startAngle;\n s.absarc(cX, cY, r, startAngle, endAngle, false);\n } else {\n s.lineTo(cx - hx, cy + hz);\n }\n s.closePath();\n return s;\n};\n\nexport default React.memo(ArchedWindow);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Box, Cone, Cylinder, Extrude, Line, Plane } from '@react-three/drei';\nimport React, { useMemo, useRef } from 'react';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { useStore } from 'src/stores/common';\nimport { DoubleSide, Euler, MeshStandardMaterial, Shape, Vector3 } from 'three';\nimport * as Selector from 'src/stores/selector';\nimport { FrameDataType, Shutter, WireframeDataType } from './window';\nimport { RoofUtil } from '../roof/RoofUtil';\nimport { useDataStore } from '../../stores/commonData';\nimport { Util } from '../../Util';\nimport { Point2 } from '../../models/Point2';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface PolygonalWindowProps {\n id: string;\n dimension: number[];\n position: number[];\n polygonTop: number[];\n glassMaterial: JSX.Element;\n empty: boolean;\n interior: boolean;\n wireframeData: WireframeDataType;\n frameData: FrameDataType;\n leftShutter: boolean;\n rightShutter: boolean;\n shutterColor: string;\n shutterWidth: number;\n area: number;\n showHeatFluxes: boolean;\n foundation: FoundationModel | null;\n}\n\ninterface FrameProps {\n dimension: number[];\n polygonTop: number[];\n frameData: FrameDataType;\n shadowEnabled: boolean;\n}\n\nconst CYLINDER_HEIGHT_SEGMENTS = 1;\nconst CYLINDER_RADIAL_SEGMENTS = 3;\nconst sealPlanesMaterial = new MeshStandardMaterial({ color: 'white', side: DoubleSide });\nconst HALF_PI_Z_EULER = new Euler(0, 0, -HALF_PI);\n\nconst Frame = React.memo(({ dimension, polygonTop, frameData, shadowEnabled }: FrameProps) => {\n const [lx, ly, lz] = dimension;\n const [topX, topH] = polygonTop;\n const { color, width, sillWidth } = frameData;\n const material = useMemo(() => , [color]);\n\n const [hx, hz] = [lx / 2, lz / 2];\n const halfWidth = width / 2;\n const depth = halfWidth / 2;\n const sillLength = lx + width * 3;\n const sillThickness = width;\n\n // from right to left, 2D. length should be 5.\n const innerPoints = useMemo(() => {\n const botRight = new Vector3(hx, -hz);\n const topRight = new Vector3(hx, hz);\n const topLeft = new Vector3(-hx, hz);\n const botLeft = new Vector3(-hx, -hz);\n const topMid = new Vector3(topX * lx, topH + hz);\n return [botRight, topRight, topMid, topLeft, botLeft];\n }, [hx, hz, topX, topH]);\n\n const outerPoints = useMemo(() => {\n const normals: Vector3[] = [];\n for (let i = 1; i < innerPoints.length; i++) {\n const p1 = innerPoints[i - 1];\n const p2 = innerPoints[i];\n const n = new Vector3().subVectors(p2, p1).normalize().applyEuler(HALF_PI_Z_EULER);\n normals.push(n);\n }\n\n const edgesAfterOffset: { start: Vector3; end: Vector3 }[] = [];\n for (let i = 0; i < normals.length; i++) {\n const n = normals[i];\n const offset = n.clone().multiplyScalar(width);\n if (i < innerPoints.length - 1) {\n const p1 = innerPoints[i].clone().add(offset);\n const p2 = innerPoints[i + 1].clone().add(offset);\n edgesAfterOffset.push({ start: p1, end: p2 });\n }\n }\n\n const points: Vector3[] = [];\n points.push(edgesAfterOffset[0].start);\n for (let i = 1; i < edgesAfterOffset.length; i++) {\n const edge1 = edgesAfterOffset[i - 1];\n const edge2 = edgesAfterOffset[i];\n const point = RoofUtil.getIntersectionPoint(edge1.start, edge1.end, edge2.start, edge2.end);\n points.push(point);\n }\n points.push(edgesAfterOffset[edgesAfterOffset.length - 1].end);\n\n return points;\n }, [innerPoints, width]);\n\n const shape = useMemo(() => {\n const s = new Shape();\n for (let i = 0; i < outerPoints.length; i++) {\n const point = outerPoints[i];\n if (i === 0) {\n s.moveTo(point.x, point.y);\n } else {\n s.lineTo(point.x, point.y);\n }\n }\n for (let i = innerPoints.length - 1; i >= 0; i--) {\n const point = innerPoints[i];\n s.lineTo(point.x, point.y);\n }\n s.closePath();\n return s;\n }, [innerPoints, outerPoints]);\n\n return (\n \n \n {material}\n \n {/* bottom */}\n \n {material}\n \n \n );\n});\n\nconst PolygonalWindow = ({\n id,\n dimension,\n polygonTop,\n position,\n glassMaterial,\n empty,\n interior,\n wireframeData,\n frameData,\n leftShutter,\n rightShutter,\n shutterColor,\n shutterWidth,\n area,\n showHeatFluxes,\n foundation,\n}: PolygonalWindowProps) => {\n const world = useStore.getState().world;\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [cx, cy, cz] = position;\n const [lx, ly, lz] = dimension;\n const [hx, hy, hz] = dimension.map((v) => v / 2);\n const [topX, topH] = polygonTop;\n const { lineWidth, lineColor, selected, locked, opacity } = wireframeData;\n\n const absTopX = topX * lx;\n const topRightLength = Math.hypot(topH, hx - absTopX);\n const topRightRotation = Math.asin(topH / topRightLength);\n const topLeftLength = Math.hypot(topH, hx + absTopX);\n const topLeftRotation = -Math.asin(topH / topLeftLength);\n\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n\n const pointWithinPolygon = (x: number, z: number) => {\n const hx = 0.5 * lx;\n const hz = 0.5 * (lz + polygonTop[1]);\n const shiftZ = polygonTop[1];\n const points: Point2[] = [\n { x: -hx, y: -hz } as Point2,\n { x: hx, y: -hz } as Point2,\n { x: hx, y: hz - shiftZ } as Point2,\n { x: lx * polygonTop[0], y: hz } as Point2,\n { x: -hx, y: hz - shiftZ } as Point2,\n ];\n return Util.isPointInside(x, z, points);\n };\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes || interior) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const bz = lz + polygonTop[1];\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(bz / cellSize));\n const dx = lx / nx;\n const dz = bz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n const shiftZ = polygonTop[1] / 2;\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinPolygon(rx, rz)) {\n v.push(new Vector3(rx, 0, rz + shiftZ));\n v.push(new Vector3(rx, intensity, rz + shiftZ));\n vectors.push(v);\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinPolygon(rx, rz)) {\n v.push(new Vector3(rx, 0, rz + shiftZ));\n v.push(new Vector3(rx, -intensity, rz + shiftZ));\n vectors.push(v);\n }\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const shutterLength = useMemo(() => shutterWidth * lx, [lx, shutterWidth]);\n const shutterPosX = useMemo(\n () => ((shutterLength + frameData.width + lx) / 2) * 1.025,\n [lx, shutterLength, frameData.width],\n );\n\n const glassShape = useMemo(() => {\n const [hx, hz] = [lx / 2, lz / 2];\n const tx = topX * lx; // abs\n return getPolygonWindowShape(hx, hz, tx, topH);\n }, [lx, lz, topX, topH]);\n\n const wireframeMaterial = useMemo(() => {\n if (selected && locked) {\n return new MeshStandardMaterial({ color: LOCKED_ELEMENT_SELECTION_COLOR });\n } else {\n return new MeshStandardMaterial({ color: lineColor });\n }\n }, [lineColor, selected, locked]);\n\n const wireframeWidth = useMemo(() => {\n if (locked && selected) {\n return lineWidth / 5;\n } else {\n return lineWidth / 20;\n }\n }, [lineWidth, selected, locked]);\n\n const wireframeCy = useMemo(() => {\n if (locked && selected) {\n return -ly / 2;\n } else {\n return -cy;\n }\n }, [cy, ly, selected, locked]);\n\n const renderWireframeLine = (length: number, offset = 0) => {\n return (\n \n );\n };\n\n const renderSealPlane = (length: number, offset = 0) => {\n return (\n \n );\n };\n\n return (\n <>\n {!empty && (\n \n \n {glassMaterial}\n \n )}\n\n {frameData.showFrame && (\n \n )}\n\n \n\n \n {renderSealPlane(lx)}\n {renderWireframeLine(lx)}\n \n\n \n {renderSealPlane(lz)}\n {renderWireframeLine(lz)}\n \n\n \n {renderSealPlane(lz)}\n {renderWireframeLine(lz)}\n \n\n \n {renderSealPlane(topLeftLength, topLeftLength / 2)}\n {renderWireframeLine(topLeftLength, topLeftLength / 2)}\n \n\n \n {renderSealPlane(topRightLength, -topRightLength / 2)}\n {renderWireframeLine(topRightLength, -topRightLength / 2)}\n \n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n};\n\nexport const getPolygonWindowShape = (hx: number, hy: number, tx: number, th: number, cx = 0, cy = 0) => {\n const shape = new Shape();\n shape.moveTo(cx - hx, cy - hy);\n shape.lineTo(cx + hx, cy - hy);\n shape.lineTo(cx + hx, cy + hy);\n shape.lineTo(cx + tx, cy + hy + th);\n shape.lineTo(cx - hx, cy + hy);\n shape.closePath();\n return shape;\n};\n\nexport default React.memo(PolygonalWindow);\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport { useTransparent } from './hooks';\r\nimport { RoofSegmentProps } from './roofRenderer';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { useStore } from 'src/stores/common';\r\nimport {\r\n BoxBufferGeometry,\r\n CanvasTexture,\r\n Euler,\r\n ExtrudeBufferGeometry,\r\n Float32BufferAttribute,\r\n Mesh,\r\n Texture,\r\n Vector2,\r\n Vector3,\r\n} from 'three';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { Util } from '../../Util';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../../constants';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { Cone, Line } from '@react-three/drei';\r\nimport { Point2 } from '../../models/Point2';\r\nimport { RoofType } from '../../models/RoofModel';\r\nimport { CSG } from 'three-csg-ts';\r\nimport { ObjectType } from 'src/types';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { WindowType } from 'src/models/WindowModel';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { getArchedWindowShape } from '../window/archedWindow';\r\nimport { getPolygonWindowShape } from '../window/polygonalWindow';\r\nimport { FoundationModel } from '../../models/FoundationModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\nimport shallow from 'zustand/shallow';\r\n\r\nexport type WindowData = {\r\n dimension: Vector3;\r\n position: Vector3;\r\n rotation: Euler;\r\n windowType: WindowType;\r\n archHeight: number;\r\n topPosition?: number[];\r\n};\r\n\r\nexport const RoofSegment = ({\r\n id,\r\n index,\r\n foundationModel,\r\n roofType,\r\n segment,\r\n centroid,\r\n thickness,\r\n color,\r\n sideColor,\r\n texture,\r\n heatmap,\r\n windows,\r\n}: {\r\n id: string;\r\n index: number;\r\n foundationModel: FoundationModel | null;\r\n roofType: RoofType;\r\n segment: RoofSegmentProps;\r\n centroid: Vector3;\r\n thickness: number;\r\n color: string;\r\n sideColor: string;\r\n texture: Texture;\r\n heatmap?: CanvasTexture;\r\n windows: WindowModel[];\r\n}) => {\r\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\r\n\r\n const { transparent, opacity } = useTransparent();\r\n\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowLength = useRef();\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const world = useStore.getState().world;\r\n const hourlyHeatExchangeArrayMap = useDataStore.getState().hourlyHeatExchangeArrayMap;\r\n const { points } = segment;\r\n\r\n const overhangLines: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments) return undefined;\r\n const lines: Vector3[][] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness + 0.1);\r\n switch (roofType) {\r\n case RoofType.Hip:\r\n case RoofType.Pyramid:\r\n for (const seg of segments) {\r\n const p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n break;\r\n case RoofType.Mansard:\r\n for (const [i, seg] of segments.entries()) {\r\n if (i === segments.length - 1) continue;\r\n const p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n break;\r\n case RoofType.Gambrel:\r\n for (const [i, seg] of segments.entries()) {\r\n if (i === 0 || i === 3) {\r\n const p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n let p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[3].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n p = [];\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[2].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n break;\r\n }\r\n return lines;\r\n }, [showHeatFluxes]);\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (foundationModel && foundationModel.notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id + '-' + index);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments || !segments[index]) return undefined;\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft, wallLeftAfterOverhang] = points;\r\n const thickness = wallLeftAfterOverhang.z - wallLeft.z;\r\n const s = segments[index].map((v) => v.clone().sub(centroid).add(new Vector3(0, 0, thickness)));\r\n if (!s) return undefined;\r\n const projectedVertices: Point2[] = [];\r\n for (const t of s) {\r\n projectedVertices.push({ x: t.x, y: t.y } as Point2);\r\n }\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const s0 = s[0].clone();\r\n const s1 = s[1].clone();\r\n const s2 = s[2].clone();\r\n const v10 = new Vector3().subVectors(s1, s0);\r\n const v20 = new Vector3().subVectors(s2, s0);\r\n const v21 = new Vector3().subVectors(s2, s1);\r\n const length10 = v10.length();\r\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\r\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\r\n const m = Math.max(2, Math.floor(length10 / cellSize));\r\n const n = Math.max(2, Math.floor(distance / cellSize));\r\n v10.normalize();\r\n v20.normalize();\r\n v21.normalize();\r\n // find the normal vector of the quad\r\n const normal = new Vector3().crossVectors(v20, v21).normalize();\r\n // find the incremental vector going along the bottom edge (half of length)\r\n const dm = v10.multiplyScalar((0.5 * length10) / m);\r\n // find the incremental vector going from bottom to top (half of length)\r\n const dn = new Vector3()\r\n .crossVectors(normal, v10)\r\n .normalize()\r\n .multiplyScalar((0.5 * distance) / n);\r\n // find the starting point of the grid (shift half of length in both directions)\r\n const v0 = s0.clone().add(dm).add(dn);\r\n // double half-length to full-length for the increment vectors in both directions\r\n dm.multiplyScalar(2);\r\n dn.multiplyScalar(2);\r\n heatFluxArrowLength.current = normal.clone().multiplyScalar(0.1);\r\n const vectors: Vector3[][] = [];\r\n const origin = new Vector3();\r\n let area =\r\n s.length === 4\r\n ? Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0])\r\n : Util.getTriangleArea(s[0], s[1], s[2]);\r\n if (area === 0) return undefined;\r\n let windows = getChildrenOfType(ObjectType.Window, id);\r\n const segmentsWithoutOverhang = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (segmentsWithoutOverhang && segmentsWithoutOverhang[index]) {\r\n windows = windows.filter((e) => {\r\n const w = e as WindowModel;\r\n const wcy = w.cy + (w.windowType === WindowType.Polygonal && w.polygonTop ? w.polygonTop[1] / 2 : 0);\r\n return RoofUtil.onSegment(segmentsWithoutOverhang[index], e.cx, wcy);\r\n });\r\n }\r\n if (windows && windows.length > 0) {\r\n for (const w of windows) {\r\n area -= Util.getWindowArea(w as WindowModel);\r\n }\r\n }\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowEuler.current = Util.getEuler(UNIT_VECTOR_POS_Z, normal, 'YXZ', -Math.sign(intensity) * HALF_PI);\r\n let isRoof;\r\n for (let p = 0; p < m; p++) {\r\n const dmp = dm.clone().multiplyScalar(p);\r\n for (let q = 0; q < n; q++) {\r\n origin.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\r\n isRoof = true;\r\n if (windows && windows.length > 0) {\r\n // add the centroid back as the vertices of the window are not relative to it\r\n const ox = origin.x + centroid.x;\r\n const oy = origin.y + centroid.y;\r\n for (const w of windows) {\r\n const vertices = RoofUtil.getRelativeWindowVerticesOnRoof(w as WindowModel);\r\n const points = Util.getPoints(vertices);\r\n if (Util.isPointInside(ox, oy, points)) {\r\n isRoof = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (isRoof) {\r\n if (Util.isPointInside(origin.x, origin.y, projectedVertices)) {\r\n const v: Vector3[] = [];\r\n if (intensity < 0) {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(-intensity)));\r\n } else {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(intensity)));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [showHeatFluxes, heatFluxScaleFactor]);\r\n\r\n return (\r\n <>\r\n \r\n\r\n {overhangLines &&\r\n overhangLines.map((v, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {heatFluxes &&\r\n heatFluxes.map((v, index) => {\r\n return (\r\n \r\n \r\n ;\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\ninterface BufferRoofSegmentProps {\r\n id: string;\r\n index: number;\r\n segment: RoofSegmentProps;\r\n color: string;\r\n sideColor: string;\r\n texture: Texture;\r\n heatmap?: CanvasTexture;\r\n transparent: boolean;\r\n opacity: number;\r\n windows: WindowModel[];\r\n centroid: Vector3;\r\n}\r\n\r\nexport const BufferRoofSegment = React.memo(\r\n ({\r\n id,\r\n index,\r\n segment,\r\n color,\r\n sideColor,\r\n texture,\r\n heatmap,\r\n transparent,\r\n opacity,\r\n windows,\r\n centroid,\r\n }: BufferRoofSegmentProps) => {\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n\r\n const ref = useRef(null);\r\n\r\n const { points } = segment;\r\n const topLayerTexture = showSolarRadiationHeatmap ? heatmap : texture;\r\n const isTri = points.length === 6;\r\n const isQuad = points.length === 8;\r\n\r\n const holeMeshes = useMemo(\r\n () =>\r\n windows.map((w) => {\r\n const dimension = new Vector3(w.lx, w.lz, w.ly * 2);\r\n const position = new Vector3(w.cx, w.cy, w.cz).sub(centroid);\r\n const rotation = new Euler().fromArray([...w.rotation, 'ZXY']);\r\n\r\n if (w.windowType === WindowType.Polygonal) {\r\n // triangle window\r\n const [topX, topH] = w.polygonTop ?? DEFAULT_POLYGONTOP;\r\n const [hx, hy, tx] = [dimension.x / 2, dimension.y / 2, topX * dimension.x];\r\n\r\n const shape = getPolygonWindowShape(hx, hy, tx, topH);\r\n const holeMesh = new Mesh(\r\n new ExtrudeBufferGeometry([shape], { steps: 1, depth: dimension.z, bevelEnabled: false }),\r\n );\r\n const offset = new Vector3(0, 0, -dimension.z).applyEuler(rotation);\r\n holeMesh.position.copy(position.clone().add(offset));\r\n holeMesh.rotation.copy(rotation);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n } else if (w.windowType === WindowType.Arched) {\r\n const shape = getArchedWindowShape(dimension.x, dimension.y, w.archHeight);\r\n const holeMesh = new Mesh(\r\n new ExtrudeBufferGeometry([shape], { steps: 1, depth: dimension.z, bevelEnabled: false }),\r\n );\r\n const offset = new Vector3(0, 0, -dimension.z).applyEuler(rotation);\r\n holeMesh.position.copy(position.clone().add(offset));\r\n holeMesh.rotation.copy(rotation);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n } else {\r\n // rectangle window\r\n const holeMesh = new Mesh(new BoxBufferGeometry(dimension.x, dimension.y, dimension.z));\r\n holeMesh.position.copy(position);\r\n holeMesh.rotation.copy(rotation);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }\r\n }),\r\n [windows, centroid],\r\n );\r\n\r\n const materialGroupNumber = render() ?? 6;\r\n\r\n const materialArray = useMemo(() => Array(materialGroupNumber).fill(0), [materialGroupNumber]);\r\n\r\n useEffect(() => {\r\n render();\r\n }, []);\r\n\r\n if (!isTri && !isQuad) return null;\r\n\r\n function render() {\r\n if (!ref.current || (!isTri && !isQuad)) return;\r\n\r\n const geometry = ref.current.geometry;\r\n geometry.index = null;\r\n geometry.clearGroups();\r\n\r\n const positions: number[] = [];\r\n const uvs: number[] = [];\r\n\r\n let vertexIndex = 0;\r\n let materialIndex = 0;\r\n\r\n /*\r\n 7----6\r\n /| /| 5\r\n 4----5 | /|\\\r\n | | | | 3---4\r\n | 3--|-2 | 2 |\r\n |/ |/ |/ \\|\r\n 0----1 0---1\r\n quad tri\r\n */\r\n\r\n if (isTri) {\r\n // set top layer positions, uvs and groups\r\n const topLayerPoints = points.slice(points.length / 2);\r\n addPositions(topLayerPoints);\r\n showSolarRadiationHeatmap ? addHeatmapUVs() : addUVs(topLayerPoints);\r\n addGroup(3);\r\n\r\n // set bottom layer positions, uvs, groups\r\n const bottomLayerPoints = points.slice(0, points.length / 2).reverse();\r\n addPositions(bottomLayerPoints);\r\n uvs.push(0, 0, 1, 0, 0, 1);\r\n addGroup(3);\r\n\r\n // side surfaces\r\n buildSideSurface([\r\n [0, 1, 4, 3],\r\n [1, 2, 5, 4],\r\n [2, 0, 3, 5],\r\n ]);\r\n } else if (isQuad) {\r\n // set top layer positions\r\n const topLayerPoints = points.slice(points.length / 2);\r\n const [triTopLower, triTopUpper] = triangulate(topLayerPoints);\r\n addPositions(triTopLower);\r\n addPositions(triTopUpper);\r\n\r\n const [ta, tb, tc, td] = topLayerPoints;\r\n const isLowerLeft = triTopLower[2].equals(td); // is segment triangulated by lowerLeft and upperRight\r\n\r\n // set top layer uvs\r\n if (!showSolarRadiationHeatmap) {\r\n const ab = new Vector3().subVectors(tb, ta);\r\n const ac = new Vector3().subVectors(tc, ta);\r\n const ad = new Vector3().subVectors(td, ta);\r\n const abxy = new Vector2(tb.x - ta.x, tb.y - ta.y);\r\n const lab = abxy.length();\r\n\r\n const ub = lab;\r\n const vb = 0;\r\n const uc = ab.dot(ac) / lab;\r\n const vc = ab.clone().cross(ac).length() / lab;\r\n const ud = ab.dot(ad) / lab;\r\n const vd = ab.clone().cross(ad).length() / lab;\r\n\r\n if (isLowerLeft) {\r\n uvs.push(0, 0, ub, vb, ud, vd); // lower\r\n uvs.push(ub, vb, uc, vc, ud, vd); // upper\r\n } else {\r\n uvs.push(0, 0, ub, vb, uc, vc); // lower\r\n uvs.push(0, 0, uc, vc, ud, vd); // upper\r\n }\r\n } else {\r\n addHeatmapUVs(isLowerLeft);\r\n }\r\n\r\n // set top layer groups\r\n addGroup(6);\r\n\r\n // set bottom layer positions, uvs, groups\r\n const bottomLayerPoints = points.slice(0, points.length / 2);\r\n const [triBotLower, triBotUpper] = triangulate(bottomLayerPoints);\r\n addPositions(triBotLower.reverse());\r\n addPositions(triBotUpper.reverse());\r\n uvs.push(0, 0, 1, 0, 0, 1);\r\n uvs.push(0, 1, 1, 0, 1, 1);\r\n addGroup(6);\r\n\r\n // side surfaces\r\n buildSideSurface([\r\n [0, 1, 5, 4],\r\n [1, 2, 6, 5],\r\n [2, 3, 7, 6],\r\n [3, 0, 4, 7],\r\n ]);\r\n } else {\r\n throw new Error('segment is neither quad nor tri');\r\n }\r\n\r\n geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\r\n geometry.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\r\n geometry.computeVertexNormals();\r\n geometry.computeBoundingSphere(); // add this to update hit test.\r\n\r\n if (windows.length > 0) {\r\n const operationBuffer: Mesh[] = [];\r\n\r\n // don't know why single variable not working, have to use array to save last operated mesh\r\n for (let i = 0; i < holeMeshes.length; i++) {\r\n const holeMesh = holeMeshes[i];\r\n if (i === 0) {\r\n operationBuffer.push(CSG.subtract(ref.current, holeMesh));\r\n } else {\r\n operationBuffer.push(CSG.subtract(operationBuffer[i - 1], holeMesh));\r\n }\r\n }\r\n\r\n const resultMesh = operationBuffer.pop();\r\n\r\n if (resultMesh) {\r\n geometry.copy(resultMesh.geometry);\r\n }\r\n }\r\n\r\n return geometry.groups.length;\r\n\r\n function addPositions(points: Vector3[]) {\r\n for (const point of points) {\r\n const { x, y, z } = point;\r\n positions.push(x, y, z);\r\n }\r\n }\r\n\r\n function addUVs(points: Vector3[]) {\r\n const [a, b, c] = points;\r\n const ab = new Vector3().subVectors(b, a);\r\n const lab = ab.length();\r\n const ac = new Vector3().subVectors(c, a);\r\n const abxy = new Vector2(b.x - a.x, b.y - a.y);\r\n\r\n const ub = abxy.length();\r\n const vb = 0;\r\n const uc = ab.dot(ac) / lab;\r\n const vc = ab.clone().cross(ac).length() / lab;\r\n\r\n uvs.push(0, 0, ub, vb, uc, vc);\r\n }\r\n\r\n function addHeatmapUVs(isLowerLeft = false) {\r\n const v10 = new Vector3().subVectors(points[1], points[0]);\r\n const length10 = v10.length();\r\n v10.normalize();\r\n const v20 = new Vector3().subVectors(points[2], points[0]);\r\n if (isTri) {\r\n // find the position of the top point relative to the first edge point\r\n const mid = v20.dot(v10) / length10;\r\n uvs.push(0, 0, 1, 0, mid, 1);\r\n } else if (isQuad) {\r\n // find the position of the top-left and top-right points relative to the lower-left point\r\n // the points go anticlockwise\r\n const v30 = new Vector3().subVectors(points[3], points[0]);\r\n const topLeft = v30.dot(v10) / length10;\r\n const topRight = v20.dot(v10) / length10;\r\n if (isLowerLeft) {\r\n uvs.push(0, 0, 1, 0, topLeft, 1);\r\n uvs.push(1, 0, topRight, 1, topLeft, 1);\r\n } else {\r\n uvs.push(0, 0, 1, 0, topRight, 1);\r\n uvs.push(0, 0, topRight, 1, topLeft, 1);\r\n }\r\n }\r\n }\r\n\r\n function addGroup(verticesNumber: number) {\r\n geometry.addGroup(vertexIndex, verticesNumber, materialIndex++);\r\n vertexIndex += verticesNumber;\r\n }\r\n\r\n function buildSideSurface(surfacePointIndices: number[][]) {\r\n for (const indices of surfacePointIndices) {\r\n const [a, b, c, d] = indices;\r\n const tri1 = [a, b, d].reduce((acc, i) => acc.concat(points[i].x, points[i].y, points[i].z), [] as number[]);\r\n const tri2 = [d, b, c].reduce((acc, i) => acc.concat(points[i].x, points[i].y, points[i].z), [] as number[]);\r\n positions.push(...tri1);\r\n positions.push(...tri2);\r\n uvs.push(0, 0, 1, 0, 0, 1);\r\n uvs.push(0, 1, 1, 0, 1, 1);\r\n addGroup(6);\r\n }\r\n }\r\n }\r\n\r\n function triangulate(points: Vector3[]) {\r\n const [a, b, c, d] = points;\r\n const dDis = Util.distanceFromPointToLine2D(d, a, b);\r\n const cDis = Util.distanceFromPointToLine2D(c, a, b);\r\n const lower: Vector3[] = [];\r\n const upper: Vector3[] = [];\r\n if (Math.abs(dDis - cDis) < 0.01) {\r\n if (a.z > b.z) {\r\n lower.push(a, b, c);\r\n upper.push(a, c, d);\r\n } else {\r\n lower.push(a, b, d);\r\n upper.push(b, c, d);\r\n }\r\n } else if (dDis <= cDis) {\r\n lower.push(a, b, d);\r\n upper.push(b, c, d);\r\n } else {\r\n lower.push(a, b, c);\r\n upper.push(a, c, d);\r\n }\r\n return [lower, upper];\r\n }\r\n\r\n const HeatMapMaterial = () => (\r\n \r\n );\r\n\r\n const TopLayerMaterial = () => (\r\n \r\n );\r\n\r\n const SideSurfaceMaterial = () => (\r\n \r\n );\r\n\r\n const enableShadow = shadowEnabled && !showSolarRadiationHeatmap;\r\n\r\n return (\r\n \r\n {materialArray.map((_, i) => {\r\n if (i !== 0) {\r\n return ;\r\n } else if (showSolarRadiationHeatmap) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n })}\r\n \r\n );\r\n },\r\n);\r\n\r\nexport default React.memo(RoofSegment);\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Extrude } from '@react-three/drei';\r\nimport React from 'react';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { DoubleSide, Shape, Vector3 } from 'three';\r\n\r\ninterface CeilingProps {\r\n cz: number;\r\n points: Vector3[];\r\n}\r\n\r\nconst Ceiling = ({ cz, points }: CeilingProps) => {\r\n const shape = new Shape();\r\n\r\n shape.moveTo(points[0].x, points[0].y);\r\n\r\n for (const { x, y } of points) {\r\n shape.lineTo(x, y);\r\n }\r\n\r\n shape.closePath();\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Ceiling);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from '../stores/selector';\r\n\r\nexport const useSelected = (id: string) => {\r\n return useStore((state) => state.selectedElementIdSet.has(id) && !state.groupActionMode);\r\n};\r\n\r\nexport const useLanguage = () => {\r\n return { lng: useStore(Selector.language) };\r\n};\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { PyramidRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { CanvasTexture, Euler, Mesh, Raycaster, RepeatWrapping, Vector2, Vector3 } from 'three';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { Line, Plane } from '@react-three/drei';\r\nimport { HALF_PI, HALF_PI_Z_EULER, TWO_PI } from 'src/constants';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { useThree } from '@react-three/fiber';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { Util } from 'src/Util';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n areRoofsEqual,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n RoofHandle,\r\n RoofSegmentGroupUserData,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n} from './roofRenderer';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport {\r\n useIsFirstRender,\r\n useMultiCurrWallArray,\r\n useRoofHeight,\r\n useRoofTexture,\r\n useUpdateOldRoofFiles,\r\n useUpdateRooftopElements,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n useUserData,\r\n} from './hooks';\r\nimport RoofSegment from './roofSegment';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Ceiling from './ceiling';\r\nimport FlatRoof from './flatRoof';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport shallow from 'zustand/shallow';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zeroVector = new Vector3();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\nconst PyramidRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n if (roofSegments.length === 0) {\r\n return null;\r\n }\r\n const peripheryPoints: Vector3[] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness);\r\n\r\n for (let i = 0; i < roofSegments.length; i++) {\r\n const [leftPoint, rightPoint] = roofSegments[i].points;\r\n peripheryPoints.push(leftPoint);\r\n if (i === roofSegments.length - 1) {\r\n peripheryPoints.push(rightPoint);\r\n }\r\n }\r\n\r\n const periphery = ;\r\n\r\n return (\r\n <>\r\n {periphery}\r\n \r\n {periphery}\r\n {roofSegments.map((segment, idx) => {\r\n const [leftPoint, rightPoint, zeroVector] = segment.points;\r\n const isFlat = Math.abs(leftPoint.z) < 0.015;\r\n const points = [leftPoint.clone().sub(thicknessVector), leftPoint];\r\n if (!isFlat) {\r\n points.push(zeroVector);\r\n }\r\n return ;\r\n })}\r\n \r\n \r\n );\r\n});\r\n\r\ninterface PyramidRoofProps extends BuildingParts {\r\n roofModel: PyramidRoofModel;\r\n}\r\n\r\nconst PyramidRoof = ({ roofModel, foundationModel }: PyramidRoofProps) => {\r\n let {\r\n cx,\r\n cy,\r\n lz,\r\n id,\r\n wallsId,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n thickness = 0.2,\r\n locked,\r\n lineWidth = 0.2,\r\n lineColor = 'black',\r\n roofType,\r\n foundationId,\r\n rise = lz,\r\n ceiling = false,\r\n } = roofModel;\r\n\r\n const texture = useRoofTexture(textureType);\r\n\r\n const selected = useSelected(id);\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const { camera, gl } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const isPointerDownRef = useRef(false);\r\n const oldRiseRef = useRef(rise);\r\n\r\n const prevWallsIdSet = new Set(wallsId);\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const getWallPoint = (wallArray: WallModel[]) => {\r\n const arr: Point2[] = [];\r\n const length = wallArray.length;\r\n for (const w of wallArray) {\r\n if (w.leftPoint[0] !== undefined && w.leftPoint[1] !== undefined) {\r\n arr.push({ x: w.leftPoint[0], y: w.leftPoint[1] });\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n if (\r\n (wallArray[length - 1].rightPoint[0] || wallArray[length - 1].rightPoint[0] === 0) &&\r\n (wallArray[length - 1].rightPoint[1] || wallArray[length - 1].rightPoint[1] === 0)\r\n ) {\r\n arr.push({ x: wallArray[length - 1].rightPoint[0], y: wallArray[length - 1].rightPoint[1] });\r\n }\r\n }\r\n return arr;\r\n };\r\n\r\n const needUpdateWallsId = (wallArray: WallModel[], wallsIdSet: Set) => {\r\n if (wallArray.length !== wallsIdSet.size) {\r\n return true;\r\n }\r\n for (const w of wallArray) {\r\n if (!wallsIdSet.has(w.id)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getOverhangHeight = () => {\r\n let height = Infinity;\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n const leftPoint = new Vector3(w.leftPoint[0], w.leftPoint[1]);\r\n const rightPoint = new Vector3(w.rightPoint[0], w.rightPoint[1]);\r\n // const { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n const dLeft = RoofUtil.getDistance(leftPoint, rightPoint, centerPointV3);\r\n const overhangHeightLeft = Math.min(((w.eavesLength ?? 0) / dLeft) * (centerPointV3.z - w.lz), w.lz);\r\n const dRight = RoofUtil.getDistance(leftPoint, rightPoint, centerPointV3);\r\n const overhangHeightRight = Math.min(((w.eavesLength ?? 0) / dRight) * (centerPointV3.z - w.lz), w.lz);\r\n height = Math.min(Math.min(overhangHeightLeft, overhangHeightRight), height);\r\n }\r\n\r\n return Number.isNaN(height) ? 0 : height;\r\n };\r\n\r\n const { currentWallArray, isLoopRef } = useMultiCurrWallArray(foundationId, id, wallsId);\r\n\r\n const { highestWallHeight, topZ } = useRoofHeight(currentWallArray, rise);\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const centerPoint = useMemo(() => {\r\n if (currentWallArray.length < 2) {\r\n return { x: 0, y: 0 };\r\n }\r\n const points = getWallPoint(currentWallArray);\r\n if (points.length < 3) {\r\n return { x: 0, y: 0 };\r\n }\r\n const p = Util.calculatePolygonCentroid(points);\r\n if (Number.isNaN(p.x) || Number.isNaN(p.y)) {\r\n return { x: 0, y: 0 };\r\n }\r\n return p;\r\n }, [currentWallArray, topZ]);\r\n\r\n const centerPointV3 = useMemo(() => {\r\n return new Vector3(centerPoint.x, centerPoint.y, topZ);\r\n }, [centerPoint, topZ]);\r\n\r\n const overhangs = useMemo(() => {\r\n const res = currentWallArray.map((wall) => RoofUtil.getWallNormal(wall).multiplyScalar(wall.eavesLength ?? 0));\r\n if (!isLoopRef.current && res.length !== 0) {\r\n const n = new Vector3()\r\n .subVectors(\r\n new Vector3(\r\n currentWallArray[currentWallArray.length - 1].rightPoint[0],\r\n currentWallArray[currentWallArray.length - 1].rightPoint[1],\r\n ),\r\n new Vector3(currentWallArray[0].leftPoint[0], currentWallArray[0].leftPoint[1]),\r\n )\r\n .applyEuler(HALF_PI_Z_EULER)\r\n .normalize()\r\n .multiplyScalar(0.3);\r\n res.push(n);\r\n }\r\n return res;\r\n }, [currentWallArray]);\r\n\r\n const wallPointsAfterOffset = useMemo(() => {\r\n const res = currentWallArray.map((wall, idx) => ({\r\n leftPoint: new Vector3(wall.leftPoint[0], wall.leftPoint[1]).add(overhangs[idx]),\r\n rightPoint: new Vector3(wall.rightPoint[0], wall.rightPoint[1]).add(overhangs[idx]),\r\n }));\r\n if (!isLoopRef.current && res.length !== 0) {\r\n res.push({\r\n leftPoint: new Vector3(\r\n currentWallArray[currentWallArray.length - 1].rightPoint[0],\r\n currentWallArray[currentWallArray.length - 1].rightPoint[1],\r\n ).add(overhangs[overhangs.length - 1]),\r\n rightPoint: new Vector3(currentWallArray[0].leftPoint[0], currentWallArray[0].leftPoint[1]).add(\r\n overhangs[overhangs.length - 1],\r\n ),\r\n });\r\n }\r\n return res;\r\n }, [currentWallArray, overhangs]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n if (currentWallArray.length < 2) {\r\n return segments;\r\n }\r\n\r\n const overhangHeight = getOverhangHeight();\r\n\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n if (\r\n w.leftPoint.length > 0 &&\r\n w.rightPoint.length > 0 &&\r\n (w.leftPoint[0] !== w.rightPoint[0] || w.leftPoint[1] !== w.rightPoint[1])\r\n ) {\r\n const points = [];\r\n let { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n if (!isLoopRef.current) {\r\n if (i === 0) {\r\n lh = currentWallArray[0].lz;\r\n }\r\n if (i === currentWallArray.length - 1) {\r\n rh = currentWallArray[currentWallArray.length - 1].lz;\r\n }\r\n }\r\n\r\n const wallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[(i + wallPointsAfterOffset.length - 1) % wallPointsAfterOffset.length].leftPoint,\r\n wallPointsAfterOffset[(i + wallPointsAfterOffset.length - 1) % wallPointsAfterOffset.length].rightPoint,\r\n wallPointsAfterOffset[i].leftPoint,\r\n wallPointsAfterOffset[i].rightPoint,\r\n )\r\n .setZ(lh - overhangHeight)\r\n .sub(centerPointV3);\r\n\r\n const wallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[i].leftPoint,\r\n wallPointsAfterOffset[i].rightPoint,\r\n wallPointsAfterOffset[(i + 1) % wallPointsAfterOffset.length].leftPoint,\r\n wallPointsAfterOffset[(i + 1) % wallPointsAfterOffset.length].rightPoint,\r\n )\r\n .setZ(rh - overhangHeight)\r\n .sub(centerPointV3);\r\n\r\n const length = new Vector3(w.cx, w.cy).sub(centerPointV3.clone().setZ(0)).length();\r\n points.push(wallLeftPointAfterOverhang, wallRightPointAfterOverhang, zeroVector);\r\n points.push(\r\n wallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n wallRightPointAfterOverhang.clone().add(thicknessVector),\r\n zeroVector.clone().add(thicknessVector),\r\n );\r\n segments.push({ points, angle: -w.relativeAngle, length });\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n const idx = wallPointsAfterOffset.length - 1;\r\n const leftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[idx - 1].leftPoint,\r\n wallPointsAfterOffset[idx - 1].rightPoint,\r\n wallPointsAfterOffset[idx].leftPoint,\r\n wallPointsAfterOffset[idx].rightPoint,\r\n )\r\n .setZ(currentWallArray[currentWallArray.length - 1].lz - overhangHeight)\r\n .sub(centerPointV3);\r\n const rightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[idx].leftPoint,\r\n wallPointsAfterOffset[idx].rightPoint,\r\n wallPointsAfterOffset[0].leftPoint,\r\n wallPointsAfterOffset[0].rightPoint,\r\n )\r\n .setZ(currentWallArray[0].lz - overhangHeight)\r\n .sub(centerPointV3);\r\n\r\n let angle = Math.atan2(\r\n rightPointAfterOverhang.y - leftPointAfterOverhang.y,\r\n rightPointAfterOverhang.x - leftPointAfterOverhang.x,\r\n );\r\n angle = angle >= 0 ? angle : (TWO_PI + angle) % TWO_PI;\r\n\r\n const length = new Vector3()\r\n .addVectors(leftPointAfterOverhang, rightPointAfterOverhang)\r\n .setZ(0)\r\n .divideScalar(2)\r\n .length();\r\n\r\n const points = [];\r\n points.push(leftPointAfterOverhang, rightPointAfterOverhang, zeroVector);\r\n points.push(\r\n leftPointAfterOverhang.clone().add(thicknessVector),\r\n rightPointAfterOverhang.clone().add(thicknessVector),\r\n zeroVector.clone().add(thicknessVector),\r\n );\r\n segments.push({ points, angle: -angle, length });\r\n }\r\n\r\n return segments;\r\n }, [currentWallArray, centerPoint, thickness]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n const points: Vector3[] = [];\r\n if (currentWallArray.length === 0) return points;\r\n points.push(new Vector3().fromArray(currentWallArray[0].leftPoint));\r\n for (const wall of currentWallArray) {\r\n points.push(new Vector3().fromArray(wall.rightPoint));\r\n }\r\n return points;\r\n }, [currentWallArray]);\r\n\r\n // set position and rotation\r\n let rotation = 0;\r\n if (foundationModel) {\r\n cx = foundationModel.cx;\r\n cy = foundationModel.cy;\r\n rotation = foundationModel.rotation[2];\r\n\r\n const r = -Math.atan2(camera.position.x - cx, camera.position.y - cy) - rotation;\r\n intersectionPlanePosition.set(centerPoint.x, centerPoint.y, topZ);\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n\r\n const isFirstRender = useIsFirstRender();\r\n\r\n useEffect(() => {\r\n if (isFirstRender) return;\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id)) {\r\n if (currentWallArray.length >= 2 && needUpdateWallsId(currentWallArray, prevWallsIdSet)) {\r\n const newWallsIdArray = currentWallArray.map((v) => v.id);\r\n const newWallsIdSet = new Set(newWallsIdArray);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof) {\r\n if (e.id === id) {\r\n (e as RoofModel).wallsId = newWallsIdArray;\r\n }\r\n } else if (e.type === ObjectType.Wall) {\r\n if (prevWallsIdSet.has(e.id) && !newWallsIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n w.roofId = null;\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n }\r\n }\r\n }\r\n });\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n }\r\n }, [prevWallsIdSet]);\r\n\r\n // update wall's roofId when adding new roof\r\n useEffect(() => {\r\n if (currentWallArray.length > 1) {\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id)) {\r\n // update walls\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === currentWallArray[i].id && e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n w.roofId = id;\r\n // some old files set wall's roof height, which should not\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n } else {\r\n removeElementById(id, false, false, true);\r\n }\r\n }, [currentWallArray]);\r\n\r\n useUpdateRooftopElements(foundationModel, id, roofSegments, centerPointV3, topZ, thickness);\r\n\r\n const checkIsFlatRoof = () => {\r\n if (currentWallArray.length < 2) {\r\n return false;\r\n }\r\n const height = currentWallArray[0].lz;\r\n\r\n for (const wall of currentWallArray) {\r\n if (Math.abs(wall.lz - height) > 0.01) {\r\n return false;\r\n }\r\n }\r\n\r\n for (const segment of roofSegments) {\r\n const [leftPoint, rightPoint] = segment.points;\r\n if (Math.abs(leftPoint.z) > 0.01 || Math.abs(rightPoint.z) > 0.01) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const [isFlatRoof, setIsFlatRoof] = useState(checkIsFlatRoof);\r\n\r\n useEffect(() => {\r\n setIsFlatRoof(checkIsFlatRoof());\r\n }, [currentWallArray, topZ]);\r\n\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n const [flatHeatmapTexture, setFlatHeatmapTexture] = useState(null);\r\n const selectMe = useStore(Selector.selectMe);\r\n\r\n const updateSegmentVertices = useUpdateSegmentVerticesMap(\r\n id,\r\n centerPointV3,\r\n roofSegments,\r\n isFlatRoof,\r\n RoofType.Pyramid,\r\n );\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n if (isFlatRoof) {\r\n const heatmap = getHeatmap(id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n // obtain the bounding rectangle\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices && segmentVertices.length > 0 && foundationModel) {\r\n const euler = new Euler(0, 0, foundationModel.rotation[2], 'ZYX');\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const s of segmentVertices) {\r\n for (const v of s) {\r\n const v2 = v.clone().applyEuler(euler);\r\n if (v2.x > maxX) maxX = v2.x;\r\n if (v2.x < minX) minX = v2.x;\r\n if (v2.y > maxY) maxY = v2.y;\r\n if (v2.y < minY) minY = v2.y;\r\n }\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n const vcx = (minX + maxX) / 2;\r\n const vcy = (minY + maxY) / 2;\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n t.offset.set(-minX / dx, -minY / dy);\r\n t.center.set(vcx / dx, vcy / dy);\r\n t.rotation = -foundationModel.rotation[2];\r\n t.repeat.set(1 / dx, 1 / dy);\r\n }\r\n setFlatHeatmapTexture(t);\r\n }\r\n }\r\n } else {\r\n const n = roofSegments.length;\r\n if (n > 0) {\r\n const textures = [];\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices) {\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n const segmentVertices: Vector3[][] = [];\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n if (\r\n w.leftPoint.length > 0 &&\r\n w.rightPoint.length > 0 &&\r\n (w.leftPoint[0] !== w.rightPoint[0] || w.leftPoint[1] !== w.rightPoint[1])\r\n ) {\r\n let { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n if (!isLoopRef.current) {\r\n if (i === 0) {\r\n lh = currentWallArray[0].lz;\r\n }\r\n if (i === currentWallArray.length - 1) {\r\n rh = currentWallArray[currentWallArray.length - 1].lz;\r\n }\r\n }\r\n\r\n const wallLeftPoint = new Vector3(w.leftPoint[0], w.leftPoint[1], lh);\r\n const wallRightPoint = new Vector3(w.rightPoint[0], w.rightPoint[1], rh);\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, centerPointV3.clone()]);\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n const firstWall = currentWallArray[0];\r\n const lastWall = currentWallArray[currentWallArray.length - 1];\r\n const leftPoint = new Vector3(lastWall.rightPoint[0], lastWall.rightPoint[1], lastWall.lz);\r\n const rightPoint = new Vector3(firstWall.leftPoint[0], firstWall.leftPoint[1], firstWall.lz);\r\n segmentVertices.push([leftPoint, rightPoint, centerPointV3.clone()]);\r\n }\r\n\r\n if (isFlatRoof) {\r\n const seg: Vector3[] = [];\r\n for (const segment of segmentVertices) {\r\n seg.push(segment[0].clone());\r\n }\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, [seg]);\r\n } else {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n }\r\n };\r\n\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const userData = useUserData(id, foundationModel, centerPointV3, roofSegments);\r\n\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n return (\r\n \r\n {/* roof segments group */}\r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, centerPointV3);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {isFlatRoof ? (\r\n \r\n ) : (\r\n <>\r\n {roofSegments.map((segment, index) => {\r\n const { points } = segment;\r\n if (points.length > 0) {\r\n const [leftPoint, rightPoint] = points;\r\n if (leftPoint.distanceTo(rightPoint) > 0.1) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n return null;\r\n })}\r\n \r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && }\r\n\r\n {/* handle */}\r\n {selected && !locked && (\r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n setShowIntersectionPlane(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerUp={() => {\r\n setShowIntersectionPlane(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = centerPoint.x;\r\n state.selectedElementY = centerPoint.y;\r\n });\r\n }}\r\n />\r\n )}\r\n\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n {\r\n if (intersectionPlaneRef.current && isPointerDownRef.current && foundationModel) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0]) {\r\n const point = intersects[0].point;\r\n if (point.z < 0.001) {\r\n return;\r\n }\r\n const newRise = Math.max(0, point.z - foundationModel.lz - 0.3 - highestWallHeight);\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, topZ + roofModel.thickness);\r\n }\r\n }\r\n }}\r\n onPointerUp={(e) => {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n setShowIntersectionPlane(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n isPointerDownRef.current = false;\r\n }}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(PyramidRoof, areRoofsEqual);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Line, Plane } from '@react-three/drei';\r\nimport { useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { HALF_PI } from 'src/constants';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { GambrelRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { UnoableResizeGambrelRoofRidge } from 'src/undo/UndoableResize';\r\nimport { Util } from 'src/Util';\r\nimport { CanvasTexture, DoubleSide, Euler, Mesh, Raycaster, RepeatWrapping, Vector2, Vector3 } from 'three';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n areRoofsEqual,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n RoofHandle,\r\n RoofSegmentGroupUserData,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n updateRooftopElements,\r\n} from './roofRenderer';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport {\r\n useComposedWallArray,\r\n useComposedRoofHeight,\r\n useRoofTexture,\r\n useUpdateOldRoofFiles,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n ComposedWall,\r\n useUpdateRooftopElementsByContextMenuChanges,\r\n useIsFirstRender,\r\n useUserData,\r\n} from './hooks';\r\nimport RoofSegment from './roofSegment';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Ceiling from './ceiling';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport FlatRoof from './flatRoof';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\nimport shallow from 'zustand/shallow';\r\nimport { useSelected } from '../hooks';\r\n\r\ntype RoofEdge = {\r\n start: number;\r\n end: number;\r\n k: number;\r\n b: number;\r\n};\r\n\r\nexport type WallHeights = {\r\n left: number;\r\n centerLeft?: number[] | null;\r\n center?: number[] | null;\r\n centerRight?: number[] | null;\r\n right: number;\r\n};\r\n\r\nexport const getWallShapePoints = (lx: number, lz: number, wallHeights: WallHeights) => {\r\n const { left, right, center, centerLeft, centerRight } = wallHeights;\r\n const [hx, hz] = [lx / 2, lz / 2];\r\n const points: Point2[] = [\r\n { x: -hx, y: left - hz },\r\n { x: -hx, y: -hz },\r\n { x: hx, y: -hz },\r\n { x: hx, y: right - hz },\r\n ];\r\n if (centerRight) {\r\n const [crX, crY] = centerRight;\r\n points.push({ x: crX * lx, y: crY - hz });\r\n }\r\n if (center) {\r\n const [cX, cY] = center;\r\n points.push({ x: cX * lx, y: cY - hz });\r\n }\r\n if (centerLeft) {\r\n const [clX, clY] = centerLeft;\r\n points.push({ x: clX * lx, y: clY - hz });\r\n }\r\n return points;\r\n};\r\n\r\nexport const isRoofValid = (wallHeightsMap: Map, foundationId: string) => {\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundationId && wallHeightsMap.has(e.id)) {\r\n const wallHeights = wallHeightsMap.get(e.id);\r\n if (wallHeights) {\r\n const wall = e as WallModel;\r\n const wallShapePoints = getWallShapePoints(wall.lx, wall.lz, wallHeights);\r\n\r\n for (const child of useStore.getState().elements) {\r\n if (child.parentId === wall.id) {\r\n let { cx, cz, lx, ly, lz } = child;\r\n cx *= wall.lx;\r\n cz *= wall.lz;\r\n if (child.type !== ObjectType.SolarPanel) {\r\n lx *= wall.lx;\r\n lz *= wall.lz;\r\n } else {\r\n lz = ly;\r\n }\r\n if (child.type === ObjectType.Window && (child as WindowModel).windowType === WindowType.Polygonal) {\r\n const [tx, th] = (child as WindowModel).polygonTop ?? DEFAULT_POLYGONTOP;\r\n const px = cx + tx * lx;\r\n const pz = cz + lz / 2 + th;\r\n if (!Util.isPointInside(px, pz, wallShapePoints)) {\r\n return false;\r\n }\r\n }\r\n if (\r\n !Util.isElementInsideWall(new Vector3(cx, 0, cz), lx, lz, wallShapePoints, child.type === ObjectType.Door)\r\n ) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n};\r\n\r\nconst GambrelRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n if (roofSegments.length === 0) {\r\n return null;\r\n }\r\n const peripheryPoints: Vector3[] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness);\r\n\r\n const frontSideSegmentPoints = roofSegments[0].points;\r\n const frontTopSegmentPoints = roofSegments[1].points;\r\n const backTopSegmentPoints = roofSegments[2].points;\r\n const backSideSegmentPoints = roofSegments[3].points;\r\n\r\n peripheryPoints.push(\r\n frontTopSegmentPoints[3],\r\n frontTopSegmentPoints[0],\r\n frontSideSegmentPoints[0],\r\n frontSideSegmentPoints[1],\r\n frontSideSegmentPoints[2],\r\n frontTopSegmentPoints[2],\r\n backTopSegmentPoints[0],\r\n backSideSegmentPoints[0],\r\n backSideSegmentPoints[1],\r\n backTopSegmentPoints[1],\r\n frontTopSegmentPoints[3],\r\n );\r\n\r\n const isFlat = Math.abs(frontSideSegmentPoints[0].z) < 0.15;\r\n\r\n const periphery = ;\r\n const ridges = (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n return (\r\n <>\r\n {periphery}\r\n {!isFlat && ridges}\r\n \r\n {periphery}\r\n {!isFlat && ridges}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zeroVector2 = new Vector2();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\ninterface GambrelRoofProps extends BuildingParts {\r\n roofModel: GambrelRoofModel;\r\n}\r\nconst GambrelRoof = ({ roofModel, foundationModel }: GambrelRoofProps) => {\r\n let {\r\n id,\r\n cx,\r\n cy,\r\n lz,\r\n wallsId,\r\n parentId,\r\n topRidgeLeftPoint,\r\n frontRidgeLeftPoint,\r\n backRidgeLeftPoint,\r\n topRidgePoint,\r\n frontRidgePoint,\r\n backRidgePoint,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n thickness = 0.2,\r\n locked,\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n roofType,\r\n rise = lz,\r\n ceiling = false,\r\n } = roofModel;\r\n\r\n if (topRidgePoint === undefined) {\r\n topRidgePoint = topRidgeLeftPoint ? [...topRidgeLeftPoint] : [0, 1];\r\n }\r\n if (frontRidgePoint === undefined) {\r\n frontRidgePoint = frontRidgeLeftPoint ? [...frontRidgeLeftPoint] : [0.35, 0.5];\r\n }\r\n if (backRidgePoint === undefined) {\r\n backRidgePoint = backRidgeLeftPoint ? [...backRidgeLeftPoint] : [0.35, 0.5];\r\n }\r\n\r\n const selected = useSelected(id);\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const texture = useRoofTexture(textureType);\r\n\r\n const [roofHandleType, setRoofHandleType] = useState(RoofHandleType.Null);\r\n const [enableIntersectionPlane, setEnableIntersectionPlane] = useState(false);\r\n const intersectionPlaneRef = useRef(null);\r\n const { gl, camera } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const oldRidgeVal = useRef([0, 0]);\r\n const oldRiseRef = useRef(rise);\r\n const isPointerDownRef = useRef(false);\r\n\r\n const isFlat = rise < 0.01;\r\n\r\n const updateRidge = (elemId: string, type: string, val: number[]) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Gambrel) {\r\n const gr = e as GambrelRoofModel;\r\n switch (type) {\r\n case RoofHandleType.FrontLeft:\r\n case RoofHandleType.FrontRight:\r\n gr.frontRidgePoint = [...val];\r\n break;\r\n case RoofHandleType.TopLeft:\r\n case RoofHandleType.TopRight:\r\n gr.topRidgePoint = [...val];\r\n break;\r\n case RoofHandleType.BackLeft:\r\n case RoofHandleType.BackRight:\r\n gr.backRidgePoint = [...val];\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleUndoableResizeRidge = (elemId: string, type: RoofHandleType, oldVal: number[], newVal: number[]) => {\r\n const undoable = {\r\n name: 'Resize Gambrel Roof Ridge',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldVal: [...oldVal],\r\n newVal: [...newVal],\r\n type: type,\r\n undo: () => {\r\n updateRidge(undoable.resizedElementId, undoable.type, undoable.oldVal);\r\n },\r\n redo: () => {\r\n updateRidge(undoable.resizedElementId, undoable.type, undoable.newVal);\r\n },\r\n } as UnoableResizeGambrelRoofRidge;\r\n useStore.getState().addUndoable(undoable);\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const setInterSectionPlane = (handlePointV3: Vector3, wall: ComposedWall) => {\r\n setEnableIntersectionPlane(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n intersectionPlanePosition.set(handlePointV3.x, handlePointV3.y, handlePointV3.z).add(centroid);\r\n if (foundationModel && wall) {\r\n intersectionPlaneRotation.set(HALF_PI, 0, wall.relativeAngle, 'ZXY');\r\n }\r\n };\r\n\r\n const getRelPos = (foundation: ElementModel, wall: ComposedWall, point: Vector3) => {\r\n const foundationCenter = new Vector2(foundation.cx, foundation.cy);\r\n const wallCenter = RoofUtil.getComposedWallCenter(wall);\r\n const wallLength = RoofUtil.getComposedWallLength(wall);\r\n const wallAbsCenter = new Vector2(wallCenter.x, wallCenter.y)\r\n .rotateAround(zeroVector2, foundation.rotation[2])\r\n .add(foundationCenter);\r\n const wallAbsAngle = foundation.rotation[2] + wall.relativeAngle;\r\n const p = new Vector2(point.x, point.y).sub(wallAbsCenter).rotateAround(zeroVector2, -wallAbsAngle);\r\n const x = p.x / wallLength;\r\n return Math.min(Math.abs(x), 0.5) * (x >= 0 ? 1 : -1);\r\n };\r\n\r\n const getRidgePoint = (currWall: ComposedWall, px: number, ph: number, sideWall?: ComposedWall) => {\r\n if (!currWall) {\r\n return new Vector3();\r\n }\r\n const length = RoofUtil.getComposedWallLength(currWall);\r\n const e = new Euler(0, 0, currWall.relativeAngle);\r\n const v = new Vector3(px * length, 0, 0);\r\n let height = topZ;\r\n if (sideWall) {\r\n height = ph * (topZ - sideWall.lz) + sideWall.lz;\r\n }\r\n const center = RoofUtil.getComposedWallCenter(currWall);\r\n return new Vector3(center.x, center.y, height).add(v.applyEuler(e));\r\n };\r\n\r\n const getWallHeight = (arr: ComposedWall[], i: number) => {\r\n const w = arr[i];\r\n let lh;\r\n let rh;\r\n if (i === 0 || i === 2) {\r\n lh = w.lz;\r\n rh = w.lz;\r\n } else if (i === 1) {\r\n lh = arr[0].lz;\r\n rh = arr[2].lz;\r\n } else {\r\n lh = arr[2].lz;\r\n rh = arr[0].lz;\r\n }\r\n return { lh, rh };\r\n };\r\n\r\n const isThisIdAndType = (e: ElementModel) => {\r\n return e.id === id && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Gambrel;\r\n };\r\n\r\n const getEdgeLine = (startPoint: Vector2, endPoint: Vector2) => {\r\n const dx = endPoint.x - startPoint.x;\r\n const dy = endPoint.y - startPoint.y;\r\n const k = dy / dx;\r\n const b = startPoint.y - k * startPoint.x;\r\n return {\r\n start: startPoint.x,\r\n end: endPoint.x,\r\n k,\r\n b,\r\n } as RoofEdge;\r\n };\r\n\r\n const getRoofSideEdges = (\r\n composedWalls: ComposedWall[],\r\n index: number,\r\n topZ: number,\r\n leftBaseHeight: number,\r\n rightBaseHeight: number,\r\n leftPoint: number[],\r\n midPoint: number[],\r\n rightPoint: number[],\r\n ) => {\r\n const composedWall = composedWalls[index];\r\n const { lh, rh } = getWallHeight(composedWalls, index);\r\n const length = new Vector3().subVectors(composedWall.leftPoint, composedWall.rightPoint).length();\r\n const halfLength = length / 2;\r\n\r\n const getX = (x: number) => x * length + halfLength;\r\n const getY = (y: number, baseHeight: number) => y * (topZ - baseHeight) + baseHeight;\r\n\r\n const points = [\r\n new Vector2(getX(-leftPoint[0]), getY(leftPoint[1], leftBaseHeight)),\r\n new Vector2(getX(midPoint[0]), topZ),\r\n new Vector2(getX(rightPoint[0]), getY(rightPoint[1], rightBaseHeight)),\r\n new Vector2(length, rh),\r\n ];\r\n const edges = points.map((p, i) => {\r\n const start = i === 0 ? new Vector2(0, lh) : points[i - 1];\r\n return getEdgeLine(start, p);\r\n });\r\n return edges;\r\n };\r\n\r\n const getYOnEdge = (edges: RoofEdge[], x: number) => {\r\n for (const edge of edges) {\r\n const { start, end, k, b } = edge;\r\n if (x >= start && x <= end) {\r\n return k * x + b;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const updateFlatRoofWalls = (composedWalls: ComposedWall[]) => {\r\n const idSet = new Set();\r\n for (const composedWall of composedWalls) {\r\n composedWall.wallsId.forEach((id) => idSet.add(id));\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === parentId && idSet.has(e.id)) {\r\n const wall = e as WallModel;\r\n wall.leftRoofHeight = topZ;\r\n wall.rightRoofHeight = topZ;\r\n wall.centerLeftRoofHeight = undefined;\r\n wall.centerRightRoofHeight = undefined;\r\n wall.centerRoofHeight = undefined;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setSideWallHeightsMap = (\r\n map: Map,\r\n composedWalls: ComposedWall[],\r\n index: number,\r\n topZ: number,\r\n frontRidgePoint: number[],\r\n topRidgePoint: number[],\r\n backRidgePoint: number[],\r\n ) => {\r\n if (index !== 1 && index !== 3) return;\r\n const isLeftSide = index === 3;\r\n const { lh, rh } = getWallHeight(composedWalls, index);\r\n const leftPoint = isLeftSide ? backRidgePoint : frontRidgePoint;\r\n const rightPoint = isLeftSide ? frontRidgePoint : backRidgePoint;\r\n const midPoint = isLeftSide ? topRidgePoint : [-topRidgePoint[0], topRidgePoint[1]];\r\n\r\n const roofEdges = getRoofSideEdges(composedWalls, index, topZ, lh, rh, leftPoint, midPoint, rightPoint);\r\n const roofPointsX = roofEdges.slice(1).map((edge) => edge.start);\r\n\r\n const composedWall = composedWalls[index];\r\n const wallPointsX = composedWall.wallsId.reduce(\r\n (acc, currId) => {\r\n const wall = useStore.getState().elements.find((e) => e.id === currId) as WallModel;\r\n if (!wall) return acc;\r\n return [...acc, wall.lx + acc[acc.length - 1]];\r\n },\r\n [0],\r\n );\r\n\r\n for (let i = 0; i < composedWall.wallsId.length; i++) {\r\n const id = composedWall.wallsId[i];\r\n const [wallStartX, wallEndX] = [wallPointsX[i], wallPointsX[i + 1]];\r\n const wallStartY = getYOnEdge(roofEdges, wallStartX);\r\n const wallEndY = getYOnEdge(roofEdges, wallEndX);\r\n\r\n if (wallStartY !== null && wallEndY !== null) {\r\n const wallLength = wallEndX - wallStartX;\r\n const wallCenterX = (wallStartX + wallEndX) / 2;\r\n\r\n const wallHeights: WallHeights = {\r\n left: wallStartY,\r\n right: wallEndY,\r\n };\r\n\r\n for (let i = 0; i < roofPointsX.length; i++) {\r\n const roofPointX = roofPointsX[i];\r\n if (roofPointX >= wallStartX && roofPointX <= wallEndX) {\r\n const x = (roofPointX - wallCenterX) / wallLength;\r\n const y = getYOnEdge(roofEdges, roofPointX);\r\n if (y !== null) {\r\n if (i === 0) {\r\n wallHeights.centerLeft = [x, y];\r\n } else if (i === 1) {\r\n wallHeights.center = [x, y];\r\n } else if (i === 2) {\r\n wallHeights.centerRight = [x, y];\r\n }\r\n }\r\n }\r\n }\r\n\r\n map.set(id, wallHeights);\r\n }\r\n }\r\n\r\n return map;\r\n };\r\n\r\n const getSideWallHeightsMap = (\r\n composedWalls: ComposedWall[],\r\n topZ: number,\r\n frontRidgePoint: number[],\r\n topRidgePoint: number[],\r\n backRidgePoint: number[],\r\n ) => {\r\n const map = new Map();\r\n setSideWallHeightsMap(map, composedWalls, 1, topZ, frontRidgePoint, topRidgePoint, backRidgePoint);\r\n setSideWallHeightsMap(map, composedWalls, 3, topZ, frontRidgePoint, topRidgePoint, backRidgePoint);\r\n return map;\r\n };\r\n\r\n const updateWalls = (\r\n composedWalls: ComposedWall[],\r\n topZ: number,\r\n frontRidgePoint: number[],\r\n topRidgePoint: number[],\r\n backRidgePoint: number[],\r\n ) => {\r\n const frontWallsIdSet = new Set(composedWalls[0].wallsId);\r\n const backWallsIdSet = new Set(composedWalls[2].wallsId);\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n topRidgePoint,\r\n backRidgePoint,\r\n );\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === parentId) {\r\n if (frontWallsIdSet.has(e.id)) {\r\n const wall = e as WallModel;\r\n const { lh, rh } = getWallHeight(composedWalls, 0);\r\n wall.roofId = id;\r\n wall.leftRoofHeight = lh;\r\n wall.rightRoofHeight = rh;\r\n } else if (backWallsIdSet.has(e.id)) {\r\n const wall = e as WallModel;\r\n const { lh, rh } = getWallHeight(composedWalls, 2);\r\n wall.roofId = id;\r\n wall.leftRoofHeight = lh;\r\n wall.rightRoofHeight = rh;\r\n } else if (sideWallHeightsMap.has(e.id)) {\r\n const wallHeights = sideWallHeightsMap.get(e.id);\r\n if (wallHeights) {\r\n const wall = e as WallModel;\r\n const { left, right, center, centerLeft, centerRight } = wallHeights;\r\n wall.roofId = id;\r\n wall.leftRoofHeight = left;\r\n wall.rightRoofHeight = right;\r\n if (centerLeft) {\r\n const [x, y] = centerLeft;\r\n if (wall.centerLeftRoofHeight) {\r\n wall.centerLeftRoofHeight[0] = x;\r\n wall.centerLeftRoofHeight[1] = y;\r\n } else {\r\n wall.centerLeftRoofHeight = [x, y];\r\n }\r\n } else {\r\n wall.centerLeftRoofHeight = undefined;\r\n }\r\n if (center) {\r\n const [x, y] = center;\r\n if (wall.centerRoofHeight) {\r\n wall.centerRoofHeight[0] = x;\r\n wall.centerRoofHeight[1] = y;\r\n } else {\r\n wall.centerRoofHeight = [x, y];\r\n }\r\n } else {\r\n wall.centerRoofHeight = undefined;\r\n }\r\n if (centerRight) {\r\n const [x, y] = centerRight;\r\n if (wall.centerRightRoofHeight) {\r\n wall.centerRightRoofHeight[0] = x;\r\n wall.centerRightRoofHeight[1] = y;\r\n } else {\r\n wall.centerRightRoofHeight = [x, y];\r\n }\r\n } else {\r\n wall.centerRightRoofHeight = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const composedWalls = useComposedWallArray(wallsId[0], parentId);\r\n\r\n const { highestWallHeight, topZ } = useComposedRoofHeight(composedWalls, rise, true);\r\n\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const centroid = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const points = composedWalls.map((w) => ({ x: w.leftPoint.x, y: w.leftPoint.y } as Point2));\r\n const p = Util.calculatePolygonCentroid(points);\r\n return new Vector3(p.x, p.y, topZ);\r\n }, [composedWalls, topZ]);\r\n\r\n // top ridge\r\n const topRidgeLeftPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[3];\r\n const [x, h] = topRidgePoint; // percent\r\n return getRidgePoint(wall, x, h).sub(centroid);\r\n }, [composedWalls, centroid, topRidgePoint]);\r\n\r\n const topRidgeRightPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[1];\r\n const [x, h] = topRidgePoint;\r\n return getRidgePoint(wall, -x, h).sub(centroid);\r\n }, [composedWalls, centroid, topRidgePoint]);\r\n\r\n const topRidgeMidPointV3 = useMemo(() => {\r\n return new Vector3().addVectors(topRidgeLeftPointV3, topRidgeRightPointV3).divideScalar(2);\r\n }, [topRidgeLeftPointV3, topRidgeRightPointV3]);\r\n\r\n // front ridge\r\n const frontRidgeLeftPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[3];\r\n const [x, h] = frontRidgePoint;\r\n return getRidgePoint(wall, x, h, composedWalls[0]).sub(centroid);\r\n }, [composedWalls, centroid, frontRidgePoint]);\r\n\r\n const frontRidgeRightPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[1];\r\n const [x, h] = frontRidgePoint;\r\n return getRidgePoint(wall, -x, h, composedWalls[0]).sub(centroid);\r\n }, [composedWalls, centroid, frontRidgePoint]);\r\n\r\n // back ridge\r\n const backRidgeLeftPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[1];\r\n const [x, h] = backRidgePoint;\r\n return getRidgePoint(wall, x, h, composedWalls[2]).sub(centroid);\r\n }, [composedWalls, centroid, backRidgePoint]);\r\n\r\n const backRidgeRightPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[3];\r\n const [x, h] = backRidgePoint;\r\n return getRidgePoint(wall, -x, h, composedWalls[2]).sub(centroid);\r\n }, [composedWalls, centroid, backRidgePoint]);\r\n\r\n const overhangs = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return [] as Vector3[];\r\n return composedWalls.map((wall) => RoofUtil.getComposedWallNormal(wall).multiplyScalar(wall.eavesLength));\r\n }, [composedWalls]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n\r\n if (!composedWalls || composedWalls.length !== 4) return segments;\r\n\r\n const [frontWall, rightWall, backWall, leftWall] = composedWalls;\r\n const [frontOverhang, rightOverhang, backOverhang, leftOverhang] = overhangs;\r\n\r\n const wallPoint0 = frontWall.leftPoint;\r\n const wallPoint1 = frontWall.rightPoint;\r\n const wallPoint2 = backWall.leftPoint;\r\n const wallPoint3 = backWall.rightPoint;\r\n\r\n const frontWallLeftPointAfterOffset = wallPoint0.clone().add(frontOverhang);\r\n const frontWallRightPointAfterOffset = wallPoint1.clone().add(frontOverhang);\r\n const leftWallLeftPointAfterOffset = wallPoint3.clone().add(leftOverhang);\r\n const leftWallRightPointAfterOffset = wallPoint0.clone().add(leftOverhang);\r\n const rightWallLeftPointAfterOffset = wallPoint1.clone().add(rightOverhang);\r\n const rightWallRightPointAfterOffset = wallPoint2.clone().add(rightOverhang);\r\n const backWallLeftPointAfterOffset = wallPoint2.clone().add(backOverhang);\r\n const backWallRightPointAfterOffset = wallPoint3.clone().add(backOverhang);\r\n\r\n // front side\r\n const frontSidePoints: Vector3[] = [];\r\n const { lh: frontWallLh, rh: frontWallRh } = getWallHeight(composedWalls, 0);\r\n\r\n const d0 = RoofUtil.getDistance(wallPoint0, wallPoint1, frontRidgeLeftPointV3.clone().add(centroid));\r\n const overhangHeight0 = Math.min(\r\n ((frontWall.eavesLength ?? 0) / d0) * (frontRidgeLeftPointV3.clone().add(centroid).z - frontWallLh),\r\n frontWallLh,\r\n );\r\n\r\n const d1 = RoofUtil.getDistance(wallPoint0, wallPoint1, frontRidgeRightPointV3.clone().add(centroid));\r\n const overhangHeight1 = Math.min(\r\n ((frontWall.eavesLength ?? 0) / d1) * (frontRidgeRightPointV3.clone().add(centroid).z - frontWallRh),\r\n frontWallRh,\r\n );\r\n\r\n const frontWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallLh - overhangHeight0)\r\n .sub(centroid);\r\n\r\n const frontWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallRh - overhangHeight1)\r\n .sub(centroid);\r\n\r\n const frontRidgeLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontRidgeLeftPointV3,\r\n frontRidgeRightPointV3,\r\n leftWallLeftPointAfterOffset.clone().sub(centroid),\r\n leftWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(frontRidgeLeftPointV3.z);\r\n\r\n const frontRidgeRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontRidgeRightPointV3,\r\n frontRidgeLeftPointV3,\r\n rightWallLeftPointAfterOffset.clone().sub(centroid),\r\n rightWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(frontRidgeRightPointV3.z);\r\n\r\n frontSidePoints.push(\r\n frontWallLeftPointAfterOverhang,\r\n frontWallRightPointAfterOverhang,\r\n frontRidgeRightPointAfterOverhang,\r\n frontRidgeLeftPointAfterOverhang,\r\n );\r\n frontSidePoints.push(\r\n frontWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n frontWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n frontRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n frontRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n\r\n const frontCenter = RoofUtil.getComposedWallCenter(frontWall);\r\n const frontAngle = -frontWall.relativeAngle;\r\n const frontSideLength = new Vector3(frontCenter.x, frontCenter.y).sub(topRidgeMidPointV3.clone().setZ(0)).length();\r\n segments.push({ points: frontSidePoints, angle: frontAngle, length: frontSideLength });\r\n\r\n // front top\r\n const frontTopPoints: Vector3[] = [];\r\n const topRidgeLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n topRidgeLeftPointV3,\r\n topRidgeRightPointV3,\r\n leftWallLeftPointAfterOffset.clone().sub(centroid),\r\n leftWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(topRidgeLeftPointV3.z);\r\n\r\n const topRidgeRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n topRidgeLeftPointV3,\r\n topRidgeRightPointV3,\r\n rightWallLeftPointAfterOffset.clone().sub(centroid),\r\n rightWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(topRidgeRightPointV3.z);\r\n\r\n frontTopPoints.push(\r\n frontRidgeLeftPointAfterOverhang,\r\n frontRidgeRightPointAfterOverhang,\r\n topRidgeRightPointAfterOverhang,\r\n topRidgeLeftPointAfterOverhang,\r\n );\r\n frontTopPoints.push(\r\n frontRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n frontRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n topRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n topRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n\r\n segments.push({ points: frontTopPoints, angle: frontAngle, length: frontSideLength });\r\n\r\n // back top\r\n const backAngle = -backWall.relativeAngle;\r\n const { lh: backWallLh, rh: backWallRh } = getWallHeight(composedWalls, 2);\r\n\r\n const d2 = RoofUtil.getDistance(wallPoint2, wallPoint3, backRidgeLeftPointV3.clone().add(centroid));\r\n const overhangHeight2 = Math.min(\r\n ((backWall.eavesLength ?? 0) / d2) * (backRidgeLeftPointV3.clone().add(centroid).z - backWallLh),\r\n backWallLh,\r\n );\r\n\r\n const d3 = RoofUtil.getDistance(wallPoint2, wallPoint3, backRidgeRightPointV3.clone().add(centroid));\r\n const overhangHeight3 = Math.min(\r\n ((backWall.eavesLength ?? 0) / d3) * (backRidgeRightPointV3.clone().add(centroid).z - backWallRh),\r\n backWallRh,\r\n );\r\n\r\n const backWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n )\r\n .setZ(backWallLh - overhangHeight2)\r\n .sub(centroid);\r\n\r\n const backWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n )\r\n .setZ(backWallRh - overhangHeight3)\r\n .sub(centroid);\r\n\r\n const backRidgeLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backRidgeLeftPointV3,\r\n backRidgeRightPointV3,\r\n rightWallLeftPointAfterOffset.clone().sub(centroid),\r\n rightWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(backRidgeRightPointV3.z);\r\n\r\n const backRidgeRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backRidgeRightPointV3,\r\n backRidgeLeftPointV3,\r\n leftWallLeftPointAfterOffset.clone().sub(centroid),\r\n leftWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(backRidgeRightPointV3.z);\r\n\r\n const backCenter = RoofUtil.getComposedWallCenter(backWall);\r\n const backSideLength = new Vector3(backCenter.x, backCenter.y).sub(topRidgeMidPointV3.clone().setZ(0)).length();\r\n\r\n const backTopPoints: Vector3[] = [];\r\n backTopPoints.push(\r\n backRidgeLeftPointAfterOverhang,\r\n backRidgeRightPointAfterOverhang,\r\n topRidgeLeftPointAfterOverhang,\r\n topRidgeRightPointAfterOverhang,\r\n );\r\n backTopPoints.push(\r\n backRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n backRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n topRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n topRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n segments.push({ points: backTopPoints, angle: backAngle, length: backSideLength });\r\n\r\n // back side\r\n const backSidePoints: Vector3[] = [];\r\n backSidePoints.push(\r\n backWallLeftPointAfterOverhang,\r\n backWallRightPointAfterOverhang,\r\n backRidgeRightPointAfterOverhang,\r\n backRidgeLeftPointAfterOverhang,\r\n );\r\n backSidePoints.push(\r\n backWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n backWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n backRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n backRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n segments.push({ points: backSidePoints, angle: backAngle, length: backSideLength });\r\n\r\n return segments;\r\n }, [composedWalls, topZ, thickness, topRidgePoint, frontRidgePoint, backRidgePoint]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall) => wall.leftPoint);\r\n }, [composedWalls]);\r\n\r\n // handle remove roof\r\n useEffect(() => {\r\n if (!composedWalls || composedWalls.length !== 4) {\r\n removeElementById(id, false, false, true);\r\n }\r\n }, [composedWalls]);\r\n\r\n const isFirstRender = useIsFirstRender();\r\n\r\n // update walls\r\n useEffect(() => {\r\n if (composedWalls?.length !== 4) return;\r\n\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id) || !isFirstRender) {\r\n if (isFlat) {\r\n updateFlatRoofWalls(composedWalls);\r\n } else {\r\n // update caused by changing wall height\r\n updateWalls(composedWalls, topZ, frontRidgePoint, topRidgePoint, backRidgePoint);\r\n }\r\n updateRooftopElements(foundationModel, id, roofSegments, centroid, topZ, thickness, isFlat);\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n }, [roofSegments]);\r\n\r\n useUpdateRooftopElementsByContextMenuChanges(foundationModel, id, roofSegments, centroid, topZ, thickness, isFlat);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n const segmentVertices: Vector3[][] = [];\r\n if (!composedWalls || composedWalls.length !== 4) return segmentVertices;\r\n\r\n const wallPoints = composedWalls.map(\r\n (w, i, arr) => new Vector3(w.leftPoint.x, w.leftPoint.y, getWallHeight(arr, i).lh),\r\n );\r\n\r\n const ridgeFLPoint = frontRidgeLeftPointV3.clone().add(centroid);\r\n const ridgeFRPoint = frontRidgeRightPointV3.clone().add(centroid);\r\n const ridgeBLPoint = backRidgeLeftPointV3.clone().add(centroid);\r\n const ridgeBRPoint = backRidgeRightPointV3.clone().add(centroid);\r\n const ridgeTLPoint = topRidgeLeftPointV3.clone().add(centroid);\r\n const ridgeTRPoint = topRidgeRightPointV3.clone().add(centroid);\r\n\r\n segmentVertices.push([wallPoints[0], wallPoints[1], ridgeFRPoint, ridgeFLPoint]);\r\n segmentVertices.push([ridgeFLPoint, ridgeFRPoint, ridgeTRPoint, ridgeTLPoint]);\r\n segmentVertices.push([ridgeTLPoint, ridgeTRPoint, ridgeBLPoint, ridgeBRPoint]);\r\n segmentVertices.push([wallPoints[2], wallPoints[3], ridgeBRPoint, ridgeBLPoint]);\r\n\r\n if (isFlat) {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, [wallPoints]);\r\n } else {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n }\r\n };\r\n\r\n const updateSegmentVertices = useUpdateSegmentVerticesMap(id, centroid, roofSegments, isFlat, RoofType.Gambrel);\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const selectMe = useStore(Selector.selectMe);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [flatHeatmapTexture, setFlatHeatmapTexture] = useState(null);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n if (isFlat) {\r\n const heatmap = getHeatmap(id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n // obtain the bounding rectangle\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices && segmentVertices.length > 0 && foundationModel) {\r\n const euler = new Euler(0, 0, foundationModel.rotation[2], 'ZYX');\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const s of segmentVertices) {\r\n for (const v of s) {\r\n const v2 = v.clone().applyEuler(euler);\r\n if (v2.x > maxX) maxX = v2.x;\r\n if (v2.x < minX) minX = v2.x;\r\n if (v2.y > maxY) maxY = v2.y;\r\n if (v2.y < minY) minY = v2.y;\r\n }\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n const vcx = (minX + maxX) / 2;\r\n const vcy = (minY + maxY) / 2;\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n t.offset.set(-minX / dx, -minY / dy);\r\n t.center.set(vcx / dx, vcy / dy);\r\n t.rotation = -foundationModel.rotation[2];\r\n t.repeat.set(1 / dx, 1 / dy);\r\n }\r\n setFlatHeatmapTexture(t);\r\n }\r\n }\r\n } else {\r\n const n = roofSegments.length;\r\n if (n > 0) {\r\n const textures = [];\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const userData = useUserData(id, foundationModel, centroid, roofSegments);\r\n\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n\r\n return (\r\n \r\n {/* roof segments */}\r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, centroid);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {isFlat ? (\r\n \r\n ) : (\r\n <>\r\n {roofSegments.map((segment, index, arr) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && composedWalls[0].lz === composedWalls[2].lz && ceilingPoints && (\r\n \r\n )}\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(topRidgeMidPointV3.x, topRidgeMidPointV3.y, topZ).add(centroid);\r\n if (foundationModel) {\r\n const r = -Math.atan2(camera.position.x - cx, camera.position.y - cy) - foundationModel.rotation[2];\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.TopMid);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.TopMid;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = topRidgeMidPointV3.x;\r\n state.selectedElementY = topRidgeMidPointV3.y;\r\n });\r\n }}\r\n />\r\n {!isFlat && (\r\n <>\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...topRidgePoint];\r\n setInterSectionPlane(topRidgeLeftPointV3, composedWalls[3]);\r\n setRoofHandleType(RoofHandleType.TopLeft);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...topRidgePoint];\r\n setInterSectionPlane(topRidgeRightPointV3, composedWalls[1]);\r\n setRoofHandleType(RoofHandleType.TopRight);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...frontRidgePoint];\r\n setInterSectionPlane(frontRidgeLeftPointV3, composedWalls[3]);\r\n setRoofHandleType(RoofHandleType.FrontLeft);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...frontRidgePoint];\r\n setInterSectionPlane(frontRidgeRightPointV3, composedWalls[1]);\r\n setRoofHandleType(RoofHandleType.FrontRight);\r\n }}\r\n />\r\n\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...backRidgePoint];\r\n setInterSectionPlane(backRidgeLeftPointV3, composedWalls[1]);\r\n setRoofHandleType(RoofHandleType.BackLeft);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...backRidgePoint];\r\n setInterSectionPlane(backRidgeRightPointV3, composedWalls[3]);\r\n setRoofHandleType(RoofHandleType.BackRight);\r\n }}\r\n />\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {enableIntersectionPlane && (\r\n {\r\n if (\r\n intersectionPlaneRef.current &&\r\n isPointerDownRef.current &&\r\n composedWalls &&\r\n composedWalls.length === 4\r\n ) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0] && foundationModel) {\r\n const point = intersects[0].point;\r\n if (point.z < 0.001) {\r\n return;\r\n }\r\n switch (roofHandleType) {\r\n case RoofHandleType.TopMid: {\r\n const newRise = Math.max(0, point.z - foundationModel.lz - 0.3 - highestWallHeight);\r\n const newTopZ = highestWallHeight + newRise;\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n newTopZ,\r\n frontRidgePoint,\r\n topRidgePoint,\r\n backRidgePoint,\r\n );\r\n // check if new height no confilc with childs on walls\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, newTopZ + roofModel.thickness);\r\n }\r\n break;\r\n }\r\n case RoofHandleType.FrontLeft: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[3], point),\r\n topRidgePoint[0] + 0.05,\r\n 0.45,\r\n );\r\n const hDiff = topZ - composedWalls[0].lz;\r\n const pz = Util.clamp((point.z - foundationModel.lz - composedWalls[0].lz) / hDiff, 0, 1);\r\n const newFrontRidgePoint = [px, pz];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n newFrontRidgePoint,\r\n topRidgePoint,\r\n backRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.frontRidgePoint[0] = newFrontRidgePoint[0];\r\n roof.frontRidgePoint[1] = newFrontRidgePoint[1];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.FrontRight: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[1], point),\r\n -0.45,\r\n -topRidgePoint[0] - 0.05,\r\n );\r\n const hDiff = topZ - composedWalls[0].lz;\r\n const pz = Util.clamp((point.z - foundationModel.lz - composedWalls[0].lz) / hDiff, 0, 1);\r\n const newFrontRidgePoint = [-px, pz];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n newFrontRidgePoint,\r\n topRidgePoint,\r\n backRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.frontRidgePoint = [...newFrontRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.TopLeft: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[3], point),\r\n -backRidgePoint[0] + 0.05,\r\n frontRidgePoint[0] - 0.05,\r\n );\r\n const newTopRidgePoint = [px, topRidgePoint[1]];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n newTopRidgePoint,\r\n backRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.topRidgePoint = [...newTopRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.TopRight: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[1], point),\r\n -frontRidgePoint[0] + 0.05,\r\n backRidgePoint[0] - 0.05,\r\n );\r\n const newTopRidgePoint = [-px, topRidgePoint[1]];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n newTopRidgePoint,\r\n backRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.topRidgePoint = [...newTopRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.BackLeft: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[1], point),\r\n -topRidgePoint[0] + 0.05,\r\n 0.45,\r\n );\r\n const hDiff = topZ - composedWalls[2].lz;\r\n const pz = Util.clamp((point.z - foundationModel.lz - composedWalls[2].lz) / hDiff, 0, 1);\r\n const newBackRidgePoint = [px, pz];\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n topRidgePoint,\r\n newBackRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.backRidgePoint = [...newBackRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.BackRight: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[3], point),\r\n -0.45,\r\n topRidgePoint[0] - 0.05,\r\n );\r\n const hDiff = topZ - composedWalls[2].lz;\r\n const pz = Util.clamp((point.z - foundationModel.lz - composedWalls[2].lz) / hDiff, 0, 1);\r\n const newBackRidgePoint = [-px, pz];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n topRidgePoint,\r\n newBackRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.backRidgePoint = [...newBackRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n onPointerUp={() => {\r\n switch (roofHandleType) {\r\n case RoofHandleType.TopMid: {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n break;\r\n }\r\n case RoofHandleType.TopLeft:\r\n case RoofHandleType.TopRight: {\r\n handleUndoableResizeRidge(id, roofHandleType, oldRidgeVal.current, topRidgePoint);\r\n break;\r\n }\r\n case RoofHandleType.FrontLeft:\r\n case RoofHandleType.FrontRight: {\r\n handleUndoableResizeRidge(id, roofHandleType, oldRidgeVal.current, frontRidgePoint);\r\n break;\r\n }\r\n case RoofHandleType.BackLeft:\r\n case RoofHandleType.BackRight: {\r\n handleUndoableResizeRidge(id, roofHandleType, oldRidgeVal.current, backRidgePoint);\r\n break;\r\n }\r\n }\r\n isPointerDownRef.current = false;\r\n setEnableIntersectionPlane(false);\r\n setRoofHandleType(RoofHandleType.Null);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(GambrelRoof, areRoofsEqual);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Cone, Extrude, Line, Plane } from '@react-three/drei';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { GableRoofModel, RoofModel, RoofStructure, RoofType } from 'src/models/RoofModel';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport {\r\n CanvasTexture,\r\n DoubleSide,\r\n Euler,\r\n Float32BufferAttribute,\r\n Mesh,\r\n Raycaster,\r\n Shape,\r\n Vector2,\r\n Vector3,\r\n} from 'three';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { useThree } from '@react-three/fiber';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n UNIT_VECTOR_POS_Z,\r\n} from 'src/constants';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n handleRoofBodyPointerDown,\r\n RoofHandle,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n updateRooftopElements,\r\n areRoofsEqual,\r\n} from './roofRenderer';\r\nimport { UnoableResizeGableRoofRidge } from 'src/undo/UndoableResize';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport { Util } from 'src/Util';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport {\r\n ComposedWall,\r\n useComposedWallArray,\r\n useIsFirstRender,\r\n useComposedRoofHeight,\r\n useRoofTexture,\r\n useTransparent,\r\n useUpdateOldRoofFiles,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n useUpdateRooftopElementsByContextMenuChanges,\r\n useUserData,\r\n} from './hooks';\r\nimport { ConvexGeometry } from 'src/js/ConvexGeometry';\r\nimport { CSG } from 'three-csg-ts';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { BufferRoofSegment, WindowData } from './roofSegment';\r\nimport Ceiling from './ceiling';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { WallHeights, isRoofValid } from './gambrelRoof';\r\nimport shallow from 'zustand/shallow';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zeroVector2 = new Vector2();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\ninterface RafterUnitProps {\r\n start: Vector3;\r\n end: Vector3;\r\n width: number;\r\n height: number;\r\n color: string;\r\n offset?: Vector3;\r\n}\r\ninterface RafterProps {\r\n ridgeLeftPoint: Vector3;\r\n ridgeRightPoint: Vector3;\r\n wallArray: ComposedWall[];\r\n overhang: number;\r\n isShed: boolean;\r\n height: number;\r\n width: number;\r\n spacing: number;\r\n color: string;\r\n}\r\n\r\nconst RafterUnit = React.memo(({ start, end, width, height, offset, color }: RafterUnitProps) => {\r\n const startV2 = useMemo(() => new Vector2(start.x, start.y), [start]);\r\n const endV2 = useMemo(() => new Vector2(end.x, end.y), [end]);\r\n\r\n const rotationZ = useMemo(() => new Vector2().subVectors(endV2, startV2).angle(), [startV2, endV2]);\r\n\r\n const shape = useMemo(() => {\r\n const s = new Shape();\r\n\r\n const x = startV2.distanceTo(endV2);\r\n const y = start.z - end.z;\r\n\r\n s.moveTo(0, 0);\r\n s.lineTo(x, -y);\r\n s.lineTo(x, -y + height);\r\n s.lineTo(0, height);\r\n s.closePath();\r\n\r\n return s;\r\n }, [start, end, startV2, endV2, height]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nconst Rafter = ({\r\n ridgeLeftPoint,\r\n ridgeRightPoint,\r\n wallArray,\r\n // overhang,\r\n height,\r\n isShed,\r\n width,\r\n spacing,\r\n color,\r\n}: RafterProps) => {\r\n const [frontWall, rightWall, backWall, leftWall] = wallArray;\r\n\r\n const ridgeUnitVector = useMemo(() => new Vector3().subVectors(ridgeRightPoint, ridgeLeftPoint).normalize(), []);\r\n\r\n const ridgeLeftPointAfterOverhang = useMemo(\r\n () => ridgeLeftPoint.clone().add(ridgeUnitVector.clone().multiplyScalar(-(leftWall.eavesLength ?? 0) / 2)),\r\n [ridgeLeftPoint, leftWall.eavesLength],\r\n );\r\n\r\n const ridgeRightPointAfterOverhang = useMemo(\r\n () => ridgeRightPoint.clone().add(ridgeUnitVector.clone().multiplyScalar((rightWall.eavesLength ?? 0) / 2)),\r\n [ridgeLeftPoint, rightWall.eavesLength],\r\n );\r\n\r\n const frontWallLeftPoint = frontWall.leftPoint.clone().setZ(frontWall.lz);\r\n const backWallRightPoint = backWall.rightPoint.clone().setZ(backWall.lz);\r\n\r\n const array = useMemo(() => {\r\n if (wallArray.length < 4) {\r\n return [];\r\n }\r\n\r\n const frontWallUnitVector = new Vector3()\r\n .subVectors(new Vector3(frontWall.rightPoint.x, frontWall.rightPoint.y, frontWall.lz), frontWallLeftPoint)\r\n .normalize();\r\n\r\n const backWallUnitVector = new Vector3()\r\n .subVectors(new Vector3(backWall.leftPoint.x, backWall.leftPoint.y, backWall.lz), backWallRightPoint)\r\n .normalize();\r\n\r\n const ridgeLength = ridgeLeftPoint.distanceTo(ridgeRightPoint);\r\n const frontWallLength = new Vector3().subVectors(frontWall.leftPoint, frontWall.rightPoint).length();\r\n const backWallLength = new Vector3().subVectors(backWall.leftPoint, backWall.rightPoint).length();\r\n\r\n const offset = width;\r\n const number = Math.floor((Math.min(ridgeLength, frontWallLength, backWallLength) - width) / spacing) + 2;\r\n return new Array(number).fill(0).map((v, i) => {\r\n let len;\r\n if (i === number - 1) {\r\n len = ridgeLength;\r\n } else {\r\n len = i * spacing + offset;\r\n }\r\n const ridge = ridgeLeftPoint.clone().add(ridgeUnitVector.clone().multiplyScalar(len));\r\n const front = frontWallLeftPoint.clone().add(frontWallUnitVector.clone().multiplyScalar(len));\r\n const back = backWallRightPoint.clone().add(backWallUnitVector.clone().multiplyScalar(len));\r\n const frontOverhang = new Vector3()\r\n .subVectors(front, ridge)\r\n .normalize()\r\n .multiplyScalar(frontWall.eavesLength ?? 0);\r\n const backOverhang = new Vector3()\r\n .subVectors(back, ridge)\r\n .normalize()\r\n .multiplyScalar(backWall.eavesLength ?? 0);\r\n front.add(frontOverhang);\r\n back.add(backOverhang);\r\n return { ridge, front, back };\r\n });\r\n }, [spacing, ridgeLeftPoint]);\r\n\r\n const showFront = ridgeLeftPoint.distanceTo(frontWallLeftPoint) > ridgeLeftPoint.distanceTo(backWallRightPoint);\r\n\r\n const offset = new Vector3(-width, 0, 0);\r\n const offsetTop = new Vector3(0, width / 2, 0);\r\n\r\n return (\r\n <>\r\n {array.map((v, i) => (\r\n \r\n {isShed ? (\r\n showFront ? (\r\n \r\n ) : (\r\n \r\n )\r\n ) : (\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nconst GableRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n if (roofSegments.length === 0) {\r\n return null;\r\n }\r\n const peripheryPoints: Vector3[] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness);\r\n\r\n const isShed = roofSegments.length === 1;\r\n\r\n for (const segment of roofSegments) {\r\n const [leftRoof, rightRoof, rightRidge, leftRidge] = segment.points;\r\n peripheryPoints.push(leftRidge, leftRoof, rightRoof, rightRidge);\r\n if (isShed) {\r\n peripheryPoints.push(leftRidge);\r\n }\r\n }\r\n\r\n const isFlat = Math.abs(roofSegments[0].points[0].z) < 0.015;\r\n const leftRidge = roofSegments[0].points[3];\r\n const rightRidge = roofSegments[0].points[2];\r\n\r\n const periphery = ;\r\n const ridge = ;\r\n return (\r\n <>\r\n {periphery}\r\n {!isFlat && !isShed && ridge}\r\n \r\n {periphery}\r\n {!isFlat && !isShed && ridge}\r\n \r\n {roofSegments.map((segment, idx) => {\r\n const [leftRoof, rightRoof, rightRidge, leftRidge] = segment.points;\r\n return (\r\n \r\n \r\n \r\n {isShed && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n );\r\n});\r\n\r\ninterface GableRoofProps extends BuildingParts {\r\n roofModel: GableRoofModel;\r\n}\r\n\r\nconst GableRoof = ({ roofModel, foundationModel }: GableRoofProps) => {\r\n let {\r\n id,\r\n parentId,\r\n wallsId,\r\n lz,\r\n rise = lz,\r\n thickness = 0.2,\r\n ridgeLeftPoint,\r\n ridgeRightPoint,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n locked,\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n roofStructure,\r\n rafterSpacing = 2,\r\n rafterWidth = 0.1,\r\n rafterColor = 'white',\r\n glassTint = '#73D8FF',\r\n opacity = 0.5,\r\n ceiling = false,\r\n } = roofModel;\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const selected = useSelected(id);\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n const { gl, camera } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [roofHandleType, setRoofHandleType] = useState(RoofHandleType.Null);\r\n\r\n const isShed = Math.abs(ridgeLeftPoint[0]) > 0.45;\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const oldRidgeLeft = useRef(ridgeLeftPoint[0]);\r\n const oldRidgeRight = useRef(ridgeRightPoint[0]);\r\n const oldRiseRef = useRef(rise);\r\n const isPointerDownRef = useRef(false);\r\n\r\n const updateRoofTopRidge = (elemId: string, left: number, right: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Gable) {\r\n (e as GableRoofModel).ridgeLeftPoint[0] = left;\r\n (e as GableRoofModel).ridgeRightPoint[0] = right;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleUndoableResizeTopRidge = (\r\n elemId: string,\r\n oldLeft: number,\r\n oldRight: number,\r\n newLeft: number,\r\n newRight: number,\r\n ) => {\r\n const undoable = {\r\n name: 'Resize Gable Roof Ridge',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldLeft: oldLeft,\r\n oldRight: oldRight,\r\n newLeft: newLeft,\r\n newRight: newRight,\r\n undo: () => {\r\n updateRoofTopRidge(undoable.resizedElementId, oldLeft, oldRight);\r\n },\r\n redo: () => {\r\n updateRoofTopRidge(undoable.resizedElementId, newLeft, newRight);\r\n },\r\n } as UnoableResizeGableRoofRidge;\r\n useStore.getState().addUndoable(undoable);\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const getRelPos = (foundation: ElementModel, wall: ComposedWall, point: Vector3) => {\r\n const foundationCenter = new Vector2(foundation.cx, foundation.cy);\r\n const wallCenter = new Vector3().addVectors(wall.leftPoint, wall.rightPoint).divideScalar(2);\r\n const wallLength = new Vector3().subVectors(wall.leftPoint, wall.rightPoint).length();\r\n const wallAbsCenter = new Vector2(wallCenter.x, wallCenter.y)\r\n .rotateAround(zeroVector2, foundation.rotation[2])\r\n .add(foundationCenter);\r\n const wallAbsAngle = foundation.rotation[2] + wall.relativeAngle;\r\n const p = new Vector2(point.x, point.y).sub(wallAbsCenter).rotateAround(zeroVector2, -wallAbsAngle);\r\n const x = p.x / wallLength;\r\n return Math.min(Math.abs(x), 0.5) * (x >= 0 ? 1 : -1);\r\n };\r\n\r\n const getRidgePoint = (wall: ComposedWall, px: number, ph: number) => {\r\n if (!wall) {\r\n return new Vector3();\r\n }\r\n const lx = new Vector3().subVectors(wall.leftPoint, wall.rightPoint).length();\r\n const center = new Vector3().addVectors(wall.leftPoint, wall.rightPoint).divideScalar(2);\r\n const e = new Euler(0, 0, wall.relativeAngle);\r\n const v = new Vector3(px * lx, 0, 0);\r\n const height = ph * rise + highestWallHeight;\r\n return new Vector3(center.x, center.y, height).add(v.applyEuler(e));\r\n };\r\n\r\n const getWallHeight = (arr: ComposedWall[], i: number) => {\r\n const w = arr[i];\r\n let lh;\r\n let rh;\r\n if (i === 0 || i === 2) {\r\n lh = w.lz;\r\n rh = w.lz;\r\n } else if (i === 1) {\r\n lh = arr[0].lz;\r\n rh = arr[2].lz;\r\n } else {\r\n lh = arr[2].lz;\r\n rh = arr[0].lz;\r\n }\r\n return { lh, rh };\r\n };\r\n\r\n const getShiftedArr = (array: T[], idx: number) => {\r\n const arr = array.slice().reverse();\r\n swap(arr, 0, idx - 1);\r\n swap(arr, idx, arr.length - 1);\r\n return arr;\r\n };\r\n\r\n const swap = (arr: T[], i: number, j: number) => {\r\n while (i < j) {\r\n const temp = arr[i];\r\n arr[i] = arr[j];\r\n arr[j] = temp;\r\n i++;\r\n j--;\r\n }\r\n };\r\n\r\n const getY = (k: number, b: number, x: number) => {\r\n return k * x + b;\r\n };\r\n\r\n const setGabledWallHeightsMap = (\r\n map: Map,\r\n composedWalls: ComposedWall[],\r\n index: number,\r\n topZ: number,\r\n ridgePoint: number[],\r\n ) => {\r\n const composedWall = composedWalls[index];\r\n const length = new Vector3().subVectors(composedWall.leftPoint, composedWall.rightPoint).length();\r\n const ridgeX = (ridgePoint[0] + 0.5) * length;\r\n const { lh, rh } = getWallHeight(composedWalls, index);\r\n const leftHalfK = (ridgePoint[1] * (topZ - lh)) / ridgeX;\r\n const leftHalfB = lh;\r\n const rightHalfK = -(ridgePoint[1] * (topZ - rh)) / (length - ridgeX);\r\n const rightHalfB = rh - rightHalfK * length;\r\n\r\n const wallPointsX = composedWall.wallsId.reduce(\r\n (acc, currId) => {\r\n const wall = useStore.getState().elements.find((e) => e.id === currId) as WallModel;\r\n if (!wall) return acc;\r\n return [...acc, wall.lx + acc[acc.length - 1]];\r\n },\r\n [0],\r\n );\r\n\r\n for (let i = 0; i < composedWall.wallsId.length; i++) {\r\n const id = composedWall.wallsId[i];\r\n const [leftX, rightX] = [wallPointsX[i], wallPointsX[i + 1]];\r\n const wallLength = rightX - leftX;\r\n\r\n const wallHeights: WallHeights = { left: 0, right: 0 };\r\n if (leftX < ridgeX) {\r\n wallHeights.left = getY(leftHalfK, leftHalfB, leftX);\r\n } else if (leftX === ridgeX) {\r\n wallHeights.left = getY(rightHalfK, rightHalfB, leftX);\r\n wallHeights.center = [-0.5, topZ];\r\n } else {\r\n wallHeights.left = getY(rightHalfK, rightHalfB, leftX);\r\n wallHeights.center = undefined;\r\n }\r\n\r\n if (rightX < ridgeX) {\r\n wallHeights.right = getY(leftHalfK, leftHalfB, rightX);\r\n wallHeights.center = undefined;\r\n } else if (rightX === ridgeX) {\r\n wallHeights.right = getY(leftHalfK, leftHalfB, rightX);\r\n wallHeights.center = [0.5, topZ];\r\n } else {\r\n wallHeights.right = getY(rightHalfK, rightHalfB, rightX);\r\n }\r\n if (leftX < ridgeX && rightX > ridgeX) {\r\n wallHeights.center = [(ridgeX - leftX) / wallLength - 0.5, topZ];\r\n }\r\n\r\n map.set(id, wallHeights);\r\n }\r\n\r\n return map;\r\n };\r\n\r\n const getGabledWallsHeightsMap = (\r\n composedWalls: ComposedWall[],\r\n topZ: number,\r\n ridgeLeftPoint: number[],\r\n ridgeRightPoint: number[],\r\n ) => {\r\n const map = new Map();\r\n setGabledWallHeightsMap(map, composedWalls, 1, topZ, ridgeRightPoint);\r\n setGabledWallHeightsMap(map, composedWalls, 3, topZ, ridgeLeftPoint);\r\n return map;\r\n };\r\n\r\n const updateWalls = (\r\n composedWalls: ComposedWall[],\r\n topZ: number,\r\n ridgeLeftPoint: number[],\r\n ridgeRightPoint: number[],\r\n ) => {\r\n const [frontWall, rightWall, backWall, leftWall] = composedWalls;\r\n\r\n const frontWallsIdSet = new Set(frontWall.wallsId);\r\n const backWallsIdSet = new Set(backWall.wallsId);\r\n const gabledWallsHeightsMap = getGabledWallsHeightsMap(composedWalls, topZ, ridgeLeftPoint, ridgeRightPoint);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === parentId) {\r\n if (frontWallsIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n w.roofId = id;\r\n if (ridgeLeftPoint[0] === 0.5) {\r\n w.leftRoofHeight = topZ;\r\n w.rightRoofHeight = topZ;\r\n w.centerRoofHeight = undefined;\r\n } else {\r\n const { lh, rh } = getWallHeight(composedWalls, 0);\r\n w.leftRoofHeight = lh;\r\n w.rightRoofHeight = rh;\r\n }\r\n } else if (backWallsIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n w.roofId = id;\r\n if (ridgeLeftPoint[0] === -0.5) {\r\n w.leftRoofHeight = topZ;\r\n w.rightRoofHeight = topZ;\r\n w.centerRoofHeight = undefined;\r\n } else {\r\n const { lh, rh } = getWallHeight(composedWalls, 2);\r\n w.leftRoofHeight = lh;\r\n w.rightRoofHeight = rh;\r\n }\r\n } else if (gabledWallsHeightsMap.has(e.id)) {\r\n const gabledWallHeights = gabledWallsHeightsMap.get(e.id);\r\n if (gabledWallHeights) {\r\n const wall = e as WallModel;\r\n const { left, right, center } = gabledWallHeights;\r\n wall.roofId = id;\r\n wall.leftRoofHeight = left;\r\n wall.rightRoofHeight = right;\r\n if (center) {\r\n const [x, h] = center;\r\n if (wall.centerRoofHeight) {\r\n wall.centerRoofHeight[0] = x;\r\n wall.centerRoofHeight[1] = h;\r\n } else {\r\n wall.centerRoofHeight = [x, h];\r\n }\r\n } else {\r\n wall.centerRoofHeight = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const composedWalls = useComposedWallArray(wallsId[0], parentId);\r\n\r\n const { highestWallHeight, topZ } = useComposedRoofHeight(composedWalls, rise, true);\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const centroid = useMemo(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) return new Vector3();\r\n const points = composedWalls.map((w) => ({ x: w.leftPoint.x, y: w.leftPoint.y } as Point2));\r\n const p = Util.calculatePolygonCentroid(points);\r\n return new Vector3(p.x, p.y, topZ);\r\n }, [composedWalls, topZ]);\r\n\r\n const ridgeLeftPointV3 = useMemo(() => {\r\n if (composedWalls === null) return new Vector3();\r\n const leftComposedWall = composedWalls[3];\r\n const [x, h] = ridgeLeftPoint; // percent\r\n return getRidgePoint(leftComposedWall, x, h);\r\n }, [composedWalls, topZ, ridgeLeftPoint]);\r\n\r\n const ridgeRightPointV3 = useMemo(() => {\r\n if (composedWalls === null) return new Vector3();\r\n const rightComposedWall = composedWalls[1];\r\n const [x, h] = ridgeRightPoint; // percent\r\n return getRidgePoint(rightComposedWall, x, h);\r\n }, [composedWalls, topZ, ridgeRightPoint]);\r\n\r\n const ridgeMidPoint = useMemo(() => {\r\n return new Vector3(\r\n (ridgeLeftPointV3.x + ridgeRightPointV3.x) / 2,\r\n (ridgeLeftPointV3.y + ridgeRightPointV3.y) / 2,\r\n topZ,\r\n );\r\n }, [ridgeLeftPointV3, ridgeRightPointV3]);\r\n\r\n const overhangs = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall) => RoofUtil.getComposedWallNormal(wall).multiplyScalar(wall.eavesLength));\r\n }, [composedWalls]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n\r\n if (!composedWalls || composedWalls.length !== 4 || !overhangs) return segments;\r\n\r\n // shed roof\r\n if (isShed) {\r\n const points: Vector3[] = [];\r\n const idx = ridgeLeftPoint[0] < 0 ? 0 : 2;\r\n const shiftedWallArray = getShiftedArr(composedWalls, idx);\r\n const shiftedOverhangs = getShiftedArr(overhangs, idx);\r\n const [frontWall, rightWall, backWall, leftWall] = shiftedWallArray;\r\n const [frontOverhang, rightOverhang, backOverhang, leftOverhang] = shiftedOverhangs;\r\n const wallPoint0 = frontWall.leftPoint;\r\n const wallPoint1 = frontWall.rightPoint;\r\n const wallPoint2 = backWall.leftPoint;\r\n const wallPoint3 = backWall.rightPoint;\r\n const frontWallLeftPointAfterOffset = wallPoint0.clone().add(frontOverhang);\r\n const frontWallRightPointAfterOffset = wallPoint1.clone().add(frontOverhang);\r\n const leftWallLeftPointAfterOffset = wallPoint3.clone().add(leftOverhang);\r\n const leftWallRightPointAfterOffset = wallPoint0.clone().add(leftOverhang);\r\n const rightWallLeftPointAfterOffset = wallPoint1.clone().add(rightOverhang);\r\n const rightWallRightPointAfterOffset = wallPoint2.clone().add(rightOverhang);\r\n const backWallLeftPointAfterOffset = wallPoint2.clone().add(backOverhang);\r\n const backWallRightPointAfterOffset = wallPoint3.clone().add(backOverhang);\r\n const { lh: frontWallLh, rh: frontWallRh } = getWallHeight(shiftedWallArray, 0);\r\n const { lh: backWallLh, rh: backWallRh } = getWallHeight(shiftedWallArray, 2);\r\n const d0 = RoofUtil.getDistance(wallPoint0, wallPoint1, wallPoint3);\r\n const overhangHeight0 = Math.min(((frontWall.eavesLength ?? 0) / d0) * (topZ - frontWallLh), frontWallLh);\r\n const d1 = RoofUtil.getDistance(wallPoint0, wallPoint1, wallPoint2);\r\n const overhangHeight1 = Math.min(((frontWall.eavesLength ?? 0) / d1) * (topZ - frontWallRh), frontWallRh);\r\n const d2 = RoofUtil.getDistance(wallPoint2, wallPoint3, wallPoint1);\r\n const overhangHeight2 = Math.min(((backWall.eavesLength ?? 0) / d2) * (topZ - frontWallRh), backWallLh);\r\n const d3 = RoofUtil.getDistance(wallPoint2, wallPoint3, wallPoint0);\r\n const overhangHeight3 = Math.min(((backWall.eavesLength ?? 0) / d3) * (topZ - frontWallLh), backWallRh);\r\n const frontWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallLh - overhangHeight0)\r\n .sub(centroid);\r\n const frontWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallRh - overhangHeight1)\r\n .sub(centroid);\r\n const backWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n )\r\n .setZ(topZ + overhangHeight2)\r\n .sub(centroid);\r\n const backWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n )\r\n .setZ(topZ + overhangHeight3)\r\n .sub(centroid);\r\n points.push(\r\n frontWallLeftPointAfterOverhang,\r\n frontWallRightPointAfterOverhang,\r\n backWallLeftPointAfterOverhang,\r\n backWallRightPointAfterOverhang,\r\n );\r\n points.push(\r\n frontWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n frontWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n backWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n backWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n const frontWallCenter = new Vector3().addVectors(frontWall.leftPoint, frontWall.rightPoint).divideScalar(2);\r\n const length = frontWallCenter.clone().sub(ridgeMidPoint.clone().setZ(0)).length();\r\n segments.push({ points, angle: -frontWall.relativeAngle, length });\r\n }\r\n // gable roof\r\n else {\r\n const [frontWall, rightWall, backWall, leftWall] = composedWalls;\r\n const [frontOverhang, rightOverhang, backOverhang, leftOverhang] = overhangs;\r\n\r\n const frontWallLeftPointAfterOffset = frontWall.leftPoint.clone().add(frontOverhang);\r\n const frontWallRightPointAfterOffset = frontWall.rightPoint.clone().add(frontOverhang);\r\n const leftWallLeftPointAfterOffset = backWall.rightPoint.clone().add(leftOverhang);\r\n const leftWallRightPointAfterOffset = frontWall.leftPoint.clone().add(leftOverhang);\r\n const rightWallLeftPointAfterOffset = frontWall.rightPoint.clone().add(rightOverhang);\r\n const rightWallRightPointAfterOffset = backWall.leftPoint.clone().add(rightOverhang);\r\n const backWallLeftPointAfterOffset = backWall.leftPoint.clone().add(backOverhang);\r\n const backWallRightPointAfterOffset = backWall.rightPoint.clone().add(backOverhang);\r\n\r\n const ridgeLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n ridgeLeftPointV3,\r\n ridgeRightPointV3,\r\n leftWallLeftPointAfterOffset.clone(),\r\n leftWallRightPointAfterOffset.clone(),\r\n )\r\n .setZ(ridgeLeftPointV3.z)\r\n .sub(centroid);\r\n\r\n const ridgeRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n ridgeLeftPointV3,\r\n ridgeRightPointV3,\r\n rightWallLeftPointAfterOffset.clone(),\r\n rightWallRightPointAfterOffset.clone(),\r\n )\r\n .setZ(ridgeRightPointV3.z)\r\n .sub(centroid);\r\n\r\n // front\r\n const frontPoints: Vector3[] = [];\r\n const { lh: frontWallLh, rh: frontWallRh } = getWallHeight(composedWalls, 0);\r\n\r\n const d0 = RoofUtil.getDistance(frontWall.leftPoint, frontWall.rightPoint, ridgeLeftPointV3);\r\n const overhangHeight0 = Math.min(\r\n ((frontWall.eavesLength ?? 0) / d0) * (ridgeLeftPointV3.z - frontWallLh),\r\n frontWallLh,\r\n );\r\n\r\n const d1 = RoofUtil.getDistance(frontWall.leftPoint, frontWall.rightPoint, ridgeRightPointV3);\r\n const overhangHeight1 = Math.min(\r\n ((frontWall.eavesLength ?? 0) / d1) * (ridgeRightPointV3.z - frontWallRh),\r\n frontWallRh,\r\n );\r\n\r\n const frontWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallLh - overhangHeight0)\r\n .sub(centroid);\r\n\r\n const frontWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallRh - overhangHeight1)\r\n .sub(centroid);\r\n\r\n frontPoints.push(\r\n frontWallLeftPointAfterOverhang,\r\n frontWallRightPointAfterOverhang,\r\n ridgeRightPointAfterOverhang,\r\n ridgeLeftPointAfterOverhang,\r\n );\r\n frontPoints.push(\r\n frontWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n frontWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n\r\n const frontWallCenter = new Vector3().addVectors(frontWall.leftPoint, frontWall.rightPoint).divideScalar(2);\r\n const frontLength = frontWallCenter.clone().sub(centroid.clone().setZ(0)).length();\r\n segments.push({ points: frontPoints, angle: -frontWall.relativeAngle, length: frontLength });\r\n\r\n // back\r\n const backPoints: Vector3[] = [];\r\n const { lh: backWallLh, rh: backWallRh } = getWallHeight(composedWalls, 2);\r\n const d2 = RoofUtil.getDistance(backWall.leftPoint, backWall.rightPoint, ridgeRightPointV3);\r\n const overhangHeight2 = Math.min(\r\n ((backWall.eavesLength ?? 0) / d2) * (ridgeRightPointV3.z - backWallLh),\r\n backWallLh,\r\n );\r\n\r\n const d3 = RoofUtil.getDistance(backWall.leftPoint, backWall.rightPoint, ridgeLeftPointV3);\r\n const overhangHeight3 = Math.min(\r\n ((backWall.eavesLength ?? 0) / d3) * (ridgeLeftPointV3.z - backWallRh),\r\n backWallRh,\r\n );\r\n\r\n const backWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n )\r\n .setZ(backWallLh - overhangHeight2)\r\n .sub(centroid);\r\n\r\n const backWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n )\r\n .setZ(backWallRh - overhangHeight3)\r\n .sub(centroid);\r\n\r\n backPoints.push(\r\n backWallLeftPointAfterOverhang,\r\n backWallRightPointAfterOverhang,\r\n ridgeLeftPointAfterOverhang,\r\n ridgeRightPointAfterOverhang,\r\n );\r\n backPoints.push(\r\n backWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n backWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n\r\n const backWallCenter = new Vector3().addVectors(backWall.leftPoint, backWall.rightPoint).divideScalar(2);\r\n const backLength = backWallCenter.clone().sub(centroid.clone().setZ(0)).length();\r\n segments.push({ points: backPoints, angle: -backWall.relativeAngle, length: backLength });\r\n }\r\n return segments;\r\n }, [composedWalls, ridgeLeftPointV3, ridgeRightPointV3, topZ, thickness]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall) => wall.leftPoint);\r\n }, [composedWalls]);\r\n\r\n // handle remove roof\r\n useEffect(() => {\r\n if (!composedWalls || composedWalls.length !== 4) {\r\n removeElementById(id, false, false, true);\r\n }\r\n }, [composedWalls]);\r\n\r\n const isFirstRender = useIsFirstRender();\r\n\r\n // update walls when adding new roof\r\n useEffect(() => {\r\n if (composedWalls?.length !== 4) return;\r\n\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id) || !isFirstRender) {\r\n updateWalls(composedWalls, topZ, ridgeLeftPoint, ridgeRightPoint);\r\n updateRooftopElements(foundationModel, id, roofSegments, centroid, topZ, thickness);\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n }, [roofSegments]);\r\n\r\n useUpdateRooftopElementsByContextMenuChanges(foundationModel, id, roofSegments, centroid, topZ, thickness);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n if (!composedWalls || composedWalls.length !== 4) return;\r\n\r\n const segmentVertices: Vector3[][] = [];\r\n // shed roof\r\n if (isShed) {\r\n const idx = ridgeLeftPoint[0] < 0 ? 0 : 2;\r\n\r\n const shiftedWallArray = getShiftedArr(composedWalls, idx);\r\n\r\n const wallPoints = shiftedWallArray.map(\r\n (w, i, arr) => new Vector3(w.leftPoint.x, w.leftPoint.y, getWallHeight(arr, i).lh),\r\n );\r\n segmentVertices.push(wallPoints);\r\n }\r\n // gable roof\r\n else {\r\n const wallPoints = composedWalls.map(\r\n (w, i, arr) => new Vector3(w.leftPoint.x, w.leftPoint.y, getWallHeight(arr, i).lh),\r\n );\r\n segmentVertices.push([wallPoints[0], wallPoints[1], ridgeRightPointV3.clone(), ridgeLeftPointV3.clone()]);\r\n segmentVertices.push([wallPoints[2], wallPoints[3], ridgeLeftPointV3.clone(), ridgeRightPointV3.clone()]);\r\n }\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n };\r\n\r\n useUpdateSegmentVerticesMap(id, centroid, roofSegments, false, RoofType.Gable);\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const selectMe = useStore(Selector.selectMe);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n const n = roofSegments.length;\r\n if (n > 0) {\r\n const textures = [];\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const userData = useUserData(id, foundationModel, centroid, roofSegments);\r\n\r\n if (composedWalls === null || composedWalls.length !== 4) return null;\r\n\r\n return (\r\n \r\n {/* roof segments group */}\r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, centroid);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {roofSegments.map((segment, i, arr) => {\r\n const { points, angle, length } = segment;\r\n const isFlat = Math.abs(points[0].z) < 0.1;\r\n if (!composedWalls) return null;\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/* wireframe */}\r\n {opacity > 0 && (\r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && composedWalls[0].lz === composedWalls[2].lz && ceilingPoints && (\r\n \r\n )}\r\n\r\n {/* rafter */}\r\n {roofStructure === RoofStructure.Rafter && composedWalls && composedWalls.length === 4 && (\r\n {\r\n handleContextMenu(e, id);\r\n }}\r\n onPointerDown={(e) => {\r\n handleRoofBodyPointerDown(e, id, parentId);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n {/* mid handle */}\r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setShowIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeMidPoint.x, ridgeMidPoint.y, topZ);\r\n if (foundationModel) {\r\n const r =\r\n -Math.atan2(camera.position.x - foundationModel.cx, camera.position.y - foundationModel.cy) -\r\n foundationModel.rotation[2];\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Mid);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.Mid;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = ridgeMidPoint.x;\r\n state.selectedElementY = ridgeMidPoint.y;\r\n });\r\n }}\r\n />\r\n {/* side handles */}\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeLeft.current = ridgeLeftPoint[0];\r\n oldRidgeRight.current = ridgeRightPoint[0];\r\n setShowIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeLeftPointV3.x, ridgeLeftPointV3.y, topZ);\r\n if (foundationModel && composedWalls && composedWalls[3]) {\r\n const dir = new Vector3().subVectors(ridgeLeftPointV3, camera.position).normalize();\r\n const rX = Math.atan2(dir.z, Math.hypot(dir.x, dir.y));\r\n const rZ = composedWalls[3].relativeAngle;\r\n intersectionPlaneRotation.set(-HALF_PI + rX, 0, rZ, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Left);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeLeft.current = ridgeLeftPoint[0];\r\n oldRidgeRight.current = ridgeRightPoint[0];\r\n setShowIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeRightPointV3.x, ridgeRightPointV3.y, topZ);\r\n if (foundationModel && composedWalls && composedWalls[1]) {\r\n const dir = new Vector3().subVectors(ridgeRightPointV3, camera.position).normalize();\r\n const rX = Math.atan2(dir.z, Math.hypot(dir.x, dir.y));\r\n const rZ = composedWalls[1].relativeAngle;\r\n intersectionPlaneRotation.set(-HALF_PI + rX, 0, rZ, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Right);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n {\r\n if (\r\n intersectionPlaneRef.current &&\r\n isPointerDownRef.current &&\r\n foundationModel &&\r\n composedWalls &&\r\n composedWalls.length === 4\r\n ) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0]) {\r\n const point = intersects[0].point;\r\n if (point.z < 0.001) {\r\n return;\r\n }\r\n switch (roofHandleType) {\r\n case RoofHandleType.Left: {\r\n const wall = composedWalls[3];\r\n if (wall) {\r\n let x = getRelPos(foundationModel, wall, point);\r\n if (Math.abs(x) >= 0.45 && Math.abs(x) < 0.5) {\r\n x = 0.45 * Math.sign(x);\r\n }\r\n const newRidgeLeftPoint = [x, ridgeLeftPoint[1]];\r\n const newRidgeRightPoint = [-x, ridgeRightPoint[1]];\r\n const gabledWallsHeightsMap = getGabledWallsHeightsMap(\r\n composedWalls,\r\n topZ,\r\n newRidgeLeftPoint,\r\n newRidgeRightPoint,\r\n );\r\n if (isRoofValid(gabledWallsHeightsMap, parentId)) {\r\n updateRoofTopRidge(id, x, -x);\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.Right: {\r\n const wall = composedWalls[1];\r\n if (wall) {\r\n let x = getRelPos(foundationModel, wall, point);\r\n if (Math.abs(x) >= 0.45 && Math.abs(x) < 0.5) {\r\n x = 0.45 * Math.sign(x);\r\n }\r\n const newRidgeLeftPoint = [-x, ridgeLeftPoint[1]];\r\n const newRidgeRightPoint = [x, ridgeRightPoint[1]];\r\n const gabledWallsHeightsMap = getGabledWallsHeightsMap(\r\n composedWalls,\r\n topZ,\r\n newRidgeLeftPoint,\r\n newRidgeRightPoint,\r\n );\r\n if (isRoofValid(gabledWallsHeightsMap, parentId)) {\r\n updateRoofTopRidge(id, -x, x);\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.Mid: {\r\n let newRise: number;\r\n if (isShed) {\r\n newRise = Math.max(0, point.z - foundationModel.lz - 0.3 - highestWallHeight);\r\n } else {\r\n newRise = point.z - foundationModel.lz - 0.3 - highestWallHeight;\r\n }\r\n const newTopZ = highestWallHeight + newRise;\r\n const gabledWallsHeightsMap = getGabledWallsHeightsMap(\r\n composedWalls,\r\n newTopZ,\r\n ridgeLeftPoint,\r\n ridgeRightPoint,\r\n );\r\n if (isRoofValid(gabledWallsHeightsMap, parentId)) {\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, topZ + roofModel.thickness);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n onPointerUp={() => {\r\n switch (roofHandleType) {\r\n case RoofHandleType.Mid: {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n break;\r\n }\r\n case RoofHandleType.Left:\r\n case RoofHandleType.Right: {\r\n handleUndoableResizeTopRidge(\r\n id,\r\n oldRidgeLeft.current,\r\n oldRidgeRight.current,\r\n ridgeLeftPoint[0],\r\n ridgeRightPoint[0],\r\n );\r\n }\r\n }\r\n isPointerDownRef.current = false;\r\n setShowIntersectionPlane(false);\r\n setRoofHandleType(RoofHandleType.Null);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst RoofSegment = ({\r\n index,\r\n id,\r\n points,\r\n centroid,\r\n angle,\r\n length,\r\n textureType,\r\n heatmaps,\r\n color = 'white',\r\n sideColor,\r\n relativeAngle,\r\n foundation,\r\n roofStructure,\r\n glassTint,\r\n opacity = 0.5,\r\n windows,\r\n}: {\r\n index: number;\r\n id: string;\r\n points: Vector3[];\r\n centroid: Vector3;\r\n angle: number;\r\n length: number;\r\n textureType: RoofTexture;\r\n heatmaps: CanvasTexture[];\r\n color: string | undefined;\r\n sideColor: string | undefined;\r\n relativeAngle: number;\r\n foundation: FoundationModel | null;\r\n roofStructure?: RoofStructure;\r\n glassTint?: string;\r\n opacity?: number;\r\n windows: WindowModel[];\r\n}) => {\r\n const world = useStore.getState().world;\r\n const getElementById = useStore(Selector.getElementById);\r\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\r\n const hourlyHeatExchangeArrayMap = useDataStore.getState().hourlyHeatExchangeArrayMap;\r\n\r\n const texture = useRoofTexture(roofStructure === RoofStructure.Rafter ? RoofTexture.NoTexture : textureType);\r\n const { transparent, opacity: _opacity } = useTransparent(roofStructure === RoofStructure.Rafter, opacity);\r\n const { invalidate } = useThree();\r\n\r\n const heatmapMeshRef = useRef(null);\r\n const bulkMeshRef = useRef(null);\r\n const planeRef = useRef(null);\r\n const mullionRef = useRef(null);\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowLength = useRef();\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const [mullionLx, setMullionLx] = useState(0);\r\n const [mullionLz, setMullionLz] = useState(0);\r\n const [show, setShow] = useState(true);\r\n\r\n const checkValid = (v1: Vector3, v2: Vector3) => {\r\n return v1.clone().setZ(0).distanceTo(v2.clone().setZ(0)) > 2;\r\n };\r\n\r\n const isNorthWest = (relativeAngle: number) => {\r\n return (\r\n Math.abs(relativeAngle) < Math.PI / 4 ||\r\n Math.abs(relativeAngle - Math.PI * 2) < Math.PI / 4 ||\r\n Math.abs(relativeAngle - Math.PI) < Math.PI / 4\r\n );\r\n };\r\n\r\n const overhangLines: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments) return undefined;\r\n const lines: Vector3[][] = [];\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft, wallLeftAfterOverhang] = points;\r\n const thickness = wallLeftAfterOverhang.z - wallLeft.z;\r\n const thicknessVector = new Vector3(0, 0, thickness + 0.1);\r\n for (const seg of segments.values()) {\r\n let p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n p = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[3].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n p = [];\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[2].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n return lines;\r\n }, [showHeatFluxes]);\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (foundation && foundation.notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id + '-' + index);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments || !segments[index]) return undefined;\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft, wallLeftAfterOverhang] = points;\r\n const thickness = wallLeftAfterOverhang.z - wallLeft.z;\r\n const s = segments[index].map((v) => v.clone().sub(centroid).add(new Vector3(0, 0, thickness)));\r\n if (!s) return undefined;\r\n let area = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\r\n if (area === 0) return undefined;\r\n let windows = getChildrenOfType(ObjectType.Window, id);\r\n const segmentsWithoutOverhang = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (segmentsWithoutOverhang && segmentsWithoutOverhang[index]) {\r\n windows = windows.filter((e) => {\r\n const w = e as WindowModel;\r\n const wcy = w.cy + (w.windowType === WindowType.Polygonal && w.polygonTop ? w.polygonTop[1] / 2 : 0);\r\n return RoofUtil.onSegment(segmentsWithoutOverhang[index], e.cx, wcy);\r\n });\r\n }\r\n if (windows && windows.length > 0) {\r\n for (const w of windows) {\r\n area -= Util.getWindowArea(w as WindowModel);\r\n }\r\n }\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const s0 = s[0].clone();\r\n const s1 = s[1].clone();\r\n const s2 = s[2].clone();\r\n const v10 = new Vector3().subVectors(s1, s0);\r\n const v20 = new Vector3().subVectors(s2, s0);\r\n const v21 = new Vector3().subVectors(s2, s1);\r\n const length10 = v10.length();\r\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\r\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\r\n const m = Math.max(2, Math.round(length10 / cellSize));\r\n const n = Math.max(2, Math.round(distance / cellSize));\r\n v10.normalize();\r\n v20.normalize();\r\n v21.normalize();\r\n // find the normal vector of the quad\r\n const normal = new Vector3().crossVectors(v20, v21).normalize();\r\n // find the incremental vector going along the bottom edge (half of length)\r\n const dm = v10.multiplyScalar((0.5 * length10) / m);\r\n // find the incremental vector going from bottom to top (half of length)\r\n const dn = new Vector3()\r\n .crossVectors(normal, v10)\r\n .normalize()\r\n .multiplyScalar((0.5 * distance) / n);\r\n // find the starting point of the grid (shift half of length in both directions)\r\n const v0 = s0.clone().add(dm).add(dn);\r\n // double half-length to full-length for the increment vectors in both directions\r\n dm.multiplyScalar(2);\r\n dn.multiplyScalar(2);\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowLength.current = normal.clone().multiplyScalar(0.1);\r\n heatFluxArrowEuler.current = Util.getEuler(UNIT_VECTOR_POS_Z, normal, 'YXZ', -Math.sign(intensity) * HALF_PI);\r\n const vectors: Vector3[][] = [];\r\n const origin = new Vector3();\r\n let isRoof;\r\n for (let p = 0; p < m; p++) {\r\n const dmp = dm.clone().multiplyScalar(p);\r\n for (let q = 0; q < n; q++) {\r\n origin.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\r\n isRoof = true;\r\n if (windows && windows.length > 0) {\r\n // add the centroid back as the vertices of the window are not relative to it\r\n const ox = origin.x + centroid.x;\r\n const oy = origin.y + centroid.y;\r\n for (const w of windows) {\r\n const vertices = RoofUtil.getRelativeWindowVerticesOnRoof(w as WindowModel);\r\n const points = Util.getPoints(vertices);\r\n if (Util.isPointInside(ox, oy, points)) {\r\n isRoof = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (isRoof) {\r\n const v: Vector3[] = [];\r\n if (intensity < 0) {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(-intensity)));\r\n } else {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(intensity)));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [showHeatFluxes, heatFluxScaleFactor, centroid, points]);\r\n\r\n useEffect(() => {\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft, wallLeftAfterOverhang] = points;\r\n const thickness = wallLeftAfterOverhang.z - wallLeft.z;\r\n\r\n if (heatmapMeshRef.current) {\r\n const geo = heatmapMeshRef.current.geometry;\r\n if (geo) {\r\n const positions = new Float32Array(18);\r\n const zOffset = thickness + 0.01; // a small number to ensure the surface mesh stay atop;\r\n positions[0] = points[0].x;\r\n positions[1] = points[0].y;\r\n positions[2] = points[0].z + zOffset;\r\n positions[3] = points[1].x;\r\n positions[4] = points[1].y;\r\n positions[5] = points[1].z + zOffset;\r\n positions[6] = points[2].x;\r\n positions[7] = points[2].y;\r\n positions[8] = points[2].z + zOffset;\r\n positions[9] = points[2].x;\r\n positions[10] = points[2].y;\r\n positions[11] = points[2].z + zOffset;\r\n positions[12] = points[3].x;\r\n positions[13] = points[3].y;\r\n positions[14] = points[3].z + zOffset;\r\n positions[15] = points[0].x;\r\n positions[16] = points[0].y;\r\n positions[17] = points[0].z + zOffset;\r\n // don't call geo.setFromPoints. It doesn't seem to work correctly.\r\n geo.setAttribute('position', new Float32BufferAttribute(positions, 3));\r\n geo.computeVertexNormals();\r\n const uvs = [];\r\n uvs.push(0, 0);\r\n uvs.push(1, 0);\r\n uvs.push(1, 1);\r\n uvs.push(1, 1);\r\n uvs.push(0, 1);\r\n uvs.push(0, 0);\r\n geo.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\r\n }\r\n }\r\n\r\n if (bulkMeshRef.current) {\r\n bulkMeshRef.current.geometry = new ConvexGeometry(points, angle, length);\r\n const isValid = checkValid(wallLeft, ridgeLeft) && checkValid(wallRight, ridgeRight);\r\n setShow(isValid);\r\n\r\n if (roofStructure === RoofStructure.Glass && isValid) {\r\n const center = Util.calculatePolygonCentroid(points.map(Util.mapVector3ToPoint2));\r\n const centerV3 = new Vector3(center.x, center.y, 0);\r\n\r\n const width = 0.25;\r\n const wl = new Vector3().addVectors(\r\n wallLeft,\r\n centerV3.clone().sub(wallLeft).setZ(0).normalize().multiplyScalar(width),\r\n );\r\n const wr = new Vector3().addVectors(\r\n wallRight,\r\n centerV3.clone().sub(wallRight).setZ(0).normalize().multiplyScalar(width),\r\n );\r\n const rr = new Vector3().addVectors(\r\n ridgeRight,\r\n centerV3.clone().sub(ridgeRight).normalize().multiplyScalar(width),\r\n );\r\n const rl = new Vector3().addVectors(\r\n ridgeLeft,\r\n centerV3.clone().sub(ridgeLeft).normalize().multiplyScalar(width),\r\n );\r\n\r\n const h: Vector3[] = [];\r\n h.push(wl);\r\n h.push(wr);\r\n h.push(rr.setZ(wr.z));\r\n h.push(rl.setZ(wl.z));\r\n h.push(wl.clone().setZ(1));\r\n h.push(wr.clone().setZ(1));\r\n h.push(rr.clone().setZ(1));\r\n h.push(rl.clone().setZ(1));\r\n\r\n const holeMesh = new Mesh(new ConvexGeometry(h));\r\n const resMesh = CSG.subtract(bulkMeshRef.current, holeMesh);\r\n bulkMeshRef.current.geometry = resMesh.geometry;\r\n\r\n if (isNorthWest(relativeAngle)) {\r\n const lx = wl.distanceTo(wr);\r\n const ly = wallLeft.distanceTo(ridgeLeft);\r\n\r\n setMullionLx(lx);\r\n setMullionLz(ly);\r\n\r\n const rotationX = new Vector3().subVectors(wallLeft, ridgeLeft).angleTo(new Vector3(0, -1, 0));\r\n if (planeRef.current) {\r\n planeRef.current.scale.set(lx, ly, 1);\r\n planeRef.current.rotation.set(rotationX, 0, 0);\r\n }\r\n if (mullionRef.current) {\r\n mullionRef.current.rotation.set(rotationX - HALF_PI, 0, 0);\r\n }\r\n } else {\r\n const lx = wallLeft.distanceTo(ridgeLeft);\r\n const ly = wl.distanceTo(wr);\r\n\r\n setMullionLx(lx);\r\n setMullionLz(ly);\r\n\r\n const rotationY = new Vector3().subVectors(wallLeft, ridgeLeft).angleTo(new Vector3(1, 0, 0));\r\n if (planeRef.current) {\r\n planeRef.current.scale.set(lx, ly, 1);\r\n planeRef.current.rotation.set(0, rotationY, 0);\r\n }\r\n if (mullionRef.current) {\r\n mullionRef.current.rotation.set(HALF_PI, rotationY, 0, 'YXZ');\r\n }\r\n }\r\n\r\n const cz = (wallLeft.z + ridgeLeft.z) / 2 + thickness * 0.75;\r\n if (planeRef.current) {\r\n planeRef.current.position.set(center.x, center.y, cz);\r\n }\r\n if (mullionRef.current) {\r\n mullionRef.current.position.set(center.x, center.y, cz);\r\n }\r\n }\r\n }\r\n invalidate();\r\n }, [points, angle, length, relativeAngle, show, showSolarRadiationHeatmap, roofStructure]);\r\n\r\n // FIXME: Bulk mesh can be null if it is not initialized. Refreshing the page fixes the problem.\r\n\r\n const segment = { points: points, angle: angle, length: length };\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n return (\r\n <>\r\n {((_opacity > 0 && roofStructure === RoofStructure.Rafter) || roofStructure !== RoofStructure.Rafter) && (\r\n <>\r\n \r\n \r\n )}\r\n {/* {roofStructure === RoofStructure.Glass && show && (\r\n <>\r\n {_opacity > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )} */}\r\n\r\n {overhangLines &&\r\n overhangLines.map((v, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {heatFluxes &&\r\n heatFluxes.map((v, index) => {\r\n return (\r\n \r\n \r\n ;\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(GableRoof, areRoofsEqual);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\nimport { Line, Plane } from '@react-three/drei';\r\nimport { useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { HALF_PI } from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { HipRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport { UndoableResizeHipRoofRidge } from 'src/undo/UndoableResize';\r\nimport { Util } from 'src/Util';\r\nimport { CanvasTexture, DoubleSide, Euler, Mesh, Raycaster, RepeatWrapping, Vector2, Vector3 } from 'three';\r\nimport {\r\n ComposedWall,\r\n useComposedWallArray,\r\n useComposedRoofHeight,\r\n useRoofTexture,\r\n useUpdateOldRoofFiles,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n useUpdateRooftopElements,\r\n useUserData,\r\n} from './hooks';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n areRoofsEqual,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n RoofHandle,\r\n RoofSegmentGroupUserData,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n} from './roofRenderer';\r\nimport RoofSegment from './roofSegment';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Ceiling from './ceiling';\r\nimport FlatRoof from './flatRoof';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport shallow from 'zustand/shallow';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst HipRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n if (roofSegments.length === 0) {\r\n return null;\r\n }\r\n const peripheryPoints: Vector3[] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness);\r\n\r\n for (let i = 0; i < roofSegments.length; i++) {\r\n const [leftPoint, rightPoint] = roofSegments[i].points;\r\n peripheryPoints.push(leftPoint);\r\n if (i === roofSegments.length - 1) {\r\n peripheryPoints.push(rightPoint);\r\n }\r\n }\r\n\r\n const isFlat = Math.abs(roofSegments[0].points[0].z) < 0.015;\r\n const leftRidge = roofSegments[0].points[3].clone().add(thicknessVector);\r\n const rightRidge = roofSegments[0].points[2].clone().add(thicknessVector);\r\n const periphery = ;\r\n\r\n return (\r\n <>\r\n {periphery}\r\n {!isFlat && }\r\n \r\n {periphery}\r\n {roofSegments.map((segment, idx) => {\r\n const [leftRoof, rightRoof, rightRidge, leftRidge] = segment.points;\r\n const points = [leftRoof.clone().sub(thicknessVector), leftRoof];\r\n return ;\r\n })}\r\n \r\n \r\n );\r\n});\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\ninterface HipRoofProps extends BuildingParts {\r\n roofModel: HipRoofModel;\r\n}\r\n\r\nconst HipRoof = ({ roofModel, foundationModel }: HipRoofProps) => {\r\n let {\r\n id,\r\n parentId,\r\n cx,\r\n cy,\r\n lz,\r\n wallsId,\r\n leftRidgeLength,\r\n rightRidgeLength,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n thickness = 0.2,\r\n locked,\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n roofType,\r\n rise = lz,\r\n ceiling = false,\r\n } = roofModel;\r\n\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const composedWalls = useComposedWallArray(wallsId[0], parentId);\r\n const texture = useRoofTexture(textureType);\r\n\r\n const selected = useSelected(id);\r\n\r\n const [enableIntersectionPlane, setEnableIntersectionPlane] = useState(false);\r\n const [roofHandleType, setRoofHandleType] = useState(RoofHandleType.Null);\r\n const [leftRidgeLengthCurr, setLeftRidgeLengthCurr] = useState(leftRidgeLength);\r\n const [rightRidgeLengthCurr, setRightRidgeLengthCurr] = useState(rightRidgeLength);\r\n\r\n const { highestWallHeight, topZ } = useComposedRoofHeight(composedWalls, rise);\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const { gl, camera } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const isPointerDownRef = useRef(false);\r\n const oldRiseRef = useRef(rise);\r\n\r\n const isFlat = rise < 0.01;\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n useEffect(() => {\r\n setLeftRidgeLengthCurr(leftRidgeLength);\r\n }, [leftRidgeLength]);\r\n\r\n useEffect(() => {\r\n setRightRidgeLengthCurr(rightRidgeLength);\r\n }, [rightRidgeLength]);\r\n\r\n const setHipRoofRidgeLength = (elemId: string, leftRidge: number, rightRidge: number, manualUpdate = false) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Hip) {\r\n (e as HipRoofModel).leftRidgeLength = leftRidge;\r\n (e as HipRoofModel).rightRidgeLength = rightRidge;\r\n if (manualUpdate) {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleUndoableResizeRidgeLength = (\r\n elemId: string,\r\n oldLeft: number,\r\n oldRight: number,\r\n newLeft: number,\r\n newRight: number,\r\n ) => {\r\n const undoable = {\r\n name: 'Resize Hip Roof Ridge',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldLeftRidgeLength: oldLeft,\r\n oldRightRidgeLength: oldRight,\r\n newLeftRidgeLength: newLeft,\r\n newRightRidgeLength: newRight,\r\n undo: () => {\r\n setHipRoofRidgeLength(\r\n undoable.resizedElementId,\r\n undoable.oldLeftRidgeLength,\r\n undoable.oldRightRidgeLength,\r\n true,\r\n );\r\n },\r\n redo: () => {\r\n setHipRoofRidgeLength(\r\n undoable.resizedElementId,\r\n undoable.newLeftRidgeLength,\r\n undoable.newRightRidgeLength,\r\n true,\r\n );\r\n },\r\n } as UndoableResizeHipRoofRidge;\r\n useStore.getState().addUndoable(undoable);\r\n };\r\n\r\n const getWallsPoint2 = (wallArray: ComposedWall[]) => {\r\n const arr: Point2[] = [];\r\n for (const w of wallArray) {\r\n arr.push({ x: w.leftPoint.x, y: w.leftPoint.y });\r\n }\r\n return arr;\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const makeSegment = (vector: Vector3[], p1: Vector3, p2: Vector3, p3: Vector3, p4?: Vector3) => {\r\n vector.push(p1, p2, p3);\r\n if (p4) {\r\n vector.push(p4);\r\n }\r\n vector.push(p1.clone().add(thicknessVector), p2.clone().add(thicknessVector), p3.clone().add(thicknessVector));\r\n if (p4) {\r\n vector.push(p4.clone().add(thicknessVector));\r\n }\r\n };\r\n\r\n const getOverhangHeight = () => {\r\n if (composedWalls === null || composedWalls.length !== 4) return 0;\r\n\r\n const wallPoints = composedWalls.map((w) => w.leftPoint);\r\n const ridges = [ridgeLeftPoint, ridgeRightPoint, ridgeRightPoint, ridgeLeftPoint];\r\n\r\n let height = Infinity;\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const w = composedWalls[i];\r\n const dLeft = RoofUtil.getDistance(wallPoints[i], wallPoints[(i + 1) % 4], ridges[i]);\r\n const overhangHeightLeft = Math.min(((w.eavesLength ?? 0) / dLeft) * (ridges[i].z - w.lz), w.lz);\r\n const dRight = RoofUtil.getDistance(wallPoints[i], wallPoints[(i + 1) % 4], ridges[(i + 1) % 4]);\r\n const overhangHeightRight = Math.min(((w.eavesLength ?? 0) / dRight) * (ridges[(i + 1) % 4].z - w.lz), w.lz);\r\n height = Math.min(Math.min(overhangHeightLeft, overhangHeightRight), height);\r\n }\r\n\r\n return Number.isNaN(height) ? 0 : height;\r\n };\r\n\r\n const centroid2D = useMemo(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) return new Vector2();\r\n\r\n const points = getWallsPoint2(composedWalls);\r\n const p = Util.calculatePolygonCentroid(points);\r\n return new Vector2(p.x, p.y);\r\n }, [composedWalls]);\r\n\r\n const ridgeLeftPoint = useMemo(() => {\r\n const vector = new Vector3();\r\n const center = new Vector3(centroid2D.x, centroid2D.y, topZ);\r\n const wall = getElementById(wallsId[0]) as WallModel;\r\n if (wall) {\r\n vector.setX(-leftRidgeLengthCurr).applyEuler(new Euler(0, 0, wall.relativeAngle)).add(center);\r\n }\r\n return vector;\r\n }, [centroid2D, topZ, leftRidgeLengthCurr]);\r\n\r\n const ridgeRightPoint = useMemo(() => {\r\n const vector = new Vector3();\r\n const center = new Vector3(centroid2D.x, centroid2D.y, topZ);\r\n const wall = getElementById(wallsId[0]) as WallModel;\r\n if (wall) {\r\n vector.setX(rightRidgeLengthCurr).applyEuler(new Euler(0, 0, wall.relativeAngle)).add(center);\r\n }\r\n return vector;\r\n }, [centroid2D, topZ, rightRidgeLengthCurr]);\r\n\r\n const ridgeMidPoint = useMemo(() => {\r\n return new Vector3(centroid2D.x, centroid2D.y, topZ);\r\n }, [centroid2D, topZ]);\r\n\r\n const overhangs = useMemo(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) return [] as Vector3[];\r\n return composedWalls.map((wall) => RoofUtil.getComposedWallNormal(wall).multiplyScalar(wall.eavesLength));\r\n }, [composedWalls]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const wallPointsAfterOffset = useMemo(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall, idx) => ({\r\n leftPoint: wall.leftPoint.clone().add(overhangs[idx]),\r\n rightPoint: wall.rightPoint.clone().add(overhangs[idx]),\r\n }));\r\n }, [composedWalls, overhangs]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n if (composedWalls === null || composedWalls.length !== 4 || wallPointsAfterOffset === null) return segments;\r\n\r\n const overhangHeight = getOverhangHeight();\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const points: Vector3[] = [];\r\n const wall = composedWalls[i];\r\n const { lh, rh } = RoofUtil.getComposedWallHeight(composedWalls, i);\r\n\r\n const wallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[(i + 3) % 4].leftPoint,\r\n wallPointsAfterOffset[(i + 3) % 4].rightPoint,\r\n wallPointsAfterOffset[i].leftPoint,\r\n wallPointsAfterOffset[i].rightPoint,\r\n )\r\n .setZ(lh - overhangHeight)\r\n .sub(ridgeMidPoint);\r\n\r\n const wallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[i].leftPoint,\r\n wallPointsAfterOffset[i].rightPoint,\r\n wallPointsAfterOffset[(i + 1) % 4].leftPoint,\r\n wallPointsAfterOffset[(i + 1) % 4].rightPoint,\r\n )\r\n .setZ(rh - overhangHeight)\r\n .sub(ridgeMidPoint);\r\n\r\n const wallCenter = new Vector3().addVectors(wall.leftPoint, wall.rightPoint).divideScalar(2);\r\n const ridgeLeft = ridgeLeftPoint.clone().sub(ridgeMidPoint);\r\n const ridgeRight = ridgeRightPoint.clone().sub(ridgeMidPoint);\r\n let length = 0;\r\n switch (i) {\r\n case 0:\r\n length = wallCenter.clone().sub(ridgeMidPoint.clone().setZ(0)).length();\r\n makeSegment(points, wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeRight, ridgeLeft);\r\n break;\r\n case 1:\r\n length = wallCenter.clone().sub(ridgeRightPoint.clone().setZ(0)).length();\r\n makeSegment(points, wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeRight);\r\n break;\r\n case 2:\r\n length = wallCenter.clone().sub(ridgeMidPoint.clone().setZ(0)).length();\r\n makeSegment(points, wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeLeft, ridgeRight);\r\n break;\r\n case 3:\r\n length = wallCenter.clone().sub(ridgeLeftPoint.clone().setZ(0)).length();\r\n makeSegment(points, wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeLeft);\r\n break;\r\n }\r\n segments.push({ points, angle: -wall.relativeAngle, length });\r\n }\r\n return segments;\r\n }, [composedWalls, ridgeLeftPoint, ridgeRightPoint, topZ, thickness]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall) => wall.leftPoint);\r\n }, [composedWalls]);\r\n\r\n // update related walls roofId when adding new roof\r\n useEffect(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) {\r\n removeElementById(id, false, false, true);\r\n } else {\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id)) {\r\n for (let i = 0; i < composedWalls.length; i++) {\r\n const wallsIdSet = new Set(composedWalls[i].wallsId);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && wallsIdSet.has(e.id)) {\r\n const wall = e as WallModel;\r\n wall.roofId = id;\r\n // some old files set wall's roof height, which should not\r\n wall.leftRoofHeight = undefined;\r\n wall.rightRoofHeight = undefined;\r\n }\r\n }\r\n });\r\n }\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n }\r\n }, [composedWalls]);\r\n\r\n useUpdateRooftopElements(foundationModel, id, roofSegments, ridgeMidPoint, topZ, thickness);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n if (!composedWalls) return;\r\n\r\n const segmentVertices: Vector3[][] = [];\r\n for (let i = 0; i < 4; i++) {\r\n const wall = composedWalls[i];\r\n const { lh, rh } = RoofUtil.getComposedWallHeight(composedWalls, i);\r\n\r\n const wallLeftPoint = wall.leftPoint.clone().setZ(lh);\r\n const wallRightPoint = wall.rightPoint.clone().setZ(rh);\r\n const ridgeLPoint = ridgeLeftPoint.clone();\r\n const ridgeRPoint = ridgeRightPoint.clone();\r\n\r\n switch (i) {\r\n case 0:\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeRPoint, ridgeLPoint]);\r\n break;\r\n case 1:\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeRPoint]);\r\n break;\r\n case 2:\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeLPoint, ridgeRPoint]);\r\n break;\r\n case 3:\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeLPoint]);\r\n break;\r\n }\r\n }\r\n if (isFlat) {\r\n const seg: Vector3[] = [];\r\n for (const segment of segmentVertices) {\r\n seg.push(segment[0].clone());\r\n }\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, [seg]);\r\n } else {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n }\r\n };\r\n\r\n const updateSegmentVertices = useUpdateSegmentVerticesMap(\r\n id,\r\n new Vector3(centroid2D.x, centroid2D.y, topZ),\r\n roofSegments,\r\n isFlat,\r\n RoofType.Hip,\r\n );\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const selectMe = useStore(Selector.selectMe);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [flatHeatmapTexture, setFlatHeatmapTexture] = useState(null);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n if (rise > 0) {\r\n const n = roofSegments.length;\r\n if (n > 0) {\r\n const textures = [];\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n } else {\r\n // flat roof\r\n const heatmap = getHeatmap(id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n // obtain the bounding rectangle\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices && segmentVertices.length > 0 && foundationModel) {\r\n const euler = new Euler(0, 0, foundationModel.rotation[2], 'ZYX');\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const s of segmentVertices) {\r\n for (const v of s) {\r\n const v2 = v.clone().applyEuler(euler);\r\n if (v2.x > maxX) maxX = v2.x;\r\n if (v2.x < minX) minX = v2.x;\r\n if (v2.y > maxY) maxY = v2.y;\r\n if (v2.y < minY) minY = v2.y;\r\n }\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n const vcx = (minX + maxX) / 2;\r\n const vcy = (minY + maxY) / 2;\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n t.offset.set(-minX / dx, -minY / dy);\r\n t.center.set(vcx / dx, vcy / dy);\r\n t.rotation = -foundationModel.rotation[2];\r\n t.repeat.set(1 / dx, 1 / dy);\r\n }\r\n setFlatHeatmapTexture(t);\r\n }\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const userData = useUserData(id, foundationModel, ridgeMidPoint, roofSegments);\r\n\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n if (composedWalls === null || composedWalls.length !== 4) return null;\r\n\r\n return (\r\n \r\n {/* roof segment group */}\r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, ridgeMidPoint);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {isFlat ? (\r\n \r\n ) : (\r\n <>\r\n {roofSegments.map((segment, index, arr) => {\r\n return (\r\n // Roof segment idx is important for calculate normal\r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && ceilingPoints && }\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n {/* left handle */}\r\n {\r\n isPointerDownRef.current = true;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeLeftPoint.x, ridgeLeftPoint.y, topZ);\r\n if (foundationModel && composedWalls[0]) {\r\n const dir = useStore.getState().cameraDirection;\r\n const rX = Math.atan2(dir.z, dir.y);\r\n const rZ = composedWalls[0].relativeAngle;\r\n intersectionPlaneRotation.set(-HALF_PI - rX, 0, rZ, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Left);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n />\r\n {/* mid handle */}\r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeMidPoint.x, ridgeMidPoint.y, topZ);\r\n if (foundationModel) {\r\n const r = -Math.atan2(camera.position.x - cx, camera.position.y - cy) - foundationModel.rotation[2];\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Mid);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.Mid;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = centroid2D.x;\r\n state.selectedElementY = centroid2D.y;\r\n });\r\n }}\r\n />\r\n {/* right handle */}\r\n {\r\n isPointerDownRef.current = true;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeRightPoint.x, ridgeRightPoint.y, topZ);\r\n if (foundationModel && composedWalls[0]) {\r\n const dir = useStore.getState().cameraDirection;\r\n const rX = Math.atan2(dir.z, dir.y);\r\n const rZ = composedWalls[0].relativeAngle;\r\n intersectionPlaneRotation.set(-HALF_PI - rX, 0, rZ, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Right);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {enableIntersectionPlane && (\r\n {\r\n if (intersectionPlaneRef.current && isPointerDownRef.current) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0] && foundationModel) {\r\n const point = intersects[0].point;\r\n if (point.z < 0.001) {\r\n return;\r\n }\r\n const composedWall = composedWalls[0];\r\n const length = new Vector3().subVectors(composedWall.rightPoint, composedWall.leftPoint).length();\r\n switch (roofHandleType) {\r\n case RoofHandleType.Left: {\r\n const midPointVector = ridgeMidPoint\r\n .clone()\r\n .sub(intersectionPlanePosition)\r\n .applyEuler(new Euler(0, 0, -intersectionPlaneRotation.z));\r\n\r\n const p = point\r\n .clone()\r\n .sub(new Vector3(foundationModel.cx, foundationModel.cy, foundationModel.cz))\r\n .applyEuler(new Euler(0, 0, -foundationModel.rotation[2]))\r\n .sub(intersectionPlanePosition)\r\n .applyEuler(new Euler(0, 0, -intersectionPlaneRotation.z));\r\n\r\n const d = new Vector3().subVectors(p, midPointVector).x;\r\n setLeftRidgeLengthCurr(Util.clamp(-d, -rightRidgeLengthCurr + 0.1, length / 2 - 0.01));\r\n break;\r\n }\r\n case RoofHandleType.Right: {\r\n const midPointVector = ridgeMidPoint\r\n .clone()\r\n .sub(intersectionPlanePosition)\r\n .applyEuler(new Euler(0, 0, -intersectionPlaneRotation.z));\r\n\r\n const p = point\r\n .clone()\r\n .sub(new Vector3(foundationModel.cx, foundationModel.cy, foundationModel.cz))\r\n .applyEuler(new Euler(0, 0, -foundationModel.rotation[2]))\r\n .sub(intersectionPlanePosition)\r\n .applyEuler(new Euler(0, 0, -intersectionPlaneRotation.z));\r\n\r\n const d = new Vector3().subVectors(p, midPointVector).x;\r\n\r\n setRightRidgeLengthCurr(Util.clamp(d, -leftRidgeLengthCurr + 0.1, length / 2 - 0.01));\r\n break;\r\n }\r\n case RoofHandleType.Mid: {\r\n const newRise = Math.max(0, point.z - foundationModel.lz - 0.3 - highestWallHeight);\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, topZ + roofModel.thickness);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n onPointerUp={() => {\r\n switch (roofHandleType) {\r\n case RoofHandleType.Mid: {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n break;\r\n }\r\n case RoofHandleType.Left:\r\n case RoofHandleType.Right: {\r\n setHipRoofRidgeLength(id, leftRidgeLengthCurr, rightRidgeLengthCurr);\r\n handleUndoableResizeRidgeLength(\r\n id,\r\n leftRidgeLength,\r\n rightRidgeLength,\r\n leftRidgeLengthCurr,\r\n rightRidgeLengthCurr,\r\n );\r\n }\r\n }\r\n isPointerDownRef.current = false;\r\n setEnableIntersectionPlane(false);\r\n setRoofHandleType(RoofHandleType.Null);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(HipRoof, areRoofsEqual);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Cone, Line, Plane } from '@react-three/drei';\r\nimport { useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n HALF_PI_Z_EULER,\r\n TWO_PI,\r\n} from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { MansardRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport { UnoableResizeMansardRoofRidge } from 'src/undo/UndoableResize';\r\nimport { Util } from 'src/Util';\r\nimport {\r\n BoxBufferGeometry,\r\n CanvasTexture,\r\n DoubleSide,\r\n Euler,\r\n Float32BufferAttribute,\r\n Mesh,\r\n RepeatWrapping,\r\n Shape,\r\n Vector3,\r\n} from 'three';\r\nimport {\r\n useMultiCurrWallArray,\r\n useRoofHeight,\r\n useRoofTexture,\r\n useTransparent,\r\n useUpdateOldRoofFiles,\r\n useUpdateRooftopElements,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n useUserData,\r\n} from './hooks';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n areRoofsEqual,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n RoofHandle,\r\n RoofSegmentGroupUserData,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n} from './roofRenderer';\r\nimport RoofSegment from './roofSegment';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Ceiling from './ceiling';\r\nimport FlatRoof, { TopExtrude } from './flatRoof';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport shallow from 'zustand/shallow';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\nconst MansardRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n const wallPoints = useMemo(\r\n () => roofSegments.reduce((arr, segment) => arr.concat(segment.points[1]), [roofSegments[0].points[0]]),\r\n [roofSegments],\r\n );\r\n\r\n const ridgePoints = useMemo(\r\n () =>\r\n roofSegments.reduce((arr, segment) => arr.concat(segment.points[6].clone()), [roofSegments[0].points[7].clone()]),\r\n [roofSegments],\r\n );\r\n\r\n const wallLine = useMemo(\r\n () => ,\r\n [wallPoints, lineWidth, lineColor],\r\n );\r\n\r\n if (roofSegments.length < 2) {\r\n return null;\r\n }\r\n\r\n // segments array\r\n // [wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeRightPoint, ridgeLeftPoint,\r\n // wallLeftPointAfterOverhang.add(thicknessVector),\r\n // wallRightPointAfterOverhang.add(thicknessVector),\r\n // ridgeRightPoint.add(thicknessVector),\r\n // ridgeLeftPoint.add(thicknessVector)]\r\n\r\n const isFlat = Math.abs(roofSegments[0].points[0].z - roofSegments[0].points[3].z) < 0.1;\r\n\r\n return (\r\n <>\r\n {!isFlat && }\r\n {wallLine}\r\n {wallLine}\r\n {roofSegments.map((segment, idx) => {\r\n return (\r\n \r\n {!isFlat && (\r\n \r\n )}\r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n});\r\n\r\ninterface MansardRoofProps extends BuildingParts {\r\n roofModel: MansardRoofModel;\r\n}\r\n\r\nconst MansardRoof = ({ roofModel, foundationModel }: MansardRoofProps) => {\r\n let {\r\n id,\r\n wallsId,\r\n cx,\r\n cy,\r\n lz,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n thickness = 0.2,\r\n locked,\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n roofType,\r\n foundationId,\r\n ridgeWidth = 1,\r\n rise = lz,\r\n ceiling = false,\r\n // old files data\r\n frontRidge,\r\n backRidge,\r\n } = roofModel;\r\n\r\n const texture = useRoofTexture(textureType);\r\n\r\n const selected = useSelected(id);\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const ray = useStore((state) => state.ray);\r\n const mouse = useStore((state) => state.mouse);\r\n\r\n const [width, setWidth] = useState(ridgeWidth);\r\n const [maxWidth, setMaxWidth] = useState(null);\r\n const [enableIntersectionPlane, setEnableIntersectionPlane] = useState(false);\r\n const [roofHandleType, setRoofHandleType] = useState(RoofHandleType.Null);\r\n const [ridgeHandleIndex, setRidgeHandleIndex] = useState(null);\r\n\r\n const oldWidth = useRef(width);\r\n const oldRiseRef = useRef(rise);\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const isPointerDownRef = useRef(false);\r\n const { gl, camera } = useThree();\r\n\r\n const isFlat = rise < 0.01;\r\n\r\n const getWallPoint2 = (wallArray: WallModel[]) => {\r\n const arr: Point2[] = [];\r\n const length = wallArray.length;\r\n for (const w of wallArray) {\r\n if (w.leftPoint[0] !== undefined && w.leftPoint[1] !== undefined) {\r\n arr.push({ x: w.leftPoint[0], y: w.leftPoint[1] });\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n if (\r\n (wallArray[length - 1].rightPoint[0] || wallArray[length - 1].rightPoint[0] === 0) &&\r\n (wallArray[length - 1].rightPoint[1] || wallArray[length - 1].rightPoint[1] === 0)\r\n ) {\r\n arr.push({ x: wallArray[length - 1].rightPoint[0], y: wallArray[length - 1].rightPoint[1] });\r\n }\r\n }\r\n return arr;\r\n };\r\n\r\n const getWallPointFromHandleIdx = (idx: number) => {\r\n if (idx < currentWallArray.length) {\r\n const wall = currentWallArray[idx];\r\n return new Vector3(wall.leftPoint[0], wall.leftPoint[1]);\r\n } else {\r\n const wall = currentWallArray[idx - 1];\r\n return new Vector3(wall.rightPoint[0], wall.rightPoint[1]);\r\n }\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const updateRidge = (elemId: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Mansard) {\r\n (e as MansardRoofModel).ridgeWidth = val;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const getOverhangHeight = () => {\r\n let height = Infinity;\r\n\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n const leftPoint = new Vector3(w.leftPoint[0], w.leftPoint[1]);\r\n const rightPoint = new Vector3(w.rightPoint[0], w.rightPoint[1]);\r\n // const { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n const dLeft = RoofUtil.getDistance(leftPoint, rightPoint, ridgePoints[i].leftPoint);\r\n const overhangHeightLeft = Math.min(((w.eavesLength ?? 0) / dLeft) * (ridgePoints[i].leftPoint.z - w.lz), w.lz);\r\n const dRight = RoofUtil.getDistance(leftPoint, rightPoint, ridgePoints[i].rightPoint);\r\n const overhangHeightRight = Math.min(\r\n ((w.eavesLength ?? 0) / dRight) * (ridgePoints[i].rightPoint.z - w.lz),\r\n w.lz,\r\n );\r\n height = Math.min(Math.min(overhangHeightLeft, overhangHeightRight), height);\r\n }\r\n\r\n return Number.isNaN(height) ? 0 : height;\r\n };\r\n\r\n const addUndoableResizeRidge = (elemId: string, type: RoofHandleType, oldVal: number, newVal: number) => {\r\n const undoable = {\r\n name: 'Resize Mansard Roof Ridge',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldVal: oldVal,\r\n newVal: newVal,\r\n type: type,\r\n undo: () => {\r\n updateRidge(undoable.resizedElementId, undoable.oldVal);\r\n },\r\n redo: () => {\r\n updateRidge(undoable.resizedElementId, undoable.newVal);\r\n },\r\n } as UnoableResizeMansardRoofRidge;\r\n useStore.getState().addUndoable(undoable);\r\n };\r\n const { currentWallArray, isLoopRef } = useMultiCurrWallArray(foundationId, id, wallsId);\r\n\r\n const { highestWallHeight, topZ } = useRoofHeight(currentWallArray, rise);\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const centroid = useMemo(() => {\r\n if (currentWallArray.length < 2) {\r\n return new Vector3();\r\n }\r\n const points = getWallPoint2(currentWallArray);\r\n const p = Util.calculatePolygonCentroid(points);\r\n if (Number.isNaN(p.x) || Number.isNaN(p.y)) {\r\n return new Vector3();\r\n }\r\n return new Vector3(p.x, p.y, topZ);\r\n }, [currentWallArray, topZ]);\r\n\r\n const overhangs = useMemo(() => {\r\n const res = currentWallArray.map((wall) => RoofUtil.getWallNormal(wall).multiplyScalar(wall.eavesLength ?? 0));\r\n if (!isLoopRef.current && res.length !== 0) {\r\n const n = new Vector3()\r\n .subVectors(\r\n new Vector3(\r\n currentWallArray[currentWallArray.length - 1].rightPoint[0],\r\n currentWallArray[currentWallArray.length - 1].rightPoint[1],\r\n ),\r\n new Vector3(currentWallArray[0].leftPoint[0], currentWallArray[0].leftPoint[1]),\r\n )\r\n .applyEuler(HALF_PI_Z_EULER)\r\n .normalize()\r\n .multiplyScalar(0.3);\r\n res.push(n);\r\n }\r\n return res;\r\n }, [currentWallArray]);\r\n\r\n const wallPointsAfterOverhang = useMemo(() => {\r\n const res = currentWallArray.map((wall, idx) => ({\r\n leftPoint: new Vector3(wall.leftPoint[0], wall.leftPoint[1]).add(overhangs[idx]),\r\n rightPoint: new Vector3(wall.rightPoint[0], wall.rightPoint[1]).add(overhangs[idx]),\r\n }));\r\n if (!isLoopRef.current && res.length !== 0) {\r\n res.push({\r\n leftPoint: new Vector3(\r\n currentWallArray[currentWallArray.length - 1].rightPoint[0],\r\n currentWallArray[currentWallArray.length - 1].rightPoint[1],\r\n ).add(overhangs[overhangs.length - 1]),\r\n rightPoint: new Vector3(currentWallArray[0].leftPoint[0], currentWallArray[0].leftPoint[1]).add(\r\n overhangs[overhangs.length - 1],\r\n ),\r\n });\r\n }\r\n return res;\r\n }, [currentWallArray, overhangs]);\r\n\r\n const ridgePoints = useMemo(() => {\r\n const res = currentWallArray.map((wall, idx) => {\r\n const leftPoint = new Vector3(wall.leftPoint[0], wall.leftPoint[1]);\r\n const rightPoint = new Vector3(wall.rightPoint[0], wall.rightPoint[1]);\r\n const leftDiff = new Vector3().subVectors(centroid, leftPoint).setZ(0).normalize().multiplyScalar(width);\r\n const rightDiff = new Vector3().subVectors(centroid, rightPoint).setZ(0).normalize().multiplyScalar(width);\r\n leftPoint.add(leftDiff).setZ(topZ);\r\n rightPoint.add(rightDiff).setZ(topZ);\r\n return { leftPoint, rightPoint };\r\n });\r\n if (!isLoopRef.current && res.length !== 0) {\r\n res.push({ leftPoint: res[res.length - 1].rightPoint, rightPoint: res[0].leftPoint });\r\n }\r\n return res;\r\n }, [currentWallArray, centroid, width]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n if (currentWallArray.length < 2) {\r\n return segments;\r\n }\r\n const overhangHeight = getOverhangHeight();\r\n\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n if (\r\n w.leftPoint.length > 0 &&\r\n w.rightPoint.length > 0 &&\r\n (w.leftPoint[0] !== w.rightPoint[0] || w.leftPoint[1] !== w.rightPoint[1])\r\n ) {\r\n const points = [];\r\n let { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n if (!isLoopRef.current) {\r\n if (i === 0) {\r\n lh = currentWallArray[0].lz;\r\n }\r\n if (i === currentWallArray.length - 1) {\r\n rh = currentWallArray[currentWallArray.length - 1].lz;\r\n }\r\n }\r\n\r\n const wallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOverhang[(i + wallPointsAfterOverhang.length - 1) % wallPointsAfterOverhang.length].leftPoint,\r\n wallPointsAfterOverhang[(i + wallPointsAfterOverhang.length - 1) % wallPointsAfterOverhang.length].rightPoint,\r\n wallPointsAfterOverhang[i].leftPoint,\r\n wallPointsAfterOverhang[i].rightPoint,\r\n )\r\n .setZ(lh - overhangHeight)\r\n .sub(centroid);\r\n\r\n const wallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOverhang[i].leftPoint,\r\n wallPointsAfterOverhang[i].rightPoint,\r\n wallPointsAfterOverhang[(i + 1) % wallPointsAfterOverhang.length].leftPoint,\r\n wallPointsAfterOverhang[(i + 1) % wallPointsAfterOverhang.length].rightPoint,\r\n )\r\n .setZ(rh - overhangHeight)\r\n .sub(centroid);\r\n\r\n const ridgeLeftPoint = ridgePoints[i].leftPoint.clone().sub(centroid);\r\n const ridgeRightPoint = ridgePoints[i].rightPoint.clone().sub(centroid);\r\n\r\n const length = new Vector3(w.cx, w.cy).sub(centroid.clone().setZ(0)).length();\r\n points.push(wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeRightPoint, ridgeLeftPoint);\r\n points.push(\r\n wallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n wallRightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeRightPoint.clone().add(thicknessVector),\r\n ridgeLeftPoint.clone().add(thicknessVector),\r\n );\r\n segments.push({ points, angle: -w.relativeAngle, length });\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n const idx = wallPointsAfterOverhang.length - 1;\r\n const leftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOverhang[idx - 1].leftPoint,\r\n wallPointsAfterOverhang[idx - 1].rightPoint,\r\n wallPointsAfterOverhang[idx].leftPoint,\r\n wallPointsAfterOverhang[idx].rightPoint,\r\n )\r\n .setZ(currentWallArray[currentWallArray.length - 1].lz - overhangHeight)\r\n .sub(centroid);\r\n const rightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOverhang[idx].leftPoint,\r\n wallPointsAfterOverhang[idx].rightPoint,\r\n wallPointsAfterOverhang[0].leftPoint,\r\n wallPointsAfterOverhang[0].rightPoint,\r\n )\r\n .setZ(currentWallArray[0].lz - overhangHeight)\r\n .sub(centroid);\r\n\r\n const ridgeLeftPoint = ridgePoints[idx].leftPoint.clone().sub(centroid);\r\n const ridgeRightPoint = ridgePoints[idx].rightPoint.clone().sub(centroid);\r\n\r\n let angle = Math.atan2(\r\n rightPointAfterOverhang.y - leftPointAfterOverhang.y,\r\n rightPointAfterOverhang.x - leftPointAfterOverhang.x,\r\n );\r\n angle = angle >= 0 ? angle : (TWO_PI + angle) % TWO_PI;\r\n\r\n const length = new Vector3()\r\n .addVectors(leftPointAfterOverhang, rightPointAfterOverhang)\r\n .setZ(0)\r\n .divideScalar(2)\r\n .length();\r\n\r\n const points = [];\r\n points.push(leftPointAfterOverhang, rightPointAfterOverhang, ridgeRightPoint, ridgeLeftPoint);\r\n points.push(\r\n leftPointAfterOverhang.clone().add(thicknessVector),\r\n rightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeRightPoint.clone().add(thicknessVector),\r\n ridgeLeftPoint.clone().add(thicknessVector),\r\n );\r\n segments.push({ points, angle: -angle, length });\r\n }\r\n return segments;\r\n }, [currentWallArray, topZ, width, thickness]);\r\n\r\n const topRidgeShape = useMemo(() => {\r\n const shape = new Shape();\r\n if (ridgePoints.length > 0) {\r\n const startPoint = ridgePoints[0].leftPoint.clone().sub(centroid);\r\n shape.moveTo(startPoint.x, startPoint.y);\r\n for (const point of ridgePoints) {\r\n const rightPoint = point.rightPoint.clone().sub(centroid);\r\n shape.lineTo(rightPoint.x, rightPoint.y);\r\n }\r\n shape.closePath();\r\n }\r\n return shape;\r\n }, [currentWallArray, ridgePoints]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n const points: Vector3[] = [];\r\n if (currentWallArray.length === 0) return points;\r\n points.push(new Vector3().fromArray(currentWallArray[0].leftPoint));\r\n for (const wall of currentWallArray) {\r\n points.push(new Vector3().fromArray(wall.rightPoint));\r\n }\r\n return points;\r\n }, [currentWallArray]);\r\n\r\n useEffect(() => {\r\n if (ridgeWidth !== width) {\r\n setWidth(ridgeWidth);\r\n }\r\n }, [ridgeWidth]);\r\n\r\n useEffect(() => {\r\n if (currentWallArray.length > 1) {\r\n if (useStore.getState().addedRoofIdSet.has(id)) {\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === currentWallArray[i].id && e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n w.roofId = id;\r\n // some old files set wall's roof height, which should not\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n } else {\r\n removeElementById(id, false, false, true);\r\n }\r\n }, [currentWallArray]);\r\n\r\n useUpdateRooftopElements(foundationModel, id, roofSegments, centroid, topZ, thickness);\r\n\r\n // update old files\r\n useEffect(() => {\r\n // handle old files\r\n if (frontRidge !== undefined || backRidge !== undefined) {\r\n setCommonStore((state) => {\r\n for (const el of state.elements) {\r\n if (el.type === ObjectType.Wall) {\r\n const w = el as WallModel;\r\n if (w.roofId === id) {\r\n w.centerLeftRoofHeight = undefined;\r\n w.centerRightRoofHeight = undefined;\r\n }\r\n } else if (el.type === ObjectType.Roof && (el as RoofModel).roofType === RoofType.Mansard) {\r\n if (el.id === id) {\r\n (el as MansardRoofModel).frontRidge = undefined;\r\n (el as MansardRoofModel).backRidge = undefined;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }, []);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n const segmentVertices: Vector3[][] = [];\r\n\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n if (\r\n w.leftPoint.length > 0 &&\r\n w.rightPoint.length > 0 &&\r\n (w.leftPoint[0] !== w.rightPoint[0] || w.leftPoint[1] !== w.rightPoint[1])\r\n ) {\r\n let { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n if (!isLoopRef.current) {\r\n if (i === 0) {\r\n lh = currentWallArray[0].lz;\r\n }\r\n if (i === currentWallArray.length - 1) {\r\n rh = currentWallArray[currentWallArray.length - 1].lz;\r\n }\r\n }\r\n\r\n const wallLeftPoint = new Vector3(w.leftPoint[0], w.leftPoint[1], lh);\r\n const wallRightPoint = new Vector3(w.rightPoint[0], w.rightPoint[1], rh);\r\n const ridgeLeftPoint = ridgePoints[i].leftPoint.clone();\r\n const ridgeRightPoint = ridgePoints[i].rightPoint.clone();\r\n\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeRightPoint, ridgeLeftPoint]);\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n const lastIdx = currentWallArray.length - 1;\r\n const firstWall = currentWallArray[0];\r\n const lastWall = currentWallArray[lastIdx];\r\n const leftPoint = new Vector3(lastWall.rightPoint[0], lastWall.rightPoint[1], lastWall.lz);\r\n const rightPoint = new Vector3(firstWall.leftPoint[0], firstWall.leftPoint[1], firstWall.lz);\r\n const ridgeLeftPoint = ridgePoints[lastIdx].leftPoint.clone();\r\n const ridgeRightPoint = ridgePoints[lastIdx].rightPoint.clone();\r\n segmentVertices.push([leftPoint, rightPoint, ridgeRightPoint, ridgeLeftPoint]);\r\n }\r\n const ridgeVertices = ridgePoints.map((ridge) => ridge.leftPoint.clone());\r\n segmentVertices.push(ridgeVertices);\r\n\r\n if (isFlat) {\r\n const seg: Vector3[] = [];\r\n for (const segment of segmentVertices.slice(0, -1)) {\r\n seg.push(segment[0].clone());\r\n }\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, [seg]);\r\n } else {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n }\r\n };\r\n\r\n const updateSegmentVertices = useUpdateSegmentVerticesMap(\r\n id,\r\n centroid,\r\n roofSegments,\r\n isFlat,\r\n RoofType.Mansard,\r\n ridgePoints.map((ridge) => ridge.leftPoint.clone().add(thicknessVector)),\r\n );\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const world = useStore.getState().world;\r\n const selectMe = useStore(Selector.selectMe);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n const [flatHeatmapTexture, setFlatHeatmapTexture] = useState(null);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n\r\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\r\n const hourlyHeatExchangeArrayMap = useDataStore.getState().hourlyHeatExchangeArrayMap;\r\n const topSurfaceMeshRef = useRef(null);\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowLength = useRef();\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const { transparent, opacity } = useTransparent();\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n if (isFlat) {\r\n const heatmap = getHeatmap(id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n // obtain the bounding rectangle\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices && segmentVertices.length > 0 && foundationModel) {\r\n const euler = new Euler(0, 0, foundationModel.rotation[2], 'ZYX');\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const s of segmentVertices) {\r\n for (const v of s) {\r\n const v2 = v.clone().applyEuler(euler);\r\n if (v2.x > maxX) maxX = v2.x;\r\n if (v2.x < minX) minX = v2.x;\r\n if (v2.y > maxY) maxY = v2.y;\r\n if (v2.y < minY) minY = v2.y;\r\n }\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n const vcx = (minX + maxX) / 2;\r\n const vcy = (minY + maxY) / 2;\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n t.offset.set(-minX / dx, -minY / dy);\r\n t.center.set(vcx / dx, vcy / dy);\r\n t.rotation = -foundationModel.rotation[2];\r\n t.repeat.set(1 / dx, 1 / dy);\r\n }\r\n setFlatHeatmapTexture(t);\r\n }\r\n }\r\n } else {\r\n const n = roofSegments.length + 1; // roofSegments does not include the top surface, so we add 1 here.\r\n const textures = [];\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n if (i === n - 1 && foundationModel) {\r\n // FIXME: I have no idea why the top heatmap needs to be rotated as follows\r\n t.center.set(0.5, 0.5);\r\n t.rotation = -foundationModel.rotation[2];\r\n }\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n if (topSurfaceMeshRef.current) {\r\n const points = topRidgeShape.extractPoints(1).shape;\r\n const zOffset = 0.01; // a small number to ensure the surface mesh stay atop\r\n const geo = topSurfaceMeshRef.current.geometry;\r\n const n = points.length - 1;\r\n if (n === 4) {\r\n // special case: a quad can be more efficiently represented using only two triangles\r\n const positions = new Float32Array(18);\r\n positions[0] = points[3].x;\r\n positions[1] = points[3].y;\r\n positions[2] = zOffset;\r\n positions[3] = points[0].x;\r\n positions[4] = points[0].y;\r\n positions[5] = zOffset;\r\n positions[6] = points[2].x;\r\n positions[7] = points[2].y;\r\n positions[8] = zOffset;\r\n positions[9] = points[2].x;\r\n positions[10] = points[2].y;\r\n positions[11] = zOffset;\r\n positions[12] = points[0].x;\r\n positions[13] = points[0].y;\r\n positions[14] = zOffset;\r\n positions[15] = points[1].x;\r\n positions[16] = points[1].y;\r\n positions[17] = zOffset;\r\n // don't call geo.setFromPoints. It doesn't seem to work correctly.\r\n geo.setAttribute('position', new Float32BufferAttribute(positions, 3));\r\n geo.computeVertexNormals();\r\n const scale = showSolarRadiationHeatmap ? 1 : 6;\r\n const uvs = [];\r\n uvs.push(0, 0);\r\n uvs.push(scale, 0);\r\n uvs.push(0, scale);\r\n uvs.push(0, scale);\r\n uvs.push(scale, 0);\r\n uvs.push(scale, scale);\r\n geo.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\r\n } else {\r\n const geo = topSurfaceMeshRef.current.geometry;\r\n const positions = new Float32Array(n * 9);\r\n const scale = showSolarRadiationHeatmap ? 1 : 6;\r\n const uvs = [];\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const p of points) {\r\n if (p.x > maxX) maxX = p.x;\r\n else if (p.x < minX) minX = p.x;\r\n if (p.y > maxY) maxY = p.y;\r\n else if (p.y < minY) minY = p.y;\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n for (let i = 0; i < n; i++) {\r\n const j = i * 9;\r\n positions[j] = points[i].x;\r\n positions[j + 1] = points[i].y;\r\n positions[j + 2] = zOffset;\r\n positions[j + 3] = points[i + 1].x;\r\n positions[j + 4] = points[i + 1].y;\r\n positions[j + 5] = zOffset;\r\n positions[j + 6] = 0;\r\n positions[j + 7] = 0;\r\n positions[j + 8] = zOffset;\r\n if (showSolarRadiationHeatmap) {\r\n uvs.push(((points[i].x - minX) / dx) * scale, ((points[i].y - minY) / dy) * scale);\r\n uvs.push(((points[i + 1].x - minX) / dx) * scale, ((points[i + 1].y - minY) / dy) * scale);\r\n } else {\r\n // I have no idea why the regular texture coordinates should not subtract minX and minY\r\n uvs.push((points[i].x / dx) * scale, (points[i].y / dy) * scale);\r\n uvs.push((points[i + 1].x / dx) * scale, (points[i + 1].y / dy) * scale);\r\n }\r\n uvs.push(0, 0);\r\n }\r\n // don't call geo.setFromPoints. It doesn't seem to work correctly.\r\n geo.setAttribute('position', new Float32BufferAttribute(positions, 3));\r\n geo.computeVertexNormals();\r\n geo.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\r\n }\r\n } else if (showSolarRadiationHeatmap && !updateFlag) {\r\n setUpdateFlag(!updateFlag);\r\n }\r\n }, [topRidgeShape, showSolarRadiationHeatmap, updateFlag]);\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (foundationModel && (foundationModel as FoundationModel).notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id + '-' + roofSegments.length);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments || !segments[roofSegments.length]) return undefined;\r\n const s = segments[roofSegments.length].map((v) =>\r\n v\r\n .clone()\r\n .sub(centroid)\r\n .add(new Vector3(0, 0, centroid.z + thickness)),\r\n );\r\n if (!s) return undefined;\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const s0 = s[0].clone();\r\n const s1 = s[1].clone();\r\n const s2 = s[2].clone();\r\n const v10 = new Vector3().subVectors(s1, s0);\r\n const v20 = new Vector3().subVectors(s2, s0);\r\n const v21 = new Vector3().subVectors(s2, s1);\r\n const length10 = v10.length();\r\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\r\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\r\n const m = Math.max(2, Math.floor(length10 / cellSize));\r\n const n = Math.max(2, Math.floor(distance / cellSize));\r\n v10.normalize();\r\n v20.normalize();\r\n v21.normalize();\r\n // find the normal vector of the quad\r\n const normal = new Vector3().crossVectors(v20, v21).normalize();\r\n // find the incremental vector going along the bottom edge (half of length)\r\n const dm = v10.multiplyScalar((0.5 * length10) / m);\r\n // find the incremental vector going from bottom to top (half of length)\r\n const dn = new Vector3()\r\n .crossVectors(normal, v10)\r\n .normalize()\r\n .multiplyScalar((0.5 * distance) / n);\r\n // find the starting point of the grid (shift half of length in both directions)\r\n const v0 = s0.clone().add(dm).add(dn).add(new Vector3(0, 0, thickness));\r\n // double half-length to full-length for the increment vectors in both directions\r\n dm.multiplyScalar(2);\r\n dn.multiplyScalar(2);\r\n heatFluxArrowLength.current = normal.clone().multiplyScalar(0.1);\r\n const vectors: Vector3[][] = [];\r\n const origin = new Vector3();\r\n const vertices = new Array();\r\n for (const p of s) {\r\n vertices.push({ x: p.x, y: p.y } as Point2);\r\n }\r\n const area = Util.getPolygonArea(vertices);\r\n if (area === 0) return undefined;\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowEuler.current = new Euler(-Math.sign(intensity) * HALF_PI, 0, 0);\r\n for (let p = 0; p < m; p++) {\r\n const dmp = dm.clone().multiplyScalar(p);\r\n for (let q = 0; q < n; q++) {\r\n origin.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\r\n if (Util.isPointInside(origin.x, origin.y, vertices)) {\r\n const v: Vector3[] = [];\r\n if (intensity < 0) {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(-intensity)));\r\n } else {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(intensity)));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [showHeatFluxes, heatFluxScaleFactor]);\r\n\r\n const userData = useUserData(id, foundationModel, centroid, roofSegments);\r\n\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const holeMeshes = useMemo(\r\n () =>\r\n windows.map((w) => {\r\n const dimension = new Vector3(w.lx, w.lz, w.ly * 2);\r\n const position = new Vector3(w.cx, w.cy, w.cz).sub(centroid);\r\n const rotation = new Euler().fromArray([...w.rotation, 'ZXY']);\r\n\r\n const holeMesh = new Mesh(new BoxBufferGeometry(dimension.x, dimension.y, dimension.z));\r\n holeMesh.position.copy(position);\r\n holeMesh.rotation.copy(rotation);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }),\r\n [windows, centroid],\r\n );\r\n\r\n const noTextureAndOneColor = textureType === RoofTexture.NoTexture && color && color === sideColor;\r\n const castShadow = shadowEnabled && !transparent;\r\n\r\n return (\r\n \r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, centroid);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {isFlat ? (\r\n \r\n ) : (\r\n <>\r\n {roofSegments.map((segment, index, arr) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/*special case: the whole roof segment has no texture and only one color */}\r\n {noTextureAndOneColor && !showSolarRadiationHeatmap ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {showSolarRadiationHeatmap && heatmapTextures.length === roofSegments.length + 1 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n {/* wireframe */}\r\n {roofSegments.length > 0 && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && }\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(centroid.x, centroid.y, topZ);\r\n if (foundationModel) {\r\n const r = -Math.atan2(camera.position.x - cx, camera.position.y - cy) - foundationModel.rotation[2];\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Top);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = centroid.x;\r\n state.selectedElementY = centroid.y;\r\n });\r\n }}\r\n />\r\n {ridgePoints.map((ridge, idx) => {\r\n const point = ridge.leftPoint.clone().sub(centroid);\r\n return (\r\n {\r\n isPointerDownRef.current = true;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(point.x, point.y, topZ + 0.15);\r\n intersectionPlaneRotation.set(0, 0, 0);\r\n setRoofHandleType(RoofHandleType.Ridge);\r\n setRidgeHandleIndex(idx);\r\n setMaxWidth(\r\n currentWallArray.reduce(\r\n (max, wall) =>\r\n Math.min(max, new Vector3(wall.leftPoint[0], wall.leftPoint[1], topZ).distanceTo(centroid) - 1),\r\n Infinity,\r\n ),\r\n );\r\n useRefStore.getState().setEnableOrbitController(false);\r\n oldWidth.current = width;\r\n }}\r\n />\r\n );\r\n })}\r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {enableIntersectionPlane && (\r\n {\r\n if (intersectionPlaneRef.current && isPointerDownRef.current) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0] && foundationModel) {\r\n const pointer = intersects[0].point;\r\n if (pointer.z < 0.001) {\r\n return;\r\n }\r\n switch (roofHandleType) {\r\n case RoofHandleType.Top: {\r\n const newRise = Math.max(0, pointer.z - foundationModel.lz - 0.6 - highestWallHeight);\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, topZ + roofModel.thickness);\r\n break;\r\n }\r\n case RoofHandleType.Ridge: {\r\n if (foundationModel && ridgeHandleIndex !== null) {\r\n const p = pointer\r\n .clone()\r\n .applyEuler(new Euler(0, 0, foundationModel.rotation[2]))\r\n .sub(new Vector3(foundationModel.cx, foundationModel.cy))\r\n .setZ(0);\r\n\r\n const wallPoint = getWallPointFromHandleIdx(ridgeHandleIndex);\r\n const d = p.distanceTo(wallPoint);\r\n const dir = new Vector3().subVectors(centroid.clone().setZ(0), wallPoint);\r\n const angle = p.clone().sub(wallPoint).angleTo(dir);\r\n if (angle < HALF_PI) {\r\n setWidth(Util.clamp(d, 0.5, maxWidth ?? dir.length() - 1));\r\n } else {\r\n setWidth(0.5);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n onPointerUp={() => {\r\n switch (roofHandleType) {\r\n case RoofHandleType.Top: {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n break;\r\n }\r\n case RoofHandleType.Ridge: {\r\n addUndoableResizeRidge(id, roofHandleType, oldWidth.current, width);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Mansard) {\r\n (e as MansardRoofModel).ridgeWidth = width;\r\n break;\r\n }\r\n }\r\n });\r\n isPointerDownRef.current = false;\r\n setEnableIntersectionPlane(false);\r\n setRoofHandleType(RoofHandleType.Null);\r\n setRidgeHandleIndex(null);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {heatFluxes &&\r\n heatFluxes.map((v, index) => {\r\n return (\r\n \r\n \r\n ;\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(MansardRoof, areRoofsEqual);\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { message } from 'antd';\nimport html2canvas from 'html2canvas';\nimport { saveAs } from 'file-saver';\nimport { DatumEntry } from './types';\n\nexport const visitIFI = () => {\n window.open('https://intofuture.org', '_blank');\n};\n\nexport const visitHomepage = () => {\n window.open('https://intofuture.org/aladdin.html', '_blank');\n};\n\nexport const getSatelliteImage = (size: number, lat: number, lng: number, zoom: number) => {\n return (\n 'https://maps.googleapis.com/maps/api/staticmap?maptype=satellite¢er=' +\n lat +\n ',' +\n lng +\n '&zoom=' +\n zoom +\n '&size=' +\n size +\n 'x' +\n size +\n '&scale=2&key=' +\n process.env.REACT_APP_MAPS_API_KEY\n );\n};\n\nexport const getRoadMap = (size: number, lat: number, lng: number, zoom: number) => {\n return (\n 'https://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&style=feature:poi|element:labels|visibility:off¢er=' +\n lat +\n ',' +\n lng +\n '&zoom=' +\n zoom +\n '&size=' +\n size +\n 'x' +\n size +\n '&scale=2&key=' +\n process.env.REACT_APP_MAPS_API_KEY\n );\n};\n\nexport const showSuccess = (msg: string, duration?: number) => {\n message.success({\n duration: duration ?? 2,\n content: msg,\n className: 'custom-class',\n style: {\n marginTop: '20vh',\n },\n onClick: () => {\n message.destroy();\n },\n });\n};\n\nexport const showInfo = (msg: string, duration?: number) => {\n message.info({\n duration: duration ?? 2,\n content: msg,\n className: 'custom-class',\n style: {\n marginTop: '20vh',\n },\n onClick: () => {\n message.destroy();\n },\n });\n};\n\nexport const showWarning = (msg: string, duration?: number) => {\n message.warning({\n duration: duration ?? 2,\n content: msg,\n className: 'custom-class',\n style: {\n marginTop: '20vh',\n },\n onClick: () => {\n message.destroy();\n },\n });\n};\n\nexport const showError = (msg: string, duration?: number) => {\n message.error({\n duration: duration ?? 2,\n content: msg,\n className: 'custom-class',\n style: {\n marginTop: '20vh',\n },\n onClick: () => {\n message.destroy();\n },\n });\n};\n\nexport const openInNewTab = (url: string) => {\n const win = window.open(url, '_blank');\n if (win) {\n win.focus();\n }\n};\n\nexport const extractText = (html: string) => {\n return new DOMParser().parseFromString(html, 'text/html').documentElement.textContent;\n};\n\nexport const containedInDOMRect = (rect: DOMRect, x: number, y: number, margin: number) => {\n return (\n x > rect.x - margin && x < rect.x + rect.width + margin && y > rect.y - margin && y < rect.y + rect.height + margin\n );\n};\n\nexport const copyTextToClipboard = (text: string) => {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.setAttribute('readonly', '');\n textArea.style.position = 'absolute';\n textArea.style.left = '-9999px'; // Move outside the screen to make it invisible\n document.body.appendChild(textArea);\n const selection = document.getSelection();\n if (selection) {\n const selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n if (selected) {\n selection.removeAllRanges();\n selection.addRange(selected);\n }\n }\n};\n\nexport const saveImage = (fileName: string, imgUrl: string) => {\n let a = document.createElement('a') as HTMLAnchorElement;\n a.download = fileName;\n a.href = imgUrl;\n a.click();\n};\n\nexport const screenshot = async (elementId: string, name: string, options: {}) => {\n const source = window.document.getElementById(elementId);\n if (source) {\n const canvas = await html2canvas(source, { ...options, removeContainer: true });\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png', 1.0);\n a.download = `${name}.png`;\n a.click();\n } else {\n throw new Error(`Cannot find element with ID ${elementId}`);\n }\n};\n\nexport const saveCsv = (data: DatumEntry[], fileName: string) => {\n let content = '';\n for (const k of Object.keys(data[0])) {\n content += k + ', ';\n }\n content += '\\n';\n for (const o of data) {\n for (const v of Object.values(o)) {\n content += v + ', ';\n }\n content += '\\n';\n }\n const blob = new Blob([content], { type: 'text/csv;charset=utf-8' });\n saveAs(blob, fileName);\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS4JqPmK1AAAAKJJREFUeJzt2rENwDAMxEA58P4rO2NcIXICPgF1OjPzZjH3vdX759MCmgJoAU0BtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQFMALaApgBbQFEALaNYHONN/wOr9nUABtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQFMALaApgBbQFEALaAqgBTTrA/zujAh7/zc8ggAAAABJRU5ErkJggg==\"","export default __webpack_public_path__ + \"static/media/wall_01.a34e191a.png\";","export default __webpack_public_path__ + \"static/media/wall_03.9fd1fc56.png\";","export default __webpack_public_path__ + \"static/media/wall_04.ba3c85fa.png\";","export default __webpack_public_path__ + \"static/media/wall_05.a7b7b6d2.png\";","export default __webpack_public_path__ + \"static/media/wall_06.a62f49a9.png\";","export default __webpack_public_path__ + \"static/media/wall_07.ad5fe7c0.png\";","export default __webpack_public_path__ + \"static/media/wall_08.cfa0113c.png\";","export default __webpack_public_path__ + \"static/media/wall_09.ad49123e.png\";","export default __webpack_public_path__ + \"static/media/wall_10.ad1052ed.png\";","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport WallTextureDefault from 'src/resources/wall_edge.png';\r\nimport WallTexture00 from 'src/resources/tiny_white_square.png';\r\nimport WallTexture01 from 'src/resources/wall_01.png';\r\nimport WallTexture02 from 'src/resources/wall_02.png';\r\nimport WallTexture03 from 'src/resources/wall_03.png';\r\nimport WallTexture04 from 'src/resources/wall_04.png';\r\nimport WallTexture05 from 'src/resources/wall_05.png';\r\nimport WallTexture06 from 'src/resources/wall_06.png';\r\nimport WallTexture07 from 'src/resources/wall_07.png';\r\nimport WallTexture08 from 'src/resources/wall_08.png';\r\nimport WallTexture09 from 'src/resources/wall_09.png';\r\nimport WallTexture10 from 'src/resources/wall_10.png';\r\n\r\nimport { useEffect, useMemo, useRef } from 'react';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { WallModel, WallFill, WallStructure } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { Util } from 'src/Util';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { RepeatWrapping, TextureLoader, Vector3 } from 'three';\r\nimport { ObjectType, WallTexture } from 'src/types';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { DEFAULT_PARAPET_SETTINGS } from './parapet';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\n\r\nexport const useElements = (id: string, leftWallId?: string, rightWallId?: string, roofId?: string) => {\r\n const isElementTriggerWallChange = (elem: ElementModel) => {\r\n return elem.parentId === id || elem.id === roofId;\r\n };\r\n\r\n const leftWall = useStore((state) => {\r\n if (leftWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId) {\r\n return e as WallModel;\r\n }\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n const rightWall = useStore((state) => {\r\n if (rightWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === rightWallId) {\r\n return e as WallModel;\r\n }\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n const elementsTriggerChange = useStore((state) => JSON.stringify(state.elements.filter(isElementTriggerWallChange)));\r\n\r\n const elementsOnWall = useMemo(\r\n () => useStore.getState().elements.filter((el) => isElementTriggerWallChange(el) && Util.isLegalOnWall(el.type)),\r\n [elementsTriggerChange],\r\n );\r\n\r\n return { elementsOnWall, leftWall, rightWall };\r\n};\r\n\r\nexport const useHandleSize = (size = 0.3) => {\r\n const orthographic = useStore((state) => state.viewState.orthographic);\r\n const cameraPosition = useStore((state) => state.viewState.cameraPosition);\r\n const cameraZoom = useStore((state) => state.viewState.cameraZoom);\r\n\r\n let handleSize;\r\n\r\n if (orthographic) {\r\n handleSize = Math.max(size, 15 / cameraZoom);\r\n } else {\r\n const panCenter = useStore.getState().viewState.panCenter;\r\n const p = new Vector3(...panCenter);\r\n const c = new Vector3(...cameraPosition);\r\n const distance = c.distanceTo(p);\r\n handleSize = Math.max(size, distance / 100);\r\n }\r\n\r\n return handleSize;\r\n};\r\n\r\nexport const useWallTexture = (textureType: WallTexture, wallStructure?: WallStructure) => {\r\n const textureLoader = useMemo(() => new TextureLoader(), []);\r\n\r\n const texture = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case WallTexture.Default:\r\n textureImg = WallTextureDefault;\r\n break;\r\n case WallTexture.NoTexture:\r\n textureImg = WallTexture00;\r\n break;\r\n case WallTexture.Texture01:\r\n textureImg = WallTexture01;\r\n break;\r\n case WallTexture.Texture02:\r\n textureImg = WallTexture02;\r\n break;\r\n case WallTexture.Texture03:\r\n textureImg = WallTexture03;\r\n break;\r\n case WallTexture.Texture04:\r\n textureImg = WallTexture04;\r\n break;\r\n case WallTexture.Texture05:\r\n textureImg = WallTexture05;\r\n break;\r\n case WallTexture.Texture06:\r\n textureImg = WallTexture06;\r\n break;\r\n case WallTexture.Texture07:\r\n textureImg = WallTexture07;\r\n break;\r\n case WallTexture.Texture08:\r\n textureImg = WallTexture08;\r\n break;\r\n case WallTexture.Texture09:\r\n textureImg = WallTexture09;\r\n break;\r\n case WallTexture.Texture10:\r\n textureImg = WallTexture10;\r\n break;\r\n default:\r\n textureImg = WallTexture00;\r\n }\r\n\r\n if (wallStructure === WallStructure.Stud) {\r\n textureImg = WallTexture00;\r\n }\r\n\r\n return textureLoader.load(textureImg, (texture) => {\r\n texture.wrapS = texture.wrapT = RepeatWrapping;\r\n texture.offset.set(0, 0);\r\n let repeatX = 0.6;\r\n let repeatY = 0.6;\r\n switch (textureType) {\r\n case WallTexture.Default:\r\n repeatX = 2;\r\n repeatY = 2;\r\n break;\r\n case WallTexture.Texture03:\r\n repeatX = 2;\r\n repeatY = 1;\r\n break;\r\n case WallTexture.Texture06:\r\n repeatX = 1;\r\n repeatY = 1;\r\n break;\r\n }\r\n texture.repeat.set(repeatX, repeatY);\r\n invalidate();\r\n });\r\n }, [textureType]);\r\n\r\n return texture;\r\n};\r\n\r\nexport const useLatestFoundation = (foundationModel: FoundationModel) => {\r\n const isFirstRenderRef = useRef(true);\r\n usePrimitiveStore((state) => state.foundationMovedFlag);\r\n\r\n let foundation = foundationModel;\r\n\r\n if (!isFirstRenderRef.current) {\r\n const latestFoundation = useStore\r\n .getState()\r\n .elements.find((e) => e.id === foundationModel.id && e.type === ObjectType.Foundation);\r\n if (latestFoundation) {\r\n foundation = latestFoundation as FoundationModel;\r\n }\r\n }\r\n\r\n isFirstRenderRef.current = false;\r\n\r\n return foundation;\r\n};\r\n","export default \"data:image/png;base64,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\"","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { useStore } from '../stores/common';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { ObjectType } from '../types';\r\nimport { SolarPanelModel } from '../models/SolarPanelModel';\r\nimport { Vector3 } from 'three';\r\nimport { UndoableMove } from '../undo/UndoableMove';\r\nimport { PolygonModel } from '../models/PolygonModel';\r\nimport { Point2 } from '../models/Point2';\r\n\r\nexport class SharedUtil {\r\n static WALL_OUTSIDE_SURFACE_MESH_NAME = 'Wall Outside Surface';\r\n\r\n static addUndoableMove() {\r\n const oldElement = useStore.getState().selectedElement;\r\n if (!oldElement) return;\r\n const newElement = useStore.getState().getElementById(oldElement.id);\r\n const oldParentId = usePrimitiveStore.getState().oldParentId;\r\n const oldFoundationId = usePrimitiveStore.getState().oldFoundationId;\r\n if (!newElement || !oldParentId || !oldFoundationId) return;\r\n\r\n const isSolarPanel = oldElement.type === ObjectType.SolarPanel;\r\n const isPolygon = oldElement.type === ObjectType.Polygon;\r\n const undoableMove = {\r\n name: 'Move',\r\n timestamp: Date.now(),\r\n movedElementId: newElement.id,\r\n movedElementType: newElement.type,\r\n oldCx: oldElement.cx,\r\n oldCy: oldElement.cy,\r\n oldCz: oldElement.cz,\r\n newCx: newElement.cx,\r\n newCy: newElement.cy,\r\n newCz: newElement.cz,\r\n oldParentType: isSolarPanel ? (oldElement as SolarPanelModel).parentType : undefined,\r\n newParentType: isSolarPanel ? (newElement as SolarPanelModel).parentType : undefined,\r\n oldParentId: oldParentId,\r\n newParentId: newElement.parentId,\r\n oldFoundationId: oldFoundationId,\r\n newFoundationId: newElement.foundationId,\r\n oldNormal: new Vector3().fromArray(oldElement.normal),\r\n newNormal: new Vector3().fromArray(newElement.normal),\r\n oldRotation: [...oldElement.rotation],\r\n newRotation: [...newElement.rotation],\r\n undo() {\r\n setUndoRedoMove(\r\n this.movedElementId,\r\n [this.oldCx, this.oldCy, this.oldCz],\r\n this.oldParentId,\r\n this.newParentId,\r\n this.oldFoundationId,\r\n this.oldParentType,\r\n this.oldRotation,\r\n this.oldNormal,\r\n isPolygon ? (oldElement as PolygonModel).vertices : undefined,\r\n );\r\n },\r\n redo() {\r\n setUndoRedoMove(\r\n this.movedElementId,\r\n [this.newCx, this.newCy, this.newCz],\r\n this.newParentId,\r\n this.oldParentId,\r\n this.newFoundationId,\r\n this.newParentType,\r\n this.newRotation,\r\n this.newNormal,\r\n isPolygon ? (newElement as PolygonModel).vertices : undefined,\r\n );\r\n },\r\n } as UndoableMove;\r\n useStore.getState().addUndoable(undoableMove);\r\n\r\n const setUndoRedoMove = (\r\n id: string,\r\n pos: number[],\r\n oldParentId?: string,\r\n newParentId?: string,\r\n foundationId?: string | null,\r\n parentType?: ObjectType,\r\n rotation?: number[],\r\n normal?: Vector3,\r\n vertices?: Point2[],\r\n ) => {\r\n useStore.getState().set((state) => {\r\n const el = state.elements.find((e) => e.id === id);\r\n if (!el) return;\r\n if (el.type === ObjectType.Polygon) {\r\n if (vertices) {\r\n const pg = el as PolygonModel;\r\n pg.vertices = [...vertices];\r\n }\r\n } else {\r\n [el.cx, el.cy, el.cz] = [...pos];\r\n }\r\n if (oldParentId && newParentId && foundationId) {\r\n el.parentId = oldParentId;\r\n el.foundationId = foundationId;\r\n\r\n if (parentType && el.type === ObjectType.SolarPanel) {\r\n (el as SolarPanelModel).parentType = parentType;\r\n }\r\n if (rotation) {\r\n el.rotation = [...rotation];\r\n }\r\n if (normal) {\r\n el.normal = [normal.x, normal.y, normal.z];\r\n }\r\n\r\n // keep abs size\r\n if (el.type === ObjectType.Window) {\r\n const oldParent = state.elements.find((e) => e.id === oldParentId);\r\n const newParent = state.elements.find((e) => e.id === newParentId);\r\n if (!oldParent || !newParent) return;\r\n const absLx = el.lx * newParent.lx;\r\n const absLz = el.lz * newParent.lz;\r\n el.lx = absLx / oldParent.lx;\r\n el.lz = absLz / oldParent.lz;\r\n }\r\n }\r\n });\r\n };\r\n }\r\n\r\n static undoInvalidOperation() {\r\n useStore.getState().set((state) => {\r\n if (!state.selectedElement) return;\r\n for (let i = 0; i < state.elements.length; i++) {\r\n const element = state.elements[i];\r\n if (element.id === state.selectedElement?.id) {\r\n const oldElement = state.selectedElement;\r\n const oldParentId = usePrimitiveStore.getState().oldParentId;\r\n const oldFoundationId = usePrimitiveStore.getState().oldFoundationId;\r\n if (oldParentId) {\r\n oldElement.parentId = oldParentId;\r\n }\r\n if (oldFoundationId) {\r\n oldElement.foundationId = oldFoundationId;\r\n }\r\n state.elements[i] = oldElement;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { useStore } from '../../stores/common';\r\nimport {\r\n GableRoofModel,\r\n GambrelRoofModel,\r\n HipRoofModel,\r\n MansardRoofModel,\r\n PyramidRoofModel,\r\n RoofModel,\r\n RoofType,\r\n} from '../../models/RoofModel';\r\nimport * as Selector from '../../stores/selector';\r\nimport PyramidRoof from './pyramidRoof';\r\nimport GableRoof from './gableRoof';\r\nimport HipRoof from './hipRoof';\r\nimport GambrelRoof from './gambrelRoof';\r\nimport { UndoableResizeRoofRise } from 'src/undo/UndoableResize';\r\nimport MansardRoof from './mansardRoof';\r\nimport { Euler, Mesh, Vector3 } from 'three';\r\nimport { ObjectType, Orientation } from 'src/types';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport { HIGHLIGHT_HANDLE_COLOR, LOCKED_ELEMENT_SELECTION_COLOR } from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { showError } from 'src/helpers';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { ElementModelFactory } from 'src/models/ElementModelFactory';\r\nimport { UndoableAdd } from 'src/undo/UndoableAdd';\r\nimport { Sphere } from '@react-three/drei';\r\nimport { useHandleSize } from '../wall/hooks';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { SharedUtil } from '../SharedUtil';\r\nimport { BuildingParts } from 'src/models/FoundationModel';\r\n\r\nexport interface RoofSegmentGroupUserData {\r\n roofId: string;\r\n foundation: ElementModel | null;\r\n centroid: Vector3;\r\n roofSegments: RoofSegmentProps[];\r\n}\r\nexport interface RoofSegmentProps {\r\n points: Vector3[];\r\n angle: number;\r\n length: number;\r\n}\r\n\r\nexport interface RoofWireframeProps {\r\n roofSegments: RoofSegmentProps[];\r\n thickness: number;\r\n lineWidth: number;\r\n lineColor: string;\r\n}\r\n\r\ninterface RoofHandleProps {\r\n position: [x: number, y: number, z: number];\r\n onPointerDown?: (event: ThreeEvent) => void;\r\n onPointerUp?: (event: ThreeEvent) => void;\r\n onPointerOver?: (event: ThreeEvent) => void;\r\n}\r\n\r\nconst addUndoableAddRooftopElement = (elem: ElementModel) => {\r\n const undoableAdd = {\r\n name: `Add ${elem.type} on Roof`,\r\n timestamp: Date.now(),\r\n addedElement: elem,\r\n undo: () => {\r\n useStore.getState().removeElementById(elem.id, false);\r\n },\r\n redo: () => {\r\n useStore.getState().set((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n useStore.getState().addUndoable(undoableAdd);\r\n};\r\n\r\nconst getPointerOnRoof = (e: ThreeEvent) => {\r\n for (const intersection of e.intersections) {\r\n if (intersection.eventObject.name.includes('Roof Segments Group')) {\r\n if (intersection.object.name.includes('Flat roof')) {\r\n return intersection.point.clone().setZ(intersection.point.z - 0.01);\r\n } else {\r\n return intersection.point;\r\n }\r\n }\r\n }\r\n return e.intersections[0].point;\r\n};\r\n\r\nconst handleAddElementOnRoof = (\r\n e: ThreeEvent,\r\n foundationId: string,\r\n roofId: string,\r\n roofSegments: RoofSegmentProps[],\r\n ridgeMidPoint: Vector3,\r\n) => {\r\n if (e.intersections.length === 0) return;\r\n\r\n const objectTypeToAdd = useStore.getState().objectTypeToAdd;\r\n if (objectTypeToAdd === ObjectType.None) return;\r\n\r\n const roof = useStore.getState().getElementById(roofId);\r\n const foundation = useStore.getState().getElementById(foundationId);\r\n if (!roof || !foundation) return;\r\n\r\n const pointer = getPointerOnRoof(e);\r\n const posRelToFoundation = new Vector3()\r\n .subVectors(pointer, new Vector3(foundation.cx, foundation.cy, foundation.lz))\r\n .applyEuler(new Euler(0, 0, -foundation.rotation[2]));\r\n const posRelToCentroid = posRelToFoundation.clone().sub(ridgeMidPoint);\r\n\r\n switch (objectTypeToAdd) {\r\n case ObjectType.SolarPanel: {\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n const actionState = useStore.getState().actionState;\r\n const newElement = ElementModelFactory.makeSolarPanel(\r\n roof,\r\n useStore.getState().getPvModule(actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\r\n posRelToFoundation.x / foundation.lx,\r\n posRelToFoundation.y / foundation.ly,\r\n posRelToFoundation.z,\r\n actionState.solarPanelOrientation ?? Orientation.landscape,\r\n actionState.solarPanelPoleHeight ?? 1,\r\n actionState.solarPanelPoleSpacing ?? 3,\r\n actionState.solarPanelTiltAngle ?? 0,\r\n actionState.solarPanelRelativeAzimuth ?? 0,\r\n normal,\r\n rotation ?? [0, 0, 1],\r\n actionState.solarPanelFrameColor,\r\n undefined,\r\n undefined,\r\n ObjectType.Roof,\r\n );\r\n useStore.getState().set((state) => {\r\n state.elements.push(newElement);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n addUndoableAddRooftopElement(newElement);\r\n\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n const newElement = ElementModelFactory.makeWindow(\r\n roof,\r\n posRelToFoundation.x,\r\n posRelToFoundation.y,\r\n posRelToFoundation.z,\r\n ObjectType.Roof,\r\n rotation,\r\n 0.5,\r\n 0.5,\r\n );\r\n useStore.getState().set((state) => {\r\n state.elements.push(newElement);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n addUndoableAddRooftopElement(newElement);\r\n\r\n break;\r\n }\r\n case ObjectType.Sensor: {\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n const newElement = ElementModelFactory.makeSensor(\r\n roof,\r\n posRelToFoundation.x / foundation.lx,\r\n posRelToFoundation.y / foundation.ly,\r\n posRelToFoundation.z,\r\n normal,\r\n rotation ?? [0, 0, 1],\r\n );\r\n useStore.getState().set((state) => {\r\n state.elements.push(newElement);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n addUndoableAddRooftopElement(newElement);\r\n\r\n break;\r\n }\r\n case ObjectType.Light: {\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n const actionState = useStore.getState().actionState;\r\n const newElement = ElementModelFactory.makeLight(\r\n roof,\r\n 2,\r\n actionState.lightDistance,\r\n actionState.lightIntensity,\r\n actionState.lightColor,\r\n posRelToFoundation.x / foundation.lx,\r\n posRelToFoundation.y / foundation.ly,\r\n posRelToFoundation.z,\r\n normal,\r\n rotation ?? [0, 0, 1],\r\n );\r\n useStore.getState().set((state) => {\r\n state.elements.push(newElement);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n addUndoableAddRooftopElement(newElement);\r\n\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const handleRoofBodyPointerDown = (e: ThreeEvent, id: string, foundationId: string) => {\r\n if (useStore.getState().isAddingElement() || useStore.getState().objectTypeToAdd !== ObjectType.None) {\r\n return;\r\n }\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === e.eventObject.name) {\r\n e.stopPropagation();\r\n useStore.getState().set((state) => {\r\n if (state.groupActionMode) {\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (state.selectedElementIdSet.has(foundationId)) {\r\n state.selectedElementIdSet.delete(foundationId);\r\n } else {\r\n state.selectedElementIdSet.add(foundationId);\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.selected = true;\r\n state.selectedElement = e;\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport const addUndoableResizeRoofRise = (elemId: string, oldRise: number, newRise: number) => {\r\n const undoable = {\r\n name: 'Resize Roof Rise',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldRise: oldRise,\r\n newRise: newRise,\r\n undo: () => {\r\n useStore.getState().updateRoofRiseById(undoable.resizedElementId, undoable.oldRise, 0);\r\n },\r\n redo: () => {\r\n useStore.getState().updateRoofRiseById(undoable.resizedElementId, undoable.newRise, 0);\r\n },\r\n } as UndoableResizeRoofRise;\r\n useStore.getState().addUndoable(undoable);\r\n};\r\n\r\nexport const spBoundaryCheck = (solarPanelVertices: Vector3[], wallVertices: Point2[]) => {\r\n const lang = { lng: useStore.getState().language };\r\n if (RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, wallVertices)) {\r\n return true;\r\n } else {\r\n if (useStore.getState().moveHandleType || useStore.getState().viewState.orthographic) {\r\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\r\n } else if (useStore.getState().resizeHandleType) {\r\n showError(i18n.t('message.ResizingOutsideBoundaryCancelled', lang));\r\n } else if (useStore.getState().rotateHandleType) {\r\n showError(i18n.t('message.RotationOutsideBoundaryCancelled', lang));\r\n }\r\n return false;\r\n }\r\n};\r\n\r\nexport const spCollisionCheck = (sp: SolarPanelModel, foundation: ElementModel, spVertices: Vector3[]) => {\r\n const lang = { lng: useStore.getState().language };\r\n if (RoofUtil.rooftopSPCollisionCheck(sp, foundation, spVertices)) {\r\n return true;\r\n } else {\r\n if (useStore.getState().moveHandleType || useStore.getState().viewState.orthographic) {\r\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\r\n } else if (useStore.getState().resizeHandleType) {\r\n showError(i18n.t('message.ResizingCancelledBecauseOfOverlap', lang));\r\n } else if (useStore.getState().rotateHandleType) {\r\n showError(i18n.t('message.RotationCancelledBecauseOfOverlap', lang));\r\n }\r\n return false;\r\n }\r\n};\r\n\r\nexport const updateRooftopElements = (\r\n foundation: ElementModel | null,\r\n roofId: string,\r\n roofSegments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n h: number,\r\n thickness: number,\r\n isFlatGambrel?: boolean,\r\n) => {\r\n if (foundation === null) return;\r\n useStore.getState().set((state) => {\r\n if (foundation === null) return;\r\n for (const e of state.elements) {\r\n if (e.parentId === roofId && e.foundationId) {\r\n if (e.type === ObjectType.SolarPanel) {\r\n const posRelToFoundation = new Vector3(e.cx * foundation.lx, e.cy * foundation.ly, e.cz + foundation.lz);\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n const { segmentVertices, normal, rotation } = RoofUtil.computeState(\r\n roofSegments,\r\n posRelToCentroid,\r\n isFlatGambrel,\r\n );\r\n let z;\r\n if (segmentVertices) {\r\n z = RoofUtil.getRooftopElementZ(segmentVertices, posRelToCentroid, h + thickness);\r\n } else {\r\n z = h + thickness;\r\n }\r\n if (normal && rotation && z !== undefined) {\r\n e.normal = normal.toArray();\r\n e.rotation = [...rotation];\r\n e.cz = z;\r\n }\r\n } else if (e.type === ObjectType.Window) {\r\n const posRelToFoundation = new Vector3(e.cx, e.cy, e.cz + foundation.lz);\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n const { segmentVertices, normal, rotation } = RoofUtil.computeState(\r\n roofSegments,\r\n posRelToCentroid,\r\n isFlatGambrel,\r\n );\r\n let z;\r\n if (segmentVertices) {\r\n z = RoofUtil.getRooftopElementZ(segmentVertices, posRelToCentroid, h + thickness);\r\n } else {\r\n z = h + thickness;\r\n }\r\n if (normal && rotation && z !== undefined) {\r\n e.rotation = [...rotation];\r\n e.cz = z;\r\n }\r\n } else if (e.type === ObjectType.Sensor || e.type === ObjectType.Light) {\r\n const posRelToFoundation = new Vector3(e.cx * foundation.lx, e.cy * foundation.ly, e.cz + foundation.lz);\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n const { segmentVertices, normal, rotation } = RoofUtil.computeState(\r\n roofSegments,\r\n posRelToCentroid,\r\n isFlatGambrel,\r\n );\r\n let z;\r\n if (segmentVertices) {\r\n z = RoofUtil.getRooftopElementZ(segmentVertices, posRelToCentroid, h + thickness);\r\n } else {\r\n z = h + thickness;\r\n }\r\n if (normal && rotation && z !== undefined) {\r\n e.normal = normal.toArray();\r\n e.rotation = [...rotation];\r\n e.cz = z;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n};\r\n\r\n// handle pointer events\r\nexport const handlePointerDown = (\r\n e: ThreeEvent,\r\n foundationId: string,\r\n roofId: string,\r\n roofSegments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n) => {\r\n if (e.button === 2) return;\r\n // click on child\r\n if (e.intersections[0].eventObject.name !== e.eventObject.name) {\r\n }\r\n // click on roof body\r\n else {\r\n handleRoofBodyPointerDown(e, roofId, foundationId);\r\n handleAddElementOnRoof(e, foundationId, roofId, roofSegments, centroid);\r\n }\r\n};\r\n\r\nexport const handlePointerUp = (event: ThreeEvent, roofModel: RoofModel) => {\r\n const selectedElement = useStore.getState().selectedElement;\r\n if (!selectedElement || !RoofUtil.isValidOnRoof(selectedElement)) return;\r\n\r\n const element = useStore.getState().getElementById(selectedElement.id);\r\n if (element && useStore.getState().moveHandleType) {\r\n const intersectionRoofs = event.intersections.filter((i) => i.eventObject.name.includes('Roof'));\r\n const isFirstIntersectedRoof = intersectionRoofs[0].eventObject.userData.roofId === roofModel.id;\r\n if (isFirstIntersectedRoof && element.foundationId) {\r\n const foundation = useStore.getState().getElementById(element.foundationId);\r\n\r\n if (foundation) {\r\n switch (element.type) {\r\n case ObjectType.SolarPanel: {\r\n const solarPanel = element as SolarPanelModel;\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(roofModel);\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(solarPanel, foundation);\r\n if (\r\n !spBoundaryCheck(solarPanelVertices, boundaryVertices) ||\r\n !spCollisionCheck(solarPanel, foundation, solarPanelVertices)\r\n ) {\r\n SharedUtil.undoInvalidOperation();\r\n } else {\r\n SharedUtil.addUndoableMove();\r\n }\r\n break;\r\n }\r\n case ObjectType.Sensor:\r\n SharedUtil.addUndoableMove();\r\n break;\r\n case ObjectType.Light:\r\n SharedUtil.addUndoableMove();\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n useStore.getState().set((state) => {\r\n state.moveHandleType = null;\r\n });\r\n};\r\n\r\nexport const handlePointerMove = (event: ThreeEvent, id: string) => {\r\n const selectedElement = useStore.getState().getSelectedElement();\r\n if (!selectedElement || !RoofUtil.isValidOnRoof(selectedElement)) return;\r\n\r\n switch (selectedElement.type) {\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel: {\r\n if (\r\n selectedElement.type === ObjectType.SolarPanel &&\r\n (selectedElement as SolarPanelModel).parentType === undefined\r\n )\r\n return;\r\n if (useStore.getState().moveHandleType) {\r\n const intersectionObjects = event.intersections.filter(\r\n (i) =>\r\n i.eventObject.name.includes('Roof') ||\r\n i.eventObject.name.includes(SharedUtil.WALL_OUTSIDE_SURFACE_MESH_NAME),\r\n );\r\n const isFirstIntersectedRoof = intersectionObjects[0].eventObject.userData.roofId === id;\r\n\r\n if (isFirstIntersectedRoof) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === selectedElement.id) {\r\n const { roofId, foundation, centroid, roofSegments } = intersectionObjects[0].eventObject\r\n .userData as RoofSegmentGroupUserData;\r\n\r\n if (foundation && centroid && roofSegments && roofId) {\r\n const pointer = intersectionObjects[0].point;\r\n const posRelToFoundation = new Vector3()\r\n .subVectors(pointer, new Vector3(foundation.cx, foundation.cy))\r\n .applyEuler(new Euler(0, 0, -foundation.rotation[2]));\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n e.cx = posRelToFoundation.x / foundation.lx;\r\n e.cy = posRelToFoundation.y / foundation.ly;\r\n e.cz = posRelToFoundation.z - foundation.lz;\r\n e.rotation = [...rotation];\r\n e.normal = normal.toArray();\r\n e.parentId = roofId;\r\n e.foundationId = foundation.id;\r\n if (e.type === ObjectType.SolarPanel) {\r\n (e as SolarPanelModel).parentType = ObjectType.Roof;\r\n e.color = '#fff';\r\n }\r\n if (state.selectedElement) {\r\n state.selectedElement.parentId = roofId;\r\n state.selectedElement.foundationId = foundation.id;\r\n }\r\n usePrimitiveStore.getState().setPrimitiveStore('showWallIntersectionPlaneId', null);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const handleContextMenu = (e: ThreeEvent, id: string) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === e.eventObject.name) {\r\n e.stopPropagation();\r\n useStore.getState().set((state) => {\r\n state.contextMenuObjectType = ObjectType.Roof;\r\n state.pastePoint.copy(e.intersections[0].point);\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.selected = true;\r\n state.selectedElement = e;\r\n\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport const RoofHandle = ({ position, onPointerDown, onPointerUp, onPointerOver }: RoofHandleProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const roofHandleSize = useHandleSize();\r\n const { gl } = useThree();\r\n\r\n const pointerDownRef = useRef(false);\r\n const hoveredRef = useRef(false);\r\n const haveFiredEvent = useRef(false);\r\n const handleRef = useRef();\r\n\r\n const [color, setColor] = useState('white');\r\n\r\n const setHeightLight = (b: boolean) => {\r\n if (b) {\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n gl.domElement.style.cursor = 'pointer';\r\n } else {\r\n setColor('white');\r\n gl.domElement.style.cursor = 'default';\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n if (hoveredRef.current) {\r\n haveFiredEvent.current = true;\r\n }\r\n\r\n if (!hoveredRef.current && pointerDownRef.current) {\r\n setHeightLight(false);\r\n }\r\n pointerDownRef.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const isFirstHandle = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n for (const { eventObject } of e.intersections) {\r\n if (eventObject.name === 'Roof Handle') {\r\n return eventObject === handleRef.current;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n return (\r\n {\r\n if (isFirstHandle(e)) {\r\n haveFiredEvent.current = false;\r\n if (!hoveredRef.current) {\r\n hoveredRef.current = true;\r\n setHeightLight(true);\r\n }\r\n } else {\r\n setColor('white');\r\n }\r\n }}\r\n // this will fire once after pointerup when hovered\r\n onPointerOut={(e) => {\r\n if (haveFiredEvent.current) {\r\n return;\r\n }\r\n if (!pointerDownRef.current) {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === 'Roof Handle') {\r\n setColor('white');\r\n } else {\r\n setHeightLight(false);\r\n }\r\n }\r\n hoveredRef.current = false;\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n }}\r\n onPointerDown={(e) => {\r\n if (isFirstHandle(e)) {\r\n if (onPointerDown) {\r\n onPointerDown(e);\r\n }\r\n pointerDownRef.current = true;\r\n }\r\n }}\r\n onPointerUp={(e) => {\r\n if (isFirstHandle(e)) {\r\n if (onPointerUp) {\r\n onPointerUp(e);\r\n }\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n if (isFirstHandle(e)) {\r\n if (onPointerOver) {\r\n onPointerOver(e);\r\n }\r\n }\r\n }}\r\n onPointerLeave={(e) => {\r\n if (isFirstHandle(e)) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n }\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport interface RoofRendererProps extends BuildingParts {\r\n roofModel: RoofModel;\r\n}\r\n\r\nconst RoofRenderer = ({ roofModel, foundationModel }: RoofRendererProps) => {\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const { id, wallsId, roofType } = roofModel;\r\n\r\n useEffect(() => {\r\n if (wallsId.length === 0) {\r\n removeElementById(id, false);\r\n }\r\n }, [wallsId]);\r\n\r\n const renderRoof = () => {\r\n switch (roofType) {\r\n case RoofType.Pyramid:\r\n return ;\r\n case RoofType.Gable:\r\n return ;\r\n case RoofType.Hip:\r\n return ;\r\n case RoofType.Gambrel:\r\n return ;\r\n case RoofType.Mansard:\r\n return ;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return renderRoof();\r\n};\r\n\r\nexport function areRoofsEqual(prev: RoofRendererProps, curr: RoofRendererProps) {\r\n return (\r\n prev.roofModel === curr.roofModel &&\r\n prev.foundationModel.lx === curr.foundationModel.lx &&\r\n prev.foundationModel.ly === curr.foundationModel.ly &&\r\n prev.foundationModel.lz === curr.foundationModel.lz\r\n );\r\n}\r\n\r\nexport default React.memo(RoofRenderer, areRoofsEqual);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Undoable } from './Undoable';\r\nimport { ElementModel } from '../models/ElementModel';\r\n\r\nexport interface UndoableAdd extends Undoable {\r\n addedElement: ElementModel;\r\n}\r\n\r\nexport interface UndoableAddWall extends UndoableAdd {\r\n flippedWallSide: FlippedWallSide;\r\n}\r\n\r\nexport enum FlippedWallSide {\r\n left = 'Left',\r\n right = 'Right',\r\n loop = 'Loop',\r\n null = 'Null',\r\n}\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ObjectType, RoofTexture } from 'src/types';\r\n\r\nimport RoofTextureDefault from 'src/resources/roof_edge.png';\r\nimport RoofTexture00 from 'src/resources/tiny_white_square.png';\r\nimport RoofTexture01 from 'src/resources/roof_01.png';\r\nimport RoofTexture02 from 'src/resources/roof_02.png';\r\nimport RoofTexture03 from 'src/resources/roof_03.png';\r\nimport RoofTexture04 from 'src/resources/roof_04.png';\r\nimport RoofTexture05 from 'src/resources/roof_05.png';\r\nimport RoofTexture06 from 'src/resources/roof_06.png';\r\nimport RoofTexture07 from 'src/resources/roof_07.png';\r\nimport { RepeatWrapping, TextureLoader, Vector3 } from 'three';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useThree } from '@react-three/fiber';\r\nimport { RoofSegmentGroupUserData, RoofSegmentProps, updateRooftopElements } from './roofRenderer';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { GambrelRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { getRoofPointsOfGambrelRoof } from './flatRoof';\r\nimport shallow from 'zustand/shallow';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { useDataStore } from 'src/stores/commonData';\r\nimport { useLatestFoundation } from '../wall/hooks';\r\n\r\nexport type ComposedWall = {\r\n leftPoint: Vector3;\r\n rightPoint: Vector3;\r\n relativeAngle: number;\r\n lz: number;\r\n eavesLength: number;\r\n wallsId: string[];\r\n};\r\n\r\nexport const useRoofTexture = (textureType: RoofTexture) => {\r\n const textureLoader = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case RoofTexture.NoTexture:\r\n textureImg = RoofTexture00;\r\n break;\r\n case RoofTexture.Texture01:\r\n textureImg = RoofTexture01;\r\n break;\r\n case RoofTexture.Texture02:\r\n textureImg = RoofTexture02;\r\n break;\r\n case RoofTexture.Texture03:\r\n textureImg = RoofTexture03;\r\n break;\r\n case RoofTexture.Texture04:\r\n textureImg = RoofTexture04;\r\n break;\r\n case RoofTexture.Texture05:\r\n textureImg = RoofTexture05;\r\n break;\r\n case RoofTexture.Texture06:\r\n textureImg = RoofTexture06;\r\n break;\r\n case RoofTexture.Texture07:\r\n textureImg = RoofTexture07;\r\n break;\r\n default:\r\n textureImg = RoofTextureDefault;\r\n }\r\n return new TextureLoader().load(textureImg, (texture) => {\r\n texture.wrapS = texture.wrapT = RepeatWrapping;\r\n switch (textureType) {\r\n case RoofTexture.NoTexture:\r\n case RoofTexture.Default:\r\n texture.repeat.set(5, 3);\r\n break;\r\n case RoofTexture.Texture01:\r\n texture.repeat.set(0.5, 0.25);\r\n break;\r\n case RoofTexture.Texture03:\r\n texture.repeat.set(0.9, 0.9);\r\n break;\r\n case RoofTexture.Texture04:\r\n case RoofTexture.Texture05:\r\n case RoofTexture.Texture06:\r\n texture.repeat.set(0.75, 0.75);\r\n break;\r\n default:\r\n texture.repeat.set(0.5, 0.5);\r\n }\r\n setTexture(texture);\r\n invalidate();\r\n });\r\n }, [textureType]);\r\n\r\n const [texture, setTexture] = useState(textureLoader);\r\n const { invalidate } = useThree();\r\n return texture;\r\n};\r\n\r\nexport const useTransparent = (transparent?: boolean, opacity?: number) => {\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n\r\n const _transparent = groundImage && orthographic;\r\n const _opacity = _transparent ? 0.25 : 1;\r\n\r\n return { transparent: transparent || _transparent, opacity: Math.min(opacity !== undefined ? opacity : 1, _opacity) };\r\n};\r\n\r\nexport const useMultiCurrWallArray = (fId: string | undefined, roofId: string, wallsId: string[]) => {\r\n const wallsOnSameFoundation = useStore(\r\n (state) => state.elements.filter((e) => e.foundationId === fId && e.type === ObjectType.Wall),\r\n shallow,\r\n );\r\n\r\n const getWallOnSameFoundation = (id: string) => wallsOnSameFoundation.find((e) => e.id === id) as WallModel;\r\n\r\n const isLoopRef = useRef(false);\r\n\r\n const currentWallArray = useMemo(() => {\r\n for (const wid of wallsId) {\r\n let wall = getWallOnSameFoundation(wid) as WallModel;\r\n if (!wall) return [];\r\n\r\n const array = [];\r\n const startWall = wall;\r\n let i = 0;\r\n while (wall && (!wall.roofId || wall.roofId === roofId) && i++ < 100) {\r\n array.push(wall);\r\n if (wall.leftJoints[0]) {\r\n if (wall.leftJoints[0] !== startWall.id) {\r\n wall = getWallOnSameFoundation(wall.leftJoints[0]) as WallModel;\r\n }\r\n // is a loop\r\n else {\r\n array.reverse();\r\n isLoopRef.current = true;\r\n return array;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n array.reverse();\r\n\r\n wall = getWallOnSameFoundation(startWall.rightJoints[0]) as WallModel;\r\n i = 0;\r\n while (wall && (!wall.roofId || wall.roofId === roofId) && i++ < 100) {\r\n array.push(wall);\r\n if (wall.rightJoints[0] && wall.rightJoints[0] !== startWall.id) {\r\n wall = getWallOnSameFoundation(wall.rightJoints[0]) as WallModel;\r\n } else {\r\n break;\r\n }\r\n }\r\n isLoopRef.current = false;\r\n if (array.length > 1) {\r\n return array;\r\n }\r\n }\r\n return [];\r\n }, [wallsId, wallsOnSameFoundation]);\r\n\r\n return { currentWallArray, isLoopRef };\r\n};\r\n\r\nexport const useComposedWallArray = (wId: string, fId: string) => {\r\n const wallsOnSameFoundation = useStore(\r\n (state) => state.elements.filter((e) => e.foundationId === fId && e.type === ObjectType.Wall),\r\n shallow,\r\n );\r\n\r\n const composedWallsArray = useMemo(() => {\r\n const getWallOnSameFoundation = (id: string) => wallsOnSameFoundation.find((e) => e.id === id) as WallModel;\r\n\r\n const wallMap = new Map();\r\n const rotationMap = new Map();\r\n const startWall: WallModel | null = getWallOnSameFoundation(wId);\r\n let wall: WallModel | null = startWall;\r\n let count = 0;\r\n let isLoop = false;\r\n\r\n while (wall && wall.type === ObjectType.Wall && count < 100) {\r\n wallMap.set(wall.id, wall);\r\n const rotation = wall.relativeAngle.toFixed(1);\r\n if (rotationMap.has(rotation)) {\r\n rotationMap.get(rotation)?.push(wall);\r\n } else {\r\n rotationMap.set(rotation, [wall]);\r\n }\r\n if (wall.rightJoints.length !== 0) {\r\n wall = getWallOnSameFoundation(wall.rightJoints[0]);\r\n if (wall && wall.id === startWall.id) {\r\n isLoop = true;\r\n break;\r\n }\r\n count++;\r\n } else {\r\n wall = null;\r\n }\r\n }\r\n\r\n if (!isLoop || rotationMap.size !== 4) return null;\r\n\r\n const arr: ComposedWall[] = [];\r\n for (const [rot, walls] of rotationMap) {\r\n // check connection\r\n let count = 0;\r\n for (const wall of walls) {\r\n const lw = wallMap.get(wall.leftJoints[0]);\r\n const rw = wallMap.get(wall.rightJoints[0]);\r\n if (lw && lw.relativeAngle.toFixed(1) !== rot) {\r\n count++;\r\n }\r\n if (rw && rw.relativeAngle.toFixed(1) !== rot) {\r\n count++;\r\n }\r\n if (count > 2) break;\r\n }\r\n if (count !== 2) return null;\r\n\r\n let leftMostWall: WallModel | null = null;\r\n let rightMostWall: WallModel | null = null;\r\n let highestLz = 0;\r\n let longestEavesLength = -1;\r\n for (const wall of walls) {\r\n const lw = wallMap.get(wall.leftJoints[0]);\r\n const rw = wallMap.get(wall.rightJoints[0]);\r\n highestLz = Math.max(highestLz, wall.lz);\r\n longestEavesLength = Math.max(longestEavesLength, wall.eavesLength);\r\n if (lw && lw.relativeAngle.toFixed(1) !== rot) {\r\n leftMostWall = wall;\r\n }\r\n if (rw && rw.relativeAngle.toFixed(1) !== rot) {\r\n rightMostWall = wall;\r\n }\r\n }\r\n\r\n if (leftMostWall && rightMostWall && highestLz > 0 && longestEavesLength !== -1) {\r\n arr.push({\r\n leftPoint: new Vector3().fromArray(leftMostWall.leftPoint),\r\n rightPoint: new Vector3().fromArray(rightMostWall.rightPoint),\r\n relativeAngle: leftMostWall.relativeAngle,\r\n lz: highestLz,\r\n eavesLength: longestEavesLength,\r\n wallsId: walls.map((w) => w.id),\r\n });\r\n }\r\n }\r\n\r\n if (arr.length !== 4) return null;\r\n return arr;\r\n }, [wallsOnSameFoundation]);\r\n\r\n return composedWallsArray;\r\n};\r\n\r\nexport const useComposedRoofHeight = (composedWallArray: ComposedWall[] | null, rise: number, isGabled?: boolean) => {\r\n const highestWallHeight = useMemo(\r\n () => RoofUtil.getHighestComposedWallHeight(composedWallArray, isGabled),\r\n [composedWallArray],\r\n );\r\n\r\n const topZ = useMemo(() => highestWallHeight + rise, [highestWallHeight, rise]); // height from top to foundation\r\n\r\n return { highestWallHeight, topZ };\r\n};\r\n\r\nexport const useRoofHeight = (currentWallArray: WallModel[], rise: number, ignoreSide?: boolean) => {\r\n const highestWallHeight = useMemo(\r\n () => RoofUtil.getHighestWallHeight(currentWallArray, ignoreSide),\r\n [currentWallArray],\r\n );\r\n const [riseInnerState, setRiseInnerState] = useState(rise); // height from top to maxWallHeight\r\n const topZ = highestWallHeight + riseInnerState; // height from top to foundation\r\n useEffect(() => {\r\n if (rise !== riseInnerState) {\r\n setRiseInnerState(rise);\r\n }\r\n }, [rise]);\r\n\r\n return { highestWallHeight, topZ, riseInnerState, setRiseInnerState };\r\n};\r\n\r\nexport const useUpdateSegmentVerticesMap = (\r\n roofId: string,\r\n centroid: Vector3,\r\n roofSegments: RoofSegmentProps[],\r\n isFlat: boolean,\r\n roofType: RoofType,\r\n mansardTop?: Vector3[],\r\n) => {\r\n const runDynamicSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\r\n const runStaticSimulation = usePrimitiveStore(Selector.runStaticSimulation);\r\n const runDailyThermalSimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\r\n\r\n const updateSegmentVertices = () => {\r\n const relToFoundation = (v: Vector3) => v.clone().add(centroid);\r\n\r\n let vertices: Vector3[][] = [];\r\n\r\n // FIXME\r\n // In the following, the vertices are relative to the foundation only in terms of position.\r\n // To get the absolute coordinates, we must apply the foundation's orientation.\r\n if (isFlat) {\r\n if (roofType === RoofType.Gambrel) {\r\n vertices.push(getRoofPointsOfGambrelRoof(roofSegments).map(relToFoundation));\r\n } else {\r\n const points: Vector3[] = [];\r\n for (const segment of roofSegments) {\r\n points.push(segment.points[1].clone().add(centroid));\r\n }\r\n vertices.push(points);\r\n }\r\n } else {\r\n for (const segment of roofSegments) {\r\n const points = segment.points;\r\n // triangle segment\r\n if (points.length === 6) {\r\n vertices.push(points.slice(3).map(relToFoundation));\r\n }\r\n // quad segment\r\n else if (points.length === 8) {\r\n vertices.push(points.slice(4).map(relToFoundation));\r\n } else {\r\n throw new Error('Invalid Roof segment data');\r\n }\r\n }\r\n if (mansardTop) {\r\n vertices.push(mansardTop);\r\n }\r\n }\r\n useDataStore.getState().setRoofSegmentVertices(roofId, vertices);\r\n return vertices;\r\n };\r\n\r\n // we don't render heatmaps in yearly thermal simulations\r\n if (runDynamicSimulation || runStaticSimulation || runDailyThermalSimulation) {\r\n updateSegmentVertices();\r\n }\r\n\r\n useEffect(() => {\r\n updateSegmentVertices();\r\n }, [roofSegments]);\r\n\r\n return updateSegmentVertices;\r\n};\r\n\r\nexport const useUpdateSegmentVerticesWithoutOverhangMap = (update: () => void): void => {\r\n const runDailyThermalSimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\r\n const runYearlyThermalSimulation = usePrimitiveStore(Selector.runYearlyThermalSimulation);\r\n\r\n if (runDailyThermalSimulation || runYearlyThermalSimulation) {\r\n update();\r\n }\r\n};\r\n\r\nexport const useUpdateOldRoofFiles = (roofModel: RoofModel, highestWallHeight: number) => {\r\n const fileChanged = useStore(Selector.fileChanged);\r\n useEffect(() => {\r\n if (roofModel.rise === undefined) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === roofModel.id && e.type === ObjectType.Roof) {\r\n const roof = e as RoofModel;\r\n if (roof.rise === undefined) {\r\n roof.rise = roof.lz - highestWallHeight;\r\n roof.lz = 0;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }, [fileChanged]);\r\n};\r\n\r\nexport const useUpdateAfterMounted = () => {\r\n const [, setUpdate] = useState(false);\r\n useEffect(() => {\r\n setUpdate((b) => !b);\r\n }, []);\r\n};\r\n\r\nexport const useIsFirstRender = () => {\r\n const isFirstRenderRef = useRef(true);\r\n if (isFirstRenderRef.current) {\r\n isFirstRenderRef.current = false;\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport const useUpdateRooftopElementsByContextMenuChanges = (\r\n foundation: FoundationModel | null,\r\n roofId: string,\r\n roofSegments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n topZ: number,\r\n thickness: number,\r\n isFlatGambrel?: boolean,\r\n) => {\r\n const updateFlag = useStore((state) => state.updateElementOnRoofFlag);\r\n\r\n // only update by context menu changes\r\n useEffect(() => {\r\n if (updateFlag) {\r\n updateRooftopElements(foundation, roofId, roofSegments, centroid, topZ, thickness, isFlatGambrel);\r\n useStore.getState().setUpdateElementOnRoofFlag(false);\r\n }\r\n }, [topZ, thickness, updateFlag]);\r\n};\r\n\r\nexport const useUpdateRooftopElementsByControlPoints = (\r\n foundation: FoundationModel | null,\r\n rId: string,\r\n segments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n topZ: number,\r\n thickness: number,\r\n isFlatGambrel?: boolean,\r\n) => {\r\n const isFirstRender = useIsFirstRender();\r\n useEffect(() => {\r\n if (isFirstRender) return;\r\n updateRooftopElements(foundation, rId, segments, centroid, topZ, thickness, isFlatGambrel);\r\n }, [segments]);\r\n};\r\n\r\nexport const useUpdateRooftopElements = (\r\n foundation: FoundationModel | null,\r\n roofId: string,\r\n segments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n topZ: number,\r\n thickness: number,\r\n isFlatGambrel?: boolean,\r\n) => {\r\n useUpdateRooftopElementsByControlPoints(foundation, roofId, segments, centroid, topZ, thickness, isFlatGambrel);\r\n useUpdateRooftopElementsByContextMenuChanges(foundation, roofId, segments, centroid, topZ, thickness, isFlatGambrel);\r\n};\r\n\r\nexport const useUserData = (\r\n roofId: string,\r\n foundationModel: FoundationModel,\r\n centroid: Vector3,\r\n roofSegments: RoofSegmentProps[],\r\n) => {\r\n const latestFoundation = useLatestFoundation(foundationModel);\r\n\r\n // used for move rooftop elements between different roofs, passed to handlePointerMove in roofRenderer\r\n const userData: RoofSegmentGroupUserData = useMemo(\r\n () => ({\r\n roofId: roofId,\r\n foundation: latestFoundation,\r\n centroid: centroid,\r\n roofSegments: roofSegments,\r\n }),\r\n [roofId, centroid, roofSegments, latestFoundation],\r\n );\r\n\r\n return userData;\r\n};\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC\"","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport {\r\n BoxBufferGeometry,\r\n BufferGeometry,\r\n CanvasTexture,\r\n Euler,\r\n ExtrudeBufferGeometry,\r\n FrontSide,\r\n Material,\r\n Mesh,\r\n Shape,\r\n Vector3,\r\n} from 'three';\r\nimport { RoofSegmentProps } from './roofRenderer';\r\nimport { ObjectType, RoofTexture } from 'src/types';\r\nimport React, { useMemo, useRef } from 'react';\r\nimport { CSG } from 'three-csg-ts';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useDataStore } from 'src/stores/commonData';\r\nimport { useRoofTexture, useTransparent, useUpdateAfterMounted } from './hooks';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n} from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { Util } from 'src/Util';\r\nimport { Cone, Line } from '@react-three/drei';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { getPolygonWindowShape } from '../window/polygonalWindow';\r\nimport { getArchedWindowShape } from '../window/archedWindow';\r\nimport { FoundationModel } from '../../models/FoundationModel';\r\nimport { RoofType } from '../../models/RoofModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\nimport shallow from 'zustand/shallow';\r\n\r\ninterface TopExtrudeProps {\r\n uuid?: string;\r\n simulation?: boolean;\r\n shape: Shape;\r\n thickness: number;\r\n holeMeshes: Mesh[];\r\n castShadow: boolean;\r\n receiveShadow: boolean;\r\n children: JSX.Element;\r\n}\r\n\r\ninterface FlatRoofProps {\r\n id: string;\r\n foundationModel: FoundationModel | null;\r\n roofType: RoofType;\r\n roofSegments: RoofSegmentProps[];\r\n center: Vector3;\r\n thickness: number;\r\n lineWidth: number;\r\n lineColor: string;\r\n sideColor: string;\r\n color: string;\r\n textureType: RoofTexture;\r\n heatmap: CanvasTexture | null;\r\n}\r\n\r\nconst drawShapeOfGambrelRoof = (shape: Shape, roofSegments: RoofSegmentProps[]) => {\r\n const [frontSide, frontTop, backTop, backSide] = roofSegments;\r\n shape.moveTo(frontSide.points[0].x, frontSide.points[0].y);\r\n shape.lineTo(frontSide.points[1].x, frontSide.points[1].y);\r\n shape.lineTo(backSide.points[0].x, backSide.points[0].y);\r\n shape.lineTo(backSide.points[1].x, backSide.points[1].y);\r\n shape.closePath();\r\n};\r\n\r\nexport const getRoofPointsOfGambrelRoof = (roofSegments: RoofSegmentProps[], array?: Vector3[]) => {\r\n const arr: Vector3[] = [];\r\n const [frontSide, frontTop, backTop, backSide] = roofSegments;\r\n arr.push(frontSide.points[0].clone());\r\n arr.push(frontSide.points[1].clone());\r\n arr.push(backSide.points[0].clone());\r\n arr.push(backSide.points[1].clone());\r\n if (array) {\r\n array.push(...arr);\r\n return array;\r\n } else {\r\n return arr;\r\n }\r\n};\r\n\r\nexport const TopExtrude = ({\r\n uuid,\r\n shape,\r\n thickness,\r\n holeMeshes,\r\n simulation,\r\n castShadow,\r\n receiveShadow,\r\n children,\r\n}: TopExtrudeProps) => {\r\n const ref = useRef(null);\r\n\r\n if (ref.current) {\r\n ref.current.geometry = new ExtrudeBufferGeometry(shape, { steps: 1, depth: thickness, bevelEnabled: false });\r\n ref.current.updateMatrix();\r\n\r\n if (holeMeshes.length > 0) {\r\n const operationBuffer: Mesh[] = [];\r\n\r\n for (let i = 0; i < holeMeshes.length; i++) {\r\n const holeMesh = holeMeshes[i];\r\n if (i === 0) {\r\n operationBuffer.push(CSG.subtract(ref.current, holeMesh));\r\n } else {\r\n operationBuffer.push(CSG.subtract(operationBuffer[i - 1], holeMesh));\r\n }\r\n }\r\n\r\n const resultMesh = operationBuffer.pop();\r\n\r\n if (resultMesh) {\r\n ref.current.geometry = resultMesh.geometry;\r\n ref.current.updateMatrix();\r\n }\r\n }\r\n }\r\n\r\n useUpdateAfterMounted();\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nconst FlatRoof = ({\r\n id,\r\n foundationModel,\r\n roofType,\r\n roofSegments,\r\n center,\r\n thickness,\r\n lineColor,\r\n lineWidth,\r\n sideColor,\r\n color,\r\n textureType,\r\n heatmap,\r\n}: FlatRoofProps) => {\r\n const world = useStore.getState().world;\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\r\n const hourlyHeatExchangeArrayMap = useDataStore.getState().hourlyHeatExchangeArrayMap;\r\n\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowLength = useRef();\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const { transparent, opacity } = useTransparent();\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.type === ObjectType.Window && e.parentId === id),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (foundationModel && foundationModel.notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments || !segments[0]) return undefined;\r\n const vectors: Vector3[][] = [];\r\n const s = segments[0].map((v) => v.clone().sub(center));\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const s0 = s[0].clone();\r\n const s1 = s[1].clone();\r\n const s2 = s[2].clone();\r\n const v10 = new Vector3().subVectors(s1, s0);\r\n const v20 = new Vector3().subVectors(s2, s0);\r\n const v21 = new Vector3().subVectors(s2, s1);\r\n const length10 = v10.length();\r\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\r\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\r\n const m = Math.max(2, Math.floor(length10 / cellSize));\r\n const n = Math.max(2, Math.floor(distance / cellSize));\r\n v10.normalize();\r\n v20.normalize();\r\n v21.normalize();\r\n // find the normal vector of the quad\r\n const normal = new Vector3().crossVectors(v20, v21).normalize();\r\n // find the incremental vector going along the bottom edge (half of length)\r\n const dm = v10.multiplyScalar((0.5 * length10) / m);\r\n // find the incremental vector going from bottom to top (half of length)\r\n const dn = new Vector3()\r\n .crossVectors(normal, v10)\r\n .normalize()\r\n .multiplyScalar((0.5 * distance) / n);\r\n // find the starting point of the grid (shift half of length in both directions)\r\n const v0 = s0.clone().add(dm).add(dn).add(new Vector3(0, 0, thickness));\r\n // double half-length to full-length for the increment vectors in both directions\r\n dm.multiplyScalar(2);\r\n dn.multiplyScalar(2);\r\n heatFluxArrowLength.current = normal.clone().multiplyScalar(0.1);\r\n const origin = new Vector3();\r\n const vertices = new Array();\r\n for (const p of s) {\r\n vertices.push({ x: p.x, y: p.y } as Point2);\r\n }\r\n const area = Util.getPolygonArea(vertices);\r\n if (area === 0) return undefined;\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowEuler.current = new Euler(-Math.sign(intensity) * HALF_PI, 0, 0);\r\n for (let p = 0; p < m; p++) {\r\n const dmp = dm.clone().multiplyScalar(p);\r\n for (let q = 0; q < n; q++) {\r\n origin.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\r\n if (Util.isPointInside(origin.x, origin.y, vertices)) {\r\n const v: Vector3[] = [];\r\n if (intensity < 0) {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(-intensity)));\r\n } else {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(intensity)));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [showHeatFluxes, heatFluxScaleFactor]);\r\n\r\n const wireFramePoints = useMemo(() => {\r\n // this can still be triggered when the roof is deleted because all walls are removed\r\n if (roofSegments.length === 0) return [new Vector3()];\r\n const points: Vector3[] = [];\r\n if (roofType === RoofType.Gambrel) {\r\n getRoofPointsOfGambrelRoof(roofSegments, points);\r\n const maxZ = points.reduce((prev, curr) => Math.max(prev, curr.z), 0);\r\n points.forEach((p) => p.setZ(maxZ));\r\n } else {\r\n points.push(roofSegments[0].points[0]);\r\n for (const segment of roofSegments) {\r\n const rightPoint = segment.points[1];\r\n points.push(rightPoint);\r\n }\r\n }\r\n return points;\r\n }, [roofSegments, roofType]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return new Vector3(0, 0, thickness);\r\n }, [thickness]);\r\n\r\n const periphery = ;\r\n const texture = useRoofTexture(textureType);\r\n\r\n const shape = useMemo(() => {\r\n const shape = new Shape();\r\n // this can still be triggered when the roof is deleted because all walls are removed\r\n if (roofSegments.length === 0) return shape;\r\n if (roofType === RoofType.Gambrel) {\r\n drawShapeOfGambrelRoof(shape, roofSegments);\r\n } else {\r\n const startPoint = roofSegments[0].points[0];\r\n shape.moveTo(startPoint.x, startPoint.y);\r\n for (const segment of roofSegments) {\r\n const rightPoint = segment.points[1];\r\n shape.lineTo(rightPoint.x, rightPoint.y);\r\n }\r\n shape.closePath();\r\n }\r\n return shape;\r\n }, [roofSegments, center, roofType]);\r\n\r\n const shapeWithHoles = useMemo(() => {\r\n const shape = new Shape();\r\n if (roofSegments.length === 0) return shape;\r\n if (roofType === RoofType.Gambrel) {\r\n drawShapeOfGambrelRoof(shape, roofSegments);\r\n } else {\r\n const startPoint = roofSegments[0].points[0];\r\n shape.moveTo(startPoint.x, startPoint.y);\r\n for (const segment of roofSegments) {\r\n const rightPoint = segment.points[1];\r\n shape.lineTo(rightPoint.x, rightPoint.y);\r\n }\r\n shape.closePath();\r\n }\r\n\r\n if (windows.length > 0) {\r\n for (const window of windows) {\r\n const c = new Vector3(window.cx, window.cy, window.cz).sub(center);\r\n switch (window.windowType) {\r\n case WindowType.Polygonal: {\r\n const [topX, topH] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n const [hx, hy, tx] = [window.lx / 2, window.lz / 2, topX * window.lx];\r\n const hole = getPolygonWindowShape(hx, hy, tx, topH, c.x, c.y);\r\n shape.holes.push(hole);\r\n break;\r\n }\r\n case WindowType.Arched: {\r\n const hole = getArchedWindowShape(window.lx, window.lz, window.archHeight, c.x, c.y);\r\n shape.holes.push(hole);\r\n break;\r\n }\r\n default: {\r\n const hole = new Shape();\r\n const [hx, hy] = [window.lx / 2, window.lz / 2];\r\n hole.moveTo(c.x - hx, c.y - hy);\r\n hole.lineTo(c.x + hx, c.y - hy);\r\n hole.lineTo(c.x + hx, c.y + hy);\r\n hole.lineTo(c.x - hx, c.y + hy);\r\n hole.closePath();\r\n shape.holes.push(hole);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return shape;\r\n }, [roofSegments, center, windows, roofType]);\r\n\r\n const holeMeshes = useMemo(\r\n () =>\r\n windows.map((window) => {\r\n const [a, b, c] = window.rotation;\r\n const position = new Vector3(window.cx, window.cy, window.cz).sub(center);\r\n const euler = new Euler().fromArray([...window.rotation, 'ZXY']);\r\n switch (window.windowType) {\r\n case WindowType.Polygonal: {\r\n const [topX, topH] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n const [hx, hy, tx] = [window.lx / 2, window.lz / 2, topX * window.lx];\r\n const shape = getPolygonWindowShape(hx, hy, tx, topH);\r\n const holeMesh = new Mesh(\r\n new ExtrudeBufferGeometry([shape], { steps: 1, depth: window.ly, bevelEnabled: false }),\r\n );\r\n const offset = new Vector3(0, 0, -window.ly).applyEuler(euler);\r\n holeMesh.position.copy(position.clone().add(offset));\r\n holeMesh.rotation.copy(euler);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }\r\n case WindowType.Arched: {\r\n const shape = getArchedWindowShape(window.lx, window.lz, window.archHeight);\r\n const holeMesh = new Mesh(\r\n new ExtrudeBufferGeometry([shape], { steps: 1, depth: window.ly, bevelEnabled: false }),\r\n );\r\n const offset = new Vector3(0, 0, -window.ly).applyEuler(euler);\r\n holeMesh.position.copy(position.clone().add(offset));\r\n holeMesh.rotation.copy(euler);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }\r\n default: {\r\n const holeMesh = new Mesh(new BoxBufferGeometry(window.lx, window.lz, window.ly * 2));\r\n holeMesh.position.copy(position);\r\n holeMesh.rotation.set(a, b, c);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }\r\n }\r\n }),\r\n [windows, thickness],\r\n );\r\n\r\n const noTextureAndOneColor = textureType === RoofTexture.NoTexture && color && color === sideColor;\r\n const castShadow = shadowEnabled && !transparent;\r\n const showHeatmap = showSolarRadiationHeatmap && heatmap;\r\n\r\n return (\r\n <>\r\n {/*special case: the whole roof segment has no texture and only one color */}\r\n {noTextureAndOneColor && !showHeatmap ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {/* texture layer */}\r\n \r\n \r\n {showHeatmap ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {/* body */}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* wireframe */}\r\n {periphery}\r\n \r\n {periphery}\r\n {wireFramePoints.map((point, idx) => {\r\n const points = [point.clone().sub(thicknessVector), point];\r\n return ;\r\n })}\r\n \r\n\r\n {heatFluxes &&\r\n heatFluxes.map((v, index) => {\r\n return (\r\n \r\n \r\n ;\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default FlatRoof;\r\n","export default __webpack_public_path__ + \"static/media/foundation_01.bda6fc00.png\";","export default __webpack_public_path__ + \"static/media/foundation_02.a1240091.png\";","export default __webpack_public_path__ + \"static/media/foundation_03.6be5f733.png\";","export default __webpack_public_path__ + \"static/media/foundation_04.8100e8d2.png\";","export default __webpack_public_path__ + \"static/media/foundation_05.8164fdc8.png\";","export default __webpack_public_path__ + \"static/media/foundation_06.fc1babc0.png\";","export default __webpack_public_path__ + \"static/media/foundation_07.e759a1c6.png\";","export default __webpack_public_path__ + \"static/media/helvetiker_regular.typeface.9a3651b4.fnt\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { DoubleSide, FontLoader, TextGeometryParameters, Vector3 } from 'three';\r\nimport { useLoader } from '@react-three/fiber';\r\nimport { Ring } from '@react-three/drei';\r\nimport helvetikerFont from '../fonts/helvetiker_regular.typeface.fnt';\r\nimport { Util } from '../Util';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ObjectType } from '../types';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { HALF_PI } from '../constants';\r\n\r\nexport const PolarGrid = ({ element, height }: { element: ElementModel; height?: number }) => {\r\n const rotateHandle = useStore(Selector.rotateHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n const angle = useStore(Selector.selectedElementAngle);\r\n const getParent = useStore(Selector.getParent);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n\r\n const [position, setPosition] = useState();\r\n const [radius, setRadius] = useState(10);\r\n const [rotation, setRotation] = useState(0);\r\n\r\n useEffect(() => {\r\n if (rotateHandle || hoveredHandle) {\r\n const { cx, cy, lx, ly, type } = element;\r\n switch (type) {\r\n case ObjectType.SolarPanel:\r\n const currParent = getParent(element);\r\n if (currParent) {\r\n const rcx = cx * currParent.lx;\r\n const rcy = cy * currParent.ly;\r\n setPosition(new Vector3(rcx, rcy, height ?? currParent.lz));\r\n }\r\n break;\r\n case ObjectType.Foundation:\r\n setPosition(new Vector3(cx, cy, groundImage ? 0.1 : 0));\r\n break;\r\n case ObjectType.Cuboid:\r\n const { pos } = Util.getWorldDataById(element.id);\r\n const { rot } = Util.getWorldDataById(element.parentId);\r\n setPosition(new Vector3(pos.x, pos.y, pos.z - element.lz / 2 + 0.2));\r\n setRotation(rot);\r\n break;\r\n default:\r\n setPosition(new Vector3(cx, cy, groundImage ? 0.2 : 0));\r\n }\r\n setRadius(Math.max(5, Math.hypot(lx, ly) * 0.75));\r\n }\r\n }, [rotateHandle, hoveredHandle]);\r\n\r\n const font = useLoader(FontLoader, helvetikerFont);\r\n const fontSize = radius * 0.05;\r\n const textGeometryParams = {\r\n font: font,\r\n height: 0.0,\r\n size: fontSize,\r\n } as TextGeometryParameters;\r\n\r\n const tickLabels = new Array(25).fill(0);\r\n\r\n const getOffset = (i: number) => {\r\n if (i === 0) {\r\n return -fontSize * 0.3;\r\n } else if (i > 0 && i < 7) {\r\n return -fontSize * 0.8;\r\n } else {\r\n return -fontSize * 1.2;\r\n }\r\n };\r\n\r\n const color = groundImage ? '#222' : '#ccc';\r\n\r\n return (\r\n <>\r\n {position && (\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* shown angle */}\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* tick labels */}\r\n {tickLabels.map((v, i) => {\r\n let times = Math.ceil(i / 2) * (i % 2 === 0 ? 1 : -1);\r\n if (times === -12) times = 12;\r\n const offset = getOffset(Math.abs(times));\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(PolarGrid);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { Torus, Cone, Circle, Plane } from '@react-three/drei';\r\nimport { ActionType, MoveHandleType, ResizeHandleType, RotateHandleType } from '../types';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { HALF_PI, HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR } from '../constants';\r\n\r\nexport interface RotateHandleProps {\r\n id: string;\r\n position: [x: number, y: number, z: number];\r\n color?: string;\r\n ratio: number;\r\n handleType: RotateHandleType;\r\n hoverHandle: (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => void;\r\n noHoverHandle: () => void;\r\n}\r\n\r\nconst RotateHandle = ({ id, position, ratio, handleType, hoverHandle, noHoverHandle }: RotateHandleProps) => {\r\n const selectMe = useStore(Selector.selectMe);\r\n\r\n const rotateHandleType = useStore(Selector.rotateHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const color =\r\n hoveredHandle === handleType || rotateHandleType === handleType ? HIGHLIGHT_HANDLE_COLOR : RESIZE_HANDLE_COLOR;\r\n\r\n const rotationHandleLMesh = ;\r\n\r\n return (\r\n \r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Rotate);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, handleType);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(RotateHandle);\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n *\n * Not sure why I wanted wireframe to be treated differently in a previous version\n * when there is a ground image.\n */\n\nimport React from 'react';\nimport { Line } from '@react-three/drei';\n\nexport interface WireframeProps {\n hx: number;\n hy: number;\n hz: number;\n lineColor?: string;\n lineWidth?: number;\n}\n\nconst Wireframe = ({ hx, hy, hz, lineColor = 'black', lineWidth = 0.2 }: WireframeProps) => {\n return (\n \n );\n};\n\nexport default React.memo(Wireframe);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Line } from '@react-three/drei';\nimport { ElementModel } from '../models/ElementModel';\nimport { ObjectType, ResizeHandleType } from '../types';\nimport i18n from '../i18n/i18n';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\n\nexport interface HorizontalRulerProps {\n element: ElementModel;\n verticalLift: number;\n}\n\nexport const HorizontalRuler = ({ element, verticalLift }: HorizontalRulerProps) => {\n const language = useStore(Selector.language);\n const orthographic = useStore(Selector.viewState.orthographic);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const hoveredHandle = useStore(Selector.hoveredHandle);\n\n const hx = element.lx / 2;\n const hy = element.ly / 2;\n const rulerArrowOffset = 0.2;\n const rulerLineWidth = 1;\n const rulerTickMarkWidth = 0.5;\n const color = element.lineColor ?? 'white';\n const labelBackgroundColor = 'darkorchid';\n const ratio = Math.max(1, (hx + hy) / 32);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const rulerOffset = useMemo(() => {\n switch (element.type) {\n case ObjectType.Cuboid:\n return Math.max(0.5, Math.max(hx, hy) * 0.1);\n }\n return 0.5;\n }, [element.type, hx, hy]);\n\n const hz = useMemo(() => {\n switch (element.type) {\n case ObjectType.Cuboid:\n return orthographic ? element.lz / 2 + 0.1 : -element.lz / 2 + 0.1;\n case ObjectType.Foundation:\n return element.lz + 0.1;\n }\n return 0.1;\n }, [element.type, element.lz]);\n\n const ll2ul = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hy, hz]);\n\n const lr2ur = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hy, hz]);\n\n const ll2lr = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hy, hz]);\n\n const ul2ur = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hy, hz]);\n\n if (resizeHandleType) {\n if (element.type === ObjectType.Wall) {\n switch (resizeHandleType) {\n case ResizeHandleType.LowerLeft:\n return ll2lr;\n case ResizeHandleType.LowerRight:\n return ll2lr;\n }\n } else {\n switch (resizeHandleType) {\n case ResizeHandleType.LowerLeft:\n return (\n <>\n {ll2ul}\n {ll2lr}\n \n );\n case ResizeHandleType.LowerRight:\n return (\n <>\n {lr2ur}\n {ll2lr}\n \n );\n case ResizeHandleType.UpperLeft:\n return (\n <>\n {ll2ul}\n {ul2ur}\n \n );\n case ResizeHandleType.UpperRight:\n return (\n <>\n {lr2ur}\n {ul2ur}\n \n );\n }\n }\n }\n\n if (hoveredHandle) {\n if (element.type === ObjectType.Wall) {\n switch (hoveredHandle) {\n case ResizeHandleType.LowerLeft:\n return ll2lr;\n case ResizeHandleType.LowerRight:\n return ll2lr;\n }\n } else {\n switch (hoveredHandle) {\n case ResizeHandleType.LowerLeft:\n return (\n <>\n {ll2ul}\n {ll2lr}\n \n );\n case ResizeHandleType.LowerRight:\n return (\n <>\n {lr2ur}\n {ll2lr}\n \n );\n case ResizeHandleType.UpperLeft:\n return (\n <>\n {ll2ul}\n {ul2ur}\n \n );\n case ResizeHandleType.UpperRight:\n return (\n <>\n {lr2ur}\n {ul2ur}\n \n );\n }\n }\n }\n\n return <>;\n};\n\nexport default React.memo(HorizontalRuler);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\n// in kW/m^2, see http://en.wikipedia.org/wiki/Solar_constant\nexport const SOLAR_CONSTANT = 1.361;\n\n// in m/s^2\nexport const GRAVITATIONAL_ACCELERATION = 9.8067;\n\n// in J/(kg*K) https://www.engineeringtoolbox.com/air-specific-heat-capacity-d_705.html\nexport const AIR_ISOBARIC_SPECIFIC_HEAT = 1012;\n\n// in kg/m^3 (at 101.325 kPa and 15 °C)\nexport const AIR_DENSITY = 1.225;\n\n// 0 °C in K\nexport const KELVIN_AT_ZERO_CELSIUS = 273.15;\n\n// in W/(m^2*K^4) Stefan–Boltzmann constant\nexport const STEFAN_BOLTZMANN_CONSTANT = 5.67e-8;\n\n// original ASHRAE_C = [0.058, 0.060, 0.071, 0.097, 0.121, 0.134, 0.136, 0.122, 0.092, 0.073, 0.063, 0.057];\n// http://www.physics.arizona.edu/~cronin/Solar/References/Irradiance%20Models%20and%20Data/WOC01.pdf\n// revised C coefficients found from Iqbal's book\nexport const ASHRAE_C = [0.103, 0.104, 0.109, 0.12, 0.13, 0.137, 0.138, 0.134, 0.121, 0.111, 0.106, 0.103];\n\nexport enum AirMass {\n NONE = 0,\n KASTEN_YOUNG = 1,\n SPHERE_MODEL = 2,\n}\n\nexport const MINUTES_OF_DAY = 1440;\n\n// the daily cycle is 1440 minutes\nexport const OMEGA_DAY = Math.PI / 720;\n\n// the annual cycle is 365 days\nexport const OMEGA_YEAR = Math.PI / 182.5;\n\nexport const YEARLY_LAG_IN_DAYS = 30;\n\nexport const DAILY_LAG_IN_MINUTES = 120;\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { DoorTexture } from 'src/types';\nimport { ElementModel } from './ElementModel';\n\nexport interface DoorModel extends ElementModel {\n uValue: number;\n volumetricHeatCapacity: number;\n textureType: DoorTexture;\n doorType: DoorType;\n\n archHeight: number;\n filled: boolean;\n opacity?: number;\n frameColor?: string;\n\n // Is this door inside a building? If yes, this will be no heat exchange. By default, it is not.\n interior?: boolean;\n}\n\nexport enum DoorType {\n Default = 'Default',\n Arched = 'Arched',\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nexport class SunMinutes {\n sunrise: number; // sunrise time in minutes from midnight\n sunset: number; // sunset time in minutes from midnight\n\n constructor(sunrise: number, sunset: number) {\n this.sunrise = sunrise;\n this.sunset = sunset;\n }\n\n daylight() {\n return this.sunset - this.sunrise;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Vector3 } from 'three';\nimport { Util } from '../Util';\nimport { AirMass, ASHRAE_C, SOLAR_CONSTANT } from './analysisConstants';\nimport { GroundModel } from '../models/GroundModel';\nimport { TWO_PI, UNIT_VECTOR_POS_Z } from '../constants';\nimport { SunMinutes } from './SunMinutes';\n\n// An object receives no indirect solar radiation if its distance to the nearest object\n// in the light path is shorter than this threshold.\nexport const AMBIENT_LIGHT_THRESHOLD = 0.5;\n\n// This is used to offset a roof by default in solar radiation calculation\nexport const ROOFTOP_SOLAR_PANEL_OFFSET = 0.1;\n\nexport const TILT_ANGLE = (23.45 / 180.0) * Math.PI;\n\nconst DAY_MILLISECONDS = 1000 * 60 * 60 * 24;\nconst HALF_DAY_MINUTES = 720;\n\nexport const computeDeclinationAngle = (date: Date) => {\n const days = Math.floor((date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / DAY_MILLISECONDS);\n return TILT_ANGLE * Math.sin((TWO_PI * (284 + days)) / 365.25);\n};\n\n// https://en.wikipedia.org/wiki/Sunrise_equation\n// from sunrise to noon and from noon to sunset have the same minutes\nexport const computeSunriseAndSunsetInMinutes = (date: Date, latitude: number) => {\n const a = Math.tan(Util.toRadians(latitude)) * Math.tan(computeDeclinationAngle(date));\n if (Math.abs(a) > 1) {\n return new SunMinutes(0, a > 0 ? HALF_DAY_MINUTES * 2 : 0);\n }\n const b = (60 * Math.acos(-a)) / Util.toRadians(15);\n return new SunMinutes(HALF_DAY_MINUTES - b, HALF_DAY_MINUTES + b);\n};\n\nexport const computeHourAngle = (date: Date) => {\n const minutes = date.getHours() * 60 + date.getMinutes() - HALF_DAY_MINUTES;\n return (minutes / HALF_DAY_MINUTES) * Math.PI;\n};\n\nexport const computeHourAngleAtMinute = (minutes: number) => {\n return (minutes / HALF_DAY_MINUTES - 1) * Math.PI;\n};\n\nexport const getSunDirection = (date: Date, latitude: number) => {\n return computeSunLocation(\n 1,\n computeHourAngle(date),\n computeDeclinationAngle(date),\n Util.toRadians(latitude),\n ).normalize();\n};\n\nexport const computeSunLocation = (radius: number, hourAngle: number, declinationAngle: number, latitude: number) => {\n const cosDec = Math.cos(declinationAngle);\n const sinDec = Math.sin(declinationAngle);\n const cosLat = Math.cos(latitude);\n const sinLat = Math.sin(latitude);\n const cosHou = Math.cos(hourAngle);\n const sinHou = Math.sin(hourAngle);\n const altitudeAngle = Math.asin(sinDec * sinLat + cosDec * cosHou * cosLat);\n const xAzm = sinHou * cosDec;\n const yAzm = cosLat * sinDec - cosHou * cosDec * sinLat;\n const azimuthAngle = Math.atan2(yAzm, xAzm);\n const coords = new Vector3(radius, azimuthAngle, altitudeAngle);\n Util.sphericalToCartesianZ(coords);\n // reverse the x so that sun moves from east to west\n coords.x = -coords.x;\n return coords;\n};\n\n// Solar radiation incident outside the earth's atmosphere is called extraterrestrial radiation, in kW/m^2.\n// https://pvpmc.sandia.gov/modeling-steps/1-weather-design-inputs/irradiance-and-insolation-2/extraterrestrial-radiation/\nconst getExtraterrestrialRadiation = (dayOfYear: number) => {\n const b = (TWO_PI * dayOfYear) / 365;\n const er =\n 1.00011 + 0.034221 * Math.cos(b) + 0.00128 * Math.sin(b) + 0.000719 * Math.cos(2 * b) + 0.000077 * Math.sin(2 * b);\n return SOLAR_CONSTANT * er;\n};\n\n// air mass calculation from http://en.wikipedia.org/wiki/Air_mass_(solar_energy)#At_higher_altitudes\nconst computeAirMass = (airMassType: AirMass, sunDirection: Vector3, altitude: number) => {\n let zenithAngle;\n switch (airMassType) {\n case AirMass.NONE:\n return 1;\n case AirMass.KASTEN_YOUNG:\n zenithAngle = sunDirection.angleTo(UNIT_VECTOR_POS_Z);\n return 1 / (Math.cos(zenithAngle) + 0.50572 * Math.pow(96.07995 - (zenithAngle / Math.PI) * 180, -1.6364));\n default:\n zenithAngle = sunDirection.angleTo(UNIT_VECTOR_POS_Z);\n const cos = Math.cos(zenithAngle);\n const r = 708;\n const c = altitude / 9000;\n return Math.sqrt((r + c) * (r + c) * cos * cos + (2 * r + 1 + c) * (1 - c)) - (r + c) * cos;\n }\n};\n\n// Reused peak solar radiation value. Must be called once and only once before\n// calling calculateDirectRadiation and calculateDiffusionAndReflection, the unit is in kW/m^2\nexport const calculatePeakRadiation = (\n sunDirection: Vector3,\n dayOfYear: number,\n altitude: number,\n airMassType: AirMass,\n) => {\n // don't use the 1.1 factor as we consider diffuse radiation in the ASHRAE model\n return (\n getExtraterrestrialRadiation(dayOfYear) *\n Math.pow(0.7, Math.pow(computeAirMass(airMassType, sunDirection, altitude), 0.678))\n );\n};\n\n// see: http://www.physics.arizona.edu/~cronin/Solar/References/Irradiance%20Models%20and%20Data/WOC01.pdf\nexport const calculateDiffuseAndReflectedRadiation = (\n ground: GroundModel,\n month: number,\n normal: Vector3,\n peakRadiation: number,\n) => {\n let result = 0;\n const cos = normal.dot(UNIT_VECTOR_POS_Z);\n const viewFactorWithSky = 0.5 * (1 + cos);\n if (viewFactorWithSky > 0) {\n // diffuse irradiance from the sky\n result += ASHRAE_C[month] * viewFactorWithSky * peakRadiation;\n }\n // if a surface faces down, it should receive ground reflection as well\n const viewFactorWithGround = 0.5 * Math.abs(1 - cos);\n if (!Util.isZero(viewFactorWithGround)) {\n // short-wave reflection from the ground\n result += ground.albedo * viewFactorWithGround * peakRadiation;\n }\n return result;\n};\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Circle, Cone, Cylinder, Line } from '@react-three/drei';\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Group, Vector3 } from 'three';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { HALF_PI, TWO_PI } from '../constants';\nimport { LineData } from './LineData';\nimport { getSunDirection } from '../analysis/sunTools';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { useFrame } from '@react-three/fiber';\nimport { Line2 } from 'three/examples/jsm/lines/Line2';\nimport { Util } from '../Util';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst SolarUpdraftTower = ({ foundation }: { foundation: FoundationModel }) => {\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const animate = usePrimitiveStore(Selector.animateSun);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const simulationPaused = usePrimitiveStore(Selector.simulationPaused);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const streamlinesRef = useRef();\n\n const { lx, ly, lz, solarUpdraftTower } = foundation;\n\n const arrowRadius = (solarUpdraftTower?.collectorRadius ?? 100) * 0.016;\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n\n const streamlines = useMemo(() => {\n const array: LineData[] = [];\n const airInletZ = ((solarUpdraftTower?.collectorHeight ?? Math.max(3, 10 * lz)) + lz) / 2;\n const airOutletZ = solarUpdraftTower?.chimneyHeight ?? Math.max(lx, ly);\n const collectorRadius = solarUpdraftTower?.collectorRadius ?? Math.min(lx, ly) / 2;\n const chimneyRadius = solarUpdraftTower?.chimneyRadius ?? Math.max(1, 0.025 * Math.min(lx, ly));\n const airInletR1 = collectorRadius * 1.15;\n const airInletR2 = chimneyRadius * 0.5;\n const airOutletR1 = chimneyRadius;\n const airOutletR2 = chimneyRadius * 2;\n const airOutletR3 = chimneyRadius * 4;\n const n = 6;\n for (let i = 0; i < n; i++) {\n const angle = (TWO_PI / n) * i;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const line: Vector3[] = [];\n line.push(new Vector3(airInletR1 * cos, airInletR1 * sin, airInletZ));\n line.push(new Vector3(airInletR2 * cos, airInletR2 * sin, airInletZ));\n line.push(new Vector3(airInletR2 * cos, airInletR2 * sin, airOutletZ));\n line.push(new Vector3(airOutletR1 * cos, airOutletR1 * sin, airOutletZ * 1.02));\n line.push(new Vector3(airOutletR2 * cos, airOutletR2 * sin, airOutletZ * 1.04));\n line.push(new Vector3(airOutletR3 * cos, airOutletR3 * sin, airOutletZ * 1.06));\n array.push({ points: line } as LineData);\n }\n return array;\n }, [\n lx,\n ly,\n lz,\n solarUpdraftTower?.collectorRadius,\n solarUpdraftTower?.collectorHeight,\n solarUpdraftTower?.chimneyRadius,\n solarUpdraftTower?.chimneyHeight,\n ]);\n\n const gridLines = useMemo(() => {\n const array: LineData[] = [];\n const h = (solarUpdraftTower?.collectorHeight ?? Math.max(3, 10 * lz)) + lz;\n const r = solarUpdraftTower?.collectorRadius ?? Math.min(lx, ly) / 2;\n const n = 25;\n const delta = (2 * r) / n;\n for (let i = 0; i <= n; i++) {\n const line: Vector3[] = [];\n const y = -r + i * delta;\n const x = Math.sqrt(r * r - y * y);\n line.push(new Vector3(-x, y, h));\n line.push(new Vector3(x, y, h));\n array.push({ points: line } as LineData);\n }\n for (let i = 0; i <= n; i++) {\n const line: Vector3[] = [];\n const x = -r + i * delta;\n const y = Math.sqrt(r * r - x * x);\n line.push(new Vector3(x, -y, h));\n line.push(new Vector3(x, y, h));\n array.push({ points: line } as LineData);\n }\n return array;\n }, [lx, ly, lz, solarUpdraftTower?.collectorRadius, solarUpdraftTower?.collectorHeight]);\n\n useEffect(() => {\n if (foundation && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(foundation.id + '-sut');\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useFrame((state, delta) => {\n if ((animate || (simulationInProgress && !simulationPaused)) && sunDirection.z > 0) {\n if (streamlinesRef.current) {\n streamlinesRef.current.children.forEach((child) => {\n if (child.name === 'Streamlines') {\n const line = child as Line2;\n line.material.uniforms.dashOffset.value -= delta * arrowRadius * 10;\n }\n });\n }\n }\n });\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n \n \n \n {gridLines &&\n gridLines.map((lineData, index) => {\n return (\n \n );\n })}\n {sunDirection.z > 0 && streamlines && (\n \n {streamlines.map((lineData, index) => {\n const x2 = lineData.points[0].x + lineData.points[1].x;\n const y2 = lineData.points[0].y + lineData.points[1].y;\n const angle = new Euler(0, 0, (TWO_PI * index) / streamlines.length + HALF_PI);\n const dashSize = arrowRadius;\n const gapSize = arrowRadius;\n return (\n \n \n \n \n \n \n \n \n \n );\n })}\n \n )}\n \n );\n};\n\nexport default React.memo(SolarUpdraftTower);\n","export default __webpack_public_path__ + \"static/media/glow.def60647.png\";","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Cylinder, useTexture } from '@react-three/drei';\nimport { AdditiveBlending } from 'three';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { HALF_PI } from '../constants';\nimport GlowImage from '../resources/glow.png';\nimport { getSunDirection } from '../analysis/sunTools';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\n\nconst SolarPowerTower = ({ foundation }: { foundation: FoundationModel }) => {\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n\n const glowTexture = useTexture(GlowImage);\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n\n const { lz, solarPowerTower } = foundation;\n\n const towerRadius = solarPowerTower?.towerRadius ?? 1;\n const towerHeight = solarPowerTower?.towerHeight ?? 20;\n const receiverHeight = towerHeight / 10;\n const receiverRadius = towerRadius * 1.5;\n const haloSize = Math.max(receiverHeight, receiverRadius) * 2.4;\n\n return (\n \n \n \n \n \n \n \n {/* simple glow effect to create a halo */}\n {sunDirection.z > 0 && (\n \n \n \n \n \n )}\n \n );\n};\n\nexport default React.memo(SolarPowerTower);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Cylinder } from '@react-three/drei';\nimport { DoubleSide, Vector3 } from 'three';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { HALF_PI } from '../constants';\n\nconst SolarReceiverPipe = ({ foundation }: { foundation: FoundationModel }) => {\n const { ly, lz, solarAbsorberPipe } = foundation;\n\n const absorberHeight = solarAbsorberPipe?.absorberHeight ?? 10;\n const apertureWidth = solarAbsorberPipe?.apertureWidth ?? 0.6;\n const relativeLength = solarAbsorberPipe?.relativeLength ?? 0.9;\n const poleNumber = solarAbsorberPipe?.poleNumber ?? 5;\n\n const solarReceiverPipePoles = useMemo(() => {\n const array: Vector3[] = [];\n const dy = (relativeLength * ly) / (poleNumber + 1);\n for (let i = 1; i <= poleNumber; i++) {\n array.push(new Vector3(0, i * dy - (relativeLength * ly) / 2, absorberHeight / 2 + lz / 2));\n }\n return array;\n }, [ly, lz, poleNumber, absorberHeight, relativeLength]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n {/* draw poles */}\n {solarReceiverPipePoles &&\n solarReceiverPipePoles.map((p, i) => {\n return (\n \n \n \n );\n })}\n \n );\n};\n\nexport default React.memo(SolarReceiverPipe);\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { CommonStoreState } from './common';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from 'src/types';\r\n\r\nexport class InnerCommonStoreState {\r\n static selectMe(state: CommonStoreState, id: string, e: ThreeEvent, action?: ActionType) {\r\n if (e.intersections.length > 0) {\r\n const intersectableObjects = e.intersections.filter(\r\n (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\r\n );\r\n if (intersectableObjects[0].object === e.eventObject) {\r\n for (const elem of state.elements) {\r\n if (elem.id === id) {\r\n elem.selected = true;\r\n state.selectedElement = elem;\r\n // TODO: lz is now zero for roof. So this may need to be set from elsewhere for roofs.\r\n state.selectedElementHeight = elem.lz;\r\n } else {\r\n elem.selected = false;\r\n }\r\n }\r\n\r\n if (!state.selectedElement) return;\r\n\r\n if (action === ActionType.ContextMenu) {\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.rotateHandleType = null;\r\n if (action) {\r\n switch (action) {\r\n case ActionType.Move:\r\n if (state.selectedElement?.type === ObjectType.Tree || state.selectedElement?.type === ObjectType.Human) {\r\n // selecting the above two types of object automatically sets them to the moving state\r\n state.moveHandleType = MoveHandleType.Default;\r\n } else {\r\n state.moveHandleType = e.eventObject.name as MoveHandleType;\r\n }\r\n break;\r\n case ActionType.Resize:\r\n state.resizeHandleType = e.eventObject.name as ResizeHandleType;\r\n break;\r\n case ActionType.Rotate:\r\n state.rotateHandleType = e.eventObject.name as RotateHandleType;\r\n break;\r\n case ActionType.Select:\r\n state.selectedElementAngle = e.object.parent?.rotation.z ?? 0;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n static selectNone(state: CommonStoreState) {\r\n state.selectedElementIdSet.clear();\r\n for (const e of state.elements) {\r\n e.selected = false;\r\n }\r\n state.selectedElement = null;\r\n state.selectedElementIdSet.clear();\r\n }\r\n\r\n static clearThenAddSelectedElementIdSet(state: CommonStoreState, id: string) {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n}\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { useEffect, useMemo, useState } from 'react';\nimport {\n GAP_PERCENT,\n MARGIN_PERCENT,\n RESOLUTION,\n SOLAR_PANEL_CELL_COLOR_BLACK,\n SOLAR_PANEL_CELL_COLOR_BLUE,\n} from 'src/constants';\nimport { PvModel } from 'src/models/PvModel';\nimport { useStore } from 'src/stores/common';\nimport { Orientation } from 'src/types';\nimport { Util } from 'src/Util';\nimport { CanvasTexture, RepeatWrapping } from 'three';\nimport * as Selector from '../../stores/selector';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nexport const useSolarPanelHeatmapTexture = (id: string) => {\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n\n useEffect(() => {\n if (showSolarRadiationHeatmap) {\n const heatmap = useDataStore.getState().getHeatmap(id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n return heatmapTexture;\n};\n\nexport const useSolarPanelTexture = (\n lx: number,\n ly: number,\n pvModel: PvModel,\n orientation: Orientation,\n customizedFrameColor: string | undefined,\n customizedBacksheetColor: string | undefined,\n) => {\n const frameColor =\n customizedFrameColor ??\n (pvModel?.color === 'Black' && pvModel?.cellType === 'Monocrystalline' ? 'silver' : 'white');\n const backsheetColor = customizedBacksheetColor ?? 'gray';\n\n const canvasTexture = useMemo(() => {\n if (!pvModel) return null;\n const { cellType, length, width, m, n, color } = pvModel;\n if (orientation === Orientation.portrait) {\n return drawSolarPanelCanvasTexture(cellType, width, length, n, m, color, frameColor, backsheetColor);\n } else {\n return drawSolarPanelCanvasTexture(cellType, length, width, m, n, color, frameColor, backsheetColor);\n }\n }, [pvModel, orientation, frameColor, backsheetColor]);\n\n const [texture, setTexture] = useState(canvasTexture);\n\n useEffect(() => {\n if (canvasTexture && pvModel) {\n const { length, width } = pvModel;\n const nx = Math.max(1, Math.round(lx / (orientation === Orientation.landscape ? length : width)));\n const ny = Math.max(1, Math.round(ly / (orientation === Orientation.landscape ? width : length)));\n canvasTexture.repeat.set(nx, ny);\n canvasTexture.wrapS = canvasTexture.wrapT = RepeatWrapping;\n setTexture(canvasTexture.clone());\n }\n }, [canvasTexture, lx, ly]);\n\n return texture;\n};\n\nconst drawSolarPanelCanvasTexture = (\n cellType: string,\n length: number, // x\n width: number, // y\n m: number,\n n: number,\n color: string,\n frameColor: string,\n backsheetColor: string,\n) => {\n length *= RESOLUTION;\n width *= RESOLUTION;\n\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\n [canvas.width, canvas.height] = [length, width];\n\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.fillStyle = frameColor;\n ctx.fillRect(0, 0, length, width);\n\n const margin = Math.max(length, width) * MARGIN_PERCENT;\n ctx.fillStyle = backsheetColor;\n ctx.fillRect(margin, margin, length - 2 * margin, width - 2 * margin);\n\n // cell color\n ctx.fillStyle = color === 'Black' ? SOLAR_PANEL_CELL_COLOR_BLACK : SOLAR_PANEL_CELL_COLOR_BLUE;\n\n if (cellType === 'Thin Film') {\n const padding = margin * 0.6;\n ctx.fillRect(padding, padding, length - padding * 2, width - padding * 2);\n } else {\n const gap = Math.max(length, width) * GAP_PERCENT;\n const padding = margin + gap;\n const cellSizeX = (length - padding * 2 - gap * (m - 1)) / m;\n const cellSizeY = (width - padding * 2 - gap * (n - 1)) / n;\n const offsetX = cellSizeX * 0.1;\n const offsetY = cellSizeY * 0.1;\n if (cellType === 'Monocrystalline') {\n for (let i = 0; i < n; i++) {\n const y = padding + (cellSizeY + gap) * i;\n for (let j = 0; j < m; j++) {\n const x = padding + (cellSizeX + gap) * j;\n ctx.beginPath();\n ctx.moveTo(x, y + offsetY);\n ctx.lineTo(x, y + cellSizeY - offsetY);\n ctx.lineTo(x + offsetX, y + cellSizeY);\n ctx.lineTo(x + cellSizeX - offsetX, y + cellSizeY);\n ctx.lineTo(x + cellSizeX, y + cellSizeY - offsetY);\n ctx.lineTo(x + cellSizeX, y + offsetY);\n ctx.lineTo(x + cellSizeX - offsetX, y);\n ctx.lineTo(x + offsetX, y);\n ctx.closePath();\n ctx.fill();\n }\n }\n } else if (cellType === 'Polycrystalline') {\n for (let i = 0; i < n; i++) {\n const y = padding + (cellSizeY + gap) * i;\n for (let j = 0; j < m; j++) {\n const x = padding + (cellSizeX + gap) * j;\n ctx.fillRect(x, y, cellSizeX, cellSizeY);\n }\n }\n }\n }\n }\n\n return new CanvasTexture(canvas);\n};\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Circle, Cone, Cylinder, Line, Plane, Ring, Sphere, Torus } from '@react-three/drei';\r\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n ORIGIN_VECTOR2,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n SOLAR_PANEL_BLACK_SPECULAR,\r\n SOLAR_PANEL_BLUE_SPECULAR,\r\n TWO_PI,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, Orientation, ResizeHandleType, RotateHandleType } from '../../types';\r\nimport { Util } from '../../Util';\r\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\r\nimport { LineData } from '../LineData';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { spBoundaryCheck, spCollisionCheck } from '../roof/roofRenderer';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UnoableResizeSolarPanelOnRoof } from 'src/undo/UndoableResize';\r\nimport { getSunDirection, ROOFTOP_SOLAR_PANEL_OFFSET } from 'src/analysis/sunTools';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { RoofUtil } from '../roof/RoofUtil';\r\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { PvModel } from 'src/models/PvModel';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface MoveHandleProps {\r\n id: string;\r\n parentId: string;\r\n foundationId?: string;\r\n handleSize: number;\r\n}\r\n\r\ninterface ResizeHandleProps {\r\n pos: number[]; // x, y, z\r\n dms: number[]; // lz, handleSize\r\n handleType: ResizeHandleType;\r\n initPointerDown: () => void;\r\n}\r\n\r\ninterface RotateHandleProps {\r\n position: [x: number, y: number, z: number];\r\n ratio: number;\r\n handleType: RotateHandleType;\r\n initPointerDown: () => void;\r\n}\r\n\r\ninterface TiltHandleProps {\r\n rotationZ: number;\r\n tiltAngle: number;\r\n handleSize: number;\r\n initPointerDown: () => void;\r\n handlePointerMove: (e: ThreeEvent, tiltHandleRef: React.MutableRefObject) => void;\r\n handlePointerUp: () => void;\r\n}\r\n\r\ninterface SunbeamProps {\r\n drawSunbeam: boolean;\r\n rotation: number[];\r\n normal: number[];\r\n relativeEuler: Euler;\r\n fRotation: number;\r\n}\r\n\r\ninterface LabelProps {\r\n id: string;\r\n}\r\n\r\nconst MoveHandle = ({ id, parentId, foundationId, handleSize }: MoveHandleProps) => {\r\n const domElement = useThree().gl.domElement;\r\n\r\n return (\r\n {\r\n domElement.style.cursor = 'move';\r\n }}\r\n onPointerOut={() => {\r\n domElement.style.cursor = 'default';\r\n }}\r\n onPointerDown={(e) => {\r\n useStore.getState().selectMe(id, e, ActionType.Move);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst ResizeHandle = ({ pos, dms, handleType, initPointerDown }: ResizeHandleProps) => {\r\n const [cx, cy, cz] = pos;\r\n const [lz, handleSize] = dms;\r\n const domElement = useThree().gl.domElement;\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const ref = useRef(null);\r\n\r\n const handlePointerDown = () => {\r\n initPointerDown();\r\n const vector = new Vector3();\r\n switch (handleType) {\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n vector.set(-cx * 2, 0, -cz);\r\n break;\r\n case ResizeHandleType.Upper:\r\n case ResizeHandleType.Lower:\r\n vector.set(0, -cy * 2, -cz);\r\n break;\r\n }\r\n useStore.getState().set((state) => {\r\n if (ref.current) {\r\n state.resizeAnchor = ref.current.localToWorld(vector);\r\n state.resizeHandleType = handleType;\r\n }\r\n });\r\n };\r\n\r\n return (\r\n {\r\n domElement.style.cursor = 'pointer';\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n }}\r\n onPointerOut={() => {\r\n domElement.style.cursor = 'default';\r\n setColor(RESIZE_HANDLE_COLOR);\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst RotateHandle = ({ position, ratio, handleType, initPointerDown }: RotateHandleProps) => {\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const domElement = useThree().gl.domElement;\r\n const rotationHandleLMesh = useMemo(() => , [color]);\r\n\r\n const handlePointerDown = () => {\r\n initPointerDown();\r\n useStore.getState().set((state) => {\r\n state.rotateHandleType = handleType;\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {\r\n domElement.style.cursor = 'grab';\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n }}\r\n onPointerOut={() => {\r\n domElement.style.cursor = 'default';\r\n setColor(RESIZE_HANDLE_COLOR);\r\n }}\r\n />\r\n \r\n );\r\n};\r\n\r\nconst TiltHandle = ({\r\n rotationZ,\r\n tiltAngle,\r\n handleSize,\r\n initPointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n}: TiltHandleProps) => {\r\n const { gl } = useThree();\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const [showTiltAngle, setShowTiltAngle] = useState(false);\r\n const tiltHandleRef = useRef();\r\n const degree = useMemo(() => new Array(13).fill(0), []);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n return (\r\n <>\r\n {/* ring handles */}\r\n {\r\n gl.domElement.style.cursor = 'grab';\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n }}\r\n onPointerOut={() => {\r\n gl.domElement.style.cursor = 'default';\r\n setColor(RESIZE_HANDLE_COLOR);\r\n }}\r\n onPointerDown={(e) => {\r\n initPointerDown();\r\n e.stopPropagation();\r\n setShowTiltAngle(true);\r\n setCommonStore((state) => {\r\n state.rotateHandleType = RotateHandleType.Tilt;\r\n });\r\n }}\r\n >\r\n \r\n \r\n {showTiltAngle && (\r\n <>\r\n {/* intersection plane */}\r\n {}}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, tiltHandleRef);\r\n }}\r\n onPointerUp={() => {\r\n setShowTiltAngle(false);\r\n handlePointerUp();\r\n }}\r\n >\r\n \r\n \r\n {/* pointer */}\r\n \r\n {/* scale */}\r\n {degree.map((e, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {/* show current degree */}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst Sunbeam = React.memo(({ drawSunbeam, rotation, normal, relativeEuler, fRotation }: SunbeamProps) => {\r\n const euler = new Euler().fromArray([...rotation, 'ZXY']);\r\n\r\n const normalVector = useMemo(() => {\r\n if (rotation[0] === 0) {\r\n return new Vector3()\r\n .fromArray(normal)\r\n .applyEuler(new Euler(relativeEuler.x, relativeEuler.y, relativeEuler.z + rotation[2] + fRotation, 'ZXY'));\r\n }\r\n return new Vector3(0, 0, 1).applyEuler(euler).applyEuler(new Euler(0, 0, fRotation));\r\n }, [rotation, relativeEuler, fRotation]);\r\n\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n\r\n return (\r\n <>\r\n {drawSunbeam && sunDirection.z > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n\r\nconst Label = ({ id }: LabelProps) => {\r\n useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const language = useStore(Selector.language);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const sp = useMemo(() => getElementById(id) as SolarPanelModel, [id]);\r\n\r\n if (!sp || !sp.foundationId) {\r\n return null;\r\n }\r\n\r\n const foundation = getElementById(sp.foundationId) as FoundationModel;\r\n\r\n if (!foundation) {\r\n return null;\r\n }\r\n\r\n const fCenter = new Vector3(foundation.cx, foundation.cy, foundation.cz);\r\n\r\n const center = new Vector3(\r\n sp.cx * foundation.lx,\r\n sp.cy * foundation.ly,\r\n foundation.lz / 2 + sp.cz + sp.lz / 2 + sp.poleHeight,\r\n )\r\n .applyEuler(new Euler(0, 0, foundation.rotation[2]))\r\n .add(fCenter);\r\n\r\n const labelText =\r\n (sp?.label ?? i18n.t('shared.SolarPanelElement', lang)) +\r\n (sp?.locked ? ` ( + ${i18n.t('shared.ElementLocked', lang)} + )` : '') +\r\n (sp?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n center.x.toFixed(1) +\r\n ', ' +\r\n center.y.toFixed(1) +\r\n ', ' +\r\n center.z.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang));\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst SolarPanelOnRoof = ({\r\n id,\r\n pvModelName = 'SPR-X21-335-BLK',\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n tiltAngle,\r\n relativeAzimuth,\r\n poleHeight,\r\n poleRadius,\r\n poleSpacing,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = 'white',\r\n frameColor,\r\n backsheetColor,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n foundationId,\r\n foundationModel,\r\n orientation = Orientation.portrait,\r\n}: SolarPanelModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const selectMe = useStore(Selector.selectMe);\r\n const getElementById = useStore(Selector.getElementById);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const pvModules = useStore(Selector.pvModules);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n\r\n const selected = useSelected(id);\r\n\r\n const latestFoundationRef = useRef(null);\r\n\r\n const pvModel = pvModules[pvModelName] as PvModel;\r\n if (pvModel) {\r\n lz = Math.max(pvModel.thickness, 0.02);\r\n }\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const radialSegmentsPole = useStore.getState().elements.length < 100 ? 4 : 2;\r\n const poleZ = -poleHeight / 2 - lz / 2;\r\n\r\n const [drawPole, setDrawPole] = useState(rotation[0] === 0);\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [hovered, setHovered] = useState(false);\r\n const { gl, camera } = useThree();\r\n\r\n const baseRef = useRef();\r\n const solarPanelLinesRef = useRef();\r\n const intersectionPlaneRef = useRef(null);\r\n const pointerDownRef = useRef(false);\r\n\r\n const oldPosRef = useRef(null);\r\n const oldDmsRef = useRef(null);\r\n const oldAziRef = useRef(null);\r\n const oldTiltRef = useRef(null);\r\n const oldRotRef = useRef(null);\r\n const oldNorRef = useRef(null);\r\n\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const position = useMemo(() => {\r\n if (drawPole) {\r\n return new Vector3(cx, cy, cz + hz + poleHeight);\r\n }\r\n return new Vector3(cx, cy, cz + lz / 2 + 0.02); // raise it by 2cm to show\r\n }, [cx, cy, cz, hz, drawPole, poleHeight, sceneRadius]);\r\n\r\n const euler = useMemo(() => {\r\n return new Euler().fromArray([...rotation, 'ZXY']);\r\n }, [rotation]);\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (drawPole) {\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }\r\n return new Euler();\r\n }, [tiltAngle, relativeAzimuth, drawPole]);\r\n\r\n const poles = useMemo(() => {\r\n const poleArray: Vector3[] = [];\r\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\r\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\r\n const sinTilt = 0.5 * Math.sin(tiltAngle);\r\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\r\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\r\n for (let ix = -poleNx; ix <= poleNx; ix++) {\r\n for (let iy = -poleNy; iy <= poleNy; iy++) {\r\n const xi = ix * cosAz - iy * sinAz;\r\n const yi = ix * sinAz + iy * cosAz;\r\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\r\n }\r\n }\r\n return poleArray;\r\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleHeight, lz]);\r\n\r\n useEffect(() => {\r\n setDrawPole(rotation[0] === 0);\r\n }, [rotation]);\r\n\r\n useEffect(() => {\r\n if (pvModel) {\r\n let mx, my;\r\n if (orientation === Orientation.portrait) {\r\n mx = Math.max(1, Math.round(lx / pvModel.width));\r\n my = Math.max(1, Math.round(ly / pvModel.length));\r\n } else {\r\n mx = Math.max(1, Math.round(lx / pvModel.length));\r\n my = Math.max(1, Math.round(ly / pvModel.width));\r\n }\r\n solarPanelLinesRef.current = [];\r\n const dx = lx / mx;\r\n const dy = ly / my;\r\n for (let i = 0; i <= mx; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\r\n } as LineData);\r\n }\r\n for (let i = 0; i <= my; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\r\n } as LineData);\r\n }\r\n }\r\n }, [orientation, pvModelName, lx, ly, lz]);\r\n\r\n const undoOperation = () => {\r\n setCommonStore((state) => {\r\n if (\r\n oldPosRef.current &&\r\n oldAziRef.current !== null &&\r\n oldNorRef.current &&\r\n oldDmsRef.current &&\r\n oldRotRef.current\r\n ) {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n [e.cx, e.cy, e.cz] = [...oldPosRef.current];\r\n [e.lx, e.ly, e.lz] = [...oldDmsRef.current];\r\n (e as SolarPanelModel).relativeAzimuth = oldAziRef.current;\r\n e.normal = [...oldNorRef.current];\r\n e.rotation = [...oldRotRef.current];\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handlePointerUp = () => {\r\n if (pointerDownRef.current) {\r\n const roof = getElementById(parentId) as RoofModel;\r\n if (roof && foundationId) {\r\n const sp = getElementById(id) as SolarPanelModel;\r\n const foundation = latestFoundationRef.current;\r\n\r\n if (sp && foundation) {\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(roof);\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(sp, foundation);\r\n if (\r\n !spBoundaryCheck(solarPanelVertices, boundaryVertices) ||\r\n !spCollisionCheck(sp, foundation, solarPanelVertices)\r\n ) {\r\n undoOperation();\r\n } else {\r\n AddUndoableOperation(sp);\r\n }\r\n }\r\n }\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDownRef.current = false;\r\n setShowIntersectionPlane(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.rotateHandleType = null;\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n latestFoundationRef.current = null;\r\n }\r\n };\r\n\r\n // add pointerup event listener\r\n // useEffect(() => {\r\n // window.addEventListener('pointerup', handlePointerUp);\r\n // return () => {\r\n // window.removeEventListener('pointerup', handlePointerUp);\r\n // };\r\n // }, []);\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const tiltHandleSize = (baseSize * 2) / 3;\r\n\r\n const initPointerDown = () => {\r\n const latestFoundation = useStore\r\n .getState()\r\n .elements.find((e) => e.id === foundationId && e.type === ObjectType.Foundation) as FoundationModel;\r\n if (latestFoundation) {\r\n oldPosRef.current = [cx / latestFoundation.lx, cy / latestFoundation.ly, cz - latestFoundation.lz / 2];\r\n oldDmsRef.current = [lx, ly, lz];\r\n oldAziRef.current = relativeAzimuth;\r\n oldTiltRef.current = tiltAngle;\r\n oldNorRef.current = [...normal];\r\n oldRotRef.current = [...rotation];\r\n latestFoundationRef.current = latestFoundation;\r\n }\r\n setShowIntersectionPlane(true);\r\n pointerDownRef.current = true;\r\n useRefStore.getState().setEnableOrbitController(false);\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const isTouchingRoof = (newLy: number, newTAngle: number) => {\r\n if (drawPole && newTAngle !== 0 && 0.5 * newLy * Math.abs(Math.sin(newTAngle)) > poleHeight) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const intersectionPlanePointerMove = (event: ThreeEvent) => {\r\n if (intersectionPlaneRef.current && pointerDownRef.current && latestFoundationRef.current && pvModel) {\r\n setRayCast(event);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const pointer = intersects[0].point;\r\n if (pointer.z < 0.001) {\r\n return;\r\n }\r\n const rotateHandleType = useStore.getState().rotateHandleType;\r\n if (useStore.getState().resizeHandleType) {\r\n const azimuth = drawPole ? relativeAzimuth : 0;\r\n const anchor = useStore.getState().resizeAnchor;\r\n const fCenter = new Vector3(\r\n latestFoundationRef.current.cx,\r\n latestFoundationRef.current.cy,\r\n latestFoundationRef.current.lz,\r\n );\r\n const r = new Vector3()\r\n .subVectors(pointer, anchor)\r\n .applyEuler(new Euler(0, 0, -rotation[2] - latestFoundationRef.current.rotation[2] - azimuth));\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && latestFoundationRef.current) {\r\n switch (state.resizeHandleType) {\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right: {\r\n const unitLength =\r\n (e as SolarPanelModel).orientation === Orientation.landscape ? pvModel.length : pvModel.width;\r\n const dx = Math.abs(r.x);\r\n const nx = Math.max(1, Math.ceil((dx - unitLength / 2) / unitLength));\r\n const lx = nx * unitLength;\r\n const v = new Vector3((Math.sign(r.x) * lx) / 2, 0, 0).applyEuler(\r\n new Euler(0, 0, rotation[2] + latestFoundationRef.current.rotation[2] + azimuth),\r\n );\r\n const center = new Vector3()\r\n .addVectors(anchor, v)\r\n .sub(fCenter)\r\n .applyEuler(new Euler(0, 0, -latestFoundationRef.current.rotation[2]));\r\n e.lx = lx;\r\n e.cx = center.x / latestFoundationRef.current.lx;\r\n e.cy = center.y / latestFoundationRef.current.ly;\r\n break;\r\n }\r\n case ResizeHandleType.Upper:\r\n case ResizeHandleType.Lower: {\r\n const dy = Math.abs(r.y);\r\n const dz = Math.abs(r.z);\r\n const dl = Math.hypot(dy, dz);\r\n const unitLength =\r\n (e as SolarPanelModel).orientation === Orientation.landscape ? pvModel.width : pvModel.length;\r\n const nl = Math.max(1, Math.ceil((dl - unitLength / 2) / unitLength));\r\n const l = nl * unitLength;\r\n const v = new Vector3(0, (l * Math.sign(r.y)) / 2, 0).applyEuler(\r\n new Euler(\r\n rotation[0],\r\n rotation[1],\r\n rotation[2] + latestFoundationRef.current.rotation[2] + azimuth,\r\n 'ZXY',\r\n ),\r\n );\r\n const center = new Vector3()\r\n .addVectors(anchor, v)\r\n .sub(fCenter)\r\n .applyEuler(new Euler(0, 0, -latestFoundationRef.current.rotation[2]));\r\n if (!isTouchingRoof(l, tiltAngle)) {\r\n e.ly = l;\r\n e.cx = center.x / latestFoundationRef.current.lx;\r\n e.cy = center.y / latestFoundationRef.current.ly;\r\n if (!drawPole) {\r\n e.cz = center.z - hz;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n } else if (rotateHandleType === RotateHandleType.Lower || rotateHandleType === RotateHandleType.Upper) {\r\n const pr = latestFoundationRef.current.rotation[2]; // parent rotation\r\n const pc = new Vector2(latestFoundationRef.current.cx, latestFoundationRef.current.cy); // world parent center\r\n const cc = new Vector2(cx, cy).rotateAround(ORIGIN_VECTOR2, pr);\r\n const wc = new Vector2().addVectors(cc, pc); // world current center\r\n const rotation =\r\n Math.atan2(-pointer.x + wc.x, pointer.y - wc.y) -\r\n pr +\r\n (rotateHandleType === RotateHandleType.Lower ? Math.PI : 0);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0; // make sure angle is between -PI to PI\r\n const newAzimuth = rotation + offset;\r\n useStore.getState().updateSolarCollectorRelativeAzimuthById(id, newAzimuth);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const tiltHandlePointerMove = (\r\n e: ThreeEvent,\r\n tiltHandleRef: React.MutableRefObject,\r\n ) => {\r\n if (pointerDownRef.current) {\r\n setRayCast(e);\r\n if (tiltHandleRef.current && useStore.getState().rotateHandleType === RotateHandleType.Tilt) {\r\n const intersects = ray.intersectObjects([tiltHandleRef.current]);\r\n if (intersects.length > 0) {\r\n const pointer = intersects[0].point;\r\n const center = tiltHandleRef.current.parent?.localToWorld(new Vector3()); // rotate center in world coordinate\r\n if (center) {\r\n const cv = new Vector3().subVectors(pointer, center);\r\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\r\n const touch = 0.5 * ly * Math.abs(Math.sin(angle)) > poleHeight;\r\n if (!touch) {\r\n const wr = relativeAzimuth + rotation[2] + (latestFoundationRef.current?.rotation[2] ?? 0);\r\n const sign =\r\n wr % Math.PI === 0\r\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\r\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\r\n angle *= sign;\r\n useStore.getState().updateSolarPanelTiltAngleById(id, angle);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const tiltHandlePointerUp = () => {\r\n const sp = getElementById(id) as SolarPanelModel;\r\n if (sp && oldTiltRef.current && Math.abs(sp.tiltAngle - oldTiltRef.current) > ZERO_TOLERANCE) {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltRef.current,\r\n newValue: sp.tiltAngle,\r\n changedElementId: id,\r\n changedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n useStore.getState().addUndoable(undoableChange);\r\n }\r\n };\r\n\r\n const AddUndoableOperation = (sp: SolarPanelModel) => {\r\n if (useStore.getState().resizeHandleType) {\r\n if (oldDmsRef.current && oldPosRef.current && oldNorRef.current && oldRotRef.current) {\r\n const undoableResize = {\r\n name: 'Resize Solar Panel On Roof',\r\n timestamp: Date.now(),\r\n id: sp.id,\r\n oldDms: [...oldDmsRef.current],\r\n oldNor: [...oldNorRef.current],\r\n oldPos: [...oldPosRef.current],\r\n oldRot: [...oldRotRef.current],\r\n newDms: [sp.lx, sp.ly, sp.lz],\r\n newPos: [sp.cx, sp.cy, sp.cz],\r\n newNor: [...sp.normal],\r\n newRot: [...sp.rotation],\r\n undo() {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.id) {\r\n [e.cx, e.cy, e.cz] = [...undoableResize.oldPos];\r\n [e.lx, e.ly, e.lz] = [...undoableResize.oldDms];\r\n e.normal = [...undoableResize.oldNor];\r\n e.rotation = [...undoableResize.oldRot];\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n redo() {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.id) {\r\n [e.cx, e.cy, e.cz] = [...undoableResize.newPos];\r\n [e.lx, e.ly, e.lz] = [...undoableResize.newDms];\r\n e.normal = [...undoableResize.newNor];\r\n e.rotation = [...undoableResize.newRot];\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n } as UnoableResizeSolarPanelOnRoof;\r\n useStore.getState().addUndoable(undoableResize);\r\n }\r\n } else if (useStore.getState().rotateHandleType) {\r\n if (oldAziRef.current !== undefined) {\r\n const undoableRotate = {\r\n name: 'Rotate Solar Panel On Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldAziRef.current,\r\n newValue: sp.relativeAzimuth,\r\n changedElementId: sp.id,\r\n changedElementType: sp.type,\r\n undo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarCollectorRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarCollectorRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n useStore.getState().addUndoable(undoableRotate);\r\n }\r\n }\r\n };\r\n\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n const texture = useSolarPanelTexture(lx, ly, pvModel, orientation, frameColor, backsheetColor);\r\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\r\n\r\n const renderTopTextureMaterial = () => {\r\n if (showSolarRadiationHeatmap && heatmapTexture) {\r\n return ;\r\n }\r\n if (!texture) return ;\r\n if (orthographic || solarPanelShininess === 0) {\r\n return ;\r\n }\r\n return (\r\n \r\n );\r\n };\r\n\r\n const renderBotTextureMaterial = () => {\r\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n return (\r\n \r\n );\r\n };\r\n\r\n if (parent && parent.type === ObjectType.Roof && (parent as RoofModel).opacity === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {/* draw panel */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n if (useStore.getState().objectTypeToAdd !== ObjectType.None) return;\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.SolarPanel;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {renderTopTextureMaterial()}\r\n {renderBotTextureMaterial()}\r\n \r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* move handle */}\r\n \r\n\r\n {/* resize handles */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* simulation panel */}\r\n \r\n \r\n \r\n\r\n {showSolarRadiationHeatmap &&\r\n heatmapTexture &&\r\n solarPanelLinesRef.current &&\r\n solarPanelLinesRef.current.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {selected && locked && (\r\n \r\n )}\r\n \r\n\r\n {/* rotate and tilt handles */}\r\n {drawPole && selected && !locked && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n \r\n )}\r\n\r\n {drawPole &&\r\n poleHeight > 0 &&\r\n poles.map((p, i) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/*draw sun beam*/}\r\n \r\n\r\n {/*draw label */}\r\n {(hovered || showLabel) && !selected && \r\n );\r\n};\r\n\r\nexport default SolarPanelOnRoof;\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Plane } from '@react-three/drei';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport React, { useEffect } from 'react';\r\nimport { HALF_PI } from 'src/constants';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ActionType, ObjectType } from 'src/types';\r\nimport { DoubleSide } from 'three';\r\nimport * as Selector from 'src/stores/selector';\r\n\r\nconst EmptyWall = (wallModel: WallModel) => {\r\n const { lx, lz, parentId, id, roofId } = wallModel;\r\n\r\n const deletedRoofId = useStore(Selector.deletedRoofId);\r\n const deletedRoofIdSet = useStore(Selector.deletedRoofIdSet);\r\n\r\n useEffect(() => {\r\n if (!roofId) return;\r\n if (deletedRoofId === roofId || deletedRoofIdSet.has(roofId)) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n wall.roofId = null;\r\n wall.leftRoofHeight = undefined;\r\n wall.rightRoofHeight = undefined;\r\n wall.centerRoofHeight = undefined;\r\n wall.centerLeftRoofHeight = undefined;\r\n wall.centerRightRoofHeight = undefined;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }, [roofId, deletedRoofId, deletedRoofIdSet]);\r\n\r\n const checkIfCanSelectMe = (e: ThreeEvent) => {\r\n return !(\r\n e.button === 2 ||\r\n useStore.getState().moveHandleType ||\r\n useStore.getState().resizeHandleType ||\r\n useStore.getState().objectTypeToAdd !== ObjectType.None ||\r\n useStore.getState().isAddingElement()\r\n );\r\n };\r\n\r\n const handleWallBodyPointerDown = (e: ThreeEvent) => {\r\n if (checkIfCanSelectMe(e)) {\r\n useStore.getState().set((state) => {\r\n state.contextMenuObjectType = null;\r\n });\r\n useStore.getState().selectMe(id, e, ActionType.Select);\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n useStore.getState().selectMe(id, e, ActionType.ContextMenu);\r\n useStore.getState().set((state) => {\r\n if (e.intersections.length > 0 && e.intersections[0].object === e.eventObject) {\r\n state.contextMenuObjectType = ObjectType.Wall;\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(EmptyWall);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Sphere } from '@react-three/drei';\r\nimport { HIGHLIGHT_HANDLE_COLOR, MOVE_HANDLE_COLOR_2 } from 'src/constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { MoveHandleType } from 'src/types';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { useHandleSize } from './hooks';\r\n\r\ninterface HandleProps {\r\n cy: number;\r\n size: number;\r\n type: MoveHandleType;\r\n}\r\n\r\ninterface WrapperProps {\r\n ply: number;\r\n phz: number;\r\n}\r\n\r\nconst MoveHandle = ({ cy, size, type }: HandleProps) => {\r\n const [color, setColor] = useState(MOVE_HANDLE_COLOR_2);\r\n\r\n const onPointerEnter = () => {\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n };\r\n\r\n const onPointerOut = () => {\r\n setColor(MOVE_HANDLE_COLOR_2);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst WallMoveHandleWrapper = ({ ply, phz }: WrapperProps) => {\r\n const handleSize = useHandleSize();\r\n\r\n const onPointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.parent === e.eventObject) {\r\n useStore.getState().set((state) => {\r\n state.moveHandleType = e.object.name as MoveHandleType;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WallMoveHandleWrapper);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport { Box, Plane } from '@react-three/drei';\r\nimport { DoubleSide, Euler, Mesh, Vector3 } from 'three';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ObjectType, ResizeHandleType } from 'src/types';\r\nimport { HALF_PI, HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR } from 'src/constants';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { WallFill, WallModel } from 'src/models/WallModel';\r\nimport { useHandleSize } from './hooks';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableResizeWallHeight } from 'src/undo/UndoableResize';\r\nimport { RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\n\r\ninterface ResizeHandlesProps {\r\n x: number;\r\n z: number;\r\n handleType: ResizeHandleType;\r\n highLight: boolean;\r\n handleSize: number;\r\n partial?: boolean;\r\n}\r\n\r\ninterface WallResizeHandleWrapperProps {\r\n id: string;\r\n parentLz: number;\r\n roofId: string | null | undefined;\r\n x: number;\r\n z: number;\r\n absAngle: number;\r\n highLight: boolean;\r\n fill: WallFill;\r\n wallLeftHeight: number;\r\n wallRightHeight: number;\r\n leftUnfilledHeight: number;\r\n rightUnfilledHeight: number;\r\n leftTopPartialResizeHandleHeight: number;\r\n rightTopPartialResizeHandleHeight: number;\r\n leftJoints: string[];\r\n rightJoints: string[];\r\n}\r\n\r\nconst PARTIAL_RESIZE_HANDLE_COLOR = '#ADD8E6';\r\n\r\nconst WallResizeHandle = React.memo(({ x, z, handleType, highLight, handleSize, partial }: ResizeHandlesProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const addedWallID = useStore(Selector.addedWallId);\r\n\r\n const [hovered, setHovered] = useState(false);\r\n\r\n const color = // handleType === RType.UpperRight ? 'blue' : 'white';\r\n highLight ||\r\n hovered ||\r\n handleType === resizeHandleType ||\r\n (addedWallID && (handleType === ResizeHandleType.LowerRight || handleType === ResizeHandleType.UpperRight))\r\n ? HIGHLIGHT_HANDLE_COLOR\r\n : partial\r\n ? PARTIAL_RESIZE_HANDLE_COLOR\r\n : RESIZE_HANDLE_COLOR;\r\n\r\n let lx = handleSize,\r\n ly = handleSize,\r\n lz = handleSize;\r\n if (handleType === ResizeHandleType.LowerRight || handleType === ResizeHandleType.LowerLeft) {\r\n lx = handleSize * 1.7;\r\n } else if (partial) {\r\n lx *= 0.75;\r\n ly = handleSize / 2;\r\n lz = handleSize * 2.5;\r\n const offset = lz / 4;\r\n if (\r\n handleType === ResizeHandleType.WallPartialResizeLeft ||\r\n handleType === ResizeHandleType.WallPartialResizeRight\r\n ) {\r\n z -= offset;\r\n } else if (\r\n handleType === ResizeHandleType.WallPartialResizeLeftTop ||\r\n handleType === ResizeHandleType.WallPartialResizeRightTop\r\n ) {\r\n z += offset;\r\n }\r\n } else {\r\n ly = handleSize / 2;\r\n lz = handleSize * 1.7;\r\n }\r\n return (\r\n {\r\n setHovered(true);\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handleType;\r\n });\r\n }}\r\n onPointerLeave={() => {\r\n setHovered(false);\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n }}\r\n >\r\n \r\n \r\n );\r\n});\r\n\r\nconst WallResizeHandleWrapper = React.memo(\r\n ({\r\n id,\r\n parentLz,\r\n roofId,\r\n x,\r\n z,\r\n absAngle,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n fill,\r\n wallLeftHeight,\r\n wallRightHeight,\r\n highLight,\r\n leftJoints,\r\n rightJoints,\r\n }: WallResizeHandleWrapperProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n\r\n const handleSize = useHandleSize();\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [intersectionPlanePosition, setIntersectionPlanePosition] = useState(new Vector3());\r\n const [intersectionPlaneRotation, setIntersectionPlaneRotation] = useState(new Euler());\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const pointerDownRef = useRef(false);\r\n const oldHeightsRef = useRef([z * 2, leftUnfilledHeight, rightUnfilledHeight]);\r\n const oldSameBuildingWallsHeightMapRef = useRef>(new Map()); // for same roofId\r\n const leftWallLzRef = useRef(null);\r\n const rightWallLzRef = useRef(null);\r\n const childElements = useRef([]);\r\n\r\n const roofType = useMemo(() => {\r\n if (!roofId) return null;\r\n const roof = useStore.getState().elements.find((e) => e.id === roofId && e.type === ObjectType.Roof);\r\n if (!roof) return null;\r\n return (roof as RoofModel).roofType;\r\n }, [roofId]);\r\n\r\n if (orthographic) {\r\n z = -z;\r\n }\r\n\r\n const setIntersectionPlane = (x: number) => {\r\n const dir = useStore.getState().cameraDirection;\r\n const r = Math.atan2(dir.x, dir.y);\r\n setIntersectionPlanePosition(new Vector3(x, 0, 0));\r\n setIntersectionPlaneRotation(new Euler(HALF_PI, 0, -r - absAngle, 'ZXY'));\r\n setShowIntersectionPlane(true);\r\n };\r\n\r\n const updateUndoChange = (id: string, values: number[], sameBuildingWallsHeightMap: Map) => {\r\n const [\r\n lz,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n ] = values;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n e.lz = lz;\r\n wall.leftUnfilledHeight = leftUnfilledHeight;\r\n wall.rightUnfilledHeight = rightUnfilledHeight;\r\n wall.leftTopPartialHeight = leftTopPartialResizeHandleHeight;\r\n wall.rightTopPartialHeight = rightTopPartialResizeHandleHeight;\r\n } else if (e.type === ObjectType.Wall && sameBuildingWallsHeightMap.has(e.id)) {\r\n const height = sameBuildingWallsHeightMap.get(e.id);\r\n if (height !== undefined) {\r\n e.lz = height;\r\n e.cz = height / 2;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const getConnectedWallsHeight = () => {\r\n if (!roofId) return;\r\n\r\n if (leftJoints.length > 0 || rightJoints.length > 0) {\r\n if (roofType === RoofType.Gable || roofType === RoofType.Gambrel) {\r\n useStore.getState().elements.forEach((e) => {\r\n if (e.id === leftJoints[0]) leftWallLzRef.current = e.lz;\r\n if (e.id === rightJoints[0]) rightWallLzRef.current = e.lz;\r\n });\r\n } else {\r\n oldSameBuildingWallsHeightMapRef.current.clear();\r\n useStore.getState().elements.forEach((e) => {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n oldSameBuildingWallsHeightMapRef.current.set(e.id, e.lz);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n const getChildElements = () => {\r\n childElements.current = useStore.getState().elements.filter((e) => e.parentId === id);\r\n };\r\n\r\n const getWallShapePoints = (\r\n wall: WallModel,\r\n leftUnfilledHeight: number,\r\n rightUnfilledHeight: number,\r\n leftTopPartialHeight: number,\r\n rightTopPartialHeight: number,\r\n ) => {\r\n const {\r\n lx,\r\n lz,\r\n roofId,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n centerRoofHeight,\r\n } = wall;\r\n\r\n const isPartial = fill === WallFill.Partial;\r\n const realWallLeftHeight = isPartial ? Math.min(wallLeftHeight, leftTopPartialHeight) : wallLeftHeight;\r\n const realWallRightHeight = isPartial ? Math.min(wallRightHeight, rightTopPartialHeight) : wallRightHeight;\r\n const isTopPartial =\r\n isPartial &&\r\n (!Util.isZero(wallLeftHeight - realWallLeftHeight) || !Util.isZero(wallRightHeight - realWallRightHeight));\r\n\r\n const [hx, hy] = [lx / 2, lz / 2];\r\n\r\n const points: Point2[] = [];\r\n\r\n // from lower left, counter-clockwise\r\n points.push({ x: -hx, y: -hy + leftUnfilledHeight }, { x: hx, y: -hy + rightUnfilledHeight });\r\n\r\n if (isTopPartial) {\r\n points.push({ x: hx, y: -hy + realWallRightHeight }, { x: -hx, y: -hy + realWallLeftHeight });\r\n } else if (!roofId) {\r\n points.push({ x: hx, y: hy }, { x: -hx, y: hy });\r\n } else {\r\n if (rightRoofHeight) {\r\n points.push({ x: hx, y: -hy + rightRoofHeight });\r\n } else {\r\n points.push({ x: hx, y: hy });\r\n }\r\n if (centerRightRoofHeight) {\r\n points.push({ x: centerRightRoofHeight[0] * lx, y: -hy + centerRightRoofHeight[1] });\r\n }\r\n if (centerRoofHeight) {\r\n points.push({ x: centerRoofHeight[0] * lx, y: -hy + centerRoofHeight[1] });\r\n }\r\n if (centerLeftRoofHeight) {\r\n points.push({ x: centerLeftRoofHeight[0] * lx, y: -hy + centerLeftRoofHeight[1] });\r\n }\r\n if (leftRoofHeight) {\r\n points.push({ x: -hx, y: -hy + leftRoofHeight });\r\n } else {\r\n points.push({ x: -hx, y: hy });\r\n }\r\n }\r\n\r\n return points;\r\n };\r\n\r\n const isPartialWallValid = (\r\n wall: WallModel,\r\n leftUnfilledHeight: number,\r\n rightUnfilledHeight: number,\r\n leftTopPartialResizeHandleHeight: number,\r\n rightTopPartialResizeHandleHeight: number,\r\n ) => {\r\n const wallShapePoints = getWallShapePoints(\r\n wall,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n );\r\n\r\n if (childElements.current.length > 0) {\r\n for (const el of childElements.current) {\r\n let { cx, cz, lx, ly, lz } = el;\r\n cx *= wall.lx;\r\n cz *= wall.lz;\r\n if (el.type !== ObjectType.SolarPanel) {\r\n lx *= wall.lx;\r\n lz *= wall.lz;\r\n } else {\r\n lz = ly;\r\n }\r\n if (el.type === ObjectType.Window && (el as WindowModel).windowType === WindowType.Polygonal) {\r\n const [tx, th] = (el as WindowModel).polygonTop ?? DEFAULT_POLYGONTOP;\r\n const px = cx + tx * lx;\r\n const pz = cz + lz / 2 + th;\r\n if (!Util.isPointInside(px, pz, wallShapePoints)) {\r\n return false;\r\n }\r\n }\r\n if (!Util.isElementInsideWall(new Vector3(cx, 0, cz), lx, lz, wallShapePoints, el.type === ObjectType.Door)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const resetJointedWallLz = () => {\r\n leftWallLzRef.current = null;\r\n rightWallLzRef.current = null;\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (useStore.getState().addedWallId || e.object !== e.intersections[0]?.object) return;\r\n\r\n const resizeHandleObject = e.object;\r\n switch (resizeHandleObject.name) {\r\n case ResizeHandleType.LowerLeft: {\r\n setCommonStore((state) => {\r\n state.resizeAnchor.copy(resizeHandleObject.localToWorld(new Vector3(x * 2, 0, 0)));\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.LowerRight: {\r\n setCommonStore((state) => {\r\n state.resizeAnchor.copy(resizeHandleObject.localToWorld(new Vector3(-x * 2, 0, 0)));\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.WallPartialResizeLeft:\r\n case ResizeHandleType.WallPartialResizeLeftTop: {\r\n setIntersectionPlane(-x);\r\n getConnectedWallsHeight();\r\n getChildElements();\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight:\r\n case ResizeHandleType.WallPartialResizeRight:\r\n case ResizeHandleType.WallPartialResizeRightTop: {\r\n setIntersectionPlane(x);\r\n getConnectedWallsHeight();\r\n getChildElements();\r\n break;\r\n }\r\n default:\r\n console.error('Wall resize handle unknown');\r\n return;\r\n }\r\n setCommonStore((state) => {\r\n state.resizeHandleType = resizeHandleObject.name as ResizeHandleType;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n pointerDownRef.current = true;\r\n oldHeightsRef.current = [\r\n z * 2,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n ];\r\n };\r\n\r\n const handlePointerMove = (e: ThreeEvent) => {\r\n if (e.intersections.length === 0 || !pointerDownRef.current) return;\r\n const p = e.intersections[0].point;\r\n switch (useStore.getState().resizeHandleType) {\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight: {\r\n setCommonStore((state) => {\r\n const minZ = fill === WallFill.Partial ? Math.max(leftUnfilledHeight, rightUnfilledHeight) : 0;\r\n let newLz = Math.max(minZ + handleSize, p.z - parentLz);\r\n if (roofType === null || roofType === RoofType.Gable || roofType === RoofType.Gambrel) {\r\n if (leftWallLzRef.current || rightWallLzRef.current) {\r\n const leftDiff = Math.abs(newLz - (leftWallLzRef.current ?? Infinity));\r\n const rightDiff = Math.abs(newLz - (rightWallLzRef.current ?? Infinity));\r\n if (leftDiff < rightDiff && leftDiff < 0.5 && leftWallLzRef.current) {\r\n newLz = leftWallLzRef.current;\r\n } else if (rightDiff <= leftDiff && rightDiff < 0.5 && rightWallLzRef.current) {\r\n newLz = rightWallLzRef.current;\r\n }\r\n }\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id) {\r\n const wall = e as WallModel;\r\n if (wall.fill === WallFill.Partial) {\r\n newLz = Math.max(newLz, wall.leftTopPartialHeight, wall.rightTopPartialHeight);\r\n }\r\n wall.lz = newLz;\r\n wall.cz = newLz / 2;\r\n // if (newLz < wall.leftTopPartialHeight) {\r\n // wall.leftTopPartialHeight = newLz;\r\n // }\r\n // if (newLz < wall.rightTopPartialHeight) {\r\n // wall.rightTopPartialHeight = newLz;\r\n // }\r\n break;\r\n }\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n const wall = e as WallModel;\r\n if (wall.fill === WallFill.Partial) {\r\n newLz = Math.max(newLz, wall.leftTopPartialHeight, wall.rightTopPartialHeight);\r\n }\r\n }\r\n }\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n e.lz = newLz;\r\n e.cz = newLz / 2;\r\n }\r\n }\r\n }\r\n state.selectedElementHeight = Math.max(0.1, p.z);\r\n state.actionState.wallHeight = newLz;\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.WallPartialResizeLeft: {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n let newUnfilledHeight = Util.clamp(p.z - parentLz, 0, wall.leftTopPartialHeight);\r\n if (wall.leftJoints.length > 0) {\r\n const leftWall = state.elements.find(\r\n (e) => e.id === wall.leftJoints[0] && e.type === ObjectType.Wall,\r\n ) as WallModel;\r\n if (leftWall && leftWall.fill === WallFill.Partial) {\r\n const leftWallRightUnfilledHeight = leftWall.rightUnfilledHeight;\r\n if (Math.abs(newUnfilledHeight - leftWallRightUnfilledHeight) < 0.5) {\r\n newUnfilledHeight = leftWallRightUnfilledHeight;\r\n }\r\n }\r\n }\r\n if (\r\n isPartialWallValid(\r\n wall,\r\n newUnfilledHeight,\r\n state.enableFineGrid ? newUnfilledHeight : wall.rightUnfilledHeight,\r\n wall.leftTopPartialHeight,\r\n wall.rightTopPartialHeight,\r\n )\r\n ) {\r\n wall.leftUnfilledHeight = newUnfilledHeight;\r\n if (state.enableFineGrid) {\r\n wall.rightUnfilledHeight = newUnfilledHeight;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.WallPartialResizeRight: {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n let newUnfilledHeight = Util.clamp(p.z - parentLz, 0, wall.rightTopPartialHeight);\r\n if (wall.rightJoints.length > 0) {\r\n const rightWall = state.elements.find(\r\n (e) => e.id === wall.rightJoints[0] && e.type === ObjectType.Wall,\r\n ) as WallModel;\r\n if (rightWall && rightWall.fill === WallFill.Partial) {\r\n const rightWallLeftUnfilledHeight = rightWall.leftUnfilledHeight;\r\n if (Math.abs(newUnfilledHeight - rightWallLeftUnfilledHeight) < 0.5) {\r\n newUnfilledHeight = rightWallLeftUnfilledHeight;\r\n }\r\n }\r\n }\r\n if (\r\n isPartialWallValid(\r\n wall,\r\n state.enableFineGrid ? newUnfilledHeight : wall.leftUnfilledHeight,\r\n newUnfilledHeight,\r\n wall.leftTopPartialHeight,\r\n wall.rightTopPartialHeight,\r\n )\r\n ) {\r\n wall.rightUnfilledHeight = newUnfilledHeight;\r\n if (state.enableFineGrid) {\r\n wall.leftUnfilledHeight = newUnfilledHeight;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.WallPartialResizeLeftTop: {\r\n setCommonStore((state) => {\r\n const wall = state.elements.find((e) => e.id === id && e.type === ObjectType.Wall) as WallModel;\r\n if (wall) {\r\n let newTopPartialResizeHandleHeight = Util.clamp(p.z - parentLz, wall.leftUnfilledHeight, wall.lz);\r\n if (wall.leftJoints.length > 0) {\r\n const leftWall = state.elements.find(\r\n (e) => e.id === wall.leftJoints[0] && e.type === ObjectType.Wall,\r\n ) as WallModel;\r\n if (leftWall && leftWall.fill === WallFill.Partial) {\r\n const leftWallPartialResizeRightTop = leftWall.rightTopPartialHeight;\r\n if (Math.abs(newTopPartialResizeHandleHeight - leftWallPartialResizeRightTop) < 0.5) {\r\n newTopPartialResizeHandleHeight = leftWallPartialResizeRightTop;\r\n }\r\n }\r\n }\r\n if (\r\n isPartialWallValid(\r\n wall,\r\n wall.leftUnfilledHeight,\r\n wall.rightUnfilledHeight,\r\n newTopPartialResizeHandleHeight,\r\n state.enableFineGrid ? newTopPartialResizeHandleHeight : wall.rightTopPartialHeight,\r\n )\r\n ) {\r\n wall.leftTopPartialHeight = newTopPartialResizeHandleHeight;\r\n if (state.enableFineGrid) {\r\n wall.rightTopPartialHeight = newTopPartialResizeHandleHeight;\r\n }\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.WallPartialResizeRightTop: {\r\n setCommonStore((state) => {\r\n const wall = state.elements.find((e) => e.id === id && e.type === ObjectType.Wall) as WallModel;\r\n if (wall) {\r\n let newTopPartialResizeHandleHeight = Util.clamp(p.z - parentLz, wall.rightUnfilledHeight, wall.lz);\r\n if (wall.rightJoints.length > 0) {\r\n const rightWall = state.elements.find(\r\n (e) => e.id === wall.rightJoints[0] && e.type === ObjectType.Wall,\r\n ) as WallModel;\r\n if (rightWall && rightWall.fill === WallFill.Partial) {\r\n const rightWallPartialResizeLeftTop = rightWall.leftTopPartialHeight;\r\n if (Math.abs(newTopPartialResizeHandleHeight - rightWallPartialResizeLeftTop) < 0.5) {\r\n newTopPartialResizeHandleHeight = rightWallPartialResizeLeftTop;\r\n }\r\n }\r\n }\r\n if (\r\n isPartialWallValid(\r\n wall,\r\n wall.leftUnfilledHeight,\r\n wall.rightUnfilledHeight,\r\n state.enableFineGrid ? newTopPartialResizeHandleHeight : wall.leftTopPartialHeight,\r\n newTopPartialResizeHandleHeight,\r\n )\r\n ) {\r\n wall.rightTopPartialHeight = newTopPartialResizeHandleHeight;\r\n if (state.enableFineGrid) {\r\n wall.leftTopPartialHeight = newTopPartialResizeHandleHeight;\r\n }\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n setShowIntersectionPlane(false);\r\n resetJointedWallLz();\r\n pointerDownRef.current = false;\r\n\r\n const newSameBuildingWallsHeightMap = new Map();\r\n if (roofId && roofType !== RoofType.Gable && roofType !== RoofType.Gambrel) {\r\n useStore.getState().elements.forEach((e) => {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n newSameBuildingWallsHeightMap.set(e.id, e.lz);\r\n }\r\n });\r\n }\r\n\r\n const undoableChangeHeight = {\r\n name: 'Change Wall Height',\r\n timestamp: Date.now(),\r\n resizedElementId: id,\r\n resizedElementType: ObjectType.Wall,\r\n oldHeights: [...oldHeightsRef.current],\r\n newHeights: [\r\n z * 2,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n ],\r\n oldSameBuildingWallsHeightMap: new Map(oldSameBuildingWallsHeightMapRef.current),\r\n newSameBuildingWallsHeightMap: newSameBuildingWallsHeightMap,\r\n undo() {\r\n updateUndoChange(this.resizedElementId, this.oldHeights, this.oldSameBuildingWallsHeightMap);\r\n },\r\n redo() {\r\n updateUndoChange(this.resizedElementId, this.newHeights, this.newSameBuildingWallsHeightMap);\r\n },\r\n } as UndoableResizeWallHeight;\r\n useStore.getState().addUndoable(undoableChangeHeight);\r\n setCommonStore((state) => {\r\n state.actionState.wallHeight = z * 2;\r\n state.resizeHandleType = null;\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {!orthographic && (\r\n <>\r\n \r\n \r\n\r\n {/* partial resize */}\r\n {fill === WallFill.Partial && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n },\r\n);\r\n\r\nexport default WallResizeHandleWrapper;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { WallModel, WallFill } from 'src/models/WallModel';\r\nimport EmptyWall from './emptyWall';\r\nimport Wall from './wall';\r\nimport WallMoveHandleWrapper from './wallMoveHandleWrapper';\r\nimport WallResizeHandleWrapper from './wallResizeHandleWrapper';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface WallRendererProps {\r\n wallModel: WallModel;\r\n foundationModel: FoundationModel;\r\n}\r\n\r\nconst WallRenderer = ({ wallModel, foundationModel }: WallRendererProps) => {\r\n const {\r\n id,\r\n roofId,\r\n cx,\r\n cy,\r\n lx,\r\n ly,\r\n lz,\r\n relativeAngle,\r\n fill,\r\n locked,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialHeight,\r\n rightTopPartialHeight,\r\n leftJoints,\r\n rightJoints,\r\n } = wallModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const [hx, hz] = [lx / 2, lz / 2];\r\n\r\n const isPartial = fill === WallFill.Partial;\r\n const leftRoofHeight = leftJoints.length > 0 ? wallModel.leftRoofHeight : lz;\r\n const rightRoofHeight = rightJoints.length > 0 ? wallModel.rightRoofHeight : lz;\r\n const wallLeftHeight = leftRoofHeight ?? lz;\r\n const wallRightHeight = rightRoofHeight ?? lz;\r\n const realWallLeftHeight = isPartial ? Math.min(wallLeftHeight, leftTopPartialHeight) : wallLeftHeight;\r\n const realWallRightHeight = isPartial ? Math.min(wallRightHeight, rightTopPartialHeight) : wallRightHeight;\r\n const highLight = lx === 0;\r\n\r\n const renderWall = () => {\r\n if (fill === WallFill.Empty) {\r\n return ;\r\n }\r\n return ;\r\n };\r\n\r\n return (\r\n \r\n {renderWall()}\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n <>\r\n {lx > 0.5 && }\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst areEqual = (prev: WallRendererProps, curr: WallRendererProps) => prev.wallModel === curr.wallModel;\r\n\r\nexport default React.memo(WallRenderer, areEqual);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ObjectType } from 'src/types';\r\nimport SolarPanelOnRoof from '../solarPanel/solarPanelOnRoof';\r\nimport shallow from 'zustand/shallow';\r\nimport Window from '../window/window';\r\nimport WallRenderer from '../wall/wallRenderer';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport RoofRenderer from '../roof/roofRenderer';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\n\r\nexport const BUILDING_GROUP_NAME = 'Building Group';\r\n\r\nconst BuildingRenderer = (foundationModel: FoundationModel) => {\r\n const { id, lx, ly, lz } = foundationModel;\r\n\r\n const isBuildingParts = (e: ElementModel) => {\r\n if (e.foundationId !== id) return false;\r\n return (\r\n e.type === ObjectType.Wall ||\r\n e.type === ObjectType.Roof ||\r\n (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) ||\r\n (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Roof)\r\n );\r\n };\r\n\r\n const buildingParts = useStore((state) => state.elements.filter(isBuildingParts), shallow);\r\n\r\n if (buildingParts.length === 0) return null;\r\n\r\n return (\r\n \r\n {buildingParts.map((e) => {\r\n switch (e.type) {\r\n case ObjectType.Wall:\r\n return ;\r\n case ObjectType.Roof:\r\n return ;\r\n case ObjectType.SolarPanel:\r\n // rooftop solar panels\r\n return (\r\n \r\n );\r\n case ObjectType.Window:\r\n // rooftop windows\r\n return ;\r\n default:\r\n return null;\r\n }\r\n })}\r\n \r\n );\r\n};\r\n\r\nconst areEuqal = (prev: FoundationModel, curr: FoundationModel) =>\r\n prev.lx === curr.lx && prev.ly === curr.ly && prev.lz === curr.lz && prev.rotation === curr.rotation;\r\n\r\nexport default React.memo(BuildingRenderer, areEuqal);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport FoundationTexture00 from '../../resources/tiny_white_square.png';\r\nimport FoundationTexture01 from '../../resources/foundation_01.png';\r\nimport FoundationTexture02 from '../../resources/foundation_02.png';\r\nimport FoundationTexture03 from '../../resources/foundation_03.png';\r\nimport FoundationTexture04 from '../../resources/foundation_04.png';\r\nimport FoundationTexture05 from '../../resources/foundation_05.png';\r\nimport FoundationTexture06 from '../../resources/foundation_06.png';\r\nimport FoundationTexture07 from '../../resources/foundation_07.png';\r\n\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Line, Plane, Sphere } from '@react-three/drei';\r\nimport { CanvasTexture, Euler, Group, Mesh, Raycaster, RepeatWrapping, TextureLoader, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from '../../stores/commonRef';\r\nimport { FoundationModel } from '../../models/FoundationModel';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n ActionType,\r\n FoundationTexture,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n SolarStructure,\r\n WallSide,\r\n} from '../../types';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_COLOR_1,\r\n MOVE_HANDLE_COLOR_2,\r\n ORIGIN_VECTOR2,\r\n RESIZE_HANDLE_COLOR,\r\n TWO_PI,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport { Util } from '../../Util';\r\nimport { ElementModel } from '../../models/ElementModel';\r\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\r\nimport { ParabolicTroughModel } from '../../models/ParabolicTroughModel';\r\nimport { ParabolicDishModel } from '../../models/ParabolicDishModel';\r\nimport { PolarGrid } from '../polarGrid';\r\nimport { WallModel } from '../../models/WallModel';\r\nimport RotateHandle from '../../components/rotateHandle';\r\nimport Wireframe from '../../components/wireframe';\r\nimport * as Selector from '../../stores/selector';\r\nimport { FlippedWallSide, UndoableAdd, UndoableAddWall } from '../../undo/UndoableAdd';\r\nimport { UndoableMove, UndoableMoveWall } from '../../undo/UndoableMove';\r\nimport { UndoableResize, UndoableResizeWall } from '../../undo/UndoableResize';\r\nimport { UndoableChange } from '../../undo/UndoableChange';\r\nimport { ElementGrid } from '../elementGrid';\r\nimport i18n from '../../i18n/i18n';\r\nimport { PolygonModel } from '../../models/PolygonModel';\r\nimport { Point2 } from '../../models/Point2';\r\nimport { HorizontalRuler } from '../horizontalRuler';\r\nimport { showError } from '../../helpers';\r\nimport { SolarCollector } from '../../models/SolarCollector';\r\nimport { FresnelReflectorModel } from '../../models/FresnelReflectorModel';\r\nimport SolarUpdraftTower from '../solarUpdraftTower';\r\nimport SolarPowerTower from '../solarPowerTower';\r\nimport SolarReceiverPipe from '../solarReceiverPipe';\r\nimport { UndoablePaste } from '../../undo/UndoablePaste';\r\nimport { useHandleSize } from '../wall/hooks';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { InnerCommonStoreState } from 'src/stores/InnerCommonState';\r\nimport produce from 'immer';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { useSelected } from '../hooks';\r\nimport { debounce } from 'lodash';\r\nimport BuildingRenderer from './buildingRenderer';\r\n\r\ninterface WallAuxiliaryType {\r\n show: boolean;\r\n direction: 'x' | 'y' | 'xy' | null;\r\n position: number[] | null;\r\n}\r\n\r\ninterface SnapTargetType {\r\n id: string | null;\r\n point: Vector3 | null;\r\n side: WallSide | null;\r\n jointId: string | undefined;\r\n}\r\n\r\nexport const FOUNDATION_GROUP_NAME = 'Foundation Group';\r\n\r\nconst Foundation = (foundationModel: FoundationModel) => {\r\n const {\r\n id,\r\n cx,\r\n cy,\r\n lx = 1,\r\n ly = 1,\r\n lz = 0.1,\r\n rotation = [0, 0, 0],\r\n color = 'gray',\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n locked = false,\r\n showLabel = false,\r\n textureType = FoundationTexture.NoTexture,\r\n solarStructure,\r\n } = foundationModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const setCommonStore = useStore(Selector.set);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const setElementSize = useStore(Selector.setElementSize);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLyById = useStore(Selector.updateElementLyById);\r\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\r\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\r\n const updateWallLeftPointById = useStore(Selector.updateWallLeftPointById);\r\n const updateSolarCollectorRelativeAzimuthById = useStore(Selector.updateSolarCollectorRelativeAzimuthById);\r\n const updatePolygonVertexPositionById = useStore(Selector.updatePolygonVertexPositionById);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const pasteElements = useStore(Selector.pasteElementsToPoint);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const addElement = useStore(Selector.addElement);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const deletedWallID = useStore(Selector.deletedWallId);\r\n const updateWallMapOnFoundationFlag = useStore(Selector.updateWallMapOnFoundationFlag);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const addedFoundationID = useStore(Selector.addedFoundationId);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const isAddingElement = useStore(Selector.isAddingElement);\r\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const solarRadiationHeatmapReflectionOnly = useStore(Selector.viewState.solarRadiationHeatmapReflectionOnly);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n\r\n const {\r\n camera,\r\n gl: { domElement },\r\n } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const [showGrid, setShowGrid] = useState(false);\r\n const [wallAuxToAxis, setWallAuxToAxis] = useState({\r\n show: false,\r\n direction: null,\r\n position: null,\r\n });\r\n const [wallAuxToWallArray, setWallAuxToWallArray] = useState([\r\n { show: false, direction: null, position: null },\r\n { show: false, direction: null, position: null },\r\n ]);\r\n\r\n const addedWallIdRef = useRef(null);\r\n const isSettingWallStartPointRef = useRef(false);\r\n const isSettingWallEndPointRef = useRef(false);\r\n const elementsStateBeforeResizingRef = useRef(null);\r\n const flippedWallSide = useRef(FlippedWallSide.null);\r\n\r\n // Use 1: Directly use to get wall points to snap.\r\n // Use 2: Need update first before other use. Intend to reduce call getElementById()\r\n const wallMapOnFoundation = useRef>(new Map());\r\n\r\n const groupRef = useRef(null);\r\n const baseRef = useRef();\r\n const grabRef = useRef(null);\r\n const intersectPlaneRef = useRef();\r\n const resizeHandleLLRef = useRef();\r\n const resizeHandleULRef = useRef();\r\n const resizeHandleLRRef = useRef();\r\n const resizeHandleURRef = useRef();\r\n const moveHandleLowerRef = useRef();\r\n const moveHandleUpperRef = useRef();\r\n const moveHandleLeftRef = useRef();\r\n const moveHandleRightRef = useRef();\r\n const oldPositionRef = useRef(new Vector3());\r\n const newPositionRef = useRef(new Vector3());\r\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const newDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const oldAzimuthRef = useRef(0);\r\n const newAzimuthRef = useRef(0);\r\n const oldVerticesRef = useRef([]);\r\n const newVerticesRef = useRef([]);\r\n const oldJointsRef = useRef([]);\r\n const newJointsRef = useRef([]);\r\n const oldPointRef = useRef([]);\r\n const newPointRef = useRef([]);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const positionLL = useMemo(() => new Vector3(-hx, -hy, hz), [hx, hy, hz]);\r\n const positionUL = useMemo(() => new Vector3(-hx, hy, hz), [hx, hy, hz]);\r\n const positionLR = useMemo(() => new Vector3(hx, -hy, hz), [hx, hy, hz]);\r\n const positionUR = useMemo(() => new Vector3(hx, hy, hz), [hx, hy, hz]);\r\n\r\n // experimental wall handle size, may useful for foundation handles too\r\n const handleRadius = useHandleSize();\r\n\r\n const moveHandleRadius = handleRadius;\r\n const resizeHandleRadius = handleRadius;\r\n const rotateHandleRadius = handleRadius * 4;\r\n const rotateHandlePosition = hy + rotateHandleRadius;\r\n\r\n // for undo auto deletion\r\n type UndoMoveWall = { wall: WallModel; newAngle: number; newJoints: string[][] };\r\n const listenToAutoDeletionRef = useRef(false);\r\n const undoableMoveWallArgsRef = useRef(null);\r\n // only one roof is affected, so no need to use set\r\n const autoDeletedRoofs = useStore(Selector.autoDeletedRoofs);\r\n const autoDeletedChild = useStore(Selector.autoDeletedChild);\r\n\r\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\r\n if (grabRef.current) {\r\n let poleHeight = -1;\r\n switch (grabRef.current.type) {\r\n case ObjectType.SolarPanel:\r\n poleHeight = (grabRef.current as SolarPanelModel).poleHeight;\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n // pole height of parabolic trough is relative to its half width\r\n const trough = grabRef.current as ParabolicTroughModel;\r\n poleHeight = trough.poleHeight + trough.lx / 2;\r\n break;\r\n case ObjectType.ParabolicDish:\r\n // pole height of parabolic dish is relative to its radius\r\n const dish = grabRef.current as ParabolicDishModel;\r\n poleHeight = dish.poleHeight + dish.lx / 2 + (dish.lx * dish.lx) / (4 * dish.latusRectum);\r\n break;\r\n case ObjectType.FresnelReflector:\r\n // pole height of Fresnel reflector is relative to its half width\r\n const reflector = grabRef.current as FresnelReflectorModel;\r\n poleHeight = reflector.poleHeight + reflector.lx / 2;\r\n break;\r\n }\r\n if (poleHeight >= 0) {\r\n intersectionPlanePosition.set(0, 0, foundationModel?.lz / 2 + poleHeight);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n }, [updateWallMapOnFoundationFlag]);\r\n\r\n useEffect(() => {\r\n if (deletedWallID && deletedWallID === addedWallIdRef.current) {\r\n wallMapOnFoundation.current.delete(deletedWallID);\r\n isSettingWallStartPointRef.current = false;\r\n isSettingWallEndPointRef.current = false;\r\n addedWallIdRef.current = null;\r\n setCommonStore((state) => {\r\n if (state.addedWallId === state.deletedWallId) {\r\n state.addedWallId = null;\r\n }\r\n state.deletedWallId = null;\r\n });\r\n useRefStore.getState().setEnableOrbitController(true);\r\n setWallAuxToAxis({ show: false, direction: null, position: null });\r\n setWallAuxToWallArray([\r\n { show: false, direction: null, position: null },\r\n { show: false, direction: null, position: null },\r\n ]);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [deletedWallID]);\r\n\r\n useEffect(() => {\r\n if (foundationModel && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(foundationModel.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n } else {\r\n setHeatmapTexture(null);\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue, solarRadiationHeatmapReflectionOnly]);\r\n\r\n // for undo auto deletion\r\n useEffect(() => {\r\n if (!listenToAutoDeletionRef.current || !useStore.getState().getAutoDeletedElements()) return;\r\n handleUndoMoveWallWithAutoDeletion();\r\n }, [autoDeletedRoofs, autoDeletedChild]);\r\n\r\n const handleUndoMoveWallWithAutoDeletion = debounce(() => {\r\n if (!undoableMoveWallArgsRef.current) return;\r\n\r\n const autoDeletedElements = useStore.getState().getAutoDeletedElements();\r\n if (!autoDeletedElements) return;\r\n\r\n const { wall, newAngle, newJoints } = undoableMoveWallArgsRef.current;\r\n const undoableMove = {\r\n name: 'Move Wall',\r\n timestamp: Date.now(),\r\n id: wall.id,\r\n oldPoints: [[...oldPointRef.current[0]], [...oldPointRef.current[1]]],\r\n newPoints: [[...wall.leftPoint], [...wall.rightPoint]],\r\n oldJoints: [[...oldJointsRef.current[0]], [...oldJointsRef.current[1]]],\r\n newJoints: [[...newJoints[0]], [...newJoints[1]]],\r\n oldAngle: oldAzimuthRef.current,\r\n newAngle: newAngle,\r\n flippedWallSide: flippedWallSide.current,\r\n autoDeletedElements: [...autoDeletedElements],\r\n undo() {\r\n switch (this.flippedWallSide) {\r\n case FlippedWallSide.loop:\r\n flipWallLoop(this.id);\r\n break;\r\n case FlippedWallSide.left:\r\n const lw = getElementById(this.newJoints[0][0]) as WallModel;\r\n if (lw) {\r\n flipWallsClockwise(lw);\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n const rw = getElementById(this.newJoints[1][0]) as WallModel;\r\n if (rw) {\r\n flipWallsCounterClockwise(rw);\r\n }\r\n break;\r\n }\r\n const [oldLeftJoints, oldRightJoints] = this.oldJoints;\r\n const [newLeftJoints, newRightJoints] = this.newJoints;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === this.id) {\r\n const [leftPoint, rightPoint] = this.oldPoints;\r\n e.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n e.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n e.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n const w = e as WallModel;\r\n w.relativeAngle = this.oldAngle;\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n w.leftJoints = [...oldLeftJoints];\r\n w.rightJoints = [...oldRightJoints];\r\n break;\r\n }\r\n }\r\n state.resizeHandleType = null;\r\n state.elements.push(...this.autoDeletedElements);\r\n state.deletedRoofId = null;\r\n state.autoDeletedChild = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n });\r\n if (oldLeftJoints[0] !== newLeftJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldLeftJoints[0]) {\r\n (e as WallModel).rightJoints = [this.id];\r\n }\r\n if (e.id === newLeftJoints[0]) {\r\n if (this.flippedWallSide !== FlippedWallSide.left) {\r\n (e as WallModel).rightJoints = [];\r\n } else {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (oldRightJoints[0] !== newRightJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldRightJoints[0]) {\r\n (e as WallModel).leftJoints = [this.id];\r\n }\r\n if (e.id === newRightJoints[0]) {\r\n if (this.flippedWallSide !== FlippedWallSide.right) {\r\n (e as WallModel).leftJoints = [];\r\n } else {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n redo() {\r\n const [oldLeftJoints, oldRightJoints] = this.oldJoints;\r\n const [newLeftJoints, newRightJoints] = this.newJoints;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === this.id && e.type === ObjectType.Wall) {\r\n const [leftPoint, rightPoint] = this.newPoints;\r\n e.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n e.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n e.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n const w = e as WallModel;\r\n w.relativeAngle = this.newAngle;\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n w.leftJoints = [...newLeftJoints];\r\n w.rightJoints = [...newRightJoints];\r\n break;\r\n }\r\n }\r\n });\r\n if (oldLeftJoints[0] !== newLeftJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldLeftJoints[0]) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n if (e.id === newLeftJoints[0]) {\r\n if (this.flippedWallSide === FlippedWallSide.right) {\r\n (e as WallModel).leftJoints = [this.id];\r\n } else {\r\n (e as WallModel).rightJoints = [this.id];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (oldRightJoints[0] !== newRightJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldRightJoints[0]) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n if (e.id === newRightJoints[0]) {\r\n if (this.flippedWallSide === FlippedWallSide.right) {\r\n (e as WallModel).rightJoints = [this.id];\r\n } else {\r\n (e as WallModel).leftJoints = [this.id];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n switch (this.flippedWallSide) {\r\n case FlippedWallSide.loop:\r\n flipWallLoop(this.id);\r\n break;\r\n case FlippedWallSide.left:\r\n const lw = getElementById(this.newJoints[0][0]) as WallModel;\r\n if (lw) {\r\n flipWallsCounterClockwise(lw);\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n const rw = getElementById(this.newJoints[1][0]) as WallModel;\r\n if (rw) {\r\n flipWallsClockwise(rw);\r\n }\r\n break;\r\n }\r\n const set = new Set(this.autoDeletedElements.map((e) => e.id));\r\n setCommonStore((state) => {\r\n state.resizeHandleType = null;\r\n state.elements = state.elements.filter((e) => !set.has(e.id));\r\n const deletedRoof = this.autoDeletedElements.find((e) => e.type === ObjectType.Roof);\r\n if (deletedRoof) {\r\n state.deletedRoofId = deletedRoof.id;\r\n }\r\n });\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n } as UndoableMoveWall;\r\n addUndoable(undoableMove);\r\n\r\n listenToAutoDeletionRef.current = false;\r\n setCommonStore((state) => {\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n });\r\n }, 100);\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const fetchRepeatDividers = (textureType: FoundationTexture) => {\r\n switch (textureType) {\r\n case FoundationTexture.Texture01:\r\n return { x: 1, y: 1 };\r\n case FoundationTexture.Texture02:\r\n return { x: 2, y: 2 };\r\n case FoundationTexture.Texture03:\r\n return { x: 0.4, y: 0.4 };\r\n case FoundationTexture.Texture04:\r\n return { x: 0.25, y: 0.25 };\r\n case FoundationTexture.Texture05:\r\n return { x: 5, y: 5 };\r\n case FoundationTexture.Texture06:\r\n return { x: 1, y: 1 };\r\n case FoundationTexture.Texture07:\r\n return { x: 1, y: 1 };\r\n default:\r\n return { x: 1, y: 1 };\r\n }\r\n };\r\n\r\n const textureLoader = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case FoundationTexture.Texture01:\r\n textureImg = FoundationTexture01;\r\n break;\r\n case FoundationTexture.Texture02:\r\n textureImg = FoundationTexture02;\r\n break;\r\n case FoundationTexture.Texture03:\r\n textureImg = FoundationTexture03;\r\n break;\r\n case FoundationTexture.Texture04:\r\n textureImg = FoundationTexture04;\r\n break;\r\n case FoundationTexture.Texture05:\r\n textureImg = FoundationTexture05;\r\n break;\r\n case FoundationTexture.Texture06:\r\n textureImg = FoundationTexture06;\r\n break;\r\n case FoundationTexture.Texture07:\r\n textureImg = FoundationTexture07;\r\n break;\r\n default:\r\n textureImg = FoundationTexture00;\r\n }\r\n return new TextureLoader().load(textureImg, (t) => {\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n const param = fetchRepeatDividers(textureType);\r\n t.repeat.set(lx / param.x, ly / param.y);\r\n setTexture(t);\r\n });\r\n }, [textureType, lx, ly]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n domElement.style.cursor = 'move';\r\n } else if (handle === RotateHandleType.Lower || handle === RotateHandleType.Upper) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = useStore.getState().addedFoundationId ? 'crosshair' : 'pointer';\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n domElement.style.cursor = useStore.getState().addedFoundationId ? 'crosshair' : 'default';\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n // only these elements are allowed to be on the foundation\r\n const legalOnFoundation = (type: ObjectType) => {\r\n switch (type) {\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Polygon:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.WindTurbine:\r\n case ObjectType.Wall:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n const findMagnetPoint = (pointer: Vector3, minDist: number) => {\r\n let min = minDist;\r\n let targetPoint: Vector3 | null = null;\r\n let targetID: string | null = null;\r\n let targetSide: WallSide | null = null;\r\n let jointId: string | undefined = undefined;\r\n if (!useStore.getState().enableFineGrid) {\r\n for (const [id, wall] of wallMapOnFoundation.current) {\r\n if (id === addedWallIdRef.current || (grabRef.current && id === grabRef.current.id)) continue;\r\n const leftPoint = new Vector3(wall.leftPoint[0], wall.leftPoint[1], 0);\r\n const rightPoint = new Vector3(wall.rightPoint[0], wall.rightPoint[1], 0);\r\n const distStart = leftPoint?.distanceTo(pointer) ?? Number.MAX_VALUE;\r\n const distEnd = rightPoint?.distanceTo(pointer) ?? Number.MAX_VALUE;\r\n const flag = distStart <= distEnd;\r\n const dist = flag ? distStart : distEnd;\r\n const point = flag ? leftPoint : rightPoint;\r\n if (dist <= min + 0.01) {\r\n min = dist;\r\n targetPoint = point;\r\n jointId = flag ? wall.leftJoints[0] : wall.rightJoints[0];\r\n targetID = id;\r\n targetSide = flag ? WallSide.Left : WallSide.Right;\r\n // if (targetID && !jointId) {\r\n // return { id: targetID, point: targetPoint, side: targetSide, jointId };\r\n // }\r\n }\r\n }\r\n }\r\n return { id: targetID, point: targetPoint, side: targetSide, jointId } as SnapTargetType;\r\n };\r\n\r\n const updatePointer = (p: Vector3, targetPoint?: Vector3 | null) => {\r\n if (!useStore.getState().enableFineGrid) {\r\n if (targetPoint) {\r\n p = targetPoint;\r\n } else {\r\n p = Util.snapToNormalGrid(p);\r\n }\r\n } else {\r\n p = Util.snapToFineGrid(p);\r\n targetPoint = null;\r\n }\r\n return p;\r\n };\r\n\r\n const flipWallLoop = (currentWallId: string) => {\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n let wall = wallMapOnFoundation.current.get(currentWallId);\r\n while (wall && wall.leftJoints.length > 0) {\r\n const wallCopy = wallMapOnFoundation.current.get(wall.id) as WallModel;\r\n if (!wallCopy) {\r\n break;\r\n }\r\n\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === wallCopy.id) {\r\n const w = e as WallModel;\r\n w.relativeAngle = (wallCopy.relativeAngle + Math.PI) % TWO_PI;\r\n w.leftPoint = [...wallCopy.rightPoint];\r\n w.rightPoint = [...wallCopy.leftPoint];\r\n w.leftJoints = [wallCopy.rightJoints[0]];\r\n w.rightJoints = [wallCopy.leftJoints[0]];\r\n break;\r\n }\r\n }\r\n });\r\n\r\n wall = wallMapOnFoundation.current.get(wall.leftJoints[0]);\r\n if (wall && wall!.id === currentWallId) {\r\n break;\r\n }\r\n }\r\n\r\n setCommonStore((state) => {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n if (useStore.getState().resizeHandleType) {\r\n state.resizeHandleType =\r\n useStore.getState().resizeHandleType === ResizeHandleType.LowerLeft\r\n ? ResizeHandleType.LowerRight\r\n : ResizeHandleType.LowerLeft;\r\n }\r\n });\r\n\r\n flippedWallSide.current =\r\n flippedWallSide.current === FlippedWallSide.null ? FlippedWallSide.loop : FlippedWallSide.null;\r\n };\r\n\r\n const flipWallsClockwise = (currWall: WallModel, targetWall?: WallModel) => {\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n const flipWallHead = currWall;\r\n let flipWall = currWall;\r\n while (flipWall) {\r\n const flipWallCopy = wallMapOnFoundation.current.get(flipWall.id) as WallModel;\r\n if (!flipWallCopy) {\r\n break;\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (flipWallCopy && e.id === flipWallCopy.id) {\r\n const wall = e as WallModel;\r\n wall.relativeAngle = (flipWallCopy.relativeAngle + Math.PI) % TWO_PI;\r\n wall.leftPoint = [...flipWallCopy.rightPoint];\r\n wall.rightPoint = [...flipWallCopy.leftPoint];\r\n wall.leftJoints = flipWallCopy.rightJoints.length > 0 ? [flipWallCopy.rightJoints[0]] : [];\r\n wall.rightJoints = flipWallCopy.leftJoints.length > 0 ? [flipWallCopy.leftJoints[0]] : [];\r\n break;\r\n }\r\n }\r\n });\r\n let nextWall: WallModel | undefined = undefined;\r\n if (flipWallCopy.leftJoints.length > 0) {\r\n nextWall = wallMapOnFoundation.current.get(flipWallCopy.leftJoints[0]);\r\n }\r\n if (nextWall && nextWall.id !== flipWallHead.id) {\r\n flipWall = nextWall;\r\n } else {\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n if (targetWall) {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === flipWallHead.id) {\r\n (e as WallModel).leftJoints = [targetWall.id];\r\n }\r\n if (e.id === targetWall.id) {\r\n (e as WallModel).rightJoints = [flipWallHead.id];\r\n }\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.resizeHandleType = ResizeHandleType.LowerLeft;\r\n });\r\n\r\n // side after flip\r\n flippedWallSide.current =\r\n flippedWallSide.current === FlippedWallSide.null ? FlippedWallSide.right : FlippedWallSide.null;\r\n };\r\n\r\n const flipWallsCounterClockwise = (currWall: WallModel, targetWall?: WallModel) => {\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n const flipWallHead = currWall;\r\n let flipWall = currWall;\r\n while (flipWall) {\r\n const flipWallCopy = wallMapOnFoundation.current.get(flipWall.id) as WallModel;\r\n if (!flipWallCopy) {\r\n break;\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (flipWallCopy && e.id === flipWallCopy.id) {\r\n const wall = e as WallModel;\r\n wall.relativeAngle = (flipWallCopy.relativeAngle + Math.PI) % TWO_PI;\r\n wall.leftPoint = [...flipWallCopy.rightPoint];\r\n wall.rightPoint = [...flipWallCopy.leftPoint];\r\n wall.leftJoints = flipWallCopy.rightJoints.length > 0 ? [flipWallCopy.rightJoints[0]] : [];\r\n wall.rightJoints = flipWallCopy.leftJoints.length > 0 ? [flipWallCopy.leftJoints[0]] : [];\r\n break;\r\n }\r\n }\r\n });\r\n let nextWall: WallModel | undefined = undefined;\r\n if (flipWallCopy.rightJoints.length > 0) {\r\n nextWall = wallMapOnFoundation.current.get(flipWallCopy.rightJoints[0]);\r\n }\r\n if (nextWall && nextWall.id !== flipWallHead.id) {\r\n flipWall = nextWall;\r\n } else {\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n if (targetWall) {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === flipWallHead.id) {\r\n (e as WallModel).rightJoints = [targetWall.id];\r\n }\r\n if (e.id === targetWall.id) {\r\n (e as WallModel).leftJoints = [flipWallHead.id];\r\n }\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.resizeHandleType = ResizeHandleType.LowerRight;\r\n });\r\n // side after flip\r\n flippedWallSide.current =\r\n flippedWallSide.current === FlippedWallSide.null ? FlippedWallSide.left : FlippedWallSide.null;\r\n };\r\n\r\n const checkWallLoop = (currentWallId: string) => {\r\n let wall: WallModel | undefined = undefined;\r\n\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.id === currentWallId) {\r\n wall = e as WallModel;\r\n }\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n\r\n // check is loop closed\r\n let isClosed = false;\r\n while (wall && wall.leftJoints.length > 0) {\r\n wall = wallMapOnFoundation.current.get(wall.leftJoints[0]);\r\n if (wall?.id === currentWallId) {\r\n isClosed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isClosed) {\r\n // get interior angle sum\r\n let totalAngle = 0;\r\n let totalNumber = 0;\r\n while (wall && wall.leftJoints.length > 0) {\r\n const targetWall = wallMapOnFoundation.current.get(wall.leftJoints[0]);\r\n const deltaAngle = (Math.PI * 3 - (wall.relativeAngle - targetWall!.relativeAngle)) % TWO_PI;\r\n totalAngle += deltaAngle;\r\n totalNumber += 1;\r\n wall = targetWall;\r\n if (wall!.id === currentWallId) {\r\n break;\r\n }\r\n }\r\n\r\n // check if it needs a flip\r\n if (totalAngle > (totalNumber - 2) * Math.PI + 0.1) {\r\n flipWallLoop(currentWallId);\r\n } else {\r\n if (flippedWallSide.current !== FlippedWallSide.null) {\r\n flippedWallSide.current = FlippedWallSide.loop;\r\n }\r\n }\r\n }\r\n\r\n return isClosed;\r\n };\r\n\r\n const handleUndoableAdd = (element: ElementModel) => {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: element,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n };\r\n\r\n const handleUndoableAddWall = (element: WallModel) => {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: element,\r\n flippedWallSide: flippedWallSide.current,\r\n undo: () => {\r\n const wall = undoableAdd.addedElement as WallModel;\r\n removeElementById(wall.id, false);\r\n if (\r\n (undoableAdd.flippedWallSide === FlippedWallSide.right ||\r\n undoableAdd.flippedWallSide === FlippedWallSide.loop) &&\r\n wall.rightJoints.length > 0\r\n ) {\r\n const rightWall = getElementById(wall.rightJoints[0]);\r\n if (rightWall) {\r\n flipWallsCounterClockwise(rightWall as WallModel);\r\n }\r\n } else if (undoableAdd.flippedWallSide === FlippedWallSide.left && wall.leftJoints.length > 0) {\r\n const leftWall = getElementById(wall.leftJoints[0]);\r\n if (leftWall) {\r\n flipWallsClockwise(leftWall as WallModel);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const wall = undoableAdd.addedElement as WallModel;\r\n if (\r\n undoableAdd.flippedWallSide === FlippedWallSide.right ||\r\n (undoableAdd.flippedWallSide === FlippedWallSide.loop && wall.rightJoints.length > 0)\r\n ) {\r\n const rightWall = getElementById(wall.rightJoints[0]);\r\n if (rightWall) {\r\n flipWallsClockwise(rightWall as WallModel);\r\n }\r\n } else if (undoableAdd.flippedWallSide === FlippedWallSide.left && wall.leftJoints.length > 0) {\r\n const leftWall = getElementById(wall.leftJoints[0]);\r\n if (leftWall) {\r\n flipWallsCounterClockwise(leftWall as WallModel);\r\n }\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\r\n }\r\n if (wall.leftJoints.length > 0) {\r\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\r\n }\r\n setCommonStore((state) => {\r\n state.elements.push(wall);\r\n state.selectedElement = wall;\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n },\r\n } as UndoableAddWall;\r\n addUndoable(undoableAdd);\r\n };\r\n\r\n const handleUndoableResizeWall = (element: WallModel) => {\r\n const autoDeletedElement = useStore.getState().getAutoDeletedElements();\r\n const undoableResize = {\r\n name: 'Resize Wall',\r\n timestamp: Date.now(),\r\n resizedElementId: element.id,\r\n resizedElementType: element.type,\r\n oldPosition: oldPositionRef.current.clone(),\r\n newPosition: newPositionRef.current.clone(),\r\n oldDimension: oldDimensionRef.current.clone(),\r\n newDimension: newDimensionRef.current.clone(),\r\n oldAngle: oldAzimuthRef.current,\r\n newAngle: newAzimuthRef.current,\r\n oldJoints: [[...oldJointsRef.current[0]], [...oldJointsRef.current[1]]],\r\n newJoints: [[...newJointsRef.current[0]], [...newJointsRef.current[1]]],\r\n oldPoint: [[...oldPointRef.current[0]], [...oldPointRef.current[1]]],\r\n newPoint: [[...newPointRef.current[0]], [...newPointRef.current[1]]],\r\n flippedWallSide: flippedWallSide.current,\r\n autoDeletedElement: autoDeletedElement ? [...autoDeletedElement] : [],\r\n undo: () => {\r\n switch (undoableResize.flippedWallSide) {\r\n case FlippedWallSide.right:\r\n if (undoableResize.newJoints[1]) {\r\n const rightWall = getElementById(undoableResize.newJoints[1][0]);\r\n if (rightWall) {\r\n flipWallsCounterClockwise(rightWall as WallModel);\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.left:\r\n if (undoableResize.newJoints[0]) {\r\n const leftWall = getElementById(undoableResize.newJoints[0][0]);\r\n if (leftWall) {\r\n flipWallsClockwise(leftWall as WallModel);\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.loop:\r\n if (undoableResize.newJoints[0] && undoableResize.newJoints[1]) {\r\n flipWallLoop(undoableResize.resizedElementId);\r\n } else if (undoableResize.newJoints[1]) {\r\n const rightWall = getElementById(undoableResize.newJoints[1][0]);\r\n if (rightWall) {\r\n flipWallsCounterClockwise(rightWall as WallModel);\r\n }\r\n } else if (undoableResize.newJoints[0]) {\r\n const leftWall = getElementById(undoableResize.newJoints[0][0]);\r\n if (leftWall) {\r\n flipWallsClockwise(leftWall as WallModel);\r\n }\r\n }\r\n break;\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.resizedElementId) {\r\n const w = e as WallModel;\r\n w.cx = undoableResize.oldPosition.x;\r\n w.cy = undoableResize.oldPosition.y;\r\n w.cz = undoableResize.oldPosition.z;\r\n w.lx = undoableResize.oldDimension.x;\r\n w.ly = undoableResize.oldDimension.y;\r\n w.lz = undoableResize.oldDimension.z;\r\n w.relativeAngle = undoableResize.oldAngle;\r\n w.leftJoints = [...undoableResize.oldJoints[0]];\r\n w.rightJoints = [...undoableResize.oldJoints[1]];\r\n w.leftPoint = [...undoableResize.oldPoint[0]];\r\n w.rightPoint = [...undoableResize.oldPoint[1]];\r\n\r\n switch (undoableResize.flippedWallSide) {\r\n case FlippedWallSide.loop: {\r\n // old left\r\n if (undoableResize.oldJoints[0] !== undoableResize.newJoints[1]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).rightJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [undoableResize.resizedElementId];\r\n }\r\n }\r\n }\r\n }\r\n // old right\r\n else if (undoableResize.oldJoints[1] !== undoableResize.newJoints[0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).leftJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [undoableResize.resizedElementId];\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case FlippedWallSide.left:\r\n case FlippedWallSide.right: {\r\n // old left attach, do: new right detach\r\n if (!undoableResize.oldJoints[0] && undoableResize.newJoints[1]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall && n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n break;\r\n }\r\n }\r\n }\r\n // old right attach, do: new left detach\r\n else if (!undoableResize.oldJoints[1] && undoableResize.newJoints[0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall && n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n break;\r\n }\r\n }\r\n }\r\n // change old left attach side\r\n else if (undoableResize.flippedWallSide === FlippedWallSide.left && undoableResize.oldJoints[0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [w.id];\r\n }\r\n }\r\n }\r\n }\r\n // change old right attach side\r\n else if (undoableResize.flippedWallSide === FlippedWallSide.right && undoableResize.oldJoints[1]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [w.id];\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case FlippedWallSide.null: {\r\n // left handle\r\n if (undoableResize.oldJoints[0] !== undoableResize.newJoints[0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [w.id];\r\n }\r\n }\r\n }\r\n }\r\n // right handle\r\n if (undoableResize.oldJoints[1] !== undoableResize.newJoints[1]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [w.id];\r\n }\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n state.elements.push(...undoableResize.autoDeletedElement);\r\n state.resizeHandleType = null;\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n });\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n redo: () => {\r\n if (undoableResize.autoDeletedElement.length > 0) {\r\n removeElementById(undoableResize.autoDeletedElement[0].id, false, false, true);\r\n }\r\n const deletedIdSet = new Set(undoableResize.autoDeletedElement.map((e) => e.id));\r\n setCommonStore((state) => {\r\n state.elements = state.elements.filter((e) => !deletedIdSet.has(e.id));\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.resizedElementId) {\r\n const w = e as WallModel;\r\n w.cx = undoableResize.newPosition.x;\r\n w.cy = undoableResize.newPosition.y;\r\n w.cz = undoableResize.newPosition.z;\r\n w.lx = undoableResize.newDimension.x;\r\n w.ly = undoableResize.newDimension.y;\r\n w.lz = undoableResize.newDimension.z;\r\n\r\n switch (undoableResize.flippedWallSide) {\r\n case FlippedWallSide.left:\r\n w.relativeAngle = (undoableResize.newAngle + Math.PI) % TWO_PI;\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall && n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n break;\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n w.relativeAngle = (undoableResize.newAngle + Math.PI) % TWO_PI;\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall && n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n break;\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.loop:\r\n w.relativeAngle = (undoableResize.newAngle + Math.PI) % TWO_PI;\r\n w.leftJoints = [...undoableResize.newJoints[1]];\r\n w.rightJoints = [...undoableResize.newJoints[0]];\r\n w.leftPoint = [...undoableResize.newPoint[1]];\r\n w.rightPoint = [...undoableResize.newPoint[0]];\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).leftJoints = [w.id];\r\n }\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).rightJoints = [w.id];\r\n }\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.null:\r\n w.relativeAngle = undoableResize.newAngle;\r\n w.leftJoints = [...undoableResize.newJoints[0]];\r\n w.rightJoints = [...undoableResize.newJoints[1]];\r\n w.leftPoint = [...undoableResize.newPoint[0]];\r\n w.rightPoint = [...undoableResize.newPoint[1]];\r\n // left handle\r\n if (undoableResize.oldJoints[0][0] !== undoableResize.newJoints[0][0]) {\r\n // left handle\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).rightJoints = [w.id];\r\n }\r\n if (n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n // right handle\r\n if (undoableResize.oldJoints[1][0] !== undoableResize.newJoints[1][0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).leftJoints = [w.id];\r\n }\r\n if (n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n state.resizeHandleType = null;\r\n });\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n });\r\n });\r\n switch (undoableResize.flippedWallSide) {\r\n case FlippedWallSide.left: {\r\n const currWall = getElementById(undoableResize.resizedElementId) as WallModel;\r\n const targetWall = getElementById(undoableResize.newJoints[1][0]) as WallModel;\r\n flipWallsCounterClockwise(currWall, targetWall);\r\n break;\r\n }\r\n case FlippedWallSide.right: {\r\n const currWall = getElementById(undoableResize.resizedElementId) as WallModel;\r\n const targetWall = getElementById(undoableResize.newJoints[0][0]) as WallModel;\r\n flipWallsClockwise(currWall, targetWall);\r\n break;\r\n }\r\n case FlippedWallSide.loop:\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n flipWallLoop(undoableResize.resizedElementId);\r\n break;\r\n }\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n } as UndoableResizeWall;\r\n addUndoable(undoableResize);\r\n setCommonStore((state) => {\r\n state.actionState.wallHeight = element.lz;\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = [];\r\n });\r\n };\r\n\r\n const handleUndoableMoveWall = (wall: WallModel, newAngle: number, newJoints: string[][]) => {\r\n if (!wall.roofId) {\r\n const undoableMove = {\r\n name: 'Move Wall',\r\n timestamp: Date.now(),\r\n id: wall.id,\r\n oldPoints: [[...oldPointRef.current[0]], [...oldPointRef.current[1]]],\r\n newPoints: [[...wall.leftPoint], [...wall.rightPoint]],\r\n oldJoints: [[...oldJointsRef.current[0]], [...oldJointsRef.current[1]]],\r\n newJoints: [[...newJoints[0]], [...newJoints[1]]],\r\n oldAngle: oldAzimuthRef.current,\r\n newAngle: newAngle,\r\n flippedWallSide: flippedWallSide.current,\r\n undo() {\r\n switch (this.flippedWallSide) {\r\n case FlippedWallSide.loop:\r\n flipWallLoop(this.id);\r\n break;\r\n case FlippedWallSide.left:\r\n const lw = getElementById(this.newJoints[0][0]) as WallModel;\r\n if (lw) {\r\n flipWallsClockwise(lw);\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n const rw = getElementById(this.newJoints[1][0]) as WallModel;\r\n if (rw) {\r\n flipWallsCounterClockwise(rw);\r\n }\r\n break;\r\n }\r\n const [oldLeftJoints, oldRightJoints] = this.oldJoints;\r\n const [newLeftJoints, newRightJoints] = this.newJoints;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === this.id) {\r\n const [leftPoint, rightPoint] = this.oldPoints;\r\n e.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n e.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n e.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n const w = e as WallModel;\r\n w.relativeAngle = this.oldAngle;\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n w.leftJoints = [...oldLeftJoints];\r\n w.rightJoints = [...oldRightJoints];\r\n break;\r\n }\r\n }\r\n state.resizeHandleType = null;\r\n });\r\n if (oldLeftJoints[0] !== newLeftJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldLeftJoints[0]) {\r\n (e as WallModel).rightJoints = [this.id];\r\n }\r\n if (e.id === newLeftJoints[0]) {\r\n if (this.flippedWallSide !== FlippedWallSide.left) {\r\n (e as WallModel).rightJoints = [];\r\n } else {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (oldRightJoints[0] !== newRightJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldRightJoints[0]) {\r\n (e as WallModel).leftJoints = [this.id];\r\n }\r\n if (e.id === newRightJoints[0]) {\r\n if (this.flippedWallSide !== FlippedWallSide.right) {\r\n (e as WallModel).leftJoints = [];\r\n } else {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n redo() {\r\n const [oldLeftJoints, oldRightJoints] = this.oldJoints;\r\n const [newLeftJoints, newRightJoints] = this.newJoints;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === this.id && e.type === ObjectType.Wall) {\r\n const [leftPoint, rightPoint] = this.newPoints;\r\n e.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n e.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n e.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n const w = e as WallModel;\r\n w.relativeAngle = this.newAngle;\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n w.leftJoints = [...newLeftJoints];\r\n w.rightJoints = [...newRightJoints];\r\n break;\r\n }\r\n }\r\n });\r\n if (oldLeftJoints[0] !== newLeftJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldLeftJoints[0]) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n if (e.id === newLeftJoints[0]) {\r\n if (this.flippedWallSide === FlippedWallSide.right) {\r\n (e as WallModel).leftJoints = [this.id];\r\n } else {\r\n (e as WallModel).rightJoints = [this.id];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (oldRightJoints[0] !== newRightJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldRightJoints[0]) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n if (e.id === newRightJoints[0]) {\r\n if (this.flippedWallSide === FlippedWallSide.right) {\r\n (e as WallModel).rightJoints = [this.id];\r\n } else {\r\n (e as WallModel).leftJoints = [this.id];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n switch (this.flippedWallSide) {\r\n case FlippedWallSide.loop:\r\n flipWallLoop(this.id);\r\n break;\r\n case FlippedWallSide.left:\r\n const lw = getElementById(this.newJoints[0][0]) as WallModel;\r\n if (lw) {\r\n flipWallsCounterClockwise(lw);\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n const rw = getElementById(this.newJoints[1][0]) as WallModel;\r\n if (rw) {\r\n flipWallsClockwise(rw);\r\n }\r\n break;\r\n }\r\n setCommonStore((state) => {\r\n state.resizeHandleType = null;\r\n });\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n } as UndoableMoveWall;\r\n addUndoable(undoableMove);\r\n } else {\r\n listenToAutoDeletionRef.current = true;\r\n undoableMoveWallArgsRef.current = { wall, newAngle, newJoints: [[...newJoints[0]], [...newJoints[1]]] };\r\n }\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.button === 2) {\r\n if (e.altKey) {\r\n selectMe(id, e, ActionType.Select);\r\n }\r\n return;\r\n }\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = null;\r\n });\r\n if (useStore.getState().objectTypeToAdd !== ObjectType.Window && !isAddingElement()) {\r\n selectMe(id, e, ActionType.Select);\r\n }\r\n const selectedElement = getSelectedElement();\r\n let bypass = false;\r\n if (\r\n e.intersections[0].object.name === ObjectType.Polygon &&\r\n useStore.getState().objectTypeToAdd !== ObjectType.None\r\n ) {\r\n bypass = true;\r\n }\r\n // no child of this foundation is clicked\r\n if (selectedElement?.id === id || bypass) {\r\n if (legalOnFoundation(useStore.getState().objectTypeToAdd)) {\r\n if (foundationModel) {\r\n setShowGrid(true);\r\n const position = e.intersections.filter(\r\n (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\r\n )[0].point;\r\n const addedElement = addElement(foundationModel, position);\r\n if (addedElement) {\r\n handleUndoableAdd(addedElement);\r\n }\r\n setCommonStore((state) => {\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n } else {\r\n useRefStore.getState().selectNone();\r\n useRefStore.setState((state) => {\r\n state.foundationRef = groupRef;\r\n });\r\n }\r\n }\r\n // a child of this foundation is clicked\r\n else {\r\n if (selectedElement && selectedElement.parentId === id) {\r\n if (legalOnFoundation(selectedElement.type)) {\r\n grabRef.current = selectedElement;\r\n if (selectedElement.type === ObjectType.Wall && !isSettingWallStartPointRef.current) {\r\n elementsStateBeforeResizingRef.current = [...useStore.getState().elements];\r\n }\r\n setShowGrid(true);\r\n oldPositionRef.current.set(selectedElement.cx, selectedElement.cy, selectedElement.cz);\r\n oldDimensionRef.current.set(selectedElement.lx, selectedElement.ly, selectedElement.lz);\r\n switch (selectedElement.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n oldAzimuthRef.current = (selectedElement as SolarCollector).relativeAzimuth;\r\n break;\r\n case ObjectType.Polygon:\r\n oldVerticesRef.current = (selectedElement as PolygonModel).vertices.map((v) => ({ ...v }));\r\n break;\r\n case ObjectType.Wall:\r\n const wall = selectedElement as WallModel;\r\n oldAzimuthRef.current = wall.relativeAngle;\r\n oldJointsRef.current = [[...wall.leftJoints], [...wall.rightJoints]];\r\n oldPointRef.current = [[...wall.leftPoint], [...wall.rightPoint]];\r\n wallNewLeftJointIdRef.current = wall.leftJoints[0];\r\n wallNewRightJointIdRef.current = wall.rightJoints[0];\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (isSettingWallStartPointRef.current && addedWallIdRef.current && baseRef.current) {\r\n const intersects = ray.intersectObjects([baseRef.current]);\r\n if (intersects.length === 0) return;\r\n let p = Util.wallRelativePosition(intersects[0].point, foundationModel);\r\n\r\n if (wallAuxToWallArray[0].position) {\r\n p.setX(wallAuxToWallArray[0].position[0]);\r\n p.setY(wallAuxToWallArray[0].position[1]);\r\n }\r\n\r\n const { id: targetID, point: targetPoint, side: targetSide, jointId: targetJointId } = findMagnetPoint(p, 1.5);\r\n p = updatePointer(p, targetPoint);\r\n\r\n let resizeHandleType = ResizeHandleType.LowerRight;\r\n\r\n // attach to other wall\r\n if (targetID) {\r\n const targetWall = getElementById(targetID) as WallModel;\r\n\r\n // left to right\r\n if (targetSide === WallSide.Right) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === addedWallIdRef.current) {\r\n const wall = e as WallModel;\r\n wall.cx = p.x;\r\n wall.cy = p.y;\r\n if (targetWall.rightJoints.length === 0) {\r\n wall.leftJoints = [targetWall.id];\r\n }\r\n }\r\n if (e.id === targetID && targetWall.rightJoints.length === 0) {\r\n (e as WallModel).rightJoints = addedWallIdRef.current ? [addedWallIdRef.current] : [];\r\n }\r\n }\r\n }\r\n });\r\n }\r\n // left to left\r\n else if (targetSide === WallSide.Left && !targetJointId) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === addedWallIdRef.current) {\r\n const wall = e as WallModel;\r\n wall.cx = p.x;\r\n wall.cy = p.y;\r\n if (targetWall.leftJoints.length === 0) {\r\n wall.rightJoints = [targetWall.id];\r\n }\r\n }\r\n if (e.id === targetID && targetWall.leftJoints.length === 0) {\r\n (e as WallModel).leftJoints = addedWallIdRef.current ? [addedWallIdRef.current] : [];\r\n }\r\n }\r\n }\r\n });\r\n resizeHandleType = ResizeHandleType.LowerLeft;\r\n }\r\n }\r\n // no attach to wall\r\n else {\r\n setElementPosition(addedWallIdRef.current, p.x, p.y);\r\n }\r\n isSettingWallStartPointRef.current = false;\r\n isSettingWallEndPointRef.current = true;\r\n updateWallLeftPointById(addedWallIdRef.current, [p.x, p.y, p.z]);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = resizeHandleType;\r\n state.resizeAnchor = Util.wallAbsolutePosition(p, foundationModel);\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n grabRef.current = selectedElement;\r\n }\r\n };\r\n\r\n const handlePointerUp = (e: ThreeEvent) => {\r\n if (e.altKey && e.button === 2) {\r\n // for pasting to the right-clicked position while the alt key is held down\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n setCommonStore((state) => {\r\n state.pastePoint.copy(e.intersections[0].point);\r\n state.clickObjectType = ObjectType.Foundation;\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n });\r\n const pastedElements = pasteElements();\r\n if (pastedElements.length > 0) {\r\n const undoablePaste = {\r\n name: 'Paste to Point',\r\n timestamp: Date.now(),\r\n pastedElements: pastedElements.map((m) => ({ ...m })),\r\n undo: () => {\r\n for (const elem of undoablePaste.pastedElements) {\r\n removeElementById(elem.id, false);\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoablePaste.pastedElements);\r\n state.selectedElement = undoablePaste.pastedElements[0];\r\n });\r\n },\r\n } as UndoablePaste;\r\n addUndoable(undoablePaste);\r\n }\r\n }\r\n }\r\n if (\r\n !grabRef.current ||\r\n grabRef.current.parentId !== id ||\r\n grabRef.current.type === ObjectType.Tree ||\r\n grabRef.current.type === ObjectType.Flower ||\r\n grabRef.current.type === ObjectType.Human\r\n )\r\n return;\r\n const elem = getElementById(grabRef.current.id);\r\n if (!elem) return;\r\n switch (elem.type) {\r\n case ObjectType.Wall: {\r\n const wall = elem as WallModel;\r\n if (isSettingWallStartPointRef.current) {\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n state.addedWallId = null;\r\n if (state.actionModeLock) {\r\n state.objectTypeToAdd = ObjectType.Wall;\r\n InnerCommonStoreState.selectNone(state);\r\n }\r\n });\r\n if (addedWallIdRef.current) {\r\n wallMapOnFoundation.current.delete(addedWallIdRef.current);\r\n }\r\n addedWallIdRef.current = null;\r\n isSettingWallStartPointRef.current = false;\r\n isSettingWallEndPointRef.current = false;\r\n } else if (isSettingWallEndPointRef.current && addedWallIdRef.current && baseRef.current) {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n setCommonStore((state) => {\r\n if (state.actionModeLock) {\r\n state.objectTypeToAdd = ObjectType.Wall;\r\n InnerCommonStoreState.selectNone(state);\r\n }\r\n state.addedWallId = null;\r\n if (wall.lx === 0 && elementsStateBeforeResizingRef.current) {\r\n state.elements = [...elementsStateBeforeResizingRef.current];\r\n if (addedWallIdRef.current) {\r\n wallMapOnFoundation.current.delete(addedWallIdRef.current);\r\n }\r\n } else {\r\n handleUndoableAddWall(wall as WallModel);\r\n wallMapOnFoundation.current.set(wall.id, wall);\r\n }\r\n });\r\n addedWallIdRef.current = null;\r\n isSettingWallEndPointRef.current = false;\r\n } else {\r\n if (useStore.getState().resizeHandleType) {\r\n if (wall.lx > 0.45) {\r\n wallMapOnFoundation.current.set(wall.id, wall);\r\n newPositionRef.current.set(wall.cx, wall.cy, wall.cz);\r\n newDimensionRef.current.set(wall.lx, wall.ly, wall.lz);\r\n newAzimuthRef.current = wall.relativeAngle;\r\n newJointsRef.current = [[...wall.leftJoints], [...wall.rightJoints]];\r\n newPointRef.current = [[...wall.leftPoint], [...wall.rightPoint]];\r\n handleUndoableResizeWall(wall);\r\n } else {\r\n setCommonStore((state) => {\r\n if (elementsStateBeforeResizingRef.current) {\r\n state.elements = [...elementsStateBeforeResizingRef.current];\r\n elementsStateBeforeResizingRef.current = null;\r\n }\r\n });\r\n }\r\n } else if (useStore.getState().moveHandleType) {\r\n let newAngle = wall.relativeAngle;\r\n let newLeftJoints: string[] = [];\r\n let newRightJoints: string[] = [];\r\n\r\n if (wallNewLeftJointIdRef.current) {\r\n // detach old left wall\r\n if (\r\n wall.leftJoints.length > 0 &&\r\n (wallNewLeftJointIdRef.current !== wall.leftJoints[0] ||\r\n (wallNewLeftJointIdRef.current === wall.leftJoints[0] && flipCurrWallRef.current))\r\n ) {\r\n updateWallRightJointsById(wall.leftJoints[0], []);\r\n }\r\n // attach new\r\n if (flipCurrWallRef.current) {\r\n updateWallLeftJointsById(wallNewLeftJointIdRef.current, [wall.id]);\r\n newRightJoints = [wallNewLeftJointIdRef.current];\r\n } else {\r\n newLeftJoints = [wallNewLeftJointIdRef.current];\r\n if (flipLeftHandSideWallRef.current) {\r\n updateWallLeftJointsById(wallNewLeftJointIdRef.current, [wall.id]);\r\n const lw = getElementById(wallNewLeftJointIdRef.current) as WallModel;\r\n if (lw) {\r\n flipWallsCounterClockwise(lw);\r\n }\r\n } else {\r\n updateWallRightJointsById(wallNewLeftJointIdRef.current, [wall.id]);\r\n }\r\n }\r\n }\r\n // detach old\r\n else if (wall.leftJoints.length > 0 && wall.leftJoints[0] !== wallNewRightJointIdRef.current) {\r\n newLeftJoints = [];\r\n updateWallRightJointsById(wall.leftJoints[0], []);\r\n }\r\n\r\n if (wallNewRightJointIdRef.current) {\r\n // detach old right wall\r\n if (\r\n wall.rightJoints.length > 0 &&\r\n (wallNewRightJointIdRef.current !== wall.rightJoints[0] ||\r\n (wallNewRightJointIdRef.current === wall.rightJoints[0] && flipCurrWallRef.current)) &&\r\n wall.rightJoints[0] !== wallNewLeftJointIdRef.current\r\n ) {\r\n updateWallLeftJointsById(wall.rightJoints[0], []);\r\n }\r\n // attach new\r\n if (flipCurrWallRef.current) {\r\n updateWallRightJointsById(wallNewRightJointIdRef.current, [wall.id]);\r\n newLeftJoints = [wallNewRightJointIdRef.current!];\r\n } else {\r\n newRightJoints = [wallNewRightJointIdRef.current];\r\n if (flipRightHandSideWallRef.current) {\r\n updateWallRightJointsById(wallNewRightJointIdRef.current, [wall.id]);\r\n const rw = getElementById(wallNewRightJointIdRef.current) as WallModel;\r\n if (rw) {\r\n flipWallsClockwise(rw);\r\n }\r\n } else {\r\n updateWallLeftJointsById(wallNewRightJointIdRef.current, [wall.id]);\r\n }\r\n }\r\n }\r\n // detach old\r\n else if (wall.rightJoints.length > 0 && wall.rightJoints[0] !== wallNewLeftJointIdRef.current) {\r\n newRightJoints = [];\r\n updateWallLeftJointsById(wall.rightJoints[0], []);\r\n }\r\n\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === wall.id && e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n if (flipCurrWallRef.current) {\r\n newAngle = (w.relativeAngle + Math.PI) % TWO_PI;\r\n w.relativeAngle = newAngle;\r\n [w.leftPoint, w.rightPoint] = [[...w.rightPoint], [...w.leftPoint]];\r\n }\r\n\r\n if (newLeftJoints.length === 0 && newRightJoints.length === 0) {\r\n w.roofId = null;\r\n } else if (newLeftJoints.length > 0) {\r\n const newLeftWall = state.elements.find((e) => e.id === newLeftJoints[0]) as WallModel;\r\n if (newLeftWall) {\r\n w.roofId = newLeftWall.roofId;\r\n }\r\n } else if (newRightJoints.length > 0) {\r\n const newRightWall = state.elements.find((e) => e.id === newRightJoints[0]) as WallModel;\r\n if (newRightWall) {\r\n w.roofId = newRightWall.roofId;\r\n }\r\n }\r\n\r\n w.leftJoints = [...newLeftJoints];\r\n w.rightJoints = [...newRightJoints];\r\n break;\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n\r\n checkWallLoop(wall.id);\r\n\r\n handleUndoableMoveWall(wall, newAngle, [[...newLeftJoints], [...newRightJoints]]);\r\n\r\n flipCurrWallRef.current = false;\r\n flipLeftHandSideWallRef.current = false;\r\n flipRightHandSideWallRef.current = false;\r\n wallNewLeftJointIdRef.current = null;\r\n wallNewRightJointIdRef.current = null;\r\n }\r\n }\r\n flippedWallSide.current = FlippedWallSide.null;\r\n setCommonStore((state) => {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n setWallAuxToAxis({ show: false, direction: null, position: null });\r\n setWallAuxToWallArray([\r\n { show: false, direction: null, position: null },\r\n { show: false, direction: null, position: null },\r\n ]);\r\n break;\r\n }\r\n case ObjectType.Polygon: {\r\n if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType) {\r\n newVerticesRef.current = (elem as PolygonModel).vertices.map((v) => ({ ...v }));\r\n const undoableEditPolygon = {\r\n name: useStore.getState().moveHandleType ? 'Move Polygon' : 'Resize Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldVerticesRef.current,\r\n newValue: newVerticesRef.current,\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n undo: () => {\r\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.oldValue as Point2[]);\r\n },\r\n redo: () => {\r\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.newValue as Point2[]);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableEditPolygon);\r\n }\r\n break;\r\n }\r\n default: {\r\n if (useStore.getState().resizeHandleType) {\r\n newPositionRef.current.set(elem.cx, elem.cy, elem.cz);\r\n newDimensionRef.current.set(elem.lx, elem.ly, elem.lz);\r\n if (\r\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE ||\r\n newDimensionRef.current.distanceToSquared(oldDimensionRef.current) > ZERO_TOLERANCE\r\n ) {\r\n const undoableResize = {\r\n name: 'Resize',\r\n timestamp: Date.now(),\r\n resizedElementId: grabRef.current.id,\r\n resizedElementType: grabRef.current.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n oldLx: oldDimensionRef.current.x,\r\n oldLy: oldDimensionRef.current.y,\r\n oldLz: oldDimensionRef.current.z,\r\n newLx: newDimensionRef.current.x,\r\n newLy: newDimensionRef.current.y,\r\n newLz: newDimensionRef.current.z,\r\n undo: () => {\r\n setElementPosition(\r\n undoableResize.resizedElementId,\r\n undoableResize.oldCx,\r\n undoableResize.oldCy,\r\n undoableResize.oldCz,\r\n );\r\n setElementSize(\r\n undoableResize.resizedElementId,\r\n undoableResize.oldLx,\r\n undoableResize.oldLy,\r\n undoableResize.oldLz,\r\n );\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableResize.resizedElementId,\r\n undoableResize.newCx,\r\n undoableResize.newCy,\r\n undoableResize.newCz,\r\n );\r\n setElementSize(\r\n undoableResize.resizedElementId,\r\n undoableResize.newLx,\r\n undoableResize.newLy,\r\n undoableResize.newLz,\r\n );\r\n },\r\n } as UndoableResize;\r\n addUndoable(undoableResize);\r\n }\r\n } else if (useStore.getState().rotateHandleType) {\r\n // currently, solar collectors are the only type of child that can be rotated\r\n if (Util.isSolarCollector(grabRef.current)) {\r\n const collector = grabRef.current as SolarCollector;\r\n if (Math.abs(newAzimuthRef.current - oldAzimuthRef.current) > ZERO_TOLERANCE) {\r\n if (isSolarCollectorNewAzimuthOk(collector, newAzimuthRef.current)) {\r\n setCommonStore((state) => {\r\n state.selectedElementAngle = newAzimuthRef.current;\r\n });\r\n const undoableRotate = {\r\n name: 'Rotate',\r\n timestamp: Date.now(),\r\n oldValue: oldAzimuthRef.current,\r\n newValue: newAzimuthRef.current,\r\n changedElementId: collector.id,\r\n changedElementType: collector.type,\r\n undo: () => {\r\n updateSolarCollectorRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n updateSolarCollectorRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableRotate);\r\n } else {\r\n updateSolarCollectorRelativeAzimuthById(collector.id, oldAzimuthRef.current);\r\n }\r\n }\r\n }\r\n } else {\r\n // for moving sensors, lights, and solar collectors\r\n newPositionRef.current.set(elem.cx, elem.cy, elem.cz);\r\n if (newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE) {\r\n let accept = true;\r\n if (Util.isSolarCollector(elem)) {\r\n accept = isSolarCollectorNewPositionOk(elem as SolarCollector, elem.cx, elem.cy);\r\n }\r\n if (accept) {\r\n const undoableMove = {\r\n name: 'Move',\r\n timestamp: Date.now(),\r\n movedElementId: elem.id,\r\n movedElementType: elem.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n undo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.oldCx,\r\n undoableMove.oldCy,\r\n undoableMove.oldCz,\r\n );\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.newCx,\r\n undoableMove.newCy,\r\n undoableMove.newCz,\r\n );\r\n },\r\n } as UndoableMove;\r\n addUndoable(undoableMove);\r\n } else {\r\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n setShowGrid(false);\r\n grabRef.current = null;\r\n setCommonStore((state) => {\r\n state.resizeHandleType = null;\r\n state.moveHandleType = null;\r\n });\r\n };\r\n\r\n const wallNewLeftJointIdRef = useRef(null);\r\n const wallNewRightJointIdRef = useRef(null);\r\n const flipCurrWallRef = useRef(false);\r\n const flipRightHandSideWallRef = useRef(false);\r\n const flipLeftHandSideWallRef = useRef(false);\r\n\r\n const getWallAngleByPointer = (anchor: Vector3, pointer: Vector3, handleType: ResizeHandleType) => {\r\n let angle =\r\n Math.atan2(pointer.y - anchor.y, pointer.x - anchor.x) -\r\n (handleType === ResizeHandleType.LowerLeft ? Math.PI : 0);\r\n angle = angle >= 0 ? angle : (TWO_PI + angle) % TWO_PI;\r\n return angle;\r\n };\r\n\r\n const alignToWall = (p: Vector3, targetId?: string | null) => {\r\n const THRESHOLD = 1;\r\n let alignedX: number | null = null;\r\n let alignedY: number | null = null;\r\n let minX = Infinity;\r\n let minY = Infinity;\r\n for (const [id, wall] of wallMapOnFoundation.current) {\r\n if (grabRef.current !== null && wall.id !== grabRef.current.id && wall.id !== targetId) {\r\n const leftXDiff = Math.abs(p.x - wall.leftPoint[0]);\r\n const rightXDiff = Math.abs(p.x - wall.rightPoint[0]);\r\n const leftYDiff = Math.abs(p.y - wall.leftPoint[1]);\r\n const rightYDiff = Math.abs(p.y - wall.rightPoint[1]);\r\n if (leftXDiff < THRESHOLD && leftXDiff < minX) {\r\n minX = leftXDiff;\r\n alignedX = wall.leftPoint[0];\r\n }\r\n if (rightXDiff < THRESHOLD && rightXDiff < minX) {\r\n minX = rightXDiff;\r\n alignedX = wall.rightPoint[0];\r\n }\r\n if (leftYDiff < THRESHOLD && leftYDiff < minY) {\r\n minY = leftYDiff;\r\n alignedY = wall.leftPoint[1];\r\n }\r\n if (rightYDiff < THRESHOLD && rightYDiff < minY) {\r\n minY = rightYDiff;\r\n alignedY = wall.rightPoint[1];\r\n }\r\n }\r\n }\r\n\r\n return [alignedX, alignedY];\r\n };\r\n\r\n const alignToAxis = (anchor: Vector3, p: Vector3, handle: ResizeHandleType) => {\r\n const ALIGN_ANGLE_THRESHOLD = 0.05;\r\n const ALIGN_LENGTH_THRESHOLD = 1;\r\n const angle = getWallAngleByPointer(anchor, p, handle);\r\n let alignedX: number | null = null;\r\n let alignedY: number | null = null;\r\n if (\r\n angle < ALIGN_ANGLE_THRESHOLD ||\r\n angle > TWO_PI - ALIGN_ANGLE_THRESHOLD ||\r\n Math.abs(angle - Math.PI) < ALIGN_ANGLE_THRESHOLD ||\r\n Math.abs(p.y - anchor.y) < ALIGN_LENGTH_THRESHOLD\r\n ) {\r\n alignedY = anchor.y;\r\n } else if (\r\n Math.abs(angle - Math.PI / 2) < ALIGN_ANGLE_THRESHOLD ||\r\n Math.abs(angle - (3 * Math.PI) / 2) < ALIGN_ANGLE_THRESHOLD ||\r\n Math.abs(p.x - anchor.x) < ALIGN_LENGTH_THRESHOLD\r\n ) {\r\n alignedX = anchor.x;\r\n }\r\n return [alignedX, alignedY];\r\n };\r\n\r\n const alignPointer = (anchor: Vector3, p: Vector3, handle: ResizeHandleType, targetId?: string | null) => {\r\n const [alignedToWallX, alignedToWallY] = alignToWall(p);\r\n const [alignedToAxisX, alignedToAxisY] = alignToAxis(anchor, p, handle); // coordinates after align to axis\r\n\r\n const alignedX = getClosestAlignedPoint(p.x, alignedToWallX, alignedToAxisX);\r\n const alignedY = getClosestAlignedPoint(p.y, alignedToWallY, alignedToAxisY);\r\n\r\n return new Vector3(alignedX, alignedY, p.z);\r\n };\r\n\r\n const getClosestAlignedPoint = (p: number, val1: number | null, val2: number | null) => {\r\n if (val1 !== null && val2 !== null) {\r\n return Math.abs(val1 - p) < Math.abs(val2 - p) ? val1 : val2;\r\n } else if (val1 !== null) {\r\n return val1;\r\n } else if (val2 !== null) {\r\n return val2;\r\n }\r\n return p;\r\n };\r\n\r\n const checkAndSetPosAlignToWall = (p: Vector3, idx = 0, targetId?: string | null) => {\r\n let [minX, minY] = [Infinity, Infinity];\r\n let alignedX: number | null = null;\r\n let alignedY: number | null = null;\r\n for (const [id, wall] of wallMapOnFoundation.current) {\r\n if (grabRef.current !== null && wall.id !== grabRef.current.id && wall.id !== targetId) {\r\n const leftXDiff = Math.abs(p.x - wall.leftPoint[0]);\r\n const rightXDiff = Math.abs(p.x - wall.rightPoint[0]);\r\n if (leftXDiff < 0.01 && leftXDiff < minX) {\r\n minX = leftXDiff;\r\n alignedX = wall.leftPoint[0];\r\n }\r\n if (rightXDiff < 0.01 && rightXDiff < minX) {\r\n minX = rightXDiff;\r\n alignedX = wall.rightPoint[0];\r\n }\r\n\r\n const leftYDiff = Math.abs(p.y - wall.leftPoint[1]);\r\n const rightYDiff = Math.abs(p.y - wall.rightPoint[1]);\r\n if (leftYDiff < 0.01 && leftYDiff < minY) {\r\n minY = leftYDiff;\r\n alignedY = wall.leftPoint[1];\r\n }\r\n if (rightYDiff < 0.01 && rightYDiff < minY) {\r\n minY = rightYDiff;\r\n alignedY = wall.rightPoint[1];\r\n }\r\n }\r\n }\r\n setWallAuxToWallArray(\r\n produce((draft) => {\r\n if (alignedX !== null && alignedY !== null) {\r\n draft[idx].direction = 'xy';\r\n draft[idx].position = [alignedX, alignedY];\r\n } else if (alignedX !== null) {\r\n draft[idx].direction = 'y';\r\n draft[idx].position = [alignedX, p.y];\r\n } else if (alignedY !== null) {\r\n draft[idx].direction = 'x';\r\n draft[idx].position = [p.x, alignedY];\r\n } else {\r\n draft[idx].direction = null;\r\n draft[idx].position = null;\r\n }\r\n }),\r\n );\r\n return [alignedX !== null, alignedY !== null];\r\n };\r\n\r\n const checkAndSetPosAlignToAxis = (p: Vector3, angle: number) => {\r\n if (Math.abs(angle) < 0.01 || Math.abs(angle - Math.PI) < 0.01) {\r\n setWallAuxToAxis((prev) => ({ ...prev, direction: 'x', position: [p.x, p.y] }));\r\n return [true, false];\r\n } else if (Math.abs(angle - Math.PI / 2) < 0.01 || Math.abs(angle - (3 * Math.PI) / 2) < 0.01) {\r\n setWallAuxToAxis((prev) => ({ ...prev, direction: 'y', position: [p.x, p.y] }));\r\n return [false, true];\r\n } else {\r\n setWallAuxToAxis((prev) => ({ ...prev, direction: null, position: null }));\r\n return [false, false];\r\n }\r\n };\r\n\r\n const setShowWallAux = (toWall: boolean, toAxis: boolean) => {\r\n setWallAuxToWallArray(\r\n produce((draft) => {\r\n draft[0].show = toWall;\r\n }),\r\n );\r\n setWallAuxToAxis((prev) => ({ ...prev, show: toAxis }));\r\n };\r\n\r\n const handleShowAuxiliary = (p: Vector3, angle: number) => {\r\n const [isAlignedToWallX, isAlignedToWallY] = checkAndSetPosAlignToWall(p);\r\n const [isAlignedToAxisX, isAlignedToAxisY] = checkAndSetPosAlignToAxis(p, angle);\r\n\r\n if (isAlignedToWallX && isAlignedToWallY) {\r\n setShowWallAux(true, false);\r\n } else if (isAlignedToWallX) {\r\n setShowWallAux(true, !isAlignedToAxisY && isAlignedToAxisX);\r\n } else if (isAlignedToWallY) {\r\n setShowWallAux(true, !isAlignedToAxisX && isAlignedToAxisY);\r\n } else {\r\n setShowWallAux(false, isAlignedToAxisX || isAlignedToAxisY);\r\n }\r\n };\r\n\r\n // handle pointer move\r\n const handlePointerMove = (e: ThreeEvent) => {\r\n if (!foundationModel) return;\r\n if (grabRef.current && Util.isSolarCollector(grabRef.current)) return;\r\n const objectTypeToAdd = useStore.getState().objectTypeToAdd;\r\n if (!grabRef.current && !addedWallIdRef.current && objectTypeToAdd !== ObjectType.Wall) return;\r\n if (grabRef.current?.parentId !== id && objectTypeToAdd === ObjectType.None) return;\r\n const moveHandleType = useStore.getState().moveHandleType;\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n setRayCast(e);\r\n if (baseRef.current) {\r\n const intersects = ray.intersectObjects([baseRef.current]);\r\n if (intersects.length === 0) return;\r\n let p = intersects[0].point;\r\n if (grabRef.current && grabRef.current.type && !grabRef.current.locked && intersects.length > 0) {\r\n switch (grabRef.current.type) {\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n p = Util.relativeCoordinates(p.x, p.y, p.z, foundationModel);\r\n setElementPosition(grabRef.current.id, p.x, p.y);\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = grabRef.current as PolygonModel;\r\n if (moveHandleType === MoveHandleType.Default) {\r\n // do not snap the centroid to the grid\r\n p = Util.relativeCoordinates(p.x, p.y, p.z, foundationModel);\r\n const centroid = Util.calculatePolygonCentroid(polygon.vertices);\r\n const dx = p.x - centroid.x;\r\n const dy = p.y - centroid.y;\r\n const copy = polygon.vertices.map((v) => ({ ...v }));\r\n copy.forEach((v: Point2) => {\r\n v.x += dx;\r\n v.y += dy;\r\n });\r\n // update all the vertices at once with the DEEP COPY above\r\n // do not update each vertex's position one by one (it is slower)\r\n updatePolygonVerticesById(polygon.id, copy);\r\n } else if (resizeHandleType === ResizeHandleType.Default) {\r\n // snap to the grid (do not call Util.relativeCoordinates because we have to snap in the middle)\r\n p.x -= foundationModel.cx;\r\n p.y -= foundationModel.cy;\r\n p.applyEuler(new Euler().fromArray(foundationModel.rotation.map((a) => -a)));\r\n p = useStore.getState().enableFineGrid ? Util.snapToFineGrid(p) : Util.snapToNormalGrid(p);\r\n p.x /= foundationModel.lx;\r\n p.y /= foundationModel.ly;\r\n updatePolygonVertexPositionById(polygon.id, polygon.selectedIndex, p.x, p.y);\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (useStore.getState().selectedElement?.type !== ObjectType.Wall) break;\r\n if (\r\n resizeHandleType &&\r\n (resizeHandleType === ResizeHandleType.LowerLeft || resizeHandleType === ResizeHandleType.LowerRight)\r\n ) {\r\n const anchor = Util.wallRelativePosition(resizeAnchor, foundationModel);\r\n p = Util.wallRelativePosition(p, foundationModel);\r\n\r\n let target: SnapTargetType | null = null;\r\n\r\n if (useStore.getState().enableFineGrid) {\r\n p = Util.snapToFineGrid(p);\r\n } else {\r\n target = findMagnetPoint(p, 1.5);\r\n if (target?.point) {\r\n p = target.point;\r\n } else {\r\n p = Util.snapToNormalGrid(p);\r\n p = alignPointer(anchor, p, resizeHandleType);\r\n\r\n target = findMagnetPoint(p, 1.5);\r\n if (target?.point) {\r\n p = target.point;\r\n }\r\n }\r\n }\r\n\r\n const angle = getWallAngleByPointer(anchor, p, resizeHandleType);\r\n handleShowAuxiliary(p, angle);\r\n\r\n const lx = p.distanceTo(anchor);\r\n const relativeCenter = new Vector3().addVectors(p, anchor).divideScalar(2);\r\n const leftPoint = resizeHandleType === ResizeHandleType.LowerLeft ? p : anchor;\r\n const rightPoint = resizeHandleType === ResizeHandleType.LowerLeft ? anchor : p;\r\n\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n wall.cx = relativeCenter.x;\r\n wall.cy = relativeCenter.y;\r\n wall.lx = lx;\r\n wall.relativeAngle = angle;\r\n wall.leftPoint = [leftPoint.x, leftPoint.y, 0];\r\n wall.rightPoint = [rightPoint.x, rightPoint.y, 0];\r\n break;\r\n }\r\n }\r\n });\r\n\r\n const currWall = getElementById(grabRef.current.id) as WallModel;\r\n if (currWall) {\r\n // attach to other wall\r\n if (target && target.point) {\r\n if (target.id && target.side && !target.jointId) {\r\n const targetWall = getElementById(target.id) as WallModel;\r\n if (targetWall) {\r\n // left to left\r\n if (\r\n resizeHandleType === ResizeHandleType.LowerLeft &&\r\n targetWall.leftJoints.length === 0 &&\r\n target.side === WallSide.Left\r\n ) {\r\n if (currWall.leftJoints.length > 0 && currWall.leftJoints[0] !== target.id) {\r\n const detachId = currWall.leftJoints[0];\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === detachId && e.type === ObjectType.Wall) {\r\n (e as WallModel).rightJoints = [];\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n flipWallsCounterClockwise(currWall, targetWall);\r\n }\r\n // right to right\r\n else if (\r\n resizeHandleType === ResizeHandleType.LowerRight &&\r\n targetWall.rightJoints.length === 0 &&\r\n target.side === WallSide.Right\r\n ) {\r\n if (currWall.rightJoints.length > 0 && currWall.rightJoints[0] !== target.id) {\r\n const detachId = currWall.rightJoints[0];\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === detachId && e.type === ObjectType.Wall) {\r\n (e as WallModel).leftJoints = [];\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n flipWallsClockwise(currWall, targetWall);\r\n }\r\n // right to left side\r\n else if (\r\n resizeHandleType === ResizeHandleType.LowerRight &&\r\n target.side === WallSide.Left &&\r\n targetWall.leftJoints.length === 0 &&\r\n targetWall.rightJoints[0] !== currWall.id\r\n ) {\r\n setCommonStore((state) => {\r\n let detachId: string | null = null;\r\n if (currWall.rightJoints.length > 0 && currWall.rightJoints[0] !== target?.id) {\r\n detachId = currWall.rightJoints[0];\r\n }\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === currWall.id) {\r\n (e as WallModel).rightJoints = [targetWall.id];\r\n }\r\n if (e.id === targetWall.id) {\r\n (e as WallModel).leftJoints = [currWall.id];\r\n }\r\n if (e.id === detachId) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n });\r\n }\r\n // left to right side\r\n else if (\r\n resizeHandleType === ResizeHandleType.LowerLeft &&\r\n target.side === WallSide.Right &&\r\n targetWall.rightJoints.length === 0 &&\r\n targetWall.leftJoints[0] !== currWall.id\r\n ) {\r\n setCommonStore((state) => {\r\n let detachId: string | null = null;\r\n if (currWall.leftJoints.length > 0 && currWall.leftJoints[0] !== target?.id) {\r\n detachId = currWall.leftJoints[0];\r\n }\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === currWall.id) {\r\n (e as WallModel).leftJoints = [targetWall.id];\r\n }\r\n if (e.id === targetWall.id) {\r\n (e as WallModel).rightJoints = [currWall.id];\r\n }\r\n if (e.id === detachId) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n checkWallLoop(currWall.id);\r\n }\r\n }\r\n }\r\n // detach\r\n else {\r\n if (resizeHandleType === ResizeHandleType.LowerRight && currWall.rightJoints.length > 0) {\r\n const targetWallId = currWall.rightJoints[0];\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === currWall.id) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n if (e.id === targetWallId) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n } else if (resizeHandleType === ResizeHandleType.LowerLeft && currWall.leftJoints.length > 0) {\r\n const targetWallId = currWall.leftJoints[0];\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === currWall.id) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n if (e.id === targetWallId) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n }\r\n }\r\n }\r\n } else if (moveHandleType) {\r\n const currWall = getElementById(grabRef.current.id) as WallModel;\r\n if (currWall) {\r\n p = Util.wallRelativePosition(p, foundationModel);\r\n\r\n const handleOffset = new Vector3();\r\n const euler = new Euler(0, 0, currWall.relativeAngle);\r\n if (moveHandleType === MoveHandleType.Lower) {\r\n handleOffset.setY(handleRadius);\r\n } else if (moveHandleType === MoveHandleType.Upper) {\r\n handleOffset.setY(-handleRadius - currWall.ly);\r\n }\r\n p.add(handleOffset.applyEuler(euler));\r\n\r\n const leftPoint = new Vector3().addVectors(p, new Vector3(-currWall.lx / 2, 0, 0).applyEuler(euler));\r\n const rightPoint = new Vector3().addVectors(p, new Vector3(currWall.lx / 2, 0, 0).applyEuler(euler));\r\n let leftFlip: boolean | null = null;\r\n let rightFlip: boolean | null = null;\r\n let stretched = false;\r\n\r\n flipCurrWallRef.current = false;\r\n flipLeftHandSideWallRef.current = false;\r\n flipRightHandSideWallRef.current = false;\r\n wallNewLeftJointIdRef.current = null;\r\n wallNewRightJointIdRef.current = null;\r\n\r\n const updateWallPointAfterSnap = (targetPoint: Vector3, side: 'left' | 'right') => {\r\n const point = side === 'left' ? leftPoint : rightPoint;\r\n const magnetOffset = new Vector3().subVectors(targetPoint, point);\r\n p.add(magnetOffset);\r\n leftPoint.add(magnetOffset);\r\n rightPoint.add(magnetOffset);\r\n };\r\n\r\n if (!useStore.getState().enableFineGrid) {\r\n let leftTarget = findMagnetPoint(leftPoint, 1);\r\n if (leftTarget.point) {\r\n updateWallPointAfterSnap(leftTarget.point, 'left');\r\n if (leftTarget.id && (!leftTarget.jointId || leftTarget.jointId === currWall.id)) {\r\n wallNewLeftJointIdRef.current = leftTarget.id;\r\n leftFlip = leftTarget.side === WallSide.Left;\r\n }\r\n } else {\r\n wallNewLeftJointIdRef.current = null;\r\n }\r\n\r\n let rightTarget = findMagnetPoint(rightPoint, 1);\r\n if (rightTarget.point) {\r\n if (!leftTarget.id) {\r\n updateWallPointAfterSnap(rightTarget.point, 'right');\r\n }\r\n if (\r\n rightTarget.id &&\r\n (!rightTarget.jointId || rightTarget.jointId === currWall.id) &&\r\n (leftTarget.id !== rightTarget.id || leftTarget.side !== rightTarget.side)\r\n ) {\r\n wallNewRightJointIdRef.current = rightTarget.id;\r\n rightFlip = rightTarget.side === WallSide.Right;\r\n }\r\n } else {\r\n wallNewRightJointIdRef.current = null;\r\n }\r\n\r\n if (!leftTarget.point && !rightTarget.point) {\r\n const [leftAlignedToWallX, leftAlignedToWallY] = alignToWall(leftPoint);\r\n const [rightAlignedToWallX, rightAlignedToWallY] = alignToWall(rightPoint);\r\n\r\n if (leftAlignedToWallX !== null || rightAlignedToWallX !== null) {\r\n const leftDiffX = (leftAlignedToWallX ?? Infinity) - leftPoint.x;\r\n const rightDiffX = (rightAlignedToWallX ?? Infinity) - rightPoint.x;\r\n const diffX = Math.min(leftDiffX, rightDiffX);\r\n leftPoint.setX(leftPoint.x + diffX);\r\n rightPoint.setX(rightPoint.x + diffX);\r\n p.setX(p.x + diffX);\r\n\r\n leftTarget = findMagnetPoint(leftPoint, 1);\r\n if (leftTarget.point) {\r\n updateWallPointAfterSnap(leftTarget.point, 'left');\r\n if (leftTarget.id && (!leftTarget.jointId || leftTarget.jointId === currWall.id)) {\r\n wallNewLeftJointIdRef.current = leftTarget.id;\r\n leftFlip = leftTarget.side === WallSide.Left;\r\n }\r\n } else {\r\n wallNewLeftJointIdRef.current = null;\r\n }\r\n }\r\n if (leftAlignedToWallY !== null || rightAlignedToWallY !== null) {\r\n const leftDiffY = (leftAlignedToWallY ?? Infinity) - leftPoint.y;\r\n const rightDiffY = (rightAlignedToWallY ?? Infinity) - rightPoint.y;\r\n const diffY = Math.min(leftDiffY, rightDiffY);\r\n leftPoint.setY(leftPoint.y + diffY);\r\n rightPoint.setY(rightPoint.y + diffY);\r\n p.setY(p.y + diffY);\r\n\r\n rightTarget = findMagnetPoint(rightPoint, 1);\r\n if (rightTarget.point) {\r\n if (!leftTarget.id) {\r\n updateWallPointAfterSnap(rightTarget.point, 'right');\r\n }\r\n if (\r\n rightTarget.id &&\r\n (!rightTarget.jointId || rightTarget.jointId === currWall.id) &&\r\n (leftTarget.id !== rightTarget.id || leftTarget.side !== rightTarget.side)\r\n ) {\r\n wallNewRightJointIdRef.current = rightTarget.id;\r\n rightFlip = rightTarget.side === WallSide.Right;\r\n }\r\n } else {\r\n wallNewRightJointIdRef.current = null;\r\n }\r\n }\r\n }\r\n\r\n const [isLeftAlignedToWallX, isLeftAlignedToWallY] = checkAndSetPosAlignToWall(leftPoint, 0);\r\n const [isRightAlignedToWallX, isRightAlignedToWallY] = checkAndSetPosAlignToWall(rightPoint, 1);\r\n setWallAuxToWallArray(\r\n produce((draft) => {\r\n draft[0].show = isLeftAlignedToWallX || isLeftAlignedToWallY;\r\n draft[1].show = isRightAlignedToWallX || isRightAlignedToWallY;\r\n }),\r\n );\r\n\r\n // *notice the different between false and null\r\n if ((leftFlip && rightFlip === null) || (rightFlip && leftFlip === null) || (leftFlip && rightFlip)) {\r\n flipCurrWallRef.current = true;\r\n } else if ((leftFlip && rightFlip === false) || (rightFlip && leftFlip === false)) {\r\n flipLeftHandSideWallRef.current = leftFlip;\r\n flipRightHandSideWallRef.current = rightFlip;\r\n }\r\n\r\n if (leftTarget.point && rightTarget.point) {\r\n if (leftTarget.id !== rightTarget.id || leftTarget.side !== rightTarget.side) {\r\n leftPoint.copy(leftTarget.point);\r\n rightPoint.copy(rightTarget.point);\r\n stretched = true;\r\n }\r\n }\r\n }\r\n\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current?.id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n if (stretched) {\r\n wall.cx = (leftPoint.x + rightPoint.x) / 2;\r\n wall.cy = (leftPoint.y + rightPoint.y) / 2;\r\n wall.lx = leftPoint.distanceTo(rightPoint);\r\n let angle = Math.atan2(rightPoint.y - leftPoint.y, rightPoint.x - leftPoint.x);\r\n angle = angle >= 0 ? angle : (TWO_PI + angle) % TWO_PI;\r\n wall.relativeAngle = angle;\r\n } else {\r\n wall.cx = p.x;\r\n wall.cy = p.y;\r\n }\r\n wall.leftPoint = leftPoint.toArray();\r\n wall.rightPoint = rightPoint.toArray();\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (objectTypeToAdd === ObjectType.Wall && !isSettingWallStartPointRef.current) {\r\n elementsStateBeforeResizingRef.current = [...useStore.getState().elements];\r\n const addedWall = addElement(foundationModel, p) as WallModel;\r\n grabRef.current = addedWall;\r\n addedWallIdRef.current = addedWall.id;\r\n isSettingWallStartPointRef.current = true;\r\n setShowGrid(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.addedWallId = addedWall.id;\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n if (addedWallIdRef.current && isSettingWallStartPointRef.current) {\r\n p = Util.wallRelativePosition(intersects[0].point, foundationModel);\r\n\r\n let target: SnapTargetType | null = null;\r\n\r\n if (useStore.getState().enableFineGrid) {\r\n p = Util.snapToFineGrid(p);\r\n } else {\r\n target = findMagnetPoint(p, 1.5);\r\n if (target?.point) {\r\n p = target.point;\r\n } else {\r\n p = Util.snapToNormalGrid(p);\r\n\r\n const [alignedX, alignedY] = alignToWall(p);\r\n if (alignedX !== null) p.setX(alignedX);\r\n if (alignedY !== null) p.setY(alignedY);\r\n\r\n target = findMagnetPoint(p, 1.5);\r\n if (target?.point) {\r\n p = target.point;\r\n }\r\n }\r\n }\r\n\r\n const [isAlignedToWallX, isAlignedToWallY] = checkAndSetPosAlignToWall(p);\r\n setWallAuxToWallArray(\r\n produce((draft) => {\r\n draft[0].show = isAlignedToWallX || isAlignedToWallY;\r\n }),\r\n );\r\n\r\n setElementPosition(addedWallIdRef.current, p.x, p.y);\r\n }\r\n }\r\n };\r\n\r\n const handlePointerOver = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n setCommonStore((state) => {\r\n InnerCommonStoreState.selectMe(state, id, e, ActionType.ContextMenu);\r\n state.pastePoint.copy(e.intersections[0].point);\r\n state.clickObjectType = ObjectType.Foundation;\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n if (e.altKey) {\r\n // when alt key is pressed, don't invoke context menu as it is reserved for fast click-paste\r\n state.contextMenuObjectType = null;\r\n } else {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Foundation;\r\n }\r\n }\r\n }\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n });\r\n };\r\n\r\n const handlePointerOut = () => {\r\n setHovered(false);\r\n setShowGrid(false);\r\n if (grabRef.current) {\r\n if (isSettingWallStartPointRef.current) {\r\n removeElementById(grabRef.current.id, false);\r\n isSettingWallStartPointRef.current = false;\r\n setCommonStore((state) => {\r\n state.addedWallId = null;\r\n state.objectTypeToAdd = ObjectType.Wall;\r\n });\r\n grabRef.current = null;\r\n }\r\n }\r\n setWallAuxToAxis({ show: false, direction: null, position: null });\r\n setWallAuxToWallArray([\r\n { show: false, direction: null, position: null },\r\n { show: false, direction: null, position: null },\r\n ]);\r\n };\r\n\r\n const handlePointerEnter = (e: ThreeEvent) => {\r\n if (grabRef.current && Util.isPlantOrHuman(grabRef.current)) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setShowGrid(true);\r\n }\r\n }\r\n };\r\n\r\n const isSolarCollectorNewPositionOk = (sc: SolarCollector, cx: number, cy: number) => {\r\n const clone = JSON.parse(JSON.stringify(sc)) as SolarCollector;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, foundationModel)) {\r\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const isSolarCollectorNewAzimuthOk = (sc: SolarCollector, az: number) => {\r\n const clone = JSON.parse(JSON.stringify(sc)) as SolarCollector;\r\n clone.relativeAzimuth = az;\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.RotationCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, foundationModel)) {\r\n showError(i18n.t('message.RotationOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const isSolarCollectorNewSizeOk = (sc: SolarCollector, cx: number, cy: number, lx: number, ly: number) => {\r\n // check if the new length will cause the solar collector to intersect with the foundation\r\n if (\r\n sc.type === ObjectType.SolarPanel &&\r\n sc.tiltAngle !== 0 &&\r\n 0.5 * ly * Math.abs(Math.sin(sc.tiltAngle)) > sc.poleHeight\r\n ) {\r\n // we only need to check solar panels, other collectors are guaranteed to not touch the ground\r\n return false;\r\n }\r\n // check if the new size will be within the foundation\r\n const clone = JSON.parse(JSON.stringify(sc)) as SolarCollector;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n clone.lx = lx;\r\n clone.ly = ly;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, foundationModel);\r\n };\r\n\r\n const handleSolarCollectorPointerOut = () => {\r\n if (grabRef.current && Util.isSolarCollector(grabRef.current)) {\r\n // Have to get the latest from the store (we may change this to ref in the future)\r\n const sp = useStore.getState().getElementById(grabRef.current.id) as SolarCollector;\r\n if (useStore.getState().moveHandleType && !isSolarCollectorNewPositionOk(sp, sp.cx, sp.cy)) {\r\n setElementPosition(sp.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n }\r\n }\r\n };\r\n\r\n const handleSolarCollectorPointerMove = (e: ThreeEvent) => {\r\n if (!intersectPlaneRef.current) return;\r\n if (!foundationModel) return;\r\n if (grabRef.current && foundationModel) {\r\n if (!Util.isSolarCollector(grabRef.current)) return;\r\n const collector = grabRef.current as SolarCollector;\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n let p = intersects[0].point; // world coordinate\r\n const moveHandleType = useStore.getState().moveHandleType;\r\n const rotateHandleType = useStore.getState().rotateHandleType;\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n if (moveHandleType && foundationModel) {\r\n p = Util.relativeCoordinates(p.x, p.y, p.z, foundationModel);\r\n setElementPosition(collector.id, p.x, p.y);\r\n } else if (rotateHandleType) {\r\n // tilt of solar panels not handled here\r\n if (rotateHandleType === RotateHandleType.Upper || rotateHandleType === RotateHandleType.Lower) {\r\n const pr = foundationModel.rotation[2]; // parent rotation\r\n const pc = new Vector2(foundationModel.cx, foundationModel.cy); // world parent center\r\n const cc = new Vector2(foundationModel.lx * collector.cx, foundationModel.ly * collector.cy) //local current center\r\n .rotateAround(ORIGIN_VECTOR2, pr); // add parent rotation\r\n const wc = new Vector2().addVectors(cc, pc); // world current center\r\n const rotation =\r\n Math.atan2(-p.x + wc.x, p.y - wc.y) - pr + (rotateHandleType === RotateHandleType.Lower ? 0 : Math.PI);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0; // make sure angle is between -PI to PI\r\n const newAzimuth = rotation + offset;\r\n updateSolarCollectorRelativeAzimuthById(collector.id, newAzimuth);\r\n newAzimuthRef.current = newAzimuth;\r\n }\r\n } else if (resizeHandleType) {\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n const wp = new Vector2(p.x, p.y);\r\n const resizeAnchor2D = new Vector2(resizeAnchor.x, resizeAnchor.y);\r\n const distance = wp.distanceTo(resizeAnchor2D);\r\n const angle = collector.relativeAzimuth + rotation[2]; // world panel azimuth\r\n const rp = new Vector2().subVectors(wp, resizeAnchor2D); // relative vector from anchor to pointer\r\n const wbc = new Vector2(cx, cy); // world foundation center\r\n if (collector.type === ObjectType.SolarPanel) {\r\n const solarPanel = collector as SolarPanelModel;\r\n const pvModel = getPvModule(solarPanel.pvModelName);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n {\r\n const sign = resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\r\n const theta = rp.angle() - angle + sign * HALF_PI;\r\n let dyl = distance * Math.cos(theta);\r\n if (solarPanel.orientation === Orientation.portrait) {\r\n const nx = Math.max(1, Math.ceil((dyl - pvModel.length / 2) / pvModel.length));\r\n dyl = nx * pvModel.length;\r\n } else {\r\n const nx = Math.max(1, Math.ceil((dyl - pvModel.width / 2) / pvModel.width));\r\n dyl = nx * pvModel.width;\r\n }\r\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\r\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy); // world panel center\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, collector.lx, dyl)) {\r\n updateElementLyById(collector.id, dyl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n {\r\n let sign = resizeHandleType === ResizeHandleType.Left ? -1 : 1;\r\n const theta = rp.angle() - angle + (resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\r\n let dxl = distance * Math.cos(theta);\r\n if (solarPanel.orientation === Orientation.portrait) {\r\n const nx = Math.max(1, Math.ceil((dxl - pvModel.width / 2) / pvModel.width));\r\n dxl = nx * pvModel.width;\r\n } else {\r\n const nx = Math.max(1, Math.ceil((dxl - pvModel.length / 2) / pvModel.length));\r\n dxl = nx * pvModel.length;\r\n }\r\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\r\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy);\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, dxl, collector.ly)) {\r\n updateElementLxById(collector.id, dxl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n }\r\n } else if (collector.type === ObjectType.ParabolicTrough) {\r\n const parabolicTrough = collector as ParabolicTroughModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n // these two handles change the length, which is controlled by module length\r\n {\r\n const sign = resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\r\n const theta = rp.angle() - angle + sign * HALF_PI;\r\n let dyl = distance * Math.cos(theta);\r\n const n = Math.max(\r\n 1,\r\n Math.ceil((dyl - parabolicTrough.moduleLength / 2) / parabolicTrough.moduleLength),\r\n );\r\n dyl = n * parabolicTrough.moduleLength;\r\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\r\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy); // world panel center\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, collector.lx, dyl)) {\r\n updateElementLyById(collector.id, dyl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n // these two handles change the width, which is not controlled by module length\r\n {\r\n let sign = resizeHandleType === ResizeHandleType.Left ? -1 : 1;\r\n const theta = rp.angle() - angle + (resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\r\n let dxl = distance * Math.cos(theta);\r\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\r\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy);\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, dxl, collector.ly)) {\r\n updateElementLxById(collector.id, dxl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughWidth = dxl;\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n } else if (collector.type === ObjectType.FresnelReflector) {\r\n const fresnelReflector = collector as FresnelReflectorModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n // these two handles change the length, which is controlled by module length\r\n {\r\n const sign = resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\r\n const theta = rp.angle() - angle + sign * HALF_PI;\r\n let dyl = distance * Math.cos(theta);\r\n const n = Math.max(\r\n 1,\r\n Math.ceil((dyl - fresnelReflector.moduleLength / 2) / fresnelReflector.moduleLength),\r\n );\r\n dyl = n * fresnelReflector.moduleLength;\r\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\r\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy); // world panel center\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, collector.lx, dyl)) {\r\n updateElementLyById(collector.id, dyl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n // these two handles change the width, which is not controlled by module length\r\n {\r\n let sign = resizeHandleType === ResizeHandleType.Left ? -1 : 1;\r\n const theta = rp.angle() - angle + (resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\r\n let dxl = distance * Math.cos(theta);\r\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\r\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy);\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, dxl, collector.ly)) {\r\n updateElementLxById(collector.id, dxl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorWidth = dxl;\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n } else if (collector.type === ObjectType.ParabolicDish) {\r\n const parabolicDish = collector as ParabolicDishModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper: // all handles change the diameter of the dish\r\n const diameter = Math.min(10, distance);\r\n if (isSolarCollectorNewSizeOk(collector, parabolicDish.cx, parabolicDish.cy, collector.lx, diameter)) {\r\n updateElementLxById(collector.id, diameter);\r\n updateElementLyById(collector.id, diameter);\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishRimDiameter = diameter;\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const opacity = groundImage ? (orthographic ? 0.25 : 0.75) : 1;\r\n\r\n return (\r\n <>\r\n \r\n {/* draw rectangle */}\r\n \r\n \r\n \r\n \r\n \r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n\r\n {/* intersection plane */}\r\n {grabRef.current && Util.isSolarCollector(grabRef.current) && !grabRef.current.locked && (\r\n \r\n )}\r\n\r\n {showGrid && (\r\n <>\r\n {useStore.getState().rotateHandleType && grabRef.current && Util.isSolarCollector(grabRef.current) && (\r\n \r\n )}\r\n {(useStore.getState().moveHandleType || useStore.getState().resizeHandleType || addedWallIdRef.current) && (\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* ruler */}\r\n {selected && }\r\n\r\n {/* wireFrame */}\r\n {(!selected || groundImage) && (\r\n \r\n )}\r\n\r\n {/* highlight with a thick wireframe when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* wall axis auxiliary line */}\r\n {wallAuxToAxis.show && (\r\n \r\n \r\n \r\n )}\r\n \r\n {wallAuxToWallArray.map((wallAuxToWall, idx) => {\r\n if (!wallAuxToWall.show) return null;\r\n return (\r\n \r\n );\r\n })}\r\n \r\n\r\n {/* draw handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* resize handles */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLLRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLLRef.current!.localToWorld(new Vector3(lx, ly, 0));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.LowerLeft);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleULRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleULRef.current!.localToWorld(new Vector3(lx, -ly, 0));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.UpperLeft);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLRRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLRRef.current!.localToWorld(new Vector3(-lx, ly, 0));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.LowerRight);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleURRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleURRef.current!.localToWorld(new Vector3(-lx, -ly, 0));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.UpperRight);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n\r\n {!addedFoundationID && (\r\n <>\r\n {/* move handles */}\r\n {\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Lower;\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Lower);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Upper;\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Upper);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Left;\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Left);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Right;\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Right);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n\r\n {/* rotation handle */}\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* text */}\r\n {!addedFoundationID && (\r\n <>\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n {!locked && hoveredHandle === ResizeHandleType.LowerLeft && (\r\n \r\n )}\r\n {!locked && hoveredHandle === ResizeHandleType.UpperLeft && (\r\n \r\n )}\r\n {!locked && hoveredHandle === ResizeHandleType.LowerRight && (\r\n \r\n )}\r\n {!locked && hoveredHandle === ResizeHandleType.UpperRight && (\r\n \r\n )}\r\n \r\n )}\r\n {solarStructure === SolarStructure.FocusPipe && }\r\n {solarStructure === SolarStructure.FocusTower && }\r\n {solarStructure === SolarStructure.UpdraftTower && }\r\n\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst WallAuxiliaryLine = ({\r\n hx,\r\n hy,\r\n position,\r\n direction,\r\n color,\r\n}: {\r\n hx: number;\r\n hy: number;\r\n position: number[] | null;\r\n direction: 'x' | 'y' | 'xy' | null;\r\n color: string;\r\n}) => {\r\n if (position === null) return null;\r\n\r\n const [x, y] = position;\r\n const points: [number, number, number][] = [];\r\n\r\n if (direction === 'x') {\r\n points.push([-hx, y, 0]);\r\n points.push([hx, y, 0]);\r\n } else if (direction === 'y') {\r\n points.push([x, -hy, 0]);\r\n points.push([x, hy, 0]);\r\n } else if (direction === 'xy') {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n\r\n return ;\r\n};\r\n\r\nexport default React.memo(Foundation);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport { DoubleSide, Euler, Mesh, Vector3 } from 'three';\r\nimport { Box, Plane } from '@react-three/drei';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType } from 'src/types';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport WindowResizeHandle from './windowResizeHandle';\r\nimport WindowMoveHandle from './windowMoveHandle';\r\nimport { HALF_PI } from 'src/constants';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useStore } from 'src/stores/common';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { RoofUtil } from '../roof/RoofUtil';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { RoofSegmentGroupUserData, RoofSegmentProps } from '../roof/roofRenderer';\r\nimport { RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableMoveSkylight } from 'src/undo/UndoableMove';\r\nimport { UndoableResizeSkylight, UndoableResizeSkylightPolygonTop } from 'src/undo/UndoableResize';\r\nimport { getRoofPointsOfGambrelRoof } from '../roof/flatRoof';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { DEFAULT_POLYGONTOP } from './window';\r\nimport { FOUNDATION_GROUP_NAME } from '../foundation/foundation';\r\nimport { BUILDING_GROUP_NAME } from '../foundation/buildingRenderer';\r\nimport { useDataStore } from 'src/stores/commonData';\r\n\r\ninterface WindowHandleWrapperProps {\r\n id: string;\r\n parentId: string;\r\n foundationId?: string;\r\n lx: number;\r\n lz: number;\r\n polygonTop: number[];\r\n rotation: number[];\r\n windowType: WindowType;\r\n parentType: ObjectType;\r\n}\r\n\r\ntype HandleType = MoveHandleType | ResizeHandleType;\r\n\r\nconst INTERSECTION_PLANE_NAME = 'Handles Intersection Plane';\r\n\r\nconst getPointerOnIntersectionPlane = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n for (const intersection of e.intersections) {\r\n if (intersection.eventObject.name === INTERSECTION_PLANE_NAME) {\r\n // don't know why there is case point.z is negtive\r\n if (intersection.point.z < 0) return null;\r\n return intersection.point;\r\n }\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst getPosRelToFoundation = (p: Vector3, foundation: FoundationModel) => {\r\n return new Vector3()\r\n .subVectors(p, new Vector3(foundation.cx, foundation.cy, foundation.lz))\r\n .applyEuler(new Euler(0, 0, -foundation.rotation[2]));\r\n};\r\n\r\nconst isRectWindowInsideVertices = (\r\n center: Vector3,\r\n lx: number,\r\n ly: number,\r\n rotation: number[],\r\n vertices: Vector3[],\r\n) => {\r\n const [hx, hy] = [lx / 2, ly / 2];\r\n const [a, b, c] = rotation;\r\n const euler = new Euler().fromArray([a - HALF_PI, b, c, 'ZXY']);\r\n const boundaryPoint2 = vertices.map((v) => ({ x: v.x, y: v.y }));\r\n\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const v = new Vector3(hx * i, 0, hy * j).applyEuler(euler);\r\n const vertex = new Vector3().addVectors(center, v);\r\n if (!Util.isPointInside(vertex.x, vertex.y, boundaryPoint2)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n};\r\n\r\nconst isPolygonalWindowInsideVertices = (\r\n center: Vector3,\r\n lx: number,\r\n ly: number,\r\n topX: number,\r\n topH: number,\r\n rotation: number[],\r\n vertices: Vector3[],\r\n) => {\r\n const [hx, hy] = [lx / 2, ly / 2];\r\n const [a, b, c] = rotation;\r\n const euler = new Euler().fromArray([a - HALF_PI, b, c, 'ZXY']);\r\n const boundaryPoint2 = vertices.map((v) => ({ x: v.x, y: v.y }));\r\n\r\n const topVertex = new Vector3().addVectors(center, new Vector3(topX * lx, 0, hy + topH).applyEuler(euler));\r\n if (!Util.isPointInside(topVertex.x, topVertex.y, boundaryPoint2)) return false;\r\n\r\n if (!isRectWindowInsideVertices(center, lx, ly, rotation, vertices)) return false;\r\n\r\n return true;\r\n};\r\n\r\nconst getDataOnRoof = (e: ThreeEvent, windowId: string, roofId: string) => {\r\n if (e.intersections.length > 0) {\r\n for (const intersection of e.intersections) {\r\n const eventObjectName = intersection.eventObject.name;\r\n if (\r\n eventObjectName.includes('Window') &&\r\n eventObjectName.includes(windowId) &&\r\n intersection.object.name !== INTERSECTION_PLANE_NAME\r\n )\r\n return null;\r\n\r\n if (eventObjectName.includes('Roof') && eventObjectName.includes(roofId)) {\r\n const pointer = intersection.point.clone();\r\n const segmentIdx = Number.parseInt(intersection.object.name.split(' ').pop() ?? '-1');\r\n return { pointer, segmentIdx };\r\n }\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst isResizeHandle = (handleType: HandleType | null) => {\r\n switch (handleType) {\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nconst getNewResizedData = (anchor: Vector3, pointer: Vector3, r: number) => {\r\n const diffVector = new Vector3().subVectors(pointer, anchor).applyEuler(new Euler(0, 0, -r));\r\n const newLx = Math.abs(diffVector.x);\r\n const newLz = Math.hypot(diffVector.y, diffVector.z);\r\n const newCenter = new Vector3().addVectors(anchor, pointer).divideScalar(2);\r\n return { newLx, newLz, newCenter };\r\n};\r\n\r\nconst getRoofBoundaryVertices = (roofSegments: RoofSegmentProps[], roofCentroid: Vector3, roofType: RoofType) => {\r\n if (roofType === RoofType.Gambrel) {\r\n return getRoofPointsOfGambrelRoof(roofSegments).map((v) => v.add(roofCentroid));\r\n } else {\r\n return roofSegments.map((segment) => segment.points[0].clone().add(roofCentroid));\r\n }\r\n};\r\n\r\nconst setUndoableMove = (id: string, position: number[], rotation: number[]) => {\r\n useStore.getState().set((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n [window.cx, window.cy, window.cz] = position;\r\n window.rotation = [...rotation];\r\n });\r\n};\r\n\r\nconst setUndoableResize = (id: string, position: number[], dimension: number[], archHeight?: number | null) => {\r\n useStore.getState().set((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n [window.cx, window.cy, window.cz] = position;\r\n [window.lx, window.ly, window.lz] = dimension;\r\n if (archHeight !== undefined && archHeight !== null) {\r\n window.archHeight = archHeight;\r\n }\r\n });\r\n};\r\n\r\nconst setUndoableResizePolygonTop = (id: string, polygonTop: number[]) => {\r\n useStore.getState().set((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n window.polygonTop = [...polygonTop];\r\n });\r\n};\r\n\r\nconst getElementVerticesOnRoof = (el: ElementModel, foundation: FoundationModel, margin = 0.01) => {\r\n if (el.type !== ObjectType.SolarPanel && el.type !== ObjectType.Window) return null;\r\n\r\n const euler = new Euler().fromArray([...el.rotation, 'ZXY']);\r\n const center = new Vector3();\r\n const hx = el.lx / 2 + margin;\r\n let hy = margin;\r\n if (el.type === ObjectType.SolarPanel) {\r\n hy += el.ly / 2;\r\n center.set(el.cx * foundation.lx, el.cy * foundation.ly, 0);\r\n } else {\r\n hy += el.lz / 2;\r\n center.set(el.cx, el.cy, 0);\r\n }\r\n\r\n const vertices: Point2[] = [];\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const v = new Vector3(i * hx, i * j * hy).applyEuler(euler).add(center);\r\n vertices.push(v);\r\n }\r\n }\r\n if (el.type === ObjectType.Window && (el as WindowModel).windowType === WindowType.Polygonal) {\r\n const [tx, th] = (el as WindowModel).polygonTop ?? DEFAULT_POLYGONTOP;\r\n const v = new Vector3(tx * hx, th + hy).applyEuler(euler).add(center);\r\n vertices.push(v);\r\n }\r\n return vertices;\r\n};\r\n\r\nconst getPolygonTop = (window: WindowModel) => {\r\n if (window.windowType !== WindowType.Polygonal) return;\r\n return window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n};\r\n\r\nexport const ArchResizeHandle = ({ z }: { z: number }) => {\r\n const ref = useRef();\r\n\r\n const [color, setColor] = useState('white');\r\n return (\r\n {\r\n setColor('red');\r\n }}\r\n onPointerLeave={() => {\r\n setColor('white');\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst WindowHandleWrapper = ({\r\n id,\r\n parentId,\r\n foundationId,\r\n lx,\r\n lz,\r\n polygonTop,\r\n rotation,\r\n windowType,\r\n parentType,\r\n}: WindowHandleWrapperProps) => {\r\n const addedWindowId = useStore((state) => state.addedWindowId);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const isSettingNewWindow = addedWindowId === id;\r\n const isOnRoof = parentType === ObjectType.Roof;\r\n\r\n const handleTypeRef = useRef(null);\r\n const foundationModelRef = useRef(null);\r\n const roofModelRef = useRef(null);\r\n const roofSegmentsRef = useRef(null);\r\n const roofCentroidRef = useRef(null);\r\n const currRoofSegmentIdxRef = useRef(null);\r\n const resizeAnchorWorldPosRef = useRef(null);\r\n const roofBoundaryVerticesRef = useRef(null);\r\n const roofChildVertices2DRef = useRef([]);\r\n\r\n const oldPositionRef = useRef(null);\r\n const oldRotationRef = useRef(null);\r\n const oldDimensionRef = useRef(null);\r\n const oldArchHeight = useRef(null);\r\n const oldPolygonTop = useRef(null);\r\n\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n\r\n const [hx, hz] = [lx / 2, lz / 2];\r\n const [topX, topH] = polygonTop;\r\n\r\n const absTopX = useMemo(() => lx * topX, [lx, topX]);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const getResizeAnchor = (event: ThreeEvent, lx: number, lz: number) => {\r\n if (!foundationId) return null;\r\n const foundationModel = useStore\r\n .getState()\r\n .elements.find((e) => e.id === foundationId && e.type === ObjectType.Foundation);\r\n if (!foundationModel) return null;\r\n const worldPosition = event.object.localToWorld(new Vector3());\r\n const [a, b, c] = rotation;\r\n const euler = new Euler().fromArray([a - HALF_PI, b, c + foundationModel.rotation[2], 'ZXY']);\r\n const v = new Vector3(lx, 0, lz).applyEuler(euler);\r\n return new Vector3().addVectors(worldPosition, v);\r\n };\r\n\r\n const setRefDataBeforePointerMove = (handleType: HandleType) => {\r\n let windowModel: WindowModel | undefined;\r\n let foundationModel: FoundationModel | undefined;\r\n let roofModel: RoofModel | undefined;\r\n\r\n for (const el of useStore.getState().elements) {\r\n if (el.id === id && el.type === ObjectType.Window) {\r\n windowModel = el as WindowModel;\r\n } else if (el.id === foundationId && el.type === ObjectType.Foundation) {\r\n foundationModel = el as FoundationModel;\r\n } else if (el.id === parentId && el.type === ObjectType.Roof) {\r\n roofModel = el as RoofModel;\r\n }\r\n }\r\n\r\n const contentRef = useRefStore.getState().contentRef;\r\n if (!windowModel || !foundationModel || !roofModel || !contentRef || !contentRef.current) return;\r\n\r\n const fId = foundationModel.id;\r\n const foundationGroup = contentRef.current.children.find((obj) => obj.name === `${FOUNDATION_GROUP_NAME} ${fId}`);\r\n if (!foundationGroup) return;\r\n\r\n const buildingGroup = foundationGroup.children.find((obj) => obj.name === BUILDING_GROUP_NAME);\r\n if (!buildingGroup) return;\r\n\r\n const roofGroup = buildingGroup.children.find((obj) => obj.name.includes('Roof') && obj.name.includes(parentId));\r\n if (!roofGroup) return;\r\n\r\n const segmentGroup = roofGroup.children[0];\r\n if (!segmentGroup) return;\r\n\r\n for (const el of useStore.getState().elements) {\r\n if (el.parentId === parentId && el.id !== id) {\r\n const vertices = getElementVerticesOnRoof(el, foundationModel);\r\n if (vertices) {\r\n roofChildVertices2DRef.current.push(vertices);\r\n }\r\n }\r\n }\r\n\r\n const { centroid, roofSegments } = segmentGroup.userData as RoofSegmentGroupUserData;\r\n const posRelToFoundation = new Vector3(windowModel.cx, windowModel.cy, windowModel.cz + foundationModel.lz);\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n\r\n handleTypeRef.current = handleType;\r\n foundationModelRef.current = foundationModel;\r\n roofModelRef.current = roofModel;\r\n currRoofSegmentIdxRef.current = RoofUtil.getSegmentIdx(roofSegments, posRelToCentroid);\r\n roofCentroidRef.current = centroid;\r\n roofSegmentsRef.current = roofSegments;\r\n roofBoundaryVerticesRef.current = getRoofBoundaryVertices(\r\n roofSegmentsRef.current,\r\n roofCentroidRef.current,\r\n roofModel.roofType,\r\n );\r\n\r\n oldPositionRef.current = [windowModel.cx, windowModel.cy, windowModel.cz];\r\n oldDimensionRef.current = [windowModel.lx, windowModel.ly, windowModel.lz];\r\n oldRotationRef.current = [...windowModel.rotation];\r\n oldArchHeight.current = windowModel.archHeight;\r\n oldPolygonTop.current = windowModel.polygonTop ?? null;\r\n };\r\n\r\n const addUndoableMove = () => {\r\n if (!oldPositionRef.current || !oldRotationRef.current) return;\r\n const window = useStore.getState().elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const undoable = {\r\n name: 'Move skylight',\r\n timestamp: Date.now(),\r\n id: window.id,\r\n oldPosition: [...oldPositionRef.current],\r\n newPosition: [window.cx, window.cy, window.cz],\r\n oldRotation: [...oldRotationRef.current],\r\n newRotation: [...window.rotation],\r\n undo() {\r\n setUndoableMove(undoable.id, undoable.oldPosition, undoable.oldRotation);\r\n },\r\n redo() {\r\n setUndoableMove(undoable.id, undoable.newPosition, undoable.newRotation);\r\n },\r\n } as UndoableMoveSkylight;\r\n\r\n addUndoable(undoable);\r\n };\r\n\r\n const addUndoableResize = () => {\r\n if (!oldDimensionRef.current || !oldPositionRef.current) return;\r\n const window = useStore.getState().elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const undoable = {\r\n name: 'Resize skylight',\r\n timestamp: Date.now(),\r\n id: window.id,\r\n oldPosition: [...oldPositionRef.current],\r\n newPosition: [window.cx, window.cy, window.cz],\r\n oldDimension: [...oldDimensionRef.current],\r\n newDimension: [window.lx, window.ly, window.lz],\r\n oldArchHeight: oldArchHeight.current,\r\n newArchHeight: window.archHeight,\r\n undo() {\r\n setUndoableResize(this.id, this.oldPosition, this.oldDimension, this.oldArchHeight);\r\n },\r\n redo() {\r\n setUndoableResize(this.id, this.newPosition, this.newDimension, this.newArchHeight);\r\n },\r\n } as UndoableResizeSkylight;\r\n addUndoable(undoable);\r\n };\r\n\r\n const addUndoableReizePolygonTop = () => {\r\n if (!oldPolygonTop.current) return;\r\n const window = useStore.getState().elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const undoable = {\r\n name: 'Resize skylight top vertex',\r\n timestamp: Date.now(),\r\n id: window.id,\r\n oldPolygonTop: [...oldPolygonTop.current],\r\n newPolygonTop: window.polygonTop ?? DEFAULT_POLYGONTOP,\r\n undo() {\r\n setUndoableResizePolygonTop(this.id, this.oldPolygonTop);\r\n },\r\n redo() {\r\n setUndoableResizePolygonTop(this.id, this.newPolygonTop);\r\n },\r\n } as UndoableResizeSkylightPolygonTop;\r\n addUndoable(undoable);\r\n };\r\n\r\n const isFlatRoof = (roof: RoofModel) => {\r\n if (roof.roofType === RoofType.Gable) return false;\r\n return Math.abs(roof.rise) < 0.001;\r\n };\r\n\r\n const getBoundary = (segmentIdx?: number | null) => {\r\n const isOnFlatRoof = roofModelRef.current && isFlatRoof(roofModelRef.current);\r\n if (isOnFlatRoof) {\r\n return roofBoundaryVerticesRef.current;\r\n } else if (segmentIdx !== undefined && segmentIdx !== null) {\r\n const segmentVertices = useDataStore.getState().getRoofSegmentVertices(parentId);\r\n if (!segmentVertices) return;\r\n const idx = segmentIdx === -1 ? segmentVertices.length - 1 : segmentIdx;\r\n const vertices = segmentVertices[idx];\r\n return vertices;\r\n }\r\n };\r\n\r\n const collisionCheck = (center: Vector3, lx: number, ly: number, rotation: number[], polygonTop?: number[]) => {\r\n const [hx, hy] = [lx / 2, ly / 2];\r\n const euler = new Euler().fromArray([...rotation, 'ZXY']);\r\n\r\n const currentVertices: Vector3[] = [];\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const v = new Vector3(i * hx, i * j * hy).applyEuler(euler).add(center);\r\n currentVertices.push(v);\r\n }\r\n }\r\n if (polygonTop) {\r\n const [tx, th] = polygonTop;\r\n const v = new Vector3(tx * hx * 2, th + hy).applyEuler(euler).add(center);\r\n currentVertices.push(v);\r\n }\r\n\r\n for (const targetVertices of roofChildVertices2DRef.current) {\r\n // check if current element vertices inside other(target) element\r\n for (const currentVertex of currentVertices) {\r\n if (Util.isPointInside(currentVertex.x, currentVertex.y, targetVertices)) {\r\n return false;\r\n }\r\n }\r\n // check if other element vertices inside current element\r\n for (const targetVertex of targetVertices) {\r\n if (Util.isPointInside(targetVertex.x, targetVertex.y, currentVertices)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const boundaryCheck = (\r\n boundary: Vector3[],\r\n center: Vector3,\r\n lx: number,\r\n ly: number,\r\n rotation: number[],\r\n polygonTop?: number[],\r\n ) => {\r\n if (polygonTop) {\r\n const [topX, topH] = polygonTop;\r\n return isPolygonalWindowInsideVertices(center, lx, ly, topX, topH, rotation, boundary);\r\n } else {\r\n return isRectWindowInsideVertices(center, lx, ly, rotation, boundary);\r\n }\r\n };\r\n\r\n const handlePointerDown = (event: ThreeEvent) => {\r\n if (!isOnRoof || isSettingNewWindow) return;\r\n\r\n const handleType = event.object.name as HandleType;\r\n\r\n switch (handleType) {\r\n case MoveHandleType.Mid: {\r\n // use break to avoid default return\r\n break;\r\n }\r\n case ResizeHandleType.LowerLeft: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, lx, lz);\r\n break;\r\n }\r\n case ResizeHandleType.LowerRight: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, -lx, lz);\r\n break;\r\n }\r\n case ResizeHandleType.UpperLeft: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, lx, -lz);\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, -lx, -lz);\r\n break;\r\n }\r\n case ResizeHandleType.Arch: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, 0, -lz);\r\n break;\r\n }\r\n case ResizeHandleType.Upper:\r\n // use break to avoid default return\r\n break;\r\n default:\r\n // just in case handle type is not correct\r\n return;\r\n }\r\n\r\n setRefDataBeforePointerMove(handleType);\r\n setShowIntersectionPlane(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n };\r\n\r\n const handlePointerMove = (event: ThreeEvent) => {\r\n if (\r\n handleTypeRef.current === null ||\r\n !foundationModelRef.current ||\r\n !roofModelRef.current ||\r\n !roofSegmentsRef.current ||\r\n !roofCentroidRef.current ||\r\n !roofBoundaryVerticesRef.current\r\n )\r\n return;\r\n\r\n const foundation = foundationModelRef.current;\r\n\r\n if (handleTypeRef.current === MoveHandleType.Mid) {\r\n const roof = roofModelRef.current;\r\n const dataOnRoof = getDataOnRoof(event, id, parentId);\r\n const pointer = new Vector3();\r\n\r\n if (isFlatRoof(roof)) {\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n if (!pointerOnIntersectionPlane) return;\r\n pointer.copy(pointerOnIntersectionPlane);\r\n const newCenter = getPosRelToFoundation(pointer, foundation);\r\n\r\n setCommonStore((state) => {\r\n if (!roofBoundaryVerticesRef.current) return;\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const { lx, lz, rotation } = window;\r\n const boundary = roofBoundaryVerticesRef.current;\r\n const polygonTop = getPolygonTop(window);\r\n const insideBoundary = boundaryCheck(boundary, newCenter, lx, lz, rotation, polygonTop);\r\n const noCollision = collisionCheck(newCenter, lx, lz, rotation, polygonTop);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.cx = newCenter.x;\r\n window.cy = newCenter.y;\r\n window.cz = newCenter.z;\r\n }\r\n });\r\n } else {\r\n // segment changed\r\n if (dataOnRoof && dataOnRoof.segmentIdx !== currRoofSegmentIdxRef.current) {\r\n const pointerOnRoof = dataOnRoof.pointer;\r\n pointer.copy(pointerOnRoof);\r\n }\r\n // segment not changed\r\n else {\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n if (!pointerOnIntersectionPlane) return;\r\n pointer.copy(pointerOnIntersectionPlane);\r\n }\r\n\r\n const newCenter = getPosRelToFoundation(pointer, foundation);\r\n const posRelToCentroid = newCenter.clone().sub(roofCentroidRef.current);\r\n const { rotation, segmentVertices, segmentIdx } = RoofUtil.computeState(\r\n roofSegmentsRef.current,\r\n posRelToCentroid,\r\n );\r\n if (segmentVertices) {\r\n newCenter.setZ(\r\n RoofUtil.getRooftopElementZ(segmentVertices, posRelToCentroid, roofCentroidRef.current.z + roof.thickness),\r\n );\r\n } else {\r\n newCenter.setZ(roofCentroidRef.current.z + roof.thickness);\r\n }\r\n\r\n setCommonStore((state) => {\r\n const segmentVertices = useDataStore.getState().getRoofSegmentVertices(parentId);\r\n if (!segmentVertices) return;\r\n // mansard top surface idx is -1, and its vertices is the last in the arrary\r\n const idx = segmentIdx === -1 ? segmentVertices.length - 1 : segmentIdx;\r\n const vertices = segmentVertices[idx];\r\n if (!vertices) return;\r\n\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const { lx, lz } = window;\r\n const polygonTop = getPolygonTop(window);\r\n const insideBoundary = boundaryCheck(vertices, newCenter, lx, lz, rotation, polygonTop);\r\n const noCollision = collisionCheck(newCenter, lx, lz, rotation, polygonTop);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.cx = newCenter.x;\r\n window.cy = newCenter.y;\r\n window.cz = newCenter.z;\r\n window.rotation = [...rotation];\r\n if (dataOnRoof && dataOnRoof.segmentIdx !== currRoofSegmentIdxRef.current) {\r\n currRoofSegmentIdxRef.current = dataOnRoof.segmentIdx;\r\n }\r\n }\r\n });\r\n }\r\n } else if (isResizeHandle(handleTypeRef.current)) {\r\n const boundary = getBoundary(currRoofSegmentIdxRef.current);\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n const anchorWorldPos = resizeAnchorWorldPosRef.current;\r\n if (!pointerOnIntersectionPlane || !anchorWorldPos || !boundary) return;\r\n\r\n const pointerRelToFoundation = getPosRelToFoundation(pointerOnIntersectionPlane, foundation);\r\n const anchorRelToFoundation = getPosRelToFoundation(anchorWorldPos, foundation);\r\n const { newLx, newLz, newCenter } = getNewResizedData(anchorRelToFoundation, pointerRelToFoundation, rotation[2]);\r\n\r\n useStore.getState().set((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const polygonTop = getPolygonTop(window);\r\n const insideBoundary = boundaryCheck(boundary, newCenter, newLx, newLz, rotation, polygonTop);\r\n const noCollision = collisionCheck(newCenter, newLx, newLz, rotation, polygonTop);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.cx = newCenter.x;\r\n window.cy = newCenter.y;\r\n window.cz = newCenter.z;\r\n window.lx = newLx;\r\n window.lz = Math.max(0.001, newLz);\r\n }\r\n });\r\n } else if (handleTypeRef.current === ResizeHandleType.Upper) {\r\n const boundary = getBoundary(currRoofSegmentIdxRef.current);\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n if (!pointerOnIntersectionPlane || !boundary) return;\r\n\r\n const pointerRelToFoundation = getPosRelToFoundation(pointerOnIntersectionPlane, foundation);\r\n\r\n setCommonStore((state) => {\r\n const window = state.elements.find((e) => e.id === id) as WindowModel;\r\n if (!window) return;\r\n\r\n const [whx, whz] = [window.lx / 2, window.lz / 2];\r\n\r\n const centerPoint = new Vector3(window.cx, window.cy, window.cz);\r\n const euler = new Euler().fromArray([...window.rotation, 'ZXY']);\r\n const lowerLeftPoint = new Vector3(-whx, -whz, 0).applyEuler(euler).add(centerPoint);\r\n const lowerRightPoint = new Vector3(whx, -whz, 0).applyEuler(euler).add(centerPoint);\r\n\r\n const pointerRelToLowerLeft = new Vector3().subVectors(pointerRelToFoundation, lowerLeftPoint);\r\n const botNormal = new Vector3().subVectors(lowerRightPoint, lowerLeftPoint).normalize();\r\n const topXRelToLeft = pointerRelToLowerLeft\r\n .clone()\r\n .projectOnVector(botNormal)\r\n .applyEuler(new Euler(0, 0, -window.rotation[2]));\r\n const newTopX = Util.clamp((topXRelToLeft.x - whx) / window.lx, -0.5, 0.5);\r\n\r\n const topToBotDist2D = RoofUtil.getDistance(lowerLeftPoint, lowerRightPoint, pointerRelToFoundation);\r\n const topToBotDist = Math.hypot(topToBotDist2D, pointerRelToFoundation.z - lowerLeftPoint.z);\r\n const newTopH = Math.max(0, topToBotDist - window.lz);\r\n const newPolygonTop = [newTopX, newTopH];\r\n\r\n const center = new Vector3(window.cx, window.cy, window.cz);\r\n const { lx, lz } = window;\r\n const insideBoundary = boundaryCheck(boundary, center, lx, lz, rotation, newPolygonTop);\r\n const noCollision = collisionCheck(center, lx, lz, rotation, newPolygonTop);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.polygonTop = [...newPolygonTop];\r\n }\r\n });\r\n } else if (handleTypeRef.current === ResizeHandleType.Arch) {\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n const anchorWorldPos = resizeAnchorWorldPosRef.current;\r\n const boundary = getBoundary(currRoofSegmentIdxRef.current);\r\n if (!pointerOnIntersectionPlane || !anchorWorldPos || !boundary) return;\r\n\r\n const pointerRelToFoundation = getPosRelToFoundation(pointerOnIntersectionPlane, foundation);\r\n const anchorRelToFoundation = getPosRelToFoundation(anchorWorldPos, foundation);\r\n\r\n setCommonStore((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const [whx, whz] = [window.lx / 2, window.lz / 2];\r\n\r\n const centerPoint = new Vector3(window.cx, window.cy, window.cz);\r\n const euler = new Euler().fromArray([...window.rotation, 'ZXY']);\r\n const lowerLeftPoint = new Vector3(-whx, -whz, 0).applyEuler(euler).add(centerPoint);\r\n const lowerRightPoint = new Vector3(whx, -whz, 0).applyEuler(euler).add(centerPoint);\r\n\r\n const topToBotDist2D = RoofUtil.getDistance(lowerLeftPoint, lowerRightPoint, pointerRelToFoundation);\r\n let newLz = Math.hypot(topToBotDist2D, pointerRelToFoundation.z - lowerLeftPoint.z);\r\n\r\n const ah = Math.min(window.archHeight, window.lz, window.lx / 2);\r\n const rectHeight = window.lz - ah;\r\n\r\n if (newLz > rectHeight && newLz < window.lx / 2 + rectHeight) {\r\n const anchorToCenterNormal = new Vector3().subVectors(centerPoint, anchorRelToFoundation).normalize();\r\n const newCenter = new Vector3().addVectors(\r\n anchorRelToFoundation,\r\n anchorToCenterNormal.multiplyScalar(newLz / 2),\r\n );\r\n const newArchHeight = newLz - rectHeight;\r\n\r\n const insideBoundary = boundaryCheck(boundary, newCenter, window.lx, newLz, rotation);\r\n const noCollision = collisionCheck(newCenter, window.lx, newLz, rotation);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.cx = newCenter.x;\r\n window.cy = newCenter.y;\r\n window.cz = newCenter.z;\r\n window.lz = newLz;\r\n window.archHeight = newArchHeight;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const handlePointerUp = () => {\r\n if (handleTypeRef.current === MoveHandleType.Mid) {\r\n addUndoableMove();\r\n } else if (isResizeHandle(handleTypeRef.current)) {\r\n addUndoableResize();\r\n } else if (handleTypeRef.current === ResizeHandleType.Upper) {\r\n addUndoableReizePolygonTop();\r\n } else if (handleTypeRef.current === ResizeHandleType.Arch) {\r\n addUndoableResize();\r\n }\r\n oldPositionRef.current = null;\r\n oldDimensionRef.current = null;\r\n oldRotationRef.current = null;\r\n oldArchHeight.current = null;\r\n oldPolygonTop.current = null;\r\n\r\n handleTypeRef.current = null;\r\n foundationModelRef.current = null;\r\n roofModelRef.current = null;\r\n roofSegmentsRef.current = null;\r\n roofCentroidRef.current = null;\r\n currRoofSegmentIdxRef.current = null;\r\n resizeAnchorWorldPosRef.current = null;\r\n roofBoundaryVerticesRef.current = null;\r\n roofChildVertices2DRef.current = [];\r\n setShowIntersectionPlane(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {!isSettingNewWindow && (\r\n <>\r\n {windowType === WindowType.Polygonal && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n\r\n {/* arch resize handle */}\r\n {windowType === WindowType.Arched && }\r\n \r\n )}\r\n \r\n \r\n\r\n {isOnRoof && showIntersectionPlane && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WindowHandleWrapper);\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef } from 'react';\nimport { DoubleSide, Euler, MeshStandardMaterial, Vector3 } from 'three';\nimport { Box, Cone, Cylinder, Line, Plane } from '@react-three/drei';\nimport { useStore } from 'src/stores/common';\nimport * as Selector from 'src/stores/selector';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { FrameDataType, MullionDataType, Shutter, WireframeDataType } from './window';\nimport { Util } from '../../Util';\nimport { useDataStore } from '../../stores/commonData';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface RectangleWindowProps {\n id: string;\n dimension: number[];\n position: number[];\n mullionData: MullionDataType;\n frameData: FrameDataType;\n wireframeData: WireframeDataType;\n leftShutter: boolean;\n rightShutter: boolean;\n shutterColor: string;\n shutterWidth: number;\n glassMaterial: JSX.Element;\n showHeatFluxes: boolean;\n area: number;\n empty: boolean;\n interior: boolean;\n foundation: FoundationModel | null;\n}\n\ninterface MullionProps {\n dimension: number[];\n mullionData: MullionDataType;\n shadowEnabled: boolean;\n}\n\ninterface FrameProps {\n dimension: number[];\n frameData: FrameDataType;\n shadowEnabled: boolean;\n}\n\ninterface WireframeProps {\n cy: number;\n dimension: number[];\n wireframeData: WireframeDataType;\n}\n\ntype ArgsType = [x: number, y: number, z: number];\n\nconst sealPlanesMaterial = new MeshStandardMaterial({ color: 'white', side: DoubleSide });\n\nconst Mullion = React.memo(({ dimension, mullionData, shadowEnabled }: MullionProps) => {\n const [lx, ly, lz] = dimension;\n\n const { width: mullionWidth, horizontalMullionSpacing, verticalMullionSpacing, color: mullionColor } = mullionData;\n\n const radialSegments = 3;\n const heightSegments = 1;\n\n const mullionRadius = mullionWidth / 2;\n\n const material = useMemo(() => , [mullionColor]);\n\n const verticalMullions = useMemo(() => {\n const arr: number[] = [];\n const dividers = Math.round(lx / verticalMullionSpacing) - 1;\n if (dividers <= 0 || mullionWidth === 0) {\n return arr;\n }\n const step = lx / (dividers + 1);\n let x = step / 2;\n if (dividers % 2 !== 0) {\n arr.push(0);\n x = step;\n }\n for (let num = 0; num < Math.floor(dividers / 2); num++, x += step) {\n arr.push(x, -x);\n }\n return arr;\n }, [lx, mullionWidth, verticalMullionSpacing]);\n\n const horizontalMullions = useMemo(() => {\n const arr: number[] = [];\n const dividers = Math.round(lz / horizontalMullionSpacing) - 1;\n if (dividers <= 0 || mullionWidth === 0) {\n return arr;\n }\n const step = lz / (dividers + 1);\n let z = step / 2;\n if (dividers % 2 !== 0) {\n arr.push(0);\n z = step;\n }\n for (let num = 0; num < Math.floor(dividers / 2); num++, z += step) {\n arr.push(z, -z);\n }\n return arr;\n }, [lz, mullionWidth, horizontalMullionSpacing]);\n\n return (\n \n {mullionData.verticalMullion &&\n verticalMullions.map((x, index) => (\n \n {material}\n \n ))}\n {mullionData.horizontalMullion &&\n horizontalMullions.map((z, index) => (\n \n {material}\n \n ))}\n \n );\n});\n\nconst Frame = React.memo(({ dimension, frameData, shadowEnabled }: FrameProps) => {\n const [lx, ly, lz] = dimension;\n const { color, width, sillWidth } = frameData;\n const material = useMemo(() => , [color]);\n\n const halfWidth = width / 2;\n const depth = halfWidth / 2;\n const sillLength = lx + width * 3;\n const sillThickness = width;\n\n return (\n \n {/* top */}\n \n {material}\n \n\n {/* left */}\n \n {material}\n \n\n {/* right */}\n \n {material}\n \n\n {/* bottom */}\n \n {material}\n \n \n );\n});\n\nconst Wireframe = React.memo(({ cy, dimension, wireframeData }: WireframeProps) => {\n const [lx, ly, lz] = dimension;\n const { lineWidth, lineColor, selected, locked, opacity } = wireframeData;\n\n const hx = lx / 2;\n const hz = lz / 2;\n\n const radialSegments = 3;\n const heightSegments = 1;\n\n const material = useMemo(() => new MeshStandardMaterial({ color: lineColor }), [lineColor]);\n const highLightMaterial = useMemo(() => new MeshStandardMaterial({ color: LOCKED_ELEMENT_SELECTION_COLOR }), []);\n\n const renderLines = (width: number, mat: MeshStandardMaterial) => {\n const wireframeRadius = width / 2;\n return (\n <>\n \n \n \n \n \n );\n };\n\n return (\n \n {opacity > 0 && {renderLines(lineWidth / 20, material)}}\n {locked && selected && renderLines(lineWidth / 5, highLightMaterial)}\n \n );\n});\n\nconst RectangleWindow = ({\n id,\n dimension,\n position,\n mullionData,\n frameData,\n wireframeData,\n leftShutter,\n rightShutter,\n shutterColor,\n shutterWidth,\n glassMaterial,\n showHeatFluxes,\n area,\n empty,\n interior,\n foundation,\n}: RectangleWindowProps) => {\n const world = useStore.getState().world;\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [lx, ly, lz] = dimension;\n const [cx, cy, cz] = position;\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes || interior) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, intensity, rz));\n vectors.push(v);\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, -intensity, rz));\n vectors.push(v);\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const shutterLength = useMemo(() => shutterWidth * lx, [lx, shutterWidth]);\n const shutterPosX = useMemo(\n () => ((shutterLength + frameData.width + lx) / 2) * 1.025,\n [lx, shutterLength, frameData.width],\n );\n\n const renderSealPlane = (args: [width: number, height: number], position: ArgsType, rotation?: ArgsType) => (\n \n );\n\n return (\n <>\n {!empty && (\n \n \n {glassMaterial}\n \n\n {(mullionData.horizontalMullion || mullionData.verticalMullion) && (\n \n )}\n \n )}\n\n {frameData.showFrame && }\n\n \n\n \n\n {renderSealPlane([ly, lz], [-lx / 2 + 0.001, ly / 2, 0], [HALF_PI, HALF_PI, 0])}\n {renderSealPlane([ly, lz], [lx / 2 - 0.0001, ly / 2, 0], [HALF_PI, -HALF_PI, 0])}\n {renderSealPlane([lx, ly], [0, ly / 2, lz / 2 - 0.001], [Math.PI, 0, 0])}\n {renderSealPlane([lx, ly], [0, ly / 2, -lz / 2 + 0.001])}\n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n};\n\nexport default React.memo(RectangleWindow);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Line } from '@react-three/drei';\nimport { ElementModel } from '../models/ElementModel';\nimport { ResizeHandleType } from '../types';\nimport i18n from '../i18n/i18n';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\n\nexport interface RulerOnWallProps {\n element: ElementModel;\n}\n\nexport const RulerOnWall = ({ element }: RulerOnWallProps) => {\n const language = useStore(Selector.language);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const hoveredHandle = useStore(Selector.hoveredHandle);\n\n const hx = element.lx / 2;\n const hz = element.lz / 2;\n const rulerArrowOffset = 0.05;\n const rulerLineWidth = 1;\n const rulerTickMarkWidth = 0.5;\n const color = element.lineColor ?? 'white';\n const labelBackgroundColor = 'darkorchid';\n const ratio = Math.max(0.25, (hx + hz) / 32);\n const rulerOffset = 0.25;\n const fontSize = 30;\n const yOffset = -0.1;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // lower-left to upper-left\n const ll2ul = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hz]);\n\n // lower-right to upper-right\n const lr2ur = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hz]);\n\n // lower-left to lower-right\n const ll2lr = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hz]);\n\n // upper-left to upper-right\n const ul2ur = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hz]);\n\n if (resizeHandleType) {\n switch (resizeHandleType) {\n case ResizeHandleType.LowerLeft:\n return (\n <>\n {ll2ul}\n {ll2lr}\n \n );\n case ResizeHandleType.LowerRight:\n return (\n <>\n {lr2ur}\n {ll2lr}\n \n );\n case ResizeHandleType.UpperLeft:\n return (\n <>\n {ll2ul}\n {ul2ur}\n \n );\n case ResizeHandleType.UpperRight:\n return (\n <>\n {lr2ur}\n {ul2ur}\n \n );\n }\n }\n\n if (hoveredHandle) {\n switch (hoveredHandle) {\n case ResizeHandleType.LowerLeft:\n return (\n <>\n {ll2ul}\n {ll2lr}\n \n );\n case ResizeHandleType.LowerRight:\n return (\n <>\n {lr2ur}\n {ll2lr}\n \n );\n case ResizeHandleType.UpperLeft:\n return (\n <>\n {ll2ul}\n {ul2ur}\n \n );\n case ResizeHandleType.UpperRight:\n return (\n <>\n {lr2ur}\n {ul2ur}\n \n );\n }\n }\n\n return <>;\n};\n\nexport default React.memo(RulerOnWall);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { Color, DoubleSide, Euler, Vector3 } from 'three';\r\nimport { Box } from '@react-three/drei';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType } from 'src/types';\r\nimport * as Selector from 'src/stores/selector';\r\nimport WindowHandleWrapper from './windowHandleWrapper';\r\nimport { DEFAULT_WINDOW_SHININESS, HALF_PI } from 'src/constants';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport RectangleWindow from './rectangleWindow';\r\nimport ArchedWindow from './archedWindow';\r\nimport { RulerOnWall } from '../rulerOnWall';\r\nimport { Util } from '../../Util';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport PolygonalWindow from './polygonalWindow';\r\nimport { useSelected } from '../hooks';\r\n\r\nexport type MullionDataType = {\r\n horizontalMullion: boolean;\r\n verticalMullion: boolean;\r\n width: number;\r\n horizontalMullionSpacing: number;\r\n verticalMullionSpacing: number;\r\n color: string;\r\n};\r\n\r\nexport type FrameDataType = {\r\n showFrame: boolean;\r\n width: number;\r\n sillWidth: number;\r\n color: string;\r\n};\r\n\r\nexport type WireframeDataType = {\r\n lineColor: string;\r\n lineWidth: number;\r\n selected: boolean;\r\n locked: boolean;\r\n opacity: number;\r\n};\r\n\r\ninterface ShutterProps {\r\n cx: number;\r\n cz?: number;\r\n lx: number;\r\n lz: number;\r\n color: string;\r\n showLeft: boolean;\r\n showRight: boolean;\r\n spacing: number;\r\n}\r\n\r\nexport const Shutter = ({ cx, cz = 0, lx, lz, color, showLeft, showRight, spacing }: ShutterProps) => {\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n if (showSolarRadiationHeatmap || showHeatFluxes) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {showRight && (\r\n \r\n \r\n \r\n )}\r\n {showLeft && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const WINDOW_GROUP_NAME = 'Window Group';\r\n\r\nexport const DEFAULT_POLYGONTOP = [0, 0.5];\r\n\r\nconst Window = (windowModel: WindowModel) => {\r\n const {\r\n id,\r\n parentId,\r\n foundationId,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n rotation,\r\n locked,\r\n lineWidth = 0.2,\r\n lineColor = 'black',\r\n horizontalMullion = true,\r\n verticalMullion = true,\r\n mullionWidth = 0.06,\r\n horizontalMullionSpacing = 0.5,\r\n verticalMullionSpacing = 0.5,\r\n tint = '#73D8FF',\r\n opacity = 0.5,\r\n leftShutter = false,\r\n rightShutter = false,\r\n shutterColor = 'gray',\r\n shutterWidth = 0.5,\r\n mullionColor = 'white',\r\n frame = false,\r\n color = 'white',\r\n frameWidth = 0.1,\r\n sillWidth = 0.1,\r\n windowType = WindowType.Default,\r\n archHeight,\r\n parentType = ObjectType.Wall, // undefined is wall\r\n polygonTop = DEFAULT_POLYGONTOP,\r\n } = windowModel;\r\n\r\n const GROUP_NAME = `${WINDOW_GROUP_NAME} ${id}`;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const getFoundation = useStore(Selector.getFoundation);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const windowShininess = useStore(Selector.viewState.windowShininess);\r\n\r\n const selected = useSelected(id);\r\n\r\n const selectMe = (isContextMenu = false) => {\r\n setCommonStore((state) => {\r\n if (state.groupActionMode) {\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (windowModel.foundationId) {\r\n if (state.selectedElementIdSet.has(parentId)) {\r\n state.selectedElementIdSet.delete(parentId);\r\n } else {\r\n state.selectedElementIdSet.add(windowModel.foundationId);\r\n }\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.selected = true;\r\n state.selectedElement = e;\r\n\r\n if (isContextMenu) {\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const isAllowedToSelectMe = (e: ThreeEvent) => {\r\n return (\r\n e.intersections.length > 0 &&\r\n e.intersections[0].eventObject.name === GROUP_NAME &&\r\n !useStore.getState().moveHandleType &&\r\n !useStore.getState().resizeHandleType &&\r\n !useStore.getState().isAddingElement() &&\r\n useStore.getState().objectTypeToAdd === ObjectType.None\r\n );\r\n };\r\n\r\n const isClickedOnHandles = (e: ThreeEvent) => {\r\n if (e.eventObject.name === GROUP_NAME && e.intersections.length > 0) {\r\n switch (e.object.name) {\r\n case MoveHandleType.Mid:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.Arch:\r\n case ResizeHandleType.Upper:\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const onClickResizeHandle = (handleType: ResizeHandleType, p: Vector3) => {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setPrimitiveStore('showWallIntersectionPlaneId', parentId);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = handleType;\r\n state.resizeAnchor.copy(new Vector3(cx, 0, cz).add(p));\r\n });\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.button === 2 || useStore.getState().addedWallId) return; // ignore right-click\r\n if (isAllowedToSelectMe(e)) {\r\n selectMe();\r\n }\r\n\r\n if (isClickedOnHandles(e)) {\r\n const handleType = e.intersections[0].eventObject.name;\r\n switch (handleType) {\r\n case MoveHandleType.Mid: {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = handleType;\r\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.UpperLeft: {\r\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, -lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, -lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.LowerLeft: {\r\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.LowerRight: {\r\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.Arch: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, 0));\r\n break;\r\n }\r\n case ResizeHandleType.Upper: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, lz / 2));\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n if (useStore.getState().addedWallId) return;\r\n if (isAllowedToSelectMe(e)) {\r\n selectMe(true);\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = ObjectType.Window;\r\n });\r\n }\r\n };\r\n\r\n const euler = useMemo(() => {\r\n if (parentType === ObjectType.Roof) {\r\n const [x, y, z] = rotation;\r\n return new Euler().fromArray([x - HALF_PI, y, z, 'ZXY']);\r\n } else {\r\n return new Euler();\r\n }\r\n }, [parentType, rotation]);\r\n\r\n const glassMaterial = useMemo(\r\n () => (\r\n \r\n ),\r\n [windowShininess, tint, opacity],\r\n );\r\n\r\n const dimensionData = useMemo(() => {\r\n if (archHeight !== undefined) {\r\n return [lx, ly, lz, archHeight];\r\n }\r\n return [lx, ly, lz];\r\n }, [lx, ly, lz, archHeight]);\r\n\r\n const positionData = useMemo(() => {\r\n if (parentType === ObjectType.Roof) {\r\n return [cx, 0.05, cz];\r\n } else {\r\n return [cx, cy, cz];\r\n }\r\n }, [cx, cy, cz, parentType]);\r\n\r\n const mullionData = useMemo(\r\n () =>\r\n ({\r\n horizontalMullion,\r\n verticalMullion,\r\n width: mullionWidth,\r\n horizontalMullionSpacing,\r\n verticalMullionSpacing,\r\n color: mullionColor,\r\n } as MullionDataType),\r\n [horizontalMullion, verticalMullion, mullionWidth, horizontalMullionSpacing, verticalMullionSpacing, mullionColor],\r\n );\r\n\r\n const frameData = useMemo(\r\n () => ({ showFrame: frame, width: frameWidth, color, sillWidth } as FrameDataType),\r\n [frame, frameWidth, color, sillWidth],\r\n );\r\n\r\n const wireframeData = useMemo(\r\n () => ({ lineColor, lineWidth, selected, locked, opacity } as WireframeDataType),\r\n [lineColor, lineWidth, selected, locked, opacity],\r\n );\r\n\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n\r\n const renderWindow = () => {\r\n switch (windowType) {\r\n case WindowType.Default:\r\n return (\r\n \r\n );\r\n case WindowType.Arched:\r\n return (\r\n \r\n );\r\n case WindowType.Polygonal:\r\n return (\r\n \r\n );\r\n }\r\n };\r\n\r\n const positionY = parentType === ObjectType.Roof ? cy : 0;\r\n\r\n return (\r\n {\r\n /* Do Not Delete! Capture event for wall pointer move*/\r\n }}\r\n >\r\n {renderWindow()}\r\n\r\n {/* ruler */}\r\n {selected && }\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Window);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Line } from '@react-three/drei';\r\nimport { HALF_PI } from '../../constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { WallFill } from 'src/models/WallModel';\r\n\r\ninterface WallWireFrameProps {\r\n lineColor: string;\r\n lineWidth: number;\r\n hx: number;\r\n hz: number;\r\n fill: WallFill;\r\n isTopPartial: boolean;\r\n leftUnfilledHeight: number;\r\n rightUnfilledHeight: number;\r\n showParapet: boolean;\r\n leftHeight?: number;\r\n rightHeight?: number;\r\n center?: number[];\r\n centerLeft?: number[];\r\n centerRight?: number[];\r\n}\r\n\r\nconst WallWireFrame = React.memo(\r\n ({\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n hx,\r\n hz,\r\n fill,\r\n isTopPartial,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n showParapet = false,\r\n leftHeight = 2 * hz,\r\n rightHeight = 2 * hz,\r\n center,\r\n centerLeft,\r\n centerRight,\r\n }: WallWireFrameProps) => {\r\n const orthographic = useStore((state) => state.viewState.orthographic);\r\n\r\n const lowerLeft: [number, number, number] = [\r\n -hx,\r\n -hz + 0.001 + (fill === WallFill.Partial ? leftUnfilledHeight : 0),\r\n 0.001,\r\n ];\r\n const lowerRight: [number, number, number] = [\r\n hx,\r\n -hz + 0.001 + (fill === WallFill.Partial ? rightUnfilledHeight : 0),\r\n 0.001,\r\n ];\r\n const upperLeft: [number, number, number] = [-hx, leftHeight - hz - 0.001, 0.001];\r\n const upperRight: [number, number, number] = [hx, rightHeight - hz - 0.001, 0.001];\r\n\r\n const lx = hx * 2;\r\n const points = [];\r\n\r\n if (orthographic) {\r\n lineWidth = 2;\r\n points.push(upperLeft, upperRight);\r\n } else if (showParapet) {\r\n points.push(upperLeft, lowerLeft, lowerRight, upperRight);\r\n } else if (isTopPartial) {\r\n points.push(lowerLeft, upperLeft, upperRight, lowerRight, lowerLeft);\r\n } else {\r\n points.push(lowerLeft, upperLeft);\r\n if (centerLeft) {\r\n const cl: [number, number, number] = [centerLeft[0] * lx, centerLeft[1] - hz, 0.001];\r\n points.push(cl);\r\n }\r\n if (center) {\r\n const c: [number, number, number] = [center[0] * lx, center[1] - hz, 0.001];\r\n points.push(c);\r\n }\r\n if (centerRight) {\r\n const cr: [number, number, number] = [centerRight[0] * lx, centerRight[1] - hz, 0.001];\r\n points.push(cr);\r\n }\r\n points.push(upperRight, lowerRight);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n },\r\n);\r\n\r\nexport default WallWireFrame;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef } from 'react';\nimport { Box, Cone, Line } from '@react-three/drei';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { DoubleSide, Euler, Material, Shape, Vector3 } from 'three';\nimport * as Selector from 'src/stores/selector';\nimport { useStore } from 'src/stores/common';\nimport { Util } from '../../Util';\nimport { useDataStore } from '../../stores/commonData';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface RectangleDoorProps {\n id: string;\n dimension: number[];\n color: string;\n frameColor: string;\n selected: boolean;\n locked: boolean;\n material: Material;\n filled: boolean;\n showHeatFluxes: boolean;\n area: number;\n foundation: FoundationModel | null;\n}\n\ninterface DoorWireFrameProps {\n dimension: number[];\n lineColor: string;\n lineWidth: number;\n}\n\ninterface DoorFrameProps {\n dimension: number[];\n color: string;\n}\n\nconst DoorWireFrame = React.memo(({ dimension, lineColor, lineWidth }: DoorWireFrameProps) => {\n const [hx, hy, hz] = dimension.map((val) => val / 2);\n const ul: [number, number, number] = [-hx, 0, hz + 0.05];\n const ur: [number, number, number] = [hx, 0, hz + 0.05];\n const ll: [number, number, number] = [-hx, 0, -hz];\n const lr: [number, number, number] = [hx, 0, -hz];\n return ;\n});\n\nconst DoorFrame = React.memo(({ dimension, color }: DoorFrameProps) => {\n const [lx, ly, lz] = dimension;\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n\n const material = useMemo(() => , [color]);\n\n const width = 0.1;\n const halfWidth = width / 2;\n\n return (\n \n {/* top */}\n \n {material}\n \n\n {/* left */}\n \n {material}\n \n\n {/* right */}\n \n {material}\n \n \n );\n});\n\nconst RectangleDoor = React.memo(\n ({\n id,\n dimension,\n color,\n frameColor,\n selected,\n locked,\n material,\n filled,\n area,\n showHeatFluxes,\n foundation,\n }: RectangleDoorProps) => {\n const world = useStore.getState().world;\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [lx, ly, lz] = dimension;\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, intensity, rz));\n vectors.push(v);\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, -intensity, rz));\n vectors.push(v);\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const doorShape = useMemo(() => {\n const s = new Shape();\n const [hx, hz] = [lx / 2, lz / 2];\n const width = Math.max(hx, hz) * 0.2;\n s.moveTo(-hx, -hz);\n s.lineTo(-hx, hz);\n s.lineTo(hx, hz);\n s.lineTo(hx, -hz);\n if (!filled) {\n s.lineTo(hx - width, -hz);\n s.lineTo(hx - width, hz - width);\n s.lineTo(-hx + width, hz - width);\n s.lineTo(-hx + width, -hz);\n }\n s.closePath();\n return s;\n }, [lx, lz, filled]);\n\n return (\n \n \n \n \n\n {filled && (\n \n \n \n \n )}\n\n {filled && (\n \n \n \n )}\n\n \n\n \n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n },\n);\n\nexport default RectangleDoor;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef } from 'react';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { useStore } from 'src/stores/common';\nimport { DoubleSide, Euler, Material, Shape, Vector3 } from 'three';\nimport { ArchedWireframe } from '../window/archedWindow';\nimport { WireframeDataType } from '../window/window';\nimport * as Selector from 'src/stores/selector';\nimport { Cone, Line } from '@react-three/drei';\nimport { Util } from '../../Util';\nimport { useDataStore } from '../../stores/commonData';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface ArchedDoorProps {\n id: string;\n dimension: number[];\n color: string;\n frameColor: string;\n selected: boolean;\n locked: boolean;\n material: Material;\n filled: boolean;\n showHeatFluxes: boolean;\n area: number;\n foundation: FoundationModel | null;\n}\n\nconst ArchedDoor = React.memo(\n ({\n id,\n dimension,\n color,\n frameColor,\n selected,\n locked,\n material,\n filled,\n showHeatFluxes,\n area,\n foundation,\n }: ArchedDoorProps) => {\n const world = useStore.getState().world;\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [lx, ly, lz, archHeight] = dimension;\n\n const pointWithinArch = (x: number, z: number) => {\n if (archHeight > 0) {\n const hx = 0.5 * lx;\n const hz = 0.5 * lz;\n const ah = Math.min(archHeight, lz, hx); // actual arch height\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\n // check if the point is within the rectangular part\n if (Math.abs(x) < hx && z < hz - ah && z > -hz) {\n return true;\n }\n // check if the point is within the arch part\n const dz = z - (lz - r - hz);\n return x * x + dz * dz < r * r;\n }\n return true;\n };\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinArch(rx, rz)) {\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, intensity, rz));\n vectors.push(v);\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinArch(rx, rz)) {\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, -intensity, rz));\n vectors.push(v);\n }\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const doorShape = useMemo(() => {\n const s = new Shape();\n const hx = lx / 2;\n const hz = lz / 2;\n const ah = Math.min(archHeight, lz, hx);\n s.moveTo(hx, -hz);\n s.lineTo(hx, hz - ah);\n if (ah > 0.1) {\n const r = ah / 2 + lx ** 2 / (8 * ah);\n const [cX, cY] = [0, hz - r];\n const startAngle = Math.acos(Math.min(hx / r, 1));\n const endAngle = Math.PI - startAngle;\n s.absarc(cX, cY, r, startAngle, endAngle, false);\n } else {\n s.lineTo(-hx, hz);\n }\n s.lineTo(-hx, -hz);\n\n if (!filled) {\n const ihx = lx * 0.4;\n const ihz = lz * 0.4;\n const iah = Math.min(archHeight * 0.8, lz * 0.8, hx * 0.8);\n s.lineTo(-ihx, -hz);\n if (iah > 0.1) {\n s.lineTo(-ihx, hz - iah);\n const r = iah / 2 + (lx * 0.8) ** 2 / (8 * iah);\n const [cX, cY] = [0, ihz - r];\n const startAngle = Math.acos(Math.min(ihx / r, 1));\n const endAngle = Math.PI - startAngle;\n s.absarc(cX, cY, r, endAngle, startAngle, true);\n } else {\n s.lineTo(-ihx, ihz);\n s.lineTo(ihx, ihz);\n }\n s.lineTo(ihx, -hz);\n }\n s.closePath();\n return s;\n }, [lx, lz, archHeight, filled]);\n\n const wireframeData = useMemo(() => {\n const lineWidth = locked && selected ? 0.2 : 0.1;\n return { lineColor: 'black', lineWidth, opacity: 1, selected, locked } as WireframeDataType;\n }, [selected, locked]);\n\n return (\n \n \n \n \n\n {filled && (\n \n \n \n \n )}\n\n {filled && (\n \n \n \n )}\n\n \n \n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n },\n);\n\nexport default ArchedDoor;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAEACAYAAAB7+X6nAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEARs4dI3tSgAABDpJREFUeJzt2iFLq1EcgPH/keGMhoEiIhg1CAaDyWRX/AI2bXYx+gX0ExhFBLG6sCBoNGoQVkQMbxCjYeeGq4N51+57Jux5fvEwDgf27L8X3pMiIoewGhERm5ubsbS09Ntn0Qg9Pj5Gu93+G8Di4mKcnJyk3z6URmdvby9HfE2Ab2dnZ/nl5SU+Pz9/51QqanJyMubn52N3d7f/Yx8I4P39PU5PT6OqqpiYmBj9CVVMr9eLVqsVh4eHA+uNYR/e3t6O1dXVkRxMo/Hw8BC3t7f/rA8NoNVqxdHRkc8EY+T7P/8n5zycAcAZAJwBwBkAnAHAGQCcAcAZAJwBwBkAnAHAGQCcAcANfR38P1JKXjItKOdc62t6JwBc7RPgW92l0pWarE4AOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAa5TaOKWUS+2t+jgB4GqfADnnVPeeKscJAGcAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAFf720DvAZRV99tWJwBcsRtB3guoV6nJ6gSAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwC4RqmNU0q51N6qjxMArvYJkHNOde+pcpwAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAGcAcAYAN/RSaFVVcXx87LXuMVJVVaSUYnp6Oi4vL/vf7dAArq6u4vr6enSnU3G9Xi8WFhZiY2Mj3t7e+usDAczOzsbFxUU8PT3F6+vryA+pcubm5mJ5eTmen5/j4+Ojvz4QwNTUVKytrUWz2Yz9/X3v94+R+/v7vLKyEu12O3Z2dtLNzU2O+Aqg2+3GwcFBbjabsbW1lTqdTj4/P/cZYIzMzMzE+vp6uru7y51OJ3e73YiISBHhFw32Bx94jOPwP7lbAAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/door_01.370d5c48.png\";","export default __webpack_public_path__ + \"static/media/door_02.589dadc7.png\";","export default __webpack_public_path__ + \"static/media/door_03.25d0bf9d.png\";","export default __webpack_public_path__ + \"static/media/door_04.06a40fe3.png\";","export default __webpack_public_path__ + \"static/media/door_05.4515bf2c.png\";","export default __webpack_public_path__ + \"static/media/door_06.5a0271c1.png\";","export default __webpack_public_path__ + \"static/media/door_07.b3fa7c12.png\";","export default __webpack_public_path__ + \"static/media/door_08.44d7e7a4.png\";","export default __webpack_public_path__ + \"static/media/door_09.cc418cf3.png\";","export default __webpack_public_path__ + \"static/media/door_10.69a33f87.png\";","export default __webpack_public_path__ + \"static/media/door_11.885157c0.png\";","export default __webpack_public_path__ + \"static/media/door_12.1978a1a1.png\";","export default __webpack_public_path__ + \"static/media/door_13.0e06b1ac.png\";","export default __webpack_public_path__ + \"static/media/door_14.97d8561e.png\";","export default __webpack_public_path__ + \"static/media/door_15.059947bb.png\";","export default __webpack_public_path__ + \"static/media/door_16.c2cd4b21.png\";","export default __webpack_public_path__ + \"static/media/door_17.6410d727.png\";","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { DoorTexture, ObjectType, ResizeHandleType } from 'src/types';\r\nimport WindowResizeHandle from '../window/windowResizeHandle';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport RectangleDoor from './rectangleDoor';\r\nimport ArchedDoor from './archedDoor';\r\nimport { useDoorTexture } from './hooks';\r\nimport { ArchResizeHandle } from '../window/windowHandleWrapper';\r\nimport {\r\n CanvasTexture,\r\n DoubleSide,\r\n FrontSide,\r\n MeshBasicMaterial,\r\n MeshPhongMaterial,\r\n MeshStandardMaterial,\r\n RepeatWrapping,\r\n Vector3,\r\n} from 'three';\r\nimport { Plane } from '@react-three/drei';\r\nimport { DEFAULT_WINDOW_SHININESS, HALF_PI, INVALID_ELEMENT_COLOR } from 'src/constants';\r\nimport { RulerOnWall } from '../rulerOnWall';\r\nimport { Util } from '../../Util';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface DoorHandleWrapperProps {\r\n dimension: number[];\r\n doorType: DoorType;\r\n}\r\n\r\ninterface DoorSealPlanesProps {\r\n dimension: number[];\r\n}\r\n\r\ntype ArgsType = [x: number, y: number, z: number];\r\n\r\nconst sealPlanesMaterial = new MeshStandardMaterial({ color: 'white', side: FrontSide });\r\n\r\nconst DoorHandleWrapper = React.memo(({ dimension, doorType }: DoorHandleWrapperProps) => {\r\n const [hx, hy, hz] = dimension.map((val) => val / 2);\r\n const isAddingNewDoor = hx === 0 && hz === 0;\r\n\r\n if (isAddingNewDoor) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {doorType === DoorType.Arched && }\r\n \r\n );\r\n});\r\n\r\nconst DoorSealPlanes = React.memo(({ dimension }: DoorSealPlanesProps) => {\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const [lx, ly, lz] = dimension;\r\n const [hx, hy, hz] = dimension.map((val) => val / 2);\r\n const renderSealPlane = (args: [width: number, height: number], position: ArgsType, rotation?: ArgsType) => (\r\n \r\n );\r\n return (\r\n \r\n {renderSealPlane([ly, lz], [-hx, hy, 0], [HALF_PI, HALF_PI, 0])}\r\n {renderSealPlane([ly, lz], [hx, hy, 0], [HALF_PI, -HALF_PI, 0])}\r\n {renderSealPlane([lx, ly], [0, hy, hz], [Math.PI, 0, 0])}\r\n \r\n );\r\n});\r\n\r\nconst Door = (doorModel: DoorModel) => {\r\n const {\r\n id,\r\n parentId,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n textureType,\r\n locked = false,\r\n color = 'white',\r\n doorType = DoorType.Default,\r\n archHeight = 1,\r\n filled = true,\r\n opacity = 1,\r\n frameColor = 'white',\r\n } = doorModel;\r\n\r\n const GROUP_NAME = `Door Group ${id}`;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const windowShininess = useStore(Selector.viewState.windowShininess);\r\n\r\n const selected = useSelected(id);\r\n\r\n // don't know why pointerDown event get called twice. So use a ref to avoid second call\r\n const pointerDownRef = useRef(false);\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n pointerDownRef.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => window.removeEventListener('pointerup', handlePointerUp);\r\n }, []);\r\n\r\n const selectMe = (isContextMenu = false) => {\r\n setCommonStore((state) => {\r\n if (state.groupActionMode) {\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (doorModel.foundationId) {\r\n if (state.selectedElementIdSet.has(parentId)) {\r\n state.selectedElementIdSet.delete(parentId);\r\n } else {\r\n state.selectedElementIdSet.add(doorModel.foundationId);\r\n }\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.selected = true;\r\n state.selectedElement = e;\r\n\r\n if (isContextMenu) {\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const isAllowedToSelectMe = (e: ThreeEvent) => {\r\n // const intersectableObjects = e.intersections.filter(\r\n // (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\r\n // );\r\n return (\r\n e.intersections.length > 0 &&\r\n e.intersections[0].eventObject.name === GROUP_NAME &&\r\n !useStore.getState().moveHandleType &&\r\n !useStore.getState().resizeHandleType &&\r\n !useStore.getState().isAddingElement() &&\r\n useStore.getState().objectTypeToAdd === ObjectType.None\r\n );\r\n };\r\n\r\n const isClickedOnHandles = (e: ThreeEvent) => {\r\n if (e.eventObject.name === GROUP_NAME && e.intersections.length > 0) {\r\n switch (e.object.name) {\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n case ResizeHandleType.Arch:\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const onClickResizeHandle = (handleType: ResizeHandleType, p: Vector3) => {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setPrimitiveStore('showWallIntersectionPlaneId', parentId);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = handleType;\r\n state.resizeAnchor.copy(new Vector3(cx, 0, cz).add(p));\r\n state.selectedElement = state.elements.find((e) => e.selected) as ElementModel;\r\n });\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n if (useStore.getState().addedWallId) return;\r\n if (isAllowedToSelectMe(e)) {\r\n selectMe(true);\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = ObjectType.Door;\r\n });\r\n }\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (pointerDownRef.current || e.button === 2 || useStore.getState().addedWallId) return; // ignore right-click\r\n pointerDownRef.current = true;\r\n if (isAllowedToSelectMe(e)) {\r\n selectMe();\r\n }\r\n\r\n if (isClickedOnHandles(e)) {\r\n const handleType = e.intersections[0].eventObject.name;\r\n switch (handleType) {\r\n case ResizeHandleType.UpperLeft: {\r\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, -lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, -lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.Arch: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, 0));\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const getFoundation = useStore(Selector.getFoundation);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n\r\n const renderDoor = () => {\r\n switch (doorType) {\r\n case DoorType.Default:\r\n return (\r\n \r\n );\r\n case DoorType.Arched:\r\n return (\r\n \r\n );\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (doorModel && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(doorModel.id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n t.wrapS = RepeatWrapping;\r\n t.wrapT = RepeatWrapping;\r\n t.offset.set(-lx / 2, -lz / 2);\r\n t.center.set(lx / 2, lz / 2);\r\n t.repeat.set(1 / lx, 1 / lz);\r\n setHeatmapTexture(t);\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const texture = useDoorTexture(textureType, doorType, lx, lz);\r\n\r\n const dimensionData = useMemo(() => [lx, ly, lz, archHeight], [lx, ly, lz, archHeight]);\r\n\r\n const doorMaterial = useMemo(() => {\r\n if (showSolarRadiationHeatmap && heatmapTexture && doorModel.filled) {\r\n return new MeshBasicMaterial({\r\n color: color,\r\n map: heatmapTexture,\r\n side: FrontSide,\r\n });\r\n }\r\n if (!filled) {\r\n return new MeshStandardMaterial({\r\n opacity: color === INVALID_ELEMENT_COLOR ? 0.5 : 0,\r\n color: color,\r\n transparent: true,\r\n side: DoubleSide,\r\n });\r\n }\r\n if (textureType === DoorTexture.Default || textureType === DoorTexture.NoTexture) {\r\n if (opacity < 1) {\r\n return new MeshPhongMaterial({\r\n specular: 'white',\r\n shininess: windowShininess ?? DEFAULT_WINDOW_SHININESS,\r\n color: color,\r\n side: FrontSide,\r\n opacity: opacity,\r\n transparent: true,\r\n });\r\n } else {\r\n return new MeshStandardMaterial({\r\n map: texture,\r\n color: color,\r\n side: FrontSide,\r\n });\r\n }\r\n }\r\n return new MeshStandardMaterial({ map: texture, side: FrontSide });\r\n }, [showSolarRadiationHeatmap, heatmapTexture, color, textureType, texture, filled, opacity]);\r\n\r\n return (\r\n \r\n {renderDoor()}\r\n\r\n {selected && }\r\n\r\n {selected && !locked && }\r\n\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Door);\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport { DoorTexture, ObjectType } from 'src/types';\r\nimport DoorTextureDefault from 'src/resources/door_edge.png';\r\nimport DoorTexture00 from 'src/resources/tiny_white_square.png';\r\nimport DoorTexture01 from 'src/resources/door_01.png';\r\nimport DoorTexture02 from 'src/resources/door_02.png';\r\nimport DoorTexture03 from 'src/resources/door_03.png';\r\nimport DoorTexture04 from 'src/resources/door_04.png';\r\nimport DoorTexture05 from 'src/resources/door_05.png';\r\nimport DoorTexture06 from 'src/resources/door_06.png';\r\nimport DoorTexture07 from 'src/resources/door_07.png';\r\nimport DoorTexture08 from 'src/resources/door_08.png';\r\nimport DoorTexture09 from 'src/resources/door_09.png';\r\nimport DoorTexture10 from 'src/resources/door_10.png';\r\nimport DoorTexture11 from 'src/resources/door_11.png';\r\nimport DoorTexture12 from 'src/resources/door_12.png';\r\nimport DoorTexture13 from 'src/resources/door_13.png';\r\nimport DoorTexture14 from 'src/resources/door_14.png';\r\nimport DoorTexture15 from 'src/resources/door_15.png';\r\nimport DoorTexture16 from 'src/resources/door_16.png';\r\nimport DoorTexture17 from 'src/resources/door_17.png';\r\nimport { TextureLoader } from 'three';\r\nimport { useThree } from '@react-three/fiber';\r\nimport { useStore } from 'src/stores/common';\r\nimport { fileChanged } from 'src/stores/selector';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\n\r\nexport const useDoorTexture = (textureType: DoorTexture, doorType: DoorType, lx?: number, lz?: number) => {\r\n const textureLoader = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case DoorTexture.Default:\r\n textureImg = DoorTextureDefault;\r\n break;\r\n case DoorTexture.NoTexture:\r\n textureImg = DoorTexture00;\r\n break;\r\n case DoorTexture.Texture01:\r\n textureImg = DoorTexture01;\r\n break;\r\n case DoorTexture.Texture02:\r\n textureImg = DoorTexture02;\r\n break;\r\n case DoorTexture.Texture03:\r\n textureImg = DoorTexture03;\r\n break;\r\n case DoorTexture.Texture04:\r\n textureImg = DoorTexture04;\r\n break;\r\n case DoorTexture.Texture05:\r\n textureImg = DoorTexture05;\r\n break;\r\n case DoorTexture.Texture06:\r\n textureImg = DoorTexture06;\r\n break;\r\n case DoorTexture.Texture07:\r\n textureImg = DoorTexture07;\r\n break;\r\n case DoorTexture.Texture08:\r\n textureImg = DoorTexture08;\r\n break;\r\n case DoorTexture.Texture09:\r\n textureImg = DoorTexture09;\r\n break;\r\n case DoorTexture.Texture10:\r\n textureImg = DoorTexture10;\r\n break;\r\n case DoorTexture.Texture11:\r\n textureImg = DoorTexture11;\r\n break;\r\n case DoorTexture.Texture12:\r\n textureImg = DoorTexture12;\r\n break;\r\n case DoorTexture.Texture13:\r\n textureImg = DoorTexture13;\r\n break;\r\n case DoorTexture.Texture14:\r\n textureImg = DoorTexture14;\r\n break;\r\n case DoorTexture.Texture15:\r\n textureImg = DoorTexture15;\r\n break;\r\n case DoorTexture.Texture16:\r\n textureImg = DoorTexture16;\r\n break;\r\n case DoorTexture.Texture17:\r\n textureImg = DoorTexture17;\r\n break;\r\n default:\r\n textureImg = DoorTexture02;\r\n }\r\n\r\n return new TextureLoader().load(textureImg, (texture) => {\r\n if (lx !== undefined && lz !== undefined) {\r\n texture.offset.set(0.5, 0.5);\r\n texture.repeat.set(1 / lx, 1 / lz);\r\n }\r\n setTexture(texture);\r\n invalidate();\r\n });\r\n }, [textureType, doorType, lx, lz]);\r\n\r\n const [texture, setTexture] = useState(textureLoader);\r\n const { invalidate } = useThree();\r\n return texture;\r\n};\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cone, Line, Plane, Ring, Sphere } from '@react-three/drei';\r\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n SOLAR_PANEL_BLACK_SPECULAR,\r\n SOLAR_PANEL_BLUE_SPECULAR,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, Orientation, ResizeHandleType, RotateHandleType } from '../../types';\r\nimport { Util } from '../../Util';\r\nimport { SolarPanelModel, SolarPanelModelOnWall } from '../../models/SolarPanelModel';\r\nimport { LineData } from '../LineData';\r\nimport { getSunDirection } from 'src/analysis/sunTools';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { PvModel } from 'src/models/PvModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface SunbeamProps {\r\n drawSunbeam: boolean;\r\n absRotation: number;\r\n tiltAngle: number;\r\n}\r\n\r\ninterface LabelProps {\r\n sp: SolarPanelModelOnWall;\r\n}\r\n\r\ninterface TiltHandleProps {\r\n tiltAngle: number;\r\n handleSize: number;\r\n initPointerDown: () => void;\r\n handlePointerMove: (e: ThreeEvent, tiltHandleRef: React.MutableRefObject) => void;\r\n handlePointerUp: () => void;\r\n}\r\n\r\nconst Sunbeam = React.memo(({ drawSunbeam, absRotation, tiltAngle }: SunbeamProps) => {\r\n const normalVector = new Vector3(0, 0, 1);\r\n\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude).applyEuler(new Euler(-HALF_PI - tiltAngle, 0, -absRotation));\r\n }, [date, latitude, absRotation, tiltAngle]);\r\n\r\n return (\r\n <>\r\n {drawSunbeam && sunDirection.z > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n\r\nconst Label = ({ sp }: LabelProps) => {\r\n useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const language = useStore(Selector.language);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n if (!sp.foundationId || !sp.parentId) {\r\n return null;\r\n }\r\n\r\n const wall = getElementById(sp.parentId) as WallModel;\r\n const foundation = getElementById(sp.foundationId) as FoundationModel;\r\n\r\n if (!wall || !foundation) {\r\n return null;\r\n }\r\n\r\n const fCenter = new Vector3(foundation.cx, foundation.cy, foundation.cz);\r\n const wCenter = new Vector3(wall.cx, wall.cy, wall.cz);\r\n\r\n const center = new Vector3(sp.cx * wall.lx, 0, sp.cz * wall.lz)\r\n .applyEuler(new Euler(0, 0, wall.relativeAngle))\r\n .add(wCenter)\r\n .applyEuler(new Euler(0, 0, foundation.rotation[2]))\r\n .add(fCenter);\r\n\r\n const labelText =\r\n (sp?.label ?? i18n.t('shared.SolarPanelElement', lang)) +\r\n (sp?.locked ? ` ( + ${i18n.t('shared.ElementLocked', lang)} + )` : '') +\r\n (sp?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n center.x.toFixed(1) +\r\n ', ' +\r\n center.y.toFixed(1) +\r\n ', ' +\r\n center.z.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang));\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst TiltHandle = ({\r\n tiltAngle,\r\n handleSize,\r\n initPointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n}: TiltHandleProps) => {\r\n const { gl } = useThree();\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const [showTiltAngle, setShowTiltAngle] = useState(false);\r\n const [showIntersection, setShowIntersectionPlane] = useState(false);\r\n const tiltHandleRef = useRef();\r\n const intersectionPlaneRef = useRef();\r\n const degree = useMemo(() => new Array(7).fill(0), []);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n return (\r\n <>\r\n {/* ring handles */}\r\n {\r\n gl.domElement.style.cursor = 'grab';\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n }}\r\n onPointerOut={() => {\r\n gl.domElement.style.cursor = 'default';\r\n setColor(RESIZE_HANDLE_COLOR);\r\n }}\r\n onPointerDown={(e) => {\r\n initPointerDown();\r\n e.stopPropagation();\r\n setShowTiltAngle(true);\r\n setShowIntersectionPlane(true);\r\n setCommonStore((state) => {\r\n state.rotateHandleType = RotateHandleType.Tilt;\r\n });\r\n }}\r\n >\r\n \r\n \r\n {showTiltAngle && (\r\n <>\r\n {/* intersection plane */}\r\n {showIntersection && (\r\n {\r\n handlePointerMove(e, intersectionPlaneRef);\r\n }}\r\n onPointerUp={() => {\r\n handlePointerUp();\r\n setShowIntersectionPlane(false);\r\n setShowTiltAngle(false);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {/* pointer */}\r\n \r\n {/* scale */}\r\n {degree.map((e, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {/* show current degree */}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst Mount = React.memo(\r\n ({ tiltAngle, spCy, spLy, lx, nx }: { tiltAngle: number; spCy: number; spLy: number; lx: number; nx: number }) => {\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n\r\n const mountUnit = useMemo(() => {\r\n const halfLz = (spLy * Math.cos(tiltAngle)) / 2;\r\n const startZ = spLy * 0.75 - halfLz;\r\n const ly = -spCy * 1.5;\r\n const lz = startZ - halfLz / 2;\r\n const length = Math.hypot(ly, lz);\r\n const rotationX = Math.atan2(lz, ly);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }, [tiltAngle, spCy, spLy]);\r\n\r\n const arr = useMemo(() => {\r\n const arr: number[] = [];\r\n let curr = nx % 2 === 0 ? lx / 2 : 0;\r\n while (curr < (nx * lx) / 2) {\r\n arr.push(curr, -curr);\r\n curr += lx;\r\n }\r\n return arr;\r\n }, [lx, nx]);\r\n\r\n return (\r\n \r\n {arr.map((val, idx) => (\r\n \r\n {mountUnit}\r\n \r\n ))}\r\n \r\n );\r\n },\r\n);\r\n\r\nconst HANDLE_GROUP_NAME = 'Handle Group Move & Resize';\r\n\r\nconst SolarPanelOnWall = ({\r\n id,\r\n pvModelName = 'SPR-X21-335-BLK',\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n color = 'white',\r\n locked = false,\r\n parentId,\r\n foundationId,\r\n orientation = Orientation.portrait,\r\n showLabel,\r\n drawSunBeam,\r\n absRotation,\r\n tiltAngle,\r\n relativeAzimuth,\r\n}: SolarPanelModelOnWall) => {\r\n tiltAngle = Math.min(0, tiltAngle);\r\n\r\n const selected = useSelected(id);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const pvModules = useStore(Selector.pvModules);\r\n\r\n const { camera, gl } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [nx, setNx] = useState(1);\r\n const baseRef = useRef();\r\n const solarPanelLinesRef = useRef();\r\n const pointerDownRef = useRef(false);\r\n const oldTiltRef = useRef(null);\r\n\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const pvModel = pvModules[pvModelName] as PvModel;\r\n\r\n if (pvModel) {\r\n lz = Math.max(pvModel.thickness, 0.02);\r\n }\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const positionLL = new Vector3(-hx, -hy, hz);\r\n const positionUL = new Vector3(-hx, hy, hz);\r\n const positionLR = new Vector3(hx, -hy, hz);\r\n const positionUR = new Vector3(hx, hy, hz);\r\n const solarPanel = getElementById(id) as SolarPanelModelOnWall;\r\n\r\n useEffect(() => {\r\n if (pvModel) {\r\n let mx, my;\r\n if (orientation === Orientation.portrait) {\r\n mx = Math.max(1, Math.round(lx / pvModel.width));\r\n my = Math.max(1, Math.round(ly / pvModel.length));\r\n } else {\r\n mx = Math.max(1, Math.round(lx / pvModel.length));\r\n my = Math.max(1, Math.round(ly / pvModel.width));\r\n }\r\n setNx(mx);\r\n solarPanelLinesRef.current = [];\r\n const dx = lx / mx;\r\n const dy = ly / my;\r\n for (let i = 0; i <= mx; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\r\n } as LineData);\r\n }\r\n for (let i = 0; i <= my; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\r\n } as LineData);\r\n }\r\n }\r\n }, [orientation, pvModelName, lx, ly, lz]);\r\n\r\n const euler = useMemo(() => {\r\n return new Euler(HALF_PI, 0, 0);\r\n }, []);\r\n\r\n const relativeEuler = useMemo(() => {\r\n return new Euler(tiltAngle, 0, 0, 'ZXY');\r\n }, [tiltAngle]);\r\n\r\n const hoverHandle = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.eventObject.name.includes(HANDLE_GROUP_NAME);\r\n if (intersected) {\r\n const handle = e.object.name as MoveHandleType | ResizeHandleType | RotateHandleType | null;\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n gl.domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n gl.domElement.style.cursor = 'grab';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n gl.domElement.style.cursor = 'default';\r\n };\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const tiltHandleSize = (baseSize * 2) / 3;\r\n\r\n cy = (ly * Math.sin(tiltAngle)) / 2;\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const initPointerDown = () => {\r\n oldTiltRef.current = tiltAngle;\r\n pointerDownRef.current = true;\r\n useRefStore.getState().setEnableOrbitController(false);\r\n };\r\n\r\n const tiltHandlePointerMove = (\r\n e: ThreeEvent,\r\n intersectionPlaneRef: React.MutableRefObject,\r\n ) => {\r\n if (pointerDownRef.current) {\r\n setRayCast(e);\r\n if (intersectionPlaneRef.current && useStore.getState().rotateHandleType === RotateHandleType.Tilt) {\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const pointer = intersects[0].point;\r\n const center = intersectionPlaneRef.current.parent?.localToWorld(new Vector3()); // rotate center in world coordinate\r\n if (center) {\r\n const cv = new Vector3().subVectors(pointer, center);\r\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\r\n const wr = absRotation;\r\n const sign =\r\n wr % Math.PI === 0\r\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\r\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\r\n angle = sign * angle - HALF_PI;\r\n angle = Util.clamp(angle, -HALF_PI, 0);\r\n useStore.getState().updateSolarPanelTiltAngleById(id, angle);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const tiltHandlePointerUp = () => {\r\n const sp = getElementById(id) as SolarPanelModel;\r\n if (sp && oldTiltRef.current !== null && Math.abs(sp.tiltAngle - oldTiltRef.current) > ZERO_TOLERANCE) {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltRef.current,\r\n newValue: sp.tiltAngle,\r\n changedElementId: id,\r\n changedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n useStore.getState().addUndoable(undoableChange);\r\n }\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDownRef.current = false;\r\n };\r\n\r\n const onClickResizeHandle = (handleType: ResizeHandleType, p: Vector3) => {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.resizeHandleType = handleType;\r\n state.resizeAnchor.copy(new Vector3(cx, 0, cz).add(p));\r\n });\r\n };\r\n\r\n const clickHandle = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === HANDLE_GROUP_NAME) {\r\n const handleType = e.object.name;\r\n switch (handleType) {\r\n case MoveHandleType.Default: {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = handleType;\r\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.Left: {\r\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, 0));\r\n break;\r\n }\r\n case ResizeHandleType.Right: {\r\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, 0));\r\n break;\r\n }\r\n case ResizeHandleType.Lower: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, ly / 2));\r\n break;\r\n }\r\n case ResizeHandleType.Upper: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, -ly / 2));\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const texture = useSolarPanelTexture(\r\n lx,\r\n ly,\r\n pvModel,\r\n orientation,\r\n solarPanel?.frameColor,\r\n solarPanel?.backsheetColor,\r\n );\r\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\r\n\r\n const renderTopTextureMaterial = () => {\r\n if (showSolarRadiationHeatmap && heatmapTexture) {\r\n return ;\r\n }\r\n if (!texture) return ;\r\n if (orthographic || solarPanelShininess === 0) {\r\n return ;\r\n }\r\n return (\r\n \r\n );\r\n };\r\n\r\n const renderBotTextureMaterial = () => {\r\n if (pvModel?.bifacialityFactor === 0 || tiltAngle === 0) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n return (\r\n \r\n );\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {/* draw panel */}\r\n {\r\n if (\r\n e.button === 2 ||\r\n useStore.getState().isAddingElement() ||\r\n useStore.getState().objectTypeToAdd !== ObjectType.None\r\n )\r\n return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.SolarPanel;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n gl.domElement.style.cursor = 'move';\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n gl.domElement.style.cursor = 'default';\r\n setHovered(false);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {renderTopTextureMaterial()}\r\n {renderBotTextureMaterial()}\r\n \r\n\r\n {showSolarRadiationHeatmap &&\r\n heatmapTexture &&\r\n solarPanelLinesRef.current &&\r\n solarPanelLinesRef.current.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/* simulation panel */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n\r\n {/*draw label */}\r\n {(hovered || showLabel) && !selected && \r\n\r\n {tiltAngle !== 0 && pvModel && (\r\n \r\n )}\r\n \r\n\r\n {selected && !locked && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(SolarPanelOnWall);\r\n","export default __webpack_public_path__ + \"static/media/polygon_08.acf0bf8f.png\";","export default __webpack_public_path__ + \"static/media/polygon_09.26eed538.png\";","export default __webpack_public_path__ + \"static/media/polygon_10.749fa717.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport PolygonTexture01 from '../resources/foundation_01.png';\r\nimport PolygonTexture02 from '../resources/foundation_02.png';\r\nimport PolygonTexture03 from '../resources/foundation_03.png';\r\nimport PolygonTexture04 from '../resources/foundation_04.png';\r\nimport PolygonTexture05 from '../resources/foundation_05.png';\r\nimport PolygonTexture06 from '../resources/foundation_06.png';\r\nimport PolygonTexture07 from '../resources/foundation_07.png';\r\nimport PolygonTexture08 from '../resources/polygon_08.png';\r\nimport PolygonTexture09 from '../resources/polygon_09.png';\r\nimport PolygonTexture10 from '../resources/polygon_10.png';\r\nimport PolygonTexture00 from '../resources/tiny_white_square.png';\r\n\r\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\r\nimport { Box, Line, Sphere, Text } from '@react-three/drei';\r\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, RepeatWrapping, Shape, TextureLoader, Vector3 } from 'three';\r\nimport { CommonStoreState, useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n} from '../constants';\r\nimport { ActionType, LineStyle, MoveHandleType, ObjectType, PolygonTexture, ResizeHandleType } from '../types';\r\nimport { Util } from '../Util';\r\nimport i18n from '../i18n/i18n';\r\nimport { PolygonModel } from '../models/PolygonModel';\r\nimport { Point2 } from '../models/Point2';\r\nimport { useRefStore } from '../stores/commonRef';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Polygon = ({\r\n id,\r\n lz = 0.1,\r\n filled = false,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = 'yellow',\r\n label,\r\n text,\r\n fontSize = 1,\r\n fontColor = 'black',\r\n fontOutlineWidth = 0,\r\n fontOutlineColor = 'white',\r\n fontStrokeWidth = 0,\r\n fontStrokeColor = 'black',\r\n lineStyle = LineStyle.Solid,\r\n lineColor = 'black',\r\n lineWidth = 1,\r\n locked = false,\r\n showLabel = false,\r\n parentId,\r\n foundationId,\r\n vertices,\r\n opacity = 1,\r\n noOutline = false,\r\n shininess = 0,\r\n selectedIndex = -1,\r\n textureType = PolygonTexture.NoTexture,\r\n}: PolygonModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const selectMe = useStore(Selector.selectMe);\r\n const objectTypeToAdd = useStore(Selector.objectTypeToAdd);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const [centerX, setCenterX] = useState(0);\r\n const [centerY, setCenterY] = useState(0);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n\r\n const baseRef = useRef();\r\n const centerRef = useRef();\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n // if any\r\n const cuboidWorldPosition = new Vector3();\r\n const cuboidWorldRotation = new Euler();\r\n if (parent?.type === ObjectType.Cuboid) {\r\n const { pos, rot } = Util.getWorldDataById(parent.id);\r\n cuboidWorldPosition.copy(pos);\r\n cuboidWorldRotation.set(0, 0, rot);\r\n }\r\n\r\n const ratio = parent ? Math.max(1, Math.max(parent.lx, parent.ly) / 24) : 1;\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * ratio;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * ratio;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const updatePolygonSelectedIndexById = (id: string, index: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).selectedIndex = index;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const absoluteVertices = useMemo(() => {\r\n const av = new Array();\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n for (const v of vertices) {\r\n av.push({ x: v.x * parent.lx, y: v.y * parent.ly } as Point2);\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n for (const v of vertices) {\r\n av.push({ x: v.x * parent.lx, y: v.y * parent.lz } as Point2);\r\n }\r\n break;\r\n case ObjectType.Cuboid:\r\n const n = new Vector3().fromArray(normal);\r\n let lx, ly;\r\n if (Util.isUnitVectorX(n)) {\r\n // east or west face in model coordinate system\r\n lx = parent.lz;\r\n ly = parent.ly;\r\n } else if (Util.isUnitVectorY(n)) {\r\n // south or north face\r\n lx = parent.lx;\r\n ly = parent.lz;\r\n } else {\r\n // top face\r\n lx = parent.lx;\r\n ly = parent.ly;\r\n }\r\n for (const v of vertices) {\r\n av.push({ x: v.x * lx, y: v.y * ly } as Point2);\r\n }\r\n break;\r\n }\r\n const centroid = Util.calculatePolygonCentroid(av);\r\n setCenterX(centroid.x);\r\n setCenterY(centroid.y);\r\n }\r\n return av;\r\n }, [vertices, parent, normal]);\r\n\r\n const getCz = () => {\r\n if (parent?.type === ObjectType.Cuboid) {\r\n const top = Util.isIdentical(normal, UNIT_VECTOR_POS_Z_ARRAY);\r\n // not sure why we need lz here\r\n return cuboidWorldPosition.z + (parent.lz + (top ? 0 : lz)) / 2 + 0.01;\r\n }\r\n if (parent?.type === ObjectType.Foundation) {\r\n return parent.lz + 0.01;\r\n }\r\n return lz / 2 + 0.01;\r\n };\r\n\r\n const cz = getCz();\r\n\r\n const getEuler = () => {\r\n if (parent?.type === ObjectType.Wall) {\r\n return new Euler(-HALF_PI, 0, Math.PI, 'ZXY');\r\n }\r\n const n = new Vector3().fromArray(normal);\r\n let r = rotation[2];\r\n if (parent?.type === ObjectType.Cuboid) {\r\n r = cuboidWorldRotation.z;\r\n }\r\n // east face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n return new Euler(0, HALF_PI, r, 'ZXY');\r\n }\r\n // west face\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n return new Euler(0, -HALF_PI, r, 'ZXY');\r\n }\r\n // north face\r\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n return new Euler(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n // south face\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n return new Euler(HALF_PI, 0, r, 'ZXY');\r\n }\r\n // top face\r\n return new Euler(0, 0, r, 'ZXY');\r\n };\r\n\r\n const euler = getEuler();\r\n\r\n const getPosition = () => {\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid) {\r\n const p = new Vector3(cuboidWorldPosition.x, cuboidWorldPosition.y, cz);\r\n const n = new Vector3().fromArray(normal);\r\n let sideFace = false;\r\n const shift = new Vector3();\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n // east face in model coordinate system\r\n sideFace = true;\r\n shift.x = parent.lx / 2 + 0.01;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n // west face\r\n sideFace = true;\r\n shift.x = -parent.lx / 2 - 0.01;\r\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n // north face\r\n sideFace = true;\r\n shift.y = parent.ly / 2 + 0.01;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n // south face\r\n sideFace = true;\r\n shift.y = -parent.ly / 2 - 0.01;\r\n }\r\n if (sideFace) {\r\n shift.applyEuler(cuboidWorldRotation);\r\n p.x = cuboidWorldPosition.x + shift.x;\r\n p.y = cuboidWorldPosition.y + shift.y;\r\n p.z = cuboidWorldPosition.z + shift.z;\r\n }\r\n return p;\r\n } else if (parent.type === ObjectType.Wall) {\r\n // polygon on wall is relative to the wall\r\n return new Vector3(0, -0.01, 0);\r\n }\r\n }\r\n return new Vector3(parent?.cx ?? 0, parent?.cy ?? 0, cz);\r\n };\r\n\r\n const position = getPosition();\r\n\r\n const points = useMemo(() => {\r\n const p = new Array();\r\n for (const v of absoluteVertices) {\r\n p.push(new Vector3(v.x, v.y, 0));\r\n }\r\n // close the polygon\r\n p.push(new Vector3(absoluteVertices[0].x, absoluteVertices[0].y, 0));\r\n return p;\r\n }, [absoluteVertices]);\r\n\r\n const shape = useMemo(() => {\r\n const s = new Shape();\r\n s.moveTo(absoluteVertices[0].x, absoluteVertices[0].y);\r\n for (let i = 1; i < absoluteVertices.length; i++) {\r\n s.lineTo(absoluteVertices[i].x, absoluteVertices[i].y);\r\n }\r\n s.closePath();\r\n return s;\r\n }, [absoluteVertices]);\r\n\r\n const hoverHandle = useCallback((e: ThreeEvent, handle: MoveHandleType | ResizeHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Default) {\r\n domElement.style.cursor = 'move';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const fetchRepeatDividers = (textureType: PolygonTexture) => {\r\n switch (textureType) {\r\n case PolygonTexture.Texture01:\r\n return { x: 1, y: 1 };\r\n case PolygonTexture.Texture02:\r\n return { x: 2, y: 2 };\r\n case PolygonTexture.Texture03:\r\n return { x: 0.4, y: 0.4 };\r\n case PolygonTexture.Texture04:\r\n return { x: 0.25, y: 0.25 };\r\n case PolygonTexture.Texture05:\r\n return { x: 5, y: 5 };\r\n case PolygonTexture.Texture06:\r\n return { x: 1, y: 1 };\r\n case PolygonTexture.Texture07:\r\n return { x: 1, y: 1 };\r\n case PolygonTexture.Texture08:\r\n return { x: 2, y: 2 };\r\n case PolygonTexture.Texture09:\r\n return { x: 2, y: 2 };\r\n case PolygonTexture.Texture10:\r\n return { x: 4, y: 4 };\r\n default:\r\n return { x: 1, y: 1 };\r\n }\r\n };\r\n\r\n const textureLoader = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case PolygonTexture.Texture01:\r\n textureImg = PolygonTexture01;\r\n break;\r\n case PolygonTexture.Texture02:\r\n textureImg = PolygonTexture02;\r\n break;\r\n case PolygonTexture.Texture03:\r\n textureImg = PolygonTexture03;\r\n break;\r\n case PolygonTexture.Texture04:\r\n textureImg = PolygonTexture04;\r\n break;\r\n case PolygonTexture.Texture05:\r\n textureImg = PolygonTexture05;\r\n break;\r\n case PolygonTexture.Texture06:\r\n textureImg = PolygonTexture06;\r\n break;\r\n case PolygonTexture.Texture07:\r\n textureImg = PolygonTexture07;\r\n break;\r\n case PolygonTexture.Texture08:\r\n textureImg = PolygonTexture08;\r\n break;\r\n case PolygonTexture.Texture09:\r\n textureImg = PolygonTexture09;\r\n break;\r\n case PolygonTexture.Texture10:\r\n textureImg = PolygonTexture10;\r\n break;\r\n default:\r\n textureImg = PolygonTexture00;\r\n }\r\n return new TextureLoader().load(textureImg, (t) => {\r\n const params = fetchRepeatDividers(textureType);\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n // Don't know why, but we have to use 1, instead of the actual dimension, to divide as follows\r\n t.repeat.set(1 / params.x, 1 / params.y);\r\n const n = new Vector3().fromArray(normal);\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n t.rotation = HALF_PI;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n t.rotation = -HALF_PI;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n t.rotation = Math.PI;\r\n }\r\n setTexture(t);\r\n });\r\n }, [textureType, normal]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n return (\r\n \r\n {filled && (\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n if (objectTypeToAdd === ObjectType.None) {\r\n selectMe(id, e);\r\n }\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n if (e.intersections.length > 1) {\r\n // pass paste point to its parent\r\n state.pastePoint.copy(e.intersections[1].point);\r\n }\r\n state.contextMenuObjectType = ObjectType.Polygon;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={() => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n {shininess === undefined || shininess === 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n\r\n {text && (\r\n \r\n {text}\r\n \r\n )}\r\n\r\n {/* wireframe */}\r\n {(!noOutline || (locked && selected)) && (\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e);\r\n }}\r\n onContextMenu={(e) => {\r\n if (objectTypeToAdd !== ObjectType.None) return;\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const obj = e.intersections[0].object;\r\n const intersected = obj.name === 'Polygon Wireframe' && obj.uuid === id;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Polygon;\r\n }\r\n }\r\n });\r\n }}\r\n />\r\n )}\r\n {/* if not filled, add an enlarged, lifted invisible line for easier selection */}\r\n {!filled && (\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e);\r\n }}\r\n onContextMenu={(e) => {\r\n if (objectTypeToAdd !== ObjectType.None) return;\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const obj = e.intersections[0].object;\r\n const intersected = obj.name === 'Polygon Enlarged Line' && obj.uuid === id;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Polygon;\r\n }\r\n }\r\n });\r\n }}\r\n />\r\n )}\r\n\r\n {/* draw handle */}\r\n {selected && !locked && (\r\n {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Default;\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n )}\r\n {selected &&\r\n !locked &&\r\n absoluteVertices.map((p, i) => {\r\n return (\r\n \r\n {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Resize);\r\n updatePolygonSelectedIndexById(id, i);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Default;\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Default);\r\n updatePolygonSelectedIndexById(id, i);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n onContextMenu={(e) => {\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const vertexIndex = e.intersections[0].object.userData.vertexIndex;\r\n if (vertexIndex !== undefined) {\r\n state.contextMenuObjectType = ObjectType.PolygonVertex;\r\n updatePolygonSelectedIndexById(id, vertexIndex);\r\n }\r\n }\r\n });\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Polygon;\r\n","import React, { useMemo } from 'react';\r\nimport { Extrude, Line } from '@react-three/drei';\r\nimport { HALF_PI, ZERO_TOLERANCE } from 'src/constants';\r\nimport { ParapetArgs } from 'src/models/WallModel';\r\nimport { ActionType, ObjectType, WallTexture } from 'src/types';\r\nimport { Euler, Shape, Vector3 } from 'three';\r\nimport { useWallTexture } from './hooks';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useStore } from 'src/stores/common';\r\n\r\nexport const DEFAULT_PARAPET_SETTINGS: ParapetArgs = {\r\n display: false,\r\n color: 'white',\r\n textureType: WallTexture.NoTexture,\r\n parapetHeight: 1,\r\n copingsWidth: 0.5,\r\n copingsHeight: 0.1,\r\n};\r\n\r\nexport interface WallData {\r\n id: string;\r\n parentId: string;\r\n cx: number;\r\n cy: number;\r\n hx: number;\r\n hy: number;\r\n angle: number;\r\n selected: boolean;\r\n}\r\n\r\nexport interface WallPointData {\r\n leftPoint: number[];\r\n rightPoint: number[];\r\n ly: number;\r\n copingsWidth: number;\r\n}\r\n\r\nexport interface ParapetProps {\r\n args: ParapetArgs;\r\n wallData: WallData;\r\n parapetZ: number;\r\n currWallPointData: WallPointData;\r\n leftWallPointData: WallPointData | null;\r\n rightWallPointData: WallPointData | null;\r\n}\r\n\r\ntype WallPoints = {\r\n leftPoint: Vector3;\r\n rightPoint: Vector3;\r\n};\r\n\r\ntype CopingsPoints = {\r\n innerPoints: WallPoints;\r\n outerPoints: WallPoints;\r\n};\r\n\r\nconst Parapet = ({\r\n args,\r\n wallData,\r\n parapetZ,\r\n currWallPointData,\r\n leftWallPointData,\r\n rightWallPointData,\r\n}: ParapetProps) => {\r\n const { display, color, textureType, parapetHeight, copingsWidth, copingsHeight } = args;\r\n const { id, parentId, cx, cy, hx, hy, angle, selected } = wallData;\r\n const bodyHeight = parapetHeight - copingsHeight;\r\n\r\n const texture = useWallTexture(textureType);\r\n\r\n const copingsPoints = useMemo(() => {\r\n const outerLeft = new Vector3(-hx, hy - copingsWidth / 2);\r\n const outerRight = new Vector3(hx, hy - copingsWidth / 2);\r\n const innerRight = new Vector3(hx, hy + copingsWidth / 2);\r\n const innerLeft = new Vector3(-hx, hy + copingsWidth / 2);\r\n\r\n const points = [outerLeft, outerRight, innerRight, innerLeft];\r\n\r\n if (rightWallPointData || leftWallPointData) {\r\n const currWallCopingsPoints = getCopingsPoints(currWallPointData);\r\n\r\n if (rightWallPointData && isSamePoint(currWallPointData.rightPoint, rightWallPointData.leftPoint)) {\r\n const copingsInterSectionPoints = getCopingsIntersectionPoints(currWallCopingsPoints, rightWallPointData);\r\n if (copingsInterSectionPoints) {\r\n outerRight.copy(copingsInterSectionPoints.outerIntersection);\r\n innerRight.copy(copingsInterSectionPoints.innerIntersection);\r\n }\r\n }\r\n if (leftWallPointData && isSamePoint(currWallPointData.leftPoint, leftWallPointData.rightPoint)) {\r\n const copingsInterSectionPoints = getCopingsIntersectionPoints(currWallCopingsPoints, leftWallPointData);\r\n if (copingsInterSectionPoints) {\r\n outerLeft.copy(copingsInterSectionPoints.outerIntersection);\r\n innerLeft.copy(copingsInterSectionPoints.innerIntersection);\r\n }\r\n }\r\n }\r\n\r\n return points;\r\n }, [hy, copingsWidth, currWallPointData, leftWallPointData, rightWallPointData]);\r\n\r\n const bodyShape = useMemo(() => {\r\n const shape = new Shape();\r\n\r\n const leftPoint = new Vector3(-hx, hy * 2);\r\n const rightPoint = new Vector3(hx, hy * 2);\r\n\r\n if (rightWallPointData || leftWallPointData) {\r\n const currWallInnerPoint = getWallPointsAfterOffset(currWallPointData, currWallPointData.ly);\r\n\r\n if (rightWallPointData && isSamePoint(currWallPointData.rightPoint, rightWallPointData.leftPoint)) {\r\n const rel = getBodyRelativeIntersectionPoint(currWallInnerPoint, rightWallPointData);\r\n rel && rightPoint.copy(rel);\r\n }\r\n if (leftWallPointData && isSamePoint(currWallPointData.leftPoint, leftWallPointData.rightPoint)) {\r\n const rel = getBodyRelativeIntersectionPoint(currWallInnerPoint, leftWallPointData);\r\n rel && leftPoint.copy(rel);\r\n }\r\n }\r\n\r\n shape.moveTo(-hx, 0);\r\n shape.lineTo(hx, 0);\r\n shape.lineTo(rightPoint.x, rightPoint.y);\r\n shape.lineTo(leftPoint.x, leftPoint.y);\r\n shape.closePath();\r\n return shape;\r\n }, [hx, currWallPointData, leftWallPointData, rightWallPointData]);\r\n\r\n const copingsShape = useMemo(() => {\r\n const shape = new Shape();\r\n if (copingsWidth === 0) return shape;\r\n\r\n const [outerLeft, outerRight, innerRight, innerLeft] = copingsPoints;\r\n\r\n shape.moveTo(outerLeft.x, outerLeft.y);\r\n shape.lineTo(outerRight.x, outerRight.y);\r\n shape.lineTo(innerRight.x, innerRight.y);\r\n shape.lineTo(innerLeft.x, innerLeft.y);\r\n shape.closePath();\r\n return shape;\r\n }, [hy, copingsWidth, copingsPoints]);\r\n\r\n const copingsWireframePoints = useMemo(() => {\r\n return copingsPoints.map((v) => v.toArray() as [number, number, number]);\r\n }, [hy, copingsPoints]);\r\n\r\n const bodyHorizontalWireframePoints = useMemo(() => [new Vector3(-hx, 0, 0), new Vector3(hx, 0, 0)], [hx]);\r\n const bodyVerticalWireframePoints = useMemo(() => [new Vector3(), new Vector3(0, 0, bodyHeight)], [bodyHeight]);\r\n\r\n function getCopingsIntersectionPoints(currCopingsPoints: CopingsPoints, sideWallPointData: WallPointData) {\r\n const sideWallCopingsPoints = getCopingsPoints(sideWallPointData);\r\n\r\n const outerIntersection = getIntersectionPoint(\r\n currCopingsPoints.outerPoints.leftPoint,\r\n currCopingsPoints.outerPoints.rightPoint,\r\n sideWallCopingsPoints.outerPoints.leftPoint,\r\n sideWallCopingsPoints.outerPoints.rightPoint,\r\n );\r\n if (!outerIntersection) return null;\r\n\r\n const innerIntersection = getIntersectionPoint(\r\n currCopingsPoints.innerPoints.leftPoint,\r\n currCopingsPoints.innerPoints.rightPoint,\r\n sideWallCopingsPoints.innerPoints.leftPoint,\r\n sideWallCopingsPoints.innerPoints.rightPoint,\r\n );\r\n if (!innerIntersection) return null;\r\n\r\n return {\r\n innerIntersection: new Vector3()\r\n .subVectors(innerIntersection, new Vector3(cx, cy))\r\n .applyEuler(new Euler(0, 0, -angle)),\r\n outerIntersection: new Vector3()\r\n .subVectors(outerIntersection, new Vector3(cx, cy))\r\n .applyEuler(new Euler(0, 0, -angle)),\r\n };\r\n }\r\n\r\n function getBodyRelativeIntersectionPoint(currPoints: WallPoints, sideWallPointData: WallPointData) {\r\n const sideWallPoints = getWallPointsAfterOffset(sideWallPointData, sideWallPointData.ly);\r\n const intersection = getIntersectionPoint(\r\n currPoints.leftPoint,\r\n currPoints.rightPoint,\r\n sideWallPoints.leftPoint,\r\n sideWallPoints.rightPoint,\r\n );\r\n if (!intersection) return null;\r\n return new Vector3().subVectors(intersection, new Vector3(cx, cy)).applyEuler(new Euler(0, 0, -angle));\r\n }\r\n\r\n function isAllowedToSelectMe() {\r\n if (\r\n useStore.getState().moveHandleType ||\r\n useStore.getState().resizeHandleType ||\r\n useStore.getState().isAddingElement()\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function handleParapetPointerDown(e: ThreeEvent) {\r\n if (e.button !== 2 && e.intersections.length > 0 && e.intersections[0].eventObject === e.eventObject) {\r\n if (isAllowedToSelectMe()) {\r\n useStore.getState().selectMe(id, e, ActionType.Select, true);\r\n }\r\n }\r\n }\r\n\r\n function handleParapetContextMenu(e: ThreeEvent) {\r\n useStore.getState().selectMe(id, e, ActionType.ContextMenu, true);\r\n useStore.getState().set((state) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject === e.eventObject) {\r\n state.contextMenuObjectType = ObjectType.Wall;\r\n }\r\n });\r\n }\r\n\r\n if (!display) return null;\r\n\r\n return (\r\n \r\n {/* body */}\r\n \r\n \r\n \r\n\r\n {/* body wireframe */}\r\n \r\n \r\n \r\n\r\n {/* copings */}\r\n \r\n \r\n \r\n\r\n {/* copings wireframe */}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nfunction getCopingsPoints(wallPointData: WallPointData): CopingsPoints {\r\n const innerOffset = (wallPointData.ly + wallPointData.copingsWidth) / 2;\r\n const outerOffset = (wallPointData.ly - wallPointData.copingsWidth) / 2;\r\n return {\r\n innerPoints: getWallPointsAfterOffset(wallPointData, innerOffset),\r\n outerPoints: getWallPointsAfterOffset(wallPointData, outerOffset),\r\n };\r\n}\r\n\r\nfunction getWallPointsAfterOffset(wallPointData: WallPointData, y: number) {\r\n const { leftPoint, rightPoint } = wallPointData;\r\n const leftPointV3 = new Vector3().fromArray(leftPoint);\r\n const rightPointV3 = new Vector3().fromArray(rightPoint);\r\n const normal = new Vector3().subVectors(rightPointV3, leftPointV3).applyEuler(new Euler(0, 0, HALF_PI)).normalize();\r\n const offset = normal.clone().multiplyScalar(y);\r\n return {\r\n leftPoint: leftPointV3.clone().add(offset),\r\n rightPoint: rightPointV3.clone().add(offset),\r\n };\r\n}\r\n\r\nfunction isSamePoint(u: number[], v: number[]) {\r\n return Math.abs(u[0] - v[0]) < ZERO_TOLERANCE && Math.abs(u[1] - v[1]) < ZERO_TOLERANCE;\r\n}\r\n\r\nfunction getIntersectionPoint(v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3) {\r\n if (Math.abs(v1.x - v2.x) < 0.001 && Math.abs(v3.x - v4.x) < 0.001) {\r\n return null;\r\n }\r\n const k1 = (v2.y - v1.y) / (v2.x - v1.x);\r\n const k2 = (v4.y - v3.y) / (v4.x - v3.x);\r\n if (Math.abs(k1 - k2) < 0.001) {\r\n return null;\r\n }\r\n const x = [v1.x, v2.x, v3.x, v4.x];\r\n const y = [v1.y, v2.y, v3.y, v4.y];\r\n const x0 =\r\n ((x[2] - x[3]) * (x[1] * y[0] - x[0] * y[1]) - (x[0] - x[1]) * (x[3] * y[2] - x[2] * y[3])) /\r\n ((x[2] - x[3]) * (y[0] - y[1]) - (x[0] - x[1]) * (y[2] - y[3]));\r\n const y0 =\r\n ((y[2] - y[3]) * (y[1] * x[0] - y[0] * x[1]) - (y[0] - y[1]) * (y[3] * x[2] - y[2] * x[3])) /\r\n ((y[2] - y[3]) * (x[0] - x[1]) - (y[0] - y[1]) * (x[2] - x[3]));\r\n if (!Number.isFinite(x0) || !Number.isFinite(y0)) {\r\n return null;\r\n }\r\n return new Vector3(x0, y0);\r\n}\r\n\r\nexport default React.memo(Parapet);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport {\r\n BackSide,\r\n CanvasTexture,\r\n DoubleSide,\r\n Euler,\r\n FrontSide,\r\n Mesh,\r\n MeshStandardMaterial,\r\n Object3D,\r\n Raycaster,\r\n RepeatWrapping,\r\n Shape,\r\n Vector2,\r\n Vector3,\r\n} from 'three';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport { Box, Cylinder, Plane } from '@react-three/drei';\r\nimport { ActionType, MoveHandleType, ObjectType, Orientation, ResizeHandleType, WallTexture } from 'src/types';\r\nimport { Util } from 'src/Util';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { WallFill, WallModel, WallStructure } from 'src/models/WallModel';\r\nimport { ElementModelFactory } from 'src/models/ElementModelFactory';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { ElementGrid } from '../elementGrid';\r\nimport Window, { DEFAULT_POLYGONTOP, WINDOW_GROUP_NAME } from '../window/window';\r\nimport WallWireFrame from './wallWireFrame';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { UndoableAdd } from 'src/undo/UndoableAdd';\r\nimport { UndoableResizeElementOnWall } from 'src/undo/UndoableResize';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\nimport Door from '../door/door';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport SolarPanelOnWall from '../solarPanel/solarPanelOnWall';\r\nimport { useElements, useLatestFoundation, useWallTexture } from './hooks';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { HorizontalRuler } from '../horizontalRuler';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { showError } from 'src/helpers';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { RoofUtil } from '../roof/RoofUtil';\r\nimport {\r\n FINE_GRID_SCALE,\r\n HALF_PI,\r\n INVALID_ELEMENT_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n NORMAL_GRID_SCALE,\r\n} from 'src/constants';\r\nimport { PolygonModel } from '../../models/PolygonModel';\r\nimport Polygon from '../polygon';\r\nimport { SharedUtil } from '../SharedUtil';\r\nimport { UndoableChange } from '../../undo/UndoableChange';\r\nimport Parapet, { DEFAULT_PARAPET_SETTINGS } from './parapet';\r\nimport { InnerCommonStoreState } from 'src/stores/InnerCommonState';\r\nimport WallHeatFlux from './wallHeatFlux';\r\nimport { useSelected } from '../hooks';\r\n\r\nexport const WALL_BLOCK_PLANE = 'Wall Block Plane';\r\n\r\nexport const WALL_INTERSECTION_PLANE_NAME = 'Wall Intersection Plane';\r\n\r\nexport const WALL_PADDING = 0.1;\r\nexport interface WallProps {\r\n wallModel: WallModel;\r\n foundationModel: FoundationModel;\r\n}\r\n\r\nconst PERPENDICULAR_THRESHOLD = 0.087; // 5 degree\r\n\r\nenum ElBeingAddedStatus {\r\n SettingStartPoint,\r\n SettingEndPoint,\r\n}\r\n\r\ntype ElBeingAdded = {\r\n id: string;\r\n type: ObjectType;\r\n status: ElBeingAddedStatus;\r\n};\r\n\r\ntype BoundedPointerOptions = {\r\n elementHalfSize?: number[];\r\n ignorePadding?: boolean;\r\n resizeAnchor?: Vector3;\r\n};\r\n\r\nconst InsideWallMaterial = React.memo(\r\n ({ transparent, color, opacity }: { transparent: boolean; color: string; opacity: number }) => {\r\n const sunlightDirection = useStore(Selector.sunlightDirection);\r\n const night = sunlightDirection.z <= 0;\r\n return (\r\n \r\n );\r\n },\r\n);\r\n\r\nconst Wall = ({ wallModel, foundationModel }: WallProps) => {\r\n let {\r\n id,\r\n cx,\r\n cy,\r\n lx = 1,\r\n ly = 0.5,\r\n lz = 5,\r\n relativeAngle,\r\n leftJoints,\r\n rightJoints,\r\n textureType,\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n parentId,\r\n locked = false,\r\n roofId,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n wallStructure = WallStructure.Default,\r\n structureSpacing = 2,\r\n structureWidth = 0.1,\r\n structureColor = 'white',\r\n opacity = 0.5,\r\n fill = WallFill.Full,\r\n leftUnfilledHeight = 0.5,\r\n rightUnfilledHeight = 0.5,\r\n leftTopPartialHeight = lz,\r\n rightTopPartialHeight = lz,\r\n parapet = DEFAULT_PARAPET_SETTINGS,\r\n leftPoint,\r\n rightPoint,\r\n } = wallModel;\r\n\r\n leftRoofHeight = leftJoints.length > 0 ? leftRoofHeight : lz;\r\n rightRoofHeight = rightJoints.length > 0 ? rightRoofHeight : lz;\r\n\r\n const texture = useWallTexture(textureType);\r\n\r\n const selected = useSelected(id);\r\n\r\n // common store\r\n const setCommonStore = useStore(Selector.set);\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const selectMe = useStore(Selector.selectMe);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const isAddingElement = useStore(Selector.isAddingElement);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const deletedRoofIdSet = useStore(Selector.deletedRoofIdSet);\r\n const autoDeletedRoofIdSet = useStore(Selector.autoDeletedRoofIdSet);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n // const roofRise = useStore((state) => {\r\n // if (!roofId) return 0;\r\n // const roof = state.elements.find((e) => e.id === roofId) as RoofModel;\r\n // if (!roof) return 0;\r\n // return roof.rise;\r\n // });\r\n\r\n // primitive store\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const elementBeingCanceledId = usePrimitiveStore((state) => state.elementBeingCanceledId);\r\n const showWallIntersectionPlaneId = usePrimitiveStore((state) => state.showWallIntersectionPlaneId);\r\n\r\n // state\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n\r\n // hooks\r\n const { camera, gl, invalidate } = useThree();\r\n const { elementsOnWall, leftWall, rightWall } = useElements(id, leftJoints[0], rightJoints[0]);\r\n const latestFoundation = useLatestFoundation(foundationModel);\r\n\r\n // object ref\r\n const outsideWallRef = useRef(null);\r\n const insideWallRef = useRef(null);\r\n const topSurfaceRef = useRef(null);\r\n const intersectionPlaneRef = useRef(null);\r\n\r\n // variables\r\n const grabRef = useRef(null);\r\n const addedWindowIdRef = useRef(null);\r\n const invalidElementIdRef = useRef(null);\r\n const elBeingAddedRef = useRef(null);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const wallAbsAngle = latestFoundation ? latestFoundation.rotation[2] + relativeAngle : relativeAngle;\r\n const leftOffset = Util.getInnerWallOffset(leftWall, lx, ly, relativeAngle, 'left');\r\n const rightOffset = Util.getInnerWallOffset(rightWall, lx, ly, relativeAngle, 'right');\r\n const transparent = wallStructure === WallStructure.Stud || wallStructure === WallStructure.Pillar;\r\n const wallLeftHeight = leftRoofHeight ?? lz;\r\n const wallRightHeight = rightRoofHeight ?? lz;\r\n const isPartial = fill === WallFill.Partial;\r\n const realLeftUnfilledHeight = isPartial ? leftUnfilledHeight : 0;\r\n const realRightUnfilledHeight = isPartial ? rightUnfilledHeight : 0;\r\n const realWallLeftHeight = isPartial ? Math.min(wallLeftHeight, leftTopPartialHeight) : wallLeftHeight;\r\n const realWallRightHeight = isPartial ? Math.min(wallRightHeight, rightTopPartialHeight) : wallRightHeight;\r\n const isTopPartial =\r\n isPartial &&\r\n (!Util.isZero(wallLeftHeight - realWallLeftHeight) || !Util.isZero(wallRightHeight - realWallRightHeight));\r\n const castShadow = shadowEnabled && !transparent;\r\n const showParapet = parapet.display;\r\n const parapetZ = Math.max(realWallLeftHeight, realWallRightHeight) - hz;\r\n\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const ray = useMemo(() => new Raycaster(), []);\r\n\r\n const whiteMaterialDouble = useMemo(\r\n () => new MeshStandardMaterial({ color: 'white', side: DoubleSide, transparent: transparent, opacity: opacity }),\r\n [transparent, opacity],\r\n );\r\n\r\n const zmax = useMemo(() => {\r\n return Util.getHighestPointOfWall(wallModel);\r\n }, [\r\n wallModel.lz,\r\n wallModel.leftRoofHeight,\r\n wallModel.rightRoofHeight,\r\n wallModel.centerRoofHeight,\r\n wallModel.centerLeftRoofHeight,\r\n wallModel.centerRightRoofHeight,\r\n ]);\r\n\r\n const outsideWallShape = useMemo(() => {\r\n const wallShape = new Shape();\r\n drawWallShape(wallShape, lx, lz, 0, 0, 0, 0);\r\n\r\n elementsOnWall.forEach((e) => {\r\n if (e.type === ObjectType.Window && e.id !== invalidElementIdRef.current && e.lx > 0 && e.lz > 0) {\r\n const window = e as WindowModel;\r\n const windowShape = new Shape();\r\n const [wlx, wly, wcx, wcy] = [e.lx * lx, e.lz * lz, e.cx * lx, e.cz * lz];\r\n // old files don't have windowType\r\n if (window.windowType) {\r\n switch (window.windowType) {\r\n case WindowType.Arched:\r\n drawArchWindow(windowShape, wlx, wly, wcx, wcy, window.archHeight);\r\n break;\r\n case WindowType.Polygonal: {\r\n const [tx, th] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n drawPolygonalWindow(windowShape, wlx, wly, wcx, wcy, tx * wlx, th);\r\n break;\r\n }\r\n case WindowType.Default:\r\n default:\r\n drawRectWindow(windowShape, wlx, wly, wcx, wcy);\r\n }\r\n } else {\r\n drawRectWindow(windowShape, wlx, wly, wcx, wcy);\r\n }\r\n wallShape.holes.push(windowShape);\r\n }\r\n });\r\n\r\n return wallShape;\r\n }, [\r\n lx,\r\n lz,\r\n fill,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n realWallLeftHeight,\r\n realWallRightHeight,\r\n elementsOnWall,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n ]);\r\n\r\n const insideWallShape = useMemo(() => {\r\n const wallShape = new Shape();\r\n\r\n const ly = lz;\r\n const hy = lz / 2;\r\n\r\n // lower edge, from left to right\r\n if (isPartial) {\r\n wallShape.moveTo(-hx + leftOffset, -hy + leftUnfilledHeight); // lower left\r\n wallShape.lineTo(hx - rightOffset, -hy + rightUnfilledHeight); // lower right\r\n } else {\r\n wallShape.moveTo(-hx + leftOffset, -hy); // lower left\r\n const doors = elementsOnWall.filter((e) => e.type === ObjectType.Door).sort((a, b) => a.cx - b.cx) as DoorModel[];\r\n for (const door of doors) {\r\n if (door.id !== invalidElementIdRef.current) {\r\n const [dcx, dcy, dlx, dly] = [door.cx * lx, door.cz * ly, door.lx * lx, door.lz * ly];\r\n if (door.doorType === DoorType.Default) {\r\n wallShape.lineTo(dcx - dlx / 2, -hy);\r\n wallShape.lineTo(dcx - dlx / 2, -hy + dly);\r\n wallShape.lineTo(dcx + dlx / 2, -hy + dly);\r\n wallShape.lineTo(dcx + dlx / 2, -hy);\r\n } else {\r\n const ah = Math.min(door.archHeight, dly, dlx / 2);\r\n wallShape.lineTo(dcx - dlx / 2, -hy);\r\n if (ah > 0.1) {\r\n wallShape.lineTo(dcx - dlx / 2, -hy + dly / 2 - ah);\r\n const r = ah / 2 + dlx ** 2 / (8 * ah);\r\n const [cX, cY] = [dcx, dcy + dly / 2 - r];\r\n const endAngle = Math.acos(Math.min(dlx / 2 / r, 1));\r\n const startAngle = Math.PI - endAngle;\r\n wallShape.absarc(cX, cY, r, startAngle, endAngle, true);\r\n } else {\r\n wallShape.lineTo(dcx - dlx / 2, -hy + dly);\r\n wallShape.lineTo(dcx + dlx / 2, -hy + dly);\r\n }\r\n wallShape.lineTo(dcx + dlx / 2, -hy);\r\n }\r\n }\r\n }\r\n wallShape.lineTo(hx - rightOffset, -hy); // lower right\r\n }\r\n\r\n // upper edge, from right to left\r\n if (isTopPartial) {\r\n const dh = realWallRightHeight - realWallLeftHeight;\r\n const rightOffsetHeight = ((lx - rightOffset) * dh) / lx;\r\n const leftOffsetHeight = (leftOffset * dh) / lx;\r\n\r\n wallShape.lineTo(hx - rightOffset, -hy + realWallLeftHeight + rightOffsetHeight); // upper right\r\n wallShape.lineTo(-hx + leftOffset, -hy + realWallLeftHeight + leftOffsetHeight); // upper left\r\n } else if (roofId) {\r\n if (rightRoofHeight) {\r\n wallShape.lineTo(hx - rightOffset, rightRoofHeight - hy);\r\n } else {\r\n wallShape.lineTo(hx - rightOffset, hy); // upper right\r\n }\r\n centerRightRoofHeight && wallShape.lineTo(centerRightRoofHeight[0] * lx, centerRightRoofHeight[1] - hy);\r\n centerRoofHeight && wallShape.lineTo(centerRoofHeight[0] * lx, centerRoofHeight[1] - hy);\r\n centerLeftRoofHeight && wallShape.lineTo(centerLeftRoofHeight[0] * lx, centerLeftRoofHeight[1] - hy);\r\n if (leftRoofHeight) {\r\n wallShape.lineTo(-hx + leftOffset, leftRoofHeight - hy);\r\n } else {\r\n wallShape.lineTo(-hx + leftOffset, hy); // upper left\r\n }\r\n } else {\r\n wallShape.lineTo(hx - rightOffset, hy); // upper right\r\n wallShape.lineTo(-hx + leftOffset, hy); // upper left\r\n }\r\n\r\n wallShape.closePath();\r\n\r\n elementsOnWall.forEach((w) => {\r\n if (w.type === ObjectType.Window && w.id !== invalidElementIdRef.current && w.lx > 0 && w.lz > 0) {\r\n const window = w as WindowModel;\r\n const windowShape = new Shape();\r\n const [wlx, wly, wcx, wcy] = [w.lx * lx, w.lz * lz, w.cx * lx, w.cz * lz];\r\n // old files don't have windowType\r\n if (window.windowType) {\r\n switch (window.windowType) {\r\n case WindowType.Arched:\r\n drawArchWindow(windowShape, wlx, wly, wcx, wcy, window.archHeight);\r\n break;\r\n case WindowType.Polygonal: {\r\n const [tx, th] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n drawPolygonalWindow(windowShape, wlx, wly, wcx, wcy, tx * wlx, th);\r\n break;\r\n }\r\n case WindowType.Default:\r\n default:\r\n drawRectWindow(windowShape, wlx, wly, wcx, wcy);\r\n break;\r\n }\r\n } else {\r\n drawRectWindow(windowShape, wlx, wly, wcx, wcy);\r\n }\r\n wallShape.holes.push(windowShape);\r\n }\r\n });\r\n return wallShape;\r\n }, [\r\n lx,\r\n lz,\r\n fill,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n realWallLeftHeight,\r\n realWallRightHeight,\r\n leftOffset,\r\n rightOffset,\r\n elementsOnWall,\r\n roofId,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n ]);\r\n\r\n const topSurfaceHeight = useMemo(() => {\r\n if (!isPartial) return hz;\r\n return (realWallLeftHeight + realWallRightHeight) / 2 - hz;\r\n }, [hz, isPartial, realWallLeftHeight, realWallRightHeight]);\r\n\r\n const topSurfaceRotationY = useMemo(() => {\r\n const dh = realWallRightHeight - realWallLeftHeight;\r\n if (!isPartial || Math.abs(dh) < 0.01) return 0;\r\n return Math.atan2(dh, lx);\r\n }, [lx, isPartial, realWallLeftHeight, realWallRightHeight]);\r\n\r\n const topWallShape = useMemo(() => {\r\n const shape = new Shape();\r\n if (!isPartial || Math.abs(topSurfaceRotationY) < 0.0001) {\r\n drawTopSurface(shape, lx, ly, leftOffset, rightOffset);\r\n return shape;\r\n } else {\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const t = Math.cos(topSurfaceRotationY);\r\n const tHx = hx / t;\r\n const tInnerLeftHx = (hx - leftOffset) / t;\r\n const tInnerRightHx = (hx - rightOffset) / t;\r\n\r\n shape.moveTo(-tHx, -hy);\r\n shape.lineTo(tHx, -hy);\r\n shape.lineTo(tInnerRightHx, hy);\r\n shape.lineTo(-tInnerLeftHx, hy);\r\n shape.closePath();\r\n\r\n return shape;\r\n }\r\n }, [lx, ly, leftOffset, rightOffset, isPartial, topSurfaceRotationY]);\r\n\r\n const outerWallPoints2D = useMemo(() => {\r\n const points: Point2[] = [];\r\n const x = lx / 2;\r\n const y = lz / 2;\r\n\r\n if (isPartial) {\r\n points.push({ x: -x + leftOffset, y: -y + realLeftUnfilledHeight });\r\n points.push({ x: x - rightOffset, y: -y + realRightUnfilledHeight });\r\n } else {\r\n points.push({ x: -x, y: -y });\r\n points.push({ x: x, y: -y });\r\n }\r\n\r\n if (isTopPartial) {\r\n points.push({ x: x - rightOffset, y: -y + realWallRightHeight });\r\n points.push({ x: -x + leftOffset, y: -y + realWallLeftHeight });\r\n } else {\r\n rightRoofHeight ? points.push({ x: x, y: rightRoofHeight - y }) : points.push({ x: x, y: y });\r\n if (centerRightRoofHeight) {\r\n points.push({ x: centerRightRoofHeight[0] * lx, y: centerRightRoofHeight[1] - y });\r\n }\r\n if (centerRoofHeight) {\r\n points.push({ x: centerRoofHeight[0] * lx, y: centerRoofHeight[1] - y });\r\n }\r\n if (centerLeftRoofHeight) {\r\n points.push({ x: centerLeftRoofHeight[0] * lx, y: centerLeftRoofHeight[1] - y });\r\n }\r\n leftRoofHeight ? points.push({ x: -x, y: leftRoofHeight - y }) : points.push({ x: -x, y: y });\r\n }\r\n\r\n return points;\r\n }, [\r\n lx,\r\n lz,\r\n fill,\r\n realLeftUnfilledHeight,\r\n realRightUnfilledHeight,\r\n realWallLeftHeight,\r\n realWallRightHeight,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n ]);\r\n\r\n const structureUnitArray = useMemo(() => {\r\n const arr: number[][] = [];\r\n let k = 0,\r\n b = 0;\r\n if (fill === WallFill.Partial) {\r\n const dy = rightUnfilledHeight - leftUnfilledHeight;\r\n k = dy / lx;\r\n b = leftUnfilledHeight + hx * k;\r\n }\r\n if (wallStructure === WallStructure.Stud) {\r\n let pos = -hx + structureWidth / 2;\r\n while (pos <= hx) {\r\n arr.push([pos, k * pos + b]);\r\n pos += structureSpacing;\r\n }\r\n pos = hx - structureWidth / 2;\r\n arr.push([pos, k * pos + b]);\r\n } else if (wallStructure === WallStructure.Pillar) {\r\n let pos = -hx;\r\n while (pos <= hx) {\r\n arr.push([pos, k * pos + b]);\r\n pos += structureSpacing;\r\n }\r\n arr.push([hx, k * hx + b]);\r\n }\r\n\r\n return arr;\r\n }, [wallStructure, structureWidth, structureSpacing, lx, ly, lz, leftUnfilledHeight, rightUnfilledHeight]);\r\n\r\n // parapet\r\n const wallDataToParapet = useMemo(\r\n () => ({ id, parentId, cx, cy, hx, hy, angle: relativeAngle, selected }),\r\n [id, parentId, cx, cy, hx, hy, relativeAngle, selected],\r\n );\r\n\r\n const currWallPointDataToParapet = useMemo(\r\n () => ({\r\n leftPoint,\r\n rightPoint,\r\n ly,\r\n copingsWidth: parapet.copingsWidth,\r\n }),\r\n [leftPoint, rightPoint, ly, parapet.copingsWidth],\r\n );\r\n\r\n const leftWallPointDataToParapet = useMemo(() => {\r\n if (!leftWall || !leftWall.parapet || !leftWall.parapet.display) return null;\r\n return {\r\n leftPoint: leftWall.leftPoint,\r\n rightPoint: leftWall.rightPoint,\r\n ly: leftWall.ly,\r\n copingsWidth: leftWall.parapet.copingsWidth,\r\n };\r\n }, [\r\n leftWall?.leftPoint,\r\n leftWall?.rightPoint,\r\n leftWall?.ly,\r\n leftWall?.parapet?.copingsWidth,\r\n leftWall?.parapet?.display,\r\n ]);\r\n\r\n const rightWallPointDataToParapet = useMemo(() => {\r\n if (!rightWall || !rightWall.parapet || !rightWall.parapet.display) return null;\r\n return {\r\n leftPoint: rightWall.leftPoint,\r\n rightPoint: rightWall.rightPoint,\r\n ly: rightWall.ly,\r\n copingsWidth: rightWall.parapet.copingsWidth,\r\n };\r\n }, [\r\n rightWall?.leftPoint,\r\n rightWall?.rightPoint,\r\n rightWall?.ly,\r\n rightWall?.parapet?.copingsWidth,\r\n rightWall?.parapet?.display,\r\n ]);\r\n\r\n // effects\r\n useEffect(() => {\r\n if (elBeingAddedRef.current && elBeingAddedRef.current.id === elementBeingCanceledId) {\r\n elBeingAddedRef.current = null;\r\n resetBeingAddedChildId();\r\n }\r\n }, [elementBeingCanceledId]);\r\n\r\n useEffect(() => {\r\n if (wallModel && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(wallModel.id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n t.wrapS = RepeatWrapping;\r\n t.wrapT = RepeatWrapping;\r\n const shiftZ = lz === zmax ? 0 : (1 - lz / zmax) / 2;\r\n t.offset.set(-lx / 2, -zmax / 2 - shiftZ);\r\n t.center.set(lx / 2, zmax / 2);\r\n t.repeat.set(1 / lx, 1 / zmax);\r\n setHeatmapTexture(t);\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n if (!roofId) return;\r\n if (deletedRoofIdSet.has(roofId) || autoDeletedRoofIdSet.has(roofId)) {\r\n useStore.getState().set((state) => {\r\n const invalidateIdSet = new Set();\r\n\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n wall.roofId = null;\r\n wall.leftRoofHeight = undefined;\r\n wall.rightRoofHeight = undefined;\r\n wall.centerRoofHeight = undefined;\r\n wall.centerLeftRoofHeight = undefined;\r\n wall.centerRightRoofHeight = undefined;\r\n\r\n if (elementsOnWall.length > 0) {\r\n const wallPoints = RoofUtil.getWallPoints2D(wall);\r\n elementsOnWall.forEach((e) => {\r\n if (e.type === ObjectType.Polygon) return;\r\n const isDoor = e.type === ObjectType.Door;\r\n const isSolarPanel = e.type === ObjectType.SolarPanel;\r\n const eLx = isSolarPanel ? e.lx - 0.01 : e.lx * lx;\r\n const eLz = isSolarPanel ? e.ly - 0.01 : e.lz * lz;\r\n const center = new Vector3(e.cx * lx, 0, e.cz * lz);\r\n if (!Util.isElementInsideWall(center, eLx, eLz, wallPoints, isDoor)) {\r\n invalidateIdSet.add(e.id);\r\n if (state.autoDeletedChild) {\r\n state.autoDeletedChild.push(e);\r\n } else {\r\n state.autoDeletedChild = [e];\r\n }\r\n }\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n if (invalidateIdSet.size > 0) {\r\n state.elements = state.elements.filter((e) => !invalidateIdSet.has(e.id));\r\n } else {\r\n if (state.autoDeletedChild === null) {\r\n state.autoDeletedChild = [];\r\n }\r\n }\r\n });\r\n }\r\n }, [roofId, deletedRoofIdSet, autoDeletedRoofIdSet]);\r\n\r\n function drawWallShape(\r\n shape: Shape,\r\n lx: number,\r\n ly: number,\r\n cx = 0,\r\n cy = 0,\r\n leftOffset = 0,\r\n rightOffset = 0,\r\n drawDoorShape = true,\r\n ) {\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n\r\n // lower left\r\n if (isPartial) {\r\n shape.moveTo(cx - hx + leftOffset, cy - hy + leftUnfilledHeight);\r\n } else {\r\n shape.moveTo(cx - hx + leftOffset, cy - hy);\r\n }\r\n\r\n // doors\r\n if (drawDoorShape) {\r\n const doors = elementsOnWall.filter((e) => e.type === ObjectType.Door).sort((a, b) => a.cx - b.cx) as DoorModel[];\r\n for (const door of doors) {\r\n if (door.id !== invalidElementIdRef.current) {\r\n const [dcx, dcy, dlx, dly] = [door.cx * lx, door.cz * ly, door.lx * lx, door.lz * lz];\r\n if (door.doorType === DoorType.Default) {\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy);\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy + dly);\r\n shape.lineTo(cx + dcx + dlx / 2, cy - hy + dly);\r\n shape.lineTo(cx + dcx + dlx / 2, cy - hy);\r\n } else {\r\n const ah = Math.min(door.archHeight, dly, dlx / 2);\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy);\r\n if (ah > 0.1) {\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy + dly / 2 - ah);\r\n const r = ah / 2 + dlx ** 2 / (8 * ah);\r\n const [cX, cY] = [dcx, cy + dcy + dly / 2 - r];\r\n const endAngle = Math.acos(Math.min(dlx / 2 / r, 1));\r\n const startAngle = Math.PI - endAngle;\r\n shape.absarc(cX, cY, r, startAngle, endAngle, true);\r\n } else {\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy + dly);\r\n shape.lineTo(cx + dcx + dlx / 2, cy - hy + dly);\r\n }\r\n shape.lineTo(cx + dcx + dlx / 2, cy - hy);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // lower right\r\n if (isPartial) {\r\n shape.lineTo(cx + hx - rightOffset, cy - hy + rightUnfilledHeight);\r\n } else {\r\n shape.lineTo(cx + hx - rightOffset, cy - hy);\r\n }\r\n\r\n // top edges\r\n if (isTopPartial) {\r\n shape.lineTo(cx + hx - rightOffset, cy - hy + realWallRightHeight); // top right\r\n shape.lineTo(cx - hx + leftOffset, cy - hy + realWallLeftHeight); // top left\r\n } else if (roofId) {\r\n if (rightRoofHeight) {\r\n shape.lineTo(cx + hx - rightOffset, rightRoofHeight - hy);\r\n } else {\r\n shape.lineTo(cx + hx - rightOffset, cy + hy); // upper right\r\n }\r\n centerRightRoofHeight && shape.lineTo(centerRightRoofHeight[0] * lx, centerRightRoofHeight[1] - hy);\r\n centerRoofHeight && shape.lineTo(centerRoofHeight[0] * lx, centerRoofHeight[1] - hy);\r\n centerLeftRoofHeight && shape.lineTo(centerLeftRoofHeight[0] * lx, centerLeftRoofHeight[1] - hy);\r\n if (leftRoofHeight) {\r\n shape.lineTo(cx - hx + leftOffset, leftRoofHeight - hy);\r\n } else {\r\n shape.lineTo(cx - hx + leftOffset, cy + hy); // upper left\r\n }\r\n } else {\r\n shape.lineTo(cx + hx - rightOffset, cy + hy); // upper right\r\n shape.lineTo(cx - hx + leftOffset, cy + hy); // upper left\r\n }\r\n\r\n shape.closePath();\r\n }\r\n\r\n function getRelativePosOnWall(p: Vector3, wall: WallModel) {\r\n const { cx, cy, cz } = wall;\r\n if (latestFoundation && wallAbsAngle !== undefined) {\r\n const wallAbsPos = Util.wallAbsolutePosition(new Vector3(cx, cy, cz), latestFoundation).setZ(\r\n lz / 2 + latestFoundation.lz,\r\n );\r\n return new Vector3().subVectors(p, wallAbsPos).applyEuler(new Euler(0, 0, -wallAbsAngle));\r\n }\r\n return new Vector3();\r\n }\r\n\r\n function getElementVerticesOnWall(e: ElementModel) {\r\n const vertices: Point2[] = [];\r\n\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const [signX, signY] = [i, i * j];\r\n switch (e.type) {\r\n case ObjectType.Window: {\r\n const [cx, cy] = [e.cx * lx, e.cz * lz];\r\n const [hlx, hly] = [(e.lx * lx) / 2, (e.lz * lz) / 2];\r\n const x = cx + signX * hlx;\r\n const y = cy + signY * hly;\r\n vertices.push({ x, y } as Point2);\r\n break;\r\n }\r\n case ObjectType.Door: {\r\n const [cx, cy] = [e.cx * lx, e.cz * lz];\r\n const [hlx, hly] = [(e.lx * lx) / 2, (e.lz * lz) / 2];\r\n const x = cx + signX * hlx;\r\n const y = cy + signY * hly;\r\n vertices.push({ x, y } as Point2);\r\n break;\r\n }\r\n case ObjectType.SolarPanel: {\r\n const [cx, cy] = [e.cx * lx, e.cz * lz];\r\n const [hlx, hly] = [e.lx / 2, e.ly / 2];\r\n const x = cx + signX * hlx;\r\n const y = cy + signY * hly;\r\n vertices.push({ x, y } as Point2);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (e.type === ObjectType.Window && (e as WindowModel).windowType === WindowType.Polygonal) {\r\n const window = e as WindowModel;\r\n const [topX, topH] = window.polygonTop ?? [0, 0];\r\n vertices.push({ x: e.cx * lx + topX * e.lx * lx, y: e.cz * lz + (e.lz * lz) / 2 + topH } as Point2);\r\n }\r\n\r\n return vertices;\r\n }\r\n\r\n function getWallBoundary(wall: WallModel, margin = 0): Point2[] {\r\n if (!isPartial) return Util.getWallVertices(wall, margin);\r\n const hx = wall.lx / 2;\r\n const hz = wall.lz / 2;\r\n const lowerLeft = { x: -hx - margin, y: wall.leftUnfilledHeight - hz - margin } as Point2;\r\n const lowerRight = { x: hx + margin, y: wall.rightUnfilledHeight - hz - margin } as Point2;\r\n const upperLeft = { x: -hx - margin, y: wall.leftTopPartialHeight - hz + margin } as Point2;\r\n const upperRight = { x: hx + margin, y: wall.rightTopPartialHeight - hz + margin } as Point2;\r\n const vertices: Point2[] = [];\r\n vertices.push(upperLeft, lowerLeft, lowerRight, upperRight);\r\n if (!isTopPartial) {\r\n if (wall.centerRightRoofHeight) {\r\n vertices.push({\r\n x: wall.centerRightRoofHeight[0] * wall.lx,\r\n y: wall.centerRightRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n if (wall.centerRoofHeight) {\r\n vertices.push({ x: wall.centerRoofHeight[0] * wall.lx, y: wall.centerRoofHeight[1] - hz + margin } as Point2);\r\n }\r\n if (wall.centerLeftRoofHeight) {\r\n vertices.push({\r\n x: wall.centerLeftRoofHeight[0] * wall.lx,\r\n y: wall.centerLeftRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n function checkCollision(id: string, p: Vector3, elx: number, elz: number, polygonTop?: number[]) {\r\n if (elx < 0.1 || elz < 0.1) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n\r\n if (elx > lx || (!roofId && elz > lz)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n\r\n const margin = 0.1;\r\n elx += margin;\r\n elz += margin;\r\n\r\n for (const el of elementsOnWall) {\r\n if (el.id === id || el.type === ObjectType.Polygon) continue;\r\n\r\n // target element vertices\r\n const targetVertices = getElementVerticesOnWall(el);\r\n const currentVertices: Point2[] = [];\r\n\r\n // check if current element vertices inside target element vertices\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const pointX = p.x + (i * elx) / 2;\r\n const pointY = p.z + (i * j * elz) / 2;\r\n currentVertices.push({ x: pointX, y: pointY });\r\n if (Util.isPointInside(pointX, pointY, targetVertices)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n }\r\n }\r\n if (polygonTop) {\r\n const [topX, topH] = polygonTop;\r\n const pointX = p.x + topX * elx;\r\n const pointY = p.z + elz / 2 + topH;\r\n currentVertices.push({ x: pointX, y: pointY });\r\n if (Util.isPointInside(pointX, pointY, targetVertices)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n }\r\n\r\n // check if target element vertices inside current element vertices\r\n for (const targetVertex of targetVertices) {\r\n if (Util.isPointInside(targetVertex.x, targetVertex.y, currentVertices)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n invalidElementIdRef.current = null;\r\n return true; // no collision\r\n }\r\n\r\n function checkInsideBoundary(id: string, center: Vector3, eLx: number, eLz: number, isDoor?: boolean) {\r\n if (!Util.isElementInsideWall(center, eLx, eLz, outerWallPoints2D, isDoor)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function checkPolygonTopInsideBoundary(center: Vector3, wLx: number, wLz: number, polygonTop: number[]) {\r\n const [tx, th] = polygonTop;\r\n const topPointX = center.x + wLx * tx;\r\n const topPointY = center.z + wLz / 2 + th;\r\n if (!Util.isPointInside(topPointX, topPointY, getWallBoundary(wallModel, 0))) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function setRayCast(e: PointerEvent) {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n }\r\n\r\n function checkIfCanSelectMe(e: ThreeEvent) {\r\n return !(\r\n e.button === 2 ||\r\n useStore.getState().addedWallId ||\r\n addedWindowIdRef.current ||\r\n useStore.getState().moveHandleType ||\r\n useStore.getState().resizeHandleType ||\r\n useStore.getState().objectTypeToAdd !== ObjectType.None ||\r\n selected ||\r\n isAddingElement()\r\n );\r\n }\r\n\r\n function drawTopSurface(shape: Shape, lx: number, ly: number, leftOffset: number, rightOffset: number) {\r\n const x = lx / 2;\r\n const y = ly / 2;\r\n shape.moveTo(-x, -y);\r\n shape.lineTo(x, -y);\r\n shape.lineTo(x - rightOffset, y);\r\n shape.lineTo(-x + leftOffset, y);\r\n shape.closePath();\r\n }\r\n\r\n function drawRectWindow(shape: Shape, lx: number, ly: number, cx = 0, cy = 0) {\r\n const x = lx / 2;\r\n const y = ly / 2;\r\n shape.moveTo(cx - x, cy - y);\r\n shape.lineTo(cx + x, cy - y);\r\n shape.lineTo(cx + x, cy + y);\r\n shape.lineTo(cx - x, cy + y);\r\n shape.closePath();\r\n }\r\n\r\n function drawArchWindow(shape: Shape, lx: number, ly: number, cx: number, cy: number, archHeight = 0) {\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const ah = Math.min(archHeight, ly, hx);\r\n\r\n shape.moveTo(cx - hx, cy - hy);\r\n shape.lineTo(cx + hx, cy - hy);\r\n shape.lineTo(cx + hx, cy + hy - ah);\r\n\r\n if (ah > 0) {\r\n const r = ah / 2 + lx ** 2 / (8 * ah);\r\n const [cX, cY] = [cx, cy + hy - r];\r\n const startAngle = Math.acos(Math.min(1, hx / r));\r\n const endAngle = Math.PI - startAngle;\r\n shape.absarc(cX, cY, r, startAngle, endAngle, false);\r\n } else {\r\n shape.lineTo(cx - hx, cy + hy);\r\n }\r\n\r\n shape.closePath();\r\n }\r\n\r\n function drawPolygonalWindow(shape: Shape, lx: number, ly: number, cx: number, cy: number, tx: number, th: number) {\r\n const [hx, hy] = [lx / 2, ly / 2];\r\n shape.moveTo(cx - hx, cy - hy);\r\n shape.lineTo(cx + hx, cy - hy);\r\n shape.lineTo(cx + hx, cy + hy);\r\n shape.lineTo(cx + tx, cy + hy + th);\r\n shape.lineTo(cx - hx, cy + hy);\r\n shape.closePath();\r\n }\r\n\r\n function snapToNormalGrid(v: Vector3) {\r\n const x = parseFloat((Math.round(v.x / NORMAL_GRID_SCALE) * NORMAL_GRID_SCALE).toFixed(1));\r\n const z = parseFloat((Math.round(v.z / NORMAL_GRID_SCALE) * NORMAL_GRID_SCALE).toFixed(1));\r\n return new Vector3(x, v.y, z);\r\n }\r\n\r\n function snapToFineGrid(v: Vector3) {\r\n const x = parseFloat((Math.round(v.x / FINE_GRID_SCALE) * FINE_GRID_SCALE).toFixed(1));\r\n const z = parseFloat((Math.round(v.z / FINE_GRID_SCALE) * FINE_GRID_SCALE).toFixed(1));\r\n return new Vector3(x, v.y, z);\r\n }\r\n\r\n function getPositionOnGrid(p: Vector3) {\r\n if (useStore.getState().enableFineGrid) {\r\n p = snapToFineGrid(p);\r\n } else {\r\n p = snapToNormalGrid(p);\r\n }\r\n return p;\r\n }\r\n\r\n function collisionHelper(args: number[], tolerance = 0) {\r\n let [tMinX, tMaxX, tMinZ, tMaxZ, cMinX, cMaxX, cMinZ, cMaxZ] = args;\r\n cMinX += tolerance;\r\n cMaxX -= tolerance;\r\n cMinZ += tolerance;\r\n cMaxZ -= tolerance;\r\n return (\r\n ((cMinX >= tMinX && cMinX <= tMaxX) ||\r\n (cMaxX >= tMinX && cMaxX <= tMaxX) ||\r\n (tMinX >= cMinX && tMinX <= cMaxX) ||\r\n (tMaxX >= cMinX && tMaxX <= cMaxX)) &&\r\n ((cMinZ >= tMinZ && cMinZ <= tMaxZ) ||\r\n (cMaxZ >= tMinZ && cMaxZ <= tMaxZ) ||\r\n (tMinZ >= cMinZ && tMinZ <= cMaxZ) ||\r\n (tMaxZ >= cMinZ && tMaxZ <= cMaxZ))\r\n );\r\n }\r\n\r\n function checkPerpendicular(leftWall: WallModel, rightWall: WallModel) {\r\n // from right point to left point\r\n const vLeft = new Vector3().subVectors(\r\n new Vector3().fromArray(leftWall.leftPoint).setZ(0),\r\n new Vector3().fromArray(leftWall.rightPoint).setZ(0),\r\n );\r\n const vRight = new Vector3().subVectors(\r\n new Vector3().fromArray(rightWall.rightPoint).setZ(0),\r\n new Vector3().fromArray(rightWall.leftPoint).setZ(0),\r\n );\r\n const angle = vRight.angleTo(vLeft);\r\n return Math.abs(angle - Math.PI / 2) < PERPENDICULAR_THRESHOLD;\r\n }\r\n\r\n function setElementPosDms(id: string, pos: number[], dms: number[], archHeight?: number, polygonTop?: number[]) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n [e.cx, e.cy, e.cz] = pos;\r\n [e.lx, e.ly, e.lz] = dms;\r\n if (archHeight !== undefined) {\r\n if (e.type === ObjectType.Window) {\r\n (e as WindowModel).archHeight = archHeight;\r\n } else if (e.type === ObjectType.Door) {\r\n (e as DoorModel).archHeight = archHeight;\r\n }\r\n }\r\n if (polygonTop !== undefined && e.type === ObjectType.Window) {\r\n const w = e as WindowModel;\r\n if (w.windowType === WindowType.Polygonal) {\r\n w.polygonTop = [...polygonTop];\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function hasPolygonTop(elem: ElementModel) {\r\n return (\r\n elem.type === ObjectType.Window &&\r\n (elem as WindowModel).windowType === WindowType.Polygonal &&\r\n (elem as WindowModel).polygonTop\r\n );\r\n }\r\n\r\n function handleUndoableAdd(elem: ElementModel) {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: elem,\r\n undo: () => {\r\n useStore.getState().removeElementById(elem.id, false);\r\n },\r\n redo: () => {\r\n useStore.getState().set((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n state.deletedRoofId = null;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n }\r\n\r\n function handleUndoableResize() {\r\n const oldElement = useStore.getState().selectedElement;\r\n if (!oldElement) return;\r\n const newElement = useStore.getState().getElementById(oldElement.id);\r\n if (!newElement) return;\r\n\r\n switch (newElement.type) {\r\n case ObjectType.Door:\r\n case ObjectType.Window:\r\n case ObjectType.SolarPanel:\r\n const undoableResize = {\r\n name: `Resize ${newElement.type}`,\r\n timestamp: Date.now(),\r\n resizedElementId: newElement.id,\r\n resizedElementType: newElement.type,\r\n oldPosition: [oldElement.cx, oldElement.cy, oldElement.cz],\r\n oldDimension: [oldElement.lx, oldElement.ly, oldElement.lz],\r\n newPosition: [newElement.cx, newElement.cy, newElement.cz],\r\n newDimension: [newElement.lx, newElement.ly, newElement.lz],\r\n oldArchHeight:\r\n oldElement.type === ObjectType.Window || oldElement.type === ObjectType.Door\r\n ? (oldElement as WindowModel).archHeight\r\n : undefined,\r\n newArchHeight:\r\n newElement.type === ObjectType.Window || newElement.type === ObjectType.Door\r\n ? (newElement as WindowModel).archHeight\r\n : undefined,\r\n oldPolygonTop: hasPolygonTop(oldElement) ? [...(oldElement as WindowModel).polygonTop!] : undefined,\r\n newPolygonTop: hasPolygonTop(newElement) ? [...(newElement as WindowModel).polygonTop!] : undefined,\r\n undo() {\r\n setElementPosDms(\r\n this.resizedElementId,\r\n this.oldPosition,\r\n this.oldDimension,\r\n this.oldArchHeight,\r\n this.oldPolygonTop,\r\n );\r\n },\r\n redo() {\r\n setElementPosDms(\r\n this.resizedElementId,\r\n this.newPosition,\r\n this.newDimension,\r\n this.newArchHeight,\r\n this.newPolygonTop,\r\n );\r\n },\r\n } as UndoableResizeElementOnWall;\r\n addUndoable(undoableResize);\r\n break;\r\n case ObjectType.Polygon:\r\n const oldPg = oldElement as PolygonModel;\r\n const newPg = newElement as PolygonModel;\r\n const undoableEditPolygon = {\r\n name: 'Edit Polygon',\r\n timestamp: Date.now(),\r\n oldValue: [...oldPg.vertices],\r\n newValue: [...newPg.vertices],\r\n changedElementId: newPg.id,\r\n changedElementType: newPg.type,\r\n undo() {\r\n updatePolygonVerticesById(this.changedElementId, this.oldValue as Point2[]);\r\n },\r\n redo() {\r\n updatePolygonVerticesById(this.changedElementId, this.newValue as Point2[]);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableEditPolygon);\r\n break;\r\n }\r\n }\r\n\r\n function resetBeingAddedChildId() {\r\n useStore.getState().set((state) => {\r\n state.addedWindowId = null;\r\n state.addedDoorId = null;\r\n });\r\n }\r\n\r\n function isElementAllowedMovingAdd(objectType: ObjectType) {\r\n return objectType === ObjectType.Window || objectType === ObjectType.Door;\r\n }\r\n\r\n function isFirstIntersectedWall(e: ThreeEvent, id: string) {\r\n const intersectedWalls = e.intersections.filter((i) => i.object.name !== WALL_INTERSECTION_PLANE_NAME);\r\n if (\r\n intersectedWalls.length > 0 &&\r\n intersectedWalls[0].object.name === `${SharedUtil.WALL_OUTSIDE_SURFACE_MESH_NAME} ${id}`\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function isFirstIntersectedObject(e: ThreeEvent) {\r\n return e.intersections.length > 0 && e.intersections[0].object === e.eventObject;\r\n }\r\n\r\n function ifChildNeedsChangeParent(wallId: string, child: ElementModel | null, event: ThreeEvent) {\r\n if (useStore.getState().moveHandleType && child && isChildType(child) && child.parentId !== wallId) {\r\n const intersections = event.intersections.filter(\r\n (i) =>\r\n i.eventObject.name.includes(SharedUtil.WALL_OUTSIDE_SURFACE_MESH_NAME) ||\r\n i.eventObject.name.includes(WINDOW_GROUP_NAME) ||\r\n i.eventObject.name === WALL_BLOCK_PLANE,\r\n );\r\n const hasBlockedPlane =\r\n intersections.length > 0 &&\r\n (intersections[0].eventObject.name === WALL_BLOCK_PLANE ||\r\n intersections[0].eventObject.name.includes(WINDOW_GROUP_NAME));\r\n\r\n if (!hasBlockedPlane) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function isChildType(el: ElementModel | null) {\r\n if (!el) return false;\r\n switch (el.type) {\r\n case ObjectType.Window:\r\n case ObjectType.Door:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Light:\r\n case ObjectType.Sensor:\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function isArchedResize(el: ElementModel) {\r\n if (useStore.getState().resizeHandleType !== ResizeHandleType.Arch) return false;\r\n if (el.type === ObjectType.Window) {\r\n const window = el as WindowModel;\r\n return window.windowType === WindowType.Arched && window.archHeight !== undefined;\r\n }\r\n if (el.type === ObjectType.Door) {\r\n const door = el as DoorModel;\r\n return door.doorType === DoorType.Arched && door.archHeight !== undefined;\r\n }\r\n }\r\n\r\n function isPointerOutsideShape(boundedShape: Shape, pointer2D: Vector2) {\r\n const points = boundedShape.getPoints().map((point) => ({ x: point.x, y: point.y }));\r\n return !Util.isPointInside(pointer2D.x, pointer2D.y, points);\r\n }\r\n\r\n function offsetWallEdgePoints(\r\n start: Vector3,\r\n end: Vector3,\r\n elHx: number,\r\n elHy: number,\r\n padding: number,\r\n isWallPoints = false,\r\n ) {\r\n const edgeVector = new Vector3().subVectors(end, start).normalize();\r\n const [s, e] = isWallPoints ? [end.y, start.y] : [start.y, end.y];\r\n let d;\r\n if (s < e) {\r\n const a = edgeVector.angleTo(new Vector3(-elHx, -elHy));\r\n d = Math.sin(a) * Math.hypot(elHx, elHy);\r\n } else {\r\n const a = edgeVector.angleTo(new Vector3(elHx, -elHy));\r\n d = Math.sin(Math.PI - a) * Math.hypot(elHx, elHy);\r\n }\r\n const offsetVector = edgeVector\r\n .clone()\r\n .applyEuler(new Euler(0, 0, HALF_PI))\r\n .multiplyScalar(d + padding);\r\n start.add(offsetVector);\r\n end.add(offsetVector);\r\n }\r\n\r\n function getClosestPointOnPolygon(polygon: Shape, point: Vector2) {\r\n const edges = polygon.getPoints();\r\n let closestPoint = point;\r\n let closestDistance = Infinity;\r\n for (let i = 0; i < edges.length; i++) {\r\n const edgeStart = edges[i];\r\n const edgeEnd = edges[(i + 1) % edges.length];\r\n const edgeDirection = edgeEnd.clone().sub(edgeStart);\r\n const edgeLengthSq = edgeDirection.lengthSq();\r\n const toStart = point.clone().sub(edgeStart);\r\n const projectionFactor = Math.max(0, Math.min(1, toStart.dot(edgeDirection) / edgeLengthSq));\r\n const closestEdgePoint = edgeStart.clone().add(edgeDirection.clone().multiplyScalar(projectionFactor));\r\n const distanceSq = closestEdgePoint.distanceToSquared(point);\r\n if (distanceSq < closestDistance) {\r\n closestPoint = closestEdgePoint;\r\n closestDistance = distanceSq;\r\n }\r\n }\r\n return closestPoint;\r\n }\r\n\r\n function getDiagonalResizedData(e: ThreeEvent, pointer: Vector3, anchor: Vector3) {\r\n const diagonal = new Vector3().subVectors(anchor, pointer);\r\n const center = new Vector3().addVectors(anchor, pointer).divideScalar(2);\r\n return {\r\n dimensionXZ: { x: Math.abs(diagonal.x), z: Math.abs(diagonal.z) },\r\n positionXZ: { x: center.x, z: center.z },\r\n };\r\n }\r\n\r\n function isValidToAddRoof(rect: boolean, sameHeight: boolean) {\r\n const wallMapOnFoundation = useStore.getState().elements.reduce((map, el) => {\r\n if (el.type === ObjectType.Wall && el.parentId === parentId) {\r\n map.set(el.id, el as WallModel);\r\n }\r\n return map;\r\n }, new Map());\r\n\r\n let isLoop = false,\r\n isSameHeight = true,\r\n isPerpendicular = true,\r\n count = 0;\r\n\r\n const lang = { lng: useStore.getState().language };\r\n const startWall = wallModel;\r\n let w = startWall;\r\n while (w && w.rightJoints.length > 0) {\r\n count++;\r\n const rightWall = wallMapOnFoundation.get(w.rightJoints[0]);\r\n if (!rightWall) break;\r\n if (sameHeight && rightWall.lz !== startWall.lz) {\r\n isSameHeight = false;\r\n showError(i18n.t('message.WallsAreNotAtSameHeight', lang));\r\n return false;\r\n }\r\n if (rect && !checkPerpendicular(w, rightWall)) {\r\n isPerpendicular = false;\r\n showError(i18n.t('message.WallsAreNotPerpendicular', lang));\r\n return false;\r\n }\r\n if (rightWall.id === startWall.id) {\r\n isLoop = true;\r\n break;\r\n }\r\n w = rightWall;\r\n // avoid infinite loop\r\n if (count > 100) break;\r\n }\r\n\r\n if (!isLoop) {\r\n showError(i18n.t('message.WallsAreNotConnected', lang));\r\n return false;\r\n }\r\n if (rect && count !== 4) {\r\n showError(i18n.t('message.WallsNumberNeedToBeFour', lang));\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function isSettingElementStartPoint() {\r\n return (\r\n elBeingAddedRef.current &&\r\n elBeingAddedRef.current.status === ElBeingAddedStatus.SettingStartPoint &&\r\n useStore.getState().moveHandleType === MoveHandleType.Mid\r\n );\r\n }\r\n\r\n function isAllowedToSelectMe() {\r\n if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType || isAddingElement()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function isRectWall() {\r\n if (isTopPartial || leftUnfilledHeight !== rightUnfilledHeight || leftTopPartialHeight !== rightTopPartialHeight)\r\n return false;\r\n if (!roofId) return true;\r\n if (leftRoofHeight !== rightRoofHeight) return false;\r\n if (centerRoofHeight !== undefined || centerLeftRoofHeight !== undefined || centerRightRoofHeight !== undefined)\r\n return false;\r\n return true;\r\n }\r\n\r\n /** Relative to wall and snapped to grid */\r\n function getPointer(e: ThreeEvent, object3D?: Object3D | null, diagonalVector?: Vector3) {\r\n setRayCast(e);\r\n const intersections = object3D ? ray.intersectObjects([object3D]) : e.intersections;\r\n const pointer = intersections[0]?.point ?? e.point;\r\n const relativePositionOnWall = getRelativePosOnWall(pointer, wallModel);\r\n const positionOnGrid = diagonalVector\r\n ? getPositionOnGrid(relativePositionOnWall.clone().add(diagonalVector)).sub(diagonalVector)\r\n : getPositionOnGrid(relativePositionOnWall);\r\n return {\r\n relativePointer: relativePositionOnWall,\r\n pointerOnGrid: positionOnGrid,\r\n };\r\n }\r\n\r\n function makeNewMovingElement(e: ThreeEvent, objectTypeToAdd: ObjectType) {\r\n if (!outsideWallRef.current) return null;\r\n const { pointerOnGrid } = getPointer(e, outsideWallRef.current);\r\n const cx = pointerOnGrid.x / wallModel.lx;\r\n const cz = pointerOnGrid.z / wallModel.lz;\r\n if (objectTypeToAdd === ObjectType.Window) {\r\n return ElementModelFactory.makeWindow(wallModel, cx, 0, cz, ObjectType.Wall);\r\n }\r\n if (objectTypeToAdd === ObjectType.Door) {\r\n return ElementModelFactory.makeDoor(wallModel);\r\n }\r\n return null;\r\n }\r\n\r\n function setElementHasBeenAdded(newElement: ElementModel | null) {\r\n if (newElement) {\r\n elBeingAddedRef.current = {\r\n id: newElement.id,\r\n type: newElement.type,\r\n status: ElBeingAddedStatus.SettingStartPoint,\r\n };\r\n }\r\n setCommonStore((state) => {\r\n if (newElement) {\r\n state.elements.push(newElement);\r\n state.selectedElement = newElement;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (newElement.type === ObjectType.Window) {\r\n state.addedWindowId = newElement.id;\r\n } else if (newElement.type === ObjectType.Door) {\r\n state.addedDoorId = newElement.id;\r\n }\r\n }\r\n state.moveHandleType = MoveHandleType.Mid;\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n\r\n function resetToAddingNewObjectStatus(elBeingAdded: ElBeingAdded | null) {\r\n if (!elBeingAdded) return;\r\n const { id, type } = elBeingAdded;\r\n setCommonStore((state) => {\r\n state.elements = state.elements.filter((e) => e.id !== id);\r\n state.selectedElement = null;\r\n state.moveHandleType = null;\r\n state.objectTypeToAdd = type;\r\n state.addedWindowId = null;\r\n state.addedDoorId = null;\r\n });\r\n elBeingAddedRef.current = null;\r\n }\r\n\r\n function getElementHalfSize(element?: ElementModel) {\r\n if (!element) return [0, 0];\r\n\r\n switch (element.type) {\r\n case ObjectType.Window: {\r\n const oldParentId = usePrimitiveStore.getState().oldParentId;\r\n if (element.parentId !== oldParentId) {\r\n const oldParent = useStore.getState().elements.find((e) => e.id === oldParentId);\r\n if (!oldParent) return [0, 0];\r\n return [(element.lx * oldParent.lx) / 2, (element.lz * oldParent.lz) / 2];\r\n } else {\r\n return [(element.lx * lx) / 2, (element.lz * lz) / 2];\r\n }\r\n }\r\n case ObjectType.Door: {\r\n return [(element.lx * lx) / 2, (element.lz * lz) / 2];\r\n }\r\n case ObjectType.SolarPanel: {\r\n return [element.lx / 2, element.ly / 2];\r\n }\r\n }\r\n return [WALL_PADDING, WALL_PADDING];\r\n }\r\n\r\n /** only use x y as 2D, from right to left */\r\n function getRoofPoints() {\r\n const roofPoints: Vector3[] = [];\r\n\r\n // exception: shed roof\r\n if (centerRoofHeight) {\r\n const x = centerRoofHeight[0];\r\n if (x === 0.5 && leftRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(hx, centerRoofHeight[1] - hz), new Vector3(-hx, leftRoofHeight - hz));\r\n return roofPoints;\r\n }\r\n if (x === -0.5 && rightRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(hx, rightRoofHeight - hz), new Vector3(-hx, centerRoofHeight[1] - hz));\r\n return roofPoints;\r\n }\r\n }\r\n\r\n if (rightRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(hx, rightRoofHeight - hz));\r\n } else {\r\n roofPoints.push(new Vector3(hx, hz));\r\n }\r\n if (centerRightRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(centerRightRoofHeight[0] * lx, centerRightRoofHeight[1] - hz));\r\n }\r\n if (centerRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(centerRoofHeight[0] * lx, centerRoofHeight[1] - hz));\r\n }\r\n if (centerLeftRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(centerLeftRoofHeight[0] * lx, centerLeftRoofHeight[1] - hz));\r\n }\r\n if (leftRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(-hx, leftRoofHeight - hz));\r\n } else {\r\n roofPoints.push(new Vector3(-hx, hz));\r\n }\r\n return roofPoints;\r\n }\r\n\r\n function getBoundedPointer(pointer: Vector3, options?: BoundedPointerOptions) {\r\n const ignorePadding = options?.ignorePadding;\r\n const elementHalfSize = options?.elementHalfSize ? [...options.elementHalfSize] : [0, 0];\r\n\r\n const padding = ignorePadding ? 0 : WALL_PADDING;\r\n const leftPadding = ignorePadding ? 0 : WALL_PADDING + leftOffset;\r\n const rightPadding = ignorePadding ? 0 : WALL_PADDING + rightOffset;\r\n const [elHx, elHz] = elementHalfSize;\r\n\r\n const [boundingMinX, boundingMaxX, boundingMinZ, boundingMaxZ] = [\r\n -hx + elHx + leftPadding,\r\n hx - elHx - rightPadding,\r\n -hz + elHz + padding,\r\n hz - elHz - padding,\r\n ];\r\n\r\n const boundedPointer = pointer.clone();\r\n if (isRectWall()) {\r\n const botHeight = isPartial ? leftUnfilledHeight : 0;\r\n const topHeight = lz - (isPartial ? realWallLeftHeight : lz);\r\n boundedPointer.setX(Util.clamp(pointer.x, boundingMinX, boundingMaxX));\r\n boundedPointer.setZ(Util.clamp(pointer.z, boundingMinZ + botHeight, boundingMaxZ - topHeight));\r\n return boundedPointer;\r\n } else {\r\n const boundedShape = getBoundedShape(elHx, elHz, boundingMinX, boundingMaxX, padding);\r\n const pointer2D = new Vector2(pointer.x, pointer.z);\r\n\r\n let maxY = Infinity;\r\n let minY = -Infinity;\r\n if (options?.resizeAnchor) {\r\n const anchorX = options.resizeAnchor.x;\r\n const points: Vector3[] = [];\r\n\r\n if (isTopPartial) {\r\n points.push(new Vector3(-hx, -hz + realWallLeftHeight), new Vector3(hx, -hz + realWallRightHeight));\r\n } else {\r\n const roofPoints = getRoofPoints().reverse(); // from left to right.\r\n points.push(...roofPoints);\r\n }\r\n for (let i = 1; i < points.length; i++) {\r\n const start = points[i - 1];\r\n const end = points[i];\r\n if (anchorX >= start.x && anchorX <= end.x) {\r\n const k = (end.y - start.y) / (end.x - start.x);\r\n const b = -k * start.x + start.y;\r\n maxY = k * anchorX + b;\r\n break;\r\n }\r\n }\r\n const botLeftPoint = new Vector3(-hx, -hz + realLeftUnfilledHeight);\r\n const botRightPoint = new Vector3(hx, -hz + realRightUnfilledHeight);\r\n const k = (botRightPoint.y - botLeftPoint.y) / (botRightPoint.x - botLeftPoint.x);\r\n const b = -k * botLeftPoint.x + botLeftPoint.y;\r\n minY = k * anchorX + b;\r\n }\r\n const isElementOutside = pointer2D.y > maxY;\r\n const isPointerOutside = isPointerOutsideShape(boundedShape, pointer2D);\r\n\r\n if (isPointerOutside) {\r\n const p = getClosestPointOnPolygon(boundedShape, pointer2D);\r\n boundedPointer.setX(p.x);\r\n boundedPointer.setZ(Util.clamp(p.y, minY + padding, maxY - padding));\r\n } else if (isElementOutside) {\r\n boundedPointer.setZ(maxY - padding);\r\n }\r\n }\r\n\r\n boundedPointer.setZ(Math.max(boundingMinZ, boundedPointer.z));\r\n return boundedPointer;\r\n }\r\n\r\n function moveElement(id: string, pointer: Vector3) {\r\n setCommonStore((state) => {\r\n const el = state.elements.find((e) => e.id === id);\r\n if (!el) return;\r\n\r\n switch (el.type) {\r\n case ObjectType.Window: {\r\n el.cx = pointer.x / lx;\r\n el.cz = pointer.z / lz;\r\n el.cy = el.id === invalidElementIdRef.current ? -0.01 : 0.3;\r\n (el as WindowModel).tint =\r\n el.id === invalidElementIdRef.current ? 'red' : (state.selectedElement as WindowModel).tint; // usePrimitiveStore.getState().oldWindowTint ?? '#73D8FF';\r\n break;\r\n }\r\n case ObjectType.Door: {\r\n const hz = lz / 2;\r\n el.cx = pointer.x / lx;\r\n el.cz = (pointer.z - hz) / 2 / lz;\r\n el.lz = (pointer.z + hz) / lz;\r\n break;\r\n }\r\n case ObjectType.SolarPanel: {\r\n el.cx = pointer.x / lx;\r\n el.cz = pointer.z / lz;\r\n el.color = el.id === invalidElementIdRef.current ? 'red' : '#fff';\r\n break;\r\n }\r\n case ObjectType.Sensor:\r\n case ObjectType.Light: {\r\n el.cx = pointer.x / lx;\r\n el.cz = pointer.z / lz;\r\n break;\r\n }\r\n case ObjectType.Polygon: {\r\n const pg = el as PolygonModel;\r\n if (pg.vertices.length > 0) {\r\n const centroid = Util.calculatePolygonCentroid(pg.vertices);\r\n const dx = -pointer.x / lx - centroid.x;\r\n const dy = -pointer.z / lz - centroid.y;\r\n const newVertices = pg.vertices.map((v) => ({ x: v.x + dx, y: v.y + dy }));\r\n (el as PolygonModel).vertices = newVertices;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getBoundedShape(elHx: number, elHz: number, boundingMinX: number, boundingMaxX: number, padding: number) {\r\n const edgesPoints: { start: Vector3; end: Vector3 }[] = [];\r\n\r\n const botLeftPoint = new Vector3(-hx, -hz + realLeftUnfilledHeight);\r\n const botRightPoint = new Vector3(hx, -hz + realRightUnfilledHeight);\r\n offsetWallEdgePoints(botLeftPoint, botRightPoint, elHx, elHz, padding, true);\r\n\r\n // starting from wall left edge, counter-clockwise\r\n edgesPoints.push({ start: new Vector3(boundingMinX, hz), end: new Vector3(boundingMinX, botLeftPoint.y) });\r\n\r\n // bottom edge\r\n edgesPoints.push({ start: botLeftPoint.clone(), end: botRightPoint.clone() });\r\n\r\n // right\r\n edgesPoints.push({ start: new Vector3(boundingMaxX, botRightPoint.y), end: new Vector3(boundingMaxX, hz) });\r\n\r\n if (isTopPartial) {\r\n // top edge\r\n const topRightPoint = new Vector3(hx, -hz + realWallRightHeight);\r\n const topLeftPoint = new Vector3(-hx, -hz + realWallLeftHeight);\r\n offsetWallEdgePoints(topRightPoint, topLeftPoint, elHx, elHz, padding);\r\n edgesPoints.push({ start: topRightPoint.clone(), end: topLeftPoint.clone() });\r\n } else {\r\n const roofPoints = getRoofPoints();\r\n for (let i = 1; i < roofPoints.length; i++) {\r\n const start = roofPoints[i - 1].clone();\r\n const end = roofPoints[i].clone();\r\n offsetWallEdgePoints(start, end, elHx, elHz, padding);\r\n edgesPoints.push({ start, end });\r\n }\r\n }\r\n\r\n const shape = new Shape();\r\n edgesPoints.push(edgesPoints[0]);\r\n for (let i = 1; i < edgesPoints.length; i++) {\r\n const edge1 = edgesPoints[i - 1];\r\n const edge2 = edgesPoints[i];\r\n const point = RoofUtil.getIntersectionPoint(edge1.start, edge1.end, edge2.start, edge2.end);\r\n if (i === 1) {\r\n shape.moveTo(point.x, point.y);\r\n } else {\r\n shape.lineTo(point.x, point.y);\r\n }\r\n }\r\n shape.closePath();\r\n return shape;\r\n }\r\n\r\n function getArchedResizedData(archedElement: WindowModel | DoorModel, pointer: Vector3, anchor: Vector3) {\r\n const [wlx, wlz] = [archedElement.lx * lx, archedElement.lz * lz];\r\n const archHeightBottom = wlz / 2 - Math.min(archedElement.archHeight, wlx / 2, wlz);\r\n const newArchHeight = Math.max(0, Math.min(pointer.z - anchor.z - archHeightBottom, wlx / 2));\r\n const newLz = archHeightBottom + newArchHeight + wlz / 2;\r\n const center = new Vector3(archedElement.cx * lx, archedElement.cy, archedElement.cz * lz + (newLz - wlz) / 2);\r\n return { newLz: newLz, newCz: center.z, newArchHeight: newArchHeight };\r\n }\r\n\r\n function handleWallBodyPointMove(e: ThreeEvent) {\r\n if (isFirstIntersectedWall(e, id)) {\r\n const objectTypeToAdd = useStore.getState().objectTypeToAdd;\r\n // add new element\r\n if (isElementAllowedMovingAdd(objectTypeToAdd)) {\r\n const newElement = makeNewMovingElement(e, objectTypeToAdd);\r\n setElementHasBeenAdded(newElement);\r\n }\r\n // move element being added\r\n if (isSettingElementStartPoint()) {\r\n const { pointerOnGrid } = getPointer(e, outsideWallRef.current);\r\n const boundedPointer = getBoundedPointer(pointerOnGrid);\r\n moveElement(elBeingAddedRef.current!.id, boundedPointer);\r\n }\r\n // move child across different parent\r\n const selectedElement = useStore.getState().selectedElement;\r\n if (ifChildNeedsChangeParent(id, selectedElement, e)) {\r\n setCommonStore((state) => {\r\n const el = state.elements.find((e) => e.id === selectedElement?.id);\r\n if (!el || (el.type === ObjectType.SolarPanel && (el as SolarPanelModel).parentType === undefined)) return;\r\n\r\n // keep old abs dimension\r\n if (el.type === ObjectType.Window) {\r\n const oldParent = state.elements.find((e) => e.id === el.parentId);\r\n if (oldParent) {\r\n const absLx = el.lx * oldParent.lx;\r\n const absLz = el.lz * oldParent.lz;\r\n el.lx = absLx / lx;\r\n el.lz = absLz / lz;\r\n }\r\n }\r\n\r\n const { pointerOnGrid } = getPointer(e, outsideWallRef.current);\r\n const elementHalfSize = getElementHalfSize(el);\r\n const boundedPointer = getBoundedPointer(pointerOnGrid, {\r\n elementHalfSize,\r\n ignorePadding: el.type === ObjectType.SolarPanel,\r\n });\r\n checkCollision(el.id, boundedPointer, elementHalfSize[0] * 2, elementHalfSize[1] * 2);\r\n\r\n el.cx = boundedPointer.x / lx;\r\n el.cz = boundedPointer.z / lz;\r\n el.parentId = id;\r\n el.foundationId = parentId;\r\n if (state.selectedElement) {\r\n state.selectedElement.parentId = id;\r\n state.selectedElement.foundationId = parentId;\r\n }\r\n\r\n if (el.type === ObjectType.Window) {\r\n el.cy = el.id === invalidElementIdRef.current ? -0.01 : 0;\r\n (el as WindowModel).tint =\r\n el.id === invalidElementIdRef.current ? 'red' : (state.selectedElement as WindowModel).tint;\r\n } else if (el.type === ObjectType.SolarPanel) {\r\n el.color = el.id === invalidElementIdRef.current ? 'red' : '#fff';\r\n (el as SolarPanelModel).parentType = ObjectType.Wall;\r\n }\r\n });\r\n setPrimitiveStore('showWallIntersectionPlaneId', id);\r\n }\r\n } else if (isSettingElementStartPoint()) {\r\n resetToAddingNewObjectStatus(elBeingAddedRef.current);\r\n }\r\n }\r\n\r\n function handleWallBodyPointerDown(e: ThreeEvent) {\r\n if (e.button === 2) return;\r\n if (isSettingElementStartPoint()) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setShowIntersectionPlane(true);\r\n const { pointerOnGrid } = getPointer(e, outsideWallRef.current);\r\n const boundedPointer = getBoundedPointer(pointerOnGrid);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n if (elBeingAddedRef.current?.type === ObjectType.Window) {\r\n state.resizeHandleType = ResizeHandleType.LowerRight;\r\n state.resizeAnchor.copy(boundedPointer); // relative to wall\r\n } else if (elBeingAddedRef.current?.type === ObjectType.Door) {\r\n state.resizeHandleType = ResizeHandleType.UpperRight;\r\n state.resizeAnchor.copy(boundedPointer).setZ(-lz / 2); // relative to wall\r\n }\r\n });\r\n elBeingAddedRef.current!.status = ElBeingAddedStatus.SettingEndPoint;\r\n } else if (isFirstIntersectedObject(e)) {\r\n const isAddingNewChildByClick = useStore.getState().objectTypeToAdd !== ObjectType.None;\r\n if (isAddingNewChildByClick) {\r\n const pointer = e.point; // should use getBoundedPointer\r\n addElementByClick(pointer, true);\r\n } else if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n e.selected = e.id === parentId;\r\n }\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (state.selectedElementIdSet.has(parentId)) {\r\n state.selectedElementIdSet.delete(parentId);\r\n } else {\r\n state.selectedElementIdSet.add(parentId);\r\n }\r\n });\r\n e.stopPropagation();\r\n } else if (isAllowedToSelectMe()) {\r\n useStore.getState().selectMe(id, e, ActionType.Select);\r\n }\r\n }\r\n }\r\n\r\n function handleWallBodyPointerUp() {\r\n if (elBeingAddedRef.current && elBeingAddedRef.current.status === ElBeingAddedStatus.SettingStartPoint) {\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n state.addedDoorId = null;\r\n state.addedWindowId = null;\r\n state.moveHandleType = null;\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n }\r\n });\r\n elBeingAddedRef.current = null;\r\n }\r\n }\r\n\r\n function handleWallBodyPointerOut() {\r\n if (isSettingElementStartPoint()) {\r\n resetToAddingNewObjectStatus(elBeingAddedRef.current);\r\n }\r\n invalidElementIdRef.current = null;\r\n }\r\n\r\n // pointer move\r\n function handleIntersectionPlanePointerMove(e: ThreeEvent) {\r\n const selectedElement = useStore.getState().selectedElement ?? getSelectedElement();\r\n if (selectedElement?.parentId === wallModel.id) {\r\n // move element\r\n if (useStore.getState().moveHandleType) {\r\n const diagonalVector =\r\n selectedElement.type !== ObjectType.Polygon\r\n ? new Vector3((-selectedElement.lx / 2) * lx, 0, (selectedElement.lz / 2) * lz)\r\n : undefined;\r\n const { relativePointer, pointerOnGrid } = getPointer(e, intersectionPlaneRef.current, diagonalVector);\r\n const elementHalfSize = getElementHalfSize(selectedElement);\r\n const boundedPointer = getBoundedPointer(pointerOnGrid, {\r\n elementHalfSize,\r\n ignorePadding: selectedElement.type === ObjectType.SolarPanel,\r\n });\r\n const [eLx, eLz] = [elementHalfSize[0] * 2, elementHalfSize[1] * 2];\r\n if (selectedElement.type !== ObjectType.SolarPanel) {\r\n checkInsideBoundary(selectedElement.id, boundedPointer, eLx, eLz);\r\n }\r\n if (selectedElement.type !== ObjectType.Polygon) {\r\n let isInside = true;\r\n let polygonTop: number[] | undefined = undefined;\r\n if (\r\n selectedElement.type === ObjectType.Window &&\r\n (selectedElement as WindowModel).windowType === WindowType.Polygonal\r\n ) {\r\n polygonTop = (selectedElement as WindowModel).polygonTop ?? DEFAULT_POLYGONTOP;\r\n isInside = checkPolygonTopInsideBoundary(boundedPointer, eLx, eLz, polygonTop);\r\n }\r\n const isvalid = checkCollision(selectedElement.id, boundedPointer, eLx, eLz, polygonTop);\r\n if (isInside && isvalid) {\r\n invalidElementIdRef.current = null;\r\n } else {\r\n invalidElementIdRef.current = selectedElement.id;\r\n }\r\n }\r\n moveElement(selectedElement.id, boundedPointer);\r\n }\r\n // resize element\r\n else if (useStore.getState().resizeHandleType) {\r\n const { relativePointer, pointerOnGrid } = getPointer(e, intersectionPlaneRef.current);\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n switch (selectedElement.type) {\r\n case ObjectType.Window: {\r\n const window = selectedElement as WindowModel;\r\n const boundedPointer = getBoundedPointer(pointerOnGrid, { resizeAnchor });\r\n if (isArchedResize(window)) {\r\n const { newLz, newCz, newArchHeight } = getArchedResizedData(window, boundedPointer, resizeAnchor);\r\n const center = new Vector3(window.cx * lx, 0, newCz);\r\n checkCollision(window.id, center, window.lx * lx, newLz);\r\n checkInsideBoundary(window.id, center, window.lx * lx, newLz);\r\n setCommonStore((state) => {\r\n const w = state.elements.find((e) => e.id === window.id) as WindowModel;\r\n if (!w) return;\r\n w.lz = newLz / lz;\r\n w.cz = newCz / lz;\r\n w.archHeight = newArchHeight;\r\n w.cy = w.id === invalidElementIdRef.current ? -0.01 : 0.3;\r\n w.tint = w.id === invalidElementIdRef.current ? 'red' : window.tint;\r\n });\r\n } else if (resizeHandleType === ResizeHandleType.Upper) {\r\n // polygonal top vertex\r\n // todo: add boundary check\r\n const center = new Vector3(window.cx * lx, 0, window.cz * lz);\r\n const [wlx, wlz] = [window.lx * lx, window.lz * lz];\r\n const tx = Util.clamp((pointerOnGrid.x - resizeAnchor.x) / wlx, -0.5, 0.5);\r\n const th = Math.max(0, pointerOnGrid.z - resizeAnchor.z);\r\n const newPolygonTop = [tx, th];\r\n if (\r\n !checkCollision(window.id, center, wlx, wlz, newPolygonTop) ||\r\n !checkPolygonTopInsideBoundary(center, wlx, wlz, newPolygonTop)\r\n ) {\r\n invalidElementIdRef.current = window.id;\r\n }\r\n setCommonStore((state) => {\r\n const w = state.elements.find((e) => e.id === window.id) as WindowModel;\r\n if (!w) return;\r\n w.polygonTop = [...newPolygonTop];\r\n w.cy = w.id === invalidElementIdRef.current ? -0.01 : 0.3;\r\n w.tint = w.id === invalidElementIdRef.current ? 'red' : window.tint;\r\n });\r\n } else {\r\n const { dimensionXZ, positionXZ } = getDiagonalResizedData(e, boundedPointer, resizeAnchor);\r\n const center = new Vector3(positionXZ.x, 0, positionXZ.z);\r\n let isPolygonTopInside = true;\r\n let polygonTop: number[] | undefined = undefined;\r\n if (window.windowType === WindowType.Polygonal) {\r\n polygonTop = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n isPolygonTopInside = checkPolygonTopInsideBoundary(center, dimensionXZ.x, dimensionXZ.z, polygonTop);\r\n }\r\n if (\r\n !checkCollision(window.id, center, dimensionXZ.x, dimensionXZ.z, polygonTop) ||\r\n !isPolygonTopInside ||\r\n !checkInsideBoundary(window.id, center, dimensionXZ.x, dimensionXZ.z)\r\n ) {\r\n invalidElementIdRef.current = window.id;\r\n }\r\n\r\n setCommonStore((state) => {\r\n const w = state.elements.find((e) => e.id === window.id) as WindowModel;\r\n if (!w) return;\r\n w.lx = dimensionXZ.x / lx;\r\n w.lz = dimensionXZ.z / lz;\r\n w.cx = positionXZ.x / lx;\r\n w.cz = positionXZ.z / lz;\r\n w.cy = w.id === invalidElementIdRef.current ? -0.01 : 0.3;\r\n w.tint = w.id === invalidElementIdRef.current ? 'red' : window.tint;\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.Door: {\r\n const door = selectedElement as DoorModel;\r\n const boundedPointer = getBoundedPointer(pointerOnGrid, { resizeAnchor });\r\n if (isArchedResize(door)) {\r\n const { newLz, newCz, newArchHeight } = getArchedResizedData(door, boundedPointer, resizeAnchor);\r\n const center = new Vector3(door.cx * lx, 0, newCz);\r\n checkCollision(door.id, center, door.lx * lx, newLz);\r\n checkInsideBoundary(door.id, center, door.lx * lx, newLz, true);\r\n setCommonStore((state) => {\r\n const d = state.elements.find((e) => e.id === door.id) as DoorModel;\r\n if (!d) return;\r\n d.lz = newLz / lz;\r\n d.cz = newCz / lz;\r\n d.archHeight = newArchHeight;\r\n d.color = d.id === invalidElementIdRef.current ? INVALID_ELEMENT_COLOR : selectedElement.color;\r\n });\r\n } else {\r\n const { dimensionXZ, positionXZ } = getDiagonalResizedData(e, boundedPointer, resizeAnchor);\r\n const center = new Vector3(positionXZ.x, 0, positionXZ.z);\r\n checkCollision(door.id, center, dimensionXZ.x, dimensionXZ.z);\r\n checkInsideBoundary(door.id, center, dimensionXZ.x, dimensionXZ.z, true);\r\n setCommonStore((state) => {\r\n const d = state.elements.find((e) => e.id === door.id) as DoorModel;\r\n if (!d) return;\r\n d.cx = positionXZ.x / lx;\r\n d.lx = dimensionXZ.x / lx;\r\n d.cz = (boundedPointer.z - lz / 2) / 2 / lz;\r\n d.lz = (boundedPointer.z + lz / 2) / lz;\r\n d.color = d.id === invalidElementIdRef.current ? INVALID_ELEMENT_COLOR : selectedElement.color;\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel: {\r\n const solarPanel = selectedElement as SolarPanelModel;\r\n const [unitX, unitY] = getSolarPanelUnitLength(solarPanel);\r\n // Z direction\r\n if (resizeHandleType === ResizeHandleType.Lower || resizeHandleType === ResizeHandleType.Upper) {\r\n const ny = Math.max(1, Math.round(Math.abs(relativePointer.z - resizeAnchor.z) / unitY));\r\n const length = ny * unitY;\r\n const v = new Vector3(0, 0, relativePointer.z - resizeAnchor.z).normalize().multiplyScalar(length);\r\n const center = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\r\n if (!Util.isElementInsideWall(center, solarPanel.lx - 0.01, length - 0.01, outerWallPoints2D)) {\r\n return;\r\n }\r\n checkCollision(solarPanel.id, center, solarPanel.lx, Math.abs(v.z));\r\n setCommonStore((state) => {\r\n const sp = state.elements.find((e) => e.id === solarPanel.id);\r\n if (!sp) return;\r\n sp.cz = center.z / lz;\r\n sp.ly = Math.abs(v.z);\r\n sp.color = sp.id === invalidElementIdRef.current ? 'red' : '#fff';\r\n });\r\n }\r\n // X direction\r\n else if (resizeHandleType === ResizeHandleType.Left || resizeHandleType === ResizeHandleType.Right) {\r\n const nx = Math.max(1, Math.round(Math.abs(relativePointer.x - resizeAnchor.x) / unitX));\r\n const length = nx * unitX;\r\n const v = new Vector3(relativePointer.x - resizeAnchor.x, 0, 0).normalize().multiplyScalar(length);\r\n const center = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\r\n if (!Util.isElementInsideWall(center, length - 0.01, solarPanel.ly - 0.01, outerWallPoints2D)) {\r\n return;\r\n }\r\n checkCollision(solarPanel.id, center, Math.abs(v.x), solarPanel.ly);\r\n setCommonStore((state) => {\r\n const sp = state.elements.find((e) => e.id === solarPanel.id);\r\n if (!sp) return;\r\n sp.cx = center.x / lx;\r\n sp.lx = Math.abs(v.x);\r\n sp.color = sp.id === invalidElementIdRef.current ? 'red' : '#fff';\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.Polygon: {\r\n setCommonStore((state) => {\r\n const p = state.elements.find((e) => e.id === selectedElement.id) as PolygonModel;\r\n if (p?.selectedIndex >= 0) {\r\n p.vertices[p.selectedIndex].x = -pointerOnGrid.x / lx;\r\n p.vertices[p.selectedIndex].y = -pointerOnGrid.z / lz;\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function handleIntersectionPlanePointerUp() {\r\n if (invalidElementIdRef.current) {\r\n if (elBeingAddedRef.current && elBeingAddedRef.current.status === ElBeingAddedStatus.SettingEndPoint) {\r\n // remove new element directly\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n }\r\n });\r\n elBeingAddedRef.current = null;\r\n } else if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType) {\r\n SharedUtil.undoInvalidOperation();\r\n }\r\n } else {\r\n if (elBeingAddedRef.current) {\r\n if (elBeingAddedRef.current.status === ElBeingAddedStatus.SettingStartPoint) {\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n }\r\n });\r\n elBeingAddedRef.current = null;\r\n } else if (elBeingAddedRef.current.status === ElBeingAddedStatus.SettingEndPoint) {\r\n const elements = useStore.getState().elements;\r\n const newElement = elements[elements.length - 1];\r\n if (newElement.lx * lx < 0.1 || newElement.lz * lz < 0.1) {\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n }\r\n });\r\n } else {\r\n setCommonStore((state) => {\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n InnerCommonStoreState.selectNone(state);\r\n }\r\n });\r\n handleUndoableAdd(newElement);\r\n }\r\n elBeingAddedRef.current = null;\r\n }\r\n } else if (useStore.getState().moveHandleType) {\r\n SharedUtil.addUndoableMove();\r\n } else if (useStore.getState().resizeHandleType) {\r\n handleUndoableResize();\r\n }\r\n }\r\n\r\n useRefStore.getState().setEnableOrbitController(true);\r\n setShowIntersectionPlane(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\r\n });\r\n setPrimitiveStore('showWallIntersectionPlaneId', null);\r\n invalidElementIdRef.current = null;\r\n resetBeingAddedChildId();\r\n }\r\n\r\n function addElementByClick(pointer?: Vector3, body?: boolean) {\r\n // add new elements\r\n if (latestFoundation && useStore.getState().objectTypeToAdd) {\r\n let newElement: ElementModel | null = null;\r\n switch (useStore.getState().objectTypeToAdd) {\r\n case ObjectType.PyramidRoof: {\r\n if (!roofId && isValidToAddRoof(false, true)) {\r\n newElement = ElementModelFactory.makePyramidRoof([wallModel.id], latestFoundation);\r\n }\r\n break;\r\n }\r\n case ObjectType.GableRoof: {\r\n if (!roofId && isValidToAddRoof(false, false)) {\r\n newElement = ElementModelFactory.makeGableRoof([wallModel.id], latestFoundation);\r\n }\r\n break;\r\n }\r\n case ObjectType.HipRoof: {\r\n if (!roofId && isValidToAddRoof(false, true)) {\r\n newElement = ElementModelFactory.makeHipRoof([wallModel.id], latestFoundation, lx / 2);\r\n }\r\n break;\r\n }\r\n case ObjectType.GambrelRoof: {\r\n if (!roofId && isValidToAddRoof(false, false)) {\r\n newElement = ElementModelFactory.makeGambrelRoof([wallModel.id], latestFoundation);\r\n }\r\n break;\r\n }\r\n case ObjectType.MansardRoof: {\r\n if (!roofId && isValidToAddRoof(false, true)) {\r\n newElement = ElementModelFactory.makeMansardRoof([wallModel.id], latestFoundation);\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel: {\r\n if (pointer && body) {\r\n const p = getRelativePosOnWall(pointer, wallModel);\r\n const angle = wallModel.relativeAngle - HALF_PI;\r\n const actionState = useStore.getState().actionState;\r\n newElement = ElementModelFactory.makeSolarPanel(\r\n wallModel,\r\n useStore.getState().getPvModule(actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\r\n p.x / lx,\r\n 0,\r\n p.z / lz,\r\n actionState.solarPanelOrientation ?? Orientation.landscape,\r\n actionState.solarPanelPoleHeight ?? 1,\r\n actionState.solarPanelPoleSpacing ?? 3,\r\n 0,\r\n 0,\r\n new Vector3(Math.cos(angle), Math.sin(angle), 0),\r\n [0, 0, 0],\r\n actionState.solarPanelFrameColor,\r\n undefined,\r\n undefined,\r\n ObjectType.Wall,\r\n );\r\n }\r\n break;\r\n }\r\n case ObjectType.Sensor: {\r\n if (pointer && body) {\r\n const p = getRelativePosOnWall(pointer, wallModel);\r\n const angle = wallModel.relativeAngle - HALF_PI;\r\n newElement = ElementModelFactory.makeSensor(\r\n wallModel,\r\n (p.x - 0.05) / lx,\r\n 0,\r\n (p.z - 0.05) / lz,\r\n new Vector3(Math.cos(angle), Math.sin(angle), 0),\r\n [0, 0, 0],\r\n );\r\n }\r\n break;\r\n }\r\n case ObjectType.Light: {\r\n if (pointer && body) {\r\n const p = getRelativePosOnWall(pointer, wallModel);\r\n const angle = wallModel.relativeAngle - HALF_PI;\r\n const actionState = useStore.getState().actionState;\r\n newElement = ElementModelFactory.makeLight(\r\n wallModel,\r\n 2,\r\n actionState.lightDistance,\r\n actionState.lightIntensity,\r\n actionState.lightColor,\r\n (p.x - 0.05) / lx,\r\n 0,\r\n (p.z - 0.05) / lz,\r\n new Vector3(Math.cos(angle), Math.sin(angle), 0),\r\n [0, 0, 0],\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n if (newElement) {\r\n handleUndoableAdd(newElement);\r\n setCommonStore((state) => {\r\n state.elements.push(newElement as ElementModel);\r\n if (newElement && newElement.type === ObjectType.Roof) {\r\n state.addedRoofIdSet.add(newElement.id);\r\n }\r\n if (!state.actionModeLock) {\r\n state.objectTypeToAdd = ObjectType.None;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n function handleContextMenu(e: ThreeEvent, mesh: Mesh | null, canPaste?: boolean) {\r\n if (grabRef.current) return;\r\n\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0 && e.intersections[0].object === mesh) {\r\n state.contextMenuObjectType = ObjectType.Wall;\r\n if (canPaste) {\r\n state.pastePoint.copy(e.intersections[0].point);\r\n }\r\n }\r\n });\r\n e.stopPropagation();\r\n }\r\n\r\n function handleWallSideSurfacePointerDown(e: ThreeEvent) {\r\n if (e.button === 2) return;\r\n const objectTypeToAdd = useStore.getState().objectTypeToAdd;\r\n if (\r\n !isSettingElementStartPoint() &&\r\n !isAddingElement() &&\r\n isFirstIntersectedObject(e) &&\r\n objectTypeToAdd === ObjectType.None\r\n ) {\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n e.selected = true;\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n });\r\n e.stopPropagation();\r\n } else if (isAllowedToSelectMe()) {\r\n useStore.getState().selectMe(id, e, ActionType.Select);\r\n }\r\n } else if (RoofUtil.isTypeRoof(objectTypeToAdd)) {\r\n handleWallBodyPointerDown(e);\r\n }\r\n }\r\n\r\n function handleStudPointerDown(e: ThreeEvent) {\r\n if (e.button === 2 || e.intersections.length === 0 || e.intersections[0].object !== e.eventObject) return;\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n e.selected = e.id === parentId;\r\n }\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(parentId);\r\n });\r\n } else {\r\n if (checkIfCanSelectMe(e)) {\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = null;\r\n });\r\n selectMe(id, e, ActionType.Select);\r\n }\r\n addElementByClick();\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n function handleStudContextMenu(e: ThreeEvent) {\r\n if (e.intersections.length > 0 && e.intersections[0].object === e.eventObject) {\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = ObjectType.Wall;\r\n });\r\n selectMe(id, e, ActionType.ContextMenu);\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n function renderStuds() {\r\n let [wallCenterPos, wallCenterHeight] = centerRoofHeight ?? [0, (realWallLeftHeight + realWallRightHeight) / 2];\r\n wallCenterPos = wallCenterPos * lx;\r\n\r\n const leftX = wallCenterPos + hx;\r\n const leftLength = Math.hypot(leftX, wallCenterHeight - realWallLeftHeight);\r\n const leftRotationY = -Math.atan2(wallCenterHeight - realWallLeftHeight, leftX);\r\n\r\n const rightX = hx - wallCenterPos;\r\n const rightLength = Math.hypot(rightX, realWallRightHeight - wallCenterHeight);\r\n const rightRotationY = -Math.atan2(realWallRightHeight - wallCenterHeight, rightX);\r\n\r\n return (\r\n \r\n {structureUnitArray.map(([pos, y], idx) => {\r\n let height;\r\n if (pos < wallCenterPos) {\r\n height =\r\n ((pos + hx) * (wallCenterHeight - realWallLeftHeight)) / (wallCenterPos + hx) + realWallLeftHeight - y;\r\n } else {\r\n height =\r\n ((pos - hx) * (wallCenterHeight - realWallRightHeight)) / (wallCenterPos - hx) + realWallRightHeight - y;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function renderPillars() {\r\n let [wallCenterPos, wallCenterHeight] = centerRoofHeight ?? [0, (realWallLeftHeight + realWallRightHeight) / 2];\r\n wallCenterPos = wallCenterPos * lx;\r\n\r\n const leftX = wallCenterPos + hx;\r\n const leftLength = Math.hypot(leftX, wallCenterHeight - realWallLeftHeight);\r\n const leftRotationY = -Math.atan2(wallCenterHeight - realWallLeftHeight, leftX);\r\n\r\n const rightX = hx - wallCenterPos;\r\n const rightLength = Math.hypot(rightX, realWallRightHeight - wallCenterHeight);\r\n const rightRotationY = -Math.atan2(realWallRightHeight - wallCenterHeight, rightX);\r\n\r\n const topBarThickness = ly;\r\n\r\n return (\r\n \r\n {structureUnitArray.map(([pos, y], idx) => {\r\n let height;\r\n if (pos < wallCenterPos) {\r\n height =\r\n ((pos + hx) * (wallCenterHeight - realWallLeftHeight)) / (wallCenterPos + hx) + realWallLeftHeight - y;\r\n } else {\r\n height =\r\n ((pos - hx) * (wallCenterHeight - realWallRightHeight)) / (wallCenterPos - hx) + realWallRightHeight - y;\r\n }\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {(opacity > 0 || wallStructure === WallStructure.Default) && (\r\n <>\r\n {/* simulation mesh */}\r\n \r\n \r\n \r\n \r\n {/* wall outside surface */}\r\n {\r\n handleContextMenu(e, outsideWallRef.current, true);\r\n }}\r\n onPointerMove={handleWallBodyPointMove}\r\n onPointerDown={handleWallBodyPointerDown}\r\n onPointerUp={handleWallBodyPointerUp}\r\n onPointerOut={handleWallBodyPointerOut}\r\n >\r\n \r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {/* inside wall */}\r\n {\r\n handleContextMenu(e, insideWallRef.current);\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {/* top surface */}\r\n {(!roofId || isTopPartial) && !showParapet && (\r\n {\r\n handleContextMenu(e, topSurfaceRef.current);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {/* side surfaces */}\r\n {leftOffset === 0 && (\r\n \r\n )}\r\n {rightOffset === 0 && (\r\n \r\n )}\r\n\r\n {/* intersection planes for children */}\r\n {(showIntersectionPlane || showWallIntersectionPlaneId === id) &&\r\n useStore.getState().selectedElement?.parentId === id && (\r\n <>\r\n \r\n \r\n \r\n {/* block plane */}\r\n {\r\n /* Do Not Delete! Capture event for wall pointer move*/\r\n }}\r\n visible={false}\r\n />\r\n \r\n )}\r\n\r\n {elementsOnWall.map((e) => {\r\n switch (e.type) {\r\n case ObjectType.Window: {\r\n return (\r\n \r\n );\r\n }\r\n case ObjectType.Door: {\r\n if (fill !== WallFill.Full) return null;\r\n return (\r\n \r\n );\r\n }\r\n case ObjectType.SolarPanel:\r\n let r = 0;\r\n if (latestFoundation && wallModel) {\r\n r = latestFoundation.rotation[2] + wallModel.relativeAngle;\r\n }\r\n return (\r\n \r\n \r\n \r\n );\r\n default:\r\n return null;\r\n }\r\n })}\r\n \r\n )}\r\n\r\n {/* polygon */}\r\n {elementsOnWall.map((e) => {\r\n if (e.type === ObjectType.Polygon && fill !== WallFill.Empty) {\r\n return ;\r\n }\r\n return null;\r\n })}\r\n\r\n {wallStructure === WallStructure.Stud && renderStuds()}\r\n {wallStructure === WallStructure.Pillar && renderPillars()}\r\n\r\n {/* parapet */}\r\n {showParapet && (\r\n \r\n )}\r\n\r\n {/* wireFrame */}\r\n {(wallStructure === WallStructure.Default || (locked && selected)) && (\r\n \r\n )}\r\n\r\n {/* ruler */}\r\n {selected && }\r\n\r\n {/* grid */}\r\n {(showIntersectionPlane || showWallIntersectionPlaneId === id) &&\r\n useStore.getState().selectedElement?.parentId === id && (\r\n \r\n \r\n \r\n )}\r\n\r\n {/* heat flux */}\r\n {}\r\n \r\n );\r\n};\r\n\r\nexport function getSolarPanelUnitLength(solarPanel: SolarPanelModel) {\r\n const pvModel = useStore.getState().getPvModule(solarPanel.pvModelName);\r\n if (solarPanel.orientation === Orientation.landscape) {\r\n return [pvModel.length, pvModel.width];\r\n } else {\r\n return [pvModel.width, pvModel.length];\r\n }\r\n}\r\n\r\nconst areEqual = (prev: WallProps, curr: WallProps) => prev.wallModel === curr.wallModel;\r\n\r\nexport default React.memo(Wall, areEqual);\r\n","import { Cone, Line } from '@react-three/drei';\r\nimport React, { useMemo, useRef } from 'react';\r\nimport { Util } from 'src/Util';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n} from 'src/constants';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { WallFill, WallModel } from 'src/models/WallModel';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useDataStore } from 'src/stores/commonData';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType } from 'src/types';\r\nimport { Euler, Vector3 } from 'three';\r\n\r\ninterface HeatFluxProps {\r\n wallModel: WallModel;\r\n notBuilding?: boolean;\r\n}\r\n\r\nconst WallHeatFlux = ({ wallModel, notBuilding }: HeatFluxProps) => {\r\n const { id, lx, lz } = wallModel;\r\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const partial = wallModel.fill === WallFill.Partial && !Util.isPartialWallFull(wallModel);\r\n const frameVertices = Util.getWallVertices(wallModel, 0);\r\n const partialWallVertices = partial ? Util.getPartialWallVertices(wallModel, 0) : frameVertices;\r\n const frameArea = Util.getPolygonArea(frameVertices);\r\n let area = partial ? Util.getPolygonArea(partialWallVertices) : frameArea;\r\n if (area === 0) return undefined;\r\n const windows = getChildrenOfType(ObjectType.Window, id);\r\n const doors = getChildrenOfType(ObjectType.Door, id);\r\n if (windows && windows.length > 0) {\r\n for (const w of windows) {\r\n // window dimension is relative to the wall\r\n area -= Util.getWindowArea(w as WindowModel, wallModel);\r\n }\r\n }\r\n if (doors && doors.length > 0) {\r\n for (const d of doors) {\r\n // door dimension is relative to the wall\r\n area -= d.lx * d.lz * wallModel.lx * wallModel.lz;\r\n }\r\n }\r\n const world = useStore.getState().world;\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const lz = Util.getHighestPointOfWall(wallModel); // height\r\n const nx = Math.max(2, Math.round(lx / cellSize));\r\n const nz = Math.max(2, Math.round(lz / cellSize));\r\n const dx = lx / nx;\r\n const dz = lz / nz;\r\n const halfDif = (lz - wallModel.lz) / 2;\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowEuler.current = Util.getEuler(\r\n UNIT_VECTOR_POS_Z,\r\n UNIT_VECTOR_POS_Y,\r\n 'YXZ',\r\n Math.sign(intensity) * HALF_PI,\r\n );\r\n const vectors: Vector3[][] = [];\r\n const polygon = partial ? Util.getPartialWallVertices(wallModel, 0) : Util.getWallVertices(wallModel, 0);\r\n let isWall;\r\n for (let kx = 0; kx < nx; kx++) {\r\n for (let kz = 0; kz < nz; kz++) {\r\n const v: Vector3[] = [];\r\n const rx = (kx - nx / 2 + 0.5) * dx;\r\n const rz = (kz - nz / 2 + 0.5) * dz + halfDif;\r\n if (Util.isPointInside(rx, rz, polygon)) {\r\n isWall = true;\r\n if (windows && windows.length > 0) {\r\n for (const w of windows) {\r\n if (w.type !== ObjectType.Window) continue;\r\n const cx = w.cx * wallModel.lx;\r\n const cz = w.cz * wallModel.lz;\r\n const hx = (w.lx * wallModel.lx) / 2;\r\n const hz = (w.lz * wallModel.lz) / 2;\r\n const win = w as WindowModel;\r\n if (win.windowType === WindowType.Arched) {\r\n // TODO: Deal with arched window\r\n if (rx >= cx - hx && rx < cx + hx && rz >= cz - hz && rz < cz + hz) {\r\n isWall = false;\r\n break;\r\n }\r\n } else {\r\n if (rx >= cx - hx && rx < cx + hx && rz >= cz - hz && rz < cz + hz) {\r\n isWall = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (doors && doors.length > 0) {\r\n for (const d of doors) {\r\n const cx = d.cx * lx;\r\n const cz = d.cz * lz;\r\n const hx = (d.lx * lx) / 2;\r\n const hz = (d.lz * lz) / 2;\r\n // TODO: Deal with arched door\r\n if (rx >= cx - hx && rx < cx + hx && rz >= cz - hz && rz < cz + hz) {\r\n isWall = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (isWall) {\r\n if (intensity < 0) {\r\n v.push(new Vector3(rx, 0, rz));\r\n v.push(new Vector3(rx, intensity, rz));\r\n } else {\r\n v.push(new Vector3(rx, 0, rz));\r\n v.push(new Vector3(rx, -intensity, rz));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [lx, lz, showHeatFluxes, heatFluxScaleFactor, notBuilding]);\r\n\r\n if (!heatFluxes) return null;\r\n\r\n return (\r\n <>\r\n {heatFluxes.map((v, index) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WallHeatFlux);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Euler, Vector3 } from 'three';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { Util } from 'src/Util';\r\nimport { RoofSegmentProps } from './roofRenderer';\r\nimport { HALF_PI_Z_EULER, LOCKED_ELEMENT_SELECTION_COLOR, UNIT_VECTOR_POS_Z } from 'src/constants';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ObjectType } from 'src/types';\r\nimport { RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { WALL_PADDING } from '../wall/wall';\r\nimport { WindowModel, WindowType } from '../../models/WindowModel';\r\nimport { FoundationModel } from '../../models/FoundationModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\nimport { ComposedWall } from './hooks';\r\nimport { useDataStore } from 'src/stores/commonData';\r\n\r\nexport class RoofUtil {\r\n // roof related\r\n\r\n static getWireframetStyle(lineColor: string, lineWidth: number, selected: boolean, locked?: boolean) {\r\n const _lineColor = selected && locked ? LOCKED_ELEMENT_SELECTION_COLOR : lineColor;\r\n const _lineWidth = selected && locked ? 1 : lineWidth;\r\n return [_lineColor, _lineWidth] as [string, number];\r\n }\r\n\r\n static getComposedWallNormal(wall: ComposedWall) {\r\n return new Vector3().subVectors(wall.leftPoint, wall.rightPoint).applyEuler(HALF_PI_Z_EULER).normalize();\r\n }\r\n\r\n // to be deleted\r\n static getWallNormal(wall: WallModel) {\r\n return new Vector3()\r\n .subVectors(\r\n new Vector3(wall.leftPoint[0], wall.leftPoint[1]),\r\n new Vector3(wall.rightPoint[0], wall.rightPoint[1]),\r\n )\r\n .applyEuler(HALF_PI_Z_EULER)\r\n .normalize();\r\n }\r\n\r\n static isTypeRoof(type: ObjectType) {\r\n return (\r\n type === ObjectType.Roof ||\r\n type === ObjectType.PyramidRoof ||\r\n type === ObjectType.HipRoof ||\r\n type === ObjectType.GableRoof ||\r\n type === ObjectType.GambrelRoof ||\r\n type === ObjectType.MansardRoof\r\n );\r\n }\r\n\r\n static getIntersectionPoint(v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3) {\r\n if (Math.abs(v1.x - v2.x) < 0.001 && Math.abs(v3.x - v4.x) < 0.001) {\r\n return v2.clone();\r\n }\r\n const k1 = (v2.y - v1.y) / (v2.x - v1.x);\r\n const k2 = (v4.y - v3.y) / (v4.x - v3.x);\r\n if (Math.abs(k1 - k2) < 0.001) {\r\n return v2.clone();\r\n }\r\n const x = [v1.x, v2.x, v3.x, v4.x];\r\n const y = [v1.y, v2.y, v3.y, v4.y];\r\n const x0 =\r\n ((x[2] - x[3]) * (x[1] * y[0] - x[0] * y[1]) - (x[0] - x[1]) * (x[3] * y[2] - x[2] * y[3])) /\r\n ((x[2] - x[3]) * (y[0] - y[1]) - (x[0] - x[1]) * (y[2] - y[3]));\r\n const y0 =\r\n ((y[2] - y[3]) * (y[1] * x[0] - y[0] * x[1]) - (y[0] - y[1]) * (y[3] * x[2] - y[2] * x[3])) /\r\n ((y[2] - y[3]) * (x[0] - x[1]) - (y[0] - y[1]) * (x[2] - x[3]));\r\n if (!Number.isFinite(x0) || !Number.isFinite(y0)) {\r\n return v2.clone();\r\n }\r\n return new Vector3(x0, y0);\r\n }\r\n\r\n /** distance from point p3 to line formed by p1 and p2 in 2D */\r\n static getDistance(p1: Vector3, p2: Vector3, p3: Vector3) {\r\n const A = p2.y - p1.y;\r\n if (A === 0) {\r\n return Math.abs(p1.y - p3.y);\r\n }\r\n const B = p1.x - p2.x;\r\n if (B === 0) {\r\n return Math.abs(p1.x - p3.x);\r\n }\r\n const C = p2.x * p1.y - p1.x * p2.y;\r\n const res = Math.abs((A * p3.x + B * p3.y + C) / Math.sqrt(A * A + B * B));\r\n return res === 0 ? Infinity : res;\r\n }\r\n\r\n static getWallPoints2D(\r\n wall: WallModel,\r\n centerRoofHeight?: number[],\r\n centerLeftRoofHeight?: number[],\r\n centerRightRoofHeight?: number[],\r\n ) {\r\n const { lx, lz, rightRoofHeight, leftRoofHeight } = wall;\r\n const centerLeft = centerLeftRoofHeight ?? wall.centerLeftRoofHeight;\r\n const center = centerRoofHeight ?? wall.centerRoofHeight;\r\n const centerRight = centerRightRoofHeight ?? wall.centerRightRoofHeight;\r\n\r\n const points: Point2[] = [];\r\n const x = lx / 2;\r\n const y = lz / 2;\r\n points.push({ x: -x, y: -y });\r\n points.push({ x: x, y: -y });\r\n rightRoofHeight ? points.push({ x: x, y: rightRoofHeight - y }) : points.push({ x: x, y: y });\r\n if (centerRight) {\r\n points.push({ x: centerRight[0] * lx, y: centerRight[1] - y });\r\n }\r\n if (center) {\r\n points.push({ x: center[0] * lx, y: center[1] - y });\r\n }\r\n if (centerLeft) {\r\n points.push({ x: centerLeft[0] * lx, y: centerLeft[1] - y });\r\n }\r\n leftRoofHeight ? points.push({ x: -x, y: leftRoofHeight - y }) : points.push({ x: -x, y: y });\r\n return points;\r\n }\r\n\r\n static isPointInside(wallPoints2D: Point2[], x: number, y: number) {\r\n let inside = false;\r\n for (let i = 0, j = wallPoints2D.length - 1; i < wallPoints2D.length; j = i++) {\r\n const xi = wallPoints2D[i].x;\r\n const yi = wallPoints2D[i].y;\r\n const xj = wallPoints2D[j].x;\r\n const yj = wallPoints2D[j].y;\r\n if (yi > y != yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {\r\n inside = !inside;\r\n }\r\n }\r\n return inside;\r\n }\r\n\r\n static isRoofValid(\r\n roofId: string,\r\n currWallId?: string,\r\n counterWallId?: string,\r\n centerRoofHeight?: number[],\r\n centerLeftRoofHeight?: number[],\r\n centerRightRoofHeight?: number[],\r\n ) {\r\n for (const element of useStore.getState().elements) {\r\n if (element.type === ObjectType.Wall && (element as WallModel).roofId === roofId) {\r\n const wall = element as WallModel;\r\n let points: Point2[] = [];\r\n if (wall.id === currWallId) {\r\n points = RoofUtil.getWallPoints2D(wall, centerRoofHeight, centerLeftRoofHeight, centerRightRoofHeight);\r\n } else if (wall.id === counterWallId) {\r\n let ch: number[] | undefined = undefined;\r\n let cl: number[] | undefined = undefined;\r\n let cr: number[] | undefined = undefined;\r\n if (centerRoofHeight) {\r\n ch = [-centerRoofHeight[0], centerRoofHeight[1]];\r\n }\r\n if (centerRightRoofHeight) {\r\n cl = [-centerRightRoofHeight[0], centerRightRoofHeight[1]];\r\n }\r\n if (centerLeftRoofHeight) {\r\n cr = [-centerLeftRoofHeight[0], centerLeftRoofHeight[1]];\r\n }\r\n points = RoofUtil.getWallPoints2D(wall, ch, cl, cr);\r\n }\r\n if (wall.id === currWallId || wall.id === counterWallId) {\r\n for (const e of useStore.getState().elements) {\r\n if (e.parentId === wall.id) {\r\n let hx = e.lx / 2;\r\n let hz = e.lz / 2;\r\n let padding = WALL_PADDING;\r\n if (e.type === ObjectType.SolarPanel) {\r\n hx = (hx - 0.01) / wall.lx;\r\n hz = (e.ly / 2 - 0.01) / wall.lz;\r\n padding = 0;\r\n }\r\n const minX = e.cx * wall.lx - hx * wall.lx;\r\n const maxX = e.cx * wall.lx + hx * wall.lx;\r\n const maxZ = e.cz * wall.lz + hz * wall.lz + padding;\r\n if (!RoofUtil.isPointInside(points, minX, maxZ) || !RoofUtil.isPointInside(points, maxX, maxZ)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // for solar panels and skylight windows on a roof segment\r\n static getSegmentIdx(roofSegments: RoofSegmentProps[], posRelToCentroid: Vector3): number {\r\n for (let i = 0; i < roofSegments.length; i++) {\r\n const points = roofSegments[i].points.slice(0, 4);\r\n if (Util.isPointInside(posRelToCentroid.x, posRelToCentroid.y, points.map(Util.mapVector3ToPoint2))) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n static onSegment(vertices: Vector3[], cx: number, cy: number): boolean {\r\n return Util.isPointInside(cx, cy, vertices.map(Util.mapVector3ToPoint2));\r\n }\r\n\r\n // less compute but easier to appear bugs\r\n static getSegmentIdxFromPointerEvent(e: ThreeEvent) {\r\n for (const intersection of e.intersections) {\r\n if (intersection.object.name.includes('Roof segment')) {\r\n return parseInt(intersection.object.name.slice(-1));\r\n }\r\n }\r\n return Number.NaN;\r\n }\r\n\r\n static getSegmentVertices(roofSegments: RoofSegmentProps[], segmentIdx: number, pointer: Vector3) {\r\n // return orders matter: counterclockwise\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft] = roofSegments[segmentIdx].points;\r\n if (roofSegments[segmentIdx].points.length === 6) {\r\n return [wallRight, ridgeRight, wallLeft];\r\n }\r\n const leftDis = Util.distanceFromPointToLine2D(ridgeLeft, wallLeft, wallRight);\r\n const rightDis = Util.distanceFromPointToLine2D(ridgeRight, wallLeft, wallRight);\r\n if (Math.abs(leftDis - rightDis) < 0.01) {\r\n if (wallLeft.z > wallRight.z) {\r\n const upperHalf = [ridgeLeft, ridgeRight, wallLeft];\r\n if (Util.isPointInside(pointer.x, pointer.y, upperHalf.map(Util.mapVector3ToPoint2))) {\r\n return [wallLeft, ridgeRight, ridgeLeft];\r\n } else {\r\n return [wallLeft, wallRight, ridgeRight];\r\n }\r\n } else {\r\n const upperHalf = [ridgeLeft, ridgeRight, wallRight];\r\n if (Util.isPointInside(pointer.x, pointer.y, upperHalf.map(Util.mapVector3ToPoint2))) {\r\n return [wallRight, ridgeRight, ridgeLeft];\r\n } else {\r\n return [wallRight, ridgeLeft, wallLeft];\r\n }\r\n }\r\n } else if (leftDis <= rightDis) {\r\n const upperHalf = [ridgeLeft, ridgeRight, wallRight];\r\n if (Util.isPointInside(pointer.x, pointer.y, upperHalf.map(Util.mapVector3ToPoint2))) {\r\n return [wallRight, ridgeRight, ridgeLeft];\r\n } else {\r\n return [wallRight, ridgeLeft, wallLeft];\r\n }\r\n } else {\r\n const upperHalf = [ridgeLeft, ridgeRight, wallLeft];\r\n if (Util.isPointInside(pointer.x, pointer.y, upperHalf.map(Util.mapVector3ToPoint2))) {\r\n return [wallLeft, ridgeRight, ridgeLeft];\r\n } else {\r\n return [wallLeft, wallRight, ridgeRight];\r\n }\r\n }\r\n }\r\n\r\n static getSegmentNormal(vertices: Vector3[]) {\r\n // order matters for cross product, counterclockwise, v1 is shared vertex\r\n const [v1, v2, v3] = vertices;\r\n return new Vector3().crossVectors(new Vector3().subVectors(v1, v2), new Vector3().subVectors(v1, v3)).normalize();\r\n }\r\n\r\n static getRotationFromNormal(normal: Vector3) {\r\n return Util.isSame(normal.normalize(), UNIT_VECTOR_POS_Z)\r\n ? [0, 0, 0]\r\n : [\r\n Math.PI / 2 - Math.atan2(normal.z, Math.hypot(normal.x, normal.y)),\r\n 0,\r\n Math.atan2(normal.y, normal.x) + Math.PI / 2,\r\n ];\r\n }\r\n\r\n static getRooftopElementZ(vertices: Vector3[], pos: Vector3, roofHeight: number) {\r\n const [v1, v2, v3] = vertices;\r\n const A = (v2.y - v1.y) * (v3.z - v1.z) - (v2.z - v1.z) * (v3.y - v1.y);\r\n const B = (v2.z - v1.z) * (v3.x - v1.x) - (v2.x - v1.x) * (v3.z - v1.z);\r\n const C = (v2.x - v1.x) * (v3.y - v1.y) - (v2.y - v1.y) * (v3.x - v1.x);\r\n const D = -(A * v1.x + B * v1.y + C * v1.z);\r\n return -(D + A * pos.x + B * pos.y) / C + roofHeight;\r\n }\r\n\r\n // return triangulated vertices\r\n static computeState(roofSegments: RoofSegmentProps[], posRelToCentroid: Vector3, isFlatGambrel?: boolean) {\r\n const segmentIdx = RoofUtil.getSegmentIdx(roofSegments, posRelToCentroid);\r\n if (isFlatGambrel) {\r\n return { segmentIdx: -1, segmentVertices: null, normal: new Vector3(0, 0, 1), rotation: [0, 0, 0] };\r\n }\r\n if (segmentIdx !== -1) {\r\n const segmentVertices = RoofUtil.getSegmentVertices(roofSegments, segmentIdx, posRelToCentroid);\r\n const normal = RoofUtil.getSegmentNormal(segmentVertices);\r\n const rotation = RoofUtil.getRotationFromNormal(normal);\r\n return { segmentIdx, segmentVertices, normal, rotation };\r\n } else {\r\n // mansard rooftop surface\r\n return { segmentIdx: -1, segmentVertices: null, normal: new Vector3(0, 0, 1), rotation: [0, 0, 0] };\r\n }\r\n }\r\n\r\n // todo: need to add roofId to each wall when adding roof\r\n static getOrderedWallArrayOfRoof(roofId: string) {\r\n const wallMap = new Map();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n wallMap.set(e.id, e as WallModel);\r\n }\r\n }\r\n\r\n if (wallMap.size === 0) {\r\n return { orderedWallArray: [] as WallModel[], isLoop: false };\r\n }\r\n\r\n const wall0 = wallMap.entries().next().value[1] as WallModel;\r\n const orderedWallArray = [wall0];\r\n\r\n let nextId = wall0.rightJoints[0];\r\n while (nextId && nextId !== wall0.id) {\r\n const nextWall = wallMap.get(nextId);\r\n if (nextWall) {\r\n orderedWallArray.push(nextWall);\r\n nextId = nextWall.rightJoints[0];\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (nextId === wall0.id) {\r\n return { orderedWallArray, isLoop: true };\r\n }\r\n\r\n nextId = wall0.leftJoints[0];\r\n while (nextId) {\r\n const nextWall = wallMap.get(nextId);\r\n if (nextWall) {\r\n orderedWallArray.unshift(nextWall);\r\n nextId = nextWall.leftJoints[0];\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return { orderedWallArray, isLoop: false };\r\n }\r\n\r\n static getRoofBoundaryVertices(roof: RoofModel) {\r\n const segments = useDataStore.getState().roofSegmentVerticesMap.get(roof.id);\r\n if (!segments) throw new Error();\r\n // flat roof\r\n if (roof.roofType !== RoofType.Gable && roof.rise < 0.01) {\r\n return segments[0].map((v) => ({ x: v.x, y: v.y } as Point2));\r\n }\r\n switch (roof.roofType) {\r\n case RoofType.Gable: {\r\n if (segments.length === 1) {\r\n return segments[0].map((p) => ({ x: p.x, y: p.y }));\r\n }\r\n return segments.reduce((acc, points) => {\r\n acc.push({ x: points[0].x, y: points[0].y }, { x: points[1].x, y: points[1].y });\r\n return acc;\r\n }, [] as Point2[]);\r\n }\r\n case RoofType.Gambrel: {\r\n return segments.reduce((acc, points, idx) => {\r\n if (idx === 0 || idx === 3) {\r\n acc.push({ x: points[0].x, y: points[0].y }, { x: points[1].x, y: points[1].y });\r\n }\r\n return acc;\r\n }, [] as Point2[]);\r\n }\r\n case RoofType.Mansard: {\r\n return segments.reduce((acc, points, idx) => {\r\n if (idx !== segments.length - 1) {\r\n acc.push({ x: points[0].x, y: points[0].y });\r\n }\r\n return acc;\r\n }, [] as Point2[]);\r\n }\r\n default: {\r\n return segments.reduce((acc, points, idx) => {\r\n acc.push({ x: points[0].x, y: points[0].y });\r\n return acc;\r\n }, [] as Point2[]);\r\n }\r\n }\r\n }\r\n\r\n static getAbsoluteWindowVerticesOnRoof(window: WindowModel, foundation: FoundationModel): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(window.cx, window.cy, window.cz);\r\n const foundationCenter = new Vector3(foundation.cx, foundation.cy, foundation.lz);\r\n if (window.windowType === WindowType.Arched) {\r\n const ah = Math.min(window.archHeight, window.lx / 2, window.lz);\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex =\r\n i * j > 0\r\n ? new Vector3((window.lx / 2) * i, (window.lz / 2 - ah) * j * i, 0)\r\n : new Vector3((window.lx / 2) * i, (window.lz / 2) * j * i, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n }\r\n }\r\n // approximate the arc with a triangle (arch height is included in window.lz)\r\n const vertex = new Vector3(0, window.lz / 2, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n } else {\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3((window.lx / 2) * i, (window.lz / 2) * j * i, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n }\r\n }\r\n if (window.windowType === WindowType.Polygonal && window.polygonTop) {\r\n const vertex = new Vector3(window.lx * window.polygonTop[0], window.lz / 2 + window.polygonTop[1], 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n static getRelativeWindowVerticesOnRoof(window: WindowModel): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(window.cx, window.cy, window.cz);\r\n if (window.windowType === WindowType.Arched) {\r\n const ah = Math.min(window.archHeight, window.lx / 2, window.lz);\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex =\r\n i * j > 0\r\n ? new Vector3((window.lx / 2) * i, (window.lz / 2 - ah) * j * i, 0)\r\n : new Vector3((window.lx / 2) * i, (window.lz / 2) * j * i, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertices.push(vertex);\r\n }\r\n }\r\n // approximate the arc with a triangle (arch height is included in window.lz)\r\n const vertex = new Vector3(0, window.lz / 2, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertices.push(vertex);\r\n } else {\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3((window.lx / 2) * i, (window.lz / 2) * j * i, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertices.push(vertex);\r\n }\r\n }\r\n if (window.windowType === WindowType.Polygonal && window.polygonTop) {\r\n const vertex = new Vector3(window.lx * window.polygonTop[0], window.lz / 2 + window.polygonTop[1], 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertices.push(vertex);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n static getAbsoluteSolarPanelVerticesOnRoof(sp: SolarPanelModel, foundation: FoundationModel): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(sp.cx * foundation.lx, sp.cy * foundation.ly, sp.cz);\r\n const foundationCenter = new Vector3(foundation.cx, foundation.cy, foundation.lz);\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3((sp.lx / 2) * i, (sp.ly / 2) * j * i, 0);\r\n if (sp.rotation[0] === 0) {\r\n // has pole\r\n vertex.applyEuler(new Euler(sp.tiltAngle, 0, sp.relativeAzimuth, 'ZXY')).add(center);\r\n } else {\r\n vertex.applyEuler(new Euler(sp.rotation[0], sp.rotation[1], sp.rotation[2], 'ZXY')).add(center);\r\n }\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n static getSolarPanelVerticesOnRoof(sp: SolarPanelModel, foundation: ElementModel): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(sp.cx * foundation.lx, sp.cy * foundation.ly, sp.cz + foundation.lz);\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3((sp.lx / 2) * i, (sp.ly / 2) * j * i, 0);\r\n if (sp.rotation[0] === 0) {\r\n // has pole\r\n vertex.applyEuler(new Euler(sp.tiltAngle, 0, sp.relativeAzimuth, 'ZXY')).add(center);\r\n } else {\r\n vertex.applyEuler(new Euler(sp.rotation[0], sp.rotation[1], sp.rotation[2], 'ZXY')).add(center);\r\n }\r\n vertices.push(vertex);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n static getWindowVerticesOnRoof(window: WindowModel, margin = 0): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(window.cx, window.cy, window.cz);\r\n const [hx, hy] = [window.lx / 2 + margin, window.lz / 2 + margin];\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3(i * hx, i * j * hy);\r\n vertex.applyEuler(new Euler().fromArray([...window.rotation, 'ZXY'])).add(center);\r\n vertices.push(vertex);\r\n }\r\n }\r\n if (window.windowType === WindowType.Polygonal) {\r\n const [tx, th] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n const vertex = new Vector3(tx * window.lx, window.lz + th).add(center);\r\n vertices.push(vertex);\r\n }\r\n return vertices;\r\n }\r\n\r\n // state check\r\n static rooftopElementBoundaryCheck(elementVertices: Vector3[], boundaryVertices: Point2[]): boolean {\r\n for (const vertex of elementVertices) {\r\n if (!Util.isPointInside(vertex.x, vertex.y, boundaryVertices)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static rooftopWindowCollisionCheck(currId: string, currVertices: Vector3[], roofId: string) {\r\n const targetElementsVertices: Vector3[][] = [];\r\n for (const el of useStore.getState().elements) {\r\n if (el.parentId === roofId && el.id !== currId) {\r\n const vertices = RoofUtil.getWindowVerticesOnRoof(el as WindowModel);\r\n targetElementsVertices.push(vertices);\r\n }\r\n }\r\n\r\n for (const targetVertices of targetElementsVertices) {\r\n // check if current element vertices inside other(target) element\r\n for (const currentVertex of currVertices) {\r\n if (Util.isPointInside(currentVertex.x, currentVertex.y, targetVertices)) {\r\n return false;\r\n }\r\n }\r\n // check if other element vertices inside current element\r\n for (const targetVertex of targetVertices) {\r\n if (Util.isPointInside(targetVertex.x, targetVertex.y, currVertices)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static rooftopSPCollisionCheck(sp: SolarPanelModel, foundation: ElementModel, spVertices: Vector3[]): boolean {\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === sp.type && elem.parentId === sp.parentId && elem.id !== sp.id) {\r\n const sp2Vertices = RoofUtil.getSolarPanelVerticesOnRoof(elem as SolarPanelModel, foundation);\r\n for (const vertex of spVertices) {\r\n if (Util.isPointInside(vertex.x, vertex.y, sp2Vertices)) {\r\n return false;\r\n }\r\n }\r\n for (const vertex of sp2Vertices) {\r\n if (Util.isPointInside(vertex.x, vertex.y, spVertices)) {\r\n return false;\r\n }\r\n }\r\n const v1 = spVertices.map(Util.mapVector3ToPoint2);\r\n const v2 = sp2Vertices.map(Util.mapVector3ToPoint2);\r\n v1.push(v1[0]);\r\n v2.push(v2[0]);\r\n for (let i1 = 0; i1 < v1.length - 1; i1++) {\r\n const from1 = v1[i1];\r\n const to1 = v1[i1 + 1];\r\n for (let i2 = 0; i2 < v2.length - 1; i2++) {\r\n const from2 = v2[i2];\r\n const to2 = v2[i2 + 1];\r\n if (Util.lineIntersection(from1, to1, from2, to2)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static getComposedWallHeight(arr: ComposedWall[], i: number) {\r\n const w = arr[i];\r\n let lh;\r\n let rh;\r\n if (i === 0) {\r\n lh = Math.max(w.lz, arr[arr.length - 1].lz);\r\n rh = Math.max(w.lz, arr[i + 1].lz);\r\n } else if (i === arr.length - 1) {\r\n lh = Math.max(w.lz, arr[i - 1].lz);\r\n rh = Math.max(w.lz, arr[0].lz);\r\n } else {\r\n lh = Math.max(w.lz, arr[i - 1].lz);\r\n rh = Math.max(w.lz, arr[i + 1].lz);\r\n }\r\n return { lh, rh };\r\n }\r\n\r\n static getHighestComposedWallHeight(composedWallArray: ComposedWall[] | null, ignoreSide?: boolean) {\r\n if (composedWallArray === null) return 0;\r\n\r\n let maxWallHeight = 0;\r\n if (ignoreSide && composedWallArray.length === 4) {\r\n return Math.max(composedWallArray[0].lz, composedWallArray[2].lz);\r\n }\r\n for (let i = 0; i < composedWallArray.length; i++) {\r\n const { lh, rh } = RoofUtil.getComposedWallHeight(composedWallArray, i);\r\n maxWallHeight = Math.max(maxWallHeight, lh, rh);\r\n }\r\n return maxWallHeight;\r\n }\r\n\r\n // to be deleted\r\n static getWallHeight(arr: WallModel[], i: number) {\r\n const w = arr[i];\r\n let lh;\r\n let rh;\r\n if (i === 0) {\r\n lh = Math.max(w.lz, arr[arr.length - 1].lz);\r\n rh = Math.max(w.lz, arr[i + 1].lz);\r\n } else if (i === arr.length - 1) {\r\n lh = Math.max(w.lz, arr[i - 1].lz);\r\n rh = Math.max(w.lz, arr[0].lz);\r\n } else {\r\n lh = Math.max(w.lz, arr[i - 1].lz);\r\n rh = Math.max(w.lz, arr[i + 1].lz);\r\n }\r\n return { lh, rh };\r\n }\r\n\r\n static getHighestWallHeight(currentWallArray: WallModel[], ignoreSide?: boolean) {\r\n let maxWallHeight = 0;\r\n if (ignoreSide && currentWallArray.length === 4) {\r\n return Math.max(currentWallArray[0].lz, currentWallArray[2].lz);\r\n }\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n maxWallHeight = Math.max(maxWallHeight, lh, rh);\r\n }\r\n return maxWallHeight;\r\n }\r\n\r\n static isValidOnRoof(elem: ElementModel | null) {\r\n if (!elem) return false;\r\n switch (elem.type) {\r\n case ObjectType.SolarPanel:\r\n // return (elem as SolarPanelModel).parentType === ObjectType.Roof;\r\n case ObjectType.Light:\r\n case ObjectType.Sensor:\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** position is relative to foundation */\r\n static getRotationOnRoof(roofId: string, position: Vector3) {\r\n const segments = useDataStore.getState().getRoofSegmentVertices(roofId);\r\n if (!segments) return null;\r\n for (const segment of segments) {\r\n if (Util.isPointInside(position.x, position.y, segment)) {\r\n const normal = RoofUtil.getSegmentNormal(segment);\r\n const rotation = RoofUtil.getRotationFromNormal(normal);\r\n return rotation;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static getRoofSegmentBoundary(roofId: string, position: Vector3) {\r\n const segments = useDataStore.getState().getRoofSegmentVertices(roofId);\r\n if (!segments) return null;\r\n for (const segment of segments) {\r\n if (Util.isPointInside(position.x, position.y, segment)) {\r\n return segment;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static getComposedWallLength(wall: ComposedWall) {\r\n return new Vector3().subVectors(wall.leftPoint, wall.rightPoint).length();\r\n }\r\n\r\n static getComposedWallCenter(wall: ComposedWall) {\r\n return new Vector3().addVectors(wall.leftPoint, wall.rightPoint).divideScalar(2);\r\n }\r\n}\r\n","import { ObjectType } from 'src/types';\r\nimport { ElementModel } from './ElementModel';\r\n\r\nexport interface Stackable {\r\n stackable?: boolean;\r\n}\r\n\r\nexport type StackableModel = ElementModel & Stackable;\r\n\r\nexport function isStackableModel(element: ElementModel) {\r\n return element.type === ObjectType.Cuboid;\r\n}\r\n","export default __webpack_public_path__ + \"static/media/building_facade_01.15119408.png\";","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Plane } from '@react-three/drei';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\r\nimport MoveHandle from 'src/components/moveHandle';\r\nimport ResizeHandle from 'src/components/resizeHandle';\r\nimport RotateHandle from 'src/components/rotateHandle';\r\nimport { GROUND_ID, HALF_PI, RESIZE_HANDLE_SIZE, TWO_PI } from 'src/constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from 'src/types';\r\nimport { Util } from 'src/Util';\r\nimport { Euler, Mesh, Vector3 } from 'three';\r\nimport * as Selector from '../../stores/selector';\r\nimport { useHandleSize } from '../wall/hooks';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\n\r\ninterface HandlesProps {\r\n id: string;\r\n args: number[];\r\n}\r\n\r\ntype IntersectionPlaneData = {\r\n position: Vector3;\r\n rotation: Euler;\r\n};\r\n\r\nenum CuboidFace {\r\n Top = 'Top',\r\n NS = 'NS',\r\n EW = 'EW',\r\n}\r\n\r\nconst Handles = ({ id, args }: HandlesProps) => {\r\n const [hx, hy, hz] = args;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n const addedCuboidId = useStore(Selector.addedCuboidId);\r\n\r\n const [intersectionPlaneData, setIntersectionPlaneData] = useState(null);\r\n\r\n const { gl, raycaster } = useThree();\r\n const size = useHandleSize();\r\n\r\n const cuboidWorldBottomHeight = useRef(null);\r\n const cuboidWorldPosition = useRef(null);\r\n const cuboidWorldRotation = useRef(null);\r\n const parentWorldRotation = useRef(null);\r\n const parentWorldPosition = useRef(null);\r\n const childPositionMap = useRef>(new Map());\r\n const childSideMap = useRef>(new Map());\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n\r\n const lowerRotateHandlePosition: [x: number, y: number, z: number] = useMemo(() => {\r\n return [0, Math.min(-1.2 * hy, -hy - 0.75) - size * 2, RESIZE_HANDLE_SIZE / 2 - hz];\r\n }, [hy, hz, size]);\r\n\r\n const upperRotateHandlePosition: [x: number, y: number, z: number] = useMemo(() => {\r\n return [0, Math.max(1.2 * hy, hy + 0.75) + size * 2, RESIZE_HANDLE_SIZE / 2 - hz];\r\n }, [hy, hz, size]);\r\n\r\n const showIntersectionPlane = intersectionPlaneData !== null;\r\n const showTopResizeHandles = !orthographic;\r\n const showMoveAndRotateHandles = !addedCuboidId;\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n const cm = getElementById(id);\r\n if (cm) {\r\n state.selectedElementAngle = cm.rotation[2];\r\n state.selectedElementHeight = cm.lz;\r\n }\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n gl.domElement.style.cursor = 'move';\r\n } else if (handle === RotateHandleType.Upper || handle === RotateHandleType.Lower) {\r\n gl.domElement.style.cursor = 'grab';\r\n } else {\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'pointer';\r\n }\r\n }\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'default';\r\n }, []);\r\n\r\n const getWorldRotation = (id: string): number => {\r\n const el = getElementById(id);\r\n if (!el) return 0;\r\n\r\n const rotation = el.rotation[2];\r\n if (el.parentId === GROUND_ID) return rotation;\r\n\r\n return rotation + getWorldRotation(el.parentId);\r\n };\r\n\r\n const setCuboidHeight = (id: string, newLz: number) => {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id);\r\n if (!cuboid) return;\r\n cuboid.lz = newLz;\r\n cuboid.cz = newLz / 2;\r\n state.selectedElementHeight = newLz;\r\n });\r\n };\r\n\r\n const isHumanOrPlant = (type: string) => {\r\n switch (type) {\r\n case ObjectType.Human:\r\n case ObjectType.Flower:\r\n case ObjectType.Tree:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const isAbsPosChildType = (type: string) => {\r\n return isHumanOrPlant(type) || type === ObjectType.Cuboid;\r\n };\r\n\r\n const resizeXY = (pointer: Vector3) => {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id);\r\n if (!cuboid) return;\r\n\r\n const p = pointer.clone().setZ(0);\r\n const anchor = useStore.getState().resizeAnchor.clone().setZ(0);\r\n\r\n const v = new Vector3().subVectors(p, anchor).applyEuler(new Euler(0, 0, -(cuboidWorldRotation.current ?? 0)));\r\n const worldCenter = new Vector3().addVectors(p, anchor).multiplyScalar(0.5);\r\n const { pos, rot } = Util.getWorldDataById(cuboid.parentId);\r\n const center = new Vector3().subVectors(worldCenter, pos).applyEuler(new Euler(0, 0, -rot));\r\n cuboid.cx = center.x;\r\n cuboid.cy = center.y;\r\n const newLx = Math.abs(v.x);\r\n const newLy = Math.abs(v.y);\r\n cuboid.lx = newLx;\r\n cuboid.ly = newLy;\r\n\r\n const currWorldPosition = new Vector3(center.x, center.y, cuboid.cz).applyEuler(new Euler(0, 0, rot)).add(pos);\r\n const currWorldRotation = cuboid.rotation[2] + rot;\r\n if (childPositionMap.current.size > 0) {\r\n for (const e of state.elements) {\r\n const childWorldPosition = childPositionMap.current.get(e.id);\r\n if (childWorldPosition) {\r\n const relPos = childWorldPosition\r\n .clone()\r\n .sub(currWorldPosition)\r\n .applyEuler(new Euler(0, 0, -currWorldRotation));\r\n if (isHumanOrPlant(e.type)) {\r\n const c = childSideMap.current.get(e.id);\r\n if (c) {\r\n const [face, sign] = c;\r\n if (face === CuboidFace.Top) {\r\n e.cx = relPos.x;\r\n e.cy = relPos.y;\r\n } else if (face === CuboidFace.NS) {\r\n e.cx = relPos.x;\r\n e.cy = Math.sign(sign) * (newLy / 2);\r\n } else if (face === CuboidFace.EW) {\r\n e.cx = Math.sign(sign) * (newLx / 2);\r\n e.cy = relPos.y;\r\n }\r\n }\r\n } else if (e.type === ObjectType.Cuboid) {\r\n e.cx = relPos.x;\r\n e.cy = relPos.y;\r\n } else {\r\n e.cx = relPos.x / newLx;\r\n e.cy = relPos.y / newLy;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const resizeLx = (pointer: Vector3) => {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id);\r\n if (!cuboid) return;\r\n\r\n const p = pointer.clone().setZ(0);\r\n const anchor = useStore.getState().resizeAnchor.clone().setZ(0);\r\n\r\n const v = new Vector3().subVectors(p, anchor).applyEuler(new Euler(0, 0, -(cuboidWorldRotation.current ?? 0)));\r\n const worldCenter = new Vector3().addVectors(p, anchor).multiplyScalar(0.5);\r\n const { pos, rot } = Util.getWorldDataById(cuboid.parentId);\r\n const center = new Vector3().subVectors(worldCenter, pos).applyEuler(new Euler(0, 0, -rot));\r\n cuboid.cx = center.x;\r\n const newLx = Math.abs(v.x);\r\n cuboid.lx = newLx;\r\n\r\n const currWorldPosition = new Vector3(center.x, center.y, cuboid.cz).applyEuler(new Euler(0, 0, rot)).add(pos);\r\n const currWorldRotation = cuboid.rotation[2] + rot;\r\n if (childPositionMap.current.size > 0) {\r\n for (const e of state.elements) {\r\n const childWorldPosition = childPositionMap.current.get(e.id);\r\n if (childWorldPosition) {\r\n const relPos = childWorldPosition\r\n .clone()\r\n .sub(currWorldPosition)\r\n .applyEuler(new Euler(0, 0, -currWorldRotation));\r\n if (isHumanOrPlant(e.type)) {\r\n const c = childSideMap.current.get(e.id);\r\n if (c) {\r\n const [face, sign] = c;\r\n if (face === CuboidFace.Top) {\r\n e.cx = relPos.x;\r\n } else if (face === CuboidFace.NS) {\r\n e.cx = relPos.x;\r\n } else if (face === CuboidFace.EW) {\r\n e.cx = Math.sign(sign) * (newLx / 2);\r\n }\r\n }\r\n } else if (e.type === ObjectType.Cuboid) {\r\n e.cx = relPos.x;\r\n } else {\r\n e.cx = relPos.x / newLx;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const resizeLy = (pointer: Vector3) => {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id);\r\n if (!cuboid) return;\r\n\r\n const p = pointer.clone().setZ(0);\r\n const anchor = useStore.getState().resizeAnchor.clone().setZ(0);\r\n\r\n const v = new Vector3().subVectors(p, anchor).applyEuler(new Euler(0, 0, -(cuboidWorldRotation.current ?? 0)));\r\n const worldCenter = new Vector3().addVectors(p, anchor).multiplyScalar(0.5);\r\n const { pos, rot } = Util.getWorldDataById(cuboid.parentId);\r\n const center = new Vector3().subVectors(worldCenter, pos).applyEuler(new Euler(0, 0, -rot));\r\n cuboid.cy = center.y;\r\n const newLy = Math.abs(v.y);\r\n cuboid.ly = newLy;\r\n\r\n const currWorldPosition = new Vector3(center.x, center.y, cuboid.cz).applyEuler(new Euler(0, 0, rot)).add(pos);\r\n const currWorldRotation = cuboid.rotation[2] + rot;\r\n if (childPositionMap.current.size > 0) {\r\n for (const e of state.elements) {\r\n const childWorldPosition = childPositionMap.current.get(e.id);\r\n if (childWorldPosition) {\r\n const relPos = childWorldPosition\r\n .clone()\r\n .sub(currWorldPosition)\r\n .applyEuler(new Euler(0, 0, -currWorldRotation));\r\n if (isHumanOrPlant(e.type)) {\r\n const c = childSideMap.current.get(e.id);\r\n if (c) {\r\n const [face, sign] = c;\r\n if (face === CuboidFace.Top) {\r\n e.cy = relPos.y;\r\n } else if (face === CuboidFace.NS) {\r\n e.cy = Math.sign(sign) * (newLy / 2);\r\n } else if (face === CuboidFace.EW) {\r\n e.cy = relPos.y;\r\n }\r\n }\r\n } else if (e.type === ObjectType.Cuboid) {\r\n e.cy = relPos.y;\r\n } else {\r\n e.cy = relPos.y / newLy;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const resizeLz = (pointer: Vector3) => {\r\n if (cuboidWorldBottomHeight.current !== null) {\r\n const newLz = Math.max(1, pointer.z - cuboidWorldBottomHeight.current);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.lz = newLz;\r\n e.cz = newLz / 2;\r\n state.selectedElementHeight = newLz;\r\n }\r\n if (e.parentId === id && isHumanOrPlant(e.type)) {\r\n const c = childSideMap.current.get(e.id);\r\n if (c && c[0] === CuboidFace.Top) {\r\n e.cz = newLz / 2;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const handleRotate = (pointer: Vector3) => {\r\n if (cuboidWorldPosition.current) {\r\n const [cx, cy] = cuboidWorldPosition.current;\r\n let rotation =\r\n Math.atan2(cx - pointer.x, pointer.y - cy) +\r\n (useStore.getState().rotateHandleType === RotateHandleType.Upper ? 0 : Math.PI);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0;\r\n if (parentWorldRotation.current) {\r\n rotation -= parentWorldRotation.current;\r\n }\r\n useStore.getState().updateElementRotationById(id, 0, 0, rotation + offset);\r\n }\r\n };\r\n\r\n // pointer down events\r\n const handleBottomResizeHandlePointerDown = (e: ThreeEvent) => {\r\n if (\r\n (e.intersections.length > 0 && e.intersections[0].object.name === e.object.name) ||\r\n useStore.getState().addedCuboidId\r\n ) {\r\n const cuboid = getElementById(id);\r\n if (cuboid && cuboid.parentId !== GROUND_ID) {\r\n setIntersectionPlaneData({ position: new Vector3(0, 0, -hz), rotation: new Euler() });\r\n const { pos: parentWorldPos, rot: parentWorldRot } = Util.getWorldDataById(cuboid.parentId);\r\n parentWorldPosition.current = parentWorldPos;\r\n parentWorldRotation.current = parentWorldRot;\r\n cuboidWorldRotation.current = parentWorldRot + cuboid.rotation[2];\r\n const cuboidWorldPosition = new Vector3(cuboid.cx, cuboid.cy, cuboid.cz)\r\n .applyEuler(new Euler(0, 0, parentWorldRot))\r\n .add(parentWorldPos);\r\n\r\n const children = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => e.parentId === cuboid.id && (isAbsPosChildType(e.type) || Util.isIdentical(e.normal, [0, 0, 1])),\r\n );\r\n childPositionMap.current.clear();\r\n childSideMap.current.clear();\r\n for (const child of children) {\r\n const worldPos = new Vector3();\r\n if (isHumanOrPlant(child.type)) {\r\n worldPos.set(child.cx, child.cy, child.cz);\r\n if (Math.abs(child.cz - hz) < 0.01) {\r\n childSideMap.current.set(child.id, [CuboidFace.Top, 1]);\r\n } else if (Math.abs(Math.abs(child.cx) - hx) < 0.01) {\r\n childSideMap.current.set(child.id, [CuboidFace.EW, Math.sign(child.cx)]);\r\n } else {\r\n childSideMap.current.set(child.id, [CuboidFace.NS, Math.sign(child.cy)]);\r\n }\r\n } else if (child.type === ObjectType.Cuboid) {\r\n worldPos.set(child.cx, child.cy, child.cz);\r\n } else {\r\n worldPos.set(child.cx * cuboid.lx, child.cy * cuboid.ly, 0);\r\n }\r\n worldPos.applyEuler(new Euler(0, 0, cuboidWorldRotation.current)).add(cuboidWorldPosition);\r\n childPositionMap.current.set(child.id, worldPos);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n });\r\n }\r\n };\r\n\r\n const handleTopResizeHandlePointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].object.name === e.object.name) {\r\n const handleObject = e.intersections[0].object;\r\n const cameraDirection = useStore.getState().cameraDirection;\r\n const rotation = Math.atan2(cameraDirection.x, cameraDirection.y) + getWorldRotation(id);\r\n setIntersectionPlaneData({ position: handleObject.position.clone(), rotation: new Euler(-HALF_PI, rotation, 0) });\r\n const topHandleWorldPosition = handleObject.localToWorld(new Vector3());\r\n cuboidWorldBottomHeight.current = topHandleWorldPosition.z - hz * 2;\r\n const children = useStore.getState().elements.filter((e) => e.parentId === id && isHumanOrPlant(e.type));\r\n\r\n childSideMap.current.clear();\r\n for (const child of children) {\r\n const worldPos = new Vector3();\r\n worldPos.set(child.cx, child.cy, child.cz);\r\n if (Math.abs(child.cz - hz) < 0.01) {\r\n childSideMap.current.set(child.id, [CuboidFace.Top, 1]);\r\n }\r\n }\r\n\r\n setCommonStore((state) => {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n });\r\n }\r\n };\r\n\r\n const handleRotateHandlePointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].object.name === e.object.name) {\r\n setIntersectionPlaneData({ position: new Vector3(0, 0, -hz), rotation: new Euler(0, 0, 0) });\r\n const handleGroup = e.eventObject;\r\n cuboidWorldPosition.current = handleGroup.localToWorld(new Vector3()).toArray();\r\n const cuboid = getElementById(id);\r\n if (cuboid) {\r\n parentWorldRotation.current = getWorldRotation(cuboid.parentId);\r\n }\r\n }\r\n };\r\n\r\n const handleMoveHandlePointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const handleType = e.intersections[0].eventObject.name;\r\n switch (handleType) {\r\n case MoveHandleType.Lower:\r\n case MoveHandleType.Upper:\r\n case MoveHandleType.Left:\r\n case MoveHandleType.Right:\r\n case MoveHandleType.Top: {\r\n useStore.getState().set((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id) ?? null;\r\n if (!cuboid) return;\r\n\r\n state.selectedElement = cuboid;\r\n if (cuboid.parentId === GROUND_ID) {\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(cuboid.id);\r\n }\r\n state.moveHandleType = handleType;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n // pointer move event\r\n const handleIntersectionPlaneMove = (e: ThreeEvent) => {\r\n // set ray cast, need change wall together\r\n if (intersectionPlaneRef.current) {\r\n const intersections = raycaster.intersectObject(intersectionPlaneRef.current);\r\n if (intersections.length) {\r\n const pointer = intersections[0].point;\r\n // resize\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n if (resizeHandleType) {\r\n if (Util.isTopResizeHandle(resizeHandleType)) {\r\n resizeLz(pointer);\r\n } else if (Util.isXResizeHandle(resizeHandleType)) {\r\n resizeLx(pointer);\r\n } else if (Util.isYResizeHandle(resizeHandleType)) {\r\n resizeLy(pointer);\r\n } else {\r\n resizeXY(pointer);\r\n }\r\n }\r\n // rotate\r\n else if (useStore.getState().rotateHandleType) {\r\n handleRotate(pointer);\r\n }\r\n }\r\n }\r\n };\r\n\r\n // pointer up\r\n const handleIntersectionPlanePointerUp = () => {\r\n setIntersectionPlaneData(null);\r\n cuboidWorldBottomHeight.current = null;\r\n cuboidWorldPosition.current = null;\r\n cuboidWorldRotation.current = null;\r\n parentWorldRotation.current = null;\r\n parentWorldPosition.current = null;\r\n };\r\n\r\n return (\r\n <>\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n \r\n )}\r\n\r\n {/* bottom resize handles */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* top resize handles */}\r\n {showTopResizeHandles && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* move and rotate handles */}\r\n {showMoveAndRotateHandles && (\r\n <>\r\n {/* move handles */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* rotate handles */}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Handles);\r\n","export default __webpack_public_path__ + \"static/media/building_facade_02.a8bad934.png\";","export default __webpack_public_path__ + \"static/media/building_facade_03.60816e85.png\";","export default __webpack_public_path__ + \"static/media/building_facade_04.1253be24.png\";","export default __webpack_public_path__ + \"static/media/building_facade_05.6f979c80.png\";","export default __webpack_public_path__ + \"static/media/building_facade_06.b02d8ad2.png\";","export default __webpack_public_path__ + \"static/media/building_facade_07.10224e5f.png\";","export default __webpack_public_path__ + \"static/media/building_facade_08.9d33b002.png\";","export default __webpack_public_path__ + \"static/media/building_facade_09.65f795a5.png\";","export default __webpack_public_path__ + \"static/media/building_facade_10.6520a3bf.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Sphere } from '@react-three/drei';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useRef } from 'react';\r\nimport { HIGHLIGHT_HANDLE_COLOR, MOVE_HANDLE_COLOR_1, MOVE_HANDLE_COLOR_2, MOVE_HANDLE_COLOR_3 } from 'src/constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { MoveHandleType, ResizeHandleType, RotateHandleType } from 'src/types';\r\nimport { Mesh } from 'three';\r\nimport * as Selector from '../stores/selector';\r\n\r\ninterface MoveHandleProps {\r\n position: number[];\r\n size: number;\r\n handleType: MoveHandleType;\r\n onPointerDown?: (e: ThreeEvent) => void;\r\n onPointerOver: (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => void;\r\n onPointerOut: () => void;\r\n}\r\n\r\nconst MoveHandle = ({ handleType, position, size, onPointerDown, onPointerOver, onPointerOut }: MoveHandleProps) => {\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const handleRef = useRef();\r\n\r\n const [cx, cy, cz] = position;\r\n\r\n let handleColor = MOVE_HANDLE_COLOR_1;\r\n if (cx === 0 && cy === 0) {\r\n handleColor = MOVE_HANDLE_COLOR_3;\r\n } else if (cx === 0) {\r\n handleColor = MOVE_HANDLE_COLOR_2;\r\n } else if (cy === 0) {\r\n handleColor = MOVE_HANDLE_COLOR_1;\r\n }\r\n\r\n const color = hoveredHandle === handleType || moveHandleType === handleType ? HIGHLIGHT_HANDLE_COLOR : handleColor;\r\n\r\n return (\r\n {\r\n onPointerOver(e, handleType);\r\n }}\r\n onPointerOut={onPointerOut}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default MoveHandle;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Box } from '@react-three/drei';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useRef } from 'react';\r\nimport { HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR } from 'src/constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { MoveHandleType, ResizeHandleType, RotateHandleType } from 'src/types';\r\nimport { Mesh, Vector3 } from 'three';\r\nimport * as Selector from '../stores/selector';\r\n\r\ninterface ResizeHandleProps {\r\n position: number[];\r\n handleType: ResizeHandleType;\r\n size: number;\r\n onPointerOver: (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => void;\r\n onPointerOut: () => void;\r\n}\r\n\r\nconst ResizeHandle = ({ handleType, position, size, onPointerOver, onPointerOut }: ResizeHandleProps) => {\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const handleRef = useRef();\r\n\r\n const [cx, cy, cz] = position;\r\n const color =\r\n hoveredHandle === handleType || resizeHandleType === handleType ? HIGHLIGHT_HANDLE_COLOR : RESIZE_HANDLE_COLOR;\r\n\r\n const handlePointerDown = () => {\r\n if (handleRef.current) {\r\n const anchor = handleRef.current.localToWorld(new Vector3(-cx * 2, -cy * 2, 0));\r\n useStore.getState().set((state) => {\r\n state.resizeAnchor.copy(anchor);\r\n state.resizeHandleType = handleType;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }\r\n };\r\n\r\n return (\r\n {\r\n onPointerOver(e, handleType);\r\n }}\r\n onPointerOut={onPointerOut}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ResizeHandle;\r\n","import { Box, Cone, Cylinder, Line, Plane, Ring, Sphere } from '@react-three/drei';\r\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { getSunDirection } from 'src/analysis/sunTools';\r\nimport RotateHandle from 'src/components/rotateHandle';\r\nimport {\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n SOLAR_PANEL_BLACK_SPECULAR,\r\n SOLAR_PANEL_BLUE_SPECULAR,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from 'src/constants';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { PvModel } from 'src/models/PvModel';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport {\r\n ActionType,\r\n BoxArgs,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n TrackerType,\r\n} from 'src/types';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { Util } from 'src/Util';\r\nimport { Euler, Vector3, Mesh, DoubleSide, Color, FrontSide } from 'three';\r\nimport * as Selector from '../../stores/selector';\r\nimport { LineData } from '../LineData';\r\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface SolarPanelBoxGroupProps {\r\n solarPanelModel: SolarPanelModel;\r\n groupRotation: Euler;\r\n panelRotation: Euler;\r\n}\r\n\r\ninterface SunbeamProps {\r\n sunDirection: Vector3;\r\n}\r\n\r\nconst HANDLE_GROUP_NAME = 'Handle Group Move & Resize';\r\n\r\nconst SolarPanelOnCuboid = (solarPanelModel: SolarPanelModel) => {\r\n const {\r\n id,\r\n parentId,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n normal,\r\n locked,\r\n trackerType,\r\n tiltAngle,\r\n relativeAzimuth,\r\n poleHeight,\r\n poleRadius,\r\n poleSpacing,\r\n color = 'white',\r\n } = solarPanelModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const isTop = isSolarPanelOnTopFace(normal);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = isTop ? poleHeight : 0;\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const rotateHandleSize = (baseSize * 2) / 3;\r\n const tiltHandleSize = (baseSize * 2) / 3;\r\n const poleZ = -poleHeight / 2 - lz / 2;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n\r\n const {\r\n gl: { domElement },\r\n camera,\r\n raycaster,\r\n mouse,\r\n } = useThree();\r\n\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [showTiltAngle, setShowTiltAngle] = useState(false);\r\n\r\n const pointerDown = useRef(false);\r\n const oldTiltAngleRef = useRef(0);\r\n const newTiltAngleRef = useRef(0);\r\n const parentWorldPositionRef = useRef(null);\r\n const parentWorldRotationRef = useRef(null);\r\n\r\n const tiltHandleRef = useRef();\r\n\r\n const degree = useMemo(() => new Array(13).fill(0), []);\r\n const dateObject = useMemo(() => new Date(date), [date]);\r\n\r\n const poles = useMemo(() => {\r\n const poleArray: Vector3[] = [];\r\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\r\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\r\n const sinTilt = 0.5 * Math.sin(tiltAngle);\r\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\r\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\r\n for (let ix = -poleNx; ix <= poleNx; ix++) {\r\n for (let iy = -poleNy; iy <= poleNy; iy++) {\r\n const xi = ix * cosAz - iy * sinAz;\r\n const yi = ix * sinAz + iy * cosAz;\r\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\r\n }\r\n }\r\n return poleArray;\r\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleZ]);\r\n\r\n const groupRotation = useMemo(() => getRotationFromNormal(normal), [normal]);\r\n\r\n const panelRotation = useMemo(() => {\r\n if (isTop) {\r\n if (trackerType === TrackerType.NO_TRACKER) {\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }\r\n const sunDirection = getSunDirection(dateObject, latitude);\r\n const rot = getWorldRotationZ(parentId, groupRotation.z) - groupRotation.z;\r\n switch (trackerType) {\r\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\r\n const r = Math.hypot(sunDirection.x, sunDirection.y);\r\n return new Euler(\r\n Math.atan2(r, sunDirection.z),\r\n 0,\r\n Math.atan2(sunDirection.y, sunDirection.x) + HALF_PI - rot,\r\n 'ZXY',\r\n );\r\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\r\n return new Euler(0, Math.atan2(sunDirection.x, sunDirection.z), -rot + (lx < ly ? 0 : HALF_PI), 'XYZ');\r\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\r\n return new Euler(tiltAngle, 0, Math.atan2(sunDirection.y, sunDirection.x) + HALF_PI - rot, 'ZXY');\r\n }\r\n }\r\n return new Euler();\r\n }, [isTop, tiltAngle, relativeAzimuth, trackerType, dateObject, latitude]);\r\n\r\n const showRotateHandle = selected && !locked && trackerType === TrackerType.NO_TRACKER && isTop;\r\n const showTiltHandle =\r\n selected && !locked && trackerType === TrackerType.NO_TRACKER && isTop && Math.abs(actualPoleHeight) > 0.1;\r\n const showPoles = actualPoleHeight > 0 && isTop;\r\n\r\n // handle pointer up\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n setShowTiltAngle(false);\r\n setCommonStore((state) => {\r\n state.rotateHandleType = null;\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n });\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const getRotateHandleColor = (rotateHandleType: RotateHandleType) => {\r\n return hoveredHandle === rotateHandleType || useStore.getState().rotateHandleType === rotateHandleType\r\n ? HIGHLIGHT_HANDLE_COLOR\r\n : RESIZE_HANDLE_COLOR;\r\n };\r\n\r\n return (\r\n \r\n \r\n\r\n {/* draw rotate handles */}\r\n {showRotateHandle && (\r\n \r\n {/* rotate handles */}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw tilt handles */}\r\n {showTiltHandle && (\r\n <>\r\n {/* ring handles */}\r\n {\r\n hoverHandle(e, RotateHandleType.Tilt);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n setShowTiltAngle(true);\r\n if (hoveredHandle) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n pointerDown.current = true;\r\n // const sp = getElementById(id) as SolarPanelModel;\r\n oldTiltAngleRef.current = tiltAngle;\r\n const { rot } = Util.getWorldDataById(parentId);\r\n parentWorldRotationRef.current = rot;\r\n }\r\n setCommonStore((state) => {\r\n state.rotateHandleType = RotateHandleType.Tilt;\r\n });\r\n }}\r\n >\r\n \r\n \r\n {showTiltAngle && (\r\n <>\r\n {/* intersection plane */}\r\n {\r\n if (Math.abs(newTiltAngleRef.current - oldTiltAngleRef.current) > ZERO_TOLERANCE) {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltAngleRef.current,\r\n newValue: newTiltAngleRef.current,\r\n changedElementId: id,\r\n changedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n updateSolarPanelTiltAngleById(\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n updateSolarPanelTiltAngleById(\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n }\r\n }}\r\n onPointerMove={(e) => {\r\n if (pointerDown.current) {\r\n raycaster.setFromCamera(mouse, camera);\r\n if (tiltHandleRef.current) {\r\n const intersects = raycaster.intersectObjects([tiltHandleRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point;\r\n const parent = tiltHandleRef.current.parent;\r\n if (parent) {\r\n const ov = parent.localToWorld(new Vector3()); // rotate point in world coordinate\r\n const cv = new Vector3().subVectors(p, ov);\r\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\r\n const touch = 0.5 * ly * Math.abs(Math.sin(angle)) > actualPoleHeight;\r\n if (!touch) {\r\n const wr = relativeAzimuth + (parentWorldRotationRef.current ?? 0);\r\n const sign =\r\n wr % Math.PI === 0\r\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\r\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\r\n angle *= sign;\r\n updateSolarPanelTiltAngleById(id, angle);\r\n newTiltAngleRef.current = angle;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n >\r\n \r\n \r\n {/* pointer */}\r\n \r\n {/* scale */}\r\n {degree.map((e, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {/* show current degree */}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* draw poles */}\r\n {showPoles &&\r\n poles.map((p, i) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nconst SolarPanelBoxGroup = ({ solarPanelModel, groupRotation, panelRotation }: SolarPanelBoxGroupProps) => {\r\n let {\r\n id,\r\n parentId,\r\n lx,\r\n ly,\r\n lz,\r\n cx,\r\n cy,\r\n cz,\r\n normal,\r\n tiltAngle,\r\n relativeAzimuth,\r\n trackerType,\r\n drawSunBeam,\r\n locked,\r\n showLabel,\r\n label,\r\n pvModelName,\r\n orientation,\r\n frameColor,\r\n backsheetColor,\r\n color,\r\n poleHeight,\r\n } = solarPanelModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const selectMe = useStore(Selector.selectMe);\r\n\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const language = useStore(Selector.language);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const pvModules = useStore(Selector.pvModules);\r\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const isTop = isSolarPanelOnTopFace(normal);\r\n const actualTiltAngle = isTop ? tiltAngle : 0;\r\n const actualRelativeAzimuth = isTop ? relativeAzimuth : 0;\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const [hx, hy, hz] = [lx, ly, lz].map((v) => v / 2);\r\n const resizeHandleArgs = [resizeHandleSize, resizeHandleSize, lz * 1.2] as BoxArgs;\r\n const pvModel = pvModules[pvModelName] as PvModel;\r\n\r\n if (pvModel) {\r\n lz = Math.max(pvModel.thickness, 0.02);\r\n }\r\n\r\n const dateObject = useMemo(() => new Date(date), [date]);\r\n const labelText = useMemo(() => {\r\n return (\r\n (label ? label : i18n.t('shared.SolarPanelElement', lang)) +\r\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [label, locked, language, cx, cy, cz]);\r\n\r\n const solarPanelLines = useMemo(() => {\r\n const lines: LineData[] = [];\r\n if (pvModel) {\r\n let mx, my;\r\n if (orientation === Orientation.portrait) {\r\n mx = Math.max(1, Math.round(lx / pvModel.width));\r\n my = Math.max(1, Math.round(ly / pvModel.length));\r\n } else {\r\n mx = Math.max(1, Math.round(lx / pvModel.length));\r\n my = Math.max(1, Math.round(ly / pvModel.width));\r\n }\r\n const dx = lx / mx;\r\n const dy = ly / my;\r\n for (let i = 0; i <= mx; i++) {\r\n lines.push({\r\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\r\n } as LineData);\r\n }\r\n for (let i = 0; i <= my; i++) {\r\n lines.push({\r\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\r\n } as LineData);\r\n }\r\n }\r\n return lines;\r\n }, [pvModel, orientation, pvModelName, lx, ly, lz]);\r\n\r\n const [relativeSunDirection, setRelativeSunDirection] = useState(getRelativeSunDirection());\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n\r\n const baseRef = useRef(null);\r\n\r\n const { gl } = useThree();\r\n const texture = useSolarPanelTexture(lx, ly, pvModel, orientation, frameColor, backsheetColor);\r\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\r\n\r\n useFrame(() => {\r\n const newRelativeSunDirection = getRelativeSunDirection();\r\n if (!newRelativeSunDirection.equals(relativeSunDirection)) {\r\n setRelativeSunDirection(newRelativeSunDirection);\r\n }\r\n });\r\n\r\n function getRelativeSunDirection(): Vector3 {\r\n const euler = new Euler();\r\n const worldRotationZ = getWorldRotationZ(parentId, groupRotation.z);\r\n if (trackerType === TrackerType.NO_TRACKER) {\r\n euler.set(-groupRotation.x - actualTiltAngle, 0, -worldRotationZ - actualRelativeAzimuth);\r\n } else {\r\n euler.set(-groupRotation.x - panelRotation.x, -panelRotation.y, -worldRotationZ - panelRotation.z);\r\n }\r\n return getSunDirection(dateObject, latitude).applyEuler(euler);\r\n }\r\n\r\n function getResizeHandleColor(handleType: ResizeHandleType) {\r\n return hoveredHandle === handleType || resizeHandleType === handleType\r\n ? HIGHLIGHT_HANDLE_COLOR\r\n : RESIZE_HANDLE_COLOR;\r\n }\r\n\r\n function hoverHandle(e: ThreeEvent) {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.eventObject.name.includes(HANDLE_GROUP_NAME);\r\n if (intersected) {\r\n const handle = e.object.name as MoveHandleType | ResizeHandleType | RotateHandleType | null;\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n gl.domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n gl.domElement.style.cursor = 'grab';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n }\r\n\r\n function noHoverHandle() {\r\n setHoveredHandle(null);\r\n gl.domElement.style.cursor = 'default';\r\n }\r\n\r\n function onClickResizeHandle(handleType: ResizeHandleType, anchor: Vector3) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = handleType;\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n\r\n function clickHandle(e: ThreeEvent) {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === HANDLE_GROUP_NAME) {\r\n const handleType = e.object.name;\r\n switch (handleType) {\r\n case MoveHandleType.Default: {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = handleType;\r\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.Left: {\r\n const anchor = e.object.localToWorld(new Vector3(lx, 0, 0));\r\n onClickResizeHandle(handleType, anchor);\r\n break;\r\n }\r\n case ResizeHandleType.Right: {\r\n const anchor = e.object.localToWorld(new Vector3(-lx, 0, 0));\r\n onClickResizeHandle(handleType, anchor);\r\n break;\r\n }\r\n case ResizeHandleType.Lower: {\r\n const anchor = e.object.localToWorld(new Vector3(0, ly, 0));\r\n onClickResizeHandle(handleType, anchor);\r\n break;\r\n }\r\n case ResizeHandleType.Upper: {\r\n const anchor = e.object.localToWorld(new Vector3(0, -ly, 0));\r\n onClickResizeHandle(handleType, anchor);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function renderTopTextureMaterial() {\r\n if (showSolarRadiationHeatmap && heatmapTexture) {\r\n return ;\r\n }\r\n if (!texture) return ;\r\n if (orthographic || solarPanelShininess === 0) {\r\n return ;\r\n }\r\n return (\r\n \r\n );\r\n }\r\n\r\n function renderBotTextureMaterial() {\r\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.SolarPanel;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n gl.domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n gl.domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {renderTopTextureMaterial()}\r\n {renderBotTextureMaterial()}\r\n \r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* sun beam */}\r\n {drawSunBeam && relativeSunDirection.z > 0 && }\r\n\r\n {showSolarRadiationHeatmap &&\r\n heatmapTexture &&\r\n solarPanelLines.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/* simulation panel */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n \r\n\r\n {/*draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst Sunbeam = React.memo(({ sunDirection }: SunbeamProps) => {\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n\r\n const sunBeamLength = useMemo(() => Math.max(100, 10 * sceneRadius), [sceneRadius]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nexport function getRotationFromNormal(normal: number[]) {\r\n const [x, y, z] = normal;\r\n if (z === 1) {\r\n return new Euler(0, 0, 0);\r\n }\r\n if (x !== 0) {\r\n return new Euler(HALF_PI, 0, x * HALF_PI, 'ZXY');\r\n }\r\n if (y !== 0) {\r\n return new Euler(-y * HALF_PI, 0, 0);\r\n }\r\n return new Euler();\r\n}\r\n\r\nexport function isSolarPanelOnTopFace(normal: number[]) {\r\n return Math.abs(normal[2] - 1) < 0.01;\r\n}\r\n\r\nfunction getWorldRotationZ(parentId: string, selfRotation: number) {\r\n const { rot } = Util.getWorldDataById(parentId);\r\n return rot + selfRotation;\r\n}\r\n\r\nexport default React.memo(SolarPanelOnCuboid);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport Facade_Texture_00 from '../../resources/tiny_white_square.png';\r\nimport Facade_Texture_01 from '../../resources/building_facade_01.png';\r\nimport Facade_Texture_02 from '../../resources/building_facade_02.png';\r\nimport Facade_Texture_03 from '../../resources/building_facade_03.png';\r\nimport Facade_Texture_04 from '../../resources/building_facade_04.png';\r\nimport Facade_Texture_05 from '../../resources/building_facade_05.png';\r\nimport Facade_Texture_06 from '../../resources/building_facade_06.png';\r\nimport Facade_Texture_07 from '../../resources/building_facade_07.png';\r\nimport Facade_Texture_08 from '../../resources/building_facade_08.png';\r\nimport Facade_Texture_09 from '../../resources/building_facade_09.png';\r\nimport Facade_Texture_10 from '../../resources/building_facade_10.png';\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Plane } from '@react-three/drei';\r\nimport { CanvasTexture, Euler, FrontSide, Group, Mesh, RepeatWrapping, TextureLoader, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from '../../stores/commonRef';\r\nimport * as Selector from '../../stores/selector';\r\nimport { CuboidModel } from '../../models/CuboidModel';\r\nimport { invalidate, ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n ActionType,\r\n CuboidTexture,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n} from '../../types';\r\nimport {\r\n HALF_PI,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n ORIGIN_VECTOR2,\r\n TWO_PI,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport { Util } from '../../Util';\r\nimport { ElementModel } from '../../models/ElementModel';\r\nimport { PolarGrid } from '../polarGrid';\r\nimport Wireframe from '../../components/wireframe';\r\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\r\nimport { UndoableAdd } from '../../undo/UndoableAdd';\r\nimport { UndoableMove } from '../../undo/UndoableMove';\r\nimport { UndoableResize } from '../../undo/UndoableResize';\r\nimport { UndoableChange } from '../../undo/UndoableChange';\r\nimport i18n from '../../i18n/i18n';\r\nimport { Point2 } from '../../models/Point2';\r\nimport { PolygonModel } from '../../models/PolygonModel';\r\nimport { ElementGrid } from '../elementGrid';\r\nimport { HorizontalRuler } from '../horizontalRuler';\r\nimport { showError } from '../../helpers';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Handles from './handles';\r\nimport { ElementModelFactory } from 'src/models/ElementModelFactory';\r\nimport { getSolarPanelUnitLength } from '../wall/wall';\r\nimport { isSolarPanelOnTopFace } from '../solarPanel/solarPanelOnCuboid';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst Cuboid = (cuboidModel: CuboidModel) => {\r\n const {\r\n id,\r\n cx,\r\n cy,\r\n lx = 1,\r\n ly = 1,\r\n lz = 1,\r\n color = 'silver',\r\n lineColor = 'black',\r\n lineWidth = 0.1,\r\n locked = false,\r\n showLabel = false,\r\n textureTypes = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ],\r\n stackable,\r\n } = cuboidModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const addElement = useStore(Selector.addElement);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLyById = useStore(Selector.updateElementLyById);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const setElementSize = useStore(Selector.setElementSize);\r\n const setElementNormal = useStore(Selector.setElementNormal);\r\n const selectMe = useStore(Selector.selectMe);\r\n const updateSolarPanelRelativeAzimuthById = useStore(Selector.updateSolarCollectorRelativeAzimuthById);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const isAddingElement = useStore(Selector.isAddingElement);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const updatePolygonVertexPositionById = useStore(Selector.updatePolygonVertexPositionById);\r\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n\r\n const {\r\n camera,\r\n gl: { domElement },\r\n raycaster,\r\n mouse,\r\n } = useThree();\r\n const [heatmapTextureTop, setHeatmapTextureTop] = useState(null);\r\n const [heatmapTextureSouth, setHeatmapTextureSouth] = useState(null);\r\n const [heatmapTextureNorth, setHeatmapTextureNorth] = useState(null);\r\n const [heatmapTextureWest, setHeatmapTextureWest] = useState(null);\r\n const [heatmapTextureEast, setHeatmapTextureEast] = useState(null);\r\n const [hovered, setHovered] = useState(false);\r\n const [showGrid, setShowGrid] = useState(false);\r\n const [normal, setNormal] = useState();\r\n\r\n const groupRef = useRef(null);\r\n const baseRef = useRef();\r\n const grabRef = useRef(null);\r\n const faceNormalRef = useRef(UNIT_VECTOR_POS_Z);\r\n const gridPositionRef = useRef(new Vector3(0, 0, 0));\r\n const gridRotationRef = useRef(new Euler(0, 0, 0));\r\n const gridDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const oldPositionRef = useRef(new Vector3());\r\n const newPositionRef = useRef(new Vector3());\r\n const oldNormalRef = useRef(new Vector3());\r\n const newNormalRef = useRef(new Vector3());\r\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const newDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const oldAzimuthRef = useRef(0);\r\n const newAzimuthRef = useRef(0);\r\n const oldVerticesRef = useRef([]);\r\n const newVerticesRef = useRef([]);\r\n const intersectPlaneRef = useRef();\r\n const worldPositionRef = useRef(new Vector3());\r\n const worldRotationRef = useRef(0);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n\r\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\r\n if (grabRef.current && grabRef.current.type === ObjectType.SolarPanel) {\r\n const isTop = isSolarPanelOnTopFace(grabRef.current.normal);\r\n const actualPoleHeight = isTop ? (grabRef.current as SolarPanelModel).poleHeight : 0;\r\n intersectionPlanePosition.set(0, 0, cuboidModel.lz / 2 + actualPoleHeight);\r\n }\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (cuboidModel?.label ? cuboidModel.label : i18n.t('shared.CuboidElement', lang)) +\r\n (cuboidModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (cuboidModel?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n (lz / 2).toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [cuboidModel?.label, locked, language, cx, cy, lz]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n grabRef.current = null;\r\n setShowGrid(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (useStore.getState().tempHumanPlant.length > 0) {\r\n setCommonStore((state) => {\r\n state.elements.push(...state.tempHumanPlant);\r\n state.tempHumanPlant = [];\r\n });\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (cuboidModel && showSolarRadiationHeatmap) {\r\n const maxValue = solarRadiationHeatmapMaxValue ?? 5;\r\n const heatmapTop = getHeatmap(cuboidModel.id + '-top');\r\n if (heatmapTop) {\r\n setHeatmapTextureTop(Util.fetchHeatmapTexture(heatmapTop, maxValue));\r\n }\r\n const heatmapSouth = getHeatmap(cuboidModel.id + '-south');\r\n if (heatmapSouth) {\r\n setHeatmapTextureSouth(Util.fetchHeatmapTexture(heatmapSouth, maxValue));\r\n }\r\n const heatmapNorth = getHeatmap(cuboidModel.id + '-north');\r\n if (heatmapNorth) {\r\n setHeatmapTextureNorth(Util.fetchHeatmapTexture(heatmapNorth, maxValue));\r\n }\r\n const heatmapWest = getHeatmap(cuboidModel.id + '-west');\r\n if (heatmapWest) {\r\n setHeatmapTextureWest(Util.fetchHeatmapTexture(heatmapWest, maxValue));\r\n }\r\n const heatmapEast = getHeatmap(cuboidModel.id + '-east');\r\n if (heatmapEast) {\r\n setHeatmapTextureEast(Util.fetchHeatmapTexture(heatmapEast, maxValue, true));\r\n }\r\n // note: unfortunately, setting the rotation of the canvas textures seems to\r\n // have no effect. so we must do it in a different way.\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const fetchTextureImage = (textureType: CuboidTexture) => {\r\n switch (textureType) {\r\n case CuboidTexture.Facade01:\r\n return Facade_Texture_01;\r\n case CuboidTexture.Facade02:\r\n return Facade_Texture_02;\r\n case CuboidTexture.Facade03:\r\n return Facade_Texture_03;\r\n case CuboidTexture.Facade04:\r\n return Facade_Texture_04;\r\n case CuboidTexture.Facade05:\r\n return Facade_Texture_05;\r\n case CuboidTexture.Facade06:\r\n return Facade_Texture_06;\r\n case CuboidTexture.Facade07:\r\n return Facade_Texture_07;\r\n case CuboidTexture.Facade08:\r\n return Facade_Texture_08;\r\n case CuboidTexture.Facade09:\r\n return Facade_Texture_09;\r\n case CuboidTexture.Facade10:\r\n return Facade_Texture_10;\r\n default:\r\n return Facade_Texture_00;\r\n }\r\n };\r\n\r\n const fetchRepeatDividers = (textureType: CuboidTexture) => {\r\n switch (textureType) {\r\n case CuboidTexture.Facade01:\r\n return { x: 14, y: 6.5 };\r\n case CuboidTexture.Facade02:\r\n return { x: 14, y: 6.5 };\r\n case CuboidTexture.Facade03:\r\n return { x: 10, y: 12 };\r\n case CuboidTexture.Facade04:\r\n return { x: 20, y: 11 };\r\n case CuboidTexture.Facade05:\r\n return { x: 15, y: 10 };\r\n case CuboidTexture.Facade06:\r\n return { x: 11, y: 3.5 };\r\n case CuboidTexture.Facade07:\r\n return { x: 11, y: 10 };\r\n case CuboidTexture.Facade08:\r\n return { x: 16, y: 9 };\r\n case CuboidTexture.Facade09:\r\n return { x: 10, y: 9 };\r\n case CuboidTexture.Facade10:\r\n return { x: 12, y: 9 };\r\n default:\r\n return { x: 1, y: 1 }; // maybe for rooftop\r\n }\r\n };\r\n\r\n const textureLoaderEast = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[0]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[0]);\r\n t.repeat.set(ly / param.x, lz / param.y);\r\n t.rotation = HALF_PI;\r\n t.center.x = 1;\r\n t.center.y = 0;\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureEast(t);\r\n });\r\n }, [textureTypes[0], ly, lz]);\r\n const [textureEast, setTextureEast] = useState(textureLoaderEast);\r\n\r\n const textureLoaderWest = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[1]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[1]);\r\n t.repeat.set(ly / param.x, lz / param.y);\r\n t.rotation = -HALF_PI;\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureWest(t);\r\n });\r\n }, [textureTypes[1], ly, lz]);\r\n const [textureWest, setTextureWest] = useState(textureLoaderWest);\r\n\r\n const textureLoaderNorth = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[2]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[2]);\r\n t.repeat.set(lx / param.x, lz / param.y);\r\n t.rotation = Math.PI;\r\n t.center.x = 0;\r\n t.center.y = 1;\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureNorth(t);\r\n });\r\n }, [textureTypes[2], lx, lz]);\r\n const [textureNorth, setTextureNorth] = useState(textureLoaderNorth);\r\n\r\n const textureLoaderSouth = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[3]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[3]);\r\n t.repeat.set(lx / param.x, lz / param.y);\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureSouth(t);\r\n });\r\n }, [textureTypes[3], lx, lz]);\r\n const [textureSouth, setTextureSouth] = useState(textureLoaderSouth);\r\n\r\n const textureLoaderTop = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[4]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[4]);\r\n t.repeat.set(lx / param.x, ly / param.y);\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureTop(t);\r\n });\r\n }, [textureTypes[4], lx, ly]);\r\n const [textureTop, setTextureTop] = useState(textureLoaderTop);\r\n\r\n useEffect(() => {\r\n invalidate();\r\n }, [...textureTypes]);\r\n\r\n const legalOnCuboid = (type: ObjectType) => {\r\n switch (type) {\r\n case ObjectType.Polygon:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const legalAddToCuboid = (type: ObjectType) => {\r\n switch (type) {\r\n case ObjectType.Polygon:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const setupGridParams = (face: Vector3) => {\r\n faceNormalRef.current = face;\r\n const aboveDistance = 0.01;\r\n if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_Z)) {\r\n gridPositionRef.current = new Vector3(0, 0, hz + aboveDistance);\r\n gridRotationRef.current = new Euler(0, 0, 0);\r\n gridDimensionRef.current.set(hx, hy, hz);\r\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_X)) {\r\n // east face in view coordinate system\r\n gridPositionRef.current = new Vector3(hx + aboveDistance, 0, 0);\r\n gridRotationRef.current = new Euler(0, HALF_PI, 0);\r\n gridDimensionRef.current.set(hz, hy, hx);\r\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_NEG_X)) {\r\n // west face in view coordinate system\r\n gridPositionRef.current = new Vector3(-hx - aboveDistance, 0, 0);\r\n gridRotationRef.current = new Euler(0, -HALF_PI, 0);\r\n gridDimensionRef.current.set(hz, hy, hx);\r\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_NEG_Y)) {\r\n // south face in the view coordinate system\r\n gridPositionRef.current = new Vector3(0, -hy - aboveDistance, 0);\r\n gridRotationRef.current = new Euler(HALF_PI, 0, 0);\r\n gridDimensionRef.current.set(hx, hz, hy);\r\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_Y)) {\r\n // north face in the view coordinate system\r\n gridPositionRef.current = new Vector3(0, hy + aboveDistance, 0);\r\n gridRotationRef.current = new Euler(-HALF_PI, 0, 0);\r\n gridDimensionRef.current.set(hx, hz, hy);\r\n }\r\n };\r\n\r\n const ratio = Math.max(1, Math.max(lx, ly) / 8);\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * ratio;\r\n\r\n const onTopSurface = Util.isIdentical(grabRef.current?.normal, UNIT_VECTOR_POS_Z_ARRAY);\r\n\r\n const handleAddElement = (e: ThreeEvent) => {\r\n const intersection = e.intersections[0];\r\n const objectToAdd = useStore.getState().objectTypeToAdd;\r\n if (objectToAdd === ObjectType.SolarPanel) {\r\n const pointer = intersection.point;\r\n const { pos, rot } = Util.getWorldDataById(id);\r\n const diff = new Vector3().subVectors(pointer, pos).applyEuler(new Euler(0, 0, -rot));\r\n const addedElement = ElementModelFactory.makeSolarPanel(\r\n cuboidModel,\r\n useStore.getState().getPvModule(useStore.getState().actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\r\n diff.x / lx,\r\n diff.y / ly,\r\n diff.z / lz,\r\n useStore.getState().actionState.solarPanelOrientation ?? Orientation.landscape,\r\n useStore.getState().actionState.solarPanelPoleHeight ?? 1,\r\n useStore.getState().actionState.solarPanelPoleSpacing ?? 3,\r\n useStore.getState().actionState.solarPanelTiltAngle ?? 0,\r\n useStore.getState().actionState.solarPanelRelativeAzimuth ?? 0,\r\n intersection.face?.normal,\r\n [0, 0, 0],\r\n useStore.getState().actionState.solarPanelFrameColor ?? 'white',\r\n );\r\n setCommonStore((state) => {\r\n state.elements.push(addedElement);\r\n });\r\n return addedElement;\r\n } else {\r\n return addElement(cuboidModel, intersection.point, intersection.face?.normal);\r\n }\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (!isAddingElement()) {\r\n selectMe(id, e, ActionType.Select);\r\n }\r\n const selectedElement = getSelectedElement();\r\n let bypass = false;\r\n if (\r\n e.intersections[0].object.name === ObjectType.Polygon &&\r\n useStore.getState().objectTypeToAdd !== ObjectType.None\r\n ) {\r\n bypass = true;\r\n }\r\n if (selectedElement?.id === id || bypass) {\r\n // no child of this cuboid is clicked\r\n if (legalAddToCuboid(useStore.getState().objectTypeToAdd) && cuboidModel) {\r\n setShowGrid(true);\r\n const addedElement = handleAddElement(e);\r\n if (addedElement) {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: addedElement,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n } else {\r\n useRefStore.getState().selectNone();\r\n useRefStore.setState((state) => {\r\n state.cuboidRef = groupRef;\r\n });\r\n }\r\n } else {\r\n // a child of this cuboid is clicked\r\n if (selectedElement && selectedElement.parentId === id) {\r\n if (legalOnCuboid(selectedElement.type)) {\r\n setShowGrid(true);\r\n const { rot, pos } = Util.getWorldDataById(id);\r\n worldPositionRef.current.copy(pos);\r\n worldRotationRef.current = rot;\r\n grabRef.current = selectedElement;\r\n let face;\r\n for (const x of e.intersections) {\r\n if (x.object === baseRef.current) {\r\n face = x.face;\r\n break;\r\n }\r\n }\r\n if (face) {\r\n setupGridParams(face.normal);\r\n if (!normal || !normal.equals(face.normal)) {\r\n setNormal(face.normal);\r\n }\r\n }\r\n useRefStore.getState().setEnableOrbitController(false);\r\n oldPositionRef.current.x = selectedElement.cx;\r\n oldPositionRef.current.y = selectedElement.cy;\r\n oldPositionRef.current.z = selectedElement.cz;\r\n oldNormalRef.current.fromArray(selectedElement.normal);\r\n oldDimensionRef.current.x = selectedElement.lx;\r\n oldDimensionRef.current.y = selectedElement.ly;\r\n oldDimensionRef.current.z = selectedElement.lz;\r\n switch (selectedElement.type) {\r\n case ObjectType.SolarPanel:\r\n oldAzimuthRef.current = (selectedElement as SolarPanelModel).relativeAzimuth;\r\n break;\r\n case ObjectType.Polygon:\r\n oldVerticesRef.current = (selectedElement as PolygonModel).vertices.map((v) => ({ ...v }));\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handlePointerMove = (e: ThreeEvent) => {\r\n if (grabRef.current && cuboidModel) {\r\n if (grabRef.current.type === ObjectType.SolarPanel && onTopSurface) return;\r\n if (grabRef.current.parentId === id && grabRef.current.type && !grabRef.current.locked) {\r\n const mouse = new Vector2(\r\n (e.offsetX / domElement.clientWidth) * 2 - 1,\r\n 1 - (e.offsetY / domElement.clientHeight) * 2,\r\n );\r\n raycaster.setFromCamera(mouse, camera);\r\n if (baseRef.current) {\r\n const intersects = raycaster.intersectObjects([baseRef.current]);\r\n if (intersects.length > 0) {\r\n let p = intersects[0].point;\r\n const face = intersects[0].face;\r\n if (useStore.getState().moveHandleType) {\r\n if (face) {\r\n const n = face.normal;\r\n if (normal && !normal.equals(n)) {\r\n setNormal(n);\r\n }\r\n setupGridParams(n);\r\n setElementNormal(grabRef.current.id, n.x, n.y, n.z);\r\n }\r\n p = Util.relativeCoordinates(p.x, p.y, p.z, cuboidModel);\r\n if (grabRef.current.type === ObjectType.Polygon) {\r\n const polygon = grabRef.current as PolygonModel;\r\n if (useStore.getState().moveHandleType === MoveHandleType.Default) {\r\n const centroid = Util.calculatePolygonCentroid(oldVerticesRef.current);\r\n const n = new Vector3().fromArray(polygon.normal);\r\n let dx: number, dy: number;\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n // east face\r\n dx = -(centroid.x + p.z);\r\n dy = p.y - centroid.y;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n // west face\r\n dx = p.z - centroid.x;\r\n dy = p.y - centroid.y;\r\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n // north face\r\n dx = p.x - centroid.x;\r\n dy = -(centroid.y + p.z);\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n // south face\r\n dx = p.x - centroid.x;\r\n dy = p.z - centroid.y;\r\n } else {\r\n // top face\r\n dx = p.x - centroid.x;\r\n dy = p.y - centroid.y;\r\n }\r\n const copy = oldVerticesRef.current.map((v) => ({ ...v }));\r\n copy.forEach((v: Point2) => {\r\n v.x += dx;\r\n v.y += dy;\r\n });\r\n // update all the vertices at once with the DEEP COPY above\r\n // do not update each vertex's position one by one (it is slower)\r\n updatePolygonVerticesById(polygon.id, copy);\r\n }\r\n } else {\r\n setElementPosition(grabRef.current.id, p.x, p.y, p.z);\r\n }\r\n } else if (useStore.getState().resizeHandleType) {\r\n switch (grabRef.current.type) {\r\n case ObjectType.SolarPanel:\r\n const solarPanel = grabRef.current as SolarPanelModel;\r\n const [unitX, unitY] = getSolarPanelUnitLength(solarPanel);\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n\r\n // z direction\r\n if (resizeHandleType === ResizeHandleType.Lower || resizeHandleType === ResizeHandleType.Upper) {\r\n const ny = Math.max(1, Math.round(Math.abs(p.z - resizeAnchor.z) / unitY));\r\n const length = ny * unitY;\r\n const v = new Vector3(0, 0, p.z - resizeAnchor.z).normalize().multiplyScalar(length);\r\n const worldCenter = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\r\n setCommonStore((state) => {\r\n const sp = state.elements.find((e) => e.id === solarPanel.id);\r\n if (!sp) return;\r\n sp.cz = (worldCenter.z - worldPositionRef.current.z) / lz;\r\n sp.ly = Math.abs(v.z);\r\n });\r\n }\r\n // XY direction\r\n else if (resizeHandleType === ResizeHandleType.Left || resizeHandleType === ResizeHandleType.Right) {\r\n const diff = new Vector3().subVectors(p, resizeAnchor).setZ(0);\r\n const nx = Math.max(1, Math.round(diff.length() / unitX));\r\n const length = nx * unitX;\r\n const v = diff.clone().normalize().multiplyScalar(length);\r\n const worldCenter = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\r\n const relativeCenter = new Vector3()\r\n .subVectors(worldCenter, worldPositionRef.current)\r\n .applyEuler(new Euler(0, 0, -worldRotationRef.current));\r\n setCommonStore((state) => {\r\n const sp = state.elements.find((e) => e.id === solarPanel.id);\r\n if (!sp) return;\r\n if (Math.abs(Math.abs(sp.normal[1]) - 1) < 0.01) {\r\n sp.cx = relativeCenter.x / lx;\r\n } else {\r\n sp.cy = relativeCenter.y / ly;\r\n }\r\n sp.lx = v.length();\r\n });\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n if (useStore.getState().resizeHandleType === ResizeHandleType.Default) {\r\n // first, reverse the rotation of p.x and p.y around the center of the cuboid\r\n let q = new Vector3(\r\n p.x - worldPositionRef.current.x,\r\n p.y - worldPositionRef.current.y,\r\n 0,\r\n ).applyEuler(new Euler(0, 0, -worldRotationRef.current, 'ZXY'));\r\n // then do the vertex on each face in the de-rotated coordinate system\r\n const polygon = grabRef.current as PolygonModel;\r\n const n = new Vector3().fromArray(polygon.normal);\r\n let lx, ly;\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n // east face\r\n lx = cuboidModel.lz;\r\n ly = cuboidModel.ly;\r\n q.x = -p.z + worldPositionRef.current.z;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n // west face\r\n lx = cuboidModel.lz;\r\n ly = cuboidModel.ly;\r\n q.x = p.z - worldPositionRef.current.z;\r\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n // north face\r\n lx = cuboidModel.lx;\r\n ly = cuboidModel.lz;\r\n q.y = -p.z + worldPositionRef.current.z;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n // south face\r\n lx = cuboidModel.lx;\r\n ly = cuboidModel.lz;\r\n q.y = p.z - worldPositionRef.current.z;\r\n } else {\r\n // top face\r\n lx = cuboidModel.lx;\r\n ly = cuboidModel.ly;\r\n }\r\n q = useStore.getState().enableFineGrid ? Util.snapToFineGrid(q) : Util.snapToNormalGrid(q);\r\n q.x /= lx;\r\n q.y /= ly;\r\n updatePolygonVertexPositionById(polygon.id, polygon.selectedIndex, q.x, q.y);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleSolarPanelPointerMoveOnTopSurface = (e: ThreeEvent) => {\r\n if (intersectPlaneRef.current && grabRef.current && cuboidModel) {\r\n if (grabRef.current.type !== ObjectType.SolarPanel || !onTopSurface) return;\r\n const solarPanel = grabRef.current as SolarPanelModel;\r\n if (solarPanel.parentId !== id || solarPanel.locked) return;\r\n raycaster.setFromCamera(mouse, camera);\r\n const intersects = raycaster.intersectObjects([intersectPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n let p = intersects[0].point.clone();\r\n if (useStore.getState().moveHandleType) {\r\n p = Util.relativeCoordinates(p.x, p.y, p.z - solarPanel.poleHeight, cuboidModel);\r\n setElementPosition(solarPanel.id, p.x, p.y, p.z);\r\n } else if (\r\n useStore.getState().rotateHandleType &&\r\n useStore.getState().rotateHandleType !== RotateHandleType.Tilt\r\n ) {\r\n const pr = worldRotationRef.current; //parent rotation\r\n const pc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y); //world parent center\r\n const cc = new Vector2(cuboidModel.lx * solarPanel.cx, cuboidModel.ly * solarPanel.cy) //local current center\r\n .rotateAround(ORIGIN_VECTOR2, pr); //add parent rotation\r\n const wc = new Vector2().addVectors(cc, pc); //world current center\r\n const rotation =\r\n -pr +\r\n Math.atan2(-p.x + wc.x, p.y - wc.y) +\r\n (useStore.getState().rotateHandleType === RotateHandleType.Lower ? 0 : Math.PI);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0; // make sure angle is between -PI to PI\r\n const newAzimuth = rotation + offset;\r\n updateSolarPanelRelativeAzimuthById(solarPanel.id, newAzimuth);\r\n newAzimuthRef.current = newAzimuth;\r\n } else if (useStore.getState().resizeHandleType) {\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n const pvModel = getPvModule(solarPanel.pvModelName);\r\n const wp = new Vector2(p.x, p.y);\r\n const resizeAnchor2D = new Vector2(resizeAnchor.x, resizeAnchor.y);\r\n const distance = wp.distanceTo(resizeAnchor2D);\r\n const angle = solarPanel.relativeAzimuth + worldRotationRef.current; // world panel azimuth\r\n const rp = new Vector2().subVectors(wp, resizeAnchor2D); // relative vector from anchor to pointer\r\n switch (useStore.getState().resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n {\r\n const sign = useStore.getState().resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\r\n const theta = rp.angle() - angle + sign * HALF_PI;\r\n let dyl = distance * Math.cos(theta);\r\n if (solarPanel.orientation === Orientation.portrait) {\r\n const nx = Math.max(1, Math.ceil((dyl - pvModel.length / 2) / pvModel.length));\r\n dyl = nx * pvModel.length;\r\n } else {\r\n const nx = Math.max(1, Math.ceil((dyl - pvModel.width / 2) / pvModel.width));\r\n dyl = nx * pvModel.width;\r\n }\r\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\r\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy); // world panel center\r\n const wbc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y); // world foundation center\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -worldRotationRef.current);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarPanelNewSizeOk(solarPanel, newCx, newCy, solarPanel.lx, dyl)) {\r\n updateElementLyById(solarPanel.id, dyl);\r\n setElementPosition(solarPanel.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n {\r\n let sign = useStore.getState().resizeHandleType === ResizeHandleType.Left ? -1 : 1;\r\n const theta =\r\n rp.angle() - angle + (useStore.getState().resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\r\n let dxl = distance * Math.cos(theta);\r\n if (solarPanel.orientation === Orientation.portrait) {\r\n const nx = Math.max(1, Math.ceil((dxl - pvModel.width / 2) / pvModel.width));\r\n dxl = nx * pvModel.width;\r\n } else {\r\n const nx = Math.max(1, Math.ceil((dxl - pvModel.length / 2) / pvModel.length));\r\n dxl = nx * pvModel.length;\r\n }\r\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\r\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy);\r\n const wbc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y);\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -worldRotationRef.current);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarPanelNewSizeOk(solarPanel, newCx, newCy, dxl, solarPanel.ly)) {\r\n updateElementLxById(solarPanel.id, dxl);\r\n setElementPosition(solarPanel.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const isSolarPanelNewPositionOk = (sp: SolarPanelModel, cx: number, cy: number) => {\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // only check solar panels on top face\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\r\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const isSolarPanelNewAzimuthOk = (sp: SolarPanelModel, az: number) => {\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.relativeAzimuth = az;\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.RotationCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\r\n showError(i18n.t('message.RotationOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const isSolarPanelNewSizeOk = (sp: SolarPanelModel, cx: number, cy: number, lx: number, ly: number) => {\r\n // check if the new length will cause the solar panel to intersect with the foundation\r\n if (sp.tiltAngle !== 0 && 0.5 * ly * Math.abs(Math.sin(sp.tiltAngle)) > sp.poleHeight) {\r\n return false;\r\n }\r\n // check if the new size will be within the foundation\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n clone.lx = lx;\r\n clone.ly = ly;\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\r\n // showError(i18n.t('message.ResizingOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const handlePointerUp = () => {\r\n if (!grabRef.current) return;\r\n const elem = getElementById(grabRef.current.id);\r\n if (!elem || elem.parentId !== id) return;\r\n if (elem.type === ObjectType.Polygon) {\r\n if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType) {\r\n newVerticesRef.current = (elem as PolygonModel).vertices.map((v) => ({ ...v }));\r\n const undoableEditPolygon = {\r\n name: useStore.getState().moveHandleType ? 'Move Polygon' : 'Resize Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldVerticesRef.current,\r\n newValue: newVerticesRef.current,\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n undo: () => {\r\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.oldValue as Point2[]);\r\n },\r\n redo: () => {\r\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.newValue as Point2[]);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableEditPolygon);\r\n }\r\n } else {\r\n if (useStore.getState().resizeHandleType) {\r\n newPositionRef.current.x = elem.cx;\r\n newPositionRef.current.y = elem.cy;\r\n newPositionRef.current.z = elem.cz;\r\n newDimensionRef.current.x = elem.lx;\r\n newDimensionRef.current.y = elem.ly;\r\n newDimensionRef.current.z = elem.lz;\r\n if (\r\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE &&\r\n newDimensionRef.current.distanceToSquared(oldDimensionRef.current) > ZERO_TOLERANCE\r\n ) {\r\n const undoableResize = {\r\n name: 'Resize',\r\n timestamp: Date.now(),\r\n resizedElementId: grabRef.current.id,\r\n resizedElementType: grabRef.current.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n oldLx: oldDimensionRef.current.x,\r\n oldLy: oldDimensionRef.current.y,\r\n oldLz: oldDimensionRef.current.z,\r\n newLx: newDimensionRef.current.x,\r\n newLy: newDimensionRef.current.y,\r\n newLz: newDimensionRef.current.z,\r\n undo: () => {\r\n setElementPosition(\r\n undoableResize.resizedElementId,\r\n undoableResize.oldCx,\r\n undoableResize.oldCy,\r\n undoableResize.oldCz,\r\n );\r\n setElementSize(\r\n undoableResize.resizedElementId,\r\n undoableResize.oldLx,\r\n undoableResize.oldLy,\r\n undoableResize.oldLz,\r\n );\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableResize.resizedElementId,\r\n undoableResize.newCx,\r\n undoableResize.newCy,\r\n undoableResize.newCz,\r\n );\r\n setElementSize(\r\n undoableResize.resizedElementId,\r\n undoableResize.newLx,\r\n undoableResize.newLy,\r\n undoableResize.newLz,\r\n );\r\n },\r\n } as UndoableResize;\r\n addUndoable(undoableResize);\r\n }\r\n } else if (useStore.getState().rotateHandleType) {\r\n // currently, solar panels are the only type of child that can be rotated\r\n if (grabRef.current.type === ObjectType.SolarPanel) {\r\n const solarPanel = grabRef.current as SolarPanelModel;\r\n if (Math.abs(newAzimuthRef.current - oldAzimuthRef.current) > ZERO_TOLERANCE) {\r\n if (isSolarPanelNewAzimuthOk(solarPanel, newAzimuthRef.current)) {\r\n setCommonStore((state) => {\r\n state.selectedElementAngle = newAzimuthRef.current;\r\n });\r\n const undoableRotate = {\r\n name: 'Rotate',\r\n timestamp: Date.now(),\r\n oldValue: oldAzimuthRef.current,\r\n newValue: newAzimuthRef.current,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n updateSolarPanelRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableRotate);\r\n } else {\r\n updateSolarPanelRelativeAzimuthById(solarPanel.id, oldAzimuthRef.current);\r\n }\r\n }\r\n }\r\n } else {\r\n // for moving sensors, lights, and solar panels\r\n newPositionRef.current.x = elem.cx;\r\n newPositionRef.current.y = elem.cy;\r\n newPositionRef.current.z = elem.cz;\r\n newNormalRef.current.fromArray(elem.normal);\r\n if (newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE) {\r\n let accept = true;\r\n if (elem.type === ObjectType.SolarPanel) {\r\n accept = isSolarPanelNewPositionOk(elem as SolarPanelModel, elem.cx, elem.cy);\r\n }\r\n if (accept) {\r\n const undoableMove = {\r\n name: 'Move',\r\n timestamp: Date.now(),\r\n movedElementId: grabRef.current.id,\r\n movedElementType: grabRef.current?.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n oldNormal: oldNormalRef.current.clone(),\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n newNormal: newNormalRef.current.clone(),\r\n undo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.oldCx,\r\n undoableMove.oldCy,\r\n undoableMove.oldCz,\r\n );\r\n if (undoableMove.oldNormal) {\r\n setElementNormal(\r\n undoableMove.movedElementId,\r\n undoableMove.oldNormal.x,\r\n undoableMove.oldNormal.y,\r\n undoableMove.oldNormal.z,\r\n );\r\n }\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.newCx,\r\n undoableMove.newCy,\r\n undoableMove.newCz,\r\n );\r\n if (undoableMove.newNormal) {\r\n setElementNormal(\r\n undoableMove.movedElementId,\r\n undoableMove.newNormal.x,\r\n undoableMove.newNormal.y,\r\n undoableMove.newNormal.z,\r\n );\r\n }\r\n },\r\n } as UndoableMove;\r\n addUndoable(undoableMove);\r\n } else {\r\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n }\r\n }\r\n }\r\n }\r\n grabRef.current = null;\r\n };\r\n\r\n const handlePointerOver = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n };\r\n\r\n const handlePointerEnter = (e: ThreeEvent) => {\r\n // TODO: make tree, flower, and human legal\r\n if (grabRef.current && Util.isPlantOrHuman(grabRef.current)) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setShowGrid(true);\r\n }\r\n }\r\n };\r\n\r\n const handlePointerOut = () => {\r\n setHovered(false);\r\n if (grabRef.current) {\r\n switch (grabRef.current.type) {\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n setShowGrid(false);\r\n break;\r\n case ObjectType.SolarPanel:\r\n // Have to get the latest from the store (we may change this to ref in the future)\r\n const sp = useStore.getState().getElementById(grabRef.current.id) as SolarPanelModel;\r\n if (useStore.getState().moveHandleType && !isSolarPanelNewPositionOk(sp, sp.cx, sp.cy)) {\r\n setElementPosition(sp.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n state.pastePoint.copy(e.intersections[0].point);\r\n const face = e.intersections[0].face;\r\n if (face) {\r\n state.pasteNormal = face.normal.clone();\r\n if (Util.isSame(face.normal, UNIT_VECTOR_POS_X)) {\r\n state.selectedSideIndex = 0;\r\n } else if (Util.isSame(face.normal, UNIT_VECTOR_NEG_X)) {\r\n state.selectedSideIndex = 1;\r\n } else if (Util.isSame(face.normal, UNIT_VECTOR_POS_Y)) {\r\n state.selectedSideIndex = 2;\r\n } else if (Util.isSame(face.normal, UNIT_VECTOR_NEG_Y)) {\r\n state.selectedSideIndex = 3;\r\n } else if (Util.isSame(face.normal, UNIT_VECTOR_POS_Z)) {\r\n state.selectedSideIndex = 4;\r\n }\r\n }\r\n state.clickObjectType = ObjectType.Cuboid;\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Cuboid;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const opacity = groundImage ? (orthographic ? 0.25 : 0.75) : 1;\r\n\r\n const faces: number[] = [0, 1, 2, 3, 4, 5];\r\n const textures = [\r\n showSolarRadiationHeatmap && heatmapTextureEast ? heatmapTextureEast : textureEast,\r\n showSolarRadiationHeatmap && heatmapTextureWest ? heatmapTextureWest : textureWest,\r\n showSolarRadiationHeatmap && heatmapTextureNorth ? heatmapTextureNorth : textureNorth,\r\n showSolarRadiationHeatmap && heatmapTextureSouth ? heatmapTextureSouth : textureSouth,\r\n showSolarRadiationHeatmap && heatmapTextureTop ? heatmapTextureTop : textureTop,\r\n null,\r\n ];\r\n const materials =\r\n cuboidModel && cuboidModel.faceColors ? (\r\n faces.map((i) => {\r\n if (textureTypes && textureTypes[i] !== CuboidTexture.NoTexture) {\r\n return showSolarRadiationHeatmap ? (\r\n \r\n ) : (\r\n \r\n );\r\n } else {\r\n return showSolarRadiationHeatmap ? (\r\n \r\n ) : (\r\n \r\n );\r\n }\r\n })\r\n ) : (\r\n \r\n );\r\n\r\n const handleArgs = useMemo(() => [hx, hy, hz], [hx, hy, hz]);\r\n\r\n const showHandles = selected && !locked;\r\n\r\n return (\r\n \r\n {/* draw rectangular cuboid */}\r\n \r\n {materials}\r\n \r\n\r\n {/* intersection plane that goes through the center of the selected solar panel */}\r\n {grabRef.current?.type === ObjectType.SolarPanel && onTopSurface && !grabRef.current.locked && (\r\n \r\n )}\r\n\r\n {showGrid && (\r\n <>\r\n {(useStore.getState().moveHandleType || useStore.getState().resizeHandleType) && (\r\n \r\n )}\r\n {useStore.getState().rotateHandleType &&\r\n grabRef.current &&\r\n grabRef.current.type === ObjectType.SolarPanel && (\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* ruler */}\r\n {selected && }\r\n\r\n {/* wireFrame */}\r\n {(!selected || groundImage) && (\r\n \r\n )}\r\n\r\n {/* highlight with a thick wireframe when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* handles */}\r\n {showHandles && }\r\n\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Cuboid);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport { Box, Cylinder, Sphere } from '@react-three/drei';\r\nimport { Euler, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { SensorModel } from '../models/SensorModel';\r\nimport { useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType } from '../types';\r\nimport { Util } from '../Util';\r\nimport Wireframe from '../components/wireframe';\r\nimport i18n from '../i18n/i18n';\r\nimport { WallModel } from '../models/WallModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { getRotationFromNormal } from './solarPanel/solarPanelOnCuboid';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Sensor = (sensorModel: SensorModel) => {\r\n let {\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx = 1,\r\n ly = 1,\r\n lz = 0.1,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.1,\r\n locked = false,\r\n showLabel = false,\r\n parentId,\r\n foundationId,\r\n light = true,\r\n heatFlux = false,\r\n } = sensorModel;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const selectMe = useStore(Selector.selectMe);\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const baseRef = useRef();\r\n const handleRef = useRef();\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n const foundation = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === foundationId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = parent.cz + parent.lz / 2;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (foundation?.type === ObjectType.Foundation) {\r\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\r\n cx = absoluteCoordinates.x;\r\n cy = absoluteCoordinates.y;\r\n cz = absoluteCoordinates.z;\r\n }\r\n break;\r\n case ObjectType.Roof:\r\n if (foundation?.type === ObjectType.Foundation) {\r\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\r\n cx = absoluteCoordinates.x;\r\n cy = absoluteCoordinates.y;\r\n cz = absoluteCoordinates.z;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n const hz = lz / 2;\r\n\r\n const euler = useMemo(() => {\r\n if (parent?.type === ObjectType.Wall) {\r\n const wall = parent as WallModel;\r\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\r\n return new Euler(HALF_PI, 0, wallAbsAngle, 'ZXY');\r\n }\r\n if (parent?.type === ObjectType.Roof) {\r\n return new Euler(\r\n rotation[0],\r\n rotation[1],\r\n foundation ? foundation.rotation[2] + rotation[2] : rotation[2],\r\n 'ZXY',\r\n );\r\n }\r\n if (parent?.type === ObjectType.Cuboid) {\r\n return getRotationFromNormal(normal);\r\n }\r\n // the normal below seems to be relative to its parent\r\n const n = new Vector3().fromArray(normal);\r\n // east face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n return new Euler(0, HALF_PI, rotation[2], 'ZXY');\r\n }\r\n // west face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n return new Euler(0, -HALF_PI, rotation[2], 'ZXY');\r\n }\r\n // south face in the model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n return new Euler(-HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // north face in the model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // top face in model coordinate system\r\n return new Euler(0, 0, rotation[2]);\r\n }, [normal, rotation, foundation?.rotation]);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (sensorModel?.label ? sensorModel.label : i18n.t('shared.SensorElement', lang)) +\r\n (sensorModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang)\r\n );\r\n }, [sensorModel?.label, locked, language, cx, cy, cz]);\r\n\r\n return (\r\n \r\n {/* draw rectangle (too small to cast shadow) */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Default;\r\n });\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Sensor;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={() => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* wireFrame */}\r\n {!selected && }\r\n\r\n {/* highlight with a thick wireframe when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* draw handle */}\r\n {selected && !locked && (\r\n {\r\n if (e.button === 2) {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === handleRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Sensor;\r\n }\r\n }\r\n });\r\n } else {\r\n selectMe(id, e, ActionType.Move);\r\n }\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Default;\r\n });\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Sensor);\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport { Cylinder, Sphere } from '@react-three/drei';\r\nimport { Euler, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n TWO_PI,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType } from '../types';\r\nimport { Util } from '../Util';\r\nimport Wireframe from '../components/wireframe';\r\nimport i18n from '../i18n/i18n';\r\nimport { WallModel } from '../models/WallModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport { LightModel } from '../models/LightModel';\r\nimport { RoofModel } from '../models/RoofModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { getRotationFromNormal } from './solarPanel/solarPanelOnCuboid';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Light = (lightModel: LightModel) => {\r\n let {\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx = 1,\r\n ly = 1,\r\n lz = 0.1,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = '#ffff99',\r\n lineColor = 'black',\r\n lineWidth = 0.1,\r\n locked = false,\r\n showLabel = false,\r\n parentId,\r\n foundationId,\r\n decay = 2,\r\n distance = 5,\r\n intensity = 3,\r\n inside = false,\r\n } = lightModel;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sunlightDirection = useStore(Selector.sunlightDirection);\r\n const night = sunlightDirection.z <= 0;\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const baseRef = useRef();\r\n const handleRef = useRef();\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n const foundation = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === foundationId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n let parentThickness = 0.1;\r\n\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = parent.cz + parent.lz / 2;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (foundation?.type === ObjectType.Foundation) {\r\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\r\n cx = absoluteCoordinates.x;\r\n cy = absoluteCoordinates.y;\r\n cz = absoluteCoordinates.z;\r\n }\r\n parentThickness = (parent as WallModel).ly;\r\n break;\r\n case ObjectType.Roof:\r\n if (foundation?.type === ObjectType.Foundation) {\r\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\r\n cx = absoluteCoordinates.x;\r\n cy = absoluteCoordinates.y;\r\n cz = absoluteCoordinates.z;\r\n }\r\n parentThickness = (parent as RoofModel).thickness;\r\n break;\r\n }\r\n }\r\n }\r\n const hz = lz / 2;\r\n\r\n const euler = useMemo(() => {\r\n if (parent?.type === ObjectType.Wall) {\r\n const wall = parent as WallModel;\r\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\r\n return new Euler(HALF_PI, 0, wallAbsAngle, 'ZXY');\r\n }\r\n if (parent?.type === ObjectType.Roof) {\r\n return new Euler(\r\n rotation[0],\r\n rotation[1],\r\n foundation ? foundation.rotation[2] + rotation[2] : rotation[2],\r\n 'ZXY',\r\n );\r\n }\r\n if (parent?.type === ObjectType.Cuboid) {\r\n return getRotationFromNormal(normal);\r\n }\r\n // the normal below seems to be relative to its parent\r\n const n = new Vector3().fromArray(normal);\r\n // east face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n return new Euler(0, HALF_PI, rotation[2], 'ZXY');\r\n }\r\n // west face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n return new Euler(0, -HALF_PI, rotation[2], 'ZXY');\r\n }\r\n // south face in the model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n return new Euler(-HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // north face in the model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // top face in model coordinate system\r\n return new Euler(0, 0, rotation[2]);\r\n }, [normal, rotation, foundation?.rotation]);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (lightModel?.label ? lightModel.label : i18n.t('shared.LightElement', lang)) +\r\n (lightModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang)\r\n );\r\n }, [lightModel?.label, locked, language, cx, cy, cz]);\r\n\r\n return (\r\n \r\n {night && (\r\n \r\n )}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Light;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={() => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n {night ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {/* highlight with a thick wireframe when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* draw handle */}\r\n {selected && !locked && (\r\n {\r\n if (e.button === 2) {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === handleRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Light;\r\n }\r\n }\r\n });\r\n } else {\r\n selectMe(id, e, ActionType.Move);\r\n }\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Light);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { CuboidModel } from 'src/models/CuboidModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { isStackableModel } from 'src/models/Stackable';\r\nimport { useStore } from 'src/stores/common';\r\nimport Cuboid from './cuboid';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ObjectType } from 'src/types';\r\nimport SolarPanelOnCuboid from '../solarPanel/solarPanelOnCuboid';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport Sensor from '../sensor';\r\nimport { SensorModel } from 'src/models/SensorModel';\r\nimport Light from '../light';\r\nimport { LightModel } from 'src/models/LightModel';\r\nimport { GROUND_ID } from '../../constants';\r\n\r\nexport interface CuboidRendererProps {\r\n elements: ElementModel[];\r\n cuboidModel: CuboidModel;\r\n}\r\n\r\nexport const CUBOID_WRAPPER_NAME = 'Cuboid Wrapper';\r\n\r\nexport const CUBOID_STACKABLE_CHILD = 'Cuboid Stackable Child';\r\n\r\nconst CuboidRenderer = ({ elements, cuboidModel }: CuboidRendererProps) => {\r\n const { cx, cy, lz, rotation } = cuboidModel;\r\n\r\n const hz = lz / 2;\r\n\r\n const isStackableChild = (e: ElementModel) => isStackableModel(e) && e.parentId === cuboidModel.id;\r\n\r\n return (\r\n <>\r\n \r\n \r\n\r\n {elements.map((e) => {\r\n if (isStackableChild(e)) {\r\n return (\r\n \r\n \r\n \r\n );\r\n } else if (e.parentId === cuboidModel.id) {\r\n const { lx, ly, lz } = cuboidModel;\r\n switch (e.type) {\r\n case ObjectType.SolarPanel: {\r\n return (\r\n \r\n );\r\n }\r\n case ObjectType.Sensor: {\r\n return ;\r\n }\r\n case ObjectType.Light: {\r\n return ;\r\n }\r\n default:\r\n return null;\r\n }\r\n }\r\n })}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CuboidRenderer;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport {\r\n FINE_GRID_SCALE,\r\n GROUND_ID,\r\n HALF_PI,\r\n LAT_LNG_FRACTION_DIGITS,\r\n NORMAL_GRID_SCALE,\r\n ORIGIN_VECTOR2,\r\n SOLAR_HEATMAP_COLORS,\r\n TWO_PI,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n ZERO_TOLERANCE,\r\n} from './constants';\r\nimport { CanvasTexture, Color, Euler, Object3D, Quaternion, Scene, Triangle, Vector2, Vector3 } from 'three';\r\nimport { ElementModel } from './models/ElementModel';\r\nimport { SolarPanelModel } from './models/SolarPanelModel';\r\nimport {\r\n BuildingCompletionStatus,\r\n Design,\r\n ElementState,\r\n ModelSite,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RoofHandleType,\r\n RotateHandleType,\r\n TrackerType,\r\n} from './types';\r\nimport { PvModel } from './models/PvModel';\r\nimport { SensorModel } from './models/SensorModel';\r\nimport { WallFill, WallModel } from './models/WallModel';\r\nimport { PolygonModel } from './models/PolygonModel';\r\nimport { Point2 } from './models/Point2';\r\nimport { useStore } from './stores/common';\r\nimport { SolarCollector } from './models/SolarCollector';\r\nimport { Rectangle } from './models/Rectangle';\r\nimport platform from 'platform';\r\nimport { RoofModel, RoofType } from './models/RoofModel';\r\nimport { RoofUtil } from './views/roof/RoofUtil';\r\nimport { FoundationModel } from './models/FoundationModel';\r\nimport { WindowModel, WindowType } from './models/WindowModel';\r\nimport { DoorModel, DoorType } from './models/DoorModel';\r\nimport { CUBOID_STACKABLE_CHILD, CUBOID_WRAPPER_NAME } from './views/cuboid';\r\n\r\nexport class Util {\r\n // calculate the annual profit in 1,000 dollars\r\n static calculateProfit(design: Design): number {\r\n return (design.yearlyYield * design.sellingPrice - design.panelCount * design.unitCost * 365) * 0.001;\r\n }\r\n\r\n static calculateCost(design: Design): number {\r\n return design.panelCount * design.unitCost * 0.365;\r\n }\r\n\r\n static getLatLngKey(lat: number, lng: number): string {\r\n return lat.toFixed(LAT_LNG_FRACTION_DIGITS) + ', ' + lng.toFixed(LAT_LNG_FRACTION_DIGITS);\r\n }\r\n\r\n static getModelKey(model: ModelSite): string {\r\n return model.title + ', ' + model.userid;\r\n }\r\n\r\n static resizeCanvas(canvas: HTMLCanvasElement, newWidth: number, newHeight?: number): HTMLCanvasElement {\r\n const resizedCanvas = document.createElement('canvas');\r\n resizedCanvas.width = newWidth;\r\n resizedCanvas.height = newHeight ? newHeight : (newWidth * canvas.height) / canvas.width;\r\n const ctx = resizedCanvas.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(canvas, 0, 0, canvas.width, canvas.height, 0, 0, resizedCanvas.width, resizedCanvas.height);\r\n }\r\n return resizedCanvas;\r\n }\r\n\r\n static getEuler(\r\n from: Vector3,\r\n to: Vector3,\r\n order?: string,\r\n rotateX?: number,\r\n rotateY?: number,\r\n rotateZ?: number,\r\n ): Euler {\r\n const quaternion = new Quaternion();\r\n quaternion.setFromUnitVectors(from, to);\r\n const euler = new Euler();\r\n euler.setFromQuaternion(quaternion);\r\n if (order) euler.order = order;\r\n if (rotateX) euler.x += rotateX;\r\n if (rotateY) euler.y += rotateY;\r\n if (rotateZ) euler.z += rotateZ;\r\n return euler;\r\n }\r\n\r\n static zero2DArray(array: number[][]): void {\r\n for (let i = 0; i < array.length; i++) {\r\n for (let j = 0; j < array[i].length; j++) {\r\n array[i][j] = 0;\r\n }\r\n }\r\n }\r\n\r\n static getTriangleArea(a: Vector3, b: Vector3, c: Vector3): number {\r\n return new Triangle(a, b, c).getArea();\r\n }\r\n\r\n static getPolygonArea(vertices: Point2[]): number {\r\n let total = 0;\r\n for (let i = 0, l = vertices.length; i < l; i++) {\r\n const addX = vertices[i].x;\r\n const addY = vertices[i === vertices.length - 1 ? 0 : i + 1].y;\r\n const subX = vertices[i === vertices.length - 1 ? 0 : i + 1].x;\r\n const subY = vertices[i].y;\r\n total += addX * addY;\r\n total -= subX * subY;\r\n }\r\n return Math.abs(total) * 0.5;\r\n }\r\n\r\n static getBuildingArea(foundation: FoundationModel, elements: ElementModel[]): number {\r\n let area = 0;\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === foundation.id) {\r\n area += Util.calculateBuildingArea(e as RoofModel);\r\n }\r\n }\r\n return area;\r\n }\r\n\r\n static getBuildingCompletionStatus(foundation: FoundationModel, elements: ElementModel[]): BuildingCompletionStatus {\r\n // check roof first\r\n let hasRoof = false;\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof) {\r\n if (e.foundationId === foundation.id) {\r\n hasRoof = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!hasRoof) return BuildingCompletionStatus.ROOF_MISSING;\r\n // check walls now\r\n\r\n // let emptyWall = false;\r\n // for (const e of elements) {\r\n // if (e.type === ObjectType.Wall) {\r\n // if (e.foundationId === foundation.id) {\r\n // const wall = e as WallModel;\r\n // if (wall.fill === WallFill.Empty) {\r\n // emptyWall = true;\r\n // break;\r\n // }\r\n // }\r\n // }\r\n // }\r\n // if (emptyWall) return BuildingCompletionStatus.WALL_EMPTY;\r\n\r\n // check if the walls are joined\r\n const walls: WallModel[] = [];\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundation.id) {\r\n walls.push(e as WallModel);\r\n }\r\n }\r\n if (walls.length > 0) {\r\n for (const w of walls) {\r\n if (!w.leftJoints || w.leftJoints.length === 0) return BuildingCompletionStatus.WALL_DISJOINED;\r\n if (!w.rightJoints || w.rightJoints.length === 0) return BuildingCompletionStatus.WALL_DISJOINED;\r\n }\r\n }\r\n return BuildingCompletionStatus.COMPLETE;\r\n }\r\n\r\n static calculateBuildingArea(roof: RoofModel): number {\r\n const wallPoints = Util.getWallPointsOfRoof(roof);\r\n return Util.getPolygonArea(wallPoints);\r\n }\r\n\r\n static toUValueInUS(uValueInSI: number): number {\r\n return uValueInSI / 5.67826;\r\n }\r\n\r\n static toUValueInSI(uValueInUS: number): number {\r\n return uValueInUS * 5.67826;\r\n }\r\n\r\n static toRValueInUS(rValueInSI: number): number {\r\n return rValueInSI * 5.67826;\r\n }\r\n\r\n static toRValueInSI(rValueInUS: number): number {\r\n return rValueInUS / 5.67826;\r\n }\r\n\r\n static WATER_TEXTURE = Util.fetchWaterTexture(100, 100);\r\n static WHITE_TEXTURE = Util.fetchWhiteTexture(2, 2);\r\n\r\n static fetchWaterTexture(w: number, h: number): CanvasTexture {\r\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\r\n canvas.width = w;\r\n canvas.height = h;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n const grd = ctx.createRadialGradient(w / 2, h / 2, 0, w / 2, h / 2, Math.max(w, h) / 2);\r\n grd.addColorStop(0, '#45AAEA');\r\n grd.addColorStop(0.04, '#2B65EC');\r\n grd.addColorStop(0.2, '#0000FF');\r\n ctx.fillStyle = grd;\r\n ctx.fillRect(0, 0, w, h);\r\n }\r\n return new CanvasTexture(canvas);\r\n }\r\n\r\n static fetchWhiteTexture(w: number, h: number): CanvasTexture {\r\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\r\n canvas.width = w;\r\n canvas.height = h;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n ctx.fillStyle = 'white';\r\n ctx.fillRect(0, 0, w, h);\r\n }\r\n return new CanvasTexture(canvas);\r\n }\r\n\r\n static fetchIntersectables(scene: Scene): Object3D[] {\r\n const objects: Object3D[] = [];\r\n scene.traverse((o) => {\r\n if (!o.userData.unintersectable) {\r\n objects.push(o);\r\n }\r\n });\r\n return objects;\r\n }\r\n\r\n static fetchSimulationElements(obj: Object3D, arr: Object3D[]): void {\r\n if (obj.userData['simulation']) {\r\n arr.push(obj);\r\n }\r\n if (obj.children.length > 0) {\r\n for (const c of obj.children) {\r\n Util.fetchSimulationElements(c, arr);\r\n }\r\n }\r\n }\r\n\r\n static getSimulationElements(obj: Object3D, arr: Object3D[], id?: string): void {\r\n if (obj.userData['simulation'] && obj.uuid !== id) {\r\n arr.push(obj);\r\n }\r\n if (obj.children.length > 0) {\r\n for (const c of obj.children) {\r\n Util.getSimulationElements(c, arr, id);\r\n }\r\n }\r\n }\r\n\r\n static hasMovingParts(elements: ElementModel[]): boolean {\r\n for (const e of elements) {\r\n switch (e.type) {\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n return true;\r\n case ObjectType.SolarPanel:\r\n if ((e as SolarPanelModel).trackerType !== TrackerType.NO_TRACKER) return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n static onBuildingEnvelope(e: ElementModel): boolean {\r\n return (\r\n e.type === ObjectType.Foundation ||\r\n e.type === ObjectType.Window ||\r\n e.type === ObjectType.Door ||\r\n e.type === ObjectType.Wall ||\r\n e.type === ObjectType.Roof\r\n );\r\n }\r\n\r\n // Area of an arch given height and radius: https://keisan.casio.com/exec/system/14407397055469\r\n static getWindowArea(window: WindowModel, parent?: ElementModel): number {\r\n if (parent) {\r\n // if parent is set, window dimension is relative to it (e.g., when it is on a wall)\r\n if (window.windowType === WindowType.Arched && window.archHeight > 0) {\r\n const hx = 0.5 * window.lx * parent.lx;\r\n const lz = window.lz * parent.lz;\r\n const ah = Math.min(window.archHeight, lz, hx); // actual arc height\r\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\r\n const startAngle = Math.acos(Math.min(hx / r, 1));\r\n const extent = Math.PI - startAngle * 2;\r\n return 0.5 * extent * r * r - hx * (r - ah) + (lz - ah) * hx * 2;\r\n } else if (window.windowType === WindowType.Polygonal && window.polygonTop) {\r\n let a = window.lx * window.lz * parent.lx * parent.lz;\r\n a += (window.lx * parent.lx * window.polygonTop[1]) / 2;\r\n return a;\r\n }\r\n return window.lx * window.lz * parent.lx * parent.lz;\r\n } else {\r\n // if parent is not set, window dimension is absolute (e.g., when it is on a roof)\r\n if (window.windowType === WindowType.Arched && window.archHeight > 0) {\r\n const hx = 0.5 * window.lx;\r\n const lz = window.lz;\r\n const ah = Math.min(window.archHeight, lz, hx); // actual arc height\r\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\r\n const startAngle = Math.acos(Math.min(hx / r, 1));\r\n const extent = Math.PI - startAngle * 2;\r\n return 0.5 * extent * r * r - hx * (r - ah) + (lz - ah) * hx * 2;\r\n } else if (window.windowType === WindowType.Polygonal && window.polygonTop) {\r\n let a = window.lx * window.lz;\r\n a += (window.lx * window.polygonTop[1]) / 2;\r\n return a;\r\n }\r\n return window.lx * window.lz;\r\n }\r\n }\r\n\r\n // Area of an arch given height and radius: https://keisan.casio.com/exec/system/14407397055469\r\n static getDoorArea(door: DoorModel, parent?: ElementModel): number {\r\n if (parent) {\r\n // if parent is set, door dimension is relative to it\r\n if (door.doorType === DoorType.Arched && door.archHeight > 0) {\r\n const hx = 0.5 * door.lx * parent.lx;\r\n const lz = door.lz * parent.lz;\r\n const ah = Math.min(door.archHeight, lz, hx); // actual arch height\r\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\r\n const startAngle = Math.acos(Math.min(hx / r, 1));\r\n const extent = Math.PI - startAngle * 2;\r\n return 0.5 * extent * r * r - hx * (r - ah) + (lz - ah) * hx * 2;\r\n }\r\n return door.lx * door.lz * parent.lx * parent.lz;\r\n } else {\r\n // if parent is not set, door dimension is absolute\r\n if (door.doorType === DoorType.Arched && door.archHeight > 0) {\r\n const hx = 0.5 * door.lx;\r\n const lz = door.lz;\r\n const ah = Math.min(door.archHeight, lz, hx); // actual arch height\r\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\r\n const startAngle = Math.acos(Math.min(hx / r, 1));\r\n const extent = Math.PI - startAngle * 2;\r\n return 0.5 * extent * r * r - hx * (r - ah) + (lz - ah) * hx * 2;\r\n }\r\n return door.lx * door.lz;\r\n }\r\n }\r\n\r\n static hasHeliostatOrFresnelReflectors(elements: ElementModel[]): boolean {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector || e.type === ObjectType.Heliostat) return true;\r\n }\r\n return false;\r\n }\r\n\r\n static lineIntersection(from1: Point2, to1: Point2, from2: Point2, to2: Point2): Point2 | undefined {\r\n const dx: number = to1.x - from1.x;\r\n const dy: number = to1.y - from1.y;\r\n\r\n const determinant: number = dx * (to2.y - from2.y) - (to2.x - from2.x) * dy;\r\n if (determinant === 0) return undefined; // parallel lines\r\n\r\n const lambda: number =\r\n ((to2.y - from2.y) * (to2.x - from1.x) + (from2.x - to2.x) * (to2.y - from1.y)) / determinant;\r\n const gamma: number = ((from1.y - to1.y) * (to2.x - from1.x) + dx * (to2.y - from1.y)) / determinant;\r\n\r\n // check if there is an intersection\r\n if (!(0 <= lambda && lambda <= 1) || !(0 <= gamma && gamma <= 1)) return undefined;\r\n\r\n return {\r\n x: from1.x + lambda * dx,\r\n y: from1.y + lambda * dy,\r\n } as Point2;\r\n }\r\n\r\n static calculateSolarRadiationColor(value: number, maxValue: number): Color {\r\n const valuePerColorRange = maxValue / (SOLAR_HEATMAP_COLORS.length - 1);\r\n let colorIndex = Math.max(0, Math.floor(value / valuePerColorRange));\r\n if (colorIndex > SOLAR_HEATMAP_COLORS.length - 2) colorIndex = SOLAR_HEATMAP_COLORS.length - 2;\r\n const scalar = Math.min(1, (value - valuePerColorRange * colorIndex) / valuePerColorRange);\r\n return new Color(SOLAR_HEATMAP_COLORS[colorIndex]).lerp(SOLAR_HEATMAP_COLORS[colorIndex + 1], scalar);\r\n }\r\n\r\n static transpose(array2d: number[][]): number[][] {\r\n return array2d[0].map((col, i) => array2d.map((row) => row[i]));\r\n }\r\n\r\n static clone2DArray(array: any[][]) {\r\n return array.map((row) => [...row]);\r\n }\r\n\r\n static fetchHeatmapTexture(data: number[][] | undefined, maxValue: number, flip?: boolean): CanvasTexture | null {\r\n if (!data) return null;\r\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\r\n const w = data.length;\r\n const h = data[0].length;\r\n canvas.width = w;\r\n canvas.height = h;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n ctx.clearRect(0, 0, w, h);\r\n const imageData = ctx.getImageData(0, 0, w, h);\r\n const pixels = imageData.data;\r\n for (let i = 0; i < w; i++) {\r\n for (let j = 0; j < h; j++) {\r\n const c = Util.calculateSolarRadiationColor(data[flip ? w - 1 - i : i][j], maxValue);\r\n const off = ((h - 1 - j) * w + i) * 4;\r\n pixels[off] = Math.floor(c.r * 255);\r\n pixels[off + 1] = Math.floor(c.g * 255);\r\n pixels[off + 2] = Math.floor(c.b * 255);\r\n pixels[off + 3] = 255;\r\n }\r\n }\r\n ctx.putImageData(imageData, 0, 0);\r\n }\r\n return new CanvasTexture(canvas);\r\n }\r\n\r\n static countSolarPanelsOnRack(rack: SolarPanelModel, pvModel: PvModel): number {\r\n let count = 0;\r\n if (pvModel && rack) {\r\n let nx, ny;\r\n if (rack.orientation === Orientation.portrait) {\r\n nx = Math.max(1, Math.round(rack.lx / pvModel.width));\r\n ny = Math.max(1, Math.round(rack.ly / pvModel.length));\r\n } else {\r\n nx = Math.max(1, Math.round(rack.lx / pvModel.length));\r\n ny = Math.max(1, Math.round(rack.ly / pvModel.width));\r\n }\r\n count += nx * ny;\r\n }\r\n return count;\r\n }\r\n\r\n static countAllSolarPanelDailyYields(): number {\r\n let total = 0;\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.SolarPanel) {\r\n total += (e as SolarPanelModel).dailyYield ?? 0;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n static countAllSolarPanelYearlyYields(): number {\r\n let total = 0;\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.SolarPanel) {\r\n total += (e as SolarPanelModel).yearlyYield ?? 0;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n static countAllSolarPanels(): number {\r\n let count = 0;\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.SolarPanel) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = useStore.getState().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n count += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n static hasSolarPanels(elements: ElementModel[]): boolean {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel) return true;\r\n }\r\n return false;\r\n }\r\n\r\n // special case as a rack may have many solar panels\r\n static countAllChildSolarPanels(parentId: string, excludeLocked?: boolean): number {\r\n let count = 0;\r\n const elements = useStore.getState().elements;\r\n if (excludeLocked) {\r\n for (const e of elements) {\r\n if (!e.locked && e.type === ObjectType.SolarPanel && e.parentId === parentId) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = useStore.getState().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n count += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === parentId) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = useStore.getState().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n count += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n }\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n static countAllChildSolarPanelDailyYields(parentId: string): number {\r\n let total = 0;\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === parentId) {\r\n total += (e as SolarPanelModel).dailyYield ?? 0;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n static countAllChildElementsByType(parentId: string, type: ObjectType, excludeLocked?: boolean): number {\r\n let count = 0;\r\n const elements = useStore.getState().elements;\r\n if (excludeLocked) {\r\n for (const e of elements) {\r\n if (!e.locked && e.type === type && e.parentId === parentId) {\r\n count++;\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === type && e.parentId === parentId) {\r\n count++;\r\n }\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n static areTwoBasesOverlapped(f1: ElementModel, f2: ElementModel): boolean {\r\n const v1 = Util.fetchFoundationVertexCoordinates(f1);\r\n const v2 = Util.fetchFoundationVertexCoordinates(f2);\r\n for (const v of v1) {\r\n if (Util.isPointInside(v.x, v.y, v2)) {\r\n return true;\r\n }\r\n }\r\n for (const v of v2) {\r\n if (Util.isPointInside(v.x, v.y, v1)) {\r\n return true;\r\n }\r\n }\r\n v1.push(v1[0]);\r\n v2.push(v2[0]);\r\n for (let i1 = 0; i1 < v1.length - 1; i1++) {\r\n const from1 = v1[i1];\r\n const to1 = v1[i1 + 1];\r\n for (let i2 = 0; i2 < v2.length - 1; i2++) {\r\n const from2 = v2[i2];\r\n const to2 = v2[i2 + 1];\r\n if (Util.lineIntersection(from1, to1, from2, to2)) return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n static fetchFoundationVertexCoordinates(foundation: ElementModel): Point2[] {\r\n const { pos } = Util.getWorldDataById(foundation.id);\r\n const xc = pos.x;\r\n const yc = pos.y;\r\n const cosaz = Math.cos(foundation.rotation[2]);\r\n const sinaz = Math.sin(foundation.rotation[2]);\r\n const rx = foundation.lx * 0.5;\r\n const ry = foundation.ly * 0.5;\r\n // corners are stored in the clockwise direction\r\n const vertices: Point2[] = [];\r\n // upper-right corner\r\n vertices.push({\r\n x: xc + rx * cosaz - ry * sinaz,\r\n y: yc + rx * sinaz + ry * cosaz,\r\n } as Point2);\r\n // lower-right corner\r\n vertices.push({\r\n x: xc + rx * cosaz + ry * sinaz,\r\n y: yc + rx * sinaz - ry * cosaz,\r\n } as Point2);\r\n // lower-left corner\r\n vertices.push({\r\n x: xc - rx * cosaz + ry * sinaz,\r\n y: yc - rx * sinaz - ry * cosaz,\r\n } as Point2);\r\n // upper-left corner\r\n vertices.push({\r\n x: xc - rx * cosaz - ry * sinaz,\r\n y: yc - rx * sinaz + ry * cosaz,\r\n } as Point2);\r\n return vertices;\r\n }\r\n\r\n static doSolarPanelsOverlap(sp1: SolarPanelModel, sp2: SolarPanelModel, parent: ElementModel): boolean {\r\n if (sp1.parentId !== parent.id || sp2.parentId !== parent.id) return false;\r\n if (!Util.isIdentical(sp1.normal, sp2.normal)) return false;\r\n const v1 = Util.fetchSolarPanelVertexCoordinates(sp1, parent);\r\n const v2 = Util.fetchSolarPanelVertexCoordinates(sp2, parent);\r\n v1.push(v1[0]);\r\n v2.push(v2[0]);\r\n for (let i1 = 0; i1 < v1.length - 1; i1++) {\r\n const from1 = v1[i1];\r\n const to1 = v1[i1 + 1];\r\n for (let i2 = 0; i2 < v2.length - 1; i2++) {\r\n const from2 = v2[i2];\r\n const to2 = v2[i2 + 1];\r\n if (Util.lineIntersection(from1, to1, from2, to2)) return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n static fetchSolarPanelVertexCoordinates(sp: SolarPanelModel, parent: ElementModel): Point2[] {\r\n const xc = sp.cx * parent.lx;\r\n const yc = sp.cy * parent.ly;\r\n const cosaz = Math.cos(sp.relativeAzimuth);\r\n const sinaz = Math.sin(sp.relativeAzimuth);\r\n const rx = sp.lx * 0.5;\r\n const ry = sp.ly * 0.5 * Math.cos(sp.tiltAngle);\r\n // corners are stored in the clockwise direction\r\n const vertices: Point2[] = [];\r\n // upper-right corner of solar panel\r\n vertices.push({\r\n x: xc + rx * cosaz - ry * sinaz,\r\n y: yc + rx * sinaz + ry * cosaz,\r\n } as Point2);\r\n // lower-right corner of solar panel\r\n vertices.push({\r\n x: xc + rx * cosaz + ry * sinaz,\r\n y: yc + rx * sinaz - ry * cosaz,\r\n } as Point2);\r\n // lower-left corner of solar panel\r\n vertices.push({\r\n x: xc - rx * cosaz + ry * sinaz,\r\n y: yc - rx * sinaz - ry * cosaz,\r\n } as Point2);\r\n // upper-left corner of solar panel\r\n vertices.push({\r\n x: xc - rx * cosaz - ry * sinaz,\r\n y: yc - rx * sinaz + ry * cosaz,\r\n } as Point2);\r\n return vertices;\r\n }\r\n\r\n static changeOrientation(solarPanel: SolarPanelModel, pvModel: PvModel, value: Orientation): void {\r\n if (solarPanel) {\r\n solarPanel.orientation = value;\r\n // add a small number because the round-off error may cause the floor to drop one\r\n solarPanel.lx += 0.00001;\r\n solarPanel.ly += 0.00001;\r\n if (value === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.floor(solarPanel.lx / pvModel.width));\r\n const ny = Math.max(1, Math.floor(solarPanel.ly / pvModel.length));\r\n solarPanel.lx = nx * pvModel.width;\r\n solarPanel.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.floor(solarPanel.lx / pvModel.length));\r\n const ny = Math.max(1, Math.floor(solarPanel.ly / pvModel.width));\r\n solarPanel.lx = nx * pvModel.length;\r\n solarPanel.ly = ny * pvModel.width;\r\n }\r\n }\r\n }\r\n\r\n static panelizeLx(solarPanel: SolarPanelModel, pvModel: PvModel, value: number): number {\r\n const dx = solarPanel.orientation === Orientation.portrait ? pvModel.width : pvModel.length;\r\n let lx = value ?? 1;\r\n const n = Math.max(1, Math.ceil((lx - dx / 2) / dx));\r\n lx = n * dx;\r\n return lx;\r\n }\r\n\r\n static panelizeLy(solarPanel: SolarPanelModel, pvModel: PvModel, value: number): number {\r\n const dy = solarPanel.orientation === Orientation.portrait ? pvModel.length : pvModel.width;\r\n let ly = value ?? 1;\r\n const n = Math.max(1, Math.ceil((ly - dy / 2) / dy));\r\n ly = n * dy;\r\n return ly;\r\n }\r\n\r\n // ray-casting algorithm based on\r\n static isPointInside(x: number, y: number, vertices: Point2[]): boolean {\r\n let inside = false;\r\n for (let i = 0, j = vertices.length - 1; i < vertices.length; j = i++) {\r\n const xi = vertices[i].x;\r\n const yi = vertices[i].y;\r\n const xj = vertices[j].x;\r\n const yj = vertices[j].y;\r\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {\r\n inside = !inside;\r\n }\r\n }\r\n return inside;\r\n }\r\n\r\n static getPoints(vertices: Vector3[]): Point2[] {\r\n const points: Point2[] = [];\r\n for (const v of vertices) {\r\n points.push({ x: v.x, y: v.y } as Point2);\r\n }\r\n return points;\r\n }\r\n\r\n static polygonIntersections(a: Point2, b: Point2, vertices: Point2[]): Point2[] {\r\n const intersections = new Array();\r\n let v1: Point2, v2: Point2, p: Point2 | undefined;\r\n for (let i = 0; i < vertices.length - 1; i++) {\r\n v1 = vertices[i];\r\n v2 = vertices[i + 1];\r\n p = Util.lineIntersection(a, b, v1, v2);\r\n if (p) {\r\n intersections.push(p);\r\n }\r\n }\r\n v1 = vertices[vertices.length - 1];\r\n v2 = vertices[0];\r\n p = Util.lineIntersection(a, b, v1, v2);\r\n if (p) {\r\n intersections.push(p);\r\n }\r\n return intersections;\r\n }\r\n\r\n static calculatePolygonBounds(vertices: Point2[]): Rectangle {\r\n let minX = vertices[0].x;\r\n let maxX = vertices[0].x;\r\n let minY = vertices[0].y;\r\n let maxY = vertices[0].y;\r\n for (const [i, v] of vertices.entries()) {\r\n if (i > 0) {\r\n if (minX > v.x) minX = v.x;\r\n if (minY > v.y) minY = v.y;\r\n if (maxX < v.x) maxX = v.x;\r\n if (maxY < v.y) maxY = v.y;\r\n }\r\n }\r\n return new Rectangle(minX, minY, maxX - minX, maxY - minY);\r\n }\r\n\r\n static calculatePolygonCentroid(vertices: Point2[]): Point2 {\r\n // it is OK to use a shallow copy here since we are not modifying the objects in the array\r\n const pts = [...vertices];\r\n const first = pts[0];\r\n const last = pts[pts.length - 1];\r\n if (first.x !== last.x || first.y !== last.y) pts.push(first);\r\n const nPts = pts.length;\r\n let twiceArea = 0,\r\n x = 0,\r\n y = 0;\r\n let p1, p2, f;\r\n for (let i = 0, j = nPts - 1; i < nPts; j = i++) {\r\n p1 = pts[i];\r\n p2 = pts[j];\r\n f = (p1.y - first.y) * (p2.x - first.x) - (p2.y - first.y) * (p1.x - first.x);\r\n twiceArea += f;\r\n x += (p1.x + p2.x - 2 * first.x) * f;\r\n y += (p1.y + p2.y - 2 * first.y) * f;\r\n }\r\n f = twiceArea * 3;\r\n return { x: x / f + first.x, y: y / f + first.y } as Point2;\r\n }\r\n\r\n static translatePolygonCenterTo(polygonModel: PolygonModel, x: number, y: number): void {\r\n const n = polygonModel.vertices.length;\r\n if (n === 0) return;\r\n const centroid = Util.calculatePolygonCentroid(polygonModel.vertices);\r\n const dx = x - centroid.x;\r\n const dy = y - centroid.y;\r\n for (const v of polygonModel.vertices) {\r\n v.x += dx;\r\n v.y += dy;\r\n }\r\n }\r\n\r\n static rotatePolygon(vertices: Point2[], cx: number, cy: number, angleInRadian: number): Point2[] {\r\n const rotatedVertices: Point2[] = [];\r\n const cos = Math.cos(angleInRadian);\r\n const sin = Math.sin(angleInRadian);\r\n for (const v of vertices) {\r\n const dx = v.x - cx;\r\n const dy = v.y - cy;\r\n rotatedVertices.push({ x: cx + dx * cos - dy * sin, y: cy + dx * sin + dy * cos } as Point2);\r\n }\r\n return rotatedVertices;\r\n }\r\n\r\n static rotatePoint(point: Point2, cx: number, cy: number, angleInRadian: number): Point2 {\r\n const cos = Math.cos(angleInRadian);\r\n const sin = Math.sin(angleInRadian);\r\n const dx = point.x - cx;\r\n const dy = point.y - cy;\r\n return { x: cx + dx * cos - dy * sin, y: cy + dx * sin + dy * cos } as Point2;\r\n }\r\n\r\n // note: this assumes that the center of the parent does NOT change\r\n static doesNewSizeContainAllChildren(\r\n parent: ElementModel,\r\n children: ElementModel[],\r\n lx: number,\r\n ly: number,\r\n ): boolean {\r\n const childAbsPosMap = new Map();\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n // TODO\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const absPos = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(\r\n ORIGIN_VECTOR2,\r\n parent.rotation[2],\r\n );\r\n childAbsPosMap.set(c.id, absPos);\r\n break;\r\n }\r\n }\r\n const childrenClone: ElementModel[] = [];\r\n for (const c of children) {\r\n const childClone = JSON.parse(JSON.stringify(c));\r\n childrenClone.push(childClone);\r\n const childAbsPos = childAbsPosMap.get(c.id);\r\n if (childAbsPos) {\r\n const relativePos = new Vector2(childAbsPos.x, childAbsPos.y).rotateAround(ORIGIN_VECTOR2, -c.rotation[2]);\r\n childClone.cx = relativePos.x / lx;\r\n childClone.cy = relativePos.y / ly;\r\n }\r\n }\r\n const parentClone = JSON.parse(JSON.stringify(parent));\r\n parentClone.lx = lx;\r\n parentClone.ly = ly;\r\n return Util.doesParentContainAllChildren(parentClone, childrenClone);\r\n }\r\n\r\n // TODO: Vertical surfaces\r\n static doesParentContainAllChildren(parent: ElementModel, children: ElementModel[]): boolean {\r\n for (const e of children) {\r\n switch (e.type) {\r\n // solar panels can be installed on any surface, but we can only check horizontal surfaces now\r\n case ObjectType.SolarPanel:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, parent)) {\r\n return false;\r\n }\r\n }\r\n break;\r\n // these CSP collectors can only be installed on a foundation\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, parent)) {\r\n return false;\r\n }\r\n break;\r\n // sensors can be placed on any surface, but we can only check horizontal surfaces now\r\n case ObjectType.Sensor:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n if (!Util.isSensorWithin(e as SensorModel, parent)) {\r\n return false;\r\n }\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (!Util.isWallWithin(e as WallModel, parent)) {\r\n return false;\r\n }\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static isWallWithin(wall: WallModel, parent: ElementModel): boolean {\r\n const dx = parent.lx * 0.5;\r\n const dy = parent.ly * 0.5;\r\n const lx = wall.leftPoint[0]; // left point x\r\n const ly = wall.leftPoint[1]; // left point y\r\n if (Math.abs(lx) >= dx || Math.abs(ly) >= dy) {\r\n return false;\r\n }\r\n const rx = wall.rightPoint[0]; // right point x\r\n const ry = wall.rightPoint[1]; // right point y\r\n if (Math.abs(rx) >= dx || Math.abs(ry) >= dy) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n static isSensorWithin(sensor: SensorModel, parent: ElementModel): boolean {\r\n return Math.abs(sensor.cx) < 0.5 - sensor.lx / parent.lx && Math.abs(sensor.cy) < 0.5 - sensor.ly / parent.ly;\r\n }\r\n\r\n static isSolarCollectorWithinHorizontalSurface(collector: SolarCollector, parent: ElementModel): boolean {\r\n const x0 = collector.cx * parent.lx;\r\n const y0 = collector.cy * parent.ly;\r\n const cosaz = Math.cos(collector.relativeAzimuth);\r\n const sinaz = Math.sin(collector.relativeAzimuth);\r\n const dx = parent.lx * 0.5;\r\n const dy = parent.ly * 0.5;\r\n const rx = collector.lx * 0.5;\r\n const ry = collector.ly * 0.5 * Math.cos(collector.tiltAngle);\r\n // vertex 1\r\n let x = x0 + rx * cosaz - ry * sinaz;\r\n let y = y0 + rx * sinaz + ry * cosaz;\r\n if (Math.abs(x) > dx || Math.abs(y) > dy) return false;\r\n // vertex 2\r\n x = x0 + rx * cosaz + ry * sinaz;\r\n y = y0 + rx * sinaz - ry * cosaz;\r\n if (Math.abs(x) > dx || Math.abs(y) > dy) return false;\r\n // vertex 3\r\n x = x0 - rx * cosaz - ry * sinaz;\r\n y = y0 - rx * sinaz + ry * cosaz;\r\n if (Math.abs(x) > dx || Math.abs(y) > dy) return false;\r\n // vertex 4\r\n x = x0 - rx * cosaz + ry * sinaz;\r\n y = y0 - rx * sinaz - ry * cosaz;\r\n if (Math.abs(x) > dx || Math.abs(y) > dy) return false;\r\n // all in\r\n return true;\r\n }\r\n\r\n static isUnitVectorX(v: Vector3): boolean {\r\n return Util.isSame(v, UNIT_VECTOR_POS_X) || Util.isSame(v, UNIT_VECTOR_NEG_X);\r\n }\r\n\r\n static isUnitVectorY(v: Vector3): boolean {\r\n return Util.isSame(v, UNIT_VECTOR_POS_Y) || Util.isSame(v, UNIT_VECTOR_NEG_Y);\r\n }\r\n\r\n static isSame(u: Vector3, v: Vector3): boolean {\r\n return (\r\n Math.abs(u.x - v.x) < ZERO_TOLERANCE &&\r\n Math.abs(u.y - v.y) < ZERO_TOLERANCE &&\r\n Math.abs(u.z - v.z) < ZERO_TOLERANCE\r\n );\r\n }\r\n\r\n static isIdentical(u?: number[], v?: number[]): boolean {\r\n if (!u || !v || u.length !== v.length) return false;\r\n if (u === v) return true;\r\n for (let i = 0; i < u.length; i++) {\r\n if (Math.abs(u[i] - v[i]) > ZERO_TOLERANCE) return false;\r\n }\r\n return true;\r\n }\r\n\r\n static isZero(x: number): boolean {\r\n return Math.abs(x) < ZERO_TOLERANCE;\r\n }\r\n\r\n static deleteElement(a: any[], e: any): void {\r\n const i = a.indexOf(e, 0);\r\n if (i > -1) {\r\n a.splice(i, 1);\r\n }\r\n }\r\n\r\n static fixElements(elements: ElementModel[]): void {\r\n const found: ElementModel[] = [];\r\n for (const e of elements) {\r\n if (!e.type) {\r\n found.push(e);\r\n }\r\n }\r\n if (found.length > 0) {\r\n for (const e of found) {\r\n Util.deleteElement(elements, e);\r\n }\r\n }\r\n }\r\n\r\n static isResizingVertical(handle: ResizeHandleType | null): boolean {\r\n switch (handle) {\r\n case ResizeHandleType.LowerLeftTop:\r\n case ResizeHandleType.UpperLeftTop:\r\n case ResizeHandleType.LowerRightTop:\r\n case ResizeHandleType.UpperRightTop:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n static isTopResizeHandle(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n // unfortunately, I cannot find a better way to tell the type of enum variable\r\n return (\r\n handle === ResizeHandleType.LowerLeftTop ||\r\n handle === ResizeHandleType.LowerRightTop ||\r\n handle === ResizeHandleType.UpperLeftTop ||\r\n handle === ResizeHandleType.UpperRightTop ||\r\n handle === ResizeHandleType.Top\r\n );\r\n }\r\n\r\n static isXResizeHandle(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n // unfortunately, I cannot find a better way to tell the type of enum variable\r\n return handle === ResizeHandleType.Left || handle === ResizeHandleType.Right;\r\n }\r\n\r\n static isYResizeHandle(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n // unfortunately, I cannot find a better way to tell the type of enum variable\r\n return handle === ResizeHandleType.Upper || handle === ResizeHandleType.Lower;\r\n }\r\n\r\n static isTopResizeHandleOfWall(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n return handle === ResizeHandleType.UpperLeft || handle === ResizeHandleType.UpperRight;\r\n }\r\n\r\n static isRiseHandleOfRoof(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n return handle === RoofHandleType.Top || handle === RoofHandleType.Mid || handle === RoofHandleType.TopMid;\r\n }\r\n\r\n static isMoveHandle(handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null): boolean {\r\n // unfortunately, I cannot find a better way to tell the type of enum variable\r\n return (\r\n handle === MoveHandleType.Default ||\r\n handle === MoveHandleType.Top ||\r\n handle === MoveHandleType.Upper ||\r\n handle === MoveHandleType.Lower ||\r\n handle === MoveHandleType.Left ||\r\n handle === MoveHandleType.Right\r\n );\r\n }\r\n\r\n static snapToNormalGrid(v: Vector3): Vector3 {\r\n const x = Math.round(v.x / NORMAL_GRID_SCALE) * NORMAL_GRID_SCALE;\r\n const y = Math.round(v.y / NORMAL_GRID_SCALE) * NORMAL_GRID_SCALE;\r\n return new Vector3(x, y, v.z);\r\n }\r\n\r\n static snapToFineGrid(v: Vector3): Vector3 {\r\n const x = Math.round(v.x / FINE_GRID_SCALE) * FINE_GRID_SCALE;\r\n const y = Math.round(v.y / FINE_GRID_SCALE) * FINE_GRID_SCALE;\r\n return new Vector3(x, y, v.z);\r\n }\r\n\r\n static isPositionRelative(objectType: ObjectType): boolean {\r\n return (\r\n objectType === ObjectType.SolarPanel ||\r\n objectType === ObjectType.ParabolicTrough ||\r\n objectType === ObjectType.ParabolicDish ||\r\n objectType === ObjectType.FresnelReflector ||\r\n objectType === ObjectType.Heliostat ||\r\n objectType === ObjectType.WaterHeater ||\r\n objectType === ObjectType.Sensor ||\r\n objectType === ObjectType.Light ||\r\n objectType === ObjectType.Polygon ||\r\n objectType === ObjectType.Window ||\r\n objectType === ObjectType.Door ||\r\n objectType === ObjectType.Roof ||\r\n objectType === ObjectType.Wall\r\n );\r\n }\r\n\r\n static isPlantOrHuman(elem: ElementModel): boolean {\r\n return elem.type === ObjectType.Tree || elem.type === ObjectType.Flower || elem.type === ObjectType.Human;\r\n }\r\n\r\n static isFoundationOrCuboid(elem: ElementModel): boolean {\r\n return elem.type === ObjectType.Foundation || elem.type === ObjectType.Cuboid;\r\n }\r\n\r\n static isSolarCollector(elem: ElementModel): boolean {\r\n return Util.isSolarCollectorType(elem.type);\r\n }\r\n\r\n static isSolarCollectorType(type: ObjectType): boolean {\r\n return type === ObjectType.SolarPanel || type === ObjectType.WaterHeater || Util.isCspCollectorType(type);\r\n }\r\n\r\n static isCspCollector(elem: ElementModel): boolean {\r\n return Util.isCspCollectorType(elem.type);\r\n }\r\n\r\n static isCspCollectorType(type: ObjectType): boolean {\r\n return (\r\n type === ObjectType.ParabolicDish ||\r\n type === ObjectType.ParabolicTrough ||\r\n type === ObjectType.FresnelReflector ||\r\n type === ObjectType.Heliostat\r\n );\r\n }\r\n\r\n static isParabolicCollector(elem: ElementModel): boolean {\r\n return Util.isParabolaType(elem.type);\r\n }\r\n\r\n static isParabolaType(type: ObjectType): boolean {\r\n return type === ObjectType.ParabolicDish || type === ObjectType.ParabolicTrough;\r\n }\r\n\r\n static isParabolicTroughOrFresnelReflector(type: ObjectType): boolean {\r\n return type === ObjectType.FresnelReflector || type === ObjectType.ParabolicTrough;\r\n }\r\n\r\n static isHeliostatOrFresnelReflector(type: ObjectType): boolean {\r\n return type === ObjectType.FresnelReflector || type === ObjectType.Heliostat;\r\n }\r\n\r\n static isLegalOnWall(type: ObjectType): boolean {\r\n switch (type) {\r\n case ObjectType.Window:\r\n case ObjectType.Door:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Polygon:\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n static isDescendantOf(child: ElementModel, targetId: string): boolean {\r\n const parentId = child.parentId;\r\n if (!parentId || parentId === GROUND_ID) return false;\r\n const parent = useStore.getState().getElementById(parentId);\r\n if (!parent) return false;\r\n if (parent.id === targetId) return true;\r\n return Util.isDescendantOf(parent, targetId);\r\n }\r\n\r\n // p is relative position on wall\r\n static isElementInsideWall(\r\n p: Vector3,\r\n wlx: number,\r\n wlz: number,\r\n boundingPoints: Point2[],\r\n isDoor?: boolean,\r\n ): boolean {\r\n const hx = wlx / 2;\r\n const hz = wlz / 2;\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n if (isDoor && j === -1) continue;\r\n const x = p.x + hx * i;\r\n const y = p.z + hz * j;\r\n if (!Util.isPointInside(x, y, boundingPoints)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n const elementPoints = [\r\n { x: p.x - hx, y: p.z - hz },\r\n { x: p.x - hx, y: p.z + hz },\r\n { x: p.x + hx, y: p.z + hz },\r\n { x: p.x + hx, y: p.z - hz },\r\n ];\r\n\r\n for (const p of boundingPoints) {\r\n if (Util.isPointInside(p.x, p.y, elementPoints)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static checkElementOnWallState(elem: ElementModel, parent?: ElementModel): ElementState {\r\n const margin = 0.00001;\r\n\r\n let hx = elem.lx / 2 + margin;\r\n let hz = elem.lz / 2 + margin;\r\n if (parent && elem.type === ObjectType.SolarPanel) {\r\n hx = hx / parent.lx + margin;\r\n hz = elem.ly / 2 / parent.lz + margin;\r\n }\r\n const eMinX = elem.cx - hx;\r\n const eMaxX = elem.cx + hx;\r\n const eMinZ = elem.cz - hz;\r\n const eMaxZ = elem.cz + hz;\r\n\r\n if (\r\n parent &&\r\n parent.type === ObjectType.Wall &&\r\n !Util.isElementInsideWall(\r\n new Vector3(elem.cx * parent.lx, elem.cy, elem.cz * parent.lz),\r\n parent.lx * hx * 2,\r\n parent.lz * hz * 2,\r\n Util.getWallInnerSideShapePoints(parent as WallModel),\r\n elem.type === ObjectType.Door,\r\n )\r\n ) {\r\n return ElementState.OutsideBoundary;\r\n }\r\n for (const e of useStore.getState().elements) {\r\n // check collision with other elements (except polygons)\r\n if (\r\n Util.isLegalOnWall(e.type) &&\r\n e.type !== ObjectType.Polygon &&\r\n e.parentId === elem.parentId &&\r\n e.id !== elem.id\r\n ) {\r\n let ehx = e.lx / 2;\r\n let ehz = e.lz / 2;\r\n if (parent && e.type === ObjectType.SolarPanel) {\r\n ehx = ehx / parent.lx;\r\n ehz = e.ly / 2 / parent.lz;\r\n }\r\n // target element\r\n const tMinX = e.cx - ehx;\r\n const tMaxX = e.cx + ehx;\r\n const tMinZ = e.cz - ehz;\r\n const tMaxZ = e.cz + ehz;\r\n if (\r\n ((eMinX >= tMinX && eMinX <= tMaxX) ||\r\n (eMaxX >= tMinX && eMaxX <= tMaxX) ||\r\n (tMinX >= eMinX && tMinX <= eMaxX) ||\r\n (tMaxX >= eMinX && tMaxX <= eMaxX)) &&\r\n ((eMinZ >= tMinZ && eMinZ <= tMaxZ) ||\r\n (eMaxZ >= tMinZ && eMaxZ <= tMaxZ) ||\r\n (tMinZ >= eMinZ && tMinZ <= eMaxZ) ||\r\n (tMaxZ >= eMinZ && tMaxZ <= eMaxZ))\r\n ) {\r\n return ElementState.OverLap;\r\n }\r\n }\r\n }\r\n return ElementState.Valid;\r\n }\r\n\r\n static checkElementOnRoofState(sp: SolarPanelModel, roof: RoofModel): ElementState {\r\n if (sp.foundationId) {\r\n const foundation = useStore.getState().getElementById(sp.foundationId);\r\n if (foundation) {\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(sp as SolarPanelModel, foundation);\r\n const wallVertices = RoofUtil.getRoofBoundaryVertices(roof);\r\n if (!RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, wallVertices)) {\r\n return ElementState.OutsideBoundary;\r\n }\r\n if (!RoofUtil.rooftopSPCollisionCheck(sp as SolarPanelModel, foundation, solarPanelVertices)) {\r\n return ElementState.OverLap;\r\n }\r\n return ElementState.Valid;\r\n }\r\n }\r\n return ElementState.Invalid;\r\n }\r\n\r\n static relativeCoordinates(x: number, y: number, z: number, parent: ElementModel): Vector3 {\r\n const v = new Vector3(x, y, z);\r\n if (parent.type === ObjectType.Wall) {\r\n const parentPos = new Vector3(parent.cx, parent.cy); // relative\r\n const grandParent = useStore.getState().getParent(parent);\r\n if (grandParent) {\r\n const grandParentPos = new Vector3(grandParent.cx, grandParent.cy); // world\r\n parentPos\r\n .applyEuler(new Euler(0, 0, grandParent.rotation[2]))\r\n .add(grandParentPos)\r\n .setZ(grandParent.lz + parent.lz / 2); // world\r\n v.sub(parentPos).applyEuler(new Euler(0, 0, -(parent as WallModel).relativeAngle - grandParent.rotation[2]));\r\n }\r\n } else {\r\n const { pos, rot } = Util.getWorldDataById(parent.id);\r\n v.set(x - pos.x, y - pos.y, z - pos.z);\r\n v.applyEuler(new Euler(0, 0, -rot));\r\n }\r\n v.x /= parent.lx;\r\n v.y /= parent.ly;\r\n v.z /= parent.lz;\r\n return v;\r\n }\r\n\r\n // don't use this for humans or trees or flowers\r\n static absoluteCoordinates(\r\n x: number,\r\n y: number,\r\n z: number,\r\n parent: ElementModel,\r\n foundation?: FoundationModel | null,\r\n shift?: number,\r\n ): Vector3 {\r\n if (parent.type === ObjectType.Wall && foundation) {\r\n const wall = parent as WallModel;\r\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\r\n if (wallAbsAngle !== undefined) {\r\n const wallAbsPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\r\n wall.lz / 2 + foundation.lz,\r\n );\r\n const v = new Vector3(x * wall.lx, y * wall.ly, z * wall.lz);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, wallAbsAngle);\r\n if (shift) {\r\n const dx = shift * Math.cos(wallAbsAngle - HALF_PI);\r\n const dy = shift * Math.sin(wallAbsAngle - HALF_PI);\r\n return new Vector3(wallAbsPos.x + v.x + dx, wallAbsPos.y + v.y + dy, wallAbsPos.z + v.z);\r\n }\r\n return new Vector3(wallAbsPos.x + v.x, wallAbsPos.y + v.y, wallAbsPos.z + v.z);\r\n }\r\n }\r\n if (parent.type === ObjectType.Roof && foundation) {\r\n const v = new Vector3(x * foundation.lx, y * foundation.ly, z + foundation.lz);\r\n v.applyEuler(new Euler().fromArray(foundation.rotation));\r\n v.x += foundation.cx;\r\n v.y += foundation.cy;\r\n return v;\r\n }\r\n const v = new Vector3(x * parent.lx, y * parent.ly, z * parent.lz);\r\n v.applyEuler(new Euler().fromArray(parent.rotation));\r\n v.x += parent.cx;\r\n v.y += parent.cy;\r\n v.z += parent.cz;\r\n return v;\r\n }\r\n\r\n // use this only for humans or trees or flowers\r\n static absoluteHumanOrTreeCoordinates(x: number, y: number, z: number, parent: ElementModel): Vector3 {\r\n const v = new Vector3(x, y, z);\r\n v.applyEuler(new Euler().fromArray(parent.rotation));\r\n v.x += parent.cx;\r\n v.y += parent.cy;\r\n v.z += parent.cz;\r\n return v;\r\n }\r\n\r\n // no normalization\r\n static relativePoint(point: Vector3, parent: ElementModel): Vector3 {\r\n const v = new Vector3(point.x - parent.cx, point.y - parent.cy, point.z - parent.cz);\r\n v.applyEuler(new Euler().fromArray(parent.rotation.map((a) => -a)));\r\n return v;\r\n }\r\n\r\n static wallAbsolutePosition(v: Vector3, parent: ElementModel): Vector3 {\r\n const parentPos = new Vector3(parent.cx, parent.cy);\r\n return new Vector3().addVectors(\r\n parentPos,\r\n new Vector3(v.x, v.y).applyAxisAngle(UNIT_VECTOR_POS_Z, parent.rotation[2]),\r\n );\r\n }\r\n\r\n static wallRelativePosition(v: Vector3, parent: ElementModel): Vector3 {\r\n const parentPos = new Vector3(parent.cx, parent.cy);\r\n return new Vector3()\r\n .subVectors(new Vector3(v.x, v.y), parentPos)\r\n .applyAxisAngle(UNIT_VECTOR_POS_Z, -parent.rotation[2]);\r\n }\r\n\r\n static getObjectChildById(object: Object3D | null | undefined, id: string): Object3D | null {\r\n if (object) {\r\n for (const children of object.children) {\r\n if (children.name === CUBOID_WRAPPER_NAME) {\r\n const child = Util.getStackCuboidObjectById(children, id);\r\n if (child) return child;\r\n } else if (children.name.includes(id)) {\r\n return children;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static getStackCuboidObjectById(wrapper: Object3D | null | undefined, id: string): Object3D | null {\r\n if (wrapper) {\r\n for (const child of wrapper.children) {\r\n if (child.name.includes(id)) {\r\n return child;\r\n }\r\n if (child.name === CUBOID_STACKABLE_CHILD) {\r\n const c = Util.getStackCuboidObjectById(child.children[0], id);\r\n if (c) return c;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static toRadians(degrees: number): number {\r\n return degrees * (Math.PI / 180);\r\n }\r\n\r\n static toDegrees(radians: number): number {\r\n return radians * (180 / Math.PI);\r\n }\r\n\r\n // returns the maximum of a 1D array\r\n static getArrayMax(array: number[]): number {\r\n return array.reduce((a, b) => Math.max(a, b));\r\n }\r\n\r\n // returns the minimum of a 1D array\r\n static getArrayMin(array: number[]): number {\r\n return array.reduce((a, b) => Math.min(a, b));\r\n }\r\n\r\n // returns the maximum of a 2D array\r\n static getArrayMax2D(array2d: number[][]): number {\r\n return Util.getArrayMax(array2d.map(Util.getArrayMax));\r\n }\r\n\r\n // returns the minimum of a 2D array\r\n static getArrayMin2D(array2d: number[][]): number {\r\n return Util.getArrayMin(array2d.map(Util.getArrayMin));\r\n }\r\n\r\n static sphericalToCartesianZ(sphereCoords: Vector3): Vector3 {\r\n let a = sphereCoords.x * Math.cos(sphereCoords.z);\r\n let x = a * Math.cos(sphereCoords.y);\r\n let y = a * Math.sin(sphereCoords.y);\r\n let z = sphereCoords.x * Math.sin(sphereCoords.z);\r\n sphereCoords.set(x, y, z);\r\n return sphereCoords;\r\n }\r\n\r\n // the spherical law of cosines: https://en.wikipedia.org/wiki/Spherical_law_of_cosines\r\n static getDistance(lng1: number, lat1: number, lng2: number, lat2: number): number {\r\n lng1 = Util.toRadians(lng1);\r\n lat1 = Util.toRadians(lat1);\r\n lng2 = Util.toRadians(lng2);\r\n lat2 = Util.toRadians(lat2);\r\n return Math.acos(\r\n Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(Math.abs(lng1 - lng2)),\r\n );\r\n }\r\n\r\n static minutesIntoDay(date: Date): number {\r\n return date.getHours() * 60 + date.getMinutes();\r\n }\r\n\r\n // convert to UTC to avoid problems caused by the daylight saving time\r\n static dayOfYear(date: Date): number {\r\n return (\r\n (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) - Date.UTC(date.getFullYear(), 0, 0)) / 86400000\r\n );\r\n }\r\n\r\n // https://en.wikipedia.org/wiki/Leap_year\r\n static daysInYear(date: Date): number {\r\n const year = date.getFullYear();\r\n return (year % 4 === 0 && year % 100 > 0) || year % 400 === 0 ? 366 : 365;\r\n }\r\n\r\n static daysOfMonth(month: number, year: number): number {\r\n return new Date(year, month + 1, 0).getDate();\r\n }\r\n\r\n static fahrenheitToCelsius(temp: number): number {\r\n return ((temp - 32) * 5) / 9;\r\n }\r\n\r\n static celsiusToFahrenheit(temp: number): number {\r\n return temp * (9 / 5) + 32;\r\n }\r\n\r\n static getOS(): string | undefined {\r\n return platform.os?.family;\r\n }\r\n\r\n static isMac(): boolean {\r\n const os = Util.getOS();\r\n if (os) return os.includes('Mac') || os.includes('OS X');\r\n return false;\r\n }\r\n\r\n static isChrome(): boolean {\r\n const os = Util.getOS();\r\n if (os) return os.includes('Chrome');\r\n return false;\r\n }\r\n\r\n static detectWebGLContext(): boolean {\r\n try {\r\n const canvas = document.createElement('canvas');\r\n return (\r\n !!window.WebGLRenderingContext && (!!canvas.getContext('webgl') || !!canvas.getContext('experimental-webgl'))\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n static clamp(num: number, min: number, max: number): number {\r\n if (min > max) {\r\n return (min + max) / 2;\r\n }\r\n return Math.min(Math.max(num, min), max);\r\n }\r\n\r\n static distanceFromPointToLine2D(p: Vector3, l1: Vector3, l2: Vector3): number {\r\n const [x, y] = [p.x, p.y];\r\n const [x1, y1] = [l1.x, l1.y];\r\n const [x2, y2] = [l2.x, l2.y];\r\n\r\n const A = x - x1;\r\n const B = y - y1;\r\n const C = x2 - x1;\r\n const D = y2 - y1;\r\n\r\n const dot = A * C + B * D;\r\n const len_sq = C * C + D * D;\r\n let param = -1;\r\n if (len_sq !== 0) {\r\n param = dot / len_sq;\r\n }\r\n\r\n let xx, yy;\r\n\r\n if (param < 0) {\r\n xx = x1;\r\n yy = y1;\r\n } else if (param > 1) {\r\n xx = x2;\r\n yy = y2;\r\n } else {\r\n xx = x1 + param * C;\r\n yy = y1 + param * D;\r\n }\r\n\r\n const dx = x - xx;\r\n const dy = y - yy;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n\r\n static mapVector3ToPoint2(v: Vector3): Point2 {\r\n return { x: v.x, y: v.y } as Point2;\r\n }\r\n\r\n // get the relative 2D vertices of a wall (can be a quad, pentagon, or heptagon)\r\n static getWallVertices(wall: WallModel, margin: number): Point2[] {\r\n const hx = wall.lx / 2;\r\n const hz = wall.lz / 2;\r\n const lowerLeft = { x: -hx - margin, y: -hz - margin } as Point2;\r\n const lowerRight = { x: hx + margin, y: -hz - margin } as Point2;\r\n const upperLeft = { x: -hx - margin, y: (wall.leftRoofHeight ?? wall.lz) - hz + margin } as Point2;\r\n const upperRight = { x: hx + margin, y: (wall.rightRoofHeight ?? wall.lz) - hz + margin } as Point2;\r\n const vertices: Point2[] = [];\r\n vertices.push(upperLeft, lowerLeft, lowerRight, upperRight);\r\n if (wall.centerRightRoofHeight) {\r\n vertices.push({\r\n x: wall.centerRightRoofHeight[0] * wall.lx,\r\n y: wall.centerRightRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n if (wall.centerRoofHeight) {\r\n vertices.push({ x: wall.centerRoofHeight[0] * wall.lx, y: wall.centerRoofHeight[1] - hz + margin } as Point2);\r\n }\r\n if (wall.centerLeftRoofHeight) {\r\n vertices.push({\r\n x: wall.centerLeftRoofHeight[0] * wall.lx,\r\n y: wall.centerLeftRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n return vertices;\r\n }\r\n\r\n // check if a partial wall is effectively full\r\n static isPartialWallFull(wall: WallModel): boolean {\r\n return (\r\n Util.isZero((wall.leftRoofHeight ?? wall.lz) - wall.leftTopPartialHeight) &&\r\n Util.isZero((wall.rightRoofHeight ?? wall.lz) - wall.rightTopPartialHeight) &&\r\n Util.isZero(wall.leftUnfilledHeight) &&\r\n Util.isZero(wall.rightUnfilledHeight)\r\n );\r\n }\r\n\r\n // get the relative 2D vertices of a partial wall (a quad)\r\n static getPartialWallVertices(wall: WallModel, margin: number): Point2[] {\r\n if (Util.isPartialWallFull(wall)) return Util.getWallVertices(wall, margin);\r\n const hx = wall.lx / 2;\r\n const hz = wall.lz / 2;\r\n const lowerLeft = { x: -hx - margin, y: wall.leftUnfilledHeight - hz - margin } as Point2;\r\n const lowerRight = { x: hx + margin, y: wall.rightUnfilledHeight - hz - margin } as Point2;\r\n const upperLeft = { x: -hx - margin, y: wall.leftTopPartialHeight - hz + margin } as Point2;\r\n const upperRight = { x: hx + margin, y: wall.rightTopPartialHeight - hz + margin } as Point2;\r\n const vertices: Point2[] = [];\r\n vertices.push(upperLeft, lowerLeft, lowerRight, upperRight);\r\n if (wall.centerRightRoofHeight) {\r\n vertices.push({\r\n x: wall.centerRightRoofHeight[0] * wall.lx,\r\n y: wall.centerRightRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n if (wall.centerRoofHeight) {\r\n vertices.push({ x: wall.centerRoofHeight[0] * wall.lx, y: wall.centerRoofHeight[1] - hz + margin } as Point2);\r\n }\r\n if (wall.centerLeftRoofHeight) {\r\n vertices.push({\r\n x: wall.centerLeftRoofHeight[0] * wall.lx,\r\n y: wall.centerLeftRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n return vertices;\r\n }\r\n\r\n // get the highest point of a wall (can be a quad, pentagon, or heptagon)\r\n static getHighestPointOfWall(wall: WallModel): number {\r\n let h = wall.lz;\r\n if (wall.leftRoofHeight) {\r\n h = Math.max(h, wall.leftRoofHeight);\r\n }\r\n if (wall.rightRoofHeight) {\r\n h = Math.max(h, wall.rightRoofHeight);\r\n }\r\n if (wall.centerRightRoofHeight) {\r\n h = Math.max(h, wall.centerRightRoofHeight[1]);\r\n }\r\n if (wall.centerRoofHeight) {\r\n h = Math.max(h, wall.centerRoofHeight[1]);\r\n }\r\n if (wall.centerLeftRoofHeight) {\r\n h = Math.max(h, wall.centerLeftRoofHeight[1]);\r\n }\r\n return h;\r\n }\r\n\r\n // get the points for all the walls under a roof\r\n static getWallPointsOfRoof(roof: RoofModel, wallModel?: WallModel) {\r\n let wall = wallModel ?? (useStore.getState().getElementById(roof.wallsId[0]) as WallModel);\r\n if (!wall) return [];\r\n const startWall = wall;\r\n const array = [];\r\n\r\n while (wall && (!wall.roofId || wall.roofId === roof.id)) {\r\n array.push({ x: wall.leftPoint[0], y: wall.leftPoint[1], eave: wall.eavesLength ?? 0 });\r\n if (wall.leftJoints[0]) {\r\n if (wall.leftJoints[0] !== startWall.id) {\r\n wall = useStore.getState().getElementById(wall.leftJoints[0]) as WallModel;\r\n }\r\n // is a loop\r\n else {\r\n array.reverse();\r\n return array;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n array.reverse();\r\n\r\n wall = useStore.getState().getElementById(startWall?.rightJoints[0]) as WallModel;\r\n while (wall && (!wall.roofId || wall.roofId === roof.id)) {\r\n array.push({ x: wall.leftPoint[0], y: wall.leftPoint[1], eave: wall.eavesLength ?? 0 });\r\n if (wall.rightJoints[0] && wall.rightJoints[0] !== startWall.id) {\r\n wall = useStore.getState().getElementById(wall.rightJoints[0]) as WallModel;\r\n } else {\r\n break;\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n static getWallInnerSideShapePoints(wallModel: WallModel) {\r\n const {\r\n lx,\r\n ly,\r\n lz,\r\n relativeAngle,\r\n fill,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRoofHeight,\r\n centerRightRoofHeight,\r\n rightRoofHeight,\r\n leftJoints,\r\n rightJoints,\r\n } = wallModel;\r\n\r\n const leftWall = leftJoints.length > 0 ? useStore.getState().getElementById(leftJoints[0]) : null;\r\n const rightWall = rightJoints.length > 0 ? useStore.getState().getElementById(rightJoints[0]) : null;\r\n\r\n const leftOffset =\r\n leftWall && leftWall.type === ObjectType.Wall\r\n ? Util.getInnerWallOffset(leftWall as WallModel, lx, ly, relativeAngle, 'left')\r\n : 0;\r\n const rightOffset =\r\n rightWall && rightWall.type === ObjectType.Wall\r\n ? Util.getInnerWallOffset(rightWall as WallModel, lx, ly, relativeAngle, 'right')\r\n : 0;\r\n\r\n const points: Point2[] = [];\r\n const x = lx / 2;\r\n const y = lz / 2;\r\n if (fill === WallFill.Partial) {\r\n points.push({ x: -x + leftOffset, y: -y + leftUnfilledHeight });\r\n points.push({ x: x - rightOffset, y: -y + rightUnfilledHeight });\r\n } else {\r\n points.push({ x: -x + leftOffset, y: -y });\r\n points.push({ x: x - rightOffset, y: -y });\r\n }\r\n rightRoofHeight\r\n ? points.push({ x: x - rightOffset, y: rightRoofHeight - y })\r\n : points.push({ x: x - rightOffset, y: y });\r\n if (centerRightRoofHeight) {\r\n points.push({ x: centerRightRoofHeight[0] * lx, y: centerRightRoofHeight[1] - y });\r\n }\r\n if (centerRoofHeight) {\r\n points.push({ x: centerRoofHeight[0] * lx, y: centerRoofHeight[1] - y });\r\n }\r\n if (centerLeftRoofHeight) {\r\n points.push({ x: centerLeftRoofHeight[0] * lx, y: centerLeftRoofHeight[1] - y });\r\n }\r\n leftRoofHeight\r\n ? points.push({ x: -x + leftOffset, y: leftRoofHeight - y })\r\n : points.push({ x: -x + leftOffset, y: y });\r\n\r\n return points;\r\n }\r\n\r\n static getInnerWallOffset(\r\n sideWall: WallModel | null,\r\n lx: number,\r\n ly: number,\r\n relativeAngle: number,\r\n side: 'left' | 'right',\r\n ) {\r\n let offset = 0;\r\n if (sideWall && sideWall.fill !== WallFill.Empty) {\r\n const sign = side === 'left' ? -1 : 1;\r\n const deltaAngle = (Math.PI * 3 + sign * (relativeAngle - sideWall.relativeAngle)) % TWO_PI;\r\n if (deltaAngle <= HALF_PI + 0.01 && deltaAngle > 0) {\r\n offset = Math.min(ly / Math.tan(deltaAngle) + sideWall.ly, lx);\r\n }\r\n }\r\n return offset;\r\n }\r\n\r\n static getAllConnectedWalls = (wall: WallModel) => {\r\n const getElementById = useStore.getState().getElementById;\r\n\r\n const array = [];\r\n const startWall = wall;\r\n while (wall) {\r\n array.push(wall);\r\n if (wall.leftJoints[0]) {\r\n if (wall.leftJoints[0] !== startWall.id) {\r\n const w = getElementById(wall.leftJoints[0]);\r\n if (w && w.type === ObjectType.Wall) {\r\n wall = w as WallModel;\r\n }\r\n }\r\n // is a loop\r\n else {\r\n return array;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n const w = getElementById(startWall.rightJoints[0]);\r\n if (w && w.type === ObjectType.Wall) {\r\n wall = w as WallModel;\r\n }\r\n while (wall) {\r\n array.push(wall);\r\n if (wall.rightJoints[0] && wall.rightJoints[0] !== startWall.id) {\r\n const w = getElementById(wall.rightJoints[0]);\r\n if (w) {\r\n wall = w as WallModel;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return array;\r\n };\r\n\r\n static getWorldDataById = (id: string): { pos: Vector3; rot: number; topZ: number } => {\r\n const el = useStore.getState().getElementById(id);\r\n if (!el) return { pos: new Vector3(), rot: 0, topZ: 0 };\r\n\r\n const currPos = new Vector3(el.cx, el.cy, el.cz);\r\n const currRot = el.rotation[2];\r\n const currTopZ = el.lz;\r\n\r\n if (el.parentId === GROUND_ID) {\r\n return { pos: currPos, rot: currRot, topZ: currTopZ };\r\n }\r\n const { pos: worldPos, rot: worldRot, topZ: worldTopZ } = Util.getWorldDataById(el.parentId);\r\n const euler = new Euler(0, 0, worldRot);\r\n\r\n return {\r\n pos: new Vector3().addVectors(currPos.applyEuler(euler), worldPos.clone().setZ(worldTopZ)),\r\n rot: currRot + worldRot,\r\n topZ: currTopZ + worldTopZ,\r\n };\r\n };\r\n\r\n /** check is child recursively */\r\n static isChild = (baseId: string, childId: string, checkLock = false): boolean => {\r\n const child = useStore.getState().getElementById(childId);\r\n if (!child) return false;\r\n if (checkLock && child.locked) return false;\r\n if (child.parentId === baseId) return true;\r\n return Util.isChild(baseId, child.parentId, checkLock);\r\n };\r\n\r\n static getBaseId = (id: string): string | null => {\r\n const el = useStore.getState().getElementById(id);\r\n if (!el) return null;\r\n if (el.parentId === GROUND_ID) return el.id;\r\n return Util.getBaseId(el.parentId);\r\n };\r\n\r\n static isElementTriggerAutoDeletion = (el: ElementModel) => {\r\n if (el.type === ObjectType.Roof) {\r\n const roof = el as RoofModel;\r\n if (roof.roofType === RoofType.Gable || roof.roofType === RoofType.Gambrel) {\r\n return true;\r\n }\r\n }\r\n if (el.type !== ObjectType.Wall) return false;\r\n\r\n const wall = el as WallModel;\r\n if (!wall.roofId) return false;\r\n\r\n const roof = useStore.getState().getElementById(wall.roofId) as RoofModel;\r\n if (!roof) return false;\r\n\r\n switch (roof.roofType) {\r\n case RoofType.Hip:\r\n case RoofType.Gable:\r\n case RoofType.Gambrel:\r\n return true;\r\n case RoofType.Pyramid:\r\n case RoofType.Mansard: {\r\n if (roof.wallsId.length === 0) return false;\r\n return roof.wallsId[0] === wall.id;\r\n }\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n static isElementAllowedMultipleMoveOnGround(e: ElementModel) {\r\n if (e.type === ObjectType.Foundation) return true;\r\n if (e.type === ObjectType.Cuboid && e.parentId === GROUND_ID) return true;\r\n return false;\r\n }\r\n}\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { ElementModel } from '../models/ElementModel';\nimport { Discretization, DiurnalTemperatureModel, FoundationTexture, HumanName, ObjectType } from '../types';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { SensorModel } from '../models/SensorModel';\nimport { WorldModel } from '../models/WorldModel';\nimport { GroundModel } from '../models/GroundModel';\nimport { HumanModel } from '../models/HumanModel';\nimport short from 'short-uuid';\nimport { DEFAULT_ADDRESS, DEFAULT_LEAF_OFF_DAY, DEFAULT_LEAF_OUT_DAY, GROUND_ID } from '../constants';\nimport { HumanData } from '../HumanData';\nimport { immerable } from 'immer';\n\n// default scene\n\nexport class DefaultWorldModel implements WorldModel {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n name: string;\n date: string;\n ground: GroundModel;\n latitude: number;\n longitude: number;\n address: string;\n countryCode: string;\n leafDayOfYear1?: number;\n leafDayOfYear2?: number;\n airAttenuationCoefficient: number;\n airConvectiveCoefficient: number;\n timesPerHour: number;\n daysPerYear: number;\n monthlyIrradianceLosses: number[];\n pvGridCellSize: number;\n discretization: Discretization;\n diurnalTemperatureModel: DiurnalTemperatureModel;\n highestTemperatureTimeInMinutes: number;\n\n solarPanelVisibilityGridCellSize: number;\n solarRadiationHeatmapGridCellSize: number;\n\n cspTimesPerHour: number;\n cspDaysPerYear: number;\n cspGridCellSize: number;\n\n sutTimesPerHour: number;\n sutDaysPerYear: number;\n sutGridCellSize: number;\n\n noAnimationForHeatmapSimulation: boolean;\n noAnimationForThermalSimulation: boolean;\n noAnimationForSensorDataCollection: boolean;\n noAnimationForSolarPanelSimulation: boolean;\n noAnimationForSolarUpdraftTowerSimulation: boolean;\n\n constructor() {\n this.latitude = 42.2844063;\n this.longitude = -71.3488548;\n this.address = DEFAULT_ADDRESS;\n this.countryCode = 'US';\n this.date = new Date(new Date().getFullYear(), 5, 22, 12).toLocaleString('en-US');\n\n this.name = 'default';\n this.ground = {\n albedo: 0.3,\n thermalDiffusivity: 0.05,\n snowReflectionFactors: new Array(12).fill(0),\n } as GroundModel;\n\n // The default values are for Natick, MA\n this.leafDayOfYear1 = DEFAULT_LEAF_OUT_DAY;\n this.leafDayOfYear2 = DEFAULT_LEAF_OFF_DAY;\n\n this.airAttenuationCoefficient = 0.01;\n this.airConvectiveCoefficient = 5;\n\n this.timesPerHour = 1; // how many times per hour to collect data\n this.daysPerYear = 12; // how many days per year for sampling\n this.monthlyIrradianceLosses = new Array(12).fill(0.05);\n this.pvGridCellSize = 0.5;\n this.discretization = Discretization.APPROXIMATE;\n this.diurnalTemperatureModel = DiurnalTemperatureModel.Sinusoidal;\n this.highestTemperatureTimeInMinutes = 900; // assume it is 3pm (at 15*60 minutes)\n\n this.solarPanelVisibilityGridCellSize = 0.2;\n this.solarRadiationHeatmapGridCellSize = 0.5;\n\n this.cspTimesPerHour = 1;\n this.cspDaysPerYear = 4;\n this.cspGridCellSize = 0.5;\n\n this.sutTimesPerHour = 1;\n this.sutDaysPerYear = 4;\n this.sutGridCellSize = 1;\n\n this.noAnimationForHeatmapSimulation = false;\n this.noAnimationForThermalSimulation = false;\n this.noAnimationForSensorDataCollection = false;\n this.noAnimationForSolarPanelSimulation = false;\n this.noAnimationForSolarUpdraftTowerSimulation = false;\n }\n\n static resetWorldModel(worldModel: WorldModel) {\n worldModel.latitude = 42.2844063;\n worldModel.longitude = -71.3488548;\n worldModel.address = DEFAULT_ADDRESS;\n worldModel.countryCode = 'US';\n worldModel.date = new Date(new Date().getFullYear(), 5, 22, 12).toLocaleString('en-US');\n\n worldModel.name = 'default';\n worldModel.ground.albedo = 0.3;\n worldModel.ground.thermalDiffusivity = 0.05;\n worldModel.ground.snowReflectionFactors.fill(0);\n\n worldModel.airAttenuationCoefficient = 0.01;\n worldModel.airConvectiveCoefficient = 5;\n\n worldModel.timesPerHour = 1; // how many times per hour to collect data\n worldModel.daysPerYear = 12; // how many days per year for sampling\n worldModel.monthlyIrradianceLosses = new Array(12).fill(0.05);\n worldModel.pvGridCellSize = 0.5;\n worldModel.discretization = Discretization.APPROXIMATE;\n worldModel.diurnalTemperatureModel = DiurnalTemperatureModel.Sinusoidal;\n worldModel.highestTemperatureTimeInMinutes = 900;\n\n worldModel.solarPanelVisibilityGridCellSize = 0.2;\n worldModel.solarRadiationHeatmapGridCellSize = 0.5;\n\n worldModel.cspTimesPerHour = 1;\n worldModel.cspDaysPerYear = 4;\n worldModel.cspGridCellSize = 0.5;\n\n worldModel.sutTimesPerHour = 1;\n worldModel.sutDaysPerYear = 4;\n worldModel.sutGridCellSize = 1;\n\n worldModel.noAnimationForHeatmapSimulation = false;\n worldModel.noAnimationForThermalSimulation = false;\n worldModel.noAnimationForSensorDataCollection = false;\n worldModel.noAnimationForSolarPanelSimulation = false;\n worldModel.noAnimationForSolarUpdraftTowerSimulation = false;\n }\n\n getElements() {\n const elements: ElementModel[] = [];\n\n const foundation = {\n type: ObjectType.Foundation,\n cx: 0,\n cy: 0,\n cz: 0.05,\n lx: 10,\n ly: 10,\n lz: 0.1,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: GROUND_ID,\n textureType: FoundationTexture.NoTexture,\n id: short.generate() as string,\n } as FoundationModel;\n elements.push(foundation);\n\n const sensor = {\n type: ObjectType.Sensor,\n cx: -0.1,\n cy: 0,\n cz: 0.105,\n lx: 0.1,\n ly: 0.1,\n lz: 0.01,\n parentId: foundation.id,\n foundationId: foundation.id,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n id: short.generate() as string,\n showLabel: true,\n light: true,\n heatFlux: false,\n } as SensorModel;\n elements.push(sensor);\n\n const woman = {\n type: ObjectType.Human,\n name: HumanName.Judd,\n cx: 1,\n cy: -1,\n cz: 0,\n lx: HumanData.fetchWidth(HumanName.Jiya),\n lz: HumanData.fetchHeight(HumanName.Jiya),\n normal: [1, 0, 0],\n rotation: [0, 0, 0],\n parentId: GROUND_ID,\n id: short.generate() as string,\n } as HumanModel;\n elements.push(woman);\n\n return elements;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport short from 'short-uuid';\nimport { HumanModel } from './HumanModel';\nimport { CuboidTexture, ObjectType } from '../types';\nimport { TreeModel } from './TreeModel';\nimport { SensorModel } from './SensorModel';\nimport { FoundationModel } from './FoundationModel';\nimport { CuboidModel } from './CuboidModel';\nimport { ElementModel } from './ElementModel';\nimport { SolarPanelModel } from './SolarPanelModel';\nimport { WallModel } from './WallModel';\nimport { WindowModel } from './WindowModel';\nimport { GableRoofModel, GambrelRoofModel, HipRoofModel, MansardRoofModel, RoofModel, RoofType } from './RoofModel';\nimport { PolygonModel } from './PolygonModel';\nimport { Util } from '../Util';\nimport { Vector3 } from 'three';\nimport {\n DEFAULT_CEILING_R_VALUE,\n DEFAULT_GROUND_FLOOR_R_VALUE,\n GROUND_ID,\n UNIT_VECTOR_NEG_X,\n UNIT_VECTOR_NEG_Y,\n UNIT_VECTOR_POS_X,\n UNIT_VECTOR_POS_Y,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { ParabolicTroughModel } from './ParabolicTroughModel';\nimport { ParabolicDishModel } from './ParabolicDishModel';\nimport { FresnelReflectorModel } from './FresnelReflectorModel';\nimport { HeliostatModel } from './HeliostatModel';\nimport { DoorModel } from './DoorModel';\nimport { WindTurbineModel } from './WindTurbineModel';\nimport { FlowerModel } from './FlowerModel';\nimport { LightModel } from './LightModel';\n\nexport class ElementModelCloner {\n static clone(\n parent: ElementModel | null,\n e: ElementModel,\n x: number,\n y: number,\n z?: number,\n noMove?: boolean,\n normal?: Vector3,\n oldParent?: ElementModel | null,\n ) {\n let clone = null;\n switch (e.type) {\n case ObjectType.Polygon:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.clonePolygon(parent, e as PolygonModel, x, y, z, noMove, normal);\n }\n break;\n case ObjectType.Sensor:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneSensor(parent, e as SensorModel, x, y, z);\n }\n break;\n case ObjectType.Light:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneLight(parent, e as LightModel, x, y, z);\n }\n break;\n case ObjectType.SolarPanel:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneSolarPanel(parent, e as SolarPanelModel, x, y, z);\n }\n break;\n case ObjectType.ParabolicTrough:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneParabolicTrough(parent, e as ParabolicTroughModel, x, y, z);\n }\n break;\n case ObjectType.ParabolicDish:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneParabolicDish(parent, e as ParabolicDishModel, x, y, z);\n }\n break;\n case ObjectType.FresnelReflector:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneFresnelReflector(parent, e as FresnelReflectorModel, x, y, z);\n }\n break;\n case ObjectType.Heliostat:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneHeliostat(parent, e as HeliostatModel, x, y, z);\n }\n break;\n case ObjectType.WindTurbine:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneWindTurbine(parent, e as WindTurbineModel, x, y, z);\n }\n break;\n case ObjectType.Wall:\n if (parent) {\n clone = ElementModelCloner.cloneWall(parent, e as WallModel, x, y, z);\n }\n break;\n case ObjectType.Window:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneWindow(parent, e as WindowModel, x, y, z, oldParent);\n }\n break;\n case ObjectType.Door:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneDoor(parent, e as DoorModel, x, y, z);\n }\n break;\n case ObjectType.Roof:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneRoof(parent, e as RoofModel, x, y, z);\n }\n break;\n case ObjectType.Human:\n clone = ElementModelCloner.cloneHuman(e as HumanModel, x, y, z, parent);\n break;\n case ObjectType.Tree:\n clone = ElementModelCloner.cloneTree(e as TreeModel, x, y, z, parent);\n break;\n case ObjectType.Flower:\n clone = ElementModelCloner.cloneFlower(e as FlowerModel, x, y, z, parent);\n break;\n case ObjectType.Foundation:\n clone = ElementModelCloner.cloneFoundation(e as FoundationModel, x, y);\n break;\n case ObjectType.Cuboid:\n const parentId = parent ? parent.id : GROUND_ID;\n clone = ElementModelCloner.cloneCuboid(parentId, e as CuboidModel, x, y);\n break;\n }\n return clone;\n }\n\n private static cloneHuman(human: HumanModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\n return {\n type: ObjectType.Human,\n name: human.name,\n flip: human.flip,\n cx: x,\n cy: y,\n cz: z,\n lx: human.lx,\n ly: human.ly,\n lz: human.lz,\n normal: [...human.normal],\n rotation: [...human.rotation],\n parentId: parent?.id ?? human.parentId,\n id: short.generate() as string,\n } as HumanModel;\n }\n\n private static cloneTree(tree: TreeModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\n return {\n type: ObjectType.Tree,\n name: tree.name,\n flip: tree.flip,\n cx: x,\n cy: y,\n cz: z,\n lx: tree.lx,\n ly: tree.ly,\n lz: tree.lz,\n normal: [...tree.normal],\n rotation: [...tree.rotation],\n parentId: parent?.id ?? tree.parentId,\n id: short.generate() as string,\n } as TreeModel;\n }\n\n private static cloneFlower(flower: FlowerModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\n return {\n type: ObjectType.Flower,\n name: flower.name,\n flip: flower.flip,\n cx: x,\n cy: y,\n cz: z,\n lx: flower.lx,\n ly: flower.ly,\n lz: flower.lz,\n normal: [...flower.normal],\n rotation: [...flower.rotation],\n parentId: parent?.id ?? flower.parentId,\n id: short.generate() as string,\n } as FlowerModel;\n }\n\n private static clonePolygon(\n parent: ElementModel,\n polygon: PolygonModel,\n x: number,\n y: number,\n z?: number,\n noMove?: boolean,\n normal?: Vector3,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n const vertices = polygon.vertices.map((v) => ({ ...v })); // deep copy;\n const pm = {\n type: ObjectType.Polygon,\n cx: x,\n cy: y,\n cz: z,\n lx: polygon.lx,\n ly: polygon.ly,\n lz: polygon.lz,\n filled: polygon.filled,\n noOutline: polygon.noOutline,\n color: polygon.color,\n lineColor: polygon.lineColor,\n lineWidth: polygon.lineWidth,\n opacity: polygon.opacity,\n textureType: polygon.textureType,\n text: polygon.text,\n fontSize: polygon.fontSize,\n fontColor: polygon.fontColor,\n normal: [...polygon.normal],\n rotation: polygon.parentId ? [...parent.rotation] : [0, 0, 0],\n vertices: vertices,\n parentId: parent.id,\n parentType: parent.type,\n foundationId: foundationId,\n id: short.generate() as string,\n } as PolygonModel;\n if (!noMove) {\n let x1 = x;\n let y1 = y;\n if (parent.type === ObjectType.Cuboid && normal) {\n if (Util.isSame(normal, UNIT_VECTOR_NEG_X)) {\n x1 = z ?? 0;\n } else if (Util.isSame(normal, UNIT_VECTOR_POS_X)) {\n x1 = -(z ?? 0);\n } else if (Util.isSame(normal, UNIT_VECTOR_NEG_Y)) {\n y1 = z ?? 0;\n } else if (Util.isSame(normal, UNIT_VECTOR_POS_Y)) {\n y1 = -(z ?? 0);\n }\n const dot = normal.dot(new Vector3().fromArray(polygon.normal));\n if (Math.abs(dot) < ZERO_TOLERANCE) {\n for (const v of pm.vertices) {\n [v.x, v.y] = [v.y, v.x];\n }\n }\n } else if (parent.type === ObjectType.Wall) {\n x1 = -x;\n y1 = -(z ?? 0);\n }\n Util.translatePolygonCenterTo(pm, x1, y1);\n }\n return pm;\n }\n\n private static cloneSensor(parent: ElementModel, sensor: SensorModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Sensor,\n cx: x,\n cy: y,\n cz: z,\n lx: sensor.lx,\n ly: sensor.ly,\n lz: sensor.lz,\n showLabel: sensor.showLabel,\n normal: [...sensor.normal],\n rotation: sensor.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as SensorModel;\n }\n\n private static cloneLight(parent: ElementModel, light: LightModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Light,\n cx: x,\n cy: y,\n cz: z,\n lx: light.lx,\n ly: light.ly,\n lz: light.lz,\n intensity: light.intensity,\n distance: light.distance,\n decay: light.decay,\n color: light.color,\n showLabel: light.showLabel,\n normal: [...light.normal],\n rotation: light.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as LightModel;\n }\n\n private static cloneSolarPanel(parent: ElementModel, solarPanel: SolarPanelModel, x: number, y: number, z?: number) {\n let foundationId;\n let parentType;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n parentType = parent.type;\n break;\n case ObjectType.Wall:\n foundationId = parent.parentId;\n parentType = ObjectType.Wall;\n break;\n case ObjectType.Roof:\n parentType = ObjectType.Roof;\n foundationId = parent.parentId;\n break;\n }\n let rotation;\n if (solarPanel.parentType === ObjectType.Roof) {\n rotation = [...solarPanel.rotation];\n } else {\n rotation = solarPanel.parentId ? [...parent.rotation] : [0, 0, 0];\n }\n return {\n type: ObjectType.SolarPanel,\n pvModelName: solarPanel.pvModelName,\n cx: x,\n cy: y,\n cz: z,\n lx: solarPanel.lx,\n ly: solarPanel.ly,\n lz: solarPanel.lz,\n trackerType: solarPanel.trackerType,\n tiltAngle: solarPanel.tiltAngle,\n relativeAzimuth: solarPanel.relativeAzimuth,\n orientation: solarPanel.orientation,\n poleRadius: solarPanel.poleRadius,\n poleHeight: solarPanel.poleHeight,\n poleSpacing: solarPanel.poleSpacing,\n showLabel: solarPanel.showLabel,\n normal: [...solarPanel.normal],\n rotation: rotation,\n parentType: parentType,\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as SolarPanelModel;\n }\n\n private static cloneParabolicTrough(\n parent: ElementModel,\n trough: ParabolicTroughModel,\n x: number,\n y: number,\n z?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.ParabolicTrough,\n cx: x,\n cy: y,\n cz: z,\n lx: trough.lx,\n ly: trough.ly,\n lz: trough.lz,\n reflectance: trough.reflectance,\n absorptance: trough.absorptance,\n opticalEfficiency: trough.opticalEfficiency,\n thermalEfficiency: trough.thermalEfficiency,\n absorberTubeRadius: trough.absorberTubeRadius,\n moduleLength: trough.moduleLength,\n latusRectum: trough.latusRectum,\n tiltAngle: trough.tiltAngle,\n relativeAzimuth: trough.relativeAzimuth,\n poleRadius: trough.poleRadius,\n poleHeight: trough.poleHeight,\n showLabel: trough.showLabel,\n normal: [...trough.normal],\n rotation: trough.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as ParabolicTroughModel;\n }\n\n private static cloneParabolicDish(parent: ElementModel, dish: ParabolicDishModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.ParabolicDish,\n cx: x,\n cy: y,\n cz: z,\n lx: dish.lx,\n ly: dish.ly,\n lz: dish.lz,\n reflectance: dish.reflectance,\n absorptance: dish.absorptance,\n opticalEfficiency: dish.opticalEfficiency,\n thermalEfficiency: dish.thermalEfficiency,\n receiverRadius: dish.receiverRadius,\n structureType: dish.structureType,\n latusRectum: dish.latusRectum,\n tiltAngle: dish.tiltAngle,\n relativeAzimuth: dish.relativeAzimuth,\n poleRadius: dish.poleRadius,\n poleHeight: dish.poleHeight,\n showLabel: dish.showLabel,\n normal: [...dish.normal],\n rotation: dish.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as ParabolicDishModel;\n }\n\n private static cloneFresnelReflector(\n parent: ElementModel,\n reflector: FresnelReflectorModel,\n x: number,\n y: number,\n z?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.FresnelReflector,\n cx: x,\n cy: y,\n cz: z,\n lx: reflector.lx,\n ly: reflector.ly,\n lz: reflector.lz,\n reflectance: reflector.reflectance,\n moduleLength: reflector.moduleLength,\n tiltAngle: reflector.tiltAngle,\n relativeAzimuth: reflector.relativeAzimuth,\n poleRadius: reflector.poleRadius,\n poleHeight: reflector.poleHeight,\n showLabel: reflector.showLabel,\n normal: [...reflector.normal],\n rotation: reflector.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n receiverId: reflector.receiverId,\n foundationId: foundationId,\n id: short.generate() as string,\n } as FresnelReflectorModel;\n }\n\n private static cloneHeliostat(parent: ElementModel, heliostat: HeliostatModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.Heliostat,\n cx: x,\n cy: y,\n cz: z,\n lx: heliostat.lx,\n ly: heliostat.ly,\n lz: heliostat.lz,\n reflectance: heliostat.reflectance,\n tiltAngle: heliostat.tiltAngle,\n relativeAzimuth: heliostat.relativeAzimuth,\n poleRadius: heliostat.poleRadius,\n poleHeight: heliostat.poleHeight,\n showLabel: heliostat.showLabel,\n normal: [...heliostat.normal],\n rotation: heliostat.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n towerId: heliostat.towerId,\n foundationId: foundationId,\n id: short.generate() as string,\n } as HeliostatModel;\n }\n\n private static cloneWindTurbine(\n parent: ElementModel,\n windTurbine: WindTurbineModel,\n x: number,\n y: number,\n z?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.WindTurbine,\n cx: x,\n cy: y,\n cz: z,\n lx: windTurbine.lx,\n ly: windTurbine.ly,\n lz: windTurbine.lz,\n bladeRadius: windTurbine.bladeRadius,\n towerRadius: windTurbine.towerRadius,\n towerHeight: windTurbine.towerHeight,\n showLabel: windTurbine.showLabel,\n normal: [...windTurbine.normal],\n rotation: windTurbine.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as WindTurbineModel;\n }\n\n private static cloneFoundation(foundation: FoundationModel, x: number, y: number) {\n return {\n type: ObjectType.Foundation,\n cx: x,\n cy: y,\n cz: foundation.cz,\n lx: foundation.lx,\n ly: foundation.ly,\n lz: foundation.lz,\n normal: [...foundation.normal],\n rotation: [...foundation.rotation],\n parentId: foundation.parentId,\n color: foundation.color,\n textureType: foundation.textureType,\n solarStructure: foundation.solarStructure,\n solarUpdraftTower: { ...foundation.solarUpdraftTower },\n solarAbsorberPipe: { ...foundation.solarAbsorberPipe },\n solarPowerTower: { ...foundation.solarPowerTower },\n hvacSystem: { ...foundation.hvacSystem },\n labelHeight: foundation.labelHeight,\n labelSize: foundation.labelSize,\n showLabel: foundation.showLabel,\n rValue: foundation.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE,\n id: short.generate() as string,\n } as FoundationModel;\n }\n\n private static cloneCuboid(parentId: string, cuboid: CuboidModel, x: number, y: number) {\n return {\n type: ObjectType.Cuboid,\n cx: x,\n cy: y,\n cz: cuboid.cz,\n lx: cuboid.lx,\n ly: cuboid.ly,\n lz: cuboid.lz,\n color: cuboid.color,\n faceColors: cuboid.faceColors ? [...cuboid.faceColors] : ['gray', 'gray', 'gray', 'gray', 'gray', 'gray'],\n textureTypes: cuboid.textureTypes\n ? [...cuboid.textureTypes]\n : [\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n ],\n normal: [...cuboid.normal],\n rotation: [...cuboid.rotation],\n stackable: cuboid.stackable,\n enableGroupMaster: cuboid.enableGroupMaster,\n parentId: parentId,\n id: short.generate() as string,\n } as CuboidModel;\n }\n\n private static cloneWall(parent: ElementModel, wall: WallModel, x: number, y: number, z?: number) {\n return {\n type: ObjectType.Wall,\n cx: x,\n cy: y,\n cz: z,\n lx: wall.lx,\n ly: wall.ly,\n lz: wall.lz,\n parapet: { ...wall.parapet },\n eavesLength: wall.eavesLength ?? 0,\n rValue: wall.rValue,\n volumetricHeatCapacity: wall.volumetricHeatCapacity,\n fill: wall.fill,\n leftUnfilledHeight: wall.leftUnfilledHeight,\n rightUnfilledHeight: wall.rightUnfilledHeight,\n leftTopPartialHeight: wall.leftTopPartialHeight,\n rightTopPartialHeight: wall.rightTopPartialHeight,\n leftJoints: [],\n rightJoints: [],\n leftPoint: [...wall.leftPoint],\n rightPoint: [...wall.rightPoint],\n relativeAngle: wall.relativeAngle,\n textureType: wall.textureType,\n color: wall.color,\n normal: [...wall.normal],\n rotation: [...wall.rotation],\n id: short.generate() as string,\n parentId: parent.id,\n foundationId: parent.id,\n wallStructure: wall.wallStructure,\n structureSpacing: wall.structureSpacing,\n structureColor: wall.structureColor,\n structureWidth: wall.structureWidth,\n opacity: wall.opacity,\n roofId: wall.roofId,\n leftRoofHeight: wall.leftRoofHeight,\n rightRoofHeight: wall.rightRoofHeight,\n centerRoofHeight: wall.centerRoofHeight,\n centerLeftRoofHeight: wall.centerLeftRoofHeight,\n centerRightRoofHeight: wall.centerRightRoofHeight,\n } as WallModel;\n }\n\n private static cloneWindow(\n parent: ElementModel,\n window: WindowModel,\n x: number,\n y: number,\n z?: number,\n oldParent?: ElementModel | null,\n ) {\n let foundationId;\n let [lx, ly, lz] = [window.lx, parent.ly, window.lz];\n let cy = 0.1;\n let rotation = [...window.rotation];\n switch (parent.type) {\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n foundationId = parent.parentId;\n rotation = [0, -1, 0];\n break;\n case ObjectType.Roof:\n foundationId = parent.parentId;\n cy = y;\n ly = (parent as RoofModel).thickness;\n break;\n }\n\n // copy to wall\n if (parent.type === ObjectType.Wall) {\n lx = window.lx / parent.lx;\n lz = window.lz / parent.lz;\n }\n return {\n type: ObjectType.Window,\n cx: x,\n cy: cy,\n cz: z,\n lx: lx,\n ly: ly,\n lz: lz,\n uValue: window.uValue,\n horizontalMullion: window.horizontalMullion,\n verticalMullion: window.verticalMullion,\n mullionWidth: window.mullionWidth,\n horizontalMullionSpacing: window.horizontalMullionSpacing,\n verticalMullionSpacing: window.verticalMullionSpacing,\n mullionColor: window.mullionColor,\n frame: window.frame,\n frameWidth: window.frameWidth,\n sillWidth: window.sillWidth,\n windowType: window.windowType,\n archHeight: window.archHeight,\n color: window.color,\n normal: [0, 0, 0],\n rotation: rotation,\n id: short.generate() as string,\n parentId: parent.id,\n foundationId: foundationId,\n tint: window.tint,\n opacity: window.opacity,\n leftShutter: window.leftShutter,\n rightShutter: window.rightShutter,\n shutterColor: window.shutterColor,\n shutterWidth: window.shutterWidth,\n empty: window.empty,\n interior: window.interior,\n parentType: parent.type,\n polygonTop: window.polygonTop,\n } as WindowModel;\n }\n\n private static cloneDoor(parent: ElementModel, door: DoorModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Door,\n cx: x,\n cy: door.cy,\n cz: door.cz,\n lx: door.lx,\n ly: door.ly,\n lz: door.lz,\n color: door.color,\n frameColor: door.frameColor,\n opacity: door.opacity,\n uValue: door.uValue,\n volumetricHeatCapacity: door.volumetricHeatCapacity,\n textureType: door.textureType,\n filled: door.filled,\n interior: door.interior,\n doorType: door.doorType,\n archHeight: door.archHeight,\n normal: [...door.normal],\n rotation: [...door.rotation],\n id: short.generate() as string,\n parentId: parent.id,\n foundationId: foundationId,\n } as DoorModel;\n }\n\n private static cloneRoof(parent: ElementModel, roof: RoofModel, x: number, y: number, z?: number) {\n const newRoof = {\n id: short.generate() as string,\n type: ObjectType.Roof,\n cx: x,\n cy: y,\n cz: z,\n lx: roof.lx,\n ly: roof.ly,\n lz: roof.lz,\n ceiling: roof.ceiling,\n rise: roof.rise,\n color: roof.color,\n rValue: roof.rValue,\n ceilingRValue: roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE,\n volumetricHeatCapacity: roof.volumetricHeatCapacity,\n sideColor: roof.sideColor,\n normal: [...roof.normal],\n rotation: [...roof.rotation],\n parentId: parent.id,\n foundationId: parent.id,\n roofType: roof.roofType,\n roofStructure: roof.roofStructure,\n rafterColor: roof.rafterColor,\n rafterSpacing: roof.rafterSpacing,\n rafterWidth: roof.rafterWidth,\n textureType: roof.textureType,\n thickness: roof.thickness,\n wallsId: [...roof.wallsId], // handled in common store\n opacity: roof.opacity,\n glassTint: roof.glassTint,\n } as RoofModel;\n switch (roof.roofType) {\n case RoofType.Gable:\n (newRoof as GableRoofModel).ridgeLeftPoint = [...(roof as GableRoofModel).ridgeLeftPoint];\n (newRoof as GableRoofModel).ridgeRightPoint = [...(roof as GableRoofModel).ridgeRightPoint];\n break;\n case RoofType.Gambrel:\n const newGambrelRoof = newRoof as GambrelRoofModel;\n const oldGambrelRoof = roof as GambrelRoofModel;\n newGambrelRoof.topRidgePoint = [...oldGambrelRoof.topRidgePoint];\n newGambrelRoof.frontRidgePoint = [...oldGambrelRoof.frontRidgePoint];\n newGambrelRoof.backRidgePoint = [...oldGambrelRoof.backRidgePoint];\n break;\n case RoofType.Hip:\n (newRoof as HipRoofModel).rightRidgeLength = (roof as HipRoofModel).rightRidgeLength;\n (newRoof as HipRoofModel).leftRidgeLength = (roof as HipRoofModel).leftRidgeLength;\n break;\n case RoofType.Mansard:\n (newRoof as MansardRoofModel).ridgeWidth = (roof as MansardRoofModel).ridgeWidth;\n break;\n }\n return newRoof as ElementModel;\n }\n}\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { ViewState } from './ViewState';\r\nimport { immerable } from 'immer';\r\nimport { Rectangle } from '../models/Rectangle';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n DEFAULT_WINDOW_SHININESS,\r\n} from '../constants';\r\n\r\nexport class DefaultViewState implements ViewState {\r\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\r\n [immerable] = true;\r\n\r\n navigationView: boolean;\r\n orthographic: boolean;\r\n enableRotate: boolean;\r\n directLightIntensity: number;\r\n ambientLightIntensity: number;\r\n cameraPosition: number[];\r\n cameraPosition2D: number[];\r\n panCenter: number[];\r\n panCenter2D: number[];\r\n cameraZoom: number;\r\n cameraPositionNav: number[];\r\n cameraRotationNav: number[];\r\n\r\n axes: boolean;\r\n heatFluxScaleFactor: number;\r\n heatFluxColor: string;\r\n heatFluxWidth: number;\r\n solarRadiationHeatMapMaxValue: number;\r\n solarRadiationHeatMapReflectionOnly: boolean; // for heliostats and Fresnel reflectors\r\n shadowEnabled: boolean;\r\n theme: string;\r\n heliodon: boolean;\r\n showSunAngles: boolean;\r\n showAzimuthAngle: boolean;\r\n showElevationAngle: boolean;\r\n showZenithAngle: boolean;\r\n groundImage: boolean;\r\n groundImageType: string;\r\n groundColor: string;\r\n waterSurface: boolean;\r\n solarPanelShininess: number;\r\n windowShininess: number;\r\n\r\n showMapPanel: boolean;\r\n showHeliodonPanel: boolean;\r\n showWeatherPanel: boolean;\r\n showDiurnalTemperaturePanel: boolean;\r\n showStickyNotePanel: boolean;\r\n showSiteInfoPanel: boolean;\r\n showDesignInfoPanel: boolean;\r\n showInstructionPanel: boolean;\r\n showDailyLightSensorPanel: boolean;\r\n showYearlyLightSensorPanel: boolean;\r\n showDailyPvYieldPanel: boolean;\r\n showYearlyPvYieldPanel: boolean;\r\n showSolarPanelVisibilityResultsPanel: boolean;\r\n showDailyParabolicTroughYieldPanel: boolean;\r\n showYearlyParabolicTroughYieldPanel: boolean;\r\n showDailyParabolicDishYieldPanel: boolean;\r\n showYearlyParabolicDishYieldPanel: boolean;\r\n showDailyFresnelReflectorYieldPanel: boolean;\r\n showYearlyFresnelReflectorYieldPanel: boolean;\r\n showDailyHeliostatYieldPanel: boolean;\r\n showYearlyHeliostatYieldPanel: boolean;\r\n showDailyUpdraftTowerYieldPanel: boolean;\r\n showYearlyUpdraftTowerYieldPanel: boolean;\r\n showDailyBuildingEnergyPanel: boolean;\r\n showYearlyBuildingEnergyPanel: boolean;\r\n showEvolutionPanel: boolean;\r\n autoRotate: boolean;\r\n\r\n heliodonPanelX: number;\r\n heliodonPanelY: number;\r\n mapPanelX: number;\r\n mapPanelY: number;\r\n weatherPanelRect: Rectangle;\r\n diurnalTemperaturePanelRect: Rectangle;\r\n stickyNotePanelRect: Rectangle;\r\n dailyLightSensorPanelRect: Rectangle;\r\n yearlyLightSensorPanelRect: Rectangle;\r\n yearlyLightSensorPanelShowDaylight: boolean;\r\n yearlyLightSensorPanelShowClearness: boolean;\r\n dailyPvYieldPanelRect: Rectangle;\r\n yearlyPvYieldPanelRect: Rectangle;\r\n visibilityResultsPanelRect: Rectangle;\r\n dailyParabolicTroughYieldPanelRect: Rectangle;\r\n yearlyParabolicTroughYieldPanelRect: Rectangle;\r\n dailyParabolicDishYieldPanelRect: Rectangle;\r\n yearlyParabolicDishYieldPanelRect: Rectangle;\r\n dailyFresnelReflectorYieldPanelRect: Rectangle;\r\n yearlyFresnelReflectorYieldPanelRect: Rectangle;\r\n dailyHeliostatYieldPanelRect: Rectangle;\r\n yearlyHeliostatYieldPanelRect: Rectangle;\r\n dailyUpdraftTowerYieldPanelRect: Rectangle;\r\n yearlyUpdraftTowerYieldPanelRect: Rectangle;\r\n dailyBuildingEnergyPanelRect: Rectangle;\r\n yearlyBuildingEnergyPanelRect: Rectangle;\r\n evolutionPanelRect: Rectangle;\r\n\r\n mapZoom: number;\r\n mapType: string;\r\n mapTilt: number;\r\n\r\n constructor() {\r\n this.navigationView = false;\r\n this.orthographic = false;\r\n this.enableRotate = true;\r\n this.directLightIntensity = 1;\r\n this.ambientLightIntensity = 0.1;\r\n this.cameraPosition = [5, -30, 1];\r\n this.cameraPosition2D = [0, 0, 150];\r\n this.panCenter = [0, 0, 0];\r\n this.panCenter2D = [0, 0, 0];\r\n this.cameraZoom = 20;\r\n this.cameraPositionNav = [5, -30, 1];\r\n this.cameraRotationNav = [1.5374753309166491, 0.16505866097993566, 0.005476951734475092];\r\n\r\n this.axes = true;\r\n this.heatFluxScaleFactor = DEFAULT_HEAT_FLUX_SCALE_FACTOR;\r\n this.heatFluxColor = DEFAULT_HEAT_FLUX_COLOR;\r\n this.heatFluxWidth = DEFAULT_HEAT_FLUX_WIDTH;\r\n this.solarRadiationHeatMapMaxValue = 5;\r\n this.solarRadiationHeatMapReflectionOnly = false;\r\n this.shadowEnabled = true;\r\n this.theme = 'Default';\r\n this.heliodon = false;\r\n this.showSunAngles = false;\r\n this.showAzimuthAngle = true;\r\n this.showElevationAngle = true;\r\n this.showZenithAngle = true;\r\n this.groundImage = false;\r\n this.groundImageType = 'roadmap';\r\n this.groundColor = '#16A5A5';\r\n this.waterSurface = false;\r\n this.solarPanelShininess = DEFAULT_SOLAR_PANEL_SHININESS;\r\n this.windowShininess = DEFAULT_WINDOW_SHININESS;\r\n\r\n this.showMapPanel = false;\r\n this.showHeliodonPanel = false;\r\n this.showWeatherPanel = false;\r\n this.showDiurnalTemperaturePanel = false;\r\n this.showStickyNotePanel = false;\r\n this.showSiteInfoPanel = true;\r\n this.showDesignInfoPanel = false;\r\n this.showInstructionPanel = true;\r\n this.showDailyLightSensorPanel = false;\r\n this.showYearlyLightSensorPanel = false;\r\n this.showDailyPvYieldPanel = false;\r\n this.showYearlyPvYieldPanel = false;\r\n this.showSolarPanelVisibilityResultsPanel = false;\r\n this.showDailyParabolicTroughYieldPanel = false;\r\n this.showYearlyParabolicTroughYieldPanel = false;\r\n this.showDailyParabolicDishYieldPanel = false;\r\n this.showYearlyParabolicDishYieldPanel = false;\r\n this.showDailyFresnelReflectorYieldPanel = false;\r\n this.showYearlyFresnelReflectorYieldPanel = false;\r\n this.showDailyHeliostatYieldPanel = false;\r\n this.showYearlyHeliostatYieldPanel = false;\r\n this.showDailyUpdraftTowerYieldPanel = false;\r\n this.showYearlyUpdraftTowerYieldPanel = false;\r\n this.showDailyBuildingEnergyPanel = false;\r\n this.showYearlyBuildingEnergyPanel = false;\r\n this.showEvolutionPanel = false;\r\n this.autoRotate = false;\r\n\r\n this.heliodonPanelX = 0;\r\n this.heliodonPanelY = 0;\r\n this.mapPanelX = 0;\r\n this.mapPanelY = 0;\r\n this.weatherPanelRect = new Rectangle(0, 0, 500, 500);\r\n this.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\r\n this.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\r\n this.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\r\n this.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\r\n this.yearlyLightSensorPanelShowDaylight = false;\r\n this.yearlyLightSensorPanelShowClearness = false;\r\n this.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\r\n this.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\r\n this.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\r\n\r\n this.mapZoom = 18;\r\n this.mapType = 'roadmap';\r\n this.mapTilt = 0;\r\n }\r\n\r\n static resetViewState(viewState: ViewState) {\r\n viewState.navigationView = false;\r\n viewState.orthographic = false;\r\n viewState.enableRotate = true;\r\n viewState.cameraPosition = [5, -30, 1];\r\n viewState.panCenter = [0, 0, 0];\r\n viewState.cameraZoom = 20;\r\n viewState.cameraPosition2D = [0, 0, 20];\r\n viewState.panCenter2D = [0, 0, 0];\r\n viewState.directLightIntensity = 1;\r\n viewState.ambientLightIntensity = 0.1;\r\n viewState.cameraPositionNav = [5, -30, 1];\r\n viewState.cameraRotationNav = [1.5374753309166491, 0.16505866097993566, 0.005476951734475092];\r\n\r\n viewState.axes = true;\r\n viewState.heatFluxScaleFactor = DEFAULT_HEAT_FLUX_SCALE_FACTOR;\r\n viewState.heatFluxColor = DEFAULT_HEAT_FLUX_COLOR;\r\n viewState.heatFluxWidth = DEFAULT_HEAT_FLUX_WIDTH;\r\n viewState.solarRadiationHeatMapMaxValue = 5;\r\n viewState.solarRadiationHeatMapReflectionOnly = false;\r\n viewState.shadowEnabled = true;\r\n viewState.theme = 'Default';\r\n viewState.heliodon = false;\r\n viewState.showSunAngles = false;\r\n viewState.showAzimuthAngle = true;\r\n viewState.showElevationAngle = true;\r\n viewState.showZenithAngle = true;\r\n viewState.groundImage = false;\r\n viewState.groundImageType = 'roadmap';\r\n viewState.groundColor = '#16A5A5';\r\n viewState.waterSurface = false;\r\n viewState.solarPanelShininess = DEFAULT_SOLAR_PANEL_SHININESS;\r\n viewState.windowShininess = DEFAULT_WINDOW_SHININESS;\r\n\r\n viewState.showMapPanel = false;\r\n viewState.showHeliodonPanel = false;\r\n viewState.showWeatherPanel = false;\r\n viewState.showDiurnalTemperaturePanel = false;\r\n viewState.showStickyNotePanel = false;\r\n viewState.showSiteInfoPanel = true;\r\n viewState.showDesignInfoPanel = true;\r\n viewState.showInstructionPanel = true;\r\n viewState.showDailyLightSensorPanel = false;\r\n viewState.showYearlyLightSensorPanel = false;\r\n viewState.showDailyPvYieldPanel = false;\r\n viewState.showYearlyPvYieldPanel = false;\r\n viewState.showSolarPanelVisibilityResultsPanel = false;\r\n viewState.showDailyParabolicTroughYieldPanel = false;\r\n viewState.showYearlyParabolicTroughYieldPanel = false;\r\n viewState.showDailyParabolicDishYieldPanel = false;\r\n viewState.showYearlyParabolicDishYieldPanel = false;\r\n viewState.showDailyFresnelReflectorYieldPanel = false;\r\n viewState.showYearlyFresnelReflectorYieldPanel = false;\r\n viewState.showDailyHeliostatYieldPanel = false;\r\n viewState.showYearlyHeliostatYieldPanel = false;\r\n viewState.showDailyUpdraftTowerYieldPanel = false;\r\n viewState.showYearlyUpdraftTowerYieldPanel = false;\r\n viewState.showDailyBuildingEnergyPanel = false;\r\n viewState.showYearlyBuildingEnergyPanel = false;\r\n viewState.showEvolutionPanel = false;\r\n viewState.autoRotate = false;\r\n\r\n viewState.heliodonPanelX = 0;\r\n viewState.heliodonPanelY = 0;\r\n viewState.mapPanelX = 0;\r\n viewState.mapPanelY = 0;\r\n viewState.weatherPanelRect = new Rectangle(0, 0, 500, 500);\r\n viewState.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\r\n viewState.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\r\n viewState.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\r\n viewState.yearlyLightSensorPanelShowDaylight = false;\r\n viewState.yearlyLightSensorPanelShowClearness = false;\r\n viewState.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\r\n viewState.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\r\n viewState.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\r\n\r\n viewState.mapZoom = 18;\r\n viewState.mapType = 'roadmap';\r\n viewState.mapTilt = 0;\r\n }\r\n}\r\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Undoable } from './Undoable';\n\nexport class UndoManager {\n private commands: Undoable[];\n private index: number;\n private limit: number;\n private isExecuting: boolean;\n\n constructor() {\n this.commands = [];\n this.index = -1;\n this.limit = 0;\n this.isExecuting = false;\n }\n\n // Add a command to the queue\n add(command: Undoable): void {\n if (this.isExecuting) {\n return;\n }\n // if we are here after having called undo, invalidate items higher on the stack\n this.commands.splice(this.index + 1, this.commands.length - this.index);\n this.commands.push(command);\n // if limit is set, remove items from the start of the commands array\n if (this.limit > 0 && this.commands.length > this.limit) {\n this.commands.splice(0, this.commands.length - this.limit);\n }\n // set the current index to the end\n this.index = this.commands.length - 1;\n }\n\n // Call the undo function at the current index and decrease the index by 1.\n undo(): string | undefined {\n const command = this.commands[this.index];\n if (!command) {\n return undefined;\n }\n this.isExecuting = true;\n command.undo();\n this.isExecuting = false;\n this.index--;\n return command.name;\n }\n\n // Call the redo function at the next index and increase the index by 1.\n redo(): string | undefined {\n const command = this.commands[this.index + 1];\n if (!command) {\n return undefined;\n }\n this.isExecuting = true;\n command.redo();\n this.isExecuting = false;\n this.index++;\n return command.name;\n }\n\n // Clears the memory, losing all stored states. Reset the index.\n clear(): void {\n this.commands = [];\n this.index = -1;\n }\n\n hasUndo(): boolean {\n return this.index !== -1;\n }\n\n hasRedo(): boolean {\n return this.index < this.commands.length - 1;\n }\n\n getLastUndoName(): string | undefined {\n const command = this.commands[this.index];\n if (!command) {\n return undefined;\n }\n return command.name;\n }\n\n getLastRedoName(): string | undefined {\n const command = this.commands[this.index + 1];\n if (!command) {\n return undefined;\n }\n return command.name;\n }\n\n setLimit(l: number): void {\n this.limit = l;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { SolarPanelArrayLayoutParams } from './SolarPanelArrayLayoutParams';\nimport { Orientation, RowAxis } from '../types';\nimport { immerable } from 'immer';\n\nexport class DefaultSolarPanelArrayLayoutParams implements SolarPanelArrayLayoutParams {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n pvModelName: string;\n rowAxis: RowAxis;\n orientation: Orientation;\n tiltAngle: number;\n rowsPerRack: number;\n interRowSpacing: number;\n poleHeight: number;\n poleSpacing: number;\n margin: number;\n\n constructor() {\n this.pvModelName = 'CS6X-355P-FG';\n this.rowAxis = RowAxis.leftRight;\n this.orientation = Orientation.landscape;\n this.tiltAngle = 0;\n this.rowsPerRack = 1;\n this.interRowSpacing = 2;\n this.poleHeight = 1;\n this.poleSpacing = 3;\n this.margin = 0;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nexport class ElementCounter {\n foundationCount: number = 0;\n cuboidCount: number = 0;\n wallCount: number = 0;\n windowCount: number = 0;\n doorCount: number = 0;\n humanCount: number = 0;\n treeCount: number = 0;\n flowerCount: number = 0;\n polygonCount: number = 0;\n sensorCount: number = 0;\n insideLightCount: number = 0;\n outsideLightCount: number = 0;\n solarPanelCount: number = 0;\n solarPanelModuleCount: number = 0;\n parabolicDishCount: number = 0;\n parabolicTroughCount: number = 0;\n fresnelReflectorCount: number = 0;\n heliostatCount: number = 0;\n solarUpdraftTowerCount: number = 0;\n windTurbineCount: number = 0;\n\n gotSome() {\n return (\n this.foundationCount > 0 ||\n this.cuboidCount > 0 ||\n this.wallCount > 0 ||\n this.windowCount > 0 ||\n this.doorCount > 0 ||\n this.humanCount > 0 ||\n this.treeCount > 0 ||\n this.flowerCount > 0 ||\n this.polygonCount > 0 ||\n this.sensorCount > 0 ||\n this.insideLightCount > 0 ||\n this.outsideLightCount > 0 ||\n this.solarPanelCount > 0 ||\n this.parabolicTroughCount > 0 ||\n this.parabolicDishCount > 0 ||\n this.fresnelReflectorCount > 0 ||\n this.heliostatCount > 0 ||\n this.solarUpdraftTowerCount > 0 ||\n this.windTurbineCount > 0\n );\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { GeneticAlgorithmParams } from './GeneticAlgorithmParams';\nimport { SearchMethod, GeneticAlgorithmSelectionMethod, ObjectiveFunctionType, DesignProblem } from '../types';\nimport { immerable } from 'immer';\n\nexport class DefaultGeneticAlgorithmParams implements GeneticAlgorithmParams {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n problem: DesignProblem;\n objectiveFunctionType: ObjectiveFunctionType;\n selectionMethod: GeneticAlgorithmSelectionMethod;\n searchMethod: SearchMethod;\n populationSize: number;\n maximumGenerations: number;\n selectionRate: number;\n crossoverRate: number;\n mutationRate: number;\n convergenceThreshold: number;\n localSearchRadius: number;\n\n constructor(problem: DesignProblem) {\n this.problem = problem;\n this.objectiveFunctionType = ObjectiveFunctionType.DAILY_TOTAL_OUTPUT;\n this.selectionMethod = GeneticAlgorithmSelectionMethod.ROULETTE_WHEEL;\n this.searchMethod = SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION;\n this.populationSize = 20;\n this.maximumGenerations = 5;\n this.selectionRate = 0.5;\n this.crossoverRate = 0.5;\n this.mutationRate = 0.1;\n this.convergenceThreshold = 0.01;\n this.localSearchRadius = 0.1;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { SearchMethod, ObjectiveFunctionType, DesignProblem } from '../types';\nimport { ParticleSwarmOptimizationParams } from './ParticleSwarmOptimizationParams';\nimport { immerable } from 'immer';\n\nexport class DefaultParticleSwarmOptimizationParams implements ParticleSwarmOptimizationParams {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n problem: DesignProblem;\n objectiveFunctionType: ObjectiveFunctionType;\n searchMethod: SearchMethod;\n swarmSize: number;\n maximumSteps: number;\n vmax: number;\n inertia: number;\n cognitiveCoefficient: number;\n socialCoefficient: number;\n convergenceThreshold: number;\n localSearchRadius: number;\n\n constructor(problem: DesignProblem) {\n this.problem = problem;\n this.objectiveFunctionType = ObjectiveFunctionType.DAILY_TOTAL_OUTPUT;\n this.searchMethod = SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION;\n this.swarmSize = 20;\n this.maximumSteps = 5;\n this.vmax = 0.01;\n this.inertia = 0.8;\n this.cognitiveCoefficient = 0.1;\n this.socialCoefficient = 0.1;\n this.convergenceThreshold = 0.01;\n this.localSearchRadius = 0.1;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { EvolutionaryAlgorithmState } from './EvolutionaryAlgorithmState';\nimport { GeneticAlgorithmParams } from './GeneticAlgorithmParams';\nimport { DefaultGeneticAlgorithmParams } from './DefaultGeneticAlgorithmParams';\nimport { ParticleSwarmOptimizationParams } from './ParticleSwarmOptimizationParams';\nimport { DefaultParticleSwarmOptimizationParams } from './DefaultParticleSwarmOptimizationParams';\nimport { DesignProblem } from '../types';\nimport { immerable } from 'immer';\n\nexport class DefaultEvolutionaryAlgorithmState implements EvolutionaryAlgorithmState {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n geneticAlgorithmParams: GeneticAlgorithmParams;\n particleSwarmOptimizationParams: ParticleSwarmOptimizationParams;\n\n constructor() {\n this.geneticAlgorithmParams = new DefaultGeneticAlgorithmParams(DesignProblem.SOLAR_PANEL_TILT_ANGLE);\n this.particleSwarmOptimizationParams = new DefaultParticleSwarmOptimizationParams(\n DesignProblem.SOLAR_PANEL_TILT_ANGLE,\n );\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { SolarPanelArrayLayoutConstraints } from './SolarPanelArrayLayoutConstraints';\nimport { HALF_PI } from '../constants';\nimport { immerable } from 'immer';\nimport { Orientation, RowAxis } from '../types';\n\nexport class DefaultSolarPanelArrayLayoutConstraints implements SolarPanelArrayLayoutConstraints {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n minimumInterRowSpacing: number;\n maximumInterRowSpacing: number;\n minimumRowsPerRack: number;\n maximumRowsPerRack: number;\n minimumTiltAngle: number;\n maximumTiltAngle: number;\n poleHeight: number;\n poleSpacing: number;\n orientation: Orientation;\n pvModelName: string;\n rowAxis: RowAxis;\n margin?: number;\n\n constructor() {\n this.minimumInterRowSpacing = 2;\n this.maximumInterRowSpacing = 10;\n this.minimumRowsPerRack = 1;\n this.maximumRowsPerRack = 6;\n this.minimumTiltAngle = -HALF_PI;\n this.maximumTiltAngle = HALF_PI;\n this.poleHeight = 1;\n this.poleSpacing = 5;\n this.orientation = Orientation.landscape;\n this.pvModelName = 'CS6X-355P-FG';\n this.rowAxis = RowAxis.leftRight;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { EconomicsParams } from './EconomicsParams';\nimport { immerable } from 'immer';\n\nexport class DefaultEconomicsParams implements EconomicsParams {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n projectLifeSpan: number;\n electricitySellingPrice: number;\n operationalCostPerUnit: number;\n\n constructor() {\n this.projectLifeSpan = 25;\n this.electricitySellingPrice = 0.25; // US dollars per kWh\n this.operationalCostPerUnit = 0.15; // US dollars per day\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { immerable } from 'immer';\nimport { ActionState } from './ActionState';\nimport {\n CuboidTexture,\n DoorTexture,\n FlowerType,\n FoundationTexture,\n HumanName,\n Orientation,\n ParabolicDishStructureType,\n RoofTexture,\n TreeType,\n WallTexture,\n} from '../types';\nimport { ParapetArgs, WallStructure } from '../models/WallModel';\nimport { WindowType } from 'src/models/WindowModel';\nimport { RoofStructure } from '../models/RoofModel';\nimport { DoorType } from 'src/models/DoorModel';\nimport {\n DEFAULT_CEILING_R_VALUE,\n DEFAULT_DOOR_U_VALUE,\n DEFAULT_GROUND_FLOOR_R_VALUE,\n DEFAULT_ROOF_R_VALUE,\n DEFAULT_WALL_R_VALUE,\n DEFAULT_WINDOW_U_VALUE,\n} from '../constants';\nimport { DEFAULT_PARAPET_SETTINGS } from 'src/views/wall/parapet';\n\nexport class DefaultActionState implements ActionState {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n humanName: HumanName;\n\n flowerType: FlowerType;\n\n treeType: TreeType;\n treeSpread: number;\n treeHeight: number;\n\n foundationHeight: number;\n foundationColor: string;\n foundationTexture: FoundationTexture;\n groundFloorRValue: number;\n\n cuboidHeight: number;\n cuboidFaceColors: string[];\n cuboidFaceTextures: CuboidTexture[];\n cuboidStackable: boolean;\n\n wallHeight: number;\n wallThickness: number;\n wallColor: string;\n wallTexture: WallTexture;\n wallStructure: WallStructure;\n wallStructureSpacing: number;\n wallStructureWidth: number;\n wallStructureColor: string;\n wallOpacity: number;\n wallRValue: number;\n wallVolumetricHeatCapacity: number;\n wallEavesLength: number;\n wallParapet: ParapetArgs;\n\n roofColor: string;\n roofSideColor: string;\n roofTexture: RoofTexture;\n roofThickness: number;\n roofStructure: RoofStructure;\n roofGlassOpacity: number;\n roofGlassTint: string;\n roofRafterWidth: number;\n roofRafterSpacing: number;\n roofRafterColor: string;\n roofRValue: number;\n roofVolumetricHeatCapacity: number;\n roofRise: number;\n roofCeiling: boolean;\n ceilingRValue: number;\n\n doorColor: string;\n doorFrameColor: string;\n doorTexture: DoorTexture;\n doorType: DoorType;\n doorArchHeight: number;\n doorFilled: boolean;\n doorInterior: boolean;\n doorUValue: number;\n doorOpacity: number;\n doorVolumetricHeatCapacity: number;\n\n windowWidth: number;\n windowHeight: number;\n windowColor: string;\n windowTint: string;\n windowOpacity: number;\n windowUValue: number;\n windowHorizontalMullion: boolean;\n windowVerticalMullion: boolean;\n windowMullionWidth: number;\n windowHorizontalMullionSpacing: number;\n windowVerticalMullionSpacing: number;\n windowMullionColor: string;\n windowShutterLeft: boolean;\n windowShutterRight: boolean;\n windowShutterColor: string;\n windowShutterWidth: number;\n windowFrame: boolean;\n windowFrameWidth: number;\n windowSillWidth: number;\n windowType: WindowType;\n windowArchHeight: number;\n windowEmpty: boolean;\n windowInterior: boolean;\n\n solarPanelModelName: string;\n solarPanelOrientation: Orientation;\n solarPanelPoleHeight: number;\n solarPanelPoleSpacing: number;\n solarPanelTiltAngle: number;\n solarPanelRelativeAzimuth: number;\n solarPanelFrameColor: string;\n\n parabolicDishReflectance: number;\n parabolicDishAbsorptance: number;\n parabolicDishOpticalEfficiency: number;\n parabolicDishThermalEfficiency: number;\n parabolicDishRimDiameter: number;\n parabolicDishLatusRectum: number;\n parabolicDishPoleHeight: number;\n parabolicDishPoleRadius: number;\n parabolicDishReceiverStructure: ParabolicDishStructureType;\n\n parabolicTroughReflectance: number;\n parabolicTroughAbsorptance: number;\n parabolicTroughOpticalEfficiency: number;\n parabolicTroughThermalEfficiency: number;\n parabolicTroughLatusRectum: number;\n parabolicTroughPoleHeight: number;\n parabolicTroughWidth: number;\n parabolicTroughModuleLength: number;\n\n fresnelReflectorReceiver: string;\n fresnelReflectorReflectance: number;\n fresnelReflectorPoleHeight: number;\n fresnelReflectorWidth: number;\n fresnelReflectorModuleLength: number;\n\n heliostatTower: string;\n heliostatReflectance: number;\n heliostatPoleHeight: number;\n heliostatPoleRadius: number;\n heliostatWidth: number;\n heliostatLength: number;\n\n lightColor: string;\n lightIntensity: number;\n lightDistance: number;\n\n constructor() {\n this.humanName = HumanName.Jack;\n\n this.flowerType = FlowerType.YellowFlower;\n\n this.treeType = TreeType.Dogwood;\n this.treeSpread = 3;\n this.treeHeight = 4;\n\n this.foundationHeight = 0.1;\n this.foundationColor = '#808080';\n this.foundationTexture = FoundationTexture.NoTexture;\n this.groundFloorRValue = DEFAULT_GROUND_FLOOR_R_VALUE;\n\n this.cuboidHeight = 4;\n this.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\n this.cuboidFaceTextures = [\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n ];\n this.cuboidStackable = false;\n\n this.wallHeight = 5;\n this.wallThickness = 0.3;\n this.wallColor = '#ffffff';\n this.wallTexture = WallTexture.Default;\n this.wallStructure = WallStructure.Default;\n this.wallStructureSpacing = 2;\n this.wallStructureWidth = 0.1;\n this.wallStructureColor = '#ffffff';\n this.wallOpacity = 0.5;\n this.wallRValue = DEFAULT_WALL_R_VALUE;\n this.wallVolumetricHeatCapacity = 0.5;\n this.wallEavesLength = 0.3;\n this.wallParapet = DEFAULT_PARAPET_SETTINGS;\n\n this.roofColor = '#454769';\n this.roofSideColor = '#ffffff';\n this.roofTexture = RoofTexture.Default;\n this.roofThickness = 0.2;\n this.roofStructure = RoofStructure.Default;\n this.roofGlassOpacity = 0.5;\n this.roofGlassTint = '#73D8FF';\n this.roofRafterWidth = 0.1;\n this.roofRafterSpacing = 1;\n this.roofRafterColor = '#ffffff';\n this.roofRValue = DEFAULT_ROOF_R_VALUE;\n this.roofVolumetricHeatCapacity = 0.5;\n this.roofRise = 2;\n this.roofCeiling = false;\n this.ceilingRValue = DEFAULT_CEILING_R_VALUE;\n\n this.doorColor = '#ffffff';\n this.doorFrameColor = '#ffffff';\n this.doorTexture = DoorTexture.Default;\n this.doorType = DoorType.Default;\n this.doorArchHeight = 1;\n this.doorFilled = true;\n this.doorInterior = false;\n this.doorUValue = DEFAULT_DOOR_U_VALUE;\n this.doorOpacity = 1;\n this.doorVolumetricHeatCapacity = 0.5;\n\n this.windowWidth = 1;\n this.windowHeight = 1;\n this.windowColor = '#ffffff';\n this.windowTint = '#73D8FF';\n this.windowOpacity = 0.5;\n this.windowUValue = DEFAULT_WINDOW_U_VALUE;\n this.windowHorizontalMullion = true;\n this.windowVerticalMullion = true;\n this.windowMullionWidth = 0.06;\n this.windowHorizontalMullionSpacing = 0.5;\n this.windowVerticalMullionSpacing = 0.5;\n this.windowMullionColor = '#ffffff';\n this.windowFrame = false;\n this.windowFrameWidth = 0.1;\n this.windowSillWidth = 0.1;\n this.windowType = WindowType.Default;\n this.windowArchHeight = 1;\n // I worry about this using Shutter objects may cause default to be accidentally overwritten.\n this.windowShutterLeft = false;\n this.windowShutterRight = false;\n this.windowShutterColor = 'gray';\n this.windowShutterWidth = 0.5;\n this.windowEmpty = false;\n this.windowInterior = false;\n\n this.solarPanelModelName = 'SPR-X21-335-BLK';\n this.solarPanelOrientation = Orientation.landscape;\n this.solarPanelPoleHeight = 1;\n this.solarPanelPoleSpacing = 3;\n this.solarPanelTiltAngle = 0;\n this.solarPanelRelativeAzimuth = 0;\n this.solarPanelFrameColor = '#ffffff';\n\n this.parabolicDishReflectance = 0.9;\n this.parabolicDishAbsorptance = 0.95;\n this.parabolicDishOpticalEfficiency = 0.7;\n this.parabolicDishThermalEfficiency = 0.3;\n this.parabolicDishRimDiameter = 4;\n this.parabolicDishLatusRectum = 8;\n this.parabolicDishPoleHeight = 0.2;\n this.parabolicDishPoleRadius = 0.1;\n this.parabolicDishReceiverStructure = ParabolicDishStructureType.CentralPole;\n\n this.parabolicTroughReflectance = 0.9;\n this.parabolicTroughAbsorptance = 0.95;\n this.parabolicTroughOpticalEfficiency = 0.7;\n this.parabolicTroughThermalEfficiency = 0.3;\n this.parabolicTroughLatusRectum = 2;\n this.parabolicTroughPoleHeight = 0.2;\n this.parabolicTroughWidth = 2;\n this.parabolicTroughModuleLength = 3;\n\n this.fresnelReflectorReceiver = 'None';\n this.fresnelReflectorReflectance = 0.9;\n this.fresnelReflectorPoleHeight = 0.2;\n this.fresnelReflectorWidth = 2;\n this.fresnelReflectorModuleLength = 3;\n\n this.heliostatTower = 'None';\n this.heliostatReflectance = 0.9;\n this.heliostatPoleHeight = 0.2;\n this.heliostatPoleRadius = 0.1;\n this.heliostatWidth = 4;\n this.heliostatLength = 2;\n\n this.lightColor = '#ffff99';\n this.lightIntensity = 3;\n this.lightDistance = 5;\n }\n}\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { immerable } from 'immer';\nimport { GraphState } from './GraphState';\n\nexport class DefaultGraphState implements GraphState {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n dailyPvIndividualOutputs: boolean;\n yearlyPvIndividualOutputs: boolean;\n\n dailyParabolicDishIndividualOutputs: boolean;\n yearlyParabolicDishIndividualOutputs: boolean;\n\n dailyParabolicTroughIndividualOutputs: boolean;\n yearlyParabolicTroughIndividualOutputs: boolean;\n\n dailyFresnelReflectorIndividualOutputs: boolean;\n yearlyFresnelReflectorIndividualOutputs: boolean;\n\n dailyHeliostatIndividualOutputs: boolean;\n yearlyHeliostatIndividualOutputs: boolean;\n\n dailyUpdraftTowerIndividualOutputs: boolean;\n yearlyUpdraftTowerIndividualOutputs: boolean;\n\n constructor() {\n this.dailyPvIndividualOutputs = false;\n this.yearlyPvIndividualOutputs = false;\n\n this.dailyParabolicDishIndividualOutputs = false;\n this.yearlyParabolicDishIndividualOutputs = false;\n\n this.dailyParabolicTroughIndividualOutputs = false;\n this.yearlyParabolicTroughIndividualOutputs = false;\n\n this.dailyFresnelReflectorIndividualOutputs = false;\n this.yearlyFresnelReflectorIndividualOutputs = false;\n\n this.dailyHeliostatIndividualOutputs = false;\n this.yearlyHeliostatIndividualOutputs = false;\n\n this.dailyUpdraftTowerIndividualOutputs = false;\n this.yearlyUpdraftTowerIndividualOutputs = false;\n }\n}\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Design, DesignProblem, Orientation } from '../types';\nimport i18n from '../i18n/i18n';\nimport { Util } from '../Util';\n\nexport class ProjectUtil {\n static getDefaultHiddenParameters(projectType: DesignProblem): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n return ['latitude', 'orientation', 'poleHeight'];\n }\n return [];\n }\n\n static getVariables(projectType: DesignProblem, hidden: string[]): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: string[] = [];\n if (!hidden.includes('rowWidth')) a.push('rowWidth');\n if (!hidden.includes('tiltAngle')) a.push('tiltAngle');\n if (!hidden.includes('interRowSpacing')) a.push('interRowSpacing');\n if (!hidden.includes('latitude')) a.push('latitude');\n if (!hidden.includes('orientation')) a.push('orientation');\n if (!hidden.includes('poleHeight')) a.push('poleHeight');\n if (!hidden.includes('unitCost')) a.push('unitCost');\n if (!hidden.includes('sellingPrice')) a.push('sellingPrice');\n if (!hidden.includes('totalYearlyCost')) a.push('totalYearlyCost');\n if (!hidden.includes('totalYearlyYield')) a.push('totalYearlyYield');\n if (!hidden.includes('meanYearlyYield')) a.push('meanYearlyYield');\n if (!hidden.includes('yearlyProfit')) a.push('yearlyProfit');\n return a;\n }\n return [];\n }\n\n static getTitles(projectType: DesignProblem, l: { lng: string }, hidden: string[]): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: string[] = [];\n if (!hidden.includes('rowWidth')) a.push(i18n.t('polygonMenu.SolarPanelArrayRowWidth', l));\n if (!hidden.includes('tiltAngle')) a.push(i18n.t('polygonMenu.SolarPanelArrayTiltAngle', l));\n if (!hidden.includes('interRowSpacing')) a.push(i18n.t('polygonMenu.SolarPanelArrayRowSpacing', l));\n if (!hidden.includes('latitude')) a.push(i18n.t('word.Latitude', l));\n if (!hidden.includes('orientation')) a.push(i18n.t('polygonMenu.SolarPanelArrayOrientation', l));\n if (!hidden.includes('poleHeight')) a.push(i18n.t('polygonMenu.SolarPanelArrayPoleHeight', l));\n if (!hidden.includes('unitCost')) a.push(i18n.t('economicsPanel.UnitCost', l));\n if (!hidden.includes('sellingPrice')) a.push(i18n.t('economicsPanel.SellingPrice', l));\n if (!hidden.includes('totalYearlyCost')) a.push(i18n.t('polygonMenu.SolarPanelArrayTotalYearlyCost', l));\n if (!hidden.includes('totalYearlyYield')) a.push(i18n.t('polygonMenu.SolarPanelArrayTotalYearlyYield', l));\n if (!hidden.includes('meanYearlyYield')) a.push(i18n.t('polygonMenu.SolarPanelArrayMeanYearlyYield', l));\n if (!hidden.includes('yearlyProfit')) a.push(i18n.t('polygonMenu.SolarPanelArrayYearlyProfit', l));\n return a;\n }\n return [];\n }\n\n static getTypes(projectType: DesignProblem, hidden: string[]): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: string[] = [];\n if (!hidden.includes('rowWidth')) a.push('number');\n if (!hidden.includes('tiltAngle')) a.push('number');\n if (!hidden.includes('interRowSpacing')) a.push('number');\n if (!hidden.includes('latitude')) a.push('number');\n if (!hidden.includes('orientation')) a.push('boolean');\n if (!hidden.includes('poleHeight')) a.push('number');\n if (!hidden.includes('unitCost')) a.push('number');\n if (!hidden.includes('sellingPrice')) a.push('number');\n if (!hidden.includes('totalYearlyCost')) a.push('number');\n if (!hidden.includes('totalYearlyYield')) a.push('number');\n if (!hidden.includes('meanYearlyYield')) a.push('number');\n if (!hidden.includes('yearlyProfit')) a.push('number');\n return a;\n }\n return [];\n }\n\n static getDigits(projectType: DesignProblem, hidden: string[]): number[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: number[] = [];\n if (!hidden.includes('rowWidth')) a.push(0);\n if (!hidden.includes('tiltAngle')) a.push(1);\n if (!hidden.includes('interRowSpacing')) a.push(1);\n if (!hidden.includes('latitude')) a.push(1);\n if (!hidden.includes('orientation')) a.push(0);\n if (!hidden.includes('poleHeight')) a.push(1);\n if (!hidden.includes('unitCost')) a.push(2);\n if (!hidden.includes('sellingPrice')) a.push(2);\n if (!hidden.includes('totalYearlyCost')) a.push(1);\n if (!hidden.includes('totalYearlyYield')) a.push(1);\n if (!hidden.includes('meanYearlyYield')) a.push(1);\n if (!hidden.includes('yearlyProfit')) a.push(3);\n return a;\n }\n return [];\n }\n\n static getTickIntegers(projectType: DesignProblem, hidden: string[]): boolean[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: boolean[] = [];\n if (!hidden.includes('rowWidth')) a.push(true);\n if (!hidden.includes('tiltAngle')) a.push(false);\n if (!hidden.includes('interRowSpacing')) a.push(false);\n if (!hidden.includes('latitude')) a.push(false);\n if (!hidden.includes('orientation')) a.push(true);\n if (!hidden.includes('poleHeight')) a.push(false);\n if (!hidden.includes('unitCost')) a.push(false);\n if (!hidden.includes('sellingPrice')) a.push(false);\n if (!hidden.includes('totalYearlyCost')) a.push(false);\n if (!hidden.includes('totalYearlyYield')) a.push(false);\n if (!hidden.includes('meanYearlyYield')) a.push(false);\n if (!hidden.includes('yearlyProfit')) a.push(false);\n return a;\n }\n return [];\n }\n\n static getUnits(projectType: DesignProblem, l: { lng: string }, hidden: string[]): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: string[] = [];\n if (!hidden.includes('rowWidth')) a.push(' ' + i18n.t('solarPanelMenu.Panels', l));\n if (!hidden.includes('tiltAngle')) a.push('°');\n if (!hidden.includes('interRowSpacing')) a.push(' ' + i18n.t('word.MeterAbbreviation', l));\n if (!hidden.includes('latitude')) a.push('°');\n if (!hidden.includes('orientation')) a.push('');\n if (!hidden.includes('poleHeight')) a.push(' ' + i18n.t('word.MeterAbbreviation', l));\n if (!hidden.includes('unitCost')) a.push('');\n if (!hidden.includes('sellingPrice')) a.push('');\n if (!hidden.includes('totalYearlyCost')) a.push('K');\n if (!hidden.includes('totalYearlyYield')) a.push(' MWh');\n if (!hidden.includes('meanYearlyYield')) a.push(' kWh');\n if (!hidden.includes('yearlyProfit')) a.push('K');\n return a;\n }\n return [];\n }\n\n static getUnit(variable: string, l: { lng: string }): string {\n if (variable === 'tiltAngle' || variable === 'latitude') return '°';\n if (variable === 'interRowSpacing') return i18n.t('word.MeterAbbreviation', l);\n if (variable === 'poleHeight') return i18n.t('word.MeterAbbreviation', l);\n if (variable === 'totalYearlyYield') return 'MWh';\n if (variable === 'meanYearlyYield') return 'kWh';\n if (variable === 'totalYearlyCost') return 'K';\n if (variable === 'yearlyProfit') return 'K';\n return '';\n }\n\n static setScatterData(name: string, axis: 'x' | 'y', datum: { x: number; y: number }, design: Design) {\n switch (name) {\n case 'rowWidth':\n datum[axis] = design.rowsPerRack;\n break;\n case 'tiltAngle':\n datum[axis] = Util.toDegrees(design.tiltAngle);\n break;\n case 'interRowSpacing':\n datum[axis] = design.interRowSpacing;\n break;\n case 'latitude':\n datum[axis] = design.latitude;\n break;\n case 'orientation':\n datum[axis] = design.orientation === Orientation.landscape ? 0 : 1;\n break;\n case 'poleHeight':\n datum[axis] = design.poleHeight;\n break;\n case 'unitCost':\n datum[axis] = design.unitCost;\n break;\n case 'sellingPrice':\n datum[axis] = design.sellingPrice;\n break;\n case 'totalYearlyCost':\n datum[axis] = Util.calculateCost(design);\n break;\n case 'totalYearlyYield':\n datum[axis] = design.yearlyYield * 0.001;\n break;\n case 'meanYearlyYield':\n datum[axis] = design.yearlyYield / design.panelCount;\n break;\n case 'yearlyProfit':\n datum[axis] = Util.calculateProfit(design);\n break;\n }\n }\n}\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { CommonStoreState } from './common';\r\nimport { ObjectType } from 'src/types';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { WallFill, WallModel, WallStructure } from 'src/models/WallModel';\r\nimport { DEFAULT_PARAPET_SETTINGS } from 'src/views/wall/parapet';\r\nimport { GambrelRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { GROUND_ID } from 'src/constants';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\n\r\n// should put this inside immerSet function, because it mutate state directly\r\nexport class StoreUtil {\r\n static updateOldFileData(state: CommonStoreState) {\r\n const elementMap = new Map();\r\n for (const e of state.elements) {\r\n elementMap.set(e.id, e);\r\n }\r\n for (const e of state.elements) {\r\n switch (e.type) {\r\n case ObjectType.Foundation: {\r\n // TODO: fix these bugs that are tentatively corrected here\r\n if (e.parentId !== GROUND_ID) {\r\n console.error('Error: ' + e.parentId + ' is not ground!');\r\n e.parentId = GROUND_ID;\r\n }\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = e as WallModel;\r\n if (wall.wallStructure === undefined) {\r\n wall.wallStructure = WallStructure.Default;\r\n }\r\n if (wall.structureSpacing === undefined) {\r\n wall.structureSpacing = 2;\r\n }\r\n if (wall.structureWidth === undefined) {\r\n wall.structureWidth = 0.1;\r\n }\r\n if (wall.structureColor === undefined) {\r\n wall.structureColor = 'white';\r\n }\r\n if (wall.opacity === undefined) {\r\n wall.opacity = 0.5;\r\n }\r\n if (wall.fill === undefined) {\r\n wall.fill = WallFill.Full;\r\n }\r\n if (wall.unfilledHeight === undefined) {\r\n wall.unfilledHeight = 0.5;\r\n }\r\n if (wall.leftUnfilledHeight === undefined || wall.rightUnfilledHeight === undefined) {\r\n const val = wall.unfilledHeight ?? 0.5;\r\n wall.leftUnfilledHeight = val;\r\n wall.rightUnfilledHeight = val;\r\n }\r\n if (wall.leftTopPartialHeight === undefined || wall.rightTopPartialHeight === undefined) {\r\n wall.leftTopPartialHeight = wall.lz;\r\n wall.rightTopPartialHeight = wall.lz;\r\n }\r\n if (wall.eavesLength === undefined) {\r\n if (wall.roofId) {\r\n const el = elementMap.get(wall.roofId);\r\n if (el && el.type === ObjectType.Roof) {\r\n const roof = el as RoofModel;\r\n wall.eavesLength = roof.overhang !== undefined ? roof.overhang : 0.3;\r\n } else {\r\n wall.eavesLength = 0.3;\r\n }\r\n }\r\n }\r\n if (wall.parapet === undefined) {\r\n wall.parapet = { ...DEFAULT_PARAPET_SETTINGS };\r\n }\r\n\r\n if (wall.roofId) {\r\n const el = elementMap.get(wall.roofId);\r\n if (el && el.type === ObjectType.Roof) {\r\n const roof = el as RoofModel;\r\n if (\r\n roof.roofType === RoofType.Pyramid ||\r\n roof.roofType === RoofType.Hip ||\r\n roof.roofType === RoofType.Mansard\r\n ) {\r\n wall.leftRoofHeight = undefined;\r\n wall.rightRoofHeight = undefined;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = e as WindowModel;\r\n if (window.horizontalMullion === undefined) {\r\n window.horizontalMullion = window.mullion;\r\n }\r\n if (window.verticalMullion === undefined) {\r\n window.verticalMullion = window.mullion;\r\n }\r\n if (window.mullionWidth === undefined) {\r\n window.mullionWidth = 0.06;\r\n }\r\n if (window.horizontalMullionSpacing === undefined) {\r\n window.horizontalMullionSpacing = window.mullionSpacing ?? 0.5;\r\n }\r\n if (window.verticalMullionSpacing === undefined) {\r\n window.verticalMullionSpacing = window.mullionSpacing ?? 0.5;\r\n }\r\n if (window.tint === undefined) {\r\n window.tint = '#73D8FF';\r\n }\r\n if (window.opacity === undefined) {\r\n window.opacity = 0.5;\r\n }\r\n if (window.shutter) {\r\n window.leftShutter = window.shutter.showLeft;\r\n window.rightShutter = window.shutter.showRight;\r\n window.shutterColor = window.shutter.color;\r\n window.shutterWidth = window.shutter.width;\r\n window.shutter = undefined;\r\n }\r\n if (window.shutterColor === undefined) {\r\n window.shutterColor = 'gray';\r\n }\r\n if (window.shutterWidth === undefined) {\r\n window.shutterWidth = 0.5;\r\n }\r\n if (window.mullionColor === undefined) {\r\n window.mullionColor = 'white';\r\n }\r\n if (window.frame === undefined) {\r\n window.frame = false;\r\n }\r\n if (window.color === undefined) {\r\n window.color = 'white';\r\n }\r\n if (window.frameWidth === undefined) {\r\n window.frameWidth = 0.1;\r\n }\r\n if (window.windowType === undefined) {\r\n window.windowType = WindowType.Default;\r\n }\r\n if (window.archHeight === undefined) {\r\n window.archHeight = 1;\r\n }\r\n break;\r\n }\r\n case ObjectType.Door: {\r\n const door = e as DoorModel;\r\n if (door.doorType === undefined) {\r\n door.doorType = DoorType.Default;\r\n }\r\n if (door.archHeight === undefined) {\r\n door.archHeight = 1;\r\n }\r\n if (door.filled === undefined) {\r\n door.filled = true;\r\n }\r\n break;\r\n }\r\n case ObjectType.Roof: {\r\n const roof = e as RoofModel;\r\n if (roof.ceiling === undefined) {\r\n roof.ceiling = false;\r\n }\r\n if (roof.roofType === RoofType.Gambrel) {\r\n const gambrelRoof = roof as GambrelRoofModel;\r\n if (gambrelRoof.frontRidgePoint === undefined) {\r\n gambrelRoof.frontRidgePoint = gambrelRoof.frontRidgeLeftPoint\r\n ? [...gambrelRoof.frontRidgeLeftPoint]\r\n : [0.35, 0.5];\r\n gambrelRoof.frontRidgeLeftPoint = undefined;\r\n gambrelRoof.frontRidgeRightPoint = undefined;\r\n }\r\n if (gambrelRoof.backRidgePoint === undefined) {\r\n gambrelRoof.backRidgePoint = gambrelRoof.backRidgeLeftPoint\r\n ? [...gambrelRoof.backRidgeLeftPoint]\r\n : [-0.35, 0.5];\r\n gambrelRoof.backRidgeLeftPoint = undefined;\r\n gambrelRoof.backRidgeRightPoint = undefined;\r\n }\r\n if (gambrelRoof.topRidgePoint === undefined) {\r\n gambrelRoof.topRidgePoint = gambrelRoof.topRidgeLeftPoint ? [...gambrelRoof.topRidgeLeftPoint] : [0, 1];\r\n gambrelRoof.topRidgeLeftPoint = undefined;\r\n gambrelRoof.topRidgeRightPoint = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { ObjectType } from 'src/types';\r\nimport { ElementModel } from './ElementModel';\r\n\r\nexport interface Groupable {\r\n enableGroupMaster?: boolean;\r\n}\r\n\r\nexport type GroupableModel = ElementModel & Groupable;\r\n\r\nexport function isGroupable(element: ElementModel) {\r\n return element.type === ObjectType.Foundation || element.type === ObjectType.Cuboid;\r\n}\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport create from 'zustand';\r\nimport short from 'short-uuid';\r\nimport dayjs from 'dayjs';\r\nimport Papa from 'papaparse';\r\nimport i18n from '../i18n/i18n';\r\nimport enUS from 'antd/lib/locale/en_US';\r\nimport weather from '../resources/weather.csv';\r\nimport solar_radiation_horizontal from '../resources/solar_radiation_horizontal.csv';\r\nimport solar_radiation_vertical from '../resources/solar_radiation_vertical.csv';\r\nimport pvmodules from '../resources/pvmodules.csv';\r\nimport produce, { enableMapSet } from 'immer';\r\nimport {\r\n ActionInfo,\r\n ActionType,\r\n DataColoring,\r\n DatumEntry,\r\n Design,\r\n DesignProblem,\r\n ElementState,\r\n EvolutionMethod,\r\n ModelSite,\r\n ModelType,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ProjectInfo,\r\n Range,\r\n ResizeHandleType,\r\n RoofHandleType,\r\n RotateHandleType,\r\n Scope,\r\n SolarStructure,\r\n User,\r\n} from '../types';\r\nimport { devtools, persist } from 'zustand/middleware';\r\nimport { WorldModel } from '../models/WorldModel';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { WeatherModel } from '../models/WeatherModel';\r\nimport { Util } from '../Util';\r\nimport { DefaultWorldModel } from './DefaultWorldModel';\r\nimport { Box3, Euler, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { ElementModelCloner } from '../models/ElementModelCloner';\r\nimport { DefaultViewState } from './DefaultViewState';\r\nimport { ViewState } from './ViewState';\r\nimport { ElementModelFactory } from '../models/ElementModelFactory';\r\nimport { GroundModel } from '../models/GroundModel';\r\nimport { PvModel } from '../models/PvModel';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { SolarPanelModel } from '../models/SolarPanelModel';\r\nimport { WallModel } from '../models/WallModel';\r\nimport { Locale } from 'antd/lib/locale-provider';\r\nimport { Undoable } from '../undo/Undoable';\r\nimport { UndoManager } from '../undo/UndoManager';\r\nimport { HumanModel } from '../models/HumanModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport {\r\n DEFAULT_ADDRESS,\r\n DEFAULT_MODEL_MAP_ZOOM,\r\n FLOATING_WINDOW_OPACITY,\r\n GROUND_ID,\r\n HALF_PI,\r\n ORIGIN_VECTOR2,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n} from '../constants';\r\nimport { PolygonModel } from '../models/PolygonModel';\r\nimport { Point2 } from '../models/Point2';\r\nimport { useRefStore } from './commonRef';\r\nimport { showError } from '../helpers';\r\nimport { SolarPanelArrayLayoutParams } from './SolarPanelArrayLayoutParams';\r\nimport { DefaultSolarPanelArrayLayoutParams } from './DefaultSolarPanelArrayLayoutParams';\r\nimport { SolarCollector } from '../models/SolarCollector';\r\nimport { ConcentratedSolarPowerCollector } from '../models/ConcentratedSolarPowerCollector';\r\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\r\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\r\nimport { ElementCounter } from './ElementCounter';\r\nimport { ParabolicCollector } from '../models/ParabolicCollector';\r\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\r\nimport { HeliostatModel } from '../models/HeliostatModel';\r\nimport { SolarRadiationData } from '../models/SolarRadiationData';\r\nimport { EvolutionaryAlgorithmState } from './EvolutionaryAlgorithmState';\r\nimport { DefaultEvolutionaryAlgorithmState } from './DefaultEvolutionaryAlgorithmState';\r\nimport { RoofModel, RoofStructure } from 'src/models/RoofModel';\r\nimport { SolarPanelArrayLayoutConstraints } from './SolarPanelArrayLayoutConstraints';\r\nimport { DefaultSolarPanelArrayLayoutConstraints } from './DefaultSolarPanelArrayLayoutConstraints';\r\nimport { EconomicsParams } from './EconomicsParams';\r\nimport { DefaultEconomicsParams } from './DefaultEconomicsParams';\r\nimport { RoofUtil } from 'src/views/roof/RoofUtil';\r\nimport { ActionState } from './ActionState';\r\nimport { DefaultActionState } from './DefaultActionState';\r\nimport { LightModel } from '../models/LightModel';\r\nimport { usePrimitiveStore } from './commonPrimitive';\r\nimport { useDataStore } from './commonData';\r\nimport { GraphState } from './GraphState';\r\nimport { DefaultGraphState } from './DefaultGraphState';\r\nimport { isStackableModel } from 'src/models/Stackable';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { ProjectUtil } from '../panels/ProjectUtil';\r\nimport { StoreUtil } from './StoreUtil';\r\nimport { isGroupable } from 'src/models/Groupable';\r\n\r\nenableMapSet();\r\n\r\nexport interface CommonStoreState {\r\n set: (fn: (state: CommonStoreState) => void) => void;\r\n\r\n // only the following properties are persisted (see the whitelist at the end)\r\n world: WorldModel;\r\n elements: ElementModel[];\r\n viewState: ViewState;\r\n actionState: ActionState;\r\n graphState: GraphState;\r\n modelType: ModelType;\r\n modelAuthor: string | null;\r\n modelLabel: string | null;\r\n modelDescription: string | null;\r\n projectView: boolean;\r\n projectInfo: ProjectInfo;\r\n projectImages: Map;\r\n designProjectType: DesignProblem | null; // this belongs to a design of a project\r\n notes: string[];\r\n user: User;\r\n language: string;\r\n floatingWindowOpacity: number;\r\n selectedFloatingWindow: string | null;\r\n cloudFile: string | undefined;\r\n latestModelSite?: ModelSite;\r\n modelSites: Map>; // primary key: 'lat, lng', secondary key: 'title, userid'\r\n peopleModels: Map>; // primary key: author, secondary key: 'title, userid'\r\n modelsMapLatitude: number;\r\n modelsMapLongitude: number;\r\n modelsMapAddress: string;\r\n modelsMapZoom: number;\r\n modelsMapType: string;\r\n modelsMapTilt: number;\r\n\r\n minimumNavigationMoveSpeed: number;\r\n minimumNavigationTurnSpeed: number;\r\n\r\n ray: Raycaster;\r\n mouse: Vector2;\r\n\r\n fileChanged: boolean;\r\n applyCount: number;\r\n setApplyCount: (count: number) => void;\r\n revertApply: () => void;\r\n\r\n importContent: (input: any, title?: string) => void;\r\n exportContent: () => {};\r\n clearContent: () => void;\r\n createEmptyFile: () => void;\r\n undoManager: UndoManager;\r\n addUndoable: (undoable: Undoable) => void;\r\n\r\n weatherData: { [key: string]: WeatherModel };\r\n getWeather: (location: string) => WeatherModel;\r\n loadWeatherData: () => void;\r\n horizontalSolarRadiationData: { [key: string]: SolarRadiationData };\r\n getHorizontalSolarRadiation: (location: string) => SolarRadiationData;\r\n loadHorizontalSolarRadiationData: () => void;\r\n verticalSolarRadiationData: { [key: string]: SolarRadiationData };\r\n getVerticalSolarRadiation: (location: string) => SolarRadiationData;\r\n loadVerticalSolarRadiationData: () => void;\r\n getClosestCity: (lat: number, lng: number) => string | null;\r\n\r\n pvModules: { [key: string]: PvModel };\r\n getPvModule: (name: string) => PvModel;\r\n loadPvModules: () => void;\r\n\r\n aabb: Box3; // axis-aligned bounding box of elements\r\n animate24Hours: boolean;\r\n evolutionMethod: EvolutionMethod;\r\n clickObjectType: ObjectType | null;\r\n contextMenuObjectType: ObjectType | null;\r\n hoveredHandle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null;\r\n moveHandleType: MoveHandleType | null;\r\n resizeHandleType: ResizeHandleType | null;\r\n rotateHandleType: RotateHandleType | null;\r\n resizeAnchor: Vector3;\r\n selectedElement: ElementModel | null;\r\n getSelectedElement: () => ElementModel | null;\r\n findNearestSibling: (id: string) => string | null;\r\n overlapWithSibling: (me: ElementModel, threshold?: number) => boolean;\r\n selectedSideIndex: number;\r\n getResizeHandlePosition: (e: ElementModel, type: ResizeHandleType) => Vector3;\r\n getElementById: (id: string) => ElementModel | null;\r\n getParent: (child: ElementModel) => ElementModel | null;\r\n getFoundation: (elem: ElementModel) => FoundationModel | null;\r\n selectMe: (id: string, e: ThreeEvent, action?: ActionType, select?: boolean) => void;\r\n selectNone: () => void;\r\n setElementPosition: (id: string, x: number, y: number, z?: number) => void;\r\n setElementNormal: (id: string, x: number, y: number, z: number) => void;\r\n setElementSize: (id: string, lx: number, ly: number, lz?: number) => void;\r\n\r\n selectedElementIdSet: Set;\r\n multiSelectionsMode: boolean;\r\n\r\n // for all types of elements\r\n updateAllElementLocks: (locked: boolean) => void;\r\n updateElementLockByFoundationId: (foundationId: string, locked: boolean) => void;\r\n updateElementLockByParentId: (parentId: string, type: ObjectType, locked: boolean) => void;\r\n updateElementLockById: (id: string, locked: boolean) => void;\r\n updateElementReferenceById: (id: string, referenceId: string) => void;\r\n updateElementLabelById: (id: string, label: string) => void;\r\n updateElementShowLabelById: (id: string, showLabel: boolean) => void;\r\n\r\n updateElementColorById: (id: string, color: string) => void;\r\n updateElementColorOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n color: string,\r\n ) => void;\r\n updateElementColorAboveFoundation: (type: ObjectType, foundationId: string, color: string) => void;\r\n updateElementColorForAll: (type: ObjectType, color: string) => void;\r\n\r\n updateElementLineColorById: (id: string, color: string) => void;\r\n updateElementLineColorOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n color: string,\r\n ) => void;\r\n updateElementLineColorAboveFoundation: (type: ObjectType, foundationId: string, color: string) => void;\r\n updateElementLineColorForAll: (type: ObjectType, color: string) => void;\r\n\r\n updateElementLineWidthById: (id: string, width: number) => void;\r\n updateElementLineWidthOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n width: number,\r\n ) => void;\r\n updateElementLineWidthAboveFoundation: (type: ObjectType, foundationId: string, width: number) => void;\r\n updateElementLineWidthForAll: (type: ObjectType, width: number) => void;\r\n\r\n updateElementRotationById: (id: string, x: number, y: number, z: number) => void;\r\n updateElementRotationForAll: (type: ObjectType, x: number, y: number, z: number) => void;\r\n\r\n updateElementCxById: (id: string, cx: number) => void;\r\n updateElementCyById: (id: string, cy: number) => void;\r\n updateElementCzById: (id: string, cz: number) => void;\r\n updateElementCzForAll: (type: ObjectType, cz: number) => void;\r\n\r\n updateElementLxById: (id: string, lx: number) => void;\r\n updateElementLxOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, lx: number) => void;\r\n updateElementLxAboveFoundation: (type: ObjectType, foundationId: string, lx: number) => void;\r\n updateElementLxForAll: (type: ObjectType, lx: number) => void;\r\n\r\n updateElementLyById: (id: string, ly: number) => void;\r\n updateElementLyOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, ly: number) => void;\r\n updateElementLyAboveFoundation: (type: ObjectType, foundationId: string, ly: number) => void;\r\n updateElementLyForAll: (type: ObjectType, ly: number) => void;\r\n\r\n updateElementLzById: (id: string, lz: number) => void;\r\n updateElementLzOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, lz: number) => void;\r\n updateElementLzAboveFoundation: (type: ObjectType, foundationId: string, lz: number) => void;\r\n updateElementLzForAll: (type: ObjectType, lz: number) => void;\r\n\r\n // for all types of solar collectors\r\n updateSolarCollectorDrawSunBeamById: (id: string, draw: boolean) => void;\r\n updateSolarCollectorDrawSunBeamAboveFoundation: (type: ObjectType, foundationId: string, draw: boolean) => void;\r\n updateSolarCollectorDrawSunBeamForAll: (type: ObjectType, draw: boolean) => void;\r\n updateSolarCollectorRelativeAzimuthById: (id: string, relativeAzimuth: number) => void;\r\n updateSolarCollectorRelativeAzimuthOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n relativeAzimuth: number,\r\n ) => void;\r\n updateSolarCollectorRelativeAzimuthAboveFoundation: (\r\n type: ObjectType,\r\n foundationId: string,\r\n relativeAzimuth: number,\r\n ) => void;\r\n updateSolarCollectorRelativeAzimuthForAll: (type: ObjectType, relativeAzimuth: number) => void;\r\n updateSolarCollectorPoleHeightById: (id: string, poleHeight: number) => void;\r\n updateSolarCollectorPoleHeightOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n poleHeight: number,\r\n ) => void;\r\n updateSolarCollectorPoleHeightAboveFoundation: (type: ObjectType, foundationId: string, poleHeight: number) => void;\r\n updateSolarCollectorPoleHeightForAll: (type: ObjectType, poleHeight: number) => void;\r\n\r\n updateSolarCollectorPoleRadiusById: (id: string, poleRadius: number) => void;\r\n updateSolarCollectorPoleRadiusOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n poleRadius: number,\r\n ) => void;\r\n updateSolarCollectorPoleRadiusAboveFoundation: (type: ObjectType, foundationId: string, poleRadius: number) => void;\r\n updateSolarCollectorPoleRadiusForAll: (type: ObjectType, poleRadius: number) => void;\r\n\r\n clearAllSolarCollectorYields: () => void;\r\n updateSolarCollectorDailyYieldById: (id: string, dailyYield: number) => void;\r\n updateSolarCollectorYearlyYieldById: (id: string, yearlyYield: number) => void;\r\n\r\n // for all types of concentrated solar power collectors\r\n updateCspReflectanceById: (id: string, reflectance: number) => void;\r\n updateCspReflectanceAboveFoundation: (type: ObjectType, foundationId: string, reflectance: number) => void;\r\n updateCspReflectanceForAll: (type: ObjectType, reflectance: number) => void;\r\n\r\n // for all types of parabolic solar collectors (that are standalone units)\r\n updateParabolicCollectorAbsorptanceById: (id: string, absorptance: number) => void;\r\n updateParabolicCollectorAbsorptanceAboveFoundation: (\r\n type: ObjectType,\r\n foundationId: string,\r\n absorptance: number,\r\n ) => void;\r\n updateParabolicCollectorAbsorptanceForAll: (type: ObjectType, absorptance: number) => void;\r\n updateParabolicCollectorOpticalEfficiencyById: (id: string, opticalEfficiency: number) => void;\r\n updateParabolicCollectorOpticalEfficiencyAboveFoundation: (\r\n type: ObjectType,\r\n foundationId: string,\r\n opticalEfficiency: number,\r\n ) => void;\r\n updateParabolicCollectorOpticalEfficiencyForAll: (type: ObjectType, opticalEfficiency: number) => void;\r\n updateParabolicCollectorThermalEfficiencyById: (id: string, thermalEfficiency: number) => void;\r\n updateParabolicCollectorThermalEfficiencyAboveFoundation: (\r\n type: ObjectType,\r\n foundationId: string,\r\n thermalEfficiency: number,\r\n ) => void;\r\n updateParabolicCollectorThermalEfficiencyForAll: (type: ObjectType, thermalEfficiency: number) => void;\r\n\r\n // for foundations\r\n foundationActionScope: Scope;\r\n setFoundationActionScope: (scope: Scope) => void;\r\n\r\n // for cuboids\r\n cuboidActionScope: Scope;\r\n setCuboidActionScope: (scope: Scope) => void;\r\n\r\n // for polygons\r\n polygonActionScope: Scope;\r\n setPolygonActionScope: (scope: Scope) => void;\r\n updatePolygonVertexPositionById: (id: string, index: number, x: number, y: number) => void;\r\n updatePolygonVerticesById: (id: string, vertices: Point2[]) => void;\r\n\r\n // for solar panels\r\n solarPanelActionScope: Scope;\r\n setSolarPanelActionScope: (scope: Scope) => void;\r\n updateSolarPanelTiltAngleById: (id: string, tiltAngle: number) => void;\r\n setSolarPanelOrientation: (sp: SolarPanelModel, pvModel: PvModel, orientation: Orientation) => void;\r\n\r\n // for parabolic troughs\r\n parabolicTroughActionScope: Scope;\r\n setParabolicTroughActionScope: (scope: Scope) => void;\r\n\r\n // for Fresnel reflectors\r\n fresnelReflectorActionScope: Scope;\r\n setFresnelReflectorActionScope: (scope: Scope) => void;\r\n\r\n // for heliostats\r\n heliostatActionScope: Scope;\r\n setHeliostatActionScope: (scope: Scope) => void;\r\n\r\n // for Fresnel reflectors and heliostats\r\n updateSolarReceiverById: (id: string, receiverId: string) => void;\r\n updateSolarReceiverAboveFoundation: (type: ObjectType, foundationId: string, receiverId: string) => void;\r\n updateSolarReceiverForAll: (type: ObjectType, receiverId: string) => void;\r\n\r\n // for parabolic dishes\r\n parabolicDishActionScope: Scope;\r\n setParabolicDishActionScope: (scope: Scope) => void;\r\n\r\n // for parabolic troughs and Fresnel reflectors\r\n updateModuleLengthById: (id: string, moduleLength: number) => void;\r\n updateModuleLengthAboveFoundation: (type: ObjectType, foundationId: string, moduleLength: number) => void;\r\n updateModuleLengthForAll: (type: ObjectType, moduleLength: number) => void;\r\n\r\n // for parabolic troughs and dishes\r\n updateParabolaLatusRectumById: (id: string, latusRectum: number) => void;\r\n updateParabolaLatusRectumAboveFoundation: (type: ObjectType, foundationId: string, latusRectum: number) => void;\r\n updateParabolaLatusRectumForAll: (type: ObjectType, latusRectum: number) => void;\r\n\r\n // for walls\r\n wallActionScope: Scope;\r\n setWallActionScope: (scope: Scope) => void;\r\n\r\n // for roofs\r\n roofActionScope: Scope;\r\n setRoofActionScope: (scope: Scope) => void;\r\n\r\n // for windows\r\n windowActionScope: Scope;\r\n setWindowActionScope: (scope: Scope) => void;\r\n\r\n // for doors\r\n doorActionScope: Scope;\r\n setDoorActionScope: (scope: Scope) => void;\r\n\r\n updateWallRelativeAngleById: (id: string, angle: number) => void;\r\n updateWallLeftJointsById: (id: string, joints: string[]) => void;\r\n updateWallRightJointsById: (id: string, joints: string[]) => void;\r\n updateWallLeftPointById: (id: string, point: number[]) => void;\r\n updateWallRightPointById: (id: string, point: number[]) => void;\r\n\r\n // for roofs\r\n updateRoofRiseById: (id: string, rise: number, topZ?: number) => void;\r\n updateRoofStructureById: (id: string, structure: RoofStructure) => void;\r\n\r\n // for lights\r\n updateInsideLightById: (id: string, inside: boolean) => void;\r\n updateInsideLightsByParentId: (parentId: string, inside: boolean) => void;\r\n\r\n actionModeLock: boolean;\r\n objectTypeToAdd: ObjectType;\r\n addElement: (parent: ElementModel | GroundModel, position: Vector3, normal?: Vector3) => ElementModel | null;\r\n\r\n pastePoint: Vector3;\r\n pasteNormal: Vector3 | undefined;\r\n elementsToPaste: ElementModel[]; // this is for undoing cut and pasting\r\n deletedElements: ElementModel[]; // this is for undoing deletion\r\n clearDeletedElements: () => void;\r\n copyElementById: (id: string) => void;\r\n removeSelectedElements: () => ElementModel[];\r\n removeElementById: (id: string, cut: boolean, selectNone?: boolean, auto?: boolean) => ElementModel[]; // set cut to false for deletion\r\n copyCutElements: () => ElementModel[];\r\n pasteElementsToPoint: () => ElementModel[];\r\n pasteElementsByKey: () => ElementModel[];\r\n countElementsByType: (type: ObjectType, excludeLocked?: boolean) => number;\r\n countSolarStructuresByType: (type: SolarStructure, excludeLocked?: boolean) => number;\r\n countObservers: () => number;\r\n removeElementsByType: (type: ObjectType) => void;\r\n countElementsByReferenceId: (id: string) => number;\r\n removeElementsByReferenceId: (id: string, cache: boolean) => void;\r\n getChildren: (id: string) => ElementModel[];\r\n getChildrenOfType: (type: ObjectType, id: string) => ElementModel[];\r\n // the following goes faster than counting individual types of children through multiple loops\r\n countAllElements: (excludeLocked?: boolean) => number;\r\n countAllElementsByType: (excludeLocked?: boolean) => ElementCounter;\r\n countAllOffspringsByTypeAtOnce: (ancestorId: string, includingLocked: boolean) => ElementCounter;\r\n countSolarPanelsOnRack: (id: string) => number;\r\n removeAllChildElementsByType: (parentId: string, type: ObjectType) => void;\r\n removeAllElementsOnFoundationByType: (foundationId: string, type: ObjectType) => void;\r\n\r\n // genetic algorithms and particle swarm optimization\r\n fittestIndividualResults: DatumEntry[];\r\n setFittestIndividualResults: (data: DatumEntry[]) => void;\r\n variableLabels: (string | undefined)[];\r\n setVariableLabels: (labels: (string | undefined)[]) => void;\r\n\r\n sunlightDirection: Vector3;\r\n setSunlightDirection: (vector: Vector3) => void;\r\n\r\n cameraDirection: Vector3;\r\n getCameraDirection: () => Vector3;\r\n\r\n updateSceneRadiusFlag: boolean;\r\n updateSceneRadius: () => void;\r\n sceneRadius: number;\r\n setSceneRadius: (radius: number) => void;\r\n\r\n selectedElementAngle: number;\r\n selectedElementHeight: number;\r\n selectedElementX: number;\r\n selectedElementY: number;\r\n\r\n isAddingElement: () => boolean;\r\n addedFoundationId: string | null;\r\n deletedFoundationId: string | null;\r\n\r\n addedCuboidId: string | null;\r\n deletedCuboidId: string | null;\r\n\r\n addedWallId: string | null;\r\n deletedWallId: string | null;\r\n updateWallMapOnFoundationFlag: boolean;\r\n updateWallMapOnFoundation: () => void;\r\n\r\n updateElementOnRoofFlag: boolean;\r\n setUpdateElementOnRoofFlag: (b: boolean) => void;\r\n updateElementOnRoofFn: () => void;\r\n\r\n addedWindowId: string | null;\r\n\r\n addedDoorId: string | null;\r\n\r\n deletedRoofId: string | null;\r\n deletedRoofIdSet: Set;\r\n addedRoofIdSet: Set; // new roof or undo multiple deleted roof, to notify roof to update walls.\r\n deleteAddedRoofId: (id: string) => void;\r\n\r\n autoDeletedRoofs: RoofModel[] | null;\r\n autoDeletedRoofIdSet: Set;\r\n autoDeletedChild: ElementModel[] | null; // [] means checked but no element, null means haven't check yet.\r\n getAutoDeletedElements: () => ElementModel[] | null;\r\n\r\n groupActionMode: boolean;\r\n setGroupActionMode: (b: boolean) => void;\r\n groupActionUpdateFlag: boolean;\r\n\r\n locale: Locale;\r\n localFileName: string;\r\n createNewFileFlag: boolean;\r\n setCreateNewFileFlag: (b: boolean) => void;\r\n openLocalFileFlag: boolean;\r\n setOpenLocalFileFlag: (b: boolean) => void;\r\n enableFineGrid: boolean;\r\n setEnableFineGrid: (b: boolean) => void;\r\n\r\n loggable: boolean;\r\n actionInfo: ActionInfo | undefined;\r\n currentUndoable: Undoable | undefined;\r\n showCloudFileTitleDialog: boolean;\r\n // we have to use the sure flip of an additional flag to ensure it triggers useEffect hook\r\n showCloudFileTitleDialogFlag: boolean;\r\n localContentToImportAfterCloudFileUpdate: any;\r\n\r\n solarPanelArrayLayoutParams: SolarPanelArrayLayoutParams;\r\n solarPanelArrayLayoutConstraints: SolarPanelArrayLayoutConstraints;\r\n evolutionaryAlgorithmState: EvolutionaryAlgorithmState;\r\n economicsParams: EconomicsParams;\r\n\r\n geneticAlgorithmWizardSelectedTab: string;\r\n particleSwarmOptimizationWizardSelectedTab: string;\r\n\r\n // the following is to fix the bug that when ctrl+o is pressed, the file dialog gets fired up multiple times\r\n localFileDialogRequested: boolean;\r\n\r\n tempHumanPlant: ElementModel[];\r\n}\r\n\r\nexport const useStore = create(\r\n devtools(\r\n persist(\r\n (set, get) => {\r\n const immerSet: CommonStoreState['set'] = (fn) => set(produce(fn));\r\n const defaultWorldModel = new DefaultWorldModel();\r\n const defaultElements = defaultWorldModel.getElements();\r\n\r\n return {\r\n set: (fn) => {\r\n try {\r\n immerSet(fn);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n },\r\n world: defaultWorldModel,\r\n elements: defaultElements,\r\n user: {} as User,\r\n viewState: new DefaultViewState(),\r\n actionState: new DefaultActionState(),\r\n graphState: new DefaultGraphState(),\r\n solarPanelArrayLayoutParams: new DefaultSolarPanelArrayLayoutParams(),\r\n solarPanelArrayLayoutConstraints: new DefaultSolarPanelArrayLayoutConstraints(),\r\n evolutionaryAlgorithmState: new DefaultEvolutionaryAlgorithmState(),\r\n economicsParams: new DefaultEconomicsParams(),\r\n geneticAlgorithmWizardSelectedTab: '1',\r\n particleSwarmOptimizationWizardSelectedTab: '1',\r\n modelType: ModelType.UNKNOWN,\r\n modelAuthor: null,\r\n modelLabel: null,\r\n modelDescription: null,\r\n projectView: false,\r\n projectInfo: {\r\n owner: null,\r\n title: null,\r\n description: null,\r\n type: DesignProblem.SOLAR_PANEL_ARRAY,\r\n designs: new Array(),\r\n ranges: new Array(),\r\n hiddenParameters: ProjectUtil.getDefaultHiddenParameters(DesignProblem.SOLAR_PANEL_ARRAY),\r\n counter: 0,\r\n dataColoring: DataColoring.ALL,\r\n selectedProperty: null,\r\n sortDescending: false,\r\n xAxisNameScatteredPlot: null,\r\n yAxisNameScatteredPlot: null,\r\n dotSizeScatteredPlot: 5,\r\n thumbnailWidth: 200,\r\n } as ProjectInfo,\r\n projectImages: new Map(),\r\n designProjectType: null,\r\n notes: [],\r\n language: 'en',\r\n floatingWindowOpacity: FLOATING_WINDOW_OPACITY,\r\n selectedFloatingWindow: null,\r\n cloudFile: undefined,\r\n latestModelSite: undefined,\r\n modelSites: new Map>(),\r\n peopleModels: new Map>(),\r\n modelsMapLatitude: 42.2844063,\r\n modelsMapLongitude: -71.3488548,\r\n modelsMapAddress: DEFAULT_ADDRESS,\r\n modelsMapZoom: DEFAULT_MODEL_MAP_ZOOM,\r\n modelsMapType: 'roadmap',\r\n modelsMapTilt: 0,\r\n\r\n minimumNavigationMoveSpeed: 3,\r\n minimumNavigationTurnSpeed: 3,\r\n\r\n tempHumanPlant: [],\r\n\r\n ray: new Raycaster(),\r\n mouse: new Vector2(),\r\n\r\n fileChanged: false,\r\n\r\n applyCount: 0,\r\n setApplyCount(count) {\r\n immerSet((state: CommonStoreState) => {\r\n state.applyCount = count;\r\n });\r\n },\r\n // Not sure why we cannot do this within immerSet\r\n revertApply() {\r\n if (get().applyCount) {\r\n for (let i = 0; i < get().applyCount; i++) {\r\n get().undoManager.undo();\r\n }\r\n get().setApplyCount(0);\r\n }\r\n },\r\n\r\n importContent(content, title) {\r\n immerSet((state: CommonStoreState) => {\r\n state.world = content.world;\r\n state.viewState = content.view;\r\n state.graphState = content.graphState ?? new DefaultGraphState();\r\n state.elements = content.elements;\r\n state.notes = content.notes ?? [];\r\n state.modelType = content.modelType ?? ModelType.UNKNOWN;\r\n state.modelAuthor = content.modelAuthor ?? null;\r\n state.modelLabel = content.modelLabel ?? null;\r\n state.modelDescription = content.modelDescription ?? null;\r\n state.designProjectType = content.designProjectType ?? null;\r\n state.cloudFile = title;\r\n state.currentUndoable = undefined;\r\n state.actionInfo = undefined;\r\n state.sceneRadius = content.sceneRadius ?? 100;\r\n state.updateSceneRadiusFlag = !state.updateSceneRadiusFlag;\r\n state.localContentToImportAfterCloudFileUpdate = undefined;\r\n state.fileChanged = !state.fileChanged;\r\n state.evolutionMethod = content.evolutionMethod ?? EvolutionMethod.GENETIC_ALGORITHM;\r\n state.solarPanelArrayLayoutParams =\r\n content.solarPanelArrayLayoutParams ?? new DefaultSolarPanelArrayLayoutParams();\r\n state.solarPanelArrayLayoutConstraints =\r\n content.solarPanelArrayLayoutConstraints ?? new DefaultSolarPanelArrayLayoutConstraints();\r\n state.evolutionaryAlgorithmState =\r\n content.evolutionaryAlgorithmState ?? new DefaultEvolutionaryAlgorithmState();\r\n state.economicsParams = content.economicsParams ?? new DefaultEconomicsParams();\r\n state.minimumNavigationMoveSpeed = content.minimumNavigationMoveSpeed ?? 3;\r\n state.minimumNavigationTurnSpeed = content.minimumNavigationTurnSpeed ?? 3;\r\n // clear existing data, if any\r\n state.fittestIndividualResults.length = 0;\r\n state.undoManager.clear();\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n state.deletedRoofIdSet.clear();\r\n state.addedRoofIdSet.clear();\r\n state.actionState = new DefaultActionState();\r\n state.multiSelectionsMode = false;\r\n state.selectedElementIdSet.clear();\r\n state.groupActionMode = false;\r\n state.selectedFloatingWindow = null;\r\n StoreUtil.updateOldFileData(state);\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.changed = false;\r\n state.skipChange = true;\r\n state.showSolarRadiationHeatmap = false;\r\n state.showHeatFluxes = false;\r\n state.simulationInProgress = false;\r\n state.simulationPaused = false;\r\n state.clearDailySimulationResultsFlag = !state.clearDailySimulationResultsFlag;\r\n state.clearYearlySimulationResultsFlag = !state.clearYearlySimulationResultsFlag;\r\n state.navigationMoveSpeed = content.minimumNavigationMoveSpeed ?? 3;\r\n state.navigationTurnSpeed = content.minimumNavigationTurnSpeed ?? 3;\r\n });\r\n useDataStore.getState().clearDataStore();\r\n useDataStore.getState().clearRoofVerticesMap();\r\n },\r\n exportContent() {\r\n const state = get();\r\n const date = new Date();\r\n const elements = JSON.parse(JSON.stringify(state.elements));\r\n Util.fixElements(elements);\r\n return {\r\n docid: short.generate(),\r\n time: dayjs(date).format('MM/DD/YYYY hh:mm A'),\r\n timestamp: date.getTime(),\r\n userid: state.user.uid,\r\n owner: state.user.signFile ? state.user.displayName : null,\r\n email: state.user.signFile ? state.user.email : null,\r\n world: JSON.parse(JSON.stringify(state.world)),\r\n elements: elements,\r\n sceneRadius: state.sceneRadius,\r\n view: JSON.parse(JSON.stringify(state.viewState)),\r\n graphState: JSON.parse(JSON.stringify(state.graphState)),\r\n evolutionMethod: state.evolutionMethod,\r\n solarPanelArrayLayoutParams: JSON.parse(JSON.stringify(state.solarPanelArrayLayoutParams)),\r\n solarPanelArrayLayoutConstraints: JSON.parse(JSON.stringify(state.solarPanelArrayLayoutConstraints)),\r\n evolutionaryAlgorithmState: JSON.parse(JSON.stringify(state.evolutionaryAlgorithmState)),\r\n economicsParams: JSON.parse(JSON.stringify(state.economicsParams)),\r\n modelType: state.modelType,\r\n modelAuthor: state.modelAuthor,\r\n modelLabel: state.modelLabel,\r\n modelDescription: state.modelDescription,\r\n designProjectType: state.designProjectType,\r\n notes: state.notes,\r\n minimumNavigationMoveSpeed: state.minimumNavigationMoveSpeed,\r\n minimumNavigationTurnSpeed: state.minimumNavigationTurnSpeed,\r\n };\r\n },\r\n clearContent() {\r\n immerSet((state: CommonStoreState) => {\r\n state.elements = [];\r\n state.sceneRadius = 100;\r\n });\r\n useDataStore.getState().clearDataStore();\r\n useDataStore.getState().clearRoofVerticesMap();\r\n },\r\n createEmptyFile() {\r\n immerSet((state: CommonStoreState) => {\r\n DefaultWorldModel.resetWorldModel(state.world);\r\n DefaultViewState.resetViewState(state.viewState);\r\n // don't create a new instance like this (otherwise some UI elements may not update):\r\n // state.world = new DefaultWorldModel()\r\n state.elements = [];\r\n state.sceneRadius = 100;\r\n state.cloudFile = undefined;\r\n state.localContentToImportAfterCloudFileUpdate = undefined;\r\n state.notes = [];\r\n state.fileChanged = !state.fileChanged;\r\n state.currentUndoable = undefined;\r\n state.actionInfo = undefined;\r\n state.undoManager.clear();\r\n state.modelType = ModelType.UNKNOWN;\r\n state.modelLabel = null;\r\n state.modelDescription = null;\r\n state.designProjectType = null;\r\n state.minimumNavigationMoveSpeed = 3;\r\n state.minimumNavigationTurnSpeed = 3;\r\n state.multiSelectionsMode = false;\r\n state.selectedElementIdSet.clear();\r\n state.groupActionMode = false;\r\n state.selectedFloatingWindow = null;\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n state.deletedRoofIdSet.clear();\r\n state.addedRoofIdSet.clear();\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.changed = false;\r\n state.skipChange = true;\r\n state.showSolarRadiationHeatmap = false;\r\n state.showHeatFluxes = false;\r\n });\r\n useDataStore.getState().clearDataStore();\r\n useDataStore.getState().clearRoofVerticesMap();\r\n },\r\n undoManager: new UndoManager(),\r\n addUndoable(undoable: Undoable) {\r\n immerSet((state: CommonStoreState) => {\r\n if (state.loggable) {\r\n state.currentUndoable = undoable;\r\n }\r\n state.undoManager.add(undoable);\r\n });\r\n },\r\n\r\n // genetic algorithms\r\n fittestIndividualResults: [],\r\n setFittestIndividualResults(data) {\r\n immerSet((state: CommonStoreState) => {\r\n state.fittestIndividualResults = [...data];\r\n });\r\n },\r\n variableLabels: [],\r\n setVariableLabels(labels) {\r\n immerSet((state: CommonStoreState) => {\r\n state.variableLabels = [...labels];\r\n });\r\n },\r\n\r\n // aabb must be initialized with defined vectors, or it may cause problems as it may be used to\r\n // determine the scopes of the axes.\r\n aabb: new Box3(new Vector3(-10, -10, -10), new Vector3(10, 10, 10)),\r\n animate24Hours: false,\r\n evolutionMethod: EvolutionMethod.GENETIC_ALGORITHM,\r\n clickObjectType: null,\r\n contextMenuObjectType: null,\r\n hoveredHandle: null,\r\n moveHandleType: null,\r\n resizeHandleType: null,\r\n rotateHandleType: null,\r\n resizeAnchor: new Vector3(),\r\n\r\n selectedElement: null,\r\n getSelectedElement() {\r\n if (get().selectedElementIdSet.size === 0) return null;\r\n const selectedElement = get().selectedElement;\r\n if (!selectedElement) return null;\r\n return get().elements.find((e) => e.id === selectedElement.id) ?? null;\r\n },\r\n\r\n selectedElementIdSet: new Set(),\r\n multiSelectionsMode: false,\r\n\r\n // a sibling is defined as an element of the same type of the same parent\r\n findNearestSibling(id) {\r\n let foundId: string | null = null;\r\n const me = get().getElementById(id);\r\n if (me) {\r\n let distanceSquare = Number.MAX_VALUE;\r\n for (const e of get().elements) {\r\n if (e.type === me.type && e.parentId === me.parentId && e.id !== id) {\r\n const dx = me.cx - e.cx;\r\n const dy = me.cy - e.cy;\r\n const dz = me.cz - e.cz;\r\n const sq = dx * dx + dy * dy + dz * dz;\r\n if (distanceSquare > sq) {\r\n distanceSquare = sq;\r\n foundId = e.id;\r\n }\r\n }\r\n }\r\n }\r\n return foundId;\r\n },\r\n overlapWithSibling(me, threshold) {\r\n let overlap = false;\r\n if (threshold === undefined) {\r\n // when threshold is not set, check overlap of bounding boxes\r\n const parent = get().getParent(me);\r\n if (parent) {\r\n for (const e of get().elements) {\r\n if (e.type === me.type && e.parentId === me.parentId && e.id !== me.id) {\r\n if (me.type === ObjectType.SolarPanel) {\r\n if (Util.doSolarPanelsOverlap(me as SolarPanelModel, e as SolarPanelModel, parent)) {\r\n overlap = true;\r\n break;\r\n }\r\n } else {\r\n if (\r\n Math.abs(me.cx - e.cx) * parent.lx < 0.5 * (me.lx + e.lx) &&\r\n Math.abs(me.cy - e.cy) * parent.ly < 0.5 * (me.ly + e.ly) &&\r\n Math.abs(me.cz - e.cz) * parent.lz < 0.5 * (me.lz + e.lz)\r\n ) {\r\n overlap = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // when threshold is set, use the distance between centers to detect overlap using it\r\n const thresholdSquared = threshold * threshold;\r\n const parent = get().getParent(me);\r\n for (const e of get().elements) {\r\n if (e.type === me.type && e.parentId === me.parentId && e.id !== me.id) {\r\n const dx = (me.cx - e.cx) * (parent ? parent.lx : 1);\r\n const dy = (me.cy - e.cy) * (parent ? parent.ly : 1);\r\n const dz = (me.cz - e.cz) * (parent ? parent.lz : 1);\r\n const sq = dx * dx + dy * dy + dz * dz;\r\n if (sq < thresholdSquared) {\r\n overlap = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return overlap;\r\n },\r\n\r\n selectedSideIndex: -1,\r\n\r\n getResizeHandlePosition(el, handleType) {\r\n const { cx, cy, lx, ly, lz, type, parentId } = el;\r\n const p = new Vector3(cx, cy, 0);\r\n switch (type) {\r\n case ObjectType.Cuboid: {\r\n const v = new Vector2();\r\n switch (handleType) {\r\n case ResizeHandleType.LowerLeftTop:\r\n v.set(-lx / 2, -ly / 2);\r\n break;\r\n case ResizeHandleType.LowerRightTop:\r\n v.set(lx / 2, -ly / 2);\r\n break;\r\n case ResizeHandleType.UpperLeftTop:\r\n v.set(-lx / 2, ly / 2);\r\n break;\r\n case ResizeHandleType.UpperRightTop:\r\n v.set(lx / 2, ly / 2);\r\n break;\r\n }\r\n const { pos, rot } = Util.getWorldDataById(el.id);\r\n v.rotateAround(ORIGIN_VECTOR2, rot);\r\n p.set(pos.x + v.x, pos.y + v.y, pos.z - lz / 2);\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = el as WallModel;\r\n const parent = get().elements.find((e) => e.id === parentId);\r\n if (parent) {\r\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.lz);\r\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\r\n const handlePosition = new Vector3();\r\n switch (handleType) {\r\n case ResizeHandleType.UpperLeft: {\r\n handlePosition.fromArray(wall.leftPoint).setZ(0);\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n handlePosition.fromArray(wall.rightPoint).setZ(0);\r\n break;\r\n }\r\n }\r\n p.copy(handlePosition.applyEuler(parentRotation).add(parentPosition));\r\n }\r\n break;\r\n }\r\n case ObjectType.Roof: {\r\n const parent = get().elements.find((e) => e.id === parentId);\r\n if (parent) {\r\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.lz);\r\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\r\n const handlePosition = new Vector3(get().selectedElementX, get().selectedElementY)\r\n .applyEuler(parentRotation)\r\n .add(parentPosition);\r\n p.set(handlePosition.x, handlePosition.y, parent.lz);\r\n }\r\n break;\r\n }\r\n case ObjectType.Tree: {\r\n const parent = get().elements.find((e) => e.id === parentId);\r\n if (parent) {\r\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.cz + parent.lz / 2);\r\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\r\n p.copy(new Vector3(el.cx, el.cy, parent.lz).applyEuler(parentRotation).add(parentPosition));\r\n }\r\n break;\r\n }\r\n }\r\n return p;\r\n },\r\n getElementById(id) {\r\n const elements = get().elements;\r\n for (const e of elements) {\r\n if (e.id === id) {\r\n return e;\r\n }\r\n }\r\n return null;\r\n },\r\n getParent(child) {\r\n const elements = get().elements;\r\n for (const e of elements) {\r\n if (e.id === child.parentId) {\r\n return e;\r\n }\r\n }\r\n return null;\r\n },\r\n getFoundation(elem) {\r\n const elements = get().elements;\r\n for (const e of elements) {\r\n if (e.id === elem.foundationId && e.type === ObjectType.Foundation) {\r\n return e as FoundationModel;\r\n }\r\n }\r\n return null;\r\n },\r\n selectNone() {\r\n immerSet((state: CommonStoreState) => {\r\n state.selectedElementIdSet.clear();\r\n for (const e of state.elements) {\r\n e.selected = false;\r\n }\r\n state.selectedElement = null;\r\n });\r\n useRefStore.getState().selectNone();\r\n },\r\n selectMe(id, e, action, select) {\r\n const setEnableOrbitController = useRefStore.getState().setEnableOrbitController;\r\n if (e.intersections.length > 0) {\r\n const intersectableObjects = e.intersections.filter(\r\n (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\r\n );\r\n if (intersectableObjects[0].object === e.eventObject || select) {\r\n immerSet((state) => {\r\n for (const elem of state.elements) {\r\n if (elem.id === id) {\r\n elem.selected = true;\r\n state.selectedElement = elem;\r\n // TODO: lz is now zero for roof. So this may need to be set from elsewhere for roofs.\r\n state.selectedElementHeight = elem.lz;\r\n\r\n if (state.groupActionMode) {\r\n let fId = elem.foundationId ?? null;\r\n if (!fId && isGroupable(elem)) {\r\n fId = Util.getBaseId(elem.id);\r\n }\r\n if (fId) {\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (state.selectedElementIdSet.has(fId)) {\r\n state.selectedElementIdSet.delete(fId);\r\n } else {\r\n state.selectedElementIdSet.add(fId);\r\n }\r\n }\r\n } else {\r\n if (action === ActionType.ContextMenu) {\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (\r\n state.selectedElementIdSet.has(elem.id) &&\r\n elem.type !== state.selectedElement.type\r\n ) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n }\r\n } else {\r\n elem.selected = false;\r\n }\r\n }\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.rotateHandleType = null;\r\n if (action) {\r\n switch (action) {\r\n case ActionType.Move:\r\n if (\r\n state.selectedElement?.type === ObjectType.Tree ||\r\n state.selectedElement?.type === ObjectType.Human\r\n ) {\r\n // selecting the above two types of object automatically sets them to the moving state\r\n state.moveHandleType = MoveHandleType.Default;\r\n } else {\r\n state.moveHandleType = e.eventObject.name as MoveHandleType;\r\n }\r\n setEnableOrbitController(false);\r\n break;\r\n case ActionType.Resize:\r\n state.resizeHandleType = e.eventObject.name as ResizeHandleType;\r\n setEnableOrbitController(false);\r\n break;\r\n case ActionType.Rotate:\r\n state.rotateHandleType = e.eventObject.name as RotateHandleType;\r\n setEnableOrbitController(false);\r\n break;\r\n case ActionType.Select:\r\n state.selectedElementAngle = e.object.parent?.rotation.z ?? 0;\r\n setEnableOrbitController(true);\r\n break;\r\n default:\r\n setEnableOrbitController(true);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n },\r\n\r\n // for all types of elements\r\n updateAllElementLocks(locked) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n e.locked = locked;\r\n }\r\n });\r\n },\r\n updateElementLockByFoundationId(foundationId, locked) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId || e.parentId === foundationId || e.id === foundationId) {\r\n e.locked = locked;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLockByParentId(parentId, type: ObjectType, locked) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === parentId && type === e.type) {\r\n e.locked = locked;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLockById(id, locked) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.locked = locked;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementReferenceById(id, referenceId) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.referenceId = referenceId;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateElementLabelById(id, label) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.label = label;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementShowLabelById(id, showLabel) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.showLabel = showLabel;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // color\r\n updateElementColorById(id, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.color = color;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementColorOnSurface(type, parentId, normal, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementColorAboveFoundation(type, foundationId, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementColorForAll(type, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineColorById(id, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.lineColor = color;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineColorOnSurface(type, parentId, normal, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\r\n e.lineColor = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineColorAboveFoundation(type, foundationId, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.lineColor = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineColorForAll(type, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lineColor = color;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateElementLineWidthById(id, width) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.lineWidth = width;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineWidthOnSurface(type, parentId, normal, width) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\r\n e.lineWidth = width;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineWidthAboveFoundation(type, foundationId, width) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.lineWidth = width;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineWidthForAll(type, width) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lineWidth = width;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateElementCxById(id, cx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.cx = cx;\r\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementCyById(id, cy) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.cy = cy;\r\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementCzById(id, cz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.cz = cz;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementCzForAll(type, cz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.cz = cz;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // lx\r\n updateElementLxById(id, lx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.lx = lx;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLxAboveFoundation(type, foundationId, lx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.lx = lx;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLxOnSurface(type, parentId, normal, lx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n e.lx = lx;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateElementLxForAll(type, lx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lx = lx;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // ly\r\n updateElementLyById(id, ly) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.ly = ly;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLyAboveFoundation(type, foundationId, ly) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.ly = ly;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLyOnSurface(type, parentId, normal, ly) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n e.ly = ly;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateElementLyForAll(type, ly) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.ly = ly;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // lz\r\n updateElementLzById(id, lz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.lz = lz;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLzAboveFoundation(type, foundationId, lz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.lz = lz;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLzOnSurface(type, parentId, normal, lz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n e.lz = lz;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateElementLzForAll(type, lz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lz = lz;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateElementRotationById(id, x, y, z) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.rotation[0] = x;\r\n e.rotation[1] = y;\r\n e.rotation[2] = z;\r\n } else if (e.parentId === id && !isStackableModel(e)) {\r\n e.rotation[0] = x;\r\n e.rotation[1] = y;\r\n e.rotation[2] = z;\r\n }\r\n }\r\n state.selectedElementAngle = z;\r\n });\r\n },\r\n updateElementRotationForAll(type, x, y, z) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n if (!e.locked) {\r\n e.rotation[0] = x;\r\n e.rotation[1] = y;\r\n e.rotation[2] = z;\r\n }\r\n } else {\r\n // FIXME: I don't understand the logic below\r\n const parent = state.getParent(e);\r\n if (parent && !parent.locked && parent.type === type) {\r\n e.rotation[0] = x;\r\n e.rotation[1] = y;\r\n e.rotation[2] = z;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for solar collectors\r\n updateSolarCollectorDrawSunBeamById(id, draw) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (Util.isSolarCollector(e)) {\r\n (e as SolarCollector).drawSunBeam = draw;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorDrawSunBeamAboveFoundation(type, foundationId, draw) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === type) {\r\n (e as SolarCollector).drawSunBeam = draw;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorDrawSunBeamForAll(type, draw) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === type) {\r\n (e as SolarCollector).drawSunBeam = draw;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorRelativeAzimuthById(id, relativeAzimuth) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\r\n state.selectedElementAngle = relativeAzimuth;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorRelativeAzimuthAboveFoundation(type, foundationId, relativeAzimuth) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (\r\n e.type === type &&\r\n e.foundationId === foundationId &&\r\n !e.locked &&\r\n (e as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorRelativeAzimuthOnSurface(type, parentId, normal, relativeAzimuth) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorRelativeAzimuthForAll(type, relativeAzimuth) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked && (e as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateSolarCollectorPoleHeightById(id, poleHeight) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).poleHeight = poleHeight;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleHeightAboveFoundation(type, foundationId, poleHeight) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked && e.type === type) {\r\n (e as SolarCollector).poleHeight = poleHeight;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleHeightOnSurface(type, parentId, normal, poleHeight) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === type) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarCollector).poleHeight = poleHeight;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleHeightForAll(type, poleHeight) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n (e as SolarCollector).poleHeight = poleHeight;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateSolarCollectorPoleRadiusById(id, poleRadius) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).poleRadius = poleRadius;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleRadiusAboveFoundation(type, foundationId, poleRadius) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked && e.type === type) {\r\n (e as SolarCollector).poleRadius = poleRadius;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleRadiusOnSurface(type, parentId, normal, poleRadius) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === type) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarCollector).poleRadius = poleRadius;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleRadiusForAll(type, poleRadius) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n (e as SolarCollector).poleRadius = poleRadius;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // this should be called if any of the solar collectors changes\r\n clearAllSolarCollectorYields() {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (Util.isSolarCollector(e)) {\r\n const sc = e as SolarCollector;\r\n sc.dailyYield = 0;\r\n sc.yearlyYield = 0;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorDailyYieldById(id, dailyYield) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).dailyYield = dailyYield;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorYearlyYieldById(id, yearlyYield) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).yearlyYield = yearlyYield;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for concentrated solar power collectors\r\n updateCspReflectanceById(id, reflectance) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isCspCollector(e)) {\r\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateCspReflectanceAboveFoundation(type, foundationId, reflectance) {\r\n if (!Util.isCspCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId) {\r\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\r\n }\r\n }\r\n });\r\n },\r\n updateCspReflectanceForAll(type, reflectance) {\r\n if (!Util.isCspCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateParabolicCollectorAbsorptanceById(id, absorptance) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isParabolicCollector(e)) {\r\n (e as ParabolicCollector).absorptance = absorptance;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorAbsorptanceAboveFoundation(type, foundationId, absorptance) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId) {\r\n (e as ParabolicCollector).absorptance = absorptance;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorAbsorptanceForAll(type, absorptance) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n (e as ParabolicCollector).absorptance = absorptance;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateParabolicCollectorOpticalEfficiencyById(id, opticalEfficiency) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isParabolicCollector(e)) {\r\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorOpticalEfficiencyAboveFoundation(type, foundationId, opticalEfficiency) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId) {\r\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorOpticalEfficiencyForAll(type, opticalEfficiency) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateParabolicCollectorThermalEfficiencyById(id, thermalEfficiency) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isParabolicCollector(e)) {\r\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorThermalEfficiencyAboveFoundation(type, foundationId, thermalEfficiency) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId) {\r\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorThermalEfficiencyForAll(type, thermalEfficiency) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for foundations\r\n foundationActionScope: Scope.OnlyThisObject,\r\n setFoundationActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.foundationActionScope = scope;\r\n });\r\n },\r\n\r\n // for cuboids\r\n cuboidActionScope: Scope.OnlyThisSide,\r\n setCuboidActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.cuboidActionScope = scope;\r\n });\r\n },\r\n\r\n // for polygons\r\n polygonActionScope: Scope.OnlyThisObject,\r\n setPolygonActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.polygonActionScope = scope;\r\n });\r\n },\r\n updatePolygonVertexPositionById(id, index, x, y) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n if (index >= 0 && index < p.vertices.length) {\r\n p.vertices[index].x = x;\r\n p.vertices[index].y = y;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n // must feed a deep copy of the vertices\r\n updatePolygonVerticesById(id, vertices) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n p.vertices = vertices;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for solar panels\r\n solarPanelActionScope: Scope.OnlyThisObject,\r\n setSolarPanelActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.solarPanelActionScope = scope;\r\n });\r\n },\r\n updateSolarPanelTiltAngleById(id, tiltAngle) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.tiltAngle = tiltAngle;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n setSolarPanelOrientation(sp, pvModel, orientation) {\r\n sp.orientation = orientation;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n },\r\n\r\n // for parabolic troughs\r\n parabolicTroughActionScope: Scope.OnlyThisObject,\r\n setParabolicTroughActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.parabolicTroughActionScope = scope;\r\n });\r\n },\r\n\r\n // for Fresnel reflector\r\n fresnelReflectorActionScope: Scope.OnlyThisObject,\r\n setFresnelReflectorActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.fresnelReflectorActionScope = scope;\r\n });\r\n },\r\n\r\n // for heliostat\r\n heliostatActionScope: Scope.OnlyThisObject,\r\n setHeliostatActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.heliostatActionScope = scope;\r\n });\r\n },\r\n updateSolarReceiverById(id, receiverId) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (e.type === ObjectType.Heliostat) {\r\n (e as HeliostatModel).towerId = receiverId;\r\n break;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).receiverId = receiverId;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarReceiverAboveFoundation(type: ObjectType, foundationId, receiverId) {\r\n if (!Util.isHeliostatOrFresnelReflector(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === ObjectType.Heliostat) {\r\n (e as HeliostatModel).towerId = receiverId;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).receiverId = receiverId;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarReceiverForAll(type, receiverId) {\r\n if (!Util.isHeliostatOrFresnelReflector(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === ObjectType.Heliostat) {\r\n (e as HeliostatModel).towerId = receiverId;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).receiverId = receiverId;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for parabolic dishes\r\n parabolicDishActionScope: Scope.OnlyThisObject,\r\n setParabolicDishActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.parabolicDishActionScope = scope;\r\n });\r\n },\r\n\r\n // for parabolic troughs and Fresnel reflectors\r\n updateModuleLengthById(id, moduleLength) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).moduleLength = moduleLength;\r\n break;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).moduleLength = moduleLength;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateModuleLengthAboveFoundation(type, foundationId, moduleLength) {\r\n if (!Util.isParabolicTroughOrFresnelReflector(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).moduleLength = moduleLength;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).moduleLength = moduleLength;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateModuleLengthForAll(type, moduleLength) {\r\n if (!Util.isParabolicTroughOrFresnelReflector(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).moduleLength = moduleLength;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).moduleLength = moduleLength;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for parabolic troughs and dishes\r\n updateParabolaLatusRectumById(id, latusRectum) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).latusRectum = latusRectum;\r\n } else if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).latusRectum = latusRectum;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolaLatusRectumAboveFoundation(type, foundationId, latusRectum) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).latusRectum = latusRectum;\r\n } else if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).latusRectum = latusRectum;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateParabolaLatusRectumForAll(type, latusRectum) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).latusRectum = latusRectum;\r\n } else if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).latusRectum = latusRectum;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for walls\r\n wallActionScope: Scope.OnlyThisObject,\r\n setWallActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.wallActionScope = scope;\r\n });\r\n },\r\n // for roofs\r\n roofActionScope: Scope.OnlyThisObject,\r\n setRoofActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.roofActionScope = scope;\r\n });\r\n },\r\n // for windows\r\n windowActionScope: Scope.OnlyThisObject,\r\n setWindowActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.windowActionScope = scope;\r\n });\r\n },\r\n\r\n // for doors\r\n doorActionScope: Scope.OnlyThisObject,\r\n setDoorActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.doorActionScope = scope;\r\n });\r\n },\r\n\r\n updateWallRelativeAngleById(id, angle) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).relativeAngle = angle;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateWallLeftJointsById(id, joints) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id) {\r\n (e as WallModel).leftJoints = joints;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateWallRightJointsById(id, joints) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id) {\r\n (e as WallModel).rightJoints = joints;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateWallLeftPointById(id, point) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).leftPoint = [...point];\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateWallRightPointById(id, point) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).rightPoint = [...point];\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateRoofRiseById(id, rise, topZ) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Roof) {\r\n (e as RoofModel).rise = rise;\r\n state.actionState.roofRise = rise;\r\n if (topZ !== undefined) {\r\n state.selectedElementHeight = topZ;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateRoofStructureById(id, structure) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Roof) {\r\n const roofModel = e as RoofModel;\r\n roofModel.roofStructure = structure;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateInsideLightById(id, inside) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Light && e.id === id) {\r\n (e as LightModel).inside = inside;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateInsideLightsByParentId(parentId, inside) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === parentId && e.type === ObjectType.Light) {\r\n (e as LightModel).inside = inside;\r\n }\r\n }\r\n });\r\n },\r\n\r\n setElementPosition(id, x, y, z?) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const [i, e] of state.elements.entries()) {\r\n if (e.id === id) {\r\n state.elements[i].cx = x;\r\n state.elements[i].cy = y;\r\n if (z !== undefined) {\r\n state.elements[i].cz = z;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n setElementNormal(id, x, y, z) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const [i, e] of state.elements.entries()) {\r\n if (e.id === id || e.parentId === id) {\r\n const elem = state.elements[i];\r\n elem.normal[0] = x;\r\n elem.normal[1] = y;\r\n elem.normal[2] = z;\r\n }\r\n }\r\n });\r\n },\r\n setElementSize(id, lx, ly, lz?) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const [i, e] of state.elements.entries()) {\r\n if (e.id === id) {\r\n state.elements[i].lx = lx;\r\n state.elements[i].ly = ly;\r\n if (lz) {\r\n state.elements[i].lz = lz;\r\n state.selectedElementHeight = lz;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n actionModeLock: false,\r\n objectTypeToAdd: ObjectType.None,\r\n addElement(parent, p, normal) {\r\n let model: ElementModel | null = null;\r\n const parentId = 'id' in parent ? parent.id : GROUND_ID;\r\n immerSet((state: CommonStoreState) => {\r\n switch (state.objectTypeToAdd) {\r\n case ObjectType.Human: {\r\n const position = new Vector3().copy(p);\r\n if (parentId !== GROUND_ID) {\r\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\r\n position\r\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n }\r\n const human = ElementModelFactory.makeHuman(\r\n state.actionState.humanName,\r\n parentId,\r\n position.x,\r\n position.y,\r\n position.z,\r\n );\r\n model = human;\r\n state.elements.push(human);\r\n break;\r\n }\r\n case ObjectType.Tree: {\r\n const position = new Vector3().copy(p);\r\n if (parentId !== GROUND_ID) {\r\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\r\n position\r\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n }\r\n const tree = ElementModelFactory.makeTree(\r\n state.actionState.treeType,\r\n state.actionState.treeSpread,\r\n state.actionState.treeHeight,\r\n parentId,\r\n position.x,\r\n position.y,\r\n position.z,\r\n );\r\n model = tree;\r\n state.elements.push(tree);\r\n break;\r\n }\r\n case ObjectType.Flower: {\r\n const position = new Vector3().copy(p);\r\n if (parentId !== GROUND_ID) {\r\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\r\n position\r\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n }\r\n const flower = ElementModelFactory.makeFlower(\r\n state.actionState.flowerType,\r\n parentId,\r\n position.x,\r\n position.y,\r\n position.z,\r\n );\r\n model = flower;\r\n state.elements.push(flower);\r\n break;\r\n }\r\n case ObjectType.Polygon:\r\n const polygonParentModel = parent as ElementModel;\r\n const polygonRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, polygonParentModel);\r\n const polygon = ElementModelFactory.makePolygon(\r\n polygonParentModel,\r\n polygonRelativeCoordinates.x,\r\n polygonRelativeCoordinates.y,\r\n polygonRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n polygonParentModel.type,\r\n );\r\n model = polygon;\r\n state.elements.push(polygon);\r\n break;\r\n case ObjectType.Sensor:\r\n const sensorParentModel = parent as ElementModel;\r\n const sensorRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, sensorParentModel);\r\n const sensor = ElementModelFactory.makeSensor(\r\n sensorParentModel,\r\n sensorRelativeCoordinates.x,\r\n sensorRelativeCoordinates.y,\r\n sensorRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n );\r\n model = sensor;\r\n state.elements.push(sensor);\r\n break;\r\n case ObjectType.Light:\r\n const lightParentModel = parent as ElementModel;\r\n const lightRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, lightParentModel);\r\n const light = ElementModelFactory.makeLight(\r\n lightParentModel,\r\n 2,\r\n state.actionState.lightDistance,\r\n state.actionState.lightIntensity,\r\n state.actionState.lightColor,\r\n lightRelativeCoordinates.x,\r\n lightRelativeCoordinates.y,\r\n lightRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n );\r\n model = light;\r\n state.elements.push(light);\r\n break;\r\n case ObjectType.SolarPanel:\r\n const solarPanelParentModel = parent as ElementModel;\r\n const solarPanelRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, solarPanelParentModel);\r\n const solarPanel = ElementModelFactory.makeSolarPanel(\r\n solarPanelParentModel,\r\n state.getPvModule(state.actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\r\n solarPanelRelativeCoordinates.x,\r\n solarPanelRelativeCoordinates.y,\r\n solarPanelRelativeCoordinates.z,\r\n state.actionState.solarPanelOrientation ?? Orientation.landscape,\r\n state.actionState.solarPanelPoleHeight ?? 1,\r\n state.actionState.solarPanelPoleSpacing ?? 3,\r\n state.actionState.solarPanelTiltAngle ?? 0,\r\n state.actionState.solarPanelRelativeAzimuth ?? 0,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.solarPanelFrameColor ?? 'white',\r\n );\r\n model = solarPanel;\r\n state.elements.push(solarPanel);\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n const parabolicTroughParentModel = parent as ElementModel;\r\n const parabolicTroughRelativeCoordinates = Util.relativeCoordinates(\r\n p.x,\r\n p.y,\r\n p.z,\r\n parabolicTroughParentModel,\r\n );\r\n const parabolicTrough = ElementModelFactory.makeParabolicTrough(\r\n parabolicTroughParentModel,\r\n state.actionState.parabolicTroughReflectance,\r\n state.actionState.parabolicTroughAbsorptance,\r\n state.actionState.parabolicTroughOpticalEfficiency,\r\n state.actionState.parabolicTroughThermalEfficiency,\r\n state.actionState.parabolicTroughLatusRectum,\r\n state.actionState.parabolicTroughPoleHeight,\r\n state.actionState.parabolicTroughModuleLength,\r\n parabolicTroughRelativeCoordinates.x,\r\n parabolicTroughRelativeCoordinates.y,\r\n parabolicTroughRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.parabolicTroughWidth,\r\n );\r\n model = parabolicTrough;\r\n state.elements.push(parabolicTrough);\r\n break;\r\n case ObjectType.ParabolicDish:\r\n const parabolicDishParentModel = parent as ElementModel;\r\n const parabolicDishRelativeCoordinates = Util.relativeCoordinates(\r\n p.x,\r\n p.y,\r\n p.z,\r\n parabolicDishParentModel,\r\n );\r\n const parabolicDish = ElementModelFactory.makeParabolicDish(\r\n parabolicDishParentModel,\r\n state.actionState.parabolicDishReflectance,\r\n state.actionState.parabolicDishAbsorptance,\r\n state.actionState.parabolicDishOpticalEfficiency,\r\n state.actionState.parabolicDishThermalEfficiency,\r\n state.actionState.parabolicDishLatusRectum,\r\n state.actionState.parabolicDishPoleHeight,\r\n state.actionState.parabolicDishReceiverStructure,\r\n parabolicDishRelativeCoordinates.x,\r\n parabolicDishRelativeCoordinates.y,\r\n parabolicDishRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.parabolicDishRimDiameter,\r\n state.actionState.parabolicDishRimDiameter,\r\n );\r\n model = parabolicDish;\r\n state.elements.push(parabolicDish);\r\n break;\r\n case ObjectType.FresnelReflector:\r\n const fresnelReflectorParentModel = parent as ElementModel;\r\n const fresnelReflectorRelativeCoordinates = Util.relativeCoordinates(\r\n p.x,\r\n p.y,\r\n p.z,\r\n fresnelReflectorParentModel,\r\n );\r\n const fresnelReflector = ElementModelFactory.makeFresnelReflector(\r\n fresnelReflectorParentModel,\r\n state.actionState.fresnelReflectorReceiver,\r\n state.actionState.fresnelReflectorReflectance,\r\n state.actionState.fresnelReflectorPoleHeight,\r\n state.actionState.fresnelReflectorModuleLength,\r\n fresnelReflectorRelativeCoordinates.x,\r\n fresnelReflectorRelativeCoordinates.y,\r\n fresnelReflectorRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.fresnelReflectorWidth,\r\n );\r\n model = fresnelReflector;\r\n state.elements.push(fresnelReflector);\r\n break;\r\n case ObjectType.Heliostat:\r\n const heliostatParentModel = parent as ElementModel;\r\n const heliostatRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, heliostatParentModel);\r\n const heliostat = ElementModelFactory.makeHeliostat(\r\n heliostatParentModel,\r\n state.actionState.heliostatTower,\r\n state.actionState.heliostatReflectance,\r\n state.actionState.heliostatPoleHeight,\r\n heliostatRelativeCoordinates.x,\r\n heliostatRelativeCoordinates.y,\r\n heliostatRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.heliostatLength,\r\n state.actionState.heliostatWidth,\r\n );\r\n model = heliostat;\r\n state.elements.push(heliostat);\r\n break;\r\n case ObjectType.Foundation:\r\n const foundation = ElementModelFactory.makeFoundation(\r\n p.x,\r\n p.y,\r\n state.actionState.foundationHeight,\r\n state.actionState.foundationColor,\r\n state.actionState.foundationTexture,\r\n );\r\n model = foundation;\r\n state.elements.push(foundation);\r\n break;\r\n case ObjectType.Cuboid:\r\n const cuboid = ElementModelFactory.makeCuboid(\r\n p.x,\r\n p.y,\r\n state.actionState.cuboidHeight,\r\n state.actionState.cuboidFaceColors,\r\n state.actionState.cuboidFaceTextures,\r\n );\r\n model = cuboid;\r\n state.elements.push(cuboid);\r\n break;\r\n case ObjectType.Wall:\r\n const wallParentModel = parent as ElementModel;\r\n const relativePos = Util.wallRelativePosition(new Vector3(p.x, p.y), wallParentModel);\r\n const wall = ElementModelFactory.makeWall(\r\n wallParentModel,\r\n relativePos.x,\r\n relativePos.y,\r\n relativePos.z,\r\n normal,\r\n );\r\n state.elements.push(wall);\r\n state.selectedElement = wall;\r\n model = wall;\r\n break;\r\n }\r\n if (model) {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(model.id);\r\n }\r\n });\r\n return model;\r\n },\r\n\r\n elementsToPaste: [],\r\n deletedElements: [],\r\n clearDeletedElements() {\r\n immerSet((state: CommonStoreState) => {\r\n state.deletedElements = [];\r\n });\r\n },\r\n pastePoint: new Vector3(),\r\n pasteNormal: undefined,\r\n copyElementById(id) {\r\n immerSet((state: CommonStoreState) => {\r\n state.elementsToPaste = [];\r\n // make sure that the first element to paste is the current one when it may be a parent\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (e.type === ObjectType.Polygon) {\r\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\r\n const centroid = Util.calculatePolygonCentroid((e as PolygonModel).vertices);\r\n e.cx = centroid.x;\r\n e.cy = centroid.y;\r\n state.elementsToPaste.push(e);\r\n } else if (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Wall) {\r\n const parentWall = state.elements.find(\r\n (el) => el.id === e.parentId && el.type === ObjectType.Wall,\r\n ) as WallModel | undefined;\r\n if (parentWall) {\r\n const copiedWindow = { ...e };\r\n copiedWindow.lx = e.lx * parentWall.lx;\r\n copiedWindow.lz = e.lz * parentWall.lz;\r\n state.elementsToPaste.push(copiedWindow);\r\n }\r\n } else {\r\n state.elementsToPaste.push(e);\r\n }\r\n break;\r\n }\r\n }\r\n for (const e of state.elements) {\r\n if (Util.isChild(id, e.id)) {\r\n if (e.type === ObjectType.Polygon) {\r\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\r\n const centroid = Util.calculatePolygonCentroid((e as PolygonModel).vertices);\r\n e.cx = centroid.x;\r\n e.cy = centroid.y;\r\n }\r\n state.elementsToPaste.push(e);\r\n }\r\n }\r\n });\r\n },\r\n removeSelectedElements() {\r\n const selectedIdSet = get().selectedElementIdSet;\r\n if (selectedIdSet.size === 0) return [];\r\n\r\n const selectedIds = Array.from(selectedIdSet);\r\n const deletedElementSet = new Set();\r\n const deletedElementIdSet = new Set();\r\n for (const e of get().elements) {\r\n if (selectedIdSet.has(e.id)) {\r\n deletedElementSet.add(e);\r\n deletedElementIdSet.add(e.id);\r\n } else {\r\n for (const id of selectedIds) {\r\n if (Util.isChild(id, e.id)) {\r\n deletedElementSet.add(e);\r\n deletedElementIdSet.add(e.id);\r\n }\r\n }\r\n }\r\n }\r\n\r\n immerSet((state) => {\r\n state.autoDeletedRoofs = [];\r\n state.deletedElements = Array.from(deletedElementSet);\r\n state.elements = state.elements.filter((e) => {\r\n if (deletedElementIdSet.has(e.id)) {\r\n switch (e.type) {\r\n case ObjectType.Wall: {\r\n const currentWall = e as WallModel;\r\n let leftWallId = '';\r\n let rightWallId = '';\r\n if (currentWall.leftJoints.length > 0) {\r\n leftWallId = state.getElementById(currentWall.leftJoints[0])?.id ?? '';\r\n }\r\n if (currentWall.rightJoints.length > 0) {\r\n rightWallId = state.getElementById(currentWall.rightJoints[0])?.id ?? '';\r\n }\r\n for (const el of state.elements) {\r\n if (el.id === leftWallId) {\r\n (el as WallModel).rightJoints = [];\r\n } else if (el.id === rightWallId) {\r\n (el as WallModel).leftJoints = [];\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n break;\r\n }\r\n case ObjectType.Roof: {\r\n state.deletedRoofIdSet.add(e.id);\r\n useDataStore.getState().deleteRoofSegmentVertices(e.id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(e.id);\r\n break;\r\n }\r\n }\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n });\r\n\r\n return Array.from(deletedElementSet);\r\n },\r\n removeElementById(id, cut, selectNone = true, autoDeleted) {\r\n const removed = get().elements.filter((e) => e.id === id || Util.isChild(id, e.id));\r\n immerSet((state: CommonStoreState) => {\r\n for (const elem of state.elements) {\r\n if (elem.id === id) {\r\n // the first element must be the parent if there are children needed to be removed as well\r\n if (cut) {\r\n if (elem.type === ObjectType.Polygon) {\r\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\r\n const centroid = Util.calculatePolygonCentroid((elem as PolygonModel).vertices);\r\n elem.cx = centroid.x;\r\n elem.cy = centroid.y;\r\n state.elementsToPaste = [elem];\r\n } else if (\r\n elem.type === ObjectType.Window &&\r\n (elem as WindowModel).parentType === ObjectType.Wall\r\n ) {\r\n const parentWall = state.elements.find(\r\n (el) => el.id === elem.parentId && el.type === ObjectType.Wall,\r\n ) as WallModel | undefined;\r\n if (parentWall) {\r\n const copiedWindow = { ...elem };\r\n copiedWindow.lx = elem.lx * parentWall.lx;\r\n copiedWindow.lz = elem.lz * parentWall.lz;\r\n state.elementsToPaste = [copiedWindow];\r\n }\r\n } else {\r\n state.elementsToPaste = [elem];\r\n }\r\n } else if (!autoDeleted) {\r\n state.deletedElements = [elem];\r\n }\r\n elem.selected = false;\r\n switch (elem.type) {\r\n case ObjectType.Roof: {\r\n const roof = elem as RoofModel;\r\n state.deletedRoofId = elem.id;\r\n state.deletedRoofIdSet.add(elem.id);\r\n useDataStore.getState().deleteRoofSegmentVertices(id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(id);\r\n if (autoDeleted) {\r\n if (state.autoDeletedRoofs) {\r\n state.autoDeletedRoofs.push(roof);\r\n } else {\r\n state.autoDeletedRoofs = [roof];\r\n }\r\n state.autoDeletedRoofIdSet.add(roof.id);\r\n }\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const currentWall = elem as WallModel;\r\n let leftWallId = '';\r\n let rightWallId = '';\r\n if (currentWall.leftJoints.length > 0) {\r\n leftWallId = state.getElementById(currentWall.leftJoints[0])?.id ?? '';\r\n }\r\n if (currentWall.rightJoints.length > 0) {\r\n rightWallId = state.getElementById(currentWall.rightJoints[0])?.id ?? '';\r\n }\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId) {\r\n (e as WallModel).rightJoints = [];\r\n } else if (e.id === rightWallId) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n state.elements = state.elements.filter(\r\n (e) => !(e.type === ObjectType.Roof && (e as RoofModel).wallsId.length === 0),\r\n );\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.deletedWallId = elem.id;\r\n break;\r\n }\r\n case ObjectType.Foundation: {\r\n state.deletedFoundationId = elem.id;\r\n break;\r\n }\r\n case ObjectType.Cuboid: {\r\n state.deletedCuboidId = elem.id;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (autoDeleted) {\r\n for (const child of state.elements) {\r\n if (Util.isChild(id, child.id)) {\r\n if (state.autoDeletedChild) {\r\n state.autoDeletedChild.push(child);\r\n } else {\r\n state.autoDeletedChild = [child];\r\n }\r\n }\r\n }\r\n } else {\r\n if (cut) {\r\n for (const child of state.elements) {\r\n if (Util.isChild(id, child.id)) {\r\n state.elementsToPaste.push(child);\r\n }\r\n }\r\n } else {\r\n for (const child of state.elements) {\r\n if (Util.isChild(id, child.id)) {\r\n state.deletedElements.push(child);\r\n }\r\n }\r\n }\r\n }\r\n state.elements = state.elements.filter((e) => {\r\n if (e.id === id || e.parentId === id || e.foundationId === id || Util.isChild(id, e.id)) {\r\n if (e.type === ObjectType.Roof) {\r\n useDataStore.getState().deleteRoofSegmentVertices(id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(id);\r\n }\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n state.selectedElementIdSet.delete(id);\r\n if (selectNone) {\r\n state.selectedElement = null;\r\n state.selectedElementIdSet.clear();\r\n }\r\n });\r\n return removed;\r\n },\r\n removeElementsByType(type) {\r\n immerSet((state: CommonStoreState) => {\r\n if (type === ObjectType.Foundation) {\r\n state.elements = state.elements.filter((x) => {\r\n if (x.locked || (x.type !== ObjectType.Foundation && !x.foundationId)) {\r\n return true;\r\n } else {\r\n if (x.type === ObjectType.Roof) {\r\n useDataStore.getState().deleteRoofSegmentVertices(x.id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(x.id);\r\n }\r\n return false;\r\n }\r\n });\r\n } else {\r\n state.elements = state.elements.filter((x) => {\r\n if (x.locked || x.type !== type) {\r\n return true;\r\n } else {\r\n if (x.type === ObjectType.Roof) {\r\n useDataStore.getState().deleteRoofSegmentVertices(x.id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(x.id);\r\n }\r\n return false;\r\n }\r\n });\r\n }\r\n });\r\n },\r\n countElementsByType(type, excludeLocked) {\r\n let count = 0;\r\n if (excludeLocked) {\r\n for (const e of get().elements) {\r\n if (e.type === type && !e.locked) {\r\n count++;\r\n }\r\n }\r\n } else {\r\n for (const e of get().elements) {\r\n if (e.type === type) {\r\n count++;\r\n }\r\n }\r\n }\r\n return count;\r\n },\r\n countSolarStructuresByType(type, excludeLocked) {\r\n let count = 0;\r\n if (excludeLocked) {\r\n for (const e of get().elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n if ((e as FoundationModel).solarStructure === type) {\r\n count++;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of get().elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n if ((e as FoundationModel).solarStructure === type) {\r\n count++;\r\n }\r\n }\r\n }\r\n }\r\n return count;\r\n },\r\n countObservers() {\r\n let count = 0;\r\n for (const e of get().elements) {\r\n if (e.type === ObjectType.Human && (e as HumanModel).observer) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n },\r\n removeElementsByReferenceId(id, cache) {\r\n immerSet((state: CommonStoreState) => {\r\n if (cache) {\r\n state.deletedElements = [];\r\n for (const e of state.elements) {\r\n if (e.referenceId === id) {\r\n state.deletedElements.push(e);\r\n }\r\n }\r\n }\r\n state.elements = state.elements.filter((e) => {\r\n return e.referenceId !== id;\r\n });\r\n });\r\n },\r\n countElementsByReferenceId(id) {\r\n let count = 0;\r\n for (const e of get().elements) {\r\n if (e.referenceId === id) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n },\r\n\r\n getChildren(id) {\r\n const children: ElementModel[] = [];\r\n for (const e of get().elements) {\r\n if (e.parentId === id) {\r\n children.push(e);\r\n }\r\n }\r\n return children;\r\n },\r\n getChildrenOfType(type: ObjectType, id) {\r\n const children: ElementModel[] = [];\r\n for (const e of get().elements) {\r\n if (e.type === type && e.parentId === id) {\r\n children.push(e);\r\n }\r\n }\r\n return children;\r\n },\r\n removeAllChildElementsByType(parentId, type) {\r\n immerSet((state: CommonStoreState) => {\r\n state.elements = state.elements.filter((x) => x.locked || x.type !== type || x.parentId !== parentId);\r\n if (type === ObjectType.Wall) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n },\r\n removeAllElementsOnFoundationByType(foundationId, type) {\r\n immerSet((state: CommonStoreState) => {\r\n state.elements = state.elements.filter(\r\n (x) => x.locked || x.type !== type || x.foundationId !== foundationId,\r\n );\r\n if (type === ObjectType.Wall) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n },\r\n countAllElements(excludeLocked) {\r\n let count = 0;\r\n if (excludeLocked) {\r\n for (const e of get().elements) {\r\n if (!e.locked) {\r\n count++;\r\n }\r\n }\r\n } else {\r\n count = get().elements.length;\r\n }\r\n return count;\r\n },\r\n countAllElementsByType(excludeLocked) {\r\n const counter = new ElementCounter();\r\n for (const e of get().elements) {\r\n if (excludeLocked && e.locked) continue;\r\n switch (e.type) {\r\n case ObjectType.Foundation:\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n counter.solarUpdraftTowerCount++;\r\n }\r\n counter.foundationCount++;\r\n break;\r\n case ObjectType.Cuboid:\r\n counter.cuboidCount++;\r\n break;\r\n case ObjectType.Wall:\r\n counter.wallCount++;\r\n break;\r\n case ObjectType.Window:\r\n counter.windowCount++;\r\n break;\r\n case ObjectType.Door:\r\n counter.doorCount++;\r\n break;\r\n case ObjectType.Human:\r\n counter.humanCount++;\r\n break;\r\n case ObjectType.Tree:\r\n counter.treeCount++;\r\n break;\r\n case ObjectType.Flower:\r\n counter.flowerCount++;\r\n break;\r\n case ObjectType.Polygon:\r\n counter.polygonCount++;\r\n break;\r\n case ObjectType.Sensor:\r\n counter.sensorCount++;\r\n break;\r\n case ObjectType.Light:\r\n if ((e as LightModel).inside) {\r\n counter.insideLightCount++;\r\n } else {\r\n counter.outsideLightCount++;\r\n }\r\n break;\r\n case ObjectType.SolarPanel:\r\n counter.solarPanelCount++;\r\n const sp = e as SolarPanelModel;\r\n const pvModel = get().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n counter.solarPanelModuleCount += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n break;\r\n case ObjectType.ParabolicDish:\r\n counter.parabolicDishCount++;\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n counter.parabolicTroughCount++;\r\n break;\r\n case ObjectType.FresnelReflector:\r\n counter.fresnelReflectorCount++;\r\n break;\r\n case ObjectType.Heliostat:\r\n counter.heliostatCount++;\r\n break;\r\n case ObjectType.WindTurbine:\r\n counter.windTurbineCount++;\r\n break;\r\n }\r\n }\r\n return counter;\r\n },\r\n countAllOffspringsByTypeAtOnce(ancestorId, includingLocked) {\r\n const counter = new ElementCounter();\r\n for (const e of get().elements) {\r\n // foundationId applies to both foundations and cuboids, should have been named ancestorId\r\n const idOk = e.parentId === ancestorId || e.foundationId === ancestorId;\r\n if (includingLocked ? idOk : !e.locked && idOk) {\r\n switch (e.type) {\r\n case ObjectType.Foundation:\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n counter.solarUpdraftTowerCount++;\r\n }\r\n counter.foundationCount++;\r\n break;\r\n case ObjectType.Cuboid:\r\n counter.cuboidCount++;\r\n break;\r\n case ObjectType.Wall:\r\n counter.wallCount++;\r\n break;\r\n case ObjectType.Window:\r\n counter.windowCount++;\r\n break;\r\n case ObjectType.Door:\r\n counter.doorCount++;\r\n break;\r\n case ObjectType.Human:\r\n counter.humanCount++;\r\n break;\r\n case ObjectType.Tree:\r\n counter.treeCount++;\r\n break;\r\n case ObjectType.Flower:\r\n counter.flowerCount++;\r\n break;\r\n case ObjectType.Polygon:\r\n counter.polygonCount++;\r\n break;\r\n case ObjectType.Sensor:\r\n counter.sensorCount++;\r\n break;\r\n case ObjectType.Light:\r\n if ((e as LightModel).inside) {\r\n counter.insideLightCount++;\r\n } else {\r\n counter.outsideLightCount++;\r\n }\r\n break;\r\n case ObjectType.SolarPanel:\r\n counter.solarPanelCount++;\r\n const sp = e as SolarPanelModel;\r\n const pvModel = get().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n counter.solarPanelModuleCount += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n break;\r\n case ObjectType.ParabolicDish:\r\n counter.parabolicDishCount++;\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n counter.parabolicTroughCount++;\r\n break;\r\n case ObjectType.FresnelReflector:\r\n counter.fresnelReflectorCount++;\r\n break;\r\n case ObjectType.Heliostat:\r\n counter.heliostatCount++;\r\n break;\r\n case ObjectType.WindTurbine:\r\n counter.windTurbineCount++;\r\n break;\r\n }\r\n }\r\n }\r\n return counter;\r\n },\r\n countSolarPanelsOnRack(id) {\r\n let count = 0;\r\n for (const e of get().elements) {\r\n if (e.id === id && e.type === ObjectType.SolarPanel) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = get().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n count = Util.countSolarPanelsOnRack(sp, pvModel);\r\n break;\r\n }\r\n }\r\n }\r\n return count;\r\n },\r\n\r\n // must copy the elements because they may be pasted multiple times.\r\n // so we must treat them as newly added elements each time.\r\n // note that the case of deletion is treated differently because the deleted elements cannot be pasted.\r\n copyCutElements() {\r\n const copiedElements: ElementModel[] = [];\r\n const map = new Map(); // oldId => newElement\r\n const elementsMapOldToNew = new Map();\r\n const elementsMapNewToOld = new Map();\r\n for (let i = 0; i < get().elementsToPaste.length; i++) {\r\n const oldElem = get().elementsToPaste[i];\r\n let newElem: ElementModel | null = null;\r\n if (i === 0) {\r\n // the first element is the parent\r\n if (get().getElementById(oldElem.id)) {\r\n // make a clone with a new ID if the old ID is in the elements\r\n newElem = ElementModelCloner.clone(\r\n get().getParent(oldElem),\r\n oldElem,\r\n oldElem.cx,\r\n oldElem.cy,\r\n oldElem.cz,\r\n );\r\n } else {\r\n // preserve the ID if it is not in the elements\r\n newElem = JSON.parse(JSON.stringify(oldElem));\r\n }\r\n if (newElem?.type === ObjectType.Wall) {\r\n const w = newElem as WallModel;\r\n w.roofId = undefined;\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n w.centerLeftRoofHeight = undefined;\r\n w.centerRightRoofHeight = undefined;\r\n w.centerRoofHeight = undefined;\r\n }\r\n } else {\r\n const oldParent = get().elementsToPaste.find((el) => el.id === oldElem.parentId);\r\n if (oldParent) {\r\n const newParent = map.get(oldParent.id);\r\n if (newParent) {\r\n if (get().getElementById(oldElem.id)) {\r\n // make a clone with a new ID if the old ID is in the elements\r\n newElem = ElementModelCloner.clone(\r\n newParent,\r\n oldElem,\r\n oldElem.cx,\r\n oldElem.cy,\r\n oldElem.cz,\r\n oldElem.type === ObjectType.Polygon,\r\n );\r\n if (\r\n newElem?.type === ObjectType.Window &&\r\n (newElem as WindowModel).parentType === ObjectType.Wall\r\n ) {\r\n newElem.lx *= newParent.lx;\r\n newElem.lz *= newParent.lz;\r\n }\r\n } else {\r\n // preserve the ID if it is not in the elements\r\n newElem = JSON.parse(JSON.stringify(oldElem));\r\n }\r\n }\r\n }\r\n }\r\n if (newElem) {\r\n map.set(oldElem.id, newElem);\r\n elementsMapOldToNew.set(oldElem.id, newElem.id);\r\n elementsMapNewToOld.set(newElem.id, oldElem.id);\r\n copiedElements.push(newElem);\r\n }\r\n }\r\n for (const e of copiedElements) {\r\n // search new roof\r\n if (e.type === ObjectType.Roof) {\r\n const oldRoofId = elementsMapNewToOld.get(e.id);\r\n if (oldRoofId) {\r\n for (const o of get().elementsToPaste) {\r\n if (o.id === oldRoofId) {\r\n (e as RoofModel).wallsId = (o as RoofModel).wallsId.map(\r\n (v) => elementsMapOldToNew.get(v) as string,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n // search new wall\r\n if (e.type === ObjectType.Wall) {\r\n const oldWallId = elementsMapNewToOld.get(e.id);\r\n if (oldWallId) {\r\n for (const o of get().elementsToPaste) {\r\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\r\n const w = o as WallModel;\r\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\r\n if (left) {\r\n (e as WallModel).leftJoints = [left];\r\n }\r\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\r\n if (right) {\r\n (e as WallModel).rightJoints = [right];\r\n }\r\n if (w.roofId) {\r\n const roofId = elementsMapOldToNew.get(w.roofId as string);\r\n if (roofId) {\r\n (e as WallModel).roofId = roofId;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return copiedElements;\r\n },\r\n\r\n pasteElementsToPoint() {\r\n const pastedElements: ElementModel[] = [];\r\n immerSet((state: CommonStoreState) => {\r\n if (state.elementsToPaste.length === 1) {\r\n // only the parent element is included in elementsToPaste when copied,\r\n // so we have to copy its children and grandchildren from existing elements\r\n let m = state.pastePoint;\r\n const elemToPaste = state.elementsToPaste[0];\r\n let newParent = state.selectedElement;\r\n const oldParent = state.getParent(elemToPaste);\r\n if (newParent) {\r\n if (newParent.type === ObjectType.Polygon) {\r\n // paste action of polygon is passed to its parent\r\n const q = state.getParent(newParent);\r\n if (q) {\r\n newParent = q;\r\n elemToPaste.parentId = newParent.id;\r\n if (Util.isPositionRelative(elemToPaste.type)) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n }\r\n }\r\n } else if (newParent.type === ObjectType.Roof) {\r\n if (newParent.parentId) {\r\n const foundation = state.getElementById(newParent.parentId);\r\n if (foundation) {\r\n m.sub(new Vector3(foundation.cx, foundation.cy, foundation.lz)).applyEuler(\r\n new Euler(0, 0, -foundation.rotation[2]),\r\n );\r\n if (elemToPaste.type !== ObjectType.Window) {\r\n m.setX(m.x / foundation.lx);\r\n m.setY(m.y / foundation.ly);\r\n }\r\n }\r\n }\r\n } else if (newParent.type === ObjectType.Cuboid) {\r\n if (elemToPaste.type === ObjectType.Cuboid) {\r\n const { pos } = Util.getWorldDataById(newParent.id);\r\n m.sub(pos);\r\n } else if (Util.isPositionRelative(elemToPaste.type)) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n }\r\n elemToPaste.parentId = newParent.id;\r\n } else if (newParent.type === ObjectType.Wall) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n } else {\r\n // if the old parent is ground, it has no type definition, but we use it to check its type\r\n if (oldParent && oldParent.type) {\r\n if (elemToPaste.type !== ObjectType.Foundation) {\r\n elemToPaste.parentId = newParent.id;\r\n if (Util.isPositionRelative(elemToPaste.type)) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n }\r\n }\r\n }\r\n }\r\n if (elemToPaste.type === ObjectType.Wall) {\r\n m.set(m.x * newParent.lx, m.y * newParent.ly, 0);\r\n }\r\n }\r\n const e = ElementModelCloner.clone(\r\n newParent,\r\n elemToPaste,\r\n m.x,\r\n m.y,\r\n m.z,\r\n false,\r\n state.pasteNormal,\r\n oldParent,\r\n );\r\n if (e) {\r\n if (state.pasteNormal) {\r\n e.normal = state.pasteNormal.toArray();\r\n }\r\n const lang = { lng: state.language };\r\n let approved = false;\r\n switch (e.type) {\r\n case ObjectType.Cuboid: {\r\n const getAllChildren = (el: ElementModel) => {\r\n const res: ElementModel[] = [];\r\n for (const e of get().elements) {\r\n if (e.parentId === el.id) {\r\n res.push(e);\r\n switch (e.type) {\r\n case ObjectType.Cuboid:\r\n case ObjectType.Foundation:\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n res.push(...getAllChildren(e));\r\n }\r\n }\r\n }\r\n return res;\r\n };\r\n const child = getAllChildren(elemToPaste);\r\n const elementMap = new Map(); // oldId -> newModel\r\n pastedElements.push(e);\r\n elementMap.set(elemToPaste.id, e);\r\n\r\n for (const c of child) {\r\n const parent = elementMap.get(c.parentId);\r\n if (parent) {\r\n const newChild = ElementModelCloner.clone(\r\n parent,\r\n c,\r\n c.cx,\r\n c.cy,\r\n c.cz,\r\n c.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...c.normal];\r\n }\r\n pastedElements.push(newChild);\r\n elementMap.set(c.id, newChild);\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.elementsToPaste = [e];\r\n approved = false;\r\n\r\n break;\r\n }\r\n case ObjectType.Foundation: {\r\n const elementsMapNewToOld = new Map();\r\n const elementsMapOldToNew = new Map();\r\n for (const child of state.elements) {\r\n if (child.parentId === elemToPaste.id) {\r\n const newChild = ElementModelCloner.clone(\r\n e,\r\n child,\r\n child.cx,\r\n child.cy,\r\n child.cz,\r\n child.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...child.normal];\r\n }\r\n pastedElements.push(newChild);\r\n if (newChild?.type === ObjectType.Wall || newChild?.type === ObjectType.Roof) {\r\n elementsMapNewToOld.set(newChild.id, child.id);\r\n elementsMapOldToNew.set(child.id, newChild.id);\r\n for (const grandChild of state.elements) {\r\n if (grandChild.parentId === child.id) {\r\n const newGrandChild = ElementModelCloner.clone(\r\n newChild,\r\n grandChild,\r\n grandChild.cx,\r\n grandChild.cy,\r\n grandChild.cz,\r\n );\r\n if (newGrandChild) {\r\n if (child.normal) {\r\n newGrandChild.normal = [...grandChild.normal];\r\n }\r\n pastedElements.push(newGrandChild);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n approved = true;\r\n for (const e of state.elements) {\r\n // search new roof\r\n if (e.type === ObjectType.Roof) {\r\n const oldRoofId = elementsMapNewToOld.get(e.id);\r\n if (oldRoofId) {\r\n const oldRoof = get().getElementById(oldRoofId) as RoofModel;\r\n if (oldRoof) {\r\n (e as RoofModel).wallsId = oldRoof.wallsId.map(\r\n (v) => elementsMapOldToNew.get(v) as string,\r\n );\r\n }\r\n }\r\n }\r\n // search new wall\r\n if (e.type === ObjectType.Wall) {\r\n const oldWallId = elementsMapNewToOld.get(e.id);\r\n if (oldWallId) {\r\n for (const o of state.elements) {\r\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\r\n const w = o as WallModel;\r\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\r\n if (left) {\r\n (e as WallModel).leftJoints = [left];\r\n }\r\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\r\n if (right) {\r\n (e as WallModel).rightJoints = [right];\r\n }\r\n if (w.roofId) {\r\n const roofId = elementsMapOldToNew.get(w.roofId as string);\r\n if (roofId) {\r\n (e as WallModel).roofId = roofId;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.Heliostat:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.ParabolicTrough: {\r\n if (newParent?.type === ObjectType.Wall) {\r\n if (newParent) {\r\n switch (Util.checkElementOnWallState(e, newParent)) {\r\n case ElementState.Valid:\r\n const angle = (newParent as WallModel).relativeAngle - HALF_PI;\r\n e.normal = [Math.cos(angle), Math.sin(angle), 0];\r\n approved = true;\r\n break;\r\n case ElementState.OverLap:\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n break;\r\n case ElementState.OutsideBoundary:\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n if (newParent && newParent.type === ObjectType.Roof) {\r\n if (e.foundationId) {\r\n const foundation = state.getElementById(e.foundationId);\r\n if (foundation) {\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\r\n e as SolarPanelModel,\r\n foundation,\r\n );\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(newParent as RoofModel);\r\n\r\n if (!RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices)) {\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n break;\r\n }\r\n if (\r\n !RoofUtil.rooftopSPCollisionCheck(e as SolarPanelModel, foundation, solarPanelVertices)\r\n ) {\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n break;\r\n }\r\n approved = true;\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n }\r\n break;\r\n }\r\n if (state.overlapWithSibling(e)) {\r\n // overlap, do not approve\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n } else {\r\n if (newParent) {\r\n if (\r\n newParent.type === ObjectType.Foundation ||\r\n (newParent.type === ObjectType.Cuboid &&\r\n Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY))\r\n ) {\r\n approved = Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, newParent);\r\n if (!approved) {\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n }\r\n } else {\r\n // TODO: other surfaces\r\n approved = true;\r\n }\r\n } else {\r\n approved = true;\r\n }\r\n }\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const center = new Vector3(e.cx, e.cy, 0);\r\n const vrx = new Vector3(e.lx / 2, 0, 0);\r\n const vlx = new Vector3(-e.lx / 2, 0, 0);\r\n const w = e as WallModel;\r\n const euler = new Euler(0, 0, w.relativeAngle);\r\n w.leftPoint = center.clone().add(vlx.applyEuler(euler)).toArray();\r\n w.rightPoint = center.clone().add(vrx.applyEuler(euler)).toArray();\r\n w.roofId = undefined;\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n w.centerLeftRoofHeight = undefined;\r\n w.centerRightRoofHeight = undefined;\r\n w.centerRoofHeight = undefined;\r\n for (const child of state.elements) {\r\n if (child.parentId === elemToPaste.id) {\r\n const newChild = ElementModelCloner.clone(\r\n e,\r\n child,\r\n child.cx,\r\n child.cy,\r\n child.cz,\r\n child.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...child.normal];\r\n }\r\n pastedElements.push(newChild);\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n approved = true;\r\n break;\r\n }\r\n case ObjectType.Door:\r\n case ObjectType.Window: {\r\n if (newParent?.type === ObjectType.Wall) {\r\n switch (Util.checkElementOnWallState(e, newParent)) {\r\n case ElementState.Valid:\r\n approved = true;\r\n break;\r\n case ElementState.OverLap:\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n break;\r\n case ElementState.OutsideBoundary:\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n break;\r\n }\r\n } else if (newParent?.type === ObjectType.Roof) {\r\n const rotation = RoofUtil.getRotationOnRoof(newParent.id, m);\r\n if (rotation) {\r\n e.rotation = [...rotation];\r\n }\r\n const windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n const boundaryVertices = RoofUtil.getRoofSegmentBoundary(newParent.id, m);\r\n if (!boundaryVertices) break;\r\n if (!RoofUtil.rooftopElementBoundaryCheck(windowVertices, boundaryVertices)) {\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n break;\r\n }\r\n if (!RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, newParent.id)) {\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n break;\r\n }\r\n approved = true;\r\n }\r\n break;\r\n }\r\n default: {\r\n approved = true;\r\n if (Util.isPlantOrHuman(e)) {\r\n if (newParent) {\r\n // paste on a parent\r\n const parent = state.getParent(e);\r\n if (parent) {\r\n const p = Util.relativePoint(state.pastePoint, parent);\r\n e.cx = p.x;\r\n e.cy = p.y;\r\n e.cz = p.z;\r\n }\r\n } else {\r\n // paste on the ground\r\n e.parentId = GROUND_ID;\r\n }\r\n }\r\n }\r\n }\r\n if (approved) {\r\n state.elements.push(e);\r\n pastedElements.push(e);\r\n }\r\n }\r\n } else if (state.elementsToPaste.length > 1) {\r\n // when a parent with children is cut, the removed children are no longer in elements array,\r\n // so we have to restore them from elementsToPaste.\r\n let m = state.pastePoint;\r\n const cutElements = state.copyCutElements();\r\n if (cutElements.length > 0) {\r\n if (cutElements[0].type === ObjectType.Cuboid) {\r\n const newParent = state.selectedElement;\r\n if (newParent && newParent.type === ObjectType.Cuboid) {\r\n const { pos } = Util.getWorldDataById(newParent.id);\r\n m.sub(pos);\r\n cutElements[0].parentId = newParent.id;\r\n }\r\n } else if (cutElements[0].type === ObjectType.Wall) {\r\n const newParent = state.selectedElement;\r\n if (newParent && newParent.type === ObjectType.Foundation) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n m.set(m.x * newParent.lx, m.y * newParent.ly, 0);\r\n cutElements[0].parentId = newParent.id;\r\n cutElements[0].foundationId = newParent.id;\r\n }\r\n }\r\n cutElements[0].cx = m.x;\r\n cutElements[0].cy = m.y;\r\n cutElements[0].cz = m.z;\r\n if (cutElements[0].type === ObjectType.Foundation) {\r\n cutElements[0].cz += cutElements[0].lz / 2;\r\n } else if (cutElements[0].type === ObjectType.Cuboid) {\r\n cutElements[0].cz = cutElements[0].lz / 2;\r\n }\r\n state.elements.push(...cutElements);\r\n pastedElements.push(...cutElements);\r\n }\r\n }\r\n if (pastedElements.length > 0) {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(pastedElements[0].id);\r\n state.selectedElement = pastedElements[0];\r\n }\r\n });\r\n return pastedElements;\r\n },\r\n\r\n pasteElementsByKey() {\r\n const pastedElements: ElementModel[] = [];\r\n immerSet((state: CommonStoreState) => {\r\n if (state.elementsToPaste.length > 0) {\r\n const elem = state.elementsToPaste[0];\r\n const parent = state.getParent(elem);\r\n const e = ElementModelCloner.clone(parent, elem, elem.cx, elem.cy, elem.cz);\r\n if (e) {\r\n let approved = false;\r\n switch (e.type) {\r\n case ObjectType.Door:\r\n case ObjectType.Window:\r\n if (parent) {\r\n const hx = e.lx / 2;\r\n e.cx += hx * 3;\r\n // searching +x direction\r\n if (parent.type === ObjectType.Wall) {\r\n while (e.cx + hx < 0.5) {\r\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\r\n state.elements.push(e);\r\n // state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx += hx;\r\n }\r\n }\r\n } else if (parent.type === ObjectType.Roof) {\r\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\r\n if (rot) {\r\n e.rotation = [...rot];\r\n }\r\n let windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n let segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\r\n const roofVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\r\n while (RoofUtil.rooftopElementBoundaryCheck(windowVertices, roofVertices)) {\r\n if (\r\n segmentVertices &&\r\n RoofUtil.rooftopElementBoundaryCheck(windowVertices, segmentVertices) &&\r\n RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, parent.id)\r\n ) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx += hx / 2;\r\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\r\n if (rot) {\r\n e.rotation = [...rot];\r\n }\r\n windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\r\n }\r\n }\r\n }\r\n\r\n // searching -x direction\r\n if (!approved) {\r\n e.cx = elem.cx - hx * 3;\r\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\r\n if (rot) {\r\n e.rotation = [...rot];\r\n }\r\n if (parent.type === ObjectType.Wall) {\r\n while (e.cx - hx > -0.5) {\r\n if (parent.type === ObjectType.Wall) {\r\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\r\n state.elements.push(e);\r\n // state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx -= hx;\r\n }\r\n }\r\n }\r\n } else if (parent.type === ObjectType.Roof) {\r\n let windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n let segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\r\n const roofVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\r\n while (RoofUtil.rooftopElementBoundaryCheck(windowVertices, roofVertices)) {\r\n if (\r\n segmentVertices &&\r\n RoofUtil.rooftopElementBoundaryCheck(windowVertices, segmentVertices) &&\r\n RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, parent.id)\r\n ) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx -= hx;\r\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\r\n if (rot) {\r\n e.rotation = [...rot];\r\n }\r\n windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\r\n }\r\n }\r\n }\r\n }\r\n if (!approved) {\r\n const lang = { lng: state.language };\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n }\r\n if (parent.type === ObjectType.Roof && approved) {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n }\r\n break;\r\n case ObjectType.Human:\r\n e.cx += 1;\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n e.cx += e.lx;\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n if (e.parentId) {\r\n const parent = state.getParent(e);\r\n if (parent) {\r\n if (parent.type === ObjectType.Wall) {\r\n const hx = e.lx / parent.lx / 2;\r\n e.cx += hx * 3;\r\n // searching +x direction\r\n while (e.cx + hx < 0.5) {\r\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx += hx;\r\n }\r\n }\r\n // searching -x direction\r\n if (!approved) {\r\n e.cx = elem.cx - hx * 3;\r\n while (e.cx - hx > -0.5) {\r\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx -= hx;\r\n }\r\n }\r\n }\r\n if (!approved) {\r\n const lang = { lng: state.language };\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n } else {\r\n }\r\n break;\r\n } else if (parent.type === ObjectType.Roof) {\r\n if (elem.foundationId) {\r\n const foundation = state.getElementById(elem.foundationId);\r\n if (foundation) {\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\r\n\r\n const hx = e.lx / foundation.lx / 2;\r\n e.cx += hx * 1.25;\r\n\r\n while (e.cx + hx < 0.5) {\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\r\n e as SolarPanelModel,\r\n foundation,\r\n );\r\n if (\r\n RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices) &&\r\n RoofUtil.rooftopSPCollisionCheck(\r\n e as SolarPanelModel,\r\n foundation,\r\n solarPanelVertices,\r\n )\r\n ) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx += hx * 1.25;\r\n }\r\n }\r\n if (!approved) {\r\n e.cx = elem.cx - hx * 1.25;\r\n while (e.cx - hx > -0.5) {\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\r\n e as SolarPanelModel,\r\n foundation,\r\n );\r\n if (\r\n RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices) &&\r\n RoofUtil.rooftopSPCollisionCheck(\r\n e as SolarPanelModel,\r\n foundation,\r\n solarPanelVertices,\r\n )\r\n ) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx -= hx * 1.25;\r\n }\r\n }\r\n }\r\n if (!approved) {\r\n const lang = { lng: state.language };\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n } else {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n const nearestNeighborId = state.findNearestSibling(elem.id);\r\n if (nearestNeighborId) {\r\n const nearestNeighbor = state.getElementById(nearestNeighborId);\r\n if (nearestNeighbor) {\r\n const oldX = e.cx;\r\n const oldY = e.cy;\r\n const oldZ = e.cz;\r\n const dx = nearestNeighbor.cx - elem.cx;\r\n const dy = nearestNeighbor.cy - elem.cy;\r\n const dz = nearestNeighbor.cz - elem.cz;\r\n e.cx = nearestNeighbor.cx + dx;\r\n e.cy = nearestNeighbor.cy + dy;\r\n e.cz = nearestNeighbor.cz + dz;\r\n if (state.overlapWithSibling(e)) {\r\n // try the opposite direction first before giving up\r\n e.cx = elem.cx - dx;\r\n e.cy = elem.cy - dy;\r\n e.cz = elem.cz - dz;\r\n if (state.overlapWithSibling(e)) {\r\n // we may need to hop twice in the opposite direction\r\n e.cx = elem.cx - 2 * dx;\r\n e.cy = elem.cy - 2 * dy;\r\n e.cz = elem.cz - 2 * dz;\r\n if (state.overlapWithSibling(e)) {\r\n e.cx = oldX - dx;\r\n e.cy = oldY - dy;\r\n e.cz = oldZ - dz;\r\n }\r\n }\r\n }\r\n } else {\r\n e.cx += e.lx / parent.lx;\r\n }\r\n } else {\r\n // a loner\r\n e.cx += e.lx / parent.lx;\r\n }\r\n const lang = { lng: state.language };\r\n if (!state.overlapWithSibling(e)) {\r\n if (\r\n parent.type === ObjectType.Foundation ||\r\n (parent.type === ObjectType.Cuboid && Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY))\r\n ) {\r\n if (Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, parent)) {\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n } else {\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n }\r\n } else {\r\n // TODO: For other surfaces, handle out-of-bounds errors here\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n }\r\n } else {\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n }\r\n }\r\n }\r\n break;\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n if (e.parentId) {\r\n const parent = state.getParent(e);\r\n if (parent) {\r\n e.cx += e.lx / parent.lx;\r\n }\r\n if (e.cx < 0.5) {\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n }\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = e as PolygonModel;\r\n for (const v of polygon.vertices) {\r\n v.x += 0.1;\r\n }\r\n polygon.cx += 0.1;\r\n state.elements.push(polygon);\r\n state.elementsToPaste = [polygon];\r\n approved = true;\r\n break;\r\n case ObjectType.Cuboid:\r\n e.cx += e.lx;\r\n if (state.elementsToPaste.length === 1) {\r\n const getAllChildren = (el: ElementModel) => {\r\n const res: ElementModel[] = [];\r\n for (const e of get().elements) {\r\n if (e.parentId === el.id) {\r\n res.push(e);\r\n switch (e.type) {\r\n case ObjectType.Cuboid:\r\n case ObjectType.Foundation:\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n res.push(...getAllChildren(e));\r\n }\r\n }\r\n }\r\n return res;\r\n };\r\n const child = getAllChildren(elem);\r\n const elementMap = new Map(); // oldId -> newModel\r\n pastedElements.push(e);\r\n elementMap.set(elem.id, e);\r\n\r\n for (const c of child) {\r\n const parent = elementMap.get(c.parentId);\r\n if (parent) {\r\n const newChild = ElementModelCloner.clone(\r\n parent,\r\n c,\r\n c.cx,\r\n c.cy,\r\n c.cz,\r\n c.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...c.normal];\r\n }\r\n pastedElements.push(newChild);\r\n elementMap.set(c.id, newChild);\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.elementsToPaste = [e];\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(e.id);\r\n state.selectedElement = e;\r\n } else if (state.elementsToPaste.length > 1) {\r\n const cutElements = state.copyCutElements();\r\n if (cutElements.length > 0) {\r\n cutElements[0].cx += cutElements[0].lx;\r\n state.elements.push(...cutElements);\r\n state.elementsToPaste = [...cutElements];\r\n pastedElements.push(...cutElements);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(cutElements[0].id);\r\n state.selectedElement = cutElements[0];\r\n }\r\n }\r\n approved = false;\r\n break;\r\n case ObjectType.Foundation:\r\n e.cx += e.lx;\r\n if (state.elementsToPaste.length === 1) {\r\n // When copying from an existing container, elementsToPaste stores only the container.\r\n // So we have to copy its children and grandchildren as well. This differs from the\r\n // situation of cutting, in which case all the children and grandchildren must be\r\n // stored in elementsToPaste.\r\n const elementsMapNewToOld = new Map();\r\n const elementsMapOldToNew = new Map();\r\n for (const child of state.elements) {\r\n // technically, parentId must not be the same as ID, but just to be sure...\r\n if (child.parentId === elem.id && child.parentId !== child.id) {\r\n const newChild = ElementModelCloner.clone(\r\n e,\r\n child,\r\n child.cx,\r\n child.cy,\r\n child.cz,\r\n child.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...child.normal];\r\n }\r\n pastedElements.push(newChild);\r\n if (newChild?.type === ObjectType.Wall || newChild?.type === ObjectType.Roof) {\r\n elementsMapNewToOld.set(newChild.id, child.id);\r\n elementsMapOldToNew.set(child.id, newChild.id);\r\n for (const grandChild of state.elements) {\r\n if (grandChild.parentId === child.id) {\r\n const newGrandChild = ElementModelCloner.clone(\r\n newChild,\r\n grandChild,\r\n grandChild.cx,\r\n grandChild.cy,\r\n grandChild.cz,\r\n );\r\n if (newGrandChild) {\r\n if (child.normal) {\r\n newGrandChild.normal = [...grandChild.normal];\r\n }\r\n pastedElements.push(newGrandChild);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n for (const e of state.elements) {\r\n // search new roof\r\n if (e.type === ObjectType.Roof) {\r\n const oldRoofId = elementsMapNewToOld.get(e.id);\r\n if (oldRoofId) {\r\n const oldRoof = get().getElementById(oldRoofId) as RoofModel;\r\n if (oldRoof) {\r\n (e as RoofModel).wallsId = oldRoof.wallsId.map(\r\n (v) => elementsMapOldToNew.get(v) as string,\r\n );\r\n }\r\n }\r\n }\r\n // search new wall\r\n if (e.type === ObjectType.Wall) {\r\n const oldWallId = elementsMapNewToOld.get(e.id);\r\n if (oldWallId) {\r\n for (const o of state.elements) {\r\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\r\n const w = o as WallModel;\r\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\r\n if (left) {\r\n (e as WallModel).leftJoints = [left];\r\n }\r\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\r\n if (right) {\r\n (e as WallModel).rightJoints = [right];\r\n }\r\n if (w.roofId) {\r\n const roofId = elementsMapOldToNew.get(w.roofId as string);\r\n if (roofId) {\r\n (e as WallModel).roofId = roofId;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } else if (state.elementsToPaste.length > 1) {\r\n // when a parent with children is cut, the removed children are no longer in elements array,\r\n // so we have to restore them from elementsToPaste.\r\n const cutElements = state.copyCutElements();\r\n if (cutElements.length > 0) {\r\n cutElements[0].cx += cutElements[0].lx;\r\n state.elements.push(...cutElements);\r\n pastedElements.push(...cutElements);\r\n state.elementsToPaste = cutElements;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(cutElements[0].id);\r\n state.selectedElement = cutElements[0];\r\n }\r\n }\r\n approved = true;\r\n break;\r\n case ObjectType.Wall:\r\n const w = e as WallModel;\r\n const step = new Vector3(1, -1, 0).applyEuler(new Euler(0, 0, w.relativeAngle));\r\n e.cx += step.x;\r\n e.cy += step.y;\r\n if (state.elementsToPaste.length === 1) {\r\n const center = new Vector3(e.cx, e.cy, 0);\r\n const vrx = new Vector3(e.lx / 2, 0, 0);\r\n const vlx = new Vector3(-e.lx / 2, 0, 0);\r\n const euler = new Euler(0, 0, w.relativeAngle);\r\n w.leftPoint = center.clone().add(vlx.applyEuler(euler)).toArray();\r\n w.rightPoint = center.clone().add(vrx.applyEuler(euler)).toArray();\r\n w.roofId = undefined;\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n w.centerLeftRoofHeight = undefined;\r\n w.centerRightRoofHeight = undefined;\r\n w.centerRoofHeight = undefined;\r\n for (const child of state.elements) {\r\n if (child.parentId === elem.id) {\r\n const newChild = ElementModelCloner.clone(\r\n e,\r\n child,\r\n child.cx,\r\n child.cy,\r\n child.cz,\r\n child.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...child.normal];\r\n }\r\n pastedElements.push(newChild);\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n } else if (state.elementsToPaste.length > 1) {\r\n const cutElements = state.copyCutElements();\r\n if (cutElements.length > 0) {\r\n cutElements[0].cx += step.x;\r\n cutElements[0].cy -= step.y;\r\n state.elements.push(...cutElements);\r\n pastedElements.push(...cutElements);\r\n state.elementsToPaste = cutElements;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(cutElements[0].id);\r\n state.selectedElement = cutElements[0];\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n approved = true;\r\n break;\r\n }\r\n if (state.elementsToPaste.length === 1 && approved) {\r\n pastedElements.push(e);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(e.id);\r\n state.selectedElement = e;\r\n }\r\n }\r\n }\r\n });\r\n return pastedElements;\r\n },\r\n\r\n pvModules: {},\r\n loadPvModules() {\r\n const pvModels: PvModel[] = [];\r\n Papa.parse(pvmodules, {\r\n download: true,\r\n complete: function (results) {\r\n for (const row of results.data) {\r\n if (Array.isArray(row) && row.length > 1) {\r\n const pv = {\r\n name: row[0].trim(),\r\n brand: row[1].trim(),\r\n cellType: row[2].trim(),\r\n efficiency: parseFloat(row[3].trim()),\r\n length: parseFloat(row[4].trim()),\r\n nominalLength: parseFloat(row[5].trim()),\r\n width: parseFloat(row[6].trim()),\r\n nominalWidth: parseFloat(row[7].trim()),\r\n thickness: parseFloat(row[8].trim()),\r\n m: parseFloat(row[9].trim()),\r\n n: parseFloat(row[10].trim()),\r\n pmax: parseFloat(row[11].trim()),\r\n vmpp: parseFloat(row[12].trim()),\r\n impp: parseFloat(row[13].trim()),\r\n voc: parseFloat(row[14].trim()),\r\n isc: parseFloat(row[15].trim()),\r\n pmaxTC: parseFloat(row[16].trim()),\r\n noct: parseFloat(row[17].trim()),\r\n weight: parseFloat(row[18].trim()),\r\n color: row[19].trim(),\r\n shadeTolerance: row[20].trim(),\r\n bifacialityFactor: parseFloat(row[21].trim()),\r\n } as PvModel;\r\n pvModels.push(pv);\r\n }\r\n }\r\n immerSet((state: CommonStoreState) => {\r\n for (const model of pvModels) {\r\n state.pvModules[model.name] = model;\r\n }\r\n });\r\n },\r\n });\r\n },\r\n getPvModule(name: string) {\r\n return get().pvModules[name];\r\n },\r\n\r\n weatherData: {},\r\n loadWeatherData() {\r\n const data: WeatherModel[] = [];\r\n Papa.parse(weather, {\r\n download: true,\r\n complete: function (results) {\r\n for (const row of results.data) {\r\n if (Array.isArray(row) && row.length > 1) {\r\n const lows: number[] = [];\r\n const highs: number[] = [];\r\n const sun: number[] = [];\r\n for (let i = 5; i < 29; i++) {\r\n if ((i - 5) % 2 === 0) {\r\n lows.push(parseFloat(row[i].trim()));\r\n } else {\r\n highs.push(parseFloat(row[i].trim()));\r\n }\r\n }\r\n for (let i = 29; i < 41; i++) {\r\n sun.push(parseFloat(row[i].trim()));\r\n }\r\n const wm = {\r\n city: row[0].trim(),\r\n country: row[1].trim(),\r\n longitude: parseFloat(row[2].trim()),\r\n latitude: parseFloat(row[3].trim()),\r\n elevation: parseFloat(row[4].trim()),\r\n lowestTemperatures: lows,\r\n highestTemperatures: highs,\r\n sunshineHours: sun,\r\n } as WeatherModel;\r\n data.push(wm);\r\n }\r\n }\r\n immerSet((state: CommonStoreState) => {\r\n for (const row of data) {\r\n state.weatherData[row.city + ', ' + row.country] = row;\r\n }\r\n });\r\n },\r\n });\r\n },\r\n getWeather(location) {\r\n return get().weatherData[location];\r\n },\r\n horizontalSolarRadiationData: {},\r\n loadHorizontalSolarRadiationData() {\r\n const radiationData: SolarRadiationData[] = [];\r\n Papa.parse(solar_radiation_horizontal, {\r\n download: true,\r\n complete: function (results) {\r\n for (const row of results.data) {\r\n if (Array.isArray(row) && row.length > 1) {\r\n const data: number[] = [];\r\n for (let i = 2; i < 14; i++) {\r\n data.push(parseFloat(row[i].trim()));\r\n }\r\n const sr = {\r\n city: row[0].trim(),\r\n country: row[1].trim(),\r\n data: data,\r\n } as SolarRadiationData;\r\n radiationData.push(sr);\r\n }\r\n }\r\n immerSet((state: CommonStoreState) => {\r\n for (const x of radiationData) {\r\n state.horizontalSolarRadiationData[x.city + ', ' + x.country] = x;\r\n }\r\n });\r\n },\r\n });\r\n },\r\n getHorizontalSolarRadiation(location) {\r\n return get().horizontalSolarRadiationData[location];\r\n },\r\n verticalSolarRadiationData: {},\r\n loadVerticalSolarRadiationData() {\r\n const radiationData: SolarRadiationData[] = [];\r\n Papa.parse(solar_radiation_vertical, {\r\n download: true,\r\n complete: function (results) {\r\n for (const row of results.data) {\r\n if (Array.isArray(row) && row.length > 1) {\r\n const data: number[] = [];\r\n for (let i = 2; i < 14; i++) {\r\n data.push(parseFloat(row[i].trim()));\r\n }\r\n const sr = {\r\n city: row[0].trim(),\r\n country: row[1].trim(),\r\n data: data,\r\n } as SolarRadiationData;\r\n radiationData.push(sr);\r\n }\r\n }\r\n immerSet((state: CommonStoreState) => {\r\n for (const x of radiationData) {\r\n state.verticalSolarRadiationData[x.city + ', ' + x.country] = x;\r\n }\r\n });\r\n },\r\n });\r\n },\r\n getVerticalSolarRadiation(location) {\r\n return get().verticalSolarRadiationData[location];\r\n },\r\n getClosestCity(lat, lng) {\r\n let min: number = Number.MAX_VALUE;\r\n let city = null;\r\n let distance: number;\r\n const wd = get().weatherData;\r\n for (const name in wd) {\r\n if (wd.hasOwnProperty(name)) {\r\n distance = Util.getDistance(lng, lat, wd[name].longitude, wd[name].latitude);\r\n if (distance < min) {\r\n min = distance;\r\n city = name;\r\n }\r\n }\r\n }\r\n return city;\r\n },\r\n\r\n sunlightDirection: new Vector3(0, 2, 2),\r\n setSunlightDirection(vector) {\r\n immerSet((state: CommonStoreState) => {\r\n state.sunlightDirection = vector.clone();\r\n });\r\n },\r\n\r\n cameraDirection: new Vector3(),\r\n getCameraDirection() {\r\n return get().cameraDirection;\r\n },\r\n\r\n updateSceneRadiusFlag: false,\r\n updateSceneRadius() {\r\n immerSet((state: CommonStoreState) => {\r\n state.updateSceneRadiusFlag = !state.updateSceneRadiusFlag;\r\n });\r\n },\r\n sceneRadius: 100,\r\n setSceneRadius(radius) {\r\n immerSet((state: CommonStoreState) => {\r\n state.sceneRadius = radius;\r\n });\r\n },\r\n\r\n selectedElementAngle: 0,\r\n selectedElementHeight: 0,\r\n selectedElementX: 0,\r\n selectedElementY: 0,\r\n\r\n isAddingElement() {\r\n return !!(\r\n get().addedCuboidId ||\r\n get().addedFoundationId ||\r\n get().addedWallId ||\r\n get().addedWindowId ||\r\n get().addedDoorId\r\n );\r\n },\r\n\r\n addedFoundationId: null,\r\n deletedFoundationId: null,\r\n\r\n addedCuboidId: null,\r\n deletedCuboidId: null,\r\n\r\n addedWallId: null,\r\n deletedWallId: null,\r\n updateWallMapOnFoundationFlag: false,\r\n updateWallMapOnFoundation() {\r\n immerSet((state: CommonStoreState) => {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n },\r\n\r\n updateElementOnRoofFlag: false,\r\n setUpdateElementOnRoofFlag(b) {\r\n immerSet((state: CommonStoreState) => {\r\n state.updateElementOnRoofFlag = b;\r\n });\r\n },\r\n updateElementOnRoofFn() {\r\n immerSet((state: CommonStoreState) => {\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n },\r\n\r\n addedWindowId: null,\r\n\r\n addedDoorId: null,\r\n\r\n addedRoofIdSet: new Set(),\r\n deletedRoofId: null,\r\n deletedRoofIdSet: new Set(),\r\n autoDeletedRoofs: null,\r\n autoDeletedRoofIdSet: new Set(),\r\n autoDeletedChild: null,\r\n getAutoDeletedElements() {\r\n const autoDeletedRoofs = get().autoDeletedRoofs;\r\n const autoDeletedChild = get().autoDeletedChild;\r\n\r\n if (!autoDeletedRoofs || !autoDeletedChild) return null;\r\n\r\n const arr = [...autoDeletedRoofs, ...autoDeletedChild];\r\n return arr;\r\n },\r\n deleteAddedRoofId(id: string) {\r\n immerSet((state) => {\r\n state.addedRoofIdSet.delete(id);\r\n });\r\n },\r\n\r\n groupActionMode: false,\r\n setGroupActionMode(b: boolean) {\r\n immerSet((state) => {\r\n state.groupActionMode = b;\r\n });\r\n },\r\n groupActionUpdateFlag: false,\r\n\r\n locale: enUS,\r\n localFileName: 'aladdin.ala',\r\n createNewFileFlag: false,\r\n setCreateNewFileFlag(b) {\r\n immerSet((state) => {\r\n state.createNewFileFlag = b;\r\n });\r\n },\r\n openLocalFileFlag: false,\r\n setOpenLocalFileFlag(b) {\r\n immerSet((state) => {\r\n state.openLocalFileFlag = b;\r\n });\r\n },\r\n localFileDialogRequested: false,\r\n pvModelDialogVisible: false,\r\n loggable: false,\r\n actionInfo: undefined,\r\n currentUndoable: undefined,\r\n showCloudFileTitleDialog: false,\r\n showCloudFileTitleDialogFlag: false,\r\n localContentToImportAfterCloudFileUpdate: undefined,\r\n\r\n enableFineGrid: false,\r\n setEnableFineGrid(b) {\r\n immerSet((state: CommonStoreState) => {\r\n state.enableFineGrid = b;\r\n });\r\n },\r\n };\r\n },\r\n {\r\n name: 'aladdin-storage',\r\n getStorage: () => {\r\n const params = new URLSearchParams(window.location.search);\r\n const viewOnly = params.get('viewonly') === 'true';\r\n return viewOnly ? sessionStorage : localStorage;\r\n },\r\n whitelist: [\r\n 'language',\r\n 'animate24Hours',\r\n 'floatingWindowOpacity',\r\n 'selectedFloatingWindow',\r\n 'locale',\r\n 'cloudFile',\r\n 'latestModelSite',\r\n 'modelSites',\r\n 'modelsMapLatitude',\r\n 'modelsMapLongitude',\r\n 'modelsMapAddress',\r\n 'modelsMapZoom',\r\n 'modelsMapType',\r\n 'modelsMapTilt',\r\n 'world',\r\n 'elements',\r\n 'viewState',\r\n 'graphState',\r\n 'actionState',\r\n 'modelType',\r\n 'modelAuthor',\r\n 'modelLabel',\r\n 'modelDescription',\r\n 'projectView',\r\n 'projectInfo',\r\n 'designProjectType',\r\n 'notes',\r\n 'user',\r\n 'sceneRadius',\r\n 'weatherData',\r\n 'solarPanelArrayLayoutParams',\r\n 'solarPanelArrayLayoutConstraints',\r\n 'economicsParams',\r\n 'evolutionMethod',\r\n 'evolutionaryAlgorithmState',\r\n 'geneticAlgorithmWizardSelectedTab',\r\n 'particleSwarmOptimizationWizardSelectedTab',\r\n 'minimumNavigationMoveSpeed',\r\n 'minimumNavigationTurnSpeed',\r\n ],\r\n },\r\n ),\r\n ),\r\n);\r\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { ErrorInfo } from 'react';\n\nclass ErrorPage extends React.Component<{}, { hasError: boolean }> {\n constructor(props: any) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error) {\n // Update state so the next render will show the fallback UI.\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // You can also log the error to an error reporting service\n //logErrorToMyService(error, errorInfo);\n }\n\n clearCacheAndReload() {\n localStorage.clear();\n window.location.reload();\n }\n\n render() {\n if (this.state.hasError) {\n // You can render any custom fallback UI\n return (\n \n

Error

\n

Something went wrong. Please click the following button to clear the cache and reload the page.

\n

\n \n

\n \n );\n }\n return this.props.children;\n }\n}\n\nexport default ErrorPage;\n","export default __webpack_public_path__ + \"static/media/daysky.66925efd.jpg\";","export default __webpack_public_path__ + \"static/media/desert.e1e10657.jpg\";","export default __webpack_public_path__ + \"static/media/dune.5b4e54f9.jpg\";","export default __webpack_public_path__ + \"static/media/forest.7e47e4d2.jpg\";","export default __webpack_public_path__ + \"static/media/grassland.a0c4d0ac.jpg\";","export default __webpack_public_path__ + \"static/media/hill-spring.f8b76c57.jpg\";","export default __webpack_public_path__ + \"static/media/hill-summer.26c46362.jpg\";","export default __webpack_public_path__ + \"static/media/hill-fall.9b0790b7.jpg\";","export default __webpack_public_path__ + \"static/media/hill-winter.416b6801.jpg\";","export default __webpack_public_path__ + \"static/media/lake.a9a56bcc.jpg\";","export default __webpack_public_path__ + \"static/media/mountain.af82417a.jpg\";","export default __webpack_public_path__ + \"static/media/rural.bc238e1c.jpg\";","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { RefObject, useMemo, useRef, useState } from 'react';\nimport { BackSide, DoubleSide, Euler, Group, Intersection, Mesh, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { invalidate, ThreeEvent, useThree } from '@react-three/fiber';\nimport { Plane, useTexture } from '@react-three/drei';\n\nimport DefaultImage from '../resources/daysky.jpg';\nimport DesertImage from '../resources/desert.jpg';\nimport DuneImage from '../resources/dune.jpg';\nimport ForestImage from '../resources/forest.jpg';\nimport GrasslandImage from '../resources/grassland.jpg';\nimport HillSpringImage from '../resources/hill-spring.jpg';\nimport HillSummerImage from '../resources/hill-summer.jpg';\nimport HillFallImage from '../resources/hill-fall.jpg';\nimport HillWinterImage from '../resources/hill-winter.jpg';\nimport LakeImage from '../resources/lake.jpg';\nimport MountainImage from '../resources/mountain.jpg';\nimport RuralImage from '../resources/rural.jpg';\n\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { IntersectionPlaneType, ObjectType, ResizeHandleType, Theme } from '../types';\nimport { ElementModel } from '../models/ElementModel';\nimport {\n DEFAULT_SKY_RADIUS,\n GROUND_ID,\n HALF_PI,\n ORIGIN_VECTOR2,\n TWO_PI,\n UNIT_VECTOR_POS_Z_ARRAY,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { Util } from 'src/Util';\nimport { PolygonModel } from 'src/models/PolygonModel';\nimport { TreeModel } from '../models/TreeModel';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { UndoableMove } from 'src/undo/UndoableMove';\nimport { showError } from 'src/helpers';\nimport i18n from 'src/i18n/i18n';\n\nexport interface SkyProps {\n theme?: string;\n}\n\nconst Sky = ({ theme = 'Default' }: SkyProps) => {\n const setCommonStore = useStore(Selector.set);\n const selectNone = useStore(Selector.selectNone);\n const getSelectedElement = useStore(Selector.getSelectedElement);\n const getCameraDirection = useStore(Selector.getCameraDirection);\n const getResizeHandlePosition = useStore(Selector.getResizeHandlePosition);\n const getChildren = useStore(Selector.getChildren);\n const getElementById = useStore(Selector.getElementById);\n const updateElementLxById = useStore(Selector.updateElementLxById);\n const updateElementLzById = useStore(Selector.updateElementLzById);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const latitude = useStore(Selector.world.latitude);\n const date = useStore(Selector.world.date);\n const addUndoable = useStore(Selector.addUndoable);\n const setElementPosition = useStore(Selector.setElementPosition);\n const language = useStore(Selector.language);\n const updateSceneRadius = useStore(Selector.updateSceneRadius);\n\n const {\n scene,\n camera,\n gl: { domElement },\n } = useThree();\n const meshRef = useRef(null!);\n const grabRef = useRef(null);\n const intersectionPlaneRef = useRef();\n const absPosMapRef = useRef>(new Map());\n const polygonsAbsPosMapRef = useRef>(new Map());\n const oldPositionRef = useRef(new Vector3());\n const newPositionRef = useRef(new Vector3());\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\n const oldWidthRef = useRef(0);\n const oldHeightRef = useRef(0);\n const oldChildrenPositionsMapRef = useRef>(new Map());\n const oldChildrenParentIdMapRef = useRef>(new Map());\n const newChildrenPositionsMapRef = useRef>(new Map());\n const newChildrenParentIdMapRef = useRef>(new Map());\n const oldHumanOrTreeParentIdRef = useRef(null);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const ray = useMemo(() => new Raycaster(), []);\n const elementParentRotation = useMemo(() => new Euler(), []);\n\n const now = new Date(date);\n const month = now.getMonth() + 1;\n\n const [intersectionPlaneType, setIntersectionPlaneType] = useState(IntersectionPlaneType.Sky);\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\n const intersectionPlaneAngle = useMemo(() => new Euler(), []);\n if (grabRef.current && resizeHandleType) {\n if (intersectionPlaneType !== IntersectionPlaneType.Vertical) {\n setIntersectionPlaneType(IntersectionPlaneType.Vertical);\n }\n const handlePosition = getResizeHandlePosition(grabRef.current, resizeHandleType);\n const cameraDir = getCameraDirection();\n const rotation = -Math.atan2(cameraDir.x, cameraDir.y);\n intersectionPlanePosition.set(handlePosition.x, handlePosition.y, 0);\n intersectionPlaneAngle.set(-HALF_PI, 0, rotation, 'ZXY');\n }\n\n const scale = useMemo(() => {\n switch (theme) {\n case Theme.Desert:\n return 0.5;\n case Theme.Dune:\n return 0.25;\n case Theme.Forest:\n return 0.25;\n case Theme.Grassland:\n return 0.15;\n case Theme.Hill:\n return 0.3;\n case Theme.Lake:\n return 0.1;\n case Theme.Mountain:\n return 0.4;\n case Theme.Rural:\n return 0.25;\n default:\n return 0.2;\n }\n }, [theme]);\n\n const textureImg = useMemo(() => {\n switch (theme) {\n case Theme.Desert:\n return DesertImage;\n case Theme.Dune:\n return DuneImage;\n case Theme.Forest:\n return ForestImage;\n case Theme.Grassland:\n return GrasslandImage;\n case Theme.Hill:\n if (latitude > 0) {\n if (month >= 12 || month <= 3) {\n return HillWinterImage;\n } else if (month > 3 && month <= 5) {\n return HillSpringImage;\n } else if (month > 5 && month <= 9) {\n return HillSummerImage;\n } else {\n // November\n return HillFallImage;\n }\n } else {\n if (month >= 12 || month <= 3) {\n return HillSummerImage;\n } else if (month > 3 && month <= 5) {\n return HillFallImage;\n } else if (month > 5 && month <= 9) {\n return HillWinterImage;\n } else {\n return HillSpringImage;\n }\n }\n case Theme.Lake:\n return LakeImage;\n case Theme.Mountain:\n return MountainImage;\n case Theme.Rural:\n return RuralImage;\n default:\n return DefaultImage;\n }\n }, [theme, date, latitude]);\n\n const texture = useTexture(textureImg);\n\n const legalOnGround = (type: ObjectType) => {\n return (\n type === ObjectType.Foundation ||\n type === ObjectType.Cuboid ||\n type === ObjectType.Tree ||\n type === ObjectType.Flower ||\n type === ObjectType.Human\n );\n };\n\n const clickSky = (e: ThreeEvent) => {\n // We must check if there is really a first intersection, onClick does not guarantee it\n // onClick listener for an object can still fire an event even when the object is behind another one\n if (e.intersections.length > 0) {\n const skyClicked = e.intersections[0].object === meshRef.current;\n if (skyClicked) {\n selectNone();\n setCommonStore((state) => {\n state.clickObjectType = ObjectType.Sky;\n });\n } else {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n if (legalOnGround(selectedElement.type)) {\n grabRef.current = selectedElement;\n if (Util.isPlantOrHuman(grabRef.current)) {\n setIntersectionPlaneType(IntersectionPlaneType.Vertical);\n intersectionPlaneAngle.set(-HALF_PI, 0, 0, 'ZXY');\n }\n if (selectedElement.type !== ObjectType.Foundation && selectedElement.type !== ObjectType.Cuboid) {\n useRefStore.getState().setEnableOrbitController(false);\n }\n }\n }\n }\n }\n };\n\n const getObjectId = (obj: Object3D | null): string => {\n if (!obj) return '';\n\n const nameArray = obj.name.split(' ');\n if (nameArray[2]) {\n return nameArray[2];\n }\n\n return getObjectId(obj.parent);\n };\n\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\n if (object === null || object === undefined) return null;\n for (const obj of object.children) {\n if (obj.name.includes(`${id}`)) {\n return obj;\n }\n }\n return null;\n };\n\n const handleDetachParent = (elem: ElementModel, e: ElementModel) => {\n const contentRef = useRefStore.getState().contentRef;\n const parentObject = getObjectChildById(contentRef?.current, elem.id);\n if (parentObject) {\n for (const obj of parentObject.children) {\n if (obj.name.includes(`${e.id}`)) {\n useRefStore.getState().contentRef?.current?.add(obj);\n break;\n }\n }\n }\n e.parentId = GROUND_ID;\n const absPos = new Vector3(e.cx, e.cy, e.cz)\n .applyEuler(new Euler(0, 0, elem.rotation[2]))\n .add(oldPositionRef.current);\n e.cx = absPos.x;\n e.cy = absPos.y;\n e.cz = 0;\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\n };\n\n const attachToGroup = (\n attachParentId: string | null | undefined,\n currParentId: string | null | undefined,\n currId: string,\n ) => {\n if (!attachParentId || !currParentId) return;\n const contentRef = useRefStore.getState().contentRef;\n if (contentRef?.current) {\n const currParentObj = Util.getObjectChildById(contentRef.current, currParentId);\n const currObj = Util.getObjectChildById(currParentId === GROUND_ID ? contentRef.current : currParentObj, currId);\n if (currObj) {\n if (attachParentId === GROUND_ID) {\n contentRef.current.add(currObj);\n } else {\n const attachParentObj = Util.getObjectChildById(contentRef.current, attachParentId);\n attachParentObj?.add(currObj);\n }\n invalidate();\n }\n }\n };\n\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\n if (!parentId) return;\n setCommonStore((state) => {\n for (const e of state.elements) {\n // don't set parentId for foundations or cuboids as their parents are allowed to be ground only (for now)\n if (e.id === elementId && !Util.isFoundationOrCuboid(e)) {\n e.parentId = parentId;\n break;\n }\n }\n });\n };\n\n const getIntersectionToStand = (intersections: Intersection[]) => {\n for (const intersection of intersections) {\n if (intersection.object.userData.stand) {\n return intersection;\n }\n }\n return null;\n };\n\n const handleTreeOrHumanRefMove = (elementRef: RefObject | null, e: ThreeEvent) => {\n if (elementRef && elementRef.current) {\n const intersection = getIntersectionToStand(e.intersections);\n if (intersection) {\n const intersectionObj = intersection.object; // Mesh\n const elementParentRef = elementRef.current.parent;\n\n // stand on ground\n if (intersectionObj.name === 'Ground') {\n // change parent: attach dom, set parentId?\n if (elementParentRef && elementParentRef.name !== 'Content') {\n const contentRef = useRefStore.getState().contentRef;\n if (contentRef && contentRef.current) {\n contentRef.current.add(elementRef.current);\n setParentIdById(GROUND_ID, getObjectId(elementRef.current));\n }\n }\n elementRef.current.position.copy(intersection.point); // world position\n invalidate();\n }\n // stand on standable elements\n else if (intersectionObj.userData.stand) {\n const intersectionObjGroup = intersectionObj.parent; // Group\n if (intersectionObjGroup) {\n // change parent: attach dom, set parentId?\n if (elementParentRef && elementParentRef.uuid !== intersectionObjGroup.uuid) {\n intersectionObjGroup.add(elementRef.current); // attach to Group\n setParentIdById(getObjectId(intersectionObjGroup), getObjectId(elementRef.current));\n }\n elementParentRotation.set(0, 0, -intersectionObjGroup.rotation.z);\n const relPos = new Vector3()\n .subVectors(intersection.point, intersectionObjGroup.position)\n .applyEuler(elementParentRotation);\n elementRef.current.position.copy(relPos); // relative abs position\n invalidate();\n }\n }\n }\n }\n };\n\n // for tree and human for now\n const handleSetElementState = (elemId: string, standObjId: string, position: Vector3) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === elemId) {\n // don't set parentId for foundations or cuboids as their parents are allowed to be ground only (for now)\n if (!Util.isFoundationOrCuboid(e)) e.parentId = standObjId;\n e.cx = position.x;\n e.cy = position.y;\n e.cz = position.z;\n break;\n }\n }\n });\n };\n\n const isMoveToSky = () => {\n if (useStore.getState().viewState.orthographic) return false; // impossible to move to sky in 2D mode\n if (meshRef.current) {\n const intersections = ray.intersectObjects(Util.fetchIntersectables(scene), false);\n if (intersections.length > 0) {\n for (const intersection of intersections) {\n if (intersection.object.userData.stand) {\n return false;\n }\n }\n }\n }\n return ray.intersectObjects([meshRef.current!]).length > 0;\n };\n\n const handlePointerMove = (e: ThreeEvent) => {\n if (grabRef.current && grabRef.current.type && !grabRef.current.locked) {\n const mouse = new Vector2();\n mouse.x = (e.offsetX / domElement.clientWidth) * 2 - 1;\n mouse.y = -(e.offsetY / domElement.clientHeight) * 2 + 1;\n ray.setFromCamera(mouse, camera);\n let intersects;\n if (intersectionPlaneRef.current && intersectionPlaneType === IntersectionPlaneType.Vertical) {\n intersects = ray.intersectObjects([intersectionPlaneRef.current]);\n if (intersects && intersects.length > 0) {\n const p = intersects[0].point;\n switch (grabRef.current.type) {\n case ObjectType.Tree:\n const tree = grabRef.current as TreeModel;\n switch (resizeHandleType) {\n case ResizeHandleType.Top:\n updateElementLzById(tree.id, p.z);\n setCommonStore((state) => {\n state.selectedElementHeight = Math.max(1, p.z);\n });\n break;\n case ResizeHandleType.Left:\n case ResizeHandleType.Right:\n case ResizeHandleType.Upper:\n case ResizeHandleType.Lower:\n updateElementLxById(tree.id, 2 * Math.hypot(p.x - tree.cx, p.y - tree.cy));\n break;\n }\n handleTreeOrHumanRefMove(useRefStore.getState().treeRef, e);\n break;\n case ObjectType.Human:\n handleTreeOrHumanRefMove(useRefStore.getState().humanRef, e);\n break;\n case ObjectType.Cuboid:\n if (Util.isTopResizeHandle(resizeHandleType)) {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === grabRef.current?.id) {\n e.cz = Math.max(0.5, p.z / 2);\n e.lz = Math.max(1, p.z);\n break;\n }\n }\n state.selectedElementHeight = Math.max(1, p.z);\n });\n const cuboidRef = useRefStore.getState().cuboidRef;\n if (cuboidRef?.current) {\n for (const obj of cuboidRef.current.children) {\n if (obj.name.includes('Human') || obj.name.includes('Tree')) {\n const absPos = absPosMapRef.current.get(getObjectId(obj));\n if (absPos) {\n // stand on top face\n if (Math.abs(oldHeightRef.current - absPos.z) < 0.01) {\n obj.position.setZ(Math.max(p.z / 2, 0.5));\n }\n // stand on side faces\n else {\n obj.position.setZ(absPos.z - cuboidRef.current.position.z);\n }\n }\n }\n }\n }\n }\n break;\n }\n }\n }\n }\n };\n\n const handlePointerDown = (e: ThreeEvent) => {\n if (e.button === 2) return; // ignore right-click\n setCommonStore((state) => {\n state.contextMenuObjectType = null;\n });\n clickSky(e);\n\n const selectedElement = grabRef.current;\n if (selectedElement) {\n // save info for undo\n oldHeightRef.current = selectedElement.lz;\n oldPositionRef.current.set(selectedElement.cx, selectedElement.cy, selectedElement.cz);\n\n // store the positions of children\n switch (selectedElement.type) {\n case ObjectType.Human:\n oldHumanOrTreeParentIdRef.current = selectedElement.parentId;\n break;\n case ObjectType.Tree:\n oldHumanOrTreeParentIdRef.current = selectedElement.parentId;\n oldWidthRef.current = selectedElement.lx; // crown spread of tree\n break;\n case ObjectType.Cuboid: {\n oldPositionRef.current.set(selectedElement.cx, selectedElement.cy, selectedElement.cz);\n oldDimensionRef.current.set(selectedElement.lx, selectedElement.ly, selectedElement.lz);\n\n absPosMapRef.current.clear();\n const cuboidCenter = new Vector3(selectedElement.cx, selectedElement.cy, selectedElement.cz);\n const cuboidChildren = getChildren(selectedElement.id);\n if (cuboidChildren.length > 0) {\n oldChildrenPositionsMapRef.current.clear();\n const a = selectedElement.rotation[2];\n for (const e of cuboidChildren) {\n switch (e.type) {\n case ObjectType.Tree:\n case ObjectType.Human:\n const centerAbsPos = new Vector3(e.cx, e.cy, e.cz).applyEuler(new Euler(0, 0, a));\n centerAbsPos.add(cuboidCenter);\n absPosMapRef.current.set(e.id, centerAbsPos);\n oldChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, e.cz));\n break;\n case ObjectType.SolarPanel:\n case ObjectType.Sensor:\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\n const centerAbsPos = new Vector3(\n e.cx * selectedElement.lx,\n e.cy * selectedElement.ly,\n e.cz * selectedElement.lz,\n ).applyEuler(new Euler(0, 0, a));\n centerAbsPos.add(cuboidCenter);\n absPosMapRef.current.set(e.id, centerAbsPos);\n }\n break;\n case ObjectType.Polygon:\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\n const polygon = e as PolygonModel;\n const vertexAbsPosArray: Vector2[] = [];\n for (const v of polygon.vertices) {\n const vertexAbsPos = new Vector2(v.x * selectedElement.lx, v.y * selectedElement.ly).rotateAround(\n ORIGIN_VECTOR2,\n a,\n );\n vertexAbsPos.add(new Vector2(cuboidCenter.x, cuboidCenter.y));\n vertexAbsPosArray.push(vertexAbsPos);\n }\n polygonsAbsPosMapRef.current.set(polygon.id, vertexAbsPosArray);\n }\n break;\n }\n }\n }\n break;\n }\n }\n }\n };\n\n const handlePointerUp = () => {\n if (grabRef.current) {\n const elem = getElementById(grabRef.current.id);\n if (elem && !elem.locked) {\n let elementRef: Group | null | undefined = null;\n let newHumanOrTreeParentId: string | null = oldHumanOrTreeParentIdRef.current;\n switch (elem.type) {\n case ObjectType.Cuboid:\n switch (resizeHandleType) {\n case ResizeHandleType.UpperLeftTop:\n case ResizeHandleType.UpperRightTop:\n case ResizeHandleType.LowerLeftTop:\n case ResizeHandleType.LowerRightTop:\n oldChildrenParentIdMapRef.current.clear();\n setCommonStore((state) => {\n state.actionState.cuboidHeight = elem.lz;\n // set ref children state\n for (const e of state.elements) {\n if (Util.isPlantOrHuman(e)) {\n if (e.parentId === elem.id) {\n oldChildrenParentIdMapRef.current.set(e.id, elem.id);\n // stand on top face\n if (Math.abs(oldDimensionRef.current.z / 2 - e.cz) < 0.01) {\n e.cz = elem.lz / 2;\n }\n // stand on side faces\n else {\n const newRelZ = e.cz + oldPositionRef.current.z - elem.cz;\n if (Math.abs(newRelZ) > elem.lz / 2) {\n handleDetachParent(elem, e);\n } else {\n e.cz = newRelZ;\n }\n }\n }\n }\n }\n });\n const children = getChildren(elem.id);\n if (children.length > 0) {\n for (const c of children) {\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\n }\n }\n const undoableChangeHeight = {\n name: 'Change Cuboid Height',\n timestamp: Date.now(),\n changedElementId: elem.id,\n changedElementType: elem.type,\n oldValue: oldHeightRef.current,\n newValue: elem.lz,\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\n undo: () => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === undoableChangeHeight.changedElementId) {\n e.lz = undoableChangeHeight.oldValue as number;\n e.cz = (undoableChangeHeight.oldValue as number) / 2;\n break;\n }\n }\n });\n if (\n undoableChangeHeight.oldChildrenPositionsMap &&\n undoableChangeHeight.oldChildrenPositionsMap.size > 0\n ) {\n for (const [id, p] of undoableChangeHeight.oldChildrenPositionsMap.entries()) {\n const elem = getElementById(id);\n if (elem?.type !== ObjectType.Polygon) {\n setElementPosition(id, p.x, p.y, p.z);\n const oldParentId = undoableChangeHeight.oldChildrenParentIdMap?.get(id);\n const newParentId = undoableChangeHeight.newChildrenParentIdMap?.get(id);\n if (oldParentId && newParentId && oldParentId !== newParentId) {\n attachToGroup(oldParentId, newParentId, id);\n setParentIdById(oldParentId, id);\n }\n }\n }\n }\n },\n redo: () => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === undoableChangeHeight.changedElementId) {\n e.lz = undoableChangeHeight.newValue as number;\n e.cz = (undoableChangeHeight.newValue as number) / 2;\n break;\n }\n }\n });\n if (\n undoableChangeHeight.newChildrenPositionsMap &&\n undoableChangeHeight.newChildrenPositionsMap.size > 0\n ) {\n for (const [id, p] of undoableChangeHeight.newChildrenPositionsMap.entries()) {\n setElementPosition(id, p.x, p.y, p.z);\n const oldParentId = undoableChangeHeight.oldChildrenParentIdMap?.get(id);\n const newParentId = undoableChangeHeight.newChildrenParentIdMap?.get(id);\n if (oldParentId && newParentId && oldParentId !== newParentId) {\n attachToGroup(newParentId, oldParentId, id);\n setParentIdById(newParentId, id);\n }\n }\n }\n },\n } as UndoableChange;\n addUndoable(undoableChangeHeight);\n break;\n }\n break;\n case ObjectType.Tree:\n switch (resizeHandleType) {\n case ResizeHandleType.Top:\n const undoableChangeHeight = {\n name: 'Change Tree Height',\n timestamp: Date.now(),\n changedElementId: elem.id,\n changedElementType: elem.type,\n oldValue: oldHeightRef.current,\n newValue: elem.lz,\n undo: () => {\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.oldValue as number);\n },\n redo: () => {\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChangeHeight);\n setCommonStore((state) => {\n state.actionState.treeHeight = elem.lz;\n });\n break;\n case ResizeHandleType.Left:\n case ResizeHandleType.Right:\n case ResizeHandleType.Lower:\n case ResizeHandleType.Upper:\n const undoableChangeSpread = {\n name: 'Change Tree Spread',\n timestamp: Date.now(),\n changedElementId: elem.id,\n changedElementType: elem.type,\n oldValue: oldWidthRef.current,\n newValue: elem.lx,\n undo: () => {\n updateElementLxById(undoableChangeSpread.changedElementId, undoableChangeSpread.oldValue as number);\n },\n redo: () => {\n updateElementLxById(undoableChangeSpread.changedElementId, undoableChangeSpread.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChangeSpread);\n setCommonStore((state) => {\n state.actionState.treeSpread = elem.lx;\n });\n break;\n }\n elementRef = useRefStore.getState().treeRef?.current;\n break;\n case ObjectType.Human:\n elementRef = useRefStore.getState().humanRef?.current;\n break;\n }\n if (elementRef) {\n const intersections = ray.intersectObjects(Util.fetchIntersectables(scene), false);\n const intersection = getIntersectionToStand(intersections); // could simplify???\n if (intersection) {\n const p = intersection.point;\n // on ground\n if (intersection.object.name === 'Ground') {\n handleSetElementState(elem.id, GROUND_ID, p);\n newPositionRef.current.set(p.x, p.y, p.z);\n newHumanOrTreeParentId = GROUND_ID;\n }\n // on other standable elements\n else if (intersection.object.userData.stand) {\n const intersectionObjId = getObjectId(intersection.object);\n const intersectionObjGroup = intersection.object.parent;\n if (intersectionObjGroup) {\n const relPos = new Vector3()\n .subVectors(p, intersectionObjGroup.position)\n .applyEuler(elementParentRotation);\n handleSetElementState(elem.id, intersectionObjId, relPos);\n newPositionRef.current.set(relPos.x, relPos.y, relPos.z);\n newHumanOrTreeParentId = intersectionObjId;\n }\n }\n }\n }\n if (\n useStore.getState().moveHandleType &&\n Util.isPlantOrHuman(elem) &&\n (newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE ||\n ray.intersectObjects([meshRef.current!]).length > 0)\n ) {\n let moveOk = true;\n // not sure why we need to check this as I cannot imagine which object will be dragged in the sky\n if (!useStore.getState().viewState.orthographic) {\n // OK to move closer to the origin\n moveOk = newPositionRef.current.length() < oldPositionRef.current.length();\n if (!moveOk) {\n // in the case that it is moving away from the origin, check it will be too far\n const screenPosition = newPositionRef.current.clone().project(camera);\n const screenLx = newPositionRef.current\n .clone()\n .add(new Vector3(elem.lx, 0, 0))\n .project(camera)\n .distanceTo(screenPosition);\n const screenLy = newPositionRef.current\n .clone()\n .add(new Vector3(0, elem.ly ?? 1, 0))\n .project(camera)\n .distanceTo(screenPosition);\n const screenLz = newPositionRef.current\n .clone()\n .add(new Vector3(0, 0, elem.lz))\n .project(camera)\n .distanceTo(screenPosition);\n // OK if larger than 2% of screen dimension\n moveOk = Math.max(screenLx, screenLy, screenLz) > 0.02;\n }\n }\n if (!moveOk || isMoveToSky()) {\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\n if (elementRef) {\n if (Util.isPlantOrHuman(elem)) {\n elementRef.position.copy(oldPositionRef.current);\n }\n }\n if (Util.isPlantOrHuman(elem)) {\n setParentIdById(oldHumanOrTreeParentIdRef.current, elem.id);\n }\n const contentRef = useRefStore.getState().contentRef;\n if (contentRef?.current && oldHumanOrTreeParentIdRef.current && elementRef) {\n if (oldHumanOrTreeParentIdRef.current === GROUND_ID) {\n contentRef.current.add(elementRef);\n } else {\n const attachParentObj = Util.getObjectChildById(contentRef.current, oldHumanOrTreeParentIdRef.current);\n attachParentObj?.add(elementRef);\n }\n invalidate();\n }\n showError(i18n.t('message.CannotMoveObjectTooFar', lang));\n } else {\n const undoableMove = {\n name: 'Move',\n timestamp: Date.now(),\n movedElementId: elem.id,\n movedElementType: elem.type,\n oldCx: oldPositionRef.current.x,\n oldCy: oldPositionRef.current.y,\n oldCz: oldPositionRef.current.z,\n newCx: newPositionRef.current.x,\n newCy: newPositionRef.current.y,\n newCz: newPositionRef.current.z,\n oldParentId: oldHumanOrTreeParentIdRef.current,\n newParentId: newHumanOrTreeParentId,\n undo: () => {\n setElementPosition(\n undoableMove.movedElementId,\n undoableMove.oldCx,\n undoableMove.oldCy,\n undoableMove.oldCz,\n );\n setParentIdById(undoableMove.oldParentId, undoableMove.movedElementId);\n attachToGroup(undoableMove.oldParentId, undoableMove.newParentId, undoableMove.movedElementId);\n },\n redo: () => {\n setElementPosition(\n undoableMove.movedElementId,\n undoableMove.newCx,\n undoableMove.newCy,\n undoableMove.newCz,\n );\n setParentIdById(undoableMove.newParentId, undoableMove.movedElementId);\n attachToGroup(undoableMove.newParentId, undoableMove.oldParentId, undoableMove.movedElementId);\n },\n } as UndoableMove;\n addUndoable(undoableMove);\n updateSceneRadius();\n }\n }\n }\n grabRef.current = null;\n setIntersectionPlaneType(IntersectionPlaneType.Sky);\n setCommonStore((state) => {\n state.moveHandleType = null;\n state.resizeHandleType = null;\n state.rotateHandleType = null;\n });\n useRefStore.setState((state) => {\n state.humanRef = null;\n state.treeRef = null;\n state.setEnableOrbitController(true);\n });\n }\n };\n\n return (\n <>\n {\n if (e.intersections.length > 0) {\n const skyClicked = e.intersections[0].object === meshRef.current;\n if (skyClicked) {\n selectNone();\n setCommonStore((state) => {\n state.clickObjectType = ObjectType.Sky;\n state.contextMenuObjectType = ObjectType.Sky;\n });\n }\n }\n }}\n onPointerDown={handlePointerDown}\n >\n \n \n \n {grabRef.current && intersectionPlaneType !== IntersectionPlaneType.Sky && (\n \n \n \n )}\n \n );\n};\n\nexport default React.memo(Sky);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Line } from '@react-three/drei';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { useLoader } from '@react-three/fiber';\nimport { FontLoader, TextGeometryParameters } from 'three';\nimport helvetikerFont from '../fonts/helvetiker_regular.typeface.fnt';\n\nexport interface AxesProps {\n lineWidth?: number;\n endPoint?: number;\n showTickMarks?: boolean;\n showTickLabels?: boolean;\n}\n\nconst Axes = ({ lineWidth = 1, endPoint = 1000, showTickMarks = true, showTickLabels = true }: AxesProps) => {\n const aabb = useStore(Selector.aabb);\n const sceneRadius = useStore(Selector.sceneRadius);\n const orthographic = useStore(Selector.viewState.orthographic);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n\n const nTicks = 50;\n const tickIntervalRef = useRef(1);\n const labelIntervalRef = useRef(tickIntervalRef.current * 10);\n const arrayRef = useRef(new Array(nTicks).fill(1));\n\n const minorTickLength = 0.1;\n const majorTickLength = 0.3;\n const tickMarkColor = 'FloralWhite';\n const tickMarkLineWidth = lineWidth / 2;\n const font = useLoader(FontLoader, helvetikerFont);\n const fontSize = Math.min(1, Math.max(0.5, sceneRadius * 0.01));\n const textGeometryParams = {\n font: font,\n height: 0,\n size: fontSize,\n } as TextGeometryParameters;\n const cameraZ: number = orthographic ? aabb.max.z + 0.01 : 0;\n\n useEffect(() => {\n if (sceneRadius < 50) {\n tickIntervalRef.current = 1;\n } else if (sceneRadius < 100) {\n tickIntervalRef.current = 2;\n } else {\n tickIntervalRef.current = 5;\n }\n labelIntervalRef.current = 10 * tickIntervalRef.current;\n arrayRef.current = new Array(nTicks).fill(1);\n setUpdateFlag(!updateFlag);\n }, [sceneRadius]);\n\n const fetchTickLength = (i: number) => {\n return i % (5 * tickIntervalRef.current) === 0 ? majorTickLength : minorTickLength;\n };\n\n return (\n <>\n {/* x axis */}\n \n {orthographic &&\n showTickMarks &&\n arrayRef.current.map((value, i) => {\n const j = (i + 1) * tickIntervalRef.current;\n const a = fetchTickLength(j);\n return (\n \n \n \n \n );\n })}\n {orthographic &&\n showTickLabels &&\n arrayRef.current.map((value, i) => {\n const j = (i + 1) * tickIntervalRef.current;\n return j % labelIntervalRef.current === 0 ? (\n \n \n \n \n ) : (\n \n );\n })}\n {orthographic &&\n showTickLabels &&\n arrayRef.current.map((value, i) => {\n const j = -(i + 1) * tickIntervalRef.current;\n return j % labelIntervalRef.current === 0 ? (\n \n -10 ? ' ' : '') + j, textGeometryParams]} />\n \n
\n ) : (\n \n );\n })}\n\n {/* y axis */}\n \n {/* tick mark line width is enlarged because they appear to be thinner in the y direction */}\n {orthographic &&\n showTickMarks &&\n arrayRef.current.map((value, i) => {\n const j = (i + 1) * tickIntervalRef.current;\n const a = fetchTickLength(j);\n return (\n \n \n \n \n );\n })}\n {orthographic &&\n showTickLabels &&\n arrayRef.current.map((value, i) => {\n const j = (i + 1) * tickIntervalRef.current;\n return j % labelIntervalRef.current === 0 ? (\n \n \n \n
\n ) : (\n \n );\n })}\n {orthographic &&\n showTickLabels &&\n arrayRef.current.map((value, i) => {\n const j = -(i + 1) * tickIntervalRef.current;\n return j % labelIntervalRef.current === 0 ? (\n \n \n \n
\n ) : (\n \n );\n })}\n\n {/* z axis */}\n {!orthographic && (\n \n )}\n \n );\n};\n\nexport default React.memo(Axes);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DoubleSide, Group, Mesh, RepeatWrapping, TextureLoader, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\r\nimport { HumanModel } from '../models/HumanModel';\r\nimport { Billboard, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\r\nimport {\r\n GROUND_ID,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_COLOR_1,\r\n MOVE_HANDLE_RADIUS,\r\n TWO_PI,\r\n} from '../constants';\r\nimport {\r\n ActionType,\r\n Gender,\r\n HumanName,\r\n MoveHandleType,\r\n ObjectType,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n} from '../types';\r\nimport i18n from '../i18n/i18n';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { HumanData } from '../HumanData';\r\nimport { Util } from '../Util';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Human = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n name = HumanName.Jack,\r\n locked = false,\r\n flip = false,\r\n observer = false,\r\n parentId,\r\n}: HumanModel) => {\r\n let isRender = false;\r\n useStore((state) => {\r\n if (parentId === GROUND_ID) {\r\n isRender = true;\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n isRender = true;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n const removeElementById = useStore(Selector.removeElementById);\r\n useEffect(() => {\r\n if (!isRender) {\r\n removeElementById(id, false);\r\n }\r\n }, [isRender, id]);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const selectMe = useStore(Selector.selectMe);\r\n const getElementById = useStore(Selector.getElementById);\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const selected = useSelected(id);\r\n\r\n const { gl } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n\r\n const contentRef = useRefStore((state) => state.contentRef);\r\n const groupRef = useRef(null);\r\n const planeRef = useRef(null);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const humanModel = useMemo(() => getElementById(id) as HumanModel, [id]);\r\n\r\n const fileChangedRef = useRef(false);\r\n const fileChangedState = useStore(Selector.fileChanged);\r\n\r\n // after we delete their parent(change file), we have to add the ref to content immediately,\r\n // because their new parent may not be mounted yet.\r\n if (fileChangedState !== fileChangedRef.current) {\r\n fileChangedRef.current = fileChangedState;\r\n if (contentRef?.current && groupRef.current) {\r\n contentRef.current.add(groupRef.current);\r\n }\r\n }\r\n\r\n // once useEffect detect state change, that means their parent is now mounted, then we add ref to their new parent.\r\n useEffect(() => {\r\n if (parentId !== GROUND_ID) {\r\n const obj = getParentObject();\r\n if (obj && groupRef.current) {\r\n obj.add(groupRef.current);\r\n }\r\n }\r\n }, [fileChangedState]);\r\n\r\n const textureLoader = useMemo(() => {\r\n return new TextureLoader().load(HumanData.fetchTextureImage(name), (texture) => {\r\n if (flip) {\r\n texture.wrapS = RepeatWrapping;\r\n texture.repeat.x = -1;\r\n }\r\n setTexture(texture);\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }, [name, flip]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n const width = useMemo(() => {\r\n return HumanData.fetchWidth(name);\r\n }, [name]);\r\n\r\n const height = useMemo(() => {\r\n return HumanData.fetchHeight(name);\r\n }, [name]);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n HumanData.fetchLabel(name, lang) +\r\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang)\r\n );\r\n }, [name, locked, language, cx, cy]);\r\n\r\n // attach parent dom element if parent is not Ground\r\n useEffect(() => {\r\n const parentObject = getParentObject();\r\n if (parentObject && groupRef.current) {\r\n parentObject.add(groupRef.current);\r\n }\r\n }, [contentRef]);\r\n\r\n // return null if parent is Ground\r\n const getParentObject = () => {\r\n if (parentId !== GROUND_ID && contentRef?.current) {\r\n return Util.getObjectChildById(contentRef.current, parentId);\r\n }\r\n return null;\r\n };\r\n\r\n useFrame(({ camera }) => {\r\n // rotation\r\n if (groupRef.current) {\r\n const { rot: parentWorldRotation } = Util.getWorldDataById(parentId);\r\n if (!orthographic) {\r\n const { x: cameraX, y: cameraY } = camera.position;\r\n const { x: currX, y: currY } = groupRef.current.localToWorld(new Vector3());\r\n groupRef.current.rotation.set(0, 0, -Math.atan2(cameraX - currX, cameraY - currY) - parentWorldRotation);\r\n } else {\r\n groupRef.current.rotation.set(HALF_PI, Math.PI - parentWorldRotation, 0);\r\n }\r\n }\r\n });\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n state.selectedElementHeight = humanModel.lz;\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n gl.domElement.style.cursor = 'move';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'default';\r\n }, []);\r\n\r\n const gender = observer ? HumanData.fetchGender(humanModel.name) : Gender.Male;\r\n const hatOffsetX = observer ? (humanModel.flip ? -1 : 1) * HumanData.fetchHatOffsetX(humanModel.name) : 0;\r\n const hatOffsetY = observer ? HumanData.fetchHatOffsetY(humanModel.name) : 0;\r\n\r\n if (!isRender) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === planeRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Human;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.humanRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === planeRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {/* highlight this person when he or she is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* mark this person with a hat when he or she is an observer */}\r\n {observer && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw handle */}\r\n {selected && !locked && (\r\n {\r\n if (e.button !== 2 && e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.humanRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n )}\r\n {hovered && !selected && (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Human);\r\n","export default __webpack_public_path__ + \"static/media/apple_spring.0cad3025.png\";","export default __webpack_public_path__ + \"static/media/apple_summer.46de7d87.png\";","export default __webpack_public_path__ + \"static/media/apple_fall.27ba1ce5.png\";","export default __webpack_public_path__ + \"static/media/apple_winter.d23599a6.png\";","export default __webpack_public_path__ + \"static/media/birch_spring.6960e824.png\";","export default __webpack_public_path__ + \"static/media/birch_summer.59ae1138.png\";","export default __webpack_public_path__ + \"static/media/birch_fall.210e663d.png\";","export default __webpack_public_path__ + \"static/media/birch_winter.c4988403.png\";","export default __webpack_public_path__ + \"static/media/coconut.d38cdccd.png\";","export default __webpack_public_path__ + \"static/media/dogwood_spring.c53ecf05.png\";","export default __webpack_public_path__ + \"static/media/dogwood_summer.8f3157af.png\";","export default __webpack_public_path__ + \"static/media/dogwood_fall.cb8fd9b6.png\";","export default __webpack_public_path__ + \"static/media/dogwood_winter.745583bb.png\";","export default __webpack_public_path__ + \"static/media/elm_spring.a67f6f9c.png\";","export default __webpack_public_path__ + \"static/media/elm_summer.0e729b1c.png\";","export default __webpack_public_path__ + \"static/media/elm_fall.720b87ef.png\";","export default __webpack_public_path__ + \"static/media/elm_winter.49563d13.png\";","export default __webpack_public_path__ + \"static/media/fan_palm.dd78413a.png\";","export default __webpack_public_path__ + \"static/media/linden_spring.073d4e74.png\";","export default __webpack_public_path__ + \"static/media/linden_summer.7a1479da.png\";","export default __webpack_public_path__ + \"static/media/linden_fall.3e8bb305.png\";","export default __webpack_public_path__ + \"static/media/linden_winter.9af7eb0e.png\";","export default __webpack_public_path__ + \"static/media/magnolia_spring.8dc3ef2d.png\";","export default __webpack_public_path__ + \"static/media/magnolia_summer.00567305.png\";","export default __webpack_public_path__ + \"static/media/magnolia_fall.475b9098.png\";","export default __webpack_public_path__ + \"static/media/magnolia_winter.8a371c67.png\";","export default __webpack_public_path__ + \"static/media/maple_spring.e1e24394.png\";","export default __webpack_public_path__ + \"static/media/maple_summer.7b3e9753.png\";","export default __webpack_public_path__ + \"static/media/maple_fall.5e8e43bb.png\";","export default __webpack_public_path__ + \"static/media/maple_winter.37fba60e.png\";","export default __webpack_public_path__ + \"static/media/oak_spring.3b768daa.png\";","export default __webpack_public_path__ + \"static/media/oak_summer.54230708.png\";","export default __webpack_public_path__ + \"static/media/oak_fall.ba997613.png\";","export default __webpack_public_path__ + \"static/media/oak_winter.02087599.png\";","export default __webpack_public_path__ + \"static/media/pine.80a6a140.png\";","export default __webpack_public_path__ + \"static/media/spruce.dea2071b.png\";","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport AppleSpringImage from './resources/apple_spring.png';\nimport AppleSummerImage from './resources/apple_summer.png';\nimport AppleFallImage from './resources/apple_fall.png';\nimport AppleWinterImage from './resources/apple_winter.png';\nimport BirchSpringImage from './resources/birch_spring.png';\nimport BirchSummerImage from './resources/birch_summer.png';\nimport BirchFallImage from './resources/birch_fall.png';\nimport BirchWinterImage from './resources/birch_winter.png';\nimport CoconutImage from './resources/coconut.png';\nimport DogwoodSpringImage from './resources/dogwood_spring.png';\nimport DogwoodSummerImage from './resources/dogwood_summer.png';\nimport DogwoodFallImage from './resources/dogwood_fall.png';\nimport DogwoodWinterImage from './resources/dogwood_winter.png';\nimport ElmSpringImage from './resources/elm_spring.png';\nimport ElmSummerImage from './resources/elm_summer.png';\nimport ElmFallImage from './resources/elm_fall.png';\nimport ElmWinterImage from './resources/elm_winter.png';\nimport FanPalmImage from './resources/fan_palm.png';\nimport LindenSpringImage from './resources/linden_spring.png';\nimport LindenSummerImage from './resources/linden_summer.png';\nimport LindenFallImage from './resources/linden_fall.png';\nimport LindenWinterImage from './resources/linden_winter.png';\nimport MagnoliaSpringImage from './resources/magnolia_spring.png';\nimport MagnoliaSummerImage from './resources/magnolia_summer.png';\nimport MagnoliaFallImage from './resources/magnolia_fall.png';\nimport MagnoliaWinterImage from './resources/magnolia_winter.png';\nimport MapleSpringImage from './resources/maple_spring.png';\nimport MapleSummerImage from './resources/maple_summer.png';\nimport MapleFallImage from './resources/maple_fall.png';\nimport MapleWinterImage from './resources/maple_winter.png';\nimport OakSpringImage from './resources/oak_spring.png';\nimport OakSummerImage from './resources/oak_summer.png';\nimport OakFallImage from './resources/oak_fall.png';\nimport OakWinterImage from './resources/oak_winter.png';\nimport PineImage from './resources/pine.png';\nimport SpruceImage from './resources/spruce.png';\nimport { TreeType } from './types';\nimport i18n from './i18n/i18n';\n\nexport class TreeData {\n static isEvergreen(type: TreeType): boolean {\n return type === TreeType.Spruce || type === TreeType.Pine || type === TreeType.FanPalm || type === TreeType.Coconut;\n }\n\n static isConic(type: TreeType): boolean {\n return type === TreeType.Spruce;\n }\n\n static fetchLabel(name: string, lang: {}): string {\n switch (name) {\n case TreeType.Apple:\n return i18n.t('tree.Apple', lang);\n case TreeType.Birch:\n return i18n.t('tree.Birch', lang);\n case TreeType.Coconut:\n return i18n.t('tree.Coconut', lang);\n case TreeType.Dogwood:\n return i18n.t('tree.Dogwood', lang);\n case TreeType.Elm:\n return i18n.t('tree.Elm', lang);\n case TreeType.FanPalm:\n return i18n.t('tree.FanPalm', lang);\n case TreeType.Linden:\n return i18n.t('tree.Linden', lang);\n case TreeType.Magnolia:\n return i18n.t('tree.Magnolia', lang);\n case TreeType.Maple:\n return i18n.t('tree.Maple', lang);\n case TreeType.Oak:\n return i18n.t('tree.Oak', lang);\n case TreeType.Spruce:\n return i18n.t('tree.Spruce', lang);\n default:\n return i18n.t('tree.Pine', lang);\n }\n }\n\n static fetchTheta(name: string): number {\n switch (name) {\n case TreeType.Apple:\n return 0.65 * Math.PI;\n case TreeType.Birch:\n return 0.72 * Math.PI;\n case TreeType.Coconut:\n return 0.5 * Math.PI;\n case TreeType.Dogwood:\n return 0.65 * Math.PI;\n case TreeType.Elm:\n return 0.78 * Math.PI;\n case TreeType.FanPalm:\n return 0.52 * Math.PI;\n case TreeType.Linden:\n return 0.75 * Math.PI;\n case TreeType.Magnolia:\n return 0.68 * Math.PI;\n case TreeType.Maple:\n return 0.65 * Math.PI;\n case TreeType.Oak:\n return 0.75 * Math.PI;\n case TreeType.Spruce:\n return Math.PI;\n default:\n return Math.PI * 0.5;\n }\n }\n\n // month is from 1 to 12\n static fetchTextureImage(name: string, dayOfYear: number, latitude: number, leafOutDay: number, leafOffDay: number) {\n let textureImg;\n const lastDayOfSpring = leafOutDay + 30;\n const lastDayOfSummer = leafOffDay - 30;\n const northernHemisphere = latitude > 0;\n switch (name) {\n case TreeType.Apple:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? AppleWinterImage : AppleSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? AppleSpringImage : AppleFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? AppleSummerImage : AppleWinterImage;\n } else {\n textureImg = northernHemisphere ? AppleFallImage : AppleSpringImage;\n }\n break;\n case TreeType.Birch:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? BirchWinterImage : BirchSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? BirchSpringImage : BirchFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? BirchSummerImage : BirchWinterImage;\n } else {\n textureImg = northernHemisphere ? BirchFallImage : BirchSpringImage;\n }\n break;\n case TreeType.Coconut:\n textureImg = CoconutImage;\n break;\n case TreeType.Dogwood:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? DogwoodWinterImage : DogwoodSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? DogwoodSpringImage : DogwoodFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? DogwoodSummerImage : DogwoodWinterImage;\n } else {\n textureImg = northernHemisphere ? DogwoodFallImage : DogwoodSpringImage;\n }\n break;\n case TreeType.Elm:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? ElmWinterImage : ElmSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? ElmSpringImage : ElmFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? ElmSummerImage : ElmWinterImage;\n } else {\n textureImg = northernHemisphere ? ElmFallImage : ElmSpringImage;\n }\n break;\n case TreeType.FanPalm:\n textureImg = FanPalmImage;\n break;\n case TreeType.Linden:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? LindenWinterImage : LindenSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? LindenSpringImage : LindenFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? LindenSummerImage : LindenWinterImage;\n } else {\n textureImg = northernHemisphere ? LindenFallImage : LindenSpringImage;\n }\n break;\n case TreeType.Magnolia:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? MagnoliaWinterImage : MagnoliaSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? MagnoliaSpringImage : MagnoliaFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? MagnoliaSummerImage : MagnoliaWinterImage;\n } else {\n textureImg = northernHemisphere ? MagnoliaFallImage : MagnoliaSpringImage;\n }\n break;\n case TreeType.Maple:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? MapleWinterImage : MapleSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? MapleSpringImage : MapleFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? MapleSummerImage : MapleWinterImage;\n } else {\n textureImg = northernHemisphere ? MapleFallImage : MapleSpringImage;\n }\n break;\n case TreeType.Oak:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? OakWinterImage : OakSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? OakSpringImage : OakFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? OakSummerImage : OakWinterImage;\n } else {\n textureImg = northernHemisphere ? OakFallImage : OakSpringImage;\n }\n break;\n case TreeType.Spruce:\n textureImg = SpruceImage;\n break;\n default:\n textureImg = PineImage;\n }\n return textureImg;\n }\n}\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport {\r\n DoubleSide,\r\n Group,\r\n Mesh,\r\n MeshDepthMaterial,\r\n RepeatWrapping,\r\n RGBADepthPacking,\r\n TextureLoader,\r\n Vector3,\r\n} from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\r\nimport { Billboard, Box, Cone, Line, Plane, Sphere } from '@react-three/drei';\r\nimport {\r\n DEFAULT_LEAF_OFF_DAY,\r\n DEFAULT_LEAF_OUT_DAY,\r\n GROUND_ID,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_COLOR_1,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n TWO_PI,\r\n} from '../constants';\r\nimport { TreeModel } from '../models/TreeModel';\r\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType, TreeType } from '../types';\r\nimport i18n from '../i18n/i18n';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { Util } from '../Util';\r\nimport { TreeData } from '../TreeData';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Tree = ({\r\n parentId,\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n lz,\r\n name = TreeType.Pine,\r\n flip = false,\r\n locked = false,\r\n showModel = false,\r\n showLabel = false,\r\n}: TreeModel) => {\r\n let isRender = false;\r\n useStore((state) => {\r\n if (parentId === GROUND_ID) {\r\n isRender = true;\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n isRender = true;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n const removeElementById = useStore(Selector.removeElementById);\r\n useEffect(() => {\r\n if (!isRender) {\r\n removeElementById(id, false);\r\n }\r\n }, [isRender]);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const leafDayOfYear1 = useStore(Selector.world.leafDayOfYear1) ?? DEFAULT_LEAF_OUT_DAY;\r\n const leafDayOfYear2 = useStore(Selector.world.leafDayOfYear2) ?? DEFAULT_LEAF_OFF_DAY;\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const selectMe = useStore(Selector.selectMe);\r\n const getElementById = useStore(Selector.getElementById);\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const selected = useSelected(id);\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const { gl } = useThree();\r\n\r\n const contentRef = useRefStore((state) => state.contentRef);\r\n const groupRef = useRef(null);\r\n const solidTreeRef = useRef(null);\r\n const shadowTreeRef = useRef(null);\r\n const trunkMeshRef = useRef(null);\r\n const interactionPlaneRef = useRef(null);\r\n const resizeHandleTopRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n const treeModel = useMemo(() => getElementById(id) as TreeModel, [id]);\r\n\r\n const dayOfYear = useMemo(() => {\r\n return Util.dayOfYear(new Date(date));\r\n }, [date]);\r\n\r\n const noLeaves = useMemo(() => {\r\n return (\r\n !TreeData.isEvergreen(treeModel ? treeModel.name : TreeType.Dogwood) &&\r\n (latitude > 0\r\n ? dayOfYear < leafDayOfYear1 || dayOfYear > leafDayOfYear2\r\n : dayOfYear >= leafDayOfYear1 && dayOfYear <= leafDayOfYear2)\r\n );\r\n }, [dayOfYear, leafDayOfYear1, leafDayOfYear2, latitude, treeModel?.name]);\r\n\r\n const fileChangedRef = useRef(false);\r\n const fileChangedState = useStore(Selector.fileChanged);\r\n\r\n if (fileChangedState !== fileChangedRef.current) {\r\n fileChangedRef.current = fileChangedState;\r\n if (contentRef?.current && groupRef.current) {\r\n contentRef.current.add(groupRef.current);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (parentId !== GROUND_ID) {\r\n const obj = getParentObject();\r\n if (obj && groupRef.current) {\r\n obj.add(groupRef.current);\r\n }\r\n }\r\n }, [fileChangedState]);\r\n\r\n // attach parent dom element if parent is not Ground\r\n useEffect(() => {\r\n const parentObject = getParentObject();\r\n if (parentObject && groupRef.current) {\r\n parentObject.add(groupRef.current);\r\n }\r\n }, [contentRef]);\r\n\r\n const textureLoader = useMemo(() => {\r\n return new TextureLoader().load(\r\n TreeData.fetchTextureImage(name, dayOfYear, latitude, leafDayOfYear1, leafDayOfYear2),\r\n (texture) => {\r\n if (flip) {\r\n texture.wrapS = RepeatWrapping;\r\n texture.repeat.x = -1;\r\n }\r\n setTexture(texture);\r\n setUpdateFlag(!updateFlag);\r\n },\r\n );\r\n }, [name, dayOfYear, latitude, flip, leafDayOfYear1, leafDayOfYear2]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (treeModel?.label ? treeModel.label : TreeData.fetchLabel(name, lang)) +\r\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (treeModel?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [treeModel?.label, name, cx, cy, locked, language]);\r\n\r\n const theta = useMemo(() => {\r\n return TreeData.fetchTheta(name);\r\n }, [name]);\r\n\r\n const customDepthMaterial = new MeshDepthMaterial({\r\n depthPacking: RGBADepthPacking,\r\n map: texture,\r\n alphaTest: 0.1,\r\n });\r\n\r\n const hx = lx / 2;\r\n const hz = lz / 2;\r\n const positionTop = useMemo(() => new Vector3(0, 0, hz), [hz]);\r\n const positionLeft = useMemo(() => new Vector3(-hx, 0, 0), [hx]);\r\n const positionRight = useMemo(() => new Vector3(hx, 0, 0), [hx]);\r\n const positionLower = useMemo(() => new Vector3(0, -hx, 0), [hx]);\r\n const positionUpper = useMemo(() => new Vector3(0, hx, 0), [hx]);\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n state.selectedElementHeight = treeModel.lz;\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n gl.domElement.style.cursor = 'move';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'default';\r\n }, []);\r\n\r\n // return null if parent is Ground\r\n const getParentObject = () => {\r\n if (parentId !== GROUND_ID && contentRef?.current) {\r\n return Util.getObjectChildById(contentRef.current, parentId);\r\n }\r\n return null;\r\n };\r\n\r\n useFrame(({ camera }) => {\r\n // rotation\r\n if (solidTreeRef.current && groupRef.current && shadowTreeRef.current && interactionPlaneRef.current) {\r\n const { rot: parentWorldRotation } = Util.getWorldDataById(parentId);\r\n const { x: cameraX, y: cameraY } = camera.position;\r\n const { x: currX, y: currY } = groupRef.current.position;\r\n const { x: sunlightX, y: sunlightY } = useStore.getState().sunlightDirection;\r\n const parentObject = getParentObject();\r\n if (parentObject) {\r\n const worldPosition = groupRef.current.localToWorld(new Vector3());\r\n const e = Math.atan2(cameraX - worldPosition.x, cameraY - worldPosition.y) + parentWorldRotation;\r\n solidTreeRef.current.rotation.set(HALF_PI, -e, 0);\r\n interactionPlaneRef.current.rotation.set(-HALF_PI, e, 0);\r\n shadowTreeRef.current.rotation.set(HALF_PI, -Math.atan2(sunlightX, sunlightY) - parentWorldRotation, 0);\r\n } else {\r\n const e = Math.atan2(cameraX - currX, cameraY - currY);\r\n solidTreeRef.current.rotation.set(HALF_PI, -e, 0);\r\n interactionPlaneRef.current.rotation.set(-HALF_PI, e, 0);\r\n shadowTreeRef.current.rotation.set(HALF_PI, -Math.atan2(sunlightX, sunlightY), 0);\r\n }\r\n }\r\n });\r\n\r\n const handleSize = MOVE_HANDLE_RADIUS * 3;\r\n\r\n return (\r\n <>\r\n {isRender ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* cast shadow */}\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* simulation model. use double side as some rays may intersect from backside */}\r\n {TreeData.isConic(name) ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n\r\n {/* billboard for interactions (don't use a plane as it may become unselected at some angle) */}\r\n \r\n {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === trunkMeshRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Tree;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.treeRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === trunkMeshRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n }}\r\n />\r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* draw handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* move handle */}\r\n {\r\n if (e.button !== 2 && e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.treeRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {!orthographic && (\r\n <>\r\n {/* handle for resizing height */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Top);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {/* left handle for resizing crown spread */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {/* right handle for resizing crown spread */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {/* lower handle for resizing crown spread */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {/* upper handle for resizing crown spread */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Tree);\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport * as React from 'react';\nimport { Mesh } from 'three';\nimport { ParabolicCylinderGeometry } from '../js/ParabolicCylinderGeometry';\nimport { ParaboloidGeometry } from '../js/ParaboloidGeometry';\n\nexport type Args = T extends new (...args: any) => any ? ConstructorParameters : T;\nexport type ShapeProps = Omit & {\n args?: Args;\n children?: React.ReactNode;\n};\n\nfunction create(type: string) {\n const El: any = type + 'Geometry';\n return React.forwardRef(({ args, children, ...props }: ShapeProps, ref) => (\n } {...props}>\n \n {children}\n \n ));\n}\n\nexport const ParabolicCylinder = create('ParabolicCylinder');\nexport const Paraboloid = create('Paraboloid');\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { DAILY_LAG_IN_MINUTES, MINUTES_OF_DAY, OMEGA_DAY, OMEGA_YEAR, YEARLY_LAG_IN_DAYS } from './analysisConstants';\r\nimport { Util } from '../Util';\r\nimport { SunMinutes } from './SunMinutes';\r\nimport { BuildingCompletionStatus, DiurnalTemperatureModel, ObjectType } from '../types';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\n\r\nexport enum CheckStatus {\r\n NO_BUILDING = 3,\r\n AT_LEAST_ONE_BAD_NO_GOOD = 2,\r\n AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD = 1,\r\n OK = 0,\r\n}\r\n\r\nexport interface CheckResult {\r\n status: CheckStatus;\r\n buildingCompletion?: BuildingCompletionStatus;\r\n}\r\n\r\nexport const U_VALUE_OPENING = 50;\r\n\r\nexport const checkBuilding = (\r\n elements: ElementModel[],\r\n countElementsByType: Function,\r\n getChildrenOfType: Function,\r\n): CheckResult => {\r\n const foundationCount = countElementsByType(ObjectType.Foundation);\r\n if (foundationCount === 0) return { status: CheckStatus.NO_BUILDING } as CheckResult;\r\n let atLeastOneGood = false;\r\n let atLeastOneBad = false;\r\n let errorType = undefined;\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n if (f.notBuilding) continue;\r\n const walls = getChildrenOfType(ObjectType.Wall, f.id);\r\n if (walls.length > 0) {\r\n const completionStatus = Util.getBuildingCompletionStatus(f, elements);\r\n if (completionStatus === BuildingCompletionStatus.COMPLETE) {\r\n atLeastOneGood = true;\r\n } else {\r\n atLeastOneBad = true;\r\n errorType = completionStatus;\r\n }\r\n } else {\r\n atLeastOneBad = true;\r\n }\r\n }\r\n }\r\n if (atLeastOneBad && !atLeastOneGood)\r\n return { status: CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD, buildingCompletion: errorType } as CheckResult;\r\n if (atLeastOneBad && atLeastOneGood) return { status: CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD } as CheckResult;\r\n return { status: CheckStatus.OK } as CheckResult;\r\n};\r\n\r\n// use the darkness of color to approximate light absorption\r\nexport const getLightAbsorption = (element: ElementModel) => {\r\n if (!element.color) return 0.5;\r\n // catch some common cases\r\n const lc = element.color.toLowerCase();\r\n if (lc === 'white') return 0.05;\r\n if (lc === 'black') return 0.95;\r\n const bigint = parseInt(element.color.substring(1), 16);\r\n const r = (bigint >> 16) & 255;\r\n const g = (bigint >> 8) & 255;\r\n const b = bigint & 255;\r\n let min = Math.min(r, g);\r\n min = Math.min(min, b);\r\n let max = Math.max(r, g);\r\n max = Math.max(max, b);\r\n return Math.min(0.95, Math.max(0.05, 1 - (min + max) / 510));\r\n};\r\n\r\n/*\r\n If the lowest outside temperature is higher than the threshold, don't turn on the heater.\r\n If the highest outside temperature is lower than the threshold, don't turn on the air conditioner.\r\n*/\r\nexport const adjustEnergyUsage = (\r\n outsideTemperatureRange: { high: number; low: number },\r\n heatExchange: number,\r\n setpoint: number,\r\n threshold: number,\r\n) => {\r\n if (\r\n (heatExchange < 0 && outsideTemperatureRange.low >= setpoint - threshold) ||\r\n (heatExchange > 0 && outsideTemperatureRange.high <= setpoint + threshold)\r\n ) {\r\n return 0;\r\n }\r\n // negative heat exchange goes to heater, positive heat exchange goes to air conditioner\r\n return heatExchange;\r\n};\r\n\r\n// interpolate between the lowest and highest temperatures of the day\r\n// to get the temperature of a given minute in the day\r\nexport const getOutsideTemperatureAtMinute = (\r\n hi: number,\r\n lo: number,\r\n model: DiurnalTemperatureModel,\r\n highestTemperatureTimeInMinutes: number,\r\n sunMinutes: SunMinutes,\r\n minute: number,\r\n) => {\r\n if (model === DiurnalTemperatureModel.Sinusoidal) {\r\n return 0.5 * (hi + lo) - 0.5 * (hi - lo) * Math.cos(OMEGA_DAY * (minute - (highestTemperatureTimeInMinutes - 720)));\r\n }\r\n const mean = 0.5 * (hi + lo);\r\n const ampl = 0.5 * (hi - lo);\r\n const day = sunMinutes.daylight();\r\n // day time\r\n if (minute > sunMinutes.sunrise && minute < sunMinutes.sunset) {\r\n return mean + ampl * Math.cos((Math.PI / day) * (minute - highestTemperatureTimeInMinutes));\r\n }\r\n const night = MINUTES_OF_DAY - day;\r\n const temperatureAtSunset =\r\n mean + ampl * Math.cos((Math.PI / day) * (sunMinutes.sunset - highestTemperatureTimeInMinutes));\r\n const b = 6;\r\n // after sunset\r\n if (minute > sunMinutes.sunset) {\r\n const minutesAfterSunset = minute - sunMinutes.sunset;\r\n return lo + (temperatureAtSunset - lo) * Math.exp((-b * minutesAfterSunset) / night);\r\n }\r\n // before sunrise\r\n const minutesAfterSunset = minute + 23 * 60 - sunMinutes.sunset;\r\n return lo + (temperatureAtSunset - lo) * Math.exp((-b * minutesAfterSunset) / night);\r\n};\r\n\r\n// we only know the average lowest and highest temperatures of the months. So we have to interpolate between these monthly data to get the daily data.\r\nexport const computeOutsideTemperature = (day: Date, los: number[], his: number[]) => {\r\n const currentYear = day.getFullYear();\r\n const currentMonth = day.getMonth();\r\n const dayInMonth = day.getDate();\r\n const daysOfCurrentMonth = Util.daysOfMonth(currentMonth, currentYear);\r\n const halfOfCurrentMonth = daysOfCurrentMonth / 2;\r\n\r\n // interpolate the temperatures\r\n let month1: number;\r\n let month2: number;\r\n let weight;\r\n if (dayInMonth < halfOfCurrentMonth) {\r\n // use previous month\r\n month1 = currentMonth - 1;\r\n if (month1 < 0) {\r\n month1 = 11;\r\n }\r\n month2 = currentMonth;\r\n const halfOfPreviousMonth = Util.daysOfMonth(month1, currentYear) / 2;\r\n const length = halfOfPreviousMonth + halfOfCurrentMonth;\r\n weight = (dayInMonth + halfOfPreviousMonth) / length;\r\n } else {\r\n // use next month\r\n month1 = currentMonth;\r\n month2 = currentMonth + 1;\r\n if (month2 > 11) {\r\n month2 = 0;\r\n }\r\n const halfOfNextMonth = Util.daysOfMonth(month2, currentYear) / 2;\r\n const length = halfOfCurrentMonth + halfOfNextMonth;\r\n weight = (dayInMonth - halfOfCurrentMonth) / length;\r\n }\r\n\r\n const min = los[month1] + (los[month2] - los[month1]) * weight;\r\n const max = his[month1] + (his[month2] - his[month1]) * weight;\r\n\r\n return { low: min, high: max };\r\n};\r\n\r\n// calculate the average ground temperature of a given day using the Kusuda formula:\r\n// http://soilphysics.okstate.edu/software/SoilTemperature/document.pdf\r\nexport const calculateTemperatureOnDay = (\r\n latitude: number,\r\n day: number,\r\n los: number[],\r\n his: number[],\r\n thermalDiffusivity: number,\r\n depth: number,\r\n): number => {\r\n const n = los.length;\r\n let average = 0;\r\n let hiMax = -1000,\r\n hiMin = 1000,\r\n loMax = -1000,\r\n loMin = 1000;\r\n for (let i = 0; i < n; i++) {\r\n average += his[i] + los[i];\r\n if (hiMax < his[i]) {\r\n hiMax = his[i];\r\n }\r\n if (loMax < los[i]) {\r\n loMax = los[i];\r\n }\r\n if (hiMin > his[i]) {\r\n hiMin = his[i];\r\n }\r\n if (loMin > los[i]) {\r\n loMin = los[i];\r\n }\r\n }\r\n average /= 2 * n;\r\n const amplitude = 0.25 * (hiMax - hiMin + loMax - loMin);\r\n const d2 = depth * Math.sqrt(OMEGA_YEAR / (2.0 * thermalDiffusivity));\r\n if (latitude > 0) {\r\n return average - amplitude * Math.exp(-d2) * Math.cos(OMEGA_YEAR * (day - YEARLY_LAG_IN_DAYS) - d2);\r\n }\r\n return average - amplitude * Math.exp(-d2) * Math.cos(Math.PI + OMEGA_YEAR * (day - YEARLY_LAG_IN_DAYS) - d2);\r\n};\r\n\r\nexport const getGroundTemperatureAtMinute = (\r\n latitude: number,\r\n day: number,\r\n minute: number,\r\n los: number[],\r\n his: number[],\r\n highestTemperatureTimeInMinutes: number,\r\n airTemperatureFluctuationAmplitudeOfDay: number,\r\n thermalDiffusivity: number,\r\n depth: number,\r\n): number => {\r\n return (\r\n calculateTemperatureOnDay(latitude, day, los, his, thermalDiffusivity, depth) -\r\n Math.exp(-depth * Math.sqrt(OMEGA_DAY / (2.0 * thermalDiffusivity))) *\r\n airTemperatureFluctuationAmplitudeOfDay *\r\n Math.cos(OMEGA_DAY * (minute - (highestTemperatureTimeInMinutes - 720) - DAILY_LAG_IN_MINUTES))\r\n );\r\n};\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\r\nimport { BackSide, CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from '../types';\r\nimport { Util } from '../Util';\r\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\r\nimport { getSunDirection } from '../analysis/sunTools';\r\nimport i18n from '../i18n/i18n';\r\nimport { LineData } from './LineData';\r\nimport { ParabolicCylinder } from './shapes';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useDataStore } from '../stores/commonData';\r\nimport { useSelected } from './hooks';\r\n\r\nconst ParabolicTrough = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz = 0.1,\r\n reflectance = 0.9,\r\n absorberTubeRadius = 0.05,\r\n latusRectum = 2,\r\n tiltAngle,\r\n relativeAzimuth,\r\n moduleLength,\r\n poleHeight,\r\n poleRadius,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.5,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n}: ParabolicTroughModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const sunlightDirection = useStore(Selector.sunlightDirection);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [numberOfModules, setNumberOfModules] = useState(1);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const frontSideRef = useRef();\r\n const backSideRef = useRef();\r\n const moveHandleRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const pointerDown = useRef(false);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const parabolaSegments = 16;\r\n const night = sunlightDirection.z <= 0;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = poleHeight + hx;\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = actualPoleHeight + hz + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const depth = (hx * hx) / latusRectum; // the distance from the bottom to the aperture plane\r\n const focalLength = 0.25 * latusRectum;\r\n const positionLL = new Vector3(-hx, -hy, hz + depth);\r\n const positionUL = new Vector3(-hx, hy, hz + depth);\r\n const positionLR = new Vector3(hx, -hy, hz + depth);\r\n const positionUR = new Vector3(hx, hy, hz + depth);\r\n const trough = useMemo(() => getElementById(id) as ParabolicTroughModel, [id]);\r\n\r\n useEffect(() => {\r\n if (trough && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(trough.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n setNumberOfModules(Math.max(1, Math.round(ly / moduleLength)));\r\n }, [ly, moduleLength]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (trough?.label ? trough.label : i18n.t('shared.ParabolicTroughElement', lang)) +\r\n (trough?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (trough?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [trough?.label, locked, language, cx, cy, cz]);\r\n\r\n // in model coordinate system\r\n const euler = useMemo(() => {\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = useMemo(() => getElementById(parentId)?.rotation[2], [parentId]);\r\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (sunDirection.z > 0) {\r\n return new Euler(0, Math.atan2(rotatedSunDirection.x, rotatedSunDirection.z), 0, 'ZXY');\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }, [rot, sunDirection, tiltAngle, relativeAzimuth]);\r\n\r\n // FIXME: This only works when the foundation has zero azimuth or the time is at noon\r\n const reflectedLightShift = useMemo(() => {\r\n if (sunDirection.z > 0) {\r\n const cosRot = rot ? Math.cos(rot) : 1;\r\n const sinRot = rot ? Math.sin(rot) : 0;\r\n // how much the reflected light should shift in the direction of the receiver tube?\r\n return (\r\n (-focalLength * (sunDirection.x * sinRot + sunDirection.y * cosRot)) /\r\n Math.hypot(sunDirection.x, sunDirection.z)\r\n );\r\n }\r\n return 0;\r\n }, [sunDirection, rot, focalLength]);\r\n\r\n const focusPoint = new Vector3(0, reflectedLightShift, focalLength).applyEuler(relativeEuler);\r\n const sunPoint = sunDirection.clone().multiplyScalar(sunBeamLength).applyEuler(new Euler(-euler.x, 0, -euler.z));\r\n\r\n const poleZ = -(actualPoleHeight + lz) / 2;\r\n\r\n const poles = useMemo(() => {\r\n const array: Vector3[] = [];\r\n const cosAz = Math.cos(relativeAzimuth) * moduleLength;\r\n const sinAz = Math.sin(relativeAzimuth) * moduleLength;\r\n const i2 = numberOfModules / 2 - 0.5;\r\n for (let i = 0; i < numberOfModules; i++) {\r\n array.push(new Vector3(-(i - i2) * sinAz, (i - i2) * cosAz, poleZ));\r\n }\r\n return array;\r\n }, [numberOfModules, moduleLength, poleZ, relativeAzimuth]);\r\n\r\n const moduleLines = useMemo(() => {\r\n const array: LineData[] = [];\r\n const dy = ly / numberOfModules;\r\n const t0 = -lx / latusRectum;\r\n const dt = (-2 * t0) / parabolaSegments;\r\n for (let i = 0; i <= numberOfModules; i++) {\r\n const line: Vector3[] = [];\r\n for (let j = 0; j <= parabolaSegments; j++) {\r\n const t = t0 + j * dt;\r\n line.push(new Vector3((latusRectum * t) / 2, -hy + i * dy, (latusRectum * t * t) / 4));\r\n }\r\n array.push({ points: line } as LineData);\r\n }\r\n return array;\r\n }, [lx, ly, numberOfModules, latusRectum]);\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const detailed = elements.length < 50 && moduleLines.length < 10;\r\n const radialSegmentsPole = detailed ? 4 : 2;\r\n\r\n return (\r\n \r\n \r\n {/* draw front side parabolic cylinder */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === frontSideRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.ParabolicTrough;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === frontSideRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {/* draw back side parabolic cylinder */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === backSideRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.ParabolicTrough;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === backSideRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n\r\n {moduleLines &&\r\n moduleLines.map((lineData, index) => {\r\n return (\r\n \r\n {detailed && (\r\n \r\n )}\r\n {(index === 0 || index === moduleLines.length - 1 || detailed) && (\r\n \r\n )}\r\n \r\n );\r\n })}\r\n {detailed && (\r\n \r\n )}\r\n {detailed && (\r\n \r\n )}\r\n\r\n {/* absorber tube along the focal line (focal length = latus rectum / 4) */}\r\n \r\n \r\n \r\n\r\n {/* simulation element */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* draw move handle */}\r\n {\r\n hoverHandle(e, MoveHandleType.Top);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n\r\n {/* draw resize handles */}\r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {/* draw poles */}\r\n {actualPoleHeight > 0 &&\r\n poles.map((p, i) => {\r\n if (i % 5 !== 0 && !detailed) return ;\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/* draw sun beam */}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n )}\r\n\r\n {/* draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(ParabolicTrough);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Circle, Cylinder, Line, Sphere, useTexture } from '@react-three/drei';\r\nimport { AdditiveBlending, BackSide, CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n TWO_PI,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../constants';\r\nimport {\r\n ActionType,\r\n MoveHandleType,\r\n ObjectType,\r\n ParabolicDishStructureType,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n} from '../types';\r\nimport { Util } from '../Util';\r\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\r\nimport { getSunDirection } from '../analysis/sunTools';\r\nimport i18n from '../i18n/i18n';\r\nimport { LineData } from './LineData';\r\nimport { Paraboloid } from './shapes';\r\nimport GlowImage from '../resources/glow.png';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useDataStore } from '../stores/commonData';\r\nimport { useSelected } from './hooks';\r\n\r\nconst ParabolicDish = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz = 0.1,\r\n reflectance = 0.9,\r\n structureType = ParabolicDishStructureType.CentralPole,\r\n receiverRadius = 0.25,\r\n receiverPoleRadius = 0.1,\r\n latusRectum = 2,\r\n tiltAngle,\r\n relativeAzimuth,\r\n poleHeight,\r\n poleRadius = 0.2,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.25,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n}: ParabolicDishModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const sunlightDirection = useStore(Selector.sunlightDirection);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const frontSideRef = useRef();\r\n const backSideRef = useRef();\r\n const moveHandleRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const pointerDown = useRef(false);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const radialSegments = 32;\r\n const depthSegments = 8;\r\n const night = sunlightDirection.z <= 0;\r\n\r\n const hx = lx / 2; // lx and ly both represent the diameter of the dish, so they are identical\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = poleHeight + hx;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = actualPoleHeight + hz + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const depth = (hx * hx) / latusRectum; // the distance from the bottom to the aperture plane\r\n const focalLength = 0.25 * latusRectum;\r\n const positionLL = new Vector3(-hx, -hy, hz + depth);\r\n const positionUL = new Vector3(-hx, hy, hz + depth);\r\n const positionLR = new Vector3(hx, -hy, hz + depth);\r\n const positionUR = new Vector3(hx, hy, hz + depth);\r\n const dish = useMemo(() => getElementById(id) as ParabolicDishModel, [id]);\r\n const glowTexture = useTexture(GlowImage);\r\n const haloRadius = receiverRadius + 1;\r\n\r\n useEffect(() => {\r\n if (dish && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(dish.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (dish?.label ? dish.label : i18n.t('shared.ParabolicDishElement', lang)) +\r\n (dish?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (dish?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [dish?.label, locked, language, cx, cy, cz]);\r\n\r\n // in model coordinate system\r\n const euler = useMemo(() => {\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = useMemo(() => getElementById(parentId)?.rotation[2], [parentId]);\r\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (sunDirection.z > 0) {\r\n const r = Math.hypot(rotatedSunDirection.x, rotatedSunDirection.y);\r\n return new Euler(\r\n Math.atan2(r, rotatedSunDirection.z),\r\n 0,\r\n Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI,\r\n 'ZXY',\r\n );\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }, [sunDirection, tiltAngle, relativeAzimuth]);\r\n\r\n const poleZ = -(actualPoleHeight + lz) / 2;\r\n const detailed = elements.length < 50;\r\n\r\n const wireframeLines = useMemo(() => {\r\n const array: LineData[] = [];\r\n if (detailed) {\r\n // draw rim lines\r\n const outer: Vector3[] = [];\r\n const inner: Vector3[] = [];\r\n let angle, cos, sin;\r\n const depth4 = 0.25 * depth;\r\n for (let i = 0; i <= radialSegments; i++) {\r\n angle = (TWO_PI * i) / radialSegments;\r\n cos = Math.cos(angle);\r\n sin = Math.sin(angle);\r\n outer.push(new Vector3(hx * cos, hx * sin, depth));\r\n inner.push(new Vector3((hx * cos) / 2, (hx * sin) / 2, depth4));\r\n }\r\n array.push({ points: outer } as LineData);\r\n array.push({ points: inner } as LineData);\r\n // draw radial lines\r\n for (let i = 0; i < 12; i++) {\r\n angle = (TWO_PI * i) / 12;\r\n cos = Math.cos(angle);\r\n sin = Math.sin(angle);\r\n const line: Vector3[] = [];\r\n for (let j = 0; j <= depthSegments; j++) {\r\n const dx = j === 0 ? 0 : (j / depthSegments) * hx;\r\n line.push(new Vector3(dx * cos, dx * sin, (dx * dx) / latusRectum + 0.01));\r\n }\r\n array.push({ points: line } as LineData);\r\n }\r\n }\r\n return array;\r\n }, [hx, latusRectum]);\r\n\r\n const tripodLines = useMemo(() => {\r\n if (structureType === ParabolicDishStructureType.CentralPoleWithTripod) {\r\n const array: LineData[] = [];\r\n let angle;\r\n for (let i = 0; i < 3; i++) {\r\n angle = (TWO_PI * i) / 3;\r\n const line: Vector3[] = [];\r\n line.push(new Vector3(hx * Math.cos(angle), hx * Math.sin(angle), depth));\r\n line.push(new Vector3(0, 0, focalLength));\r\n array.push({ points: line } as LineData);\r\n }\r\n return array;\r\n }\r\n return undefined;\r\n }, [hx, latusRectum, structureType]);\r\n\r\n const quadrupodLines = useMemo(() => {\r\n if (structureType === ParabolicDishStructureType.Quadrupod) {\r\n const array: LineData[] = [];\r\n let angle;\r\n for (let i = 0; i < 4; i++) {\r\n angle = (TWO_PI * i) / 4;\r\n const line: Vector3[] = [];\r\n line.push(new Vector3(hx * Math.cos(angle), hx * Math.sin(angle), depth));\r\n line.push(new Vector3(0, 0, focalLength));\r\n array.push({ points: line } as LineData);\r\n }\r\n return array;\r\n }\r\n return undefined;\r\n }, [hx, latusRectum, structureType]);\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 3;\r\n const sunPoint = sunDirection.clone().multiplyScalar(sunBeamLength);\r\n const focalPoint = new Vector3(0, 0, focalLength).applyEuler(relativeEuler);\r\n\r\n return (\r\n \r\n \r\n {/* draw front side parabolic dish */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === frontSideRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.ParabolicDish;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === frontSideRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {/* draw back side parabolic dish */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === backSideRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.ParabolicDish;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === backSideRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n\r\n {wireframeLines &&\r\n wireframeLines.length > 0 &&\r\n wireframeLines.map((lineData, index) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/* receiver at the focus (focal length = latus rectum / 4) */}\r\n \r\n \r\n \r\n {/* simple glow effect to create a halo */}\r\n {sunDirection.z > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {(structureType === ParabolicDishStructureType.CentralPole ||\r\n structureType === ParabolicDishStructureType.CentralPoleWithTripod) && (\r\n \r\n \r\n \r\n )}\r\n {structureType === ParabolicDishStructureType.CentralPoleWithTripod &&\r\n tripodLines &&\r\n tripodLines.map((lineData, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {structureType === ParabolicDishStructureType.Quadrupod &&\r\n quadrupodLines &&\r\n quadrupodLines.map((lineData, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/* simulation element */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* draw move handle */}\r\n {\r\n hoverHandle(e, MoveHandleType.Top);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n\r\n {/* draw resize handles */}\r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {/* draw poles */}\r\n {actualPoleHeight > 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw sun beam */}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n )}\r\n\r\n {/* draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(ParabolicDish);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\r\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType, SolarStructure } from '../types';\r\nimport { Util } from '../Util';\r\nimport { getSunDirection } from '../analysis/sunTools';\r\nimport i18n from '../i18n/i18n';\r\nimport { LineData } from './LineData';\r\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useDataStore } from '../stores/commonData';\r\nimport { useSelected } from './hooks';\r\n\r\nconst FresnelReflector = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz = 0.1,\r\n reflectance = 0.9,\r\n tiltAngle,\r\n relativeAzimuth,\r\n moduleLength,\r\n poleHeight,\r\n poleRadius = 0.1,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.5,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n receiverId,\r\n}: FresnelReflectorModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [numberOfModules, setNumberOfModules] = useState(1);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const baseRef = useRef();\r\n const moveHandleRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const pointerDown = useRef(false);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = poleHeight + hx;\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = actualPoleHeight + hz + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n const positionLL = new Vector3(-hx, -hy, hz);\r\n const positionUL = new Vector3(-hx, hy, hz);\r\n const positionLR = new Vector3(hx, -hy, hz);\r\n const positionUR = new Vector3(hx, hy, hz);\r\n const fresnelReflector = useMemo(() => getElementById(id) as FresnelReflectorModel, [id]);\r\n\r\n useEffect(() => {\r\n if (fresnelReflector && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(fresnelReflector.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n setNumberOfModules(Math.max(1, Math.round(ly / moduleLength)));\r\n }, [ly, moduleLength]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (fresnelReflector?.label ? fresnelReflector.label : i18n.t('shared.FresnelReflectorElement', lang)) +\r\n (fresnelReflector?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (fresnelReflector?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [fresnelReflector?.label, locked, language, cx, cy, cz]);\r\n\r\n // in model coordinate system\r\n const euler = useMemo(() => {\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = parent?.rotation[2];\r\n\r\n // TODO: how to get an updated version of the memorized receiver\r\n const receiver = receiverId && receiverId !== parentId ? getElementById(receiverId) : null;\r\n\r\n const receiverCenter = useMemo(() => {\r\n if (receiver) {\r\n if (receiver.type === ObjectType.Foundation) {\r\n const foundation = receiver as FoundationModel;\r\n if (foundation.solarStructure === SolarStructure.FocusPipe && foundation.solarAbsorberPipe) {\r\n // convert the receiver's coordinates into those relative to the center of this reflector\r\n return new Vector3(\r\n (foundation.cx - cx) * (rot ? Math.cos(rot) : 1),\r\n (foundation.cy - cy) * (rot ? Math.sin(rot) : 0),\r\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarAbsorberPipe.absorberHeight ?? 10),\r\n );\r\n }\r\n }\r\n } else {\r\n if (parent) {\r\n if (parent.type === ObjectType.Foundation) {\r\n const foundation = parent as FoundationModel;\r\n if (foundation.solarStructure === SolarStructure.FocusPipe && foundation.solarAbsorberPipe) {\r\n // convert the receiver's coordinates into those relative to the center of this reflector\r\n return new Vector3(\r\n (foundation.cx - cx) * (rot ? Math.cos(rot) : 1),\r\n (foundation.cy - cy) * (rot ? Math.sin(rot) : 0),\r\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarAbsorberPipe.absorberHeight ?? 10),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n }, [parent, cx, cy, cz, receiverId, receiver?.cx, receiver?.cy, receiver?.cz]);\r\n\r\n const shiftedReceiverCenter = useRef(new Vector3());\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (receiverCenter && sunDirection.z > 0) {\r\n // the rotation axis is in the north-south direction, so the relative azimuth is zero, which maps to (0, 1, 0)\r\n const rotationAxis = rot ? new Vector3(Math.sin(rot), Math.cos(rot), 0) : new Vector3(0, 1, 0);\r\n shiftedReceiverCenter.current.set(receiverCenter.x, receiverCenter.y, receiverCenter.z);\r\n // how much the reflected light should shift in the direction of the receiver pipe?\r\n const shift =\r\n sunDirection.z < ZERO_TOLERANCE\r\n ? 0\r\n : (-receiverCenter.z * (sunDirection.y * rotationAxis.y + sunDirection.x * rotationAxis.x)) / sunDirection.z;\r\n shiftedReceiverCenter.current.x += shift * rotationAxis.x;\r\n shiftedReceiverCenter.current.y -= shift * rotationAxis.y;\r\n const reflectorToReceiver = shiftedReceiverCenter.current.clone().normalize();\r\n let normalVector = reflectorToReceiver.add(sunDirection).normalize();\r\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\r\n normalVector = new Vector3(-0.001, 0, 1).normalize();\r\n }\r\n const sunDirectionClone = sunDirection.clone();\r\n if (rot) {\r\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\r\n sunDirectionClone.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\r\n }\r\n const delta = (sunDirectionClone.y / sunDirectionClone.z) * receiverCenter.z;\r\n shiftedReceiverCenter.current.x -= (shift - delta) * rotationAxis.x;\r\n shiftedReceiverCenter.current.y += (shift - delta) * rotationAxis.y;\r\n return new Euler(0, Math.atan2(normalVector.x, normalVector.z), 0, 'ZXY');\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }, [receiverCenter, sunDirection, tiltAngle, relativeAzimuth, rot, receiver?.cx, receiver?.cy, receiver?.cz]);\r\n\r\n const poleZ = -(actualPoleHeight + lz) / 2;\r\n\r\n const poles = useMemo(() => {\r\n const array: Vector3[] = [];\r\n const cosAz = Math.cos(relativeAzimuth) * moduleLength;\r\n const sinAz = Math.sin(relativeAzimuth) * moduleLength;\r\n const i2 = numberOfModules / 2 - 0.5;\r\n for (let i = 0; i < numberOfModules; i++) {\r\n array.push(new Vector3(-(i - i2) * sinAz, (i - i2) * cosAz, poleZ));\r\n }\r\n return array;\r\n }, [numberOfModules, moduleLength, poleZ, relativeAzimuth]);\r\n\r\n const moduleLines = useMemo(() => {\r\n const array: LineData[] = [];\r\n const dy = ly / numberOfModules;\r\n for (let i = 0; i <= numberOfModules; i++) {\r\n const line: Vector3[] = [];\r\n line.push(new Vector3(-hx, -hy + i * dy, hz));\r\n line.push(new Vector3(hx, -hy + i * dy, hz));\r\n array.push({ points: line } as LineData);\r\n }\r\n return array;\r\n }, [lx, ly, numberOfModules]);\r\n\r\n const baseSize = Math.max(1, Math.min(lx * 5, ly * 5, (lx + ly) / 16));\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n\r\n return (\r\n \r\n \r\n {/* draw the upper side of the reflector */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.FresnelReflector;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n\r\n {moduleLines &&\r\n moduleLines.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n\r\n {/* simulation element */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* draw move handle */}\r\n {\r\n hoverHandle(e, MoveHandleType.Top);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n\r\n {/* draw resize handles */}\r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {/* draw poles */}\r\n {actualPoleHeight > 0 &&\r\n poles.map((p, i) => {\r\n const radialSegments = elements.length < 100 ? 4 : 2;\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/* draw sun beam */}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n )}\r\n\r\n {/* draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(FresnelReflector);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\r\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport { HALF_PI, LOCKED_ELEMENT_SELECTION_COLOR, MOVE_HANDLE_RADIUS, UNIT_VECTOR_POS_Z } from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, SolarStructure } from '../types';\r\nimport { Util } from '../Util';\r\nimport { getSunDirection } from '../analysis/sunTools';\r\nimport i18n from '../i18n/i18n';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport { HeliostatModel } from '../models/HeliostatModel';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useDataStore } from '../stores/commonData';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Heliostat = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz = 0.1,\r\n reflectance = 0.9,\r\n tiltAngle,\r\n relativeAzimuth,\r\n poleHeight,\r\n poleRadius = Math.min(lx, ly) / 20,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.5,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n towerId,\r\n}: HeliostatModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const baseRef = useRef();\r\n const moveHandleRef = useRef();\r\n const pointerDown = useRef(false);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = poleHeight + Math.max(hx, hy);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = actualPoleHeight + hz + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n const heliostat = useMemo(() => getElementById(id) as HeliostatModel, [id]);\r\n\r\n useEffect(() => {\r\n if (heliostat && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(heliostat.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (heliostat?.label ? heliostat.label : i18n.t('shared.HeliostatElement', lang)) +\r\n (heliostat?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (heliostat?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [heliostat?.label, locked, language, cx, cy, cz]);\r\n\r\n // in model coordinate system\r\n const euler = useMemo(() => {\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n domElement.style.cursor = handle === MoveHandleType.Default ? 'move' : 'pointer';\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = parent?.rotation[2];\r\n\r\n // TODO: how to get an updated version of the memorized tower\r\n const tower = towerId && towerId !== parentId ? getElementById(towerId) : null;\r\n\r\n const receiverCenter = useMemo(() => {\r\n if (tower) {\r\n if (tower.type === ObjectType.Foundation) {\r\n const foundation = tower as FoundationModel;\r\n if (foundation.solarStructure === SolarStructure.FocusTower && foundation.solarPowerTower) {\r\n // convert the receiver's coordinates into those relative to the center of this heliostat\r\n return new Vector3(\r\n foundation.cx - cx,\r\n foundation.cy - cy,\r\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarPowerTower.towerHeight ?? 20),\r\n );\r\n }\r\n }\r\n } else {\r\n if (parent) {\r\n if (parent.type === ObjectType.Foundation) {\r\n const foundation = parent as FoundationModel;\r\n if (foundation.solarStructure === SolarStructure.FocusTower && foundation.solarPowerTower) {\r\n // convert the receiver's coordinates into those relative to the center of this heliostat\r\n return new Vector3(\r\n foundation.cx - cx,\r\n foundation.cy - cy,\r\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarPowerTower.towerHeight ?? 20),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n }, [parent, cx, cy, cz, towerId, tower?.cx, tower?.cy, tower?.cz]);\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (receiverCenter && sunDirection.z > 0) {\r\n const heliostatToReceiver = receiverCenter.clone().normalize();\r\n let normalVector = heliostatToReceiver.add(sunDirection).normalize();\r\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\r\n normalVector = new Vector3(-0.001, 0, 1).normalize();\r\n }\r\n if (rot) {\r\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\r\n }\r\n // convert the normal vector to euler\r\n const r = Math.hypot(normalVector.x, normalVector.y);\r\n return new Euler(Math.atan2(r, normalVector.z), 0, Math.atan2(normalVector.y, normalVector.x) + HALF_PI, 'ZXY');\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }, [receiverCenter, sunDirection, tiltAngle, relativeAzimuth, rot, tower?.cx, tower?.cy, tower?.cz]);\r\n\r\n const poleZ = -(actualPoleHeight + lz) / 2;\r\n const baseSize = Math.max(1, (lx + ly) / 8);\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 4;\r\n\r\n return (\r\n \r\n \r\n {/* draw the upper side of the heliostat */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Heliostat;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n\r\n {/* simulation element */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move handle */}\r\n {selected && !locked && (\r\n {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n\r\n {/* draw poles */}\r\n {actualPoleHeight > 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw sun beam */}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n )}\r\n\r\n {/* draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Heliostat);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cone, Cylinder, Line, Plane, Ring, Sphere } from '@react-three/drei';\r\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n SOLAR_PANEL_BLACK_SPECULAR,\r\n SOLAR_PANEL_BLUE_SPECULAR,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport {\r\n ActionType,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n TrackerType,\r\n} from '../../types';\r\nimport { Util } from '../../Util';\r\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\r\nimport { getSunDirection } from '../../analysis/sunTools';\r\nimport RotateHandle from '../../components/rotateHandle';\r\nimport { UndoableChange } from '../../undo/UndoableChange';\r\nimport i18n from '../../i18n/i18n';\r\nimport { LineData } from '../LineData';\r\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { PvModel } from 'src/models/PvModel';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst SolarPanel = ({\r\n id,\r\n pvModelName = 'SPR-X21-335-BLK',\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n tiltAngle,\r\n relativeAzimuth,\r\n trackerType = TrackerType.NO_TRACKER,\r\n poleHeight,\r\n poleRadius,\r\n poleSpacing,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.1,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n orientation = Orientation.landscape,\r\n}: SolarPanelModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const rotateHandleType = useStore(Selector.rotateHandleType);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const pvModules = useStore(Selector.pvModules);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n camera,\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [faceUp, setFaceUp] = useState();\r\n const baseRef = useRef();\r\n const moveHandleRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const tiltHandleRef = useRef();\r\n const pointerDown = useRef(false);\r\n const oldTiltAngleRef = useRef(0);\r\n const newTiltAngleRef = useRef(0);\r\n const solarPanelLinesRef = useRef();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const panelNormal = new Vector3().fromArray(normal);\r\n const pvModel = pvModules[pvModelName] as PvModel;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = poleHeight + lz / 2 + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n case ObjectType.Cuboid:\r\n const { pos, rot } = Util.getWorldDataById(parent.id);\r\n if (Util.isZero(rotation[2])) {\r\n cx = pos.x + cx * parent.lx;\r\n cy = pos.y + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, cz * parent.lz);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = pos.x + v.x;\r\n cy = pos.y + v.y;\r\n }\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Z)) {\r\n cz = poleHeight + lz / 2 + parent.lz;\r\n } else {\r\n cz = pos.z + cz * parent.lz;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (pvModel) {\r\n lz = Math.max(pvModel.thickness, 0.02);\r\n }\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const positionLL = new Vector3(-hx, -hy, hz);\r\n const positionUL = new Vector3(-hx, hy, hz);\r\n const positionLR = new Vector3(hx, -hy, hz);\r\n const positionUR = new Vector3(hx, hy, hz);\r\n const radialSegmentsPole = elements.length < 100 ? 4 : 2;\r\n const solarPanel = getElementById(id) as SolarPanelModel;\r\n\r\n useEffect(() => {\r\n if (pvModel) {\r\n let mx, my;\r\n if (orientation === Orientation.portrait) {\r\n mx = Math.max(1, Math.round(lx / pvModel.width));\r\n my = Math.max(1, Math.round(ly / pvModel.length));\r\n } else {\r\n mx = Math.max(1, Math.round(lx / pvModel.length));\r\n my = Math.max(1, Math.round(ly / pvModel.width));\r\n }\r\n solarPanelLinesRef.current = [];\r\n const dx = lx / mx;\r\n const dy = ly / my;\r\n for (let i = 0; i <= mx; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\r\n } as LineData);\r\n }\r\n for (let i = 0; i <= my; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\r\n } as LineData);\r\n }\r\n }\r\n }, [orientation, pvModelName, lx, ly, lz]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n setShowTiltAngle(false);\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n setFaceUp(Util.isSame(panelNormal, UNIT_VECTOR_POS_Z));\r\n }, [normal]);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (solarPanel?.label ? solarPanel.label : i18n.t('shared.SolarPanelElement', lang)) +\r\n (solarPanel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (solarPanel?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [solarPanel?.label, locked, language, cx, cy, cz]);\r\n\r\n const euler = useMemo(() => {\r\n // east face in model coordinate system\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_X)) {\r\n return new Euler(HALF_PI, 0, rotation[2] + HALF_PI, 'ZXY');\r\n }\r\n // west face in model coordinate system\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_NEG_X)) {\r\n return new Euler(HALF_PI, 0, rotation[2] - HALF_PI, 'ZXY');\r\n }\r\n // north face in the model coordinate system\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Y)) {\r\n return new Euler(HALF_PI, 0, rotation[2] + Math.PI, 'ZXY');\r\n }\r\n // south face in the model coordinate system\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_NEG_Y)) {\r\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // top face in model coordinate system\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [normal, rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = getElementById(parentId)?.rotation[2];\r\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Z)) {\r\n if (sunDirection.z > 0) {\r\n switch (trackerType) {\r\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\r\n const r = Math.hypot(rotatedSunDirection.x, rotatedSunDirection.y);\r\n return new Euler(\r\n Math.atan2(r, rotatedSunDirection.z),\r\n 0,\r\n Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI,\r\n 'ZXY',\r\n );\r\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\r\n return new Euler(0, Math.atan2(rotatedSunDirection.x, rotatedSunDirection.z), lx < ly ? 0 : HALF_PI, 'XYZ');\r\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\r\n return new Euler(tiltAngle, 0, Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI, 'ZXY');\r\n }\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }\r\n return new Euler();\r\n }, [trackerType, sunDirection, tiltAngle, relativeAzimuth, normal]);\r\n\r\n const normalVector = useMemo(() => {\r\n const v = new Vector3();\r\n return drawSunBeam\r\n ? v\r\n .fromArray(normal)\r\n .applyEuler(\r\n new Euler(\r\n relativeEuler.x,\r\n relativeEuler.y,\r\n relativeEuler.z + rotation[2] + (lx < ly ? 0 : HALF_PI),\r\n lx < ly ? 'ZXY' : 'XYZ',\r\n ),\r\n )\r\n : v;\r\n }, [drawSunBeam, normal, euler, relativeEuler]);\r\n\r\n const poleZ = -poleHeight / 2 - lz / 2;\r\n\r\n const poles = useMemo(() => {\r\n const poleArray: Vector3[] = [];\r\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\r\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\r\n const sinTilt = 0.5 * Math.sin(tiltAngle);\r\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\r\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\r\n for (let ix = -poleNx; ix <= poleNx; ix++) {\r\n for (let iy = -poleNy; iy <= poleNy; iy++) {\r\n const xi = ix * cosAz - iy * sinAz;\r\n const yi = ix * sinAz + iy * cosAz;\r\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\r\n }\r\n }\r\n return poleArray;\r\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleZ]);\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const rotateHandleSize = (baseSize * 2) / 3;\r\n const tiltHandleSize = rotateHandleSize;\r\n\r\n const degree = new Array(13).fill(0);\r\n const [showTiltAngle, setShowTiltAngle] = useState(false);\r\n\r\n const texture = useSolarPanelTexture(\r\n lx,\r\n ly,\r\n pvModel,\r\n orientation,\r\n solarPanel?.frameColor,\r\n solarPanel?.backsheetColor,\r\n );\r\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\r\n\r\n const renderTopTextureMaterial = () => {\r\n if (showSolarRadiationHeatmap && heatmapTexture) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n if (orthographic || solarPanelShininess === 0) {\r\n return ;\r\n }\r\n return (\r\n \r\n );\r\n };\r\n\r\n const renderBotTextureMaterial = () => {\r\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n return (\r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {/* draw panel */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.SolarPanel;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {renderTopTextureMaterial()}\r\n {renderBotTextureMaterial()}\r\n \r\n\r\n {showSolarRadiationHeatmap &&\r\n heatmapTexture &&\r\n solarPanelLinesRef.current &&\r\n solarPanelLinesRef.current.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/* simulation panel */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* draw move handle */}\r\n {\r\n hoverHandle(e, MoveHandleType.Top);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n\r\n {/* draw resize handles */}\r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/*{!selected && }*/}\r\n \r\n\r\n {/* draw rotate handles */}\r\n {selected && !locked && trackerType === TrackerType.NO_TRACKER && faceUp && (\r\n \r\n {/* rotate handles */}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw tilt handles */}\r\n {selected && !locked && trackerType === TrackerType.NO_TRACKER && faceUp && Math.abs(poleHeight) > 0.1 && (\r\n <>\r\n {/* ring handles */}\r\n {\r\n hoverHandle(e, RotateHandleType.Tilt);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n setShowTiltAngle(true);\r\n if (hoveredHandle) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n pointerDown.current = true;\r\n const sp = getElementById(id) as SolarPanelModel;\r\n oldTiltAngleRef.current = sp.tiltAngle;\r\n }\r\n setCommonStore((state) => {\r\n state.rotateHandleType = RotateHandleType.Tilt;\r\n });\r\n }}\r\n >\r\n \r\n \r\n {showTiltAngle && (\r\n <>\r\n {/* intersection plane */}\r\n {}}\r\n onPointerUp={(e) => {\r\n if (Math.abs(newTiltAngleRef.current - oldTiltAngleRef.current) > ZERO_TOLERANCE) {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltAngleRef.current,\r\n newValue: newTiltAngleRef.current,\r\n changedElementId: id,\r\n changedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n updateSolarPanelTiltAngleById(\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n updateSolarPanelTiltAngleById(\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n }\r\n }}\r\n onPointerMove={(e) => {\r\n if (pointerDown.current) {\r\n const mouse = new Vector2();\r\n mouse.x = (e.offsetX / domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n if (tiltHandleRef.current) {\r\n const intersects = ray.intersectObjects([tiltHandleRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point;\r\n const parent = tiltHandleRef.current.parent;\r\n if (parent) {\r\n const ov = parent.position; // rotate point in world coordinate\r\n const cv = new Vector3().subVectors(p, ov);\r\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\r\n const touch = 0.5 * solarPanel.ly * Math.abs(Math.sin(angle)) > solarPanel.poleHeight;\r\n if (!touch) {\r\n const wr = relativeAzimuth + rotation[2];\r\n const sign =\r\n wr % Math.PI === 0\r\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\r\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\r\n angle *= sign;\r\n updateSolarPanelTiltAngleById(id, angle);\r\n newTiltAngleRef.current = angle;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n >\r\n \r\n \r\n {/* pointer */}\r\n \r\n {/* scale */}\r\n {degree.map((e, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {/* show current degree */}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* draw poles */}\r\n {poleHeight > 0 &&\r\n faceUp &&\r\n poles.map((p, i) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/*draw sun beam*/}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/*draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(SolarPanel);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DoubleSide, Group, Mesh, RepeatWrapping, TextureLoader, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\r\nimport { Billboard, Line, Plane, Sphere } from '@react-three/drei';\r\nimport {\r\n DEFAULT_LEAF_OFF_DAY,\r\n DEFAULT_LEAF_OUT_DAY,\r\n GROUND_ID,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_COLOR_1,\r\n MOVE_HANDLE_RADIUS,\r\n} from '../constants';\r\nimport { ActionType, FlowerType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from '../types';\r\nimport i18n from '../i18n/i18n';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { Util } from '../Util';\r\nimport { FlowerModel } from '../models/FlowerModel';\r\nimport { FlowerData } from '../FlowerData';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Flower = ({\r\n parentId,\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n name = FlowerType.WhiteFlower,\r\n flip = false,\r\n locked = false,\r\n}: FlowerModel) => {\r\n let isRender = false;\r\n useStore((state) => {\r\n if (parentId === GROUND_ID) {\r\n isRender = true;\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n isRender = true;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n const removeElementById = useStore(Selector.removeElementById);\r\n useEffect(() => {\r\n if (!isRender) {\r\n removeElementById(id, false);\r\n }\r\n }, [isRender]);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const leafDayOfYear1 = useStore(Selector.world.leafDayOfYear1) ?? DEFAULT_LEAF_OUT_DAY;\r\n const leafDayOfYear2 = useStore(Selector.world.leafDayOfYear2) ?? DEFAULT_LEAF_OFF_DAY;\r\n const selectMe = useStore(Selector.selectMe);\r\n const getElementById = useStore(Selector.getElementById);\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const { gl } = useThree();\r\n const selected = useSelected(id);\r\n\r\n const contentRef = useRefStore((state) => state.contentRef);\r\n const groupRef = useRef(null);\r\n const flowerRef = useRef(null);\r\n const interactionMeshRef = useRef(null);\r\n const interactionPlaneRef = useRef(null);\r\n\r\n const flowerModel = useMemo(() => getElementById(id) as FlowerModel, [id]);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const noLeaves = useMemo(() => {\r\n const dayOfYear = Util.dayOfYear(new Date(date));\r\n return latitude > 0\r\n ? dayOfYear < leafDayOfYear1 || dayOfYear > leafDayOfYear2\r\n : dayOfYear >= leafDayOfYear1 && dayOfYear <= leafDayOfYear2;\r\n }, [date, leafDayOfYear1, leafDayOfYear2, latitude]);\r\n\r\n const fileChangedRef = useRef(false);\r\n const fileChangedState = useStore(Selector.fileChanged);\r\n\r\n if (fileChangedState !== fileChangedRef.current) {\r\n fileChangedRef.current = fileChangedState;\r\n if (contentRef?.current && groupRef.current) {\r\n contentRef.current.add(groupRef.current);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (parentId !== GROUND_ID) {\r\n const obj = getParentObject();\r\n if (obj && groupRef.current) {\r\n obj.add(groupRef.current);\r\n }\r\n }\r\n }, [fileChangedState]);\r\n\r\n // attach parent dom element if parent is not Ground\r\n useEffect(() => {\r\n const parentObject = getParentObject();\r\n if (parentObject && groupRef.current) {\r\n parentObject.add(groupRef.current);\r\n }\r\n }, [contentRef]);\r\n\r\n const textureLoader = useMemo(() => {\r\n return new TextureLoader().load(FlowerData.fetchTextureImage(name, noLeaves), (texture) => {\r\n if (flip) {\r\n texture.wrapS = RepeatWrapping;\r\n texture.repeat.x = -1;\r\n }\r\n setTexture(texture);\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }, [name, noLeaves, flip]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n FlowerData.fetchLabel(name, lang) +\r\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang)\r\n );\r\n }, [name, cx, cy, locked, language]);\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n state.selectedElementHeight = flowerModel.lz;\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n gl.domElement.style.cursor = 'move';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'default';\r\n }, []);\r\n\r\n // return null if parent is Ground\r\n const getParentObject = () => {\r\n if (parentId !== GROUND_ID && contentRef?.current) {\r\n return Util.getObjectChildById(contentRef.current, parentId);\r\n }\r\n return null;\r\n };\r\n\r\n const width = useMemo(() => {\r\n return FlowerData.fetchSpread(name);\r\n }, [name]);\r\n\r\n const height = useMemo(() => {\r\n return FlowerData.fetchHeight(name);\r\n }, [name]);\r\n\r\n useFrame(({ camera }) => {\r\n // rotation\r\n if (groupRef.current) {\r\n const { rot: parentWorldRotation } = Util.getWorldDataById(parentId);\r\n\r\n if (!orthographic) {\r\n if (flowerRef.current && interactionPlaneRef.current) {\r\n const { x: cameraX, y: cameraY } = camera.position;\r\n const { x: currX, y: currY } = groupRef.current.position;\r\n const parentObject = getParentObject();\r\n if (parentObject) {\r\n const worldPosition = groupRef.current.localToWorld(new Vector3());\r\n const e = Math.atan2(cameraX - worldPosition.x, cameraY - worldPosition.y) + parentWorldRotation;\r\n flowerRef.current.rotation.set(HALF_PI, -e, 0);\r\n interactionPlaneRef.current.rotation.set(-HALF_PI, e, 0);\r\n } else {\r\n const e = Math.atan2(cameraX - currX, cameraY - currY);\r\n flowerRef.current.rotation.set(HALF_PI, -e, 0);\r\n interactionPlaneRef.current.rotation.set(-HALF_PI, e, 0);\r\n }\r\n }\r\n groupRef.current.rotation.set(0, 0, 0);\r\n } else {\r\n if (flowerRef.current && interactionPlaneRef.current) {\r\n flowerRef.current.rotation.set(HALF_PI, 0, 0);\r\n interactionPlaneRef.current.rotation.set(0, 0, 0);\r\n }\r\n groupRef.current.rotation.set(-HALF_PI, 0, 0);\r\n }\r\n }\r\n });\r\n\r\n const handleSize = MOVE_HANDLE_RADIUS * 3;\r\n\r\n return (\r\n <>\r\n {isRender ? (\r\n // in orthographic mode, we need to lift it up a bit so that it can be more easily picked\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* billboard for interactions (don't use a plane as it may become unselected at some angle) */}\r\n \r\n {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === interactionMeshRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Flower;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.flowerRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === interactionMeshRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n }}\r\n />\r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* draw handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* move handle */}\r\n {\r\n if (e.button !== 2 && e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.flowerRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n \r\n )}\r\n {hovered && !selected && (\r\n \r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Flower);\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Button, Space } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst Container = styled.div`\n position: absolute;\n left: calc(100vw / 2 - 50px);\n width: 100px;\n bottom: 6px;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 10000; // must be larger than that of the spinner so that this can be clicked\n`;\n\nconst SimulationControlPanel = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const simulationPaused = usePrimitiveStore(Selector.simulationPaused);\n const showDesignInfoPanel = useStore(Selector.viewState.showDesignInfoPanel);\n\n const lang = { lng: language };\n\n const cancel = () => {\n usePrimitiveStore.setState((state) => {\n state.runDailyThermalSimulation = false;\n state.runYearlyThermalSimulation = false;\n state.pauseDailyThermalSimulation = false;\n state.pauseYearlyThermalSimulation = false;\n\n state.runStaticSimulation = false;\n state.runDynamicSimulation = false;\n state.pauseSimulation = false;\n\n state.runDailyLightSensor = false;\n state.runYearlyLightSensor = false;\n state.pauseDailyLightSensor = false;\n state.pauseYearlyLightSensor = false;\n\n state.runDailySimulationForSolarPanels = false;\n state.runYearlySimulationForSolarPanels = false;\n state.pauseDailySimulationForSolarPanels = false;\n state.pauseYearlySimulationForSolarPanels = false;\n\n state.runDailySimulationForParabolicTroughs = false;\n state.runYearlySimulationForParabolicTroughs = false;\n state.pauseDailySimulationForParabolicTroughs = false;\n state.pauseYearlySimulationForParabolicTroughs = false;\n\n state.runDailySimulationForParabolicDishes = false;\n state.runYearlySimulationForParabolicDishes = false;\n state.pauseDailySimulationForParabolicDishes = false;\n state.pauseYearlySimulationForParabolicDishes = false;\n\n state.runDailySimulationForFresnelReflectors = false;\n state.runYearlySimulationForFresnelReflectors = false;\n state.pauseDailySimulationForFresnelReflectors = false;\n state.pauseYearlySimulationForFresnelReflectors = false;\n\n state.runDailySimulationForHeliostats = false;\n state.runYearlySimulationForHeliostats = false;\n state.pauseDailySimulationForHeliostats = false;\n state.pauseYearlySimulationForHeliostats = false;\n });\n\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Cancel Simulation',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const pause = () => {\n usePrimitiveStore.setState((state) => {\n if (state.runDailyThermalSimulation) {\n state.pauseDailyThermalSimulation = true;\n }\n if (state.runYearlyThermalSimulation) {\n state.pauseYearlyThermalSimulation = true;\n }\n\n if (state.runDynamicSimulation) {\n state.pauseSimulation = true;\n }\n\n if (state.runDailyLightSensor) {\n state.pauseDailyLightSensor = true;\n }\n if (state.runYearlyLightSensor) {\n state.pauseYearlyLightSensor = true;\n }\n\n if (state.runDailySimulationForSolarPanels) {\n state.pauseDailySimulationForSolarPanels = true;\n }\n if (state.runYearlySimulationForSolarPanels) {\n state.pauseYearlySimulationForSolarPanels = true;\n }\n\n if (state.runDailySimulationForParabolicTroughs) {\n state.pauseDailySimulationForParabolicTroughs = true;\n }\n if (state.runYearlySimulationForParabolicTroughs) {\n state.pauseYearlySimulationForParabolicTroughs = true;\n }\n\n if (state.runDailySimulationForParabolicDishes) {\n state.pauseDailySimulationForParabolicDishes = true;\n }\n if (state.runYearlySimulationForParabolicDishes) {\n state.pauseYearlySimulationForParabolicDishes = true;\n }\n\n if (state.runDailySimulationForFresnelReflectors) {\n state.pauseDailySimulationForFresnelReflectors = true;\n }\n if (state.runYearlySimulationForFresnelReflectors) {\n state.pauseYearlySimulationForFresnelReflectors = true;\n }\n\n if (state.runDailySimulationForHeliostats) {\n state.pauseDailySimulationForHeliostats = true;\n }\n if (state.runYearlySimulationForHeliostats) {\n state.pauseYearlySimulationForHeliostats = true;\n }\n });\n\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Pause Simulation',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const resume = () => {\n usePrimitiveStore.setState((state) => {\n if (state.runDailyThermalSimulation) {\n state.pauseDailyThermalSimulation = false;\n }\n if (state.runYearlyThermalSimulation) {\n state.pauseYearlyThermalSimulation = false;\n }\n\n if (state.runDynamicSimulation) {\n state.pauseSimulation = false;\n }\n\n if (state.runDailyLightSensor) {\n state.pauseDailyLightSensor = false;\n }\n if (state.runYearlyLightSensor) {\n state.pauseYearlyLightSensor = false;\n }\n\n if (state.runDailySimulationForSolarPanels) {\n state.pauseDailySimulationForSolarPanels = false;\n }\n if (state.runYearlySimulationForSolarPanels) {\n state.pauseYearlySimulationForSolarPanels = false;\n }\n\n if (state.runDailySimulationForParabolicTroughs) {\n state.pauseDailySimulationForParabolicTroughs = false;\n }\n if (state.runYearlySimulationForParabolicTroughs) {\n state.pauseYearlySimulationForParabolicTroughs = false;\n }\n\n if (state.runDailySimulationForParabolicDishes) {\n state.pauseDailySimulationForParabolicDishes = false;\n }\n if (state.runYearlySimulationForParabolicDishes) {\n state.pauseYearlySimulationForParabolicDishes = false;\n }\n\n if (state.runDailySimulationForFresnelReflectors) {\n state.pauseDailySimulationForFresnelReflectors = false;\n }\n if (state.runYearlySimulationForFresnelReflectors) {\n state.pauseYearlySimulationForFresnelReflectors = false;\n }\n\n if (state.runDailySimulationForHeliostats) {\n state.pauseDailySimulationForHeliostats = false;\n }\n if (state.runYearlySimulationForHeliostats) {\n state.pauseYearlySimulationForHeliostats = false;\n }\n });\n\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Resume Simulation',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n return (\n \n \n \n {!simulationPaused && (\n \n )}\n {simulationPaused && (\n \n )}\n \n \n );\n};\n\nexport default React.memo(SimulationControlPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Button, Space } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst Container = styled.div`\n position: absolute;\n left: calc(100vw / 2 - 50px);\n width: 100px;\n bottom: 6px;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 10000; // must be larger than that of the spinner so that this can be clicked\n`;\n\nconst EvolutionControlPanel = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const evolutionPaused = usePrimitiveStore(Selector.evolutionPaused);\n const showDesignInfoPanel = useStore(Selector.viewState.showDesignInfoPanel);\n\n const lang = { lng: language };\n\n const cancel = () => {\n usePrimitiveStore.setState((state) => {\n state.runStaticSimulation = false;\n state.pauseSimulation = false;\n state.runEvolution = false;\n state.pauseEvolution = false;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Cancel Evolution',\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const pause = () => {\n usePrimitiveStore.setState((state) => {\n state.pauseSimulation = true;\n if (state.runEvolution) {\n state.pauseEvolution = true;\n }\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Pause Evolution',\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const resume = () => {\n usePrimitiveStore.setState((state) => {\n state.pauseSimulation = false;\n if (state.runEvolution) {\n state.pauseEvolution = false;\n }\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Resume Evolution',\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n return (\n \n \n \n {!evolutionPaused && (\n \n )}\n {evolutionPaused && (\n \n )}\n \n \n );\n};\n\nexport default React.memo(EvolutionControlPanel);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Spin } from 'antd';\nimport styled from 'styled-components';\n\nexport default styled(Spin)`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.5);\n z-index: 9999;\n`;\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n *\r\n */\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { Util } from './Util';\r\nimport SimulationControlPanel from './panels/simulationControlPanel';\r\nimport EvolutionControlPanel from './panels/evolutionControlPanel';\r\nimport Spinner from './components/spinner';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\n\r\nexport default React.memo(function Waiting({ initializing }: { initializing: boolean }) {\r\n const waiting = usePrimitiveStore(Selector.waiting);\r\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\r\n const evolutionInProgress = usePrimitiveStore(Selector.evolutionInProgress);\r\n const simulationPaused = usePrimitiveStore(Selector.simulationPaused);\r\n const evolutionPaused = usePrimitiveStore(Selector.evolutionPaused);\r\n const noAnimationForSensorDataCollection = useStore(Selector.world.noAnimationForSensorDataCollection);\r\n const noAnimationForSolarPanelSimulation = useStore(Selector.world.noAnimationForSolarPanelSimulation);\r\n const noAnimationForHeatmapSimulation = useStore(Selector.world.noAnimationForHeatmapSimulation);\r\n const noAnimationForSolarUpdraftTowerSimulation = useStore(Selector.world.noAnimationForSolarUpdraftTowerSimulation);\r\n const noAnimationForThermalSimulation = useStore(Selector.world.noAnimationForThermalSimulation);\r\n const runDailySimulationForSolarPanels = usePrimitiveStore(Selector.runDailySimulationForSolarPanels);\r\n const runYearlySimulationForSolarPanels = usePrimitiveStore(Selector.runYearlySimulationForSolarPanels);\r\n const runDailyLightSensor = usePrimitiveStore(Selector.runDailyLightSensor);\r\n const runYearlyLightSensor = usePrimitiveStore(Selector.runYearlyLightSensor);\r\n const runDailySimulationForUpdraftTower = usePrimitiveStore(Selector.runDailySimulationForUpdraftTower);\r\n const runYearlySimulationForUpdraftTower = usePrimitiveStore(Selector.runYearlySimulationForUpdraftTower);\r\n const runDynamicSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\r\n const runDailyThermalSimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\r\n const runYearlyThermalSimulation = usePrimitiveStore(Selector.runYearlyThermalSimulation);\r\n\r\n const elements = useStore.getState().elements;\r\n\r\n return (\r\n <>\r\n {(initializing || waiting || simulationInProgress || evolutionInProgress) && (\r\n <>\r\n {simulationInProgress &&\r\n ((!noAnimationForHeatmapSimulation && runDynamicSimulation) ||\r\n (!noAnimationForThermalSimulation && (runDailyThermalSimulation || runYearlyThermalSimulation)) ||\r\n (!noAnimationForSensorDataCollection && (runDailyLightSensor || runYearlyLightSensor)) ||\r\n (!noAnimationForSolarUpdraftTowerSimulation &&\r\n (runDailySimulationForUpdraftTower || runYearlySimulationForUpdraftTower)) ||\r\n (!noAnimationForSolarPanelSimulation &&\r\n (runDailySimulationForSolarPanels || runYearlySimulationForSolarPanels)) ||\r\n Util.hasMovingParts(elements)) && }\r\n {evolutionInProgress && }\r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n\r\nexport const EndWaiting = () => {\r\n const waiting = usePrimitiveStore.getState().waiting;\r\n if (!waiting) return null;\r\n\r\n const End = () => {\r\n useEffect(() => {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = false;\r\n });\r\n return () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = false;\r\n });\r\n };\r\n });\r\n return null;\r\n };\r\n\r\n return ;\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { ObjectType } from './types';\r\nimport { FoundationModel } from './models/FoundationModel';\r\nimport Foundation from './views/foundation/foundation';\r\nimport { SensorModel } from './models/SensorModel';\r\nimport Sensor from './views/sensor';\r\nimport { CuboidModel } from './models/CuboidModel';\r\nimport { HumanModel } from './models/HumanModel';\r\nimport Human from './views/human';\r\nimport { TreeModel } from './models/TreeModel';\r\nimport Tree from './views/tree';\r\nimport { SolarPanelModel } from './models/SolarPanelModel';\r\nimport Polygon from './views/polygon';\r\nimport { PolygonModel } from './models/PolygonModel';\r\nimport { Group } from 'three';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport ParabolicTrough from './views/parabolicTrough';\r\nimport { ParabolicTroughModel } from './models/ParabolicTroughModel';\r\nimport ParabolicDish from './views/parabolicDish';\r\nimport { ParabolicDishModel } from './models/ParabolicDishModel';\r\nimport FresnelReflector from './views/fresnelReflector';\r\nimport { FresnelReflectorModel } from './models/FresnelReflectorModel';\r\nimport Heliostat from './views/heliostat';\r\nimport { HeliostatModel } from './models/HeliostatModel';\r\nimport SolarPanel from './views/solarPanel/solarPanel';\r\nimport Flower from './views/flower';\r\nimport { FlowerModel } from './models/FlowerModel';\r\nimport Light from './views/light';\r\nimport { LightModel } from './models/LightModel';\r\nimport CuboidRenderer from './views/cuboid';\r\nimport { GROUND_ID } from './constants';\r\nimport { EndWaiting } from './waiting';\r\n\r\nconst ElementsRenderer: React.FC = () => {\r\n const elements = useStore(Selector.elements);\r\n\r\n const groupRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (groupRef) {\r\n useRefStore.setState((state) => {\r\n state.contentRef = groupRef;\r\n });\r\n }\r\n }, []);\r\n\r\n // console.log(groupRef);\r\n // console.log(elements);\r\n console.debug(elements);\r\n\r\n return (\r\n \r\n {elements.map((e) => {\r\n switch (e.type) {\r\n case ObjectType.Foundation:\r\n return ;\r\n case ObjectType.Sensor: {\r\n const sensor = e as SensorModel;\r\n if (sensor.parentType === ObjectType.Cuboid) {\r\n return null;\r\n }\r\n return ;\r\n }\r\n case ObjectType.Light: {\r\n const light = e as LightModel;\r\n if (light.parentType === ObjectType.Cuboid) {\r\n return null;\r\n }\r\n return ;\r\n }\r\n case ObjectType.Cuboid:\r\n // only base cuboid will be rendered here\r\n if (e.parentId !== GROUND_ID) return null;\r\n return ;\r\n case ObjectType.Human:\r\n return ;\r\n case ObjectType.Tree:\r\n return ;\r\n case ObjectType.Flower:\r\n return ;\r\n case ObjectType.SolarPanel:\r\n switch ((e as SolarPanelModel).parentType) {\r\n case ObjectType.Roof:\r\n case ObjectType.Wall:\r\n case ObjectType.Cuboid:\r\n return null;\r\n default:\r\n return ;\r\n }\r\n case ObjectType.ParabolicDish:\r\n return ;\r\n case ObjectType.ParabolicTrough:\r\n return ;\r\n case ObjectType.FresnelReflector:\r\n return ;\r\n case ObjectType.Heliostat:\r\n return ;\r\n case ObjectType.Polygon:\r\n switch ((e as PolygonModel).parentType) {\r\n case ObjectType.Wall:\r\n return null;\r\n default:\r\n return ;\r\n }\r\n default:\r\n if (e.id) return ;\r\n }\r\n return null;\r\n })}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Couldn't find a good way to clear this set to avoid memory leak.\r\n// This roof id set is used in all walls which shape needs to be changed by the deletion of the roof.\r\n// So fter all the walls have used it their useEffect hooks, then we can clear it.\r\n// And here is the last hook get called due to React hooks mechanism.\r\nconst ClearDeletedRoofIdSet = () => {\r\n const deletedRoofIdSet = useStore(Selector.deletedRoofIdSet);\r\n useEffect(() => {\r\n useStore.getState().set((state) => {\r\n state.deletedRoofIdSet.clear();\r\n });\r\n }, [deletedRoofIdSet]);\r\n return null;\r\n};\r\n\r\nexport default React.memo(ElementsRenderer);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { RefObject, useEffect, useMemo, useRef } from 'react';\r\nimport { CommonStoreState, useStore } from '../stores/common';\r\nimport { useRefStore } from '../stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { Plane } from '@react-three/drei';\r\nimport { DoubleSide, Euler, Group, Intersection, Mesh, Object3D, Raycaster, Vector2, Vector3 } from 'three';\r\nimport {\r\n IntersectionPlaneType,\r\n MoveHandleType,\r\n ObjectType,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n WallAbsPos,\r\n} from '../types';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n GROUND_ID,\r\n HALF_PI,\r\n MOVE_HANDLE_RADIUS,\r\n ORIGIN_VECTOR2,\r\n TWO_PI,\r\n UNIT_VECTOR_POS_Z,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n ZERO_TOLERANCE,\r\n} from '../constants';\r\nimport { Util } from '../Util';\r\nimport { UndoableMove, UndoableMoveFoundationGroup } from '../undo/UndoableMove';\r\nimport { UndoableResize } from '../undo/UndoableResize';\r\nimport { UndoableRotate } from '../undo/UndoableRotate';\r\nimport { UndoableAdd } from '../undo/UndoableAdd';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { PolygonModel } from '../models/PolygonModel';\r\nimport { Point2 } from '../models/Point2';\r\nimport { TreeModel } from '../models/TreeModel';\r\nimport { UndoableChange } from '../undo/UndoableChange';\r\nimport { showError } from '../helpers';\r\nimport i18n from '../i18n/i18n';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { InnerCommonStoreState } from 'src/stores/InnerCommonState';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { GroupableModel, isGroupable } from 'src/models/Groupable';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\n\r\nconst Ground = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const getChildren = useStore(Selector.getChildren);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const setElementRotation = useStore(Selector.updateElementRotationById);\r\n const addElement = useStore(Selector.addElement);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLzById = useStore(Selector.updateElementLzById);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const getCameraDirection = useStore(Selector.getCameraDirection);\r\n const getResizeHandlePosition = useStore(Selector.getResizeHandlePosition);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const updateSceneRadius = useStore(Selector.updateSceneRadius);\r\n\r\n const language = useStore(Selector.language);\r\n const objectTypeToAdd = useStore(Selector.objectTypeToAdd);\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const rotateHandleType = useStore(Selector.rotateHandleType);\r\n const resizeAnchor = useStore(Selector.resizeAnchor);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const groundColor = useStore(Selector.viewState.groundColor);\r\n const waterSurface = useStore(Selector.viewState.waterSurface);\r\n const groundModel = useStore((state) => state.world.ground);\r\n const deletedFoundationId = useStore(Selector.deletedFoundationId);\r\n const deletedCuboidId = useStore(Selector.deletedCuboidId);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n\r\n const { get: getThree, scene, invalidate } = useThree();\r\n const groundPlaneRef = useRef();\r\n const intersectionPlaneRef = useRef();\r\n const grabRef = useRef(null);\r\n const oldPositionRef = useRef(new Vector3());\r\n const newPositionRef = useRef(new Vector3());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const oldPolygonVerticesMapRef = useRef>(new Map());\r\n const newPolygonVerticesMapRef = useRef>(new Map());\r\n const oldWallPointsMapRef = useRef>(new Map());\r\n const newWallPointsMapRef = useRef>(new Map());\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const newDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const oldRotationRef = useRef([0, 0, 1]);\r\n const newRotationRef = useRef([0, 0, 1]);\r\n const oldHumanOrPlantParentIdRef = useRef(null);\r\n const oldCuboidParentIdRef = useRef(null);\r\n const absPosMapRef = useRef>(new Map());\r\n const polygonsAbsPosMapRef = useRef>(new Map());\r\n const wallsAbsPosMapRef = useRef>(new Map());\r\n const isSettingFoundationStartPointRef = useRef(false);\r\n const isSettingFoundationEndPointRef = useRef(false);\r\n const isSettingCuboidStartPointRef = useRef(false);\r\n const isSettingCuboidEndPointRef = useRef(false);\r\n const isHumanOrPlantMovedRef = useRef(false);\r\n const baseGroupRelPosMapRef = useRef>(new Map());\r\n const baseGroupOldPosMapRef = useRef>(new Map());\r\n const baseGroupNewPosMapRef = useRef>(new Map());\r\n const moveHandleWorldDiffV3Ref = useRef(new Vector3());\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // add pointer up event to window\r\n useEffect(() => {\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (deletedFoundationId) {\r\n setCommonStore((state) => {\r\n state.addedFoundationId = null;\r\n state.deletedFoundationId = null;\r\n });\r\n isSettingFoundationStartPointRef.current = false;\r\n isSettingFoundationEndPointRef.current = false;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [deletedFoundationId]);\r\n\r\n useEffect(() => {\r\n if (deletedCuboidId) {\r\n setCommonStore((state) => {\r\n state.addedCuboidId = null;\r\n state.deletedCuboidId = null;\r\n });\r\n isSettingCuboidStartPointRef.current = false;\r\n isSettingCuboidEndPointRef.current = false;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [deletedCuboidId]);\r\n\r\n const { camera } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const cosAngle = grabRef.current ? Math.cos(grabRef.current.rotation[2]) : 1;\r\n const sinAngle = grabRef.current ? Math.sin(grabRef.current.rotation[2]) : 0;\r\n let intersectionPlaneType = IntersectionPlaneType.Ground;\r\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\r\n const intersectionPlaneAngle = useMemo(() => new Euler(), []);\r\n const elementParentRotation = useMemo(() => new Euler(), []);\r\n\r\n if (grabRef.current) {\r\n if (Util.isPlantOrHuman(grabRef.current)) {\r\n intersectionPlaneType = IntersectionPlaneType.Vertical;\r\n const a = useStore.getState().viewState.orthographic ? 0 : -HALF_PI;\r\n const { x: cameraX, y: cameraY } = camera.position;\r\n const rotation = -Math.atan2(cameraX, cameraY);\r\n intersectionPlaneAngle.set(a, 0, rotation, 'ZXY');\r\n intersectionPlanePosition.set(grabRef.current.cx, grabRef.current.cy, 0);\r\n } else if (moveHandleType === MoveHandleType.Top) {\r\n intersectionPlaneType = IntersectionPlaneType.Horizontal;\r\n intersectionPlanePosition.set(grabRef.current.cx, grabRef.current.cy, grabRef.current.lz);\r\n intersectionPlaneAngle.set(0, 0, 0);\r\n } else if (\r\n Util.isMoveHandle(moveHandleType) ||\r\n resizeHandleType === ResizeHandleType.Left ||\r\n resizeHandleType === ResizeHandleType.Right ||\r\n resizeHandleType === ResizeHandleType.Lower ||\r\n resizeHandleType === ResizeHandleType.Upper ||\r\n resizeHandleType === ResizeHandleType.LowerLeft ||\r\n (resizeHandleType === ResizeHandleType.UpperLeft && grabRef.current.type !== ObjectType.Wall) ||\r\n resizeHandleType === ResizeHandleType.LowerRight ||\r\n (resizeHandleType === ResizeHandleType.UpperRight && grabRef.current.type !== ObjectType.Wall) ||\r\n rotateHandleType === RotateHandleType.Lower ||\r\n rotateHandleType === RotateHandleType.Upper\r\n ) {\r\n intersectionPlaneType = IntersectionPlaneType.Horizontal;\r\n intersectionPlanePosition.set(grabRef.current.cx, grabRef.current.cy, MOVE_HANDLE_RADIUS);\r\n intersectionPlaneAngle.set(0, 0, 0);\r\n } else if (resizeHandleType) {\r\n intersectionPlaneType = IntersectionPlaneType.Vertical;\r\n const handlePosition = getResizeHandlePosition(grabRef.current, resizeHandleType);\r\n const cameraDir = getCameraDirection();\r\n const rotation = -Math.atan2(cameraDir.x, cameraDir.y);\r\n intersectionPlanePosition.set(handlePosition.x, handlePosition.y, 0);\r\n intersectionPlaneAngle.set(-HALF_PI, 0, rotation, 'ZXY');\r\n }\r\n }\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / getThree().gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / getThree().gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, getThree().camera);\r\n };\r\n\r\n const getIntersectionToStand = (intersections: Intersection[]) => {\r\n for (const intersection of intersections) {\r\n if (intersection.object.userData.stand) {\r\n return intersection;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n // don't set parentId for foundations or cuboids as their parents are allowed to be ground only (for now)\r\n if (e.id === elementId && e.type !== ObjectType.Foundation) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const getObjectId = (obj: Object3D | null): string => {\r\n if (!obj) return '';\r\n\r\n const nameArray = obj.name.split(' ');\r\n if (nameArray[2]) {\r\n return nameArray[2];\r\n }\r\n\r\n return getObjectId(obj.parent);\r\n };\r\n\r\n const attachToGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n if (contentRef?.current) {\r\n const currParentObj = Util.getObjectChildById(contentRef.current, currParentId);\r\n const currObj = Util.getObjectChildById(currParentId === GROUND_ID ? contentRef.current : currParentObj, currId);\r\n if (currObj) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = Util.getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n }\r\n };\r\n\r\n const handlePlantOrHumanRefMove = (elementRef: RefObject | null, e: ThreeEvent) => {\r\n if (elementRef && elementRef.current) {\r\n const intersection = getIntersectionToStand(e.intersections);\r\n if (intersection) {\r\n const intersectionObj = intersection.object; // Mesh\r\n const elementParentRef = elementRef.current.parent;\r\n\r\n // stand on ground\r\n if (intersectionObj.name === 'Ground') {\r\n // change parent: attach dom, set parentId?\r\n if (elementParentRef && elementParentRef.name !== 'Content') {\r\n const contentRef = useRefStore.getState().contentRef;\r\n if (contentRef && contentRef.current) {\r\n contentRef.current.add(elementRef.current);\r\n setParentIdById(GROUND_ID, getObjectId(elementRef.current));\r\n }\r\n }\r\n elementRef.current.position.copy(intersection.point); // world position\r\n invalidate();\r\n }\r\n // stand on standable elements\r\n else if (intersectionObj.userData.stand) {\r\n const intersectionObjGroup = intersectionObj.parent; // Group\r\n if (intersectionObjGroup) {\r\n // change parent: attach dom, set parentId?\r\n if (elementParentRef && elementParentRef.uuid !== intersectionObjGroup.uuid) {\r\n intersectionObjGroup.add(elementRef.current); // attach to Group\r\n setParentIdById(getObjectId(intersectionObjGroup), getObjectId(elementRef.current));\r\n }\r\n const { rot: intersectionObjGroupWorldRotation } = Util.getWorldDataById(getObjectId(intersectionObjGroup));\r\n elementParentRotation.set(0, 0, -intersectionObjGroupWorldRotation);\r\n const relPos = new Vector3()\r\n .subVectors(intersection.point, intersectionObjGroup.localToWorld(new Vector3()))\r\n .applyEuler(elementParentRotation);\r\n elementRef.current.position.copy(relPos); // relative abs position\r\n invalidate();\r\n }\r\n }\r\n\r\n if (!isHumanOrPlantMovedRef.current) {\r\n isHumanOrPlantMovedRef.current = true;\r\n }\r\n }\r\n }\r\n };\r\n\r\n // for tree, flower, and human for now\r\n const handleSetElementState = (elemId: string, standObjId: string, position: Vector3) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId) {\r\n // don't set parentId for foundations or cuboids as their parents are allowed to be ground only (for now)\r\n if (!Util.isFoundationOrCuboid(e)) e.parentId = standObjId;\r\n e.cx = position.x;\r\n e.cy = position.y;\r\n e.cz = position.z;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleUndoableResize = () => {\r\n if (!grabRef.current) return;\r\n const undoableResize = {\r\n name: 'Resize',\r\n timestamp: Date.now(),\r\n resizedElementId: grabRef.current.id,\r\n resizedElementType: grabRef.current.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n oldLx: oldDimensionRef.current.x,\r\n oldLy: oldDimensionRef.current.y,\r\n oldLz: oldDimensionRef.current.z,\r\n newLx: newDimensionRef.current.x,\r\n newLy: newDimensionRef.current.y,\r\n newLz: newDimensionRef.current.z,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldPolygonVerticesMap: new Map(oldPolygonVerticesMapRef.current),\r\n newPolygonVerticesMap: new Map(newPolygonVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n oldWallPointsMap: new Map(oldWallPointsMapRef.current),\r\n newWallPointsMap: new Map(newWallPointsMapRef.current),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.resizedElementId) {\r\n e.cx = undoableResize.oldCx;\r\n e.cy = undoableResize.oldCy;\r\n e.cz = undoableResize.oldCz;\r\n e.lx = undoableResize.oldLx;\r\n e.ly = undoableResize.oldLy;\r\n e.lz = undoableResize.oldLz;\r\n break;\r\n }\r\n }\r\n });\r\n if (undoableResize.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, p] of undoableResize.oldChildrenPositionsMap.entries()) {\r\n const elem = getElementById(id);\r\n if (elem?.type !== ObjectType.Polygon) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.cx = p.x;\r\n e.cy = p.y;\r\n if (!isRoofTopElement(e)) {\r\n e.cz = p.z;\r\n }\r\n if (e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n const oldPoints = undoableResize.oldWallPointsMap.get(w.id);\r\n if (oldPoints) {\r\n w.leftPoint = [oldPoints[0].x, oldPoints[0].y, 0];\r\n w.rightPoint = [oldPoints[1].x, oldPoints[1].y, 0];\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (undoableResize.oldWallPointsMap.size > 0) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n const oldParentId = undoableResize.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableResize.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n }\r\n if (undoableResize.oldPolygonVerticesMap.size > 0) {\r\n for (const [id, vertices] of undoableResize.oldPolygonVerticesMap.entries()) {\r\n const elem = getElementById(id);\r\n if (elem?.type === ObjectType.Polygon) {\r\n updatePolygonVerticesById(id, vertices);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.resizedElementId) {\r\n e.cx = undoableResize.newCx;\r\n e.cy = undoableResize.newCy;\r\n e.cz = undoableResize.newCz;\r\n e.lx = undoableResize.newLx;\r\n e.ly = undoableResize.newLy;\r\n e.lz = undoableResize.newLz;\r\n break;\r\n }\r\n }\r\n });\r\n if (undoableResize.newChildrenPositionsMap.size > 0) {\r\n for (const [id, p] of undoableResize.newChildrenPositionsMap.entries()) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.cx = p.x;\r\n e.cy = p.y;\r\n if (e.type !== ObjectType.SolarPanel || (e as SolarPanelModel).parentType !== ObjectType.Roof) {\r\n e.cz = p.z;\r\n }\r\n if (e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n const oldPoints = undoableResize.newWallPointsMap.get(w.id);\r\n if (oldPoints) {\r\n w.leftPoint = [oldPoints[0].x, oldPoints[0].y, 0];\r\n w.rightPoint = [oldPoints[1].x, oldPoints[1].y, 0];\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (undoableResize.newWallPointsMap.size > 0) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n const oldParentId = undoableResize.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableResize.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableResize.newPolygonVerticesMap.size > 0) {\r\n for (const [id, vertices] of undoableResize.newPolygonVerticesMap.entries()) {\r\n const elem = getElementById(id);\r\n if (elem?.type === ObjectType.Polygon) {\r\n updatePolygonVerticesById(id, vertices);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableResize;\r\n return undoableResize;\r\n };\r\n\r\n const handleDetachParent = (elem: ElementModel, e: ElementModel) => {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = Util.getObjectChildById(contentRef?.current, elem.id);\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${e.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n }\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector3(e.cx, e.cy, e.cz)\r\n .applyEuler(new Euler(0, 0, elem.rotation[2]))\r\n .add(oldPositionRef.current);\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const groundClicked = e.intersections[0].object === groundPlaneRef.current;\r\n if (groundClicked) {\r\n setCommonStore((state) => {\r\n InnerCommonStoreState.selectNone(state);\r\n state.pastePoint.copy(e.intersections[0].point);\r\n state.clickObjectType = ObjectType.Ground;\r\n state.contextMenuObjectType = ObjectType.Ground;\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n });\r\n }\r\n }\r\n };\r\n\r\n const resizeElementOnPointerUp = (elem: ElementModel) => {\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n // special cases\r\n switch (elem.type) {\r\n case ObjectType.Tree:\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Top:\r\n const undoableChangeHeight = {\r\n name: 'Change Tree Height',\r\n timestamp: Date.now(),\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n oldValue: oldDimensionRef.current.z,\r\n newValue: elem.lz,\r\n undo: () => {\r\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChangeHeight);\r\n setCommonStore((state) => {\r\n state.actionState.treeHeight = elem.lz;\r\n });\r\n return;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n const undoableChangeSpread = {\r\n name: 'Change Tree Spread',\r\n timestamp: Date.now(),\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n oldValue: oldDimensionRef.current.x,\r\n newValue: elem.lx,\r\n undo: () => {\r\n updateElementLxById(undoableChangeSpread.changedElementId, undoableChangeSpread.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLxById(undoableChangeSpread.changedElementId, undoableChangeSpread.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChangeSpread);\r\n setCommonStore((state) => {\r\n state.actionState.treeSpread = elem.lx;\r\n });\r\n return;\r\n }\r\n break;\r\n case ObjectType.Wall: {\r\n const undoableChangeHeight = {\r\n name: 'Change Wall Height',\r\n timestamp: Date.now(),\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n oldValue: oldDimensionRef.current.z,\r\n newValue: elem.lz,\r\n undo: () => {\r\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChangeHeight);\r\n setCommonStore((state) => {\r\n state.actionState.wallHeight = elem.lz;\r\n });\r\n return;\r\n }\r\n }\r\n\r\n // if the above condition is valid , it will return. So the following part will not run.\r\n newPositionRef.current.set(elem.cx, elem.cy, elem.cz);\r\n newDimensionRef.current.set(elem.lx, elem.ly, elem.lz);\r\n oldChildrenParentIdMapRef.current.clear();\r\n newChildrenParentIdMapRef.current.clear();\r\n newChildrenPositionsMapRef.current.clear();\r\n newPolygonVerticesMapRef.current.clear();\r\n newWallPointsMapRef.current.clear();\r\n setCommonStore((state) => {\r\n if (elem.type === ObjectType.Cuboid) {\r\n state.actionState.cuboidHeight = elem.lz;\r\n }\r\n state.updateSceneRadius();\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n // set ref children state\r\n if (elem.parentId === GROUND_ID) {\r\n for (const e of state.elements) {\r\n if (Util.isPlantOrHuman(e)) {\r\n if (e.parentId === elem.id) {\r\n oldChildrenParentIdMapRef.current.set(e.id, elem.id);\r\n if (!Util.isResizingVertical(useStore.getState().resizeHandleType)) {\r\n // top face\r\n if (Math.abs(oldDimensionRef.current.z / 2 - e.cz) < 0.01) {\r\n // fixed position\r\n const newRelativePos = new Vector3(e.cx, e.cy, e.cz)\r\n .applyEuler(new Euler(0, 0, elem.rotation[2]))\r\n .add(oldPositionRef.current)\r\n .sub(newPositionRef.current)\r\n .applyEuler(new Euler(0, 0, -elem.rotation[2]));\r\n // detach parent dom if falls on ground\r\n if (\r\n Math.abs(newRelativePos.x) > Math.abs(newDimensionRef.current.x / 2) + 0.01 ||\r\n Math.abs(newRelativePos.y) > Math.abs(newDimensionRef.current.y / 2) + 0.01\r\n ) {\r\n handleDetachParent(elem, e);\r\n } else {\r\n e.cx = newRelativePos.x;\r\n e.cy = newRelativePos.y;\r\n }\r\n }\r\n // side faces\r\n else {\r\n const oldRelativePos = new Vector3(e.cx, e.cy, e.cz);\r\n const d = new Vector3().subVectors(newPositionRef.current, oldPositionRef.current);\r\n const v = new Vector3().subVectors(oldRelativePos, d);\r\n // west and east face\r\n if (Math.abs(oldRelativePos.x / oldDimensionRef.current.x) > 0.49) {\r\n if (Math.abs(v.y) > elem.ly / 2 + 0.5) {\r\n handleDetachParent(elem, e);\r\n } else {\r\n e.cx = (oldRelativePos.x > 0 ? elem.lx : -elem.lx) / 2;\r\n e.cy = v.y;\r\n }\r\n }\r\n // north and south face\r\n else if (Math.abs(oldRelativePos.y / oldDimensionRef.current.y) > 0.49) {\r\n if (Math.abs(v.x) > elem.lx / 2 + 0.5) {\r\n handleDetachParent(elem, e);\r\n } else {\r\n e.cx = v.x;\r\n e.cy = (oldRelativePos.y > 0 ? elem.ly : -elem.ly) / 2;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n if (\r\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE &&\r\n newDimensionRef.current.distanceToSquared(oldDimensionRef.current) > ZERO_TOLERANCE\r\n ) {\r\n // store the new positions of the children if the selected element may be a parent\r\n if (elem.type === ObjectType.Foundation || elem.type === ObjectType.Cuboid) {\r\n const children = getChildren(elem.id);\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (c.type === ObjectType.Polygon) {\r\n newPolygonVerticesMapRef.current.set(\r\n c.id,\r\n (c as PolygonModel).vertices.map((v) => ({ ...v })),\r\n );\r\n } else {\r\n if (c.type === ObjectType.Wall) {\r\n const w = c as WallModel;\r\n const leftPoint = new Vector2(w.leftPoint[0], w.leftPoint[1]);\r\n const rightPoint = new Vector2(w.rightPoint[0], w.rightPoint[1]);\r\n newWallPointsMapRef.current.set(c.id, [leftPoint, rightPoint]);\r\n }\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n if (elem.type === ObjectType.Foundation) {\r\n const elementsOnRoof = getRooftopChildren(elem.id);\r\n if (elementsOnRoof.length > 0) {\r\n for (const e of elementsOnRoof) {\r\n const centerRelPos = new Vector3(e.cx, e.cy);\r\n newChildrenPositionsMapRef.current.set(e.id, centerRelPos);\r\n }\r\n }\r\n }\r\n }\r\n const undoableResize = handleUndoableResize();\r\n undoableResize && addUndoable(undoableResize);\r\n }\r\n };\r\n\r\n const isMoveToSky = () => {\r\n if (useStore.getState().viewState.orthographic) return false; // impossible to move to sky in 2D mode\r\n if (groundPlaneRef.current) {\r\n const intersections = ray.intersectObjects(getThree().scene.children, true);\r\n if (intersections.length > 0) {\r\n for (const intersection of intersections) {\r\n if (intersection.object.userData.stand) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n return ray.intersectObjects([groundPlaneRef.current!]).length === 0;\r\n };\r\n\r\n const updateBaseGroupPosition = (map: Map) => {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (map.has(elem.id)) {\r\n const pos = map.get(elem.id);\r\n if (pos) {\r\n elem.cx = pos[0];\r\n elem.cy = pos[1];\r\n elem.cz = pos[2];\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const moveElementOnPointerUp = (elem: ElementModel, e: PointerEvent) => {\r\n if (elem.locked) return;\r\n newPositionRef.current.set(elem.cx, elem.cy, elem.cz);\r\n let newHumanOrPlantParentId: string | null = oldHumanOrPlantParentIdRef.current;\r\n // elements modified by reference\r\n let elementRef: Group | null | undefined = null;\r\n setRayCast(e);\r\n switch (elem.type) {\r\n case ObjectType.Tree:\r\n elementRef = useRefStore.getState().treeRef?.current;\r\n break;\r\n case ObjectType.Flower:\r\n elementRef = useRefStore.getState().flowerRef?.current;\r\n break;\r\n case ObjectType.Human:\r\n elementRef = useRefStore.getState().humanRef?.current;\r\n break;\r\n }\r\n if (elementRef && isHumanOrPlantMovedRef.current) {\r\n const intersections = ray.intersectObjects(Util.fetchIntersectables(scene), false);\r\n const intersection = getIntersectionToStand(intersections); // could simplify???\r\n if (intersection) {\r\n const p = intersection.point;\r\n // on ground\r\n if (intersection.object.name === 'Ground') {\r\n handleSetElementState(elem.id, GROUND_ID, p);\r\n newPositionRef.current.set(p.x, p.y, p.z);\r\n newHumanOrPlantParentId = GROUND_ID;\r\n }\r\n // on other standable elements\r\n else if (intersection.object.userData.stand) {\r\n const intersectionObjId = getObjectId(intersection.object);\r\n const intersectionObjGroup = intersection.object.parent;\r\n if (intersectionObjGroup) {\r\n const relPos = new Vector3()\r\n .subVectors(p, intersectionObjGroup.localToWorld(new Vector3()))\r\n .applyEuler(elementParentRotation);\r\n handleSetElementState(elem.id, intersectionObjId, relPos);\r\n newPositionRef.current.set(relPos.x, relPos.y, relPos.z);\r\n newHumanOrPlantParentId = intersectionObjId;\r\n }\r\n }\r\n }\r\n isHumanOrPlantMovedRef.current = false;\r\n }\r\n if (\r\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE ||\r\n ray.intersectObjects([groundPlaneRef.current!]).length === 0\r\n ) {\r\n let moveOk = true;\r\n if (!useStore.getState().viewState.orthographic) {\r\n // OK to move closer to the origin\r\n moveOk = newPositionRef.current.length() < oldPositionRef.current.length();\r\n if (!moveOk) {\r\n // in the case that it is moving away from the origin, check it will be too far\r\n const screenPosition = newPositionRef.current.clone().project(camera);\r\n const screenLx = newPositionRef.current\r\n .clone()\r\n .add(new Vector3(elem.lx, 0, 0))\r\n .project(camera)\r\n .distanceTo(screenPosition);\r\n const screenLy = newPositionRef.current\r\n .clone()\r\n .add(new Vector3(0, elem.ly ?? 1, 0))\r\n .project(camera)\r\n .distanceTo(screenPosition);\r\n const screenLz = newPositionRef.current\r\n .clone()\r\n .add(new Vector3(0, 0, elem.lz))\r\n .project(camera)\r\n .distanceTo(screenPosition);\r\n // OK if larger than 2% of screen dimension\r\n moveOk = Math.max(screenLx, screenLy, screenLz) > 0.02;\r\n }\r\n }\r\n if (!moveOk || isMoveToSky()) {\r\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n if (elementRef) {\r\n if (Util.isPlantOrHuman(elem)) {\r\n elementRef.position.copy(oldPositionRef.current);\r\n }\r\n }\r\n if (Util.isPlantOrHuman(elem)) {\r\n setParentIdById(oldHumanOrPlantParentIdRef.current, elem.id);\r\n }\r\n const contentRef = useRefStore.getState().contentRef;\r\n if (contentRef?.current && oldHumanOrPlantParentIdRef.current && elementRef) {\r\n if (oldHumanOrPlantParentIdRef.current === GROUND_ID) {\r\n contentRef.current.add(elementRef);\r\n } else {\r\n const attachParentObj = Util.getObjectChildById(contentRef.current, oldHumanOrPlantParentIdRef.current);\r\n attachParentObj?.add(elementRef);\r\n }\r\n invalidate();\r\n }\r\n showError(i18n.t('message.CannotMoveObjectTooFar', lang));\r\n } else {\r\n if (baseGroupRelPosMapRef.current.size > 1) {\r\n baseGroupNewPosMapRef.current.clear();\r\n for (const elem of useStore.getState().elements) {\r\n if (baseGroupOldPosMapRef.current.has(elem.id)) {\r\n baseGroupNewPosMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz]);\r\n }\r\n }\r\n const undoableMove = {\r\n name: 'Move Foundation Group',\r\n timestamp: Date.now(),\r\n oldPositionMap: new Map(baseGroupOldPosMapRef.current),\r\n newPositionMap: new Map(baseGroupNewPosMapRef.current),\r\n undo: () => {\r\n updateBaseGroupPosition(undoableMove.oldPositionMap);\r\n },\r\n redo: () => {\r\n updateBaseGroupPosition(undoableMove.newPositionMap);\r\n },\r\n } as UndoableMoveFoundationGroup;\r\n addUndoable(undoableMove);\r\n } else {\r\n const isCuboid = elem.type === ObjectType.Cuboid;\r\n const oldParentId = isCuboid ? oldCuboidParentIdRef.current : oldHumanOrPlantParentIdRef.current;\r\n const newParentId = isCuboid ? elem.parentId : newHumanOrPlantParentId;\r\n const undoableMove = {\r\n name: 'Move',\r\n timestamp: Date.now(),\r\n movedElementId: elem.id,\r\n movedElementType: elem.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n oldRotation: [...oldRotationRef.current],\r\n newRotation: [...elem.rotation],\r\n oldParentId: oldParentId,\r\n newParentId: newParentId,\r\n undo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.oldCx,\r\n undoableMove.oldCy,\r\n undoableMove.oldCz,\r\n );\r\n setCommonStore((state) => {\r\n const e = state.elements.find((e) => e.id === undoableMove.movedElementId);\r\n if (e && undoableMove.oldRotation) e.rotation = [...undoableMove.oldRotation];\r\n });\r\n setParentIdById(undoableMove.oldParentId, undoableMove.movedElementId);\r\n if (undoableMove.movedElementType && isHumanOrPlant(undoableMove.movedElementType)) {\r\n attachToGroup(undoableMove.oldParentId, undoableMove.newParentId, undoableMove.movedElementId);\r\n }\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.newCx,\r\n undoableMove.newCy,\r\n undoableMove.newCz,\r\n );\r\n setCommonStore((state) => {\r\n const e = state.elements.find((e) => e.id === undoableMove.movedElementId);\r\n if (e && undoableMove.newRotation) e.rotation = [...undoableMove.newRotation];\r\n });\r\n setParentIdById(undoableMove.newParentId, undoableMove.movedElementId);\r\n if (undoableMove.movedElementType && isHumanOrPlant(undoableMove.movedElementType)) {\r\n attachToGroup(undoableMove.newParentId, undoableMove.oldParentId, undoableMove.movedElementId);\r\n }\r\n },\r\n } as UndoableMove;\r\n addUndoable(undoableMove);\r\n }\r\n baseGroupRelPosMapRef.current.clear();\r\n updateSceneRadius();\r\n }\r\n }\r\n };\r\n\r\n const rotateElementOnPointerUp = (elem: ElementModel) => {\r\n newRotationRef.current = [...elem.rotation];\r\n const oldRotation = new Vector3().fromArray(oldRotationRef.current);\r\n const newRotation = new Vector3().fromArray(newRotationRef.current);\r\n if (newRotation.distanceToSquared(oldRotation) > ZERO_TOLERANCE) {\r\n const undoableRotate = {\r\n name: 'Rotate',\r\n timestamp: Date.now(),\r\n rotatedElementId: elem.id,\r\n rotatedElementType: elem.type,\r\n oldRotation: oldRotationRef.current,\r\n newRotation: newRotationRef.current,\r\n undo: () => {\r\n setElementRotation(\r\n undoableRotate.rotatedElementId,\r\n undoableRotate.oldRotation[0],\r\n undoableRotate.oldRotation[1],\r\n undoableRotate.oldRotation[2],\r\n );\r\n },\r\n redo: () => {\r\n setElementRotation(\r\n undoableRotate.rotatedElementId,\r\n undoableRotate.newRotation[0],\r\n undoableRotate.newRotation[1],\r\n undoableRotate.newRotation[2],\r\n );\r\n },\r\n } as UndoableRotate;\r\n addUndoable(undoableRotate);\r\n }\r\n };\r\n\r\n const handlePointerUp = (e: PointerEvent) => {\r\n if (e.button === 2) return;\r\n useRefStore.setState((state) => {\r\n state.setEnableOrbitController(true);\r\n });\r\n if (grabRef.current) {\r\n const elem = getElementById(grabRef.current.id);\r\n if (elem) {\r\n // adding foundation end point\r\n if (isSettingFoundationEndPointRef.current) {\r\n isSettingFoundationStartPointRef.current = false;\r\n isSettingFoundationEndPointRef.current = false;\r\n setCommonStore((state) => {\r\n state.addedFoundationId = null;\r\n state.updateSceneRadius();\r\n });\r\n if (elem.lx <= 0.1 || elem.ly <= 0.1) {\r\n removeElementById(elem.id, false);\r\n } else {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: elem,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n updateSceneRadius();\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n state.updateSceneRadius();\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n }\r\n }\r\n // adding cuboid end point\r\n else if (isSettingCuboidEndPointRef.current) {\r\n isSettingCuboidStartPointRef.current = false;\r\n isSettingCuboidEndPointRef.current = false;\r\n setCommonStore((state) => {\r\n state.addedCuboidId = null;\r\n state.updateSceneRadius();\r\n });\r\n if (elem.lx <= 0.1 || elem.ly <= 0.1) {\r\n removeElementById(elem.id, false);\r\n } else {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: elem,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n updateSceneRadius();\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n state.updateSceneRadius();\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n }\r\n }\r\n // handling editing events\r\n else {\r\n if (useStore.getState().resizeHandleType) {\r\n resizeElementOnPointerUp(elem);\r\n } else if (useStore.getState().rotateHandleType) {\r\n rotateElementOnPointerUp(elem);\r\n } else if (useStore.getState().moveHandleType) {\r\n moveElementOnPointerUp(elem, e);\r\n }\r\n if (elem.type === ObjectType.Foundation) {\r\n usePrimitiveStore.getState().updateFoundationMovedFlag();\r\n }\r\n }\r\n }\r\n grabRef.current = null;\r\n }\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.rotateHandleType = null;\r\n });\r\n useRefStore.setState((state) => {\r\n state.humanRef = null;\r\n state.treeRef = null;\r\n state.flowerRef = null;\r\n });\r\n };\r\n\r\n const setBasePosMap = (element: ElementModel, pointer: Vector3) => {\r\n const { pos } = Util.getWorldDataById(element.id);\r\n const center = new Vector3(pos.x, pos.y);\r\n const diff = new Vector3().subVectors(center, pointer);\r\n baseGroupRelPosMapRef.current.set(element.id, diff);\r\n baseGroupOldPosMapRef.current.set(element.id, [element.cx, element.cy, element.cz]);\r\n };\r\n\r\n const checkOverlapWithAllBases = (event: ThreeEvent, currElem: GroupableModel) => {\r\n const pointer = event.intersections[0].point.clone().setZ(0);\r\n for (const element of useStore.getState().elements) {\r\n if (\r\n isGroupable(element) &&\r\n element.parentId === GROUND_ID &&\r\n !element.locked &&\r\n element.id !== currElem.id &&\r\n !baseGroupRelPosMapRef.current.has(element.id) &&\r\n !Util.isChild(currElem.id, element.id) &&\r\n !Util.isChild(element.id, currElem.id) &&\r\n Util.areTwoBasesOverlapped(element, currElem)\r\n ) {\r\n setBasePosMap(element, pointer);\r\n checkOverlapWithAllBases(event, element);\r\n }\r\n if (element.id === currElem.id) {\r\n setBasePosMap(element, pointer);\r\n }\r\n }\r\n };\r\n\r\n const handleGroupMaster = (event: ThreeEvent, currElem: GroupableModel) => {\r\n baseGroupRelPosMapRef.current.clear();\r\n baseGroupOldPosMapRef.current.clear();\r\n if (!currElem.enableGroupMaster) return;\r\n if (useStore.getState().moveHandleType) {\r\n checkOverlapWithAllBases(event, currElem);\r\n }\r\n };\r\n\r\n // todo: should add sensor and light\r\n const isRoofTopElement = (e: ElementModel) => {\r\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) return true;\r\n if (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Roof) return true;\r\n };\r\n\r\n const getRooftopChildren = (fId: string) => {\r\n return useStore.getState().elements.filter((e) => {\r\n if (e.foundationId !== fId) return false;\r\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) return true;\r\n if (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Roof) return true;\r\n if (e.type === ObjectType.Sensor || e.type === ObjectType.Light) return true;\r\n });\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (e.intersections.length === 0 || !groundPlaneRef.current) return;\r\n // adding foundation start point\r\n if (isSettingFoundationStartPointRef.current) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([groundPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = ResizeHandleType.LowerRight;\r\n state.resizeAnchor.copy(intersects[0].point);\r\n });\r\n isSettingFoundationStartPointRef.current = false;\r\n isSettingFoundationEndPointRef.current = true;\r\n }\r\n return;\r\n }\r\n // adding cuboid start point\r\n if (isSettingCuboidStartPointRef.current) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([groundPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = ResizeHandleType.LowerRight;\r\n state.resizeAnchor.copy(intersects[0].point);\r\n if (grabRef.current) {\r\n const firstIntersectedCuboidObject = getFirstStackableCuboid(e, grabRef.current?.id);\r\n if (firstIntersectedCuboidObject) {\r\n const intersects = ray.intersectObjects([firstIntersectedCuboidObject.eventObject]);\r\n if (intersects.length > 0) {\r\n state.resizeAnchor.copy(intersects[0].point);\r\n }\r\n }\r\n }\r\n });\r\n isSettingCuboidStartPointRef.current = false;\r\n isSettingCuboidEndPointRef.current = true;\r\n }\r\n return;\r\n }\r\n\r\n const groundClicked = e.intersections[0].object === groundPlaneRef.current;\r\n if (groundClicked) {\r\n if (!useStore.getState().multiSelectionsMode) {\r\n setCommonStore((state) => {\r\n state.clickObjectType = ObjectType.Ground;\r\n state.selectedElement = null;\r\n InnerCommonStoreState.selectNone(state);\r\n state.contextMenuObjectType = null;\r\n });\r\n }\r\n if (legalOnGround(objectTypeToAdd)) {\r\n const position = e.intersections[0].point;\r\n const addedElement = addElement(groundModel, position);\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: addedElement,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n updateSceneRadius();\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n state.updateSceneRadius();\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n setCommonStore((state) => {\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n state.updateSceneRadius();\r\n });\r\n }\r\n } else {\r\n const selectedElementIdSet = useStore.getState().selectedElementIdSet;\r\n if (selectedElementIdSet.size > 1) {\r\n const selectedElement = useStore.getState().selectedElement;\r\n if (selectedElement) {\r\n grabRef.current = selectedElement;\r\n baseGroupRelPosMapRef.current.clear();\r\n for (const elem of useStore.getState().elements) {\r\n if (Util.isElementAllowedMultipleMoveOnGround(elem) && selectedElementIdSet.has(elem.id)) {\r\n const base = elem as GroupableModel;\r\n if (base.enableGroupMaster) {\r\n checkOverlapWithAllBases(e, elem);\r\n } else {\r\n const pointer = e.intersections[0].point.clone().setZ(0);\r\n setBasePosMap(elem, pointer);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const selectedElement = getSelectedElement();\r\n if (selectedElement && legalOnGround(selectedElement.type)) {\r\n grabRef.current = selectedElement;\r\n // save info for undo\r\n oldPositionRef.current.set(selectedElement.cx, selectedElement.cy, selectedElement.cz);\r\n oldDimensionRef.current.set(selectedElement.lx, selectedElement.ly, selectedElement.lz);\r\n oldRotationRef.current = [...selectedElement.rotation];\r\n\r\n // store the positions of the children if the selected element may be a parent\r\n if (selectedElement.type === ObjectType.Foundation || selectedElement.type === ObjectType.Cuboid) {\r\n const children = getChildren(selectedElement.id);\r\n oldChildrenPositionsMapRef.current.clear();\r\n oldPolygonVerticesMapRef.current.clear();\r\n oldWallPointsMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (c.type === ObjectType.Polygon) {\r\n oldPolygonVerticesMapRef.current.set(\r\n c.id,\r\n (c as PolygonModel).vertices.map((v) => ({ ...v })),\r\n );\r\n } else {\r\n if (c.type === ObjectType.Wall) {\r\n const w = c as WallModel;\r\n const leftPoint = new Vector2(w.leftPoint[0], w.leftPoint[1]);\r\n const rightPoint = new Vector2(w.rightPoint[0], w.rightPoint[1]);\r\n oldWallPointsMapRef.current.set(c.id, [leftPoint, rightPoint]);\r\n }\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n if (selectedElement.type === ObjectType.Foundation) {\r\n const elementsOnRoof = getRooftopChildren(selectedElement.id);\r\n if (elementsOnRoof.length > 0) {\r\n for (const e of elementsOnRoof) {\r\n // skylight window position is absolute to foundation\r\n const centerRelPos = new Vector3(e.cx, e.cy);\r\n oldChildrenPositionsMapRef.current.set(e.id, centerRelPos);\r\n }\r\n }\r\n }\r\n }\r\n switch (selectedElement.type) {\r\n case ObjectType.Tree:\r\n oldHumanOrPlantParentIdRef.current = selectedElement.parentId;\r\n oldDimensionRef.current.set(selectedElement.lx, selectedElement.ly, selectedElement.lz);\r\n break;\r\n case ObjectType.Flower:\r\n oldHumanOrPlantParentIdRef.current = selectedElement.parentId;\r\n break;\r\n case ObjectType.Human:\r\n oldHumanOrPlantParentIdRef.current = selectedElement.parentId;\r\n break;\r\n case ObjectType.Cuboid:\r\n if (isGroupable(selectedElement) && selectedElement.parentId === GROUND_ID) {\r\n handleGroupMaster(e, selectedElement as GroupableModel);\r\n } else {\r\n baseGroupRelPosMapRef.current.clear();\r\n }\r\n oldCuboidParentIdRef.current = selectedElement.parentId;\r\n const moveHandleType = useStore.getState().moveHandleType;\r\n if (moveHandleType) {\r\n const { rot } = Util.getWorldDataById(selectedElement.id);\r\n const euler = new Euler(0, 0, rot);\r\n switch (useStore.getState().moveHandleType) {\r\n case MoveHandleType.Right: {\r\n moveHandleWorldDiffV3Ref.current.set(-selectedElement.lx / 2, 0, 0).applyEuler(euler);\r\n break;\r\n }\r\n case MoveHandleType.Left: {\r\n moveHandleWorldDiffV3Ref.current.set(selectedElement.lx / 2, 0, 0).applyEuler(euler);\r\n break;\r\n }\r\n case MoveHandleType.Lower: {\r\n moveHandleWorldDiffV3Ref.current.set(0, selectedElement.ly / 2, 0).applyEuler(euler);\r\n break;\r\n }\r\n case MoveHandleType.Upper: {\r\n moveHandleWorldDiffV3Ref.current.set(0, -selectedElement.ly / 2, 0).applyEuler(euler);\r\n break;\r\n }\r\n default: {\r\n moveHandleWorldDiffV3Ref.current.set(0, 0, 0);\r\n break;\r\n }\r\n }\r\n }\r\n // getting ready for resizing even though it may not happen\r\n absPosMapRef.current.clear();\r\n const { pos, rot } = Util.getWorldDataById(selectedElement.id);\r\n const cuboidCenter = new Vector3(pos.x, pos.y, pos.z);\r\n const cuboidChildren = getChildren(selectedElement.id);\r\n if (cuboidChildren.length > 0) {\r\n for (const e of cuboidChildren) {\r\n switch (e.type) {\r\n case ObjectType.Cuboid: {\r\n const centerAbsPos = new Vector3(e.cx, e.cy, e.cz).applyEuler(new Euler(0, 0, rot));\r\n centerAbsPos.add(cuboidCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n break;\r\n }\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n const centerAbsPos = new Vector3(e.cx, e.cy, e.cz).applyEuler(new Euler(0, 0, rot));\r\n centerAbsPos.add(cuboidCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Light:\r\n case ObjectType.Sensor:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n const centerAbsPos = new Vector3(\r\n e.cx * selectedElement.lx,\r\n e.cy * selectedElement.ly,\r\n e.cz * selectedElement.lz,\r\n ).applyEuler(new Euler(0, 0, rot));\r\n centerAbsPos.add(cuboidCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n const polygon = e as PolygonModel;\r\n const vertexAbsPosArray: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n const vertexAbsPos = new Vector2(\r\n v.x * selectedElement.lx,\r\n v.y * selectedElement.ly,\r\n ).rotateAround(ORIGIN_VECTOR2, rot);\r\n vertexAbsPos.add(new Vector2(cuboidCenter.x, cuboidCenter.y));\r\n vertexAbsPosArray.push(vertexAbsPos);\r\n }\r\n polygonsAbsPosMapRef.current.set(polygon.id, vertexAbsPosArray);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n case ObjectType.Foundation:\r\n if (isGroupable(selectedElement)) {\r\n handleGroupMaster(e, selectedElement as GroupableModel);\r\n }\r\n // getting ready for resizing even though it may not happen\r\n absPosMapRef.current.clear();\r\n polygonsAbsPosMapRef.current.clear();\r\n wallsAbsPosMapRef.current.clear();\r\n const foundationCenterV2 = new Vector2(selectedElement.cx, selectedElement.cy);\r\n const foundationCenter = new Vector3(selectedElement.cx, selectedElement.cy, selectedElement.cz);\r\n const foundationChildren = getChildren(selectedElement.id);\r\n if (foundationChildren.length > 0) {\r\n const a = selectedElement.rotation[2];\r\n for (const e of foundationChildren) {\r\n switch (e.type) {\r\n case ObjectType.Wall:\r\n const wall = e as WallModel;\r\n const centerPointAbsPos = new Vector2(wall.cx, wall.cy).rotateAround(ORIGIN_VECTOR2, a);\r\n centerPointAbsPos.add(foundationCenterV2);\r\n const leftPointAbsPos = new Vector2(wall.leftPoint[0], wall.leftPoint[1]).rotateAround(\r\n ORIGIN_VECTOR2,\r\n a,\r\n );\r\n leftPointAbsPos.add(foundationCenterV2);\r\n const rightPointAbsPos = new Vector2(wall.rightPoint[0], wall.rightPoint[1]).rotateAround(\r\n ORIGIN_VECTOR2,\r\n a,\r\n );\r\n rightPointAbsPos.add(foundationCenterV2);\r\n wallsAbsPosMapRef.current.set(wall.id, {\r\n centerPointAbsPos,\r\n leftPointAbsPos,\r\n rightPointAbsPos,\r\n });\r\n break;\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n const centerAbsPos = new Vector3(e.cx, e.cy, e.cz).applyEuler(new Euler(0, 0, a));\r\n centerAbsPos.add(foundationCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const centerAbsPos = new Vector3(\r\n e.cx * selectedElement.lx,\r\n e.cy * selectedElement.ly,\r\n e.cz * selectedElement.lz,\r\n ).applyEuler(new Euler(0, 0, a));\r\n centerAbsPos.add(foundationCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = e as PolygonModel;\r\n const vertexAbsPosArray: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n const vertexAbsPos = new Vector2(\r\n v.x * selectedElement.lx,\r\n v.y * selectedElement.ly,\r\n ).rotateAround(ORIGIN_VECTOR2, a);\r\n vertexAbsPos.add(foundationCenterV2);\r\n vertexAbsPosArray.push(vertexAbsPos);\r\n }\r\n polygonsAbsPosMapRef.current.set(polygon.id, vertexAbsPosArray);\r\n break;\r\n }\r\n }\r\n }\r\n const elementsOnRoof = getRooftopChildren(selectedElement.id);\r\n if (elementsOnRoof.length > 0) {\r\n const euler = new Euler(0, 0, selectedElement.rotation[2]);\r\n for (const e of elementsOnRoof) {\r\n // skylight window position is absolute to foundation\r\n if (e.type === ObjectType.Window) {\r\n const centerAbsPos = new Vector3(e.cx, e.cy).applyEuler(euler);\r\n centerAbsPos.add(foundationCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n } else {\r\n const centerAbsPos = new Vector3(e.cx * selectedElement.lx, e.cy * selectedElement.ly).applyEuler(\r\n euler,\r\n );\r\n centerAbsPos.add(foundationCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const isHumanOrPlant = (type: ObjectType) => {\r\n return type === ObjectType.Human || type === ObjectType.Tree || type === ObjectType.Flower;\r\n };\r\n\r\n const handleTempHumanPlantChild = (state: CommonStoreState, parentId: string) => {\r\n if (state.tempHumanPlant.length === 0) {\r\n const temp = state.elements.filter((e) => {\r\n return isHumanOrPlant(e.type) && Util.isDescendantOf(e, parentId);\r\n });\r\n state.tempHumanPlant = temp;\r\n const set = new Set(temp.map((e) => e.id));\r\n state.elements = state.elements.filter((e) => !set.has(e.id));\r\n }\r\n };\r\n\r\n /** self, child and group Master group exclusive */\r\n const getFirstStackableCuboid = (e: ThreeEvent, currId: string) => {\r\n const firstIntersectedCuboidObject = e.intersections.find((intersect) => {\r\n const obj = intersect.eventObject;\r\n if (!obj.name.includes('Cuboid')) return false;\r\n const nameArray = obj.name.split(' ');\r\n if (nameArray.length !== 2) return false;\r\n return nameArray[1] !== currId && obj.userData.stackable;\r\n });\r\n\r\n if (!firstIntersectedCuboidObject) return undefined;\r\n\r\n const firstIntersectedCuboidObjectId = firstIntersectedCuboidObject.eventObject.name.split(' ')[1];\r\n\r\n if (baseGroupRelPosMapRef.current.has(firstIntersectedCuboidObjectId)) return undefined;\r\n\r\n return Util.isChild(currId, firstIntersectedCuboidObjectId) ? undefined : firstIntersectedCuboidObject;\r\n };\r\n\r\n const handleGroundPointerMove = (e: ThreeEvent) => {\r\n if (grabRef.current && grabRef.current.type && !grabRef.current.locked) {\r\n setRayCast(e);\r\n let intersects;\r\n switch (grabRef.current.type) {\r\n case ObjectType.Foundation:\r\n if (intersectionPlaneRef.current) {\r\n intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n if (moveHandleType) {\r\n handleMove(intersects[0].point);\r\n } else if (resizeHandleType) {\r\n handleResize(intersects[0].point);\r\n } else if (rotateHandleType) {\r\n handleRotate(intersects[0].point);\r\n }\r\n }\r\n }\r\n break;\r\n case ObjectType.Cuboid:\r\n if (intersectionPlaneRef.current) {\r\n if (intersectionPlaneType === IntersectionPlaneType.Horizontal) {\r\n intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point.clone();\r\n const firstIntersectedCuboidObject = getFirstStackableCuboid(e, grabRef.current.id);\r\n if (moveHandleType) {\r\n if (baseGroupRelPosMapRef.current.size > 1) {\r\n handleMove(p);\r\n } else if (firstIntersectedCuboidObject) {\r\n intersects = ray.intersectObjects([firstIntersectedCuboidObject.eventObject]);\r\n if (intersects.length === 0) return;\r\n p.copy(intersects[0].point).add(moveHandleWorldDiffV3Ref.current);\r\n const newParentId = firstIntersectedCuboidObject.eventObject.name.split(' ')[1];\r\n setCommonStore((state) => {\r\n // todo: move grouped cuboid\r\n const cuboid = state.elements.find((e) => e.id === state.selectedElement?.id);\r\n const selectedElement = state.selectedElement; // old cuboid\r\n if (cuboid && selectedElement) {\r\n const { pos: parentAbsPos, rot: parentAbsRot } = Util.getWorldDataById(newParentId);\r\n const diff = new Vector3().subVectors(p, parentAbsPos);\r\n diff.applyEuler(new Euler(0, 0, -parentAbsRot));\r\n cuboid.cx = diff.x;\r\n cuboid.cy = diff.y;\r\n if (selectedElement.parentId !== newParentId) {\r\n if (cuboid.parentId !== newParentId) {\r\n handleTempHumanPlantChild(state, cuboid.id);\r\n }\r\n const { rot: currAbsRot } = Util.getWorldDataById(selectedElement.id);\r\n cuboid.rotation[2] = currAbsRot - parentAbsRot;\r\n cuboid.parentId = newParentId;\r\n } else if (cuboid.parentId !== newParentId) {\r\n if (cuboid.parentId !== selectedElement.parentId) {\r\n handleTempHumanPlantChild(state, cuboid.id);\r\n }\r\n cuboid.parentId = selectedElement.parentId;\r\n cuboid.rotation[2] = selectedElement.rotation[2];\r\n }\r\n }\r\n });\r\n } else {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === grabRef.current!.id);\r\n if (cuboid && cuboid.parentId !== GROUND_ID) {\r\n if (cuboid.parentId !== GROUND_ID) {\r\n handleTempHumanPlantChild(state, cuboid.id);\r\n }\r\n const { rot: parentAbsRot } = Util.getWorldDataById(cuboid.parentId);\r\n cuboid.rotation[2] += parentAbsRot;\r\n cuboid.parentId = GROUND_ID;\r\n }\r\n });\r\n handleMove(p);\r\n }\r\n } else if (resizeHandleType) {\r\n const cuboid = getElementById(grabRef.current.id);\r\n if (cuboid && cuboid.parentId === GROUND_ID) {\r\n handleResize(p);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // add drag and draw element\r\n if (groundPlaneRef.current) {\r\n // add new element\r\n if (objectTypeToAdd !== ObjectType.None) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([groundPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point;\r\n switch (objectTypeToAdd) {\r\n case ObjectType.Foundation: {\r\n const foundation = addElement(groundModel, p);\r\n if (foundation) {\r\n setCommonStore((state) => {\r\n state.addedFoundationId = foundation.id;\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n grabRef.current = foundation;\r\n isSettingFoundationStartPointRef.current = true;\r\n }\r\n break;\r\n }\r\n case ObjectType.Cuboid: {\r\n const cuboid = addElement(groundModel, p);\r\n if (cuboid) {\r\n setCommonStore((state) => {\r\n state.addedCuboidId = cuboid.id;\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n grabRef.current = cuboid;\r\n isSettingCuboidStartPointRef.current = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // setting start point\r\n if (grabRef.current && (isSettingFoundationStartPointRef.current || isSettingCuboidStartPointRef.current)) {\r\n setRayCast(e);\r\n let intersects = ray.intersectObjects([groundPlaneRef.current]);\r\n if (intersects.length === 0) return;\r\n const p = intersects[0].point;\r\n if (grabRef.current.type === ObjectType.Foundation) {\r\n setElementPosition(grabRef.current.id, p.x, p.y);\r\n } else if (grabRef.current.type === ObjectType.Cuboid) {\r\n const firstIntersectedCuboidObject = getFirstStackableCuboid(e, grabRef.current.id);\r\n if (firstIntersectedCuboidObject) {\r\n intersects = ray.intersectObjects([firstIntersectedCuboidObject.eventObject]);\r\n if (intersects.length === 0) return;\r\n p.copy(intersects[0].point);\r\n const newParentId = firstIntersectedCuboidObject.eventObject.name.split(' ')[1];\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === grabRef.current?.id);\r\n if (cuboid) {\r\n const { pos: parentAbsPos, rot: parentAbsRot } = Util.getWorldDataById(newParentId);\r\n const diff = new Vector3().subVectors(p, parentAbsPos);\r\n diff.applyEuler(new Euler(0, 0, -parentAbsRot));\r\n cuboid.cx = diff.x;\r\n cuboid.cy = diff.y;\r\n cuboid.parentId = newParentId;\r\n cuboid.rotation[2] = -parentAbsRot;\r\n }\r\n });\r\n } else {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === grabRef.current?.id);\r\n if (cuboid && cuboid.parentId !== GROUND_ID) {\r\n const { rot: parentAbsRot } = Util.getWorldDataById(cuboid.parentId);\r\n cuboid.rotation[2] += parentAbsRot;\r\n cuboid.parentId = GROUND_ID;\r\n }\r\n });\r\n setElementPosition(grabRef.current.id, p.x, p.y);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleIntersectionPointerMove = (e: ThreeEvent) => {\r\n if (grabRef.current && grabRef.current.type && !grabRef.current.locked) {\r\n setRayCast(e);\r\n let intersects;\r\n if (intersectionPlaneRef.current && intersectionPlaneType === IntersectionPlaneType.Vertical) {\r\n intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects && intersects.length > 0) {\r\n const p = intersects[0].point;\r\n switch (grabRef.current.type) {\r\n case ObjectType.Tree:\r\n const tree = grabRef.current as TreeModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Top:\r\n updateElementLzById(tree.id, p.z);\r\n setCommonStore((state) => {\r\n state.selectedElementHeight = Math.max(1, p.z);\r\n });\r\n break;\r\n // TODO: Need to move on a plane parallel to the direction from the handle to the tree center\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n case ResizeHandleType.Upper:\r\n case ResizeHandleType.Lower:\r\n updateElementLxById(tree.id, 2 * Math.hypot(p.x - tree.cx, p.y - tree.cy));\r\n break;\r\n }\r\n handlePlantOrHumanRefMove(useRefStore.getState().treeRef, e);\r\n break;\r\n case ObjectType.Flower: {\r\n handlePlantOrHumanRefMove(useRefStore.getState().flowerRef, e);\r\n break;\r\n }\r\n case ObjectType.Human: {\r\n handlePlantOrHumanRefMove(useRefStore.getState().humanRef, e);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n // only these elements are allowed to be on the ground\r\n const legalOnGround = (type: ObjectType) => {\r\n return (\r\n type === ObjectType.Foundation ||\r\n type === ObjectType.Cuboid ||\r\n type === ObjectType.Tree ||\r\n type === ObjectType.Flower ||\r\n type === ObjectType.Human\r\n );\r\n };\r\n\r\n // The snapping of foundations and cuboids are really unnecessary because they can have arbitrary azimuths.\r\n // So if we have one vertex snapping to the grid, the other three most likely will be knocked off if the azimuth\r\n // is not 0, 90, 180, or 270 degrees. Snapping is only useful in those special cases. I decided not to bother\r\n // to make it work for those cases because the gain is too small to complicate the code.\r\n //\r\n // const positionOnGrid = (p: Vector3) => {\r\n // return useStore.getState().enableFineGrid ? snapToFineGrid(p) : snapToNormalGrid(p);\r\n // };\r\n //\r\n // const snapToNormalGrid = (v: Vector3) => {\r\n // const scale = Math.floor(useStore.getState().sceneRadius / 50) + 1;\r\n // return new Vector3(Math.round(v.x / scale) * scale, Math.round(v.y / scale) * scale, v.z);\r\n // };\r\n //\r\n // const snapToFineGrid = (v: Vector3) => {\r\n // const scale = (Math.floor(useStore.getState().sceneRadius / 50) + 1) * FINE_GRID_SCALE;\r\n // const x = parseFloat((Math.round(v.x / scale) * scale).toFixed(1));\r\n // const y = parseFloat((Math.round(v.y / scale) * scale).toFixed(1));\r\n // return new Vector3(x, y, v.z);\r\n // };\r\n\r\n const handleHumanAndPlantPositionFixedOnParent = (\r\n object: Object3D | null | undefined,\r\n lx: number,\r\n ly: number,\r\n parentWorldPosition: Vector3,\r\n parentWorldRotation: number,\r\n ) => {\r\n if (!object) return;\r\n for (const child of object.children) {\r\n if (child.name.includes('Human') || child.name.includes('Tree') || child.name.includes('Flower')) {\r\n const childId = getObjectId(child);\r\n const worldPos = absPosMapRef.current.get(childId);\r\n if (worldPos) {\r\n // top face\r\n if (Math.abs(oldDimensionRef.current.z / 2 - child.position.z) < 0.01) {\r\n const relativePos = new Vector3()\r\n .subVectors(worldPos, parentWorldPosition)\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n child.position.setX(relativePos.x);\r\n child.position.setY(relativePos.y);\r\n }\r\n // side face\r\n else {\r\n const relativePos = new Vector3()\r\n .subVectors(worldPos, oldPositionRef.current)\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n const d = new Vector3().subVectors(parentWorldPosition, oldPositionRef.current);\r\n const v = new Vector3().subVectors(relativePos, d);\r\n // west and east face\r\n if (Math.abs(relativePos.x / oldDimensionRef.current.x) > 0.49) {\r\n child.position.setX((relativePos.x > 0 ? lx : -lx) / 2);\r\n child.position.setY(v.y);\r\n }\r\n // north and south face\r\n else if (Math.abs(relativePos.y / oldDimensionRef.current.y) > 0.49) {\r\n child.position.setX(v.x);\r\n child.position.setY((relativePos.y > 0 ? ly : -ly) / 2);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleResize = (p: Vector3) => {\r\n if (!grabRef.current) return;\r\n const point = new Vector2(p.x, p.y);\r\n const anchor = new Vector2(resizeAnchor.x, resizeAnchor.y);\r\n const distance = anchor.distanceTo(point);\r\n const angle = Math.atan2(point.x - resizeAnchor.x, point.y - resizeAnchor.y) + grabRef.current.rotation[2];\r\n const lx = Math.abs(distance * Math.sin(angle));\r\n const ly = Math.abs(distance * Math.cos(angle));\r\n const center = new Vector2().addVectors(point, anchor).multiplyScalar(0.5);\r\n setCommonStore((state) => {\r\n if (!grabRef.current) return;\r\n let sizeOk = false;\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current.id) {\r\n switch (e.type) {\r\n case ObjectType.Cuboid: // we can only deal with the top surface of a cuboid now\r\n case ObjectType.Foundation:\r\n const children = getChildren(e.id);\r\n if (children.length > 0) {\r\n // basically, we have to create a copy of parent and children, set them to the new values,\r\n // check if the new values are OK, proceed to change the original elements in\r\n // the common store only when they are OK.\r\n const childrenClone: ElementModel[] = [];\r\n for (const c of children) {\r\n if (Util.isPlantOrHuman(c)) continue;\r\n const childClone = JSON.parse(JSON.stringify(c));\r\n childrenClone.push(childClone);\r\n if (Util.isIdentical(childClone.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n if (c.type === ObjectType.Wall) {\r\n const wallAbsPos = wallsAbsPosMapRef.current.get(c.id);\r\n if (wallAbsPos) {\r\n const a = -e.rotation[2];\r\n const { centerPointAbsPos, leftPointAbsPos, rightPointAbsPos } = wallAbsPos;\r\n const centerPointRelativePos = new Vector2()\r\n .subVectors(centerPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n const leftPointRelativePos = new Vector2()\r\n .subVectors(leftPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n const rightPointRelativePos = new Vector2()\r\n .subVectors(rightPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n childClone.cy = centerPointRelativePos.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n childClone.cx = centerPointRelativePos.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n childClone.cx = centerPointRelativePos.x;\r\n childClone.cy = centerPointRelativePos.y;\r\n break;\r\n }\r\n childClone.leftPoint = [leftPointRelativePos.x, leftPointRelativePos.y, 0];\r\n childClone.rightPoint = [rightPointRelativePos.x, rightPointRelativePos.y, 0];\r\n }\r\n } else {\r\n const centerAbsPos = absPosMapRef.current.get(c.id);\r\n if (centerAbsPos) {\r\n const a = -e.rotation[2];\r\n const relativePos = new Vector2()\r\n .subVectors(new Vector2(centerAbsPos.x, centerAbsPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n childClone.cy = relativePos.y / ly;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n childClone.cx = relativePos.x / lx;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n childClone.cx = relativePos.x / lx;\r\n childClone.cy = relativePos.y / ly;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n const parentClone = JSON.parse(JSON.stringify(e)) as ElementModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n parentClone.ly = ly;\r\n parentClone.cy = center.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n parentClone.lx = lx;\r\n parentClone.cx = center.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n parentClone.lx = lx;\r\n parentClone.ly = ly;\r\n parentClone.cx = center.x;\r\n parentClone.cy = center.y;\r\n break;\r\n }\r\n if (Util.doesParentContainAllChildren(parentClone, childrenClone)) {\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.ly = ly;\r\n e.cy = center.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.lx = lx;\r\n e.cx = center.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.lx = lx;\r\n e.ly = ly;\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n break;\r\n }\r\n sizeOk = true;\r\n }\r\n } else {\r\n // any size is okay for a childless parent\r\n if (lx > 0.49 && ly > 0.49) {\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.ly = ly;\r\n e.cy = center.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.lx = lx;\r\n e.cx = center.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.lx = lx;\r\n e.ly = ly;\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n break;\r\n }\r\n sizeOk = true;\r\n }\r\n }\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n // if the new size is okay, we can then change the relative positions of the children.\r\n if (sizeOk) {\r\n for (const e of state.elements) {\r\n if (e.parentId === grabRef.current!.id) {\r\n switch (e.type) {\r\n case ObjectType.Wall:\r\n const wall = e as WallModel;\r\n const wallAbsPos = wallsAbsPosMapRef.current.get(e.id);\r\n if (wallAbsPos) {\r\n const a = -grabRef.current!.rotation[2];\r\n const { centerPointAbsPos, leftPointAbsPos, rightPointAbsPos } = wallAbsPos;\r\n const centerPointRelativePos = new Vector2()\r\n .subVectors(centerPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n const leftPointRelativePos = new Vector2()\r\n .subVectors(leftPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n const rightPointRelativePos = new Vector2()\r\n .subVectors(rightPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.cy = centerPointRelativePos.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.cx = centerPointRelativePos.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.cx = centerPointRelativePos.x;\r\n e.cy = centerPointRelativePos.y;\r\n break;\r\n }\r\n wall.leftPoint = [leftPointRelativePos.x, leftPointRelativePos.y, 0];\r\n wall.rightPoint = [rightPointRelativePos.x, rightPointRelativePos.y, 0];\r\n }\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n const centerAbsPos = absPosMapRef.current.get(e.id);\r\n if (centerAbsPos) {\r\n const relativePos = new Vector2()\r\n .subVectors(new Vector2(centerAbsPos.x, centerAbsPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.cy = relativePos.y / ly;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.cx = relativePos.x / lx;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.cx = relativePos.x / lx;\r\n e.cy = relativePos.y / ly;\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n case ObjectType.Cuboid: {\r\n const centerAbsPos = absPosMapRef.current.get(e.id);\r\n if (centerAbsPos) {\r\n const relativePos = new Vector2()\r\n .subVectors(new Vector2(centerAbsPos.x, centerAbsPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.cy = relativePos.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.cx = relativePos.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.cx = relativePos.x;\r\n e.cy = relativePos.y;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case ObjectType.Polygon:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n const polygon = e as PolygonModel;\r\n const verticesAbsPos = polygonsAbsPosMapRef.current.get(polygon.id);\r\n if (verticesAbsPos) {\r\n const newVertices: Point2[] = [];\r\n verticesAbsPos.forEach((v) => {\r\n const relativePos = new Vector2()\r\n .subVectors(v, center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n newVertices.push({ x: relativePos.x / lx, y: relativePos.y / ly } as Point2);\r\n });\r\n polygon.vertices = newVertices;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (\r\n e.foundationId === grabRef.current.id &&\r\n e.type === ObjectType.SolarPanel &&\r\n (e as SolarPanelModel).parentType === ObjectType.Roof\r\n ) {\r\n const centerAbsPos = absPosMapRef.current.get(e.id);\r\n if (centerAbsPos) {\r\n const relativePos = new Vector2()\r\n .subVectors(new Vector2(centerAbsPos.x, centerAbsPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.cy = relativePos.y / ly;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.cx = relativePos.x / lx;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.cx = relativePos.x / lx;\r\n e.cy = relativePos.y / ly;\r\n break;\r\n }\r\n }\r\n }\r\n if (\r\n e.foundationId === grabRef.current.id &&\r\n e.type === ObjectType.Window &&\r\n (e as WindowModel).parentType === ObjectType.Roof\r\n ) {\r\n const centerPos = absPosMapRef.current.get(e.id);\r\n if (centerPos) {\r\n const relPosToFoundation = new Vector2()\r\n .subVectors(new Vector2(centerPos.x, centerPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n e.cx = relPosToFoundation.x;\r\n e.cy = relPosToFoundation.y;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n switch (grabRef.current.type) {\r\n case ObjectType.Foundation:\r\n const foundationRef = useRefStore.getState().foundationRef;\r\n if (foundationRef?.current) {\r\n handleHumanAndPlantPositionFixedOnParent(\r\n foundationRef?.current,\r\n lx,\r\n ly,\r\n foundationRef.current.position,\r\n grabRef.current.rotation[2],\r\n );\r\n }\r\n break;\r\n case ObjectType.Cuboid:\r\n const cuboidRef = useRefStore.getState().cuboidRef;\r\n if (cuboidRef?.current && cuboidRef.current.parent) {\r\n handleHumanAndPlantPositionFixedOnParent(\r\n cuboidRef?.current,\r\n lx,\r\n ly,\r\n cuboidRef.current.parent.position,\r\n grabRef.current.rotation[2],\r\n );\r\n }\r\n break;\r\n }\r\n };\r\n\r\n const handleRotate = (p: Vector3) => {\r\n const { cx, cy } = grabRef.current!;\r\n const rotation = Math.atan2(cx - p.x, p.y - cy) + (rotateHandleType === RotateHandleType.Upper ? 0 : Math.PI);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0;\r\n setElementRotation(grabRef.current!.id, 0, 0, rotation + offset);\r\n };\r\n\r\n const handleMove = (p: Vector3) => {\r\n const isMultipleMove = baseGroupRelPosMapRef.current.size > 1;\r\n if (isMultipleMove) {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && baseGroupRelPosMapRef.current.has(elem.id)) {\r\n const v = baseGroupRelPosMapRef.current.get(elem.id);\r\n if (v) {\r\n elem.cx = p.x + v.x;\r\n elem.cy = p.y + v.y;\r\n }\r\n }\r\n }\r\n });\r\n return;\r\n }\r\n let x0, y0;\r\n const hx = grabRef.current!.lx / 2;\r\n const hy = grabRef.current!.ly / 2;\r\n switch (moveHandleType) {\r\n case MoveHandleType.Top: {\r\n if (isMultipleMove) {\r\n const center = new Vector3(p.x, p.y);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, p.x, p.y);\r\n }\r\n break;\r\n }\r\n case MoveHandleType.Upper:\r\n x0 = p.x + sinAngle * hy;\r\n y0 = p.y - cosAngle * hy;\r\n if (isMultipleMove) {\r\n const center = new Vector3(x0, y0);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n }\r\n break;\r\n case MoveHandleType.Lower:\r\n x0 = p.x - sinAngle * hy;\r\n y0 = p.y + cosAngle * hy;\r\n if (isMultipleMove) {\r\n const center = new Vector3(x0, y0);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n }\r\n break;\r\n case MoveHandleType.Left:\r\n x0 = p.x + cosAngle * hx;\r\n y0 = p.y + sinAngle * hx;\r\n if (isMultipleMove) {\r\n const center = new Vector3(x0, y0);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n }\r\n break;\r\n case MoveHandleType.Right:\r\n x0 = p.x - cosAngle * hx;\r\n y0 = p.y - sinAngle * hx;\r\n if (isMultipleMove) {\r\n const center = new Vector3(x0, y0);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n }\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {grabRef.current && intersectionPlaneType !== IntersectionPlaneType.Ground && (\r\n \r\n \r\n \r\n )}\r\n \r\n {showSolarRadiationHeatmap && !waterSurface ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Ground);\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport GlowImage from '../resources/glow.png';\n\nimport { Util } from '../Util';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n AdditiveBlending,\n BufferAttribute,\n BufferGeometry,\n DoubleSide,\n EllipseCurve,\n Euler,\n FontLoader,\n Plane,\n TextGeometryParameters,\n Vector3,\n} from 'three';\nimport {\n computeDeclinationAngle,\n computeHourAngleAtMinute,\n computeSunLocation,\n computeSunriseAndSunsetInMinutes,\n TILT_ANGLE,\n} from '../analysis/sunTools';\nimport { Line, Plane as Drei_Plane, useTexture } from '@react-three/drei';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { useLoader } from '@react-three/fiber';\nimport helvetikerFont from '../fonts/helvetiker_regular.typeface.fnt';\nimport { HALF_PI, TWO_PI, UNIT_VECTOR_POS_Y, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\n\nconst HOUR_DIVISIONS = 48;\nconst BASE_DIVISIONS = 72;\nconst DECLINATION_DIVISIONS = 12;\n\ninterface HeliodonProps {\n date: Date;\n hourAngle: number;\n declinationAngle: number;\n worldLatitude: number;\n}\n\nconst Heliodon = ({ date, hourAngle, declinationAngle, worldLatitude }: HeliodonProps) => {\n const radius = useStore(Selector.sceneRadius);\n const showSunAngles = useStore(Selector.viewState.showSunAngles);\n const showAzimuthAngle = useStore(Selector.viewState.showAzimuthAngle) ?? true;\n const showElevationAngle = useStore(Selector.viewState.showElevationAngle) ?? true;\n const showZenithAngle = useStore(Selector.viewState.showZenithAngle) ?? true;\n\n const [latitude, setLatitude] = useState(Util.toRadians(42));\n const glowTexture = useTexture(GlowImage);\n\n const angleArcRadius = Math.max(2, radius * 0.2);\n const angleLabelHeight = Math.max(0.4, radius * 0.025);\n const font = useLoader(FontLoader, helvetikerFont);\n const fontSize = radius * 0.05;\n const textGeometryParams = {\n font: font,\n height: 0,\n size: fontSize,\n } as TextGeometryParameters;\n\n const nLabels = 6;\n const tickLabels = new Array(2 * nLabels + 1).fill(0);\n\n const getOffset = (i: number) => {\n if (i === 0) {\n return -fontSize * 0.3;\n } else if (i > 0 && i < 7) {\n return -fontSize * 0.8;\n } else {\n return -fontSize * 1.2;\n }\n };\n\n useEffect(() => {\n setLatitude(Util.toRadians(worldLatitude));\n }, [worldLatitude]);\n\n const nRibLines = 6;\n\n const [baseGeometry, lineGeometry] = useMemo(() => {\n const baseGeometry = new BufferGeometry();\n const lineGeometry = new BufferGeometry();\n const basePoints: Vector3[] = [];\n const tickPoints: Vector3[] = [];\n const step = TWO_PI / BASE_DIVISIONS;\n let counter = 0;\n for (let angle = 0; angle < TWO_PI + step / 2.0; angle += step) {\n const theta = Math.min(angle, TWO_PI);\n let width = 0.05 * radius;\n // TODO: This is inefficient. We should use indexed buffer to share vertices\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius, theta, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius + width, theta, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius, theta + step, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius + width, theta, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius + width, theta + step, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius, theta + step, 0)));\n let p;\n if (TWO_PI - theta > ZERO_TOLERANCE) {\n width = 0.05 * radius + (counter % 3 === 0 ? 0.2 : 0);\n p = new Vector3(radius, theta, 0);\n p.z = 0.002;\n tickPoints.push(Util.sphericalToCartesianZ(p));\n p = new Vector3(radius + width, theta, 0);\n p.z = 0.002;\n tickPoints.push(Util.sphericalToCartesianZ(p));\n }\n counter++;\n }\n\n // attributes\n const length = basePoints.length * 3;\n const basePositions = new Float32Array(length);\n const baseNormals = new Float32Array(length);\n const baseColors = new Float32Array(length);\n\n for (let i = 0; i < basePoints.length; i++) {\n const j = i * 3;\n basePositions[j] = basePoints[i].x;\n basePositions[j + 1] = basePoints[i].y;\n basePositions[j + 2] = basePoints[i].z;\n baseNormals[j] = 0;\n baseNormals[j + 1] = 1;\n baseNormals[j + 2] = 0;\n const c = Math.floor(i / 18) % 2 === 0 ? 0.2 : 1.0;\n baseColors[j] = c;\n baseColors[j + 1] = c;\n baseColors[j + 2] = c;\n }\n\n baseGeometry.setAttribute('position', new BufferAttribute(basePositions, 3));\n baseGeometry.setAttribute('normal', new BufferAttribute(baseNormals, 3));\n baseGeometry.setAttribute('color', new BufferAttribute(baseColors, 3));\n lineGeometry.setFromPoints(tickPoints);\n\n return [baseGeometry, lineGeometry];\n }, [radius]);\n\n const sunPathPoints = useMemo(() => {\n const points = [];\n const sunMinutes = computeSunriseAndSunsetInMinutes(date, Util.toDegrees(latitude));\n const min = computeHourAngleAtMinute(sunMinutes.sunrise);\n const max = computeHourAngleAtMinute(sunMinutes.sunset);\n const step = (max - min) / HOUR_DIVISIONS;\n for (let h = min; h < max + step / 2; h += step) {\n const v = computeSunLocation(radius, h, declinationAngle, latitude);\n if (v.z > -0.01) {\n points.push(v);\n }\n }\n return points;\n }, [latitude, radius, declinationAngle]);\n\n const getSunPathPointsByDate = (day: Date) => {\n const decline = computeDeclinationAngle(day);\n const points = [];\n const sunMinutes = computeSunriseAndSunsetInMinutes(day, Util.toDegrees(latitude));\n const min = computeHourAngleAtMinute(sunMinutes.sunrise);\n const max = computeHourAngleAtMinute(sunMinutes.sunset);\n const step = (max - min) / HOUR_DIVISIONS;\n for (let h = min; h < max + step / 2; h += step) {\n const v = computeSunLocation(radius, h, decline, latitude);\n if (v.z > -0.01) {\n points.push(v);\n }\n }\n return points;\n };\n\n const pointArraySunPaths = useMemo(() => {\n const arr = [];\n for (let i = 0; i <= nRibLines; i++) {\n const day = new Date(2021, i === 0 ? 11 : i - 1, 22);\n arr.push(getSunPathPointsByDate(day));\n }\n return arr;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [latitude, radius]);\n\n const sunPosition = useMemo(() => {\n return computeSunLocation(radius, hourAngle, declinationAngle, latitude);\n }, [latitude, declinationAngle, hourAngle, radius]);\n\n const sunDirection = useMemo(() => {\n return sunPosition.clone().normalize();\n }, [sunPosition]);\n\n const sunDirectionOnGround = useMemo(() => {\n return new Vector3(sunPosition.x, sunPosition.y, 0).normalize();\n }, [sunPosition]);\n\n const elevationAngle = useMemo(() => {\n return Math.asin(sunPosition.z / sunPosition.length());\n }, [sunPosition]);\n\n const elevationAngleArcPoints = useMemo(() => {\n const curve = new EllipseCurve(0, 0, angleArcRadius, angleArcRadius, 0, elevationAngle, false, 0);\n const points = curve.getPoints(25);\n const points3D = new Array();\n for (const p of points) {\n points3D.push(new Vector3(p.x, p.y, 0));\n }\n return points3D;\n }, [elevationAngle, sunPosition]);\n\n const zenithAngle = useMemo(() => {\n return Math.acos(sunPosition.z / sunPosition.length());\n }, [sunPosition]);\n\n const zenithAngleArcPoints = useMemo(() => {\n const curve = new EllipseCurve(0, 0, angleArcRadius * 0.8, angleArcRadius * 0.8, elevationAngle, HALF_PI, false, 0);\n const points = curve.getPoints(25);\n const points3D = new Array();\n for (const p of points) {\n points3D.push(new Vector3(p.x, p.y, 0));\n }\n return points3D;\n }, [zenithAngle, sunPosition]);\n\n const azimuthAngle = useMemo(() => {\n const a = Math.acos(sunPosition.y / Math.hypot(sunPosition.x, sunPosition.y));\n return sunPosition.x > 0 ? -a : a;\n }, [sunPosition]);\n\n const azimuthAngleArcPoints = useMemo(() => {\n const curve = new EllipseCurve(\n 0,\n 0,\n angleArcRadius * 1.2,\n angleArcRadius * 1.2,\n HALF_PI,\n HALF_PI + azimuthAngle,\n sunPosition.x > 0,\n 0,\n );\n const points = curve.getPoints(50);\n const points3D = new Array();\n for (const p of points) {\n points3D.push(new Vector3(p.x, p.y, 0));\n }\n return points3D;\n }, [azimuthAngle, sunPosition]);\n\n const sunbeltGeometry = useMemo(() => {\n const declinationStep = (2.0 * TILT_ANGLE) / DECLINATION_DIVISIONS;\n const hourStep = TWO_PI / HOUR_DIVISIONS;\n const geometry = new BufferGeometry();\n let verticesCount = 0;\n const vertices: Vector3[] = [];\n const indices = [];\n for (let d = -TILT_ANGLE; d < TILT_ANGLE - declinationStep / 2.0; d += declinationStep) {\n for (let h = -Math.PI; h < Math.PI - hourStep / 2.0; h += hourStep) {\n let h2 = h + hourStep;\n let d2 = d + declinationStep;\n if (h2 > Math.PI) {\n h2 = Math.PI;\n }\n if (d2 > TILT_ANGLE) {\n d2 = TILT_ANGLE;\n }\n const v1 = computeSunLocation(radius, h, d, latitude);\n const v2 = computeSunLocation(radius, h2, d, latitude);\n const v3 = computeSunLocation(radius, h2, d2, latitude);\n const v4 = computeSunLocation(radius, h, d2, latitude);\n if (v1.z >= 0 || v2.z >= 0 || v3.z >= 0 || v4.z >= 0) {\n vertices.push(v1, v2, v3, v4);\n indices.push(verticesCount);\n indices.push(verticesCount + 1);\n indices.push(verticesCount + 2);\n indices.push(verticesCount);\n indices.push(verticesCount + 2);\n indices.push(verticesCount + 3);\n verticesCount += 4;\n }\n }\n }\n geometry.setFromPoints(vertices);\n geometry.setIndex(new BufferAttribute(new Uint16Array(indices), 1));\n return geometry;\n }, [latitude, radius]);\n\n const sunRadius = 0.05 * radius;\n const haloRadius = 2 + 5 * sunRadius;\n\n return (\n \n {tickLabels.map((v, i) => {\n let times = Math.ceil(i / 2) * (i % 2 === 0 ? 1 : -1);\n if (times === -nLabels) times = nLabels;\n const offset = getOffset(Math.abs(times));\n return (\n \n \n \n \n \n \n );\n })}\n \n {/* draw base */}\n \n \n \n \n \n \n \n \n {/* draw sun path*/}\n \n {sunPathPoints.length > 3 && }\n {pointArraySunPaths\n .filter((a) => a.length > 3)\n .map((a, index) => {\n return (\n \n );\n })}\n \n \n \n {/* simple glow effect to create a halo */}\n \n \n \n \n \n \n \n \n \n \n \n {/* use this plane to hide the uneven edge */}\n \n \n \n {showSunAngles && sunPosition.z > 0 && (\n <>\n \n \n \n {showElevationAngle && (\n <>\n \n \n \n )}\n {showZenithAngle && (\n <>\n \n \n \n )}\n {showAzimuthAngle && (\n <>\n \n \n \n )}\n \n )}\n \n );\n};\n\nexport default React.memo(Heliodon);\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Util } from '../Util';\r\nimport React, { useEffect, useMemo } from 'react';\r\nimport { computeDeclinationAngle, computeHourAngle, computeSunLocation } from '../analysis/sunTools';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport Heliodon from './heliodon';\r\n\r\nconst HeliodonWrapper = () => {\r\n const heliodon = useStore(Selector.viewState.heliodon);\r\n const heliodonRadius = useStore(Selector.sceneRadius);\r\n const worldLatitude = useStore(Selector.world.latitude);\r\n const dateString = useStore(Selector.world.date);\r\n const setSunlightDirection = useStore(Selector.setSunlightDirection);\r\n\r\n const date = useMemo(() => new Date(dateString), [dateString]);\r\n\r\n const [hourAngle, declinationAngle] = useMemo(() => [computeHourAngle(date), computeDeclinationAngle(date)], [date]);\r\n\r\n useEffect(() => {\r\n setSunlightDirection(\r\n computeSunLocation(heliodonRadius, hourAngle, declinationAngle, Util.toRadians(worldLatitude)),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [worldLatitude, hourAngle, declinationAngle, heliodonRadius]);\r\n\r\n return (\r\n <>\r\n {heliodon && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(HeliodonWrapper);\r\n","export default __webpack_public_path__ + \"static/media/ifi-logo.eb360016.png\";","export default __webpack_public_path__ + \"static/media/magic-lamp.b58f942d.png\";","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\nimport { Language } from './types';\n\nexport interface TeamProps {\n top: number;\n height?: number;\n color?: string;\n}\n\nconst Team = ({ top, height, color }: TeamProps) => {\n const language = useStore(Selector.language);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const linePos = top + 56 + 'px';\n const top100 = top + 100 + 'px';\n const top200 = top + 205 + 'px';\n\n return (\n
\n \n

{i18n.t('aboutUs.ProductBroughtToYouBy', lang)}

\n

\n \n {i18n.t('aboutUs.TermsOfService', lang)}\n \n    |   \n \n {i18n.t('aboutUs.PrivacyPolicy', lang)}\n \n

\n
\n
\n \n \n \n \n \n

{i18n.t('aboutUs.Software', lang)}

\n Charles Xie\n
\n Xiaotong Ding\n
\n \n \n

{i18n.t('aboutUs.Content', lang)}

\n Rundong Jiang\n
\n Charles Xie\n
\n \n \n

{i18n.t('aboutUs.Support', lang)}

\n Rundong Jiang\n
\n Charles Xie\n
\n \n \n \n \n
\n \n {i18n.t('aboutUs.Translators', lang)}: {Language.Ukrainian} (Andriy Kashyrskyy), {Language.Spanish} (Alex\n Barco), {Language.Turkish} (Hasan Bircan)\n
\n
\n {i18n.t('aboutUs.Acknowledgment', lang)}: {i18n.t('aboutUs.FundingInformation', lang)}{' '}\n {i18n.t('aboutUs.Contact', lang)}\n \n \n );\n};\n\nexport default React.memo(Team);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport styled from 'styled-components';\nimport Team from './team';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\n\nconst Container = styled.div`\n position: absolute;\n top: 80px;\n left: 10px;\n display: flex;\n width: 600px;\n height: 400px;\n flex-direction: column;\n align-items: center;\n z-index: 1001;\n border-radius: 10px;\n background: dimgray;\n box-shadow: 3px 3px 3px 3px black;\n`;\n\nconst About = ({ close }: { close: () => void }) => {\n const language = useStore(Selector.language);\n return (\n \n \n {\n close();\n }}\n >\n {i18n.t('word.Close', { lng: language })}\n \n \n );\n};\n\nexport default React.memo(About);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { InputNumber, Menu, Select, Space } from 'antd';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { useDataStore } from '../../../stores/commonData';\n\nconst CspSimulationSettings = ({ name }: { name: string }) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const cspTimesPerHour = useStore(Selector.world.cspTimesPerHour);\n const cspDaysPerYear = useStore(Selector.world.cspDaysPerYear);\n const cspGridCellSize = useStore(Selector.world.cspGridCellSize);\n\n const lang = { lng: language };\n const { SubMenu } = Menu;\n const { Option } = Select;\n\n return (\n \n \n \n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.cspTimesPerHour = value;\n });\n }}\n >\n {/* sampling interval must be a factor of 60 (e.g., 8 is not)*/}\n \n \n \n \n \n \n \n \n {i18n.t('menu.option.TimesPerHour', lang)}\n \n \n {\n setCommonStore((state) => {\n state.world.cspDaysPerYear = value;\n });\n // clear the results stored in the common store\n useDataStore.setState((state) => {\n state.yearlyParabolicTroughYield = [];\n state.yearlyParabolicDishYield = [];\n state.yearlyFresnelReflectorYield = [];\n state.yearlyHeliostatYield = [];\n });\n }}\n >\n \n \n \n \n {i18n.t('menu.option.DaysPerYear', lang)}\n \n \n {i18n.t('menu.option.GridCellSize', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.cspGridCellSize = value;\n });\n }}\n />\n {i18n.t('word.MeterAbbreviation', lang)}\n \n \n \n );\n};\n\nexport default CspSimulationSettings;\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { InputNumber, Menu, Select, Space, Switch } from 'antd';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { Discretization } from '../../../types';\nimport { Util } from '../../../Util';\nimport { useDataStore } from '../../../stores/commonData';\n\nconst PvSimulationSettings = () => {\n const setCommonStore = useStore(Selector.set);\n const elements = useStore.getState().elements;\n const language = useStore(Selector.language);\n const timesPerHour = useStore(Selector.world.timesPerHour);\n const daysPerYear = useStore(Selector.world.daysPerYear);\n const gridCellSize = useStore(Selector.world.pvGridCellSize);\n const discretization = useStore(Selector.world.discretization);\n const noAnimationForSolarPanelSimulation = useStore(Selector.world.noAnimationForSolarPanelSimulation);\n\n const lang = { lng: language };\n const { SubMenu } = Menu;\n const { Option } = Select;\n\n return (\n \n \n \n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.timesPerHour = value;\n });\n }}\n >\n {/* sampling interval must be a factor of 60 (e.g., 8 is not)*/}\n \n \n \n \n \n \n \n \n {i18n.t('menu.option.TimesPerHour', lang)}\n \n \n {\n setCommonStore((state) => {\n state.world.daysPerYear = value;\n });\n // clear the results stored in the common store\n useDataStore.setState((state) => {\n state.yearlyPvYield = [];\n });\n }}\n >\n \n \n \n \n {i18n.t('menu.option.DaysPerYear', lang)}\n \n \n {i18n.t('menu.solarPanel.PanelDiscretization', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.discretization = value;\n });\n }}\n >\n \n \n \n \n {(!discretization || discretization === Discretization.APPROXIMATE) && (\n \n {i18n.t('menu.solarPanel.EnergyGridCellSize', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.pvGridCellSize = value;\n });\n }}\n />\n {i18n.t('word.MeterAbbreviation', lang)}\n \n )}\n {!Util.hasMovingParts(elements) && (\n \n \n {i18n.t('menu.solarPanel.SolarPanelSimulationNoAnimation', lang) + ':'}\n \n {\n setCommonStore((state) => {\n state.world.noAnimationForSolarPanelSimulation = checked;\n });\n }}\n />\n \n )}\n \n \n );\n};\n\nexport default PvSimulationSettings;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { InputNumber, Menu, Select, Space, Switch } from 'antd';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { Util } from '../../../Util';\nimport { useDataStore } from '../../../stores/commonData';\n\nconst SutSimulationSettings = () => {\n const setCommonStore = useStore(Selector.set);\n const elements = useStore.getState().elements;\n const language = useStore(Selector.language);\n const sutTimesPerHour = useStore(Selector.world.sutTimesPerHour);\n const sutDaysPerYear = useStore(Selector.world.sutDaysPerYear);\n const sutGridCellSize = useStore(Selector.world.sutGridCellSize);\n const noAnimation = useStore(Selector.world.noAnimationForSolarUpdraftTowerSimulation);\n\n const lang = { lng: language };\n const { SubMenu } = Menu;\n const { Option } = Select;\n\n return (\n \n \n \n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.sutTimesPerHour = value;\n });\n }}\n >\n {/* sampling interval must be a factor of 60 (e.g., 8 is not)*/}\n \n \n \n \n \n \n \n \n {i18n.t('menu.option.TimesPerHour', lang)}\n \n \n {\n setCommonStore((state) => {\n state.world.sutDaysPerYear = value;\n });\n // clear the results stored in the common store\n useDataStore.setState((state) => {\n state.yearlyUpdraftTowerYield = [];\n });\n }}\n >\n \n \n \n \n {i18n.t('menu.option.DaysPerYear', lang)}\n \n \n {i18n.t('menu.option.GridCellSize', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.sutGridCellSize = value;\n });\n }}\n />\n {i18n.t('word.MeterAbbreviation', lang)}\n \n {!Util.hasMovingParts(elements) && (\n \n \n {i18n.t('menu.solarUpdraftTower.SolarUpdraftTowerSimulationNoAnimation', lang) + ':'}\n \n {\n setCommonStore((state) => {\n state.world.noAnimationForSolarUpdraftTowerSimulation = checked;\n });\n }}\n />\n \n )}\n \n \n );\n};\n\nexport default SutSimulationSettings;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { InputNumber, Menu, Select, Space } from 'antd';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\n\nconst BuildingEnergySimulationSettings = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const timesPerHour = useStore(Selector.world.timesPerHour);\n const daysPerYear = useStore(Selector.world.daysPerYear);\n const gridCellSize = useStore(Selector.world.solarRadiationHeatmapGridCellSize);\n\n const lang = { lng: language };\n const { SubMenu } = Menu;\n const { Option } = Select;\n\n return (\n \n \n \n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.timesPerHour = value;\n });\n }}\n >\n {/* sampling interval must be a factor of 60 (e.g., 8 is not)*/}\n \n \n \n \n \n \n \n \n {i18n.t('menu.option.TimesPerHour', lang)}\n \n \n {\n setCommonStore((state) => {\n state.world.daysPerYear = value;\n });\n }}\n >\n \n \n \n \n {i18n.t('menu.option.DaysPerYear', lang)}\n \n \n {i18n.t('menu.building.EnergyGridCellSize', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.solarRadiationHeatmapGridCellSize = value;\n });\n }}\n />\n {i18n.t('word.MeterAbbreviation', lang)}\n \n {/*{!Util.hasMovingParts(elements) && (*/}\n {/* */}\n {/* */}\n {/* {i18n.t('menu.building.BuildingEnergySimulationNoAnimation', lang) + ':'}*/}\n {/* */}\n {/* {*/}\n {/* setCommonStore((state) => {*/}\n {/* state.world.noAnimationForThermalSimulation = checked;*/}\n {/* });*/}\n {/* }}*/}\n {/* />*/}\n {/* */}\n {/*)}*/}\n \n \n );\n};\n\nexport default BuildingEnergySimulationSettings;\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMGFRYh70JghAAAA3pJREFUWIXtlz2MVFUUx39ndnf2g4fDwAIiEZBAWCRAKAADFmpiYaVSkPhKCqdQGhLCNyEWhIqK5gEhVK/hoyBWWAixMGrURGQtdo0JMRBhyLDLYyHD7hyKe9/M5e278LKJbMNJJjM5957//Z97/+fcO6KqzKaVZnX11wSA7jyniPQDqTgUaAJdQI/jn1TVSUQEkDQUUFRbRQmIK0IReQv4BFgEuCBSBRrQqtjFxqAPmLJJdDkEWsAtoA7Myfh/VtXRXAI26z3A+8A1J6gCfArcBH6xCyqwBPgM+AcYAVg2OKi36vVSZWBg09jExBOLU7Y4a4B7wGFVvZsScI9gIbAZOBPFySWXZS0MzkVxsgvYmfGfiuLka+ADMlYLg5NRnBzK+L4DhoA2gbYIqybTvuzi1rpyfADVWhjs8YzNyfH9C7wrIm28NoEGvBOUy+MesKkX+Od5xgZyfL8CW4AFzxEQke4KrE2azdGcIIAnHv8w8MAzNpF1RHFyqtJfDoDB1CeqmgrwLLAC+NGJaQEbgfnATy6RJZXK3DtjY+sxx3MTeAzcAR5ZnA9txjfoHGET+BI4oqqXoSPCfmAwipNtwDaX9e4wuNAEieLkK9dfC4NvgLXAU+C+Be+qQm8DxjGVshz4A+i1YT3A38BWEflWVZspgeU2g2nWhN9sBh+7/ihOju4PgwMN0ChOTmTjamFwHJiK4uRkdmx/GJQa8AZQT0W4DridRwB4E48GGqZXLPXE3Sa/EmgY8a6EThVsAH73APXhF1o3sNgzNo6j9oz9iWl4bQKbozg57ZlcxV8FI8BDz9h/GG1NsyhODmYJrPaApObb5rfL5izzbAhYVAuDvZ7xLdApwzpwEaNccSYpMInZ6tRfcn6nDSqvU6qDl8UE+FxVF2Ivo1En4FV9hlW13QduAJHNSOyEEqZ+3TeAYC6S+5iyTeemb4Ui1rK4x6BzBKuBHRYoZdiNuSHn8vxd8BjTdN7DiDPAXLN/OSTd76yl1/yIqp6Wmb6KReQgpu0uA66r6pWZ4OQ+yXIWWwp8hKn5ScxObQfOY3Znp4iswmRWwuzSdVUdfim4qr70A3wBXKG4wC4C+4pgF30V92DOuqgFdC6gF1qhIwB+wHS1q5jbL63tNAFXpCXMMX1fBLiwCMU8v3vJbypZxTdV1feKmhmB/8tm/Z/RawLPAA7AbYJpF785AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAAG9IFmxgAAA+9JREFUWIXFl21oW2UUx38nuWnasdJUmfRDTcOTK2WglSH2i3WjOD9MRdiGzreB4Ms2OlbBwiZMEVSaKqMTlllZrIIyQVY/iDoQHDLB6dDCcFCUm1vNhy2Kbfoia9pkPX5YO7I0L7epsAcuuc9zzvn//885z7k8EVXlZg7fTWUHrLUCiEg7sBFYBLKq+s2q4mstgYjcZ4x5JJ/Pi9/v/2V8fPwSsAMYU9WEV5xVZ0BENgCvA4uu68Zj8fRYoT0x2IWIjKrq6JoFiMgmoAsYUdVLItItInsikcjInr5znwH7S8X5fL7DXMtG7QJEpAM4YIw577pur4icBB7vP3Z5F7CrEqgxZruIBFV1vpqASl1wlzEmnUwm3wPWAzOxeHpvJbDjA50DBdOWauRQ4RCGQqHm6enp/cCGxsbG57LZ7I+5XO4sMAG4sXj6q+KYxGDX9feJiYm2ycnJVDUBZTMwNTWVAU4DR2ZnZz/3+XzNwChwEbi92P9QT8vRwnkmk/H0jSnrJCKbReTlWDz9B3B+fn7+DRF5GvgzFk8PFZE/YNv2S0UQf9csIBQKNft8vr7+Y5efWFr61xizoKqvWJY1VOxv2/a3hfNkMnlKVa/ULKCpqelgW1vbx8vzWDw9nM/n74zF024+nz9Q6FtY9+Whqp96IYcSh1BENvmtun1vvZt6oVrw4d7W05FIZFvxuuM4AVXNexFQKgM7PJJ/XYZ8m1fyFQJEJAKEqgUlBruIRCIPlTGPeyVfIQBoBy6Ucz7U0/JoqZovD8dx7gV61iKgFfirDPkJ27a/qEC+UVV/BhZEZEutAn4AugsXjg90DiQGu7Btu+S5SKVS3y29/rP0+0E0Gn3Kq4BSXbDTtu1TXoIdx3kRGA4EAmdyudyzqjq+hPE28KWqnq2GsaILVHXEcZxWx3H6KxC/6ThOg6qeUNWrItIAFO7kQ+AZL5tAVSs+wLrlx9yztQn4BAgW2K26urqfgEhR3DvAlqr41RyKQPuMMfuK1soJaAeGqmF6vhW3dXQ0BwKBB13X/chjZn8DZqt1hGcBqV8v9uZyuXOqOuc1BhgGnlyzABG5VYLrOtn62OAqyFHVMWPMoohsruTkpfavhcPhg2VsJc9Agf3uaDT6fjnsqtdyEWmpr2/oTqVSO1ez+4INXhCRGRG5X1W/L7Z7KcHz2excQlUnyxDkgavATAWMI8D2UoYbMiAiPuBhrvU9QKB+fWh3w223HBWRkldxY4zfsqw7FhYWdotIuoyAXDAY7BaRV4HfC9bP3PApFhE/sNcY0wjguq4Ac4BljClbLtd1r4TD4QbLsqSCzzxQb4y5TpjJZE7W/N/w/xr/AaOLRG68/t4OAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAITq2rgrwAABI5JREFUWIXFl21MU1cYx/+nSCiUVrhQKND2IiGuCfISmzgWhkAhEx04MqUIjBCXbczsA8v4QIjomA41bgRZt+w1cQpIvC5ghsZBwBFmEJ0yFzNfsuHKW6FAoYRutkB79mGylGKhBSZPcj+c+/zP8/vnPOfck0sopVjP4K0rHcCGtSxGCOGl794dq4jcnLpRtFHlxQ8KLit9S7nknNW2oKioSDEzR1V+fn4qgZhRCUX7/e3ztzs6fTgu+7Gz+W6vgLe3tywzMzPVV7RRJRAIVBGxR8KW0mcV+iQAaFuxAbVaLfb05CebzeZUX19BakWVNtIdw16W2dylDCxqASFEGBUTkyRmAlVCkVCVsOPLWHeAT4u05wdDU9JSXpo2Tt+klN53aiAhMemgr0DwAcMwHnEvVq2WCwDYxHSgurpKp9Pr6ZRxqsJoNH5jn1/QgrCQ4G3KZI3HWoBjwntQX3sGLcPDyMnZF/rzjRs/NDU3jzvqHPYAj1kLuPbOIVw69xvSVKmITqyBBUBMUn76LKXXAFxcQLQfePsInB4XV2Lyz4/QXJcFgY8PMvIawZe8syCvTNZ8WF5Rke7UAN/bS7sSsG3ia1w69yomDBPIfO0ixJvLnGqFQQeulB+uOEII8QIcWmCjpAvAm66Cfa0cmpoaESQWIyOvESnbBvHjzeXnCSUHDhW/Z4oBkLXgFKjVakaZrDEsVyBM2IrzDQ0AgH25eXguagvau0Nc9Y2+e8e4zz/75A1K6fSi70B1zadfzXhmP3UVFKHdON9Qj9GxMezZsxfxCYlo7Qp2Gax/VDU7Pjpacvbst5r5d4sMqC9ckCjHtg87Tu69XYb7Dx5i186d4DEud+m/GHhwfGB0RLeX47gFTVp0HXPZ2SMSYfvr8+Ox34+juS4LAUwAMvIbkZa+y234H7+8f2V0RBfnCAeWuA3z89W3+rSDyuioLQiPO4q0F0bQdl3iFrjvXqXNaJw43FBff4w6ATk1IJfLr+Xn5Hio8wvi3ekzAEwOaGAwGPRTRkMex3FXl9I6vQ2tNut4a0vL0fjElGIguMBVuP5RFcZGxzvrak/nUkp1y+l5AMCybBohROiY7Ll715r1ysuFEeLO8uUKjWtPYejhCWi12pN1tadTXYED8ytAcEYml80QQvZTSjvsBU96V6lWq2eUyZqTjgUM/TWwWCyYMEwaLWZTYeN33PeugOeDBwD9ff1xVqv1VzacvSoJkZwihHjPCwghW6UyaVvX9a4dJ0ojt+t7P64G/u2zvrcKf5lMGB429VjMpq0c5x4ccNiEIpGoQCwWa2bnZkcopZM2apv04HmE6oZ0pXNzcy3zuqKioujH5tlKPt8rUzc09MXly83vUkot7sIBAJTSBQ+AsDBpWAsbztqkUmk7AL6jxk4rdZZz9XFWmPj7+7/NhrMmmVx2B0DsakFuGbAzsikiIuInlmUtgYGBBwF4PFMDT0zw/AP8S+Ss3CyVSbsBKJ6pATsjCoVCcYsNZ/9mGKZ4rQy49WdECNkQGBRYJvIVlQBge3t7p1a08+1rumPg/4h1/zv+B255SgboD8yRAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAEbjpw7XgAAAlxJREFUWIXl18+LVWUcx/HX1wxdRVHhbWEgDEKSVtKAuGhhm8BFgX/A2ErkLmbR2FyGsIakjht3N8EgNFu1kAwECUpchD8KFJyhggxiRC5UFCFBi/q6uPcOp+HMnTv3XseoLzxwznOeh8/7+Xy/z3POicx0P2PdfVX/XwBExFhEfBQRp6uer7+XwnijaLYmSn3NzLx8TwGqhEtxPCJ2ZqnyY1S7ICJ2Ybpotl7pNa5Rr01k5ofd+6EdiIgnMVM0Wwf6nFJExJnMvMMQDgwgvBiNeu3dzJxhAAci4gltqydXO7cUz3Qv+gYYhXCjXvsJr2bmub4BRrRijXrtS3xRFqdHDUTEY5gqmq3pIYUP4zucxHxmjq8IEBGBH4tma/MQwu/hbbyIWZzH0cxcKI+rTEFmZkS8g+MDCH+CBh7Hp7iFlzLz+6rxvVLwAG4UzdZTfQpfwRRu4yi24LXMvNhr3rJFmJl/RcQl9ARo1Gs3tVf8OWawT9vy05n590rgK70NFxr12qVlhH9p1GuT2IFNuIY7eDozT/Uj3g8AfFwhXmAMN/EVnsfuzJzNzD/6EV6MzNSpg4e716W+t7Afh4pmK3EKm7Edn+ECnls6bzWtLPYzPsBDFQDr8Ii21SfwDV4eRrjbyinYjW2Yi4g9S4zagIO4innsyMyzq7J6mfjHNuxsvdfxJt7H73hU+zA5h9nM/HUUwotRmZd2jq/jN3yNraOwu2cNVEA8iCP4U/tg2bCmACWQcXyLOTy75gAdiI041nHjMNavKUAJ5AX8gL2jAhjZV/Gg8d//NfvXA9wFb2zsOT1cv34AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAMxZxGQCgAABAFJREFUWIXVl11sU2Ucxp//e/bRdnaZ2dZslq7lrTdIjEODgRWjF0YMciNw4RJNVOiIEqMbJCbGj4QElbBNvTFju1GjxguDCSbGaPACtkEMEcSvgOvpFtM1dGUTqqltd97HC4EU2LoOOgnP5Xn+5/973jfvxzlCEjdT6qbSb8kAfr9/bTAY7BCR2koEkHLXgIh4tNYDAFYC+EtE6owxZ0ieyOVyh5LJ5EmSZkkCBAKB+10u1yfGmB+7do5uLvaG+iODADoAkORJkodzudzhRCJxpiIBtNavKKWei/aMLCun4f7etQdEJARgluRvjuN8m8/nh5PJ5MSiAtTV1bW0tLR8CkB17Rx9sBz4HGH2KqUiAHwAUsaYYySPpNPp0Uwmk543QCgU2mRZ1rskP9y+6+ir1wOfSwP71vQppe4WkTtE5PdsNrv3igAiYoXD4fcBrI/2jAQrBZ5Lg30dr5PsvLwN/X5/u9b6FMnGpYYDAMmnjDG7qwAgFAo97/F43tjWPewDcNdSwwFARN4ZHx//rEprvc+yrPsuwpdcQ/2RPwuFwgsTExMfA/+dhBtIDv8fcAAoFAqbL8EBQNra2nR1dfVuku0i8lO0Z+SJSkMH9q3Zo5R6NpvNbpycnPyh2Lu8C3w+351er/dpEXkcQCHaM3JPheB9SqknZ2ZmVk9PT/9xtX/NOSAiNcFgcGNVVdVWAMsAHIv2jHRdD3x/79oPRGRlKpV6LJPJTM1VU/Iobm1tXeHxeLaJyMMkJ7t2jj66CPgXAALxeDxCMj9fXVmXkYjUaK23iMhWACFjzMHtu46+VAJ+HIAdj8c7F7ohy76OL6m5ubm1vr5+h1IqSvJQtGeks9gf7Os4RfJX27Y75+tRrKpyikTE29bWtt6yrEhDQ4OfpNtxHFtEVgPAUH8k5TjOQaXUQyS/s227u9wBlZwBEblNa/2miKwDMGOM+dkYc2J2dvZsTU3NMwAskh+RvN2yrIiIrCKZI/mVbdt7biiAz+cLe73ebwB8nclk+lOpVKzYX758+ZdKqYZYLPZA8XO/37/K7Xa/ZozxxePx9ST/LhVg3m9Cr9f7HskDsVhsx9VwABARm+QvInJFj0QicWJsbGwTyZlgMPhyKThQYg0YY5pJfj6fb9v2i6Uak5wUkcaFAsw7A/l8vtuyrLe01tsWalIsEanXWu+1LOuR8+fPv71gfalFGAgEVtfW1vYCcJH83hhzpFAonM5ms+eUUg4AOI5T7Xa7G10u1woAG0TkXpLHp6amui9cuHDuhgJcUjgcXkdyi4i0k/SKSDXJhov22YsjT5I8msvlDiQSidMLNl1MgGteEqlvamqqA4B0Oj1D8p9FN7mRAJXUrfdvWGn9C2kU6SwCYsgLAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport ResidentialBuildingIcon from '../../../assets/map_residential_building.png';\nimport CommercialBuildingIcon from '../../../assets/map_commercial_building.png';\nimport SchoolBuildingIcon from '../../../assets/map_school_building.png';\nimport TouristAttractionIcon from '../../../assets/map_tourist_attraction.png';\nimport SolarPanelIcon from '../../../assets/map_solar_panel.png';\nimport ParabolicDishIcon from '../../../assets/map_parabolic_dish.png';\nimport ParabolicTroughIcon from '../../../assets/map_parabolic_trough.png';\nimport FresnelReflectorIcon from '../../../assets/map_fresnel_reflector.png';\nimport HeliostatIcon from '../../../assets/map_heliostat.png';\nimport UnderConstructionIcon from '../../../assets/map_under_construction.png';\nimport UnknownIcon from '../../../assets/map_marker.png';\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, Input, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\nimport { ModelType } from '../../../types';\nimport generateRandomAnimal from 'random-animal-name';\nimport { REGEX_ALLOWABLE_IN_NAME } from '../../../constants';\n\nconst { Option } = Select;\n\nconst ModelSiteDialog = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n\n const [modelType, setModelType] = useState(useStore.getState().modelType);\n const [modelAuthor, setModelAuthor] = useState(\n useStore.getState().modelAuthor ?? generateRandomAnimal(),\n );\n const [modelLabel, setModelLabel] = useState(\n useStore.getState().modelLabel ?? useStore.getState().cloudFile ?? null,\n );\n const [modelDescription, setModelDescription] = useState(useStore.getState().modelDescription);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const okButtonRef = useRef(null);\n\n const { TextArea } = Input;\n const lang = { lng: language };\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const onCancelClick = () => {\n setDialogVisible(false);\n };\n\n const onOkClick = () => {\n usePrimitiveStore.setState((state) => {\n state.publishOnModelsMapFlag = true;\n });\n setCommonStore((state) => {\n state.modelType = modelType;\n state.modelAuthor = modelAuthor;\n state.modelLabel = modelLabel;\n state.modelDescription = modelDescription;\n });\n usePrimitiveStore.getState().setChanged(true);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Publish on Map of Models',\n timestamp: new Date().getTime(),\n };\n });\n }\n setDialogVisible(false);\n };\n\n return (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('menu.file.PublishOnModelsMap', lang)}\n \n }\n footer={[\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('shared.ModelType', lang) + ':'}\n \n \n {\n setModelType(value);\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n {i18n.t('word.Publisher', lang)}:\n \n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e) => {\n setModelAuthor(e.target.value);\n }}\n />\n \n \n\n \n \n {i18n.t('word.Label', lang)}:\n \n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e) => {\n setModelLabel(e.target.value);\n }}\n />\n \n \n\n \n \n {i18n.t('word.Description', lang)}:
\n ({i18n.t('word.MaximumCharacters', lang)}: 200)\n \n \n {\n setModelDescription(e.target.value);\n }}\n />\n \n
\n \n );\n};\n\nexport default React.memo(ModelSiteDialog);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useRef, useState } from 'react';\nimport { Button, Col, Input, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\nimport { DesignProblem } from '../../../types';\nimport { REGEX_ALLOWABLE_IN_NAME } from '../../../constants';\n\nconst { Option } = Select;\n\nconst CreateNewProjectDialog = ({\n saveAs,\n setDialogVisible,\n}: {\n saveAs: boolean;\n setDialogVisible: (b: boolean) => void;\n}) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n\n const [projectType, setProjectType] = useState(\n useStore.getState().projectInfo.type ?? DesignProblem.SOLAR_PANEL_ARRAY,\n );\n const [projectTitle, setProjectTitle] = useState(useStore.getState().projectInfo.title);\n const [projectDescription, setProjectDescription] = useState(\n useStore.getState().projectInfo.description,\n );\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n\n const { TextArea } = Input;\n const lang = { lng: language };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const onCancelClick = () => {\n setDialogVisible(false);\n };\n\n const onOkClick = () => {\n usePrimitiveStore.setState((state) => {\n if (saveAs) {\n state.saveProjectFlag = true;\n } else {\n state.createProjectFlag = true;\n }\n });\n usePrimitiveStore.setState((state) => {\n state.projectType = projectType;\n state.projectTitle = projectTitle;\n state.projectDescription = projectDescription;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: saveAs ? 'Save Project as' : 'Create New Project',\n timestamp: new Date().getTime(),\n };\n });\n }\n setDialogVisible(false);\n };\n\n return (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t(saveAs ? 'menu.project.SaveProjectAs' : 'menu.project.CreateNewProject', lang)}\n \n }\n footer={[\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('projectPanel.ProjectType', lang) + ':'}\n \n \n {\n setProjectType(value);\n }}\n >\n \n \n \n \n\n \n \n {i18n.t('word.Title', lang)}:\n \n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e) => {\n setProjectTitle(e.target.value);\n }}\n />\n \n \n\n \n \n {i18n.t('word.Description', lang)}:
\n ({i18n.t('word.MaximumCharacters', lang)}: 200)\n \n \n {\n setProjectDescription(e.target.value);\n }}\n />\n \n
\n \n );\n};\n\nexport default React.memo(CreateNewProjectDialog);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { useStore } from './stores/common';\nimport firebase from 'firebase/app';\nimport 'firebase/firestore';\nimport 'firebase/storage';\nimport { showError, showInfo } from './helpers';\nimport i18n from './i18n/i18n';\nimport { Design, DesignProblem, DataColoring, ProjectInfo, Range } from './types';\nimport { Util } from './Util';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\n\nexport const fetchProject = async (userid: string, project: string, setProjectState: Function) => {\n const lang = { lng: useStore.getState().language };\n await firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(project)\n .get()\n .then((doc) => {\n const data = doc.data();\n if (data) {\n setProjectState({\n owner: userid,\n title: doc.id,\n timestamp: data.timestamp,\n description: data.description,\n dataColoring: data.dataColoring ?? DataColoring.ALL,\n type: data.type,\n designs: data.designs,\n ranges: data.ranges,\n hiddenParameters: data.hiddenParameters,\n counter: data.counter ?? 0,\n selectedProperty: data.selectedProperty,\n sortDescending: data.sortDescending,\n xAxisNameScatteredPlot: data.xAxisNameScatteredPlot,\n yAxisNameScatteredPlot: data.yAxisNameScatteredPlot,\n dotSizeScatteredPlot: data.dotSizeScatteredPlot,\n thumbnailWidth: data.thumbnailWidth,\n } as ProjectInfo);\n } else {\n showError(i18n.t('message.CannotOpenProject', lang) + ': ' + project);\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotOpenProject', lang) + ': ' + error);\n });\n};\n\nexport const removeDesignFromProject = (userid: string, projectTitle: string, design: Design) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({\n designs: firebase.firestore.FieldValue.arrayRemove(design),\n })\n .then(() => {\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n });\n // also delete the design\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('designs')\n .doc(design.title)\n .delete()\n .then(() => {\n useStore.setState((state) => {\n if (design.title === state.cloudFile) {\n state.cloudFile = undefined;\n }\n });\n showInfo(i18n.t('message.DesignRemovedFromProject', lang) + '.');\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotRemoveDesignFromProject', lang) + ': ' + error);\n });\n};\n\nexport const updateHiddenParameters = (\n userid: string,\n projectTitle: string,\n hiddenParameter: string,\n add: boolean, // true is to add, false is to remove\n) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({\n hiddenParameters: add\n ? firebase.firestore.FieldValue.arrayUnion(hiddenParameter)\n : firebase.firestore.FieldValue.arrayRemove(hiddenParameter),\n })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const addRange = (userid: string, projectTitle: string, range: Range) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({\n ranges: firebase.firestore.FieldValue.arrayUnion(range),\n })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateRanges = (userid: string, projectTitle: string, ranges: Range[]) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ ranges })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateDescription = (userid: string, projectTitle: string, description: string | null) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ description })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateDataColoring = (userid: string, projectTitle: string, dataColoring: DataColoring) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ dataColoring })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateSelectedProperty = (userid: string, projectTitle: string, selectedProperty: string | null) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ selectedProperty })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateXAxisNameScatteredPlot = (\n userid: string,\n projectTitle: string,\n xAxisNameScatteredPlot: string | null,\n) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ xAxisNameScatteredPlot })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateYAxisNameScatteredPlot = (\n userid: string,\n projectTitle: string,\n yAxisNameScatteredPlot: string | null,\n) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ yAxisNameScatteredPlot })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateDotSizeScatteredPlot = (userid: string, projectTitle: string, dotSizeScatteredPlot: number) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ dotSizeScatteredPlot })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateThumbnailWidth = (userid: string, projectTitle: string, thumbnailWidth: number) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ thumbnailWidth })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const createDesign = (type: string, title: string, thumbnail: string): Design => {\n let design = { timestamp: Date.now(), title, thumbnail } as Design;\n switch (type) {\n case DesignProblem.SOLAR_PANEL_ARRAY:\n const latitude = useStore.getState().world.latitude;\n const panelCount = Util.countAllSolarPanels();\n const dailyYield = Util.countAllSolarPanelDailyYields();\n const yearlyYield = Util.countAllSolarPanelYearlyYields();\n const economicParams = useStore.getState().economicsParams;\n const unitCost = economicParams.operationalCostPerUnit;\n const sellingPrice = economicParams.electricitySellingPrice;\n design = {\n latitude,\n unitCost,\n sellingPrice,\n panelCount,\n dailyYield,\n yearlyYield,\n ...design,\n ...useStore.getState().solarPanelArrayLayoutParams,\n };\n break;\n case DesignProblem.SOLAR_PANEL_TILT_ANGLE:\n // TODO: Each row has a different tilt angle\n break;\n }\n return design;\n};\n\n// change the design titles of a project based on its current title (used when copying or renaming a project)\nexport const changeDesignTitles = (projectTitle: string, projectDesigns: Design[] | null): Design[] | null => {\n if (!projectDesigns) return null;\n const newDesigns: Design[] = [];\n // The order of for-of on arrays is guaranteed by the array iterator definition.\n // It will visit the entries in the array in numeric index order\n // So the returned array has the same order as the original array.\n for (const design of projectDesigns) {\n const copy = { ...design };\n copy.title = createDesignTitle(projectTitle, design.title);\n copy.timestamp = Date.now();\n newDesigns.push(copy);\n }\n return newDesigns;\n};\n\n// the design title is named after the project title plus the current counter of the project\n// for example, \"project title 0\", \"project title 1\", etc.\nexport const createDesignTitle = (projectTitle: string, designTitle: string) => {\n const index = designTitle.lastIndexOf(' ');\n return projectTitle + designTitle.substring(index);\n};\n\nexport const getImageData = (image: HTMLImageElement) => {\n const c = document.createElement('canvas');\n c.width = image.width;\n c.height = image.height;\n const ctx = c.getContext('2d');\n if (ctx) {\n ctx.drawImage(image, 1, 1); // 1 is for padding\n }\n return c.toDataURL();\n};\n\nexport const copyDesign = (original: string, copy: string, owner: string | null, userid: string) => {\n const lang = { lng: useStore.getState().language };\n firebase\n .firestore()\n .collection('users')\n .doc(owner ?? userid)\n .collection('designs')\n .doc(original)\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data) {\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('designs')\n .doc(copy)\n .set(data)\n .then(() => {\n showInfo(i18n.t('message.CloudFileCopied', lang) + ': ' + copy);\n })\n .catch((error) => {\n showError(i18n.t('message.CannotWriteCloudFile', lang) + ': ' + error);\n });\n }\n } else {\n showError(i18n.t('message.CannotReadCloudFile', lang));\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotReadCloudFile', lang) + ': ' + error);\n });\n};\n\nexport const updateDesignVisibility = (userid: string, projectTitle: string, design: Design) => {\n const lang = { lng: useStore.getState().language };\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data) {\n const updatedDesigns: Design[] = [];\n updatedDesigns.push(...data.designs);\n // Get the index of the design to be modified by the title\n let index = -1;\n for (const [i, d] of updatedDesigns.entries()) {\n if (d.title === design.title) {\n index = i;\n break;\n }\n }\n // If found, update the design in the array\n if (index >= 0) {\n updatedDesigns[index].invisible = !design.invisible;\n // Finally, upload the updated design array back to Firestore\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ designs: updatedDesigns })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n }\n }\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotFetchProjectData', lang) + ': ' + error);\n })\n .finally(() => {\n // ignore\n });\n};\n\nexport const updateDesign = (\n userid: string,\n projectType: string,\n projectTitle: string,\n thumbnailWidth: number,\n designTitle: string,\n canvas: HTMLCanvasElement | null,\n) => {\n const lang = { lng: useStore.getState().language };\n usePrimitiveStore.setState((state) => {\n state.waiting = true;\n });\n\n // First we update the design file by overwriting it with the current content\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('designs')\n .doc(designTitle)\n .set(useStore.getState().exportContent())\n .then(() => {\n usePrimitiveStore.getState().setChanged(false);\n if (canvas) {\n // update the thumbnail image as well\n const thumbnail = Util.resizeCanvas(canvas, thumbnailWidth).toDataURL();\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data) {\n const updatedDesigns: Design[] = [];\n updatedDesigns.push(...data.designs);\n // Get the index of the design to be modified by the title\n let index = -1;\n for (const [i, d] of updatedDesigns.entries()) {\n if (d.title === designTitle) {\n index = i;\n break;\n }\n }\n // If found, update the design in the array\n if (index >= 0) {\n // Update design from the current parameters and results and the new thumbnail\n updatedDesigns[index] = createDesign(projectType, designTitle, thumbnail);\n // Finally, upload the updated design array back to Firestore\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ designs: updatedDesigns })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n })\n .finally(() => {\n // Update the cached array in the local storage via the common store\n useStore.getState().set((state) => {\n state.projectInfo.designs = updatedDesigns;\n });\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n state.waiting = false;\n });\n });\n }\n }\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotFetchProjectData', lang) + ': ' + error);\n })\n .finally(() => {\n // ignore\n });\n }\n });\n};\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { useStore } from './stores/common';\nimport firebase from 'firebase/app';\nimport 'firebase/firestore';\nimport 'firebase/storage';\nimport { showError, showInfo } from './helpers';\nimport i18n from './i18n/i18n';\nimport { HOME_URL } from './constants';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\n\nexport const loadCloudFile = (\n userid: string,\n title: string,\n ofProject: boolean,\n popState?: boolean,\n viewOnly?: boolean,\n) => {\n const lang = { lng: useStore.getState().language };\n\n useStore.getState().undoManager.clear();\n usePrimitiveStore.setState((state) => {\n state.waiting = true;\n });\n\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection(ofProject ? 'designs' : 'files')\n .doc(title)\n .get()\n .then((doc) => {\n const data = doc.data();\n if (data) {\n useStore.getState().importContent(data, title);\n } else {\n showInfo(i18n.t('message.CloudFileNotFound', lang) + ': ' + title);\n useStore.getState().set((state) => {\n state.cloudFile = undefined;\n });\n usePrimitiveStore.setState((state) => {\n state.waiting = false;\n });\n }\n if (!popState && !viewOnly) {\n const newUrl = HOME_URL + '?client=web&userid=' + userid + '&title=' + encodeURIComponent(title);\n window.history.pushState({}, document.title, newUrl);\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotOpenCloudFile', lang) + ': ' + error);\n usePrimitiveStore.setState((state) => {\n state.waiting = false;\n });\n });\n};\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport zhCN from 'antd/lib/locale/zh_CN';\r\nimport zhTW from 'antd/lib/locale/zh_TW';\r\nimport esES from 'antd/lib/locale/es_ES';\r\nimport trTR from 'antd/lib/locale/tr_TR';\r\nimport enUS from 'antd/lib/locale/en_US';\r\nimport ukUA from 'antd/lib/locale/uk_UA';\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport styled from 'styled-components';\r\nimport { Checkbox, Dropdown, InputNumber, Menu, Modal, Radio, Space, Switch } from 'antd';\r\nimport logo from './assets/magic-lamp.png';\r\nimport 'antd/dist/antd.css';\r\nimport About from './about';\r\nimport { saveImage, showError, showInfo, showWarning } from './helpers';\r\nimport { ActionInfo, BuildingCompletionStatus, Language, ObjectType, ProjectInfo, SolarStructure } from './types';\r\nimport * as Selector from './stores/selector';\r\nimport i18n from './i18n/i18n';\r\nimport { Util } from './Util';\r\nimport { UndoableCheck } from './undo/UndoableCheck';\r\nimport { CheckboxChangeEvent } from 'antd/lib/checkbox';\r\nimport { UndoableResetView } from './undo/UndoableResetView';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { Undoable } from './undo/Undoable';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { UndoableDelete } from './undo/UndoableDelete';\r\nimport { UndoablePaste } from './undo/UndoablePaste';\r\nimport CspSimulationSettings from './components/contextMenu/elementMenu/cspSimulationSettings';\r\nimport PvSimulationSettings from './components/contextMenu/elementMenu/pvSimulationSettings';\r\nimport SutSimulationSettings from './components/contextMenu/elementMenu/sutSimulationSettings';\r\nimport { UndoableChange } from './undo/UndoableChange';\r\nimport { DEFAULT_SOLAR_PANEL_SHININESS, FLOATING_WINDOW_OPACITY, HOME_URL, UNDO_SHOW_INFO_DURATION } from './constants';\r\nimport BuildingEnergySimulationSettings from './components/contextMenu/elementMenu/buildingEnergySimulationSettings';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { getExample } from './examples';\r\nimport { checkBuilding, CheckStatus } from './analysis/heatTools';\r\nimport ModelSiteDialog from './components/contextMenu/elementMenu/modelSiteDialog';\r\nimport CreateNewProjectDialog from './components/contextMenu/elementMenu/createNewProjectDialog';\r\nimport { fetchProject } from './cloudProjectUtil';\r\nimport { loadCloudFile } from './cloudFileUtil';\r\nimport { WallModel } from './models/WallModel';\r\nimport { ElementCounter } from './stores/ElementCounter';\r\n\r\nconst { SubMenu } = Menu;\r\n\r\nconst radioStyle = {\r\n display: 'block',\r\n height: '30px',\r\n paddingLeft: '10px',\r\n lineHeight: '30px',\r\n};\r\n\r\nconst MainMenuContainer = styled.div`\r\n width: 100px;\r\n`;\r\n\r\nconst StyledImage = styled.img`\r\n position: absolute;\r\n top: 10px;\r\n left: 10px;\r\n height: 40px;\r\n transition: 0.5s;\r\n opacity: 1;\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n &:hover {\r\n opacity: 0.5;\r\n }\r\n`;\r\n\r\nconst LabelContainer = styled.div`\r\n position: absolute;\r\n top: 54px;\r\n left: 0;\r\n width: 100px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n user-select: none;\r\n z-index: 9;\r\n`;\r\n\r\nexport interface MainMenuProps {\r\n viewOnly: boolean;\r\n setNavigationView: (selected: boolean) => void;\r\n set2DView: (selected: boolean) => void;\r\n resetView: () => void;\r\n zoomView: (scale: number) => void;\r\n canvas?: HTMLCanvasElement | null;\r\n}\r\n\r\nconst MainMenu = ({ viewOnly, set2DView, resetView, zoomView, setNavigationView, canvas }: MainMenuProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const pasteElements = useStore(Selector.pasteElementsByKey);\r\n const copyElementById = useStore(Selector.copyElementById);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const importContent = useStore(Selector.importContent);\r\n const countObservers = useStore(Selector.countObservers);\r\n const countElementsByType = useStore(Selector.countElementsByType);\r\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\r\n const countSolarStructuresByType = useStore(Selector.countSolarStructuresByType);\r\n const selectNone = useStore(Selector.selectNone);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\r\n\r\n const loggable = useStore.getState().loggable;\r\n const language = useStore.getState().language;\r\n const floatingWindowOpacity = useStore.getState().floatingWindowOpacity;\r\n const undoManager = useStore.getState().undoManager;\r\n const timesPerHour = useStore(Selector.world.timesPerHour);\r\n const solarPanelVisibilityGridCellSize = useStore(Selector.world.solarPanelVisibilityGridCellSize);\r\n const solarRadiationHeatmapGridCellSize = useStore(Selector.world.solarRadiationHeatmapGridCellSize);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const navigationView = useStore.getState().viewState.navigationView;\r\n const orthographic = useStore.getState().viewState.orthographic;\r\n const autoRotate = useStore.getState().viewState.autoRotate;\r\n const showSiteInfoPanel = useStore.getState().viewState.showSiteInfoPanel;\r\n const showDesignInfoPanel = useStore.getState().viewState.showDesignInfoPanel;\r\n const showInstructionPanel = useStore.getState().viewState.showInstructionPanel;\r\n const showMapPanel = useStore.getState().viewState.showMapPanel;\r\n const showWeatherPanel = useStore.getState().viewState.showWeatherPanel;\r\n const showDiurnalTemperaturePanel = useStore.getState().viewState.showDiurnalTemperaturePanel;\r\n const showEconomicsPanel = usePrimitiveStore.getState().showEconomicsPanel;\r\n const showNavigationPanel = usePrimitiveStore.getState().showNavigationPanel;\r\n const showStickyNotePanel = useStore.getState().viewState.showStickyNotePanel;\r\n const showHeliodonPanel = useStore.getState().viewState.showHeliodonPanel;\r\n const shadowEnabled = useStore.getState().viewState.shadowEnabled;\r\n const solarPanelShininess = useStore.getState().viewState.solarPanelShininess;\r\n const changed = usePrimitiveStore.getState().changed;\r\n const cloudFile = useStore.getState().cloudFile;\r\n const user = useStore.getState().user;\r\n const axes = useStore.getState().viewState.axes;\r\n const elementsToPaste = useStore.getState().elementsToPaste;\r\n const runDynamicSimulation = usePrimitiveStore.getState().runDynamicSimulation;\r\n const runStaticSimulation = usePrimitiveStore.getState().runStaticSimulation;\r\n const noAnimationForHeatmapSimulation = useStore(Selector.world.noAnimationForHeatmapSimulation);\r\n const noAnimationForSensorDataCollection = useStore(Selector.world.noAnimationForSensorDataCollection);\r\n const solarRadiationHeatmapReflectionOnly = useStore(Selector.viewState.solarRadiationHeatmapReflectionOnly);\r\n const elements = useStore.getState().elements;\r\n const cameraPosition = useStore.getState().viewState.cameraPosition;\r\n const panCenter = useStore.getState().viewState.panCenter;\r\n const selectedElement = useStore.getState().selectedElement;\r\n const projectInfo = useStore.getState().projectInfo;\r\n const projectView = useStore.getState().projectView;\r\n\r\n const [aboutUs, setAboutUs] = useState(false);\r\n const [modelSiteDialogVisible, setModelSiteDialogVisible] = useState(false);\r\n const [createNewProjectDialogVisible, setCreateNewProjectDialogVisible] = useState(false);\r\n const [saveProjectAsDialogVisible, setSaveProjectAsDialogVisible] = useState(false);\r\n\r\n // Manually update menu when visible to avoid listen to common store change.\r\n const [updateMenuFlag, setUpdateMenuFlag] = useState(false);\r\n\r\n const handleVisibleChange = (visible: boolean) => {\r\n if (visible) {\r\n setUpdateMenuFlag(!updateMenuFlag);\r\n }\r\n };\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const isMac = useMemo(() => Util.isMac(), []);\r\n\r\n const keyHome = useMemo(() => {\r\n const os = Util.getOS();\r\n if (os) {\r\n if (os.includes('OS X')) {\r\n return 'Ctrl+Alt+H';\r\n }\r\n if (os.includes('Chrome')) {\r\n return 'Ctrl+Alt+H';\r\n }\r\n }\r\n return 'Ctrl+Home';\r\n }, []);\r\n\r\n const takeScreenshot = () => {\r\n if (canvas) {\r\n saveImage('screenshot.png', canvas.toDataURL('image/png'));\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Take Screenshot',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n }\r\n };\r\n\r\n const loadFile = (e: any) => {\r\n const input = getExample(e.key);\r\n if (input) {\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n if (!viewOnly && changed) {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n onOk: () => saveAndImport(input),\r\n onCancel: () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = true;\r\n });\r\n // give it a brief moment for this modal to close\r\n // this may also put the function call to the last in the event queue\r\n setTimeout(() => {\r\n importContent(input);\r\n }, 10);\r\n },\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = true;\r\n });\r\n // give it a brief moment for the loading spinner to show\r\n // this may also put the function call to the last in the event queue\r\n setTimeout(() => {\r\n importContent(input);\r\n }, 10);\r\n }\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Example: ' + e.key,\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n if (!viewOnly) {\r\n window.history.pushState({}, document.title, HOME_URL);\r\n }\r\n }\r\n };\r\n\r\n const setProjectState = (projectInfo: ProjectInfo) => {\r\n setCommonStore((state) => {\r\n state.projectInfo = { ...projectInfo };\r\n state.projectImages.clear();\r\n state.projectView = true;\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\r\n state.updateProjectsFlag = true;\r\n });\r\n };\r\n\r\n const loadProject = (title: string, designIndex: number) => {\r\n const owner = process.env.REACT_APP_EXAMPLE_PROJECT_OWNER;\r\n if (title && owner) {\r\n fetchProject(owner, title, setProjectState).then(() => {\r\n loadCloudFile(owner, title + ' ' + designIndex, true, true, viewOnly).then(() => {\r\n // ignore\r\n });\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Example: ' + title,\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n if (!viewOnly) {\r\n window.history.pushState({}, document.title, HOME_URL);\r\n }\r\n }\r\n };\r\n\r\n const saveAndImport = (input: any) => {\r\n if (cloudFile) {\r\n setCommonStore((state) => {\r\n state.localContentToImportAfterCloudFileUpdate = input;\r\n });\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n } else {\r\n if (user.uid) {\r\n // no cloud file has been created\r\n setCommonStore((state) => {\r\n state.localContentToImportAfterCloudFileUpdate = input;\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n } else {\r\n showInfo(i18n.t('menu.file.ToSaveYourWorkPleaseSignIn', lang));\r\n }\r\n }\r\n };\r\n\r\n const toggleTranslucency = (e: CheckboxChangeEvent) => {\r\n const oldOpacity = floatingWindowOpacity;\r\n const newOpacity = e.target.checked ? FLOATING_WINDOW_OPACITY : 1;\r\n const undoableChange = {\r\n name: 'Floating Window Opacity',\r\n timestamp: Date.now(),\r\n oldValue: oldOpacity,\r\n newValue: newOpacity,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.floatingWindowOpacity = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.floatingWindowOpacity = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.floatingWindowOpacity = newOpacity;\r\n });\r\n };\r\n\r\n const toggleShadow = () => {\r\n const undoableCheck = {\r\n name: 'Show Shadow',\r\n timestamp: Date.now(),\r\n checked: !shadowEnabled,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.shadowEnabled = !undoableCheck.checked;\r\n if (state.viewState.shadowEnabled) {\r\n state.updateSceneRadius();\r\n }\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.shadowEnabled = undoableCheck.checked;\r\n if (state.viewState.shadowEnabled) {\r\n state.updateSceneRadius();\r\n }\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.shadowEnabled = !state.viewState.shadowEnabled;\r\n if (state.viewState.shadowEnabled) {\r\n state.updateSceneRadius();\r\n }\r\n });\r\n };\r\n\r\n const setSurfaceShininess = (value: number) => {\r\n const undoableChange = {\r\n name: 'Set Surface Shininess',\r\n timestamp: Date.now(),\r\n oldValue: solarPanelShininess ?? DEFAULT_SOLAR_PANEL_SHININESS,\r\n newValue: value,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.solarPanelShininess = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.solarPanelShininess = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.viewState.solarPanelShininess = value;\r\n });\r\n };\r\n\r\n const toggleSiteInfoPanel = () => {\r\n const undoableCheck = {\r\n name: 'Show Site Information',\r\n timestamp: Date.now(),\r\n checked: !showSiteInfoPanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showSiteInfoPanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showSiteInfoPanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showSiteInfoPanel = !state.viewState.showSiteInfoPanel;\r\n });\r\n };\r\n\r\n const toggleDesignInfoPanel = () => {\r\n const undoableCheck = {\r\n name: 'Show Design Information',\r\n timestamp: Date.now(),\r\n checked: !showDesignInfoPanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showDesignInfoPanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showDesignInfoPanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showDesignInfoPanel = !state.viewState.showDesignInfoPanel;\r\n });\r\n };\r\n\r\n const toggleInstructionPanel = () => {\r\n const undoableCheck = {\r\n name: 'Show Instruction Panel',\r\n timestamp: Date.now(),\r\n checked: !showInstructionPanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showInstructionPanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showInstructionPanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showInstructionPanel = !state.viewState.showInstructionPanel;\r\n });\r\n };\r\n\r\n const toggleStickyNote = () => {\r\n const undoableCheck = {\r\n name: 'Show Sticky Note',\r\n timestamp: Date.now(),\r\n checked: !showStickyNotePanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showStickyNotePanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showStickyNotePanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showStickyNotePanel = !state.viewState.showStickyNotePanel;\r\n });\r\n };\r\n\r\n const openHeliodonPanel = () => {\r\n const undoable = {\r\n name: 'Open Sun and Time Settings Panel',\r\n timestamp: Date.now(),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = false;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = true;\r\n });\r\n },\r\n } as Undoable;\r\n addUndoable(undoable);\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = true;\r\n });\r\n };\r\n\r\n const openMapPanel = () => {\r\n const undoable = {\r\n name: 'Open Maps',\r\n timestamp: Date.now(),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showMapPanel = false;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showMapPanel = true;\r\n });\r\n },\r\n } as Undoable;\r\n addUndoable(undoable);\r\n setCommonStore((state) => {\r\n state.viewState.showMapPanel = true;\r\n });\r\n };\r\n\r\n const openWeatherPanel = () => {\r\n const undoable = {\r\n name: 'Open Weather Panel',\r\n timestamp: Date.now(),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showWeatherPanel = false;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showWeatherPanel = true;\r\n });\r\n },\r\n } as Undoable;\r\n addUndoable(undoable);\r\n setCommonStore((state) => {\r\n state.viewState.showWeatherPanel = true;\r\n });\r\n };\r\n\r\n const openDiurnalTemperaturePanel = () => {\r\n const undoable = {\r\n name: 'Open Diurnal Temperature Panel',\r\n timestamp: Date.now(),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showDiurnalTemperaturePanel = false;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showDiurnalTemperaturePanel = true;\r\n });\r\n },\r\n } as Undoable;\r\n addUndoable(undoable);\r\n setCommonStore((state) => {\r\n state.viewState.showDiurnalTemperaturePanel = true;\r\n });\r\n };\r\n\r\n const toggleAxes = (e: CheckboxChangeEvent) => {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Show Axes',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.axes = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.axes = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.axes = checked;\r\n });\r\n };\r\n\r\n const toggleNavigationView = (e: CheckboxChangeEvent) => {\r\n const undoableCheck = {\r\n name: 'Toggle Navigation View',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n undo: () => {\r\n setNavigationView(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n setNavigationView(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setNavigationView(e.target.checked);\r\n setCommonStore((state) => {\r\n state.viewState.autoRotate = false;\r\n });\r\n };\r\n\r\n const toggle2DView = (e: CheckboxChangeEvent) => {\r\n const undoableCheck = {\r\n name: 'Toggle 2D View',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n undo: () => {\r\n set2DView(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n set2DView(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n set2DView(e.target.checked);\r\n setCommonStore((state) => {\r\n state.viewState.autoRotate = false;\r\n });\r\n };\r\n\r\n const toggleAutoRotate = () => {\r\n if (!orthographic) {\r\n const undoableCheck = {\r\n name: 'Auto Rotate',\r\n timestamp: Date.now(),\r\n checked: !autoRotate,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = !state.viewState.autoRotate;\r\n });\r\n }\r\n };\r\n\r\n const copySelectedElement = () => {\r\n if (selectedElement) {\r\n copyElementById(selectedElement.id);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Copy',\r\n timestamp: new Date().getTime(),\r\n elementId: selectedElement.id,\r\n elementType: selectedElement.type,\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n };\r\n\r\n const cutSelectedElement = () => {\r\n if (!selectedElement || selectedElement.type === ObjectType.Roof) return;\r\n if (selectedElement.locked) {\r\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\r\n } else {\r\n const cutElements = removeElementById(selectedElement.id, true);\r\n if (cutElements.length === 0) return;\r\n\r\n if (Util.isElementTriggerAutoDeletion(cutElements[0])) {\r\n useRefStore.getState().setListenToAutoDeletionByCut(true);\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\r\n } else {\r\n const undoableCut = {\r\n name: 'Cut',\r\n timestamp: Date.now(),\r\n deletedElements: cutElements,\r\n selectedElementId: selectedElement.id,\r\n undo: () => {\r\n const cutElements = undoableCut.deletedElements;\r\n if (cutElements.length === 0) return;\r\n\r\n const selectedElement = cutElements.find((e) => e.id === undoableCut.selectedElementId);\r\n if (!selectedElement) return;\r\n\r\n setCommonStore((state) => {\r\n for (const e of cutElements) {\r\n state.elements.push(e);\r\n }\r\n if (selectedElement.type === ObjectType.Wall) {\r\n const wall = selectedElement as WallModel;\r\n let leftWallId: string | null = null;\r\n let rightWallId: string | null = null;\r\n if (wall.leftJoints.length > 0) {\r\n leftWallId = wall.leftJoints[0];\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n rightWallId = wall.rightJoints[0];\r\n }\r\n if (leftWallId || rightWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).rightJoints[0] = wall.id;\r\n }\r\n if (e.id === rightWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).leftJoints[0] = wall.id;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n redo: () => {\r\n if (undoableCut.deletedElements && undoableCut.deletedElements.length > 0) {\r\n removeElementById(undoableCut.deletedElements[0].id, true);\r\n }\r\n },\r\n } as UndoableDelete;\r\n addUndoable(undoableCut);\r\n }\r\n }\r\n };\r\n\r\n const pasteSelectedElement = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const pastedElements = pasteElements();\r\n if (pastedElements.length > 0) {\r\n const undoablePaste = {\r\n name: 'Paste by Key',\r\n timestamp: Date.now(),\r\n pastedElements: JSON.parse(JSON.stringify(pastedElements)),\r\n undo: () => {\r\n for (const elem of undoablePaste.pastedElements) {\r\n removeElementById(elem.id, false);\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoablePaste.pastedElements);\r\n state.selectedElement = undoablePaste.pastedElements[0];\r\n });\r\n },\r\n } as UndoablePaste;\r\n addUndoable(undoablePaste);\r\n }\r\n }\r\n };\r\n\r\n const viewAlreadyReset =\r\n cameraPosition[0] === cameraPosition[1] &&\r\n cameraPosition[1] === cameraPosition[2] &&\r\n panCenter[0] === 0 &&\r\n panCenter[1] === 0 &&\r\n panCenter[2] === 0;\r\n\r\n const toggleStaticSolarRadiationHeatmap = () => {\r\n if (!runStaticSimulation) {\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n }\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n setPrimitiveStore('runStaticSimulation', !runStaticSimulation);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Generate Daily Solar Radiation Heatmap (Static)',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }, 100);\r\n };\r\n\r\n const toggleDynamicSolarRadiationHeatmap = () => {\r\n if (!runDynamicSimulation) {\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n }\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n setPrimitiveStore('runDynamicSimulation', !runDynamicSimulation);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Generate Daily Solar Radiation Heatmap (Dynamic)',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }, 100);\r\n };\r\n\r\n const readyToPaste = elementsToPaste && elementsToPaste.length > 0;\r\n\r\n const elementCounter: ElementCounter = useStore.getState().countAllElementsByType();\r\n\r\n const menu = (\r\n \r\n {/* file menu */}\r\n {!openModelsMap && (\r\n \r\n {!viewOnly && (\r\n {\r\n undoManager.clear();\r\n setCommonStore((state) => {\r\n state.createNewFileFlag = true;\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n window.history.pushState({}, document.title, HOME_URL);\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Create New File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n }}\r\n >\r\n {i18n.t('menu.file.CreateNewFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+F)\r\n \r\n )}\r\n\r\n {!viewOnly && (\r\n {\r\n undoManager.clear();\r\n setCommonStore((state) => {\r\n state.openLocalFileFlag = true;\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.cloudFile = undefined;\r\n window.history.pushState({}, document.title, HOME_URL);\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Open Local File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n }}\r\n >\r\n {i18n.t('menu.file.OpenLocalFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+O)...\r\n \r\n )}\r\n\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.saveLocalFileDialogVisible = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save as Local File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.file.SaveAsLocalFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+S)...\r\n \r\n\r\n {user.uid && !viewOnly && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.listCloudFilesFlag = true;\r\n state.openModelsMap = false;\r\n });\r\n setCommonStore((state) => {\r\n state.selectedFloatingWindow = 'cloudFilePanel';\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'List Cloud Files',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.file.OpenCloudFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+Shift+O)...\r\n \r\n )}\r\n\r\n {user.uid && cloudFile && !viewOnly && (\r\n {\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Cloud File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.file.SaveCloudFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+Shift+S)\r\n \r\n )}\r\n\r\n {user.uid && !viewOnly && (\r\n {\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Save as Cloud File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n }}\r\n >\r\n {i18n.t('menu.file.SaveAsCloudFile', lang)}...\r\n \r\n )}\r\n\r\n {!viewOnly && (\r\n {\r\n const urlId = new URLSearchParams(window.location.search).get('userid');\r\n const matched = urlId === user.uid;\r\n const allowed = user.uid && cloudFile && matched;\r\n if (allowed) {\r\n setModelSiteDialogVisible(true);\r\n } else {\r\n if (!user.uid) {\r\n showInfo(i18n.t('menu.file.YouMustLogInToPublishYourModel', lang) + '.');\r\n } else if (urlId && !matched) {\r\n showInfo(i18n.t('menu.file.YouCannotPublishAModelThatYouDoNotOwn', lang) + '.');\r\n } else {\r\n showInfo(i18n.t('menu.file.YouMustSaveModelOnCloudBeforePublishingIt', lang) + '.');\r\n }\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.file.PublishOnModelsMap', lang)}...\r\n \r\n )}\r\n\r\n \r\n {i18n.t('menu.file.TakeScreenshot', lang)}\r\n \r\n \r\n )}\r\n\r\n {/* project menu */}\r\n {!openModelsMap && !viewOnly && user.uid && (\r\n \r\n {\r\n if (!user.uid) {\r\n showInfo(i18n.t('menu.project.YouMustLogInToCreateProject', lang) + '.');\r\n return;\r\n }\r\n setCreateNewProjectDialogVisible(true);\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Create New Project',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.project.CreateNewProject', lang)}...\r\n \r\n {\r\n if (!user.uid) {\r\n showInfo(i18n.t('menu.project.YouMustLogInToOpenProject', lang) + '.');\r\n return;\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.showProjectsFlag = true;\r\n state.openModelsMap = false;\r\n });\r\n setCommonStore((state) => {\r\n state.selectedFloatingWindow = 'projectListPanel';\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Project',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.project.OpenProject', lang)}...\r\n \r\n {projectView && projectInfo.title && user.uid && (\r\n {\r\n setSaveProjectAsDialogVisible(true);\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Project As',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.project.SaveProjectAs', lang)}...\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* edit menu */}\r\n {(selectedElement || readyToPaste || undoManager.hasUndo() || undoManager.hasRedo()) && !openModelsMap && (\r\n \r\n {selectedElement && (\r\n \r\n {i18n.t('word.Copy', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+C)\r\n \r\n )}\r\n {selectedElement && (\r\n \r\n {i18n.t('word.Cut', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+X)\r\n \r\n )}\r\n {readyToPaste && (\r\n \r\n {i18n.t('word.Paste', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+V)\r\n \r\n )}\r\n {undoManager.hasUndo() && (\r\n {\r\n if (undoManager.hasUndo()) {\r\n const commandName = undoManager.undo();\r\n if (commandName)\r\n showInfo(i18n.t('menu.edit.Undo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Undo',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.edit.Undo', lang) + ': ' + undoManager.getLastUndoName()}\r\n ({isMac ? '⌘' : 'Ctrl'}+Z)\r\n \r\n )}\r\n {undoManager.hasRedo() && (\r\n {\r\n if (undoManager.hasRedo()) {\r\n const commandName = undoManager.redo();\r\n if (commandName)\r\n showInfo(i18n.t('menu.edit.Redo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Redo',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.edit.Redo', lang) + ': ' + undoManager.getLastRedoName()}\r\n ({isMac ? '⌘' : 'Ctrl'}+Y)\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* view menu */}\r\n {!openModelsMap && (\r\n \r\n {!orthographic && !viewAlreadyReset && (\r\n {\r\n const undoableResetView = {\r\n name: 'Reset View',\r\n timestamp: Date.now(),\r\n oldCameraPosition: [...cameraPosition],\r\n oldPanCenter: [...panCenter],\r\n undo: () => {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n orbitControlsRef.current.object.position.set(\r\n undoableResetView.oldCameraPosition[0],\r\n undoableResetView.oldCameraPosition[1],\r\n undoableResetView.oldCameraPosition[2],\r\n );\r\n orbitControlsRef.current.target.set(\r\n undoableResetView.oldPanCenter[0],\r\n undoableResetView.oldPanCenter[1],\r\n undoableResetView.oldPanCenter[2],\r\n );\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n const v = state.viewState;\r\n v.cameraPosition = [...undoableResetView.oldCameraPosition];\r\n v.panCenter = [...undoableResetView.oldPanCenter];\r\n });\r\n }\r\n },\r\n redo: () => {\r\n resetView();\r\n },\r\n } as UndoableResetView;\r\n addUndoable(undoableResetView);\r\n resetView();\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.orthographic = false;\r\n });\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('menu.view.ResetView', lang)}\r\n ({keyHome})\r\n \r\n )}\r\n {\r\n zoomView(1.1);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('menu.view.ZoomOut', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+])\r\n \r\n {\r\n zoomView(0.9);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('menu.view.ZoomIn', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+[)\r\n \r\n \r\n \r\n {i18n.t('menu.view.NavigationView', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+Q)\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.TwoDimensionalView', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+B)\r\n \r\n \r\n {!orthographic && (\r\n \r\n \r\n {i18n.t('menu.view.AutoRotate', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+M)\r\n \r\n \r\n )}\r\n \r\n \r\n {i18n.t('skyMenu.Axes', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.ShowShadow', lang)}\r\n \r\n \r\n \r\n 0}\r\n onChange={(e) => {\r\n setSurfaceShininess(e.target.checked ? DEFAULT_SOLAR_PANEL_SHININESS : 0);\r\n }}\r\n >\r\n {i18n.t('menu.view.ShowSurfaceShininess', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.TranslucentFloatingWindows', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* settings menu */}\r\n {!openModelsMap && (\r\n \r\n {!showHeliodonPanel && (\r\n \r\n {i18n.t('menu.settings.SunAndTime', lang)}...\r\n \r\n )}\r\n {!showMapPanel && (\r\n \r\n {i18n.t('word.Location', lang)}...\r\n \r\n )}\r\n {!showWeatherPanel && (\r\n \r\n {i18n.t('menu.settings.WeatherData', lang)}...\r\n \r\n )}\r\n {!showDiurnalTemperaturePanel && (\r\n \r\n {i18n.t('menu.settings.DiurnalTemperature', lang)}...\r\n \r\n )}\r\n {!showEconomicsPanel && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.showEconomicsPanel = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Economics Panel',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('economicsPanel.EconomicsParameters', lang)}...\r\n \r\n )}\r\n {!showNavigationPanel && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.showNavigationPanel = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Navigation Panel',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('navigationPanel.NavigationParameters', lang)}...\r\n \r\n )}\r\n \r\n )}\r\n\r\n {!openModelsMap && (\r\n \r\n \r\n \r\n {i18n.t('menu.view.accessories.SiteInformation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.accessories.DesignInformation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.accessories.Instruction', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.accessories.StickyNote', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* analysis menu */}\r\n {!openModelsMap && elementCounter.gotSome() && (\r\n \r\n {/* physics */}\r\n \r\n \r\n {i18n.t('menu.physics.DailySolarRadiationHeatmap', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('menu.physics.SolarRadiationHeatmapGridCellSize', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.world.solarRadiationHeatmapGridCellSize = value;\r\n });\r\n }}\r\n />\r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n {i18n.t('menu.physics.SolarRadiationHeatmapMaxValue', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.viewState.solarRadiationHeatMapMaxValue = value;\r\n });\r\n }}\r\n />\r\n \r\n {Util.hasHeliostatOrFresnelReflectors(elements) && (\r\n \r\n {i18n.t('menu.physics.ReflectionHeatmap', lang) + ':'}\r\n {\r\n setCommonStore((state) => {\r\n state.viewState.solarRadiationHeatMapReflectionOnly = checked;\r\n });\r\n }}\r\n />\r\n \r\n )}\r\n {!Util.hasMovingParts(elements) && (\r\n \r\n \r\n {i18n.t('menu.physics.SolarRadiationHeatmapNoAnimation', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.world.noAnimationForHeatmapSimulation = checked;\r\n });\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n {/* sensors */}\r\n {elementCounter.sensorCount > 0 && (\r\n \r\n {\r\n const sensorCount = countElementsByType(ObjectType.Sensor);\r\n if (sensorCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSensorForCollectingData', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = { name: 'Collect Daily Data for Sensors', timestamp: new Date().getTime() };\r\n });\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailyLightSensor = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.sensor.CollectDailyData', lang)}\r\n \r\n {\r\n const sensorCount = countElementsByType(ObjectType.Sensor);\r\n if (sensorCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSensorForCollectingData', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = { name: 'Collect Yearly Data for Sensors', timestamp: new Date().getTime() };\r\n });\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlyLightSensor = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.sensor.CollectYearlyData', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\r\n Number(a).toFixed(0)}\r\n onChange={(value) => {\r\n setCommonStore((state) => {\r\n state.world.timesPerHour = value;\r\n });\r\n }}\r\n />\r\n {i18n.t('menu.option.TimesPerHour', lang)}\r\n \r\n {!Util.hasMovingParts(elements) && (\r\n \r\n \r\n {i18n.t('menu.sensor.SensorSimulationNoAnimation', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.world.noAnimationForSensorDataCollection = checked;\r\n });\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* buildings */}\r\n {elementCounter.wallCount > 0 && (\r\n \r\n {\r\n const checkResult = checkBuilding(elements, countElementsByType, getChildrenOfType);\r\n if (checkResult.status === CheckStatus.NO_BUILDING) {\r\n showInfo(i18n.t('analysisManager.NoBuildingForAnalysis', lang));\r\n return;\r\n }\r\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD) {\r\n let errorType;\r\n switch (checkResult.buildingCompletion) {\r\n case BuildingCompletionStatus.WALL_DISJOINED:\r\n errorType = i18n.t('message.WallsAreNotConnected', lang);\r\n break;\r\n case BuildingCompletionStatus.WALL_EMPTY:\r\n errorType = i18n.t('message.BuildingContainsEmptyWall', lang);\r\n break;\r\n case BuildingCompletionStatus.ROOF_MISSING:\r\n errorType = i18n.t('message.BuildingRoofMissing', lang);\r\n break;\r\n default:\r\n errorType = i18n.t('message.UnknownErrors', lang);\r\n }\r\n showError(i18n.t('message.SimulationWillNotStartDueToErrors', lang) + ': ' + errorType);\r\n return;\r\n }\r\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD) {\r\n showWarning(i18n.t('message.SimulationWillStartDespiteWarnings', lang));\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = { name: 'Analyze Daily Building Energy', timestamp: new Date().getTime() };\r\n });\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.runDailyThermalSimulation = true;\r\n state.simulationInProgress = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.building.AnalyzeDailyBuildingEnergy', lang)}\r\n \r\n {\r\n const checkResult = checkBuilding(elements, countElementsByType, getChildrenOfType);\r\n if (checkResult.status === CheckStatus.NO_BUILDING) {\r\n showInfo(i18n.t('analysisManager.NoBuildingForAnalysis', lang));\r\n return;\r\n }\r\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD) {\r\n let errorType;\r\n switch (checkResult.buildingCompletion) {\r\n case BuildingCompletionStatus.WALL_DISJOINED:\r\n errorType = i18n.t('message.WallsAreNotConnected', lang);\r\n break;\r\n case BuildingCompletionStatus.WALL_EMPTY:\r\n errorType = i18n.t('message.BuildingContainsEmptyWall', lang);\r\n break;\r\n case BuildingCompletionStatus.ROOF_MISSING:\r\n errorType = i18n.t('message.BuildingRoofMissing', lang);\r\n break;\r\n default:\r\n errorType = i18n.t('message.UnknownErrors', lang);\r\n }\r\n showError(i18n.t('message.SimulationWillNotStartDueToErrors', lang) + ': ' + errorType);\r\n return;\r\n }\r\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD) {\r\n showWarning(i18n.t('message.SimulationWillStartDespiteWarnings', lang));\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n usePrimitiveStore.setState((state) => {\r\n state.runYearlyThermalSimulation = true;\r\n state.simulationInProgress = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = { name: 'Analyze Yearly Building Energy', timestamp: new Date().getTime() };\r\n });\r\n }\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.building.AnalyzeYearlyBuildingEnergy', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* solar panels */}\r\n {elementCounter.solarPanelCount > 0 && (\r\n \r\n {\r\n const solarPanelCount = countElementsByType(ObjectType.SolarPanel);\r\n if (solarPanelCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation For Solar Panels',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForSolarPanels = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarPanel.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const solarPanelCount = countElementsByType(ObjectType.SolarPanel);\r\n if (solarPanelCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation For Solar Panels',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForSolarPanels = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarPanel.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n {\r\n const observerCount = countObservers();\r\n if (observerCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoObserverForVisibilityAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n usePrimitiveStore.setState((state) => {\r\n state.runSolarPanelVisibilityAnalysis = !state.runSolarPanelVisibilityAnalysis;\r\n state.simulationInProgress = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Run Visibility Analysis For Solar Panels',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarPanel.AnalyzeVisibility', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('menu.solarPanel.VisibilityGridCellSize', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.world.solarPanelVisibilityGridCellSize = value;\r\n });\r\n }}\r\n />\r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* parabolic troughs */}\r\n {elementCounter.parabolicTroughCount > 0 && (\r\n \r\n {\r\n const parabolicTroughCount = countElementsByType(ObjectType.ParabolicTrough);\r\n if (parabolicTroughCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyParabolicTroughIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Parabolic Troughs',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForParabolicTroughs = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.parabolicTrough.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const parabolicTroughCount = countElementsByType(ObjectType.ParabolicTrough);\r\n if (parabolicTroughCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyParabolicTroughIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Parabolic Troughs',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForParabolicTroughs = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.parabolicTrough.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* parabolic dishes */}\r\n {elementCounter.parabolicDishCount > 0 && (\r\n \r\n {\r\n const parabolicDishCount = countElementsByType(ObjectType.ParabolicDish);\r\n if (parabolicDishCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyParabolicDishIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Parabolic Dishes',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForParabolicDishes = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.parabolicDish.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const parabolicDishCount = countElementsByType(ObjectType.ParabolicDish);\r\n if (parabolicDishCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyParabolicDishIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Parabolic Dishes',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForParabolicDishes = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.parabolicDish.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* Fresnel reflector */}\r\n {elementCounter.fresnelReflectorCount > 0 && (\r\n \r\n {\r\n const fresnelReflectorCount = countElementsByType(ObjectType.FresnelReflector);\r\n if (fresnelReflectorCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyFresnelReflectorIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Fresnel Reflectors',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForFresnelReflectors = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.fresnelReflector.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const fresnelReflectorCount = countElementsByType(ObjectType.FresnelReflector);\r\n if (fresnelReflectorCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyFresnelReflectorIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Fresnel Reflectors',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForFresnelReflectors = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.fresnelReflector.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* heliostat */}\r\n {elementCounter.heliostatCount > 0 && (\r\n \r\n {\r\n const heliostatCount = countElementsByType(ObjectType.Heliostat);\r\n if (heliostatCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyHeliostatIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Heliostats',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForHeliostats = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.heliostat.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const heliostatCount = countElementsByType(ObjectType.Heliostat);\r\n if (heliostatCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyHeliostatIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Heliostats',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForHeliostats = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.heliostat.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* solar updraft tower */}\r\n {elementCounter.solarUpdraftTowerCount > 0 && (\r\n \r\n {\r\n const towerCount = countSolarStructuresByType(SolarStructure.UpdraftTower);\r\n if (towerCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSolarUpdraftTowerForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyUpdraftTowerIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Solar Updraft Tower',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForUpdraftTower = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarUpdraftTower.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const towerCount = countSolarStructuresByType(SolarStructure.UpdraftTower);\r\n if (towerCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSolarUpdraftTowerForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyUpdraftTowerIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Solar Updraft Tower',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForUpdraftTower = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarUpdraftTower.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* tutorials menu */}\r\n \r\n {/* solar science */}\r\n \r\n \r\n {i18n.t('menu.solarEnergyScienceTutorials.SunAngles', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyScienceTutorials.InsolationAndClimate', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyScienceTutorials.SolarRadiationToBox', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SunBeamAndHeliodon', lang)}\r\n \r\n \r\n {/* building science */}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.ThermalEnvelopeVsBuildingEnvelope', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfSizeOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfOrientationOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfInsulationOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfRoofColorOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfEavesOverhangLengthOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfWindowSHGCOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfThermostatSetpointOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfSolarPanelsOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfGroundTemperatureOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfTreesOnBuildingEnergy', lang)}\r\n \r\n \r\n {/* building design */}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.CapeCodStyleHouseWithShedDormer', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.MansardRoofWithDormers', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.GableRoofVsHipRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.ColonialVsSaltbox', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.GambrelRoofVsMansardRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.CombinationRoofVsBonnetRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.DutchGableRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.GableAndValleyRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.ClerestoryRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.MonitorRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.AFrameHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.HalfTimberedHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.AllBasicRoofTypes', lang)}\r\n \r\n \r\n {/* photovoltaic solar power */}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.EffectOfTiltAngleOfSolarPanel', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.EffectOfAzimuthOfSolarPanel', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.SolarPanelTypes', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.VerticalBifacialSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.CompareMonofacialAndBifacialSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.SolarTrackers', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.CoveringGroundWithSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.InterRowSpacingOfSolarPanelArray', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.EffectOfOrientationOfSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.SolarPanelArrayAutomaticLayout', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.RooftopSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarCanopyFormFactors', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.BuildingIntegratedPhotovoltaics', lang)}\r\n \r\n \r\n {/* concentrated solar power */}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.FocusSunlightWithParabolicDish', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfParabolicTrough', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectOfLatusRectumOfParabolicTrough', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.LinearFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectOfAbsorberPipeHeightForLinearFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfLinearFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.LinearFresnelReflectorsWithTwoAbsorbers', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.SolarPowerTower', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.CosineEfficiencyOfHeliostats', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.ShadowingAndBlockingOfHeliostats', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectSolarPowerTowerHeight', lang)}\r\n \r\n \r\n {/* other types of solar power */}\r\n \r\n \r\n {i18n.t('menu.otherTypesOfSolarPowerTutorials.SolarUpdraftTower', lang)}\r\n \r\n \r\n {/* generative design */}\r\n \r\n loadProject(e.key, 48)}>\r\n {i18n.t('menu.generativeDesignTutorials.MonofacialSolarPanelArrayTiltAngle', lang)}\r\n \r\n loadProject(e.key, 50)}>\r\n {i18n.t('menu.generativeDesignTutorials.BifacialSolarPanelArrayTiltAngle', lang)}\r\n \r\n loadProject(e.key, 0)}>\r\n {i18n.t('menu.generativeDesignTutorials.OutputOfSolarPanelArrayInDifferentPlaces', lang)}\r\n \r\n loadProject(e.key, 0)}>\r\n {i18n.t('menu.generativeDesignTutorials.SimpleSolarFarmParetoFront', lang)}\r\n \r\n \r\n \r\n\r\n {/* example menu */}\r\n \r\n {/* solar energy */}\r\n \r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.VegetativeBuffer', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarCanopyOverBleachers', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarCanopyOverGarage', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarBusStop', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarFacadeTesla', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.Floatovoltaics', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.Agrivoltaics', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.RainbowSwashSolarFarmBostonMA', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.MickeyMouseSolarFarmOrlandoFL', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarPanelsOverCanalBakersfieldCA', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarNoiseBarrierLexingtonMA', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.HSATSolarTrackersRaleighNC', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.AADATSolarTrackersLancasterCA', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.NevadaSolarOneParabolicTroughArray', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.TooeleParabolicDishArray', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.TucsonLinearFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.PS10SolarPowerTower', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarUpdraftTowerInCity', lang)}\r\n \r\n \r\n \r\n\r\n {/* built environments */}\r\n \r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.ColonialHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.DutchColonialHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.TShapedHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.CapeCodHouseWithGarage', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Solarium', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.ButterflyRoofHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.AdobeTaosHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.RanchHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.BonnetHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.BarnStyleHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.ModernHouse', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.WhiteHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.BilimMersinTurkiye', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.SpanishStyleHotel', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.ApartmentBuilding', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.OfficeBuilding', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.Hotel', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.Greenhouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Church1', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Cathedral1', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Cathedral2', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Mosque1', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.Pavilion', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.OctagonalPagoda', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.OceanFront', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.EgyptianPyramids', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.MayanPyramid', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.SiOSePol', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.StackedCuboids', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.buildingComplexExamples.SouthBurlingtonHighSchoolVermont', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingComplexExamples.MescaleroApacheSchoolNewMexico', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.urbanPlanningExamples.Heatmap1', lang)}\r\n \r\n \r\n \r\n\r\n {/* artificial intelligence */}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.OptimizingTiltAngleOfOneSolarPanelRow', lang)}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.OptimizingTiltAnglesOfMultipleSolarPanelRows', lang)}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.SolarFarmGenerativeDesign', lang)}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.SolarFarmGenerativeDesignWithBlock', lang)}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.FitchburgSolarFarmGenerativeDesign', lang)}\r\n \r\n \r\n\r\n {/* benchmarks menu */}\r\n \r\n \r\n {i18n.t('menu.benchmarks.SolarRadiationPredictionVsMeasurement', lang)}\r\n \r\n \r\n {i18n.t('menu.benchmarks.BESTESTCase600', lang)}\r\n \r\n \r\n {i18n.t('menu.benchmarks.BESTESTCase610', lang)}\r\n \r\n \r\n {i18n.t('menu.benchmarks.BESTESTCase620', lang)}\r\n \r\n \r\n {i18n.t('menu.benchmarks.BESTESTCase630', lang)}\r\n \r\n \r\n \r\n\r\n \r\n {user.uid && !viewOnly && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.showModelsGallery = true;\r\n state.leaderboardFlag = true;\r\n state.openModelsMap = false;\r\n });\r\n }}\r\n >\r\n {i18n.t('menu.ModelsGallery', lang)}...\r\n \r\n )}\r\n\r\n {/* models map */}\r\n {!openModelsMap && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.modelsMapFlag = true;\r\n state.modelsMapWeatherStations = false;\r\n state.openModelsMap = true;\r\n state.showModelsGallery = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Models Map',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.ModelsMap', lang)}...\r\n \r\n )}\r\n \r\n\r\n {/*language menu*/}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.language = e.target.value;\r\n switch (state.language) {\r\n case 'zh_cn':\r\n state.locale = zhCN;\r\n break;\r\n case 'zh_tw':\r\n state.locale = zhTW;\r\n break;\r\n case 'es':\r\n state.locale = esES;\r\n break;\r\n case 'tr':\r\n state.locale = trTR;\r\n break;\r\n case 'ua':\r\n state.locale = ukUA;\r\n break;\r\n default:\r\n state.locale = enUS;\r\n }\r\n });\r\n }}\r\n >\r\n \r\n {Language.English}\r\n \r\n \r\n {Language.Spanish}\r\n \r\n \r\n {Language.ChineseSimplified}\r\n \r\n \r\n {Language.ChineseTraditional}\r\n \r\n \r\n {Language.Turkish}\r\n \r\n \r\n {Language.Ukrainian}\r\n \r\n \r\n \r\n\r\n {/* about window */}\r\n {\r\n setAboutUs(true);\r\n }}\r\n >\r\n {i18n.t('menu.AboutUs', lang)}...\r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('menu.mainMenu', lang)}\r\n \r\n \r\n \r\n \r\n {aboutUs && setAboutUs(false)} />}\r\n {modelSiteDialogVisible && }\r\n {createNewProjectDialogVisible && (\r\n \r\n )}\r\n {saveProjectAsDialogVisible && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(MainMenu);\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport sun_angles from './examples/sun_angles.json';\nimport insolation_and_climate from './examples/insolation_and_climate.json';\nimport solar_radiation_to_box from './examples/solar_radiation_to_box.json';\nimport sun_beam_at_center from './examples/sun_beam_at_center.json';\nimport solar_panel_types from './examples/solar_panel_types.json';\nimport vertical_bifacial_solar_panels from './examples/vertical_bifacial_solar_panels.json';\nimport compare_monofacial_bifacial_solar_panels from './examples/compare_monofacial_bifacial_solar_panels.json';\nimport rooftop_solar_panels from './examples/rooftop_solar_panels.json';\nimport rainbow_swash_solar_farm from './examples/rainbow_swash_solar_farm.json';\nimport mickey_mouse_solar_farm from './examples/mickey_mouse_solar_farm.json';\nimport solar_farm_hsat_array from './examples/solar_farm_hsat_array.json';\nimport solar_farm_aadat_array from './examples/solar_farm_aadat_array.json';\nimport solar_noise_barrier from './examples/solar_noise_barrier.json';\nimport solar_panels_over_canal from './examples/solar_panels_over_canal.json';\nimport solar_trackers from './examples/solar_trackers.json';\nimport all_roof_types from './examples/all_roof_types.json';\nimport cape_cod_with_shed_dormer from './examples/cape_cod_with_shed_dormer.json';\nimport mansard_roof_with_dormers from './examples/mansard_roof_with_dormers.json';\nimport t_shaped_house from './examples/t_shaped_house.json';\nimport cape_cod_with_garage from './examples/cape_cod_with_garage.json';\nimport adobe_taos_house from './examples/adobe_taos_house.json';\nimport ranch_house from './examples/ranch_house.json';\nimport bonnet_house from './examples/bonnet_house.json';\nimport barn_house from './examples/barn_house.json';\nimport modern_house_01 from './examples/modern_house_01.json';\nimport solarium from './examples/solarium.json';\nimport mosque_01 from './examples/mosque_01.json';\nimport church_01 from './examples/church_01.json';\nimport cathedral_01 from './examples/cathedral_01.json';\nimport cathedral_02 from './examples/cathedral_02.json';\nimport colonial_house from './examples/colonial_house.json';\nimport dutch_colonial_house from './examples/dutch_colonial_house.json';\nimport dutch_gable_roof from './examples/dutch_gable_roof.json';\nimport a_frame_house from './examples/a_frame_house.json';\nimport half_timbered_house from './examples/half_timbered_house.json';\nimport combination_roof_vs_bonnet_roof from './examples/combination_roof_vs_bonnet_roof.json';\nimport butterfly_roof_house from './examples/butterfly_roof_house.json';\nimport gable_roof_vs_hip_roof from './examples/gable_roof_vs_hip_roof.json';\nimport gable_and_valley_roof from './examples/gable_and_valley_roof.json';\nimport clerestory_roof from './examples/clerestory_roof.json';\nimport monitor_roof from './examples/monitor_roof.json';\nimport colonial_vs_saltbox from './examples/colonial_vs_saltbox.json';\nimport gambrel_roof_vs_mansard_roof from './examples/gambrel_roof_vs_mansard_roof.json';\nimport white_house from './examples/white_house.json';\nimport bilim_mersin_turkiye from './examples/bilim_mersin_turkiye.json';\nimport office_building_01 from './examples/office_building_01.json';\nimport hotel_01 from './examples/hotel_01.json';\nimport spanish_style_hotel from './examples/spanish_style_hotel.json';\nimport apartment_building_01 from './examples/apartment_building_01.json';\nimport south_burlington_high_school from './examples/south_burlington_high_school.json';\nimport mescalero_apache_school from './examples/mescalero_apache_school.json';\nimport heatmap_01 from './examples/heatmap_01.json';\nimport greenhouse from './examples/greenhouse.json';\nimport pavilion from './examples/pavilion.json';\nimport octagonal_pagoda from './examples/octagonal_pagoda.json';\nimport ocean_front from './examples/ocean_front.json';\nimport egyptian_pyramids from './examples/egyptian_pyramids.json';\nimport mayan_pyramid from './examples/mayan_pyramid.json';\nimport si_o_se_pol from './examples/si_o_se_pol.json';\nimport stacked_cuboids from './examples/stacked_cuboids.json';\nimport vegetative_buffer_01 from './examples/vegetative_buffer_01.json';\nimport effect_tilt_angle_solar_panel from './examples/effect_tilt_angle_solar_panel.json';\nimport effect_azimuth_solar_panel from './examples/effect_azimuth_solar_panel.json';\nimport effect_azimuth_parabolic_trough from './examples/effect_azimuth_parabolic_trough.json';\nimport effect_latus_rectum_parabolic_trough from './examples/effect_latus_rectum_parabolic_trough.json';\nimport effect_orientation_solar_panel from './examples/effect_orientation_solar_panel.json';\nimport why_solar_array from './examples/why_solar_array.json';\nimport solar_panel_array_auto_layout from './examples/solar_panel_array_auto_layout.json';\nimport solar_canopy_form_factors from './examples/solar_canopy_form_factors.json';\nimport solar_canopy_over_bleachers from './examples/solar_canopy_over_bleachers.json';\nimport solar_bus_stop from './examples/solar_bus_stop.json';\nimport bipv_01 from './examples/bipv_01.json';\nimport solar_canopy_over_garage from './examples/solar_canopy_over_garage.json';\nimport solar_facade_tesla from './examples/solar_facade_tesla.json';\nimport floatovoltaics from './examples/floatovoltaics.json';\nimport agrivoltaics from './examples/agrivoltaics.json';\nimport inter_row_spacing from './examples/inter_row_spacing.json';\nimport ps10_solar_power_tower from './examples/ps10_solar_power_tower.json';\nimport nevada_solar_one_parabolic_troughs from './examples/nevada_solar_one_parabolic_troughs.json';\nimport parabolic_dish_focus_sunlight from './examples/parabolic_dish_focus_sunlight.json';\nimport tooele_parabolic_dish_array from './examples/tooele_parabolic_dish_array.json';\nimport linear_fresnel_reflectors from './examples/linear_fresnel_reflectors.json';\nimport linear_fresnel_reflectors_two_absorbers from './examples/linear_fresnel_reflectors_two_absorbers.json';\nimport effect_absorber_pipe_height from './examples/effect_absorber_pipe_height.json';\nimport effect_azimuth_fresnel_reflector from './examples/effect_azimuth_fresnel_reflector.json';\nimport cosine_efficiency_heliostats from './examples/cosine_efficiency_heliostats.json';\nimport shadowing_blocking_heliostats from './examples/shadowing_blocking_heliostats.json';\nimport effect_solar_power_tower_height from './examples/effect_solar_power_tower_height.json';\nimport solar_power_tower from './examples/solar_power_tower.json';\nimport solar_radiation_predicted_vs_measured from './examples/solar_radiation_predicted_vs_measured.json';\nimport bestest_case_600 from './examples/bestest_case_600.json';\nimport bestest_case_610 from './examples/bestest_case_610.json';\nimport bestest_case_620 from './examples/bestest_case_620.json';\nimport bestest_case_630 from './examples/bestest_case_630.json';\nimport solar_updraft_tower from './examples/solar_updraft_tower.json';\nimport solar_updraft_tower_city from './examples/solar_updraft_tower_city.json';\nimport tucson_sundt_station from './examples/tucson_sundt_station.json';\nimport ai_tilt_angle_one_row from './examples/ai_tilt_angle_one_row.json';\nimport ai_tilt_angles_multiple_rows from './examples/ai_tilt_angles_multiple_rows.json';\nimport ai_solar_farm_design from './examples/ai_solar_farm_design.json';\nimport ai_solar_farm_design_block from './examples/ai_solar_farm_design_block.json';\nimport ai_fitchburg_solar_farm from './examples/ai_fitchburg_solar_farm.json';\nimport effect_house_size from './examples/effect_house_size.json';\nimport effect_house_orientation from './examples/effect_house_orientation.json';\nimport effect_wall_roof_insulation from './examples/effect_wall_roof_insulation.json';\nimport effect_roof_color from './examples/effect_roof_color.json';\nimport effect_eaves_overhang_length from './examples/effect_eaves_overhang_length.json';\nimport effect_window_shgc from './examples/effect_window_shgc.json';\nimport effect_thermostat_setpoint from './examples/effect_thermostat_setpoint.json';\nimport effect_solar_panels from './examples/effect_solar_panels.json';\nimport effect_ground_temperature from './examples/effect_ground_temperature.json';\nimport effect_trees from './examples/effect_trees.json';\nimport thermal_vs_building_envelope from './examples/thermal_vs_building_envelope.json';\n\nexport const getExample = (name: string) => {\n let input: any;\n switch (name) {\n case 'sun_angles':\n input = sun_angles;\n break;\n case 'insolation_and_climate':\n input = insolation_and_climate;\n break;\n case 'solar_radiation_to_box':\n input = solar_radiation_to_box;\n break;\n case 'sun_beam_at_center':\n input = sun_beam_at_center;\n break;\n case 'thermal_vs_building_envelope':\n input = thermal_vs_building_envelope;\n break;\n case 'effect_house_size':\n input = effect_house_size;\n break;\n case 'effect_house_orientation':\n input = effect_house_orientation;\n break;\n case 'effect_wall_roof_insulation':\n input = effect_wall_roof_insulation;\n break;\n case 'effect_roof_color':\n input = effect_roof_color;\n break;\n case 'effect_eaves_overhang_length':\n input = effect_eaves_overhang_length;\n break;\n case 'effect_window_shgc':\n input = effect_window_shgc;\n break;\n case 'effect_thermostat_setpoint':\n input = effect_thermostat_setpoint;\n break;\n case 'effect_solar_panels':\n input = effect_solar_panels;\n break;\n case 'effect_ground_temperature':\n input = effect_ground_temperature;\n break;\n case 'effect_trees':\n input = effect_trees;\n break;\n case 'office_building_01':\n input = office_building_01;\n break;\n case 'hotel_01':\n input = hotel_01;\n break;\n case 'spanish_style_hotel':\n input = spanish_style_hotel;\n break;\n case 'apartment_building_01':\n input = apartment_building_01;\n break;\n case 'white_house':\n input = white_house;\n break;\n case 'bilim_mersin_turkiye':\n input = bilim_mersin_turkiye;\n break;\n case 'south_burlington_high_school':\n input = south_burlington_high_school;\n break;\n case 'mescalero_apache_school':\n input = mescalero_apache_school;\n break;\n case 'heatmap_01':\n input = heatmap_01;\n break;\n case 'vegetative_buffer_01':\n input = vegetative_buffer_01;\n break;\n case 'solar_canopy_form_factors':\n input = solar_canopy_form_factors;\n break;\n case 'solar_canopy_over_bleachers':\n input = solar_canopy_over_bleachers;\n break;\n case 'solar_bus_stop':\n input = solar_bus_stop;\n break;\n case 'solar_facade_tesla':\n input = solar_facade_tesla;\n break;\n case 'solar_canopy_over_garage':\n input = solar_canopy_over_garage;\n break;\n case 'bipv_01':\n input = bipv_01;\n break;\n case 'floatovoltaics':\n input = floatovoltaics;\n break;\n case 'agrivoltaics':\n input = agrivoltaics;\n break;\n case 'effect_tilt_angle_solar_panel':\n input = effect_tilt_angle_solar_panel;\n break;\n case 'effect_azimuth_solar_panel':\n input = effect_azimuth_solar_panel;\n break;\n case 'effect_azimuth_parabolic_trough':\n input = effect_azimuth_parabolic_trough;\n break;\n case 'effect_latus_rectum_parabolic_trough':\n input = effect_latus_rectum_parabolic_trough;\n break;\n case 'parabolic_dish_focus_sunlight':\n input = parabolic_dish_focus_sunlight;\n break;\n case 'effect_orientation_solar_panel':\n input = effect_orientation_solar_panel;\n break;\n case 'solar_panel_types':\n input = solar_panel_types;\n break;\n case 'vertical_bifacial_solar_panels':\n input = vertical_bifacial_solar_panels;\n break;\n case 'compare_monofacial_bifacial_solar_panels':\n input = compare_monofacial_bifacial_solar_panels;\n break;\n case 'why_solar_array':\n input = why_solar_array;\n break;\n case 'solar_panel_array_auto_layout':\n input = solar_panel_array_auto_layout;\n break;\n case 'inter_row_spacing':\n input = inter_row_spacing;\n break;\n case 'rooftop_solar_panels':\n input = rooftop_solar_panels;\n break;\n case 'solar_panels_over_canal':\n input = solar_panels_over_canal;\n break;\n case 'solar_noise_barrier':\n input = solar_noise_barrier;\n break;\n case 'rainbow_swash_solar_farm':\n input = rainbow_swash_solar_farm;\n break;\n case 'mickey_mouse_solar_farm':\n input = mickey_mouse_solar_farm;\n break;\n case 'solar_farm_hsat_array':\n input = solar_farm_hsat_array;\n break;\n case 'solar_farm_aadat_array':\n input = solar_farm_aadat_array;\n break;\n case 'solar_trackers':\n input = solar_trackers;\n break;\n case 'nevada_solar_one_parabolic_troughs':\n input = nevada_solar_one_parabolic_troughs;\n break;\n case 'tooele_parabolic_dish_array':\n input = tooele_parabolic_dish_array;\n break;\n case 'ps10_solar_power_tower':\n input = ps10_solar_power_tower;\n break;\n case 'linear_fresnel_reflectors':\n input = linear_fresnel_reflectors;\n break;\n case 'linear_fresnel_reflectors_two_absorbers':\n input = linear_fresnel_reflectors_two_absorbers;\n break;\n case 'effect_absorber_pipe_height':\n input = effect_absorber_pipe_height;\n break;\n case 'effect_azimuth_fresnel_reflector':\n input = effect_azimuth_fresnel_reflector;\n break;\n case 'cosine_efficiency_heliostats':\n input = cosine_efficiency_heliostats;\n break;\n case 'shadowing_blocking_heliostats':\n input = shadowing_blocking_heliostats;\n break;\n case 'effect_solar_power_tower_height':\n input = effect_solar_power_tower_height;\n break;\n case 'solar_power_tower':\n input = solar_power_tower;\n break;\n case 'solar_updraft_tower':\n input = solar_updraft_tower;\n break;\n case 'solar_updraft_tower_city':\n input = solar_updraft_tower_city;\n break;\n case 'cape_cod_with_shed_dormer':\n input = cape_cod_with_shed_dormer;\n break;\n case 'mansard_roof_with_dormers':\n input = mansard_roof_with_dormers;\n break;\n case 't_shaped_house':\n input = t_shaped_house;\n break;\n case 'all_roof_types':\n input = all_roof_types;\n break;\n case 'a_frame_house':\n input = a_frame_house;\n break;\n case 'half_timbered_house':\n input = half_timbered_house;\n break;\n case 'dutch_gable_roof':\n input = dutch_gable_roof;\n break;\n case 'combination_roof_vs_bonnet_roof':\n input = combination_roof_vs_bonnet_roof;\n break;\n case 'butterfly_roof_house':\n input = butterfly_roof_house;\n break;\n case 'gable_roof_vs_hip_roof':\n input = gable_roof_vs_hip_roof;\n break;\n case 'gable_and_valley_roof':\n input = gable_and_valley_roof;\n break;\n case 'clerestory_roof':\n input = clerestory_roof;\n break;\n case 'monitor_roof':\n input = monitor_roof;\n break;\n case 'colonial_vs_saltbox':\n input = colonial_vs_saltbox;\n break;\n case 'gambrel_roof_vs_mansard_roof':\n input = gambrel_roof_vs_mansard_roof;\n break;\n case 'colonial_house':\n input = colonial_house;\n break;\n case 'dutch_colonial_house':\n input = dutch_colonial_house;\n break;\n case 'cape_cod_with_garage':\n input = cape_cod_with_garage;\n break;\n case 'greenhouse':\n input = greenhouse;\n break;\n case 'solarium':\n input = solarium;\n break;\n case 'pavilion':\n input = pavilion;\n break;\n case 'octagonal_pagoda':\n input = octagonal_pagoda;\n break;\n case 'ocean_front':\n input = ocean_front;\n break;\n case 'mosque_01':\n input = mosque_01;\n break;\n case 'church_01':\n input = church_01;\n break;\n case 'cathedral_01':\n input = cathedral_01;\n break;\n case 'cathedral_02':\n input = cathedral_02;\n break;\n case 'adobe_taos_house':\n input = adobe_taos_house;\n break;\n case 'egyptian_pyramids':\n input = egyptian_pyramids;\n break;\n case 'mayan_pyramid':\n input = mayan_pyramid;\n break;\n case 'si_o_se_pol':\n input = si_o_se_pol;\n break;\n case 'stacked_cuboids':\n input = stacked_cuboids;\n break;\n case 'barn_house':\n input = barn_house;\n break;\n case 'ranch_house':\n input = ranch_house;\n break;\n case 'bonnet_house':\n input = bonnet_house;\n break;\n case 'modern_house_01':\n input = modern_house_01;\n break;\n case 'solar_radiation_predicted_vs_measured':\n input = solar_radiation_predicted_vs_measured;\n break;\n case 'bestest_case_600':\n input = bestest_case_600;\n break;\n case 'bestest_case_610':\n input = bestest_case_610;\n break;\n case 'bestest_case_620':\n input = bestest_case_620;\n break;\n case 'bestest_case_630':\n input = bestest_case_630;\n break;\n case 'tucson_sundt_station':\n input = tucson_sundt_station;\n break;\n case 'ai_tilt_angle_one_row':\n input = ai_tilt_angle_one_row;\n break;\n case 'ai_tilt_angles_multiple_rows':\n input = ai_tilt_angles_multiple_rows;\n break;\n case 'ai_solar_farm_design':\n input = ai_solar_farm_design;\n break;\n case 'ai_solar_farm_design_block':\n input = ai_solar_farm_design_block;\n break;\n case 'ai_fitchburg_solar_farm':\n input = ai_fitchburg_solar_farm;\n break;\n }\n return input;\n};\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport CookieConsent from 'react-cookie-consent';\nimport i18n from './i18n/i18n';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\n\nconst AcceptCookie = () => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n return (\n \n {i18n.t('cookie.Statement', lang)}\n \n );\n};\n\nexport default AcceptCookie;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef } from 'react';\r\nimport { useTexture } from '@react-three/drei';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { DoubleSide, Mesh } from 'three';\r\nimport { getRoadMap, getSatelliteImage } from '../helpers';\r\nimport { Util } from '../Util';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { InnerCommonStoreState } from '../stores/InnerCommonState';\r\nimport { ObjectType } from '../types';\r\nimport { UNIT_VECTOR_POS_Z } from '../constants';\r\n\r\n// The image that Google Maps API returns is 640x640. That image needs to be rescaled in such a way\r\n// that one meter in a Google Map is exactly same length as one meter in Aladdin.\r\n// I used the Morse Institute library in Natick as a reference to find the correct scale factor,\r\n// but this factor varies with latitude as Google Maps use the Mercator projection.\r\n\r\nconst NATICK_MAP_SCALE_FACTOR = 0.7;\r\nconst NATICK_LATITUDE = 42.2845513;\r\nconst MERCATOR_PROJECTION_SCALE_CONSTANT = NATICK_MAP_SCALE_FACTOR / Math.cos(Util.toRadians(NATICK_LATITUDE));\r\n\r\nconst GroundImage = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const latitude = useStore(Selector.world.latitude);\r\n const longitude = useStore(Selector.world.longitude);\r\n const mapZoom = useStore(Selector.viewState.mapZoom);\r\n const mapType = useStore(Selector.viewState.mapType);\r\n\r\n const groundImageRef = useRef();\r\n\r\n const texture = useTexture(\r\n mapType === 'satellite' || mapType === 'hybrid'\r\n ? getSatelliteImage(640, latitude, longitude, mapZoom)\r\n : getRoadMap(640, latitude, longitude, mapZoom),\r\n );\r\n\r\n let zoomScale;\r\n if (mapZoom === 21) {\r\n zoomScale = 0.5;\r\n } else if (mapZoom === 20) {\r\n zoomScale = 1;\r\n } else {\r\n zoomScale = Math.pow(2, 20 - mapZoom);\r\n }\r\n const scale = MERCATOR_PROJECTION_SCALE_CONSTANT * Math.cos(Util.toRadians(latitude)) * zoomScale;\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const groundImageClicked = e.intersections[0].object === groundImageRef.current;\r\n if (groundImageClicked) {\r\n setCommonStore((state) => {\r\n InnerCommonStoreState.selectNone(state);\r\n state.pastePoint.copy(e.intersections[0].point);\r\n state.clickObjectType = ObjectType.Ground;\r\n state.contextMenuObjectType = ObjectType.Ground;\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n });\r\n }\r\n }\r\n };\r\n\r\n return texture ? (\r\n \r\n \r\n \r\n \r\n ) : (\r\n <>\r\n );\r\n};\r\n\r\nexport default React.memo(GroundImage);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { Checkbox, Menu } from 'antd';\r\nimport { useStore } from '../../stores/common';\r\nimport * as Selector from '../../stores/selector';\r\nimport i18n from '../../i18n/i18n';\r\nimport { Util } from '../../Util';\r\nimport { UndoableDelete } from '../../undo/UndoableDelete';\r\nimport { UndoablePaste } from '../../undo/UndoablePaste';\r\nimport { UndoableCheck } from '../../undo/UndoableCheck';\r\nimport { ActionInfo, ObjectType } from '../../types';\r\nimport { showInfo } from 'src/helpers';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\n\r\nexport const Paste = ({ paddingLeft = '36px', keyName }: { paddingLeft?: string; keyName: string }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const pasteElements = useStore(Selector.pasteElementsToPoint);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const isMac = Util.isMac();\r\n\r\n const paste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const pastedElements = pasteElements();\r\n if (pastedElements.length > 0) {\r\n const undoablePaste = {\r\n name: 'Paste to Point',\r\n timestamp: Date.now(),\r\n pastedElements: pastedElements.map((m) => ({ ...m })),\r\n undo: () => {\r\n for (const elem of undoablePaste.pastedElements) {\r\n removeElementById(elem.id, false);\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoablePaste.pastedElements);\r\n state.selectedElement = undoablePaste.pastedElements[0];\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n },\r\n } as UndoablePaste;\r\n addUndoable(undoablePaste);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n {i18n.t('word.Paste', { lng: language })}\r\n ({isMac ? '⌘' : 'Ctrl'}+V)\r\n \r\n );\r\n};\r\n\r\nexport const Copy = ({ paddingLeft = '36px', keyName }: { paddingLeft?: string; keyName: string }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const copyElementById = useStore(Selector.copyElementById);\r\n const selectedElement = useStore(Selector.selectedElement);\r\n const loggable = useStore(Selector.loggable);\r\n const isMac = Util.isMac();\r\n\r\n const copyElement = () => {\r\n if (selectedElement) {\r\n copyElementById(selectedElement.id);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Copy',\r\n timestamp: new Date().getTime(),\r\n elementId: selectedElement.id,\r\n elementType: selectedElement.type,\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n {i18n.t('word.Copy', { lng: language })}\r\n ({isMac ? '⌘' : 'Ctrl'}+C)\r\n \r\n );\r\n};\r\n\r\nexport const Cut = ({ paddingLeft = '36px', keyName }: { paddingLeft?: string; keyName: string }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const selectedElement = useStore(Selector.selectedElement);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const isMac = Util.isMac();\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const cut = () => {\r\n if (!selectedElement || selectedElement.type === ObjectType.Roof) return;\r\n if (selectedElement.locked) {\r\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\r\n } else {\r\n const cutElements = removeElementById(selectedElement.id, true);\r\n if (cutElements.length === 0) return;\r\n\r\n if (Util.isElementTriggerAutoDeletion(cutElements[0])) {\r\n useRefStore.getState().setListenToAutoDeletionByCut(true);\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\r\n } else {\r\n const undoableCut = {\r\n name: 'Cut',\r\n timestamp: Date.now(),\r\n deletedElements: cutElements,\r\n selectedElementId: selectedElement.id,\r\n undo: () => {\r\n const cutElements = undoableCut.deletedElements;\r\n if (cutElements.length === 0) return;\r\n\r\n const selectedElement = cutElements.find((e) => e.id === undoableCut.selectedElementId);\r\n if (!selectedElement) return;\r\n\r\n setCommonStore((state) => {\r\n for (const e of cutElements) {\r\n state.elements.push(e);\r\n }\r\n if (selectedElement.type === ObjectType.Wall) {\r\n const wall = selectedElement as WallModel;\r\n let leftWallId: string | null = null;\r\n let rightWallId: string | null = null;\r\n if (wall.leftJoints.length > 0) {\r\n leftWallId = wall.leftJoints[0];\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n rightWallId = wall.rightJoints[0];\r\n }\r\n if (leftWallId || rightWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).rightJoints[0] = wall.id;\r\n }\r\n if (e.id === rightWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).leftJoints[0] = wall.id;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n redo: () => {\r\n if (undoableCut.deletedElements && undoableCut.deletedElements.length > 0) {\r\n removeElementById(undoableCut.deletedElements[0].id, true);\r\n }\r\n },\r\n } as UndoableDelete;\r\n addUndoable(undoableCut);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n {i18n.t('word.Cut', { lng: language })}\r\n ({isMac ? '⌘' : 'Ctrl'}+X)\r\n \r\n );\r\n};\r\n\r\nexport const Lock = ({ keyName }: { keyName: string }) => {\r\n const language = useStore(Selector.language);\r\n const updateElementLockById = useStore(Selector.updateElementLockById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const selectedElement = useStore((state) => state.elements.find((e) => state.selectedElementIdSet.has(e.id)));\r\n\r\n const lockElement = (on: boolean) => {\r\n if (selectedElement) {\r\n updateElementLockById(selectedElement.id, on);\r\n }\r\n };\r\n\r\n return (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Lock',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: selectedElement?.id,\r\n selectedElementType: selectedElement?.type,\r\n undo: () => {\r\n lockElement(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n lockElement(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n lockElement(checked);\r\n }}\r\n >\r\n {i18n.t('word.Lock', { lng: language })}\r\n \r\n \r\n );\r\n};\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { ElementModel } from '../../../models/ElementModel';\r\nimport { useEffect, useState } from 'react';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { ObjectType } from 'src/types';\r\nimport { ColorResult } from 'react-color';\r\n\r\nexport const useLabel = (element: ElementModel | undefined) => {\r\n const [labelText, setLabelText] = useState(element?.label ?? '');\r\n useEffect(() => {\r\n if (element?.label) {\r\n setLabelText(element.label);\r\n }\r\n }, [element?.id]);\r\n return { labelText, setLabelText };\r\n};\r\n\r\nexport const useLabelShow = (element: ElementModel | undefined) => {\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const updateElementShowLabelById = useStore(Selector.updateElementShowLabelById);\r\n\r\n return () => {\r\n if (element) {\r\n const undoableCheck = {\r\n name: 'Show Label for ' + element.type,\r\n timestamp: Date.now(),\r\n checked: !element.showLabel,\r\n selectedElementId: element.id,\r\n selectedElementType: element.type,\r\n undo: () => {\r\n updateElementShowLabelById(element.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateElementShowLabelById(element.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateElementShowLabelById(element.id, !element.showLabel);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelText = (element: ElementModel | undefined, labelText: string) => {\r\n const updateElementLabelById = useStore(Selector.updateElementLabelById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n return () => {\r\n if (element) {\r\n const oldLabel = element.label;\r\n const undoableChange = {\r\n name: 'Set Label for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldLabel,\r\n newValue: labelText,\r\n changedElementId: element.id,\r\n changedElementType: element.type,\r\n undo: () => {\r\n updateElementLabelById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateElementLabelById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLabelById(element.id, labelText);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelFontSize = (element: ElementModel | undefined) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const updateFontSize = (value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === element?.id) {\r\n e.labelFontSize = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (value: number) => {\r\n if (element) {\r\n const oldSize = element.labelFontSize ?? 20;\r\n const newSize = value;\r\n const undoableChange = {\r\n name: 'Set Label Font Size for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldSize,\r\n newValue: newSize,\r\n undo: () => {\r\n updateFontSize(undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFontSize(undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontSize(newSize);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelSize = (element: ElementModel | undefined) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const updateLabelSize = (value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === element?.id) {\r\n e.labelSize = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (value: number) => {\r\n if (element) {\r\n const oldSize = element.labelSize ?? 0.2;\r\n const newSize = value;\r\n const undoableChange = {\r\n name: 'Set Label Size for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldSize,\r\n newValue: newSize,\r\n undo: () => {\r\n updateLabelSize(undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLabelSize(undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLabelSize(newSize);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelColor = (element: ElementModel | undefined) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const updateLabelColor = (value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === element?.id) {\r\n e.labelColor = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (value: string) => {\r\n if (element) {\r\n const oldColor = element.labelColor ?? 'white';\r\n const newColor = value;\r\n const undoableChange = {\r\n name: 'Set Label Color for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: newColor,\r\n undo: () => {\r\n updateLabelColor(undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateLabelColor(undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLabelColor(newColor as string);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelHeight = (element: ElementModel | undefined) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const updateLabelHeight = (value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === element?.id) {\r\n e.labelHeight = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (value: number) => {\r\n if (element) {\r\n const oldHeight = element.labelHeight ?? element.lz / 2 + 0.2;\r\n const newHeight = value;\r\n const undoableChange = {\r\n name: 'Set Label Height for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldHeight,\r\n newValue: newHeight,\r\n undo: () => {\r\n updateLabelHeight(undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLabelHeight(undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLabelHeight(newHeight);\r\n }\r\n };\r\n};\r\n\r\nexport const useSelectedElement = (objectType: ObjectType) => {\r\n const element = useStore((state) => {\r\n if (!state.selectedElement) return;\r\n return state.elements.find((e) => e.id === state.selectedElement?.id && e.type === objectType);\r\n });\r\n return element;\r\n};\r\n\r\nexport const useColorPicker = (color: string) => {\r\n const [selectedColor, setSelectedColor] = useState(color);\r\n const onColorChange = (colorResult: ColorResult) => {\r\n setSelectedColor(colorResult.hex);\r\n };\r\n return [selectedColor, onColorChange] as [string, (colorResult: ColorResult) => void];\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { Button, Modal } from 'antd';\r\nimport { useRef, useState } from 'react';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from '../../stores/selector';\r\n\r\ninterface DialogProps {\r\n width: number;\r\n title: string;\r\n rejectedMessage?: string | null;\r\n onApply: () => void;\r\n onClose: () => void; // this must be specified for the x button in the upper-right corner to work\r\n onClickOk?: () => void;\r\n onClickCancel?: () => void;\r\n}\r\n\r\nconst Dialog: React.FC = ({\r\n width,\r\n title,\r\n rejectedMessage,\r\n onApply,\r\n onClose,\r\n onClickOk,\r\n onClickCancel,\r\n children,\r\n}) => {\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const lang = useLanguage();\r\n\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n\r\n const dragRef = useRef(null);\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const handleClickOk = () => {\r\n if (onClickOk) {\r\n onClickOk();\r\n } else {\r\n onApply();\r\n onClose();\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const handleClickCancel = () => {\r\n if (onClickCancel) {\r\n onClickCancel();\r\n } else {\r\n onClose();\r\n revertApply();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Enter') {\r\n handleClickOk();\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [handleClickOk]);\r\n\r\n const showRejectMessage = !!rejectedMessage && rejectedMessage.length > 0;\r\n\r\n return (\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {title}\r\n {showRejectMessage && {rejectedMessage}}\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={onClose}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default Dialog;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { CompactPicker } from 'react-color';\r\n\r\nconst FoundationColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const updateElementColorById = useStore(Selector.updateElementColorById);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementColorForAll = useStore(Selector.updateElementColorForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(foundation?.color ?? '#808080');\r\n\r\n const lang = useLanguage();\r\n\r\n const needChange = (color: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (color !== f.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (color !== f.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== foundation?.color) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value?: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.color = value;\r\n } else {\r\n const color = map.get(e.id);\r\n if (color !== undefined) {\r\n e.color = color;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColor = (value: string) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, elem.color ?? '#808080');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n updateInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(useStore.getState().applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n const oldColorsAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldColorsAll.set(elem.id, elem.color ?? '#808080');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAll.oldValues.entries()) {\r\n updateElementColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateElementColorForAll(ObjectType.Foundation, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementColorForAll(ObjectType.Foundation, value);\r\n setApplyCount(useStore.getState().applyCount + 1);\r\n break;\r\n default:\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldColor = f ? f.color : foundation.color;\r\n const undoableChange = {\r\n name: 'Set Color of Selected Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateElementColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateElementColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementColorById(foundation.id, value);\r\n setApplyCount(useStore.getState().applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.foundationColor = value;\r\n });\r\n };\r\n\r\n const apply = () => {\r\n updateColor(selectedColor);\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FoundationColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableSizeGroupChange } from 'src/undo/UndoableSizeGroupChange';\r\nimport { UndoableSizeChange } from 'src/undo/UndoableSizeChange';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { PolygonModel } from 'src/models/PolygonModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst FoundationLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementCxById = useStore(Selector.updateElementCxById);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLxForAll = useStore(Selector.updateElementLxForAll);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const getChildren = useStore(Selector.getChildren);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setCommonStore = useStore(Selector.set);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.lx ?? 0.1);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const denormalizedPosMapRef = useRef>(new Map()); // not absolute position, just denormalized\r\n const oldChildrenVerticesMapRef = useRef>(new Map()); // Point2 is used to store vertices\r\n const newChildrenVerticesMapRef = useRef>(new Map());\r\n const denormalizedVerticesMapRef = useRef>(new Map()); // use Vector2's rotation function\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = { lng: language };\r\n\r\n const containsAllChildren = (lx: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n const children = getChildren(f.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(f, children, lx, f.ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n const children = getChildren(f.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(f, children, lx, f.ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const children = getChildren(foundation.id);\r\n if (children.length > 0) {\r\n return Util.doesNewSizeContainAllChildren(foundation, children, lx, foundation.ly);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const rejectChange = (lx: number) => {\r\n // check if the new length will still contain all children of the foundations in the selected scope\r\n if (!containsAllChildren(lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(foundation?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === curr.id) {\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector2(e.cx, e.cy)\r\n .rotateAround(ORIGIN_VECTOR2, parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const updateLxWithChildren = (parent: FoundationModel, value: number) => {\r\n // store children's relative positions\r\n const children = getChildren(parent.id);\r\n const azimuth = parent.rotation[2];\r\n denormalizedPosMapRef.current.clear(); // this map is for one-time use with each foundation\r\n denormalizedVerticesMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const p = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth);\r\n denormalizedPosMapRef.current.set(c.id, p);\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy));\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = c as PolygonModel;\r\n const arr: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n arr.push(new Vector2(v.x * parent.lx, v.y * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth));\r\n }\r\n denormalizedVerticesMapRef.current.set(c.id, arr);\r\n oldChildrenVerticesMapRef.current.set(\r\n c.id,\r\n polygon.vertices.map((v) => ({ ...v })),\r\n );\r\n break;\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n break;\r\n }\r\n }\r\n }\r\n // update foundation's length\r\n updateElementLxById(parent.id, value);\r\n // update children's relative positions\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n // TODO\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const p = denormalizedPosMapRef.current.get(c.id);\r\n if (p) {\r\n const relativePos = new Vector2(p.x, p.y).rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newCx = relativePos.x / value;\r\n updateElementCxById(c.id, newCx);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(newCx, c.cy));\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const arr = denormalizedVerticesMapRef.current.get(c.id);\r\n if (arr) {\r\n const newVertices: Point2[] = [];\r\n for (const v of arr) {\r\n const relativePos = v.rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newX = relativePos.x / value;\r\n const newY = relativePos.y / parent.ly;\r\n newVertices.push({ x: newX, y: newY } as Point2);\r\n }\r\n updatePolygonVerticesById(c.id, newVertices);\r\n newChildrenVerticesMapRef.current.set(\r\n c.id,\r\n newVertices.map((v) => ({ ...v })),\r\n );\r\n }\r\n break;\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n oldChildrenParentIdMapRef.current.set(c.id, parent.id);\r\n // top, north, south face\r\n if (\r\n Math.abs(c.cz - parent.lz / 2) < ZERO_TOLERANCE ||\r\n Math.abs(Math.abs(c.cy) - parent.ly / 2) < ZERO_TOLERANCE\r\n ) {\r\n // check fall off\r\n if (Math.abs(c.cx) - value / 2 > 0) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, c);\r\n }\r\n }\r\n // west and east face\r\n else if (Math.abs(Math.abs(c.cx) - parent.lx / 2) < ZERO_TOLERANCE) {\r\n const newCx = (c.cx > 0 ? value : -value) / 2;\r\n updateElementCxById(c.id, newCx);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(newCx, c.cy, c.cz));\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLxInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.lx = value;\r\n } else {\r\n const lx = map.get(e.id);\r\n if (lx !== undefined) {\r\n e.lx = lx;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLx = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldLx = f ? f.lx : foundation.lx;\r\n rejectedValue.current = undefined;\r\n rejectRef.current = rejectChange(value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLx);\r\n } else {\r\n oldChildrenPositionsMapRef.current.clear();\r\n newChildrenPositionsMapRef.current.clear();\r\n oldChildrenVerticesMapRef.current.clear();\r\n newChildrenVerticesMapRef.current.clear();\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLxsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLxsSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n updateLxWithChildren(elem as FoundationModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsSelected,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateLxInMap(undoableChangeAll.oldSizes as Map);\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateLxInMap(undoableChangeAll.oldSizes as Map, undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n const oldLxsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldLxsAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n updateLxWithChildren(elem as FoundationModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Foundations',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLxById(id, lx as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLxForAll(ObjectType.Foundation, undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n default:\r\n updateLxWithChildren(foundation, value);\r\n const undoableChange = {\r\n name: 'Set Foundation Length',\r\n timestamp: Date.now(),\r\n oldSize: oldLx,\r\n newSize: value,\r\n resizedElementId: foundation.id,\r\n resizedElementType: foundation.type,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateElementLxById(foundation.id, undoableChange.oldSize as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.oldChildrenVerticesMap && undoableChange.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLxById(foundation.id, undoableChange.newSize as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, p] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, p.x, p.y, p.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.newChildrenVerticesMap && undoableChange.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLx(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLx(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FoundationLengthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { Util } from 'src/Util';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { UndoableSizeChange } from 'src/undo/UndoableSizeChange';\r\nimport { UndoableSizeGroupChange } from 'src/undo/UndoableSizeGroupChange';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { PolygonModel } from 'src/models/PolygonModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FoundationWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const updateElementCyById = useStore(Selector.updateElementCyById);\r\n const updateElementLyById = useStore(Selector.updateElementLyById);\r\n const updateElementLyForAll = useStore(Selector.updateElementLyForAll);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const getChildren = useStore(Selector.getChildren);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setCommonStore = useStore(Selector.set);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.ly ?? 0.1);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const denormalizedPositionMapRef = useRef>(new Map()); // not absolute position, just denormalized\r\n const oldChildrenVerticesMapRef = useRef>(new Map()); // Point2 is used to store vertices\r\n const newChildrenVerticesMapRef = useRef>(new Map());\r\n const denormalizedVerticesMapRef = useRef>(new Map()); // use Vector2's rotation function\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const containsAllChildren = (ly: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n const children = getChildren(f.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(f, children, f.lx, ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n const children = getChildren(f.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(f, children, f.lx, ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const children = getChildren(foundation.id);\r\n if (children.length > 0) {\r\n return Util.doesNewSizeContainAllChildren(foundation, children, foundation.lx, ly);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const rejectChange = (ly: number) => {\r\n // check if the new width will still contain all children of the foundations in the selected scope\r\n if (!containsAllChildren(ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!foundation) return;\r\n\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(foundation?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === curr.id) {\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector2(e.cx, e.cy)\r\n .rotateAround(ORIGIN_VECTOR2, parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const updateLyWithChildren = (parent: FoundationModel, value: number) => {\r\n // store children's relative positions\r\n const children = getChildren(parent.id);\r\n const azimuth = parent.rotation[2];\r\n denormalizedPositionMapRef.current.clear(); // this map is for one-time use with each foundation\r\n denormalizedVerticesMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n // TODO\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const p = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth);\r\n denormalizedPositionMapRef.current.set(c.id, p);\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy));\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = c as PolygonModel;\r\n const arr: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n arr.push(new Vector2(v.x * parent.lx, v.y * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth));\r\n }\r\n denormalizedVerticesMapRef.current.set(c.id, arr);\r\n oldChildrenVerticesMapRef.current.set(\r\n c.id,\r\n polygon.vertices.map((v) => ({ ...v })),\r\n );\r\n break;\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n break;\r\n }\r\n }\r\n }\r\n // update foundation's width\r\n updateElementLyById(parent.id, value);\r\n // update children's relative positions\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n // TODO\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const p = denormalizedPositionMapRef.current.get(c.id);\r\n if (p) {\r\n const relativePos = new Vector2(p.x, p.y).rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newCy = relativePos.y / value;\r\n updateElementCyById(c.id, newCy);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, newCy));\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const arr = denormalizedVerticesMapRef.current.get(c.id);\r\n if (arr) {\r\n const newVertices: Point2[] = [];\r\n for (const v of arr) {\r\n const relativePos = v.rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newX = relativePos.x / parent.lx;\r\n const newY = relativePos.y / value;\r\n newVertices.push({ x: newX, y: newY } as Point2);\r\n }\r\n updatePolygonVerticesById(c.id, newVertices);\r\n newChildrenVerticesMapRef.current.set(\r\n c.id,\r\n newVertices.map((v) => ({ ...v })),\r\n );\r\n }\r\n break;\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n oldChildrenParentIdMapRef.current.set(c.id, parent.id);\r\n // top, north, south face\r\n if (\r\n Math.abs(c.cz - parent.lz / 2) < ZERO_TOLERANCE ||\r\n Math.abs(Math.abs(c.cx) - parent.lx / 2) < ZERO_TOLERANCE\r\n ) {\r\n // check fall off\r\n if (Math.abs(c.cy) - value / 2 > 0) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, c);\r\n }\r\n }\r\n // north and south face\r\n else if (Math.abs(Math.abs(c.cy) - parent.ly / 2) < ZERO_TOLERANCE) {\r\n const newCy = (c.cy > 0 ? value : -value) / 2;\r\n updateElementCyById(c.id, newCy);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cz, newCy, c.cz));\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLy = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldLy = f ? f.ly : foundation.ly;\r\n rejectedValue.current = undefined;\r\n rejectRef.current = rejectChange(value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLy);\r\n } else {\r\n oldChildrenPositionsMapRef.current.clear();\r\n newChildrenPositionsMapRef.current.clear();\r\n oldChildrenVerticesMapRef.current.clear();\r\n newChildrenVerticesMapRef.current.clear();\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLysSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLysSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n updateLyWithChildren(elem as FoundationModel, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysSelected,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenVerticesMap &&\r\n undoableChangeSelected.oldChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLyById(id, undoableChangeSelected.newSize as number);\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenVerticesMap &&\r\n undoableChangeSelected.newChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLysAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldLysAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n updateLyWithChildren(elem as FoundationModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Foundations',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLyForAll(ObjectType.Foundation, undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n updateLyWithChildren(foundation, value);\r\n const undoableChange = {\r\n name: 'Set Foundation Width',\r\n timestamp: Date.now(),\r\n oldSize: oldLy,\r\n newSize: value,\r\n resizedElementId: foundation.id,\r\n resizedElementType: foundation.type,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateElementLyById(foundation.id, undoableChange.oldSize as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.oldChildrenVerticesMap && undoableChange.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLyById(foundation.id, undoableChange.newSize as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.newChildrenVerticesMap && undoableChange.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n updateLy(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n updateLy(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FoundationWidthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FoundationHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.lz ?? 0.1);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n\r\n const lang = useLanguage();\r\n\r\n const updateLzAndCzById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n const el = state.elements.find((e) => e.id === id);\r\n if (!el) return;\r\n el.lz = value;\r\n el.cz = value / 2;\r\n });\r\n };\r\n\r\n const updateLzAndCzForAll = (type: ObjectType, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lz = value;\r\n e.cz = value / 2;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (lz: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(foundation?.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n curr.parentId = GROUND_ID;\r\n const absPos = new Vector2(curr.cx, curr.cy)\r\n .rotateAround(ORIGIN_VECTOR2, -parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n curr.cx = absPos.x;\r\n curr.cy = absPos.y;\r\n curr.cz = 0;\r\n newChildrenPositionsMapRef.current.set(curr.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(curr.id, GROUND_ID);\r\n }\r\n };\r\n\r\n const updateCzOfChildren = (parent: ElementModel, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === parent.id) {\r\n oldChildrenParentIdMapRef.current.set(e.id, parent.id);\r\n oldChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, e.cz));\r\n if (Util.isPlantOrHuman(e)) {\r\n // top face\r\n if (Math.abs(e.cz - parent.lz / 2) < ZERO_TOLERANCE) {\r\n e.cz = value / 2;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, value / 2));\r\n }\r\n // side faces\r\n else {\r\n // check fall off\r\n const newRelZ = e.cz + parent.cz - value / 2;\r\n if (Math.abs(newRelZ) > value / 2) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, e);\r\n } else {\r\n e.cz = newRelZ;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, newRelZ));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLzAndCzInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.lz = value;\r\n e.cz = value / 2;\r\n } else {\r\n const lz = map.get(e.id);\r\n if (lz !== undefined) {\r\n e.lz = lz;\r\n e.cz = lz / 2;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLz = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLzsSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Foundation &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldLzsSelected.set(elem.id, elem.lz);\r\n }\r\n }\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Foundation &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsSelected,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateLzAndCzInMap(undoableChangeSelected.oldValues as Map);\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newLz = undoableChangeSelected.newValue as number;\r\n updateLzAndCzInMap(undoableChangeSelected.oldValues as Map, newLz);\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateLzAndCzInMap(oldLzsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n const oldLzsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldLzsAll.set(elem.id, elem.lz);\r\n }\r\n }\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsAll,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lz] of undoableChangeAll.oldValues.entries()) {\r\n updateLzAndCzById(id, lz as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newLz = undoableChangeAll.newValue as number;\r\n updateLzAndCzForAll(ObjectType.Foundation, newLz);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLzAndCzForAll(ObjectType.Foundation, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n default:\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldLz = f ? f.lz : foundation.lz;\r\n updateCzOfChildren(foundation, value);\r\n updateLzAndCzById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Foundation Height',\r\n timestamp: Date.now(),\r\n oldValue: oldLz,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateLzAndCzById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateLzAndCzById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.foundationHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setLz(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(value);\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default FoundationHeightInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FoundationAzimuthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementRotationById = useStore(Selector.updateElementRotationById);\r\n const updateElementRotationForAll = useStore(Selector.updateElementRotationForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n // reverse the sign because rotation angle is positive counterclockwise whereas azimuth is positive clockwise\r\n const [inputValue, setInputValue] = useState(foundation ? -foundation?.rotation[2] ?? 0 : 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const needChange = (azimuth: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(-f.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(-f.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(-foundation?.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.rotation[2] = value;\r\n } else {\r\n const rot = map.get(e.id);\r\n if (rot !== undefined) {\r\n e.rotation[2] = -rot;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAzimuth = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldAzimuthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldAzimuthsSelected.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Azimuth for All Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, -undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateInMap(oldAzimuthsSelected, -value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n const oldAzimuthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldAzimuthsAll.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Azimuth for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, az] of undoableChangeAll.oldValues.entries()) {\r\n updateElementRotationById(id, 0, 0, -(az as number));\r\n }\r\n },\r\n redo: () => {\r\n updateElementRotationForAll(ObjectType.Foundation, 0, 0, -(undoableChangeAll.newValue as number));\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementRotationForAll(ObjectType.Foundation, 0, 0, -value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n default:\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldAzimuth = f ? -f.rotation[2] : -foundation.rotation[2];\r\n const undoableChange = {\r\n name: 'Set Foundation Azimuth',\r\n timestamp: Date.now(),\r\n oldValue: oldAzimuth,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateElementRotationById(undoableChange.changedElementId, 0, 0, -(undoableChange.oldValue as number));\r\n },\r\n redo: () => {\r\n updateElementRotationById(undoableChange.changedElementId, 0, 0, -(undoableChange.newValue as number));\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementRotationById(foundation.id, 0, 0, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateAzimuth(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n `${value}°`}\r\n onChange={(value) => {\r\n setInputValue(Util.toRadians(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [-180°, 180°]\r\n
\r\n {i18n.t('message.AzimuthOfNorthIsZero', lang)}\r\n
\r\n {i18n.t('message.CounterclockwiseAzimuthIsPositive', lang)}\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default FoundationAzimuthInput;\r\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/foundation_03_menu.1a0820a4.png\";","export default __webpack_public_path__ + \"static/media/foundation_04_menu.cfdf351d.png\";","export default __webpack_public_path__ + \"static/media/foundation_05_menu.7f382511.png\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/foundation_07_menu.cf056d65.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport Foundation_Texture_01_Menu from '../../../resources/foundation_01_menu.png';\r\nimport Foundation_Texture_02_Menu from '../../../resources/foundation_02_menu.png';\r\nimport Foundation_Texture_03_Menu from '../../../resources/foundation_03_menu.png';\r\nimport Foundation_Texture_04_Menu from '../../../resources/foundation_04_menu.png';\r\nimport Foundation_Texture_05_Menu from '../../../resources/foundation_05_menu.png';\r\nimport Foundation_Texture_06_Menu from '../../../resources/foundation_06_menu.png';\r\nimport Foundation_Texture_07_Menu from '../../../resources/foundation_07_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FoundationTexture, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FoundationTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(foundation?.textureType ?? FoundationTexture.NoTexture);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateFoundationTextureById = (id: string, texture: FoundationTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n (e as FoundationModel).textureType = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFoundationTextureForAll = (texture: FoundationTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n (e as FoundationModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (texture: FoundationTexture) => {\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (texture !== f.textureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (texture !== f.textureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (texture !== foundation?.textureType) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateTextureInMap = (map: Map, value?: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && map.has(e.id)) {\r\n if (value !== undefined) {\r\n (e as FoundationModel).textureType = value as FoundationTexture;\r\n } else {\r\n const texture = map.get(e.id);\r\n if (texture !== undefined) {\r\n (e as FoundationModel).textureType = texture as FoundationTexture;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTexture = (value: FoundationTexture) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTexturesSelected.set(elem.id, (elem as FoundationModel).textureType ?? FoundationTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n updateTextureInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeAll.oldValues as Map,\r\n undoableChangeAll.newValue as FoundationTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateTextureInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldTexturesAll.set(elem.id, (elem as FoundationModel).textureType ?? FoundationTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeAll.oldValues.entries()) {\r\n updateFoundationTextureById(id, texture as FoundationTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateFoundationTextureForAll(undoableChangeAll.newValue as FoundationTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateFoundationTextureForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldTexture = f ? f.textureType : foundation.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateFoundationTextureById(undoableChange.changedElementId, undoableChange.oldValue as FoundationTexture);\r\n },\r\n redo: () => {\r\n updateFoundationTextureById(undoableChange.changedElementId, undoableChange.newValue as FoundationTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFoundationTextureById(foundation.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.foundationTexture = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FoundationTextureSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipeHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.absorberHeight ?? 10);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberHeight = height;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberHeight = height;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberHeight = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (absorberHeight: number) => {\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberHeight === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberHeight - absorberHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberHeight === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberHeight - absorberHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.absorberHeight === undefined ||\r\n Math.abs(absorberPipe?.absorberHeight - absorberHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setAbsorberHeight = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.absorberHeight ?? 10);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ah] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ah as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.absorberHeight ?? 10);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ah] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ah as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe ? f.solarAbsorberPipe.absorberHeight ?? 10 : absorberPipe.absorberHeight ?? 10;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Height on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAbsorberHeight(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 50] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipeAbsorptanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.absorberAbsorptance ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, absorptance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberAbsorptance = absorptance;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (absorptance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberAbsorptance = absorptance;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberAbsorptance = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (absorptance: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberAbsorptance === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberAbsorptance === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.absorberAbsorptance === undefined ||\r\n Math.abs(absorberPipe?.absorberAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateAbsorptance = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.absorberAbsorptance ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Pipe Absorptance for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.absorberAbsorptance ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Pipe Absorptance for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe\r\n ? f.solarAbsorberPipe.absorberAbsorptance ?? 0.95\r\n : absorberPipe.absorberAbsorptance ?? 0.95;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Pipe Absorptance on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateAbsorptance(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeAbsorptanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarAbsorberPipeOpticalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.absorberOpticalEfficiency ?? 0.7);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberOpticalEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberOpticalEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberOpticalEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberOpticalEfficiency === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberOpticalEfficiency === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.absorberOpticalEfficiency === undefined ||\r\n Math.abs(absorberPipe?.absorberOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setOpticalEfficiency = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.absorberOpticalEfficiency ?? 0.7);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Optical Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, oe] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, oe as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.absorberOpticalEfficiency ?? 0.7);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Optical Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, oe] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, oe as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe\r\n ? f.solarAbsorberPipe.absorberOpticalEfficiency ?? 0.7\r\n : absorberPipe.absorberOpticalEfficiency ?? 0.7;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Optical Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setOpticalEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeOpticalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipeThermalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.absorberThermalEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberThermalEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberThermalEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberThermalEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberThermalEfficiency === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberThermalEfficiency === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.absorberThermalEfficiency === undefined ||\r\n Math.abs(absorberPipe?.absorberThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setThermalEfficiency = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.absorberThermalEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Thermal Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, te] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, te as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.absorberThermalEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Thermal Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, te] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, te as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe\r\n ? f.solarAbsorberPipe.absorberThermalEfficiency ?? 0.3\r\n : absorberPipe.absorberThermalEfficiency ?? 0.3;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Thermal Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThermalEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeThermalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipeApertureWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.apertureWidth ?? 0.6);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, apertureWidth: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.apertureWidth = apertureWidth;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (apertureWidth: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.apertureWidth = apertureWidth;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.apertureWidth = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (apertureWidth: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.apertureWidth === undefined ||\r\n Math.abs(f.solarAbsorberPipe.apertureWidth - apertureWidth) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.apertureWidth === undefined ||\r\n Math.abs(f.solarAbsorberPipe.apertureWidth - apertureWidth) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.apertureWidth === undefined ||\r\n Math.abs(absorberPipe?.apertureWidth - apertureWidth) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateApertureWidth = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValues = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValues.set(elem.id, f.solarAbsorberPipe.apertureWidth ?? 0.6);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Aperture Width for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, aw] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, aw as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValues, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValues = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValues.set(elem.id, f.solarAbsorberPipe.apertureWidth ?? 0.6);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Aperture Width for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, aw] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, aw as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe ? f.solarAbsorberPipe.apertureWidth ?? 0.6 : absorberPipe.apertureWidth ?? 0.6;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Aperture Width on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateApertureWidth(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 2] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeApertureWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipePoleNumberInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.poleNumber ?? 5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, poleNumber: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.poleNumber = poleNumber;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (poleNumber: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.poleNumber = poleNumber;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.poleNumber = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (f.solarAbsorberPipe.poleNumber === undefined || f.solarAbsorberPipe.poleNumber !== value) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (f.solarAbsorberPipe.poleNumber === undefined || f.solarAbsorberPipe.poleNumber !== value) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (absorberPipe?.poleNumber === undefined || absorberPipe?.poleNumber !== value) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setPoleNumber = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.poleNumber ?? 5);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Pipe Pole Number for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, pn] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, pn as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.poleNumber ?? 5);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Pipe Pole Number for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, pn] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, pn as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue = f && f.solarAbsorberPipe ? f.solarAbsorberPipe.poleNumber ?? 5 : absorberPipe.poleNumber ?? 5;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Pipe Pole Number on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPoleNumber(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 100]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipePoleNumberInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerChimneyHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const [inputValue, setInputValue] = useState(\r\n foundation?.solarUpdraftTower?.chimneyHeight ?? Math.max(foundation?.lx ?? 0, foundation?.ly ?? 0),\r\n );\r\n\r\n const lang = useLanguage();\r\n\r\n const updateChimneyHeightById = (id: string, height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyHeight = height;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateChimneyHeightForAll = (height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyHeight = height;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyHeight = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (chimneyHeight: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.chimneyHeight === undefined ||\r\n Math.abs(f.solarUpdraftTower.chimneyHeight - chimneyHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.chimneyHeight === undefined ||\r\n Math.abs(f.solarUpdraftTower.chimneyHeight - chimneyHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.chimneyHeight === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.chimneyHeight - chimneyHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setChimneyHeight = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower?.chimneyHeight ?? Math.max(f.lx, f.ly));\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Chimney Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ch] of undoableChangeSelected.oldValues.entries()) {\r\n updateChimneyHeightById(id, ch as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower?.chimneyHeight ?? Math.max(f.lx, f.ly));\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Chimney Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ch] of undoableChangeAll.oldValues.entries()) {\r\n updateChimneyHeightById(id, ch as number);\r\n }\r\n },\r\n redo: () => {\r\n updateChimneyHeightForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateChimneyHeightForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.chimneyHeight ?? Math.max(f.lx, f.ly)\r\n : foundation.solarUpdraftTower.chimneyHeight ?? Math.max(foundation.lx, foundation.ly);\r\n updateChimneyHeightById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Chimney Height on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateChimneyHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateChimneyHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setChimneyHeight(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerChimneyHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerChimneyRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(\r\n foundation?.solarUpdraftTower?.chimneyRadius ??\r\n Math.max(1, 0.025 * Math.min(foundation?.lx ?? 0, foundation?.ly ?? 0)),\r\n );\r\n\r\n const lang = useLanguage();\r\n\r\n const updateChimneyRadiusById = (id: string, radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyRadius = radius;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateChimneyRadiusForAll = (radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyRadius = radius;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyRadius = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (chimneyRadius: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.chimneyRadius === undefined ||\r\n Math.abs(f.solarUpdraftTower.chimneyRadius - chimneyRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.chimneyRadius === undefined ||\r\n Math.abs(f.solarUpdraftTower.chimneyRadius - chimneyRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.chimneyRadius === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.chimneyRadius - chimneyRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setChimneyRadius = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(\r\n elem.id,\r\n f.solarUpdraftTower?.chimneyRadius ?? Math.max(1, 0.025 * Math.min(f.lx, f.ly)),\r\n );\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Chimney Radius for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, cr] of undoableChangeSelected.oldValues.entries()) {\r\n updateChimneyRadiusById(id, cr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(\r\n elem.id,\r\n f.solarUpdraftTower?.chimneyRadius ?? Math.max(1, 0.025 * Math.min(f.lx, f.ly)),\r\n );\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Chimney Radius for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, cr] of undoableChangeAll.oldValues.entries()) {\r\n updateChimneyRadiusById(id, cr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateChimneyRadiusForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateChimneyRadiusForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.chimneyRadius ?? Math.max(1, 0.025 * Math.min(f.lx, f.ly))\r\n : foundation.solarUpdraftTower.chimneyRadius ??\r\n Math.max(1, 0.025 * Math.min(foundation.lx, foundation.ly));\r\n updateChimneyRadiusById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Chimney Radius on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateChimneyRadiusById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateChimneyRadiusById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setChimneyRadius(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerChimneyRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerCollectorRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(\r\n foundation?.solarUpdraftTower?.collectorRadius ??\r\n Math.max(10, 0.5 * Math.min(foundation?.lx ?? 0, foundation?.ly ?? 0)),\r\n );\r\n\r\n const lang = useLanguage();\r\n\r\n const updateCollectorRadiusById = (id: string, radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorRadius = radius;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCollectorRadiusForAll = (radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorRadius = radius;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorRadius = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (collectorRadius: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorRadius === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorRadius - collectorRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorRadius === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorRadius - collectorRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.collectorRadius === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.collectorRadius - collectorRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setCollectorRadius = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(\r\n elem.id,\r\n f.solarUpdraftTower.collectorRadius ?? Math.max(10, 0.5 * Math.min(f.lx, f.ly)),\r\n );\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Collector Radius for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, cr] of undoableChangeSelected.oldValues.entries()) {\r\n updateCollectorRadiusById(id, cr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(\r\n elem.id,\r\n f.solarUpdraftTower.collectorRadius ?? Math.max(10, 0.5 * Math.min(f.lx, f.ly)),\r\n );\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Collector Radius for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, cr] of undoableChangeAll.oldValues.entries()) {\r\n updateCollectorRadiusById(id, cr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateCollectorRadiusForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateCollectorRadiusForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.collectorRadius ?? Math.max(10, 0.5 * Math.min(f.lx, f.ly))\r\n : foundation.solarUpdraftTower.collectorRadius ??\r\n Math.max(10, 0.5 * Math.min(foundation.lx, foundation.ly));\r\n updateCollectorRadiusById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Collector Radius on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateCollectorRadiusById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateCollectorRadiusById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setCollectorRadius(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerCollectorRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerCollectorHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setActionScope = useStore(Selector.setFoundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(\r\n foundation?.solarUpdraftTower?.collectorHeight ?? Math.max(3, 10 * (foundation?.lz ?? 0)),\r\n );\r\n\r\n const lang = useLanguage();\r\n\r\n const updateCollectorHeightById = (id: string, height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorHeight = height;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCollectorHeightForAll = (height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorHeight = height;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorHeight = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (collectorHeight: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorHeight === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorHeight - collectorHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorHeight === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorHeight - collectorHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.collectorHeight === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.collectorHeight - collectorHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setCollectorHeight = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.collectorHeight ?? Math.max(3, 10 * f.lz));\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Collector Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ch] of undoableChangeSelected.oldValues.entries()) {\r\n updateCollectorHeightById(id, ch as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.collectorHeight ?? Math.max(3, 10 * f.lz));\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Collector Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ch] of undoableChangeAll.oldValues.entries()) {\r\n updateCollectorHeightById(id, ch as number);\r\n }\r\n },\r\n redo: () => {\r\n updateCollectorHeightForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateCollectorHeightForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.collectorHeight ?? Math.max(3, 10 * f.lz)\r\n : foundation.solarUpdraftTower.collectorHeight ?? Math.max(3, 10 * foundation.lz);\r\n updateCollectorHeightById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Collector Height on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateCollectorHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateCollectorHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setCollectorHeight(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 20] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerCollectorHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPowerTowerHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.towerHeight ?? 20);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerHeight = height;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerHeight = height;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerHeight = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (towerHeight: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.towerHeight === undefined ||\r\n Math.abs(f.solarPowerTower.towerHeight - towerHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.towerHeight === undefined ||\r\n Math.abs(f.solarPowerTower.towerHeight - towerHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (powerTower?.towerHeight === undefined || Math.abs(powerTower?.towerHeight - towerHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTowerHeight = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.towerHeight ?? 20);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tower Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, th] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, th as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.towerHeight ?? 20);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tower Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, th] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, th as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue = f && f.solarPowerTower ? f.solarPowerTower.towerHeight ?? 20 : powerTower.towerHeight ?? 20;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Tower Height on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTowerHeight(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [10, 500] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPowerTowerHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPowerTowerRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.towerRadius ?? 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerRadius = radius;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerRadius = radius;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerRadius = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (towerRadius: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.towerRadius === undefined ||\r\n Math.abs(f.solarPowerTower.towerRadius - towerRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.towerRadius === undefined ||\r\n Math.abs(f.solarPowerTower.towerRadius - towerRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (powerTower?.towerRadius === undefined || Math.abs(powerTower?.towerRadius - towerRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTowerRadius = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.towerRadius ?? 1);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tower Radius for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, th] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, th as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.towerRadius ?? 1);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tower Radius for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, th] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, th as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue = f && f.solarPowerTower ? f.solarPowerTower.towerRadius ?? 1 : powerTower.towerRadius ?? 1;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Tower Radius on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTowerRadius(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.5, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPowerTowerRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nimport Dialog from '../dialog';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPowerTowerReceiverAbsorptanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.receiverAbsorptance ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, absorptance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverAbsorptance = absorptance;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (absorptance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverAbsorptance = absorptance;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverAbsorptance = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (absorptance: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverAbsorptance === undefined ||\r\n Math.abs(f.solarPowerTower.receiverAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverAbsorptance === undefined ||\r\n Math.abs(f.solarPowerTower.receiverAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n powerTower?.receiverAbsorptance === undefined ||\r\n Math.abs(powerTower?.receiverAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setAbsorptance = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.receiverAbsorptance ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Receiver Absorptance for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.receiverAbsorptance ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Receiver Absorptance for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarPowerTower\r\n ? f.solarPowerTower.receiverAbsorptance ?? 0.95\r\n : powerTower.receiverAbsorptance ?? 0.95;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Receiver Absorptance on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAbsorptance(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPowerTowerReceiverAbsorptanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPowerTowerReceiverOpticalEfficiencyInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.receiverOpticalEfficiency ?? 0.7);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverOpticalEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverOpticalEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverOpticalEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverOpticalEfficiency === undefined ||\r\n Math.abs(f.solarPowerTower.receiverOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverOpticalEfficiency === undefined ||\r\n Math.abs(f.solarPowerTower.receiverOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n powerTower?.receiverOpticalEfficiency === undefined ||\r\n Math.abs(powerTower?.receiverOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateOpticalEfficiency = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.receiverOpticalEfficiency ?? 0.7);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Receiver Optical Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, oe] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, oe as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.receiverOpticalEfficiency ?? 0.7);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Receiver Optical Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, oe] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, oe as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarPowerTower\r\n ? f.solarPowerTower.receiverOpticalEfficiency ?? 0.7\r\n : powerTower.receiverOpticalEfficiency ?? 0.7;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Receiver Optical Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateOpticalEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPowerTowerReceiverOpticalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPowerTowerReceiverThermalEfficiencyInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.receiverThermalEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverThermalEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverThermalEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverThermalEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverThermalEfficiency === undefined ||\r\n Math.abs(f.solarPowerTower.receiverThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverThermalEfficiency === undefined ||\r\n Math.abs(f.solarPowerTower.receiverThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n powerTower?.receiverThermalEfficiency === undefined ||\r\n Math.abs(powerTower?.receiverThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setThermalEfficiency = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.receiverThermalEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Receiver Thermal Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, te] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, te as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.receiverThermalEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Receiver Thermal Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, te] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, te as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarPowerTower\r\n ? f.solarPowerTower.receiverThermalEfficiency ?? 0.3\r\n : powerTower.receiverThermalEfficiency ?? 0.3;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Receiver Thermal Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThermalEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPowerTowerReceiverThermalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerCollectorTransmissivityInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.solarUpdraftTower?.collectorTransmissivity ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, transmissivity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorTransmissivity = transmissivity;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (transmissivity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorTransmissivity = transmissivity;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorTransmissivity = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (transmissivity: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorTransmissivity === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorTransmissivity - transmissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorTransmissivity === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorTransmissivity - transmissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.collectorTransmissivity === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.collectorTransmissivity - transmissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTransmissivity = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.collectorTransmissivity ?? 0.9);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Collector Transmissivity for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ct] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ct as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.collectorTransmissivity ?? 0.9);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Collector Transmissivity for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ct] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ct as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.collectorTransmissivity ?? 0.9\r\n : foundation.solarUpdraftTower.collectorTransmissivity ?? 0.9;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Collector Transmissivity on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTransmissivity(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerCollectorTransmissivityInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerDischargeCoefficientInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.solarUpdraftTower?.dischargeCoefficient ?? 0.65);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, coefficient: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.dischargeCoefficient = coefficient;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (coefficient: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.dischargeCoefficient = coefficient;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.dischargeCoefficient = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (coefficient: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.dischargeCoefficient === undefined ||\r\n Math.abs(f.solarUpdraftTower.dischargeCoefficient - coefficient) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.dischargeCoefficient === undefined ||\r\n Math.abs(f.solarUpdraftTower.dischargeCoefficient - coefficient) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.dischargeCoefficient === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.dischargeCoefficient - coefficient) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setCoefficient = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.dischargeCoefficient ?? 0.65);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Chimney Discharge Coefficient for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, dc] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, dc as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.dischargeCoefficient ?? 0.65);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Chimney Discharge Coefficient for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, dc] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, dc as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.dischargeCoefficient ?? 0.65\r\n : foundation.solarUpdraftTower.dischargeCoefficient ?? 0.65;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Chimney Discharge Coefficient on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setCoefficient(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.65, 0.70]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerDischargeCoefficientInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerTurbineEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.solarUpdraftTower?.turbineEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.turbineEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.turbineEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.turbineEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.turbineEfficiency === undefined ||\r\n Math.abs(f.solarUpdraftTower.turbineEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.turbineEfficiency === undefined ||\r\n Math.abs(f.solarUpdraftTower.turbineEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.turbineEfficiency === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.turbineEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setEfficiency = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.turbineEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Updraft Tower Turbine Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, dc] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, dc as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.turbineEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Updraft Tower Turbine Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, dc] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, dc as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.turbineEfficiency ?? 0.3\r\n : foundation.solarUpdraftTower.turbineEfficiency ?? 0.3;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Updraft Tower Turbine Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.2, 1.0]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerTurbineEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerCollectorEmissivityInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.solarUpdraftTower?.collectorEmissivity ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, emissivity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorEmissivity = emissivity;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (emissivity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorEmissivity = emissivity;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorEmissivity = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (emissivity: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorEmissivity === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorEmissivity - emissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorEmissivity === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorEmissivity - emissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.collectorEmissivity === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.collectorEmissivity - emissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setEmissivity = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.collectorEmissivity ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Collector Emissivity for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ce] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ce as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.collectorEmissivity ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Collector Emissivity for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ce] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ce as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.collectorEmissivity ?? 0.95\r\n : foundation.solarUpdraftTower.collectorEmissivity ?? 0.95;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Collector Emissivity on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setEmissivity(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerCollectorEmissivityInput;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport {\n DesignProblem,\n EvolutionMethod,\n GeneticAlgorithmSelectionMethod,\n ObjectiveFunctionType,\n SearchMethod,\n} from '../../../types';\nimport { showInfo } from '../../../helpers';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\n\nconst { Option } = Select;\n\nconst SolarPanelTiltAngleGaWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const params = useStore(Selector.evolutionaryAlgorithmState).geneticAlgorithmParams;\n const selectionMethodRef = useRef(params.selectionMethod);\n const searchMethodRef = useRef(params.searchMethod);\n const objectiveFunctionTypeRef = useRef(\n Math.min(params.objectiveFunctionType, ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT),\n );\n const populationSizeRef = useRef(params.populationSize);\n const maximumGenerationsRef = useRef(params.maximumGenerations);\n const mutationRateRef = useRef(params.mutationRate);\n const selectionRateRef = useRef(params.selectionRate ?? 0.5);\n const crossoverRateRef = useRef(params.crossoverRate ?? 0.5);\n const convergenceThresholdRef = useRef(params.convergenceThreshold);\n const localSearchRadiusRef = useRef(params.localSearchRadius);\n const okButtonRef = useRef(null);\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const lang = { lng: language };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n // save the values in the common store to persist the user's last settings\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.problem = DesignProblem.SOLAR_PANEL_TILT_ANGLE;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType = objectiveFunctionTypeRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod = selectionMethodRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod = searchMethodRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize = populationSizeRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations = maximumGenerationsRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate = selectionRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate = crossoverRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate = mutationRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold = convergenceThresholdRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius = localSearchRadiusRef.current;\n });\n };\n\n const run = () => {\n if (!runEvolution) {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n }\n updateStoreParams();\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = !state.runEvolution;\n });\n setCommonStore((state) => {\n state.evolutionMethod = EvolutionMethod.GENETIC_ALGORITHM;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.problem = DesignProblem.SOLAR_PANEL_TILT_ANGLE;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Genetic Algorithm for Solar Panel Tilt Angle',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang) + ': '}\n {i18n.t('optimizationMenu.GeneticAlgorithmSettings', lang)}\n \n }\n footer={[\n {\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Cancel', lang)}\n ,\n {\n run();\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Run', lang)}\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('optimizationMenu.Objective', lang) + ':'}\n \n \n {\n objectiveFunctionTypeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.GeneticAlgorithmSelectionMethod', lang) + ':'}\n \n \n {\n selectionMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.RouletteWheel', lang)}\n \n \n {i18n.t('optimizationMenu.Tournament', lang)}\n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.PopulationSize', lang) + ':'}\n \n \n Number(a).toFixed(0)}\n value={populationSizeRef.current}\n step={1}\n onChange={(value) => {\n populationSizeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumGenerations', lang) + ':'}\n \n \n Number(a).toFixed(0)}\n value={maximumGenerationsRef.current}\n onChange={(value) => {\n maximumGenerationsRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SelectionRate', lang) + ' [0, 1]: '}\n \n \n {\n selectionRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.CrossoverRate', lang) + ' [0, 1]: '}\n \n \n {\n crossoverRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MutationRate', lang) + ' [0, 1]: '}\n \n \n {\n mutationRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.ConvergenceThreshold', lang) + ' [0, 0.1]: '}\n \n \n {\n convergenceThresholdRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SearchMethod', lang) + ':'}\n \n \n {\n searchMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.GlobalSearchUniformSelection', lang)}\n \n \n {i18n.t('optimizationMenu.LocalSearchRandomOptimization', lang)}\n \n \n \n \n\n {searchMethodRef.current === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION && (\n \n \n {i18n.t('optimizationMenu.LocalSearchRadius', lang) + ' ([0, 1]: '}\n \n \n {\n localSearchRadiusRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n )}\n \n \n );\n};\n\n// don't wrap this with React.memo as changedRef would be saved\nexport default SolarPanelTiltAngleGaWizard;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { DesignProblem, EvolutionMethod, ObjectiveFunctionType, SearchMethod } from '../../../types';\nimport { showInfo } from '../../../helpers';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\n\nconst { Option } = Select;\n\nconst SolarPanelTiltAnglePsoWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const params = useStore(Selector.evolutionaryAlgorithmState).particleSwarmOptimizationParams;\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const objectiveFunctionTypeRef = useRef(\n Math.min(params.objectiveFunctionType, ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT),\n );\n const searchMethodRef = useRef(params.searchMethod);\n const swarmSizeRef = useRef(params.swarmSize);\n const maximumStepsRef = useRef(params.maximumSteps);\n const vmaxRef = useRef(params.vmax ?? 0.01);\n const inertiaRef = useRef(params.inertia ?? 0.8);\n const cognitiveCoefficientRef = useRef(params.cognitiveCoefficient ?? 0.1);\n const socialCoefficientRef = useRef(params.socialCoefficient ?? 0.1);\n const convergenceThresholdRef = useRef(params.convergenceThreshold);\n const localSearchRadiusRef = useRef(params.localSearchRadius);\n const okButtonRef = useRef(null);\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const lang = { lng: language };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n // save the values in the common store to persist the user's last settings\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem = DesignProblem.SOLAR_PANEL_TILT_ANGLE;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType =\n objectiveFunctionTypeRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod = searchMethodRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize = swarmSizeRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps = maximumStepsRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient =\n cognitiveCoefficientRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient = socialCoefficientRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.vmax = vmaxRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.inertia = inertiaRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.convergenceThreshold =\n convergenceThresholdRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.localSearchRadius = localSearchRadiusRef.current;\n });\n };\n\n const run = () => {\n if (!runEvolution) {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n }\n updateStoreParams();\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = !state.runEvolution;\n });\n setCommonStore((state) => {\n state.evolutionMethod = EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem = DesignProblem.SOLAR_PANEL_TILT_ANGLE;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Particle Swarm Optimization for Solar Panel Tilt Angle',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang) + ': '}\n {i18n.t('optimizationMenu.ParticleSwarmOptimizationSettings', lang)}\n \n }\n footer={[\n {\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Cancel', lang)}\n ,\n {\n run();\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Run', lang)}\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('optimizationMenu.Objective', lang) + ':'}\n \n \n {\n objectiveFunctionTypeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.SwarmSize', lang) + ':'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n swarmSizeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumSteps', lang) + ':'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n maximumStepsRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.CognitiveCoefficient', lang) + ' [0, 1]: '}\n \n \n {\n cognitiveCoefficientRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SocialCoefficient', lang) + ' [0, 1]: '}\n \n \n {\n socialCoefficientRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.InertiaWeight', lang) + ' [0, 1]: '}\n \n \n {\n inertiaRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumVelocity', lang) + ' [0.001, 0.1]: '}\n \n \n {\n vmaxRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.ConvergenceThreshold', lang) + ' [0, 0.1]: '}\n \n \n {\n convergenceThresholdRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SearchMethod', lang) + ':'}\n \n \n {\n searchMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.GlobalSearchUniformSelection', lang)}\n \n \n {i18n.t('optimizationMenu.LocalSearchRandomOptimization', lang)}\n \n \n \n \n\n {searchMethodRef.current === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION && (\n \n \n {i18n.t('optimizationMenu.LocalSearchRadius', lang) + ' ([0, 1]: '}\n \n \n {\n localSearchRadiusRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n )}\n \n \n );\n};\n\n// don't wrap this with React.memo as changedRef would be saved\nexport default SolarPanelTiltAnglePsoWizard;\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Radio, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { DEFAULT_GROUND_FLOOR_R_VALUE, ZERO_TOLERANCE } from '../../../constants';\r\n\r\nconst GroundFloorRValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const selectedElement = useStore(Selector.selectedElement) as FoundationModel;\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setActionScope = useStore(Selector.setFoundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const foundationModel = useStore((state) => {\r\n if (selectedElement) {\r\n for (const e of state.elements) {\r\n if (e.id === selectedElement.id) {\r\n return e as FoundationModel;\r\n }\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n const [inputValue, setInputValue] = useState(foundationModel?.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toRValueInUS(inputValue));\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n if (foundationModel) {\r\n setInputValue(foundationModel?.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE);\r\n }\r\n }, [foundationModel?.rValue]);\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.rValue === undefined || Math.abs(f.rValue - value) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundationModel?.rValue === undefined || Math.abs(foundationModel?.rValue - value) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as FoundationModel).rValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!foundationModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const foundation = e as FoundationModel;\r\n oldValuesAll.set(e.id, foundation.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE);\r\n foundation.rValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set R-Value for All Ground Floors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n default:\r\n if (foundationModel) {\r\n const updatedFoundation = getElementById(foundationModel.id) as FoundationModel;\r\n const oldValue = updatedFoundation.rValue ?? foundationModel.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE;\r\n const undoableChange = {\r\n name: 'Set Ground Floor R-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundationModel.id,\r\n changedElementType: foundationModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(foundationModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.groundFloorRValue = value;\r\n });\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const close = () => {\r\n setInputValue(foundationModel?.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE);\r\n setDialogVisible(false);\r\n };\r\n\r\n const handleCancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const handleOk = () => {\r\n setValue(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n const handleApply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('word.RValue', lang) + ' '}({i18n.t('word.ThermalResistance', lang)})\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={close}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toRValueInUS(value));\r\n }}\r\n onPressEnter={handleOk}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: m²·℃/W\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toRValueInSI(value));\r\n }}\r\n onPressEnter={handleOk}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toRValueInUS(0.01).toFixed(3)}, {Util.toRValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: h·ft²·℉/Btu\r\n
\r\n \r\n \r\n setActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('foundationMenu.OnlyThisGroundFloor', lang)}\r\n {i18n.t('foundationMenu.AllGroundFloors', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default GroundFloorRValueInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu, Modal, Radio, Space } from 'antd';\r\nimport { Copy, Cut, Lock, Paste } from '../menuItems';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { BuildingCompletionStatus, FoundationTexture, ObjectType, Scope, SolarStructure } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableRemoveAllChildren } from '../../../undo/UndoableRemoveAllChildren';\r\nimport FoundationColorSelection from './foundationColorSelection';\r\nimport FoundationLengthInput from './foundationLengthInput';\r\nimport FoundationWidthInput from './foundationWidthInput';\r\nimport FoundationHeightInput from './foundationHeightInput';\r\nimport FoundationAzimuthInput from './foundationAzimuthInput';\r\nimport FoundationTextureSelection from './foundationTextureSelection';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { UndoableAdd } from '../../../undo/UndoableAdd';\r\nimport { Vector3 } from 'three';\r\nimport { UNIT_VECTOR_POS_Z } from '../../../constants';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { ElementCounter } from '../../../stores/ElementCounter';\r\nimport SolarAbsorberPipeHeightInput from './solarAbsorberPipeHeightInput';\r\nimport SolarAbsorberPipeAbsorptanceInput from './solarAbsorberPipeAbsorptanceInput';\r\nimport SolarAbsorberPipeOpticalEfficiencyInput from './solarAbsorberPipeOpticalEfficiencyInput';\r\nimport SolarAbsorberPipeThermalEfficiencyInput from './solarAbsorberPipeThermalEfficiencyInput';\r\nimport SolarAbsorberPipeApertureWidthInput from './solarAbsorberPipeApertureWidthInput';\r\nimport SolarAbsorberPipePoleNumberInput from './solarAbsorberPipePoleNumberInput';\r\nimport SolarUpdraftTowerChimneyHeightInput from './solarUpdraftTowerChimneyHeightInput';\r\nimport SolarUpdraftTowerChimneyRadiusInput from './solarUpdraftTowerChimneyRadiusInput';\r\nimport SolarUpdraftTowerCollectorRadiusInput from './solarUpdraftTowerCollectorRadiusInput';\r\nimport SolarUpdraftTowerCollectorHeightInput from './solarUpdraftTowerCollectorHeightInput';\r\nimport SolarPowerTowerHeightInput from './solarPowerTowerHeightInput';\r\nimport SolarPowerTowerRadiusInput from './solarPowerTowerRadiusInput';\r\nimport SolarPowerTowerReceiverAbsorptanceInput from './solarPowerTowerReceiverAbsorptanceInput';\r\nimport SolarPowerTowerReceiverOpticalEfficiencyInput from './solarPowerTowerReceiverOpticalEfficiencyInput';\r\nimport SolarPowerTowerReceiverThermalEfficiencyInput from './solarPowerTowerReceiverThermalEfficiencyInput';\r\nimport SolarUpdraftTowerCollectorTransmissivityInput from './solarUpdraftTowerCollectorTransmissivityInput';\r\nimport SolarUpdraftTowerDischargeCoefficientInput from './solarUpdraftTowerDischargeCoefficientInput';\r\nimport SolarUpdraftTowerTurbineEfficiencyInput from './solarUpdraftTowerTurbineEfficiencyInput';\r\nimport SolarUpdraftTowerCollectorEmissivityInput from './solarUpdraftTowerCollectorEmissivityInput';\r\nimport SolarPanelTiltAngleGaWizard from './solarPanelTiltAngleGaWizard';\r\nimport SolarPanelTiltAnglePsoWizard from './solarPanelTiltAnglePsoWizard';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport GroundFloorRValueInput from './groundFloorRValueInput';\r\nimport { Util } from '../../../Util';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport { HvacSystem } from '../../../models/HvacSystem';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\n\r\nexport const FoundationMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const countAllOffspringsByType = useStore(Selector.countAllOffspringsByTypeAtOnce);\r\n const removeAllChildElementsByType = useStore(Selector.removeAllChildElementsByType);\r\n const removeAllElementsOnFoundationByType = useStore(Selector.removeAllElementsOnFoundationByType);\r\n const updateElementLockById = useStore(Selector.updateElementLockById);\r\n const updateElementLockByFoundationId = useStore(Selector.updateElementLockByFoundationId);\r\n const addElement = useStore(Selector.addElement);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const language = useStore(Selector.language);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [colorDialogVisible, setColorDialogVisible] = useState(false);\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [heightDialogVisible, setHeightDialogVisible] = useState(false);\r\n const [azimuthDialogVisible, setAzimuthDialogVisible] = useState(false);\r\n const [rValueDialogVisible, setRValueDialogVisible] = useState(false);\r\n\r\n const [solarAbsorberPipeHeightDialogVisible, setSolarAbsorberPipeHeightDialogVisible] = useState(false);\r\n const [solarAbsorberPipeApertureWidthDialogVisible, setSolarAbsorberPipeApertureWidthDialogVisible] = useState(false);\r\n const [solarAbsorberPipePoleNumberDialogVisible, setSolarAbsorberPipePoleNumberDialogVisible] = useState(false);\r\n const [solarAbsorberPipeAbsorptanceDialogVisible, setSolarAbsorberPipeAbsorptanceDialogVisible] = useState(false);\r\n const [solarAbsorberPipeOpticalEfficiencyDialogVisible, setSolarAbsorberPipeOpticalEfficiencyDialogVisible] =\r\n useState(false);\r\n const [solarAbsorberPipeThermalEfficiencyDialogVisible, setSolarAbsorberPipeThermalEfficiencyDialogVisible] =\r\n useState(false);\r\n\r\n const [solarPowerTowerHeightDialogVisible, setSolarPowerTowerHeightDialogVisible] = useState(false);\r\n const [solarPowerTowerRadiusDialogVisible, setSolarPowerTowerRadiusDialogVisible] = useState(false);\r\n const [solarPowerTowerReceiverAbsorptanceDialogVisible, setSolarPowerTowerReceiverAbsorptanceDialogVisible] =\r\n useState(false);\r\n const [\r\n solarPowerTowerReceiverOpticalEfficiencyDialogVisible,\r\n setSolarPowerTowerReceiverOpticalEfficiencyDialogVisible,\r\n ] = useState(false);\r\n const [\r\n solarPowerTowerReceiverThermalEfficiencyDialogVisible,\r\n setSolarPowerTowerReceiverThermalEfficiencyDialogVisible,\r\n ] = useState(false);\r\n\r\n const [chimneyHeightDialogVisible, setChimneyHeightDialogVisible] = useState(false);\r\n const [chimneyRadiusDialogVisible, setChimneyRadiusDialogVisible] = useState(false);\r\n const [collectorHeightDialogVisible, setCollectorHeightDialogVisible] = useState(false);\r\n const [collectorRadiusDialogVisible, setCollectorRadiusDialogVisible] = useState(false);\r\n const [collectorTransmissivityDialogVisible, setCollectorTransmissivityDialogVisible] = useState(false);\r\n const [collectorEmissivityDialogVisible, setCollectorEmissivityDialogVisible] = useState(false);\r\n const [dischargeCoefficientDialogVisible, setDischargeCoefficientDialogVisible] = useState(false);\r\n const [turbineEfficiencyDialogVisible, setTurbineEfficiencyDialogVisible] = useState(false);\r\n const [solarPanelTiltAngleGaWizardVisible, setSolarPanelTiltAngleGaWizardVisible] = useState(false);\r\n const [solarPanelTiltAnglePsoWizardVisible, setSolarPanelTiltAnglePsoWizardVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(foundation);\r\n const showLabel = useLabelShow(foundation);\r\n const updateLabelText = useLabelText(foundation, labelText);\r\n const setLabelSize = useLabelSize(foundation);\r\n const setLabelFontSize = useLabelFontSize(foundation);\r\n const setLabelColor = useLabelColor(foundation);\r\n const setLabelHeight = useLabelHeight(foundation);\r\n\r\n useEffect(() => {\r\n if (foundation) setHvacId(foundation.hvacSystem?.id);\r\n }, [foundation]);\r\n\r\n const [hvacId, setHvacId] = useState(foundation?.hvacSystem?.id);\r\n\r\n if (!foundation) return null;\r\n\r\n const selectedSolarStructure = foundation?.solarStructure ?? SolarStructure.None;\r\n const counterAll = foundation ? countAllOffspringsByType(foundation.id, true) : new ElementCounter();\r\n const counterUnlocked = foundation ? countAllOffspringsByType(foundation.id, false) : new ElementCounter();\r\n const lang = { lng: language };\r\n const editable = !foundation?.locked;\r\n\r\n const legalToPaste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n // when there are multiple elements to paste, the first element is the parent\r\n // we check the legality of the parent here\r\n const e = elementsToPaste[0];\r\n if (\r\n e.type === ObjectType.Human ||\r\n e.type === ObjectType.Tree ||\r\n e.type === ObjectType.Flower ||\r\n e.type === ObjectType.Polygon ||\r\n e.type === ObjectType.Sensor ||\r\n e.type === ObjectType.Light ||\r\n e.type === ObjectType.SolarPanel ||\r\n e.type === ObjectType.WaterHeater ||\r\n e.type === ObjectType.ParabolicDish ||\r\n e.type === ObjectType.Heliostat ||\r\n e.type === ObjectType.FresnelReflector ||\r\n e.type === ObjectType.ParabolicTrough ||\r\n e.type === ObjectType.WindTurbine ||\r\n e.type === ObjectType.Wall\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateFoundationSolarStructureById = (id: string, structure: SolarStructure) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n (e as FoundationModel).solarStructure = structure;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFoundationThermostatSetpointById = (id: string, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id) {\r\n const foundation = e as FoundationModel;\r\n if (foundation.hvacSystem) {\r\n foundation.hvacSystem.thermostatSetpoint = value;\r\n } else {\r\n foundation.hvacSystem = { thermostatSetpoint: value, temperatureThreshold: 3 } as HvacSystem;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFoundationTemperatureThresholdById = (id: string, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id) {\r\n const foundation = e as FoundationModel;\r\n if (foundation.hvacSystem) {\r\n foundation.hvacSystem.temperatureThreshold = value;\r\n } else {\r\n foundation.hvacSystem = { thermostatSetpoint: 20, temperatureThreshold: value } as HvacSystem;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateHvacIdByFoundationId = (id: string, value: string | undefined) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id) {\r\n const foundation = e as FoundationModel;\r\n if (foundation.hvacSystem) {\r\n foundation.hvacSystem.id = value;\r\n } else {\r\n foundation.hvacSystem = { thermostatSetpoint: 20, temperatureThreshold: 3, id: value } as HvacSystem;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateHvacId = (value: string | undefined) => {\r\n const oldValue = foundation.hvacSystem?.id;\r\n const newValue = value && value.trim().length > 0 ? value : undefined;\r\n const undoableChange = {\r\n name: 'Change HVAC ID',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n undo: () => {\r\n updateHvacIdByFoundationId(foundation.id, undoableChange.oldValue as string | undefined);\r\n },\r\n redo: () => {\r\n updateHvacIdByFoundationId(foundation.id, undoableChange.newValue as string | undefined);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateHvacIdByFoundationId(foundation.id, newValue);\r\n };\r\n\r\n // Do NOT put this in useMemo. Otherwise, it will crash the app.\r\n const isBuilding =\r\n !foundation.notBuilding &&\r\n Util.getBuildingCompletionStatus(foundation, elements) === BuildingCompletionStatus.COMPLETE;\r\n\r\n const toggleGroupMaster = () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === foundation.id) {\r\n (e as FoundationModel).enableGroupMaster = !(e as FoundationModel).enableGroupMaster;\r\n break;\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n };\r\n\r\n const toggleBuilding = () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === foundation.id) {\r\n (e as FoundationModel).notBuilding = !(e as FoundationModel).notBuilding;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n \r\n {editable && }\r\n \r\n\r\n \r\n {\r\n const undoableCheck = {\r\n name: 'Group Master',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n selectedElementId: foundation.id,\r\n selectedElementType: foundation.type,\r\n undo: () => toggleGroupMaster(),\r\n redo: () => toggleGroupMaster(),\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n toggleGroupMaster();\r\n }}\r\n >\r\n {i18n.t('foundationMenu.GroupMaster', { lng: language })}\r\n \r\n \r\n\r\n \r\n {\r\n const undoableCheck = {\r\n name: 'Building',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n selectedElementId: foundation.id,\r\n selectedElementType: foundation.type,\r\n undo: () => toggleBuilding(),\r\n redo: () => toggleBuilding(),\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n toggleBuilding();\r\n }}\r\n >\r\n {i18n.t('word.Building', { lng: language })}\r\n \r\n \r\n\r\n {counterAll.gotSome() && (\r\n \r\n {counterUnlocked.gotSome() && (\r\n {\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.foundationId === foundation.id || elem.id === foundation.id) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n }\r\n updateElementLockByFoundationId(foundation.id, true);\r\n const undoableLockAllElements = {\r\n name: 'Lock All Offsprings',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElements.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateElementLockByFoundationId(foundation.id, true);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElements);\r\n }}\r\n >\r\n {i18n.t('foundationMenu.LockAllElementsOnThisFoundation', lang)}\r\n \r\n )}\r\n {\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.foundationId === foundation.id || elem.id === foundation.id) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n }\r\n updateElementLockByFoundationId(foundation.id, false);\r\n const undoableLockAllElements = {\r\n name: 'Unlock All Offsprings',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElements.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateElementLockByFoundationId(foundation.id, false);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElements);\r\n }}\r\n >\r\n {i18n.t('foundationMenu.UnlockAllElementsOnThisFoundation', lang)}\r\n \r\n {counterUnlocked.wallCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllWallsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.wallCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Walls', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const wallsIdSet = new Set();\r\n useStore.getState().elements.forEach((e) => {\r\n if (\r\n !e.locked &&\r\n e.type === ObjectType.Wall &&\r\n (e.parentId === foundation.id || e.foundationId === foundation.id)\r\n ) {\r\n wallsIdSet.add(e.id);\r\n }\r\n });\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => wallsIdSet.has(e.id) || wallsIdSet.has(e.parentId));\r\n setCommonStore((state) => {\r\n state.elements = state.elements.filter(\r\n (e) => !wallsIdSet.has(e.id) && !wallsIdSet.has(e.parentId),\r\n );\r\n });\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllWallChildren = {\r\n name: 'Remove All Walls on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllWallChildren.removedElements);\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n },\r\n redo: () => {\r\n const wallsIdSet = new Set();\r\n useStore.getState().elements.forEach((e) => {\r\n if (\r\n !e.locked &&\r\n e.type === ObjectType.Wall &&\r\n e.parentId === undoableRemoveAllWallChildren.parentId\r\n ) {\r\n wallsIdSet.add(e.id);\r\n }\r\n });\r\n setCommonStore((state) => {\r\n state.elements = state.elements.filter(\r\n (e) => !wallsIdSet.has(e.id) && !wallsIdSet.has(e.parentId),\r\n );\r\n });\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllWallChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedWalls', lang)} ({counterUnlocked.wallCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.windowCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllWindowsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.windowCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Windows', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Window && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.Window);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllWindowGrandchildren = {\r\n name: 'Remove All Windows on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllWindowGrandchildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllWindowGrandchildren.parentId,\r\n ObjectType.Window,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllWindowGrandchildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedWindows', lang)} ({counterUnlocked.windowCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.doorCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllDoorsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.doorCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Doors', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Door && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.Door);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllDoorGrandchildren = {\r\n name: 'Remove All Doors on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllDoorGrandchildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllDoorGrandchildren.parentId,\r\n ObjectType.Door,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllDoorGrandchildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedDoors', lang)} ({counterUnlocked.doorCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.sensorCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllSensorsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.sensorCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Sensors', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Sensor && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.Sensor);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllSensorChildren = {\r\n name: 'Remove All Sensors on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllSensorChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllSensorChildren.parentId,\r\n ObjectType.Sensor,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllSensorChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedSensors', lang)} ({counterUnlocked.sensorCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllLightsOnFoundation', lang) +\r\n ' (' +\r\n (counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount) +\r\n ' ' +\r\n i18n.t('foundationMenu.Lights', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Light && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.Light);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllLightChildren = {\r\n name: 'Remove All Lights on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllLightChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllLightChildren.parentId,\r\n ObjectType.Light,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllLightChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedLights', lang)} (\r\n {counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.solarPanelCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllSolarPanelsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.solarPanelModuleCount +\r\n ' ' +\r\n i18n.t('foundationMenu.SolarPanels', lang) +\r\n ', ' +\r\n counterUnlocked.solarPanelCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Racks', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.SolarPanel && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.SolarPanel);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllSolarPanelChildren = {\r\n name: 'Remove All Solar Panels on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllSolarPanelChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllSolarPanelChildren.parentId,\r\n ObjectType.SolarPanel,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllSolarPanelChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedSolarPanels', lang)}  (\r\n {counterUnlocked.solarPanelModuleCount} {i18n.t('foundationMenu.SolarPanels', lang)},{' '}\r\n {counterUnlocked.solarPanelCount} {i18n.t('foundationMenu.Racks', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.parabolicTroughCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.parabolicTroughCount +\r\n ' ' +\r\n i18n.t('foundationMenu.ParabolicTroughs', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.ParabolicTrough && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.ParabolicTrough);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllParabolicTroughChildren = {\r\n name: 'Remove All Parabolic Troughs on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllParabolicTroughChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllParabolicTroughChildren.parentId,\r\n ObjectType.ParabolicTrough,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllParabolicTroughChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedParabolicTroughs', lang)} ({counterUnlocked.parabolicTroughCount}\r\n )\r\n \r\n )}\r\n\r\n {counterUnlocked.parabolicDishCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllParabolicDishesOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.parabolicDishCount +\r\n ' ' +\r\n i18n.t('foundationMenu.ParabolicDishes', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.ParabolicDish && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.ParabolicDish);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllParabolicDishChildren = {\r\n name: 'Remove All Parabolic Dishes on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllParabolicDishChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllParabolicDishChildren.parentId,\r\n ObjectType.ParabolicDish,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllParabolicDishChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedParabolicDishes', lang)} ({counterUnlocked.parabolicDishCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.fresnelReflectorCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.fresnelReflectorCount +\r\n ' ' +\r\n i18n.t('foundationMenu.FresnelReflectors', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) =>\r\n !e.locked && e.type === ObjectType.FresnelReflector && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.FresnelReflector);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllFresnelReflectorChildren = {\r\n name: 'Remove All Fresnel Reflectors on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllFresnelReflectorChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllFresnelReflectorChildren.parentId,\r\n ObjectType.FresnelReflector,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllFresnelReflectorChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedFresnelReflectors', lang)} (\r\n {counterUnlocked.fresnelReflectorCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.heliostatCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllHeliostatsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.heliostatCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Heliostats', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Heliostat && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Heliostat);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllHeliostatChildren = {\r\n name: 'Remove All Heliostats on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllHeliostatChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllHeliostatChildren.parentId,\r\n ObjectType.Heliostat,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllHeliostatChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedHeliostats', lang)} ({counterUnlocked.heliostatCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.polygonCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllPolygonsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.polygonCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Polygons', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Polygon && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Polygon);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllPolygonChildren = {\r\n name: 'Remove All Polygons on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllPolygonChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllPolygonChildren.parentId, ObjectType.Polygon);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllPolygonChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedPolygons', lang)} ({counterUnlocked.polygonCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.humanCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllHumansOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.humanCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Humans', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Human && e.parentId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Human);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllHumanChildren = {\r\n name: 'Remove All Humans on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllHumanChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllHumanChildren.parentId, ObjectType.Human);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllHumanChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedHumans', lang)} ({counterUnlocked.humanCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.treeCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllTreesOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.treeCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Trees', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Tree && e.parentId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Tree);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllTreeChildren = {\r\n name: 'Remove All Trees on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllTreeChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllTreeChildren.parentId, ObjectType.Tree);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllTreeChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedTrees', lang)} ({counterUnlocked.treeCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.flowerCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllFlowersOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.flowerCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Flowers', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Flower && e.parentId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Flower);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllFlowerChildren = {\r\n name: 'Remove All Flowers on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllFlowerChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllFlowerChildren.parentId, ObjectType.Flower);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllFlowerChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedFlowers', lang)} ({counterUnlocked.flowerCount})\r\n \r\n )}\r\n \r\n )}\r\n\r\n {editable && (!foundation.textureType || foundation.textureType === FoundationTexture.NoTexture) && (\r\n <>\r\n {colorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Color', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n <>\r\n {textureDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Texture', lang)} ...\r\n \r\n\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {heightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Height', lang)} ...\r\n \r\n\r\n {azimuthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setAzimuthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Azimuth', lang)} ...\r\n \r\n\r\n {isBuilding && rValueDialogVisible && }\r\n {isBuilding && (\r\n {\r\n setApplyCount(0);\r\n setRValueDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('foundationMenu.GroundFloorRValue', lang)} ...\r\n \r\n )}\r\n \r\n )}\r\n\r\n {\r\n if (foundation) {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.Polygon;\r\n });\r\n const element = addElement(\r\n foundation,\r\n new Vector3(foundation.cx, foundation.cy, foundation.lz),\r\n UNIT_VECTOR_POS_Z,\r\n );\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: element,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('foundationMenu.AddPolygon', lang)}\r\n \r\n\r\n {!foundation.notBuilding && counterAll.wallCount > 0 && (\r\n \r\n \r\n \r\n {'ID:'}\r\n ) => {\r\n let s: string | undefined = e.target.value;\r\n if (s.trim().length === 0) s = undefined;\r\n setHvacId(s);\r\n }}\r\n onPressEnter={() => updateHvacId(hvacId)}\r\n onBlur={() => updateHvacId(hvacId)}\r\n />\r\n \r\n \r\n {i18n.t('word.ThermostatSetpoint', lang) + ':'}\r\n {\r\n const oldValue = foundation.hvacSystem?.thermostatSetpoint ?? 20;\r\n const newValue = value;\r\n const undoableChange = {\r\n name: 'Change Thermostat Setpoint',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n undo: () => {\r\n updateFoundationThermostatSetpointById(foundation.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFoundationThermostatSetpointById(foundation.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFoundationThermostatSetpointById(foundation.id, newValue);\r\n }}\r\n />\r\n °C\r\n \r\n\r\n \r\n \r\n {i18n.t('word.TemperatureToleranceThreshold', lang) + ':'}\r\n \r\n {\r\n const oldValue = foundation.hvacSystem?.temperatureThreshold ?? 3;\r\n const newValue = value;\r\n const undoableChange = {\r\n name: 'Change Temperature Tolerance Threshold',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n undo: () => {\r\n updateFoundationTemperatureThresholdById(foundation.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFoundationTemperatureThresholdById(foundation.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFoundationTemperatureThresholdById(foundation.id, newValue);\r\n }}\r\n />\r\n °C\r\n \r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n \r\n {\r\n if (foundation) {\r\n const oldValue = foundation.solarStructure;\r\n const newValue = e.target.value;\r\n const undoableChange = {\r\n name: 'Select Solar Structure for Selected Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateFoundationSolarStructureById(\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as SolarStructure,\r\n );\r\n },\r\n redo: () => {\r\n updateFoundationSolarStructureById(\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as SolarStructure,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFoundationSolarStructureById(foundation.id, newValue);\r\n }\r\n }}\r\n >\r\n \r\n {i18n.t('word.None', lang)}\r\n \r\n {i18n.t('solarAbsorberPipeMenu.AbsorberPipeForFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('solarPowerTowerMenu.ReceiverTowerForHeliostats', lang)}\r\n \r\n \r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTower', lang)}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {editable && foundation.solarStructure === SolarStructure.FocusPipe && (\r\n \r\n {solarAbsorberPipeHeightDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberHeight', lang)} ...\r\n \r\n\r\n {solarAbsorberPipeApertureWidthDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeApertureWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberApertureWidth', lang)} ...\r\n \r\n {solarAbsorberPipePoleNumberDialogVisible && (\r\n \r\n )}\r\n\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipePoleNumberDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberPipePoleNumber', lang)} ...\r\n \r\n\r\n {solarAbsorberPipeAbsorptanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeAbsorptanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberAbsorptance', lang)} ...\r\n \r\n\r\n {solarAbsorberPipeOpticalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeOpticalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberOpticalEfficiency', lang)} ...\r\n \r\n\r\n {solarAbsorberPipeThermalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeThermalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberThermalEfficiency', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && foundation.solarStructure === SolarStructure.FocusTower && (\r\n \r\n {solarPowerTowerHeightDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverTowerHeight', lang)} ...\r\n \r\n\r\n {solarPowerTowerRadiusDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverTowerRadius', lang)} ...\r\n \r\n\r\n {solarPowerTowerReceiverAbsorptanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerReceiverAbsorptanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverAbsorptance', lang)} ...\r\n \r\n\r\n {solarPowerTowerReceiverOpticalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerReceiverOpticalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverOpticalEfficiency', lang)} ...\r\n \r\n\r\n {solarPowerTowerReceiverThermalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerReceiverThermalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverThermalEfficiency', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && foundation.solarStructure === SolarStructure.UpdraftTower && (\r\n \r\n {chimneyHeightDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setChimneyHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight', lang)} ...\r\n \r\n\r\n {chimneyRadiusDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setChimneyRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius', lang)} ...\r\n \r\n\r\n {collectorHeightDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setCollectorHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight', lang)} ...\r\n \r\n\r\n {collectorRadiusDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setCollectorRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius', lang)} ...\r\n \r\n\r\n {collectorTransmissivityDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setCollectorTransmissivityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity', lang)} ...\r\n \r\n\r\n {collectorEmissivityDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setCollectorEmissivityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity', lang)} ...\r\n \r\n\r\n {dischargeCoefficientDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setDischargeCoefficientDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient', lang)} ...\r\n \r\n\r\n {turbineEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setTurbineEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerTurbineEfficiency', lang)} ...\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {counterUnlocked.solarPanelCount > 0 && (\r\n <>\r\n {solarPanelTiltAngleGaWizardVisible && (\r\n \r\n )}\r\n {\r\n setSolarPanelTiltAngleGaWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '12px' }}\r\n >\r\n {i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang)}...\r\n \r\n \r\n )}\r\n \r\n \r\n {counterUnlocked.solarPanelCount > 0 && (\r\n <>\r\n {solarPanelTiltAnglePsoWizardVisible && (\r\n \r\n )}\r\n {\r\n setSolarPanelTiltAnglePsoWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '12px' }}\r\n >\r\n {i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang)}...\r\n \r\n \r\n )}\r\n \r\n \r\n\r\n {editable && (\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the foundation's top surface */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { CuboidModel } from '../../../models/CuboidModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst CuboidColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const selectedSideIndex = useStore(Selector.selectedSideIndex);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(cuboid?.color ?? '#808080');\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n\r\n const lang = useLanguage();\r\n\r\n useEffect(() => {\r\n updateSelectedColor();\r\n }, [cuboid, selectedSideIndex]);\r\n\r\n const updateCuboidColorBySide = (side: number, id: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && e.id === id && !e.locked) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.faceColors) {\r\n cuboid.faceColors = new Array(6);\r\n cuboid.faceColors.fill(cuboid.color ?? color);\r\n }\r\n cuboid.faceColors[side] = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidColorById = (id: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && e.id === id && !e.locked) {\r\n e.color = color;\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.faceColors) cuboid.faceColors = new Array(6);\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.faceColors[i] = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidColorForAll = (color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n e.color = color;\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.faceColors) cuboid.faceColors = new Array(6);\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.faceColors[i] = color;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n setUpdateFlag(!updateFlag);\r\n };\r\n\r\n const updateSelectedColor = () => {\r\n if (cuboid) {\r\n if (selectedSideIndex >= 0 && cuboid.faceColors) {\r\n setSelectedColor(cuboid.faceColors[selectedSideIndex]);\r\n } else {\r\n setSelectedColor(cuboid.color ?? '#808080');\r\n }\r\n }\r\n };\r\n\r\n const needChange = (color: string) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const cm = e as CuboidModel;\r\n if (cm.faceColors) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (color !== cm.faceColors[i]) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n if (color !== cm.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const cm = e as CuboidModel;\r\n if (cm.faceColors) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (color !== cm.faceColors[i]) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n if (color !== cm.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisObject:\r\n if (cuboid.faceColors) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (color !== cuboid.faceColors[i]) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n if (color !== cuboid?.color) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (selectedSideIndex >= 0) {\r\n const oldColor = cuboid?.faceColors ? cuboid?.faceColors[selectedSideIndex] : cuboid?.color;\r\n if (color !== oldColor) {\r\n return true;\r\n }\r\n } else {\r\n if (color !== cuboid?.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const cm = elem as CuboidModel;\r\n if (cm.faceColors) {\r\n oldColorsSelected.set(elem.id, [...cm.faceColors]);\r\n } else {\r\n const c = cm.color ?? '#808080';\r\n oldColorsSelected.set(elem.id, [c, c, c, c, c, c]);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, colors] of undoableChangeSelected.oldValues.entries()) {\r\n if (colors && Array.isArray(colors)) {\r\n for (let i = 0; i < colors.length; i++) {\r\n updateCuboidColorBySide(i, id, colors[i]);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, colors] of undoableChangeSelected.oldValues.entries()) {\r\n if (colors && Array.isArray(colors)) {\r\n for (let i = 0; i < colors.length; i++) {\r\n updateCuboidColorBySide(i, id, undoableChangeSelected.newValue as string);\r\n }\r\n }\r\n }\r\n // updateCuboidColorForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n for (const [id, colors] of oldColorsSelected.entries()) {\r\n if (colors && Array.isArray(colors)) {\r\n for (let i = 0; i < colors.length; i++) {\r\n updateCuboidColorBySide(i, id, value);\r\n }\r\n }\r\n }\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceColors)\r\n state.actionState.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceColors[i] = value;\r\n }\r\n });\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid) {\r\n const cm = elem as CuboidModel;\r\n if (cm.faceColors) {\r\n oldColorsAll.set(elem.id, [...cm.faceColors]);\r\n } else {\r\n const c = cm.color ?? '#808080';\r\n oldColorsAll.set(elem.id, [c, c, c, c, c, c]);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, colors] of undoableChangeAll.oldValues.entries()) {\r\n if (colors && Array.isArray(colors)) {\r\n for (let i = 0; i < colors.length; i++) {\r\n updateCuboidColorBySide(i, id, colors[i]);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidColorForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateCuboidColorForAll(value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceColors)\r\n state.actionState.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceColors[i] = value;\r\n }\r\n });\r\n break;\r\n }\r\n case Scope.OnlyThisObject:\r\n let oldColors;\r\n if (cuboid.faceColors) {\r\n oldColors = [...cuboid.faceColors];\r\n } else {\r\n const c = cuboid.color ?? '#808080';\r\n oldColors = [c, c, c, c, c, c];\r\n }\r\n const undoableChange = {\r\n name: 'Set Color for All Sides of Selected Cuboid',\r\n timestamp: Date.now(),\r\n oldValue: oldColors,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n undo: () => {\r\n if (undoableChange.oldValue && Array.isArray(undoableChange.oldValue)) {\r\n for (let i = 0; i < undoableChange.oldValue.length; i++) {\r\n updateCuboidColorBySide(i, undoableChange.changedElementId, undoableChange.oldValue[i] as string);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateCuboidColorById(cuboid.id, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceColors)\r\n state.actionState.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceColors[i] = value;\r\n }\r\n });\r\n break;\r\n default:\r\n if (selectedSideIndex >= 0) {\r\n const oldColor = cuboid.faceColors ? cuboid.faceColors[selectedSideIndex] : cuboid.color;\r\n const undoableChange = {\r\n name: 'Set Color for Selected Side of Cuboid',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n changedSideIndex: selectedSideIndex,\r\n undo: () => {\r\n if (undoableChange.changedSideIndex !== undefined) {\r\n updateCuboidColorBySide(\r\n undoableChange.changedSideIndex,\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as string,\r\n );\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChange.changedSideIndex !== undefined) {\r\n updateCuboidColorBySide(\r\n undoableChange.changedSideIndex,\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateCuboidColorBySide(selectedSideIndex, cuboid.id, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceColors)\r\n state.actionState.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\r\n state.actionState.cuboidFaceColors[selectedSideIndex] = value;\r\n });\r\n }\r\n }\r\n setUpdateFlag(!updateFlag);\r\n };\r\n\r\n const close = () => {\r\n updateSelectedColor();\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n const currentColor =\r\n selectedSideIndex >= 0 && cuboid?.faceColors ? cuboid.faceColors[selectedSideIndex] : cuboid?.color ?? '#808080';\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisSide', lang)}\r\n {i18n.t('cuboidMenu.AllSidesOfThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSidesOfSelectedCuboids', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSidesOfAllCuboids', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CuboidColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { CuboidModel } from 'src/models/CuboidModel';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableSizeGroupChange } from 'src/undo/UndoableSizeGroupChange';\r\nimport { UndoableSizeChange } from 'src/undo/UndoableSizeChange';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { PolygonModel } from 'src/models/PolygonModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst CuboidLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getChildren = useStore(Selector.getChildren);\r\n const updateElementCxById = useStore(Selector.updateElementCxById);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const setCommonStore = useStore(Selector.set);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(cuboid?.lx ?? 0);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const denormalizedPosMapRef = useRef>(new Map()); // not absolute position, just denormalized\r\n const oldChildrenVerticesMapRef = useRef>(new Map()); // Point2 is used to store vertices\r\n const newChildrenVerticesMapRef = useRef>(new Map());\r\n const denormalizedVerticesMapRef = useRef>(new Map()); // use Vector2's rotation function\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const containsAllChildren = (lx: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n const children = getChildren(c.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(c, children, lx, c.ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid) {\r\n const c = e as CuboidModel;\r\n const children = getChildren(c.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(c, children, lx, c.ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const children = getChildren(cuboid.id);\r\n if (children.length > 0) {\r\n return Util.doesNewSizeContainAllChildren(cuboid, children, lx, cuboid.ly);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const rejectChange = (lx: number) => {\r\n // check if the new length will still contain all children of the cuboids in the selected scope\r\n if (!containsAllChildren(lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && e.parentId === cuboid?.parentId && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n if (Math.abs(cuboid?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === curr.id) {\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector2(e.cx, e.cy)\r\n .rotateAround(ORIGIN_VECTOR2, parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const updateOnSurface = (value: number) => {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === cuboid?.parentId) {\r\n updateLxWithChildren(e as CuboidModel, value);\r\n }\r\n }\r\n };\r\n\r\n const updateLxWithChildren = (parent: CuboidModel, value: number) => {\r\n // store children's relative positions\r\n const children = getChildren(parent.id);\r\n const azimuth = parent.rotation[2];\r\n denormalizedPosMapRef.current.clear(); // this map is for one-time use with each foundation\r\n denormalizedVerticesMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (Util.isIdentical(c.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // top face\r\n switch (c.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const p = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth);\r\n denormalizedPosMapRef.current.set(c.id, p);\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy));\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = c as PolygonModel;\r\n const arr: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n arr.push(new Vector2(v.x * parent.lx, v.y * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth));\r\n }\r\n denormalizedVerticesMapRef.current.set(c.id, arr);\r\n oldChildrenVerticesMapRef.current.set(\r\n c.id,\r\n polygon.vertices.map((v) => ({ ...v })),\r\n );\r\n break;\r\n }\r\n }\r\n if (Util.isPlantOrHuman(c)) {\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n // update cuboid length\r\n updateElementLxById(parent.id, value);\r\n // update children's relative positions\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (Util.isIdentical(c.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // top face\r\n switch (c.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const p = denormalizedPosMapRef.current.get(c.id);\r\n if (p) {\r\n const relativePos = new Vector2(p.x, p.y).rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newCx = relativePos.x / value;\r\n updateElementCxById(c.id, newCx);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(newCx, c.cy));\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const arr = denormalizedVerticesMapRef.current.get(c.id);\r\n if (arr) {\r\n const newVertices: Point2[] = [];\r\n for (const v of arr) {\r\n const relativePos = v.rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newX = relativePos.x / value;\r\n const newY = relativePos.y / parent.ly;\r\n newVertices.push({ x: newX, y: newY } as Point2);\r\n }\r\n updatePolygonVerticesById(c.id, newVertices);\r\n newChildrenVerticesMapRef.current.set(\r\n c.id,\r\n newVertices.map((v) => ({ ...v })),\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n if (Util.isPlantOrHuman(c)) {\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n oldChildrenParentIdMapRef.current.set(c.id, parent.id);\r\n // top, north, south face\r\n if (\r\n Math.abs(c.cz - parent.lz / 2) < ZERO_TOLERANCE ||\r\n Math.abs(Math.abs(c.cy) - parent.ly / 2) < ZERO_TOLERANCE\r\n ) {\r\n // check fall off\r\n if (Math.abs(c.cx) - value / 2 > 0) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, c);\r\n }\r\n }\r\n // west and east face\r\n else if (Math.abs(Math.abs(c.cx) - parent.lx / 2) < ZERO_TOLERANCE) {\r\n const newCx = (c.cx > 0 ? value : -value) / 2;\r\n updateElementCxById(c.id, newCx);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(newCx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLx = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n // cuboid via selected element may be outdated, make sure that we get the latest\r\n const c = getElementById(cuboid.id);\r\n const oldLx = c ? c.lx : cuboid.lx;\r\n rejectedValue.current = undefined;\r\n rejectRef.current = rejectChange(value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLx);\r\n } else {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLxsSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Cuboid &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldLxsSelected.set(elem.id, elem.lx);\r\n updateLxWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsSelected,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLxById(id, lx as number);\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenVerticesMap &&\r\n undoableChangeSelected.oldChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLxById(id, undoableChangeSelected.newSize as number);\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenVerticesMap &&\r\n undoableChangeSelected.newChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface: {\r\n const oldLxsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && elem.parentId === cuboid.parentId && !elem.locked) {\r\n oldLxsAll.set(elem.id, elem.lx);\r\n updateLxWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLxById(id, lx as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateOnSurface(undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLxsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && !elem.locked) {\r\n oldLxsAll.set(elem.id, elem.lx);\r\n updateLxWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Cuboids',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLxById(id, lx as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLxById(id, undoableChangeAll.newSize as number);\r\n }\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n updateLxWithChildren(cuboid, value);\r\n const undoableChange = {\r\n name: 'Set Cuboid Length',\r\n timestamp: Date.now(),\r\n oldSize: oldLx,\r\n newSize: value,\r\n resizedElementId: cuboid.id,\r\n resizedElementType: cuboid.type,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateElementLxById(cuboid.id, undoableChange.oldSize as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.oldChildrenVerticesMap && undoableChange.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLxById(cuboid.id, undoableChange.newSize as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, p] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, p.x, p.y, p.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.newChildrenVerticesMap && undoableChange.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLx(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLx(inputValue);\r\n };\r\n\r\n const rejectMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 500] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsOnSameSurface', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSelectedCuboids', lang)}\r\n {i18n.t('cuboidMenu.AllCuboids', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default CuboidLengthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { CuboidModel } from 'src/models/CuboidModel';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableSizeGroupChange } from 'src/undo/UndoableSizeGroupChange';\r\nimport { UndoableSizeChange } from 'src/undo/UndoableSizeChange';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { PolygonModel } from 'src/models/PolygonModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst CuboidWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getChildren = useStore(Selector.getChildren);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const updateElementCyById = useStore(Selector.updateElementCyById);\r\n const updateElementLyById = useStore(Selector.updateElementLyById);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const setCommonStore = useStore(Selector.set);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(cuboid?.ly ?? 0);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const denormalizedPositionMapRef = useRef>(new Map()); // not absolute position, just denormalized\r\n const oldChildrenVerticesMapRef = useRef>(new Map()); // Point2 is used to store vertices\r\n const newChildrenVerticesMapRef = useRef>(new Map());\r\n const denormalizedVerticesMapRef = useRef>(new Map()); // use Vector2's rotation function\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const containsAllChildren = (ly: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n const children = getChildren(c.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(c, children, c.lx, ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid) {\r\n const c = e as CuboidModel;\r\n const children = getChildren(c.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(c, children, c.lx, ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const children = getChildren(cuboid.id);\r\n if (children.length > 0) {\r\n return Util.doesNewSizeContainAllChildren(cuboid, children, cuboid.lx, ly);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const rejectChange = (ly: number) => {\r\n // check if the new width will still contain all children of the cuboids in the selected scope\r\n if (!containsAllChildren(ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && e.parentId === cuboid?.parentId && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType: {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n if (Math.abs(cuboid?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === curr.id) {\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector2(e.cx, e.cy)\r\n .rotateAround(ORIGIN_VECTOR2, parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const updateOnSurface = (value: number) => {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === cuboid?.parentId) {\r\n updateLyWithChildren(e as CuboidModel, value);\r\n }\r\n }\r\n };\r\n\r\n const updateLyWithChildren = (parent: CuboidModel, value: number) => {\r\n // store children's relative positions\r\n const children = getChildren(parent.id);\r\n const azimuth = parent.rotation[2];\r\n denormalizedPositionMapRef.current.clear(); // this map is for one-time use with each foundation\r\n denormalizedVerticesMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (Util.isIdentical(c.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // top face\r\n switch (c.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const p = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth);\r\n denormalizedPositionMapRef.current.set(c.id, p);\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy));\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = c as PolygonModel;\r\n const arr: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n arr.push(new Vector2(v.x * parent.lx, v.y * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth));\r\n }\r\n denormalizedVerticesMapRef.current.set(c.id, arr);\r\n oldChildrenVerticesMapRef.current.set(\r\n c.id,\r\n polygon.vertices.map((v) => ({ ...v })),\r\n );\r\n break;\r\n }\r\n }\r\n if (Util.isPlantOrHuman(c)) {\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n // update cuboid width\r\n updateElementLyById(parent.id, value);\r\n // update children's relative positions\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (Util.isIdentical(c.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // top face\r\n switch (c.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const p = denormalizedPositionMapRef.current.get(c.id);\r\n if (p) {\r\n const relativePos = new Vector2(p.x, p.y).rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newCy = relativePos.y / value;\r\n updateElementCyById(c.id, newCy);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, newCy));\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const arr = denormalizedVerticesMapRef.current.get(c.id);\r\n if (arr) {\r\n const newVertices: Point2[] = [];\r\n for (const v of arr) {\r\n const relativePos = v.rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newX = relativePos.x / parent.lx;\r\n const newY = relativePos.y / value;\r\n newVertices.push({ x: newX, y: newY } as Point2);\r\n }\r\n updatePolygonVerticesById(c.id, newVertices);\r\n newChildrenVerticesMapRef.current.set(\r\n c.id,\r\n newVertices.map((v) => ({ ...v })),\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n if (Util.isPlantOrHuman(c)) {\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n oldChildrenParentIdMapRef.current.set(c.id, parent.id);\r\n // top, north, south face\r\n if (\r\n Math.abs(c.cz - parent.lz / 2) < ZERO_TOLERANCE ||\r\n Math.abs(Math.abs(c.cx) - parent.lx / 2) < ZERO_TOLERANCE\r\n ) {\r\n // check fall off\r\n if (Math.abs(c.cy) - value / 2 > 0) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, c);\r\n }\r\n }\r\n // north and south face\r\n else if (Math.abs(Math.abs(c.cy) - parent.ly / 2) < ZERO_TOLERANCE) {\r\n const newCy = (c.cy > 0 ? value : -value) / 2;\r\n updateElementCyById(c.id, newCy);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cz, newCy, c.cz));\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLy = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n // cuboid via selected element may be outdated, make sure that we get the latest\r\n const c = getElementById(cuboid.id);\r\n const oldLy = c ? c.ly : cuboid.ly;\r\n rejectedValue.current = undefined;\r\n rejectRef.current = rejectChange(value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLy);\r\n } else {\r\n oldChildrenPositionsMapRef.current.clear();\r\n newChildrenPositionsMapRef.current.clear();\r\n oldChildrenVerticesMapRef.current.clear();\r\n newChildrenVerticesMapRef.current.clear();\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLysSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Cuboid &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldLysSelected.set(elem.id, elem.ly);\r\n updateLyWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysSelected,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenVerticesMap &&\r\n undoableChangeSelected.oldChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLyById(id, undoableChangeSelected.newSize as number);\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenVerticesMap &&\r\n undoableChangeSelected.newChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface: {\r\n const oldLysAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && elem.parentId === cuboid.parentId && !elem.locked) {\r\n oldLysAll.set(elem.id, elem.ly);\r\n updateLyWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateOnSurface(undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLysAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && !elem.locked) {\r\n oldLysAll.set(elem.id, elem.ly);\r\n updateLyWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLyById(id, undoableChangeAll.newSize as number);\r\n }\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n updateLyWithChildren(cuboid, value);\r\n const undoableChange = {\r\n name: 'Set Cuboid Width',\r\n timestamp: Date.now(),\r\n oldSize: oldLy,\r\n newSize: value,\r\n resizedElementId: cuboid.id,\r\n resizedElementType: cuboid.type,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateElementLyById(cuboid.id, undoableChange.oldSize as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.oldChildrenVerticesMap && undoableChange.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLyById(cuboid.id, undoableChange.newSize as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.newChildrenVerticesMap && undoableChange.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLy(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLy(inputValue);\r\n };\r\n\r\n const rejectMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 500] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsOnSameSurface', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSelectedCuboids', lang)}\r\n {i18n.t('cuboidMenu.AllCuboids', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default CuboidWidthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CuboidModel } from 'src/models/CuboidModel';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, ZERO_TOLERANCE } from 'src/constants';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst CuboidHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getParent = useStore(Selector.getParent);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementLzById = useStore(Selector.updateElementLzById);\r\n const updateElementCzById = useStore(Selector.updateElementCzById);\r\n const updateElementLzForAll = useStore(Selector.updateElementLzForAll);\r\n const updateElementCzForAll = useStore(Selector.updateElementCzForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(cuboid?.lz ?? 0);\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const updateLzAndCz = (id: string, value: number) => {\r\n updateElementLzById(id, value);\r\n updateElementCzById(id, value / 2);\r\n };\r\n\r\n const updateLzAndCzOnSurface = (value: number) => {\r\n if (!cuboid) return;\r\n const parent = getParent(cuboid);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === parent.id) {\r\n updateElementLzById(e.id, value);\r\n updateElementCzById(e.id, value / 2);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const updateLzAndCzAboveBase = (value: number) => {\r\n if (!cuboid) return;\r\n const baseId = Util.getBaseId(cuboid.id);\r\n if (baseId) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && Util.getBaseId(e.id) === baseId) {\r\n updateElementLzById(e.id, value);\r\n updateElementCzById(e.id, value / 2);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const needChange = (lz: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n const baseId = Util.getBaseId(cuboid?.id);\r\n if (baseId && baseId !== GROUND_ID) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && e.parentId && e.parentId !== GROUND_ID && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (baseId === Util.getBaseId(c.id)) {\r\n if (Math.abs(c.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Cuboid &&\r\n e.parentId !== GROUND_ID &&\r\n e.parentId === cuboid?.parentId &&\r\n !e.locked\r\n ) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(cuboid?.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n curr.parentId = GROUND_ID;\r\n const absPos = new Vector2(curr.cx, curr.cy)\r\n .rotateAround(ORIGIN_VECTOR2, -parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n curr.cx = absPos.x;\r\n curr.cy = absPos.y;\r\n curr.cz = 0;\r\n newChildrenPositionsMapRef.current.set(curr.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(curr.id, GROUND_ID);\r\n }\r\n };\r\n\r\n const updateCzOfChildren = (parent: ElementModel, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === parent.id) {\r\n oldChildrenParentIdMapRef.current.set(e.id, parent.id);\r\n oldChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, e.cz));\r\n if (Util.isPlantOrHuman(e)) {\r\n // top face\r\n if (Math.abs(e.cz - parent.lz / 2) < ZERO_TOLERANCE) {\r\n e.cz = value / 2;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, value / 2));\r\n }\r\n // side faces\r\n else {\r\n // check fall off\r\n const newRelZ = e.cz + parent.cz - value / 2;\r\n if (Math.abs(newRelZ) > value / 2) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, e);\r\n } else {\r\n e.cz = newRelZ;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, newRelZ));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLzAndCzInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.lz = value;\r\n e.cz = value / 2;\r\n } else {\r\n const lz = map.get(e.id);\r\n if (lz !== undefined) {\r\n e.lz = lz;\r\n e.cz = lz / 2;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLz = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLzsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLzsSelected.set(elem.id, elem.lz);\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Height for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsSelected,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateLzAndCzInMap(undoableChangeSelected.oldValues as Map);\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newCz = undoableChangeSelected.newValue as number;\r\n updateLzAndCzInMap(undoableChangeSelected.oldValues as Map, newCz);\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateLzAndCzInMap(oldLzsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLzsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid) {\r\n oldLzsAll.set(elem.id, elem.lz);\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsAll,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lz] of undoableChangeAll.oldValues.entries()) {\r\n updateLzAndCz(id, lz as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newCz = undoableChangeAll.newValue as number;\r\n updateElementLzForAll(ObjectType.Cuboid, newCz);\r\n updateElementCzForAll(ObjectType.Cuboid, newCz / 2);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementLzForAll(ObjectType.Cuboid, value);\r\n updateElementCzForAll(ObjectType.Cuboid, value / 2);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation: {\r\n const oldLzsAll = new Map();\r\n const baseId = Util.getBaseId(cuboid.id);\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && Util.getBaseId(elem.id) === baseId) {\r\n oldLzsAll.set(elem.id, elem.lz);\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Cuboids Above Same Base',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsAll,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lz] of undoableChangeAll.oldValues.entries()) {\r\n updateLzAndCz(id, lz as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newCz = undoableChangeAll.newValue as number;\r\n updateLzAndCzAboveBase(newCz);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLzAndCzAboveBase(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface: {\r\n const oldLzsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && elem.parentId === cuboid.parentId) {\r\n oldLzsAll.set(elem.id, elem.lz);\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Cuboids on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsAll,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lz] of undoableChangeAll.oldValues.entries()) {\r\n updateLzAndCz(id, lz as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newCz = undoableChangeAll.newValue as number;\r\n updateLzAndCzOnSurface(newCz);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLzAndCzOnSurface(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // cuboid via selected element may be outdated, make sure that we get the latest\r\n const c = getElementById(cuboid.id);\r\n const oldLz = c ? c.lz : cuboid.lz;\r\n updateCzOfChildren(cuboid, value);\r\n updateLzAndCz(cuboid.id, value);\r\n const undoableChange = {\r\n name: 'Set Cuboid Width',\r\n timestamp: Date.now(),\r\n oldValue: oldLz,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n undo: () => {\r\n updateLzAndCz(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateLzAndCz(undoableChange.changedElementId, undoableChange.newValue as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.cuboidHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setLz(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisCuboid', lang)}\r\n {cuboid?.parentId !== GROUND_ID && (\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsOnSameSurface', lang)}\r\n \r\n )}\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsAboveSameBase', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSelectedCuboids', lang)}\r\n {i18n.t('cuboidMenu.AllCuboids', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CuboidHeightInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { CuboidModel } from '../../../models/CuboidModel';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst CuboidAzimuthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementRotationById = useStore(Selector.updateElementRotationById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n // reverse the sign because rotation angle is positive counterclockwise whereas azimuth is positive clockwise\r\n const [inputValue, setInputValue] = useState(cuboid ? -cuboid.rotation[2] ?? 0 : 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const updateOnSurface = (value: number) => {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === cuboid?.parentId) {\r\n updateElementRotationById(e.id, 0, 0, -value);\r\n }\r\n }\r\n };\r\n\r\n const needChange = (azimuth: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(-c.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && e.parentId === cuboid?.parentId && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(-c.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType: {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(-c.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n if (Math.abs((cuboid ? -cuboid.rotation[2] ?? 0 : 0) - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.rotation[2] = value;\r\n } else {\r\n const rot = map.get(e.id);\r\n if (rot !== undefined) {\r\n e.rotation[2] = -rot;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setAzimuth = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldAzimuthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Cuboid &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldAzimuthsSelected.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Azimuth for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n updateInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n -undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldAzimuthsSelected, -value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface: {\r\n const oldAzimuthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && elem.parentId === cuboid.parentId && !elem.locked) {\r\n oldAzimuthsAll.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Azimuth for All Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, az] of undoableChangeAll.oldValues.entries()) {\r\n updateElementRotationById(id, 0, 0, -(az as number));\r\n }\r\n },\r\n redo: () => {\r\n updateOnSurface(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateOnSurface(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldAzimuthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && !elem.locked) {\r\n oldAzimuthsAll.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Azimuth for All Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsAll,\r\n newValue: value,\r\n undo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, -undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateInMap(oldAzimuthsAll, -value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n // cuboid via selected element may be outdated, make sure that we get the latest\r\n const c = getElementById(cuboid.id);\r\n const oldAzimuth = c ? -c.rotation[2] : -cuboid.rotation[2];\r\n const undoableChange = {\r\n name: 'Set Cuboid Azimuth',\r\n timestamp: Date.now(),\r\n oldValue: oldAzimuth,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n undo: () => {\r\n updateElementRotationById(undoableChange.changedElementId, 0, 0, -(undoableChange.oldValue as number));\r\n },\r\n redo: () => {\r\n updateElementRotationById(undoableChange.changedElementId, 0, 0, -(undoableChange.newValue as number));\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementRotationById(cuboid.id, 0, 0, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAzimuth(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n `${value}°`}\r\n onChange={(value) => {\r\n setInputValue(Util.toRadians(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [-180°, 180°]\r\n
\r\n {i18n.t('message.AzimuthOfNorthIsZero', lang)}\r\n
\r\n {i18n.t('message.CounterclockwiseAzimuthIsPositive', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsOnSameSurface', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSelectedCuboids', lang)}\r\n {i18n.t('cuboidMenu.AllCuboids', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CuboidAzimuthInput;\r\n","export default __webpack_public_path__ + \"static/media/building_facade_05_menu.8fe3496b.png\";","export default __webpack_public_path__ + \"static/media/building_facade_06_menu.4342d26b.png\";","export default __webpack_public_path__ + \"static/media/building_facade_10_menu.de5158c9.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport CuboidTexture01Icon from '../../../resources/building_facade_01_menu.png';\r\nimport CuboidTexture02Icon from '../../../resources/building_facade_02_menu.png';\r\nimport CuboidTexture03Icon from '../../../resources/building_facade_03_menu.png';\r\nimport CuboidTexture04Icon from '../../../resources/building_facade_04_menu.png';\r\nimport CuboidTexture05Icon from '../../../resources/building_facade_05_menu.png';\r\nimport CuboidTexture06Icon from '../../../resources/building_facade_06_menu.png';\r\nimport CuboidTexture07Icon from '../../../resources/building_facade_07_menu.png';\r\nimport CuboidTexture08Icon from '../../../resources/building_facade_08_menu.png';\r\nimport CuboidTexture09Icon from '../../../resources/building_facade_09_menu.png';\r\nimport CuboidTexture10Icon from '../../../resources/building_facade_10_menu.png';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { CuboidTexture, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { CuboidModel } from '../../../models/CuboidModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst CuboidTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const selectedSideIndex = useStore(Selector.selectedSideIndex);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(\r\n cuboid && cuboid.textureTypes && selectedSideIndex >= 0\r\n ? cuboid.textureTypes[selectedSideIndex]\r\n : CuboidTexture.NoTexture,\r\n );\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n useEffect(() => {\r\n if (cuboid) {\r\n setSelectedTexture(\r\n cuboid.textureTypes && selectedSideIndex >= 0\r\n ? cuboid.textureTypes[selectedSideIndex]\r\n : CuboidTexture.NoTexture,\r\n );\r\n }\r\n }, [cuboid, selectedSideIndex]);\r\n\r\n const updateCuboidTextureBySide = (side: number, id: string, texture: CuboidTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && e.id === id && !e.locked) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.textureTypes) {\r\n cuboid.textureTypes = new Array(6);\r\n cuboid.textureTypes.fill(CuboidTexture.NoTexture);\r\n }\r\n cuboid.textureTypes[side] = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidTextureById = (id: string, texture: CuboidTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && e.id === id && !e.locked) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.textureTypes) {\r\n cuboid.textureTypes = new Array(6);\r\n cuboid.textureTypes.fill(CuboidTexture.NoTexture);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.textureTypes[i] = texture;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidTextureInMap = (map: Map, texture?: CuboidTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && map.has(e.id)) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.textureTypes) {\r\n cuboid.textureTypes = new Array(6);\r\n cuboid.textureTypes.fill(CuboidTexture.NoTexture);\r\n }\r\n if (texture !== undefined) {\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.textureTypes[i] = texture;\r\n }\r\n } else {\r\n const textures = map.get(e.id);\r\n if (textures && textures.length >= 4) {\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.textureTypes[i] = textures[i];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidTextureForAll = (texture: CuboidTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.textureTypes) {\r\n cuboid.textureTypes = new Array(6);\r\n cuboid.textureTypes.fill(CuboidTexture.NoTexture);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.textureTypes[i] = texture;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (texture: CuboidTexture) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const cm = e as CuboidModel;\r\n if (cm.textureTypes) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (texture !== cm.textureTypes[i]) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const cm = e as CuboidModel;\r\n if (cm.textureTypes) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (texture !== cm.textureTypes[i]) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisObject:\r\n if (cuboid.textureTypes) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (texture !== cuboid.textureTypes[i]) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (selectedSideIndex >= 0 && cuboid.textureTypes) {\r\n if (texture !== cuboid.textureTypes[selectedSideIndex]) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTexture = (value: CuboidTexture) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const cm = elem as CuboidModel;\r\n oldTexturesSelected.set(elem.id, cm.textureTypes ? [...cm.textureTypes] : undefined);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, tx] of undoableChangeSelected.oldValues.entries()) {\r\n if (tx && Array.isArray(tx)) {\r\n for (let i = 0; i < tx.length; i++) {\r\n updateCuboidTextureBySide(i, id, tx[i] as CuboidTexture);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidTextureInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as CuboidTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateCuboidTextureInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceTextures)\r\n state.actionState.cuboidFaceTextures = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceTextures[i] = value;\r\n }\r\n });\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid) {\r\n const cm = elem as CuboidModel;\r\n oldTexturesAll.set(elem.id, cm.textureTypes ? [...cm.textureTypes] : undefined);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, tx] of undoableChangeAll.oldValues.entries()) {\r\n if (tx && Array.isArray(tx)) {\r\n for (let i = 0; i < tx.length; i++) {\r\n updateCuboidTextureBySide(i, id, tx[i] as CuboidTexture);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidTextureForAll(undoableChangeAll.newValue as CuboidTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateCuboidTextureForAll(value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceTextures)\r\n state.actionState.cuboidFaceTextures = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceTextures[i] = value;\r\n }\r\n });\r\n break;\r\n }\r\n case Scope.OnlyThisObject:\r\n const oldTextures = cuboid.textureTypes ? [...cuboid.textureTypes] : undefined;\r\n const undoableChange = {\r\n name: 'Set Texture for All Sides of Selected Cuboid',\r\n timestamp: Date.now(),\r\n oldValue: oldTextures,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n undo: () => {\r\n if (undoableChange.oldValue && Array.isArray(undoableChange.oldValue)) {\r\n for (let i = 0; i < undoableChange.oldValue.length; i++) {\r\n updateCuboidTextureBySide(\r\n i,\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue[i] as CuboidTexture,\r\n );\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidTextureById(undoableChange.changedElementId, undoableChange.newValue as CuboidTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateCuboidTextureById(cuboid.id, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceTextures)\r\n state.actionState.cuboidFaceTextures = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceTextures[i] = value;\r\n }\r\n });\r\n break;\r\n default:\r\n if (selectedSideIndex >= 0) {\r\n const oldTexture = cuboid.textureTypes ? cuboid.textureTypes[selectedSideIndex] : CuboidTexture.NoTexture;\r\n const undoableChange = {\r\n name: 'Set Texture for Selected Side of Cuboid',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n changedSideIndex: selectedSideIndex,\r\n undo: () => {\r\n if (undoableChange.changedSideIndex !== undefined) {\r\n updateCuboidTextureBySide(\r\n undoableChange.changedSideIndex,\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as CuboidTexture,\r\n );\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChange.changedSideIndex !== undefined) {\r\n updateCuboidTextureBySide(\r\n undoableChange.changedSideIndex,\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as CuboidTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateCuboidTextureBySide(selectedSideIndex, cuboid.id, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceTextures)\r\n state.actionState.cuboidFaceTextures = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ];\r\n state.actionState.cuboidFaceTextures[selectedSideIndex] = value;\r\n });\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n if (cuboid?.textureTypes && selectedSideIndex >= 0) {\r\n setSelectedTexture(cuboid.textureTypes[selectedSideIndex]);\r\n }\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisSide', lang)}\r\n {i18n.t('cuboidMenu.AllSidesOfThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSidesOfSelectedCuboids', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSidesOfAllCuboids', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CuboidTextureSelection;\r\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QsbACcCTl4SVwAAIABJREFUeJytnNmPZMl13n8nIu69udWSVdW19N7TMxxqVg53kRIp0gQsSoLeBT9aT6Zf5EdZAiTLgGzAMqwHv1mA/wHDL4ZtwBAhipZk2pYESRQ5M733LFXdVV1rVmbeeyPi+CEis7pnemaahBuo7q7s7K++iBsR55zvfJHyS7/6a/rDH93kt3/7N/lv//2/0HbX+I3v/GO++z++x6339ljb3OLrr13g01fOYZ1DgKgKAtPxlP/83b/lvYMjFpfX+PSldf7jv/93jOvIb/yzf8q//t3fQXpDfv/f/Cu+/4O/5cHBMWsrq3z91S2ev7SGKwoEUECA0eiU//Tdv+XB0QnLK+s8vzXkP/zhH2CKPt/5zq/zL37rN1ncuMLv/f7v8cf/8y/ZPxmzvrrK1185x+XzKxRFB2vMU/GGq+tc3xzyR3/4B0jZ5zv/5Nf53d/65yxtXJ7jPToes762xtdePsf1S+dwRfmR/Iar6zy/ucwf/eG/hYyX+F3m937/X/LH3/9LHo0S3i+8vMbl8yuILdAIEDEiCMp//f6PePOdPTr9Pm98+jruygufxpcLlJ2S1aUeY2eoT4/p9ftsbpUMFgbE0DCeTihcQQwBMRaxlrppGSwvcc716PcHdLsln3r1Nca1x1UdvvjNX2SqgggMh8uYaoFev0vQyGQ6oQhhjmeMoW4Ci8vLxHLAwsICvV7Fpz/zBlEsrtPly9/6FUzZQVBWVlYo+8ssDHr4CNNJQwgCGhDjPhLvxc+8QRSH63T52W/9EqbqAspwZYWyt8xgoUdQZTKd4nziZ+yH8QYLC3R7HV54/TOocWf8qg6grK6u0llYoT/o4DXxwwRijBhjMEbQEOn0B5zbsFRVh8IJLtYjBoVCaBkdHjNyQhtgcWWVzjL44PFtg0YIUVEFCQFrhKBKf2nIYFggxtC2JxTUOA1E37I0cMSRJ7Se4XDI8JyjaSOqU1SfxDMiBJTB8gqLqwXGCL49odCaqAUaWoYDx9hHgvesrAxZKwoaH4AWESFqBCThGSGi9JeHLK5WGe8o48WMVzD2keg9qytDzs3wtCbGdBIoELxHCkfQSH9pyOJqiRFD2xxR0aRxPM6vbVkZLrNaljTeg2Z+MaAxogBiCaqU/UUuD1bRqFgbca9+/hs0GNYvbvG1X/lHqK3oVgWtBvq9LocnERXBCFhjwRhi8KABjQGNQrfraOsWQ8lnv/ptglg2tjZ46Y0OHktVFfg4ol/1CLEmeo8BrH0Mj4iGjNd31NMGayq+8PO/DK5gfXOdlz/3DXAFRZ6cblUQghJDi6Bp5YnM+cUQIBq6fUszbbCm88l4UYnBY0QfG29AUIgR1NLrJH7Odvj8134Z7JN4ZVngNTKoHCEE1LcIEVcUoBGNipC+YhA6fYdvWjQI7itfeoXlpUWm4zEvXL9CaQz3791Go1IVJaWZQoho9AQPqgCKqhB9wApUVUX0nkKVL3z5NXr9Ps14wnPXLuKs4d69e2hUOtZSayRET4yB0NaophNa8wQaI5RlRVs3VFb4ws+9QbfToZlMuX7tItYYbt25AxE61jIlEIInBI+2AgqK4oMSgscaoaoq/DPiTTRkfp7gmzmeaiCEgDVQVo/x++oH8YRbd++CzvhFfPSEEDDYtPAQNLYEH7GiFEWJ0Qj1GKdtINQthEAzGaPWggpWA74Zg58gVcAaizWG/DjyChdEIgZBSYFeG48WHiMC3qNqETEYY/B+SiQigAGcmf0NDIq1ghXFYNLLBrRpUVtgAUJANWIzXusbVEAEDAaXgEiMYnpdFKMGlWfDQ8CIYMXgjJBCb+LnrGAkfgKeYHmcnyIiOLEYASTvDTUgMe1EDF4EsYI73rtLeyTYosRYR+Mczeke3XBAe7hL2QakLDja36FwgtGAisNZx8nJhNIL4fgI59M5ebR7m+mBgFgaH+h0Kqb7h3SaffyxpQweisDxQaAsBKOKGou1BacnY8oghOMDCt+AsRw9tEycgBjaEKmqkvrokE57QDixVDGivmVymo5A304hpkTiZFxThgJ/fEjhW/DmE/E6MaLBJ35OMBrn/EaZ30+EFwJaeE5HgrUy54fAZFrjQoGOTrDBIxqQX/v2z6uf1pRlB2McIhBizWSqqBiIEWMUsUJhDapCiOm8FtEUD4yAtZAOH5ppjTEupYuagq2KUFUFaGAybXCuoHQGVYOPETEpTkXvESOINSlAP4GXjySNqBiqyoJGxtMa60oK69B8/gevKAGxdh4LkA/yezreZFrjXElpDcqH+X30eD+C36TBuoLCWTQEjMR8/HskZ3DGWVQVd3NnkjOpMaKKoogYRCJFUSIihAjWpG08OyICEVFBgmBLQ+MnoGmrpl9t/lNQUrCuXKRpa9qgWNviTDrOVDQdZTO8wtCE9iPxIBCjUDlH09b4qIh4jEQQl+KSRkQkHYVlpG0bwGCM/US8NirOeqx8BL9PGO8TeL7Ge0VMi0hE5vwURDEx4CpHGycQBffaZ99AUYIPKYcXk4NYxLctxjhcUWJNGowY5oEOBY3CdDpCrVDYCmstImltA6gEiKCqtE1NRLG2wBqDtS6tNhUi8TG8E9QYCveseGU+3w0qklaoavo/apnWI9QIpauw1v1/4PeTjjfxE0m7VFXnyYyoZTodgbMUrsBdvLSBNRYNSoh5VYkQgmfn4QOcLRmuLGJIqyWqR8TmlabEGNjZbukvDFhaXgYizhSIQAyBnJQRomf7/W1cUbI8XMQalyZQAyIOMeYJvN7CgOFwGdVnwVvCWZdeDwFj0qDFWAR4sOPpLQxYfma8x/l5RIoP8fvJxvthflEVIw4lsrPdsLSyzOLiAq4+PsBa8BGQkqAeE0Mq8YOn219mdXUdIVWXk2lNWZaURQECB3sPMAQINfVoH6LirRCIhJAyFlRRgdIpi0tLrK+tExQK5+Z4RZEGNcOTUDM92YcY8dZ8AA9UlNIpC0tLrK9t5KxeaRufYgdCp9vl+HAPQ4Q53tP4neEtLi2xfm6dGME9xq8sCkSE/b2dD4z36fzinN9i5pckmKZpgYggVFWH/UcPcBKhnVAft7ibb7+ZnjwpgKEQNGCAshqwcf45Njc3MUZSYMtbEwRrDUTPnRtvs/3+fawxOElBDWNyzSK0IVAYS6fb59z5q2xsbmCsxViDkYSomhOF6Llz462MJzhJapIag4ZU2XuNlMZS9vqsb11lcyvhMUsDVFFS1Y4G7t64wfvv33s2vPNX2dzcTGM1FskLChRrHRrbx8Z7hhfTskdjxrOWstvn3IyfORtvDAGvHoMhhpr7N2+wvf0Ozljc5sY5bNlBMYhGlEDTKpPJKUvDDa4/d51et4PYtP2tMRhriVER4MrVa4xP9vjzHxwwXFqmX1lMWaFqEFWiepo20tZjVtYucO3qc3Q6XcqqoioLjE1BsW08GgNXrl3j9GSPP/+LQ1bWVul2SmI0GCc4UrEcNNBORiwMN7n63HN0OhVi0mCttVhrCTGCKt3nnmMyesT+/z5gdW2VXlURNeHZx/Dq8QmLw02uXnuOsqooi4Kq6iBGiCHQ+lQVX75yldOTPfb/1wErq4/xs4KTGV6knZywsLzJ1WvX6HQ6FGVJp9NNkk4M1HVDaD0vfvoljE757ne/x+r6Odxqv8IMern0ARFLCBGxGwzXL3Pp0hbWpYCelJ2Ic0XeJ0LhLE3zEg/2HmGaU3rOYHs9VEx+aErEgqyzsn6ZC+e3cEWKQc45xOQV2037rnCG8fUX2dl7RFlYul2HUJKSGUVDRGNDZJWVc1e4eOE81qRiyxUpxRUjsySGorDU059h99E+hQOXg2lVkVJVVWJUdG2FlfUrXLx4ASNgrM3HlEFJcocqlM4wnb7Ig91HVKWh0y0RkvYGMRWHscWzwvLqeS5dPE9ZlGAEZ9OOU6DbSxJNt1Phx9e4cP5NlnolTtdfQpyhaQJFWeJsyqf7C6tU3Q4jb1npWEpniQCqOOew1hJ9ZG9U07pVzr3wFR69/w6xNNjS0Taeoiiw1uCx9BdXKTsdRr5gpWPpVA6RRDAVsEIIgb1RQ6jOsf7CV9nbeY9YWcrSUdctrihwxtBE6C+uUXQ7jFrHysBSzh6GpLxcRAg+sHvSEMq1jPcuhVOMNZxMGvqdTiomFRZXNii6PUaNY2VgqKoiKQZCSjoy3t4o4Z174SvsP3iP2LGUhaOu/ZP8FpYxxjJqhbWuoyqLuY4vc36Wh8ct4+IcVz77bfbeu4/ZP5iwd1jzqVe/Qt0aDo4bXnztyxw1jr96833+4s1tHh2NEMm1iLU4a3HWEDXyf998lz/5q5uM4gKXPv1Zjo6nPNgd8cIrX8Frwf5Ry6de/RKjUPHXb2/z5z9+j93DkySdFA7nLNZZnDOEGPjfP7rP9/76FmMWufT8qzzaPWJn94TnX/oik1rZP2p48fXM760zfkbBOofJi8XZx/D+6g5jlrj0qdc5PJ5yOPK89oVv0lByPBZe+tzXOGrKNN4fv8fe0ShJGoWdL74P4k1kiYvPv86j3RN2dkcf4PezHLUd/u7uI/7kb97jvb2TJL18CE/5Pz++z5/+9V1OWebaK1/A3L59ixu336V0cPfOfW7evY+TQAgtU+9RsfigOeim81mMTeFTwBlD8EpTt5SlcPvWLd66eY+ygHfuvseNW/ewJDFx2npUHD7ktCCvFDFm/ncrQvCRpmkpCrh58yY3br9D6Qz37ryT+cXEr0382qCoKOSU/Uk8k/DalsLBzbdv8PbN+xQ2cvf2fW7evfvkeI3DB83yi3kKP/MYP+XmjRtP4ZfaD3UTaNXl+QM+hMcZXl1TloLrdDrUUYkxVeaDqos1BQZL4VwSFZ3NWZaZHy9JOrFpO1uLdQYRQ9WpaKaBGD22LOgtLGBticFQuCQTFK7A2iJlWKKg+cHM8ExaRcZYqk5FKxCj/0h+zqUaSSDVC8pjeBZxT8MLSWX9IJ44nLWpKfVUfh+F9wF+YjFF2vmldbnITDLsU/GcxYjBTesp1qUuXNSAMRXWWKIqEYUYsEpeLSmZNsZgbP6egLU26TgxpcYaQ05ls0qcsx5FkRjzxM0ecF7ZJscSFOtSgkFMrxNCKrw+lp/kojad+0/g5UzumfA0pKD+cfw+Cc9afEyVvVUQQ9bCsszxFDwFrDhM2zRgHVFA8YiJGJMqSo0xC4OzemG23bLkLYboA6FtaGObpOY0G0SyeCapuxhjqnJDDDmwgWRpOol+zBUC71va2KY0STnD+1h+kjO2jP04XtvQPCteDID5eH7PgKcxIjESNKYkIwkrH40X2hRLJU909J7JZESHIq82zYaBGRgZbCamCUg6GzUC8eydoil3H09GIFU+5mJSXeXsgQoGRJGcfaiQ0ssAEuc/FFHzDPwEwWR68hhe+kp48sl4ebIk432Y3zPgIRhRoioBfWzMH4ens15MWv0oTCdTNPp03HiPb9pUYCWGZzLITGIGosTUrYsx/bBZfFGhnk5z+zN1F33dph1CmvjEKsnsqpmgpJZsjDEPIotyn8TP5AWjuYk2x4vE4Ikhzlf8x+PlRtu80v8gv0/GM4D3Pj1cTUf3J+LFiKC4k/0dyk4fax2T0xGTk3HefvPnMP919prOgygopsxBLgZOD3fx9DDOMhmP2Xu4R0gaCma2OmYa/mzL54k3+Z9MkSv46Dk92MUM1ub8xqMxcXZSyJP80jc6380JL/Nzz4CXIWaSz9P5PQMegkYl7d8ZJfOxeMaalBof7+9jigEaW04P9/DSRQR8aBO7GNN5OJd0IiFobucqvvFZ7k4r4OTgkFF7jPqW8dEjjkYtYoTgm1xYpvdKPvpmOhb5T1/7jJXwjg/34dQ/yc8Iwbc58EdiDqCpPJ8RneGFZ8ebjVf1Y/g9Cx7E0KI+oD4QfJgH9JnW9kG8dMIIpqGiDYZmMuHhziFeS2LwhAhRDCHXICl8pAEr2SKjSmh9Est8Oj5meG095eH2AW0s0dASFKKxZ3gksSb1w/OZr4pv22wwaIlBqbWijjbzO8BriQaf8CThCTrfLeYxPOb8UqLwk+AJ+iF+z4oXQp6TGIkKLgufBj4SL/hkenCvfP7zdPoLuE6XL/2Db2M6yTi2MhxS9ZYZDLqECHXdYi2E4BGTqsymDgyWl1l3ffqDAd1OxQuvvsKkidiqwxe/+Q+pc/94eTkZ5fq9DhGY1FOKcGa8M9bSNJ6l4RCtFuZGtBdfez0b0Tp8+Vu/hFRdlJiMbX1lYdAlRphOa4IKxJlRziZj23CZ2BkwGDwb3mDQIShM6poixMeMfM+OJ6osD5exRZ/+4oAQWibTCc49Od669gmv6tPtDyicwblYU8ROMnotOCZtJLae1ZUVzhUlTQhE6iQUmqQDiSZ3SFSlv7TMYJhavd6PKGjwMYBvGA4c+yM/N46tnEvGMY0JL8QkV5KNclFhsDxkca1ExODbI0qaJP4Fz/Ig8Qtty+pwyFpZ0PqA0iImKdAgc+NdVP3p8LRODTvzQX7PgJeNcqtrqyytJpNd8A0xexE0damyke9svBqTbcl9+Rd+larXY33zHK987puILShKR9BAt+MIk+TCMCgmZ1AaQ4oFMaDR0usWNE2DoeRzX/lFgnGsb23wM2908RiqTomPp/Qrd2ZEg1Rg5RRZ5kY5S7cqqKf13Nim2dg251ckI9pCpyCezoxy8Qmj3JN4M+Pdk0a5j8Tzfp4GgyHGD+IVNJnf55+C58oCH580GlrIeHm8eobXqwqmkxqRAvetr32OXr9HM5lw/doljBHuPGYcq9F8JnoQg89Ga+8V71uMQFmVhLbFifK1n339zCh39SLOJaMcIRvlmBJiklZCa3KAVFqV3N5UqqrENzWVOTO21ZmfNcLtu3eQCB3jmDJNRjnvQZrs+lLabGwzRqnKCt80T8UzRrh95w6ij+HFkOJE28zzyzaGJ/iFuqay5iP43c0mh2Q0VJ/Gi58lCE/yK8s0XofiYtOgVYkVQUMAzXWEtXjfoMQsqlmsJK0oAhpDysUxySiX8lli3RJdm1I675MhjFRFt23y1QqKFVJ3UbJsQFaTs7sjGe+UOG0IxmIUQtMke5DO8CapOgacsRTGMNN3jAjOCk409cZzVNWmRV3xxHitEYw1tL4m2exSEWckYjComMTXJheLKMn0IIrWDVEMFkHbFnUuGe2IeD9G2gmmSrvXZcME8mF+ERAL7nj3LvWhpKDqI52yoj46oOsP8SeGKirYhtNTcM7g62nOLg2j8YQuXfR0RNHWGDGc7N+nGQnGOLxXiqqgOdmnG/eJp44qBowGTo+hLGwyoklyeExPJ3QE4umI0rdIFEb77xDHBs3GisZYmO7SbXaYPgqYNhAHjuMjn41tCpKNbaMJRQB/dEjRtqi3HD64zaRIxVwTIlVVUR8ePGm8i57JiWCsEJo6Nb+MYTStKVrhdG8PbRtip+Rw19HtVATfzLW06cEh3bhHexBwbQttwdGjs/F+FL8YLfJrv/jz2kynGOtAJafzEVVDWVkETUY06yhdMTciB6+E0FJWFa4ssyPUYCQZx6x1RE1lZIzJjZGMcjEZ5YqC0qXkNwRNGplRgk82VLHJOGZE0BwURZPq7LWhnkYiLmVVVrOKnCrhEHUu6MXsqJy1DJBIO61zBzRX9TEb+coCCIynDdYWFM7N42cISowtiMOVBaGZ2U6VtB/STYHQpnTXFQWu6KIxHUtiJPOzH+JnxCQPAuBuPZzmUtKfVbuajG3F3OgVEWkx5hTBnhmuUYxGirKh8W1+ILl+V+YVsxLQAGXhaH1DGyLOWmzuDyhKlIiogQCuMLTBoxmvbZMBWqLmIj/J4kV2vsQoGJN6C8muEwkoogaJYJzQhknWuvKDIWQRLjkciULpIo1PRj6hxZgzY1tSwxXfTimLghADbduSwrWCGmLSixFRjLRUledxo6HJMotKeqeoQQLZeJfmz736xhvM2qiQGz0xFW9NWxNjxNoi94NNUlQ1EmJMZ3M0TOvT3DMushEtp5+atBo0F32+TjZUm1qd6b3pJydnoEGjUNcjVMC61FIG5lcWRLIOpAHfejAGZwuMM0m+NjDr5IOgHqb1KeIsVVklvKyKkN83U42bpk73NIo0XiOCzip/hRADIUTq6YSoMm9RJ30qqRkzNQIMMTTZO1BhrZlf1GEWg1Tmxjuy8c5dvLiOszOjV+pZoIKPDTvvP8AVjuXhMs6kiQkhYCzJgIxFY2BnJ9AbDFgaLqYaZWY0CHH+g0No2d7epnAlyyvL2YiWriEgdt5Y0hh4+CBQdbsMV5ZRJDldRPAhQHYkhujZ2XmAEcNwdXj24GKYqydi0v2M3YcN/YUFVlZWQDVZWI0h+JB6NICPnp33dzDGMlxN/FJtlY6c1MZwRCLb721Tll1WVhfnAihiUqIg+cBB2NvbQ0QYriwj2FzLeIy4nJyklsSDnZbeoJ/muT7ZxxtDkGz0MgaJMRu9IgtLy08Y0Zq6oeoUqQsowuH+A6xEjLb48TEaFOcETyQG5hpORKkKYWFxkbXVc2mFOctkMqUoy+zMgOODXYwEDJ52kvDUyhm/2Y5SpSqg31/i3No6qun11uedhFBVXQ4PdpEYwNeMj3YhKs4IXiIx5M5d3k/OBhYWV9hY30LzVby68UBAVCg7HR7uvIuGdG/k9HCaREQ3kxFnt7jSoTg5nTBcPZ+NhqkpNZ3WFFVJ6WbGu21EA4SG6ck+7tbbb6XDyiSFMhm9AqUtqHp9zm1dY2tzMxnRTCI/M7VZY0E9d2/eZGf7HYxAkbftbKtrBB8jpSuouj3ObV7m/PnzqWOYsxLJEqi1lm2J3Ll5g53t9xCN+Q6JZs+uolESP+Mouz2W185zfmsrdS1nR6/OowjWwfv37nLn9k0MUOSVqbOjL2o2tjmq3oBzm1fY2FjHWYvOTXwRlZRaExu279/l3XffpzQOmyXxKIL6fAUuBjplQdVbYml5hY3NDZw12WhoZlsoFYracvfmLe5sv4OI4DYuXETVYItkMIghOdunx/sMljd47noyjomRpNxpzE87ZShXrl3j6NG77PzgAZtbm3TKgqgG6wSrEDQZx5qTAxaG61x97jpVWaZyITf706pPk3np8lWO9rf5sz/b5tzmJr2qJKokb1g+noMq9ekh/cEKz12/TtWp0rFhUtwSSBkYcOnSZUYH2zzc22Fza4tOVRDVYh3piMl3Cccn+3T7K1x//gU62SCX+7KISS5NVeH69Rd4+N5NDo6PuHT5Qq5xUoZnSAFciZwc7LK2dYUXPvU83U4ybavOhMXc+gUuX73G4e67PNzbYevCedzSQhdjLGV5NskKjHsFy6uXuHB+aw4WNeZrZyY3+Q29TsWD9S0uX9hkuLKYO21nRrRZA2C0ULKwcpELmxu5QCR325IpuixTnVEWBWtr57h4fovh6gKpn2koS5KVk1SMnp5auovnuXLxEtYKYSa/Z5d6VMU5S6/bYf/BFhc211ka9nPRZymrbBXNAXvcWWFx9QoXzp/HWJlfXw7eJ+kjL55uVXLh4lUm04bF4RLWCgaXUttZYqSRTsexdekCW+trqbcjSeIPIWCcpSzSxdGydGxsbHHp4iZLy32cLF3FOcO0biirCiuGJirDrXUWen3GrWN5kMxqs2zJGMEaR4yRg7Fn8cJLXIor7G6/Q7dIl0+OxlO6VZfSWuoQWbm+yaA/YBJKCqeUOY201lKWJc4lcfBwEuhtvMjlz66w9/67dArFOMfJZEqn6CbnoFeG1zcY9BcYh4LlytAr3TwdnzWAUOFoEuhtfIrzrw043N2h10neqLptKIsqpdWqLG+tsriwyCQULHeEwtqsSMRcbyRR9XAaWb32GQ7tBvsPtxmUBaZwnNYNZZkUjyYow/UVTNlhEg3L/SrFjNn9m+wbDj5wMPYsXHiJi2HIg3fvY19+/cu/43G89Jmvsrf7iNNp5OUv/Bw7BzU37+3w8NSz3LMMF7oURZmsMs5hjcH7wPf/7h4/vPWAYmGT8xevsLe9zdRHXv/iNzg6OmI0jrzypa+xc1hz8+4Ddieec4slC92CsurQzb5Xa5KF9QdvbvPj2w8pBuucv3iZ3e33qT28/sVvcHB0xOk48sqXvs7OUcOtuw94eNoy7FmGgw6uKrHW4Vy6ctd4z/f+5g4/uv2QztJ5NjbPs/3OfaYtvPyZr7K3u8ukVl7+/M/x7qMJN+89YG/iWekZlgaddF+jKChcQZmvTP9pxqsWN9nc3OL9e/cYN5GXX/sKu7sPmU4T3jt7p9y8/5D3j2qWeyWrix1sMbMDOawRmqblT/7mLn9/+wHFYIOr157D/OiHP+TGrXfoVJa7t+7y5o1bFCSj1+m0ITAzyiU95nHT2Oz8r2tPPa2pKuHmjbf4+zdvUxXCvdv3ePPmLYpsHDutE15QodPt0O31KMoy5+c2O1mgaT113WS8t/n7H9+iLOD+HM8TfcOorgkY2piyJCPJCC4mpZipaWVoak9dJ3433nqLN2/eo1tZ7t66x9u371FZJbQNk7olYml9qiOMSxYmYx/DE0Ndt9R1TVkJN95+i7du3qPbsdy7dY+3bt2lspHoW6ZNSx0sbYhzuSklM/m4ztagtg5Mp1N6/QJXdjpJsggBW5b0TDk3sZVFMTeipfuH2TWRA3ACnNk3k1GuqCrqOhBjwLqS3mAx46X4YMVlPDv/GAxyJZz69BaxZ3hVVdF8HJ5xFDYZ784KXBCbjHzGzPgl/mVV0ZqUCdmioF9103tm45Uzu+cspqb5M7lR9Ul4PYxJ8+cKR1E4CuueKILPzBszvOwIFcEZK6lhkoORs6k6jvmOhWgyvc13Rw7SyY+WUlvrslFOTXKizy7aE9IArUv+KRTRgFHmhrbkAE1Z1uzzP9xjeOZj8WLSsuRxY1uawtnVP9F4ZuTLKjE+ZCkkYrNLMs6r55iNctmN81PhGXx2y1tSzJWM+TTtp/xmAAACbUlEQVQ8ky+XEk26XISxWT5vwaRuVgjJPJBsOzOX3Rwv5T6Smi2+bWmjn+fXTxjH7AxPk/QQQ6oXZl8ZebZqQkga0bPh6Vy4nCXOkvvVQvYJB4/3yciXJkDQ7BQEjzExde/yeKPm8coZ4k+GF5h9jgnZopt2xcfhtTShRYSUrM+s9qfjEUWZLSoS8z3CmSF6JhGcPRSVVDQRNBm9smQgpAd1Oh6BdNIOmxvlOCMl5qy2yU9cVdFnxkvppIGsnqaiT3IxMjOipdaFznmLCsF7xuMRXUnGNhHNKzU/1hk/fnI8k/FUIx7N9dbH8AtgZh90gKQGEwr1tM7txdwLrrMRjdmtUZKQpszKC2LuKGoMiNGz6luFZlpnbSkRDk1LCPFshyXA/JDT5Go23sVnxPM5LZ3zy5BzfpJriWxsI+PNxqshpM998C2x9nm8eaHJT4eXFpDP4yQb5WYgT8ELnhhSQ86NDh5QdQcYa5mcjjg+OCJoktySajvjJbND72zr5e+T0cuCBsZHjwh0MdYwHp8y3n2Um/szPJkzUj0bc67EUvewLNIH0zwDntEZt1Rkzh7u2WZWbJnUYGJgcvQI01vFWMvp6QmT0zEziVGyInX2W65pfgq82ZW/mTFQkLmF9Kn8jGCIuKP9A3AP0OgZH+1z2qRAFUL+HJGohBDnQThVh7NnofgmtXI1SypHB4eMmkM0eKbHBxydtGd4kITLkGX0tHyStpRXpc8Z1bPiaYyJnzm7Az6z/M+MaDM8EA7399GTFo2B8dE+IRvlfGhy6yHxM1l9ni/nZ8Tz0sUYk5pZIV1xC77NZ+psET4dTxD+Hy7gM5v1mIY2AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QsbASYTPDdp0wAAIABJREFUeJxVnEuw5Vd13n9r7f0/j3v73tvvVuvJGwkJARIYhDEUYIMJuIhJlSsTD1KV8iCzjJxRBpmlKlWJM8ogcbniVCWpOLhsgvEjVBkbkBBgvWhJqAWSAIGkVr/u+5z/3mtlsNY5TUp1Vd197/0/9l6P7/vWt4/8/r/8F/7w+x/kzOmznD97GmuN2XTK489c4n9/7RmGc2+j0HAcaY4VcDPGZkhRrh45XZXXLj/N3ZM3OXXuAoeHx2zUyj/5zY+zfW6Hxx/9Lve/5z5O7+xw24VzuBmbJzZ4/OlL/Mf/8zxbd70dfMRNab2zocY7zs5xgZtL59p+w+ucly89xtnDlzlz4XYOjo7ZrIUvffYT7Jw9yePfeZz773sPp05uc/v5s1h3Nk/MefwHz/Ifv/JDtu56K+4NTOjWmQu84+wMF+fm0rl60KHMefnSd/IeFzg6HhlE+dJnPsZtF8/x7Ucf5953v4uzp7a4cO4cgrBzcos/+do3+ONvXWP7ttvBOzjcdqJyfrsyunAwOmhhf+k0Cj9+/C+4a37MxuYplq0xn034wic/wm23naGKKHQFN3DHHVQKRcEAc6dgmDgNo5jinj8u4O707pgbIKgoitJxOnFtM8Gs5/UdVBARxKGZseyACOLOcXdmWnBXWjcwp0s8h7sDIFIoLhiOu4IJ1gSzhphjDlIEUQFzmhvLLggK5iwaTAfFXOmt4ya4xz1ww90xc2IFBDehN8PdEGJ9DAfrWG8IwujOaA4iq6WE/IrnNhDDKQCoKCi431oXFaGaGWjeG9CiiIKqoqqUqhQpdHeKK4MqvRs2gBSlNMGplKqoCIgiKhQl/l4UxAGNl3DD4zXpZiDxe+qCFWdowvZkABfG0enkdXDcJX5WJJ4NR5S8B4Di7vjqHg49N7GIoA69QO3KzmRAXBh7bISoIHmPosKgSqMgCEiPCiGKAuJO1YqLI6UgAlWEIgpiWHFKVUQEXJAiKIogFI33LaUgqoCAO+KOAzUWpmO9063nTinuitYZkxMzJgK1O6332LDe0ebUWtgXo8iU6fwE2q9RiyClUERwemSGOYJQNRZOVRFRpCjWwU3pUnEzhMLmbAIqHJqxlNgUdKBQKFrQIkipqJLR3HE3FKEURQVQRTKorIF1xbXg5ogLG9MpXoTDhbPA6AguA0qJa9QBKQ1xxwzMGr03OgalIk5soirNLe4nFZeOCLhWTOMZqzlmiqrTpEZ10KgmLoLjoFGuq2pBXJCiUTYAEaH3kae/+1fw9JxBC+bQ3FAVMMMtIunYnP3FksPrb3LnQ/ehpaI6okVxDLdOdwM3BIkoU6XWCW6dK0/8JVcvfwcpigjQ4cZMKSosmsV9gf3jJfvXXuPuDzxALRX5/+4RZcazxKAFVaEMA26dN578S65d/g7UiGY3uDGNzVuMjuOM7uwfj+xfe427PnA/pVRKKagZzZcYhqIZTGBiiINqpS8PefV7f8b1nZNR8hGuTYVJUXyVtTjLBtcODuDwKu965MOUogy1ZCY5hUrFJWqVgHejSKH1xtvecjf//J9+lj62iEI3VAS3iIaokZ2hKldu7vP405cZZpuIG1WiXrgpgkbd1QpacDMMWC5H3n73Xfz+7/1jrBmdTu8GGN0cN0HEwaEWeP36Po8+NUGHAcypQiyuSxZAQ7UiWvDeMVPGReMdd9/Fv/q9344K4I71jmFY3kMl+mYt8Mb1fb719IQyTBE8IlmizAiR3UL0ulIGeh9ZLkc+8tCD/P4/20dVUC1gjrnQsj8IkclaCj957U3+4fmXcJQikcVVo6CpCtWxqPlE4x1qoRlsTrf5rc99kd7BLV5iVe+6WzauTs0S8tnP7vKt7z3F5RdfxtxRyqqsI6p0IooFp4gwemdra4dPfPo3cYugaG2B9x6bLSAozQzrnclQ+I3PHPO3jz/Biz9+JfqRxGasep55z8ZrlLznia2TfOLTn8MtLtraEu/ZSAGh0Nyw3pjUyq9/5oi/ffwJXnjxR1iPLMCj/uOOWWwmvTOpFeudc+cu8Pnf+hLWOqx6uUG3BkDv8VxVo298+hdX+PvHn+KVn76KW6cME1AwjGrZXEWVSR3oBseHSw6OjikeaCFKwaoVR8lqva3Lj+CcmEz5zK99mHvuuJ1vffdJbl67RvMeNRsiantHtWKlcLB3TGs9rmWWtX6M6zvRmF0SpsBi2dgcJnzuEx/hh3ffwbe+9xQ3r16NlzVH0EB73Sk64KWwu39EWzasR9ZpiXtYLm6Ukrgf5ixKY3My4fOfeIS33nmBb373Ka6+fpXeDENwib6hGkFgLuze3GO57KgKTsny2fFEdO7g0ilSiOLr3HZqm89/+iM8e/klHvuHZzg+PI4gVKiCQnfG1jg4Hjk6HAO6Ad0NEcXX+x4LFXBMY5vcwKEtR0Tg3rfexcXzp3n8iWewZhQ0XhpBFQ5G52D3APEoCT3xobee1761CRFelv+kLPsCXTrvuvsObjt/hu8+8QxmnbpqjtEbOVx2jveOae5UUcjyURC6ZRNlBXMdBVwUM2O5XFBUuP/tb+Pi+XN8+/tPYmKYtUB7PZDVwVHj6Gg/bugapV06IgWQLIs9oTaIGuaCmdHMEYH3vfsdXDx/nqd/8Bxj6/QuUe4n0xn7h0tu7l2hCLhqRJ06ilBLxdyi3ZjT3dFVTZVAIaqCAjd3naLCrzz4Ho6Oj+neKLUwmc3YX3R2f/4aiKFSo+RkT0ICLYlrbIgqbmPWrkBHRQFRdg/2qWXg4ffey3KxoJtRxJkMlb3FIYevLTFXXAzFQUq2yQww67hk73QwcdQlyp0KbsoNv8G0DnzkwXtZLI5QLUhRJnXC/sHIjb0r6Cp8VBh7YxAFrZg3xA2RiijRE90QoqwWiXe03qil8qEH7+Xo6Ah1o+7u7vKzV3/K5uYm3g3VEiWsZFJYpGnUbEUsmjkZ9fmumEFB6dJxIzG5Q3H293a5dvUapVbcWpR+Ct16RJ0K4oGo1DVAqBbEkyN5ZKlKoqpuwU9ccIkAuHHjJleuvMlkOkTGEdEoxLNXLUD0vhXp8h4EMshcCxKcqLNZD/QjBl6QIly9dpU3rr4Jeg2hg+g6w7ob7mRF8QQFCbvN16UOQHQAj/tJXqP3zqIdUbfmM05ub1GnU6RHcTEcVaGb0XvWd+sULfTWA0GJIBSq5sOjFC24DpgFzK0o1EJVZT4ZKJMBkUlsYI9StSKLqoUyzNAEC6tFjQ4VzdQTs7p7EkrFDIaqTKcTZvMp0+kU3OjEZqhEgNVSUQSj5+ZKAoggaZabVTQIbLdOySDsZojAfDJjmJYgzVIj4nuUn1qiurokv1CPLKHEomcHBnAtmBfMjYIhUhjHznw2p5bZlPnGnFIH8JBQtJSQP9ywtkRKiRQQcIRuDRVFPFjsBAk5I2pKfC8hsqgym82Zbm5QypBhCWaWi9URcYY60F2BjkoN5OVBLgM2D4x9ibpnc802Y1BrZWNjg63NTYYhkBlCsOPsL+KrCmXJukHZuLXBSVoDbmefzDKDhG43TKdMpzMmtaJ1CDmnRfSXEk1+KIJ5ZIyKYz2knlgTxXqLCiAVc6JFIGjtzOdb1N7iAWlJ4IgfMIJ7uDvSLLIikVYfW+pRui5lKrGwTqVLZyC4SveWULFnr45eJJayBx7aUPcoZ8UTUkuUNg9003vLyI/FFdckqB0r0fMic2QtWTTviBiqQ6AfCdLmlqhLlgmwOlJKKhS5Bua3Nq47UpVxOWIdehFsbBEUInHfFtnXQgCMgBZLGWekULPKZyD2kGPMBST0wNaW1N47Zk5PwU8DEdLpETRaoyJ6NAoXp5SKiCNSqalZeRAHFI/IkY5oRdeRZ1ALmg/mEg0Ul6zzAQwExSSaoCbaU5XA/h4kDYI0ukItE2qtgf0lBUQ3imhoTXHFZMydTsdFszDHNTVfWsRQge65MUlwCeAUwVdCs3IEF1v3HFuhRhspWe6LR7A1j3IbAVbyutE7RCPgtIfkUmup2aA709kGtUYPMLIxYyGgoRHBuYisIKpA1YKrYL0jRKPFnKPDZUSZlkBVwHQ6MAyV1j02C8e9I7kwDgkdUwFFcQVNxtsshMOqQvfO4dEyIHRJ4U8L08lAEWFiAeQ6IN5BavaioK09RT1NfuFr3hWQOEpOY9mWqMCgNRabkY3JBnWoUR49RFl3B5sgqpi3WCcKE0bI8imiiPZUsztVldYayx5KcHWcOgzUWnn5Jz/luI3MZtOQIVJOCVQU8gQeNBFLHK8k1zDGbvQesnQthdvPn2NjYwYIpQhaKi//9GcsWmMyKUwmU6oWmrUQGVOpFRWsW2ZHNERP8tasoxm9gnD+9BmGyRwhYG8ReOUnP2MxNmbDwDApscDWE8UBegsogFApmNgaCpvFe7e+pJbK+TOnKcMErYVJmeAqvPKLV+k9el+pQk2hNLiZI0TlQXStUIhUTGIDzQ0zo7eAvqdOnmK7FCoe0Xf25A5ux3zlL7/Ocz98kZu7N9nd2w09CQlUlBeJWUDMHdwt662wvbPNfDpjOt/g5NY5fvd3vsj2yS3cO6037jh/BtGRr3z1r3n6hRe4ub/H4d4+RSxmGt5TYyJ0oOQJnpKFlMr2zjazyZTJdJMzp8/zu1/6Ajsnt2J2Y53TO6dYLnf406/+Xy5dvszu3i6LxQItwaLFNXrjqsWnPL+Cw4JwYmuD6WTKbLbJ2TMX+Z0vfobZfI5IwR3OndoBX/Lnf/E3PHv5RW7s3mQcR6oO9FQnzAJ8mBtYUICAKE4VYfvEJpPpjDrZ5Nz5C3zpH32aGGSYp/ZivO/+B3jnW9/CE5cu8V/++5+y/+bbOH/P27CWpJDIiJUuJDmnMK/8/EdPsalXuHjHWzCdM5QSaE1rwGEXzIX3PfBe3v6WO3n0e0/yh//zzzk48V6mp85AtywTSi1KKYJUAVUGjdT/6TPfYnN+zNnzd4BOmE1noWNJQUUYHcbufODBB3jnO+7hsSee5j//j6+wt/VuTl24PUpbJDtFo6aLkn1G8Fq5/NjXmdsVzly4E5gwzOZokRQOI7sE4wMP3M8733oX33jsO/zRl7+O3P4Q861trK8yIAZxq+yotYAI3YVXHv0ztk9O2Ng6CzJlOtukVgX1oApQMHcOjhZUHfjUIx/m6s2b/LdvXOeOe9+P9zGmd7kJrp5qr2Q52mS5WDK9dsh0vsWiWU4d42HG3uhtxHrn6OiIWmd8/tc/xuvX9/lfT1fO3Hk33oxuhipMhkKtFVKSnw2KDnN2r7zGxvInTDe26XkPIxtq/mfuHB03ik753Mcf4fUru3z58pQT5+8OyAzUCpsTSYSjSOmoV1qdMT/5AzaPR6bTbVrra+JWEk0VBUw5Oj5mqFO++Buf5NVrI9/du53t06ehh3LduqcqYKDO5hBK9FEzrmydZXOjMJ1tMbZAn8KASqUiIUFnbaCZsxjh3KnTbA3XKYtjmi+pOGOPyCo10l4QjpdgGnylyBA43hVRp/fYbAiukDyVbsY4KudPn0HaGywO9qAn3MWxoVBrDLC0CHVS0Nbx3qjDJMrPqufYijM42BgoETBzluacmM9Z7O9z88Y+qoaZsD1RLp6uLDocjU5DGPsSkxFbLCl1khA/aKQgwcTJyaeG9tUSPu9sbnJ89ZhheQgWfdR7SELNnYJwajCskdpcSCxrtSP1u9Dluqe0nERONFizDsymwuYkoGE3wSqoOvNaOGzB6cfmLHOIXLQGUrKQ6HMHGOoELQOq5da8OfmOm7LoCh4YH0Jb6hJDX0GYeSAoBbSUmJvnP0iy6LhmTvtEcCmgA64x3QsV1nBTKsbJwVio4M1YeGF0S5kk7lG0YHQKGrONFqpFz+mkeKBHp9J99TarBTY8RUehUcWZDXA4gvSQm0oJxFXEkxbEtLYaiZFXNTVn4pIDIBFZkxfNiWJArA6lIGrIai5dBFelqKNJKnvvWeeTQOWDq9bQzQSmuRBNYm7vEvM5Ief0BMKClECCFke2pczhHnOKnh4Bt9CYpBSGIkyV0KwkmqolnHZRVIKDdO3JOeJ3VxxKFUoNacC7o+7JyQyiyDBVZUhS2kWxvFdxjRG4BJ+qKlQZIvAl3tlT3dZSqTHXIEM2CFcQndjrotBzLiEr/SG+iTo51gzjgax4BYBowMyUUzxLopSQXFQK6kJVoxTBeqF6D5lClOKxcLoaQiXpUxEwRS0kmlImKegFJ7Ju9N7W6j2pOHRXnIC+FiA0nSax+YhSLJ8r7BOhGCOI1KiDEsSwrZwtIngPkbA59Cw7hmOW/RboIvh6cso62E0zQFMkxY0aD2uYcOuB3VLpjJ5RCY1HCemdUlATTJwinjdwSgqJJkHcioYOlCUy5+ZC7x3zjhZhEJhIpQ9jLIOFJDOooB4wVVcsOTd6xUGixPiav6ikIty5xfBQmkuWwCS0wnqIZKQS26PMaRLS+HfPhEn1wW9pYlHmYwSLhyqQ3TmvG73B3QL6uqMJ4VfKdRTisg4dEaEGguCXYGfsnkr0jR47hOdLmcla41rrXQZya2i7CkywjjenUNYP7N3W69rFWZhTeiCN5vFyxcNpUvLLgLp6X1VKKSxlzMyJm5VM85XeJiKgadFRoYpTM1oHdTyNOSWV2KXeyqmhhsHBe8o7rIRK1tVk7J2hOlIGigpTESaqwf7NUQ3TRaxN6rySPoHkdoKgJVQC8QAiioawp07IGylth0CXKW/Jaj2GUGS6h1CXG7SKCMBSb4qxZ0gcJWaerNTgIhXvUY6irETKu4T5TYhItniTvIenKhCyRmRJ3LVbZPrYW9IvC58AKwVAMsqjbMQQW9ItdWszRKAUoeYaiJTI/lSXJX1kwcHSBOidTnCMFVm2dCGs1iCmsDlbESglHiHEb0dLIBMV12Cpqz6QVD+cJZF4neQdkRMUNwpOtR4aETFYQgulDBQz1H1tcAulV1KOkXUtxo3qgphklAeKU01FODM2njXmMg54byH+ZQ0Or1y6L62nfB4BJa50j7rfLfSrbmA9oGz3mB6aR42X/J8DrhrPgqfuVHIT4r69N4QW5S2zsxEyvFtku8ktHS5E6L7yZkRwS85t0DA54BZo2z3ra4yEouPp2nG39jwRCxrDtFBV4/1TrSxKT6HN00KjqpjE0Kj3lk7J6EcRW8YQwAUk5vC4UgUqUCQinNywMhTUKmE0TigsIYDGM9bInlRxJwozjU0t4kwlMtBWpU5WrsVbTD5baGZ6SYjeI+bDoRfXz/vWAlOBmiAojHfZOzSqg4hSNDK3EM9cS6FohaxO1SX5AOQoNcqRkDqVd7olalilftF0ilTGlLHNDOpKSo/ot7S/DHprcBX4uyA1om3ZhCFnztZDmhm6UyRMAWhELon6VJQqyhJZZ4J7UrhEejEbCZeLWfRG+6VSu2q0scmBcAKDpZs3vWrqq0qfsxEV6spMyGoUEGsUrVYSbVlknAh4KBaqID2uXUQppQa09yC/hlFqQVWUIaVrX+8EOfXydVKsjM3rAU6+pPiaTyGE9LHWiTwAZsdD/9IVGVwhoxhzuki4PjR6yGoHIs2FIivYmzZUVUQsYaUzdgsovVpEkbVFUyUneAZNiAHXOisCWYpHKY6sCNCgSjRlv/WFxZqYeajXGiSazMzYWEE9zA2uIOoMmuhL49lEw61Y1BB1Wm/ZmzXk9xU4yjFTSBMIWisn5hM6zrF44m7BNR4m/LMCnn7VfNGiwabJxXBLDtPzxUSjjRRlqDVwPi2NZE4ZhvDniiIpoQhh+i4l5u8hZSfI8JVqG5bYolFqtYRLfRgGppMBJH6uTgfKUHFzhjIgKIMBdZqCaJSilamzrPiEd7rF0YzucSqgUNCibG3P2NqZp2wfAMIkAnFzokzmBVyoXdFa1sES76JJbC3kd++69hCJKCV/YbF7g90b19k7WrAYV6TKGSq0BoMW9hfOflMO925SztaM3thekZLzkaij3XytEDvQ+oiO+3B0k+M+0k2oLoxVqLUEi+6Ffa8cLOBocYDobK0AlBKamvUl5i26gig9XTEiynK55NovfsxyPAgJ3wU5UTiYVVyFRYunORydY4PD669Tds5RJUqJE8cq0rt4C3n2GB1LKSyPDnnj5dc4vnEqERa/RBeccTJwUJWldQ5HY3Fwg+HsXUjNUwUlvGOCBg8ZYlZLs06VgrszrYXDVx7luV98fw0XPSHnqiJr6kev39zljSuv8+CnPk1VZUmkdHh0W5JBAzq3+F2heuPwua+ysXUimXkgPhNnlGA1++IcCLx65QZHR3s8/PbPUkphGMIb66WAKFWGkPwFitYoLSjnT21wx+ISs+s/joAzh11hP3BFZCLOBOEXr11hd3+f+s6LlFoorVJWxx48ypOWsBmVbM1o4dRUmL3yKPraDJc0u2U/QmIk0B1MlJd++iqihcm976CnVXVt3MOoiGMYmqNcwVksl7zrnW/n3/3bf423MBK03PHVmQuTHi4+nINx5NtPXeYnr4btUlVxDxOAaGU0Swir2eyN48WSR37lIf7Tv/83qUV1xENN7akVtW70NjIU5ereId9++gWu3zxOGbwk2w09ytwYu+PNMto6bbngVz/8YR687156GykrDctg9NXhnnDP11q5eXDMN7//PD966af03iiiUUYJjiSpEpQSc3EphXE58plPfZKPPvJhJAltDFZDiOw9aQGBe9+4vsdjTz7Hz1+/GohtpSAQ1KGOrdG8AUbRSp0MLMbO4tjZOX1bTgoj2qwF4aJ7lIVMt7OlcM897+IHL77C9578Aa/+4rXceVsBe5pbcgCjTirHiyXNlDMX76GPHU93ipQStlKzMEFbp2jl4j2F++57gKdeeInHnniavf1dpsNwC67zS5CVznSYcXS85PB4iTIgdUgHYfS24gOmjtgYpAzh9PaM3/rUIzz/0l1858ln+Nmrv2A2zOOcSRFa77TWY7ysoFU5WowsRlCZRnFb2VrNKJLNWgtGw7tx94XbOf+ZC7zw45/w3acu8eab12GQmDeJU1szrPXgFLWyf9xYHC9DIyJlbSGMY0kavedoUsAlbJSYce89d3L3xXM88YPn+f6Tl1gejreQmwXRK0NlNGFxeIAZLBgRc7w7rh1fhjnAvcc8oSVPspjavf/d7+Ku28/znX94lh88+yzL5ZIc0oF4mt6U3f0jFmML/QkPp0kGiRMmuShWkQUdp7fgV+9+2x3ccfEs33v6OZ7/4YssxsaUCYjT2xItW0yGGcdHI8tlD+ObKGK5Fml+c1ekEMZ0hVImLCyC9H3vfgd3336ex598lssv/WRNwut0MsG1cHg88tqVGywWyzihhKRrMeUQ76FWrRUVyyFVyUX3xObCB997H7dfOI0tWhrioNTKsjlvvLkXG74SAlMPI/3BnohJRNAq9NZRKbBYhBiR6OxjDz/I224/R+/L9fE77bBoxmtvXKe1lrKH0mxMNXqA9EolTsc8RExH6RZlKry+xsP3vZO7LpxB3bGWsk9Rjpedn79xHevBHaKI9NCjiIwVrdjYIIEHnkbsJN6HbpRSeOThB7jn4vmg3uLU6XTKMJ2xe3BM292jrCCfh8dKNOYGvbXw3UrY+r23+J6vZOVAId0a5hruvjJgrdN6Z2lLru/vwu5eHp9rIJkZoojHy5l3Soz6gR5H16SG3iOKiLNoI7VUtk7M6X1O651FG+nAtWs36RbPlkcbGVtPo3bBvQcYWVlRU3cquvIPV/COWcNFmKVDcbk8Ti9B4fruHm18k1qHgK8eGheE/cfFKZISfl8p5zHd1FqCOnij4xSpbM4qi+XIOC6o+7u73Lx6hbG1FQfELS4cSqfE7moJb6yv6nQotmEHCm5g2bBdQptxN+owcP3qNd587XXms4015HULWWHsbW3xqtksu4UbXVVSoOvQI/ua5XGJPFZQRPACN65f58q1K5QSqvOKgGZ7yAOmMe/IUzgBMkgRURP9lRpnFnOhD3McaRiHB3sc7u9haYdtaTIsOOhAT6AAab4ToY8jpSheCz7GMdIQXFNWKZXFwmjLRp0odT6fsr2zw8rDCoL3EPfMAG9B3sokZwzxsCuDg6RQPqZx2NySiwS2Hqpy5swpLl64jck0THidnlMzofVlXk/RoqivvOlpfE++Esw6VWbJIxGZ/nUYuPrGVc6fP8tQahwK8rBnKsJQQ18KlVdoOMV7zDOkrgPM0pkJ5Hwb0BrSjDg726+yc2pr7VWztaxCVArJTMvDAVFBcuxAeBfEV4TZ4v5Fwyq7HNna2aYuW2M5Rglw95xPe6i37qAxlRiXI6LRU6xr9ukxIJuEAtsywxDDe5A3X50DicMl2QeElvxEdIJ4D9FRSqjiLc41egl+JJrPpgo9PVoa97UeyG1sHV86fbAABynXmAhjI6UUwWMATsfCta+NQkWL0ltC9TRPdB1wHxEvSI1z88vjOO2U/DaspTog3pAaJvHm4eW1tvI7x89b/kFcckTtMQonJZjeqeIx9jS5dbY7D3gA5AlcTz2p5ICfaPxWc36dR4El+Gz8ORBP0QqWI8p8iCLCmBg87DVhRUVYzxQwT+0n+kbJF6PEhwSsnBKRNZLSfDZnnKGsAIizUqtbj1leuOo9zyauxsSGlpydEAaG0EsMHeK4gpmnF4C1K1FyzcJhH1kpEgBhNcaoNY5CeE+EJ+SRhnDggCIWZyurFAUNFj1oWGzG1vMX4uLiTknRruehmYBFkhg+G2hGYcHpSkjoWtZcZHXaA4mxsOTQxuMSWM4mVFeb77iPUfczytzTeCDEdCd1tfDSKcMwy95naTkVEGVA8wjbCmCFKFhLpWFrR30nJ5Gq0dMIDiFAyWPVZkGkRSTKegk5P9zysQnqoYV58qMek6sUS8NvgAuTEsCgZ++pg1YGqbTeKWJMJjOGySQ/ceAWvlePQdVUazRsGekehmzJWQUeDysCzUYODhZ5tj3GqO6gtTCbTaNRaETx0zMgAAAEv0lEQVS3e0uUYutJXE/dqYpAyclbwmM8iKm1JUeLEU1vVjgkYzg7mW6kez4MdbHhOUKWPG9PPPsM1oo2ItBBxGkeTfj4sK+/Z7mxVYTZfBY8p0bgjWOcurrlpk/FXAlZiHDxh8BawGOQZ95YjoaWgeqi1DKwubHJD398mWcuvcA4LhhqDejXR1ZVLLyq4b+KGUCco1s5Q2qdJjpTNudbfPSDH2A231kLaJvzKc8890Oevfwi3o3prNL7GJ+SYBZ9C4/FN7sFgbPRlqESNoCIthNbO3zo/Q8w35pj+R7z2ZQfvvgCl57/Eb13ZrOK9THmIi3qNVmeLaWTIrre8FCah0BSwPaJk/zKQw+yuTkPkFIqs81Nnr/8As9d/lGgwxoHccRuGeq897WHeHWaOCxVTh0mq2aLu7O1tcPDD76PnR2hFimYwebGlE985INsbAx8/e++zd8/9hRvHjibO2fIaTe4BM4mD4WmMOaqHO1e49zcOXn6HMNkzsmds3zo/Q9SpcSHzPTG5uYGn/y1DwJL/urvHuOpS8+yLBvMNk7EA/vKu8W6GTqSyAQO3nyDU9sD29unmM5OcPrUWd73wH2gnmXAObEx52Mf/iBtXPI333yUpy49x7JsMtvYZCWveI4GgsxmO8qDQYdvvs6p7fpL9zjP+957Lyd0Fkf63NjanPPxRz6I9SVf+8Y3efrZy/hsh8lkmsGSbhPyBNjKsirhHVjc+Dm3ndliNt9hmG1x/ux5Hrx/QbdlfHCAlkAfk2HGpz76ER55+P381z/5Cn/1vHPHex4KnSklE3LObepIz5cZprx86ZtsXXmC2+54O91gWm7NSFTDYjOOjbOnd/jtL3yWj330Yf7gj77Mj3gnZ++8B/U8+6fCJA/IkGYyRfHJhKf/+k84cfASpy/cQ+/ObDow1BiDuoTE7904sbnBl77wG3z8Vx/iD/7oy7wo7+L8nfegFnanuEeSHy2oWHixJtO8x485feFueoPZbEItJXthHB71bpw4sclvf+GzfOjhB/gPf/xVbp75EJsnT0KLw5/dO6vRMDjDUEBCaH3ua3/I7TvCbOs0vQmz2YxaB0qpKORJJQk8fLRonJjPeeiB91AnU46WjcWyM449Dpa0zkyN7WrMhtgczCku1GGTokMy6hIj0TQ7SH6AQHM4OFxy8exZPnT/vRweLNnbO2L/YMHe/oLF4THVGj52+mKkjUuWi8bRQZwhmUw2k39E1Hm3FeCK6aAIrTt7h0sunj3DBx+4j6ODJbt7x+wdHK/vMViH1mmLJW0cWS4ahwcjvcN0soFKCbIokkQxR7e5Vq07+0dL3nrHHTz0nncz9h7mCWDEGM1oHp9vMrowQZji+bEcE0qdozIhR5Pgwexrz7MdoSll2bCYi6uuPjgl62IMr9maDpycVo5a5+e957nW/EwQDUeHrR0gsiaUq2aHaHiwULw1FscNUcdNmE+FCxM47sbusbF0ZTmOYc1snToZgvfkCBiNQ6jxmV1RQuMUcWH0tCO1zmLREOm4KfOZcH6iHHdn99gYXVm0FoS0NcowpBqwOkYdh1O7xRy+51oV0fgQAC3xkVXWY1BmrMfU3Y3aw8E/9o6ugEPaVMVXx/Dis7f+H0WRAsgcBnwzAAAAAElFTkSuQmCC\"","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu, Modal } from 'antd';\r\nimport { Copy, Cut, Lock, Paste } from '../menuItems';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { CuboidTexture, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableRemoveAllChildren } from '../../../undo/UndoableRemoveAllChildren';\r\nimport CuboidColorSelection from './cuboidColorSelection';\r\nimport CuboidLengthInput from './cuboidLengthInput';\r\nimport CuboidWidthInput from './cuboidWidthInput';\r\nimport CuboidHeightInput from './cuboidHeightInput';\r\nimport CuboidAzimuthInput from './cuboidAzimuthInput';\r\nimport CuboidTextureSelection from './cuboidTextureSelection';\r\nimport { CuboidModel } from '../../../models/CuboidModel';\r\nimport { UndoableAdd } from '../../../undo/UndoableAdd';\r\nimport {\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../../../constants';\r\nimport { ElementCounter } from '../../../stores/ElementCounter';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\n\r\nexport const CuboidMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const countAllOffspringsByType = useStore(Selector.countAllOffspringsByTypeAtOnce);\r\n const removeAllChildElementsByType = useStore(Selector.removeAllChildElementsByType);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const addElement = useStore(Selector.addElement);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const selectedSideIndex = useStore(Selector.selectedSideIndex);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel;\r\n\r\n const [colorDialogVisible, setColorDialogVisible] = useState(false);\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [heightDialogVisible, setHeightDialogVisible] = useState(false);\r\n const [azimuthDialogVisible, setAzimuthDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(cuboid);\r\n const showLabel = useLabelShow(cuboid);\r\n const updateLabelText = useLabelText(cuboid, labelText);\r\n const setLabelFontSize = useLabelFontSize(cuboid);\r\n const setLabelSize = useLabelSize(cuboid);\r\n const setLabelColor = useLabelColor(cuboid);\r\n const setLabelHeight = useLabelHeight(cuboid);\r\n\r\n if (!cuboid) return null;\r\n\r\n const counterUnlocked = cuboid ? countAllOffspringsByType(cuboid.id, false) : new ElementCounter();\r\n const editable = !cuboid?.locked;\r\n const lang = { lng: language };\r\n\r\n const legalToPaste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const e = elementsToPaste[0];\r\n if (\r\n e.type === ObjectType.Human ||\r\n e.type === ObjectType.Tree ||\r\n e.type === ObjectType.Flower ||\r\n e.type === ObjectType.Polygon ||\r\n e.type === ObjectType.Sensor ||\r\n e.type === ObjectType.SolarPanel ||\r\n e.type === ObjectType.Cuboid\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const toggleGroupMaster = () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === cuboid.id) {\r\n (e as CuboidModel).enableGroupMaster = !(e as CuboidModel).enableGroupMaster;\r\n break;\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n };\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n \r\n {editable && }\r\n \r\n\r\n \r\n {\r\n const undoableCheck = {\r\n name: 'Group Master',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n selectedElementId: cuboid.id,\r\n selectedElementType: cuboid.type,\r\n undo: () => toggleGroupMaster(),\r\n redo: () => toggleGroupMaster(),\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n toggleGroupMaster();\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.GroupMaster', { lng: language })}\r\n \r\n \r\n\r\n \r\n {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === cuboid.id) {\r\n const stackable = !(e as CuboidModel).stackable;\r\n (e as CuboidModel).stackable = stackable;\r\n state.actionState.cuboidStackable = stackable;\r\n break;\r\n }\r\n }\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.Stackable', { lng: language })}\r\n \r\n \r\n\r\n {counterUnlocked.gotSome() && (\r\n \r\n {counterUnlocked.sensorCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllSensorsOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.sensorCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Sensors', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Sensor && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Sensor);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllSensorChildren = {\r\n name: 'Remove All Sensors on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllSensorChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllSensorChildren.parentId, ObjectType.Sensor);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllSensorChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedSensors', lang)} ({counterUnlocked.sensorCount}{' '}\r\n {i18n.t('cuboidMenu.Sensors', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.solarPanelCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllSolarPanelsOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.solarPanelModuleCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.SolarPanels', lang) +\r\n ', ' +\r\n counterUnlocked.solarPanelCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Racks', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.SolarPanel && e.parentId === cuboid.id,\r\n );\r\n removeAllChildElementsByType(cuboid.id, ObjectType.SolarPanel);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllSolarPanelChildren = {\r\n name: 'Remove All Solar Panels on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllSolarPanelChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllSolarPanelChildren.parentId,\r\n ObjectType.SolarPanel,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllSolarPanelChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedSolarPanels', lang)}  ({counterUnlocked.solarPanelModuleCount}{' '}\r\n {i18n.t('cuboidMenu.SolarPanels', lang)},{counterUnlocked.solarPanelCount}{' '}\r\n {i18n.t('cuboidMenu.Racks', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.polygonCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllPolygonsOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.polygonCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Polygons', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Polygon && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Polygon);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllPolygonChildren = {\r\n name: 'Remove All Polygons on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllPolygonChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllPolygonChildren.parentId, ObjectType.Polygon);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllPolygonChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedPolygons', lang)} ({counterUnlocked.polygonCount}{' '}\r\n {i18n.t('cuboidMenu.Polygons', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.humanCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllHumansOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.humanCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Humans', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Human && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Human);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllHumanChildren = {\r\n name: 'Remove All Humans on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllHumanChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllHumanChildren.parentId, ObjectType.Human);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllHumanChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedHumans', lang)} ({counterUnlocked.humanCount}{' '}\r\n {i18n.t('cuboidMenu.Humans', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.treeCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllTreesOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.treeCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Trees', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Tree && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Tree);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllTreeChildren = {\r\n name: 'Remove All Trees on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllTreeChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllTreeChildren.parentId, ObjectType.Tree);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllTreeChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedTrees', lang)} ({counterUnlocked.treeCount}{' '}\r\n {i18n.t('cuboidMenu.Trees', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.flowerCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllFlowersOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.flowerCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Flowers', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Flower && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Flower);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllFlowerChildren = {\r\n name: 'Remove All Flowers on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllFlowerChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllFlowerChildren.parentId, ObjectType.Flower);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllFlowerChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedFlowers', lang)} ({counterUnlocked.flowerCount}{' '}\r\n {i18n.t('cuboidMenu.Flowers', lang)})\r\n \r\n )}\r\n \r\n )}\r\n\r\n {editable &&\r\n (!cuboid.textureTypes ||\r\n (selectedSideIndex >= 0 && cuboid.textureTypes[selectedSideIndex] === CuboidTexture.NoTexture)) && (\r\n <>\r\n {colorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Color', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n <>\r\n {textureDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Texture', lang)} ...\r\n \r\n\r\n {lengthDialogVisible && }\r\n {\r\n // no side selection for length\r\n if (useStore.getState().cuboidActionScope === Scope.OnlyThisSide) {\r\n setActionScope(Scope.OnlyThisObject);\r\n }\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {widthDialogVisible && }\r\n {\r\n // no side selection for width\r\n if (useStore.getState().cuboidActionScope === Scope.OnlyThisSide) {\r\n setActionScope(Scope.OnlyThisObject);\r\n }\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {heightDialogVisible && }\r\n {\r\n // no side selection for height\r\n if (useStore.getState().cuboidActionScope === Scope.OnlyThisSide) {\r\n setActionScope(Scope.OnlyThisObject);\r\n }\r\n setApplyCount(0);\r\n setHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Height', lang)} ...\r\n \r\n\r\n {azimuthDialogVisible && }\r\n {\r\n // no side selection for azimuth\r\n if (useStore.getState().cuboidActionScope === Scope.OnlyThisSide) {\r\n setActionScope(Scope.OnlyThisObject);\r\n }\r\n setApplyCount(0);\r\n setAzimuthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Azimuth', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {\r\n if (cuboid) {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.Polygon;\r\n });\r\n const { pos: position } = Util.getWorldDataById(cuboid.id);\r\n let normal;\r\n switch (selectedSideIndex) {\r\n case 0:\r\n normal = UNIT_VECTOR_POS_X;\r\n break;\r\n case 1:\r\n normal = UNIT_VECTOR_NEG_X;\r\n break;\r\n case 2:\r\n normal = UNIT_VECTOR_POS_Y;\r\n break;\r\n case 3:\r\n normal = UNIT_VECTOR_NEG_Y;\r\n break;\r\n default:\r\n normal = UNIT_VECTOR_POS_Z;\r\n position.z = cuboid.lz;\r\n }\r\n const element = addElement(cuboid, position, normal);\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: element,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.AddPolygon', lang)}\r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the cuboid's top surface */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Checkbox, InputNumber, Menu, Modal, Space } from 'antd';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { CompactPicker } from 'react-color';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType } from '../../../types';\r\nimport { Paste } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableRemoveAll } from '../../../undo/UndoableRemoveAll';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { DEFAULT_LEAF_OFF_DAY, DEFAULT_LEAF_OUT_DAY, MONTHS } from '../../../constants';\r\nimport { ElementCounter } from '../../../stores/ElementCounter';\r\n\r\nexport const GroundMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const removeElementsByType = useStore(Selector.removeElementsByType);\r\n const updateElementLockById = useStore(Selector.updateElementLockById);\r\n const updateAllElementLocks = useStore(Selector.updateAllElementLocks);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const latitude = useStore(Selector.world.latitude);\r\n const leafDayOfYear1 = useStore(Selector.world.leafDayOfYear1) ?? DEFAULT_LEAF_OUT_DAY;\r\n const leafDayOfYear2 = useStore(Selector.world.leafDayOfYear2) ?? DEFAULT_LEAF_OFF_DAY;\r\n const monthlyIrradianceLosses = useStore(Selector.world.monthlyIrradianceLosses) ?? new Array(12).fill(0.05);\r\n const albedo = useStore((state) => state.world.ground.albedo);\r\n const groundColor = useStore(Selector.viewState.groundColor);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const waterSurface = useStore(Selector.viewState.waterSurface);\r\n const language = useStore(Selector.language);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n\r\n const lang = { lng: language };\r\n const elementCounter: ElementCounter = useStore.getState().countAllElementsByType(true);\r\n const treeCount = elementCounter.treeCount;\r\n const flowerCount = elementCounter.flowerCount;\r\n const humanCount = elementCounter.humanCount;\r\n const foundationCount = elementCounter.foundationCount;\r\n const cuboidCount = elementCounter.cuboidCount;\r\n const solarPanelCount = elementCounter.solarPanelCount;\r\n const gotSome = elementCounter.gotSome();\r\n\r\n const setWaterSurface = (checked: boolean) => {\r\n setCommonStore((state) => {\r\n state.viewState.waterSurface = checked;\r\n });\r\n };\r\n\r\n const setGroundImage = (checked: boolean) => {\r\n setCommonStore((state) => {\r\n state.viewState.groundImage = checked;\r\n state.viewState.groundImageType = state.viewState.mapType;\r\n });\r\n };\r\n\r\n const setGroundColor = (color: string) => {\r\n setCommonStore((state) => {\r\n state.viewState.groundColor = color;\r\n });\r\n };\r\n\r\n const setAlbedo = (value: number) => {\r\n setCommonStore((state) => {\r\n state.world.ground.albedo = value;\r\n });\r\n };\r\n\r\n const setMonthlyIrradianceLoss = (month: number, value: number) => {\r\n const oldValue = monthlyIrradianceLosses[month];\r\n const newValue = value;\r\n const undoableChange = {\r\n name: 'Set Irradiance Loss in ' + MONTHS[month],\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.world.monthlyIrradianceLosses[month] = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.world.monthlyIrradianceLosses[month] = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n if (!state.world.monthlyIrradianceLosses) state.world.monthlyIrradianceLosses = new Array(12).fill(0.05);\r\n state.world.monthlyIrradianceLosses[month] = newValue as number;\r\n });\r\n };\r\n\r\n const legalToPaste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const e = elementsToPaste[0];\r\n if (\r\n e.type === ObjectType.Human ||\r\n e.type === ObjectType.Tree ||\r\n e.type === ObjectType.Flower ||\r\n e.type === ObjectType.Cuboid ||\r\n e.type === ObjectType.Foundation\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const northHemisphere = latitude > 0;\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n {humanCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllPeople', lang) + ' (' + humanCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore.getState().elements.filter((e) => !e.locked && e.type === ObjectType.Human);\r\n removeElementsByType(ObjectType.Human);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Humans',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Human);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedPeople', lang)} ({humanCount})\r\n \r\n )}\r\n\r\n {treeCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllTrees', lang) + ' (' + treeCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore.getState().elements.filter((e) => !e.locked && e.type === ObjectType.Tree);\r\n removeElementsByType(ObjectType.Tree);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Trees',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Tree);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedTrees', lang)} ({treeCount})\r\n \r\n )}\r\n\r\n {flowerCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllFlowers', lang) + ' (' + flowerCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore.getState().elements.filter((e) => !e.locked && e.type === ObjectType.Flower);\r\n removeElementsByType(ObjectType.Flower);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Flowers',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Flower);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedFlowers', lang)} ({flowerCount})\r\n \r\n )}\r\n\r\n {solarPanelCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllSolarPanels', lang) + ' (' + solarPanelCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.SolarPanel);\r\n removeElementsByType(ObjectType.SolarPanel);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Solar Panels',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.SolarPanel);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedSolarPanels', lang)} ({solarPanelCount})\r\n \r\n )}\r\n\r\n {foundationCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllFoundations', lang) + ' (' + foundationCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Foundation);\r\n removeElementsByType(ObjectType.Foundation);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Foundations',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Foundation);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedFoundations', lang)} ({foundationCount})\r\n \r\n )}\r\n\r\n {cuboidCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllCuboids', lang) + ' (' + cuboidCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore.getState().elements.filter((e) => !e.locked && e.type === ObjectType.Cuboid);\r\n removeElementsByType(ObjectType.Cuboid);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Cuboids',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Cuboid);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedCuboids', lang)} ({cuboidCount})\r\n \r\n )}\r\n\r\n {gotSome && (\r\n {\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n updateAllElementLocks(true);\r\n const undoableLockAllElements = {\r\n name: 'Lock All Elements',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElements.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateAllElementLocks(true);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElements);\r\n }}\r\n >\r\n {i18n.t('groundMenu.LockAllElements', lang)} ({elements.length})\r\n \r\n )}\r\n {!gotSome && elements.length > 0 && (\r\n {\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n updateAllElementLocks(false);\r\n const undoableLockAllElements = {\r\n name: 'Lock All Elements',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: false,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElements.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateAllElementLocks(false);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElements);\r\n }}\r\n >\r\n {i18n.t('groundMenu.UnlockAllElements', lang)} ({elements.length})\r\n \r\n )}\r\n\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Show Ground Image',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n undo: () => {\r\n setGroundImage(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n setGroundImage(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setGroundImage(checked);\r\n }}\r\n >\r\n {i18n.t('groundMenu.ImageOnGround', lang)}\r\n \r\n \r\n\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Water Surface',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n undo: () => {\r\n setWaterSurface(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n setWaterSurface(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setWaterSurface(checked);\r\n }}\r\n >\r\n {i18n.t('groundMenu.WaterSurface', lang)}\r\n \r\n \r\n\r\n {!waterSurface && (\r\n \r\n {\r\n const oldColor = groundColor;\r\n const newColor = colorResult.hex;\r\n const undoableChange = {\r\n name: 'Set Ground Color',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: newColor,\r\n undo: () => {\r\n setGroundColor(undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n setGroundColor(undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setGroundColor(newColor);\r\n }}\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {\r\n const oldDay = leafDayOfYear1;\r\n const newDay = value;\r\n const undoableChange = {\r\n name: 'Set Leaf Day 1',\r\n timestamp: Date.now(),\r\n oldValue: oldDay,\r\n newValue: newDay,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear1 = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear1 = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear1 = newDay as number;\r\n });\r\n }}\r\n />\r\n \r\n \r\n {\r\n const oldDay = leafDayOfYear2;\r\n const newDay = value;\r\n const undoableChange = {\r\n name: 'Set Leaf Day 2',\r\n timestamp: Date.now(),\r\n oldValue: oldDay,\r\n newValue: newDay,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear2 = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear2 = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear2 = newDay as number;\r\n });\r\n }}\r\n />\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {i18n.t('month.January', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[0]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(0, value);\r\n }}\r\n />\r\n {i18n.t('month.February', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[1]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(1, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.March', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[2]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(2, value);\r\n }}\r\n />\r\n {i18n.t('month.April', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[3]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(3, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.May', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[4]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(4, value);\r\n }}\r\n />\r\n {i18n.t('month.June', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[5]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(5, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.July', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[6]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(6, value);\r\n }}\r\n />\r\n {i18n.t('month.August', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[7]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(7, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.September', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[8]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(8, value);\r\n }}\r\n />\r\n {i18n.t('month.October', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[9]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(9, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.November', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[10]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(10, value);\r\n }}\r\n />\r\n {i18n.t('month.December', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[11]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(11, value);\r\n }}\r\n />\r\n \r\n \r\n \r\n\r\n \r\n \r\n {i18n.t('groundMenu.Albedo', lang)}:\r\n {\r\n if (value) {\r\n const oldAlbedo = albedo;\r\n const newAlbedo = value;\r\n const undoableChange = {\r\n name: 'Set Ground Albedo',\r\n timestamp: Date.now(),\r\n oldValue: oldAlbedo,\r\n newValue: newAlbedo,\r\n undo: () => {\r\n setAlbedo(undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n setAlbedo(undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setAlbedo(newAlbedo);\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n});\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport JaahImage from '../../../resources/jaah.png';\nimport JackImage from '../../../resources/jack.png';\nimport JacobImage from '../../../resources/jacob.png';\nimport JacquelineImage from '../../../resources/jacqueline.png';\nimport JadeImage from '../../../resources/jade.png';\nimport JameliaImage from '../../../resources/jamelia.png';\nimport JamesImage from '../../../resources/james.png';\nimport JaneImage from '../../../resources/jane.png';\nimport JayaImage from '../../../resources/jaya.png';\nimport JayeImage from '../../../resources/jaye.png';\nimport JeanetteImage from '../../../resources/jeanette.png';\nimport JediImage from '../../../resources/jedi.png';\nimport JeffImage from '../../../resources/jeff.png';\nimport JenaImage from '../../../resources/jena.png';\nimport JenniferImage from '../../../resources/jennifer.png';\nimport JessImage from '../../../resources/jess.png';\nimport JettImage from '../../../resources/jett.png';\nimport JillImage from '../../../resources/jill.png';\nimport JiyaImage from '../../../resources/jiya.png';\nimport JoanImage from '../../../resources/joan.png';\nimport JocelynImage from '../../../resources/jocelyn.png';\nimport JoelImage from '../../../resources/joel.png';\nimport JoeyImage from '../../../resources/joey.png';\nimport JohnImage from '../../../resources/john.png';\nimport JonathonImage from '../../../resources/jonathon.png';\nimport JoseImage from '../../../resources/jose.png';\nimport JosephImage from '../../../resources/joseph.png';\nimport JoshuaImage from '../../../resources/joshua.png';\nimport JuddImage from '../../../resources/judd.png';\nimport JudyImage from '../../../resources/judy.png';\nimport JuliaImage from '../../../resources/julia.png';\nimport JulioImage from '../../../resources/julio.png';\nimport JumapiliImage from '../../../resources/jumapili.png';\nimport JuneImage from '../../../resources/june.png';\nimport JuroImage from '../../../resources/juro.png';\nimport JustinImage from '../../../resources/justin.png';\n\nimport React, { useState } from 'react';\nimport { Select } from 'antd';\nimport { HumanName, ObjectType } from '../../../types';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { HumanModel } from '../../../models/HumanModel';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport i18n from '../../../i18n/i18n';\nimport { HumanData } from '../../../HumanData';\n\nconst { Option } = Select;\n\nconst HumanSelection = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const human = useStore.getState().getSelectedElement() as HumanModel;\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const lang = { lng: language };\n\n const updateHumanNameById = (id: string, name: HumanName) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Human && e.id === id) {\n const human = e as HumanModel;\n human.name = name;\n human.lx = HumanData.fetchWidth(name);\n human.lz = HumanData.fetchHeight(name);\n break;\n }\n }\n });\n };\n\n return (\n {\n if (human) {\n const oldPerson = human.name;\n if (oldPerson !== value) {\n const undoableChange = {\n name: 'Change People',\n timestamp: Date.now(),\n oldValue: oldPerson,\n newValue: value,\n changedElementId: human.id,\n changedElementType: human.type,\n undo: () => {\n updateHumanNameById(undoableChange.changedElementId, undoableChange.oldValue as HumanName);\n },\n redo: () => {\n updateHumanNameById(undoableChange.changedElementId, undoableChange.newValue as HumanName);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateHumanNameById(human.id, value);\n setCommonStore((state) => {\n state.actionState.humanName = value;\n });\n setUpdateFlag(!updateFlag);\n }\n }\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default HumanSelection;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Checkbox, Menu, Space } from 'antd';\r\nimport HumanSelection from './humanSelection';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HumanModel } from '../../../models/HumanModel';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { useRefStore } from '../../../stores/commonRef';\r\nimport { Easing, Tween, update } from '@tweenjs/tween.js';\r\nimport { Util } from '../../../Util';\r\nimport { ObjectType } from '../../../types';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const HumanMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const getParent = useStore(Selector.getParent);\r\n const selectNone = useStore(Selector.selectNone);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const human = useSelectedElement(ObjectType.Human) as HumanModel | undefined;\r\n\r\n const [animationFlag, setAnimationFlag] = useState(false);\r\n\r\n const editable = !human?.locked;\r\n const requestRef = useRef(0);\r\n const previousFrameTime = useRef(-1);\r\n const firstCall = useRef(true);\r\n const animateMove = useRef(false);\r\n\r\n useEffect(() => {\r\n if (animateMove.current) {\r\n if (firstCall.current) {\r\n requestRef.current = requestAnimationFrame(animate);\r\n tween();\r\n return () => {\r\n cancelAnimationFrame(requestRef.current);\r\n };\r\n } else {\r\n firstCall.current = true;\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [animationFlag]);\r\n\r\n const updateHumanFlipById = (id: string, yes: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Human && e.id === id) {\r\n const human = e as HumanModel;\r\n human.flip = yes;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateHumanObserverById = (id: string, yes: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Human && e.id === id) {\r\n (e as HumanModel).observer = yes;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const moveCamera = (x: number, y: number, z: number) => {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n orbitControlsRef.current.object.position.set(x, y, z);\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n const v = state.viewState;\r\n v.cameraPosition = [x, y, z];\r\n });\r\n }\r\n };\r\n\r\n const animate = () => {\r\n requestAnimationFrame(animate);\r\n const currentFrameTime = Date.now();\r\n if (currentFrameTime - previousFrameTime.current > 100) {\r\n update();\r\n previousFrameTime.current = currentFrameTime;\r\n }\r\n };\r\n\r\n const tween = () => {\r\n if (!human) return;\r\n let x = human.cx;\r\n let y = human.cy;\r\n let z = human.cz + human.lz;\r\n const parent = getParent(human);\r\n if (parent) {\r\n const v = Util.absoluteHumanOrTreeCoordinates(x, y, z, parent);\r\n x = v.x;\r\n y = v.y;\r\n z = v.z;\r\n }\r\n const cam = useStore.getState().cameraDirection.clone().normalize().multiplyScalar(0.5);\r\n x += cam.x;\r\n y += cam.y;\r\n const originalPosition = [...useStore.getState().viewState.cameraPosition];\r\n new Tween(originalPosition)\r\n .to([x, y, z], 1000)\r\n .easing(Easing.Quadratic.In)\r\n .onUpdate((d) => {\r\n moveCamera(d[0], d[1], d[2]);\r\n })\r\n .onComplete(() => {\r\n selectNone();\r\n })\r\n .start();\r\n };\r\n\r\n if (!human) return null;\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {editable && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Set Observer',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: human.id,\r\n selectedElementType: ObjectType.Human,\r\n undo: () => {\r\n updateHumanObserverById(human.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateHumanObserverById(human.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateHumanObserverById(human.id, checked);\r\n }}\r\n >\r\n {i18n.t('peopleMenu.Observer', { lng: language })}\r\n \r\n \r\n )}\r\n {!orthographic && (\r\n {\r\n setAnimationFlag(!animationFlag);\r\n animateMove.current = true;\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('peopleMenu.ViewFromThisPerson', { lng: language })}\r\n \r\n )}\r\n {editable && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Flip Human',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: human.id,\r\n selectedElementType: ObjectType.Human,\r\n undo: () => {\r\n updateHumanFlipById(human.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateHumanFlipById(human.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateHumanFlipById(human.id, checked);\r\n }}\r\n >\r\n {i18n.t('peopleMenu.Flip', { lng: language })}\r\n \r\n \r\n )}\r\n {editable && (\r\n \r\n \r\n {i18n.t('peopleMenu.ChangePerson', { lng: language })}: \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport { Select } from 'antd';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { FlowerType, ObjectType } from '../../../types';\nimport BellflowerImage from '../../../resources/bellflower.png';\nimport BoxwoodImage from '../../../resources/boxwood.png';\nimport CactusCombo1Image from '../../../resources/cactus_combo_1.png';\nimport CactusCombo2Image from '../../../resources/cactus_combo_2.png';\nimport CactusCombo3Image from '../../../resources/cactus_combo_3.png';\nimport CactusCombo4Image from '../../../resources/cactus_combo_4.png';\nimport HibiscusImage from '../../../resources/hibiscus.png';\nimport HydrangeaImage from '../../../resources/hydrangea.png';\nimport HostaImage from '../../../resources/hosta.png';\nimport PeonyImage from '../../../resources/peony.png';\nimport RedRoseImage from '../../../resources/red_rose.png';\nimport SpireaImage from '../../../resources/spirea.png';\nimport SunflowerImage from '../../../resources/sunflower.png';\nimport TallBushImage from '../../../resources/tall_bush.png';\nimport TulipImage from '../../../resources/tulip.png';\nimport WhiteFlowerImage from '../../../resources/white_flower.png';\nimport YellowFlowerImage from '../../../resources/yellow_flower.png';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport i18n from '../../../i18n/i18n';\nimport { FlowerModel } from '../../../models/FlowerModel';\nimport { FlowerData } from '../../../FlowerData';\n\nconst { Option } = Select;\n\nconst FlowerSelection = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const flower = useStore.getState().getSelectedElement() as FlowerModel;\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const lang = { lng: language };\n\n const updateFlowerTypeById = (id: string, type: FlowerType) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Flower && e.id === id) {\n const flower = e as FlowerModel;\n flower.name = type;\n flower.lx = FlowerData.fetchSpread(type);\n flower.lz = FlowerData.fetchHeight(type);\n break;\n }\n }\n });\n };\n\n return (\n {\n if (flower) {\n const oldFlower = flower.name;\n if (oldFlower !== value) {\n const undoableChange = {\n name: 'Change Flower',\n timestamp: Date.now(),\n oldValue: oldFlower,\n newValue: value,\n changedElementId: flower.id,\n changedElementType: flower.type,\n undo: () => {\n updateFlowerTypeById(undoableChange.changedElementId, undoableChange.oldValue as FlowerType);\n },\n redo: () => {\n updateFlowerTypeById(undoableChange.changedElementId, undoableChange.newValue as FlowerType);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateFlowerTypeById(flower.id, value);\n setCommonStore((state) => {\n state.actionState.flowerType = value;\n });\n setUpdateFlag(!updateFlag);\n }\n }\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default FlowerSelection;\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Checkbox, Menu, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { FlowerModel } from '../../../models/FlowerModel';\r\nimport FlowerSelection from './flowerSelection';\r\nimport { ObjectType } from '../../../types';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const FlowerMenu = () => {\r\n const flower = useSelectedElement(ObjectType.Flower) as FlowerModel | undefined;\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n if (!flower) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !flower?.locked;\r\n\r\n const updateFlowerFlipById = (id: string, flip: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Flower && e.id === id) {\r\n (e as FlowerModel).flip = flip;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n\r\n {editable && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Flip Flower',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: flower.id,\r\n selectedElementType: ObjectType.Flower,\r\n undo: () => {\r\n updateFlowerFlipById(flower.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateFlowerFlipById(flower.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateFlowerFlipById(flower.id, checked);\r\n }}\r\n >\r\n {i18n.t('flowerMenu.Flip', { lng: language })}\r\n \r\n \r\n )}\r\n\r\n {/* have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n {editable && (\r\n \r\n \r\n {i18n.t('flowerMenu.Type', lang)}: \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonLineColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const updateElementLineColorById = useStore(Selector.updateElementLineColorById);\r\n const updateElementLineColorOnSurface = useStore(Selector.updateElementLineColorOnSurface);\r\n const updateElementLineColorAboveFoundation = useStore(Selector.updateElementLineColorAboveFoundation);\r\n const updateElementLineColorForAll = useStore(Selector.updateElementLineColorForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(polygon?.lineColor ?? 'black');\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (color: string) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (color !== e.lineColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n if (color !== e.lineColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if (e.lineColor !== color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon?.foundationId && !e.locked) {\r\n if (e.lineColor !== color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== polygon?.lineColor) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).lineColor = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, elem.lineColor ?? 'black');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Line Color for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeSelected.oldValues.entries()) {\r\n updateElementLineColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldColorsAll.set(elem.id, elem.lineColor ?? 'black');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Line Color for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAll.oldValues.entries()) {\r\n updateElementLineColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateElementLineColorForAll(ObjectType.Polygon, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementLineColorForAll(ObjectType.Polygon, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldLineColorsOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldLineColorsOnSurface.set(elem.id, elem.lineColor ?? 'gray');\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Line Color for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLineColorsOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, lc] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateElementLineColorById(id, lc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateElementLineColorOnSurface(\r\n ObjectType.Polygon,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateElementLineColorOnSurface(ObjectType.Polygon, polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldLineColorsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldLineColorsAboveFoundation.set(elem.id, elem.lineColor ?? 'black');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Line Color for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLineColorsAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, lc] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateElementLineColorById(id, lc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateElementLineColorAboveFoundation(\r\n ObjectType.Polygon,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateElementLineColorAboveFoundation(ObjectType.Polygon, polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldColor = p ? p.lineColor : polygon.lineColor;\r\n const undoableChange = {\r\n name: 'Set Line Color of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updateElementLineColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateElementLineColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLineColorById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonLineColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonFillColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const updateElementFillColorById = useStore(Selector.updateElementColorById);\r\n const updateElementFillColorOnSurface = useStore(Selector.updateElementColorOnSurface);\r\n const updateElementFillColorAboveFoundation = useStore(Selector.updateElementColorAboveFoundation);\r\n const updateElementFillColorForAll = useStore(Selector.updateElementColorForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(polygon?.color ?? 'gray');\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (color: string) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (color !== e.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n if (color !== e.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon.foundationId && !e.locked) {\r\n if (e.color !== color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if (e.color !== color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== polygon.color) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).color = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, elem.color ?? 'gray');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Fill Color for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeSelected.oldValues.entries()) {\r\n updateElementFillColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldColorsAll.set(elem.id, elem.color ?? 'gray');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Fill Color for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAll.oldValues.entries()) {\r\n updateElementFillColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateElementFillColorForAll(ObjectType.Polygon, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementFillColorForAll(ObjectType.Polygon, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldFillColorsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldFillColorsAboveFoundation.set(elem.id, elem.color ?? 'gray');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Fill Color for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldFillColorsAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, lc] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateElementFillColorById(id, lc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateElementFillColorAboveFoundation(\r\n ObjectType.Polygon,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateElementFillColorAboveFoundation(ObjectType.Polygon, polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldFillColorsOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldFillColorsOnSurface.set(elem.id, elem.color ?? 'gray');\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Fill Color for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldFillColorsOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, lc] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateElementFillColorById(id, lc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateElementFillColorOnSurface(\r\n ObjectType.Polygon,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateElementFillColorOnSurface(ObjectType.Polygon, polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldColor = p ? p.color : polygon.color;\r\n const undoableChange = {\r\n name: 'Set Fill Color of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updateElementFillColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateElementFillColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementFillColorById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonFillColorSelection;\r\n","export default __webpack_public_path__ + \"static/media/polygon_08_menu.e9d3ae98.png\";","export default __webpack_public_path__ + \"static/media/polygon_10_menu.e1254bdd.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport Polygon_Texture_01_Menu from '../../../resources/foundation_01_menu.png';\r\nimport Polygon_Texture_02_Menu from '../../../resources/foundation_02_menu.png';\r\nimport Polygon_Texture_03_Menu from '../../../resources/foundation_03_menu.png';\r\nimport Polygon_Texture_04_Menu from '../../../resources/foundation_04_menu.png';\r\nimport Polygon_Texture_05_Menu from '../../../resources/foundation_05_menu.png';\r\nimport Polygon_Texture_06_Menu from '../../../resources/foundation_06_menu.png';\r\nimport Polygon_Texture_07_Menu from '../../../resources/foundation_07_menu.png';\r\nimport Polygon_Texture_08_Menu from '../../../resources/polygon_08_menu.png';\r\nimport Polygon_Texture_09_Menu from '../../../resources/polygon_09_menu.png';\r\nimport Polygon_Texture_10_Menu from '../../../resources/polygon_10_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, PolygonTexture, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(\r\n polygon?.textureType ?? PolygonTexture.NoTexture,\r\n );\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updatePolygonTextureById = (id: string, texture: PolygonTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Polygon && !e.locked) {\r\n (e as PolygonModel).textureType = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonTextureOnSurface = (parentId: string, normal: number[] | undefined, texture: PolygonTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === parentId &&\r\n Util.isIdentical(e.normal, normal) &&\r\n !e.locked\r\n ) {\r\n (e as PolygonModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonTextureAboveFoundation = (foundationId: string, texture: PolygonTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === foundationId && !e.locked) {\r\n (e as PolygonModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonTextureForAll = (texture: PolygonTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n (e as PolygonModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (texture: PolygonTexture) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const polygon = e as PolygonModel;\r\n if (texture !== polygon.textureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n const polygon = e as PolygonModel;\r\n if (texture !== polygon.textureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if ((e as PolygonModel).textureType !== texture) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon.foundationId && !e.locked) {\r\n if ((e as PolygonModel).textureType !== texture) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (texture !== polygon?.textureType) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: PolygonTexture) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).textureType = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setTexture = (value: PolygonTexture) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTexturesSelected.set(elem.id, (elem as PolygonModel).textureType ?? PolygonTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeSelected.oldValues.entries()) {\r\n updatePolygonTextureById(id, texture as PolygonTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as PolygonTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldTexturesAll.set(elem.id, (elem as PolygonModel).textureType ?? PolygonTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeAll.oldValues.entries()) {\r\n updatePolygonTextureById(id, texture as PolygonTexture);\r\n }\r\n },\r\n redo: () => {\r\n updatePolygonTextureForAll(undoableChangeAll.newValue as PolygonTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePolygonTextureForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldTexturesOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldTexturesOnSurface.set(elem.id, (elem as PolygonModel).textureType ?? PolygonTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Texture for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, tx] of undoableChangeOnSurface.oldValues.entries()) {\r\n updatePolygonTextureById(id, tx as PolygonTexture);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updatePolygonTextureOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as PolygonTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updatePolygonTextureOnSurface(polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldTexturesAboveFoundation.set(elem.id, (elem as PolygonModel).textureType ?? PolygonTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Texture for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, tx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePolygonTextureById(id, tx as PolygonTexture);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePolygonTextureAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as PolygonTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePolygonTextureAboveFoundation(polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldTexture = p ? p.textureType : polygon.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updatePolygonTextureById(undoableChange.changedElementId, undoableChange.oldValue as PolygonTexture);\r\n },\r\n redo: () => {\r\n updatePolygonTextureById(undoableChange.changedElementId, undoableChange.newValue as PolygonTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePolygonTextureById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonTextureSelection;\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QwbFCQS0cuGTAAAIABJREFUeJxlnM2ObEmylT8zd997R0Tm+amqvtV9udwLCBA/YoDEUyCeAYkxEjPegBlTXoABUx6ACW+AmIMucOnbXd11quqczIzYP+5uxsA8okriSKVzMitzh4e7udmytZaFfHxa3Jz//487ovL4UpDxbUdEEInvgj++h9x/Cro5fn/O+FkHkgiO//w8HHce34vH6ON1zezx+/H/hfuLCGD35dr9deJ34tnjdf3nr7IqKSdAMOvj9YRujlgnp/g3v/hdx3+xBlAB8/F0gW73d8djDT9/B8zGHqWCCpSkIEJtnWaGm2PuiCj5P/zrf07rHRkPczMQJZdCrZ0kTioTSMZ6w3EQofVxHFbjjWlsmGrCHNa9skyJnBQR0JTp3Wm9Y+aoaixZlKNWrDdKUlQEd6eZowqKIKqUUsi5gAi99zgOUUxSbGKtsUki7EfDEcw9NlcEFcHMUBEOc9wMcSPlTGsdFaA3lEZWR0XJSUmquBvdHfN4jmpCVcGNbtCkUOuBe8cswkQxQNCkmDnmME3L+H1QTdTeqN049oOUMqe5kH/9fqYj1O4kucc8dJcRdYKIR0RRAKd1wx1KEvYWUSQ4qpmUYuG/+nAeUegoHXBSUrYjPaIMEVSVoybM46YkcSCi5R6oIrEq8RabjI/NhiJCQkkaGyEC58tE652kGUQeG+UkWu8AzDnTOty2HSkwl0TWCZUJEchJcDOmktFxE82ge6wnadzio8bh69OJo3lsPpBxVOPraUokTXhvmFkEgzqlJIRM0olujgrkn952Uim01mndyApJobVOLpluQlIhJaGP6+USV64dTvM4EFVBeofulJxpvfGHn66Yw4fzjFnHBdzkkcacSA/NOioaaUMiranGIXQDHemw9Qb+c0rxkbY0KaqJkuJ3Sm44Su2dnEcApEijU8mIx/VOapwmRQVqbbzu8fqGcCoJxWnWUBGmHO+zNqdkYT0a5gLeSapse6W2e/qFLrGPjnB7reTx79YNVaEkY+odTQlVISfFzMh7B6wionSPVLRohpzYO7h1NGXWagiQNCEp0QxQJ4+NTCoIzl47dW9cZuWrd2due+d1rUw5NrI7j+jq1jlq5PGU4jYJcG0tcm1JqOg4GItoK8JcImWUknAftzsJJUV6c4fajVzSWFcepzfSVEo4oDmBKHgnA3sfa0FxIGel5AgOc8b6HSwC0sxwF9yi7k3TqB3WyTp+D4nDEKXWihPp62gOJMQdwUgaaTNv1ZhKwt1GnhVerhsiME8ZEWU/Ro1QZW8OrSKqHLWTx5tr4tTaqT1qUckTR+283mrkYBMcISljcwFxNMUG2qgZiDKJUHLUmNpHsctK7wIOphE83mEqCfGOOTQHrx1VHblaqc1BwLrRWhsH3zGPtcdJKd0dUXsUbtypHWr3x030UUfaUcmj3nVzcKfk+9cGLmw10qd5/Nes0pqRkpIQRIXmQq8WQdOdpJBFhWZx1bJCd2frRqvG3o3LXMaVjjfmbuCOSywed7JG4UIVsfECSdluB4Yx54RooBEdKKZaJ6lEVJSCjBrz+CPxBpNHmkQCYcmIVlVFU6J2C6TljvcAC04U8+3WyaocbazZHekDuXGPUkZAdCKehd6NDaHWSsmZnIQpKyUrrXZw2A6Lg4qTorkG6usewa1C7yMjJCWrMBdFNWozgLlgbrhFmsaVjFncWofaGPBLQJVmwu2INyUKU1YcpfVObxab04wuccvEIKVEybEYREiaMBEUUOUBmeepDBQjiKZAJQNhiSpmsUkRlaNWqGISNU1VkZSjvrTKUQ1wsgyAKwISBTYQIKgE4jMLBBUFXjHrVFdabXSHvRsJQSXR3al7xz0P+CvMOVHcOKqhI4juIB71CKSUqNLJI7BKydRugJHSQF+uqMeaSlKaQW4OYrEROSmKkDHIAVGdzHY0zkumW6fkQAy4U4o+liIi5Pxzv5KSkEToYuSUWaa4aX6/Cf64YHQzck6BmnTcAgNImNkjkgLJJRyPA2g1iqhE6jI3FCdpImVlsni9erTobUYvkTSi9p4ucypY7/SubHtDd6PkxGFwNON1rbwX+HLrPJ9nlgG9RaIQt+4PeOwDha1HIymUwjgqJedEaz2ygwgq+gjSNlqBPNqxQARmgaCAo3V6N9wOzJ3bbvEAEXz0HL1H8zhNBTNjyilyJ5BTwL29dmoz3A/OyxSpSPMokpGOXq4HJae4PQRi8wEg7jUHgSRx5bsxYK6Q0mgk3end6A5H3RGJHkIUWu+UFJth5sxTjttCgIGkjqtCmfjwvPDHT284TjOj9cbptPDh3YkvL28sRVlKYhsXIqfEVITWbKwn9m926G4BiVVoLYrrvairGWlK/NyVC9YbOevYAFc0RXEtUx7fGwdjRsmZKSdue0UsolxUmEogmKwRNUUjN67bDijuTm2dpIW9Gq0bc+mklB5d99NpRgRq64+DSinRrYOPN9QjtW5bJ2cdGxD1yv3nLt3NsW64ONu+D9js9BwF3M046PRWyUmQrLgJU84sc0FzhrxTj0pKwq8/nFFNvKyVpWTMnOtWH/2aDUBy2yu19XEbHLfIOD76F5FoB9wNEYkbPTp0R8hp1OPnc6H3kWvl3n16QNgjOsk6rmTvHesWBTVHvUgCKTFyvo1230kiHLXR2sEyTWQV9v0gpQTEJo0fJeU4OE8/X+OU0kBecRvPS3y/1h6NmQiaMgCtR5NVa8Mk8nrvhokgGmu3btTWKDlRUqJkJefR/I4N2avx+vmF2hqfbwffXAKWFjHeLUptRPrTeL8O9B4HoaJkhVIyJStlpMNSMjkHY9HNaa1ztIYgHEeNHkTAatSnbEb0FDhHPQLGulNSIp+VlCLtlAQlJ768HZQsLNPPEbdVY68tKI8eXbh7dMFTySQc8c55UuYpcZoL6GgERwFurVM08nxEEuQSzZ2ZxaIN8IDMkcriNqiAN6cd+4DusXG9G7UFZMcDDSU1eu+4dVoNcGDeebsdbHvl0+tKSUrJmedlZspx+wONGtYTOSfmkkYwGPtRWbeKpNEiCJymFE2gGOpCq52koHgccgLXgW6zokmozci1RzpIKpxPC0rk59/8+mvUGp9fr9y2g5drXH/z4Hn2GhRHdwJfayJnZZqEL28rrTvLsvAXv/7IlJwvb7e4Ra3xedtJSSMNPfB99Bt769SjwSjsrUdtqj2uulvHBuLqPbrkO3mnGkiq1o4x+geR0Vs4RRVLmW3bcTe2eiccYw9qa5xy4jQlfvV+oeRINS6RmmcRjmaYdbpHw2ounC8Lp2ViP+IGYoGk7n2XiKMj9bobc1b66Ppra6y7k9UDeZZkd852JDtj3zv/6//8jndPZ776cIZUeNuMOTuX5RR9SY+CvNVGtc40Fd6dC7e9YeacprjC3/3whXfnwtNpGbewcVqmuOYaEdxaIyeldierkEpib52lCKnoYImDX+pdmUrcTrMo8oHaoq4lhdqM1qLPKSUH79WjKSspNrJ1491ZH4TjlFNwdmMb3DqtRcPXutPXA3fYamc7Oj9cX5hLYRJjKkrOmXkquAtIMAmXOUVRl+j4p6K05rze9iBI3VnXnctScB9p7y++fc/RYqOSxom2Gm38fjRefvqCITxPwSdNJfH+Mo8iqhwtmOJlzrTW+OHLysc/+8hlSdQWdEfEqtG7cyqJkhPu+iiIbjN3epwR6VNKHK0z5RQpqDdAOc3xxpt50Doa9eeowU+dpoymaODqSGdpFNfWLGC0BUMw5YT1YHLfnSeSELUH4XoEOnxa4rWaBbPLdeNUMu8v04DmPmgho6ROtwgIa8LeWlA5QM+JLBNJhMtSSDrj58Z+UkoSWoubnv/rf/8/g8ZQVJ0pa1ypHkW398521MG8Bj2iqoHjB0pSFFF9LDonIY+FBCusIyXdU03ASeuB4NwjIu+MbxYGkvIH0xvPkoCFgEgCLNCdOTkFBBWJIn+XFLg3lqMhdVHc5XFr3GGZ4ta15pj1QdEPKDrWNFAutYN5f2g2cwn6390AvSNYrBuSlKyKMvpUCeBTe6TY3hrdOjI0FwXk/eXkTkTRlFMURSe4GY3rfafLfbxkQDkf5BqPDQtKYjCeg/VMY8O4Czki5JzjhkWVfkDIPKA24806/tAS7hsjEKLOqDmqcRBpiGn3Tl8lSMycQpmoR6O2Hiv9xSbbWOh9/XGXg30tKZq5kqMRDjonfrdZrK31AAlmkRIvpznWMJ5ndme2403e6+W9ZgZjkdiPynY05D//u3/pMnLqVo3eOvU4eD4VDOW2HaOzTaRB+u1Ho/Uo6uvhzCUauqPWiODBPblHCqg9aJa7EJRSgVQQIhrb+JkpR92pHUwzSjR6TmxEUsiauJwyc1HmLI+1uEQAZfEHvWMO85T4cq0ctUexl3gvKpDHod/7HBsq59N55nIq4M7R4nnrXvn4NA8SMTJENee6NtajUmvjshTOc2bbo9HtvcW+7i0CUSVIUYT5dOLjuycSxst1H8qnkbMf9NZYbwefr22kLsVsJw36GFI0Yg7vckKSUhSWKfH+OYpxN2M+TYjoaPCEKUX6WAR6M/COjBth7qSUQzsZ0uxRA+k8L0GluwmtO0ZwYVMSDjOkd261cfNgVF9ux4Pah2CuT3NhLkprlUlgWRQ9J7o585RQlO1oHP0XpOaI7G6NL18OWus/y7+iXJPz66+f2W8rP35eyaUwJ+F8SujzMvao8bREsCSdI6sMfcd6H3xY5o8/Xfnx08o8F7JG6rNeyd9/3kMhyxPv3k3A/ZfbQB5CM6HWhoiPtCQ4xrYfUVtEfoGCOurOkjQKnRAIyke/wNhsgszEO72HVIvBnIQpCZM6e7fIxap0hOsxJFOrKLBMQtHEh8scyIo7asoRRsEv4jj70cfGO94V82PAKWHbjWYeTMNo6jQlZhGWOdSRnEL/4Fipx47iLDkaruM4kGOn9SAc+5ASyjhoJUS07Wise6OZc15mlnni9vbKy9vKtCxczgv5tBRqDa08aWKrjV6DLtbuTMlZslJSxlw4WicrocRJxs2wQZ28rpWkGlq6Qs5BNSASRVejSNfWuB2h3ZvB1owkGnhfYdvBsjyUwq0O4lNgmQdHMsKiDbr/NOcRPMFhRepztiNk36RD2yewf0kJFeeUCDWQhHclaaiU21GpvXPUgMRPp8zeOt992TEXcsrcDkM0UKB51BTNmSXnIQPca19wfrNmliVqkPXOjz/9RO3Ch/fvUAkSNN+2AxVn0sReG9ahtUZ1oyps4/13l+jGcSTuIae5YN0oKbFMQpa4BdaMdbC5IXMaKs5u0AfFu1XHMYpGKlKV0fjFjUhJyPFCpOQ8zcp1twc3BbAdnSk7GHT/mTdTVTbiGXOKw2u9oR7UkIgig145mlGHHiQy8ntRzsvEMiVElXpUlhJs7noEo+CtcxjUu+ECeThgVumUFHSMalAytdbIK+Zse6W7sJwW3l0K+7bydDkFIzFnZcoh2rtVUlKelkJJwmmOAuZugfO9xI0YJPtUEre9EUhU8JQ4hg4yl6DYW+9UUwxHE0yjaC+SSOLoEJO6WwhdQ/AxC2rBWhCM1+1gbwQJKsGniTjuSirB3B4NlrmMjt9oBpISJUHKQu/QTZEU2sxpyTyPPsaHLtRaHFLv8MNPG9UCWDwvwUn1SECkkkhmpFIe/BUWbALuHN2oR+W6Vo7aHj3Z82Xh218903sNANUbl8uZl1ultUrem7G34GkEp1vH9kaW2MygtIWSU3A5QyhUkWHbCfdJSgkZubZ147p3nqaB45uHPpGEWju33TENb5QiLJOSCV3+sgSXllQ5TYk9J9YWB/R+YghLgbh6l4jcYblx62BOR0k4pyIRtx5KHua0GpH9igx2Vu8taQhFJTOXTBLnw/MUEF2V27oHx4fjvY9nRk9xbEFQHt2GJyzYAxsIcZ4Kl0UpU6G2yrbvAfc1MWXh7bYhCKfzmXyaEufTNLpFG9p1UA+XpYR1pwa90fqQY0U4OhSN6MEt/FMYR4ftcFzgh2sDCTeIHoGWSi58vYRMigqZ0aBB0PPC0Kkb+w63wzi6R6M6blPthhNvWAkNxyzSaM6KEPSNeBxyTiEVdxdKykM8U1Dj+ZTBjakE8xsavMdamqEp0uTbekQ9HHVBNJTL3p15mZhL4jScL0WF2hvXzQa97hzd2d5uPF0WLqeZo3Ze3lZKFn711TvW9eCHlxv5y+uNfd+DLh66eB/c8rruJHVe18a6d+aSSGm4U1pg9qmkATcDQS1TCsErC18teeRw6M1JycE7t8152yKVVYsmMw1GVdZozXT0B71HkKRheniaUzRsKVKpcL+t0SBmjSJau7Eeoa0I4TnbWsir++C6zOG6xt+6/ax8BlcmpJRDwu3G03niNEXjPE+F3g7yYKVra6yHcdt3rt2pFqDn/XliykLrncscRsHb3vju+5+Yp4lvv35P7cbb9YZr5h/93T8jI5lqgXACqUARfXA8tTvLeeLpWR83AYxlSpgo4oZ4bB53mGnG69rY1sZLN2oTNKWHQqg5U3LhuSTeL86kRrNAYgDnZWZKIG68rAkGjGw9hJ9Ox6yh1libU13oqtyqc92ja27m5JxD7NLo5JcpZN4pJ86nRFHorY+bq9Ta2Jtz3Q6OGgjusmQ+nAJG91b56VYHUuysdUi9HcpU+Op55um8UFLIAsd+sG+Nt63x+hLGh9ve+fZX7/mTj098+nzl9XrQRPkbXz3z5fWN/E/+zteDArGHZ7X1Yemp9dFpJyIS2uC4rjVx9NCCswq3Y1xnZDgSw2z2NIWIlBXKKMQ5QAnrcXDs4UDZW6ShKSvraPSue2dvzl6d5sNTO3J+G2vSFOQc4ixzIc8TU1aWDEsy9qM9+LCk4Txc98rnbUMlBYPb/KGZ3OvhV8/KeRISznU9uLWg3o92l61nvnlSTnPhNOeArftBXd/4vFW2o48m2WnuD+3mm49P/O0//cj/+u33vN4OjmZcLhe+eX/id9uK/Kd/+y98PUJ67OYDU8N69KFlC3AvUAIauHyeciAzQh3MSQM1SaSHOzTNgxrZByvcTFhH9HWPk+ljswWYcki37nf7DCwliMWjO+c5PRTD3gNoFh26xBIbsNeAp9e90i0oi5yEpSRyKWFXdWMuKZ7nxm1vQ5iD/eioONfD2FsIeLlMlCkQ1RRXi7av7IdREqxH47pHX6KiDy+waThrznPhaUk8zYnX68oPX7boTeaJv/nte3o3butO/v2Xhnn4gozh0HNQLZTszAP+3rv2koba5WFbue3huriuEeE+WLspC7VHoU4aNEr38H2FbytxHl35nKOrDlLOObqgHv5X3EISCHswDD7s6NFoX2sPGUcT/hYJVVOiu3I+nfh4SbyfoxcS64gEGXg7nH3b+cOrsRRlPYz1sJCJeyC17sI8JX7z9RMfLpmSE9d157sfr3z6fBuNKNw9ZUmFkhJTyZzmxIenhZyFLMJpUn582fj0+YqL8md/+g0fnibEO6+vN17XPdhsRB8GLjAmFYo6z6cEbtTBz9Ar62F8aVDNWXsi5fzozC+nQBjnSSkqrOvB1owrxvtF+epSQAZqakE6qhhbizpViQM7Wtyc2m1A6IFHB5RMHrDYB6XsmrmcMuc5sSSniHOZlfXobFtj9s7LS31Q3rU2uoT75XV31iMoougxoHfnvEz8ySm+l8VJbPzx+7gBUbAz3379xJTvsD8O48PzzBLRylEr3YzPbwc/rJV5mricCn/x7btAgiJs+8Y+XPs5Z46jIv/l3/8r3/fKXhvbUWHo3PfNEU3R5NgwgOXCnJX3TzNuxpwcdR8WG+NWR/cbLQFJQmNJqg8KvXpwTmmofTLIw5xD8ZuTYMTmhrE6zHRZ4TIrew0onMVGugxDxXrEbenWQZTmw9g3GrbolaLO3b1QWKdkeHeahhEw0uO2H+Ek6QHrlynz7Vdnvv24jJEJY1t3rusRjLRFnTv2IziralQTtCwgaYx69IcXQO5pfowr1O4Yivyzf/Dn/jqKqMgvB1FG5R2ppA+t4HmZKWkoa/cHmQ0Ol+FeYegq0WPk4TTpfv+p0EnS+Ll0NyYP+tucx5zI3Vl7f6beO3lARkfffumGl5/FKCSO2n3QMY+guA8TGUsOQtQdju6jm4KHF9GdkpSnJbEUZa89Am6YOozQee41OMmdgglOTFJCRAdz7I91ufuom7FPoYtk8j/9h38/hCirw5UeRdqtByPrytPzEx+fFrwHW/n68oL1Gpi+No5amVIIQiZhSEspcZozv/7qicOU337/Qpa4TTlFd36aM5d3z1RP/PjTlVZrqH7eMUljeiqY5yAiw8KaxqjCUsLkljR6g7DAZt5ulb2Ft2s7Gp9vO1NSttZ5mgvisDss8zQGiYzz+cKHS+bT5xdqi1rWjp0pJ5bTCXP4/vMV1eDHfLDIw2sd+zfIUJHhVBGhkYL78/q47TmnMAv2Ru0dxR8dvvyP//hvPCjrUAmTxqxEa523tfHHzyvXo/N8OQXHVRJZIr97N8wDFvfWgr9CSHmimnNY5PJeK25Blz+fJp7PmZTTIye/XitzzpR093KNVEH0Iq11khineeJpSZwm4bykqD3d2Cr8cK302qg9SMfaQ6/p7rzs4RzBOn/v2zPnWfntDxulzEiZg8AR4R//+Tv+21/+SBK4ZOPPvp75vAvf/bQjVvHe6TZAjdmj37icQntxF0oZtVVCsnirzrbuqMJta6jC82kK4FPSYKF9yBdK/t+//+FhBChFh/WmjyhUEOfjCUo62NeNt7e7vj2MYuZsR+TGpUQne/Qr1/2+eOXr9yemJVPN+N3nN7bvjuFnikCYEg8aOyTgOOTLlJjLID8HHH5ZhT++CW+3g5c1nCH7UQnWyDBC1r3nzr0ZRzfezcqffzNje+d6wLN2Sur84eWNTy8b57mwb1/4q+9e+dUF3n1z4X9+t/K/f/+FOUHRgPJTTkynwlIye+28rI0/vtw4zeFf6+N13SCXxHo4+3ZD3JlU6DhPp4kPl4KmMNCVrI/+Kv/l7z6Hl6mHk2lKidYb3QWThALPp8wyRe8xTSWulod/t9eGEzlac6FkZQIup6Bh9uZ8XjvbT1e2owWSS9FkOXDOYVY7zYoRnbUKPEn4bt3h8270tXFUi+hvxqTRoU9ZHzMiU5mYciKNGcG7geI8K0liCmzvA6wI9BqUxnet0XLmDz+ufPNu4uvnwu++NP7605Wvniay9IGiTrTufNk6X35c2VuAGbyT3kLuDT9xeJLnZmDhHWvd0ByH+ONb5cstrKxpxE7rgfjyUiLvTVPB7uhHoB49flRCt96ORm23uBqqD4HnPlTpDlPeyEmGASyUs63ZmN+LnHqZEzlnns7KZSmR6uZMLpm//rRx23tInWMUIZwnzleXxJIS50vmMidKSazVQiTCeZoXfrpG7fhwzlSDLomSolHcezjmb3sbXmPh6/dnnp4K7mF5+lu/ec+2V/7H799QMX7zYRpGiuC0/uqHjXVvoeje0QnD8EAU6SRGUmUuwpQMSYHmSgp3yoKwH/c5FMfGg/YW2k9+93RiH3RAjKd1zBKXU6SxmJy1yPspP1zn6xHjaGZhHFOc53MJr5MPamPAOhzOpzLGf0GS4ta57VGnrp9uMTnrTsklLJcqfHUplCkPA7fH4A3O1p3PW+W21dGYwR9+XDHrTMnZ92jqRKMniqKfOE05vFcW9ae5cNQAM2utvLy8cV0rsyq/er9wrc7LuJlJ7m6XcOGbR94PY4IyJ7ic8hhBmJimHNHvxt4CaZaSsVYDjbrydtsHX1aieZ4y+bffX4OrSoHzzQIFiSgu0Q2nFNItHKGBqD4Y3lo7e23h9dU0TvrnIZtejd6jQVqPWMw06HAjOvRzUZ6XBVW4nArHGF0rWdmOyqfrwW0N94uZ4ZJ4t4T/9pwCjX18noLoa31I0kJOiXWrVHfaERT4N0+FD0vif37a+c23X/Hb33/iuo/p3naEWnia+ONb5dNLZc6B7vBwqdfexzRU5pTh+bxEsDm4Jtbt4HVt6GFctzZ6OochdYuEcaONvk4VPt9sjNlBPp8m8hhDQHTgaB7epRgdU/qQRl0kzNc5dIWcJmzQ27d1Z5Rl3ARNAf9KSpyWTEpQUhiRe78b2JzejOpxbd9+2rhuYS1dht6dBzCYi5JyZqshBXy+Nq5bo9dK2WN0bd0bpxJ6vA9/lbkxl0wpGVKJ29WV//v9G7//caP2QF/fvJ/540vlL7/fsB49ilsfg5nO5Twxp2AczsvE0Z1qzvcvG947+9FCVmiN85whzyzLwlOO1L53xtApUPvQTmCaMk4Jg+BUlHXIsG4xVNItHjDlRHej7u2hEfioMTZmN1JKnOfCnIcIZKGXdzoJCW9XDTlT1LF0H27xxwye9aDLTyXY3nwpnM8Lt93p1sgJ9g7Xa8P6EfmaoOuXJOh0ilEz4PkcnuCj84Co8bewVvjx2rndDr66ZGbtdIePl5luxm8/3fjDl4OSM3NOPM3Csswx/EoQpy+3ytt68NO1ho4jzjIVPjzNfPW8ROPYnTqm0s6zIhi3vbPd9jHjH3KFNagaHrKchIqQp5Ro2nGPoZyt2pi9UAzhPE+UKcT5GH9W5ilIyP1og4DLGKGLHO2uvzuHK+Y1tHKMLCnGG1qnNliKMmcgK9vRcRGOGt3/eqx0j7lGJMawXRLLrDyfCs1C+AnWPPoIG53z696Izwdw1GEuUVjPWcjSuTzFWPPbapymxLY3XjzYh4/nxDJPvH8+AcKPt4PPnzewhvWGeYxjfzhHY7uTeLlWXjfjMslgMCJduxsv1zUMfFl5flrwgVAfvmMNeVmH3zSbNZZJ0VQ4anxyAaLMQ7sWFZRCF8e8IdYiJ/egLe4D9d0kVD0xttopGtd9OKEenNPwU3LUShFl1tjMy5LHgTvzQ4VMOPHJBxA9Tnf4/uUIAxrBuSWM5yUGXw4T5iSUKRzxazWgca/ZAAAD5UlEQVTedmcqhSKOSGezxJdbDZhK59sPM5c5hcl6N35423k9nClnssL7U2IqM7X3MZwTowTXPWTopyWjmng7Grg9rK/iHjbX4c96d5kxc9b9COeng7gg7qzHcG62Hlh6b5Wcg6+57ZWrOecCr0dwSDI4p6SCuQzvr7AdjbfbEYVfonBG0Q5nyh0g9N6h90hnBnMOhnTv4xMPvLFXD8d7Cj5JUxmc0wAAGtc6JaW3BuKICy7wtnVOJRDgu1Owua11thb2Uxu8XHfleoQL5Dwl3p9KpKLrQXOoBqelUHLmNOmgk+zhJ04aA53Rhiq02MjeQmXMOaGjNuAyRtkC1R1HG2PQQX4dzUFjmiqY6E6+VdgPH0RZyLYQXenrHvZ+BJ5OGZX4EJna4qEx/AlTCQdKrW0srj+cjCpBmUBBBLZqrIdTew/7TBrjBM2DepHQWVKWB/dj3alWeZozGadZaDetC3jcRlLm8x5d/tqPMEWkHE5GjDk1Us588/WZ3VfonSXzMCBMRXmeMnsDk2hoX9eDLDDnEOdas9BJCPisOPOc4z2bkydFU+aodXBwO2bxoQDWY9CopKgpKiG2Jc3Qx0dvRBZxlin8VObOUx4OczJU4zgqf/JhwdwwUY6jISPtuI1THRtfRg+SSwK5jzKHBrKUzNGc2x4H3sd8yJTHgKQGI5xS/Pykwm7GpDDNwssWHxwzZxnpyrlMytFCVcwlodrJEqNkecyQTCWsNjrg56efVnwU+aclURsc1bjMiebK7Wg065ynjOeYuA3HZvjEusFlKUzJwzzYnNYazgBA1mg9GsSSgrPCQl1rzbhtFSMcLirRv50nOC2J1p38dFnIGlTG3e80ZR1e1ui4S8nDtxWUuUvANxsmgDu+TkmQoadoUvYan+ggAoc5khLvnhJJdFDd4WR8f465jW7O0o13Jx92/0zWoP6TBNIC4TyG/mNMbej6vfM0J25H1L1T0fEJDNGbBFhR9gbnJXNZCp9eNq7V+HiekZSp3Zln4VmF51NCUmY9jL0606wUDTnhvMTweegdUcOASM3+C/nBIgXX3nlbaxR0woOQp3DOMD7LpbrEZ8f81fevYWSoMVwfGzuobvOhB4TBTYVR9GNAcS6JqQR3k9NADwbXrTGXmKCqHh++EppBDNg0s4hAQthZcgTCdtjDUrp3Qg5NPj4xQejjs6iyJm5HILmpZDQJr9cKb8cg7OB6tPERS04z2GsfVHmQo697YzuC03q9bky5gArKL+YVVbkdznlKaEq0WjkvGX+rvN32YTJ3Jo10a2nmqI71g1orjD6otfhYJhlmwn3vYXEae8sgalWF/weR3JouPjRfIQAAAABJRU5ErkJggg==\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { PolygonModel } from '../models/PolygonModel';\nimport { Util } from '../Util';\nimport { ObjectType, Orientation, RowAxis } from '../types';\nimport { ElementModel } from '../models/ElementModel';\nimport { Point2 } from '../models/Point2';\nimport { ElementModelFactory } from '../models/ElementModelFactory';\nimport { HALF_PI, UNIT_VECTOR_POS_Z } from '../constants';\nimport { PvModel } from '../models/PvModel';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\n\nexport class SolarPanelLayoutRelative {\n static create(\n area: PolygonModel,\n base: ElementModel,\n pvModel: PvModel,\n orientation: Orientation,\n tiltAngle: number,\n rowsPerRack: number,\n interRowSpacing: number,\n rowAxis: RowAxis,\n poleHeight: number,\n poleSpacing: number,\n margin: number,\n ): SolarPanelModel[] {\n if (base.type !== ObjectType.Foundation && base.type !== ObjectType.Cuboid)\n throw new Error('base must be a foundation or cuboid');\n const solarPanels: SolarPanelModel[] = [];\n const bounds = Util.calculatePolygonBounds(area.vertices);\n const ly = (orientation === Orientation.portrait ? pvModel.length : pvModel.width) * rowsPerRack;\n if (rowAxis === RowAxis.upDown) {\n // north-south axis, so the array is laid in x direction\n const n = Math.floor(((bounds.maxX() - bounds.minX()) * base.lx - ly) / interRowSpacing);\n const start = bounds.minX() + ly / (2 * base.lx) + margin / base.lx;\n const delta = interRowSpacing / base.lx;\n const h = (0.5 * Math.abs(Math.cos(tiltAngle)) * ly) / base.lx;\n const a: Point2 = { x: 0, y: -0.5 } as Point2;\n const b: Point2 = { x: 0, y: 0.5 } as Point2;\n const rotation = 'rotation' in base ? base.rotation : undefined;\n for (let i = 0; i <= n; i++) {\n const cx = start + i * delta;\n a.x = b.x = cx - h;\n const p1 = Util.polygonIntersections(a, b, area.vertices).sort((v1, v2) => v1.y - v2.y);\n a.x = b.x = cx + h;\n const p2 = Util.polygonIntersections(a, b, area.vertices).sort((v1, v2) => v1.y - v2.y);\n const numberOfSegments = Math.max(p1.length, p2.length) / 2;\n if (numberOfSegments > 0) {\n for (let s = 0; s < numberOfSegments; s++) {\n const t = s * 2;\n const panel = SolarPanelLayoutRelative.makeUpDownSegment(\n p1[t] ?? p2[t],\n p1[t + 1] ?? p2[t + 1],\n p2[t] ?? p1[t],\n p2[t + 1] ?? p1[t + 1],\n rotation,\n cx,\n ly,\n base,\n pvModel,\n tiltAngle,\n poleHeight,\n poleSpacing,\n margin,\n );\n if (panel) {\n panel.referenceId = area.id;\n Util.changeOrientation(panel, pvModel, orientation);\n solarPanels.push(panel);\n }\n }\n }\n }\n } else {\n // east-west axis, so the array is laid in y direction\n const n = Math.floor(((bounds.maxY() - bounds.minY()) * base.ly - 2 * margin - ly) / interRowSpacing);\n const start = bounds.minY() + ly / (2 * base.ly) + margin / base.ly;\n const delta = interRowSpacing / base.ly;\n const h = (0.5 * Math.abs(Math.cos(tiltAngle)) * ly) / base.ly;\n const a: Point2 = { x: -0.5, y: 0 } as Point2;\n const b: Point2 = { x: 0.5, y: 0 } as Point2;\n const rotation = 'rotation' in base ? base.rotation : undefined;\n for (let i = 0; i <= n; i++) {\n const cy = start + i * delta;\n a.y = b.y = cy - h;\n const p1 = Util.polygonIntersections(a, b, area.vertices).sort((v1, v2) => v1.x - v2.x);\n a.y = b.y = cy + h;\n const p2 = Util.polygonIntersections(a, b, area.vertices).sort((v1, v2) => v1.x - v2.x);\n const numberOfSegments = Math.max(p1.length, p2.length) / 2;\n if (numberOfSegments > 0) {\n for (let s = 0; s < numberOfSegments; s++) {\n const t = s * 2;\n const panel = SolarPanelLayoutRelative.makeLeftRightSegment(\n p1[t] ?? p2[t],\n p1[t + 1] ?? p2[t + 1],\n p2[t] ?? p1[t],\n p2[t + 1] ?? p1[t + 1],\n rotation,\n cy,\n ly,\n base,\n pvModel,\n tiltAngle,\n poleHeight,\n poleSpacing,\n margin,\n );\n if (panel) {\n panel.referenceId = area.id;\n Util.changeOrientation(panel, pvModel, orientation);\n solarPanels.push(panel);\n }\n }\n }\n }\n }\n return solarPanels;\n }\n\n // solar panel rows in up-down direction (north-south if the base's azimuth is zero)\n // p1 and q1 are the end points of the left line of this segment\n // p2 and q2 are the end points of the right line of this segment\n static makeUpDownSegment(\n p1: Point2,\n q1: Point2,\n p2: Point2,\n q2: Point2,\n rotation: number[] | undefined,\n cx: number,\n ly: number,\n base: ElementModel,\n pvModel: PvModel,\n tiltAngle: number,\n poleHeight: number,\n poleSpacing: number,\n margin: number,\n ) {\n const shorter = Math.abs(p1.y - q1.y) < Math.abs(p2.y - q2.y);\n let y1 = shorter ? p1.y : p2.y;\n let y2 = shorter ? q1.y : q2.y;\n const lx = Math.abs(y1 - y2) - (2 * margin) / base.ly;\n if (lx > 0) {\n return ElementModelFactory.makeSolarPanel(\n base,\n pvModel,\n cx,\n (y1 + y2) / 2,\n base.type === ObjectType.Cuboid ? 0.5 : base.lz,\n Orientation.portrait,\n poleHeight,\n poleSpacing,\n tiltAngle,\n HALF_PI,\n UNIT_VECTOR_POS_Z,\n rotation,\n undefined,\n lx * base.ly,\n ly,\n );\n }\n return undefined;\n }\n\n // solar panel rows in left-right direction (west-east if the base's azimuth is zero)\n // p1 and q1 are the end points of the lower line of this segment\n // p2 and q2 are the end points of the upper line of this segment\n static makeLeftRightSegment(\n p1: Point2,\n q1: Point2,\n p2: Point2,\n q2: Point2,\n rotation: number[] | undefined,\n cy: number,\n ly: number,\n base: ElementModel,\n pvModel: PvModel,\n tiltAngle: number,\n poleHeight: number,\n poleSpacing: number,\n margin: number,\n ) {\n const shorter = Math.abs(p1.x - q1.x) < Math.abs(p2.x - q2.x);\n const x1 = shorter ? p1.x : p2.x;\n const x2 = shorter ? q1.x : q2.x;\n const lx = Math.abs(x1 - x2) - (2 * margin) / base.lx;\n if (lx > 0) {\n return ElementModelFactory.makeSolarPanel(\n base,\n pvModel,\n (x1 + x2) / 2,\n cy,\n base.type === ObjectType.Cuboid ? 0.5 : base.lz,\n Orientation.portrait,\n poleHeight,\n poleSpacing,\n tiltAngle,\n 0,\n UNIT_VECTOR_POS_Z,\n rotation,\n undefined,\n lx * base.lx,\n ly,\n );\n }\n return undefined;\n }\n}\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { PolygonModel } from '../models/PolygonModel';\nimport { Util } from '../Util';\nimport { ObjectType, Orientation, RowAxis } from '../types';\nimport { ElementModel } from '../models/ElementModel';\nimport { Point2 } from '../models/Point2';\nimport { ElementModelFactory } from '../models/ElementModelFactory';\nimport { HALF_PI, UNIT_VECTOR_POS_Z } from '../constants';\nimport { PvModel } from '../models/PvModel';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\n\nexport class SolarPanelLayoutAbsolute {\n static create(\n area: PolygonModel,\n base: ElementModel,\n pvModel: PvModel,\n orientation: Orientation,\n tiltAngle: number,\n rowsPerRack: number,\n interRowSpacing: number,\n rowAxis: RowAxis,\n poleHeight: number,\n poleSpacing: number,\n margin: number,\n ): SolarPanelModel[] {\n if (base.type !== ObjectType.Foundation && base.type !== ObjectType.Cuboid)\n throw new Error('base must be a foundation or cuboid');\n const solarPanels: SolarPanelModel[] = [];\n const rotated = !Util.isZero(base.rotation[2]);\n const vertices: Point2[] = [];\n for (const v of area.vertices) {\n vertices.push({ x: v.x * base.lx + base.cx, y: v.y * base.ly + base.cy } as Point2);\n }\n const verticesRotated = rotated ? Util.rotatePolygon(vertices, base.cx, base.cy, base.rotation[2]) : vertices;\n const bounds = Util.calculatePolygonBounds(verticesRotated);\n const ly = (orientation === Orientation.portrait ? pvModel.length : pvModel.width) * rowsPerRack;\n const h = 0.5 * Math.abs(Math.cos(tiltAngle)) * ly;\n if (rowAxis === RowAxis.eastWest) {\n const maxLength = bounds.maxY() - bounds.minY();\n const n = Math.floor((maxLength - 2 * margin - ly) / interRowSpacing);\n const start = bounds.minY() + ly / 2 + margin;\n const a: Point2 = { x: bounds.minX(), y: 0 } as Point2;\n const b: Point2 = { x: bounds.maxX(), y: 0 } as Point2;\n for (let i = 0; i <= n; i++) {\n const cy = start + i * interRowSpacing;\n a.y = b.y = cy - h;\n const p1 = Util.polygonIntersections(a, b, verticesRotated).sort((v1, v2) => v1.x - v2.x);\n a.y = b.y = cy + h;\n const p2 = Util.polygonIntersections(a, b, verticesRotated).sort((v1, v2) => v1.x - v2.x);\n const numberOfSegments = Math.max(p1.length, p2.length) / 2;\n if (numberOfSegments > 0) {\n for (let s = 0; s < numberOfSegments; s++) {\n const t = s * 2;\n const f1 = p1[t] ?? p2[t];\n const g1 = p1[t + 1] ?? p2[t + 1];\n const f2 = p2[t] ?? p1[t];\n const g2 = p2[t + 1] ?? p1[t + 1];\n const shorter = Math.hypot(f1.x - g1.x, f1.y - g1.y) <= Math.hypot(f2.x - g2.x, f2.y - g2.y);\n const x1 = shorter ? f1.x : f2.x;\n const x2 = shorter ? g1.x : g2.x;\n const y1 = shorter ? f1.y : f2.y;\n const y2 = shorter ? g1.y : g2.y;\n const lx = Math.hypot(x1 - x2, y1 - y2) - 2 * margin;\n if (lx > 0) {\n let cp = Util.relativeCoordinates((x1 + x2) / 2, cy, 0, base);\n const panel = ElementModelFactory.makeSolarPanel(\n base,\n pvModel,\n cp.x,\n cp.y,\n base.type === ObjectType.Cuboid ? 0.5 : base.lz,\n Orientation.portrait,\n poleHeight,\n poleSpacing,\n tiltAngle,\n -base.rotation[2],\n UNIT_VECTOR_POS_Z,\n base.rotation,\n undefined,\n lx,\n ly,\n );\n panel.referenceId = area.id;\n Util.changeOrientation(panel, pvModel, orientation);\n solarPanels.push(panel);\n }\n }\n }\n }\n } else if (rowAxis === RowAxis.northSouth) {\n const maxLength = bounds.maxX() - bounds.minX();\n const n = Math.floor((maxLength - 2 * margin - ly) / interRowSpacing);\n const start = bounds.minX() + ly / 2 + margin;\n const a: Point2 = { x: 0, y: bounds.minY() } as Point2;\n const b: Point2 = { x: 0, y: bounds.maxY() } as Point2;\n for (let i = 0; i <= n; i++) {\n const cx = start + i * interRowSpacing;\n a.x = b.x = cx - h;\n const p1 = Util.polygonIntersections(a, b, verticesRotated).sort((v1, v2) => v1.y - v2.y);\n a.x = b.x = cx + h;\n const p2 = Util.polygonIntersections(a, b, verticesRotated).sort((v1, v2) => v1.y - v2.y);\n const numberOfSegments = Math.max(p1.length, p2.length) / 2;\n if (numberOfSegments > 0) {\n for (let s = 0; s < numberOfSegments; s++) {\n const t = s * 2;\n const f1 = p1[t] ?? p2[t];\n const g1 = p1[t + 1] ?? p2[t + 1];\n const f2 = p2[t] ?? p1[t];\n const g2 = p2[t + 1] ?? p1[t + 1];\n const shorter = Math.hypot(f1.x - g1.x, f1.y - g1.y) <= Math.hypot(f2.x - g2.x, f2.y - g2.y);\n const x1 = shorter ? f1.x : f2.x;\n const x2 = shorter ? g1.x : g2.x;\n const y1 = shorter ? f1.y : f2.y;\n const y2 = shorter ? g1.y : g2.y;\n const lx = Math.hypot(x1 - x2, y1 - y2) - 2 * margin;\n if (lx > 0) {\n let cp = Util.relativeCoordinates(cx, (y1 + y2) / 2, 0, base);\n const panel = ElementModelFactory.makeSolarPanel(\n base,\n pvModel,\n cp.x,\n cp.y,\n base.type === ObjectType.Cuboid ? 0.5 : base.lz,\n Orientation.portrait,\n poleHeight,\n poleSpacing,\n tiltAngle,\n -base.rotation[2] + HALF_PI,\n UNIT_VECTOR_POS_Z,\n base.rotation,\n undefined,\n lx,\n ly,\n );\n panel.referenceId = area.id;\n Util.changeOrientation(panel, pvModel, orientation);\n solarPanels.push(panel);\n }\n }\n }\n }\n }\n return solarPanels;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { ObjectType, Orientation, RowAxis } from '../../../types';\nimport { Util } from '../../../Util';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { UndoableLayout } from '../../../undo/UndoableLayout';\nimport { ElementModel } from '../../../models/ElementModel';\nimport { showError } from '../../../helpers';\nimport { SolarPanelArrayLayoutParams } from '../../../stores/SolarPanelArrayLayoutParams';\nimport { SolarPanelLayoutRelative } from '../../../pd/SolarPanelLayoutRelative';\nimport { SolarPanelLayoutAbsolute } from '../../../pd/SolarPanelLayoutAbsolute';\n\nconst { Option } = Select;\n\nconst SolarPanelLayoutWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const elements = useStore(Selector.elements);\n const solarPanelArrayLayoutParams = useStore.getState().solarPanelArrayLayoutParams;\n const getSelectedElement = useStore(Selector.getSelectedElement);\n const getParent = useStore(Selector.getParent);\n const pvModules = useStore(Selector.pvModules);\n const getPvModule = useStore(Selector.getPvModule);\n const updateElementReferenceById = useStore(Selector.updateElementReferenceById);\n const countElementsByReferenceId = useStore(Selector.countElementsByReferenceId);\n const removeElementsByReferenceId = useStore(Selector.removeElementsByReferenceId);\n const clearDeletedElements = useStore(Selector.clearDeletedElements);\n const addUndoable = useStore(Selector.addUndoable);\n const applyCount = useStore(Selector.applyCount);\n const setApplyCount = useStore(Selector.setApplyCount);\n const revertApply = useStore(Selector.revertApply);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [warningDialogVisible, setWarningDialogVisible] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const changedRef = useRef(true);\n const okButtonRef = useRef(null);\n const warningOkButtonRef = useRef(null);\n const okButtonClickedRef = useRef(false);\n const pvModelNameRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.pvModelName));\n const rowAxisRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.rowAxis));\n const orientationRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.orientation));\n const tiltAngleRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.tiltAngle));\n const rowsPerRackRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.rowWidth));\n const interRowSpacingRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.interRowSpacing));\n const marginRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.margin) ?? 0);\n const poleHeightRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.poleHeight));\n const poleSpacingRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.poleSpacing));\n\n const lang = { lng: language };\n const pvModel = getPvModule(pvModelNameRef.current);\n const reference = getSelectedElement();\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (warningDialogVisible) {\n warningOkButtonRef.current?.focus();\n }\n }, [warningDialogVisible]);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const isLayoutOk = () => {\n const ly =\n (orientationRef.current === Orientation.portrait ? pvModel.length : pvModel.width) * rowsPerRackRef.current;\n const projectedWidth = ly * Math.abs(Math.sin(tiltAngleRef.current));\n // The solar panel intersects with the ground?\n if (0.5 * projectedWidth > poleHeightRef.current) {\n showError(i18n.t('message.SolarPanelsCannotIntersectWithGround', lang));\n return false;\n }\n // The inter-row spacing is too small?\n if (ly > interRowSpacingRef.current) {\n showError(i18n.t('message.SolarPanelsCannotOverlapWithOneAnother', lang));\n return false;\n }\n // others?\n return true;\n };\n\n const referenceExistingSolarPanels = (area: PolygonModel) => {\n const existingSolarPanels = elements.filter(\n (e) => e.type === ObjectType.SolarPanel && e.parentId === area.parentId,\n );\n if (existingSolarPanels.length > 0) {\n for (const sp of existingSolarPanels) {\n if (sp.referenceId !== area.id) {\n if (Util.isPointInside(sp.cx, sp.cy, area.vertices)) {\n updateElementReferenceById(sp.id, area.id);\n }\n }\n }\n }\n };\n\n const layout = () => {\n if (reference?.type === ObjectType.Polygon) {\n const base = getParent(reference);\n if (base) {\n const newElements: ElementModel[] = [];\n const abs = rowAxisRef.current === RowAxis.eastWest || rowAxisRef.current === RowAxis.northSouth;\n const solarPanels = abs\n ? SolarPanelLayoutAbsolute.create(\n reference as PolygonModel,\n base,\n pvModel,\n orientationRef.current,\n tiltAngleRef.current,\n rowsPerRackRef.current,\n interRowSpacingRef.current,\n rowAxisRef.current,\n poleHeightRef.current,\n poleSpacingRef.current,\n marginRef.current,\n )\n : SolarPanelLayoutRelative.create(\n reference as PolygonModel,\n base,\n pvModel,\n orientationRef.current,\n tiltAngleRef.current,\n rowsPerRackRef.current,\n interRowSpacingRef.current,\n rowAxisRef.current,\n poleHeightRef.current,\n poleSpacingRef.current,\n marginRef.current,\n );\n if (solarPanels.length > 0) {\n for (const panel of solarPanels) {\n newElements.push(JSON.parse(JSON.stringify(panel)));\n setCommonStore((state) => {\n state.elements.push(panel);\n });\n }\n const undoableLayout = {\n name: 'Solar Panel Array Layout',\n timestamp: Date.now(),\n oldElements: useStore.getState().deletedElements,\n newElements: newElements,\n oldParams: {\n pvModelName: solarPanelArrayLayoutParams.pvModelName,\n rowAxis: solarPanelArrayLayoutParams.rowAxis,\n orientation: solarPanelArrayLayoutParams.orientation,\n tiltAngle: solarPanelArrayLayoutParams.tiltAngle,\n rowsPerRack: solarPanelArrayLayoutParams.rowsPerRack,\n interRowSpacing: solarPanelArrayLayoutParams.interRowSpacing,\n poleHeight: solarPanelArrayLayoutParams.poleHeight,\n poleSpacing: solarPanelArrayLayoutParams.poleSpacing,\n margin: solarPanelArrayLayoutParams.margin,\n } as SolarPanelArrayLayoutParams,\n newParams: {\n pvModelName: pvModelNameRef.current,\n rowAxis: rowAxisRef.current,\n orientation: orientationRef.current,\n tiltAngle: tiltAngleRef.current,\n rowsPerRack: rowsPerRackRef.current,\n interRowSpacing: interRowSpacingRef.current,\n poleHeight: poleHeightRef.current,\n poleSpacing: poleSpacingRef.current,\n margin: marginRef.current,\n } as SolarPanelArrayLayoutParams,\n referenceId: reference.id,\n undo: () => {\n removeElementsByReferenceId(undoableLayout.referenceId, false);\n if (undoableLayout.oldElements.length > 0) {\n setCommonStore((state) => {\n for (const e of undoableLayout.oldElements) {\n state.elements.push(e);\n }\n });\n }\n setParams(undoableLayout.oldParams);\n updateStoreParams();\n },\n redo: () => {\n removeElementsByReferenceId(undoableLayout.referenceId, false);\n if (undoableLayout.newElements.length > 0) {\n setCommonStore((state) => {\n for (const e of undoableLayout.newElements) {\n state.elements.push(e);\n }\n });\n }\n setParams(undoableLayout.newParams);\n updateStoreParams();\n },\n } as UndoableLayout;\n addUndoable(undoableLayout);\n setApplyCount(applyCount + 1);\n }\n }\n changedRef.current = false;\n updateStoreParams();\n }\n };\n\n const setParams = (params: SolarPanelArrayLayoutParams) => {\n pvModelNameRef.current = params.pvModelName;\n rowAxisRef.current = params.rowAxis;\n orientationRef.current = params.orientation;\n tiltAngleRef.current = params.tiltAngle;\n rowsPerRackRef.current = params.rowsPerRack;\n interRowSpacingRef.current = params.interRowSpacing;\n poleHeightRef.current = params.poleHeight;\n poleSpacingRef.current = params.poleSpacing;\n marginRef.current = params.margin ?? 0;\n };\n\n // save the values in the common store so that they can be retrieved\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.solarPanelArrayLayoutParams.pvModelName = pvModelNameRef.current;\n state.solarPanelArrayLayoutParams.rowAxis = rowAxisRef.current;\n state.solarPanelArrayLayoutParams.orientation = orientationRef.current;\n state.solarPanelArrayLayoutParams.tiltAngle = tiltAngleRef.current;\n state.solarPanelArrayLayoutParams.rowsPerRack = rowsPerRackRef.current;\n state.solarPanelArrayLayoutParams.interRowSpacing = interRowSpacingRef.current;\n state.solarPanelArrayLayoutParams.poleHeight = poleHeightRef.current;\n state.solarPanelArrayLayoutParams.poleSpacing = poleSpacingRef.current;\n state.solarPanelArrayLayoutParams.margin = marginRef.current;\n });\n };\n\n const apply = () => {\n if (!changedRef.current) return;\n if (isLayoutOk()) {\n if (reference) {\n referenceExistingSolarPanels(reference as PolygonModel);\n if (countElementsByReferenceId(reference.id) > 0) {\n setWarningDialogVisible(true);\n } else {\n clearDeletedElements();\n layout();\n }\n }\n } else {\n showError(i18n.t('polygonMenu.LayoutNotAcceptedCheckYourParameters', lang));\n }\n };\n\n const onApplyClick = () => {\n apply();\n okButtonClickedRef.current = false;\n };\n\n const onCancelClick = () => {\n setDialogVisible(false);\n revertApply();\n changedRef.current = true;\n okButtonClickedRef.current = false;\n };\n\n const onOkClick = () => {\n if (changedRef.current) {\n apply();\n okButtonClickedRef.current = true;\n } else {\n setDialogVisible(false);\n }\n };\n\n const onWarningCancelClick = () => {\n setWarningDialogVisible(false);\n };\n\n const onWarningOkClick = () => {\n if (reference) {\n removeElementsByReferenceId(reference.id, true);\n layout();\n if (okButtonClickedRef.current) {\n setDialogVisible(false);\n setApplyCount(0);\n }\n }\n setWarningDialogVisible(false);\n };\n\n return (\n <>\n {warningDialogVisible && (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('word.Reminder', lang)}\n \n }\n footer={[\n ,\n ,\n ]}\n >\n {i18n.t('message.ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout', lang) +\n ' ' +\n i18n.t('message.DoYouWantToContinue', lang)}\n \n )}\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('polygonMenu.SolarPanelArrayLayoutParametricDesign', lang)}\n \n }\n footer={[\n ,\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n changedRef.current = true;\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('polygonMenu.SolarPanelArrayModel', lang) +\n ' (' +\n Object.keys(pvModules).length +\n ' ' +\n i18n.t('word.Options', lang) +\n '):'}\n \n \n {\n pvModelNameRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n >\n {Object.keys(pvModules).map((key) => (\n \n ))}\n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayRowAxis', lang) + ':'}\n \n \n {\n rowAxisRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayOrientation', lang) + ':'}\n \n \n {\n orientationRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayTiltAngle', lang) + ' ([-90°, 90°]): '}\n \n \n `${value}°`}\n onChange={(value) => {\n tiltAngleRef.current = Util.toRadians(value);\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayRowWidth', lang) +\n ' ([1-100] ' +\n i18n.t('solarPanelMenu.Panels', lang) +\n '): '}\n \n \n Number(a).toFixed(0)}\n value={rowsPerRackRef.current}\n onChange={(value) => {\n rowsPerRackRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayInterRowSpacing', lang) +\n ' ([1, 20] ' +\n i18n.t('word.MeterAbbreviation', lang) +\n '): '}\n \n \n {\n interRowSpacingRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayMargin', lang) +\n ' ([0, 5] ' +\n i18n.t('word.MeterAbbreviation', lang) +\n '): '}\n \n \n {\n marginRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayPoleHeight', lang) +\n ' ([0, 10] ' +\n i18n.t('word.MeterAbbreviation', lang) +\n '): '}\n \n \n {\n poleHeightRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayPoleSpacing', lang) +\n ' ([2, 50] ' +\n i18n.t('word.MeterAbbreviation', lang) +\n '): '}\n \n \n {\n poleSpacingRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n \n \n );\n};\n\n// don't wrap this with React.memo as changedRef would be saved\nexport default SolarPanelLayoutWizard;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { LineStyle, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonLineStyleSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedLineStyle, setSelectedLineStyle] = useState(polygon?.lineStyle ?? LineStyle.Solid);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updatePolygonLineStyleById = (id: string, style: LineStyle) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).lineStyle = style;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonLineStyleOnSurface = (parentId: string, normal: number[] | undefined, style: LineStyle) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === parentId &&\r\n Util.isIdentical(e.normal, normal) &&\r\n !e.locked\r\n ) {\r\n (e as PolygonModel).lineStyle = style;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonLineStyleAboveFoundation = (foundationId: string, style: LineStyle) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === foundationId && !e.locked) {\r\n (e as PolygonModel).lineStyle = style;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonLineStyleForAll = (style: LineStyle) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n (e as PolygonModel).lineStyle = style;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (style: LineStyle) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (style !== (e as PolygonModel).lineStyle) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n if (style !== (e as PolygonModel).lineStyle) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if (style !== (e as PolygonModel).lineStyle) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon?.foundationId && !e.locked) {\r\n if (style !== (e as PolygonModel).lineStyle) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (style !== polygon?.lineStyle) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: LineStyle) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).lineStyle = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLineStyle = (value: LineStyle) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLineStylesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLineStylesSelected.set(elem.id, (elem as PolygonModel).lineStyle ?? LineStyle.Solid);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Line Style for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldLineStylesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, style] of undoableChangeSelected.oldValues.entries()) {\r\n updatePolygonLineStyleById(id, style as LineStyle);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as LineStyle,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLineStylesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLineStylesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldLineStylesAll.set(elem.id, (elem as PolygonModel).lineStyle ?? LineStyle.Solid);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Line Style for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldLineStylesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, style] of undoableChangeAll.oldValues.entries()) {\r\n updatePolygonLineStyleById(id, style as LineStyle);\r\n }\r\n },\r\n redo: () => {\r\n updatePolygonLineStyleForAll(undoableChangeAll.newValue as LineStyle);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePolygonLineStyleForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldLineStylesOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldLineStylesOnSurface.set(elem.id, (elem as PolygonModel).lineStyle ?? LineStyle.Solid);\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Line Style for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLineStylesOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, style] of undoableChangeOnSurface.oldValues.entries()) {\r\n updatePolygonLineStyleById(id, style as LineStyle);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updatePolygonLineStyleOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as LineStyle,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updatePolygonLineStyleOnSurface(polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldLineStylesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldLineStylesAboveFoundation.set(elem.id, (elem as PolygonModel).lineStyle ?? LineStyle.Solid);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Line Style for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLineStylesAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, style] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePolygonLineStyleById(id, style as LineStyle);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePolygonLineStyleAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as LineStyle,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePolygonLineStyleAboveFoundation(polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldStyle = p ? p.lineStyle : polygon.lineStyle;\r\n const undoableChange = {\r\n name: 'Set Line Style of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldStyle,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updatePolygonLineStyleById(undoableChange.changedElementId, undoableChange.oldValue as LineStyle);\r\n },\r\n redo: () => {\r\n updatePolygonLineStyleById(undoableChange.changedElementId, undoableChange.newValue as LineStyle);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePolygonLineStyleById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setLineStyle(selectedLineStyle);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n setSelectedLineStyle(value)}\r\n >\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonLineStyleSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { LineStyle, LineWidth, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonLineWidthSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const updateElementLineWidthById = useStore(Selector.updateElementLineWidthById);\r\n const updateElementLineWidthOnSurface = useStore(Selector.updateElementLineWidthOnSurface);\r\n const updateElementLineWidthAboveFoundation = useStore(Selector.updateElementLineWidthAboveFoundation);\r\n const updateElementLineWidthForAll = useStore(Selector.updateElementLineWidthForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedLineWidth, setSelectedLineWidth] = useState(polygon?.lineWidth ?? 1);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (width: number) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (width !== e.lineWidth) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n if (width !== e.lineWidth) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if (e.lineWidth !== width) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon?.foundationId && !e.locked) {\r\n if (e.lineWidth !== width) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (width !== polygon?.lineWidth) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).lineWidth = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLineWidth = (value: number) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLineWidthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLineWidthsSelected.set(elem.id, elem.lineWidth ?? 1);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Line Width for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldLineWidthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, width] of undoableChangeSelected.oldValues.entries()) {\r\n updateElementLineWidthById(id, width as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLineWidthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLineWidthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldLineWidthsAll.set(elem.id, elem.lineWidth ?? 1);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Line Width for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldLineWidthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, width] of undoableChangeAll.oldValues.entries()) {\r\n updateElementLineWidthById(id, width as number);\r\n }\r\n },\r\n redo: () => {\r\n updateElementLineWidthForAll(ObjectType.Polygon, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementLineWidthForAll(ObjectType.Polygon, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldLineWidthsOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldLineWidthsOnSurface.set(elem.id, elem.lineWidth ?? 1);\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Line Width for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLineWidthsOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, width] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateElementLineWidthById(id, width as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateElementLineWidthOnSurface(\r\n ObjectType.Polygon,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateElementLineWidthOnSurface(ObjectType.Polygon, polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldLineWidthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldLineWidthsAboveFoundation.set(elem.id, elem.lineWidth ?? 1);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Line Width for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLineWidthsAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, width] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateElementLineWidthById(id, width as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateElementLineWidthAboveFoundation(\r\n ObjectType.Polygon,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateElementLineWidthAboveFoundation(ObjectType.Polygon, polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldWidth = p ? p.lineWidth : polygon.lineWidth;\r\n const undoableChange = {\r\n name: 'Set Line Width of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldWidth,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updateElementLineWidthById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLineWidthById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLineWidthById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setLineWidth(selectedLineWidth);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n setSelectedLineWidth(value)}\r\n >\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonLineWidthSelection;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select, Slider, Tabs } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport {\n DesignProblem,\n EvolutionMethod,\n GeneticAlgorithmSelectionMethod,\n ObjectiveFunctionType,\n ObjectType,\n Orientation,\n RowAxis,\n SearchMethod,\n} from '../../../types';\nimport { showInfo } from '../../../helpers';\nimport { DefaultSolarPanelArrayLayoutConstraints } from '../../../stores/DefaultSolarPanelArrayLayoutConstraints';\nimport { Util } from '../../../Util';\nimport { HALF_PI } from '../../../constants';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\n\nconst { Option } = Select;\nconst { TabPane } = Tabs;\n\nconst SolarPanelArrayGaWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pvModules = useStore(Selector.pvModules);\n const polygon = useStore(Selector.selectedElement) as PolygonModel;\n const getParent = useStore(Selector.getParent);\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const params = useStore(Selector.evolutionaryAlgorithmState).geneticAlgorithmParams;\n const constraints = useStore(Selector.solarPanelArrayLayoutConstraints);\n const geneticAlgorithmWizardSelectedTab = useStore(Selector.geneticAlgorithmWizardSelectedTab);\n const economicsParams = useStore(Selector.economicsParams);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n\n const dragRef = useRef(null);\n const objectiveFunctionTypeRef = useRef(params.objectiveFunctionType);\n const selectionMethodRef = useRef(params.selectionMethod);\n const searchMethodRef = useRef(params.searchMethod);\n const populationSizeRef = useRef(params.populationSize);\n const maximumGenerationsRef = useRef(params.maximumGenerations);\n const mutationRateRef = useRef(params.mutationRate);\n const selectionRateRef = useRef(params.selectionRate ?? 0.5);\n const crossoverRateRef = useRef(params.crossoverRate ?? 0.5);\n const convergenceThresholdRef = useRef(params.convergenceThreshold);\n const localSearchRadiusRef = useRef(params.localSearchRadius);\n const minimumTiltAngleRef = useRef(constraints.minimumTiltAngle ?? -HALF_PI);\n const maximumTiltAngleRef = useRef(constraints.maximumTiltAngle ?? HALF_PI);\n const minimumRowsPerRackRef = useRef(constraints.minimumRowsPerRack);\n const maximumRowsPerRackRef = useRef(constraints.maximumRowsPerRack);\n const minimumInterRowSpacingRef = useRef(constraints.minimumInterRowSpacing);\n const maximumInterRowSpacingRef = useRef(constraints.maximumInterRowSpacing);\n const okButtonRef = useRef(null);\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const lang = { lng: language };\n const rowAxisRef = useRef(constraints.rowAxis ?? RowAxis.leftRight);\n const foundation = polygon ? (getParent(polygon) as FoundationModel) : undefined;\n const originalSolarPanels = foundation\n ? (getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[])\n : undefined;\n const pvModelNameRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].pvModelName\n : constraints.pvModelName ?? 'CS6X-355P-FG',\n );\n const orientationRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].orientation\n : constraints.orientation ?? Orientation.landscape,\n );\n const poleHeightRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].poleHeight\n : constraints.poleHeight ?? 1,\n );\n const poleSpacingRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].poleSpacing\n : constraints.poleSpacing ?? 3,\n );\n const marginRef = useRef(constraints.margin ?? 0);\n const electricitySellingPriceRef = useRef(economicsParams.electricitySellingPrice);\n const operationalCostPerUnitRef = useRef(economicsParams.operationalCostPerUnit);\n\n // make sure these ref values are updated\n useEffect(() => {\n electricitySellingPriceRef.current = economicsParams.electricitySellingPrice;\n }, [economicsParams.electricitySellingPrice]);\n\n useEffect(() => {\n operationalCostPerUnitRef.current = economicsParams.operationalCostPerUnit;\n }, [economicsParams.operationalCostPerUnit]);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n // save the values in the common store to persist the user's last settings\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.problem = DesignProblem.SOLAR_PANEL_ARRAY;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType = objectiveFunctionTypeRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod = selectionMethodRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod = searchMethodRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize = populationSizeRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations = maximumGenerationsRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate = selectionRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate = crossoverRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate = mutationRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold = convergenceThresholdRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius = localSearchRadiusRef.current;\n if (!state.solarPanelArrayLayoutConstraints)\n state.solarPanelArrayLayoutConstraints = new DefaultSolarPanelArrayLayoutConstraints();\n state.solarPanelArrayLayoutConstraints.minimumRowsPerRack = minimumRowsPerRackRef.current;\n state.solarPanelArrayLayoutConstraints.maximumRowsPerRack = maximumRowsPerRackRef.current;\n state.solarPanelArrayLayoutConstraints.minimumTiltAngle = minimumTiltAngleRef.current;\n state.solarPanelArrayLayoutConstraints.maximumTiltAngle = maximumTiltAngleRef.current;\n state.solarPanelArrayLayoutConstraints.minimumInterRowSpacing = minimumInterRowSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.maximumInterRowSpacing = maximumInterRowSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.poleHeight = poleHeightRef.current;\n state.solarPanelArrayLayoutConstraints.poleSpacing = poleSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.pvModelName = pvModelNameRef.current;\n state.solarPanelArrayLayoutConstraints.rowAxis = rowAxisRef.current;\n state.solarPanelArrayLayoutConstraints.orientation = orientationRef.current;\n state.solarPanelArrayLayoutConstraints.margin = marginRef.current;\n state.economicsParams.operationalCostPerUnit = operationalCostPerUnitRef.current;\n state.economicsParams.electricitySellingPrice = electricitySellingPriceRef.current;\n });\n };\n\n const run = () => {\n if (!runEvolution) {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n }\n updateStoreParams();\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = !state.runEvolution;\n });\n setCommonStore((state) => {\n state.evolutionMethod = EvolutionMethod.GENETIC_ALGORITHM;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Genetic Algorithm for Solar Panel Array Layout',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('optimizationMenu.SolarPanelArrayLayout', lang) +\n ': ' +\n i18n.t('optimizationMenu.GeneticAlgorithmSettings', lang)}\n \n }\n footer={[\n {\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Cancel', lang)}\n ,\n {\n run();\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Run', lang)}\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n {\n setCommonStore((state) => {\n state.geneticAlgorithmWizardSelectedTab = key;\n });\n }}\n >\n \n \n \n {i18n.t('optimizationMenu.Objective', lang) + ':'}\n \n \n {\n objectiveFunctionTypeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.ObjectiveFunctionDailyTotalYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionYearlyTotalYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionDailyMeanYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionYearlyMeanYield', lang)}\n \n \n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.GeneticAlgorithmSelectionMethod', lang) + ':'}\n \n \n {\n selectionMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.RouletteWheel', lang)}\n \n \n {i18n.t('optimizationMenu.Tournament', lang)}\n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.PopulationSize', lang) + ' [10, 100]:'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n populationSizeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumGenerations', lang) + ' [5, 100]:'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n maximumGenerationsRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SelectionRate', lang) + ' [0, 1]: '}\n \n \n {\n selectionRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.CrossoverRate', lang) + ' [0, 1]: '}\n \n \n {\n crossoverRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MutationRate', lang) + ' [0, 1]: '}\n \n \n {\n mutationRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.ConvergenceThreshold', lang) + ' (0, 0.1]: '}\n \n \n {\n convergenceThresholdRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SearchMethod', lang) + ':'}\n \n \n {\n searchMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.GlobalSearchUniformSelection', lang)}\n \n \n {i18n.t('optimizationMenu.LocalSearchRandomOptimization', lang)}\n \n \n \n \n\n {searchMethodRef.current === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION && (\n \n \n {i18n.t('optimizationMenu.LocalSearchRadius', lang) + ' ([0, 1]: '}\n \n \n {\n localSearchRadiusRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n )}\n \n\n \n \n \n {i18n.t('optimizationMenu.TiltAngleRange', lang) + ':'}\n \n \n {\n minimumTiltAngleRef.current = Util.toRadians(value[0]);\n maximumTiltAngleRef.current = Util.toRadians(value[1]);\n setUpdateFlag(!updateFlag);\n }}\n min={-90}\n max={90}\n defaultValue={[\n Util.toDegrees(minimumTiltAngleRef.current),\n Util.toDegrees(maximumTiltAngleRef.current),\n ]}\n marks={{\n '-90': {\n style: {\n fontSize: '10px',\n },\n label: '-90°',\n },\n '-45': {\n style: {\n fontSize: '10px',\n },\n label: '-45°',\n },\n '0': {\n style: {\n fontSize: '10px',\n },\n label: '0°',\n },\n '45': {\n style: {\n fontSize: '10px',\n },\n label: '45°',\n },\n '90': {\n style: {\n fontSize: '10px',\n },\n label: '90°',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.RowsPerRackRange', lang) + ':'}\n \n \n {\n minimumRowsPerRackRef.current = value[0];\n maximumRowsPerRackRef.current = value[1];\n setUpdateFlag(!updateFlag);\n }}\n min={1}\n max={9}\n defaultValue={[minimumRowsPerRackRef.current, maximumRowsPerRackRef.current]}\n marks={{\n 1: {\n style: {\n fontSize: '10px',\n },\n label: 1,\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: 2,\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: 3,\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: 4,\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: 5,\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: 6,\n },\n 7: {\n style: {\n fontSize: '10px',\n },\n label: 7,\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: 8,\n },\n 9: {\n style: {\n fontSize: '10px',\n },\n label: 9,\n },\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.InterRowSpacingRange', lang) + ':'}\n \n \n {\n minimumInterRowSpacingRef.current = value[0];\n maximumInterRowSpacingRef.current = value[1];\n setUpdateFlag(!updateFlag);\n }}\n min={1}\n max={10}\n defaultValue={[minimumInterRowSpacingRef.current, maximumInterRowSpacingRef.current]}\n marks={{\n 1: {\n style: {\n fontSize: '10px',\n },\n label: '1m',\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: '3m',\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: '5m',\n },\n 7: {\n style: {\n fontSize: '10px',\n },\n label: '7m',\n },\n 9: {\n style: {\n fontSize: '10px',\n },\n label: '9m',\n },\n }}\n />\n \n \n \n\n \n \n \n {i18n.t('polygonMenu.SolarPanelArrayModel', lang) +\n ' (' +\n Object.keys(pvModules).length +\n ' ' +\n i18n.t('word.Options', lang) +\n '):'}\n \n \n {\n pvModelNameRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n {Object.keys(pvModules).map((key) => (\n \n ))}\n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayRowAxis', lang) + ':'}\n \n \n {\n rowAxisRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayOrientation', lang) + ':'}\n \n \n {\n orientationRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayMargin', lang) + ':'}\n \n \n {\n marginRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0}\n max={5}\n step={0.1}\n defaultValue={marginRef.current}\n marks={{\n 0: {\n style: {\n fontSize: '10px',\n },\n label: '0m',\n },\n 1: {\n style: {\n fontSize: '10px',\n },\n label: '1m',\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: '3m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: '5m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('solarCollectorMenu.PoleHeight', lang) + ':'}\n \n \n {\n poleHeightRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0}\n max={10}\n step={0.1}\n defaultValue={poleHeightRef.current}\n marks={{\n 0: {\n style: {\n fontSize: '10px',\n },\n label: '0m',\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('solarPanelMenu.PoleSpacing', lang) + ':'}\n \n \n {\n poleSpacingRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={2}\n max={10}\n step={0.1}\n defaultValue={poleSpacingRef.current}\n marks={{\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('economicsPanel.OperationalCostPerUnit', lang) + ':'}\n \n \n {\n operationalCostPerUnitRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0.1}\n max={1}\n step={0.01}\n defaultValue={operationalCostPerUnitRef.current}\n marks={{\n 0.1: {\n style: {\n fontSize: '10px',\n },\n label: '10¢',\n },\n 0.3: {\n style: {\n fontSize: '10px',\n },\n label: '30¢',\n },\n 0.5: {\n style: {\n fontSize: '10px',\n },\n label: '50¢',\n },\n 0.7: {\n style: {\n fontSize: '10px',\n },\n label: '70¢',\n },\n 0.9: {\n style: {\n fontSize: '10px',\n },\n label: '90¢',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('economicsPanel.ElectricitySellingPrice', lang) + ':'}\n \n \n {\n electricitySellingPriceRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0.1}\n max={1}\n step={0.01}\n defaultValue={electricitySellingPriceRef.current}\n marks={{\n 0.1: {\n style: {\n fontSize: '10px',\n },\n label: '10¢',\n },\n 0.3: {\n style: {\n fontSize: '10px',\n },\n label: '30¢',\n },\n 0.5: {\n style: {\n fontSize: '10px',\n },\n label: '50¢',\n },\n 0.7: {\n style: {\n fontSize: '10px',\n },\n label: '70¢',\n },\n 0.9: {\n style: {\n fontSize: '10px',\n },\n label: '90¢',\n },\n }}\n />\n \n \n \n \n \n \n );\n};\n\nexport default React.memo(SolarPanelArrayGaWizard);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select, Slider, Tabs } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport {\n DesignProblem,\n EvolutionMethod,\n ObjectiveFunctionType,\n ObjectType,\n Orientation,\n RowAxis,\n SearchMethod,\n} from '../../../types';\nimport { showInfo } from '../../../helpers';\nimport { DefaultSolarPanelArrayLayoutConstraints } from '../../../stores/DefaultSolarPanelArrayLayoutConstraints';\nimport { Util } from '../../../Util';\nimport { HALF_PI } from '../../../constants';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\n\nconst { Option } = Select;\nconst { TabPane } = Tabs;\n\nconst SolarPanelArrayPsoWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pvModules = useStore(Selector.pvModules);\n const polygon = useStore(Selector.selectedElement) as PolygonModel;\n const getParent = useStore(Selector.getParent);\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const params = useStore(Selector.evolutionaryAlgorithmState).particleSwarmOptimizationParams;\n const constraints = useStore(Selector.solarPanelArrayLayoutConstraints);\n const particleSwarmOptimizationWizardSelectedTab = useStore(Selector.particleSwarmOptimizationWizardSelectedTab);\n const economicsParams = useStore(Selector.economicsParams);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n\n const dragRef = useRef(null);\n const objectiveFunctionTypeRef = useRef(params.objectiveFunctionType);\n const searchMethodRef = useRef(params.searchMethod);\n const swarmSizeRef = useRef(params.swarmSize);\n const maximumStepsRef = useRef(params.maximumSteps);\n const vmaxRef = useRef(params.vmax ?? 0.01);\n const inertiaRef = useRef(params.inertia ?? 0.8);\n const cognitiveCoefficientRef = useRef(params.cognitiveCoefficient ?? 0.1);\n const socialCoefficientRef = useRef(params.socialCoefficient ?? 0.1);\n const convergenceThresholdRef = useRef(params.convergenceThreshold);\n const localSearchRadiusRef = useRef(params.localSearchRadius);\n const minimumTiltAngleRef = useRef(constraints.minimumTiltAngle ?? -HALF_PI);\n const maximumTiltAngleRef = useRef(constraints.maximumTiltAngle ?? HALF_PI);\n const minimumRowsPerRackRef = useRef(constraints.minimumRowsPerRack);\n const maximumRowsPerRackRef = useRef(constraints.maximumRowsPerRack);\n const minimumInterRowSpacingRef = useRef(constraints.minimumInterRowSpacing);\n const maximumInterRowSpacingRef = useRef(constraints.maximumInterRowSpacing);\n const okButtonRef = useRef(null);\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const lang = { lng: language };\n const rowAxisRef = useRef(constraints.rowAxis ?? RowAxis.leftRight);\n const foundation = polygon ? (getParent(polygon) as FoundationModel) : undefined;\n const originalSolarPanels = foundation\n ? (getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[])\n : undefined;\n const pvModelNameRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].pvModelName\n : constraints.pvModelName ?? 'CS6X-355P-FG',\n );\n const orientationRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].orientation\n : constraints.orientation ?? Orientation.landscape,\n );\n const poleHeightRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].poleHeight\n : constraints.poleHeight ?? 1,\n );\n const poleSpacingRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].poleSpacing\n : constraints.poleSpacing ?? 3,\n );\n const marginRef = useRef(constraints.margin ?? 0);\n const electricitySellingPriceRef = useRef(economicsParams.electricitySellingPrice);\n const operationalCostPerUnitRef = useRef(economicsParams.operationalCostPerUnit);\n\n // make sure these ref values are updated\n useEffect(() => {\n electricitySellingPriceRef.current = economicsParams.electricitySellingPrice;\n }, [economicsParams.electricitySellingPrice]);\n\n useEffect(() => {\n operationalCostPerUnitRef.current = economicsParams.operationalCostPerUnit;\n }, [economicsParams.operationalCostPerUnit]);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n // save the values in the common store to persist the user's last settings\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem = DesignProblem.SOLAR_PANEL_ARRAY;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType =\n objectiveFunctionTypeRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod = searchMethodRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize = swarmSizeRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps = maximumStepsRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient =\n cognitiveCoefficientRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient = socialCoefficientRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.vmax = vmaxRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.inertia = inertiaRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.convergenceThreshold =\n convergenceThresholdRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.localSearchRadius = localSearchRadiusRef.current;\n if (!state.solarPanelArrayLayoutConstraints)\n state.solarPanelArrayLayoutConstraints = new DefaultSolarPanelArrayLayoutConstraints();\n state.solarPanelArrayLayoutConstraints.minimumRowsPerRack = minimumRowsPerRackRef.current;\n state.solarPanelArrayLayoutConstraints.maximumRowsPerRack = maximumRowsPerRackRef.current;\n state.solarPanelArrayLayoutConstraints.minimumTiltAngle = minimumTiltAngleRef.current;\n state.solarPanelArrayLayoutConstraints.maximumTiltAngle = maximumTiltAngleRef.current;\n state.solarPanelArrayLayoutConstraints.minimumInterRowSpacing = minimumInterRowSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.maximumInterRowSpacing = maximumInterRowSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.poleHeight = poleHeightRef.current;\n state.solarPanelArrayLayoutConstraints.poleSpacing = poleSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.pvModelName = pvModelNameRef.current;\n state.solarPanelArrayLayoutConstraints.rowAxis = rowAxisRef.current;\n state.solarPanelArrayLayoutConstraints.orientation = orientationRef.current;\n state.solarPanelArrayLayoutConstraints.margin = marginRef.current;\n state.economicsParams.operationalCostPerUnit = operationalCostPerUnitRef.current;\n state.economicsParams.electricitySellingPrice = electricitySellingPriceRef.current;\n });\n };\n\n const run = () => {\n if (!runEvolution) {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n }\n updateStoreParams();\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = !state.runEvolution;\n });\n setCommonStore((state) => {\n state.evolutionMethod = EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Particle Swarm Optimization for Solar Panel Array Layout',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('optimizationMenu.SolarPanelArrayLayout', lang) +\n ': ' +\n i18n.t('optimizationMenu.ParticleSwarmOptimizationSettings', lang)}\n \n }\n footer={[\n {\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Cancel', lang)}\n ,\n {\n run();\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Run', lang)}\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n {\n setCommonStore((state) => {\n state.particleSwarmOptimizationWizardSelectedTab = key;\n });\n }}\n >\n \n \n \n {i18n.t('optimizationMenu.Objective', lang) + ':'}\n \n \n {\n objectiveFunctionTypeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.ObjectiveFunctionDailyTotalYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionYearlyTotalYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionDailyMeanYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionYearlyMeanYield', lang)}\n \n \n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.SwarmSize', lang) + ' [10, 100]:'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n swarmSizeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumSteps', lang) + ' [5, 100]:'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n maximumStepsRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.CognitiveCoefficient', lang) + ' [0, 1]: '}\n \n \n {\n cognitiveCoefficientRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SocialCoefficient', lang) + ' [0, 1]: '}\n \n \n {\n socialCoefficientRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.InertiaWeight', lang) + ' [0, 1]: '}\n \n \n {\n inertiaRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumVelocity', lang) + ' [0.001, 0.1]: '}\n \n \n {\n vmaxRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.ConvergenceThreshold', lang) + ' (0, 0.1]: '}\n \n \n {\n convergenceThresholdRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SearchMethod', lang) + ':'}\n \n \n {\n searchMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.GlobalSearchUniformSelection', lang)}\n \n \n {i18n.t('optimizationMenu.LocalSearchRandomOptimization', lang)}\n \n \n \n \n\n {searchMethodRef.current === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION && (\n \n \n {i18n.t('optimizationMenu.LocalSearchRadius', lang) + ' ([0, 1]: '}\n \n \n {\n localSearchRadiusRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n )}\n \n\n \n \n \n {i18n.t('optimizationMenu.TiltAngleRange', lang) + ':'}\n \n \n {\n minimumTiltAngleRef.current = Util.toRadians(value[0]);\n maximumTiltAngleRef.current = Util.toRadians(value[1]);\n setUpdateFlag(!updateFlag);\n }}\n min={-90}\n max={90}\n defaultValue={[\n Util.toDegrees(minimumTiltAngleRef.current),\n Util.toDegrees(maximumTiltAngleRef.current),\n ]}\n marks={{\n '-90': {\n style: {\n fontSize: '10px',\n },\n label: '-90°',\n },\n '-45': {\n style: {\n fontSize: '10px',\n },\n label: '-45°',\n },\n '0': {\n style: {\n fontSize: '10px',\n },\n label: '0°',\n },\n '45': {\n style: {\n fontSize: '10px',\n },\n label: '45°',\n },\n '90': {\n style: {\n fontSize: '10px',\n },\n label: '90°',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.RowsPerRackRange', lang) + ':'}\n \n \n {\n minimumRowsPerRackRef.current = value[0];\n maximumRowsPerRackRef.current = value[1];\n setUpdateFlag(!updateFlag);\n }}\n min={1}\n max={9}\n defaultValue={[minimumRowsPerRackRef.current, maximumRowsPerRackRef.current]}\n marks={{\n 1: {\n style: {\n fontSize: '10px',\n },\n label: 1,\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: 2,\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: 3,\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: 4,\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: 5,\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: 6,\n },\n 7: {\n style: {\n fontSize: '10px',\n },\n label: 7,\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: 8,\n },\n 9: {\n style: {\n fontSize: '10px',\n },\n label: 9,\n },\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.InterRowSpacingRange', lang) + ':'}\n \n \n {\n minimumInterRowSpacingRef.current = value[0];\n maximumInterRowSpacingRef.current = value[1];\n setUpdateFlag(!updateFlag);\n }}\n min={2}\n max={10}\n defaultValue={[minimumInterRowSpacingRef.current, maximumInterRowSpacingRef.current]}\n marks={{\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n \n\n \n \n \n {i18n.t('polygonMenu.SolarPanelArrayModel', lang) +\n ' (' +\n Object.keys(pvModules).length +\n ' ' +\n i18n.t('word.Options', lang) +\n '):'}\n \n \n {\n pvModelNameRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n {Object.keys(pvModules).map((key) => (\n \n ))}\n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayRowAxis', lang) + ':'}\n \n \n {\n rowAxisRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayOrientation', lang) + ':'}\n \n \n {\n orientationRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayMargin', lang) + ':'}\n \n \n {\n marginRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0}\n max={5}\n step={0.1}\n defaultValue={marginRef.current}\n marks={{\n 0: {\n style: {\n fontSize: '10px',\n },\n label: '0m',\n },\n 1: {\n style: {\n fontSize: '10px',\n },\n label: '1m',\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: '3m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: '5m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('solarCollectorMenu.PoleHeight', lang) + ':'}\n \n \n {\n poleHeightRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0}\n max={10}\n step={0.1}\n defaultValue={poleHeightRef.current}\n marks={{\n 0: {\n style: {\n fontSize: '10px',\n },\n label: '0m',\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('solarPanelMenu.PoleSpacing', lang) + ':'}\n \n \n {\n poleSpacingRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={2}\n max={10}\n step={0.1}\n defaultValue={poleSpacingRef.current}\n marks={{\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('economicsPanel.OperationalCostPerUnit', lang) + ':'}\n \n \n {\n operationalCostPerUnitRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0.1}\n max={1}\n step={0.01}\n defaultValue={operationalCostPerUnitRef.current}\n marks={{\n 0.1: {\n style: {\n fontSize: '10px',\n },\n label: '10¢',\n },\n 0.3: {\n style: {\n fontSize: '10px',\n },\n label: '30¢',\n },\n 0.5: {\n style: {\n fontSize: '10px',\n },\n label: '50¢',\n },\n 0.7: {\n style: {\n fontSize: '10px',\n },\n label: '70¢',\n },\n 0.9: {\n style: {\n fontSize: '10px',\n },\n label: '90¢',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('economicsPanel.ElectricitySellingPrice', lang) + ':'}\n \n \n {\n electricitySellingPriceRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0.1}\n max={1}\n step={0.01}\n defaultValue={electricitySellingPriceRef.current}\n marks={{\n 0.1: {\n style: {\n fontSize: '10px',\n },\n label: '10¢',\n },\n 0.3: {\n style: {\n fontSize: '10px',\n },\n label: '30¢',\n },\n 0.5: {\n style: {\n fontSize: '10px',\n },\n label: '50¢',\n },\n 0.7: {\n style: {\n fontSize: '10px',\n },\n label: '70¢',\n },\n 0.9: {\n style: {\n fontSize: '10px',\n },\n label: '90¢',\n },\n }}\n />\n \n \n \n \n \n \n );\n};\n\nexport default React.memo(SolarPanelArrayPsoWizard);\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonOpacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [input, setInput] = useState(polygon?.opacity !== undefined ? polygon.opacity : 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateOpacityById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as PolygonModel).opacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateOpacityById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateOpacityById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n value !== (e as PolygonModel).opacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && value !== (e as PolygonModel).opacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.foundationId === polygon.foundationId &&\r\n value !== (e as PolygonModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n value !== (e as PolygonModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== polygon?.opacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const polygon = e as PolygonModel;\r\n oldValuesSelected.set(e.id, polygon.opacity);\r\n updateOpacityById(polygon.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Opacity for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n const polygon = e as PolygonModel;\r\n oldValuesAll.set(e.id, polygon.opacity);\r\n updateOpacityById(polygon.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Opacity for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon.foundationId && !e.locked) {\r\n const polygon = e as PolygonModel;\r\n oldValuesAboveFoundation.set(e.id, polygon.opacity);\r\n updateOpacityById(polygon.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Opacity for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n if (polygon.parentId) {\r\n const oldValuesOnSurface = new Map();\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n const polygon = e as PolygonModel;\r\n oldValuesOnSurface.set(e.id, polygon.opacity);\r\n updateOpacityById(polygon.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Opacity for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesOnSurface,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (polygon) {\r\n const updatedPolygon = getElementById(polygon.id) as PolygonModel;\r\n const oldOpacity =\r\n updatedPolygon.opacity !== undefined\r\n ? updatedPolygon.opacity\r\n : polygon.opacity !== undefined\r\n ? polygon.opacity\r\n : 1;\r\n const undoableChange = {\r\n name: 'Set Polygon Opacity',\r\n timestamp: Date.now(),\r\n oldValue: oldOpacity,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updateOpacityById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateOpacityById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateOpacityById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(input);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(1)}\r\n onChange={(value) => setInput(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n setActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default PolygonOpacityInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { CheckboxChangeEvent } from 'antd/lib/checkbox';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Copy, Cut, Lock, Paste } from '../menuItems';\r\nimport { ObjectType, PolygonTexture } from '../../../types';\r\nimport PolygonLineColorSelection from './polygonLineColorSelection';\r\nimport PolygonFillColorSelection from './polygonFillColorSelection';\r\nimport PolygonTextureSelection from './polygonTextureSelection';\r\nimport SolarPanelLayoutWizard from './solarPanelLayoutWizard';\r\nimport PolygonLineStyleSelection from './polygonLineStyleSelection';\r\nimport PolygonLineWidthSelection from './polygonLineWidthSelection';\r\nimport SolarPanelArrayGaWizard from './solarPanelArrayGaWizard';\r\nimport SolarPanelArrayPsoWizard from './solarPanelArrayPsoWizard';\r\nimport PolygonOpacityInput from './polygonOpacityInput';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const PolygonMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [textContent, setTextContent] = useState(polygon?.text ?? '');\r\n const [textSize, setTextSize] = useState(polygon?.fontSize ?? 1);\r\n const [textColor, setTextColor] = useState(polygon?.fontColor ?? 'black');\r\n const [textOutlineColor, setTextOutlineColor] = useState(polygon?.fontOutlineColor ?? 'white');\r\n const [textOutlineWidth, setTextOutlineWidth] = useState(polygon?.fontOutlineWidth ?? 0);\r\n const [textStrokeColor, setTextStrokeColor] = useState(polygon?.fontStrokeColor ?? 'black');\r\n const [textStrokeWidth, setTextStrokeWidth] = useState(polygon?.fontStrokeWidth ?? 0);\r\n const [lineColorDialogVisible, setLineColorDialogVisible] = useState(false);\r\n const [lineStyleDialogVisible, setLineStyleDialogVisible] = useState(false);\r\n const [lineWidthDialogVisible, setLineWidthDialogVisible] = useState(false);\r\n const [fillColorDialogVisible, setFillColorDialogVisible] = useState(false);\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [opacityDialogVisible, setOpacityDialogVisible] = useState(false);\r\n const [solarPanelLayoutWizardVisible, setSolarPanelLayoutWizardVisible] = useState(false);\r\n const [solarPanelLayoutGaWizardVisible, setSolarPanelLayoutGaWizardVisible] = useState(false);\r\n const [solarPanelLayoutPsoWizardVisible, setSolarPanelLayoutPsoWizardVisible] = useState(false);\r\n const lang = { lng: language };\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === polygon?.parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n if (polygon) {\r\n setTextContent(polygon.text ?? '');\r\n setTextSize(polygon.fontSize ?? 1);\r\n setTextColor(polygon.fontColor ?? 'black');\r\n setTextOutlineColor(polygon.fontOutlineColor ?? 'white');\r\n setTextOutlineWidth(polygon.fontOutlineWidth ?? 0);\r\n setTextStrokeColor(polygon.fontStrokeColor ?? 'black');\r\n setTextStrokeWidth(polygon.fontStrokeWidth ?? 0);\r\n }\r\n }, [polygon]);\r\n\r\n if (!polygon || !parent) return null;\r\n\r\n const editable = !polygon?.locked;\r\n\r\n const updateFilledById = (id: string, filled: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).filled = filled;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateNoOutlineById = (id: string, noOutline: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).noOutline = noOutline;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateShininessById = (id: string, shininess: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).shininess = shininess;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTextById = (id: string, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).text = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontSizeById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontSize = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontColorById = (id: string, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontColor = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontOutlineWidthById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontOutlineWidth = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontOutlineColorById = (id: string, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontOutlineColor = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontStrokeWidthById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontStrokeWidth = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontStrokeColorById = (id: string, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontStrokeColor = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const toggleFilled = (e: CheckboxChangeEvent) => {\r\n if (polygon) {\r\n const undoableCheck = {\r\n name: 'Fill Polygon',\r\n timestamp: Date.now(),\r\n checked: !polygon.filled,\r\n selectedElementId: polygon.id,\r\n selectedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFilledById(polygon.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateFilledById(polygon.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateFilledById(polygon.id, e.target.checked);\r\n }\r\n };\r\n\r\n const toggleNoOutline = (e: CheckboxChangeEvent) => {\r\n if (polygon) {\r\n const undoableCheck = {\r\n name: 'No Outline for Polygon',\r\n timestamp: Date.now(),\r\n checked: !polygon.noOutline,\r\n selectedElementId: polygon.id,\r\n selectedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateNoOutlineById(polygon.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateNoOutlineById(polygon.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateNoOutlineById(polygon.id, e.target.checked);\r\n }\r\n };\r\n\r\n const toggleShiny = (e: CheckboxChangeEvent) => {\r\n if (polygon) {\r\n const shininess = 100;\r\n const undoableCheck = {\r\n name: 'Shiny Polygon',\r\n timestamp: Date.now(),\r\n checked: (polygon?.shininess ?? 0) > 0,\r\n selectedElementId: polygon.id,\r\n selectedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateShininessById(polygon.id, undoableCheck.checked ? 0 : shininess);\r\n },\r\n redo: () => {\r\n updateShininessById(polygon.id, undoableCheck.checked ? shininess : 0);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateShininessById(polygon.id, e.target.checked ? shininess : 0);\r\n }\r\n };\r\n\r\n const changeText = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Text for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.text ?? '',\r\n newValue: textContent,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateTextById(polygon.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateTextById(polygon.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateTextById(polygon.id, textContent);\r\n }\r\n };\r\n\r\n const changeFontSize = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Size for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontSize ?? 1,\r\n newValue: textSize,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontSizeById(polygon.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFontSizeById(polygon.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontSizeById(polygon.id, textSize);\r\n }\r\n };\r\n\r\n const changeFontColor = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Color for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontColor ?? 'black',\r\n newValue: textColor,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontColorById(polygon.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateFontColorById(polygon.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontColorById(polygon.id, textColor);\r\n }\r\n };\r\n\r\n const changeFontOutlineWidth = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Outline Width for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontOutlineWidth ?? 0,\r\n newValue: textOutlineWidth,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontOutlineWidthById(polygon.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFontOutlineWidthById(polygon.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontOutlineWidthById(polygon.id, textOutlineWidth);\r\n }\r\n };\r\n\r\n const changeFontOutlineColor = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Outline Color for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontOutlineColor ?? 'white',\r\n newValue: textOutlineColor,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontOutlineColorById(polygon.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateFontOutlineColorById(polygon.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontOutlineColorById(polygon.id, textOutlineColor);\r\n }\r\n };\r\n\r\n const changeFontStrokeWidth = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Stroke Width for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontStrokeWidth ?? 0,\r\n newValue: textStrokeWidth,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontStrokeWidthById(polygon.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFontStrokeWidthById(polygon.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontStrokeWidthById(polygon.id, textStrokeWidth);\r\n }\r\n };\r\n\r\n const changeFontStrokeColor = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Stroke Color for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontStrokeColor ?? 'black',\r\n newValue: textStrokeColor,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontStrokeColorById(polygon.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateFontStrokeColorById(polygon.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontStrokeColorById(polygon.id, textStrokeColor);\r\n }\r\n };\r\n\r\n const legalToPaste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const e = elementsToPaste[0];\r\n if (\r\n e.type === ObjectType.Human ||\r\n e.type === ObjectType.Tree ||\r\n e.type === ObjectType.Polygon ||\r\n e.type === ObjectType.Sensor ||\r\n e.type === ObjectType.SolarPanel\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n \r\n {editable && }\r\n {(parent?.type === ObjectType.Foundation || parent?.type === ObjectType.Cuboid) && (\r\n \r\n {solarPanelLayoutWizardVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPanelLayoutWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('polygonMenu.SolarPanelArrayLayoutParametricDesign', lang)} ...\r\n \r\n \r\n {solarPanelLayoutGaWizardVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPanelLayoutGaWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('optimizationMenu.GeneticAlgorithm', lang)} ...\r\n \r\n {solarPanelLayoutPsoWizardVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPanelLayoutPsoWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('optimizationMenu.ParticleSwarmOptimization', lang)} ...\r\n \r\n \r\n \r\n )}\r\n \r\n {editable && (\r\n \r\n \r\n {i18n.t('polygonMenu.Filled', lang)}\r\n \r\n \r\n )}\r\n {editable && polygon.filled && (\r\n \r\n 0} onChange={toggleShiny}>\r\n {i18n.t('polygonMenu.Shiny', lang)}\r\n \r\n \r\n )}\r\n {editable && (\r\n \r\n \r\n {i18n.t('polygonMenu.NoOutline', lang)}\r\n \r\n \r\n )}\r\n {editable && (\r\n <>\r\n {lineColorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLineColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.LineColor', lang)} ...\r\n \r\n {lineStyleDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLineStyleDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.LineStyle', lang)} ...\r\n \r\n {lineWidthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLineWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.LineWidth', lang)} ...\r\n \r\n \r\n )}\r\n {editable && polygon.filled && (!polygon.textureType || polygon.textureType === PolygonTexture.NoTexture) && (\r\n <>\r\n {fillColorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setFillColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.FillColor', lang)} ...\r\n \r\n \r\n )}\r\n {editable && polygon.filled && (\r\n <>\r\n {textureDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.FillTexture', lang)} ...\r\n \r\n \r\n )}\r\n {editable && polygon.filled && (\r\n <>\r\n {opacityDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setOpacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.Opacity', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n \r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* text */}\r\n \r\n ) => setTextContent(e.target.value)}\r\n onPressEnter={changeText}\r\n onBlur={changeText}\r\n />\r\n \r\n {/* font size */}\r\n \r\n setTextSize(value)}\r\n onPressEnter={changeFontSize}\r\n onBlur={changeFontSize}\r\n />\r\n \r\n {/* font color */}\r\n \r\n setTextColor(e.target.value)}\r\n onPressEnter={changeFontColor}\r\n onBlur={changeFontColor}\r\n />\r\n \r\n {/* font outline color */}\r\n \r\n setTextOutlineColor(e.target.value)}\r\n onPressEnter={changeFontOutlineColor}\r\n onBlur={changeFontOutlineColor}\r\n />\r\n \r\n {/* font outline width */}\r\n \r\n setTextOutlineWidth(value)}\r\n onPressEnter={changeFontOutlineWidth}\r\n onBlur={changeFontOutlineWidth}\r\n />\r\n \r\n {/* font stroke color */}\r\n \r\n setTextStrokeColor(e.target.value)}\r\n onPressEnter={changeFontStrokeColor}\r\n onBlur={changeFontStrokeColor}\r\n />\r\n \r\n {/* font stroke width */}\r\n \r\n setTextStrokeWidth(value)}\r\n onPressEnter={changeFontStrokeWidth}\r\n onBlur={changeFontStrokeWidth}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Menu } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { Point2 } from '../../../models/Point2';\r\nimport { ObjectType, PolygonVertexAction } from '../../../types';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const PolygonVertexMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n if (!polygon || polygon.selectedIndex < 0) return null;\r\n\r\n const lang = { lng: language };\r\n\r\n const deletePolygonVertexByIndex = (id: string, index: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n p.vertices.splice(index, 1);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const insertPolygonVertexBeforeIndex = (id: string, index: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n const n = p.vertices.length;\r\n if (index > 0 && index < n) {\r\n const newX = 0.5 * (p.vertices[index].x + p.vertices[index - 1].x);\r\n const newY = 0.5 * (p.vertices[index].y + p.vertices[index - 1].y);\r\n p.vertices.splice(index, 0, { x: newX, y: newY } as Point2);\r\n } else if (index === 0) {\r\n const newX = 0.5 * (p.vertices[index].x + p.vertices[n - 1].x);\r\n const newY = 0.5 * (p.vertices[index].y + p.vertices[n - 1].y);\r\n p.vertices.splice(n, 0, { x: newX, y: newY } as Point2);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const insertPolygonVertexAfterIndex = (id: string, index: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n const n = p.vertices.length;\r\n if (index >= 0 && index < n - 1) {\r\n const newX = 0.5 * (p.vertices[index].x + p.vertices[index + 1].x);\r\n const newY = 0.5 * (p.vertices[index].y + p.vertices[index + 1].y);\r\n p.vertices.splice(index + 1, 0, { x: newX, y: newY } as Point2);\r\n } else if (index === n - 1) {\r\n const newX = 0.5 * (p.vertices[index].x + p.vertices[0].x);\r\n const newY = 0.5 * (p.vertices[index].y + p.vertices[0].y);\r\n p.vertices.splice(n, 0, { x: newX, y: newY } as Point2);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const insertVertexBeforeIndex = () => {\r\n changeVertex(PolygonVertexAction.InsertBeforeIndex);\r\n };\r\n\r\n const insertVertexAfterIndex = () => {\r\n changeVertex(PolygonVertexAction.InsertAfterIndex);\r\n };\r\n\r\n const deleteVertex = () => {\r\n changeVertex(PolygonVertexAction.Delete);\r\n };\r\n\r\n const changeVertex = (action: PolygonVertexAction) => {\r\n if (polygon && polygon.selectedIndex >= 0) {\r\n const oldVertices = polygon.vertices.map((v) => ({ ...v })); // deep copy\r\n switch (action) {\r\n case PolygonVertexAction.Delete:\r\n deletePolygonVertexByIndex(polygon.id, polygon.selectedIndex);\r\n break;\r\n case PolygonVertexAction.InsertBeforeIndex:\r\n insertPolygonVertexBeforeIndex(polygon.id, polygon.selectedIndex);\r\n break;\r\n case PolygonVertexAction.InsertAfterIndex:\r\n insertPolygonVertexAfterIndex(polygon.id, polygon.selectedIndex);\r\n break;\r\n }\r\n const newVertices = (useStore.getState().getElementById(polygon.id) as PolygonModel).vertices.map((v) => ({\r\n ...v,\r\n }));\r\n const undoableChange = {\r\n name: action,\r\n timestamp: Date.now(),\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n oldValue: oldVertices,\r\n newValue: newVertices,\r\n undo: () => {\r\n if (undoableChange.oldValue && Array.isArray(undoableChange.oldValue)) {\r\n updatePolygonVerticesById(undoableChange.changedElementId, oldVertices as Point2[]);\r\n }\r\n },\r\n redo: () => {\r\n updatePolygonVerticesById(undoableChange.changedElementId, newVertices as Point2[]);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {i18n.t('polygonMenu.InsertVertexBeforeIndex', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.InsertVertexAfterIndex', lang)}\r\n \r\n {polygon && polygon.vertices.length > 3 && (\r\n \r\n {i18n.t('polygonMenu.DeleteVertex', lang)}\r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Checkbox, Input, Menu } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { SensorModel } from '../../../models/SensorModel';\r\nimport { ObjectType } from '../../../types';\r\nimport { useLabel, useLabelShow, useLabelText, useSelectedElement } from './menuHooks';\r\n\r\nexport const SensorMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const sensor = useSelectedElement(ObjectType.Sensor) as SensorModel | undefined;\r\n\r\n const { labelText, setLabelText } = useLabel(sensor);\r\n const showLabel = useLabelShow(sensor);\r\n const updateLabelText = useLabelText(sensor, labelText);\r\n\r\n if (!sensor) return null;\r\n\r\n const lang = { lng: language };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n \r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n \r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, InputNumber, Menu, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { LightModel } from '../../../models/LightModel';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { CompactPicker } from 'react-color';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { ObjectType } from '../../../types';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const LightMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const getParent = useStore(Selector.getParent);\r\n const updateLightInsideById = useStore(Selector.updateInsideLightById);\r\n const light = useSelectedElement(ObjectType.Light) as LightModel | undefined;\r\n\r\n const [inputIntensity, setInputIntensity] = useState(light?.intensity ?? 3);\r\n const [inputDistance, setInputDistance] = useState(light?.distance ?? 5);\r\n const [inputColor, setInputColor] = useState(light?.color ?? '#ffff99');\r\n const [inputInside, setInputInside] = useState(!!light?.inside);\r\n\r\n if (!light) return null;\r\n\r\n const lang = { lng: language };\r\n const parent = light.parentId ? getParent(light) : undefined;\r\n\r\n const updateLightColorById = (id: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Light && e.id === id) {\r\n (e as LightModel).color = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLightIntensityById = (id: string, intensity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Light && e.id === id) {\r\n (e as LightModel).intensity = intensity;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLightDistanceById = (id: string, distance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Light && e.id === id) {\r\n (e as LightModel).distance = distance;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setIntensity = (value: number) => {\r\n if (!light) return;\r\n if (!value || value === inputIntensity) return;\r\n const undoableChange = {\r\n name: 'Set Light Intensity',\r\n timestamp: Date.now(),\r\n oldValue: inputIntensity,\r\n newValue: value,\r\n changedElementId: light.id,\r\n undo: () => {\r\n updateLightIntensityById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLightIntensityById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLightIntensityById(light.id, value);\r\n setInputIntensity(value);\r\n setCommonStore((state) => {\r\n state.actionState.lightIntensity = value;\r\n });\r\n };\r\n\r\n const setDistance = (value: number) => {\r\n if (!light) return;\r\n if (!value || value === inputDistance) return;\r\n const undoableChange = {\r\n name: 'Set Light Distance',\r\n timestamp: Date.now(),\r\n oldValue: inputDistance,\r\n newValue: value,\r\n changedElementId: light.id,\r\n undo: () => {\r\n updateLightDistanceById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLightDistanceById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLightDistanceById(light.id, value);\r\n setInputDistance(value);\r\n setCommonStore((state) => {\r\n state.actionState.lightDistance = value;\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n {parent && (parent.type === ObjectType.Roof || parent.type === ObjectType.Wall) && (\r\n \r\n {\r\n if (!light) return;\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Inside Light',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n undo: () => {\r\n updateLightInsideById(light.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateLightInsideById(light.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateLightInsideById(light.id, checked);\r\n setInputInside(checked);\r\n }}\r\n >\r\n {i18n.t('lightMenu.Inside', lang)}\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {i18n.t('lightMenu.Intensity', lang)}:\r\n setIntensity(value)}\r\n />\r\n \r\n \r\n {i18n.t('lightMenu.MaximumDistance', lang)}:\r\n setDistance(value)}\r\n />\r\n \r\n \r\n\r\n \r\n {\r\n if (!light) return;\r\n const oldColor = light.color;\r\n const newColor = colorResult.hex;\r\n const undoableChange = {\r\n name: 'Set Light Color',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: newColor,\r\n undo: () => {\r\n updateLightColorById(light.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateLightColorById(light.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLightColorById(light.id, newColor);\r\n setInputColor(newColor);\r\n setCommonStore((state) => {\r\n state.actionState.lightColor = newColor;\r\n });\r\n }}\r\n />\r\n \r\n \r\n );\r\n});\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Checkbox, InputNumber, Menu, Radio, Space } from 'antd';\nimport SubMenu from 'antd/lib/menu/SubMenu';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { Theme } from '../../../types';\nimport i18n from '../../../i18n/i18n';\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport { computeSunriseAndSunsetInMinutes } from '../../../analysis/sunTools';\n\nexport const SkyMenu = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const world = useStore.getState().world;\n const axes = useStore(Selector.viewState.axes);\n const theme = useStore(Selector.viewState.theme);\n const showAzimuthAngle = useStore(Selector.viewState.showAzimuthAngle) ?? true;\n const showElevationAngle = useStore(Selector.viewState.showElevationAngle) ?? true;\n const showZenithAngle = useStore(Selector.viewState.showZenithAngle) ?? true;\n const directLightIntensity = useStore(Selector.viewState.directLightIntensity) ?? 1;\n const ambientLightIntensity = useStore(Selector.viewState.ambientLightIntensity) ?? 0.1;\n const airAttenuationCoefficient = useStore(Selector.world.airAttenuationCoefficient) ?? 0.01;\n const airConvectiveCoefficient = useStore(Selector.world.airConvectiveCoefficient) ?? 5;\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n\n const lang = { lng: language };\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(new Date(world.date), world.latitude);\n }, [world.date, world.latitude]);\n\n const radioStyle = {\n display: 'block',\n height: '30px',\n paddingLeft: '10px',\n lineHeight: '30px',\n };\n\n const setAxes = (checked: boolean) => {\n setCommonStore((state) => {\n state.viewState.axes = checked;\n });\n };\n\n const setTheme = (theme: string) => {\n setCommonStore((state) => {\n state.viewState.theme = theme;\n });\n };\n\n const setShowAzimuthAngle = (value: boolean) => {\n setCommonStore((state) => {\n state.viewState.showAzimuthAngle = value;\n });\n };\n\n const setShowElevationAngle = (value: boolean) => {\n setCommonStore((state) => {\n state.viewState.showElevationAngle = value;\n });\n };\n\n const setShowZenithAngle = (value: boolean) => {\n setCommonStore((state) => {\n state.viewState.showZenithAngle = value;\n });\n };\n\n const setDirectLightIntensity = (value: number) => {\n setCommonStore((state) => {\n state.viewState.directLightIntensity = value;\n });\n };\n\n const setAmbientLightIntensity = (value: number) => {\n setCommonStore((state) => {\n state.viewState.ambientLightIntensity = value;\n });\n };\n\n const setAirAttenuationCoefficient = (value: number) => {\n setCommonStore((state) => {\n state.world.airAttenuationCoefficient = value;\n });\n };\n\n const setAirConvectiveCoefficient = (value: number) => {\n setCommonStore((state) => {\n state.world.airConvectiveCoefficient = value;\n });\n };\n\n const setHighestTemperatureTimeInMinutes = (value: number) => {\n setCommonStore((state) => {\n state.world.highestTemperatureTimeInMinutes = value;\n });\n };\n\n return (\n \n \n {\n const checked = e.target.checked;\n const undoableCheck = {\n name: 'Show Axes',\n timestamp: Date.now(),\n checked: checked,\n undo: () => {\n setAxes(!undoableCheck.checked);\n },\n redo: () => {\n setAxes(undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setAxes(checked);\n }}\n >\n {i18n.t('skyMenu.Axes', lang)}\n \n \n\n \n {\n const oldTheme = theme;\n const newTheme = e.target.value;\n const undoableChange = {\n name: 'Select Theme',\n timestamp: Date.now(),\n oldValue: oldTheme,\n newValue: newTheme,\n undo: () => {\n setTheme(undoableChange.oldValue as string);\n },\n redo: () => {\n setTheme(undoableChange.newValue as string);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setTheme(newTheme);\n }}\n >\n \n {i18n.t('skyMenu.ThemeDefault', lang)}\n \n \n {i18n.t('skyMenu.ThemeDesert', lang)}\n \n \n {i18n.t('skyMenu.ThemeDune', lang)}\n \n \n {i18n.t('skyMenu.ThemeForest', lang)}\n \n \n {i18n.t('skyMenu.ThemeGrassland', lang)}\n \n \n {i18n.t('skyMenu.ThemeHill', lang)}\n \n \n {i18n.t('skyMenu.ThemeLake', lang)}\n \n \n {i18n.t('skyMenu.ThemeMountain', lang)}\n \n \n {i18n.t('skyMenu.ThemeRural', lang)}\n \n \n \n\n \n \n \n {\n const oldValue = showAzimuthAngle;\n const newValue = e.target.checked;\n const undoableChange = {\n name: 'Show Azimuth Angle ' + newValue,\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setShowAzimuthAngle(undoableChange.oldValue as boolean);\n },\n redo: () => {\n setShowAzimuthAngle(undoableChange.newValue as boolean);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setShowAzimuthAngle(newValue);\n }}\n >\n {i18n.t('skyMenu.ShowAzimuthAngle', lang)}\n \n \n \n {\n const oldValue = showElevationAngle;\n const newValue = e.target.checked;\n const undoableChange = {\n name: 'Show Elevation Angle ' + newValue,\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setShowElevationAngle(undoableChange.oldValue as boolean);\n },\n redo: () => {\n setShowElevationAngle(undoableChange.newValue as boolean);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setShowElevationAngle(newValue);\n }}\n >\n {i18n.t('skyMenu.ShowElevationAngle', lang)}\n \n \n \n {\n const oldValue = showZenithAngle;\n const newValue = e.target.checked;\n const undoableChange = {\n name: 'Show Zenith Angle ' + newValue,\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setShowZenithAngle(undoableChange.oldValue as boolean);\n },\n redo: () => {\n setShowZenithAngle(undoableChange.newValue as boolean);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setShowZenithAngle(newValue);\n }}\n >\n {i18n.t('skyMenu.ShowZenithAngle', lang)}\n \n \n \n \n\n \n \n {i18n.t('skyMenu.DirectLightBrightnessAtNoon', lang) + ' [0.1-5]:'}\n {\n if (value) {\n const oldValue = directLightIntensity;\n const newValue = value;\n const undoableChange = {\n name: 'Set Direct Light Intensity',\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setDirectLightIntensity(undoableChange.oldValue as number);\n },\n redo: () => {\n setDirectLightIntensity(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setDirectLightIntensity(newValue);\n }\n }}\n />\n \n\n \n \n {i18n.t('skyMenu.AmbientLightBrightnessAtNoon', lang) + ' [0.01-1]:'}\n \n {\n if (value) {\n const oldValue = ambientLightIntensity;\n const newValue = value;\n const undoableChange = {\n name: 'Set Ambient Light Intensity',\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setAmbientLightIntensity(undoableChange.oldValue as number);\n },\n redo: () => {\n setAmbientLightIntensity(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setAmbientLightIntensity(newValue);\n }\n }}\n />\n \n\n \n {i18n.t('skyMenu.SunlightAttenuationCoefficientInAir', lang) + ':'}\n {\n if (value) {\n const oldAttenuationCoefficient = airAttenuationCoefficient;\n const newAttenuationCoefficient = value;\n const undoableChange = {\n name: 'Set Sunlight Attenuation Coefficient of Air',\n timestamp: Date.now(),\n oldValue: oldAttenuationCoefficient,\n newValue: newAttenuationCoefficient,\n undo: () => {\n setAirAttenuationCoefficient(undoableChange.oldValue as number);\n },\n redo: () => {\n setAirAttenuationCoefficient(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setAirAttenuationCoefficient(newAttenuationCoefficient);\n }\n }}\n />\n \n\n \n \n {i18n.t('skyMenu.ConvectiveCoefficientOfAir', lang) + ' [W/(m²×K)]:'}\n \n {\n if (value) {\n const oldConvectiveCoefficient = airConvectiveCoefficient;\n const newConvectiveCoefficient = value;\n const undoableChange = {\n name: 'Set Convective Coefficient of Air',\n timestamp: Date.now(),\n oldValue: oldConvectiveCoefficient,\n newValue: newConvectiveCoefficient,\n undo: () => {\n setAirConvectiveCoefficient(undoableChange.oldValue as number);\n },\n redo: () => {\n setAirConvectiveCoefficient(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setAirConvectiveCoefficient(newConvectiveCoefficient);\n }\n }}\n />\n \n\n \n {i18n.t('skyMenu.HighestTemperatureTimeInMinutes', lang) + ':'}\n {\n if (value) {\n const oldMinutes = highestTemperatureTimeInMinutes;\n const newMinutes = value;\n const undoableChange = {\n name: 'Set Time of Highest Temperature in Minutes',\n timestamp: Date.now(),\n oldValue: oldMinutes,\n newValue: newMinutes,\n undo: () => {\n setHighestTemperatureTimeInMinutes(undoableChange.oldValue as number);\n },\n redo: () => {\n setHighestTemperatureTimeInMinutes(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setHighestTemperatureTimeInMinutes(newMinutes);\n }\n }}\n />\n \n \n \n );\n};\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nexport class SolarPanelNominalSize {\n static instance = new SolarPanelNominalSize();\n\n private readonly n = 14;\n readonly nominalStrings = new Array(this.n);\n readonly nominalWidths = new Array(this.n);\n readonly nominalHeights = new Array(this.n);\n readonly cellNx = new Array(this.n);\n readonly cellNy = new Array(this.n);\n\n private constructor() {\n // common residential size\n this.nominalWidths[0] = 0.99;\n this.nominalHeights[0] = 1.65;\n this.cellNx[0] = 6;\n this.cellNy[0] = 10;\n\n // common commercial size\n this.nominalWidths[1] = 0.99;\n this.nominalHeights[1] = 1.96;\n this.cellNx[1] = 6;\n this.cellNy[1] = 12;\n\n // SunPower E and X Series\n this.nominalWidths[2] = 1.05;\n this.nominalHeights[2] = 1.56;\n this.cellNx[2] = 8;\n this.cellNy[2] = 12;\n\n // ASP\n this.nominalWidths[3] = 1.31;\n this.nominalHeights[3] = 1.96;\n this.cellNx[3] = 8;\n this.cellNy[3] = 12;\n\n // SunPower E20 COM Series\n this.nominalWidths[4] = 1.07;\n this.nominalHeights[4] = 2.07;\n this.cellNx[4] = 8;\n this.cellNy[4] = 16;\n\n // First Solar Series 2, 4\n this.nominalWidths[5] = 0.6;\n this.nominalHeights[5] = 1.2;\n this.cellNx[5] = 10;\n this.cellNy[5] = 20;\n\n // First Solar Series 6\n this.nominalWidths[6] = 1.2;\n this.nominalHeights[6] = 2.0;\n this.cellNx[6] = 10;\n this.cellNy[6] = 20;\n\n // SunPower P17 Series\n this.nominalWidths[7] = 1.0;\n this.nominalHeights[7] = 2.07;\n this.cellNx[7] = 6;\n this.cellNy[7] = 12;\n\n // SunPower E20-245, E19-235, X20-250-BLK\n this.nominalWidths[8] = 0.8;\n this.nominalHeights[8] = 1.56;\n this.cellNx[8] = 6;\n this.cellNy[8] = 12;\n\n // Sharp NT-175UC1\n this.nominalWidths[9] = 0.83;\n this.nominalHeights[9] = 1.58;\n this.cellNx[9] = 6;\n this.cellNy[9] = 12;\n\n // YL165P-23b\n this.nominalWidths[10] = 0.99;\n this.nominalHeights[10] = 1.31;\n this.cellNx[10] = 6;\n this.cellNy[10] = 8;\n\n // YL205P-26b\n this.nominalWidths[11] = 0.99;\n this.nominalHeights[11] = 1.5;\n this.cellNx[11] = 6;\n this.cellNy[11] = 9;\n\n // SunPower Maxeon 3 Series\n this.nominalWidths[12] = 1.05;\n this.nominalHeights[12] = 1.81;\n this.cellNx[12] = 8;\n this.cellNy[12] = 14;\n\n // SunPower Maxeon 2 Series\n this.nominalWidths[13] = 1.05;\n this.nominalHeights[13] = 1.69;\n this.cellNx[13] = 8;\n this.cellNy[13] = 13;\n\n for (let i = 0; i < this.n; i++) {\n this.nominalStrings[i] =\n this.nominalWidths[i].toFixed(2) +\n 'm × ' +\n this.nominalHeights[i].toFixed(2) +\n 'm (' +\n this.cellNx[i] +\n ' × ' +\n this.cellNy[i] +\n ' cells)';\n }\n }\n}\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Col, Input, InputNumber, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { SolarPanelNominalSize } from '../../../models/SolarPanelNominalSize';\r\nimport { ObjectType, Orientation, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst { Option } = Select;\r\n\r\nconst SolarPanelModelSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const pvModules = useStore(Selector.pvModules);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [selectedPvModel, setSelectedPvModel] = useState(solarPanel?.pvModelName ?? 'SPR-X21-335-BLK');\r\n const [panelSizeString, setPanelSizeString] = useState();\r\n\r\n const lang = useLanguage();\r\n const pvModel = getPvModule(selectedPvModel ?? 'SPR-X21-335-BLK');\r\n\r\n useEffect(() => {\r\n setPanelSizeString(\r\n pvModel.nominalWidth.toFixed(2) +\r\n 'm×' +\r\n pvModel.nominalLength.toFixed(2) +\r\n 'm (' +\r\n pvModel.n +\r\n '×' +\r\n pvModel.m +\r\n ' ' +\r\n i18n.t('pvModelPanel.Cells', lang) +\r\n ')',\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pvModel]);\r\n\r\n const updateSolarPanelModelById = (id: string, pvModelName: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = pvModelName;\r\n const pvModel = state.pvModules[pvModelName];\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelModelAboveFoundation = (foundationId: string, pvModelName: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n const pvModel = state.pvModules[pvModelName];\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = pvModelName;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelModelOnSurface = (parentId: string, normal: number[] | undefined, pvModelName: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n const pvModel = state.pvModules[pvModelName];\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = pvModelName;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelModelForAll = (pvModelName: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n const pvModel = state.pvModules[pvModelName];\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = pvModelName;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n const pvModel = state.pvModules[value];\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = value;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (pvModelName: string) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (solarPanel?.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setPvModel = (value: string) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldModelsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldModelsSelected.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Model for Selected Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldModelsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, model] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelModelById(id, model as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldModelsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldModelsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldModelsAll.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Model for All Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldModelsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, model] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelModelById(id, model as string);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelModelForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelModelForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldModelsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldModelsAboveFoundation.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Model for All Solar Panels Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldModelsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, model] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelModelById(id, model as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelModelAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelModelAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldModelsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldModelsOnSurface.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldModelsOnSurface.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Model for All Solar Panels on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldModelsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, model] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelModelById(id, model as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelModelOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelModelOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldModel = sp ? sp.pvModelName : solarPanel.pvModelName;\r\n const undoableChange = {\r\n name: 'Set Model for Selected Solar Panel',\r\n timestamp: Date.now(),\r\n oldValue: oldModel,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelModelById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateSolarPanelModelById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelModelById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelModelName = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPvModel(selectedPvModel);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.Model', lang) +\r\n ' (' +\r\n Object.keys(pvModules).length +\r\n ' ' +\r\n i18n.t('word.Options', lang) +\r\n '):'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.PanelSize', lang) + ':'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n >\r\n {SolarPanelNominalSize.instance.nominalStrings.map((key) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.CellType', lang) + ':'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.BifacialityFactor', lang) + ':'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('word.Color', lang) + ':'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.SolarCellEfficiency', lang) + ' (%):'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.NominalOperatingCellTemperature', lang) + ' (°C):'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.TemperatureCoefficientOfPmax', lang) + ' (%/°C):'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('word.ApplyTo', lang) + ':'}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelModelSelection;\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport { Checkbox, Divider, Menu, Modal, Radio } from 'antd';\nimport SubMenu from 'antd/lib/menu/SubMenu';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { Copy, Cut, Lock, Paste } from '../menuItems';\nimport i18n from '../../../i18n/i18n';\nimport WallTextureSelection from './wallTextureSelection';\nimport WallColorSelection from './wallColorSelection';\nimport { ParapetArgs, WallFill, WallModel, WallStructure } from 'src/models/WallModel';\nimport { ObjectType, WallTexture } from 'src/types';\nimport { ElementCounter } from '../../../stores/ElementCounter';\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\nimport { UndoableRemoveAllChildren } from '../../../undo/UndoableRemoveAllChildren';\nimport { Util } from 'src/Util';\nimport { UndoableChange } from 'src/undo/UndoableChange';\nimport WallStructureColorSelection from './wallStructureColorSelection';\nimport WallNumberInput from './wallNumberInput';\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\nimport { LightModel } from '../../../models/LightModel';\nimport WallRValueInput from './wallRValueInput';\nimport WallHeatCapacityInput from './wallHeatCapacityInput';\nimport { Euler, Vector3 } from 'three';\nimport { UndoableAdd } from '../../../undo/UndoableAdd';\nimport { ElementModelFactory } from '../../../models/ElementModelFactory';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { UndoableCheck } from 'src/undo/UndoableCheck';\nimport WallParapetNumberInput from './wallParapetNumberInput';\nimport WallParapetColorSelection from './wallParapetColorSelection';\nimport WallParapetTextureSelection from './wallParapetTextureSelection';\nimport { useSelectedElement } from './menuHooks';\n\nenum DataType {\n Height = 'Height',\n Opacity = 'Opacity',\n StructureSpacing = 'StructureSpacing',\n StructureWidth = 'StructureWidth',\n Thickness = 'Thickness',\n StructureColor = 'StructureColor',\n Color = 'Color',\n Texture = 'Texture',\n EavesLength = 'EavesLength',\n ParapetColor = 'ParapetColor',\n ParapetTexture = 'ParapetTexture',\n ParapetHeight = 'ParapetHeight',\n CopingsHeight = 'CopingsHeight',\n CopingsWidth = 'CopingsWidth',\n}\n\ntype NumberDialogSettingType = {\n attributeKey: keyof WallModel;\n range: [min: number, max: number];\n step: number;\n unit?: string;\n};\n\ntype ParapetNumberDialogSettingType = {\n attributeKey: keyof ParapetArgs;\n range: [min: number, max: number];\n step: number;\n unit?: string;\n};\n\nconst DialogSetting = {\n Height: { attributeKey: 'lz', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation' },\n Opacity: { attributeKey: 'opacity', range: [0, 1], step: 0.01 },\n StructureSpacing: { attributeKey: 'structureSpacing', range: [0.1, 1000], step: 0.1, unit: 'word.MeterAbbreviation' },\n StructureWidth: { attributeKey: 'structureWidth', range: [0.01, 1], step: 0.1, unit: 'word.MeterAbbreviation' },\n Thickness: { attributeKey: 'ly', range: [0.1, 1], step: 0.01, unit: 'word.MeterAbbreviation' },\n EavesLength: { attributeKey: 'eavesLength', range: [-0.1, 5], step: 0.01, unit: 'word.MeterAbbreviation' },\n ParapetHeight: { attributeKey: 'parapetHeight', range: [0, 5], step: 0.01, unit: 'word.MeterAbbreviation' },\n CopingsHeight: { attributeKey: 'copingsHeight', range: [0, 1], step: 0.01, unit: 'word.MeterAbbreviation' },\n CopingsWidth: { attributeKey: 'copingsWidth', range: [0, 3], step: 0.01, unit: 'word.MeterAbbreviation' },\n};\n\nconst ParapetDialogSetting = {\n ParapetHeight: { attributeKey: 'parapetHeight', range: [0, 5], step: 0.01, unit: 'word.MeterAbbreviation' },\n CopingsHeight: { attributeKey: 'copingsHeight', range: [0, 1], step: 0.01, unit: 'word.MeterAbbreviation' },\n CopingsWidth: { attributeKey: 'copingsWidth', range: [0, 3], step: 0.01, unit: 'word.MeterAbbreviation' },\n};\n\nexport const radioStyle = {\n display: 'block',\n height: '30px',\n paddingLeft: '10px',\n lineHeight: '30px',\n};\n\nexport const WallMenu = React.memo(() => {\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const setApplyCount = useStore(Selector.setApplyCount);\n const countAllOffspringsByType = useStore(Selector.countAllOffspringsByTypeAtOnce);\n const removeAllChildElementsByType = useStore(Selector.removeAllChildElementsByType);\n const addUndoable = useStore(Selector.addUndoable);\n const updateElementLockById = useStore(Selector.updateElementLockById);\n const updateElementUnlockByParentId = useStore(Selector.updateElementLockByParentId);\n const updateInsideLightsByParentId = useStore(Selector.updateInsideLightsByParentId);\n const updateInsideLightById = useStore(Selector.updateInsideLightById);\n const removeElementById = useStore(Selector.removeElementById);\n const getFoundation = useStore(Selector.getFoundation);\n\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\n\n const [dataType, setDataType] = useState(null);\n const [rValueDialogVisible, setRValueDialogVisible] = useState(false);\n const [heatCapacityDialogVisible, setHeatCapacityDialogVisible] = useState(false);\n\n if (!wall) return null;\n\n const lang = { lng: language };\n const paddingLeft = '36px';\n\n const updateParapetDisplayById = (id: string, display: boolean) => {\n setCommonStore((state) => {\n const wall = state.elements.find((e) => e.id === id && e.type === ObjectType.Wall) as WallModel;\n if (!wall) return;\n wall.parapet.display = display;\n });\n };\n\n const updateWallStructureById = (id: string, structure: WallStructure) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Wall) {\n const wallModel = e as WallModel;\n wallModel.wallStructure = structure;\n if (structure === WallStructure.Stud || structure === WallStructure.Pillar) {\n wallModel.opacity = 0;\n }\n break;\n }\n }\n });\n };\n\n const legalToPaste = () => {\n const elementsToPaste = useStore.getState().elementsToPaste;\n if (elementsToPaste && elementsToPaste.length > 0) {\n const e = elementsToPaste[0];\n if (Util.isLegalOnWall(e.type)) {\n return true;\n }\n }\n return false;\n };\n\n const handleClearOk = (objectType: ObjectType) => {\n if (wall) {\n const removed = useStore\n .getState()\n .elements.filter((e) => !e.locked && e.type === objectType && e.parentId === wall.id);\n removeAllChildElementsByType(wall.id, objectType);\n const removedElements = JSON.parse(JSON.stringify(removed));\n const undoableRemoveAllChildren = {\n name: `Remove All ${objectType}s on Wall`,\n timestamp: Date.now(),\n parentId: wall.id,\n removedElements: removedElements,\n undo: () => {\n setCommonStore((state) => {\n state.elements.push(...undoableRemoveAllChildren.removedElements);\n });\n },\n redo: () => {\n removeAllChildElementsByType(undoableRemoveAllChildren.parentId, objectType);\n },\n } as UndoableRemoveAllChildren;\n addUndoable(undoableRemoveAllChildren);\n }\n };\n\n const updateWallFillById = (id: string, fill: WallFill) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Wall) {\n (e as WallModel).fill = fill;\n break;\n }\n }\n });\n };\n\n const updateOpenToOutsideById = (id: string, open: boolean) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Wall) {\n (e as WallModel).openToOutside = open;\n break;\n }\n }\n });\n };\n\n const renderCopy = () => ;\n\n const renderLock = () => ;\n\n const renderCut = () => {\n if (!wall || wall.locked) {\n return null;\n }\n return ;\n };\n\n const renderPaste = () => {\n if (!legalToPaste()) {\n return null;\n }\n return ;\n };\n\n const renderParapetSubMenu = () => {\n if (!wall) return null;\n\n return (\n \n \n {\n const checked = e.target.checked;\n const undoableCheck = {\n name: 'Parapet',\n timestamp: Date.now(),\n checked: checked,\n selectedElementId: wall.id,\n selectedElementType: wall.type,\n undo: () => {\n updateParapetDisplayById(wall.id, !undoableCheck.checked);\n },\n redo: () => {\n updateParapetDisplayById(wall.id, undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n updateParapetDisplayById(wall.id, checked);\n setCommonStore((state) => {\n state.actionState.wallParapet.display = checked;\n });\n }}\n >\n {i18n.t('wallMenu.Parapet', { lng: language })}\n \n \n\n \n\n {renderMenuItem(DataType.ParapetColor)}\n {renderMenuItem(DataType.ParapetTexture)}\n {renderMenuItem(DataType.ParapetHeight)}\n {renderMenuItem(DataType.CopingsHeight)}\n {renderMenuItem(DataType.CopingsWidth)}\n \n );\n };\n\n const renderFillSubMenu = () => {\n if (!wall) {\n return null;\n }\n return (\n \n {\n const undoableChange = {\n name: 'Select Wall Fill',\n timestamp: Date.now(),\n oldValue: wall.fill,\n newValue: e.target.value,\n changedElementId: wall.id,\n changedElementType: wall.type,\n undo: () => {\n updateWallFillById(undoableChange.changedElementId, undoableChange.oldValue as WallFill);\n },\n redo: () => {\n updateWallFillById(undoableChange.changedElementId, undoableChange.newValue as WallFill);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateWallFillById(wall.id, e.target.value);\n }}\n >\n \n {i18n.t('wallMenu.Full', lang)}\n \n \n {i18n.t('wallMenu.Partial', lang)}\n \n \n {i18n.t('wallMenu.Empty', lang)}\n \n \n {wall.fill !== WallFill.Full && (\n
\n {\n const undoableChange = {\n name: 'Set Open to Outside',\n timestamp: Date.now(),\n oldValue: !!wall.openToOutside,\n newValue: e.target.checked,\n changedElementId: wall.id,\n changedElementType: wall.type,\n undo: () => {\n updateOpenToOutsideById(undoableChange.changedElementId, undoableChange.oldValue as boolean);\n },\n redo: () => {\n updateOpenToOutsideById(undoableChange.changedElementId, undoableChange.newValue as boolean);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateOpenToOutsideById(wall.id, e.target.checked);\n }}\n >\n {i18n.t('wallMenu.OpenToOutside', lang)}\n \n
\n )}\n
\n );\n };\n\n const renderStructureSubMenu = () => {\n if (!wall) {\n return null;\n }\n return (\n \n {\n const undoableChange = {\n name: 'Select Wall Structure',\n timestamp: Date.now(),\n oldValue: wall.wallStructure,\n newValue: e.target.value,\n changedElementId: wall.id,\n changedElementType: wall.type,\n undo: () => {\n updateWallStructureById(undoableChange.changedElementId, undoableChange.oldValue as WallStructure);\n },\n redo: () => {\n updateWallStructureById(undoableChange.changedElementId, undoableChange.newValue as WallStructure);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateWallStructureById(wall.id, e.target.value);\n setCommonStore((state) => {\n state.actionState.wallStructure = e.target.value;\n if (\n state.actionState.wallStructure === WallStructure.Stud ||\n state.actionState.wallStructure === WallStructure.Pillar\n ) {\n state.actionState.wallOpacity = 0;\n }\n });\n }}\n >\n \n {i18n.t('wallMenu.DefaultStructure', lang)}\n \n \n {i18n.t('wallMenu.StudStructure', lang)}\n \n \n {i18n.t('wallMenu.PillarStructure', lang)}\n \n \n \n );\n };\n\n const renderStructureItems = () => {\n if (wall?.wallStructure === WallStructure.Stud || wall?.wallStructure === WallStructure.Pillar) {\n return (\n <>\n {renderMenuItem(DataType.StructureSpacing)}\n\n {renderMenuItem(DataType.StructureWidth)}\n\n {renderMenuItem(DataType.StructureColor)}\n\n {renderMenuItem(DataType.Opacity)}\n \n );\n }\n return null;\n };\n\n const renderMenuItem = (dataType: DataType) => {\n return (\n {\n setApplyCount(0);\n setDataType(dataType);\n }}\n >\n {i18n.t(`wallMenu.${dataType}`, lang)} ...\n \n );\n };\n\n const renderTexture = () => {\n if (wall?.wallStructure === WallStructure.Default) {\n return renderMenuItem(DataType.Texture);\n }\n return null;\n };\n\n const renderWallColor = () => {\n if (\n (wall?.wallStructure === WallStructure.Default || wall?.opacity === undefined || wall?.opacity > 0) &&\n (wall?.textureType === WallTexture.NoTexture || wall?.textureType === WallTexture.Default)\n ) {\n return renderMenuItem(DataType.Color);\n }\n return null;\n };\n\n const renderClearItem = (objectType: ObjectType, count: number) => {\n if (count === 0) return null;\n\n const titleText = (type: string, count: number) =>\n `${i18n.t(`wallMenu.DoYouReallyWantToRemoveAll${type}sOnThisWall`, lang)} (${count} ${i18n.t(\n `wallMenu.${type}s`,\n lang,\n )})?`;\n\n const objectTypeText = objectType.replaceAll(' ', '');\n\n return (\n {\n Modal.confirm({\n title: titleText(objectTypeText, count),\n icon: ,\n onOk: () => {\n handleClearOk(objectType);\n },\n });\n }}\n >\n {i18n.t(`wallMenu.RemoveAllUnlocked${objectTypeText}s`, lang)} ({count})\n \n );\n };\n\n const renderLockItem = (objectType: ObjectType, count: number) => {\n if (count === 0) return null;\n const objectTypeText = objectType.replaceAll(' ', '');\n return (\n {\n if (!wall) return;\n const oldLocks = new Map();\n for (const elem of useStore.getState().elements) {\n if (elem.parentId === wall.id && elem.type === objectType) {\n oldLocks.set(elem.id, !!elem.locked);\n }\n }\n updateElementUnlockByParentId(wall.id, objectType, true);\n const undoableLockAllElementsOfType = {\n name: 'Lock All ' + objectTypeText + ' on Wall',\n timestamp: Date.now(),\n oldValues: oldLocks,\n newValue: true,\n undo: () => {\n for (const [id, locked] of undoableLockAllElementsOfType.oldValues.entries()) {\n updateElementLockById(id, locked as boolean);\n }\n },\n redo: () => {\n updateElementUnlockByParentId(wall.id, objectType, true);\n },\n } as UndoableChangeGroup;\n addUndoable(undoableLockAllElementsOfType);\n }}\n >\n {i18n.t(`wallMenu.LockAll${objectTypeText}s`, lang)} ({count})\n \n );\n };\n\n const renderUnlockItem = (objectType: ObjectType, count: number) => {\n if (count === 0) return null;\n const objectTypeText = objectType.replaceAll(' ', '');\n return (\n {\n if (!wall) return;\n const oldLocks = new Map();\n for (const elem of useStore.getState().elements) {\n if (elem.parentId === wall.id && elem.type === objectType) {\n oldLocks.set(elem.id, !!elem.locked);\n }\n }\n updateElementUnlockByParentId(wall.id, objectType, false);\n const undoableUnlockAllElementsOfType = {\n name: 'Unlock All ' + objectTypeText + ' on Wall',\n timestamp: Date.now(),\n oldValues: oldLocks,\n newValue: true,\n undo: () => {\n for (const [id, locked] of undoableUnlockAllElementsOfType.oldValues.entries()) {\n updateElementLockById(id, locked as boolean);\n }\n },\n redo: () => {\n updateElementUnlockByParentId(wall.id, objectType, false);\n },\n } as UndoableChangeGroup;\n addUndoable(undoableUnlockAllElementsOfType);\n }}\n >\n {i18n.t(`wallMenu.UnlockAll${objectTypeText}s`, lang)}\n \n );\n };\n\n const renderInsideLightItem = (count: number, inside: boolean) => {\n if (count === 0) return null;\n return (\n {\n if (!wall) return;\n const oldValues = new Map();\n for (const elem of useStore.getState().elements) {\n if (elem.parentId === wall.id && elem.type === ObjectType.Light) {\n oldValues.set(elem.id, (elem as LightModel).inside);\n }\n }\n updateInsideLightsByParentId(wall.id, inside);\n const undoableInsideLightsOnWall = {\n name: inside ? 'Set All Lights on Wall Inside' : 'Set All Lights on Wall Outside',\n timestamp: Date.now(),\n oldValues: oldValues,\n newValue: true,\n undo: () => {\n for (const [id, inside] of undoableInsideLightsOnWall.oldValues.entries()) {\n updateInsideLightById(id, inside as boolean);\n }\n },\n redo: () => {\n updateInsideLightsByParentId(wall.id, inside);\n },\n } as UndoableChangeGroup;\n addUndoable(undoableInsideLightsOnWall);\n }}\n >\n {i18n.t(inside ? `wallMenu.AllLightsOnWallInside` : `wallMenu.AllLightsOnWallOutside`, lang)} ({count})\n \n );\n };\n\n const renderElementsSubMenu = () => {\n const counterAll = wall ? countAllOffspringsByType(wall.id, true) : new ElementCounter();\n if (counterAll.gotSome() && useStore.getState().contextMenuObjectType) {\n const counterUnlocked = wall ? countAllOffspringsByType(wall.id, false) : new ElementCounter();\n return (\n \n {renderClearItem(ObjectType.Window, counterUnlocked.windowCount)}\n {renderClearItem(ObjectType.Door, counterUnlocked.doorCount)}\n {renderClearItem(ObjectType.SolarPanel, counterUnlocked.solarPanelCount)}\n {renderClearItem(ObjectType.Sensor, counterUnlocked.sensorCount)}\n {renderClearItem(ObjectType.Light, counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount)}\n {renderClearItem(ObjectType.Polygon, counterUnlocked.polygonCount)}\n {renderLockItem(ObjectType.Window, counterUnlocked.windowCount)}\n {renderUnlockItem(ObjectType.Window, counterAll.windowCount)}\n {renderLockItem(ObjectType.SolarPanel, counterUnlocked.solarPanelCount)}\n {renderUnlockItem(ObjectType.SolarPanel, counterAll.solarPanelCount)}\n {renderLockItem(ObjectType.Sensor, counterUnlocked.sensorCount)}\n {renderUnlockItem(ObjectType.Sensor, counterAll.sensorCount)}\n {renderInsideLightItem(counterAll.outsideLightCount, true)}\n {renderInsideLightItem(counterAll.insideLightCount, false)}\n {renderLockItem(ObjectType.Polygon, counterUnlocked.polygonCount)}\n {renderUnlockItem(ObjectType.Polygon, counterAll.polygonCount)}\n \n );\n }\n return null;\n };\n\n const renderDialogs = () => {\n switch (dataType) {\n case DataType.Height:\n case DataType.Opacity:\n case DataType.Thickness:\n case DataType.StructureSpacing:\n case DataType.StructureWidth:\n case DataType.EavesLength: {\n const setting = DialogSetting[dataType] as NumberDialogSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n unit={setting.unit ? i18n.t(setting.unit, lang) : undefined}\n />\n );\n }\n case DataType.ParapetHeight:\n case DataType.CopingsHeight:\n case DataType.CopingsWidth: {\n const setting = ParapetDialogSetting[dataType] as ParapetNumberDialogSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n unit={setting.unit ? i18n.t(setting.unit, lang) : undefined}\n />\n );\n }\n case DataType.Color:\n return setDataType(null)} />;\n case DataType.StructureColor:\n return setDataType(null)} />;\n case DataType.ParapetColor:\n return setDataType(null)} />;\n case DataType.Texture:\n return setDataType(null)} />;\n case DataType.ParapetTexture:\n return setDataType(null)} />;\n }\n };\n\n const getRelativePosOnWall = (p: Vector3, wall: WallModel, foundation: FoundationModel) => {\n const { cx, cy, cz } = wall;\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n if (foundation && wallAbsAngle !== undefined) {\n const wallAbsPos = Util.wallAbsolutePosition(new Vector3(cx, cy, cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n return new Vector3().subVectors(p, wallAbsPos).applyEuler(new Euler(0, 0, -wallAbsAngle));\n }\n return new Vector3();\n };\n\n return (\n \n {renderPaste()}\n\n {renderCopy()}\n\n {renderCut()}\n\n {renderLock()}\n\n {!wall.locked && (\n <>\n {renderDialogs()}\n\n {renderElementsSubMenu()}\n\n {renderParapetSubMenu()}\n\n {renderStructureSubMenu()}\n\n {renderStructureItems()}\n\n {\n if (wall) {\n const foundation = getFoundation(wall);\n if (foundation) {\n const p = getRelativePosOnWall(useStore.getState().pastePoint, wall, foundation);\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.Polygon;\n });\n const polygon = ElementModelFactory.makePolygon(\n wall,\n -p.x / wall.lx,\n 0,\n -p.z / wall.lz,\n new Vector3(0, 0, 1),\n [0, 0, 0],\n ObjectType.Wall,\n );\n setCommonStore((state) => {\n state.elements.push(polygon);\n state.objectTypeToAdd = ObjectType.None;\n });\n const undoableAdd = {\n name: 'Add',\n timestamp: Date.now(),\n addedElement: polygon,\n undo: () => {\n removeElementById(undoableAdd.addedElement.id, false);\n },\n redo: () => {\n setCommonStore((state) => {\n state.elements.push(undoableAdd.addedElement);\n state.selectedElement = undoableAdd.addedElement;\n });\n },\n } as UndoableAdd;\n addUndoable(undoableAdd);\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n });\n }\n }\n }}\n >\n {i18n.t('foundationMenu.AddPolygon', lang)}\n \n\n {renderFillSubMenu()}\n\n {renderMenuItem(DataType.Thickness)}\n\n {renderMenuItem(DataType.Height)}\n\n {renderMenuItem(DataType.EavesLength)}\n\n {/* r-value has its special UI */}\n {rValueDialogVisible && }\n {\n setApplyCount(0);\n setRValueDialogVisible(true);\n }}\n >\n {i18n.t('word.RValue', lang)} ...\n \n {heatCapacityDialogVisible && }\n {\n setApplyCount(0);\n setHeatCapacityDialogVisible(true);\n }}\n >\n {i18n.t('word.VolumetricHeatCapacity', lang)} ...\n \n\n {renderTexture()}\n\n {renderWallColor()}\n \n )}\n \n );\n});\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ElementState, ObjectType, Orientation, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { UNIT_VECTOR_POS_Z_ARRAY } from '../../../constants';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst { Option } = Select;\r\n\r\nconst SolarPanelOrientationSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const getParent = useStore(Selector.getParent);\r\n const setElementSize = useStore(Selector.setElementSize);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [selectedOrientation, setSelectedOrientation] = useState(\r\n solarPanel?.orientation ?? Orientation.portrait,\r\n );\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSolarPanelOrientationById = (id: string, orientation: Orientation) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, orientation);\r\n if (sp.parentType === ObjectType.Wall) {\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelOrientationAboveFoundation = (foundationId: string, orientation: Orientation) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, orientation);\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelOrientationOnSurface = (\r\n parentId: string,\r\n normal: number[] | undefined,\r\n orientation: Orientation,\r\n ) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n let updateWall = false;\r\n\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, orientation);\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelOrientationForAll = (orientation: Orientation) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, orientation);\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: Orientation) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n // cannot use the stored dx, dy in the following calculation\r\n // as changing orientation does not cause it to update\r\n const changeOrientation = (value: Orientation) => {\r\n if (solarPanel) {\r\n const pvModel = getPvModule(solarPanel.pvModelName);\r\n if (value === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(solarPanel.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(solarPanel.ly / pvModel.length));\r\n setElementSize(solarPanel.id, nx * pvModel.width, ny * pvModel.length);\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(solarPanel.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(solarPanel.ly / pvModel.width));\r\n setElementSize(solarPanel.id, nx * pvModel.length, ny * pvModel.width);\r\n }\r\n updateSolarPanelOrientationById(solarPanel.id, value);\r\n }\r\n };\r\n\r\n const withinParent = (sp: SolarPanelModel, orientation: Orientation) => {\r\n const parent = getParent(sp);\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid && !Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // TODO: cuboid vertical sides\r\n return true;\r\n }\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.orientation = orientation;\r\n const pvModel = getPvModule(clone.pvModelName);\r\n if (orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(clone.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(clone.ly / pvModel.length));\r\n clone.lx = nx * pvModel.width;\r\n clone.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(clone.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(clone.ly / pvModel.width));\r\n clone.lx = nx * pvModel.length;\r\n clone.ly = ny * pvModel.width;\r\n }\r\n if (parent.type === ObjectType.Wall) {\r\n // maybe outside bound or overlap with others\r\n return Util.checkElementOnWallState(clone, parent) === ElementState.Valid;\r\n }\r\n if (parent.type === ObjectType.Roof) {\r\n return Util.checkElementOnRoofState(clone, parent as RoofModel) === ElementState.Valid;\r\n }\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (sp: SolarPanelModel, orientation: Orientation) => {\r\n // check if the new orientation will cause the solar panel to be out of the bound\r\n if (!withinParent(sp, orientation)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (orientation: Orientation) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (solarPanel?.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setOrientation = (value: Orientation) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(solarPanel.orientation);\r\n } else {\r\n const oldOrientationsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldOrientationsSelected.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Orientation for Selected Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldOrientationsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, orientation] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelOrientationById(id, orientation as Orientation);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as Orientation,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldOrientationsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(solarPanel.orientation);\r\n } else {\r\n const oldOrientationsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldOrientationsAll.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Orientation for All Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldOrientationsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, orientation] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelOrientationById(id, orientation as Orientation);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelOrientationForAll(undoableChangeAll.newValue as Orientation);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelOrientationForAll(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(solarPanel.orientation);\r\n } else {\r\n const oldOrientationsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldOrientationsAboveFoundation.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Orientation for All Solar Panels Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldOrientationsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, orientation] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelOrientationById(id, orientation as Orientation);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelOrientationAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as Orientation,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelOrientationAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(solarPanel.orientation);\r\n } else {\r\n const oldOrientationsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldOrientationsOnSurface.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldOrientationsOnSurface.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Orientation for All Solar Panels on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldOrientationsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, orientation] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelOrientationById(id, orientation as Orientation);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelOrientationOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as Orientation,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelOrientationOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldOrientation = sp ? sp.orientation : solarPanel.orientation;\r\n rejectRef.current = rejectChange(solarPanel, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(oldOrientation);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Orientation of Selected Solar Panel',\r\n timestamp: Date.now(),\r\n oldValue: oldOrientation,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n changeOrientation(undoableChange.oldValue as Orientation);\r\n },\r\n redo: () => {\r\n changeOrientation(undoableChange.newValue as Orientation);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n changeOrientation(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelOrientation = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n if (!solarPanel) return;\r\n setSelectedOrientation(solarPanel.orientation);\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setOrientation(selectedOrientation);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setOrientation(selectedOrientation);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current\r\n ? ' (' +\r\n (rejectedValue.current === Orientation.portrait\r\n ? i18n.t('solarPanelMenu.Portrait', lang)\r\n : i18n.t('solarPanelMenu.Landscape', lang)) +\r\n ')'\r\n : '')\r\n : '';\r\n\r\n return (\r\n \r\n \r\n \r\n setSelectedOrientation(value)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelOrientationSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ElementState, ObjectType, Orientation, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from '../../../constants';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(\r\n solarPanel?.orientation === Orientation.portrait ? solarPanel?.lx ?? 1 : solarPanel?.ly ?? 2,\r\n );\r\n\r\n const [dx, setDx] = useState(0);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n useEffect(() => {\r\n if (solarPanel) {\r\n const pvModel = getPvModule(solarPanel.pvModelName) ?? getPvModule('SPR-X21-335-BLK');\r\n setDx(solarPanel.orientation === Orientation.portrait ? pvModel.width : pvModel.length);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [solarPanel]);\r\n\r\n const updateSolarPanelLxById = (id: string, lx: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, lx);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLxAboveFoundation = (foundationId: string, lx: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, lx);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLxOnSurface = (parentId: string, normal: number[] | undefined, lx: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, lx);\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLxForAll = (lx: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, lx);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (sp: SolarPanelModel, lx: number) => {\r\n const parent = getParent(sp);\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid && !Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // TODO: cuboid vertical sides\r\n return true;\r\n }\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.lx = lx;\r\n if (parent.type === ObjectType.Wall) {\r\n // maybe outside bound or overlap with others\r\n return Util.checkElementOnWallState(clone, parent) === ElementState.Valid;\r\n }\r\n if (parent.type === ObjectType.Roof) {\r\n return Util.checkElementOnRoofState(clone, parent as RoofModel) === ElementState.Valid;\r\n }\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (sp: SolarPanelModel, lx: number) => {\r\n // check if the new length will cause the solar panel to be out of the bound\r\n if (!withinParent(sp, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n // FIXME: When there are multiple types of solar panels that have different dimensions,\r\n // this will not work properly.\r\n const needChange = (lx: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setLength = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.lx);\r\n } else {\r\n const oldLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLengthsSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.lx);\r\n } else {\r\n const oldLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLengthsAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelLxForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelLxForAll(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.lx);\r\n } else {\r\n const oldLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldLengthsAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Length for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelLxAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelLxAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.lx);\r\n } else {\r\n const oldLengthsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldLengthsOnSurface.set(elem.id, elem.lx);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldLengthsOnSurface.set(elem.id, elem.lx);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Length for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelLxOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelLxOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id);\r\n const oldLength = sp ? sp.lx : solarPanel.lx;\r\n rejectRef.current = rejectChange(solarPanel, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Length',\r\n timestamp: Date.now(),\r\n oldValue: oldLength,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateSolarPanelLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelLxById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const panelize = (value: number) => {\r\n let w = value ?? 1;\r\n const n = Math.max(1, Math.ceil((w - dx / 2) / dx));\r\n w = n * dx;\r\n return w;\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLength(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(panelize(value));\r\n }}\r\n />\r\n
\r\n {Math.round(inputValue / dx) + ' ' + i18n.t('solarPanelMenu.PanelsWide', lang)}\r\n
\r\n {i18n.t('word.MaximumNumber', lang)}: 100 {i18n.t('solarPanelMenu.Panels', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelLengthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ElementState, ObjectType, Orientation, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from '../../../constants';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPanelWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n const [inputValue, setInputValue] = useState(\r\n solarPanel?.orientation === Orientation.portrait ? solarPanel?.ly ?? 2 : solarPanel?.lx ?? 1,\r\n );\r\n\r\n const [dy, setDy] = useState(0);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n useEffect(() => {\r\n if (solarPanel) {\r\n const pvModel = getPvModule(solarPanel.pvModelName) ?? getPvModule('SPR-X21-335-BLK');\r\n setDy(solarPanel.orientation === Orientation.portrait ? pvModel.length : pvModel.width);\r\n setInputValue(solarPanel.ly);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [solarPanel]);\r\n\r\n const updateSolarPanelLyById = (id: string, ly: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, ly);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLyAboveFoundation = (foundationId: string, ly: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, ly);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLyOnSurface = (parentId: string, normal: number[] | undefined, ly: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, ly);\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLyForAll = (ly: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, ly);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (sp: SolarPanelModel, ly: number) => {\r\n const parent = getParent(sp);\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid && !Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // TODO: cuboid vertical sides\r\n return true;\r\n }\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.ly = ly;\r\n if (parent.type === ObjectType.Wall) {\r\n // maybe outside bound or overlap with others\r\n return Util.checkElementOnWallState(clone, parent) === ElementState.Valid;\r\n }\r\n if (parent.type === ObjectType.Roof) {\r\n return Util.checkElementOnRoofState(clone, parent as RoofModel) === ElementState.Valid;\r\n }\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (sp: SolarPanelModel, ly: number) => {\r\n if (sp.tiltAngle !== 0 && 0.5 * ly * Math.abs(Math.sin(sp.tiltAngle)) > sp.poleHeight) {\r\n // check if the new width will cause the solar panel to intersect with the base surface\r\n return true;\r\n }\r\n // check if the new width will cause the solar panel to be out of the bound\r\n if (!withinParent(sp, ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n // FIXME: When there are multiple types of solar panels that have different dimensions,\r\n // this will not work properly.\r\n const needChange = (ly: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setWidth = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.ly);\r\n } else {\r\n const oldWidthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldWidthsSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldWidthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.ly);\r\n } else {\r\n const oldWidthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldWidthsAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelLyForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelLyForAll(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.ly);\r\n } else {\r\n const oldWidthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldWidthsAboveFoundation.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelLyAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelLyAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.ly);\r\n } else {\r\n const oldWidthsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldWidthsOnSurface.set(elem.id, elem.ly);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldWidthsOnSurface.set(elem.id, elem.ly);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Width for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelLyOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelLyOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id);\r\n const oldWidth = sp ? sp.ly : solarPanel.ly;\r\n rejectRef.current = rejectChange(solarPanel, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldWidth);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Width',\r\n timestamp: Date.now(),\r\n oldValue: oldWidth,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateSolarPanelLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelLyById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setWidth(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const panelize = (value: number) => {\r\n let l = value ?? 1;\r\n const n = Math.max(1, Math.ceil((l - dy / 2) / dy));\r\n l = n * dy;\r\n return l;\r\n };\r\n\r\n const apply = () => {\r\n setWidth(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(panelize(value));\r\n }}\r\n />\r\n
\r\n {Math.round(inputValue / dy) + ' ' + i18n.t('solarPanelMenu.PanelsLong', lang)}\r\n
\r\n {i18n.t('word.MaximumNumber', lang)}: 100 {i18n.t('solarPanelMenu.Panels', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelWidthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelTiltAngleInput = ({\r\n setDialogVisible,\r\n isOnWall,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n isOnWall?: boolean;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n const tiltAngle = solarPanel?.tiltAngle ?? 0;\r\n\r\n const [inputValue, setInputValue] = useState(isOnWall ? -tiltAngle : tiltAngle);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSolarPanelTiltAngleAboveFoundation = (foundationId: string, tiltAngle: number, isReverse: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.parentType === ObjectType.Wall) {\r\n sp.tiltAngle = Math.min(0, isReverse ? -tiltAngle : tiltAngle);\r\n } else {\r\n sp.tiltAngle = tiltAngle;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTiltAngleOnSurface = (parentId: string, normal: number[] | undefined, tiltAngle: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n sp.tiltAngle = tiltAngle;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTiltAngleForAll = (tiltAngle: number, isReverse: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.parentType === ObjectType.Wall) {\r\n sp.tiltAngle = Math.min(0, isReverse ? -tiltAngle : tiltAngle);\r\n } else {\r\n sp.tiltAngle = tiltAngle;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number, isReverse: boolean) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.parentType === ObjectType.Wall) {\r\n sp.tiltAngle = Math.min(0, isReverse ? -value : value);\r\n } else {\r\n sp.tiltAngle = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (tiltAngle: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n // tilt is only allowed for the top surface of a cuboid\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTiltAngle = (value: number) => {\r\n if (isOnWall) {\r\n value = -value;\r\n }\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.tiltAngle);\r\n } else {\r\n const oldTiltAnglesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTiltAnglesSelected.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tilt Angle for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldTiltAnglesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ta] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelTiltAngleById(id, ta as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n !isOnWall,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTiltAnglesSelected, value, !isOnWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.tiltAngle);\r\n } else {\r\n const oldTiltAnglesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldTiltAnglesAll.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tilt Angle for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldTiltAnglesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ta] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelTiltAngleById(id, ta as number);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelTiltAngleForAll(undoableChangeAll.newValue as number, !isOnWall);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelTiltAngleForAll(value, !isOnWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.foundationId === solarPanel.foundationId &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.tiltAngle);\r\n } else {\r\n const oldTiltAnglesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldTiltAnglesAboveFoundation.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Tilt Angle for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTiltAnglesAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ta] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelTiltAngleById(id, ta as number);\r\n }\r\n if (undoableChangeAboveFoundation.oldValues.size % 2 === 0) {\r\n useStore.getState().set((state) => {});\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelTiltAngleAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n !isOnWall,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelTiltAngleAboveFoundation(solarPanel.foundationId, value, !isOnWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n // tilt is only allowed for the top surface of a cuboid\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else if (solarPanel.parentType === ObjectType.Wall) {\r\n rejectRef.current = false;\r\n } else {\r\n // tilt is only allowed on top of a foundation or a roof\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.tiltAngle);\r\n } else {\r\n const oldTiltAnglesOnSurface = new Map();\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldTiltAnglesOnSurface.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldTiltAnglesOnSurface.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Tilt Angle for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldTiltAnglesOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ta] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelTiltAngleById(id, ta as number);\r\n }\r\n if (undoableChangeOnSurface.oldValues.size % 2 === 0) {\r\n useStore.getState().set((state) => {});\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelTiltAngleOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelTiltAngleOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldTiltAngle = sp ? sp.tiltAngle : solarPanel.tiltAngle;\r\n rejectRef.current = 0.5 * solarPanel.ly * Math.abs(Math.sin(value)) > solarPanel.poleHeight;\r\n if (solarPanel.parentType === ObjectType.Wall) {\r\n rejectRef.current = false;\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldTiltAngle);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltAngle,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelTiltAngleById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelTiltAngle = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setTiltAngle(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setTiltAngle(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + Util.toDegrees(rejectedValue.current).toFixed(1) + '°)' : null)\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n `${value}°`}\r\n onChange={(value) => {\r\n setInputValue(Util.toRadians(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{isOnWall ? '0°' : '-90°'}, 90°]\r\n
\r\n {i18n.t('solarPanelMenu.SouthFacingIsPositive', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelTiltAngleInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ElementState, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from '../../../constants';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPanelRelativeAzimuthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateRelativeAzimuthById = useStore(Selector.updateSolarCollectorRelativeAzimuthById);\r\n const updateRelativeAzimuthOnSurface = useStore(Selector.updateSolarCollectorRelativeAzimuthOnSurface);\r\n const updateRelativeAzimuthAboveFoundation = useStore(Selector.updateSolarCollectorRelativeAzimuthAboveFoundation);\r\n const updateRelativeAzimuthForAll = useStore(Selector.updateSolarCollectorRelativeAzimuthForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n // reverse the sign because rotation angle is positive counterclockwise whereas azimuth is positive clockwise\r\n // unfortunately, the variable should not be named as relativeAzimuth. Instead, it should have been named as\r\n // relativeRotationAngle. Keep this in mind that relativeAzimuth is NOT really azimuth.\r\n const [inputValue, setInputValue] = useState(solarPanel ? -solarPanel.relativeAzimuth ?? 0 : 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (sp: SolarPanelModel, azimuth: number) => {\r\n const parent = getParent(sp);\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid && !Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // azimuth should not be changed for solar panels on a vertical side of a cuboid\r\n return true;\r\n }\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.relativeAzimuth = -azimuth;\r\n if (parent.type === ObjectType.Roof) {\r\n return Util.checkElementOnRoofState(clone, parent as RoofModel) === ElementState.Valid;\r\n }\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (sp: SolarPanelModel, azimuth: number) => {\r\n // check if the new relative azimuth will cause the solar panel to be out of the bound\r\n if (!withinParent(sp, azimuth)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (azimuth: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n !e.locked &&\r\n (e as SolarPanelModel).parentType !== ObjectType.Wall &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && (e as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.foundationId === solarPanel?.foundationId &&\r\n !e.locked &&\r\n (e as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n if (solarPanel?.parentId) {\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n // azimuth change is only allowed for the top surface of a cuboid\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n // azimuth change is only allowed on top of a foundation or a roof\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(-solarPanel?.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n sp.relativeAzimuth = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setRelativeAzimuth = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(-solarPanel.relativeAzimuth);\r\n } else {\r\n const oldRelativeAzimuthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldRelativeAzimuthsSelected.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Relative Azimuth for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldRelativeAzimuthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ra] of undoableChangeSelected.oldValues.entries()) {\r\n updateRelativeAzimuthById(id, -(ra as number));\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldRelativeAzimuthsSelected, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(-solarPanel.relativeAzimuth);\r\n } else {\r\n const oldRelativeAzimuthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n oldRelativeAzimuthsAll.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Relative Azimuth for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldRelativeAzimuthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ra] of undoableChangeAll.oldValues.entries()) {\r\n updateRelativeAzimuthById(id, -(ra as number));\r\n }\r\n },\r\n redo: () => {\r\n updateRelativeAzimuthForAll(ObjectType.SolarPanel, -(undoableChangeAll.newValue as number));\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateRelativeAzimuthForAll(ObjectType.SolarPanel, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.foundationId === solarPanel.foundationId &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(-solarPanel.relativeAzimuth);\r\n } else {\r\n const oldRelativeAzimuthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.foundationId === solarPanel.foundationId &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n oldRelativeAzimuthsAboveFoundation.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Relative Azimuth for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldRelativeAzimuthsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ra] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateRelativeAzimuthById(id, -(ra as number));\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateRelativeAzimuthAboveFoundation(\r\n ObjectType.SolarPanel,\r\n undoableChangeAboveFoundation.groupId,\r\n -(undoableChangeAboveFoundation.newValue as number),\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateRelativeAzimuthAboveFoundation(ObjectType.SolarPanel, solarPanel.foundationId, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n if (solarPanel.parentId) {\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(-solarPanel.relativeAzimuth);\r\n } else {\r\n const oldRelativeAzimuthsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldRelativeAzimuthsOnSurface.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldRelativeAzimuthsOnSurface.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Relative Azimuth for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldRelativeAzimuthsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ra] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateRelativeAzimuthById(id, -(ra as number));\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateRelativeAzimuthOnSurface(\r\n ObjectType.SolarPanel,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n -(undoableChangeOnSurface.newValue as number),\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateRelativeAzimuthOnSurface(ObjectType.SolarPanel, solarPanel.parentId, normal, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldRelativeAzimuth = sp ? -sp.relativeAzimuth : -solarPanel.relativeAzimuth;\r\n rejectRef.current = rejectChange(solarPanel, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldRelativeAzimuth);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Relative Azimuth',\r\n timestamp: Date.now(),\r\n oldValue: oldRelativeAzimuth,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateRelativeAzimuthById(undoableChange.changedElementId, -(undoableChange.oldValue as number));\r\n },\r\n redo: () => {\r\n updateRelativeAzimuthById(undoableChange.changedElementId, -(undoableChange.newValue as number));\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateRelativeAzimuthById(solarPanel.id, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelRelativeAzimuth = -value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setRelativeAzimuth(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setRelativeAzimuth(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + Util.toDegrees(rejectedValue.current).toFixed(1) + '°)' : null)\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n `${value}°`}\r\n onChange={(value) => {\r\n setInputValue(Util.toRadians(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [-180°, 180°]\r\n
\r\n {i18n.t('message.AzimuthOfNorthIsZero', lang)}\r\n
\r\n {i18n.t('message.CounterclockwiseAzimuthIsPositive', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelRelativeAzimuthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope, TrackerType } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPanelTrackerSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [selectedTrackerType, setSelectedTrackerType] = useState(\r\n solarPanel?.trackerType ?? TrackerType.NO_TRACKER,\r\n );\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateSolarPanelTrackerTypeById = (id: string, trackerType: TrackerType) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n (e as SolarPanelModel).trackerType = trackerType;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTrackerTypeAboveFoundation = (foundationId: string, trackerType: TrackerType) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n (e as SolarPanelModel).trackerType = trackerType;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTrackerTypeOnSurface = (\r\n parentId: string,\r\n normal: number[] | undefined,\r\n trackerType: TrackerType,\r\n ) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarPanelModel).trackerType = trackerType;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTrackerTypeForAll = (trackerType: TrackerType) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n (e as SolarPanelModel).trackerType = trackerType;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: TrackerType) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n (e as SolarPanelModel).trackerType = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (tracker: TrackerType) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (solarPanel?.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTrackerType = (value: TrackerType) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTrackerTypesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTrackerTypesSelected.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tracker Type for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldTrackerTypesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, tt] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelTrackerTypeById(id, tt as TrackerType);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as TrackerType,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTrackerTypesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTrackerTypesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldTrackerTypesAll.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tracker Type for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldTrackerTypesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, tt] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelTrackerTypeById(id, tt as TrackerType);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelTrackerTypeForAll(undoableChangeAll.newValue as TrackerType);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelTrackerTypeForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldTrackerTypesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldTrackerTypesAboveFoundation.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Tracker Type for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTrackerTypesAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, tt] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelTrackerTypeById(id, tt as TrackerType);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelTrackerTypeAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as TrackerType,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelTrackerTypeAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldTrackerTypesOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldTrackerTypesOnSurface.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldTrackerTypesOnSurface.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Tracker Type for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldTrackerTypesOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, tt] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelTrackerTypeById(id, tt as TrackerType);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelTrackerTypeOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as TrackerType,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelTrackerTypeOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldTrackerType = sp ? sp.trackerType : solarPanel.trackerType;\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Tracker Type',\r\n timestamp: Date.now(),\r\n oldValue: oldTrackerType,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelTrackerTypeById(undoableChange.changedElementId, undoableChange.oldValue as TrackerType);\r\n },\r\n redo: () => {\r\n updateSolarPanelTrackerTypeById(undoableChange.changedElementId, undoableChange.newValue as TrackerType);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelTrackerTypeById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTrackerType(selectedTrackerType);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n setSelectedTrackerType(value)}\r\n >\r\n \r\n \r\n HSAT\r\n \r\n \r\n VSAT\r\n \r\n \r\n AADAT\r\n \r\n \r\n
\r\n {i18n.t('solarPanelMenu.SolarTrackerFollowsSun', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPanelTrackerSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightOnSurface = useStore(Selector.updateSolarCollectorPoleHeightOnSurface);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n const [inputValue, setInputValue] = useState(solarPanel?.poleHeight ?? 0);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleHeight = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.poleHeight);\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.poleHeight);\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldPoleHeightsAll.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.SolarPanel, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.SolarPanel, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.poleHeight);\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.SolarPanel,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.SolarPanel, solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n // tilt is only allowed for the top surface of a cuboid\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n // tilt is only allowed on top of a foundation or a roof\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.poleHeight);\r\n } else {\r\n const oldPoleHeightsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldPoleHeightsOnSurface.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldPoleHeightsOnSurface.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Pole Height for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeOnSurface.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updatePoleHeightOnSurface(\r\n ObjectType.SolarPanel,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updatePoleHeightOnSurface(ObjectType.SolarPanel, solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldPoleHeight = sp ? sp.poleHeight : solarPanel.poleHeight;\r\n rejectRef.current = 0.5 * solarPanel.ly * Math.abs(Math.sin(solarPanel.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldPoleHeight);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n `${value} ` + i18n.t('word.MeterAbbreviation', lang)}\r\n // parser={value => Number(value?.replace(i18n.t('word.MeterAbbreviation', lang), ''))}\r\n value={inputValue}\r\n onChange={setInputValue}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelPoleHeightInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPanelPoleSpacingInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n const [inputValue, setInputValue] = useState(solarPanel?.poleSpacing ?? 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSolarPanelPoleSpacingById = (id: string, poleSpacing: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = poleSpacing;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelPoleSpacingAboveFoundation = (foundationId: string, poleSpacing: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = poleSpacing;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelPoleSpacingOnSurface = (\r\n parentId: string,\r\n normal: number[] | undefined,\r\n poleSpacing: number,\r\n ) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = poleSpacing;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelPoleSpacingForAll = (poleSpacing: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = poleSpacing;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleSpacing: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setPoleSpacing = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldPoleSpacingsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleSpacingsSelected.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Spacing for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleSpacingsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ps] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelPoleSpacingById(id, ps as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleSpacingsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldPoleSpacingsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldPoleSpacingsAll.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Spacing for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleSpacingsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ps] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelPoleSpacingById(id, ps as number);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelPoleSpacingForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelPoleSpacingForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldPoleSpacingsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldPoleSpacingsAboveFoundation.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Spacing for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleSpacingsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ps] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelPoleSpacingById(id, ps as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelPoleSpacingAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelPoleSpacingAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldPoleSpacingsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldPoleSpacingsOnSurface.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldPoleSpacingsOnSurface.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Pole Spacing for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleSpacingsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ps] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelPoleSpacingById(id, ps as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelPoleSpacingOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelPoleSpacingOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldPoleSpacing = sp ? sp.poleSpacing : solarPanel.poleSpacing;\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Pole Spacing',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleSpacing,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelPoleSpacingById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateSolarPanelPoleSpacingById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelPoleSpacingById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelPoleSpacing = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPoleSpacing(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPanelPoleSpacingInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { CompactPicker } from 'react-color';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelFrameColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(solarPanel?.frameColor ?? 'white');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSolarPanelFrameColorById = (id: string, frameColor: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n (e as SolarPanelModel).frameColor = frameColor;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelFrameColorAboveFoundation = (foundationId: string, frameColor: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n (e as SolarPanelModel).frameColor = frameColor;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelFrameColorOnSurface = (parentId: string, normal: number[] | undefined, frameColor: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarPanelModel).frameColor = frameColor;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelFrameColorForAll = (frameColor: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n (e as SolarPanelModel).frameColor = frameColor;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n (e as SolarPanelModel).frameColor = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (frameColor: string) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (solarPanel?.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setFrameColor = (value: string) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldFrameColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldFrameColorsSelected.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Frame Color for Selected Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldFrameColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, fc] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelFrameColorById(id, fc as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldFrameColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldFrameColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldFrameColorsAll.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Frame Color for All Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldFrameColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, fc] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelFrameColorById(id, fc as string);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelFrameColorForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelFrameColorForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldFrameColorsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldFrameColorsAboveFoundation.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Frame Color for All Solar Panels Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldFrameColorsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, fc] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelFrameColorById(id, fc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelFrameColorAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelFrameColorAboveFoundation(solarPanel.foundationId, value as string);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldFrameColorsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldFrameColorsOnSurface.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldFrameColorsOnSurface.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Frame Color for All Solar Panels on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldFrameColorsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, fc] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelFrameColorById(id, fc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelFrameColorOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelFrameColorOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldFrameColor = sp ? sp.frameColor : solarPanel.frameColor;\r\n const undoableChange = {\r\n name: 'Set Frame Color of Selected Solar Panel',\r\n timestamp: Date.now(),\r\n oldValue: oldFrameColor,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelFrameColorById(solarPanel.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateSolarPanelFrameColorById(solarPanel.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelFrameColorById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelFrameColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setFrameColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelFrameColorSelection;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelInverterEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useStore((state) =>\r\n state.elements.find((e) => e.selected && e.type === ObjectType.SolarPanel),\r\n ) as SolarPanelModel;\r\n\r\n const [inputValue, setInputValue] = useState(solarPanel?.inverterEfficiency ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateInverterEfficiencyById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n (e as SolarPanelModel).inverterEfficiency = efficiency;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInverterEfficiencyAboveFoundation = (foundationId: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n (e as SolarPanelModel).inverterEfficiency = efficiency;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInverterEfficiencyOnSurface = (parentId: string, normal: number[] | undefined, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarPanelModel).inverterEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInverterEfficiencyForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n (e as SolarPanelModel).inverterEfficiency = efficiency;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n (e as SolarPanelModel).inverterEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs((solarPanel?.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setInverterEfficiency = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Inverter Efficiency for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, efficiency] of undoableChangeSelected.oldValues.entries()) {\r\n updateInverterEfficiencyById(id, efficiency as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldValuesAll.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Inverter Efficiency for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, efficiency] of undoableChangeAll.oldValues.entries()) {\r\n updateInverterEfficiencyById(id, efficiency as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInverterEfficiencyForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateInverterEfficiencyForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Inverter Efficiency for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, efficiency] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateInverterEfficiencyById(id, efficiency as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateInverterEfficiencyAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateInverterEfficiencyAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldValuesOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Inverter Efficiency for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, efficiency] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateInverterEfficiencyById(id, efficiency as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateInverterEfficiencyOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateInverterEfficiencyOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id);\r\n const oldValue = sp\r\n ? (sp as SolarPanelModel).inverterEfficiency ?? 0.95\r\n : solarPanel.inverterEfficiency ?? 0.95;\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Inverter Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateInverterEfficiencyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateInverterEfficiencyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateInverterEfficiencyById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setInverterEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n [0.5, 1.0]\r\n
\r\n {i18n.t('solarPanelMenu.InverterEfficiencyExplained', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPanelInverterEfficiencyInput;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\n\r\nconst SolarPanelDcToAcRatioInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useStore((state) =>\r\n state.elements.find((e) => e.selected && e.type === ObjectType.SolarPanel),\r\n ) as SolarPanelModel;\r\n\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n const inputDcToAcRatioRef = useRef(solarPanel?.dcToAcRatio ?? 1);\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n if (solarPanel) {\r\n inputDcToAcRatioRef.current = solarPanel.dcToAcRatio ?? 1;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [solarPanel.dcToAcRatio]);\r\n\r\n const updateDcToAcRatioById = (id: string, ratio: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n (e as SolarPanelModel).dcToAcRatio = ratio;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateDcToAcRatioAboveFoundation = (foundationId: string, ratio: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n (e as SolarPanelModel).dcToAcRatio = ratio;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateDcToAcRatioOnSurface = (parentId: string, normal: number[] | undefined, ratio: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarPanelModel).dcToAcRatio = ratio;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateDcToAcRatioForAll = (ratio: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n (e as SolarPanelModel).dcToAcRatio = ratio;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n (e as SolarPanelModel).dcToAcRatio = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n setUpdateFlag(!updateFlag);\r\n };\r\n\r\n const needChange = (ratio: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs((solarPanel?.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setDcToAcRatio = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set DC-AC Ratio for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ratio] of undoableChangeSelected.oldValues.entries()) {\r\n updateDcToAcRatioById(id, ratio as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldValuesAll.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set DC-AC Ratio for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ratio] of undoableChangeAll.oldValues.entries()) {\r\n updateDcToAcRatioById(id, ratio as number);\r\n }\r\n },\r\n redo: () => {\r\n updateDcToAcRatioForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateDcToAcRatioForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set DC-AC Ratio for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ratio] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateDcToAcRatioById(id, ratio as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateDcToAcRatioAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateDcToAcRatioAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldValuesOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set DC-AC Ratio for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ratio] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateDcToAcRatioById(id, ratio as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateDcToAcRatioOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateDcToAcRatioOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id);\r\n const oldValue = sp ? (sp as SolarPanelModel).dcToAcRatio ?? 1 : solarPanel.dcToAcRatio ?? 1;\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array DC-AC Ratio',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateDcToAcRatioById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateDcToAcRatioById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateDcToAcRatioById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setUpdateFlag(!updateFlag);\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const close = () => {\r\n inputDcToAcRatioRef.current = solarPanel.dcToAcRatio ?? 1;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setDcToAcRatio(inputDcToAcRatioRef.current);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('solarPanelMenu.DcToAcSizeRatio', lang)}\r\n \r\n }\r\n footer={[\r\n {\r\n setDcToAcRatio(inputDcToAcRatioRef.current);\r\n }}\r\n >\r\n {i18n.t('word.Apply', lang)}\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={close}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n {\r\n inputDcToAcRatioRef.current = value;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onPressEnter={ok}\r\n />\r\n
\r\n [1.0, 2.0]\r\n
\r\n {i18n.t('solarPanelMenu.DcToAcSizeRatioExplained', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelDcToAcRatioInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { Vector3 } from 'three';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Util } from '../../../Util';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport SolarPanelModelSelection from './solarPanelModelSelection';\r\nimport SolarPanelOrientationSelection from './solarPanelOrientationSelection';\r\nimport SolarPanelLengthInput from './solarPanelLengthInput';\r\nimport SolarPanelWidthInput from './solarPanelWidthInput';\r\nimport SolarPanelTiltAngleInput from './solarPanelTiltAngleInput';\r\nimport SolarPanelRelativeAzimuthInput from './solarPanelRelativeAzimuthInput';\r\nimport SolarPanelTrackerSelection from './solarPanelTrackerSelection';\r\nimport SolarPanelPoleHeightInput from './solarPanelPoleHeightInput';\r\nimport SolarPanelPoleSpacingInput from './solarPanelPoleSpacingInput';\r\nimport SolarPanelFrameColorSelection from './solarPanelFrameColorSelection';\r\nimport { UNIT_VECTOR_POS_Z } from '../../../constants';\r\nimport { ObjectType, TrackerType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SolarPanelInverterEfficiencyInput from './solarPanelInverterEfficiencyInput';\r\nimport SolarPanelDcToAcRatioInput from './solarPanelDcToAcRatioInput';\r\n\r\nexport const SolarPanelMenu = React.memo(() => {\r\n const updateSolarCollectorDrawSunBeamById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const language = useStore(Selector.language);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [pvModelDialogVisible, setPvModelDialogVisible] = useState(false);\r\n const [orientationDialogVisible, setOrientationDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [inverterEfficiencyDialogVisible, setInverterEfficiencyDialogVisible] = useState(false);\r\n const [dcAcRatioDialogVisible, setDcAcRatioDialogVisible] = useState(false);\r\n const [tiltDialogVisible, setTiltDialogVisible] = useState(false);\r\n const [azimuthDialogVisible, setAzimuthDialogVisible] = useState(false);\r\n const [trackerDialogVisible, setTrackerDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [poleSpacingDialogVisible, setPoleSpacingDialogVisible] = useState(false);\r\n const [frameColorDialogVisible, setFrameColorDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(solarPanel);\r\n const showLabel = useLabelShow(solarPanel);\r\n const updateLabelText = useLabelText(solarPanel, labelText);\r\n const setLabelColor = useLabelColor(solarPanel);\r\n const setLabelSize = useLabelSize(solarPanel);\r\n const setLabelFontSize = useLabelFontSize(solarPanel);\r\n const setLabelHeight = useLabelHeight(solarPanel);\r\n\r\n if (!solarPanel) return null;\r\n\r\n const lang = { lng: language };\r\n const panelNormal = new Vector3().fromArray(solarPanel.normal);\r\n const editable = !solarPanel?.locked;\r\n\r\n const drawSunBeam = (checked: boolean) => {\r\n if (solarPanel) {\r\n const undoableCheck = {\r\n name: 'Show Sun Beam',\r\n timestamp: Date.now(),\r\n checked: !solarPanel.drawSunBeam,\r\n selectedElementId: solarPanel.id,\r\n selectedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n updateSolarCollectorDrawSunBeamById(solarPanel.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateSolarCollectorDrawSunBeamById(solarPanel.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateSolarCollectorDrawSunBeamById(solarPanel.id, checked);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {solarPanel && editable && (\r\n <>\r\n {/* pv model */}\r\n {pvModelDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPvModelDialogVisible(true);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('solarPanelMenu.ChangePvModel', lang)} ({solarPanel.pvModelName}) ...\r\n \r\n\r\n {/* orientation: landscape or portrait */}\r\n {orientationDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setOrientationDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.Orientation', lang)} ...\r\n \r\n\r\n {/* array length */}\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {/* array width */}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {/* inverter efficiency */}\r\n {inverterEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setInverterEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.InverterEfficiency', lang)} ...\r\n \r\n\r\n {/* DC-AC ratio */}\r\n {dcAcRatioDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setDcAcRatioDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.DcToAcSizeRatio', lang)} ...\r\n \r\n\r\n {solarPanel.parentType === ObjectType.Wall && (\r\n <>\r\n {\r\n setApplyCount(0);\r\n setTiltDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.TiltAngle', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {tiltDialogVisible && (\r\n \r\n )}\r\n\r\n {panelNormal && Util.isSame(panelNormal, UNIT_VECTOR_POS_Z) && (\r\n <>\r\n {/* tilt angle */}\r\n {solarPanel.trackerType === TrackerType.NO_TRACKER && (\r\n {\r\n setApplyCount(0);\r\n setTiltDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.TiltAngle', lang)} ...\r\n \r\n )}\r\n\r\n {/* relative azimuth to the parent element */}\r\n {azimuthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setAzimuthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.RelativeAzimuth', lang)} ...\r\n \r\n\r\n {/* solar tracker type */}\r\n {solarPanel.parentType !== ObjectType.Roof && (\r\n <>\r\n {trackerDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTrackerDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.Tracker', lang)} ...\r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {editable && (\r\n <>\r\n {frameColorDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setFrameColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.FrameColor', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {/* draw sun beam or not */}\r\n \r\n drawSunBeam(e.target.checked)}>\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)}\r\n \r\n \r\n\r\n \r\n {/* pole height */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.PoleHeight', lang)} ...\r\n \r\n\r\n {/* pole spacing */}\r\n {poleSpacingDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleSpacingDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.PoleSpacing', lang)} ...\r\n \r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the solar panel's top surface */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\n// for parabolic troughs, since the default alignment is north-south, ly is always much larger than lx.\r\n// to agree with the convention, we call ly length and lx width, reversed from most other elements in Aladdin.\r\n\r\nconst ParabolicTroughLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLyById = useStore(Selector.updateElementLyById);\r\n const updateLyAboveFoundation = useStore(Selector.updateElementLyAboveFoundation);\r\n const updateLyForAll = useStore(Selector.updateElementLyForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.ly ?? 9);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (trough: ParabolicTroughModel, ly: number) => {\r\n const parent = getParent(trough);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(trough)) as ParabolicTroughModel;\r\n clone.ly = ly;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (trough: ParabolicTroughModel, ly: number) => {\r\n // check if the new length will cause the parabolic trough to be out of the bound\r\n if (!withinParent(trough, ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLength = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.ly);\r\n } else {\r\n const oldLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLengthsSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.ly);\r\n } else {\r\n const oldLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldLengthsAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLyForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLyForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.ly);\r\n } else {\r\n const oldLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldLengthsAboveFoundation.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Length for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLyAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLyAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldLength = p ? p.ly : parabolicTrough.ly;\r\n rejectRef.current = rejectChange(parabolicTrough, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Length',\r\n timestamp: Date.now(),\r\n oldValue: oldLength,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLyById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const modularize = (value: number) => {\r\n if (!parabolicTrough) return 1;\r\n let length = value ?? 1;\r\n const n = Math.max(1, Math.ceil((length - parabolicTrough.moduleLength / 2) / parabolicTrough.moduleLength));\r\n length = n * parabolicTrough.moduleLength;\r\n return length;\r\n };\r\n\r\n const apply = () => {\r\n setLength(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(modularize(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('parabolicTroughMenu.ModuleLength', lang) +\r\n ': ' +\r\n parabolicTrough.moduleLength.toFixed(1) +\r\n ' ' +\r\n i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {Math.round(inputValue / parabolicTrough.moduleLength) +\r\n ' ' +\r\n i18n.t('parabolicTroughMenu.ModulesLong', lang)}\r\n
\r\n {i18n.t('word.Maximum', lang)}: 100 {i18n.t('parabolicTroughMenu.Modules', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\n// for parabolic troughs, since the default alignment is north-south, ly is always much larger than lx.\r\n// to agree with the convention, we call ly length and lx width, reversed from most other elements in Aladdin.\r\n\r\nconst ParabolicTroughWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLxById = useStore(Selector.updateElementLxById);\r\n const updateLxAboveFoundation = useStore(Selector.updateElementLxAboveFoundation);\r\n const updateLxForAll = useStore(Selector.updateElementLxForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.lx ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (trough: ParabolicTroughModel, lx: number) => {\r\n const parent = getParent(trough);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(trough)) as ParabolicTroughModel;\r\n clone.lx = lx;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (trough: ParabolicTroughModel, lx: number) => {\r\n // check if the new width will cause the parabolic trough to be out of the bound\r\n if (!withinParent(trough, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).lx = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setWidth = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.lx);\r\n } else {\r\n const oldWidthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldWidthsSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldWidthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.lx);\r\n } else {\r\n const oldWidthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldWidthsAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLxForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLxForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.lx);\r\n } else {\r\n const oldWidthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldWidthsAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLxAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLxAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldWidth = p ? p.lx : parabolicTrough.lx;\r\n rejectRef.current = rejectChange(parabolicTrough, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldWidth);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Width',\r\n timestamp: Date.now(),\r\n oldValue: oldWidth,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLxById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughWidth = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setWidth(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n // for some reason, we have to confirm the type first. otherwise, other popup menus may invoke this\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.poleHeight ?? 1);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(parabolicTrough);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.parentId === parabolicTrough.parentId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).tiltAngle = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicTroughModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.poleHeight);\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as ParabolicTroughModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicTroughModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.poleHeight);\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldPoleHeightsAll.set(elem.id, (elem as ParabolicTroughModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicTroughModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.poleHeight);\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldPoleHeight = p ? p.poleHeight : parabolicTrough.poleHeight;\r\n rejectRef.current = 0.5 * parabolicTrough.lx * Math.abs(Math.sin(parabolicTrough.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldPoleHeight);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughPoleHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughLatusRectumInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLatusRectumById = useStore(Selector.updateParabolaLatusRectumById);\r\n const updateLatusRectumAboveFoundation = useStore(Selector.updateParabolaLatusRectumAboveFoundation);\r\n const updateLatusRectumForAll = useStore(Selector.updateParabolaLatusRectumForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.latusRectum ?? 2);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (trough: ParabolicTroughModel, latusRectum: number) => {\r\n const parent = getParent(trough);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(trough)) as ParabolicTroughModel;\r\n clone.latusRectum = latusRectum;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (trough: ParabolicTroughModel, latusRectum: number) => {\r\n // check if the new latus rectum will cause the parabolic trough to be out of the bound\r\n if (!withinParent(trough, latusRectum)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (latusRectum: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).latusRectum = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLatusRectum = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.latusRectum);\r\n } else {\r\n const oldLatusRectumsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLatusRectumsSelected.set(elem.id, (elem as ParabolicTroughModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Latus Rectum for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeSelected.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLatusRectumsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.latusRectum);\r\n } else {\r\n const oldLatusRectumsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldLatusRectumsAll.set(elem.id, (elem as ParabolicTroughModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Latus Rectum for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeAll.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLatusRectumForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLatusRectumForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.latusRectum);\r\n } else {\r\n const oldLatusRectumsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldLatusRectumsAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Latus Rectum for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLatusRectumAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLatusRectumAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldLatusRectum = p ? p.latusRectum : parabolicTrough.latusRectum;\r\n rejectRef.current = rejectChange(parabolicTrough, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLatusRectum);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Latus Rectum',\r\n timestamp: Date.now(),\r\n oldValue: oldLatusRectum,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateLatusRectumById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLatusRectumById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLatusRectumById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughLatusRectum = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLatusRectum(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLatusRectum(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 20 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughLatusRectumInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughModuleLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateModuleLengthById = useStore(Selector.updateModuleLengthById);\r\n const updateModuleLengthAboveFoundation = useStore(Selector.updateModuleLengthAboveFoundation);\r\n const updateModuleLengthForAll = useStore(Selector.updateModuleLengthForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.moduleLength ?? 3);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (trough: ParabolicTroughModel, moduleLength: number) => {\r\n const parent = getParent(trough);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(trough)) as ParabolicTroughModel;\r\n clone.moduleLength = moduleLength;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (trough: ParabolicTroughModel, moduleLength: number) => {\r\n // check if the new module length will cause the parabolic trough to be out of the bound\r\n if (!withinParent(trough, moduleLength)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (moduleLength: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).moduleLength = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setModuleLength = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.moduleLength);\r\n } else {\r\n const oldModuleLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldModuleLengthsSelected.set(elem.id, (elem as ParabolicTroughModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Module Length for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeSelected.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldModuleLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.moduleLength);\r\n } else {\r\n const oldModuleLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldModuleLengthsAll.set(elem.id, (elem as ParabolicTroughModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Module Length for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeAll.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n updateModuleLengthForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateModuleLengthForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.moduleLength);\r\n } else {\r\n const oldModuleLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldModuleLengthsAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Module Length for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateModuleLengthAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateModuleLengthAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldModuleLength = p ? p.moduleLength : parabolicTrough.moduleLength;\r\n rejectRef.current = rejectChange(parabolicTrough, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldModuleLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Module Length',\r\n timestamp: Date.now(),\r\n oldValue: oldModuleLength,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateModuleLengthById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateModuleLengthById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateModuleLengthById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughModuleLength = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setModuleLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setModuleLength(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughModuleLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughReflectanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateCspReflectanceById);\r\n const updateAboveFoundation = useStore(Selector.updateCspReflectanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateCspReflectanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.reflectance ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (reflectance: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).reflectance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReflectance = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldReflectancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldReflectancesSelected.set(elem.id, (elem as ParabolicTroughModel).reflectance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Reflectance for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldReflectancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldReflectancesAll.set(elem.id, (elem as ParabolicTroughModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Reflectance for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n const oldReflectancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldReflectancesAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Reflectance for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldReflectance = p ? p.reflectance : parabolicTrough.reflectance;\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Reflectance',\r\n timestamp: Date.now(),\r\n oldValue: oldReflectance,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughReflectance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setReflectance(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughReflectanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicTroughAbsorptanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorAbsorptanceById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorAbsorptanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorAbsorptanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.absorptance ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (absorptance: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).absorptance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setAbsorptance = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldAbsorptancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldAbsorptancesSelected.set(elem.id, (elem as ParabolicTroughModel).absorptance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorptance for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldAbsorptancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldAbsorptancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldAbsorptancesAll.set(elem.id, (elem as ParabolicTroughModel).absorptance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorptance for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n const oldAbsorptancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldAbsorptancesAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).absorptance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Absorptance for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldAbsorptance = p ? p.absorptance : parabolicTrough.absorptance;\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Absorptance',\r\n timestamp: Date.now(),\r\n oldValue: oldAbsorptance,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughAbsorptance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAbsorptance(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughAbsorptanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicTroughOpticalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorOpticalEfficiencyById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorOpticalEfficiencyAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorOpticalEfficiencyForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.opticalEfficiency ?? 0.7);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (opticalEfficiency: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).opticalEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setOpticalEfficiency = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldOpticalEfficienciesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldOpticalEfficienciesSelected.set(elem.id, (elem as ParabolicTroughModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Optical Efficiency for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldOpticalEfficienciesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldOpticalEfficienciesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldOpticalEfficienciesAll.set(elem.id, (elem as ParabolicTroughModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Optical Efficiency for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n const oldOpticalEfficienciesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldOpticalEfficienciesAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Optical Efficiency for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldOpticalEfficiency = p ? p.opticalEfficiency : parabolicTrough.opticalEfficiency;\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Optical Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldOpticalEfficiency,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughOpticalEfficiency = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setOpticalEfficiency(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughOpticalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughThermalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorThermalEfficiencyById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorThermalEfficiencyAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorThermalEfficiencyForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.thermalEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (thermalEfficiency: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).thermalEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setThermalEfficiency = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldThermalEfficienciesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldThermalEfficienciesSelected.set(elem.id, (elem as ParabolicTroughModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Thermal Efficiency for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldThermalEfficienciesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldThermalEfficienciesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldThermalEfficienciesAll.set(elem.id, (elem as ParabolicTroughModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Thermal Efficiency for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n const oldThermalEfficienciesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldThermalEfficienciesAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Thermal Efficiency for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldThermalEfficiency = p ? p.thermalEfficiency : parabolicTrough.thermalEfficiency;\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Thermal Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldThermalEfficiency,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughThermalEfficiency = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThermalEfficiency(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughThermalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport ParabolicTroughLengthInput from './parabolicTroughLengthInput';\r\nimport ParabolicTroughWidthInput from './parabolicTroughWidthInput';\r\nimport ParabolicTroughPoleHeightInput from './parabolicTroughPoleHeightInput';\r\nimport ParabolicTroughLatusRectumInput from './parabolicTroughLatusRectumInput';\r\nimport ParabolicTroughModuleLengthInput from './parabolicTroughModuleLengthInput';\r\nimport ParabolicTroughReflectanceInput from './parabolicTroughReflectanceInput';\r\nimport ParabolicTroughAbsorptanceInput from './parabolicTroughAbsorptanceInput';\r\nimport ParabolicTroughOpticalEfficiencyInput from './parabolicTroughOpticalEfficiencyInput';\r\nimport ParabolicTroughThermalEfficiencyInput from './parabolicTroughThermalEfficiencyInput';\r\nimport { ObjectType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\n\r\nexport const ParabolicTroughMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const updateSolarCollectorDrawSunBeamById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [moduleLengthDialogVisible, setModuleLengthDialogVisible] = useState(false);\r\n const [latusRectumDialogVisible, setLatusRectumDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [reflectanceDialogVisible, setReflectanceDialogVisible] = useState(false);\r\n const [absorptanceDialogVisible, setAbsorptanceDialogVisible] = useState(false);\r\n const [opticalEfficiencyDialogVisible, setOpticalEfficiencyDialogVisible] = useState(false);\r\n const [thermalEfficiencyDialogVisible, setThermalEfficiencyDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(parabolicTrough);\r\n const showLabel = useLabelShow(parabolicTrough);\r\n const updateLabelText = useLabelText(parabolicTrough, labelText);\r\n const setLabelSize = useLabelSize(parabolicTrough);\r\n const setLabelFontSize = useLabelFontSize(parabolicTrough);\r\n const setLabelColor = useLabelColor(parabolicTrough);\r\n const setLabelHeight = useLabelHeight(parabolicTrough);\r\n\r\n if (!parabolicTrough) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !parabolicTrough?.locked;\r\n\r\n const drawSunBeam = (checked: boolean) => {\r\n if (parabolicTrough) {\r\n const undoableCheck = {\r\n name: 'Show Sun Beam',\r\n timestamp: Date.now(),\r\n checked: !parabolicTrough.drawSunBeam,\r\n selectedElementId: parabolicTrough.id,\r\n selectedElementType: ObjectType.ParabolicTrough,\r\n undo: () => {\r\n updateSolarCollectorDrawSunBeamById(parabolicTrough.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateSolarCollectorDrawSunBeamById(parabolicTrough.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateSolarCollectorDrawSunBeamById(parabolicTrough.id, checked);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {parabolicTrough && editable && (\r\n <>\r\n {/* trough length */}\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {/* trough width */}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {/* module length */}\r\n {moduleLengthDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setModuleLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicTroughMenu.ModuleLength', lang)} ...\r\n \r\n\r\n {/* latus rectum */}\r\n {latusRectumDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setLatusRectumDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicTroughMenu.LatusRectum', lang)} ...\r\n \r\n\r\n {/* extra pole height in addition to the half of the aperture width */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.ExtraPoleHeight', lang)} ...\r\n \r\n\r\n {/* reflectance */}\r\n {reflectanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setReflectanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorReflectance', lang)} ...\r\n \r\n\r\n {/* absorptance */}\r\n {absorptanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setAbsorptanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReceiverAbsorptance', lang)} ...\r\n \r\n\r\n {/* optical efficiency */}\r\n {opticalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setOpticalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency', lang)} ...\r\n \r\n\r\n {/* thermal efficiency */}\r\n {thermalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setThermalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency', lang)} ...\r\n \r\n\r\n {/* draw sun beam or not */}\r\n \r\n drawSunBeam(e.target.checked)}>\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)}\r\n \r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the center */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishDiameterInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLxById = useStore(Selector.updateElementLxById);\r\n const updateLyById = useStore(Selector.updateElementLyById);\r\n const updateLxAboveFoundation = useStore(Selector.updateElementLxAboveFoundation);\r\n const updateLyAboveFoundation = useStore(Selector.updateElementLyAboveFoundation);\r\n const updateLxForAll = useStore(Selector.updateElementLxForAll);\r\n const updateLyForAll = useStore(Selector.updateElementLyForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.lx ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (dish: ParabolicDishModel, lx: number) => {\r\n const parent = getParent(dish);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(dish)) as ParabolicDishModel;\r\n clone.lx = lx;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (dish: ParabolicDishModel, lx: number) => {\r\n // check if the new diameter will cause the parabolic dish to be out of the bound\r\n if (!withinParent(dish, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).lx = value;\r\n (e as ParabolicDishModel).ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setDiameter = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.lx);\r\n } else {\r\n const oldDiametersSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldDiametersSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Diameter for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldDiametersSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, di] of undoableChangeSelected.oldValues.entries()) {\r\n // both lx and ly can represent the diameter\r\n updateLxById(id, di as number);\r\n updateLyById(id, di as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldDiametersSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.lx);\r\n } else {\r\n const oldDiametersAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldDiametersAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Diameter for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldDiametersAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, di] of undoableChangeAll.oldValues.entries()) {\r\n // both lx and ly can represent the diameter\r\n updateLxById(id, di as number);\r\n updateLyById(id, di as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLxForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n updateLyForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLxForAll(ObjectType.ParabolicDish, value);\r\n updateLyForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.lx);\r\n } else {\r\n const oldDiametersAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldDiametersAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Diameter for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldDiametersAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, di] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLxById(id, di as number);\r\n updateLyById(id, di as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLxAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n updateLyAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLxAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n updateLyAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldDiameter = p ? p.lx : parabolicDish.lx;\r\n rejectRef.current = rejectChange(parabolicDish, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldDiameter);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Diameter',\r\n timestamp: Date.now(),\r\n oldValue: oldDiameter,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n updateLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n updateLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLxById(parabolicDish.id, value);\r\n updateLyById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishRimDiameter = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setDiameter(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setDiameter(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n // for some reason, we have to confirm the type first. otherwise, other popup menus may invoke this\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishDiameterInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicDishPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.poleHeight ?? 1);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(parabolicDish);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.parentId === parabolicDish.parentId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).tiltAngle = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicDishModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.poleHeight);\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as ParabolicDishModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicDishModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.poleHeight);\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldPoleHeightsAll.set(elem.id, (elem as ParabolicDishModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicDishModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.poleHeight);\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as ParabolicDishModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldPoleHeight = p ? p.poleHeight : parabolicDish.poleHeight;\r\n rejectRef.current = 0.5 * parabolicDish.lx * Math.abs(Math.sin(parabolicDish.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldPoleHeight);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishPoleHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishLatusRectumInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLatusRectumById = useStore(Selector.updateParabolaLatusRectumById);\r\n const updateLatusRectumAboveFoundation = useStore(Selector.updateParabolaLatusRectumAboveFoundation);\r\n const updateLatusRectumForAll = useStore(Selector.updateParabolaLatusRectumForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.latusRectum ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (dish: ParabolicDishModel, latusRectum: number) => {\r\n const parent = getParent(dish);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(dish)) as ParabolicDishModel;\r\n clone.latusRectum = latusRectum;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (dish: ParabolicDishModel, latusRectum: number) => {\r\n // check if the new latus rectum will cause the parabolic dish to be out of the bound\r\n if (!withinParent(dish, latusRectum)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (latusRectum: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).latusRectum = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLatusRectum = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.latusRectum);\r\n } else {\r\n const oldLatusRectumsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLatusRectumsSelected.set(elem.id, (elem as ParabolicDishModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Latus Rectum for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeSelected.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLatusRectumsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.latusRectum);\r\n } else {\r\n const oldLatusRectumsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldLatusRectumsAll.set(elem.id, (elem as ParabolicDishModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Latus Rectum for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeAll.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLatusRectumForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLatusRectumForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.latusRectum);\r\n } else {\r\n const oldLatusRectumsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldLatusRectumsAboveFoundation.set(elem.id, (elem as ParabolicDishModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Latus Rectum for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLatusRectumAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLatusRectumAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldLatusRectum = p ? p.latusRectum : parabolicDish.latusRectum;\r\n rejectRef.current = rejectChange(parabolicDish, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLatusRectum);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Latus Rectum',\r\n timestamp: Date.now(),\r\n oldValue: oldLatusRectum,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateLatusRectumById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLatusRectumById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLatusRectumById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishLatusRectum = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLatusRectum(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLatusRectum(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 20 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishLatusRectumInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishReflectanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateCspReflectanceById);\r\n const updateAboveFoundation = useStore(Selector.updateCspReflectanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateCspReflectanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n const [inputValue, setInputValue] = useState(parabolicDish?.reflectance ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (reflectance: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).reflectance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReflectance = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldReflectancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldReflectancesSelected.set(elem.id, (elem as ParabolicDishModel).reflectance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Reflectance for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldReflectancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldReflectancesAll.set(elem.id, (elem as ParabolicDishModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Reflectance for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldReflectancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldReflectancesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Reflectance for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldReflectance = p ? p.reflectance : parabolicDish.reflectance;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Reflectance',\r\n timestamp: Date.now(),\r\n oldValue: oldReflectance,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishReflectance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setReflectance(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishReflectanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicDishAbsorptanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorAbsorptanceById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorAbsorptanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorAbsorptanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.absorptance ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (absorptance: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pd = e as ParabolicDishModel;\r\n if (Math.abs(pd.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pd = e as ParabolicDishModel;\r\n if (Math.abs(pd.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pd = e as ParabolicDishModel;\r\n if (Math.abs(pd.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).absorptance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setAbsorptance = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldAbsorptancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldAbsorptancesSelected.set(elem.id, (elem as ParabolicDishModel).absorptance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorptance for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldAbsorptancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldAbsorptancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldAbsorptancesAll.set(elem.id, (elem as ParabolicDishModel).absorptance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorptance for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldAbsorptancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldAbsorptancesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).absorptance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Absorptance for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldAbsorptance = p ? p.absorptance : parabolicDish.absorptance;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Absorptance',\r\n timestamp: Date.now(),\r\n oldValue: oldAbsorptance,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishAbsorptance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAbsorptance(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishAbsorptanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicDishOpticalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorOpticalEfficiencyById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorOpticalEfficiencyAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorOpticalEfficiencyForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.opticalEfficiency ?? 0.7);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (opticalEfficiency: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).opticalEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setOpticalEfficiency = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldOpticalEfficienciesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldOpticalEfficienciesSelected.set(elem.id, (elem as ParabolicDishModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Optical Efficiency for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldOpticalEfficienciesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldOpticalEfficienciesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldOpticalEfficienciesAll.set(elem.id, (elem as ParabolicDishModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Optical Efficiency for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldOpticalEfficienciesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldOpticalEfficienciesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Optical Efficiency for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldOpticalEfficiency = p ? p.opticalEfficiency : parabolicDish.opticalEfficiency;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Optical Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldOpticalEfficiency,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishOpticalEfficiency = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setOpticalEfficiency(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishOpticalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishThermalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorThermalEfficiencyById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorThermalEfficiencyAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorThermalEfficiencyForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.thermalEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (thermalEfficiency: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).thermalEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setThermalEfficiency = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldThermalEfficienciesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldThermalEfficienciesSelected.set(elem.id, (elem as ParabolicDishModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Thermal Efficiency for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldThermalEfficienciesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldThermalEfficienciesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldThermalEfficienciesAll.set(elem.id, (elem as ParabolicDishModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Thermal Efficiency for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldThermalEfficienciesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldThermalEfficienciesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Thermal Efficiency for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldThermalEfficiency = p ? p.thermalEfficiency : parabolicDish.thermalEfficiency;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Thermal Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldThermalEfficiency,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishThermalEfficiency = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThermalEfficiency(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishThermalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, ParabolicDishStructureType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishStructureTypeInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputStructureType, setInputStructureType] = useState(\r\n parabolicDish?.structureType ?? ParabolicDishStructureType.CentralPole,\r\n );\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateById = (id: string, structureType: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).structureType = structureType;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, structureType: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).structureType = structureType;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (structureType: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).structureType = structureType;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (structureType: ParabolicDishStructureType) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pd = e as ParabolicDishModel;\r\n if (pd.structureType !== structureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pd = e as ParabolicDishModel;\r\n if (pd.structureType !== structureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pd = e as ParabolicDishModel;\r\n if (pd.structureType !== structureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (parabolicDish?.structureType !== structureType) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).structureType = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setStructureType = (type: ParabolicDishStructureType) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(type)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldStructureTypesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldStructureTypesSelected.set(elem.id, (elem as ParabolicDishModel).structureType);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Structure Type for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldStructureTypesSelected,\r\n newValue: type,\r\n undo: () => {\r\n for (const [id, st] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, st as ParabolicDishStructureType);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldStructureTypesSelected, type);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldStructureTypesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldStructureTypesAll.set(elem.id, (elem as ParabolicDishModel).structureType);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Structure Type for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldStructureTypesAll,\r\n newValue: type,\r\n undo: () => {\r\n for (const [id, st] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, st as ParabolicDishStructureType);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as ParabolicDishStructureType);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(type);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldStructureTypesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldStructureTypesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).structureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Structure Type for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldStructureTypesAboveFoundation,\r\n newValue: type,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, st] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, st as ParabolicDishStructureType);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as ParabolicDishStructureType,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(parabolicDish.foundationId, type);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldStructureType = p ? p.structureType : parabolicDish.structureType;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Structure Type',\r\n timestamp: Date.now(),\r\n oldValue: oldStructureType,\r\n newValue: type,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as ParabolicDishStructureType);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as ParabolicDishStructureType);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, type);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishReceiverStructure = type;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setStructureType(inputStructureType);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishStructureTypeInput;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicDishPoleRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleRadiusById = useStore(Selector.updateSolarCollectorPoleRadiusById);\r\n const updatePoleRadiusAboveFoundation = useStore(Selector.updateSolarCollectorPoleRadiusAboveFoundation);\r\n const updatePoleRadiusForAll = useStore(Selector.updateSolarCollectorPoleRadiusForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.poleRadius ?? 0.1);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleRadius: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(parabolicDish);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.parentId === parabolicDish.parentId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).poleRadius = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleRadius = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as ParabolicDishModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Radius for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldValuesAll.set(elem.id, (elem as ParabolicDishModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Radius for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleRadiusForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleRadiusForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Radius for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleRadiusAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleRadiusAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldValue = p ? p.poleRadius : parabolicDish.poleRadius;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Pole Radius',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updatePoleRadiusById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleRadiusById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleRadiusById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishPoleRadius = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPoleRadius(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 0.5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ParabolicDishPoleRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport ParabolicDishDiameterInput from './parabolicDishDiameterInput';\r\nimport ParabolicDishPoleHeightInput from './parabolicDishPoleHeightInput';\r\nimport ParabolicDishLatusRectumInput from './parabolicDishLatusRectumInput';\r\nimport ParabolicDishReflectanceInput from './parabolicDishReflectanceInput';\r\nimport ParabolicDishAbsorptanceInput from './parabolicDishAbsorptanceInput';\r\nimport ParabolicDishOpticalEfficiencyInput from './parabolicDishOpticalEfficiencyInput';\r\nimport ParabolicDishThermalEfficiencyInput from './parabolicDishThermalEfficiencyInput';\r\nimport ParabolicDishStructureTypeInput from './parabolicDishStructureTypeInput';\r\nimport { ObjectType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport ParabolicDishPoleRadiusInput from './parabolicDishPoleRadiusInput';\r\n\r\nexport const ParabolicDishMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const updateSolarCollectorDrawSunBeamById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [structureTypeDialogVisible, setStructureTypeDialogVisible] = useState(false);\r\n const [latusRectumDialogVisible, setLatusRectumDialogVisible] = useState(false);\r\n const [diameterDialogVisible, setDiameterDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [poleRadiusDialogVisible, setPoleRadiusDialogVisible] = useState(false);\r\n const [reflectanceDialogVisible, setReflectanceDialogVisible] = useState(false);\r\n const [absorptanceDialogVisible, setAbsorptanceDialogVisible] = useState(false);\r\n const [opticalEfficiencyDialogVisible, setOpticalEfficiencyDialogVisible] = useState(false);\r\n const [thermalEfficiencyDialogVisible, setThermalEfficiencyDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(parabolicDish);\r\n const showLabel = useLabelShow(parabolicDish);\r\n const updateLabelText = useLabelText(parabolicDish, labelText);\r\n const setLabelSize = useLabelSize(parabolicDish);\r\n const setLabelFontSize = useLabelFontSize(parabolicDish);\r\n const setLabelColor = useLabelColor(parabolicDish);\r\n const setLabelHeight = useLabelHeight(parabolicDish);\r\n\r\n if (!parabolicDish) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !parabolicDish?.locked;\r\n\r\n const drawSunBeam = (checked: boolean) => {\r\n if (parabolicDish) {\r\n const undoableCheck = {\r\n name: 'Show Sun Beam',\r\n timestamp: Date.now(),\r\n checked: !parabolicDish.drawSunBeam,\r\n selectedElementId: parabolicDish.id,\r\n selectedElementType: ObjectType.ParabolicDish,\r\n undo: () => {\r\n updateSolarCollectorDrawSunBeamById(parabolicDish.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateSolarCollectorDrawSunBeamById(parabolicDish.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateSolarCollectorDrawSunBeamById(parabolicDish.id, checked);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {parabolicDish && editable && (\r\n <>\r\n {/* dish rim diameter */}\r\n {diameterDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setDiameterDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicDishMenu.RimDiameter', lang)} ...\r\n \r\n\r\n {/* latus rectum */}\r\n {latusRectumDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLatusRectumDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicDishMenu.LatusRectum', lang)} ...\r\n \r\n\r\n {/* structure type */}\r\n {structureTypeDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setStructureTypeDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicDishMenu.ReceiverStructure', lang)} ...\r\n \r\n\r\n {/* extra pole height in addition to the aperture radius */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.ExtraPoleHeight', lang)} ...\r\n \r\n\r\n {poleRadiusDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.PoleRadius', lang)} ...\r\n \r\n\r\n {/* reflectance */}\r\n {reflectanceDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setReflectanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorReflectance', lang)} ...\r\n \r\n\r\n {/* absorptance */}\r\n {absorptanceDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setAbsorptanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReceiverAbsorptance', lang)} ...\r\n \r\n\r\n {/* optical efficiency */}\r\n {opticalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setOpticalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency', lang)} ...\r\n \r\n\r\n {/* thermal efficiency */}\r\n {thermalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setThermalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency', lang)} ...\r\n \r\n\r\n {/* draw sun beam or not */}\r\n \r\n drawSunBeam(e.target.checked)}>\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)}\r\n \r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the dish center */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\n// for Fresnel reflectors, since the default alignment is north-south, ly is always much larger than lx.\r\n// to agree with the convention, we call ly length and lx width, reversed from most other elements in Aladdin.\r\n\r\nconst FresnelReflectorLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLyById = useStore(Selector.updateElementLyById);\r\n const updateLyAboveFoundation = useStore(Selector.updateElementLyAboveFoundation);\r\n const updateLyForAll = useStore(Selector.updateElementLyForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.ly ?? 9);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (reflector: FresnelReflectorModel, ly: number) => {\r\n const parent = getParent(reflector);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(reflector)) as FresnelReflectorModel;\r\n clone.ly = ly;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (reflector: FresnelReflectorModel, ly: number) => {\r\n // check if the new length will cause the Fresnel reflector to be out of the bound\r\n if (!withinParent(reflector, ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n e.ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLength = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.ly);\r\n } else {\r\n const oldLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLengthsSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.ly);\r\n } else {\r\n const oldLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldLengthsAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLyForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLyForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.ly);\r\n } else {\r\n const oldLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldLengthsAboveFoundation.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Length for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLyAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLyAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldLength = f ? f.ly : fresnelReflector.ly;\r\n rejectRef.current = rejectChange(fresnelReflector, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Length',\r\n timestamp: Date.now(),\r\n oldValue: oldLength,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLyById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const modularize = (value: number) => {\r\n if (!fresnelReflector) return 1;\r\n let length = value ?? 1;\r\n const n = Math.max(1, Math.ceil((length - fresnelReflector.moduleLength / 2) / fresnelReflector.moduleLength));\r\n length = n * fresnelReflector.moduleLength;\r\n return length;\r\n };\r\n\r\n const apply = () => {\r\n setLength(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(modularize(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('fresnelReflectorMenu.ModuleLength', lang) +\r\n ': ' +\r\n fresnelReflector.moduleLength.toFixed(1) +\r\n ' ' +\r\n i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {Math.round(inputValue / fresnelReflector.moduleLength) +\r\n ' ' +\r\n i18n.t('fresnelReflectorMenu.ModulesLong', lang)}\r\n
\r\n {i18n.t('word.Maximum', lang)}: 200 {i18n.t('fresnelReflectorMenu.Modules', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\n// for Fresnel reflectors, since the default alignment is north-south, ly is always much larger than lx.\r\n// to agree with the convention, we call ly length and lx width, reversed from most other elements in Aladdin.\r\n\r\nconst FresnelReflectorWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLxById = useStore(Selector.updateElementLxById);\r\n const updateLxAboveFoundation = useStore(Selector.updateElementLxAboveFoundation);\r\n const updateLxForAll = useStore(Selector.updateElementLxForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.lx ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (reflector: FresnelReflectorModel, lx: number) => {\r\n const parent = getParent(reflector);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(reflector)) as FresnelReflectorModel;\r\n clone.lx = lx;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (reflector: FresnelReflectorModel, lx: number) => {\r\n // check if the new width will cause the Fresnel reflector to be out of the bound\r\n if (!withinParent(reflector, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n (e as FresnelReflectorModel).lx = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setWidth = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.lx);\r\n } else {\r\n const oldWidthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldWidthsSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldWidthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.lx);\r\n } else {\r\n const oldWidthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldWidthsAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLxForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLxForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.lx);\r\n } else {\r\n const oldWidthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldWidthsAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLxAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLxAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldWidth = f ? f.lx : fresnelReflector.lx;\r\n rejectRef.current = rejectChange(fresnelReflector, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldWidth);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Width',\r\n timestamp: Date.now(),\r\n oldValue: oldWidth,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLxById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorWidth = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setWidth(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setWidth(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n // for some reason, we have to confirm the type first. otherwise, other popup menus may invoke this\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FresnelReflectorPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.poleHeight ?? 1);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n const inputPoleHeightRef = useRef(fresnelReflector?.poleHeight ?? 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(fresnelReflector);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && e.parentId === fresnelReflector.parentId && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n (e as FresnelReflectorModel).poleHeight = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as FresnelReflectorModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n inputPoleHeightRef.current = fresnelReflector.poleHeight;\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as FresnelReflectorModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as FresnelReflectorModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n inputPoleHeightRef.current = fresnelReflector.poleHeight;\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldPoleHeightsAll.set(elem.id, (elem as FresnelReflectorModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as FresnelReflectorModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n inputPoleHeightRef.current = fresnelReflector.poleHeight;\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldPoleHeight = f ? f.poleHeight : fresnelReflector.poleHeight;\r\n rejectRef.current = 0.5 * fresnelReflector.lx * Math.abs(Math.sin(fresnelReflector.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n inputPoleHeightRef.current = oldPoleHeight;\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorPoleHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FresnelReflectorModuleLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateModuleLengthById = useStore(Selector.updateModuleLengthById);\r\n const updateModuleLengthAboveFoundation = useStore(Selector.updateModuleLengthAboveFoundation);\r\n const updateModuleLengthForAll = useStore(Selector.updateModuleLengthForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.moduleLength ?? 3);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (reflector: FresnelReflectorModel, moduleLength: number) => {\r\n const parent = getParent(reflector);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(reflector)) as FresnelReflectorModel;\r\n clone.moduleLength = moduleLength;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (reflector: FresnelReflectorModel, moduleLength: number) => {\r\n // check if the new module length will cause the Fresnel reflector to be out of the bound\r\n if (!withinParent(reflector, moduleLength)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (moduleLength: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n (e as FresnelReflectorModel).moduleLength = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setModuleLength = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.moduleLength);\r\n } else {\r\n const oldModuleLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldModuleLengthsSelected.set(elem.id, (elem as FresnelReflectorModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Module Length for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeSelected.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldModuleLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.moduleLength);\r\n } else {\r\n const oldModuleLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldModuleLengthsAll.set(elem.id, (elem as FresnelReflectorModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Module Length for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeAll.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n updateModuleLengthForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateModuleLengthForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.moduleLength);\r\n } else {\r\n const oldModuleLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldModuleLengthsAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Module Length for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateModuleLengthAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateModuleLengthAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldModuleLength = f ? f.moduleLength : fresnelReflector.moduleLength;\r\n rejectRef.current = rejectChange(fresnelReflector, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldModuleLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Module Length',\r\n timestamp: Date.now(),\r\n oldValue: oldModuleLength,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateModuleLengthById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateModuleLengthById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateModuleLengthById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorModuleLength = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setModuleLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setModuleLength(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorModuleLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FresnelReflectorReflectanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateCspReflectanceById);\r\n const updateAboveFoundation = useStore(Selector.updateCspReflectanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateCspReflectanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.reflectance ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (reflectance: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n (e as FresnelReflectorModel).reflectance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReflectance = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldReflectancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldReflectancesSelected.set(elem.id, (elem as FresnelReflectorModel).reflectance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Reflectance for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldReflectancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldReflectancesAll.set(elem.id, (elem as FresnelReflectorModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Reflectance for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n const oldReflectancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldReflectancesAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Reflectance for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldReflectance = f ? f.reflectance : fresnelReflector.reflectance;\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Reflectance',\r\n timestamp: Date.now(),\r\n oldValue: oldReflectance,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorReflectance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setReflectance(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorReflectanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope, SolarStructure } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { Util } from 'src/Util';\r\nimport { HeliostatModel } from 'src/models/HeliostatModel';\r\n\r\nconst { Option } = Select;\r\n\r\nconst FresnelReflectorAbsorberSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateSolarReceiverById);\r\n const updateAboveFoundation = useStore(Selector.updateSolarReceiverAboveFoundation);\r\n const updateForAll = useStore(Selector.updateSolarReceiverForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [selectedReceiverId, setSelectedReceiverId] = useState(fresnelReflector?.receiverId ?? 'None');\r\n\r\n const lang = useLanguage();\r\n\r\n const pipes = useMemo(() => {\r\n const pipeIds: string[] = [];\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n pipeIds.push(f.id);\r\n }\r\n }\r\n }\r\n return pipeIds;\r\n }, [elements]);\r\n\r\n useEffect(() => {\r\n setSelectedReceiverId('None');\r\n if (fresnelReflector) {\r\n if (fresnelReflector.receiverId) {\r\n setSelectedReceiverId(fresnelReflector.receiverId);\r\n } else {\r\n const parent = getElementById(fresnelReflector.parentId);\r\n if (parent) {\r\n if (\r\n parent.type === ObjectType.Foundation &&\r\n (parent as FoundationModel).solarStructure === SolarStructure.FocusPipe\r\n ) {\r\n setSelectedReceiverId(parent.id);\r\n }\r\n }\r\n }\r\n }\r\n }, [fresnelReflector]);\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (receiverId: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.receiverId !== receiverId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.receiverId !== receiverId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.receiverId !== receiverId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (fresnelReflector?.receiverId !== receiverId) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, receiverId: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!Util.isHeliostatOrFresnelReflector(e.type)) continue;\r\n if (!e.locked && map.has(e.id)) {\r\n if (e.type === ObjectType.Heliostat) {\r\n (e as HeliostatModel).towerId = receiverId;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).receiverId = receiverId;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReceiverId = (value: string) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as FresnelReflectorModel).receiverId);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Receiver for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldValuesAll.set(elem.id, (elem as FresnelReflectorModel).receiverId);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Receiver for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).receiverId);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Receiver for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldValue = f ? f.receiverId : fresnelReflector.receiverId;\r\n const undoableChange = {\r\n name: 'Set Receiver for Fresnel Reflector',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorReceiver = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n if (selectedReceiverId) {\r\n setReceiverId(selectedReceiverId);\r\n }\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedReceiverId(value);\r\n }}\r\n >\r\n {pipes.map((s, i) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorAbsorberSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space, Switch } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { Util } from 'src/Util';\r\nimport { SolarCollector } from 'src/models/SolarCollector';\r\n\r\nconst FresnelReflectorDrawSunBeamSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const updateAboveFoundation = useStore(Selector.updateSolarCollectorDrawSunBeamAboveFoundation);\r\n const updateForAll = useStore(Selector.updateSolarCollectorDrawSunBeamForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [sunBeam, setSunBeam] = useState(!!fresnelReflector?.drawSunBeam);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (drawSunBeam: boolean) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (fresnelReflector?.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: boolean) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (!Util.isSolarCollectorType(e.type)) continue;\r\n if (!e.locked && e.type === ObjectType.FresnelReflector && map.has(e.id)) {\r\n (e as SolarCollector).drawSunBeam = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setDrawSunBeam = (value: boolean) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as FresnelReflectorModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Draw Sun Beam for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as boolean,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldValuesAll.set(elem.id, (elem as FresnelReflectorModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Draw Sun Beam for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as boolean);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Draw Sun Beam for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as boolean,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldValue = f ? f.drawSunBeam : fresnelReflector.drawSunBeam;\r\n const undoableChange = {\r\n name: 'Draw Sun Beam for Fresnel Reflector',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as boolean);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as boolean);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setDrawSunBeam(sunBeam);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSunBeam(checked);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorDrawSunBeamSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport FresnelReflectorLengthInput from './fresnelReflectorLengthInput';\r\nimport FresnelReflectorWidthInput from './fresnelReflectorWidthInput';\r\nimport FresnelReflectorPoleHeightInput from './fresnelReflectorPoleHeightInput';\r\nimport FresnelReflectorModuleLengthInput from './fresnelReflectorModuleLengthInput';\r\nimport FresnelReflectorReflectanceInput from './fresnelReflectorReflectanceInput';\r\nimport FresnelReflectorAbsorberSelection from './fresnelReflectorAbsorberSelection';\r\nimport FresnelReflectorDrawSunBeamSelection from './fresnelReflectorDrawSunBeamSelection';\r\nimport { ObjectType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\n\r\nexport const FresnelReflectorMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [moduleLengthDialogVisible, setModuleLengthDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [reflectanceDialogVisible, setReflectanceDialogVisible] = useState(false);\r\n const [receiverDialogVisible, setReceiverDialogVisible] = useState(false);\r\n const [sunBeamDialogVisible, setSunBeamDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(fresnelReflector);\r\n const showLabel = useLabelShow(fresnelReflector);\r\n const updateLabelText = useLabelText(fresnelReflector, labelText);\r\n const setLabelSize = useLabelSize(fresnelReflector);\r\n const setLabelFontSize = useLabelFontSize(fresnelReflector);\r\n const setLabelColor = useLabelColor(fresnelReflector);\r\n const setLabelHeight = useLabelHeight(fresnelReflector);\r\n\r\n if (!fresnelReflector) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !fresnelReflector?.locked;\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {fresnelReflector && editable && (\r\n <>\r\n {/* receiver */}\r\n {receiverDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setReceiverDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo', lang)} ...\r\n \r\n\r\n {/* reflector length */}\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {/* reflector width */}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {/* module length */}\r\n {moduleLengthDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setModuleLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('fresnelReflectorMenu.ModuleLength', lang)} ...\r\n \r\n\r\n {/* extra pole height in addition to the half of the aperture width */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.ExtraPoleHeight', lang)} ...\r\n \r\n\r\n {/* reflectance */}\r\n {reflectanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setReflectanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorReflectance', lang)} ...\r\n \r\n\r\n {/* draw sun beam or not */}\r\n {sunBeamDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setSunBeamDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)} ...\r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the dish center */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst HeliostatWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLyById = useStore(Selector.updateElementLyById);\r\n const updateLyAboveFoundation = useStore(Selector.updateElementLyAboveFoundation);\r\n const updateLyForAll = useStore(Selector.updateElementLyForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.ly ?? 4);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (heliostat: HeliostatModel, ly: number) => {\r\n const parent = getParent(heliostat);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(heliostat)) as HeliostatModel;\r\n clone.ly = ly;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (heliostat: HeliostatModel, ly: number) => {\r\n // check if the new width will cause the heliostat to be out of the bound\r\n if (!withinParent(heliostat, ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setWidth = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.ly);\r\n } else {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.ly);\r\n } else {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLyForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLyForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.ly);\r\n } else {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLyAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLyAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldValue = h ? h.ly : heliostat.ly;\r\n rejectRef.current = rejectChange(heliostat, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldValue);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Heliostat Width',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLyById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatWidth = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setWidth(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setWidth(inputValue);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 20 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HeliostatWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst HeliostatLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLxById = useStore(Selector.updateElementLxById);\r\n const updateLxAboveFoundation = useStore(Selector.updateElementLxAboveFoundation);\r\n const updateLxForAll = useStore(Selector.updateElementLxForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.lx ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (heliostat: HeliostatModel, lx: number) => {\r\n const parent = getParent(heliostat);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(heliostat)) as HeliostatModel;\r\n clone.lx = lx;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (heliostat: HeliostatModel, lx: number) => {\r\n // check if the new length will cause the heliostat to be out of the bound\r\n if (!withinParent(heliostat, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).lx = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLength = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.lx);\r\n } else {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.lx);\r\n } else {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLxForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLxForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.lx);\r\n } else {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Length for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLxAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLxAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldValue = h ? h.lx : heliostat.lx;\r\n rejectRef.current = rejectChange(heliostat, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldValue);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Heliostat Length',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLxById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatLength = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLength(inputValue);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 20 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HeliostatLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst HeliostatPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.poleHeight ?? 1);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(heliostat);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.parentId === heliostat.parentId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).poleHeight = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * Math.max(elem.lx, elem.ly) * Math.abs(Math.sin((elem as HeliostatModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.poleHeight);\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as HeliostatModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n if (0.5 * Math.max(elem.lx, elem.ly) * Math.abs(Math.sin((elem as HeliostatModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.poleHeight);\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldPoleHeightsAll.set(elem.id, (elem as HeliostatModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n if (0.5 * Math.max(elem.lx, elem.ly) * Math.abs(Math.sin((elem as HeliostatModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.poleHeight);\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as HeliostatModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldPoleHeight = h ? h.poleHeight : heliostat.poleHeight;\r\n rejectRef.current =\r\n 0.5 * Math.max(heliostat.lx, heliostat.ly) * Math.abs(Math.sin(heliostat.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldPoleHeight);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Heliostat Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HeliostatPoleHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst HeliostatReflectanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateCspReflectanceById);\r\n const updateAboveFoundation = useStore(Selector.updateCspReflectanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateCspReflectanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.reflectance ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (reflectance: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).reflectance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReflectance = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldReflectancesAll.set(elem.id, (elem as HeliostatModel).reflectance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Reflectance for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldReflectancesAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldReflectancesAll.set(elem.id, (elem as HeliostatModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Reflectance for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n const oldReflectancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldReflectancesAboveFoundation.set(elem.id, (elem as HeliostatModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Reflectance for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldReflectance = h ? h.reflectance : heliostat.reflectance;\r\n const undoableChange = {\r\n name: 'Set Heliostat Reflectance',\r\n timestamp: Date.now(),\r\n oldValue: oldReflectance,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatReflectance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setReflectance(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HeliostatReflectanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space, Switch } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst HeliostatDrawSunBeamSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const updateAboveFoundation = useStore(Selector.updateSolarCollectorDrawSunBeamAboveFoundation);\r\n const updateForAll = useStore(Selector.updateSolarCollectorDrawSunBeamForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [sunBeam, setSunBeam] = useState(!!heliostat?.drawSunBeam);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (drawSunBeam: boolean) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (hs.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (hs.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (hs.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (heliostat?.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: boolean) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).drawSunBeam = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setDrawSunBeam = (value: boolean) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as HeliostatModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Draw Sun Beam for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as boolean,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, (elem as HeliostatModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Draw Sun Beam for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.Heliostat, undoableChangeAll.newValue as boolean);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as HeliostatModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Draw Sun Beam for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as boolean,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldValue = h ? h.drawSunBeam : heliostat.drawSunBeam;\r\n const undoableChange = {\r\n name: 'Draw Sun Beam for Heliostat',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as boolean);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as boolean);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setDrawSunBeam(sunBeam);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HeliostatDrawSunBeamSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope, SolarStructure } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst { Option } = Select;\r\n\r\nconst HeliostatTowerSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateSolarReceiverById);\r\n const updateAboveFoundation = useStore(Selector.updateSolarReceiverAboveFoundation);\r\n const updateForAll = useStore(Selector.updateSolarReceiverForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [selectedTowerId, setSelectedTowerId] = useState(heliostat?.towerId ?? 'None');\r\n\r\n const lang = useLanguage();\r\n\r\n const towers = useMemo(() => {\r\n const towerIds: string[] = [];\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n towerIds.push(f.id);\r\n }\r\n }\r\n }\r\n return towerIds;\r\n }, [elements]);\r\n\r\n useEffect(() => {\r\n setSelectedTowerId('None');\r\n if (heliostat) {\r\n if (heliostat.towerId) {\r\n setSelectedTowerId(heliostat.towerId);\r\n } else {\r\n const parent = getElementById(heliostat.parentId);\r\n if (parent) {\r\n if (\r\n parent.type === ObjectType.Foundation &&\r\n (parent as FoundationModel).solarStructure === SolarStructure.FocusTower\r\n ) {\r\n setSelectedTowerId(parent.id);\r\n }\r\n }\r\n }\r\n }\r\n }, [heliostat]);\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (towerId: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (hs.towerId !== towerId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (hs.towerId !== towerId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (hs.towerId !== towerId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (heliostat?.towerId !== towerId) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).towerId = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setTowerId = (value: string) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as HeliostatModel).towerId);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tower for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, (elem as HeliostatModel).towerId);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tower for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.Heliostat, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as HeliostatModel).towerId);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Tower for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldValue = h ? h.towerId : heliostat.towerId;\r\n const undoableChange = {\r\n name: 'Set Tower for Heliostat',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatTower = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n if (selectedTowerId) {\r\n setTowerId(selectedTowerId);\r\n }\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HeliostatTowerSelection;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst HeliostatPoleRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleRadiusById = useStore(Selector.updateSolarCollectorPoleRadiusById);\r\n const updatePoleRadiusAboveFoundation = useStore(Selector.updateSolarCollectorPoleRadiusAboveFoundation);\r\n const updatePoleRadiusForAll = useStore(Selector.updateSolarCollectorPoleRadiusForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.poleRadius ?? 0.1);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleRadius: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(heliostat);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.parentId === heliostat.parentId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).poleRadius = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleRadius = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as HeliostatModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Radius for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, (elem as HeliostatModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Radius for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleRadiusForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleRadiusForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as HeliostatModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Radius for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleRadiusAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleRadiusAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldPoleRadius = h ? h.poleRadius : heliostat.poleRadius;\r\n const undoableChange = {\r\n name: 'Set Heliostat Pole Radius',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleRadius,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updatePoleRadiusById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleRadiusById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleRadiusById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatPoleRadius = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPoleRadius(inputValue);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 0.5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default HeliostatPoleRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport HeliostatWidthInput from './heliostatWidthInput';\r\nimport HeliostatLengthInput from './heliostatLengthInput';\r\nimport HeliostatPoleHeightInput from './heliostatPoleHeightInput';\r\nimport HeliostatReflectanceInput from './heliostatReflectorReflectanceInput';\r\nimport HeliostatDrawSunBeamSelection from './heliostatDrawSunBeamSelection';\r\nimport HeliostatTowerSelection from './heliostatTowerSelection';\r\nimport { ObjectType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport HeliostatPoleRadiusInput from './heliostatPoleRadiusInput';\r\n\r\nexport const HeliostatMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [poleRadiusDialogVisible, setPoleRadiusDialogVisible] = useState(false);\r\n const [reflectanceDialogVisible, setReflectanceDialogVisible] = useState(false);\r\n const [sunBeamDialogVisible, setSunBeamDialogVisible] = useState(false);\r\n const [towerDialogVisible, setTowerDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(heliostat);\r\n const showLabel = useLabelShow(heliostat);\r\n const updateLabelText = useLabelText(heliostat, labelText);\r\n const setLabelSize = useLabelSize(heliostat);\r\n const setLabelFontSize = useLabelFontSize(heliostat);\r\n const setLabelColor = useLabelColor(heliostat);\r\n const setLabelHeight = useLabelHeight(heliostat);\r\n\r\n if (!heliostat) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !heliostat?.locked;\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {heliostat && editable && (\r\n <>\r\n {/* select tower */}\r\n {towerDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTowerDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('heliostatMenu.SelectTowerToReflectSunlightTo', lang)} ...\r\n \r\n\r\n {/* heliostat length */}\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {/* heliostat width */}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {/* extra pole height in addition to the half of the aperture size */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.ExtraPoleHeight', lang)} ...\r\n \r\n\r\n {poleRadiusDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.PoleRadius', lang)} ...\r\n \r\n\r\n {/* reflectance */}\r\n {reflectanceDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setReflectanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorReflectance', lang)} ...\r\n \r\n\r\n {/* draw sun beam or not */}\r\n {sunBeamDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setSunBeamDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)} ...\r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the center */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport { Select } from 'antd';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { ObjectType, TreeType } from '../../../types';\nimport AppleImage from '../../../resources/apple_summer.png';\nimport BirchImage from '../../../resources/birch_summer.png';\nimport CoconutImage from '../../../resources/coconut.png';\nimport DogwoodImage from '../../../resources/dogwood_summer.png';\nimport ElmImage from '../../../resources/elm_summer.png';\nimport LindenImage from '../../../resources/linden_summer.png';\nimport MagnoliaImage from '../../../resources/magnolia_summer.png';\nimport MapleImage from '../../../resources/maple_summer.png';\nimport OakImage from '../../../resources/oak_summer.png';\nimport FanPalmImage from '../../../resources/fan_palm.png';\nimport PineImage from '../../../resources/pine.png';\nimport SpruceImage from '../../../resources/spruce.png';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport i18n from '../../../i18n/i18n';\nimport { TreeModel } from '../../../models/TreeModel';\n\nconst { Option } = Select;\n\nconst TreeSelection = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const tree = useStore.getState().getSelectedElement() as TreeModel;\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const lang = { lng: language };\n\n const updateTreeTypeById = (id: string, type: TreeType) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Tree && e.id === id) {\n (e as TreeModel).name = type;\n break;\n }\n }\n });\n };\n\n return (\n {\n if (tree) {\n const oldTree = tree.name;\n if (oldTree !== value) {\n const undoableChange = {\n name: 'Change Tree',\n timestamp: Date.now(),\n oldValue: oldTree,\n newValue: value,\n changedElementId: tree.id,\n changedElementType: tree.type,\n undo: () => {\n updateTreeTypeById(undoableChange.changedElementId, undoableChange.oldValue as TreeType);\n },\n redo: () => {\n updateTreeTypeById(undoableChange.changedElementId, undoableChange.newValue as TreeType);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateTreeTypeById(tree.id, value);\n setCommonStore((state) => {\n state.actionState.treeType = value;\n });\n setUpdateFlag(!updateFlag);\n }\n }\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default TreeSelection;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType } from '../../../types';\r\nimport TreeSelection from './treeSelection';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { TreeModel } from '../../../models/TreeModel';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\n\r\nexport const TreeMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLzById = useStore(Selector.updateElementLzById);\r\n const tree = useSelectedElement(ObjectType.Tree) as TreeModel | undefined;\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const [inputSpread, setInputSpread] = useState(tree?.lx ?? 1);\r\n const [inputHeight, setInputHeight] = useState(tree?.lz ?? 1);\r\n\r\n const { labelText, setLabelText } = useLabel(tree);\r\n const showLabel = useLabelShow(tree);\r\n const updateLabelText = useLabelText(tree, labelText);\r\n const setLabelSize = useLabelSize(tree);\r\n const setLabelFontSize = useLabelFontSize(tree);\r\n const setLabelColor = useLabelColor(tree);\r\n const setLabelHeight = useLabelHeight(tree);\r\n\r\n if (!tree) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !tree?.locked;\r\n\r\n const updateTreeShowModelById = (id: string, showModel: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Tree && e.id === id) {\r\n (e as TreeModel).showModel = showModel;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTreeFlipById = (id: string, flip: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Tree && e.id === id) {\r\n (e as TreeModel).flip = flip;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const showTreeModel = (on: boolean) => {\r\n if (!tree) return;\r\n const undoableCheck = {\r\n name: 'Show Tree Model',\r\n timestamp: Date.now(),\r\n checked: on,\r\n selectedElementId: tree.id,\r\n selectedElementType: ObjectType.Tree,\r\n undo: () => {\r\n updateTreeShowModelById(tree.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateTreeShowModelById(tree.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateTreeShowModelById(tree.id, on);\r\n };\r\n\r\n const setSpread = (value: number) => {\r\n if (!tree) return;\r\n if (!value || value === inputSpread) return;\r\n const undoableChange = {\r\n name: 'Set Tree Spread',\r\n timestamp: Date.now(),\r\n oldValue: inputSpread,\r\n newValue: value,\r\n changedElementId: tree.id,\r\n changedElementType: tree.type,\r\n undo: () => {\r\n updateElementLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLxById(tree.id, value);\r\n setInputSpread(value);\r\n setCommonStore((state) => {\r\n state.actionState.treeSpread = value;\r\n });\r\n };\r\n\r\n const setHeight = (value: number) => {\r\n if (!tree) return;\r\n if (!value || value === inputHeight) return;\r\n const undoableChange = {\r\n name: 'Set Tree Height',\r\n timestamp: Date.now(),\r\n oldValue: inputHeight,\r\n newValue: value,\r\n changedElementId: tree.id,\r\n changedElementType: tree.type,\r\n undo: () => {\r\n updateElementLzById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLzById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLzById(tree.id, value);\r\n setInputHeight(value);\r\n setCommonStore((state) => {\r\n state.actionState.treeHeight = value;\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n \r\n showTreeModel(e.target.checked)}\r\n >\r\n {i18n.t('treeMenu.ShowModel', lang)}\r\n \r\n \r\n\r\n {editable && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Flip Tree',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: tree.id,\r\n selectedElementType: ObjectType.Tree,\r\n undo: () => {\r\n updateTreeFlipById(tree.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateTreeFlipById(tree.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateTreeFlipById(tree.id, checked);\r\n }}\r\n >\r\n {i18n.t('treeMenu.Flip', { lng: language })}\r\n \r\n \r\n )}\r\n\r\n {/* have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n {editable && (\r\n \r\n \r\n {i18n.t('treeMenu.Type', lang)}: \r\n \r\n \r\n\r\n \r\n \r\n {i18n.t('treeMenu.Spread', lang) + ' (' + i18n.t('word.MeterAbbreviation', lang) + ')'}:\r\n \r\n setSpread(value)}\r\n />\r\n \r\n\r\n \r\n \r\n {i18n.t('word.Height', lang) + ' (' + i18n.t('word.MeterAbbreviation', lang) + ')'}:\r\n \r\n setHeight(value)}\r\n />\r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the tree top */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH5QsaESMnxG6tNgAAARJJREFUeJzt2kFqQkEQhOHpoeahXtN4rEDwCgm4EBEMARMI2YXkDAbeCaJu+wZdi/87QUHT46sZ4/Pr/dZgQ7336gxI1IKBOFHvUZ0BCUeWGQZihiPLjMaYqjMg0TzP1RmQxMNmTTE0EofjnoEY0Wq1rM6ARO3GgjhR0EOsKIIe4oSmboamboYNMaPGQKyo86NuhSPLDAMxw1eWGU0T7yFOdLn8VWdAoqfHbXUGJHF6PXLda0RjjOoMSNQaC+KEHmJGjasTK2yIGZq6GTbEDO8hZngPMcORZYaBmOEry4wWS/7b60S/3z/VGZDo5XlXnQFJnD/euO41ouv/tToDEtELvdBDzPAeYoYNMcNAzHB1YuYO6bYjJ2+wRTUAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAIAAAAlV+npAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QsaESMX4redmgAAARNJREFUaIHt2sGtwjAQBFB2PY6ggbSc+//0AI2AOCMOiIgOkgKQENDC7mk10rwKRqvYsie2ZVk3EgNvVp2BBtxadQYacNewomCmZRjl1QGYaFgJ9nq9qzPQwDzfqzPQwPF4qM5Awx7zszoDDXy/1RF4oHdUZ6CBoffqDDQA6MuKgrnOpVForrthlPqsBLhpGUap/EvQBp+gSSVoWAk6lCZgXZfqDDSw//+rzkDDrtdbdQYa2O521RlooDUdSqMwDOqzogBoWFFwXXfC1GclwDWsMLUOCeqzErTBJ2hSCRpWAkw/LMLw+egxWxSmaarOQMNO50t1BhoYx7E6Aw29g09Qn5WArj4rDKZaOQxQRROmPivhByjbHph8EXN9AAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/wall_03_menu.39f5c56a.png\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/wall_05_menu.c887c64e.png\";","export default __webpack_public_path__ + \"static/media/wall_06_menu.3dc4a0c2.png\";","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/wall_09_menu.5124ae81.png\";","export default __webpack_public_path__ + \"static/media/wall_10_menu.a934991d.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport WallTextureDefaultIcon from 'src/resources/wall_edge.png';\r\nimport WallTexture01Icon from 'src/resources/wall_01_menu.png';\r\nimport WallTexture02Icon from 'src/resources/wall_02_menu.png';\r\nimport WallTexture03Icon from 'src/resources/wall_03_menu.png';\r\nimport WallTexture04Icon from 'src/resources/wall_04_menu.png';\r\nimport WallTexture05Icon from 'src/resources/wall_05_menu.png';\r\nimport WallTexture06Icon from 'src/resources/wall_06_menu.png';\r\nimport WallTexture07Icon from 'src/resources/wall_07_menu.png';\r\nimport WallTexture08Icon from 'src/resources/wall_08_menu.png';\r\nimport WallTexture09Icon from 'src/resources/wall_09_menu.png';\r\nimport WallTexture10Icon from 'src/resources/wall_10_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, WallTexture } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallTextureSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const lang = useLanguage();\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(wall?.textureType ?? WallTexture.Default);\r\n\r\n const { Option } = Select;\r\n\r\n const updateById = (id: string, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).textureType = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (texture: WallTexture) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n (e as WallModel).textureType = texture;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundationId && !e.locked) {\r\n (e as WallModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n (e as WallModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: WallTexture) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).textureType &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.textureType) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setTexture = (value: WallTexture) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldTexturesSelected.set(e.id, (e as WallModel).textureType ?? WallTexture.Default);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, texture as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as WallTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n oldTexturesAll.set(e.id, (e as WallModel).textureType ?? WallTexture.Default);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, texture as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as WallTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && !e.locked) {\r\n oldTexturesAboveFoundation.set(e.id, (e as WallModel).textureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Texture for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, wt] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, wt as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as WallTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.textureType);\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Texture for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as WallTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldTexture = updatedWall?.textureType ?? wall.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as WallTexture);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as WallTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallTexture = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallTextureSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { useColorPicker, useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { CompactPicker } from 'react-color';\r\n\r\nconst WallColorSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const lang = useLanguage();\r\n\r\n const [selectedColor, onColorChange] = useColorPicker(wall?.color ?? '#ffffff');\r\n\r\n const updateById = (id: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n e.color = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (color: string) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n e.color = color;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundationId && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n e.color = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== e.color &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.color) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateColor = (value: string) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldColorsSelected.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldColorsAll.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldColorsAboveFoundation.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Color for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.color ?? '#ffffff');\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Color for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as string);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldColor = updatedWall?.color ?? wall.color ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Color of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n updateColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Util } from '../../../Util';\r\nimport { useColorPicker, useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallStructureColorSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [selectedColor, onColorChange] = useColorPicker(wall?.structureColor ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).structureColor = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (color: string) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n (e as WallModel).structureColor = color;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (fId: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === fId && e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).structureColor = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).structureColor = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n e.color = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).structureColor &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).structureColor && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).structureColor &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.structureColor && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.structureColor) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldColorsSelected.set(e.id, (e as WallModel).structureColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Structure Color for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldColorsAll.set(e.id, (e as WallModel).structureColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Structure Color for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldColorsAboveFoundation.set(e.id, (e as WallModel).structureColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Structure Color for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.color ?? '#ffffff');\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Structure Color for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as string);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldColor = updatedWall?.structureColor ?? wall.structureColor ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Structure Color of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallStructureColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallStructureColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\ninterface WallNumberInputProps {\r\n wall: WallModel;\r\n dataType: string;\r\n attributeKey: keyof WallModel;\r\n range: [min: number, max: number];\r\n step: number;\r\n setDialogVisible: () => void;\r\n unit?: string;\r\n}\r\n\r\nconst WallNumberInput = ({\r\n wall,\r\n dataType,\r\n attributeKey,\r\n range,\r\n step,\r\n unit,\r\n setDialogVisible,\r\n}: WallNumberInputProps) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const inputRef = useRef(wall[attributeKey] as number);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateActionState = (value: number) => {\r\n setCommonStore((state) => {\r\n switch (attributeKey) {\r\n case 'ly':\r\n state.actionState.wallThickness = value;\r\n break;\r\n case 'lz':\r\n state.actionState.wallHeight = value;\r\n break;\r\n case 'opacity':\r\n state.actionState.wallOpacity = value;\r\n break;\r\n case 'structureSpacing':\r\n state.actionState.wallStructureSpacing = value;\r\n break;\r\n case 'structureWidth':\r\n state.actionState.wallStructureWidth = value;\r\n break;\r\n case 'eavesLength':\r\n state.actionState.wallEavesLength = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const updateById = (id: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel)[attributeKey] as number) = val;\r\n break;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateConnectedWalls = (val: number) => {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n ((e as WallModel)[attributeKey] as number) = val;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateAboveFoundation = (fId: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === fId && e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel)[attributeKey] as number) = val;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateForAll = (val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel)[attributeKey] as number) = val;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n ((e as WallModel)[attributeKey] as number) = value;\r\n }\r\n }\r\n });\r\n updateActionState(value);\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel)[attributeKey] &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel)[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall[attributeKey]) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WallModel)[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldValuesAll.set(e.id, (e as WallModel)[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldValuesAboveFoundation.set(e.id, (e as WallModel)[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Walls Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e[attributeKey] as number);\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set ${dataType} for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const oldValue = wall[attributeKey] as number;\r\n const undoableChange = {\r\n name: `Set Wall ${dataType}`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n inputRef.current = wall[attributeKey] as number;\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputRef.current);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n (inputRef.current = val)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{range.toString()}] {unit}\r\n
\r\n \r\n \r\n {unit ?? ' '}\r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WallNumberInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_WALL_R_VALUE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallRValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(wall?.rValue ?? DEFAULT_WALL_R_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toRValueInUS(inputValue));\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as WallModel).rValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).rValue &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).rValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).rValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.rValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.rValue) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n oldValuesSelected.set(e.id, w.rValue ?? DEFAULT_WALL_R_VALUE);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set R-Value for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n const w = e as WallModel;\r\n oldValuesAll.set(e.id, w.rValue ?? DEFAULT_WALL_R_VALUE);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set R-Value for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall?.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && !e.locked) {\r\n const w = e as WallModel;\r\n oldValuesAboveFoundation.set(e.id, w.rValue ?? DEFAULT_WALL_R_VALUE);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set R-Value for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n if (!e.locked) {\r\n const w = e as WallModel;\r\n oldValuesConnectedWalls.set(e.id, w.rValue ?? DEFAULT_WALL_R_VALUE);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: 'Set R-Value for All Connected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeConnectedWalls.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeConnectedWalls.oldValues as Map,\r\n undoableChangeConnectedWalls.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldValue = updatedWall.rValue ?? wall.rValue ?? DEFAULT_WALL_R_VALUE;\r\n const undoableChange = {\r\n name: 'Set Wall R-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallRValue = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setInputValue(wall?.rValue ?? DEFAULT_WALL_R_VALUE);\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toRValueInUS(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: m²·℃/W\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toRValueInSI(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toRValueInUS(0.01).toFixed(3)}, {Util.toRValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: h·ft²·℉/Btu\r\n
\r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default WallRValueInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallHeatCapacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(wall?.volumetricHeatCapacity ?? 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as WallModel).volumetricHeatCapacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).volumetricHeatCapacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).volumetricHeatCapacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).volumetricHeatCapacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.volumetricHeatCapacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.volumetricHeatCapacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n oldValuesSelected.set(e.id, w.volumetricHeatCapacity ?? 0.5);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Volumetric Heat Capacity for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n const w = e as WallModel;\r\n oldValuesAll.set(e.id, w.volumetricHeatCapacity ?? 0.5);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Volumetric Heat Capacity for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall?.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && !e.locked) {\r\n const w = e as WallModel;\r\n oldValuesAboveFoundation.set(e.id, w.volumetricHeatCapacity ?? 0.5);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Volumetric Heat Capacity for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n if (!e.locked) {\r\n const w = e as WallModel;\r\n oldValuesConnectedWalls.set(e.id, w.volumetricHeatCapacity ?? 0.5);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: 'Set Volumetric Heat Capacity for All Connected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeConnectedWalls.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeConnectedWalls.oldValues as Map,\r\n undoableChangeConnectedWalls.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldValue = updatedWall.volumetricHeatCapacity ?? wall.volumetricHeatCapacity ?? 0.5;\r\n const undoableChange = {\r\n name: 'Set Volumetric Heat Capacity of Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallVolumetricHeatCapacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={setInputValue}\r\n />\r\n
\r\n kWh/(m³·℃)\r\n
\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WallHeatCapacityInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ParapetArgs, WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\ninterface WallNumberInputProps {\r\n wall: WallModel;\r\n dataType: string;\r\n attributeKey: keyof ParapetArgs;\r\n range: [min: number, max: number];\r\n step: number;\r\n setDialogVisible: () => void;\r\n unit?: string;\r\n}\r\n\r\nconst WallParapetNumberInput = ({\r\n wall,\r\n dataType,\r\n attributeKey,\r\n range,\r\n step,\r\n unit,\r\n setDialogVisible,\r\n}: WallNumberInputProps) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const inputRef = useRef(wall.parapet[attributeKey] as number);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateActionState = (value: number) => {\r\n setCommonStore((state) => {\r\n switch (attributeKey) {\r\n case 'copingsHeight':\r\n state.actionState.wallParapet.copingsHeight = value;\r\n break;\r\n case 'copingsWidth':\r\n state.actionState.wallParapet.copingsWidth = value;\r\n break;\r\n case 'parapetHeight':\r\n state.actionState.wallParapet.parapetHeight = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const updateById = (id: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel).parapet[attributeKey] as number) = val;\r\n break;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateConnectedWalls = (val: number) => {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n ((e as WallModel).parapet[attributeKey] as number) = val;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateAboveFoundation = (fId: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === fId && e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel).parapet[attributeKey] as number) = val;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateForAll = (val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel).parapet[attributeKey] as number) = val;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n ((e as WallModel).parapet[attributeKey] as number) = value;\r\n }\r\n }\r\n });\r\n updateActionState(value);\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).parapet[attributeKey] &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).parapet[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).parapet[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.parapet[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall.parapet[attributeKey]) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WallModel).parapet[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldValuesAll.set(e.id, (e as WallModel).parapet[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldValuesAboveFoundation.set(e.id, (e as WallModel).parapet[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Walls Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.parapet[attributeKey] as number);\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set ${dataType} for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const oldValue = wall.parapet[attributeKey] as number;\r\n const undoableChange = {\r\n name: `Set Wall ${dataType}`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputRef.current);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n (inputRef.current = val)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{range.toString()}] {unit}\r\n
\r\n \r\n \r\n {unit ?? ' '}\r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WallParapetNumberInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Util } from '../../../Util';\r\nimport { useColorPicker, useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst WallParapetColorSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const lang = useLanguage();\r\n const [selectedColor, onColorChange] = useColorPicker(wall?.parapet.color ?? '#ffffff');\r\n\r\n const updateById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).parapet.color = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (color: string) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n (e as WallModel).parapet.color = color;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (fId: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === fId && e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).parapet.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).parapet.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n (e as WallModel).parapet.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).parapet.color &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).parapet.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).parapet.color &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.parapet.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.parapet.color) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateColor = (value: string) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldColorsSelected.set(e.id, (e as WallModel).parapet.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Parapet Color for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldColorsAll.set(e.id, (e as WallModel).parapet.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Parapet Color for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldColorsAboveFoundation.set(e.id, (e as WallModel).parapet.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Parapet Color for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.color ?? '#ffffff');\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Parapet Color for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as string);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldColor = updatedWall?.parapet.color ?? wall.parapet.color ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Parapet Color of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallParapet.color = value;\r\n });\r\n };\r\n\r\n const apply = () => {\r\n updateColor(selectedColor);\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallParapetColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport WallTextureDefaultIcon from 'src/resources/wall_edge.png';\r\nimport WallTexture01Icon from 'src/resources/wall_01_menu.png';\r\nimport WallTexture02Icon from 'src/resources/wall_02_menu.png';\r\nimport WallTexture03Icon from 'src/resources/wall_03_menu.png';\r\nimport WallTexture04Icon from 'src/resources/wall_04_menu.png';\r\nimport WallTexture05Icon from 'src/resources/wall_05_menu.png';\r\nimport WallTexture06Icon from 'src/resources/wall_06_menu.png';\r\nimport WallTexture07Icon from 'src/resources/wall_07_menu.png';\r\nimport WallTexture08Icon from 'src/resources/wall_08_menu.png';\r\nimport WallTexture09Icon from 'src/resources/wall_09_menu.png';\r\nimport WallTexture10Icon from 'src/resources/wall_10_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, WallTexture } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallParapetTextureSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(wall?.parapet.textureType ?? WallTexture.Default);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateById = (id: string, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).parapet.textureType = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (texture: WallTexture) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n (e as WallModel).parapet.textureType = texture;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundationId && !e.locked) {\r\n (e as WallModel).parapet.textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).parapet.textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, texture: WallTexture) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n (e as WallModel).parapet.textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: WallTexture) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).parapet.textureType &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).parapet.textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).parapet.textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.parapet.textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.parapet.textureType) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateTexture = (value: WallTexture) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldTexturesSelected.set(e.id, (e as WallModel).parapet.textureType ?? WallTexture.Default);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Parapet Texture for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, texture as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as WallTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n oldTexturesAll.set(e.id, (e as WallModel).parapet.textureType ?? WallTexture.Default);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Parapet Texture for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, texture as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as WallTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && !e.locked) {\r\n oldTexturesAboveFoundation.set(e.id, (e as WallModel).parapet.textureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Parapet Texture for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, wt] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, wt as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as WallTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.parapet.textureType);\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Parapet Texture for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as WallTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldTexture = updatedWall?.parapet.textureType ?? wall.parapet.textureType;\r\n const undoableChange = {\r\n name: 'Set Parapet Texture of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as WallTexture);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as WallTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallParapet.textureType = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n updateTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallParapetTextureSelection;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { Copy, Cut, Lock } from '../menuItems';\nimport { WindowModel, WindowType } from '../../../models/WindowModel';\nimport { Checkbox, Divider, Menu } from 'antd';\nimport i18n from 'src/i18n/i18n';\nimport SubMenu from 'antd/lib/menu/SubMenu';\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\nimport { ObjectType } from 'src/types';\nimport WindowColorSelection from './windowColorSelection';\nimport WindowNumberInput from './windowNumberInput';\nimport WindowUValueInput from './windowUValueInput';\nimport { useSelectedElement } from './menuHooks';\nimport WindowOptionSelection from './windowOptionSelection';\nimport WindowBooleanSelection from './windowBooleanSelection';\n\nexport enum WindowDataType {\n Color = 'Color',\n Tint = 'Tint',\n Opacity = 'Opacity',\n WindowType = 'WindowType',\n HorizontalMullion = 'HorizontalMullion',\n VerticalMullion = 'VerticalMullion',\n MullionWidth = 'MullionWidth',\n HorizontalMullionSpacing = 'HorizontalMullionSpacing',\n VerticalMullionSpacing = 'VerticalMullionSpacing',\n MullionColor = 'MullionColor',\n Frame = 'Frame',\n FrameWidth = 'FrameWidth',\n SillWidth = 'SillWidth',\n Width = 'Width',\n Height = 'Height',\n Setback = 'Setback',\n LeftShutter = 'LeftShutter',\n RightShutter = 'RightShutter',\n ShutterColor = 'ShutterColor',\n ShutterWidth = 'ShutterWidth',\n}\n\ntype ColorSelectionSettingType = {\n attributeKey: keyof WindowModel;\n};\n\ntype BooleanSelectionSettingType = {\n attributeKey: keyof WindowModel;\n};\n\ntype OptionSelectionSettingType = {\n attributeKey: keyof WindowModel;\n options: string[];\n};\n\ntype NumberDialogSettingType = {\n attributeKey: keyof WindowModel;\n range: [min: number, max: number];\n step: number;\n unit?: string;\n note?: string;\n digit?: number;\n};\n\nconst ColorDialogSettings = {\n Tint: { attributeKey: 'tint' },\n Color: { attributeKey: 'color' },\n MullionColor: { attributeKey: 'mullionColor' },\n ShutterColor: { attributeKey: 'shutterColor' },\n};\n\nconst BooleanDialogSettings = {\n HorizontalMullion: { attributeKey: 'horizontalMullion' },\n VerticalMullion: { attributeKey: 'verticalMullion' },\n Frame: { attributeKey: 'frame' },\n LeftShutter: { attributeKey: 'leftShutter' },\n RightShutter: { attributeKey: 'rightShutter' },\n};\n\nconst OptionDialogSettings = {\n WindowType: {\n attributeKey: 'windowType',\n options: [WindowType.Default, WindowType.Arched, WindowType.Polygonal],\n },\n};\n\nconst NumberDialogSettings = {\n Opacity: {\n attributeKey: 'opacity',\n range: [0, 0.9],\n step: 0.1,\n note: 'windowMenu.SolarHeatGainCoefficient',\n digit: 1,\n },\n Width: { attributeKey: 'lx', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\n Height: { attributeKey: 'lz', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\n Setback: {\n attributeKey: 'cy',\n range: [0, 1],\n step: 0.01,\n unit: '',\n digit: 0,\n note: 'windowMenu.RelativeToWallThickness',\n },\n MullionWidth: { attributeKey: 'mullionWidth', range: [0, 0.2], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\n ShutterWidth: { attributeKey: 'shutterWidth', range: [0, 0.5], step: 0.01, unit: '', digit: 1 },\n HorizontalMullionSpacing: {\n attributeKey: 'horizontalMullionSpacing',\n range: [0.1, 5],\n step: 0.01,\n unit: 'word.MeterAbbreviation',\n digit: 1,\n },\n VerticalMullionSpacing: {\n attributeKey: 'verticalMullionSpacing',\n range: [0.1, 5],\n step: 0.01,\n unit: 'word.MeterAbbreviation',\n digit: 1,\n },\n FrameWidth: { attributeKey: 'frameWidth', range: [0.05, 0.2], step: 0.01, unit: 'word.MeterAbbreviation', digit: 2 },\n SillWidth: { attributeKey: 'sillWidth', range: [0, 0.5], step: 0.01, unit: 'word.MeterAbbreviation', digit: 2 },\n};\n\nexport const WindowMenu = React.memo(() => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const setApplyCount = useStore(Selector.setApplyCount);\n const getParent = useStore(Selector.getParent);\n\n const [dataType, setDataType] = useState(null);\n const [uValueDialogVisible, setUValueDialogVisible] = useState(false);\n\n const window = useSelectedElement(ObjectType.Window) as WindowModel | undefined;\n\n if (!window) return null;\n\n const lang = { lng: language };\n const parent = window ? getParent(window) : null;\n\n const updateEmptyWindowById = (id: string, empty: boolean) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Window) {\n (e as WindowModel).empty = empty;\n break;\n }\n }\n });\n };\n\n const updateInteriorById = (id: string, interior: boolean) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Window) {\n (e as WindowModel).interior = interior;\n break;\n }\n }\n });\n };\n\n const renderCut = () => {\n if (!window || window.locked) {\n return null;\n }\n return ;\n };\n\n const renderMenuItem = (dataType: WindowDataType) => {\n return (\n {\n setApplyCount(0);\n setDataType(dataType);\n }}\n >\n {i18n.t(`windowMenu.${dataType}`, lang)} ...\n \n );\n };\n\n const renderMullionSubMenu = () => {\n if (!window) return null;\n return (\n \n {renderMenuItem(WindowDataType.HorizontalMullion)}\n {renderMenuItem(WindowDataType.VerticalMullion)}\n \n {renderMenuItem(WindowDataType.HorizontalMullionSpacing)}\n {renderMenuItem(WindowDataType.VerticalMullionSpacing)}\n {renderMenuItem(WindowDataType.MullionWidth)}\n {renderMenuItem(WindowDataType.MullionColor)}\n \n );\n };\n\n const renderFrameSubMenu = () => {\n if (!window) return null;\n return (\n \n {renderMenuItem(WindowDataType.Frame)}\n \n {renderMenuItem(WindowDataType.FrameWidth)}\n {renderMenuItem(WindowDataType.SillWidth)}\n {renderMenuItem(WindowDataType.Color)}\n \n );\n };\n\n const renderShutterSubMenu = () => {\n if (!window) return null;\n return (\n \n {renderMenuItem(WindowDataType.LeftShutter)}\n {renderMenuItem(WindowDataType.RightShutter)}\n {renderMenuItem(WindowDataType.ShutterColor)}\n {renderMenuItem(WindowDataType.ShutterWidth)}\n \n );\n };\n\n const renderDialogs = () => {\n switch (dataType) {\n case WindowDataType.Frame:\n case WindowDataType.LeftShutter:\n case WindowDataType.RightShutter:\n case WindowDataType.HorizontalMullion:\n case WindowDataType.VerticalMullion: {\n const setting = BooleanDialogSettings[dataType] as BooleanSelectionSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n />\n );\n }\n case WindowDataType.Tint:\n case WindowDataType.MullionColor:\n case WindowDataType.ShutterColor:\n case WindowDataType.Color: {\n const setting = ColorDialogSettings[dataType] as ColorSelectionSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n />\n );\n }\n case WindowDataType.WindowType: {\n const setting = OptionDialogSettings[dataType] as OptionSelectionSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n />\n );\n }\n case WindowDataType.Opacity:\n case WindowDataType.Width:\n case WindowDataType.Height:\n case WindowDataType.Setback:\n case WindowDataType.HorizontalMullionSpacing:\n case WindowDataType.VerticalMullionSpacing:\n case WindowDataType.MullionWidth:\n case WindowDataType.SillWidth:\n case WindowDataType.ShutterWidth:\n case WindowDataType.FrameWidth: {\n const setting = NumberDialogSettings[dataType] as NumberDialogSettingType;\n if (dataType === WindowDataType.Width) {\n setting.range[1] =\n parent && window && window.parentType !== ObjectType.Roof\n ? 2 * parent.lx * Math.min(Math.abs(0.5 - window.cx), Math.abs(-0.5 - window.cx))\n : 100;\n } else if (dataType === WindowDataType.Height) {\n setting.range[1] =\n parent && window && window.parentType !== ObjectType.Roof\n ? 2 * parent.lz * Math.min(Math.abs(0.5 - window.cz), Math.abs(-0.5 - window.cz))\n : 100;\n }\n if (!setting) return null;\n return (\n setDataType(null)}\n unit={setting.unit ? i18n.t(setting.unit, lang) : undefined}\n note={setting.note ? i18n.t(setting.note, lang) : undefined}\n digit={setting.digit ?? 0}\n />\n );\n }\n }\n };\n\n return (\n \n \n {renderCut()}\n \n\n {!window.locked && (\n <>\n \n {\n const checked = e.target.checked;\n const undoableCheck = {\n name: 'Empty Window',\n timestamp: Date.now(),\n checked: checked,\n selectedElementId: window.id,\n selectedElementType: window.type,\n undo: () => {\n updateEmptyWindowById(window.id, !undoableCheck.checked);\n },\n redo: () => {\n updateEmptyWindowById(window.id, undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n updateEmptyWindowById(window.id, checked);\n setCommonStore((state) => {\n state.actionState.windowEmpty = checked;\n });\n }}\n >\n {i18n.t('windowMenu.Empty', lang)}\n \n \n \n {\n const checked = e.target.checked;\n const undoableCheck = {\n name: 'Interior Window',\n timestamp: Date.now(),\n checked: checked,\n selectedElementId: window.id,\n selectedElementType: window.type,\n undo: () => {\n updateInteriorById(window.id, !undoableCheck.checked);\n },\n redo: () => {\n updateInteriorById(window.id, undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n updateInteriorById(window.id, checked);\n setCommonStore((state) => {\n state.actionState.windowInterior = checked;\n });\n }}\n >\n {i18n.t('windowMenu.Interior', lang)}\n \n \n {renderMenuItem(WindowDataType.WindowType)}\n {renderMenuItem(WindowDataType.Width)}\n {renderMenuItem(WindowDataType.Height)}\n {renderMenuItem(WindowDataType.Setback)}\n {renderMenuItem(WindowDataType.Opacity)}\n {renderMenuItem(WindowDataType.Tint)}\n {/* u-value has its special UI */}\n {uValueDialogVisible && }\n {\n setApplyCount(0);\n setUValueDialogVisible(true);\n }}\n >\n {i18n.t('word.UValue', lang)} ...\n \n {renderMullionSubMenu()}\n {renderFrameSubMenu()}\n {renderShutterSubMenu()}\n {renderDialogs()}\n \n )}\n \n );\n});\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport DoorTextureDefaultIcon from 'src/resources/door_edge.png';\r\nimport DoorTexture01Icon from 'src/resources/door_01.png';\r\nimport DoorTexture02Icon from 'src/resources/door_02.png';\r\nimport DoorTexture03Icon from 'src/resources/door_03.png';\r\nimport DoorTexture04Icon from 'src/resources/door_04.png';\r\nimport DoorTexture05Icon from 'src/resources/door_05.png';\r\nimport DoorTexture06Icon from 'src/resources/door_06.png';\r\nimport DoorTexture07Icon from 'src/resources/door_07.png';\r\nimport DoorTexture08Icon from 'src/resources/door_08.png';\r\nimport DoorTexture09Icon from 'src/resources/door_09.png';\r\nimport DoorTexture10Icon from 'src/resources/door_10.png';\r\nimport DoorTexture11Icon from 'src/resources/door_11.png';\r\nimport DoorTexture12Icon from 'src/resources/door_12.png';\r\nimport DoorTexture13Icon from 'src/resources/door_13.png';\r\nimport DoorTexture14Icon from 'src/resources/door_14.png';\r\nimport DoorTexture15Icon from 'src/resources/door_15.png';\r\nimport DoorTexture16Icon from 'src/resources/door_16.png';\r\nimport DoorTexture17Icon from 'src/resources/door_17.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, DoorTexture } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from 'src/models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(door?.textureType ?? DoorTexture.Default);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateTextureById = (id: string, textureType: DoorTexture) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as DoorModel).textureType = textureType;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTextureInMap = (map: Map, textureType: DoorTexture) => {\r\n for (const id of map.keys()) {\r\n updateTextureById(id, textureType);\r\n }\r\n };\r\n\r\n const undoTextureInMap = (map: Map) => {\r\n for (const [id, texture] of map.entries()) {\r\n updateTextureById(id, texture);\r\n }\r\n };\r\n\r\n const needChange = (value: DoorTexture) => {\r\n if (!door) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n value !== (e as DoorModel).textureType &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && value !== (e as DoorModel).textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.foundationId === door.foundationId &&\r\n value !== (e as DoorModel).textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.parentId === door.parentId &&\r\n value !== (e as DoorModel).textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== door?.textureType) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setTexture = (value: DoorTexture) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTexturesSelected.set(elem.id, (elem as DoorModel).textureType ?? DoorTexture.Default);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as DoorTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateTextureInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked) {\r\n oldTexturesAll.set(elem.id, (elem as DoorModel).textureType ?? DoorTexture.Default);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeAll.oldValues as Map,\r\n undoableChangeAll.newValue as DoorTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateTextureInMap(oldTexturesAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.foundationId === door.foundationId && !elem.locked) {\r\n oldTexturesAboveFoundation.set(elem.id, (elem as DoorModel).textureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Texture for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateTextureInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as DoorTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateTextureInMap(oldTexturesAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldTexturesOnSameWall = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.parentId === door.parentId && !elem.locked) {\r\n oldTexturesOnSameWall.set(elem.id, (elem as DoorModel).textureType);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Texture for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesOnSameWall,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSameWall.groupId) {\r\n updateTextureInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as DoorTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateTextureInMap(oldTexturesOnSameWall, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldTexture = updatedDoor ? updatedDoor.textureType : door.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Door',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateTextureById(undoableChange.changedElementId, undoableChange.oldValue as DoorTexture);\r\n },\r\n redo: () => {\r\n updateTextureById(undoableChange.changedElementId, undoableChange.newValue as DoorTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateTextureById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorTexture = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DoorTextureSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { DoorModel } from 'src/models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst DoorColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(door?.color ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateColorById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n e.color = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const undoColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (color: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n color !== e.color &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && color !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door?.foundationId && color !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door?.parentId && color !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== door?.color) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateColor = (value: string) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, elem.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked) {\r\n oldColorsAll.set(elem.id, elem.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.foundationId === door.foundationId && !door.locked) {\r\n oldColorsAboveFoundation.set(elem.id, elem.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Color for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldColorsOnSameWall = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.parentId === door.parentId && !door.locked) {\r\n oldColorsOnSameWall.set(elem.id, elem.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Color for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsOnSameWall,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSameWall.groupId) {\r\n updateColorInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateColorInMap(oldColorsOnSameWall, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldColor = (updatedDoor ? updatedDoor.color : door.color) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Color of Selected Door',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateColorById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DoorColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_DOOR_U_VALUE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorUValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(door?.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toUValueInUS(inputValue));\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as DoorModel).uValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!door) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n value !== (e as DoorModel).uValue &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && value !== (e as DoorModel).uValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.foundationId === door.foundationId &&\r\n value !== (e as DoorModel).uValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.parentId === door.parentId &&\r\n value !== (e as DoorModel).uValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== door?.uValue) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesSelected.set(e.id, door.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n door.uValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set U-Value for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAll.set(e.id, door.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n door.uValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set U-Value for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAboveFoundation.set(e.id, door.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n door.uValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set U-Value for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValues.set(e.id, door.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n door.uValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set U-Value for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldValue = updatedDoor.uValue ?? door.uValue ?? DEFAULT_DOOR_U_VALUE;\r\n const undoableChange = {\r\n name: 'Set Door U-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorUValue = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toUValueInUS(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: W/(m²·℃)\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toUValueInSI(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toUValueInUS(0.01).toFixed(3)}, {Util.toUValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: Btu/(h·ft²·℉)\r\n
\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default DoorUValueInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n const getParent = useStore(Selector.getParent);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const currentValue = useMemo(() => {\r\n const v = door ? door.lx : 1;\r\n const parent = door ? getParent(door) : null;\r\n if (parent) return v * parent.lx;\r\n return v;\r\n }, [door?.lx]);\r\n\r\n const [inputValue, setInputValue] = useState(currentValue);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n const d = e as DoorModel;\r\n const parent = getParent(d);\r\n d.lx = parent ? value / parent.lx : value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!door) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lx * parent.lx) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lx * parent.lx) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lx * parent.lx) return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lx * parent.lx) return true;\r\n }\r\n }\r\n break;\r\n default:\r\n const parent = getParent(door);\r\n if (parent && value !== door.lx * parent.lx) return true;\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesSelected.set(e.id, d.lx * (parent ? parent.lx : 1));\r\n d.lx = parent ? value / parent.lx : value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesAll.set(e.id, d.lx * (parent ? parent.lx : 1));\r\n d.lx = parent ? value / parent.lx : value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesAboveFoundation.set(e.id, d.lx * (parent ? parent.lx : 1));\r\n d.lx = parent ? value / parent.lx : value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValues.set(e.id, d.lx * (parent ? parent.lx : 1));\r\n d.lx = parent ? value / parent.lx : value;\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Width for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const parent = door ? getParent(updatedDoor) : null;\r\n const oldValue = (updatedDoor.lx ?? door.lx ?? 0.1) * (parent ? parent.lx : 1);\r\n const undoableChange = {\r\n name: 'Set Door Width',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n const parent = door ? getParent(door) : null;\r\n const max = parent && door ? 2 * parent.lx * Math.min(Math.abs(0.5 - door.cx), Math.abs(-0.5 - door.cx)) : 100;\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputValue(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, {max.toFixed(1)}]{i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DoorWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n const getParent = useStore(Selector.getParent);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const currentValue = useMemo(() => {\r\n const v = door ? door.lz : 1;\r\n const parent = door ? getParent(door) : null;\r\n if (parent) return v * parent.lz;\r\n return v;\r\n }, [door?.lz]);\r\n\r\n const [inputValue, setInputValue] = useState(currentValue);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n const d = e as DoorModel;\r\n const parent = getParent(d);\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!door) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lz * parent.lz) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lz * parent.lz) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lz * parent.lz) return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lz * parent.lz) return true;\r\n }\r\n }\r\n break;\r\n default:\r\n const parent = getParent(door);\r\n if (parent && value !== door.lz * parent.lz) return true;\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesSelected.set(e.id, d.lz * (parent ? parent.lz : 1));\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Height for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesAll.set(e.id, d.lz * (parent ? parent.lz : 1));\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesAboveFoundation.set(e.id, d.lz * (parent ? parent.lz : 1));\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Height for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValues.set(e.id, d.lz * (parent ? parent.lz : 1));\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Height for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const parent = door ? getParent(updatedDoor) : null;\r\n const oldValue = (updatedDoor.lz ?? door.lz ?? 0.2) * (parent ? parent.lz : 1);\r\n const undoableChange = {\r\n name: 'Set Door Height',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setInputValue(currentValue);\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n const parent = door ? getParent(door) : null;\r\n const max = parent?.lz ?? 20;\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={setInputValue}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, {max.toFixed(1)}]{i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DoorHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorHeatCapacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(door?.volumetricHeatCapacity ?? 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as DoorModel).volumetricHeatCapacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n value !== (e as DoorModel).volumetricHeatCapacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && value !== (e as DoorModel).volumetricHeatCapacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.foundationId === door?.foundationId &&\r\n value !== (e as DoorModel).volumetricHeatCapacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.parentId === door?.parentId &&\r\n value !== (e as DoorModel).volumetricHeatCapacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== door?.volumetricHeatCapacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const door = e as DoorModel;\r\n oldValuesSelected.set(e.id, door.volumetricHeatCapacity ?? 0.5);\r\n door.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Volumetric Heat Capacity for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAll.set(e.id, door.volumetricHeatCapacity ?? 0.5);\r\n door.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Volumetric Heat Capacity for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAboveFoundation.set(e.id, door.volumetricHeatCapacity ?? 0.5);\r\n door.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Volumetric Heat Capacity for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValues.set(e.id, door.volumetricHeatCapacity ?? 0.5);\r\n door.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Volumetric Heat Capacity for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldValue = updatedDoor.volumetricHeatCapacity ?? door.volumetricHeatCapacity ?? 0.5;\r\n const undoableChange = {\r\n name: 'Set Volumetric Heat Capacity of Door',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorVolumetricHeatCapacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={setInputValue}\r\n />\r\n
\r\n kWh/(m³·℃)\r\n
\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DoorHeatCapacityInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorOpacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(door?.opacity ?? 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as DoorModel).opacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!door) return;\r\n\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n value !== (e as DoorModel).opacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && value !== (e as DoorModel).opacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.foundationId === door.foundationId &&\r\n value !== (e as DoorModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.parentId === door.parentId &&\r\n value !== (e as DoorModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== door?.opacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const door = e as DoorModel;\r\n oldValuesSelected.set(e.id, door.opacity ?? 1);\r\n door.opacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Opacity for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAll.set(e.id, door.opacity ?? 1);\r\n door.opacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Opacity for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAboveFoundation.set(e.id, door.opacity ?? 1);\r\n door.opacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Opacity for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValues.set(e.id, door.opacity ?? 1);\r\n door.opacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Opacity for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldValue = updatedDoor.opacity ?? door.opacity ?? 1;\r\n const undoableChange = {\r\n name: 'Set Opacity of Door',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorOpacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputValue(value)}\r\n />\r\n
\r\n kWh/(m³·℃)\r\n
\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DoorOpacityInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { DoorModel } from 'src/models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorFrameColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(door?.frameColor ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateColorById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Door) {\r\n (e as DoorModel).frameColor = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const undoColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (color: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (color !== (e as DoorModel).frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n if (color !== (e as DoorModel).frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door?.foundationId && !e.locked) {\r\n if (color !== (e as DoorModel).frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door?.parentId && !e.locked) {\r\n if (color !== (e as DoorModel).frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== door?.frameColor) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, (elem as DoorModel).frameColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked) {\r\n oldColorsAll.set(elem.id, (elem as DoorModel).frameColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.foundationId === door.foundationId && !door.locked) {\r\n oldColorsAboveFoundation.set(elem.id, (elem as DoorModel).frameColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Color for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldColorsOnSameWall = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.parentId === door.parentId && !door.locked) {\r\n oldColorsOnSameWall.set(elem.id, (elem as DoorModel).frameColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Color for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsOnSameWall,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSameWall.groupId) {\r\n updateColorInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateColorInMap(oldColorsOnSameWall, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldColor = (updatedDoor ? updatedDoor.frameColor : door.frameColor) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Color of Selected Door',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateColorById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DoorFrameColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Menu, Radio } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\nimport DoorTextureSelection from './doorTextureSelection';\r\nimport DoorColorSelection from './doorColorSelection';\r\nimport { DoorTexture, ObjectType, Scope } from 'src/types';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { radioStyle } from './wallMenu';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableCheck } from 'src/undo/UndoableCheck';\r\nimport DoorUValueInput from './doorUValueInput';\r\nimport DoorWidthInput from './doorWidthInput';\r\nimport DoorHeightInput from './doorHeightInput';\r\nimport DoorHeatCapacityInput from './doorHeatCapacityInput';\r\nimport DoorOpacityInput from './doorOpacityInput';\r\nimport DoorFrameColorSelection from './doorFrameColorSelection';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const DoorMenu = React.memo(() => {\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n const language = useStore(Selector.language);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [colorDialogVisible, setColorDialogVisible] = useState(false);\r\n const [frameColorDialogVisible, setFrameColorDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [heightDialogVisible, setHeightDialogVisible] = useState(false);\r\n const [uValueDialogVisible, setUValueDialogVisible] = useState(false);\r\n const [opacityDialogVisible, setOpacityDialogVisible] = useState(false);\r\n const [heatCapacityDialogVisible, setHeatCapacityDialogVisible] = useState(false);\r\n\r\n if (!door) return null;\r\n\r\n const lang = { lng: language };\r\n const paddingLeft = '36px';\r\n\r\n const updateDoorTypeById = (id: string, type: DoorType) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n (e as DoorModel).doorType = type;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateDoorFilledById = (id: string, checked: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n (e as DoorModel).filled = checked;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInteriorById = (id: string, interior: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n (e as DoorModel).interior = interior;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const renderTypeSubMenu = () => {\r\n if (!door) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\r\n const undoableChange = {\r\n name: 'Select Door Type',\r\n timestamp: Date.now(),\r\n oldValue: door.doorType,\r\n newValue: e.target.value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateDoorTypeById(undoableChange.changedElementId, undoableChange.oldValue as DoorType);\r\n },\r\n redo: () => {\r\n updateDoorTypeById(undoableChange.changedElementId, undoableChange.newValue as DoorType);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateDoorTypeById(door.id, e.target.value);\r\n setCommonStore((state) => {\r\n state.actionState.doorType = e.target.value;\r\n });\r\n }}\r\n >\r\n \r\n {i18n.t('doorMenu.Default', lang)}\r\n \r\n \r\n {i18n.t('doorMenu.Arched', lang)}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {!door.locked && }\r\n \r\n\r\n {!door.locked && (\r\n <>\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Filled Door',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: door.id,\r\n selectedElementType: door.type,\r\n undo: () => {\r\n updateDoorFilledById(door.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateDoorFilledById(door.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateDoorFilledById(door.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.doorFilled = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('doorMenu.Filled', lang)}\r\n \r\n \r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Interior Door',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: door.id,\r\n selectedElementType: door.type,\r\n undo: () => {\r\n updateInteriorById(door.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateInteriorById(door.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateInteriorById(door.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.doorInterior = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('doorMenu.Interior', lang)}\r\n \r\n \r\n {renderTypeSubMenu()}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n {heightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Height', lang)} ...\r\n \r\n {door.filled && (\r\n <>\r\n {uValueDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setUValueDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.UValue', lang)} ...\r\n \r\n {heatCapacityDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setHeatCapacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.VolumetricHeatCapacity', lang)} ...\r\n \r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Texture', lang)} ...\r\n \r\n {\r\n setApplyCount(0);\r\n setColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Color', lang)} ...\r\n \r\n {\r\n setApplyCount(0);\r\n setFrameColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('doorMenu.FrameColor', lang)} ...\r\n \r\n {(door.textureType === DoorTexture.Default || door.textureType === DoorTexture.NoTexture) && (\r\n {\r\n setApplyCount(0);\r\n setOpacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('wallMenu.Opacity', lang)} ...\r\n \r\n )}\r\n \r\n )}\r\n \r\n )}\r\n\r\n {textureDialogVisible && }\r\n {colorDialogVisible && }\r\n {frameColorDialogVisible && }\r\n {opacityDialogVisible && }\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { WindowDataType } from './windowMenu';\r\n\r\nimport { useColorPicker } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\ninterface WindowColorSelectionProps {\r\n window: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n setDialogVisible: () => void;\r\n}\r\n\r\nconst WindowColorSelection = ({\r\n window: windowModel,\r\n dataType,\r\n attributeKey,\r\n setDialogVisible,\r\n}: WindowColorSelectionProps) => {\r\n const elements = useStore(Selector.elements);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const [selectedItem, onItemChange] = useColorPicker((windowModel[attributeKey] as string) ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateOnSameWall = (wallId: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.parentId === wallId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.foundationId === foundationId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && map.has(e.id)) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel)[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.foundationId === windowModel.foundationId &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.parentId === windowModel.parentId &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== windowModel[attributeKey]) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: string) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n oldValuesAll.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !windowModel.locked) {\r\n oldValuesAboveFoundation.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Windows Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(windowModel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValues = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n oldValues.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: `Set ${dataType} for All Windows On the Same Wall`,\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateOnSameWall(windowModel.parentId, undoableChangeOnSameWall.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateOnSameWall(windowModel.parentId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n const oldValue = windowModel[attributeKey] as string;\r\n const undoableChange = {\r\n name: `Set ${dataType} of Selected window`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n switch (dataType) {\r\n case WindowDataType.Tint:\r\n state.actionState.windowTint = value;\r\n break;\r\n case WindowDataType.MullionColor:\r\n state.actionState.windowMullionColor = value;\r\n break;\r\n case WindowDataType.Color:\r\n state.actionState.windowColor = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n if (windowModel[attributeKey] !== selectedItem) {\r\n updateValue(selectedItem);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { WindowDataType } from './windowMenu';\r\nimport Dialog from '../dialog';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\ninterface WindowNumberInputProps {\r\n windowModel: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n range: [min: number, max: number];\r\n step: number;\r\n setDialogVisible: () => void;\r\n unit?: string;\r\n note?: string;\r\n digit?: number;\r\n}\r\n\r\nconst WindowNumberInput = ({\r\n windowModel,\r\n dataType,\r\n attributeKey,\r\n range,\r\n step,\r\n unit,\r\n note,\r\n digit,\r\n setDialogVisible,\r\n}: WindowNumberInputProps) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n const getParent = useStore(Selector.getParent);\r\n\r\n const currentValue = useMemo(() => {\r\n const v = windowModel[attributeKey] as number;\r\n const parent = getParent(windowModel);\r\n if (parent) {\r\n // roof windows have absolute size\r\n if (windowModel.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') return v * parent.lx;\r\n if (attributeKey === 'lz') return v * parent.lz;\r\n }\r\n }\r\n if (attributeKey === 'sillWidth' && v === undefined) return 0.2;\r\n return v;\r\n }, [attributeKey, windowModel]);\r\n\r\n const [inputValue, setInputValue] = useState(currentValue);\r\n\r\n const lang = useLanguage();\r\n\r\n const setAttribute = (window: WindowModel, attributeKey: keyof WindowModel, value: number) => {\r\n const parent = getParent(window);\r\n if (parent && (attributeKey === 'lx' || attributeKey === 'lz')) {\r\n if (window.parentType === ObjectType.Roof) {\r\n // width and height are absolute when the parent is a roof\r\n (window[attributeKey] as number) = value;\r\n } else {\r\n // width and height are relative to the parent when it is not a roof\r\n (window[attributeKey] as number) = value / parent[attributeKey];\r\n }\r\n } else {\r\n (window[attributeKey] as number) = value;\r\n }\r\n };\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateOnSameWall = (wallId: string | undefined, value: number) => {\r\n if (!wallId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.parentId === wallId) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string | undefined, value: number) => {\r\n if (!foundationId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.foundationId === foundationId) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && map.has(e.id)) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const w = e as WindowModel;\r\n const parent = getParent(w);\r\n if (parent && w.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== w[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== w[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n const w = e as WindowModel;\r\n const parent = getParent(w);\r\n if (parent && w.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== w[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== w[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !e.locked) {\r\n const w = e as WindowModel;\r\n const parent = getParent(w);\r\n if (parent && w.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== w[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== w[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n const w = e as WindowModel;\r\n const parent = getParent(w);\r\n if (parent && w.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== w[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== w[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const parent = getParent(windowModel);\r\n if (parent && windowModel.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== windowModel[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== windowModel[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== windowModel[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== windowModel[attributeKey]) return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const window = e as WindowModel;\r\n const parent = getParent(window);\r\n let oldValue = window[attributeKey] as number;\r\n if (parent && window.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n oldValuesSelected.set(e.id, oldValue);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n const window = e as WindowModel;\r\n const parent = getParent(window);\r\n let oldValue = window[attributeKey] as number;\r\n if (parent && window.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n oldValuesAll.set(e.id, oldValue);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !e.locked) {\r\n const window = e as WindowModel;\r\n const parent = getParent(window);\r\n let oldValue = window[attributeKey] as number;\r\n if (parent && window.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n oldValuesAboveFoundation.set(e.id, oldValue);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Windows Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateAboveFoundation(windowModel.foundationId, undoableChangeAboveFoundation.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(windowModel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValuesOnSameWall = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n const window = e as WindowModel;\r\n const parent = getParent(window);\r\n let oldValue = window[attributeKey] as number;\r\n if (parent && window.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n oldValuesOnSameWall.set(e.id, oldValue);\r\n }\r\n }\r\n const undoableChangeOnSameParent = {\r\n name: `Set ${dataType} for All Windows On the Same Parent`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesOnSameWall,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameParent.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateOnSameWall(windowModel.parentId, undoableChangeOnSameParent.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameParent);\r\n updateOnSameWall(windowModel.parentId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n let oldValue = windowModel[attributeKey] as number;\r\n const parent = getParent(windowModel);\r\n if (parent && windowModel.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n const undoableChange = {\r\n name: `Set Window ${dataType}`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n switch (dataType) {\r\n case WindowDataType.Width:\r\n state.actionState.windowWidth = value;\r\n break;\r\n case WindowDataType.Height:\r\n state.actionState.windowHeight = value;\r\n break;\r\n case WindowDataType.Opacity:\r\n state.actionState.windowOpacity = value;\r\n break;\r\n case WindowDataType.FrameWidth:\r\n state.actionState.windowFrameWidth = value;\r\n break;\r\n case WindowDataType.SillWidth:\r\n state.actionState.windowSillWidth = value;\r\n break;\r\n case WindowDataType.HorizontalMullionSpacing:\r\n state.actionState.windowHorizontalMullionSpacing = value;\r\n break;\r\n case WindowDataType.VerticalMullionSpacing:\r\n state.actionState.windowVerticalMullionSpacing = value;\r\n break;\r\n case WindowDataType.MullionWidth:\r\n state.actionState.windowMullionWidth = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={setInputValue}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{range[0].toFixed(range[0] === 0 ? 0 : digit ?? 0)},{' '}\r\n {range[1].toFixed(digit ?? 0)}] {unit}
\r\n
{note}\r\n
\r\n \r\n \r\n {unit}\r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WindowNumberInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_WINDOW_U_VALUE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WindowUValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const windowModel = useSelectedElement(ObjectType.Window) as WindowModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(windowModel?.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toUValueInUS(inputValue));\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as WindowModel).uValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!windowModel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n value !== (e as WindowModel).uValue &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel).uValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.foundationId === windowModel.foundationId &&\r\n value !== (e as WindowModel).uValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.parentId === windowModel.parentId &&\r\n value !== (e as WindowModel).uValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== windowModel?.uValue) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const window = e as WindowModel;\r\n oldValuesSelected.set(e.id, window.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n updateById(window.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set U-Value for Selected Windows',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n const window = e as WindowModel;\r\n oldValuesAll.set(e.id, window.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n updateById(window.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set U-Value for All Windows',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !e.locked) {\r\n const window = e as WindowModel;\r\n oldValuesAboveFoundation.set(e.id, window.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n updateById(window.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set U-Value for All Windows Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValues = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n const window = e as WindowModel;\r\n oldValues.set(e.id, window.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n updateById(window.id, value);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set U-Value for All Windows On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n const updatedWindow = getElementById(windowModel.id) as WindowModel;\r\n const oldValue = updatedWindow.uValue ?? windowModel.uValue ?? DEFAULT_WINDOW_U_VALUE;\r\n const undoableChange = {\r\n name: 'Set Window U-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.windowUValue = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toUValueInUS(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: W/(m²·℃)\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toUValueInSI(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toUValueInUS(0.01).toFixed(3)}, {Util.toUValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: Btu/(h·ft²·℉)\r\n
\r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default WindowUValueInput;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { WindowDataType } from './windowMenu';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\ninterface WindowOptionSelectionProps {\r\n window: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n options: string[];\r\n optionsText: string[];\r\n setDialogVisible: () => void;\r\n}\r\n\r\nconst { Option } = Select;\r\n\r\nconst WindowOptionSelection = ({\r\n window: windowModel,\r\n dataType,\r\n attributeKey,\r\n options,\r\n optionsText,\r\n setDialogVisible,\r\n}: WindowOptionSelectionProps) => {\r\n const elements = useStore(Selector.elements);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const [selectedOption, setSelectedOption] = useState(windowModel[attributeKey] as string);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateOnSameWall = (wallId: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.parentId === wallId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.foundationId === foundationId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && map.has(e.id)) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel)[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.foundationId === windowModel.foundationId &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.parentId === windowModel.parentId &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== windowModel[attributeKey]) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: string) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n oldValuesAll.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !windowModel.locked) {\r\n oldValuesAboveFoundation.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Windows Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(windowModel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValues = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n oldValues.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: `Set ${dataType} for All Windows On the Same Wall`,\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateOnSameWall(windowModel.parentId, undoableChangeOnSameWall.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateOnSameWall(windowModel.parentId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n const oldValue = windowModel[attributeKey] as string;\r\n const undoableChange = {\r\n name: `Set ${dataType} of Selected window`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n switch (dataType) {\r\n case WindowDataType.Tint:\r\n state.actionState.windowTint = value;\r\n break;\r\n case WindowDataType.MullionColor:\r\n state.actionState.windowMullionColor = value;\r\n break;\r\n case WindowDataType.Color:\r\n state.actionState.windowColor = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n if (windowModel[attributeKey] !== selectedOption) {\r\n updateValue(selectedOption);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowOptionSelection;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space, Switch } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\ninterface WindowBooleanSelectionProps {\r\n window: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n setDialogVisible: () => void;\r\n}\r\n\r\nconst WindowBooleanSelection = ({\r\n window: windowModel,\r\n dataType,\r\n attributeKey,\r\n setDialogVisible,\r\n}: WindowBooleanSelectionProps) => {\r\n const elements = useStore(Selector.elements);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const [selected, setSelected] = useState(windowModel[attributeKey] as boolean);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateOnSameWall = (wallId: string, value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.parentId === wallId) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.foundationId === foundationId) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && map.has(e.id)) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, v] of map.entries()) {\r\n updateById(id, v);\r\n }\r\n };\r\n\r\n const needChange = (value: boolean) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if ((e as WindowModel)[attributeKey] !== value) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n if ((e as WindowModel)[attributeKey] !== value) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !e.locked) {\r\n if ((e as WindowModel)[attributeKey] !== value) return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n if ((e as WindowModel)[attributeKey] !== value) return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (windowModel[attributeKey] !== value) return true;\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: boolean) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WindowModel)[attributeKey] as boolean);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as boolean,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n oldValuesAll.set(e.id, (e as WindowModel)[attributeKey] as boolean);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as boolean);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !windowModel.locked) {\r\n oldValuesAboveFoundation.set(e.id, (e as WindowModel)[attributeKey] as boolean);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Windows Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as boolean,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(windowModel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValues = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n oldValues.set(e.id, (e as WindowModel)[attributeKey] as boolean);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: `Set ${dataType} for All Windows On the Same Wall`,\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateOnSameWall(windowModel.parentId, undoableChangeOnSameWall.newValue as boolean);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateOnSameWall(windowModel.parentId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n const oldValue = windowModel[attributeKey] as boolean;\r\n const undoableChange = {\r\n name: `Set ${dataType} of Selected window`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as boolean);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as boolean);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n if (windowModel[attributeKey] !== selected) {\r\n updateValue(selected);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelected(checked);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowBooleanSelection;\r\n","var _defs, _path, _path2, _path3, _path4, _path5, _path6;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgMenu(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n t: 1613755944969,\n className: \"icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"p-id\": 5967,\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n width: 200,\n height: 200,\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"style\", {\n type: \"text/css\"\n }))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M194.187431 235.50871m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z\",\n \"p-id\": 5968\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M347.505182 165.510915h552.305182v139.99559H347.505182z\",\n \"p-id\": 5969\n })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M194.187431 512.1129m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z\",\n \"p-id\": 5970\n })), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M347.505182 442.115105h552.305182v139.99559H347.505182z\",\n \"p-id\": 5971\n })), _path5 || (_path5 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M194.187431 788.49129m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z\",\n \"p-id\": 5972\n })), _path6 || (_path6 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M347.505182 718.719294h552.305182v139.99559H347.505182z\",\n \"p-id\": 5973\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgMenu);\nexport default __webpack_public_path__ + \"static/media/menu.c2982aed.svg\";\nexport { ForwardRef as ReactComponent };","export default __webpack_public_path__ + \"static/media/roof_01_menu.1418beb1.png\";","export default __webpack_public_path__ + \"static/media/roof_02_menu.055d6e06.png\";","export default __webpack_public_path__ + \"static/media/roof_03_menu.1d45e089.png\";","export default __webpack_public_path__ + \"static/media/roof_04_menu.20dee2dd.png\";","export default __webpack_public_path__ + \"static/media/roof_05_menu.34757ec1.png\";","export default __webpack_public_path__ + \"static/media/roof_06_menu.0fce42da.png\";","export default __webpack_public_path__ + \"static/media/roof_07_menu.d0b809f8.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport RoofTextureDefaultIcon from 'src/resources/roof_edge_menu.png';\r\nimport RoofTexture01Icon from 'src/resources/roof_01_menu.png';\r\nimport RoofTexture02Icon from 'src/resources/roof_02_menu.png';\r\nimport RoofTexture03Icon from 'src/resources/roof_03_menu.png';\r\nimport RoofTexture04Icon from 'src/resources/roof_04_menu.png';\r\nimport RoofTexture05Icon from 'src/resources/roof_05_menu.png';\r\nimport RoofTexture06Icon from 'src/resources/roof_06_menu.png';\r\nimport RoofTexture07Icon from 'src/resources/roof_07_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, RoofTexture } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(roof?.textureType ?? RoofTexture.Default);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateTextureById = (id: string, textureType: RoofTexture) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as RoofModel).textureType = textureType;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTextureInMap = (map: Map, textureType: RoofTexture) => {\r\n for (const id of map.keys()) {\r\n updateTextureById(id, textureType);\r\n }\r\n };\r\n\r\n const undoTextureInMap = (map: Map) => {\r\n for (const [id, texture] of map.entries()) {\r\n updateTextureById(id, texture);\r\n }\r\n };\r\n\r\n const needChange = (value: RoofTexture) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).textureType &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.textureType) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setTexture = (value: RoofTexture) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTexturesSelected.set(elem.id, (elem as RoofModel).textureType ?? RoofTexture.Default);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as RoofTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateTextureInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked) {\r\n oldTexturesAll.set(elem.id, (elem as RoofModel).textureType ?? RoofTexture.Default);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeAll.oldValues as Map,\r\n undoableChangeAll.newValue as RoofTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateTextureInMap(oldTexturesAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && elem.foundationId === roof.foundationId && !elem.locked) {\r\n oldTexturesAboveFoundation.set(elem.id, (elem as RoofModel).textureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Texture for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateTextureInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as RoofTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateTextureInMap(oldTexturesAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldTexture = updatedRoof ? updatedRoof.textureType : roof.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateTextureById(undoableChange.changedElementId, undoableChange.oldValue as RoofTexture);\r\n },\r\n redo: () => {\r\n updateTextureById(undoableChange.changedElementId, undoableChange.newValue as RoofTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateTextureById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofTexture = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default RoofTextureSelection;\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC\"","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(roof?.color ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateColorById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n e.color = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const undoColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== e.color &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.color) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldColorsSelected.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldColorsAll.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !roof.locked) {\r\n oldColorsAboveFoundation.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Color for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldColor = (updatedRoof ? updatedRoof.color : roof.color) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Color of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateColorById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default RoofColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofThicknessInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [inputLength, setInputLength] = useState(roof?.thickness ?? 0.4);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).thickness = value;\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n if (e.parentId === id && e.type === ObjectType.Window) {\r\n e.ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).thickness &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).thickness && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).thickness &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.thickness) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setThickness = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldThicknessSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const roof = e as RoofModel;\r\n oldThicknessSelected.set(e.id, roof.thickness);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Thickness for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldThicknessSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldThicknessAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldThicknessAll.set(e.id, roof.thickness);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Thickness for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldThicknessAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldThicknessAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && elem.foundationId === roof.foundationId && !elem.locked) {\r\n const roof = elem as RoofModel;\r\n oldThicknessAboveFoundation.set(elem.id, roof.thickness);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Thickness for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldThicknessAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldThickness = updatedRoof.thickness ?? roof.thickness ?? 0.4;\r\n const undoableChange = {\r\n name: 'Set Roof Thickness',\r\n timestamp: Date.now(),\r\n oldValue: oldThickness,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofThickness = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThickness(inputLength);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputLength(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.05, 1] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofThicknessInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofRafterSpacingInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n const [input, setInput] = useState(roof?.rafterSpacing ?? 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateRoofRafterSpacingById = (id: string, length: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).rafterSpacing = length;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateRoofRafterSpacingById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateRoofRafterSpacingById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rafterSpacing &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rafterSpacing && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rafterSpacing &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rafterSpacing) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setRafterSpacing = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldSpacingSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldSpacingSelected.set(e.id, (e as RoofModel).rafterSpacing ?? 1);\r\n updateRoofRafterSpacingById(e.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Rafter Spacing for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldSpacingSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldSpacingAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldSpacingAll.set(e.id, (e as RoofModel).rafterSpacing ?? 1);\r\n updateRoofRafterSpacingById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Rafter Spacing for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldSpacingAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldSpacingAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n oldSpacingAboveFoundation.set(e.id, (e as RoofModel).rafterSpacing ?? 1);\r\n updateRoofRafterSpacingById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Rafter Spacing for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldSpacingAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldSpacing = updatedRoof.rafterSpacing ?? roof.rafterSpacing ?? 1;\r\n const undoableChange = {\r\n name: 'Set Roof Rafter Spacing',\r\n timestamp: Date.now(),\r\n oldValue: oldSpacing,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateRoofRafterSpacingById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateRoofRafterSpacingById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateRoofRafterSpacingById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setRafterSpacing(input);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInput(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 100] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofRafterSpacingInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofOpacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [input, setInput] = useState(roof?.opacity !== undefined ? roof.opacity : 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateOpacityById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).opacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateOpacityById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateOpacityById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).opacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).opacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.opacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesSelected.set(e.id, roof.opacity);\r\n updateOpacityById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Opacity for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAll.set(e.id, roof.opacity);\r\n updateOpacityById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Opacity for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAboveFoundation.set(e.id, roof.opacity);\r\n updateOpacityById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Opacity for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldOpacity =\r\n updatedRoof.opacity !== undefined ? updatedRoof.opacity : roof.opacity !== undefined ? roof.opacity : 0.5;\r\n const undoableChange = {\r\n name: 'Set Roof Opacity',\r\n timestamp: Date.now(),\r\n oldValue: oldOpacity,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateOpacityById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateOpacityById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateOpacityById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofGlassOpacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(input);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInput(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofOpacityInput;\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, Modal, Radio, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\n\r\nconst GlassTintSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const roof = useStore(Selector.selectedElement) as RoofModel;\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const roofActionScope = useStore(Selector.roofActionScope);\r\n const setRoofActionScope = useStore(Selector.setRoofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const [selectedTint, setSelectedTint] = useState(roof?.glassTint ?? '#73D8FF');\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n const okButtonRef = useRef(null);\r\n\r\n useEffect(() => {\r\n okButtonRef.current?.focus();\r\n });\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n if (roof) {\r\n setSelectedTint(roof?.glassTint ?? '#73D8FF');\r\n }\r\n }, [roof]);\r\n\r\n const updateTintById = (id: string, glassTint: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as RoofModel).glassTint = glassTint;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, tint: string) => {\r\n for (const id of map.keys()) {\r\n updateTintById(id, tint as string);\r\n }\r\n };\r\n\r\n const undoTintInMap = (map: Map) => {\r\n for (const [id, tint] of map.entries()) {\r\n updateTintById(id, tint as string);\r\n }\r\n };\r\n\r\n const setTint = (value: string) => {\r\n if (!roof) return;\r\n switch (roofActionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n const oldTintsAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked) {\r\n oldTintsAll.set(elem.id, (elem as RoofModel).glassTint ?? '#73D8FF');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Glass Tint for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldTintsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoTintInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldTintsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldTintsAboveFoundation = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Roof && elem.foundationId === roof.foundationId && !roof.locked) {\r\n oldTintsAboveFoundation.set(elem.id, (elem as RoofModel).glassTint ?? '#73D8FF');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Glass Tint for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTintsAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoTintInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldTintsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldTint = (updatedRoof ? updatedRoof.glassTint : roof.glassTint) ?? '#73D8FF';\r\n const undoableChange = {\r\n name: 'Set Glass Tint of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldTint,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateTintById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateTintById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateTintById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const close = () => {\r\n if (roof?.glassTint) {\r\n setSelectedTint(roof.glassTint);\r\n }\r\n setDialogVisible(false);\r\n };\r\n\r\n const handleCancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const handleOk = () => {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n if (updatedRoof && updatedRoof.glassTint !== selectedTint) {\r\n setTint(selectedTint);\r\n }\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n const handleApply = () => {\r\n setTint(selectedTint);\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('roofMenu.GlassTint', lang)}\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={close}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n {\r\n setSelectedTint(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n setRoofActionScope(e.target.value)} value={roofActionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default GlassTintSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(roof?.rafterColor ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateColorById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as RoofModel).rafterColor = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const undoColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rafterColor &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rafterColor && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rafterColor &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rafterColor) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, (elem as RoofModel).rafterColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Rafter Color for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked) {\r\n oldColorsAll.set(elem.id, (elem as RoofModel).rafterColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Rafter Color for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && elem.foundationId === roof.foundationId && !roof.locked) {\r\n oldColorsAboveFoundation.set(elem.id, (elem as RoofModel).rafterColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Rafter Color for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldColor = (updatedRoof ? updatedRoof.rafterColor : roof.rafterColor) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Rafter Color of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateColorById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default RoofColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofRafterWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [input, setInput] = useState(roof?.rafterWidth ?? 0.1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, length: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).rafterWidth = length;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rafterWidth &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rafterWidth && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rafterWidth &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rafterWidth) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValSelected.set(e.id, (e as RoofModel).rafterWidth ?? 0.1);\r\n updateById(e.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Rafter Width for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldValAll.set(e.id, (e as RoofModel).rafterWidth ?? 0.1);\r\n updateById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Rafter Width for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n oldValAboveFoundation.set(e.id, (e as RoofModel).rafterWidth ?? 0.1);\r\n updateById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Rafter Width for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldVal = updatedRoof.rafterWidth ?? roof.rafterWidth ?? 0.1;\r\n const undoableChange = {\r\n name: 'Set Roof Rafter Width',\r\n timestamp: Date.now(),\r\n oldValue: oldVal,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(input);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInput(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 1] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofRafterWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofSideColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [selectedSideColor, setSelectedSideColor] = useState(roof?.sideColor ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSideColorById = (id: string, sideColor: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as RoofModel).sideColor = sideColor;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSideColorInMap = (map: Map, sideColor: string) => {\r\n for (const id of map.keys()) {\r\n updateSideColorById(id, sideColor as string);\r\n }\r\n };\r\n\r\n const undoSideColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateSideColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).sideColor &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).sideColor && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).sideColor &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.sideColor) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setSideColor = (value: string) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldColorsSelected.set(e.id, (e as RoofModel).sideColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Side Color for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoSideColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateSideColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateSideColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldColorsAll.set(e.id, (e as RoofModel).sideColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Side Color for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoSideColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateSideColorInMap(\r\n undoableChangeAll.oldValues as Map,\r\n undoableChangeAll.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSideColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !roof.locked) {\r\n oldColorsAboveFoundation.set(e.id, (e as RoofModel).sideColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Side Color for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoSideColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSideColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSideColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldColor = (updatedRoof ? updatedRoof.sideColor : roof.sideColor) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Side Color of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateSideColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateSideColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSideColorById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofSideColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setSideColor(selectedSideColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedSideColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default RoofSideColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from '../../../models/RoofModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_ROOF_R_VALUE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofRValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(roof?.rValue ?? DEFAULT_ROOF_R_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toRValueInUS(inputValue));\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).rValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rValue &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rValue) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const roof = e as RoofModel;\r\n oldValuesSelected.set(e.id, roof.rValue ?? DEFAULT_ROOF_R_VALUE);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set R-Value for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAll.set(e.id, roof.rValue ?? DEFAULT_ROOF_R_VALUE);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set R-Value for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAboveFoundation.set(e.id, roof.rValue ?? DEFAULT_ROOF_R_VALUE);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set R-Value for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldValue = updatedRoof.rValue ?? roof.rValue ?? DEFAULT_ROOF_R_VALUE;\r\n const undoableChange = {\r\n name: 'Set Roof R-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofRValue = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toRValueInUS(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: m²·℃/W\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toRValueInSI(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toRValueInUS(0.01).toFixed(3)}, {Util.toRValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: h·ft²·℉/Btu\r\n
\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default RoofRValueInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofRiseInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(roof?.rise ?? 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateRoofRiseById = (id: string, val: number) => {\r\n useStore.getState().updateRoofRiseById(id, val);\r\n useStore.getState().set((state) => {\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateRoofRiseById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateRoofRiseById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rise &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rise && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rise &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rise) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setRise = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (useStore.getState().roofActionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldValuesSelected.set(e.id, (e as RoofModel).rise);\r\n updateRoofRiseById(e.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Rise for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldValuesAll.set(e.id, (e as RoofModel).rise);\r\n updateRoofRiseById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Rise for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n oldValuesAboveFoundation.set(e.id, (e as RoofModel).rise);\r\n updateRoofRiseById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Rise for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldRise = updatedRoof?.rise ?? roof?.rise ?? 0;\r\n const undoableChange = {\r\n name: 'Set Roof Rise',\r\n timestamp: Date.now(),\r\n oldValue: oldRise,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateRoofRiseById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateRoofRiseById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateRoofRiseById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setRise(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputValue(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0, 200] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofRiseInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from '../../../models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofHeatCapacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(roof?.volumetricHeatCapacity ?? 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).volumetricHeatCapacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).volumetricHeatCapacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).volumetricHeatCapacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).volumetricHeatCapacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.volumetricHeatCapacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const roof = e as RoofModel;\r\n oldValuesSelected.set(e.id, roof.volumetricHeatCapacity ?? 0.5);\r\n roof.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Volumetric Heat Capacity for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAll.set(e.id, roof.volumetricHeatCapacity ?? 0.5);\r\n roof.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Volumetric Heat Capacity for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAboveFoundation.set(e.id, roof.volumetricHeatCapacity ?? 0.5);\r\n roof.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Volumetric Heat Capacity for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldValue = updatedRoof.volumetricHeatCapacity ?? roof.volumetricHeatCapacity ?? 0.5;\r\n const undoableChange = {\r\n name: 'Set Volumetric Heat Capacity of Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofVolumetricHeatCapacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputValue(value)}\r\n />\r\n
\r\n kWh/(m³·℃)\r\n
\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofHeatCapacityInput;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Radio, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from '../../../models/RoofModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_CEILING_R_VALUE } from '../../../constants';\r\n\r\nconst CeilingRValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const language = useStore(Selector.language);\r\n const selectedElement = useStore(Selector.selectedElement) as RoofModel;\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const setActionScope = useStore(Selector.setRoofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roofModel = useStore((state) => {\r\n if (selectedElement) {\r\n for (const e of state.elements) {\r\n if (e.id === selectedElement.id) {\r\n return e as RoofModel;\r\n }\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n const [inputValue, setInputValue] = useState(roofModel?.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toRValueInUS(inputValue));\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n if (roofModel) {\r\n setInputValue(roofModel?.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n }\r\n }, [roofModel?.ceilingRValue]);\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).ceilingRValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roofModel) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAll.set(e.id, roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n roof.ceilingRValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set R-Value for All Ceilings',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roofModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roofModel.foundationId && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAboveFoundation.set(e.id, roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n roof.ceilingRValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set R-Value for All Ceilings Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roofModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roofModel) {\r\n const updatedRoof = getElementById(roofModel.id) as RoofModel;\r\n const oldValue = updatedRoof.ceilingRValue ?? roofModel.ceilingRValue ?? DEFAULT_CEILING_R_VALUE;\r\n const undoableChange = {\r\n name: 'Set Ceiling R-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: roofModel.id,\r\n changedElementType: roofModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roofModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofRValue = value;\r\n });\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const close = () => {\r\n setInputValue(roofModel?.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n setDialogVisible(false);\r\n };\r\n\r\n const handleCancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const handleOk = () => {\r\n setValue(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n const handleApply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('roofMenu.CeilingRValue', lang) + ' '}({i18n.t('word.ThermalResistance', lang)})\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={close}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toRValueInUS(value));\r\n }}\r\n onPressEnter={handleOk}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: m²·℃/W\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toRValueInSI(value));\r\n }}\r\n onPressEnter={handleOk}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toRValueInUS(0.01).toFixed(3)}, {Util.toRValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: h·ft²·℉/Btu\r\n
\r\n \r\n \r\n setActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisCeiling', lang)}\r\n \r\n {i18n.t('roofMenu.AllCeilingsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllCeilings', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CeilingRValueInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Menu, Modal, Radio } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { Lock, Paste } from '../menuItems';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { ObjectType, RoofTexture, Scope } from 'src/types';\r\nimport RoofTextureSelection from './roofTextureSelection';\r\nimport RoofColorSelection from './roofColorSelection';\r\nimport { RoofModel, RoofStructure, RoofType } from 'src/models/RoofModel';\r\nimport RoofThicknessInput from './roofThicknessInput';\r\nimport RoofRafterSpacingInput from './roofRafterSpacingInput';\r\nimport RoofOpacityInput from './roofOpacityInput';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport GlassTintSelection from './glassTintSelection';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport RoofRafterColorSelection from './roofRafterColorSelection';\r\nimport RoofRafterWidthInput from './roofRafterWidthInput';\r\nimport { ElementCounter } from '../../../stores/ElementCounter';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { UndoableRemoveAllChildren } from '../../../undo/UndoableRemoveAllChildren';\r\nimport { LightModel } from '../../../models/LightModel';\r\nimport RoofSideColorSelection from './roofSideColorSelection';\r\nimport RoofRValueInput from './roofRValueInput';\r\nimport RoofRiseInput from './roofRiseInput';\r\nimport RoofHeatCapacityInput from './roofHeatCapacityInput';\r\nimport { UndoableCheck } from 'src/undo/UndoableCheck';\r\nimport CeilingRValueInput from './ceilingRValueInput';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const RoofMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const updateRoofStructureById = useStore(Selector.updateRoofStructureById);\r\n const countAllOffspringsByType = useStore(Selector.countAllOffspringsByTypeAtOnce);\r\n const removeAllChildElementsByType = useStore(Selector.removeAllChildElementsByType);\r\n const updateElementLockById = useStore(Selector.updateElementLockById);\r\n const updateElementUnlockByParentId = useStore(Selector.updateElementLockByParentId);\r\n const updateInsideLightsByParentId = useStore(Selector.updateInsideLightsByParentId);\r\n const updateInsideLightById = useStore(Selector.updateInsideLightById);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [rafterSpacingDialogVisible, setRafterSpacingDialogVisible] = useState(false);\r\n const [rafterWidthDialogVisible, setRafterWidthDialogVisible] = useState(false);\r\n const [rafterColorDialogVisible, setRafterColorDialogVisible] = useState(false);\r\n const [riseDialogVisible, setRiseDialogVisible] = useState(false);\r\n const [thicknessDialogVisible, setThicknessDialogVisible] = useState(false);\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [roofColorDialogVisible, setRoofColorDialogVisible] = useState(false);\r\n const [roofSideColorDialogVisible, setRoofSideColorDialogVisible] = useState(false);\r\n const [glassTintDialogVisible, setGlassTintDialogVisible] = useState(false);\r\n const [opacityDialogVisible, setOpacityDialogVisible] = useState(false);\r\n const [roofRValueDialogVisible, setRoofRValueDialogVisible] = useState(false);\r\n const [ceilingRValueDialogVisible, setCeilingRValueDialogVisible] = useState(false);\r\n const [heatCapacityDialogVisible, setHeatCapacityDialogVisible] = useState(false);\r\n\r\n if (!roof) return null;\r\n\r\n const lang = { lng: language };\r\n const paddingLeft = '36px';\r\n const radioStyle = {\r\n display: 'block',\r\n height: '30px',\r\n paddingLeft: '10px',\r\n lineHeight: '30px',\r\n };\r\n\r\n const legalToPaste = () => {\r\n const elementsToPaste = useStore.getState().elementsToPaste;\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const e = elementsToPaste[0];\r\n switch (e.type) {\r\n case ObjectType.Window:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const handleClearOk = (objectType: ObjectType) => {\r\n if (roof) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === objectType && e.parentId === roof.id);\r\n removeAllChildElementsByType(roof.id, objectType);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllChildren = {\r\n name: `Remove All ${objectType}s on Roof`,\r\n timestamp: Date.now(),\r\n parentId: roof.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllChildren.parentId, objectType);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllChildren);\r\n }\r\n };\r\n\r\n const renderClearItem = (objectType: ObjectType, count: number) => {\r\n if (count === 0) return null;\r\n const titleText = (type: string, count: number) =>\r\n `${i18n.t(`roofMenu.DoYouReallyWantToRemoveAll${type}sOnThisRoof`, lang)} (${count} ${i18n.t(\r\n `roofMenu.${type}s`,\r\n lang,\r\n )})?`;\r\n const objectTypeText = objectType.replaceAll(' ', '');\r\n return (\r\n {\r\n Modal.confirm({\r\n title: titleText(objectTypeText, count),\r\n icon: ,\r\n onOk: () => {\r\n handleClearOk(objectType);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t(`roofMenu.RemoveAllUnlocked${objectTypeText}s`, lang)} ({count})\r\n \r\n );\r\n };\r\n\r\n const renderLockItem = (objectType: ObjectType, count: number) => {\r\n if (count === 0) return null;\r\n const objectTypeText = objectType.replaceAll(' ', '');\r\n return (\r\n {\r\n if (!roof) return;\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.parentId === roof.id && elem.type === objectType) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n }\r\n updateElementUnlockByParentId(roof.id, objectType, true);\r\n const undoableLockAllElementsOfType = {\r\n name: 'Lock All ' + objectTypeText + ' on Roof',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElementsOfType.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateElementUnlockByParentId(roof.id, objectType, true);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElementsOfType);\r\n }}\r\n >\r\n {i18n.t(`roofMenu.LockAll${objectTypeText}s`, lang)} ({count})\r\n \r\n );\r\n };\r\n\r\n const renderUnlockItem = (objectType: ObjectType, count: number) => {\r\n if (count === 0) return null;\r\n const objectTypeText = objectType.replaceAll(' ', '');\r\n return (\r\n {\r\n if (!roof) return;\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.parentId === roof.id && elem.type === objectType) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n }\r\n updateElementUnlockByParentId(roof.id, objectType, false);\r\n const undoableUnlockAllElementsOfType = {\r\n name: 'Unlock All ' + objectTypeText + ' on Roof',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableUnlockAllElementsOfType.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateElementUnlockByParentId(roof.id, objectType, false);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableUnlockAllElementsOfType);\r\n }}\r\n >\r\n {i18n.t(`roofMenu.UnlockAll${objectTypeText}s`, lang)}\r\n \r\n );\r\n };\r\n\r\n const renderInsideLightItem = (count: number, inside: boolean) => {\r\n if (count === 0) return null;\r\n return (\r\n {\r\n if (!roof) return;\r\n const oldValues = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.parentId === roof.id && elem.type === ObjectType.Light) {\r\n oldValues.set(elem.id, (elem as LightModel).inside);\r\n }\r\n }\r\n updateInsideLightsByParentId(roof.id, inside);\r\n const undoableInsideLightsOnRoof = {\r\n name: inside ? 'Set All Lights on Roof Inside' : 'Set All Lights on Roof Outside',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, inside] of undoableInsideLightsOnRoof.oldValues.entries()) {\r\n updateInsideLightById(id, inside as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateInsideLightsByParentId(roof.id, inside);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableInsideLightsOnRoof);\r\n }}\r\n >\r\n {i18n.t(inside ? `roofMenu.AllLightsOnRoofInside` : `roofMenu.AllLightsOnRoofOutside`, lang)} ({count})\r\n \r\n );\r\n };\r\n\r\n const renderElementsSubMenu = () => {\r\n const counterAll = roof ? countAllOffspringsByType(roof.id, true) : new ElementCounter();\r\n if (counterAll.gotSome() && useStore.getState().contextMenuObjectType) {\r\n const counterUnlocked = roof ? countAllOffspringsByType(roof.id, false) : new ElementCounter();\r\n return (\r\n \r\n {renderClearItem(ObjectType.SolarPanel, counterUnlocked.solarPanelCount)}\r\n {renderClearItem(ObjectType.Window, counterUnlocked.windowCount)}\r\n {renderClearItem(ObjectType.Sensor, counterUnlocked.sensorCount)}\r\n {renderClearItem(ObjectType.Light, counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount)}\r\n {renderLockItem(ObjectType.SolarPanel, counterUnlocked.solarPanelCount)}\r\n {renderUnlockItem(ObjectType.SolarPanel, counterAll.solarPanelCount)}\r\n {renderLockItem(ObjectType.Window, counterUnlocked.windowCount)}\r\n {renderUnlockItem(ObjectType.Window, counterAll.windowCount)}\r\n {renderLockItem(ObjectType.Sensor, counterUnlocked.sensorCount)}\r\n {renderUnlockItem(ObjectType.Sensor, counterAll.sensorCount)}\r\n {renderInsideLightItem(counterAll.outsideLightCount, true)}\r\n {renderInsideLightItem(counterAll.insideLightCount, false)}\r\n \r\n );\r\n }\r\n return null;\r\n };\r\n\r\n const updateRoofCeiling = (roofId: string, b: boolean) => {\r\n useStore.getState().set((state) => {\r\n const roof = state.elements.find((e) => e.id === roofId && e.type === ObjectType.Roof) as RoofModel;\r\n if (roof) {\r\n roof.ceiling = b;\r\n state.actionState.roofCeiling = b;\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n \r\n\r\n {roof.rise > 0 && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Roof Ceiling',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: roof.id,\r\n selectedElementType: roof.type,\r\n undo: () => {\r\n updateRoofCeiling(roof.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateRoofCeiling(roof.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateRoofCeiling(roof.id, checked);\r\n }}\r\n >\r\n {i18n.t('roofMenu.Ceiling', { lng: language })}\r\n \r\n \r\n )}\r\n\r\n {renderElementsSubMenu()}\r\n\r\n {!roof.locked && roof.roofType === RoofType.Gable && (\r\n \r\n {\r\n const undoableChange = {\r\n name: 'Select Roof Structure',\r\n timestamp: Date.now(),\r\n oldValue: roof.roofStructure ?? RoofStructure.Default,\r\n newValue: e.target.value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateRoofStructureById(undoableChange.changedElementId, undoableChange.oldValue as RoofStructure);\r\n },\r\n redo: () => {\r\n updateRoofStructureById(undoableChange.changedElementId, undoableChange.newValue as RoofStructure);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateRoofStructureById(roof.id, e.target.value);\r\n setCommonStore((state) => {\r\n state.actionState.roofStructure = e.target.value;\r\n });\r\n }}\r\n >\r\n \r\n {i18n.t('roofMenu.DefaultStructure', lang)}\r\n \r\n \r\n {i18n.t('roofMenu.RafterStructure', lang)}\r\n \r\n \r\n {i18n.t('roofMenu.GlassStructure', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {!roof.locked && (\r\n <>\r\n {(roof.roofStructure === RoofStructure.Rafter || roof.roofStructure === RoofStructure.Glass) && (\r\n <>\r\n {opacityDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setOpacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.Opacity', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {roof.roofStructure === RoofStructure.Rafter && roof.roofType === RoofType.Gable && (\r\n <>\r\n {rafterColorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setRafterColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RafterColor', lang)} ...\r\n \r\n\r\n {rafterSpacingDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setRafterSpacingDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RafterSpacing', lang)} ...\r\n \r\n\r\n {rafterWidthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setRafterWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RafterWidth', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {thicknessDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setThicknessDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t(roof.roofStructure === RoofStructure.Rafter ? 'roofMenu.RafterThickness' : 'word.Thickness', lang)}{' '}\r\n ...\r\n \r\n\r\n {roof.roofStructure === RoofStructure.Glass && roof.roofType === RoofType.Gable && (\r\n <>\r\n {glassTintDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setGlassTintDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.GlassTint', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {riseDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setRiseDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.Rise', lang)} ...\r\n \r\n\r\n {(roof.roofStructure !== RoofStructure.Rafter || roof.opacity === undefined || roof.opacity > 0) && (\r\n <>\r\n {roofRValueDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setRoofRValueDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RoofRValue', lang)} ...\r\n \r\n {roof.ceiling && ceilingRValueDialogVisible && (\r\n \r\n )}\r\n {roof.ceiling && (\r\n {\r\n setApplyCount(0);\r\n setCeilingRValueDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.CeilingRValue', lang)} ...\r\n \r\n )}\r\n {heatCapacityDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setHeatCapacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.VolumetricHeatCapacity', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {roof.roofStructure !== RoofStructure.Rafter && (\r\n <>\r\n {textureDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Texture', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {(roof.roofStructure !== RoofStructure.Rafter || roof.opacity === undefined || roof.opacity > 0) && (\r\n <>\r\n {roofColorDialogVisible && }\r\n {(roof.textureType === RoofTexture.NoTexture || roof.textureType === RoofTexture.Default) && (\r\n {\r\n setApplyCount(0);\r\n setRoofColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RoofColor', lang)} ...\r\n \r\n )}\r\n {roofSideColorDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setRoofSideColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RoofSideColor', lang)} ...\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Dropdown, Menu } from 'antd';\r\nimport { useStore } from '../../stores/common';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ObjectType } from '../../types';\r\nimport {\r\n CuboidMenu,\r\n FoundationMenu,\r\n GroundMenu,\r\n HumanMenu,\r\n FlowerMenu,\r\n PolygonMenu,\r\n PolygonVertexMenu,\r\n SensorMenu,\r\n LightMenu,\r\n SkyMenu,\r\n SolarPanelMenu,\r\n ParabolicTroughMenu,\r\n ParabolicDishMenu,\r\n TreeMenu,\r\n WallMenu,\r\n WindowMenu,\r\n DoorMenu,\r\n FresnelReflectorMenu,\r\n HeliostatMenu,\r\n RoofMenu,\r\n} from './elementMenu';\r\n\r\nexport interface ContextMenuProps {\r\n [key: string]: any;\r\n}\r\n\r\nconst DropdownContextMenu: React.FC = ({ children }) => {\r\n const contextMenuObjectType = useStore(Selector.contextMenuObjectType);\r\n\r\n const contextMenu = () => {\r\n switch (contextMenuObjectType) {\r\n case ObjectType.Ground:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Sky:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Foundation:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Cuboid:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Polygon:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.PolygonVertex:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.SolarPanel:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.ParabolicTrough:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.ParabolicDish:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.FresnelReflector:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Heliostat:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Sensor:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Light:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Human:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Tree:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Flower:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Wall:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Window:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Roof:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Door:\r\n return (\r\n \r\n \r\n \r\n );\r\n default:\r\n return <>;\r\n }\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(DropdownContextMenu);\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEQgBg4Se6gAABJlJREFUWIXtV11IXEcUPjNzZ3bXHzauvzVSAqlvrWx9KX0paEoRMcoKQmwFDSK+2NInqWVJNIi0pZCXUiiIqC8hJRCphIJaodJC+lTY0j9jmrS11tb1L3bv79w5feje7apX3W3MWw9cuHO+M+d8M3PmzAyBPKW5ublDStmMiE8jIgAAICIIISAcDn9rmuaHMzMzP+Tqj+QTvL29/WPHcTr8MEQEpRQopfSSkpLYjRs35nLxqeUaPBaLvazregciguu6twHg+2ycMSYopV2U0qqdnZ33AOB0Cei6HhVCgG3b9xYWFtr9bPr6+pbW1tY+QcRnlFKCUmqf5PfQEnR2dpYqpV5JJpP8ANQSCAQ6LMv6CRGvEELYwb5FRUXPm6b5JucchBBv7e7u/u5hxcXFEA6Hf5yamvrqSAKxWOxVwzDe55w/pZTa51wpBa7rAiEENO3wxCEipJcHAAA0TQNCCHh+KKWglAIhxKfRaLR7ZGRkYx+Brq6uc8lkcgUAmJTSQMQt/0nzl6KiIjBNE6SUGUKccyguLs6QT6VSZ0OhEFiW9cHc3NzrAFk5oOt6O2OMKaV2qqurX3rw4MF3+RCYmZmB4eFhWFxczOji8Tg0NDRk2pcuXbqm6/rbruu2xOPxN0ZHR5F64Pb2dohSCo7jPJyenv4mn+AAAISQfcEBAK5evQqEkMxXVVX1q6ZpgIj26OgoAmQtQWNj45VgMDhiWZaNiBuE/JseXsE5gQBN26oD+sw/pbQQAM5wznfb2trO9/f3b2aWoLCw8H46e4VS6qxpmpkKJ4Q4cfS2bYNSCoLB4D7ChmGA67oghADO/9lYtm3/sbe3l9o3A4hIBgcHm0OhUOmjR48ql5eX33Fdl9bU1EyXl5d/dnBXZAvnHNbW1n4zTdOpra09Z5pmJusTiUQcEWsDgcBsNBq9ZRiG2t7e/mJ8fPzhkQ7n5+cjra2t8uLFizgwMNB97PBPkAsXLnze2tqKDQ0NcT+c+ikTiUSJt6+llIWPQ4AQoiEiMMZCfnjOpdizb2lpGUDE+3fu3JnNBnp7e0u2tra6Nzc37y4tLd3N1aHvDBwlPT09TZqmXVdK3R4aGqrIxtbX1y8zxq5zzj/Kx2deBMrKys4rpYAxxqSUZ7IxXddDlmUByd53p00AABwAAER0GWPuPkeUem33UK9TJHDqkhcBrxbkUhmfCIEnIf8TOJEAIua1rU6VQDrZnCyVBgCQvg/SA7Ze+3TqgHeJME1TejrDMDY1TQOlFFBK97LtGWOOEAIYY3mdHb5ngW3bCgCUpmmsoKCgwNPPzs7eqqurO2+a5vLY2Nh6dp9IJDKl63phOBxOPDaBSCQiEVFKKbnrupmLwOrqqrW6unrNr8/Nmzf/BIBhH+jYouG7BI7jCEppKJ0D+nEOTpKss8F3sP5KTfs5lUo9FEKcSyaTnW1tbV8bhvFXvsErKipe2NjYeC6dM7u+BI/q3NTUNMg5f9e2be/BkdchAwAQCAQYIgKldK+ysvLZiYmJXw7aHHpeebKysvJlfX39ruu6L0opg4QQ+h8+YIzNlpaWvjY5OXnPL87fPnkgI7SmjToAAAAASUVORK5CYII=\"","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableBounds, DraggableData, DraggableEvent, DraggableEventHandler } from 'react-draggable';\nimport { Input, Modal, Space, Table, Typography } from 'antd';\nimport { CopyOutlined, QuestionCircleOutlined, WarningOutlined } from '@ant-design/icons';\nimport { HOME_URL, REGEX_ALLOWABLE_IN_NAME, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { copyTextToClipboard, showSuccess } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport Draggable from 'react-draggable';\nimport RenameImage from '../assets/rename.png';\nimport DeleteImage from '../assets/delete.png';\nimport LinkImage from '../assets/create_link.png';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 14;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 680px;\n height: 520px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface CloudFilePanelProps {\n cloudFileArray: object[];\n openCloudFile: (userid: string, title: string) => void;\n deleteCloudFile: (userid: string, title: string) => void;\n renameCloudFile: (userid: string, oldTitle: string, newTitle: string) => void;\n}\n\nconst CloudFilePanel = ({ cloudFileArray, openCloudFile, deleteCloudFile, renameCloudFile }: CloudFilePanelProps) => {\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const [renameDialogVisible, setRenameDialogVisible] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const [oldTitle, setOldTitle] = useState();\n const [newTitle, setNewTitle] = useState();\n const [userid, setUserid] = useState();\n const dragRef = useRef(null);\n // make an editable copy because the file array is not mutable\n const filesRef = useRef([...cloudFileArray]);\n // set a flag so that we can update when filesRef changes\n const [recountFlag, setRecountFlag] = useState(false);\n\n const { Search } = Input;\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (cloudFileArray) {\n filesRef.current = [...cloudFileArray];\n setRecountFlag(!recountFlag);\n }\n }, [cloudFileArray]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showCloudFilePanel = false;\n });\n };\n\n const deleteFile = (userid: string, title: string) => {\n Modal.confirm({\n title: i18n.t('cloudFilePanel.DoYouReallyWantToDelete', lang) + ' \"' + title + '\"?',\n content: (\n \n \n {i18n.t('word.Warning', lang) + ': ' + i18n.t('message.ThisCannotBeUndone', lang)}\n \n ),\n icon: ,\n onOk: () => {\n deleteCloudFile(userid, title);\n // change the address field of the browser when the cloud file is currently open\n const params = new URLSearchParams(window.location.search);\n if (params.get('title') === title && params.get('userid') === userid) {\n window.history.pushState({}, document.title, HOME_URL);\n }\n },\n });\n };\n\n const renameFile = () => {\n if (userid && oldTitle && newTitle) {\n renameCloudFile(userid, oldTitle, newTitle);\n setNewTitle(undefined);\n }\n setRenameDialogVisible(false);\n };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('word.Rename', lang)}\n \n }\n visible={renameDialogVisible}\n onOk={renameFile}\n onCancel={() => {\n setRenameDialogVisible(false);\n setNewTitle(undefined);\n }}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e: React.ChangeEvent) => {\n setNewTitle(e.target.value);\n }}\n />\n \n \n {i18n.t('word.Caution', lang) +\n ': ' +\n i18n.t('cloudFilePanel.IfSharedOrPublishedRenamingFileBreaksExistingLinks', lang)}\n .\n \n \n \n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'cloudFilePanel';\n });\n }}\n >\n \n \n
\n {i18n.t('cloudFilePanel.MyCloudFiles', lang) + ' (' + filesRef.current.length + ')'}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {\n if (!cloudFileArray) return;\n // must create a new array for ant table to update (don't just set length to 0)\n filesRef.current = [];\n for (const f of cloudFileArray) {\n // @ts-ignore\n if (f['title']?.toLowerCase().includes(s.toLowerCase())) {\n filesRef.current.push(f);\n }\n }\n setRecountFlag(!recountFlag);\n }}\n />\n \n \n {\n // @ts-ignore\n return a['title'].localeCompare(b['title']);\n }}\n render={(title, record) => {\n return (\n \n {title}\n \n );\n }}\n onCell={(data, index) => {\n return {\n onClick: () => {\n const selection = window.getSelection();\n if (selection && selection.toString().length > 0) return;\n // only proceed when no text is selected\n // @ts-ignore\n openCloudFile(data.userid, data.title);\n },\n };\n }}\n />\n {\n // @ts-ignore\n return a['timestamp'] - b['timestamp'];\n }}\n render={(time, record) => {\n return {time};\n }}\n />\n (\n \n {\n deleteFile(record.userid, record.title);\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n {\n setOldTitle(record.title);\n setUserid(record.userid);\n setRenameDialogVisible(true);\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n {\n copyTextToClipboard(record.title);\n showSuccess(i18n.t('cloudFilePanel.TitleCopiedToClipBoard', lang) + '.');\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n {\n const url =\n HOME_URL +\n '?client=web&userid=' +\n record.userid +\n '&title=' +\n encodeURIComponent(record.title);\n copyTextToClipboard(url);\n showSuccess(i18n.t('cloudFilePanel.LinkGeneratedInClipBoard', lang) + '.');\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n \n )}\n />\n \n
\n \n \n \n );\n};\n\nexport default React.memo(CloudFilePanel);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEQMtUqgrwgAAA2hJREFUWIXtVktrJFUU/k7dW1WpVHfT62RAMAsRcakmMJkwdjXTREIImcVswuAwzi4rXaq/wIUgxKWPIEzDkIDEiOkOJKsIs2jEx0IQGWbjYlqhq7sr1XXvPS5SFfOaTE/b6Ka/VdW5j+/jvO4BRhjhfwZdZFxeXn6r3W6/kCTJMy9wXReFQuGbarX6aBAB8qxhbm7OD8NwK5fLQWt9bFdKwRgDKSUsyzolIAzDFwG8NxQB+/v7nUqlcqvb7b6ilDq59LaU8kqSJFtKqUZm7PV6yOfz1UHIgaeE4CIEQbDved61KIpu1Ov1nUEJz8J69pYjMLPNzNBa87DIgTQEs7Oz7vj4+BIzF7O4CyHAzE9yudzG5uamISJmZjiOs1IqlaYGIRNCwPf9PzY2Nr4mIgMAcmlpyQrD8FvHca6fTC4igtYarVbrVQA/AUeJKKVcGRsbW9FaZ/8QQvQtIkkSLC4ufgegAgCy1Wrd8zzvehRFfzLzl0QUAoBlWVBKPbFt+9djd0kJrfVWHMcNZi47jjMdRdH3RFTrh5yZ85Zl3XEc58b8/Pyt7e3t+xLAS6m7P93d3X3/ksNERFBKfVKv13fK5bLluu60Umq3Vqt92K8HKpWKllK+2+123wBw3wIQp2uH/VxgjMmngjxmBjN7/ZIDQBzHf6X3xMDpKug/kP8ClmWd6j3HAohoqOX1NBhjTnU3C4CTfqvz28+DmVsAQEQREYGIoucRkM/ni8wMIrIBQDLzb2ksbwdBMAaAgaOMV0o9bjabnzcaDUVEbIyBEOJeEARXjTGlOI5hjCkFQaAvZf1HvJskyTtSSvi+/zMASCHEZ51O57bv+68R0QfZZiICM8MY8wOAhwCgtYbrujfTcoRSCp7nTQshpvv1gNYavV7v4dTUVBUAZK1W687MzLxp2/ZdrfXLxhhkHtBaP+p0Oj9mh4UQiOO4dnh4+Htm6+fJziClhOu6BxMTEw/W1tY6QNqKDw4O2gA+vuwwM1PanD7a29v77x8jIkrSpBtqtZx7jpkZCwsLZWPM1V6vd3LpjpTyilLqAYBfMqPv+0mhUPhifX398SACzg0kq6ureaXUjud5sG372J5NRJ7n3Tw7ETWbzSKGNREVi8W2lPJuFEWvX5RgZ7wCY0wyOTn51SDkI4wwAgD8DRixkgDRtVchAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVERwXWf787gAABKdJREFUWIXdV09o21Yc/p5kabJkpx2keMsOppd1o7A/LWyUEMe2ItvB3WguaUsp63WjUHobbMcNethhZYdeBz40sNJtrF6apB62sbOQdSVdoCWwUNzQtN5onKBYif48vR0aF8eO48TZKOy76f0+ve97T59+0iOqqh7zeDwRy7Jc1IHneQAApRStIIoiMQzj23w+/7gVhxDiicViRziO66aUPl1aWrpz+/Ztu1b3MMY+DAaDn7ZUaYP5+fksgC0NqKp6IhaLXZEk6RXGGERRRHd3d1lV1fOZTOYaAHCMMaNTcQBgjG25ReFw+JQsy98DgGEYn9i2HTYM42PGGPN6vd/F4/HjAODZizgAEELsxrFIJHKyq6vrqmmas7quD0xOTv61Ucolk8kfHMeZdV33CiHk5yYDc3NzBymlKzsRdxyHTE1NbeJGIpGTfr9/xDTN2UqlEpmenn5aX0+n0080TfvK6/VeisVirzcZmJ+fLy8sLKztxEAj2onXIAjCHCEElNKXucZiIBAQ/0txADBNM0QpBSHk0Z4zAAD9/f3DXV1dI6ZpzpbL5dDMzMxyK66qqu9JknTRNM3fJiYmHjbtwG4Rj8ffkGX5qmVZ9yuVSsS2bSeRSHyhadqbjdxQKHREEIQMpXQZwEcAsGcDlNILgiBwAE5PT08/3b9//2uCIHzG83wuGo0G68UVRckBcHVdj0xMTNz/VwzwPB+pVqsLY2NjdwGgWCzO2batCYJwgOO4bwAgGo0elWV5kjHmrq6uhorF4kzt/o4MqKo6pKrqCeBZHyCEbMrSzZs3b62trV0TRfGD4eFhH6W0hxBS0nW9v1Ao3K3n7trARtqvA7gAAJZlpRVFeTWRSAzU81zXvSOKIgAcyuVyP42Ojh6qX3lHBsLh8Cm/3z9iGMYflNLTAOA4zuX19fUVjuOuDw4O9te4PM+/bZomqtXqo+3m3LGBjZVfNU1zdnl5OZrNZp8AQD6ff2ya5nGe59cJIYkN7vuSJJ20bXssnU4/2W7eHfWBeDx+VFGUEcuy7m3VZLLZbOHs2bMHU6lUdSPtt2zbXnIc53w9jxBCzp07967ruh6e54lhGIs7MuC67ueUUpcxdrxVh0ulUtXe3t53/H5/njFGdV1Xi8Xin/WcYDD4kiiKv9euK5XKZc513ebZNrvmAUQcxymOj48/aMULhUJH/H5/Ac/e8/6tAtcIx3GoR5KkdjzCGOMBWNuJy7KcA0B3Kg4AhBDWdgcYYw4h5FdBEHoHBwcPNNb7+vqOyrKcxy5WXg/O42kfA0LIJVEUJQA/JpPJ5z1e07Skoih57HLlmwxYVsudfY7x8fFfVldXLwqCcAzAvYGBgXuapj30er03ABidigNA20dQQyaT+dq27T7btlMAQAj527KsLw3DeKtTcWCX/4Sjo6MFAIVOxbbCnr+G/z8D5XK5fSo7RKlUMhvHmjJw+PDhwJkzZ1b27du3a4HFxUXW09NDtqqtrKxgaGioqes1GQgGgw+A7c+ErRAIBFre5/P54PP5msZffAYIIfIL1Fc8PM/fKJVKOqX0eUeilEIURQ9jjNm2TWtH9X8TPM9zrutO/QMUu0XyKmJPLwAAAABJRU5ErkJggg==\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Table } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1001;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 400px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface LikesPanelProps {\n likesArray: any[];\n openCloudFile: (userid: string, title: string) => void;\n}\n\nconst LikesPanel = ({ likesArray, openCloudFile }: LikesPanelProps) => {\n const language = useStore(Selector.language);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showLikesPanel = false;\n });\n };\n\n return (\n <>\n \n \n \n
\n {i18n.t('cloudFilePanel.MyLikes', lang)}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n record}\n size={'small'}\n style={{ width: '100%', direction: 'ltr' }}\n dataSource={likesArray}\n scroll={{ y: 300 }}\n pagination={{\n defaultPageSize: 10,\n showSizeChanger: true,\n position: ['bottomCenter'],\n pageSizeOptions: ['10', '20', '50'],\n }}\n >\n (\n {\n const s = record as string;\n const i = s.lastIndexOf(', ');\n if (i >= 0) {\n usePrimitiveStore.setState((state) => {\n state.openModelsMap = false;\n });\n openCloudFile(s.substring(i + 2), s.substring(0, i));\n }\n }}\n >\n {(record as string).substring(0, (record as string).lastIndexOf(', '))}\n \n )}\n />\n \n
\n
\n \n \n );\n};\n\nexport default React.memo(LikesPanel);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Table } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1001;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 420px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface PublishedModelsPanelProps {\n publishedModels: any[];\n openCloudFile: (userid: string, title: string) => void;\n}\n\nconst PublishedModelsPanel = ({ publishedModels, openCloudFile }: PublishedModelsPanelProps) => {\n const language = useStore(Selector.language);\n const user = useStore(Selector.user);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showPublishedModelsPanel = false;\n });\n };\n\n return (\n <>\n \n \n \n
\n {i18n.t('modelsMap.MyPublishedModels', lang)}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n record}\n size={'small'}\n style={{ width: '100%', direction: 'ltr' }}\n dataSource={publishedModels}\n scroll={{ y: 300 }}\n pagination={{\n defaultPageSize: 10,\n showSizeChanger: true,\n position: ['bottomCenter'],\n pageSizeOptions: ['10', '20', '50'],\n }}\n >\n (\n {\n if (user.uid) {\n usePrimitiveStore.setState((state) => {\n state.openModelsMap = false;\n });\n openCloudFile(user.uid, record);\n }\n }}\n >\n {record}\n \n )}\n />\n \n
\n
\n \n \n );\n};\n\nexport default React.memo(PublishedModelsPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport i18n from '../i18n/i18n';\nimport { Button, Col, Modal, Row, Select, Switch } from 'antd';\nimport { copyTextToClipboard, showSuccess } from '../helpers';\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\nimport { SchoolID } from '../types';\nimport { ClassID } from '../types';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport LikesPanel from './likesPanel';\nimport PublishedModelsPanel from './publishedModelsPanel';\n\nconst { confirm } = Modal;\nconst { Option } = Select;\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1000;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 380px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n text-align: left;\n overflow-x: hidden;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst AccountSettingsPanel = ({ openCloudFile }: { openCloudFile: (userid: string, title: string) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const language = useStore(Selector.language);\n const user = useStore(Selector.user);\n const userCount = usePrimitiveStore(Selector.userCount);\n const showLikesPanel = usePrimitiveStore(Selector.showLikesPanel);\n const showPublishedModelsPanel = usePrimitiveStore(Selector.showPublishedModelsPanel);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const schoolIdRef = useRef(user.schoolID ?? SchoolID.UNKNOWN);\n const classIdRef = useRef(user.classID ?? ClassID.UNKNOWN);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showAccountSettingsPanel = false;\n });\n };\n\n const superuser = user && user.email && user.email.endsWith('intofuture.org');\n const signFile = false;\n\n return (\n <>\n {showLikesPanel && }\n {showPublishedModelsPanel && (\n \n )}\n \n \n \n
\n {i18n.t('accountSettingsPanel.MyAccountSettings', lang)}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n\n \n {\n if (user.uid) {\n copyTextToClipboard(user.uid);\n showSuccess(i18n.t('accountSettingsPanel.IDInClipBoard', lang));\n }\n }}\n >\n \n {i18n.t('accountSettingsPanel.MyID', lang)}\n \n \n \n {user.uid}\n \n \n\n {signFile && (\n \n \n {\n if (checked) {\n confirm({\n title: i18n.t('accountSettingsPanel.DoYouReallyWantToShowYourNameInYourFiles', lang),\n icon: ,\n content: i18n.t('accountSettingsPanel.SignFileDisclaimer', lang),\n onOk() {\n setCommonStore((state) => {\n state.user.signFile = true;\n });\n },\n onCancel() {\n setCommonStore((state) => {\n state.user.signFile = false;\n });\n },\n });\n } else {\n setCommonStore((state) => {\n state.user.signFile = false;\n });\n }\n }}\n />\n \n \n {i18n.t('accountSettingsPanel.StoreMyNameInMyFilesWhenSaving', lang)}\n \n \n )}\n\n \n \n {i18n.t('accountSettingsPanel.SchoolID', lang)}\n \n \n {\n schoolIdRef.current = value;\n setCommonStore((state) => {\n state.user.schoolID = value;\n });\n }}\n >\n \n \n \n \n \n \n \n \n \n\n \n \n {i18n.t('accountSettingsPanel.ClassID', lang)}\n \n \n {\n classIdRef.current = value;\n setCommonStore((state) => {\n state.user.classID = value;\n });\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n {i18n.t('accountSettingsPanel.AllPublished', lang)}\n \n \n {\n setPrimitiveStore('showPublishedModelsPanel', true);\n }}\n >\n {user.published?.length ?? 0}\n \n \n \n\n \n \n {i18n.t('accountSettingsPanel.PublishedUnderAliases', lang)}\n \n \n \n {user.aliases?.map((value, index) => {\n if (!user.aliases) return null;\n return value + (index < user.aliases.length - 1 ? ', ' : '');\n })}\n \n \n \n\n \n \n {i18n.t('accountSettingsPanel.Likes', lang)}\n \n \n {\n setPrimitiveStore('showLikesPanel', true);\n }}\n >\n {user.likes?.length ?? 0}\n \n \n \n\n {superuser && (\n \n \n {i18n.t('accountSettingsPanel.UserCount', lang)}\n \n \n {userCount}\n \n \n )}\n
\n
\n \n \n );\n};\n\nexport default React.memo(AccountSettingsPanel);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDjACEy7XXwAAA5xJREFUWIXll09II1ccx9+8mcnE2aUxE6KO5L2ZN3+cJDOrBiNUWKHQaiFEClso9CIlpx62SOmhS1fIlm270N5K/wg9LKXsdi1dl5aC3RaFRdaCbNHaLtX2oDQXDRGTBo0zSZyeLEqz1uxq9rCf4/ze9/f58k5vAHjSoWp9tCzLomn6hXw+38JxHIEQVra2tv70+/2/Oo5za2lpaatWLhaLPUVR1Evr6+uax+PpYFmWcV33LwDAMsb4u6mpqZVDCwwODqorKytXyuUyZBhmIZfL3QkGgzvb29sUwzASx3FnS6VSpFwuf7O2tvbx/qxpmhdd1x2sVCoLuVzuR0EQsh6Pxy0Wi80cx/W5rnu2Wq3+5vf7L87Pz5f+0z4SiTxLCJknhKQOu7L+/v4QIeQaQui667pwenqaM03ztiRJnyUSifYH5cLhMIsxvowQmtV1XT4w7OzsNBFCCzzP64fJ9xOPx6/IsvyFoijj0Wj0zaPmWltbE6IozvX09AQAAACMjo5SoVDoe9M0B466ZI9QKPQpxvijenOapr1qGMYEAACAaDT6PCHkWr1LHhVCyGR3d3ccOo6T5DjuaqMLsCx7tVAonIM7OzsiwzCzjS4QDAZ/AABEgKqq9xst30PTtPvQdV3v4yoAADgFIYTO47JXq9UMtG3794GBAb7R8o6ODsG27VUoCEJpY2PjTKMLsCzbw/P8Bk3T9Gnbts8UCoW7jSzQ1NSUKhaLP0Gv1ztNUdRzjZSPjY0xAIC4IAh36M3Nzb/9fn+yubnZzufzfzSiwPLycspxHO/q6urXEAAAAoHABwzDpNPpNH3S8nA4fKpSqbzG8/z7BwaEkEuEkLGTLoAxvq6q6us1h6IoftXV1XXppORtbW3vEEI+P+wMJcvy7Vgslj5uuSiKbyOEJsbHx+H/naXa29tvybL87nHJFUX5ECF0E9R4g9Zq46ZSqXMQQkwI+TKdTjc9rHhkZMSn6/q3u7u7MJPJvAgAcOtaEA6HLyuKctcwDKteeV9fX1xV1Z8Nw3ir3uwBWlpaniGEzGGMzx81o6rqeVmW71mWlXgk+R7JZDKgKMoNjPFEb29v9EHnLMsiCKGbkiTd+PfReZwYhvGyoiizpmm+NzQ0dHr/DCF0QdO0OUmSXqlnZ80/o8MYHh72zczMXAAAPO3z+Say2WyWpulhjuMyuq6nJycn10+0wB6xWEx1HOcN27Zpnuc/WVxc/OVhdz3Z/AOzXBiEX6oZVwAAAABJRU5ErkJggg==\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport ResidentialBuildingIcon from '../assets/map_residential_building.png';\nimport CommercialBuildingIcon from '../assets/map_commercial_building.png';\nimport SchoolBuildingIcon from '../assets/map_school_building.png';\nimport TouristAttractionIcon from '../assets/map_tourist_attraction.png';\nimport SolarPanelIcon from '../assets/map_solar_panel.png';\nimport ParabolicDishIcon from '../assets/map_parabolic_dish.png';\nimport ParabolicTroughIcon from '../assets/map_parabolic_trough.png';\nimport FresnelReflectorIcon from '../assets/map_fresnel_reflector.png';\nimport HeliostatIcon from '../assets/map_heliostat.png';\nimport UnderConstructionIcon from '../assets/map_under_construction.png';\nimport UnknownIcon from '../assets/map_marker.png';\nimport EmptyHeartIcon from '../assets/empty_heart.png';\nimport RedHeartIcon from '../assets/red_heart.png';\nimport OpenFileIcon from '../assets/open_file.png';\nimport DeleteIcon from '../assets/delete.png';\nimport ExportLinkIcon from '../assets/export_link.png';\nimport ClickCountIcon from '../assets/click_count.png';\n\nimport React, { useCallback, useRef, useState } from 'react';\nimport { GoogleMap, Marker, GoogleMapProps, InfoWindow, MarkerClusterer } from '@react-google-maps/api';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { UndoableChangeLocation } from '../undo/UndoableChangeLocation';\nimport { DEFAULT_MODEL_MAP_ZOOM, HOME_URL, LAT_LNG_FRACTION_DIGITS } from '../constants';\nimport { copyTextToClipboard, showError, showSuccess } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { ModelSite, ModelType } from '../types';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { Modal, Collapse, Space } from 'antd';\nimport {\n ExclamationCircleOutlined,\n UpCircleOutlined,\n DownCircleOutlined,\n PushpinOutlined,\n PushpinFilled,\n} from '@ant-design/icons';\nimport ReactTimeago from 'react-timeago';\nimport ReactCountryFlag from 'react-country-flag';\nimport { Util } from '../Util';\n\nconst { Panel } = Collapse;\n\nexport const getIconUrl = (site: ModelSite) => {\n switch (site.type) {\n case ModelType.PHOTOVOLTAIC:\n return SolarPanelIcon;\n case ModelType.PARABOLIC_DISH:\n return ParabolicDishIcon;\n case ModelType.PARABOLIC_TROUGH:\n return ParabolicTroughIcon;\n case ModelType.FRESNEL_REFLECTOR:\n return FresnelReflectorIcon;\n case ModelType.SOLAR_POWER_TOWER:\n return HeliostatIcon;\n case ModelType.RESIDENTIAL_BUILDING:\n return ResidentialBuildingIcon;\n case ModelType.COMMERCIAL_BUILDING:\n return CommercialBuildingIcon;\n case ModelType.SCHOOL_BUILDING:\n return SchoolBuildingIcon;\n case ModelType.TOURIST_ATTRACTION:\n return TouristAttractionIcon;\n case ModelType.UNDER_CONSTRUCTION:\n return UnderConstructionIcon;\n }\n return UnknownIcon;\n};\n\nexport interface ModelsMapProps {\n selectAuthor: (author: string | undefined) => void;\n closeMap: () => void;\n openModel: (model: ModelSite) => void;\n deleteModel: (model: ModelSite, successCallback?: Function) => void;\n likeModel: (model: ModelSite, like: boolean, successCallback?: Function) => void;\n pinModel: (model: ModelSite, pinned: boolean, successCallback?: Function) => void;\n}\n\nconst ModelsMap = ({ selectAuthor, closeMap, openModel, deleteModel, likeModel, pinModel }: ModelsMapProps) => {\n const language = useStore(Selector.language);\n const user = useStore.getState().user;\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const modelsMapLatitude = useStore(Selector.modelsMapLatitude);\n const latitude = modelsMapLatitude !== undefined ? modelsMapLatitude : 42.2844063;\n const modelsMapLongitude = useStore(Selector.modelsMapLongitude);\n const longitude = modelsMapLongitude !== undefined ? modelsMapLongitude : -71.3488548;\n const mapZoom = useStore(Selector.modelsMapZoom) ?? DEFAULT_MODEL_MAP_ZOOM;\n const mapTilt = useStore(Selector.modelsMapTilt) ?? 0;\n const mapType = useStore(Selector.modelsMapType) ?? 'roadmap';\n const weatherData = useStore(Selector.weatherData);\n const mapWeatherStations = usePrimitiveStore(Selector.modelsMapWeatherStations);\n const modelSites = useStore(Selector.modelSites);\n\n const [map, setMap] = useState(null);\n const [selectedSite, setSelectedSite] = useState | null>(null);\n const [selectedLocation, setSelectedLocation] = useState(null);\n const [ascendingOrder, setAscendingOrder] = useState(true);\n const [updateFlag, setUpdateFlag] = useState(false);\n const previousSiteRef = useRef | null>(null);\n const markersRef = useRef>([]);\n const selectedMarkerIndexRef = useRef(-1);\n const cities = useRef([]);\n\n const lang = { lng: language };\n const imageSize = 14;\n const ifiUser = user.email?.endsWith('@intofuture.org');\n\n const loadCities = () => {\n cities.current.length = 0;\n for (const x in weatherData) {\n if (weatherData.hasOwnProperty(x)) {\n const w = weatherData[x];\n const pos = new google.maps.LatLng(w.latitude, w.longitude);\n cities.current.push(pos);\n }\n }\n };\n\n const onLoad = useCallback((map: google.maps.Map) => {\n setMap(map);\n loadCities();\n map.setMapTypeId(mapType); // for some reason, we have to do this again\n }, []);\n\n const onUnmount = useCallback(function callback() {\n setMap(null);\n }, []);\n\n // FIXME: Undo doesn't work unless the focus is returned to the main window\n const onCenterChanged = () => {\n if (map) {\n const center = map.getCenter();\n if (center) {\n const lat = center.lat();\n const lng = center.lng();\n if (lat !== latitude || lng !== longitude) {\n const undoableChangeLocation = {\n name: 'Set Model Map Location',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: lat,\n oldLongitude: longitude,\n newLongitude: lng,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapLatitude = undoableChangeLocation.oldLatitude;\n state.modelsMapLongitude = undoableChangeLocation.oldLongitude;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapLatitude = undoableChangeLocation.newLatitude;\n state.modelsMapLongitude = undoableChangeLocation.newLongitude;\n });\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n state.modelsMapLatitude = lat;\n state.modelsMapLongitude = lng;\n });\n }\n }\n }\n };\n\n const onZoomChanged = () => {\n if (map) {\n const z = map.getZoom();\n if (z !== undefined && z !== mapZoom) {\n const undoableChange = {\n name: 'Zoom Model Map',\n timestamp: Date.now(),\n oldValue: mapZoom,\n newValue: z,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapZoom = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapZoom = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.modelsMapZoom = z;\n });\n }\n }\n };\n\n const onTiltChanged = () => {\n if (map) {\n const t = map.getTilt();\n if (t !== undefined && t !== mapTilt) {\n const undoableChange = {\n name: 'Tilt Model Map',\n timestamp: Date.now(),\n oldValue: mapTilt,\n newValue: t,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapTilt = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapTilt = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.modelsMapTilt = t;\n });\n }\n }\n };\n\n const onMapTypeIdChanged = () => {\n if (map) {\n const typeId = map.getMapTypeId();\n if (typeId !== undefined && typeId !== mapType) {\n const undoableChange = {\n name: 'Change Model Map Type',\n timestamp: Date.now(),\n oldValue: mapType,\n newValue: typeId,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapType = undoableChange.oldValue as string;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapType = undoableChange.newValue as string;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.modelsMapType = typeId;\n });\n }\n }\n };\n\n const options = {\n styles: [\n {\n featureType: 'poi',\n elementType: 'labels',\n stylers: [{ visibility: 'off' }],\n },\n {\n featureType: 'transit',\n elementType: 'labels',\n stylers: [{ visibility: 'off' }],\n },\n ],\n } as GoogleMapProps;\n\n const openModelSite = (model: ModelSite) => {\n if (model.userid && model.title) {\n openModel(model);\n closeMap();\n } else {\n showError(i18n.t('message.ModelNotFound', lang));\n }\n };\n\n const shareModelSite = (model: ModelSite) => {\n if (model.userid && model.title) {\n const url = HOME_URL + '?client=web&userid=' + model.userid + '&title=' + encodeURIComponent(model.title);\n copyTextToClipboard(url);\n showSuccess(i18n.t('cloudFilePanel.LinkGeneratedInClipBoard', lang) + '.');\n } else {\n showError(i18n.t('message.ModelNotFound', lang));\n }\n };\n\n const deleteModelSite = (model: ModelSite) => {\n Modal.confirm({\n title: i18n.t('message.DoYouWantToDeleteModelFromMap', lang),\n icon: ,\n onOk: () => {\n deleteModel(model, () => {\n // also remove from the cached records\n setCommonStore((state) => {\n if (state.modelSites) {\n const modelsOfSite = state.modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n let key = undefined;\n for (const [k, v] of modelsOfSite) {\n if (v.userid === model.userid && v.title === model.title) {\n key = k;\n break;\n }\n }\n if (key) {\n modelsOfSite.delete(key);\n // if there is no more model, remove the marker from the map\n if (modelsOfSite.size === 0) {\n markersRef.current[selectedMarkerIndexRef.current]?.marker?.setMap(null);\n }\n }\n }\n }\n });\n setSelectedSite(null);\n setSelectedLocation(null);\n });\n },\n onCancel: () => {},\n okText: i18n.t('word.Yes', lang),\n cancelText: i18n.t('word.No', lang),\n });\n };\n\n const likeModelSite = (model: ModelSite) => {\n if (model.userid && model.title) {\n const modelKey = Util.getModelKey(model);\n const liked = !!user.likes?.includes(modelKey);\n likeModel(model, !liked, () => {\n // update the cached record\n setCommonStore((state) => {\n if (state.user) {\n if (!state.user.likes) state.user.likes = [];\n if (state.user.likes.includes(modelKey)) {\n const index = state.user.likes.indexOf(modelKey);\n if (index >= 0) {\n state.user.likes.splice(index, 1);\n }\n } else {\n state.user.likes.push(modelKey);\n }\n }\n if (state.modelSites) {\n const modelsOfSite = state.modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n if (v.likeCount === undefined) v.likeCount = 0;\n v.likeCount += liked ? -1 : 1;\n break;\n }\n }\n }\n }\n });\n setUpdateFlag(!updateFlag);\n });\n }\n };\n\n const getLikeCount = (model: ModelSite) => {\n const modelsOfSite = useStore.getState().modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n return v.likeCount ?? 0;\n }\n }\n }\n return 0;\n };\n\n const getClickCount = (model: ModelSite) => {\n const modelsOfSite = useStore.getState().modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n return v.clickCount ?? 0;\n }\n }\n }\n return 0;\n };\n\n const isPinned = (model: ModelSite) => {\n const modelsOfSite = useStore.getState().modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n return v.pinned;\n }\n }\n }\n return false;\n };\n\n const pinModelSite = (model: ModelSite, pinned: boolean) => {\n if (model.userid && model.title) {\n pinModel(model, pinned, () => {\n // update the cached record\n setCommonStore((state) => {\n if (state.modelSites) {\n const modelsOfSite = state.modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n v.pinned = pinned;\n setUpdateFlag(!updateFlag);\n break;\n }\n }\n }\n }\n });\n });\n }\n };\n\n return (\n \n {/* Child components, such as markers, info windows, etc. */}\n <>\n {mapWeatherStations &&\n cities.current.map((c, index) => {\n const scale = 0.2 * mapZoom;\n return (\n \n );\n })}\n {selectedSite && selectedSite.size && selectedLocation && (\n \n {\n setSelectedSite(null);\n setSelectedLocation(null);\n }}\n >\n {selectedSite.size > 1 ? (\n \n {ascendingOrder ? (\n {\n setAscendingOrder(false);\n }}\n />\n ) : (\n {\n setAscendingOrder(true);\n }}\n />\n )}\n \n {selectedSite.size} {i18n.t('modelsMap.ModelsFoundOnThisSite', lang)}\n \n {selectedLocation && (\n \n  —{' '}\n {i18n.t('word.Coordinates', lang) +\n ': (' +\n selectedLocation.lat().toFixed(LAT_LNG_FRACTION_DIGITS) +\n '°, ' +\n selectedLocation.lng().toFixed(LAT_LNG_FRACTION_DIGITS) +\n '°)'}\n \n )}\n \n ) : (\n ''\n )}\n {[...selectedSite.keys()]\n .sort((a, b) => {\n const modelA = selectedSite.get(a);\n const modelB = selectedSite.get(b);\n if (modelA?.pinned && !modelB?.pinned) return -1;\n if (modelB?.pinned && !modelA?.pinned) return 1;\n return (ascendingOrder ? 1 : -1) * ((modelA?.timeCreated ?? 0) - (modelB?.timeCreated ?? 0));\n })\n .map((key: string, index: number) => {\n const m = selectedSite.get(key);\n if (!m) return null;\n return (\n 1 ? '5px 5px 20px 5px' : '5px',\n background: index % 2 === 0 ? 'white' : '#eeeeee',\n }}\n >\n {index === 0 && (\n
\n {m.countryCode && (\n \n )}\n {m.address ?? 'Unknown'}\n {selectedSite.size === 1 && (\n \n {i18n.t('word.Coordinates', lang) +\n ': (' +\n selectedLocation.lat().toFixed(LAT_LNG_FRACTION_DIGITS) +\n '°, ' +\n selectedLocation.lng().toFixed(LAT_LNG_FRACTION_DIGITS) +\n '°)'}\n \n )}\n
\n )}\n \n \n {m.label}\n {isPinned(m) && }\n \n }\n key={index}\n style={{ fontSize: '12px' }}\n >\n
\n \n {m.thumbnailUrl && (\n openModelSite(m)}\n />\n )}\n
\n {m.description && m.description.trim() !== '' ? m.description : ''}\n  —  By{' '}\n {\n selectAuthor(m.author);\n }}\n >\n {!m.author || m.author === '' ? i18n.t('word.Anonymous', lang) : m.author}\n \n , \n {m.timeCreated && }\n
\n
\n
\n \n \n
\n {ifiUser && (\n <>\n {isPinned(m) ? (\n pinModelSite(m, false)}\n />\n ) : (\n pinModelSite(m, true)}\n />\n )}\n \n )}\n openModelSite(m)}\n style={{ marginLeft: '10px', cursor: 'pointer' }}\n title={i18n.t('word.Open', lang)}\n src={OpenFileIcon}\n height={imageSize}\n width={imageSize}\n />\n shareModelSite(m)}\n style={{ marginLeft: '5px', cursor: 'pointer' }}\n title={i18n.t('word.Share', lang)}\n src={ExportLinkIcon}\n height={imageSize}\n width={imageSize}\n />\n {m.userid === user.uid && (\n deleteModelSite(m)}\n style={{ marginLeft: '5px', cursor: 'pointer' }}\n title={i18n.t('word.Delete', lang)}\n src={DeleteIcon}\n height={imageSize}\n width={imageSize}\n />\n )}\n {user.uid ? (\n <>\n {user.likes && user.likes.includes(Util.getModelKey(m)) ? (\n likeModelSite(m)}\n style={{ marginLeft: '10px', cursor: 'pointer' }}\n title={i18n.t('word.AlreadyLike', lang)}\n src={RedHeartIcon}\n height={imageSize}\n width={imageSize}\n />\n ) : (\n likeModelSite(m)}\n style={{ marginLeft: '10px', cursor: 'pointer' }}\n title={i18n.t('word.Like', lang)}\n src={EmptyHeartIcon}\n height={imageSize}\n width={imageSize}\n />\n )}\n \n ) : (\n <>\n \n \n )}\n    {getLikeCount(m)}\n \n    {getClickCount(m)}\n
\n \n );\n })}\n \n
\n )}\n {!!modelSites && !!modelSites.size && (\n \n {(clusterer) => (\n
\n {[...modelSites.keys()].map((key: string, index: number) => {\n const m = modelSites.get(key);\n if (!m || !m.size) return null;\n const keys = [...m.keys()].sort((a, b) => {\n const modelA = m.get(a);\n const modelB = m.get(b);\n if (modelA?.pinned && !modelB?.pinned) return -1;\n if (modelB?.pinned && !modelA?.pinned) return 1;\n return (ascendingOrder ? 1 : -1) * ((modelA?.timeCreated ?? 0) - (modelB?.timeCreated ?? 0));\n });\n const model = m.get(keys[0]);\n if (!model) return null;\n const iconUrl = getIconUrl(model);\n return (\n (markersRef.current[index] = e)}\n clusterer={clusterer}\n icon={iconUrl ? { url: iconUrl } : undefined}\n position={{ lat: model.latitude, lng: model.longitude }}\n onClick={() => openModelSite(model)}\n onMouseOver={(e) => {\n previousSiteRef.current = selectedSite;\n selectedMarkerIndexRef.current = index;\n setSelectedSite(m);\n const c = key.split(', ');\n setSelectedLocation(new google.maps.LatLng(Number.parseFloat(c[0]), Number.parseFloat(c[1])));\n }}\n onMouseOut={(e) => {\n if (selectedSite === previousSiteRef.current) {\n setSelectedSite(null);\n setSelectedLocation(null);\n }\n }}\n />\n );\n })}\n
\n )}\n
\n )}\n \n \n );\n};\n\nexport default React.memo(ModelsMap);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVERweICJESgAAAktJREFUWIXtV02rElEYfo+pdEXq0iKNksQvdBARRjAcPxZ+3EXrFrfWzfkDUb+h/sGcVUS0aN0iFDQ3ttFwKWPIEAVtYtJwiCszp4V4mSvqeEbLxe1dnfOc532fhzPvmZmDKKVwyHAcVP1fGMAY01Kp9PRgBgAA4vH4c4zxymf91wwghLyxWOy2GcMYU4TQ1Qu8fTUhQshbq9UeBoNByYrbarXuyLL8DQAAAcCx3+93bSMynU6NyWTyYxmvVqv3Q6HQOxbDw+Ew02w2e05RFFWWRITQNUrpr8VcEITHyWSSsNQAAIhGo91cLldm7gGe589zyuXyAzvi5mA20Ov1zgAAMplMOBKJvLUrrChKptPpNJ1mUJIkZJUoSfMe43n+s11xcxM6rcirolAonHIct3ZdluUnuq5/nc1m31Op1AfzGiHkiFL6ezFnNoAQcoqi+GYZVxQF1+v1l5TSMzOOMT4fS5KEFjto20A+nz9dxkaj0d1Go/FlXc5gMHjWbrdfrFpjNsBx3CvznBByhVJqrONb9RXTKchms/eWi28S3yaYDKTT6Y9m8V2EmQ0ghI72Lc5koFKp8AAAhJDrm3iBQOAGxphijGmxWDyxqrt1E6qq+okQ4qWUTjfxfD7fzcU4kUi8h/kHb3cD3W5X24anaZq+bU2Ay/BP+N/A5TOgqupPFv6FYygIwiOPx0M1TbN80xmGQR0OB1rGwuHwLdsGksnka5bkfcTBe8DZ7/dPXC7Xsa7PX2CLbTUMY6cbi9vthvF4LFvx9nYzsht/AFhGzatwKRNAAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDzUx0EsoOwAAAotJREFUWIXtl7FP20AUxr9LXhLrFKXHwNB4oiAStXFlC4kFAVmtWAJPUYfOoCydOiA2hMTAH8Cf0JU1AysSohLq0LAVPHRDSmshyHCX65A4SRGFKIkpA59k6WQ/v+93d7p3d8CIWllZMYUQ50KI88XFRXPUPCPJtu05znkAQAPQnPPAtu25JzF3HGd20HwQwnGc2VjN7/b8PojYRuKueT6fPyIilU6nVT6fP4oVYmFhYZ5zfol+bzdqtdqSYRjaMAxdq9WWAGwwxiKIy1KpND8Rc9/3E5zzRmSeSCS2AMDzPC8C8DzPA4BkMrmF/kg0fN9PTIKBZTKZUyLSXQMAgOu6axGA67pr0ftkMrlFRDqTyZwCYI8lH4ZQl8tl1zRNWym191iwUmrPNE27XC676IzGg6IhAFCv168AXA0TCwBBEHwLgmCo2InM0Th6AXgBeDYAaSHErhBiM25DIcSmEGIXQLoHUCwW/TAMt1ut1kGlUoltX69UKnOtVusgDMPtYrHo9wCEEK8BIJVKIZvNTscFkM1mp1OpFAY9EwCglJIAoLUGY0zFBcAYU1p3qnPkOVQpvk9SSmq32732qHlG/jEMw69E9CtqPznAyclJsL6+XgKAw8PDn08OMK5xpGdTiP47AAMAxhiIxpqVB0VEYKx3SmM9gHZ3PSmlIKW8jQtASnmrVKfMRJ4AgEKhsEpEGoCempr6FBdAN7cmIl0oFFaB7iqwLOs4CIKGlPJts9ncz+Vy78Mw/D5J81wu967ZbH4EACJqVKvV452dnX6AZVnLnPNr/OPaNanHMIxry7KWI9+/zu2O47y5uLj4zBj7cHNz86q7N4zV8ygH5/y31vrLzMzM/tnZ2Y/o+x/AkgU3TshK/QAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDi8RWsqYHwAABAtJREFUWIXlls1rXFUYxp9z7ufcyXykM8lkJiRpvtpUNFFrSEVcTE2htCpk48aCoAuz6UoQdF0VceVGEFfWP0AXIlIkLqTQIhQRXNkP1FBJMkmTzGRm7ufj4nYmmY9MkyZxoQ+8XLj3nPN7n/fce+4L/N8l2t3cmJwe91YWXzKBM35hVYskuuGk4n8Wo7Fv+m7dutlpwcLEUzPq5so5w3ZPBcUtyL606+rmjcrYwLXM9z/e7ZjNbxdnx0q5vq9d03SoqCQECYShKKRp0s9kf15+/sULzXP/OpfPV3v7b7A7TWp6OEeAlILUNTqWtVXK9n92e/6dnrbw5adfOF9OJgoU29BgR3BndMVYyPZfrrs+OX056MuEc3SddjxGR1PpNc9XJMup1J2NV16baYAvnnpuqhpLlNkECtpc64upGldGRy8t5WcvMdHd8NzRNdqJOB1N0m8zt5pOra3lLwyGdFJUksd+pRAtoE5BgKVU0iv29njNFfMBug8rYauy0YgIYzObWwjdT06+TE1rAfsd4D5AO2rRjUfabldtjKPrrMZjtBVRh9craOr8e2pqWnYvr74OzwObvoe2nwcAAvAsA74ElJJdv9csAUBxHChVG4xY8FSlYQ3YLsyllbckPDsf5vQo9EN41AQ1FXqpDBEQ7DBeAJCOA9V24Ma74EsBAUAIACQMz5kTZdNkpFrd1UmjcxOBqkErlqCQHcc3yzV0CE0HKmVoQRCuaRqQnuftDR41QVWBvrkFhftBh9JsB9J24CVi8BUJCAm6LmREj3RMgAB8y0SgqFCLZUgE4CMS3k3SdaBsVRBEonBJyGQK0o3od8PFWveSAFzLQKAq0IvlfZe9ncJKVCGiBkqGeU+6gbcg6rhGuGeZgKqFzhkcEL0t6bhQHR9uxLomvXT2B6hKi38KARkE0IpbdecHdV+TAICA8BV8K38fjX3nqFqpOQFBQq06kDh42dupYuml0vmZnwAA67n+Lyjlno/hgwYBFoeHPgcACQAbz8x8aHdZlSMw2iIBoBJLPtgcGHq/4UFhcPhNGuaRVoEAaURYeHbmjbbZrY+MfEm19cd0eHCND3LHP+hYovVc9ipV5VCTqP39SifHr2Ivp+jy6PGvaB7OdoSdkODG8NCne31PwnfixMTHNIx6b/fYcCvC1Wzu3X3Ba1oayc3ZyUSFcu+dUh0MsHosWbk/MTL3WPCa7s/OnraTqetU9nZO1DrocrL35h+zr54+ELwuUqwNDX7kW9auLVgN7psm1wcGPllYuGccDnyHVp+cOFNJp6/T3H43KLa7ZCeT+WVlcjJ/6OCdmiPl6tjI2253cpGqTiqCbtxa3hwff+9IXO+m2/PzPcUTT1zZyGWu3Dl7tvdfA//n9A8HQo97kdEpRwAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYEwsXVr/srwAAAYVJREFUWIXt1D8vQ1EYBvDnvOf0372twTdoYuJLEIPBZLFIDFaNCZMBaSwkhg6d7VJrox/ApiEhKW1ViQhXRWh7b3vvey3CJLmC0+U+y1nOe55fTk6OQMCsbO7mjKSR8TxGRIrs/MxUNp1OO0HnvwsF3XjZaKBSvUL59Aymaax1u97Ib8t/BCBBICJISXD7fTAzawX8V0JACBg4QOkq2srlhiMqNRFNJNCyrLuN5cUjQOMN1Jut0bvH5/1a43a/1+NioVia1gq4v39wm80bVKs1+IKGSKhxrQAVUZBSQikFZg/w/Y5WwLcwACiUSsPH5UoeoDFmDz23O7eztnqiDSBZLTHk7EWtjngshrfXTlJH+SeAmaXb78OxbQjfB4Tn6QIQAAgh+GOFEEJX9xdgkPmTn9D3faxv5yejZmKBALTb7cPsamZPG6BcPh+Jx6MHldp1yjBNvLSeHAD6AEQipqKRlGVZSNoObLvbDjz7FwClFHuuCyICkQCJ4McO/BGGgBAQAkLAO6uZiizcGAzsAAAAAElFTkSuQmCC\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\nimport { Drawer, Empty, Input, Space } from 'antd';\nimport { ModelSite } from './types';\nimport { LeftCircleOutlined, RightCircleOutlined } from '@ant-design/icons';\nimport { getIconUrl } from './components/modelsMap';\nimport ImageLoadFailureIcon from './assets/image_load_failure.png';\n\nexport interface ModelsGalleryProps {\n author: string | undefined; // if undefined, the user is the owner of models\n models: Map | undefined;\n closeCallback: () => void;\n openCloudFile?: (userid: string, title: string) => void;\n}\n\nconst ModelsGallery = ({ author, models, closeCallback, openCloudFile }: ModelsGalleryProps) => {\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const modelsMapType = useStore(Selector.modelsMapType);\n\n // make an editable copy because models is not mutable\n const modelsRef = useRef>(models ? new Map(models) : new Map());\n // set a flag so that we can update when modelsRef changes\n const [recountFlag, setRecountFlag] = useState(false);\n const [selectedModel, setSelectedModel] = useState();\n const [ascendingOrder, setAscendingOrder] = useState(false);\n\n const { Search } = Input;\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n useEffect(() => {\n if (models) {\n modelsRef.current = new Map(models);\n setRecountFlag(!recountFlag);\n }\n }, [models]);\n\n const countModels = useMemo(() => {\n let count = 0;\n for (const v of modelsRef.current.values()) {\n // when author is defined, all the models belong to him/her\n // when user is undefined, we only count those that belong to the current user\n if (author || v.userid === user.uid) count++;\n }\n return count;\n }, [modelsRef.current, author, user.uid, recountFlag]);\n\n // use a dark theme when the map is in the satellite mode to match the color\n const dark = author && modelsMapType !== 'roadmap';\n\n return modelsRef.current.size === 0 ? (\n {\n closeCallback();\n }}\n >\n \n \n ) : (\n \n {ascendingOrder ? (\n {\n setAscendingOrder(false);\n }}\n />\n ) : (\n {\n setAscendingOrder(true);\n }}\n />\n )}\n {\n if (!models) return;\n modelsRef.current.clear();\n for (const [k, v] of models) {\n if (v.label?.toLowerCase().includes(s.toLowerCase())) {\n modelsRef.current.set(k, v);\n }\n }\n setRecountFlag(!recountFlag);\n }}\n />\n \n }\n mask={false}\n headerStyle={{\n height: '40px',\n color: dark ? 'white' : 'black', // doesn't work\n background: dark ? '#6A6B6E' : 'whitesmoke',\n paddingLeft: '1px',\n paddingRight: '1px',\n paddingTop: '16px',\n paddingBottom: '12px',\n border: 'none',\n }}\n bodyStyle={{ padding: '0px 4px 0px 4px', overflowY: 'hidden', background: dark ? '#2A2B2E' : 'white' }}\n title={(author ?? i18n.t('modelsMap.MyPublishedModels', lang)) + ' (' + countModels + ')'}\n placement=\"bottom\"\n visible={true}\n height={'164px'}\n onClose={() => {\n setSelectedModel(undefined);\n closeCallback();\n }}\n >\n \n \n \n {[...modelsRef.current.keys()]\n .sort((a, b) => {\n const modelA = modelsRef.current.get(a);\n const modelB = modelsRef.current.get(b);\n if (!modelA || !modelB) return 0;\n return (ascendingOrder ? -1 : 1) * ((modelB.timeCreated ?? 0) - (modelA.timeCreated ?? 0));\n })\n .map((key: string, index: number) => {\n const m = modelsRef.current.get(key);\n if (!m) return null;\n // only show the models that belong to the current user when author is undefined\n if (!author && m.userid !== user.uid) return null;\n return (\n \n );\n })}\n \n \n
\n
\n {\n (event.target as HTMLImageElement).src = ImageLoadFailureIcon;\n }}\n alt={m.label}\n title={m.label}\n src={m.thumbnailUrl}\n style={{\n cursor: 'pointer',\n borderRadius: selectedModel === m ? '0' : '10px',\n border: selectedModel === m ? '2px solid ' + (dark ? 'goldenrod' : 'red') : 'none',\n marginRight: '4px',\n }}\n onClick={() => {\n setSelectedModel(m);\n if (openCloudFile) {\n // provided when displaying current user's models\n openCloudFile(m.userid, m.title);\n } else {\n // go to the location on the map when the map is open\n setCommonStore((state) => {\n if (m) {\n state.modelsMapLatitude = m.latitude;\n state.modelsMapLongitude = m.longitude;\n state.modelsMapZoom = 17;\n }\n });\n }\n }}\n />\n {/* the following div is needed to wrap the image and text */}\n
\n \n \n {m.label ? (m.label.length > 30 ? m.label.substring(0, 30) + '...' : m.label) : 'Unknown'}\n \n
\n
\n
\n \n );\n};\n\nexport default React.memo(ModelsGallery);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMLDhEG5xDXZAAAAwVJREFUeJzt3aFy6kAAheHTO53ZqqDWEUVV4uLiFpVVwcXxKhV9JByqdTieABQ8QVxUryozDFCgDbun9HwuzUB28pNkE9rpw8fHB4THv9gDkH0KQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUh83jrDby+vt7Nr9e/vLw83HobOkKuEOLDpSBkFISMgpBREDIKQoY6iLUWxpjYwwjq5vch3+GcQ1EUu+W2bfH29ob1eh1xVGHQHSFlWe7FAIAkSeC9R5IkkUYVDl2Q4XB49OfGGDw/PwceTXh0QdI0PbnuL1xP6IJsNpuT67quCziSOOiCbLfbk+tWq1XAkcRBF2S5XB7s+K7rMJ/P0bZtpFGFQzft7boOs9kMSZJgMBgA+Po0dm/ognxq2/bHR4QxBsaYX3Vk0Z2y+lTXNabTKay1sYdysbsNUlUV0jSFMQbe+18zZb7LIFmWIc/z3bK1Fk3TRBzR5eiDXHu6GQ6H8N4ffZ+qqvoa1s1QBynL8qprgLUWk8nk5Po8zw+ek7GhDZJlGcqyBAA0TXP2waIxBpPJ5Oy1wjmH0WjU2zj7RhnEWovxeLxbvmRnXxLtk/eeduZFF8QYg6ZpDna+tRZ1XR99TVVVV+3gU9tgQBXk3I5K0/TgwlyW5d6Mqq9txUIV5JJPep7nyLIMwP515justXDOffv1t0Dz6MQ5d/EXUN57PD09/SjGpzzP0XUd3t/ff/xefaA4QrIsu3o66pzr7XRTFMXuqIstepBTN3Khscy8ogY5dyMXWtM00aNEC8L40I9hTNGC1HUd/dN4zFf3OyFEm2Vtt9svvz//q6IFWSwWsTZNLfosS/YpCBkFIaMgZBTkCiH+LPpB/6WNi44QMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSHzH/ERhEFb2CeRAAAAAElFTkSuQmCC\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\nimport { Libraries } from '@react-google-maps/api/dist/utils/make-load-script-url';\nimport { StandaloneSearchBox, useJsApiLoader } from '@react-google-maps/api';\nimport Spinner from './components/spinner';\nimport { Checkbox, Empty, Input, Space, Tag } from 'antd';\nimport ModelsMap from './components/modelsMap';\nimport { UndoableChangeLocation } from './undo/UndoableChangeLocation';\nimport { DEFAULT_ADDRESS } from './constants';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\nimport { ModelSite } from './types';\nimport ReactCountryFlag from 'react-country-flag';\nimport { VerticalAlignBottomOutlined, VerticalAlignTopOutlined, UserOutlined } from '@ant-design/icons';\nimport ModelsGallery from './modelsGallery';\n\nconst libraries = ['places'] as Libraries;\n\nconst Container = styled.div`\n position: absolute;\n top: 70px;\n left: 0;\n display: flex;\n width: 100%;\n height: calc(100% - 70px);\n flex-direction: column;\n align-items: center;\n z-index: 999;\n tab-index: 0;\n background: white;\n`;\n\nexport interface ModelsMapWrapperProps {\n openCloudFile: (model: ModelSite) => void;\n deleteModelFromMap: (model: ModelSite, successCallback?: Function) => void;\n likeModelFromMap: (model: ModelSite, like: boolean, successCallback?: Function) => void;\n pinModelFromMap: (model: ModelSite, pinned: boolean, successCallback?: Function) => void;\n}\n\nconst ModelsMapWrapper = ({\n openCloudFile,\n deleteModelFromMap,\n likeModelFromMap,\n pinModelFromMap,\n}: ModelsMapWrapperProps) => {\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const modelsMapType = useStore(Selector.modelsMapType);\n const modelsMapLatitude = useStore(Selector.modelsMapLatitude);\n const latitude = modelsMapLatitude !== undefined ? modelsMapLatitude : 42.2844063;\n const modelsMapLongitude = useStore(Selector.modelsMapLongitude);\n const longitude = modelsMapLongitude !== undefined ? modelsMapLongitude : -71.3488548;\n const address = useStore.getState().modelsMapAddress ?? DEFAULT_ADDRESS;\n const mapWeatherStations = usePrimitiveStore(Selector.modelsMapWeatherStations);\n const showLeaderboard = usePrimitiveStore(Selector.showLeaderboard);\n const latestModelSite = useStore(Selector.latestModelSite);\n const modelSites = useStore(Selector.modelSites);\n const peopleModels = useStore(Selector.peopleModels);\n\n // make an editable copy because models is not mutable\n const peopleModelsRef = useRef>>(peopleModels ? new Map(peopleModels) : new Map());\n const [selectedAuthor, setSelectedAuthor] = useState();\n const [updateFlag, setUpdateFlag] = useState(false);\n const authorModelsRef = useRef>();\n const searchBox = useRef();\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const { Search } = Input;\n\n useEffect(() => {\n peopleModelsRef.current = peopleModels ? new Map(peopleModels) : new Map();\n if (selectedAuthor) {\n authorModelsRef.current = peopleModels.get(selectedAuthor);\n }\n setUpdateFlag(!updateFlag);\n }, [peopleModels, selectedAuthor]);\n\n const selectAuthor = (author: string | undefined) => {\n setSelectedAuthor(author);\n usePrimitiveStore.setState((state) => {\n if (!state.showLeaderboard) state.leaderboardFlag = true;\n if (author) authorModelsRef.current = peopleModelsRef.current.get(author);\n });\n };\n\n const { isLoaded, loadError } = useJsApiLoader({\n id: 'google-map-script',\n googleMapsApiKey: process.env.REACT_APP_MAPS_API_KEY as string,\n libraries: libraries,\n });\n\n const close = () => {\n usePrimitiveStore.setState((state) => {\n state.openModelsMap = false;\n });\n };\n\n const onLoad = (s: google.maps.places.SearchBox) => {\n searchBox.current = s;\n };\n\n // FIXME: Undo doesn't change the value of the input field\n const onPlacesChanged = () => {\n const places = searchBox.current?.getPlaces();\n if (places && places.length > 0) {\n const geometry = places[0].geometry;\n if (geometry && geometry.location) {\n const undoableChangeLocation = {\n name: 'Set Model Map Location',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: geometry.location.lat(),\n oldLongitude: longitude,\n newLongitude: geometry.location.lng(),\n oldAddress: address,\n newAddress: places[0].formatted_address as string,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapLatitude = undoableChangeLocation.oldLatitude;\n state.modelsMapLongitude = undoableChangeLocation.oldLongitude;\n state.modelsMapAddress = undoableChangeLocation.oldAddress;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapLatitude = undoableChangeLocation.newLatitude;\n state.modelsMapLongitude = undoableChangeLocation.newLongitude;\n state.modelsMapAddress = undoableChangeLocation.newAddress;\n });\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n if (geometry.location) {\n state.modelsMapLatitude = geometry.location.lat();\n state.modelsMapLongitude = geometry.location.lng();\n }\n state.modelsMapAddress = places[0].formatted_address as string;\n });\n }\n }\n };\n\n const ifiUser = user.email?.endsWith('@intofuture.org');\n\n const modelSitesCount = useMemo(() => {\n if (!modelSites || !modelSites.size) return 0;\n let count = 0;\n for (const value of modelSites.values()) {\n count += value.size ?? 0;\n }\n return count;\n }, [modelSites]);\n\n return (\n {\n if (e.key === 'Escape') {\n close();\n }\n }}\n >\n {isLoaded && (\n \n \n \n \n \n \n \n )}\n {isLoaded ? (\n \n ) : (\n \n )}\n {loadError && (\n \n
Map cannot be loaded right now, sorry.
\n
\n )}\n <>\n {selectedAuthor && (\n {\n setSelectedAuthor(undefined);\n authorModelsRef.current = undefined;\n }}\n />\n )}\n {showLeaderboard && !selectedAuthor && (\n \n \n {\n if (!peopleModels) return;\n peopleModelsRef.current.clear();\n for (const [k, v] of peopleModels) {\n if (k.toLowerCase().includes(s.toLowerCase())) {\n peopleModelsRef.current.set(k, v);\n }\n }\n setUpdateFlag(!updateFlag);\n }}\n />\n {peopleModelsRef.current.size === 0 ? (\n \n ) : (\n \n \n {[...peopleModelsRef.current.keys()]\n .sort((a, b) => {\n const countA = peopleModelsRef.current.get(a);\n const countB = peopleModelsRef.current.get(b);\n return (countB ? countB.size : 0) - (countA ? countA.size : 0);\n })\n .map((key: string, index: number) => {\n if (index > 50) return null;\n const a = peopleModelsRef.current.get(key);\n if (a?.size === undefined || a?.size === 0) return null;\n return (\n \n \n \n \n );\n })}\n \n
\n }\n color={a?.size > 10 ? 'gold' : a?.size > 5 ? 'lime' : a?.size > 1 ? 'blue' : 'magenta'}\n style={{ cursor: 'pointer', fontSize: '10px', fontWeight: 'bold', width: '130px' }}\n onClick={() => setSelectedAuthor(key)}\n title={key}\n >\n {key.length > 16 ? key.substring(0, 15) + '...' : key}\n \n {a?.size}
\n )}\n
\n \n )}\n \n {\n usePrimitiveStore.setState((state) => {\n if (!state.showLeaderboard) state.leaderboardFlag = true;\n state.showLeaderboard = !state.showLeaderboard;\n });\n }}\n >\n {showLeaderboard ? (\n \n ) : (\n \n )}\n {i18n.t('word.Leaderboard', lang)}\n \n \n {latestModelSite && (\n \n {\n setCommonStore((state) => {\n if (latestModelSite) {\n state.modelsMapLatitude = latestModelSite.latitude;\n state.modelsMapLongitude = latestModelSite.longitude;\n state.modelsMapZoom = 20;\n }\n });\n }}\n >\n {i18n.t('word.Latest', lang) + ': '}\n {latestModelSite.countryCode && (\n \n )}\n {latestModelSite.title + ', by ' + latestModelSite.author}\n \n \n )}\n \n {\n close();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n \n {ifiUser && (\n \n {\n usePrimitiveStore.setState((state) => {\n state.modelsMapWeatherStations = !state.modelsMapWeatherStations;\n });\n }}\n >\n {mapWeatherStations ? (\n \n {i18n.t('mapPanel.WeatherStations', lang)}\n \n ) : (\n {i18n.t('mapPanel.WeatherStations', lang)}\n )}\n \n \n )}\n \n \n );\n};\n\nexport default React.memo(ModelsMapWrapper);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWADQTDJ/w9AAAAltJREFUWIXt1ktoVFccx/HP30xIZoJGgiDJorRZZtPFxWSrK3HhA0vA0oXLUPex62IXQqEWu1FBUSylVRe+qjvRRfFRke581hTbqqkIVq2gm+NiTmGYxJk78YWSA//NPef+v7/7f50bKSVvcy14q/R5AfMCXkZARIxGxJGI2BsRo29EQERUI2Kir6/vIg5juqurq4bDEXEsItZ0rCCl1NYwhC9xE39gsiiKwYb9QXyL+/gNk1hUyncb8Bh+wj1cwFp0tTi/GBtxFnfxHT7oSMD4+HgVG3Aat3EIY2W+pknMapzANI5heUsBRVEM5tBN4Xp/f/9WDHYKnkXIxzk993AJn2Jhw74RbM3gs/gMlZcFzyJkKTbnGrkSEVuwCJ7WarWEyVcNbSHmx0qlknANnlQqlX24il9ziHpfA3QhNuVivtLT0/NDb29vgkdIDXYNf+ELDL0C8IfYkQv6fBPrCfzX9PB/O4M/sQujcwAvz11wBydfwHgsq5htMyFVq9UD+BensKoNtIaJXO13sa2VbzzT5kCzTeFGTk9jK32UW+0GLpf0tR9PYWUuvtsDAwMHSr58AX/j61qttjOH+ZeS7x7MdXYUY43hG1OfWA9b5KzZHnZ3d18sefZcFr0dwzMmYYOQEXyFmxEx1WGKmu0b3MLv2FwUxZIZvBcVVL4TJtRbZxp7OgAfwgP1+2R9y8It2VIrcDyn5+c2Yf5HvXWXlfEdGVBqRcQIPse6DBpSnxXdqGI3vk8p3SntdC7TbXh4uF/95ryk3kGfpJRiLr46isDrWO/uX/G8gPdGwHPDy+8U7lOg5AAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER0qAOBQywAAAilJREFUWIXt1s+LT2EUx/HXM77mh4YZopD8ygJTRlJWioXCiGTBko1YKFbsULJgYafxD1hYYWFhQ0SDRDZKVvwDQvk1HIv7TL70veZ+ry82c+punvuc83nf85x7nsOU/W+LiLYfdOMInmEM+9A1iU9L62oHNqXUSCkdyKINbMBWrMRYSml/SqnR8Qxk0H14iJPob7FnEKfwBIfQXSUDVcR34j7OY26F/f04oTieo+irBYBNuItRLKhRJxMgzzNIdQCsQOAMGnUKNcdZhZt40y7A2gwQeIn97YBgHi7iBtbg6p8AVAZBL47jHrY3rXcEoBQESfGXPFD8AY1f4nUU4FeQzbiFs5hVEu+vAEw8T7F4kpooBWirE5bY04h4Vde5DOBt3YCdAvj2vwH+mU0BlAEM4EMnBFJKhzFc9v6n4SGlNISFWIJj2IFtmFZDeASX8A67fwuQUlqvuEDmKMataYr2eg23Fd1upKLwOlxWXMcHI+JGXm8NkFIaxqIM8C1Dfc0gX/Ee1/EYGzNMK+FBxf2/BRci4lIl4IiQ57g9mIE+xfn3ZoDIUJ/y2gzsxfoc44piVNuDcxHRsu2WZSA1j0sppeU58KDiCALjWfgjevBFUbyLsQvzcRqjETFe+qVVAJo2b1IUYm8W7PEjG9MzwEw8wp2I+FwmXAsgO8xWZGNZXpr4+gG8wLWIqNyy2wZochzCaizF6yzcdo+oDZCd+9ATEeXDZU2AKfsOfE5h6rHXy3UAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWADcvCN3fsAAABFJJREFUWIXtl8uLHFUUxn/n1qufM2nHSTIZMhlHYxJDFAk+iEFQV7pRsxD8L8SNIi7Eta6CC4WASxdBJLiajUZX0UjA6LiY0UDUiTOZOGO/u7qqjouq6q4uG9IqOpscKGhO3fud757z3VOnRVXZTTO7Gv0OAcAe5xSRIpCKQwEfsAAn4w9UNUBEAEm3AopqNCkByYpQRA4AzwJ7gSyI1IAWRMUkmAMFbBM6lmUbjGUbcIwt/SCIfuv1rvdgCyhniEXAV6q6NpaAiBRL8GoHTit8ntk0DTwv8L3C10nWdMpx5npB8IJly7VyobwKUPQ8bTabJjTm4Xq73U1w3ATniMBNhTdVdXPAQFVJSCyU4BPgTOpL/AcrIudseDLrT96dBZ7L+6vwSlF4N7d2zoFlcjgDEdZgWqEAfJsr01JT1QqgN5I6EXfWdWvTrnskX9cGbPhKWUQKmYPeiOAXDx4QESv1Dwi04B7LdevAtRxe2YawBu2cXx3LCm1L94hI/jbVgRJwIOsM4RsDjwIzIwRExC7Csabvr6lqmAOrukJ3G34dia7aX+90VrY7/R39q+p/NjHhmZz/I7foVoC7U0d6DZ0WPAgsisg7mQ0R8FBbucuCt22RrgE8y6JaqVSBExZYc9XKiSjSzla7fSOCFrAYwinAE5GrxFcYwP+j4x+vwFFgJUugmLD6GNhgWJqmC4t9kBCuAL0QpB+G4vndex3hWKD0I7gVqvol27acIPDqUHdAAzgUxJry0oMCP4bwmIh8qqp+SuBQCB3grKr62ZyJyP0GrEj1XM5fqkFnG3Sz2XoPCJIDCYALJoQQeD+TAYAvCvB6B6aALZPQOq6wPia4KcB+F7q5WqKqbQWpOs480FLVrqo2VbWhqo0erANlVW2nPlVtcPLkpWZMbIk01Sau/5V8kCWo9qHQhZ38O4Ap29iOMfuS1Oat7sCMiOwfIX75cr8P35Xh9IBAUXgEuJRH+AlqVVtqZkwGAK4H0ervvV6D4fdhYBFsWFAsxRnK27ImBGyArnIYWBCRPQyF6QOLO4ECzIvIKeJGRRJQgIMuTPnwjIh0GNa6a+CoA3vr/f5TIuISCx1irdTCuB/E3wIR2QLOZ4DJBBoRV5K19HfaM7Iiy+5N8fKYAC+q6mzap9cyG/6vZ0VVB+m+SnxdwoSt2rZtXIPnWOJYnqcGg6hKp9HYbEfciuJrKwlYOitMYhFxX3gLhiU4DJxJgFKGds1htuIVqpFIGEaKRhFhEHYkCP0t5XEV0y05dkV9/2YEP0SAAQnik8j4+IPP/KqqfjAykPwdE5E3iNvuAnBRVS/8E5yxI9mYYPPA08A+YlFawBPAh8Rle0lE7iM+mSEuz0VVXbkteH6YGPcALwMXmFxg54HXJsGedCp2gMqEa0nWerddxYQlAL4kbiTLQJ/h3U4PkJ0hDHGZPpsEeGIRSjx+e4xvKnnF+2MGm39H4L+yXf9ndIfAn9qmRhuMvarQAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobEDoWDDpSWAAAASVJREFUWIXtV9FOxCAQnIF+gIn+/xdq4ruW8UGIW1woePHQpJM0Rxd6M9ll6JaSsBJhKftfEEAAQVICAJJ3qYckZr6wPANbI/6AnJ18/wLgafK/nwE85nECIACvowLeM3mqYrMozyhf37A1JvZMThN7+wUBamVgz79WwK0ZcLHJP4n2ityKmsHeI5ckWv572xBobEK7oAeSGl1b1tex5efAJWC5AHcTzrjhVucMuWB2t7eeuVxwCfDwP98FJMt8AhBL+IwXzhu11Q+ckVuyUN3bcTejJDklwJBbEdGJ1ei2ZD+BbVhjHgcz55F7AuYyYAjqDAQnPiJgrQtIxuXnwKEEg/Yr9a+vOv3EV9pLCSKO3fWxKT2D44K69j0XAJ/nRvlKSgD0AUTKeVB6tWYNAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQoxmfjAWgAAAT5JREFUWIXllzFLxEAQhb8nB8KJ2ggqNic2V1tZWIggCFr4E/0JltdobaPVCf4Caz1zhVg8mwTES9g9dkly+KqQzMx7mZnd2ZVtusRap+zAoHqQ1GoqbAt6kIHOBQwa3m/bnoWcJd0A2L6LIasrc20GYshLnADXkba1aMpALCbAKCVAb3tgAZJ2gUPg0/ZLqwIkjUvyb6DIRQ7LlWADeLU9zSkgtgQHwMR21r+PFmD7PjdxhX6ugnKHOweeA/5jYEdSiOcYeIgWUGIOvAcCF8Awwm7e9EHVgeT3Pl2NyhAknQEj27eR9gscnfdAdgGShpIuJB1JWm9VgKQ94AqYAfu2v0I+qdPwLzaBD6CInRe5BWwBU9tvsQ5ZBdh+WtZn5VfBJXCaEiC1BI+J/o2zYKlLSsQsaMTK90Ay9O9vxz/oeVnzXXquagAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQkWF98m8gAAARlJREFUWIXtl80SwiAMhDeVq+PFF+c9PTjjtTVeQNOUlgT7c+nOdDJFQj63QCkxM7KIiAC8sZGYmXRbp4pPOmytThXfHSCoew1wxc8lDxyL62UFKDlwAfB0FNa61TqEZP+c8m93+B14QMyxWQDDQDJ6AEx5gZk5ucCFhCHFXrRZnMjj9Iu9MHVAA/QqejXUOgQASC6UAEoOrA8gILS9g4rbAQiIUVOKrdtzfRIuZicgli8Mo3Le8io3rNOtVdsHXCIit1OrOxBjRIzxOACvSM8vaWNamVw6SBQHU48g58t7nbPqHJAFrPPh8EdwApwAJ8DhAKaNqOUlsxpA3t0qx3fZ3wU7AtBFWv65kfOr0cdpy8nnX+mP0931AThFaqpKQ14AAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQYhKPqfMgAAAytJREFUWIXd112IVVUUB/DfHitkkm57PDOOWdP0oBmFD41QCUkEvQSVaQVBzEP50JP10AcaQVlBiTBQ+FJQvQgZaNGHUlbTx6SNZn70pRZ9EPQ0zBRhNCDsHs65w+1253TuTCK4YcPl7rXW/7/X+a+1zgkpJadzdZxW9DOKQAhhTQhhSduOKaVZbVyHj3ACX+NJzK3sPwvgxb3d3a/ieE/3/ISVWIht+AqDp4QAOrEpxngEa/ESHm+yuR578CGu+d8I4G6M4lmswP3dWVfCfViGs5rs1+JbvIwLWsUMVfpACGEFHpaL9n30Yzkux9uYLH7PwS/YH2P8ZHx8fKTw35Bl2eqxsbFtKaXNmAItJRBC6MEjuAE/4y+ch/ewBVtjjM80AC3F1UV2lmJejPFXjExMTJzE7ThZPLJ30foRFDddF2P87cJFC5Nc3a/gDnQUNnNwaLrUFjaLcAs2YQeGF/RkaX7X+amId1krpxtxNMuNfscQrmxhtwz7ZiDgS7Cx0M5rjYdX1Gq13cXBD3JhZSXBBvF6mwQ68BCOYT3mQlar1Z7GBD7FqpRSqBBsCE+1AX4XDmN7jI6gs66/zb0LsoQ1bd5mF26rYHcVhrG3UH+Sd87+OoFOPIDvsFGFNloI8AAWl9j04kUcbQCu7z24OKWkI6X0Z1Gbk0UJjYYQBpWvfgT82OIshBDW42P8gUtb2HSoD8IGdR5oYjhsmjaKW/FOi/9X4yDebHHr+n60IN6VUvoHgUNNhveapo3iCTzXVJI7syz7vAQ44YsY41tYMuVbQqC+h+T62FCvDmzHTZgn74jH8WAJ8M4iwzf/K2sVCNT3G9iHVfIpt6WYiM+X+EyRm1asBYFzKxBI+KkIOCkvwzLbY3gBPaUVVRA4Rz7F/ovA/go2o/JhtbxSP2kQ0rX4rFar7S4JfrjkbAe+xJ1tNbQWpbSuIX3NINM9pu/x2MDAwNntgLckkFLS19cXGwRUloFvYoxbcVG7wKUEmup7V6H+JB9WCR9gBCtnClyJQFPnO9jT3ZWKrNwzW+D6rvROCCGEDvmr2UhK6UQlpypxqxI4VevM+Tac6fobdX01Hh9CX7YAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQMlUuCvbgAAAxBJREFUWIXN10tonFUUB/DfF6KmPjredCIm6hSnRUix+MhOxI0oqMXGlbrwgdD4oOCrGx8gIi4EoVSFooggSsGiTUHFUBFtm7a0xRYtmtZWFxFEFBx0Ud3IdfHdiR/TmclkJhgvnMXcuef8//c875fFGC3l6ltS9P8Dgf7FMpRl2d0YxB+IOB1j3DGvYoyxJ8HtOIRJvIa/yitCxCm8h/62+j0ArwkhfISDuBFX4wPsxDXy8L6LY7h00QhgObZgBg9Vq9VKuvk32NDk/NP4GTf0TACPJOAtuAwbcRwv4/w2euvxKx7sikBy8QF8XK2GtbgpxX0nrujQxih+wKsdE6hUStWLh4a24wjWJSM7EvgtXYTvAuzGLixrSQADeB6HsQmX4IXk/se6TdyC/VewH6uytFGs53E8jtMhhN21Wm0lxrEHD8cYf5uvtOdbWZYtw0/4pK+weVWWZVMjwxdNlkqltTi7VquNyctsO2Z7Bc+yrD/LsmfxvTyRN0AZm1Pz+Ftey/dgpOCyy+XuP6cHt9+Jo6VS6VOcKOzbN1QejLh/YmLirDYGpkMIt3UBfG0CPSxv0RFfYjDGSKVSquItfIH1bQw9hW0LAC6Xy+XX8V0BuC5fzRGoH8ZsiveuyvDwWBODK1MYBjoAfzIBb20CHuXteUWRwJrkpvqBE3gDQw2G92C8DfC65N6pFsB1mcV5RQKjmG44tDXdYlMB4Am83wR4FB8m17YDPiRvQlfO6dYNhGBvC6WpdKtb5Q3qKM5NesuxGSfxTBvgyRDC17jrDPIdEKjLEbwpn3p34F75IHp7Hr2TeG5sbKxphc3lAD6fx1DE7/gFfzbkTDOZkb8HWr4FigRWy2f2fAQ+6+DMdAhhbwjh+o7KNRHow6PyZ1Q74/vb/LcN3+KBBTWqhmweSTGdaQGyr8X+KbxUT86uCRSIXCef2403PtDw+5h8dqxeKHBbAgUi96Wsf8e/JRlTAh7Ezd0Cd0QgkRjAi/hRPi2PY2OvwB0TKBBZVRkensCFiwUeY3TGi+i/Xkv+bbjkBP4BGjWpnBddssUAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQMUAz6vVAAAA6FJREFUWIXF11uIlVUUB/DfV2ppytcevxm1wQknshyYhzzRS0USmCEVXZiSii5QUT4kpBQE2kWCQKGwfMikAiWxh0KsNDLSbiaZZqFpoz0MSQ8ph+ohssvu4ewjx/GcOWfGgRZ8D3ux1/r/93+tffmyGKP/08aMdsIsy87HWPwaYzzRdP5oKZBl2Xgsxa34A7/jL5yLHTHGJ+vFnTVK4PdhD2ZiHkp4DVeEEP7FvCzLVtcNjjGO+MOV+AS7MCf5JuN17MO9yXcO+vM8f/60HCME7sQ69IcQHqnxL8OPeBGTBsW04Wie50+MmIBK01ZBVmFMjFFn59Q+fIfNmDVE/HQcrSozLAK4I4G8h4tjjEIIvfgo1f+GFvNc19E+OeKylghgNrZhL+Yn33l4FYexeBjqPVUUxW58jZVDEkA71iS5l9T4FyfgNSiGqd5mzMDlRVHsbkgAS/I8P4K1mJh887E3z/MPMbsV4K6uaaWk3iklwgQcQMdg4GuxIzHtSb6LQgjvphXc3uKK25uVCFtxY3UwERumdBQx7eFLcQGeTUmWVTu+BfAlOFwUxStDlQiPY2V18LTK0bkO72AnBnC8VOrOWwS+KTXqtlZKhGswUB38jLcRB33fNOty9IygRA+EEL7FcuhJ0m+oQyDiFywcnKS7uzvHqtSsS/v6+s5uAXg+vmwv2iIeTj4vpYNhfQMCEb+FEO6sSbQQP6SSdbYAfAk2YX/Ktx4LYozGYPqfJ/7e1tXVOW5g4KgGNqlcLr+Q7voFIYSsXC7fH2P8vFEAZFk2UaWRb1bZ/1X7B+OhyvA2bBlCgYg4dUoR8WArdZ42rXgIh/BmnVwHcPfJgwj34P1mBFQeGjOayD1HZRd90SDHIazp7g75sAl0tLdFLGoAfCE2JoB68TvxGa6ujRveiygSQphb68qybFyWZcvxMX5SeRXV2luJ1NoY41Uxxk9PzZkUSHu5WQmO43DNqu9S6exNdeY+p3KRrSiVShMalaz6Kh5bLpdDCxocRMyy7DHMLYqi/dixYz3oGTTve8zCvBhj/5AZ00pmpZNp41AKpJvwGZXDqd6c7fgqATfdKSebMMaoVDIBK5JsjUjsaeB/A/14tFXg0wjU1HWmyoW0vw7QvjqqHMHLXV1dYbjgdQnUELk+ybm9BnDXIDJbQwi9IwFuSqCGyKLUVFtSeT5QuXZvORPglgnEGPX29gasxsH0rs9GAzzGOHr/hiO1Ufk3PBP7DxjivGJEQcD3AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQQBIaLdeAAAAwhJREFUWIXF10tonFUUB/DfrdQXhI8bJ9pRHHTQGhQpcUCjhIKVCMWFC1sURMG6sAtdVJeCioiUIq1SF9qNzyKKtaK1vqoWQ7UVFUOVam3ioiLYgqGCSN1cF3NHQjLJPCUXDgxn7rn//znnnnPPF1JKlnItW1L0/5tACGEghLAmhHDZgnv6mYIQwkpciytxHcZwGidwTUrpz3lGKaWeBevwJfbjNRy/4PxSwg4M4Sl82NS2R+ARfIQDWI3xGOMe7K5UyrU5ew9jU18I4Dw8hyO4p1qtVkql0vMZZEMzm0qlUsWpGOPVPRHAg/gJW3AhNuEottRqtXNb2G7AsfXr15/RMYEY4y2lUulr7MYw1uIbvIXLO3BgF15om0AGeyeDj+OqnOevcHMXETwHv2LdogQwgG053PfjImzFj3igx8s7ipMxxqJpIwohbMweLsdN5XLpH3yCMzGaUtrezK7dlVI6iB0zMzMfzGV2Pd7PeR3BDTiIvXNvb48RuDM7uL2hKKs3jb9ijHuKoticPf4Fa/sIvAYHhkqDCbdmnUdwejAWCd/jlay7Fz9jsA/Al64YGnoDP+Au9Y55RYPAM3ganyHNkYcw2QPw2XiyKIqpHNXGuZ9j5L8qwKqiKD5uQiBhH7Z2AX539vjNJmfOI7A657wZgYSTGO+gxPbj0CLnHS6X629FuwQSTlSr1WIR4DJeUu8bi52zV/3xGkwpdTSQ7Jyenn55rjKEsCyE8DAmcAorF7B/FlOYSCmNpZT+QEcRSLl8Ns7y+jZM4r0WtkfxIlbMi1wnBPAbfsfteBfftth/SP0+jC6YulkN4tM2CDT2HG+xb5dc8y0vbSYwnL1rRWBysf+LothcFMUUnsBZbVXNrHyuwr787HZD4AhexyUd9Ysm5XSH+mj1djsEYowT6gPpjV11y2bKWq22HI/hmPpE2wD8btbvV9Vr/r5uW/WCBGZF4+IY484ckUfVR7DHc1ltw0Av4C0JNCTGOIYv8HdOzXCvwB0RaEilUqn2C7ghff0062Yt+dfxv1vGFje17OpaAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFBk6Z52WNQAABWNJREFUWIW1l31IG2ccx5+c5/WSe/Jc7vLSnNE79WxMGguCUep0otGM+dZNFKa0oER0TWVQxt4obAtjwkq6QVs2EGX/DWbf1iFrOzoQBvpXRwtrKayKTNFtrHS+JBiN3m//zOI0iYltf/D883x/v+f7eZ57nnvustA+oqWlJY/juGMrKys98Xi8KTc391VVVaXu7u5/JiYmlvYzZloRDAYLZFm+xnEcCIIAoiiuqqq6LAhCzGw2gyAIkJ+f//358+fdz928paWlhhCy8p/J552dnWUAoAcAWtM0QzAY9Lrd7gs8z4PFYolVVlb6npt5e3t7GSFkjWXZ33p6erypcjs7O4+IojjDcRzslZtWAABlt9sfmkymWENDQ146NeFwWOZ5fkmW5UeaprHPBFBRUdHJMAxUVVX1Z1JXW1sbIIRATU1N1zMBWK3WnwRBWAQAOpM6TdNYQRAeOxyO8VR5VCqxr6+PXlpa8hqNxh91Ot1GJgAURcV4nh+PRCIVo6OjSR9DSgCWZU0URRlVVX2SiflWLC4u3tHr9QaMcdK9kxLg4sWLjxFCm9FoVLcfALPZLK6trWnLy8urGRe3t7dXezyeqzRNQ3Fx8c/7AZBleVwQhPmMigCAUlX1S4wxWCwWUBTlu9bW1r5k+fX19V1dXV1VO/sHBwdtHMcBxni1vLz8/cnJSSEtgKKioisMw8Dhw4dHRkZG5GR5Q0NDeQ6H49tkR21gYEDKz8+/YLFYHvA8Dzab7c/GxsaXUpofPXr0HY7jwOPxhFLldXR01DkcjoXs7GxwOp3fAEDSPQIAqLW19RjGeA5jvHr8+PHEb8fR0VFBFMWoJEmTqcyHhobMdrv9CUIIbDbbdLrvh0AgIBkMhseSJE0BwO7NX11d3aHX68HlcjWkGigYDB7BGANCCIqKiq6lY74VpaWlXXq9Hjwezyu7REVRPjOZTBAOh617DYQxfogQApPJ9Pv22bS1tb1eUlJyye/3f5Co7u7duzzP82uKogwn0sOSJIGmaf/brc3NzeV2u/0Lr9cbdrlc/lOnTlWYzeZphBBQFAWqqt4qLi7+2Gq13mFZFjiOg4aGhreTwVMUNe3xeCZ2CYWFhR+xLAter/fg9n6fz/eJXq8HhBDQNA2EEKAoChBCT5tOpwOEEBiNRvD5fG8mM0cIIYZh/sjLy7u6S/D7/S8bDAZwuVy92/vHx8e5ysrKECHkr+2mOxshJN7R0fFGKvPTp0+XEULA4XC8tUsEANpkMj0SRXE+0R3e29trU1X1q63V2Nlyc3NvpTJHCCFVVccNBsNaW1ubPWFCU1PTMYwxyLJ8JdnxcjqdJ7OysnYBsCx74dy5c7nXr1/HiSYniuKnDMOA2+1+NyVlWVnZexhjyMnJ+bWxsbF5cnLy6WoMDw/bzpw5k0PT9NJOALPZPBYIBF6z2WzzpaWlH544caKutra2oqSkZEBRlCmDwQAFBQVf7bVKCCGE/H5/gBDyN8/zwLLsiqIojwghU7Isz/b397cxDLOWAGD65s2bTlmW7xmNxq2vZjAajZCTk7NQV1d3MpFXwmW+ffv212fPnr1048aN7rm5uZqFhQU7IQQxDPPD/Pw8RggxO2vi8bgyNjYWm52dLfX5fO6ZmRm3JEm0JElzly9f/oWiqPW0Zr9XFBYWDm4du+0tOzsbvF5vfabjpfwgSRTRaPQQAOzq39zcRLFYLOMfkowAAABFo9HiRJqmaWhjY8PzQgFCodBBnU53KJm+urpa9EIB7t+/X6hpmj6ZHolE8hJetc8LIBKJOOPxeFJ9fX1dCYVCe96m2yMrQ4Dg8vJyqv89+sCBAw+mpqbupTvmv5uD6p7Um9wSAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFCUJq76O3AAAA0VJREFUWIWt1ltoHVUUBuBvmtZgqx4iREyNaZmgIkUtjjcERTHqQxBESaHpgyg6SoWCvotiwRdBQauoVaRCEY76YMEb1qg0Fqs51lhbW6UFLyB9KCoU8cG6fZiJDumZS05zYHFm9l7rX//MXutfE4UQ9PqLomgjToQQXuwZo0cCK6Ioegt/YTmOhRAmsWCwJb1kj6LoNdmT3x5CuAWrR0dHn+gFSwhhQYYrsa+41m63z8VRXLhgvIaOEVbiPHyE+7oQexzbcp+hEMKSRSHQbrdPj+N4Fz7BThzHDlxbSL4+3zua/0/jlUUhgHXYPTExcZqsZoZHR0dTfIGX8AZ2J0ly7+Tk5EDucxa+KpI8FQKv4+4u66viOA5JkmwviXsKj9ThN+mCfhzpsr55YGBg28zMzIaSuEO4rA58aQMCJxAVF6IoWovLO53OpRVxfydJcmYdeJM3sALnz1t7GDtCCP9UxF3c6XQOLAaB93BH4X4pLsE7NXFr8X4tel2RxHHcwqEkSUZCCJIkaeFTLK8o3JtkYrVsUYQIG/F9Lkh9cRx/g+ES37PxK+5cFB2Ys8HBwTZ2TkxMnCFTw1u7tSaOJEnyfFPcxgTyBC8MDQ3N4Gs8jShN02W4Ir//DpsWghmFEERR9GjO/hh2YSqEcLxbzURRdDUeyJP+6f9W/gGPhRAOlsQN40ZcL2vr2RDCs3KA/bJZHmQ6/6VMyVaXMU/TdHkhpnTw4AJsxZ6Cf+jv7/8t39eHTnEzt1dHRkYO48EK8JA1Uun+5rwg52MHvP1fDeCDEqeQM38zTdOTWqqMQJqmQ5hqtVofVuA+WSRwDz6rcN6Sn/E5dQRwDQ5WYM3ZzUUCK/BtTcAz+KVIYj4BrJF9E9Qlnz6pDfGQTOGqAp/Dx90IYGWr1TrcIHnAbd10oE/W33XBU9jahcDnDZPvLRUi3ICfG4Ds70JgT4O4P8bHx+NKJZSJzE8NwNaUXJfZEaxrJMXYEsfxjzWAsyXX3Wwf1i9oFmBLLkRNzrXKDmBDaZ6qQYG74jj+vdfk+QNUjuUmE/Aq7JV9ATVNPot3saoWv86h+Dbkk7Ii8bRskHU971MiUCByHTbh5bnEY2Nj23E/Lloo3r/a0/48nkGnegAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goTEAwh+C9OzQAAAjFJREFUWIW917uLVUkQwOGvro+Z8YWMiijoKOwuDBqqmBkIJiKmCj4wMjA10P/ARFhkg40WMzERRNhkzYwUBRF2BVF2faGOjI9h3BVfZdBH5qpzZ+2Ddwqae7qqT51fd1dX143M1EYiYhRHsBQ/Z+bVVo4ys7phAGeRTTuP4Ta+Oq2o2YBbXf2L2NXGUVuANXjc1T+FH2cTYBS/fKGbOysAEdHBT9OY1kRENUSbFdiBh9Pof8eZiBiu8tbiBJwwFf1ftsM42u9TMDiD7VesrnFWBRARQ4j/GVYVB7VBsxKve9iO4TnWRsRQZv7XD4Al6OV4M/7FGBbPMO4zqY2BzgzvDGK8+fhkjcMaWajMcjrZqVxMlzOz15ivpHYLVuB+D9txDGbmbzUOawGGsL2HbWNm7qv0V70Fz3Coh+1B7cfbAIxE9EwDA7MBcCkzP+BA0z/dZYuYge67AGTmTezFD41qN/Z/AsC8vgI0cgGLmufrpgqRD1psQzVAk2I/zfRGF8A7JQn1F6CRf5rf27jXPD9ReRPSsoxSjuNejOAcXuEvbEVVed52BcaUwnR+Zl5RZv7SVHD2HeAuFqATEXOUsnwTXtSWZG0BniiBOEe5H/5QaoX3WDcbAOPNu8PoZOYE3iqnYFXfAbJUpwPKrCca9Z/YoqxKfwEiYo9Smk1iWaO+gTem/8/w/QAiYhtOKkv9FC8a04SSE9ZHxDdnxDZ54BoO4u/MvNOlf6TUgcuVtPxN8hEQKBHAR+nvnAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gIBAAwD+wl4jAAAAs9JREFUWIXFlz1oFFEQx39vd8/Lqudyhoty8QgshOSuyHqaGMNCDmMaQcTGUoiFhY02dn4U2lloJQTBRrCwMyIoghaKkELwAwmChYUKFoIBJfErGYt9F4/19nY3F3MDU+27+f1n5r1575SI0EkzOkoHrLUMppQyAA/YD0wA20Rk938VoJQa1LC65xs+LymlbBFZjAwgIqkcKAFTwA3gAyAxPtkyXgJgATgCTANvEwDDfj2VACAHHAQuAy9WAQz7IlDUVSu3FACcAX6vAXTFe3t7pVqtLup2HQdUIzO8CfcAZuSGSWG2bVOpVDAMg7m5uS7gNfD5n4WhCjxpN2OllPT19UmtVpNSqSRKqfq3X8A5gtmjolrwoB14LpeTkZERqVarYtt2szXfgQOtBFxbDdgwDHFdV2q1mhSLxbj1S8AFoKuZgKm0cMdxZGxsTIaGhiSTyaT57e1mArYCC0kCmKYpAwMD4vu+FAqFtFW7BeSi5kBsG7q7u8X3fSmXy2JZVhrwT+Bk5B7QArYDX5sFsCxLKpWK+L4v+Xw+bdbvgb2E5kDU+D0WDtDT0yPj4+PS398vhmGkhd8jGOkqqQAFPAMkm82K53kyOjoqjuOkBS8RnH2T0Plv1QKl/Skw63meuK7bOFCS+idgMgocJ8AAZnTPbqYEC/CY4NpuCV8RoJXmGrI3gTsEd8Nm4KIuZxL4JWBDHDgs4CPwDtgXIWALcJ7gGEWBvwCH61knFVB/lO4EXgIPgSuAzV/zdDsmgEPAVV2NRnsODAMzIrIs2khiof4fBeaBN8AscB94pcGbgI1a3DBwV2c+DXQlzTjJJtxBcCsuA490+bPaNwAZgsesQbDRVgVOcgpOAN90a3ZpqEXDmW4XHjeIFOASPFJ+AGe1gLahsQJCQkzgNMFjYhYYXDcBITGDBON5ATi17gK0CItgts8DzloIUDpwx6zj/47/AFtaIekeNV/aAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUARIGCVc1hwAABJBJREFUWIXFl12IG1UUx//n3kzcTbe72Q2FDVZyJ8lSilosUn1QKxV9KOqDfRE/wAe1H1SUQqVULCgU9UVUUPxo/QCxglpRXwRFsYXWIlppEdt1JzNJdjfWqrXbmm2SmXuPDzZLus0k01TphUDm3v85/1/ux5kbYmZcyiYuqTuA2MUmsG17iZRyKQCjta55nvfFhcRTr0uQy+VuAHAHEZEx5gciqgBYw8xHXNfd+b8BpNPpRYlE4in8+4tfKRaLR1vHx8bGuNFoXFsqlQ5GyddxCZRSy+Px+I21Wm13uVyuKKVWJRKJdcy823XdD8PiLMt6EsCaKAChM5DNZpcJITZJKb/TWiut9S4iWl+v15+Znp6eDAFWlmV5AOA4Th8z17sBdDoFVzPzsfHx8VcBDBhjTrmuuyHMHACEEOub30dHR0e7mQMdZiCZTA6nUqlHhBCLADzIzAeYeS8R/cnMbhAEP5ZKpV+b+lQqNTgyMjLTfK5Wq5lKpVLuBhC6B06ePPlXLpf7PAiC34UQwwCuZOaDWuvT8Xh8ie/7xwHMAQwNDT3dGm+MiVRjQmfAtu2VUsoNhULhAaXUOiHEFIC7gyDYWiqVvFZtJpO5JR6Pf9Xa5zjOAmae7QbQljKZTA4LITbXarXHmbkhhPgbQCMIgq2xWOy1bDa7oqlVSqn55saYj6KYhwKMjIxsYeZ3p6ampgAgCILDxpirSqWSZ4x5FEAfABCR1dz189r7UcyBNkuglFrelxjYcPTnn9bOiYj6lFIZz/PGW/qsXC73KRGtnp/UcRyLmYMoAOdtwlgstqZR819u7WPmGoD55p+0M/d9f3VU8/MAlFJKSpl03fHDYQFKKZXP59tNexMudKxdO2cPENESZj4UJs5ms3eGrDkAoF6vrxBCbLwYgMUAfpsvymQy6Vwu94aU8rOwRL7vLy2Xy98DaNi2fXNPAMaY/US0Kp1OLyKiftu2r8/n88/F4/GKEOLhkBzfAECj0fgDALTWb0op7+0JoFgsHmHmfQMDA8fz+fxsLBY7QERbwoKZea3jOLcaY/ZalrWwmcMYM2Pb9soLBgAA13V312q1xQCe7WC83XGcfsdxdjCzBtBPRHPn2RjzthDi/p4AAGBycnJ6YmLiiYmJCapWqwuaHzOkksaY9wqFwvazRxNEFANwTjEpFotHAMxE2Qtd74SVSmWupNq2vVkIsS/Ke94Ys5OINgHY00kX+VacWbZsWEp5m+u670TRe543TkSnu81CZIDLAjwGiG+Z+UzUGK31W1LKey4aYHBwMOUH+rqCfc0LUc2BuVNlOp2ISADpy6/YCH92D3/5wUx39bnNGPO6lPK+ngGUUqOsg1XBiRM7LtQcADzPO8TMp7LZ7E09AZCUDwWBv3NyZuZEu/Gzbz6ttT4VlkNr/TwR3dU2f+t9gIiEbdu3CyESWmsQkUVW/zYNepEa1bYAQggJ4CUA240xx0I0PoBtAD42xvwCAFJKVKvVr+cDSNu210spFxpjwMxERGeMMTEhRKeaMQugHwCFCc7Wjr5mxRRCoFqt7ur5v+F/1f4BnoQqMI+v2mkAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER8TbdO6QQAAAfZJREFUWIXt1k+ITWEYx/HPmaGxkIgaFmOhGyUmipomUSxnYSMb+bNkZcUOM5JITRaUiMyWMlnY2NgoMorF+LMYFpSFiJjGn6Z5LM69da5778y5f2YszK+eOp33Oe/313Pe531f5vWPlZQeImJ2AElSQH+KiP2Z9+WJEdHSQAE3MYkoRk9mfHYM1ACX4hmSWTGAHgzXAGfjQEsNYDWu5ACX4gMWN20gA/6dE5yNsw0bwCpcxK8GwKW4V7eBDPhHE+CP6KtrDbQIPIWHOJ27DbEC5zDeBPg7TmAvJjCSy4B0h3zXBHgSl7ES+zCGS+iqpwKHG4QPYx224QnuoFBl/hkNtONlHeDHRega3MZT7JhmbU1voJh0PQd4DHuwDBfwFgfRNkNXgbZKK2V6j0c1xj7jKLrRKd3nx7EhIoYiYmqGuXMZgFvS1VzST2l3FPAGI9iC3ogYiIiJPOBqWlqlTP04hGPSXh5CFzbiPh5gc4NnSIU+4QaWVDHQJv3HnbiKV9jd6AFWaw30Yj1GkyTZ+Ze5DhyRttULdEfE3fqLXKmyK1mSJO04jlO4hm9Yjl3SA2QgIr60BDzdlUz6j5/jq7Sf1zZT7ob2ASzEGemxex4dc2ogk7gVrzGKTXNuoJi8CIPFapzEgjk1kPlou3Sr7Wu5gXn9t/oDDAKDtnkUp4wAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUASQD8CFQfQAAA7ZJREFUWIXVl01oHGUcxp/nnZ01pmm2YePiR5MMM3MpRWyVCjZVexAjVQ+2vQQ8KH6AFtHgQfCjnioUrehFRTyoWPGgEaqIKPXQFi2lkCrW0mZ2N67ko9USwSSrOzvv48GkpDHZbL5a+hzn/+f/+83Ly/vOUBIuZ8xlpV+RAp7n3RaG4WaSVy2HAOvdAyQbwzB8B8B6SWMkV0k6I6mvWq0eLJVKJyTZFRHwff/WVCq131r7I8kd02uS3iW5GYAAnJB0yFp7qFAonFkWgTAMnzfGPCFpbT0DJfWS9CRVAZyy1n4r6UixWPx1QQK5XO7aTCbzsSRD8s564LPI7CXZCSAH4Jy19ijJwxMTE98PDQ39MadAEATbjTFvSPqA5IuLgc8Wa+0+kjeSvN4Y01+pVPZeJEDSCcPwLQBdADqWCzxHdltruy8IeJ63IZVK7QdwauZGW4lI6pe0m5Lg+/6TqVTqZUm5lQZPpmytfTafz7+dCoLgVcdxbrmE8D+TJHmqUCh8BPx3Em6TdORSkCX9Za3dMQUHAFOtVu83xvgATgL4ZCXA1to9kobjON6az+e/m167sAnb2trChoaGh0g+ICkGcNMywfeRfLBcLm8aHBz8bWb9f+cAybTv+/cZYx4BsBbAUQCPLwYu6X0A68fHx+8dHh7+fbaemkex53nrXNd9FMBdAIYA3LMA+OcA2vL5fKekylx9dV1Gk6uyc3JVPEkHSD5TA35cUqFQKHTPd0PWfR1PpaOj47p0Or2L5GOSDgLongH/CcAvURR1zz5hEQKtra2rm5ubu4wxnSRvIHl1kiStxphW13XDOI7PWWsPGGO2SvoyiqKeel+opkAul2vKZDKvkNwiaVTSz5L6kiQ56zjOwyQdAB9KajHGdALYCOAfSV9FUbRnSQLt7e1BOp3+BsDXlUrl9VKplJ9eD4LgC5Jroii6ffpzz/M2uq77kqTc2NhY18jIyHgtgTm/CV3XfVNSbxRFu2bCAYBkAcBJkhfNGBgY6Ovv798uabSxsfG5WnAASNWoXQPg07mKURQ9XWuwpCGS2UULVKvVHtd1PwvDMBVF0XvzDZpKNpttbmlpecEYc3e5XL5jvv6am9D3/U2O47wGoAHAMUmHkyQ5HcfxecdxEgCI49hNp9NZx3HWkdxG8mYAxycmJnoGBwfPL0lgKkEQbCG5E8AGSatJupLWAADJs5NtwwB+SJKkt1gsnp536EIEZiabzTY3NTWtAoBSqTQq6e8FD1mKwHLmyvs3XO78C2h74kwpj5OrAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsBFjkGPOnzBgAAA+hJREFUWIWtll1oHFUYhp/VzZrsJhs3ZDc/m2yWyQ8lP93Ek5BWNz9oWmJKvDBMBEHTi7oSRVsRQi4KXgm5qESwCImBgqjIBEFQkYJpQRRFF4R64UVxFO1VbhYiCRIpnxc5W4ZNdnamzYEDs+d8837PvOc7Zw8igteulBoFLgNSpl9eXFxUfjS9BcGIUup6MZFS6k2gCYiICD09PSPxePw1J0xVVdXQcQAEgCcdwu0l88Hx8fGrwBzwqIYdc8SPVAJ4CJcWDAafBbaARREJiMjfzvnl5eVIU1PTTHNz85VUKnWno6PjZ9M0q0UkpkN+Gh4eHnXLUZbMNM3TkUhkG3jFg5UB4FR/f//nk5OTkslkPtFuCCCmaSZ9LQFQDUg0Gv3GT0Fp8HPT09OilPqgqFNfX3/VL8AQIAsLC74q2gHxTCKR+Bc4kcvlLmgnjnThSIG6urr3lFJf3k9yx0cMA00iEtQ7Z8ETgGVZtZp45kEASmAu1dbWXj9qLlhalEtLS50A6XQ6u76+HnKtYI8tkUi07u3txQOBQJ2I/OO6C4B+yp90D9Tz+fxjpfkCOum9Nj8/P7i5ufmLUupioVC4WRy3bfuWYRgnnbG2bd8CcI7bti3Ar4ZhnCwUCsRiMWzbPgtc4eAgu+PqgGVZSU085XDlzEHoIbek3Hgqlbr3vmEYzwNf+dkFW9Fo9F2H4AWvAGtra516/AVnXF9fn3eA3t7etwCxLCuuBWa1aEclAOBxDk6/Xv07AUg2m53yDDA1NVWvRd7RX1UFSEtLy6VKAG1tbdecY/pEPOSeK4CIUFNT8wYHB8gJEaGhoeGjSCTyrRsAUJ1MJm3goohgmuYZrZH1DeBMAKSDweBYd3f3XWCoHEAmk3l1YmJCgDTQBcjAwMCKa44KAG3OJEqp39rb2zfKADyslLphGMb7JXPR+wbQQq1a7BTwoi7OhlKAlZWV1OzsrAAzSqnXAcnlci0V9SsFFBMppT6Ox+NPOHeDEwBIx2KxP0OhUDcgkUjkbS/arjeiYlNKnb99+3bn9vb293qoszQmFArNNzY2/re1tXUXYHd39wcv2p4AYrHY7zs7O6Mvr6+fBchms8+Vxuzv7/cNDg7+NTY21g1gmmbei7anJXAsw48c2P4FMKmfPwSe0s8bgCSTyU8963pMHsfHv14ikfgaaD1OgDlANjY2pFLs6upq8SJ6+tgAcrlcfTgc/syrA9Fo9NqxLoF24RwuZ7qzVoA5r7qHrmQu7RGAQCAglQKVUn94VvVKms/nw+Fw+GngZjnru7q6vgMmvWr6WoLSgixjfb9vPb8vWJYVAl46woHzfrVEhP8BzTbP9sQqXZUAAAAASUVORK5CYII=\"","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport TinyLockImage from './assets/tiny_lock.png';\r\nimport SelectImage from './assets/select.png';\r\nimport FoundationImage from './assets/foundation.png';\r\nimport CuboidImage from './assets/cuboid.png';\r\nimport SensorImage from './assets/sensor.png';\r\nimport SolarPanelImage from './assets/solar-panel.png';\r\nimport WallImage from './assets/wall.png';\r\nimport WindowImage from './assets/window.png';\r\nimport DoorImage from './assets/door.png';\r\nimport PyramidRoofImage from './assets/pyramid_roof.png';\r\nimport HipRoofImage from './assets/hip_roof.png';\r\nimport GambrelRoofImage from './assets/gambrel_roof.png';\r\nimport MansardRoofImage from './assets/mansard_roof.png';\r\nimport GableRoofImage from './assets/gable_roof.png';\r\nimport TreeImage from './assets/tree.png';\r\nimport FlowerImage from './assets/flower.png';\r\nimport HumanImage from './assets/human.png';\r\nimport ParabolicTroughImage from './assets/parabolic_trough.png';\r\nimport ParabolicDishImage from './assets/parabolic_dish.png';\r\nimport FresnelReflectorImage from './assets/fresnel_reflector.png';\r\nimport HeliostatImage from './assets/heliostat.png';\r\nimport WindTurbineImage from './assets/wind_turbine.png';\r\nimport LightImage from './assets/led_light.png';\r\nimport GroupImage from './assets/group.png';\r\nimport ClearImage from './assets/clear.png';\r\nimport HeliodonImage from './assets/heliodon.png';\r\nimport AnalyzeImage from './assets/analyze.png';\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { Dropdown, Menu, Modal } from 'antd';\r\nimport 'antd/dist/antd.css';\r\nimport { ObjectType } from './types';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport i18n from './i18n/i18n';\r\nimport { UndoableRemoveAll } from './undo/UndoableRemoveAll';\r\nimport { UndoableCheck } from './undo/UndoableCheck';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { showInfo } from './helpers';\r\nimport { Util } from './Util';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { isGroupable } from './models/Groupable';\r\n\r\nconst ToolBarButton = ({ ...props }) => {\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nconst MainToolBarButtons = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const loggable = useStore(Selector.loggable);\r\n const elements = useStore.getState().elements;\r\n const language = useStore(Selector.language);\r\n const selectNone = useStore(Selector.selectNone);\r\n const actionModeLock = useStore(Selector.actionModeLock);\r\n const showHeliodonPanel = useStore(Selector.viewState.showHeliodonPanel);\r\n const noAnimationForHeatmapSimulation = useStore(Selector.world.noAnimationForHeatmapSimulation);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const clearContent = useStore(Selector.clearContent);\r\n const objectTypeToAdd = useStore(Selector.objectTypeToAdd);\r\n const addedFoundationId = useStore(Selector.addedFoundationId);\r\n const addedCuboidId = useStore(Selector.addedCuboidId);\r\n const addedWallId = useStore(Selector.addedWallId);\r\n const addedWindowId = useStore(Selector.addedWindowId);\r\n const addedDoorId = useStore(Selector.addedDoorId);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const runDynamicSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\r\n const runStaticSimulation = usePrimitiveStore(Selector.runStaticSimulation);\r\n const groupAction = useStore(Selector.groupActionMode);\r\n\r\n const [category1Flag, setCategory1Flag] = useState(ObjectType.Foundation);\r\n const [category2Flag, setCategory2Flag] = useState(ObjectType.Wall);\r\n const [category3Flag, setCategory3Flag] = useState(ObjectType.SolarPanel);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // CSS filter generator of color: https://codepen.io/sosuke/pen/Pjoqqp\r\n const defaultFilter = 'invert(41%) sepia(0%) saturate(0%) hue-rotate(224deg) brightness(93%) contrast(81%)';\r\n const selectFilter = 'invert(93%) sepia(3%) saturate(1955%) hue-rotate(26deg) brightness(113%) contrast(96%)';\r\n\r\n const resetToSelectMode = () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.actionModeLock = false;\r\n });\r\n };\r\n\r\n const handleGroupActionMode = () => {\r\n setCommonStore((state) => {\r\n if (!state.groupActionMode) {\r\n state.objectTypeToAdd = ObjectType.None;\r\n }\r\n state.groupActionMode = !state.groupActionMode;\r\n });\r\n };\r\n\r\n const removeAllContent = () => {\r\n Modal.confirm({\r\n title: i18n.t('toolbar.DoYouReallyWantToClearContent', lang) + '?',\r\n icon: ,\r\n onOk: () => {\r\n const removedElements = JSON.parse(JSON.stringify(useStore.getState().elements));\r\n clearContent();\r\n const undoableClearContent = {\r\n name: 'Clear Scene',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableClearContent.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n clearContent();\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableClearContent);\r\n },\r\n });\r\n resetToSelectMode();\r\n };\r\n\r\n const toggleSunAndTimeSettingsPanel = () => {\r\n const undoableCheck = {\r\n name: 'Show Sun and Time Settings Panel',\r\n timestamp: Date.now(),\r\n checked: !showHeliodonPanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = !state.viewState.showHeliodonPanel;\r\n });\r\n };\r\n\r\n const toggleStaticSolarRadiationHeatmap = () => {\r\n if (!runStaticSimulation) {\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n }\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n setPrimitiveStore('runStaticSimulation', !runStaticSimulation);\r\n setCommonStore((state) => {\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Generate Daily Solar Radiation Heatmap (Static)',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n }, 100);\r\n };\r\n\r\n const toggleDynamicSolarRadiationHeatmap = () => {\r\n if (!runDynamicSimulation) {\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n }\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n setPrimitiveStore('runDynamicSimulation', !runDynamicSimulation);\r\n setCommonStore((state) => {\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Generate Daily Solar Radiation Heatmap (Dynamic)',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n }, 100);\r\n };\r\n\r\n const setMode = (type: ObjectType) => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = type;\r\n state.groupActionMode = false;\r\n state.actionModeLock = false;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n selectNone();\r\n };\r\n\r\n const menuItem = (\r\n objectType: ObjectType,\r\n srcImg: string,\r\n setFlag: (val: React.SetStateAction) => void,\r\n replacingText?: string, // sometimes we don't want to use the type name as the name in the menu\r\n ) => {\r\n const key = objectType.charAt(0).toLowerCase() + objectType.slice(1).replace(/\\s+/g, '');\r\n return (\r\n {\r\n setFlag(objectType);\r\n setMode(objectType);\r\n }}\r\n >\r\n \r\n {i18n.t(`toolbar.SwitchToAdding${replacingText ?? objectType.replaceAll(' ', '')}`, lang)}\r\n \r\n );\r\n };\r\n\r\n // only the following types of elements need to be added in a large quantity\r\n const needToLock = (type: ObjectType) => {\r\n switch (type) {\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Sensor:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.WindTurbine:\r\n case ObjectType.Light:\r\n case ObjectType.Wall:\r\n case ObjectType.Window:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n const buttonImg = (objectType: ObjectType, srcImg: string, addedElemId?: string | null, text?: string) => {\r\n const needLock = needToLock(objectType);\r\n return (\r\n <>\r\n {\r\n setMode(objectType);\r\n }}\r\n onDoubleClick={() => {\r\n if (needLock) {\r\n setCommonStore((state) => {\r\n state.actionModeLock = true;\r\n });\r\n }\r\n }}\r\n />\r\n {(objectTypeToAdd === objectType || addedElemId) && needLock && actionModeLock && (\r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n const dropdownButton = (overlay: JSX.Element) => {\r\n return (\r\n \r\n \r\n ▼\r\n \r\n \r\n );\r\n };\r\n\r\n const category1Menu = (\r\n \r\n {menuItem(ObjectType.Foundation, FoundationImage, setCategory1Flag)}\r\n {menuItem(ObjectType.Cuboid, CuboidImage, setCategory1Flag)}\r\n {menuItem(ObjectType.Tree, TreeImage, setCategory1Flag)}\r\n {menuItem(ObjectType.Flower, FlowerImage, setCategory1Flag)}\r\n {menuItem(ObjectType.Human, HumanImage, setCategory1Flag, 'People')}\r\n \r\n );\r\n\r\n const category2Menu = (\r\n \r\n {menuItem(ObjectType.Wall, WallImage, setCategory2Flag)}\r\n {menuItem(ObjectType.Window, WindowImage, setCategory2Flag)}\r\n {menuItem(ObjectType.Door, DoorImage, setCategory2Flag)}\r\n {menuItem(ObjectType.PyramidRoof, PyramidRoofImage, setCategory2Flag)}\r\n {menuItem(ObjectType.HipRoof, HipRoofImage, setCategory2Flag)}\r\n {menuItem(ObjectType.GableRoof, GableRoofImage, setCategory2Flag)}\r\n {menuItem(ObjectType.GambrelRoof, GambrelRoofImage, setCategory2Flag)}\r\n {menuItem(ObjectType.MansardRoof, MansardRoofImage, setCategory2Flag)}\r\n \r\n );\r\n\r\n const category3Menu = (\r\n \r\n {menuItem(ObjectType.SolarPanel, SolarPanelImage, setCategory3Flag)}\r\n {menuItem(ObjectType.ParabolicTrough, ParabolicTroughImage, setCategory3Flag)}\r\n {menuItem(ObjectType.ParabolicDish, ParabolicDishImage, setCategory3Flag)}\r\n {menuItem(ObjectType.FresnelReflector, FresnelReflectorImage, setCategory3Flag)}\r\n {menuItem(ObjectType.Heliostat, HeliostatImage, setCategory3Flag)}\r\n {menuItem(ObjectType.Sensor, SensorImage, setCategory3Flag)}\r\n {menuItem(ObjectType.Light, LightImage, setCategory3Flag)}\r\n {/*{menuItem(ObjectType.WindTurbine, WaterHeaterImage, setCategory3Flag)}*/}\r\n {/*{menuItem(ObjectType.WindTurbine, WindTurbineImage, setCategory3Flag)}*/}\r\n \r\n );\r\n\r\n const category1Button = (objectType: ObjectType) => {\r\n switch (objectType) {\r\n case ObjectType.Foundation:\r\n return buttonImg(objectType, FoundationImage, useStore.getState().addedFoundationId);\r\n case ObjectType.Cuboid:\r\n return buttonImg(objectType, CuboidImage, useStore.getState().addedCuboidId);\r\n case ObjectType.Tree:\r\n return buttonImg(objectType, TreeImage);\r\n case ObjectType.Flower:\r\n return buttonImg(objectType, FlowerImage);\r\n case ObjectType.Human:\r\n return buttonImg(objectType, HumanImage, undefined, 'People');\r\n }\r\n };\r\n\r\n const category2Button = (objectType: ObjectType) => {\r\n switch (objectType) {\r\n case ObjectType.Wall:\r\n return buttonImg(objectType, WallImage, useStore.getState().addedWallId);\r\n case ObjectType.Window:\r\n return buttonImg(objectType, WindowImage, useStore.getState().addedWindowId);\r\n case ObjectType.Door:\r\n return buttonImg(objectType, DoorImage, useStore.getState().addedDoorId);\r\n case ObjectType.PyramidRoof:\r\n return buttonImg(ObjectType.PyramidRoof, PyramidRoofImage);\r\n case ObjectType.HipRoof:\r\n return buttonImg(ObjectType.HipRoof, HipRoofImage);\r\n case ObjectType.GableRoof:\r\n return buttonImg(ObjectType.GableRoof, GableRoofImage);\r\n case ObjectType.GambrelRoof:\r\n return buttonImg(ObjectType.GambrelRoof, GambrelRoofImage);\r\n case ObjectType.MansardRoof:\r\n return buttonImg(ObjectType.MansardRoof, MansardRoofImage);\r\n }\r\n };\r\n\r\n const category3Button = (objectType: ObjectType) => {\r\n switch (objectType) {\r\n case ObjectType.SolarPanel:\r\n return buttonImg(objectType, SolarPanelImage);\r\n case ObjectType.ParabolicTrough:\r\n return buttonImg(objectType, ParabolicTroughImage);\r\n case ObjectType.ParabolicDish:\r\n return buttonImg(objectType, ParabolicDishImage);\r\n case ObjectType.FresnelReflector:\r\n return buttonImg(objectType, FresnelReflectorImage);\r\n case ObjectType.Heliostat:\r\n return buttonImg(objectType, HeliostatImage);\r\n case ObjectType.Sensor:\r\n return buttonImg(objectType, SensorImage);\r\n case ObjectType.WindTurbine:\r\n return buttonImg(objectType, WindTurbineImage);\r\n case ObjectType.Light:\r\n return buttonImg(objectType, LightImage);\r\n }\r\n };\r\n\r\n const inSelectionMode = () => {\r\n return (\r\n objectTypeToAdd === ObjectType.None &&\r\n !addedFoundationId &&\r\n !addedCuboidId &&\r\n !addedWallId &&\r\n !addedWindowId &&\r\n !addedDoorId &&\r\n !groupAction\r\n );\r\n };\r\n\r\n return (\r\n
\r\n {/* default to select */}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {/* add buttons in category 1 */}\r\n \r\n {category1Button(category1Flag)}\r\n {dropdownButton(category1Menu)}\r\n \r\n\r\n {/* add buttons in category 2 */}\r\n \r\n {category2Button(category2Flag)}\r\n {dropdownButton(category2Menu)}\r\n \r\n\r\n {/* add buttons in category 3 */}\r\n \r\n {category3Button(category3Flag)}\r\n {dropdownButton(category3Menu)}\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n {\r\n if (showSolarRadiationHeatmap) {\r\n usePrimitiveStore.setState((state) => {\r\n state.showSolarRadiationHeatmap = false;\r\n state.showHeatFluxes = false;\r\n });\r\n } else {\r\n if (!noAnimationForHeatmapSimulation || Util.hasMovingParts(elements)) {\r\n toggleDynamicSolarRadiationHeatmap();\r\n } else {\r\n toggleStaticSolarRadiationHeatmap();\r\n }\r\n }\r\n }}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default React.memo(MainToolBarButtons);\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAJCAYAAAARml2dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobECQ3lBJ92QAAANlJREFUCJkFwT1OhEAUAOA3M28SgQIJyQYC2dYrUHgJCzuzhZ2VHmNba63MVpQbb0DlBbCwoTIUkBAdTJif9/w+xczQdd1tXddvWZY9lWV5MY7jh+r7Xg3DcJzn+WStfRdCHLTWZ9m2LRHRFkL4TJKkB4A/RCRsmuZmXddr59x+miYnpbwqiuIejTF33vsdIu6EEGCtBWPMgwwhSET8yfP8saqqQxRF3957QmYGAKBt21Zm/gUAYmaBSilyzl0uy/IKAEBEkKbpF8Zx/MLMeyFEAgDMzE5r/fwPyUVuAeqNzhQAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFBYXpdrWjwAAA4VJREFUWIXl10uIHEUYB/B//fvr6up5d+9unNnHsOO6sw2+8MViYCMeDCKK5BajN+8ievDgwHh0wVMOihAwIoqCsEpAl8RLPBhFZUk8uB4ECRpXMOBm3MzKdLo8pEd87OzMYWZysI71+n5V3dRXpay1uJGFNzQ6AFhr0WsXCoXCYWPMOWPM6/V6PdftP9S4+wEAnAJgAVgROWWMuQkAVlZWnIEmHwJgHcA1kj8opayIfOx53ty+Mw9YBgWcFpHdcrl8hOQHKeJMLpe7eVyAMyISLy0tLYZhWBaRj5RSluTZMAyXxgE4LSJ2bm7uIAAEQTAjIh+miM8ymUw0coDnebZard7frQjDsEzy/RTxxdTU1O0jBywuLh78e2WtVjvguu57JK3W+utyuXzXyAAi8o8d6JZKpRIaY952HMdqrc8HQXDfWAEAsLy8HGit30w/x4VSqbRnv5EBAKBarZa01idIWhH5dnJy8tBYAQAwPz9f8DzvtfSc+D4MwwfHCgCAer2eM8YcT3fip1KpdHisAACIosjVWq+mO/FzsVh8dJyAbmp3Pc97EddzyKV8Pv/YfgDpOysJEekpnJ2d9Vqt1sOtVuveJEkcAO1Op5MB8GuSJJWdnZ2Xoiha39zc7Ow1vi8AAOI4Vr3atre372y32+9YazMkQfL6ykSQJElbRL7xfb/nAvoCkiSBtVYBQKPRUKurq49YayfjOF4DcAWAjeNYk/zF9/1XAVxKkkQ5jqPiOP49CIJPNzY24p4BBkxG9wCAMeZZkpcBxCLyjLUW09PTRkTWSF4xxhzpt6D/xB0gHf8RRdGtWuunSe6QvJaefN91b0jZbPZxkpbkWi6XKw0TsE6yY4x5C8BVklv5fP6o67rvKqVsJpN5CvgrQ54juau1fmiYgE8A2HTFl40xTwCAMeYYyV2SZwF4AOC67nMkreu6x5vN5r53xoEBWutXSP5G8mI+nz/ara9UKqFS6kuSNpvNHgKAYrF4h+M4F0n+6Pv+bUMB1Gq1KWPMk77vP/DvNmNMMz12TwJAs9l0tNYvK6Ws67rPAxjs5jzIFXqvMjMzs0Byi+TWwsLCTIo6RrJD8oIxpjxSAABorU+SjI0xJ0g2SZ5P/5evfN8/MHLAxMTEioi0SMZp4Kta6zcKhcLd6PPsGwqg0Wgo3/dfEJHPPc9rZLPZW6IocgcZ242r/vev4z8B5TAn+0kvIhQAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAR4FluLjugAAAKtJREFUWIXtl0sOgCAMRDuG+1+5riAVASkfq0lnZ9I4z0lbBMxMlgpERAAuFMyMXYa51yFNdxpLSa9QK8pJR0x66hLArKFG0gurmzC+vDeBQz4A4DeTuAFYyAGqY5hL2xutetmg/0kg6mm8WmNYSsU8AQdwAAco7oHWFlt9Wn4rgdaW0/5o9Mo8AQdQn4YzKvWPGmB0DGvNa341SwlE09oXroSSXt9pQqur2QnRTVJZNG/P0wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUAggr/uMtcAAAAzxJREFUWIXFVk1II2cYfr7vy/zEnd/EbIs6aqMxCTaKRWpNBdfG4mWPrbfem70ve9oilL0uLaUHD4XS24KXUjxUC21pj5UiFEqLDEI0WA9CYiTuMJO3hzXbVuyaySbxgYGZ7+edZ56H550PRIRWrkKhcH96enqy1fWtXhwt4uDgwD06OnrU6vpW0TKBqampb4QQ71qWVegogzByZTKZJ6Zp/nEjFgBALpf7RJKkibGxseKNKEBEEdu2S7qu1/L5vN5zBQD4six/4XnerXK5vHYTCmB2djYdjUZ9TdNoYmLitZdVoK1Nuq7/BIBkWf7OcZyxXloAAPA875dkMom5ubnC6enp7sDAwNsIEemXsmB9fd20bbsEgADQysoKATiLxWK/G4bx5cjIyL1MJjNfLBaTRMSuq8eIKCzniGmav1Wr1TQATE5OwnVdEBGEEJAkCZxzKIqCRqNxIoTYicfjPzqOs7O5ufntBfF/ioV9ezabTdbr9TgAaJoG13X/XFhY+NSyLO77Pg+CAIwxfn5+zhljchAEqqZpkqqqt68sGNaCwcHBnyORCCmKUsvlcu8RkehZCubn59/XNI00TSMAd4hIAFgeGhr6fnl5ebirKVhbW1P39vY+8zwPjuM8IKIfVFX9QJbl7Vqtdsc0zXhYO0NZYFnWPV3XyTCMh82xbDb7mHNOiqJ4qVTqza4pkM/nb3POP7dt++tKpfLxv6aGGWPgnEsnJyd9XVMgFos9icfjO5dzzRj7inNOQggSQhS6okAikVhUFGVhZmbmHfw3w9y27eFm/peWlt5qR4AXElhdXY2Oj48/SCQSd7e3tyuXpkVfX1+KiNBoNFAul9WOEwDgLS4ufri7u/vr5QnGWHB4ePgUeGZjqVRqtEOg7QZSLBZtSZKOABBjjAB81NU+cBlnZ2cpy7JeaX5EOp1+o506of8FTWxsbDz1ff/5cxAEV/f6a9C2AqOjo68TPQsFYwzHx8f+NVs6S8B13VcvegEYY6hWq70l0N/fn2tacNGqh7a2tm71jIDjOH8ZhoFIJAIigiRJzv7+vhG2zrUnItM0X7igXq9fOR6NRp/fVyoV9n/721agU2jnTNhR/A2OInIG7r+B4wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWASEWSoKIWAAAAZdJREFUWIXllrEuBFEUhv9fJIR3UGokCiSeQMsbkBD/NoREvIFKQ6jmUqxWqfYAEgmReAFPgYJf4c7m7q5lcNcIJ5ns3jNn5vvmzpnk0DbqjIFa6b9BYLAzQXJN0mE/YCGEOdvnbby0B/oJTySmbF+3ErZbhyRLcprLeUgygJ00V0cPMF3UIfBct0Bb/MtX0Pbp/8tX8DMCJCdIzr5x6rTvAiQ3JN1KuiB5XOaLoqDtq74KRPh+uZa0QrLZqz6rAMn1FJ5ILPWSyCZAclPSQa/zpQTJNmYWgQjf+6hO0hKArawCVeGJxG42gdhwleEAEEJYyCKQNlwIYbwiXLbP0lzXSFYRPlk2XAhhxPY9yWFJDx/AjzrzX92BkfKP7fv4+xhCGPoMHOieCWckXb5HLoqCJAngWNJyBAzafiprGo1G66bvwbsEosQkgEUAox21BlDYvklqm/HTakmQHJN0VwX+etdvDpoAmnHYPAUwXQ62AFarXN+1A18JkieSFst1pSfPtQPJTmzHJ5//zHVZduA78XcnoqrxAhsxq5juT7lFAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wEHEBw2Usn7JwAAA7JJREFUWIXF11uIlVUUB/DfOKnZpBnmQGGplWM25VhGSlkWSZeHsoeiu0WkNoEFFj1IQkVhPfWQXamwosiyCLqMdCG6kJI0RZFd6G6oNFGNXRwbh+lh7Y+zz5lznDMh04LNOd/a6/bt9d//vT/+Z2kYgu1+mJ5+K6UfW9LY6zIZF+JBdKdk1cZ7uB4n7a3EI3E23tpD0mpjG27BlHqS1GrBKKxAO5oz/S/iTf9AY0rYIFozuyLGO1iGT+oppDL5behReqstuBNnYSL2xziMTb8zsATrla/GBswcSvJG3IqdWZDncCpG1OF/MG4SbSj8N6Kt3gLOxW/JsQ9P4KB6nZM04PKKIt7AhMEcp4q+FU4v1Eh+CBbiCpyBAzG6it1VAiv9YkWvHayA87PkP2BuNrcPjsNyPInN+BGfYh3uwQ1ozXwasCaLuR5jaiVvwn2Z8V1KPZ+M2/GFwbfg12LnHJB8Z6IrzX2PebUKmK1EMttxZtK3Gojsb9CBOwRgO5JPMb8Tj4v2jcGbSd+LlbUKOEU56pswHq9n+h1YheOxAJfhYsxP/o9iV2a/OsVenOmeVoN7Ts6MHhF8vyrTdYkeN6aEG9KK7cBrOErwwd3YnXx24epUbG/SfaQcJ1ULuB8nin72p4D3ZraPGdj7dWluNJ5X3q6V+Ds9/4TT8sTVyKURW5MxJao9Jj1vEixZyF/oTP9n4LBs7kMBvsb0XBQ2QOZlk2uSw0IlBPfhXXHSjRdI/zjpFgt6Ph1vZ3G2poIWJP/+VPy0agXkLdiElqS/ThxAORAfwnlYiitxkQBuflRvw6XiRH1YeXuryqF4PzNsz+YuSUVV9v1X/F6h253inJN8m/FlmutOsWrKkixQh1jWQlrECbkRXykhvV8AbLNY/psFVecx/0l2nelFa8pcJULpxY1VbKZhDhal+eW4QHBDZfAjldizT/lOqir7CnYr3my7IJv/IlPwShbrO5xQj+Mkgey8iEUCTPXKdLysvEUrhuBvlnJAdgtubxNsV01GCcy043MDgfmseLkBUutOOAsPKD+Su/AZXhLIHil62ySuanNwRCqGwFGxcn2CLa/BnzVyDpA2wfPFpWIo41txM34x0/WJu8TUegsgrlFLUyHF2VBr9Ai+WK0EuElYq7QV+/GMrJX1fhmNxbHiIGkVFDtR9Pdnsd0+wKsC8bmMEx81BQn1iDvGMqXzZkgyIhUxX5whLXs2B4eLlSiu+p2CJ4ZVJuApscOOHu7khTSr85Nt2ORfxq1ZEqNjj0MAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVDjcggElAxQAAAy1JREFUWIXFl09oVHcQxz+zya67MYk+3IQoddfdjf9SpXhoK1RRVEovght8mBz0FB569ZSDFxX00INgQ+GVHAqFFndJPFcE6cEee1MUYZVkNf6DWCsWmt1OD/u2Pp/vJb/dRTIw8Hhv5jsz35nf7G9FVVlNia1q9E4TKBQK+4LvRCQpImeNQVS1bQUU2BZ4d7UBa4bRcQti3bErvuq7gVet+He3G1hEuoCN9aX602w2a83NzR0GBoHfgaQxUIuUF4EfgCvAkKqSz+fP0GhFUA96PuPAFHAhFLPFBLry+fz3eD0GTkUEb+ou4Jz3nA7DlHb2gIhsBJ4BdQPzPuATVb0X+rWTU+DXTCZjAUeBH/0srOTXFgMricfQE69AEREFelT176Bty6dARPpd1x22LGsQSP18bebfhafVPzObNlXL5fIjVa2p6kLDVA4BTExMMD09/VZEUFV5D9CU4lKp9A3LD5wCWhwtKrDZeLANJn/QJHBYIh0nkEgkdrYT3K+2bXctFyNyBkQkC9xtdUaCUqvXaoBEfQ89Bd5OXwpzKI4WGR8bHwMeLy4uvjx/6VLqqy++Tdfqv9y4Pns9NEhxtMjszGx4EmG0eIP0Xj9d191h0lPHceO2bR8n0ArHcUI3YdjQrfE7ZoeH97SzmGzb7vIXEjWUYcft/+xLpdK6djdjUycnJ4/4CoqZMNA07ve9ywIng7QuoyeB1Lu2OMe8NhSMEnBd90sgNjU15QfdC6wx2BtDnm3Tb6Q5V47jfG3KwEgToBP6gfVNHNu2h23bPhG0ibqS3QEsDe7tFkVVX3kYY+Vy+YFlWc/DjMIYON/p8EXgfmbCwMV4In5ARDqq3i+FQmG39/jChIEtgEpMZoCBTivPZDJHent7FxCuhTITQdfnPWt7Hvb1970BvgP2A8v+qAT8NwCn4on4byOfjijwE40LyQe2kTciEUkBp1M9qTO5XG7r/Pz824H0wB+VSuU+MAe8Bv6isTmTwJCI5JKp5O5cLre9Wq3W0hvSv1YqlcuqejuqPUZXMhHZAxxA2ItyIsounojfWvpn6Q5wG7ipqi9XxDZJ4GPKqv87/g99LxWbCpiI3gAAAABJRU5ErkJggg==\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport styled from 'styled-components';\nimport { Avatar, Button, Dropdown, Menu, Popover, Space } from 'antd';\nimport MainToolBarButtons from './mainToolBarButtons';\nimport i18n from './i18n/i18n';\nimport React, { useMemo } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\n\nconst ButtonsContainer = styled.div`\n position: absolute;\n top: 0;\n right: 10px;\n margin: 0;\n padding-bottom: 0;\n padding-top: 16px;\n display: flex;\n justify-content: center;\n align-items: center;\n user-select: none;\n z-index: 9;\n`;\n\nexport interface MainToolBarProps {\n signIn: () => void;\n signOut: () => void;\n}\n\nconst MainToolBar = ({ signIn, signOut }: MainToolBarProps) => {\n const language = useStore(Selector.language);\n const user = useStore(Selector.user);\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const avatarMenu = (\n \n {\n usePrimitiveStore.setState((state) => {\n state.showAccountSettingsPanel = true;\n });\n }}\n >\n {i18n.t('avatarMenu.AccountSettings', lang)}\n \n \n {i18n.t('avatarMenu.SignOut', lang)}\n \n \n );\n\n return (\n \n \n {!openModelsMap && }\n
\n {user.displayName ? (\n \n e.preventDefault()}\n title={i18n.t('tooltip.clickToAccessAccountSettings', lang)}\n >\n \n \n \n ) : (\n e.stopPropagation()}>{i18n.t('avatarMenu.PrivacyStatementTitle', lang)}
}\n content={\n
\n {i18n.t('avatarMenu.PrivacyStatement', lang)}\n \n {i18n.t('aboutUs.PrivacyPolicy', lang)}\n \n .\n
\n }\n >\n \n \n )}\n \n
\n
\n );\n};\n\nexport default React.memo(MainToolBar);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useRef, useState } from 'react';\nimport { Button, Input, Modal, Space } from 'antd';\nimport i18n from './i18n/i18n';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport { REGEX_ALLOWABLE_IN_NAME } from './constants';\n\nexport interface CloudFileSaveModalProps {\n saveToCloud: (title: string, silent: boolean, checkExistence: boolean) => void;\n isLoading: () => boolean;\n setTitle: (title: string) => void;\n getTitle: () => string;\n setTitleDialogVisible: (visible: boolean) => void;\n isTitleDialogVisible: () => boolean;\n}\n\nconst SaveCloudFileModal = ({\n saveToCloud,\n isLoading,\n setTitle,\n getTitle,\n setTitleDialogVisible,\n isTitleDialogVisible,\n}: CloudFileSaveModalProps) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n\n const lang = { lng: language };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const onOk = () => {\n saveToCloud(getTitle(), false, true);\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = false;\n });\n };\n\n const onCancel = () => {\n setTitleDialogVisible(false);\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = false;\n });\n };\n\n return (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('menu.file.SaveAsCloudFile', lang)}\n \n }\n visible={isTitleDialogVisible()}\n footer={[\n ,\n ,\n ]}\n confirmLoading={isLoading()}\n onCancel={onCancel}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n {i18n.t('word.Title', lang)}:\n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e: React.ChangeEvent) => {\n setTitle(e.target.value);\n }}\n />\n \n \n );\n};\n\nexport default React.memo(SaveCloudFileModal);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableBounds, DraggableData, DraggableEvent, DraggableEventHandler } from 'react-draggable';\nimport { Dropdown, Input, Menu, Modal, Space, Table, Typography } from 'antd';\nimport { CaretDownOutlined, QuestionCircleOutlined, WarningOutlined } from '@ant-design/icons';\nimport { HOME_URL, REGEX_ALLOWABLE_IN_NAME, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { copyTextToClipboard, showSuccess } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport Draggable from 'react-draggable';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { ProjectInfo } from '../types';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 90px;\n right: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 14;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 640px;\n height: 520px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface ProjectListPanelProps {\n projects: object[];\n setProjectState: (projectInfo: ProjectInfo) => void;\n deleteProject: (title: string) => void;\n renameProject: (oldTitle: string, newTitle: string) => void;\n}\n\nconst ProjectListPanel = ({ projects, setProjectState, deleteProject, renameProject }: ProjectListPanelProps) => {\n const language = useStore(Selector.language);\n const user = useStore(Selector.user);\n const setCommonStore = useStore(Selector.set);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const [renameDialogVisible, setRenameDialogVisible] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const [oldTitle, setOldTitle] = useState();\n const [newTitle, setNewTitle] = useState();\n const dragRef = useRef(null);\n // make an editable copy because the project array is not mutable\n const projectsRef = useRef([...projects]);\n // set a flag so that we can update when projectsRef changes\n const [recountFlag, setRecountFlag] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n\n const { Search } = Input;\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (projects) {\n projectsRef.current = [...projects];\n setRecountFlag(!recountFlag);\n }\n }, [projects]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showProjectListPanel = false;\n });\n };\n\n const confirmDeleteProject = (title: string) => {\n Modal.confirm({\n title: i18n.t('projectListPanel.DoYouReallyWantToDeleteProject', lang) + ' \"' + title + '\"?',\n content: (\n \n \n {i18n.t('word.Warning', lang) + ': ' + i18n.t('message.ThisCannotBeUndone', lang)}\n \n ),\n icon: ,\n onOk: () => {\n deleteProject(title);\n },\n });\n };\n\n const changeProjectTitle = () => {\n if (oldTitle && newTitle) {\n renameProject(oldTitle, newTitle);\n setNewTitle(undefined);\n setRecountFlag(!recountFlag);\n }\n setRenameDialogVisible(false);\n };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('word.Rename', lang)}\n \n }\n visible={renameDialogVisible}\n onOk={changeProjectTitle}\n onCancel={() => {\n setRenameDialogVisible(false);\n setNewTitle(undefined);\n }}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e: React.ChangeEvent) => {\n setNewTitle(e.target.value);\n }}\n />\n \n \n {i18n.t('word.Caution', lang) +\n ': ' +\n i18n.t('projectListPanel.IfSharedOrPublishedRenamingProjectBreaksExistingLinks', lang)}\n .\n \n \n \n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'projectListPanel';\n });\n }}\n >\n \n \n
\n {i18n.t('projectListPanel.MyProjects', lang) + ' (' + projectsRef.current.length + ')'}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {\n if (!projects) return;\n // must create a new array for ant table to update (don't just set length to 0)\n projectsRef.current = [];\n for (const f of projects) {\n // @ts-ignore\n if (f['title']?.toLowerCase().includes(s.toLowerCase())) {\n projectsRef.current.push(f);\n }\n }\n setRecountFlag(!recountFlag);\n }}\n />\n \n \n {\n return {type};\n }}\n onCell={(data, index) => {\n return {\n style: {\n background:\n selectedIndex === index\n ? 'lightskyblue'\n : index !== undefined && index % 2 === 0\n ? 'beige'\n : 'gainsboro',\n },\n };\n }}\n />\n {\n return (a as any)['title'].localeCompare((b as any)['title']);\n }}\n render={(title, record, index) => {\n let selection: string | undefined = undefined;\n return (\n \n {\n selection = window.getSelection()?.toString();\n }}\n >\n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n setProjectState(record as ProjectInfo);\n }}\n >\n {i18n.t('word.Open', lang)}\n \n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n if (selection && selection.length > 0) {\n copyTextToClipboard(selection);\n } else {\n copyTextToClipboard(title);\n }\n showSuccess(i18n.t('projectListPanel.TitleCopiedToClipBoard', lang) + '.');\n }}\n >\n {i18n.t('projectListPanel.CopyTitle', lang)}\n \n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n setOldTitle(title);\n setRenameDialogVisible(true);\n }}\n >\n {i18n.t('word.Rename', lang)}\n \n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n confirmDeleteProject(title);\n }}\n >\n {i18n.t('word.Delete', lang)}\n \n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n const url =\n HOME_URL + '?client=web&userid=' + user.uid + '&project=' + encodeURIComponent(title);\n copyTextToClipboard(url);\n showSuccess(i18n.t('projectListPanel.ProjectLinkGeneratedInClipBoard', lang) + '.');\n }}\n >\n {i18n.t('projectListPanel.GenerateProjectLink', lang)}\n \n \n }\n trigger={['hover']}\n >\n {\n if (index !== undefined) setSelectedIndex(index);\n }}\n onMouseLeave={() => {\n setSelectedIndex(-1);\n }}\n />\n \n \n {title}\n \n \n );\n }}\n onCell={(data, index) => {\n return {\n style: {\n background:\n selectedIndex === index\n ? 'lightskyblue'\n : index !== undefined && index % 2 === 0\n ? 'beige'\n : 'gainsboro',\n },\n // onClick: () => {\n // const selection = window.getSelection();\n // if (selection && selection.toString().length > 0) return;\n // // only proceed when no text is selected\n // setProjectState(data as ProjectInfo);\n // },\n };\n }}\n />\n {\n // @ts-ignore\n return a['timestamp'] - b['timestamp'];\n }}\n render={(time) => {\n return {time};\n }}\n onCell={(data, index) => {\n return {\n style: {\n background:\n selectedIndex === index\n ? 'lightskyblue'\n : index !== undefined && index % 2 === 0\n ? 'beige'\n : 'gainsboro',\n },\n };\n }}\n />\n \n
\n \n \n \n );\n};\n\nexport default React.memo(ProjectListPanel);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport * as Selector from './stores/selector';\r\nimport { Modal } from 'antd';\r\nimport dayjs from 'dayjs';\r\nimport 'antd/dist/antd.css';\r\nimport firebase from 'firebase/app';\r\nimport 'firebase/auth';\r\nimport 'firebase/firestore';\r\nimport 'firebase/storage';\r\nimport { showError, showInfo, showSuccess } from './helpers';\r\nimport {\r\n ClassID,\r\n CloudFileInfo,\r\n DataColoring,\r\n Design,\r\n DesignProblem,\r\n FirebaseName,\r\n ModelSite,\r\n ObjectType,\r\n ProjectInfo,\r\n SchoolID,\r\n User,\r\n} from './types';\r\nimport CloudFilePanel from './panels/cloudFilePanel';\r\nimport Spinner from './components/spinner';\r\nimport AccountSettingsPanel from './panels/accountSettingsPanel';\r\nimport i18n from './i18n/i18n';\r\nimport { ExclamationCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';\r\nimport { Util } from './Util';\r\nimport { HOME_URL } from './constants';\r\nimport ModelsMapWrapper from './modelsMapWrapper';\r\nimport MainToolBar from './mainToolBar';\r\nimport SaveCloudFileModal from './saveCloudFileModal';\r\nimport ModelsGallery from './modelsGallery';\r\nimport ProjectListPanel from './panels/projectListPanel';\r\nimport { loadCloudFile } from './cloudFileUtil';\r\nimport { changeDesignTitles, copyDesign, createDesign, fetchProject, getImageData } from './cloudProjectUtil';\r\nimport { ProjectUtil } from './panels/ProjectUtil';\r\n\r\nexport interface CloudManagerProps {\r\n viewOnly: boolean;\r\n canvas?: HTMLCanvasElement | null;\r\n}\r\n\r\nconst useFlag = (flag: boolean, fn: Function, setFlag: () => void) => {\r\n useEffect(() => {\r\n if (flag) {\r\n fn();\r\n setFlag();\r\n }\r\n }, [flag]);\r\n};\r\n\r\nconst CloudManager = ({ viewOnly = false, canvas }: CloudManagerProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const language = useStore(Selector.language);\r\n const user = useStore(Selector.user);\r\n const latitude = useStore(Selector.world.latitude);\r\n const longitude = useStore(Selector.world.longitude);\r\n const address = useStore(Selector.world.address);\r\n const countryCode = useStore(Selector.world.countryCode);\r\n const exportContent = useStore(Selector.exportContent);\r\n const showCloudFilePanel = usePrimitiveStore(Selector.showCloudFilePanel);\r\n const showProjectListPanel = usePrimitiveStore(Selector.showProjectListPanel);\r\n const showModelsGallery = usePrimitiveStore(Selector.showModelsGallery);\r\n const showAccountSettingsPanel = usePrimitiveStore(Selector.showAccountSettingsPanel);\r\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\r\n const cloudFile = useStore(Selector.cloudFile);\r\n const saveCloudFileFlag = usePrimitiveStore(Selector.saveCloudFileFlag);\r\n const modelsMapFlag = usePrimitiveStore(Selector.modelsMapFlag);\r\n const leaderboardFlag = usePrimitiveStore(Selector.leaderboardFlag);\r\n const publishOnMapFlag = usePrimitiveStore(Selector.publishOnModelsMapFlag);\r\n const listCloudFilesFlag = usePrimitiveStore(Selector.listCloudFilesFlag);\r\n const showCloudFileTitleDialog = useStore(Selector.showCloudFileTitleDialog);\r\n const showCloudFileTitleDialogFlag = useStore(Selector.showCloudFileTitleDialogFlag);\r\n const importContent = useStore(Selector.importContent);\r\n const createEmptyFile = useStore(Selector.createEmptyFile);\r\n const changed = usePrimitiveStore(Selector.changed);\r\n const localContentToImportAfterCloudFileUpdate = useStore(Selector.localContentToImportAfterCloudFileUpdate);\r\n const peopleModels = useStore(Selector.peopleModels);\r\n const createProjectFlag = usePrimitiveStore(Selector.createProjectFlag);\r\n const saveProjectFlag = usePrimitiveStore(Selector.saveProjectFlag);\r\n const curateDesignToProjectFlag = usePrimitiveStore(Selector.curateDesignToProjectFlag);\r\n const showProjectsFlag = usePrimitiveStore(Selector.showProjectsFlag);\r\n const updateProjectsFlag = usePrimitiveStore(Selector.updateProjectsFlag);\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const [cloudFileArray, setCloudFileArray] = useState([]);\r\n const [projectArray, setProjectArray] = useState([]);\r\n const [updateProjectArrayFlag, setUpdateProjectArrayFlag] = useState(false);\r\n const [title, setTitle] = useState(cloudFile ?? 'My Aladdin File');\r\n const [titleDialogVisible, setTitleDialogVisible] = useState(false);\r\n const cloudFiles = useRef();\r\n const myProjects = useRef(); // Not sure why I need to use ref to store this\r\n const authorModelsRef = useRef>();\r\n const firstAccountSettings = useRef(true);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n useEffect(() => {\r\n const config = {\r\n apiKey: process.env.REACT_APP_FIREBASE_API_KEY,\r\n authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,\r\n projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,\r\n storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,\r\n databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL,\r\n messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,\r\n appId: process.env.REACT_APP_FIREBASE_APP_ID,\r\n };\r\n let initialize = firebase.apps.length === 0; // no app, should initialize\r\n if (firebase.apps.length === 1 && firebase.apps[0].name === FirebaseName.LOG_DATA) {\r\n initialize = true; // if there is only the logger app, should initialize\r\n }\r\n if (initialize) {\r\n firebase.initializeApp(config);\r\n } else {\r\n firebase.app(); // if already initialized, use the default one\r\n }\r\n\r\n // don't enable persistence as we often need to open multiple tabs\r\n // firebase.firestore().enablePersistence()\r\n // .catch((err) => {\r\n // if (err.code === 'failed-precondition') {\r\n // showWarning('Firestore: Multiple tabs open, persistence can only be enabled in one tab at a time.', 10);\r\n // } else if (err.code === 'unimplemented') {\r\n // showWarning('Firestore: The current browser does not support offline persistence, 10');\r\n // }\r\n // });\r\n\r\n // do not use firebase.auth().currentUser - currentUser might be null because the auth object has not finished initializing.\r\n // If you use an observer to keep track of the user's sign-in status, you don't need to handle this case.\r\n firebase.auth().onAuthStateChanged((u) => {\r\n const params = new URLSearchParams(window.location.search);\r\n const title = params.get('title');\r\n if (u) {\r\n setCommonStore((state) => {\r\n if (state.user) {\r\n state.user.uid = u.uid;\r\n state.user.displayName = u.displayName;\r\n state.user.email = u.email;\r\n state.user.photoURL = u.photoURL;\r\n }\r\n state.cloudFile = title ?? undefined;\r\n });\r\n } else {\r\n setCommonStore((state) => {\r\n state.cloudFile = title ?? undefined;\r\n });\r\n }\r\n });\r\n init();\r\n window.addEventListener('popstate', handlePopStateEvent);\r\n return () => {\r\n window.removeEventListener('popstate', handlePopStateEvent);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const handlePopStateEvent = () => {\r\n if (viewOnly) return;\r\n const p = new URLSearchParams(window.location.search);\r\n const userid = p.get('userid');\r\n const title = p.get('title');\r\n if (userid && title) {\r\n openCloudFile(userid, title, true);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (cloudFiles.current) {\r\n const arr: any[] = [];\r\n cloudFiles.current.forEach((f, i) => {\r\n arr.push({\r\n key: i.toString(),\r\n title: f.fileName,\r\n time: dayjs(new Date(f.timestamp)).format('MM/DD/YYYY hh:mm A'),\r\n timestamp: f.timestamp,\r\n userid: f.userid,\r\n action: '',\r\n });\r\n });\r\n arr.sort((a, b) => b.timestamp - a.timestamp);\r\n setCloudFileArray(arr);\r\n }\r\n // FIXME: React says that the dependency of the mutable cloudFiles.current is unnecessary,\r\n // but we need this for the code to work.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [cloudFiles.current]);\r\n\r\n useEffect(() => {\r\n if (myProjects.current) {\r\n const arr: any[] = [];\r\n myProjects.current.forEach((f, i) => {\r\n arr.push({\r\n key: i.toString(),\r\n owner: f.owner,\r\n title: f.title,\r\n time: dayjs(new Date(f.timestamp)).format('MM/DD/YYYY hh:mm A'),\r\n timestamp: f.timestamp,\r\n description: f.description,\r\n dataColoring: f.dataColoring,\r\n selectedProperty: f.selectedProperty,\r\n sortDescending: f.sortDescending,\r\n xAxisNameScatteredPlot: f.xAxisNameScatteredPlot,\r\n yAxisNameScatteredPlot: f.yAxisNameScatteredPlot,\r\n dotSizeScatteredPlot: f.dotSizeScatteredPlot,\r\n thumbnailWidth: f.thumbnailWidth,\r\n type: f.type,\r\n designs: f.designs,\r\n ranges: f.ranges ?? [],\r\n hiddenParameters: f.hiddenParameters ?? ProjectUtil.getDefaultHiddenParameters(f.type),\r\n counter: f.counter,\r\n action: '',\r\n });\r\n });\r\n arr.sort((a, b) => b.timestamp - a.timestamp);\r\n setProjectArray(arr);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [myProjects.current, updateProjectArrayFlag]);\r\n\r\n // fetch all the models that belong to the current user, including those published under all aliases\r\n useEffect(() => {\r\n authorModelsRef.current = new Map();\r\n if (user.aliases && user.aliases.length > 0) {\r\n for (const a of user.aliases) {\r\n if (a !== user.displayName) {\r\n const m = peopleModels.get(a);\r\n if (m) authorModelsRef.current = new Map([...authorModelsRef.current, ...m]);\r\n }\r\n }\r\n }\r\n if (user.displayName) {\r\n const m = peopleModels.get(user.displayName);\r\n if (m) authorModelsRef.current = new Map([...authorModelsRef.current, ...m]);\r\n }\r\n }, [peopleModels, user.displayName, user.aliases]);\r\n\r\n useFlag(saveCloudFileFlag, updateCloudFile, () => setPrimitiveStore('saveCloudFileFlag', false));\r\n\r\n useFlag(modelsMapFlag, fetchModelSitesFn, () => setPrimitiveStore('modelsMapFlag', false));\r\n\r\n useFlag(leaderboardFlag, fetchPeopleModelsFn, () => setPrimitiveStore('leaderboardFlag', false));\r\n\r\n useFlag(publishOnMapFlag, publishOnModelsMap, () => setPrimitiveStore('publishOnModelsMapFlag', false));\r\n\r\n useFlag(createProjectFlag, createNewProject, () => setPrimitiveStore('createProjectFlag', false));\r\n\r\n useFlag(saveProjectFlag, saveProjectAs, () => setPrimitiveStore('saveProjectFlag', false));\r\n\r\n useFlag(showProjectsFlag, showMyProjectsList, () => setPrimitiveStore('showProjectsFlag', false));\r\n\r\n useFlag(updateProjectsFlag, hideMyProjectsList, () => setPrimitiveStore('updateProjectsFlag', false));\r\n\r\n useFlag(listCloudFilesFlag, listMyCloudFiles, () => setPrimitiveStore('listCloudFilesFlag', false));\r\n\r\n useFlag(curateDesignToProjectFlag, curateDesignToProject, () =>\r\n setPrimitiveStore('curateDesignToProjectFlag', false),\r\n );\r\n\r\n useEffect(() => {\r\n setTitleDialogVisible(showCloudFileTitleDialog);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [showCloudFileTitleDialogFlag]);\r\n\r\n useEffect(() => {\r\n setTitle(cloudFile ?? 'My Aladdin File');\r\n }, [cloudFile]);\r\n\r\n useEffect(() => {\r\n if (firstAccountSettings.current) {\r\n firstAccountSettings.current = false;\r\n } else {\r\n saveAccountSettings(user);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [user.signFile, user.schoolID, user.classID]);\r\n\r\n const init = () => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userid = params.get('userid');\r\n if (userid) {\r\n const title = params.get('title');\r\n const project = params.get('project');\r\n if (project) {\r\n setLoading(true);\r\n fetchProject(userid, project, setProjectState).finally(() => {\r\n setLoading(false);\r\n });\r\n if (title) {\r\n openDesignFile(userid, title);\r\n }\r\n } else {\r\n if (title) {\r\n openCloudFile(userid, title);\r\n }\r\n }\r\n } else {\r\n setCommonStore((state) => {\r\n // make sure that the cloud file state is consistent with the URL\r\n state.cloudFile = undefined;\r\n });\r\n }\r\n };\r\n\r\n const resetToSelectMode = () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n });\r\n };\r\n\r\n const signIn = () => {\r\n const provider = new firebase.auth.GoogleAuthProvider();\r\n firebase\r\n .auth()\r\n .signInWithPopup(provider)\r\n .then((result) => {\r\n setCommonStore((state) => {\r\n if (result.user) {\r\n state.user.uid = result.user.uid;\r\n state.user.email = result.user.email;\r\n state.user.displayName = result.user.displayName;\r\n state.user.photoURL = result.user.photoURL;\r\n registerUser({ ...state.user }).then(() => {\r\n // ignore\r\n });\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n if (error.code !== 'auth/popup-closed-by-user' && error.code !== 'auth/cancelled-popup-request') {\r\n showError(i18n.t('message.CannotSignIn', lang) + ': ' + error);\r\n }\r\n });\r\n resetToSelectMode();\r\n };\r\n\r\n const registerUser = async (user: User): Promise => {\r\n const firestore = firebase.firestore();\r\n let signFile = false;\r\n let noLogging = false;\r\n let userCount = 0;\r\n let schoolID = SchoolID.UNKNOWN;\r\n let classID = ClassID.UNKNOWN;\r\n let likes: string[] = [];\r\n let published: string[] = [];\r\n let aliases: string[] = [];\r\n const found = await firestore\r\n .collection('users')\r\n .get()\r\n .then((querySnapshot) => {\r\n userCount = querySnapshot.size;\r\n for (const doc of querySnapshot.docs) {\r\n if (doc.id === user.uid) {\r\n const docData = doc.data();\r\n signFile = !!docData.signFile;\r\n noLogging = !!docData.noLogging;\r\n schoolID = docData.schoolID ? (docData.schoolID as SchoolID) : SchoolID.UNKNOWN;\r\n classID = docData.classID ? (docData.classID as ClassID) : ClassID.UNKNOWN;\r\n if (docData.likes) likes = docData.likes;\r\n if (docData.published) published = docData.published;\r\n if (docData.aliases) aliases = docData.aliases;\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n if (found) {\r\n setCommonStore((state) => {\r\n state.user.signFile = signFile;\r\n state.user.noLogging = noLogging;\r\n state.user.schoolID = schoolID;\r\n state.user.classID = classID;\r\n state.user.likes = likes;\r\n state.user.published = published;\r\n state.user.aliases = aliases;\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.userCount = userCount;\r\n });\r\n user.signFile = signFile;\r\n user.noLogging = noLogging;\r\n user.schoolID = schoolID;\r\n user.classID = classID;\r\n user.likes = likes;\r\n user.published = published;\r\n user.aliases = aliases;\r\n } else {\r\n if (user.uid) {\r\n firestore\r\n .collection('users')\r\n .doc(user.uid)\r\n .set({\r\n uid: user.uid,\r\n signFile: !!user.signFile, // don't listen to WebStorm's suggestion to simplify it\r\n noLogging: !!user.noLogging,\r\n schoolID: user.schoolID ?? SchoolID.UNKNOWN,\r\n classID: user.classID ?? ClassID.UNKNOWN,\r\n since: dayjs(new Date()).format('MM/DD/YYYY hh:mm A'),\r\n os: Util.getOS(),\r\n })\r\n .then(() => {\r\n showInfo(i18n.t('message.YourAccountWasCreated', lang));\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotCreateAccount', lang) + ': ' + error);\r\n });\r\n }\r\n }\r\n };\r\n\r\n const signOut = () => {\r\n firebase\r\n .auth()\r\n .signOut()\r\n .then(() => {\r\n setCommonStore((state) => {\r\n state.user.uid = null;\r\n state.user.email = null;\r\n state.user.displayName = null;\r\n state.user.photoURL = null;\r\n state.user.signFile = false;\r\n state.user.likes = [];\r\n state.user.published = [];\r\n state.user.aliases = [];\r\n state.cloudFile = undefined; // if there is a current cloud file\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.showCloudFilePanel = false;\r\n state.showAccountSettingsPanel = false;\r\n state.showModelsGallery = false;\r\n state.showProjectListPanel = false;\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotSignOut', lang) + ': ' + error);\r\n });\r\n };\r\n\r\n const saveAccountSettings = (user: User) => {\r\n if (user.uid) {\r\n const firestore = firebase.firestore();\r\n firestore\r\n .collection('users')\r\n .doc(user.uid)\r\n .update({\r\n signFile: !!user.signFile,\r\n schoolID: user.schoolID ?? SchoolID.UNKNOWN,\r\n classID: user.classID ?? ClassID.UNKNOWN,\r\n })\r\n .then(() => {\r\n showInfo(i18n.t('message.YourAccountSettingsWereSaved', lang));\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotSaveYourAccountSettings', lang) + ': ' + error);\r\n });\r\n }\r\n };\r\n\r\n const fetchModelSites = async () => {\r\n setLoading(true);\r\n await firebase\r\n .firestore()\r\n .collection('models')\r\n .get()\r\n .then((querySnapshot) => {\r\n const models = new Map>();\r\n querySnapshot.forEach((doc) => {\r\n const data = doc.data();\r\n if (data) {\r\n const m = new Map();\r\n for (const k in data) {\r\n if (!data[k].countryCode) {\r\n if (data[k].address?.endsWith('USA')) data[k]['countryCode'] = 'US';\r\n }\r\n m.set(k, data[k]);\r\n }\r\n models.set(doc.id, m);\r\n }\r\n });\r\n setCommonStore((state) => {\r\n state.modelSites = models;\r\n });\r\n return models;\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotLoadModelsOnMap', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n // get latest submission\r\n const fetchLatest = async () => {\r\n await firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('info')\r\n .get()\r\n .then((doc) => {\r\n if (doc.exists) {\r\n const data = doc.data();\r\n if (data && data.latestModel) {\r\n setCommonStore((state) => {\r\n // if it has been deleted, don't show\r\n let existing = false;\r\n const m = data.latestModel as ModelSite;\r\n if (m.author) {\r\n existing = !!state.peopleModels.get(m.author)?.get(Util.getModelKey(m));\r\n }\r\n state.latestModelSite = existing ? m : undefined;\r\n });\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n };\r\n\r\n const fetchPeopleModels = async () => {\r\n setLoading(true);\r\n await firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('people')\r\n .get()\r\n .then((doc) => {\r\n const data = doc.data();\r\n if (data) {\r\n const peopleModels = new Map>();\r\n for (const k in data) {\r\n peopleModels.set(k, new Map(Object.entries(data[k])));\r\n }\r\n setCommonStore((state) => {\r\n state.peopleModels = peopleModels;\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotLoadLeaderboard', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const deleteFromModelsMap = (model: ModelSite, successCallback?: Function) => {\r\n // pass if there is no user currently logged in\r\n if (user && user.uid) {\r\n firebase\r\n .firestore()\r\n .collection('models')\r\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\r\n .update({ [Util.getModelKey(model)]: firebase.firestore.FieldValue.delete() })\r\n .then(() => {\r\n showSuccess(i18n.t('message.ModelDeletedFromMap', lang));\r\n if (successCallback) successCallback();\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotDeleteModelFromMap', lang) + ': ' + error);\r\n });\r\n // remove the record from the leaderboard\r\n firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('people')\r\n .update({\r\n [(model.author ?? 'Anonymous') + '.' + Util.getModelKey(model)]: firebase.firestore.FieldValue.delete(),\r\n })\r\n .then(() => {\r\n // also remove the cached record\r\n setCommonStore((state) => {\r\n if (state.peopleModels) {\r\n state.peopleModels.delete(Util.getModelKey(model));\r\n usePrimitiveStore.setState((state) => {\r\n state.leaderboardFlag = true;\r\n });\r\n }\r\n });\r\n });\r\n // remove the record in the user's account\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .update({\r\n published: firebase.firestore.FieldValue.arrayRemove(model.title),\r\n })\r\n .then(() => {\r\n // also remove the cached record\r\n setCommonStore((state) => {\r\n if (state.user && state.user.published) {\r\n if (state.user.published.includes(model.title)) {\r\n const index = state.user.published.indexOf(model.title);\r\n if (index >= 0) {\r\n state.user.published.splice(index, 1);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n const likeModelsMap = (model: ModelSite, like: boolean, successCallback?: Function) => {\r\n // pass if there is no user currently logged in\r\n if (user && user.uid) {\r\n const modelKey = Util.getModelKey(model);\r\n // keep or remove a record of like in the user's account\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .update(\r\n like\r\n ? {\r\n likes: firebase.firestore.FieldValue.arrayUnion(modelKey),\r\n }\r\n : {\r\n likes: firebase.firestore.FieldValue.arrayRemove(modelKey),\r\n },\r\n )\r\n .then(() => {\r\n // ignore\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotLikeModelFromMap', lang) + ': ' + error);\r\n });\r\n // increment or decrement the likes counter\r\n const likeCountPath = modelKey + '.likeCount';\r\n firebase\r\n .firestore()\r\n .collection('models')\r\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\r\n .update(\r\n like\r\n ? {\r\n [likeCountPath]: firebase.firestore.FieldValue.increment(1),\r\n }\r\n : {\r\n [likeCountPath]: firebase.firestore.FieldValue.increment(-1),\r\n },\r\n )\r\n .then(() => {\r\n if (successCallback) successCallback();\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotLikeModelFromMap', lang) + ': ' + error);\r\n });\r\n }\r\n };\r\n\r\n const pinModelsMap = (model: ModelSite, pinned: boolean, successCallback?: Function) => {\r\n // pass if there is no user currently logged in\r\n if (user && user.uid) {\r\n firebase\r\n .firestore()\r\n .collection('models')\r\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\r\n .update({\r\n [Util.getModelKey(model) + '.pinned']: pinned,\r\n })\r\n .then(() => {\r\n if (successCallback) successCallback();\r\n })\r\n .catch((error) => {\r\n // ignore\r\n });\r\n }\r\n };\r\n\r\n // TODO:\r\n // unfortunately, this throws an error for users who do not log in\r\n // because of write access is only granted to registered users who log in.\r\n const countClicksModelsMap = (model: ModelSite) => {\r\n // pass if there is no user currently logged in\r\n if (user && user.uid) {\r\n firebase\r\n .firestore()\r\n .collection('models')\r\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\r\n .update({\r\n [Util.getModelKey(model) + '.clickCount']: firebase.firestore.FieldValue.increment(1),\r\n })\r\n .then(() => {\r\n // ignore\r\n })\r\n .catch((error) => {\r\n // ignore\r\n });\r\n }\r\n };\r\n\r\n // fetch owner's projects from the cloud\r\n const fetchMyProjects = async (silent: boolean) => {\r\n if (!user.uid) return;\r\n if (!silent) setLoading(true);\r\n myProjects.current = await firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .get()\r\n .then((querySnapshot) => {\r\n const a: ProjectInfo[] = [];\r\n querySnapshot.forEach((doc) => {\r\n const data = doc.data();\r\n a.push({\r\n owner: user.uid,\r\n title: doc.id,\r\n timestamp: data.timestamp,\r\n description: data.description,\r\n dataColoring: data.dataColoring,\r\n selectedProperty: data.selectedProperty,\r\n sortDescending: data.sortDescending,\r\n xAxisNameScatteredPlot: data.xAxisNameScatteredPlot,\r\n yAxisNameScatteredPlot: data.yAxisNameScatteredPlot,\r\n dotSizeScatteredPlot: data.dotSizeScatteredPlot,\r\n thumbnailWidth: data.thumbnailWidth,\r\n type: data.type,\r\n designs: data.designs ?? [],\r\n ranges: data.ranges ?? [],\r\n hiddenParameters: data.hiddenParameters ?? ProjectUtil.getDefaultHiddenParameters(data.type),\r\n counter: data.counter ?? 0,\r\n } as ProjectInfo);\r\n });\r\n return a;\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotOpenYourProjects', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n if (!silent) setLoading(false);\r\n });\r\n };\r\n\r\n const listMyProjects = (show: boolean) => {\r\n if (user.uid) {\r\n fetchMyProjects(!show).then(() => {\r\n if (show) {\r\n usePrimitiveStore.setState((state) => {\r\n state.showProjectListPanel = true;\r\n });\r\n }\r\n setUpdateProjectArrayFlag(!updateProjectArrayFlag);\r\n });\r\n }\r\n };\r\n\r\n const deleteProject = (title: string) => {\r\n if (!user.uid) return;\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .doc(title)\r\n .delete()\r\n .then(() => {\r\n if (myProjects.current && user.uid) {\r\n // also delete the designs of the deleted project\r\n for (const p of myProjects.current) {\r\n if (p.title === title && p.designs) {\r\n for (const d of p.designs) {\r\n setCommonStore((state) => {\r\n if (d.title === state.cloudFile) {\r\n state.cloudFile = undefined;\r\n }\r\n });\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('designs')\r\n .doc(d.title)\r\n .delete()\r\n .then(() => {\r\n // ignore\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n myProjects.current = myProjects.current.filter((e) => {\r\n return e.title !== title;\r\n });\r\n setUpdateFlag(!updateFlag);\r\n }\r\n setCommonStore((state) => {\r\n if (title === state.projectInfo.title) {\r\n state.projectInfo.title = null;\r\n state.projectInfo.description = null;\r\n state.projectInfo.dataColoring = DataColoring.ALL;\r\n state.projectInfo.selectedProperty = null;\r\n state.projectInfo.sortDescending = false;\r\n state.projectInfo.xAxisNameScatteredPlot = null;\r\n state.projectInfo.yAxisNameScatteredPlot = null;\r\n state.projectInfo.dotSizeScatteredPlot = 5;\r\n state.projectInfo.thumbnailWidth = 200;\r\n state.projectInfo.counter = 0;\r\n state.projectInfo.designs = [];\r\n state.projectInfo.ranges = [];\r\n state.projectInfo.hiddenParameters = ProjectUtil.getDefaultHiddenParameters(state.projectInfo.type);\r\n state.designProjectType = null;\r\n state.projectView = false;\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotDeleteProject', lang) + ': ' + error);\r\n });\r\n };\r\n\r\n const renameProject = (oldTitle: string, newTitle: string) => {\r\n // check if the new project title is already taken\r\n fetchMyProjects(false).then(() => {\r\n let exist = false;\r\n if (myProjects.current) {\r\n for (const p of myProjects.current) {\r\n if (p.title === newTitle) {\r\n exist = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (exist) {\r\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + newTitle);\r\n } else {\r\n if (!user.uid) return;\r\n const files = firebase.firestore().collection('users').doc(user.uid).collection('projects');\r\n files\r\n .doc(oldTitle)\r\n .get()\r\n .then((doc) => {\r\n if (doc && doc.exists) {\r\n const data = doc.data();\r\n if (data && user.uid) {\r\n const newData = { ...data };\r\n if (data.designs && data.designs.length > 0) {\r\n const newDesigns: Design[] = changeDesignTitles(newTitle, data.designs) ?? [];\r\n for (const [i, d] of data.designs.entries()) {\r\n copyDesign(d.title, newDesigns[i].title, data.owner, user.uid);\r\n }\r\n newData.designs = newDesigns;\r\n setCommonStore((state) => {\r\n state.projectInfo.designs = newDesigns;\r\n });\r\n }\r\n files\r\n .doc(newTitle)\r\n .set(newData)\r\n .then(() => {\r\n files\r\n .doc(oldTitle)\r\n .delete()\r\n .then(() => {\r\n // TODO\r\n });\r\n if (myProjects.current) {\r\n const newArray: ProjectInfo[] = [];\r\n for (const p of myProjects.current) {\r\n if (p.title === oldTitle) {\r\n newArray.push({\r\n owner: p.owner,\r\n timestamp: p.timestamp,\r\n title: newTitle,\r\n description: p.description,\r\n type: p.type,\r\n designs: p.designs,\r\n ranges: p.ranges ?? null,\r\n hiddenParameters: p.hiddenParameters,\r\n counter: p.counter,\r\n } as ProjectInfo);\r\n } else {\r\n newArray.push(p);\r\n }\r\n }\r\n myProjects.current = newArray;\r\n setUpdateFlag(!updateFlag);\r\n }\r\n setCommonStore((state) => {\r\n if (state.projectInfo.title === oldTitle) {\r\n state.projectInfo.title = newTitle;\r\n }\r\n });\r\n // TODO\r\n // change the address field of the browser when the project is currently open\r\n // const params = new URLSearchParams(window.location.search);\r\n // if (params.get('title') === oldTitle && params.get('userid') === user.uid) {\r\n // const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(newTitle);\r\n // window.history.pushState({}, document.title, newUrl);\r\n // }\r\n });\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotRenameProject', lang) + ': ' + error);\r\n });\r\n }\r\n });\r\n };\r\n\r\n const setProjectState = (projectInfo: ProjectInfo) => {\r\n setCommonStore((state) => {\r\n state.projectInfo = { ...projectInfo };\r\n state.projectImages.clear();\r\n state.projectView = true;\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\r\n state.updateProjectsFlag = true;\r\n });\r\n };\r\n\r\n const openDesignFile = (userid: string, title: string) => {\r\n if (userid && title) {\r\n setLoading(true);\r\n loadCloudFile(userid, title, true, true, viewOnly).finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n };\r\n\r\n const addDesignToProject = (\r\n projectType: string,\r\n projectTitle: string,\r\n designTitle: string,\r\n thumbnailWidth: number,\r\n ) => {\r\n if (!user.uid || !canvas) return;\r\n // create a thumbnail image of the design in Base64 format\r\n // (don't create a PNG and then store in Firebase storage as I can't get the blob data correctly)\r\n const thumbnail = Util.resizeCanvas(canvas, thumbnailWidth).toDataURL();\r\n const design = createDesign(projectType, designTitle, thumbnail);\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .doc(projectTitle)\r\n .update({\r\n designs: firebase.firestore.FieldValue.arrayUnion(design),\r\n counter: firebase.firestore.FieldValue.increment(1),\r\n })\r\n .then(() => {\r\n setCommonStore((state) => {\r\n state.projectInfo.designs?.push(design);\r\n // increment the local counter to be consistent with the database counter\r\n state.projectInfo.counter++;\r\n // store the project type in the design for linking it with the right type of project later\r\n state.designProjectType = state.projectInfo.type;\r\n state.cloudFile = design.title;\r\n });\r\n // regardless of where the design is, make a copy on the cloud\r\n saveToCloudWithoutCheckingExistence(designTitle, true, true);\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotAddDesignToProject', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const saveToCloud = (title: string, silent: boolean, checkExistence: boolean) => {\r\n if (!user.uid) return;\r\n const t = title.trim();\r\n if (t.length === 0) {\r\n showError(i18n.t('menu.file.SavingAbortedMustHaveValidTitle', lang) + '.');\r\n return;\r\n }\r\n setLoading(true);\r\n if (checkExistence) {\r\n fetchMyCloudFiles().then(() => {\r\n let exist = false;\r\n if (cloudFiles.current) {\r\n for (const p of cloudFiles.current) {\r\n if (p.fileName === t) {\r\n exist = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (exist) {\r\n Modal.confirm({\r\n title: i18n.t('message.CloudFileWithTitleExistsDoYouWantToOverwrite', lang),\r\n icon: ,\r\n onOk: () => {\r\n saveToCloudWithoutCheckingExistence(t, silent);\r\n },\r\n onCancel: () => {\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n },\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n saveToCloudWithoutCheckingExistence(t, silent);\r\n }\r\n });\r\n } else {\r\n saveToCloudWithoutCheckingExistence(t, silent);\r\n }\r\n setTitleDialogVisible(false);\r\n };\r\n\r\n const saveToCloudWithoutCheckingExistence = (title: string, silent: boolean, ofProject?: boolean) => {\r\n if (!user.uid) return;\r\n try {\r\n const doc = firebase.firestore().collection('users').doc(user.uid);\r\n if (doc) {\r\n if (localContentToImportAfterCloudFileUpdate) {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = true;\r\n });\r\n }\r\n doc\r\n .collection(ofProject ? 'designs' : 'files')\r\n .doc(title)\r\n .set(exportContent())\r\n .then(() => {\r\n if (!silent) {\r\n setCommonStore((state) => {\r\n state.cloudFile = title;\r\n });\r\n usePrimitiveStore.getState().setChanged(false);\r\n }\r\n if (localContentToImportAfterCloudFileUpdate) {\r\n if (localContentToImportAfterCloudFileUpdate === 'CREATE_NEW_FILE') {\r\n createEmptyFile();\r\n } else {\r\n importContent(localContentToImportAfterCloudFileUpdate);\r\n }\r\n } else {\r\n if (!ofProject) {\r\n const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(title);\r\n window.history.pushState({}, document.title, newUrl);\r\n }\r\n }\r\n if (showCloudFilePanel) {\r\n fetchMyCloudFiles().then(() => {\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotSaveYourFileToCloud', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n } catch (error) {\r\n showError(i18n.t('message.CannotSaveYourFileToCloud', lang) + ': ' + error);\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const openCloudFileWithSaveReminder = (userid: string, title: string) => {\r\n if (changed) {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n onOk: () => {\r\n if (cloudFile) {\r\n saveToCloud(cloudFile, true, false);\r\n openCloudFile(userid, title);\r\n } else {\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n }\r\n },\r\n onCancel: () => {\r\n openCloudFile(userid, title);\r\n },\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n openCloudFile(userid, title);\r\n }\r\n };\r\n\r\n const openCloudFileWithSaveReminderFromMap = (model: ModelSite) => {\r\n if (changed) {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n onOk: () => {\r\n if (cloudFile) {\r\n saveToCloud(cloudFile, true, false);\r\n openCloudFile(model.userid, model.title);\r\n countClicksModelsMap(model);\r\n } else {\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n }\r\n },\r\n onCancel: () => {\r\n openCloudFile(model.userid, model.title);\r\n countClicksModelsMap(model);\r\n },\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n openCloudFile(model.userid, model.title);\r\n countClicksModelsMap(model);\r\n }\r\n };\r\n\r\n const openCloudFile = (userid: string, title: string, popState?: boolean) => {\r\n if (userid && title) {\r\n setLoading(true);\r\n loadCloudFile(userid, title, false, popState, viewOnly).finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n };\r\n\r\n const fetchMyCloudFiles = async () => {\r\n if (!user.uid) return;\r\n setLoading(true);\r\n // fetch owner's file information from the cloud\r\n cloudFiles.current = await firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('files')\r\n .get()\r\n .then((querySnapshot) => {\r\n const a: CloudFileInfo[] = [];\r\n querySnapshot.forEach((doc) => {\r\n const data = doc.data();\r\n a.push({\r\n timestamp: data.timestamp,\r\n fileName: doc.id,\r\n userid: user.uid,\r\n uuid: data.docid,\r\n } as CloudFileInfo);\r\n });\r\n return a;\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotOpenCloudFolder', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const deleteCloudFile = (userid: string, title: string) => {\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(userid)\r\n .collection('files')\r\n .doc(title)\r\n .delete()\r\n .then(() => {\r\n setCloudFileArray(\r\n cloudFileArray.filter((e) => {\r\n return e.userid !== userid || e.title !== title;\r\n }),\r\n );\r\n setCommonStore((state) => {\r\n if (title === state.cloudFile) {\r\n state.cloudFile = undefined;\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\r\n });\r\n };\r\n\r\n const renameCloudFile = (userid: string, oldTitle: string, newTitle: string) => {\r\n const files = firebase.firestore().collection('users').doc(userid).collection('files');\r\n files\r\n .doc(oldTitle)\r\n .get()\r\n .then((doc) => {\r\n if (doc && doc.exists) {\r\n const data = doc.data();\r\n if (data) {\r\n files\r\n .doc(newTitle)\r\n .set(data)\r\n .then(() => {\r\n files\r\n .doc(oldTitle)\r\n .delete()\r\n .then(() => {\r\n // TODO\r\n });\r\n for (const f of cloudFileArray) {\r\n if (f.userid === userid && f.title === oldTitle) {\r\n f.title = newTitle;\r\n break;\r\n }\r\n }\r\n setCloudFileArray([...cloudFileArray]);\r\n setCommonStore((state) => {\r\n if (state.cloudFile === oldTitle) {\r\n state.cloudFile = newTitle;\r\n }\r\n });\r\n // change the address field of the browser when the cloud file is currently open\r\n const params = new URLSearchParams(window.location.search);\r\n if (params.get('title') === oldTitle && params.get('userid') === user.uid) {\r\n const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(newTitle);\r\n window.history.pushState({}, document.title, newUrl);\r\n }\r\n });\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotRenameCloudFile', lang) + ': ' + error);\r\n });\r\n };\r\n\r\n function updateCloudFile() {\r\n if (cloudFile) {\r\n saveToCloud(cloudFile, false, false);\r\n setTitle(cloudFile);\r\n }\r\n }\r\n\r\n function fetchModelSitesFn() {\r\n fetchModelSites().then(() => {\r\n fetchLatest().then(() => {\r\n // ignore for now\r\n });\r\n });\r\n }\r\n\r\n function fetchPeopleModelsFn() {\r\n fetchPeopleModels().then(() => {\r\n fetchLatest().then(() => {\r\n // ignore for now\r\n });\r\n });\r\n }\r\n\r\n function publishOnModelsMap() {\r\n if (user && user.uid && title) {\r\n // check if the user is the owner of the current model\r\n const params = new URLSearchParams(window.location.search);\r\n if (params.get('userid') === user.uid && params.get('title') === title) {\r\n const m = {\r\n latitude,\r\n longitude,\r\n address: address ?? null,\r\n countryCode: countryCode ?? null,\r\n type: useStore.getState().modelType,\r\n author: useStore.getState().modelAuthor ?? user.displayName,\r\n userid: user.uid,\r\n title,\r\n label: useStore.getState().modelLabel,\r\n description: useStore.getState().modelDescription,\r\n timeCreated: Date.now(),\r\n } as ModelSite;\r\n const modelKey = Util.getModelKey(m);\r\n const collection = firebase.firestore().collection('models');\r\n if (collection) {\r\n // first we upload a thumbnail of the model to Firestore Cloud Storage\r\n const storageRef = firebase.storage().ref();\r\n if (canvas) {\r\n const thumbnail = Util.resizeCanvas(canvas, 200);\r\n thumbnail.toBlob((blob) => {\r\n if (blob) {\r\n const metadata = { contentType: 'image/png' };\r\n const uploadTask = storageRef.child('images/' + modelKey + '.png').put(blob, metadata);\r\n // Listen for state changes, errors, and completion of the upload.\r\n uploadTask.on(\r\n firebase.storage.TaskEvent.STATE_CHANGED,\r\n (snapshot) => {\r\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\r\n if (progress > 0) {\r\n showInfo(i18n.t('word.Upload', lang) + ': ' + progress + '%');\r\n }\r\n },\r\n (error) => {\r\n showError('Storage: ' + error);\r\n },\r\n () => {\r\n uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {\r\n const m2 = { ...m, thumbnailUrl: downloadURL } as ModelSite;\r\n // after we get a download URL for the thumbnail image, we then go on to upload other data\r\n const document = collection.doc(Util.getLatLngKey(latitude, longitude));\r\n document\r\n .get()\r\n .then((doc) => {\r\n if (doc.exists) {\r\n const data = doc.data();\r\n if (data && data[modelKey]) {\r\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\r\n showSuccess(i18n.t('menu.file.UpdatedOnModelsMap', lang) + '.');\r\n });\r\n } else {\r\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\r\n showSuccess(i18n.t('menu.file.PublishedOnModelsMap', lang) + '.');\r\n });\r\n }\r\n } else {\r\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\r\n showSuccess(i18n.t('menu.file.PublishedOnModelsMap', lang) + '.');\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotPublishModelOnMap', lang) + ': ' + error);\r\n });\r\n // add to the leaderboard\r\n firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('people')\r\n .update({\r\n [(m2.author ?? 'Anonymous') + '.' + Util.getModelKey(m2)]: m2,\r\n })\r\n .then(() => {\r\n // update the cache\r\n setCommonStore((state) => {\r\n if (state.peopleModels) {\r\n const models = state.peopleModels.get(m2.author ?? 'Anonymous');\r\n if (models) {\r\n models.set(Util.getModelKey(m2), m2);\r\n }\r\n }\r\n });\r\n });\r\n // notify info\r\n firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('info')\r\n .set({ latestModel: m2 }, { merge: true })\r\n .then(() => {\r\n // TODO\r\n });\r\n });\r\n },\r\n );\r\n }\r\n });\r\n }\r\n }\r\n // keep a record of the published model in the user's account\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .update(\r\n useStore.getState().modelAuthor === user.displayName\r\n ? {\r\n published: firebase.firestore.FieldValue.arrayUnion(title),\r\n }\r\n : {\r\n published: firebase.firestore.FieldValue.arrayUnion(title),\r\n aliases: firebase.firestore.FieldValue.arrayUnion(useStore.getState().modelAuthor),\r\n },\r\n )\r\n .then(() => {\r\n // update the cache\r\n setCommonStore((state) => {\r\n if (state.user) {\r\n if (!state.user.published) state.user.published = [];\r\n if (!state.user.published.includes(title)) {\r\n state.user.published.push(title);\r\n }\r\n if (!state.user.aliases) state.user.aliases = [];\r\n if (\r\n state.modelAuthor &&\r\n !state.user.aliases.includes(state.modelAuthor) &&\r\n state.modelAuthor !== user.displayName\r\n ) {\r\n state.user.aliases.push(state.modelAuthor);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n function createNewProject() {\r\n if (!user || !user.uid) return;\r\n const title = usePrimitiveStore.getState().projectTitle;\r\n if (!title) {\r\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\r\n return;\r\n }\r\n const t = title.trim();\r\n if (t.length === 0) {\r\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\r\n return;\r\n }\r\n // check if the project title is already used\r\n fetchMyProjects(false).then(() => {\r\n let exist = false;\r\n if (myProjects.current) {\r\n for (const p of myProjects.current) {\r\n if (p.title === t) {\r\n exist = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (exist) {\r\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + t);\r\n } else {\r\n if (user && user.uid) {\r\n const type = usePrimitiveStore.getState().projectType ?? DesignProblem.SOLAR_PANEL_ARRAY;\r\n const description = usePrimitiveStore.getState().projectDescription ?? null;\r\n const timestamp = new Date().getTime();\r\n const counter = 0;\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .doc(t)\r\n .set({\r\n owner: user.uid,\r\n timestamp,\r\n type,\r\n description,\r\n counter,\r\n designs: [],\r\n hiddenParameters: ProjectUtil.getDefaultHiddenParameters(type),\r\n })\r\n .then(() => {\r\n setCommonStore((state) => {\r\n state.projectView = true;\r\n // update the local copy as well\r\n state.projectInfo.owner = user.uid;\r\n state.projectInfo.type = type;\r\n state.projectInfo.title = title;\r\n state.projectInfo.description = description;\r\n state.projectInfo.counter = 0;\r\n state.projectInfo.dataColoring = DataColoring.ALL;\r\n state.projectInfo.selectedProperty = null;\r\n state.projectInfo.sortDescending = false;\r\n state.projectInfo.xAxisNameScatteredPlot = null;\r\n state.projectInfo.yAxisNameScatteredPlot = null;\r\n state.projectInfo.dotSizeScatteredPlot = 5;\r\n state.projectInfo.thumbnailWidth = 200;\r\n state.projectInfo.designs = [];\r\n state.projectInfo.ranges = [];\r\n state.projectInfo.hiddenParameters = ProjectUtil.getDefaultHiddenParameters(state.projectInfo.type);\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotCreateNewProject', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n // if the project list panel is open, update it\r\n if (showProjectListPanel) {\r\n fetchMyProjects(false).then(() => {\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n function saveProjectAs() {\r\n if (!user || !user.uid) return;\r\n const title = usePrimitiveStore.getState().projectTitle;\r\n if (!title) {\r\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\r\n return;\r\n }\r\n const t = title.trim();\r\n if (t.length === 0) {\r\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\r\n return;\r\n }\r\n // check if the project title is already taken\r\n fetchMyProjects(false).then(() => {\r\n let exist = false;\r\n if (myProjects.current) {\r\n for (const p of myProjects.current) {\r\n if (p.title === t) {\r\n exist = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (exist) {\r\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + t);\r\n } else {\r\n if (user && user.uid) {\r\n const designs = useStore.getState().projectInfo.designs;\r\n if (designs) {\r\n const type = usePrimitiveStore.getState().projectType;\r\n const description = usePrimitiveStore.getState().projectDescription;\r\n const owner = useStore.getState().projectInfo.owner;\r\n const timestamp = new Date().getTime();\r\n const counter = useStore.getState().projectInfo.counter;\r\n const dataColoring = useStore.getState().projectInfo.dataColoring ?? null;\r\n const selectedProperty = useStore.getState().projectInfo.selectedProperty ?? null;\r\n const sortDescending = !!useStore.getState().projectInfo.sortDescending;\r\n const xAxisNameScatteredPlot = useStore.getState().projectInfo.xAxisNameScatteredPlot ?? 'rowWidth';\r\n const yAxisNameScatteredPlot = useStore.getState().projectInfo.yAxisNameScatteredPlot ?? 'rowWidth';\r\n const dotSizeScatteredPlot = useStore.getState().projectInfo.dotSizeScatteredPlot ?? 5;\r\n const thumbnailWidth = useStore.getState().projectInfo.thumbnailWidth ?? 200;\r\n const newDesigns: Design[] = changeDesignTitles(t, designs) ?? [];\r\n for (const [i, d] of designs.entries()) {\r\n copyDesign(d.title, newDesigns[i].title, owner, user.uid);\r\n }\r\n const projectImages = useStore.getState().projectImages;\r\n if (projectImages && projectImages.size > 0) {\r\n for (const [i, d] of designs.entries()) {\r\n const image = projectImages.get(d.title);\r\n if (image) {\r\n newDesigns[i].thumbnail = getImageData(image);\r\n }\r\n }\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .doc(t)\r\n .set({\r\n owner: user.uid,\r\n timestamp,\r\n type,\r\n description,\r\n counter,\r\n dataColoring,\r\n selectedProperty,\r\n sortDescending,\r\n xAxisNameScatteredPlot,\r\n yAxisNameScatteredPlot,\r\n dotSizeScatteredPlot,\r\n thumbnailWidth,\r\n designs: newDesigns,\r\n ranges: useStore.getState().projectInfo.ranges ?? null,\r\n hiddenParameters: useStore.getState().projectInfo.hiddenParameters,\r\n })\r\n .then(() => {\r\n setCommonStore((state) => {\r\n state.projectView = true;\r\n state.projectInfo.owner = user.uid;\r\n state.projectInfo.type = type;\r\n state.projectInfo.title = title;\r\n state.projectInfo.description = description;\r\n state.projectInfo.designs = newDesigns;\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotCreateNewProject', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n if (showProjectListPanel) {\r\n fetchMyProjects(false).then(() => {\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function curateDesignToProject() {\r\n const projectOwner = useStore.getState().projectInfo.owner;\r\n if (user.uid !== projectOwner) {\r\n showInfo(i18n.t('message.CannotAddDesignToProjectOwnedByOthers', lang));\r\n } else {\r\n const projectTitle = useStore.getState().projectInfo.title;\r\n if (projectTitle) {\r\n setLoading(true);\r\n const projectType = useStore.getState().projectInfo.type ?? DesignProblem.SOLAR_PANEL_ARRAY;\r\n const thumbnailWidth = useStore.getState().projectInfo.thumbnailWidth ?? 200;\r\n const counter = useStore.getState().projectInfo.counter ?? 0;\r\n addDesignToProject(projectType, projectTitle, projectTitle + ' ' + counter, thumbnailWidth);\r\n }\r\n }\r\n }\r\n\r\n function listMyCloudFiles() {\r\n if (!user.uid) return;\r\n fetchMyCloudFiles().then(() => {\r\n usePrimitiveStore.setState((state) => {\r\n state.showCloudFilePanel = true;\r\n });\r\n });\r\n }\r\n\r\n function showMyProjectsList() {\r\n listMyProjects(true);\r\n }\r\n\r\n function hideMyProjectsList() {\r\n listMyProjects(false);\r\n setUpdateFlag(!updateFlag);\r\n }\r\n\r\n return viewOnly ? (\r\n <>\r\n {openModelsMap && (\r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n {loading && }\r\n loading}\r\n setTitle={setTitle}\r\n getTitle={() => title}\r\n setTitleDialogVisible={setTitleDialogVisible}\r\n isTitleDialogVisible={() => titleDialogVisible}\r\n />\r\n \r\n {showCloudFilePanel && cloudFiles.current && (\r\n \r\n )}\r\n {showProjectListPanel && myProjects.current && (\r\n \r\n )}\r\n {showModelsGallery && (\r\n {\r\n setPrimitiveStore('showModelsGallery', false);\r\n authorModelsRef.current = undefined;\r\n }}\r\n />\r\n )}\r\n {showAccountSettingsPanel && }\r\n {openModelsMap && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(CloudManager);\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport firebase from 'firebase/app';\nimport 'firebase/database';\nimport dayjs from 'dayjs';\nimport { ClassID, FirebaseName, SchoolID } from './types';\n\nconst ActionLogger = () => {\n const actionInfo = useStore(Selector.actionInfo);\n const currentUndoable = useStore(Selector.currentUndoable);\n const user = useStore(Selector.user);\n const cloudFile = useStore(Selector.cloudFile);\n\n const firstCallUndo = useRef(true);\n const firstCallAction = useRef(true);\n const databaseRef = useRef();\n const schoolID = user.schoolID ?? SchoolID.UNKNOWN;\n const classID = user.classID ?? ClassID.UNKNOWN;\n\n useEffect(() => {\n const config = {\n apiKey: process.env.REACT_APP_FIREBASE_API_KEY,\n authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,\n projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,\n storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,\n databaseURL: process.env.REACT_APP_FIREBASE_LOGGER_DATABASE_URL,\n messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,\n appId: process.env.REACT_APP_FIREBASE_APP_ID,\n };\n let app = undefined;\n for (const a of firebase.apps) {\n if (a.name === FirebaseName.LOG_DATA) {\n app = a;\n break;\n }\n }\n if (!app) {\n app = firebase.initializeApp(config, FirebaseName.LOG_DATA);\n }\n if (app) {\n databaseRef.current = firebase.database(app);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (firstCallUndo.current) {\n firstCallUndo.current = false;\n } else {\n if (currentUndoable) {\n // we cannot use hh:mm:SSS as suggested by dayjs's format documentation\n // because SSS only takes the last three digits of the millisecond string,\n // resulting in incorrect ordering of the log. so we use the millisecond string\n // to ensure the order and use the formatted string to provide readability.\n const timestamp =\n currentUndoable.timestamp +\n ' (' +\n dayjs(new Date(currentUndoable.timestamp)).format('MM-DD-YYYY hh:mm A') +\n ')';\n databaseRef.current.ref(schoolID + '/' + classID + '/' + user.uid + '/' + timestamp).set({\n file: cloudFile ?? 'Untitled',\n action: JSON.stringify(currentUndoable),\n });\n }\n }\n }, [currentUndoable, user.uid, classID, schoolID, cloudFile]);\n\n useEffect(() => {\n if (firstCallAction.current) {\n firstCallAction.current = false;\n } else {\n if (actionInfo) {\n const timestamp =\n actionInfo.timestamp + ' (' + dayjs(new Date(actionInfo.timestamp)).format('MM-DD-YYYY hh:mm A') + ')';\n databaseRef.current.ref(schoolID + '/' + classID + '/' + user.uid + '/' + timestamp).set({\n file: cloudFile ?? 'Untitled',\n action: JSON.stringify(actionInfo),\n });\n }\n }\n }, [actionInfo, user.uid, classID, schoolID, cloudFile]);\n\n return <>;\n};\n\nexport default React.memo(ActionLogger);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useRef } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport { DirectionalLight } from 'three';\nimport { DEFAULT_FAR, STARLIGHT_INTENSITY, UNIT_VECTOR_POS_Z } from './constants';\n\nconst Lights = () => {\n const directLightIntensity = useStore(Selector.viewState.directLightIntensity);\n const ambientLightIntensity = useStore(Selector.viewState.ambientLightIntensity);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const sceneRadius = useStore(Selector.sceneRadius);\n const positionExtent = 2 * sceneRadius;\n const cameraExtent = sceneRadius + 100;\n\n const ref = useRef();\n\n if (ref.current) {\n ref.current.shadow.camera.left = -cameraExtent;\n ref.current.shadow.camera.bottom = -cameraExtent;\n ref.current.shadow.camera.right = cameraExtent;\n ref.current.shadow.camera.top = cameraExtent;\n ref.current.shadow.camera.updateProjectionMatrix();\n }\n\n const day = sunlightDirection.z > 0;\n const dot = day ? sunlightDirection.normalize().dot(UNIT_VECTOR_POS_Z) : 0;\n\n return (\n <>\n \n \n \n );\n};\n\nexport default React.memo(Lights);\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { Euler, FontLoader, TextGeometryParameters } from 'three';\r\nimport { useLoader } from '@react-three/fiber';\r\nimport { Line } from '@react-three/drei';\r\nimport helvetikerFont from '../fonts/helvetiker_regular.typeface.fnt';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { HALF_PI } from '../constants';\r\nimport { ObjectType, ResizeHandleType } from '../types';\r\nimport { RoofModel } from '../models/RoofModel';\r\n\r\nexport const VerticalRuler = ({ element }: { element: ElementModel }) => {\r\n const cameraDirection = useStore(Selector.cameraDirection);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const getResizeHandlePosition = useStore(Selector.getResizeHandlePosition);\r\n\r\n const isRoof = element.type === ObjectType.Roof;\r\n const color = 'lightGray';\r\n const font = useLoader(FontLoader, helvetikerFont);\r\n const textGeometryParamsTickLabel = {\r\n font: font,\r\n height: 0,\r\n size: 0.2,\r\n } as TextGeometryParameters;\r\n const textGeometryParams = {\r\n font: font,\r\n height: 0,\r\n size: 0.35,\r\n } as TextGeometryParameters;\r\n\r\n const position = useMemo(() => {\r\n const handle = resizeHandleType ?? hoveredHandle;\r\n return getResizeHandlePosition(element, handle as ResizeHandleType);\r\n }, [resizeHandleType, hoveredHandle]);\r\n\r\n const rotation = useMemo(() => {\r\n const rotation = -Math.atan2(cameraDirection.x, cameraDirection.y) + Math.PI;\r\n return new Euler(HALF_PI, 0, rotation, 'ZXY');\r\n }, [cameraDirection.x, cameraDirection.y]);\r\n\r\n const getRulerLength = () => {\r\n let height = element.lz;\r\n if (isRoof) {\r\n height = useStore.getState().selectedElementHeight;\r\n }\r\n return Math.ceil(height) + 1;\r\n };\r\n\r\n const getHeightText = () => {\r\n let height = element.lz;\r\n if (isRoof) {\r\n height = (element as RoofModel).rise;\r\n }\r\n return height.toFixed(1) + ' m';\r\n };\r\n\r\n const getTextPositionZ = () => {\r\n if (isRoof) {\r\n return useStore.getState().selectedElementHeight + 1;\r\n }\r\n return element.lz - 0.175;\r\n };\r\n\r\n if (!resizeHandleType && !hoveredHandle) return null;\r\n\r\n const rulerLength = getRulerLength();\r\n const heightText = getHeightText();\r\n const textPositionZ = getTextPositionZ();\r\n const tickLabels = new Array(rulerLength + 1).fill(0);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {tickLabels.map((e, i) => {\r\n const len = 0.2 + (i % 5 === 0 ? 0.05 : 0);\r\n const textGeometry = ;\r\n return (\r\n \r\n \r\n {!isRoof && (\r\n \r\n {textGeometry}\r\n \r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(VerticalRuler);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { HALF_PI } from './constants';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType, RoofHandleType, RotateHandleType } from './types';\r\nimport { PolarGrid } from './views/polarGrid';\r\nimport { VerticalRuler } from './views/verticalRuler';\r\nimport { Util } from './Util';\r\n\r\nexport const Auxiliary = () => {\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const rotateHandleType = useStore(Selector.rotateHandleType);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const addedCuboidId = useStore(Selector.addedCuboidId);\r\n const addedFoundationId = useStore(Selector.addedFoundationId);\r\n\r\n const element = useStore((state) => {\r\n if (state.selectedElement) {\r\n const selectedElementId = state.selectedElement.id;\r\n return state.elements.find((e) => e.id === selectedElementId);\r\n }\r\n });\r\n\r\n const [showGrid, setShowGrid] = useState(false);\r\n const [gridSize, setGridSize] = useState(2 * sceneRadius);\r\n const [gridDivisions, setDivisions] = useState(2 * sceneRadius);\r\n\r\n useEffect(() => {\r\n const unit = Math.floor(sceneRadius / 50) + 1;\r\n const divisions = Math.round(sceneRadius / unit) * 2;\r\n setGridSize(divisions * unit);\r\n setDivisions(divisions);\r\n }, [sceneRadius]);\r\n\r\n useEffect(() => {\r\n if (resizeHandleType) {\r\n const changeHeight =\r\n Util.isTopResizeHandle(resizeHandleType) ||\r\n (resizeHandleType === ResizeHandleType.UpperLeft && element?.type === ObjectType.Wall) ||\r\n (resizeHandleType === ResizeHandleType.UpperRight && element?.type === ObjectType.Wall);\r\n setShowGrid(!changeHeight);\r\n } else {\r\n setShowGrid(false);\r\n }\r\n }, [resizeHandleType]);\r\n\r\n // only these elements are allowed to be on the ground\r\n const legalOnGround = () => {\r\n if (!element) return false;\r\n const type = element.type;\r\n return (\r\n type === ObjectType.Foundation ||\r\n type === ObjectType.Cuboid ||\r\n (type === ObjectType.Tree && element.parentId === ObjectType.Ground) ||\r\n (type === ObjectType.Human && element.parentId === ObjectType.Ground)\r\n );\r\n };\r\n\r\n const showPolarGridByHover = hoveredHandle === RotateHandleType.Lower || hoveredHandle === RotateHandleType.Upper;\r\n\r\n const showVerticalRulerHelper = (\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ) => {\r\n return (\r\n Util.isTopResizeHandle(handle) ||\r\n (element?.type === ObjectType.Wall && Util.isTopResizeHandleOfWall(handle)) ||\r\n (element?.type === ObjectType.Roof && Util.isRiseHandleOfRoof(handle))\r\n );\r\n };\r\n\r\n const handle = resizeHandleType ?? hoveredHandle;\r\n\r\n const showVerticalRuler = showVerticalRulerHelper(handle);\r\n\r\n if (!element) return null;\r\n\r\n return (\r\n <>\r\n {(((showGrid || moveHandleType || Util.isMoveHandle(hoveredHandle)) && !groundImage && legalOnGround()) ||\r\n addedCuboidId ||\r\n addedFoundationId) && (\r\n \r\n )}\r\n {(rotateHandleType || showPolarGridByHover) && element && legalOnGround() && }\r\n {showVerticalRuler && }\r\n \r\n );\r\n};\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { useLanguage } from './views/hooks';\r\nimport i18n from './i18n/i18n';\r\n\r\nconst STYLE_SIZE = 120;\r\nconst BLACK = 'black';\r\nconst WHITE = 'white';\r\n\r\nconst Compass = ({ visible = true }: { visible: boolean }) => {\r\n const canvasRef = useRef(null);\r\n\r\n const lang = useLanguage();\r\n\r\n const PIXEL_RATIO = window.devicePixelRatio;\r\n const CANVAS_SIZE = STYLE_SIZE * PIXEL_RATIO;\r\n const scale = CANVAS_SIZE / 150;\r\n\r\n const fontSize = 20 * scale;\r\n const FONT = fontSize + 'px serif';\r\n\r\n useEffect(() => {\r\n if (canvasRef.current) {\r\n useRefStore.setState((state) => {\r\n state.compassRef = canvasRef;\r\n });\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!canvasRef.current) return;\r\n const ctx = canvasRef.current.getContext('2d') as CanvasRenderingContext2D;\r\n if (!ctx) return;\r\n\r\n // all these numbers are based on 150px\r\n const pointerLength = 55 * scale;\r\n const pointerHalfWidth = 10 * scale;\r\n\r\n const outerRingRadius = 40 * scale;\r\n const outerRingWidth = 5 * scale;\r\n const innerRingRadius = 30 * scale;\r\n const innerRingWidth = 1 * scale;\r\n const outlineWidth = 1 * scale;\r\n\r\n const fontToEdge = 15 * scale;\r\n\r\n const center = CANVAS_SIZE / 2;\r\n\r\n ctx.clearRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);\r\n\r\n // outer ring\r\n ctx.beginPath();\r\n ctx.arc(center, center, outerRingRadius, 0, Math.PI * 2);\r\n ctx.lineWidth = outerRingWidth;\r\n ctx.strokeStyle = BLACK;\r\n ctx.stroke();\r\n\r\n // inner ring\r\n ctx.beginPath();\r\n ctx.arc(center, center, innerRingRadius, 0, Math.PI * 2);\r\n ctx.lineWidth = innerRingWidth;\r\n ctx.strokeStyle = BLACK;\r\n ctx.stroke();\r\n\r\n ctx.lineWidth = outlineWidth;\r\n\r\n // pointer - N\r\n ctx.beginPath();\r\n ctx.moveTo(center, center - pointerLength);\r\n ctx.lineTo(center - pointerHalfWidth, center - pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = WHITE;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(center, center - pointerLength);\r\n ctx.lineTo(center + pointerHalfWidth, center - pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = BLACK;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n // pointer - S\r\n ctx.beginPath();\r\n ctx.moveTo(center, center + pointerLength);\r\n ctx.lineTo(center - pointerHalfWidth, center + pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = BLACK;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(center, center + pointerLength);\r\n ctx.lineTo(center + pointerHalfWidth, center + pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = WHITE;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n // pointer - W\r\n ctx.beginPath();\r\n ctx.moveTo(center - pointerLength, center);\r\n ctx.lineTo(center - pointerHalfWidth, center - pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = BLACK;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(center - pointerLength, center);\r\n ctx.lineTo(center - pointerHalfWidth, center + pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = WHITE;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n // pointer - E\r\n ctx.beginPath();\r\n ctx.moveTo(center + pointerLength, center);\r\n ctx.lineTo(center + pointerHalfWidth, center - pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = WHITE;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(center + pointerLength, center);\r\n ctx.lineTo(center + pointerHalfWidth, center + pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = BLACK;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n // text\r\n ctx.font = FONT;\r\n ctx.fillStyle = WHITE;\r\n ctx.textAlign = 'center';\r\n\r\n ctx.fillText(`${i18n.t('compass.N', lang)}`, center, fontToEdge);\r\n\r\n ctx.save();\r\n ctx.translate(CANVAS_SIZE, CANVAS_SIZE);\r\n ctx.rotate(Math.PI);\r\n ctx.fillText(`${i18n.t('compass.S', lang)}`, center, fontToEdge);\r\n ctx.restore();\r\n\r\n ctx.fillStyle = BLACK;\r\n\r\n ctx.save();\r\n ctx.translate(0, CANVAS_SIZE);\r\n ctx.rotate(-Math.PI / 2);\r\n ctx.fillText(`${i18n.t('compass.W', lang)}`, center, fontToEdge);\r\n ctx.restore();\r\n\r\n ctx.save();\r\n ctx.translate(CANVAS_SIZE, 0);\r\n ctx.rotate(Math.PI / 2);\r\n ctx.fillText(`${i18n.t('compass.E', lang)}`, center, fontToEdge);\r\n ctx.restore();\r\n }, [lang]);\r\n\r\n if (!visible) return null;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Compass);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport { ActionInfo, ObjectType } from './types';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { UndoableDelete, UndoableDeleteMultiple } from './undo/UndoableDelete';\r\nimport { UndoablePaste } from './undo/UndoablePaste';\r\nimport { UndoableCheck } from './undo/UndoableCheck';\r\nimport { UndoableResetView } from './undo/UndoableResetView';\r\nimport { showError, showInfo } from './helpers';\r\nimport i18n from './i18n/i18n';\r\nimport { UndoableMoveInX } from './undo/UndoableMoveInX';\r\nimport { UndoableMoveInY } from './undo/UndoableMoveInY';\r\nimport KeyboardEventHandler from 'react-keyboard-event-handler';\r\nimport { WallModel } from './models/WallModel';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { SolarPanelModel } from './models/SolarPanelModel';\r\nimport { Util } from './Util';\r\nimport { ElementModel } from './models/ElementModel';\r\nimport { GRID_RATIO, GROUND_ID, HOME_URL, UNDO_SHOW_INFO_DURATION } from './constants';\r\nimport { RoofUtil } from './views/roof/RoofUtil';\r\nimport { RoofModel } from './models/RoofModel';\r\nimport { spBoundaryCheck, spCollisionCheck } from './views/roof/roofRenderer';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { debounce } from 'lodash';\r\n\r\nexport interface KeyboardListenerProps {\r\n canvas?: HTMLCanvasElement | null;\r\n set2DView: (selected: boolean) => void;\r\n setNavigationView: (selected: boolean) => void;\r\n resetView: () => void;\r\n zoomView: (scale: number) => void;\r\n}\r\n\r\nconst AutoDeletionListener = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\r\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const listenToAutoDeletionByDeleteRef = useRef(false);\r\n const listenToAutoDeletionByCutRef = useRef(false);\r\n\r\n useStore(Selector.autoDeletedRoofIdSet);\r\n useStore(Selector.autoDeletedChild);\r\n usePrimitiveStore((state) => state.selectedElementId);\r\n\r\n useEffect(() => {\r\n useRefStore.setState((state) => {\r\n state.listenToAutoDeletionByDeleteRef = listenToAutoDeletionByDeleteRef;\r\n state.listenToAutoDeletionByCutRef = listenToAutoDeletionByCutRef;\r\n });\r\n }, []);\r\n\r\n const handleUndoAutoDeletion = debounce(() => {\r\n const selectedElementId = usePrimitiveStore.getState().selectedElementId;\r\n const selectedElementIdSet = useStore.getState().selectedElementIdSet;\r\n if (!selectedElementId || selectedElementIdSet.size === 0) return;\r\n\r\n const autoDeletedElements = useStore.getState().getAutoDeletedElements();\r\n if (!autoDeletedElements) return;\r\n\r\n const manualDeletedElements = useStore.getState().deletedElements;\r\n const manualCutElements = useStore.getState().elementsToPaste;\r\n\r\n const listenToAutoDeletionByCut = useRefStore.getState().listenToAutoDeletionByCutRef?.current;\r\n const listenToAutoDeletionByDelete = useRefStore.getState().listenToAutoDeletionByDeleteRef?.current;\r\n\r\n let combined: ElementModel[] = [];\r\n let undoName: string = '';\r\n if (listenToAutoDeletionByCut) {\r\n useRefStore.getState().setListenToAutoDeletionByCut(false);\r\n combined = [...manualCutElements, ...autoDeletedElements];\r\n undoName = 'Cut';\r\n } else if (listenToAutoDeletionByDelete) {\r\n useRefStore.getState().setListenToAutoDeletionByDelete(false);\r\n combined = [...manualDeletedElements, ...autoDeletedElements];\r\n undoName = 'Delete';\r\n }\r\n\r\n const undoableDeleteMultiple = {\r\n name: undoName,\r\n timestamp: Date.now(),\r\n deletedElements: [...combined],\r\n selectedElementId: selectedElementId,\r\n selectedElementIdSet: new Set(selectedElementIdSet),\r\n undo() {\r\n const deletedElements = undoableDeleteMultiple.deletedElements;\r\n if (!deletedElements || deletedElements.length === 0) return;\r\n\r\n for (const e of this.deletedElements) {\r\n if (e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n if (wall.leftJoints.length > 0) {\r\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\r\n }\r\n } else if (e.type === ObjectType.Roof) {\r\n setCommonStore((state) => {\r\n state.addedRoofIdSet.add(e.id);\r\n });\r\n }\r\n }\r\n\r\n const selectedElement = deletedElements.find((e) => e.id === this.selectedElementId) ?? null;\r\n\r\n setCommonStore((state) => {\r\n state.elements.push(...deletedElements);\r\n state.selectedElement = selectedElement;\r\n state.selectedElementIdSet = new Set(this.selectedElementIdSet);\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.deletedRoofIdSet.clear();\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n });\r\n },\r\n redo() {\r\n if (undoableDeleteMultiple.deletedElements.length === 0) return;\r\n setCommonStore((state) => {\r\n state.selectedElement = state.elements.find((e) => e.id === this.selectedElementId) ?? null;\r\n state.selectedElementIdSet = new Set(this.selectedElementIdSet);\r\n });\r\n useStore.getState().removeSelectedElements();\r\n },\r\n } as UndoableDeleteMultiple;\r\n addUndoable(undoableDeleteMultiple);\r\n\r\n setCommonStore((state) => {\r\n state.selectedElement = null;\r\n state.selectedElementIdSet.clear();\r\n state.deletedRoofId = null;\r\n state.deletedRoofIdSet.clear();\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n });\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', null);\r\n }, 50);\r\n\r\n const listenToAutoDeletion =\r\n useRefStore.getState().listenToAutoDeletionByCutRef?.current ||\r\n useRefStore.getState().listenToAutoDeletionByDeleteRef?.current;\r\n\r\n if (listenToAutoDeletion && useStore.getState().getAutoDeletedElements()) {\r\n handleUndoAutoDeletion();\r\n }\r\n\r\n return null;\r\n});\r\n\r\nconst handleKeys = [\r\n 'left',\r\n 'up',\r\n 'right',\r\n 'down',\r\n 'shift+left',\r\n 'shift+up',\r\n 'shift+right',\r\n 'shift+down',\r\n 'ctrl+shift+left',\r\n 'ctrl+shift+up',\r\n 'ctrl+shift+right',\r\n 'ctrl+shift+down',\r\n 'meta+shift+left',\r\n 'meta+shift+up',\r\n 'meta+shift+right',\r\n 'meta+shift+down',\r\n 'ctrl+f',\r\n 'meta+f',\r\n 'ctrl+o',\r\n 'meta+o',\r\n 'ctrl+s',\r\n 'meta+s',\r\n 'ctrl+c',\r\n 'meta+c',\r\n 'ctrl+x',\r\n 'meta+x',\r\n 'ctrl+v',\r\n 'meta+v',\r\n 'ctrl+[',\r\n 'meta+[',\r\n 'ctrl+]',\r\n 'meta+]',\r\n 'ctrl+z',\r\n 'meta+z',\r\n 'ctrl+y',\r\n 'meta+y',\r\n 'ctrl+m',\r\n 'meta+m',\r\n 'ctrl+u', // navigation controls\r\n 'meta+u',\r\n 'ctrl+b',\r\n 'meta+b',\r\n 'shift',\r\n 'esc',\r\n 'ctrl+home',\r\n 'ctrl+alt+h',\r\n 'ctrl+shift+o',\r\n 'meta+shift+o',\r\n 'ctrl+shift+s',\r\n 'meta+shift+s',\r\n 'delete',\r\n 'backspace',\r\n 'alt+backspace',\r\n 'f2',\r\n 'f4',\r\n 'ctrl',\r\n];\r\n\r\nconst KeyboardListener = ({ canvas, set2DView, setNavigationView, resetView, zoomView }: KeyboardListenerProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const loggable = useStore(Selector.loggable);\r\n const selectNone = useStore(Selector.selectNone);\r\n const language = useStore(Selector.language);\r\n const undoManager = useStore(Selector.undoManager);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const getElementById = useStore(Selector.getElementById);\r\n const copyElementById = useStore(Selector.copyElementById);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const pasteElements = useStore(Selector.pasteElementsByKey);\r\n const getParent = useStore(Selector.getParent);\r\n const updateElementCxById = useStore(Selector.updateElementCxById);\r\n const updateElementCyById = useStore(Selector.updateElementCyById);\r\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\r\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\r\n const setEnableFineGrid = useStore(Selector.setEnableFineGrid);\r\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\r\n\r\n const moveStepAbsolute = 0.1;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const removeElement = (elemId: string, cut: boolean) => {\r\n if (canvas) {\r\n canvas.style.cursor = 'default'; // if an element is deleted but the cursor is not default\r\n }\r\n return removeElementById(elemId, cut);\r\n };\r\n\r\n const toggle2DView = () => {\r\n if (useStore.getState().viewState.navigationView) return;\r\n const undoableCheck = {\r\n name: 'Set 2D View',\r\n timestamp: Date.now(),\r\n checked: !orthographic,\r\n undo: () => {\r\n set2DView(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n set2DView(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n set2DView(!orthographic);\r\n setCommonStore((state) => {\r\n state.viewState.autoRotate = false;\r\n });\r\n };\r\n\r\n const toggleNatigationView = () => {\r\n if (orthographic) return;\r\n const undoableCheck = {\r\n name: 'Set Navigation View',\r\n timestamp: Date.now(),\r\n checked: !useStore.getState().viewState.navigationView,\r\n undo: () => {\r\n setNavigationView(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n setNavigationView(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setNavigationView(!useStore.getState().viewState.navigationView);\r\n setCommonStore((state) => {\r\n state.viewState.autoRotate = false;\r\n });\r\n };\r\n\r\n const toggleAutoRotate = () => {\r\n if (orthographic) return;\r\n const undoableCheck = {\r\n name: 'Auto Rotate',\r\n timestamp: Date.now(),\r\n checked: !useStore.getState().viewState.autoRotate,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = !state.viewState.autoRotate;\r\n });\r\n };\r\n\r\n const isNewPositionOk = (elem: ElementModel, cx: number, cy: number) => {\r\n const clone = JSON.parse(JSON.stringify(elem)) as ElementModel;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType === ObjectType.Roof) {\r\n if (elem.parentId && elem.foundationId) {\r\n const roof = getElementById(elem.parentId) as RoofModel;\r\n const foundation = getElementById(elem.foundationId);\r\n if (roof && foundation) {\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(roof);\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(clone as SolarPanelModel, foundation);\r\n if (\r\n !spBoundaryCheck(solarPanelVertices, boundaryVertices) ||\r\n !spCollisionCheck(clone as SolarPanelModel, foundation, solarPanelVertices)\r\n ) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (clone.type === ObjectType.SolarPanel) {\r\n const parent = getParent(elem);\r\n if (parent && !Util.isSolarCollectorWithinHorizontalSurface(clone as SolarPanelModel, parent)) {\r\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const moveLeft = (scale: number) => {\r\n if (orthographic) {\r\n const selectedElement = getSelectedElement();\r\n if (selectedElement) {\r\n let displacement = 0;\r\n switch (selectedElement.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid: {\r\n displacement = -moveStepAbsolute;\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n displacement = -moveStepAbsolute;\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = selectedElement as WallModel;\r\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\r\n displacement = -moveStepAbsolute;\r\n }\r\n break;\r\n }\r\n case ObjectType.Sensor: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n const halfLx = selectedElement.lx / (2 * parent.lx);\r\n const x = Math.max(-0.5 + halfLx, selectedElement.cx - moveStepAbsolute / parent.lx);\r\n displacement = x - selectedElement.cx;\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n displacement = -moveStepAbsolute / parent.lx;\r\n }\r\n break;\r\n }\r\n }\r\n if (displacement !== 0) {\r\n let accept = true;\r\n // for the time being, we deal with solar panels only\r\n if (selectedElement.type === ObjectType.SolarPanel) {\r\n accept = isNewPositionOk(selectedElement, selectedElement.cx + displacement, selectedElement.cy);\r\n }\r\n if (accept) {\r\n displacement *= scale;\r\n const undoableMoveLeft = {\r\n name: 'Move Left',\r\n timestamp: Date.now(),\r\n displacement: displacement,\r\n movedElementId: selectedElement.id,\r\n movedElementType: selectedElement.type,\r\n undo: () => {\r\n const elem = useStore.getState().getElementById(undoableMoveLeft.movedElementId);\r\n if (elem) {\r\n updateElementCxById(elem.id, elem.cx - undoableMoveLeft.displacement);\r\n }\r\n },\r\n redo: () => {\r\n const elem = useStore.getState().getElementById(undoableMoveLeft.movedElementId);\r\n if (elem) {\r\n updateElementCxById(elem.id, elem.cx + undoableMoveLeft.displacement);\r\n }\r\n },\r\n } as UndoableMoveInX;\r\n addUndoable(undoableMoveLeft);\r\n updateElementCxById(selectedElement.id, selectedElement.cx + displacement);\r\n }\r\n }\r\n } else {\r\n // if no element is selected, move everything\r\n const displacement = -moveStepAbsolute * scale;\r\n const undoableMoveAllLeft = {\r\n name: 'Move All Left',\r\n timestamp: Date.now(),\r\n displacement: displacement,\r\n undo: () => {\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCxById(e.id, e.cx - undoableMoveAllLeft.displacement);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCxById(e.id, e.cx + undoableMoveAllLeft.displacement);\r\n }\r\n }\r\n },\r\n } as UndoableMoveInX;\r\n addUndoable(undoableMoveAllLeft);\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCxById(e.id, e.cx + displacement);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const moveRight = (scale: number) => {\r\n if (orthographic) {\r\n const selectedElement = getSelectedElement();\r\n if (selectedElement) {\r\n let displacement = 0;\r\n switch (selectedElement.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid: {\r\n displacement = moveStepAbsolute;\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n displacement = moveStepAbsolute;\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = selectedElement as WallModel;\r\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\r\n displacement = moveStepAbsolute;\r\n }\r\n break;\r\n }\r\n case ObjectType.Sensor: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n const halfLx = parent ? selectedElement.lx / (2 * parent.lx) : 0;\r\n const x = Math.min(0.5 - halfLx, selectedElement.cx + moveStepAbsolute / parent.lx);\r\n displacement = x - selectedElement.cx;\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n displacement = moveStepAbsolute / parent.lx;\r\n }\r\n break;\r\n }\r\n }\r\n if (displacement !== 0) {\r\n let accept = true;\r\n // for the time being, we deal with solar panels only\r\n if (selectedElement.type === ObjectType.SolarPanel) {\r\n accept = isNewPositionOk(selectedElement, selectedElement.cx + displacement, selectedElement.cy);\r\n }\r\n if (accept) {\r\n displacement *= scale;\r\n const undoableMoveRight = {\r\n name: 'Move Right',\r\n timestamp: Date.now(),\r\n displacement: displacement,\r\n movedElementId: selectedElement.id,\r\n movedElementType: selectedElement.type,\r\n undo: () => {\r\n const elem = useStore.getState().getElementById(undoableMoveRight.movedElementId);\r\n if (elem) {\r\n updateElementCxById(elem.id, elem.cx - undoableMoveRight.displacement);\r\n }\r\n },\r\n redo: () => {\r\n const elem = useStore.getState().getElementById(undoableMoveRight.movedElementId);\r\n if (elem) {\r\n updateElementCxById(elem.id, elem.cx + undoableMoveRight.displacement);\r\n }\r\n },\r\n } as UndoableMoveInX;\r\n addUndoable(undoableMoveRight);\r\n updateElementCxById(selectedElement.id, selectedElement.cx + displacement);\r\n }\r\n }\r\n } else {\r\n // if no element is selected, move everything\r\n const displacement = moveStepAbsolute * scale;\r\n const undoableMoveAllRight = {\r\n name: 'Move All Right',\r\n timestamp: Date.now(),\r\n displacement: displacement,\r\n undo: () => {\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCxById(e.id, e.cx - undoableMoveAllRight.displacement);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCxById(e.id, e.cx + undoableMoveAllRight.displacement);\r\n }\r\n }\r\n },\r\n } as UndoableMoveInX;\r\n addUndoable(undoableMoveAllRight);\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCxById(e.id, e.cx + displacement);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const moveUp = (scale: number) => {\r\n if (orthographic) {\r\n const selectedElement = getSelectedElement();\r\n if (selectedElement) {\r\n let displacement = 0;\r\n switch (selectedElement.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid: {\r\n displacement = moveStepAbsolute;\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n displacement = moveStepAbsolute;\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = selectedElement as WallModel;\r\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\r\n displacement = moveStepAbsolute;\r\n }\r\n break;\r\n }\r\n case ObjectType.Sensor: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n const halfLy = parent ? selectedElement.ly / (2 * parent.ly) : 0;\r\n const y = Math.min(0.5 - halfLy, selectedElement.cy + moveStepAbsolute / parent.ly);\r\n displacement = y - selectedElement.cy;\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n displacement = moveStepAbsolute / parent.ly;\r\n }\r\n break;\r\n }\r\n }\r\n if (displacement !== 0) {\r\n let accept = true;\r\n // for the time being, we deal with solar panels only\r\n if (selectedElement.type === ObjectType.SolarPanel) {\r\n accept = isNewPositionOk(selectedElement, selectedElement.cx, selectedElement.cy + displacement);\r\n }\r\n if (accept) {\r\n displacement *= scale;\r\n const undoableMoveUp = {\r\n name: 'Move Up',\r\n timestamp: Date.now(),\r\n displacement: displacement,\r\n movedElementId: selectedElement.id,\r\n movedElementType: selectedElement.type,\r\n undo: () => {\r\n const elem = useStore.getState().getElementById(undoableMoveUp.movedElementId);\r\n if (elem) {\r\n updateElementCyById(elem.id, elem.cy - undoableMoveUp.displacement);\r\n }\r\n },\r\n redo: () => {\r\n const elem = useStore.getState().getElementById(undoableMoveUp.movedElementId);\r\n if (elem) {\r\n updateElementCyById(elem.id, elem.cy + undoableMoveUp.displacement);\r\n }\r\n },\r\n } as UndoableMoveInY;\r\n addUndoable(undoableMoveUp);\r\n updateElementCyById(selectedElement.id, selectedElement.cy + displacement);\r\n }\r\n }\r\n } else {\r\n // if no element is selected, move everything\r\n const displacement = moveStepAbsolute * scale;\r\n const undoableMoveAllUp = {\r\n name: 'Move All Up',\r\n timestamp: Date.now(),\r\n displacement: displacement,\r\n undo: () => {\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCyById(e.id, e.cy - undoableMoveAllUp.displacement);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCyById(e.id, e.cy + undoableMoveAllUp.displacement);\r\n }\r\n }\r\n },\r\n } as UndoableMoveInY;\r\n addUndoable(undoableMoveAllUp);\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCyById(e.id, e.cy + displacement);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const moveDown = (scale: number) => {\r\n if (orthographic) {\r\n const selectedElement = getSelectedElement();\r\n if (selectedElement) {\r\n let displacement = 0;\r\n switch (selectedElement.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid: {\r\n displacement = -moveStepAbsolute;\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n displacement = -moveStepAbsolute;\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = selectedElement as WallModel;\r\n if (wall.leftJoints.length === 0 && wall.rightJoints.length === 0) {\r\n displacement = -moveStepAbsolute;\r\n }\r\n break;\r\n }\r\n case ObjectType.Sensor: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n const halfLy = parent ? selectedElement.ly / (2 * parent.ly) : 0;\r\n const y = Math.max(-0.5 + halfLy, selectedElement.cy - moveStepAbsolute / parent.ly);\r\n displacement = y - selectedElement.cy;\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n displacement = -moveStepAbsolute / parent.ly;\r\n }\r\n break;\r\n }\r\n }\r\n if (displacement !== 0) {\r\n let accept = true;\r\n // for the time being, we deal with solar panels only\r\n if (selectedElement.type === ObjectType.SolarPanel) {\r\n accept = isNewPositionOk(selectedElement, selectedElement.cx, selectedElement.cy + displacement);\r\n }\r\n if (accept) {\r\n displacement *= scale;\r\n const undoableMoveDown = {\r\n name: 'Move Down',\r\n timestamp: Date.now(),\r\n displacement: displacement,\r\n movedElementId: selectedElement.id,\r\n movedElementType: selectedElement.type,\r\n undo: () => {\r\n const elem = useStore.getState().getElementById(undoableMoveDown.movedElementId);\r\n if (elem) {\r\n updateElementCyById(elem.id, elem.cy - undoableMoveDown.displacement);\r\n }\r\n },\r\n redo: () => {\r\n const elem = useStore.getState().getElementById(undoableMoveDown.movedElementId);\r\n if (elem) {\r\n updateElementCyById(elem.id, elem.cy + undoableMoveDown.displacement);\r\n }\r\n },\r\n } as UndoableMoveInY;\r\n addUndoable(undoableMoveDown);\r\n updateElementCyById(selectedElement.id, selectedElement.cy + displacement);\r\n }\r\n }\r\n } else {\r\n // if no element is selected, move everything\r\n const displacement = -moveStepAbsolute * scale;\r\n const undoableMoveAllDown = {\r\n name: 'Move All Down',\r\n timestamp: Date.now(),\r\n displacement: displacement,\r\n undo: () => {\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCyById(e.id, e.cy - undoableMoveAllDown.displacement);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCyById(e.id, e.cy + undoableMoveAllDown.displacement);\r\n }\r\n }\r\n },\r\n } as UndoableMoveInY;\r\n addUndoable(undoableMoveAllDown);\r\n for (const e of useStore.getState().elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n updateElementCyById(e.id, e.cy + displacement);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const setMultiSelectionMode = (b: boolean) => {\r\n useStore.getState().set((state) => {\r\n state.multiSelectionsMode = b;\r\n });\r\n };\r\n\r\n const handleKeyDown = (key: string) => {\r\n const selectedElement = getSelectedElement();\r\n const step = 1;\r\n switch (key) {\r\n case 'left':\r\n moveLeft(step);\r\n break;\r\n case 'shift+left':\r\n moveLeft(step / GRID_RATIO);\r\n break;\r\n case 'ctrl+shift+left':\r\n case 'meta+shift+left':\r\n moveLeft(step * GRID_RATIO);\r\n break;\r\n case 'right':\r\n moveRight(step);\r\n break;\r\n case 'shift+right':\r\n moveRight(step / GRID_RATIO);\r\n break;\r\n case 'ctrl+shift+right':\r\n case 'meta+shift+right':\r\n moveRight(step * GRID_RATIO);\r\n break;\r\n case 'down':\r\n moveDown(step);\r\n break;\r\n case 'shift+down':\r\n moveDown(step / GRID_RATIO);\r\n break;\r\n case 'ctrl+shift+down':\r\n case 'meta+shift+down':\r\n moveDown(step * GRID_RATIO);\r\n break;\r\n case 'up':\r\n moveUp(step);\r\n break;\r\n case 'shift+up':\r\n moveUp(step / GRID_RATIO);\r\n break;\r\n case 'ctrl+shift+up':\r\n case 'meta+shift+up':\r\n moveUp(step * GRID_RATIO);\r\n break;\r\n case 'ctrl+[':\r\n case 'meta+[': // for Mac\r\n zoomView(0.9);\r\n break;\r\n case 'ctrl+]':\r\n case 'meta+]': // for Mac\r\n zoomView(1.1);\r\n break;\r\n case 'ctrl+c':\r\n case 'meta+c': // for Mac\r\n if (selectedElement && selectedElement.type !== ObjectType.Roof) {\r\n copyElementById(selectedElement.id);\r\n setCommonStore((state) => {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(selectedElement.id);\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Copy',\r\n timestamp: new Date().getTime(),\r\n elementId: selectedElement.id,\r\n elementType: selectedElement.type,\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n break;\r\n case 'ctrl+x':\r\n case 'meta+x': // for Mac\r\n if (!selectedElement || selectedElement.type === ObjectType.Roof) break;\r\n if (selectedElement.locked) {\r\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\r\n } else {\r\n const cutElements = removeElement(selectedElement.id, true);\r\n if (cutElements.length === 0) break;\r\n\r\n if (Util.isElementTriggerAutoDeletion(selectedElement)) {\r\n useRefStore.getState().setListenToAutoDeletionByCut(true);\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\r\n } else {\r\n const undoableCut = {\r\n name: 'Cut',\r\n timestamp: Date.now(),\r\n deletedElements: cutElements,\r\n selectedElementId: selectedElement.id,\r\n undo: () => {\r\n const cutElements = undoableCut.deletedElements;\r\n if (cutElements.length === 0) return;\r\n\r\n const selectedElement = cutElements.find((e) => e.id === undoableCut.selectedElementId);\r\n if (!selectedElement) return;\r\n\r\n setCommonStore((state) => {\r\n state.elements.push(...cutElements);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(selectedElement.id);\r\n state.selectedElement = selectedElement;\r\n if (selectedElement.type === ObjectType.Wall) {\r\n const wall = selectedElement as WallModel;\r\n let leftWallId: string | null = null;\r\n let rightWallId: string | null = null;\r\n if (wall.leftJoints.length > 0) {\r\n leftWallId = wall.leftJoints[0];\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n rightWallId = wall.rightJoints[0];\r\n }\r\n if (leftWallId || rightWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).rightJoints[0] = wall.id;\r\n }\r\n if (e.id === rightWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).leftJoints[0] = wall.id;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n redo: () => {\r\n if (undoableCut.deletedElements && undoableCut.deletedElements.length > 0) {\r\n removeElement(undoableCut.deletedElements[0].id, true);\r\n }\r\n },\r\n } as UndoableDelete;\r\n addUndoable(undoableCut);\r\n }\r\n }\r\n break;\r\n case 'ctrl+v':\r\n case 'meta+v': // for Mac\r\n const pastedElements = pasteElements();\r\n if (pastedElements.length > 0) {\r\n const undoablePaste = {\r\n name: 'Paste by Key',\r\n timestamp: Date.now(),\r\n pastedElements: JSON.parse(JSON.stringify(pastedElements)),\r\n undo: () => {\r\n for (const elem of undoablePaste.pastedElements) {\r\n removeElementById(elem.id, false);\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoablePaste.pastedElements);\r\n state.selectedElement = undoablePaste.pastedElements[0];\r\n });\r\n },\r\n } as UndoablePaste;\r\n addUndoable(undoablePaste);\r\n }\r\n break;\r\n case 'ctrl+alt+h': // for Mac and Chrome OS\r\n case 'ctrl+home':\r\n if (!orthographic) {\r\n const cameraPosition = useStore.getState().viewState.cameraPosition;\r\n const panCenter = useStore.getState().viewState.panCenter;\r\n\r\n // if not already reset\r\n if (\r\n cameraPosition[0] !== cameraPosition[1] ||\r\n cameraPosition[1] !== cameraPosition[2] ||\r\n cameraPosition[0] !== cameraPosition[2] ||\r\n panCenter[0] !== 0 ||\r\n panCenter[1] !== 0 ||\r\n panCenter[2] !== 0\r\n ) {\r\n const undoableResetView = {\r\n name: 'Reset View',\r\n timestamp: Date.now(),\r\n oldCameraPosition: [...cameraPosition],\r\n oldPanCenter: [...panCenter],\r\n undo: () => {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n orbitControlsRef.current.object.position.set(\r\n undoableResetView.oldCameraPosition[0],\r\n undoableResetView.oldCameraPosition[1],\r\n undoableResetView.oldCameraPosition[2],\r\n );\r\n orbitControlsRef.current.target.set(\r\n undoableResetView.oldPanCenter[0],\r\n undoableResetView.oldPanCenter[1],\r\n undoableResetView.oldPanCenter[2],\r\n );\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n const v = state.viewState;\r\n v.cameraPosition = [...undoableResetView.oldCameraPosition];\r\n v.panCenter = [...undoableResetView.oldPanCenter];\r\n });\r\n }\r\n },\r\n redo: () => {\r\n resetView();\r\n },\r\n } as UndoableResetView;\r\n addUndoable(undoableResetView);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.orthographic = false;\r\n });\r\n resetView();\r\n }\r\n }\r\n break;\r\n case 'f2':\r\n case 'ctrl+b':\r\n case 'meta+b':\r\n toggle2DView();\r\n break;\r\n case 'ctrl+u':\r\n case 'meta+u':\r\n toggleNatigationView();\r\n break;\r\n case 'f4':\r\n case 'ctrl+m':\r\n case 'meta+m':\r\n toggleAutoRotate();\r\n break;\r\n case 'ctrl+f':\r\n case 'meta+f': // for Mac\r\n setCommonStore((state) => {\r\n state.createNewFileFlag = true;\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n window.history.pushState({}, document.title, HOME_URL);\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Create New File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n break;\r\n case 'ctrl+s':\r\n case 'meta+s': // for Mac\r\n usePrimitiveStore.setState((state) => {\r\n state.saveLocalFileDialogVisible = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Local File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n break;\r\n case 'ctrl+shift+o':\r\n case 'meta+shift+o': // for Mac\r\n usePrimitiveStore.setState((state) => {\r\n state.listCloudFilesFlag = true;\r\n state.openModelsMap = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'List Cloud Files',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n break;\r\n case 'ctrl+shift+s':\r\n case 'meta+shift+s': // for Mac\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Cloud File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n break;\r\n case 'alt+backspace':\r\n case 'backspace':\r\n case 'delete': {\r\n const selectedElementIdSet = useStore.getState().selectedElementIdSet;\r\n if (!selectedElement || selectedElementIdSet.size === 0) break;\r\n\r\n const deletedElements = useStore.getState().removeSelectedElements();\r\n if (deletedElements.length === 0) break;\r\n\r\n const ifNeedTriggerAutoDeletion = () => {\r\n const foundations = deletedElements.filter((e) => e.type === ObjectType.Foundation);\r\n const foundationsIdSet = new Set(foundations.map((e) => e.id));\r\n const trigger = deletedElements.find(\r\n (e) => !foundationsIdSet.has(e.parentId) && Util.isElementTriggerAutoDeletion(e),\r\n );\r\n return !!trigger;\r\n };\r\n\r\n if (ifNeedTriggerAutoDeletion()) {\r\n // handle undo in AutoDeletionListener\r\n useRefStore.getState().setListenToAutoDeletionByDelete(true);\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\r\n } else {\r\n if (deletedElements.length === 1) {\r\n const undoableDelete = {\r\n name: 'Delete',\r\n timestamp: Date.now(),\r\n deletedElements: [...deletedElements],\r\n selectedElementId: selectedElement.id,\r\n undo: () => {\r\n const deletedElements = undoableDelete.deletedElements;\r\n if (!deletedElements || deletedElements.length === 0) return;\r\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\r\n if (!selectedElement) return;\r\n setCommonStore((state) => {\r\n state.elements.push(...deletedElements);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(selectedElement.id);\r\n state.selectedElement = selectedElement;\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.deletedRoofId = null;\r\n state.deletedRoofIdSet.clear();\r\n });\r\n if (selectedElement.type === ObjectType.Wall) {\r\n const wall = selectedElement as WallModel;\r\n if (wall.leftJoints.length > 0) {\r\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const deletedElements = undoableDelete.deletedElements;\r\n if (!deletedElements || deletedElements.length === 0) return;\r\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\r\n if (!selectedElement) return;\r\n removeElement(selectedElement.id, false);\r\n },\r\n } as UndoableDelete;\r\n addUndoable(undoableDelete);\r\n } else {\r\n const undoableDeleteMultiple = {\r\n name: 'Delete Multiple',\r\n timestamp: Date.now(),\r\n deletedElements: [...deletedElements],\r\n selectedElementId: selectedElement.id,\r\n selectedElementIdSet: new Set(selectedElementIdSet),\r\n undo() {\r\n const deletedElements = this.deletedElements;\r\n if (!deletedElements || deletedElements.length === 0) return;\r\n const selectedElement = deletedElements.find((e) => e.id === this.selectedElementId);\r\n if (!selectedElement) return;\r\n setCommonStore((state) => {\r\n state.elements.push(...deletedElements);\r\n state.selectedElement = selectedElement;\r\n state.selectedElementIdSet = new Set(this.selectedElementIdSet);\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.deletedRoofId = null;\r\n state.deletedRoofIdSet.clear();\r\n });\r\n for (const e of this.deletedElements) {\r\n if (e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n if (wall.leftJoints.length > 0) {\r\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\r\n }\r\n }\r\n }\r\n },\r\n redo() {\r\n setCommonStore((state) => {\r\n state.selectedElement = state.elements.find((e) => e.id === this.selectedElementId) ?? null;\r\n state.selectedElementIdSet = new Set(this.selectedElementIdSet);\r\n });\r\n useStore.getState().removeSelectedElements();\r\n },\r\n } as UndoableDeleteMultiple;\r\n addUndoable(undoableDeleteMultiple);\r\n }\r\n setCommonStore((state) => {\r\n state.selectedElement = null;\r\n state.selectedElementIdSet.clear();\r\n });\r\n }\r\n break;\r\n }\r\n case 'ctrl+z':\r\n case 'meta+z': // for Mac\r\n if (undoManager.hasUndo()) {\r\n const commandName = undoManager.undo();\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n }\r\n if (commandName) showInfo(i18n.t('menu.edit.Undo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Undo',\r\n timestamp: new Date().getTime(),\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n break;\r\n case 'ctrl+y':\r\n case 'meta+y': // for Mac\r\n if (undoManager.hasRedo()) {\r\n const commandName = undoManager.redo();\r\n if (commandName) showInfo(i18n.t('menu.edit.Redo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n }\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Redo',\r\n timestamp: new Date().getTime(),\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n break;\r\n case 'shift':\r\n if (useStore.getState().viewState.navigationView) {\r\n usePrimitiveStore.setState((state) => {\r\n state.navigationMoveSpeed = 5 * useStore.getState().minimumNavigationMoveSpeed;\r\n state.navigationTurnSpeed = 5 * useStore.getState().minimumNavigationTurnSpeed;\r\n });\r\n }\r\n setEnableFineGrid(true);\r\n break;\r\n case 'esc': {\r\n const addedFoundationID = useStore.getState().addedFoundationId;\r\n const addedCuboidId = useStore.getState().addedCuboidId;\r\n const addedWallId = useStore.getState().addedWallId;\r\n const addedWindowId = useStore.getState().addedWindowId;\r\n const addedDoorId = useStore.getState().addedDoorId;\r\n if (addedFoundationID) {\r\n removeElementById(addedFoundationID, false);\r\n } else if (addedCuboidId) {\r\n removeElementById(addedCuboidId, false);\r\n } else if (addedWallId) {\r\n removeElementById(addedWallId, false);\r\n } else if (addedWindowId) {\r\n removeElementById(addedWindowId, false);\r\n usePrimitiveStore.getState().setPrimitiveStore('elementBeingCanceledId', addedWindowId);\r\n } else if (addedDoorId) {\r\n removeElementById(addedDoorId, false);\r\n usePrimitiveStore.getState().setPrimitiveStore('elementBeingCanceledId', addedDoorId);\r\n }\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.actionModeLock = false;\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.groupActionMode = false;\r\n });\r\n useRefStore.getState().setEnableOrbitController(true);\r\n selectNone();\r\n break;\r\n }\r\n case 'ctrl': {\r\n setMultiSelectionMode(true);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleKeyUp = (key: string) => {\r\n switch (key) {\r\n case 'shift':\r\n if (useStore.getState().viewState.navigationView) {\r\n usePrimitiveStore.setState((state) => {\r\n state.navigationMoveSpeed = useStore.getState().minimumNavigationMoveSpeed;\r\n state.navigationTurnSpeed = useStore.getState().minimumNavigationTurnSpeed;\r\n });\r\n }\r\n setEnableFineGrid(false);\r\n break;\r\n case 'ctrl+o':\r\n case 'meta+o': // for Mac\r\n // this must be handled as a key-up event because it brings up a native file dialog\r\n // when the key is down and the corresponding key-up event would never be processed as the focus is lost\r\n if (!useStore.getState().localFileDialogRequested) {\r\n setCommonStore((state) => {\r\n state.localFileDialogRequested = true;\r\n state.openLocalFileFlag = true;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Open Local File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n }\r\n break;\r\n case 'ctrl': {\r\n setMultiSelectionMode(false);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n useEffect(\r\n () => () => {\r\n keyNameRef.current = null;\r\n },\r\n [],\r\n );\r\n\r\n const keyNameRef = useRef(null);\r\n\r\n return (\r\n <>\r\n {\r\n e.preventDefault();\r\n if (keyNameRef.current === key) return;\r\n keyNameRef.current = key;\r\n handleKeyDown(key);\r\n }}\r\n />\r\n {\r\n e.preventDefault();\r\n keyNameRef.current = null;\r\n handleKeyUp(key);\r\n }}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(KeyboardListener);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { Box3, Object3D, Vector3 } from 'three';\r\nimport { useThree } from '@react-three/fiber';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\n\r\nconst SceneRadiusCalculator = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const updateSceneRadiusFlag = useStore(Selector.updateSceneRadiusFlag);\r\n\r\n const { scene } = useThree();\r\n\r\n useEffect(() => {\r\n const content = scene.children.filter((c) => c.name === 'Content');\r\n const objects: Object3D[] = [];\r\n if (content.length > 0) {\r\n const components = content[0].children;\r\n for (const c of components) {\r\n fetchAabbElements(c, objects);\r\n }\r\n }\r\n const boxes = [];\r\n for (const c of objects) {\r\n boxes.push(new Box3().setFromObject(c));\r\n }\r\n if (boxes.length > 0) {\r\n const min = new Vector3();\r\n const max = new Vector3();\r\n for (const box of boxes) {\r\n min.min(box.min);\r\n max.max(box.max);\r\n }\r\n let r = Math.abs(min.x);\r\n if (r < Math.abs(min.y)) r = Math.abs(min.y);\r\n if (r < Math.abs(min.z)) r = Math.abs(min.z);\r\n if (r < Math.abs(max.x)) r = Math.abs(max.x);\r\n if (r < Math.abs(max.y)) r = Math.abs(max.y);\r\n if (r < Math.abs(max.z)) r = Math.abs(max.z);\r\n setCommonStore((state) => {\r\n state.aabb = new Box3(min, max);\r\n if (!isNaN(r) && isFinite(r)) {\r\n // have to round this, otherwise the result is different even if nothing moved.\r\n state.sceneRadius = Math.round(Math.max(10, r * 1.25)); // make it 25% larger than the bounding box\r\n }\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [updateSceneRadiusFlag]);\r\n\r\n const fetchAabbElements = (obj: Object3D, arr: Object3D[]) => {\r\n if (obj.userData['aabb']) {\r\n arr.push(obj);\r\n }\r\n if (obj.children.length > 0) {\r\n for (const c of obj.children) {\r\n fetchAabbElements(c, arr);\r\n }\r\n }\r\n };\r\n\r\n return <>;\r\n};\r\n\r\nexport default React.memo(SceneRadiusCalculator);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { OrthographicCamera, PerspectiveCamera } from '@react-three/drei';\r\nimport { Camera, useFrame, useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport { Vector3 } from 'three';\r\nimport { DEFAULT_FAR, DEFAULT_FOV, HALF_PI } from './constants';\r\nimport { MyOrbitControls } from './js/MyOrbitControls';\r\nimport { useStore } from './stores/common';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport * as Selector from './stores/selector';\r\n\r\nconst getCameraDirection = (cam: Camera) => {\r\n const dir = new Vector3().subVectors(cam.localToWorld(new Vector3(0, 0, 1000)), cam.position);\r\n if (dir.x === 0 && dir.y === 0) {\r\n cam.getWorldDirection(dir);\r\n }\r\n return dir;\r\n};\r\n\r\nexport const setCompassRotation = (camera: Camera) => {\r\n const compass = document.getElementById('compassCanvas');\r\n if (compass) {\r\n const dircXY = getCameraDirection(camera).normalize();\r\n const rotationZ = Math.atan2(dircXY.y, dircXY.x) + Math.PI / 2;\r\n const deg = (rotationZ / Math.PI) * 180;\r\n\r\n compass.style.transform = `rotate(${deg}deg)`;\r\n\r\n const isCameraUnderGround = camera.position.z < 0.001;\r\n\r\n if (isCameraUnderGround && !usePrimitiveStore.getState().isCameraUnderGround) {\r\n usePrimitiveStore.getState().setPrimitiveStore('isCameraUnderGround', true);\r\n } else if (!isCameraUnderGround && usePrimitiveStore.getState().isCameraUnderGround) {\r\n usePrimitiveStore.getState().setPrimitiveStore('isCameraUnderGround', false);\r\n }\r\n }\r\n};\r\n\r\nconst CameraController = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n const enableRotate = useStore(Selector.viewState.enableRotate);\r\n const autoRotate = useStore(Selector.viewState.autoRotate);\r\n const fileChanged = useStore(Selector.fileChanged);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const cameraPosition = useStore(Selector.viewState.cameraPosition);\r\n const cameraZoom = useStore(Selector.viewState.cameraZoom);\r\n const navigationView = useStore(Selector.viewState.navigationView);\r\n const navigationMoveSpeed = usePrimitiveStore(Selector.navigationMoveSpeed);\r\n const navigationTurnSpeed = usePrimitiveStore(Selector.navigationTurnSpeed);\r\n const showCloudFileTitleDialogFlag = useStore(Selector.showCloudFileTitleDialogFlag);\r\n const saveLocalFileDialogVisible = usePrimitiveStore(Selector.saveLocalFileDialogVisible);\r\n\r\n const enabledNavigationControls = navigationView && !orthographic;\r\n const cameraPositionLength = Math.hypot(cameraPosition[0], cameraPosition[1], cameraPosition[2]);\r\n const panRadius = (orthographic ? cameraZoom * 50 : cameraPositionLength * 10) * sceneRadius;\r\n const minPan = useMemo(() => new Vector3(-panRadius, -panRadius, 0), [panRadius]);\r\n const maxPan = useMemo(() => new Vector3(panRadius, panRadius, panRadius / 2), [panRadius]);\r\n\r\n const { gl, invalidate, get, set, camera } = useThree();\r\n\r\n const initialOrbitCamera = useMemo(() => {\r\n const camera = get().camera;\r\n camera.up.set(0, 0, 1);\r\n return camera;\r\n }, []);\r\n\r\n const initialOrbitDomElement = useMemo(() => {\r\n return gl.domElement;\r\n }, []);\r\n\r\n const orbitControlRef = useRef(null);\r\n const persCameraRef = useRef(null);\r\n const orthCameraRef = useRef(null);\r\n\r\n //\r\n useEffect(() => {\r\n if (useStore.getState().viewState.cameraPosition2D[2] < 100) {\r\n setCommonStore((state) => {\r\n state.viewState.cameraPosition2D[2] = 150;\r\n });\r\n }\r\n }, []);\r\n\r\n // save orbitControlRef to common store\r\n useEffect(() => {\r\n if (orbitControlRef && orbitControlRef.current) {\r\n useRefStore.setState((state) => {\r\n state.orbitControlsRef = orbitControlRef;\r\n });\r\n }\r\n }, []);\r\n\r\n // add orbit control event listener\r\n useEffect(() => {\r\n if (orbitControlRef.current) {\r\n orbitControlRef.current.addEventListener('change', render);\r\n orbitControlRef.current.addEventListener('start', onInteractionStart);\r\n orbitControlRef.current.addEventListener('end', onInteractionEnd);\r\n }\r\n // copy a reference before the cleanup call\r\n const oc = orbitControlRef.current;\r\n return () => {\r\n if (oc) {\r\n oc.removeEventListener('change', render);\r\n oc.removeEventListener('start', onInteractionStart);\r\n oc.removeEventListener('end', onInteractionEnd);\r\n }\r\n };\r\n }, [enabledNavigationControls]);\r\n\r\n // open new/other file\r\n useEffect(() => {\r\n const viewState = useStore.getState().viewState;\r\n if (orbitControlRef.current) {\r\n if (persCameraRef.current) {\r\n if (enabledNavigationControls) {\r\n const camera = get().camera;\r\n const positionNav = viewState.cameraPositionNav ?? [5, -30, 1];\r\n const rotationNav = viewState.cameraRotationNav ?? [\r\n 1.5374753309166491, 0.16505866097993566, 0.005476951734475092,\r\n ];\r\n camera.position.fromArray(positionNav);\r\n camera.rotation.fromArray([...rotationNav, 'XYZ']);\r\n } else {\r\n const cameraPosition = getVector(viewState.cameraPosition ?? [0, 0, 20]);\r\n const panCenter = getVector(viewState.panCenter ?? [0, 0, 0]);\r\n persCameraRef.current.position.copy(cameraPosition);\r\n persCameraRef.current.lookAt(panCenter);\r\n persCameraRef.current.zoom = 1;\r\n if (!orthographic) {\r\n orbitControlRef.current.object = persCameraRef.current;\r\n orbitControlRef.current.target.copy(panCenter);\r\n }\r\n }\r\n camera.updateMatrixWorld();\r\n setCompassRotation(get().camera);\r\n }\r\n if (orthCameraRef.current) {\r\n // old files have no cameraPosition2D and panCenter2D: 12/19/2021\r\n const cameraPosition2D = getVector(viewState.cameraPosition2D ?? [0, 0, 1000]).setZ(1000);\r\n const panCenter2D = getVector(viewState.panCenter2D ?? [0, 0, 0]);\r\n orthCameraRef.current.position.copy(cameraPosition2D);\r\n orthCameraRef.current.rotation.set(0, 0, 0);\r\n orthCameraRef.current.lookAt(panCenter2D);\r\n orthCameraRef.current.zoom = viewState.cameraZoom;\r\n if (orthographic) {\r\n orbitControlRef.current.object = orthCameraRef.current;\r\n orbitControlRef.current.target.copy(panCenter2D);\r\n }\r\n }\r\n }\r\n }, [fileChanged]);\r\n\r\n // switch camera\r\n useEffect(() => {\r\n if (!orthCameraRef.current || !persCameraRef.current || !orbitControlRef.current) return;\r\n\r\n const viewState = useStore.getState().viewState;\r\n const orbitControl = orbitControlRef.current;\r\n const orthCam = orthCameraRef.current;\r\n const persCam = persCameraRef.current;\r\n if (orthographic) {\r\n orthCam.rotation.set(0, 0, 0);\r\n orbitControl.object = orthCam;\r\n orbitControl.target.copy(getVector(viewState.panCenter2D ?? [0, 0, 0]));\r\n set({ camera: orthCam });\r\n } else {\r\n orbitControl.object = persCam;\r\n orbitControl.target.copy(getVector(viewState.panCenter ?? [0, 0, 0]));\r\n set({ camera: persCam });\r\n setCompassRotation(get().camera);\r\n }\r\n }, [orthographic]);\r\n\r\n // camera zoom in 2D view (no need to do this in 3D view)\r\n useEffect(() => {\r\n if (orthographic) {\r\n if (orbitControlRef.current) {\r\n if (orthCameraRef.current) {\r\n orthCameraRef.current.zoom = cameraZoom;\r\n orbitControlRef.current.object = orthCameraRef.current;\r\n }\r\n render();\r\n orbitControlRef.current.update();\r\n }\r\n }\r\n }, [cameraZoom]);\r\n\r\n const render = () => {\r\n invalidate();\r\n if (!useStore.getState().viewState.orthographic) {\r\n setCompassRotation(get().camera);\r\n if (orbitControlRef.current) {\r\n orbitControlRef.current.target.clamp(minPan, maxPan);\r\n }\r\n }\r\n };\r\n\r\n const onInteractionStart = () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.duringCameraInteraction = true;\r\n });\r\n };\r\n\r\n const onInteractionEnd = () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.duringCameraInteraction = false;\r\n });\r\n setCommonStore((state) => {\r\n if (!orbitControlRef.current) return;\r\n const v = state.viewState;\r\n const cam = get().camera;\r\n const cameraPosition = cam.position;\r\n const targetPosition = orbitControlRef.current.target;\r\n if (v.orthographic) {\r\n if (cam.zoom && !isNaN(cam.zoom)) {\r\n v.cameraZoom = cam.zoom;\r\n } else {\r\n v.cameraZoom = 20;\r\n }\r\n v.cameraPosition2D = [cameraPosition.x, cameraPosition.y, 150];\r\n v.panCenter2D = [targetPosition.x, targetPosition.y, targetPosition.z];\r\n } else if (enabledNavigationControls) {\r\n // Do not save the pan center in the navigation mode as the camera position in this mode\r\n // may be way off, which can surprise the user when they exit the navigation mode and try\r\n // to rotate the view. It is difficult to get the pan center back unless they reset the view.\r\n // const panCenter = cam.localToWorld(new Vector3(0, 0, -50));\r\n // v.panCenter = [panCenter.x, panCenter.y, 0];\r\n v.cameraPositionNav = [cameraPosition.x, cameraPosition.y, cameraPosition.z];\r\n v.cameraRotationNav = [cam.rotation.x, cam.rotation.y, cam.rotation.z];\r\n state.cameraDirection = getCameraDirection(cam);\r\n } else {\r\n v.cameraPosition = [cameraPosition.x, cameraPosition.y, cameraPosition.z];\r\n v.panCenter = [targetPosition.x, targetPosition.y, targetPosition.z];\r\n state.cameraDirection = getCameraDirection(cam);\r\n }\r\n });\r\n };\r\n\r\n const getVector = (n: number[] | Vector3) => {\r\n if (n && Array.isArray(n)) {\r\n return new Vector3(n[0], n[1], n[2]);\r\n }\r\n // some of our old files are saved as serialized vector\r\n if (n && n.x !== null) {\r\n return new Vector3(n.x, n.y, n.z);\r\n }\r\n return new Vector3(0, 0, 5);\r\n };\r\n\r\n // animation\r\n useFrame((state) => {\r\n if (autoRotate && orbitControlRef.current) {\r\n orbitControlRef.current.update();\r\n }\r\n });\r\n\r\n // other components ref\r\n const compassMounted = useRefStore((state) => state.compassRef);\r\n\r\n // on mount\r\n useEffect(() => {\r\n setCompassRotation(get().camera);\r\n }, [compassMounted]);\r\n\r\n // key event\r\n useEffect(() => {\r\n if (!orbitControlRef.current) return;\r\n\r\n if (enabledNavigationControls && !saveLocalFileDialogVisible && !showCloudFileTitleDialogFlag) {\r\n orbitControlRef.current.listenToKeyEvents(window);\r\n } else {\r\n orbitControlRef.current.removeKeyEvents();\r\n }\r\n }, [enabledNavigationControls, saveLocalFileDialogVisible, showCloudFileTitleDialogFlag]);\r\n\r\n // switch to navigation controls\r\n useEffect(() => {\r\n if (!orbitControlRef.current) return;\r\n\r\n const viewState = useStore.getState().viewState;\r\n\r\n if (enabledNavigationControls) {\r\n const camera = get().camera;\r\n const positionNav = viewState.cameraPositionNav ?? [5, -30, 1];\r\n const rotationNav = viewState.cameraRotationNav ?? [\r\n 1.5374753309166491, 0.16505866097993566, 0.005476951734475092,\r\n ];\r\n camera.position.fromArray(positionNav);\r\n camera.rotation.fromArray([...rotationNav, 'XYZ']);\r\n camera.updateMatrixWorld();\r\n setCompassRotation(get().camera);\r\n } else {\r\n if (orbitControlRef.current && persCameraRef.current) {\r\n const cameraPosition = getVector(viewState.cameraPosition ?? [0, 0, 20]);\r\n const panCenter = getVector(viewState.panCenter ?? [0, 0, 0]);\r\n persCameraRef.current.position.copy(cameraPosition);\r\n persCameraRef.current.lookAt(panCenter);\r\n persCameraRef.current.zoom = 1;\r\n if (!orthographic) {\r\n orbitControlRef.current.object = persCameraRef.current;\r\n orbitControlRef.current.target.copy(panCenter);\r\n }\r\n persCameraRef.current.updateMatrixWorld();\r\n setCompassRotation(persCameraRef.current);\r\n }\r\n }\r\n invalidate();\r\n }, [enabledNavigationControls]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(CameraController);\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport styled from 'styled-components';\nimport {\n FacebookIcon,\n FacebookShareButton,\n LineIcon,\n LineShareButton,\n LinkedinIcon,\n LinkedinShareButton,\n RedditIcon,\n RedditShareButton,\n TwitterIcon,\n TwitterShareButton,\n WhatsappIcon,\n WhatsappShareButton,\n} from 'react-share';\nimport { HOME_URL } from './constants';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\n\nconst ShareLinkContainer = styled.div`\n display: flex;\n flex-direction: column;\n z-index: 999;\n`;\n\nexport interface ShareLinkProps {\n style?: object;\n size: number;\n margin: string;\n round?: boolean;\n handleShareWindowClose?: () => void;\n}\n\nconst ShareLinks = ({ style, size, margin, round, handleShareWindowClose }: ShareLinkProps) => {\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const cloudFile = useStore(Selector.cloudFile);\n\n const params = new URLSearchParams(window.location.search);\n const userid = params.get('userid');\n const lang = { lng: language };\n const title = cloudFile ?? i18n.t('name.Tagline', lang);\n const via = 'aladdinIFI ' + (cloudFile ? i18n.t('name.Tagline', lang) : '');\n let url = HOME_URL;\n if (cloudFile) {\n // only a cloud file is sharable\n if (userid) {\n // since this may be other people's document, keep its original user id\n url += '?client=web&userid=' + userid + '&title=' + encodeURIComponent(cloudFile);\n } else if (user.uid) {\n // otherwise, this is the current user's document\n url += '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(cloudFile);\n }\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default React.memo(ShareLinks);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nexport class Individual {\n chromosome: number[];\n\n // store the fitness value evaluated by the objective function (NaN means not evaluated yet)\n fitness: number = Number.NaN;\n discretizationSteps: number | undefined;\n\n constructor(length: number, randomize: boolean, discretizationSteps?: number) {\n this.chromosome = new Array(length);\n this.discretizationSteps = discretizationSteps;\n if (randomize) {\n if (discretizationSteps) {\n for (let i = 0; i < length; i++) {\n const n = Math.floor(Math.random() * discretizationSteps);\n this.chromosome[i] = n / discretizationSteps;\n }\n } else {\n for (let i = 0; i < length; i++) {\n this.chromosome[i] = Math.random();\n }\n }\n }\n }\n\n getCopy(): Individual {\n const c = new Individual(this.chromosome.length, false, this.discretizationSteps);\n for (let i = 0; i < c.chromosome.length; i++) {\n c.chromosome[i] = this.chromosome[i];\n }\n c.fitness = this.fitness;\n return c;\n }\n\n compare(i: Individual): number {\n if (isNaN(this.fitness) || isNaN(i.fitness)) throw new Error('Fitness cannot be NaN');\n if (this.fitness > i.fitness) return 1;\n if (this.fitness < i.fitness) return -1;\n return 0;\n }\n\n setGene(i: number, g: number) {\n if (i < 0 || i >= this.chromosome.length) throw new Error('Gene index out of bound: ' + i);\n this.chromosome[i] = g;\n }\n\n getGene(i: number) {\n if (i < 0 || i >= this.chromosome.length) throw new Error('Gene index out of bound: ' + i);\n return this.chromosome[i];\n }\n\n copyGenes(original: Individual) {\n const n = Math.min(this.chromosome.length, original.chromosome.length);\n for (let i = 0; i < n; i++) {\n this.chromosome[i] = original.chromosome[i];\n }\n }\n /*\n * return the Euclidean distance between the chromosomes\n * phenotypic only as we don't use genotypic (bit) coding\n */\n distance(individual: Individual) {\n if (this.chromosome.length === 1) {\n return Math.abs(this.chromosome[0] - individual.chromosome[0]);\n }\n let sum = 0;\n for (let i = 0; i < this.chromosome.length; i++) {\n const d = this.chromosome[i] - individual.chromosome[i];\n sum += d * d;\n }\n return Math.sqrt(sum);\n }\n\n toString(): string {\n let s: string = '';\n for (const x of this.chromosome) {\n s += x + ', ';\n }\n return '(' + s.substring(0, s.length - 2) + ') : ' + this.fitness;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Individual } from './Individual';\n\nexport class Parents {\n dad: Individual;\n mom: Individual;\n\n constructor(dad: Individual, mom: Individual) {\n this.dad = dad;\n this.mom = mom;\n }\n\n equals(p: Parents): boolean {\n return (p.dad === this.dad && p.mom === this.mom) || (p.dad === this.mom && p.mom === this.dad);\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n * This class implements simple genetic algorithm (SGA).\n */\n\nimport { Individual } from './Individual';\nimport { GeneticAlgorithmSelectionMethod } from '../../../types';\nimport { Parents } from './Parents';\nimport { Util } from '../../../Util';\n\nexport class Population {\n individuals: Individual[];\n savedGeneration: Individual[];\n violations: boolean[];\n beta: number; // blending parameter for genetic mixing\n survivors: Individual[];\n mutants: Individual[];\n selectionMethod: GeneticAlgorithmSelectionMethod = GeneticAlgorithmSelectionMethod.ROULETTE_WHEEL;\n discretizationSteps: number | undefined;\n\n constructor(\n populationSize: number,\n chromosomeLength: number,\n selectionMethod: GeneticAlgorithmSelectionMethod,\n discretizationSteps?: number,\n ) {\n this.beta = 0.5;\n this.selectionMethod = selectionMethod;\n this.individuals = new Array(populationSize);\n this.savedGeneration = new Array(populationSize);\n this.violations = new Array(populationSize);\n this.survivors = [];\n this.mutants = [];\n this.discretizationSteps = discretizationSteps;\n for (let i = 0; i < this.individuals.length; i++) {\n this.individuals[i] = new Individual(chromosomeLength, true, discretizationSteps);\n this.savedGeneration[i] = new Individual(chromosomeLength, true, discretizationSteps);\n this.violations[i] = false;\n }\n }\n\n // sort the fitness in the descending order (sort b before a if b's fitness is higher than a's)\n sort(): void {\n this.individuals.sort((a, b) => b.compare(a));\n }\n\n getNicheCount(selected: Individual, sigma: number): number {\n let nicheCount = 0;\n for (const i of this.individuals) {\n const r = selected.distance(i);\n let share = 0;\n if (r < sigma) {\n share = 1.0 - r / sigma;\n }\n nicheCount += share;\n }\n return nicheCount;\n }\n\n saveGenes(): void {\n for (let i = 0; i < this.individuals.length; i++) {\n this.savedGeneration[i].copyGenes(this.individuals[i]);\n this.violations[i] = false;\n }\n }\n\n restoreGenes(): void {\n for (let i = 0; i < this.individuals.length; i++) {\n if (this.violations[i]) {\n this.individuals[i].copyGenes(this.savedGeneration[i]);\n }\n }\n }\n\n getFittest(): Individual | undefined {\n let max = -Number.MAX_VALUE;\n let best: Individual | undefined;\n for (const i of this.individuals) {\n if (isNaN(i.fitness)) {\n // fitness not computed yet, skip\n continue;\n }\n if (i.fitness > max) {\n max = i.fitness;\n best = i;\n }\n }\n return best;\n }\n\n /* Implement simple genetic algorithm (SGA) */\n\n evolve(selectionRate: number, crossoverRate: number): void {\n this.selectSurvivors(selectionRate);\n this.crossover(crossoverRate);\n }\n\n // select the survivors based on elitism specified by the rate of selection\n selectSurvivors(selectionRate: number): void {\n this.survivors = [];\n this.sort();\n const imax = Math.floor(selectionRate * this.individuals.length);\n for (let i = 0; i < imax; i++) {\n this.survivors.push(this.individuals[i]);\n }\n }\n\n // uniform crossover\n crossover(crossoverRate: number): void {\n const numberOfSurvivers = this.survivors.length;\n if (numberOfSurvivers <= 1) {\n return;\n }\n\n const lowestFitness = this.individuals[numberOfSurvivers].fitness;\n let sumOfFitness = 0;\n for (let i = 0; i < numberOfSurvivers; i++) {\n sumOfFitness += this.individuals[i].fitness - lowestFitness;\n }\n\n const newBorn = this.individuals.length - numberOfSurvivers;\n const oldFolks = new Array();\n while (oldFolks.length * 2 < newBorn) {\n // multiplying 2 above because each couple produces two children as shown in the mating algorithm below\n let p: Parents | null = null;\n switch (this.selectionMethod) {\n case GeneticAlgorithmSelectionMethod.TOURNAMENT:\n p = this.selectParentsByTournament();\n break;\n default:\n p = this.selectParentsByRouletteWheel(lowestFitness, sumOfFitness);\n }\n if (p && !oldFolks.includes(p)) {\n oldFolks.push(p);\n }\n }\n\n // mating of dad and mom produces two children\n let childIndex = numberOfSurvivers;\n for (const p of oldFolks) {\n const n = p.dad.chromosome.length;\n const child1 = new Individual(n, true, this.discretizationSteps);\n const child2 = new Individual(n, true, this.discretizationSteps);\n this.beta = Math.random();\n for (let i = 0; i < n; i++) {\n const di = p.dad.getGene(i);\n const mi = p.mom.getGene(i);\n // if the crossover rate equals to 1, then it is uniform crossover when beta is 0 or 1,\n // which means the children take a gene from either parent completely randomly\n // if the crossover rate equals to 0, then it is reduced to only blending,\n // which may work as well (but crossover can increase higher genetic diversity)\n if (Math.random() < crossoverRate) {\n child1.setGene(i, this.beta * di + (1 - this.beta) * mi);\n child2.setGene(i, this.beta * mi + (1 - this.beta) * di);\n } else {\n child1.setGene(i, this.beta * mi + (1 - this.beta) * di);\n child2.setGene(i, this.beta * di + (1 - this.beta) * mi);\n }\n }\n if (childIndex < this.individuals.length) {\n this.individuals[childIndex] = child1;\n }\n if (childIndex + 1 < this.individuals.length) {\n this.individuals[childIndex + 1] = child2;\n }\n childIndex += 2;\n }\n }\n\n // select a parent by the roulette wheel rule (fitness proportionate selection)\n selectParentsByRouletteWheel(lowestFitness: number, sumOfFitness: number): Parents | null {\n // spin the wheel to find dad\n let dad = null;\n let roulettWheelPosition = Math.random() * sumOfFitness;\n let spinWheel = 0;\n for (const s of this.survivors) {\n spinWheel += s.fitness - lowestFitness;\n if (spinWheel >= roulettWheelPosition) {\n dad = s;\n break;\n }\n }\n // spin the wheel to find mom\n let mom = null;\n do {\n roulettWheelPosition = Math.random() * sumOfFitness;\n spinWheel = 0;\n for (const s of this.survivors) {\n spinWheel += s.fitness - lowestFitness;\n if (spinWheel >= roulettWheelPosition) {\n if (s !== dad) {\n mom = s;\n }\n break;\n }\n }\n } while (mom === null);\n if (dad && mom) return new Parents(dad, mom);\n return null;\n }\n\n // select a parent by tournament\n selectParentsByTournament(): Parents | null {\n const numberOfSurvivers = this.survivors.length;\n if (numberOfSurvivers <= 1) {\n throw new Error('Must have at least two survivors to be used as parents');\n }\n const n1 = numberOfSurvivers - 1;\n\n // find dad first\n let i = Math.floor(Math.random() * n1);\n let j;\n do {\n j = Math.floor(Math.random() * n1);\n } while (j === i);\n const d = this.survivors[i].fitness > this.survivors[j].fitness ? i : j;\n\n // now find mom\n i = Math.floor(Math.random() * n1);\n do {\n j = Math.floor(Math.random() * n1);\n } while (j === i);\n let m = this.survivors[i].fitness > this.survivors[j].fitness ? i : j;\n\n // if mom is the same with dad, try again until otherwise\n while (m === d) {\n i = Math.floor(Math.random() * n1);\n do {\n j = Math.floor(Math.random() * n1);\n } while (j === i);\n m = this.survivors[i].fitness > this.survivors[j].fitness ? i : j;\n }\n\n return new Parents(this.survivors[d], this.survivors[m]);\n }\n\n mutate(mutationRate: number): void {\n if (Util.isZero(mutationRate)) {\n return;\n }\n // randomly select a number of individual to mutate based on the mutation rate\n let m = Math.floor(mutationRate * (this.individuals.length - 1));\n if (m === 0) {\n // ensure at least one mutant?\n m = 1;\n } else if (m === this.individuals.length - 1) {\n // we will have a deadlock in the while loop below if we don't do this\n // because the length of mutants will always be less than the full individual length in elitism\n m = this.individuals.length - 2;\n }\n this.mutants = [];\n while (this.mutants.length < m) {\n // elitism: don't mutate the top one\n const k = Math.floor(1 + Math.random() * (this.individuals.length - 2));\n if (!this.mutants.includes(this.individuals[k])) {\n this.mutants.push(this.individuals[k]);\n }\n }\n // randomly select a gene of a picked individual to mutate (only one gene to mutate at a time)\n for (const i of this.mutants) {\n const n = Math.floor(Math.random() * (i.chromosome.length - 1));\n i.setGene(n, Math.random());\n }\n }\n\n // check convergence bitwise (the so-called nominal convergence)\n isNominallyConverged(convergenceThreshold: number): boolean {\n if (this.survivors.length < 2) {\n return true;\n }\n const n = this.individuals[0].chromosome.length;\n const m = Math.max(2, Math.floor(this.survivors.length / 2));\n for (let i = 0; i < n; i++) {\n let average = 0;\n for (let j = 0; j < m; j++) {\n average += this.survivors[j].getGene(i);\n }\n average /= m;\n for (let j = 0; j < m; j++) {\n if (Math.abs(this.survivors[j].getGene(i) / average - 1.0) > convergenceThreshold) {\n return false;\n }\n }\n }\n return true;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { SearchMethod, GeneticAlgorithmSelectionMethod, ObjectiveFunctionType } from '../../../types';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { Population } from './Population';\nimport { Individual } from './Individual';\nimport { Constraint } from './Constraint';\n\nexport abstract class OptimizerGa {\n population: Population;\n objectiveFunctionType: ObjectiveFunctionType;\n convergenceThreshold: number;\n minima: number[];\n maxima: number[];\n foundation: FoundationModel;\n fitnessSharingRadius: number = 0.1;\n searchMethod: SearchMethod = SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION;\n localSearchRadius: number = 0.1;\n\n constraints: Constraint[] = [];\n stopped: boolean = true;\n mutationRate: number = 0.1;\n crossoverRate: number = 0.5;\n selectionRate: number = 0.5;\n maximumGenerations: number = 5;\n\n fittestOfGenerations: (Individual | null)[] = [];\n populationOfGenerations: (Population | null)[] = [];\n outsideGenerationCounter: number = 0;\n computeCounter: number = 0;\n converged: boolean = false;\n geneNames: string[];\n\n protected constructor(\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n populationSize: number,\n maximumGenerations: number,\n chromosomeLength: number,\n selectionMethod: GeneticAlgorithmSelectionMethod,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n discretizationSteps?: number,\n ) {\n this.population = new Population(populationSize, chromosomeLength, selectionMethod, discretizationSteps);\n this.objectiveFunctionType = objectiveFunctionType;\n this.convergenceThreshold = convergenceThreshold;\n this.maximumGenerations = maximumGenerations;\n this.searchMethod = searchMethod;\n this.localSearchRadius = localSearchRadius;\n this.geneNames = new Array(chromosomeLength);\n this.foundation = foundation;\n const cx = foundation.cx;\n const cy = foundation.cy;\n const lx = foundation.lx;\n const ly = foundation.ly;\n this.minima = new Array(chromosomeLength);\n this.maxima = new Array(chromosomeLength);\n for (let i = 0; i < chromosomeLength; i += 2) {\n this.setMinMax(i, cx - lx * 0.5, cx + lx * 0.5);\n this.setMinMax(i + 1, cy - ly * 0.5, cy + ly * 0.5);\n }\n this.fittestOfGenerations = new Array(this.maximumGenerations + 1);\n this.fittestOfGenerations.fill(null);\n this.populationOfGenerations = new Array(this.maximumGenerations);\n for (let i = 0; i < this.maximumGenerations; i++) {\n this.populationOfGenerations[i] = new Population(\n populationSize,\n chromosomeLength,\n selectionMethod,\n convergenceThreshold,\n );\n }\n }\n\n setMinMax(i: number, min: number, max: number): void {\n this.minima[i] = min;\n this.maxima[i] = max;\n }\n\n abstract applyFittest(): void;\n\n stop(): void {\n this.stopped = true;\n }\n\n shouldTerminate(): boolean {\n return this.outsideGenerationCounter >= this.maximumGenerations;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nexport class Random {\n // return a random number in a normal distribution with mean = 0 and variance = 1 using the Box-Muller transform.\n public static gaussian(): number {\n let u = 0,\n v = 0;\n while (u === 0) u = Math.random(); //Converting [0,1) to (0,1)\n while (v === 0) v = Math.random();\n return Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n }\n\n // return two random numbers in a normal distribution with mean = 0 and variance = 1 using the Box-Muller transform.\n public static twoGaussians(): number[] {\n let u = 0,\n v = 0;\n while (u === 0) u = Math.random(); //Converting [0,1) to (0,1)\n while (v === 0) v = Math.random();\n let r: number[] = new Array(2);\n let a = Math.sqrt(-2.0 * Math.log(u));\n let b = 2.0 * Math.PI * v;\n r[0] = a * Math.cos(b);\n r[1] = a * Math.sin(b);\n return r;\n }\n\n // return a random number in a poisson distribution with the specified lambda.\n public static poisson(lambda: number): number {\n let x = 0,\n p = Math.exp(-lambda),\n s = p;\n let u = Math.random();\n while (u > s) {\n x++;\n p *= lambda / x;\n s += p;\n }\n return x;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n *\n * The chromosome of an individual is encoded as follows:\n *\n * solarPanel[0].tiltAngle, solarPanel[1].tiltAngle, ..., solarPanel[n].tiltAngle\n *\n */\n\nimport { OptimizerGa } from './OptimizerGa';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { Individual } from './Individual';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { SearchMethod, GeneticAlgorithmSelectionMethod, ObjectiveFunctionType } from '../../../types';\nimport { HALF_PI } from '../../../constants';\nimport { Util } from '../../../Util';\nimport { Random } from '../../../Random';\n\nexport class SolarPanelTiltAngleOptimizerGa extends OptimizerGa {\n solarPanels: SolarPanelModel[];\n\n constructor(\n solarPanels: SolarPanelModel[],\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n populationSize: number,\n maximumGenerations: number,\n selectionMethod: GeneticAlgorithmSelectionMethod,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n ) {\n super(\n foundation,\n objectiveFunctionType,\n populationSize,\n maximumGenerations,\n solarPanels.length,\n selectionMethod,\n convergenceThreshold,\n searchMethod,\n localSearchRadius,\n );\n this.solarPanels = solarPanels;\n // set the firstborn to be the current design\n const firstBorn: Individual = this.population.individuals[0];\n for (const [i, panel] of solarPanels.entries()) {\n const normalizedValue = 0.5 * (1.0 + panel.tiltAngle / HALF_PI);\n firstBorn.setGene(i, normalizedValue);\n if (this.searchMethod === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION) {\n for (let k = 1; k < this.population.individuals.length; k++) {\n const individual: Individual = this.population.individuals[k];\n let v = Random.gaussian() * this.localSearchRadius + normalizedValue;\n while (v < 0 || v > 1) {\n v = Random.gaussian() * this.localSearchRadius + normalizedValue;\n }\n individual.setGene(i, v);\n }\n }\n this.geneNames[i] = 'Tilt Angle (' + panel.id + ')';\n }\n }\n\n applyFittest(): void {\n const best: Individual | undefined = this.population.getFittest();\n if (best) {\n for (let i = 0; i < best.chromosome.length; i++) {\n const gene = best.getGene(i);\n this.solarPanels[i].tiltAngle = (2 * gene - 1) * HALF_PI;\n }\n console.log('Fittest: ' + SolarPanelTiltAngleOptimizerGa.individualToString(best));\n }\n }\n\n static individualToString(individual: Individual): string {\n let s = 'F(';\n for (let i = 0; i < individual.chromosome.length; i++) {\n const gene = individual.getGene(i);\n s += Util.toDegrees((2 * gene - 1) * HALF_PI).toFixed(3) + '°, ';\n }\n return s.substring(0, s.length - 2) + ') = ' + individual.fitness.toFixed(5) + ' kWh';\n }\n\n startEvolving(): void {\n this.outsideGenerationCounter = 0;\n this.computeCounter = 0;\n this.fittestOfGenerations.fill(null);\n }\n\n // translate gene to structure for the specified individual\n translateIndividual(indexOfIndividual: number): void {\n const individual: Individual = this.population.individuals[indexOfIndividual];\n for (let i = 0; i < individual.chromosome.length; i++) {\n const gene = individual.getGene(i);\n this.solarPanels[i].tiltAngle = (2 * gene - 1) * HALF_PI;\n }\n }\n\n evolveIndividual(indexOfIndividual: number, fitness: number): boolean {\n const populationSize = this.population.individuals.length;\n if (!this.converged) {\n const individual: Individual = this.population.individuals[indexOfIndividual];\n individual.fitness = fitness;\n // the first individual of the first generation is used as a baseline\n // (imagine it as the fittest of the zeroth generation)\n if (this.computeCounter === 0 && indexOfIndividual === 0) {\n this.fittestOfGenerations[0] = individual.getCopy();\n }\n const generation = Math.floor(this.computeCounter / populationSize);\n console.log(\n 'Generation ' +\n (generation + 1) +\n ', individual ' +\n indexOfIndividual +\n ' : ' +\n SolarPanelTiltAngleOptimizerGa.individualToString(individual),\n );\n const savedIndividual = this.populationOfGenerations[generation]?.individuals[indexOfIndividual];\n if (savedIndividual) {\n for (let k = 0; k < individual.chromosome.length; k++) {\n savedIndividual.chromosome[k] = individual.chromosome[k];\n }\n savedIndividual.fitness = individual.fitness;\n }\n const isAtTheEndOfGeneration = this.computeCounter % populationSize === populationSize - 1;\n if (isAtTheEndOfGeneration) {\n this.population.saveGenes();\n this.population.evolve(this.selectionRate, this.crossoverRate);\n const best = this.population.getFittest();\n if (best) {\n this.fittestOfGenerations[generation + 1] = best.getCopy();\n }\n if (this.detectViolations()) {\n this.population.restoreGenes();\n } else {\n this.converged = this.population.isNominallyConverged(this.convergenceThreshold);\n if (!this.converged && this.searchMethod === SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION) {\n this.population.mutate(this.mutationRate);\n }\n }\n }\n this.computeCounter++;\n }\n return this.converged;\n }\n\n // if anyone in the current population doesn't meet the constraints, the entire population dies\n // and the algorithm reverts to the previous generation -- not efficient\n detectViolations(): boolean {\n return false; // TODO\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from '../../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { showError, showInfo } from '../../helpers';\nimport i18n from '../../i18n/i18n';\nimport { DatumEntry, DesignProblem, EvolutionMethod, ObjectiveFunctionType, ObjectType } from '../../types';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { SolarPanelTiltAngleOptimizerGa } from './algorithm/SolarPanelTiltAngleOptimizerGa';\nimport { FoundationModel } from '../../models/FoundationModel';\nimport { HALF_PI } from '../../constants';\nimport { Util } from '../../Util';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nconst SolarPanelTiltAngleGa = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pauseEvolution = usePrimitiveStore(Selector.pauseEvolution);\n const foundation = useStore(Selector.selectedElement) as FoundationModel;\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const setFittestIndividualResults = useStore(Selector.setFittestIndividualResults);\n const objectiveEvaluationIndex = usePrimitiveStore(Selector.objectiveEvaluationIndex);\n const geneLabels = useStore(Selector.variableLabels);\n const setGeneLabels = useStore(Selector.setVariableLabels);\n const params = useStore(Selector.evolutionaryAlgorithmState).geneticAlgorithmParams;\n\n const lang = { lng: language };\n const requestRef = useRef(0);\n const evolutionCompletedRef = useRef(false);\n const pauseRef = useRef(false);\n const solarPanelsRef = useRef();\n const optimizerRef = useRef();\n const individualIndexRef = useRef(0);\n const convergedRef = useRef(false);\n const initialSolarPanelsRef = useRef([]);\n\n useEffect(() => {\n if (params.problem !== DesignProblem.SOLAR_PANEL_TILT_ANGLE) return;\n if (evolutionMethod !== EvolutionMethod.GENETIC_ALGORITHM) return;\n if (runEvolution) {\n init();\n requestRef.current = requestAnimationFrame(evolve);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!evolutionCompletedRef.current) {\n showInfo(i18n.t('message.EvolutionAborted', lang));\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = false;\n });\n // revert to the initial solar panels\n if (initialSolarPanelsRef.current.length > 0) {\n solarPanelsRef.current = [...initialSolarPanelsRef.current];\n runCallback(true);\n }\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runEvolution]);\n\n useEffect(() => {\n pauseRef.current = pauseEvolution;\n if (pauseEvolution) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = true;\n });\n showInfo(i18n.t('message.EvolutionPaused', lang));\n } else {\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = false;\n });\n // continue the evolution\n evolve();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pauseEvolution]);\n\n // getting ready for the evolution\n const init = () => {\n if (!foundation) return;\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = true;\n state.objectiveEvaluationIndex = 0;\n });\n evolutionCompletedRef.current = false;\n const originalSolarPanels = getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[];\n // store a copy of the initial solar panels for possible reversion\n initialSolarPanelsRef.current.length = 0;\n for (const osp of originalSolarPanels) {\n initialSolarPanelsRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n }\n solarPanelsRef.current = [];\n const labels: (string | undefined)[] = [];\n for (const osp of originalSolarPanels) {\n solarPanelsRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n labels.push(osp.label);\n }\n if (solarPanelsRef.current.length > 0) {\n optimizerRef.current = new SolarPanelTiltAngleOptimizerGa(\n solarPanelsRef.current,\n foundation,\n params.objectiveFunctionType,\n params.populationSize,\n params.maximumGenerations,\n params.selectionMethod,\n params.convergenceThreshold,\n params.searchMethod,\n params.localSearchRadius,\n );\n optimizerRef.current.selectionRate = params.selectionRate;\n optimizerRef.current.crossoverRate = params.crossoverRate;\n optimizerRef.current.mutationRate = params.mutationRate;\n individualIndexRef.current = 0;\n convergedRef.current = false;\n setGeneLabels(labels);\n optimizerRef.current.startEvolving();\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = true;\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n } else {\n showError(i18n.t('message.EncounterEvolutionError', lang));\n }\n };\n\n const getTotal = (): number => {\n let total = 0;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n const dailyPvYield = useDataStore.getState().dailyPvYield;\n for (const datum of dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n const yearlyPvYield = useDataStore.getState().yearlyPvYield;\n for (const datum of yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n total *= 12 / daysPerYear;\n break;\n }\n return total;\n };\n\n // the increment of objectiveEvaluationIndex is used as a trigger to request the next animation frame\n useEffect(() => {\n if (!optimizerRef.current || !objectiveEvaluationIndex) return;\n // the number of individuals to evaluate is less than or equal to maximumGenerations * populationSize,\n // subject to the convergence criterion\n convergedRef.current = optimizerRef.current.evolveIndividual(\n individualIndexRef.current % params.populationSize,\n getTotal(),\n );\n updateResults();\n individualIndexRef.current++;\n optimizerRef.current.outsideGenerationCounter = Math.floor(individualIndexRef.current / params.populationSize);\n // recursive call to the next step of the evolution, which is to evaluate the next individual\n requestRef.current = requestAnimationFrame(evolve);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objectiveEvaluationIndex]);\n\n const evolve = () => {\n if (!optimizerRef.current) return;\n if (evolutionMethod !== EvolutionMethod.GENETIC_ALGORITHM) return;\n if (runEvolution && !pauseRef.current) {\n if (convergedRef.current || optimizerRef.current.outsideGenerationCounter >= params.maximumGenerations) {\n cancelAnimationFrame(requestRef.current);\n evolutionCompletedRef.current = true;\n optimizerRef.current.applyFittest();\n updateResults();\n runCallback(true);\n showInfo(\n i18n.t('message.EvolutionCompleted', lang) +\n '\\n' +\n (convergedRef.current\n ? i18n.t('message.ConvergenceThresholdHasBeenReached', lang)\n : i18n.t('message.MaximumNumberOfGenerationsHasBeenReached', lang)),\n );\n if (loggable && optimizerRef.current) {\n const best = optimizerRef.current.population.getFittest();\n if (best) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Genetic Algorithm for Solar Panel Tilt Angle Completed',\n result: SolarPanelTiltAngleOptimizerGa.individualToString(best),\n steps: optimizerRef.current?.outsideGenerationCounter,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n return;\n }\n optimizerRef.current.translateIndividual(individualIndexRef.current % params.populationSize);\n runCallback(false);\n }\n };\n\n const runCallback = (lastStep: boolean) => {\n usePrimitiveStore.setState((state) => {\n if (solarPanelsRef.current) {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = true;\n } else {\n state.runDailySimulationForSolarPanels = true;\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = true;\n } else {\n state.runYearlySimulationForSolarPanels = true;\n }\n break;\n default:\n showError(i18n.t('message.ObjectiveFunctionTypeError', lang), 60);\n }\n }\n });\n setCommonStore((state) => {\n if (solarPanelsRef.current) {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n break;\n default:\n showError(i18n.t('message.ObjectiveFunctionTypeError', lang), 60);\n }\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel) {\n const panel = e as SolarPanelModel;\n for (const sp of solarPanelsRef.current) {\n if (panel.id === sp.id) {\n panel.tiltAngle = sp.tiltAngle;\n break;\n }\n }\n }\n }\n }\n });\n if (lastStep) {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = false;\n state.evolutionInProgress = false;\n state.objectiveEvaluationIndex = 0;\n });\n }\n };\n\n const updateResults = () => {\n if (!optimizerRef.current) return;\n const results: DatumEntry[] = [];\n for (let index = 0; index < optimizerRef.current.fittestOfGenerations.length; index++) {\n const datum: DatumEntry = {};\n // the first fittest starts from index 1 because index 0 is used for the initial state\n const fg = optimizerRef.current.fittestOfGenerations[index];\n if (fg) {\n const n = fg.chromosome.length;\n datum['Step'] = index;\n for (let k = 0; k < n; k++) {\n let key = 'Var' + (k + 1);\n if (geneLabels[k]) {\n const trimmed = geneLabels[k]?.trim();\n if (trimmed && trimmed !== '') key = trimmed;\n }\n datum[key] = Util.toDegrees((2 * fg.chromosome[k] - 1) * HALF_PI);\n }\n datum['Objective'] = fg.fitness;\n // the first generation of population starts from index 0\n if (index > 0) {\n const pg = optimizerRef.current.populationOfGenerations[index - 1];\n if (pg) {\n let counter = 0;\n for (let i = 0; i < pg.individuals.length; i++) {\n const n = pg.individuals[i].chromosome.length;\n for (let k = 0; k < n; k++) {\n const key = 'Individual' + ++counter;\n datum[key] = Util.toDegrees((2 * pg.individuals[i].chromosome[k] - 1) * HALF_PI);\n }\n }\n }\n }\n }\n if (Object.keys(datum).length > 0) {\n results.push(datum);\n }\n }\n setFittestIndividualResults(results);\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelTiltAngleGa);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n *\n * The chromosome of an individual solar panel array has three genes:\n * tilt angle (a), inter-row spacing (d), panel row number on rack (r)\n *\n */\n\nimport { OptimizerGa } from './OptimizerGa';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { Individual } from './Individual';\nimport {\n GeneticAlgorithmSelectionMethod,\n ObjectiveFunctionType,\n Orientation,\n RowAxis,\n SearchMethod,\n} from '../../../types';\nimport { HALF_PI } from '../../../constants';\nimport { Util } from '../../../Util';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { PvModel } from '../../../models/PvModel';\nimport { Rectangle } from '../../../models/Rectangle';\nimport { SolarPanelLayoutRelative } from '../../../pd/SolarPanelLayoutRelative';\nimport { SolarPanelArrayLayoutParams } from '../../../stores/SolarPanelArrayLayoutParams';\n\nexport class SolarPanelArrayOptimizerGa extends OptimizerGa {\n polygon: PolygonModel;\n pvModel: PvModel;\n orientation: Orientation = Orientation.landscape;\n rowAxis: RowAxis = RowAxis.leftRight;\n poleHeight: number = 2;\n poleSpacing: number = 5;\n bounds?: Rectangle;\n solarPanelCount: number = 0;\n solarRackCount: number = 0;\n\n // allowable ranges for genes (tilt angle from -90° to 90°)\n minimumInterRowSpacing: number = 2; // in meters\n maximumInterRowSpacing: number = 10; // in meters\n minimumRowsPerRack: number = 1;\n maximumRowsPerRack: number = 6;\n minimumTiltAngle: number = -HALF_PI;\n maximumTiltAngle: number = HALF_PI;\n margin: number = 0;\n\n constructor(\n pvModel: PvModel,\n rowAxis: RowAxis,\n orientation: Orientation,\n poleHeight: number,\n poleSpacing: number,\n initialSolarPanels: SolarPanelModel[],\n initialLayoutParams: SolarPanelArrayLayoutParams,\n polygon: PolygonModel,\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n populationSize: number,\n maximumGenerations: number,\n selectionMethod: GeneticAlgorithmSelectionMethod,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n minimumInterRowSpacing: number,\n maximumInterRowSpacing: number,\n minimumRowsPerRack: number,\n maximumRowsPerRack: number,\n minimumTiltAngle: number,\n maximumTiltAngle: number,\n margin: number,\n ) {\n super(\n foundation,\n objectiveFunctionType,\n populationSize,\n maximumGenerations,\n 3,\n selectionMethod,\n convergenceThreshold,\n searchMethod,\n localSearchRadius,\n );\n this.polygon = polygon;\n this.pvModel = pvModel;\n this.rowAxis = rowAxis;\n this.orientation = orientation;\n this.poleHeight = poleHeight;\n this.poleSpacing = poleSpacing;\n this.minimumInterRowSpacing = minimumInterRowSpacing;\n this.maximumInterRowSpacing = maximumInterRowSpacing;\n this.minimumRowsPerRack = minimumRowsPerRack;\n this.maximumRowsPerRack = maximumRowsPerRack;\n this.minimumTiltAngle = minimumTiltAngle;\n this.maximumTiltAngle = maximumTiltAngle;\n this.margin = margin;\n this.setInterRowSpacingBounds();\n this.geneNames[0] = 'Tilt Angle';\n this.geneNames[1] = 'Inter-Row Spacing';\n this.geneNames[2] = 'Rack Width';\n // set the firstborn to be the current design, if any\n if (initialSolarPanels && initialSolarPanels.length > 0) {\n const sp1 = initialSolarPanels[0];\n\n if (initialSolarPanels.length > 1) {\n const firstBorn: Individual = this.population.individuals[0];\n // calculate the genes of the initial solar panels\n let gene1 =\n this.maximumTiltAngle === this.minimumTiltAngle\n ? 0\n : (sp1.tiltAngle - this.minimumTiltAngle) / (this.maximumTiltAngle - this.minimumTiltAngle);\n firstBorn.setGene(0, gene1);\n\n const sp2 = initialSolarPanels[1];\n const interRowSpacing = initialLayoutParams\n ? initialLayoutParams.interRowSpacing\n : this.rowAxis === RowAxis.upDown\n ? Math.abs(sp1.cx - sp2.cx) * this.foundation.lx\n : Math.abs(sp1.cy - sp2.cy) * this.foundation.ly;\n let gene2 =\n this.maximumInterRowSpacing === this.minimumInterRowSpacing\n ? 0\n : (interRowSpacing - this.minimumInterRowSpacing) /\n (this.maximumInterRowSpacing - this.minimumInterRowSpacing);\n if (gene2 < 0) gene2 = 0;\n else if (gene2 > 1) gene2 = 1;\n firstBorn.setGene(1, gene2);\n\n const rowsPerRack = initialLayoutParams\n ? initialLayoutParams.rowsPerRack\n : Math.max(\n 1,\n Math.round(sp1.ly / (sp1.orientation === Orientation.portrait ? pvModel.length : pvModel.width)),\n );\n let gene3 =\n this.maximumRowsPerRack === this.minimumRowsPerRack\n ? 0\n : (rowsPerRack - this.minimumRowsPerRack) / (this.maximumRowsPerRack - this.minimumRowsPerRack);\n if (gene3 < 0) gene3 = 0;\n else if (gene3 > 1) gene3 = 1;\n firstBorn.setGene(2, gene3);\n }\n }\n }\n\n private setInterRowSpacingBounds() {\n this.bounds = Util.calculatePolygonBounds(this.polygon.vertices);\n }\n\n applyFittest(): void {\n const best: Individual | undefined = this.population.getFittest();\n if (best) {\n console.log(\n 'Fittest: ' +\n this.individualToString(best) +\n ', rack count: ' +\n this.solarRackCount +\n ', panel count: ' +\n this.solarPanelCount,\n );\n }\n }\n\n private getObjectiveUnit(): string | null {\n switch (this.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n return 'kWh';\n case ObjectiveFunctionType.YEARLY_PROFIT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n return 'dollars';\n }\n return null;\n }\n\n individualToString(individual: Individual): string {\n let s =\n 'F(' +\n Util.toDegrees(\n individual.getGene(0) * (this.maximumTiltAngle - this.minimumTiltAngle) + this.minimumTiltAngle,\n ).toFixed(3) +\n '°, ';\n s +=\n (\n individual.getGene(1) * (this.maximumInterRowSpacing - this.minimumInterRowSpacing) +\n this.minimumInterRowSpacing\n ).toFixed(3) + 'm, ';\n s +=\n Math.floor(\n individual.getGene(2) * (this.maximumRowsPerRack - this.minimumRowsPerRack) + this.minimumRowsPerRack,\n ) + ')';\n return s + ' = ' + individual.fitness.toFixed(5) + ' ' + this.getObjectiveUnit();\n }\n\n startEvolving(): void {\n this.outsideGenerationCounter = 0;\n this.computeCounter = 0;\n this.fittestOfGenerations.fill(null);\n this.setInterRowSpacingBounds();\n }\n\n translateIndividualByIndex(indexOfIndividual: number): SolarPanelModel[] {\n return this.translateIndividual(this.population.individuals[indexOfIndividual]);\n }\n\n translateBest(): SolarPanelModel[] {\n const best: Individual | undefined = this.population.getFittest();\n if (best) {\n return this.translateIndividual(best);\n }\n return [];\n }\n\n // translate gene to structure for the specified individual\n private translateIndividual(individual: Individual): SolarPanelModel[] {\n if (!this.bounds) return [];\n const tiltAngle = individual.getGene(0) * (this.maximumTiltAngle - this.minimumTiltAngle) + this.minimumTiltAngle;\n const interRowSpacing =\n individual.getGene(1) * (this.maximumInterRowSpacing - this.minimumInterRowSpacing) + this.minimumInterRowSpacing;\n const rowsPerRack = Math.floor(\n individual.getGene(2) * (this.maximumRowsPerRack - this.minimumRowsPerRack) + this.minimumRowsPerRack,\n );\n const solarPanels = SolarPanelLayoutRelative.create(\n this.polygon,\n this.foundation,\n this.pvModel,\n this.orientation,\n tiltAngle,\n rowsPerRack,\n interRowSpacing,\n this.rowAxis,\n this.poleHeight,\n this.poleSpacing,\n this.margin,\n );\n this.solarPanelCount = 0;\n this.solarRackCount = solarPanels.length;\n if (solarPanels.length > 0) {\n for (const sp of solarPanels) {\n this.solarPanelCount += Util.countSolarPanelsOnRack(sp, this.pvModel);\n }\n }\n return solarPanels;\n }\n\n evolveIndividual(indexOfIndividual: number, fitness: number): boolean {\n const populationSize = this.population.individuals.length;\n if (!this.converged) {\n const individual: Individual = this.population.individuals[indexOfIndividual];\n individual.fitness = fitness;\n // the first individual of the first generation is used as a baseline\n // (imagine it as the fittest of the zeroth generation)\n if (this.computeCounter === 0 && indexOfIndividual === 0) {\n this.fittestOfGenerations[0] = individual.getCopy();\n }\n const generation = Math.floor(this.computeCounter / populationSize);\n console.log(\n 'Generation ' +\n (generation + 1) +\n ', individual ' +\n indexOfIndividual +\n ' : ' +\n this.individualToString(individual) +\n ', rack count: ' +\n this.solarRackCount +\n ', panel count: ' +\n this.solarPanelCount,\n );\n const savedIndividual = this.populationOfGenerations[generation]?.individuals[indexOfIndividual];\n if (savedIndividual) {\n for (let k = 0; k < individual.chromosome.length; k++) {\n savedIndividual.chromosome[k] = individual.chromosome[k];\n }\n savedIndividual.fitness = individual.fitness;\n }\n const isAtTheEndOfGeneration = this.computeCounter % populationSize === populationSize - 1;\n if (isAtTheEndOfGeneration) {\n this.population.saveGenes();\n this.population.evolve(this.selectionRate, this.crossoverRate);\n const best = this.population.getFittest();\n if (best) {\n this.fittestOfGenerations[generation + 1] = best.getCopy();\n }\n if (this.detectViolations()) {\n this.population.restoreGenes();\n } else {\n this.converged = this.population.isNominallyConverged(this.convergenceThreshold);\n if (!this.converged && this.searchMethod === SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION) {\n this.population.mutate(this.mutationRate);\n }\n }\n }\n this.computeCounter++;\n }\n return this.converged;\n }\n\n // if anyone in the current population doesn't meet the constraints, the entire population dies\n // and the algorithm reverts to the previous generation -- not efficient\n detectViolations(): boolean {\n return false; // TODO\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from '../../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { showInfo } from '../../helpers';\nimport i18n from '../../i18n/i18n';\nimport {\n DatumEntry,\n DesignProblem,\n EvolutionMethod,\n ObjectiveFunctionType,\n ObjectType,\n Orientation,\n RowAxis,\n} from '../../types';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { FoundationModel } from '../../models/FoundationModel';\nimport { PolygonModel } from '../../models/PolygonModel';\nimport { SolarPanelArrayOptimizerGa } from './algorithm/SolarPanelArrayOptimizerGa';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nconst SolarPanelArrayGa = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pauseEvolution = usePrimitiveStore(Selector.pauseEvolution);\n const getParent = useStore(Selector.getParent);\n const polygon = useStore(Selector.selectedElement) as PolygonModel;\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const setFittestIndividualResults = useStore(Selector.setFittestIndividualResults);\n const objectiveEvaluationIndex = usePrimitiveStore(Selector.objectiveEvaluationIndex);\n const geneLabels = useStore(Selector.variableLabels);\n const setGeneLabels = useStore(Selector.setVariableLabels);\n const getPvModule = useStore(Selector.getPvModule);\n const removeElementsByReferenceId = useStore(Selector.removeElementsByReferenceId);\n const params = useStore(Selector.evolutionaryAlgorithmState).geneticAlgorithmParams;\n const constraints = useStore.getState().solarPanelArrayLayoutConstraints;\n const economics = useStore.getState().economicsParams;\n const currentLayoutParams = useStore.getState().solarPanelArrayLayoutParams;\n\n const requestRef = useRef(0);\n const evolutionCompletedRef = useRef(false);\n const pauseRef = useRef(false);\n const optimizerRef = useRef();\n const individualIndexRef = useRef(0);\n const convergedRef = useRef(false);\n const solarPanelArrayRef = useRef([]);\n const initialSolarPanelArrayRef = useRef([]);\n\n const lang = { lng: language };\n const foundation = polygon ? (getParent(polygon) as FoundationModel) : undefined;\n\n useEffect(() => {\n if (evolutionMethod !== EvolutionMethod.GENETIC_ALGORITHM) return;\n if (params.problem !== DesignProblem.SOLAR_PANEL_ARRAY) return;\n if (runEvolution) {\n init();\n requestRef.current = requestAnimationFrame(evolve);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!evolutionCompletedRef.current) {\n showInfo(i18n.t('message.EvolutionAborted', lang));\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = false;\n state.runDailySimulationForSolarPanels = false;\n state.runYearlySimulationForSolarPanels = false;\n });\n // this may put the function call to the last in the event queue to avoid crash in ray cast\n setTimeout(() => {\n // revert to the initial solar panel array\n if (solarPanelArrayRef.current.length > 0) {\n removeElementsByReferenceId(polygon.id, false);\n }\n if (initialSolarPanelArrayRef.current.length > 0) {\n solarPanelArrayRef.current = [...initialSolarPanelArrayRef.current];\n runCallback(true);\n }\n }, 100);\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runEvolution]);\n\n useEffect(() => {\n pauseRef.current = pauseEvolution;\n if (pauseEvolution) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = true;\n });\n showInfo(i18n.t('message.EvolutionPaused', lang));\n } else {\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = false;\n });\n // continue the evolution\n evolve();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pauseEvolution]);\n\n // getting ready for the evolution\n const init = () => {\n if (!polygon || !foundation) return;\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = true;\n state.objectiveEvaluationIndex = 0;\n });\n evolutionCompletedRef.current = false;\n const originalSolarPanels = getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[];\n // store a copy of the initial solar panels for possible reversion\n initialSolarPanelArrayRef.current.length = 0;\n for (const osp of originalSolarPanels) {\n initialSolarPanelArrayRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n }\n optimizerRef.current = new SolarPanelArrayOptimizerGa(\n getPvModule(constraints.pvModelName ?? 'CS6X-355P-FG'),\n constraints.rowAxis ?? RowAxis.leftRight,\n constraints.orientation ?? Orientation.landscape,\n constraints.poleHeight ?? 1,\n constraints.poleSpacing ?? 3,\n initialSolarPanelArrayRef.current,\n currentLayoutParams,\n polygon,\n foundation,\n params.objectiveFunctionType,\n params.populationSize,\n params.maximumGenerations,\n params.selectionMethod,\n params.convergenceThreshold,\n params.searchMethod,\n params.localSearchRadius,\n constraints.minimumInterRowSpacing,\n constraints.maximumInterRowSpacing,\n constraints.minimumRowsPerRack,\n constraints.maximumRowsPerRack,\n constraints.minimumTiltAngle,\n constraints.maximumTiltAngle,\n constraints.margin ?? 0,\n );\n optimizerRef.current.selectionRate = params.selectionRate;\n optimizerRef.current.crossoverRate = params.crossoverRate;\n optimizerRef.current.mutationRate = params.mutationRate;\n individualIndexRef.current = 0;\n convergedRef.current = false;\n setGeneLabels([...optimizerRef.current.geneNames]);\n optimizerRef.current.startEvolving();\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = true;\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n };\n\n const getTotal = (): number => {\n let total = 0;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n const dailyPvYield = useDataStore.getState().dailyPvYield;\n for (const datum of dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n const yearlyPvYield = useDataStore.getState().yearlyPvYield;\n for (const datum of yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n total *= 12 / daysPerYear;\n break;\n }\n const count = optimizerRef.current?.solarPanelCount;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n if (count) total /= count;\n break;\n case ObjectiveFunctionType.DAILY_PROFIT:\n total = total * economics.electricitySellingPrice;\n if (count) total -= count * economics.operationalCostPerUnit;\n break;\n case ObjectiveFunctionType.YEARLY_PROFIT:\n total = total * economics.electricitySellingPrice;\n if (count) total -= count * economics.operationalCostPerUnit * 365;\n break;\n }\n return total;\n };\n\n // the increment of objectiveEvaluationIndex is used as a trigger to request the next animation frame\n useEffect(() => {\n if (!optimizerRef.current || !objectiveEvaluationIndex) return;\n // the number of individuals to evaluate is less than or equal to maximumGenerations * populationSize,\n // subject to the convergence criterion\n convergedRef.current = optimizerRef.current.evolveIndividual(\n individualIndexRef.current % params.populationSize,\n getTotal(),\n );\n updateResults();\n individualIndexRef.current++;\n optimizerRef.current.outsideGenerationCounter = Math.floor(individualIndexRef.current / params.populationSize);\n // recursive call to the next step of the evolution, which is to evaluate the next individual\n requestRef.current = requestAnimationFrame(evolve);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objectiveEvaluationIndex]);\n\n const evolve = () => {\n if (!optimizerRef.current) return;\n if (evolutionMethod !== EvolutionMethod.GENETIC_ALGORITHM) return;\n if (runEvolution && !pauseRef.current) {\n if (convergedRef.current || optimizerRef.current.outsideGenerationCounter >= params.maximumGenerations) {\n cancelAnimationFrame(requestRef.current);\n evolutionCompletedRef.current = true;\n if (solarPanelArrayRef.current.length > 0) {\n removeElementsByReferenceId(polygon.id, false);\n }\n solarPanelArrayRef.current = optimizerRef.current.translateBest();\n optimizerRef.current.applyFittest();\n updateResults();\n runCallback(true);\n showInfo(\n i18n.t('message.EvolutionCompleted', lang) +\n '\\n' +\n (convergedRef.current\n ? i18n.t('message.ConvergenceThresholdHasBeenReached', lang)\n : i18n.t('message.MaximumNumberOfGenerationsHasBeenReached', lang)),\n );\n if (optimizerRef.current) {\n const best = optimizerRef.current.population.getFittest();\n if (best) {\n const tiltAngle =\n best.getGene(0) * (constraints.maximumTiltAngle - constraints.minimumTiltAngle) +\n constraints.minimumTiltAngle;\n const interRowSpacing =\n best.getGene(1) * (constraints.maximumInterRowSpacing - constraints.minimumInterRowSpacing) +\n constraints.minimumInterRowSpacing;\n const rowsPerRack = Math.floor(\n best.getGene(2) * (constraints.maximumRowsPerRack - constraints.minimumRowsPerRack) +\n constraints.minimumRowsPerRack,\n );\n setCommonStore((state) => {\n state.solarPanelArrayLayoutParams.tiltAngle = tiltAngle;\n state.solarPanelArrayLayoutParams.interRowSpacing = interRowSpacing;\n state.solarPanelArrayLayoutParams.rowsPerRack = rowsPerRack;\n state.solarPanelArrayLayoutParams.orientation = constraints.orientation;\n state.solarPanelArrayLayoutParams.poleHeight = constraints.poleHeight;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Genetic Algorithm for Solar Panel Array Layout Completed',\n result: optimizerRef.current?.individualToString(best),\n steps: optimizerRef.current?.outsideGenerationCounter,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n }\n return;\n }\n removeElementsByReferenceId(polygon.id, false);\n // this may put the function call to the last in the event queue to avoid crash in ray cast\n // when switching the optimization method\n setTimeout(() => {\n if (optimizerRef.current) {\n solarPanelArrayRef.current = optimizerRef.current.translateIndividualByIndex(\n individualIndexRef.current % params.populationSize,\n );\n }\n runCallback(false);\n }, 100);\n }\n };\n\n const runCallback = (lastStep: boolean) => {\n usePrimitiveStore.setState((state) => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = true;\n } else {\n state.runDailySimulationForSolarPanels = true;\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = true;\n } else {\n state.runYearlySimulationForSolarPanels = true;\n }\n break;\n }\n });\n setCommonStore((state) => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n break;\n }\n state.elements.push(...solarPanelArrayRef.current);\n });\n if (lastStep) {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = false;\n state.evolutionInProgress = false;\n state.objectiveEvaluationIndex = 0;\n });\n }\n };\n\n const updateResults = () => {\n if (!optimizerRef.current) return;\n const results: DatumEntry[] = [];\n for (let index = 0; index < optimizerRef.current.fittestOfGenerations.length; index++) {\n const datum: DatumEntry = {};\n // the first fittest starts from index 1 because index 0 is used for the initial state\n const fg = optimizerRef.current.fittestOfGenerations[index];\n if (fg) {\n const n = fg.chromosome.length;\n datum['Step'] = index;\n for (let k = 0; k < n; k++) {\n datum[geneLabels[k] ?? 'Var' + (k + 1)] = fg.chromosome[k];\n }\n datum['Objective'] = fg.fitness;\n // the first generation of population starts from index 0\n if (index > 0) {\n const pg = optimizerRef.current.populationOfGenerations[index - 1];\n if (pg) {\n let counter = 0;\n for (let i = 0; i < pg.individuals.length; i++) {\n const n = pg.individuals[i].chromosome.length;\n for (let k = 0; k < n; k++) {\n datum['Individual' + ++counter] = pg.individuals[i].chromosome[k];\n }\n }\n }\n }\n }\n if (Object.keys(datum).length > 0) {\n results.push(datum);\n }\n }\n setFittestIndividualResults(results);\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelArrayGa);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Random } from '../../../Random';\n\nexport class Particle {\n position: number[]; // normalized to [0, 1)\n velocity: number[];\n\n // store the fitness value evaluated by the objective function (NaN means not evaluated yet)\n fitness: number = Number.NaN;\n\n // the position that results in the best ever fitness of this particle\n bestPositionOfParticle: number[];\n\n // construct a particle with a random position within [0, 1) and\n // a random velocity within vmax as the variance of the normal distribution and zero as the average\n constructor(dimension: number, vmax?: number) {\n this.position = new Array();\n this.velocity = new Array();\n this.bestPositionOfParticle = new Array();\n for (let i = 0; i < dimension; i++) {\n const r = Math.random();\n this.position.push(r);\n this.bestPositionOfParticle.push(r);\n if (vmax) {\n this.velocity.push(Random.gaussian() * vmax);\n } else {\n this.velocity.push(0);\n }\n }\n }\n\n updateBestPosition() {\n for (let i = 0; i < this.bestPositionOfParticle.length; i++) {\n this.bestPositionOfParticle[i] = this.position[i];\n }\n }\n\n compare(p: Particle): number {\n if (isNaN(this.fitness) || isNaN(p.fitness)) throw new Error('Fitness cannot be NaN');\n if (this.fitness > p.fitness) return 1;\n if (this.fitness < p.fitness) return -1;\n return 0;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Particle } from './Particle';\n\nexport class Swarm {\n particles: Particle[];\n\n // the normalized position that results in the best ever fitness of this swarm\n bestPositionOfSwarm: number[];\n bestFitness: number = Number.NaN;\n\n constructor(size: number, dimension: number, vmax?: number) {\n this.particles = new Array();\n for (let i = 0; i < size; i++) {\n this.particles.push(new Particle(dimension, vmax));\n }\n this.bestPositionOfSwarm = new Array(dimension);\n }\n\n // sort the fitness in the descending order (sort b before a if b's fitness is higher than a's)\n sort(): void {\n this.particles.sort((a, b) => b.compare(a));\n if (Number.isNaN(this.bestFitness) || this.bestFitness < this.particles[0].fitness) {\n for (let i = 0; i < this.bestPositionOfSwarm.length; i++) {\n this.bestPositionOfSwarm[i] = this.particles[0].position[i];\n }\n this.bestFitness = this.particles[0].fitness;\n }\n }\n\n // check convergence bitwise (the so-called nominal convergence)\n isNominallyConverged(convergenceThreshold: number, top: number): boolean {\n if (top <= 0) throw new Error('top must be greater than 0');\n const n = this.particles[0].position.length;\n for (let i = 0; i < n; i++) {\n let average = 0;\n for (let j = 0; j < top; j++) {\n average += this.particles[j].position[i];\n }\n average /= top;\n for (let j = 0; j < top; j++) {\n if (Math.abs(this.particles[j].position[i] / average - 1.0) > convergenceThreshold) {\n return false;\n }\n }\n }\n return true;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { Swarm } from './Swarm';\nimport { ObjectiveFunctionType, SearchMethod } from '../../../types';\n\nexport abstract class OptimizerPso {\n swarm: Swarm;\n objectiveFunctionType: ObjectiveFunctionType;\n foundation: FoundationModel;\n stopped: boolean = true;\n inertia: number = 0.8;\n cognitiveCoefficient: number = 0.1;\n socialCoefficient: number = 0.1;\n maximumSteps: number = 5;\n bestPositionOfSteps: (number[] | null)[] = [];\n bestFitnessOfSteps: number[] = [];\n swarmOfSteps: (Swarm | null)[] = [];\n outsideStepCounter: number = 0;\n computeCounter: number = 0;\n convergenceThreshold: number = 0.1;\n converged: boolean = false;\n searchMethod: SearchMethod = SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION;\n localSearchRadius: number = 0.1;\n\n protected constructor(\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n swarmSize: number,\n vmax: number,\n maximumSteps: number,\n particleDimension: number,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n ) {\n this.swarm = new Swarm(swarmSize, particleDimension, vmax);\n this.objectiveFunctionType = objectiveFunctionType;\n this.convergenceThreshold = convergenceThreshold;\n this.searchMethod = searchMethod;\n this.localSearchRadius = localSearchRadius;\n this.maximumSteps = maximumSteps;\n this.foundation = foundation;\n this.bestPositionOfSteps = new Array(this.maximumSteps + 1);\n this.bestPositionOfSteps.fill(null);\n this.bestFitnessOfSteps = new Array(this.maximumSteps + 1);\n this.bestFitnessOfSteps.fill(0);\n this.swarmOfSteps = new Array(this.maximumSteps);\n for (let i = 0; i < this.maximumSteps; i++) {\n this.swarmOfSteps[i] = new Swarm(swarmSize, particleDimension);\n }\n }\n\n moveSwarm() {\n for (const p of this.swarm.particles) {\n const n = p.position.length;\n for (let i = 0; i < n; i++) {\n p.velocity[i] =\n this.inertia * p.velocity[i] +\n this.cognitiveCoefficient * Math.random() * (p.bestPositionOfParticle[i] - p.position[i]) +\n this.socialCoefficient * Math.random() * (this.swarm.bestPositionOfSwarm[i] - p.position[i]);\n p.position[i] += p.velocity[i];\n }\n }\n }\n\n abstract applyFittest(): void;\n\n stop(): void {\n this.stopped = true;\n }\n\n shouldTerminate(): boolean {\n return this.outsideStepCounter >= this.maximumSteps;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n *\n * A particle has the following properties\n *\n * solarPanel[0].tiltAngle, solarPanel[1].tiltAngle, ..., solarPanel[n].tiltAngle\n *\n */\n\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { HALF_PI } from '../../../constants';\nimport { Util } from '../../../Util';\nimport { Random } from '../../../Random';\nimport { OptimizerPso } from './OptimizerPso';\nimport { Particle } from './Particle';\nimport { ObjectiveFunctionType, SearchMethod } from '../../../types';\n\nexport class SolarPanelTiltAngleOptimizerPso extends OptimizerPso {\n solarPanels: SolarPanelModel[];\n\n constructor(\n solarPanels: SolarPanelModel[],\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n swarmSize: number,\n vmax: number,\n maximumSteps: number,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n ) {\n super(\n foundation,\n objectiveFunctionType,\n swarmSize,\n vmax,\n maximumSteps,\n solarPanels.length,\n convergenceThreshold,\n searchMethod,\n localSearchRadius,\n );\n this.solarPanels = solarPanels;\n // set the first particle to be the current design\n const firstParticle: Particle = this.swarm.particles[0];\n for (const [i, panel] of solarPanels.entries()) {\n const normalizedValue = 0.5 * (1.0 + panel.tiltAngle / HALF_PI);\n firstParticle.position[i] = normalizedValue;\n if (this.searchMethod === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION) {\n for (let k = 1; k < this.swarm.particles.length; k++) {\n const particle: Particle = this.swarm.particles[k];\n let v = Random.gaussian() * this.localSearchRadius + normalizedValue;\n while (v < 0 || v > 1) {\n v = Random.gaussian() * this.localSearchRadius + normalizedValue;\n }\n particle.position[i] = v;\n }\n }\n }\n }\n\n applyFittest(): void {\n const best = this.swarm.bestPositionOfSwarm;\n if (best) {\n for (let i = 0; i < best.length; i++) {\n this.solarPanels[i].tiltAngle = (2 * best[i] - 1) * HALF_PI;\n }\n console.log('Best: ' + SolarPanelTiltAngleOptimizerPso.particleToString(best, this.swarm.bestFitness));\n }\n }\n\n static particleToString(position: number[], bestFitness: number): string {\n let s = 'F(';\n for (let i = 0; i < position.length; i++) {\n s += Util.toDegrees((2 * position[i] - 1) * HALF_PI).toFixed(3) + '°, ';\n }\n return s.substring(0, s.length - 2) + ') = ' + bestFitness.toFixed(5) + ' kWh';\n }\n\n startEvolving(): void {\n this.outsideStepCounter = 0;\n this.computeCounter = 0;\n this.bestPositionOfSteps.fill(null);\n this.bestFitnessOfSteps.fill(0);\n }\n\n // translate position to structure for the specified particle\n translateParticle(indexOfParticle: number): void {\n const particle: Particle = this.swarm.particles[indexOfParticle];\n for (let i = 0; i < particle.position.length; i++) {\n const p = particle.position[i];\n this.solarPanels[i].tiltAngle = (2 * p - 1) * HALF_PI;\n }\n }\n\n updateParticle(indexOfParticle: number, fitness: number): boolean {\n const swarmSize = this.swarm.particles.length;\n if (!this.converged) {\n const particle: Particle = this.swarm.particles[indexOfParticle];\n if (fitness > particle.fitness) {\n particle.updateBestPosition();\n }\n particle.fitness = fitness;\n // the first particle at the first step is used as a baseline\n if (this.computeCounter === 0 && indexOfParticle === 0) {\n this.bestPositionOfSteps[0] = [...particle.position];\n this.bestFitnessOfSteps[0] = fitness;\n }\n const step = Math.floor(this.computeCounter / swarmSize);\n console.log(\n 'Step ' +\n (step + 1) +\n ', particle ' +\n indexOfParticle +\n ' : ' +\n SolarPanelTiltAngleOptimizerPso.particleToString(particle.position, fitness),\n );\n const savedParticle = this.swarmOfSteps[step]?.particles[indexOfParticle];\n if (savedParticle) {\n for (let k = 0; k < particle.position.length; k++) {\n savedParticle.position[k] = particle.position[k];\n }\n savedParticle.fitness = particle.fitness;\n }\n const isAtTheEndOfStep = this.computeCounter % swarmSize === swarmSize - 1;\n if (isAtTheEndOfStep) {\n this.swarm.sort();\n const best = this.swarm.bestPositionOfSwarm;\n if (best) {\n this.bestPositionOfSteps[step + 1] = [...best];\n this.bestFitnessOfSteps[step + 1] = this.swarm.bestFitness;\n }\n this.converged = this.swarm.isNominallyConverged(\n this.convergenceThreshold,\n Math.max(2, this.swarm.particles.length / 4),\n );\n this.moveSwarm();\n }\n this.computeCounter++;\n }\n return this.converged;\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from '../../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { showError, showInfo } from '../../helpers';\nimport i18n from '../../i18n/i18n';\nimport { DatumEntry, DesignProblem, EvolutionMethod, ObjectiveFunctionType, ObjectType } from '../../types';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { FoundationModel } from '../../models/FoundationModel';\nimport { HALF_PI } from '../../constants';\nimport { Util } from '../../Util';\nimport { SolarPanelTiltAngleOptimizerPso } from './algorithm/SolarPanelTiltAngleOptimizerPso';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nconst SolarPanelTiltAnglePso = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pauseEvolution = usePrimitiveStore(Selector.pauseEvolution);\n const foundation = useStore(Selector.selectedElement) as FoundationModel;\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const setFittestParticleResults = useStore(Selector.setFittestIndividualResults);\n const objectiveEvaluationIndex = usePrimitiveStore(Selector.objectiveEvaluationIndex);\n const particleLabels = useStore(Selector.variableLabels);\n const setParticleLabels = useStore(Selector.setVariableLabels);\n const params = useStore(Selector.evolutionaryAlgorithmState).particleSwarmOptimizationParams;\n\n const lang = { lng: language };\n const requestRef = useRef(0);\n const evolutionCompletedRef = useRef(false);\n const pauseRef = useRef(false);\n const solarPanelsRef = useRef();\n const optimizerRef = useRef();\n const particleIndexRef = useRef(0);\n const convergedRef = useRef(false);\n const initialSolarPanelsRef = useRef([]);\n\n useEffect(() => {\n if (params.problem !== DesignProblem.SOLAR_PANEL_TILT_ANGLE) return;\n if (evolutionMethod !== EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) return;\n if (runEvolution) {\n init();\n requestRef.current = requestAnimationFrame(evolve);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!evolutionCompletedRef.current) {\n showInfo(i18n.t('message.EvolutionAborted', lang));\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = false;\n });\n // revert to the initial solar panels\n if (initialSolarPanelsRef.current.length > 0) {\n solarPanelsRef.current = [...initialSolarPanelsRef.current];\n runCallback(true);\n }\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runEvolution]);\n\n useEffect(() => {\n pauseRef.current = pauseEvolution;\n if (pauseEvolution) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = true;\n });\n showInfo(i18n.t('message.EvolutionPaused', lang));\n } else {\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = false;\n });\n // continue the evolution\n evolve();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pauseEvolution]);\n\n // getting ready for the evolution\n const init = () => {\n if (!foundation) return;\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = true;\n state.objectiveEvaluationIndex = 0;\n });\n evolutionCompletedRef.current = false;\n const originalSolarPanels = getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[];\n // store a copy of the initial solar panels for possible reversion\n initialSolarPanelsRef.current.length = 0;\n for (const osp of originalSolarPanels) {\n initialSolarPanelsRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n }\n solarPanelsRef.current = [];\n const labels: (string | undefined)[] = [];\n for (const osp of originalSolarPanels) {\n solarPanelsRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n labels.push(osp.label);\n }\n if (solarPanelsRef.current.length > 0) {\n optimizerRef.current = new SolarPanelTiltAngleOptimizerPso(\n solarPanelsRef.current,\n foundation,\n params.objectiveFunctionType,\n params.swarmSize,\n params.vmax,\n params.maximumSteps,\n params.convergenceThreshold,\n params.searchMethod,\n params.localSearchRadius,\n );\n optimizerRef.current.inertia = params.inertia;\n optimizerRef.current.cognitiveCoefficient = params.cognitiveCoefficient;\n optimizerRef.current.socialCoefficient = params.socialCoefficient;\n particleIndexRef.current = 0;\n convergedRef.current = false;\n setParticleLabels(labels);\n optimizerRef.current.startEvolving();\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = true;\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n } else {\n showError(i18n.t('message.EncounterEvolutionError', lang));\n }\n };\n\n const getTotal = (): number => {\n let total = 0;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n const dailyPvYield = useDataStore.getState().dailyPvYield;\n for (const datum of dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n const yearlyPvYield = useDataStore.getState().yearlyPvYield;\n for (const datum of yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n total *= 12 / daysPerYear;\n break;\n }\n return total;\n };\n\n // the increment of objectiveEvaluationIndex is used as a trigger to request the next animation frame\n useEffect(() => {\n if (!optimizerRef.current || !objectiveEvaluationIndex) return;\n // the number of particles to evaluate is less than or equal to maximumSteps * swarmSize,\n // subject to the convergence criterion\n convergedRef.current = optimizerRef.current.updateParticle(particleIndexRef.current % params.swarmSize, getTotal());\n updateResults();\n particleIndexRef.current++;\n optimizerRef.current.outsideStepCounter = Math.floor(particleIndexRef.current / params.swarmSize);\n // recursive call to the next step of the evolution, which is to evaluate the next particle\n requestRef.current = requestAnimationFrame(evolve);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objectiveEvaluationIndex]);\n\n const evolve = () => {\n if (!optimizerRef.current) return;\n if (evolutionMethod !== EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) return;\n if (runEvolution && !pauseRef.current) {\n if (convergedRef.current || optimizerRef.current.outsideStepCounter >= params.maximumSteps) {\n cancelAnimationFrame(requestRef.current);\n evolutionCompletedRef.current = true;\n optimizerRef.current.applyFittest();\n updateResults();\n runCallback(true);\n showInfo(\n i18n.t('message.EvolutionCompleted', lang) +\n '\\n' +\n (convergedRef.current\n ? i18n.t('message.ConvergenceThresholdHasBeenReached', lang)\n : i18n.t('message.MaximumNumberOfStepsHasBeenReached', lang)),\n );\n if (loggable && optimizerRef.current) {\n const bestPosition = optimizerRef.current.swarm.bestPositionOfSwarm;\n const fitness = optimizerRef.current.swarm.bestFitness;\n if (bestPosition && fitness) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Particle Swarm Optimization for Solar Panel Tilt Angle Completed',\n result: SolarPanelTiltAngleOptimizerPso.particleToString(bestPosition, fitness),\n steps: optimizerRef.current?.outsideStepCounter,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n return;\n }\n optimizerRef.current.translateParticle(particleIndexRef.current % params.swarmSize);\n runCallback(false);\n }\n };\n\n const runCallback = (lastStep: boolean) => {\n usePrimitiveStore.setState((state) => {\n if (solarPanelsRef.current) {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = true;\n } else {\n state.runDailySimulationForSolarPanels = true;\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = true;\n } else {\n state.runYearlySimulationForSolarPanels = true;\n }\n break;\n }\n }\n });\n setCommonStore((state) => {\n if (solarPanelsRef.current) {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n break;\n }\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel) {\n const panel = e as SolarPanelModel;\n for (const sp of solarPanelsRef.current) {\n if (panel.id === sp.id) {\n panel.tiltAngle = sp.tiltAngle;\n break;\n }\n }\n }\n }\n }\n });\n if (lastStep) {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = false;\n state.evolutionInProgress = false;\n state.objectiveEvaluationIndex = 0;\n });\n }\n };\n\n const updateResults = () => {\n if (!optimizerRef.current) return;\n const results: DatumEntry[] = [];\n for (let index = 0; index < optimizerRef.current.bestPositionOfSteps.length; index++) {\n const datum: DatumEntry = {};\n // the first fittest starts from index 1 because index 0 is used for the initial state\n const ps = optimizerRef.current.bestPositionOfSteps[index];\n if (ps) {\n const n = ps.length;\n datum['Step'] = index;\n for (let k = 0; k < n; k++) {\n let key = 'Var' + (k + 1);\n if (particleLabels[k]) {\n const trimmed = particleLabels[k]?.trim();\n if (trimmed && trimmed !== '') key = trimmed;\n }\n datum[key] = Util.toDegrees((2 * ps[k] - 1) * HALF_PI);\n }\n datum['Objective'] = optimizerRef.current.bestFitnessOfSteps[index];\n // the first step of the swarm starts from index 0\n if (index > 0) {\n const ss = optimizerRef.current.swarmOfSteps[index - 1];\n if (ss) {\n let counter = 0;\n for (let i = 0; i < ss.particles.length; i++) {\n const n = ss.particles[i].position.length;\n for (let k = 0; k < n; k++) {\n const key = 'Individual' + ++counter;\n datum[key] = Util.toDegrees((2 * ss.particles[i].position[k] - 1) * HALF_PI);\n }\n }\n }\n }\n }\n if (Object.keys(datum).length > 0) {\n results.push(datum);\n }\n }\n setFittestParticleResults(results);\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelTiltAnglePso);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n *\n * The chromosome of an individual solar panel array has three genes:\n * tilt angle (a), inter-row spacing (d), panel row number on rack (r)\n *\n */\n\nimport { OptimizerPso } from './OptimizerPso';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { ObjectiveFunctionType, Orientation, RowAxis, SearchMethod } from '../../../types';\nimport { HALF_PI } from '../../../constants';\nimport { Util } from '../../../Util';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { PvModel } from '../../../models/PvModel';\nimport { Rectangle } from '../../../models/Rectangle';\nimport { Particle } from './Particle';\nimport { SolarPanelLayoutRelative } from '../../../pd/SolarPanelLayoutRelative';\nimport { SolarPanelArrayLayoutParams } from '../../../stores/SolarPanelArrayLayoutParams';\n\nexport class SolarPanelArrayOptimizerPso extends OptimizerPso {\n polygon: PolygonModel;\n pvModel: PvModel;\n orientation: Orientation = Orientation.landscape;\n rowAxis: RowAxis = RowAxis.leftRight;\n relativeMargin: number = 0.01;\n poleHeight: number = 2;\n poleSpacing: number = 5;\n bounds?: Rectangle;\n solarPanelCount: number = 0;\n solarRackCount: number = 0;\n\n // allowable ranges for genes (tilt angle from -90° to 90°)\n minimumInterRowSpacing: number = 2; // in meters\n maximumInterRowSpacing: number = 10; // in meters\n minimumRowsPerRack: number = 1;\n maximumRowsPerRack: number = 6;\n minimumTiltAngle: number = -HALF_PI;\n maximumTiltAngle: number = HALF_PI;\n margin: number = 0;\n\n constructor(\n pvModel: PvModel,\n rowAxis: RowAxis,\n orientation: Orientation,\n poleHeight: number,\n poleSpacing: number,\n initialSolarPanels: SolarPanelModel[],\n initialLayoutParams: SolarPanelArrayLayoutParams,\n polygon: PolygonModel,\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n swarmSize: number,\n vmax: number,\n maximumSteps: number,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n minimumInterRowSpacing: number,\n maximumInterRowSpacing: number,\n minimumRowsPerRack: number,\n maximumRowsPerRack: number,\n minimumTiltAngle: number,\n maximumTiltAngle: number,\n margin: number,\n ) {\n super(\n foundation,\n objectiveFunctionType,\n swarmSize,\n vmax,\n maximumSteps,\n 3,\n convergenceThreshold,\n searchMethod,\n localSearchRadius,\n );\n this.polygon = polygon;\n this.pvModel = pvModel;\n this.rowAxis = rowAxis;\n this.orientation = orientation;\n this.poleHeight = poleHeight;\n this.poleSpacing = poleSpacing;\n this.minimumInterRowSpacing = minimumInterRowSpacing;\n this.maximumInterRowSpacing = maximumInterRowSpacing;\n this.minimumRowsPerRack = minimumRowsPerRack;\n this.maximumRowsPerRack = maximumRowsPerRack;\n this.minimumTiltAngle = minimumTiltAngle;\n this.maximumTiltAngle = maximumTiltAngle;\n this.margin = margin;\n this.setInterRowSpacingBounds();\n // set the first particle to be the current design, if any\n if (initialSolarPanels && initialSolarPanels.length > 0) {\n const sp1 = initialSolarPanels[0];\n\n if (initialSolarPanels.length > 1) {\n const firstParticle: Particle = this.swarm.particles[0];\n // calculate the particle positions of the initial solar panels\n firstParticle.position[0] =\n this.maximumTiltAngle === this.minimumTiltAngle\n ? 0\n : (sp1.tiltAngle - this.minimumTiltAngle) / (this.maximumTiltAngle - this.minimumTiltAngle);\n\n const sp2 = initialSolarPanels[1];\n const interRowSpacing = initialLayoutParams\n ? initialLayoutParams.interRowSpacing\n : this.rowAxis === RowAxis.upDown\n ? Math.abs(sp1.cx - sp2.cx) * this.foundation.lx\n : Math.abs(sp1.cy - sp2.cy) * this.foundation.ly;\n let normalizedInterRowSpacing =\n this.maximumInterRowSpacing === this.minimumInterRowSpacing\n ? 0\n : (interRowSpacing - this.minimumInterRowSpacing) /\n (this.maximumInterRowSpacing - this.minimumInterRowSpacing);\n if (normalizedInterRowSpacing < 0) normalizedInterRowSpacing = 0;\n else if (normalizedInterRowSpacing > 1) normalizedInterRowSpacing = 1;\n firstParticle.position[1] = normalizedInterRowSpacing;\n\n const rowsPerRack = initialLayoutParams\n ? initialLayoutParams.rowsPerRack\n : Math.max(\n 1,\n Math.round(sp1.ly / (sp1.orientation === Orientation.portrait ? pvModel.length : pvModel.width)),\n );\n let normalizedRowsPerRack =\n this.maximumRowsPerRack === this.minimumRowsPerRack\n ? 0\n : (rowsPerRack - this.minimumRowsPerRack) / (this.maximumRowsPerRack - this.minimumRowsPerRack);\n if (normalizedRowsPerRack < 0) normalizedRowsPerRack = 0;\n else if (normalizedRowsPerRack > 1) normalizedRowsPerRack = 1;\n firstParticle.position[2] = normalizedRowsPerRack;\n }\n }\n }\n\n private setInterRowSpacingBounds() {\n this.bounds = Util.calculatePolygonBounds(this.polygon.vertices);\n }\n\n applyFittest(): void {\n if (this.swarm.bestPositionOfSwarm) {\n console.log(\n 'Best: ' +\n this.particleToString(this.swarm.bestPositionOfSwarm, this.swarm.bestFitness) +\n ', rack count: ' +\n this.solarRackCount +\n ', panel count: ' +\n this.solarPanelCount,\n );\n }\n }\n\n private getObjectiveUnit(): string | null {\n switch (this.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n return 'kWh';\n case ObjectiveFunctionType.YEARLY_PROFIT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n return 'dollars';\n }\n return null;\n }\n\n particleToString(position: number[], fitness: number): string {\n let s =\n 'F(' +\n Util.toDegrees(position[0] * (this.maximumTiltAngle - this.minimumTiltAngle) + this.minimumTiltAngle).toFixed(3) +\n '°, ';\n s +=\n (position[1] * (this.maximumInterRowSpacing - this.minimumInterRowSpacing) + this.minimumInterRowSpacing).toFixed(\n 3,\n ) + 'm, ';\n s += Math.floor(position[2] * (this.maximumRowsPerRack - this.minimumRowsPerRack) + this.minimumRowsPerRack) + ')';\n return s + ' = ' + fitness.toFixed(5) + ' ' + this.getObjectiveUnit();\n }\n\n startEvolving(): void {\n this.outsideStepCounter = 0;\n this.computeCounter = 0;\n this.bestPositionOfSteps.fill(null);\n this.bestFitnessOfSteps.fill(0);\n this.setInterRowSpacingBounds();\n }\n\n translateParticleByIndex(indexOfParticle: number): SolarPanelModel[] {\n return this.translatePosition(this.swarm.particles[indexOfParticle].position);\n }\n\n translateBest(): SolarPanelModel[] {\n if (this.swarm.bestPositionOfSwarm) {\n return this.translatePosition(this.swarm.bestPositionOfSwarm);\n }\n return [];\n }\n\n // translate position to structure for the specified position\n private translatePosition(position: number[]): SolarPanelModel[] {\n if (!this.bounds) return [];\n const tiltAngle = position[0] * (this.maximumTiltAngle - this.minimumTiltAngle) + this.minimumTiltAngle;\n const interRowSpacing =\n position[1] * (this.maximumInterRowSpacing - this.minimumInterRowSpacing) + this.minimumInterRowSpacing;\n const rowsPerRack = Math.floor(\n position[2] * (this.maximumRowsPerRack - this.minimumRowsPerRack) + this.minimumRowsPerRack,\n );\n const solarPanels = SolarPanelLayoutRelative.create(\n this.polygon,\n this.foundation,\n this.pvModel,\n this.orientation,\n tiltAngle,\n rowsPerRack,\n interRowSpacing,\n this.rowAxis,\n this.poleHeight,\n this.poleSpacing,\n this.margin,\n );\n this.solarPanelCount = 0;\n this.solarRackCount = solarPanels.length;\n if (solarPanels.length > 0) {\n for (const sp of solarPanels) {\n this.solarPanelCount += Util.countSolarPanelsOnRack(sp, this.pvModel);\n }\n }\n return solarPanels;\n }\n\n updateParticle(indexOfParticle: number, fitness: number): boolean {\n const swarmSize = this.swarm.particles.length;\n if (!this.converged) {\n const particle: Particle = this.swarm.particles[indexOfParticle];\n particle.fitness = fitness;\n // the first particle of the first generation is used as a baseline\n // (imagine it as the fittest of the zeroth swarm)\n if (this.computeCounter === 0 && indexOfParticle === 0) {\n this.bestPositionOfSteps[0] = [...particle.position];\n this.bestFitnessOfSteps[0] = fitness;\n }\n const step = Math.floor(this.computeCounter / swarmSize);\n console.log(\n 'Step ' +\n (step + 1) +\n ', particle ' +\n indexOfParticle +\n ' : ' +\n this.particleToString(particle.position, fitness) +\n ', rack count: ' +\n this.solarRackCount +\n ', panel count: ' +\n this.solarPanelCount,\n );\n const savedParticle = this.swarmOfSteps[step]?.particles[indexOfParticle];\n if (savedParticle) {\n for (let k = 0; k < particle.position.length; k++) {\n savedParticle.position[k] = particle.position[k];\n }\n savedParticle.fitness = particle.fitness;\n }\n const isAtTheEndOfStep = this.computeCounter % swarmSize === swarmSize - 1;\n if (isAtTheEndOfStep) {\n this.swarm.sort();\n const best = this.swarm.bestPositionOfSwarm;\n if (best) {\n this.bestPositionOfSteps[step + 1] = [...best];\n this.bestFitnessOfSteps[step + 1] = this.swarm.bestFitness;\n }\n this.converged = this.swarm.isNominallyConverged(\n this.convergenceThreshold,\n Math.max(2, this.swarm.particles.length / 4),\n );\n this.moveSwarm();\n }\n this.computeCounter++;\n }\n return this.converged;\n }\n\n // if anyone in the current population doesn't meet the constraints, the entire population dies\n // and the algorithm reverts to the previous generation -- not efficient\n detectViolations(): boolean {\n return false; // TODO\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from '../../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { showInfo } from '../../helpers';\nimport i18n from '../../i18n/i18n';\nimport {\n DatumEntry,\n DesignProblem,\n EvolutionMethod,\n ObjectiveFunctionType,\n ObjectType,\n Orientation,\n RowAxis,\n} from '../../types';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { FoundationModel } from '../../models/FoundationModel';\nimport { SolarPanelArrayOptimizerPso } from './algorithm/SolarPanelArrayOptimizerPso';\nimport { PolygonModel } from '../../models/PolygonModel';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nconst SolarPanelArrayPso = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pauseEvolution = usePrimitiveStore(Selector.pauseEvolution);\n const getParent = useStore(Selector.getParent);\n const polygon = useStore(Selector.selectedElement) as PolygonModel;\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const getPvModule = useStore(Selector.getPvModule);\n const removeElementsByReferenceId = useStore(Selector.removeElementsByReferenceId);\n const setFittestParticleResults = useStore(Selector.setFittestIndividualResults);\n const objectiveEvaluationIndex = usePrimitiveStore(Selector.objectiveEvaluationIndex);\n const particleLabels = useStore(Selector.variableLabels);\n const setParticleLabels = useStore(Selector.setVariableLabels);\n const params = useStore(Selector.evolutionaryAlgorithmState).particleSwarmOptimizationParams;\n const constraints = useStore.getState().solarPanelArrayLayoutConstraints;\n const economics = useStore.getState().economicsParams;\n const currentLayoutParams = useStore.getState().solarPanelArrayLayoutParams;\n\n const requestRef = useRef(0);\n const evolutionCompletedRef = useRef(false);\n const pauseRef = useRef(false);\n const optimizerRef = useRef();\n const particleIndexRef = useRef(0);\n const convergedRef = useRef(false);\n const solarPanelArrayRef = useRef([]);\n const initialSolarPanelArrayRef = useRef([]);\n\n const lang = { lng: language };\n const foundation = polygon ? (getParent(polygon) as FoundationModel) : undefined;\n\n useEffect(() => {\n if (evolutionMethod !== EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) return;\n if (params.problem !== DesignProblem.SOLAR_PANEL_ARRAY) return;\n if (runEvolution) {\n init();\n requestRef.current = requestAnimationFrame(evolve);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!evolutionCompletedRef.current) {\n showInfo(i18n.t('message.EvolutionAborted', lang));\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = false;\n state.runDailySimulationForSolarPanels = false;\n state.runYearlySimulationForSolarPanels = false;\n });\n // this may put the function call to the last in the event queue to avoid crash in ray cast\n setTimeout(() => {\n // revert to the initial solar panel array\n if (solarPanelArrayRef.current.length > 0) {\n removeElementsByReferenceId(polygon.id, false);\n }\n if (initialSolarPanelArrayRef.current.length > 0) {\n solarPanelArrayRef.current = [...initialSolarPanelArrayRef.current];\n runCallback(true);\n }\n }, 100);\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runEvolution]);\n\n useEffect(() => {\n pauseRef.current = pauseEvolution;\n if (pauseEvolution) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = true;\n });\n showInfo(i18n.t('message.EvolutionPaused', lang));\n } else {\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = false;\n });\n // continue the evolution\n evolve();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pauseEvolution]);\n\n // getting ready for the evolution\n const init = () => {\n if (!polygon || !foundation) return;\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = true;\n state.objectiveEvaluationIndex = 0;\n });\n evolutionCompletedRef.current = false;\n const originalSolarPanels = getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[];\n // store a copy of the initial solar panels for possible reversion\n initialSolarPanelArrayRef.current.length = 0;\n for (const osp of originalSolarPanels) {\n initialSolarPanelArrayRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n }\n optimizerRef.current = new SolarPanelArrayOptimizerPso(\n getPvModule(constraints.pvModelName ?? 'CS6X-355P-FG'),\n constraints.rowAxis ?? RowAxis.leftRight,\n constraints.orientation ?? Orientation.landscape,\n constraints.poleHeight ?? 1,\n constraints.poleSpacing ?? 3,\n initialSolarPanelArrayRef.current,\n currentLayoutParams,\n polygon,\n foundation,\n params.objectiveFunctionType,\n params.swarmSize,\n params.vmax,\n params.maximumSteps,\n params.convergenceThreshold,\n params.searchMethod,\n params.localSearchRadius,\n constraints.minimumInterRowSpacing,\n constraints.maximumInterRowSpacing,\n constraints.minimumRowsPerRack,\n constraints.maximumRowsPerRack,\n constraints.minimumTiltAngle,\n constraints.maximumTiltAngle,\n constraints.margin ?? 0,\n );\n optimizerRef.current.inertia = params.inertia;\n optimizerRef.current.cognitiveCoefficient = params.cognitiveCoefficient;\n optimizerRef.current.socialCoefficient = params.socialCoefficient;\n particleIndexRef.current = 0;\n convergedRef.current = false;\n setParticleLabels(['Tilt Angle', 'Inter-Row Spacing', 'Rack Width']);\n optimizerRef.current.startEvolving();\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = true;\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n };\n\n const getTotal = (): number => {\n let total = 0;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n const dailyPvYield = useDataStore.getState().dailyPvYield;\n for (const datum of dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n const yearlyPvYield = useDataStore.getState().yearlyPvYield;\n for (const datum of yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n total *= 12 / daysPerYear;\n break;\n }\n const count = optimizerRef.current?.solarPanelCount;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n if (count) total /= count;\n break;\n case ObjectiveFunctionType.DAILY_PROFIT:\n total = total * economics.electricitySellingPrice;\n if (count) total -= count * economics.operationalCostPerUnit;\n break;\n case ObjectiveFunctionType.YEARLY_PROFIT:\n total = total * economics.electricitySellingPrice;\n if (count) total -= count * economics.operationalCostPerUnit * 365;\n break;\n }\n return total;\n };\n\n // the increment of objectiveEvaluationIndex is used as a trigger to request the next animation frame\n useEffect(() => {\n if (!optimizerRef.current || !objectiveEvaluationIndex) return;\n // the number of particles to evaluate is less than or equal to maximumSteps * swarmSize,\n // subject to the convergence criterion\n convergedRef.current = optimizerRef.current.updateParticle(particleIndexRef.current % params.swarmSize, getTotal());\n updateResults();\n particleIndexRef.current++;\n optimizerRef.current.outsideStepCounter = Math.floor(particleIndexRef.current / params.swarmSize);\n // recursive call to the next step of the evolution, which is to evaluate the next particle\n requestRef.current = requestAnimationFrame(evolve);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objectiveEvaluationIndex]);\n\n const evolve = () => {\n if (!optimizerRef.current) return;\n if (evolutionMethod !== EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) return;\n if (runEvolution && !pauseRef.current) {\n if (convergedRef.current || optimizerRef.current.outsideStepCounter >= params.maximumSteps) {\n cancelAnimationFrame(requestRef.current);\n evolutionCompletedRef.current = true;\n if (solarPanelArrayRef.current.length > 0) {\n removeElementsByReferenceId(polygon.id, false);\n }\n solarPanelArrayRef.current = optimizerRef.current.translateBest();\n optimizerRef.current.applyFittest();\n updateResults();\n runCallback(true);\n showInfo(\n i18n.t('message.EvolutionCompleted', lang) +\n '\\n' +\n (convergedRef.current\n ? i18n.t('message.ConvergenceThresholdHasBeenReached', lang)\n : i18n.t('message.MaximumNumberOfStepsHasBeenReached', lang)),\n );\n if (optimizerRef.current) {\n const bestPosition = optimizerRef.current.swarm.bestPositionOfSwarm;\n const fitness = optimizerRef.current.swarm.bestFitness;\n if (bestPosition && fitness) {\n const tiltAngle =\n bestPosition[0] * (constraints.maximumTiltAngle - constraints.minimumTiltAngle) +\n constraints.minimumTiltAngle;\n const interRowSpacing =\n bestPosition[1] * (constraints.maximumInterRowSpacing - constraints.minimumInterRowSpacing) +\n constraints.minimumInterRowSpacing;\n const rowsPerRack = Math.floor(\n bestPosition[2] * (constraints.maximumRowsPerRack - constraints.minimumRowsPerRack) +\n constraints.minimumRowsPerRack,\n );\n setCommonStore((state) => {\n state.solarPanelArrayLayoutParams.tiltAngle = tiltAngle;\n state.solarPanelArrayLayoutParams.interRowSpacing = interRowSpacing;\n state.solarPanelArrayLayoutParams.rowsPerRack = rowsPerRack;\n state.solarPanelArrayLayoutParams.orientation = constraints.orientation;\n state.solarPanelArrayLayoutParams.poleHeight = constraints.poleHeight;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Particle Swarm Optimization for Solar Panel Array Layout Completed',\n result: optimizerRef.current?.particleToString(bestPosition, fitness),\n steps: optimizerRef.current?.outsideStepCounter,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n }\n return;\n }\n removeElementsByReferenceId(polygon.id, false);\n // this may put the function call to the last in the event queue to avoid crash in ray cast\n // when switching the optimization method\n setTimeout(() => {\n if (optimizerRef.current) {\n solarPanelArrayRef.current = optimizerRef.current.translateParticleByIndex(\n particleIndexRef.current % params.swarmSize,\n );\n }\n runCallback(false);\n }, 100);\n }\n };\n\n const runCallback = (lastStep: boolean) => {\n usePrimitiveStore.setState((state) => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = true;\n } else {\n state.runDailySimulationForSolarPanels = true;\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = true;\n } else {\n state.runYearlySimulationForSolarPanels = true;\n }\n break;\n }\n });\n setCommonStore((state) => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n break;\n }\n state.elements.push(...solarPanelArrayRef.current);\n });\n if (lastStep) {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = false;\n state.evolutionInProgress = false;\n state.objectiveEvaluationIndex = 0;\n });\n }\n };\n\n const updateResults = () => {\n if (!optimizerRef.current) return;\n const results: DatumEntry[] = [];\n for (let index = 0; index < optimizerRef.current.bestPositionOfSteps.length; index++) {\n const datum: DatumEntry = {};\n // the first fittest starts from index 1 because index 0 is used for the initial state\n const ps = optimizerRef.current.bestPositionOfSteps[index];\n if (ps) {\n const n = ps.length;\n datum['Step'] = index;\n for (let k = 0; k < n; k++) {\n datum[particleLabels[k] ?? 'Var' + (k + 1)] = ps[k];\n }\n datum['Objective'] = optimizerRef.current.bestFitnessOfSteps[index];\n // the first step of the swarm starts from index 0\n if (index > 0) {\n const ss = optimizerRef.current.swarmOfSteps[index - 1];\n if (ss) {\n let counter = 0;\n for (let i = 0; i < ss.particles.length; i++) {\n const n = ss.particles[i].position.length;\n for (let k = 0; k < n; k++) {\n datum['Individual' + ++counter] = ss.particles[i].position[k];\n }\n }\n }\n }\n }\n if (Object.keys(datum).length > 0) {\n results.push(datum);\n }\n }\n setFittestParticleResults(results);\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelArrayPso);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n *\n */\n\nimport React from 'react';\nimport { useStore } from './stores/common';\nimport { ObjectType } from './types';\nimport * as Selector from 'src/stores/selector';\nimport { useThree } from '@react-three/fiber';\n\nexport const NavigationController = () => {\n const objectTypeToAdd = useStore(Selector.objectTypeToAdd);\n const addedFoundationId = useStore(Selector.addedFoundationId);\n const addedCuboidId = useStore(Selector.addedCuboidId);\n const { gl } = useThree();\n\n gl.domElement.style.cursor =\n objectTypeToAdd !== ObjectType.None || addedCuboidId || addedFoundationId ? 'crosshair' : 'default';\n\n return null;\n};\n\nexport default React.memo(NavigationController);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useCallback, useState } from 'react';\nimport { GoogleMap } from '@react-google-maps/api';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { UndoableChangeLocation } from '../undo/UndoableChangeLocation';\nimport { throttle } from 'lodash';\n\nconst GroundMap = ({ width = 400, height = 400 }: { width: number; height: number }) => {\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const latitude = useStore(Selector.world.latitude);\n const longitude = useStore(Selector.world.longitude);\n const mapZoom = useStore(Selector.viewState.mapZoom);\n const mapTilt = useStore(Selector.viewState.mapTilt);\n const mapType = useStore(Selector.viewState.mapType);\n\n const [map, setMap] = useState(null);\n\n const waitTime = 200;\n\n const onLoad = useCallback((map: google.maps.Map) => {\n setMap(map);\n }, []);\n\n const onUnmount = useCallback(function callback() {\n setMap(null);\n }, []);\n\n const updateAddress = () => {\n const latlng = new google.maps.LatLng(latitude, longitude);\n new google.maps.Geocoder()\n .geocode({ location: latlng }, function (results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n if (results && results[0].address_components) {\n setCommonStore((state) => {\n state.world.address = results[0].formatted_address;\n });\n for (const a of results[0].address_components) {\n if (a.types[0] === 'country') {\n setCommonStore((state) => {\n state.world.countryCode = a.short_name;\n });\n break;\n }\n }\n }\n }\n })\n .then(() => {\n // ignore\n });\n };\n\n // FIXME: Undo doesn't work unless the focus is returned to the main window\n const onCenterChanged = throttle(\n () => {\n if (map) {\n const center = map.getCenter();\n if (center) {\n const lat = center.lat();\n const lng = center.lng();\n if (lat !== latitude || lng !== longitude) {\n updateAddress();\n const undoableChangeLocation = {\n name: 'Set Location',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: lat,\n oldLongitude: longitude,\n newLongitude: lng,\n undo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.oldLatitude;\n state.world.longitude = undoableChangeLocation.oldLongitude;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.newLatitude;\n state.world.longitude = undoableChangeLocation.newLongitude;\n });\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n state.world.latitude = lat;\n state.world.longitude = lng;\n });\n }\n }\n }\n },\n waitTime,\n { leading: false, trailing: true },\n );\n\n const onZoomChanged = throttle(\n () => {\n if (map) {\n const z = map.getZoom();\n if (z !== undefined && z !== mapZoom) {\n updateAddress();\n const undoableChange = {\n name: 'Zoom Map',\n timestamp: Date.now(),\n oldValue: mapZoom,\n newValue: z,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.mapZoom = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.mapZoom = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.viewState.mapZoom = z;\n });\n }\n }\n },\n waitTime,\n { leading: false, trailing: true },\n );\n\n const onTiltChanged = () => {\n if (map) {\n const t = map.getTilt();\n if (t !== undefined && t !== mapTilt) {\n const undoableChange = {\n name: 'Tilt Map',\n timestamp: Date.now(),\n oldValue: mapTilt,\n newValue: t,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.mapTilt = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.mapTilt = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.viewState.mapTilt = t;\n });\n }\n }\n };\n\n const onMapTypeIdChanged = () => {\n if (map) {\n const typeId = map.getMapTypeId();\n if (typeId !== undefined && typeId !== mapType) {\n const undoableChange = {\n name: 'Change Map Type',\n timestamp: Date.now(),\n oldValue: mapType,\n newValue: typeId,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.mapType = undoableChange.oldValue as string;\n state.viewState.groundImageType = state.viewState.mapType;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.mapType = undoableChange.newValue as string;\n state.viewState.groundImageType = state.viewState.mapType;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.viewState.mapType = typeId;\n state.viewState.groundImageType = typeId;\n });\n }\n }\n };\n\n return (\n \n );\n};\n\nexport default React.memo(GroundMap);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Space, Switch } from 'antd';\nimport GroundMap from '../components/groundMap';\nimport { StandaloneSearchBox, useJsApiLoader } from '@react-google-maps/api';\nimport { Libraries } from '@react-google-maps/api/dist/utils/make-load-script-url';\nimport Spinner from '../components/spinner';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport 'antd/dist/antd.css';\nimport i18n from '../i18n/i18n';\nimport { UndoableChangeLocation } from '../undo/UndoableChangeLocation';\nimport { UndoableCheck } from '../undo/UndoableCheck';\nimport { Undoable } from '../undo/Undoable';\nimport { LAT_LNG_FRACTION_DIGITS, Z_INDEX_FRONT_PANEL } from '../constants';\n\nconst libraries = ['places'] as Libraries;\n\nconst Container = styled.div`\n position: fixed;\n top: 40px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n width: 410px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst MapPanel = () => {\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const address = useStore(Selector.world.address);\n const latitude = useStore(Selector.world.latitude);\n const longitude = useStore(Selector.world.longitude);\n const mapPanelX = useStore(Selector.viewState.mapPanelX);\n const mapPanelY = useStore(Selector.viewState.mapPanelY);\n const groundImage = useStore(Selector.viewState.groundImage);\n const mapZoom = useStore(Selector.viewState.mapZoom);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const searchBox = useRef();\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 460;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 40 : 600;\n const [curPosition, setCurPosition] = useState({\n x: isNaN(mapPanelX) ? 0 : Math.min(mapPanelX, window.innerWidth - wOffset),\n y: isNaN(mapPanelY) ? 0 : Math.min(mapPanelY, window.innerHeight - hOffset),\n });\n const [updateFlag, setUpdateFlag] = useState(false);\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.min(mapPanelX, window.innerWidth - wOffset),\n y: Math.min(mapPanelY, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const { isLoaded, loadError } = useJsApiLoader({\n id: 'google-map-script',\n googleMapsApiKey: process.env.REACT_APP_MAPS_API_KEY as string,\n libraries: libraries,\n });\n\n const onPlacesChanged = () => {\n const places = searchBox.current?.getPlaces();\n if (places && places.length > 0) {\n const geometry = places[0].geometry;\n if (geometry && geometry.location) {\n const undoableChangeLocation = {\n name: 'Set Location',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: geometry.location.lat(),\n oldLongitude: longitude,\n newLongitude: geometry.location.lng(),\n oldAddress: address,\n newAddress: places[0].formatted_address as string,\n undo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.oldLatitude;\n state.world.longitude = undoableChangeLocation.oldLongitude;\n state.world.address = undoableChangeLocation.oldAddress;\n });\n setUpdateFlag(!updateFlag);\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.newLatitude;\n state.world.longitude = undoableChangeLocation.newLongitude;\n state.world.address = undoableChangeLocation.newAddress;\n });\n setUpdateFlag(!updateFlag);\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n if (geometry.location) {\n state.world.latitude = geometry.location.lat();\n state.world.longitude = geometry.location.lng();\n }\n if (places[0]) {\n state.world.address = places[0].formatted_address as string;\n if (places[0].address_components) {\n for (const a of places[0].address_components) {\n if (a.types[0] === 'country') {\n state.world.countryCode = a.short_name;\n break;\n }\n }\n }\n }\n });\n }\n }\n };\n\n const onLoad = (s: google.maps.places.SearchBox) => {\n searchBox.current = s;\n };\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.min(ui.x, window.innerWidth - wOffset),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n state.viewState.mapPanelX = Math.min(ui.x, window.innerWidth - wOffset);\n state.viewState.mapPanelY = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Maps',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showMapPanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showMapPanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showMapPanel = false;\n });\n };\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'mapPanel';\n });\n }}\n >\n \n \n
\n {i18n.t('word.Location', lang)}\n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n \n {i18n.t('mapPanel.ImageOnGround', lang) + ':'}\n {\n const undoableCheck = {\n name: 'Show Ground Image',\n timestamp: Date.now(),\n checked: checked,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.groundImage = !undoableCheck.checked;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.groundImage = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.viewState.groundImage = checked;\n });\n }}\n />\n \n \n {isLoaded && (\n \n
\n \n \n \n
\n
\n )}\n {isLoaded ? (\n \n
\n \n

\n {i18n.t('mapPanel.Coordinates', lang) + ':'} ({latitude.toFixed(LAT_LNG_FRACTION_DIGITS)}°,{' '}\n {longitude.toFixed(LAT_LNG_FRACTION_DIGITS)}°),  \n {i18n.t('mapPanel.Zoom', lang) + ':'} {mapZoom}\n

\n
\n
\n ) : (\n \n )}\n {loadError && (\n \n
Map cannot be loaded right now, sorry.
\n
\n )}\n
\n
\n
\n \n );\n};\n\nexport default React.memo(MapPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { DatePicker, Slider, Space, Switch, TimePicker } from 'antd';\nimport moment from 'moment';\nimport 'antd/dist/antd.css';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport i18n from '../i18n/i18n';\nimport { UndoableCheck } from '../undo/UndoableCheck';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { UndoableChangeLocation } from '../undo/UndoableChangeLocation';\nimport { computeSunriseAndSunsetInMinutes } from '../analysis/sunTools';\nimport { throttle } from 'lodash';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { Undoable } from '../undo/Undoable';\nimport { Z_INDEX_FRONT_PANEL } from '../constants';\n\nconst Container = styled.div`\n position: absolute;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 11;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 680px;\n padding: 0;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst HeliodonPanel = () => {\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const dateString = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const address = useStore(Selector.world.address);\n const animateSun = usePrimitiveStore(Selector.animateSun);\n const animate24Hours = useStore(Selector.animate24Hours);\n const runSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\n const showSunAngles = useStore(Selector.viewState.showSunAngles);\n const heliodon = useStore(Selector.viewState.heliodon);\n const heliodonPanelX = useStore(Selector.viewState.heliodonPanelX);\n const heliodonPanelY = useStore(Selector.viewState.heliodonPanelY);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const requestRef = useRef(0);\n const previousFrameTime = useRef(-1);\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 250;\n const [curPosition, setCurPosition] = useState({\n x: isNaN(heliodonPanelX) ? 0 : Math.max(heliodonPanelX, wOffset - window.innerWidth),\n y: isNaN(heliodonPanelY) ? 0 : Math.min(heliodonPanelY, window.innerHeight - hOffset),\n });\n const [updateFlag, setUpdateFlag] = useState(false);\n\n const date = useMemo(() => new Date(dateString), [dateString]);\n const sunriseAndSunsetInMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(date, latitude);\n }, [date, latitude]);\n\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(heliodonPanelX, wOffset - window.innerWidth),\n y: Math.min(heliodonPanelY, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n requestRef.current = requestAnimationFrame(animate);\n return () => {\n cancelAnimationFrame(requestRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [animateSun]);\n\n useEffect(() => {\n if (animateSun) {\n if (sunriseAndSunsetInMinutes.sunset === 0) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.animateSun = false;\n });\n }\n }\n }, [sunriseAndSunsetInMinutes.sunset]);\n\n const animate = () => {\n const continuous = useStore.getState().animate24Hours;\n if (animateSun) {\n requestRef.current = requestAnimationFrame(animate);\n const currentFrameTime = Date.now();\n if (currentFrameTime - previousFrameTime.current > 100) {\n const day = date.getDate();\n const totalMinutes = date.getMinutes() + date.getHours() * 60;\n // unfortunately, we have to get the latest latitude (which may be changed while the animation is running)\n // and then recalculate the sunrise and sunset time in the animation loop\n const sunMinutes = computeSunriseAndSunsetInMinutes(date, useStore.getState().world.latitude);\n if (!continuous && totalMinutes > sunMinutes.sunset) {\n date.setHours(sunMinutes.sunrise / 60, date.getMinutes() + 15);\n }\n date.setHours(date.getHours(), date.getMinutes() + 15);\n date.setDate(day);\n changeTime(date, false);\n previousFrameTime.current = currentFrameTime;\n }\n } else {\n cancelAnimationFrame(requestRef.current);\n }\n };\n\n const changeTime = (time: Date, undoable: boolean) => {\n const d = new Date(date);\n d.setHours(time.getHours(), time.getMinutes());\n if (undoable) {\n const undoableChange = {\n name: 'Set Time',\n timestamp: Date.now(),\n oldValue: dateString,\n newValue: d.toLocaleString(),\n undo: () => {\n setCommonStore((state) => {\n state.world.date = undoableChange.oldValue as string;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.date = undoableChange.newValue as string;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n }\n setCommonStore((state) => {\n state.world.date = d.toLocaleString('en-US');\n });\n };\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n state.viewState.heliodonPanelX = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.heliodonPanelY = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Sun and Time Settings Panel',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showHeliodonPanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showHeliodonPanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showHeliodonPanel = false;\n });\n };\n\n // throttled functions must be wrapped in useRef so that they don't get created every time\n const onLatitudeChangeRef = useRef(\n throttle(\n (value: number) => {\n const undoableChangeLocation = {\n name: 'Set Latitude',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: value,\n oldAddress: address,\n newAddress: '',\n undo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.oldLatitude;\n state.world.address = undoableChangeLocation.oldAddress;\n });\n setUpdateFlag(!updateFlag);\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.newLatitude;\n state.world.address = undoableChangeLocation.newAddress;\n });\n setUpdateFlag(!updateFlag);\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n state.world.latitude = value;\n state.world.address = '';\n });\n },\n 500,\n { leading: false, trailing: true },\n ),\n );\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'heliodonPanel';\n });\n }}\n >\n \n \n
\n {i18n.t('heliodonPanel.SunAndTimeSettings', lang)}\n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n
\n {i18n.t('menu.settings.Heliodon', lang)}\n
\n {\n const undoableCheck = {\n name: 'Show Heliodon',\n timestamp: Date.now(),\n checked: !heliodon,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.heliodon = !undoableCheck.checked;\n if (state.viewState.heliodon) {\n state.updateSceneRadius();\n }\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.heliodon = undoableCheck.checked;\n if (state.viewState.heliodon) {\n state.updateSceneRadius();\n }\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.viewState.heliodon = checked;\n if (state.viewState.heliodon) {\n state.updateSceneRadius();\n }\n });\n }}\n />\n
\n {heliodon && (\n
\n {i18n.t('heliodonPanel.SunAngles', lang)}\n
\n {\n const undoableCheck = {\n name: 'Show Sun Angles',\n timestamp: Date.now(),\n checked: !showSunAngles,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showSunAngles = !undoableCheck.checked;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showSunAngles = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.viewState.showSunAngles = checked;\n });\n }}\n />\n
\n )}\n {sunriseAndSunsetInMinutes.sunset > 0 && !runSimulation && (\n <>\n
\n {i18n.t('word.Animate', lang)}\n
\n {\n const undoableCheck = {\n name: 'Animate Heliodon',\n timestamp: Date.now(),\n checked: !animateSun,\n undo: () => {\n usePrimitiveStore.setState((state) => {\n state.animateSun = !undoableCheck.checked;\n });\n },\n redo: () => {\n usePrimitiveStore.setState((state) => {\n state.animateSun = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n usePrimitiveStore.setState((state) => {\n state.animateSun = checked;\n });\n }}\n />\n
\n {animateSun && (\n
\n {i18n.t('heliodonPanel.TwentyFourHours', lang)}\n
\n {\n const undoableCheck = {\n name: 'Animate 24 Hours',\n timestamp: Date.now(),\n checked: !animate24Hours,\n undo: () => {\n setCommonStore((state) => {\n state.animate24Hours = !undoableCheck.checked;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.animate24Hours = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.animate24Hours = checked;\n });\n }}\n />\n
\n )}\n \n )}\n
\n {i18n.t('word.Date', lang)}\n
\n {\n if (d) {\n const day = new Date(date);\n const m = d.toDate();\n day.setFullYear(m.getFullYear());\n day.setMonth(m.getMonth());\n day.setDate(m.getDate());\n const undoableChange = {\n name: 'Set Date',\n timestamp: Date.now(),\n oldValue: dateString,\n newValue: day.toString(),\n undo: () => {\n setCommonStore((state) => {\n state.world.date = undoableChange.oldValue as string;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.date = undoableChange.newValue as string;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.world.date = day.toLocaleString('en-US');\n });\n }\n }}\n />\n
\n
\n {i18n.t('word.Time', lang)}\n
\n {\n if (t) changeTime?.(t.toDate(), true);\n }}\n />\n
\n {!runSimulation && (\n
\n {i18n.t('word.Latitude', lang)}: {latitude.toFixed(2)}°\n \n
\n )}\n
\n
\n \n \n );\n};\n\nexport default React.memo(HeliodonPanel);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\n\nexport const SYMBOLS = [\n 'circle',\n 'square',\n 'triangle up',\n 'triangle down',\n 'triangle right',\n 'triangle left',\n 'star',\n 'diamond',\n 'hexagon',\n];\n\nexport enum Direction {\n DOWN,\n UP,\n LEFT,\n RIGHT,\n}\n\nconst strokeWidth = 1;\n\nexport const CircleSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const SquareSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const TriangleSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, direction, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n let pointsString;\n switch (direction) {\n case Direction.UP:\n pointsString = '-4,2.5,4,2.5,0,-3.5';\n break;\n case Direction.LEFT:\n pointsString = '2.5,4,2.5,-4,-3.5,0';\n break;\n case Direction.RIGHT:\n pointsString = '-2.5,4,-2.5,-4,3.5,0';\n break;\n default:\n pointsString = '-4,-2.5,4,-2.5,0,3.5';\n }\n // strokeWidth needs to be halved as the view box is too small\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const DiamondSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n // strokeWidth needs to be halved as the view box is too small\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const StarSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n // we need to scale down by 50% first before applying the scale factor as the original svg is too large\n const s = 0.05 * scale;\n return (\n // strokeWidth needs to be doubled as the view box is too large\n \n \n \n );\n }\n return null;\n};\n\nexport const HexagonSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n const s = 0.02 * scale;\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const createSymbol = (type: string, size: number, count: number, opacity: number, fillColor?: string) => {\n switch (type) {\n case 'circle':\n return ;\n case 'square':\n return ;\n case 'triangle up':\n return (\n \n );\n case 'triangle down':\n return (\n \n );\n case 'triangle right':\n return (\n \n );\n case 'triangle left':\n return (\n \n );\n case 'star':\n return ;\n case 'diamond':\n return ;\n case 'hexagon':\n return ;\n }\n};\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Menu, Dropdown, Checkbox } from 'antd';\nimport { ReactComponent as MenuSVG } from '../assets/menu.svg';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\n\nconst StyledMenuSVG = styled(MenuSVG)`\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n`;\n\nexport interface BarGraphMenuProps {\n horizontalGrid: boolean;\n verticalGrid: boolean;\n changeHorizontalGrid?: (visible: boolean) => void;\n changeVerticalGrid?: (visible: boolean) => void;\n}\n\nconst BarGraphMenu = ({\n horizontalGrid,\n verticalGrid,\n changeHorizontalGrid,\n changeVerticalGrid,\n}: BarGraphMenuProps) => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n\n const [visible, setVisible] = useState(false);\n\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n };\n\n const onShowHorizontalGridLines = () => {\n changeHorizontalGrid?.(!horizontalGrid);\n };\n\n const onShowVerticalGridLines = () => {\n changeVerticalGrid?.(!verticalGrid);\n };\n\n const menu = (\n \n \n \n {i18n.t('menu.graph.ShowHorizontalGridLines', lang)}\n \n \n \n \n {i18n.t('menu.graph.ShowVerticalGridLines', lang)}\n \n \n \n );\n\n return (\n <>\n \n {\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n\nexport default BarGraphMenu;\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Label,\n Legend,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { PRESET_COLORS } from '../constants';\nimport { GraphDataType, DatumEntry } from '../types';\nimport BarGraphMenu from './barGraphMenu';\n\nexport interface BarGraphProps {\n type: GraphDataType;\n dataSource: DatumEntry[];\n height: number;\n dataKeyAxisX?: string;\n labelX?: string;\n labelY?: string;\n unitX?: string;\n unitY?: string;\n yMin?: string | number;\n yMax?: string | number;\n fractionDigits?: number;\n referenceX?: number | string;\n color?: string;\n}\n\nconst BarGraph = ({\n type,\n dataSource,\n height,\n dataKeyAxisX,\n labelX,\n labelY,\n unitX,\n unitY,\n yMin = 'auto',\n yMax = 'auto',\n fractionDigits = 2,\n referenceX,\n color,\n}: BarGraphProps) => {\n const [dataSetCount, setDataSetCount] = useState(0);\n const [horizontalGridLines, setHorizontalGridLines] = useState(true);\n const [verticalGridLines, setVerticalGridLines] = useState(true);\n const [legendDataKey, setLegendDataKey] = useState(null);\n\n //init\n useEffect(() => {\n if (!dataSource || dataSource.length === 0) {\n return;\n }\n const len = Array.isArray(dataSource) ? Object.keys(dataSource[0]).length - 1 : Object.keys(dataSource).length - 1;\n if (dataSetCount !== len) {\n setDataSetCount(len);\n }\n }, [dataSource]);\n\n const getBars = useMemo(() => {\n const bars = [];\n for (let i = 0; i < dataSetCount; i++) {\n let name = '';\n switch (type) {\n case GraphDataType.MonthlyTemperatures:\n name = i === 0 ? `Low` : 'High';\n break;\n case GraphDataType.SunshineHours:\n name = 'Sunshine';\n break;\n case GraphDataType.HourlyTemperatures:\n name = 'Temperature';\n break;\n case GraphDataType.DaylightData:\n name = 'Daylight';\n break;\n case GraphDataType.ClearnessData:\n name = 'Clearness';\n break;\n case GraphDataType.DailyRadiationSensorData:\n case GraphDataType.YearlyRadiationSensorData:\n name = 'Radiation';\n break;\n }\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n bars.push(\n ,\n );\n }\n return bars;\n }, [dataSetCount, legendDataKey]);\n\n // @ts-ignore\n const onMouseDown = (e) => {};\n\n // @ts-ignore\n const onMouseEnterLegend = (o) => {\n setLegendDataKey(o.dataKey);\n };\n\n // @ts-ignore\n const onMouseLeaveLegend = (o) => {\n setLegendDataKey(null);\n };\n\n return (\n <>\n {dataSource && (\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\n \n \n \n \n value.toFixed(fractionDigits) + ' ' + unitY} />\n \n \n \n \n \n \n \n {getBars}\n {dataSetCount > 1 && (\n \n )}\n \n \n {\n setHorizontalGridLines(checked);\n }}\n changeVerticalGrid={(checked) => {\n setVerticalGridLines(checked);\n }}\n />\n \n \n )}\n \n );\n};\n\nexport default BarGraph;\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Euler, Mesh, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport { Box, Circle, Cone, Plane, Sphere, Torus } from '@react-three/drei';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from 'src/types';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from '../../stores/selector';\r\nimport { GROUND_ID, HALF_PI, HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR, TWO_PI } from 'src/constants';\r\nimport { WallFill, WallModel } from 'src/models/WallModel';\r\nimport Wireframe from '../wireframe';\r\nimport { UndoableMoveFoundationGroup } from 'src/undo/UndoableMove';\r\nimport { UndoableResizeBuildingXY, UndoableResizeBuildingZ } from 'src/undo/UndoableResizeBuilding';\r\nimport { useHandleSize } from 'src/views/wall/hooks';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { isGroupable } from 'src/models/Groupable';\r\nimport { Util } from 'src/Util';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\n\r\ninterface GroupMasterProps {\r\n groupedElementsIdSet: Set;\r\n childCuboidSet: Set;\r\n initalPosition: number[];\r\n initalDimension: number[];\r\n initalRotation: number;\r\n}\r\n\r\ninterface HandleProps {\r\n args: number[]; // [cx, cy, cz, handleSize];\r\n handleType: MoveHandleType | ResizeHandleType | RotateHandleType;\r\n}\r\n\r\nenum Operation {\r\n Move = 'Move',\r\n ResizeXY = 'Resize XY',\r\n ResizeZ = 'Resize Z',\r\n RotateUpper = 'Rotate Upper',\r\n RotateLower = 'Rotate Lower',\r\n Null = 'Null',\r\n}\r\n\r\nexport type PartialWallHeight = {\r\n upperLeft: number;\r\n upperRight: number;\r\n lowerLeft: number;\r\n lowerRight: number;\r\n};\r\n\r\nconst zeroVector2 = new Vector2();\r\n\r\nconst ResizeHandle = ({ args, handleType }: HandleProps) => {\r\n const [cx, cy, cz, handleSize] = args;\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n return (\r\n setColor(HIGHLIGHT_HANDLE_COLOR)}\r\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst MoveHandle = ({ args, handleType }: HandleProps) => {\r\n const [cx, cy, cz, handleSize] = args;\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n return (\r\n setColor(HIGHLIGHT_HANDLE_COLOR)}\r\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst RotateHandle = ({ args, handleType }: HandleProps) => {\r\n const [cx, cy, cz, handleSize] = args;\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const mesh = useMemo(() => , [color]);\r\n return (\r\n setColor(HIGHLIGHT_HANDLE_COLOR)}\r\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\r\n scale={handleSize * 4}\r\n >\r\n \r\n \r\n {mesh}\r\n \r\n \r\n {mesh}\r\n \r\n \r\n {mesh}\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nconst GroupMaster = ({\r\n groupedElementsIdSet,\r\n childCuboidSet,\r\n initalPosition,\r\n initalDimension,\r\n initalRotation,\r\n}: GroupMasterProps) => {\r\n const [cx, cy, cz] = initalPosition;\r\n const [lx, ly, lz] = initalDimension;\r\n const aspectRatio = lx === 0 ? 1 : ly / lx;\r\n const lockAspectRatio = groupedElementsIdSet.size > 1 || childCuboidSet.size > 0;\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const intersectionPlanePositionRef = useRef(new Vector3());\r\n const intersectionPlaneRotationRef = useRef(new Euler());\r\n const resizeAnchorRef = useRef(new Vector2());\r\n const elementHeightMapRef = useRef>(new Map());\r\n const wallRelPointsMapRef = useRef>(new Map());\r\n const partialWallHeightMapRef = useRef>(new Map());\r\n const skylightRelPosMapRef = useRef>(new Map());\r\n const baseRelPosMapRef = useRef>(new Map());\r\n const baseRotationMapRef = useRef>(new Map());\r\n const basePosRatioMapRef = useRef>(new Map()); // 2d\r\n const baseDmsRatioMapRef = useRef>(new Map()); // 2d\r\n const resizerCenterRelPosRef = useRef(new Vector3());\r\n const pointerDownRef = useRef(false); // for performance reason\r\n\r\n // undo\r\n const foundatonOldDataMapRef = useRef>(new Map());\r\n const wallOldPointsMapRef = useRef>(new Map());\r\n const elementOldHeightMapRef = useRef>(new Map());\r\n const oldPartialWallHeightMapRef = useRef>(new Map());\r\n const oldSkyligthPosMapRef = useRef>(new Map());\r\n\r\n const [position, setPosition] = useState(new Vector3(cx, cy, cz));\r\n const [rotation, setRotation] = useState(initalRotation);\r\n const [hx, setHx] = useState(lx / 2);\r\n const [hy, setHy] = useState(ly / 2);\r\n const [height, setHeight] = useState(lz);\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [operation, setOperation] = useState(Operation.Null);\r\n\r\n const { get: getThree } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n\r\n const getElementById = useStore(Selector.getElementById);\r\n const getCameraDirection = useStore(Selector.getCameraDirection);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n useEffect(() => {\r\n setHeight(lz);\r\n }, [lz]);\r\n\r\n useEffect(() => {\r\n setPosition(new Vector3(cx, cy, cz));\r\n setDimension(lx, ly);\r\n setRotation(initalRotation);\r\n }, [initalPosition, initalDimension, initalRotation]);\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / getThree().gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / getThree().gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, getThree().camera);\r\n };\r\n\r\n const setDimension = (lx: number, ly: number) => {\r\n setHx(lx / 2);\r\n setHy(ly / 2);\r\n };\r\n\r\n const initPointerDown = (event: ThreeEvent) => {\r\n setShowIntersectionPlane(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n pointerDownRef.current = true;\r\n intersectionPlanePositionRef.current.set(0, 0, 0);\r\n intersectionPlaneRotationRef.current.set(0, 0, 0);\r\n setCommonStoreHandleType(MoveHandleType.Default);\r\n event.stopPropagation();\r\n };\r\n\r\n const updateUndoableResizeXY = (\r\n foundationDataMap: Map,\r\n wallPointsMap: Map,\r\n skyligthPosMap: Map,\r\n ) => {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && foundationDataMap.has(elem.id)) {\r\n [elem.cx, elem.cy, elem.lx, elem.ly] = foundationDataMap.get(elem.id)!;\r\n } else if (foundationDataMap.has(elem.parentId)) {\r\n switch (elem.type) {\r\n case ObjectType.Wall: {\r\n const points = wallPointsMap.get(elem.id);\r\n if (!points) continue;\r\n const w = elem as WallModel;\r\n const leftPoint = points.slice(0, 3);\r\n const rightPoint = points.slice(3);\r\n w.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n w.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n w.lx = Math.hypot(leftPoint[0] - rightPoint[0] + (leftPoint[1] - rightPoint[1]));\r\n w.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = elem as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n const position = skyligthPosMap.get(elem.id);\r\n if (!position) continue;\r\n [window.cx, window.cy] = position;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const updateUndoableResizeZ = (\r\n heightMap: Map,\r\n partialWallHeightMap: Map,\r\n ) => {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (heightMap.has(elem.id)) {\r\n const height = heightMap.get(elem.id);\r\n if (height !== undefined) {\r\n if (elem.type === ObjectType.Roof) {\r\n (elem as RoofModel).rise = height;\r\n } else {\r\n elem.lz = height;\r\n }\r\n }\r\n }\r\n if (elem.type === ObjectType.Wall && partialWallHeightMap.has(elem.id)) {\r\n const w = elem as WallModel;\r\n const partialWallHeight = partialWallHeightMap.get(w.id);\r\n if (partialWallHeight) {\r\n w.leftTopPartialHeight = partialWallHeight.upperLeft;\r\n w.rightTopPartialHeight = partialWallHeight.upperRight;\r\n w.leftUnfilledHeight = partialWallHeight.lowerLeft;\r\n w.rightUnfilledHeight = partialWallHeight.lowerRight;\r\n }\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const updateFoundationGroupPosition = (map: Map) => {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (map.has(elem.id)) {\r\n const pos = map.get(elem.id);\r\n if (pos) {\r\n elem.cx = pos[0];\r\n elem.cy = pos[1];\r\n elem.cz = pos[2];\r\n elem.rotation[2] = pos[3];\r\n }\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n };\r\n\r\n const addUndoableMove = () => {\r\n const map = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if ((isGroupable(elem) && groupedElementsIdSet.has(elem.id)) || groupedElementsIdSet.has(elem.parentId)) {\r\n map.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\r\n }\r\n }\r\n const name = operation === Operation.Move ? 'Move' : 'Rotate';\r\n const undoableMove = {\r\n name: `${name} Foundation Group`,\r\n timestamp: Date.now(),\r\n oldPositionMap: new Map(foundatonOldDataMapRef.current),\r\n newPositionMap: new Map(map),\r\n undo: () => {\r\n updateFoundationGroupPosition(undoableMove.oldPositionMap);\r\n },\r\n redo: () => {\r\n updateFoundationGroupPosition(undoableMove.newPositionMap);\r\n },\r\n } as UndoableMoveFoundationGroup;\r\n addUndoable(undoableMove);\r\n };\r\n\r\n const addUndoableResizeXY = () => {\r\n const foundationNewDataMap = new Map();\r\n const wallNewPointsMap = new Map();\r\n const newSkylightPosMap = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (isGroupable(elem) && foundatonOldDataMapRef.current.has(elem.id)) {\r\n foundationNewDataMap.set(elem.id, [elem.cx, elem.cy, elem.lx, elem.ly]);\r\n } else if (wallOldPointsMapRef.current.has(elem.id)) {\r\n const w = elem as WallModel;\r\n wallNewPointsMap.set(elem.id, [...w.leftPoint, ...w.rightPoint]);\r\n } else if (oldSkyligthPosMapRef.current.has(elem.id)) {\r\n const window = elem as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n newSkylightPosMap.set(window.id, [window.cx, window.cy]);\r\n }\r\n }\r\n const undoableReizeXY = {\r\n name: 'Resize Building XY',\r\n timestamp: Date.now(),\r\n oldFoundationDataMap: new Map(foundatonOldDataMapRef.current),\r\n newFoundationDataMap: new Map(foundationNewDataMap),\r\n oldWallPointsMap: new Map(wallOldPointsMapRef.current),\r\n newWallPointsMap: new Map(wallNewPointsMap),\r\n oldSkylightPosMap: new Map(oldSkyligthPosMapRef.current),\r\n newSkylightPosMap: new Map(newSkylightPosMap),\r\n undo: () => {\r\n updateUndoableResizeXY(\r\n undoableReizeXY.oldFoundationDataMap,\r\n undoableReizeXY.oldWallPointsMap,\r\n undoableReizeXY.oldSkylightPosMap,\r\n );\r\n },\r\n redo: () => {\r\n updateUndoableResizeXY(\r\n undoableReizeXY.newFoundationDataMap,\r\n undoableReizeXY.newWallPointsMap,\r\n undoableReizeXY.newSkylightPosMap,\r\n );\r\n },\r\n } as UndoableResizeBuildingXY;\r\n addUndoable(undoableReizeXY);\r\n };\r\n\r\n const addUndoableReseizeZ = () => {\r\n const newHeightMap = new Map();\r\n const newPartialWallHeightMap = new Map();\r\n\r\n for (const elem of useStore.getState().elements) {\r\n if (elementOldHeightMapRef.current.has(elem.id)) {\r\n if (elem.type === ObjectType.Roof) {\r\n newHeightMap.set(elem.id, (elem as RoofModel).rise);\r\n } else {\r\n newHeightMap.set(elem.id, elem.lz);\r\n }\r\n }\r\n if (elem.type === ObjectType.Wall && oldPartialWallHeightMapRef.current.has(elem.id)) {\r\n const w = elem as WallModel;\r\n newPartialWallHeightMap.set(w.id, {\r\n lowerLeft: w.leftUnfilledHeight,\r\n lowerRight: w.rightUnfilledHeight,\r\n upperLeft: w.leftTopPartialHeight,\r\n upperRight: w.rightTopPartialHeight,\r\n });\r\n }\r\n }\r\n const undoableResizeZ = {\r\n name: 'Resize Building Z',\r\n timestamp: Date.now(),\r\n oldElementHeightMap: new Map(elementOldHeightMapRef.current),\r\n newElementHeightMap: new Map(newHeightMap),\r\n oldPartialWallHeightMap: new Map(oldPartialWallHeightMapRef.current),\r\n newPartialWallHeightMap: new Map(newPartialWallHeightMap),\r\n undo: () => {\r\n updateUndoableResizeZ(undoableResizeZ.oldElementHeightMap, undoableResizeZ.oldPartialWallHeightMap);\r\n },\r\n redo: () => {\r\n updateUndoableResizeZ(undoableResizeZ.newElementHeightMap, undoableResizeZ.newPartialWallHeightMap);\r\n },\r\n } as UndoableResizeBuildingZ;\r\n addUndoable(undoableResizeZ);\r\n };\r\n\r\n const setCommonStoreHandleType = (handleType: MoveHandleType | null) => {\r\n setCommonStore((state) => {\r\n state.moveHandleType = handleType;\r\n });\r\n };\r\n\r\n const resizeXY = (p: Vector3) => {\r\n const pointer2D = new Vector2(p.x, p.y);\r\n const anchor = resizeAnchorRef.current.clone();\r\n\r\n if (lockAspectRatio) {\r\n const diagonalVector = new Vector2().subVectors(pointer2D, anchor);\r\n const diagonalDistance = Math.max(1, diagonalVector.length());\r\n\r\n const lx = Math.sqrt(Math.pow(diagonalDistance, 2) / (Math.pow(aspectRatio, 2) + 1));\r\n const ly = lx * aspectRatio;\r\n\r\n const center = new Vector2(lx * Math.sign(diagonalVector.x), ly * Math.sign(diagonalVector.y))\r\n .normalize()\r\n .multiplyScalar(diagonalDistance / 2)\r\n .add(anchor);\r\n\r\n setPosition(new Vector3(center.x, center.y));\r\n setDimension(lx, ly);\r\n\r\n setCommonStore((state) => {\r\n const tempWorldDataMap = new Map();\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && (groupedElementsIdSet.has(elem.id) || childCuboidSet.has(elem.id))) {\r\n const posRatio = basePosRatioMapRef.current.get(elem.id);\r\n const dmsRatio = baseDmsRatioMapRef.current.get(elem.id);\r\n if (posRatio && dmsRatio) {\r\n const newLx = dmsRatio[0] * lx;\r\n const newLy = dmsRatio[1] * ly;\r\n\r\n elem.lx = newLx;\r\n elem.ly = newLy;\r\n\r\n if (elem.parentId !== GROUND_ID) {\r\n const parentWorldData = tempWorldDataMap.get(elem.parentId);\r\n if (parentWorldData) {\r\n const { pos, rot } = parentWorldData;\r\n const worldCenter = new Vector3(posRatio[0] * lx + center.x, posRatio[1] * ly + center.y);\r\n const relativeCenter = worldCenter.clone().sub(pos).applyEuler(new Euler(0, 0, -rot));\r\n elem.cx = relativeCenter.x;\r\n elem.cy = relativeCenter.y;\r\n tempWorldDataMap.set(elem.id, { pos: worldCenter.clone(), rot: elem.rotation[2] + rot });\r\n }\r\n } else {\r\n const newCx = posRatio[0] * lx + center.x;\r\n const newCy = posRatio[1] * ly + center.y;\r\n elem.cx = newCx;\r\n elem.cy = newCy;\r\n tempWorldDataMap.set(elem.id, { pos: new Vector3(newCx, newCy), rot: elem.rotation[2] });\r\n }\r\n\r\n for (const e of state.elements) {\r\n if (e.foundationId === elem.id) {\r\n switch (e.type) {\r\n case ObjectType.Wall: {\r\n const wall = e as WallModel;\r\n const relativePosition = wallRelPointsMapRef.current.get(wall.id);\r\n if (!relativePosition) continue;\r\n const [leftRelPoint, rightRelPoint] = relativePosition;\r\n const leftPoint = [leftRelPoint.x * newLx, leftRelPoint.y * newLy, elem.lz];\r\n const rightPoint = [rightRelPoint.x * newLx, rightRelPoint.y * newLy, elem.lz];\r\n wall.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n wall.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n wall.lx = Math.hypot(leftPoint[0] - rightPoint[0] + (leftPoint[1] - rightPoint[1]));\r\n wall.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\r\n wall.leftPoint = [...leftPoint];\r\n wall.rightPoint = [...rightPoint];\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = e as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n const relativePosition = skylightRelPosMapRef.current.get(window.id);\r\n if (!relativePosition) continue;\r\n window.cx = relativePosition[0] * newLx;\r\n window.cy = relativePosition[1] * newLy;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n const diagonal = anchor.distanceTo(pointer2D);\r\n const angle = Math.atan2(pointer2D.x - anchor.x, pointer2D.y - anchor.y) + rotation;\r\n const lx = Math.abs(diagonal * Math.sin(angle));\r\n const ly = Math.abs(diagonal * Math.cos(angle));\r\n const center = new Vector2().addVectors(pointer2D, anchor).multiplyScalar(0.5);\r\n setPosition(new Vector3(center.x, center.y));\r\n setDimension(lx, ly);\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n // foundationGroupSet only has one element here\r\n if (groupedElementsIdSet.has(elem.id)) {\r\n elem.lx = lx;\r\n elem.ly = ly;\r\n elem.cx = center.x;\r\n elem.cy = center.y;\r\n }\r\n // child elements\r\n else if (elem.foundationId && groupedElementsIdSet.has(elem.foundationId)) {\r\n switch (elem.type) {\r\n case ObjectType.Wall: {\r\n const wall = elem as WallModel;\r\n const relativePosition = wallRelPointsMapRef.current.get(wall.id);\r\n if (!relativePosition) continue;\r\n const [leftRelPoint, rightRelPoint] = relativePosition;\r\n const leftPoint = [leftRelPoint.x * lx, leftRelPoint.y * ly, 0];\r\n const rightPoint = [rightRelPoint.x * lx, rightRelPoint.y * ly, 0];\r\n wall.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n wall.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n wall.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n wall.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\r\n wall.leftPoint = [...leftPoint];\r\n wall.rightPoint = [...rightPoint];\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = elem as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n const relativePosition = skylightRelPosMapRef.current.get(window.id);\r\n if (!relativePosition) continue;\r\n window.cx = relativePosition[0] * lx;\r\n window.cy = relativePosition[1] * ly;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n useStore.getState().updateElementOnRoofFn();\r\n };\r\n\r\n const resizeZ = (p: Vector3) => {\r\n if (p.z < 0.1) return;\r\n const height = p.z;\r\n setHeight(height);\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (elementHeightMapRef.current.has(elem.id)) {\r\n if (elem.type === ObjectType.Wall) {\r\n elem.lz = height * elementHeightMapRef.current.get(elem.id)!;\r\n const w = elem as WallModel;\r\n if (w.fill === WallFill.Partial) {\r\n const partialWallHeight = partialWallHeightMapRef.current.get(w.id);\r\n if (partialWallHeight) {\r\n w.leftTopPartialHeight = height * partialWallHeight.upperLeft;\r\n w.rightTopPartialHeight = height * partialWallHeight.upperRight;\r\n w.leftUnfilledHeight = height * partialWallHeight.lowerLeft;\r\n w.rightUnfilledHeight = height * partialWallHeight.lowerRight;\r\n }\r\n }\r\n } else if (elem.type === ObjectType.Roof) {\r\n (elem as RoofModel).rise = height * elementHeightMapRef.current.get(elem.id)!;\r\n } else if (elem.type === ObjectType.Cuboid) {\r\n const heightRatio = elementHeightMapRef.current.get(elem.id);\r\n if (heightRatio) {\r\n const newHeight = heightRatio * height;\r\n elem.lz = newHeight;\r\n elem.cz = newHeight / 2;\r\n }\r\n }\r\n }\r\n }\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const rotate = (p: Vector3) => {\r\n const resizerCenter = new Vector3(position.x, position.y);\r\n const r =\r\n Math.atan2(resizerCenter.x - p.x, p.y - resizerCenter.y) + (operation === Operation.RotateUpper ? 0 : Math.PI);\r\n const offset = Math.abs(r) > Math.PI ? -TWO_PI : 0;\r\n const rotateAngle = r + offset;\r\n const euler = new Euler(0, 0, rotateAngle);\r\n const groupSize = baseRotationMapRef.current.size;\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && groupedElementsIdSet.has(elem.id) && !childCuboidSet.has(elem.id)) {\r\n const oldCenter = baseRelPosMapRef.current.get(elem.id);\r\n const oldRotation = groupSize !== 1 ? baseRotationMapRef.current.get(elem.id) : 0;\r\n if (oldCenter && oldRotation !== undefined) {\r\n const newCenter = oldCenter.clone().applyEuler(euler);\r\n elem.cx = resizerCenter.x + newCenter.x;\r\n elem.cy = resizerCenter.y + newCenter.y;\r\n elem.rotation = [0, 0, oldRotation + rotateAngle];\r\n }\r\n }\r\n if (elem.type !== ObjectType.Cuboid && groupedElementsIdSet.has(elem.parentId)) {\r\n const oldRotation = groupSize !== 1 ? baseRotationMapRef.current.get(elem.parentId) : 0;\r\n if (oldRotation !== undefined) {\r\n elem.rotation = [0, 0, oldRotation + rotateAngle];\r\n }\r\n }\r\n }\r\n });\r\n setRotation(rotateAngle);\r\n };\r\n\r\n const pointerDownBottomResizeHandle = (x: number, y: number) => {\r\n const positionV2 = new Vector2(position.x, position.y);\r\n resizeAnchorRef.current.set(x, y).rotateAround(zeroVector2, rotation).add(positionV2);\r\n setOperation(Operation.ResizeXY);\r\n\r\n basePosRatioMapRef.current.clear();\r\n baseDmsRatioMapRef.current.clear();\r\n wallRelPointsMapRef.current.clear();\r\n foundatonOldDataMapRef.current.clear();\r\n wallOldPointsMapRef.current.clear();\r\n skylightRelPosMapRef.current.clear();\r\n oldSkyligthPosMapRef.current.clear();\r\n\r\n const [currLx, currLy] = [hx * 2, hy * 2];\r\n for (const elem of useStore.getState().elements) {\r\n // base elements\r\n if (isGroupable(elem) && (groupedElementsIdSet.has(elem.id) || childCuboidSet.has(elem.id))) {\r\n const { pos } = Util.getWorldDataById(elem.id);\r\n basePosRatioMapRef.current.set(elem.id, [(pos.x - position.x) / currLx, (pos.y - position.y) / currLy]);\r\n baseDmsRatioMapRef.current.set(elem.id, [elem.lx / currLx, elem.ly / currLy]);\r\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.lx, elem.ly]);\r\n }\r\n // child elements\r\n else if (elem.foundationId && groupedElementsIdSet.has(elem.foundationId)) {\r\n const foundation = getElementById(elem.foundationId);\r\n if (!foundation) continue;\r\n switch (elem.type) {\r\n case ObjectType.Wall: {\r\n const wall = elem as WallModel;\r\n const leftPointRelative = new Vector2(wall.leftPoint[0] / foundation.lx, wall.leftPoint[1] / foundation.ly);\r\n const rightPointRelative = new Vector2(\r\n wall.rightPoint[0] / foundation.lx,\r\n wall.rightPoint[1] / foundation.ly,\r\n );\r\n wallRelPointsMapRef.current.set(wall.id, [leftPointRelative, rightPointRelative]);\r\n wallOldPointsMapRef.current.set(wall.id, [...wall.leftPoint, ...wall.rightPoint]);\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = elem as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n skylightRelPosMapRef.current.set(window.id, [window.cx / foundation.lx, window.cy / foundation.ly]);\r\n oldSkyligthPosMapRef.current.set(window.id, [window.cx, window.cy]);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const pointerDonwTopResizeHandle = (x: number, y: number, z: number) => {\r\n const { x: cameraX, y: cameraY } = getCameraDirection();\r\n intersectionPlanePositionRef.current.set(x, y, z);\r\n intersectionPlaneRotationRef.current.set(-HALF_PI, 0, -Math.atan2(cameraX, cameraY) - rotation, 'ZXY');\r\n setOperation(Operation.ResizeZ);\r\n\r\n elementHeightMapRef.current.clear();\r\n elementOldHeightMapRef.current.clear();\r\n partialWallHeightMapRef.current.clear();\r\n oldPartialWallHeightMapRef.current.clear();\r\n\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.foundationId && groupedElementsIdSet.has(elem.foundationId)) {\r\n if (elem.type === ObjectType.Wall) {\r\n elementHeightMapRef.current.set(elem.id, elem.lz / height);\r\n elementOldHeightMapRef.current.set(elem.id, elem.lz);\r\n const w = elem as WallModel;\r\n if (w.fill === WallFill.Partial) {\r\n oldPartialWallHeightMapRef.current.set(w.id, {\r\n upperLeft: w.leftTopPartialHeight,\r\n upperRight: w.rightTopPartialHeight,\r\n lowerLeft: w.leftUnfilledHeight,\r\n lowerRight: w.rightUnfilledHeight,\r\n });\r\n partialWallHeightMapRef.current.set(w.id, {\r\n upperLeft: w.leftTopPartialHeight / height,\r\n upperRight: w.rightTopPartialHeight / height,\r\n lowerLeft: w.leftUnfilledHeight / height,\r\n lowerRight: w.rightUnfilledHeight / height,\r\n });\r\n }\r\n } else if (elem.type === ObjectType.Roof) {\r\n elementHeightMapRef.current.set(elem.id, (elem as RoofModel).rise / height);\r\n elementOldHeightMapRef.current.set(elem.id, (elem as RoofModel).rise);\r\n }\r\n } else if (groupedElementsIdSet.has(elem.id) || childCuboidSet.has(elem.id)) {\r\n elementHeightMapRef.current.set(elem.id, elem.lz / height);\r\n elementOldHeightMapRef.current.set(elem.id, elem.lz);\r\n }\r\n }\r\n };\r\n\r\n const handleResizeHandlesPointerDown = (event: ThreeEvent) => {\r\n initPointerDown(event);\r\n switch (event.object.name) {\r\n case ResizeHandleType.UpperLeft: {\r\n pointerDownBottomResizeHandle(hx, -hy);\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n pointerDownBottomResizeHandle(-hx, -hy);\r\n break;\r\n }\r\n case ResizeHandleType.LowerLeft: {\r\n pointerDownBottomResizeHandle(hx, hy);\r\n break;\r\n }\r\n case ResizeHandleType.LowerRight: {\r\n pointerDownBottomResizeHandle(-hx, hy);\r\n break;\r\n }\r\n case ResizeHandleType.UpperLeftTop: {\r\n pointerDonwTopResizeHandle(-hx, hy, height);\r\n break;\r\n }\r\n case ResizeHandleType.UpperRightTop: {\r\n pointerDonwTopResizeHandle(hx, hy, height);\r\n break;\r\n }\r\n case ResizeHandleType.LowerLeftTop: {\r\n pointerDonwTopResizeHandle(-hx, -hy, height);\r\n break;\r\n }\r\n case ResizeHandleType.LowerRightTop: {\r\n pointerDonwTopResizeHandle(hx, -hy, height);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleMoveHanldesPointerDown = (event: ThreeEvent) => {\r\n initPointerDown(event);\r\n setOperation(Operation.Move);\r\n if (event.intersections.length > 0) {\r\n const p = event.intersections[0].point.clone().setZ(0);\r\n resizerCenterRelPosRef.current.subVectors(position, p);\r\n for (const elem of useStore.getState().elements) {\r\n if (isGroupable(elem) && groupedElementsIdSet.has(elem.id)) {\r\n const c = new Vector3(elem.cx, elem.cy);\r\n const v = new Vector3().subVectors(c, p);\r\n baseRelPosMapRef.current.set(elem.id, v);\r\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleRotateHandlesPointerDown = (event: ThreeEvent) => {\r\n initPointerDown(event);\r\n if (event.object.name === RotateHandleType.Lower) {\r\n setOperation(Operation.RotateLower);\r\n } else if (event.object.name === RotateHandleType.Upper) {\r\n setOperation(Operation.RotateUpper);\r\n }\r\n if (event.intersections.length > 0) {\r\n const resizerCenter = new Vector3(position.x, position.y);\r\n for (const elem of useStore.getState().elements) {\r\n if (isGroupable(elem) && groupedElementsIdSet.has(elem.id)) {\r\n const elemCenter = new Vector3(elem.cx, elem.cy);\r\n const v = new Vector3().subVectors(elemCenter, resizerCenter);\r\n baseRelPosMapRef.current.set(elem.id, v);\r\n baseRotationMapRef.current.set(elem.id, elem.rotation[2]);\r\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\r\n }\r\n if (groupedElementsIdSet.has(elem.parentId)) {\r\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleIntersectionPlanePointerUp = (event: ThreeEvent) => {\r\n switch (operation) {\r\n case Operation.Move:\r\n case Operation.RotateLower:\r\n case Operation.RotateUpper:\r\n addUndoableMove();\r\n break;\r\n case Operation.ResizeXY:\r\n addUndoableResizeXY();\r\n break;\r\n case Operation.ResizeZ:\r\n addUndoableReseizeZ();\r\n break;\r\n }\r\n setShowIntersectionPlane(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDownRef.current = false;\r\n setOperation(Operation.Null);\r\n setCommonStoreHandleType(null);\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const handleIntersectionPlanePointerMove = (event: ThreeEvent) => {\r\n if (!intersectionPlaneRef.current || !pointerDownRef.current) return;\r\n setRayCast(event);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point;\r\n switch (operation) {\r\n case Operation.ResizeXY:\r\n resizeXY(p);\r\n break;\r\n case Operation.ResizeZ:\r\n resizeZ(p);\r\n break;\r\n case Operation.RotateLower:\r\n case Operation.RotateUpper:\r\n rotate(p);\r\n break;\r\n case Operation.Move:\r\n setPosition(new Vector3().addVectors(p.clone().setZ(0), resizerCenterRelPosRef.current));\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && groupedElementsIdSet.has(elem.id) && !childCuboidSet.has(elem.id)) {\r\n const v = baseRelPosMapRef.current.get(elem.id);\r\n if (v) {\r\n elem.cx = p.x + v.x;\r\n elem.cy = p.y + v.y;\r\n }\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleSize = useHandleSize();\r\n const bottomHanldeZ = handleSize / 2;\r\n const topHanldeZ = height + bottomHanldeZ - handleSize / 2;\r\n const moveHanldeX = hx + handleSize;\r\n const moveHnadleY = hy + handleSize;\r\n const resizeHandleY = hy + handleSize * 4;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!orthographic && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {showIntersectionPlane && (\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(GroupMaster);\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Menu, Dropdown, Checkbox, Slider } from 'antd';\nimport { ReactComponent as MenuSVG } from '../assets/menu.svg';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\n\nconst StyledMenuSVG = styled(MenuSVG)`\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n`;\n\nexport interface LineGraphMenuProps {\n horizontalGrid: boolean;\n verticalGrid: boolean;\n lineCount: number;\n lineWidth: number;\n symbolSize: number;\n changeHorizontalGrid?: (visible: boolean) => void;\n changeVerticalGrid?: (visible: boolean) => void;\n changeLineWidth?: (width: number) => void;\n changeSymbolSize?: (count: number) => void;\n}\n\nconst LineGraphMenu = ({\n horizontalGrid,\n verticalGrid,\n lineCount,\n lineWidth,\n symbolSize,\n changeHorizontalGrid,\n changeVerticalGrid,\n changeLineWidth,\n changeSymbolSize,\n}: LineGraphMenuProps) => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n\n const [visible, setVisible] = useState(false);\n\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n };\n\n const onShowHorizontalGridLines = () => {\n changeHorizontalGrid?.(!horizontalGrid);\n };\n\n const onShowVerticalGridLines = () => {\n changeVerticalGrid?.(!verticalGrid);\n };\n\n const onChangeLineWidth = (value: number) => {\n changeLineWidth?.(value / 2);\n };\n\n const onChangeSymbolSize = (size: number) => {\n changeSymbolSize?.(size / 5);\n };\n\n const menu = (\n \n \n {i18n.t('menu.graph.LineWidth', lang) + ':'}\n \n \n \n {i18n.t('menu.graph.SymbolSize', lang) + ':'}\n \n \n \n \n {i18n.t('menu.graph.ShowHorizontalGridLines', lang)}\n \n \n \n \n {i18n.t('menu.graph.ShowVerticalGridLines', lang)}\n \n \n \n );\n\n return (\n <>\n \n 1 ? '25px' : '32px' }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n\nexport default LineGraphMenu;\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n Label,\n Legend,\n Line,\n LineChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { createSymbol, SYMBOLS } from './symbols';\nimport { PRESET_COLORS } from '../constants';\nimport { ChartType, DatumEntry, GraphDataType } from '../types';\nimport { CurveType } from 'recharts/types/shape/Curve';\nimport LineGraphMenu from './lineGraphMenu';\n\nexport interface LineGraphProps {\n type: GraphDataType;\n chartType: ChartType;\n selectedIndex?: number;\n dataSource: DatumEntry[];\n labels?: string[];\n height: number;\n dataKeyAxisX?: string;\n labelX?: string;\n labelY?: string;\n unitX?: string;\n unitY?: string;\n yMin?: string | number;\n yMax?: string | number;\n curveType?: CurveType;\n referenceX?: number | string;\n fractionDigits?: number;\n symbolCount?: number;\n}\n\nconst LineGraph = ({\n type,\n chartType = ChartType.Line,\n selectedIndex,\n dataSource,\n labels,\n height,\n dataKeyAxisX,\n labelX,\n labelY,\n unitX,\n unitY,\n yMin = 'auto',\n yMax = 'auto',\n curveType = 'linear',\n referenceX,\n fractionDigits = 2,\n symbolCount = 12,\n}: LineGraphProps) => {\n const [lineCount, setLineCount] = useState(0);\n const [horizontalGridLines, setHorizontalGridLines] = useState(true);\n const [verticalGridLines, setVerticalGridLines] = useState(true);\n const [legendDataKey, setLegendDataKey] = useState(null);\n const [lineWidth, setLineWidth] = useState(2);\n const [symbolSize, setSymbolSize] = useState(1);\n\n //init\n useEffect(() => {\n if (!dataSource || dataSource.length === 0) {\n setLineCount(0);\n return;\n }\n const len = Array.isArray(dataSource) ? Object.keys(dataSource[0]).length - 1 : Object.keys(dataSource).length - 1;\n if (lineCount !== len) {\n setLineCount(len);\n }\n }, [lineCount, dataSource]);\n\n const getRepresentations = useMemo(() => {\n const representations = [];\n let defaultSymbol;\n for (let i = 0; i < lineCount; i++) {\n let name = '';\n switch (type) {\n case GraphDataType.MonthlyTemperatures:\n name = i === 0 ? `Low` : 'High';\n break;\n case GraphDataType.SunshineHours:\n name = 'Sunshine';\n break;\n case GraphDataType.HourlyTemperatures:\n if (lineCount === 1) {\n name = 'Temperature';\n } else {\n if (i === 1) {\n name = 'PartonLogan';\n } else if (i === 2) {\n name = 'Ground';\n } else {\n name = 'Sinusoidal';\n }\n }\n break;\n case GraphDataType.DaylightData:\n name = 'Daylight';\n break;\n case GraphDataType.ClearnessData:\n name = 'Clearness';\n break;\n case GraphDataType.DailyRadiationSensorData:\n case GraphDataType.YearlyRadiationSensorData:\n name = labels && labels[i] ? labels[i] : 'Radiation' + (i + 1);\n break;\n case GraphDataType.DailyPvYield:\n case GraphDataType.YearlyPvYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Panel' + (i + 1);\n }\n break;\n case GraphDataType.DailyParabolicTroughYield:\n case GraphDataType.YearlyParabolicTroughYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Trough' + (i + 1);\n }\n break;\n case GraphDataType.DailyParabolicDishYield:\n case GraphDataType.YearlyParabolicDishYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Dish' + (i + 1);\n }\n break;\n case GraphDataType.DailyFresnelReflectorYield:\n case GraphDataType.YearlyFresnelReflectorYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Reflector' + (i + 1);\n }\n break;\n case GraphDataType.DailyHeliostatYield:\n case GraphDataType.YearlyHeliostatYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Heliostat' + (i + 1);\n }\n break;\n case GraphDataType.DailyUpdraftTowerYield:\n case GraphDataType.YearlyUpdraftTowerYield:\n name = labels && labels[i] ? labels[i] : 'Tower' + (i + 1);\n break;\n case GraphDataType.DailyBuildingEnergy:\n case GraphDataType.YearlyBuildingEnergy:\n name = labels && labels[i] ? labels[i] : 'Energy' + (i + 1);\n break;\n }\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n const symbol = createSymbol(SYMBOLS[i], symbolSize, symbolCount, opacity);\n if (i === 0) defaultSymbol = symbol;\n const isMeasured = name.startsWith('Measured');\n representations.push(\n chartType === ChartType.Area ? (\n \n ) : (\n 0 ? (symbol ? symbol : defaultSymbol) : false}\n isAnimationActive={false}\n />\n ),\n );\n }\n return representations;\n }, [type, chartType, selectedIndex, curveType, labels, lineCount, lineWidth, symbolCount, symbolSize, legendDataKey]);\n\n // @ts-ignore\n const onMouseDown = (e) => {};\n\n // @ts-ignore\n const onMouseEnterLegend = (o) => {\n setLegendDataKey(o.dataKey);\n };\n\n // @ts-ignore\n const onMouseLeaveLegend = (o) => {\n setLegendDataKey(null);\n };\n\n return (\n <>\n {dataSource && (\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\n \n \n \n {chartType === ChartType.Area ? (\n \n value.toFixed(fractionDigits) + ' ' + unitY} />\n \n \n \n \n \n \n \n {getRepresentations}\n {lineCount > 1 && (\n \n )}\n \n ) : (\n \n value.toFixed(fractionDigits) + ' ' + unitY} />\n \n \n \n \n \n \n \n {getRepresentations}\n {lineCount > 1 && (\n \n )}\n \n )}\n \n {\n setHorizontalGridLines(checked);\n }}\n changeVerticalGrid={(checked) => {\n setVerticalGridLines(checked);\n }}\n changeLineWidth={(value) => {\n setLineWidth(value);\n }}\n changeSymbolSize={(value) => {\n setSymbolSize(value);\n }}\n />\n \n \n )}\n \n );\n};\n\nexport default LineGraph;\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport BarGraph from '../components/barGraph';\nimport LineGraph from '../components/lineGraph';\nimport { ChartType, GraphDataType } from '../types';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { Undoable } from '../undo/Undoable';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n left: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 300px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface WeatherPanelProps {\n city: string | null;\n graphs: GraphDataType[];\n}\n\nconst WeatherPanel = ({ city, graphs }: WeatherPanelProps) => {\n const language = useStore(Selector.language);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const now = new Date(useStore(Selector.world.date));\n const getWeather = useStore(Selector.getWeather);\n const panelRect = useStore(Selector.viewState.weatherPanelRect);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 540;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 600;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.min(panelRect.x, window.innerWidth - wOffset) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.weatherPanelRect) {\n state.viewState.weatherPanelRect = new Rectangle(0, 0, 500, 500);\n }\n state.viewState.weatherPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.weatherPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const responsiveHeight = useMemo(() => {\n return graphs ? Math.floor(100 / graphs.length) : 100;\n }, [graphs]);\n\n const getData = useMemo(() => {\n if (!graphs) {\n return;\n }\n const result: any = {};\n if (city) {\n const weather = getWeather(city);\n if (weather) {\n graphs.forEach((g) => {\n result[g] = [];\n switch (g) {\n case GraphDataType.MonthlyTemperatures:\n for (let i = 0; i < 12; i++) {\n result[g].push({\n Month: MONTHS[i],\n Low: weather.lowestTemperatures[i],\n High: weather.highestTemperatures[i],\n });\n }\n break;\n case GraphDataType.SunshineHours:\n for (let i = 0; i < 12; i++) {\n result[g].push({\n Month: MONTHS[i],\n Sunshine: weather.sunshineHours[i],\n });\n }\n break;\n }\n });\n }\n }\n return result;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [graphs, city]);\n\n const yNames = [\n 'NA',\n i18n.t('word.Temperature', lang),\n i18n.t('word.Temperature', lang),\n i18n.t('weatherPanel.SunshineHours', lang),\n ];\n const yUnits = ['NA', '°C', '°C', i18n.t('word.Hour', lang)];\n const referenceX = MONTHS[now.getMonth()];\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.min(ui.x, window.innerWidth - wOffset),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.weatherPanelRect) {\n state.viewState.weatherPanelRect = new Rectangle(0, 0, 500, 500);\n }\n state.viewState.weatherPanelRect.x = Math.min(ui.x, window.innerWidth - wOffset);\n state.viewState.weatherPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Weather Panel',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showWeatherPanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showWeatherPanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showWeatherPanel = false;\n });\n };\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'weatherPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('word.Weather', lang) +\n ': ' +\n (city?.trim().endsWith(',') ? city?.trim().substring(0, city?.length - 2) : city)}\n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n <>\n {graphs.map((g) => {\n if (g === GraphDataType.SunshineHours) {\n return (\n \n );\n }\n return (\n \n );\n })}\n \n \n
\n \n );\n};\n\nexport default React.memo(WeatherPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport BarGraph from '../components/barGraph';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space, Switch } from 'antd';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyLightSensorPanelProps {\n city: string | null;\n}\n\nconst YearlyLightSensorPanel = ({ city }: YearlyLightSensorPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const sensorData = useDataStore(Selector.yearlyLightSensorData);\n const sensorLabels = useDataStore(Selector.sensorLabels);\n const panelRect = useStore(Selector.viewState.yearlyLightSensorPanelRect);\n const countElementsByType = useStore(Selector.countElementsByType);\n const daylightGraph = useStore(Selector.viewState.yearlyLightSensorPanelShowDaylight);\n const clearnessGraph = useStore(Selector.viewState.yearlyLightSensorPanelShowClearness);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n const [radiationGraph, setRadiationGraph] = useState(true);\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 600;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const lang = { lng: language };\n const referenceX = MONTHS[now.getMonth()];\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyLightSensorPanelRect) {\n state.viewState.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\n }\n state.viewState.yearlyLightSensorPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyLightSensorPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyLightSensorPanelRect) {\n state.viewState.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\n }\n state.viewState.yearlyLightSensorPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyLightSensorPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyLightSensorPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Yearly Light Sensor Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('word.Radiation', lang);\n const emptyGraph = sensorData && sensorData[0] ? Object.keys(sensorData[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyLightSensorPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('sensorPanel.LightSensor', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n {daylightGraph && (\n ({ Month: e.Month, Daylight: e.Daylight }))}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={i18n.t('word.Daylight', lang)}\n unitY={i18n.t('word.Hour', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={1}\n referenceX={referenceX}\n />\n )}\n {clearnessGraph && (\n ({ Month: e.Month, Clearness: e.Clearness }))}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={i18n.t('yearlyLightSensorPanel.SkyClearness', lang)}\n unitY={'%'}\n yMin={0}\n yMax={100}\n fractionDigits={1}\n referenceX={referenceX}\n color={'#66CDAA'}\n />\n )}\n {radiationGraph && (\n item)}\n labels={sensorLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={'kWh/m²/' + i18n.t('word.Day', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n )}\n \n \n {\n setCommonStore((state) => {\n state.viewState.yearlyLightSensorPanelShowDaylight = checked;\n });\n }}\n />\n {i18n.t('word.Daylight', lang)}\n \n \n {\n setCommonStore((state) => {\n state.viewState.yearlyLightSensorPanelShowClearness = checked;\n });\n }}\n />\n {i18n.t('yearlyLightSensorPanel.SkyClearness', lang)}\n \n \n {\n setRadiationGraph(checked);\n }}\n />\n {i18n.t('word.Radiation', lang)}\n \n \n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n const sensorCount = countElementsByType(ObjectType.Sensor);\n if (sensorCount === 0) {\n showInfo(i18n.t('analysisManager.NoSensorForCollectingData', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = { name: 'Collect Yearly Data for Sensors', timestamp: new Date().getTime() };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlyLightSensor = true;\n state.pauseYearlyLightSensor = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-light-sensor', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Light Sensor Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {sensorData && sensorData.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(sensorData, 'yearly-light-sensor.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Light Sensor Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n \n \n \n \n \n );\n};\n\nexport default React.memo(YearlyLightSensorPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space } from 'antd';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyLightSensorPanelProps {\n city: string | null;\n}\n\nconst DailyLightSensorPanel = ({ city }: DailyLightSensorPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const sensorLabels = useDataStore(Selector.sensorLabels);\n const sensorData = useDataStore(Selector.dailyLightSensorData);\n const panelRect = useStore(Selector.viewState.dailyLightSensorPanelRect);\n const countElementsByType = useStore(Selector.countElementsByType);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 460;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyLightSensorPanelRect) {\n state.viewState.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.dailyLightSensorPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyLightSensorPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyLightSensorPanelRect) {\n state.viewState.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.dailyLightSensorPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyLightSensorPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyLightSensorPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Daily Light Sensor Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('word.Radiation', lang);\n const emptyGraph = sensorData && sensorData[0] ? Object.keys(sensorData[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyLightSensorPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('sensorPanel.LightSensor', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n const sensorCount = countElementsByType(ObjectType.Sensor);\n if (sensorCount === 0) {\n showInfo(i18n.t('analysisManager.NoSensorForCollectingData', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = { name: 'Collect Daily Data for Sensors', timestamp: new Date().getTime() };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailyLightSensor = true;\n state.pauseDailyLightSensor = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-light-sensor', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Light Sensor Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {sensorData && sensorData.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(sensorData, 'daily-light-sensor.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Light Sensor Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n \n \n \n \n );\n};\n\nexport default React.memo(DailyLightSensorPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Input } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { Undoable } from '../undo/Undoable';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 12;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 200px;\n max-width: 800px;\n min-height: 60px;\n max-height: 600px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst { TextArea } = Input;\n\nconst StickyNotePanel = () => {\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const notes = useStore(Selector.notes);\n const panelRect = useStore(Selector.viewState.stickyNotePanelRect);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 440;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 400;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.min(panelRect.x, window.innerWidth - wOffset) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [text, setText] = useState(notes.length > 0 ? notes[0] : '');\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.stickyNotePanelRect) {\n state.viewState.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\n }\n state.viewState.stickyNotePanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.stickyNotePanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n useEffect(() => {\n setText(notes.length > 0 ? notes[0] : '');\n }, [notes]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.min(ui.x, window.innerWidth - wOffset),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.stickyNotePanelRect) {\n state.viewState.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\n }\n state.viewState.stickyNotePanelRect.x = Math.min(ui.x, window.innerWidth - wOffset);\n state.viewState.stickyNotePanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Sticky Note',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showStickyNotePanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showStickyNotePanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showStickyNotePanel = false;\n state.notes[0] = text;\n });\n };\n\n return (\n <>\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'stickyNotePanel';\n });\n }}\n >\n \n \n
\n {i18n.t('menu.view.accessories.Note', lang)}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n {\n setText(e.target.value);\n }}\n onBlur={() => {\n setCommonStore((state) => {\n state.notes[0] = text;\n });\n }}\n onPointerOut={() => {\n setCommonStore((state) => {\n state.notes[0] = text;\n });\n }}\n />\n \n \n \n \n );\n};\n\nexport default React.memo(StickyNotePanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport styled from 'styled-components';\nimport i18n from '../i18n/i18n';\nimport * as Selector from '../stores/selector';\nimport { Util } from '../Util';\nimport { CloseOutlined } from '@ant-design/icons';\nimport { Undoable } from '../undo/Undoable';\n\nconst Container = styled.div`\n position: absolute;\n top: 80px;\n left: 10px;\n margin: auto;\n display: flex;\n justify-content: left;\n align-self: flex-start;\n align-content: flex-start;\n align-items: start;\n padding: 16px;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n`;\n\nconst ColumnWrapper = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n align-self: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n margin: auto;\n width: 310px;\n padding-bottom: 10px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n`;\n\nconst InstructionPanel = () => {\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const language = useStore(Selector.language);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const navigation = useStore(Selector.viewState.navigationView) ?? false;\n const lang = { lng: language };\n const color = sunlightDirection.y > 0 ? 'navajowhite' : 'antiquewhite';\n\n const isMac = Util.isMac();\n\n const setNavigationView = (selected: boolean) => {\n setCommonStore((state) => {\n state.viewState.navigationView = selected;\n state.viewState.enableRotate = !selected;\n });\n };\n\n return (\n \n \n {navigation && (\n \n {i18n.t('instructionPanel.NavigationMode', lang)}\n {\n const undoableAction = {\n name: 'Close Navigation Mode',\n timestamp: Date.now(),\n undo: () => {\n setNavigationView(true);\n },\n redo: () => {\n setNavigationView(false);\n },\n } as Undoable;\n addUndoable(undoableAction);\n setNavigationView(false);\n }}\n />\n \n )}\n \n {i18n.t(navigation ? 'instructionPanel.DisableNavigation' : 'instructionPanel.EnableNavigation', lang)}\n : {i18n.t('word.Press', lang)} {isMac ? '⌘' : 'Ctrl'}+U\n \n {navigation && (\n <>\n \n {i18n.t('instructionPanel.MoveForwardBack', lang)}:{' '}\n {i18n.t('instructionPanel.MoveForwardBackInstruction', lang)}\n \n \n {i18n.t('instructionPanel.MoveLeftRight', lang)}:{' '}\n {i18n.t('instructionPanel.MoveLeftRightInstruction', lang)}\n \n \n {i18n.t('instructionPanel.MoveUpDown', lang)}:{' '}\n {i18n.t('instructionPanel.MoveUpDownInstruction', lang)}\n \n \n {i18n.t('instructionPanel.Turn', lang)}: {i18n.t('instructionPanel.TurnInstruction', lang)}\n \n \n )}\n {!orthographic && !navigation && (\n \n {i18n.t('instructionPanel.Rotate', lang)}: {i18n.t('instructionPanel.DragMouse', lang)}\n \n )}\n {!navigation && (\n <>\n \n {i18n.t('instructionPanel.Zoom', lang)}:{' '}\n {i18n.t(isMac ? 'instructionPanel.MouseWheelOrKeysMac' : 'instructionPanel.MouseWheelOrKeys', lang)}\n \n \n {i18n.t('instructionPanel.Pan', lang)}:{' '}\n {i18n.t(isMac ? 'instructionPanel.HoldMetaDragMouse' : 'instructionPanel.HoldCtrlDragMouse', lang)}\n \n \n {i18n.t(orthographic ? 'instructionPanel.Exit2DMode' : 'instructionPanel.Enter2DMode', lang)}:{' '}\n {i18n.t('word.Press', lang)} {isMac ? '⌘' : 'Ctrl'}+B\n \n \n )}\n \n \n );\n};\n\nexport default React.memo(InstructionPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space, Switch, Popover, Row, Col } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { Util } from 'src/Util';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyPvYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyPvYieldPanel = ({ city }: YearlyPvYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyPvYield);\n const individualOutputs = useStore(Selector.yearlyPvIndividualOutputs);\n const solarPanelLabels = useDataStore(Selector.solarPanelLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyPvYieldPanelRect);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const economics = useStore.getState().economicsParams;\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const panelSumRef = useRef(new Map());\n const resizeObserverRef = useRef();\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n const solarPanelCount = countElementsByType(ObjectType.SolarPanel);\n\n useEffect(() => {\n let s = 0;\n panelSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n panelSumRef.current.set(prop, (panelSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyPvYieldPanelRect) {\n state.viewState.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyPvYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyPvYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyPvYieldPanelRect) {\n state.viewState.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyPvYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyPvYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyPvYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Panel Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n useEffect(() => {\n if (solarPanelCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [solarPanelCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('solarPanelYieldPanel.Yield', lang);\n\n const solarPanelNumber = Util.countAllSolarPanels();\n const yearScaleFactor = 12 / daysPerYear;\n const totalYield = sum * yearScaleFactor;\n const totalCost = solarPanelNumber * economics.operationalCostPerUnit * 365;\n const totalRevenue = totalYield * economics.electricitySellingPrice;\n const totalProfit = totalRevenue - totalCost;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyPvYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('solarPanelYieldPanel.SolarPanelYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={solarPanelLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && solarPanelCount > 1 && panelSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === panelSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + totalYield.toFixed(2) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n <>\n {totalYield > 0 && (\n \n {i18n.t('solarPanelYieldPanel.YearlyTotal', lang) +\n ': ' +\n totalYield.toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n \n )}\n {totalYield > 0 && (\n \n \n {i18n.t('solarPanelYieldPanel.ModuleCount', lang) + ': '}\n {solarPanelNumber}\n \n \n {i18n.t('solarPanelYieldPanel.MeanYield', lang) + ': '}\n {(totalYield / solarPanelNumber).toFixed(2)} kWh\n \n \n {i18n.t('solarPanelYieldPanel.TotalCost', lang) + ': '}\n ${totalCost.toFixed(2)}\n \n \n {i18n.t('solarPanelYieldPanel.TotalRevenue', lang) + ': '}\n ${totalRevenue.toFixed(2)}\n \n \n {i18n.t('solarPanelYieldPanel.Profit', lang) + ': '}\n {(totalProfit > 0 ? '$' : '-$') + Math.abs(totalProfit).toFixed(2)}\n \n \n }\n >\n \n \n )}\n \n )}\n {!runEvolution && (\n <>\n {solarPanelCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (solarPanelCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Solar Panels: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runYearlySimulationForSolarPanels = true;\n state.pauseYearlySimulationForSolarPanels = false;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (solarPanelCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Solar Panels',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runYearlySimulationForSolarPanels = true;\n state.pauseYearlySimulationForSolarPanels = false;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-pv-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Solar Panel Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-pv-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Solar Panel Yearly Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n \n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyPvYieldPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space, Switch, Popover, Row, Col } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { Util } from 'src/Util';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyPvYieldPanelProps {\n city: string | null;\n}\n\nconst DailyPvYieldPanel = ({ city }: DailyPvYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyPvYield);\n const individualOutputs = useStore(Selector.dailyPvIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyPvYieldPanelRect);\n const solarPanelLabels = useDataStore(Selector.solarPanelLabels);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const economics = useStore.getState().economicsParams;\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.offsetWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.offsetHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const panelSumRef = useRef(new Map());\n const resizeObserverRef = useRef();\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n panelSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n panelSumRef.current.set(prop, (panelSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyPvYieldPanelRect) {\n state.viewState.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyPvYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyPvYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyPvYieldPanelRect) {\n state.viewState.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyPvYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyPvYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyPvYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Panel Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const solarPanelCount = countElementsByType(ObjectType.SolarPanel);\n useEffect(() => {\n if (solarPanelCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n });\n }\n }, [solarPanelCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('solarPanelYieldPanel.YieldPerHour', lang);\n const solarPanelNumber = Util.countAllSolarPanels();\n const totalCost = solarPanelNumber * economics.operationalCostPerUnit;\n const totalRevenue = sum * economics.electricitySellingPrice;\n const totalProfit = totalRevenue - totalCost;\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyPvYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('solarPanelYieldPanel.SolarPanelDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && solarPanelCount > 1 && panelSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === panelSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n <>\n {sum > 0 && (\n \n {i18n.t('solarPanelYieldPanel.DailyTotal', lang) +\n ': ' +\n sum.toFixed(3) +\n ' ' +\n i18n.t('word.kWh', lang)}\n \n )}\n {sum > 0 && (\n \n \n {i18n.t('solarPanelYieldPanel.ModuleCount', lang) + ': '}\n {solarPanelNumber}\n \n \n {i18n.t('solarPanelYieldPanel.MeanYield', lang) + ': '}\n {(sum / solarPanelNumber).toFixed(2)} kWh\n \n \n {i18n.t('solarPanelYieldPanel.TotalCost', lang) + ': '}\n ${totalCost.toFixed(2)}\n \n \n {i18n.t('solarPanelYieldPanel.TotalRevenue', lang) + ': '}\n ${totalRevenue.toFixed(2)}\n \n \n {i18n.t('solarPanelYieldPanel.Profit', lang) + ': '}\n {(totalProfit > 0 ? '$' : '-$') + Math.abs(totalProfit).toFixed(2)}\n \n \n }\n >\n \n \n )}\n \n )}\n {!runEvolution && (\n <>\n {solarPanelCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (solarPanelCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Solar Panels: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runDailySimulationForSolarPanels = true;\n state.pauseDailySimulationForSolarPanels = false;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (solarPanelCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Solar Panels',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runDailySimulationForSolarPanels = true;\n state.pauseDailySimulationForSolarPanels = false;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-pv-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Solar Panel Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-pv-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Solar Panel Daily Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n \n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyPvYieldPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport SolarPanelImage from '../assets/solar-panel.png';\nimport HeliostatImage from '../assets/heliostat.png';\nimport LightBulbImage from '../assets/light_bulb.png';\nimport DiameterImage from '../assets/diameter.png';\nimport AreaImage from '../assets/area.png';\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Space } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { BuildingCompletionStatus, ObjectType } from '../types';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { Util } from 'src/Util';\nimport { FoundationModel } from '../models/FoundationModel';\n\nconst Container = styled.div`\n position: absolute;\n bottom: 40px;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n`;\n\ninterface ColumnWrapperProps {\n projectView: boolean;\n}\n\nconst ColumnWrapper = styled.div`\n background: #282c34;\n position: absolute;\n top: 0;\n left: ${(p) => (p.projectView ? 'calc(3 * 100vw / 4 - 120px)' : 'calc(100vw / 2 - 120px)')};\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: 240px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n`;\n\nconst DesignInfoPanel = () => {\n const elements = useStore(Selector.elements);\n const countElementsByType = useStore(Selector.countElementsByType);\n const countSolarPanelsOnRack = useStore(Selector.countSolarPanelsOnRack);\n const getParent = useStore(Selector.getParent);\n const language = useStore(Selector.language);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const sceneRadius = useStore(Selector.sceneRadius);\n const projectView = useStore(Selector.projectView);\n\n const selectedElement = useStore((state) => {\n if (state.selectedElement === null) return null;\n return state.elements.find((e) => e.id === state.selectedElement?.id);\n });\n\n let solarPanelCount = 0;\n let solarPanelDailyYield = 0;\n let heliostatCount = 0;\n\n if (selectedElement) {\n if (selectedElement.type === ObjectType.SolarPanel) {\n solarPanelCount = countSolarPanelsOnRack(selectedElement.id);\n solarPanelDailyYield = (selectedElement as SolarPanelModel).dailyYield ?? 0;\n } else if (selectedElement.type === ObjectType.Polygon) {\n const parent = getParent(selectedElement);\n if (parent) {\n solarPanelCount = Util.countAllChildSolarPanels(parent.id);\n solarPanelDailyYield = Util.countAllChildSolarPanelDailyYields(parent.id);\n }\n } else {\n solarPanelCount = Util.countAllChildSolarPanels(selectedElement.id);\n solarPanelDailyYield = Util.countAllChildSolarPanelDailyYields(selectedElement.id);\n heliostatCount = Util.countAllChildElementsByType(selectedElement.id, ObjectType.Heliostat);\n }\n } else {\n solarPanelCount = Util.countAllSolarPanels();\n solarPanelDailyYield = Util.countAllSolarPanelDailyYields();\n heliostatCount = countElementsByType(ObjectType.Heliostat);\n }\n\n const lang = { lng: language };\n const daytime = sunlightDirection.y > 0;\n const color = daytime ? 'navajowhite' : 'antiquewhite';\n const filter = daytime\n ? 'invert(85%) sepia(45%) saturate(335%) hue-rotate(329deg) brightness(100%) contrast(101%)'\n : 'invert(95%) sepia(7%) saturate(1598%) hue-rotate(312deg) brightness(106%) contrast(96%)';\n\n // Do NOT put this in useMemo. Otherwise, it will crash the app.\n const isBuilding =\n selectedElement &&\n selectedElement.type === ObjectType.Foundation &&\n !(selectedElement as FoundationModel).notBuilding &&\n Util.getBuildingCompletionStatus(selectedElement as FoundationModel, elements) ===\n BuildingCompletionStatus.COMPLETE;\n\n return (\n \n \n \n {solarPanelCount > 0 && (\n <>\n \n {solarPanelCount}\n \n )}\n {heliostatCount > 0 && (\n <>\n \n {heliostatCount}\n \n )}\n {solarPanelDailyYield > 0 && (\n <>\n \n {solarPanelDailyYield.toFixed(1) + ' ' + i18n.t('word.kWh', lang)}\n \n )}\n {!selectedElement && (\n <>\n \n {sceneRadius * 2 + ' ' + i18n.t('word.MeterAbbreviation', lang)}\n \n )}\n {isBuilding && (\n <>\n \n \n {Util.getBuildingArea(selectedElement as FoundationModel, elements).toFixed(2) +\n ' ' +\n i18n.t('word.MeterAbbreviation', lang)}\n 2\n \n \n )}\n \n \n \n );\n};\n\nexport default React.memo(DesignInfoPanel);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEB8ttR0cqAAAA4lJREFUWIXNl0+IHEUUxn/vdfX0jOAoSQgGIoaQRRFdEwxe1j8BD5qDNxEiJje9+CcXUUTEm6gnBVFvehA9RIISIYgJGHMyugH/rGzwoiIku1Ek4mZnprrreeje3ZlJ98x0xoMfFDRV9b7vq5pXr2rg6nGDqr4OyBQc6BSx7RDC/VNyjA4WkQeAtyqGA3C5klj1o0ajsXMqA2Z2BtgvIvuqPFaIHw4hbO/1er+NMzAWIvIIMF8yNCMi3wDRUP/1qvoLcOvU4n04parPDfU1nXN7S+Z+CLzzX4oD7FHVFyeYp8CrwOZJidd/QxE5KCKrIYSPx8Rcp6r7Qgi7gbaqLpvZvJmdAvxId6pPmtmimZ0sG9wPnAWOxnF8SwXB88AlwEraTyJysHSVeRKfBr50zt0xxqS+oKrnyLdy7ZRcAxwvhE4ARypMGIPHtg18APwgIodGCQ/jRlV9iiLDVfUYYKp6WETuK0xUGbDCPMAmVX0aaNURH8bjhfizzrkDY4T729w0omtIgAvAfBRF9wAmIqWCJf3Hp1aPouhe8tU/QX6+rxATkSpTl5vN5rZxGi6O45vjOL4rhBBUFUB7vd7ZNE0XzOy2Yt554O61IDNDZKMKm1kZd8t7vws4nyTJXBRFO8nvDwAJIXzR6XSWnPd+l/f+ISArVh2p6gqwICJryZORn4QB0SiKyLKscnVZliUA3vu93vu5EEJGXnsE+B5YGrdDhwBzzj0KLFKy7VU5UcTdOU5gJJxztxdkfwKrw+JUJ6ABF4FrpzJQ4NsJxMra+1OpNhqNHcXngxMK9rfVOI5ngCRJku11tWeAT1X1MzYq4St1DDjnHiu4torIGeBtYNM44S3Aa8Ciqr7EleXz80nEVfWN/qBWq7W1MPCjqj5TwpujED0ClG6Zc26W/LodZWCp3W6XJp5zbg9wonhhlWL4aVWGc2NK8dEJOAZ0+h+l1RVlA1+ZWaqq65VQRBARzKynqqcn4BjQcRMErCNJkpe73e4SsKXVakVAGkKIO52OV9VfQwjv1uGrDRE5APxNXmQuqupy8f0HcMk5t7suZ60dMLNjwGZVvQnohRBS51wcQojN7Ls0TRfqGqgNVT0JdMkvkgvAsqqmwJtXw1f7j2Wz2dzW7XZnkyR5GAhZlgUzey9Jkp9XVlb+qss3ydEbQJqm/wC/hxBmsyzbISJfp2n6ife+U5frf4F/AW7wkmmQi1CEAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEDUIkXIExwAABSFJREFUWIWlV1tsFFUY/s6//5yZOUtnl13abrMb3KYSioCxNviAWblGMVFAwMQXeDJRX7xgxEQaecAHqJgYiI0PxhAviZoA8UWjxCgQEhrR+ECCWoVowwLa9EJwLdvZOT7MTLvby978k5PNzvn///v+y7kJNCDxeDwzOTnZC6DX87zlxWKxDQAsyyqUSqXftNYXHce5ODo6erkRv1XlwIEDkZaWlj1EdEYIoQFUHUIITUSXpJSvAUjW8i+qTVqW9XCxWDykte7RWkMIAa31VSL6EcCvAPKe50FKmQDQBeA+rfW9rutCaw0AN5j5Ddd132k4cinlYSIKIysB+NC27Q25XM6sZheLxVZLKfuJ6K/AVluW9WVnZ2dbvdgciUQ+D42J6DQz9zQaQDKZbCeigbBsRHTZNM1MbXTmk5ip5cFGgWeLbdsbAIzDD+hn27YrMlHRA1LKw8VicZ8QAvF4/JWxsbEj9YBEIpFcqVR6bJ4pLaUcZuYrhULhIwAJIcSZ7du3bzx16pRXoRmNRh8Kay6lPFRvhLlcLlJe79lDCKENw9iplFpLRFoIoU3T7KukqbWQUv4EQBuGMVgveCiLFi06thCBYOwFANu234TfD5NSyrumHTiO8wQRaSIqJRKJ3kYJAIBhGEerEHgRADKZjBmJRP4MAh2YNiai0wB00P1Ni2VZX1cjEOg8Dz8Lo6lUykZHR0cCwL9CCB2Pxx9tFpyIHieikVoEAMQBjAshdCwW20gTExM9QghLCDGSyWTONIm/1fO8k57nJQHcJKJPhZhZYIZhGGW64wDOaq1x586dTTAMYy8AzcynmwUHMAU/rf+YprkWAJRSA5jZzPaVG5imuR/+avsOSqn3AgLH/g84M0/GYrEN5ZOWZR0hovPMvLL8u1LqqYDAdQD4IGDa6K43DS6lLKbT6UfqNZRSrgtIawrA55XW1tZOpdTyBcBPAGAp5VQ6nd5x7dq1r+olUCqV3OAXsCzrffh1ertcKZlMtjPzKIAigG3h93g8vhWACz/yqa6urq31AodiWdYO+Bm4Ccuy9gV/vpiltwozy8gVQmxeunTpJmYOaz6VzWYbBgeASCTycuDjLJRSW4KTLz/rrF+ByrVcZOZiCJ5KpZoCDwicgJ/BfiSTyXYAU0II7TjOuioEwiV1q62tbWOz4Nls1iGiUQBaKbUFAEBE5+Hvzx/XIgDgFoBNzRKIRqNPBxm/nc1mHQCAaZq7g5tL0TCMZYHuPQsQ0PCbcNsc7zWkr69PMPMv8Mt4fHqiu7vbIKIh+CkOm7G7CgEthNC2ba9qhICUcn+AUVJKdVdMKqUeDS8kwYkFIvpDSqlN06wYUkrNzBML7BHzimmaDyLYuCzLeiv8XnElU0q9WygUnhFCIJlM7lm/fv0nw8PDDzAzu64LAGBmeJ7njYyM/D40NJSvE38lEX3reV4rM1/q7e1dMzg4ODlHq6enh4noHIJtMhqNPldvhAtJIpHYTER/w0/9jY6OjmW1bBxmPoegzlLKz9rb27ONAqdSKRvA6/DfFJqIrqdSqfvrMs7lciYzHy97io0D6I/FYqtr2S5evDitlHopbGoE98x6Ip8jpmnuBnAldEREmpl/YOYBwzBeYOYnAeyUUj4rpexn5m+I6HaZfoGZD+7atcuohlNVHMdpsW37VWa+XM/jNADOM/NRwzDuruW/6uN0tti2vVprnfM8bw2AFa7rtnueB2YeI6KrWusLQogLS5Ys+T6fz8/t8nnkP/P60xxqBkq1AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Space } from 'antd';\nimport { computeOutsideTemperature, getOutsideTemperatureAtMinute } from '../analysis/heatTools';\nimport dayjs from 'dayjs';\nimport { Util } from '../Util';\nimport i18n from '../i18n/i18n';\nimport { computeSunriseAndSunsetInMinutes } from '../analysis/sunTools';\nimport LocationImage from '../assets/location.png';\nimport DateImage from '../assets/date.png';\nimport ThermometerImage from '../assets/thermometer.png';\n\nconst Container = styled.div`\n position: absolute;\n top: 75px;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n`;\n\ninterface ColumnWrapperProps {\n projectView: boolean;\n}\n\nconst ColumnWrapper = styled.div`\n position: absolute;\n top: 0;\n left: ${(p) => (p.projectView ? 'calc(100vw / 2)' : 'calc(100vw / 4)')};\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: calc(100vw / 2);\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n`;\n\nexport interface SiteInfoPanelProps {\n city: string | null;\n}\n\nconst SiteInfoPanel = ({ city }: SiteInfoPanelProps) => {\n const language = useStore(Selector.language);\n const dateString = useStore(Selector.world.date);\n const address = useStore(Selector.world.address);\n const latitude = useStore(Selector.world.latitude);\n const longitude = useStore(Selector.world.longitude);\n const diurnalTemperatureModel = useStore(Selector.world.diurnalTemperatureModel);\n const weatherData = useStore(Selector.weatherData);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n const projectView = useStore(Selector.projectView);\n\n const [dailyTemperatures, setDailyTemperatures] = useState({ low: 0, high: 20 });\n const [currentTemperature, setCurrentTemperature] = useState(10);\n const now = new Date(dateString);\n const daytime = sunlightDirection.y > 0;\n const lang = { lng: language };\n\n useEffect(() => {\n if (city) {\n const weather = weatherData[city];\n if (weather) {\n const t = computeOutsideTemperature(now, weather.lowestTemperatures, weather.highestTemperatures);\n setDailyTemperatures(t);\n const c = getOutsideTemperatureAtMinute(\n t.high,\n t.low,\n diurnalTemperatureModel,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n Util.minutesIntoDay(now),\n );\n setCurrentTemperature(c);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [city, dateString]);\n\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, latitude);\n }, [dateString, latitude]);\n\n const color = daytime ? 'navajowhite' : 'antiquewhite';\n const filter = daytime\n ? 'invert(85%) sepia(45%) saturate(335%) hue-rotate(329deg) brightness(100%) contrast(101%)'\n : 'invert(95%) sepia(7%) saturate(1598%) hue-rotate(312deg) brightness(106%) contrast(96%)';\n\n return (\n \n \n \n \n {(address ?? '') +\n ' (' +\n Math.abs(latitude).toFixed(2) +\n '° ' +\n (latitude > 0 ? 'N' : 'S') +\n ', ' +\n Math.abs(longitude).toFixed(2) +\n '° ' +\n (longitude > 0 ? 'E' : 'W') +\n ')'}\n \n {dayjs(now).format('MM/DD hh:mm A')}\n \n {dailyTemperatures\n ? currentTemperature.toFixed(1) +\n '°C (' +\n i18n.t('siteInfoPanel.Low', lang) +\n ':' +\n dailyTemperatures.low.toFixed(1) +\n '°C, ' +\n i18n.t('siteInfoPanel.High', lang) +\n ': ' +\n dailyTemperatures.high.toFixed(1) +\n '°C)'\n : ''}\n \n \n \n );\n};\n\nexport default React.memo(SiteInfoPanel);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEAIi2s5tJQAAAvdJREFUWIW1l12IDWEYx3/PM+/MJLuSXfle2tCmxRVhw40oSW5FuXGhtCVX7smNwp0ouVBC8lFc+siFkojaXeurpLBaIp0255h9x8UMOzvmnJkznf3Xc/Ge93me//+8X88zQgl4nrc4CIIVQLe1tl1Vh6y174DBMvkKQ1W3A3eBAAgz7LmI7J8KbgNcqEOaZQ9835/fSvJbdYiqsWXNvQTmtELAqYzkl0VkG9AFdDmOsw44mSHmLiClmY0xvamENRHZ3cB/LfAxGSMie0sLILXvqnooL8BxnI3A70TcC0DLkE8DPiUSDVN8Oa8yeeVW1nNspKwbmJcY346TFcH11HhV0wIcx5mRHHueN1SQHN/334lMLJYxZmbTAkTEJsdBEHQWFRCGYVtybK0db1pAEATfgH+B1toNRQXUarX1YTixW9ba0aKxSbjAeyYO0pjrussLxr1l8iHsKSMA4GIq0TNgVk7MpVTMACWvIaq6I5Xsb8HZnOG+AriZ4X+sEUfevXaB18CSjLknwFPgF7Aa6AO8lM840RvwMoenPlT1MMWrYNqulSZOYDqp972oGWPqvoBNQUT2lRBwviXkCTxsgvwbMLvVAnqp33xMMhHZ02pyAIwxBwsIuDgl5AlcaUA+DPhTwur7/kKibZgGDGWQV+IOqtN13WUtIXVdtwc4Crwh6nJGgCWe53UD31MCdsVh90QkJGpmzjqOU7iI/UNbW9tM4BzRSzYOnBGRLcACohXAcZxN8Vyoqv1xqABzgU2x8M+xuDvxnymEdhF5HAd+Ajoa+B4ATufkexDnGgHyq6mq7mRiWb+q6i7AyQ3MgDFmDVE1/Jvv+H8+6R+sta+I7rsPdFhrbxAduvvAgIi8DsOw4nnel1qtVgVC3/dNtVqdTbR6S8Mw7AH6giDoS6V/VFT8VuADje/7GPAztkqObwXop0l0quoRorJb72M0z4aBEzTY+6J9/iJV7bXWriZqr7qAGcQ3QlV/W2t/AKPAgKoOWmsHYgEN8QfFcGW2NEnqrQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEBEGhyLIZgAAAzBJREFUWIXN1luIVWUUB/CfepzGSZ1M50Xpihk4EQRRD01B4JRFRS9B9RCGYg9Jl4cis0iGsHmIovTJF7OHbi/ShR6CLIrASzHeRgeiCwaVQmWheTlNp4f17WZ73NtzmSP1h81Ze529vvX/1re+tRb/MaaV6OfgNvyMEy2udzdO4kgzBlPS71xcmOS/sBAfYQm+RaVJAlV8hzV4M2d3DD+WGV2NX1DLPUP4A+vq9I2e+3EY6/FnTn8Sy4qcV0TIjuDhXAT+xiyMpkVrTUZgFH34Ldl1J/1qrMRrRUZD2Fqn68fnuLJJxxlm4jMM1unfxxdFBhWx2/ozHsWNLTqHo7ipQH+RONIzMFUkYrUNZ63gcPJ1BiqCdT82nSPnU3AV9pQRqIp7f/s5InAKszFeRuACbFd8dp3CtkSikABnv2aXYT5+wE+4Tuxqp6ghs7ALPVgkaspY3RpTz+Zjrbg6ZXhJVLIhXJ7kb9Alruox3IAHk/xWwRoHMNIugW704jyRUL1i18S97xU9oEvk0oyCNdbgmaLFm6nxJ5zekH7PyUdz8rg4GrgG1+J6Efq9+KTMwVqnR6AbX+GgOP8nk/wULknyl5iOD9L70mQ7gN3J6XF8j0OJaA37cGfeeVEEqnhFJNWv+FRUsRFR49eJRjMuakdf2uEjyW4/7sOHJqpfD27Gs3gPD2FjWQTawQNihy+aaPFleC59e28ZgYpImmExJ9ya5KViZhgWCTU9fd8ncmRLA8dzRc2BzclmZlF9niaK0iDOF8PJIK4QoRxM/2fT1GNJXt6AwFa8nuTHxa1axeSPYAzv1OkuNTELwBsi7AM53UYxPRnCx206nyGKT373XaKdj4joPZGc31Vnew9qWTPqx6MtOh8X1yq7LRlOJUJb8HXSrRbZn8cYkXBv45Y2CFTFmHVc7DqPbViMDYnccIH9ghb9leKgyOpWsV4MKpPGC+I45rVg0y1K+vOdIDBPnHtRFyzDZpGYczpBgKhqNbyqcSV8OX27rFPOMzydFj6AO0ShydAjmtCO9M2KTjvPMCCmo5poRNvTe9YN9yZy/6JRuCZDZAkuTo4P4d1E6P+FfwC6bc62I7I0pgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEBsiQc7EPQAAA4ZJREFUWIXV13+o32MUB/DXve4Wd4ZizFiMDRm7iYVhsj9QQstiasuv/Ejijxkp1krRyG1Lm0z5hygpTJrZsC0rsebXwmzpdpOw6zczM/frj3M+vs/99mXbvd+tdurb85znOZ9z3s855znP+bKf0uF4CB9gIxbjhH1l/Hj0oIaP8X7Ot2HKvgCwDn9jWrF2Gr7O34i9aXyiOO2dTfYuyr3pe6KwfQ8BjM3xHAxr2Ks8Mn6wAI7AuIb94Til4Gs5/lHMK/ozx7Ymdk7EMhz0fwBOx7tYhalYgrV4tAmAo0QeTMcNaXRUg8x5Ijdgh8iNHclPEeEcQIvz41oqeybn36p74ZJcuy9BVvI34eqcz03Zx7Al5xNxKY5DB37DLMnASKzEwbg20Q7DZwnkr5Trz/FMbC/AdxWnq2iO8OJC3JVr23B/eqanBPCCuNPXJf8ODsSklFmFy/BL7q/DD4Wx7bk2x8DcOKkwDp3oFvmgAvAsLhAump0ojxFuejuVwGvpDeIWrCkUt+PcnB+KDal3lOY0FfdgQjsW4VdsTgDvpdDORP9A8gvxYc43GhiCfnyS899xL14R+dOMvsJSzO8QpfRGfCPcfj5uxc15qqdELizLkxMeKpW3qdeInSKf4EnchpML2RXF/r85sFy4d1aeZqlw/bz0wlkiETsLI41UrVV1YCauyQPdjtHYhOdFaOdifVkHXsyxX1S1rpxvQG/uVQnW1wCihq0NgMaJxO7DgyK0i1Jui3w9O4oPekWNf0s8KndgjChQ1RWr4j6pwWCbetGpKuLDxf4ZeAIv4WcR3kHRLeK014uErQrRI8LVNTze5LsD1HNk0HRFGvhcXLsZBYAFKfNm8ncP1VgjjRUP0KeiahKJWgFYKe4/cVtq4i1oGT2dSseLvFlbGK9+m8X17MRPWN8q4yNE8r2c/JImxqvf6pSZl/yEVgDoSmWzRex/TP57XIzJ4vQViDHFNzN2pbxjVwLqsd0qGopDkv8Ib+R8hXondLSoquW3QwLQl+Oxos734UicLe5zH64q5HsKMH1aQMNF8Vid/Hz/nQNVNe1Ofsh3v6IFqbB6jJ5rYnyNuAGjReV8vVXG4TAR1+/U3XuhKLfduDLXRoq3o2ZgM9sSmiyalapPaOxwZybImugP9wqdKtq1yu29+LLgN4k/KLtNzXr43aFpuFx0ux34QsT8VdGu7z/0Dzx9+SSHmHZ4AAAAAElFTkSuQmCC\"","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { InputNumber, Space } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst Container = styled.div`\n position: absolute;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 7; // must be less than other panels\n`;\n\nconst ColumnWrapper = styled.div`\n background: #282c34;\n position: absolute;\n top: 0;\n left: calc(100vw / 2 - 100px);\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: 200px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n`;\n\nconst VisualizationControlPanel = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const showSiteInfoPanel = useStore(Selector.viewState.showSiteInfoPanel);\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\n\n const lang = { lng: language };\n\n return (\n \n \n \n {i18n.t('visualizationControlPanel.ColorContrast', lang) + ':'}\n {\n setCommonStore((state) => {\n state.viewState.solarRadiationHeatMapMaxValue = value;\n });\n }}\n />\n {showHeatFluxes && (\n <>\n {i18n.t('visualizationControlPanel.FluxScale', lang) + ':'}\n {\n setCommonStore((state) => {\n state.viewState.heatFluxScaleFactor = value;\n });\n }}\n />\n \n )}\n \n \n \n );\n};\n\nexport default React.memo(VisualizationControlPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space, Table } from 'antd';\nimport { ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport { screenshot, showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { HumanData } from '../HumanData';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { Z_INDEX_FRONT_PANEL } from '../constants';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 90px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 8;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst VisibilityResultsPanel = () => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const panelRect = useStore(Selector.viewState.visibilityResultsPanelRect);\n const solarPanelVisibilityResults = useDataStore(Selector.solarPanelVisibilityResults);\n const countObservers = useStore(Selector.countObservers);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 570;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [resultArray, setResultArray] = useState([]);\n\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.visibilityResultsPanelRect) {\n state.viewState.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\n }\n state.viewState.visibilityResultsPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.visibilityResultsPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (solarPanelVisibilityResults) {\n const arr: any[] = [];\n solarPanelVisibilityResults.forEach((result, vantage) => {\n let total = 0;\n let fieldString = '';\n let count = 0;\n result.forEach((visibility, field) => {\n count++;\n total += visibility;\n fieldString += visibility.toFixed(2) + ', ';\n });\n arr.push({\n key: vantage.observer.id,\n observer: HumanData.fetchLabel(vantage.observer.name, lang),\n vantage:\n '(' +\n vantage.position.x.toFixed(1) +\n ', ' +\n vantage.position.y.toFixed(1) +\n ', ' +\n vantage.position.z.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang),\n total: total.toFixed(2),\n itemized: count > 1 ? fieldString.substring(0, fieldString.length - 2) : '---',\n });\n });\n setResultArray(arr);\n }\n }, [solarPanelVisibilityResults, language]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.visibilityResultsPanelRect) {\n state.viewState.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\n }\n state.viewState.visibilityResultsPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.visibilityResultsPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showSolarPanelVisibilityResultsPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Visibility Results Panel',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'visibilityResultsPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('visibilityPanel.SolarPanelVisibility', lang) + ' — ' + moment(now).format('h:mm A MM/DD')}\n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n \n \n \n \n\n \n }\n title={i18n.t('word.Update', lang)}\n onClick={() => {\n const observerCount = countObservers();\n if (observerCount === 0) {\n showInfo(i18n.t('analysisManager.NoObserverForVisibilityAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runSolarPanelVisibilityAnalysis = true;\n });\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Visibility Analysis For Solar Panels',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('visibility-results-table', 'visibility-results', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n });\n }}\n />\n \n \n \n \n );\n};\n\nexport default React.memo(VisibilityResultsPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyParabolicTroughYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyParabolicTroughYieldPanel = ({ city }: YearlyParabolicTroughYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.cspDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyParabolicTroughYield);\n const individualOutputs = useStore(Selector.yearlyParabolicTroughIndividualOutputs);\n const parabolicTroughLabels = useDataStore(Selector.parabolicTroughLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyParabolicTroughYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const troughSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n troughSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n troughSumRef.current.set(prop, (troughSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyParabolicTroughYieldPanelRect) {\n state.viewState.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyParabolicTroughYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyParabolicTroughYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyParabolicTroughYieldPanelRect) {\n state.viewState.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyParabolicTroughYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyParabolicTroughYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyParabolicTroughYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Parabolic Trough Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const parabolicTroughCount = countElementsByType(ObjectType.ParabolicTrough);\n useEffect(() => {\n if (parabolicTroughCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyParabolicTroughIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parabolicTroughCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('parabolicTroughYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyParabolicTroughYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('parabolicTroughYieldPanel.ParabolicTroughYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={parabolicTroughLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && parabolicTroughCount > 1 && troughSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === troughSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('parabolicTroughYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n {parabolicTroughCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (parabolicTroughCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyParabolicTroughIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Parabolic Troughs: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicTroughs = true;\n state.pauseYearlySimulationForParabolicTroughs = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (parabolicTroughCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Parabolic Troughs',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicTroughs = true;\n state.pauseYearlySimulationForParabolicTroughs = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-parabolic-trough-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Parabolic Trough Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-parabolic-trough-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Parabolic Trough Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyParabolicTroughYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyParabolicTroughYieldPanelProps {\n city: string | null;\n}\n\nconst DailyParabolicTroughYieldPanel = ({ city }: DailyParabolicTroughYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyParabolicTroughYield);\n const individualOutputs = useStore(Selector.dailyParabolicTroughIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyParabolicTroughYieldPanelRect);\n const parabolicTroughLabels = useDataStore(Selector.parabolicTroughLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const troughSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n troughSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n troughSumRef.current.set(prop, (troughSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyParabolicTroughYieldPanelRect) {\n state.viewState.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyParabolicTroughYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyParabolicTroughYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyParabolicTroughYieldPanelRect) {\n state.viewState.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyParabolicTroughYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyParabolicTroughYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyParabolicTroughYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Parabolic Trough Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const parabolicTroughCount = countElementsByType(ObjectType.ParabolicTrough);\n useEffect(() => {\n if (parabolicTroughCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyParabolicTroughIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parabolicTroughCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('parabolicTroughYieldPanel.YieldPerHour', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyParabolicTroughYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('parabolicTroughYieldPanel.ParabolicTroughDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && parabolicTroughCount > 1 && troughSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === troughSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('parabolicTroughYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n {parabolicTroughCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (parabolicTroughCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyParabolicTroughIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Parabolic Troughs: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicTroughs = true;\n state.pauseDailySimulationForParabolicTroughs = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (parabolicTroughCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Parabolic Troughs',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicTroughs = true;\n state.pauseDailySimulationForParabolicTroughs = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-parabolic-trough-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Parabolic Trough Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-parabolic-trough-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Parabolic Trough Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyParabolicTroughYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyParabolicDishYieldPanelProps {\n city: string | null;\n}\n\nconst DailyParabolicDishYieldPanel = ({ city }: DailyParabolicDishYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyParabolicDishYield);\n const individualOutputs = useStore(Selector.dailyParabolicDishIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyParabolicDishYieldPanelRect);\n const parabolicDishLabels = useDataStore(Selector.parabolicDishLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const dishSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n dishSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n dishSumRef.current.set(prop, (dishSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyParabolicDishYieldPanelRect) {\n state.viewState.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyParabolicDishYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyParabolicDishYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyParabolicDishYieldPanelRect) {\n state.viewState.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyParabolicDishYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyParabolicDishYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyParabolicDishYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Parabolic Dish Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const parabolicDishCount = countElementsByType(ObjectType.ParabolicDish);\n useEffect(() => {\n if (parabolicDishCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyParabolicDishIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parabolicDishCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('parabolicDishYieldPanel.YieldPerHour', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyParabolicDishYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('parabolicDishYieldPanel.ParabolicDishDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && parabolicDishCount > 1 && dishSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === dishSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('parabolicDishYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n {parabolicDishCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (parabolicDishCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyParabolicDishIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Parabolic Dishes: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicDishes = true;\n state.pauseDailySimulationForParabolicDishes = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (parabolicDishCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Parabolic Dishes',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicDishes = true;\n state.pauseDailySimulationForParabolicDishes = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-parabolic-dish-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Parabolic Dish Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-parabolic-dish-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Parabolic Dish Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyParabolicDishYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyParabolicDishYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyParabolicDishYieldPanel = ({ city }: YearlyParabolicDishYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.cspDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyParabolicDishYield);\n const individualOutputs = useStore(Selector.yearlyParabolicDishIndividualOutputs);\n const parabolicDishLabels = useDataStore(Selector.parabolicDishLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyParabolicDishYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const dishSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n dishSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n dishSumRef.current.set(prop, (dishSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyParabolicDishYieldPanelRect) {\n state.viewState.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyParabolicDishYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyParabolicDishYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyParabolicDishYieldPanelRect) {\n state.viewState.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyParabolicDishYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyParabolicDishYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyParabolicDishYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Parabolic Dish Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const parabolicDishCount = countElementsByType(ObjectType.ParabolicDish);\n useEffect(() => {\n if (parabolicDishCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyParabolicDishIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parabolicDishCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('parabolicDishYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyParabolicDishYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('parabolicDishYieldPanel.ParabolicDishYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={parabolicDishLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && parabolicDishCount > 1 && dishSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === dishSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('parabolicDishYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n {parabolicDishCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (parabolicDishCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyParabolicDishIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Parabolic Dishes: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicDishes = true;\n state.pauseYearlySimulationForParabolicDishes = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (parabolicDishCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Parabolic Dishes',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicDishes = true;\n state.pauseYearlySimulationForParabolicDishes = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-parabolic-dish-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Parabolic Dish Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-parabolic-dish-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Parabolic Dish Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyParabolicDishYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyFresnelReflectorYieldPanelProps {\n city: string | null;\n}\n\nconst DailyFresnelReflectorYieldPanel = ({ city }: DailyFresnelReflectorYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyFresnelReflectorYield);\n const individualOutputs = useStore(Selector.dailyFresnelReflectorIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyFresnelReflectorYieldPanelRect);\n const fresnelReflectorLabels = useDataStore(Selector.fresnelReflectorLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const reflectorSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n reflectorSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n reflectorSumRef.current.set(prop, (reflectorSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyFresnelReflectorYieldPanelRect) {\n state.viewState.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyFresnelReflectorYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyFresnelReflectorYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyFresnelReflectorYieldPanelRect) {\n state.viewState.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyFresnelReflectorYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyFresnelReflectorYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyFresnelReflectorYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Fresnel Reflector Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const fresnelReflectorCount = countElementsByType(ObjectType.FresnelReflector);\n useEffect(() => {\n if (fresnelReflectorCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyFresnelReflectorIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fresnelReflectorCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('fresnelReflectorYieldPanel.YieldPerHour', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyFresnelReflectorYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('fresnelReflectorYieldPanel.FresnelReflectorDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && fresnelReflectorCount > 1 && reflectorSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === reflectorSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('fresnelReflectorYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n {fresnelReflectorCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (fresnelReflectorCount === 0) {\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyFresnelReflectorIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Fresnel Reflectors: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForFresnelReflectors = true;\n state.pauseDailySimulationForFresnelReflectors = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (fresnelReflectorCount === 0) {\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Fresnel Reflectors',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForFresnelReflectors = true;\n state.pauseDailySimulationForFresnelReflectors = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-fresnel-reflector-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Fresnel Reflector Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-fresnel-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Fresnel Reflector Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyFresnelReflectorYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyFresnelReflectorYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyFresnelReflectorYieldPanel = ({ city }: YearlyFresnelReflectorYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.cspDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyFresnelReflectorYield);\n const individualOutputs = useStore(Selector.yearlyFresnelReflectorIndividualOutputs);\n const fresnelReflectorLabels = useDataStore(Selector.fresnelReflectorLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyFresnelReflectorYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const reflectorSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n reflectorSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n reflectorSumRef.current.set(prop, (reflectorSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyFresnelReflectorYieldPanelRect) {\n state.viewState.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyFresnelReflectorYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyFresnelReflectorYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyFresnelReflectorYieldPanelRect) {\n state.viewState.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyFresnelReflectorYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyFresnelReflectorYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyFresnelReflectorYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Fresnel Reflector Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const fresnelReflectorCount = countElementsByType(ObjectType.FresnelReflector);\n useEffect(() => {\n if (fresnelReflectorCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyFresnelReflectorIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fresnelReflectorCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('fresnelReflectorYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyFresnelReflectorYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('fresnelReflectorYieldPanel.FresnelReflectorYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={fresnelReflectorLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && fresnelReflectorCount > 1 && reflectorSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === reflectorSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('fresnelReflectorYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n {fresnelReflectorCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (fresnelReflectorCount === 0) {\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyFresnelReflectorIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Fresnel Reflectors: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForFresnelReflectors = true;\n state.pauseYearlySimulationForFresnelReflectors = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (fresnelReflectorCount === 0) {\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Fresnel Reflectors',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForFresnelReflectors = true;\n state.pauseYearlySimulationForFresnelReflectors = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-fresnel-reflector-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Fresnel Reflector Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-fresnel-reflector-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Fresnel Reflector Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyFresnelReflectorYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyHeliostatYieldPanelProps {\n city: string | null;\n}\n\nconst DailyHeliostatYieldPanel = ({ city }: DailyHeliostatYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyHeliostatYield);\n const individualOutputs = useStore(Selector.dailyHeliostatIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyHeliostatYieldPanelRect);\n const heliostatLabels = useDataStore(Selector.heliostatLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const heliostatSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n heliostatSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n heliostatSumRef.current.set(prop, (heliostatSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyHeliostatYieldPanelRect) {\n state.viewState.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyHeliostatYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyHeliostatYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyHeliostatYieldPanelRect) {\n state.viewState.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyHeliostatYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyHeliostatYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyHeliostatYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Heliostat Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const heliostatCount = countElementsByType(ObjectType.Heliostat);\n useEffect(() => {\n if (heliostatCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyHeliostatIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [heliostatCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('heliostatYieldPanel.YieldPerHour', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyHeliostatYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('heliostatYieldPanel.HeliostatDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && heliostatCount > 1 && heliostatSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === heliostatSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('heliostatYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n {heliostatCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (heliostatCount === 0) {\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyHeliostatIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Heliostats: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForHeliostats = true;\n state.pauseDailySimulationForHeliostats = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (heliostatCount === 0) {\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Heliostats',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForHeliostats = true;\n state.pauseDailySimulationForHeliostats = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-heliostat-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Heliostat Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-heliostat-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Heliostat Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyHeliostatYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyHeliostatYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyHeliostatYieldPanel = ({ city }: YearlyHeliostatYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.cspDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyHeliostatYield);\n const individualOutputs = useStore(Selector.yearlyHeliostatIndividualOutputs);\n const heliostatLabels = useDataStore(Selector.heliostatLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyHeliostatYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const heliostatSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n heliostatSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n heliostatSumRef.current.set(prop, (heliostatSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyHeliostatYieldPanelRect) {\n state.viewState.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyHeliostatYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyHeliostatYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyHeliostatYieldPanelRect) {\n state.viewState.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyHeliostatYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyHeliostatYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyHeliostatYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Heliostat Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const heliostatCount = countElementsByType(ObjectType.Heliostat);\n useEffect(() => {\n if (heliostatCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyHeliostatIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [heliostatCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('heliostatYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyHeliostatYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('heliostatYieldPanel.HeliostatYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={heliostatLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && heliostatCount > 1 && heliostatSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === heliostatSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('heliostatYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n {heliostatCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (heliostatCount === 0) {\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyHeliostatIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Heliostats: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForHeliostats = true;\n state.pauseYearlySimulationForHeliostats = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (heliostatCount === 0) {\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Heliostats',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForHeliostats = true;\n state.pauseYearlySimulationForHeliostats = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-heliostat-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Heliostat Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-heliostat-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Heliostat Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyHeliostatYieldPanel);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n CartesianGrid,\n Label,\n Legend,\n Line,\n LineChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { createSymbol, SYMBOLS } from './symbols';\nimport { PRESET_COLORS } from '../constants';\nimport { DatumEntry } from '../types';\nimport { CurveType } from 'recharts/types/shape/Curve';\n\nexport interface SutBiaxialLineGraphProps {\n dataSource: DatumEntry[];\n height: number;\n dataKeyAxisX?: string;\n labelX?: string;\n labelY1?: string;\n labelY2?: string;\n unitX?: string;\n unitY1?: string;\n unitY2?: string;\n yMin1?: string | number;\n yMax1?: string | number;\n yMin2?: string | number;\n yMax2?: string | number;\n curveType?: CurveType;\n referenceX?: number | string;\n fractionDigits?: number;\n symbolCount?: number;\n}\n\nconst SutBiaxialLineGraph = ({\n dataSource,\n height,\n dataKeyAxisX,\n labelX,\n labelY1,\n labelY2,\n unitX,\n unitY1,\n unitY2,\n yMin1 = 'auto',\n yMax1 = 'auto',\n yMin2 = 'auto',\n yMax2 = 'auto',\n curveType = 'linear',\n referenceX,\n fractionDigits = 2,\n symbolCount = 12,\n}: SutBiaxialLineGraphProps) => {\n const [lineCount, setLineCount] = useState(0);\n const [legendDataKey, setLegendDataKey] = useState(null);\n const horizontalGridLines = true;\n const verticalGridLines = true;\n const lineWidth = 2;\n const symbolSize = 1;\n\n //init\n useEffect(() => {\n if (!dataSource || dataSource.length === 0) {\n return;\n }\n let len = Array.isArray(dataSource) ? Object.keys(dataSource[0]).length - 1 : Object.keys(dataSource).length - 1;\n len--; // subtract one because the first one is the ambient temperature, which is shared among SUTs\n if (lineCount !== len / 2) {\n setLineCount(len / 2);\n }\n }, [dataSource]);\n\n const getLines = useMemo(() => {\n const lines = [];\n let defaultSymbol;\n lines.push(\n ,\n );\n for (let i = 0; i < lineCount; i++) {\n let name = 'T_Tower' + (i + 1);\n let opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n let symbol = createSymbol(SYMBOLS[2 * i], symbolSize, symbolCount, opacity);\n if (i === 0) defaultSymbol = symbol;\n const isMeasured = name.startsWith('Measured');\n lines.push(\n 0 ? (symbol ? symbol : defaultSymbol) : false}\n isAnimationActive={false}\n />,\n );\n name = 'V_Tower' + (i + 1);\n opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n symbol = createSymbol(SYMBOLS[2 * i + 1], symbolSize, symbolCount, opacity);\n lines.push(\n 0 ? (symbol ? symbol : defaultSymbol) : false}\n isAnimationActive={false}\n />,\n );\n }\n return lines;\n }, [curveType, lineCount, lineWidth, symbolCount, symbolSize, legendDataKey]);\n\n // @ts-ignore\n const onMouseDown = () => {};\n\n // @ts-ignore\n const onMouseEnterLegend = (o) => {\n setLegendDataKey(o.dataKey);\n };\n\n // @ts-ignore\n const onMouseLeaveLegend = () => {\n setLegendDataKey(null);\n };\n\n return (\n <>\n {dataSource && (\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\n \n \n \n \n value.toFixed(fractionDigits)} />\n \n \n \n \n \n \n \n \n \n \n {getLines}\n {lineCount > 1 && (\n \n )}\n \n \n \n \n )}\n \n );\n};\n\nexport default SutBiaxialLineGraph;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, SolarStructure } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport SutBiaxialLineGraph from '../components/sutBiaxialLineGraph';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailySolarUpdraftTowerYieldPanelProps {\n city: string | null;\n}\n\nconst DailySolarUpdraftTowerYieldPanel = ({ city }: DailySolarUpdraftTowerYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countSolarStructuresByType = useStore(Selector.countSolarStructuresByType);\n const dailyYield = useDataStore(Selector.dailyUpdraftTowerYield);\n const dailyResults = useDataStore(Selector.dailyUpdraftTowerResults);\n const individualOutputs = useStore(Selector.dailyUpdraftTowerIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyUpdraftTowerYieldPanelRect);\n const updraftTowerLabels = useDataStore(Selector.updraftTowerLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 650;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const towerSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n towerSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n towerSumRef.current.set(prop, (towerSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyUpdraftTowerYieldPanelRect) {\n state.viewState.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\n }\n state.viewState.dailyUpdraftTowerYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyUpdraftTowerYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyUpdraftTowerYieldPanelRect) {\n state.viewState.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\n }\n state.viewState.dailyUpdraftTowerYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyUpdraftTowerYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyUpdraftTowerYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Updraft Tower Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const towerCount = countSolarStructuresByType(SolarStructure.UpdraftTower);\n useEffect(() => {\n if (towerCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyUpdraftTowerIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [towerCount, individualOutputs]);\n\n const labelHour = i18n.t('word.Hour', lang);\n const labelYield = i18n.t('updraftTowerYieldPanel.YieldPerHour', lang);\n const labelTemperature = i18n.t('updraftTowerYieldPanel.ChimneyAirTemperature', lang);\n const labelSpeed = i18n.t('updraftTowerYieldPanel.ChimneyWindSpeed', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailySolarUpdraftTowerYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('updraftTowerYieldPanel.UpdraftTowerDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n {!simulationInProgress && (\n \n {towerCount > 1 && towerSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === towerSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('updraftTowerYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (towerCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarUpdraftTowerForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Solar Updraft Tower',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForUpdraftTower = true;\n state.pauseDailySimulationForUpdraftTower = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelHour + '-' + labelYield, 'daily-updraft-tower-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Updraft Tower Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-updraft-tower-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Updraft Tower Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailySolarUpdraftTowerYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport { ChartType, DiurnalTemperatureModel, GraphDataType } from '../types';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { Util } from '../Util';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport i18n from '../i18n/i18n';\nimport {\n getGroundTemperatureAtMinute,\n computeOutsideTemperature,\n getOutsideTemperatureAtMinute,\n} from '../analysis/heatTools';\nimport { computeSunriseAndSunsetInMinutes } from '../analysis/sunTools';\nimport dayjs from 'dayjs';\nimport { Radio, Space } from 'antd';\nimport { Rectangle } from '../models/Rectangle';\nimport { DEFAULT_FOUNDATION_SLAB_DEPTH, FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { Undoable } from '../undo/Undoable';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DiurnalTemperaturePanelProps {\n city: string | null;\n}\n\nconst DiurnalTemperaturePanel = ({ city }: DiurnalTemperaturePanelProps) => {\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const latitude = useStore(Selector.world.latitude);\n const ground = useStore(Selector.world.ground);\n const diurnalTemperatureModel =\n useStore(Selector.world.diurnalTemperatureModel) ?? DiurnalTemperatureModel.Sinusoidal;\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n const getWeather = useStore(Selector.getWeather);\n const panelRect = useStore(Selector.viewState.diurnalTemperaturePanelRect);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.min(panelRect.x, window.innerWidth - wOffset) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [selectedModel, setSelectedModel] = useState(diurnalTemperatureModel);\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.diurnalTemperaturePanelRect) {\n state.viewState.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.diurnalTemperaturePanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.diurnalTemperaturePanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const getData = useMemo(() => {\n const result = [];\n if (city) {\n const weather = getWeather(city);\n if (weather) {\n const sunMinutes = computeSunriseAndSunsetInMinutes(now, latitude);\n for (let i = 0; i < 24; i++) {\n now.setHours(i);\n const t = computeOutsideTemperature(now, weather.lowestTemperatures, weather.highestTemperatures);\n const m = Util.minutesIntoDay(now);\n result.push({\n Hour: i,\n Sinusoidal: getOutsideTemperatureAtMinute(\n t.high,\n t.low,\n DiurnalTemperatureModel.Sinusoidal,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n m,\n ),\n PartonLogan: getOutsideTemperatureAtMinute(\n t.high,\n t.low,\n DiurnalTemperatureModel.PartonLogan,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n m,\n ),\n Ground: getGroundTemperatureAtMinute(\n latitude,\n Util.dayOfYear(now),\n m,\n weather.lowestTemperatures,\n weather.highestTemperatures,\n highestTemperatureTimeInMinutes,\n 0.5 * (t.high - t.low),\n ground.thermalDiffusivity ?? 0.05,\n DEFAULT_FOUNDATION_SLAB_DEPTH,\n ),\n });\n }\n }\n }\n return result;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [city, highestTemperatureTimeInMinutes, diurnalTemperatureModel, now.getMonth(), now.getDate()]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.min(ui.x, window.innerWidth - wOffset),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.diurnalTemperaturePanelRect) {\n state.viewState.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.diurnalTemperaturePanelRect.x = Math.min(ui.x, window.innerWidth - wOffset);\n state.viewState.diurnalTemperaturePanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Diurnal Temperature Panel',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showDiurnalTemperaturePanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showDiurnalTemperaturePanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showDiurnalTemperaturePanel = false;\n });\n };\n\n const onChangeModel = (e: any) => {\n const oldModel = selectedModel;\n const newModel = e.target.value;\n const undoableChange = {\n name: 'Change Diurnal Temperature Model',\n timestamp: Date.now(),\n oldValue: oldModel,\n newValue: newModel,\n undo: () => {\n setSelectedModel(undoableChange.oldValue as DiurnalTemperatureModel);\n setCommonStore((state) => {\n state.world.diurnalTemperatureModel = undoableChange.oldValue as DiurnalTemperatureModel;\n });\n },\n redo: () => {\n setSelectedModel(undoableChange.newValue as DiurnalTemperatureModel);\n setCommonStore((state) => {\n state.world.diurnalTemperatureModel = undoableChange.newValue as DiurnalTemperatureModel;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setSelectedModel(newModel);\n setCommonStore((state) => {\n state.world.diurnalTemperatureModel = newModel;\n });\n };\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'diurnalTemperaturePanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('menu.settings.DiurnalTemperature', lang) + ': ' + city + ' | ' + dayjs(now).format('MM/DD')}\n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n {i18n.t('diurnalTemperaturePanel.SelectAirTemperatureModel', lang)}\n \n \n {i18n.t('diurnalTemperaturePanel.Sinusoidal', lang)}\n \n Parton-Logan\n \n \n \n \n \n );\n};\n\nexport default React.memo(DiurnalTemperaturePanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, SolarStructure } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlySolarUpdraftTowerYieldPanelProps {\n city: string | null;\n}\n\nconst YearlySolarUpdraftTowerYieldPanel = ({ city }: YearlySolarUpdraftTowerYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.sutDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyUpdraftTowerYield);\n const individualOutputs = useStore(Selector.yearlyUpdraftTowerIndividualOutputs);\n const labels = useDataStore(Selector.updraftTowerLabels);\n const countSolarStructuresByType = useStore(Selector.countSolarStructuresByType);\n const panelRect = useStore(Selector.viewState.yearlyUpdraftTowerYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const towerSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n towerSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n towerSumRef.current.set(prop, (towerSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyUpdraftTowerYieldPanelRect) {\n state.viewState.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyUpdraftTowerYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyUpdraftTowerYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyUpdraftTowerYieldPanelRect) {\n state.viewState.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyUpdraftTowerYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyUpdraftTowerYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyUpdraftTowerYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Updraft Tower Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const towerCount = countSolarStructuresByType(SolarStructure.UpdraftTower);\n useEffect(() => {\n if (towerCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyUpdraftTowerIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [towerCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('updraftTowerYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlySolarUpdraftTowerYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('updraftTowerYieldPanel.UpdraftTowerYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={labels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {towerCount > 1 && towerSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === towerSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('updraftTowerYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (towerCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarUpdraftTowerForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Solar Updraft Tower',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runYearlySimulationForUpdraftTower = true;\n state.pauseYearlySimulationForUpdraftTower = false;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-updraft-tower-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Updraft Tower Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-updraft-tower-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Updraft Tower Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlySolarUpdraftTowerYieldPanel);\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport {\r\n CartesianGrid,\r\n Label,\r\n Legend,\r\n Line,\r\n LineChart,\r\n ReferenceLine,\r\n ResponsiveContainer,\r\n Tooltip,\r\n XAxis,\r\n YAxis,\r\n} from 'recharts';\r\nimport { createSymbol, SYMBOLS } from './symbols';\r\nimport { PRESET_COLORS } from '../constants';\r\nimport { DatumEntry } from '../types';\r\nimport { CurveType } from 'recharts/types/shape/Curve';\r\nimport { Util } from '../Util';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\n\r\nexport interface GaBiaxialLineGraphProps {\r\n dataSource: DatumEntry[];\r\n labels?: (string | undefined)[];\r\n height: number;\r\n dataKeyAxisX?: string;\r\n labelX?: string;\r\n labelY1?: string;\r\n labelY2?: string;\r\n unitX?: string;\r\n unitY1?: string;\r\n unitY2?: string;\r\n yMin1?: string | number;\r\n yMax1?: string | number;\r\n yMin2?: string | number;\r\n yMax2?: string | number;\r\n curveType?: CurveType;\r\n referenceX?: number | string;\r\n fractionDigits?: number;\r\n}\r\n\r\nconst EvolutionBiaxialLineGraph = ({\r\n dataSource,\r\n labels,\r\n height,\r\n dataKeyAxisX,\r\n labelX,\r\n labelY1,\r\n labelY2,\r\n unitX,\r\n unitY1,\r\n unitY2,\r\n yMin1 = 'auto',\r\n yMax1 = 'auto',\r\n yMin2 = 'auto',\r\n yMax2 = 'auto',\r\n curveType = 'linear',\r\n referenceX,\r\n fractionDigits = 2,\r\n}: GaBiaxialLineGraphProps) => {\r\n const constraints = useStore(Selector.solarPanelArrayLayoutConstraints);\r\n const [legendDataKey, setLegendDataKey] = useState(null);\r\n const horizontalGridLines = true;\r\n const verticalGridLines = true;\r\n const lineWidth = 2;\r\n const symbolSize = 1;\r\n const payloadRef = useRef([]);\r\n\r\n // data source format starts from the variables (individual genes or particle positions) of the fittest of\r\n // each generation or step, followed by the best objective and then the variables of all the individuals\r\n // or particles from each generation or step, such as:\r\n // Generation, Gene1, Gene2, ..., Objective, I1, I2, I3, ...\r\n // or\r\n // Step, Position1, Position2, ..., Objective, I1, I2, I3, ...\r\n const getLines = useMemo(() => {\r\n if (!dataSource || dataSource.length === 0) return [];\r\n // the first column is for the x-axis, the last is for the objective\r\n const fittestLineCount = Object.keys(dataSource[0]).length - 1;\r\n const totalLineCount = dataSource[1] ? Object.keys(dataSource[1]).length - 1 : fittestLineCount;\r\n const symbolCount = dataSource.length;\r\n const lines = [];\r\n const lastFittestLineIndex = fittestLineCount - 1;\r\n const individualCount = (totalLineCount - fittestLineCount) / lastFittestLineIndex;\r\n let defaultSymbol;\r\n payloadRef.current.length = 0;\r\n for (let i = 0; i < totalLineCount; i++) {\r\n if (i < lastFittestLineIndex) {\r\n const name = labels && labels[i] && labels[i] !== '' ? labels[i] : 'Var' + (i + 1);\r\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\r\n const symbol = createSymbol(SYMBOLS[i], symbolSize, symbolCount, opacity);\r\n if (i === 0) defaultSymbol = symbol;\r\n lines.push(\r\n 0 ? (symbol ? symbol : defaultSymbol) : false}\r\n isAnimationActive={false}\r\n />,\r\n );\r\n payloadRef.current.push({ id: name, type: 'line', value: name, color: PRESET_COLORS[i] });\r\n } else if (i === lastFittestLineIndex) {\r\n const name = 'Objective';\r\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\r\n const symbol = createSymbol(SYMBOLS[i], symbolSize, symbolCount, opacity);\r\n lines.push(\r\n 0 ? (symbol ? symbol : defaultSymbol) : false}\r\n isAnimationActive={false}\r\n />,\r\n );\r\n payloadRef.current.push({ id: name, type: 'line', value: name, color: PRESET_COLORS[lastFittestLineIndex] });\r\n } else {\r\n const varIndex = Math.floor((i - fittestLineCount) / individualCount);\r\n const name = 'Individual' + (i + 1);\r\n const opacity = 0.5;\r\n const symbol = createSymbol(SYMBOLS[varIndex], symbolSize * 0.5, symbolCount, opacity, PRESET_COLORS[varIndex]);\r\n lines.push(\r\n ,\r\n );\r\n }\r\n }\r\n return lines;\r\n }, [dataSource, curveType, lineWidth, symbolSize, legendDataKey]);\r\n\r\n // @ts-ignore\r\n const onMouseDown = () => {};\r\n\r\n // @ts-ignore\r\n const onMouseEnterLegend = (o) => {\r\n setLegendDataKey(o.id);\r\n };\r\n\r\n // @ts-ignore\r\n const onMouseLeaveLegend = () => {\r\n setLegendDataKey(null);\r\n };\r\n\r\n return (\r\n <>\r\n {dataSource && (\r\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\r\n \r\n \r\n \r\n \r\n value.toFixed(fractionDigits)}\r\n content={({ active, payload }) => {\r\n if (!active || !payload) return null;\r\n return payload.map((p) => {\r\n if (!p.name?.toString().startsWith('Individual')) {\r\n let label: string;\r\n if (p.name === 'Tilt Angle') {\r\n label =\r\n Util.toDegrees(\r\n (p.value as number) * (constraints.maximumTiltAngle - constraints.minimumTiltAngle) +\r\n constraints.minimumTiltAngle,\r\n ).toFixed(fractionDigits) + '°';\r\n } else if (p.name === 'Inter-Row Spacing') {\r\n label =\r\n (\r\n (p.value as number) *\r\n (constraints.maximumInterRowSpacing - constraints.minimumInterRowSpacing) +\r\n constraints.minimumInterRowSpacing\r\n ).toFixed(fractionDigits) + 'm';\r\n } else if (p.name === 'Rack Width') {\r\n label =\r\n Math.floor(\r\n (p.value as number) * (constraints.maximumRowsPerRack - constraints.minimumRowsPerRack) +\r\n constraints.minimumRowsPerRack,\r\n ) + ' panels';\r\n } else if (p.name === 'Objective') {\r\n label = (p.value as number).toFixed(fractionDigits) + ' ' + unitY2;\r\n } else {\r\n label = (p.value as number).toFixed(fractionDigits);\r\n }\r\n return (\r\n
\r\n {p.name}: {label}\r\n
\r\n );\r\n }\r\n return null;\r\n });\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {getLines}\r\n \r\n \r\n
\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default EvolutionBiaxialLineGraph;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space } from 'antd';\nimport { screenshot, showInfo } from '../helpers';\nimport { CameraOutlined, RightCircleOutlined } from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport EvolutionBiaxialLineGraph from '../components/evolutionBiaxialLineGraph';\nimport { DesignProblem, EvolutionMethod, ObjectiveFunctionType, ObjectType } from '../types';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 8;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst SolarPanelOptimizationResult = () => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const fittestIndividualResults = useStore(Selector.fittestIndividualResults);\n const variableLabels = useStore(Selector.variableLabels);\n const panelRect = useStore(Selector.viewState.evolutionPanelRect);\n const selectedElement = useStore(Selector.selectedElement);\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const evolutionaryAlgorithmState = useStore.getState().evolutionaryAlgorithmState;\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const evolutionInProgress = usePrimitiveStore(Selector.evolutionInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the browser window (not this div window) is resized\n // (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.evolutionPanelRect) {\n state.viewState.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\n }\n state.viewState.evolutionPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.evolutionPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.evolutionPanelRect) {\n state.viewState.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\n }\n state.viewState.evolutionPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.evolutionPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Panel Optimization Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const params = useMemo(() => {\n return !evolutionMethod || evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM\n ? evolutionaryAlgorithmState.geneticAlgorithmParams\n : evolutionaryAlgorithmState.particleSwarmOptimizationParams;\n }, [evolutionMethod, evolutionaryAlgorithmState]);\n\n const labelAxisX = useMemo(() => {\n return i18n.t(\n evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM ? 'optimizationMenu.Generation' : 'optimizationMenu.Step',\n lang,\n );\n }, [evolutionMethod, lang]);\n\n const labelVariable = useMemo(() => {\n if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE) return i18n.t('solarPanelMenu.TiltAngle', lang);\n return i18n.t('optimizationMenu.NormalizedVariables', lang);\n }, [params.problem, lang]);\n\n const unitY1 = useMemo(() => {\n if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE) return '°';\n return '';\n }, [params.problem]);\n\n const unitY2 = useMemo(() => {\n if (\n params.problem === DesignProblem.SOLAR_PANEL_ARRAY &&\n (params.objectiveFunctionType === ObjectiveFunctionType.DAILY_PROFIT ||\n params.objectiveFunctionType === ObjectiveFunctionType.YEARLY_PROFIT)\n ) {\n return i18n.t('word.dollar', lang);\n }\n return i18n.t('word.kWh', lang);\n }, [params.problem, params.objectiveFunctionType, lang]);\n\n const labelObjective = useMemo(() => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_PROFIT:\n return i18n.t('optimizationMenu.ObjectiveFunctionDailyProfit', lang);\n case ObjectiveFunctionType.YEARLY_PROFIT:\n return i18n.t('optimizationMenu.ObjectiveFunctionYearlyProfit', lang);\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n return i18n.t('optimizationMenu.ObjectiveFunctionDailyMeanYield', lang);\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n return i18n.t('optimizationMenu.ObjectiveFunctionYearlyMeanYield', lang);\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n return i18n.t('optimizationMenu.ObjectiveFunctionDailyTotalYield', lang);\n }\n return i18n.t('optimizationMenu.ObjectiveFunctionYearlyTotalYield', lang);\n }, [params.objectiveFunctionType, lang]);\n\n const buttonEnabled = useMemo(() => {\n if (!selectedElement) return false;\n if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE) return selectedElement.type === ObjectType.Foundation;\n if (params.problem === DesignProblem.SOLAR_PANEL_ARRAY) return selectedElement.type === ObjectType.Polygon;\n return false;\n }, [params.problem, selectedElement]);\n\n const hint = useMemo(() => {\n if (params.problem === DesignProblem.SOLAR_PANEL_ARRAY)\n return i18n.t('optimizationMenu.ClickTargetPolygonToActivate', lang);\n return i18n.t('optimizationMenu.ClickTargetFoundationToActivate', lang);\n }, [params.problem, lang]);\n\n const title = useMemo(() => {\n let s = '';\n if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE)\n s += i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang);\n if (params.problem === DesignProblem.SOLAR_PANEL_ARRAY) s += i18n.t('optimizationMenu.SolarPanelArrayLayout', lang);\n s += ': ';\n s +=\n evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM\n ? i18n.t('optimizationMenu.GeneticAlgorithm', lang)\n : i18n.t('optimizationMenu.ParticleSwarmOptimization', lang);\n return s;\n }, [params.problem, evolutionMethod, lang]);\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n }}\n >\n \n \n
\n {title}\n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && !evolutionInProgress && (\n \n {buttonEnabled && (\n }\n title={i18n.t('word.Run', lang)}\n onClick={() => {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = true;\n state.pauseEvolution = false;\n state.evolutionInProgress = true;\n });\n if (loggable) {\n setCommonStore((state) => {\n let representationName;\n if (params.problem === DesignProblem.SOLAR_PANEL_ARRAY) {\n if (evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM) {\n representationName = 'Run Genetic Algorithm for Solar Panel Array Layout';\n } else if (evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) {\n representationName = 'Run Particle Swarm Optimization for Solar Panel Array Layout';\n }\n } else if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE) {\n if (evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM) {\n representationName = 'Run Genetic Algorithm for Solar Panel Tilt Angle';\n } else if (evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) {\n representationName = 'Run Particle Swarm Optimization for Solar Panel Tilt Angle';\n }\n }\n if (representationName) {\n state.actionInfo = { name: representationName, timestamp: new Date().getTime() };\n }\n });\n }\n }, 100);\n }}\n />\n )}\n {!buttonEnabled && {hint}}\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot(\n 'biaxial-line-graph-' + labelAxisX + '-' + labelVariable + '-' + labelObjective,\n 'solar-panel-tilt-angle-evolution',\n {},\n ).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n });\n }}\n />\n \n )}\n \n \n \n );\n};\n\nexport default React.memo(SolarPanelOptimizationResult);\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Row } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport i18n from '../i18n/i18n';\r\nimport { UndoableChange } from '../undo/UndoableChange';\r\n\r\nconst EconomicsPanel = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const economicsParams = useStore(Selector.economicsParams);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n const okButtonRef = useRef(null);\r\n const electricitySellingPriceRef = useRef(economicsParams.electricitySellingPrice);\r\n const operationalCostPerUnitRef = useRef(economicsParams.operationalCostPerUnit);\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n okButtonRef.current?.focus();\r\n }, []);\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const apply = () => {\r\n const oldPrice = economicsParams.electricitySellingPrice;\r\n const newPrice = electricitySellingPriceRef.current;\r\n if (oldPrice !== newPrice) {\r\n const undoableChange = {\r\n name: 'Electricity Selling Price',\r\n timestamp: Date.now(),\r\n oldValue: oldPrice,\r\n newValue: newPrice,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.economicsParams.electricitySellingPrice = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.economicsParams.electricitySellingPrice = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.economicsParams.electricitySellingPrice = newPrice;\r\n });\r\n }\r\n\r\n const oldCost = economicsParams.operationalCostPerUnit;\r\n const newCost = operationalCostPerUnitRef.current;\r\n if (oldCost !== newCost) {\r\n const undoableChange = {\r\n name: 'Operational Cost per Unit',\r\n timestamp: Date.now(),\r\n oldValue: oldCost,\r\n newValue: newCost,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.economicsParams.operationalCostPerUnit = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.economicsParams.operationalCostPerUnit = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.economicsParams.operationalCostPerUnit = newCost;\r\n });\r\n }\r\n };\r\n\r\n const onCancelClick = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const onOkClick = () => {\r\n apply();\r\n setDialogVisible(false);\r\n };\r\n\r\n return (\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('economicsPanel.EconomicsParameters', lang)}\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={() => {\r\n setDialogVisible(false);\r\n }}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n {i18n.t('economicsPanel.ElectricitySellingPrice', lang) + ' ([0.1, 1]): '}\r\n \r\n \r\n `$${value}/kWh`}\r\n onChange={(value) => {\r\n electricitySellingPriceRef.current = value;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onBlur={(e) => {\r\n const value = (e.target as HTMLInputElement).value.replace('$', '').replace('/kWh', '');\r\n const v = parseFloat(value);\r\n electricitySellingPriceRef.current = Number.isNaN(v) ? 0.1 : v;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onPressEnter={(e) => {\r\n const value = (e.target as HTMLInputElement).value.replace('$', '').replace('/kWh', '');\r\n const v = parseFloat(value);\r\n electricitySellingPriceRef.current = Number.isNaN(v) ? 0.1 : v;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n />\r\n \r\n \r\n\r\n \r\n \r\n {i18n.t('economicsPanel.OperationalCostPerUnit', lang) + ' ([0.1, 1]): '}\r\n \r\n \r\n `$${value}/day`}\r\n onChange={(value) => {\r\n operationalCostPerUnitRef.current = value;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onBlur={(e) => {\r\n const value = (e.target as HTMLInputElement).value.replace('$', '').replace('/day', '');\r\n const v = parseFloat(value);\r\n operationalCostPerUnitRef.current = Number.isNaN(v) ? 0.1 : v;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onPressEnter={(e) => {\r\n const value = (e.target as HTMLInputElement).value.replace('$', '').replace('/day', '');\r\n const v = parseFloat(value);\r\n operationalCostPerUnitRef.current = Number.isNaN(v) ? 0.1 : v;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(EconomicsPanel);\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { adjustEnergyUsage, computeOutsideTemperature } from './heatTools';\nimport { BuildingCompletionStatus, DatumEntry, EnergyUsage, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { WeatherModel } from '../models/WeatherModel';\nimport { useEffect, useRef } from 'react';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport const useDailyEnergySorter = (now: Date, weather: WeatherModel, hasSolarPanels: boolean) => {\n const elements = useStore.getState().elements;\n const getFoundation = useStore(Selector.getFoundation);\n const getElementById = useStore(Selector.getElementById);\n const flagOfDailySimulation = usePrimitiveStore(Selector.flagOfDailySimulation);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n const hourlySolarHeatGainArrayMap = useDataStore(Selector.hourlySolarHeatGainArrayMap);\n const hourlySolarPanelOutputArrayMap = useDataStore(Selector.hourlySolarPanelOutputArrayMap);\n\n const sum: DatumEntry[] = [];\n const dataLabels: string[] = [];\n const sumHeaterMapRef = useRef>(new Map());\n const sumAcMapRef = useRef>(new Map());\n const sumSolarPanelMapRef = useRef>(new Map());\n\n useEffect(() => {\n // get the highest and lowest temperatures of the day from the weather data\n const outsideTemperatureRange = computeOutsideTemperature(\n now,\n weather.lowestTemperatures,\n weather.highestTemperatures,\n );\n sumHeaterMapRef.current.clear();\n sumAcMapRef.current.clear();\n sumSolarPanelMapRef.current.clear();\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n const energy = new Map();\n for (const e of elements) {\n if (Util.onBuildingEnvelope(e)) {\n const exchange = hourlyHeatExchangeArrayMap.get(e.id);\n if (exchange) {\n const f = e.type === ObjectType.Foundation ? (e as FoundationModel) : getFoundation(e);\n if (\n f &&\n !f.notBuilding &&\n Util.getBuildingCompletionStatus(f, elements) === BuildingCompletionStatus.COMPLETE\n ) {\n let energyUsage = energy.get(f.id);\n if (!energyUsage) {\n energyUsage = hasSolarPanels\n ? ({ heater: 0, ac: 0, geothermal: 0, solarPanel: 0, label: f.label?.trim() } as EnergyUsage)\n : ({ heater: 0, ac: 0, geothermal: 0, label: f.label?.trim() } as EnergyUsage);\n energy.set(f.id, energyUsage);\n if (f.hvacSystem?.id) {\n if (f.hvacSystem.id && f.hvacSystem.id.length > 0 && !dataLabels.includes(f.hvacSystem.id)) {\n dataLabels.push(f.hvacSystem.id);\n }\n } else {\n if (f.label && f.label.length > 0 && !dataLabels.includes(f.label)) {\n dataLabels.push(f.label);\n }\n }\n }\n if (e.type === ObjectType.Foundation) {\n energyUsage.geothermal += exchange[i];\n } else {\n if (exchange[i] < 0) {\n energyUsage.heater += exchange[i];\n } else {\n energyUsage.ac += exchange[i];\n }\n }\n }\n }\n }\n }\n // deal with the solar heat gain through windows and electricity generation through solar panels\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (!f.notBuilding && Util.getBuildingCompletionStatus(f, elements) !== BuildingCompletionStatus.COMPLETE)\n continue;\n const energyUsage = energy.get(e.id);\n if (energyUsage) {\n const h = hourlySolarHeatGainArrayMap.get(e.id);\n if (h) {\n if (energyUsage.heater < 0) {\n // It must be cold outside. Solar heat gain decreases heating burden in this case.\n energyUsage.heater += h[i];\n // solar heating cannot turn heater value into positive\n if (energyUsage.heater > 0) energyUsage.heater = 0;\n } else if (energyUsage.ac > 0) {\n // It must be hot outside. Solar heat gain increases cooling burden in this case.\n energyUsage.ac += h[i];\n }\n }\n if (energyUsage.solarPanel !== undefined) {\n const s = hourlySolarPanelOutputArrayMap.get(e.id);\n if (s) {\n energyUsage.solarPanel += s[i];\n }\n }\n }\n }\n }\n if (energy.size > 1) {\n let index = 1;\n for (const key of energy.keys()) {\n datum['Hour'] = i;\n const value = energy.get(key);\n if (value) {\n const elem = getElementById(key);\n if (elem && elem.type === ObjectType.Foundation) {\n const f = elem as FoundationModel;\n if (\n !f.notBuilding &&\n Util.getBuildingCompletionStatus(f, elements) === BuildingCompletionStatus.COMPLETE\n ) {\n const setpoint = f.hvacSystem?.thermostatSetpoint ?? 20;\n const threshold = f.hvacSystem?.temperatureThreshold ?? 3;\n const id = f.hvacSystem?.id ?? (value.label && value.label !== '' ? value.label : index.toString());\n if (id === index.toString()) index++;\n let adjustedHeat = Math.abs(\n adjustEnergyUsage(outsideTemperatureRange, value.heater, setpoint, threshold),\n );\n let adjustedAc = adjustEnergyUsage(outsideTemperatureRange, value.ac, setpoint, threshold);\n if (adjustedHeat > 0) {\n adjustedHeat -= value.geothermal;\n if (adjustedHeat < 0) adjustedHeat = 0;\n } else if (adjustedAc > 0) {\n adjustedAc += value.geothermal;\n if (adjustedAc < 0) adjustedAc = 0;\n }\n const heaterId = 'Heater ' + id;\n if (datum[heaterId]) {\n datum[heaterId] = (datum[heaterId] as number) + adjustedHeat;\n } else {\n datum[heaterId] = adjustedHeat;\n }\n const acId = 'AC ' + id;\n if (datum[acId]) {\n datum[acId] = (datum[acId] as number) + adjustedAc;\n } else {\n datum[acId] = adjustedAc;\n }\n if (value.solarPanel !== undefined) {\n const solarId = 'Solar ' + id;\n if (datum[solarId]) {\n datum[solarId] = (datum[solarId] as number) - value.solarPanel;\n } else {\n datum[solarId] = -value.solarPanel;\n }\n }\n const netId = 'Net ' + id;\n if (datum[netId]) {\n datum[netId] = (datum[netId] as number) + adjustedHeat + adjustedAc - (value.solarPanel ?? 0);\n } else {\n datum[netId] = adjustedHeat + adjustedAc - (value.solarPanel ?? 0);\n }\n let x = sumHeaterMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += adjustedHeat;\n sumHeaterMapRef.current.set(id, x);\n x = sumAcMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += adjustedAc;\n sumAcMapRef.current.set(id, x);\n if (hasSolarPanels) {\n x = sumSolarPanelMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += value.solarPanel;\n sumSolarPanelMapRef.current.set(id, x);\n }\n }\n }\n }\n }\n } else {\n for (const key of energy.keys()) {\n datum['Hour'] = i;\n const value = energy.get(key);\n if (value) {\n const elem = getElementById(key);\n if (elem && elem.type === ObjectType.Foundation) {\n const f = elem as FoundationModel;\n if (\n !f.notBuilding &&\n Util.getBuildingCompletionStatus(f, elements) === BuildingCompletionStatus.COMPLETE\n ) {\n const setpoint = f.hvacSystem?.thermostatSetpoint ?? 20;\n const threshold = f.hvacSystem?.temperatureThreshold ?? 3;\n let adjustedHeat = Math.abs(\n adjustEnergyUsage(outsideTemperatureRange, value.heater, setpoint, threshold),\n );\n let adjustedAc = adjustEnergyUsage(outsideTemperatureRange, value.ac, setpoint, threshold);\n if (adjustedHeat > 0) {\n adjustedHeat -= value.geothermal;\n if (adjustedHeat < 0) adjustedHeat = 0;\n } else if (adjustedAc > 0) {\n adjustedAc += value.geothermal;\n if (adjustedAc < 0) adjustedAc = 0;\n }\n datum['Heater'] = adjustedHeat;\n datum['AC'] = adjustedAc;\n if (value.solarPanel !== undefined) {\n datum['Solar'] = -value.solarPanel;\n }\n datum['Net'] = adjustedHeat + adjustedAc - (value.solarPanel ?? 0);\n const id = 'default';\n let x = sumHeaterMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += adjustedHeat;\n sumHeaterMapRef.current.set(id, x);\n x = sumAcMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += adjustedAc;\n sumAcMapRef.current.set(id, x);\n if (hasSolarPanels) {\n x = sumSolarPanelMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += value.solarPanel;\n sumSolarPanelMapRef.current.set(id, x);\n }\n }\n }\n }\n }\n }\n sum.push(datum);\n }\n }, [flagOfDailySimulation]);\n\n return {\n sum,\n sumHeaterMap: sumHeaterMapRef.current,\n sumAcMap: sumAcMapRef.current,\n sumSolarPanelMap: sumSolarPanelMapRef.current,\n dataLabels,\n };\n};\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Menu, Dropdown, Checkbox, Slider } from 'antd';\nimport { ReactComponent as MenuSVG } from '../assets/menu.svg';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\n\nconst StyledMenuSVG = styled(MenuSVG)`\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n`;\n\nexport interface BuildingEnergyGraphMenuProps {\n horizontalGrid: boolean;\n verticalGrid: boolean;\n lineWidth: number;\n symbolSize: number;\n barCategoryGap: number;\n changeHorizontalGrid?: (visible: boolean) => void;\n changeVerticalGrid?: (visible: boolean) => void;\n changeLineWidth?: (width: number) => void;\n changeSymbolSize?: (count: number) => void;\n changeBarCategoryGap?: (gap: number) => void;\n}\n\nconst BuildingEnergyGraphMenu = ({\n horizontalGrid,\n verticalGrid,\n lineWidth,\n symbolSize,\n barCategoryGap,\n changeHorizontalGrid,\n changeVerticalGrid,\n changeLineWidth,\n changeSymbolSize,\n changeBarCategoryGap,\n}: BuildingEnergyGraphMenuProps) => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n\n const [visible, setVisible] = useState(false);\n\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n };\n\n const onShowHorizontalGridLines = () => {\n changeHorizontalGrid?.(!horizontalGrid);\n };\n\n const onShowVerticalGridLines = () => {\n changeVerticalGrid?.(!verticalGrid);\n };\n\n const onChangeLineWidth = (value: number) => {\n changeLineWidth?.(value / 2);\n };\n\n const onChangeSymbolSize = (size: number) => {\n changeSymbolSize?.(size / 5);\n };\n\n const onChangeBarCategoryGap = (gap: number) => {\n changeBarCategoryGap?.(gap);\n };\n\n const menu = (\n \n \n {i18n.t('menu.graph.LineWidth', lang) + ':'}\n \n \n \n {i18n.t('menu.graph.SymbolSize', lang) + ':'}\n \n \n \n {i18n.t('menu.graph.BarCategoryGap', lang) + ':'}\n \n \n \n \n {i18n.t('menu.graph.ShowHorizontalGridLines', lang)}\n \n \n \n \n {i18n.t('menu.graph.ShowVerticalGridLines', lang)}\n \n \n \n );\n\n return (\n <>\n \n {\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n\nexport default BuildingEnergyGraphMenu;\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n Bar,\n CartesianGrid,\n ComposedChart,\n Label,\n Legend,\n Line,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { createSymbol, SYMBOLS } from './symbols';\nimport { DatumEntry, GraphDataType } from '../types';\nimport { CurveType } from 'recharts/types/shape/Curve';\nimport BuildingEnergyGraphMenu from './buildingEnergyGraphMenu';\nimport { PRESET_COLORS } from '../constants';\n\nexport interface BuildingEnergyGraphProps {\n type: GraphDataType;\n hasSolarPanels: boolean;\n dataSource: DatumEntry[];\n labels: string[];\n height: number;\n dataKeyAxisX?: string;\n labelX?: string;\n labelY?: string;\n unitX?: string;\n unitY?: string;\n yMin?: string | number;\n yMax?: string | number;\n curveType?: CurveType;\n referenceX?: number | string;\n fractionDigits?: number;\n symbolCount?: number;\n}\n\nconst BuildingEnergyGraph = ({\n type,\n dataSource,\n hasSolarPanels,\n labels,\n height,\n dataKeyAxisX,\n labelX,\n labelY,\n unitX,\n unitY,\n yMin = 'auto',\n yMax = 'auto',\n curveType = 'linear',\n referenceX,\n fractionDigits = 2,\n symbolCount = 12,\n}: BuildingEnergyGraphProps) => {\n const [buildingCount, setBuildingCount] = useState(0);\n const [buildingId, setBuildingId] = useState();\n const [horizontalGridLines, setHorizontalGridLines] = useState(true);\n const [verticalGridLines, setVerticalGridLines] = useState(true);\n const [legendDataKey, setLegendDataKey] = useState(null);\n const [lineWidth, setLineWidth] = useState(2);\n const [symbolSize, setSymbolSize] = useState(1);\n const [barCategoryGap, setBarCategoryGap] = useState(2);\n\n //init\n useEffect(() => {\n if (!dataSource || dataSource.length === 0) {\n return;\n }\n // there are four lines for each dataset [Heater, AC, Solar, Net] when there are solar panels\n const n = hasSolarPanels ? 4 : 3;\n const len =\n (Array.isArray(dataSource) ? Object.keys(dataSource[0]).length - 1 : Object.keys(dataSource).length - 1) / n;\n if (buildingCount !== len) {\n setBuildingCount(len);\n }\n if (len === 1) {\n if (dataSource[0]) {\n for (const k in dataSource[0]) {\n if (k.startsWith('Heater')) {\n setBuildingId(k.length > 6 ? k.substring(6).trim() : undefined);\n break;\n }\n }\n }\n }\n }, [dataSource]);\n\n const getRepresentations = useMemo(() => {\n const representations = [];\n const n = hasSolarPanels ? 4 : 3;\n let defaultSymbol;\n const barStrokeColor = 'gray';\n const barStrokeWidth = 1;\n for (let i = 0; i < buildingCount; i++) {\n let name = buildingCount > 1 ? labels[i * n] : buildingId ? 'Heater ' + buildingId : 'Heater';\n representations.push(\n ,\n );\n name = buildingCount > 1 ? labels[i * n + 1] : buildingId ? 'AC ' + buildingId : 'AC';\n representations.push(\n ,\n );\n if (hasSolarPanels) {\n name = buildingCount > 1 ? labels[i * n + 2] : buildingId ? 'Solar ' + buildingId : 'Solar';\n representations.push(\n ,\n );\n }\n }\n const m = n - 1;\n for (let i = 0; i < buildingCount; i++) {\n let name = buildingCount > 1 ? labels[i * n + m] : buildingId ? 'Net ' + buildingId : 'Net';\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n const symbol = createSymbol(SYMBOLS[i], symbolSize, symbolCount, opacity);\n if (i === 0) defaultSymbol = symbol;\n representations.push(\n 0 ? (symbol ? symbol : defaultSymbol) : false}\n isAnimationActive={false}\n />,\n );\n }\n return representations;\n }, [type, curveType, labels, buildingCount, buildingId, lineWidth, symbolCount, symbolSize, legendDataKey]);\n\n // @ts-ignore\n const onMouseDown = (e) => {};\n\n // @ts-ignore\n const onMouseEnterLegend = (o) => {\n setLegendDataKey(o.dataKey);\n };\n\n // @ts-ignore\n const onMouseLeaveLegend = (o) => {\n setLegendDataKey(null);\n };\n\n return (\n <>\n {dataSource && (\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\n \n \n \n \n value.toFixed(fractionDigits) + ' ' + unitY} />\n \n \n \n \n \n \n \n {getRepresentations}\n \n {buildingCount > 0 && (\n \n )}\n \n \n {\n setHorizontalGridLines(checked);\n }}\n changeVerticalGrid={(checked) => {\n setVerticalGridLines(checked);\n }}\n changeLineWidth={(value) => {\n setLineWidth(value);\n }}\n changeSymbolSize={(value) => {\n setSymbolSize(value);\n }}\n changeBarCategoryGap={(value) => {\n setBarCategoryGap(value);\n }}\n />\n \n \n )}\n \n );\n};\n\nexport default BuildingEnergyGraph;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { BuildingCompletionStatus, DatumEntry, GraphDataType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Popover, Space } from 'antd';\nimport { ReloadOutlined, CaretRightOutlined, SaveOutlined, CameraOutlined } from '@ant-design/icons';\nimport { saveCsv, screenshot, showError, showInfo, showWarning } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDailyEnergySorter } from '../analysis/energyHooks';\nimport BuildingEnergyGraph from '../components/buildingEnergyGraph';\nimport { Util } from '../Util';\nimport { checkBuilding, CheckStatus } from '../analysis/heatTools';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyBuildingEnergyPanelProps {\n city: string | null;\n}\n\nconst DailyBuildingEnergyPanel = ({ city }: DailyBuildingEnergyPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const selectNone = useStore(Selector.selectNone);\n const getWeather = useStore(Selector.getWeather);\n const now = new Date(useStore(Selector.world.date));\n const panelRect = useStore(Selector.viewState.dailyBuildingEnergyPanelRect);\n const flagOfDailySimulation = usePrimitiveStore(Selector.flagOfDailySimulation);\n const runDailySimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\n const clearDailySimulationResultsFlag = usePrimitiveStore(Selector.clearDailySimulationResultsFlag);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const hasSolarPanels = Util.hasSolarPanels(useStore.getState().elements);\n const setTotalBuildingHeater = useDataStore(Selector.setTotalBuildingHeater);\n const setTotalBuildingAc = useDataStore(Selector.setTotalBuildingAc);\n const setTotalBuildingSolarPanel = useDataStore(Selector.setTotalBuildingSolarPanel);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 460;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [data, setData] = useState([]);\n const [heaterSum, setHeaterSum] = useState(0);\n const [acSum, setAcSum] = useState(0);\n const [solarPanelSum, setSolarPanelSum] = useState(0);\n const [netSum, setNetSum] = useState(0);\n const [labels, setLabels] = useState(['Heater', 'AC', 'Net']);\n\n const lang = { lng: language };\n const weather = getWeather(city ?? 'Boston MA, USA');\n const tooltipHeaterBreakdown = useRef([]);\n const tooltipAcBreakdown = useRef([]);\n const tooltipSolarPanelBreakdown = useRef([]);\n const tooltipNetBreakdown = useRef([]);\n\n useEffect(() => {\n if (runDailySimulation) {\n clearResults();\n }\n }, [runDailySimulation]);\n\n useEffect(() => {\n clearResults();\n }, [clearDailySimulationResultsFlag]);\n\n const clearResults = () => {\n setData([]);\n setHeaterSum(0);\n setAcSum(0);\n setSolarPanelSum(0);\n setNetSum(0);\n setLabels([]);\n };\n\n const { sum, sumHeaterMap, sumAcMap, sumSolarPanelMap, dataLabels } = useDailyEnergySorter(\n now,\n weather,\n hasSolarPanels,\n );\n\n useEffect(() => {\n setData(sum);\n let sumHeater = 0;\n let sumAc = 0;\n let sumSolarPanel = 0;\n const multiple = sumHeaterMap.size > 1;\n if (sumHeaterMap) {\n tooltipHeaterBreakdown.current = [];\n for (const key of sumHeaterMap.keys()) {\n const val = sumHeaterMap.get(key);\n if (val) {\n sumHeater += val;\n if (multiple) {\n tooltipHeaterBreakdown.current.push(key + ': ' + val.toFixed(2) + ' ' + i18n.t('word.kWh', lang));\n }\n }\n }\n }\n if (sumAcMap) {\n tooltipAcBreakdown.current = [];\n for (const key of sumAcMap.keys()) {\n const val = sumAcMap.get(key);\n if (val) {\n sumAc += val;\n if (multiple) {\n tooltipAcBreakdown.current.push(key + ': ' + val.toFixed(2) + ' ' + i18n.t('word.kWh', lang));\n }\n }\n }\n }\n if (sumSolarPanelMap && sumSolarPanelMap.size > 0) {\n tooltipSolarPanelBreakdown.current = [];\n for (const key of sumSolarPanelMap.keys()) {\n const val = sumSolarPanelMap.get(key);\n if (val) {\n sumSolarPanel += val;\n if (multiple) {\n tooltipSolarPanelBreakdown.current.push(key + ': ' + val.toFixed(2) + ' ' + i18n.t('word.kWh', lang));\n }\n }\n }\n }\n if (sumHeaterMap && sumAcMap && sumSolarPanelMap) {\n tooltipNetBreakdown.current = [];\n for (const key of sumHeaterMap.keys()) {\n let net = 0;\n const heater = sumHeaterMap.get(key);\n const ac = sumAcMap.get(key);\n const solarPanel = sumSolarPanelMap.get(key);\n if (heater) net += heater;\n if (ac) net += ac;\n if (solarPanel) net -= solarPanel;\n if (multiple) {\n tooltipNetBreakdown.current.push(key + ': ' + net.toFixed(2) + ' ' + i18n.t('word.kWh', lang));\n }\n }\n }\n setHeaterSum(sumHeater);\n setAcSum(sumAc);\n setSolarPanelSum(sumSolarPanel);\n setNetSum(sumHeater + sumAc - sumSolarPanel);\n // for logger\n setTotalBuildingHeater(sumHeater);\n setTotalBuildingAc(sumAc);\n setTotalBuildingSolarPanel(sumSolarPanel);\n const countBuildings = (Object.keys(sum[0]).length - 1) / (hasSolarPanels ? 4 : 3);\n if (countBuildings > 1) {\n const l = [];\n let i = 0;\n for (let index = 0; index < countBuildings; index++) {\n // If the data label is not set, we will give it a default label by its index,\n // but some labels may be set, so we have to use an incrementer here.\n if (!dataLabels[index]) i++;\n const id = dataLabels[index] ?? i;\n if (hasSolarPanels) {\n l.push('Heater ' + id, 'AC ' + id, 'Solar ' + id, 'Net ' + id);\n } else {\n l.push('Heater ' + id, 'AC ' + id, 'Net ' + id);\n }\n }\n setLabels(l);\n } else {\n if (hasSolarPanels) {\n setLabels(['Heater', 'AC', 'Solar', 'Net']);\n } else {\n setLabels(['Heater', 'AC', 'Net']);\n }\n }\n }, [flagOfDailySimulation]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyBuildingEnergyPanelRect) {\n state.viewState.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.dailyBuildingEnergyPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyBuildingEnergyPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyBuildingEnergyPanelRect) {\n state.viewState.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.dailyBuildingEnergyPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyBuildingEnergyPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyBuildingEnergyPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Daily Building Energy Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('word.Energy', lang);\n const emptyGraph = data && data[0] ? Object.keys(data[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyBuildingEnergyPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('buildingEnergyPanel.DailyBuildingEnergy', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {tooltipHeaterBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.Heater', lang) + ': ' + heaterSum.toFixed(1)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.Heater', lang) + ': ' + heaterSum.toFixed(1)}\n \n \n )}\n {tooltipAcBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.AC', lang) + ': ' + acSum.toFixed(1)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.AC', lang) + ': ' + acSum.toFixed(1)}\n \n \n )}\n {solarPanelSum !== 0 && (\n <>\n {tooltipSolarPanelBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.SolarPanel', lang) + ': ' + solarPanelSum.toFixed(1)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.SolarPanel', lang) + ': ' + solarPanelSum.toFixed(1)}\n \n \n )}\n \n )}\n {tooltipNetBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.Net', lang) + ': ' + netSum.toFixed(1)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.Net', lang) + ': ' + netSum.toFixed(1)}\n \n \n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n const elements = useStore.getState().elements;\n const countElementsByType = useStore.getState().countElementsByType;\n const getChildrenOfType = useStore.getState().getChildrenOfType;\n const checkResult = checkBuilding(elements, countElementsByType, getChildrenOfType);\n if (checkResult.status === CheckStatus.NO_BUILDING) {\n showInfo(i18n.t('analysisManager.NoBuildingForAnalysis', lang));\n return;\n }\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD) {\n let errorType;\n switch (checkResult.buildingCompletion) {\n case BuildingCompletionStatus.WALL_DISJOINED:\n errorType = i18n.t('message.WallsAreNotConnected', lang);\n break;\n case BuildingCompletionStatus.WALL_EMPTY:\n errorType = i18n.t('message.BuildingContainsEmptyWall', lang);\n break;\n case BuildingCompletionStatus.ROOF_MISSING:\n errorType = i18n.t('message.BuildingRoofMissing', lang);\n break;\n default:\n errorType = i18n.t('message.UnknownErrors', lang);\n }\n showError(i18n.t('message.SimulationWillNotStartDueToErrors', lang) + ': ' + errorType);\n return;\n }\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD) {\n showWarning(i18n.t('message.SimulationWillStartDespiteWarnings', lang));\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n selectNone();\n usePrimitiveStore.setState((state) => {\n state.runDailyThermalSimulation = true;\n state.pauseDailyThermalSimulation = false;\n state.simulationInProgress = true;\n });\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Building Energy Analysis',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-building-energy', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Building Energy Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {data && data.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(data, 'daily-building-energy.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Building Energy Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyBuildingEnergyPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { BuildingCompletionStatus, DatumEntry, GraphDataType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Popover, Space } from 'antd';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport { saveCsv, screenshot, showError, showInfo, showWarning } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDailyEnergySorter } from '../analysis/energyHooks';\nimport BuildingEnergyGraph from '../components/buildingEnergyGraph';\nimport { Util } from '../Util';\nimport { checkBuilding, CheckStatus } from '../analysis/heatTools';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyBuildingEnergyPanelProps {\n city: string | null;\n}\n\nconst YearlyBuildingEnergyPanel = ({ city }: YearlyBuildingEnergyPanelProps) => {\n const world = useStore.getState().world;\n const getWeather = useStore(Selector.getWeather);\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const selectNone = useStore(Selector.selectNone);\n const now = new Date(useStore(Selector.world.date));\n const panelRect = useStore(Selector.viewState.yearlyBuildingEnergyPanelRect);\n const flagOfDailySimulation = usePrimitiveStore(Selector.flagOfDailySimulation);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlyThermalSimulation);\n const clearYearlySimulationResultsFlag = usePrimitiveStore(Selector.clearYearlySimulationResultsFlag);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const hasSolarPanels = Util.hasSolarPanels(useStore.getState().elements);\n const setTotalBuildingHeater = useDataStore(Selector.setTotalBuildingHeater);\n const setTotalBuildingAc = useDataStore(Selector.setTotalBuildingAc);\n const setTotalBuildingSolarPanel = useDataStore(Selector.setTotalBuildingSolarPanel);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 600;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const lang = { lng: language };\n const weather = getWeather(city ?? 'Boston MA, USA');\n const referenceX = MONTHS[now.getMonth()];\n const daysPerYear = world.daysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n\n const [heaterSum, setHeaterSum] = useState(0);\n const [acSum, setAcSum] = useState(0);\n const [solarPanelSum, setSolarPanelSum] = useState(0);\n const [netSum, setNetSum] = useState(0);\n const [labels, setLabels] = useState(['Heater', 'AC', 'Solar', 'Net']);\n const [data, setData] = useState([]);\n\n const { sum, sumHeaterMap, sumAcMap, sumSolarPanelMap, dataLabels } = useDailyEnergySorter(\n now,\n weather,\n hasSolarPanels,\n );\n\n const resultRef = useRef(new Array(daysPerYear).fill({}));\n const heaterSumRef = useRef(new Array(daysPerYear).fill(0));\n const acSumRef = useRef(new Array(daysPerYear).fill(0));\n const solarPanelSumRef = useRef(new Array(daysPerYear).fill(0));\n const netSumRef = useRef(new Array(daysPerYear).fill(0));\n const tooltipHeaterBreakdown = useRef([]);\n const tooltipAcBreakdown = useRef([]);\n const tooltipSolarPanelBreakdown = useRef([]);\n const tooltipNetBreakdown = useRef([]);\n\n useEffect(() => {\n clearResults();\n }, [daysPerYear, clearYearlySimulationResultsFlag]);\n\n useEffect(() => {\n if (runYearlySimulation) {\n clearResults();\n }\n }, [runYearlySimulation]);\n\n const clearResults = () => {\n resultRef.current = new Array(daysPerYear).fill({});\n heaterSumRef.current = new Array(daysPerYear).fill(0);\n acSumRef.current = new Array(daysPerYear).fill(0);\n solarPanelSumRef.current = new Array(daysPerYear).fill(0);\n netSumRef.current = new Array(daysPerYear).fill(0);\n setData([]);\n setHeaterSum(0);\n setAcSum(0);\n setSolarPanelSum(0);\n setNetSum(0);\n setLabels([]);\n };\n\n useEffect(() => {\n const indexOfMonth = now.getMonth() / monthInterval;\n const countBuildings = (Object.keys(sum[0]).length - 1) / (hasSolarPanels ? 4 : 3);\n tooltipHeaterBreakdown.current = [];\n tooltipAcBreakdown.current = [];\n tooltipNetBreakdown.current = [];\n tooltipSolarPanelBreakdown.current = [];\n if (countBuildings > 1) {\n const heaterMap = new Map();\n const acMap = new Map();\n const solarPanelMap = new Map();\n const netMap = new Map();\n for (const h of sum) {\n let i = 0;\n for (let j = 0; j < countBuildings; j++) {\n // If the data label is not set, we will give it a default label by its index,\n // but some labels may be set, so we have to use an incrementer here.\n if (!dataLabels[j]) i++;\n const id = dataLabels[j] ?? i;\n let heater = heaterMap.get(id);\n if (heater === undefined) heater = 0;\n heater += h['Heater ' + id] as number;\n heaterMap.set(id, heater);\n let ac = acMap.get(id);\n if (ac === undefined) ac = 0;\n ac += h['AC ' + id] as number;\n acMap.set(id, ac);\n let net = netMap.get(id);\n if (net === undefined) net = 0;\n net += h['Net ' + id] as number;\n netMap.set(id, net);\n if (hasSolarPanels) {\n let solarPanel = solarPanelMap.get(id);\n if (solarPanel === undefined) solarPanel = 0;\n solarPanel += h['Solar ' + id] as number;\n solarPanelMap.set(id, solarPanel);\n }\n }\n }\n const datum: DatumEntry = {};\n datum['Month'] = MONTHS[now.getMonth()];\n const l = [];\n let i = 0;\n for (let index = 0; index < countBuildings; index++) {\n // If the data label is not set, we will give it a default label by its index,\n // but some labels may be set, so we have to use an incrementer here.\n if (!dataLabels[index]) i++;\n const id = dataLabels[index] ?? i;\n if (hasSolarPanels) {\n l.push('Heater ' + id, 'AC ' + id, 'Solar ' + id, 'Net ' + id);\n datum['Solar ' + id] = (solarPanelMap.get(id) ?? 0) * 30;\n } else {\n l.push('Heater ' + id, 'AC ' + id, 'Net ' + id);\n }\n datum['Heater ' + id] = (heaterMap.get(id) ?? 0) * 30;\n datum['AC ' + id] = (acMap.get(id) ?? 0) * 30;\n datum['Net ' + id] = (netMap.get(id) ?? 0) * 30;\n }\n setLabels(l);\n resultRef.current[indexOfMonth] = datum;\n i = 0;\n for (let index = 0; index < countBuildings; index++) {\n // If the data label is not set, we will give it a default label by its index,\n // but some labels may be set, so we have to use an incrementer here.\n if (!dataLabels[index]) i++;\n let totalHeater = 0;\n let totalAc = 0;\n let totalSolarPanel = 0;\n let totalNet = 0;\n const id = dataLabels[index] ?? i;\n for (const res of resultRef.current) {\n totalHeater += res['Heater ' + id] as number;\n totalAc += res['AC ' + id] as number;\n totalNet += res['Net ' + id] as number;\n if (hasSolarPanels) totalSolarPanel += res['Solar ' + id] as number;\n }\n totalHeater *= monthInterval;\n totalAc *= monthInterval;\n totalNet *= monthInterval;\n tooltipHeaterBreakdown.current.push(id + ': ' + totalHeater.toFixed(1) + ' ' + i18n.t('word.kWh', lang));\n tooltipAcBreakdown.current.push(id + ': ' + totalAc.toFixed(1) + ' ' + i18n.t('word.kWh', lang));\n tooltipNetBreakdown.current.push(id + ': ' + totalNet.toFixed(1) + ' ' + i18n.t('word.kWh', lang));\n if (totalSolarPanel !== 0) {\n totalSolarPanel *= -monthInterval;\n tooltipSolarPanelBreakdown.current.push(\n id + ': ' + totalSolarPanel.toFixed(1) + ' ' + i18n.t('word.kWh', lang),\n );\n }\n }\n } else {\n // only one building\n let heater = 0;\n let ac = 0;\n let net = 0;\n let bid = '';\n for (const k in sum[0]) {\n if (k.startsWith('Heater')) {\n if (k.length > 6) bid = ' ' + k.substring(6).trim();\n break;\n }\n }\n const heaterId = 'Heater' + bid;\n const acId = 'AC' + bid;\n const netId = 'Net' + bid;\n if (hasSolarPanels) {\n const solarId = 'Solar' + bid;\n let solarPanel = 0;\n setLabels([heaterId, acId, solarId, netId]);\n for (const h of sum) {\n heater += h[heaterId] as number;\n ac += h[acId] as number;\n solarPanel += h[solarId] as number;\n net += h[netId] as number;\n }\n const datum: DatumEntry = {};\n datum['Month'] = MONTHS[now.getMonth()];\n datum[heaterId] = 30 * heater;\n datum[acId] = 30 * ac;\n datum[solarId] = 30 * solarPanel;\n datum[netId] = 30 * net;\n resultRef.current[indexOfMonth] = datum;\n } else {\n setLabels([heaterId, acId, netId]);\n for (const h of sum) {\n heater += h[heaterId] as number;\n ac += h[acId] as number;\n net += h[netId] as number;\n }\n const datum: DatumEntry = {};\n datum['Month'] = MONTHS[now.getMonth()];\n datum[heaterId] = 30 * heater;\n datum[acId] = 30 * ac;\n datum[netId] = 30 * net;\n resultRef.current[indexOfMonth] = datum;\n }\n }\n setData([...resultRef.current]);\n let sumHeater = 0;\n if (sumHeaterMap) {\n for (const key of sumHeaterMap.keys()) {\n sumHeater += sumHeaterMap.get(key) ?? 0;\n }\n }\n let sumAc = 0;\n if (sumAcMap) {\n for (const key of sumAcMap.keys()) {\n sumAc += sumAcMap.get(key) ?? 0;\n }\n }\n let sumSolarPanel = 0;\n if (sumSolarPanelMap && hasSolarPanels) {\n for (const key of sumSolarPanelMap.keys()) {\n sumSolarPanel += sumSolarPanelMap.get(key) ?? 0;\n }\n }\n heaterSumRef.current[indexOfMonth] = sumHeater * monthInterval * 30;\n acSumRef.current[indexOfMonth] = sumAc * monthInterval * 30;\n solarPanelSumRef.current[indexOfMonth] = sumSolarPanel * monthInterval * 30;\n netSumRef.current[indexOfMonth] =\n heaterSumRef.current[indexOfMonth] + acSumRef.current[indexOfMonth] - solarPanelSumRef.current[indexOfMonth];\n const totalHeater = heaterSumRef.current.slice(0, indexOfMonth + 1).reduce((pv, cv) => pv + cv, 0);\n setHeaterSum(totalHeater);\n const totalAc = acSumRef.current.slice(0, indexOfMonth + 1).reduce((pv, cv) => pv + cv, 0);\n setAcSum(totalAc);\n const totalSolarPanel = solarPanelSumRef.current.slice(0, indexOfMonth + 1).reduce((pv, cv) => pv + cv, 0);\n setSolarPanelSum(totalSolarPanel);\n setNetSum(netSumRef.current.slice(0, indexOfMonth + 1).reduce((pv, cv) => pv + cv, 0));\n // for logger\n setTotalBuildingHeater(totalHeater);\n setTotalBuildingAc(totalAc);\n setTotalBuildingSolarPanel(totalSolarPanel);\n if (!usePrimitiveStore.getState().showSolarRadiationHeatmap) {\n useDataStore.getState().clearDataStore();\n }\n }, [flagOfDailySimulation]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyBuildingEnergyPanelRect) {\n state.viewState.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 500);\n }\n state.viewState.yearlyBuildingEnergyPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyBuildingEnergyPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyBuildingEnergyPanelRect) {\n state.viewState.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.yearlyBuildingEnergyPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyBuildingEnergyPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyBuildingEnergyPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Yearly Building Energy Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('word.Energy', lang);\n const emptyGraph = data && data[0] ? Object.keys(data[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyBuildingEnergyPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('buildingEnergyPanel.YearlyBuildingEnergy', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {tooltipHeaterBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.Heater', lang) + ': ' + heaterSum.toFixed(0)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.Heater', lang) + ': ' + heaterSum.toFixed(0)}\n \n \n )}\n {tooltipAcBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.AC', lang) + ': ' + acSum.toFixed(0)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.AC', lang) + ': ' + acSum.toFixed(0)}\n \n \n )}\n {solarPanelSum !== 0 && (\n <>\n {tooltipSolarPanelBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.SolarPanel', lang) + ': ' + solarPanelSum.toFixed(0)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.SolarPanel', lang) + ': ' + solarPanelSum.toFixed(0)}\n \n \n )}\n \n )}\n {tooltipNetBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.Net', lang) + ': ' + netSum.toFixed(0)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.Net', lang) + ': ' + netSum.toFixed(0)}\n \n \n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n const elements = useStore.getState().elements;\n const countElementsByType = useStore.getState().countElementsByType;\n const getChildrenOfType = useStore.getState().getChildrenOfType;\n const checkResult = checkBuilding(elements, countElementsByType, getChildrenOfType);\n if (checkResult.status === CheckStatus.NO_BUILDING) {\n showInfo(i18n.t('analysisManager.NoBuildingForAnalysis', lang));\n return;\n }\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD) {\n let errorType = '';\n switch (checkResult.buildingCompletion) {\n case BuildingCompletionStatus.WALL_DISJOINED:\n errorType = i18n.t('message.WallsAreNotConnected', lang);\n break;\n case BuildingCompletionStatus.WALL_EMPTY:\n errorType = i18n.t('message.BuildingContainsEmptyWall', lang);\n break;\n case BuildingCompletionStatus.ROOF_MISSING:\n errorType = i18n.t('message.BuildingRoofMissing', lang);\n break;\n default:\n errorType = i18n.t('message.UnknownErrors', lang);\n }\n showError(i18n.t('message.SimulationWillNotStartDueToErrors', lang) + ': ' + errorType);\n return;\n }\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD) {\n showWarning(i18n.t('message.SimulationWillStartDespiteWarnings', lang));\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n selectNone();\n usePrimitiveStore.setState((state) => {\n state.runYearlyThermalSimulation = true;\n state.pauseYearlyThermalSimulation = false;\n state.simulationInProgress = true;\n });\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Building Energy Analysis',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-building-energy', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Building Energy Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {resultRef.current && resultRef.current.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(resultRef.current, 'yearly-building-energy.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Building Energy Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyBuildingEnergyPanel);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst NavigationPanel = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const minimumMoveSpeed = useStore(Selector.minimumNavigationMoveSpeed);\n const minimumTurnSpeed = useStore(Selector.minimumNavigationTurnSpeed);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const okButtonRef = useRef(null);\n const minimumMoveSpeedRef = useRef(minimumMoveSpeed);\n const minimumTurnSpeedRef = useRef(minimumTurnSpeed);\n\n const lang = { lng: language };\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const setMinimumMoveSpeed = (value: number) => {\n setCommonStore((state) => {\n state.minimumNavigationMoveSpeed = value;\n });\n usePrimitiveStore.setState((state) => {\n state.navigationMoveSpeed = value;\n });\n };\n\n const setMinimumTurnSpeed = (value: number) => {\n setCommonStore((state) => {\n state.minimumNavigationTurnSpeed = value;\n });\n usePrimitiveStore.setState((state) => {\n state.navigationTurnSpeed = value;\n });\n };\n\n const apply = () => {\n const oldMoveSpeed = minimumMoveSpeed;\n const newMoveSpeed = minimumMoveSpeedRef.current;\n if (oldMoveSpeed !== newMoveSpeed) {\n const undoableChange = {\n name: 'Minimum Navigation Move Speed',\n timestamp: Date.now(),\n oldValue: oldMoveSpeed,\n newValue: newMoveSpeed,\n undo: () => {\n setMinimumMoveSpeed(undoableChange.oldValue as number);\n },\n redo: () => {\n setMinimumMoveSpeed(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setMinimumMoveSpeed(newMoveSpeed);\n }\n\n const oldTurnSpeed = minimumTurnSpeed;\n const newTurnSpeed = minimumTurnSpeedRef.current;\n if (oldTurnSpeed !== newTurnSpeed) {\n const undoableChange = {\n name: 'Minimum Navigation Turn Speed',\n timestamp: Date.now(),\n oldValue: oldTurnSpeed,\n newValue: newTurnSpeed,\n undo: () => {\n setMinimumTurnSpeed(undoableChange.oldValue as number);\n },\n redo: () => {\n setMinimumTurnSpeed(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setMinimumTurnSpeed(newTurnSpeed);\n }\n };\n\n const onCancelClick = () => {\n setDialogVisible(false);\n };\n\n const onOkClick = () => {\n apply();\n setDialogVisible(false);\n };\n\n return (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('navigationPanel.NavigationParameters', lang)}\n \n }\n footer={[\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('navigationPanel.MinimumMoveSpeed', lang) + ' ([1, 10]): '}\n \n \n {\n minimumMoveSpeedRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n onBlur={(e) => {\n const value = (e.target as HTMLInputElement).value;\n const v = parseFloat(value);\n minimumMoveSpeedRef.current = Number.isNaN(v) ? 3 : v;\n setUpdateFlag(!updateFlag);\n }}\n onPressEnter={(e) => {\n const value = (e.target as HTMLInputElement).value;\n const v = parseFloat(value);\n minimumMoveSpeedRef.current = Number.isNaN(v) ? 3 : v;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n \n \n {i18n.t('navigationPanel.MinimumTurnSpeed', lang) + ' ([1, 5]): '}\n \n \n {\n minimumTurnSpeedRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n onBlur={(e) => {\n const value = (e.target as HTMLInputElement).value;\n const v = parseFloat(value);\n minimumTurnSpeedRef.current = Number.isNaN(v) ? 3 : v;\n setUpdateFlag(!updateFlag);\n }}\n onPressEnter={(e) => {\n const value = (e.target as HTMLInputElement).value;\n const v = parseFloat(value);\n minimumTurnSpeedRef.current = Number.isNaN(v) ? 3 : v;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n \n );\n};\n\nexport default React.memo(NavigationPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n *\n */\n\nimport React, { useEffect, useState } from 'react';\nimport MapPanel from './panels/mapPanel';\nimport HeliodonPanel from './panels/heliodonPanel';\nimport WeatherPanel from './panels/weatherPanel';\nimport YearlyLightSensorPanel from './panels/yearlyLightSensorPanel';\nimport DailyLightSensorPanel from './panels/dailyLightSensorPanel';\nimport StickyNotePanel from './panels/stickyNotePanel';\nimport InstructionPanel from './panels/instructionPanel';\nimport YearlyPvYieldPanel from './panels/yearlyPvYieldPanel';\nimport DailyPvYieldPanel from './panels/dailyPvYieldPanel';\nimport DesignInfoPanel from './panels/designInfoPanel';\nimport SiteInfoPanel from './panels/siteInfoPanel';\nimport VisualizationControlPanel from './panels/visualizationControlPanel';\nimport VisibilityResultsPanel from './panels/visibilityResultsPanel';\nimport YearlyParabolicTroughYieldPanel from './panels/yearlyParabolicTroughYieldPanel';\nimport DailyParabolicTroughYieldPanel from './panels/dailyParabolicTroughYieldPanel';\nimport DailyParabolicDishYieldPanel from './panels/dailyParabolicDishYieldPanel';\nimport YearlyParabolicDishYieldPanel from './panels/yearlyParabolicDishYieldPanel';\nimport DailyFresnelReflectorYieldPanel from './panels/dailyFresnelReflectorYieldPanel';\nimport YearlyFresnelReflectorYieldPanel from './panels/yearlyFresnelReflectorYieldPanel';\nimport DailyHeliostatYieldPanel from './panels/dailyHeliostatYieldPanel';\nimport YearlyHeliostatYieldPanel from './panels/yearlyHeliostatYieldPanel';\nimport DailySolarUpdraftTowerYieldPanel from './panels/dailySolarUpdraftTowerYieldPanel';\nimport DiurnalTemperaturePanel from './panels/diurnalTemperaturePanel';\nimport YearlySolarUpdraftTowerYieldPanel from './panels/yearlySolarUpdraftTowerYieldPanel';\nimport SolarPanelOptimizationResult from './panels/solarPanelOptimizationResult';\nimport EconomicsPanel from './panels/economicsPanel';\nimport DailyBuildingEnergyPanel from './panels/dailyBuildingEnergyPanel';\nimport YearlyBuildingEnergyPanel from './panels/yearlyBuildingEnergyPanel';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\nimport { useStore } from './stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { GraphDataType } from './types';\nimport NavigationPanel from './panels/navigationPanel';\n\nconst Panels = () => {\n const showSiteInfoPanel = useStore(Selector.viewState.showSiteInfoPanel);\n const showDesignInfoPanel = useStore(Selector.viewState.showDesignInfoPanel);\n const showInstructionPanel = useStore(Selector.viewState.showInstructionPanel);\n const showMapPanel = useStore(Selector.viewState.showMapPanel);\n const showHeliodonPanel = useStore(Selector.viewState.showHeliodonPanel);\n const showStickyNotePanel = useStore(Selector.viewState.showStickyNotePanel);\n const showWeatherPanel = useStore(Selector.viewState.showWeatherPanel);\n const showDiurnalTemperaturePanel = useStore(Selector.viewState.showDiurnalTemperaturePanel);\n const showEconomicsPanel = usePrimitiveStore(Selector.showEconomicsPanel);\n const showNavigationPanel = usePrimitiveStore(Selector.showNavigationPanel);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const showDailyLightSensorPanel = useStore(Selector.viewState.showDailyLightSensorPanel);\n const showYearlyLightSensorPanel = useStore(Selector.viewState.showYearlyLightSensorPanel);\n const showDailyPvYieldPanel = useStore(Selector.viewState.showDailyPvYieldPanel);\n const showYearlyPvYieldPanel = useStore(Selector.viewState.showYearlyPvYieldPanel);\n const showVisibilityResultsPanel = useStore(Selector.viewState.showVisibilityResultsPanel);\n const showDailyParabolicTroughYieldPanel = useStore(Selector.viewState.showDailyParabolicTroughYieldPanel);\n const showYearlyParabolicTroughYieldPanel = useStore(Selector.viewState.showYearlyParabolicTroughYieldPanel);\n const showDailyParabolicDishYieldPanel = useStore(Selector.viewState.showDailyParabolicDishYieldPanel);\n const showYearlyParabolicDishYieldPanel = useStore(Selector.viewState.showYearlyParabolicDishYieldPanel);\n const showDailyFresnelReflectorYieldPanel = useStore(Selector.viewState.showDailyFresnelReflectorYieldPanel);\n const showYearlyFresnelReflectorYieldPanel = useStore(Selector.viewState.showYearlyFresnelReflectorYieldPanel);\n const showDailyHeliostatYieldPanel = useStore(Selector.viewState.showDailyHeliostatYieldPanel);\n const showYearlyHeliostatYieldPanel = useStore(Selector.viewState.showYearlyHeliostatYieldPanel);\n const showDailyUpdraftTowerYieldPanel = useStore(Selector.viewState.showDailyUpdraftTowerYieldPanel);\n const showYearlyUpdraftTowerYieldPanel = useStore(Selector.viewState.showYearlyUpdraftTowerYieldPanel);\n const showDailyBuildingEnergyPanel = useStore(Selector.viewState.showDailyBuildingEnergyPanel);\n const showYearlyBuildingEnergyPanel = useStore(Selector.viewState.showYearlyBuildingEnergyPanel);\n const showEvolutionPanel = useStore(Selector.viewState.showEvolutionPanel);\n const projectView = useStore(Selector.projectView);\n const worldLatitude = useStore(Selector.world.latitude);\n const worldLongitude = useStore(Selector.world.longitude);\n const getClosestCity = useStore(Selector.getClosestCity);\n const navigation = useStore(Selector.viewState.navigationView) ?? false;\n\n const [city, setCity] = useState('Boston MA, USA');\n\n useEffect(() => {\n setCity(getClosestCity(worldLatitude, worldLongitude) ?? 'Boston MA, USA');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [worldLatitude, worldLongitude]);\n\n return (\n <>\n {showMapPanel && }\n {showHeliodonPanel && }\n {showStickyNotePanel && }\n {showSiteInfoPanel && }\n {showDesignInfoPanel && }\n {(showInstructionPanel || navigation) && !projectView && }\n {showWeatherPanel && (\n \n )}\n {showDiurnalTemperaturePanel && }\n {showEconomicsPanel && (\n {\n usePrimitiveStore.setState((state) => {\n state.showEconomicsPanel = visible;\n });\n }}\n />\n )}\n {showNavigationPanel && (\n {\n usePrimitiveStore.setState((state) => {\n state.showNavigationPanel = visible;\n });\n }}\n />\n )}\n {showYearlyLightSensorPanel && }\n {showDailyLightSensorPanel && }\n {showYearlyPvYieldPanel && }\n {showDailyPvYieldPanel && }\n {showVisibilityResultsPanel && }\n {showYearlyParabolicTroughYieldPanel && }\n {showDailyParabolicTroughYieldPanel && }\n {showYearlyParabolicDishYieldPanel && }\n {showDailyParabolicDishYieldPanel && }\n {showDailyFresnelReflectorYieldPanel && }\n {showYearlyFresnelReflectorYieldPanel && }\n {showDailyHeliostatYieldPanel && }\n {showYearlyHeliostatYieldPanel && }\n {showDailyUpdraftTowerYieldPanel && }\n {showYearlyUpdraftTowerYieldPanel && }\n {showDailyBuildingEnergyPanel && }\n {showYearlyBuildingEnergyPanel && }\n {showSolarRadiationHeatmap && }\n {showEvolutionPanel && }\n \n );\n};\n\nexport default React.memo(Panels);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { WallModel } from '../models/WallModel';\nimport { Util } from '../Util';\nimport {\n AMBIENT_LIGHT_THRESHOLD,\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n ROOFTOP_SOLAR_PANEL_OFFSET,\n} from './sunTools';\nimport { Euler, Quaternion, Vector2, Vector3 } from 'three';\nimport { HALF_PI, UNIT_VECTOR_POS_Y, UNIT_VECTOR_POS_Z } from '../constants';\nimport { AirMass } from './analysisConstants';\nimport { Point2 } from '../models/Point2';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { WorldModel } from '../models/WorldModel';\nimport { ElementModel } from '../models/ElementModel';\nimport { DoorModel, DoorType } from '../models/DoorModel';\nimport { RoofModel } from '../models/RoofModel';\nimport { WindowModel, WindowType } from '../models/WindowModel';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { Discretization, ObjectType, Orientation, ShadeTolerance, TrackerType } from '../types';\nimport { PvModel } from '../models/PvModel';\nimport { RoofUtil } from '../views/roof/RoofUtil';\n\nexport class SolarRadiation {\n // return the output energy density of a solar panel (need to be multiplied by area, weather factor, etc.)\n static computeSolarPanelOutput(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n pvModel: PvModel,\n panel: SolarPanelModel,\n parent: ElementModel,\n foundation: FoundationModel,\n elevation: number,\n distanceToClosestObject: Function,\n ): { heatmap: number[][]; average: number } {\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = foundation;\n }\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, foundation, panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const rot = parent.rotation[2];\n let angle = panel.tiltAngle;\n let zRot = rot + panel.relativeAzimuth;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n const normal = new Vector3().fromArray(panel.normal);\n const month = now.getMonth();\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n let lx: number, ly: number, nx: number, ny: number;\n let dCell: number;\n if (world.discretization === Discretization.EXACT) {\n lx = panel.lx;\n ly = panel.ly;\n if (panel.orientation === Orientation.portrait) {\n nx = Math.max(1, Math.round(panel.lx / pvModel.width));\n ny = Math.max(1, Math.round(panel.ly / pvModel.length));\n nx *= pvModel.n;\n ny *= pvModel.m;\n } else {\n nx = Math.max(1, Math.round(panel.lx / pvModel.length));\n ny = Math.max(1, Math.round(panel.ly / pvModel.width));\n nx *= pvModel.m;\n ny *= pvModel.n;\n }\n dCell = panel.lx / nx;\n } else {\n lx = panel.lx;\n ly = panel.ly;\n nx = Math.max(2, Math.round(panel.lx / cellSize));\n ny = Math.max(2, Math.round(panel.ly / cellSize));\n // nx and ny must be even (for circuit simulation)\n if (nx % 2 !== 0) nx += 1;\n if (ny % 2 !== 0) ny += 1;\n dCell = cellSize;\n }\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - dCell) / 2;\n const y0 = center.y - (ly - dCell) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const cellOutputs = Array.from(Array(nx), () => new Array(ny));\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof.\n // so we only need to tilt the normal for a solar panel on a foundation or flat roof\n let normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n if (panel.trackerType !== TrackerType.NO_TRACKER) {\n // dynamic angles\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n switch (panel.trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const qRotAADAT = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n normalEuler = new Euler().setFromQuaternion(qRotAADAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n const qRotHSAT = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x, 0, rotatedSunDirection.z).normalize(),\n );\n normalEuler = new Euler().setFromQuaternion(qRotHSAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n const v2 = new Vector3(rotatedSunDirection.x, -rotatedSunDirection.y, 0).normalize();\n const az = Math.acos(UNIT_VECTOR_POS_Y.dot(v2)) * Math.sign(v2.x);\n normalEuler = new Euler(panel.tiltAngle, 0, az + rot, 'ZYX');\n break;\n case TrackerType.TILTED_SINGLE_AXIS_TRACKER:\n // TODO\n break;\n }\n }\n normal.applyEuler(normalEuler);\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = indirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (distanceToClosestObject(panel.id, v, sunDirection) < 0) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n // we must consider cell wiring and distributed efficiency\n // Nice demo at: https://www.youtube.com/watch?v=UNPJapaZlCU\n let sum = 0;\n switch (pvModel.shadeTolerance) {\n case ShadeTolerance.NONE:\n // all the cells are connected in a single series,\n // so the total output is determined by the minimum\n let min1 = Number.MAX_VALUE;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min1) {\n min1 = c;\n }\n }\n }\n sum = min1 * nx * ny;\n break;\n case ShadeTolerance.PARTIAL:\n // assuming each panel uses a diode bypass to connect two columns of cells\n let min2 = Number.MAX_VALUE;\n if (panel.orientation === Orientation.portrait) {\n // e.g., nx = 6, ny = 10\n for (let kx = 0; kx < nx; kx++) {\n if (kx % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (kx % 2 === 1) {\n sum += min2 * ny * 2;\n }\n }\n } else {\n // landscape, e.g., nx = 10, ny = 6\n for (let ky = 0; ky < ny; ky++) {\n if (ky % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let kx = 0; kx < nx; kx++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (ky % 2 === 1) {\n sum += min2 * nx * 2;\n }\n }\n }\n break;\n default:\n // this probably is too idealized\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n sum += cellOutputs[kx][ky];\n }\n }\n break;\n }\n return { heatmap: cellOutputs, average: sum / (nx * ny) };\n }\n\n // Return an array that represents solar energy intensity radiated onto the discretized cells of a wall,\n // along with the unit area. Also return an array with the specific margin for generating a better looking heatmap.\n static computeWallSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n wall: WallModel,\n foundation: FoundationModel,\n windows: ElementModel[],\n doors: ElementModel[],\n solarPanels: ElementModel[],\n margin: number,\n elevation: number,\n distanceToClosestObject: Function,\n ): { intensity: number[][]; unitArea: number; heatmap: number[][] } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const lx = wall.lx;\n const lz = Util.getHighestPointOfWall(wall); // height\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n lz / 2 + foundation.lz,\n );\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const v = new Vector3();\n const polygonWithMargin = Util.getWallVertices(wall, margin);\n // if margin is zero, skip the calculation to save time\n const polygon = margin === 0 ? null : Util.getWallVertices(wall, 0);\n const halfDif = (lz - wall.lz) / 2;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n const heatmap: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let isWall;\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n const p = { x: kx2 * dx, y: kz2 * dz + halfDif } as Point2;\n const insidePolygonWithMargin = Util.isPointInside(p.x, p.y, polygonWithMargin);\n if (insidePolygonWithMargin) {\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n isWall = true;\n if (windows && windows.length > 0) {\n for (const w of windows) {\n if (w.type !== ObjectType.Window) continue;\n const cx = w.cx * wall.lx;\n const cz = w.cz * wall.lz;\n const hx = (w.lx * wall.lx) / 2;\n const hz = (w.lz * wall.lz) / 2;\n const window = w as WindowModel;\n if (window.windowType === WindowType.Arched) {\n const absWindowPos = absPos.clone().add(new Vector3(window.cx * wall.lx, 0, window.cz * wall.lz));\n if (SolarRadiation.pointWithinArch(v, window.lx, window.lz, window.archHeight, absWindowPos)) {\n isWall = false;\n }\n } else {\n if (p.x >= cx - hx && p.x < cx + hx && p.y >= cz - hz && p.y < cz + hz) {\n isWall = false;\n break;\n }\n }\n }\n }\n if (doors && doors.length > 0) {\n for (const d of doors) {\n if (d.type !== ObjectType.Door) continue;\n const cx = d.cx * wall.lx;\n const cz = d.cz * wall.lz;\n const hx = (d.lx * wall.lx) / 2;\n const hz = (d.lz * wall.lz) / 2;\n const door = d as DoorModel;\n if (door.doorType === DoorType.Arched) {\n const absDoorPos = absPos.clone().add(new Vector3(door.cx * wall.lx, 0, door.cz * wall.lz));\n if (SolarRadiation.pointWithinArch(v, door.lx, door.lz, door.archHeight, absDoorPos)) {\n isWall = false;\n }\n } else {\n if (p.x >= cx - hx && p.x < cx + hx && p.y >= cz - hz && p.y < cz + hz) {\n isWall = false;\n break;\n }\n }\n }\n }\n if (solarPanels && solarPanels.length > 0) {\n for (const s of solarPanels) {\n const cx = s.cx * wall.lx;\n const cz = s.cz * wall.lz;\n const hx = s.lx / 2;\n const hz = s.ly / 2;\n if (p.x >= cx - hx && p.x < cx + hx && p.y >= cz - hz && p.y < cz + hz) {\n isWall = false;\n break;\n }\n }\n }\n if (isWall) {\n const insidePolygon = polygon === null ? true : Util.isPointInside(p.x, p.y, polygon);\n const distance = distanceToClosestObject(wall.id, v, sunDirection);\n heatmap[kx][kz] += indirectRadiation;\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n if (insidePolygon) {\n intensity[kx][kz] += indirectRadiation;\n }\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n heatmap[kx][kz] += dot * peakRadiation;\n if (insidePolygon) {\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n return { intensity: intensity, unitArea: dx * dz, heatmap: heatmap };\n }\n\n // return an array that represents solar energy radiated onto the discretized cells of a door,\n // along with the unit area\n static computeDoorSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n door: DoorModel,\n wall: WallModel,\n foundation: FoundationModel,\n elevation: number,\n distanceToClosestObject: Function,\n ): { intensity: number[][]; unitArea: number } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const lx = door.lx * wall.lx;\n const lz = door.lz * wall.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absWallPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n const absDoorPos = absWallPos.clone().add(new Vector3(door.cx * wall.lx, 0, door.cz * wall.lz));\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const v = new Vector3();\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n if (door.doorType === DoorType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absDoorPos.x + kx2 * dxcos, absDoorPos.y + kx2 * dxsin, absDoorPos.z + kz2 * dz);\n if (SolarRadiation.pointWithinArch(v, lx, lz, door.archHeight, absDoorPos)) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (distanceToClosestObject(door.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absDoorPos.x + kx2 * dxcos, absDoorPos.y + kx2 * dxsin, absDoorPos.z + kz2 * dz);\n if (distanceToClosestObject(door.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { intensity: intensity, unitArea: dx * dz };\n }\n\n static pointWithinArch(point: Vector3, lx: number, lz: number, archHeight: number, center: Vector3): boolean {\n if (archHeight > 0) {\n const hx = 0.5 * lx;\n const ah = Math.min(archHeight, lz, hx); // actual arch height\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\n // check if the point is within the rectangular part\n const dx = point.x - center.x;\n const dy = point.y - center.y;\n const dr = dx * dx + dy * dy;\n let dz = point.z - center.z;\n if (dr < hx * hx && dz < lz / 2 - ah && dz > -lz / 2) {\n return true;\n }\n // check if the point is within the arch part\n dz = point.z - (lz - r);\n return dr + dz * dz < r * r;\n }\n return true;\n }\n\n // return an array that represents solar energy radiated onto the discretized cells of a window on a wall,\n // along with the unit area\n static computeWallWindowSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n window: WindowModel,\n wall: WallModel,\n foundation: FoundationModel,\n elevation: number,\n distanceToClosestObject: Function,\n ): { intensity: number[][]; unitArea: number } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const lx = window.lx * wall.lx;\n const lz = window.lz * wall.lz;\n // FIXME: when lx / cellSize is small, this discretization gives inaccurate results\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absWallAngle = foundation.rotation[2] + wall.relativeAngle;\n const absWallPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n const absWindowPos = absWallPos.clone().add(new Vector3(window.cx * wall.lx, 0, window.cz * wall.lz));\n const normal = new Vector3(Math.cos(absWallAngle - HALF_PI), Math.sin(absWallAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absWallAngle);\n const dxsin = dx * Math.sin(absWallAngle);\n const v = new Vector3();\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n if (window.windowType === WindowType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absWindowPos.x + kx2 * dxcos, absWindowPos.y + kx2 * dxsin, absWindowPos.z + kz2 * dz);\n if (SolarRadiation.pointWithinArch(v, lx, lz, window.archHeight, absWindowPos)) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (distanceToClosestObject(window.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absWindowPos.x + kx2 * dxcos, absWindowPos.y + kx2 * dxsin, absWindowPos.z + kz2 * dz);\n if (distanceToClosestObject(window.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { intensity: intensity, unitArea: dx * dz };\n }\n\n // return an array that represents solar energy radiated onto the discretized cells of a window on a roof,\n // along with the unit area\n static computeRoofWindowSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n window: WindowModel,\n roof: RoofModel,\n foundation: FoundationModel,\n elevation: number,\n distanceToClosestObject: Function,\n ): { intensity: number[][]; unitArea: number } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const lx = window.lx;\n const lz = window.lz;\n // FIXME: when lx / cellSize is small, this discretization gives inaccurate results\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const position = new Vector3(window.cx, window.cy, window.cz).applyEuler(new Euler(0, 0, foundation.rotation[2]));\n position.x += foundation.cx;\n position.y += foundation.cy;\n position.z += foundation.lz;\n const euler = new Euler(window.rotation[0], window.rotation[1], window.rotation[2] + foundation.rotation[2], 'ZXY');\n const normal = new Vector3(0, 0, 1).applyEuler(euler);\n const v = new Vector3();\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n if (window.windowType === WindowType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n const dis = new Vector3(kx2, kz2, 0);\n dis.applyEuler(euler);\n v.set(position.x + dis.x, position.y + dis.y, position.z + dis.z);\n if (SolarRadiation.pointWithinArch(v, lx, lz, window.archHeight, position)) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (distanceToClosestObject(window.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n const dis = new Vector3(kx2, kz2, 0);\n dis.applyEuler(euler);\n v.set(position.x + dis.x, position.y + dis.y, position.z + dis.z);\n if (distanceToClosestObject(window.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { intensity: intensity, unitArea: dx * dz };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a pyramid roof,\n // along with the unit areas on the segments (which may differ)\n static computePyramidRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n flat: boolean,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n if (flat) {\n return SolarRadiation.computeFlatRoofSolarRadiationEnergy(\n now,\n world,\n sunDirection,\n roof,\n withoutOverhang,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n }\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n // find the position of the top point relative to the first edge point\n const m2 = (m * v20.dot(v10)) / length10;\n v20.normalize();\n v21.normalize();\n // find the normal vector of the plane (must normalize the cross product as it is not normalized!)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const v = new Vector3();\n const relativePolygon: Point2[] = [];\n const margin = 0.01;\n relativePolygon.push({ x: -margin, y: -margin } as Point2);\n relativePolygon.push({ x: m + margin, y: -margin } as Point2);\n relativePolygon.push({ x: m2, y: n + margin } as Point2);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n let within = true;\n if (withoutOverhang) {\n within = Util.isPointInside(p, q, relativePolygon);\n }\n if (within) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a hip roof,\n // along with the unit areas on the segments (which may differ)\n static computeHipRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n flat: boolean,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n if (flat) {\n return SolarRadiation.computeFlatRoofSolarRadiationEnergy(\n now,\n world,\n sunDirection,\n roof,\n withoutOverhang,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n }\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n // find the position of the top point relative to the first edge point\n const m2 = (m * v20.dot(v10)) / length10;\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n // (must normalize the cross product of two normalized vectors as it is not automatically normalized)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n const v = new Vector3();\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const projectedVertices: Point2[] = [];\n for (const t of s) {\n projectedVertices.push({ x: t.x, y: t.y } as Point2);\n }\n if (index % 2 === 0) {\n // even number (0, 2) are quads, odd number (1, 3) are triangles\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n let within = true;\n if (withoutOverhang) {\n within = Util.isPointInside(v.x, v.y, projectedVertices);\n }\n if (within) {\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n const relativePolygon: Point2[] = [];\n const margin = 0.01;\n relativePolygon.push({ x: -margin, y: -margin } as Point2);\n relativePolygon.push({ x: m + margin, y: -margin } as Point2);\n relativePolygon.push({ x: m2, y: n + margin } as Point2);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n let within = true;\n if (withoutOverhang) {\n within = Util.isPointInside(p, q, relativePolygon);\n }\n if (within) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a gambrel roof,\n // along with the unit areas on the segments (which may differ)\n static computeGambrelRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n flat: boolean,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n if (flat) {\n return SolarRadiation.computeFlatRoofSolarRadiationEnergy(\n now,\n world,\n sunDirection,\n roof,\n withoutOverhang,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n }\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a mansard roof,\n // along with the unit areas on the segments (which may differ)\n static computeMansardRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n flat: boolean,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n if (flat) {\n return SolarRadiation.computeFlatRoofSolarRadiationEnergy(\n now,\n world,\n sunDirection,\n roof,\n withoutOverhang,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n }\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n // start with the top surface\n if (index === segments.length - 1) {\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const h0 = s[0].z;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n segmentUnitAreas.push(dx * dy);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n segmentIntensities.push(intensity);\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n minX + cellSize / 2,\n minY + cellSize / 2,\n foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n const v = new Vector3(0, 0, v0.z);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n v.y = v0.y + q * dy;\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n } else {\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n static computeFlatRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const s of segments) {\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n segmentIntensities.push(intensity);\n segmentUnitAreas.push(dx * dy);\n const h0 = segments[0][0].z;\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n minX + cellSize / 2,\n minY + cellSize / 2,\n foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n const v = new Vector3(0, 0, v0.z);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n v.y = v0.y + q * dy;\n // TODO: Check if this works when windows on flat roofs are implemented\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(roof.id, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a gable roof,\n // along with the unit areas on the segments (which may differ)\n static computeGableRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n static isPointRoof(\n v: Vector3,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n foundation: FoundationModel,\n ): boolean {\n if (windows && windows.length > 0) {\n for (const w of windows) {\n const vertices = RoofUtil.getAbsoluteWindowVerticesOnRoof(w as WindowModel, foundation);\n const points = Util.getPoints(vertices);\n if (Util.isPointInside(v.x, v.y, points)) {\n return false;\n }\n }\n }\n if (solarPanels && solarPanels.length > 0) {\n for (const sp of solarPanels) {\n const vertices = RoofUtil.getAbsoluteSolarPanelVerticesOnRoof(sp as SolarPanelModel, foundation);\n const points = Util.getPoints(vertices);\n if (Util.isPointInside(v.x, v.y, points)) {\n return false;\n }\n }\n }\n return true;\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport * as Selector from '../stores/selector';\nimport { RoofModel, RoofType } from '../models/RoofModel';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { DiurnalTemperatureModel, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { MINUTES_OF_DAY } from './analysisConstants';\nimport { WallFill, WallModel, WallStructure } from '../models/WallModel';\nimport {\n computeOutsideTemperature,\n getGroundTemperatureAtMinute,\n getLightAbsorption,\n getOutsideTemperatureAtMinute,\n U_VALUE_OPENING,\n} from './heatTools';\nimport {\n computeDeclinationAngle,\n computeHourAngle,\n computeSunLocation,\n computeSunriseAndSunsetInMinutes,\n} from './sunTools';\nimport { WindowModel } from '../models/WindowModel';\nimport { DoorModel } from '../models/DoorModel';\nimport { Point2 } from '../models/Point2';\nimport { useThree } from '@react-three/fiber';\nimport { Intersection, Object3D, Raycaster, Vector3 } from 'three';\nimport { SolarRadiation } from './SolarRadiation';\nimport {\n DEFAULT_CEILING_R_VALUE,\n DEFAULT_DOOR_U_VALUE,\n DEFAULT_FOUNDATION_SLAB_DEPTH,\n DEFAULT_GROUND_FLOOR_R_VALUE,\n DEFAULT_ROOF_R_VALUE,\n DEFAULT_WALL_R_VALUE,\n DEFAULT_WINDOW_U_VALUE,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { PvModel } from '../models/PvModel';\nimport { SunMinutes } from './SunMinutes';\nimport { useDataStore } from '../stores/commonData';\nimport { RoofUtil } from '../views/roof/RoofUtil';\n\ninterface ThermalSimulationProps {\n city: string | null;\n}\n\ninterface RoofSegmentResult {\n surfaceTemperature: number;\n totalArea: number;\n}\n\nconst ThermalSimulation = ({ city }: ThermalSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const getWeather = useStore(Selector.getWeather);\n const getFoundation = useStore(Selector.getFoundation);\n const getParent = useStore(Selector.getParent);\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const getPvModule = useStore(Selector.getPvModule);\n const setHeatmap = useDataStore(Selector.setHeatmap);\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\n const getRoofSegmentVertices = useDataStore(Selector.getRoofSegmentVertices);\n const setHourlyHeatExchangeArray = useDataStore(Selector.setHourlyHeatExchangeArray);\n const setHourlySolarHeatGainArray = useDataStore(Selector.setHourlySolarHeatGainArray);\n const setHourlySolarPanelOutputArray = useDataStore(Selector.setHourlySolarPanelOutputArray);\n\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const runDailySimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailyThermalSimulation);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlyThermalSimulation);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlyThermalSimulation);\n\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const noAnimation = !!world.noAnimationForThermalSimulation;\n const highestTemperatureTimeInMinutes = world.highestTemperatureTimeInMinutes ?? 900;\n\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n const dayRef = useRef(0);\n const outsideTemperatureRangeRef = useRef<{ high: number; low: number }>({ high: 20, low: 0 });\n const currentOutsideTemperatureRef = useRef(20);\n const currentGroundTemperatureRef = useRef(20);\n const hourlyHeatExchangeArrayMapRef = useRef>(new Map());\n const hourlySolarHeatGainArrayMapRef = useRef>(new Map());\n const hourlySolarPanelOutputArrayMapRef = useRef>(new Map());\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const sunDirectionRef = useRef();\n const sunMinutesRef = useRef();\n const scaleFactorRef = useRef(0);\n const solarHeatmapRef = useRef>(new Map());\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const timesPerHour = world.timesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.daysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const { scene } = useThree();\n const ray = useMemo(() => new Raycaster(), []);\n\n const calculateSunDirection = () => {\n return computeSunLocation(\n 1,\n computeHourAngle(now),\n computeDeclinationAngle(now),\n Util.toRadians(world.latitude),\n ).normalize();\n };\n\n // return -1 if exposed to sunlight, otherwise return the distance of the closest object\n const distanceToClosestObject = (elementId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== elementId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n if (intersectionsRef.current.length > 0) {\n return intersectionsRef.current[0].distance;\n }\n }\n return -1;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const updateTemperature = (currentTime: Date) => {\n if (weather) {\n // get the highest and lowest temperatures of the day from the weather data\n outsideTemperatureRangeRef.current = computeOutsideTemperature(\n now,\n weather.lowestTemperatures,\n weather.highestTemperatures,\n );\n // get the air temperature at the current time\n const minutes = Util.minutesIntoDay(currentTime);\n currentOutsideTemperatureRef.current = getOutsideTemperatureAtMinute(\n outsideTemperatureRangeRef.current.high,\n outsideTemperatureRangeRef.current.low,\n world.diurnalTemperatureModel ?? DiurnalTemperatureModel.Sinusoidal,\n highestTemperatureTimeInMinutes,\n computeSunriseAndSunsetInMinutes(currentTime, world.latitude),\n minutes,\n );\n currentGroundTemperatureRef.current = getGroundTemperatureAtMinute(\n world.latitude,\n Util.dayOfYear(now),\n minutes,\n weather.lowestTemperatures,\n weather.highestTemperatures,\n highestTemperatureTimeInMinutes,\n 0.5 * (outsideTemperatureRangeRef.current.high - outsideTemperatureRangeRef.current.low),\n world.ground.thermalDiffusivity ?? 0.05,\n DEFAULT_FOUNDATION_SLAB_DEPTH,\n );\n }\n };\n\n // update the heat exchange through an element that is part of a building envelope\n const updateHeatExchangeNow = (id: string, heatExchange: number) => {\n let a = hourlyHeatExchangeArrayMapRef.current.get(id);\n if (!a) {\n // initialize\n a = new Array(24).fill(0);\n hourlyHeatExchangeArrayMapRef.current.set(id, a);\n }\n // sum the results sampled over an hour\n a[now.getHours()] += heatExchange;\n };\n\n // update solar heat gain for a building represented by the foundation's ID\n const updateSolarHeatGainNow = (id: string, gain: number) => {\n let a = hourlySolarHeatGainArrayMapRef.current.get(id);\n if (!a) {\n // initialize (polar areas may have 24 sunlight in the summer)\n a = new Array(24).fill(0);\n hourlySolarHeatGainArrayMapRef.current.set(id, a);\n }\n // sum the results sampled over an hour\n a[now.getHours()] += gain;\n };\n\n // update solar panel output for a building represented by the foundation's ID\n const updateSolarPanelOutputNow = (id: string, output: number) => {\n let a = hourlySolarPanelOutputArrayMapRef.current.get(id);\n if (!a) {\n // initialize (polar areas may have 24 sunlight in the summer)\n a = new Array(24).fill(0);\n hourlySolarPanelOutputArrayMapRef.current.set(id, a);\n }\n // sum the results sampled over an hour\n a[now.getHours()] += output;\n };\n\n const resetHourlyMaps = () => {\n for (const e of elements) {\n if (Util.onBuildingEnvelope(e)) {\n hourlyHeatExchangeArrayMapRef.current.get(e.id)?.fill(0);\n }\n if (e.type === ObjectType.Roof) {\n for (const key of hourlyHeatExchangeArrayMapRef.current.keys()) {\n if (key !== e.id && key.startsWith(e.id)) {\n hourlyHeatExchangeArrayMapRef.current.get(key)?.fill(0);\n }\n }\n }\n if (e.type === ObjectType.Foundation) {\n hourlySolarHeatGainArrayMapRef.current.get(e.id)?.fill(0);\n hourlySolarPanelOutputArrayMapRef.current.get(e.id)?.fill(0);\n }\n }\n };\n\n const resetSolarHeatMaps = () => {\n // must clear the map to allow the array to be recreated in case the dimensions will change\n solarHeatmapRef.current.clear();\n };\n\n /* do the daily simulation to generate hourly data and daily total */\n\n useEffect(() => {\n if (runDailySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticCalculateDaily();\n } else {\n fetchObjects();\n initDaily();\n requestRef.current = requestAnimationFrame(calculateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // continue the simulation\n calculateDaily();\n }\n }, [pauseDailySimulation]);\n\n // TODO\n const staticCalculateDaily = () => {\n computeNow();\n };\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n dayRef.current = Util.dayOfYear(now);\n // start from minuteInterval/2 so that the sampling points are evenly distributed within an hour\n now.setHours(0, minuteInterval / 2);\n }\n simulationCompletedRef.current = false;\n resetHourlyMaps();\n resetSolarHeatMaps();\n };\n\n const finishDaily = () => {\n // store the results in the common store for other components to use\n for (const e of elements) {\n // heat exchanges through individual elements on a building envelope\n if (Util.onBuildingEnvelope(e) || e.type === ObjectType.SolarPanel) {\n const arr = hourlyHeatExchangeArrayMapRef.current.get(e.id);\n if (arr) {\n setHourlyHeatExchangeArray(e.id, [...arr]);\n }\n // send a copy of the solar heatmap data to common store for visualization\n const heatmap = solarHeatmapRef.current.get(e.id);\n if (heatmap) {\n setHeatmap(\n e.id,\n heatmap.map((a) => [...a]),\n );\n }\n }\n // heat exchange for each roof segment\n if (e.type === ObjectType.Roof) {\n for (const key of hourlyHeatExchangeArrayMapRef.current.keys()) {\n if (key !== e.id && key.startsWith(e.id)) {\n const arr = hourlyHeatExchangeArrayMapRef.current.get(key);\n if (arr) {\n setHourlyHeatExchangeArray(key, [...arr]);\n }\n // send the solar heatmap data to common store for visualization\n const heatmap = solarHeatmapRef.current.get(key);\n if (heatmap) {\n setHeatmap(\n key,\n heatmap.map((a) => [...a]),\n );\n }\n }\n }\n }\n // the total solar heat gain through all the windows on a foundation\n // the total solar panel output through all the solar panels on a foundation\n if (e.type === ObjectType.Foundation) {\n let arr = hourlySolarHeatGainArrayMapRef.current.get(e.id);\n if (arr) {\n setHourlySolarHeatGainArray(e.id, [...arr]);\n }\n arr = hourlySolarPanelOutputArrayMapRef.current.get(e.id);\n if (arr) {\n setHourlySolarPanelOutputArray(e.id, [...arr]);\n }\n }\n }\n usePrimitiveStore.setState((state) => {\n state.flagOfDailySimulation = !state.flagOfDailySimulation;\n if (!state.runYearlyThermalSimulation) {\n state.showSolarRadiationHeatmap = true;\n state.showHeatFluxes = true;\n }\n });\n if (loggable && !runYearlySimulation) {\n // setTimeout callback will run asynchronously after finishing current execution stack,\n // which is equivalent to waiting for the results to show up in the data store.\n setTimeout(() => {\n setCommonStore((state) => {\n const heater = useDataStore.getState().totalBuildingHeater;\n const ac = useDataStore.getState().totalBuildingAc;\n const solarPanel = useDataStore.getState().totalBuildingSolarPanel;\n state.actionInfo = {\n name: 'Daily Building Energy Analysis Completed',\n result: {\n Heater: heater.toFixed(2),\n AC: ac.toFixed(2),\n SolarPanel: solarPanel.toFixed(2),\n Net: (heater + ac - solarPanel).toFixed(2),\n },\n timestamp: new Date().getTime(),\n };\n });\n }, 10);\n }\n };\n\n const calculateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes =\n now.getMinutes() + now.getHours() * 60 + (Util.dayOfYear(now) - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval > MINUTES_OF_DAY) {\n computeNow();\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyBuildingEnergyPanel = true;\n state.selectedFloatingWindow = 'dailyBuildingEnergyPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailyThermalSimulation = false;\n state.simulationPaused = false;\n state.simulationInProgress = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n return;\n }\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n computeNow();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(calculateDaily);\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n }\n };\n\n // yearly simulation\n\n const [monthIndex, setMonthIndex] = useState(now.getMonth());\n\n useEffect(() => {\n // give it some time for the scene to update as a result of month change\n setTimeout(() => {\n fetchObjects();\n }, 200);\n }, [monthIndex]);\n\n useEffect(() => {\n if (runYearlySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n //staticSimulateYearly(false);\n }, 50);\n } else {\n initYearly();\n setMonthIndex(now.getMonth());\n fetchObjects(); // ensure that the objects are fetched if the initial date happens to be in January\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n dayRef.current = Util.dayOfYear(now);\n now.setHours(0, minuteInterval / 2);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.viewState.showYearlyBuildingEnergyPanel = true;\n state.selectedFloatingWindow = 'yearlyBuildingEnergyPanel';\n state.world.date = now.toLocaleString('en-US');\n });\n }\n resetHourlyMaps();\n resetSolarHeatMaps();\n simulationCompletedRef.current = false;\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes =\n now.getMinutes() + now.getHours() * 60 + (Util.dayOfYear(now) - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes < MINUTES_OF_DAY + minuteInterval / 2) {\n // this is where time advances (by incrementing the minutes with the given interval)\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n computeNow();\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishDaily();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlyThermalSimulation = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n if (loggable) {\n setTimeout(() => {\n setCommonStore((state) => {\n const heater = useDataStore.getState().totalBuildingHeater;\n const ac = useDataStore.getState().totalBuildingAc;\n const solarPanel = useDataStore.getState().totalBuildingSolarPanel;\n state.actionInfo = {\n name: 'Yearly Building Energy Analysis Completed',\n result: {\n Heater: heater.toFixed(2),\n AC: ac.toFixed(2),\n SolarPanel: solarPanel.toFixed(2),\n Net: (heater + ac - solarPanel).toFixed(2),\n },\n timestamp: new Date().getTime(),\n };\n });\n }, 10);\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n now.setHours(0, minuteInterval / 2);\n setMonthIndex(now.getMonth());\n dayRef.current = Util.dayOfYear(now);\n resetHourlyMaps();\n resetSolarHeatMaps();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n // functions shared by daily and yearly simulations\n\n const computeNow = () => {\n updateTemperature(now);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n const daylight = sunMinutesRef.current.daylight() / 60;\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divide by times per hour as the radiation is added up that many times)\n scaleFactorRef.current =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n sunDirectionRef.current = calculateSunDirection();\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Door:\n calculateDoor(e as DoorModel);\n break;\n case ObjectType.Window:\n calculateWindow(e as WindowModel);\n calculateSolarHeatGain(e as WindowModel);\n break;\n case ObjectType.Wall:\n calculateWall(e as WallModel);\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n calculateRoof(roof);\n calculateFloor(roof);\n break;\n case ObjectType.SolarPanel:\n calculateSolarPanel(e as SolarPanelModel);\n break;\n }\n }\n };\n\n const getPanelEfficiency = (temperature: number, pvModel: PvModel) => {\n let e = pvModel.efficiency;\n if (pvModel.cellType === 'Monocrystalline') {\n e *= 0.95; // assuming that the packing density factor of semi-round cells is 0.95\n }\n return e * (1 + pvModel.pmaxTC * (temperature - 25));\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n if (!sunMinutesRef.current) throw new Error('sun minutes not set');\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (panel: SolarPanelModel) => {\n const pvModel = getPvModule(panel.pvModelName);\n if (!pvModel) throw new Error('PV model not found');\n return panel.lx * panel.ly * (panel.inverterEfficiency ?? 0.95) * (1 - monthlyIrradianceLosses[now.getMonth()]);\n };\n\n const calculateSolarPanel = (panel: SolarPanelModel) => {\n const foundation = getFoundation(panel);\n if (foundation) {\n const parent = getParent(panel);\n if (parent) {\n const pvModel = getPvModule(panel.pvModelName);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const results = SolarRadiation.computeSolarPanelOutput(\n now,\n world,\n sunDirectionRef.current,\n pvModel,\n panel,\n parent,\n foundation,\n elevation,\n distanceToClosestObject,\n );\n const factor =\n getPanelEfficiency(currentOutsideTemperatureRef.current, pvModel) *\n getTimeFactor() *\n getElementFactor(panel);\n updateSolarPanelOutputNow(foundation.id, results.average * factor);\n // sum up the solar radiation intensity for generating the solar heatmap\n if (runDailySimulation) {\n for (let i = 0; i < results.heatmap.length; i++) {\n for (let j = 0; j < results.heatmap[i].length; j++) {\n results.heatmap[i][j] *= scaleFactorRef.current;\n }\n }\n const solarHeatmap = solarHeatmapRef.current.get(panel.id);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(panel.id, [...results.heatmap]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += results.heatmap[i][j];\n }\n }\n }\n }\n }\n }\n }\n };\n\n const calculateWindow = (window: WindowModel) => {\n if (window.interior) return;\n const foundation = getFoundation(window);\n if (foundation) {\n const parent = getParent(window);\n if (parent) {\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n const area = Util.getWindowArea(window, window.parentType === ObjectType.Roof ? undefined : parent);\n const deltaT = currentOutsideTemperatureRef.current - setpoint;\n // convert heat exchange to kWh\n if (window.empty) {\n // use a large U-value for an open door (not meant to be accurate, but as an indicator of something wrong)\n updateHeatExchangeNow(window.id, (deltaT * area * U_VALUE_OPENING * 0.001) / timesPerHour);\n } else {\n updateHeatExchangeNow(\n window.id,\n (deltaT * area * (window.uValue ?? DEFAULT_WINDOW_U_VALUE) * 0.001) / timesPerHour,\n );\n }\n }\n }\n };\n\n const calculateSolarHeatGain = (window: WindowModel) => {\n if (window.interior) return;\n const foundation = getFoundation(window);\n if (foundation) {\n const parent = getParent(window);\n if (parent) {\n let totalSolarHeat = 0;\n if (window.parentType === ObjectType.Roof) {\n const segmentsWithoutOverhang = getRoofSegmentVerticesWithoutOverhang(parent.id);\n if (!segmentsWithoutOverhang) return;\n // go over roof segments\n for (let i = 0; i < segmentsWithoutOverhang.length; i++) {\n if (RoofUtil.onSegment(segmentsWithoutOverhang[i], window.cx, window.cy)) {\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n // compute solar radiation through skylight windows\n const results = SolarRadiation.computeRoofWindowSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n window,\n parent as RoofModel,\n foundation,\n elevation,\n distanceToClosestObject,\n );\n for (let i = 0; i < results.intensity.length; i++) {\n for (let j = 0; j < results.intensity[i].length; j++) {\n results.intensity[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeat += results.intensity[i][j] * results.unitArea; // for energy calculation\n }\n }\n // how much solar energy can go through the window (SHGC)\n totalSolarHeat *= window.empty ? 1 : 1 - window.opacity;\n }\n break;\n }\n }\n } else {\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const results = SolarRadiation.computeWallWindowSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n window,\n parent as WallModel,\n foundation,\n elevation,\n distanceToClosestObject,\n );\n for (let i = 0; i < results.intensity.length; i++) {\n for (let j = 0; j < results.intensity[i].length; j++) {\n results.intensity[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeat += results.intensity[i][j] * results.unitArea; // for energy calculation\n }\n }\n // how much solar energy can go through the window (SHGC)\n totalSolarHeat *= window.empty ? 1 : 1 - window.opacity;\n }\n }\n updateSolarHeatGainNow(foundation.id, totalSolarHeat / timesPerHour);\n }\n }\n };\n\n const calculateDoor = (door: DoorModel) => {\n if (door.interior) return;\n const foundation = getFoundation(door);\n if (foundation) {\n const parent = getParent(door);\n if (parent) {\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n const area = Util.getDoorArea(door, parent);\n if (door.filled) {\n const absorption = getLightAbsorption(door);\n let totalSolarHeat = 0;\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const results = SolarRadiation.computeDoorSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n door,\n parent as WallModel,\n foundation,\n elevation,\n distanceToClosestObject,\n );\n for (let i = 0; i < results.intensity.length; i++) {\n for (let j = 0; j < results.intensity[i].length; j++) {\n results.intensity[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeat += results.intensity[i][j] * results.unitArea; // for energy calculation\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap\n if (runDailySimulation) {\n const solarHeatmap = solarHeatmapRef.current.get(door.id);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(door.id, [...results.intensity]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += results.intensity[i][j];\n }\n }\n }\n }\n }\n const extraT =\n Util.isZero(totalSolarHeat) || Util.isZero(absorption)\n ? 0\n : (totalSolarHeat * absorption) / ((door.volumetricHeatCapacity ?? 0.5) * area * Math.max(door.ly, 0.1));\n const deltaT = currentOutsideTemperatureRef.current + extraT - setpoint;\n // convert heat exchange to kWh\n updateHeatExchangeNow(\n door.id,\n (deltaT * area * (door.uValue ?? DEFAULT_DOOR_U_VALUE) * 0.001) / timesPerHour,\n );\n } else {\n const deltaT = currentOutsideTemperatureRef.current - setpoint;\n // use a large U-value for an open door (not meant to be accurate, but as an indicator of something wrong)\n updateHeatExchangeNow(door.id, (deltaT * area * U_VALUE_OPENING * 0.001) / timesPerHour);\n }\n }\n }\n };\n\n const calculateWall = (wall: WallModel) => {\n const foundation = getFoundation(wall);\n if (foundation) {\n const filled = wall.fill !== WallFill.Empty && wall.wallStructure === WallStructure.Default;\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n if (filled) {\n const partial = wall.fill === WallFill.Partial && !Util.isPartialWallFull(wall);\n const frameVertices = Util.getWallVertices(wall, 0);\n const partialWallVertices = partial ? Util.getPartialWallVertices(wall, 0) : frameVertices;\n const frameArea = Util.getPolygonArea(frameVertices);\n let filledArea = partial ? Util.getPolygonArea(partialWallVertices) : frameArea;\n const windows = getChildrenOfType(ObjectType.Window, wall.id);\n const doors = getChildrenOfType(ObjectType.Door, wall.id);\n const absorption = getLightAbsorption(wall);\n let totalSolarHeat = 0;\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const rectangular = (partial ? partialWallVertices.length : frameVertices.length) === 4;\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, wall.id);\n const results = SolarRadiation.computeWallSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n wall,\n foundation,\n windows,\n doors,\n solarPanels,\n rectangular ? 0 : 1,\n elevation,\n distanceToClosestObject,\n );\n for (let i = 0; i < results.intensity.length; i++) {\n for (let j = 0; j < results.intensity[i].length; j++) {\n results.intensity[i][j] *= scaleFactorRef.current;\n totalSolarHeat += results.intensity[i][j] * results.unitArea;\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap\n if (runDailySimulation) {\n for (let i = 0; i < results.heatmap.length; i++) {\n for (let j = 0; j < results.heatmap[i].length; j++) {\n results.heatmap[i][j] *= scaleFactorRef.current;\n }\n }\n const solarHeatmap = solarHeatmapRef.current.get(wall.id);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(wall.id, [...results.heatmap]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += results.heatmap[i][j];\n }\n }\n }\n }\n }\n if (windows && windows.length > 0) {\n for (const w of windows) {\n filledArea -= Util.getWindowArea(w as WindowModel, wall);\n }\n }\n if (doors && doors.length > 0) {\n for (const d of doors) {\n filledArea -= d.lx * d.lz * wall.lx * wall.lz;\n }\n }\n const extraT =\n Util.isZero(totalSolarHeat) || Util.isZero(absorption)\n ? 0\n : (totalSolarHeat * absorption) / ((wall.volumetricHeatCapacity ?? 0.5) * filledArea * wall.ly);\n const deltaT = currentOutsideTemperatureRef.current + extraT - setpoint;\n // U is the inverse of R with SI units of W/(m^2⋅K), we convert the energy unit to kWh here\n let heatExchange = (((deltaT * filledArea) / (wall.rValue ?? DEFAULT_WALL_R_VALUE)) * 0.001) / timesPerHour;\n if (partial && wall.openToOutside) {\n // use a large U-value for the open area (not meant to be accurate, but as an indicator of something wrong)\n heatExchange +=\n ((currentOutsideTemperatureRef.current - setpoint) * (frameArea - filledArea) * U_VALUE_OPENING * 0.001) /\n timesPerHour;\n }\n updateHeatExchangeNow(wall.id, heatExchange);\n } else {\n if (wall.openToOutside) {\n const wallVertices = Util.getWallVertices(wall, 0);\n const area = Util.getPolygonArea(wallVertices);\n const deltaT = currentOutsideTemperatureRef.current - setpoint;\n // use a large U-value for an open wall (not meant to be accurate, but as an indicator of something wrong)\n updateHeatExchangeNow(wall.id, (deltaT * area * U_VALUE_OPENING * 0.001) / timesPerHour);\n }\n }\n }\n };\n\n const calculateFloor = (roof: RoofModel) => {\n const foundation = getFoundation(roof);\n if (!foundation) return;\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n const floorArea = Util.calculateBuildingArea(roof);\n const deltaT = currentGroundTemperatureRef.current - setpoint;\n updateHeatExchangeNow(\n foundation.id,\n (((deltaT * floorArea) / (foundation.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE)) * 0.001) / timesPerHour,\n );\n };\n\n /* Approximate the attic temperature based on the insulation values of the roof and the ceiling.\n 1) if the R-values are the same, the attic temperature is the mean temperature between inside and outside\n 2) if the R-value of the roof is higher, the attic temperature is closer to the inside temperature\n 3) if the R-value of the roof is lower, the attic temperature is closer to the outside temperature\n */\n const calculateAtticTemperature = (roof: RoofModel, outsideTemperature: number, setpoint: number) => {\n const roofU = 1 / (roof.rValue ?? DEFAULT_ROOF_R_VALUE);\n const ceilingU = 1 / (roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\n return (roofU * outsideTemperature + ceilingU * setpoint) / (roofU + ceilingU);\n };\n\n const calculateRoof = (roof: RoofModel) => {\n const foundation = getFoundation(roof);\n if (!foundation) return;\n const segmentsWithoutOverhang = getRoofSegmentVerticesWithoutOverhang(roof.id);\n if (!segmentsWithoutOverhang) return;\n let roofSegmentResults = undefined;\n switch (roof.roofType) {\n case RoofType.Pyramid:\n roofSegmentResults = calculatePyramidRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n case RoofType.Hip:\n roofSegmentResults = calculateHipRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n case RoofType.Gable:\n roofSegmentResults = calculateGableRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n case RoofType.Gambrel:\n roofSegmentResults = calculateGambrelRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n case RoofType.Mansard:\n roofSegmentResults = calculateMansardRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n }\n if (roofSegmentResults) {\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n let heatExchange = 0;\n for (const [i, segmentResult] of roofSegmentResults.entries()) {\n const deltaT =\n segmentResult.surfaceTemperature -\n (roof.ceiling ? calculateAtticTemperature(roof, segmentResult.surfaceTemperature, setpoint) : setpoint);\n // convert heat exchange to kWh\n const segmentHeatExchange =\n (((deltaT * segmentResult.totalArea) / (roof.rValue ?? DEFAULT_ROOF_R_VALUE)) * 0.001) / timesPerHour;\n updateHeatExchangeNow(roof.id + '-' + i, segmentHeatExchange);\n heatExchange += segmentHeatExchange;\n }\n updateHeatExchangeNow(roof.id, heatExchange);\n }\n };\n\n const calculatePyramidRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Pyramid) throw new Error('roof is not pyramid');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segmentsWithoutOverhang[0][0].z;\n for (const s of segmentsWithoutOverhang) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n const m = flat ? 1 : n;\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n const totalAreas: number[] = [];\n if (flat) {\n let a = 0;\n for (const s of segmentsWithoutOverhang) {\n const points: Point2[] = [];\n for (const v of s) {\n points.push(Util.mapVector3ToPoint2(v));\n }\n a += Util.getPolygonArea(points);\n }\n if (windows.length > 0) {\n for (const w of windows) {\n a -= w.lx * w.lz;\n }\n if (a < 0) a = 0; // just in case\n }\n totalAreas.push(a);\n } else {\n for (const s of segmentsWithoutOverhang) {\n let a = Util.getTriangleArea(s[0], s[1], s[2]);\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n totalAreas.push(a);\n }\n }\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(m).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computePyramidRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const heatmapResults = SolarRadiation.computePyramidRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n const uid = m === 1 ? roof.id : roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(m).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < m; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n const calculateHipRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Hip) throw new Error('roof is not hip');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segmentsWithoutOverhang[0][0].z;\n for (const s of segmentsWithoutOverhang) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n const m = flat ? 1 : n;\n const areas: number[] = [];\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n for (const s of segmentsWithoutOverhang) {\n let a = 0;\n if (s.length === 3) {\n a = Util.getTriangleArea(s[0], s[1], s[2]);\n } else if (s.length === 4) {\n a = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\n }\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n areas.push(a);\n }\n const totalAreas: number[] = flat ? [areas.reduce((x, y) => x + y, 0)] : areas;\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(m).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computeHipRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const heatmapResults = SolarRadiation.computeHipRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n const uid = m === 1 ? roof.id : roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(m).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < m; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n const calculateGambrelRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Gambrel) throw new Error('roof is not gambrel');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segmentsWithoutOverhang[0][0].z;\n for (const s of segmentsWithoutOverhang) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n const m = flat ? 1 : n;\n const areas: number[] = [];\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n for (const s of segmentsWithoutOverhang) {\n let a = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n areas.push(a);\n }\n const totalAreas: number[] = flat ? [areas.reduce((x, y) => x + y, 0)] : areas;\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(m).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computeGambrelRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const heatmapResults = SolarRadiation.computeGambrelRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n // if the length is one, it is a flat roof\n const uid = m === 1 ? roof.id : roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(m).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < m; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n const calculateMansardRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Mansard) throw new Error('roof is not mansard');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segmentsWithoutOverhang[0][0].z;\n for (const s of segmentsWithoutOverhang) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n const m = flat ? 1 : n;\n const areas: number[] = [];\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n for (let i = 0; i < n - 1; i++) {\n const s = segmentsWithoutOverhang[i];\n let a = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n areas.push(a);\n }\n // the last segment may not be a quad\n const s = segmentsWithoutOverhang[n - 1];\n const points = new Array();\n for (const p of s) {\n points.push({ x: p.x, y: p.y } as Point2);\n }\n let a = Util.getPolygonArea(points);\n if (windows.length > 0) {\n for (let iw = windows.length - 1; iw >= 0; iw--) {\n const w = windows[iw];\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n windows.splice(iw, 1);\n }\n }\n if (a < 0) a = 0; // just in case\n }\n areas.push(a);\n const totalAreas: number[] = flat ? [areas.reduce((x, y) => x + y, 0)] : areas;\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(m).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computeMansardRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const heatmapResults = SolarRadiation.computeMansardRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n // if the length is one, it is a flat roof\n const uid = m === 1 ? roof.id : roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(m).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < m; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n // gable roofs are treated as a special case\n const calculateGableRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Gable) throw new Error('roof is not gable');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n const totalAreas: number[] = [];\n for (const s of segmentsWithoutOverhang) {\n let a = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n totalAreas.push(a);\n }\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(n).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computeGableRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < n; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const heatmapResults = SolarRadiation.computeGableRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < n; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n const uid = roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(n).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < n; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n return <>;\n};\n\nexport default React.memo(ThermalSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n getSunDirection,\n ROOFTOP_SOLAR_PANEL_OFFSET,\n} from './sunTools';\nimport { Euler, Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { ObjectType, SolarStructure, TrackerType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport {\n HALF_PI,\n UNIT_VECTOR_NEG_X,\n UNIT_VECTOR_NEG_Y,\n UNIT_VECTOR_POS_X,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { CuboidModel } from '../models/CuboidModel';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { WallModel } from '../models/WallModel';\nimport { RoofModel, RoofType } from '../models/RoofModel';\nimport { DoorModel, DoorType } from '../models/DoorModel';\nimport { SolarRadiation } from './SolarRadiation';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface StaticSolarRadiationSimulationProps {\n city: string | null;\n}\n\n// note that this cannot be used for anything related to CSP as CPS must move to track or reflect the sun\n// for the same reason, this cannot be used for PV with trackers.\n\nconst StaticSolarRadiationSimulation = ({ city }: StaticSolarRadiationSimulationProps) => {\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const setHeatmap = useDataStore(Selector.setHeatmap);\n const clearHeatmaps = useDataStore(Selector.clearHeatmaps);\n const runSimulation = usePrimitiveStore(Selector.runStaticSimulation);\n const getRoofSegmentVertices = useDataStore(Selector.getRoofSegmentVertices);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const interval = 60 / world.timesPerHour;\n const ray = useMemo(() => new Raycaster(), []);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n\n useEffect(() => {\n if (runSimulation) {\n if (elements && elements.length > 0) {\n clearHeatmaps();\n generateHeatmaps();\n usePrimitiveStore.setState((state) => {\n state.runStaticSimulation = false;\n state.simulationInProgress = false;\n state.showSolarRadiationHeatmap = true;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runSimulation]);\n\n const inShadow = (elementId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== elementId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n // console.log(objectsRef.current)\n }\n };\n\n const generateHeatmaps = () => {\n fetchObjects();\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Foundation:\n const f = e as FoundationModel;\n generateHeatmapForFoundation(f);\n if (f.solarStructure === SolarStructure.UpdraftTower) {\n generateHeatmapForSolarUpdraftTower(f);\n }\n break;\n case ObjectType.Cuboid:\n generateHeatmapForCuboid(e as CuboidModel);\n break;\n case ObjectType.SolarPanel:\n generateHeatmapForSolarPanel(e as SolarPanelModel);\n break;\n case ObjectType.Wall:\n generateHeatmapForWall(e as WallModel);\n break;\n case ObjectType.Door:\n generateHeatmapForDoor(e as DoorModel);\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n switch (roof.roofType) {\n case RoofType.Pyramid:\n generateHeatmapForPyramidRoof(roof);\n break;\n case RoofType.Gable:\n generateHeatmapForGableRoof(roof);\n break;\n case RoofType.Gambrel:\n generateHeatmapForGambrelRoof(roof);\n break;\n case RoofType.Mansard:\n generateHeatmapForMansardRoof(roof);\n break;\n case RoofType.Hip:\n generateHeatmapForHipRoof(roof);\n break;\n }\n break;\n }\n }\n };\n\n const generateHeatmapForCuboid = (cuboid: CuboidModel) => {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = cuboid.lx;\n const ly = cuboid.ly;\n const lz = cuboid.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const ny = Math.max(2, Math.round(ly / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const dz = lz / nz;\n const parent = getParent(cuboid);\n let cx = cuboid.cx;\n let cy = cuboid.cy;\n let cz = cuboid.cz;\n if (parent && parent.type === ObjectType.Cuboid) {\n const worldData = Util.getWorldDataById(cuboid.id);\n cx = worldData.pos.x;\n cy = worldData.pos.y;\n cz = worldData.pos.z;\n }\n const topCellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n const southCellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n const northCellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let westCellOutputTotals = Array(ny)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let eastCellOutputTotals = Array(ny)\n .fill(0)\n .map(() => Array(nz).fill(0));\n\n const normalTop = UNIT_VECTOR_POS_Z;\n const normalSouth = UNIT_VECTOR_NEG_Y.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalNorth = UNIT_VECTOR_POS_Y.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalWest = UNIT_VECTOR_NEG_X.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalEast = UNIT_VECTOR_POS_X.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n\n const vec = new Vector3();\n let count = 0;\n const center2d = new Vector2(cx, cy);\n const v2 = new Vector2();\n const southY = cy - ly / 2;\n const northY = cy + ly / 2;\n const westX = cx - lx / 2;\n const eastX = cx + lx / 2;\n\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n\n // top face\n let indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalTop, peakRadiation);\n let dot = normalTop.dot(sunDirection);\n let uc = cx - lx / 2;\n let vc = cy - ly / 2;\n const topZ = cz + lz / 2;\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < ny; v++) {\n topCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, vc + (v + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, topZ);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n topCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // south face\n uc = cx - lx / 2;\n vc = cz - lz / 2;\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalSouth, peakRadiation);\n dot = normalSouth.dot(sunDirection);\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < nz; v++) {\n southCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, southY);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n southCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // north face\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalNorth, peakRadiation);\n dot = normalNorth.dot(sunDirection);\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < nz; v++) {\n northCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, northY);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (nz - (v + 0.5)) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n northCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // west face\n uc = cy - ly / 2;\n vc = cz - lz / 2;\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalWest, peakRadiation);\n dot = normalWest.dot(sunDirection);\n for (let u = 0; u < ny; u++) {\n for (let v = 0; v < nz; v++) {\n westCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(westX, uc + (u + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n westCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // east face\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalEast, peakRadiation);\n dot = normalEast.dot(sunDirection);\n for (let u = 0; u < ny; u++) {\n for (let v = 0; v < nz; v++) {\n eastCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(eastX, uc + (u + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n eastCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n\n westCellOutputTotals = Util.transpose(westCellOutputTotals);\n eastCellOutputTotals = Util.transpose(eastCellOutputTotals);\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(topCellOutputTotals, scaleFactor);\n applyScaleFactor(southCellOutputTotals, scaleFactor);\n applyScaleFactor(northCellOutputTotals, scaleFactor);\n applyScaleFactor(westCellOutputTotals, scaleFactor);\n applyScaleFactor(eastCellOutputTotals, scaleFactor);\n\n // send heat map data to common store for visualization\n setHeatmap(cuboid.id + '-top', topCellOutputTotals);\n setHeatmap(cuboid.id + '-south', southCellOutputTotals);\n setHeatmap(cuboid.id + '-north', northCellOutputTotals);\n setHeatmap(cuboid.id + '-west', westCellOutputTotals);\n setHeatmap(cuboid.id + '-east', eastCellOutputTotals);\n };\n\n const generateHeatmapForFoundation = (foundation: FoundationModel) => {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = foundation.lx;\n const ly = foundation.ly;\n const lz = foundation.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const ny = Math.max(2, Math.round(ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const x0 = foundation.cx - lx / 2;\n const y0 = foundation.cy - ly / 2;\n const center2d = new Vector2(foundation.cx, foundation.cy);\n const v = new Vector3();\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n let count = 0;\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n const v2 = new Vector2();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputTotals[kx][ky] += indirectRadiation;\n if (dot > 0) {\n v2.set(x0 + (kx + 0.5) * dx, y0 + (ky + 0.5) * dy);\n v2.rotateAround(center2d, foundation.rotation[2]);\n v.set(v2.x, v2.y, lz);\n if (!inShadow(foundation.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(foundation.id, cellOutputTotals);\n };\n\n const generateHeatmapForSolarUpdraftTower = (foundation: FoundationModel) => {\n const solarUpdraftTower = foundation.solarUpdraftTower;\n if (!solarUpdraftTower) return;\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const radius = solarUpdraftTower.collectorRadius;\n const max = Math.max(2, Math.round((radius * 2) / cellSize));\n // shift half cell size to the center of each grid cell\n const x0 = foundation.cx - radius + cellSize / 2;\n const y0 = foundation.cy - radius + cellSize / 2;\n const z0 = foundation.lz + solarUpdraftTower.collectorHeight;\n const cellOutputTotals = Array(max)\n .fill(0)\n .map(() => Array(max).fill(0));\n const v = new Vector3(0, 0, z0);\n const rsq = radius * radius;\n let count = 0;\n let dx, dy;\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let kx = 0; kx < max; kx++) {\n v.x = x0 + (kx + 0.5) * cellSize;\n dx = v.x - foundation.cx;\n for (let ky = 0; ky < max; ky++) {\n v.y = y0 + (ky + 0.5) * cellSize;\n dy = v.y - foundation.cy;\n if (dx * dx + dy * dy > rsq) continue;\n cellOutputTotals[kx][ky] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(foundation.id + '-sut', v, sunDirection)) {\n cellOutputTotals[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(foundation.id + '-sut', cellOutputTotals);\n };\n\n const generateHeatmapForSolarPanel = (panel: SolarPanelModel) => {\n if (panel.trackerType !== TrackerType.NO_TRACKER) throw new Error('trackers cannot use static simulation');\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n }\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, getFoundation(panel), panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const normal = new Vector3().fromArray(panel.normal);\n const rot = parent.rotation[2];\n let zRot = rot + panel.relativeAzimuth;\n let angle = panel.tiltAngle;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle and relative azimuth\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const foundation = getFoundation(parent);\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n // TODO: right now we assume a parent rotation is always around the z-axis\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof.\n // so we only need to tilt the normal for a solar panel on a foundation or flat roof\n const normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n normal.applyEuler(normalEuler);\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = panel.lx;\n const ly = panel.ly;\n const nx = Math.max(2, Math.round(panel.lx / cellSize));\n const ny = Math.max(2, Math.round(panel.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n let count = 0;\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputTotals[kx][ky] += indirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(panel.id, cellOutputTotals);\n };\n\n const generateHeatmapForWall = (wall: WallModel) => {\n const foundation = getFoundation(wall);\n if (!foundation) throw new Error('foundation of wall not found');\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = wall.lx; // width\n const lz = Util.getHighestPointOfWall(wall); // height\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, lz / 2), foundation).setZ(\n lz / 2 + foundation.lz,\n );\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const v = new Vector3();\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let count = 0;\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const polygon = Util.getWallVertices(wall, 2);\n const halfDif = (lz - wall.lz) / 2;\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n if (Util.isPointInside(kx2 * dx, kz2 * dz + halfDif, polygon)) {\n cellOutputTotals[kx][kz] += indirectRadiation;\n if (dot > 0) {\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (!inShadow(wall.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(wall.id, cellOutputTotals);\n };\n\n const generateHeatmapForDoor = (door: DoorModel) => {\n const foundation = getFoundation(door);\n if (!foundation) throw new Error('foundation of door not found');\n const parent = getParent(door);\n if (!parent) throw new Error('parent of door not found');\n const wall = parent as WallModel;\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = door.lx * wall.lx; // width\n const lz = door.lz * wall.lz; // height\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absWallPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n const absPos = absWallPos.clone().add(new Vector3(door.cx * wall.lx, 0, door.cz * wall.lz));\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const v = new Vector3();\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let count = 0;\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n if (door.doorType === DoorType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (SolarRadiation.pointWithinArch(v, lx, lz, door.archHeight, absPos)) {\n cellOutputTotals[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(door.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n cellOutputTotals[kx][kz] += indirectRadiation;\n if (dot > 0) {\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (!inShadow(door.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(door.id, cellOutputTotals);\n };\n\n const generateHeatmapForPyramidRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Pyramid) throw new Error('roof is not pyramid');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n generateHeatmapForFlatRoof(roof, foundation, segments);\n } else {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the plane (must normalize the cross product as it is not normalized!)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n let count = 0;\n const v = new Vector3();\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n }\n };\n\n const generateHeatmapForMansardRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Mansard) throw new Error('roof is not mansard');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n generateHeatmapForFlatRoof(roof, foundation, segments);\n } else {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n if (index === segments.length - 1) {\n // top surface\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const h0 = s[0].z;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n const v0 = new Vector3(\n minX + cellSize / 2,\n minY + cellSize / 2,\n foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n let count = 0;\n const v = new Vector3(0, 0, v0.z);\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.y = v0.y + q * dy;\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n } else {\n // side surfaces\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n let count = 0;\n const v = new Vector3();\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n }\n }\n };\n\n const generateHeatmapForGambrelRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Gambrel) throw new Error('roof is not gambrel');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n generateHeatmapForFlatRoof(roof, foundation, segments);\n } else {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n let count = 0;\n const v = new Vector3();\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n }\n };\n\n const generateHeatmapForHipRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Hip) throw new Error('roof is not hip');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n generateHeatmapForFlatRoof(roof, foundation, segments);\n } else {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n // (must normalize the cross product of two normalized vectors as it is not automatically normalized)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n let count = 0;\n const v = new Vector3();\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n if (index % 2 === 0) {\n // even number (0, 2) are quads, odd number (1, 3) are triangles\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n } else {\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n }\n };\n\n const generateHeatmapForFlatRoof = (roof: RoofModel, foundation: FoundationModel, segments: Vector3[][]) => {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const h0 = segments[0][0].z;\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const s of segments) {\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n const v0 = new Vector3(minX + cellSize / 2, minY + cellSize / 2, foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET);\n let count = 0;\n const v = new Vector3(0, 0, v0.z);\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.y = v0.y + q * dy;\n if (!inShadow(roof.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(roof.id, cellOutputTotals);\n };\n\n // gable roofs are treated as a special case\n const generateHeatmapForGableRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Gable) throw new Error('roof is not gable');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n let count = 0;\n const v = new Vector3();\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n };\n\n const applyScaleFactor = (output: number[][], scaleFactor: number) => {\n for (let i = 0; i < output.length; i++) {\n for (let j = 0; j < output[i].length; j++) {\n output[i][j] *= scaleFactor;\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(StaticSolarRadiationSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n computeSunriseAndSunsetInMinutes,\n getSunDirection,\n ROOFTOP_SOLAR_PANEL_OFFSET,\n} from './sunTools';\nimport { Euler, Intersection, Object3D, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { ObjectType, SolarStructure, TrackerType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport {\n HALF_PI,\n UNIT_VECTOR_NEG_X,\n UNIT_VECTOR_NEG_Y,\n UNIT_VECTOR_POS_X,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { CuboidModel } from '../models/CuboidModel';\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\nimport { HeliostatModel } from '../models/HeliostatModel';\nimport { WallModel } from '../models/WallModel';\nimport { RoofModel, RoofType } from '../models/RoofModel';\nimport { DoorModel, DoorType } from '../models/DoorModel';\nimport { SolarRadiation } from './SolarRadiation';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface DynamicSolarRadiationSimulationProps {\n city: string | null;\n}\n\nconst DynamicSolarRadiationSimulation = ({ city }: DynamicSolarRadiationSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const setHeatmap = useDataStore(Selector.setHeatmap);\n const clearHeatmaps = useDataStore(Selector.clearHeatmaps);\n const runSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\n const pauseSimulation = usePrimitiveStore(Selector.pauseSimulation);\n const solarRadiationHeatmapReflectionOnly = useStore(Selector.viewState.solarRadiationHeatmapReflectionOnly);\n const getRoofSegmentVertices = useDataStore(Selector.getRoofSegmentVertices);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const interval = 60 / world.timesPerHour;\n const ray = useMemo(() => new Raycaster(), []);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const cellOutputsMapRef = useRef>(new Map());\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n useEffect(() => {\n if (runSimulation) {\n init();\n requestRef.current = requestAnimationFrame(simulate);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n setPrimitiveStore('simulationInProgress', false);\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runSimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseSimulation;\n if (pauseSimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulate();\n }\n }, [pauseSimulation]);\n\n // getting ready for the simulation\n const init = () => {\n setPrimitiveStore('simulationInProgress', true);\n // beginning from sunrise\n now.setHours(Math.floor(sunMinutes.sunrise / 60), sunMinutes.sunrise % 60);\n originalDateRef.current = new Date(world.date);\n simulationCompletedRef.current = false;\n fetchObjects();\n // clear the buffer arrays if any\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Wall:\n case ObjectType.Door:\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicTrough:\n case ObjectType.ParabolicDish:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat:\n cellOutputsMapRef.current.delete(e.id);\n break;\n case ObjectType.Cuboid:\n cellOutputsMapRef.current.delete(e.id + '-top');\n cellOutputsMapRef.current.delete(e.id + '-north');\n cellOutputsMapRef.current.delete(e.id + '-south');\n cellOutputsMapRef.current.delete(e.id + '-west');\n cellOutputsMapRef.current.delete(e.id + '-east');\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const n = segments.length;\n for (let i = 0; i < n; i++) {\n cellOutputsMapRef.current.delete(roof.id + '-' + i);\n }\n }\n cellOutputsMapRef.current.delete(roof.id); // in case it is a flat roof\n break;\n case ObjectType.Foundation:\n cellOutputsMapRef.current.delete(e.id);\n cellOutputsMapRef.current.delete(e.id + '-sut');\n break;\n }\n }\n };\n\n const updateHeatmaps = () => {\n clearHeatmaps();\n const daylight = sunMinutes.daylight() / 60;\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divide by times per hour as the radiation is added up that many times)\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * world.timesPerHour) : 0;\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Foundation:\n case ObjectType.Wall:\n case ObjectType.Door:\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicTrough:\n case ObjectType.ParabolicDish:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat:\n const data = cellOutputsMapRef.current.get(e.id);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heat map data to common store for visualization\n setHeatmap(\n e.id,\n data.map((a) => [...a]),\n );\n }\n break;\n case ObjectType.Cuboid:\n setCuboidHeatmap(e.id, 'top', scaleFactor);\n setCuboidHeatmap(e.id, 'south', scaleFactor);\n setCuboidHeatmap(e.id, 'north', scaleFactor);\n setCuboidHeatmap(e.id, 'west', scaleFactor);\n setCuboidHeatmap(e.id, 'east', scaleFactor);\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n const segments = getRoofSegmentVertices(roof.id);\n if (segments && segments.length > 0) {\n if (\n roof.roofType === RoofType.Pyramid ||\n roof.roofType === RoofType.Mansard ||\n roof.roofType === RoofType.Gambrel ||\n roof.roofType === RoofType.Hip\n ) {\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n const data = cellOutputsMapRef.current.get(roof.id);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heatmap data to common store for visualization\n setHeatmap(\n roof.id,\n data.map((a) => [...a]),\n );\n }\n break;\n }\n }\n for (let i = 0; i < segments.length; i++) {\n const uuid = roof.id + '-' + i;\n const data = cellOutputsMapRef.current.get(uuid);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heat map data to common store for visualization\n setHeatmap(\n uuid,\n data.map((a) => [...a]),\n );\n }\n }\n }\n break;\n }\n if (e.type === ObjectType.Foundation) {\n const foundation = e as FoundationModel;\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\n const uuid = e.id + '-sut';\n const data = cellOutputsMapRef.current.get(uuid);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heat map data to common store for visualization\n setHeatmap(\n uuid,\n data.map((a) => [...a]),\n );\n }\n }\n }\n }\n };\n\n const setCuboidHeatmap = (id: string, side: string, scaleFactor: number) => {\n const data = cellOutputsMapRef.current.get(id + '-' + side);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heat map data to common store for visualization\n if (side === 'east' || side === 'west') {\n setHeatmap(id + '-' + side, Util.transpose(Util.clone2DArray(data)));\n } else {\n setHeatmap(id + '-' + side, Util.clone2DArray(data));\n }\n }\n };\n\n const simulate = () => {\n if (runSimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.runDynamicSimulation = false;\n });\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n updateHeatmaps();\n // the following must be set with a different store callback so that the useEffect hook of app.ts\n // is not triggered to cancel the solar radiation heat map\n setPrimitiveStore('simulationInProgress', false);\n setPrimitiveStore('showSolarRadiationHeatmap', true);\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + interval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n if (solarRadiationHeatmapReflectionOnly) {\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.FresnelReflector:\n calculateFresnelReflector(e as FresnelReflectorModel);\n break;\n case ObjectType.Heliostat:\n calculateHeliostat(e as HeliostatModel);\n break;\n }\n }\n } else {\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Foundation:\n const foundation = e as FoundationModel;\n calculateFoundation(foundation);\n if (foundation.solarStructure === SolarStructure.UpdraftTower) {\n calculateSolarUpdraftTower(foundation);\n }\n break;\n case ObjectType.Cuboid:\n calculateCuboid(e as CuboidModel);\n break;\n case ObjectType.SolarPanel:\n calculateSolarPanel(e as SolarPanelModel);\n break;\n case ObjectType.ParabolicTrough:\n calculateParabolicTrough(e as ParabolicTroughModel);\n break;\n case ObjectType.ParabolicDish:\n calculateParabolicDish(e as ParabolicDishModel);\n break;\n case ObjectType.FresnelReflector:\n calculateFresnelReflector(e as FresnelReflectorModel);\n break;\n case ObjectType.Heliostat:\n calculateHeliostat(e as HeliostatModel);\n break;\n case ObjectType.Wall:\n calculateWall(e as WallModel);\n break;\n case ObjectType.Door:\n calculateDoor(e as DoorModel);\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n switch (roof.roofType) {\n case RoofType.Pyramid:\n calculatePyramidRoof(roof);\n break;\n case RoofType.Gable:\n calculateGableRoof(roof);\n break;\n case RoofType.Gambrel:\n calculateGambrelRoof(roof);\n break;\n case RoofType.Mansard:\n calculateMansardRoof(roof);\n break;\n case RoofType.Hip:\n calculateHipRoof(roof);\n break;\n }\n break;\n }\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulate);\n }\n };\n\n const inShadow = (elementId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== elementId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const calculateCuboid = (cuboid: CuboidModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const dayOfYear = Util.dayOfYear(now);\n const lx = cuboid.lx;\n const ly = cuboid.ly;\n const lz = cuboid.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const ny = Math.max(2, Math.round(ly / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const dz = lz / nz;\n\n // initialize the arrays\n let cellOutputsTop = cellOutputsMapRef.current.get(cuboid.id + '-top');\n if (!cellOutputsTop || cellOutputsTop.length !== nx || cellOutputsTop[0].length !== ny) {\n cellOutputsTop = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-top', cellOutputsTop);\n }\n let cellOutputsSouth = cellOutputsMapRef.current.get(cuboid.id + '-south');\n if (!cellOutputsSouth || cellOutputsSouth.length !== nx || cellOutputsSouth[0].length !== nz) {\n cellOutputsSouth = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-south', cellOutputsSouth);\n }\n let cellOutputsNorth = cellOutputsMapRef.current.get(cuboid.id + '-north');\n if (!cellOutputsNorth || cellOutputsNorth.length !== nx || cellOutputsNorth[0].length !== nz) {\n cellOutputsNorth = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-north', cellOutputsNorth);\n }\n let cellOutputsWest = cellOutputsMapRef.current.get(cuboid.id + '-west');\n if (!cellOutputsWest || cellOutputsWest.length !== ny || cellOutputsWest[0].length !== nz) {\n cellOutputsWest = Array(ny)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-west', cellOutputsWest);\n }\n let cellOutputsEast = cellOutputsMapRef.current.get(cuboid.id + '-east');\n if (!cellOutputsEast || cellOutputsEast.length !== ny || cellOutputsEast[0].length !== nz) {\n cellOutputsEast = Array(ny)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-east', cellOutputsEast);\n }\n\n const normalTop = UNIT_VECTOR_POS_Z;\n const normalSouth = UNIT_VECTOR_NEG_Y.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalNorth = UNIT_VECTOR_POS_Y.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalWest = UNIT_VECTOR_NEG_X.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalEast = UNIT_VECTOR_POS_X.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n\n const parent = getParent(cuboid);\n let cx = cuboid.cx;\n let cy = cuboid.cy;\n let cz = cuboid.cz;\n if (parent && parent.type === ObjectType.Cuboid) {\n const worldData = Util.getWorldDataById(cuboid.id);\n cx = worldData.pos.x;\n cy = worldData.pos.y;\n cz = worldData.pos.z;\n }\n const vec = new Vector3();\n const center2d = new Vector2(cx, cy);\n const v2 = new Vector2();\n const southY = cy - ly / 2;\n const northY = cy + ly / 2;\n const westX = cx - lx / 2;\n const eastX = cx + lx / 2;\n\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n\n // top face\n let indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normalTop,\n peakRadiation,\n );\n let dot = normalTop.dot(sunDirection);\n let uc = cx - lx / 2;\n let vc = cy - ly / 2;\n const topZ = cz + lz / 2;\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < ny; v++) {\n cellOutputsTop[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, vc + (v + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, topZ);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsTop[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // south face\n uc = cx - lx / 2;\n vc = cz - lz / 2;\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normalSouth, peakRadiation);\n dot = normalSouth.dot(sunDirection);\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < nz; v++) {\n cellOutputsSouth[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, southY);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsSouth[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // north face\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normalNorth, peakRadiation);\n dot = normalNorth.dot(sunDirection);\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < nz; v++) {\n cellOutputsNorth[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, northY);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (nz - (v + 0.5)) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsNorth[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // west face\n uc = cy - ly / 2;\n vc = cz - lz / 2;\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normalWest, peakRadiation);\n dot = normalWest.dot(sunDirection);\n for (let u = 0; u < ny; u++) {\n for (let v = 0; v < nz; v++) {\n cellOutputsWest[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(westX, uc + (u + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsWest[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // east face\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normalEast, peakRadiation);\n dot = normalEast.dot(sunDirection);\n for (let u = 0; u < ny; u++) {\n for (let v = 0; v < nz; v++) {\n cellOutputsEast[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(eastX, uc + (u + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsEast[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n const calculateFoundation = (foundation: FoundationModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const dayOfYear = Util.dayOfYear(now);\n const lx = foundation.lx;\n const ly = foundation.ly;\n const lz = foundation.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const ny = Math.max(2, Math.round(ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const x0 = foundation.cx - lx / 2;\n const y0 = foundation.cy - ly / 2;\n const center2d = new Vector2(foundation.cx, foundation.cy);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(foundation.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(foundation.id, cellOutputs);\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n const v2 = new Vector2();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] += indirectRadiation;\n if (dot > 0) {\n v2.set(x0 + (kx + 0.5) * dx, y0 + (ky + 0.5) * dy);\n v2.rotateAround(center2d, foundation.rotation[2]);\n v.set(v2.x, v2.y, lz);\n if (!inShadow(foundation.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n const calculateWall = (wall: WallModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(wall);\n if (!foundation) throw new Error('foundation of wall not found');\n const dayOfYear = Util.dayOfYear(now);\n const lx = wall.lx;\n const lz = Util.getHighestPointOfWall(wall); // height\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n lz / 2 + foundation.lz,\n );\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(wall.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== nz) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(wall.id, cellOutputs);\n }\n const polygon = Util.getWallVertices(wall, 1);\n const halfDif = (lz - wall.lz) / 2;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n if (Util.isPointInside(kx2 * dx, kz2 * dz + halfDif, polygon)) {\n cellOutputs[kx][kz] += indirectRadiation;\n if (dot > 0) {\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (!inShadow(wall.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateDoor = (door: DoorModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(door);\n if (!foundation) throw new Error('foundation of door not found');\n const parent = getParent(door);\n if (!parent) throw new Error('parent of door not found');\n const dayOfYear = Util.dayOfYear(now);\n const wall = parent as WallModel;\n const lx = door.lx * wall.lx;\n const lz = door.lz * wall.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absWallPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n const absPos = absWallPos.clone().add(new Vector3(door.cx * wall.lx, 0, door.cz * wall.lz));\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(door.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== nz) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(door.id, cellOutputs);\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n if (door.doorType === DoorType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (SolarRadiation.pointWithinArch(v, lx, lz, door.archHeight, absPos)) {\n cellOutputs[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(door.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n cellOutputs[kx][kz] += indirectRadiation;\n if (dot > 0) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (!inShadow(door.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateFlatRoof = (\n sunDirection: Vector3,\n roof: RoofModel,\n foundation: FoundationModel,\n segments: Vector3[][],\n ) => {\n const h0 = segments[0][0].z;\n const dayOfYear = Util.dayOfYear(now);\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const s of segments) {\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y; // don't use else if!!!\n }\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n let cellOutputs = cellOutputsMapRef.current.get(roof.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(roof.id, cellOutputs);\n }\n const v0 = new Vector3(minX + cellSize / 2, minY + cellSize / 2, foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET);\n const v = new Vector3(0, 0, v0.z);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.y = v0.y + q * dy;\n if (!inShadow(roof.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n const calculatePyramidRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Pyramid) throw new Error('roof is not pyramid');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n // send heat map data to common store for visualization\n if (flat) {\n calculateFlatRoof(sunDirection, roof, foundation, segments);\n } else {\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the plane (must normalize the cross product as it is not normalized!)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n };\n\n const calculateMansardRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Mansard) throw new Error('roof is not mansard');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n // send heat map data to common store for visualization\n if (flat) {\n calculateFlatRoof(sunDirection, roof, foundation, segments);\n } else {\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n if (index === segments.length - 1) {\n // top surface\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const h0 = s[0].z;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n const v0 = new Vector3(\n minX + cellSize / 2,\n minY + cellSize / 2,\n foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n const v = new Vector3(0, 0, v0.z);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.y = v0.y + q * dy;\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n } else {\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n };\n\n const calculateGambrelRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Gambrel) throw new Error('roof is not gambrel');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n // send heat map data to common store for visualization\n if (flat) {\n calculateFlatRoof(sunDirection, roof, foundation, segments);\n } else {\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n };\n\n const calculateHipRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Hip) throw new Error('roof is not hip');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n calculateFlatRoof(sunDirection, roof, foundation, segments);\n } else {\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n for (const [index, s] of segments.entries()) {\n // even number (0, 2) are quads, odd number (1, 3) are triangles\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n // in case we need it: the position of the top point relative to the first edge point is\n // (m * v20.dot(v10.normalize())) / length10;\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n // (must normalize the cross product of two normalized vectors as it is not automatically normalized)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n const v = new Vector3();\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n };\n\n // gable roofs are treated as a special case\n const calculateGableRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Gable) throw new Error('roof is not gable');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n // send heat map data to common store for visualization\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateSolarPanel = (panel: SolarPanelModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n }\n const dayOfYear = Util.dayOfYear(now);\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, getFoundation(panel), panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const rot = parent.rotation[2];\n let zRot = rot + panel.relativeAzimuth;\n let angle = panel.tiltAngle;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const foundation = getFoundation(parent);\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n const normal = new Vector3().fromArray(panel.normal);\n const lx = panel.lx;\n const ly = panel.ly;\n const nx = Math.max(2, Math.round(panel.lx / cellSize));\n const ny = Math.max(2, Math.round(panel.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(panel.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(panel.id, cellOutputs);\n }\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof.\n // so we only need to tilt the normal for a solar panel on a foundation or flat roof\n let normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n if (panel.trackerType !== TrackerType.NO_TRACKER) {\n // dynamic angles\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n switch (panel.trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const qRotAADAT = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n normalEuler = new Euler().setFromQuaternion(qRotAADAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n const qRotHSAT = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x, 0, rotatedSunDirection.z).normalize(),\n );\n normalEuler = new Euler().setFromQuaternion(qRotHSAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n if (Math.abs(panel.tiltAngle) > 0.001) {\n const v2 = new Vector3(rotatedSunDirection.x, -rotatedSunDirection.y, 0).normalize();\n const az = Math.acos(UNIT_VECTOR_POS_Y.dot(v2)) * Math.sign(v2.x);\n normalEuler = new Euler(panel.tiltAngle, 0, az + rot, 'ZYX');\n }\n break;\n case TrackerType.TILTED_SINGLE_AXIS_TRACKER:\n // TODO\n break;\n }\n }\n normal.applyEuler(normalEuler);\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] += indirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n const calculateParabolicTrough = (trough: ParabolicTroughModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const parent = getParent(trough);\n if (!parent) throw new Error('parent of parabolic trough does not exist');\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(trough.cx, trough.cy, trough.cz, parent);\n const normal = new Vector3().fromArray(trough.normal);\n const originalNormal = normal.clone();\n const lx = trough.lx;\n const ly = trough.ly;\n const depth = (lx * lx) / (4 * trough.latusRectum); // the distance from the bottom to the aperture plane\n const actualPoleHeight = trough.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(trough.lx / cellSize));\n const ny = Math.max(2, Math.round(trough.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = parent.lz + actualPoleHeight + trough.lz + depth;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(trough.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(trough.id, cellOutputs);\n }\n const rot = parent.rotation[2];\n const zRot = rot + trough.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const cosRot = zRotZero ? 1 : Math.cos(zRot);\n const sinRot = zRotZero ? 0 : Math.sin(zRot);\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n const qRot = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x * cosRot, rotatedSunDirection.x * sinRot, rotatedSunDirection.z).normalize(),\n );\n const normalEuler = new Euler().setFromQuaternion(qRot);\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let tmpX = 0;\n let disX = 0;\n let areaRatio = 1;\n const lr2 = 4 / (trough.latusRectum * trough.latusRectum);\n // we have to calculate the irradiance on the parabolic surface, not the aperture surface.\n // the irradiance on the former is less than that on the latter because of the area difference.\n // the relationship between a unit area on the parabolic surface and that on the aperture surface\n // is S = A * sqrt(1 + 4 * x^2 / p^2), where p is the latus rectum, x is the distance from the center\n // of the parabola, and A is the unit area on the aperture area. Note that this modification only\n // applies to direct radiation. Indirect radiation can come from any direction.\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n disX = tmpX - center.x;\n areaRatio = 1 / Math.sqrt(1 + disX * disX * lr2);\n for (let kv = 0; kv < ny; kv++) {\n cellOutputs[ku][kv] += indirectRadiation;\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n // TODO: this implementation differs from that for Fresnel reflectors\n // so we must rotate here. this can be avoided.\n if (!zRotZero) v2d.rotateAround(center2d, zRot);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(trough.id, v, sunDirection)) {\n cellOutputs[ku][kv] += dot * peakRadiation * areaRatio;\n }\n }\n }\n }\n };\n\n const calculateParabolicDish = (dish: ParabolicDishModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const parent = getParent(dish);\n if (!parent) throw new Error('parent of parabolic dish does not exist');\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(dish.cx, dish.cy, dish.cz, parent);\n const normal = new Vector3().fromArray(dish.normal);\n const originalNormal = normal.clone();\n const lx = dish.lx;\n const ly = dish.ly;\n const depth = (lx * lx) / (4 * dish.latusRectum); // the distance from the bottom to the aperture circle\n const actualPoleHeight = dish.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(dish.lx / cellSize));\n const ny = Math.max(2, Math.round(dish.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = parent.lz + actualPoleHeight + dish.lz + depth;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(dish.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(dish.id, cellOutputs);\n }\n const rot = parent.rotation[2];\n const zRot = rot + dish.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n const qRot = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n const normalEuler = new Euler().setFromQuaternion(qRot);\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let tmpX = 0;\n let tmpY = 0;\n let disX = 0;\n let disY = 0;\n let areaRatio = 1;\n const lr2 = 4 / (dish.latusRectum * dish.latusRectum);\n // we have to calculate the irradiance on the parabolic surface, not the aperture surface.\n // the irradiance on the former is less than that on the latter because of the area difference.\n // the relationship between a unit area on the parabolic surface and that on the aperture surface\n // is S = A * sqrt(1 + 4 * (x^2 + y^2) / p^2), where p is the latus rectum, x is the x distance\n // from the center of the paraboloid, y is the y distance from the center of the paraboloid,\n // and A is the unit area on the aperture area. Note that this modification only\n // applies to direct radiation. Indirect radiation can come from any direction.\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n disX = tmpX - center.x;\n if (Math.abs(disX) > lx / 2) continue;\n for (let kv = 0; kv < ny; kv++) {\n tmpY = y0 + kv * dy;\n disY = tmpY - center.y;\n if (Math.abs(disY) > ly / 2) continue;\n cellOutputs[ku][kv] += indirectRadiation;\n if (dot > 0) {\n v2d.set(tmpX, tmpY);\n if (!zRotZero) v2d.rotateAround(center2d, zRot);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(dish.id, v, sunDirection)) {\n areaRatio = 1 / Math.sqrt(1 + (disX * disX + disY * disY) * lr2);\n cellOutputs[ku][kv] += dot * peakRadiation * areaRatio;\n }\n }\n }\n }\n };\n\n const calculateFresnelReflector = (reflector: FresnelReflectorModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(reflector);\n if (!parent) throw new Error('parent of Fresnel reflector does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const foundation = parent as FoundationModel;\n const absorberPipe = foundation.solarAbsorberPipe;\n if (!absorberPipe) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(reflector.cx, reflector.cy, reflector.cz, parent);\n const normal = new Vector3().fromArray(reflector.normal);\n const originalNormal = normal.clone();\n const lx = reflector.lx;\n const ly = reflector.ly;\n const actualPoleHeight = reflector.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(reflector.lx / cellSize));\n const ny = Math.max(2, Math.round(reflector.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = foundation.lz + actualPoleHeight + reflector.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(reflector.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(reflector.id, cellOutputs);\n }\n const rot = parent.rotation[2];\n const zRot = rot + reflector.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const cosRot = zRotZero ? 1 : Math.cos(zRot);\n const sinRot = zRotZero ? 0 : Math.sin(zRot);\n // convert the receiver's coordinates into those relative to the center of this reflector\n const receiverCenter =\n foundation.solarStructure === SolarStructure.FocusPipe\n ? new Vector3(\n (foundation.cx - center.x) * cosRot,\n (foundation.cy - center.y) * sinRot,\n foundation.cz - center.z + foundation.lz / 2 + (absorberPipe.absorberHeight ?? 10),\n )\n : undefined;\n // the rotation axis is in the north-south direction, so the relative azimuth is zero, which maps to (0, 1, 0)\n const rotationAxis = new Vector3(sinRot, cosRot, 0);\n const shiftedReceiverCenter = new Vector3();\n let normalEuler;\n let reflectorToReceiver;\n if (receiverCenter) {\n // the reflector moves only when there is a receiver\n shiftedReceiverCenter.set(receiverCenter.x, receiverCenter.y, receiverCenter.z);\n // how much the reflected light should shift in the direction of the receiver pipe?\n const shift =\n (-receiverCenter.z * (sunDirection.y * rotationAxis.y + sunDirection.x * rotationAxis.x)) / sunDirection.z;\n shiftedReceiverCenter.x += shift * rotationAxis.x;\n shiftedReceiverCenter.y -= shift * rotationAxis.y;\n reflectorToReceiver = shiftedReceiverCenter.clone().normalize();\n let normalVector = reflectorToReceiver.add(sunDirection).normalize();\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\n normalVector = new Vector3(-0.001, 0, 1).normalize();\n }\n if (!zRotZero) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -zRot);\n }\n normalEuler = new Euler(0, Math.atan2(normalVector.x, normalVector.z), zRot, 'ZXY');\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n } else {\n reflectorToReceiver = new Vector3(0, 0, 1);\n normalEuler = new Euler();\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let tmpX = 0;\n if (solarRadiationHeatmapReflectionOnly) {\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(reflector.id, v, sunDirection) && !inShadow(reflector.id, v, reflectorToReceiver)) {\n cellOutputs[ku][kv] += dot * peakRadiation;\n }\n }\n }\n }\n } else {\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n cellOutputs[ku][kv] += indirectRadiation;\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(reflector.id, v, sunDirection)) {\n cellOutputs[ku][kv] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateHeliostat = (heliostat: HeliostatModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(heliostat);\n if (!parent) throw new Error('parent of Fresnel reflector does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const foundation = parent as FoundationModel;\n const powerTower = foundation.solarPowerTower;\n if (!powerTower) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(heliostat.cx, heliostat.cy, heliostat.cz, parent);\n const normal = new Vector3().fromArray(heliostat.normal);\n const originalNormal = normal.clone();\n const lx = heliostat.lx;\n const ly = heliostat.ly;\n const actualPoleHeight = heliostat.poleHeight + Math.max(lx, ly) / 2;\n const nx = Math.max(2, Math.round(heliostat.lx / cellSize));\n const ny = Math.max(2, Math.round(heliostat.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = foundation.lz + actualPoleHeight + heliostat.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(heliostat.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(heliostat.id, cellOutputs);\n }\n const rot = parent.rotation[2];\n // convert the receiver's coordinates into those relative to the center of this reflector\n const receiverCenter =\n foundation.solarStructure === SolarStructure.FocusTower\n ? new Vector3(\n foundation.cx - center.x,\n foundation.cy - center.y,\n foundation.cz - center.z + (powerTower.towerHeight ?? 20),\n )\n : undefined;\n let heliostatToReceiver;\n let normalEuler;\n if (receiverCenter) {\n heliostatToReceiver = receiverCenter.clone().normalize();\n let normalVector = heliostatToReceiver.clone().add(sunDirection).normalize();\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\n normalVector = new Vector3(-0.001, 0, 1).normalize();\n }\n if (rot) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\n }\n // convert the normal vector to euler\n const r = Math.hypot(normalVector.x, normalVector.y);\n normalEuler = new Euler(\n Math.atan2(r, normalVector.z),\n 0,\n Math.atan2(normalVector.y, normalVector.x) + HALF_PI,\n 'ZXY',\n );\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n } else {\n heliostatToReceiver = new Vector3(0, 0, 1);\n normalEuler = new Euler();\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let tmpX = 0;\n if (solarRadiationHeatmapReflectionOnly) {\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(heliostat.id, v, sunDirection) && !inShadow(heliostat.id, v, heliostatToReceiver)) {\n cellOutputs[ku][kv] += dot * peakRadiation;\n }\n }\n }\n }\n } else {\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n cellOutputs[ku][kv] += indirectRadiation;\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(heliostat.id, v, sunDirection)) {\n cellOutputs[ku][kv] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateSolarUpdraftTower = (foundation: FoundationModel) => {\n const solarUpdraftTower = foundation.solarUpdraftTower;\n if (!solarUpdraftTower) return;\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const dayOfYear = Util.dayOfYear(now);\n const normal = new Vector3().fromArray(foundation.normal);\n const radius = solarUpdraftTower.collectorRadius;\n const max = Math.max(2, Math.round((radius * 2) / cellSize));\n // shift half cell size to the center of each grid cell\n const x0 = foundation.cx - radius + cellSize / 2;\n const y0 = foundation.cy - radius + cellSize / 2;\n const z0 = foundation.lz + solarUpdraftTower.collectorHeight;\n const uuid = foundation.id + '-sut';\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== max || cellOutputs[0].length !== max) {\n cellOutputs = Array(max)\n .fill(0)\n .map(() => Array(max).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const vec = new Vector3(0, 0, z0);\n const dot = normal.dot(sunDirection);\n const rsq = radius * radius;\n let dx, dy;\n for (let u = 0; u < max; u++) {\n vec.x = x0 + u * cellSize;\n dx = vec.x - foundation.cx;\n for (let v = 0; v < max; v++) {\n vec.y = y0 + v * cellSize;\n dy = vec.y - foundation.cy;\n if (dx * dx + dy * dy > rsq) continue;\n cellOutputs[u][v] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(uuid, vec, sunDirection)) {\n cellOutputs[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(DynamicSolarRadiationSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { calculatePeakRadiation, computeSunriseAndSunsetInMinutes, getSunDirection } from './sunTools';\nimport { Euler, Intersection, Object3D, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport { MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\nimport { SunMinutes } from './SunMinutes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface ParabolicTroughSimulationProps {\n city: string | null;\n}\n\nconst ParabolicTroughSimulation = ({ city }: ParabolicTroughSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const setDailyYield = useDataStore(Selector.setDailyParabolicTroughYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const setYearlyYield = useDataStore(Selector.setYearlyParabolicTroughYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyParabolicTroughIndividualOutputs);\n const yearlyIndividualOutputs = useStore(Selector.yearlyParabolicTroughIndividualOutputs);\n const setParabolicTroughLabels = useDataStore(Selector.setParabolicTroughLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForParabolicTroughs);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForParabolicTroughs);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForParabolicTroughs);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForParabolicTroughs);\n const showDailyParabolicTroughYieldPanel = useStore(Selector.viewState.showDailyParabolicTroughYieldPanel);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.cspTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.cspDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.cspGridCellSize ?? 0.5;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation */\n\n useEffect(() => {\n if (runDailySimulation) {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), minuteInterval / 2 - 30);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyParabolicTroughYieldPanel = true;\n state.selectedFloatingWindow = 'dailyParabolicTroughYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicTroughs = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyParabolicTroughYield();\n state.actionInfo = {\n name: 'Daily Simulation for Parabolic Troughs Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyParabolicTroughYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n calculateYield(e as ParabolicTroughModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const trough = e as ParabolicTroughModel;\n const result = dailyOutputsMapRef.current.get(trough.id);\n if (result) {\n const factor = getElementFactor(trough) * timeFactor;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= factor;\n }\n }\n }\n }\n generateDailyYieldData();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateDailyYieldData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Trough' + index, output);\n labels.push(e.label ?? 'Trough' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Trough' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setParabolicTroughLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation */\n\n useEffect(() => {\n if (runYearlySimulation) {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n calculateYield(e as ParabolicTroughModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyParabolicTroughYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyParabolicTroughYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicTroughs = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyYieldData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyParabolicTroughYield();\n state.actionInfo = {\n name: 'Yearly Simulation for Parabolic Troughs Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyParabolicTroughYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const trough = e as ParabolicTroughModel;\n const result = dailyOutputsMapRef.current.get(trough.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(trough.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(trough);\n }\n }\n }\n }\n if (showDailyParabolicTroughYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyYieldData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Trough' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setParabolicTroughLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions between daily and yearly simulation */\n\n // there is room for performance improvement if we figure out a way to cache a lot of things used below\n const calculateYield = (trough: ParabolicTroughModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(trough);\n if (!parent) throw new Error('parent of parabolic trough does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(trough.cx, trough.cy, trough.cz, parent);\n const normal = new Vector3().fromArray(trough.normal);\n const originalNormal = normal.clone();\n const zRot = parent.rotation[2] + trough.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const lx = trough.lx;\n const ly = trough.ly;\n let nx = Math.max(2, Math.round(trough.lx / cellSize));\n let ny = Math.max(2, Math.round(trough.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const depth = (lx * lx) / (4 * trough.latusRectum); // the distance from the bottom to the aperture plane\n // const focalLength = 0.25*trough.latusRectum; // equal to the distance from the directrix to the horizontal axis\n const actualPoleHeight = trough.poleHeight + lx / 2;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = parent.lz + actualPoleHeight + trough.lz + depth;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const rot = parent.rotation[2];\n const cosRot = zRotZero ? 1 : Math.cos(zRot);\n const sinRot = zRotZero ? 0 : Math.sin(zRot);\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n const qRot = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x * cosRot, rotatedSunDirection.x * sinRot, rotatedSunDirection.z).normalize(),\n );\n const normalEuler = new Euler().setFromQuaternion(qRot);\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let sum = 0;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n if (dot > 0) {\n // simplify the simulation by using the aperture surface instead of the parabolic surface\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n if (!zRotZero) v2d.rotateAround(center2d, zRot);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(trough.id, v, sunDirection)) {\n // direct radiation\n sum += dot * peakRadiation;\n }\n }\n }\n }\n const output = dailyOutputsMapRef.current.get(trough.id);\n if (output) {\n // the output is the average radiation density, hence we have to divide it by nx * ny\n // if the minutes are greater than 30 or 30, it is counted as the output of the next hour\n // to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += sum / (nx * ny);\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (trough: ParabolicTroughModel) => {\n return (\n trough.lx *\n trough.ly *\n trough.opticalEfficiency *\n trough.thermalEfficiency *\n trough.absorptance *\n trough.reflectance *\n (1 - monthlyIrradianceLosses[now.getMonth()])\n );\n };\n\n const inShadow = (troughId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== troughId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const yearlyResult = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyResult && yearlyResult.length === daysPerYear) {\n yearlyResult.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(ParabolicTroughSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { calculatePeakRadiation, computeSunriseAndSunsetInMinutes, getSunDirection } from './sunTools';\nimport { Euler, Intersection, Object3D, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport { MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\nimport { SunMinutes } from './SunMinutes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface ParabolicDishSimulationProps {\n city: string | null;\n}\n\nconst ParabolicDishSimulation = ({ city }: ParabolicDishSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const setDailyYield = useDataStore(Selector.setDailyParabolicDishYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const setYearlyYield = useDataStore(Selector.setYearlyParabolicDishYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyParabolicDishIndividualOutputs);\n const yearlyIndividualOutputs = useStore(Selector.yearlyParabolicDishIndividualOutputs);\n const setParabolicDishLabels = useDataStore(Selector.setParabolicDishLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForParabolicDishes);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForParabolicDishes);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForParabolicDishes);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForParabolicDishes);\n const showDailyParabolicDishYieldPanel = useStore(Selector.viewState.showDailyParabolicDishYieldPanel);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.cspTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.cspDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.cspGridCellSize ?? 0.5;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation */\n\n useEffect(() => {\n if (runDailySimulation) {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), minuteInterval / 2 - 30);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyParabolicDishYieldPanel = true;\n state.selectedFloatingWindow = 'dailyParabolicDishYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicDishes = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyParabolicDishYield();\n state.actionInfo = {\n name: 'Daily Simulation for Parabolic Dishes Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyParabolicDishYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n calculateYield(e as ParabolicDishModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const dish = e as ParabolicDishModel;\n const result = dailyOutputsMapRef.current.get(dish.id);\n if (result) {\n const factor = getElementFactor(dish) * timeFactor;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= factor;\n }\n }\n }\n }\n generateDailyYieldData();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateDailyYieldData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Dish' + index, output);\n labels.push(e.label ?? 'Dish' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Dish' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setParabolicDishLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation */\n\n useEffect(() => {\n if (runYearlySimulation) {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n calculateYield(e as ParabolicDishModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyParabolicDishYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyParabolicDishYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicDishes = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyYieldData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyParabolicDishYield();\n state.actionInfo = {\n name: 'Yearly Simulation for Parabolic Dishes Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyParabolicDishYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const dish = e as ParabolicDishModel;\n const result = dailyOutputsMapRef.current.get(dish.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(dish.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(dish);\n }\n }\n }\n }\n if (showDailyParabolicDishYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyYieldData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Dish' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setParabolicDishLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions */\n\n // there is room for performance improvement if we figure out a way to cache a lot of things used below\n const calculateYield = (dish: ParabolicDishModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(dish);\n if (!parent) throw new Error('parent of parabolic dish does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(dish.cx, dish.cy, dish.cz, parent);\n const normal = new Vector3().fromArray(dish.normal);\n const originalNormal = normal.clone();\n const lx = dish.lx;\n const ly = dish.ly;\n let nx = Math.max(2, Math.round(dish.lx / cellSize));\n let ny = Math.max(2, Math.round(dish.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const depth = (lx * lx) / (4 * dish.latusRectum); // the distance from the bottom to the aperture plane\n // const focalLength = 0.25*dish.latusRectum; // equal to the distance from the directrix to the horizontal axis\n const actualPoleHeight = dish.poleHeight + lx / 2;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = parent.lz + actualPoleHeight + dish.lz + depth;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const rot = parent.rotation[2];\n const zRot = rot + dish.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n const qRot = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n const normalEuler = new Euler().setFromQuaternion(qRot);\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let sum = 0;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n if (dot > 0) {\n // simplify the simulation by using the aperture surface instead of the parabolic surface\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n if (!zRotZero) v2d.rotateAround(center2d, zRot);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(dish.id, v, sunDirection)) {\n // direct radiation\n sum += dot * peakRadiation;\n }\n }\n }\n }\n const output = dailyOutputsMapRef.current.get(dish.id);\n if (output) {\n // the output is the average radiation density, hence we have to divide it by nx * ny\n // if the minutes are greater than 30 or 30, it is counted as the output of the next hour\n // to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += sum / (nx * ny);\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (dish: ParabolicDishModel) => {\n return (\n dish.lx *\n dish.ly *\n dish.opticalEfficiency *\n dish.thermalEfficiency *\n dish.absorptance *\n dish.reflectance *\n (1 - monthlyIrradianceLosses[now.getMonth()])\n );\n };\n\n const inShadow = (dishId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== dishId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const yearlyResult = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyResult && yearlyResult.length === daysPerYear) {\n yearlyResult.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(ParabolicDishSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { calculatePeakRadiation, computeSunriseAndSunsetInMinutes, getSunDirection } from './sunTools';\nimport { Euler, Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, ObjectType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport { MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { SunMinutes } from './SunMinutes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface FresnelReflectorSimulationProps {\n city: string | null;\n}\n\nconst FresnelReflectorSimulation = ({ city }: FresnelReflectorSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const setDailyYield = useDataStore(Selector.setDailyFresnelReflectorYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyFresnelReflectorIndividualOutputs);\n const setYearlyYield = useDataStore(Selector.setYearlyFresnelReflectorYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const yearlyIndividualOutputs = useStore(Selector.yearlyFresnelReflectorIndividualOutputs);\n const setFresnelReflectorLabels = useDataStore(Selector.setFresnelReflectorLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForFresnelReflectors);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForFresnelReflectors);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForFresnelReflectors);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForFresnelReflectors);\n const showDailyFresnelReflectorYieldPanel = useStore(Selector.viewState.showDailyFresnelReflectorYieldPanel);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.cspTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.cspDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.cspGridCellSize ?? 0.5;\n const objectsRef = useRef([]);\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation */\n\n useEffect(() => {\n if (runDailySimulation) {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), minuteInterval / 2 - 30);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyFresnelReflectorYieldPanel = true;\n state.selectedFloatingWindow = 'dailyFresnelReflectorYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForFresnelReflectors = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyFresnelReflectorYield();\n state.actionInfo = {\n name: 'Daily Simulation for Fresnel Reflectors Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyFresnelReflectorYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n calculateYield(e as FresnelReflectorModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const reflector = e as FresnelReflectorModel;\n const result = dailyOutputsMapRef.current.get(reflector.id);\n if (result) {\n const factor = getElementFactor(reflector) * timeFactor;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= factor;\n }\n }\n }\n }\n generateDailyYieldData();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateDailyYieldData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Reflector' + index, output);\n labels.push(e.label ?? 'Reflector' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Reflector' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setFresnelReflectorLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation */\n\n useEffect(() => {\n if (runYearlySimulation) {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n calculateYield(e as FresnelReflectorModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyFresnelReflectorYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyFresnelReflectorYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForFresnelReflectors = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyYieldData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyFresnelReflectorYield();\n state.actionInfo = {\n name: 'Yearly Simulation for Fresnel Reflectors Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyFresnelReflectorYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const reflector = e as FresnelReflectorModel;\n const result = dailyOutputsMapRef.current.get(reflector.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(reflector.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(reflector);\n }\n }\n }\n }\n if (showDailyFresnelReflectorYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyYieldData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Reflector' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setFresnelReflectorLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions */\n\n // there is room for performance improvement if we figure out a way to cache a lot of things used below\n const calculateYield = (reflector: FresnelReflectorModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(reflector);\n if (!parent) throw new Error('parent of Fresnel reflector does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const foundation = parent as FoundationModel;\n const absorberPipe = foundation.solarAbsorberPipe;\n if (!absorberPipe) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(reflector.cx, reflector.cy, reflector.cz, parent);\n const normal = new Vector3().fromArray(reflector.normal);\n const originalNormal = normal.clone();\n const lx = reflector.lx;\n const ly = reflector.ly;\n const actualPoleHeight = reflector.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(reflector.lx / cellSize));\n const ny = Math.max(2, Math.round(reflector.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = foundation.lz + actualPoleHeight + reflector.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const rot = parent.rotation[2];\n // we do not handle relative azimuth yet, so this is just a placeholder\n const zRot = rot + reflector.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const cosRot = zRotZero ? 1 : Math.cos(zRot);\n const sinRot = zRotZero ? 0 : Math.sin(zRot);\n // convert the receiver's coordinates into those relative to the center of this reflector\n const receiverCenter =\n foundation.solarStructure === SolarStructure.FocusPipe\n ? new Vector3(\n (foundation.cx - center.x) * cosRot,\n (foundation.cy - center.y) * sinRot,\n foundation.cz - center.z + foundation.lz / 2 + (absorberPipe.absorberHeight ?? 10),\n )\n : undefined;\n // the rotation axis is in the north-south direction, so the relative azimuth is zero, which maps to (0, 1, 0)\n const rotationAxis = new Vector3(sinRot, cosRot, 0);\n const shiftedReceiverCenter = new Vector3();\n let normalEuler;\n let reflectorToReceiver;\n if (receiverCenter) {\n // the reflector moves only when there is a receiver\n shiftedReceiverCenter.set(receiverCenter.x, receiverCenter.y, receiverCenter.z);\n // how much the reflected light should shift in the direction of the receiver pipe?\n const shift =\n (-receiverCenter.z * (sunDirection.y * rotationAxis.y + sunDirection.x * rotationAxis.x)) / sunDirection.z;\n shiftedReceiverCenter.x += shift * rotationAxis.x;\n shiftedReceiverCenter.y -= shift * rotationAxis.y;\n reflectorToReceiver = shiftedReceiverCenter.clone().normalize();\n let normalVector = reflectorToReceiver.add(sunDirection).normalize();\n // avoid singularity: atan(x, y) = infinity if x = 0\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\n normalVector = new Vector3(-0.001, 0, 1).normalize();\n }\n if (!zRotZero) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -zRot);\n }\n normalEuler = new Euler(0, Math.atan2(normalVector.x, normalVector.z), zRot, 'ZXY');\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n } else {\n reflectorToReceiver = new Vector3(0, 0, 1);\n normalEuler = new Euler();\n }\n // the unit of radiation is kW/m^2\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let sum = 0;\n let tmpX = 0;\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(reflector.id, v, sunDirection) && !inShadow(reflector.id, v, reflectorToReceiver)) {\n sum += dot * peakRadiation;\n }\n }\n }\n }\n const output = dailyOutputsMapRef.current.get(reflector.id);\n if (output) {\n // the output is the average radiation density, hence we have to divide it by nx * ny\n // if the minutes are greater than 30 or 30, it is counted as the output of the next hour\n // to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += sum / (nx * ny);\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (reflector: FresnelReflectorModel) => {\n const parent = getParent(reflector);\n if (!parent) throw new Error('parent of Fresnel reflector does not exist');\n let systemEfficiency = 1;\n if (parent.type === ObjectType.Foundation) {\n const foundation = parent as FoundationModel;\n const absorberPipe = foundation.solarAbsorberPipe;\n systemEfficiency *=\n (absorberPipe?.absorberOpticalEfficiency ?? 0.7) *\n (absorberPipe?.absorberThermalEfficiency ?? 0.3) *\n (absorberPipe?.absorberAbsorptance ?? 0.95);\n }\n return (\n reflector.lx *\n reflector.ly *\n reflector.reflectance *\n systemEfficiency *\n (1 - monthlyIrradianceLosses[now.getMonth()])\n );\n };\n\n const inShadow = (reflectorId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== reflectorId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const yearlyResult = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyResult && yearlyResult.length === daysPerYear) {\n yearlyResult.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(FresnelReflectorSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { calculatePeakRadiation, computeSunriseAndSunsetInMinutes, getSunDirection } from './sunTools';\nimport { Euler, Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, ObjectType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport { HALF_PI, MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { HeliostatModel } from '../models/HeliostatModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { SunMinutes } from './SunMinutes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface HeliostatSimulationProps {\n city: string | null;\n}\n\nconst HeliostatSimulation = ({ city }: HeliostatSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const setDailyYield = useDataStore(Selector.setDailyHeliostatYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyHeliostatIndividualOutputs);\n const setYearlyYield = useDataStore(Selector.setYearlyHeliostatYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const yearlyIndividualOutputs = useStore(Selector.yearlyHeliostatIndividualOutputs);\n const setHeliostatLabels = useDataStore(Selector.setHeliostatLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForHeliostats);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForHeliostats);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForHeliostats);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForHeliostats);\n const showDailyHeliostatYieldPanel = useStore(Selector.viewState.showDailyHeliostatYieldPanel);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.cspTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.cspDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.cspGridCellSize ?? 0.5;\n const objectsRef = useRef([]);\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation */\n\n useEffect(() => {\n if (runDailySimulation) {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), minuteInterval / 2 - 30);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyHeliostatYieldPanel = true;\n state.selectedFloatingWindow = 'dailyHeliostatYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForHeliostats = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyHeliostatYield();\n state.actionInfo = {\n name: 'Daily Simulation for Heliostats Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyHeliostatYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n calculateYield(e as HeliostatModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const heliostat = e as HeliostatModel;\n const result = dailyOutputsMapRef.current.get(heliostat.id);\n if (result) {\n const factor = getElementFactor(heliostat) * timeFactor;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= factor;\n }\n }\n }\n }\n generateDailyYieldData();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateDailyYieldData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Heliostat' + index, output);\n labels.push(e.label ?? 'Heliostat' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Heliostat' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setHeliostatLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation */\n\n useEffect(() => {\n if (runYearlySimulation) {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n calculateYield(e as HeliostatModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyHeliostatYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyHeliostatYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForHeliostats = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyYieldData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyHeliostatYield();\n state.actionInfo = {\n name: 'Yearly Simulation for Heliostats Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyHeliostatYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const heliostat = e as HeliostatModel;\n const result = dailyOutputsMapRef.current.get(heliostat.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(heliostat.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(heliostat);\n }\n }\n }\n }\n if (showDailyHeliostatYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyYieldData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Heliostat' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setHeliostatLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions */\n\n // there is room for performance improvement if we figure out a way to cache a lot of things used below\n const calculateYield = (heliostat: HeliostatModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(heliostat);\n if (!parent) throw new Error('parent of heliostat does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const foundation = parent as FoundationModel;\n const powerTower = foundation.solarPowerTower;\n if (!powerTower) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(heliostat.cx, heliostat.cy, heliostat.cz, parent);\n const normal = new Vector3().fromArray(heliostat.normal);\n const originalNormal = normal.clone();\n const lx = heliostat.lx;\n const ly = heliostat.ly;\n const actualPoleHeight = heliostat.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(heliostat.lx / cellSize));\n const ny = Math.max(2, Math.round(heliostat.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = foundation.lz + actualPoleHeight + heliostat.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const rot = parent.rotation[2];\n // convert the receiver's coordinates into those relative to the center of this heliostat\n const receiverCenter =\n foundation.solarStructure === SolarStructure.FocusTower\n ? new Vector3(\n foundation.cx - center.x,\n foundation.cy - center.y,\n foundation.cz - center.z + (powerTower.towerHeight ?? 10),\n )\n : undefined;\n let heliostatToReceiver;\n let normalEuler;\n if (receiverCenter) {\n heliostatToReceiver = receiverCenter.clone().normalize();\n let normalVector = heliostatToReceiver.clone().add(sunDirection).normalize();\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\n normalVector = new Vector3(-0.001, 0, 1).normalize();\n }\n if (rot) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\n }\n // convert the normal vector to euler\n const r = Math.hypot(normalVector.x, normalVector.y);\n normalEuler = new Euler(\n Math.atan2(r, normalVector.z),\n 0,\n Math.atan2(normalVector.y, normalVector.x) + HALF_PI,\n 'ZXY',\n );\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n } else {\n heliostatToReceiver = new Vector3(0, 0, 1);\n normalEuler = new Euler();\n }\n // the unit of radiation is kW/m^2\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let sum = 0;\n let tmpX = 0;\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(heliostat.id, v, sunDirection) && !inShadow(heliostat.id, v, heliostatToReceiver)) {\n sum += dot * peakRadiation;\n }\n }\n }\n }\n const output = dailyOutputsMapRef.current.get(heliostat.id);\n if (output) {\n // the output is the average radiation density, hence we have to divide it by nx * ny\n // if the minutes are greater than 30 or 30, it is counted as the output of the next hour\n // to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += sum / (nx * ny);\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (heliostat: HeliostatModel) => {\n const parent = getParent(heliostat);\n if (!parent) throw new Error('parent of heliostat does not exist');\n let systemEfficiency = 1;\n if (parent.type === ObjectType.Foundation) {\n const foundation = parent as FoundationModel;\n const powerTower = foundation.solarPowerTower;\n systemEfficiency *=\n (powerTower?.receiverOpticalEfficiency ?? 0.7) *\n (powerTower?.receiverThermalEfficiency ?? 0.3) *\n (powerTower?.receiverAbsorptance ?? 0.95);\n }\n return (\n heliostat.lx *\n heliostat.ly *\n heliostat.reflectance *\n systemEfficiency *\n (1 - monthlyIrradianceLosses[now.getMonth()])\n );\n };\n\n const inShadow = (heliostatId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== heliostatId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const yearlyResult = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyResult && yearlyResult.length === daysPerYear) {\n yearlyResult.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(HeliostatSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n computeSunriseAndSunsetInMinutes,\n getSunDirection,\n} from './sunTools';\nimport { Intersection, Object3D, Raycaster, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport { DatumEntry, ObjectType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport {\n AIR_DENSITY,\n AIR_ISOBARIC_SPECIFIC_HEAT,\n AirMass,\n GRAVITATIONAL_ACCELERATION,\n KELVIN_AT_ZERO_CELSIUS,\n MINUTES_OF_DAY,\n STEFAN_BOLTZMANN_CONSTANT,\n} from './analysisConstants';\nimport { MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport * as Selector from '../stores/selector';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { SunMinutes } from './SunMinutes';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { computeOutsideTemperature, getOutsideTemperatureAtMinute } from './heatTools';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface SolarUpdraftTowerSimulationProps {\n city: string | null;\n}\n\nconst SolarUpdraftTowerSimulation = ({ city }: SolarUpdraftTowerSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const setLabels = useDataStore(Selector.setUpdraftTowerLabels);\n const setDailyResults = useDataStore(Selector.setDailyUpdraftTowerResults);\n const setDailyYield = useDataStore(Selector.setDailyUpdraftTowerYield);\n const setYearlyYield = useDataStore(Selector.setYearlyUpdraftTowerYield);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForUpdraftTower);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForUpdraftTower);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForUpdraftTower);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForUpdraftTower);\n const showDailyUpdraftTowerPanel = useStore(Selector.viewState.showDailyUpdraftTowerYieldPanel);\n const noAnimation = useStore(Selector.world.noAnimationForSolarUpdraftTowerSimulation);\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n const cellSize = world.sutGridCellSize ?? 1;\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? getWeather(city)?.elevation : 0;\n const timesPerHour = world.sutTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.sutDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const objectsRef = useRef([]);\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyAmbientTemperaturesRef = useRef(new Array(24).fill(0));\n const dailyChimneyInletAirTemperaturesMapRef = useRef>(new Map());\n const dailyWindSpeedsMapRef = useRef>(new Map());\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n const dayRef = useRef(0);\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation to generate daily yield */\n\n useEffect(() => {\n if (runDailySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticSimulateDaily();\n } else {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const staticSimulateDaily = () => {\n fetchObjects();\n resetDailyMaps();\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n calculateYieldWithoutAnimation(f);\n }\n }\n }\n setCommonStore((state) => {\n state.viewState.showDailyUpdraftTowerYieldPanel = true;\n state.selectedFloatingWindow = 'dailySolarUpdraftTowerYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForUpdraftTower = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyUpdraftTowerYield();\n state.actionInfo = {\n name: 'Static Daily Simulation for Updraft Tower Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyUpdraftTowerYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n dayRef.current = now.getDay();\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), -minuteInterval / 2);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyMaps();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyUpdraftTowerYieldPanel = true;\n state.selectedFloatingWindow = 'dailySolarUpdraftTowerYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForUpdraftTower = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyUpdraftTowerYield();\n state.actionInfo = {\n name: 'Dynamic Daily Simulation for Updraft Tower Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyUpdraftTowerYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n calculateYield(f);\n }\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const transmissivity = f.solarUpdraftTower.collectorTransmissivity ?? 0.9;\n const turbineEfficiency = f.solarUpdraftTower.turbineEfficiency ?? 0.3;\n const dischargeCoefficient = f.solarUpdraftTower.dischargeCoefficient ?? 0.65;\n const chimneyArea = Math.PI * f.solarUpdraftTower.chimneyRadius * f.solarUpdraftTower.chimneyRadius;\n const collectorArea = Math.PI * f.solarUpdraftTower.collectorRadius * f.solarUpdraftTower.collectorRadius;\n const dca = AIR_DENSITY * AIR_ISOBARIC_SPECIFIC_HEAT * chimneyArea;\n const speedFactor = 2 * GRAVITATIONAL_ACCELERATION * f.solarUpdraftTower.chimneyHeight;\n const chimneyInletTemperatures = dailyChimneyInletAirTemperaturesMapRef.current.get(e.id + '-sut');\n const windSpeeds = dailyWindSpeedsMapRef.current.get(e.id + '-sut');\n const outputs = dailyOutputsMapRef.current.get(e.id + '-sut');\n if (outputs && chimneyInletTemperatures && windSpeeds) {\n const powerFactor = 0.5 * dischargeCoefficient * turbineEfficiency * AIR_DENSITY * chimneyArea;\n const date = new Date(world.date);\n let weather, temp;\n if (city) {\n weather = getWeather(city);\n temp = computeOutsideTemperature(date, weather.lowestTemperatures, weather.highestTemperatures);\n }\n for (let i = 0; i < outputs.length; i++) {\n let ambientTemperature = 20;\n if (weather && temp) {\n date.setHours(i);\n ambientTemperature = getOutsideTemperatureAtMinute(\n temp.high,\n temp.low,\n world.diurnalTemperatureModel,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n Util.minutesIntoDay(date),\n );\n dailyAmbientTemperaturesRef.current[i] = ambientTemperature;\n }\n outputs[i] *= timeFactor * transmissivity * 1000; // from kW to W\n const tAmbientK = ambientTemperature + KELVIN_AT_ZERO_CELSIUS;\n if (outputs[i] > 0 && i > 0 && chimneyInletTemperatures[i - 1] > ambientTemperature) {\n // assume that the average temperature of the collector is the mean between ambient and inlet\n const tCollector = (chimneyInletTemperatures[i - 1] + ambientTemperature) / 2;\n const convectiveLoss =\n (world.airConvectiveCoefficient ?? 5) * collectorArea * (tCollector - ambientTemperature);\n const tCollectorK = tCollector + KELVIN_AT_ZERO_CELSIUS;\n const tCollector4 = tCollectorK * tCollectorK * tCollectorK * tCollectorK;\n const tAmbient4 = tAmbientK * tAmbientK * tAmbientK * tAmbientK;\n const radiationLoss =\n (f.solarUpdraftTower.collectorEmissivity ?? 0.95) *\n STEFAN_BOLTZMANN_CONSTANT *\n collectorArea *\n (tCollector4 - tAmbient4);\n outputs[i] -= convectiveLoss + radiationLoss;\n if (outputs[i] < 0) outputs[i] = 0;\n }\n const a = outputs[i] / (dca * tAmbientK);\n const temperature = tAmbientK * (1 + Math.cbrt((a * a) / speedFactor)) - KELVIN_AT_ZERO_CELSIUS;\n const speed =\n temperature > ambientTemperature\n ? Math.sqrt(speedFactor * ((temperature + KELVIN_AT_ZERO_CELSIUS) / tAmbientK - 1))\n : 0;\n outputs[i] = powerFactor * speed * speed * speed * 0.001; // from W to kW\n chimneyInletTemperatures[i] = temperature;\n windSpeeds[i] = speed;\n }\n }\n }\n }\n }\n generateDailyData();\n };\n\n const generateDailyData = () => {\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n index++;\n const temperature = dailyChimneyInletAirTemperaturesMapRef.current.get(e.id + '-sut');\n if (temperature) {\n map.set('Temperature Tower' + index, temperature);\n }\n const speed = dailyWindSpeedsMapRef.current.get(e.id + '-sut');\n if (speed) {\n map.set('Wind Speed Tower' + index, speed);\n }\n const output = dailyOutputsMapRef.current.get(e.id + '-sut');\n if (output) {\n map.set('Tower' + index, output);\n labels.push(e.label ? e.label : 'Tower' + index);\n }\n }\n }\n }\n const outputs = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Tower' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n outputs.push(datum);\n }\n setDailyYield(outputs);\n const results = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n datum['T_Ambient'] = dailyAmbientTemperaturesRef.current[i];\n for (let k = 1; k <= index; k++) {\n let key = 'Temperature Tower' + k;\n datum['T_' + labels[k - 1]] = map.get(key)?.[i];\n key = 'Wind Speed Tower' + k;\n datum['V_' + labels[k - 1]] = map.get(key)?.[i];\n }\n results.push(datum);\n }\n setDailyResults(results);\n setLabels(labels);\n };\n\n /* do the yearly simulation to generate the yearly yield */\n\n useEffect(() => {\n if (runYearlySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticSimulateYearly();\n } else {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyMaps();\n resetYearlyMap();\n };\n\n const staticSimulateYearly = () => {\n fetchObjects();\n resetDailyMaps();\n resetYearlyMap();\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n for (let month = 0; month < 12; month += monthInterval) {\n now.setMonth(month, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n resetDailyMaps();\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n calculateYieldWithoutAnimation(f);\n }\n }\n }\n finishMonthly();\n sampledDayRef.current++;\n }\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyUpdraftTowerYieldPanel = true;\n state.selectedFloatingWindow = 'yearlySolarUpdraftTowerYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForUpdraftTower = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyUpdraftTowerYield();\n state.actionInfo = {\n name: 'Static Yearly Simulation for Updraft Tower Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyUpdraftTowerYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n calculateYield(f);\n }\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyUpdraftTowerYieldPanel = true;\n state.selectedFloatingWindow = 'yearlySolarUpdraftTowerYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForUpdraftTower = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyUpdraftTowerYield();\n state.actionInfo = {\n name: 'Dynamic Yearly Simulation for Updraft Tower Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyUpdraftTowerYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n resetDailyMaps();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const outputs = dailyOutputsMapRef.current.get(f.id + '-sut');\n const chimneyInletTemperatures = dailyChimneyInletAirTemperaturesMapRef.current.get(e.id + '-sut');\n const windSpeeds = dailyWindSpeedsMapRef.current.get(e.id + '-sut');\n if (outputs && chimneyInletTemperatures && windSpeeds) {\n const transmissivity = f.solarUpdraftTower.collectorTransmissivity ?? 0.9;\n const turbineEfficiency = f.solarUpdraftTower.turbineEfficiency ?? 0.3;\n const dischargeCoefficient = f.solarUpdraftTower.dischargeCoefficient ?? 0.65;\n const chimneyArea = Math.PI * f.solarUpdraftTower.chimneyRadius * f.solarUpdraftTower.chimneyRadius;\n const collectorArea = Math.PI * f.solarUpdraftTower.collectorRadius * f.solarUpdraftTower.collectorRadius;\n const dca = AIR_DENSITY * AIR_ISOBARIC_SPECIFIC_HEAT * chimneyArea;\n const speedFactor = 2 * GRAVITATIONAL_ACCELERATION * f.solarUpdraftTower.chimneyHeight;\n const powerFactor = 0.5 * dischargeCoefficient * turbineEfficiency * AIR_DENSITY * chimneyArea;\n let weather, temp;\n if (city) {\n weather = getWeather(city);\n temp = computeOutsideTemperature(now, weather.lowestTemperatures, weather.highestTemperatures);\n }\n for (let i = 0; i < outputs.length; i++) {\n let ambientTemperature = 20;\n if (weather && temp) {\n now.setHours(i);\n ambientTemperature = getOutsideTemperatureAtMinute(\n temp.high,\n temp.low,\n world.diurnalTemperatureModel,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n Util.minutesIntoDay(now),\n );\n dailyAmbientTemperaturesRef.current[i] = ambientTemperature;\n }\n outputs[i] *= timeFactor * transmissivity * 1000; // from kW to W\n const tAmbientK = ambientTemperature + KELVIN_AT_ZERO_CELSIUS;\n if (outputs[i] > 0 && i > 0 && chimneyInletTemperatures[i - 1] > ambientTemperature) {\n // assume that the average temperature of the collector is the mean between ambient and inlet\n const tCollector = (chimneyInletTemperatures[i - 1] + ambientTemperature) / 2;\n const convectiveLoss =\n (world.airConvectiveCoefficient ?? 5) * collectorArea * (tCollector - ambientTemperature);\n const tCollectorK = tCollector + KELVIN_AT_ZERO_CELSIUS;\n const tCollector4 = tCollectorK * tCollectorK * tCollectorK * tCollectorK;\n const tAmbient4 = tAmbientK * tAmbientK * tAmbientK * tAmbientK;\n const radiationLoss =\n (f.solarUpdraftTower.collectorEmissivity ?? 0.95) *\n STEFAN_BOLTZMANN_CONSTANT *\n collectorArea *\n (tCollector4 - tAmbient4);\n outputs[i] -= convectiveLoss + radiationLoss;\n if (outputs[i] < 0) outputs[i] = 0;\n }\n const a = outputs[i] / (dca * tAmbientK);\n const temperature = tAmbientK * (1 + Math.cbrt((a * a) / speedFactor)) - KELVIN_AT_ZERO_CELSIUS;\n const speed =\n temperature > ambientTemperature\n ? Math.sqrt(speedFactor * ((temperature + KELVIN_AT_ZERO_CELSIUS) / tAmbientK - 1))\n : 0;\n outputs[i] = powerFactor * speed * speed * speed * 0.001; // from W to kW\n chimneyInletTemperatures[i] = temperature;\n windSpeeds[i] = speed;\n }\n const total = yearlyOutputsMapRef.current.get(f.id + '-sut');\n if (total) {\n const sumDaily = outputs.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily;\n }\n }\n }\n }\n }\n if (showDailyUpdraftTowerPanel) {\n generateDailyData();\n }\n };\n\n const generateYearlyData = () => {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const result = yearlyOutputsMapRef.current.get(e.id + '-sut');\n if (result) {\n resultArr.push(result);\n labels.push(e.label ? e.label : 'Tower' + ++index);\n }\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setLabels(labels);\n };\n\n /* shared functions between daily and yearly simulation */\n\n const resetDailyMaps = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const airTemperatures = dailyChimneyInletAirTemperaturesMapRef.current.get(e.id + '-sut');\n if (airTemperatures) {\n airTemperatures.fill(0);\n } else {\n dailyChimneyInletAirTemperaturesMapRef.current.set(e.id + '-sut', new Array(24).fill(0));\n }\n const windSpeeds = dailyWindSpeedsMapRef.current.get(e.id + '-sut');\n if (windSpeeds) {\n windSpeeds.fill(0);\n } else {\n dailyWindSpeedsMapRef.current.set(e.id + '-sut', new Array(24).fill(0));\n }\n const yields = dailyOutputsMapRef.current.get(e.id + '-sut');\n if (yields) {\n yields.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id + '-sut', new Array(24).fill(0));\n }\n }\n }\n }\n };\n\n const resetYearlyMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const yearlyOutput = yearlyOutputsMapRef.current.get(e.id + '-sut');\n if (yearlyOutput && yearlyOutput.length === daysPerYear) {\n yearlyOutput.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id + '-sut', new Array(daysPerYear).fill(0));\n }\n }\n }\n }\n };\n\n const calculateYield = (foundation: FoundationModel) => {\n const solarUpdraftTower = foundation.solarUpdraftTower;\n if (!solarUpdraftTower) return;\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const output = dailyOutputsMapRef.current.get(foundation.id + '-sut');\n if (output) {\n const dayOfYear = Util.dayOfYear(now);\n const normal = new Vector3().fromArray(foundation.normal);\n const radius = solarUpdraftTower.collectorRadius;\n const max = Math.max(2, Math.round((radius * 2) / cellSize));\n // shift half cell size to the center of each grid cell\n const x0 = foundation.cx - radius + cellSize / 2;\n const y0 = foundation.cy - radius + cellSize / 2;\n const z0 = foundation.lz + solarUpdraftTower.collectorHeight;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const vec = new Vector3(0, 0, z0);\n const dot = normal.dot(sunDirection);\n const rsq = radius * radius;\n let result = 0;\n let countPoints = 0;\n let dx, dy;\n for (let u = 0; u < max; u++) {\n vec.x = x0 + u * cellSize;\n dx = vec.x - foundation.cx;\n for (let v = 0; v < max; v++) {\n vec.y = y0 + v * cellSize;\n dy = vec.y - foundation.cy;\n if (dx * dx + dy * dy > rsq) continue;\n countPoints++;\n result += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(foundation.id + '-sut', vec, sunDirection)) {\n result += dot * peakRadiation;\n }\n }\n }\n }\n if (countPoints) result /= countPoints;\n // the output is the average radiation intensity. if the minutes are greater than 30 or 30, it is counted\n // as the measurement of the next hour to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n const area = Math.PI * solarUpdraftTower.collectorRadius * solarUpdraftTower.collectorRadius;\n output[index] += result * area;\n }\n };\n\n // if there are no moving parts, this is way faster\n const calculateYieldWithoutAnimation = (foundation: FoundationModel) => {\n const solarUpdraftTower = foundation.solarUpdraftTower;\n if (!solarUpdraftTower) return;\n const result = dailyOutputsMapRef.current.get(foundation.id + '-sut');\n if (!result) return;\n const normal = new Vector3().fromArray(foundation.normal);\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const radius = solarUpdraftTower.collectorRadius;\n const max = Math.max(2, Math.round((radius * 2) / cellSize));\n // shift half cell size to the center of each grid cell\n const x0 = foundation.cx - radius + cellSize / 2;\n const y0 = foundation.cy - radius + cellSize / 2;\n const z0 = foundation.lz + solarUpdraftTower.collectorHeight;\n const v = new Vector3(0, 0, z0);\n const rsq = radius * radius;\n let countPoints = 0;\n let dx, dy;\n const area = Math.PI * solarUpdraftTower.collectorRadius * solarUpdraftTower.collectorRadius;\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < timesPerHour; j++) {\n // a shift of 30 minutes minute half of the interval ensures the symmetry of the result around noon\n const cur = new Date(year, month, date, i, (j + 0.5) * minuteInterval - 30);\n const sunDirection = getSunDirection(cur, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n countPoints = 0;\n for (let kx = 0; kx < max; kx++) {\n v.x = x0 + kx * cellSize;\n dx = v.x - foundation.cx;\n for (let ky = 0; ky < max; ky++) {\n v.y = y0 + ky * cellSize;\n dy = v.y - foundation.cy;\n if (dx * dx + dy * dy > rsq) continue;\n countPoints++;\n result[i] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(foundation.id + '-sut', v, sunDirection)) {\n result[i] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n if (countPoints) result[i] /= countPoints;\n result[i] *= area;\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60; // in hours\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const month = now.getMonth();\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * timesPerHour) : 0;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const inShadow = (foundationId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== foundationId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n return <>;\n};\n\nexport default React.memo(SolarUpdraftTowerSimulation);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Vector3 } from 'three';\nimport { HumanModel } from '../models/HumanModel';\n\nexport class Vantage {\n position: Vector3;\n observer: HumanModel;\n\n constructor(position: Vector3, observer: HumanModel) {\n this.position = position;\n this.observer = observer;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { Euler, Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { HumanModel } from '../models/HumanModel';\nimport { Vantage } from './Vantage';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst SolarPanelVisibility = () => {\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const runAnalysis = usePrimitiveStore(Selector.runSolarPanelVisibilityAnalysis);\n\n const { scene } = useThree();\n const lang = { lng: language };\n const ray = useMemo(() => new Raycaster(), []);\n const cellSize = world.solarPanelVisibilityGridCellSize ?? 0.2;\n const vantagesRef = useRef([]);\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n\n useEffect(() => {\n if (runAnalysis) {\n if (elements && elements.length > 0) {\n analyze();\n setPrimitiveStore('runSolarPanelVisibilityAnalysis', false);\n setCommonStore((state) => {\n state.viewState.showSolarPanelVisibilityResultsPanel = true;\n state.selectedFloatingWindow = 'visibilityResultsPanel';\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n }\n }\n setPrimitiveStore('simulationInProgress', false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runAnalysis]);\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const fetchVantages = () => {\n vantagesRef.current = [];\n for (const e of elements) {\n if (e.type === ObjectType.Human) {\n const human = e as HumanModel;\n if (human.observer) {\n const parent = getParent(human);\n const position = parent\n ? Util.absoluteHumanOrTreeCoordinates(human.cx, human.cy, human.cz, parent)\n : new Vector3(human.cx, human.cy, human.cz);\n position.z += human.lz;\n vantagesRef.current.push(new Vantage(position, human));\n }\n }\n }\n };\n\n const analyze = () => {\n useDataStore.getState().clearSolarPanelVisibilityResults();\n fetchVantages();\n if (vantagesRef.current.length === 0) return;\n fetchObjects();\n for (const vantage of vantagesRef.current) {\n const resultMap = new Map();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const sp = e as SolarPanelModel;\n resultMap.set(sp.parentId, 0);\n }\n }\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const sp = e as SolarPanelModel;\n let vf = resultMap.get(sp.parentId) ?? 0;\n vf += getViewFactor(sp, vantage.position) * 100; // 100 is for percentage\n resultMap.set(sp.parentId, vf);\n }\n }\n useDataStore.getState().setSolarPanelVisibilityResult(vantage, resultMap);\n }\n };\n\n // view factor: https://en.wikipedia.org/wiki/View_factor\n const getViewFactor = (panel: SolarPanelModel, vantage: Vector3) => {\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = false;\n if (parent.type === ObjectType.Roof) {\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n rooftop = true;\n }\n const center = Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n if (rooftop) {\n center.z = panel.cz + parent.cz + parent.lz / 2;\n }\n const normal = new Vector3().fromArray(panel.normal);\n const zRot = parent.rotation[2] + panel.relativeAzimuth;\n if (Math.abs(panel.tiltAngle) > 0.001) {\n normal.applyEuler(new Euler(panel.tiltAngle, 0, zRot, 'ZYX'));\n }\n const lx = panel.lx;\n const ly = panel.ly * Math.cos(panel.tiltAngle);\n const lz = panel.ly * Math.abs(Math.sin(panel.tiltAngle));\n const nx = Math.max(2, Math.round(panel.lx / cellSize));\n const ny = Math.max(2, Math.round(panel.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const dz = lz / ny;\n const x0 = center.x - lx / 2;\n const y0 = center.y - ly / 2;\n const z0 = (rooftop ? center.z : panel.poleHeight + center.z) - lz / 2;\n const center2d = new Vector2(center.x, center.y);\n let integral = 0;\n const point = new Vector3();\n const direction = new Vector3();\n let r;\n const v2 = new Vector2();\n const zRotZero = Util.isZero(zRot);\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n v2.set(x0 + kx * dx, y0 + ky * dy);\n if (!zRotZero) v2.rotateAround(center2d, zRot);\n point.set(v2.x, v2.y, z0 + ky * dz);\n direction.set(vantage.x - point.x, vantage.y - point.y, vantage.z - point.z);\n r = direction.length();\n if (r > 0) {\n direction.normalize();\n if (isVisible(panel.id, point, direction)) {\n integral += Math.abs(direction.dot(normal)) / (r * r);\n }\n }\n }\n }\n return (integral * cellSize * cellSize) / (4 * Math.PI);\n };\n\n const isVisible = (panelId: string, point: Vector3, direction: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(point, direction);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== panelId); // exclude this panel itself\n ray.intersectObjects(objects, false, intersectionsRef.current);\n if (intersectionsRef.current.length === 0) return true;\n for (const [index, intersect] of intersectionsRef.current.entries()) {\n if (intersect.object.name.endsWith('eyeball')) {\n if (index === 0) return true;\n }\n }\n return false;\n }\n return true;\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelVisibility);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n computeSunriseAndSunsetInMinutes,\n getSunDirection,\n} from './sunTools';\nimport { Intersection, Object3D, Raycaster, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport { DatumEntry, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass, MINUTES_OF_DAY } from './analysisConstants';\nimport {\n MONTHS,\n UNIT_VECTOR_NEG_Y_ARRAY,\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Z_ARRAY,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { SensorModel } from '../models/SensorModel';\nimport * as Selector from '../stores/selector';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { SunMinutes } from './SunMinutes';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface SensorSimulationProps {\n city: string | null;\n}\n\nconst SensorSimulation = ({ city }: SensorSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const getWeather = useStore(Selector.getWeather);\n const getHorizontalSolarRadiation = useStore(Selector.getHorizontalSolarRadiation);\n const getVerticalSolarRadiation = useStore(Selector.getVerticalSolarRadiation);\n const setSensorLabels = useDataStore(Selector.setSensorLabels);\n const setDailyLightSensorData = useDataStore(Selector.setDailyLightSensorData);\n const setYearlyLightSensorData = useDataStore(Selector.setYearlyLightSensorData);\n const runDailyLightSensor = usePrimitiveStore(Selector.runDailyLightSensor);\n const pauseDailyLightSensor = usePrimitiveStore(Selector.pauseDailyLightSensor);\n const runYearlyLightSensor = usePrimitiveStore(Selector.runYearlyLightSensor);\n const pauseYearlyLightSensor = usePrimitiveStore(Selector.pauseYearlyLightSensor);\n const showDailyLightSensorPanel = useStore(Selector.viewState.showDailyLightSensorPanel);\n const noAnimation = useStore(Selector.world.noAnimationForSensorDataCollection);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n const measuredHorizontalRadiation = useMemo(() => getHorizontalSolarRadiation(city ?? 'Boston MA, USA'), [city]);\n const measuredVerticalRadiation = useMemo(() => getVerticalSolarRadiation(city ?? 'Boston MA, USA'), [city]);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.timesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const ray = useMemo(() => new Raycaster(), []);\n const objectsRef = useRef([]);\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyDataMapRef = useRef>(new Map());\n const yearlyDataMapRef = useRef>(new Map());\n const daylightArrayRef = useRef(new Array(12).fill(0));\n const clearnessArrayRef = useRef(new Array(12).fill(0));\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n const dayRef = useRef(0);\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n /* do the daily simulation to generate daily sensor data */\n\n useEffect(() => {\n if (runDailyLightSensor) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticSimulateDaily();\n } else {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailyLightSensor]);\n\n useEffect(() => {\n pauseRef.current = pauseDailyLightSensor;\n if (pauseDailyLightSensor) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailyLightSensor]);\n\n const staticSimulateDaily = () => {\n fetchObjects();\n resetDailyDataMap();\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n calculateMeasurementWithoutAnimation(e as SensorModel);\n }\n }\n setCommonStore((state) => {\n state.viewState.showDailyLightSensorPanel = true;\n state.selectedFloatingWindow = 'dailyLightSensorPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailyLightSensor = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Static Daily Simulation for Sensors Completed',\n details: useDataStore.getState().dailyLightSensorData,\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n dayRef.current = now.getDay();\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), -minuteInterval / 2);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyDataMap();\n };\n\n const simulateDaily = () => {\n if (runDailyLightSensor && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyLightSensorPanel = true;\n state.selectedFloatingWindow = 'dailyLightSensorPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailyLightSensor = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Dynamic Daily Simulation for Sensors Completed',\n details: useDataStore.getState().dailyLightSensorData,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n calculateMeasurement(e as SensorModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = dailyDataMapRef.current.get(e.id);\n if (result) {\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= timeFactor;\n }\n }\n }\n }\n generateDailyData();\n };\n\n const generateDailyData = () => {\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = dailyDataMapRef.current.get(e.id);\n if (result) {\n map.set('Radiation' + ++index, result);\n labels.push(e.label ? e.label : 'Radiation' + index);\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Radiation' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyLightSensorData(data);\n setSensorLabels(labels);\n };\n\n /* do the yearly simulation to collect sensor data */\n\n useEffect(() => {\n if (runYearlyLightSensor) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticSimulateYearly();\n } else {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlyLightSensor]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlyLightSensor;\n if (pauseYearlyLightSensor) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlyLightSensor]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyDataMap();\n resetYearlyDataMap();\n };\n\n const staticSimulateYearly = () => {\n fetchObjects();\n resetDailyDataMap();\n resetYearlyDataMap();\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n for (let month = 0; month < 12; month++) {\n now.setMonth(month, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n resetDailyDataMap();\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n calculateMeasurementWithoutAnimation(e as SensorModel);\n }\n }\n finishMonthly();\n sampledDayRef.current++;\n }\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyLightSensorPanel = true;\n state.selectedFloatingWindow = 'yearlyLightSensorPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlyLightSensor = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Static Yearly Simulation for Sensors Completed',\n details: useDataStore.getState().yearlyLightSensorData,\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const simulateYearly = () => {\n if (runYearlyLightSensor && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n calculateMeasurement(e as SensorModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === 12) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyLightSensorPanel = true;\n state.selectedFloatingWindow = 'yearlyLightSensorPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlyLightSensor = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Dynamic Yearly Simulation for Sensors Completed',\n details: useDataStore.getState().yearlyLightSensorData,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current, 22);\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n resetDailyDataMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = dailyDataMapRef.current.get(e.id);\n if (result) {\n const total = yearlyDataMapRef.current.get(e.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor;\n }\n }\n }\n }\n if (showDailyLightSensorPanel) finishDaily();\n };\n\n const generateYearlyData = () => {\n const resultArr = [];\n const labels = [];\n let index = 0;\n let hasHorizontalSensor = false;\n let hasVerticalSensor = false;\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = yearlyDataMapRef.current.get(e.id);\n if (result) {\n resultArr.push(result);\n labels.push(e.label ? e.label : 'Radiation' + ++index);\n if (!hasHorizontalSensor && Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\n hasHorizontalSensor = true;\n }\n if (!hasVerticalSensor && Util.isIdentical(e.normal, UNIT_VECTOR_NEG_Y_ARRAY)) {\n hasVerticalSensor = true;\n }\n }\n }\n }\n const includeHorizontalMeasurement = hasHorizontalSensor && measuredHorizontalRadiation;\n if (includeHorizontalMeasurement) labels.push('Measured (Hor.)');\n const includeVerticalMeasurement = hasVerticalSensor && measuredVerticalRadiation;\n if (includeVerticalMeasurement) labels.push('Measured (Ver.)');\n const results = [];\n for (let month = 0; month < 12; month++) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r['Daylight'] = daylightArrayRef.current[month];\n r['Clearness'] = clearnessArrayRef.current[month] * 100;\n if (includeHorizontalMeasurement) r['Measured (Hor.)'] = measuredHorizontalRadiation.data[month];\n if (includeVerticalMeasurement) r['Measured (Ver.)'] = measuredVerticalRadiation.data[month];\n r[labels[i]] = a[month];\n }\n results.push(r);\n }\n setYearlyLightSensorData(results);\n setSensorLabels(labels);\n };\n\n /* shared functions between daily and yearly simulation */\n\n const resetDailyDataMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = dailyDataMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyDataMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyDataMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const yearlyResult = yearlyDataMapRef.current.get(e.id);\n if (yearlyResult) {\n yearlyResult.fill(0);\n } else {\n yearlyDataMapRef.current.set(e.id, new Array(12).fill(0));\n }\n }\n }\n };\n\n const calculateMeasurement = (sensor: SensorModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(sensor);\n if (!parent) throw new Error('parent of sensor does not exist');\n let foundation: FoundationModel | null = null;\n if (parent.type === ObjectType.Wall) {\n foundation = getFoundation(sensor);\n }\n const position = Util.absoluteCoordinates(\n sensor.cx,\n sensor.cy,\n sensor.cz,\n parent,\n foundation ? (foundation as FoundationModel) : undefined,\n );\n const normal = new Vector3().fromArray(sensor.normal);\n // TODO: right now we assume a parent rotation is always around the z-axis\n normal.applyAxisAngle(UNIT_VECTOR_POS_Z, parent.rotation[2]);\n const dayOfYear = Util.dayOfYear(now);\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n // indirect radiation\n let result = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normal, peakRadiation);\n if (dot > 0) {\n if (!inShadow(sensor.id, position, sunDirection)) {\n // direct radiation\n result += dot * peakRadiation;\n }\n }\n const output = dailyDataMapRef.current.get(sensor.id);\n if (output) {\n // the output is the average radiation intensity. if the minutes are greater than 30 or 30, it is counted\n // as the measurement of the next hour to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += result;\n }\n };\n\n // if there are no moving parts, this is way faster\n const calculateMeasurementWithoutAnimation = (sensor: SensorModel) => {\n const parent = getParent(sensor);\n if (!parent) throw new Error('parent of sensor does not exist');\n const result = dailyDataMapRef.current.get(sensor.id);\n if (!result) return;\n let foundation: FoundationModel | null = null;\n if (parent.type === ObjectType.Wall) {\n foundation = getFoundation(sensor);\n }\n const position = Util.absoluteCoordinates(\n sensor.cx,\n sensor.cy,\n sensor.cz,\n parent,\n foundation ? (foundation as FoundationModel) : undefined,\n );\n const normal = new Vector3().fromArray(sensor.normal);\n // TODO: right now we assume a parent rotation is always around the z-axis\n normal.applyAxisAngle(UNIT_VECTOR_POS_Z, parent.rotation[2]);\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < timesPerHour; j++) {\n // a shift of 30 minutes minute half of the interval ensures the symmetry of the result around noon\n const cur = new Date(year, month, date, i, (j + 0.5) * minuteInterval - 30);\n const sunDirection = getSunDirection(cur, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n if (dot > 0) {\n if (!inShadow(sensor.id, position, sunDirection)) {\n // direct radiation\n result[i] += dot * peakRadiation;\n }\n }\n // indirect radiation\n result[i] += calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n }\n }\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const month = now.getMonth();\n const daylight = sunMinutesRef.current.daylight() / 60;\n if (daylight > ZERO_TOLERANCE) {\n daylightArrayRef.current[month] = daylight;\n clearnessArrayRef.current[month] = weather.sunshineHours[month] / (30 * daylight);\n return clearnessArrayRef.current[month] / timesPerHour;\n }\n daylightArrayRef.current[month] = 0;\n clearnessArrayRef.current[month] = 0;\n return 0;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const inShadow = (sensorId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== sensorId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n return <>;\n};\n\nexport default React.memo(SensorSimulation);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n computeSunriseAndSunsetInMinutes,\n getSunDirection,\n} from './sunTools';\nimport { Euler, Intersection, Object3D, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, Discretization, ObjectType, Orientation, ShadeTolerance, TrackerType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass, MINUTES_OF_DAY } from './analysisConstants';\nimport { HALF_PI, MONTHS, UNIT_VECTOR_POS_Y, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { computeOutsideTemperature, getOutsideTemperatureAtMinute } from './heatTools';\nimport { PvModel } from '../models/PvModel';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { SunMinutes } from './SunMinutes';\nimport { WallModel } from '../models/WallModel';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface SolarPanelSimulationProps {\n city: string | null;\n}\n\nconst getPanelEfficiency = (temperature: number, pvModel: PvModel) => {\n let e = pvModel.efficiency;\n if (pvModel.cellType === 'Monocrystalline') {\n e *= 0.95; // assuming that the packing density factor of semi-round cells is 0.95\n }\n return e * (1 + pvModel.pmaxTC * (temperature - 25));\n};\n\nconst SolarPanelSimulation = ({ city }: SolarPanelSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getPvModule = useStore(Selector.getPvModule);\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const setDailyYield = useDataStore(Selector.setDailyPvYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const setYearlyYield = useDataStore(Selector.setYearlyPvYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyPvIndividualOutputs);\n const yearlyIndividualOutputs = useStore(Selector.yearlyPvIndividualOutputs);\n const setSolarPanelLabels = useDataStore(Selector.setSolarPanelLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForSolarPanels);\n const runDailySimulationLastStep = usePrimitiveStore(Selector.runDailySimulationForSolarPanelsLastStep);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForSolarPanels);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForSolarPanels);\n const runYearlySimulationLastStep = usePrimitiveStore(Selector.runYearlySimulationForSolarPanelsLastStep);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForSolarPanels);\n const showDailyPvYieldPanel = useStore(Selector.viewState.showDailyPvYieldPanel);\n const noAnimation = useStore(Selector.world.noAnimationForSolarPanelSimulation);\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.timesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.daysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.pvGridCellSize ?? 0.25;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n const dayRef = useRef(0);\n const currentTemperatureRef = useRef(20);\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation to generate daily PV outputs */\n\n useEffect(() => {\n if (runDailySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n staticSimulateDaily(false);\n }, 50);\n } else {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n // this is used in the last step of simulation in an evolution\n useEffect(() => {\n if (runDailySimulationLastStep) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n staticSimulateDaily(true);\n }, 50);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulationLastStep]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const staticSimulateDaily = (lastStep: boolean) => {\n fetchObjects();\n resetDailyOutputsMap();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n calculateYieldWithoutAnimation(e as SolarPanelModel);\n }\n }\n setCommonStore((state) => {\n if (!runEvolution && !lastStep) {\n state.viewState.showDailyPvYieldPanel = true;\n state.selectedFloatingWindow = 'dailyPvYieldPanel';\n }\n });\n usePrimitiveStore.setState((state) => {\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = false;\n } else {\n state.runDailySimulationForSolarPanels = false;\n }\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n simulationCompletedRef.current = true;\n finishDaily();\n if (!runEvolution && !lastStep) {\n // don't show info or log data when this simulation is called by an evolution\n showInfo(i18n.t('message.SimulationCompleted', lang));\n if (loggable) {\n const totalDailyYield = useDataStore.getState().sumDailyPvYield();\n const dailyProfit = useDataStore.getState().getDailyPvProfit();\n const dailyYieldArray = useDataStore.getState().dailyPvYield;\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Static Daily Simulation for Solar Panels Completed',\n result: { totalYield: totalDailyYield.toFixed(2), profit: dailyProfit.toFixed(2) },\n details: dailyYieldArray,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n };\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n dayRef.current = now.getDay();\n // beginning before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), -minuteInterval / 2);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n if (!runEvolution) {\n state.viewState.showDailyPvYieldPanel = true;\n state.selectedFloatingWindow = 'dailyPvYieldPanel';\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForSolarPanels = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n simulationCompletedRef.current = true;\n finishDaily();\n if (!runEvolution) {\n // don't show info or log data when this simulation is called by an evolution\n showInfo(i18n.t('message.SimulationCompleted', lang));\n if (loggable) {\n const totalDailyYield = useDataStore.getState().sumDailyPvYield();\n const dailyProfit = useDataStore.getState().getDailyPvProfit();\n const dailyYieldArray = useDataStore.getState().dailyPvYield;\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Dynamic Daily Simulation for Solar Panels Completed',\n result: { totalYield: totalDailyYield.toFixed(2), profit: dailyProfit.toFixed(2) },\n details: dailyYieldArray,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n calculateYield(e as SolarPanelModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const panel = e as SolarPanelModel;\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n const factor = getElementFactor(panel) * timeFactor;\n for (let i = 0; i < output.length; i++) {\n if (output[i] !== 0) output[i] *= factor;\n }\n }\n }\n }\n generateDailyData();\n };\n\n const generateDailyData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Panel' + index, output);\n labels.push(e.label ? e.label : 'Panel' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Panel' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setSolarPanelLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation to generate yearly PV outputs */\n\n useEffect(() => {\n if (runYearlySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n staticSimulateYearly(false);\n }, 50);\n } else {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n // this is used for the last step of simulation in an evolution\n useEffect(() => {\n if (runYearlySimulationLastStep) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n staticSimulateYearly(true);\n }, 50);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulationLastStep]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const staticSimulateYearly = (lastStep: boolean) => {\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n for (let month = 0; month < 12; month += monthInterval) {\n now.setMonth(month, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n resetDailyOutputsMap();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n calculateYieldWithoutAnimation(e as SolarPanelModel);\n }\n }\n finishMonthly();\n sampledDayRef.current++;\n }\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n if (!runEvolution && !lastStep) {\n state.viewState.showYearlyPvYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyPvYieldPanel';\n }\n });\n usePrimitiveStore.setState((state) => {\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = false;\n } else {\n state.runYearlySimulationForSolarPanels = false;\n }\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (!runEvolution && !lastStep) {\n // don't show info or log data when this simulation is called by an evolution\n showInfo(i18n.t('message.SimulationCompleted', lang));\n if (loggable) {\n const totalYearlyYield = useDataStore.getState().sumYearlyPvYield();\n const yearlyProfit = useDataStore.getState().getYearlyPvProfit();\n const yearlyYieldArray = useDataStore.getState().yearlyPvYield;\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Static Yearly Simulation for Solar Panels Completed',\n result: { totalYield: totalYearlyYield.toFixed(2), profit: yearlyProfit.toFixed(2) },\n details: yearlyYieldArray,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n calculateYield(e as SolarPanelModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n if (!runEvolution) {\n state.viewState.showYearlyPvYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyPvYieldPanel';\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForSolarPanels = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (!runEvolution) {\n // don't show info or log data when this simulation is called by an evolution\n showInfo(i18n.t('message.SimulationCompleted', lang));\n if (loggable) {\n const totalYearlyYield = useDataStore.getState().sumYearlyPvYield();\n const yearlyProfit = useDataStore.getState().getYearlyPvProfit();\n const yearlyYieldArray = useDataStore.getState().yearlyPvYield;\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Dynamic Yearly Simulation for Solar Panels Completed',\n result: { totalYield: totalYearlyYield.toFixed(2), profit: yearlyProfit.toFixed(2) },\n details: yearlyYieldArray,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const panel = e as SolarPanelModel;\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(e.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(panel);\n }\n }\n }\n }\n if (!runEvolution && showDailyPvYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Panel' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setSolarPanelLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions between daily and yearly simulation */\n\n // if there are no moving parts, this is way faster\n const calculateYieldWithoutAnimation = (panel: SolarPanelModel) => {\n if (panel.trackerType !== TrackerType.NO_TRACKER)\n throw new Error('static simulation is not for solar panel with tracker');\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n }\n const pvModel = getPvModule(panel.pvModelName);\n if (!pvModel) throw new Error('PV model not found');\n const output = dailyOutputsMapRef.current.get(panel.id);\n if (!output) return;\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, getFoundation(panel), panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const rot = parent.rotation[2];\n let zRot = rot + panel.relativeAzimuth;\n let angle = panel.tiltAngle;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const foundation = getFoundation(parent);\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n const normal = new Vector3().fromArray(panel.normal);\n // TODO: right now we assume a parent rotation is always around the z-axis\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof\n // or wall. So we only need to tilt the normal for a solar panel on a foundation or flat roof or wall.\n const normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n normal.applyEuler(normalEuler);\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n let lx: number, ly: number, nx: number, ny: number;\n let dCell: number;\n if (world.discretization === Discretization.EXACT) {\n lx = panel.lx;\n ly = panel.ly;\n if (panel.orientation === Orientation.portrait) {\n nx = Math.max(1, Math.round(panel.lx / pvModel.width));\n ny = Math.max(1, Math.round(panel.ly / pvModel.length));\n nx *= pvModel.n;\n ny *= pvModel.m;\n } else {\n nx = Math.max(1, Math.round(panel.lx / pvModel.length));\n ny = Math.max(1, Math.round(panel.ly / pvModel.width));\n nx *= pvModel.m;\n ny *= pvModel.n;\n }\n dCell = panel.lx / nx;\n } else {\n lx = panel.lx;\n ly = panel.ly;\n nx = Math.max(2, Math.round(panel.lx / cellSize));\n ny = Math.max(2, Math.round(panel.ly / cellSize));\n // nx and ny must be even (for circuit simulation)\n if (nx % 2 !== 0) nx += 1;\n if (ny % 2 !== 0) ny += 1;\n dCell = cellSize;\n }\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - dCell) / 2;\n const y0 = center.y - (ly - dCell) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const cellOutputs = Array.from(Array(nx), () => new Array(ny));\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < timesPerHour; j++) {\n // a shift of 30 minutes minute half of the interval ensures the symmetry of the result around noon\n const currentTime = new Date(year, month, date, i, (j + 0.5) * minuteInterval - 30);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const frontIndirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n if (pvModel.bifacialityFactor > 0) {\n // bifacial panel\n const backsideNormal = normal.clone().negate();\n const backIndirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n backsideNormal,\n peakRadiation,\n );\n const indirectRadiation = frontIndirectRadiation + backIndirectRadiation * pvModel.bifacialityFactor;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = indirectRadiation;\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n cellOutputs[kx][ky] += (dot > 0 ? dot : -dot * pvModel.bifacialityFactor) * peakRadiation;\n }\n }\n }\n } else {\n // monofacial panel\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = frontIndirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n // we must consider cell wiring and distributed efficiency\n // Nice demo at: https://www.youtube.com/watch?v=UNPJapaZlCU\n let sum = 0;\n updateTemperature(currentTime);\n const eff = getPanelEfficiency(currentTemperatureRef.current, pvModel);\n switch (pvModel.shadeTolerance) {\n case ShadeTolerance.NONE:\n // all the cells are connected in a single series,\n // so the total output is determined by the minimum\n let min1 = Number.MAX_VALUE;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min1) {\n min1 = c;\n }\n }\n }\n sum = min1 * nx * ny;\n break;\n case ShadeTolerance.PARTIAL:\n // assuming each panel uses a diode bypass to connect two columns of cells\n let min2 = Number.MAX_VALUE;\n if (panel.orientation === Orientation.portrait) {\n // e.g., nx = 6, ny = 10\n for (let kx = 0; kx < nx; kx++) {\n if (kx % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (kx % 2 === 1) {\n sum += min2 * ny * 2;\n }\n }\n } else {\n // landscape, e.g., nx = 10, ny = 6\n for (let ky = 0; ky < ny; ky++) {\n if (ky % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let kx = 0; kx < nx; kx++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (ky % 2 === 1) {\n sum += min2 * nx * 2;\n }\n }\n }\n break;\n default:\n // this probably is too idealized\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n sum += cellOutputs[kx][ky];\n }\n }\n break;\n }\n output[i] += (eff * sum) / (nx * ny);\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = 0;\n }\n }\n }\n }\n }\n };\n\n const calculateYield = (panel: SolarPanelModel) => {\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n }\n const pvModel = getPvModule(panel.pvModelName);\n if (!pvModel) throw new Error('PV model not found');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, getFoundation(panel), panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const rot = parent.rotation[2];\n let angle = panel.tiltAngle;\n let zRot = rot + panel.relativeAzimuth;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const foundation = getFoundation(parent);\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n const normal = new Vector3().fromArray(panel.normal);\n const month = now.getMonth();\n const dayOfYear = Util.dayOfYear(now);\n let lx: number, ly: number, nx: number, ny: number;\n let dCell: number;\n if (world.discretization === Discretization.EXACT) {\n lx = panel.lx;\n ly = panel.ly;\n if (panel.orientation === Orientation.portrait) {\n nx = Math.max(1, Math.round(panel.lx / pvModel.width));\n ny = Math.max(1, Math.round(panel.ly / pvModel.length));\n nx *= pvModel.n;\n ny *= pvModel.m;\n } else {\n nx = Math.max(1, Math.round(panel.lx / pvModel.length));\n ny = Math.max(1, Math.round(panel.ly / pvModel.width));\n nx *= pvModel.m;\n ny *= pvModel.n;\n }\n dCell = panel.lx / nx;\n } else {\n lx = panel.lx;\n ly = panel.ly;\n nx = Math.max(2, Math.round(panel.lx / cellSize));\n ny = Math.max(2, Math.round(panel.ly / cellSize));\n // nx and ny must be even (for circuit simulation)\n if (nx % 2 !== 0) nx += 1;\n if (ny % 2 !== 0) ny += 1;\n dCell = cellSize;\n }\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - dCell) / 2;\n const y0 = center.y - (ly - dCell) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const cellOutputs = Array.from(Array(nx), () => new Array(ny));\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof.\n // so we only need to tilt the normal for a solar panel on a foundation or flat roof\n let normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n if (panel.trackerType !== TrackerType.NO_TRACKER) {\n // dynamic angles\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n switch (panel.trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const qRotAADAT = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n normalEuler = new Euler().setFromQuaternion(qRotAADAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n const qRotHSAT = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x, 0, rotatedSunDirection.z).normalize(),\n );\n normalEuler = new Euler().setFromQuaternion(qRotHSAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n const v2 = new Vector3(rotatedSunDirection.x, -rotatedSunDirection.y, 0).normalize();\n const az = Math.acos(UNIT_VECTOR_POS_Y.dot(v2)) * Math.sign(v2.x);\n normalEuler = new Euler(panel.tiltAngle, 0, az + rot, 'ZYX');\n break;\n case TrackerType.TILTED_SINGLE_AXIS_TRACKER:\n // TODO\n break;\n }\n }\n normal.applyEuler(normalEuler);\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const frontIndirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n if (pvModel.bifacialityFactor > 0) {\n // bifacial panel\n const backsideNormal = normal.clone().negate();\n const backIndirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n backsideNormal,\n peakRadiation,\n );\n const indirectRadiation = frontIndirectRadiation + backIndirectRadiation * pvModel.bifacialityFactor;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = indirectRadiation;\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n cellOutputs[kx][ky] += (dot > 0 ? dot : -dot * pvModel.bifacialityFactor) * peakRadiation;\n }\n }\n }\n } else {\n // monofacial panel\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = frontIndirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n // we must consider cell wiring and distributed efficiency\n // Nice demo at: https://www.youtube.com/watch?v=UNPJapaZlCU\n let sum = 0;\n switch (pvModel.shadeTolerance) {\n case ShadeTolerance.NONE:\n // all the cells are connected in a single series,\n // so the total output is determined by the minimum\n let min1 = Number.MAX_VALUE;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min1) {\n min1 = c;\n }\n }\n }\n sum = min1 * nx * ny;\n break;\n case ShadeTolerance.PARTIAL:\n // assuming each panel uses a diode bypass to connect two columns of cells\n let min2 = Number.MAX_VALUE;\n if (panel.orientation === Orientation.portrait) {\n // e.g., nx = 6, ny = 10\n for (let kx = 0; kx < nx; kx++) {\n if (kx % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (kx % 2 === 1) {\n sum += min2 * ny * 2;\n }\n }\n } else {\n // landscape, e.g., nx = 10, ny = 6\n for (let ky = 0; ky < ny; ky++) {\n if (ky % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let kx = 0; kx < nx; kx++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (ky % 2 === 1) {\n sum += min2 * nx * 2;\n }\n }\n }\n break;\n default:\n // this probably is too idealized\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n sum += cellOutputs[kx][ky];\n }\n }\n break;\n }\n const output = dailyOutputsMapRef.current.get(panel.id);\n if (output) {\n updateTemperature(now);\n const eff = getPanelEfficiency(currentTemperatureRef.current, pvModel);\n // the output is the average radiation intensity. if the minutes are greater than 30 or 30, it is counted\n // as the measurement of the next hour to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += (eff * sum) / (nx * ny);\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n output.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const yearlyOutput = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyOutput && yearlyOutput.length === daysPerYear) {\n yearlyOutput.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (panel: SolarPanelModel) => {\n const pvModel = getPvModule(panel.pvModelName);\n if (!pvModel) throw new Error('PV model not found');\n return panel.lx * panel.ly * (panel.inverterEfficiency ?? 0.95) * (1 - monthlyIrradianceLosses[now.getMonth()]);\n };\n\n const updateTemperature = (currentTime: Date) => {\n if (city) {\n const weather = getWeather(city);\n if (weather) {\n const t = computeOutsideTemperature(currentTime, weather.lowestTemperatures, weather.highestTemperatures);\n currentTemperatureRef.current = getOutsideTemperatureAtMinute(\n t.high,\n t.low,\n world.diurnalTemperatureModel,\n highestTemperatureTimeInMinutes,\n computeSunriseAndSunsetInMinutes(currentTime, world.latitude),\n Util.minutesIntoDay(currentTime),\n );\n }\n }\n };\n\n const inShadow = (panelId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== panelId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelSimulation);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n *\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport ThermalSimulation from './analysis/thermalSimulation';\r\nimport StaticSolarRadiationSimulation from './analysis/staticSolarRadiationSimulation';\r\nimport DynamicSolarRadiationSimulation from './analysis/dynamicSolarRadiationSimulation';\r\nimport ParabolicTroughSimulation from './analysis/parabolicTroughSimulation';\r\nimport ParabolicDishSimulation from './analysis/parabolicDishSimulation';\r\nimport FresnelReflectorSimulation from './analysis/fresnelReflectorSimulation';\r\nimport HeliostatSimulation from './analysis/heliostatSimulation';\r\nimport SolarUpdraftTowerSimulation from './analysis/solarUpdraftTowerSimulation';\r\nimport SolarPanelVisibility from './analysis/solarPanelVisibility';\r\nimport SensorSimulation from './analysis/sensorSimulation';\r\nimport SolarPanelSimulation from './analysis/solarPanelSimulation';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { useStore } from './stores/common';\r\n\r\nconst Simulations = () => {\r\n const worldLatitude = useStore(Selector.world.latitude);\r\n const worldLongitude = useStore(Selector.world.longitude);\r\n const getClosestCity = useStore(Selector.getClosestCity);\r\n\r\n const [city, setCity] = useState('Boston MA, USA');\r\n\r\n useEffect(() => {\r\n setCity(getClosestCity(worldLatitude, worldLongitude) ?? 'Boston MA, USA');\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [worldLatitude, worldLongitude]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Simulations);\r\n","export default \"data:image/png;base64,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\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { ScaleLinear } from 'd3-scale';\nimport i18n from '../i18n/i18n';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { addRange, updateRanges, updateSelectedProperty } from '../cloudProjectUtil';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { InputNumber, Popover } from 'antd';\nimport { Range } from '../types';\n\ntype VerticalAxisProps = {\n variable: string;\n name: string;\n unit: string;\n yScale: ScaleLinear;\n tickLength: number;\n tickIntegers: boolean;\n type: string;\n digits: number;\n min: number;\n max: number;\n step: number;\n value?: number;\n};\n\nconst DEFAULT_TICK_LENGTH = 5;\n\nconst VerticalAxis = ({\n yScale,\n tickLength,\n tickIntegers,\n variable,\n name,\n unit,\n type,\n digits,\n min,\n max,\n step,\n value,\n}: VerticalAxisProps) => {\n const setCommonStore = useStore(Selector.set);\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const projectInfo = useStore(Selector.projectInfo);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const minRef = useRef(min);\n const maxRef = useRef(max);\n\n useEffect(() => {\n minRef.current = min;\n }, [min]);\n\n useEffect(() => {\n maxRef.current = max;\n }, [max]);\n\n const lang = { lng: language };\n const isOwner = user.uid === projectInfo.owner;\n const range = yScale.range();\n\n const ticks = useMemo(() => {\n const height = range[0] - range[1];\n const numberOfTicks = type === 'number' ? Math.floor(height / tickLength) : 1;\n const ticks = tickIntegers\n ? yScale.ticks(numberOfTicks).filter((tick) => Number.isInteger(tick))\n : yScale.ticks(numberOfTicks);\n return ticks.map((value) => ({\n value,\n yOffset: yScale(value),\n }));\n }, [yScale, tickLength, type, tickIntegers]);\n\n const localSelect = () => {\n setCommonStore((state) => {\n state.projectInfo.selectedProperty = state.projectInfo.selectedProperty !== variable ? variable : null;\n });\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n });\n };\n\n const select = () => {\n if (isOwner && projectInfo.owner && projectInfo.title) {\n updateSelectedProperty(\n projectInfo.owner,\n projectInfo.title,\n projectInfo.selectedProperty !== variable ? variable : null,\n ).then(() => {\n localSelect();\n });\n } else {\n localSelect();\n }\n };\n\n const createLabel = (text: string, width: number) => {\n return {text};\n };\n\n const createTitle = () => {\n return (\n \n {name}\n \n );\n };\n\n const money = useMemo(() => {\n return (\n variable === 'yearlyProfit' ||\n variable === 'unitCost' ||\n variable === 'sellingPrice' ||\n variable === 'totalYearlyCost'\n );\n }, [variable]);\n\n const getMin = () => {\n if (\n variable === 'totalYearlyCost' ||\n variable === 'totalYearlyYield' ||\n variable === 'meanYearlyYield' ||\n variable === 'unitCost' ||\n variable === 'poleHeight' ||\n variable === 'interRowSpacing'\n )\n return 0;\n if (variable === 'tiltAngle') return -90;\n if (variable === 'latitude') return -90;\n if (variable === 'rowWidth') return 1;\n return Number.MIN_SAFE_INTEGER;\n };\n\n const getMax = () => {\n if (variable === 'tiltAngle') return 90;\n if (variable === 'latitude') return 90;\n return Number.MAX_SAFE_INTEGER;\n };\n\n return (\n <>\n {/* Title */}\n {variable !== 'orientation' ? (\n \n {\n setCommonStore((state) => {\n if (state.projectInfo.ranges) {\n let index = -1;\n let range = null;\n for (const [i, r] of state.projectInfo.ranges.entries()) {\n if (r.variable === variable) {\n index = i;\n range = r;\n break;\n }\n }\n if (index >= 0 && range) {\n state.projectInfo.ranges[index] = {\n variable: range.variable,\n minimum: value,\n maximum: range.maximum,\n } as Range;\n if (user.uid && projectInfo.title) {\n updateRanges(user.uid, projectInfo.title, state.projectInfo.ranges);\n }\n } else {\n const r = { variable, minimum: value, maximum: max } as Range;\n state.projectInfo.ranges.push(r);\n if (user.uid && projectInfo.title) {\n addRange(user.uid, projectInfo.title, r);\n }\n }\n } else {\n const r = { variable, minimum: value, maximum: max } as Range;\n state.projectInfo.ranges = [r];\n if (user.uid && projectInfo.title) {\n addRange(user.uid, projectInfo.title, r);\n }\n }\n });\n minRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n
\n {\n setCommonStore((state) => {\n if (state.projectInfo.ranges) {\n let index = -1;\n let range = null;\n for (const [i, r] of state.projectInfo.ranges.entries()) {\n if (r.variable === variable) {\n index = i;\n range = r;\n break;\n }\n }\n if (index >= 0 && range) {\n state.projectInfo.ranges[index] = {\n variable: range.variable,\n minimum: range.minimum,\n maximum: value,\n } as Range;\n if (user.uid && projectInfo.title) {\n updateRanges(user.uid, projectInfo.title, state.projectInfo.ranges);\n }\n } else {\n const r = { variable, minimum: min, maximum: value } as Range;\n state.projectInfo.ranges.push(r);\n if (user.uid && projectInfo.title) {\n addRange(user.uid, projectInfo.title, r);\n }\n }\n } else {\n const r = { variable, minimum: min, maximum: value } as Range;\n state.projectInfo.ranges = [r];\n if (user.uid && projectInfo.title) {\n addRange(user.uid, projectInfo.title, r);\n }\n }\n });\n maxRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n }\n >\n {createTitle()}\n \n ) : (\n <>{createTitle()}\n )}\n {value !== undefined && (\n \n {money\n ? value.toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n maximumFractionDigits: digits,\n }) + (variable === 'yearlyProfit' || variable === 'totalYearlyCost' ? 'K' : '')\n : (variable === 'orientation'\n ? i18n.t(value === 0 ? 'solarPanelMenu.Landscape' : 'solarPanelMenu.Portrait', lang) +\n (value === 0 ? ' (▭)' : ' (▯)')\n : value.toFixed(digits)) + (unit !== '' ? unit : '')}\n \n )}\n\n {/* Invisible vertical line for interactions */}\n \n {/* Visible vertical line */}\n \n\n {/* Ticks and labels */}\n {ticks.map(({ value, yOffset }) => (\n \n \n \n {variable === 'orientation' ? (value === 0 ? '▭' : '▯') : value}\n \n \n ))}\n \n );\n};\n\nexport default React.memo(VerticalAxis);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport * as d3Scale from 'd3-scale';\nimport * as d3Shape from 'd3-shape';\nimport { DatumEntry } from '../types';\nimport React from 'react';\nimport VerticalAxis from './verticalAxis';\n\nconst MARGIN = { top: 30, right: 55, bottom: 36, left: 55 };\n\nconst COLORS = [\n '#e0ac2b',\n '#e85252',\n '#6689c6',\n '#9a6fb0',\n '#a53253',\n '#69b3a2',\n '#556b2f',\n '#8b008b',\n '#ff1493',\n '#d2691e',\n '#2f4f4f',\n '#dc143c',\n];\n\ntype ParallelCoordinatesProps = {\n id: string;\n width: number;\n height: number;\n data: DatumEntry[];\n types: string[];\n minima: number[];\n maxima: number[];\n steps: number[];\n variables: string[];\n titles: string[];\n units: string[];\n digits: number[];\n tickIntegers: boolean[];\n hover: Function;\n hoveredIndex: number;\n selectedIndex: number;\n};\n\ntype YScale = d3Scale.ScaleLinear;\n\nconst ParallelCoordinates = ({\n id,\n width,\n height,\n data,\n types,\n minima,\n maxima,\n steps,\n variables,\n titles,\n units,\n digits,\n tickIntegers,\n hover,\n hoveredIndex,\n selectedIndex,\n}: ParallelCoordinatesProps) => {\n const boundsWidth = width - MARGIN.right - MARGIN.left;\n const boundsHeight = height - MARGIN.top - MARGIN.bottom;\n\n const allGroups = [...new Set(data.map((d) => d.group as string))];\n\n // Compute a xScale: spread all Y axis along the chart width\n const xScale = d3Scale.scalePoint().range([0, boundsWidth]).domain(variables).padding(0);\n\n // Compute the yScales: 1 scale per variable\n const yScales: { [name: string]: YScale } = {};\n variables.forEach((variable, index) => {\n yScales[variable] = d3Scale\n .scaleLinear()\n .range([boundsHeight, 0])\n .domain([minima[index] ?? 0, maxima[index] ?? 1]);\n });\n\n // Color Scale\n const colorScale = d3Scale.scaleOrdinal().domain(allGroups).range(COLORS);\n\n // Compute lines\n const lineGenerator = d3Shape.line();\n\n const allLines = data.map((series, i) => {\n if (series.invisible) return null;\n const allCoordinates = variables.map((variable) => {\n const yScale = yScales[variable];\n // I don't understand the type of scalePoint. IMO x cannot be undefined since I'm passing it something of type Variable.\n const x = xScale(variable) ?? 0;\n const y = yScale(series[variable] as number);\n return [x, y] as [number, number];\n });\n\n const d = lineGenerator(allCoordinates);\n\n if (!d) {\n return undefined;\n }\n\n return (\n {\n hover(i);\n }}\n key={i}\n d={d}\n stroke={series.hovered ? 'red' : colorScale(series.group as string)}\n fill=\"none\"\n strokeWidth={series.selected ? 3 : 1}\n strokeDasharray={series.hovered ? '5,3' : 'none'}\n />\n );\n });\n\n // Compute Axes\n const allAxes = variables.map((variable, i) => {\n const yScale = yScales[variable];\n return (\n \n = 0 && !data[hoveredIndex].invisible\n ? (data[hoveredIndex][variable] as number)\n : selectedIndex >= 0 && !data[selectedIndex].invisible\n ? (data[selectedIndex][variable] as number)\n : undefined\n }\n />\n \n );\n });\n\n return (\n {\n event.stopPropagation();\n }}\n >\n \n {allLines}\n {allAxes}\n \n \n );\n};\n\nexport default React.memo(ParallelCoordinates);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Menu, Dropdown, Checkbox, Slider } from 'antd';\nimport { ReactComponent as MenuSVG } from '../assets/menu.svg';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\n\nconst StyledMenuSVG = styled(MenuSVG)`\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n`;\n\nexport interface ScatteredPlotMenuProps {\n horizontalGrid: boolean;\n verticalGrid: boolean;\n symbolSize: number;\n changeHorizontalGrid?: (visible: boolean) => void;\n changeVerticalGrid?: (visible: boolean) => void;\n changeSymbolSize?: (count: number) => void;\n}\n\nconst ScatteredPlotMenu = ({\n horizontalGrid,\n verticalGrid,\n symbolSize,\n changeHorizontalGrid,\n changeVerticalGrid,\n changeSymbolSize,\n}: ScatteredPlotMenuProps) => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n\n const [visible, setVisible] = useState(false);\n\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n };\n\n const onShowHorizontalGridLines = () => {\n changeHorizontalGrid?.(!horizontalGrid);\n };\n\n const onShowVerticalGridLines = () => {\n changeVerticalGrid?.(!verticalGrid);\n };\n\n const onChangeSymbolSize = (size: number) => {\n changeSymbolSize?.(size);\n };\n\n const menu = (\n \n \n {i18n.t('menu.graph.SymbolSize', lang) + ':'}\n \n \n \n \n {i18n.t('menu.graph.ShowHorizontalGridLines', lang)}\n \n \n \n \n {i18n.t('menu.graph.ShowVerticalGridLines', lang)}\n \n \n \n );\n\n return (\n <>\n \n {\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n\nexport default ScatteredPlotMenu;\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Button, Checkbox, Col, Collapse, Input, List, Popover, Radio, Row, Select } from 'antd';\nimport i18n from '../i18n/i18n';\nimport {\n BgColorsOutlined,\n CameraOutlined,\n CarryOutOutlined,\n CheckCircleOutlined,\n CheckCircleFilled,\n CloseOutlined,\n CloudUploadOutlined,\n DeleteOutlined,\n DotChartOutlined,\n EditFilled,\n EditOutlined,\n ImportOutlined,\n LinkOutlined,\n SettingOutlined,\n SortAscendingOutlined,\n SortDescendingOutlined,\n FolderOpenOutlined,\n} from '@ant-design/icons';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport ImageLoadFailureIcon from '../assets/image_fail_try_again.png';\nimport { DataColoring, DatumEntry, Design, DesignProblem, Orientation } from '../types';\nimport ParallelCoordinates from '../components/parallelCoordinates';\n//@ts-ignore\nimport { saveSvgAsPng } from 'save-svg-as-png';\nimport { copyTextToClipboard, showInfo, showSuccess } from '../helpers';\nimport { Util } from '../Util';\nimport { ProjectUtil } from './ProjectUtil';\nimport { HOME_URL } from '../constants';\nimport {\n removeDesignFromProject,\n updateDataColoring,\n updateDescription,\n updateDesign,\n updateDesignVisibility,\n updateDotSizeScatteredPlot,\n updateHiddenParameters,\n updateThumbnailWidth,\n updateXAxisNameScatteredPlot,\n updateYAxisNameScatteredPlot,\n} from '../cloudProjectUtil';\nimport { loadCloudFile } from '../cloudFileUtil';\nimport { CartesianGrid, Dot, DotProps, Scatter, ScatterChart, Tooltip, XAxis, YAxis } from 'recharts';\nimport ScatteredPlotMenu from '../components/scatteredPlotMenu';\nimport dayjs from 'dayjs';\n\nconst { TextArea } = Input;\nconst { Option } = Select;\n\nconst Container = styled.div`\n position: relative;\n top: 0;\n left: 0;\n width: 100%;\n height: calc(100% - 30px);\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding-bottom: 30px;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n background: white;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n border: none;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n overflow-y: hidden;\n`;\n\nconst Header = styled.div`\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nconst SubHeader = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nconst SolutionSpaceHeader = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 6px;\n padding-bottom: 6px;\n background: white;\n`;\n\nconst SubContainer = styled.div`\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: flex-start;\n background: white;\n`;\n\nexport interface ProjectGalleryProps {\n relativeWidth: number;\n canvas: HTMLCanvasElement | null;\n}\n\nconst ProjectGallery = ({ relativeWidth, canvas }: ProjectGalleryProps) => {\n const setCommonStore = useStore(Selector.set);\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const cloudFile = useStore(Selector.cloudFile);\n const projectInfo = useStore(Selector.projectInfo);\n const solarPanelArrayLayoutConstraints = useStore(Selector.solarPanelArrayLayoutConstraints);\n const economicsParams = useStore(Selector.economicsParams);\n\n const [selectedDesign, setSelectedDesign] = useState();\n const [hoveredDesign, setHoveredDesign] = useState();\n const [updateFlag, setUpdateFlag] = useState(false);\n const [updateHiddenFlag, setUpdateHiddenFlag] = useState(false);\n\n const descriptionTextAreaEditableRef = useRef(false);\n const descriptionRef = useRef(projectInfo.description ?? null);\n const descriptionChangedRef = useRef(false);\n const descriptionExpandedRef = useRef(false);\n const dataColoringSelectionRef = useRef(projectInfo.dataColoring ?? DataColoring.ALL);\n const parameterSelectionChangedRef = useRef(false);\n const projectDesigns = useRef(projectInfo.designs ?? []); // store sorted designs\n const thumbnailSizeRef = useRef(projectInfo.thumbnailWidth ?? 200);\n const xAxisRef = useRef(projectInfo.xAxisNameScatteredPlot ?? 'rowWidth');\n const yAxisRef = useRef(projectInfo.yAxisNameScatteredPlot ?? 'rowWidth');\n const dotSizeRef = useRef(projectInfo.dotSizeScatteredPlot ?? 5);\n const scatterChartHorizontalLinesRef = useRef(true);\n const scatterChartVerticalLinesRef = useRef(true);\n\n useEffect(() => {\n xAxisRef.current = projectInfo.xAxisNameScatteredPlot ?? 'rowWidth';\n }, [projectInfo.xAxisNameScatteredPlot]);\n\n useEffect(() => {\n yAxisRef.current = projectInfo.yAxisNameScatteredPlot ?? 'rowWidth';\n }, [projectInfo.yAxisNameScatteredPlot]);\n\n useEffect(() => {\n dotSizeRef.current = projectInfo.dotSizeScatteredPlot ?? 5;\n }, [projectInfo.dotSizeScatteredPlot]);\n\n useEffect(() => {\n thumbnailSizeRef.current = projectInfo.thumbnailWidth ?? 200;\n }, [projectInfo.thumbnailWidth]);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const isOwner = user.uid === projectInfo.owner;\n\n useEffect(() => {\n projectDesigns.current = [];\n if (projectInfo.designs) {\n for (const design of projectInfo.designs) {\n projectDesigns.current.push(design);\n }\n const p = projectInfo.selectedProperty;\n if (p) {\n const prefix = projectInfo.sortDescending ? 1 : -1;\n projectDesigns.current.sort((a, b) => {\n if (p) {\n // first handle special cases\n if (p === 'rowWidth' && 'rowsPerRack' in a && 'rowsPerRack' in b) {\n return prefix * (a['rowsPerRack'] - b['rowsPerRack']);\n }\n if (p === 'orientation') {\n return prefix * ((a[p] === 'Landscape' ? 0 : 1) - (b[p] === 'Landscape' ? 0 : 1));\n }\n if (p === 'totalYearlyYield' && 'yearlyYield' in a && 'yearlyYield' in b) {\n return prefix * (a['yearlyYield'] - b['yearlyYield']);\n }\n if (p === 'meanYearlyYield' && 'yearlyYield' in a && 'yearlyYield' in b) {\n return prefix * (a['yearlyYield'] / a['panelCount'] - b['yearlyYield'] / b['panelCount']);\n }\n if (p === 'totalYearlyCost') {\n return prefix * (Util.calculateCost(a) - Util.calculateCost(b));\n }\n if (p === 'yearlyProfit') {\n return prefix * (Util.calculateProfit(a) - Util.calculateProfit(b));\n }\n if (p in a && p in b) {\n return prefix * (a[p] - b[p]);\n }\n return 0;\n }\n return 0;\n });\n }\n setUpdateFlag(!updateFlag);\n }\n }, [projectInfo.designs, projectInfo.sortDescending, projectInfo.selectedProperty]);\n\n useEffect(() => {\n setSelectedDesign(undefined);\n if (projectInfo.designs) {\n for (const design of projectInfo.designs) {\n if (design.title === cloudFile) {\n setSelectedDesign(design);\n break;\n }\n }\n }\n }, [cloudFile, projectInfo.designs]);\n\n useEffect(() => {\n const handleResize = () => {\n setUpdateFlag(!updateFlag);\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [updateFlag]);\n\n const closeProject = () => {\n setCommonStore((state) => {\n state.projectView = false;\n state.projectInfo.title = null;\n state.projectInfo.description = null;\n state.projectInfo.owner = null;\n // clear the cached images for the previously open project\n state.projectImages.clear();\n });\n setSelectedDesign(undefined);\n usePrimitiveStore.setState((state) => {\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\n });\n };\n\n const curateCurrentDesign = () => {\n usePrimitiveStore.setState((state) => {\n state.curateDesignToProjectFlag = true;\n });\n };\n\n const removeSelectedDesign = () => {\n if (user.uid && projectInfo.title && selectedDesign) {\n removeDesignFromProject(user.uid, projectInfo.title, selectedDesign).then(() => {\n // delete the local copy as well\n setCommonStore((state) => {\n if (state.projectInfo.designs) {\n let index = -1;\n for (const [i, e] of state.projectInfo.designs.entries()) {\n if (e.title === selectedDesign.title) {\n index = i;\n break;\n }\n }\n if (index >= 0) {\n state.projectInfo.designs.splice(index, 1);\n }\n }\n });\n });\n }\n };\n\n const totalHeight = window.innerHeight;\n const imageColumns = Math.round(800 / thumbnailSizeRef.current);\n const imageGap = 48 / imageColumns;\n const imageWidth = Math.round((relativeWidth * window.innerWidth) / imageColumns - imageGap);\n\n const [variables, titles, units, digits, tickIntegers, types] = useMemo(\n () => [\n ProjectUtil.getVariables(projectInfo.type, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getTitles(projectInfo.type, lang, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getUnits(projectInfo.type, lang, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getDigits(projectInfo.type, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getTickIntegers(projectInfo.type, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getTypes(projectInfo.type, projectInfo.hiddenParameters ?? []),\n ],\n [projectInfo.type, projectInfo.hiddenParameters, updateHiddenFlag, lang],\n );\n\n const data: DatumEntry[] = useMemo(() => {\n const data: DatumEntry[] = [];\n if (projectInfo.designs) {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY) {\n for (const design of projectInfo.designs) {\n const d = {} as DatumEntry;\n if (!projectInfo.hiddenParameters?.includes('rowWidth')) d['rowWidth'] = design.rowsPerRack;\n if (!projectInfo.hiddenParameters?.includes('tiltAngle')) d['tiltAngle'] = Util.toDegrees(design.tiltAngle);\n if (!projectInfo.hiddenParameters?.includes('interRowSpacing')) d['interRowSpacing'] = design.interRowSpacing;\n if (!projectInfo.hiddenParameters?.includes('latitude')) d['latitude'] = design.latitude ?? 42;\n if (!projectInfo.hiddenParameters?.includes('orientation'))\n d['orientation'] = design.orientation === Orientation.landscape ? 0 : 1;\n if (!projectInfo.hiddenParameters?.includes('poleHeight')) d['poleHeight'] = design.poleHeight;\n if (!projectInfo.hiddenParameters?.includes('unitCost')) d['unitCost'] = design.unitCost;\n if (!projectInfo.hiddenParameters?.includes('sellingPrice')) d['sellingPrice'] = design.sellingPrice;\n if (!projectInfo.hiddenParameters?.includes('')) d['totalYearlyCost'] = Util.calculateCost(design);\n if (!projectInfo.hiddenParameters?.includes('totalYearlyYield'))\n d['totalYearlyYield'] = design.yearlyYield * 0.001;\n if (!projectInfo.hiddenParameters?.includes('meanYearlyYield'))\n d['meanYearlyYield'] = design.yearlyYield / design.panelCount;\n if (!projectInfo.hiddenParameters?.includes('yearlyProfit')) d['yearlyProfit'] = Util.calculateProfit(design);\n d['group'] = projectInfo.dataColoring === DataColoring.INDIVIDUALS ? design.title : 'default';\n d['selected'] = selectedDesign === design;\n d['hovered'] = hoveredDesign === design;\n d['invisible'] = design.invisible;\n data.push(d);\n }\n }\n }\n return data;\n }, [\n projectInfo.designs,\n projectInfo.type,\n hoveredDesign,\n selectedDesign,\n economicsParams,\n projectInfo.hiddenParameters,\n projectInfo.dataColoring,\n updateHiddenFlag,\n ]);\n\n const getMin = (variable: string, defaultValue: number) => {\n let min = defaultValue;\n if (projectInfo.ranges) {\n for (const r of projectInfo.ranges) {\n if (r.variable === variable) {\n min = r.minimum ?? defaultValue;\n break;\n }\n }\n }\n return min;\n };\n\n const getMax = (variable: string, defaultValue: number) => {\n let max = defaultValue;\n if (projectInfo.ranges) {\n for (const r of projectInfo.ranges) {\n if (r.variable === variable) {\n max = r.maximum ?? defaultValue;\n break;\n }\n }\n }\n return max;\n };\n\n const minima: number[] = useMemo(() => {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && solarPanelArrayLayoutConstraints) {\n const array: number[] = [];\n if (!projectInfo.hiddenParameters?.includes('rowWidth'))\n array.push(getMin('rowWidth', solarPanelArrayLayoutConstraints.minimumRowsPerRack));\n if (!projectInfo.hiddenParameters?.includes('tiltAngle'))\n array.push(getMin('tiltAngle', Util.toDegrees(solarPanelArrayLayoutConstraints.minimumTiltAngle)));\n if (!projectInfo.hiddenParameters?.includes('interRowSpacing'))\n array.push(getMin('interRowSpacing', solarPanelArrayLayoutConstraints.minimumInterRowSpacing));\n if (!projectInfo.hiddenParameters?.includes('latitude')) array.push(getMin('latitude', -90));\n if (!projectInfo.hiddenParameters?.includes('orientation')) array.push(0);\n if (!projectInfo.hiddenParameters?.includes('poleHeight')) array.push(getMin('poleHeight', 0));\n if (!projectInfo.hiddenParameters?.includes('unitCost')) array.push(getMin('unitCost', 0.1));\n if (!projectInfo.hiddenParameters?.includes('sellingPrice')) array.push(getMin('sellingPrice', 0.1));\n if (!projectInfo.hiddenParameters?.includes('totalYearlyCost')) array.push(getMin('totalYearlyCost', 0));\n if (!projectInfo.hiddenParameters?.includes('totalYearlyYield')) array.push(getMin('totalYearlyYield', 0)); // electricity output in MWh\n if (!projectInfo.hiddenParameters?.includes('meanYearlyYield')) array.push(getMin('meanYearlyYield', 0)); // electricity output in kWh\n if (!projectInfo.hiddenParameters?.includes('yearlyProfit')) array.push(getMin('yearlyProfit', -10)); // profit in $1,000\n return array;\n }\n return [];\n }, [\n solarPanelArrayLayoutConstraints,\n projectInfo.type,\n projectInfo.ranges,\n projectInfo.hiddenParameters,\n updateHiddenFlag,\n ]);\n\n const maxima: number[] = useMemo(() => {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && solarPanelArrayLayoutConstraints) {\n const array: number[] = [];\n if (!projectInfo.hiddenParameters?.includes('rowWidth'))\n array.push(getMax('rowWidth', solarPanelArrayLayoutConstraints.maximumRowsPerRack));\n if (!projectInfo.hiddenParameters?.includes('tiltAngle'))\n array.push(getMax('tiltAngle', Util.toDegrees(solarPanelArrayLayoutConstraints.maximumTiltAngle)));\n if (!projectInfo.hiddenParameters?.includes('interRowSpacing'))\n array.push(getMax('interRowSpacing', solarPanelArrayLayoutConstraints.maximumInterRowSpacing));\n if (!projectInfo.hiddenParameters?.includes('latitude')) array.push(getMax('latitude', 90));\n if (!projectInfo.hiddenParameters?.includes('orientation')) array.push(1);\n if (!projectInfo.hiddenParameters?.includes('poleHeight')) array.push(getMax('poleHeight', 5));\n if (!projectInfo.hiddenParameters?.includes('unitCost')) array.push(getMax('unitCost', 1));\n if (!projectInfo.hiddenParameters?.includes('sellingPrice')) array.push(getMax('sellingPrice', 0.5));\n if (!projectInfo.hiddenParameters?.includes('totalYearlyCost')) array.push(getMax('totalYearlyCost', 100));\n if (!projectInfo.hiddenParameters?.includes('totalYearlyYield')) array.push(getMax('totalYearlyYield', 100)); // electricity output in MWh\n if (!projectInfo.hiddenParameters?.includes('meanYearlyYield')) array.push(getMax('meanYearlyYield', 1000)); // electricity output in kWh\n if (!projectInfo.hiddenParameters?.includes('yearlyProfit')) array.push(getMax('yearlyProfit', 10)); // profit in $1,000\n return array;\n }\n return [];\n }, [\n solarPanelArrayLayoutConstraints,\n projectInfo.type,\n projectInfo.ranges,\n projectInfo.hiddenParameters,\n updateHiddenFlag,\n ]);\n\n const steps: number[] = useMemo(() => {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && solarPanelArrayLayoutConstraints) {\n const array: number[] = [];\n if (!projectInfo.hiddenParameters?.includes('rowWidth')) array.push(1);\n if (!projectInfo.hiddenParameters?.includes('tiltAngle')) array.push(0.1);\n if (!projectInfo.hiddenParameters?.includes('interRowSpacing')) array.push(0.1);\n if (!projectInfo.hiddenParameters?.includes('latitude')) array.push(0.1);\n if (!projectInfo.hiddenParameters?.includes('orientation')) array.push(1);\n if (!projectInfo.hiddenParameters?.includes('poleHeight')) array.push(0.1);\n if (!projectInfo.hiddenParameters?.includes('unitCost')) array.push(0.01);\n if (!projectInfo.hiddenParameters?.includes('sellingPrice')) array.push(0.01);\n if (!projectInfo.hiddenParameters?.includes('totalYearlyCost')) array.push(0.1); // cost in $1,000\n if (!projectInfo.hiddenParameters?.includes('totalYearlyYield')) array.push(1); // electricity output in MWh\n if (!projectInfo.hiddenParameters?.includes('meanYearlyYield')) array.push(1); // electricity output in kWh\n if (!projectInfo.hiddenParameters?.includes('yearlyProfit')) array.push(0.1); // profit in $1,000\n return array;\n }\n return [];\n }, [projectInfo.type, projectInfo.hiddenParameters, updateHiddenFlag]);\n\n const rowWidthSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('rowWidth'));\n const tiltAngleSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('tiltAngle'));\n const rowSpacingSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('interRowSpacing'));\n const latitudeSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('latitude'));\n const orientationSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('orientation'));\n const poleHeightSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('poleHeight'));\n const unitCostSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('unitCost'));\n const sellingPriceSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('sellingPrice'));\n const costSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('totalYearlyCost'));\n const totalYieldSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('totalYearlyYield'));\n const meanYieldSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('meanYearlyYield'));\n const profitSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('yearlyProfit'));\n\n useEffect(() => {\n rowWidthSelectionRef.current = !projectInfo.hiddenParameters?.includes('rowWidth');\n tiltAngleSelectionRef.current = !projectInfo.hiddenParameters?.includes('tiltAngle');\n rowSpacingSelectionRef.current = !projectInfo.hiddenParameters?.includes('interRowSpacing');\n latitudeSelectionRef.current = !projectInfo.hiddenParameters?.includes('latitude');\n orientationSelectionRef.current = !projectInfo.hiddenParameters?.includes('orientation');\n poleHeightSelectionRef.current = !projectInfo.hiddenParameters?.includes('poleHeight');\n unitCostSelectionRef.current = !projectInfo.hiddenParameters?.includes('unitCost');\n sellingPriceSelectionRef.current = !projectInfo.hiddenParameters?.includes('sellingPrice');\n costSelectionRef.current = !projectInfo.hiddenParameters?.includes('totalYearlyCost');\n totalYieldSelectionRef.current = !projectInfo.hiddenParameters?.includes('totalYearlyYield');\n meanYieldSelectionRef.current = !projectInfo.hiddenParameters?.includes('meanYearlyYield');\n profitSelectionRef.current = !projectInfo.hiddenParameters?.includes('yearlyProfit');\n setUpdateFlag(!updateFlag);\n }, [projectInfo.hiddenParameters]);\n\n useEffect(() => {\n descriptionRef.current = projectInfo.description;\n }, [projectInfo.description]);\n\n const hover = (i: number) => {\n if (projectInfo.designs) {\n if (i >= 0 && i < projectInfo.designs.length) {\n setHoveredDesign(projectInfo.designs[i]);\n }\n }\n };\n\n const localToggleDesignVisibility = (title: string) => {\n setCommonStore((state) => {\n if (state.projectInfo.designs) {\n for (const d of state.projectInfo.designs) {\n if (d.title === title) {\n d.invisible = !d.invisible;\n break;\n }\n }\n }\n });\n };\n\n const toggleDesignVisibility = (design: Design) => {\n localToggleDesignVisibility(design.title);\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateDesignVisibility(user.uid, projectInfo.title, design);\n }\n }\n };\n\n const localSelectParameter = (selected: boolean, parameter: string) => {\n setCommonStore((state) => {\n if (state.projectInfo.hiddenParameters) {\n if (selected) {\n if (state.projectInfo.hiddenParameters.includes(parameter)) {\n state.projectInfo.hiddenParameters.splice(state.projectInfo.hiddenParameters.indexOf(parameter), 1);\n }\n } else {\n if (!state.projectInfo.hiddenParameters.includes(parameter)) {\n state.projectInfo.hiddenParameters.push(parameter);\n }\n }\n }\n });\n };\n\n const selectParameter = (selected: boolean, parameter: string) => {\n parameterSelectionChangedRef.current = true;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateHiddenParameters(user.uid, projectInfo.title, parameter, !selected).then(() => {\n localSelectParameter(selected, parameter);\n });\n }\n } else {\n localSelectParameter(selected, parameter);\n }\n };\n\n const localSelectDataColoring = () => {\n setCommonStore((state) => {\n state.projectInfo.dataColoring = dataColoringSelectionRef.current;\n });\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n });\n setUpdateFlag(!updateFlag);\n };\n\n const selectDataColoring = (value: DataColoring) => {\n dataColoringSelectionRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateDataColoring(user.uid, projectInfo.title, dataColoringSelectionRef.current).then(() => {\n localSelectDataColoring();\n });\n }\n } else {\n localSelectDataColoring();\n }\n };\n\n const createChooseSolutionSolutionContent = () => {\n return (\n
\n {\n rowWidthSelectionRef.current = e.target.checked;\n selectParameter(rowWidthSelectionRef.current, 'rowWidth');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={rowWidthSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayRowWidth', lang)}\n \n
\n {\n tiltAngleSelectionRef.current = e.target.checked;\n selectParameter(tiltAngleSelectionRef.current, 'tiltAngle');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={tiltAngleSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayTiltAngle', lang)}\n \n
\n {\n rowSpacingSelectionRef.current = e.target.checked;\n selectParameter(rowSpacingSelectionRef.current, 'interRowSpacing');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={rowSpacingSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayRowSpacing', lang)}\n \n
\n {\n latitudeSelectionRef.current = e.target.checked;\n selectParameter(latitudeSelectionRef.current, 'latitude');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={latitudeSelectionRef.current}\n >\n {i18n.t('word.Latitude', lang)}\n \n
\n {\n orientationSelectionRef.current = e.target.checked;\n selectParameter(orientationSelectionRef.current, 'orientation');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={orientationSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayOrientation', lang)}\n \n
\n {\n poleHeightSelectionRef.current = e.target.checked;\n selectParameter(poleHeightSelectionRef.current, 'poleHeight');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={poleHeightSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayPoleHeight', lang)}\n \n
\n {\n unitCostSelectionRef.current = e.target.checked;\n selectParameter(unitCostSelectionRef.current, 'unitCost');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={unitCostSelectionRef.current}\n >\n {i18n.t('economicsPanel.UnitCost', lang)}\n \n
\n {\n sellingPriceSelectionRef.current = e.target.checked;\n selectParameter(sellingPriceSelectionRef.current, 'sellingPrice');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={sellingPriceSelectionRef.current}\n >\n {i18n.t('economicsPanel.SellingPrice', lang)}\n \n
\n {\n costSelectionRef.current = e.target.checked;\n selectParameter(costSelectionRef.current, 'totalYearlyCost');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={costSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayTotalYearlyCost', lang)}\n \n
\n {\n totalYieldSelectionRef.current = e.target.checked;\n selectParameter(totalYieldSelectionRef.current, 'totalYearlyYield');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={totalYieldSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayTotalYearlyYield', lang)}\n \n
\n {\n meanYieldSelectionRef.current = e.target.checked;\n selectParameter(meanYieldSelectionRef.current, 'meanYearlyYield');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={meanYieldSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayMeanYearlyYield', lang)}\n \n
\n {\n profitSelectionRef.current = e.target.checked;\n selectParameter(profitSelectionRef.current, 'yearlyProfit');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={profitSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayYearlyProfit', lang)}\n \n
\n );\n };\n\n const createAxisOptions = () => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n };\n\n const scatterData = useMemo(() => {\n const data: { x: number; y: number }[] = [];\n if (projectInfo.designs) {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY) {\n for (const design of projectInfo.designs) {\n if (design.invisible || design === selectedDesign) continue;\n const d = {} as { x: number; y: number };\n ProjectUtil.setScatterData(xAxisRef.current, 'x', d, design);\n ProjectUtil.setScatterData(yAxisRef.current, 'y', d, design);\n data.push(d);\n }\n }\n }\n return data;\n }, [xAxisRef.current, yAxisRef.current, projectInfo.designs, projectInfo.type, selectedDesign]);\n\n const selectedData = useMemo(() => {\n const data: { x: number; y: number }[] = [];\n if (projectInfo.designs) {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY) {\n for (const design of projectInfo.designs) {\n if (design !== selectedDesign) continue;\n const d = {} as { x: number; y: number };\n ProjectUtil.setScatterData(xAxisRef.current, 'x', d, design);\n ProjectUtil.setScatterData(yAxisRef.current, 'y', d, design);\n data.push(d);\n }\n }\n }\n return data;\n }, [xAxisRef.current, yAxisRef.current, projectInfo.designs, projectInfo.type, selectedDesign]);\n\n const getBound = (axisName: string) => {\n const bound: { min: number; max: number } = { min: 0, max: 1 };\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && solarPanelArrayLayoutConstraints) {\n switch (axisName) {\n case 'rowWidth':\n bound.min = getMin('rowWidth', solarPanelArrayLayoutConstraints.minimumRowsPerRack);\n bound.max = getMax('rowWidth', solarPanelArrayLayoutConstraints.maximumRowsPerRack);\n break;\n case 'tiltAngle':\n bound.min = getMin('tiltAngle', Util.toDegrees(solarPanelArrayLayoutConstraints.minimumTiltAngle));\n bound.max = getMax('tiltAngle', Util.toDegrees(solarPanelArrayLayoutConstraints.maximumTiltAngle));\n break;\n case 'interRowSpacing':\n bound.min = getMin('interRowSpacing', solarPanelArrayLayoutConstraints.minimumInterRowSpacing);\n bound.max = getMax('interRowSpacing', solarPanelArrayLayoutConstraints.maximumInterRowSpacing);\n break;\n case 'latitude':\n bound.min = getMin('latitude', -90);\n bound.max = getMax('latitude', 90);\n break;\n case 'orientation':\n bound.min = 0;\n bound.max = 1;\n break;\n case 'poleHeight':\n bound.min = getMin('poleHeight', 0);\n bound.max = getMax('poleHeight', 5);\n break;\n case 'unitCost':\n bound.min = getMin('unitCost', 0.1);\n bound.max = getMax('unitCost', 1);\n break;\n case 'sellingPrice':\n bound.min = getMin('sellingPrice', 0.1);\n bound.max = getMax('sellingPrice', 0.5);\n break;\n case 'totalYearlyCost':\n bound.min = getMin('totalYearlyCost', 0);\n bound.max = getMax('totalYearlyCost', 100);\n break;\n case 'totalYearlyYield':\n bound.min = getMin('totalYearlyYield', 0);\n bound.max = getMax('totalYearlyYield', 100);\n break;\n case 'meanYearlyYield':\n bound.min = getMin('meanYearlyYield', 0);\n bound.max = getMax('meanYearlyYield', 1000);\n break;\n case 'yearlyProfit':\n bound.min = getMin('yearlyProfit', -10);\n bound.max = getMax('yearlyProfit', 10);\n break;\n }\n }\n return bound;\n };\n\n const xMinMax = useMemo(() => {\n return getBound(xAxisRef.current);\n }, [xAxisRef.current, projectInfo.ranges]);\n\n const yMinMax = useMemo(() => {\n return getBound(yAxisRef.current);\n }, [yAxisRef.current, projectInfo.ranges]);\n\n const xUnit = useMemo(() => {\n return ProjectUtil.getUnit(xAxisRef.current, lang);\n }, [xAxisRef.current, lang]);\n\n const yUnit = useMemo(() => {\n return ProjectUtil.getUnit(yAxisRef.current, lang);\n }, [yAxisRef.current, lang]);\n\n const RenderDot: FC = ({ cx, cy }) => {\n return ;\n };\n\n const createScatteredPlotContent = () => {\n return (\n
\n \n \n {i18n.t('projectPanel.SelectXAxis', lang)}: \n \n \n {\n xAxisRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateXAxisNameScatteredPlot(user.uid, projectInfo.title, value).then(() => {\n //ignore\n });\n }\n }\n setUpdateFlag(!updateFlag);\n }}\n >\n {createAxisOptions()}\n \n \n \n \n \n {i18n.t('projectPanel.SelectYAxis', lang)}: \n \n \n {\n yAxisRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateYAxisNameScatteredPlot(user.uid, projectInfo.title, value).then(() => {\n //ignore\n });\n }\n }\n setUpdateFlag(!updateFlag);\n }}\n >\n {createAxisOptions()}\n \n \n \n \n
\n \n \n {\n if (\n xAxisRef.current === 'yearlyProfit' ||\n xAxisRef.current === 'unitCost' ||\n xAxisRef.current === 'sellingPrice'\n )\n return '$' + value;\n return value;\n }}\n />\n {\n if (\n yAxisRef.current === 'yearlyProfit' ||\n yAxisRef.current === 'unitCost' ||\n yAxisRef.current === 'sellingPrice'\n )\n return '$' + value;\n return value;\n }}\n />\n value.toFixed(2)} />\n } />\n {selectedDesign && }\n \n {\n scatterChartHorizontalLinesRef.current = checked;\n setUpdateFlag(!updateFlag);\n }}\n changeVerticalGrid={(checked) => {\n scatterChartVerticalLinesRef.current = checked;\n setUpdateFlag(!updateFlag);\n }}\n changeSymbolSize={(value) => {\n dotSizeRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateDotSizeScatteredPlot(user.uid, projectInfo.title, value).then(() => {\n //ignore\n });\n }\n }\n setUpdateFlag(!updateFlag);\n }}\n />\n
\n
\n \n \n {\n const d = document.getElementById('scattered-chart');\n if (d) {\n saveSvgAsPng(d, 'scattered-chart-' + projectInfo.title + '.png').then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n });\n }\n }}\n />\n \n \n
\n );\n };\n\n const createChooseDataColoringContent = () => {\n return (\n
\n {\n selectDataColoring(e.target.value);\n }}\n value={projectInfo.dataColoring ?? DataColoring.ALL}\n >\n \n {i18n.t('projectPanel.SameColorForAllDesigns', lang)}\n \n
\n \n {i18n.t('projectPanel.OneColorForEachDesign', lang)}\n \n \n
\n );\n };\n\n const createProjectSettingsContent = () => {\n return (\n
e.stopPropagation()}>\n \n \n {i18n.t('projectPanel.ThumbnailImageSize', lang)}: \n \n \n {\n thumbnailSizeRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateThumbnailWidth(user.uid, projectInfo.title, value).then(() => {\n setCommonStore((state) => {\n state.projectInfo.thumbnailWidth = thumbnailSizeRef.current;\n });\n });\n }\n } else {\n setCommonStore((state) => {\n state.projectInfo.thumbnailWidth = thumbnailSizeRef.current;\n });\n }\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n \n
\n );\n };\n\n return (\n {\n e.stopPropagation();\n }}\n >\n \n
\n \n {(isOwner ? i18n.t('projectPanel.Project', lang) : i18n.t('projectPanel.ProjectByOtherPeople', lang)) +\n ': ' +\n projectInfo.title +\n (isOwner ? '' : ' (' + i18n.t('word.Owner', lang) + ': ' + projectInfo.owner?.substring(0, 4) + '***)') +\n ' (' +\n projectDesigns.current.length +\n ')'}\n \n {\n closeProject();\n }}\n onTouchStart={() => {\n closeProject();\n }}\n >\n \n \n
\n {\n descriptionExpandedRef.current = e.length > 0;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n {i18n.t('projectPanel.ProjectDescription', lang) +\n ' | ' +\n i18n.t('projectPanel.ProjectType', lang) +\n ': ' +\n projectInfo.type}\n \n \n {isOwner && (\n <>\n {descriptionExpandedRef.current && (\n {\n e.stopPropagation();\n descriptionTextAreaEditableRef.current = !descriptionTextAreaEditableRef.current;\n setUpdateFlag(!updateFlag);\n }}\n >\n {descriptionTextAreaEditableRef.current ? (\n \n ) : (\n \n )}\n \n )}\n {\n e.stopPropagation();\n curateCurrentDesign();\n }}\n >\n \n \n {selectedDesign && selectedDesign.title === cloudFile && (\n {\n e.stopPropagation();\n if (canvas && user.uid && projectInfo.title && cloudFile) {\n updateDesign(\n user.uid,\n projectInfo.type,\n projectInfo.title,\n projectInfo.thumbnailWidth ?? 200,\n cloudFile,\n canvas,\n ).then(() => {\n setUpdateFlag(!updateFlag);\n });\n }\n }}\n >\n \n \n )}\n {selectedDesign && (\n {\n e.stopPropagation();\n removeSelectedDesign();\n setSelectedDesign(undefined);\n }}\n >\n \n \n )}\n {selectedDesign && (\n {\n e.stopPropagation();\n if (projectInfo.title) {\n let url =\n HOME_URL +\n '?client=web&userid=' +\n user.uid +\n '&project=' +\n encodeURIComponent(projectInfo.title);\n if (selectedDesign) {\n url += '&title=' + encodeURIComponent(selectedDesign.title);\n }\n copyTextToClipboard(url);\n showSuccess(i18n.t('projectListPanel.ProjectLinkGeneratedInClipBoard', lang) + '.');\n }\n }}\n >\n \n \n )}\n \n )}\n {projectInfo.designs && projectInfo.designs.length > 1 && projectInfo.selectedProperty && (\n {\n e.stopPropagation();\n setCommonStore((state) => {\n state.projectInfo.sortDescending = !state.projectInfo.sortDescending;\n });\n }}\n >\n {projectInfo.sortDescending ? (\n \n ) : (\n \n )}\n \n )}\n e.stopPropagation()}>{i18n.t('projectPanel.ProjectSettings', lang)}\n }\n content={createProjectSettingsContent}\n >\n \n \n \n \n }\n >\n {\n descriptionTextAreaEditableRef.current = !descriptionTextAreaEditableRef.current;\n setUpdateFlag(!updateFlag);\n }}\n onChange={(e) => {\n descriptionRef.current = e.target.value;\n descriptionChangedRef.current = true;\n setCommonStore((state) => {\n state.projectInfo.description = e.target.value;\n });\n setUpdateFlag(!updateFlag);\n }}\n onBlur={() => {\n descriptionTextAreaEditableRef.current = false;\n if (descriptionChangedRef.current) {\n if (user.uid && isOwner && projectInfo.title) {\n updateDescription(user.uid, projectInfo.title, descriptionRef.current).then(() => {\n descriptionChangedRef.current = false;\n setUpdateFlag(!updateFlag);\n });\n }\n }\n }}\n style={{\n paddingLeft: '10px',\n textAlign: 'left',\n resize: descriptionTextAreaEditableRef.current ? 'vertical' : 'none',\n }}\n />\n \n \n {projectDesigns.current.length > 0 && (\n \n {\n const lastSpaceIndex = design.title.lastIndexOf(' ');\n const labelDisplayLength =\n projectInfo.thumbnailWidth === 100 ? 8 : projectInfo.thumbnailWidth === 125 ? 12 : 30;\n return (\n {\n setHoveredDesign(design);\n }}\n onMouseLeave={() => {\n setHoveredDesign(undefined);\n }}\n >\n {\n (event.target as HTMLImageElement).src = ImageLoadFailureIcon;\n }}\n onLoad={(event) => {\n setCommonStore((state) => {\n state.projectImages.set(design.title, event.target as HTMLImageElement);\n });\n usePrimitiveStore.setState((state) => {\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\n });\n }}\n alt={design.title}\n title={\n (design.timestamp\n ? i18n.t('word.LastUpdate', lang) +\n ': ' +\n dayjs(new Date(design.timestamp)).format('MM-DD-YYYY hh:mm A') +\n '\\n'\n : '') +\n (selectedDesign === design\n ? i18n.t('projectPanel.SingleClickToDeselectDoubleClickToOpen', lang)\n : i18n.t('projectPanel.SingleClickToSelectDoubleClickToOpen', lang))\n }\n src={\n design.thumbnail?.startsWith('data:image/png;base64') ? design.thumbnail : ImageLoadFailureIcon\n }\n style={{\n transition: '.5s ease',\n opacity: hoveredDesign === design ? 0.5 : 1,\n padding: '1px',\n cursor: 'pointer',\n borderRadius: selectedDesign === design ? '0' : '10px',\n border: selectedDesign === design ? '2px solid red' : 'none',\n }}\n onDoubleClick={(event) => {\n const target = event.target as HTMLImageElement;\n if (target.src === ImageLoadFailureIcon) {\n target.src = design.thumbnailUrl;\n }\n setSelectedDesign(design);\n if (projectInfo.owner) {\n loadCloudFile(projectInfo.owner, design.title, true, true).then(() => {\n // ignore\n });\n }\n }}\n onClick={(event) => {\n const target = event.target as HTMLImageElement;\n if (target.src === ImageLoadFailureIcon) {\n target.src = design.thumbnailUrl;\n }\n setSelectedDesign(design !== selectedDesign ? design : undefined);\n }}\n />\n \n {design.title\n ? design.title.length > labelDisplayLength\n ? design.title.substring(0, Math.min(labelDisplayLength, lastSpaceIndex)) +\n '...' +\n design.title.substring(lastSpaceIndex)\n : design.title\n : 'Unknown'}\n \n \n {design.title === cloudFile && (\n \n )}\n {design.invisible ? (\n {\n toggleDesignVisibility(design);\n }}\n style={{ fontSize: '16px' }}\n title={i18n.t('projectPanel.DesignNotShownInSolutionSpaceClickToShow', lang)}\n />\n ) : (\n {\n toggleDesignVisibility(design);\n }}\n style={{ fontSize: '16px' }}\n title={i18n.t('projectPanel.DesignShownInSolutionSpaceClickToHide', lang)}\n />\n )}\n \n \n );\n }}\n />\n \n {i18n.t('projectPanel.DistributionInSolutionSpace', lang)}\n \n {projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && (\n {\n if (parameterSelectionChangedRef.current) {\n if (!visible) {\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n });\n }\n parameterSelectionChangedRef.current = false;\n }\n }}\n content={createChooseSolutionSolutionContent()}\n >\n \n \n )}\n \n \n \n \n \n \n {\n const d = document.getElementById('design-space');\n if (d) {\n saveSvgAsPng(d, 'design-space-' + projectInfo.title + '.png').then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n });\n }\n }}\n >\n \n \n \n \n \n \n )}\n
\n \n );\n};\n\nexport default React.memo(ProjectGallery);\n","import React from 'react';\r\nimport { GROUND_ID } from 'src/constants';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType } from 'src/types';\r\nimport GroupMaster from './groupMaster';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { Util } from 'src/Util';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { Vector3 } from 'three';\r\nimport { GroupableModel, isGroupable } from 'src/models/Groupable';\r\n\r\nconst isBaseElement = (e: ElementModel) => {\r\n return e.parentId === GROUND_ID && (e.type === ObjectType.Foundation || e.type === ObjectType.Cuboid);\r\n};\r\n\r\nconst areTwoBasesOverlapped = (bId1: string, bId2: string, verticesMap: Map) => {\r\n const v1 = verticesMap.get(bId1);\r\n const v2 = verticesMap.get(bId2);\r\n if (!v1 || !v2) return false;\r\n for (const v of v1) {\r\n if (Util.isPointInside(v.x, v.y, v2)) {\r\n return true;\r\n }\r\n }\r\n for (const v of v2) {\r\n if (Util.isPointInside(v.x, v.y, v1)) {\r\n return true;\r\n }\r\n }\r\n v1.push(v1[0]);\r\n v2.push(v2[0]);\r\n for (let i1 = 0; i1 < v1.length - 1; i1++) {\r\n const from1 = v1[i1];\r\n const to1 = v1[i1 + 1];\r\n for (let i2 = 0; i2 < v2.length - 1; i2++) {\r\n const from2 = v2[i2];\r\n const to2 = v2[i2 + 1];\r\n if (Util.lineIntersection(from1, to1, from2, to2)) return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nconst GroupMasterController = React.memo(() => {\r\n useStore(Selector.groupActionUpdateFlag);\r\n const selectedElementIdSet = useStore(Selector.selectedElementIdSet);\r\n const selectedBaseElements = getSelectedBaseElements();\r\n\r\n if (selectedBaseElements.length === 0) return null;\r\n\r\n const { allBaseElements, allBaseElementsVerticesMap, cuboidParentIdMap } = getElementsData();\r\n\r\n const groupIdSet = new Set(selectedBaseElements.map((e) => e.id));\r\n const groupElements = [...selectedBaseElements];\r\n\r\n for (const selectedBase of selectedBaseElements) {\r\n if (selectedBase.enableGroupMaster) {\r\n checkOverlapWithOtherBases(selectedBase);\r\n }\r\n }\r\n\r\n const { position, dimension, rotation, childCuboidIdSet } = getGroupedBasesData();\r\n\r\n function getSelectedBaseElements() {\r\n const baseIdSet = new Set();\r\n for (const e of useStore.getState().elements) {\r\n if (selectedElementIdSet.has(e.id)) {\r\n if (e.parentId === GROUND_ID && isGroupable(e)) {\r\n baseIdSet.add(e.id);\r\n } else if (e.foundationId) {\r\n baseIdSet.add(e.foundationId);\r\n }\r\n }\r\n }\r\n if (baseIdSet.size === 0) return [] as GroupableModel[];\r\n return useStore.getState().elements.filter((e) => baseIdSet.has(e.id)) as GroupableModel[];\r\n }\r\n\r\n function getElementsData() {\r\n const allBaseElements: ElementModel[] = [];\r\n const allBaseElementsVerticesMap = new Map();\r\n const cuboidParentIdMap = new Map();\r\n\r\n for (const e of useStore.getState().elements) {\r\n if (isBaseElement(e)) {\r\n const vertices = Util.fetchFoundationVertexCoordinates(e);\r\n allBaseElements.push(e);\r\n allBaseElementsVerticesMap.set(e.id, vertices);\r\n }\r\n if (e.type === ObjectType.Cuboid && e.parentId !== GROUND_ID) {\r\n cuboidParentIdMap.set(e.id, e.parentId);\r\n }\r\n }\r\n return { allBaseElements, allBaseElementsVerticesMap, cuboidParentIdMap };\r\n }\r\n\r\n function checkOverlapWithOtherBases(curr: GroupableModel) {\r\n for (const baseElement of allBaseElements) {\r\n if (\r\n !groupIdSet.has(baseElement.id) &&\r\n areTwoBasesOverlapped(curr.id, baseElement.id, allBaseElementsVerticesMap)\r\n ) {\r\n groupIdSet.add(baseElement.id);\r\n groupElements.push(baseElement);\r\n checkOverlapWithOtherBases(baseElement);\r\n }\r\n }\r\n }\r\n\r\n function getGroupedBasesData() {\r\n const groupElementsVertices = groupElements.map((e) => Util.fetchFoundationVertexCoordinates(e)).flat();\r\n const childCuboidIdSet = new Set();\r\n\r\n const bound = Util.calculatePolygonBounds(groupElementsVertices);\r\n let maxChildHeight = 1;\r\n let maxBaseZ = 1;\r\n const map = new Map(); // roofId -> maxWallHeight\r\n for (const elem of useStore.getState().elements) {\r\n // children\r\n if (elem.foundationId && groupIdSet.has(elem.foundationId)) {\r\n if (elem.type === ObjectType.Wall) {\r\n const wall = elem as WallModel;\r\n maxChildHeight = Math.max(maxChildHeight, wall.lz);\r\n if (wall.roofId) {\r\n const maxWallHeight = map.get(wall.roofId) ?? 0;\r\n if (maxWallHeight < wall.lz) {\r\n map.set(wall.roofId, wall.lz);\r\n }\r\n }\r\n } else if (elem.type === ObjectType.Roof) {\r\n maxChildHeight = Math.max(maxChildHeight, (elem as RoofModel).rise + (map.get(elem.id) ?? 0));\r\n }\r\n }\r\n // cuboids\r\n else if (elem.type === ObjectType.Cuboid && groupIdSet.has(getCuboidParentId(elem.id))) {\r\n const { topZ } = Util.getWorldDataById(elem.id);\r\n maxBaseZ = Math.max(maxBaseZ, topZ);\r\n if (elem.parentId !== GROUND_ID) {\r\n childCuboidIdSet.add(elem.id);\r\n }\r\n }\r\n }\r\n const position = new Vector3(bound.x + bound.width / 2, bound.y + bound.height / 2);\r\n let dimension = [bound.width, bound.height, Math.max(maxChildHeight, maxBaseZ)];\r\n let rotation = 0;\r\n if (groupElements.length === 1 && childCuboidIdSet.size === 0) {\r\n const e = groupElements[0];\r\n rotation = e.rotation[2];\r\n dimension = [e.lx, e.ly, Math.max(maxChildHeight, maxBaseZ)];\r\n }\r\n return { position, dimension, rotation, childCuboidIdSet };\r\n }\r\n\r\n function getCuboidParentId(id: string): string {\r\n const pId = cuboidParentIdMap.get(id);\r\n if (!pId) return id;\r\n return getCuboidParentId(pId);\r\n }\r\n\r\n return (\r\n \r\n );\r\n});\r\n\r\nconst GroupMasterWrapper = React.memo(() => {\r\n const enableGroupAction = useStore(Selector.groupActionMode);\r\n\r\n if (!enableGroupAction) return null;\r\n return ;\r\n});\r\n\r\nexport default GroupMasterWrapper;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n *\r\n * @author Charles Xie, Xiaotong Ding\r\n */\r\n\r\nimport React, { Suspense, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { Canvas } from '@react-three/fiber';\r\nimport Sky from './views/sky';\r\nimport Axes from './views/axes';\r\nimport ElementsRenderer from './elementsRenderer';\r\nimport Ground from './views/ground';\r\nimport Heliodon from './views/heliodonWrapper';\r\nimport ifiLogo from './assets/ifi-logo.png';\r\nimport MainMenu from './mainMenu';\r\nimport { DEFAULT_FAR, DEFAULT_FOV, VERSION } from './constants';\r\nimport { visitHomepage, visitIFI } from './helpers';\r\nimport AcceptCookie from './acceptCookie';\r\nimport GroundImage from './views/groundImage';\r\nimport DropdownContextMenu from './components/contextMenu';\r\nimport { DesignProblem, EvolutionMethod } from './types';\r\nimport CloudManager from './cloudManager';\r\nimport ActionLogger from './actionLogger';\r\nimport Lights from './lights';\r\nimport { Auxiliary } from './auxiliary';\r\nimport Compass from './compassContainer';\r\nimport i18n from './i18n/i18n';\r\nimport KeyboardListener from './keyboardListener';\r\nimport CloudImage from './assets/cloud.png';\r\nimport SceneRadiusCalculator from './sceneRadiusCalculator';\r\nimport { UndoableChange } from './undo/UndoableChange';\r\nimport CameraController from './cameraController';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { UndoableCameraChange } from './undo/UndoableCameraChange';\r\nimport ShareLink from './shareLinks';\r\nimport SolarPanelTiltAngleGa from './ai/ga/solarPanelTiltAngleGa';\r\nimport SolarPanelArrayGa from './ai/ga/solarPanelArrayGa';\r\nimport SolarPanelTiltAnglePso from './ai/pso/solarPanelTiltAnglePso';\r\nimport SolarPanelArrayPso from './ai/pso/solarPanelArrayPso';\r\nimport NavigationController from './navigationController';\r\nimport Waiting from './waiting';\r\nimport Panels from './panels';\r\nimport Simulations from './simulations';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { Button } from 'antd';\r\nimport ProjectGallery from './panels/projectGallery';\r\nimport SplitPane from 'react-split-pane';\r\nimport { throttle } from 'lodash';\r\nimport GroupMasterWrapper from './components/groupMaster';\r\n\r\nexport interface AppCreatorProps {\r\n viewOnly: boolean;\r\n}\r\n\r\nconst AppCreator = ({ viewOnly = false }: AppCreatorProps) => {\r\n const user = useStore(Selector.user);\r\n const loggable = useStore(Selector.loggable);\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const changed = usePrimitiveStore(Selector.changed);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const navigation = useStore(Selector.viewState.navigationView) ?? false;\r\n const cloudFile = useStore(Selector.cloudFile);\r\n const projectView = useStore(Selector.projectView);\r\n const axes = useStore(Selector.viewState.axes);\r\n const theme = useStore(Selector.viewState.theme);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const groundImageType = useStore(Selector.viewState.groundImageType) ?? 'roadmap';\r\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\r\n const evolutionMethod = useStore(Selector.evolutionMethod);\r\n const evolutionaryAlgorithmState = useStore(Selector.evolutionaryAlgorithmState);\r\n\r\n const [initializing, setInitializing] = useState(true);\r\n const [canvasRelativeWidth, setCanvasRelativeWidth] = useState(50);\r\n\r\n const canvasRef = useRef(null);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n useEffect(() => {\r\n setInitializing(false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n setCommonStore((state) => {\r\n // state.loggable = false; // temporarily disabled\r\n state.loggable = user && user.uid ? !user.email?.endsWith('@intofuture.org') : false;\r\n if (\r\n user &&\r\n (user.noLogging ||\r\n !user.schoolID ||\r\n user.schoolID === 'UNKNOWN SCHOOL' ||\r\n !user.classID ||\r\n user.classID === 'UNKNOWN CLASS')\r\n ) {\r\n state.loggable = false;\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [user]);\r\n\r\n const zoomView = (scale: number) => {\r\n if (orthographic) {\r\n // Previously, we declared this in the header: const cameraZoom = useStore(Selector.viewState.cameraZoom) ?? 20;\r\n // But it causes the app to be re-rendered every time zoom is called.\r\n const cameraZoom = useStore.getState().viewState.cameraZoom ?? 20;\r\n const oldZoom = cameraZoom;\r\n const newZoom = cameraZoom / scale;\r\n const undoableChange = {\r\n name: 'Zoom',\r\n timestamp: Date.now(),\r\n oldValue: oldZoom,\r\n newValue: newZoom,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.cameraZoom = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.cameraZoom = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.viewState.cameraZoom = newZoom;\r\n });\r\n } else {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n const p = orbitControlsRef.current.object.position;\r\n const x = p.x * scale;\r\n const y = p.y * scale;\r\n const z = p.z * scale;\r\n const undoableCameraChange = {\r\n name: 'Zoom',\r\n timestamp: Date.now(),\r\n oldCameraPosition: [p.x, p.y, p.z],\r\n newCameraPosition: [x, y, z],\r\n undo: () => {\r\n const oldX = undoableCameraChange.oldCameraPosition[0];\r\n const oldY = undoableCameraChange.oldCameraPosition[1];\r\n const oldZ = undoableCameraChange.oldCameraPosition[2];\r\n orbitControlsRef.current?.object.position.set(oldX, oldY, oldZ);\r\n orbitControlsRef.current?.update();\r\n setCommonStore((state) => {\r\n state.viewState.cameraPosition = [oldX, oldY, oldZ];\r\n });\r\n },\r\n redo: () => {\r\n const newX = undoableCameraChange.newCameraPosition[0];\r\n const newY = undoableCameraChange.newCameraPosition[1];\r\n const newZ = undoableCameraChange.newCameraPosition[2];\r\n orbitControlsRef.current?.object.position.set(newX, newY, newZ);\r\n orbitControlsRef.current?.update();\r\n setCommonStore((state) => {\r\n state.viewState.cameraPosition = [newX, newY, newZ];\r\n });\r\n },\r\n } as UndoableCameraChange;\r\n addUndoable(undoableCameraChange);\r\n orbitControlsRef.current.object.position.set(x, y, z);\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n state.viewState.cameraPosition = [x, y, z];\r\n });\r\n }\r\n }\r\n };\r\n\r\n const resetView = () => {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n // I don't know why the reset method results in a black screen.\r\n // So we are resetting it here to a predictable position.\r\n const z = Math.min(50, useStore.getState().sceneRadius * 4);\r\n orbitControlsRef.current.object.position.set(z, z, z);\r\n orbitControlsRef.current.target.set(0, 0, 0);\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n const v = state.viewState;\r\n v.cameraPosition = [z, z, z];\r\n v.panCenter = [0, 0, 0];\r\n });\r\n }\r\n };\r\n\r\n const set2DView = (selected: boolean) => {\r\n setCommonStore((state) => {\r\n state.viewState.orthographic = selected;\r\n state.viewState.enableRotate = !selected;\r\n if (selected) {\r\n state.viewState.navigationView = false;\r\n }\r\n });\r\n };\r\n\r\n const setNavigationView = (selected: boolean) => {\r\n setCommonStore((state) => {\r\n state.viewState.navigationView = selected;\r\n state.viewState.enableRotate = !selected;\r\n if (selected) {\r\n state.viewState.orthographic = false;\r\n }\r\n });\r\n };\r\n\r\n console.log('x');\r\n\r\n const isCloudFileOwner = user.uid && new URLSearchParams(window.location.search).get('userid') === user.uid;\r\n\r\n const createCanvas = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* somehow we have to use two suspense wrappers as follows */}\r\n \r\n \r\n \r\n \r\n \r\n {axes && }\r\n \r\n \r\n {groundImage && }\r\n {/* */}\r\n \r\n \r\n \r\n {evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM &&\r\n evolutionaryAlgorithmState.geneticAlgorithmParams.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE && (\r\n \r\n )}\r\n {evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM &&\r\n evolutionaryAlgorithmState.geneticAlgorithmParams.problem === DesignProblem.SOLAR_PANEL_ARRAY && (\r\n \r\n )}\r\n {evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION &&\r\n evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem ===\r\n DesignProblem.SOLAR_PANEL_TILT_ANGLE && }\r\n {evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION &&\r\n evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem === DesignProblem.SOLAR_PANEL_ARRAY && (\r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n return (\r\n // disable the default context menu for the entire app\r\n
e.preventDefault()}>\r\n {/* Spinner, Simulation and Evolution control panels */}\r\n \r\n\r\n \r\n \r\n {i18n.t('name.Aladdin', lang)}\r\n \r\n {cloudFile && !openModelsMap && (\r\n \r\n \r\n {cloudFile + (isCloudFileOwner && changed ? ' *' : '')}\r\n {!viewOnly && isCloudFileOwner && changed && (\r\n {\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Cloud File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('word.Save', lang)}\r\n \r\n )}\r\n \r\n )}\r\n
\r\n {viewOnly ? (\r\n \r\n \r\n {' V ' + VERSION}\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n    ©{new Date().getFullYear()} {i18n.t('name.IFI', lang)}\r\n  \r\n {i18n.t('word.VersionInitial', lang) + VERSION + '. ' + i18n.t('word.AllRightsReserved', lang) + '. '}\r\n \r\n \r\n )}\r\n {!viewOnly && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {/* must specify the height here for the floating window to have correct boundary check*/}\r\n
\r\n {\r\n setCanvasRelativeWidth(Math.round(100 - (size / window.innerWidth) * 100));\r\n }, 5)}\r\n // must specify the height again for the split pane to resize correctly with the window\r\n style={{ height: 'calc(100vh - 72px)', display: 'flex' }}\r\n pane1Style={{\r\n width: projectView ? 100 - canvasRelativeWidth + '%' : '0',\r\n minWidth: projectView ? '25%' : 0,\r\n maxWidth: projectView ? '75%' : 0,\r\n }}\r\n pane2Style={{ width: projectView ? canvasRelativeWidth + '%' : '100%' }}\r\n resizerStyle={{\r\n cursor: 'col-resize',\r\n width: projectView ? '6px' : 0,\r\n minWidth: projectView ? '6px' : 0,\r\n maxWidth: projectView ? '6px' : 0,\r\n backgroundImage: 'linear-gradient(to right, white, gray)',\r\n }}\r\n >\r\n {projectView ? (\r\n \r\n ) : (\r\n <>\r\n )}\r\n {createCanvas()}\r\n \r\n \r\n
\r\n
\r\n \r\n {!viewOnly && }\r\n {!viewOnly && loggable && }\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(AppCreator);\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVDhMNNH79FgAAAqJJREFUWIXtlD1IG2EYx/+XQE5jicEQTYdAviwGRLL4tZSSoWA7mApFMJQObi7NopN0aqC4FIRCIYiJQ0IHoUvRBuokVBoQxLYQKqcgbSMamstdLpfLXZ4uFhIRmpRcu+S3vPC+D/yej5cH6NChw3+GaSHWZzabx4eGhm6xLHtDVdXq6ekpl8vldgF80StBAAiGw+F38XhcyWazJAgCVSoVkiSJTk5OaGNjQ5uenn4LYLjtZo/H82xzc5OaYXl5mQcQaJvc5XI93d/fb0r+m3A4/BEAC+B+IBB4PjY29qK7u3seQF+r/uH19fWW5EREqVRK9fv9n3d2dkgQBJJlmQ4PD2lpaekbgIdN24PBYKplOxEdHR3R3t7etW+JRIIAPGjGb1hZWSn+TQJ/YnFxMQ/A1iC7PH1TU1MvQ6FQHMATp9PZ1XS7WiASifQ5HI5HV+9t0Wg0p6oqERGtra3R6uqqpkcHiIhmZmbeNNhHR0cf12q1hqByuayXn+bm5rYaRuD1eq0M07gQu7p0mQA4jkMymdytvzOyLGucnZ2d10taz8HBAWq12s2BgYE7HMdJAL4CAGKx2JYgCLq1/TqSySTZ7fYQAGBkZOTV8fHxP02AiGhycvK1AQAGBwfHXS6X7iOoJ5FIIJvNxgAADMPcjUQiuUwmQ7Is61ZxqVSi7e1tWlhY+ITL1Vz//e0A7k1MTNz2+/0Bn8/n8Xq9Vrfbjf7+flgsFpjNZphMJhgMhoZqFEVBtVpFpVKBJEkQRRE8z+Pi4gL5fF7jef787OyMy2QyH9LpdBrAewDa1QSuYgPgAuC2Wq1Om83m6O3t7evp6WFNJpNF0zQYjUYwDFMuFAqyoiiiKIrlYrH4s1Ao5FVVzQM4B/AdwA8ApTZMrkOHDu3nF/riE6r44ku2AAAAAElFTkSuQmCC\"","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { saveAs } from 'file-saver';\r\nimport { showError, showInfo } from './helpers';\r\nimport i18n from './i18n/i18n';\r\nimport { Button, Input, Modal } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\n\r\nexport interface LocalFileManagerProps {\r\n viewOnly: boolean;\r\n}\r\n\r\nconst LocalFileManager = ({ viewOnly = false }: LocalFileManagerProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const exportContent = useStore(Selector.exportContent);\r\n const importContent = useStore(Selector.importContent);\r\n const createEmptyFile = useStore(Selector.createEmptyFile);\r\n const saveLocalFileDialogVisible = usePrimitiveStore(Selector.saveLocalFileDialogVisible);\r\n const createNewFileFlag = useStore(Selector.createNewFileFlag);\r\n const openLocalFileFlag = useStore(Selector.openLocalFileFlag);\r\n const cloudFile = useStore(Selector.cloudFile);\r\n const localFileName = useStore(Selector.localFileName);\r\n const user = useStore(Selector.user);\r\n const language = useStore(Selector.language);\r\n\r\n const [confirmLoading, setConfirmLoading] = useState(false);\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n useEffect(() => {\r\n if (createNewFileFlag) {\r\n createNewFile();\r\n useStore.getState().setCreateNewFileFlag(false);\r\n }\r\n }, [createNewFileFlag]);\r\n\r\n useEffect(() => {\r\n if (openLocalFileFlag) {\r\n readLocalFile();\r\n useStore.getState().setOpenLocalFileFlag(false);\r\n }\r\n }, [openLocalFileFlag]);\r\n\r\n const createNewFile = () => {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n onOk: () => {\r\n if (user.uid) {\r\n if (cloudFile) {\r\n setCommonStore((state) => {\r\n state.localContentToImportAfterCloudFileUpdate = 'CREATE_NEW_FILE';\r\n });\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n } else {\r\n // no cloud file has been created\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n }\r\n } else {\r\n showInfo(i18n.t('menu.file.ToSaveYourWorkPleaseSignIn', lang));\r\n }\r\n },\r\n onCancel: () => {\r\n createEmptyFile();\r\n },\r\n });\r\n };\r\n\r\n const readLocalFile = () => {\r\n if (!viewOnly && usePrimitiveStore.getState().changed) {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n onOk: () => {\r\n if (user.uid) {\r\n if (cloudFile) {\r\n loadLocalFile(true);\r\n } else {\r\n // no cloud file has been created\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n }\r\n } else {\r\n showInfo(i18n.t('menu.file.ToSaveYourWorkPleaseSignIn', lang));\r\n }\r\n },\r\n onCancel: () => loadLocalFile(false),\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n loadLocalFile(false);\r\n }\r\n };\r\n\r\n const loadLocalFile = (saveFirst: boolean) => {\r\n document.body.onfocus = () => {\r\n setCommonStore((state) => {\r\n state.localFileDialogRequested = false;\r\n });\r\n };\r\n const fileDialog = document.getElementById('file-dialog') as HTMLInputElement;\r\n fileDialog.onchange = () => {\r\n if (fileDialog.files && fileDialog.files.length > 0) {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = true;\r\n });\r\n const reader = new FileReader();\r\n reader.readAsText(fileDialog.files[0]);\r\n const fn = fileDialog.files[0].name;\r\n setCommonStore((state) => {\r\n state.localFileName = fn;\r\n });\r\n reader.onload = () => {\r\n if (reader.result) {\r\n const input = JSON.parse(reader.result.toString());\r\n if (saveFirst) {\r\n if (cloudFile) {\r\n setCommonStore((state) => {\r\n state.localContentToImportAfterCloudFileUpdate = input;\r\n });\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n }\r\n } else {\r\n importContent(input);\r\n }\r\n }\r\n fileDialog.value = '';\r\n };\r\n }\r\n };\r\n fileDialog.click();\r\n };\r\n\r\n const writeLocalFile = () => {\r\n let fn = localFileName.trim();\r\n if (fn.length > 0) {\r\n if (!fn.endsWith('.ala')) {\r\n fn += '.ala';\r\n }\r\n const blob = new Blob([JSON.stringify(exportContent())], { type: 'application/json' });\r\n saveAs(blob, fn);\r\n setCommonStore((state) => {\r\n state.localFileName = fn;\r\n state.cloudFile = undefined;\r\n });\r\n return true;\r\n } else {\r\n showError(i18n.t('menu.file.SavingAbortedMustHaveValidFileName', lang) + '.');\r\n return false;\r\n }\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const performOkAction = () => {\r\n setConfirmLoading(true);\r\n if (writeLocalFile()) {\r\n usePrimitiveStore.setState((state) => {\r\n state.saveLocalFileDialogVisible = false;\r\n });\r\n }\r\n setConfirmLoading(false);\r\n };\r\n\r\n const performCancelAction = () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.saveLocalFileDialogVisible = false;\r\n });\r\n };\r\n\r\n const useCloudFileName = () => {\r\n if (cloudFile) {\r\n setCommonStore((state) => {\r\n state.localFileName = cloudFile;\r\n if (!state.localFileName.endsWith('.ala')) state.localFileName += '.ala';\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('menu.file.SaveAsLocalFile', lang)}\r\n \r\n }\r\n footer={\r\n cloudFile\r\n ? [\r\n ,\r\n ,\r\n ,\r\n ]\r\n : [\r\n ,\r\n ,\r\n ]\r\n }\r\n visible={saveLocalFileDialogVisible}\r\n confirmLoading={confirmLoading}\r\n onCancel={performCancelAction}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n ) => {\r\n setCommonStore((state) => {\r\n state.localFileName = e.target.value;\r\n });\r\n }}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(LocalFileManager);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n *\r\n * @author Charles Xie, Xiaotong Ding\r\n */\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { CommonStoreState, useStore } from './stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport './app.css';\r\nimport ErrorPage from './ErrorPage';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { ConfigProvider } from 'antd';\r\nimport AppCreator from './appCreator';\r\nimport LocalFileManager from './localFileManager';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\n\r\nconst App = () => {\r\n const locale = useStore(Selector.locale);\r\n const world = useStore((state: CommonStoreState) => state.world);\r\n const elements = useStore((state: CommonStoreState) => state.elements);\r\n const viewState = useStore((state: CommonStoreState) => state.viewState);\r\n const notes = useStore((state: CommonStoreState) => state.notes);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const setChanged = usePrimitiveStore(Selector.setChanged);\r\n const setSkipChange = usePrimitiveStore(Selector.setSkipChange);\r\n const loadWeatherData = useStore(Selector.loadWeatherData);\r\n const loadHorizontalSolarRadiationData = useStore(Selector.loadHorizontalSolarRadiationData);\r\n const loadVerticalSolarRadiationData = useStore(Selector.loadVerticalSolarRadiationData);\r\n const loadPvModules = useStore(Selector.loadPvModules);\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n const viewOnly = params.get('viewonly') === 'true';\r\n const map = params.get('map') === 'true';\r\n\r\n useEffect(() => {\r\n loadWeatherData();\r\n loadHorizontalSolarRadiationData();\r\n loadVerticalSolarRadiationData();\r\n loadPvModules();\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = map;\r\n if (map) {\r\n state.modelsMapFlag = true;\r\n state.modelsMapWeatherStations = false;\r\n state.leaderboardFlag = true;\r\n state.showLeaderboard = true;\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (usePrimitiveStore.getState().skipChange) {\r\n setSkipChange(false);\r\n } else if (!usePrimitiveStore.getState().changed) {\r\n setChanged(true);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [world, viewState, elements, notes]);\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n usePrimitiveStore.setState((state) => {\r\n state.showSolarRadiationHeatmap = false;\r\n });\r\n }\r\n if (showHeatFluxes) {\r\n usePrimitiveStore.setState((state) => {\r\n state.showHeatFluxes = false;\r\n });\r\n }\r\n }, [world, elements]);\r\n\r\n return (\r\n \r\n \r\n {viewOnly ? (\r\n \r\n ) : (\r\n ''}>\r\n {' '}\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './app';\r\n// import reportWebVitals from './reportWebVitals';\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root'),\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\n// reportWebVitals();\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["i18n/i18n.ts","i18n/en.ts","i18n/zh_cn.ts","i18n/zh_tw.ts","i18n/es.ts","i18n/tr.ts","i18n/ua.ts","types.ts","resources/weather.csv","resources/solar_radiation_horizontal.csv","resources/solar_radiation_vertical.csv","resources/pvmodules.csv","js/MyOrbitControls.js","js/ParabolicCylinderGeometry.js","js/ParaboloidGeometry.js","js/ConvexGeometry.js","models/WallModel.ts","constants.ts","models/Rectangle.ts","models/RoofModel.ts","models/WindowModel.ts","stores/commonRef.ts","resources/jaah.png","resources/jack.png","resources/jacob.png","resources/jacqueline.png","resources/jade.png","resources/jamelia.png","resources/james.png","resources/jane.png","resources/jaya.png","resources/jaye.png","resources/jeanette.png","resources/jedi.png","resources/jeff.png","resources/jena.png","resources/jennifer.png","resources/jess.png","resources/jett.png","resources/jill.png","resources/jiya.png","resources/joan.png","resources/jocelyn.png","resources/joel.png","resources/joey.png","resources/john.png","resources/jonathon.png","resources/jose.png","resources/joseph.png","resources/joshua.png","resources/judd.png","resources/judy.png","resources/julia.png","resources/julio.png","resources/jumapili.png","resources/june.png","resources/juro.png","resources/justin.png","HumanData.ts","resources/no_leaf_shrub.png","resources/bellflower.png","resources/boxwood.png","resources/cactus_combo_1.png","resources/cactus_combo_2.png","resources/cactus_combo_3.png","resources/cactus_combo_4.png","resources/hibiscus.png","resources/hydrangea.png","resources/hosta.png","resources/peony.png","resources/red_rose.png","resources/spirea.png","resources/sunflower.png","resources/tall_bush.png","resources/tulip.png","resources/white_flower.png","resources/yellow_flower.png","FlowerData.ts","resources/no_leaf_flower.png","models/ElementModelFactory.ts","stores/selector/solarPanelArrayLayoutParams.ts","stores/selector/viewState.ts","stores/selector/world.ts","stores/selector/index.ts","views/elementGrid.tsx","views/window/windowResizeHandle.tsx","views/window/windowMoveHandle.tsx","stores/commonPrimitive.ts","stores/commonData.ts","resources/tiny_white_square.png","resources/roof_01.png","resources/roof_02.png","resources/roof_03.png","resources/roof_04.png","resources/roof_05.png","resources/roof_06.png","resources/roof_07.png","views/window/archedWindow.tsx","views/window/polygonalWindow.tsx","views/roof/roofSegment.tsx","views/roof/ceiling.tsx","views/hooks.ts","views/roof/pyramidRoof.tsx","views/roof/gambrelRoof.tsx","views/roof/gableRoof.tsx","views/roof/hipRoof.tsx","views/roof/mansardRoof.tsx","helpers.ts","resources/wall_edge.png","resources/wall_01.png","resources/wall_03.png","resources/wall_04.png","resources/wall_05.png","resources/wall_06.png","resources/wall_07.png","resources/wall_08.png","resources/wall_09.png","resources/wall_10.png","views/wall/hooks.ts","resources/wall_02.png","views/SharedUtil.ts","views/roof/roofRenderer.tsx","undo/UndoableAdd.ts","views/roof/hooks.ts","resources/roof_edge.png","views/roof/flatRoof.tsx","resources/foundation_01.png","resources/foundation_02.png","resources/foundation_03.png","resources/foundation_04.png","resources/foundation_05.png","resources/foundation_06.png","resources/foundation_07.png","fonts/helvetiker_regular.typeface.fnt","views/polarGrid.tsx","components/rotateHandle.tsx","components/wireframe.tsx","views/horizontalRuler.tsx","analysis/analysisConstants.ts","models/DoorModel.ts","analysis/SunMinutes.ts","analysis/sunTools.ts","views/solarUpdraftTower.tsx","resources/glow.png","views/solarPowerTower.tsx","views/solarReceiverPipe.tsx","stores/InnerCommonState.ts","views/solarPanel/hooks.tsx","views/solarPanel/solarPanelOnRoof.tsx","views/wall/emptyWall.tsx","views/wall/wallMoveHandleWrapper.tsx","views/wall/wallResizeHandleWrapper.tsx","views/wall/wallRenderer.tsx","views/foundation/buildingRenderer.tsx","views/foundation/foundation.tsx","views/window/windowHandleWrapper.tsx","views/window/rectangleWindow.tsx","views/rulerOnWall.tsx","views/window/window.tsx","views/wall/wallWireFrame.tsx","views/door/rectangleDoor.tsx","views/door/archedDoor.tsx","resources/door_edge.png","resources/door_01.png","resources/door_02.png","resources/door_03.png","resources/door_04.png","resources/door_05.png","resources/door_06.png","resources/door_07.png","resources/door_08.png","resources/door_09.png","resources/door_10.png","resources/door_11.png","resources/door_12.png","resources/door_13.png","resources/door_14.png","resources/door_15.png","resources/door_16.png","resources/door_17.png","views/door/door.tsx","views/door/hooks.ts","views/solarPanel/solarPanelOnWall.tsx","resources/polygon_08.png","resources/polygon_09.png","resources/polygon_10.png","views/polygon.tsx","views/wall/parapet.tsx","views/wall/wall.tsx","views/wall/wallHeatFlux.tsx","views/roof/RoofUtil.ts","models/Stackable.ts","resources/building_facade_01.png","views/cuboid/handles.tsx","resources/building_facade_02.png","resources/building_facade_03.png","resources/building_facade_04.png","resources/building_facade_05.png","resources/building_facade_06.png","resources/building_facade_07.png","resources/building_facade_08.png","resources/building_facade_09.png","resources/building_facade_10.png","components/moveHandle.tsx","components/resizeHandle.tsx","views/solarPanel/solarPanelOnCuboid.tsx","views/cuboid/cuboid.tsx","views/sensor.tsx","views/light.tsx","views/cuboid/index.tsx","Util.ts","stores/DefaultWorldModel.ts","models/ElementModelCloner.ts","stores/DefaultViewState.ts","undo/UndoManager.ts","stores/DefaultSolarPanelArrayLayoutParams.ts","stores/ElementCounter.ts","stores/DefaultGeneticAlgorithmParams.ts","stores/DefaultParticleSwarmOptimizationParams.ts","stores/DefaultEvolutionaryAlgorithmState.ts","stores/DefaultSolarPanelArrayLayoutConstraints.ts","stores/DefaultEconomicsParams.ts","stores/DefaultActionState.ts","stores/DefaultGraphState.ts","panels/ProjectUtil.ts","stores/StoreUtil.ts","models/Groupable.ts","stores/common.ts","ErrorPage.tsx","resources/daysky.jpg","resources/desert.jpg","resources/dune.jpg","resources/forest.jpg","resources/grassland.jpg","resources/hill-spring.jpg","resources/hill-summer.jpg","resources/hill-fall.jpg","resources/hill-winter.jpg","resources/lake.jpg","resources/mountain.jpg","resources/rural.jpg","views/sky.tsx","views/axes.tsx","views/human.tsx","resources/apple_spring.png","resources/apple_summer.png","resources/apple_fall.png","resources/apple_winter.png","resources/birch_spring.png","resources/birch_summer.png","resources/birch_fall.png","resources/birch_winter.png","resources/coconut.png","resources/dogwood_spring.png","resources/dogwood_summer.png","resources/dogwood_fall.png","resources/dogwood_winter.png","resources/elm_spring.png","resources/elm_summer.png","resources/elm_fall.png","resources/elm_winter.png","resources/fan_palm.png","resources/linden_spring.png","resources/linden_summer.png","resources/linden_fall.png","resources/linden_winter.png","resources/magnolia_spring.png","resources/magnolia_summer.png","resources/magnolia_fall.png","resources/magnolia_winter.png","resources/maple_spring.png","resources/maple_summer.png","resources/maple_fall.png","resources/maple_winter.png","resources/oak_spring.png","resources/oak_summer.png","resources/oak_fall.png","resources/oak_winter.png","resources/pine.png","resources/spruce.png","TreeData.ts","views/tree.tsx","views/shapes.tsx","analysis/heatTools.ts","views/parabolicTrough.tsx","views/parabolicDish.tsx","views/fresnelReflector.tsx","views/heliostat.tsx","views/solarPanel/solarPanel.tsx","views/flower.tsx","panels/simulationControlPanel.tsx","panels/evolutionControlPanel.tsx","components/spinner.tsx","waiting.tsx","elementsRenderer.tsx","views/ground.tsx","views/heliodon.tsx","views/heliodonWrapper.tsx","assets/ifi-logo.png","assets/magic-lamp.png","team.tsx","about.tsx","components/contextMenu/elementMenu/cspSimulationSettings.tsx","components/contextMenu/elementMenu/pvSimulationSettings.tsx","components/contextMenu/elementMenu/sutSimulationSettings.tsx","components/contextMenu/elementMenu/buildingEnergySimulationSettings.tsx","assets/map_residential_building.png","assets/map_commercial_building.png","assets/map_school_building.png","assets/map_tourist_attraction.png","assets/map_solar_panel.png","assets/map_parabolic_dish.png","assets/map_parabolic_trough.png","assets/map_fresnel_reflector.png","assets/map_heliostat.png","assets/map_under_construction.png","assets/map_marker.png","components/contextMenu/elementMenu/modelSiteDialog.tsx","components/contextMenu/elementMenu/createNewProjectDialog.tsx","cloudProjectUtil.ts","cloudFileUtil.ts","mainMenu.tsx","examples.ts","acceptCookie.tsx","views/groundImage.tsx","components/contextMenu/menuItems.tsx","components/contextMenu/elementMenu/menuHooks.ts","components/contextMenu/dialog.tsx","components/contextMenu/elementMenu/foundationColorSelection.tsx","components/contextMenu/elementMenu/foundationLengthInput.tsx","components/contextMenu/elementMenu/foundationWidthInput.tsx","components/contextMenu/elementMenu/foundationHeightInput.tsx","components/contextMenu/elementMenu/foundationAzimuthInput.tsx","resources/foundation_01_menu.png","resources/foundation_02_menu.png","resources/foundation_03_menu.png","resources/foundation_04_menu.png","resources/foundation_05_menu.png","resources/foundation_06_menu.png","resources/foundation_07_menu.png","components/contextMenu/elementMenu/foundationTextureSelection.tsx","components/contextMenu/elementMenu/solarAbsorberPipeHeightInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipeAbsorptanceInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipeOpticalEfficiencyInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipeThermalEfficiencyInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipeApertureWidthInput.tsx","components/contextMenu/elementMenu/solarAbsorberPipePoleNumberInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerChimneyHeightInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerChimneyRadiusInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerCollectorRadiusInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerCollectorHeightInput.tsx","components/contextMenu/elementMenu/solarPowerTowerHeightInput.tsx","components/contextMenu/elementMenu/solarPowerTowerRadiusInput.tsx","components/contextMenu/elementMenu/solarPowerTowerReceiverAbsorptanceInput.tsx","components/contextMenu/elementMenu/solarPowerTowerReceiverOpticalEfficiencyInput.tsx","components/contextMenu/elementMenu/solarPowerTowerReceiverThermalEfficiencyInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerCollectorTransmissivityInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerDischargeCoefficientInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerTurbineEfficiencyInput.tsx","components/contextMenu/elementMenu/solarUpdraftTowerCollectorEmissivityInput.tsx","components/contextMenu/elementMenu/solarPanelTiltAngleGaWizard.tsx","components/contextMenu/elementMenu/solarPanelTiltAnglePsoWizard.tsx","components/contextMenu/elementMenu/groundFloorRValueInput.tsx","components/contextMenu/elementMenu/foundationMenu.tsx","components/contextMenu/elementMenu/cuboidColorSelection.tsx","components/contextMenu/elementMenu/cuboidLengthInput.tsx","components/contextMenu/elementMenu/cuboidWidthInput.tsx","components/contextMenu/elementMenu/cuboidHeightInput.tsx","components/contextMenu/elementMenu/cuboidAzimuthInput.tsx","resources/building_facade_05_menu.png","resources/building_facade_06_menu.png","resources/building_facade_10_menu.png","components/contextMenu/elementMenu/cuboidTextureSelection.tsx","resources/building_facade_01_menu.png","resources/building_facade_02_menu.png","resources/building_facade_03_menu.png","resources/building_facade_04_menu.png","resources/building_facade_07_menu.png","resources/building_facade_08_menu.png","resources/building_facade_09_menu.png","components/contextMenu/elementMenu/cuboidMenu.tsx","components/contextMenu/elementMenu/groundMenu.tsx","components/contextMenu/elementMenu/humanSelection.tsx","components/contextMenu/elementMenu/humanMenu.tsx","components/contextMenu/elementMenu/flowerSelection.tsx","components/contextMenu/elementMenu/flowerMenu.tsx","components/contextMenu/elementMenu/polygonLineColorSelection.tsx","components/contextMenu/elementMenu/polygonFillColorSelection.tsx","resources/polygon_08_menu.png","resources/polygon_10_menu.png","components/contextMenu/elementMenu/polygonTextureSelection.tsx","resources/polygon_09_menu.png","pd/SolarPanelLayoutRelative.ts","pd/SolarPanelLayoutAbsolute.ts","components/contextMenu/elementMenu/solarPanelLayoutWizard.tsx","components/contextMenu/elementMenu/polygonLineStyleSelection.tsx","components/contextMenu/elementMenu/polygonLineWidthSelection.tsx","components/contextMenu/elementMenu/solarPanelArrayGaWizard.tsx","components/contextMenu/elementMenu/solarPanelArrayPsoWizard.tsx","components/contextMenu/elementMenu/polygonOpacityInput.tsx","components/contextMenu/elementMenu/polygonMenu.tsx","components/contextMenu/elementMenu/polygonVertexMenu.tsx","components/contextMenu/elementMenu/sensorMenu.tsx","components/contextMenu/elementMenu/lightMenu.tsx","components/contextMenu/elementMenu/skyMenu.tsx","models/SolarPanelNominalSize.ts","components/contextMenu/elementMenu/solarPanelModelSelection.tsx","components/contextMenu/elementMenu/wallMenu.tsx","components/contextMenu/elementMenu/solarPanelOrientationSelection.tsx","components/contextMenu/elementMenu/solarPanelLengthInput.tsx","components/contextMenu/elementMenu/solarPanelWidthInput.tsx","components/contextMenu/elementMenu/solarPanelTiltAngleInput.tsx","components/contextMenu/elementMenu/solarPanelRelativeAzimuthInput.tsx","components/contextMenu/elementMenu/solarPanelTrackerSelection.tsx","components/contextMenu/elementMenu/solarPanelPoleHeightInput.tsx","components/contextMenu/elementMenu/solarPanelPoleSpacingInput.tsx","components/contextMenu/elementMenu/solarPanelFrameColorSelection.tsx","components/contextMenu/elementMenu/solarPanelInverterEfficiencyInput.tsx","components/contextMenu/elementMenu/solarPanelDcToAcRatioInput.tsx","components/contextMenu/elementMenu/solarPanleMenu.tsx","components/contextMenu/elementMenu/parabolicTroughLengthInput.tsx","components/contextMenu/elementMenu/parabolicTroughWidthInput.tsx","components/contextMenu/elementMenu/parabolicTroughPoleHeightInput.tsx","components/contextMenu/elementMenu/parabolicTroughLatusRectumInput.tsx","components/contextMenu/elementMenu/parabolicTroughModuleLengthInput.tsx","components/contextMenu/elementMenu/parabolicTroughReflectanceInput.tsx","components/contextMenu/elementMenu/parabolicTroughAbsorptanceInput.tsx","components/contextMenu/elementMenu/parabolicTroughOpticalEfficiencyInput.tsx","components/contextMenu/elementMenu/parabolicTroughThermalEfficiencyInput.tsx","components/contextMenu/elementMenu/parabolicTroughMenu.tsx","components/contextMenu/elementMenu/parabolicDishDiameterInput.tsx","components/contextMenu/elementMenu/parabolicDishPoleHeightInput.tsx","components/contextMenu/elementMenu/parabolicDishLatusRectumInput.tsx","components/contextMenu/elementMenu/parabolicDishReflectanceInput.tsx","components/contextMenu/elementMenu/parabolicDishAbsorptanceInput.tsx","components/contextMenu/elementMenu/parabolicDishOpticalEfficiencyInput.tsx","components/contextMenu/elementMenu/parabolicDishThermalEfficiencyInput.tsx","components/contextMenu/elementMenu/parabolicDishStructureTypeInput.tsx","components/contextMenu/elementMenu/parabolicDishPoleRadiusInput.tsx","components/contextMenu/elementMenu/parabolicDishMenu.tsx","components/contextMenu/elementMenu/fresnelReflectorLengthInput.tsx","components/contextMenu/elementMenu/fresnelReflectorWidthInput.tsx","components/contextMenu/elementMenu/fresnelReflectorPoleHeightInput.tsx","components/contextMenu/elementMenu/fresnelReflectorModuleLengthInput.tsx","components/contextMenu/elementMenu/fresnelReflectorReflectanceInput.tsx","components/contextMenu/elementMenu/fresnelReflectorAbsorberSelection.tsx","components/contextMenu/elementMenu/fresnelReflectorDrawSunBeamSelection.tsx","components/contextMenu/elementMenu/fresnelReflectorMenu.tsx","components/contextMenu/elementMenu/heliostatWidthInput.tsx","components/contextMenu/elementMenu/heliostatLengthInput.tsx","components/contextMenu/elementMenu/heliostatPoleHeightInput.tsx","components/contextMenu/elementMenu/heliostatReflectorReflectanceInput.tsx","components/contextMenu/elementMenu/heliostatDrawSunBeamSelection.tsx","components/contextMenu/elementMenu/heliostatTowerSelection.tsx","components/contextMenu/elementMenu/heliostatPoleRadiusInput.tsx","components/contextMenu/elementMenu/heliostatMenu.tsx","components/contextMenu/elementMenu/treeSelection.tsx","components/contextMenu/elementMenu/treeMenu.tsx","resources/wall_01_menu.png","resources/wall_02_menu.png","resources/wall_03_menu.png","resources/wall_04_menu.png","resources/wall_05_menu.png","resources/wall_06_menu.png","resources/wall_07_menu.png","resources/wall_08_menu.png","resources/wall_09_menu.png","resources/wall_10_menu.png","components/contextMenu/elementMenu/wallTextureSelection.tsx","components/contextMenu/elementMenu/wallColorSelection.tsx","components/contextMenu/elementMenu/wallStructureColorSelection.tsx","components/contextMenu/elementMenu/wallNumberInput.tsx","components/contextMenu/elementMenu/wallRValueInput.tsx","components/contextMenu/elementMenu/wallHeatCapacityInput.tsx","components/contextMenu/elementMenu/wallParapetNumberInput.tsx","components/contextMenu/elementMenu/wallParapetColorSelection.tsx","components/contextMenu/elementMenu/wallParapetTextureSelection.tsx","components/contextMenu/elementMenu/windowMenu.tsx","components/contextMenu/elementMenu/doorTextureSelection.tsx","components/contextMenu/elementMenu/doorColorSelection.tsx","components/contextMenu/elementMenu/doorUValueInput.tsx","components/contextMenu/elementMenu/doorWidthInput.tsx","components/contextMenu/elementMenu/doorHeightInput.tsx","components/contextMenu/elementMenu/doorHeatCapacityInput.tsx","components/contextMenu/elementMenu/doorOpacityInput.tsx","components/contextMenu/elementMenu/doorFrameColorSelection.tsx","components/contextMenu/elementMenu/doorMenu.tsx","components/contextMenu/elementMenu/windowColorSelection.tsx","components/contextMenu/elementMenu/windowNumberInput.tsx","components/contextMenu/elementMenu/windowUValueInput.tsx","components/contextMenu/elementMenu/windowOptionSelection.tsx","components/contextMenu/elementMenu/windowBooleanSelection.tsx","components/groupMaster/groupMaster.tsx","resources/roof_01_menu.png","resources/roof_02_menu.png","resources/roof_03_menu.png","resources/roof_04_menu.png","resources/roof_05_menu.png","resources/roof_06_menu.png","resources/roof_07_menu.png","components/contextMenu/elementMenu/roofTextureSelection.tsx","resources/roof_edge_menu.png","components/contextMenu/elementMenu/roofColorSelection.tsx","components/contextMenu/elementMenu/roofThicknessInput.tsx","components/contextMenu/elementMenu/roofRafterSpacingInput.tsx","components/contextMenu/elementMenu/roofOpacityInput.tsx","components/contextMenu/elementMenu/glassTintSelection.tsx","components/contextMenu/elementMenu/roofRafterColorSelection.tsx","components/contextMenu/elementMenu/roofRafterWidthInput.tsx","components/contextMenu/elementMenu/roofSideColorSelection.tsx","components/contextMenu/elementMenu/roofRValueInput.tsx","components/contextMenu/elementMenu/roofRiseInput.tsx","components/contextMenu/elementMenu/roofHeatCapacityInput.tsx","components/contextMenu/elementMenu/ceilingRValueInput.tsx","components/contextMenu/elementMenu/roofMenu.tsx","components/contextMenu/index.tsx","assets/delete.png","panels/cloudFilePanel.tsx","assets/rename.png","assets/create_link.png","panels/likesPanel.tsx","panels/publishedModelsPanel.tsx","panels/accountSettingsPanel.tsx","assets/empty_heart.png","components/modelsMap.tsx","assets/open_file.png","assets/export_link.png","assets/red_heart.png","assets/click_count.png","modelsGallery.tsx","assets/image_load_failure.png","modelsMapWrapper.tsx","assets/foundation.png","assets/cuboid.png","assets/sensor.png","assets/solar-panel.png","assets/wall.png","assets/window.png","assets/door.png","assets/pyramid_roof.png","assets/hip_roof.png","assets/gambrel_roof.png","assets/mansard_roof.png","assets/gable_roof.png","assets/tree.png","assets/flower.png","assets/human.png","assets/parabolic_trough.png","assets/parabolic_dish.png","assets/fresnel_reflector.png","assets/heliostat.png","assets/led_light.png","mainToolBarButtons.tsx","assets/tiny_lock.png","assets/select.png","assets/group.png","assets/wind_turbine.png","assets/clear.png","assets/analyze.png","assets/heliodon.png","mainToolBar.tsx","saveCloudFileModal.tsx","panels/projectListPanel.tsx","cloudManager.tsx","actionLogger.tsx","lights.tsx","views/verticalRuler.tsx","auxiliary.tsx","compassContainer.tsx","keyboardListener.tsx","components/groupMaster/index.tsx","assets/menu.svg","sceneRadiusCalculator.tsx","cameraController.tsx","shareLinks.tsx","ai/ga/algorithm/Individual.ts","ai/ga/algorithm/Parents.ts","ai/ga/algorithm/Population.ts","ai/ga/algorithm/OptimizerGa.ts","Random.ts","ai/ga/algorithm/SolarPanelTiltAngleOptimizerGa.ts","ai/ga/solarPanelTiltAngleGa.tsx","ai/ga/algorithm/SolarPanelArrayOptimizerGa.ts","ai/ga/solarPanelArrayGa.tsx","ai/pso/algorithm/Particle.ts","ai/pso/algorithm/Swarm.ts","ai/pso/algorithm/OptimizerPso.ts","ai/pso/algorithm/SolarPanelTiltAngleOptimizerPso.ts","ai/pso/solarPanelTiltAnglePso.tsx","ai/pso/algorithm/SolarPanelArrayOptimizerPso.ts","ai/pso/solarPanelArrayPso.tsx","navigationController.tsx","components/groundMap.tsx","panels/mapPanel.tsx","panels/heliodonPanel.tsx","components/symbols.tsx","components/barGraphMenu.tsx","components/barGraph.tsx","components/lineGraphMenu.tsx","components/lineGraph.tsx","panels/weatherPanel.tsx","panels/yearlyLightSensorPanel.tsx","panels/dailyLightSensorPanel.tsx","panels/stickyNotePanel.tsx","panels/instructionPanel.tsx","panels/yearlyPvYieldPanel.tsx","panels/dailyPvYieldPanel.tsx","panels/designInfoPanel.tsx","assets/light_bulb.png","assets/diameter.png","assets/area.png","panels/siteInfoPanel.tsx","assets/location.png","assets/date.png","assets/thermometer.png","panels/visualizationControlPanel.tsx","panels/visibilityResultsPanel.tsx","panels/yearlyParabolicTroughYieldPanel.tsx","panels/dailyParabolicTroughYieldPanel.tsx","panels/dailyParabolicDishYieldPanel.tsx","panels/yearlyParabolicDishYieldPanel.tsx","panels/dailyFresnelReflectorYieldPanel.tsx","panels/yearlyFresnelReflectorYieldPanel.tsx","panels/dailyHeliostatYieldPanel.tsx","panels/yearlyHeliostatYieldPanel.tsx","components/sutBiaxialLineGraph.tsx","panels/dailySolarUpdraftTowerYieldPanel.tsx","panels/diurnalTemperaturePanel.tsx","panels/yearlySolarUpdraftTowerYieldPanel.tsx","components/evolutionBiaxialLineGraph.tsx","panels/solarPanelOptimizationResult.tsx","panels/economicsPanel.tsx","analysis/energyHooks.ts","components/buildingEnergyGraphMenu.tsx","components/buildingEnergyGraph.tsx","panels/dailyBuildingEnergyPanel.tsx","panels/yearlyBuildingEnergyPanel.tsx","panels/navigationPanel.tsx","panels.tsx","analysis/SolarRadiation.ts","analysis/thermalSimulation.tsx","analysis/staticSolarRadiationSimulation.tsx","analysis/dynamicSolarRadiationSimulation.tsx","analysis/parabolicTroughSimulation.tsx","analysis/parabolicDishSimulation.tsx","analysis/fresnelReflectorSimulation.tsx","analysis/heliostatSimulation.tsx","analysis/solarUpdraftTowerSimulation.tsx","analysis/Vantage.ts","analysis/solarPanelVisibility.tsx","analysis/sensorSimulation.tsx","analysis/solarPanelSimulation.tsx","simulations.tsx","assets/image_fail_try_again.png","components/verticalAxis.tsx","components/parallelCoordinates.tsx","components/scatteredPlotMenu.tsx","panels/projectGallery.tsx","appCreator.tsx","assets/cloud.png","localFileManager.tsx","app.tsx","index.tsx"],"names":["i18n","use","LanguageDetector","initReactI18next","init","debug","fallbackLng","interpolation","escapeValue","resources","en","translation","name","IFI","Aladdin","Tagline","cookie","Statement","Accept","aboutUs","ProductBroughtToYouBy","TermsOfService","PrivacyPolicy","Software","Content","Research","Support","Acknowledgment","FundingInformation","Contact","Translators","word","LastUpdate","Small","Medium","Large","Design","Information","Type","Text","FontSize","FontColor","Model","Models","Upload","ClickCount","Share","AlreadyLike","Like","MustLogInToLike","AllRightsReserved","MeterAbbreviation","Version","VersionInitial","Options","Maximum","Minimum","MaximumNumber","MinimumNumber","MaximumValue","MinimumValue","Or","None","High","Partial","Teacher","Class","Total","Leaderboard","Latest","Range","SIUnit","USUnit","ThermalTransmittance","ThermalResistance","UValue","RValue","VolumetricHeatCapacity","BuildingHVACSystem","ThermostatSetpoint","TemperatureToleranceThreshold","TemperatureToleranceThresholdExplanation","Press","Open","Save","SaveAsImage","SaveAsCsv","Update","Paste","Copy","Cut","Delete","Lock","Translucent","Color","Texture","Size","Thickness","Yes","No","OK","Cancel","Apply","Close","ApplyTo","Run","Pause","Resume","Clear","Warning","Caution","Reminder","Length","Width","Height","Radius","Angle","Azimuth","Coordinates","Weather","Show","Animate","Date","Time","Title","Owner","Action","Rename","Location","Latitude","Month","Day","Hour","Daylight","Radiation","Temperature","kWh","dollar","MeterPerSecond","NorthInitial","SouthInitial","EastInitial","WestInitial","Fixed","Elements","Energy","Unknown","Label","Description","NoDescription","MaximumCharacters","Author","Publisher","Building","ResidentialBuilding","CommercialBuilding","SchoolBuilding","TouristAttraction","UnderConstruction","Photovoltaic","Anonymous","Nickname","Pin","Unpin","shared","NoTexture","FoundationElement","CuboidElement","PolygonElement","SensorElement","SolarPanelElement","WaterHeaterElement","ParabolicDishElement","ParabolicTroughElement","FresnelReflectorElement","HeliostatElement","WindTurbineElement","LightElement","ElementLocked","ModelType","OutputBreakdown","MoreResults","message","ModelNotFound","CannotSignIn","CannotSignOut","YourAccountWasCreated","CannotCreateAccount","YourAccountSettingsWereSaved","CannotSaveYourAccountSettings","CannotSaveYourFileToCloud","CannotCreateNewProject","CannotCreateNewProjectWithoutTitle","CannotOpenYourProjects","CannotOpenProject","CannotDeleteProject","CannotRenameProject","CannotAddDesignToProject","CannotAddDesignToProjectOwnedByOthers","DesignRemovedFromProject","CannotRemoveDesignFromProject","CannotUpdateProject","CannotFetchProjectData","TitleUsedChooseDifferentOne","CloudFileWithTitleExistsDoYouWantToOverwrite","CloudFileNotFound","CannotLoadModelsOnMap","CannotLoadLeaderboard","CannotPublishModelOnMap","CannotLikeModelFromMap","CannotDeleteModelFromMap","ModelDeletedFromMap","DoYouWantToDeleteModelFromMap","CannotOpenCloudFile","CannotReadCloudFile","CannotWriteCloudFile","CloudFileCopied","CannotOpenCloudFolder","CannotDeleteCloudFile","CannotRenameCloudFile","DoYouWantToSaveChanges","NotApplicableToSelectedAction","ThisElementIsLocked","ThisCannotBeUndone","AzimuthOfNorthIsZero","CounterclockwiseAzimuthIsPositive","MoveCancelledBecauseOfOverlap","MoveOutsideBoundaryCancelled","RotationCancelledBecauseOfOverlap","RotationOutsideBoundaryCancelled","ResizingCancelledBecauseOfOverlap","ResizingOutsideBoundaryCancelled","CannotPasteOutsideBoundary","CannotPasteBecauseOfOverlap","CannotMoveObjectTooFar","ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout","DoYouWantToContinue","SolarPanelsCannotIntersectWithGround","SolarPanelsCannotOverlapWithOneAnother","ScreenshotSaved","CsvFileSaved","SimulationStarted","SimulationCompleted","SimulationAborted","SimulationPaused","CancelSimulation","PauseSimulation","ResumeSimulation","SimulationWillNotStartDueToErrors","SimulationWillStartDespiteWarnings","EvolutionStarted","EvolutionCompleted","EvolutionAborted","EvolutionPaused","EncounterEvolutionError","CancelEvolution","PauseEvolution","ResumeEvolution","ConvergenceThresholdHasBeenReached","MaximumNumberOfGenerationsHasBeenReached","MaximumNumberOfStepsHasBeenReached","ObjectiveFunctionTypeError","WallsAreNotAtSameHeight","WallsAreNotPerpendicular","WallsAreNotConnected","WallsNumberNeedToBeFour","BuildingContainsEmptyWall","BuildingRoofMissing","UnknownErrors","menu","AnalysisOptions","option","GridCellSize","SamplingFrequency","TimesPerHour","DaysPerYear","mainMenu","cloudMenu","projectSubMenu","project","CreateNewProject","OpenProject","SaveProjectAs","YouMustLogInToCreateProject","YouMustLogInToOpenProject","fileSubMenu","file","CreateNewFile","OpenLocalFile","SaveAsLocalFile","SavingAbortedMustHaveValidFileName","OpenCloudFile","SaveCloudFile","SaveAsCloudFile","SavingAbortedMustHaveValidTitle","ToSaveYourWorkPleaseSignIn","TakeScreenshot","UseCloudFileName","PublishOnModelsMap","PublishedOnModelsMap","UpdatedOnModelsMap","YouMustLogInToPublishYourModel","YouCannotPublishAModelThatYouDoNotOwn","YouMustSaveModelOnCloudBeforePublishingIt","editSubMenu","edit","Undo","Redo","viewSubMenu","view","NavigationView","TwoDimensionalView","ResetView","ZoomIn","ZoomOut","AutoRotate","ShowShadow","ShowSurfaceShininess","TranslucentFloatingWindows","accessoriesSubMenu","accessories","SiteInformation","DesignInformation","Instruction","StickyNote","Note","settingsSubMenu","settings","WeatherData","DiurnalTemperature","Heliodon","SunAndTime","benchmarksSubMenu","benchmarks","SolarRadiationPredictionVsMeasurement","BESTESTCase600","BESTESTCase610","BESTESTCase620","BESTESTCase630","graph","LineWidth","SymbolSize","BarCategoryGap","ShowHorizontalGridLines","ShowVerticalGridLines","analysisSubMenu","physicsSubMenu","physics","DailySolarRadiationHeatmap","SolarRadiationHeatmapOptions","SolarRadiationHeatmapGridCellSize","SolarRadiationHeatmapMaxValue","SolarRadiationHeatmapNoAnimation","ReflectionHeatmap","sensorSubMenu","sensor","CollectDailyData","CollectYearlyData","SensorSimulationNoAnimation","buildingSubMenu","building","AnalyzeDailyBuildingEnergy","AnalyzeYearlyBuildingEnergy","EnergyAnalysisOptions","EnergyGridCellSize","BuildingEnergySimulationNoAnimation","solarPanelSubMenu","solarPanel","AnalyzeDailyYield","AnalyzeYearlyYield","AnalyzeVisibility","PanelDiscretization","Exact","Approximate","VisibilityGridCellSize","VisibilityAnalysisOptions","SolarPanelSimulationNoAnimation","parabolicTroughSubMenu","parabolicTrough","parabolicDishSubMenu","parabolicDish","fresnelReflectorSubMenu","fresnelReflector","heliostatSubMenu","heliostat","solarUpdraftTowerSubMenu","solarUpdraftTower","SolarUpdraftTowerSimulationNoAnimation","tutorialsSubMenu","solarEnergyScienceSubMenu","solarEnergyScienceTutorials","SunAngles","InsolationAndClimate","SolarRadiationToBox","buildingScienceSubMenu","buildingScienceTutorials","ThermalEnvelopeVsBuildingEnvelope","EffectOfSizeOnBuildingEnergy","EffectOfOrientationOnBuildingEnergy","EffectOfInsulationOnBuildingEnergy","EffectOfRoofColorOnBuildingEnergy","EffectOfEavesOverhangLengthOnBuildingEnergy","EffectOfWindowSHGCOnBuildingEnergy","EffectOfThermostatSetpointOnBuildingEnergy","EffectOfSolarPanelsOnBuildingEnergy","EffectOfGroundTemperatureOnBuildingEnergy","EffectOfTreesOnBuildingEnergy","buildingDesignSubMenu","buildingDesignTutorials","CapeCodStyleHouseWithShedDormer","MansardRoofWithDormers","GableRoofVsHipRoof","ColonialVsSaltbox","GambrelRoofVsMansardRoof","CombinationRoofVsBonnetRoof","DutchGableRoof","GableAndValleyRoof","ClerestoryRoof","MonitorRoof","AFrameHouse","HalfTimberedHouse","AllBasicRoofTypes","photovoltaicSolarPowerSubMenu","photovoltaicSolarPowerTutorials","EffectOfTiltAngleOfSolarPanel","EffectOfAzimuthOfSolarPanel","SolarPanelTypes","VerticalBifacialSolarPanels","CompareMonofacialAndBifacialSolarPanels","SolarTrackers","CoveringGroundWithSolarPanels","InterRowSpacingOfSolarPanelArray","EffectOfOrientationOfSolarPanels","SolarPanelArrayAutomaticLayout","concentratedSolarPowerSubMenu","concentratedSolarPowerTutorials","EffectOfAzimuthOfParabolicTrough","EffectOfLatusRectumOfParabolicTrough","FocusSunlightWithParabolicDish","LinearFresnelReflectors","EffectOfAbsorberPipeHeightForLinearFresnelReflectors","EffectOfAzimuthOfLinearFresnelReflectors","LinearFresnelReflectorsWithTwoAbsorbers","CosineEfficiencyOfHeliostats","ShadowingAndBlockingOfHeliostats","EffectSolarPowerTowerHeight","SolarPowerTower","otherTypesOfSolarPowerSubMenu","otherTypesOfSolarPowerTutorials","SolarUpdraftTower","generativeDesignSubMenu","generativeDesignTutorials","MonofacialSolarPanelArrayTiltAngle","BifacialSolarPanelArrayTiltAngle","OutputOfSolarPanelArrayInDifferentPlaces","SimpleSolarFarmParetoFront","examplesSubMenu","solarEnergySubMenu","solarEnergyExamples","SunBeamAndHeliodon","RooftopSolarPanels","NevadaSolarOneParabolicTroughArray","TooeleParabolicDishArray","PS10SolarPowerTower","TucsonLinearFresnelReflectors","SolarCanopyFormFactors","SolarCanopyOverBleachers","SolarCanopyOverGarage","SolarBusStop","SolarFacadeTesla","BuildingIntegratedPhotovoltaics","Floatovoltaics","Agrivoltaics","VegetativeBuffer","RainbowSwashSolarFarmBostonMA","MickeyMouseSolarFarmOrlandoFL","SolarPanelsOverCanalBakersfieldCA","SolarNoiseBarrierLexingtonMA","HSATSolarTrackersRaleighNC","AADATSolarTrackersLancasterCA","SolarUpdraftTowerInCity","builtEnvironmentSubMenu","residentialBuildingsSubMenu","residentialBuildingExamples","ColonialHouse","DutchColonialHouse","TShapedHouse","CapeCodHouseWithGarage","Solarium","Church1","Cathedral1","Cathedral2","Mosque1","AdobeTaosHouse","RanchHouse","BonnetHouse","BarnStyleHouse","ModernHouse","ButterflyRoofHouse","commercialBuildingsSubMenu","commercialBuildingExamples","WhiteHouse","BilimMersinTurkiye","SpanishStyleHotel","ApartmentBuilding","OfficeBuilding","Hotel","buildingComplexesSubMenu","buildingComplexExamples","SouthBurlingtonHighSchoolVermont","MescaleroApacheSchoolNewMexico","urbanPlanningSubMenu","urbanPlanningExamples","Heatmap1","otherBuildingsSubMenu","otherBuildingExamples","Greenhouse","Pavilion","OctagonalPagoda","OceanFront","EgyptianPyramids","MayanPyramid","SiOSePol","StackedCuboids","artificialIntelligenceSubMenu","artificialIntelligenceExamples","OptimizingTiltAngleOfOneSolarPanelRow","OptimizingTiltAnglesOfMultipleSolarPanelRows","SolarFarmGenerativeDesign","SolarFarmGenerativeDesignWithBlock","FitchburgSolarFarmGenerativeDesign","languageSubMenu","publicSubMenu","ModelsGallery","ModelsMap","AboutUs","avatarMenu","AccountSettings","PrivacyStatementTitle","PrivacyStatement","SignIn","SignOut","IfYouAreAStudent","skyMenu","Axes","Theme","ThemeDefault","ThemeDesert","ThemeDune","ThemeForest","ThemeGrassland","ThemeHill","ThemeLake","ThemeMountain","ThemeRural","SunlightAttenuationCoefficientInAir","ConvectiveCoefficientOfAir","HighestTemperatureTimeInMinutes","SelectSunAnglesToShow","ShowAzimuthAngle","ShowElevationAngle","ShowZenithAngle","DirectLightBrightnessAtNoon","AmbientLightBrightnessAtNoon","groundMenu","MonthlyIrradianceLoss","Vegetation","LeafOutDay","LeafOffDay","Albedo","ImageOnGround","WaterSurface","RemoveAllUnlockedTrees","RemoveAllUnlockedFlowers","RemoveAllUnlockedSolarPanels","RemoveAllUnlockedPeople","RemoveAllUnlockedFoundations","RemoveAllUnlockedCuboids","DoYouReallyWantToRemoveAllPeople","DoYouReallyWantToRemoveAllTrees","DoYouReallyWantToRemoveAllFlowers","DoYouReallyWantToRemoveAllSolarPanels","DoYouReallyWantToRemoveAllFoundations","DoYouReallyWantToRemoveAllCuboids","LockAllElements","UnlockAllElements","labelSubMenu","LabelText","LabelHeight","LabelSize","LabelFontSize","LabelColor","KeepShowingLabel","foundationMenu","RemoveAllUnlockedParabolicTroughs","RemoveAllUnlockedParabolicDishes","RemoveAllUnlockedFresnelReflectors","RemoveAllUnlockedHeliostats","RemoveAllUnlockedSensors","RemoveAllUnlockedLights","RemoveAllUnlockedWalls","RemoveAllUnlockedWindows","RemoveAllUnlockedDoors","RemoveAllUnlockedPolygons","RemoveAllUnlockedHumans","Racks","Texture01","Texture02","Texture03","Texture04","Texture05","Texture06","Texture07","Texture08","Texture09","Texture10","SolarPanels","SolarPanelArray","DoYouReallyWantToRemoveAllSolarPanelsOnFoundation","ParabolicTroughs","DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation","ParabolicDishes","DoYouReallyWantToRemoveAllParabolicDishesOnFoundation","FresnelReflectors","DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation","Heliostats","DoYouReallyWantToRemoveAllHeliostatsOnFoundation","Sensors","DoYouReallyWantToRemoveAllSensorsOnFoundation","Lights","DoYouReallyWantToRemoveAllLightsOnFoundation","Walls","DoYouReallyWantToRemoveAllWallsOnFoundation","Windows","DoYouReallyWantToRemoveAllWindowsOnFoundation","Doors","DoYouReallyWantToRemoveAllDoorsOnFoundation","Polygons","DoYouReallyWantToRemoveAllPolygonsOnFoundation","Humans","DoYouReallyWantToRemoveAllHumansOnFoundation","Trees","DoYouReallyWantToRemoveAllTreesOnFoundation","Flowers","DoYouReallyWantToRemoveAllFlowersOnFoundation","OnlyThisFoundation","AllConnectedFoundations","AllSelectedFoundations","AllFoundations","AddPolygon","SolarStructure","GroupMaster","LockAllElementsOnThisFoundation","UnlockAllElementsOnThisFoundation","GroundFloorRValue","OnlyThisGroundFloor","AllGroundFloors","solarPowerTowerMenu","ReceiverTowerForHeliostats","ReceiverTowerPhysicalProperties","ReceiverTowerHeight","ReceiverTowerRadius","ReceiverAbsorptance","ReceiverOpticalEfficiency","ReceiverThermalEfficiency","solarAbsorberPipeMenu","AbsorberPipeForFresnelReflectors","AbsorberPipePhysicalProperties","AbsorberHeight","AbsorberApertureWidth","AbsorberPipePoleNumber","AbsorberAbsorptance","AbsorberOpticalEfficiency","AbsorberThermalEfficiency","solarUpdraftTowerMenu","SolarUpdraftTowerPhysicalProperties","SolarUpdraftTowerChimneyHeight","SolarUpdraftTowerChimneyRadius","SolarUpdraftTowerCollectorHeight","SolarUpdraftTowerCollectorRadius","SolarUpdraftTowerCollectorTransmissivity","SolarUpdraftTowerCollectorEmissivity","SolarUpdraftTowerDischargeCoefficient","SolarUpdraftTowerTurbineEfficiency","cuboidMenu","DoYouReallyWantToRemoveAllSolarPanelsOnCuboid","DoYouReallyWantToRemoveAllSensorsOnCuboid","DoYouReallyWantToRemoveAllPolygonsOnCuboid","DoYouReallyWantToRemoveAllHumansOnCuboid","DoYouReallyWantToRemoveAllTreesOnCuboid","DoYouReallyWantToRemoveAllFlowersOnCuboid","OnlyThisCuboid","AllCuboidsOnSameSurface","AllCuboidsAboveSameBase","AllSelectedCuboids","AllCuboids","OnlyThisSide","AllSidesOfThisCuboid","AllSidesOfSelectedCuboids","AllSidesOfAllCuboids","Stackable","polygonMenu","TextBox","FontOutlineColor","FontOutlineWidth","FontStrokeColor","FontStrokeWidth","NoOutline","Shiny","Filled","FillTexture","FillColor","Opacity","LineColor","LineStyle","SolidLine","DashedLine","DottedLine","InsertVertexBeforeIndex","InsertVertexAfterIndex","DeleteVertex","OnlyThisPolygon","AllPolygonsOnSurface","AllPolygonsAboveFoundation","AllSelectedPolygons","AllPolygons","Layout","SolarPanelArrayLayout","SolarPanelArrayLayoutParametricDesign","SolarPanelArrayLayoutGenerativeDesign","SolarPanelArrayModel","SolarPanelArrayOrientation","SolarPanelArrayTiltAngle","SolarPanelArrayRowWidth","SolarPanelArrayInterRowSpacing","SolarPanelArrayRowSpacing","SolarPanelArrayRowAxis","SolarPanelArrayLeftRightRowAxis","SolarPanelArrayUpDownRowAxis","SolarPanelArrayEastWestRowAxis","SolarPanelArrayNorthSouthRowAxis","SolarPanelArrayMargin","SolarPanelArrayPoleHeight","SolarPanelArrayPoleSpacing","SolarPanelArrayTotalYearlyCost","SolarPanelArrayTotalYearlyRevenue","SolarPanelArrayTotalYearlyYield","SolarPanelArrayMeanYearlyYield","SolarPanelArrayYearlyProfit","LayoutNotAcceptedCheckYourParameters","optimizationMenu","Optimization","Parameters","Variables","Constants","GeneticAlgorithm","GeneticAlgorithmSettings","ParticleSwarmOptimization","ParticleSwarmOptimizationSettings","SolarPanelTiltAngleOptimization","Generation","Gene","NormalizedVariables","Objective","ObjectiveFunctionDailyTotalYield","ObjectiveFunctionYearlyTotalYield","ObjectiveFunctionDailyMeanYield","ObjectiveFunctionYearlyMeanYield","ObjectiveFunctionDailyProfit","ObjectiveFunctionYearlyProfit","GeneticAlgorithmSelectionMethod","RouletteWheel","Tournament","SearchMethod","GlobalSearchUniformSelection","LocalSearchRandomOptimization","PopulationSize","MaximumGenerations","SelectionRate","CrossoverRate","MutationRate","Step","SwarmSize","MaximumSteps","MaximumVelocity","InertiaWeight","CognitiveCoefficient","SocialCoefficient","ConvergenceThreshold","LocalSearchRadius","RowsPerRackRange","TiltAngleRange","InterRowSpacingRange","ClickTargetPolygonToActivate","ClickTargetFoundationToActivate","treeMenu","ShowModel","Flip","Spread","flowerMenu","peopleMenu","ChangePerson","Observer","ViewFromThisPerson","lightMenu","Intensity","Decay","MaximumDistance","Inside","solarCollectorMenu","RelativeAzimuth","Pole","PoleHeight","PoleRadius","ExtraPoleHeight","ExtraPoleHeightInAdditionToHalfWidth","DrawSunBeam","concentratedSolarPowerCollectorMenu","ReflectorReflectance","ReflectorOpticalEfficiency","solarPanelMenu","InverterEfficiency","InverterEfficiencyExplained","DcToAcSizeRatio","DcToAcSizeRatioExplained","ChangePvModel","Orientation","Portrait","Landscape","FrameColor","Panels","PanelsWide","PanelsLong","TiltAngle","SouthFacingIsPositive","Tracker","SolarTrackerFollowsSun","PoleSpacing","NoTracker","HorizontalSingleAxisTracker","VerticalSingleAxisTracker","AltazimuthDualAxisTracker","OnlyThisSolarPanel","AllSolarPanelsOnSurface","AllSolarPanelsAboveFoundation","AllSelectedSolarPanels","AllSolarPanels","pvModelPanel","SolarPanelSpecs","PanelSize","Cells","CellType","Monocrystalline","Polycrystalline","ThinFilm","Bifacial","BifacialityFactor","Black","Blue","ShadeTolerance","SolarCellEfficiency","NominalOperatingCellTemperature","TemperatureCoefficientOfPmax","parabolicTroughMenu","ModuleLength","Modules","ModulesLong","LatusRectum","OnlyThisParabolicTrough","AllParabolicTroughsAboveFoundation","AllSelectedParabolicTroughs","AllParabolicTroughs","fresnelReflectorMenu","AbsorberPipe","SelectAbsorberToReflectSunlightTo","OnlyThisFresnelReflector","AllFresnelReflectorsAboveFoundation","AllSelectedFresnelReflectors","AllFresnelReflectors","heliostatMenu","Tower","SelectTowerToReflectSunlightTo","OnlyThisHeliostat","AllHeliostatsAboveFoundation","AllSelectedHeliostats","AllHeliostats","parabolicDishMenu","ReceiverStructure","CentralPole","CentralPoleWithTripod","Quadrupod","RimDiameter","ExtraPoleHeightInAdditionToRadius","OnlyThisParabolicDish","AllParabolicDishesAboveFoundation","AllSelectedParabolicDishes","AllParabolicDishes","wallMenu","TextureDefault","SizeOfWall","OnlyThisWall","AllConnectedWalls","AllWallsAboveFoundation","AllSelectedWalls","AllWalls","LockAllWindows","UnlockAllWindows","DoYouReallyWantToRemoveAllWindowsOnThisWall","DoYouReallyWantToRemoveAllDoorsOnThisWall","LockAllSolarPanels","UnlockAllSolarPanels","DoYouReallyWantToRemoveAllSolarPanelsOnThisWall","LockAllSensors","UnlockAllSensors","DoYouReallyWantToRemoveAllSensorsOnThisWall","DoYouReallyWantToRemoveAllLightsOnThisWall","LockAllPolygons","UnlockAllPolygons","WallStructure","DefaultStructure","StudStructure","PillarStructure","StructureSpacing","StructureWidth","StructureThickness","StructureColor","AllLightsOnWallInside","AllLightsOnWallOutside","Fill","Full","Empty","OpenToOutside","EavesLength","Parapet","ParapetColor","ParapetTexture","ParapetHeight","CopingsHeight","CopingsWidth","windowMenu","OnlyThisWindow","AllWindowsOnSurface","AllWindowsAboveFoundation","AllSelectedWindows","AllWindows","Setback","RelativeToWallThickness","Mullion","HorizontalMullion","VerticalMullion","MullionWidth","HorizontalMullionSpacing","VerticalMullionSpacing","MullionColor","Tint","SolarHeatGainCoefficient","Shutter","LeftShutter","RightShutter","BothShutters","ShutterWidth","ShutterColor","Frame","FrameWidth","SillWidth","WindowType","Default","Arched","Polygonal","Interior","roofMenu","OnlyThisRoof","AllRoofsAboveFoundation","AllSelectedRoofs","AllRoofs","OnlyThisCeiling","AllCeilingsAboveFoundation","AllCeilings","EavesOverhangLength","RafterSpacing","RafterWidth","RafterThickness","RafterColor","RoofColor","RoofSideColor","GlassTint","RoofStructure","RafterStructure","GlassStructure","DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof","DoYouReallyWantToRemoveAllWindowsOnThisRoof","DoYouReallyWantToRemoveAllSensorsOnThisRoof","DoYouReallyWantToRemoveAllLightsOnThisRoof","AllLightsOnRoofInside","AllLightsOnRoofOutside","Rise","Ceiling","RoofRValue","CeilingRValue","doorMenu","Texture11","Texture12","Texture13","Texture14","Texture15","Texture16","Texture17","OnlyThisDoor","AllDoorsOnWall","AllDoorsAboveFoundation","AllSelectedDoors","AllDoors","DoorType","siteInfoPanel","Low","designInfoPanel","NumberOfSelectedHeliostats","NumberOfSelectedSolarPanels","ElectricityGeneratedDailyBySolarPanels","SceneDiameter","BuildingArea","visualizationControlPanel","ColorContrast","FluxScale","ClickUpOrDownArrowButtonsToChange","instructionPanel","Rotate","DragMouse","Zoom","MouseWheelOrKeys","MouseWheelOrKeysMac","Pan","HoldCtrlDragMouse","HoldMetaDragMouse","Enter2DMode","Exit2DMode","NavigationMode","EnableNavigation","DisableNavigation","MoveForwardBack","MoveForwardBackInstruction","MoveLeftRight","MoveLeftRightInstruction","MoveUpDown","MoveUpDownInstruction","Turn","TurnInstruction","StartOrStop","mapPanel","WeatherStations","WeatherStationsNote","visibilityPanel","SolarPanelVisibility","VantagePoint","ItemizedVisibilityByFields","TotalVisibility","sensorPanel","LightSensor","WeatherDataFrom","buildingEnergyPanel","DailyBuildingEnergy","YearlyBuildingEnergy","Heater","AC","SolarPanel","Net","solarPanelYieldPanel","SolarPanelDailyYield","SolarPanelYearlyYield","Yield","YieldPerHour","DailyTotal","YearlyTotal","ShowOutputsOfIndividualSolarPanels","Profit","TotalCost","TotalRevenue","TotalYield","MeanYield","ModuleCount","parabolicTroughYieldPanel","ParabolicTroughDailyYield","ParabolicTroughYearlyYield","ShowOutputsOfIndividualParabolicTroughs","parabolicDishYieldPanel","ParabolicDishDailyYield","ParabolicDishYearlyYield","ShowOutputsOfIndividualParabolicDishes","fresnelReflectorYieldPanel","FresnelReflectorDailyYield","FresnelReflectorYearlyYield","ShowOutputsOfIndividualFresnelReflectors","heliostatYieldPanel","HeliostatDailyYield","HeliostatYearlyYield","ShowOutputsOfIndividualHeliostats","updraftTowerYieldPanel","UpdraftTowerDailyYield","UpdraftTowerYearlyYield","ChimneyAirTemperature","ChimneyWindSpeed","ShowOutputsOfIndividualUpdraftTowers","heliodonPanel","SunAndTimeSettings","TwentyFourHours","cloudFilePanel","CopyTitle","TitleCopiedToClipBoard","SearchByTitle","MyLikes","MyCloudFiles","GenerateLink","LinkGeneratedInClipBoard","DoYouReallyWantToDelete","IfSharedOrPublishedRenamingFileBreaksExistingLinks","projectListPanel","MyProjects","GenerateProjectLink","ProjectLinkGeneratedInClipBoard","DoYouReallyWantToDeleteProject","IfSharedOrPublishedRenamingProjectBreaksExistingLinks","projectPanel","ProjectSettings","ThumbnailImageSize","ProjectByOtherPeople","Project","ProjectType","ProjectDescription","MakeDescriptionEditable","MakeDescriptionNonEditable","DoubleClickToMakeDescriptionEditable","CurateCurrentDesign","UpdateSelectedDesign","RemoveSelectedDesign","ClickToFlipSortingOrder","DesignNotShownInSolutionSpaceClickToShow","DesignShownInSolutionSpaceClickToHide","DistributionInSolutionSpace","ChooseSolutionSpace","ChooseDataColoring","SameColorForAllDesigns","OneColorForEachDesign","SolutionSpaceScreenshot","ScatteredPlotScreenshot","SingleClickToSelectDoubleClickToOpen","SingleClickToDeselectDoubleClickToOpen","GenerateScatteredPlot","SelectXAxis","SelectYAxis","accountSettingsPanel","MyAccountSettings","MyID","ClickToCopyMyID","IDInClipBoard","StoreMyNameInMyFilesWhenSaving","DoYouReallyWantToShowYourNameInYourFiles","SignFileDisclaimer","Likes","AllPublished","PublishedUnderAliases","UserCount","SchoolID","ClassID","weatherPanel","SunshineHours","diurnalTemperaturePanel","SelectAirTemperatureModel","Sinusoidal","economicsPanel","EconomicsParameters","ElectricitySellingPrice","OperationalCostPerUnit","SellingPrice","UnitCost","navigationPanel","NavigationParameters","MinimumMoveSpeed","MinimumTurnSpeed","yearlyLightSensorPanel","SkyClearness","ShowDaylightResults","ShowSkyClearnessResults","ShowAverageDailySolarRadiation","analysisManager","NoSensorForCollectingData","NoSolarPanelForAnalysis","NoObserverForVisibilityAnalysis","NoWaterHeaterForAnalysis","NoParabolicDishForAnalysis","NoParabolicTroughForAnalysis","NoFresnelReflectorForAnalysis","NoHeliostatForAnalysis","NoSolarUpdraftTowerForAnalysis","NoBuildingForAnalysis","toolbar","CloudFile","Select","AddFoundation","AddWall","AddWindow","AddDoor","AddPyramidRoof","AddGableRoof","AddHipRoof","AddGambrelRoof","AddMansardRoof","AddCuboid","AddSensor","AddSolarPanel","AddWaterHeater","AddParabolicDish","AddParabolicTrough","AddFresnelReflector","AddHeliostat","AddWindTurbine","AddLight","AddTree","AddFlower","AddPeople","DoubleClickToLockThisModeForNextAction","ClickToUnlockThisModeForNextAction","ManipulateGroup","ClearScene","ShowSunAndTimeSettings","SpatialAnalysisOfEnergy","DoYouReallyWantToClearContent","ClickForMoreButtons","SwitchToAddingFoundation","SwitchToAddingCuboid","SwitchToAddingWall","SwitchToAddingWindow","SwitchToAddingDoor","SwitchToAddingPyramidRoof","SwitchToAddingGableRoof","SwitchToAddingHipRoof","SwitchToAddingGambrelRoof","SwitchToAddingMansardRoof","SwitchToAddingSolarPanel","SwitchToAddingSensor","SwitchToAddingWaterHeater","SwitchToAddingParabolicDish","SwitchToAddingParabolicTrough","SwitchToAddingFresnelReflector","SwitchToAddingHeliostat","SwitchToAddingWindTurbine","SwitchToAddingLight","SwitchToAddingTree","SwitchToAddingFlower","SwitchToAddingPeople","tooltip","gotoIFI","visitAladdinHomePage","clickToOpenMenu","clickToAccessAccountSettings","tree","Apple","Birch","Coconut","Dogwood","Elm","FanPalm","Linden","Magnolia","Maple","Oak","Pine","Spruce","flower","Bellflower","Boxwood","CactusCombo1","CactusCombo2","CactusCombo3","CactusCombo4","Hibiscus","Hosta","Hydrangea","Peony","RedRose","Spirea","Sunflower","TallBush","Tulip","WhiteFlower","YellowFlower","people","Jaah","Jack","Jacob","Jacqueline","Jade","Jamelia","James","Jane","Jaya","Jaye","Jeanette","Jedi","Jeff","Jena","Jennifer","Jess","Jett","Jill","Jiya","Joan","Jocelyn","Joel","Joey","John","Jonathon","Jose","Joseph","Joshua","Judd","Judy","Julia","Julio","Jumapili","June","Juro","Justin","compass","N","S","W","E","month","January","February","March","April","May","July","August","September","October","November","December","modelsMap","SearchByPublisher","SearchByLabel","MyPublishedModels","TotalNumberOfUserPublishedModels","SortFromOldestToNewest","SortFromNewestToOldest","ModelsFoundOnThisSite","ShowModelsPublishedByThisAuthor","zh_cn","zh_tw","SolarTrackersInRealWorld","es","tr","ua","FirebaseName","DataColoring","BuildingCompletionStatus","DesignProblem","ObjectiveFunctionType","EvolutionMethod","ChartType","GraphDataType","DiurnalTemperatureModel","Language","ObjectType","ParabolicDishStructureType","ActionType","MoveHandleType","ResizeHandleType","RotateHandleType","PolygonVertexAction","IntersectionPlaneType","Scope","RowAxis","TrackerType","Discretization","TreeType","FlowerType","Gender","HumanName","PolygonTexture","FoundationTexture","CuboidTexture","WallTexture","DoorTexture","RoofTexture","WallSide","ElementState","RoofHandleType","_changeEvent","type","_startEvent","_endEvent","MyOrbitControls","object","domElement","undefined","console","warn","document","error","style","touchAction","enabled","target","Vector3","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","Math","PI","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","panSpeed","screenSpacePanning","keyPanSpeed","autoRotate","autoRotateSpeed","moveSpeed","turnSpeed","keys","MOVE_LEFT","MOVE_RIGHT","MOVE_FORWARD","MOVE_BACKWARD","MOVE_UP","MOVE_DOWN","ROTATE_LEFT","ROTATE_UP","ROTATE_RIGHT","ROTATE_DOWN","mouseButtons","LEFT","MOUSE","ROTATE","MIDDLE","DOLLY","RIGHT","PAN","touches","ONE","TOUCH","TWO","DOLLY_PAN","target0","clone","position0","position","zoom0","zoom","_domElementKeyEvents","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","getDistance","this","distanceTo","listenToKeyEvents","addEventListener","onKeyDown","reverse","oldZ","removeKeyEvents","scope","removeEventListener","saveState","copy","reset","updateProjectionMatrix","dispatchEvent","update","state","STATE","NONE","offset","quat","Quaternion","setFromUnitVectors","up","quatInverse","invert","lastPosition","lastQuaternion","twoPI","sub","applyQuaternion","setFromVector3","rotateLeft","sphericalDelta","min","max","isFinite","makeSafe","radius","scale","addScaledVector","panOffset","add","setFromSpherical","lookAt","multiplyScalar","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","onContextMenu","onPointerDown","onPointerCancel","onMouseWheel","onPointerMove","onPointerUp","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","TOUCH_DOLLY_ROTATE","Spherical","rotateStart","Vector2","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","pointers","pointerPositions","getZoomScale","pow","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","panUp","crossVectors","pan","deltaX","deltaY","element","isPerspectiveCamera","targetDistance","length","tan","fov","clientHeight","matrix","isOrthographicCamera","right","left","clientWidth","top","bottom","moveUp","_vector","camera","z","moveForward","moveRight","spinUp","_euler","Euler","setFromQuaternion","abs","x","setFromEuler","spinRight","dollyOut","dollyScale","dollyIn","handleMouseDownRotate","event","clientX","clientY","handleMouseDownPan","handleTouchStartRotate","pageX","pageY","y","handleTouchStartPan","handleTouchStartDolly","dx","dy","sqrt","handleTouchMoveRotate","getSecondPointerPosition","subVectors","handleTouchMovePan","handleTouchMoveDolly","setPointerCapture","pointerId","push","addPointer","pointerType","trackPointer","DOLLY_ROTATE","onTouchStart","mouseAction","button","handleMouseDownDolly","ctrlKey","metaKey","onMouseDown","handleTouchMoveDollyPan","handleTouchMoveDollyRotate","onTouchMove","handleMouseMoveRotate","handleMouseMoveDolly","handleMouseMovePan","onMouseMove","removePointer","releasePointerCapture","preventDefault","handleMouseWheel","code","handleKeyDown","i","splice","pointer","passive","EventDispatcher","ParabolicCylinderGeometry","semiLatusRectum","width","widthSegments","lengthSegments","parameters","semilatusRectum","height","floor","indices","vertices","normals","uvs","index","indexArray","halfHeight","groupStart","generateTorso","normal","vertex","groupCount","du","indexRow","u","t","normalize","a","b","c","d","addGroup","setIndex","setAttribute","Float32BufferAttribute","data","BufferGeometry","ParaboloidGeometry","rimRadius","radialSegments","depthSegments","cos","sin","grid","tangent1","tangent2","TWO_PI","maxY","iy","verticesRow","ix","ConvexGeometry","points","euler","faces","ConvexHull","setFromPoints","face","edge","point","head","p","applyEuler","l2","next","THREE","extend","TextSprite","WallFill","VERSION","HOME_URL","DEFAULT_ADDRESS","PRESET_COLORS","Z_INDEX_FRONT_PANEL","UNDO_SHOW_INFO_DURATION","FLOATING_WINDOW_OPACITY","SOLAR_HEATMAP_COLORS","DEFAULT_HEAT_FLUX_SCALE_FACTOR","DEFAULT_HEAT_FLUX_COLOR","DEFAULT_HEAT_FLUX_WIDTH","DEFAULT_SOLAR_PANEL_SHININESS","DEFAULT_WINDOW_SHININESS","SOLAR_PANEL_BLUE_SPECULAR","SOLAR_PANEL_BLACK_SPECULAR","MONTHS","DEFAULT_LEAF_OUT_DAY","DEFAULT_LEAF_OFF_DAY","DEFAULT_FAR","MOVE_HANDLE_RADIUS","RESIZE_HANDLE_SIZE","MOVE_HANDLE_COLOR_1","MOVE_HANDLE_COLOR_2","RESIZE_HANDLE_COLOR","HIGHLIGHT_HANDLE_COLOR","LOCKED_ELEMENT_SELECTION_COLOR","FINE_GRID_SCALE","NORMAL_GRID_SCALE","GRID_RATIO","INVALID_ELEMENT_COLOR","GROUND_ID","HALF_PI","ZERO_TOLERANCE","UNIT_VECTOR_POS_Z_ARRAY","UNIT_VECTOR_NEG_Y_ARRAY","UNIT_VECTOR_POS_X","UNIT_VECTOR_NEG_X","UNIT_VECTOR_POS_Y","UNIT_VECTOR_NEG_Y","UNIT_VECTOR_POS_Z","ORIGIN_VECTOR2","HALF_PI_Z_EULER","REGEX_ALLOWABLE_IN_NAME","RoofType","Rectangle","useRefStore","create","get","setEnableOrbitController","useStore","getState","viewState","navigationView","orbitControlsRef","current","selectNone","humanRef","treeRef","foundationRef","contentRef","compassRef","flowerRef","cuboidRef","listenToAutoDeletionByCutRef","listenToAutoDeletionByDeleteRef","setListenToAutoDeletionByCut","setListenToAutoDeletionByDelete","HumanData","Male","Female","lang","textureImg","JaahImage","JacobImage","JacquelineImage","JadeImage","JameliaImage","JamesImage","JaneImage","JayaImage","JayeImage","JeanetteImage","JediImage","JeffImage","JenaImage","JenniferImage","JessImage","JettImage","JillImage","JiyaImage","JoanImage","JocelynImage","JoelImage","JoeyImage","JohnImage","JonathonImage","JoseImage","JosephImage","JoshuaImage","JuddImage","JudyImage","JuliaImage","JulioImage","JumapiliImage","JuneImage","JuroImage","JustinImage","JackImage","FlowerData","noLeaves","NoLeafShrubImage","BoxwoodImage","TallBushImage","CactusCombo1Image","CactusCombo2Image","CactusCombo3Image","CactusCombo4Image","BellflowerImage","HibiscusImage","HydrangeaImage","HostaImage","PeonyImage","RedRoseImage","SpireaImage","SunflowerImage","TulipImage","YellowFlowerImage","WhiteFlowerImage","ElementModelFactory","parentId","Human","cx","cy","cz","lx","fetchWidth","lz","fetchHeight","rotation","id","short","generate","spread","Tree","parent","pvModel","orientation","poleHeight","poleSpacing","tiltAngle","relativeAzimuth","frameColor","ly","parentType","foundationId","Foundation","Cuboid","Wall","Roof","pvModelName","trackerType","NO_TRACKER","landscape","drawSunBeam","poleRadius","thickness","showLabel","toArray","color","Flower","fetchSpread","faceColors","faceTextures","textureTypes","stackable","actionState","cuboidStackable","selected","texture","textureType","solarAbsorberPipe","solarPowerTower","hvacSystem","thermostatSetpoint","reflectance","absorptance","opticalEfficiency","thermalEfficiency","latusRectum","moduleLength","ParabolicTrough","absorberTubeRadius","receiverStructure","ParabolicDish","structureType","receiverRadius","receiverPoleRadius","receiverId","FresnelReflector","towerId","Heliostat","WindTurbine","bladeRadius","towerRadius","towerHeight","hx","hy","rx","ry","Util","isUnitVectorX","isUnitVectorY","Polygon","filled","selectedIndex","wallThickness","wallHeight","parapet","wallParapet","eavesLength","wallEavesLength","rValue","wallRValue","fill","leftUnfilledHeight","rightUnfilledHeight","leftTopPartialHeight","rightTopPartialHeight","relativeAngle","leftPoint","rightPoint","leftJoints","rightJoints","wallTexture","wallColor","volumetricHeatCapacity","wallVolumetricHeatCapacity","wallStructure","studSpacing","wallStructureSpacing","studWidth","wallStructureWidth","studColor","wallStructureColor","opacity","wallOpacity","lineWidth","lineColor","windows","Sensor","decay","intensity","Light","Window","leftShutter","windowShutterLeft","rightShutter","windowShutterRight","shutterColor","windowShutterColor","shutterWidth","windowShutterWidth","horizontalMullion","windowHorizontalMullion","verticalMullion","windowVerticalMullion","mullionWidth","windowMullionWidth","horizontalMullionSpacing","windowHorizontalMullionSpacing","verticalMullionSpacing","windowVerticalMullionSpacing","mullionColor","windowMullionColor","frame","windowFrame","frameWidth","windowFrameWidth","sillWidth","RoofUtil","isTypeRoof","windowSillWidth","windowType","empty","windowEmpty","interior","windowInterior","archHeight","windowArchHeight","windowColor","tint","windowTint","windowOpacity","uValue","windowUValue","Door","doorType","doorFilled","doorInterior","doorArchHeight","doorTexture","doorColor","doorUValue","wallsId","ceiling","roofCeiling","rise","roofRise","roofThickness","roofRValue","roofColor","sideColor","roofSideColor","roofTexture","roofType","Pyramid","roofStructure","Gable","ridgeLeftPoint","ridgeRightPoint","ridgeLength","Hip","leftRidgeLength","rightRidgeLength","Gambrel","topRidgePoint","frontRidgePoint","backRidgePoint","Mansard","ridgeWidth","solarPanelArrayLayoutParams","rowAxis","rowWidth","rowsPerRack","interRowSpacing","margin","shadowEnabled","solarPanelShininess","windowShininess","heatFluxScaleFactor","heatFluxColor","heatFluxWidth","solarRadiationHeatmapMaxValue","solarRadiationHeatMapMaxValue","solarRadiationHeatmapReflectionOnly","solarRadiationHeatMapReflectionOnly","axes","ambientLightIntensity","directLightIntensity","theme","showAzimuthAngle","showElevationAngle","showZenithAngle","groundImage","groundImageType","groundColor","waterSurface","orthographic","cameraPosition","cameraPosition2D","panCenter","panCenter2D","cameraZoom","heliodon","showSunAngles","mapZoom","mapTilt","mapType","showSiteInfoPanel","showDesignInfoPanel","showInstructionPanel","showHeliodonPanel","heliodonPanelX","heliodonPanelY","showMapPanel","mapPanelX","mapPanelY","showWeatherPanel","weatherPanelRect","showDiurnalTemperaturePanel","diurnalTemperaturePanelRect","showStickyNotePanel","stickyNotePanelRect","showDailyBuildingEnergyPanel","dailyBuildingEnergyPanelRect","showYearlyBuildingEnergyPanel","yearlyBuildingEnergyPanelRect","showDailyLightSensorPanel","dailyLightSensorPanelRect","showYearlyLightSensorPanel","yearlyLightSensorPanelRect","yearlyLightSensorPanelShowDaylight","yearlyLightSensorPanelShowClearness","showDailyPvYieldPanel","dailyPvYieldPanelRect","showYearlyPvYieldPanel","yearlyPvYieldPanelRect","showVisibilityResultsPanel","showSolarPanelVisibilityResultsPanel","visibilityResultsPanelRect","showDailyParabolicTroughYieldPanel","dailyParabolicTroughYieldPanelRect","showYearlyParabolicTroughYieldPanel","yearlyParabolicTroughYieldPanelRect","showDailyParabolicDishYieldPanel","dailyParabolicDishYieldPanelRect","showYearlyParabolicDishYieldPanel","yearlyParabolicDishYieldPanelRect","showDailyFresnelReflectorYieldPanel","dailyFresnelReflectorYieldPanelRect","showYearlyFresnelReflectorYieldPanel","yearlyFresnelReflectorYieldPanelRect","showDailyHeliostatYieldPanel","dailyHeliostatYieldPanelRect","showYearlyHeliostatYieldPanel","yearlyHeliostatYieldPanelRect","showDailyUpdraftTowerYieldPanel","dailyUpdraftTowerYieldPanelRect","showYearlyUpdraftTowerYieldPanel","yearlyUpdraftTowerYieldPanelRect","showEvolutionPanel","evolutionPanelRect","latitude","world","longitude","date","leafDayOfYear1","leafDayOfYear2","ground","address","countryCode","airAttenuationCoefficient","airConvectiveCoefficient","timesPerHour","daysPerYear","monthlyIrradianceLosses","discretization","diurnalTemperatureModel","highestTemperatureTimeInMinutes","solarRadiationHeatmapGridCellSize","pvGridCellSize","solarPanelVisibilityGridCellSize","cspTimesPerHour","cspDaysPerYear","cspGridCellSize","sutTimesPerHour","sutDaysPerYear","sutGridCellSize","noAnimationForHeatmapSimulation","noAnimationForThermalSimulation","noAnimationForSensorDataCollection","noAnimationForSolarPanelSimulation","noAnimationForSolarUpdraftTowerSimulation","user","userCount","showEconomicsPanel","showNavigationPanel","minimumNavigationMoveSpeed","minimumNavigationTurnSpeed","navigationMoveSpeed","navigationTurnSpeed","getHeatmap","setHeatmap","clearHeatmaps","flagOfDailySimulation","hourlyHeatExchangeArrayMap","setHourlyHeatExchangeArray","hourlySolarHeatGainArrayMap","setHourlySolarHeatGainArray","hourlySolarPanelOutputArrayMap","setHourlySolarPanelOutputArray","getRoofSegmentVertices","getRoofSegmentVerticesWithoutOverhang","changed","setChanged","setSkipChange","applyCount","setApplyCount","revertApply","elements","notes","pvModules","loadPvModules","getPvModule","floatingWindowOpacity","selectedFloatingWindow","language","locale","loggable","actionInfo","currentUndoable","openModelsMap","modelsMapLatitude","modelsMapLongitude","modelsMapZoom","modelsMapTilt","modelsMapType","modelsMapWeatherStations","showCloudFileTitleDialog","showCloudFileTitleDialogFlag","cloudFile","latestModelSite","modelSites","peopleModels","saveCloudFileFlag","createProjectFlag","saveProjectFlag","curateDesignToProjectFlag","showProjectsFlag","updateProjectsFlag","modelsMapFlag","leaderboardFlag","showLeaderboard","publishOnModelsMapFlag","listCloudFilesFlag","localContentToImportAfterCloudFileUpdate","localFileName","createNewFileFlag","openLocalFileFlag","saveLocalFileDialogVisible","fileChanged","undoManager","addUndoable","importContent","exportContent","clearContent","createEmptyFile","aabb","animateSun","animate24Hours","runDailyThermalSimulation","pauseDailyThermalSimulation","runYearlyThermalSimulation","pauseYearlyThermalSimulation","clearDailySimulationResultsFlag","clearYearlySimulationResultsFlag","runDynamicSimulation","runStaticSimulation","pauseSimulation","runEvolution","pauseEvolution","objectiveEvaluationIndex","evolutionMethod","updateSceneRadiusFlag","updateSceneRadius","sceneRadius","cameraDirection","getCameraDirection","getElementById","getFoundation","getParent","getChildren","getChildrenOfType","selectedElement","selectedElementIdSet","getSelectedElement","overlapWithSibling","selectedSideIndex","setElementPosition","setElementSize","setElementNormal","updateAllElementLocks","updateElementLockByFoundationId","updateElementLockByParentId","updateElementLockById","updateElementReferenceById","updateElementLabelById","updateElementShowLabelById","updateElementCxById","updateElementCyById","updateElementCzById","updateElementCzForAll","updateElementLxById","updateElementLxAboveFoundation","updateElementLxForAll","updateElementLyById","updateElementLyAboveFoundation","updateElementLyForAll","updateElementLzById","updateElementLzForAll","updateElementColorById","updateElementColorOnSurface","updateElementColorAboveFoundation","updateElementColorForAll","updateElementLineColorById","updateElementLineColorOnSurface","updateElementLineColorAboveFoundation","updateElementLineColorForAll","updateElementLineWidthById","updateElementLineWidthOnSurface","updateElementLineWidthAboveFoundation","updateElementLineWidthForAll","updateElementRotationById","updateElementRotationForAll","foundationActionScope","setFoundationActionScope","polygonActionScope","setPolygonActionScope","updatePolygonVertexPositionById","updatePolygonVerticesById","cuboidActionScope","setCuboidActionScope","solarPanelActionScope","setSolarPanelActionScope","updateSolarCollectorDailyYieldById","updateSolarCollectorYearlyYieldById","updateSolarPanelTiltAngleById","updateSolarCollectorDrawSunBeamById","updateSolarCollectorDrawSunBeamAboveFoundation","updateSolarCollectorDrawSunBeamForAll","updateSolarCollectorRelativeAzimuthById","updateSolarCollectorRelativeAzimuthOnSurface","updateSolarCollectorRelativeAzimuthAboveFoundation","updateSolarCollectorRelativeAzimuthForAll","updateSolarCollectorPoleHeightById","updateSolarCollectorPoleHeightOnSurface","updateSolarCollectorPoleHeightAboveFoundation","updateSolarCollectorPoleHeightForAll","updateSolarCollectorPoleRadiusById","updateSolarCollectorPoleRadiusAboveFoundation","updateSolarCollectorPoleRadiusForAll","updateCspReflectanceById","updateCspReflectanceAboveFoundation","updateCspReflectanceForAll","updateParabolicCollectorAbsorptanceById","updateParabolicCollectorAbsorptanceAboveFoundation","updateParabolicCollectorAbsorptanceForAll","updateParabolicCollectorOpticalEfficiencyById","updateParabolicCollectorOpticalEfficiencyAboveFoundation","updateParabolicCollectorOpticalEfficiencyForAll","updateParabolicCollectorThermalEfficiencyById","updateParabolicCollectorThermalEfficiencyAboveFoundation","updateParabolicCollectorThermalEfficiencyForAll","parabolicTroughActionScope","setParabolicTroughActionScope","fresnelReflectorActionScope","setFresnelReflectorActionScope","heliostatActionScope","setHeliostatActionScope","updateSolarReceiverById","updateSolarReceiverAboveFoundation","updateSolarReceiverForAll","parabolicDishActionScope","setParabolicDishActionScope","updateParabolaLatusRectumById","updateParabolaLatusRectumAboveFoundation","updateParabolaLatusRectumForAll","updateModuleLengthById","updateModuleLengthAboveFoundation","updateModuleLengthForAll","updateInsideLightById","updateInsideLightsByParentId","copyElementById","removeElementById","removeElementsByType","clearDeletedElements","countElementsByReferenceId","removeElementsByReferenceId","removeAllChildElementsByType","removeAllElementsOnFoundationByType","pasteElementsToPoint","pasteElementsByKey","elementsToPaste","selectMe","addElement","objectTypeToAdd","actionModeLock","countElementsByType","countSolarStructuresByType","countObservers","countAllOffspringsByTypeAtOnce","countSolarPanelsOnRack","selectedElementAngle","waiting","simulationInProgress","simulationPaused","evolutionInProgress","evolutionPaused","contextMenuObjectType","enableFineGrid","setEnableFineGrid","showCloudFilePanel","projectInfo","projectView","showProjectListPanel","showModelsGallery","showAccountSettingsPanel","showLikesPanel","showPublishedModelsPanel","weatherData","loadWeatherData","getWeather","loadHorizontalSolarRadiationData","getHorizontalSolarRadiation","loadVerticalSolarRadiationData","getVerticalSolarRadiation","getClosestCity","sunlightDirection","setSunlightDirection","showSolarRadiationHeatmap","showHeatFluxes","runSolarPanelVisibilityAnalysis","solarPanelVisibilityResults","runDailySimulationForSolarPanels","runDailySimulationForSolarPanelsLastStep","runYearlySimulationForSolarPanels","runYearlySimulationForSolarPanelsLastStep","pauseDailySimulationForSolarPanels","pauseYearlySimulationForSolarPanels","dailyPvYield","dailyPvIndividualOutputs","graphState","setDailyPvYield","yearlyPvYield","yearlyPvIndividualOutputs","setYearlyPvYield","solarPanelLabels","setSolarPanelLabels","setTotalBuildingHeater","setTotalBuildingAc","setTotalBuildingSolarPanel","runDailySimulationForParabolicTroughs","runYearlySimulationForParabolicTroughs","pauseDailySimulationForParabolicTroughs","pauseYearlySimulationForParabolicTroughs","dailyParabolicTroughYield","dailyParabolicTroughIndividualOutputs","setDailyParabolicTroughYield","yearlyParabolicTroughYield","yearlyParabolicTroughIndividualOutputs","setYearlyParabolicTroughYield","parabolicTroughLabels","setParabolicTroughLabels","runDailySimulationForFresnelReflectors","runYearlySimulationForFresnelReflectors","pauseDailySimulationForFresnelReflectors","pauseYearlySimulationForFresnelReflectors","dailyFresnelReflectorYield","dailyFresnelReflectorIndividualOutputs","setDailyFresnelReflectorYield","yearlyFresnelReflectorYield","yearlyFresnelReflectorIndividualOutputs","setYearlyFresnelReflectorYield","fresnelReflectorLabels","setFresnelReflectorLabels","runDailySimulationForHeliostats","runYearlySimulationForHeliostats","pauseDailySimulationForHeliostats","pauseYearlySimulationForHeliostats","dailyHeliostatYield","dailyHeliostatIndividualOutputs","setDailyHeliostatYield","yearlyHeliostatYield","yearlyHeliostatIndividualOutputs","setYearlyHeliostatYield","heliostatLabels","setHeliostatLabels","runDailySimulationForUpdraftTower","runYearlySimulationForUpdraftTower","pauseDailySimulationForUpdraftTower","pauseYearlySimulationForUpdraftTower","dailyUpdraftTowerResults","dailyUpdraftTowerYield","dailyUpdraftTowerIndividualOutputs","setDailyUpdraftTowerResults","setDailyUpdraftTowerYield","yearlyUpdraftTowerYield","yearlyUpdraftTowerIndividualOutputs","setYearlyUpdraftTowerYield","updraftTowerLabels","setUpdraftTowerLabels","runDailySimulationForParabolicDishes","runYearlySimulationForParabolicDishes","pauseDailySimulationForParabolicDishes","pauseYearlySimulationForParabolicDishes","dailyParabolicDishYield","dailyParabolicDishIndividualOutputs","setDailyParabolicDishYield","yearlyParabolicDishYield","yearlyParabolicDishIndividualOutputs","setYearlyParabolicDishYield","parabolicDishLabels","setParabolicDishLabels","runDailyLightSensor","pauseDailyLightSensor","runYearlyLightSensor","pauseYearlyLightSensor","dailyLightSensorData","setDailyLightSensorData","yearlyLightSensorData","setYearlyLightSensorData","sensorLabels","setSensorLabels","hoveredHandle","moveHandleType","resizeHandleType","getResizeHandlePosition","rotateHandleType","resizeAnchor","isAddingElement","addedFoundationId","deletedFoundationId","addedCuboidId","deletedCuboidId","addedWallId","deletedWallId","deletedRoofId","deletedRoofIdSet","autoDeletedRoofIdSet","autoDeletedRoofs","autoDeletedChild","groupActionMode","groupActionUpdateFlag","addedWindowId","addedDoorId","updateWallMapOnFoundationFlag","wallActionScope","roofActionScope","windowActionScope","doorActionScope","setRoofActionScope","updateWallLeftJointsById","updateWallRightJointsById","updateWallLeftPointById","updateRoofStructureById","economicsParams","fittestIndividualResults","setFittestIndividualResults","variableLabels","setVariableLabels","evolutionaryAlgorithmState","solarPanelArrayLayoutConstraints","geneticAlgorithmWizardSelectedTab","particleSwarmOptimizationWizardSelectedTab","setPrimitiveStore","ElementGrid","React","memo","hz","Selector","maxSize","useState","step","setStep","setLineWidth","useEffect","pointsX","useMemo","pointsY","map","value","Line","userData","unintersectable","WindowResizeHandle","handleType","setCommonStore","handleRef","useRef","setColor","ref","args","onPointerEnter","onPointerLeave","attach","WindowMoveHandle","Mid","usePrimitiveStore","key","val","skipChange","setSaveCloudFileFlag","projectImagesUpdateFlag","projectType","SOLAR_PANEL_ARRAY","projectTitle","projectDescription","duringCameraInteraction","elementBeingCanceledId","showWallIntersectionPlaneId","oldParentId","oldFoundationId","selectedElementId","foundationMovedFlag","updateFoundationMovedFlag","isCameraUnderGround","useDataStore","roofSegmentVerticesMap","Map","setRoofSegmentVertices","deleteRoofSegmentVertices","delete","roofSegmentVerticesWithoutOverhangMap","setRoofSegmentVerticesWithoutOverhang","deleteRoofSegmentVerticesWithoutOverhang","labels","setState","sumDailyPvYield","sum","datum","prop","hasOwnProperty","getDailyPvProfit","dailyYield","solarPanelNumber","countAllSolarPanels","electricitySellingPrice","operationalCostPerUnit","sumYearlyPvYield","getYearlyPvProfit","setSolarPanelVisibilityResult","vantage","result","clearSolarPanelVisibilityResults","sumDailyParabolicDishYield","sumYearlyParabolicDishYield","sumDailyParabolicTroughYield","sumYearlyParabolicTroughYield","sumDailyFresnelReflectorYield","sumYearlyFresnelReflectorYield","sumDailyHeliostatYield","sumYearlyHeliostatYield","sumDailyUpdraftTowerYield","sumYearlyUpdraftTowerYield","heatmaps","totalBuildingHeater","heater","totalBuildingAc","ac","totalBuildingSolarPanel","clear","clearDataStore","clearRoofVerticesMap","sealPlanesMaterial","MeshStandardMaterial","side","FrontSide","dimension","mullionData","ah","mullionRadius","radialMullionAngle","atan2","radialMullionLength","r","aSquare","bSquare","cSquare","material","drawArchMullionPath","h","startAngle","acos","endAngle","EllipseCurve","getPoints","v2","CatmullRomCurve3","verticalMullions","arr","dividers","round","num","horizontalMullions","totalDist","number","ceil","curr","archMullions","shape","Shape","moveTo","quadraticCurveTo","idx","path","renderRadialMullion","receiveShadow","castShadow","item","extrudePath","steps","bevelEnabled","frameData","halfWidth","depth","sillLength","sillThickness","archedFrameShape","x1","x2","h1","r1","startAngle1","endAngle1","y1","h2","r2","startAngle2","endAngle2","y2","points1","points2","ArchedWireframe","wireframeData","drawBottom","locked","thinLine","boldLine","drawArchedPath","highLightMaterial","renderLines","mat","ArchedWindow","glassMaterial","area","foundation","heatFluxArrowHead","heatFluxArrowEuler","pointWithinArch","dz","heatFluxes","notBuilding","heat","reduce","cellSize","nx","nz","getEuler","sign","vectors","kx","kz","rz","widthShutter","heightShutter","shutterPosX","shutterPosZ","glassShape","getArchedWindowShape","renderSealPlane","showFrame","showLeft","showRight","spacing","Fragment","s","lineTo","cX","cY","absarc","closePath","DoubleSide","polygonTop","topX","topH","innerPoints","botRight","topRight","topLeft","botLeft","outerPoints","p1","p2","n","edgesAfterOffset","start","end","edge1","edge2","getIntersectionPoint","PolygonalWindow","absTopX","topRightLength","hypot","topRightRotation","asin","topLeftLength","topLeftRotation","pointWithinPolygon","shiftZ","isPointInside","bz","shutterLength","getPolygonWindowShape","wireframeMaterial","wireframeWidth","wireframeCy","renderWireframeLine","tx","th","RoofSegment","foundationModel","segment","centroid","heatmap","useTransparent","transparent","heatFluxArrowLength","overhangLines","segments","lines","thicknessVector","seg","entries","wallLeft","projectedVertices","s0","s1","s2","v10","v20","v21","length10","m","dm","dn","v0","origin","getTriangleArea","segmentsWithoutOverhang","filter","e","w","wcy","onSegment","getWindowArea","isRoof","dmp","q","ox","oy","getRelativeWindowVerticesOnRoof","BufferRoofSegment","dashed","dashSize","gapSize","topLayerTexture","isTri","isQuad","holeMeshes","fromArray","DEFAULT_POLYGONTOP","holeMesh","Mesh","ExtrudeBufferGeometry","updateMatrix","BoxBufferGeometry","materialGroupNumber","render","materialArray","Array","geometry","clearGroups","positions","vertexIndex","materialIndex","topLayerPoints","slice","addPositions","addHeatmapUVs","ab","lab","ub","vb","uc","vc","cross","addUVs","buildSideSurface","Error","triangulate","triTopLower","triTopUpper","ta","tb","tc","td","isLowerLeft","equals","ad","ud","vd","triBotLower","triBotUpper","computeVertexNormals","computeBoundingSphere","operationBuffer","CSG","subtract","resultMesh","pop","groups","mid","v30","verticesNumber","surfacePointIndices","tri1","acc","concat","tri2","dDis","distanceFromPointToLine2D","cDis","lower","upper","HeatMapMaterial","attachArray","TopLayerMaterial","SideSurfaceMaterial","enableShadow","uuid","simulation","frustumCulled","_","useSelected","has","useLanguage","lng","intersectionPlanePosition","intersectionPlaneRotation","zeroVector","zVector3","PyramidRoofWireframe","roofSegments","peripheryPoints","periphery","isFlat","PyramidRoof","roofModel","useRoofTexture","getWireframetStyle","useThree","gl","ray","Raycaster","mouse","showIntersectionPlane","setShowIntersectionPlane","intersectionPlaneRef","isPointerDownRef","oldRiseRef","prevWallsIdSet","Set","useMultiCurrWallArray","currentWallArray","isLoopRef","useRoofHeight","highestWallHeight","topZ","useUpdateOldRoofFiles","centerPoint","wallArray","getWallPoint","calculatePolygonCentroid","Number","isNaN","centerPointV3","overhangs","res","wall","getWallNormal","wallPointsAfterOffset","overhangHeight","dLeft","overhangHeightLeft","dRight","overhangHeightRight","getOverhangHeight","getWallHeight","lh","rh","wallLeftPointAfterOverhang","setZ","wallRightPointAfterOverhang","leftPointAfterOverhang","rightPointAfterOverhang","addVectors","divideScalar","ceilingPoints","isFirstRender","useIsFirstRender","addedRoofIdSet","wallsIdSet","size","needUpdateWallsId","newWallsIdArray","newWallsIdSet","roofId","leftRoofHeight","rightRoofHeight","deleteAddedRoofId","useUpdateRooftopElements","checkIsFlatRoof","isFlatRoof","setIsFlatRoof","heatmapTextures","setHeatmapTextures","flatHeatmapTexture","setFlatHeatmapTexture","updateSegmentVertices","useUpdateSegmentVerticesMap","fetchHeatmapTexture","segmentVertices","minX","MAX_VALUE","minY","maxX","vcx","vcy","wrapT","wrapS","RepeatWrapping","center","repeat","textures","useUpdateSegmentVerticesWithoutOverhangMap","wallLeftPoint","wallRightPoint","firstWall","lastWall","shallow","useUserData","topLayerColor","handlePointerDown","handlePointerMove","handlePointerUp","handleContextMenu","Top","selectedElementHeight","onPointerOver","selectedElementX","selectedElementY","visible","offsetX","offsetY","setFromCamera","setRayCast","intersects","intersectObjects","newRise","updateRoofRiseById","addUndoableResizeRoofRise","areRoofsEqual","getWallShapePoints","wallHeights","centerLeft","centerRight","crX","crY","clX","clY","isRoofValid","wallHeightsMap","wallShapePoints","child","px","pz","isElementInsideWall","GambrelRoofWireframe","frontSideSegmentPoints","frontTopSegmentPoints","backTopSegmentPoints","backSideSegmentPoints","ridges","zeroVector2","GambrelRoof","topRidgeLeftPoint","frontRidgeLeftPoint","backRidgeLeftPoint","Null","roofHandleType","setRoofHandleType","enableIntersectionPlane","setEnableIntersectionPlane","oldRidgeVal","updateRidge","elemId","gr","FrontLeft","FrontRight","TopLeft","TopRight","BackLeft","BackRight","handleUndoableResizeRidge","oldVal","newVal","undoable","timestamp","now","resizedElementId","resizedElementType","undo","redo","setInterSectionPlane","handlePointV3","getRelPos","foundationCenter","wallCenter","getComposedWallCenter","wallLength","getComposedWallLength","wallAbsCenter","rotateAround","wallAbsAngle","getRidgePoint","currWall","ph","sideWall","isThisIdAndType","getYOnEdge","edges","k","setSideWallHeightsMap","composedWalls","isLeftSide","roofEdges","leftBaseHeight","rightBaseHeight","midPoint","composedWall","halfLength","getX","getY","baseHeight","startPoint","endPoint","getEdgeLine","getRoofSideEdges","roofPointsX","wallPointsX","currId","find","wallStartX","wallEndX","wallStartY","wallEndY","wallCenterX","roofPointX","getSideWallHeightsMap","useComposedWallArray","useComposedRoofHeight","topRidgeLeftPointV3","topRidgeRightPointV3","topRidgeMidPointV3","frontRidgeLeftPointV3","frontRidgeRightPointV3","backRidgeLeftPointV3","backRidgeRightPointV3","getComposedWallNormal","frontWall","backWall","frontOverhang","rightOverhang","backOverhang","leftOverhang","wallPoint0","wallPoint1","wallPoint2","wallPoint3","frontWallLeftPointAfterOffset","frontWallRightPointAfterOffset","leftWallLeftPointAfterOffset","leftWallRightPointAfterOffset","rightWallLeftPointAfterOffset","rightWallRightPointAfterOffset","backWallLeftPointAfterOffset","backWallRightPointAfterOffset","frontSidePoints","frontWallLh","frontWallRh","d0","overhangHeight0","d1","overhangHeight1","frontWallLeftPointAfterOverhang","frontWallRightPointAfterOverhang","frontRidgeLeftPointAfterOverhang","frontRidgeRightPointAfterOverhang","frontCenter","frontAngle","frontSideLength","frontTopPoints","topRidgeLeftPointAfterOverhang","topRidgeRightPointAfterOverhang","backAngle","backWallLh","backWallRh","d2","overhangHeight2","d3","overhangHeight3","backWallLeftPointAfterOverhang","backWallRightPointAfterOverhang","backRidgeLeftPointAfterOverhang","backRidgeRightPointAfterOverhang","backCenter","backSideLength","backTopPoints","backSidePoints","idSet","forEach","centerLeftRoofHeight","centerRightRoofHeight","centerRoofHeight","updateFlatRoofWalls","frontWallsIdSet","backWallsIdSet","sideWallHeightsMap","updateWalls","updateRooftopElements","useUpdateRooftopElementsByContextMenuChanges","wallPoints","ridgeFLPoint","ridgeFRPoint","ridgeBLPoint","ridgeBRPoint","ridgeTLPoint","ridgeTRPoint","TopMid","newTopZ","clamp","hDiff","newFrontRidgePoint","roof","newTopRidgePoint","newBackRidgePoint","RafterUnit","startV2","endV2","rotationZ","Rafter","isShed","rightWall","leftWall","ridgeUnitVector","ridgeLeftPointAfterOverhang","ridgeRightPointAfterOverhang","frontWallLeftPoint","backWallRightPoint","array","frontWallUnitVector","backWallUnitVector","frontWallLength","backWallLength","len","ridge","front","back","showFront","offsetTop","GableRoofWireframe","leftRoof","rightRoof","rightRidge","leftRidge","GableRoof","rafterSpacing","rafterWidth","rafterColor","glassTint","oldRidgeLeft","oldRidgeRight","updateRoofTopRidge","getShiftedArr","swap","j","temp","setGabledWallHeightsMap","ridgePoint","ridgeX","leftHalfK","leftHalfB","rightHalfK","rightHalfB","leftX","rightX","getGabledWallsHeightsMap","ridgeLeftPointV3","leftComposedWall","ridgeRightPointV3","rightComposedWall","ridgeMidPoint","shiftedWallArray","shiftedOverhangs","frontPoints","frontLength","backPoints","backLength","gabledWallsHeightsMap","gabledWallHeights","handleRoofBodyPointerDown","overhang","dir","rX","rZ","Left","Right","newRidgeLeftPoint","newRidgeRightPoint","oldLeft","oldRight","newLeft","newRight","handleUndoableResizeTopRidge","_opacity","invalidate","heatmapMeshRef","bulkMeshRef","planeRef","mullionRef","setMullionLx","setMullionLz","show","setShow","checkValid","v1","values","wallRight","ridgeRight","ridgeLeft","geo","Float32Array","zOffset","isValid","Glass","mapVector3ToPoint2","centerV3","wl","wr","rr","rl","resMesh","isNorthWest","rotationX","angleTo","rotationY","HipRoofWireframe","HipRoof","leftRidgeLengthCurr","setLeftRidgeLengthCurr","rightRidgeLengthCurr","setRightRidgeLengthCurr","setHipRoofRidgeLength","manualUpdate","updateElementOnRoofFlag","makeSegment","vector","p3","p4","centroid2D","getWallsPoint2","setX","getComposedWallHeight","ridgeLPoint","ridgeRPoint","midPointVector","oldLeftRidgeLength","oldRightRidgeLength","newLeftRidgeLength","newRightRidgeLength","handleUndoableResizeRidgeLength","MansardRoofWireframe","ridgePoints","wallLine","MansardRoof","frontRidge","backRidge","setWidth","maxWidth","setMaxWidth","ridgeHandleIndex","setRidgeHandleIndex","oldWidth","getWallPoint2","wallPointsAfterOverhang","leftDiff","rightDiff","topRidgeShape","el","lastIdx","ridgeVertices","updateFlag","setUpdateFlag","topSurfaceMeshRef","extractPoints","getPolygonArea","noTextureAndOneColor","Ridge","wallPoint","getWallPointFromHandleIdx","addUndoableResizeRidge","visitIFI","window","open","visitHomepage","showSuccess","msg","duration","success","content","className","marginTop","onClick","destroy","showInfo","info","showWarning","warning","showError","copyTextToClipboard","text","textArea","createElement","body","appendChild","selection","getSelection","rangeCount","getRangeAt","select","execCommand","removeChild","removeAllRanges","addRange","screenshot","elementId","options","source","html2canvas","removeContainer","canvas","href","toDataURL","download","click","saveCsv","fileName","Object","o","blob","Blob","saveAs","useHandleSize","handleSize","useWallTexture","textureLoader","TextureLoader","WallTextureDefault","WallTexture00","WallTexture01","WallTexture03","WallTexture04","WallTexture05","WallTexture06","WallTexture07","WallTexture08","WallTexture09","WallTexture10","Stud","load","repeatX","repeatY","useLatestFoundation","isFirstRenderRef","latestFoundation","SharedUtil","oldElement","newElement","isSolarPanel","isPolygon","undoableMove","movedElementId","movedElementType","oldCx","oldCy","oldCz","newCx","newCy","newCz","oldParentType","newParentType","newParentId","newFoundationId","oldNormal","newNormal","oldRotation","newRotation","setUndoRedoMove","pos","oldParent","newParent","absLx","absLz","WALL_OUTSIDE_SURFACE_MESH_NAME","addUndoableAddRooftopElement","elem","undoableAdd","addedElement","handleAddElementOnRoof","intersections","intersection","eventObject","includes","getPointerOnRoof","posRelToFoundation","posRelToCentroid","computeState","makeSolarPanel","solarPanelModelName","solarPanelOrientation","solarPanelPoleHeight","solarPanelPoleSpacing","solarPanelTiltAngle","solarPanelRelativeAzimuth","solarPanelFrameColor","makeWindow","makeSensor","makeLight","lightDistance","lightIntensity","lightColor","stopPropagation","multiSelectionsMode","oldRise","spBoundaryCheck","solarPanelVertices","wallVertices","rooftopElementBoundaryCheck","spCollisionCheck","sp","spVertices","rooftopSPCollisionCheck","isFlatGambrel","getRooftopElementZ","isValidOnRoof","boundaryVertices","getRoofBoundaryVertices","getSolarPanelVerticesOnRoof","addUndoableMove","undoInvalidOperation","intersectionObjects","pastePoint","RoofHandle","roofHandleSize","pointerDownRef","hoveredRef","haveFiredEvent","setHeightLight","cursor","isFirstHandle","onPointerOut","RoofRenderer","renderRoof","prev","FlippedWallSide","RoofTexture00","RoofTexture01","RoofTexture02","RoofTexture03","RoofTexture04","RoofTexture05","RoofTexture06","RoofTexture07","setTexture","_transparent","fId","wallsOnSameFoundation","getWallOnSameFoundation","wid","startWall","wId","wallMap","rotationMap","count","isLoop","toFixed","rot","walls","lw","rw","leftMostWall","rightMostWall","highestLz","longestEavesLength","composedWallArray","isGabled","getHighestComposedWallHeight","ignoreSide","getHighestWallHeight","riseInnerState","setRiseInnerState","mansardTop","relToFoundation","getRoofPointsOfGambrelRoof","setUpdateElementOnRoofFlag","rId","useUpdateRooftopElementsByControlPoints","drawShapeOfGambrelRoof","frontSide","backSide","TopExtrude","children","setUpdate","useUpdateAfterMounted","FlatRoof","wireFramePoints","maxZ","shapeWithHoles","hole","holes","showHeatmap","PolarGrid","rotateHandle","setPosition","setRadius","setRotation","currParent","rcx","rcy","getWorldDataById","font","useLoader","FontLoader","helvetikerFont","fontSize","textGeometryParams","tickLabels","toDegrees","times","getOffset","RotateHandle","ratio","hoverHandle","noHoverHandle","rotationHandleLMesh","Wireframe","AirMass","HorizontalRuler","verticalLift","rulerArrowOffset","rulerTickMarkWidth","labelBackgroundColor","rulerOffset","ll2ul","backgroundColor","fontFace","textHeight","linewidth","lr2ur","ll2lr","ul2ur","LowerLeft","LowerRight","UpperLeft","UpperRight","AIR_DENSITY","KELVIN_AT_ZERO_CELSIUS","STEFAN_BOLTZMANN_CONSTANT","ASHRAE_C","MINUTES_OF_DAY","OMEGA_DAY","OMEGA_YEAR","SunMinutes","sunrise","sunset","AMBIENT_LIGHT_THRESHOLD","ROOFTOP_SOLAR_PANEL_OFFSET","TILT_ANGLE","HALF_DAY_MINUTES","computeDeclinationAngle","days","getTime","getFullYear","computeSunriseAndSunsetInMinutes","toRadians","computeHourAngle","getHours","getMinutes","computeHourAngleAtMinute","minutes","getSunDirection","computeSunLocation","hourAngle","declinationAngle","cosDec","sinDec","cosLat","sinLat","cosHou","sinHou","altitudeAngle","xAzm","yAzm","azimuthAngle","coords","sphericalToCartesianZ","calculatePeakRadiation","sunDirection","dayOfYear","altitude","airMassType","getExtraterrestrialRadiation","zenithAngle","KASTEN_YOUNG","computeAirMass","calculateDiffuseAndReflectedRadiation","peakRadiation","viewFactorWithSky","viewFactorWithGround","isZero","albedo","animate","heatmapTexture","setHeatmapTexture","streamlinesRef","arrowRadius","collectorRadius","streamlines","airInletZ","collectorHeight","airOutletZ","chimneyHeight","chimneyRadius","airInletR1","airInletR2","airOutletR1","airOutletR2","airOutletR3","line","gridLines","delta","useFrame","uniforms","dashOffset","specular","shininess","lineData","glowTexture","useTexture","GlowImage","receiverHeight","haloSize","blending","AdditiveBlending","depthWrite","SolarReceiverPipe","absorberHeight","apertureWidth","relativeLength","poleNumber","solarReceiverPipePoles","InnerCommonStoreState","action","obj","startsWith","ContextMenu","Move","Resize","useSolarPanelHeatmapTexture","useSolarPanelTexture","customizedFrameColor","customizedBacksheetColor","cellType","backsheetColor","canvasTexture","portrait","drawSolarPanelCanvasTexture","ny","ctx","getContext","fillStyle","fillRect","padding","gap","cellSizeX","cellSizeY","beginPath","CanvasTexture","MoveHandle","ResizeHandle","dms","initPointerDown","Upper","Lower","localToWorld","TiltHandle","showTiltAngle","setShowTiltAngle","tiltHandleRef","degree","Tilt","depthTest","Sunbeam","drawSunbeam","relativeEuler","fRotation","normalVector","sunBeamLength","fCenter","labelText","label","labelColor","labelFontSize","labelSize","labelHeight","SolarPanelOnRoof","latestFoundationRef","radialSegmentsPole","poleZ","drawPole","setDrawPole","hovered","setHovered","baseRef","solarPanelLinesRef","oldPosRef","oldDmsRef","oldAziRef","oldTiltRef","oldRotRef","oldNorRef","poles","poleArray","poleNx","poleNy","sinTilt","cosAz","sinAz","xi","yi","mx","my","baseSize","moveHandleSize","resizeHandleSize","tiltHandleSize","AddUndoableOperation","undoableResize","oldDms","oldNor","oldPos","oldRot","newDms","newPos","newNor","newRot","undoableRotate","oldValue","newValue","changedElementId","changedElementType","bifacialityFactor","cv","undoableChange","azimuth","anchor","newLy","newTAngle","unitLength","dl","l","pr","pc","cc","wc","newAzimuth","EmptyWall","wallModel","checkIfCanSelectMe","WallMoveHandleWrapper","ply","phz","WallResizeHandle","highLight","partial","addedWallID","WallPartialResizeLeft","WallPartialResizeRight","WallPartialResizeLeftTop","WallPartialResizeRightTop","WallResizeHandleWrapper","parentLz","absAngle","leftTopPartialResizeHandleHeight","rightTopPartialResizeHandleHeight","wallLeftHeight","wallRightHeight","setIntersectionPlanePosition","setIntersectionPlaneRotation","oldHeightsRef","oldSameBuildingWallsHeightMapRef","leftWallLzRef","rightWallLzRef","childElements","setIntersectionPlane","updateUndoChange","sameBuildingWallsHeightMap","getConnectedWallsHeight","getChildElements","isPartialWallValid","isPartial","realWallLeftHeight","realWallRightHeight","isTopPartial","resizeHandleObject","minZ","newLz","newUnfilledHeight","leftWallRightUnfilledHeight","rightWallLeftUnfilledHeight","newTopPartialResizeHandleHeight","leftWallPartialResizeRightTop","rightWallPartialResizeLeftTop","newSameBuildingWallsHeightMap","undoableChangeHeight","oldHeights","newHeights","oldSameBuildingWallsHeightMap","WallRenderer","areEqual","BUILDING_GROUP_NAME","BuildingRenderer","isBuildingParts","buildingParts","areEuqal","FOUNDATION_GROUP_NAME","solarStructure","pasteElements","deletedWallID","addedFoundationID","showGrid","setShowGrid","direction","wallAuxToAxis","setWallAuxToAxis","wallAuxToWallArray","setWallAuxToWallArray","addedWallIdRef","isSettingWallStartPointRef","isSettingWallEndPointRef","elementsStateBeforeResizingRef","flippedWallSide","null","wallMapOnFoundation","groupRef","grabRef","intersectPlaneRef","resizeHandleLLRef","resizeHandleULRef","resizeHandleLRRef","resizeHandleURRef","moveHandleLowerRef","moveHandleUpperRef","moveHandleLeftRef","moveHandleRightRef","oldPositionRef","newPositionRef","oldDimensionRef","newDimensionRef","oldAzimuthRef","newAzimuthRef","oldVerticesRef","newVerticesRef","oldJointsRef","newJointsRef","oldPointRef","newPointRef","positionLL","positionUL","positionLR","positionUR","handleRadius","moveHandleRadius","resizeHandleRadius","rotateHandleRadius","rotateHandlePosition","listenToAutoDeletionRef","undoableMoveWallArgsRef","trough","dish","reflector","getAutoDeletedElements","handleUndoMoveWallWithAutoDeletion","debounce","autoDeletedElements","newAngle","newJoints","oldPoints","newPoints","oldJoints","oldAngle","loop","flipWallLoop","flipWallsClockwise","flipWallsCounterClockwise","oldLeftJoints","oldRightJoints","newLeftJoints","newRightJoints","deletedRoof","FoundationTexture01","FoundationTexture02","FoundationTexture03","FoundationTexture04","FoundationTexture05","FoundationTexture06","FoundationTexture07","FoundationTexture00","param","fetchRepeatDividers","useCallback","handle","isMoveHandle","legalOnFoundation","findMagnetPoint","minDist","targetPoint","targetID","targetSide","jointId","distStart","distEnd","flag","dist","currentWallId","wallCopy","targetWall","flipWallHead","flipWall","flipWallCopy","nextWall","checkWallLoop","isClosed","totalAngle","totalNumber","wallNewLeftJointIdRef","wallNewRightJointIdRef","flipCurrWallRef","flipRightHandSideWallRef","flipLeftHandSideWallRef","getWallAngleByPointer","alignToWall","targetId","alignedX","alignedY","leftXDiff","rightXDiff","leftYDiff","rightYDiff","alignPointer","alignedToWallX","alignedToWallY","ALIGN_ANGLE_THRESHOLD","alignToAxis","alignedToAxisX","alignedToAxisY","getClosestAlignedPoint","val1","val2","checkAndSetPosAlignToWall","produce","draft","setShowWallAux","toWall","toAxis","handleShowAuxiliary","isAlignedToWallX","isAlignedToWallY","checkAndSetPosAlignToAxis","isAlignedToAxisX","isAlignedToAxisY","isSolarCollectorNewPositionOk","sc","JSON","parse","stringify","isSolarCollectorWithinHorizontalSurface","isSolarCollectorNewAzimuthOk","az","isSolarCollectorNewSizeOk","stand","clickObjectType","pasteNormal","altKey","bypass","handleUndoableAdd","wallRelativePosition","setY","targetJointId","snapToFineGrid","snapToNormalGrid","updatePointer","wallAbsolutePosition","pastedElements","undoablePaste","handleUndoableAddWall","autoDeletedElement","oldPosition","newPosition","oldDimension","newDimension","oldPoint","newPoint","deletedIdSet","setTimeout","handleUndoableResizeWall","newLeftWall","newRightWall","handleUndoableMoveWall","undoableEditPolygon","oldLx","oldLy","oldLz","newLx","isSolarCollector","collector","accept","relativeCoordinates","polygon","handleOffset","leftFlip","rightFlip","stretched","updateWallPointAfterSnap","magnetOffset","leftTarget","rightTarget","leftAlignedToWallX","leftAlignedToWallY","rightAlignedToWallX","rightAlignedToWallY","leftDiffX","rightDiffX","diffX","leftDiffY","rightDiffY","diffY","isLeftAlignedToWallX","isLeftAlignedToWallY","isRightAlignedToWallX","isRightAlignedToWallY","relativeCenter","detachId","targetWallId","addedWall","isPlantOrHuman","wp","resizeAnchor2D","rp","wbc","dyl","wcx","rc","dxl","parabolicTroughWidth","fresnelReflectorWidth","diameter","parabolicDishRimDiameter","wallAuxToWall","isElementAllowedMultipleMoveOnGround","FocusPipe","FocusTower","UpdraftTower","WallAuxiliaryLine","INTERSECTION_PLANE_NAME","getPointerOnIntersectionPlane","getPosRelToFoundation","isRectWindowInsideVertices","boundaryPoint2","isResizeHandle","setUndoableMove","setUndoableResize","setUndoableResizePolygonTop","getElementVerticesOnRoof","getPolygonTop","ArchResizeHandle","Arch","WindowHandleWrapper","isSettingNewWindow","isOnRoof","handleTypeRef","foundationModelRef","roofModelRef","roofSegmentsRef","roofCentroidRef","currRoofSegmentIdxRef","resizeAnchorWorldPosRef","roofBoundaryVerticesRef","roofChildVertices2DRef","oldRotationRef","oldArchHeight","oldPolygonTop","getResizeAnchor","worldPosition","setRefDataBeforePointerMove","windowModel","foundationGroup","buildingGroup","roofGroup","segmentGroup","getSegmentIdx","roofCentroid","addUndoableResize","newArchHeight","getBoundary","segmentIdx","collisionCheck","currentVertices","targetVertices","currentVertex","targetVertex","boundaryCheck","boundary","topVertex","isPolygonalWindowInsideVertices","dataOnRoof","windowId","eventObjectName","parseInt","split","getDataOnRoof","pointerOnIntersectionPlane","newCenter","insideBoundary","noCollision","pointerOnRoof","anchorWorldPos","pointerRelToFoundation","diffVector","getNewResizedData","whx","whz","lowerLeftPoint","lowerRightPoint","pointerRelToLowerLeft","botNormal","topXRelToLeft","projectOnVector","newTopX","topToBotDist2D","topToBotDist","newPolygonTop","anchorRelToFoundation","rectHeight","anchorToCenterNormal","addUndoableReizePolygonTop","wireframeRadius","RectangleWindow","RulerOnWall","yOffset","WINDOW_GROUP_NAME","GROUP_NAME","isContextMenu","isAllowedToSelectMe","onClickResizeHandle","dimensionData","positionData","positionY","isClickedOnHandles","renderWindow","WallWireFrame","showParapet","leftHeight","rightHeight","lowerLeft","lowerRight","upperLeft","upperRight","cl","cr","DoorWireFrame","ul","ur","ll","lr","DoorFrame","RectangleDoor","doorShape","ArchedDoor","ihx","ihz","iah","DoorHandleWrapper","DoorSealPlanes","doorModel","DoorTextureDefault","DoorTexture00","DoorTexture01","DoorTexture02","DoorTexture03","DoorTexture04","DoorTexture05","DoorTexture06","DoorTexture07","DoorTexture08","DoorTexture09","DoorTexture10","DoorTexture11","DoorTexture12","DoorTexture13","DoorTexture14","DoorTexture15","DoorTexture16","DoorTexture17","useDoorTexture","doorMaterial","MeshBasicMaterial","MeshPhongMaterial","getDoorArea","renderDoor","absRotation","wCenter","showIntersection","Mount","spCy","spLy","mountUnit","halfLz","startZ","HANDLE_GROUP_NAME","SolarPanelOnWall","setHoveredHandle","setNx","fontColor","fontOutlineWidth","fontOutlineColor","fontStrokeWidth","fontStrokeColor","lineStyle","Solid","noOutline","centerX","setCenterX","centerY","setCenterY","centerRef","cuboidWorldPosition","cuboidWorldRotation","updatePolygonSelectedIndexById","absoluteVertices","av","isIdentical","getCz","isSame","sideFace","shift","getPosition","PolygonTexture01","PolygonTexture02","PolygonTexture03","PolygonTexture04","PolygonTexture05","PolygonTexture06","PolygonTexture07","PolygonTexture08","PolygonTexture09","PolygonTexture10","PolygonTexture00","params","anchorX","anchorY","outlineWidth","outlineColor","strokeWidth","strokeColor","Dashed","PolygonVertex","DEFAULT_PARAPET_SETTINGS","display","parapetHeight","copingsWidth","copingsHeight","wallData","parapetZ","currWallPointData","leftWallPointData","rightWallPointData","bodyHeight","copingsPoints","outerLeft","outerRight","innerRight","innerLeft","currWallCopingsPoints","getCopingsPoints","isSamePoint","copingsInterSectionPoints","getCopingsIntersectionPoints","outerIntersection","innerIntersection","bodyShape","currWallInnerPoint","getWallPointsAfterOffset","rel","getBodyRelativeIntersectionPoint","copingsShape","copingsWireframePoints","bodyHorizontalWireframePoints","bodyVerticalWireframePoints","currCopingsPoints","sideWallPointData","sideWallCopingsPoints","currPoints","sideWallPoints","wallPointData","innerOffset","outerOffset","leftPointV3","rightPointV3","v3","v4","k1","k2","x0","y0","ElBeingAddedStatus","WallHeatFlux","isPartialWallFull","frameVertices","getWallVertices","partialWallVertices","getPartialWallVertices","frameArea","doors","getHighestPointOfWall","halfDif","isWall","WALL_BLOCK_PLANE","WALL_INTERSECTION_PLANE_NAME","WALL_PADDING","InsideWallMaterial","night","BackSide","structureSpacing","structureWidth","structureColor","leftWallId","rightWallId","isElementTriggerWallChange","elementsTriggerChange","elementsOnWall","isLegalOnWall","useElements","outsideWallRef","insideWallRef","topSurfaceRef","addedWindowIdRef","invalidElementIdRef","elBeingAddedRef","leftOffset","getInnerWallOffset","rightOffset","Pillar","realLeftUnfilledHeight","realRightUnfilledHeight","whiteMaterialDouble","zmax","outsideWallShape","wallShape","drawDoorShape","sort","door","dcx","dcy","dlx","dly","drawWallShape","windowShape","wlx","wly","drawArchWindow","drawPolygonalWindow","drawRectWindow","insideWallShape","dh","rightOffsetHeight","leftOffsetHeight","topSurfaceHeight","topSurfaceRotationY","topWallShape","drawTopSurface","tHx","tInnerLeftHx","tInnerRightHx","outerWallPoints2D","structureUnitArray","wallDataToParapet","currWallPointDataToParapet","leftWallPointDataToParapet","rightWallPointDataToParapet","getRelativePosOnWall","wallAbsPos","getElementVerticesOnWall","signX","signY","checkCollision","elx","elz","pointX","pointY","checkInsideBoundary","eLx","eLz","isDoor","checkPolygonTopInsideBoundary","wLx","wLz","topPointX","topPointY","getWallBoundary","getPositionOnGrid","parseFloat","checkPerpendicular","vLeft","setElementPosDms","hasPolygonTop","resetBeingAddedChildId","isFirstIntersectedObject","ifChildNeedsChangeParent","wallId","isChildType","isArchedResize","offsetWallEdgePoints","elHx","elHy","isWallPoints","edgeVector","offsetVector","getDiagonalResizedData","diagonal","dimensionXZ","positionXZ","isValidToAddRoof","rect","sameHeight","isSettingElementStartPoint","status","SettingStartPoint","getPointer","object3D","diagonalVector","relativePositionOnWall","positionOnGrid","relativePointer","pointerOnGrid","resetToAddingNewObjectStatus","elBeingAdded","getElementHalfSize","getRoofPoints","roofPoints","getBoundedPointer","ignorePadding","elementHalfSize","leftPadding","rightPadding","elHz","boundingMinX","boundingMaxX","boundingMinZ","boundingMaxZ","boundedPointer","botHeight","topHeight","boundedShape","edgesPoints","botLeftPoint","botRightPoint","topRightPoint","topLeftPoint","getBoundedShape","pointer2D","isElementOutside","isPointerOutsideShape","closestPoint","closestDistance","edgeStart","edgeDirection","edgeLengthSq","lengthSq","toStart","projectionFactor","closestEdgePoint","distanceSq","getClosestPointOnPolygon","moveElement","pg","newVertices","getArchedResizedData","archedElement","wlz","archHeightBottom","handleWallBodyPointerDown","SettingEndPoint","addElementByClick","makePyramidRoof","makeGableRoof","makeHipRoof","makeGambrelRoof","makeMansardRoof","mesh","canPaste","handleWallSideSurfacePointerDown","handleStudPointerDown","handleStudContextMenu","invalidateIdSet","getWallPoints2D","intersectedWalls","isFirstIntersectedWall","objectType","setElementHasBeenAdded","makeDoor","makeNewMovingElement","isInside","isvalid","isPolygonTopInside","getSolarPanelUnitLength","unitX","unitY","oldPg","newPg","handleUndoableResize","wallCenterPos","wallCenterHeight","leftLength","leftRotationY","rightLength","rightRotationY","renderStuds","topBarThickness","renderPillars","A","B","C","wallPoints2D","inside","xj","yj","currWallId","counterWallId","ch","NaN","leftDis","rightDis","upperHalf","roofHeight","getSegmentVertices","getSegmentNormal","getRotationFromNormal","orderedWallArray","wall0","nextId","unshift","elementVertices","currVertices","targetElementsVertices","getWindowVerticesOnRoof","sp2Vertices","i1","from1","to1","i2","from2","to2","lineIntersection","maxWallHeight","isStackableModel","CuboidFace","handleColor","Handles","intersectionPlaneData","setIntersectionPlaneData","raycaster","cuboidWorldBottomHeight","parentWorldRotation","parentWorldPosition","childPositionMap","childSideMap","lowerRotateHandlePosition","upperRotateHandlePosition","showTopResizeHandles","showMoveAndRotateHandles","cm","getWorldRotation","isHumanOrPlant","intersectObject","isTopResizeHandle","resizeLz","isXResizeHandle","cuboid","worldCenter","currWorldPosition","currWorldRotation","childWorldPosition","relPos","NS","EW","resizeLx","isYResizeHandle","resizeLy","resizeXY","handleRotate","parentWorldPos","parentWorldRot","worldPos","handleObject","topHandleWorldPosition","LowerLeftTop","UpperLeftTop","LowerRightTop","UpperRightTop","handleGroup","SolarPanelOnCuboid","solarPanelModel","isTop","isSolarPanelOnTopFace","actualPoleHeight","rotateHandleSize","pointerDown","oldTiltAngleRef","newTiltAngleRef","parentWorldRotationRef","dateObject","groupRotation","panelRotation","getWorldRotationZ","ALTAZIMUTH_DUAL_AXIS_TRACKER","HORIZONTAL_SINGLE_AXIS_TRACKER","VERTICAL_SINGLE_AXIS_TRACKER","showRotateHandle","showTiltHandle","showPoles","getRotateHandleColor","ov","SolarPanelBoxGroup","actualTiltAngle","actualRelativeAzimuth","resizeHandleArgs","solarPanelLines","getRelativeSunDirection","relativeSunDirection","setRelativeSunDirection","worldRotationZ","getResizeHandleColor","newRelativeSunDirection","selfRotation","cuboidModel","updateSolarPanelRelativeAzimuthById","heatmapTextureTop","setHeatmapTextureTop","heatmapTextureSouth","setHeatmapTextureSouth","heatmapTextureNorth","setHeatmapTextureNorth","heatmapTextureWest","setHeatmapTextureWest","heatmapTextureEast","setHeatmapTextureEast","setNormal","faceNormalRef","gridPositionRef","gridRotationRef","gridDimensionRef","oldNormalRef","newNormalRef","worldPositionRef","worldRotationRef","tempHumanPlant","maxValue","heatmapTop","heatmapSouth","heatmapNorth","heatmapWest","heatmapEast","fetchTextureImage","Facade01","Facade_Texture_01","Facade02","Facade_Texture_02","Facade03","Facade_Texture_03","Facade04","Facade_Texture_04","Facade05","Facade_Texture_05","Facade06","Facade_Texture_06","Facade07","Facade_Texture_07","Facade08","Facade_Texture_08","Facade09","Facade_Texture_09","Facade10","Facade_Texture_10","Facade_Texture_00","textureLoaderEast","setTextureEast","textureEast","textureLoaderWest","setTextureWest","textureWest","textureLoaderNorth","setTextureNorth","textureNorth","textureLoaderSouth","setTextureSouth","textureSouth","textureLoaderTop","setTextureTop","textureTop","setupGridParams","aboveDistance","onTopSurface","isSolarPanelNewPositionOk","isSolarPanelNewSizeOk","materials","handleArgs","showHandles","legalAddToCuboid","diff","handleAddElement","legalOnCuboid","isSolarPanelNewAzimuthOk","sensorModel","light","heatFlux","applyAxisAngle","absoluteCoordinates","lit","lightModel","parentThickness","CUBOID_WRAPPER_NAME","CUBOID_STACKABLE_CHILD","CuboidRenderer","isStackableChild","design","yearlyYield","sellingPrice","panelCount","unitCost","lat","model","title","userid","newWidth","newHeight","resizedCanvas","drawImage","from","to","order","rotateX","rotateY","rotateZ","Triangle","getArea","total","calculateBuildingArea","hasRoof","ROOF_MISSING","WALL_DISJOINED","COMPLETE","getWallPointsOfRoof","uValueInSI","uValueInUS","rValueInSI","rValueInUS","grd","createRadialGradient","addColorStop","scene","objects","traverse","fetchSimulationElements","getSimulationElements","determinant","lambda","gamma","valuePerColorRange","colorIndex","scalar","lerp","array2d","col","row","flip","clearRect","imageData","getImageData","pixels","calculateSolarRadiationColor","off","g","putImageData","rack","excludeLocked","f1","f2","fetchFoundationVertexCoordinates","xc","yc","cosaz","sinaz","sp1","sp2","fetchSolarPanelVertexCoordinates","pts","first","last","f","nPts","twiceArea","polygonModel","angleInRadian","rotatedVertices","childAbsPosMap","absPos","childrenClone","childClone","childAbsPos","relativePos","parentClone","doesParentContainAllChildren","isSensorWithin","isWallWithin","indexOf","found","deleteElement","WaterHeater","isSolarCollectorType","isCspCollectorType","isParabolaType","isDescendantOf","boundingPoints","elementPoints","eMinX","eMaxX","eMinZ","eMaxZ","getWallInnerSideShapePoints","OutsideBoundary","ehx","ehz","tMinX","tMaxX","tMinZ","tMaxZ","OverLap","Valid","Invalid","parentPos","grandParent","grandParentPos","getStackCuboidObjectById","wrapper","degrees","radians","getArrayMax","getArrayMin","sphereCoords","lng1","lat1","lng2","lat2","UTC","getMonth","getDate","year","platform","os","family","getOS","WebGLRenderingContext","l1","xx","yy","D","len_sq","eave","deltaAngle","WATER_TEXTURE","fetchWaterTexture","WHITE_TEXTURE","fetchWhiteTexture","getAllConnectedWalls","currPos","currRot","currTopZ","worldRot","worldTopZ","isChild","baseId","childId","checkLock","getBaseId","isElementTriggerAutoDeletion","DefaultWorldModel","immerable","toLocaleString","thermalDiffusivity","snowReflectionFactors","APPROXIMATE","woman","worldModel","ElementModelCloner","noMove","clonePolygon","cloneSensor","cloneLight","cloneSolarPanel","cloneParabolicTrough","cloneParabolicDish","cloneFresnelReflector","cloneHeliostat","cloneWindTurbine","cloneWall","cloneWindow","cloneDoor","cloneRoof","cloneHuman","cloneTree","cloneFlower","cloneFoundation","cloneCuboid","human","pm","translatePolygonCenterTo","windTurbine","enableGroupMaster","newRoof","ceilingRValue","newGambrelRoof","oldGambrelRoof","DefaultViewState","cameraPositionNav","cameraRotationNav","UndoManager","commands","limit","isExecuting","command","DefaultSolarPanelArrayLayoutParams","leftRight","ElementCounter","foundationCount","cuboidCount","wallCount","windowCount","doorCount","humanCount","treeCount","flowerCount","polygonCount","sensorCount","insideLightCount","outsideLightCount","solarPanelCount","solarPanelModuleCount","parabolicDishCount","parabolicTroughCount","fresnelReflectorCount","heliostatCount","solarUpdraftTowerCount","windTurbineCount","DefaultGeneticAlgorithmParams","problem","objectiveFunctionType","selectionMethod","searchMethod","populationSize","maximumGenerations","selectionRate","crossoverRate","mutationRate","convergenceThreshold","localSearchRadius","DAILY_TOTAL_OUTPUT","ROULETTE_WHEEL","GLOBAL_SEARCH_UNIFORM_SELECTION","DefaultParticleSwarmOptimizationParams","swarmSize","maximumSteps","vmax","inertia","cognitiveCoefficient","socialCoefficient","DefaultEvolutionaryAlgorithmState","geneticAlgorithmParams","particleSwarmOptimizationParams","SOLAR_PANEL_TILT_ANGLE","DefaultSolarPanelArrayLayoutConstraints","minimumInterRowSpacing","maximumInterRowSpacing","minimumRowsPerRack","maximumRowsPerRack","minimumTiltAngle","maximumTiltAngle","DefaultEconomicsParams","projectLifeSpan","DefaultActionState","humanName","flowerType","treeType","treeSpread","treeHeight","foundationHeight","foundationColor","foundationTexture","groundFloorRValue","cuboidHeight","cuboidFaceColors","cuboidFaceTextures","roofGlassOpacity","roofGlassTint","roofRafterWidth","roofRafterSpacing","roofRafterColor","roofVolumetricHeatCapacity","doorFrameColor","doorOpacity","doorVolumetricHeatCapacity","windowWidth","windowHeight","parabolicDishReflectance","parabolicDishAbsorptance","parabolicDishOpticalEfficiency","parabolicDishThermalEfficiency","parabolicDishLatusRectum","parabolicDishPoleHeight","parabolicDishPoleRadius","parabolicDishReceiverStructure","parabolicTroughReflectance","parabolicTroughAbsorptance","parabolicTroughOpticalEfficiency","parabolicTroughThermalEfficiency","parabolicTroughLatusRectum","parabolicTroughPoleHeight","parabolicTroughModuleLength","fresnelReflectorReceiver","fresnelReflectorReflectance","fresnelReflectorPoleHeight","fresnelReflectorModuleLength","heliostatTower","heliostatReflectance","heliostatPoleHeight","heliostatPoleRadius","heliostatWidth","heliostatLength","DefaultGraphState","ProjectUtil","hidden","variable","axis","calculateCost","calculateProfit","StoreUtil","elementMap","unfilledHeight","mullion","mullionSpacing","shutter","gambrelRoof","frontRidgeRightPoint","backRidgeRightPoint","topRidgeRightPoint","isGroupable","enableMapSet","devtools","persist","immerSet","fn","defaultWorldModel","defaultElements","getElements","log","modelType","UNKNOWN","modelAuthor","modelLabel","modelDescription","owner","description","designs","ranges","hiddenParameters","getDefaultHiddenParameters","counter","dataColoring","ALL","selectedProperty","sortDescending","xAxisNameScatteredPlot","yAxisNameScatteredPlot","dotSizeScatteredPlot","thumbnailWidth","projectImages","designProjectType","modelsMapAddress","GENETIC_ALGORITHM","updateOldFileData","fixElements","docid","time","dayjs","format","uid","signFile","displayName","email","resetWorldModel","resetViewState","Box3","findNearestSibling","foundId","me","distanceSquare","sq","threshold","overlap","doSolarPanelsOverlap","thresholdSquared","parentPosition","parentRotation","handlePosition","referenceId","updateElementLxOnSurface","updateElementLyOnSurface","updateElementLzAboveFoundation","updateElementLzOnSurface","draw","updateSolarCollectorPoleRadiusOnSurface","clearAllSolarCollectorYields","isCspCollector","isParabolicCollector","OnlyThisObject","setSolarPanelOrientation","isHeliostatOrFresnelReflector","isParabolicTroughOrFresnelReflector","setWallActionScope","setWindowActionScope","setDoorActionScope","updateWallRelativeAngleById","joints","updateWallRightPointById","structure","makeHuman","makeTree","makeFlower","polygonParentModel","polygonRelativeCoordinates","makePolygon","sensorParentModel","sensorRelativeCoordinates","lightParentModel","lightRelativeCoordinates","solarPanelParentModel","solarPanelRelativeCoordinates","parabolicTroughParentModel","parabolicTroughRelativeCoordinates","makeParabolicTrough","parabolicDishParentModel","parabolicDishRelativeCoordinates","makeParabolicDish","fresnelReflectorParentModel","fresnelReflectorRelativeCoordinates","makeFresnelReflector","heliostatParentModel","heliostatRelativeCoordinates","makeHeliostat","makeFoundation","makeCuboid","wallParentModel","makeWall","deletedElements","parentWall","copiedWindow","removeSelectedElements","selectedIdSet","selectedIds","deletedElementSet","deletedElementIdSet","currentWall","cut","autoDeleted","removed","observer","cache","countAllElements","countAllElementsByType","ancestorId","includingLocked","idOk","copyCutElements","copiedElements","elementsMapOldToNew","elementsMapNewToOld","oldElem","newElem","oldRoofId","oldWallId","elemToPaste","isPositionRelative","approved","getAllChildren","newChild","grandChild","newGrandChild","oldRoof","checkElementOnWallState","vrx","vlx","getRotationOnRoof","windowVertices","getRoofSegmentBoundary","rooftopWindowCollisionCheck","relativePoint","cutElements","roofVertices","nearestNeighborId","nearestNeighbor","oldX","oldY","pvModels","Papa","pvmodules","complete","results","isArray","pv","trim","brand","efficiency","nominalLength","nominalWidth","pmax","vmpp","impp","voc","isc","pmaxTC","noct","weight","shadeTolerance","weather","lows","highs","sun","wm","city","country","elevation","lowestTemperatures","highestTemperatures","sunshineHours","location","horizontalSolarRadiationData","radiationData","solar_radiation_horizontal","sr","verticalSolarRadiationData","solar_radiation_vertical","wd","setSceneRadius","updateWallMapOnFoundation","updateElementOnRoofFn","setGroupActionMode","enUS","setCreateNewFileFlag","setOpenLocalFileFlag","localFileDialogRequested","pvModelDialogVisible","getStorage","URLSearchParams","search","sessionStorage","localStorage","whitelist","ErrorPage","props","hasError","errorInfo","reload","marginLeft","clearCacheAndReload","Component","Sky","meshRef","absPosMapRef","polygonsAbsPosMapRef","oldWidthRef","oldHeightRef","oldChildrenPositionsMapRef","oldChildrenParentIdMapRef","newChildrenPositionsMapRef","newChildrenParentIdMapRef","oldHumanOrTreeParentIdRef","elementParentRotation","intersectionPlaneType","setIntersectionPlaneType","intersectionPlaneAngle","Vertical","cameraDir","Desert","Dune","Forest","Grassland","Hill","Lake","Mountain","Rural","DesertImage","DuneImage","ForestImage","GrasslandImage","HillWinterImage","HillSpringImage","HillSummerImage","HillFallImage","LakeImage","MountainImage","RuralImage","DefaultImage","clickSky","getObjectId","nameArray","handleDetachParent","parentObject","getObjectChildById","attachToGroup","attachParentId","currParentId","currParentObj","currObj","attachParentObj","setParentIdById","isFoundationOrCuboid","getIntersectionToStand","handleTreeOrHumanRefMove","elementRef","intersectionObj","elementParentRef","intersectionObjGroup","handleSetElementState","standObjId","cuboidCenter","cuboidChildren","centerAbsPos","vertexAbsPosArray","vertexAbsPos","newHumanOrTreeParentId","newRelZ","oldChildrenPositionsMap","newChildrenPositionsMap","oldChildrenParentIdMap","newChildrenParentIdMap","undoableChangeSpread","fetchIntersectables","intersectionObjId","moveOk","screenPosition","screenLx","screenLy","screenLz","isMoveToSky","showTickMarks","showTickLabels","tickIntervalRef","labelIntervalRef","arrayRef","majorTickLength","tickMarkColor","tickMarkLineWidth","cameraZ","fetchTickLength","isRender","humanModel","fileChangedRef","fileChangedState","getParentObject","fetchLabel","cameraX","cameraY","currX","currY","gender","fetchGender","hatOffsetX","fetchHatOffsetX","hatOffsetY","fetchHatOffsetY","Billboard","follow","renderOrder","alphaTest","eyeball","TreeData","leafOutDay","leafOffDay","lastDayOfSpring","lastDayOfSummer","northernHemisphere","AppleWinterImage","AppleSummerImage","AppleSpringImage","AppleFallImage","BirchWinterImage","BirchSummerImage","BirchSpringImage","BirchFallImage","CoconutImage","DogwoodWinterImage","DogwoodSummerImage","DogwoodSpringImage","DogwoodFallImage","ElmWinterImage","ElmSummerImage","ElmSpringImage","ElmFallImage","FanPalmImage","LindenWinterImage","LindenSummerImage","LindenSpringImage","LindenFallImage","MagnoliaWinterImage","MagnoliaSummerImage","MagnoliaSpringImage","MagnoliaFallImage","MapleWinterImage","MapleSummerImage","MapleSpringImage","MapleFallImage","OakWinterImage","OakSummerImage","OakSpringImage","OakFallImage","SpruceImage","PineImage","showModel","solidTreeRef","shadowTreeRef","trunkMeshRef","interactionPlaneRef","resizeHandleTopRef","resizeHandleLeftRef","resizeHandleRightRef","resizeHandleLowerRef","resizeHandleUpperRef","treeModel","isEvergreen","fetchTheta","customDepthMaterial","MeshDepthMaterial","depthPacking","RGBADepthPacking","positionTop","positionLeft","positionRight","positionLower","positionUpper","sunlightX","sunlightY","isConic","El","CheckStatus","ParabolicCylinder","Paraboloid","numberOfModules","setNumberOfModules","frontSideRef","backSideRef","moveHandleRef","parabolaSegments","focalLength","rotatedSunDirection","reflectedLightShift","cosRot","sinRot","focusPoint","sunPoint","moduleLines","t0","dt","detailed","haloRadius","wireframeLines","outer","inner","depth4","tripodLines","quadrupodLines","focalPoint","receiver","receiverCenter","shiftedReceiverCenter","rotationAxis","sunDirectionClone","tower","faceUp","setFaceUp","panelNormal","interactionMeshRef","flowerModel","Container","styled","div","SimulationControlPanel","EvolutionControlPanel","Spin","initializing","hasMovingParts","spinning","EndWaiting","End","ElementsRenderer","ClearDeletedRoofIdSet","Ground","setElementRotation","groundModel","getThree","groundPlaneRef","oldPolygonVerticesMapRef","newPolygonVerticesMapRef","oldWallPointsMapRef","newWallPointsMapRef","newRotationRef","oldHumanOrPlantParentIdRef","oldCuboidParentIdRef","wallsAbsPosMapRef","isSettingFoundationStartPointRef","isSettingFoundationEndPointRef","isSettingCuboidStartPointRef","isSettingCuboidEndPointRef","isHumanOrPlantMovedRef","baseGroupRelPosMapRef","baseGroupOldPosMapRef","baseGroupNewPosMapRef","moveHandleWorldDiffV3Ref","cosAngle","sinAngle","Horizontal","handlePlantOrHumanRefMove","intersectionObjGroupWorldRotation","resizeElementOnPointerUp","isResizingVertical","newRelativePos","oldRelativePos","elementsOnRoof","getRooftopChildren","centerRelPos","oldPolygonVerticesMap","newPolygonVerticesMap","oldWallPointsMap","newWallPointsMap","isRoofTopElement","updateBaseGroupPosition","moveElementOnPointerUp","newHumanOrPlantParentId","oldPositionMap","newPositionMap","isCuboid","rotatedElementId","rotatedElementType","rotateElementOnPointerUp","setBasePosMap","checkOverlapWithAllBases","currElem","areTwoBasesOverlapped","handleGroupMaster","handleTempHumanPlantChild","getFirstStackableCuboid","firstIntersectedCuboidObject","intersect","firstIntersectedCuboidObjectId","legalOnGround","handleHumanAndPlantPositionFixedOnParent","handleResize","sizeOk","centerPointAbsPos","leftPointAbsPos","rightPointAbsPos","centerPointRelativePos","leftPointRelativePos","rightPointRelativePos","verticesAbsPos","centerPos","relPosToFoundation","handleMove","isMultipleMove","foundationCenterV2","foundationChildren","parentAbsPos","parentAbsRot","currAbsRot","needsUpdate","worldLatitude","setLatitude","angleArcRadius","angleLabelHeight","baseGeometry","lineGeometry","basePoints","tickPoints","basePositions","baseNormals","baseColors","BufferAttribute","sunPathPoints","sunMinutes","getSunPathPointsByDate","day","decline","pointArraySunPaths","sunPosition","sunDirectionOnGround","elevationAngle","elevationAngleArcPoints","points3D","zenithAngleArcPoints","azimuthAngleArcPoints","sunbeltGeometry","declinationStep","hourStep","verticesCount","Uint16Array","sunRadius","vertexColors","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","clippingPlanes","Plane","HeliodonWrapper","heliodonRadius","dateString","Team","linePos","top100","top200","borderRadius","border","textAlign","verticalAlign","marginRight","Ukrainian","Spanish","Turkish","About","close","CspSimulationSettings","SubMenu","Menu","Option","Item","onChange","paddingLeft","precision","PvSimulationSettings","gridCellSize","EXACT","checked","SutSimulationSettings","noAnimation","BuildingEnergySimulationSettings","checkBuilding","NO_BUILDING","atLeastOneGood","atLeastOneBad","errorType","completionStatus","getBuildingCompletionStatus","AT_LEAST_ONE_BAD_NO_GOOD","buildingCompletion","AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD","getLightAbsorption","lc","toLowerCase","bigint","substring","adjustEnergyUsage","outsideTemperatureRange","heatExchange","setpoint","low","high","getOutsideTemperatureAtMinute","hi","lo","minute","mean","ampl","daylight","temperatureAtSunset","minutesAfterSunset","exp","computeOutsideTemperature","los","his","month1","month2","currentYear","currentMonth","dayInMonth","halfOfCurrentMonth","daysOfMonth","halfOfPreviousMonth","getGroundTemperatureAtMinute","airTemperatureFluctuationAmplitudeOfDay","average","hiMax","hiMin","loMax","loMin","amplitude","calculateTemperatureOnDay","ModelSiteDialog","setDialogVisible","setModelType","generateRandomAnimal","setModelAuthor","setModelLabel","setModelDescription","dragEnabled","setDragEnabled","bounds","setBounds","dragRef","okButtonRef","TextArea","Input","focus","onMouseOver","onMouseOut","footer","disabled","onCancel","maskClosable","destroyOnClose","modalRender","modal","onStart","uiData","documentElement","targetRect","getBoundingClientRect","gutter","paddingBottom","span","alt","src","UnknownIcon","UNDER_CONSTRUCTION","UnderConstructionIcon","RESIDENTIAL_BUILDING","ResidentialBuildingIcon","COMMERCIAL_BUILDING","CommercialBuildingIcon","SCHOOL_BUILDING","SchoolBuildingIcon","TOURIST_ATTRACTION","TouristAttractionIcon","PHOTOVOLTAIC","SolarPanelIcon","PARABOLIC_DISH","ParabolicDishIcon","PARABOLIC_TROUGH","ParabolicTroughIcon","FRESNEL_REFLECTOR","FresnelReflectorIcon","SOLAR_POWER_TOWER","HeliostatIcon","maxLength","test","rows","CreateNewProjectDialog","setProjectType","setProjectTitle","setProjectDescription","fetchProject","setProjectState","firebase","firestore","collection","doc","then","catch","range","FieldValue","arrayUnion","updateRanges","createDesign","thumbnail","countAllSolarPanelDailyYields","countAllSolarPanelYearlyYields","economicParams","changeDesignTitles","projectDesigns","newDesigns","createDesignTitle","designTitle","lastIndexOf","image","copyDesign","original","exists","loadCloudFile","ofProject","popState","viewOnly","newUrl","encodeURIComponent","history","pushState","radioStyle","lineHeight","MainMenuContainer","StyledImage","img","LabelContainer","MainMenu","set2DView","resetView","zoomView","setNavigationView","setAboutUs","modelSiteDialogVisible","setModelSiteDialogVisible","createNewProjectDialogVisible","setCreateNewProjectDialogVisible","saveProjectAsDialogVisible","setSaveProjectAsDialogVisible","updateMenuFlag","setUpdateMenuFlag","isMac","keyHome","loadFile","input","sun_angles","insolation_and_climate","solar_radiation_to_box","sun_beam_at_center","thermal_vs_building_envelope","effect_house_size","effect_house_orientation","effect_wall_roof_insulation","effect_roof_color","effect_eaves_overhang_length","effect_window_shgc","effect_thermostat_setpoint","effect_solar_panels","effect_ground_temperature","effect_trees","office_building_01","hotel_01","spanish_style_hotel","apartment_building_01","white_house","bilim_mersin_turkiye","south_burlington_high_school","mescalero_apache_school","heatmap_01","vegetative_buffer_01","solar_canopy_form_factors","solar_canopy_over_bleachers","solar_bus_stop","solar_facade_tesla","solar_canopy_over_garage","bipv_01","floatovoltaics","agrivoltaics","effect_tilt_angle_solar_panel","effect_azimuth_solar_panel","effect_azimuth_parabolic_trough","effect_latus_rectum_parabolic_trough","parabolic_dish_focus_sunlight","effect_orientation_solar_panel","solar_panel_types","vertical_bifacial_solar_panels","compare_monofacial_bifacial_solar_panels","why_solar_array","solar_panel_array_auto_layout","inter_row_spacing","rooftop_solar_panels","solar_panels_over_canal","solar_noise_barrier","rainbow_swash_solar_farm","mickey_mouse_solar_farm","solar_farm_hsat_array","solar_farm_aadat_array","solar_trackers","nevada_solar_one_parabolic_troughs","tooele_parabolic_dish_array","ps10_solar_power_tower","linear_fresnel_reflectors","linear_fresnel_reflectors_two_absorbers","effect_absorber_pipe_height","effect_azimuth_fresnel_reflector","cosine_efficiency_heliostats","shadowing_blocking_heliostats","effect_solar_power_tower_height","solar_power_tower","solar_updraft_tower","solar_updraft_tower_city","cape_cod_with_shed_dormer","mansard_roof_with_dormers","t_shaped_house","all_roof_types","a_frame_house","half_timbered_house","dutch_gable_roof","combination_roof_vs_bonnet_roof","butterfly_roof_house","gable_roof_vs_hip_roof","gable_and_valley_roof","clerestory_roof","monitor_roof","colonial_vs_saltbox","gambrel_roof_vs_mansard_roof","colonial_house","dutch_colonial_house","cape_cod_with_garage","greenhouse","solarium","pavilion","octagonal_pagoda","ocean_front","mosque_01","church_01","cathedral_01","cathedral_02","adobe_taos_house","egyptian_pyramids","mayan_pyramid","si_o_se_pol","stacked_cuboids","barn_house","ranch_house","bonnet_house","modern_house_01","solar_radiation_predicted_vs_measured","bestest_case_600","bestest_case_610","bestest_case_620","bestest_case_630","tucson_sundt_station","ai_tilt_angle_one_row","ai_tilt_angles_multiple_rows","ai_solar_farm_design","ai_solar_farm_design_block","ai_fitchburg_solar_farm","getExample","Modal","confirm","icon","ExclamationCircleOutlined","onOk","saveAndImport","okText","cancelText","loadProject","designIndex","process","viewAlreadyReset","readyToPaste","elementCounter","triggerSubMenuAction","urlId","matched","imgUrl","saveImage","hasUndo","hasRedo","elementType","undoableCut","commandName","getLastUndoName","getLastRedoName","undoableResetView","oldCameraPosition","oldPanCenter","undoableCheck","setSurfaceShininess","oldOpacity","newOpacity","gotSome","hasHeliostatOrFresnelReflectors","formatter","checkResult","WALL_EMPTY","paddingRight","Group","zhCN","zhTW","esES","trTR","ukUA","English","ChineseSimplified","ChineseTraditional","overlay","trigger","onVisibleChange","logo","alignContent","AcceptCookie","buttonText","cookieName","background","zIndex","buttonStyle","expires","MERCATOR_PROJECTION_SCALE_CONSTANT","GroundImage","zoomScale","groundImageRef","getRoadMap","keyName","lockElement","on","selectedElementType","useLabel","setLabelText","useLabelShow","useLabelText","oldLabel","useLabelFontSize","updateFontSize","oldSize","newSize","useLabelSize","updateLabelSize","useLabelColor","updateLabelColor","oldColor","newColor","useLabelHeight","updateLabelHeight","oldHeight","useSelectedElement","useColorPicker","selectedColor","setSelectedColor","colorResult","hex","Dialog","rejectedMessage","onApply","onClose","onClickOk","onClickCancel","handleClickOk","showRejectMessage","fontWeight","FoundationColorSelection","actionScope","updateInMap","updateColor","AllSelectedObjectsOfThisType","AllObjectsOfThisType","needChange","oldColorsSelected","undoableChangeSelected","oldValues","oldColorsAll","undoableChangeAll","onChangeComplete","paddingTop","FoundationLengthInput","inputValue","setInputValue","denormalizedPosMapRef","oldChildrenVerticesMapRef","newChildrenVerticesMapRef","denormalizedVerticesMapRef","rejectRef","rejectedValue","rejectChange","doesNewSizeContainAllChildren","containsAllChildren","updateLxWithChildren","newX","newY","attachToObjectGroup","updateLxInMap","setLx","oldLxsSelected","oldSizes","oldChildrenVerticesMap","newChildrenVerticesMap","ps","vs","oldLxsAll","FoundationWidthInput","denormalizedPositionMapRef","updateLyWithChildren","updateLy","oldLysSelected","oldLysAll","FoundationHeightInput","updateLzAndCzById","updateLzAndCzForAll","updateCzOfChildren","updateLzAndCzInMap","setLz","oldLzsSelected","oldLzsAll","FoundationAzimuthInput","updateAzimuth","oldAzimuthsSelected","oldAzimuthsAll","oldAzimuth","FoundationTextureSelection","selectedTexture","setSelectedTexture","updateFoundationTextureById","updateFoundationTextureForAll","updateTextureInMap","updateTexture","oldTexturesSelected","oldTexturesAll","oldTexture","Foundation_Texture_01_Menu","Foundation_Texture_02_Menu","Foundation_Texture_03_Menu","Foundation_Texture_04_Menu","Foundation_Texture_05_Menu","Foundation_Texture_06_Menu","Foundation_Texture_07_Menu","SolarAbsorberPipeHeightInput","absorberPipe","updateById","updateForAll","setAbsorberHeight","oldValuesSelected","oldValuesAll","SolarAbsorberPipeAbsorptanceInput","absorberAbsorptance","updateAbsorptance","SolarAbsorberPipeOpticalEfficiencyInput","absorberOpticalEfficiency","setOpticalEfficiency","oe","SolarAbsorberPipeThermalEfficiencyInput","absorberThermalEfficiency","setThermalEfficiency","te","SolarAbsorberPipeApertureWidthInput","updateApertureWidth","aw","SolarAbsorberPipePoleNumberInput","setPoleNumber","pn","SolarUpdraftTowerChimneyHeightInput","updateChimneyHeightById","updateChimneyHeightForAll","setChimneyHeight","SolarUpdraftTowerChimneyRadiusInput","updateChimneyRadiusById","updateChimneyRadiusForAll","setChimneyRadius","SolarUpdraftTowerCollectorRadiusInput","updateCollectorRadiusById","updateCollectorRadiusForAll","setCollectorRadius","SolarUpdraftTowerCollectorHeightInput","updateCollectorHeightById","updateCollectorHeightForAll","setCollectorHeight","SolarPowerTowerHeightInput","powerTower","setTowerHeight","SolarPowerTowerRadiusInput","setTowerRadius","SolarPowerTowerReceiverAbsorptanceInput","receiverAbsorptance","setAbsorptance","SolarPowerTowerReceiverOpticalEfficiencyInput","receiverOpticalEfficiency","updateOpticalEfficiency","SolarPowerTowerReceiverThermalEfficiencyInput","receiverThermalEfficiency","SolarUpdraftTowerCollectorTransmissivityInput","collectorTransmissivity","transmissivity","setTransmissivity","ct","SolarUpdraftTowerDischargeCoefficientInput","dischargeCoefficient","coefficient","setCoefficient","dc","SolarUpdraftTowerTurbineEfficiencyInput","turbineEfficiency","setEfficiency","SolarUpdraftTowerCollectorEmissivityInput","collectorEmissivity","emissivity","setEmissivity","ce","SolarPanelTiltAngleGaWizard","selectionMethodRef","searchMethodRef","objectiveFunctionTypeRef","YEARLY_TOTAL_OUTPUT","populationSizeRef","maximumGenerationsRef","mutationRateRef","selectionRateRef","crossoverRateRef","convergenceThresholdRef","localSearchRadiusRef","run","defaultValue","TOURNAMENT","LOCAL_SEARCH_RANDOM_OPTIMIZATION","SolarPanelTiltAnglePsoWizard","swarmSizeRef","maximumStepsRef","vmaxRef","inertiaRef","cognitiveCoefficientRef","socialCoefficientRef","PARTICLE_SWARM_OPTIMIZATION","GroundFloorRValueInput","setActionScope","toRValueInUS","inputValueUS","setInputValueUS","setValue","undoInMap","handleOk","onPressEnter","toRValueInSI","FoundationMenu","countAllOffspringsByType","colorDialogVisible","setColorDialogVisible","textureDialogVisible","setTextureDialogVisible","widthDialogVisible","setWidthDialogVisible","lengthDialogVisible","setLengthDialogVisible","heightDialogVisible","setHeightDialogVisible","azimuthDialogVisible","setAzimuthDialogVisible","rValueDialogVisible","setRValueDialogVisible","solarAbsorberPipeHeightDialogVisible","setSolarAbsorberPipeHeightDialogVisible","solarAbsorberPipeApertureWidthDialogVisible","setSolarAbsorberPipeApertureWidthDialogVisible","solarAbsorberPipePoleNumberDialogVisible","setSolarAbsorberPipePoleNumberDialogVisible","solarAbsorberPipeAbsorptanceDialogVisible","setSolarAbsorberPipeAbsorptanceDialogVisible","solarAbsorberPipeOpticalEfficiencyDialogVisible","setSolarAbsorberPipeOpticalEfficiencyDialogVisible","solarAbsorberPipeThermalEfficiencyDialogVisible","setSolarAbsorberPipeThermalEfficiencyDialogVisible","solarPowerTowerHeightDialogVisible","setSolarPowerTowerHeightDialogVisible","solarPowerTowerRadiusDialogVisible","setSolarPowerTowerRadiusDialogVisible","solarPowerTowerReceiverAbsorptanceDialogVisible","setSolarPowerTowerReceiverAbsorptanceDialogVisible","solarPowerTowerReceiverOpticalEfficiencyDialogVisible","setSolarPowerTowerReceiverOpticalEfficiencyDialogVisible","solarPowerTowerReceiverThermalEfficiencyDialogVisible","setSolarPowerTowerReceiverThermalEfficiencyDialogVisible","chimneyHeightDialogVisible","setChimneyHeightDialogVisible","chimneyRadiusDialogVisible","setChimneyRadiusDialogVisible","collectorHeightDialogVisible","setCollectorHeightDialogVisible","collectorRadiusDialogVisible","setCollectorRadiusDialogVisible","collectorTransmissivityDialogVisible","setCollectorTransmissivityDialogVisible","collectorEmissivityDialogVisible","setCollectorEmissivityDialogVisible","dischargeCoefficientDialogVisible","setDischargeCoefficientDialogVisible","turbineEfficiencyDialogVisible","setTurbineEfficiencyDialogVisible","solarPanelTiltAngleGaWizardVisible","setSolarPanelTiltAngleGaWizardVisible","solarPanelTiltAnglePsoWizardVisible","setSolarPanelTiltAnglePsoWizardVisible","updateLabelText","setLabelSize","setLabelFontSize","setLabelColor","setLabelHeight","setHvacId","hvacId","selectedSolarStructure","counterAll","counterUnlocked","editable","updateFoundationSolarStructureById","updateFoundationThermostatSetpointById","temperatureThreshold","updateFoundationTemperatureThresholdById","updateHvacIdByFoundationId","updateHvacId","isBuilding","toggleGroupMaster","toggleBuilding","ItemGroup","legalToPaste","oldLocks","undoableLockAllElements","removedElements","undoableRemoveAllWallChildren","undoableRemoveAllWindowGrandchildren","undoableRemoveAllDoorGrandchildren","undoableRemoveAllSensorChildren","undoableRemoveAllLightChildren","undoableRemoveAllSolarPanelChildren","undoableRemoveAllParabolicTroughChildren","undoableRemoveAllParabolicDishChildren","undoableRemoveAllFresnelReflectorChildren","undoableRemoveAllHeliostatChildren","undoableRemoveAllPolygonChildren","undoableRemoveAllHumanChildren","undoableRemoveAllTreeChildren","undoableRemoveAllFlowerChildren","onBlur","addonBefore","CuboidColorSelection","updateSelectedColor","updateCuboidColorBySide","updateCuboidColorById","updateCuboidColorForAll","colors","oldColors","changedSideIndex","currentColor","CuboidLengthInput","AllObjectsOfThisTypeOnSurface","AllObjectsOfThisTypeAboveFoundation","updateOnSurface","rejectMessage","CuboidWidthInput","setLy","CuboidHeightInput","updateLzAndCz","updateLzAndCzOnSurface","updateLzAndCzAboveBase","CuboidAzimuthInput","setAzimuth","CuboidTextureSelection","updateCuboidTextureBySide","updateCuboidTextureById","updateCuboidTextureInMap","updateCuboidTextureForAll","oldTextures","CuboidTexture05Icon","CuboidTexture06Icon","CuboidTexture10Icon","CuboidMenu","GroundMenu","setWaterSurface","setGroundImage","setGroundColor","setAlbedo","setMonthlyIrradianceLoss","northHemisphere","undoableRemoveAll","addonAfter","oldDay","newDay","fontFamily","oldAlbedo","newAlbedo","HumanSelection","updateHumanNameById","oldPerson","HumanMenu","animationFlag","setAnimationFlag","requestRef","previousFrameTime","firstCall","animateMove","requestAnimationFrame","tween","cancelAnimationFrame","updateHumanFlipById","yes","updateHumanObserverById","currentFrameTime","absoluteHumanOrTreeCoordinates","cam","originalPosition","Tween","easing","Easing","Quadratic","In","onUpdate","moveCamera","onComplete","FlowerSelection","updateFlowerTypeById","oldFlower","FlowerMenu","updateFlowerFlipById","PolygonLineColorSelection","oldLineColorsOnSurface","undoableChangeOnSurface","groupId","oldLineColorsAboveFoundation","undoableChangeAboveFoundation","PolygonFillColorSelection","updateElementFillColorById","updateElementFillColorOnSurface","updateElementFillColorAboveFoundation","updateElementFillColorForAll","oldFillColorsAboveFoundation","oldFillColorsOnSurface","PolygonTextureSelection","updatePolygonTextureById","updatePolygonTextureOnSurface","updatePolygonTextureAboveFoundation","updatePolygonTextureForAll","oldTexturesOnSurface","oldTexturesAboveFoundation","Polygon_Texture_01_Menu","Polygon_Texture_02_Menu","Polygon_Texture_03_Menu","Polygon_Texture_04_Menu","Polygon_Texture_05_Menu","Polygon_Texture_06_Menu","Polygon_Texture_07_Menu","Polygon_Texture_08_Menu","Polygon_Texture_10_Menu","SolarPanelLayoutRelative","base","solarPanels","calculatePolygonBounds","upDown","polygonIntersections","numberOfSegments","panel","makeUpDownSegment","changeOrientation","makeLeftRightSegment","q1","q2","shorter","SolarPanelLayoutAbsolute","rotated","verticesRotated","rotatePolygon","eastWest","g1","g2","cp","northSouth","SolarPanelLayoutWizard","warningDialogVisible","setWarningDialogVisible","changedRef","warningOkButtonRef","okButtonClickedRef","pvModelNameRef","rowAxisRef","orientationRef","tiltAngleRef","rowsPerRackRef","interRowSpacingRef","marginRef","poleHeightRef","poleSpacingRef","reference","layout","newElements","undoableLayout","oldElements","oldParams","newParams","setParams","updateStoreParams","apply","isLayoutOk","existingSolarPanels","referenceExistingSolarPanels","PolygonLineStyleSelection","selectedLineStyle","setSelectedLineStyle","updatePolygonLineStyleById","updatePolygonLineStyleOnSurface","updatePolygonLineStyleAboveFoundation","updatePolygonLineStyleForAll","setLineStyle","oldLineStylesSelected","oldLineStylesAll","oldLineStylesOnSurface","oldLineStylesAboveFoundation","oldStyle","Dotted","PolygonLineWidthSelection","selectedLineWidth","setSelectedLineWidth","oldLineWidthsSelected","oldLineWidthsAll","oldLineWidthsOnSurface","oldLineWidthsAboveFoundation","One","Two","Three","Four","Five","TabPane","Tabs","SolarPanelArrayGaWizard","constraints","minimumTiltAngleRef","maximumTiltAngleRef","minimumRowsPerRackRef","maximumRowsPerRackRef","minimumInterRowSpacingRef","maximumInterRowSpacingRef","originalSolarPanels","electricitySellingPriceRef","operationalCostPerUnitRef","defaultActiveKey","tab","DAILY_AVERAGE_OUTPUT","YEARLY_AVERAGE_OUTPUT","DAILY_PROFIT","YEARLY_PROFIT","marks","marginBottom","SolarPanelArrayPsoWizard","PolygonOpacityInput","setInput","updateOpacityById","oldValuesAboveFoundation","oldValuesOnSurface","updatedPolygon","PolygonMenu","textContent","setTextContent","textSize","setTextSize","textColor","setTextColor","textOutlineColor","setTextOutlineColor","textOutlineWidth","setTextOutlineWidth","textStrokeColor","setTextStrokeColor","textStrokeWidth","setTextStrokeWidth","lineColorDialogVisible","setLineColorDialogVisible","lineStyleDialogVisible","setLineStyleDialogVisible","lineWidthDialogVisible","setLineWidthDialogVisible","fillColorDialogVisible","setFillColorDialogVisible","opacityDialogVisible","setOpacityDialogVisible","solarPanelLayoutWizardVisible","setSolarPanelLayoutWizardVisible","solarPanelLayoutGaWizardVisible","setSolarPanelLayoutGaWizardVisible","solarPanelLayoutPsoWizardVisible","setSolarPanelLayoutPsoWizardVisible","updateFilledById","updateNoOutlineById","updateShininessById","updateTextById","updateFontSizeById","updateFontColorById","updateFontOutlineWidthById","updateFontOutlineColorById","updateFontStrokeWidthById","updateFontStrokeColorById","changeText","changeFontSize","changeFontColor","changeFontOutlineWidth","changeFontOutlineColor","changeFontStrokeWidth","changeFontStrokeColor","PolygonVertexMenu","changeVertex","oldVertices","InsertBeforeIndex","insertPolygonVertexBeforeIndex","InsertAfterIndex","insertPolygonVertexAfterIndex","SensorMenu","LightMenu","updateLightInsideById","inputIntensity","setInputIntensity","inputDistance","setInputDistance","inputColor","setInputColor","inputInside","setInputInside","updateLightColorById","updateLightIntensityById","updateLightDistanceById","setIntensity","setDistance","SkyMenu","setAxes","setTheme","setShowAzimuthAngle","setShowElevationAngle","setShowZenithAngle","setDirectLightIntensity","setAmbientLightIntensity","setAirAttenuationCoefficient","setAirConvectiveCoefficient","setHighestTemperatureTimeInMinutes","oldTheme","newTheme","oldAttenuationCoefficient","newAttenuationCoefficient","oldConvectiveCoefficient","newConvectiveCoefficient","oldMinutes","newMinutes","SolarPanelNominalSize","nominalStrings","nominalWidths","nominalHeights","cellNx","cellNy","instance","DataType","SolarPanelModelSelection","selectedPvModel","setSelectedPvModel","panelSizeString","setPanelSizeString","updateSolarPanelModelById","updateSolarPanelModelAboveFoundation","updateSolarPanelModelOnSurface","updateSolarPanelModelForAll","setPvModel","oldModelsSelected","oldModelsAll","oldModelsAboveFoundation","oldModelsOnSurface","isParentCuboid","oldModel","SolarPanelOrientationSelection","selectedOrientation","setSelectedOrientation","updateSolarPanelOrientationById","updateSolarPanelOrientationAboveFoundation","updateSolarPanelOrientationOnSurface","updateSolarPanelOrientationForAll","checkElementOnRoofState","withinParent","setOrientation","oldOrientationsSelected","oldOrientationsAll","oldOrientationsAboveFoundation","oldOrientationsOnSurface","oldOrientation","SolarPanelLengthInput","setDx","updateSolarPanelLxById","panelizeLx","updateSolarPanelLxAboveFoundation","updateSolarPanelLxOnSurface","updateSolarPanelLxForAll","setLength","oldLengthsSelected","oldLengthsAll","oldLengthsAboveFoundation","oldLengthsOnSurface","oldLength","panelize","SolarPanelWidthInput","setDy","updateSolarPanelLyById","panelizeLy","updateSolarPanelLyAboveFoundation","updateSolarPanelLyOnSurface","updateSolarPanelLyForAll","oldWidthsSelected","oldWidthsAll","oldWidthsAboveFoundation","oldWidthsOnSurface","SolarPanelTiltAngleInput","isOnWall","updateSolarPanelTiltAngleAboveFoundation","isReverse","updateSolarPanelTiltAngleOnSurface","updateSolarPanelTiltAngleForAll","setTiltAngle","oldTiltAnglesSelected","oldTiltAnglesAll","oldTiltAnglesAboveFoundation","oldTiltAnglesOnSurface","oldTiltAngle","SolarPanelRelativeAzimuthInput","updateRelativeAzimuthById","updateRelativeAzimuthOnSurface","updateRelativeAzimuthAboveFoundation","updateRelativeAzimuthForAll","setRelativeAzimuth","oldRelativeAzimuthsSelected","ra","oldRelativeAzimuthsAll","oldRelativeAzimuthsAboveFoundation","oldRelativeAzimuthsOnSurface","oldRelativeAzimuth","SolarPanelTrackerSelection","selectedTrackerType","setSelectedTrackerType","updateSolarPanelTrackerTypeById","updateSolarPanelTrackerTypeAboveFoundation","updateSolarPanelTrackerTypeOnSurface","updateSolarPanelTrackerTypeForAll","setTrackerType","tracker","oldTrackerTypesSelected","tt","oldTrackerTypesAll","oldTrackerTypesAboveFoundation","oldTrackerTypesOnSurface","oldTrackerType","SolarPanelPoleHeightInput","updatePoleHeightById","updatePoleHeightOnSurface","updatePoleHeightAboveFoundation","updatePoleHeightForAll","setPoleHeight","oldPoleHeightsSelected","oldPoleHeightsAll","oldPoleHeightsAboveFoundation","oldPoleHeightsOnSurface","oldPoleHeight","SolarPanelPoleSpacingInput","updateSolarPanelPoleSpacingById","updateSolarPanelPoleSpacingAboveFoundation","updateSolarPanelPoleSpacingOnSurface","updateSolarPanelPoleSpacingForAll","setPoleSpacing","oldPoleSpacingsSelected","oldPoleSpacingsAll","oldPoleSpacingsAboveFoundation","oldPoleSpacingsOnSurface","oldPoleSpacing","SolarPanelFrameColorSelection","updateSolarPanelFrameColorById","updateSolarPanelFrameColorAboveFoundation","updateSolarPanelFrameColorOnSurface","updateSolarPanelFrameColorForAll","setFrameColor","oldFrameColorsSelected","fc","oldFrameColorsAll","oldFrameColorsAboveFoundation","oldFrameColorsOnSurface","oldFrameColor","SolarPanelInverterEfficiencyInput","inverterEfficiency","updateInverterEfficiencyById","updateInverterEfficiencyAboveFoundation","updateInverterEfficiencyOnSurface","updateInverterEfficiencyForAll","setInverterEfficiency","SolarPanelDcToAcRatioInput","inputDcToAcRatioRef","dcToAcRatio","updateDcToAcRatioById","updateDcToAcRatioAboveFoundation","updateDcToAcRatioOnSurface","updateDcToAcRatioForAll","setDcToAcRatio","ok","SolarPanelMenu","setPvModelDialogVisible","orientationDialogVisible","setOrientationDialogVisible","inverterEfficiencyDialogVisible","setInverterEfficiencyDialogVisible","dcAcRatioDialogVisible","setDcAcRatioDialogVisible","tiltDialogVisible","setTiltDialogVisible","trackerDialogVisible","setTrackerDialogVisible","poleHeightDialogVisible","setPoleHeightDialogVisible","poleSpacingDialogVisible","setPoleSpacingDialogVisible","frameColorDialogVisible","setFrameColorDialogVisible","ParabolicTroughLengthInput","updateLyById","updateLyAboveFoundation","updateLyForAll","modularize","ParabolicTroughWidthInput","updateLxById","updateLxAboveFoundation","updateLxForAll","ParabolicTroughPoleHeightInput","pt","ParabolicTroughLatusRectumInput","updateLatusRectumById","updateLatusRectumAboveFoundation","updateLatusRectumForAll","setLatusRectum","oldLatusRectumsSelected","oldLatusRectumsAll","oldLatusRectumsAboveFoundation","oldLatusRectum","ParabolicTroughModuleLengthInput","setModuleLength","oldModuleLengthsSelected","ml","oldModuleLengthsAll","oldModuleLengthsAboveFoundation","oldModuleLength","ParabolicTroughReflectanceInput","updateAboveFoundation","setReflectance","oldReflectancesSelected","rf","oldReflectancesAll","oldReflectancesAboveFoundation","oldReflectance","ParabolicTroughAbsorptanceInput","oldAbsorptancesSelected","oldAbsorptancesAll","oldAbsorptancesAboveFoundation","oldAbsorptance","ParabolicTroughOpticalEfficiencyInput","oldOpticalEfficienciesSelected","oldOpticalEfficienciesAll","oldOpticalEfficienciesAboveFoundation","oldOpticalEfficiency","ParabolicTroughThermalEfficiencyInput","oldThermalEfficienciesSelected","oldThermalEfficienciesAll","oldThermalEfficienciesAboveFoundation","oldThermalEfficiency","ParabolicTroughMenu","moduleLengthDialogVisible","setModuleLengthDialogVisible","latusRectumDialogVisible","setLatusRectumDialogVisible","reflectanceDialogVisible","setReflectanceDialogVisible","absorptanceDialogVisible","setAbsorptanceDialogVisible","opticalEfficiencyDialogVisible","setOpticalEfficiencyDialogVisible","thermalEfficiencyDialogVisible","setThermalEfficiencyDialogVisible","ParabolicDishDiameterInput","setDiameter","oldDiametersSelected","di","oldDiametersAll","oldDiametersAboveFoundation","oldDiameter","ParabolicDishPoleHeightInput","ParabolicDishLatusRectumInput","ParabolicDishReflectanceInput","ParabolicDishAbsorptanceInput","pd","ParabolicDishOpticalEfficiencyInput","ParabolicDishThermalEfficiencyInput","ParabolicDishStructureTypeInput","inputStructureType","setInputStructureType","setStructureType","oldStructureTypesSelected","st","oldStructureTypesAll","oldStructureTypesAboveFoundation","oldStructureType","ParabolicDishPoleRadiusInput","updatePoleRadiusById","updatePoleRadiusAboveFoundation","updatePoleRadiusForAll","setPoleRadius","ParabolicDishMenu","structureTypeDialogVisible","setStructureTypeDialogVisible","diameterDialogVisible","setDiameterDialogVisible","poleRadiusDialogVisible","setPoleRadiusDialogVisible","FresnelReflectorLengthInput","FresnelReflectorWidthInput","FresnelReflectorPoleHeightInput","inputPoleHeightRef","fr","FresnelReflectorModuleLengthInput","FresnelReflectorReflectanceInput","FresnelReflectorAbsorberSelection","selectedReceiverId","setSelectedReceiverId","pipes","pipeIds","setReceiverId","ti","FresnelReflectorDrawSunBeamSelection","sunBeam","setSunBeam","setDrawSunBeam","sb","FresnelReflectorMenu","receiverDialogVisible","setReceiverDialogVisible","sunBeamDialogVisible","setSunBeamDialogVisible","HeliostatWidthInput","HeliostatLengthInput","HeliostatPoleHeightInput","hs","HeliostatReflectanceInput","HeliostatDrawSunBeamSelection","HeliostatTowerSelection","selectedTowerId","setSelectedTowerId","towers","towerIds","setTowerId","HeliostatPoleRadiusInput","oldPoleRadius","HeliostatMenu","towerDialogVisible","setTowerDialogVisible","TreeSelection","updateTreeTypeById","oldTree","AppleImage","BirchImage","DogwoodImage","ElmImage","LindenImage","MagnoliaImage","MapleImage","OakImage","TreeMenu","inputSpread","setInputSpread","inputHeight","setInputHeight","updateTreeShowModelById","updateTreeFlipById","showTreeModel","setSpread","setHeight","WallTextureSelection","updateConnectedWalls","connectedWalls","AllConnectedObjects","wt","oldValuesConnectedWalls","undoableChangeConnectedWalls","wh","updatedWall","WallTextureDefaultIcon","WallTexture01Icon","WallTexture02Icon","WallTexture03Icon","WallTexture04Icon","WallTexture05Icon","WallTexture06Icon","WallTexture07Icon","WallTexture08Icon","WallTexture09Icon","WallTexture10Icon","WallColorSelection","onColorChange","oldColorsAboveFoundation","WallStructureColorSelection","WallNumberInput","dataType","attributeKey","unit","inputRef","updateActionState","updateValue","toString","WallRValueInput","WallHeatCapacityInput","WallParapetNumberInput","WallParapetColorSelection","WallParapetTextureSelection","WindowDataType","DialogSetting","ParapetDialogSetting","WallMenu","updateElementUnlockByParentId","setDataType","heatCapacityDialogVisible","setHeatCapacityDialogVisible","updateParapetDisplayById","updateWallStructureById","updateWallFillById","updateOpenToOutsideById","openToOutside","renderMenuItem","renderClearItem","titleText","objectTypeText","replaceAll","undoableRemoveAllChildren","handleClearOk","renderLockItem","undoableLockAllElementsOfType","renderUnlockItem","undoableUnlockAllElementsOfType","renderInsideLightItem","undoableInsideLightsOnWall","setting","renderDialogs","renderElementsSubMenu","plain","renderStructureSubMenu","DoorTextureSelection","updateTextureById","undoTextureInMap","oldTexturesOnSameWall","undoableChangeOnSameWall","updatedDoor","DoorTextureDefaultIcon","DoorTexture01Icon","DoorTexture02Icon","DoorTexture03Icon","DoorTexture04Icon","DoorTexture05Icon","DoorTexture06Icon","DoorTexture07Icon","DoorTexture08Icon","DoorTexture09Icon","DoorTexture10Icon","DoorTexture11Icon","DoorTexture12Icon","DoorTexture13Icon","DoorTexture14Icon","DoorTexture15Icon","DoorTexture16Icon","DoorTexture17Icon","DoorColorSelection","updateColorById","updateColorInMap","undoColorInMap","oldColorsOnSameWall","DoorUValueInput","toUValueInUS","toUValueInSI","DoorWidthInput","currentValue","DoorHeightInput","DoorHeatCapacityInput","DoorOpacityInput","DoorFrameColorSelection","DoorMenu","uValueDialogVisible","setUValueDialogVisible","updateDoorTypeById","updateDoorFilledById","updateInteriorById","WindowColorSelection","selectedItem","onItemChange","updateOnSameWall","WindowNumberInput","note","digit","oldValuesOnSameWall","undoableChangeOnSameParent","WindowUValueInput","WindowOptionSelection","optionsText","selectedOption","setSelectedOption","WindowBooleanSelection","setSelected","Operation","ColorDialogSettings","BooleanDialogSettings","OptionDialogSettings","NumberDialogSettings","WindowMenu","updateEmptyWindowById","RoofTextureSelection","updatedRoof","RoofTexture01Icon","RoofTexture02Icon","RoofTexture03Icon","RoofTexture04Icon","RoofTexture05Icon","RoofTexture06Icon","RoofTexture07Icon","RoofColorSelection","RoofThicknessInput","inputLength","setInputLength","setThickness","oldThicknessSelected","oldThicknessAll","oldThicknessAboveFoundation","oldThickness","RoofRafterSpacingInput","updateRoofRafterSpacingById","setRafterSpacing","oldSpacingSelected","oldSpacingAll","oldSpacingAboveFoundation","oldSpacing","RoofOpacityInput","GlassTintSelection","selectedTint","setSelectedTint","updateTintById","undoTintInMap","setTint","oldTintsAll","oldTintsAboveFoundation","oldTint","RoofRafterWidthInput","oldValSelected","oldValAll","oldValAboveFoundation","RoofSideColorSelection","selectedSideColor","setSelectedSideColor","updateSideColorById","updateSideColorInMap","undoSideColorInMap","setSideColor","RoofRValueInput","RoofRiseInput","setRise","RoofHeatCapacityInput","CeilingRValueInput","RoofMenu","rafterSpacingDialogVisible","setRafterSpacingDialogVisible","rafterWidthDialogVisible","setRafterWidthDialogVisible","rafterColorDialogVisible","setRafterColorDialogVisible","riseDialogVisible","setRiseDialogVisible","thicknessDialogVisible","setThicknessDialogVisible","roofColorDialogVisible","setRoofColorDialogVisible","roofSideColorDialogVisible","setRoofSideColorDialogVisible","glassTintDialogVisible","setGlassTintDialogVisible","roofRValueDialogVisible","setRoofRValueDialogVisible","ceilingRValueDialogVisible","setCeilingRValueDialogVisible","undoableInsideLightsOnRoof","updateRoofCeiling","DropdownContextMenu","contextMenu","Column","Table","ColumnWrapper","Header","CloudFilePanel","cloudFileArray","openCloudFile","deleteCloudFile","renameCloudFile","nodeRef","wrapperRef","wOffset","hOffset","curPosition","setCurPosition","renameDialogVisible","setRenameDialogVisible","oldTitle","setOldTitle","newTitle","setNewTitle","setUserid","filesRef","recountFlag","setRecountFlag","Search","innerWidth","innerHeight","closePanel","renameFile","placeholder","WarningOutlined","onDrag","ui","onStop","allowClear","enterButton","onSearch","dataSource","scroll","pagination","defaultPageSize","showSizeChanger","pageSizeOptions","dataIndex","sortDirections","sorter","localeCompare","record","onCell","defaultSortOrder","DeleteImage","QuestionCircleOutlined","deleteFile","CopyOutlined","url","LikesPanel","likesArray","rowKey","PublishedModelsPanel","publishedModels","AccountSettingsPanel","schoolIdRef","schoolID","classIdRef","classID","superuser","endsWith","likes","published","SCHOOL1","SCHOOL2","SCHOOL3","SCHOOL4","SCHOOL5","CLASS1","CLASS2","CLASS3","CLASS4","CLASS5","CLASS6","CLASS7","CLASS8","CLASS9","aliases","Panel","Collapse","getIconUrl","site","selectAuthor","closeMap","openModel","deleteModel","likeModel","pinModel","mapWeatherStations","setMap","selectedSite","setSelectedSite","selectedLocation","setSelectedLocation","ascendingOrder","setAscendingOrder","previousSiteRef","markersRef","selectedMarkerIndexRef","cities","imageSize","ifiUser","onLoad","google","maps","LatLng","loadCities","setMapTypeId","onUnmount","openModelSite","likeModelSite","modelKey","getModelKey","liked","modelsOfSite","getLatLngKey","likeCount","getLikeCount","getClickCount","clickCount","isPinned","pinned","pinModelSite","mapContainerStyle","mapTypeId","styles","featureType","stylers","visibility","tilt","onCenterChanged","getCenter","undoableChangeLocation","oldLatitude","newLatitude","oldLongitude","newLongitude","onZoomChanged","getZoom","onTiltChanged","getTilt","onMapTypeIdChanged","typeId","getMapTypeId","SymbolPath","CIRCLE","strokeWeight","maxHeight","overflowY","onMouseLeave","borderBottom","DownCircleOutlined","UpCircleOutlined","modelA","modelB","timeCreated","svg","bordered","ghost","header","PushpinOutlined","align","thumbnailUrl","author","PushpinFilled","shareModelSite","marker","DeleteIcon","EmptyHeartIcon","clusterer","iconUrl","models","closeCallback","modelsRef","selectedModel","setSelectedModel","countModels","dark","mask","headerStyle","bodyStyle","scrollbarColor","placement","PRESENTED_IMAGE_SIMPLE","extra","LeftCircleOutlined","RightCircleOutlined","loading","onError","libraries","ModelsMapWrapper","deleteModelFromMap","likeModelFromMap","pinModelFromMap","peopleModelsRef","selectedAuthor","setSelectedAuthor","authorModelsRef","searchBox","useJsApiLoader","googleMapsApiKey","isLoaded","loadError","modelSitesCount","boxShadow","onPlacesChanged","places","getPlaces","oldAddress","newAddress","formatted_address","boxSizing","outline","textOverflow","countA","countB","UserOutlined","userSelect","VerticalAlignBottomOutlined","VerticalAlignTopOutlined","ToolBarButton","MainToolBarButtons","groupAction","category1Flag","setCategory1Flag","category2Flag","setCategory2Flag","category3Flag","setCategory3Flag","defaultFilter","selectFilter","resetToSelectMode","setMode","menuItem","srcImg","setFlag","replacingText","charAt","replace","buttonImg","addedElemId","needLock","needToLock","onDoubleClick","dropdownButton","category1Menu","FoundationImage","CuboidImage","TreeImage","FlowerImage","HumanImage","category2Menu","WallImage","WindowImage","DoorImage","PyramidRoofImage","HipRoofImage","GableRoofImage","GambrelRoofImage","MansardRoofImage","category3Menu","SolarPanelImage","ParabolicTroughImage","ParabolicDishImage","FresnelReflectorImage","HeliostatImage","SensorImage","LightImage","category1Button","category2Button","category3Button","undoableClearContent","ButtonsContainer","MainToolBar","signIn","signOut","photoURL","SaveCloudFileModal","saveToCloud","isLoading","setTitle","getTitle","setTitleDialogVisible","isTitleDialogVisible","confirmLoading","ProjectListPanel","projects","deleteProject","renameProject","projectsRef","setSelectedIndex","changeProjectTitle","onMouseEnter","menuInfo","domEvent","confirmDeleteProject","CaretDownOutlined","useFlag","CloudManager","publishOnMapFlag","setLoading","setCloudFileArray","projectArray","setProjectArray","updateProjectArrayFlag","setUpdateProjectArrayFlag","titleDialogVisible","cloudFiles","myProjects","firstAccountSettings","initialize","apps","LOG_DATA","initializeApp","apiKey","authDomain","projectId","storageBucket","databaseURL","messagingSenderId","appId","app","auth","onAuthStateChanged","handlePopStateEvent","fetchModelSites","fetchLatest","fetchPeopleModels","storageRef","storage","resizeCanvas","toBlob","uploadTask","put","contentType","TaskEvent","STATE_CHANGED","snapshot","progress","bytesTransferred","totalBytes","getDownloadURL","downloadURL","m2","merge","latestModel","fetchMyProjects","exist","finally","listMyProjects","fetchMyCloudFiles","projectOwner","increment","saveToCloudWithoutCheckingExistence","addDesignToProject","saveAccountSettings","openDesignFile","registerUser","noLogging","querySnapshot","docs","docData","since","existing","deleteFromModelsMap","successCallback","arrayRemove","likeModelsMap","like","likeCountPath","pinModelsMap","countClicksModelsMap","silent","checkExistence","openCloudFileWithSaveReminder","openCloudFileWithSaveReminderFromMap","provider","GoogleAuthProvider","signInWithPopup","files","newData","newArray","ActionLogger","firstCallUndo","firstCallAction","databaseRef","database","positionExtent","cameraExtent","shadow","VerticalRuler","textGeometryParamsTickLabel","rulerLength","getRulerLength","heightText","getHeightText","textPositionZ","textGeometry","Auxiliary","gridSize","setGridSize","gridDivisions","setDivisions","divisions","changeHeight","showPolarGridByHover","showVerticalRuler","isTopResizeHandleOfWall","isRiseHandleOfRoof","showVerticalRulerHelper","BLACK","WHITE","Compass","canvasRef","CANVAS_SIZE","devicePixelRatio","FONT","pointerLength","pointerHalfWidth","outerRingRadius","outerRingWidth","innerRingRadius","innerRingWidth","fontToEdge","arc","strokeStyle","stroke","fillText","save","translate","rotate","restore","pointerEvents","MoveDirection","groupedElementsIdSet","childCuboidSet","initalPosition","initalDimension","initalRotation","aspectRatio","lockAspectRatio","intersectionPlanePositionRef","intersectionPlaneRotationRef","resizeAnchorRef","elementHeightMapRef","wallRelPointsMapRef","partialWallHeightMapRef","skylightRelPosMapRef","baseRelPosMapRef","baseRotationMapRef","basePosRatioMapRef","baseDmsRatioMapRef","resizerCenterRelPosRef","foundatonOldDataMapRef","wallOldPointsMapRef","elementOldHeightMapRef","oldPartialWallHeightMapRef","oldSkyligthPosMapRef","setHx","setHy","operation","setOperation","setDimension","setCommonStoreHandleType","updateUndoableResizeXY","foundationDataMap","wallPointsMap","skyligthPosMap","updateUndoableResizeZ","heightMap","partialWallHeightMap","partialWallHeight","updateFoundationGroupPosition","pointerDownBottomResizeHandle","positionV2","ResizeXY","currLx","currLy","leftPointRelative","rightPointRelative","pointerDonwTopResizeHandle","ResizeZ","bottomHanldeZ","topHanldeZ","moveHanldeX","moveHnadleY","resizeHandleY","RotateLower","RotateUpper","resizerCenter","elemCenter","diagonalDistance","tempWorldDataMap","posRatio","dmsRatio","parentWorldData","relativePosition","leftRelPoint","rightRelPoint","heightRatio","resizeZ","rotateAngle","groupSize","oldCenter","foundationNewDataMap","wallNewPointsMap","newSkylightPosMap","undoableReizeXY","oldFoundationDataMap","newFoundationDataMap","oldSkylightPosMap","addUndoableResizeXY","newHeightMap","newPartialWallHeightMap","undoableResizeZ","oldElementHeightMap","newElementHeightMap","oldPartialWallHeightMap","addUndoableReseizeZ","isBaseElement","bId1","bId2","verticesMap","GroupMasterController","selectedBaseElements","baseIdSet","getSelectedBaseElements","allBaseElements","allBaseElementsVerticesMap","cuboidParentIdMap","getElementsData","groupIdSet","groupElements","selectedBase","checkOverlapWithOtherBases","groupElementsVertices","flat","childCuboidIdSet","bound","maxChildHeight","maxBaseZ","getCuboidParentId","getGroupedBasesData","baseElement","pId","GroupMasterWrapper","_defs","_path","_path2","_path3","_path4","_path5","_path6","AutoDeletionListener","handleUndoAutoDeletion","manualDeletedElements","manualCutElements","listenToAutoDeletionByCut","listenToAutoDeletionByDelete","combined","undoName","undoableDeleteMultiple","handleKeys","KeyboardListener","removeElement","isNewPositionOk","getElementsToBeMoved","elementsToBeMoved","lastSelectedType","filtered","selectedType","currType","isSameTypeGroup","canBeMovedIn2DMode","allBases","checkBaseOverlap","getElementNewPosition","displacement","Up","Down","updateMoveInMap","elementDisplacementMap","newLeftPoint","newRightPoint","updateMovementForAll","getOppositeDirection","moveByKey","displacementRel","halfLx","halfLy","undoableMoveSelected","movedElementsDisplacementMap","undoableMoveAll","setMultiSelectionMode","toggle2DView","toggleNatigationView","toggleAutoRotate","foundations","foundationsIdSet","ifNeedTriggerAutoDeletion","undoableDelete","keyNameRef","handleEventType","onKeyEvent","handleKeyUp","SceneRadiusCalculator","components","fetchAabbElements","boxes","setFromObject","box","getWorldDirection","setCompassRotation","dircXY","deg","transform","CameraController","enabledNavigationControls","cameraPositionLength","panRadius","minPan","maxPan","initialOrbitCamera","initialOrbitDomElement","orbitControlRef","persCameraRef","orthCameraRef","onInteractionStart","onInteractionEnd","oc","positionNav","rotationNav","getVector","updateMatrixWorld","orbitControl","orthCam","persCam","targetPosition","compassMounted","PerspectiveCamera","far","OrthographicCamera","ShareLinkContainer","ShareLinks","handleShareWindowClose","via","TwitterShareButton","onShareWindowClose","TwitterIcon","FacebookShareButton","quote","FacebookIcon","RedditShareButton","RedditIcon","LineShareButton","LineIcon","LinkedinShareButton","summary","LinkedinIcon","WhatsappShareButton","WhatsappIcon","Individual","randomize","discretizationSteps","chromosome","fitness","random","individual","Parents","dad","mom","Population","chromosomeLength","individuals","savedGeneration","violations","beta","survivors","mutants","compare","sigma","nicheCount","share","copyGenes","best","selectSurvivors","crossover","imax","numberOfSurvivers","lowestFitness","sumOfFitness","newBorn","oldFolks","selectParentsByTournament","selectParentsByRouletteWheel","childIndex","child1","child2","getGene","mi","setGene","roulettWheelPosition","spinWheel","n1","OptimizerGa","population","minima","maxima","fitnessSharingRadius","stopped","fittestOfGenerations","populationOfGenerations","outsideGenerationCounter","computeCounter","converged","geneNames","setMinMax","Random","SolarPanelTiltAngleOptimizerGa","firstBorn","normalizedValue","gaussian","getFittest","gene","individualToString","indexOfIndividual","getCopy","generation","savedIndividual","saveGenes","evolve","detectViolations","restoreGenes","isNominallyConverged","mutate","SolarPanelTiltAngleGa","geneLabels","setGeneLabels","evolutionCompletedRef","pauseRef","solarPanelsRef","optimizerRef","individualIndexRef","convergedRef","initialSolarPanelsRef","runCallback","osp","startEvolving","evolveIndividual","getTotal","updateResults","applyFittest","translateIndividual","lastStep","fg","trimmed","SolarPanelArrayOptimizerGa","initialSolarPanels","initialLayoutParams","solarRackCount","setInterRowSpacingBounds","gene1","gene2","gene3","getObjectiveUnit","SolarPanelArrayGa","economics","currentLayoutParams","solarPanelArrayRef","initialSolarPanelArrayRef","translateBest","translateIndividualByIndex","Particle","velocity","bestPositionOfParticle","Swarm","particles","bestPositionOfSwarm","bestFitness","OptimizerPso","particleDimension","swarm","bestPositionOfSteps","bestFitnessOfSteps","swarmOfSteps","outsideStepCounter","SolarPanelTiltAngleOptimizerPso","firstParticle","particle","particleToString","indexOfParticle","updateBestPosition","savedParticle","moveSwarm","SolarPanelTiltAnglePso","setFittestParticleResults","particleLabels","setParticleLabels","particleIndexRef","updateParticle","bestPosition","translateParticle","ss","SolarPanelArrayOptimizerPso","relativeMargin","normalizedInterRowSpacing","normalizedRowsPerRack","translatePosition","SolarPanelArrayPso","translateParticleByIndex","NavigationController","GroundMap","updateAddress","latlng","Geocoder","geocode","GeocoderStatus","address_components","types","short_name","throttle","leading","trailing","MapPanel","HeliodonPanel","runSimulation","sunriseAndSunsetInMinutes","continuous","totalMinutes","setHours","setDate","changeTime","onLatitudeChangeRef","moment","toDate","setFullYear","setMonth","tooltipVisible","_extends","assign","arguments","prototype","call","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","SvgMenu","_ref","svgRef","titleId","viewBox","xmlns","xmlnsXlink","Direction","ForwardRef","StyledMenuSVG","MenuSVG","BarGraphMenu","horizontalGrid","verticalGrid","changeHorizontalGrid","changeVerticalGrid","setVisible","BarGraph","dataKeyAxisX","labelX","labelY","yMin","yMax","fractionDigits","referenceX","dataSetCount","setDataSetCount","horizontalGridLines","setHorizontalGridLines","verticalGridLines","setVerticalGridLines","legendDataKey","setLegendDataKey","getBars","bars","MonthlyTemperatures","HourlyTemperatures","DaylightData","ClearnessData","DailyRadiationSensorData","YearlyRadiationSensorData","Bar","dataKey","isAnimationActive","ResponsiveContainer","BarChart","Tooltip","CartesianGrid","vertical","horizontal","ReferenceLine","XAxis","YAxis","domain","Legend","iconType","SYMBOLS","CircleSymbol","numberOfSymbols","fillColor","interval","SquareSymbol","TriangleSymbol","pointsString","UP","DiamondSymbol","StarSymbol","HexagonSymbol","createSymbol","DOWN","LineGraphMenu","lineCount","symbolSize","changeLineWidth","changeSymbolSize","LineGraph","chartType","curveType","symbolCount","setLineCount","setSymbolSize","getRepresentations","defaultSymbol","representations","DailyPvYield","YearlyPvYield","DailyParabolicTroughYield","YearlyParabolicTroughYield","DailyParabolicDishYield","YearlyParabolicDishYield","DailyFresnelReflectorYield","YearlyFresnelReflectorYield","DailyHeliostatYield","YearlyHeliostatYield","DailyUpdraftTowerYield","YearlyUpdraftTowerYield","symbol","isMeasured","Area","strokeDasharray","onMouseEnterLegend","onMouseLeaveLegend","AreaChart","LineChart","wrapperStyle","WeatherPanel","graphs","panelRect","resizeObserverRef","handleWindowResize","ResizeObserver","offsetWidth","offsetHeight","observe","disconnect","responsiveHeight","getData","Sunshine","yNames","yUnits","YearlyLightSensorPanel","sensorData","daylightGraph","clearnessGraph","radiationGraph","setRadiationGraph","emptyGraph","Clearness","alignSelf","CaretRightOutlined","ReloadOutlined","CameraOutlined","SaveOutlined","DailyLightSensorPanel","StickyNotePanel","setText","resize","InstructionPanel","navigation","CloseOutlined","undoableAction","YearlyPvYieldPanel","individualOutputs","setSum","panelSumRef","yearScaleFactor","totalYield","totalCost","totalRevenue","totalProfit","checkedChildren","UnorderedListOutlined","unCheckedChildren","DailyPvYieldPanel","DesignInfoPanel","solarPanelDailyYield","countAllChildSolarPanels","countAllChildSolarPanelDailyYields","countAllChildElementsByType","daytime","getBuildingArea","SiteInfoPanel","dailyTemperatures","setDailyTemperatures","currentTemperature","setCurrentTemperature","minutesIntoDay","VisualizationControlPanel","VisibilityResultsPanel","resultArray","setResultArray","fieldString","field","itemized","YearlyParabolicTroughYieldPanel","troughSumRef","DailyParabolicTroughYieldPanel","DailyParabolicDishYieldPanel","dishSumRef","YearlyParabolicDishYieldPanel","DailyFresnelReflectorYieldPanel","reflectorSumRef","YearlyFresnelReflectorYieldPanel","DailyHeliostatYieldPanel","heliostatSumRef","YearlyHeliostatYieldPanel","SutBiaxialLineGraph","labelY1","labelY2","unitY1","unitY2","yMin1","yMax1","yMin2","yMax2","getLines","yAxisId","DailySolarUpdraftTowerYieldPanel","dailyResults","towerSumRef","towerCount","labelHour","labelYield","labelTemperature","labelSpeed","DiurnalTemperaturePanel","PartonLogan","newModel","YearlySolarUpdraftTowerYieldPanel","EvolutionBiaxialLineGraph","payloadRef","fittestLineCount","totalLineCount","lastFittestLineIndex","individualCount","varIndex","active","payload","SolarPanelOptimizationResult","labelAxisX","labelVariable","labelObjective","buttonEnabled","hint","representationName","EconomicsPanel","oldPrice","newPrice","oldCost","newCost","useDailyEnergySorter","hasSolarPanels","dataLabels","sumHeaterMapRef","sumAcMapRef","sumSolarPanelMapRef","energy","onBuildingEnvelope","exchange","energyUsage","geothermal","adjustedHeat","adjustedAc","heaterId","acId","solarId","netId","sumHeaterMap","sumAcMap","sumSolarPanelMap","BuildingEnergyGraphMenu","barCategoryGap","changeBarCategoryGap","BuildingEnergyGraph","buildingCount","setBuildingCount","buildingId","setBuildingId","setBarCategoryGap","barStrokeColor","stackId","ComposedChart","stackOffset","barGap","DailyBuildingEnergyPanel","runDailySimulation","setData","heaterSum","setHeaterSum","acSum","setAcSum","solarPanelSum","setSolarPanelSum","netSum","setNetSum","setLabels","tooltipHeaterBreakdown","tooltipAcBreakdown","tooltipSolarPanelBreakdown","tooltipNetBreakdown","clearResults","sumHeater","sumAc","sumSolarPanel","multiple","net","countBuildings","YearlyBuildingEnergyPanel","runYearlySimulation","monthInterval","resultRef","heaterSumRef","acSumRef","solarPanelSumRef","netSumRef","indexOfMonth","heaterMap","acMap","solarPanelMap","netMap","totalHeater","totalAc","totalSolarPanel","totalNet","bid","NavigationPanel","minimumMoveSpeed","minimumTurnSpeed","minimumMoveSpeedRef","minimumTurnSpeedRef","setMinimumMoveSpeed","setMinimumTurnSpeed","oldMoveSpeed","newMoveSpeed","oldTurnSpeed","newTurnSpeed","worldLongitude","setCity","SolarRadiation","distanceToClosestObject","rooftop","walltop","zRot","an","dr","dCell","z0","center2d","cellOutputs","normalEuler","qRotAADAT","qRotHSAT","TILTED_SINGLE_AXIS_TRACKER","SPHERE_MODEL","indirectRadiation","v2d","dv","ky","min1","PARTIAL","min2","dxcos","dxsin","polygonWithMargin","kx2","kz2","absWindowPos","absDoorPos","insidePolygon","unitArea","absWallAngle","dis","withoutOverhang","computeFlatRoofSolarRadiationEnergy","segmentIntensities","segmentUnitAreas","relativePolygon","within","isPointRoof","segmentUnitArea","h0","getAbsoluteWindowVerticesOnRoof","getAbsoluteSolarPanelVerticesOnRoof","ThermalSimulation","pauseDailySimulation","pauseYearlySimulation","simulationCompletedRef","originalDateRef","sampledDayRef","pausedDateRef","dayRef","outsideTemperatureRangeRef","currentOutsideTemperatureRef","currentGroundTemperatureRef","hourlyHeatExchangeArrayMapRef","hourlySolarHeatGainArrayMapRef","hourlySolarPanelOutputArrayMapRef","objectsRef","intersectionsRef","sunDirectionRef","sunMinutesRef","scaleFactorRef","solarHeatmapRef","minuteInterval","fetchObjects","updateHeatExchangeNow","resetHourlyMaps","resetSolarHeatMaps","initDaily","calculateDaily","staticCalculateDaily","computeNow","setTime","finishDaily","monthIndex","setMonthIndex","initYearly","simulateYearly","currentTime","updateTemperature","calculateDoor","calculateWindow","calculateSolarHeatGain","calculateWall","calculateRoof","calculateFloor","calculateSolarPanel","computeSolarPanelOutput","factor","temperature","getPanelEfficiency","getTimeFactor","getElementFactor","output","updateSolarPanelOutputNow","solarHeatmap","deltaT","totalSolarHeat","computeRoofWindowSolarRadiationEnergy","computeWallWindowSolarRadiationEnergy","gain","updateSolarHeatGainNow","absorption","computeDoorSolarRadiationEnergy","extraT","filledArea","rectangular","computeWallSolarRadiationEnergy","floorArea","calculateAtticTemperature","outsideTemperature","roofU","ceilingU","roofSegmentResults","calculatePyramidRoof","calculateHipRoof","calculateGableRoof","calculateGambrelRoof","calculateMansardRoof","segmentResult","segmentHeatExchange","surfaceTemperature","totalArea","totalAreas","totalSolarHeats","computePyramidRoofSolarRadiationEnergy","heatmapResults","areas","computeHipRoofSolarRadiationEnergy","computeGambrelRoofSolarRadiationEnergy","iw","computeMansardRoofSolarRadiationEnergy","computeGableRoofSolarRadiationEnergy","StaticSolarRadiationSimulation","generateHeatmaps","inShadow","generateHeatmapForFoundation","generateHeatmapForSolarUpdraftTower","generateHeatmapForCuboid","generateHeatmapForSolarPanel","generateHeatmapForWall","generateHeatmapForDoor","generateHeatmapForPyramidRoof","generateHeatmapForGableRoof","generateHeatmapForGambrelRoof","generateHeatmapForMansardRoof","generateHeatmapForHipRoof","worldData","topCellOutputTotals","southCellOutputTotals","northCellOutputTotals","westCellOutputTotals","eastCellOutputTotals","normalTop","normalSouth","normalNorth","normalWest","normalEast","vec","southY","northY","westX","eastX","transpose","scaleFactor","applyScaleFactor","cellOutputTotals","rsq","generateHeatmapForFlatRoof","DynamicSolarRadiationSimulation","cellOutputsMapRef","simulate","setCuboidHeatmap","clone2DArray","updateHeatmaps","calculateFresnelReflector","calculateHeliostat","calculateFoundation","calculateSolarUpdraftTower","calculateCuboid","calculateParabolicTrough","calculateParabolicDish","cellOutputsTop","cellOutputsSouth","cellOutputsNorth","cellOutputsWest","cellOutputsEast","calculateFlatRoof","originalNormal","zRotZero","qRot","tmpX","disX","areaRatio","lr2","ku","kv","tmpY","disY","reflectorToReceiver","heliostatToReceiver","ParabolicTroughSimulation","setDailyYield","updateDailyYield","setYearlyYield","updateYearlyYield","dailyIndividualOutputs","yearlyIndividualOutputs","dailyOutputsMapRef","yearlyOutputsMapRef","daysInYear","simulateDaily","resetDailyOutputsMap","details","calculateYield","timeFactor","generateDailyYieldData","resetYearlyOutputsMap","finishMonthly","generateYearlyYieldData","getTimeFactorByMonth","sumDaily","resultArr","troughId","yearlyResult","ParabolicDishSimulation","dishId","FresnelReflectorSimulation","systemEfficiency","reflectorId","HeliostatSimulation","heliostatId","SolarUpdraftTowerSimulation","setDailyResults","showDailyUpdraftTowerPanel","dailyAmbientTemperaturesRef","dailyChimneyInletAirTemperaturesMapRef","dailyWindSpeedsMapRef","staticSimulateDaily","resetDailyMaps","calculateYieldWithoutAnimation","getDay","chimneyArea","collectorArea","dca","speedFactor","chimneyInletTemperatures","windSpeeds","outputs","powerFactor","ambientTemperature","tAmbientK","tCollector","convectiveLoss","tCollectorK","tCollector4","tAmbient4","radiationLoss","cbrt","speed","generateDailyData","staticSimulateYearly","resetYearlyMap","generateYearlyData","airTemperatures","yields","yearlyOutput","countPoints","cur","Vantage","runAnalysis","vantagesRef","analyze","fetchVantages","resultMap","vf","getViewFactor","integral","isVisible","panelId","SensorSimulation","measuredHorizontalRadiation","measuredVerticalRadiation","dailyDataMapRef","yearlyDataMapRef","daylightArrayRef","clearnessArrayRef","resetDailyDataMap","calculateMeasurementWithoutAnimation","calculateMeasurement","resetYearlyDataMap","hasHorizontalSensor","hasVerticalSensor","includeHorizontalMeasurement","includeVerticalMeasurement","sensorId","SolarPanelSimulation","runDailySimulationLastStep","runYearlySimulationLastStep","currentTemperatureRef","totalDailyYield","dailyProfit","dailyYieldArray","profit","totalYearlyYield","yearlyProfit","yearlyYieldArray","frontIndirectRadiation","backsideNormal","negate","eff","Simulations","VerticalAxis","yScale","tickLength","tickIntegers","digits","minRef","maxRef","isOwner","ticks","numberOfTicks","tick","isInteger","localSelect","updateSelectedProperty","createLabel","createTitle","textAnchor","money","MIN_SAFE_INTEGER","minimum","maximum","MAX_SAFE_INTEGER","currency","maximumFractionDigits","strokeOpacity","shapeRendering","alignmentBaseline","MARGIN","COLORS","ParallelCoordinates","variables","titles","units","hover","hoveredIndex","boundsWidth","boundsHeight","allGroups","group","xScale","d3Scale","yScales","colorScale","lineGenerator","d3Shape","allLines","series","invisible","allCoordinates","allAxes","join","ScatteredPlotMenu","SubHeader","SolutionSpaceHeader","SubContainer","ProjectGallery","relativeWidth","selectedDesign","setSelectedDesign","hoveredDesign","setHoveredDesign","updateHiddenFlag","setUpdateHiddenFlag","descriptionTextAreaEditableRef","descriptionRef","descriptionChangedRef","descriptionExpandedRef","dataColoringSelectionRef","parameterSelectionChangedRef","thumbnailSizeRef","xAxisRef","yAxisRef","dotSizeRef","scatterChartHorizontalLinesRef","scatterChartVerticalLinesRef","prefix","closeProject","removeSelectedDesign","removeDesignFromProject","totalHeight","imageColumns","imageGap","imageWidth","getVariables","getTitles","getUnits","getDigits","getTickIntegers","getTypes","INDIVIDUALS","getMin","getMax","rowWidthSelectionRef","tiltAngleSelectionRef","rowSpacingSelectionRef","latitudeSelectionRef","orientationSelectionRef","poleHeightSelectionRef","unitCostSelectionRef","sellingPriceSelectionRef","costSelectionRef","totalYieldSelectionRef","meanYieldSelectionRef","profitSelectionRef","toggleDesignVisibility","updatedDesigns","updateDesignVisibility","localSelectParameter","parameter","selectParameter","hiddenParameter","updateHiddenParameters","localSelectDataColoring","selectDataColoring","updateDataColoring","createAxisOptions","scatterData","setScatterData","selectedData","getBound","axisName","xMinMax","yMinMax","xUnit","getUnit","yUnit","RenderDot","Dot","EditFilled","EditOutlined","ImportOutlined","updateDesign","CloudUploadOutlined","DeleteOutlined","LinkOutlined","SortAscendingOutlined","SortDescendingOutlined","updateThumbnailWidth","SettingOutlined","readOnly","updateDescription","overflowX","column","renderItem","lastSpaceIndex","labelDisplayLength","ImageLoadFailureIcon","transition","FolderOpenOutlined","CheckCircleOutlined","CheckCircleFilled","CarryOutOutlined","createChooseDataColoringContent","BgColorsOutlined","updateXAxisNameScatteredPlot","updateYAxisNameScatteredPlot","ScatterChart","tickFormatter","Scatter","updateDotSizeScatteredPlot","saveSvgAsPng","DotChartOutlined","AppCreator","setInitializing","canvasRelativeWidth","setCanvasRelativeWidth","oldZoom","newZoom","undoableCameraChange","newCameraPosition","newZ","isCloudFileOwner","overflow","ifiLogo","defaultSize","pane1Style","minWidth","pane2Style","resizerStyle","backgroundImage","shadows","preserveDrawingBuffer","logarithmicDepthBuffer","frameloop","fallback","LocalFileManager","setConfirmLoading","createNewFile","readLocalFile","loadLocalFile","saveFirst","onfocus","fileDialog","onchange","reader","FileReader","readAsText","onload","performOkAction","writeLocalFile","performCancelAction","App","onBeforeunload","ReactDOM","StrictMode"],"mappings":"6k08IAcAA,IAGGC,IAAIC,KAEJD,IAAIE,KAGJC,KAAK,CACJC,OAAO,EACPC,YAAa,KACbC,cAAe,CACbC,aAAa,GAEfC,UAAW,CACTC,GCzBiB,CACrBC,YAAa,CACXC,KAAM,CACJC,IAAK,oCACLC,QAAS,UACTC,QAAS,4FAGXC,OAAQ,CACNC,UAAW,+FACXC,OAAQ,UAGVC,QAAS,CACPC,sBAAuB,oCACvBC,eAAgB,mBAChBC,cAAe,iBACfC,SAAU,WACVC,QAAS,UACTC,SAAU,WACVC,QAAS,UACTC,eAAgB,iBAChBC,mBACE,+UACFC,QAAS,6EACTC,YAAa,eAGfC,KAAM,CACJC,WAAY,cACZC,MAAO,QACPC,OAAQ,SACRC,MAAO,QACPC,OAAQ,SACRC,YAAa,cACbC,KAAM,OACNC,KAAM,OACNC,SAAU,YACVC,UAAW,aACXC,MAAO,QACPC,OAAQ,SACRC,OAAQ,SACRC,WAAY,cACZC,MAAO,QACPC,YAAa,eACbC,KAAM,OACNC,gBAAiB,sBACjBC,kBAAmB,sBACnBC,kBAAmB,IACnBC,QAAS,UACTC,eAAgB,IAChBC,QAAS,UACTC,QAAS,UACTC,QAAS,UACTC,cAAe,iBACfC,cAAe,iBACfC,aAAc,gBACdC,aAAc,gBACdC,GAAI,KACJC,KAAM,OACNC,KAAM,OACNC,QAAS,UACTC,QAAS,UACTC,MAAO,QACPC,MAAO,QACPC,YAAa,cACbC,OAAQ,SACRC,MAAO,QACPC,OAAQ,UACRC,OAAQ,UACRC,qBAAsB,wBACtBC,kBAAmB,qBACnBC,OAAQ,UACRC,OAAQ,UACRC,uBAAwB,2BACxBC,mBAAoB,uBACpBC,mBAAoB,sBACpBC,8BAA+B,sBAC/BC,yCACE,oOACFC,MAAO,QACPC,KAAM,OACNC,KAAM,OACNC,YAAa,gBACbC,UAAW,cACXC,OAAQ,SACRC,MAAO,QACPC,KAAM,OACNC,IAAK,MACLC,OAAQ,SACRC,KAAM,OACNC,YAAa,cACbC,MAAO,QACPC,QAAS,UACTC,KAAM,OACNC,UAAW,YACXC,IAAK,MACLC,GAAI,KACJC,GAAI,KACJC,OAAQ,SACRC,MAAO,QACPC,MAAO,QACPC,QAAS,WACTC,IAAK,MACLC,MAAO,QACPC,OAAQ,SACRC,MAAO,QACPC,QAAS,UACTC,QAAS,UACTC,SAAU,WACVC,OAAQ,SACRC,MAAO,QACPC,OAAQ,SACRC,OAAQ,SACRC,MAAO,QACPC,QAAS,UACTC,YAAa,cACbC,QAAS,UACTC,KAAM,OACNC,QAAS,UACTC,KAAM,OACNC,KAAM,OACNC,MAAO,QACPC,MAAO,QACPC,OAAQ,SACRC,OAAQ,SACRC,SAAU,WACVC,SAAU,WACVC,MAAO,QACPC,IAAK,MACLC,KAAM,OACNC,SAAU,WACVC,UAAW,YACXC,YAAa,cACbC,IAAK,MACLC,OAAQ,SACRC,eAAgB,MAChBC,aAAc,IACdC,aAAc,IACdC,YAAa,IACbC,YAAa,IACbC,MAAO,QACPC,SAAU,WACVC,OAAQ,SACRC,QAAS,UACTC,MAAO,QACPC,YAAa,cACbC,cAAe,iBACfC,kBAAmB,qBACnBC,OAAQ,SACRC,UAAW,YACXC,SAAU,WACVC,oBAAqB,uBACrBC,mBAAoB,sBACpBC,eAAgB,kBAChBC,kBAAmB,qBACnBC,kBAAmB,qBACnBC,aAAc,eACdC,UAAW,YACXC,SAAU,WACVC,IAAK,MACLC,MAAO,SAGTC,OAAQ,CACNC,UAAW,aACXC,kBAAmB,aACnBC,cAAe,SACfC,eAAgB,UAChBC,cAAe,SACfC,kBAAmB,cACnBC,mBAAoB,eACpBC,qBAAsB,iBACtBC,uBAAwB,mBACxBC,wBAAyB,oBACzBC,iBAAkB,YAClBC,mBAAoB,eACpBC,aAAc,QACdC,cAAe,SACfC,UAAW,aACXC,gBAAiB,YACjBC,YAAa,gBAGfC,QAAS,CACPC,cAAe,kBACfC,aAAc,iBACdC,cAAe,kBACfC,sBAAuB,4BACvBC,oBAAqB,2BACrBC,6BAA8B,oCAC9BC,8BAA+B,oCAC/BC,0BAA2B,qCAC3BC,uBAAwB,8BACxBC,mCAAoC,8CACpCC,uBAAwB,4BACxBC,kBAAmB,0BACnBC,oBAAqB,4BACrBC,oBAAqB,4BACrBC,yBAA0B,wCAC1BC,sCAAuC,sDACvCC,yBAA0B,uDAC1BC,8BAA+B,6CAC/BC,oBAAqB,4BACrBC,uBAAwB,4BACxBC,4BAA6B,mDAC7BC,6CAA8C,mEAC9CC,kBAAmB,+BACnBC,sBAAuB,4BACvBC,sBAAuB,0BACvBC,wBAAyB,8BACzBC,uBAAwB,6BACxBC,yBAA0B,+BAC1BC,oBAAqB,4BACrBC,8BAA+B,4CAC/BC,oBAAqB,6BACrBC,oBAAqB,6BACrBC,qBAAsB,8BACtBC,gBAAiB,oBACjBC,sBAAuB,gCACvBC,sBAAuB,+BACvBC,sBAAuB,+BACvBC,uBAAwB,+BACxBC,8BAA+B,oCAC/BC,oBAAqB,0BACrBC,mBAAoB,yBACpBC,qBAAsB,4BACtBC,kCAAmC,gCACnCC,8BAA+B,qCAC/BC,6BAA8B,uCAC9BC,kCAAmC,yCACnCC,iCAAkC,2CAClCC,kCAAmC,yCACnCC,iCAAkC,2CAClCC,2BAA4B,qCAC5BC,4BAA6B,mCAC7BC,uBAAwB,8BACxBC,wDACE,wEACFC,oBAAqB,2BACrBC,qCAAsC,iDACtCC,uCAAwC,gDACxCC,gBAAiB,0BACjBC,aAAc,wBACdC,kBAAmB,sBACnBC,oBAAqB,wBACrBC,kBAAmB,sBACnBC,iBAAkB,qBAClBC,iBAAkB,oBAClBC,gBAAiB,mBACjBC,iBAAkB,oBAClBC,kCAAmC,0CACnCC,mCAAoC,0CACpCC,iBAAkB,qBAClBC,mBAAoB,uBACpBC,iBAAkB,qBAClBC,gBAAiB,oBACjBC,wBAAyB,kCACzBC,gBAAiB,mBACjBC,eAAgB,kBAChBC,gBAAiB,mBACjBC,mCAAoC,8CACpCC,yCAA0C,sDAC1CC,mCAAoC,gDACpCC,2BACE,iGACFC,wBAAyB,oCACzBC,yBAA0B,+BAC1BC,qBAAsB,2BACtBC,wBAAyB,wCACzBC,0BAA2B,4CAC3BC,oBAAqB,+BACrBC,cAAe,mBAGjBC,KAAM,CACJC,gBAAiB,mBACjBC,OAAQ,CACNC,aAAc,iBACdC,kBAAmB,qBACnBC,aAAc,iBACdC,YAAa,iBAEfC,SAAU,YACVC,UAAW,aACXC,eAAgB,UAChBC,QAAS,CACPC,iBAAkB,qBAClBC,YAAa,eACbC,cAAe,kBACfC,4BAA6B,0CAC7BC,0BAA2B,qCAE7BC,YAAa,OACbC,KAAM,CACJC,cAAe,kBACfC,cAAe,kBACfC,gBAAiB,qBACjBC,mCAAoC,kDACpCC,cAAe,kBACfC,cAAe,kBACfC,gBAAiB,qBACjBC,gCAAiC,+DACjCC,2BAA4B,qCAC5BC,eAAgB,kBAChBC,iBAAkB,sBAClBC,mBAAoB,wBACpBC,qBAAsB,kDACtBC,mBAAoB,gDACpBC,+BAAgC,wCAChCC,sCAAuC,iDACvCC,0CAA2C,6DAE7CC,YAAa,OACbC,KAAM,CACJC,KAAM,OACNC,KAAM,QAERC,YAAa,OACbC,KAAM,CACJC,eAAgB,kBAChBC,mBAAoB,UACpBC,UAAW,QACXC,OAAQ,UACRC,QAAS,WACTC,WAAY,cACZC,WAAY,cACZC,qBAAsB,yBACtBC,2BAA4B,+BAC5BC,mBAAoB,cACpBC,YAAa,CACXC,gBAAiB,mBACjBC,kBAAmB,qBACnBC,YAAa,cACbC,WAAY,cACZC,KAAM,SAGVC,gBAAiB,WACjBC,SAAU,CACRC,YAAa,eACbC,mBAAoB,sBACpBC,SAAU,WACVC,WAAY,cAEdC,kBAAmB,aACnBC,WAAY,CACVC,sCAAuC,6CACvCC,eAAgB,oDAChBC,eAAgB,oDAChBC,eAAgB,oDAChBC,eAAgB,qDAElBC,MAAO,CACLC,UAAW,aACXC,WAAY,cACZC,eAAgB,mBAChBC,wBAAyB,6BACzBC,sBAAuB,4BAEzBC,gBAAiB,WACjBC,eAAgB,UAChBC,QAAS,CACPC,2BAA4B,gCAC5BC,6BAA8B,kCAC9BC,kCAAmC,yCACnCC,8BAA+B,wCAC/BC,iCAAkC,gCAClCC,kBAAmB,sBAErBC,cAAe,SACfC,OAAQ,CACNC,iBAAkB,qBAClBC,kBAAmB,sBACnBC,4BAA6B,2CAE/BC,gBAAiB,WACjBC,SAAU,CACRC,2BAA4B,gCAC5BC,4BAA6B,iCAC7BC,sBAAuB,0BACvBC,mBAAoB,wBACpBC,oCAAqC,+CAEvCC,kBAAmB,cACnBC,WAAY,CACVC,kBAAmB,sBACnBC,mBAAoB,uBACpBC,kBAAmB,qBACnBC,oBAAqB,uBACrBC,MAAO,QACPC,YAAa,cACbT,mBAAoB,wBACpBU,uBAAwB,6BACxBX,sBAAuB,0BACvBY,0BAA2B,8BAC3BC,gCAAiC,2CAEnCC,uBAAwB,mBACxBC,gBAAiB,CACfV,kBAAmB,sBACnBC,mBAAoB,wBAEtBU,qBAAsB,iBACtBC,cAAe,CACbZ,kBAAmB,sBACnBC,mBAAoB,wBAEtBY,wBAAyB,oBACzBC,iBAAkB,CAChBd,kBAAmB,sBACnBC,mBAAoB,wBAEtBc,iBAAkB,YAClBC,UAAW,CACThB,kBAAmB,sBACnBC,mBAAoB,wBAEtBgB,yBAA0B,sBAC1BC,kBAAmB,CACjBlB,kBAAmB,sBACnBC,mBAAoB,uBACpBkB,uCAAwC,mDAG1CC,iBAAkB,YAElBC,0BAA2B,gBAC3BC,4BAA6B,CAC3BC,UAAW,mDACXC,qBAAsB,yBACtBC,oBAAqB,4BAGvBC,uBAAwB,mBACxBC,yBAA0B,CACxBC,kCAAmC,yCACnCC,6BAA8B,oCAC9BC,oCAAqC,2CACrCC,mCAAoC,0CACpCC,kCAAmC,0CACnCC,4CAA6C,qDAC7CC,mCAAoC,sDACpCC,2CAA4C,mDAC5CC,oCAAqC,4CACrCC,0CAA2C,kDAC3CC,8BAA+B,sCAGjCC,sBAAuB,kBACvBC,wBAAyB,CACvBC,gCAAiC,wCACjCC,uBAAwB,4BACxBC,mBAAoB,0BACpBC,kBAAmB,uBACnBC,yBAA0B,gCAC1BC,4BAA6B,mCAC7BC,eAAgB,mBAChBC,mBAAoB,wBACpBC,eAAgB,kBAChBC,YAAa,eACbC,YAAa,gBACbC,kBAAmB,sBACnBC,kBAAmB,wBAGrBC,8BAA+B,2BAC/BC,gCAAiC,CAC/BC,8BAA+B,wCAC/BC,4BAA6B,qCAC7BC,gBAAiB,oBACjBC,4BAA6B,iCAC7BC,wCAAyC,uCACzCC,cAAe,iBACfC,8BAA+B,oEAC/BC,iCAAkC,qDAClCC,iCAAkC,wCAClCC,+BAAgC,sCAGlCC,8BAA+B,2BAC/BC,gCAAiC,CAC/BC,iCAAkC,0CAClCC,qCAAsC,+CACtCC,+BAAgC,uCAChCC,wBAAyB,4BACzBC,qDACE,+DACFC,yCAA0C,iDAC1CC,wCAAyC,+CACzCC,6BAA8B,kCAC9BC,iCAAkC,uCAClCC,4BAA6B,qCAC7BC,gBAAiB,qBAGnBC,8BAA+B,6BAC/BC,gCAAiC,CAC/BC,kBAAmB,uBAGrBC,wBAAyB,oBACzBC,0BAA2B,CACzBC,mCAAoC,mDACpCC,iCAAkC,iDAClCC,yCAA0C,wDAC1CC,2BAA4B,sDAG9BC,gBAAiB,WAEjBC,mBAAoB,eACpBC,oBAAqB,CACnBC,mBAAoB,wBACpBC,mBAAoB,uBACpBC,mCAAoC,0CACpCC,yBAA0B,8BAC1BC,oBAAqB,yBACrBC,8BAA+B,mCAC/BC,uBAAwB,4BACxBC,yBAA0B,8BAC1BC,sBAAuB,2BACvBC,aAAc,iBACdC,iBAAkB,wBAClBC,gCAAiC,oCACjCC,eAAgB,iBAChBC,aAAc,eACdC,iBAAkB,oBAClBC,8BAA+B,yCAC/BC,8BAA+B,yCAC/BC,kCAAmC,0DACnCC,6BAA8B,oDAC9BC,2BAA4B,wDAC5BC,8BAA+B,oEAC/BC,wBAAyB,+BAG3BC,wBAAyB,oBACzBC,4BAA6B,wBAC7BC,4BAA6B,CAC3BC,cAAe,iBACfC,mBAAoB,uBACpBC,aAAc,iBACdC,uBAAwB,6BACxBC,SAAU,WACVC,QAAS,WACTC,WAAY,cACZC,WAAY,cACZC,QAAS,WACTC,eAAgB,mBAChBC,WAAY,cACZC,YAAa,eACbC,eAAgB,mBAChBC,YAAa,eACbC,mBAAoB,wBAEtBC,2BAA4B,uBAC5BC,2BAA4B,CAC1BC,WAAY,cACZC,mBAAoB,yBACpBC,kBAAmB,sBACnBC,kBAAmB,qBACnBC,eAAgB,kBAChBC,MAAO,SAETC,yBAA0B,qBAC1BC,wBAAyB,CACvBC,iCAAkC,mCAClCC,+BAAgC,+BAElCC,qBAAsB,iBACtBC,sBAAuB,CACrBC,SAAU,WAEZC,sBAAuB,kBACvBC,sBAAuB,CACrBC,WAAY,aACZC,SAAU,qBACVC,gBAAiB,mBACjBC,WAAY,cACZC,iBAAkB,oBAClBC,aAAc,gBACdC,SAAU,cACVC,eAAgB,mBAGlBC,8BAA+B,0BAC/BC,+BAAgC,CAC9BC,sCAAuC,iDACvCC,6CAA8C,0DAC9CC,0BAA2B,+BAC3BC,mCAAoC,0DACpCC,mCAAoC,0CAGtCC,gBAAiB,WACjBC,cAAe,SACfC,cAAe,iBACfC,UAAW,aACXC,QAAS,YAGXC,WAAY,CACVC,gBAAiB,mBACjBC,sBAAuB,oCACvBC,iBACE,8QACFC,OAAQ,UACRC,QAAS,WACTC,iBAAkB,wBAGpBC,QAAS,CACPC,KAAM,OACNC,MAAO,QACPC,aAAc,UACdC,YAAa,SACbC,UAAW,OACXC,YAAa,SACbC,eAAgB,YAChBC,UAAW,OACXC,UAAW,OACXC,cAAe,WACfC,WAAY,QACZC,oCAAqC,0CACrCC,2BAA4B,gCAC5BC,gCAAiC,qCACjCC,sBAAuB,4BACvBC,iBAAkB,qBAClBC,mBAAoB,uBACpBC,gBAAiB,oBACjBC,4BAA6B,kCAC7BC,6BAA8B,oCAGhCC,WAAY,CACVC,sBAAuB,0BACvBC,WAAY,aACZC,WAAY,eACZC,WAAY,eACZC,OAAQ,SACRC,cAAe,kBACfC,aAAc,gBACdC,uBAAwB,4BACxBC,yBAA0B,8BAC1BC,6BAA8B,mCAC9BC,wBAAyB,6BACzBC,6BAA8B,kCAC9BC,yBAA0B,8BAC1BC,iCAAkC,iEAClCC,gCAAiC,iEACjCC,kCAAmC,mEACnCC,sCAAuC,wEACvCC,sCAAuC,uEACvCC,kCAAmC,mEACnCC,gBAAiB,oBACjBC,kBAAmB,uBAGrBC,aAAc,CACZvb,MAAO,QACPwb,UAAW,aACXC,YAAa,eACbC,UAAW,aACXC,cAAe,YACfC,WAAY,cACZC,iBAAkB,sBAGpBC,eAAgB,CACdnB,6BAA8B,mCAC9BoB,kCAAmC,wCACnCC,iCAAkC,uCAClCC,mCAAoC,yCACpCC,4BAA6B,iCAC7BC,yBAA0B,8BAC1BC,wBAAyB,6BACzBC,uBAAwB,4BACxBC,yBAA0B,8BAC1BC,uBAAwB,4BACxBC,0BAA2B,+BAC3BC,wBAAyB,6BACzBhC,uBAAwB,4BACxBC,yBAA0B,8BAC1BgC,MAAO,QACPC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACXC,YAAa,eACbC,gBAAiB,oBACjBC,kDACE,2FACFC,iBAAkB,oBAClBC,uDACE,gGACFC,gBAAiB,mBACjBC,sDACE,+FACFC,kBAAmB,qBACnBC,wDACE,iGACFC,WAAY,aACZC,iDACE,yFACFC,QAAS,UACTC,8CACE,sFACFC,OAAQ,SACRC,6CACE,qFACFC,MAAO,QACPC,4CACE,oFACFC,QAAS,UACTC,8CACE,sFACFC,MAAO,QACPC,4CACE,oFACFC,SAAU,WACVC,+CACE,uFACFC,OAAQ,SACRC,6CACE,oFACFC,MAAO,QACPC,4CACE,oFACFC,QAAS,UACTC,8CACE,sFACFC,mBAAoB,uBACpBC,wBAAyB,4BACzBC,uBAAwB,2BACxBC,eAAgB,kBAChBC,WAAY,cACZC,eAAgB,kBAChBC,YAAa,eACbC,gCAAiC,uCACjCC,kCAAmC,yCACnCC,kBAAmB,uBACnBC,oBAAqB,yBACrBC,gBAAiB,qBAGnBC,oBAAqB,CACnBC,2BAA4B,gCAC5BC,gCAAiC,wCACjCC,oBAAqB,2BACrBC,oBAAqB,2BACrBC,oBAAqB,0BACrBC,0BAA2B,iCAC3BC,0BAA2B,kCAG7BC,sBAAuB,CACrBC,iCAAkC,uCAClCC,+BAAgC,uCAChCC,eAAgB,0BAChBC,sBAAuB,kCACvBC,uBAAwB,gCACxBC,oBAAqB,0BACrBC,0BAA2B,iCAC3BC,0BAA2B,kCAG7BC,sBAAuB,CACrBjO,kBAAmB,sBACnBkO,oCAAqC,6CACrCC,+BAAgC,qCAChCC,+BAAgC,qCAChCC,iCAAkC,uCAClCC,iCAAkC,uCAClCC,yCAA0C,+CAC1CC,qCAAsC,2CACtCC,sCAAuC,4CACvCC,mCAAoC,0CAGtCC,WAAY,CACV9E,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACXzC,6BAA8B,mCAC9BwB,yBAA0B,8BAC1BK,0BAA2B,+BAC3BC,wBAAyB,6BACzBhC,uBAAwB,4BACxBC,yBAA0B,8BAC1BgC,MAAO,QACPW,YAAa,eACbqE,8CACE,uFACF1D,QAAS,UACT2D,0CACE,kFACFjD,SAAU,WACVkD,2CACE,mFACFhD,OAAQ,SACRiD,yCACE,gFACF/C,MAAO,QACPgD,wCACE,gFACF9C,QAAS,UACT+C,0CACE,kFACFC,eAAgB,mBAChBC,wBAAyB,8BACzBC,wBAAyB,8BACzBC,mBAAoB,uBACpBC,WAAY,cACZC,aAAc,iBACdC,qBAAsB,2BACtBC,0BAA2B,gCAC3BC,qBAAsB,2BACtBlD,WAAY,cACZmD,UAAW,YACXjD,YAAa,gBAGfkD,YAAa,CACX/F,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACXuF,QAAS,WACTC,iBAAkB,qBAClBC,iBAAkB,qBAClBC,gBAAiB,oBACjBC,gBAAiB,oBACjBC,UAAW,aACXC,MAAO,QACPC,OAAQ,SACRC,YAAa,eACbC,UAAW,aACXC,QAAS,UACTC,UAAW,aACXrX,UAAW,aACXsX,UAAW,aACXC,UAAW,aACXC,WAAY,cACZC,WAAY,cACZC,wBAAyB,6BACzBC,uBAAwB,4BACxBC,aAAc,gBACdC,gBAAiB,oBACjBC,qBAAsB,mCACtBC,2BAA4B,gCAC5BC,oBAAqB,wBACrBC,YAAa,eACbC,OAAQ,SACRC,sBAAuB,2BACvBC,sCAAuC,8CACvCC,sCAAuC,8CACvCC,qBAAsB,oBACtBC,2BAA4B,cAC5BC,yBAA0B,aAC1BC,wBAAyB,YACzBC,+BAAgC,oBAChCC,0BAA2B,cAC3BC,uBAAwB,WACxBC,gCAAiC,wBACjCC,6BAA8B,qBAC9BC,+BAAgC,uBAChCC,iCAAkC,yBAClCC,sBAAuB,SACvBC,0BAA2B,cAC3BC,2BAA4B,eAC5BC,+BAAgC,aAChCC,kCAAmC,gBACnCC,gCAAiC,cACjCC,+BAAgC,aAChCC,4BAA6B,SAC7BC,qCAAsC,8DAGxCC,iBAAkB,CAChBC,aAAc,eACdC,WAAY,aACZC,UAAW,YACXC,UAAW,YACXC,iBAAkB,oBAClBC,yBAA0B,6BAC1BC,0BAA2B,8BAC3BC,kCAAmC,uCACnCC,gCAAiC,sCACjChC,sBAAuB,2BACvBiC,WAAY,aACZC,KAAM,OACNC,oBAAqB,uBACrBC,UAAW,YACXC,iCAAkC,oBAClCC,kCAAmC,qBACnCC,gCAAiC,mBACjCC,iCAAkC,oBAClCC,6BAA8B,eAC9BC,8BAA+B,gBAC/BC,gCAAiC,qCACjCC,cAAe,iBACfC,WAAY,aACZC,aAAc,gBACdC,6BAA8B,kCAC9BC,8BAA+B,mCAC/BC,eAAgB,kBAChBC,mBAAoB,sBACpBC,cAAe,iBACfC,cAAe,iBACfC,aAAc,gBACdC,KAAM,OACNC,UAAW,aACXC,aAAc,gBACdC,gBAAiB,mBACjBC,cAAe,iBACfC,qBAAsB,wBACtBC,kBAAmB,qBACnBC,qBAAsB,wCACtBC,kBAAmB,sBACnBC,iBAAkB,0BAClBC,eAAgB,uBAChBC,qBAAsB,8BACtBC,6BAA8B,mCAC9BC,gCAAiC,uCAGnCC,SAAU,CACRC,UAAW,aACXC,KAAM,OACNvvB,KAAM,OACNwvB,OAAQ,UAGVC,WAAY,CACVF,KAAM,OACNvvB,KAAM,OACNwvB,OAAQ,UAGVE,WAAY,CACVC,aAAc,gBACdJ,KAAM,OACNK,SAAU,WACVC,mBAAoB,yBAGtBC,UAAW,CACTtsB,MAAO,QACPusB,UAAW,YACXC,MAAO,QACPC,gBAAiB,WACjBC,OAAQ,UAGVC,mBAAoB,CAClBC,gBAAiB,mBACjBC,KAAM,OACNC,WAAY,cACZC,WAAY,cACZC,gBAAiB,oBACjBC,qCAAsC,8CACtCC,YAAa,iBAGfC,oCAAqC,CACnCC,qBAAsB,wBACtB5J,oBAAqB,uBACrB6J,2BAA4B,+BAC5B3J,0BAA2B,+BAG7B4J,eAAgB,CACdC,mBAAoB,sBACpBC,4BAA6B,iFAC7BC,gBAAiB,sBACjBC,yBAA0B,gFAC1BC,cAAe,kBACfC,YAAa,cACbC,SAAU,WACVC,UAAW,YACXC,WAAY,cACZC,OAAQ,SACRC,WAAY,cACZC,WAAY,cACZC,UAAW,aACXC,sBAAuB,2BACvBC,QAAS,UACTC,uBAAwB,6DACxBC,YAAa,eACbC,UAAW,aACXC,4BAA6B,iCAC7BC,0BAA2B,+BAC3BC,0BAA2B,+BAC3BC,mBAAoB,wBACpBC,wBAAyB,uCACzBC,8BAA+B,6CAC/BC,uBAAwB,4BACxBC,eAAgB,oBAGlBC,aAAc,CACZC,gBAAiB,oBACjBtyB,MAAO,QACPuyB,UAAW,aACXC,MAAO,QACPC,SAAU,YACVC,gBAAiB,kBACjBC,gBAAiB,kBACjBC,SAAU,YACVC,SAAU,WACVC,kBAAmB,qBACnBC,MAAO,QACPC,KAAM,OACNC,eAAgB,kBAChBC,oBAAqB,wBACrBC,gCAAiC,qCACjCC,6BAA8B,mCAGhCC,oBAAqB,CACnBC,aAAc,gBACdC,QAAS,UACTC,YAAa,eACbC,YAAa,eACbC,wBAAyB,6BACzBC,mCAAoC,kDACpCC,4BAA6B,iCAC7BC,oBAAqB,yBAGvBC,qBAAsB,CACpBC,aAAc,gBACdC,kCAAmC,yCACnCV,aAAc,gBACdC,QAAS,UACTC,YAAa,eACbS,yBAA0B,8BAC1BC,oCAAqC,mDACrCC,6BAA8B,kCAC9BC,qBAAsB,0BAGxBC,cAAe,CACbC,MAAO,QACPC,+BAAgC,sCAChCC,kBAAmB,sBACnBC,6BAA8B,2CAC9BC,sBAAuB,0BACvBC,cAAe,kBAGjBC,kBAAmB,CACjBC,kBAAmB,qBACnBC,YAAa,eACbC,sBAAuB,2BACvBC,UAAW,YACXC,YAAa,eACbxB,YAAa,eACbyB,kCAAmC,0CACnCC,sBAAuB,2BACvBC,kCAAmC,iDACnCC,2BAA4B,gCAC5BC,mBAAoB,wBAGtBC,SAAU,CACRC,eAAgB,UAChBpS,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACX4R,WAAY,eACZC,aAAc,iBACdC,kBAAmB,sBACnBC,wBAAyB,sCACzBC,iBAAkB,qBAClBC,SAAU,YACV/Q,QAAS,UACTgR,eAAgB,mBAChBC,iBAAkB,qBAClBjT,yBAA0B,8BAC1BkT,4CAA6C,4DAC7ChR,MAAO,QACPjC,uBAAwB,4BACxBkT,0CAA2C,0DAC3CpS,YAAa,eACbqS,mBAAoB,wBACpBC,qBAAsB,0BACtBhV,6BAA8B,mCAC9BiV,gDAAiD,iEACjD5R,QAAS,UACT6R,eAAgB,mBAChBC,iBAAkB,qBAClB3T,yBAA0B,8BAC1B4T,4CAA6C,4DAC7C7R,OAAQ,SACR9B,wBAAyB,6BACzB4T,2CAA4C,2DAC5CC,gBAAiB,oBACjBC,kBAAmB,sBACnB1T,0BAA2B,+BAC3B2T,cAAe,iBACfC,iBAAkB,UAClBC,cAAe,OACfC,gBAAiB,SACjBjN,QAAS,UACTkN,iBAAkB,oBAClBC,eAAgB,kBAChBC,mBAAoB,sBACpBC,eAAgB,kBAChB/zB,MAAO,aACPoB,OAAQ,SACRjB,UAAW,YACXF,QAAS,UACT+zB,sBAAuB,4BACvBC,uBAAwB,6BACxBC,KAAM,OACNC,KAAM,OACNj2B,QAAS,UACTk2B,MAAO,QACPC,cAAe,kBACfC,YAAa,wBACbC,QAAS,UACTC,aAAc,gBACdC,eAAgB,kBAChBC,cAAe,iBACfC,cAAe,iBACfC,aAAc,iBAGhBC,WAAY,CACVC,eAAgB,mBAChBC,oBAAqB,kCACrBC,0BAA2B,wCAC3BC,mBAAoB,uBACpBC,WAAY,cACZ/zB,MAAO,QACPC,OAAQ,SACR+zB,QAAS,gCACTC,wBAAyB,6BACzBC,QAAS,UACTC,kBAAmB,qBACnBC,gBAAiB,mBACjBC,aAAc,gBACdC,yBAA0B,6BAC1BC,uBAAwB,2BACxBC,aAAc,gBACdC,KAAM,OACNlP,QAAS,UACTmP,yBAA0B,mDAC1BC,QAAS,UACTC,YAAa,eACbC,aAAc,gBACdC,aAAc,gBACdC,aAAc,iBACdC,aAAc,gBACdC,MAAO,QACPC,WAAY,cACZC,UAAW,aACXt2B,MAAO,cACPu2B,WAAY,cACZC,QAAS,UACTC,OAAQ,SACRC,UAAW,YACXC,SAAU,WACVvC,MAAO,SAGTwC,SAAU,CACRxE,eAAgB,UAChBpS,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXuW,aAAc,iBACdC,wBAAyB,sCACzBC,iBAAkB,qBAClBC,SAAU,YACVC,gBAAiB,oBACjBC,2BAA4B,yCAC5BC,YAAa,eACbC,oBAAqB,wBACrBC,cAAe,iBACfC,YAAa,eACbC,gBAAiB,mBACjBC,YAAa,eACbC,UAAW,aACXC,cAAe,kBACfC,UAAW,aACXjR,QAAS,UACTkR,cAAe,iBACfnE,iBAAkB,UAClBoE,gBAAiB,SACjBC,eAAgB,QAChBpX,YAAa,eACbqS,mBAAoB,wBACpBC,qBAAsB,0BACtBhV,6BAA8B,mCAC9B+Z,gDAAiD,iEACjDpW,QAAS,UACTgR,eAAgB,mBAChBC,iBAAkB,qBAClBjT,yBAA0B,8BAC1BqY,4CAA6C,4DAC7C3W,QAAS,UACT6R,eAAgB,mBAChBC,iBAAkB,qBAClB3T,yBAA0B,8BAC1ByY,4CAA6C,4DAC7C1W,OAAQ,SACR9B,wBAAyB,6BACzByY,2CAA4C,2DAC5CC,sBAAuB,4BACvBC,uBAAwB,6BACxBC,KAAM,OACNC,QAAS,UACTC,WAAY,eACZC,cAAe,mBAGjBC,SAAU,CACRrG,eAAgB,UAChBpS,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACXiY,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,aAAc,iBACdC,eAAgB,6BAChBC,wBAAyB,sCACzBC,iBAAkB,qBAClBC,SAAU,YACVC,SAAU,YACV9C,QAAS,UACTC,OAAQ,SACRlQ,OAAQ,SACRwH,WAAY,cACZ4I,SAAU,YAGZ4C,cAAe,CACbt7B,KAAM,OACNu7B,IAAK,OAGPC,gBAAiB,CACfC,2BAA4B,gCAC5BC,4BAA6B,kCAC7BC,uCAAwC,oDACxCC,cAAe,iBACfC,aAAc,iBAGhBC,0BAA2B,CACzBC,cAAe,iBACfC,UAAW,aACXC,kCAAmC,4CAGrCC,iBAAkB,CAChBC,OAAQ,SACRC,UAAW,aACXC,KAAM,OACNC,iBAAkB,+CAClBC,oBAAqB,mDACrBC,IAAK,MACLC,kBAAmB,2BACnBC,kBAAmB,6BACnBC,YAAa,gBACbC,WAAY,eACZC,eAAgB,kBAChBC,iBAAkB,oBAClBC,kBAAmB,qBACnBC,gBAAiB,oBACjBC,2BAA4B,YAC5BC,cAAe,kBACfC,yBAA0B,YAC1BC,WAAY,eACZC,sBAAuB,YACvBC,KAAM,OACNC,gBAAiB,mBACjB9tB,UAAW,QACXG,WAAY,cACZ4tB,YAAa,6BAGfC,SAAU,CACR9d,cAAe,kBACf+d,gBAAiB,mBACjBC,oBAAqB,4BACrBp6B,YAAa,cACb84B,KAAM,QAGRuB,gBAAiB,CACfC,qBAAsB,yBACtB1P,SAAU,WACV2P,aAAc,gBACdC,2BAA4B,qBAC5BC,gBAAiB,SAGnBC,YAAa,CACXC,YAAa,eACbC,gBAAiB,qBAGnBC,oBAAqB,CACnBC,oBAAqB,wBACrBC,qBAAsB,yBACtBC,OAAQ,SACRC,GAAI,KACJC,WAAY,cACZC,IAAK,OAGPC,qBAAsB,CACpBC,qBAAsB,0BACtBC,sBAAuB,2BACvBC,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbC,mCAAoC,0CACpCC,OAAQ,SACRC,UAAW,aACXC,aAAc,gBACdC,WAAY,cACZC,UAAW,aACXC,YAAa,gBAGfC,0BAA2B,CACzBC,0BAA2B,+BAC3BC,2BAA4B,gCAC5Bb,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbW,wCAAyC,gDAG3CC,wBAAyB,CACvBC,wBAAyB,6BACzBC,yBAA0B,8BAC1BjB,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbe,uCAAwC,+CAG1CC,2BAA4B,CAC1BC,2BAA4B,gCAC5BC,4BAA6B,iCAC7BrB,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbmB,yCAA0C,iDAG5CC,oBAAqB,CACnBC,oBAAqB,wBACrBC,qBAAsB,yBACtBzB,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbuB,kCAAmC,yCAGrCC,uBAAwB,CACtBC,uBAAwB,kCACxBC,wBAAyB,mCACzBC,sBAAuB,0BACvBC,iBAAkB,qBAClB/B,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACb6B,qCAAsC,6CAGxCC,cAAe,CACbC,mBAAoB,sBACpBxsB,UAAW,SACXysB,gBAAiB,YAGnBC,eAAgB,CACdC,UAAW,aACXC,uBAAwB,yCACxBC,cAAe,kBACfC,QAAS,WACTC,aAAc,iBACdC,aAAc,gBACdC,yBAA0B,yCAC1BC,wBAAyB,+BACzBC,mDACE,gFAGJC,iBAAkB,CAChBT,UAAW,aACXC,uBAAwB,yCACxBC,cAAe,kBACfQ,WAAY,cACZC,oBAAqB,wBACrBC,gCAAiC,wDACjCC,+BAAgC,uCAChCC,sDACE,mFAGJC,aAAc,CACZC,gBAAiB,mBACjBC,mBAAoB,uBACpBC,qBAAsB,0BACtBC,QAAS,UACTC,YAAa,OACbC,mBAAoB,cACpBC,wBAAyB,iCACzBC,2BAA4B,qCAC5BC,qCAAsC,iDACtCjgB,gBAAiB,oBACjBkgB,oBAAqB,wBACrBC,qBAAsB,yBACtBC,qBAAsB,yBACtBC,wBAAyB,kCACzBC,yCAA0C,4DAC1CC,sCAAuC,wDACvCC,4BAA6B,qCAC7BC,oBAAqB,wBACrBC,mBAAoB,uBACpBC,uBAAwB,6BACxBC,sBAAuB,4BACvBC,wBAAyB,0CACzBC,wBAAyB,0CACzBC,qCAAsC,gDACtCC,uCAAwC,kDACxCC,sBAAuB,0BACvBC,YAAa,gBACbC,YAAa,iBAGfC,qBAAsB,CACpBC,kBAAmB,sBACnBC,KAAM,kBACNC,gBAAiB,sBACjBC,cAAe,4CACfC,+BAAgC,wCAChCC,yCAA0C,8DAC1CC,mBAAoB,6EACpBC,MAAO,QACPC,aAAc,gBACdC,sBAAuB,UACvBC,UAAW,aACXC,SAAU,YACVC,QAAS,YAGXC,aAAc,CACZC,cAAe,YAGjBC,wBAAyB,CACvBC,0BAA2B,+BAC3BC,WAAY,cAGdC,eAAgB,CACdC,oBAAqB,uBACrBC,wBAAyB,4BACzBC,uBAAwB,4BACxBC,aAAc,gBACdC,SAAU,aAGZC,gBAAiB,CACfC,qBAAsB,wBACtBC,iBAAkB,qBAClBC,iBAAkB,sBAGpBC,uBAAwB,CACtBC,aAAc,YACdC,oBAAqB,wBACrBC,wBAAyB,6BACzBC,+BAAgC,sCAGlCC,gBAAiB,CACfC,0BAA2B,0CAC3BC,wBAAyB,wCACzBC,gCAAiC,gDACjCC,yBAA0B,yCAC1BC,2BAA4B,2CAC5BC,6BAA8B,6CAC9BC,8BAA+B,8CAC/BC,uBAAwB,sCACxBC,+BAAgC,gDAChCC,sBAAuB,sCAGzBC,QAAS,CACPC,UAAW,aACXC,OAAQ,SACRC,cAAe,iBACfC,QAAS,WACTC,UAAW,aACXC,QAAS,WACTC,eAAgB,mBAChBC,aAAc,iBACdC,WAAY,eACZC,eAAgB,mBAChBC,eAAgB,mBAChBC,UAAW,aACXC,UAAW,aACXC,cAAe,kBACfC,eAAgB,mBAChBC,iBAAkB,qBAClBC,mBAAoB,uBACpBC,oBAAqB,wBACrBC,aAAc,gBACdC,eAAgB,mBAChBC,SAAU,YACVC,QAAS,WACTC,UAAW,aACXC,UAAW,aACXC,uCAAwC,iDACxCC,mCAAoC,4CACpCC,gBAAiB,qBACjBC,WAAY,cACZC,uBAAwB,6BACxBC,wBAAyB,6BACzBC,8BAA+B,0CAC/BC,oBAAqB,yBACrBC,yBAA0B,8BAC1BC,qBAAsB,0BACtBC,mBAAoB,wBACpBC,qBAAsB,0BACtBC,mBAAoB,wBACpBC,0BAA2B,gCAC3BC,wBAAyB,8BACzBC,sBAAuB,4BACvBC,0BAA2B,gCAC3BC,0BAA2B,gCAC3BC,yBAA0B,+BAC1BC,qBAAsB,0BACtBC,0BAA2B,gCAC3BC,4BAA6B,kCAC7BC,8BAA+B,oCAC/BC,+BAAgC,qCAChCC,wBAAyB,6BACzBC,0BAA2B,gCAC3BC,oBAAqB,yBACrBC,mBAAoB,wBACpBC,qBAAsB,0BACtBC,qBAAsB,2BAGxBC,QAAS,CACPC,QAAS,0CACTC,qBAAsB,yBACtBC,gBAAiB,0BACjBC,6BAA8B,oCAGhCC,KAAM,CACJC,MAAO,QACPC,MAAO,QACPC,QAAS,UACTC,QAAS,UACTC,IAAK,MACLC,QAAS,WACTC,OAAQ,SACRC,SAAU,WACVC,MAAO,QACPC,IAAK,MACLC,KAAM,OACNC,OAAQ,UAGVC,OAAQ,CACNC,WAAY,aACZC,QAAS,UACTC,aAAc,iBACdC,aAAc,iBACdC,aAAc,iBACdC,aAAc,iBACdC,SAAU,WACVC,MAAO,QACPC,UAAW,YACXC,MAAO,QACPC,QAAS,WACTC,OAAQ,SACRC,UAAW,YACXC,SAAU,YACVC,MAAO,QACPC,YAAa,eACbC,aAAc,iBAGhBC,OAAQ,CACNC,KAAM,OACNC,KAAM,OACNC,MAAO,QACPC,WAAY,aACZC,KAAM,OACNC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,SAAU,WACVC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,SAAU,WACVC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,QAAS,UACTC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,SAAU,WACVC,KAAM,OACNC,OAAQ,SACRC,OAAQ,SACRC,KAAM,OACNC,KAAM,OACNC,MAAO,QACPC,MAAO,QACPC,SAAU,WACVC,KAAM,OACNC,KAAM,OACNC,OAAQ,UAGVC,QAAS,CACPC,EAAG,IACHC,EAAG,IACHC,EAAG,IACHC,EAAG,KAGLC,MAAO,CACLC,QAAS,MACTC,SAAU,MACVC,MAAO,MACPC,MAAO,MACPC,IAAK,MACLb,KAAM,MACNc,KAAM,MACNC,OAAQ,MACRC,UAAW,MACXC,QAAS,MACTC,SAAU,MACVC,SAAU,OAGZC,UAAW,CACTC,kBAAmB,sBACnBC,cAAe,kBACfC,kBAAmB,sBACnBC,iCAAkC,wCAClCC,uBAAwB,6BACxBC,uBAAwB,6BACxBC,sBAAuB,4BACvBC,gCAAiC,8CDxpDjCC,ME1BoB,CACxBzzC,YAAa,CACXC,KAAM,CACJC,IAAK,6CACLC,QAAS,qBACTC,QAAS,oKAGXC,OAAQ,CACNC,UAAW,qKACXC,OAAQ,gBAGVC,QAAS,CACPC,sBAAuB,qEACvBC,eAAgB,2BAChBC,cAAe,2BACfC,SAAU,eACVC,QAAS,eACTC,SAAU,eACVC,QAAS,eACTC,eAAgB,eAChBC,mBACE,6UACFC,QAAS,sKACTC,YAAa,gBAGfC,KAAM,CACJC,WAAY,iCACZC,MAAO,SACPC,OAAQ,SACRC,MAAO,SACPC,OAAQ,eACRC,YAAa,eACbC,KAAM,eACNC,KAAM,eACNC,SAAU,2BACVC,UAAW,2BACXC,MAAO,eACPC,OAAQ,eACRC,OAAQ,eACRC,WAAY,qBACZC,MAAO,eACPC,YAAa,qBACbC,KAAM,eACNC,gBAAiB,mDACjBC,kBAAmB,2BACnBC,kBAAmB,SACnBC,QAAS,eACTC,eAAgB,eAChBC,QAAS,eACTC,QAAS,eACTC,QAAS,eACTC,cAAe,eACfC,cAAe,eACfC,aAAc,qBACdC,aAAc,qBACdC,GAAI,SACJC,KAAM,SACNC,KAAM,SACNC,QAAS,eACTC,QAAS,eACTC,MAAO,eACPC,MAAO,eACPC,YAAa,iCACbC,OAAQ,eACRC,MAAO,eACPC,OAAQ,iCACRC,OAAQ,iCACRC,qBAAsB,2BACtBC,kBAAmB,eACnBC,OAAQ,UACRC,OAAQ,UACRC,uBAAwB,2BACxBC,mBAAoB,yDACpBC,mBAAoB,uCACpBC,8BAA+B,uCAC/BC,yCACE,yUACFC,MAAO,SACPC,KAAM,eACNC,KAAM,eACNC,YAAa,iCACbC,UAAW,wBACXC,OAAQ,eACRC,MAAO,eACPC,KAAM,eACNC,IAAK,eACLC,OAAQ,eACRC,KAAM,eACNC,YAAa,qBACbC,MAAO,eACPC,QAAS,eACTE,UAAW,eACXD,KAAM,eACNE,IAAK,SACLC,GAAI,SACJC,GAAI,eACJC,OAAQ,eACRC,MAAO,eACPC,MAAO,eACPC,QAAS,qBACTC,IAAK,eACLC,MAAO,eACPC,OAAQ,eACRC,MAAO,eACPC,QAAS,eACTC,QAAS,eACTC,SAAU,eACVC,OAAQ,eACRC,MAAO,eACPC,OAAQ,eACRC,OAAQ,eACRC,MAAO,eACPC,QAAS,qBACTC,YAAa,eACbC,QAAS,eACTC,KAAM,eACNC,QAAS,eACTC,KAAM,eACNC,KAAM,eACNC,MAAO,eACPC,MAAO,qBACPC,OAAQ,eACRC,OAAQ,eACRC,SAAU,eACVC,SAAU,eACVC,MAAO,eACPC,IAAK,SACLC,KAAM,eACNC,SAAU,2BACVC,UAAW,eACXC,YAAa,eACbC,IAAK,qBACLC,OAAQ,SACRC,eAAgB,gBAChBC,aAAc,SACdC,aAAc,SACdC,YAAa,SACbC,YAAa,SACbC,MAAO,eACPC,SAAU,eACVC,OAAQ,eACRC,QAAS,eACTC,MAAO,eACPC,YAAa,eACbC,cAAe,qBACfC,kBAAmB,iCACnBC,OAAQ,eACRC,UAAW,qBACXC,SAAU,eACVC,oBAAqB,2BACrBC,mBAAoB,2BACpBC,eAAgB,2BAChBC,kBAAmB,2BACnBC,kBAAmB,eACnBC,aAAc,eACdC,UAAW,qBACXC,SAAU,eACVC,IAAK,eACLC,MAAO,4BAGTC,OAAQ,CACNC,UAAW,qBACXC,kBAAmB,eACnBC,cAAe,qBACfC,eAAgB,qBAChBC,cAAe,qBACfC,kBAAmB,qBACnBC,mBAAoB,uCACpBC,qBAAsB,2BACtBC,uBAAwB,2BACxBC,wBAAyB,uCACzBC,iBAAkB,qBAClBC,mBAAoB,iCACpBC,aAAc,eACdC,cAAe,eACfC,UAAW,2BACXC,gBAAiB,iCACjBC,YAAa,4BAGfC,QAAS,CACPC,cAAe,uCACfC,aAAc,2BACdC,cAAe,2BACfC,sBAAuB,yDACvBC,oBAAqB,uCACrBC,6BAA8B,+DAC9BC,8BAA+B,+DAC/BC,0BAA2B,qEAC3BC,uBAAwB,6CACxBC,mCAAoC,uEACpCC,uBAAwB,+DACxBC,kBAAmB,uCACnBC,oBAAqB,uCACrBC,oBAAqB,6CACrBC,yBAA0B,qEAC1BC,sCAAuC,uFACvCC,yBAA0B,2EAC1BC,8BAA+B,2EAC/BC,oBAAqB,uCACrBC,uBAAwB,mDACxBC,4BAA6B,qGAC7BC,6CAA8C,6IAC9CC,kBAAmB,mDACnBC,sBAAuB,+DACvBC,sBAAuB,6CACvBC,wBAAyB,+DACzBC,uBAAwB,+DACxBC,yBAA0B,+DAC1BC,oBAAqB,yDACrBC,8BAA+B,uFAC/BC,oBAAqB,yDACrBC,oBAAqB,yDACrBC,qBAAsB,yDACtBC,gBAAiB,uCACjBC,sBAAuB,qEACvBC,sBAAuB,yDACvBC,sBAAuB,2EACvBC,uBAAwB,+DACxBC,8BAA+B,2EAC/BC,oBAAqB,mDACrBC,mBAAoB,uFACpBC,qBAAsB,yDACtBC,kCAAmC,iCACnCC,8BAA+B,+DAC/BC,6BAA8B,+DAC9BC,kCAAmC,+DACnCC,iCAAkC,+DAClCC,kCAAmC,2EACnCC,iCAAkC,2EAClCC,2BAA4B,+DAC5BC,4BAA6B,+DAC7BC,uBAAwB,+DACxBC,wDAAyD,+GACzDC,oBAAqB,uCACrBC,qCAAsC,qEACtCC,uCAAwC,mDACxCC,gBAAiB,uFACjBC,aAAc,kEACdC,kBAAmB,iCACnBC,oBAAqB,iCACrBC,kBAAmB,iCACnBC,iBAAkB,iCAClBC,iBAAkB,2BAClBC,gBAAiB,2BACjBC,iBAAkB,2BAClBC,kCAAmC,+DACnCC,mCAAoC,uFACpCC,iBAAkB,iCAClBC,mBAAoB,iCACpBC,iBAAkB,iCAClBC,gBAAiB,iCACjBC,wBAAyB,iCACzBC,gBAAiB,2BACjBC,eAAgB,2BAChBC,gBAAiB,2BACjBC,mCAAoC,mDACpCC,yCAA0C,yDAC1CC,mCAAoC,mDACpCC,2BAA4B,mJAC5BC,wBAAyB,6CACzBC,yBAA0B,uCAC1BC,qBAAsB,uCACtBC,wBAAyB,+DACzBC,0BAA2B,6CAC3BC,oBAAqB,mDACrBC,cAAe,kCAGjBC,KAAM,CACJC,gBAAiB,2BACjBC,OAAQ,CACNC,aAAc,6CACdC,kBAAmB,2BACnBC,aAAc,6CACdC,YAAa,8CAEfC,SAAU,qBACVC,UAAW,qBACXC,eAAgB,eAChBC,QAAS,CACPC,iBAAkB,iCAClBC,YAAa,2BACbC,cAAe,iCACfC,4BAA6B,qEAC7BC,0BAA2B,sEAE7BC,YAAa,eACbC,KAAM,CACJC,cAAe,iCACfC,cAAe,uCACfC,gBAAiB,6CACjBC,mCAAoC,+DACpCC,cAAe,uCACfC,cAAe,uCACfC,gBAAiB,6CACjBC,gCAAiC,2EACjCC,2BAA4B,yGAC5BC,eAAgB,eAChBC,iBAAkB,6CAClBC,mBAAoB,uCACpBC,qBAAsB,2EACtBC,mBAAoB,mDACpBC,+BAAgC,qEAChCC,sCAAuC,+DACvCC,0CAA2C,gHAE7CC,YAAa,eACbC,KAAM,CACJC,KAAM,eACNC,KAAM,gBAERC,YAAa,eACbC,KAAM,CACJC,eAAgB,2BAChBC,mBAAoB,2BACpBC,UAAW,2BACXC,OAAQ,eACRC,QAAS,eACTC,WAAY,2BACZC,WAAY,2BACZC,qBAAsB,uCACtBC,2BAA4B,uCAC5BC,mBAAoB,eACpBC,YAAa,CACXC,gBAAiB,2BACjBC,kBAAmB,2BACnBC,YAAa,2BACbC,WAAY,eACZC,KAAM,iBAGVC,gBAAiB,eACjBC,SAAU,CACRC,YAAa,2BACbC,mBAAoB,2BACpBC,SAAU,qBACVC,WAAY,kCAEdC,kBAAmB,eACnBC,WAAY,CACVC,sCAAuC,yGACvCC,eAAgB,qFAChBC,eAAgB,qFAChBC,eAAgB,qFAChBC,eAAgB,sFAElBC,MAAO,CACLC,UAAW,2BACXC,WAAY,2BACZC,eAAgB,2BAChBC,wBAAyB,yDACzBC,sBAAuB,0DAEzBC,gBAAiB,eACjBC,eAAgB,eAChBC,QAAS,CACPC,2BAA4B,2EAC5BC,6BAA8B,mDAC9BC,kCAAmC,qEACnCC,8BAA+B,yDAC/BC,iCAAkC,qEAClCC,kBAAmB,4BAErBC,cAAe,qBACfC,OAAQ,CACNC,iBAAkB,uCAClBC,kBAAmB,uCACnBC,4BAA6B,sEAE/BC,gBAAiB,qBACjBC,SAAU,CACRC,2BAA4B,yDAC5BC,4BAA6B,yDAC7BC,sBAAuB,uCACvBC,mBAAoB,6CACpBC,oCAAqC,sEAEvCC,kBAAmB,uCACnBC,WAAY,CACVC,kBAAmB,uCACnBC,mBAAoB,uCACpBC,kBAAmB,iCACnBC,oBAAqB,mDACrBC,MAAO,eACPC,YAAa,eACbT,mBAAoB,6CACpBU,uBAAwB,qEACxBX,sBAAuB,uCACvBY,0BAA2B,6CAC3BC,gCAAiC,sEAEnCC,uBAAwB,2BACxBC,gBAAiB,CACfV,kBAAmB,uCACnBC,mBAAoB,wCAEtBU,qBAAsB,2BACtBC,cAAe,CACbZ,kBAAmB,uCACnBC,mBAAoB,wCAEtBY,wBAAyB,uCACzBC,iBAAkB,CAChBd,kBAAmB,uCACnBC,mBAAoB,wCAEtBc,iBAAkB,qBAClBC,UAAW,CACThB,kBAAmB,uCACnBC,mBAAoB,wCAEtBgB,yBAA0B,mDAC1BC,kBAAmB,CACjBlB,kBAAmB,uCACnBC,mBAAoB,uCACpBkB,uCAAwC,sEAG1CC,iBAAkB,eAElBC,0BAA2B,iCAC3BC,4BAA6B,CAC3BC,UAAW,iFACXC,qBAAsB,+DACtBC,oBAAqB,8FAGvBC,uBAAwB,2BACxBC,yBAA0B,CACxBC,kCAAmC,2EACnCC,6BAA8B,+DAC9BC,oCAAqC,+DACrCC,mCAAoC,+DACpCC,kCAAmC,iFACnCC,4CAA6C,6FAC7CC,mCAAoC,6FACpCC,2CAA4C,uFAC5CC,oCAAqC,qEACrCC,0CAA2C,2EAC3CC,8BAA+B,gEAGjCC,sBAAuB,2BACvBC,wBAAyB,CACvBC,gCAAiC,iFACjCC,uBAAwB,mDACxBC,mBAAoB,2EACpBC,kBAAmB,iFACnBC,yBAA0B,2EAC1BC,4BAA6B,2EAC7BC,eAAgB,uCAChBC,mBAAoB,2BACpBC,eAAgB,2BAChBC,YAAa,2BACbC,YAAa,4BACbC,kBAAmB,uCACnBC,kBAAmB,0DAGrBC,8BAA+B,2BAC/BC,gCAAiC,CAC/BC,8BAA+B,iFAC/BC,4BAA6B,iFAC7BC,gBAAiB,iCACjBC,4BAA6B,mDAC7BC,wCAAyC,uFACzCC,cAAe,iCACfC,8BAA+B,yGAC/BC,iCAAkC,6FAClCC,iCAAkC,uFAClCC,+BAAgC,8CAGlCC,8BAA+B,2BAC/BC,gCAAiC,CAC/BC,iCAAkC,uFAClCC,qCAAsC,iFACtCC,+BAAgC,yDAChCC,wBAAyB,uFACzBC,qDAAsD,mJACtDC,yCAA0C,qHAC1CC,wCAAyC,qHACzCC,6BAA8B,mDAC9BC,iCAAkC,yDAClCC,4BAA6B,2EAC7BC,gBAAiB,8CAGnBC,8BAA+B,+DAC/BC,gCAAiC,CAC/BC,kBAAmB,oDAGrBC,wBAAyB,iCACzBC,0BAA2B,CACzBC,mCAAoC,qEACpCC,iCAAkC,qEAClCC,yCAA0C,6FAC1CC,2BAA4B,8FAG9BC,gBAAiB,eAEjBC,mBAAoB,qBACpBC,oBAAqB,CACnBC,mBAAoB,mDACpBC,mBAAoB,iCACpBC,mCAAoC,mGACpCC,yBAA0B,iFAC1BC,oBAAqB,2FACrBC,8BAA+B,qHAC/BC,uBAAwB,yDACxBC,yBAA0B,6CAC1BC,sBAAuB,6CACvBC,aAAc,uCACdC,iBAAkB,uCAClBC,gCAAiC,uCACjCC,eAAgB,2BAChBC,aAAc,2BACdC,iBAAkB,mDAClBC,8BAA+B,2HAC/BC,8BAA+B,qHAC/BC,kCAAmC,mJACnCC,6BAA8B,6IAC9BC,2BAA4B,+KAC5BC,8BAA+B,oKAC/BC,wBAAyB,8FAG3BC,wBAAyB,2BACzBC,4BAA6B,2BAC7BC,4BAA6B,CAC3BC,cAAe,mDACfC,mBAAoB,+DACpBC,aAAc,4BACdC,uBAAwB,2EACxBC,SAAU,mDACVC,QAAS,2BACTC,WAAY,uCACZC,WAAY,uCACZC,QAAS,iCACTC,eAAgB,iCAChBC,WAAY,6CACZC,YAAa,mDACbC,eAAgB,mDAChBC,YAAa,6CACbC,mBAAoB,oDAEtBC,2BAA4B,2BAC5BC,2BAA4B,CAC1BC,WAAY,eACZC,mBAAoB,2EACpBC,kBAAmB,6CACnBC,kBAAmB,qBACnBC,eAAgB,qBAChBC,MAAO,gBAETC,yBAA0B,qBAC1BC,wBAAyB,CACvBC,iCAAkC,+DAClCC,+BAAgC,8FAElCC,qBAAsB,2BACtBC,sBAAuB,CACrBC,SAAU,4BAEZC,sBAAuB,2BACvBC,sBAAuB,CACrBC,WAAY,eACZC,SAAU,iCACVC,gBAAiB,qBACjBC,WAAY,eACZC,iBAAkB,iCAClBC,aAAc,iCACdC,SAAU,iCACVC,eAAgB,kCAGlBC,8BAA+B,2BAC/BC,+BAAgC,CAC9BC,sCAAuC,qEACvCC,6CAA8C,qEAC9CC,0BAA2B,+DAC3BC,mCAAoC,2HACpCC,mCAAoC,0GAGtCC,gBAAiB,eACjBC,cAAe,eACfC,cAAe,2BACfC,UAAW,2BACXC,QAAS,4BAGXC,WAAY,CACVC,gBAAiB,2BACjBC,sBAAuB,mDACvBC,iBACE,8aACFC,OAAQ,eACRC,QAAS,2BACTC,iBAAkB,oDAGpBC,QAAS,CACPC,KAAM,iCACNC,MAAO,2BACPC,aAAc,eACdC,YAAa,eACbC,UAAW,eACXC,YAAa,eACbC,eAAgB,eAChBC,UAAW,eACXC,UAAW,eACXC,cAAe,eACfC,WAAY,eACZC,oCAAqC,iFACrCC,2BAA4B,mDAC5BC,gCAAiC,qDACjCC,sBAAuB,mDACvBC,iBAAkB,iCAClBC,mBAAoB,iCACpBC,gBAAiB,iCACjBC,4BAA6B,6CAC7BC,6BAA8B,8CAGhCC,WAAY,CACVC,sBAAuB,mDACvBC,WAAY,eACZC,WAAY,6CACZC,WAAY,6CACZC,OAAQ,qBACRC,cAAe,uCACfC,aAAc,eACdC,uBAAwB,+DACxBC,yBAA0B,+DAC1BC,6BAA8B,qEAC9BC,wBAAyB,+DACzBC,6BAA8B,+DAC9BC,yBAA0B,qEAC1BC,iCAAkC,uFAClCC,gCAAiC,uFACjCC,kCAAmC,uFACnCC,sCAAuC,6FACvCC,sCAAuC,uFACvCC,kCAAmC,6FACnCC,gBAAiB,6CACjBC,kBAAmB,8CAGrBC,aAAc,CACZvb,MAAO,eACPwb,UAAW,iCACXC,YAAa,iCACbC,UAAW,iCACXC,cAAe,iCACfC,WAAY,iCACZC,iBAAkB,4BAGpBC,eAAgB,CACdnB,6BAA8B,6FAC9BoB,kCAAmC,mGACnCC,iCAAkC,mGAClCC,mCAAoC,+GACpCC,4BAA6B,6FAC7BC,yBAA0B,6FAC1BC,wBAAyB,uFACzBC,uBAAwB,iFACxBC,yBAA0B,uFAC1BC,uBAAwB,iFACxBC,0BAA2B,6FAC3BC,wBAAyB,uFACzBhC,uBAAwB,uFACxBC,yBAA0B,uFAC1BgC,MAAO,eACPC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,YAAa,qBACbC,gBAAiB,iCACjBC,kDAAmD,qHACnDC,iBAAkB,2BAClBC,uDAAwD,2HACxDC,gBAAiB,2BACjBC,sDAAuD,2HACvDC,kBAAmB,uCACnBC,wDAAyD,uIACzDC,WAAY,qBACZC,iDAAkD,qHAClDC,QAAS,qBACTC,8CAA+C,qHAC/CC,OAAQ,eACRC,6CAA8C,+GAC9CC,MAAO,SACPC,4CAA6C,yGAC7CC,QAAS,eACTC,8CAA+C,+GAC/CC,MAAO,SACPC,4CAA6C,yGAC7CC,SAAU,qBACVC,+CAAgD,qHAChDC,OAAQ,eACRC,6CAA8C,+GAC9CC,MAAO,eACPC,4CAA6C,+GAC7CC,QAAS,eACTC,8CAA+C,+GAC/CC,mBAAoB,iCACpBE,uBAAwB,6CACxBD,wBAAyB,6CACzBE,eAAgB,iCAChBC,WAAY,iCACZC,eAAgB,iCAChBC,YAAa,qBACbC,gCAAiC,qEACjCC,kCAAmC,qEACnCC,kBAAmB,8CACnBC,oBAAqB,yDACrBC,gBAAiB,oDAGnBC,oBAAqB,CACnBC,2BAA4B,+DAC5BC,gCAAiC,qEACjCC,oBAAqB,yDACrBC,oBAAqB,yDACrBC,oBAAqB,+DACrBC,0BAA2B,+DAC3BC,0BAA2B,gEAG7BC,sBAAuB,CACrBC,iCAAkC,iFAClCC,+BAAgC,qEAChCC,eAAgB,qEAChBC,sBAAuB,yDACvBC,uBAAwB,qEACxBC,oBAAqB,+DACrBC,0BAA2B,+DAC3BC,0BAA2B,gEAG7BC,sBAAuB,CACrBjO,kBAAmB,mDACnBkO,oCAAqC,iFACrCC,+BAAgC,iFAChCC,+BAAgC,iFAChCC,iCAAkC,uFAClCC,iCAAkC,uFAClCC,yCAA0C,6FAC1CC,qCAAsC,6FACtCC,sCAAuC,iFACvCC,mCAAoC,wFAGtCC,WAAY,CACV9E,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXzC,6BAA8B,+GAC9BwB,yBAA0B,+GAC1BK,0BAA2B,+GAC3BC,wBAAyB,yGACzBhC,uBAAwB,yGACxBC,yBAA0B,yGAC1BgC,MAAO,eACPW,YAAa,qBACbqE,8CAA+C,uIAC/C1D,QAAS,qBACT2D,0CAA2C,uIAC3CjD,SAAU,qBACVkD,2CAA4C,uIAC5ChD,OAAQ,eACRiD,yCAA0C,iIAC1C/C,MAAO,eACPgD,wCAAyC,iIACzC9C,QAAS,eACT+C,0CAA2C,iIAC3CC,eAAgB,uCAChBC,wBAAyB,qEACzBC,wBAAyB,qEACzBC,mBAAoB,mDACpBC,WAAY,uCACZC,aAAc,iCACdC,qBAAsB,+DACtBC,0BAA2B,2EAC3BC,qBAAsB,qEACtBlD,WAAY,iCACZmD,UAAW,qBACXjD,YAAa,4BAGfkD,YAAa,CACX/F,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXuF,QAAS,qBACTC,iBAAkB,uCAClBC,iBAAkB,uCAClBC,gBAAiB,uCACjBC,gBAAiB,uCACjBC,UAAW,2BACXC,MAAO,eACPC,OAAQ,eACRC,YAAa,2BACbC,UAAW,2BACXC,QAAS,qBACTC,UAAW,2BACXrX,UAAW,2BACXsX,UAAW,2BACXC,UAAW,eACXC,WAAY,eACZC,WAAY,eACZC,wBAAyB,uCACzBC,uBAAwB,uCACxBC,aAAc,2BACdC,gBAAiB,uCACjBC,qBAAsB,qEACtBC,2BAA4B,qEAC5BC,oBAAqB,mDACrBC,YAAa,uCACbC,OAAQ,eACRC,sBAAuB,6CACvBC,sCAAuC,2EACvCC,sCAAuC,2EACvCC,qBAAsB,iCACtBC,2BAA4B,2BAC5BC,yBAA0B,2BAC1BC,wBAAyB,qBACzBC,+BAAgC,qBAChCC,0BAA2B,qBAC3BC,uBAAwB,2BACxBC,gCAAiC,yCACjCC,6BAA8B,yCAC9BC,+BAAgC,yCAChCC,iCAAkC,yCAClCC,sBAAuB,2BACvBC,0BAA2B,2BAC3BC,2BAA4B,2BAC5BC,+BAAgC,iCAChCC,kCAAmC,iCACnCC,gCAAiC,uCACjCC,+BAAgC,uCAChCC,4BAA6B,2BAC7BC,qCAAsC,sHAGxCC,iBAAkB,CAChBC,aAAc,eACdC,WAAY,eACZC,UAAW,eACXC,UAAW,eACXC,iBAAkB,2BAClBC,yBAA0B,uCAC1BC,0BAA2B,iCAC3BC,kCAAmC,6CACnCC,gCAAiC,yDACjChC,sBAAuB,6CACvBiC,WAAY,eACZC,KAAM,eACNC,oBAAqB,iCACrBC,UAAW,2BACXC,iCAAkC,iCAClCC,kCAAmC,iCACnCC,gCAAiC,uCACjCC,iCAAkC,uCAClCC,6BAA8B,2BAC9BC,8BAA+B,2BAC/BC,gCAAiC,mDACjCC,cAAe,qBACfC,WAAY,qBACZC,aAAc,2BACdC,6BAA8B,mDAC9BC,8BAA+B,mDAC/BC,eAAgB,uCAChBC,mBAAoB,uCACpBC,cAAe,2BACfC,cAAe,2BACfC,aAAc,2BACdC,KAAM,eACNC,UAAW,2BACXC,aAAc,2BACdC,gBAAiB,2BACjBC,cAAe,2BACfC,qBAAsB,2BACtBC,kBAAmB,2BACnBC,qBAAsB,yDACtBC,kBAAmB,6CACnBC,iBAAkB,6FAClBC,eAAgB,2EAChBC,qBAAsB,iFACtBC,6BAA8B,yDAC9BC,gCAAiC,oDAGnCC,SAAU,CACRC,UAAW,uCACXC,KAAM,eACNvvB,KAAM,eACNwvB,OAAQ,4BAGVC,WAAY,CACVF,KAAM,eACNvvB,KAAM,eACNwvB,OAAQ,gBAGVE,WAAY,CACVC,aAAc,2BACdJ,KAAM,eACNK,SAAU,qBACVC,mBAAoB,oDAGtBC,UAAW,CACTtsB,MAAO,eACPusB,UAAW,eACXC,MAAO,eACPC,gBAAiB,2BACjBC,OAAQ,gBAGVC,mBAAoB,CAClBC,gBAAiB,iCACjBC,KAAM,eACNC,WAAY,2BACZC,WAAY,2BACZC,gBAAiB,6CACjBC,qCAAsC,qEACtCC,YAAa,4BAGfC,oCAAqC,CACnCC,qBAAsB,mDACtB5J,oBAAqB,uCACrB6J,2BAA4B,uCAC5B3J,0BAA2B,wCAG7B4J,eAAgB,CACdC,mBAAoB,iCACpBC,4BAA6B,iFAC7BC,gBAAiB,oDACjBC,yBAA0B,6FAC1BC,cAAe,6CACfC,YAAa,2BACbC,SAAU,eACVC,UAAW,eACXC,WAAY,2BACZC,OAAQ,SACRC,WAAY,iCACZC,WAAY,iCACZC,UAAW,2BACXC,sBAAuB,2BACvBC,QAAS,2BACTC,uBAAwB,2EACxBC,YAAa,2BACbC,UAAW,iCACXC,4BAA6B,mDAC7BC,0BAA2B,mDAC3BC,0BAA2B,mDAC3BC,mBAAoB,uCACpBC,wBAAyB,qEACzBC,8BAA+B,qEAC/BC,uBAAwB,mDACxBC,eAAgB,wCAGlBC,aAAc,CACZC,gBAAiB,6CACjBtyB,MAAO,eACPuyB,UAAW,eACXC,MAAO,qBACPC,SAAU,uCACVC,gBAAiB,qBACjBC,gBAAiB,qBACjBC,SAAU,eACVC,SAAU,eACVC,kBAAmB,iCACnBC,MAAO,eACPC,KAAM,eACNC,eAAgB,iCAChBC,oBAAqB,uCACrBC,gCAAiC,mDACjCC,6BAA8B,gCAGhCC,oBAAqB,CACnBC,aAAc,2BACdC,QAAS,eACTC,YAAa,qBACbC,YAAa,eACbC,wBAAyB,6CACzBC,mCAAoC,2EACpCC,4BAA6B,yDAC7BC,oBAAqB,8CAGvBC,qBAAsB,CACpBC,aAAc,qBACdC,kCAAmC,qEACnCV,aAAc,2BACdC,QAAS,eACTC,YAAa,qBACbS,yBAA0B,yDAC1BC,oCAAqC,uFACrCC,6BAA8B,qEAC9BC,qBAAsB,0DAGxBC,cAAe,CACbC,MAAO,qBACPC,+BAAgC,qEAChCC,kBAAmB,uCACnBC,6BAA8B,qEAC9BC,sBAAuB,mDACvBC,cAAe,wCAGjBC,kBAAmB,CACjBC,kBAAmB,iCACnBC,YAAa,2BACbC,sBAAuB,mDACvBC,UAAW,qBACXC,YAAa,2BACbxB,YAAa,eACbyB,kCAAmC,qEACnCC,sBAAuB,6CACvBC,kCAAmC,2EACnCC,2BAA4B,yDAC5BC,mBAAoB,8CAGtBC,SAAU,CACRC,eAAgB,2BAChBpS,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACX4R,WAAY,2BACZC,aAAc,2BACdC,kBAAmB,uCACnBC,wBAAyB,yDACzBC,iBAAkB,uCAClBC,SAAU,2BACV/Q,QAAS,eACTgR,eAAgB,6CAChBC,iBAAkB,yDAClBjT,yBAA0B,uFAC1BkT,4CAA6C,+GAC7ChR,MAAO,SACPjC,uBAAwB,iFACxBkT,0CAA2C,yGAC3CpS,YAAa,qBACbqS,mBAAoB,mDACpBC,qBAAsB,+DACtBhV,6BAA8B,6FAC9BiV,gDAAiD,qHACjD5R,QAAS,qBACT6R,eAAgB,mDAChBC,iBAAkB,+DAClB3T,yBAA0B,6FAC1B4T,4CAA6C,qHAC7C7R,OAAQ,eACR9B,wBAAyB,uFACzB4T,2CAA4C,+GAC5CC,gBAAiB,2EACjBC,kBAAmB,uFACnB1T,0BAA2B,6FAC3B2T,cAAe,qBACfC,iBAAkB,eAClBC,cAAe,eACfC,gBAAiB,eACjBjN,QAAS,qBACTkN,iBAAkB,2BAClBC,eAAgB,2BAChBC,mBAAoB,2BACpBC,eAAgB,2BAChB/zB,MAAO,2BACPoB,OAAQ,eACRjB,UAAW,eACXF,QAAS,eACT+zB,sBAAuB,6CACvBC,uBAAwB,6CACxBC,KAAM,eACNC,KAAM,eACNj2B,QAAS,eACTk2B,MAAO,eACPC,cAAe,iCACfC,YAAa,uCACbC,QAAS,eACTC,aAAc,2BACdC,eAAgB,2BAChBC,cAAe,2BACfC,cAAe,2BACfC,aAAc,4BAGhBC,WAAY,CACVC,eAAgB,iCAChBC,oBAAqB,+DACrBC,0BAA2B,+DAC3BC,mBAAoB,6CACpBC,WAAY,iCACZ/zB,MAAO,eACPC,OAAQ,eACR+zB,QAAS,yDACTC,wBAAyB,6CACzBC,QAAS,eACTC,kBAAmB,iCACnBC,gBAAiB,iCACjBC,aAAc,2BACdC,yBAA0B,6CAC1BC,uBAAwB,6CACxBC,aAAc,2BACdC,KAAM,eACNlP,QAAS,2BACTmP,yBAA0B,8FAC1BC,QAAS,qBACTC,YAAa,iCACbC,aAAc,iCACdC,aAAc,iCACdC,aAAc,2BACdC,aAAc,iCACdC,MAAO,eACPC,WAAY,2BACZC,UAAW,2BACXt2B,MAAO,2BACPu2B,WAAY,2BACZC,QAAS,eACTC,OAAQ,eACRC,UAAW,qBACXC,SAAU,eACVvC,MAAO,gBAGTwC,SAAU,CACRxE,eAAgB,2BAChBpS,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXuW,aAAc,iCACdC,wBAAyB,+DACzBC,iBAAkB,6CAClBC,SAAU,iCACVC,gBAAiB,uCACjBC,2BAA4B,qEAC5BC,YAAa,uCACbC,oBAAqB,uCACrBC,cAAe,2BACfC,YAAa,2BACbC,gBAAiB,2BACjBC,YAAa,2BACbC,UAAW,2BACXC,cAAe,uCACfC,UAAW,2BACXjR,QAAS,qBACTkR,cAAe,2BACfnE,iBAAkB,eAClBoE,gBAAiB,eACjBC,eAAgB,eAChBpX,YAAa,qBACbqS,mBAAoB,mDACpBC,qBAAsB,+DACtBhV,6BAA8B,mGAC9B+Z,gDAAiD,2HACjDpW,QAAS,eACTgR,eAAgB,6CAChBC,iBAAkB,yDAClBjT,yBAA0B,6FAC1BqY,4CAA6C,qHAC7C3W,QAAS,qBACT6R,eAAgB,mDAChBC,iBAAkB,+DAClB3T,yBAA0B,mGAC1ByY,4CAA6C,2HAC7C1W,OAAQ,eACR9B,wBAAyB,6FACzByY,2CAA4C,qHAC5CC,sBAAuB,mDACvBC,uBAAwB,mDACxBC,KAAM,2BACNC,QAAS,qBACTC,WAAY,sBACZC,cAAe,6BAGjBC,SAAU,CACRrG,eAAgB,2BAChBpS,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXiY,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,aAAc,2BACdC,eAAgB,yDAChBC,wBAAyB,yDACzBC,iBAAkB,uCAClBC,SAAU,2BACVC,SAAU,qBACV9C,QAAS,eACTC,OAAQ,eACRlQ,OAAQ,eACRwH,WAAY,2BACZ4I,SAAU,gBAGZ4C,cAAe,CACbt7B,KAAM,2BACNu7B,IAAK,4BAGPC,gBAAiB,CACfC,2BAA4B,mDAC5BC,4BAA6B,mDAC7BC,uCAAwC,+DACxCC,cAAe,2BACfC,aAAc,4BAGhBC,0BAA2B,CACzBC,cAAe,6CACfC,UAAW,iCACXC,kCAAmC,gEAGrCC,iBAAkB,CAChBC,OAAQ,eACRC,UAAW,2BACXC,KAAM,eACNC,iBAAkB,yDAClBC,oBAAqB,6DACrBC,IAAK,eACLC,kBAAmB,uDACnBC,kBAAmB,yDACnBC,YAAa,uCACbC,WAAY,uCACZC,eAAgB,2BAChBC,iBAAkB,uCAClBC,kBAAmB,uCACnBC,gBAAiB,2BACjBC,2BAA4B,kBAC5BC,cAAe,2BACfC,yBAA0B,kBAC1BC,WAAY,2BACZC,sBAAuB,kBACvBC,KAAM,eACNC,gBAAiB,2BACjB9tB,UAAW,2BACXG,WAAY,2BACZ4tB,YAAa,gDAGfC,SAAU,CACR9d,cAAe,uCACf+d,gBAAiB,qBACjBC,oBAAqB,2EACrBp6B,YAAa,iCACb84B,KAAM,4BAGRuB,gBAAiB,CACfC,qBAAsB,qEACtB1P,SAAU,qBACV2P,aAAc,2BACdC,2BAA4B,6CAC5BC,gBAAiB,4BAGnBC,YAAa,CACXC,YAAa,2BACbC,gBAAiB,wCAGnBC,oBAAqB,CACnBC,oBAAqB,uCACrBC,qBAAsB,uCACtBC,OAAQ,eACRC,GAAI,eACJC,WAAY,eACZC,IAAK,sBAGPC,qBAAsB,CACpBC,qBAAsB,uCACtBC,sBAAuB,uCACvBC,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbC,mCAAoC,2EACpCC,OAAQ,eACRC,UAAW,qBACXC,aAAc,qBACdC,WAAY,2BACZC,UAAW,iCACXC,YAAa,kCAGfC,0BAA2B,CACzBC,0BAA2B,mDAC3BC,2BAA4B,mDAC5Bb,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbW,wCAAyC,kFAG3CC,wBAAyB,CACvBC,wBAAyB,mDACzBC,yBAA0B,mDAC1BjB,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbe,uCAAwC,kFAG1CC,2BAA4B,CAC1BC,2BAA4B,+DAC5BC,4BAA6B,+DAC7BrB,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbmB,yCAA0C,8FAG5CC,oBAAqB,CACnBC,oBAAqB,6CACrBC,qBAAsB,6CACtBzB,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbuB,kCAAmC,4EAGrCC,uBAAwB,CACtBC,uBAAwB,2EACxBC,wBAAyB,2EACzBC,sBAAuB,uCACvBC,iBAAkB,2BAClB/B,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACb6B,qCAAsC,0GAGxCC,cAAe,CACbC,mBAAoB,6CACpBxsB,UAAW,eACXysB,gBAAiB,kBAGnBC,eAAgB,CACdC,UAAW,2BACXC,uBAAwB,mDACxBC,cAAe,iCACfC,QAAS,uCACTC,aAAc,iCACdC,aAAc,2BACdC,yBAA0B,mDAC1BC,wBAAyB,mDACzBC,mDAAoD,0IAGtDC,iBAAkB,CAChBT,UAAW,2BACXC,uBAAwB,mDACxBC,cAAe,iCACfQ,WAAY,2BACZC,oBAAqB,uCACrBC,gCAAiC,+DACjCC,+BAAgC,6CAChCC,sDAAuD,0IAGzDC,aAAc,CACZC,gBAAiB,2BACjBC,mBAAoB,iCACpBC,qBAAsB,iCACtBC,QAAS,eACTC,YAAa,eACbC,mBAAoB,eACpBC,wBAAyB,2BACzBC,2BAA4B,iCAC5BC,qCAAsC,qEACtCjgB,gBAAiB,6CACjBkgB,oBAAqB,uCACrBC,qBAAsB,uCACtBC,qBAAsB,uCACtBC,wBAAyB,mDACzBC,yCAA0C,qHAC1CC,sCAAuC,0GACvCC,4BAA6B,qEAC7BC,oBAAqB,uCACrBC,mBAAoB,uCACpBC,uBAAwB,mDACxBC,sBAAuB,mDACvBC,wBAAyB,uCACzBC,wBAAyB,iCACzBC,qCAAsC,+DACtCC,uCAAwC,2EACxCC,sBAAuB,iCACvBC,YAAa,sBACbC,YAAa,uBAGfC,qBAAsB,CACpBC,kBAAmB,uCACnBC,KAAM,2BACNC,gBAAiB,qDACjBC,cAAe,2DACfC,+BAAgC,qEAChCC,yCAA0C,yGAC1CC,mBAAoB,2KACpBC,MAAO,2BACPC,aAAc,2BACdC,sBAAuB,2BACvBC,UAAW,2BACXC,SAAU,2BACVC,QAAS,4BAGXC,aAAc,CACZC,cAAe,4BAGjBC,wBAAyB,CACvBC,0BAA2B,uCAC3BC,WAAY,4BAGdC,eAAgB,CACdC,oBAAqB,iCACrBC,wBAAyB,2BACzBC,uBAAwB,uCACxBC,aAAc,2BACdC,SAAU,4BAGZC,gBAAiB,CACfC,qBAAsB,uCACtBC,iBAAkB,uCAClBC,iBAAkB,wCAGpBC,uBAAwB,CACtBC,aAAc,iCACdC,oBAAqB,mDACrBC,wBAAyB,yDACzBC,+BAAgC,0DAGlCC,gBAAiB,CACfC,0BAA2B,+DAC3BC,wBAAyB,+DACzBC,gCAAiC,uFACjCC,yBAA0B,iFAC1BC,2BAA4B,qEAC5BC,6BAA8B,qEAC9BC,8BAA+B,iFAC/BC,uBAAwB,+DACxBC,+BAAgC,6FAChCC,sBAAuB,gEAGzBC,QAAS,CACPC,UAAW,qBACXC,OAAQ,eACRC,cAAe,2BACfC,QAAS,2BACTC,UAAW,2BACXC,QAAS,qBACTC,eAAgB,6CAChBC,aAAc,uCACdC,WAAY,uCACZC,eAAgB,uCAChBC,eAAgB,uCAChBC,UAAW,iCACXC,UAAW,iCACXC,cAAe,iCACfC,eAAgB,mDAChBC,iBAAkB,uCAClBC,mBAAoB,uCACpBC,oBAAqB,mDACrBC,aAAc,iCACdC,eAAgB,6CAChBC,SAAU,2BACVC,QAAS,2BACTC,UAAW,2BACXC,UAAW,2BACXC,uCAAwC,uFACxCC,mCAAoC,6FACpCC,gBAAiB,6CACjBC,WAAY,2BACZC,uBAAwB,yDACxBC,wBAAyB,6CACzBC,8BAA+B,mDAC/BC,oBAAqB,uFACrBC,yBAA0B,yDAC1BC,qBAAsB,+DACtBC,mBAAoB,yDACpBC,qBAAsB,yDACtBC,mBAAoB,mDACpBC,0BAA2B,2EAC3BC,wBAAyB,qEACzBC,sBAAuB,qEACvBC,0BAA2B,qEAC3BC,0BAA2B,qEAC3BC,yBAA0B,+DAC1BC,qBAAsB,+DACtBC,0BAA2B,iFAC3BC,4BAA6B,qEAC7BC,8BAA+B,qEAC/BC,+BAAgC,iFAChCC,wBAAyB,+DACzBC,0BAA2B,2EAC3BC,oBAAqB,yDACrBC,mBAAoB,yDACpBC,qBAAsB,yDACtBC,qBAAsB,0DAGxBC,QAAS,CACPC,QAAS,yDACTC,qBAAsB,6CACtBC,gBAAiB,6CACjBC,6BAA8B,oDAGhCC,KAAM,CACJC,MAAO,qBACPC,MAAO,eACPC,QAAS,qBACTC,QAAS,eACTC,IAAK,eACLC,QAAS,2BACTC,OAAQ,eACRC,SAAU,eACVC,MAAO,eACPC,IAAK,eACLC,KAAM,eACNC,OAAQ,gBAGVC,OAAQ,CACNC,WAAY,eACZC,QAAS,eACTC,aAAc,uCACdC,aAAc,uCACdC,aAAc,uCACdC,aAAc,uCACdC,SAAU,eACVC,MAAO,eACPC,UAAW,qBACXC,MAAO,eACPC,QAAS,qBACTC,OAAQ,qBACRC,UAAW,qBACXC,SAAU,qBACVC,MAAO,qBACPC,YAAa,eACbC,aAAc,gBAGhBC,OAAQ,CACNC,KAAM,eACNC,KAAM,eACNC,MAAO,qBACPC,WAAY,qBACZC,KAAM,eACNC,QAAS,2BACTC,MAAO,qBACPC,KAAM,SACNC,KAAM,eACNC,KAAM,eACNC,SAAU,qBACVC,KAAM,eACNC,KAAM,eACNC,KAAM,eACNC,SAAU,qBACVC,KAAM,eACNC,KAAM,eACNC,KAAM,eACNC,KAAM,eACNC,KAAM,SACNC,QAAS,qBACTC,KAAM,eACNC,KAAM,eACNC,KAAM,eACNC,SAAU,qBACVC,KAAM,eACNC,OAAQ,qBACRC,OAAQ,qBACRC,KAAM,eACNC,KAAM,eACNC,MAAO,qBACPC,MAAO,qBACPC,SAAU,2BACVC,KAAM,eACNC,KAAM,eACNC,OAAQ,sBAGVC,QAAS,CACPC,EAAG,SACHC,EAAG,SACHC,EAAG,SACHC,EAAG,UAGLC,MAAO,CACLC,QAAS,eACTC,SAAU,eACVC,MAAO,eACPC,MAAO,eACPC,IAAK,eACLb,KAAM,eACNc,KAAM,eACNC,OAAQ,eACRC,UAAW,eACXC,QAAS,eACTC,SAAU,qBACVC,SAAU,sBAGZC,UAAW,CACTC,kBAAmB,uCACnBC,cAAe,iCACfC,kBAAmB,uCACnBC,iCAAkC,yDAClCC,uBAAwB,uCACxBC,uBAAwB,uCACxBC,sBAAuB,6CACvBC,gCAAiC,kEF9nDjCE,MG3BoB,CACxB1zC,YAAa,CACXC,KAAM,CACJC,IAAK,6CACLC,QAAS,qBACTC,QAAS,oKAGXC,OAAQ,CACNC,UAAW,qKACXC,OAAQ,gBAGVC,QAAS,CACPC,sBAAuB,qEACvBC,eAAgB,2BAChBC,cAAe,2BACfC,SAAU,eACVC,QAAS,eACTC,SAAU,eACVC,QAAS,eACTC,eAAgB,eAChBC,mBACE,6UACFC,QAAS,sKACTC,YAAa,gBAGfC,KAAM,CACJC,WAAY,iCACZC,MAAO,SACPC,OAAQ,SACRC,MAAO,SACPC,OAAQ,eACRC,YAAa,eACbC,KAAM,eACNC,KAAM,eACNC,SAAU,2BACVC,UAAW,2BACXC,MAAO,eACPC,OAAQ,eACRC,OAAQ,eACRC,WAAY,qBACZC,MAAO,eACPC,YAAa,qBACbC,KAAM,eACNC,gBAAiB,mDACjBC,kBAAmB,2BACnBC,kBAAmB,SACnBC,QAAS,eACTC,eAAgB,eAChBC,QAAS,eACTC,QAAS,eACTC,QAAS,eACTC,cAAe,eACfC,cAAe,eACfC,aAAc,qBACdC,aAAc,qBACdC,GAAI,SACJC,KAAM,SACNC,KAAM,SACNC,QAAS,eACTC,QAAS,eACTC,MAAO,eACPC,MAAO,eACPC,YAAa,iCACbC,OAAQ,eACRC,MAAO,eACPC,OAAQ,iCACRC,OAAQ,iCACRC,qBAAsB,2BACtBC,kBAAmB,eACnBC,OAAQ,UACRC,OAAQ,UACRC,uBAAwB,2BACxBC,mBAAoB,yDACpBC,mBAAoB,uCACpBC,8BAA+B,uCAC/BC,yCACE,yUACFC,MAAO,SACPC,KAAM,eACNC,KAAM,eACNC,YAAa,iCACbC,UAAW,wBACXC,OAAQ,eACRC,MAAO,eACPC,KAAM,eACNC,IAAK,eACLC,OAAQ,eACRC,KAAM,eACNC,YAAa,qBACbC,MAAO,eACPC,QAAS,eACTE,UAAW,eACXD,KAAM,eACNE,IAAK,SACLC,GAAI,SACJC,GAAI,eACJC,OAAQ,eACRC,MAAO,eACPC,MAAO,eACPC,QAAS,qBACTC,IAAK,eACLC,MAAO,eACPC,OAAQ,eACRC,MAAO,eACPC,QAAS,eACTC,QAAS,eACTC,SAAU,eACVC,OAAQ,eACRC,MAAO,eACPC,OAAQ,eACRC,OAAQ,eACRC,MAAO,eACPC,QAAS,qBACTC,YAAa,eACbC,QAAS,eACTC,KAAM,eACNC,QAAS,eACTC,KAAM,eACNC,KAAM,eACNC,MAAO,eACPC,MAAO,qBACPC,OAAQ,eACRC,OAAQ,eACRC,SAAU,eACVC,SAAU,eACVC,MAAO,eACPC,IAAK,SACLC,KAAM,eACNC,SAAU,2BACVC,UAAW,eACXC,YAAa,eACbC,IAAK,qBACLC,OAAQ,SACRC,eAAgB,gBAChBC,aAAc,SACdC,aAAc,SACdC,YAAa,SACbC,YAAa,SACbC,MAAO,eACPC,SAAU,eACVC,OAAQ,eACRC,QAAS,eACTC,MAAO,eACPC,YAAa,eACbC,cAAe,qBACfC,kBAAmB,iCACnBC,OAAQ,eACRC,UAAW,qBACXC,SAAU,eACVC,oBAAqB,2BACrBC,mBAAoB,2BACpBC,eAAgB,2BAChBC,kBAAmB,2BACnBC,kBAAmB,eACnBC,aAAc,eACdC,UAAW,qBACXC,SAAU,eACVC,IAAK,eACLC,MAAO,4BAGTC,OAAQ,CACNC,UAAW,qBACXC,kBAAmB,eACnBC,cAAe,qBACfC,eAAgB,qBAChBC,cAAe,qBACfC,kBAAmB,qBACnBC,mBAAoB,uCACpBC,qBAAsB,2BACtBC,uBAAwB,2BACxBC,wBAAyB,uCACzBC,iBAAkB,qBAClBC,mBAAoB,iCACpBC,aAAc,eACdC,cAAe,eACfC,UAAW,2BACXC,gBAAiB,iCACjBC,YAAa,4BAGfC,QAAS,CACPC,cAAe,uCACfC,aAAc,2BACdC,cAAe,2BACfC,sBAAuB,yDACvBC,oBAAqB,uCACrBC,6BAA8B,+DAC9BC,8BAA+B,+DAC/BC,0BAA2B,qEAC3BC,uBAAwB,6CACxBC,mCAAoC,uEACpCC,uBAAwB,+DACxBC,kBAAmB,uCACnBC,oBAAqB,uCACrBC,oBAAqB,6CACrBC,yBAA0B,qEAC1BC,sCAAuC,uFACvCC,yBAA0B,2EAC1BC,8BAA+B,2EAC/BC,oBAAqB,uCACrBC,uBAAwB,mDACxBC,4BAA6B,qGAC7BC,6CAA8C,6IAC9CC,kBAAmB,mDACnBC,sBAAuB,+DACvBC,sBAAuB,6CACvBC,wBAAyB,+DACzBC,uBAAwB,+DACxBC,yBAA0B,+DAC1BC,oBAAqB,yDACrBC,8BAA+B,uFAC/BC,oBAAqB,yDACrBC,oBAAqB,yDACrBC,qBAAsB,yDACtBC,gBAAiB,uCACjBC,sBAAuB,qEACvBC,sBAAuB,yDACvBC,sBAAuB,2EACvBC,uBAAwB,+DACxBC,8BAA+B,2EAC/BC,oBAAqB,mDACrBC,mBAAoB,uFACpBC,qBAAsB,yDACtBC,kCAAmC,iCACnCC,8BAA+B,+DAC/BC,6BAA8B,+DAC9BC,kCAAmC,+DACnCC,iCAAkC,+DAClCC,kCAAmC,2EACnCC,iCAAkC,2EAClCC,2BAA4B,+DAC5BC,4BAA6B,+DAC7BC,uBAAwB,+DACxBC,wDAAyD,+GACzDC,oBAAqB,uCACrBC,qCAAsC,qEACtCC,uCAAwC,mDACxCC,gBAAiB,uFACjBC,aAAc,kEACdC,kBAAmB,iCACnBC,oBAAqB,iCACrBC,kBAAmB,iCACnBC,iBAAkB,iCAClBC,iBAAkB,2BAClBC,gBAAiB,2BACjBC,iBAAkB,2BAClBC,kCAAmC,+DACnCC,mCAAoC,uFACpCC,iBAAkB,iCAClBC,mBAAoB,iCACpBC,iBAAkB,iCAClBC,gBAAiB,iCACjBC,wBAAyB,iCACzBC,gBAAiB,2BACjBC,eAAgB,2BAChBC,gBAAiB,2BACjBC,mCAAoC,mDACpCC,yCAA0C,yDAC1CC,mCAAoC,mDACpCC,2BAA4B,mJAC5BC,wBAAyB,6CACzBC,yBAA0B,uCAC1BC,qBAAsB,uCACtBC,wBAAyB,+DACzBC,0BAA2B,6CAC3BC,oBAAqB,mDACrBC,cAAe,kCAGjBC,KAAM,CACJC,gBAAiB,2BACjBC,OAAQ,CACNC,aAAc,6CACdC,kBAAmB,2BACnBC,aAAc,6CACdC,YAAa,8CAEfC,SAAU,qBACVC,UAAW,qBACXC,eAAgB,eAChBC,QAAS,CACPC,iBAAkB,iCAClBC,YAAa,2BACbC,cAAe,iCACfC,4BAA6B,qEAC7BC,0BAA2B,sEAE7BC,YAAa,eACbC,KAAM,CACJC,cAAe,iCACfC,cAAe,uCACfC,gBAAiB,6CACjBC,mCAAoC,+DACpCC,cAAe,uCACfC,cAAe,uCACfC,gBAAiB,6CACjBC,gCAAiC,2EACjCC,2BAA4B,yGAC5BC,eAAgB,eAChBC,iBAAkB,6CAClBC,mBAAoB,uCACpBC,qBAAsB,2EACtBC,mBAAoB,mDACpBC,+BAAgC,qEAChCC,sCAAuC,+DACvCC,0CAA2C,gHAE7CC,YAAa,eACbC,KAAM,CACJC,KAAM,eACNC,KAAM,gBAERC,YAAa,eACbC,KAAM,CACJC,eAAgB,2BAChBC,mBAAoB,2BACpBC,UAAW,2BACXC,OAAQ,eACRC,QAAS,eACTC,WAAY,2BACZC,WAAY,2BACZC,qBAAsB,uCACtBC,2BAA4B,uCAC5BC,mBAAoB,eACpBC,YAAa,CACXC,gBAAiB,2BACjBC,kBAAmB,2BACnBC,YAAa,2BACbC,WAAY,eACZC,KAAM,iBAGVC,gBAAiB,eACjBC,SAAU,CACRC,YAAa,2BACbC,mBAAoB,2BACpBC,SAAU,qBACVC,WAAY,kCAEdC,kBAAmB,eACnBC,WAAY,CACVC,sCAAuC,yGACvCC,eAAgB,qFAChBC,eAAgB,qFAChBC,eAAgB,qFAChBC,eAAgB,sFAElBC,MAAO,CACLC,UAAW,2BACXC,WAAY,2BACZC,eAAgB,2BAChBC,wBAAyB,yDACzBC,sBAAuB,0DAEzBC,gBAAiB,eACjBC,eAAgB,eAChBC,QAAS,CACPC,2BAA4B,2EAC5BC,6BAA8B,mDAC9BC,kCAAmC,qEACnCC,8BAA+B,yDAC/BC,iCAAkC,qEAClCC,kBAAmB,4BAErBC,cAAe,qBACfC,OAAQ,CACNC,iBAAkB,uCAClBC,kBAAmB,uCACnBC,4BAA6B,sEAE/BC,gBAAiB,qBACjBC,SAAU,CACRC,2BAA4B,yDAC5BC,4BAA6B,yDAC7BC,sBAAuB,uCACvBC,mBAAoB,6CACpBC,oCAAqC,sEAEvCC,kBAAmB,uCACnBC,WAAY,CACVC,kBAAmB,uCACnBC,mBAAoB,uCACpBC,kBAAmB,iCACnBC,oBAAqB,mDACrBC,MAAO,eACPC,YAAa,eACbT,mBAAoB,6CACpBU,uBAAwB,qEACxBX,sBAAuB,uCACvBY,0BAA2B,6CAC3BC,gCAAiC,sEAEnCC,uBAAwB,2BACxBC,gBAAiB,CACfV,kBAAmB,uCACnBC,mBAAoB,wCAEtBU,qBAAsB,2BACtBC,cAAe,CACbZ,kBAAmB,uCACnBC,mBAAoB,wCAEtBY,wBAAyB,uCACzBC,iBAAkB,CAChBd,kBAAmB,uCACnBC,mBAAoB,wCAEtBc,iBAAkB,qBAClBC,UAAW,CACThB,kBAAmB,uCACnBC,mBAAoB,wCAEtBgB,yBAA0B,mDAC1BC,kBAAmB,CACjBlB,kBAAmB,uCACnBC,mBAAoB,uCACpBkB,uCAAwC,sEAG1CC,iBAAkB,eAElBC,0BAA2B,iCAC3BC,4BAA6B,CAC3BC,UAAW,iFACXC,qBAAsB,+DACtBC,oBAAqB,8FAGvBC,uBAAwB,2BACxBC,yBAA0B,CACxBC,kCAAmC,2EACnCC,6BAA8B,+DAC9BC,oCAAqC,+DACrCC,mCAAoC,+DACpCC,kCAAmC,iFACnCC,4CAA6C,6FAC7CC,mCAAoC,6FACpCC,2CAA4C,uFAC5CC,oCAAqC,qEACrCC,0CAA2C,2EAC3CC,8BAA+B,gEAGjCC,sBAAuB,2BACvBC,wBAAyB,CACvBC,gCAAiC,iFACjCC,uBAAwB,mDACxBC,mBAAoB,2EACpBC,kBAAmB,iFACnBC,yBAA0B,2EAC1BC,4BAA6B,2EAC7BC,eAAgB,uCAChBC,mBAAoB,2BACpBC,eAAgB,2BAChBC,YAAa,2BACbC,YAAa,4BACbC,kBAAmB,uCACnBC,kBAAmB,0DAGrBC,8BAA+B,2BAC/BC,gCAAiC,CAC/BC,8BAA+B,iFAC/BC,4BAA6B,iFAC7BC,gBAAiB,iCACjBC,4BAA6B,mDAC7BC,wCAAyC,uFACzCC,cAAe,iCACfC,8BAA+B,yGAC/BC,iCAAkC,6FAClCC,iCAAkC,uFAClCC,+BAAgC,8CAGlCC,8BAA+B,2BAC/BC,gCAAiC,CAC/BC,iCAAkC,uFAClCC,qCAAsC,iFACtCC,+BAAgC,yDAChCC,wBAAyB,uFACzBC,qDAAsD,mJACtDC,yCAA0C,qHAC1CC,wCAAyC,qHACzCC,6BAA8B,mDAC9BC,iCAAkC,yDAClCC,4BAA6B,2EAC7BC,gBAAiB,8CAGnBC,8BAA+B,+DAC/BC,gCAAiC,CAC/BC,kBAAmB,oDAGrBC,wBAAyB,iCACzBC,0BAA2B,CACzBC,mCAAoC,qEACpCC,iCAAkC,qEAClCC,yCAA0C,6FAC1CC,2BAA4B,8FAG9BC,gBAAiB,eAEjBC,mBAAoB,qBACpBC,oBAAqB,CACnBC,mBAAoB,mDACpBC,mBAAoB,iCACpBC,mCAAoC,mGACpCC,yBAA0B,iFAC1BC,oBAAqB,2FACrBC,8BAA+B,qHAC/BC,uBAAwB,yDACxBC,yBAA0B,6CAC1BC,sBAAuB,6CACvBC,aAAc,uCACdC,iBAAkB,uCAClBC,gCAAiC,uCACjCC,eAAgB,2BAChBC,aAAc,2BACdC,iBAAkB,mDAClBC,8BAA+B,2HAC/BC,8BAA+B,qHAC/BC,kCAAmC,mJACnCC,6BAA8B,6IAC9BC,2BAA4B,+KAC5BC,8BAA+B,oKAC/Bu2B,yBAA0B,eAC1Bt2B,wBAAyB,8FAG3BC,wBAAyB,2BACzBC,4BAA6B,2BAC7BC,4BAA6B,CAC3BC,cAAe,mDACfC,mBAAoB,+DACpBC,aAAc,4BACdC,uBAAwB,2EACxBC,SAAU,mDACVC,QAAS,2BACTC,WAAY,uCACZC,WAAY,uCACZC,QAAS,iCACTC,eAAgB,iCAChBC,WAAY,6CACZC,YAAa,mDACbC,eAAgB,mDAChBC,YAAa,6CACbC,mBAAoB,oDAEtBC,2BAA4B,2BAC5BC,2BAA4B,CAC1BC,WAAY,eACZC,mBAAoB,2EACpBC,kBAAmB,6CACnBC,kBAAmB,qBACnBC,eAAgB,qBAChBC,MAAO,gBAETC,yBAA0B,qBAC1BC,wBAAyB,CACvBC,iCAAkC,+DAClCC,+BAAgC,8FAElCC,qBAAsB,2BACtBC,sBAAuB,CACrBC,SAAU,4BAEZC,sBAAuB,2BACvBC,sBAAuB,CACrBC,WAAY,eACZC,SAAU,iCACVC,gBAAiB,qBACjBC,WAAY,eACZC,iBAAkB,iCAClBC,aAAc,iCACdC,SAAU,iCACVC,eAAgB,kCAGlBC,8BAA+B,2BAC/BC,+BAAgC,CAC9BC,sCAAuC,qEACvCC,6CAA8C,qEAC9CC,0BAA2B,+DAC3BC,mCAAoC,2HACpCC,mCAAoC,0GAGtCC,gBAAiB,eACjBC,cAAe,eACfC,cAAe,2BACfC,UAAW,2BACXC,QAAS,4BAGXC,WAAY,CACVC,gBAAiB,2BACjBC,sBAAuB,yDACvBC,iBACE,8aACFC,OAAQ,eACRC,QAAS,2BACTC,iBAAkB,oDAGpBC,QAAS,CACPC,KAAM,iCACNC,MAAO,2BACPC,aAAc,eACdC,YAAa,eACbC,UAAW,eACXC,YAAa,eACbC,eAAgB,eAChBC,UAAW,eACXC,UAAW,eACXC,cAAe,eACfC,WAAY,eACZC,oCAAqC,iFACrCC,2BAA4B,mDAC5BC,gCAAiC,qDACjCC,sBAAuB,mDACvBC,iBAAkB,iCAClBC,mBAAoB,iCACpBC,gBAAiB,iCACjBC,4BAA6B,6CAC7BC,6BAA8B,8CAGhCC,WAAY,CACVC,sBAAuB,mDACvBC,WAAY,eACZC,WAAY,6CACZC,WAAY,6CACZC,OAAQ,qBACRC,cAAe,uCACfC,aAAc,eACdC,uBAAwB,+DACxBC,yBAA0B,+DAC1BC,6BAA8B,qEAC9BC,wBAAyB,+DACzBC,6BAA8B,+DAC9BC,yBAA0B,qEAC1BC,iCAAkC,uFAClCC,gCAAiC,uFACjCC,kCAAmC,uFACnCC,sCAAuC,6FACvCC,sCAAuC,uFACvCC,kCAAmC,6FACnCC,gBAAiB,6CACjBC,kBAAmB,8CAGrBC,aAAc,CACZvb,MAAO,eACPwb,UAAW,iCACXC,YAAa,iCACbC,UAAW,iCACXC,cAAe,iCACfC,WAAY,iCACZC,iBAAkB,4BAGpBC,eAAgB,CACdnB,6BAA8B,6FAC9BoB,kCAAmC,mGACnCC,iCAAkC,mGAClCC,mCAAoC,+GACpCC,4BAA6B,6FAC7BC,yBAA0B,6FAC1BC,wBAAyB,uFACzBC,uBAAwB,iFACxBC,yBAA0B,uFAC1BC,uBAAwB,iFACxBC,0BAA2B,6FAC3BC,wBAAyB,uFACzBhC,uBAAwB,uFACxBC,yBAA0B,uFAC1BgC,MAAO,eACPC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,YAAa,qBACbC,gBAAiB,iCACjBC,kDAAmD,qHACnDC,iBAAkB,2BAClBC,uDAAwD,2HACxDC,gBAAiB,2BACjBC,sDAAuD,2HACvDC,kBAAmB,uCACnBC,wDAAyD,uIACzDC,WAAY,qBACZC,iDAAkD,qHAClDC,QAAS,qBACTC,8CAA+C,qHAC/CC,OAAQ,eACRC,6CAA8C,+GAC9CC,MAAO,SACPC,4CAA6C,yGAC7CC,QAAS,eACTC,8CAA+C,+GAC/CC,MAAO,SACPC,4CAA6C,yGAC7CC,SAAU,qBACVC,+CAAgD,qHAChDC,OAAQ,eACRC,6CAA8C,+GAC9CC,MAAO,eACPC,4CAA6C,+GAC7CC,QAAS,eACTC,8CAA+C,+GAC/CC,mBAAoB,iCACpBC,wBAAyB,6CACzBC,uBAAwB,6CACxBC,eAAgB,iCAChBC,WAAY,iCACZC,eAAgB,iCAChBC,YAAa,qBACbC,gCAAiC,qEACjCC,kCAAmC,qEACnCC,kBAAmB,8CACnBC,oBAAqB,yDACrBC,gBAAiB,oDAGnBC,oBAAqB,CACnBC,2BAA4B,+DAC5BC,gCAAiC,qEACjCC,oBAAqB,yDACrBC,oBAAqB,yDACrBC,oBAAqB,+DACrBC,0BAA2B,+DAC3BC,0BAA2B,gEAG7BC,sBAAuB,CACrBC,iCAAkC,iFAClCC,+BAAgC,qEAChCC,eAAgB,qEAChBC,sBAAuB,yDACvBC,uBAAwB,qEACxBC,oBAAqB,+DACrBC,0BAA2B,+DAC3BC,0BAA2B,gEAG7BC,sBAAuB,CACrBjO,kBAAmB,mDACnBkO,oCAAqC,iFACrCC,+BAAgC,iFAChCC,+BAAgC,iFAChCC,iCAAkC,uFAClCC,iCAAkC,uFAClCC,yCAA0C,6FAC1CC,qCAAsC,6FACtCC,sCAAuC,iFACvCC,mCAAoC,wFAGtCC,WAAY,CACV9E,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXzC,6BAA8B,+GAC9BwB,yBAA0B,+GAC1BK,0BAA2B,+GAC3BC,wBAAyB,yGACzBhC,uBAAwB,yGACxBC,yBAA0B,yGAC1BgC,MAAO,eACPW,YAAa,qBACbqE,8CAA+C,uIAC/C1D,QAAS,qBACT2D,0CAA2C,uIAC3CjD,SAAU,qBACVkD,2CAA4C,uIAC5ChD,OAAQ,eACRiD,yCAA0C,iIAC1C/C,MAAO,eACPgD,wCAAyC,iIACzC9C,QAAS,eACT+C,0CAA2C,iIAC3CC,eAAgB,uCAChBC,wBAAyB,qEACzBC,wBAAyB,qEACzBC,mBAAoB,mDACpBC,WAAY,uCACZC,aAAc,iCACdC,qBAAsB,+DACtBC,0BAA2B,2EAC3BC,qBAAsB,qEACtBlD,WAAY,iCACZmD,UAAW,qBACXjD,YAAa,4BAGfkD,YAAa,CACX/F,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXuF,QAAS,qBACTC,iBAAkB,uCAClBC,iBAAkB,uCAClBC,gBAAiB,uCACjBC,gBAAiB,uCACjBC,UAAW,2BACXC,MAAO,eACPC,OAAQ,eACRC,YAAa,2BACbC,UAAW,2BACXC,QAAS,qBACTC,UAAW,2BACXrX,UAAW,2BACXsX,UAAW,2BACXC,UAAW,eACXC,WAAY,eACZC,WAAY,eACZC,wBAAyB,uCACzBC,uBAAwB,uCACxBC,aAAc,2BACdC,gBAAiB,uCACjBC,qBAAsB,qEACtBC,2BAA4B,qEAC5BC,oBAAqB,mDACrBC,YAAa,uCACbC,OAAQ,eACRC,sBAAuB,6CACvBC,sCAAuC,2EACvCC,sCAAuC,2EACvCC,qBAAsB,iCACtBC,2BAA4B,2BAC5BC,yBAA0B,2BAC1BC,wBAAyB,qBACzBC,+BAAgC,qBAChCC,0BAA2B,qBAC3BC,uBAAwB,2BACxBC,gCAAiC,yCACjCC,6BAA8B,yCAC9BC,+BAAgC,yCAChCC,iCAAkC,yCAClCC,sBAAuB,2BACvBC,0BAA2B,2BAC3BC,2BAA4B,2BAC5BC,+BAAgC,iCAChCC,kCAAmC,iCACnCC,gCAAiC,uCACjCC,+BAAgC,uCAChCC,4BAA6B,2BAC7BC,qCAAsC,sHAGxCC,iBAAkB,CAChBC,aAAc,eACdC,WAAY,eACZC,UAAW,eACXC,UAAW,eACXC,iBAAkB,2BAClBC,yBAA0B,uCAC1BC,0BAA2B,iCAC3BC,kCAAmC,6CACnCC,gCAAiC,yDACjChC,sBAAuB,6CACvBiC,WAAY,eACZC,KAAM,eACNC,oBAAqB,iCACrBC,UAAW,2BACXC,iCAAkC,iCAClCC,kCAAmC,iCACnCC,gCAAiC,uCACjCC,iCAAkC,uCAClCC,6BAA8B,2BAC9BC,8BAA+B,2BAC/BC,gCAAiC,mDACjCC,cAAe,qBACfC,WAAY,qBACZC,aAAc,2BACdC,6BAA8B,mDAC9BC,8BAA+B,mDAC/BC,eAAgB,uCAChBC,mBAAoB,uCACpBC,cAAe,2BACfC,cAAe,2BACfC,aAAc,2BACdC,KAAM,eACNC,UAAW,2BACXC,aAAc,2BACdC,gBAAiB,2BACjBC,cAAe,2BACfC,qBAAsB,2BACtBC,kBAAmB,2BACnBC,qBAAsB,yDACtBC,kBAAmB,6CACnBC,iBAAkB,6FAClBC,eAAgB,2EAChBC,qBAAsB,iFACtBC,6BAA8B,yDAC9BC,gCAAiC,oDAGnCC,SAAU,CACRC,UAAW,uCACXC,KAAM,eACNvvB,KAAM,eACNwvB,OAAQ,4BAGVC,WAAY,CACVF,KAAM,eACNvvB,KAAM,eACNwvB,OAAQ,gBAGVE,WAAY,CACVC,aAAc,2BACdJ,KAAM,eACNK,SAAU,qBACVC,mBAAoB,oDAGtBC,UAAW,CACTtsB,MAAO,eACPusB,UAAW,eACXC,MAAO,eACPC,gBAAiB,2BACjBC,OAAQ,gBAGVC,mBAAoB,CAClBC,gBAAiB,iCACjBC,KAAM,eACNC,WAAY,2BACZC,WAAY,2BACZC,gBAAiB,6CACjBC,qCAAsC,qEACtCC,YAAa,4BAGfC,oCAAqC,CACnCC,qBAAsB,mDACtB5J,oBAAqB,uCACrB6J,2BAA4B,uCAC5B3J,0BAA2B,wCAG7B4J,eAAgB,CACdC,mBAAoB,iCACpBC,4BAA6B,iFAC7BC,gBAAiB,oDACjBC,yBAA0B,6FAC1BC,cAAe,6CACfC,YAAa,2BACbC,SAAU,eACVC,UAAW,eACXC,WAAY,2BACZC,OAAQ,SACRC,WAAY,iCACZC,WAAY,iCACZC,UAAW,2BACXC,sBAAuB,2BACvBC,QAAS,2BACTC,uBAAwB,2EACxBC,YAAa,2BACbC,UAAW,iCACXC,4BAA6B,mDAC7BC,0BAA2B,mDAC3BC,0BAA2B,mDAC3BC,mBAAoB,uCACpBC,wBAAyB,qEACzBC,8BAA+B,qEAC/BC,uBAAwB,mDACxBC,eAAgB,wCAGlBC,aAAc,CACZC,gBAAiB,6CACjBtyB,MAAO,eACPuyB,UAAW,eACXC,MAAO,qBACPC,SAAU,uCACVC,gBAAiB,qBACjBC,gBAAiB,qBACjBC,SAAU,eACVC,SAAU,eACVC,kBAAmB,iCACnBC,MAAO,eACPC,KAAM,eACNC,eAAgB,iCAChBC,oBAAqB,uCACrBC,gCAAiC,mDACjCC,6BAA8B,gCAGhCC,oBAAqB,CACnBC,aAAc,2BACdC,QAAS,eACTC,YAAa,qBACbC,YAAa,eACbC,wBAAyB,6CACzBC,mCAAoC,2EACpCC,4BAA6B,yDAC7BC,oBAAqB,8CAGvBC,qBAAsB,CACpBC,aAAc,qBACdC,kCAAmC,qEACnCV,aAAc,2BACdC,QAAS,eACTC,YAAa,qBACbS,yBAA0B,yDAC1BC,oCAAqC,uFACrCC,6BAA8B,qEAC9BC,qBAAsB,0DAGxBC,cAAe,CACbC,MAAO,qBACPC,+BAAgC,qEAChCC,kBAAmB,uCACnBC,6BAA8B,qEAC9BC,sBAAuB,mDACvBC,cAAe,wCAGjBC,kBAAmB,CACjBC,kBAAmB,iCACnBC,YAAa,2BACbC,sBAAuB,mDACvBC,UAAW,qBACXC,YAAa,2BACbxB,YAAa,eACbyB,kCAAmC,qEACnCC,sBAAuB,6CACvBC,kCAAmC,2EACnCC,2BAA4B,yDAC5BC,mBAAoB,8CAGtBC,SAAU,CACRC,eAAgB,2BAChBpS,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACX4R,WAAY,2BACZC,aAAc,2BACdC,kBAAmB,uCACnBC,wBAAyB,yDACzBC,iBAAkB,uCAClBC,SAAU,2BACV/Q,QAAS,eACTgR,eAAgB,6CAChBC,iBAAkB,yDAClBjT,yBAA0B,uFAC1BkT,4CAA6C,+GAC7ChR,MAAO,SACPjC,uBAAwB,iFACxBkT,0CAA2C,yGAC3CpS,YAAa,qBACbqS,mBAAoB,mDACpBC,qBAAsB,+DACtBhV,6BAA8B,6FAC9BiV,gDAAiD,qHACjD5R,QAAS,qBACT6R,eAAgB,mDAChBC,iBAAkB,+DAClB3T,yBAA0B,6FAC1B4T,4CAA6C,qHAC7C7R,OAAQ,eACR9B,wBAAyB,uFACzB4T,2CAA4C,+GAC5CC,gBAAiB,2EACjBC,kBAAmB,uFACnB1T,0BAA2B,6FAC3B2T,cAAe,qBACfC,iBAAkB,eAClBC,cAAe,eACfC,gBAAiB,eACjBjN,QAAS,qBACTkN,iBAAkB,2BAClBC,eAAgB,2BAChBC,mBAAoB,2BACpBC,eAAgB,2BAChB/zB,MAAO,2BACPoB,OAAQ,eACRjB,UAAW,eACXF,QAAS,eACT+zB,sBAAuB,6CACvBC,uBAAwB,6CACxBC,KAAM,eACNC,KAAM,eACNj2B,QAAS,eACTk2B,MAAO,eACPC,cAAe,iCACfC,YAAa,uCACbC,QAAS,eACTC,aAAc,2BACdC,eAAgB,2BAChBC,cAAe,2BACfC,cAAe,2BACfC,aAAc,4BAGhBC,WAAY,CACVC,eAAgB,iCAChBC,oBAAqB,+DACrBC,0BAA2B,+DAC3BC,mBAAoB,6CACpBC,WAAY,iCACZ/zB,MAAO,eACPC,OAAQ,eACR+zB,QAAS,yDACTC,wBAAyB,6CACzBC,QAAS,eACTC,kBAAmB,iCACnBC,gBAAiB,iCACjBC,aAAc,2BACdC,yBAA0B,6CAC1BC,uBAAwB,6CACxBC,aAAc,2BACdC,KAAM,eACNlP,QAAS,2BACTmP,yBAA0B,8FAC1BC,QAAS,qBACTC,YAAa,iCACbC,aAAc,iCACdC,aAAc,iCACdC,aAAc,2BACdC,aAAc,iCACdC,MAAO,eACPC,WAAY,2BACZC,UAAW,2BACXt2B,MAAO,2BACPu2B,WAAY,2BACZC,QAAS,eACTC,OAAQ,eACRC,UAAW,qBACXC,SAAU,eACVvC,MAAO,gBAGTwC,SAAU,CACRxE,eAAgB,2BAChBpS,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXuW,aAAc,iCACdC,wBAAyB,+DACzBC,iBAAkB,6CAClBC,SAAU,iCACVC,gBAAiB,uCACjBC,2BAA4B,qEAC5BC,YAAa,uCACbC,oBAAqB,uCACrBC,cAAe,2BACfC,YAAa,2BACbC,gBAAiB,2BACjBC,YAAa,2BACbC,UAAW,2BACXC,cAAe,uCACfC,UAAW,2BACXjR,QAAS,qBACTkR,cAAe,2BACfnE,iBAAkB,eAClBoE,gBAAiB,eACjBC,eAAgB,eAChBpX,YAAa,qBACbqS,mBAAoB,mDACpBC,qBAAsB,+DACtBhV,6BAA8B,mGAC9B+Z,gDAAiD,2HACjDpW,QAAS,eACTgR,eAAgB,6CAChBC,iBAAkB,yDAClBjT,yBAA0B,6FAC1BqY,4CAA6C,qHAC7C3W,QAAS,qBACT6R,eAAgB,mDAChBC,iBAAkB,+DAClB3T,yBAA0B,mGAC1ByY,4CAA6C,2HAC7C1W,OAAQ,eACR9B,wBAAyB,6FACzByY,2CAA4C,qHAC5CC,sBAAuB,mDACvBC,uBAAwB,mDACxBC,KAAM,2BACNC,QAAS,qBACTC,WAAY,sBACZC,cAAe,6BAGjBC,SAAU,CACRrG,eAAgB,2BAChBpS,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXC,UAAW,2BACXiY,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,UAAW,iCACXC,aAAc,2BACdC,eAAgB,yDAChBC,wBAAyB,yDACzBC,iBAAkB,uCAClBC,SAAU,2BACVC,SAAU,qBACV9C,QAAS,eACTC,OAAQ,eACRlQ,OAAQ,eACRwH,WAAY,2BACZ4I,SAAU,gBAGZ4C,cAAe,CACbt7B,KAAM,2BACNu7B,IAAK,4BAGPC,gBAAiB,CACfC,2BAA4B,mDAC5BC,4BAA6B,mDAC7BC,uCAAwC,+DACxCC,cAAe,2BACfC,aAAc,4BAGhBC,0BAA2B,CACzBC,cAAe,6CACfC,UAAW,iCACXC,kCAAmC,gEAGrCC,iBAAkB,CAChBC,OAAQ,eACRC,UAAW,2BACXC,KAAM,eACNC,iBAAkB,yDAClBC,oBAAqB,6DACrBC,IAAK,eACLC,kBAAmB,uDACnBC,kBAAmB,yDACnBC,YAAa,uCACbC,WAAY,uCACZC,eAAgB,2BAChBC,iBAAkB,uCAClBC,kBAAmB,uCACnBC,gBAAiB,2BACjBC,2BAA4B,kBAC5BC,cAAe,2BACfC,yBAA0B,kBAC1BC,WAAY,2BACZC,sBAAuB,kBACvBC,KAAM,eACNC,gBAAiB,2BACjB9tB,UAAW,2BACXG,WAAY,2BACZ4tB,YAAa,gDAGfC,SAAU,CACR9d,cAAe,uCACf+d,gBAAiB,qBACjBC,oBAAqB,2EACrBp6B,YAAa,iCACb84B,KAAM,4BAGRuB,gBAAiB,CACfC,qBAAsB,qEACtB1P,SAAU,qBACV2P,aAAc,2BACdC,2BAA4B,6CAC5BC,gBAAiB,4BAGnBC,YAAa,CACXC,YAAa,2BACbC,gBAAiB,wCAGnBC,oBAAqB,CACnBC,oBAAqB,uCACrBC,qBAAsB,uCACtBC,OAAQ,eACRC,GAAI,eACJC,WAAY,eACZC,IAAK,sBAGPC,qBAAsB,CACpBC,qBAAsB,uCACtBC,sBAAuB,uCACvBC,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbC,mCAAoC,2EACpCC,OAAQ,eACRC,UAAW,qBACXC,aAAc,qBACdC,WAAY,2BACZC,UAAW,iCACXC,YAAa,kCAGfC,0BAA2B,CACzBC,0BAA2B,mDAC3BC,2BAA4B,mDAC5Bb,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbW,wCAAyC,kFAG3CC,wBAAyB,CACvBC,wBAAyB,mDACzBC,yBAA0B,mDAC1BjB,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbe,uCAAwC,kFAG1CC,2BAA4B,CAC1BC,2BAA4B,+DAC5BC,4BAA6B,+DAC7BrB,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbmB,yCAA0C,8FAG5CC,oBAAqB,CACnBC,oBAAqB,6CACrBC,qBAAsB,6CACtBzB,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACbuB,kCAAmC,4EAGrCC,uBAAwB,CACtBC,uBAAwB,2EACxBC,wBAAyB,2EACzBC,sBAAuB,uCACvBC,iBAAkB,2BAClB/B,MAAO,qBACPC,aAAc,uCACdC,WAAY,iCACZC,YAAa,iCACb6B,qCAAsC,0GAGxCC,cAAe,CACbC,mBAAoB,6CACpBxsB,UAAW,eACXysB,gBAAiB,kBAGnBC,eAAgB,CACdC,UAAW,2BACXC,uBAAwB,mDACxBC,cAAe,iCACfC,QAAS,uCACTC,aAAc,iCACdC,aAAc,2BACdC,yBAA0B,mDAC1BC,wBAAyB,mDACzBC,mDAAoD,0IAGtDC,iBAAkB,CAChBT,UAAW,2BACXC,uBAAwB,mDACxBC,cAAe,iCACfQ,WAAY,2BACZC,oBAAqB,uCACrBC,gCAAiC,+DACjCC,+BAAgC,6CAChCC,sDAAuD,0IAGzDC,aAAc,CACZC,gBAAiB,2BACjBC,mBAAoB,iCACpBC,qBAAsB,iCACtBC,QAAS,eACTC,YAAa,eACbC,mBAAoB,eACpBC,wBAAyB,2BACzBC,2BAA4B,iCAC5BC,qCAAsC,qEACtCjgB,gBAAiB,6CACjBkgB,oBAAqB,uCACrBC,qBAAsB,uCACtBC,qBAAsB,uCACtBC,wBAAyB,mDACzBC,yCAA0C,qHAC1CC,sCAAuC,0GACvCC,4BAA6B,qEAC7BC,oBAAqB,uCACrBC,mBAAoB,uCACpBC,uBAAwB,mDACxBC,sBAAuB,mDACvBC,wBAAyB,uCACzBC,wBAAyB,iCACzBC,qCAAsC,+DACtCC,uCAAwC,2EACxCC,sBAAuB,iCACvBC,YAAa,sBACbC,YAAa,uBAGfC,qBAAsB,CACpBC,kBAAmB,uCACnBC,KAAM,2BACNC,gBAAiB,qDACjBC,cAAe,2DACfC,+BAAgC,qEAChCC,yCAA0C,yGAC1CC,mBAAoB,2KACpBC,MAAO,2BACPC,aAAc,2BACdC,sBAAuB,2BACvBC,UAAW,2BACXC,SAAU,2BACVC,QAAS,4BAGXC,aAAc,CACZC,cAAe,4BAGjBC,wBAAyB,CACvBC,0BAA2B,uCAC3BC,WAAY,4BAGdC,eAAgB,CACdC,oBAAqB,iCACrBC,wBAAyB,2BACzBC,uBAAwB,uCACxBC,aAAc,2BACdC,SAAU,4BAGZC,gBAAiB,CACfC,qBAAsB,uCACtBC,iBAAkB,uCAClBC,iBAAkB,wCAGpBC,uBAAwB,CACtBC,aAAc,iCACdC,oBAAqB,mDACrBC,wBAAyB,yDACzBC,+BAAgC,0DAGlCC,gBAAiB,CACfC,0BAA2B,+DAC3BC,wBAAyB,+DACzBC,gCAAiC,uFACjCC,yBAA0B,iFAC1BC,2BAA4B,qEAC5BC,6BAA8B,qEAC9BC,8BAA+B,iFAC/BC,uBAAwB,+DACxBC,+BAAgC,6FAChCC,sBAAuB,gEAGzBC,QAAS,CACPC,UAAW,qBACXC,OAAQ,eACRC,cAAe,2BACfC,QAAS,2BACTC,UAAW,2BACXC,QAAS,qBACTC,eAAgB,6CAChBC,aAAc,uCACdC,WAAY,uCACZC,eAAgB,uCAChBC,eAAgB,uCAChBC,UAAW,iCACXC,UAAW,iCACXC,cAAe,iCACfC,eAAgB,mDAChBC,iBAAkB,uCAClBC,mBAAoB,uCACpBC,oBAAqB,mDACrBC,aAAc,iCACdC,eAAgB,6CAChBC,SAAU,2BACVC,QAAS,2BACTC,UAAW,2BACXC,UAAW,2BACXC,uCAAwC,uFACxCC,mCAAoC,6FACpCC,gBAAiB,6CACjBC,WAAY,2BACZC,uBAAwB,yDACxBC,wBAAyB,6CACzBC,8BAA+B,mDAC/BC,oBAAqB,uFACrBC,yBAA0B,yDAC1BC,qBAAsB,+DACtBC,mBAAoB,yDACpBC,qBAAsB,yDACtBC,mBAAoB,mDACpBC,0BAA2B,2EAC3BC,wBAAyB,qEACzBC,sBAAuB,qEACvBC,0BAA2B,qEAC3BC,0BAA2B,qEAC3BC,yBAA0B,+DAC1BC,qBAAsB,+DACtBC,0BAA2B,iFAC3BC,4BAA6B,qEAC7BC,8BAA+B,qEAC/BC,+BAAgC,iFAChCC,wBAAyB,+DACzBC,0BAA2B,2EAC3BC,oBAAqB,yDACrBC,mBAAoB,yDACpBC,qBAAsB,yDACtBC,qBAAsB,0DAGxBC,QAAS,CACPC,QAAS,yDACTC,qBAAsB,6CACtBC,gBAAiB,6CACjBC,6BAA8B,oDAGhCC,KAAM,CACJC,MAAO,qBACPC,MAAO,eACPC,QAAS,qBACTC,QAAS,eACTC,IAAK,eACLC,QAAS,2BACTC,OAAQ,eACRC,SAAU,eACVC,MAAO,eACPC,IAAK,eACLC,KAAM,eACNC,OAAQ,gBAGVC,OAAQ,CACNC,WAAY,eACZC,QAAS,eACTC,aAAc,uCACdC,aAAc,uCACdC,aAAc,uCACdC,aAAc,uCACdC,SAAU,eACVC,MAAO,eACPC,UAAW,qBACXC,MAAO,eACPC,QAAS,qBACTC,OAAQ,qBACRC,UAAW,qBACXC,SAAU,qBACVC,MAAO,qBACPC,YAAa,eACbC,aAAc,gBAGhBC,OAAQ,CACNC,KAAM,eACNC,KAAM,eACNC,MAAO,qBACPC,WAAY,qBACZC,KAAM,eACNC,QAAS,2BACTC,MAAO,qBACPC,KAAM,SACNC,KAAM,eACNC,KAAM,eACNC,SAAU,qBACVC,KAAM,eACNC,KAAM,eACNC,KAAM,eACNC,SAAU,qBACVC,KAAM,eACNC,KAAM,eACNC,KAAM,eACNC,KAAM,eACNC,KAAM,SACNC,QAAS,qBACTC,KAAM,eACNC,KAAM,eACNC,KAAM,eACNC,SAAU,qBACVC,KAAM,eACNC,OAAQ,qBACRC,OAAQ,qBACRC,KAAM,eACNC,KAAM,eACNC,MAAO,qBACPC,MAAO,qBACPC,SAAU,2BACVC,KAAM,eACNC,KAAM,eACNC,OAAQ,sBAGVC,QAAS,CACPC,EAAG,SACHC,EAAG,SACHC,EAAG,SACHC,EAAG,UAGLC,MAAO,CACLC,QAAS,eACTC,SAAU,eACVC,MAAO,eACPC,MAAO,eACPC,IAAK,eACLb,KAAM,eACNc,KAAM,eACNC,OAAQ,eACRC,UAAW,eACXC,QAAS,eACTC,SAAU,qBACVC,SAAU,sBAGZC,UAAW,CACTC,kBAAmB,uCACnBC,cAAe,iCACfC,kBAAmB,uCACnBC,iCAAkC,yDAClCC,uBAAwB,uCACxBC,uBAAwB,uCACxBC,sBAAuB,6CACvBC,gCAAiC,kEH9nDjCI,GI5BiB,CACrB5zC,YAAa,CACXC,KAAM,CACJC,IAAK,mCACLC,QAAS,UACTC,QAAS,4FAGXC,OAAQ,CACNC,UAAW,sFACXC,OAAQ,WAGVC,QAAS,CACPC,sBAAuB,+BACvBC,eAAgB,0BAChBC,cAAe,4BACfC,SAAU,WACVC,QAAS,YACTC,SAAU,mBACVC,QAAS,QACTC,eAAgB,kBAChBC,mBACE,iZACFC,QAAS,2FACTC,YAAa,eAGfC,KAAM,CACJC,WAAY,cACZC,MAAO,QACPC,OAAQ,SACRC,MAAO,QACPC,OAAQ,SACRC,YAAa,cACbC,KAAM,OACNC,KAAM,OACNC,SAAU,YACVC,UAAW,aACXC,MAAO,QACPC,OAAQ,SACRC,OAAQ,SACRC,WAAY,cACZC,MAAO,QACPC,YAAa,eACbC,KAAM,OACNC,gBAAiB,sBACjBC,kBAAmB,gCACnBC,kBAAmB,IACnBC,QAAS,aACTC,eAAgB,IAChBC,QAAS,WACTC,QAAS,UACTC,QAAS,UACTC,cAAe,sBACfC,cAAe,iBACfC,aAAc,gBACdC,aAAc,gBACdC,GAAI,IACJC,KAAM,UACNC,KAAM,OACNC,QAAS,UACTC,QAAS,WACTC,MAAO,QACPC,MAAO,QACPC,YAAa,cACbC,OAAQ,SACRC,MAAO,QACPC,OAAQ,UACRC,OAAQ,UACRC,qBAAsB,wBACtBC,kBAAmB,qBACnBC,OAAQ,UACRC,OAAQ,UACRC,uBAAwB,2BACxBC,mBAAoB,uBACpBC,mBAAoB,sBACpBC,8BAA+B,sBAC/BC,yCACE,oOACFC,MAAO,QACPC,KAAM,QACNC,KAAM,UACNC,YAAa,sBACbC,UAAW,cACXC,OAAQ,aACRC,MAAO,QACPC,KAAM,SACNC,IAAK,SACLC,OAAQ,WACRC,KAAM,mBACNC,YAAa,cACbC,MAAO,QACPC,QAAS,UACTC,KAAM,YACNC,UAAW,SACXC,IAAK,QACLC,GAAI,KACJC,GAAI,KACJC,OAAQ,WACRC,MAAO,UACPC,MAAO,SACPC,QAAS,YACTC,IAAK,MACLC,MAAO,QACPC,OAAQ,SACRC,MAAO,UACPC,QAAS,QACTC,QAAS,UACTC,SAAU,WACVC,OAAQ,WACRC,MAAO,QACPC,OAAQ,SACRC,OAAQ,SACRC,MAAO,YACPC,QAAS,SACTC,YAAa,cACbC,QAAS,SACTC,KAAM,UACNC,QAAS,SACTC,KAAM,QACNC,KAAM,SACNC,MAAO,YACPC,MAAO,cACPC,OAAQ,YACRC,OAAQ,YACRC,SAAU,WACVC,SAAU,UACVC,MAAO,MACPC,IAAK,SACLC,KAAM,OACNC,SAAU,YACVC,UAAW,eACXC,YAAa,cACbC,IAAK,MACLC,OAAQ,SACRC,eAAgB,MAChBC,aAAc,IACdC,aAAc,IACdC,YAAa,IACbC,YAAa,IACbC,MAAO,QACPC,SAAU,WACVC,OAAQ,SACRC,QAAS,UACTC,MAAO,QACPC,YAAa,cACbC,cAAe,iBACfC,kBAAmB,qBACnBC,OAAQ,SACRC,UAAW,YACXC,SAAU,WACVC,oBAAqB,uBACrBC,mBAAoB,sBACpBC,eAAgB,kBAChBC,kBAAmB,qBACnBC,kBAAmB,qBACnBC,aAAc,eACdC,UAAW,YACXC,SAAU,WACVC,IAAK,MACLC,MAAO,SAGTC,OAAQ,CACNC,UAAW,cACXC,kBAAmB,QACnBC,cAAe,UACfC,eAAgB,aAChBC,cAAe,SACfC,kBAAmB,cACnBC,mBAAoB,eACpBC,qBAAsB,iBACtBC,uBAAwB,mBACxBC,wBAAyB,oBACzBC,iBAAkB,YAClBC,mBAAoB,eACpBC,aAAc,QACdC,cAAe,YACfC,UAAW,aACXC,gBAAiB,YACjBC,YAAa,gBAGfC,QAAS,CACPC,cAAe,kBACfC,aAAc,iBACdC,cAAe,kBACfC,sBAAuB,4BACvBC,oBAAqB,2BACrBC,6BAA8B,oCAC9BC,8BAA+B,oCAC/BC,0BAA2B,qCAC3BC,uBAAwB,8BACxBC,mCAAoC,8CACpCC,uBAAwB,4BACxBC,kBAAmB,0BACnBC,oBAAqB,4BACrBC,oBAAqB,4BACrBC,yBAA0B,wCAC1BC,sCAAuC,sDACvCC,yBAA0B,uDAC1BC,8BAA+B,6CAC/BC,oBAAqB,4BACrBC,uBAAwB,4BACxBC,4BAA6B,mDAC7BC,6CAA8C,mEAC9CC,kBAAmB,+BACnBC,sBAAuB,4BACvBC,sBAAuB,0BACvBC,wBAAyB,8BACzBC,uBAAwB,6BACxBC,yBAA0B,+BAC1BC,oBAAqB,4BACrBC,8BAA+B,4CAC/BC,oBAAqB,6BACrBC,oBAAqB,6BACrBC,qBAAsB,8BACtBC,gBAAiB,oBACjBC,sBAAuB,gCACvBC,sBAAuB,+BACvBC,sBAAuB,+BACvBC,uBAAwB,mCACxBC,8BAA+B,2CAC/BC,oBAAqB,kCACrBC,mBAAoB,4BACpBC,qBAAsB,4BACtBC,kCAAmC,iCACnCC,8BAA+B,qCAC/BC,6BAA8B,uCAC9BC,kCAAmC,yCACnCC,iCAAkC,2CAClCC,kCAAmC,yCACnCC,iCAAkC,2CAClCC,2BAA4B,qCAC5BC,4BAA6B,mCAC7BC,uBAAwB,8BACxBC,wDACE,wEACFC,oBAAqB,2BACrBC,qCAAsC,iDACtCC,uCAAwC,gDACxCC,gBAAiB,0BACjBC,aAAc,wBACdC,kBAAmB,sBACnBC,oBAAqB,wBACrBC,kBAAmB,sBACnBC,iBAAkB,qBAClBC,iBAAkB,oBAClBC,gBAAiB,mBACjBC,iBAAkB,oBAClBC,kCAAmC,0CACnCC,mCAAoC,0CACpCC,iBAAkB,qBAClBC,mBAAoB,uBACpBC,iBAAkB,qBAClBC,gBAAiB,oBACjBC,wBAAyB,kCACzBC,gBAAiB,mBACjBC,eAAgB,kBAChBC,gBAAiB,mBACjBC,mCAAoC,8CACpCC,yCAA0C,sDAC1CC,mCAAoC,gDACpCC,2BACE,iGACFC,wBAAyB,oCACzBC,yBAA0B,+BAC1BC,qBAAsB,2BACtBC,wBAAyB,wCACzBC,0BAA2B,4CAC3BC,oBAAqB,+BACrBC,cAAe,mBAGjBC,KAAM,CACJC,gBAAiB,mBACjBC,OAAQ,CACNC,aAAc,iBACdC,kBAAmB,yBACnBC,aAAc,iBACdC,YAAa,iBAEfC,SAAU,iBACVC,UAAW,qBACXC,eAAgB,UAChBC,QAAS,CACPC,iBAAkB,qBAClBC,YAAa,eACbC,cAAe,kBACfC,4BAA6B,0CAC7BC,0BAA2B,qCAE7BC,YAAa,UACbC,KAAM,CACJC,cAAe,sBACfC,cAAe,sBACfC,gBAAiB,6BACjBC,mCAAoC,+DACpCC,cAAe,2BACfC,cAAe,6BACfC,gBAAiB,kCACjBC,gCAAiC,kFACjCC,2BAA4B,oDAC5BC,eAAgB,4BAChBC,iBAAkB,sBAClBC,mBAAoB,wBACpBC,qBAAsB,kDACtBC,mBAAoB,gDACpBC,+BAAgC,wCAChCC,sCAAuC,iDACvCC,0CAA2C,6DAE7CC,YAAa,SACbC,KAAM,CACJC,KAAM,WACNC,KAAM,WAERC,YAAa,QACbC,KAAM,CACJC,eAAgB,kBAChBC,mBAAoB,WACpBC,UAAW,WACXC,OAAQ,UACRC,QAAS,SACTC,WAAY,mBACZC,WAAY,iBACZC,qBAAsB,yBACtBC,2BAA4B,+BAC5BC,mBAAoB,cACpBC,YAAa,CACXC,gBAAiB,2BACjBC,kBAAmB,8BACnBC,YAAa,iBACbC,WAAY,gBACZC,KAAM,SAGVC,gBAAiB,WACjBC,SAAU,CACRC,YAAa,mBACbC,mBAAoB,sBACpBC,SAAU,WACVC,WAAY,cAEdC,kBAAmB,aACnBC,WAAY,CACVC,sCAAuC,6CACvCC,eAAgB,oDAChBC,eAAgB,oDAChBC,eAAgB,oDAChBC,eAAgB,qDAElBC,MAAO,CACLC,UAAW,aACXC,WAAY,cACZC,eAAgB,mBAChBC,wBAAyB,6BACzBC,sBAAuB,4BAEzBC,gBAAiB,cACjBC,eAAgB,UAChBC,QAAS,CACPC,2BAA4B,gCAC5BC,6BAA8B,kCAC9BC,kCAAmC,yCACnCC,8BAA+B,wCAC/BC,iCAAkC,gCAClCC,kBAAmB,sBAErBC,cAAe,WACfC,OAAQ,CACNC,iBAAkB,wBAClBC,kBAAmB,wBACnBC,4BAA6B,2CAE/BC,gBAAiB,WACjBC,SAAU,CACRC,2BAA4B,gCAC5BC,4BAA6B,iCAC7BC,sBAAuB,0BACvBC,mBAAoB,wBACpBC,oCAAqC,+CAEvCC,kBAAmB,kBACnBC,WAAY,CACVC,kBAAmB,iCACnBC,mBAAoB,gCACpBC,kBAAmB,qBACnBC,oBAAqB,8BACrBC,MAAO,SACPC,YAAa,aACbT,mBAAoB,wBACpBU,uBAAwB,6BACxBX,sBAAuB,0BACvBY,0BAA2B,8BAC3BC,gCAAiC,2CAEnCC,uBAAwB,mBACxBC,gBAAiB,CACfV,kBAAmB,sBACnBC,mBAAoB,wBAEtBU,qBAAsB,iBACtBC,cAAe,CACbZ,kBAAmB,sBACnBC,mBAAoB,wBAEtBY,wBAAyB,oBACzBC,iBAAkB,CAChBd,kBAAmB,sBACnBC,mBAAoB,wBAEtBc,iBAAkB,YAClBC,UAAW,CACThB,kBAAmB,sBACnBC,mBAAoB,wBAEtBgB,yBAA0B,sBAC1BC,kBAAmB,CACjBlB,kBAAmB,sBACnBC,mBAAoB,uBACpBkB,uCAAwC,mDAG1CC,iBAAkB,YAElBC,0BAA2B,gBAC3BC,4BAA6B,CAC3BC,UAAW,2DACXC,qBAAsB,yBACtBC,oBAAqB,iCAGvBC,uBAAwB,mBACxBC,yBAA0B,CACxBC,kCAAmC,yCACnCC,6BAA8B,oCAC9BC,oCAAqC,2CACrCC,mCAAoC,0CACpCC,kCAAmC,0CACnCC,4CAA6C,qDAC7CC,mCAAoC,sDACpCC,2CAA4C,mDAC5CC,oCAAqC,4CACrCC,0CAA2C,kDAC3CC,8BAA+B,sCAGjCC,sBAAuB,kBACvBC,wBAAyB,CACvBC,gCAAiC,wCACjCC,uBAAwB,4BACxBC,mBAAoB,0BACpBC,kBAAmB,uBACnBC,yBAA0B,gCAC1BC,4BAA6B,mCAC7BC,eAAgB,mBAChBC,mBAAoB,wBACpBC,eAAgB,kBAChBC,YAAa,eACbC,YAAa,gBACbC,kBAAmB,sBACnBC,kBAAmB,wBAGrBC,8BAA+B,2BAC/BC,gCAAiC,CAC/BC,8BAA+B,uBAC/BC,4BAA6B,oBAC7BC,gBAAiB,oBACjBC,4BAA6B,iCAC7BC,wCAAyC,uCACzCC,cAAe,qBACfC,8BAA+B,oEAC/BC,iCAAkC,qDAClCC,iCAAkC,wCAClCC,+BAAgC,sCAGlCC,8BAA+B,2BAC/BC,gCAAiC,CAC/BC,iCAAkC,0CAClCC,qCAAsC,+CACtCC,+BAAgC,uCAChCC,wBAAyB,4BACzBC,qDACE,+DACFC,yCAA0C,iDAC1CC,wCAAyC,+CACzCC,6BAA8B,kCAC9BC,iCAAkC,uCAClCC,4BAA6B,qCAC7BC,gBAAiB,qBAGnBC,8BAA+B,6BAC/BC,gCAAiC,CAC/BC,kBAAmB,uBAGrBC,wBAAyB,oBACzBC,0BAA2B,CACzBC,mCAAoC,mDACpCC,iCAAkC,iDAClCC,yCAA0C,wDAC1CC,2BAA4B,sDAG9BC,gBAAiB,WAEjBC,mBAAoB,mBACpBC,oBAAqB,CACnBC,mBAAoB,yBACpBC,mBAAoB,uBACpBC,mCAAoC,0CACpCC,yBAA0B,8BAC1BC,oBAAqB,yBACrBC,8BAA+B,mCAC/BC,uBAAwB,4BACxBC,yBAA0B,8BAC1BC,sBAAuB,2BACvBC,aAAc,iBACdC,iBAAkB,wBAClBC,gCAAiC,oCACjCC,eAAgB,iBAChBC,aAAc,eACdC,iBAAkB,oBAClBC,8BAA+B,yCAC/BC,8BAA+B,yCAC/BC,kCAAmC,0DACnCC,6BAA8B,oDAC9BC,2BAA4B,wDAC5BC,8BAA+B,oEAC/BC,wBAAyB,+BAG3BC,wBAAyB,oBACzBC,4BAA6B,wBAC7BC,4BAA6B,CAC3BC,cAAe,iBACfC,mBAAoB,uBACpBC,aAAc,iBACdC,uBAAwB,6BACxBC,SAAU,WACVC,QAAS,WACTC,WAAY,cACZC,WAAY,cACZC,QAAS,WACTC,eAAgB,mBAChBC,WAAY,cACZC,YAAa,eACbC,eAAgB,mBAChBC,YAAa,eACbC,mBAAoB,wBAEtBC,2BAA4B,uBAC5BC,2BAA4B,CAC1BC,WAAY,cACZC,mBAAoB,yBACpBC,kBAAmB,sBACnBC,kBAAmB,qBACnBC,eAAgB,uBAChBC,MAAO,SAETC,yBAA0B,qBAC1BC,wBAAyB,CACvBC,iCAAkC,mCAClCC,+BAAgC,+BAElCC,qBAAsB,iBACtBC,sBAAuB,CACrBC,SAAU,WAEZC,sBAAuB,kBACvBC,sBAAuB,CACrBC,WAAY,aACZC,SAAU,qBACVC,gBAAiB,mBACjBC,WAAY,cACZC,iBAAkB,oBAClBC,aAAc,gBACdC,SAAU,cACVC,eAAgB,mBAGlBC,8BAA+B,0BAC/BC,+BAAgC,CAC9BC,sCAAuC,iDACvCC,6CAA8C,0DAC9CC,0BAA2B,+BAC3BC,mCAAoC,0DACpCC,mCAAoC,0CAGtCC,gBAAiB,SACjBC,cAAe,SACfC,cAAe,iBACfC,UAAW,aACXC,QAAS,kBAGXC,WAAY,CACVC,gBAAiB,+BACjBC,sBAAuB,oCACvBC,iBACE,8QACFC,OAAQ,oBACRC,QAAS,cACTC,iBAAkB,yBAGpBC,QAAS,CACPC,KAAM,OACNC,MAAO,OACPC,aAAc,cACdC,YAAa,WACbC,UAAW,OACXC,YAAa,SACbC,eAAgB,QAChBC,UAAW,OACXC,UAAW,OACXC,cAAe,WACfC,WAAY,QACZC,oCAAqC,0CACrCC,2BAA4B,gCAC5BC,gCAAiC,qCACjCC,sBAAuB,4BACvBC,iBAAkB,qBAClBC,mBAAoB,uBACpBC,gBAAiB,oBACjBC,4BAA6B,kCAC7BC,6BAA8B,oCAGhCC,WAAY,CACVC,sBAAuB,0BACvBC,WAAY,aACZC,WAAY,eACZC,WAAY,eACZC,OAAQ,SACRC,cAAe,qBACfC,aAAc,gBACdC,uBAAwB,gCACxBC,yBAA0B,8BAC1BC,6BAA8B,mCAC9BC,wBAAyB,yBACzBC,6BAA8B,2BAC9BC,yBAA0B,8BAC1BC,iCAAkC,0EAClCC,gCAAiC,gFACjCC,kCAAmC,mEACnCC,sCAAuC,wEACvCC,sCAAuC,2EACvCC,kCAAmC,8EACnCC,gBAAiB,oBACjBC,kBAAmB,uBAGrBC,aAAc,CACZvb,MAAO,WACPwb,UAAW,aACXC,YAAa,eACbC,UAAW,aACXC,cAAe,YACfC,WAAY,cACZC,iBAAkB,6BAGpBC,eAAgB,CACdnB,6BAA8B,qCAC9BoB,kCAAmC,wCACnCC,iCAAkC,uCAClCC,mCAAoC,yCACpCC,4BAA6B,iCAC7BC,yBAA0B,8BAC1BC,wBAAyB,6BACzBC,uBAAwB,6BACxBC,yBAA0B,8BAC1BC,uBAAwB,4BACxBC,0BAA2B,kCAC3BC,wBAAyB,oBACzBhC,uBAAwB,mBACxBC,yBAA0B,8BAC1BgC,MAAO,WACPC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACXC,YAAa,kBACbC,gBAAiB,oBACjBC,kDACE,kGACFC,iBAAkB,oBAClBC,uDACE,gGACFC,gBAAiB,mBACjBC,sDACE,+FACFC,kBAAmB,qBACnBC,wDACE,iGACFC,WAAY,aACZC,iDACE,yFACFC,QAAS,WACTC,8CACE,uEACFC,OAAQ,SACRC,6CACE,qFACFC,MAAO,UACPC,4CACE,0FACFC,QAAS,UACTC,8CACE,sFACFC,MAAO,QACPC,4CACE,oFACFC,SAAU,eACVC,+CACE,+FACFC,OAAQ,SACRC,6CACE,oFACFC,MAAO,QACPC,4CACE,oFACFC,QAAS,UACTC,8CACE,sFACFC,mBAAoB,sBACpBC,wBAAyB,6BACzBC,uBAAwB,2BACxBC,eAAgB,kBAChBC,WAAY,wBACZC,eAAgB,kBAChBC,YAAa,eACbC,gCAAiC,uCACjCC,kCAAmC,yCACnCC,kBAAmB,uBACnBC,oBAAqB,yBACrBC,gBAAiB,qBAGnBC,oBAAqB,CACnBC,2BAA4B,gCAC5BC,gCAAiC,wCACjCC,oBAAqB,2BACrBC,oBAAqB,2BACrBC,oBAAqB,0BACrBC,0BAA2B,iCAC3BC,0BAA2B,kCAG7BC,sBAAuB,CACrBC,iCAAkC,uCAClCC,+BAAgC,uCAChCC,eAAgB,0BAChBC,sBAAuB,kCACvBC,uBAAwB,gCACxBC,oBAAqB,0BACrBC,0BAA2B,iCAC3BC,0BAA2B,kCAG7BC,sBAAuB,CACrBjO,kBAAmB,sBACnBkO,oCAAqC,6CACrCC,+BAAgC,qCAChCC,+BAAgC,qCAChCC,iCAAkC,uCAClCC,iCAAkC,uCAClCC,yCAA0C,+CAC1CC,qCAAsC,2CACtCC,sCAAuC,4CACvCC,mCAAoC,0CAGtCC,WAAY,CACV9E,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACXzC,6BAA8B,qCAC9BwB,yBAA0B,8BAC1BK,0BAA2B,kCAC3BC,wBAAyB,oBACzBhC,uBAAwB,mBACxBC,yBAA0B,8BAC1BgC,MAAO,WACPW,YAAa,kBACbqE,8CACE,qGACF1D,QAAS,WACT2D,0CACE,8FACFjD,SAAU,eACVkD,2CACE,kGACFhD,OAAQ,SACRiD,yCACE,gFACF/C,MAAO,QACPgD,wCACE,gFACF9C,QAAS,UACT+C,0CACE,kFACFC,eAAgB,yBAChBC,wBAAyB,8BACzBC,wBAAyB,8BACzBC,mBAAoB,uBACpBC,WAAY,qBACZC,aAAc,sBACdC,qBAAsB,kCACtBC,0BAA2B,gCAC3BC,qBAAsB,wCACtBlD,WAAY,wBACZmD,UAAW,YACXjD,YAAa,gBAGfkD,YAAa,CACX/F,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACXuF,QAAS,WACTC,iBAAkB,qBAClBC,iBAAkB,qBAClBC,gBAAiB,oBACjBC,gBAAiB,oBACjBC,UAAW,aACXC,MAAO,QACPC,OAAQ,WACRC,YAAa,mBACbC,UAAW,iBACXC,QAAS,UACTC,UAAW,uBACXrX,UAAW,aACXsX,UAAW,aACXC,UAAW,aACXC,WAAY,cACZC,WAAY,cACZC,wBAAyB,2CACzBC,uBAAwB,gDACxBC,aAAc,sBACdC,gBAAiB,6BACjBC,qBAAsB,mCACtBC,2BAA4B,uCAC5BC,oBAAqB,wBACrBC,YAAa,yBACbC,OAAQ,SACRC,sBAAuB,2BACvBC,sCAAuC,8CACvCC,sCAAuC,8CACvCC,qBAAsB,oBACtBC,2BAA4B,cAC5BC,yBAA0B,aAC1BC,wBAAyB,YACzBC,+BAAgC,oBAChCC,0BAA2B,cAC3BC,uBAAwB,WACxBC,gCAAiC,wBACjCC,6BAA8B,qBAC9BC,+BAAgC,uBAChCC,iCAAkC,yBAClCC,sBAAuB,SACvBC,0BAA2B,cAC3BC,2BAA4B,eAC5BC,+BAAgC,aAChCC,kCAAmC,gBACnCC,gCAAiC,cACjCC,+BAAgC,aAChCC,4BAA6B,SAC7BC,qCAAsC,8DAGxCC,iBAAkB,CAChBC,aAAc,eACdC,WAAY,aACZC,UAAW,YACXC,UAAW,YACXC,iBAAkB,oBAClBC,yBAA0B,6BAC1BC,0BAA2B,8BAC3BC,kCAAmC,uCACnCC,gCAAiC,sCACjChC,sBAAuB,2BACvBiC,WAAY,aACZC,KAAM,OACNC,oBAAqB,uBACrBC,UAAW,YACXC,iCAAkC,oBAClCC,kCAAmC,qBACnCC,gCAAiC,mBACjCC,iCAAkC,oBAClCC,6BAA8B,eAC9BC,8BAA+B,gBAC/BC,gCAAiC,qCACjCC,cAAe,iBACfC,WAAY,aACZC,aAAc,gBACdC,6BAA8B,kCAC9BC,8BAA+B,mCAC/BC,eAAgB,kBAChBC,mBAAoB,sBACpBC,cAAe,iBACfC,cAAe,iBACfC,aAAc,gBACdC,KAAM,OACNC,UAAW,aACXC,aAAc,gBACdC,gBAAiB,mBACjBC,cAAe,iBACfC,qBAAsB,wBACtBC,kBAAmB,qBACnBC,qBAAsB,wCACtBC,kBAAmB,sBACnBC,iBAAkB,0BAClBC,eAAgB,uBAChBC,qBAAsB,8BACtBC,6BAA8B,mCAC9BC,gCAAiC,uCAGnCC,SAAU,CACRC,UAAW,iBACXC,KAAM,OACNvvB,KAAM,OACNwvB,OAAQ,YAGVC,WAAY,CACVF,KAAM,OACNvvB,KAAM,OACNwvB,OAAQ,UAGVE,WAAY,CACVC,aAAc,kBACdJ,KAAM,OACNK,SAAU,WACVC,mBAAoB,yBAGtBC,UAAW,CACTtsB,MAAO,QACPusB,UAAW,YACXC,MAAO,QACPC,gBAAiB,WACjBC,OAAQ,UAGVC,mBAAoB,CAClBC,gBAAiB,kBACjBC,KAAM,OACNC,WAAY,mBACZC,WAAY,cACZC,gBAAiB,oBACjBC,qCAAsC,8CACtCC,YAAa,wBAGfC,oCAAqC,CACnCC,qBAAsB,wBACtB5J,oBAAqB,uBACrB6J,2BAA4B,+BAC5B3J,0BAA2B,+BAG7B4J,eAAgB,CACdC,mBAAoB,sBACpBC,4BAA6B,iFAC7BC,gBAAiB,sBACjBC,yBAA0B,gFAC1BC,cAAe,oBACfC,YAAa,iBACbC,SAAU,WACVC,UAAW,aACXC,WAAY,cACZC,OAAQ,UACRC,WAAY,gBACZC,WAAY,mBACZC,UAAW,qBACXC,sBAAuB,+BACvBC,QAAS,WACTC,uBAAwB,+EACxBC,YAAa,yBACbC,UAAW,kBACXC,4BAA6B,sCAC7BC,0BAA2B,oCAC3BC,0BAA2B,oCAC3BC,mBAAoB,6BACpBC,wBAAyB,mDACzBC,8BAA+B,gDAC/BC,uBAAwB,4BACxBC,eAAgB,6BAGlBC,aAAc,CACZC,gBAAiB,mCACjBtyB,MAAO,SACPuyB,UAAW,sBACXC,MAAO,SACPC,SAAU,gBACVC,gBAAiB,iBACjBC,gBAAiB,iBACjBC,SAAU,sBACVC,SAAU,WACVC,kBAAmB,qBACnBC,MAAO,QACPC,KAAM,OACNC,eAAgB,yBAChBC,oBAAqB,mCACrBC,gCAAiC,oDACjCC,6BAA8B,sCAGhCC,oBAAqB,CACnBC,aAAc,gBACdC,QAAS,UACTC,YAAa,eACbC,YAAa,eACbC,wBAAyB,6BACzBC,mCAAoC,kDACpCC,4BAA6B,iCAC7BC,oBAAqB,yBAGvBC,qBAAsB,CACpBC,aAAc,gBACdC,kCAAmC,yCACnCV,aAAc,gBACdC,QAAS,UACTC,YAAa,eACbS,yBAA0B,8BAC1BC,oCAAqC,mDACrCC,6BAA8B,kCAC9BC,qBAAsB,0BAGxBC,cAAe,CACbC,MAAO,QACPC,+BAAgC,sCAChCC,kBAAmB,sBACnBC,6BAA8B,2CAC9BC,sBAAuB,0BACvBC,cAAe,kBAGjBC,kBAAmB,CACjBC,kBAAmB,qBACnBC,YAAa,eACbC,sBAAuB,2BACvBC,UAAW,YACXC,YAAa,eACbxB,YAAa,eACbyB,kCAAmC,0CACnCC,sBAAuB,2BACvBC,kCAAmC,iDACnCC,2BAA4B,gCAC5BC,mBAAoB,wBAGtBC,SAAU,CACRC,eAAgB,cAChBpS,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACX4R,WAAY,wBACZC,aAAc,uBACdC,kBAAmB,sBACnBC,wBAAyB,wCACzBC,iBAAkB,qBAClBC,SAAU,eACV/Q,QAAS,UACTgR,eAAgB,mBAChBC,iBAAkB,qBAClBjT,yBAA0B,8BAC1BkT,4CAA6C,4DAC7ChR,MAAO,QACPjC,uBAAwB,4BACxBkT,0CAA2C,0DAC3CpS,YAAa,eACbqS,mBAAoB,wBACpBC,qBAAsB,0BACtBhV,6BAA8B,mCAC9BiV,gDAAiD,iEACjD5R,QAAS,UACT6R,eAAgB,mBAChBC,iBAAkB,qBAClB3T,yBAA0B,8BAC1B4T,4CAA6C,4DAC7C7R,OAAQ,SACR9B,wBAAyB,6BACzB4T,2CAA4C,2DAC5CC,gBAAiB,oBACjBC,kBAAmB,sBACnB1T,0BAA2B,kCAC3B2T,cAAe,iBACfC,iBAAkB,UAClBC,cAAe,OACfC,gBAAiB,SACjBjN,QAAS,UACTkN,iBAAkB,oBAClBC,eAAgB,kBAChBC,mBAAoB,sBACpBC,eAAgB,kBAChB/zB,MAAO,aACPoB,OAAQ,SACRjB,UAAW,YACXF,QAAS,UACT+zB,sBAAuB,4BACvBC,uBAAwB,6BACxBC,KAAM,OACNC,KAAM,OACNj2B,QAAS,UACTk2B,MAAO,QACPC,cAAe,kBACfC,YAAa,wBACbC,QAAS,UACTC,aAAc,gBACdC,eAAgB,kBAChBC,cAAe,iBACfC,cAAe,iBACfC,aAAc,iBAGhBC,WAAY,CACVC,eAAgB,mBAChBC,oBAAqB,kCACrBC,0BAA2B,wCAC3BC,mBAAoB,uBACpBC,WAAY,cACZ/zB,MAAO,QACPC,OAAQ,SACR+zB,QAAS,gCACTC,wBAAyB,6BACzBC,QAAS,UACTC,kBAAmB,qBACnBC,gBAAiB,mBACjBC,aAAc,gBACdC,yBAA0B,6BAC1BC,uBAAwB,2BACxBC,aAAc,gBACdC,KAAM,OACNlP,QAAS,UACTmP,yBAA0B,mDAC1BC,QAAS,UACTC,YAAa,eACbC,aAAc,gBACdC,aAAc,gBACdC,aAAc,iBACdC,aAAc,gBACdC,MAAO,QACPC,WAAY,cACZC,UAAW,aACXt2B,MAAO,cACPu2B,WAAY,cACZC,QAAS,UACTC,OAAQ,SACRC,UAAW,YACXC,SAAU,WACVvC,MAAO,SAGTwC,SAAU,CACRxE,eAAgB,cAChBpS,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXuW,aAAc,iBACdC,wBAAyB,sCACzBC,iBAAkB,qBAClBC,SAAU,YACVC,gBAAiB,oBACjBC,2BAA4B,yCAC5BC,YAAa,eACbC,oBAAqB,wBACrBC,cAAe,iBACfC,YAAa,eACbC,gBAAiB,mBACjBC,YAAa,eACbC,UAAW,aACXC,cAAe,kBACfC,UAAW,aACXjR,QAAS,UACTkR,cAAe,iBACfnE,iBAAkB,UAClBoE,gBAAiB,SACjBC,eAAgB,QAChBpX,YAAa,eACbqS,mBAAoB,wBACpBC,qBAAsB,0BACtBhV,6BAA8B,mCAC9B+Z,gDAAiD,iEACjDpW,QAAS,UACTgR,eAAgB,mBAChBC,iBAAkB,qBAClBjT,yBAA0B,8BAC1BqY,4CAA6C,4DAC7C3W,QAAS,UACT6R,eAAgB,mBAChBC,iBAAkB,qBAClB3T,yBAA0B,8BAC1ByY,4CAA6C,4DAC7C1W,OAAQ,SACR9B,wBAAyB,6BACzByY,2CAA4C,2DAC5CC,sBAAuB,4BACvBC,uBAAwB,6BACxBC,KAAM,OACNC,QAAS,UACTC,WAAY,eACZC,cAAe,mBAGjBC,SAAU,CACRrG,eAAgB,cAChBpS,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,YACXC,UAAW,aACXiY,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,UAAW,aACXC,aAAc,iBACdC,eAAgB,6BAChBC,wBAAyB,sCACzBC,iBAAkB,qBAClBC,SAAU,YACVC,SAAU,YACV9C,QAAS,UACTC,OAAQ,SACRlQ,OAAQ,SACRwH,WAAY,cACZ4I,SAAU,YAGZ4C,cAAe,CACbt7B,KAAM,OACNu7B,IAAK,QAGPC,gBAAiB,CACfC,2BAA4B,gCAC5BC,4BAA6B,kCAC7BC,uCAAwC,oDACxCC,cAAe,iBACfC,aAAc,iBAGhBC,0BAA2B,CACzBC,cAAe,iBACfC,UAAW,aACXC,kCAAmC,4CAGrCC,iBAAkB,CAChBC,OAAQ,QACRC,UAAW,wBACXC,KAAM,OACNC,iBAAkB,6CAClBC,oBAAqB,iDACrBC,IAAK,gBACLC,kBAAmB,oCACnBC,kBAAmB,6BACnBC,YAAa,gBACbC,WAAY,eACZC,eAAgB,kBAChBC,iBAAkB,oBAClBC,kBAAmB,qBACnBC,gBAAiB,oBACjBC,2BAA4B,YAC5BC,cAAe,kBACfC,yBAA0B,YAC1BC,WAAY,eACZC,sBAAuB,YACvBC,KAAM,OACNC,gBAAiB,mBACjB9tB,UAAW,QACXG,WAAY,aACZ4tB,YAAa,oCAGfC,SAAU,CACR9d,cAAe,qBACf+d,gBAAiB,mBACjBC,oBAAqB,4BACrBp6B,YAAa,cACb84B,KAAM,QAGRuB,gBAAiB,CACfC,qBAAsB,yBACtB1P,SAAU,WACV2P,aAAc,gBACdC,2BAA4B,qBAC5BC,gBAAiB,SAGnBC,YAAa,CACXC,YAAa,gBACbC,gBAAiB,8BAGnBC,oBAAqB,CACnBC,oBAAqB,wBACrBC,qBAAsB,yBACtBC,OAAQ,SACRC,GAAI,KACJC,WAAY,cACZC,IAAK,OAGPC,qBAAsB,CACpBC,qBAAsB,qCACtBC,sBAAuB,oCACvBC,MAAO,cACPC,aAAc,uBACdC,WAAY,eACZC,YAAa,cACbC,mCAAoC,kDACpCC,OAAQ,SACRC,UAAW,aACXC,aAAc,gBACdC,WAAY,cACZC,UAAW,aACXC,YAAa,gBAGfC,0BAA2B,CACzBC,0BAA2B,+BAC3BC,2BAA4B,gCAC5Bb,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbW,wCAAyC,gDAG3CC,wBAAyB,CACvBC,wBAAyB,6BACzBC,yBAA0B,8BAC1BjB,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbe,uCAAwC,+CAG1CC,2BAA4B,CAC1BC,2BAA4B,gCAC5BC,4BAA6B,iCAC7BrB,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbmB,yCAA0C,iDAG5CC,oBAAqB,CACnBC,oBAAqB,wBACrBC,qBAAsB,yBACtBzB,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACbuB,kCAAmC,yCAGrCC,uBAAwB,CACtBC,uBAAwB,kCACxBC,wBAAyB,mCACzBC,sBAAuB,0BACvBC,iBAAkB,qBAClB/B,MAAO,QACPC,aAAc,iBACdC,WAAY,cACZC,YAAa,eACb6B,qCAAsC,6CAGxCC,cAAe,CACbC,mBAAoB,sBACpBxsB,UAAW,aACXysB,gBAAiB,YAGnBC,eAAgB,CACdC,UAAW,aACXC,uBAAwB,yCACxBC,cAAe,kBACfC,QAAS,WACTC,aAAc,0BACdC,aAAc,iBACdC,yBAA0B,8CAC1BC,wBAAyB,uCACzBC,mDACE,gFAGJC,iBAAkB,CAChBT,UAAW,aACXC,uBAAwB,yCACxBC,cAAe,kBACfQ,WAAY,cACZC,oBAAqB,wBACrBC,gCAAiC,wDACjCC,+BAAgC,uCAChCC,sDACE,mFAGJC,aAAc,CACZC,gBAAiB,mBACjBC,mBAAoB,uBACpBC,qBAAsB,0BACtBC,QAAS,UACTC,YAAa,OACbC,mBAAoB,cACpBC,wBAAyB,iCACzBC,2BAA4B,qCAC5BC,qCAAsC,iDACtCjgB,gBAAiB,oBACjBkgB,oBAAqB,wBACrBC,qBAAsB,yBACtBC,qBAAsB,yBACtBC,wBAAyB,kCACzBC,yCAA0C,4DAC1CC,sCAAuC,wDACvCC,4BAA6B,qCAC7BC,oBAAqB,wBACrBC,mBAAoB,uBACpBC,uBAAwB,6BACxBC,sBAAuB,4BACvBC,wBAAyB,0CACzBC,wBAAyB,0CACzBC,qCAAsC,gDACtCC,uCAAwC,kDACxCC,sBAAuB,0BACvBC,YAAa,gBACbC,YAAa,iBAGfC,qBAAsB,CACpBC,kBAAmB,gCACnBC,KAAM,kBACNC,gBAAiB,sBACjBC,cAAe,4CACfC,+BAAgC,wCAChCC,yCAA0C,8DAC1CC,mBAAoB,6EACpBC,MAAO,QACPC,aAAc,gBACdC,sBAAuB,UACvBC,UAAW,aACXC,SAAU,YACVC,QAAS,YAGXC,aAAc,CACZC,cAAe,aAGjBC,wBAAyB,CACvBC,0BAA2B,+BAC3BC,WAAY,cAGdC,eAAgB,CACdC,oBAAqB,uBACrBC,wBAAyB,4BACzBC,uBAAwB,4BACxBC,aAAc,gBACdC,SAAU,aAGZC,gBAAiB,CACfC,qBAAsB,wBACtBC,iBAAkB,qBAClBC,iBAAkB,sBAGpBC,uBAAwB,CACtBC,aAAc,WACdC,oBAAqB,qCACrBC,wBAAyB,2CACzBC,+BAAgC,iDAGlCC,gBAAiB,CACfC,0BAA2B,kCAC3BC,wBAAyB,sCACzBC,gCAAiC,gDACjCC,yBAA0B,yCAC1BC,2BAA4B,2CAC5BC,6BAA8B,6CAC9BC,8BAA+B,8CAC/BC,uBAAwB,sCACxBC,+BAAgC,gDAChCC,sBAAuB,sCAGzBC,QAAS,CACPC,UAAW,qBACXC,OAAQ,cACRC,cAAe,iBACfC,QAAS,kBACTC,UAAW,oBACXC,QAAS,iBACTC,eAAgB,mBAChBC,aAAc,iBACdC,WAAY,eACZC,eAAgB,mBAChBC,eAAgB,mBAChBC,UAAW,mBACXC,UAAW,mBACXC,cAAe,wBACfC,eAAgB,mBAChBC,iBAAkB,qBAClBC,mBAAoB,uBACpBC,oBAAqB,wBACrBC,aAAc,gBACdC,eAAgB,mBAChBC,SAAU,YACVC,QAAS,qBACTC,UAAW,aACXC,UAAW,kBACXC,uCAAwC,iDACxCC,mCAAoC,4CACpCC,gBAAiB,qBACjBC,WAAY,eACZC,uBAAwB,6BACxBC,wBAAyB,6BACzBC,8BAA+B,kDAC/BC,oBAAqB,yBACrBC,yBAA0B,8BAC1BC,qBAAsB,0BACtBC,mBAAoB,wBACpBC,qBAAsB,0BACtBC,mBAAoB,wBACpBC,0BAA2B,gCAC3BC,wBAAyB,8BACzBC,sBAAuB,4BACvBC,0BAA2B,gCAC3BC,0BAA2B,gCAC3BC,yBAA0B,+BAC1BC,qBAAsB,0BACtBC,0BAA2B,gCAC3BC,4BAA6B,kCAC7BC,8BAA+B,oCAC/BC,+BAAgC,qCAChCC,wBAAyB,6BACzBC,0BAA2B,gCAC3BC,oBAAqB,yBACrBC,mBAAoB,wBACpBC,qBAAsB,0BACtBC,qBAAsB,2BAGxBC,QAAS,CACPC,QAAS,wCACTC,qBAAsB,iCACtBC,gBAAiB,2CACjBC,6BAA8B,oCAGhCC,KAAM,CACJC,MAAO,QACPC,MAAO,QACPC,QAAS,UACTC,QAAS,mBACTC,IAAK,OACLC,QAAS,WACTC,OAAQ,OACRC,SAAU,WACVC,MAAO,OACPC,IAAK,QACLC,KAAM,OACNC,OAAQ,UAGVC,OAAQ,CACNC,WAAY,aACZC,QAAS,UACTC,aAAc,iBACdC,aAAc,iBACdC,aAAc,iBACdC,aAAc,iBACdC,SAAU,WACVC,MAAO,QACPC,UAAW,YACXC,MAAO,QACPC,QAAS,WACTC,OAAQ,SACRC,UAAW,YACXC,SAAU,YACVC,MAAO,QACPC,YAAa,eACbC,aAAc,iBAGhBC,OAAQ,CACNC,KAAM,OACNC,KAAM,OACNC,MAAO,QACPC,WAAY,aACZC,KAAM,OACNC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,SAAU,WACVC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,SAAU,WACVC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,QAAS,UACTC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,SAAU,WACVC,KAAM,OACNC,OAAQ,SACRC,OAAQ,SACRC,KAAM,OACNC,KAAM,OACNC,MAAO,QACPC,MAAO,QACPC,SAAU,WACVC,KAAM,OACNC,KAAM,OACNC,OAAQ,UAGVC,QAAS,CACPC,EAAG,IACHC,EAAG,IACHC,EAAG,IACHC,EAAG,KAGLC,MAAO,CACLC,QAAS,MACTC,SAAU,MACVC,MAAO,MACPC,MAAO,MACPC,IAAK,MACLb,KAAM,MACNc,KAAM,MACNC,OAAQ,MACRC,UAAW,MACXC,QAAS,MACTC,SAAU,MACVC,SAAU,OAGZC,UAAW,CACTC,kBAAmB,sBACnBC,cAAe,kBACfC,kBAAmB,sBACnBC,iCAAkC,wCAClCC,uBAAwB,6BACxBC,uBAAwB,6BACxBC,sBAAuB,4BACvBC,gCAAiC,8CJrpDjCK,GK7BiB,CACrB7zC,YAAa,CACXC,KAAM,CACJC,IAAK,gDACLC,QAAS,UACTC,QAAS,0IAGXC,OAAQ,CACNC,UAAW,8HACXC,OAAQ,YAGVC,QAAS,CACPC,sBAAuB,sBACvBC,eAAgB,4BAChBC,cAAe,2BACfC,SAAU,oBACVC,QAAS,iBACTC,SAAU,sBACVC,QAAS,SACTC,eAAgB,OAChBC,mBACE,idACFC,QAAS,yGACTC,YAAa,kBAGfC,KAAM,CACJC,WAAY,cACZC,MAAO,QACPC,OAAQ,SACRC,MAAO,QACPC,OAAQ,SACRC,YAAa,cACbC,KAAM,OACNC,KAAM,OACNC,SAAU,YACVC,UAAW,aACXC,MAAO,QACPC,OAAQ,SACRC,OAAQ,SACRC,WAAY,cACZC,MAAO,QACPC,YAAa,eACbC,KAAM,OACNC,gBAAiB,sBACjBC,kBAAmB,0CACnBC,kBAAmB,IACnBC,QAAS,cACTC,eAAgB,IAChBC,QAAS,gBACTC,QAAS,UACTC,QAAS,UACTC,cAAe,qBACfC,cAAe,oBACfC,aAAc,sBACdC,aAAc,qBACdC,GAAI,OACJC,KAAM,aACNC,KAAM,YACNC,QAAS,aACTC,QAAS,mBACTC,MAAO,kBACPC,MAAO,SACPC,YAAa,cACbC,OAAQ,SACRC,MAAO,cACPC,OAAQ,UACRC,OAAQ,UACRC,qBAAsB,wBACtBC,kBAAmB,qBACnBC,OAAQ,UACRC,OAAQ,UACRC,uBAAwB,2BACxBC,mBAAoB,uBACpBC,mBAAoB,sBACpBC,8BAA+B,sBAC/BC,yCACE,oOACFC,MAAO,aACPC,KAAM,QACNC,KAAM,SACNC,YAAa,sBACbC,UAAW,cACXC,OAAQ,cACRC,MAAO,0BACPC,KAAM,UACNC,IAAK,MACLC,OAAQ,MACRC,KAAM,UACNC,YAAa,mBACbC,MAAO,OACPC,QAAS,OACTC,KAAM,QACNC,UAAW,qBACXC,IAAK,OACLC,GAAI,aACJC,GAAI,QACJC,OAAQ,aACRC,MAAO,SACPC,MAAO,QACPC,QAAS,SACTC,IAAK,6BACLC,MAAO,WACPC,OAAQ,eACRC,MAAO,UACPC,QAAS,aACTC,QAAS,UACTC,SAAU,6BACVC,OAAQ,UACRC,MAAO,gBACPC,OAAQ,eACRC,OAAQ,kBACRC,MAAO,cACPC,QAAS,SACTC,YAAa,eACbC,QAAS,cACTC,KAAM,YACNC,QAAS,QACTC,KAAM,QACNC,KAAM,OACNC,MAAO,mBACPC,MAAO,SACPC,OAAQ,QACRC,OAAQ,wBACRC,SAAU,QACVC,SAAU,QACVC,MAAO,KACPC,IAAK,SACLC,KAAM,OACNC,SAAU,mCACVC,UAAW,wBACXC,YAAa,qBACbC,IAAK,MACLC,OAAQ,SACRC,eAAgB,MAChBC,aAAc,IACdC,aAAc,IACdC,YAAa,IACbC,YAAa,IACbC,MAAO,QACPC,SAAU,iBACVC,OAAQ,SACRC,QAAS,UACTC,MAAO,QACPC,YAAa,cACbC,cAAe,iBACfC,kBAAmB,qBACnBC,OAAQ,SACRC,UAAW,YACXC,SAAU,WACVC,oBAAqB,uBACrBC,mBAAoB,sBACpBC,eAAgB,kBAChBC,kBAAmB,qBACnBC,kBAAmB,qBACnBC,aAAc,eACdC,UAAW,YACXC,SAAU,WACVC,IAAK,MACLC,MAAO,SAGTC,OAAQ,CACNC,UAAW,WACXC,kBAAmB,QACnBC,cAAe,WACfC,eAAgB,UAChBC,cAAe,YACfC,kBAAmB,uBACnBC,mBAAoB,4BACpBC,qBAAsB,qBACtBC,uBAAwB,iBACxBC,wBAAyB,uBACzBC,iBAAkB,YAClBC,mBAAoB,eACpBC,aAAc,QACdC,cAAe,UACfC,UAAW,aACXC,gBAAiB,YACjBC,YAAa,gBAGfC,QAAS,CACPC,cAAe,kBACfC,aAAc,iCACdC,cAAe,gDACfC,sBAAuB,uCACvBC,oBAAqB,kCACrBC,6BAA8B,0CAC9BC,8BAA+B,6CAC/BC,0BAA2B,sCAC3BC,uBAAwB,8BACxBC,mCAAoC,8CACpCC,uBAAwB,4BACxBC,kBAAmB,0BACnBC,oBAAqB,4BACrBC,oBAAqB,4BACrBC,yBAA0B,wCAC1BC,sCAAuC,sDACvCC,yBAA0B,uDAC1BC,8BAA+B,6CAC/BC,oBAAqB,4BACrBC,uBAAwB,4BACxBC,4BAA6B,mDAC7BC,6CAA8C,mEAC9CC,kBAAmB,qCACnBC,sBAAuB,4BACvBC,sBAAuB,0BACvBC,wBAAyB,8BACzBC,uBAAwB,6BACxBC,yBAA0B,+BAC1BC,oBAAqB,4BACrBC,8BAA+B,4CAC/BC,oBAAqB,6CACrBC,oBAAqB,6BACrBC,qBAAsB,8BACtBC,gBAAiB,oBACjBC,sBAAuB,oDACvBC,sBAAuB,iCACvBC,sBAAuB,6DACvBC,uBAAwB,sDACxBC,8BAA+B,+BAC/BC,oBAAqB,0BACrBC,mBAAoB,sBACpBC,qBAAsB,yEACtBC,kCAAmC,6EACnCC,8BAA+B,gEAC/BC,6BAA8B,0EAC9BC,kCAAmC,8DACnCC,iCAAkC,wDAClCC,kCAAmC,0EACnCC,iCAAkC,uEAClCC,2BAA4B,wEAC5BC,4BAA6B,4EAC7BC,uBAAwB,oCACxBC,wDACE,mHACFC,oBAAqB,+BACrBC,qCAAsC,kDACtCC,uCAAwC,2DACxCC,gBAAiB,0CACjBC,aAAc,wBACdC,kBAAmB,mCACnBC,oBAAqB,iCACrBC,kBAAmB,8BACnBC,iBAAkB,wCAClBC,iBAAkB,0BAClBC,gBAAiB,0BACjBC,iBAAkB,6BAClBC,kCAAmC,0CACnCC,mCAAoC,0CACpCC,iBAAkB,2BAClBC,mBAAoB,yBACpBC,iBAAkB,sBAClBC,gBAAiB,gCACjBC,wBAAyB,8DACzBC,gBAAiB,kBACjBC,eAAgB,kBAChBC,gBAAiB,kBACjBC,mCAAoC,4DACpCC,yCAA0C,6DAC1CC,mCAAoC,iEACpCC,2BAA4B,wFAC5BC,wBAAyB,gCACzBC,yBAA0B,+BAC1BC,qBAAsB,2BACtBC,wBAAyB,wCACzBC,0BAA2B,4CAC3BC,oBAAqB,+BACrBC,cAAe,mBAGjBC,KAAM,CACJC,gBAAiB,wBACjBC,OAAQ,CACNC,aAAc,kBACdC,kBAAmB,4BACnBC,aAAc,WACdC,YAAa,sCAEfC,SAAU,cACVC,UAAW,qBACXC,eAAgB,UAChBC,QAAS,CACPC,iBAAkB,qBAClBC,YAAa,eACbC,cAAe,kBACfC,4BAA6B,0CAC7BC,0BAA2B,qCAE7BC,YAAa,QACbC,KAAM,CACJC,cAAe,0BACfC,cAAe,oBACfC,gBAAiB,4BACjBC,mCAAoC,6EACpCC,cAAe,2BACfC,cAAe,mCACfC,gBAAiB,mCACjBC,gCAAiC,qDACjCC,2BAA4B,6FAC5BC,eAAgB,iCAChBC,iBAAkB,qCAClBC,mBAAoB,wBACpBC,qBAAsB,kDACtBC,mBAAoB,gDACpBC,+BAAgC,wCAChCC,sCAAuC,iDACvCC,0CAA2C,6DAE7CC,YAAa,WACbC,KAAM,CACJC,KAAM,UACNC,KAAM,UAERC,YAAa,mBACbC,KAAM,CACJC,eAAgB,kBAChBC,mBAAoB,KACpBC,UAAW,SACXC,OAAQ,cACRC,QAAS,eACTC,WAAY,wBACZC,WAAY,WACZC,qBAAsB,yBACtBC,2BAA4B,mBAC5BC,mBAAoB,cACpBC,YAAa,CACXC,gBAAiB,gBACjBC,kBAAmB,mCACnBC,YAAa,cACbC,WAAY,SACZC,KAAM,WAGVC,gBAAiB,WACjBC,SAAU,CACRC,YAAa,cACbC,mBAAoB,kCACpBC,SAAU,WACVC,WAAY,yBAEdC,kBAAmB,WACnBC,WAAY,CACVC,sCAAuC,sEACvCC,eAAgB,oDAChBC,eAAgB,oDAChBC,eAAgB,oDAChBC,eAAgB,qDAElBC,MAAO,CACLC,UAAW,yCACXC,WAAY,gBACZC,eAAgB,mBAChBC,wBAAyB,wCACzBC,sBAAuB,yCAEzBC,gBAAiB,SACjBC,eAAgB,QAChBC,QAAS,CACPC,2BAA4B,sCAC5BC,6BAA8B,wCAC9BC,kCAAmC,kBACnCC,8BAA+B,4CAC/BC,iCAAkC,gBAClCC,kBAAmB,uCAErBC,cAAe,eACfC,OAAQ,CACNC,iBAAkB,0BAClBC,kBAAmB,8BACnBC,4BAA6B,iBAE/BC,gBAAiB,WACjBC,SAAU,CACRC,2BAA4B,gCAC5BC,4BAA6B,iCAC7BC,sBAAuB,0BACvBC,mBAAoB,wBACpBC,oCAAqC,+CAEvCC,kBAAmB,0BACnBC,WAAY,CACVC,kBAAmB,iCACnBC,mBAAoB,qCACpBC,kBAAmB,2BACnBC,oBAAqB,qCACrBC,MAAO,QACPC,YAAa,uBACbT,mBAAoB,kBACpBU,uBAAwB,kBACxBX,sBAAuB,+BACvBY,0BAA2B,yCAC3BC,gCAAiC,iBAEnCC,uBAAwB,iBACxBC,gBAAiB,CACfV,kBAAmB,iCACnBC,mBAAoB,sCAEtBU,qBAAsB,qBACtBC,cAAe,CACbZ,kBAAmB,iCACnBC,mBAAoB,sCAEtBY,wBAAyB,mCACzBC,iBAAkB,CAChBd,kBAAmB,iCACnBC,mBAAoB,sCAEtBc,iBAAkB,YAClBC,UAAW,CACThB,kBAAmB,iCACnBC,mBAAoB,sCAEtBgB,yBAA0B,uBAC1BC,kBAAmB,CACjBlB,kBAAmB,iCACnBC,mBAAoB,qCACpBkB,uCAAwC,iBAG1CC,iBAAkB,0BAElBC,0BAA2B,uBAC3BC,4BAA6B,CAC3BC,UAAW,2DACXC,qBAAsB,mCACtBC,oBAAqB,kDAGvBC,uBAAwB,mBACxBC,yBAA0B,CACxBC,kCAAmC,yCACnCC,6BAA8B,oCAC9BC,oCAAqC,2CACrCC,mCAAoC,0CACpCC,kCAAmC,0CACnCC,4CAA6C,qDAC7CC,mCAAoC,sDACpCC,2CAA4C,mDAC5CC,oCAAqC,4CACrCC,0CAA2C,kDAC3CC,8BAA+B,sCAGjCC,sBAAuB,0BACvBC,wBAAyB,CACvBC,gCAAiC,sCACjCC,uBAAwB,4BACxBC,mBAAoB,sDACpBC,kBAAmB,wBACnBC,yBAA0B,gDAC1BC,4BAA6B,mCAC7BC,eAAgB,mBAChBC,mBAAoB,wBACpBC,eAAgB,kBAChBC,YAAa,eACbC,YAAa,gBACbC,kBAAmB,sBACnBC,kBAAmB,+BAGrBC,8BAA+B,qCAC/BC,gCAAiC,CAC/BC,8BAA+B,2DAC/BC,4BAA6B,wDAC7BC,gBAAiB,oBACjBC,4BAA6B,iCAC7BC,wCAAyC,uCACzCC,cAAe,iCACfC,8BACE,oGACFC,iCAAkC,0DAClCC,iCAAkC,wCAClCC,+BAAgC,sCAGlCC,8BAA+B,wEAC/BC,gCAAiC,CAC/BC,iCAAkC,kDAClCC,qCAAsC,wCACtCC,+BAAgC,+EAChCC,wBAAyB,wCACzBC,qDACE,iFACFC,yCAA0C,2EAC1CC,wCAAyC,iEACzCC,6BAA8B,kDAC9BC,iCAAkC,4CAClCC,4BAA6B,qDAC7BC,gBAAiB,kCAGnBC,8BAA+B,iDAC/BC,gCAAiC,CAC/BC,kBAAmB,wBAGrBC,wBAAyB,oBACzBC,0BAA2B,CACzBC,mCAAoC,mDACpCC,iCAAkC,iDAClCC,yCAA0C,wDAC1CC,2BAA4B,sDAG9BC,gBAAiB,cAEjBC,mBAAoB,yBACpBC,oBAAqB,CACnBC,mBAAoB,iDACpBC,mBAAoB,kDACpBC,mCAAoC,0CACpCC,yBAA0B,iDAC1BC,oBAAqB,sCACrBC,8BAA+B,8DAC/BC,uBAAwB,sCACxBC,yBAA0B,2CAC1BC,sBAAuB,2BACvBC,aAAc,mCACdC,iBAAkB,wBAClBC,gCAAiC,oCACjCC,eAAgB,iBAChBC,aAAc,eACdC,iBAAkB,kBAClBC,8BAA+B,yCAC/BC,8BAA+B,yCAC/BC,kCAAmC,yFACnCC,6BAA8B,sFAC9BC,2BAA4B,kEAC5BC,8BAA+B,2FAC/BC,wBAAyB,mCAG3BC,wBAAyB,4BACzBC,4BAA6B,6BAC7BC,4BAA6B,CAC3BC,cAAe,iBACfC,mBAAoB,qBACpBC,aAAc,iBACdC,uBAAwB,6BACxBC,SAAU,WACVC,QAAS,WACTC,WAAY,cACZC,WAAY,cACZC,QAAS,WACTC,eAAgB,mBAChBC,WAAY,cACZC,YAAa,eACbC,eAAgB,iBAChBC,YAAa,eACbC,mBAAoB,wBAEtBC,2BAA4B,iBAC5BC,2BAA4B,CAC1BC,WAAY,cACZC,mBAAoB,mDACpBC,kBAAmB,sBACnBC,kBAAmB,qBACnBC,eAAgB,mBAChBC,MAAO,SAETC,yBAA0B,qBAC1BC,wBAAyB,CACvBC,iCAAkC,6BAClCC,+BAAgC,+BAElCC,qBAAsB,6BACtBC,sBAAuB,CACrBC,SAAU,0BAEZC,sBAAuB,kBACvBC,sBAAuB,CACrBC,WAAY,OACZC,SAAU,sBACVC,gBAAiB,mBACjBC,WAAY,cACZC,iBAAkB,oBAClBC,aAAc,gBACdC,SAAU,cACVC,eAAgB,mBAGlBC,8BAA+B,aAC/BC,+BAAgC,CAC9BC,sCAAuC,4EACvCC,6CAA8C,qFAC9CC,0BAA2B,gDAC3BC,mCAAoC,+EACpCC,mCAAoC,2DAGtCC,gBAAiB,MACjBC,cAAe,SACfC,cAAe,iBACfC,UAAW,aACXC,QAAS,wBAGXC,WAAY,CACVC,gBAAiB,sBACjBC,sBAAuB,oCACvBC,iBACE,6aACFC,OAAQ,gBACRC,QAAS,eACTC,iBAAkB,mCAGpBC,QAAS,CACPC,KAAM,WACNC,MAAO,OACPC,aAAc,kBACdC,YAAa,YACbC,UAAW,OACXC,YAAa,QACbC,eAAgB,gBAChBC,UAAW,OACXC,UAAW,OACXC,cAAe,WACfC,WAAY,QACZC,oCAAqC,oFACrCC,2BAA4B,qDAC5BC,gCAAiC,qDACjCC,sBAAuB,qEACvBC,iBAAkB,6CAClBC,mBAAoB,kDACpBC,gBAAiB,4CACjBC,4BAA6B,kCAC7BC,6BAA8B,oCAGhCC,WAAY,CACVC,sBAAuB,0BACvBC,WAAY,aACZC,WAAY,eACZC,WAAY,eACZC,OAAQ,SACRC,cAAe,4BACfC,aAAc,gBACdC,uBAAwB,2CACxBC,yBAA0B,8BAC1BC,6BAA8B,mCAC9BC,wBAAyB,mCACzBC,6BAA8B,+BAC9BC,yBAA0B,kCAC1BC,iCAAkC,4DAClCC,gCAAiC,oEACjCC,kCAAmC,mEACnCC,sCAAuC,wEACvCC,sCAAuC,wDACvCC,kCAAmC,2DACnCC,gBAAiB,iCACjBC,kBAAmB,0CAGrBC,aAAc,CACZvb,MAAO,SACPwb,UAAW,aACXC,YAAa,eACbC,UAAW,aACXC,cAAe,YACfC,WAAY,cACZC,iBAAkB,kCAGpBC,eAAgB,CACdnB,6BAA8B,kEAC9BoB,kCAAmC,gEACnCC,iCAAkC,oEAClCC,mCAAoC,iEACpCC,4BAA6B,2DAC7BC,yBAA0B,sDAC1BC,wBAAyB,6BACzBC,uBAAwB,uDACxBC,yBAA0B,8BAC1BC,uBAAwB,4BACxBC,0BAA2B,sDAC3BC,wBAAyB,4DACzBhC,uBAAwB,8DACxBC,yBAA0B,8BAC1BgC,MAAO,mBACPC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,UACXC,YAAa,0BACbC,gBAAiB,oBACjBC,kDACE,kGACFC,iBAAkB,oBAClBC,uDACE,8GACFC,gBAAiB,wBACjBC,sDACE,kHACFC,kBAAmB,0BACnBC,wDACE,iHACFC,WAAY,eACZC,iDACE,yGACFC,QAAS,eACTC,8CACE,oGACFC,OAAQ,SACRC,6CACE,qFACFC,MAAO,WACPC,4CACE,sGACFC,QAAS,UACTC,8CACE,sFACFC,MAAO,QACPC,4CACE,oFACFC,SAAU,aACVC,+CACE,uGACFC,OAAQ,eACRC,6CACE,sGACFC,MAAO,kBACPC,4CACE,6GACFC,QAAS,UACTC,8CACE,sFACFC,mBAAoB,0BACpBC,wBAAyB,4CACzBC,uBAAwB,2BACxBC,eAAgB,kBAChBC,WAAY,eACZC,eAAgB,2BAChBC,YAAa,qBACbC,gCAAiC,gEACjCC,kCAAmC,wEACnCC,kBAAmB,uBACnBC,oBAAqB,yBACrBC,gBAAiB,qBAGnBC,oBAAqB,CACnBC,2BAA4B,mCAC5BC,gCAAiC,8CACjCC,oBAAqB,oCACrBC,oBAAqB,uCACrBC,oBAAqB,8BACrBC,0BAA2B,8BAC3BC,0BAA2B,gCAG7BC,sBAAuB,CACrBC,iCAAkC,0CAClCC,+BAAgC,4CAChCC,eAAgB,kCAChBC,sBAAuB,kDACvBC,uBAAwB,sCACxBC,oBAAqB,6BACrBC,0BAA2B,iCAC3BC,0BAA2B,sCAG7BC,sBAAuB,CACrBjO,kBAAmB,uBACnBkO,oCAAqC,8CACrCC,+BAAgC,+CAChCC,+BAAgC,kDAChCC,iCAAkC,wCAClCC,iCAAkC,0DAClCC,yCAA0C,yDAC1CC,qCAAsC,8CACtCC,sCAAuC,uDACvCC,mCAAoC,mDAGtCC,WAAY,CACV9E,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,UACXzC,6BAA8B,kEAC9BwB,yBAA0B,sDAC1BK,0BAA2B,yDAC3BC,wBAAyB,sDACzBhC,uBAAwB,8DACxBC,yBAA0B,8BAC1BgC,MAAO,mBACPW,YAAa,0BACbqE,8CACE,sHACF1D,QAAS,eACT2D,0CACE,0GACFjD,SAAU,aACVkD,2CACE,6GACFhD,OAAQ,gBACRiD,yCACE,2GACF/C,MAAO,kBACPgD,wCACE,kHACF9C,QAAS,UACT+C,0CACE,kFACFC,eAAgB,4BAChBC,wBAAyB,8BACzBC,wBAAyB,8BACzBC,mBAAoB,uBACpBC,WAAY,qBACZC,aAAc,4BACdC,qBAAsB,wCACtBC,0BAA2B,gCAC3BC,qBAAsB,qCACtBlD,WAAY,eACZmD,UAAW,YACXjD,YAAa,gBAGfkD,YAAa,CACX/F,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,UACXuF,QAAS,WACTC,iBAAkB,qBAClBC,iBAAkB,qBAClBC,gBAAiB,oBACjBC,gBAAiB,oBACjBC,UAAW,aACXC,MAAO,QACPC,OAAQ,QACRC,YAAa,eACbC,UAAW,cACXC,QAAS,eACTC,UAAW,iBACXrX,UAAW,yCACXsX,UAAW,iBACXC,UAAW,kBACXC,WAAY,iBACZC,WAAY,wBACZC,wBAAyB,gDACzBC,uBAAwB,8CACxBC,aAAc,wBACdC,gBAAiB,4BACjBC,qBAAsB,yCACtBC,2BAA4B,wCAC5BC,oBAAqB,wBACrBC,YAAa,oBACbC,OAAQ,WACRC,sBAAuB,sCACvBC,sCAAuC,+DACvCC,sCAAuC,+DACvCC,qBAAsB,8BACtBC,2BAA4B,cAC5BC,yBAA0B,+BAC1BC,wBAAyB,qCACzBC,+BAAgC,wCAChCC,0BAA2B,cAC3BC,uBAAwB,wBACxBC,gCAAiC,wBACjCC,6BAA8B,qBAC9BC,+BAAgC,iCAChCC,iCAAkC,4BAClCC,sBAAuB,SACvBC,0BAA2B,qBAC3BC,2BAA4B,oBAC5BC,+BAAgC,aAChCC,kCAAmC,gBACnCC,gCAAiC,cACjCC,+BAAgC,aAChCC,4BAA6B,SAC7BC,qCAAsC,qFAGxCC,iBAAkB,CAChBC,aAAc,eACdC,WAAY,eACZC,UAAW,wBACXC,UAAW,WACXC,iBAAkB,oBAClBC,yBAA0B,+BAC1BC,0BAA2B,2CAC3BC,kCAAmC,sDACnCC,gCAAiC,kEACjChC,sBAAuB,sCACvBiC,WAAY,QACZC,KAAM,MACNC,oBAAqB,oDACrBC,UAAW,UACXC,iCAAkC,gCAClCC,kCAAmC,oCACnCC,gCAAiC,kCACjCC,iCAAkC,sCAClCC,6BAA8B,yBAC9BC,8BAA+B,6BAC/BC,gCAAiC,wCACjCC,cAAe,sBACfC,WAAY,UACZC,aAAc,mBACdC,6BAA8B,qCAC9BC,8BAA+B,oCAC/BC,eAAgB,uBAChBC,mBAAoB,iBACpBC,cAAe,sBACfC,cAAe,2BACfC,aAAc,sBACdC,KAAM,YACNC,UAAW,oBACXC,aAAc,qBACdC,gBAAiB,oBACjBC,cAAe,2CACfC,qBAAsB,6BACtBC,kBAAmB,sBACnBC,qBAAsB,0DACtBC,kBAAmB,oCACnBC,iBAAkB,wDAClBC,eAAgB,sDAChBC,qBAAsB,8CACtBC,6BAA8B,uEAC9BC,gCAAiC,sEAGnCC,SAAU,CACRC,UAAW,mBACXC,KAAM,OACNvvB,KAAM,SACNwvB,OAAQ,qBAGVC,WAAY,CACVF,KAAM,OACNvvB,KAAM,OACNwvB,OAAQ,UAGVE,WAAY,CACVC,aAAc,+BACdJ,KAAM,OACNK,SAAU,cACVC,mBAAoB,6CAGtBC,UAAW,CACTtsB,MAAO,QACPusB,UAAW,YACXC,MAAO,QACPC,gBAAiB,WACjBC,OAAQ,UAGVC,mBAAoB,CAClBC,gBAAiB,wCACjBC,KAAM,OACNC,WAAY,2BACZC,WAAY,cACZC,gBAAiB,kCACjBC,qCAAsC,oEACtCC,YAAa,6CAGfC,oCAAqC,CACnCC,qBAAsB,4BACtB5J,oBAAqB,+BACrB6J,2BAA4B,sCAC5B3J,0BAA2B,2CAG7B4J,eAAgB,CACdC,mBAAoB,sBACpBC,4BAA6B,iFAC7BC,gBAAiB,sBACjBC,yBAA0B,gFAC1BC,cAAe,iCACfC,YAAa,cACbC,SAAU,SACVC,UAAW,SACXC,WAAY,cACZC,OAAQ,WACRC,WAAY,4BACZC,WAAY,sBACZC,UAAW,+BACXC,sBAAuB,iDACvBC,QAAS,gBACTC,uBAAwB,6HACxBC,YAAa,+BACbC,UAAW,0BACXC,4BAA6B,wCAC7BC,0BAA2B,wCAC3BC,0BAA2B,gDAC3BC,mBAAoB,yCACpBC,wBAAyB,sDACzBC,8BAA+B,6DAC/BC,uBAAwB,4BACxBC,eAAgB,kCAGlBC,aAAc,CACZC,gBAAiB,sCACjBtyB,MAAO,QACPuyB,UAAW,eACXC,MAAO,cACPC,SAAU,gBACVC,gBAAiB,cACjBC,gBAAiB,cACjBC,SAAU,mBACVC,SAAU,WACVC,kBAAmB,qBACnBC,MAAO,QACPC,KAAM,OACNC,eAAgB,0BAChBC,oBAAqB,sCACrBC,gCAAiC,wEACjCC,6BAA8B,+CAGhCC,oBAAqB,CACnBC,aAAc,yBACdC,QAAS,cACTC,YAAa,8BACbC,YAAa,kBACbC,wBAAyB,mCACzBC,mCAAoC,2DACpCC,4BAA6B,iCAC7BC,oBAAqB,4BAGvBC,qBAAsB,CACpBC,aAAc,qBACdC,kCAAmC,0FACnCV,aAAc,yBACdC,QAAS,cACTC,YAAa,8BACbS,yBAA0B,yCAC1BC,oCAAqC,+DACrCC,6BAA8B,kCAC9BC,qBAAsB,kCAGxBC,cAAe,CACbC,MAAO,OACPC,+BAAgC,iFAChCC,kBAAmB,8BACnBC,6BAA8B,oDAC9BC,sBAAuB,0BACvBC,cAAe,uBAGjBC,kBAAmB,CACjBC,kBAAmB,mCACnBC,YAAa,eACbC,sBAAuB,wBACvBC,UAAW,sBACXC,YAAa,sBACbxB,YAAa,kBACbyB,kCAAmC,6DACnCC,sBAAuB,uCACvBC,kCAAmC,6DACnCC,2BAA4B,gCAC5BC,mBAAoB,gCAGtBC,SAAU,CACRC,eAAgB,kBAChBpS,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,UACX4R,WAAY,eACZC,aAAc,0BACdC,kBAAmB,sBACnBC,wBAAyB,iDACzBC,iBAAkB,qBAClBC,SAAU,kBACV/Q,QAAS,aACTgR,eAAgB,mBAChBC,iBAAkB,qBAClBjT,yBAA0B,oDAC1BkT,4CAA6C,0EAC7ChR,MAAO,eACPjC,uBAAwB,2DACxBkT,0CAA2C,+EAC3CpS,YAAa,0BACbqS,mBAAoB,wBACpBC,qBAAsB,0BACtBhV,6BAA8B,kEAC9BiV,gDACE,wFACF5R,QAAS,UACT6R,eAAgB,mBAChBC,iBAAkB,qBAClB3T,yBAA0B,8BAC1B4T,4CAA6C,4DAC7C7R,OAAQ,SACR9B,wBAAyB,6BACzB4T,2CAA4C,2DAC5CC,gBAAiB,oBACjBC,kBAAmB,sBACnB1T,0BAA2B,yDAC3B2T,cAAe,yBACfC,iBAAkB,kBAClBC,cAAe,mBACfC,gBAAiB,SACjBjN,QAAS,eACTkN,iBAAkB,oBAClBC,eAAgB,kBAChBC,mBAAoB,sBACpBC,eAAgB,kBAChB/zB,MAAO,aACPoB,OAAQ,SACRjB,UAAW,YACXF,QAAS,UACT+zB,sBAAuB,4BACvBC,uBAAwB,6BACxBC,KAAM,OACNC,KAAM,OACNj2B,QAAS,UACTk2B,MAAO,QACPC,cAAe,kBACfC,YAAa,wBACbC,QAAS,UACTC,aAAc,gBACdC,eAAgB,kBAChBC,cAAe,iBACfC,cAAe,iBACfC,aAAc,iBAGhBC,WAAY,CACVC,eAAgB,oBAChBC,oBAAqB,kCACrBC,0BAA2B,oDAC3BC,mBAAoB,uBACpBC,WAAY,oBACZ/zB,MAAO,gBACPC,OAAQ,eACR+zB,QAAS,gCACTC,wBAAyB,6BACzBC,QAAS,QACTC,kBAAmB,qBACnBC,gBAAiB,mBACjBC,aAAc,4BACdC,yBAA0B,6BAC1BC,uBAAwB,2BACxBC,aAAc,gBACdC,KAAM,MACNlP,QAAS,eACTmP,yBAA0B,mDAC1BC,QAAS,SACTC,YAAa,aACbC,aAAc,kBACdC,aAAc,YACdC,aAAc,gBACdC,aAAc,eACdC,MAAO,QACPC,WAAY,cACZC,UAAW,aACXt2B,MAAO,cACPu2B,WAAY,cACZC,QAAS,UACTC,OAAQ,SACRC,UAAW,YACXC,SAAU,WACVvC,MAAO,SAGTwC,SAAU,CACRxE,eAAgB,kBAChBpS,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXuW,aAAc,iCACdC,wBAAyB,uDACzBC,iBAAkB,qBAClBC,SAAU,yBACVC,gBAAiB,oBACjBC,2BAA4B,yCAC5BC,YAAa,eACbC,oBAAqB,wBACrBC,cAAe,gCACfC,YAAa,6BACbC,gBAAiB,uCACjBC,YAAa,eACbC,UAAW,qBACXC,cAAe,kBACfC,UAAW,WACXjR,QAAS,eACTkR,cAAe,gCACfnE,iBAAkB,kBAClBoE,gBAAiB,SACjBC,eAAgB,MAChBpX,YAAa,eACbqS,mBAAoB,wBACpBC,qBAAsB,0BACtBhV,6BAA8B,mCAC9B+Z,gDAAiD,iEACjDpW,QAAS,UACTgR,eAAgB,mBAChBC,iBAAkB,qBAClBjT,yBAA0B,8BAC1BqY,4CAA6C,4DAC7C3W,QAAS,UACT6R,eAAgB,mBAChBC,iBAAkB,qBAClB3T,yBAA0B,8BAC1ByY,4CAA6C,4DAC7C1W,OAAQ,SACR9B,wBAAyB,6BACzByY,2CAA4C,2DAC5CC,sBAAuB,4BACvBC,uBAAwB,6BACxBC,KAAM,OACNC,QAAS,UACTC,WAAY,eACZC,cAAe,mBAGjBC,SAAU,CACRrG,eAAgB,kBAChBpS,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,SACXC,UAAW,UACXiY,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,aAAc,8BACdC,eAAgB,0CAChBC,wBAAyB,wDACzBC,iBAAkB,qBAClBC,SAAU,sBACVC,SAAU,YACV9C,QAAS,UACTC,OAAQ,SACRlQ,OAAQ,SACRwH,WAAY,cACZ4I,SAAU,YAGZ4C,cAAe,CACbt7B,KAAM,YACNu7B,IAAK,oBAGPC,gBAAiB,CACfC,2BAA4B,wCAC5BC,4BAA6B,mDAC7BC,uCAAwC,8DACxCC,cAAe,iBACfC,aAAc,iBAGhBC,0BAA2B,CACzBC,cAAe,sBACfC,UAAW,aACXC,kCAAmC,qHAGrCC,iBAAkB,CAChBC,OAAQ,iBACRC,UAAW,+BACXC,KAAM,+BACNC,iBAAkB,mCAClBC,oBAAqB,uCACrBC,IAAK,sBACLC,kBAAmB,uBACnBC,kBAAmB,6BACnBC,YAAa,gBACbC,WAAY,eACZC,eAAgB,kBAChBC,iBAAkB,oBAClBC,kBAAmB,qBACnBC,gBAAiB,oBACjBC,2BAA4B,YAC5BC,cAAe,kBACfC,yBAA0B,YAC1BC,WAAY,eACZC,sBAAuB,YACvBC,KAAM,OACNC,gBAAiB,mBACjB9tB,UAAW,sBACXG,WAAY,0BACZ4tB,YAAa,gCAGfC,SAAU,CACR9d,cAAe,gCACf+d,gBAAiB,WACjBC,oBAAqB,4BACrBp6B,YAAa,eACb84B,KAAM,eAGRuB,gBAAiB,CACfC,qBAAsB,wCACtB1P,SAAU,cACV2P,aAAc,wBACdC,2BAA4B,2BAC5BC,gBAAiB,UAGnBC,YAAa,CACXC,YAAa,+BACbC,gBAAiB,eAGnBC,oBAAqB,CACnBC,oBAAqB,wBACrBC,qBAAsB,yBACtBC,OAAQ,SACRC,GAAI,KACJC,WAAY,cACZC,IAAK,OAGPC,qBAAsB,CACpBC,qBAAsB,8CACtBC,sBAAuB,kDACvBC,MAAO,YACPC,aAAc,oBACdC,WAAY,sBACZC,YAAa,0BACbC,mCAAoC,wDACpCC,OAAQ,YACRC,UAAW,aACXC,aAAc,gBACdC,WAAY,cACZC,UAAW,aACXC,YAAa,gBAGfC,0BAA2B,CACzBC,0BAA2B,wCAC3BC,2BAA4B,4CAC5Bb,MAAO,YACPC,aAAc,oBACdC,WAAY,sBACZC,YAAa,0BACbW,wCAAyC,uDAG3CC,wBAAyB,CACvBC,wBAAyB,4CACzBC,yBAA0B,gDAC1BjB,MAAO,YACPC,aAAc,oBACdC,WAAY,sBACZC,YAAa,0BACbe,uCAAwC,gEAG1CC,2BAA4B,CAC1BC,2BAA4B,8CAC5BC,4BAA6B,kDAC7BrB,MAAO,YACPC,aAAc,oBACdC,WAAY,sBACZC,YAAa,0BACbmB,yCAA0C,iFAG5CC,oBAAqB,CACnBC,oBAAqB,mCACrBC,qBAAsB,uCACtBzB,MAAO,YACPC,aAAc,oBACdC,WAAY,sBACZC,YAAa,0BACbuB,kCAAmC,kDAGrCC,uBAAwB,CACtBC,uBAAwB,+CACxBC,wBAAyB,mDACzBC,sBAAuB,0CACvBC,iBAAkB,gCAClB/B,MAAO,YACPC,aAAc,oBACdC,WAAY,sBACZC,YAAa,0BACb6B,qCAAsC,mDAGxCC,cAAe,CACbC,mBAAoB,qCACpBxsB,UAAW,iBACXysB,gBAAiB,YAGnBC,eAAgB,CACdC,UAAW,aACXC,uBAAwB,yCACxBC,cAAe,kBACfC,QAAS,WACTC,aAAc,wBACdC,aAAc,oBACdC,yBAA0B,uCAC1BC,wBAAyB,qCACzBC,mDACE,gFAGJC,iBAAkB,CAChBT,UAAW,aACXC,uBAAwB,yCACxBC,cAAe,kBACfQ,WAAY,cACZC,oBAAqB,wBACrBC,gCAAiC,wDACjCC,+BAAgC,uCAChCC,sDACE,mFAGJC,aAAc,CACZC,gBAAiB,mBACjBC,mBAAoB,uBACpBC,qBAAsB,0BACtBC,QAAS,UACTC,YAAa,OACbC,mBAAoB,cACpBC,wBAAyB,iCACzBC,2BAA4B,qCAC5BC,qCAAsC,iDACtCjgB,gBAAiB,oBACjBkgB,oBAAqB,wBACrBC,qBAAsB,yBACtBC,qBAAsB,yBACtBC,wBAAyB,kCACzBC,yCAA0C,4DAC1CC,sCAAuC,wDACvCC,4BAA6B,qCAC7BC,oBAAqB,wBACrBC,mBAAoB,uBACpBC,uBAAwB,6BACxBC,sBAAuB,4BACvBC,wBAAyB,0CACzBC,wBAAyB,0CACzBC,qCAAsC,gDACtCC,uCAAwC,kDACxCC,sBAAuB,0BACvBC,YAAa,gBACbC,YAAa,iBAGfC,qBAAsB,CACpBC,kBAAmB,uBACnBC,KAAM,aACNC,gBAAiB,sDACjBC,cAAe,uFACfC,+BAAgC,qDAChCC,yCAA0C,wEAC1CC,mBAAoB,2HACpBC,MAAO,QACPC,aAAc,gBACdC,sBAAuB,UACvBC,UAAW,uCACXC,SAAU,OACVC,QAAS,mBAGXC,aAAc,CACZC,cAAe,yBAGjBC,wBAAyB,CACvBC,0BAA2B,eAC3BC,WAAY,iBAGdC,eAAgB,CACdC,oBAAqB,wBACrBC,wBAAyB,uCACzBC,uBAAwB,oDACxBC,aAAc,gBACdC,SAAU,aAGZC,gBAAiB,CACfC,qBAAsB,wBACtBC,iBAAkB,qBAClBC,iBAAkB,sBAGpBC,uBAAwB,CACtBC,aAAc,mDACdC,oBAAqB,sEACrBC,wBAAyB,sFACzBC,+BAAgC,oFAGlCC,gBAAiB,CACfC,0BAA2B,uCAC3BC,wBAAyB,2CACzBC,gCAAiC,0DACjCC,yBAA0B,2DAC1BC,2BAA4B,wCAC5BC,6BAA8B,qCAC9BC,8BAA+B,+CAC/BC,uBAAwB,gCACxBC,+BAAgC,2CAChCC,sBAAuB,sCAGzBC,QAAS,CACPC,UAAW,qBACXC,OAAQ,SACRC,cAAe,aACfC,QAAS,aACTC,UAAW,eACXC,QAAS,iBACTC,eAAgB,4BAChBC,aAAc,+BACdC,WAAY,+BACZC,eAAgB,4BAChBC,eAAgB,4BAChBC,UAAW,gBACXC,UAAW,iBACXC,cAAe,4BACfC,eAAgB,iCAChBC,iBAAkB,0BAClBC,mBAAoB,sBACpBC,oBAAqB,gCACrBC,aAAc,iBACdC,eAAgB,mBAChBC,SAAU,YACVC,QAAS,oBACTC,UAAW,aACXC,UAAW,kBACXC,uCAAwC,iDACxCC,mCAAoC,4CACpCC,gBAAiB,sBACjBC,WAAY,mBACZC,uBAAwB,uDACxBC,wBAAyB,6BACzBC,8BAA+B,8CAC/BC,oBAAqB,8CACrBC,yBAA0B,cAC1BC,qBAAsB,iBACtBC,mBAAoB,aACpBC,qBAAsB,yBACtBC,mBAAoB,iBACpBC,0BAA2B,4BAC3BC,wBAAyB,+BACzBC,sBAAuB,+BACvBC,0BAA2B,4BAC3BC,0BAA2B,4BAC3BC,yBAA0B,4BAC1BC,qBAAsB,iBACtBC,0BAA2B,iCAC3BC,4BAA6B,0BAC7BC,8BAA+B,sBAC/BC,+BAAgC,4BAChCC,wBAAyB,iBACzBC,0BAA2B,gCAC3BC,oBAAqB,yBACrBC,mBAAoB,oBACpBC,qBAAsB,0BACtBC,qBAAsB,kBAGxBC,QAAS,CACPC,QAAS,sDACTC,qBAAsB,+CACtBC,gBAAiB,mEACjBC,6BAA8B,oCAGhCC,KAAM,CACJC,MAAO,QACPC,MAAO,QACPC,QAAS,UACTC,QAAS,0CACTC,IAAK,mBACLC,QAAS,WACTC,OAAQ,0BACRC,SAAU,WACVC,MAAO,sBACPC,IAAK,4BACLC,KAAM,SACNC,OAAQ,aAGVC,OAAQ,CACNC,WAAY,aACZC,QAAS,UACTC,aAAc,iBACdC,aAAc,iBACdC,aAAc,iBACdC,aAAc,iBACdC,SAAU,WACVC,MAAO,QACPC,UAAW,YACXC,MAAO,QACPC,QAAS,WACTC,OAAQ,SACRC,UAAW,YACXC,SAAU,YACVC,MAAO,QACPC,YAAa,eACbC,aAAc,iBAGhBC,OAAQ,CACNC,KAAM,MACNC,KAAM,OACNC,MAAO,QACPC,WAAY,QACZC,KAAM,MACNC,QAAS,QACTC,MAAO,QACPC,KAAM,OACNC,KAAM,OACNC,KAAM,QACNC,SAAU,WACVC,KAAM,MACNC,KAAM,OACNC,KAAM,QACNC,SAAU,QACVC,KAAM,SACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,QAAS,UACTC,KAAM,OACNC,KAAM,OACNC,KAAM,MACNC,SAAU,WACVC,KAAM,OACNC,OAAQ,SACRC,OAAQ,SACRC,KAAM,OACNC,KAAM,OACNC,MAAO,QACPC,MAAO,QACPC,SAAU,OACVC,KAAM,MACNC,KAAM,MACNC,OAAQ,UAGVC,QAAS,CACPC,EAAG,IACHC,EAAG,IACHC,EAAG,IACHC,EAAG,KAGLC,MAAO,CACLC,QAAS,MACTC,SAAU,MACVC,MAAO,MACPC,MAAO,MACPC,IAAK,MACLb,KAAM,MACNc,KAAM,MACNC,OAAQ,MACRC,UAAW,MACXC,QAAS,MACTC,SAAU,MACVC,SAAU,OAGZC,UAAW,CACTC,kBAAmB,sBACnBC,cAAe,kBACfC,kBAAmB,sBACnBC,iCAAkC,wCAClCC,uBAAwB,6BACxBC,uBAAwB,6BACxBC,sBAAuB,4BACvBC,gCAAiC,8CLrpDjCM,GM9BiB,CACrB9zC,YAAa,CACXC,KAAM,CACJC,IAAK,6KACLC,QAAS,UACTC,QAAS,ufAGXC,OAAQ,CACNC,UACE,igBACFC,OAAQ,oDAGVC,QAAS,CACPC,sBAAuB,2IACvBC,eAAgB,0GAChBC,cAAe,oJACfC,SAAU,kIACVC,QAAS,yDACTC,SAAU,qEACVC,QAAS,yDACTC,eAAgB,uCAChBC,mBACE,o/CACFC,QAAS,gXACTC,YAAa,oDAGfC,KAAM,CACJC,WAAY,cACZC,MAAO,QACPC,OAAQ,SACRC,MAAO,QACPC,OAAQ,SACRC,YAAa,cACbC,KAAM,OACNC,KAAM,iCACNC,SAAU,4EACVC,UAAW,sEACXC,MAAO,wCACPC,OAAQ,uCACRC,OAAQ,qEACRC,WAAY,4HACZC,MAAO,+DACPC,YAAa,yDACbC,KAAM,yDACNC,gBAAiB,mKACjBC,kBAAmB,qGACnBC,kBAAmB,SACnBC,QAAS,uCACTC,eAAgB,SAChBC,QAAS,iCACTC,QAAS,mDACTC,QAAS,6CACTC,cAAe,oGACfC,cAAe,8FACfC,aAAc,sHACdC,aAAc,gHACdC,GAAI,qBACJC,KAAM,iCACNC,KAAM,6CACNC,QAAS,yDACTC,QAAS,6CACTC,MAAO,2BACPC,MAAO,uCACPC,YAAa,wFACbC,OAAQ,6CACRC,MAAO,mDACPC,OAAQ,gDACRC,OAAQ,gDACRC,qBAAsB,iFACtBC,kBAAmB,kFACnBC,OAAQ,qDACRC,OAAQ,qDACRC,uBAAwB,iHACxBC,mBAAoB,yWACpBC,mBAAoB,uKACpBC,8BAA+B,uSAC/BC,yCACE,6hDACFC,MAAO,yDACPC,KAAM,mDACNC,KAAM,mDACNC,YAAa,6HACbC,UAAW,oEACXC,OAAQ,6CACRC,MAAO,mDACPC,KAAM,yDACNC,IAAK,mDACLC,OAAQ,mDACRC,KAAM,qEACNC,YAAa,qEACbC,MAAO,iCACPC,QAAS,mDACTC,KAAM,uCACNC,UAAW,6CACXC,IAAK,qBACLC,GAAI,eACJC,GAAI,eACJC,OAAQ,yDACRC,MAAO,qEACPC,MAAO,6CACPC,QAAS,kFACTC,IAAK,yDACLC,MAAO,iCACPC,OAAQ,yDACRC,MAAO,mDACPC,QAAS,2EACTC,QAAS,mDACTC,SAAU,qEACVC,OAAQ,6CACRC,MAAO,uCACPC,OAAQ,uCACRC,OAAQ,uCACRC,MAAO,qBACPC,QAAS,uCACTC,YAAa,+DACbC,QAAS,uCACTC,KAAM,mDACNC,QAAS,yDACTC,KAAM,2BACNC,KAAM,qBACNC,MAAO,yDACPC,MAAO,6CACPC,OAAQ,qBACRC,OAAQ,iFACRC,SAAU,mGACVC,SAAU,uCACVC,MAAO,uCACPC,IAAK,2BACLC,KAAM,uCACNC,SAAU,sEACVC,UAAW,oJACXC,YAAa,qEACbC,IAAK,wCACLC,OAAQ,iCACRC,eAAgB,gBAChBC,aAAc,uCACdC,aAAc,6CACdC,YAAa,2BACbC,YAAa,iCACbC,MAAO,+DACPC,SAAU,mDACVC,OAAQ,6CACRC,QAAS,mDACTC,MAAO,iCACPC,YAAa,2BACbC,cAAe,oDACfC,kBAAmB,6KACnBC,OAAQ,iCACRC,UAAW,mDACXC,SAAU,6CACVC,oBAAqB,wFACrBC,mBAAoB,0GACpBC,eAAgB,wFAChBC,kBAAmB,4JACnBC,kBAAmB,iHACnBC,aAAc,6FACdC,UAAW,yDACXC,SAAU,6CACVC,IAAK,yDACLC,MAAO,gEAGTC,OAAQ,CACNC,UAAW,sEACXC,kBAAmB,yDACnBC,cAAe,iFACfC,eAAgB,2EAChBC,cAAe,uCACfC,kBAAmB,kFACnBC,mBAAoB,2EACpBC,qBAAsB,gHACtBC,uBAAwB,6KACxBC,wBAAyB,8FACzBC,iBAAkB,yDAClBC,mBAAoB,wFACpBC,aAAc,uCACdC,cAAe,qEACfC,UAAW,0DACXC,gBAAiB,YACjBC,YAAa,gBAGfC,QAAS,CACPC,cAAe,qGACfC,aAAc,qGACdC,cAAe,+FACfC,sBAAuB,qLACvBC,oBAAqB,uMACrBC,6BAA8B,6PAC9BC,8BAA+B,4RAC/BC,0BAA2B,kRAC3BC,uBAAwB,qLACxBC,mCAAoC,8CACpCC,uBAAwB,qLACxBC,kBAAmB,0BACnBC,oBAAqB,4BACrBC,oBAAqB,4BACrBC,yBAA0B,wCAC1BC,sCAAuC,sDACvCC,yBAA0B,uDAC1BC,8BAA+B,6CAC/BC,oBAAqB,4BACrBC,uBAAwB,4BACxBC,4BAA6B,qNAC7BC,6CACE,gWACFC,kBAAmB,8MACnBC,sBAAuB,oNACvBC,sBAAuB,yNACvBC,wBAAyB,0NACzBC,uBAAwB,sLACxBC,yBAA0B,4LAC1BC,oBAAqB,8HACrBC,8BAA+B,uLAC/BC,oBAAqB,+PACrBC,oBAAqB,6BACrBC,qBAAsB,8BACtBC,gBAAiB,oBACjBC,sBAAuB,qQACvBC,sBAAuB,+PACvBC,sBAAuB,6RACvBC,uBAAwB,8HACxBC,8BAA+B,+KAC/BC,oBAAqB,0IACrBC,mBAAoB,mHACpBC,qBAAsB,yIACtBC,kCAAmC,+PACnCC,8BAA+B,yNAC/BC,6BAA8B,mKAC9BC,kCAAmC,iMACnCC,iCAAkC,2IAClCC,kCAAmC,gOACnCC,iCAAkC,0KAClCC,2BAA4B,sIAC5BC,4BAA6B,4LAC7BC,uBAAwB,kOACxBC,wDACE,4YACFC,oBAAqB,2GACrBC,qCAAsC,0PACtCC,uCAAwC,uQACxCC,gBAAiB,oIACjBC,aAAc,uFACdC,kBAAmB,iHACnBC,oBAAqB,iHACrBC,kBAAmB,iHACnBC,iBAAkB,6HAClBC,iBAAkB,gHAClBC,gBAAiB,4HACjBC,iBAAkB,sHAClBC,kCAAmC,yNACnCC,mCAAoC,sRACpCC,iBAAkB,2GAClBC,mBAAoB,2GACpBC,iBAAkB,2GAClBC,gBAAiB,uHACjBC,wBAAyB,0IACzBC,gBAAiB,0GACjBC,eAAgB,sHAChBC,gBAAiB,gHACjBC,mCAAoC,mNACpCC,yCAA0C,qOAC1CC,mCAAoC,yNACpCC,2BACE,ucACFC,wBAAyB,2NACzBC,yBAA0B,0IAC1BC,qBAAsB,2FACtBC,wBAAyB,8MACzBC,0BAA2B,oPAC3BC,oBAAqB,+HACrBC,cAAe,gGAGjBC,KAAM,CACJC,gBAAiB,4EACjBC,OAAQ,CACNC,aAAc,iHACdC,kBAAmB,wFACnBC,aAAc,mFACdC,YAAa,4DAEfC,SAAU,sEACVC,UAAW,yIACXC,eAAgB,uCAChBC,QAAS,CACPC,iBAAkB,uHAClBC,YAAa,wFACbC,cAAe,kBACfC,4BAA6B,wOAC7BC,0BAA2B,0MAE7BC,YAAa,2BACbC,KAAM,CACJC,cAAe,kFACfC,cAAe,oGACfC,gBAAiB,gEACjBC,mCAAoC,4SACpCC,cAAe,wKACfC,cAAe,wKACfC,gBAAiB,wKACjBC,gCAAiC,yZACjCC,2BAA4B,kSAC5BC,eAAgB,uHAChBC,iBAAkB,qQAClBC,mBAAoB,kKACpBC,qBAAsB,yPACtBC,mBAAoB,iOACpBC,+BAAgC,wTAChCC,sCAAuC,6QACvCC,0CACE,iYAEJC,YAAa,+DACbC,KAAM,CACJC,KAAM,yDACNC,KAAM,0DAERC,YAAa,mDACbC,KAAM,CACJC,eAAgB,kBAChBC,mBAAoB,0CACpBC,UAAW,6CACXC,OAAQ,oGACRC,QAAS,8FACTC,WAAY,sHACZC,WAAY,4EACZC,qBAAsB,mIACtBC,2BAA4B,2JAC5BC,mBAAoB,0GACpBC,YAAa,CACXC,gBAAiB,iHACjBC,kBAAmB,uHACnBC,YAAa,+DACbC,WAAY,mDACZC,KAAM,qDAGVC,gBAAiB,2EACjBC,SAAU,CACRC,YAAa,mFACbC,mBAAoB,0GACpBC,SAAU,mDACVC,WAAY,kEAEdC,kBAAmB,yDACnBC,WAAY,CACVC,sCAAuC,0TACvCC,eAAgB,+OAChBC,eAAgB,+OAChBC,eAAgB,+OAChBC,eAAgB,gPAElBC,MAAO,CACLC,UAAW,4EACXC,WAAY,kFACZC,eAAgB,qJAChBC,wBAAyB,gMACzBC,sBAAuB,qLAEzBC,gBAAiB,uCACjBC,eAAgB,uCAChBC,QAAS,CACPC,2BAA4B,8KAC5BC,6BAA8B,0LAC9BC,kCAAmC,gOACnCC,8BAA+B,kKAC/BC,iCAAkC,iMAClCC,kBAAmB,qGAErBC,cAAe,uCACfC,OAAQ,CACNC,iBAAkB,iHAClBC,kBAAmB,iHACnBC,4BAA6B,+MAE/BC,gBAAiB,6CACjBC,SAAU,CACRC,2BAA4B,sMAC5BC,4BAA6B,sMAC7BC,sBAAuB,+IACvBC,mBAAoB,iHACpBC,oCAAqC,sOAEvCC,kBAAmB,kFACnBC,WAAY,CACVC,kBAAmB,qJACnBC,mBAAoB,qJACpBC,kBAAmB,4HACnBC,oBAAqB,sHACrBC,MAAO,uCACPC,YAAa,+DACbT,mBAAoB,4JACpBU,uBAAwB,2OACxBX,sBAAuB,+IACvBY,0BAA2B,2JAC3BC,gCAAiC,mPAEnCC,uBAAwB,6KACxBC,gBAAiB,CACfV,kBAAmB,qJACnBC,mBAAoB,sJAEtBU,qBAAsB,oGACtBC,cAAe,CACbZ,kBAAmB,qJACnBC,mBAAoB,sJAEtBY,wBAAyB,8FACzBC,iBAAkB,CAChBd,kBAAmB,qJACnBC,mBAAoB,sJAEtBc,iBAAkB,yDAClBC,UAAW,CACThB,kBAAmB,qJACnBC,mBAAoB,sJAEtBgB,yBAA0B,uMAC1BC,kBAAmB,CACjBlB,kBAAmB,qJACnBC,mBAAoB,qJACpBkB,uCAAwC,qVAG1CC,iBAAkB,yDAElBC,0BAA2B,4EAC3BC,4BAA6B,CAC3BC,UAAW,gOACXC,qBAAsB,2GACtBC,oBAAqB,iJAGvBC,uBAAwB,+FACxBC,yBAA0B,CACxBC,kCAAmC,+QACnCC,6BAA8B,+KAC9BC,oCAAqC,iMACrCC,mCAAoC,2LACpCC,kCAAmC,wMACnCC,4CAA6C,qQAC7CC,mCAAoC,0VACpCC,2CAA4C,4TAC5CC,oCAAqC,gOACrCC,0CAA2C,4OAC3CC,8BAA+B,oKAGjCC,sBAAuB,kFACvBC,wBAAyB,CACvBC,gCAAiC,gRACjCC,uBAAwB,kNACxBC,mBAAoB,2LACpBC,kBAAmB,gLACnBC,yBAA0B,6MAC1BC,4BAA6B,6MAC7BC,eAAgB,gJAChBC,mBAAoB,oIACpBC,eAAgB,8FAChBC,YAAa,kFACbC,YAAa,iIACbC,kBAAmB,2LACnBC,kBAAmB,yHAGrBC,8BAA+B,6KAC/BC,gCAAiC,CAC/BC,8BAA+B,qLAC/BC,4BAA6B,kKAC7BC,gBAAiB,uHACjBC,4BAA6B,iCAC7BC,wCAAyC,uCACzCC,cAAe,wFACfC,8BAA+B,iVAC/BC,iCAAkC,uRAClCC,iCAAkC,0LAClCC,+BAAgC,oQAGlCC,8BAA+B,uKAC/BC,gCAAiC,CAC/BC,iCAAkC,yQAClCC,qCAAsC,6RACtCC,+BAAgC,mVAChCC,wBAAyB,+IACzBC,qDACE,wUACFC,yCAA0C,sOAC1CC,wCAAyC,2TACzCC,6BAA8B,qMAC9BC,iCAAkC,sMAClCC,4BAA6B,iRAC7BC,gBAAiB,wMAGnBC,8BAA+B,gJAC/BC,gCAAiC,CAC/BC,kBAAmB,wMAGrBC,wBAAyB,oBACzBC,0BAA2B,CACzBC,mCAAoC,mDACpCC,iCAAkC,iDAClCC,yCAA0C,wDAC1CC,2BAA4B,sDAG9BC,gBAAiB,mDAEjBC,mBAAoB,wFACpBC,oBAAqB,CACnBC,mBAAoB,0IACpBC,mBAAoB,wHACpBC,mCAAoC,yOACpCC,yBAA0B,4JAC1BC,oBAAqB,8IACrBC,8BAA+B,6JAC/BC,uBAAwB,mIACxBC,yBAA0B,wKAC1BC,sBAAuB,4JACvBC,aAAc,+IACdC,iBAAkB,mIAClBC,gCAAiC,2OACjCC,eAAgB,6MAChBC,aAAc,iFACdC,iBAAkB,8FAClBC,8BAA+B,4GAC/BC,8BAA+B,6JAC/BC,kCAAmC,uKACnCC,6BAA8B,mJAC9BC,2BAA4B,sOAC5BC,8BAA+B,qSAC/BC,wBAAyB,8OAG3BC,wBAAyB,4HACzBC,4BAA6B,wFAC7BC,4BAA6B,CAC3BC,cAAe,sHACfC,mBAAoB,+LACpBC,aAAc,+HACdC,uBAAwB,8IACxBC,SAAU,6CACVC,QAAS,yCACTC,WAAY,mCACZC,WAAY,mCACZC,QAAS,yCACTC,eAAgB,8HAChBC,WAAY,cACZC,YAAa,0FACbC,eAAgB,wHAChBC,YAAa,8FACbC,mBAAoB,uJAEtBC,2BAA4B,0GAC5BC,2BAA4B,CAC1BC,WAAY,oDACZC,mBAAoB,wEACpBC,kBAAmB,gJACnBC,kBAAmB,8IACnBC,eAAgB,kFAChBC,MAAO,wCAETC,yBAA0B,sHAC1BC,wBAAyB,CACvBC,iCAAkC,wCAClCC,+BAAgC,uCAElCC,qBAAsB,oGACtBC,sBAAuB,CACrBC,SAAU,6EAEZC,sBAAuB,sEACvBC,sBAAuB,CACrBC,WAAY,6CACZC,SAAU,+FACVC,gBAAiB,0GACjBC,WAAY,2GACZC,iBAAkB,gHAClBC,aAAc,sEACdC,SAAU,cACVC,eAAgB,qGAGlBC,8BAA+B,8FAC/BC,+BAAgC,CAC9BC,sCAAuC,6RACvCC,6CAA8C,2TAC9CC,0BAA2B,gMAC3BC,mCAAoC,iUACpCC,mCAAoC,kNAEtCC,gBAAiB,2BACjBC,cAAe,mGACfC,cAAe,wFACfC,UAAW,4EACXC,QAAS,yCAGXC,WAAY,CACVC,gBAAiB,6KACjBC,sBAAuB,oCACvBC,iBACE,quDACFC,OAAQ,uCACRC,QAAS,iCACTC,iBAAkB,oFAGpBC,QAAS,CACPC,KAAM,2BACNC,MAAO,mDACPC,aAAc,8FACdC,YAAa,6CACbC,UAAW,2BACXC,YAAa,qBACbC,eAAgB,2BAChBC,UAAW,uCACXC,UAAW,iCACXC,cAAe,2BACfC,WAAY,gHACZC,oCAAqC,oQACrCC,2BAA4B,iKAC5BC,gCAAiC,sLACjCC,sBAAuB,gLACvBC,iBAAkB,6HAClBC,mBAAoB,uHACpBC,gBAAiB,uHACjBC,4BAA6B,kCAC7BC,6BAA8B,oCAGhCC,WAAY,CACVC,sBAAuB,0BACvBC,WAAY,qEACZC,WAAY,6HACZC,WAAY,2GACZC,OAAQ,6CACRC,cAAe,6HACfC,aAAc,4EACdC,uBAAwB,oLACxBC,yBAA0B,8KAC1BC,6BAA8B,mCAC9BC,wBAAyB,0LACzBC,6BAA8B,4MAC9BC,yBAA0B,0LAC1BC,iCAAkC,gSAClCC,gCAAiC,gSACjCC,kCAAmC,0RACnCC,sCAAuC,wEACvCC,sCAAuC,wTACvCC,kCAAmC,sSACnCC,gBAAiB,yIACjBC,kBAAmB,gJAGrBC,aAAc,CACZvb,MAAO,iCACPwb,UAAW,gEACXC,YAAa,sEACbC,UAAW,sEACXC,cAAe,4EACfC,WAAY,gEACZC,iBAAkB,8HAGpBC,eAAgB,CACdnB,6BAA8B,qOAC9BoB,kCAAmC,0TACnCC,iCAAkC,6PAClCC,mCAAoC,uPACpCC,4BAA6B,kNAC7BC,yBAA0B,gMAC1BC,wBAAyB,+QACzBC,uBAAwB,oLACxBC,yBAA0B,oLAC1BC,uBAAwB,oLACxBC,0BAA2B,sMAC3BC,wBAAyB,gMACzBhC,uBAAwB,0LACxBC,yBAA0B,oLAC1BgC,MAAO,6CACPC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,sDACXC,YAAa,kFACbC,gBAAiB,oBACjBC,kDACE,mdACFC,iBAAkB,uKAClBC,uDACE,wiBACFC,gBAAiB,0GACjBC,sDACE,2eACFC,kBAAmB,oGACnBC,wDACE,qeACFC,WAAY,+DACZC,iDACE,gcACFC,QAAS,6CACTC,8CACE,8aACFC,OAAQ,qEACRC,6CACE,scACFC,MAAO,iCACPC,4CACE,kaACFC,QAAS,iCACTC,8CACE,kaACFC,MAAO,iCACPC,4CACE,kaACFC,SAAU,iFACVC,+CACE,kdACFC,OAAQ,2BACRC,6CACE,waACFC,MAAO,uCACPC,4CACE,waACFC,QAAS,iCACTC,8CACE,kaACFC,mBAAoB,iHACpBC,wBAAyB,yIACzBC,uBAAwB,2BACxBC,eAAgB,kFAChBC,WAAY,gHACZC,eAAgB,+IAChBC,YAAa,8FACbC,gCAAiC,kPACjCC,kCAAmC,wPACnCC,kBAAmB,wQACnBC,oBAAqB,mIACrBC,gBAAiB,kHAGnBC,oBAAqB,CACnBC,2BAA4B,kKAC5BC,gCAAiC,0LACjCC,oBAAqB,iHACrBC,oBAAqB,iHACrBC,oBAAqB,gHACrBC,0BAA2B,uKAC3BC,0BAA2B,wKAG7BC,sBAAuB,CACrBC,iCAAkC,gMAClCC,+BAAgC,sPAChCC,eAAgB,6KAChBC,sBAAuB,kNACvBC,uBAAwB,6PACxBC,oBAAqB,wFACrBC,0BAA2B,6KAC3BC,0BAA2B,8KAG7BC,sBAAuB,CACrBjO,kBAAmB,mKACnBkO,oCAAqC,uRACrCC,+BAAgC,wRAChCC,+BAAgC,wRAChCC,iCAAkC,qQAClCC,iCAAkC,qQAClCC,yCAA0C,mSAC1CC,qCAAsC,iUACtCC,sCAAuC,2QACvCC,mCAAoC,8RAGtCC,WAAY,CACV9E,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,sDACXzC,6BAA8B,+NAC9BwB,yBAA0B,0LAC1BK,0BAA2B,gMAC3BC,wBAAyB,0LACzBhC,uBAAwB,oLACxBC,yBAA0B,8KAC1BgC,MAAO,uCACPW,YAAa,kFACbqE,8CACE,8aACF1D,QAAS,6CACT2D,0CACE,yYACFjD,SAAU,mDACVkD,2CACE,+YACFhD,OAAQ,2BACRiD,yCACE,mYACF/C,MAAO,uCACPgD,wCACE,mYACF9C,QAAS,iCACT+C,0CACE,6XACFC,eAAgB,+FAChBC,wBAAyB,6JACzBC,wBAAyB,8JACzBC,mBAAoB,uBACpBC,WAAY,gEACZC,aAAc,+FACdC,qBAAsB,0IACtBC,0BAA2B,gCAC3BC,qBAAsB,0IACtBlD,WAAY,kFACZmD,UAAW,qEACXjD,YAAa,6EAGfkD,YAAa,CACX/F,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,sDACXuF,QAAS,4EACTC,iBAAkB,iHAClBC,iBAAkB,6HAClBC,gBAAiB,iHACjBC,gBAAiB,6HACjBC,UAAW,gEACXC,MAAO,yDACPC,OAAQ,+DACRC,YAAa,gHACbC,UAAW,8FACXC,QAAS,+DACTC,UAAW,gEACXrX,UAAW,4EACXsX,UAAW,gEACXC,UAAW,kFACXC,WAAY,wFACZC,WAAY,4EACZC,wBAAyB,8KACzBC,uBAAwB,wKACxBC,aAAc,8FACdC,gBAAiB,qGACjBC,qBAAsB,uJACtBC,2BAA4B,4JAC5BC,oBAAqB,wBACrBC,YAAa,sEACbC,OAAQ,2EACRC,sBAAuB,uKACvBC,sCAAuC,4RACvCC,sCAAuC,sRACvCC,qBAAsB,6HACtBC,2BAA4B,+DAC5BC,yBAA0B,0DAC1BC,wBAAyB,gEACzBC,+BAAgC,sHAChCC,0BAA2B,cAC3BC,uBAAwB,oDACxBC,gCAAiC,qIACjCC,6BAA8B,6GAC9BC,+BAAgC,mHAChCC,iCAAkC,2IAClCC,sBAAuB,6CACvBC,0BAA2B,4EAC3BC,2BAA4B,uHAC5BC,+BAAgC,aAChCC,kCAAmC,gBACnCC,gCAAiC,cACjCC,+BAAgC,aAChCC,4BAA6B,SAC7BC,qCAAsC,2WAGxCC,iBAAkB,CAChBC,aAAc,qEACdC,WAAY,yDACZC,UAAW,uCACXC,UAAW,yDACXC,iBAAkB,gHAClBC,yBAA0B,qMAC1BC,0BAA2B,+IAC3BC,kCAAmC,wNACnCC,gCAAiC,+NACjChC,sBAAuB,uKACvBiC,WAAY,yDACZC,KAAM,qBACNC,oBAAqB,sHACrBC,UAAW,2BACXC,iCAAkC,yIAClCC,kCAAmC,yIACnCC,gCAAiC,mIACjCC,iCAAkC,mIAClCC,6BAA8B,oGAC9BC,8BAA+B,oGAC/BC,gCAAiC,mNACjCC,cAAe,0GACfC,WAAY,uCACZC,aAAc,sEACdC,6BAA8B,6MAC9BC,8BAA+B,wNAC/BC,eAAgB,8FAChBC,mBAAoB,6KACpBC,cAAe,oGACfC,cAAe,4HACfC,aAAc,oGACdC,KAAM,2BACNC,UAAW,0DACXC,aAAc,iKACdC,gBAAiB,4HACjBC,cAAe,sEACfC,qBAAsB,6KACtBC,kBAAmB,mLACnBC,qBAAsB,wKACtBC,kBAAmB,yIACnBC,iBAAkB,uJAClBC,eAAgB,oIAChBC,qBAAsB,gMACtBC,6BAA8B,4OAC9BC,gCAAiC,yPAGnCC,SAAU,CACRC,UAAW,wFACXC,KAAM,qEACNvvB,KAAM,qBACNwvB,OAAQ,wFAGVC,WAAY,CACVF,KAAM,qEACNvvB,KAAM,qBACNwvB,OAAQ,wFAGVE,WAAY,CACVC,aAAc,4EACdJ,KAAM,qEACNK,SAAU,qEACVC,mBAAoB,qIAGtBC,UAAW,CACTtsB,MAAO,iCACPusB,UAAW,iFACXC,MAAO,yDACPC,gBAAiB,sHACjBC,OAAQ,0DAGVC,mBAAoB,CAClBC,gBAAiB,8FACjBC,KAAM,iCACNC,WAAY,4EACZC,WAAY,cACZC,gBAAiB,mIACjBC,qCAAsC,8RACtCC,YAAa,0IAGfC,oCAAqC,CACnCC,qBAAsB,sHACtB5J,oBAAqB,gHACrB6J,2BAA4B,6KAC5B3J,0BAA2B,wKAG7B4J,eAAgB,CACdC,mBAAoB,sBACpBC,4BAA6B,iFAC7BC,gBAAiB,sBACjBC,yBAA0B,gFAC1BC,cAAe,kFACfC,YAAa,+DACbC,SAAU,qEACVC,UAAW,iFACXC,WAAY,gEACZC,OAAQ,uCACRC,WAAY,yFACZC,WAAY,+FACZC,UAAW,0DACXC,sBAAuB,uKACvBC,QAAS,uCACTC,uBAAwB,sVACxBC,YAAa,uHACbC,UAAW,gEACXC,4BAA6B,mQAC7BC,0BAA2B,uPAC3BC,0BAA2B,4UAC3BC,mBAAoB,oIACpBC,wBAAyB,kMACzBC,8BAA+B,gOAC/BC,uBAAwB,4BACxBC,eAAgB,sGAGlBC,aAAc,CACZC,gBAAiB,8NACjBtyB,MAAO,uCACPuyB,UAAW,4EACXC,MAAO,6CACPC,SAAU,gEACVC,gBAAiB,6FACjBC,gBAAiB,6FACjBC,SAAU,iFACVC,SAAU,WACVC,kBAAmB,qBACnBC,MAAO,uCACPC,KAAM,iCACNC,eAAgB,6HAChBC,oBAAqB,uKACrBC,gCAAiC,kNACjCC,6BAA8B,oJAGhCC,oBAAqB,CACnBC,aAAc,kFACdC,QAAS,uCACTC,YAAa,+FACbC,YAAa,kFACbC,wBAAyB,qOACzBC,mCAAoC,mSACpCC,4BAA6B,iCAC7BC,oBAAqB,2LAGvBC,qBAAsB,CACpBC,aAAc,8FACdC,kCAAmC,6TACnCV,aAAc,kFACdC,QAAS,uCACTC,YAAa,+FACbS,yBAA0B,sJAC1BC,oCAAqC,gOACrCC,6BAA8B,kCAC9BC,qBAAsB,wHAGxBC,cAAe,CACbC,MAAO,2BACPC,+BAAgC,+RAChCC,kBAAmB,iHACnBC,6BAA8B,2LAC9BC,sBAAuB,0BACvBC,cAAe,mFAGjBC,kBAAmB,CACjBC,kBAAmB,0GACnBC,YAAa,oGACbC,sBAAuB,4JACvBC,UAAW,+DACXC,YAAa,4EACbxB,YAAa,kFACbyB,kCAAmC,iMACnCC,sBAAuB,kKACvBC,kCAAmC,4OACnCC,2BAA4B,gCAC5BC,mBAAoB,oIAGtBC,SAAU,CACRC,eAAgB,wFAChBpS,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,sDACX4R,WAAY,sEACZC,aAAc,mFACdC,kBAAmB,sGACnBC,wBAAyB,6JACzBC,iBAAkB,qBAClBC,SAAU,oDACV/Q,QAAS,iCACTgR,eAAgB,uHAChBC,iBAAkB,6HAClBjT,yBAA0B,8KAC1BkT,4CAA6C,iQAC7ChR,MAAO,iCACPjC,uBAAwB,8KACxBkT,0CAA2C,iQAC3CpS,YAAa,kFACbqS,mBAAoB,wKACpBC,qBAAsB,8KACtBhV,6BAA8B,+NAC9BiV,gDAAiD,kTACjD5R,QAAS,6CACT6R,eAAgB,mIAChBC,iBAAkB,yIAClB3T,yBAA0B,0LAC1B4T,4CAA6C,6QAC7C7R,OAAQ,iCACR9B,wBAAyB,8KACzB4T,2CAA4C,iQAC5CC,gBAAiB,yIACjBC,kBAAmB,+IACnB1T,0BAA2B,gMAC3B2T,cAAe,wFACfC,iBAAkB,uCAClBC,cAAe,2BACfC,gBAAiB,iCACjBjN,QAAS,2EACTkN,iBAAkB,yIAClBC,eAAgB,8FAChBC,mBAAoB,oGACpBC,eAAgB,wFAChB/zB,MAAO,gEACPoB,OAAQ,uCACRjB,UAAW,6CACXF,QAAS,mDACT+zB,sBAAuB,0IACvBC,uBAAwB,wHACxBC,KAAM,+DACNC,KAAM,iCACNj2B,QAAS,mDACTk2B,MAAO,6CACPC,cAAe,4JACfC,YAAa,wFACbC,QAAS,uCACTC,aAAc,gEACdC,eAAgB,kFAChBC,cAAe,sEACfC,cAAe,kFACfC,aAAc,mFAGhBC,WAAY,CACVC,eAAgB,mFAChBC,oBAAqB,kCACrBC,0BAA2B,+KAC3BC,mBAAoB,uBACpBC,WAAY,oDACZ/zB,MAAO,uCACPC,OAAQ,uCACR+zB,QAAS,gCACTC,wBAAyB,6BACzBC,QAAS,gHACTC,kBAAmB,qBACnBC,gBAAiB,mBACjBC,aAAc,qJACdC,yBAA0B,6BAC1BC,uBAAwB,2BACxBC,aAAc,+IACdC,KAAM,mDACNlP,QAAS,2EACTmP,yBAA0B,4UAC1BC,QAAS,uCACTC,YAAa,gEACbC,aAAc,sEACdC,aAAc,4EACdC,aAAc,wFACdC,aAAc,sEACdC,MAAO,iCACPC,WAAY,sEACZC,UAAW,oGACXt2B,MAAO,gEACPu2B,WAAY,oDACZC,QAAS,uCACTC,OAAQ,uCACRC,UAAW,qEACXC,SAAU,8CACVvC,MAAO,8CAGTwC,SAAU,CACRxE,eAAgB,uCAChBpS,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXuW,aAAc,6EACdC,wBAAyB,mKACzBC,iBAAkB,qBAClBC,SAAU,8CACVC,gBAAiB,mFACjBC,2BAA4B,yKAC5BC,YAAa,oDACbC,oBAAqB,mIACrBC,cAAe,mIACfC,YAAa,wFACbC,gBAAiB,8FACjBC,YAAa,kFACbC,UAAW,0DACXC,cAAe,gJACfC,UAAW,0DACXjR,QAAS,2EACTkR,cAAe,kFACfnE,iBAAkB,uCAClBoE,gBAAiB,mDACjBC,eAAgB,2BAChBpX,YAAa,kFACbqS,mBAAoB,wKACpBC,qBAAsB,8KACtBhV,6BAA8B,+NAC9B+Z,gDAAiD,wTACjDpW,QAAS,iCACTgR,eAAgB,uHAChBC,iBAAkB,6HAClBjT,yBAA0B,8KAC1BqY,4CAA6C,uQAC7C3W,QAAS,6CACT6R,eAAgB,mIAChBC,iBAAkB,yIAClB3T,yBAA0B,0LAC1ByY,4CAA6C,mRAC7C1W,OAAQ,iCACR9B,wBAAyB,8KACzByY,2CAA4C,uQAC5CC,sBAAuB,iJACvBC,uBAAwB,+HACxBC,KAAM,+DACNC,QAAS,iCACTC,WAAY,iGACZC,cAAe,wGAGjBC,SAAU,CACRrG,eAAgB,8FAChBpS,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,qDACXC,UAAW,sDACXiY,UAAW,sDACXC,UAAW,sDACXC,UAAW,sDACXC,UAAW,sDACXC,UAAW,sDACXC,UAAW,sDACXC,UAAW,sDACXC,aAAc,mFACdC,eAAgB,mHAChBC,wBAAyB,4LACzBC,iBAAkB,qBAClBC,SAAU,oDACVC,SAAU,0DACV9C,QAAS,8FACTC,OAAQ,uCACRlQ,OAAQ,yDACRwH,WAAY,gEACZ4I,SAAU,+CAGZ4C,cAAe,CACbt7B,KAAM,uCACNu7B,IAAK,wCAGPC,gBAAiB,CACfC,2BAA4B,6KAC5BC,4BAA6B,sMAC7BC,uCAAwC,sTACxCC,cAAe,4EACfC,aAAc,6EAGhBC,0BAA2B,CACzBC,cAAe,8FACfC,UAAW,sEACXC,kCAAmC,4SAGrCC,iBAAkB,CAChBC,OAAQ,yDACRC,UAAW,oGACXC,KAAM,iFACNC,iBAAkB,kOAClBC,oBAAqB,sOACrBC,IAAK,qEACLC,kBAAmB,+NACnBC,kBAAmB,iOACnBC,YAAa,gFACbC,WAAY,gFACZC,eAAgB,wFAChBC,iBAAkB,gHAClBC,kBAAmB,0GACnBC,gBAAiB,uHACjBC,2BAA4B,6DAC5BC,cAAe,uHACfC,yBAA0B,6DAC1BC,WAAY,2GACZC,sBAAuB,6DACvBC,KAAM,yDACNC,gBAAiB,wKACjB9tB,UAAW,6CACXG,WAAY,sHACZ4tB,YAAa,0LAGfC,SAAU,CACR9d,cAAe,2GACf+d,gBAAiB,2EACjBC,oBAAqB,iJACrBp6B,YAAa,+DACb84B,KAAM,kFAGRuB,gBAAiB,CACfC,qBAAsB,qJACtB1P,SAAU,qEACV2P,aAAc,sEACdC,2BAA4B,uHAC5BC,gBAAiB,2GAGnBC,YAAa,CACXC,YAAa,gHACbC,gBAAiB,iEAGnBC,oBAAqB,CACnBC,oBAAqB,mIACrBC,qBAAsB,uHACtBC,OAAQ,yDACRC,GAAI,qEACJC,WAAY,kFACZC,IAAK,wCAGPC,qBAAsB,CACpBC,qBAAsB,8KACtBC,sBAAuB,kKACvBC,MAAO,iCACPC,aAAc,mFACdC,WAAY,0GACZC,YAAa,8FACbC,mCAAoC,yNACpCC,OAAQ,mDACRC,UAAW,aACXC,aAAc,gBACdC,WAAY,cACZC,UAAW,aACXC,YAAa,gBAGfC,0BAA2B,CACzBC,0BAA2B,yQAC3BC,2BAA4B,6PAC5Bb,MAAO,iCACPC,aAAc,mFACdC,WAAY,0GACZC,YAAa,8FACbW,wCAAyC,qTAG3CC,wBAAyB,CACvBC,wBAAyB,sMACzBC,yBAA0B,0LAC1BjB,MAAO,iCACPC,aAAc,mFACdC,WAAY,0GACZC,YAAa,8FACbe,uCAAwC,kPAG1CC,2BAA4B,CAC1BC,2BAA4B,oLAC5BC,4BAA6B,wKAC7BrB,MAAO,iCACPC,aAAc,mFACdC,WAAY,0GACZC,YAAa,8FACbmB,yCAA0C,sOAG5CC,oBAAqB,CACnBC,oBAAqB,+IACrBC,qBAAsB,mIACtBzB,MAAO,iCACPC,aAAc,mFACdC,WAAY,0GACZC,YAAa,8FACbuB,kCAAmC,iMAGrCC,uBAAwB,CACtBC,uBAAwB,4JACxBC,wBAAyB,gJACzBC,sBAAuB,iMACvBC,iBAAkB,yKAClB/B,MAAO,iCACPC,aAAc,mFACdC,WAAY,0GACZC,YAAa,8FACb6B,qCAAsC,kMAGxCC,cAAe,CACbC,mBAAoB,gJACpBxsB,UAAW,0DACXysB,gBAAiB,2CAGnBC,eAAgB,CACdC,UAAW,aACXC,uBAAwB,yCACxBC,cAAe,mFACfC,QAAS,kFACTC,aAAc,yKACdC,aAAc,0GACdC,yBAA0B,0SAC1BC,wBAAyB,gJACzBC,mDACE,mdAGJC,iBAAkB,CAChBT,UAAW,aACXC,uBAAwB,yCACxBC,cAAe,mFACfQ,WAAY,cACZC,oBAAqB,wBACrBC,gCAAiC,wDACjCC,+BAAgC,uCAChCC,sDACE,mFAGJC,aAAc,CACZC,gBAAiB,mBACjBC,mBAAoB,uBACpBC,qBAAsB,0BACtBC,QAAS,UACTC,YAAa,gEACbC,mBAAoB,cACpBC,wBAAyB,iCACzBC,2BAA4B,qCAC5BC,qCAAsC,iDACtCjgB,gBAAiB,oBACjBkgB,oBAAqB,wBACrBC,qBAAsB,yBACtBC,qBAAsB,yBACtBC,wBAAyB,kCACzBC,yCAA0C,4DAC1CC,sCAAuC,wDACvCC,4BAA6B,qCAC7BC,oBAAqB,wBACrBC,mBAAoB,uBACpBC,uBAAwB,6BACxBC,sBAAuB,4BACvBC,wBAAyB,0CACzBC,wBAAyB,0CACzBC,qCAAsC,gDACtCC,uCAAwC,kDACxCC,sBAAuB,0BACvBC,YAAa,gBACbC,YAAa,iBAGfC,qBAAsB,CACpBC,kBAAmB,gMACnBC,KAAM,kCACNC,gBAAiB,gKACjBC,cAAe,+NACfC,+BAAgC,qPAChCC,yCAA0C,4PAC1CC,mBAAoB,4XACpBC,MAAO,+DACPC,aAAc,8FACdC,sBAAuB,+DACvBC,UAAW,kIACXC,SAAU,oCACVC,QAAS,qCAGXC,aAAc,CACZC,cAAe,mFAGjBC,wBAAyB,CACvBC,0BAA2B,wNAC3BC,WAAY,kFAGdC,eAAgB,CACdC,oBAAqB,gHACrBC,wBAAyB,2JACzBC,uBAAwB,kKACxBC,aAAc,gBACdC,SAAU,aAGZC,gBAAiB,CACfC,qBAAsB,wBACtBC,iBAAkB,qBAClBC,iBAAkB,sBAGpBC,uBAAwB,CACtBC,aAAc,sEACdC,oBAAqB,wNACrBC,wBAAyB,oLACzBC,+BAAgC,sOAGlCC,gBAAiB,CACfC,0BAA2B,8JAC3BC,wBAAyB,sLACzBC,gCAAiC,gOACjCC,yBAA0B,+KAC1BC,2BAA4B,oNAC5BC,6BAA8B,6RAC9BC,8BAA+B,kMAC/BC,uBAAwB,6JACxBC,+BAAgC,0KAChCC,sBAAuB,4IAGzBC,QAAS,CACPC,UAAW,sEACXC,OAAQ,6CACRC,cAAe,8FACfC,QAAS,sEACTC,UAAW,sEACXC,QAAS,sEACTC,eAAgB,yIAChBC,aAAc,2GACdC,WAAY,6HACZC,eAAgB,iHAChBC,eAAgB,uHAChBC,UAAW,yLACXC,UAAW,4EACXC,cAAe,uHACfC,eAAgB,gHAChBC,iBAAkB,qJAClBC,mBAAoB,kNACpBC,oBAAqB,mIACrBC,aAAc,8FACdC,eAAgB,4HAChBC,SAAU,4EACVC,QAAS,4EACTC,UAAW,4EACXC,UAAW,sEACXC,uCAAwC,0UACxCC,mCAAoC,+RACpCC,gBAAiB,gHACjBC,WAAY,kFACZC,uBAAwB,iMACxBC,wBAAyB,qJACzBC,8BAA+B,+KAC/BC,oBAAqB,8KACrBC,yBAA0B,kNAC1BC,qBAAsB,mTACtBC,mBAAoB,oLACpBC,qBAAsB,oLACtBC,mBAAoB,0LACpBC,0BAA2B,mQAC3BC,wBAAyB,qOACzBC,sBAAuB,iPACvBC,0BAA2B,qOAC3BC,0BAA2B,iPAC3BC,yBAA0B,2OAC1BC,qBAAsB,gMACtBC,0BAA2B,oOAC3BC,4BAA6B,yQAC7BC,8BAA+B,kVAC/BC,+BAAgC,uPAChCC,wBAAyB,kNACzBC,0BAA2B,gPAC3BC,oBAAqB,kNACrBC,mBAAoB,0LACpBC,qBAAsB,0LACtBC,qBAAsB,qLAGxBC,QAAS,CACPC,QAAS,2OACTC,qBAAsB,6JACtBC,gBAAiB,wMACjBC,6BAA8B,oCAGhCC,KAAM,CACJC,MAAO,uCACPC,MAAO,uCACPC,QAAS,iCACTC,QAAS,iCACTC,IAAK,sBACLC,QAAS,kFACTC,OAAQ,2BACRC,SAAU,mDACVC,MAAO,2BACPC,IAAK,qBACLC,KAAM,iCACNC,OAAQ,kCAGVC,OAAQ,CACNC,WAAY,6CACZC,QAAS,uCACTC,aAAc,wEACdC,aAAc,wEACdC,aAAc,wEACdC,aAAc,wEACdC,SAAU,mDACVC,MAAO,iCACPC,UAAW,yDACXC,MAAO,6CACPC,QAAS,wFACTC,OAAQ,uCACRC,UAAW,mDACXC,SAAU,gEACVC,MAAO,6CACPC,YAAa,gEACbC,aAAc,uEAGhBC,OAAQ,CACNC,KAAM,iCACNC,KAAM,6CACNC,MAAO,6CACPC,WAAY,iCACZC,KAAM,iCACNC,QAAS,+DACTC,MAAO,uCACPC,KAAM,mDACNC,KAAM,iCACNC,KAAM,iCACNC,SAAU,6CACVC,KAAM,iCACNC,KAAM,iCACNC,KAAM,iCACNC,SAAU,uCACVC,KAAM,iCACNC,KAAM,uCACNC,KAAM,iCACNC,KAAM,uCACNC,KAAM,uCACNC,QAAS,yDACTC,KAAM,yDACNC,KAAM,mDACNC,KAAM,2BACNC,SAAU,iCACVC,KAAM,uCACNC,OAAQ,uCACRC,OAAQ,6CACRC,KAAM,yDACNC,KAAM,iCACNC,MAAO,2BACPC,MAAO,uCACPC,SAAU,iCACVC,KAAM,2BACNC,KAAM,2BACNC,OAAQ,wCAGVC,QAAS,CACPC,EAAG,eACHC,EAAG,eACHC,EAAG,UACHC,EAAG,gBAGLC,MAAO,CACLC,QAAS,MACTC,SAAU,MACVC,MAAO,MACPC,MAAO,MACPC,IAAK,MACLb,KAAM,MACNc,KAAM,MACNC,OAAQ,MACRC,UAAW,MACXC,QAAS,MACTC,SAAU,MACVC,SAAU,OAGZC,UAAW,CACTC,kBAAmB,2GACnBC,cAAe,mFACfC,kBAAmB,mIACnBC,iCAAkC,oTAClCC,uBAAwB,yNACxBC,uBAAwB,yNACxBC,sBAAuB,yKACvBC,gCAAiC,sONlpDxBn0C,IOOH00C,EA+BAjM,EASAC,EAoBAiM,EA0CAxpC,EAcAypC,EAOAC,EAKAC,EASAC,EAKA7kB,EAKAG,EAMA3D,EAMAtX,EAoBA4/B,EAKAC,EAwBAhzB,EAYAizB,EAKAC,EASAC,EA+BAC,EAMA3sB,EAOA4sB,EAQAC,EAUAC,EAsBAC,EAMAC,EAMAC,EAOAC,EAUAliB,EAKAmiB,GAOAC,GAQAngB,GAMAogB,GAKAC,GAeAC,GAoBAC,GAMAC,GAuCAC,GAcAC,GAcAC,GAcAC,GAeAC,GAsBAC,GAYAC,GAKAC,GAaAC,GP9jBG52C,KAAf,E,qBQtCe,OAA0B,oCCA1B,OAA0B,uDCA1B,OAA0B,qDCA1B,OAA0B,sC,wECkBnC62C,GAAe,CAAEC,KAAM,UACvBC,GAAc,CAAED,KAAM,SACtBE,GAAY,CAAEF,KAAM,OAEpBG,G,oDAEJ,WAAaC,EAAQC,GAAc,IAAD,uBAEhC,oBAEoBC,IAAfD,GAA2BE,QAAQC,KAAM,4EACzCH,IAAeI,UAAWF,QAAQG,MAAO,4HAE9C,EAAKN,OAASA,EACd,EAAKC,WAAaA,EAClB,EAAKA,WAAWM,MAAMC,YAAc,OAGpC,EAAKC,SAAU,EAGf,EAAKC,OAAS,IAAIC,WAGlB,EAAKC,YAAc,EACnB,EAAKC,YAAcC,IAGnB,EAAKC,QAAU,EACf,EAAKC,QAAUF,IAIf,EAAKG,cAAgB,EACrB,EAAKC,cAAgBC,KAAKC,GAI1B,EAAKC,iBAAoBP,IACzB,EAAKQ,gBAAkBR,IAIvB,EAAKS,eAAgB,EACrB,EAAKC,cAAgB,IAIrB,EAAKC,YAAa,EAClB,EAAKC,UAAY,EAGjB,EAAKC,cAAe,EACpB,EAAKC,YAAc,EAGnB,EAAKC,WAAY,EACjB,EAAKC,SAAW,EAChB,EAAKC,oBAAqB,EAC1B,EAAKC,YAAc,EAInB,EAAKC,YAAa,EAClB,EAAKC,gBAAkB,EAGvB,EAAKC,UAAY,EACjB,EAAKC,UAAY,EACjB,EAAKC,KAAO,CACVC,UAAW,OACXC,WAAY,OACZC,aAAc,OACdC,cAAe,OACfC,QAAS,OACTC,UAAW,OACXC,YAAa,YACbC,UAAW,UACXC,aAAc,aACdC,YAAa,aAIf,EAAKC,aAAe,CAAEC,KAAMC,SAAMC,OAAQC,OAAQF,SAAMG,MAAOC,MAAOJ,SAAMK,KAG5E,EAAKC,QAAU,CAAEC,IAAKC,SAAMP,OAAQQ,IAAKD,SAAME,WAG/C,EAAKC,QAAU,EAAKnD,OAAOoD,QAC3B,EAAKC,UAAY,EAAK/D,OAAOgE,SAASF,QACtC,EAAKG,MAAQ,EAAKjE,OAAOkE,KAGzB,EAAKC,qBAAuB,KAM5B,EAAKC,cAAgB,WAEnB,OAAOC,EAAUC,KAInB,EAAKC,kBAAoB,WAEvB,OAAOF,EAAUG,OAInB,EAAKC,YAAc,WAEjB,OAAOC,KAAK1E,OAAOgE,SAASW,WAAYD,KAAKhE,SAI/C,EAAKkE,kBAAoB,SAAW3E,GAElCA,EAAW4E,iBAAkB,UAAWC,GACxCJ,KAAKP,qBAAuBlE,EAE5B8E,GAAU,EACVC,EAAO,GAIT,EAAKC,gBAAkB,WAEe,OAA/BC,EAAMf,sBAETe,EAAMf,qBAAqBgB,oBAAqB,UAAWL,IAM/D,EAAKM,UAAY,WAEfF,EAAMrB,QAAQwB,KAAMH,EAAMxE,QAC1BwE,EAAMnB,UAAUsB,KAAMH,EAAMlF,OAAOgE,UACnCkB,EAAMjB,MAAQiB,EAAMlF,OAAOkE,MAI7B,EAAKoB,MAAQ,WAEXJ,EAAMxE,OAAO2E,KAAMH,EAAMrB,SACzBqB,EAAMlF,OAAOgE,SAASqB,KAAMH,EAAMnB,WAClCmB,EAAMlF,OAAOkE,KAAOgB,EAAMjB,MAE1BiB,EAAMlF,OAAOuF,yBACbL,EAAMM,cAAe7F,IAErBuF,EAAMO,SAENC,EAAQC,EAAMC,MAKhB,EAAKH,OAAS,WAEZ,IAAMI,EAAS,IAAIlF,WAGbmF,GAAO,IAAIC,eAAaC,mBAAoBhG,EAAOiG,GAAI,IAAItF,WAAS,EAAG,EAAG,IAC1EuF,EAAcJ,EAAKhC,QAAQqC,SAE3BC,EAAe,IAAIzF,WACnB0F,EAAiB,IAAIN,cAErBO,EAAQ,EAAInF,KAAKC,GAEvB,OAAO,WAEL,IAAM4C,EAAWkB,EAAMlF,OAAOgE,SAE9B6B,EAAOR,KAAMrB,GAAWuC,IAAKrB,EAAMxE,QAGnCmF,EAAOW,gBAAiBV,GAGxBzB,EAAUoC,eAAgBZ,GAErBX,EAAMjD,YAAcyD,IAAUC,EAAMC,MAEvCc,EA0LG,EAAIvF,KAAKC,GAAK,GAAK,GAAK8D,EAAMhD,iBAtL9BgD,EAAM3D,eAET8C,EAAUG,OAASmC,EAAenC,MAAQU,EAAM1D,cAChD6C,EAAUC,KAAOqC,EAAerC,IAAMY,EAAM1D,gBAI5C6C,EAAUG,OAASmC,EAAenC,MAClCH,EAAUC,KAAOqC,EAAerC,KAMlC,IAAIsC,EAAM1B,EAAM7D,gBACZwF,EAAM3B,EAAM5D,gBA2EhB,OAzEKwF,SAAUF,IAASE,SAAUD,KAE3BD,GAAQzF,KAAKC,GAAKwF,GAAON,EAAiBM,EAAMzF,KAAKC,KAAKwF,GAAON,GAEjEO,GAAQ1F,KAAKC,GAAKyF,GAAOP,EAAiBO,EAAM1F,KAAKC,KAAKyF,GAAOP,GAIpEjC,EAAUG,MAFPoC,GAAOC,EAEQ1F,KAAK0F,IAAKD,EAAKzF,KAAKyF,IAAKC,EAAKxC,EAAUG,QAItCH,EAAUG,OAAUoC,EAAMC,GAAQ,EACpD1F,KAAK0F,IAAKD,EAAKvC,EAAUG,OACzBrD,KAAKyF,IAAKC,EAAKxC,EAAUG,QAO/BH,EAAUC,IAAMnD,KAAK0F,IAAK3B,EAAMjE,cAAeE,KAAKyF,IAAK1B,EAAMhE,cAAemD,EAAUC,MAExFD,EAAU0C,WAGV1C,EAAU2C,QAAUC,EAGpB5C,EAAU2C,OAAS7F,KAAK0F,IAAK3B,EAAMtE,YAAaO,KAAKyF,IAAK1B,EAAMrE,YAAawD,EAAU2C,UAI1D,IAAxB9B,EAAM3D,cAET2D,EAAMxE,OAAOwG,gBAAiBC,EAAWjC,EAAM1D,eAI/C0D,EAAMxE,OAAO0G,IAAKD,GAIpBtB,EAAOwB,iBAAkBhD,GAGzBwB,EAAOW,gBAAiBN,GAExBlC,EAASqB,KAAMH,EAAMxE,QAAS0G,IAAKvB,GAEnCX,EAAMlF,OAAOsH,OAAQpC,EAAMxE,SAEE,IAAxBwE,EAAM3D,eAEToF,EAAenC,OAAW,EAAIU,EAAM1D,cACpCmF,EAAerC,KAAS,EAAIY,EAAM1D,cAElC2F,EAAUI,eAAgB,EAAIrC,EAAM1D,iBAIpCmF,EAAea,IAAK,EAAG,EAAG,GAE1BL,EAAUK,IAAK,EAAG,EAAG,IAIvBP,EAAQ,KAMHQ,GACHrB,EAAasB,kBAAmBxC,EAAMlF,OAAOgE,UAAa2D,GAC1D,GAAM,EAAItB,EAAeuB,IAAK1C,EAAMlF,OAAO6H,aAAiBF,KAE5DzC,EAAMM,cAAe7F,IAErByG,EAAaf,KAAMH,EAAMlF,OAAOgE,UAChCqC,EAAehB,KAAMH,EAAMlF,OAAO6H,YAClCJ,GAAc,GAEP,IAnIC,GA6Id,EAAKK,QAAU,WAEb5C,EAAMjF,WAAWkF,oBAAqB,cAAe4C,IAErD7C,EAAMjF,WAAWkF,oBAAqB,cAAe6C,GACrD9C,EAAMjF,WAAWkF,oBAAqB,gBAAiB8C,GACvD/C,EAAMjF,WAAWkF,oBAAqB,QAAS+C,GAE/ChD,EAAMjF,WAAWkF,oBAAqB,cAAegD,GACrDjD,EAAMjF,WAAWkF,oBAAqB,YAAaiD,GAGf,OAA/BlD,EAAMf,sBAETe,EAAMf,qBAAqBgB,oBAAqB,UAAWL,IAY/D,IAAMI,EAAK,gBAELS,EAAQ,CACZC,MAAQ,EACRzC,OAAQ,EACRE,MAAO,EACPE,IAAK,EACL8E,aAAc,EACdC,UAAW,EACXC,gBAAiB,EACjBC,mBAAoB,GAGlB9C,EAAQC,EAAMC,KAEZ+B,EAAM,KAGNtD,EAAY,IAAIoE,aAChB9B,EAAiB,IAAI8B,aAEvBxB,EAAQ,EACNE,EAAY,IAAIxG,WAClB8G,GAAc,EAEZiB,EAAc,IAAIC,WAClBC,EAAY,IAAID,WAChBE,EAAc,IAAIF,WAElBG,EAAW,IAAIH,WACfI,EAAS,IAAIJ,WACbK,EAAW,IAAIL,WAEfM,EAAa,IAAIN,WACjBO,EAAW,IAAIP,WACfQ,EAAa,IAAIR,WAEjBS,EAAW,GACXC,EAAmB,GAGrBtE,GAAU,EACVC,EAAO,EAQX,SAASsE,IAEP,OAAOnI,KAAKoI,IAAK,IAAMrE,EAAMxD,WAI/B,SAASgF,EAAY8C,GAEnB7C,EAAenC,OAASgF,EAI1B,SAASC,EAAUD,GAEjB7C,EAAerC,KAAOkF,EAIxB,IAAME,EAAU,WAEd,IAAMC,EAAI,IAAIhJ,WAEd,OAAO,SAAkBiJ,EAAUC,GAEjCF,EAAEG,oBAAqBD,EAAc,GACrCF,EAAEpC,gBAAkBqC,GAEpBzC,EAAUC,IAAKuC,IATH,GAeVI,EAAQ,WAEZ,IAAMJ,EAAI,IAAIhJ,WAEd,OAAO,SAAgBiJ,EAAUC,IAEG,IAA7B3E,EAAMnD,mBAET4H,EAAEG,oBAAqBD,EAAc,IAIrCF,EAAEG,oBAAqBD,EAAc,GACrCF,EAAEK,aAAc9E,EAAMlF,OAAOiG,GAAI0D,IAInCA,EAAEpC,eAAgBqC,GAElBzC,EAAUC,IAAKuC,IAnBL,GA0BRM,EAAM,WAEV,IAAMpE,EAAS,IAAIlF,WAEnB,OAAO,SAAcuJ,EAAQC,GAE3B,IAAMC,EAAUlF,EAAMjF,WAEtB,GAAKiF,EAAMlF,OAAOqK,oBAAsB,CAGtC,IAAMrG,EAAWkB,EAAMlF,OAAOgE,SAC9B6B,EAAOR,KAAMrB,GAAWuC,IAAKrB,EAAMxE,QACnC,IAAI4J,EAAiBzE,EAAO0E,SAG5BD,GAAkBnJ,KAAKqJ,IAAOtF,EAAMlF,OAAOyK,IAAM,EAAMtJ,KAAKC,GAAK,KAGjEsI,EAAS,EAAIQ,EAASI,EAAiBF,EAAQM,aAAcxF,EAAMlF,OAAO2K,QAC1EZ,EAAO,EAAII,EAASG,EAAiBF,EAAQM,aAAcxF,EAAMlF,OAAO2K,aAE9DzF,EAAMlF,OAAO4K,sBAGvBlB,EAASQ,GAAWhF,EAAMlF,OAAO6K,MAAQ3F,EAAMlF,OAAO8K,MAAS5F,EAAMlF,OAAOkE,KAAOkG,EAAQW,YAAa7F,EAAMlF,OAAO2K,QACrHZ,EAAOI,GAAWjF,EAAMlF,OAAOgL,IAAM9F,EAAMlF,OAAOiL,QAAW/F,EAAMlF,OAAOkE,KAAOkG,EAAQM,aAAcxF,EAAMlF,OAAO2K,UAKpHxK,QAAQC,KAAM,gFACd8E,EAAMrD,WAAY,IAhCZ,GAwCNqJ,EAAS,WAEb,IAAMC,EAAU,IAAIxK,WAEpB,OAAO,SAAiBiJ,GAEtB,IAAMwB,EAASlG,EAAMlF,OAErBmL,EAAQrB,oBAAqBsB,EAAOT,OAAQ,GAE5CQ,EAAQ5D,eAA2B,GAAXqC,GAExBwB,EAAOpH,SAASoD,IAAI+D,GAEpBC,EAAOpH,SAASqH,EAAIlK,KAAK0F,IAAI,EAAGuE,EAAOpH,SAASqH,GAEhDnG,EAAMM,cAAe7F,IAErBuF,EAAMM,cAAe1F,KAlBV,GAwBTwL,EAAc,WAElB,IAAMH,EAAU,IAAIxK,WAEpB,OAAO,SAAsBiJ,GAE3B,IAAMwB,EAASlG,EAAMlF,OAErBmL,EAAQrB,oBAAqBsB,EAAOT,OAAQ,GAE5CQ,EAAQnB,aAAcoB,EAAOnF,GAAIkF,GAEjCA,EAAQ5D,eAA2B,GAAXqC,GAExBwB,EAAOpH,SAASoD,IAAI+D,GAEpBjG,EAAMM,cAAe7F,IAErBuF,EAAMM,cAAe1F,KAlBL,GAwBdyL,EAAY,WAEhB,IAAMJ,EAAU,IAAIxK,WAEpB,OAAO,SAAoBiJ,GAEzB,IAAMwB,EAASlG,EAAMlF,OAErBmL,EAAQrB,oBAAqBsB,EAAOT,OAAQ,GAE5CQ,EAAQ5D,eAA2B,GAAXqC,GAExBwB,EAAOpH,SAASoD,IAAK+D,GAErBjG,EAAMM,cAAe7F,IAErBuF,EAAMM,cAAe1F,KAhBP,GAqBZ0L,EAAS,WAEb,IAAMC,EAAS,IAAIC,SAAO,EAAG,EAAG,EAAG,OAEnC,OAAO,SAAiB9B,GAEtB,IAAMwB,EAASlG,EAAMlF,OAErByL,EAAOE,kBAAmBP,EAAOvD,YAE5B1G,KAAKyK,IAAKzK,KAAKyK,IAAKH,EAAOJ,EAAIrG,GAAS7D,KAAKC,IAAO,MAEvD2D,GAAWA,GAIRA,EAEH0G,EAAOI,GAAK,IAAOjC,EAInB6B,EAAOI,GAAK,IAAOjC,EAIrB6B,EAAOI,EAAI1K,KAAK0F,IAAI,GAAK4E,EAAOI,GAEhC7G,EAAOyG,EAAOJ,EAEdD,EAAOvD,WAAWiE,aAAcL,GAEhCvG,EAAMM,cAAe7F,IAErBuF,EAAMM,cAAe1F,KAlCV,GAwCTiM,EAAY,WAEhB,IAAMN,EAAS,IAAIC,SAAO,EAAG,EAAG,EAAG,OAEnC,OAAO,SAAsB9B,GAE3B,IAAMwB,EAASlG,EAAMlF,OAErByL,EAAOE,kBAAmBP,EAAOvD,YAEjC4D,EAAOJ,GAAK,IAAOzB,EAEnBwB,EAAOvD,WAAWiE,aAAcL,GAEhCvG,EAAMM,cAAe7F,IAErBuF,EAAMM,cAAe1F,KAhBP,GAsBlB,SAASkM,EAAUC,GAEZ/G,EAAMlF,OAAOqK,oBAEhBpD,GAASgF,EAEC/G,EAAMlF,OAAO4K,sBAEvB1F,EAAMlF,OAAOkE,KAAO/C,KAAK0F,IAAK3B,EAAMnE,QAASI,KAAKyF,IAAK1B,EAAMlE,QAASkE,EAAMlF,OAAOkE,KAAO+H,IAC1F/G,EAAMlF,OAAOuF,yBACbkC,GAAc,IAIdtH,QAAQC,KAAM,uFACd8E,EAAMzD,YAAa,GAMvB,SAASyK,EAASD,GAEX/G,EAAMlF,OAAOqK,oBAEhBpD,GAASgF,EAEC/G,EAAMlF,OAAO4K,sBAEvB1F,EAAMlF,OAAOkE,KAAO/C,KAAK0F,IAAK3B,EAAMnE,QAASI,KAAKyF,IAAK1B,EAAMlE,QAASkE,EAAMlF,OAAOkE,KAAO+H,IAC1F/G,EAAMlF,OAAOuF,yBACbkC,GAAc,IAIdtH,QAAQC,KAAM,uFACd8E,EAAMzD,YAAa,GAUvB,SAAS0K,EAAuBC,GAE9B1D,EAAYlB,IAAK4E,EAAMC,QAASD,EAAME,SAUxC,SAASC,EAAoBH,GAE3BtD,EAAStB,IAAK4E,EAAMC,QAASD,EAAME,SAsIrC,SAASE,IAEP,GAAyB,IAApBpD,EAASmB,OAEZ7B,EAAYlB,IAAK4B,EAAU,GAAIqD,MAAOrD,EAAU,GAAIsD,WAE/C,CAEL,IAAMb,EAAI,IAAQzC,EAAU,GAAIqD,MAAQrD,EAAU,GAAIqD,OAChDE,EAAI,IAAQvD,EAAU,GAAIsD,MAAQtD,EAAU,GAAIsD,OAEtDhE,EAAYlB,IAAKqE,EAAGc,IAMxB,SAASC,IAEP,GAAyB,IAApBxD,EAASmB,OAEZzB,EAAStB,IAAK4B,EAAU,GAAIqD,MAAOrD,EAAU,GAAIsD,WAE5C,CAEL,IAAMb,EAAI,IAAQzC,EAAU,GAAIqD,MAAQrD,EAAU,GAAIqD,OAChDE,EAAI,IAAQvD,EAAU,GAAIsD,MAAQtD,EAAU,GAAIsD,OAEtD5D,EAAStB,IAAKqE,EAAGc,IAMrB,SAASE,IAEP,IAAMC,EAAK1D,EAAU,GAAIqD,MAAQrD,EAAU,GAAIqD,MACzCM,EAAK3D,EAAU,GAAIsD,MAAQtD,EAAU,GAAIsD,MAEzC9C,EAAWzI,KAAK6L,KAAMF,EAAKA,EAAKC,EAAKA,GAE3C9D,EAAWzB,IAAK,EAAGoC,GAoBrB,SAASqD,EAAuBb,GAE9B,GAAyB,IAApBhD,EAASmB,OAEZ3B,EAAUpB,IAAK4E,EAAMK,MAAOL,EAAMM,WAE7B,CAEL,IAAM1I,EAAWkJ,GAA0Bd,GAErCP,EAAI,IAAQO,EAAMK,MAAQzI,EAAS6H,GACnCc,EAAI,IAAQP,EAAMM,MAAQ1I,EAAS2I,GAEzC/D,EAAUpB,IAAKqE,EAAGc,GAIpB9D,EAAYsE,WAAYvE,EAAWF,GAAcnB,eAAgBrC,EAAMtD,aAEvE,IAAMwI,EAAUlF,EAAMjF,WAEtByG,EAAY,EAAIvF,KAAKC,GAAKyH,EAAYgD,EAAIzB,EAAQM,cAElDjB,EAAU,EAAItI,KAAKC,GAAKyH,EAAY8D,EAAIvC,EAAQM,cAEhDhC,EAAYrD,KAAMuD,GAIpB,SAASwE,EAAoBhB,GAE3B,GAAyB,IAApBhD,EAASmB,OAEZxB,EAAOvB,IAAK4E,EAAMK,MAAOL,EAAMM,WAE1B,CAEL,IAAM1I,EAAWkJ,GAA0Bd,GAErCP,EAAI,IAAQO,EAAMK,MAAQzI,EAAS6H,GACnCc,EAAI,IAAQP,EAAMM,MAAQ1I,EAAS2I,GAEzC5D,EAAOvB,IAAKqE,EAAGc,GAIjB3D,EAASmE,WAAYpE,EAAQD,GAAWvB,eAAgBrC,EAAMpD,UAE9DmI,EAAKjB,EAAS6C,EAAG7C,EAAS2D,GAE1B7D,EAASzD,KAAM0D,GAIjB,SAASsE,EAAsBjB,GAE7B,IAAMpI,EAAWkJ,GAA0Bd,GAErCU,EAAKV,EAAMK,MAAQzI,EAAS6H,EAC5BkB,EAAKX,EAAMM,MAAQ1I,EAAS2I,EAE5B/C,EAAWzI,KAAK6L,KAAMF,EAAKA,EAAKC,EAAKA,GAE3C7D,EAAS1B,IAAK,EAAGoC,GAEjBT,EAAW3B,IAAK,EAAGrG,KAAKoI,IAAKL,EAASyD,EAAI1D,EAAW0D,EAAGzH,EAAMxD,YAE9DsK,EAAU7C,EAAWwD,GAErB1D,EAAW5D,KAAM6D,GAwBnB,SAASlB,EAAeoE,IAEC,IAAlBlH,EAAMzE,UAEc,IAApB2I,EAASmB,SAEZrF,EAAMjF,WAAWqN,kBAAmBlB,EAAMmB,WAE1CrI,EAAMjF,WAAW4E,iBAAkB,cAAesD,GAClDjD,EAAMjF,WAAW4E,iBAAkB,YAAauD,IAqXpD,SAAqBgE,GAEnBhD,EAASoE,KAAMpB,GAjXfqB,CAAYrB,GAEe,UAAtBA,EAAMsB,YA2Nb,SAAuBtB,GAIrB,OAFAuB,GAAcvB,GAELhD,EAASmB,QAEhB,KAAK,EAEH,OAASrF,EAAM1B,QAAQC,KAErB,KAAKC,SAAMP,OAET,IAA4B,IAAvB+B,EAAMvD,aAAyB,OAEpC6K,IAEA9G,EAAQC,EAAM0C,aAEd,MAEF,KAAK3E,SAAMH,IAET,IAAyB,IAApB2B,EAAMrD,UAAsB,OAEjC+K,IAEAlH,EAAQC,EAAM2C,UAEd,MAEF,QAEE5C,EAAQC,EAAMC,KAIlB,MAEF,KAAK,EAEH,OAASV,EAAM1B,QAAQG,KAErB,KAAKD,SAAME,UAET,IAA0B,IAArBsB,EAAMzD,aAA4C,IAApByD,EAAMrD,UAAsB,OAnYlEqD,EAAMzD,YAAaoL,IAEnB3H,EAAMrD,WAAY+K,IAqYflH,EAAQC,EAAM4C,gBAEd,MAEF,KAAK7E,SAAMkK,aAET,IAA0B,IAArB1I,EAAMzD,aAA+C,IAAvByD,EAAMvD,aAAyB,OArYrEuD,EAAMzD,YAAaoL,IAEnB3H,EAAMvD,cAAe6K,IAuYlB9G,EAAQC,EAAM6C,mBAEd,MAEF,QAEE9C,EAAQC,EAAMC,KAIlB,MAEF,QAEEF,EAAQC,EAAMC,KAIbF,IAAUC,EAAMC,MAEnBV,EAAMM,cAAe3F,IAvSrBgO,CAAczB,GAmDlB,SAAsBA,GAEpB,IAAI0B,EAEJ,OAAS1B,EAAM2B,QAEb,KAAK,EAEHD,EAAc5I,EAAMlC,aAAaC,KACjC,MAEF,KAAK,EAEH6K,EAAc5I,EAAMlC,aAAaI,OACjC,MAEF,KAAK,EAEH0K,EAAc5I,EAAMlC,aAAaM,MACjC,MAEF,QAEEwK,GAAgB,EAIpB,OAASA,GAEP,KAAK5K,SAAMG,MAET,IAA0B,IAArB6B,EAAMzD,WAAuB,QA7YxC,SAA+B2K,GAE7BnD,EAAWzB,IAAK4E,EAAMC,QAASD,EAAME,SA6YjC0B,CAAsB5B,GAEtB1G,EAAQC,EAAMtC,MAEd,MAEF,KAAKH,SAAMC,OAGT,GAAG+B,EAAMlF,OAAO4K,qBAAsB,CAEpC,IAAwB,IAApB1F,EAAMrD,UAAqB,OAE/B0K,EAAmBH,GAEnB1G,EAAQC,EAAMpC,SAId,GAAI6I,EAAM6B,SAAW7B,EAAM8B,QAAS,CAElC,IAAwB,IAApBhJ,EAAMrD,UAAqB,OAE/B0K,EAAmBH,GAEnB1G,EAAQC,EAAMpC,QAET,CAEL,IAA2B,IAAvB2B,EAAMvD,aAAwB,OAElCwK,EAAsBC,GAEtB1G,EAAQC,EAAMxC,OAMlB,MAEF,KAAKD,SAAMK,IAET,GAAK6I,EAAM6B,SAAW7B,EAAM8B,QAAU,CAEpC,IAA4B,IAAvBhJ,EAAMvD,aAAyB,OAEpCwK,EAAuBC,GAEvB1G,EAAQC,EAAMxC,WAET,CAEL,IAAyB,IAApB+B,EAAMrD,UAAsB,OAEjC0K,EAAoBH,GAEpB1G,EAAQC,EAAMpC,IAIhB,MAEF,QAEEmC,EAAQC,EAAMC,KAIbF,IAAUC,EAAMC,MAEnBV,EAAMM,cAAe3F,IAvJrBsO,CAAa/B,IAMjB,SAASjE,EAAeiE,IAEC,IAAlBlH,EAAMzE,UAEgB,UAAtB2L,EAAMsB,YA+Rb,SAAsBtB,GAIpB,OAFAuB,GAAcvB,GAEL1G,GAEP,KAAKC,EAAM0C,aAET,IAA4B,IAAvBnD,EAAMvD,aAAyB,OAEpCsL,EAAuBb,GAEvBlH,EAAMO,SAEN,MAEF,KAAKE,EAAM2C,UAET,IAAyB,IAApBpD,EAAMrD,UAAsB,OAEjCuL,EAAoBhB,GAEpBlH,EAAMO,SAEN,MAEF,KAAKE,EAAM4C,gBAET,IAA0B,IAArBrD,EAAMzD,aAA4C,IAApByD,EAAMrD,UAAsB,QAhXrE,SAAkCuK,GAE3BlH,EAAMzD,YAAa4L,EAAsBjB,GAEzClH,EAAMrD,WAAYuL,EAAoBhB,GA8WvCgC,CAAyBhC,GAEzBlH,EAAMO,SAEN,MAEF,KAAKE,EAAM6C,mBAET,IAA0B,IAArBtD,EAAMzD,aAA+C,IAAvByD,EAAMvD,aAAyB,QAlXxE,SAAqCyK,GAE9BlH,EAAMzD,YAAa4L,EAAsBjB,GAEzClH,EAAMvD,cAAesL,EAAuBb,GAgX7CiC,CAA4BjC,GAE5BlH,EAAMO,SAEN,MAEF,QAEEC,EAAQC,EAAMC,MA7UhB0I,CAAalC,GAiJjB,SAAsBA,GAEpB,IAAuB,IAAlBlH,EAAMzE,QAAoB,OAE/B,OAASiF,GAEP,KAAKC,EAAMxC,OAET,IAA4B,IAAvB+B,EAAMvD,aAAyB,QAxd1C,SAAgCyK,GAE9BxD,EAAUpB,IAAK4E,EAAMC,QAASD,EAAME,SAEpCzD,EAAYsE,WAAYvE,EAAWF,GAAcnB,eAAgBrC,EAAMtD,aAEvE,IAAMwI,EAAUlF,EAAMjF,WAEtByG,EAAY,EAAIvF,KAAKC,GAAKyH,EAAYgD,EAAIzB,EAAQM,cAElDjB,EAAU,EAAItI,KAAKC,GAAKyH,EAAY8D,EAAIvC,EAAQM,cAEhDhC,EAAYrD,KAAMuD,GAElB1D,EAAMO,SA4cF8I,CAAuBnC,GAEvB,MAEF,KAAKzG,EAAMtC,MAET,IAA0B,IAArB6B,EAAMzD,WAAuB,QA9cxC,SAA+B2K,GAE7BlD,EAAS1B,IAAK4E,EAAMC,QAASD,EAAME,SAEnCnD,EAAWgE,WAAYjE,EAAUD,GAE5BE,EAAWwD,EAAI,EAElBX,EAAU1C,KAEAH,EAAWwD,EAAI,GAEzBT,EAAS5C,KAIXL,EAAW5D,KAAM6D,GAEjBhE,EAAMO,SA8bF+I,CAAsBpC,GAEtB,MAEF,KAAKzG,EAAMpC,IAET,IAAyB,IAApB2B,EAAMrD,UAAsB,QAhcvC,SAA6BuK,GAE3BrD,EAAOvB,IAAK4E,EAAMC,QAASD,EAAME,SAEjCtD,EAASmE,WAAYpE,EAAQD,GAAWvB,eAAgBrC,EAAMpD,UAE9DmI,EAAKjB,EAAS6C,EAAG7C,EAAS2D,GAE1B7D,EAASzD,KAAM0D,GAEf7D,EAAMO,SAwbFgJ,CAAoBrC,IAvKtBsC,CAAatC,IAMjB,SAAShE,EAAagE,GAEpBuC,GAAevC,GAEU,IAApBhD,EAASmB,SAEZrF,EAAMjF,WAAW2O,sBAAuBxC,EAAMmB,WAE9CrI,EAAMjF,WAAWkF,oBAAqB,cAAegD,GACrDjD,EAAMjF,WAAWkF,oBAAqB,YAAaiD,IAIrDlD,EAAMM,cAAe1F,IAErB4F,EAAQC,EAAMC,KAIhB,SAASqC,EAAiBmE,GAExBuC,GAAevC,GAoJjB,SAASlE,EAAckE,IAEE,IAAlBlH,EAAMzE,UAA0C,IAArByE,EAAMzD,YAAwBiE,IAAUC,EAAMC,OAE9EwG,EAAMyC,iBAEN3J,EAAMM,cAAe3F,IAlcvB,SAA2BuM,GAEpBA,EAAMjC,OAAS,EAElB+B,EAAS5C,KAEC8C,EAAMjC,OAAS,GAEzB6B,EAAU1C,KAIZpE,EAAMO,SAwbNqJ,CAAkB1C,GAElBlH,EAAMM,cAAe1F,KAIvB,SAASgF,EAAWsH,IAEK,IAAlBlH,EAAMzE,UAAyC,IAApByE,EAAMrD,WA5bxC,SAAwBuK,GAItB,OAASA,EAAM2C,MAEb,KAAK7J,EAAM7C,KAAKG,aACd8I,EAAYpG,EAAM/C,WAClB,MAEF,KAAK+C,EAAM7C,KAAKI,cACd6I,GAAapG,EAAM/C,WACnB,MAEF,KAAK+C,EAAM7C,KAAKK,QACdwI,EAAOhG,EAAM/C,WACb,MAEF,KAAK+C,EAAM7C,KAAKM,UACduI,GAAQhG,EAAM/C,WACd,MAEF,KAAK+C,EAAM7C,KAAKE,WACdgJ,EAAUrG,EAAM/C,WAChB,MAEF,KAAK+C,EAAM7C,KAAKC,UACdiJ,GAAWrG,EAAM/C,WACjB,MAEF,KAAK+C,EAAM7C,KAAKQ,UACd2I,EAAOtG,EAAM9C,WACb,MAEF,KAAK8C,EAAM7C,KAAKU,YACdyI,GAAQtG,EAAM9C,WACd,MAEF,KAAK8C,EAAM7C,KAAKO,YACdmJ,GAAY7G,EAAM9C,WAClB,MAEF,KAAK8C,EAAM7C,KAAKS,aACdiJ,EAAW7G,EAAM9C,YAmZrB4M,CAAe5C,GA8IjB,SAASrE,GAAeqE,IAEC,IAAlBlH,EAAMzE,SAEX2L,EAAMyC,iBAUR,SAASF,GAAevC,UAEf/C,EAAkB+C,EAAMmB,WAE/B,IAAM,IAAI0B,EAAI,EAAGA,EAAI7F,EAASmB,OAAQ0E,IAEpC,GAAK7F,EAAU6F,GAAI1B,YAAcnB,EAAMmB,UAGrC,YADAnE,EAAS8F,OAAQD,EAAG,GAS1B,SAAStB,GAAcvB,GAErB,IAAIpI,EAAWqF,EAAkB+C,EAAMmB,gBAErBrN,IAAb8D,IAEHA,EAAW,IAAI2E,WACfU,EAAkB+C,EAAMmB,WAAcvJ,GAIxCA,EAASwD,IAAK4E,EAAMK,MAAOL,EAAMM,OAInC,SAASQ,GAA0Bd,GAEjC,IAAM+C,EAAY/C,EAAMmB,YAAcnE,EAAU,GAAImE,UAAcnE,EAAU,GAAMA,EAAU,GAE5F,OAAOC,EAAkB8F,EAAQ5B,WA/1CH,OAq2ChCrI,EAAMjF,WAAW4E,iBAAkB,cAAekD,IAElD7C,EAAMjF,WAAW4E,iBAAkB,cAAemD,GAClD9C,EAAMjF,WAAW4E,iBAAkB,gBAAiBoD,GACpD/C,EAAMjF,WAAW4E,iBAAkB,QAASqD,EAAc,CAAEkH,SAAS,IAIrE,EAAK3J,SA72C2B,E,UAFN4J,oB,SChBxBC,G,oDAEJ,aAAiG,IAAD,EAAnFC,EAAmF,uDAAjE,EAAGC,EAA8D,uDAAtD,EAAGjF,EAAmD,uDAA1C,EAAGkF,EAAuC,uDAAvB,EAAGC,EAAoB,uDAAH,EAAG,sBAE9F,gBACK9P,KAAO,4BAEZ,EAAK+P,WAAa,CAChBC,gBAAiBL,EACjBC,MAAOA,EACPK,OAAQtF,EACRkF,cAAeA,EACfC,eAAgBA,GAGlB,IAAMxK,EAAK,gBACXuK,EAAgBtO,KAAK2O,MAAOL,GAC5BC,EAAiBvO,KAAK2O,MAAOJ,GAG7B,IAAMK,EAAU,GACVC,EAAW,GACXC,EAAU,GACVC,EAAM,GAGRC,EAAQ,EACNC,EAAa,GACbC,EAAa9F,EAAS,EACxB+F,EAAa,EAWjB,SAASC,IAWP,IATA,IAAMC,EAAS,IAAI7P,WACb8P,EAAS,IAAI9P,WACf+P,EAAa,EAEXC,EAAK,EAAIlB,EACT5I,EAAM2I,EAAMD,EAIR5C,EAAI,EAAGA,GAAK+C,EAAgB/C,IAAO,CAI3C,IAHA,IAAMiE,EAAW,GACXjH,EAAIgD,EAAI+C,EAEJ7D,EAAI,EAAGA,GAAK4D,EAAe5D,IAAO,CAC1C,IAAMgF,EAAShF,EAAI8E,EAXZ,GAYDG,EAAID,EAAIhK,EAEd4J,EAAO5E,EAAI0D,EAAkBuB,EAC7BL,EAAO9D,GAAMhD,EAAIY,EAAS8F,EAC1BI,EAAOpF,EAAIkE,EAAkBuB,EAAIA,EAAI,EACrCd,EAASxC,KAAMiD,EAAO5E,EAAG4E,EAAO9D,EAAG8D,EAAOpF,GAG1CmF,EAAOhJ,KAAM+H,EAAkBuB,EAAG,EAAGvB,GAAkBwB,YACvDd,EAAQzC,KAAMgD,EAAO3E,EAAG2E,EAAO7D,EAAG6D,EAAOnF,GAGzC6E,EAAI1C,KAAMqD,IAxBH,GAwBW,EAAIlH,GAGtBiH,EAASpD,KAAM2C,KAIjBC,EAAW5C,KAAMoD,GAKnB,IAAM,IAAI/E,EAAI,EAAGA,EAAI4D,EAAe5D,IAClC,IAAM,IAAIc,EAAI,EAAGA,EAAI+C,EAAgB/C,IAAO,CAE1C,IAAMqE,EAAIZ,EAAYzD,GAAKd,GACrBoF,EAAIb,EAAYzD,EAAI,GAAKd,GACzBqF,EAAId,EAAYzD,EAAI,GAAKd,EAAI,GAC7BsF,EAAIf,EAAYzD,GAAKd,EAAI,GAE/BkE,EAAQvC,KAAMwD,EAAGC,EAAGE,GACpBpB,EAAQvC,KAAMyD,EAAGC,EAAGC,GAEpBT,GAAc,EAKlBxL,EAAMkM,SAAUd,EAAYI,EAAY,GAGxCJ,GAAcI,EAlG8E,OA8B9FH,IAGA,EAAKc,SAAUtB,GACf,EAAKuB,aAAc,WAAY,IAAIC,0BAAwBvB,EAAU,IACrE,EAAKsB,aAAc,SAAU,IAAIC,0BAAwBtB,EAAS,IAClE,EAAKqB,aAAc,KAAM,IAAIC,0BAAwBrB,EAAK,IApCoC,E,kDAwGhG,SAAiBsB,GACf,OAAO,IAAIlC,EAA2BkC,EAAKjC,gBAAiBiC,EAAKhC,MAAOgC,EAAK3B,OAAQ2B,EAAK/B,cAAe+B,EAAK9B,oB,GA3G1E+B,mBCElCC,G,oDAEJ,aAA0F,IAAD,EAA5EnC,EAA4E,uDAA1D,EAAGoC,EAAuD,uDAA3C,EAAGC,EAAwC,uDAAvB,GAAIC,EAAmB,uDAAH,EAAG,sBAEvF,gBACKjS,KAAO,qBAEZ,EAAK+P,WAAa,CAChBC,gBAAiBL,EACjBoC,UAAWA,EACXC,eAAgBA,EAChBC,cAAeA,GAGjBD,EAAiBzQ,KAAK0F,IAAK,EAAG1F,KAAK2O,MAAO8B,IAC1CC,EAAgB1Q,KAAK0F,IAAK,EAAG1F,KAAK2O,MAAO+B,IAwBzC,IAtBA,IAkBIC,EAAKC,EAlBL5B,EAAQ,EACN6B,EAAO,GAEPvB,EAAS,IAAI9P,WACb6P,EAAS,IAAI7P,WACbsR,EAAW,IAAItR,WACfuR,EAAW,IAAIvR,WAIfoP,EAAU,GACVC,EAAW,GACXC,EAAU,GACVC,EAAM,GAENiC,EAAmB,EAAVhR,KAAKC,GACdgR,EAAOT,EAAcpC,EACrBxC,EAAK,EAAI8E,EAKLQ,EAAK,EAAGA,GAAMR,EAAeQ,IAAQ,CAa7C,IAXA,IAAMC,EAAc,GAEd3I,EAAI0I,EAAKtF,EACT+D,EAAInH,EAAIyI,EAQJG,EAAK,EAAGA,GAAMX,EAAgBW,IAAQ,CAE9C,IAAM1B,EAAI0B,EAAKX,EACfE,EAAM3Q,KAAK2Q,IAAKjB,EAAIsB,GACpBJ,EAAM5Q,KAAK4Q,IAAKlB,EAAIsB,GAGpB1B,EAAO5E,EAAI0D,EAAkBuC,EAAMhB,EACnCL,EAAO9D,EAAI4C,EAAkBwC,EAAMjB,EACnCL,EAAOpF,EAAIkE,EAAkBuB,EAAIA,EAAI,EACrCd,EAASxC,KAAMiD,EAAO5E,EAAG4E,EAAO9D,EAAG8D,EAAOpF,GAG1C4G,EAASzK,IAAI+H,EAAkBwC,GAAMxC,EAAkBuC,EAAKvC,EAAkBuB,GAAGC,YACjFmB,EAAS1K,IAAIsK,EAAKC,EAAK,GAGvBvB,EAAOxG,aAAaiI,EAAUC,GAC9BjC,EAAQzC,KAAMgD,EAAO3E,EAAG2E,EAAO7D,EAAG6D,EAAOnF,GAGzC6E,EAAI1C,KAAM,GAAM7D,EAAImI,EAAM,GAAK,GAAMnI,EAAIoI,EAAM,IAE/CO,EAAY9E,KAAM2C,KAIpB6B,EAAKxE,KAAM8E,GAKb,IAAM,IAAID,EAAK,EAAGA,EAAKR,EAAeQ,IACpC,IAAM,IAAIE,EAAK,EAAGA,EAAKX,EAAgBW,IAAQ,CAC7C,IAAMvB,EAAIgB,EAAMK,GAAME,EAAK,GACrBtB,EAAIe,EAAMK,GAAME,GAChBrB,EAAIc,EAAMK,EAAK,GAAKE,GACpBpB,EAAIa,EAAMK,EAAK,GAAKE,EAAK,GACnB,IAAPF,GAAUtC,EAAQvC,KAAMwD,EAAGC,EAAGE,GAC9BkB,IAAOR,EAAgB,EAC1B9B,EAAQvC,KAAMyD,EAAGC,EAAGC,GACVkB,IAAOR,EAAgB,IACjC9B,EAAQvC,KAAMwD,EAAGC,EAAGC,GACpBnB,EAAQvC,KAAMwD,EAAGE,EAAGC,IA7F6D,OAmGvF,EAAKE,SAAUtB,GACf,EAAKuB,aAAc,WAAY,IAAIC,0BAAwBvB,EAAU,IACrE,EAAKsB,aAAc,SAAU,IAAIC,0BAAwBtB,EAAS,IAClE,EAAKqB,aAAc,KAAM,IAAIC,0BAAwBrB,EAAK,IAtG6B,E,kDA0GzF,SAAiBsB,GACf,OAAO,IAAIE,EAAmBF,EAAKjC,gBAAiBiC,EAAKG,UAAWH,EAAKI,eAAgBJ,EAAKK,mB,GA7GjEJ,mB,UCA3Be,G,oDACJ,WAAYC,EAAQjJ,EAAOe,GAAS,IAAD,uBACjC,eAUA,IARA,IAAMyF,EAAW,GACXC,EAAU,GACVC,EAAM,GACNwC,EAAQ,IAAIhH,SAAM,EAAG,EAAGlC,GAIxBmJ,GAFa,IAAIC,MAAaC,cAAcJ,GAEzBE,MAChB1D,EAAI,EAAGA,EAAI0D,EAAMpI,OAAQ0E,IAAK,CACrC,IAAM6D,EAAOH,EAAM1D,GACf8D,EAAOD,EAAKC,KAChB,EAAG,CACD,IAAMC,EAAQD,EAAKE,OAAOD,MAC1BhD,EAASxC,KAAKwF,EAAMnH,EAAGmH,EAAMrG,EAAGqG,EAAM3H,GACtC4E,EAAQzC,KAAKsF,EAAKtC,OAAO3E,EAAGiH,EAAKtC,OAAO7D,EAAGmG,EAAKtC,OAAOnF,GAEvD,IAAM6H,EAAIF,EAAMlP,QAAQqP,WAAWT,GAE7BU,EAAKjS,KAAK6L,KAAKzC,EAASA,EAAS2I,EAAE7H,EAAI6H,EAAE7H,GACzCsB,EAAIuG,EAAEvG,EAAIyG,EAAK7I,EACrB2F,EAAI1C,KAAK0F,EAAErH,EAAGc,GAEdoG,EAAOA,EAAKM,WACLN,IAASD,EAAKC,MA1BQ,OA6BjC,EAAKzB,aAAa,WAAY,IAAIgC,0BAA6BtD,EAAU,IACzE,EAAKsB,aAAa,SAAU,IAAIgC,0BAA6BrD,EAAS,IACtE,EAAKqB,aAAa,KAAM,IAAIgC,0BAA6BpD,EAAK,IA/B7B,E,UADRoD,mBRK7BC,aAAO,CAAEC,kBACTD,aAAO,CAAExT,qBACTwT,aAAO,CAAEjE,+BACTiE,aAAO,CAAE7B,wBACT6B,aAAO,CAAEf,oB,SA4BGhV,K,cAAAA,E,qBAAAA,M,cA+BAjM,K,yBAAAA,E,mBAAAA,E,mBAAAA,E,mBAAAA,E,mBAAAA,E,oBAAAA,M,cASAC,K,wBAAAA,E,iBAAAA,E,iBAAAA,E,iBAAAA,E,iBAAAA,E,iBAAAA,E,iBAAAA,E,iBAAAA,E,iBAAAA,E,kBAAAA,M,cAoBAiM,O,aAAAA,I,6BAAAA,I,oBAAAA,M,cA0CAxpC,K,kBAAAA,E,wCAAAA,E,4CAAAA,E,0CAAAA,E,kCAAAA,E,wCAAAA,E,4BAAAA,E,gCAAAA,E,oCAAAA,E,sCAAAA,E,uCAAAA,M,cAcAypC,O,uBAAAA,I,+BAAAA,I,mCAAAA,I,4BAAAA,M,cAOAC,K,gDAAAA,E,uCAAAA,M,cAKAC,O,2CAAAA,I,6CAAAA,I,+CAAAA,I,iDAAAA,I,+BAAAA,I,kCAAAA,M,cASAC,O,yCAAAA,I,8DAAAA,M,cAKA7kB,O,mCAAAA,I,4BAAAA,M,cAKAG,O,qEAAAA,I,uEAAAA,I,kEAAAA,M,cAMA3D,O,iBAAAA,I,mBAAAA,I,oBAAAA,M,cAMAtX,O,aAAAA,I,aAAAA,I,iBAAAA,I,eAAAA,I,gBAAAA,M,cAoBA4/B,O,eAAAA,I,gBAAAA,M,cAKAC,O,2CAAAA,I,6CAAAA,I,iCAAAA,I,+BAAAA,I,iCAAAA,I,yDAAAA,I,uDAAAA,I,iCAAAA,I,+BAAAA,I,4DAAAA,I,0DAAAA,I,wDAAAA,I,sDAAAA,I,8DAAAA,I,4DAAAA,I,gDAAAA,I,8CAAAA,I,sDAAAA,I,oDAAAA,I,gDAAAA,I,+CAAAA,M,cAwBAhzB,K,kBAAAA,E,gBAAAA,E,YAAAA,E,gBAAAA,E,sBAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,eAAAA,M,cAYAizB,O,2BAAAA,I,8BAAAA,M,cAKAC,K,kBAAAA,E,6CAAAA,E,8CAAAA,E,uBAAAA,E,qBAAAA,E,0EAAAA,M,cASAC,K,UAAAA,E,gBAAAA,E,wBAAAA,E,YAAAA,E,gBAAAA,E,YAAAA,E,YAAAA,E,2BAAAA,E,uBAAAA,E,mBAAAA,E,2BAAAA,E,2BAAAA,E,gBAAAA,E,yBAAAA,E,2BAAAA,E,+BAAAA,E,mCAAAA,E,qCAAAA,E,sBAAAA,E,2BAAAA,E,gBAAAA,E,cAAAA,E,YAAAA,E,gBAAAA,E,kBAAAA,E,+BAAAA,E,cAAAA,E,aAAAA,M,cA+BAC,O,6BAAAA,I,iDAAAA,I,0BAAAA,M,cAMA3sB,O,eAAAA,I,yBAAAA,I,2BAAAA,I,gCAAAA,M,cAOA4sB,K,gBAAAA,E,YAAAA,E,gBAAAA,E,gBAAAA,E,2BAAAA,M,cAQAC,K,sBAAAA,E,0BAAAA,E,0BAAAA,E,wBAAAA,E,0BAAAA,E,sBAAAA,E,uBAAAA,M,cAUAC,K,qCAAAA,E,qCAAAA,E,uCAAAA,E,uCAAAA,E,4CAAAA,E,4CAAAA,E,8CAAAA,E,8CAAAA,E,4BAAAA,E,4BAAAA,E,0BAAAA,E,4BAAAA,E,wBAAAA,E,wBAAAA,E,0BAAAA,E,wDAAAA,E,0DAAAA,E,+DAAAA,E,kEAAAA,M,cAsBAC,K,4BAAAA,E,4BAAAA,E,2BAAAA,M,cAMAC,K,uBAAAA,E,+CAAAA,E,8CAAAA,M,cAMAC,K,wBAAAA,E,oBAAAA,E,gBAAAA,E,WAAAA,M,cAOAC,O,mCAAAA,I,iEAAAA,I,6EAAAA,I,+CAAAA,I,6CAAAA,I,+BAAAA,I,gEAAAA,M,cAUAliB,K,oBAAAA,E,uBAAAA,M,cAKAmiB,K,qBAAAA,E,yBAAAA,E,uBAAAA,E,kBAAAA,Q,cAOAC,K,kBAAAA,E,sCAAAA,E,qCAAAA,E,oCAAAA,E,mCAAAA,Q,cAQAngB,K,YAAAA,E,YAAAA,E,mBAAAA,Q,cAMAogB,K,cAAAA,E,2BAAAA,Q,cAKAC,K,cAAAA,E,cAAAA,E,kBAAAA,E,kBAAAA,E,UAAAA,E,mBAAAA,E,gBAAAA,E,oBAAAA,E,cAAAA,E,UAAAA,E,YAAAA,E,iBAAAA,Q,cAeAC,K,wBAAAA,E,kBAAAA,E,8BAAAA,E,8BAAAA,E,8BAAAA,E,8BAAAA,E,oBAAAA,E,cAAAA,E,sBAAAA,E,cAAAA,E,mBAAAA,E,gBAAAA,E,sBAAAA,E,qBAAAA,E,cAAAA,E,2BAAAA,E,8BAAAA,Q,cAoBAC,K,YAAAA,E,gBAAAA,E,eAAAA,Q,cAMAC,K,YAAAA,E,YAAAA,E,cAAAA,E,wBAAAA,E,YAAAA,E,kBAAAA,E,cAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,kBAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,gBAAAA,E,YAAAA,E,gBAAAA,E,YAAAA,E,YAAAA,E,cAAAA,E,cAAAA,E,oBAAAA,E,YAAAA,E,YAAAA,E,iBAAAA,Q,cAuCAC,K,+BAAAA,E,+BAAAA,E,+BAAAA,E,+BAAAA,E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","file":"static/js/main.c62f7be7.chunk.js","sourcesContent":["/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { i18n_en } from './en';\nimport { i18n_zh_cn } from './zh_cn';\nimport { i18n_zh_tw } from './zh_tw';\nimport { i18n_es } from './es';\nimport { i18n_tr } from './tr';\nimport { i18n_ua } from './ua';\n\ni18n\n // detect user language\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\n .use(LanguageDetector)\n // pass the i18n instance to react-i18next.\n .use(initReactI18next)\n // init i18next\n // for all options read: https://www.i18next.com/overview/configuration-options\n .init({\n debug: true,\n fallbackLng: 'en',\n interpolation: {\n escapeValue: false, // not needed for react as it escapes by default\n },\n resources: {\n en: i18n_en,\n zh_cn: i18n_zh_cn,\n zh_tw: i18n_zh_tw,\n es: i18n_es,\n tr: i18n_tr,\n ua: i18n_ua,\n },\n });\n\nexport default i18n;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_en = {\r\n translation: {\r\n name: {\r\n IFI: 'Institute for Future Intelligence',\r\n Aladdin: 'Aladdin',\r\n Tagline: 'Aladdin: Reimagining Design with Explainable AI — Institute for Future Intelligence',\r\n },\r\n\r\n cookie: {\r\n Statement: 'By clicking Accept, you agree to our use of cookies to improve your experience with Aladdin.',\r\n Accept: 'Accept',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: 'This product is brought to you by',\r\n TermsOfService: 'Terms of Service',\r\n PrivacyPolicy: 'Privacy Policy',\r\n Software: 'Software',\r\n Content: 'Content',\r\n Research: 'Research',\r\n Support: 'Support',\r\n Acknowledgment: 'Acknowledgment',\r\n FundingInformation:\r\n 'The National Science Foundation (NSF) generously provided funding for the research and development of this product through grants #2105695, #2131097, and #2301164. Any opinions, findings, and conclusions or recommendations expressed in this product, however, are those of the authors and do not necessarily reflect the views of NSF.',\r\n Contact: 'For more information, please contact Charles Xie (charles@intofuture.org).',\r\n Translators: 'Translators',\r\n },\r\n\r\n word: {\r\n LastUpdate: 'Last Update',\r\n Small: 'Small',\r\n Medium: 'Medium',\r\n Large: 'Large',\r\n Design: 'Design',\r\n Information: 'Information',\r\n Type: 'Type',\r\n Text: 'Text',\r\n FontSize: 'Font Size',\r\n FontColor: 'Font Color',\r\n Model: 'Model',\r\n Models: 'Models',\r\n Upload: 'Upload',\r\n ClickCount: 'Click Count',\r\n Share: 'Share',\r\n AlreadyLike: 'Already like',\r\n Like: 'Like',\r\n MustLogInToLike: 'Must log in to like',\r\n AllRightsReserved: 'All Rights Reserved',\r\n MeterAbbreviation: 'm',\r\n Version: 'Version',\r\n VersionInitial: 'V',\r\n Options: 'Options',\r\n Maximum: 'Maximum',\r\n Minimum: 'Minimum',\r\n MaximumNumber: 'Maximum Number',\r\n MinimumNumber: 'Minimum Number',\r\n MaximumValue: 'Maximum Value',\r\n MinimumValue: 'Minimum Value',\r\n Or: 'Or',\r\n None: 'None',\r\n High: 'High',\r\n Partial: 'Partial',\r\n Teacher: 'Teacher',\r\n Class: 'Class',\r\n Total: 'Total',\r\n Leaderboard: 'Leaderboard',\r\n Latest: 'Latest',\r\n Range: 'Range',\r\n SIUnit: 'SI Unit',\r\n USUnit: 'US Unit',\r\n ThermalTransmittance: 'Thermal Transmittance',\r\n ThermalResistance: 'Thermal Resistance',\r\n UValue: 'U-Value',\r\n RValue: 'R-Value',\r\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\r\n BuildingHVACSystem: 'Building HVAC System',\r\n ThermostatSetpoint: 'Thermostat Setpoint',\r\n TemperatureToleranceThreshold: 'Tolerance Threshold',\r\n TemperatureToleranceThresholdExplanation:\r\n 'Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.',\r\n Press: 'Press',\r\n Open: 'Open',\r\n Save: 'Save',\r\n SaveAsImage: 'Save as Image',\r\n SaveAsCsv: 'Save as CSV',\r\n Update: 'Update',\r\n Paste: 'Paste',\r\n Copy: 'Copy',\r\n Cut: 'Cut',\r\n Delete: 'Delete',\r\n Lock: 'Lock',\r\n Translucent: 'Translucent',\r\n Color: 'Color',\r\n Texture: 'Texture',\r\n Size: 'Size',\r\n Thickness: 'Thickness',\r\n Yes: 'Yes',\r\n No: 'No',\r\n OK: 'OK',\r\n Cancel: 'Cancel',\r\n Apply: 'Apply',\r\n Close: 'Close',\r\n ApplyTo: 'Apply to',\r\n Run: 'Run',\r\n Pause: 'Pause',\r\n Resume: 'Resume',\r\n Clear: 'Clear',\r\n Warning: 'Warning',\r\n Caution: 'Caution',\r\n Reminder: 'Reminder',\r\n Length: 'Length',\r\n Width: 'Width',\r\n Height: 'Height',\r\n Radius: 'Radius',\r\n Angle: 'Angle',\r\n Azimuth: 'Azimuth',\r\n Coordinates: 'Coordinates',\r\n Weather: 'Weather',\r\n Show: 'Show',\r\n Animate: 'Animate',\r\n Date: 'Date',\r\n Time: 'Time',\r\n Title: 'Title',\r\n Owner: 'Owner',\r\n Action: 'Action',\r\n Rename: 'Rename',\r\n Location: 'Location',\r\n Latitude: 'Latitude',\r\n Month: 'Month',\r\n Day: 'Day',\r\n Hour: 'Hour',\r\n Daylight: 'Daylight',\r\n Radiation: 'Radiation',\r\n Temperature: 'Temperature',\r\n kWh: 'kWh',\r\n dollar: 'dollar',\r\n MeterPerSecond: 'm/s',\r\n NorthInitial: 'N',\r\n SouthInitial: 'S',\r\n EastInitial: 'E',\r\n WestInitial: 'W',\r\n Fixed: 'Fixed',\r\n Elements: 'Elements',\r\n Energy: 'Energy',\r\n Unknown: 'Unknown',\r\n Label: 'Label',\r\n Description: 'Description',\r\n NoDescription: 'No description',\r\n MaximumCharacters: 'Maximum characters',\r\n Author: 'Author',\r\n Publisher: 'Publisher',\r\n Building: 'Building',\r\n ResidentialBuilding: 'Residential Building',\r\n CommercialBuilding: 'Commercial Building',\r\n SchoolBuilding: 'School Building',\r\n TouristAttraction: 'Tourist Attraction',\r\n UnderConstruction: 'Under Construction',\r\n Photovoltaic: 'Photovoltaic',\r\n Anonymous: 'Anonymous',\r\n Nickname: 'Nickname',\r\n Pin: 'Pin',\r\n Unpin: 'Unpin',\r\n },\r\n\r\n shared: {\r\n NoTexture: 'No Texture',\r\n FoundationElement: 'Foundation',\r\n CuboidElement: 'Cuboid',\r\n PolygonElement: 'Polygon',\r\n SensorElement: 'Sensor',\r\n SolarPanelElement: 'Solar Panel',\r\n WaterHeaterElement: 'Water Heater',\r\n ParabolicDishElement: 'Parabolic Dish',\r\n ParabolicTroughElement: 'Parabolic Trough',\r\n FresnelReflectorElement: 'Fresnel Reflector',\r\n HeliostatElement: 'Heliostat',\r\n WindTurbineElement: 'Wind Turbine',\r\n LightElement: 'Light',\r\n ElementLocked: 'Locked',\r\n ModelType: 'Model Type',\r\n OutputBreakdown: 'Breakdown',\r\n MoreResults: 'More Results',\r\n },\r\n\r\n message: {\r\n ModelNotFound: 'Model not found',\r\n CannotSignIn: 'Cannot sign in',\r\n CannotSignOut: 'Cannot sign out',\r\n YourAccountWasCreated: 'Your account was created.',\r\n CannotCreateAccount: 'Cannot create an account',\r\n YourAccountSettingsWereSaved: 'Your account settings were saved.',\r\n CannotSaveYourAccountSettings: 'Cannot save your account settings',\r\n CannotSaveYourFileToCloud: 'Cannot save your file to the cloud',\r\n CannotCreateNewProject: 'Cannot create a new project',\r\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\r\n CannotOpenYourProjects: 'Cannot open your projects',\r\n CannotOpenProject: 'Cannot open the project',\r\n CannotDeleteProject: 'Cannot delete the project',\r\n CannotRenameProject: 'Cannot rename the project',\r\n CannotAddDesignToProject: 'Cannot add this design to the project',\r\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\r\n DesignRemovedFromProject: 'The design was successfully removed from the project',\r\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\r\n CannotUpdateProject: 'Cannot update the project',\r\n CannotFetchProjectData: 'Cannot fetch project data',\r\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\r\n CloudFileNotFound: 'The cloud file was not found',\r\n CannotLoadModelsOnMap: 'Cannot load models on map',\r\n CannotLoadLeaderboard: 'Cannot load leaderboard',\r\n CannotPublishModelOnMap: 'Cannot publish model on map',\r\n CannotLikeModelFromMap: 'Cannot like model from map',\r\n CannotDeleteModelFromMap: 'Cannot delete model from map',\r\n ModelDeletedFromMap: 'Model is deleted from map',\r\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\r\n CannotOpenCloudFile: 'Cannot open the cloud file',\r\n CannotReadCloudFile: 'Cannot read the cloud file',\r\n CannotWriteCloudFile: 'Cannot write the cloud file',\r\n CloudFileCopied: 'Cloud file copied',\r\n CannotOpenCloudFolder: 'Cannot open your cloud folder',\r\n CannotDeleteCloudFile: 'Cannot delete the cloud file',\r\n CannotRenameCloudFile: 'Cannot rename the cloud file',\r\n DoYouWantToSaveChanges: 'Do you want to save changes?',\r\n NotApplicableToSelectedAction: 'Not Applicable to Selected Action',\r\n ThisElementIsLocked: 'This element is locked.',\r\n ThisCannotBeUndone: 'This cannot be undone.',\r\n AzimuthOfNorthIsZero: 'Azimuth of north is 0°',\r\n CounterclockwiseAzimuthIsPositive: 'Counter-clockwise is positive',\r\n MoveCancelledBecauseOfOverlap: 'Move cancelled because of overlap.',\r\n MoveOutsideBoundaryCancelled: 'Move outside the boundary cancelled.',\r\n RotationCancelledBecauseOfOverlap: 'Rotation cancelled because of overlap.',\r\n RotationOutsideBoundaryCancelled: 'Rotation outside the boundary cancelled.',\r\n ResizingCancelledBecauseOfOverlap: 'Resizing cancelled because of overlap.',\r\n ResizingOutsideBoundaryCancelled: 'Resizing outside the boundary cancelled.',\r\n CannotPasteOutsideBoundary: 'Cannot paste outside the boundary.',\r\n CannotPasteBecauseOfOverlap: 'Cannot paste because of overlap.',\r\n CannotMoveObjectTooFar: 'Cannot move object too far.',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\r\n 'Existing solar panels will be removed before applying the new layout.',\r\n DoYouWantToContinue: 'Do you want to continue?',\r\n SolarPanelsCannotIntersectWithGround: 'Solar panels cannot intersect with the ground.',\r\n SolarPanelsCannotOverlapWithOneAnother: 'Solar panels cannot overlap with one another.',\r\n ScreenshotSaved: 'A screenshot was saved.',\r\n CsvFileSaved: 'A CSV file was saved.',\r\n SimulationStarted: 'Simulation started.',\r\n SimulationCompleted: 'Simulation completed.',\r\n SimulationAborted: 'Simulation aborted.',\r\n SimulationPaused: 'Simulation paused.',\r\n CancelSimulation: 'Cancel simulation',\r\n PauseSimulation: 'Pause simulation',\r\n ResumeSimulation: 'Resume simulation',\r\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\r\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\r\n EvolutionStarted: 'Evolution started.',\r\n EvolutionCompleted: 'Evolution completed.',\r\n EvolutionAborted: 'Evolution aborted.',\r\n EvolutionPaused: 'Evolution paused.',\r\n EncounterEvolutionError: 'Encountered an evolution error.',\r\n CancelEvolution: 'Cancel evolution',\r\n PauseEvolution: 'Pause evolution',\r\n ResumeEvolution: 'Resume evolution',\r\n ConvergenceThresholdHasBeenReached: 'The convergence threshold has been reached.',\r\n MaximumNumberOfGenerationsHasBeenReached: 'The maximum number of generations has been reached.',\r\n MaximumNumberOfStepsHasBeenReached: 'The maximum number of steps has been reached.',\r\n ObjectiveFunctionTypeError:\r\n 'The current objective function is not supported by this operation. Please start from the menu.',\r\n WallsAreNotAtSameHeight: 'Walls are not at the same height.',\r\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\r\n WallsAreNotConnected: 'Walls are not connected.',\r\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\r\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\r\n BuildingRoofMissing: 'Building has a missing roof.',\r\n UnknownErrors: 'Unknown errors.',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: 'Analysis Options',\r\n option: {\r\n GridCellSize: 'Grid Cell Size',\r\n SamplingFrequency: 'Sampling Frequency',\r\n TimesPerHour: 'Times per Hour',\r\n DaysPerYear: 'Days per Year',\r\n },\r\n mainMenu: 'Main Menu',\r\n cloudMenu: 'Cloud Menu',\r\n projectSubMenu: 'Project',\r\n project: {\r\n CreateNewProject: 'Create New Project',\r\n OpenProject: 'Open Project',\r\n SaveProjectAs: 'Save Project As',\r\n YouMustLogInToCreateProject: 'You must log in to create a new project',\r\n YouMustLogInToOpenProject: 'You must log in to open a project',\r\n },\r\n fileSubMenu: 'File',\r\n file: {\r\n CreateNewFile: 'Create New File',\r\n OpenLocalFile: 'Open Local File',\r\n SaveAsLocalFile: 'Save as Local File',\r\n SavingAbortedMustHaveValidFileName: 'Saving aborted! You must have a valid file name',\r\n OpenCloudFile: 'Open Cloud File',\r\n SaveCloudFile: 'Save Cloud File',\r\n SaveAsCloudFile: 'Save as Cloud File',\r\n SavingAbortedMustHaveValidTitle: 'Saving aborted! You must have a valid title for a cloud file',\r\n ToSaveYourWorkPleaseSignIn: 'To save your work, please sign in.',\r\n TakeScreenshot: 'Take Screenshot',\r\n UseCloudFileName: 'Use Cloud File Name',\r\n PublishOnModelsMap: 'Publish on Models Map',\r\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\r\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\r\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\r\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\r\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\r\n },\r\n editSubMenu: 'Edit',\r\n edit: {\r\n Undo: 'Undo',\r\n Redo: 'Redo',\r\n },\r\n viewSubMenu: 'View',\r\n view: {\r\n NavigationView: 'Navigation View',\r\n TwoDimensionalView: '2D View',\r\n ResetView: 'Reset',\r\n ZoomIn: 'Zoom In',\r\n ZoomOut: 'Zoom Out',\r\n AutoRotate: 'Auto rotate',\r\n ShowShadow: 'Show Shadow',\r\n ShowSurfaceShininess: 'Show Surface Shininess',\r\n TranslucentFloatingWindows: 'Translucent Floating Windows',\r\n accessoriesSubMenu: 'Accessories',\r\n accessories: {\r\n SiteInformation: 'Site Information',\r\n DesignInformation: 'Design Information',\r\n Instruction: 'Instruction',\r\n StickyNote: 'Sticky Note',\r\n Note: 'Note',\r\n },\r\n },\r\n settingsSubMenu: 'Settings',\r\n settings: {\r\n WeatherData: 'Weather Data',\r\n DiurnalTemperature: 'Diurnal Temperature',\r\n Heliodon: 'Heliodon',\r\n SunAndTime: 'Sun & Time',\r\n },\r\n benchmarksSubMenu: 'Benchmarks',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: 'Solar Radiation Prediction vs. Measurement',\r\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\r\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\r\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\r\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\r\n },\r\n graph: {\r\n LineWidth: 'Line Width',\r\n SymbolSize: 'Symbol Size',\r\n BarCategoryGap: 'Bar Category Gap',\r\n ShowHorizontalGridLines: 'Show Horizontal Grid Lines',\r\n ShowVerticalGridLines: 'Show Vertical Grid Lines',\r\n },\r\n analysisSubMenu: 'Analysis',\r\n physicsSubMenu: 'Physics',\r\n physics: {\r\n DailySolarRadiationHeatmap: 'Daily Solar Radiation Heatmap',\r\n SolarRadiationHeatmapOptions: 'Solar Radiation Heatmap Options',\r\n SolarRadiationHeatmapGridCellSize: 'Solar Radiation Heatmap Grid Cell Size',\r\n SolarRadiationHeatmapMaxValue: 'Solar Radiation Heatmap Maximum Value',\r\n SolarRadiationHeatmapNoAnimation: 'No Animation for Static Model',\r\n ReflectionHeatmap: 'Reflection Heatmap',\r\n },\r\n sensorSubMenu: 'Sensor',\r\n sensor: {\r\n CollectDailyData: 'Collect Daily Data',\r\n CollectYearlyData: 'Collect Yearly Data',\r\n SensorSimulationNoAnimation: 'No Animation for Collecting Sensor Data',\r\n },\r\n buildingSubMenu: 'Building',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\r\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\r\n },\r\n solarPanelSubMenu: 'Solar Panel',\r\n solarPanel: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n AnalyzeVisibility: 'Analyze Visibility',\r\n PanelDiscretization: 'Panel Discretization',\r\n Exact: 'Exact',\r\n Approximate: 'Approximate',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n VisibilityGridCellSize: 'View Factor Grid Cell Size',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n VisibilityAnalysisOptions: 'Visibility Analysis Options',\r\n SolarPanelSimulationNoAnimation: 'No Animation for Solar Panel Simulation',\r\n },\r\n parabolicTroughSubMenu: 'Parabolic Trough',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n parabolicDishSubMenu: 'Parabolic Dish',\r\n parabolicDish: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n fresnelReflectorSubMenu: 'Fresnel Reflector',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n heliostatSubMenu: 'Heliostat',\r\n heliostat: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n solarUpdraftTowerSubMenu: 'Solar Updraft Tower',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n SolarUpdraftTowerSimulationNoAnimation: 'No Animation for Solar Updraft Tower Simulation',\r\n },\r\n\r\n tutorialsSubMenu: 'Tutorials',\r\n\r\n solarEnergyScienceSubMenu: 'Solar Science',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: 'Sun Angles Relative to an Observer on the Ground',\r\n InsolationAndClimate: 'Insolation and Climate',\r\n SolarRadiationToBox: 'Solar Radiation to a Box',\r\n },\r\n\r\n buildingScienceSubMenu: 'Building Science',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\r\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\r\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\r\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\r\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\r\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\r\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\r\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\r\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\r\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\r\n },\r\n\r\n buildingDesignSubMenu: 'Building Design',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: 'Cape Cod Style House with Shed Dormer',\r\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\r\n GableRoofVsHipRoof: 'Gable Roof vs. Hip Roof',\r\n ColonialVsSaltbox: 'Colonial vs. Saltbox',\r\n GambrelRoofVsMansardRoof: 'Gambrel Roof vs. Mansard Roof',\r\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\r\n DutchGableRoof: 'Dutch Gable Roof',\r\n GableAndValleyRoof: 'Gable and Valley Roof',\r\n ClerestoryRoof: 'Clerestory Roof',\r\n MonitorRoof: 'Monitor Roof',\r\n AFrameHouse: 'A-Frame House',\r\n HalfTimberedHouse: 'Half-Timbered House',\r\n AllBasicRoofTypes: 'All Basic Roof Types',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: 'Photovoltaic Solar Power',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: 'Effect of Tilt Angle of a Solar Panel',\r\n EffectOfAzimuthOfSolarPanel: 'Effect of Azimuth of a Solar Panel',\r\n SolarPanelTypes: 'Solar Panel Types',\r\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\r\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\r\n SolarTrackers: 'Solar Trackers',\r\n CoveringGroundWithSolarPanels: 'Why Just Covering the Ground with Solar Panels is not a Good Idea',\r\n InterRowSpacingOfSolarPanelArray: 'Effect of Inter-Row Spacing in a Solar Panel Array',\r\n EffectOfOrientationOfSolarPanels: 'Effect of Orientation of Solar Panels',\r\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: 'Concentrated Solar Power',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: 'Effect of Azimuth of a Parabolic Trough',\r\n EffectOfLatusRectumOfParabolicTrough: 'Effect of Latus Rectum of a Parabolic Trough',\r\n FocusSunlightWithParabolicDish: 'Focus Sunlight with a Parabolic Dish',\r\n LinearFresnelReflectors: 'Linear Fresnel Reflectors',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\r\n 'Effect of Absorber Pipe Height for Linear Fresnel Reflectors',\r\n EffectOfAzimuthOfLinearFresnelReflectors: 'Effect of Azimuth of Linear Fresnel Reflectors',\r\n LinearFresnelReflectorsWithTwoAbsorbers: 'Linear Fresnel Reflectors with Two Absorbers',\r\n CosineEfficiencyOfHeliostats: 'Cosine Efficiency of Heliostats',\r\n ShadowingAndBlockingOfHeliostats: 'Shadowing and Blocking of Heliostats',\r\n EffectSolarPowerTowerHeight: 'Effect of Solar Power Tower Height',\r\n SolarPowerTower: 'Solar Power Tower',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: 'Other Types of Solar Power',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: 'Solar Updraft Tower',\r\n },\r\n\r\n generativeDesignSubMenu: 'Generative Design',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\r\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\r\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\r\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\r\n },\r\n\r\n examplesSubMenu: 'Examples',\r\n\r\n solarEnergySubMenu: 'Solar Energy',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: 'Sun Beam and Heliodon',\r\n RooftopSolarPanels: 'Rooftop Solar Panels',\r\n NevadaSolarOneParabolicTroughArray: 'Nevada Solar One Parabolic Trough Array',\r\n TooeleParabolicDishArray: 'Tooele Parabolic Dish Array',\r\n PS10SolarPowerTower: 'PS10 Solar Power Tower',\r\n TucsonLinearFresnelReflectors: 'Tucson Linear Fresnel Reflectors',\r\n SolarCanopyFormFactors: 'Solar Canopy Form Factors',\r\n SolarCanopyOverBleachers: 'Solar Canopy Over Bleachers',\r\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\r\n SolarBusStop: 'Solar Bus Stop',\r\n SolarFacadeTesla: 'Tesla Solar Façade',\r\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\r\n Floatovoltaics: 'Floatovoltaics',\r\n Agrivoltaics: 'Agrivoltaics',\r\n VegetativeBuffer: 'Vegetative Buffer',\r\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\r\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\r\n SolarPanelsOverCanalBakersfieldCA: 'Hypothetical Solar Panels Over Canal in Bakersfield, CA',\r\n SolarNoiseBarrierLexingtonMA: 'Hypothetical Solar Noise Barrier in Lexington, MA',\r\n HSATSolarTrackersRaleighNC: 'Horizontal Single Axis Trackers (HSAT) in Raleigh, NC',\r\n AADATSolarTrackersLancasterCA: 'Azimuth–Altitude Dual Axis Trackers (AADAT) in Lancaster, CA',\r\n SolarUpdraftTowerInCity: 'Solar Updraft Tower in City',\r\n },\r\n\r\n builtEnvironmentSubMenu: 'Built Environment',\r\n residentialBuildingsSubMenu: 'Residential Buildings',\r\n residentialBuildingExamples: {\r\n ColonialHouse: 'Colonial House',\r\n DutchColonialHouse: 'Dutch Colonial House',\r\n TShapedHouse: 'T-Shaped House',\r\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\r\n Solarium: 'Solarium',\r\n Church1: 'Church 1',\r\n Cathedral1: 'Cathedral 1',\r\n Cathedral2: 'Cathedral 2',\r\n Mosque1: 'Mosque 1',\r\n AdobeTaosHouse: 'Adobe Taos House',\r\n RanchHouse: 'Ranch House',\r\n BonnetHouse: 'Bonnet House',\r\n BarnStyleHouse: 'Barn Style House',\r\n ModernHouse: 'Modern House',\r\n ButterflyRoofHouse: 'Butterfly Roof House',\r\n },\r\n commercialBuildingsSubMenu: 'Commercial Buildings',\r\n commercialBuildingExamples: {\r\n WhiteHouse: 'White House',\r\n BilimMersinTurkiye: 'BILIM, Mersin, Turkiye',\r\n SpanishStyleHotel: 'Spanish Style Hotel',\r\n ApartmentBuilding: 'Apartment Building',\r\n OfficeBuilding: 'Office Building',\r\n Hotel: 'Hotel',\r\n },\r\n buildingComplexesSubMenu: 'Building Complexes',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, VT',\r\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\r\n },\r\n urbanPlanningSubMenu: 'Urban Planning',\r\n urbanPlanningExamples: {\r\n Heatmap1: 'Heatmap',\r\n },\r\n otherBuildingsSubMenu: 'Other Buildings',\r\n otherBuildingExamples: {\r\n Greenhouse: 'Greenhouse',\r\n Pavilion: 'Pavilion in a Park',\r\n OctagonalPagoda: 'Octagonal Pagoda',\r\n OceanFront: 'Ocean Front',\r\n EgyptianPyramids: 'Egyptian Pyramids',\r\n MayanPyramid: 'Mayan Pyramid',\r\n SiOSePol: 'Si-o-se-pol',\r\n StackedCuboids: 'Stacked Cuboids',\r\n },\r\n\r\n artificialIntelligenceSubMenu: 'Artificial Intelligence',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: 'Optimizing the Tilt Angle of a Solar Panel Row',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Optimizing the Tilt Angles of Multiple Solar Panel Rows',\r\n SolarFarmGenerativeDesign: 'Solar Farm Generative Design',\r\n SolarFarmGenerativeDesignWithBlock: 'Solar Farm Generative Design in the Presence of a Block',\r\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Solar Farm Generative Design',\r\n },\r\n\r\n languageSubMenu: 'Language',\r\n publicSubMenu: 'Public',\r\n ModelsGallery: 'Models Gallery',\r\n ModelsMap: 'Models Map',\r\n AboutUs: 'About Us',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: 'Account Settings',\r\n PrivacyStatementTitle: 'User Privacy Protection Statement',\r\n PrivacyStatement:\r\n 'When you sign in, your Google ID is used to create and access your Aladdin account. Only a random alphanumeric string is stored in our database as a reference. No personally identifiable data such as your name or email is ever gathered. For more information, see our ',\r\n SignIn: 'Sign In',\r\n SignOut: 'Sign Out',\r\n IfYouAreAStudent: 'If you are a student',\r\n },\r\n\r\n skyMenu: {\r\n Axes: 'Axes',\r\n Theme: 'Theme',\r\n ThemeDefault: 'Default',\r\n ThemeDesert: 'Desert',\r\n ThemeDune: 'Dune',\r\n ThemeForest: 'Forest',\r\n ThemeGrassland: 'Grassland',\r\n ThemeHill: 'Hill',\r\n ThemeLake: 'Lake',\r\n ThemeMountain: 'Mountain',\r\n ThemeRural: 'Rural',\r\n SunlightAttenuationCoefficientInAir: 'Sunlight Attenuation Coefficient in Air',\r\n ConvectiveCoefficientOfAir: 'Convective Coefficient of Air',\r\n HighestTemperatureTimeInMinutes: 'Highest Temperature Time (Minutes)',\r\n SelectSunAnglesToShow: 'Select Sun Angles to Show',\r\n ShowAzimuthAngle: 'Show Azimuth Angle',\r\n ShowElevationAngle: 'Show Elevation Angle',\r\n ShowZenithAngle: 'Show Zenith Angle',\r\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\r\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\r\n Vegetation: 'Vegetation',\r\n LeafOutDay: 'Leaf-Out Day',\r\n LeafOffDay: 'Leaf-Off Day',\r\n Albedo: 'Albedo',\r\n ImageOnGround: 'Image on Ground',\r\n WaterSurface: 'Water Surface',\r\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedPeople: 'Remove All Unlocked People',\r\n RemoveAllUnlockedFoundations: 'Remove All Unlocked Foundations',\r\n RemoveAllUnlockedCuboids: 'Remove All Unlocked Cuboids',\r\n DoYouReallyWantToRemoveAllPeople: 'Do you really want to remove all the people who are not locked',\r\n DoYouReallyWantToRemoveAllTrees: 'Do you really want to remove all the trees that are not locked',\r\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\r\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\r\n DoYouReallyWantToRemoveAllFoundations: 'Do you really want to remove all the foundations that are not locked',\r\n DoYouReallyWantToRemoveAllCuboids: 'Do you really want to remove all the cuboids that are not locked',\r\n LockAllElements: 'Lock All Elements',\r\n UnlockAllElements: 'Unlock All Elements',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: 'Label',\r\n LabelText: 'Label Text',\r\n LabelHeight: 'Label Height',\r\n LabelSize: 'Label Size',\r\n LabelFontSize: 'Font Size',\r\n LabelColor: 'Label Color',\r\n KeepShowingLabel: 'Keep Showing Label',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedParabolicTroughs: 'Remove All Unlocked Parabolic Troughs',\r\n RemoveAllUnlockedParabolicDishes: 'Remove All Unlocked Parabolic Dishes',\r\n RemoveAllUnlockedFresnelReflectors: 'Remove All Unlocked Fresnel Reflectors',\r\n RemoveAllUnlockedHeliostats: 'Remove All Unlocked Heliostats',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n RemoveAllUnlockedWalls: 'Remove All Unlocked Walls',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\r\n RemoveAllUnlockedHumans: 'Remove All Unlocked Humans',\r\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Racks',\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n SolarPanels: 'Solar Panels',\r\n SolarPanelArray: 'Solar Panel Array',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\r\n 'Do you really want to remove all the solar panels on this foundation that are not locked',\r\n ParabolicTroughs: 'Parabolic Troughs',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\r\n 'Do you really want to remove all the parabolic troughs on this foundation that are not locked',\r\n ParabolicDishes: 'Parabolic Dishes',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\r\n 'Do you really want to remove all the parabolic dishes on this foundation that are not locked',\r\n FresnelReflectors: 'Fresnel Reflectors',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\r\n 'Do you really want to remove all the Fresnel reflectors on this foundation that are not locked',\r\n Heliostats: 'Heliostats',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\r\n 'Do you really want to remove all the heliostats on this foundation that are not locked',\r\n Sensors: 'Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\r\n 'Do you really want to remove all the sensors on this foundation that are not locked',\r\n Lights: 'Lights',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation:\r\n 'Do you really want to remove all the lights on this foundation that are not locked',\r\n Walls: 'Walls',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation:\r\n 'Do you really want to remove all the walls on this foundation that are not locked',\r\n Windows: 'Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\r\n 'Do you really want to remove all the windows on this foundation that are not locked',\r\n Doors: 'Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\r\n 'Do you really want to remove all the doors on this foundation that are not locked',\r\n Polygons: 'Polygons',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\r\n 'Do you really want to remove all the polygons on this foundation that are not locked',\r\n Humans: 'Humans',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation:\r\n 'Do you really want to remove all the humans on this foundation who are not locked',\r\n Trees: 'Trees',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation:\r\n 'Do you really want to remove all the trees on this foundation that are not locked',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\r\n 'Do you really want to remove all the flowers on this foundation that are not locked',\r\n OnlyThisFoundation: 'Only This Foundation',\r\n AllConnectedFoundations: 'All Connected Foundations',\r\n AllSelectedFoundations: 'All Selected Foundations',\r\n AllFoundations: 'All Foundations',\r\n AddPolygon: 'Add Polygon',\r\n SolarStructure: 'Solar Structure',\r\n GroupMaster: 'Group Master',\r\n LockAllElementsOnThisFoundation: 'Lock All Elements on This Foundation',\r\n UnlockAllElementsOnThisFoundation: 'Unlock All Elements on This Foundation',\r\n GroundFloorRValue: 'Ground Floor R-Value',\r\n OnlyThisGroundFloor: 'Only This Ground Floor',\r\n AllGroundFloors: 'All Ground Floors',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: 'Receiver Tower for Heliostats',\r\n ReceiverTowerPhysicalProperties: 'Physical Properties of Receiver Tower',\r\n ReceiverTowerHeight: 'Height of Receiver Tower',\r\n ReceiverTowerRadius: 'Radius of Receiver Tower',\r\n ReceiverAbsorptance: 'Absorptance of Receiver',\r\n ReceiverOpticalEfficiency: 'Optical Efficiency of Receiver',\r\n ReceiverThermalEfficiency: 'Thermal Efficiency of Receiver',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: 'Absorber Pipe for Fresnel Reflectors',\r\n AbsorberPipePhysicalProperties: 'Physical Properties of Absorber Pipe',\r\n AbsorberHeight: 'Height of Absorber Pipe',\r\n AbsorberApertureWidth: 'Aperture Width of Absorber Pipe',\r\n AbsorberPipePoleNumber: 'Pole Number for Absorber Pipe',\r\n AbsorberAbsorptance: 'Absorptance of Absorber',\r\n AbsorberOpticalEfficiency: 'Optical Efficiency of Absorber',\r\n AbsorberThermalEfficiency: 'Thermal Efficiency of Absorber',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: 'Solar Updraft Tower',\r\n SolarUpdraftTowerPhysicalProperties: 'Physical Properties of Solar Updraft Tower',\r\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Tower Chimney Height',\r\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Tower Chimney Radius',\r\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Tower Collector Height',\r\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Tower Collector Radius',\r\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Tower Collector Transmissivity',\r\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Tower Collector Emissivity',\r\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Tower Discharge Coefficient',\r\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Tower Turbine Efficiency',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\r\n RemoveAllUnlockedHumans: 'Remove All Unlocked Humans',\r\n RemoveAllUnlockedTrees: 'Remove All Unlocked Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Racks',\r\n SolarPanels: 'Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\r\n 'Do you really want to remove all the solar panels on this cuboid that are not locked',\r\n Sensors: 'Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\r\n 'Do you really want to remove all the sensors on this cuboid that are not locked',\r\n Polygons: 'Polygons',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\r\n 'Do you really want to remove all the polygons on this cuboid that are not locked',\r\n Humans: 'Humans',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid:\r\n 'Do you really want to remove all the humans on this cuboid who are not locked',\r\n Trees: 'Trees',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid:\r\n 'Do you really want to remove all the trees on this cuboid that are not locked',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\r\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\r\n OnlyThisCuboid: 'Only This Cuboid',\r\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\r\n AllCuboidsAboveSameBase: 'All Cuboids Above Same Base',\r\n AllSelectedCuboids: 'All Selected Cuboids',\r\n AllCuboids: 'All Cuboids',\r\n OnlyThisSide: 'Only This Side',\r\n AllSidesOfThisCuboid: 'All Sides of This Cuboid',\r\n AllSidesOfSelectedCuboids: 'All Sides of Selected Cuboids',\r\n AllSidesOfAllCuboids: 'All Sides of All Cuboids',\r\n AddPolygon: 'Add Polygon',\r\n Stackable: 'Stackable',\r\n GroupMaster: 'Group Master',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n TextBox: 'Text Box',\r\n FontOutlineColor: 'Font Outline Color',\r\n FontOutlineWidth: 'Font Outline Width',\r\n FontStrokeColor: 'Font Stroke Color',\r\n FontStrokeWidth: 'Font Stroke Width',\r\n NoOutline: 'No Outline',\r\n Shiny: 'Shiny',\r\n Filled: 'Filled',\r\n FillTexture: 'Fill Texture',\r\n FillColor: 'Fill Color',\r\n Opacity: 'Opacity',\r\n LineColor: 'Line Color',\r\n LineWidth: 'Line Width',\r\n LineStyle: 'Line Style',\r\n SolidLine: 'Solid Line',\r\n DashedLine: 'Dashed Line',\r\n DottedLine: 'Dotted Line',\r\n InsertVertexBeforeIndex: 'Insert Vertex Before Index',\r\n InsertVertexAfterIndex: 'Insert Vertex After Index',\r\n DeleteVertex: 'Delete Vertex',\r\n OnlyThisPolygon: 'Only This Polygon',\r\n AllPolygonsOnSurface: 'All Polygons on the Same Surface',\r\n AllPolygonsAboveFoundation: 'All Polygons Above Foundation',\r\n AllSelectedPolygons: 'All Selected Polygons',\r\n AllPolygons: 'All Polygons',\r\n Layout: 'Layout',\r\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\r\n SolarPanelArrayLayoutParametricDesign: 'Solar Panel Array Layout: Parametric Design',\r\n SolarPanelArrayLayoutGenerativeDesign: 'Solar Panel Array Layout: Generative Design',\r\n SolarPanelArrayModel: 'Solar Panel Model',\r\n SolarPanelArrayOrientation: 'Orientation',\r\n SolarPanelArrayTiltAngle: 'Tilt Angle',\r\n SolarPanelArrayRowWidth: 'Row Width',\r\n SolarPanelArrayInterRowSpacing: 'Inter-Row Spacing',\r\n SolarPanelArrayRowSpacing: 'Row Spacing',\r\n SolarPanelArrayRowAxis: 'Row Axis',\r\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\r\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\r\n SolarPanelArrayEastWestRowAxis: 'East-West (Absolute)',\r\n SolarPanelArrayNorthSouthRowAxis: 'North-South (Absolute)',\r\n SolarPanelArrayMargin: 'Margin',\r\n SolarPanelArrayPoleHeight: 'Pole Height',\r\n SolarPanelArrayPoleSpacing: 'Pole Spacing',\r\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\r\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\r\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\r\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\r\n SolarPanelArrayYearlyProfit: 'Profit',\r\n LayoutNotAcceptedCheckYourParameters: 'This layout is not accepted. Please check your parameters.',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: 'Optimization',\r\n Parameters: 'Parameters',\r\n Variables: 'Variables',\r\n Constants: 'Constants',\r\n GeneticAlgorithm: 'Genetic Algorithm',\r\n GeneticAlgorithmSettings: 'Genetic Algorithm Settings',\r\n ParticleSwarmOptimization: 'Particle Swarm Optimization',\r\n ParticleSwarmOptimizationSettings: 'Particle Swarm Optimization Settings',\r\n SolarPanelTiltAngleOptimization: 'Solar Panel Tilt Angle Optimization',\r\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\r\n Generation: 'Generation',\r\n Gene: 'Gene',\r\n NormalizedVariables: 'Normalized Variables',\r\n Objective: 'Objective',\r\n ObjectiveFunctionDailyTotalYield: 'Daily Total Yield',\r\n ObjectiveFunctionYearlyTotalYield: 'Yearly Total Yield',\r\n ObjectiveFunctionDailyMeanYield: 'Daily Mean Yield',\r\n ObjectiveFunctionYearlyMeanYield: 'Yearly Mean Yield',\r\n ObjectiveFunctionDailyProfit: 'Daily Profit',\r\n ObjectiveFunctionYearlyProfit: 'Yearly Profit',\r\n GeneticAlgorithmSelectionMethod: 'Genetic Algorithm Selection Method',\r\n RouletteWheel: 'Roulette Wheel',\r\n Tournament: 'Tournament',\r\n SearchMethod: 'Search Method',\r\n GlobalSearchUniformSelection: 'Global Search Uniform Selection',\r\n LocalSearchRandomOptimization: 'Local Search Random Optimization',\r\n PopulationSize: 'Population Size',\r\n MaximumGenerations: 'Maximum Generations',\r\n SelectionRate: 'Selection Rate',\r\n CrossoverRate: 'Crossover Rate',\r\n MutationRate: 'Mutation Rate',\r\n Step: 'Step',\r\n SwarmSize: 'Swarm Size',\r\n MaximumSteps: 'Maximum Steps',\r\n MaximumVelocity: 'Maximum Velocity',\r\n InertiaWeight: 'Inertia Weight',\r\n CognitiveCoefficient: 'Cognitive Coefficient',\r\n SocialCoefficient: 'Social Coefficient',\r\n ConvergenceThreshold: 'Convergence Threshold for Termination',\r\n LocalSearchRadius: 'Local Search Radius',\r\n RowsPerRackRange: 'Range for Rows per Rack',\r\n TiltAngleRange: 'Range for Tilt Angle',\r\n InterRowSpacingRange: 'Range for Inter-Row Spacing',\r\n ClickTargetPolygonToActivate: 'Click Target Polygon to Activate',\r\n ClickTargetFoundationToActivate: 'Click Target Foundation to Activate',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: 'Show Model',\r\n Flip: 'Flip',\r\n Type: 'Type',\r\n Spread: 'Spread',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: 'Flip',\r\n Type: 'Type',\r\n Spread: 'Spread',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: 'Change Person',\r\n Flip: 'Flip',\r\n Observer: 'Observer',\r\n ViewFromThisPerson: 'View from This Person',\r\n },\r\n\r\n lightMenu: {\r\n Color: 'Color',\r\n Intensity: 'Intensity',\r\n Decay: 'Decay',\r\n MaximumDistance: 'Distance',\r\n Inside: 'Inside',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: 'Relative Azimuth',\r\n Pole: 'Pole',\r\n PoleHeight: 'Pole Height',\r\n PoleRadius: 'Pole Radius',\r\n ExtraPoleHeight: 'Extra Pole Height',\r\n ExtraPoleHeightInAdditionToHalfWidth: 'Extra Pole Height in Addition to Half Width',\r\n DrawSunBeam: 'Draw Sun Beam',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: 'Reflector Reflectance',\r\n ReceiverAbsorptance: 'Receiver Absorptance',\r\n ReflectorOpticalEfficiency: 'Reflector Optical Efficiency',\r\n ReceiverThermalEfficiency: 'Receiver Thermal Efficiency',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: 'Inverter Efficiency',\r\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\r\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\r\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\r\n ChangePvModel: 'Change PV Model',\r\n Orientation: 'Orientation',\r\n Portrait: 'Portrait',\r\n Landscape: 'Landscape',\r\n FrameColor: 'Frame Color',\r\n Panels: 'panels',\r\n PanelsWide: 'panels wide',\r\n PanelsLong: 'panels long',\r\n TiltAngle: 'Tilt Angle',\r\n SouthFacingIsPositive: 'South facing is positive',\r\n Tracker: 'Tracker',\r\n SolarTrackerFollowsSun: 'A tracker follows the sun to increase solar panel outputs.',\r\n PoleSpacing: 'Pole Spacing',\r\n NoTracker: 'No Tracker',\r\n HorizontalSingleAxisTracker: 'Horizontal Single Axis Tracker',\r\n VerticalSingleAxisTracker: 'Vertical Single Axis Tracker',\r\n AltazimuthDualAxisTracker: 'Altazimuth Dual Axis Tracker',\r\n OnlyThisSolarPanel: 'Only This Solar Panel',\r\n AllSolarPanelsOnSurface: 'All Solar Panels on the Same Surface',\r\n AllSolarPanelsAboveFoundation: 'All Solar Panels Above the Same Foundation',\r\n AllSelectedSolarPanels: 'All Selected Solar Panels',\r\n AllSolarPanels: 'All Solar Panels',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: 'Solar Panel Specs',\r\n Model: 'Model',\r\n PanelSize: 'Panel Size',\r\n Cells: 'Cells',\r\n CellType: 'Cell Type',\r\n Monocrystalline: 'Monocrystalline',\r\n Polycrystalline: 'Polycrystalline',\r\n ThinFilm: 'Thin Film',\r\n Bifacial: 'Bifacial',\r\n BifacialityFactor: 'Bifaciality Factor',\r\n Black: 'Black',\r\n Blue: 'Blue',\r\n ShadeTolerance: 'Shade Tolerance',\r\n SolarCellEfficiency: 'Solar Cell Efficiency',\r\n NominalOperatingCellTemperature: 'Nominal Operating Cell Temperature',\r\n TemperatureCoefficientOfPmax: 'Temperature Coefficient of Pmax',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: 'Module Length',\r\n Modules: 'modules',\r\n ModulesLong: 'modules long',\r\n LatusRectum: 'Latus Rectum',\r\n OnlyThisParabolicTrough: 'Only This Parabolic Trough',\r\n AllParabolicTroughsAboveFoundation: 'All Parabolic Troughs Above the Same Foundation',\r\n AllSelectedParabolicTroughs: 'All Selected Parabolic Troughs',\r\n AllParabolicTroughs: 'All Parabolic Troughs',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: 'Absorber Pipe',\r\n SelectAbsorberToReflectSunlightTo: 'Select Absorber to Reflect Sunlight to',\r\n ModuleLength: 'Module Length',\r\n Modules: 'modules',\r\n ModulesLong: 'modules long',\r\n OnlyThisFresnelReflector: 'Only This Fresnel Reflector',\r\n AllFresnelReflectorsAboveFoundation: 'All Fresnel Reflectors Above the Same Foundation',\r\n AllSelectedFresnelReflectors: 'All Selected Fresnel Reflectors',\r\n AllFresnelReflectors: 'All Fresnel Reflectors',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: 'Tower',\r\n SelectTowerToReflectSunlightTo: 'Select Tower to Reflect Sunlight to',\r\n OnlyThisHeliostat: 'Only This Heliostat',\r\n AllHeliostatsAboveFoundation: 'All Heliostats Above the Same Foundation',\r\n AllSelectedHeliostats: 'All Selected Heliostats',\r\n AllHeliostats: 'All Heliostats',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: 'Receiver Structure',\r\n CentralPole: 'Central Pole',\r\n CentralPoleWithTripod: 'Central Pole with Tripod',\r\n Quadrupod: 'Quadrupod',\r\n RimDiameter: 'Rim Diameter',\r\n LatusRectum: 'Latus Rectum',\r\n ExtraPoleHeightInAdditionToRadius: 'Extra Pole Height in Addition to Radius',\r\n OnlyThisParabolicDish: 'Only This Parabolic Dish',\r\n AllParabolicDishesAboveFoundation: 'All Parabolic Dishes Above the Same Foundation',\r\n AllSelectedParabolicDishes: 'All Selected Parabolic Dishes',\r\n AllParabolicDishes: 'All Parabolic Dishes',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: 'Default',\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n SizeOfWall: 'Size of Wall',\r\n OnlyThisWall: 'Only This Wall',\r\n AllConnectedWalls: 'All Connected Walls',\r\n AllWallsAboveFoundation: 'All Walls Above the Same Foundation',\r\n AllSelectedWalls: 'All Selected Walls',\r\n AllWalls: 'All Walls',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Do you really want to remove all the windows on this wall',\r\n Doors: 'Doors',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Do you really want to remove all the doors on this wall',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Do you really want to remove all the solar panels on this wall',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\r\n LockAllPolygons: 'Lock All Polygons',\r\n UnlockAllPolygons: 'Unlock All Polygons',\r\n RemoveAllUnlockedPolygons: 'Remove All Unlocked Polygons',\r\n WallStructure: 'Wall Structure',\r\n DefaultStructure: 'Default',\r\n StudStructure: 'Stud',\r\n PillarStructure: 'Pillar',\r\n Opacity: 'Opacity',\r\n StructureSpacing: 'Structure Spacing',\r\n StructureWidth: 'Structure Width',\r\n StructureThickness: 'Structure Thickness',\r\n StructureColor: 'Structure Color',\r\n Color: 'Wall Color',\r\n Height: 'Height',\r\n Thickness: 'Thickness',\r\n Texture: 'Texture',\r\n AllLightsOnWallInside: 'All Lights on Wall Inside',\r\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\r\n Fill: 'Fill',\r\n Full: 'Full',\r\n Partial: 'Partial',\r\n Empty: 'Empty',\r\n OpenToOutside: 'Open to Outside',\r\n EavesLength: 'Eaves Overhang Length',\r\n Parapet: 'Parapet',\r\n ParapetColor: 'Parapet Color',\r\n ParapetTexture: 'Parapet Texture',\r\n ParapetHeight: 'Parapet Height',\r\n CopingsHeight: 'Copings Height',\r\n CopingsWidth: 'Copings Width',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: 'Only This Window',\r\n AllWindowsOnSurface: 'All Windows on the Same Surface',\r\n AllWindowsAboveFoundation: 'All Windows Above the Same Foundation',\r\n AllSelectedWindows: 'All Selected Windows',\r\n AllWindows: 'All Windows',\r\n Width: 'Width',\r\n Height: 'Height',\r\n Setback: 'Setback from Exterior Surface',\r\n RelativeToWallThickness: 'Relative to wall thickness',\r\n Mullion: 'Mullion',\r\n HorizontalMullion: 'Horizontal Mullion',\r\n VerticalMullion: 'Vertical Mullion',\r\n MullionWidth: 'Mullion Width',\r\n HorizontalMullionSpacing: 'Horizontal Mullion Spacing',\r\n VerticalMullionSpacing: 'Vertical Mullion Spacing',\r\n MullionColor: 'Mullion Color',\r\n Tint: 'Tint',\r\n Opacity: 'Opacity',\r\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\r\n Shutter: 'Shutter',\r\n LeftShutter: 'Left Shutter',\r\n RightShutter: 'Right Shutter',\r\n BothShutters: 'Both Shutters',\r\n ShutterWidth: 'Relative Width',\r\n ShutterColor: 'Shutter Color',\r\n Frame: 'Frame',\r\n FrameWidth: 'Frame Width',\r\n SillWidth: 'Sill Width',\r\n Color: 'Frame Color',\r\n WindowType: 'Window Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Polygonal: 'Polygonal',\r\n Interior: 'Interior',\r\n Empty: 'Empty',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: 'Default',\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n OnlyThisRoof: 'Only This Roof',\r\n AllRoofsAboveFoundation: 'All Roofs Above the Same Foundation',\r\n AllSelectedRoofs: 'All Selected Roofs',\r\n AllRoofs: 'All Roofs',\r\n OnlyThisCeiling: 'Only This Ceiling',\r\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\r\n AllCeilings: 'All Ceilings',\r\n EavesOverhangLength: 'Eaves Overhang Length',\r\n RafterSpacing: 'Rafter Spacing',\r\n RafterWidth: 'Rafter Width',\r\n RafterThickness: 'Rafter Thickness',\r\n RafterColor: 'Rafter Color',\r\n RoofColor: 'Roof Color',\r\n RoofSideColor: 'Roof Side Color',\r\n GlassTint: 'Glass Tint',\r\n Opacity: 'Opacity',\r\n RoofStructure: 'Roof Structure',\r\n DefaultStructure: 'Default',\r\n RafterStructure: 'Rafter',\r\n GlassStructure: 'Glass',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\r\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\r\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\r\n Rise: 'Rise',\r\n Ceiling: 'Ceiling',\r\n RoofRValue: 'Roof R-Value',\r\n CeilingRValue: 'Ceiling R-Value',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: 'Default',\r\n Texture01: 'Texture 1',\r\n Texture02: 'Texture 2',\r\n Texture03: 'Texture 3',\r\n Texture04: 'Texture 4',\r\n Texture05: 'Texture 5',\r\n Texture06: 'Texture 6',\r\n Texture07: 'Texture 7',\r\n Texture08: 'Texture 8',\r\n Texture09: 'Texture 9',\r\n Texture10: 'Texture 10',\r\n Texture11: 'Texture 11',\r\n Texture12: 'Texture 12',\r\n Texture13: 'Texture 13',\r\n Texture14: 'Texture 14',\r\n Texture15: 'Texture 15',\r\n Texture16: 'Texture 16',\r\n Texture17: 'Texture 17',\r\n OnlyThisDoor: 'Only This Door',\r\n AllDoorsOnWall: 'All Doors on the Same Wall',\r\n AllDoorsAboveFoundation: 'All Doors Above the Same Foundation',\r\n AllSelectedDoors: 'All Selected Doors',\r\n AllDoors: 'All Doors',\r\n DoorType: 'Door Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Filled: 'Filled',\r\n FrameColor: 'Frame Color',\r\n Interior: 'Interior',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: 'High',\r\n Low: 'Low',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: 'Number of selected heliostats',\r\n NumberOfSelectedSolarPanels: 'Number of selected solar panels',\r\n ElectricityGeneratedDailyBySolarPanels: 'Electricity generated daily by these solar panels',\r\n SceneDiameter: 'Scene diameter',\r\n BuildingArea: 'Building area',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: 'Color Contrast',\r\n FluxScale: 'Flux Scale',\r\n ClickUpOrDownArrowButtonsToChange: 'Click up or down arrow buttons to change',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: 'Rotate',\r\n DragMouse: 'Drag mouse',\r\n Zoom: 'Zoom',\r\n MouseWheelOrKeys: 'Rotate mouse wheel or press Ctrl+[ or Ctrl+]',\r\n MouseWheelOrKeysMac: 'Rotate mouse wheel or press ⌘+[ or ⌘+]',\r\n Pan: 'Pan',\r\n HoldCtrlDragMouse: 'Hold Ctrl and drag mouse',\r\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\r\n Enter2DMode: 'Enter 2D mode',\r\n Exit2DMode: 'Exit 2D mode',\r\n NavigationMode: 'Navigation mode',\r\n EnableNavigation: 'Enable navigation',\r\n DisableNavigation: 'Disable navigation',\r\n MoveForwardBack: 'Move forward/back',\r\n MoveForwardBackInstruction: 'Press W/S',\r\n MoveLeftRight: 'Move left/right',\r\n MoveLeftRightInstruction: 'Press A/D',\r\n MoveUpDown: 'Move up/down',\r\n MoveUpDownInstruction: 'Press Z/X',\r\n Turn: 'Turn',\r\n TurnInstruction: 'Press arrow keys',\r\n ResetView: 'Reset',\r\n AutoRotate: 'Auto rotate',\r\n StartOrStop: 'Press F4 to start or stop',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: 'Image on Ground',\r\n WeatherStations: 'Weather Stations',\r\n WeatherStationsNote: 'Turn this off to speed up',\r\n Coordinates: 'Coordinates',\r\n Zoom: 'Zoom',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: 'Solar Panel Visibility',\r\n Observer: 'Observer',\r\n VantagePoint: 'Vantage Point',\r\n ItemizedVisibilityByFields: 'Itemized by Fields',\r\n TotalVisibility: 'Total',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: 'Light Sensor',\r\n WeatherDataFrom: 'Weather Data from',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: 'Daily Building Energy',\r\n YearlyBuildingEnergy: 'Yearly Building Energy',\r\n Heater: 'Heater',\r\n AC: 'AC',\r\n SolarPanel: 'Solar Panel',\r\n Net: 'Net',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: 'Solar Panel Daily Yield',\r\n SolarPanelYearlyYield: 'Solar Panel Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualSolarPanels: 'Show outputs of individual solar panels',\r\n Profit: 'Profit',\r\n TotalCost: 'Total Cost',\r\n TotalRevenue: 'Total Revenue',\r\n TotalYield: 'Total Yield',\r\n MeanYield: 'Mean Yield',\r\n ModuleCount: 'Module Count',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: 'Parabolic Trough Daily Yield',\r\n ParabolicTroughYearlyYield: 'Parabolic Trough Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualParabolicTroughs: 'Show outputs of individual parabolic troughs',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: 'Parabolic Dish Daily Yield',\r\n ParabolicDishYearlyYield: 'Parabolic Dish Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualParabolicDishes: 'Show outputs of individual parabolic dishes',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: 'Fresnel Reflector Daily Yield',\r\n FresnelReflectorYearlyYield: 'Fresnel Reflector Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualFresnelReflectors: 'Show outputs of individual Fresnel feflectors',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: 'Heliostat Daily Yield',\r\n HeliostatYearlyYield: 'Heliostat Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualHeliostats: 'Show outputs of individual heliostats',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: 'Solar Updraft Tower Daily Yield',\r\n UpdraftTowerYearlyYield: 'Solar Updraft Tower Yearly Yield',\r\n ChimneyAirTemperature: 'Chimney Air Temperature',\r\n ChimneyWindSpeed: 'Chimney Wind Speed',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualUpdraftTowers: 'Show outputs of individual updraft towers',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: 'Sun & Time Settings',\r\n SunAngles: 'Angles',\r\n TwentyFourHours: '24 Hours',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyLikes: 'My Likes',\r\n MyCloudFiles: 'My Cloud Files',\r\n GenerateLink: 'Generate Link',\r\n LinkGeneratedInClipBoard: 'A link was generated in the clip board',\r\n DoYouReallyWantToDelete: 'Do you really want to delete',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\r\n 'If this file has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyProjects: 'My Projects',\r\n GenerateProjectLink: 'Generate Project Link',\r\n ProjectLinkGeneratedInClipBoard: 'A link to the project was generated in the clip board',\r\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\r\n 'If this project has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: 'Project Settings',\r\n ThumbnailImageSize: 'Thumbnail Image Size',\r\n ProjectByOtherPeople: 'Project by Other People',\r\n Project: 'Project',\r\n ProjectType: 'Type',\r\n ProjectDescription: 'Description',\r\n MakeDescriptionEditable: 'Make this description editable',\r\n MakeDescriptionNonEditable: 'Make this description non-editable',\r\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\r\n SolarPanelArray: 'Solar Panel Array',\r\n CurateCurrentDesign: 'Curate current design',\r\n UpdateSelectedDesign: 'Update selected design',\r\n RemoveSelectedDesign: 'Remove selected design',\r\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\r\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\r\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\r\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\r\n ChooseSolutionSpace: 'Choose solution space',\r\n ChooseDataColoring: 'Choose data coloring',\r\n SameColorForAllDesigns: 'Same color for all designs',\r\n OneColorForEachDesign: 'One color for each design',\r\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\r\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\r\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\r\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\r\n GenerateScatteredPlot: 'Generate Scattered Plot',\r\n SelectXAxis: 'Select X Axis',\r\n SelectYAxis: 'Select Y Axis',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: 'My Account Settings',\r\n MyID: 'My 🆔',\r\n ClickToCopyMyID: 'Click to copy my ID',\r\n IDInClipBoard: 'Your ID was copied and is ready to paste.',\r\n StoreMyNameInMyFilesWhenSaving: 'Store my name in my files when saving',\r\n DoYouReallyWantToShowYourNameInYourFiles: 'Do you really want to show your display name in your files?',\r\n SignFileDisclaimer: 'If yes, your display name may be seen by anyone who can access your files.',\r\n Likes: 'Likes',\r\n AllPublished: 'All Published',\r\n PublishedUnderAliases: 'Aliases',\r\n UserCount: 'User Count',\r\n SchoolID: 'School ID',\r\n ClassID: 'Class ID',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: 'Sunshine',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: 'Select Air Temperature Model',\r\n Sinusoidal: 'Sinusoidal',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: 'Economics Parameters',\r\n ElectricitySellingPrice: 'Electricity Selling Price',\r\n OperationalCostPerUnit: 'Operational Cost per Unit',\r\n SellingPrice: 'Selling Price',\r\n UnitCost: 'Unit Cost',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: 'Navigation Parameters',\r\n MinimumMoveSpeed: 'Minimum Move Speed',\r\n MinimumTurnSpeed: 'Minimum Turn Speed',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: 'Clearness',\r\n ShowDaylightResults: 'Show daylight results',\r\n ShowSkyClearnessResults: 'Show sky clearness results',\r\n ShowAverageDailySolarRadiation: 'Show average daily solar radiation',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: 'There is no sensor for collecting data.',\r\n NoSolarPanelForAnalysis: 'There is no solar panel for analysis.',\r\n NoObserverForVisibilityAnalysis: 'There is no observer for visibility analysis.',\r\n NoWaterHeaterForAnalysis: 'There is no water heater for analysis.',\r\n NoParabolicDishForAnalysis: 'There is no parabolic dish for analysis.',\r\n NoParabolicTroughForAnalysis: 'There is no parabolic trough for analysis.',\r\n NoFresnelReflectorForAnalysis: 'There is no Fresnel reflector for analysis.',\r\n NoHeliostatForAnalysis: 'There is no heliostat for analysis.',\r\n NoSolarUpdraftTowerForAnalysis: 'There is no solar updraft tower for analysis.',\r\n NoBuildingForAnalysis: 'There is no building for analysis.',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: 'Cloud file',\r\n Select: 'Select',\r\n AddFoundation: 'Add foundation',\r\n AddWall: 'Add wall',\r\n AddWindow: 'Add window',\r\n AddDoor: 'Add door',\r\n AddPyramidRoof: 'Add pyramid roof',\r\n AddGableRoof: 'Add gable roof',\r\n AddHipRoof: 'Add hip roof',\r\n AddGambrelRoof: 'Add gambrel roof',\r\n AddMansardRoof: 'Add Mansard roof',\r\n AddCuboid: 'Add cuboid',\r\n AddSensor: 'Add sensor',\r\n AddSolarPanel: 'Add solar panel',\r\n AddWaterHeater: 'Add water heater',\r\n AddParabolicDish: 'Add parabolic dish',\r\n AddParabolicTrough: 'Add parabolic trough',\r\n AddFresnelReflector: 'Add Fresnel reflector',\r\n AddHeliostat: 'Add heliostat',\r\n AddWindTurbine: 'Add wind turbine',\r\n AddLight: 'Add light',\r\n AddTree: 'Add tree',\r\n AddFlower: 'Add flower',\r\n AddPeople: 'Add people',\r\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\r\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\r\n ManipulateGroup: 'Manipulate a group',\r\n ClearScene: 'Clear scene',\r\n ShowSunAndTimeSettings: 'Show sun and time settings',\r\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\r\n DoYouReallyWantToClearContent: 'Do you really want to clear the content',\r\n ClickForMoreButtons: 'Click for more buttons',\r\n SwitchToAddingFoundation: 'Switch to Adding Foundation',\r\n SwitchToAddingCuboid: 'Switch to Adding Cuboid',\r\n SwitchToAddingWall: 'Switch to Adding Wall',\r\n SwitchToAddingWindow: 'Switch to Adding Window',\r\n SwitchToAddingDoor: 'Switch to Adding Door',\r\n SwitchToAddingPyramidRoof: 'Switch to Adding Pyramid Roof',\r\n SwitchToAddingGableRoof: 'Switch to Adding Gable Roof',\r\n SwitchToAddingHipRoof: 'Switch to Adding Hip Roof',\r\n SwitchToAddingGambrelRoof: 'Switch to Adding Gambrel Roof',\r\n SwitchToAddingMansardRoof: 'Switch to Adding Mansard Roof',\r\n SwitchToAddingSolarPanel: 'Switch to Adding Solar Panel',\r\n SwitchToAddingSensor: 'Switch to Adding Sensor',\r\n SwitchToAddingWaterHeater: 'Switch to Adding Water Heater',\r\n SwitchToAddingParabolicDish: 'Switch to Adding Parabolic Dish',\r\n SwitchToAddingParabolicTrough: 'Switch to Adding Parabolic Trough',\r\n SwitchToAddingFresnelReflector: 'Switch to Adding Fresnel Reflector',\r\n SwitchToAddingHeliostat: 'Switch to Adding Heliostat',\r\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\r\n SwitchToAddingLight: 'Switch to Adding Light',\r\n SwitchToAddingTree: 'Switch to Adding Tree',\r\n SwitchToAddingFlower: 'Switch to Adding Flower',\r\n SwitchToAddingPeople: 'Switch to Adding People',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: 'Go to Institute for Future Intelligence',\r\n visitAladdinHomePage: 'Visit Aladdin Homepage',\r\n clickToOpenMenu: 'Click to open main menu',\r\n clickToAccessAccountSettings: 'Click to access account settings',\r\n },\r\n\r\n tree: {\r\n Apple: 'Apple',\r\n Birch: 'Birch',\r\n Coconut: 'Coconut',\r\n Dogwood: 'Dogwood',\r\n Elm: 'Elm',\r\n FanPalm: 'Fan Palm',\r\n Linden: 'Linden',\r\n Magnolia: 'Magnolia',\r\n Maple: 'Maple',\r\n Oak: 'Oak',\r\n Pine: 'Pine',\r\n Spruce: 'Spruce',\r\n },\r\n\r\n flower: {\r\n Bellflower: 'Bellflower',\r\n Boxwood: 'Boxwood',\r\n CactusCombo1: 'Cactus Combo 1',\r\n CactusCombo2: 'Cactus Combo 2',\r\n CactusCombo3: 'Cactus Combo 3',\r\n CactusCombo4: 'Cactus Combo 4',\r\n Hibiscus: 'Hibiscus',\r\n Hosta: 'Hosta',\r\n Hydrangea: 'Hydrangea',\r\n Peony: 'Peony',\r\n RedRose: 'Red Rose',\r\n Spirea: 'Spirea',\r\n Sunflower: 'Sunflower',\r\n TallBush: 'Tall Bush',\r\n Tulip: 'Tulip',\r\n WhiteFlower: 'White Flower',\r\n YellowFlower: 'Yellow Flower',\r\n },\r\n\r\n people: {\r\n Jaah: 'Jaah',\r\n Jack: 'Jack',\r\n Jacob: 'Jacob',\r\n Jacqueline: 'Jacqueline',\r\n Jade: 'Jade',\r\n Jamelia: 'Jamelia',\r\n James: 'James',\r\n Jane: 'Jane',\r\n Jaya: 'Jaya',\r\n Jaye: 'Jaye',\r\n Jeanette: 'Jeanette',\r\n Jedi: 'Jedi',\r\n Jeff: 'Jeff',\r\n Jena: 'Jena',\r\n Jennifer: 'Jennifer',\r\n Jess: 'Jess',\r\n Jett: 'Jett',\r\n Jill: 'Jill',\r\n Jiya: 'Jiya',\r\n Joan: 'Joan',\r\n Jocelyn: 'Jocelyn',\r\n Joel: 'Joel',\r\n Joey: 'Joey',\r\n John: 'John',\r\n Jonathon: 'Jonathon',\r\n Jose: 'Jose',\r\n Joseph: 'Joseph',\r\n Joshua: 'Joshua',\r\n Judd: 'Judd',\r\n Judy: 'Judy',\r\n Julia: 'Julia',\r\n Julio: 'Julio',\r\n Jumapili: 'Jumapili',\r\n June: 'June',\r\n Juro: 'Juro',\r\n Justin: 'Justin',\r\n },\r\n\r\n compass: {\r\n N: 'N',\r\n S: 'S',\r\n W: 'W',\r\n E: 'E',\r\n },\r\n\r\n month: {\r\n January: 'Jan',\r\n February: 'Feb',\r\n March: 'Mar',\r\n April: 'Apr',\r\n May: 'May',\r\n June: 'Jun',\r\n July: 'Jul',\r\n August: 'Aug',\r\n September: 'Sep',\r\n October: 'Oct',\r\n November: 'Nov',\r\n December: 'Dec',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: 'Search by publisher',\r\n SearchByLabel: 'Search by label',\r\n MyPublishedModels: 'My Published Models',\r\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\r\n SortFromOldestToNewest: 'Sort from oldest to newest',\r\n SortFromNewestToOldest: 'Sort from newest to oldest',\r\n ModelsFoundOnThisSite: 'models found on this site',\r\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_zh_cn = {\r\n translation: {\r\n name: {\r\n IFI: '未来智能研究所',\r\n Aladdin: '阿拉丁',\r\n Tagline: '阿拉丁: 探索人工智能时代的设计软件 — 未来智能研究所研发',\r\n },\r\n\r\n cookie: {\r\n Statement: '声明:为了改善您的用户体验,阿拉丁采用cookie储存少量数据。',\r\n Accept: '同意',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: '未来智能研究所荣誉出品',\r\n TermsOfService: '服务条款',\r\n PrivacyPolicy: '隐私政策',\r\n Software: '软件',\r\n Content: '课件',\r\n Research: '研究',\r\n Support: '服务',\r\n Acknowledgment: '鸣谢',\r\n FundingInformation:\r\n '本产品的研发承蒙美国国家科学基金会慷慨资助(项目号#2105695,#2131097,#2301164)。本产品的任何观点或结论仅代表创作者个人意见。',\r\n Contact: '如您需要更多信息,请联系 Charles Xie (charles@intofuture.org)。我们会尽快回复。',\r\n Translators: '翻译',\r\n },\r\n\r\n word: {\r\n LastUpdate: '上一次更新',\r\n Small: '小',\r\n Medium: '中',\r\n Large: '大',\r\n Design: '设计',\r\n Information: '信息',\r\n Type: '类别',\r\n Text: '文字',\r\n FontSize: '字体大小',\r\n FontColor: '字体颜色',\r\n Model: '模型',\r\n Models: '模型',\r\n Upload: '上传',\r\n ClickCount: '点击数',\r\n Share: '分享',\r\n AlreadyLike: '已点赞',\r\n Like: '点赞',\r\n MustLogInToLike: '必须登录才能点赞',\r\n AllRightsReserved: '版权所有',\r\n MeterAbbreviation: '米',\r\n Version: '版本',\r\n VersionInitial: '版本',\r\n Options: '选项',\r\n Maximum: '最大',\r\n Minimum: '最小',\r\n MaximumNumber: '最多',\r\n MinimumNumber: '最少',\r\n MaximumValue: '最大值',\r\n MinimumValue: '最小值',\r\n Or: '或',\r\n None: '无',\r\n High: '高',\r\n Partial: '部分',\r\n Teacher: '老师',\r\n Class: '班级',\r\n Total: '总数',\r\n Leaderboard: '用戶排行榜',\r\n Latest: '最新',\r\n Range: '范围',\r\n SIUnit: '国际单位制',\r\n USUnit: '美国单位制',\r\n ThermalTransmittance: '热透过率',\r\n ThermalResistance: '热阻',\r\n UValue: 'U值',\r\n RValue: 'R值',\r\n VolumetricHeatCapacity: '容积热容',\r\n BuildingHVACSystem: '建筑物暖通空调系统',\r\n ThermostatSetpoint: '恒温器设定值',\r\n TemperatureToleranceThreshold: '温度忍耐阈值',\r\n TemperatureToleranceThresholdExplanation:\r\n '当日最低外面温度高于恒温器设定值减去此阈值,暖气不开。\\n当日最高外面温度低于恒温器设定值加上此阈值,空调不开。',\r\n Press: '按',\r\n Open: '打开',\r\n Save: '保存',\r\n SaveAsImage: '保存为图像',\r\n SaveAsCsv: '保存为CSV',\r\n Update: '刷新',\r\n Paste: '粘贴',\r\n Copy: '复制',\r\n Cut: '剪切',\r\n Delete: '删除',\r\n Lock: '固定',\r\n Translucent: '半透明',\r\n Color: '颜色',\r\n Texture: '材质',\r\n Thickness: '厚度',\r\n Size: '尺寸',\r\n Yes: '是',\r\n No: '不',\r\n OK: '确定',\r\n Cancel: '取消',\r\n Apply: '应用',\r\n Close: '关闭',\r\n ApplyTo: '适用于',\r\n Run: '运行',\r\n Pause: '暂停',\r\n Resume: '继续',\r\n Clear: '清空',\r\n Warning: '警告',\r\n Caution: '小心',\r\n Reminder: '提醒',\r\n Length: '长度',\r\n Width: '宽度',\r\n Height: '高度',\r\n Radius: '半径',\r\n Angle: '角度',\r\n Azimuth: '方位角',\r\n Coordinates: '坐标',\r\n Weather: '天气',\r\n Show: '显示',\r\n Animate: '动画',\r\n Date: '日期',\r\n Time: '时间',\r\n Title: '标题',\r\n Owner: '所有者',\r\n Action: '操作',\r\n Rename: '改名',\r\n Location: '位置',\r\n Latitude: '纬度',\r\n Month: '月份',\r\n Day: '天',\r\n Hour: '小时',\r\n Daylight: '白天长度',\r\n Radiation: '辐射',\r\n Temperature: '温度',\r\n kWh: '千瓦时',\r\n dollar: '元',\r\n MeterPerSecond: '米/秒',\r\n NorthInitial: '北',\r\n SouthInitial: '南',\r\n EastInitial: '东',\r\n WestInitial: '西',\r\n Fixed: '固定',\r\n Elements: '部件',\r\n Energy: '能量',\r\n Unknown: '未知',\r\n Label: '标签',\r\n Description: '描述',\r\n NoDescription: '无描述',\r\n MaximumCharacters: '最多字符数',\r\n Author: '作者',\r\n Publisher: '发布者',\r\n Building: '建筑',\r\n ResidentialBuilding: '住宅建筑',\r\n CommercialBuilding: '商用建筑',\r\n SchoolBuilding: '学校建筑',\r\n TouristAttraction: '旅游景点',\r\n UnderConstruction: '在建',\r\n Photovoltaic: '光伏',\r\n Anonymous: '无名氏',\r\n Nickname: '别名',\r\n Pin: '置顶',\r\n Unpin: '解除置顶',\r\n },\r\n\r\n shared: {\r\n NoTexture: '无材质',\r\n FoundationElement: '地基',\r\n CuboidElement: '长方体',\r\n PolygonElement: '多边形',\r\n SensorElement: '传感器',\r\n SolarPanelElement: '光伏板',\r\n WaterHeaterElement: '太阳能热水器',\r\n ParabolicDishElement: '抛物线碟',\r\n ParabolicTroughElement: '抛物线槽',\r\n FresnelReflectorElement: '菲涅耳反射镜',\r\n HeliostatElement: '定日镜',\r\n WindTurbineElement: '风力涡轮机',\r\n LightElement: '电灯',\r\n ElementLocked: '固定',\r\n ModelType: '模型类别',\r\n OutputBreakdown: '分列发电量',\r\n MoreResults: '更多结果',\r\n },\r\n\r\n message: {\r\n ModelNotFound: '没有找到模型',\r\n CannotSignIn: '登录失败',\r\n CannotSignOut: '退出失败',\r\n YourAccountWasCreated: '成功建立您的账号。',\r\n CannotCreateAccount: '无法创建账号',\r\n YourAccountSettingsWereSaved: '您的账号设定已保存。',\r\n CannotSaveYourAccountSettings: '您的账号设定无法保存',\r\n CannotSaveYourFileToCloud: '无法保存您的文件到云端',\r\n CannotCreateNewProject: '无法创建新项目',\r\n CannotCreateNewProjectWithoutTitle: '没有标题, 无法创建新项目',\r\n CannotOpenYourProjects: '无法打开您的项目列表',\r\n CannotOpenProject: '无法打开项目',\r\n CannotDeleteProject: '无法删除项目',\r\n CannotRenameProject: '无法给项目改名',\r\n CannotAddDesignToProject: '无法把此设计加到项目里',\r\n CannotAddDesignToProjectOwnedByOthers: '不能把此设计加到别人的项目里',\r\n DesignRemovedFromProject: '设计被成功地从项目里删除',\r\n CannotRemoveDesignFromProject: '无法把此设计从项目里删除',\r\n CannotUpdateProject: '无法更新项目',\r\n CannotFetchProjectData: '无法取得项目数据',\r\n TitleUsedChooseDifferentOne: '此标题已经被使用, 请采用不同的标题',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: '使用此标题的云文件已经存在,您确定要覆盖它吗?',\r\n CloudFileNotFound: '找不到此云端文件',\r\n CannotLoadModelsOnMap: '无法下载地图上的模型',\r\n CannotLoadLeaderboard: '无法下载排行榜',\r\n CannotPublishModelOnMap: '模型无法发布到地图上',\r\n CannotLikeModelFromMap: '无法点赞地图上的模型',\r\n CannotDeleteModelFromMap: '无法删除地图上的模型',\r\n ModelDeletedFromMap: '模型已从地图上删除',\r\n DoYouWantToDeleteModelFromMap: '您要删除地图上的这个模型吗?',\r\n CannotOpenCloudFile: '此云端文件无法打开',\r\n CannotReadCloudFile: '无法读取此云端文件',\r\n CannotWriteCloudFile: '无法存储此云端文件',\r\n CloudFileCopied: '拷贝云端文件',\r\n CannotOpenCloudFolder: '您的云端文件夹无法打开',\r\n CannotDeleteCloudFile: '无法删除此云端文件',\r\n CannotRenameCloudFile: '此云端文件的名字无法更改',\r\n DoYouWantToSaveChanges: '您要保存当前文件吗?',\r\n NotApplicableToSelectedAction: '此值不适用于当前选择范围',\r\n ThisElementIsLocked: '这个部件被锁定。',\r\n ThisCannotBeUndone: '这个操作一旦执行就不能撤销。',\r\n AzimuthOfNorthIsZero: '正北的方位角为零度',\r\n CounterclockwiseAzimuthIsPositive: '逆时针为正',\r\n MoveCancelledBecauseOfOverlap: '位置重叠,移动取消。',\r\n MoveOutsideBoundaryCancelled: '位置出界,移动取消。',\r\n RotationCancelledBecauseOfOverlap: '位置重叠,旋转取消。',\r\n RotationOutsideBoundaryCancelled: '位置出界,旋转取消。',\r\n ResizingCancelledBecauseOfOverlap: '位置重叠,尺寸调整取消。',\r\n ResizingOutsideBoundaryCancelled: '位置出界,尺寸调整取消。',\r\n CannotPasteOutsideBoundary: '位置出界,不能复制。',\r\n CannotPasteBecauseOfOverlap: '位置重叠,不能复制。',\r\n CannotMoveObjectTooFar: '位置太远,移动取消。',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout: '采用新布局之前必须移除现有的光伏板。',\r\n DoYouWantToContinue: '您想继续吗?',\r\n SolarPanelsCannotIntersectWithGround: '光伏板不能和地面接触。',\r\n SolarPanelsCannotOverlapWithOneAnother: '光伏板不能重叠。',\r\n ScreenshotSaved: '截屏图片保存在下载文件夹里。',\r\n CsvFileSaved: 'CSV保存在下载文件夹里。',\r\n SimulationStarted: '模拟开始。',\r\n SimulationCompleted: '模拟结束。',\r\n SimulationAborted: '模拟取消。',\r\n SimulationPaused: '模拟暂停。',\r\n CancelSimulation: '取消模拟',\r\n PauseSimulation: '暂停模拟',\r\n ResumeSimulation: '继续模拟',\r\n SimulationWillNotStartDueToErrors: '由于错误模拟无法运行',\r\n SimulationWillStartDespiteWarnings: '发现问题,但模拟仍然将运行。',\r\n EvolutionStarted: '演化开始。',\r\n EvolutionCompleted: '演化结束。',\r\n EvolutionAborted: '演化取消。',\r\n EvolutionPaused: '演化暂停。',\r\n EncounterEvolutionError: '演化出错。',\r\n CancelEvolution: '取消演化',\r\n PauseEvolution: '暂停演化',\r\n ResumeEvolution: '继续演化',\r\n ConvergenceThresholdHasBeenReached: '收敛阈值已达到。',\r\n MaximumNumberOfGenerationsHasBeenReached: '最大世代数已达到。',\r\n MaximumNumberOfStepsHasBeenReached: '最大步数已达到。',\r\n ObjectiveFunctionTypeError: '此操作不支持当前的目标函数。请从菜单启动此功能。',\r\n WallsAreNotAtSameHeight: '墙体高度不同。',\r\n WallsAreNotPerpendicular: '墙体不垂直。',\r\n WallsAreNotConnected: '墙体不相连。',\r\n WallsNumberNeedToBeFour: '墙体数量必须为四个。',\r\n BuildingContainsEmptyWall: '建筑物有空墙。',\r\n BuildingRoofMissing: '建筑物没有屋顶。',\r\n UnknownErrors: '未知错误。',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: '分析选项',\r\n option: {\r\n GridCellSize: '计算网格的尺寸',\r\n SamplingFrequency: '采样频率',\r\n TimesPerHour: '每小时采样次数',\r\n DaysPerYear: '每一年采样天数',\r\n },\r\n mainMenu: '主菜单',\r\n cloudMenu: '云菜单',\r\n projectSubMenu: '项目',\r\n project: {\r\n CreateNewProject: '创建新项目',\r\n OpenProject: '打开项目',\r\n SaveProjectAs: '另存项目为',\r\n YouMustLogInToCreateProject: '您必须登录才能创建项目',\r\n YouMustLogInToOpenProject: '您必须登录才能打开项目',\r\n },\r\n fileSubMenu: '文件',\r\n file: {\r\n CreateNewFile: '创建新文件',\r\n OpenLocalFile: '打开本地文件',\r\n SaveAsLocalFile: '保存为本地文件',\r\n SavingAbortedMustHaveValidFileName: '文件名无效,保存失败',\r\n OpenCloudFile: '打开云端文件',\r\n SaveCloudFile: '保存云端文件',\r\n SaveAsCloudFile: '保存为云端文件',\r\n SavingAbortedMustHaveValidTitle: '云端文件名无效,保存失败',\r\n ToSaveYourWorkPleaseSignIn: '为了保存您的云端文件,请您先登录。',\r\n TakeScreenshot: '截屏',\r\n UseCloudFileName: '采用云端文件名',\r\n PublishOnModelsMap: '发布到地图上',\r\n PublishedOnModelsMap: '您的模型成功发布到地图上',\r\n UpdatedOnModelsMap: '您的模型更新成功',\r\n YouMustLogInToPublishYourModel: '您必须登录才能发布模型',\r\n YouCannotPublishAModelThatYouDoNotOwn: '您不能发布他人的模型',\r\n YouMustSaveModelOnCloudBeforePublishingIt: '您必须先把此模型保存在云端才能发布它',\r\n },\r\n editSubMenu: '编辑',\r\n edit: {\r\n Undo: '撤销',\r\n Redo: '重做',\r\n },\r\n viewSubMenu: '视界',\r\n view: {\r\n NavigationView: '导航模式',\r\n TwoDimensionalView: '二维模式',\r\n ResetView: '重置视角',\r\n ZoomIn: '放大',\r\n ZoomOut: '缩小',\r\n AutoRotate: '自动旋转',\r\n ShowShadow: '显示阴影',\r\n ShowSurfaceShininess: '显示表面光泽',\r\n TranslucentFloatingWindows: '透明浮动窗口',\r\n accessoriesSubMenu: '配件',\r\n accessories: {\r\n SiteInformation: '位置信息',\r\n DesignInformation: '设计信息',\r\n Instruction: '操作说明',\r\n StickyNote: '便签',\r\n Note: '便签',\r\n },\r\n },\r\n settingsSubMenu: '设置',\r\n settings: {\r\n WeatherData: '气象数据',\r\n DiurnalTemperature: '昼夜温度',\r\n Heliodon: '日影仪',\r\n SunAndTime: '太阳和时间',\r\n },\r\n benchmarksSubMenu: '基准',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: '太阳能辐射模型预测和实际测量的对比',\r\n BESTESTCase600: '建筑物能耗模拟测试:BESTEST案例600',\r\n BESTESTCase610: '建筑物能耗模拟测试:BESTEST案例610',\r\n BESTESTCase620: '建筑物能耗模拟测试:BESTEST案例620',\r\n BESTESTCase630: '建筑物能耗模拟测试:BESTEST案例630',\r\n },\r\n graph: {\r\n LineWidth: '线条宽度',\r\n SymbolSize: '符号大小',\r\n BarCategoryGap: '直条间隙',\r\n ShowHorizontalGridLines: '显示格子的水平线条',\r\n ShowVerticalGridLines: '显示格子的竖直线条',\r\n },\r\n analysisSubMenu: '分析',\r\n physicsSubMenu: '物理',\r\n physics: {\r\n DailySolarRadiationHeatmap: '当日太阳辐射总量分布热图',\r\n SolarRadiationHeatmapOptions: '太阳辐射热图选项',\r\n SolarRadiationHeatmapGridCellSize: '太阳辐射热图网格的尺寸',\r\n SolarRadiationHeatmapMaxValue: '太阳辐射热图最大值',\r\n SolarRadiationHeatmapNoAnimation: '若无移动部件则省略动画',\r\n ReflectionHeatmap: '反射热图',\r\n },\r\n sensorSubMenu: '传感器',\r\n sensor: {\r\n CollectDailyData: '收集当天数据',\r\n CollectYearlyData: '收集全年数据',\r\n SensorSimulationNoAnimation: '若无移动部件则省略动画',\r\n },\r\n buildingSubMenu: '建筑物',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: '建筑物当天能耗分析',\r\n AnalyzeYearlyBuildingEnergy: '建筑物全年能耗分析',\r\n EnergyAnalysisOptions: '能耗分析选项',\r\n EnergyGridCellSize: '计算网格的尺寸',\r\n BuildingEnergySimulationNoAnimation: '若无移动部件则省略动画',\r\n },\r\n solarPanelSubMenu: '太阳能光伏板',\r\n solarPanel: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n AnalyzeVisibility: '分析可见度',\r\n PanelDiscretization: '光伏板离散化方法',\r\n Exact: '准确',\r\n Approximate: '近似',\r\n EnergyGridCellSize: '计算网格的尺寸',\r\n VisibilityGridCellSize: '视界因子计算网格的尺寸',\r\n EnergyAnalysisOptions: '能量分析选项',\r\n VisibilityAnalysisOptions: '可见度分析选项',\r\n SolarPanelSimulationNoAnimation: '若无移动部件则省略动画',\r\n },\r\n parabolicTroughSubMenu: '抛物线槽',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n },\r\n parabolicDishSubMenu: '抛物线碟',\r\n parabolicDish: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n },\r\n fresnelReflectorSubMenu: '菲涅尔反射镜',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n },\r\n heliostatSubMenu: '定日镜',\r\n heliostat: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n },\r\n solarUpdraftTowerSubMenu: '太阳能上升气流塔',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: '分析当天产出',\r\n AnalyzeYearlyYield: '分析全年产出',\r\n SolarUpdraftTowerSimulationNoAnimation: '若无移动部件则省略动画',\r\n },\r\n\r\n tutorialsSubMenu: '教程',\r\n\r\n solarEnergyScienceSubMenu: '太阳能科学',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: '太阳相对于地面观察者的角度',\r\n InsolationAndClimate: '太阳辐射和气候的关系',\r\n SolarRadiationToBox: '一个长方体受到的太阳能辐射分析',\r\n },\r\n\r\n buildingScienceSubMenu: '建筑科学',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: '房屋的热学封套和围护封套',\r\n EffectOfSizeOnBuildingEnergy: '房屋大小对能耗的影响',\r\n EffectOfOrientationOnBuildingEnergy: '房屋方位对能耗的影响',\r\n EffectOfInsulationOnBuildingEnergy: '房屋隔热对能耗的影响',\r\n EffectOfRoofColorOnBuildingEnergy: '屋顶颜色对建筑物能耗的影响',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: '屋檐延伸长度对建筑物能耗的影响',\r\n EffectOfWindowSHGCOnBuildingEnergy: '窗户太阳能输入对房屋能耗的影响',\r\n EffectOfThermostatSetpointOnBuildingEnergy: '恒温器设定值对房屋能耗的影响',\r\n EffectOfSolarPanelsOnBuildingEnergy: '光伏板对房屋能耗的影响',\r\n EffectOfGroundTemperatureOnBuildingEnergy: '地表温度对房屋能耗的影响',\r\n EffectOfTreesOnBuildingEnergy: '树荫对房屋能耗的影响',\r\n },\r\n\r\n buildingDesignSubMenu: '建筑设计',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: '有棚顶窗的科德角风格的住宅',\r\n MansardRoofWithDormers: '有天窗的折线屋顶',\r\n GableRoofVsHipRoof: '双坡屋顶和四坡屋顶的对比',\r\n ColonialVsSaltbox: '殖民地风格和盐盒风格的对比',\r\n GambrelRoofVsMansardRoof: '复斜屋顶和折线屋顶的对比',\r\n CombinationRoofVsBonnetRoof: '组合屋顶和帽檐屋顶的对比',\r\n DutchGableRoof: '荷兰双坡屋顶',\r\n GableAndValleyRoof: '坡谷屋顶',\r\n ClerestoryRoof: '天窗屋顶',\r\n MonitorRoof: '采光屋顶',\r\n AFrameHouse: 'A字形房子',\r\n HalfTimberedHouse: '半木骨架房子',\r\n AllBasicRoofTypes: '所有的基本屋顶类型',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: '光伏发电',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: '光伏板倾斜角对发电量的影响',\r\n EffectOfAzimuthOfSolarPanel: '光伏板方位角对发电量的影响',\r\n SolarPanelTypes: '光伏板类型',\r\n VerticalBifacialSolarPanels: '竖直的双面光伏板',\r\n CompareMonofacialAndBifacialSolarPanels: '单面光伏板和双面光伏板的对比',\r\n SolarTrackers: '自动追日器',\r\n CoveringGroundWithSolarPanels: '为什么我们不简单地用光伏板覆盖地面',\r\n InterRowSpacingOfSolarPanelArray: '光伏板阵列行间距对发电量的影响',\r\n EffectOfOrientationOfSolarPanels: '光伏板排列方向对发电量的影响',\r\n SolarPanelArrayAutomaticLayout: '光伏板自动排列',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: '光热发电',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: '抛物线槽方位角对发电量的影响',\r\n EffectOfLatusRectumOfParabolicTrough: '抛物线槽通径对发电量的影响',\r\n FocusSunlightWithParabolicDish: '用抛物线碟聚焦陽光',\r\n LinearFresnelReflectors: '用直线式菲涅尔反射镜聚焦陽光',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors: '吸热管的安装高度对直线式菲涅尔反射镜发电量的影响',\r\n EffectOfAzimuthOfLinearFresnelReflectors: '直线式菲涅尔反射镜方位角对发电量的影响',\r\n LinearFresnelReflectorsWithTwoAbsorbers: '配备两个吸收管的直线式菲涅尔反射镜阵列',\r\n CosineEfficiencyOfHeliostats: '定日镜的余弦效率',\r\n ShadowingAndBlockingOfHeliostats: '定日镜的阴影和遮挡',\r\n EffectSolarPowerTowerHeight: '吸收塔高度对发电量的影响',\r\n SolarPowerTower: '塔式光热发电站',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: '其它类型的太阳能发电',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: '太阳能上升气流塔',\r\n },\r\n\r\n generativeDesignSubMenu: '生成式设计',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: '单面光伏板阵列的倾斜角',\r\n BifacialSolarPanelArrayTiltAngle: '双面光伏板阵列的倾斜角',\r\n OutputOfSolarPanelArrayInDifferentPlaces: '一个光伏板阵列在不同地区的产出',\r\n SimpleSolarFarmParetoFront: '简单太阳能农场设计的帕累托前沿',\r\n },\r\n\r\n examplesSubMenu: '例子',\r\n\r\n solarEnergySubMenu: '太阳能',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: '太阳光束和日影仪',\r\n RooftopSolarPanels: '屋顶光伏板',\r\n NevadaSolarOneParabolicTroughArray: '内华达州太阳能一号的抛物线槽阵列',\r\n TooeleParabolicDishArray: '犹他州图埃勒的抛物线碟阵列',\r\n PS10SolarPowerTower: '西班牙塞维利亚的PS10太阳能发电塔',\r\n TucsonLinearFresnelReflectors: '亚利桑那州图森的直线式菲涅尔反射镜阵列',\r\n SolarCanopyFormFactors: '太阳能天篷外形设计',\r\n SolarCanopyOverBleachers: '看台太阳能天篷',\r\n SolarCanopyOverGarage: '车库太阳能天篷',\r\n SolarBusStop: '太阳能候车亭',\r\n SolarFacadeTesla: '特斯拉光伏墙',\r\n BuildingIntegratedPhotovoltaics: '建筑整合光伏',\r\n Floatovoltaics: '浮动光伏',\r\n Agrivoltaics: '农业光伏',\r\n VegetativeBuffer: '太阳能农场绿化带',\r\n RainbowSwashSolarFarmBostonMA: '马萨诸塞州波士顿彩虹激流旁边的光伏板阵列',\r\n MickeyMouseSolarFarmOrlandoFL: '佛罗里达州奥兰多的米老鼠形状光伏板阵列',\r\n SolarPanelsOverCanalBakersfieldCA: '加利福尼亚州贝克斯菲尔德灌溉渠上假想的光伏板阵列',\r\n SolarNoiseBarrierLexingtonMA: '马萨诸塞州列克星敦高速公路噪音墙上假想的光伏板',\r\n HSATSolarTrackersRaleighNC: '北卡罗来纳州罗利的一个水平方向单轴旋转追日光伏板阵列(HSAT)',\r\n AADATSolarTrackersLancasterCA: '加利福尼亚州兰开斯特的一个双轴旋转追日光伏板阵列(AADAT)',\r\n SolarUpdraftTowerInCity: '太阳能上升气流塔在城市中的应用',\r\n },\r\n\r\n builtEnvironmentSubMenu: '建造环境',\r\n residentialBuildingsSubMenu: '住宅建筑',\r\n residentialBuildingExamples: {\r\n ColonialHouse: '殖民地风格的住宅',\r\n DutchColonialHouse: '荷兰殖民地风格的住宅',\r\n TShapedHouse: 'T字型房子',\r\n CapeCodHouseWithGarage: '有车库的科德角风格的住宅',\r\n Solarium: '有日光浴室的房子',\r\n Church1: '教堂例一',\r\n Cathedral1: '主教座堂例一',\r\n Cathedral2: '主教座堂例二',\r\n Mosque1: '清真寺例一',\r\n AdobeTaosHouse: '陶斯土坯房',\r\n RanchHouse: '牧场风格的住宅',\r\n BonnetHouse: '有帽檐屋顶的住宅',\r\n BarnStyleHouse: '谷仓式风格的住宅',\r\n ModernHouse: '现代风格的住宅',\r\n ButterflyRoofHouse: '蝴蝶型屋顶的住宅',\r\n },\r\n commercialBuildingsSubMenu: '商用建筑',\r\n commercialBuildingExamples: {\r\n WhiteHouse: '白宫',\r\n BilimMersinTurkiye: '土耳其梅尔辛科学教育中心',\r\n SpanishStyleHotel: '西班牙风格旅馆',\r\n ApartmentBuilding: '公寓楼',\r\n OfficeBuilding: '办公楼',\r\n Hotel: '旅馆',\r\n },\r\n buildingComplexesSubMenu: '建筑群',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: '佛蒙特州南伯灵顿高中',\r\n MescaleroApacheSchoolNewMexico: '新墨西哥州梅斯卡勒罗阿帕奇学校',\r\n },\r\n urbanPlanningSubMenu: '城市规划',\r\n urbanPlanningExamples: {\r\n Heatmap1: '热图例一',\r\n },\r\n otherBuildingsSubMenu: '其它建筑',\r\n otherBuildingExamples: {\r\n Greenhouse: '温室',\r\n Pavilion: '公园的亭子',\r\n OctagonalPagoda: '八角塔',\r\n OceanFront: '海边',\r\n EgyptianPyramids: '埃及金字塔',\r\n MayanPyramid: '玛雅金字塔',\r\n SiOSePol: '三十三孔桥',\r\n StackedCuboids: '堆砌长方体',\r\n },\r\n\r\n artificialIntelligenceSubMenu: '人工智能',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: '优化单排光伏板的倾斜角',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: '优化多排光伏板的倾斜角',\r\n SolarFarmGenerativeDesign: '生成式设计太阳能农场',\r\n SolarFarmGenerativeDesignWithBlock: '生成式设计太阳能农场:周边有建筑物的情况',\r\n FitchburgSolarFarmGenerativeDesign: '生成式设计太阳能农场:真实世界案例',\r\n },\r\n\r\n languageSubMenu: '语言',\r\n publicSubMenu: '公共',\r\n ModelsGallery: '模型画廊',\r\n ModelsMap: '模型地图',\r\n AboutUs: '关于我们',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: '账号设定',\r\n PrivacyStatementTitle: '用户隐私保护声明',\r\n PrivacyStatement:\r\n '登录需要采用您的谷歌ID建立或进入您的阿拉丁账户。 我们只储存一个随机的字符串作为您的ID。 任何关于您的可辨识的个人信息都没有被收集。 详情请参考我们的',\r\n SignIn: '登录',\r\n SignOut: '退出账号',\r\n IfYouAreAStudent: '如果您是一个学生',\r\n },\r\n\r\n skyMenu: {\r\n Axes: '显示坐标轴',\r\n Theme: '环境主题',\r\n ThemeDefault: '默认',\r\n ThemeDesert: '沙漠',\r\n ThemeDune: '沙丘',\r\n ThemeForest: '森林',\r\n ThemeGrassland: '草原',\r\n ThemeHill: '丘陵',\r\n ThemeLake: '湖泊',\r\n ThemeMountain: '山脉',\r\n ThemeRural: '田园',\r\n SunlightAttenuationCoefficientInAir: '阳光在空气中传播的衰减系数',\r\n ConvectiveCoefficientOfAir: '空气对流传热系数',\r\n HighestTemperatureTimeInMinutes: '最高气温时间(分钟)',\r\n SelectSunAnglesToShow: '选择太阳角度显示',\r\n ShowAzimuthAngle: '显示方位角',\r\n ShowElevationAngle: '显示高度角',\r\n ShowZenithAngle: '显示天顶角',\r\n DirectLightBrightnessAtNoon: '正午直射光照度',\r\n AmbientLightBrightnessAtNoon: '正午环境光照度',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: '月份辐射度损失比',\r\n Vegetation: '植被',\r\n LeafOutDay: '树叶长出的日子',\r\n LeafOffDay: '树叶脱落的日子',\r\n Albedo: '反照率',\r\n ImageOnGround: '地面显示图像',\r\n WaterSurface: '水面',\r\n RemoveAllUnlockedTrees: '删除所有非固定的树木',\r\n RemoveAllUnlockedFlowers: '删除所有非固定的花草',\r\n RemoveAllUnlockedSolarPanels: '删除所有非固定的光伏板',\r\n RemoveAllUnlockedPeople: '删除所有非固定的人物',\r\n RemoveAllUnlockedFoundations: '删除所有非固定的地基',\r\n RemoveAllUnlockedCuboids: '删除所有非固定的长方体',\r\n DoYouReallyWantToRemoveAllPeople: '你确定删除所有非固定的人物吗',\r\n DoYouReallyWantToRemoveAllTrees: '你确定删除所有非固定的树木吗',\r\n DoYouReallyWantToRemoveAllFlowers: '你确定删除所有非固定的花草吗',\r\n DoYouReallyWantToRemoveAllSolarPanels: '你确定删除所有非固定的光伏板吗',\r\n DoYouReallyWantToRemoveAllFoundations: '你确定删除所有非固定的地基吗',\r\n DoYouReallyWantToRemoveAllCuboids: '你确定删除所有非固定的长方体吗',\r\n LockAllElements: '固定所有的部件',\r\n UnlockAllElements: '解除所有的固定',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: '标签',\r\n LabelText: '标签的内容',\r\n LabelHeight: '标签的高度',\r\n LabelSize: '标签的大小',\r\n LabelFontSize: '字体的大小',\r\n LabelColor: '标签的颜色',\r\n KeepShowingLabel: '显示标签',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: '删除此地基上所有非固定的光伏板',\r\n RemoveAllUnlockedParabolicTroughs: '删除此地基上所有非固定的抛物线槽',\r\n RemoveAllUnlockedParabolicDishes: '删除此地基上所有非固定的抛物线碟',\r\n RemoveAllUnlockedFresnelReflectors: '删除此地基上所有非固定的菲涅耳反射镜',\r\n RemoveAllUnlockedHeliostats: '删除此地基上所有非固定的定日镜',\r\n RemoveAllUnlockedSensors: '删除此地基上所有非固定的传感器',\r\n RemoveAllUnlockedLights: '删除此地基上所有非固定的电灯',\r\n RemoveAllUnlockedWalls: '删除此地基上所有非固定的墙',\r\n RemoveAllUnlockedWindows: '删除此地基上所有非固定的窗户',\r\n RemoveAllUnlockedDoors: '删除此地基上所有非固定的门',\r\n RemoveAllUnlockedPolygons: '删除此地基上所有非固定的多边形',\r\n RemoveAllUnlockedHumans: '删除此地基上所有非固定的人物',\r\n RemoveAllUnlockedTrees: '删除此地基上所有非固定的树木',\r\n RemoveAllUnlockedFlowers: '删除此地基上所有非固定的花草',\r\n Racks: '支架',\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n SolarPanels: '光伏板',\r\n SolarPanelArray: '光伏板阵列',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation: '你确定删除此地基上所有非固定的光伏板吗',\r\n ParabolicTroughs: '抛物线槽',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation: '你确定删除此地基上所有非固定的抛物线槽吗',\r\n ParabolicDishes: '抛物线碟',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation: '你确定删除此地基上所有非固定的抛物线碟吗',\r\n FresnelReflectors: '菲涅耳反射镜',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation: '你确定删除此地基上所有非固定的菲涅耳反射镜吗',\r\n Heliostats: '定日镜',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation: '你确定删除此地基上所有非固定的定日镜吗',\r\n Sensors: '传感器',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation: '你确定删除此地基上所有非固定的传感器吗',\r\n Lights: '电灯',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation: '你确定删除此地基上所有非固定的电灯吗',\r\n Walls: '墙',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation: '你确定删除此地基上所有非固定的墙吗',\r\n Windows: '窗户',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation: '你确定删除此地基上所有非固定的窗户吗',\r\n Doors: '门',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation: '你确定删除此地基上所有非固定的门吗',\r\n Polygons: '多边形',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation: '你确定删除此地基上所有非固定的多边形吗',\r\n Humans: '人物',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation: '你确定删除此地基上所有非固定的人物吗',\r\n Trees: '树木',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation: '你确定删除此地基上所有非固定的树木吗',\r\n Flowers: '花草',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation: '你确定删除此地基上所有非固定的花草吗',\r\n OnlyThisFoundation: '只这块地基',\r\n AllSelectedFoundations: '所有选中的地基',\r\n AllConnectedFoundations: '所有相连的地基',\r\n AllFoundations: '所有的地基',\r\n AddPolygon: '添加多边形',\r\n SolarStructure: '太阳能构型',\r\n GroupMaster: '主地基',\r\n LockAllElementsOnThisFoundation: '固定此地基上所有的部件',\r\n UnlockAllElementsOnThisFoundation: '解除此地基上所有的固定',\r\n GroundFloorRValue: '建筑物地板的R值',\r\n OnlyThisGroundFloor: '只这个建筑物的地板',\r\n AllGroundFloors: '所有建筑物的地板',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: '和定日镜配套的吸收塔',\r\n ReceiverTowerPhysicalProperties: '太阳能吸收塔的物理性质',\r\n ReceiverTowerHeight: '太阳能吸收塔的高度',\r\n ReceiverTowerRadius: '太阳能吸收塔的半径',\r\n ReceiverAbsorptance: '太阳能吸收器的吸收率',\r\n ReceiverOpticalEfficiency: '太阳能吸收器的光效率',\r\n ReceiverThermalEfficiency: '太阳能吸收器的热效率',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: '和菲涅尔反射镜配套的吸收管',\r\n AbsorberPipePhysicalProperties: '太阳能吸收管的物理性质',\r\n AbsorberHeight: '太阳能吸收管的安装高度',\r\n AbsorberApertureWidth: '太阳能吸收管的孔径',\r\n AbsorberPipePoleNumber: '太阳能吸收管的支柱数量',\r\n AbsorberAbsorptance: '太阳能吸收管的吸收率',\r\n AbsorberOpticalEfficiency: '太阳能吸收管的光效率',\r\n AbsorberThermalEfficiency: '太阳能吸收管的热效率',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: '太阳能上升气流塔',\r\n SolarUpdraftTowerPhysicalProperties: '太阳能上升气流塔的物理性质',\r\n SolarUpdraftTowerChimneyHeight: '太阳能上升气流塔烟囱的高度',\r\n SolarUpdraftTowerChimneyRadius: '太阳能上升气流塔烟囱的半径',\r\n SolarUpdraftTowerCollectorHeight: '太阳能上升气流塔集热棚的高度',\r\n SolarUpdraftTowerCollectorRadius: '太阳能上升气流塔集热棚的半径',\r\n SolarUpdraftTowerCollectorTransmissivity: '太阳能上升气流塔集热棚的透射率',\r\n SolarUpdraftTowerCollectorEmissivity: '太阳能上升气流塔集热棚的发射率',\r\n SolarUpdraftTowerDischargeCoefficient: '太阳能上升气流塔的流量系数',\r\n SolarUpdraftTowerTurbineEfficiency: '太阳能上升气流塔的涡轮机效率',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n RemoveAllUnlockedSolarPanels: '删除此长方体表面上所有非固定的光伏板',\r\n RemoveAllUnlockedSensors: '删除此长方体表面上所有非固定的传感器',\r\n RemoveAllUnlockedPolygons: '删除此长方体表面上所有非固定的多边形',\r\n RemoveAllUnlockedHumans: '删除此长方体表面上所有非固定的人物',\r\n RemoveAllUnlockedTrees: '删除此长方体表面上所有非固定的树木',\r\n RemoveAllUnlockedFlowers: '删除此长方体表面上所有非固定的花草',\r\n Racks: '支架',\r\n SolarPanels: '光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid: '你确定删除此长方体表面上所有非固定的光伏板吗',\r\n Sensors: '传感器',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid: '你确定删除此长方体表面上所有非固定的传感器吗',\r\n Polygons: '多边形',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid: '你确定删除此长方体表面上所有非固定的多边形吗',\r\n Humans: '人物',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid: '你确定删除此长方体表面上所有非固定的人物吗',\r\n Trees: '树木',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid: '你确定删除此长方体表面上所有非固定的树木吗',\r\n Flowers: '花草',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid: '你确定删除此长方体表面上所有非固定的花草吗',\r\n OnlyThisCuboid: '只这个长方体',\r\n AllCuboidsOnSameSurface: '同一表面上所有的长方体',\r\n AllCuboidsAboveSameBase: '同一地基上所有的长方体',\r\n AllSelectedCuboids: '所有选中的长方体',\r\n AllCuboids: '所有的长方体',\r\n OnlyThisSide: '只这个表面',\r\n AllSidesOfThisCuboid: '这个长方体所有的侧面',\r\n AllSidesOfSelectedCuboids: '所有选中长方体所有的侧面',\r\n AllSidesOfAllCuboids: '所有的长方体所有的侧面',\r\n AddPolygon: '添加多边形',\r\n Stackable: '可堆砌',\r\n GroupMaster: '主长方体',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n TextBox: '文字框',\r\n FontOutlineColor: '字体轮廓颜色',\r\n FontOutlineWidth: '字体轮廓线宽',\r\n FontStrokeColor: '字体描边颜色',\r\n FontStrokeWidth: '字体描边线宽',\r\n NoOutline: '无轮廓线',\r\n Shiny: '光泽',\r\n Filled: '填充',\r\n FillTexture: '填充材质',\r\n FillColor: '填充颜色',\r\n Opacity: '遮光度',\r\n LineColor: '线条颜色',\r\n LineWidth: '线条宽度',\r\n LineStyle: '线条样式',\r\n SolidLine: '实线',\r\n DashedLine: '虚线',\r\n DottedLine: '点线',\r\n InsertVertexBeforeIndex: '前面插入顶点',\r\n InsertVertexAfterIndex: '后面插入顶点',\r\n DeleteVertex: '移除顶点',\r\n OnlyThisPolygon: '只这个多边形',\r\n AllPolygonsOnSurface: '同一表面上所有的多边形',\r\n AllPolygonsAboveFoundation: '同一地基上所有的多边形',\r\n AllSelectedPolygons: '所有选中的多边形',\r\n AllPolygons: '所有的多边形',\r\n Layout: '布局',\r\n SolarPanelArrayLayout: '光伏板阵列布局',\r\n SolarPanelArrayLayoutParametricDesign: '光伏板阵列布局参数化设计',\r\n SolarPanelArrayLayoutGenerativeDesign: '光伏板阵列布局生成式设计',\r\n SolarPanelArrayModel: '光伏板型号',\r\n SolarPanelArrayOrientation: '排列方向',\r\n SolarPanelArrayTiltAngle: '倾斜角度',\r\n SolarPanelArrayRowWidth: '行宽度',\r\n SolarPanelArrayInterRowSpacing: '行间距',\r\n SolarPanelArrayRowSpacing: '行间距',\r\n SolarPanelArrayRowAxis: '行轴方向',\r\n SolarPanelArrayLeftRightRowAxis: '左右方向(相对)',\r\n SolarPanelArrayUpDownRowAxis: '上下方向(相对)',\r\n SolarPanelArrayEastWestRowAxis: '东西方向(绝对)',\r\n SolarPanelArrayNorthSouthRowAxis: '南北方向(绝对)',\r\n SolarPanelArrayMargin: '边缘余地',\r\n SolarPanelArrayPoleHeight: '支架高度',\r\n SolarPanelArrayPoleSpacing: '支柱间隔',\r\n SolarPanelArrayTotalYearlyCost: '全年总成本',\r\n SolarPanelArrayTotalYearlyRevenue: '全年总收入',\r\n SolarPanelArrayTotalYearlyYield: '全年总发电量',\r\n SolarPanelArrayMeanYearlyYield: '平均年发电量',\r\n SolarPanelArrayYearlyProfit: '全年利润',\r\n LayoutNotAcceptedCheckYourParameters: '恕不能采用此布局。请检查您的参数设置。',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: '优化',\r\n Parameters: '参数',\r\n Variables: '变量',\r\n Constants: '常量',\r\n GeneticAlgorithm: '遗传算法',\r\n GeneticAlgorithmSettings: '遗传算法设定',\r\n ParticleSwarmOptimization: '粒子群优化',\r\n ParticleSwarmOptimizationSettings: '粒子群优化设定',\r\n SolarPanelTiltAngleOptimization: '光伏板倾斜角度优化',\r\n SolarPanelArrayLayout: '光伏板阵列布局',\r\n Generation: '世代',\r\n Gene: '基因',\r\n NormalizedVariables: '标准化变量',\r\n Objective: '目标函数',\r\n ObjectiveFunctionDailyTotalYield: '当日总产出',\r\n ObjectiveFunctionYearlyTotalYield: '全年总产出',\r\n ObjectiveFunctionDailyMeanYield: '当日平均产出',\r\n ObjectiveFunctionYearlyMeanYield: '全年平均产出',\r\n ObjectiveFunctionDailyProfit: '当日利润',\r\n ObjectiveFunctionYearlyProfit: '全年利润',\r\n GeneticAlgorithmSelectionMethod: '遗传算法选择方法',\r\n RouletteWheel: '轮盘制',\r\n Tournament: '淘汰制',\r\n SearchMethod: '搜索方法',\r\n GlobalSearchUniformSelection: '全局搜索均匀取样',\r\n LocalSearchRandomOptimization: '局部搜索随机优化',\r\n PopulationSize: '种群个体数目',\r\n MaximumGenerations: '最大世代数目',\r\n SelectionRate: '选择概率',\r\n CrossoverRate: '交配概率',\r\n MutationRate: '突变概率',\r\n Step: '步数',\r\n SwarmSize: '粒子数目',\r\n MaximumSteps: '最大步数',\r\n MaximumVelocity: '最大速度',\r\n InertiaWeight: '惯性权重',\r\n CognitiveCoefficient: '认知系数',\r\n SocialCoefficient: '社会系数',\r\n ConvergenceThreshold: '终止条件的收敛阈值',\r\n LocalSearchRadius: '局部搜索的半径',\r\n RowsPerRackRange: '单个支架上光伏板行数的变化范围',\r\n TiltAngleRange: '光伏板倾斜角度的变化范围',\r\n InterRowSpacingRange: '光伏板阵列行间距的变化范围',\r\n ClickTargetPolygonToActivate: '点击目标多边形激活',\r\n ClickTargetFoundationToActivate: '点击目标地基激活',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: '显示近似模型',\r\n Flip: '翻转',\r\n Type: '树种',\r\n Spread: '树冠直径',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: '翻转',\r\n Type: '品种',\r\n Spread: '直径',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: '改变人物',\r\n Flip: '转身',\r\n Observer: '观察者',\r\n ViewFromThisPerson: '视角移到此人位置',\r\n },\r\n\r\n lightMenu: {\r\n Color: '颜色',\r\n Intensity: '亮度',\r\n Decay: '衰减',\r\n MaximumDistance: '最大距离',\r\n Inside: '内部',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: '相对方位角',\r\n Pole: '支柱',\r\n PoleHeight: '支柱高度',\r\n PoleRadius: '支柱半径',\r\n ExtraPoleHeight: '额外的支柱高度',\r\n ExtraPoleHeightInAdditionToHalfWidth: '宽度一半额外的支柱高度',\r\n DrawSunBeam: '显示光束',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: '反射器镜面反射率',\r\n ReceiverAbsorptance: '接收器吸收率',\r\n ReflectorOpticalEfficiency: '反射器光效率',\r\n ReceiverThermalEfficiency: '接收器热效率',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: '逆变器效率',\r\n InverterEfficiencyExplained: '直流电转换为交流电的效率。',\r\n DcToAcSizeRatio: '直流-交流容量比例',\r\n DcToAcSizeRatioExplained: '直流电容量和交流电容量的比例。',\r\n ChangePvModel: '改变光伏板型号',\r\n Orientation: '排列方向',\r\n Portrait: '纵向',\r\n Landscape: '橫向',\r\n FrameColor: '框架颜色',\r\n Panels: '块',\r\n PanelsWide: '块光伏板宽',\r\n PanelsLong: '块光伏板长',\r\n TiltAngle: '倾斜角度',\r\n SouthFacingIsPositive: '朝南为正',\r\n Tracker: '追日系统',\r\n SolarTrackerFollowsSun: '追日系统提高光伏板产出。',\r\n PoleSpacing: '支柱间隔',\r\n NoTracker: '无追日系统',\r\n HorizontalSingleAxisTracker: '水平单轴追日系统',\r\n VerticalSingleAxisTracker: '竖直单轴追日系统',\r\n AltazimuthDualAxisTracker: '地平双轴追日系统',\r\n OnlyThisSolarPanel: '只这个光伏板',\r\n AllSolarPanelsOnSurface: '同一表面上所有的光伏板',\r\n AllSolarPanelsAboveFoundation: '同一地基上所有的光伏板',\r\n AllSelectedSolarPanels: '所有选中的光伏板',\r\n AllSolarPanels: '所有的光伏板',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: '光伏板型号性能',\r\n Model: '型号',\r\n PanelSize: '尺寸',\r\n Cells: '电池組',\r\n CellType: '光伏电池类型',\r\n Monocrystalline: '单晶硅',\r\n Polycrystalline: '多晶硅',\r\n ThinFilm: '薄膜',\r\n Bifacial: '双面',\r\n BifacialityFactor: '双面性因子',\r\n Black: '黑色',\r\n Blue: '蓝色',\r\n ShadeTolerance: '阴影耐受度',\r\n SolarCellEfficiency: '光伏电池效率',\r\n NominalOperatingCellTemperature: '名义电池运行温度',\r\n TemperatureCoefficientOfPmax: 'Pmax温度系数',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: '模块长度',\r\n Modules: '模块',\r\n ModulesLong: '模块长',\r\n LatusRectum: '通径',\r\n OnlyThisParabolicTrough: '只这个抛物线槽',\r\n AllParabolicTroughsAboveFoundation: '同一地基上所有的抛物线槽',\r\n AllSelectedParabolicTroughs: '所有选中的抛物线槽',\r\n AllParabolicTroughs: '所有的抛物线槽',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: '吸收管',\r\n SelectAbsorberToReflectSunlightTo: '选择阳光反射到的吸收管',\r\n ModuleLength: '模块长度',\r\n Modules: '模块',\r\n ModulesLong: '模块长',\r\n OnlyThisFresnelReflector: '只这个菲涅耳反射镜',\r\n AllFresnelReflectorsAboveFoundation: '同一地基上所有的菲涅耳反射镜',\r\n AllSelectedFresnelReflectors: '所有选中的菲涅耳反射镜',\r\n AllFresnelReflectors: '所有的菲涅耳反射镜',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: '吸收塔',\r\n SelectTowerToReflectSunlightTo: '选择阳光反射到的吸收塔',\r\n OnlyThisHeliostat: '只这个定日镜',\r\n AllHeliostatsAboveFoundation: '同一地基上所有的定日镜',\r\n AllSelectedHeliostats: '所有选中的定日镜',\r\n AllHeliostats: '所有的定日镜',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: '接收器结构',\r\n CentralPole: '中心直柱',\r\n CentralPoleWithTripod: '三脚架和中心直柱',\r\n Quadrupod: '四脚架',\r\n RimDiameter: '外圈直径',\r\n LatusRectum: '通径',\r\n ExtraPoleHeightInAdditionToRadius: '半径之外额外的支架高度',\r\n OnlyThisParabolicDish: '只这个抛物线碟',\r\n AllParabolicDishesAboveFoundation: '同一地基上所有的抛物线碟',\r\n AllSelectedParabolicDishes: '所有选中的抛物线碟',\r\n AllParabolicDishes: '所有的抛物线碟',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: '默认材质',\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n SizeOfWall: '墙的尺寸',\r\n OnlyThisWall: '只这堵墙',\r\n AllConnectedWalls: '所有连接的墙',\r\n AllWallsAboveFoundation: '同一地基上所有的墙',\r\n AllSelectedWalls: '所有选中的墙',\r\n AllWalls: '所有的墙',\r\n Windows: '窗户',\r\n LockAllWindows: '固定所有的窗户',\r\n UnlockAllWindows: '解除所有的窗户固定',\r\n RemoveAllUnlockedWindows: '删除这堵墙上所有非固定的窗户',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: '你确定删除这堵墙上所有非固定的窗户吗',\r\n Doors: '门',\r\n RemoveAllUnlockedDoors: '删除这堵墙上所有非固定的门',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: '你确定删除这堵墙上所有非固定的门吗',\r\n SolarPanels: '光伏板',\r\n LockAllSolarPanels: '固定所有的光伏板',\r\n UnlockAllSolarPanels: '解除所有的光伏板固定',\r\n RemoveAllUnlockedSolarPanels: '删除这堵墙上所有非固定的光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: '你确定删除这堵墙上所有非固定的光伏板吗',\r\n Sensors: '传感器',\r\n LockAllSensors: '固定所有的传感器',\r\n UnlockAllSensors: '解除所有的传感器固定',\r\n RemoveAllUnlockedSensors: '删除这堵墙上所有非固定的传感器',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: '你确定删除这堵墙上所有非固定的传感器吗',\r\n Lights: '电灯',\r\n RemoveAllUnlockedLights: '删除这堵墙上所有非固定的电灯',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: '你确定删除这堵墙上所有非固定的电灯吗',\r\n LockAllPolygons: '固定这堵墙上所有的多边形',\r\n UnlockAllPolygons: '解除这堵墙上所有的多边形固定',\r\n RemoveAllUnlockedPolygons: '删除这堵墙上所有非固定的多边形',\r\n WallStructure: '墙结构',\r\n DefaultStructure: '默认',\r\n StudStructure: '墙柱',\r\n PillarStructure: '圆柱',\r\n Opacity: '遮光度',\r\n StructureSpacing: '结构间距',\r\n StructureWidth: '结构宽度',\r\n StructureThickness: '结构厚度',\r\n StructureColor: '结构颜色',\r\n Color: '牆体颜色',\r\n Height: '高度',\r\n Thickness: '厚度',\r\n Texture: '材质',\r\n AllLightsOnWallInside: '所有电灯在牆内',\r\n AllLightsOnWallOutside: '所有电灯在牆外',\r\n Fill: '填充',\r\n Full: '全部',\r\n Partial: '部分',\r\n Empty: '空白',\r\n OpenToOutside: '对外面开放',\r\n EavesLength: '屋檐延伸长度',\r\n Parapet: '女墙',\r\n ParapetColor: '女墙颜色',\r\n ParapetTexture: '女墙材质',\r\n ParapetHeight: '女墙高度',\r\n CopingsHeight: '顶盖高度',\r\n CopingsWidth: '顶盖宽度',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: '只这个窗户',\r\n AllWindowsOnSurface: '同一表面上所有的窗户',\r\n AllWindowsAboveFoundation: '同一地基上所有的窗户',\r\n AllSelectedWindows: '所有选中的窗户',\r\n AllWindows: '所有的窗户',\r\n Width: '宽度',\r\n Height: '高度',\r\n Setback: '离墙体外表面的距离',\r\n RelativeToWallThickness: '相对于墙的厚度',\r\n Mullion: '直棂',\r\n HorizontalMullion: '水平的直棂',\r\n VerticalMullion: '竖直的直棂',\r\n MullionWidth: '直棂宽度',\r\n HorizontalMullionSpacing: '水平直棂的间距',\r\n VerticalMullionSpacing: '竖直直棂的间距',\r\n MullionColor: '直棂颜色',\r\n Tint: '着色',\r\n Opacity: '不透明度',\r\n SolarHeatGainCoefficient: '太阳辐射热获取系数(SHGC) = 1 - 不透明度',\r\n Shutter: '百叶窗',\r\n LeftShutter: '左侧百叶窗',\r\n RightShutter: '右侧百叶窗',\r\n BothShutters: '两侧百叶窗',\r\n ShutterWidth: '相对宽度',\r\n ShutterColor: '百叶窗颜色',\r\n Frame: '边框',\r\n FrameWidth: '边框宽度',\r\n SillWidth: '窗台宽度',\r\n Color: '边框颜色',\r\n WindowType: '窗户种类',\r\n Default: '默认',\r\n Arched: '拱形',\r\n Polygonal: '多边形',\r\n Interior: '内窗',\r\n Empty: '空白',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: '默认材质',\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n OnlyThisRoof: '只这个屋顶',\r\n AllRoofsAboveFoundation: '同一地基上所有的屋顶',\r\n AllSelectedRoofs: '所有选中的屋顶',\r\n AllRoofs: '所有的屋顶',\r\n OnlyThisCeiling: '只这个天花板',\r\n AllCeilingsAboveFoundation: '同一地基上所有的天花板',\r\n AllCeilings: '所有的天花板',\r\n EavesOverhangLength: '屋檐延伸长度',\r\n RafterSpacing: '屋椽间距',\r\n RafterWidth: '屋椽宽度',\r\n RafterThickness: '屋椽厚度',\r\n RafterColor: '屋椽颜色',\r\n RoofColor: '屋顶颜色',\r\n RoofSideColor: '屋顶侧面颜色',\r\n GlassTint: '玻璃颜色',\r\n Opacity: '遮光度',\r\n RoofStructure: '屋顶结构',\r\n DefaultStructure: '默认',\r\n RafterStructure: '屋椽',\r\n GlassStructure: '玻璃',\r\n SolarPanels: '光伏板',\r\n LockAllSolarPanels: '固定所有的光伏板',\r\n UnlockAllSolarPanels: '解除所有的光伏板固定',\r\n RemoveAllUnlockedSolarPanels: '删除这个屋顶上所有非固定的光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: '你确定删除这个屋顶上所有非固定的光伏板吗',\r\n Windows: '天窗',\r\n LockAllWindows: '固定所有的天窗',\r\n UnlockAllWindows: '解除所有的天窗固定',\r\n RemoveAllUnlockedWindows: '删除这个屋顶上所有非固定的天窗',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: '你确定删除这个屋顶上所有非固定的天窗吗',\r\n Sensors: '传感器',\r\n LockAllSensors: '固定所有的传感器',\r\n UnlockAllSensors: '解除所有的传感器固定',\r\n RemoveAllUnlockedSensors: '删除这个屋顶上所有非固定的传感器',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: '你确定删除这个屋顶上所有非固定的传感器吗',\r\n Lights: '电灯',\r\n RemoveAllUnlockedLights: '删除这个屋顶上所有非固定的电灯',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: '你确定删除这个屋顶上所有非固定的电灯吗',\r\n AllLightsOnRoofInside: '所有电灯在屋顶内',\r\n AllLightsOnRoofOutside: '所有电灯在屋顶外',\r\n Rise: '相对高度',\r\n Ceiling: '天花板',\r\n RoofRValue: '屋顶R值',\r\n CeilingRValue: '天花板R值',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: '默认材质',\r\n Texture01: '一号材质',\r\n Texture02: '二号材质',\r\n Texture03: '三号材质',\r\n Texture04: '四号材质',\r\n Texture05: '五号材质',\r\n Texture06: '六号材质',\r\n Texture07: '七号材质',\r\n Texture08: '八号材质',\r\n Texture09: '九号材质',\r\n Texture10: '十号材质',\r\n Texture11: '十一号材质',\r\n Texture12: '十二号材质',\r\n Texture13: '十三号材质',\r\n Texture14: '十四号材质',\r\n Texture15: '十五号材质',\r\n Texture16: '十六号材质',\r\n Texture17: '十七号材质',\r\n OnlyThisDoor: '只这个门',\r\n AllDoorsOnWall: '同一面墙上所有的门',\r\n AllDoorsAboveFoundation: '同一地基上所有的门',\r\n AllSelectedDoors: '所有选中的门',\r\n AllDoors: '所有的门',\r\n DoorType: '门种类',\r\n Default: '默认',\r\n Arched: '拱形',\r\n Filled: '填充',\r\n FrameColor: '门框颜色',\r\n Interior: '内门',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: '最高温度',\r\n Low: '最低温度',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: '选中的定日镜总数',\r\n NumberOfSelectedSolarPanels: '选中的光伏板总数',\r\n ElectricityGeneratedDailyBySolarPanels: '这些光伏板的日发电量',\r\n SceneDiameter: '场景直径',\r\n BuildingArea: '建筑面积',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: '热图颜色对比度',\r\n FluxScale: '热通量长度',\r\n ClickUpOrDownArrowButtonsToChange: '点击上下箭头改变参数',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: '旋转',\r\n DragMouse: '拖动鼠标',\r\n Zoom: '缩放',\r\n MouseWheelOrKeys: '鼠标滚轮或者Ctrl+[和Ctrl+]',\r\n MouseWheelOrKeysMac: '鼠标滚轮或者⌘+[和⌘+]',\r\n Pan: '平移',\r\n HoldCtrlDragMouse: '按下Ctrl键并拖动鼠标',\r\n HoldMetaDragMouse: '按下⌘键并拖动鼠标',\r\n Enter2DMode: '進入二维模式',\r\n Exit2DMode: '退出二维模式',\r\n NavigationMode: '导航模式',\r\n EnableNavigation: '進入导航模式',\r\n DisableNavigation: '退出导航模式',\r\n MoveForwardBack: '前后移动',\r\n MoveForwardBackInstruction: '按W/S键',\r\n MoveLeftRight: '左右移动',\r\n MoveLeftRightInstruction: '按A/D键',\r\n MoveUpDown: '上下移动',\r\n MoveUpDownInstruction: '按Z/X键',\r\n Turn: '拐弯',\r\n TurnInstruction: '按方向键',\r\n ResetView: '重置视角',\r\n AutoRotate: '自动旋转',\r\n StartOrStop: '按F4键启动或停止',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: '地面显示图像',\r\n WeatherStations: '气象站',\r\n WeatherStationsNote: '关闭此选项以提高地图速度',\r\n Coordinates: '经纬度坐标',\r\n Zoom: '放大程度',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: '光伏板对观察者的可见度',\r\n Observer: '观察者',\r\n VantagePoint: '观察位置',\r\n ItemizedVisibilityByFields: '每个场的可见度',\r\n TotalVisibility: '总可见度',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: '光传感器',\r\n WeatherDataFrom: '气象数据来自',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: '建筑物日能耗',\r\n YearlyBuildingEnergy: '建筑物年能耗',\r\n Heater: '暖气',\r\n AC: '空调',\r\n SolarPanel: '光伏',\r\n Net: '净能耗',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: '光伏日发电量',\r\n SolarPanelYearlyYield: '光伏年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualSolarPanels: '显示每行光伏板单独发电量',\r\n Profit: '利润',\r\n TotalCost: '总成本',\r\n TotalRevenue: '总收入',\r\n TotalYield: '总发电量',\r\n MeanYield: '平均发电量',\r\n ModuleCount: '光伏板总数',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: '抛物线槽日发电量',\r\n ParabolicTroughYearlyYield: '抛物线槽年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualParabolicTroughs: '显示每行抛物线槽单独发电量',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: '抛物线碟日发电量',\r\n ParabolicDishYearlyYield: '抛物线碟年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualParabolicDishes: '显示每个抛物线碟单独发电量',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: '菲涅耳反射镜日发电量',\r\n FresnelReflectorYearlyYield: '菲涅耳反射镜年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualFresnelReflectors: '显示每个菲涅耳反射镜单独发电量',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: '定日镜日发电量',\r\n HeliostatYearlyYield: '定日镜年发电量',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualHeliostats: '显示每个定日镜单独发电量',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: '太阳能上升气流塔日发电量',\r\n UpdraftTowerYearlyYield: '太阳能上升气流塔年发电量',\r\n ChimneyAirTemperature: '烟囱空气温度',\r\n ChimneyWindSpeed: '烟囱风速',\r\n Yield: '发电量',\r\n YieldPerHour: '每小时发电量',\r\n DailyTotal: '日发电总量',\r\n YearlyTotal: '年发电总量',\r\n ShowOutputsOfIndividualUpdraftTowers: '显示每个太阳能上升气流塔单独发电量',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: '太阳和时间设置',\r\n SunAngles: '角度',\r\n TwentyFourHours: '24小时',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: '拷贝标题',\r\n TitleCopiedToClipBoard: '标题拷贝到剪贴板',\r\n SearchByTitle: '按标题搜索',\r\n MyLikes: '我喜欢的模型',\r\n MyCloudFiles: '我的云文件',\r\n GenerateLink: '生成链接',\r\n LinkGeneratedInClipBoard: '链接生成到剪贴板',\r\n DoYouReallyWantToDelete: '您确定删除此文件',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks: '如果此文件已被分享或发布, 改名会使已有链接失效',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: '拷贝标题',\r\n TitleCopiedToClipBoard: '标题拷贝到剪贴板',\r\n SearchByTitle: '按标题搜索',\r\n MyProjects: '我的项目',\r\n GenerateProjectLink: '生成项目链接',\r\n ProjectLinkGeneratedInClipBoard: '项目链接生成到剪贴板',\r\n DoYouReallyWantToDeleteProject: '您确定删除项目',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks: '如果此项目已被分享或发布, 改名会使已有链接失效',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: '项目设定',\r\n ThumbnailImageSize: '缩略图大小',\r\n ProjectByOtherPeople: '别人的项目',\r\n Project: '项目',\r\n ProjectType: '类别',\r\n ProjectDescription: '描述',\r\n MakeDescriptionEditable: '编辑描述',\r\n MakeDescriptionNonEditable: '不编辑描述',\r\n DoubleClickToMakeDescriptionEditable: '双击此描述激活编辑功能',\r\n SolarPanelArray: '光伏板阵列设计',\r\n CurateCurrentDesign: '收藏当前设计',\r\n UpdateSelectedDesign: '更新选中设计',\r\n RemoveSelectedDesign: '删除选中设计',\r\n ClickToFlipSortingOrder: '点击逆转排序方向',\r\n DesignNotShownInSolutionSpaceClickToShow: '此设计目前不显示在设计空间内,点击显示',\r\n DesignShownInSolutionSpaceClickToHide: '此设计目前显示在设计空间内,点击隐藏',\r\n DistributionInSolutionSpace: '方案在设计空间里的分布',\r\n ChooseSolutionSpace: '选择设计空间',\r\n ChooseDataColoring: '选择数据着色',\r\n SameColorForAllDesigns: '所有设计一个颜色',\r\n OneColorForEachDesign: '每个设计一个颜色',\r\n SolutionSpaceScreenshot: '设计空间截图',\r\n ScatteredPlotScreenshot: '散点图截图',\r\n SingleClickToSelectDoubleClickToOpen: '单击选择,双击打开。',\r\n SingleClickToDeselectDoubleClickToOpen: '单击取消选择,双击打开。',\r\n GenerateScatteredPlot: '生成散点图',\r\n SelectXAxis: '选择X轴',\r\n SelectYAxis: '选择Y轴',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: '我的账户设定',\r\n MyID: '我的🆔',\r\n ClickToCopyMyID: '点击此处拷贝我的ID',\r\n IDInClipBoard: '您现在可以粘贴ID了。',\r\n StoreMyNameInMyFilesWhenSaving: '保存文件时签上我的大名',\r\n DoYouReallyWantToShowYourNameInYourFiles: '您确定在您的文件里保存您的大名吗?',\r\n SignFileDisclaimer: '如果您选择保存,您的大名可能被所有打开您的文件的人看到。',\r\n Likes: '点赞总数',\r\n AllPublished: '发布总数',\r\n PublishedUnderAliases: '别名发布',\r\n UserCount: '用户总数',\r\n SchoolID: '学校编号',\r\n ClassID: '班级编号',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: '日照时间',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: '选择气温模型',\r\n Sinusoidal: '正弦函数',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: '经济学参数',\r\n ElectricitySellingPrice: '销售电价',\r\n OperationalCostPerUnit: '单位运行成本',\r\n SellingPrice: '销售电价',\r\n UnitCost: '单位成本',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: '导航模式参数',\r\n MinimumMoveSpeed: '最小移动速度',\r\n MinimumTurnSpeed: '最小拐弯速度',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: '天空清晰度',\r\n ShowDaylightResults: '显示日照时间结果',\r\n ShowSkyClearnessResults: '显示天空清晰度结果',\r\n ShowAverageDailySolarRadiation: '显示日平均辐射结果',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: '没有传感器收集数据。',\r\n NoSolarPanelForAnalysis: '没有光伏板可以分析。',\r\n NoObserverForVisibilityAnalysis: '没有找到可见度分析的观察者。',\r\n NoWaterHeaterForAnalysis: '沒有太阳能热水器可以分析。',\r\n NoParabolicDishForAnalysis: '沒有抛物线碟可以分析。',\r\n NoParabolicTroughForAnalysis: '沒有抛物线槽可以分析。',\r\n NoFresnelReflectorForAnalysis: '沒有菲涅耳反射镜可以分析。',\r\n NoHeliostatForAnalysis: '沒有定日镜可以分析。',\r\n NoSolarUpdraftTowerForAnalysis: '沒有太阳能上升气流塔可以分析。',\r\n NoBuildingForAnalysis: '沒有建筑物可以分析。',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: '云文件',\r\n Select: '选择',\r\n AddFoundation: '添加地基',\r\n AddWall: '添加墙体',\r\n AddWindow: '添加窗户',\r\n AddDoor: '添加门',\r\n AddPyramidRoof: '添加金字塔屋顶',\r\n AddGableRoof: '添加双坡屋顶',\r\n AddHipRoof: '添加四坡屋顶',\r\n AddGambrelRoof: '添加复斜屋顶',\r\n AddMansardRoof: '添加折线屋顶',\r\n AddCuboid: '添加长方体',\r\n AddSensor: '添加传感器',\r\n AddSolarPanel: '添加光伏板',\r\n AddWaterHeater: '添加太阳能热水器',\r\n AddParabolicDish: '添加抛物线碟',\r\n AddParabolicTrough: '添加抛物线槽',\r\n AddFresnelReflector: '添加菲涅耳反射镜',\r\n AddHeliostat: '添加定日镜',\r\n AddWindTurbine: '添加风力涡轮机',\r\n AddLight: '添加电灯',\r\n AddTree: '添加树木',\r\n AddFlower: '添加花草',\r\n AddPeople: '添加人物',\r\n DoubleClickToLockThisModeForNextAction: '双击按钮给下个动作锁定此模式',\r\n ClickToUnlockThisModeForNextAction: '点击按钮让动作完成即离开此模式',\r\n ManipulateGroup: '整体操作一个组',\r\n ClearScene: '清空场景',\r\n ShowSunAndTimeSettings: '显示太阳和时间设置',\r\n SpatialAnalysisOfEnergy: '能量的空间分析',\r\n DoYouReallyWantToClearContent: '您确定清空场景吗',\r\n ClickForMoreButtons: '点击此处切换到更多的按钮模式',\r\n SwitchToAddingFoundation: '切换到添加地基模式',\r\n SwitchToAddingCuboid: '切换到添加长方体模式',\r\n SwitchToAddingWall: '切换到添加墙体模式',\r\n SwitchToAddingWindow: '切换到添加窗户模式',\r\n SwitchToAddingDoor: '切换到添加门模式',\r\n SwitchToAddingPyramidRoof: '切换到添加金字塔屋顶模式',\r\n SwitchToAddingGableRoof: '切换到添加双坡屋顶模式',\r\n SwitchToAddingHipRoof: '切换到添加四坡屋顶模式',\r\n SwitchToAddingGambrelRoof: '切换到添加复斜屋顶模式',\r\n SwitchToAddingMansardRoof: '切换到添加折线屋顶模式',\r\n SwitchToAddingSolarPanel: '切换到添加光伏板模式',\r\n SwitchToAddingSensor: '切换到添加传感器模式',\r\n SwitchToAddingWaterHeater: '切换到添加太阳能热水器模式',\r\n SwitchToAddingParabolicDish: '切换到添加抛物线碟模式',\r\n SwitchToAddingParabolicTrough: '切换到添加抛物线槽模式',\r\n SwitchToAddingFresnelReflector: '切换到添加菲涅耳反射镜模式',\r\n SwitchToAddingHeliostat: '切换到添加定日镜模式',\r\n SwitchToAddingWindTurbine: '切换到添加风力涡轮机模式',\r\n SwitchToAddingLight: '切换到添加电灯模式',\r\n SwitchToAddingTree: '切换到添加树木模式',\r\n SwitchToAddingFlower: '切换到添加花草模式',\r\n SwitchToAddingPeople: '切换到添加人物模式',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: '访问未来智能研究所',\r\n visitAladdinHomePage: '访问阿拉丁主页',\r\n clickToOpenMenu: '点击打开主菜单',\r\n clickToAccessAccountSettings: '点击打开账号设定',\r\n },\r\n\r\n tree: {\r\n Apple: '苹果树',\r\n Birch: '白桦',\r\n Coconut: '椰子树',\r\n Dogwood: '茱萸',\r\n Elm: '榆树',\r\n FanPalm: '扇叶棕榈',\r\n Linden: '菩提',\r\n Magnolia: '玉兰',\r\n Maple: '枫树',\r\n Oak: '橡树',\r\n Pine: '松树',\r\n Spruce: '云杉',\r\n },\r\n\r\n flower: {\r\n Bellflower: '铃兰',\r\n Boxwood: '黄杨',\r\n CactusCombo1: '仙人掌组合一',\r\n CactusCombo2: '仙人掌组合二',\r\n CactusCombo3: '仙人掌组合三',\r\n CactusCombo4: '仙人掌组合四',\r\n Hibiscus: '木槿',\r\n Hosta: '玉簪',\r\n Hydrangea: '绣球花',\r\n Peony: '牡丹',\r\n RedRose: '红玫瑰',\r\n Spirea: '绣线菊',\r\n Sunflower: '向日葵',\r\n TallBush: '高灌木',\r\n Tulip: '郁金香',\r\n WhiteFlower: '白花',\r\n YellowFlower: '黄花',\r\n },\r\n\r\n people: {\r\n Jaah: '贾阿',\r\n Jack: '杰克',\r\n Jacob: '雅各布',\r\n Jacqueline: '杰奎琳',\r\n Jade: '美玉',\r\n Jamelia: '洁米莉雅',\r\n James: '詹姆斯',\r\n Jane: '简',\r\n Jaya: '佳娅',\r\n Jaye: '杰伊',\r\n Jeanette: '珍妮特',\r\n Jedi: '杰迪',\r\n Jeff: '杰夫',\r\n Jena: '珍娜',\r\n Jennifer: '珍尼弗',\r\n Jess: '杰西',\r\n Jett: '杰特',\r\n Jill: '吉尔',\r\n Jiya: '吉娅',\r\n Joan: '琼',\r\n Jocelyn: '乔斯林',\r\n Joel: '乔尔',\r\n Joey: '乔伊',\r\n John: '约翰',\r\n Jonathon: '乔纳森',\r\n Jose: '何塞',\r\n Joseph: '约瑟夫',\r\n Joshua: '约书亚',\r\n Judd: '贾德',\r\n Judy: '朱蒂',\r\n Julia: '朱莉娅',\r\n Julio: '胡里奥',\r\n Jumapili: '祖玛匹莉',\r\n June: '准卫',\r\n Juro: '朱诺',\r\n Justin: '贾斯汀',\r\n },\r\n\r\n compass: {\r\n N: '北',\r\n S: '南',\r\n W: '西',\r\n E: '东',\r\n },\r\n\r\n month: {\r\n January: '一月',\r\n February: '二月',\r\n March: '三月',\r\n April: '四月',\r\n May: '五月',\r\n June: '六月',\r\n July: '七月',\r\n August: '八月',\r\n September: '九月',\r\n October: '十月',\r\n November: '十一月',\r\n December: '十二月',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: '按发布者搜索',\r\n SearchByLabel: '按标签搜索',\r\n MyPublishedModels: '我发布的模型',\r\n TotalNumberOfUserPublishedModels: '用户发布的模型总数',\r\n SortFromOldestToNewest: '从早到晚排序',\r\n SortFromNewestToOldest: '从晚到早排序',\r\n ModelsFoundOnThisSite: '个模型在此位置',\r\n ShowModelsPublishedByThisAuthor: '展示此用户发布的模型',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_zh_tw = {\r\n translation: {\r\n name: {\r\n IFI: '未來智能研究所',\r\n Aladdin: '阿拉丁',\r\n Tagline: '阿拉丁: 探索人工智慧時代的設計軟體 — 未來智能研究所研發',\r\n },\r\n\r\n cookie: {\r\n Statement: '聲明:為了改善您的用戶體驗,阿拉丁採用cookie儲存少量數據。',\r\n Accept: '同意',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: '未來智能研究所榮譽出品',\r\n TermsOfService: '服務條款',\r\n PrivacyPolicy: '隱私政策',\r\n Software: '軟體',\r\n Content: '課件',\r\n Research: '研究',\r\n Support: '服務',\r\n Acknowledgment: '鳴謝',\r\n FundingInformation:\r\n '本產品的研發承蒙美國國家科學基金會慷慨資助(項目號#2105695,#2131097,#2301164)。本產品的任何觀點或結論僅代表創作者個人意見。',\r\n Contact: '如您需要更多資訊,請聯繫 Charles Xie (charles@intofuture.org)。我們會盡快回复。',\r\n Translators: '翻譯',\r\n },\r\n\r\n word: {\r\n LastUpdate: '上一次更新',\r\n Small: '小',\r\n Medium: '中',\r\n Large: '大',\r\n Design: '設計',\r\n Information: '資訊',\r\n Type: '類别',\r\n Text: '文字',\r\n FontSize: '字體大小',\r\n FontColor: '字體顏色',\r\n Model: '模型',\r\n Models: '模型',\r\n Upload: '上傳',\r\n ClickCount: '點擊數',\r\n Share: '分享',\r\n AlreadyLike: '已點贊',\r\n Like: '點贊',\r\n MustLogInToLike: '必須登錄才能點贊',\r\n AllRightsReserved: '版權所有',\r\n MeterAbbreviation: '米',\r\n Version: '版本',\r\n VersionInitial: '版本',\r\n Options: '選項',\r\n Maximum: '最大',\r\n Minimum: '最小',\r\n MaximumNumber: '最多',\r\n MinimumNumber: '最少',\r\n MaximumValue: '最大值',\r\n MinimumValue: '最小值',\r\n Or: '或',\r\n None: '無',\r\n High: '高',\r\n Partial: '部分',\r\n Teacher: '老師',\r\n Class: '班級',\r\n Total: '總數',\r\n Leaderboard: '用戶排行榜',\r\n Latest: '最新',\r\n Range: '範圍',\r\n SIUnit: '國際單位制',\r\n USUnit: '美國單位制',\r\n ThermalTransmittance: '熱透過率',\r\n ThermalResistance: '熱阻',\r\n UValue: 'U值',\r\n RValue: 'R值',\r\n VolumetricHeatCapacity: '容積熱容',\r\n BuildingHVACSystem: '建築物暖通空調系統',\r\n ThermostatSetpoint: '恆溫器設定值',\r\n TemperatureToleranceThreshold: '溫度忍耐閾值',\r\n TemperatureToleranceThresholdExplanation:\r\n '當日最低外面溫度高於恆溫器設定值減去此閾值,暖氣不開。\\n當日最高外面溫度低於恆溫器設定值加上此閾值,空調不開。',\r\n Press: '按',\r\n Open: '打開',\r\n Save: '保存',\r\n SaveAsImage: '保存為圖像',\r\n SaveAsCsv: '保存為CSV',\r\n Update: '刷新',\r\n Paste: '粘貼',\r\n Copy: '複製',\r\n Cut: '剪切',\r\n Delete: '删除',\r\n Lock: '固定',\r\n Translucent: '半透明',\r\n Color: '顏色',\r\n Texture: '材質',\r\n Thickness: '厚度',\r\n Size: '尺寸',\r\n Yes: '是',\r\n No: '不',\r\n OK: '確定',\r\n Cancel: '取消',\r\n Apply: '應用',\r\n Close: '關閉',\r\n ApplyTo: '適用於',\r\n Run: '運行',\r\n Pause: '暫停',\r\n Resume: '繼續',\r\n Clear: '清空',\r\n Warning: '警告',\r\n Caution: '小心',\r\n Reminder: '提醒',\r\n Length: '長度',\r\n Width: '寬度',\r\n Height: '高度',\r\n Radius: '半徑',\r\n Angle: '角度',\r\n Azimuth: '方位角',\r\n Coordinates: '坐標',\r\n Weather: '天氣',\r\n Show: '顯示',\r\n Animate: '動畫',\r\n Date: '日期',\r\n Time: '時間',\r\n Title: '標題',\r\n Owner: '所有者',\r\n Action: '操作',\r\n Rename: '改名',\r\n Location: '位置',\r\n Latitude: '緯度',\r\n Month: '月份',\r\n Day: '天',\r\n Hour: '小時',\r\n Daylight: '白天長度',\r\n Radiation: '輻射',\r\n Temperature: '温度',\r\n kWh: '千瓦時',\r\n dollar: '元',\r\n MeterPerSecond: '米/秒',\r\n NorthInitial: '北',\r\n SouthInitial: '南',\r\n EastInitial: '東',\r\n WestInitial: '西',\r\n Fixed: '固定',\r\n Elements: '部件',\r\n Energy: '能量',\r\n Unknown: '未知',\r\n Label: '標籤',\r\n Description: '描述',\r\n NoDescription: '無描述',\r\n MaximumCharacters: '最多字符數',\r\n Author: '作者',\r\n Publisher: '發布者',\r\n Building: '建築',\r\n ResidentialBuilding: '住宅建築',\r\n CommercialBuilding: '商用建築',\r\n SchoolBuilding: '學校建築',\r\n TouristAttraction: '旅遊景點',\r\n UnderConstruction: '在建',\r\n Photovoltaic: '光伏',\r\n Anonymous: '無名氏',\r\n Nickname: '别名',\r\n Pin: '置頂',\r\n Unpin: '解除置頂',\r\n },\r\n\r\n shared: {\r\n NoTexture: '無材質',\r\n FoundationElement: '地基',\r\n CuboidElement: '長方體',\r\n PolygonElement: '多邊形',\r\n SensorElement: '傳感器',\r\n SolarPanelElement: '光伏板',\r\n WaterHeaterElement: '太陽能熱水器',\r\n ParabolicDishElement: '拋物線碟',\r\n ParabolicTroughElement: '拋物線槽',\r\n FresnelReflectorElement: '菲涅耳反射鏡',\r\n HeliostatElement: '定日鏡',\r\n WindTurbineElement: '風力渦輪機',\r\n LightElement: '電燈',\r\n ElementLocked: '固定',\r\n ModelType: '模型類别',\r\n OutputBreakdown: '分列發電量',\r\n MoreResults: '更多結果',\r\n },\r\n\r\n message: {\r\n ModelNotFound: '沒有找到模型',\r\n CannotSignIn: '登錄失敗',\r\n CannotSignOut: '退出失敗',\r\n YourAccountWasCreated: '成功建立您的賬號。',\r\n CannotCreateAccount: '無法創建賬號',\r\n YourAccountSettingsWereSaved: '您的賬號設定已保存。',\r\n CannotSaveYourAccountSettings: '您的賬號設定無法保存',\r\n CannotSaveYourFileToCloud: '無法保存您的文檔到雲端',\r\n CannotCreateNewProject: '無法創建新項目',\r\n CannotCreateNewProjectWithoutTitle: '沒有標題, 無法創建新項目',\r\n CannotOpenYourProjects: '無法打開您的項目列表',\r\n CannotOpenProject: '無法打開項目',\r\n CannotDeleteProject: '無法刪除項目',\r\n CannotRenameProject: '無法給項目改名',\r\n CannotAddDesignToProject: '無法把此設計加到項目裡',\r\n CannotAddDesignToProjectOwnedByOthers: '不能把此設計加到別人的項目裡',\r\n DesignRemovedFromProject: '設計被成功地從項目裡刪除',\r\n CannotRemoveDesignFromProject: '無法把此設計從項目裡刪除',\r\n CannotUpdateProject: '無法更新項目',\r\n CannotFetchProjectData: '無法取得項目數據',\r\n TitleUsedChooseDifferentOne: '此標題已經被使用, 請採用不同的標題',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: '使用此標題的雲文檔已經存在,您確定要覆蓋它嗎?',\r\n CloudFileNotFound: '找不到此云端文檔',\r\n CannotLoadModelsOnMap: '無法下載地圖上的模型',\r\n CannotLoadLeaderboard: '無法下載排行榜',\r\n CannotPublishModelOnMap: '模型無法發佈到地圖上',\r\n CannotLikeModelFromMap: '無法點贊地圖上的模型',\r\n CannotDeleteModelFromMap: '無法删除地圖上的模型',\r\n ModelDeletedFromMap: '模型已從地圖上刪除',\r\n DoYouWantToDeleteModelFromMap: '您要删除地圖上的這個模型嗎?',\r\n CannotOpenCloudFile: '此云端文檔無法打開',\r\n CannotReadCloudFile: '無法讀取此云端文檔',\r\n CannotWriteCloudFile: '無法存儲此云端文檔',\r\n CloudFileCopied: '拷貝云端文檔',\r\n CannotOpenCloudFolder: '您的雲端文檔夾無法打開',\r\n CannotDeleteCloudFile: '無法刪除此云端文檔',\r\n CannotRenameCloudFile: '此云端文檔的名字無法更改',\r\n DoYouWantToSaveChanges: '您要保存當前文檔嗎?',\r\n NotApplicableToSelectedAction: '此值不適用於當前選擇範圍',\r\n ThisElementIsLocked: '這個部件被鎖定。',\r\n ThisCannotBeUndone: '這個操作一旦執行就不能撤銷。',\r\n AzimuthOfNorthIsZero: '正北的方位角為零度',\r\n CounterclockwiseAzimuthIsPositive: '逆時針為正',\r\n MoveCancelledBecauseOfOverlap: '位置重疊,移動取消。',\r\n MoveOutsideBoundaryCancelled: '位置出界,移動取消。',\r\n RotationCancelledBecauseOfOverlap: '位置重疊,旋轉取消。',\r\n RotationOutsideBoundaryCancelled: '位置出界,旋轉取消。',\r\n ResizingCancelledBecauseOfOverlap: '位置重疊,尺寸調整取消。',\r\n ResizingOutsideBoundaryCancelled: '位置出界,尺寸調整取消。',\r\n CannotPasteOutsideBoundary: '位置出界,不能複制。',\r\n CannotPasteBecauseOfOverlap: '位置重疊,不能複制。',\r\n CannotMoveObjectTooFar: '位置太遠,移動取消。',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout: '採用新佈局之前必須移除現有的光伏板。',\r\n DoYouWantToContinue: '您想繼續嗎?',\r\n SolarPanelsCannotIntersectWithGround: '光伏板不能和地面接觸。',\r\n SolarPanelsCannotOverlapWithOneAnother: '光伏板不能重疊。',\r\n ScreenshotSaved: '截屏圖片保存在下載文檔夾裡。',\r\n CsvFileSaved: 'CSV保存在下載文檔夾裡。',\r\n SimulationStarted: '模擬開始。',\r\n SimulationCompleted: '模擬結束。',\r\n SimulationAborted: '模擬取消。',\r\n SimulationPaused: '模擬暫停。',\r\n CancelSimulation: '取消模擬',\r\n PauseSimulation: '暫停模擬',\r\n ResumeSimulation: '繼續模擬',\r\n SimulationWillNotStartDueToErrors: '由於錯誤模擬無法運行',\r\n SimulationWillStartDespiteWarnings: '發現問題,但模擬仍然將運行。',\r\n EvolutionStarted: '演化開始。',\r\n EvolutionCompleted: '演化結束。',\r\n EvolutionAborted: '演化取消。',\r\n EvolutionPaused: '演化暫停。',\r\n EncounterEvolutionError: '演化出錯。',\r\n CancelEvolution: '取消演化',\r\n PauseEvolution: '暫停演化',\r\n ResumeEvolution: '繼續演化',\r\n ConvergenceThresholdHasBeenReached: '收斂閾值已達到。',\r\n MaximumNumberOfGenerationsHasBeenReached: '最大世代數已達到。',\r\n MaximumNumberOfStepsHasBeenReached: '最大步數已達到。',\r\n ObjectiveFunctionTypeError: '此操作不支持當前的目標函數。請從菜單啟動此功能。',\r\n WallsAreNotAtSameHeight: '墻體高度不同。',\r\n WallsAreNotPerpendicular: '墻體不垂直。',\r\n WallsAreNotConnected: '墻體不相連。',\r\n WallsNumberNeedToBeFour: '墻體數量必須為四個。',\r\n BuildingContainsEmptyWall: '建築物有空牆。',\r\n BuildingRoofMissing: '建築物沒有屋頂。',\r\n UnknownErrors: '未知錯誤。',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: '分析選項',\r\n option: {\r\n GridCellSize: '計算網格的尺寸',\r\n SamplingFrequency: '採樣頻率',\r\n TimesPerHour: '每小時採樣次數',\r\n DaysPerYear: '每一年採樣天數',\r\n },\r\n mainMenu: '主菜單',\r\n cloudMenu: '雲菜單',\r\n projectSubMenu: '項目',\r\n project: {\r\n CreateNewProject: '創建新項目',\r\n OpenProject: '打開項目',\r\n SaveProjectAs: '另存項目為',\r\n YouMustLogInToCreateProject: '您必須登錄才能創建項目',\r\n YouMustLogInToOpenProject: '您必須登錄才能打開項目',\r\n },\r\n fileSubMenu: '文檔',\r\n file: {\r\n CreateNewFile: '創建新文檔',\r\n OpenLocalFile: '打開本地文檔',\r\n SaveAsLocalFile: '保存為本地文檔',\r\n SavingAbortedMustHaveValidFileName: '文檔名無效,保存失敗',\r\n OpenCloudFile: '打開雲端文檔',\r\n SaveCloudFile: '保存雲端文檔',\r\n SaveAsCloudFile: '保存為雲端文檔',\r\n SavingAbortedMustHaveValidTitle: '雲端文檔名無效,保存失敗',\r\n ToSaveYourWorkPleaseSignIn: '為了保存您的雲端文檔,請您先登錄。',\r\n TakeScreenshot: '截屏',\r\n UseCloudFileName: '採用雲端文件名',\r\n PublishOnModelsMap: '發佈到地圖上',\r\n PublishedOnModelsMap: '您的模型成功發佈到地圖上',\r\n UpdatedOnModelsMap: '您的模型更新成功',\r\n YouMustLogInToPublishYourModel: '您必須登錄才能發布模型',\r\n YouCannotPublishAModelThatYouDoNotOwn: '您不能發布他人的模型',\r\n YouMustSaveModelOnCloudBeforePublishingIt: '您必須先把此模型保存在雲端才能發布它',\r\n },\r\n editSubMenu: '編輯',\r\n edit: {\r\n Undo: '撤銷',\r\n Redo: '重做',\r\n },\r\n viewSubMenu: '視界',\r\n view: {\r\n NavigationView: '導航模式',\r\n TwoDimensionalView: '二維模式',\r\n ResetView: '重置視角',\r\n ZoomIn: '放大',\r\n ZoomOut: '縮小',\r\n AutoRotate: '自動旋轉',\r\n ShowShadow: '顯示陰影',\r\n ShowSurfaceShininess: '顯示表面光澤',\r\n TranslucentFloatingWindows: '透明浮動窗口',\r\n accessoriesSubMenu: '配件',\r\n accessories: {\r\n SiteInformation: '位置資訊',\r\n DesignInformation: '設計資訊',\r\n Instruction: '操作說明',\r\n StickyNote: '便簽',\r\n Note: '便簽',\r\n },\r\n },\r\n settingsSubMenu: '設置',\r\n settings: {\r\n WeatherData: '氣象數據',\r\n DiurnalTemperature: '晝夜溫度',\r\n Heliodon: '日影儀',\r\n SunAndTime: '太陽和時間',\r\n },\r\n benchmarksSubMenu: '基準',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: '太陽能輻射模型預測和實際測量的對比',\r\n BESTESTCase600: '建築物能耗模擬測試:BESTEST案例600',\r\n BESTESTCase610: '建築物能耗模擬測試:BESTEST案例610',\r\n BESTESTCase620: '建築物能耗模擬測試:BESTEST案例620',\r\n BESTESTCase630: '建築物能耗模擬測試:BESTEST案例630',\r\n },\r\n graph: {\r\n LineWidth: '線條寬度',\r\n SymbolSize: '符號大小',\r\n BarCategoryGap: '直條間隙',\r\n ShowHorizontalGridLines: '顯示格子的水平線條',\r\n ShowVerticalGridLines: '顯示格子的豎直線條',\r\n },\r\n analysisSubMenu: '分析',\r\n physicsSubMenu: '物理',\r\n physics: {\r\n DailySolarRadiationHeatmap: '當日太陽輻射總量分佈熱圖',\r\n SolarRadiationHeatmapOptions: '太陽輻射熱圖選項',\r\n SolarRadiationHeatmapGridCellSize: '太陽輻射熱圖網格的尺寸',\r\n SolarRadiationHeatmapMaxValue: '太陽輻射熱圖最大值',\r\n SolarRadiationHeatmapNoAnimation: '若無移動部件則省略動畫',\r\n ReflectionHeatmap: '反射熱圖',\r\n },\r\n sensorSubMenu: '傳感器',\r\n sensor: {\r\n CollectDailyData: '收集當天數據',\r\n CollectYearlyData: '收集全年數據',\r\n SensorSimulationNoAnimation: '若無移動部件則省略動畫',\r\n },\r\n buildingSubMenu: '建築物',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: '建築物當天能耗分析',\r\n AnalyzeYearlyBuildingEnergy: '建築物全年能耗分析',\r\n EnergyAnalysisOptions: '能耗分析選項',\r\n EnergyGridCellSize: '計算網格的尺寸',\r\n BuildingEnergySimulationNoAnimation: '若無移動部件則省略動畫',\r\n },\r\n solarPanelSubMenu: '太陽能光伏板',\r\n solarPanel: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n AnalyzeVisibility: '分析可見度',\r\n PanelDiscretization: '光伏板離散化方法',\r\n Exact: '準確',\r\n Approximate: '近似',\r\n EnergyGridCellSize: '計算網格的尺寸',\r\n VisibilityGridCellSize: '視界因子計算網格的尺寸',\r\n EnergyAnalysisOptions: '能量分析選項',\r\n VisibilityAnalysisOptions: '可見度分析選項',\r\n SolarPanelSimulationNoAnimation: '若無移動部件則省略動畫',\r\n },\r\n parabolicTroughSubMenu: '拋物線槽',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n },\r\n parabolicDishSubMenu: '拋物線碟',\r\n parabolicDish: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n },\r\n fresnelReflectorSubMenu: '菲涅爾反射鏡',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n },\r\n heliostatSubMenu: '定日鏡',\r\n heliostat: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n },\r\n solarUpdraftTowerSubMenu: '太陽能上升氣流塔',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: '分析當天產出',\r\n AnalyzeYearlyYield: '分析全年產出',\r\n SolarUpdraftTowerSimulationNoAnimation: '若無移動部件則省略動畫',\r\n },\r\n\r\n tutorialsSubMenu: '教程',\r\n\r\n solarEnergyScienceSubMenu: '太陽能科學',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: '太陽相對於地面觀察者的角度',\r\n InsolationAndClimate: '太陽輻射和氣候的關係',\r\n SolarRadiationToBox: '一個長方體受到的太陽能輻射分析',\r\n },\r\n\r\n buildingScienceSubMenu: '建築科學',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: '房屋的熱學封套和圍護封套',\r\n EffectOfSizeOnBuildingEnergy: '房屋大小對能耗的影響',\r\n EffectOfOrientationOnBuildingEnergy: '房屋方位對能耗的影響',\r\n EffectOfInsulationOnBuildingEnergy: '房屋隔熱對能耗的影響',\r\n EffectOfRoofColorOnBuildingEnergy: '屋頂顏色對建築物能耗的影響',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: '屋簷延伸長度對建築物能耗的影響',\r\n EffectOfWindowSHGCOnBuildingEnergy: '窗戶太陽能輸入對房屋能耗的影響',\r\n EffectOfThermostatSetpointOnBuildingEnergy: '恆溫器設定值對房屋能耗的影響',\r\n EffectOfSolarPanelsOnBuildingEnergy: '光伏板對房屋能耗的影響',\r\n EffectOfGroundTemperatureOnBuildingEnergy: '地表温度對房屋能耗的影響',\r\n EffectOfTreesOnBuildingEnergy: '樹蔭對房屋能耗的影響',\r\n },\r\n\r\n buildingDesignSubMenu: '建築設計',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: '有棚頂窗的科德角風格的住宅',\r\n MansardRoofWithDormers: '有天窗的折線屋頂',\r\n GableRoofVsHipRoof: '雙坡屋頂和四坡屋顶的對比',\r\n ColonialVsSaltbox: '殖民地風格和鹽盒風格的對比',\r\n GambrelRoofVsMansardRoof: '复斜屋顶和折線屋頂的對比',\r\n CombinationRoofVsBonnetRoof: '組合屋頂和帽簷屋頂的對比',\r\n DutchGableRoof: '荷蘭雙坡屋頂',\r\n GableAndValleyRoof: '坡谷屋頂',\r\n ClerestoryRoof: '天窗屋頂',\r\n MonitorRoof: '採光屋頂',\r\n AFrameHouse: 'A字形房子',\r\n HalfTimberedHouse: '半木骨架房子',\r\n AllBasicRoofTypes: '所有的基本屋頂類型',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: '光伏發電',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: '光伏板傾斜角對發電量的影響',\r\n EffectOfAzimuthOfSolarPanel: '光伏板方位角對發電量的影響',\r\n SolarPanelTypes: '光伏板類型',\r\n VerticalBifacialSolarPanels: '豎直的雙面光伏板',\r\n CompareMonofacialAndBifacialSolarPanels: '單面光伏板和雙面光伏板的對比',\r\n SolarTrackers: '自動追日器',\r\n CoveringGroundWithSolarPanels: '為什麼我們不簡單地用光伏板覆蓋地面',\r\n InterRowSpacingOfSolarPanelArray: '光伏板陣列行間距對發電量的影響',\r\n EffectOfOrientationOfSolarPanels: '光伏板排列方向對發電量的影響',\r\n SolarPanelArrayAutomaticLayout: '光伏板自動排列',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: '光熱發電',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: '拋物線槽方位角對發電量的影響',\r\n EffectOfLatusRectumOfParabolicTrough: '拋物線槽通徑對發電量的影響',\r\n FocusSunlightWithParabolicDish: '用拋物線碟聚焦阳光',\r\n LinearFresnelReflectors: '用直線式菲涅爾反射鏡聚焦阳光',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors: '吸熱管的安装高度對直線式菲涅爾反射鏡發電量的影響',\r\n EffectOfAzimuthOfLinearFresnelReflectors: '直線式菲涅爾反射鏡方位角對發電量的影響',\r\n LinearFresnelReflectorsWithTwoAbsorbers: '配備兩個吸收管的直線式菲涅爾反射鏡陣列',\r\n CosineEfficiencyOfHeliostats: '定日鏡的餘弦效率',\r\n ShadowingAndBlockingOfHeliostats: '定日鏡的陰影和遮擋',\r\n EffectSolarPowerTowerHeight: '吸收塔高度對發電量的影響',\r\n SolarPowerTower: '塔式光熱發電站',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: '其它類型的太陽能發電',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: '太陽能上升氣流塔',\r\n },\r\n\r\n generativeDesignSubMenu: '生成式設計',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: '單面光伏板陣列的傾斜角',\r\n BifacialSolarPanelArrayTiltAngle: '雙面光伏板陣列的傾斜角',\r\n OutputOfSolarPanelArrayInDifferentPlaces: '一個光伏板陣列在不同地區的產出',\r\n SimpleSolarFarmParetoFront: '簡單太陽能農場設計的帕累托前沿',\r\n },\r\n\r\n examplesSubMenu: '例子',\r\n\r\n solarEnergySubMenu: '太陽能',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: '太陽光束和日影儀',\r\n RooftopSolarPanels: '屋頂光伏板',\r\n NevadaSolarOneParabolicTroughArray: '內華達州太陽能一號的拋物線槽陣列',\r\n TooeleParabolicDishArray: '猶他州圖埃勒的拋物線碟陣列',\r\n PS10SolarPowerTower: '西班牙塞維利亞的PS10太陽能發電塔',\r\n TucsonLinearFresnelReflectors: '亞利桑那州圖森的直線式菲涅爾反射鏡陣列',\r\n SolarCanopyFormFactors: '太陽能天篷外形設計',\r\n SolarCanopyOverBleachers: '看台太陽能天篷',\r\n SolarCanopyOverGarage: '車庫太陽能天篷',\r\n SolarBusStop: '太陽能候車亭',\r\n SolarFacadeTesla: '特斯拉光伏牆',\r\n BuildingIntegratedPhotovoltaics: '建築整合光伏',\r\n Floatovoltaics: '浮動光伏',\r\n Agrivoltaics: '農業光伏',\r\n VegetativeBuffer: '太陽能農場绿化带',\r\n RainbowSwashSolarFarmBostonMA: '馬薩諸塞州波士頓彩虹激流旁邊的光伏板陣列',\r\n MickeyMouseSolarFarmOrlandoFL: '佛羅里達州奧蘭多的米老鼠形狀光伏板陣列',\r\n SolarPanelsOverCanalBakersfieldCA: '加利福尼亞州貝克斯菲爾德灌溉渠上假想的光伏板陣列',\r\n SolarNoiseBarrierLexingtonMA: '馬薩諸塞州列剋星敦高速公路噪音牆上假想的光伏板',\r\n HSATSolarTrackersRaleighNC: '北卡羅來納州羅利的一個水平方向單軸旋轉追日光伏板陣列(HSAT)',\r\n AADATSolarTrackersLancasterCA: '加利福尼亞州蘭開斯特的一個雙軸旋轉追日光伏板陣列(AADAT)',\r\n SolarTrackersInRealWorld: '模擬',\r\n SolarUpdraftTowerInCity: '太陽能上升氣流塔在城市中的應用',\r\n },\r\n\r\n builtEnvironmentSubMenu: '建造環境',\r\n residentialBuildingsSubMenu: '住宅建築',\r\n residentialBuildingExamples: {\r\n ColonialHouse: '殖民地風格的住宅',\r\n DutchColonialHouse: '荷蘭殖民地風格的住宅',\r\n TShapedHouse: 'T字型房子',\r\n CapeCodHouseWithGarage: '有車庫的科德角風格的住宅',\r\n Solarium: '有日光浴室的房子',\r\n Church1: '教堂例一',\r\n Cathedral1: '主教座堂例一',\r\n Cathedral2: '主教座堂例二',\r\n Mosque1: '清真寺例一',\r\n AdobeTaosHouse: '陶斯土坯房',\r\n RanchHouse: '牧場風格的住宅',\r\n BonnetHouse: '有帽簷屋頂的住宅',\r\n BarnStyleHouse: '穀倉式風格的住宅',\r\n ModernHouse: '現代風格的住宅',\r\n ButterflyRoofHouse: '蝴蝶型屋頂的住宅',\r\n },\r\n commercialBuildingsSubMenu: '商用建築',\r\n commercialBuildingExamples: {\r\n WhiteHouse: '白宫',\r\n BilimMersinTurkiye: '土耳其梅爾辛科學教育中心',\r\n SpanishStyleHotel: '西班牙風格旅館',\r\n ApartmentBuilding: '公寓樓',\r\n OfficeBuilding: '寫字樓',\r\n Hotel: '旅館',\r\n },\r\n buildingComplexesSubMenu: '建築群',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: '佛蒙特州南伯靈頓高中',\r\n MescaleroApacheSchoolNewMexico: '新墨西哥州梅斯卡勒羅阿帕奇學校',\r\n },\r\n urbanPlanningSubMenu: '城市規劃',\r\n urbanPlanningExamples: {\r\n Heatmap1: '熱圖例一',\r\n },\r\n otherBuildingsSubMenu: '其它建築',\r\n otherBuildingExamples: {\r\n Greenhouse: '溫室',\r\n Pavilion: '公園的亭子',\r\n OctagonalPagoda: '八角塔',\r\n OceanFront: '海邊',\r\n EgyptianPyramids: '埃及金字塔',\r\n MayanPyramid: '瑪雅金字塔',\r\n SiOSePol: '三十三孔橋',\r\n StackedCuboids: '堆砌長方體',\r\n },\r\n\r\n artificialIntelligenceSubMenu: '人工智慧',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: '優化單排光伏板的傾斜角',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: '優化多排光伏板的傾斜角',\r\n SolarFarmGenerativeDesign: '生成式設計太陽能農場',\r\n SolarFarmGenerativeDesignWithBlock: '生成式設計太陽能農場:周邊有建築物的情況',\r\n FitchburgSolarFarmGenerativeDesign: '生成式設計太陽能農場:真實世界案例',\r\n },\r\n\r\n languageSubMenu: '語言',\r\n publicSubMenu: '公共',\r\n ModelsGallery: '模型畫廊',\r\n ModelsMap: '模型地圖',\r\n AboutUs: '關於我們',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: '賬號設定',\r\n PrivacyStatementTitle: '用戶隱私權保護聲明',\r\n PrivacyStatement:\r\n '登錄需要採用您的谷歌ID建立或進入您的阿拉丁賬戶。 我們只儲存一個隨機的字符串作為您的ID。 任何關於您的可辨識的個人信息都沒有被收集。 詳情請參考我們的',\r\n SignIn: '登錄',\r\n SignOut: '退出賬號',\r\n IfYouAreAStudent: '如果您是一個學生',\r\n },\r\n\r\n skyMenu: {\r\n Axes: '顯示坐標軸',\r\n Theme: '環境主題',\r\n ThemeDefault: '默認',\r\n ThemeDesert: '沙漠',\r\n ThemeDune: '沙丘',\r\n ThemeForest: '森林',\r\n ThemeGrassland: '草原',\r\n ThemeHill: '丘陵',\r\n ThemeLake: '湖泊',\r\n ThemeMountain: '山脈',\r\n ThemeRural: '田園',\r\n SunlightAttenuationCoefficientInAir: '陽光在空氣中傳播的衰減係數',\r\n ConvectiveCoefficientOfAir: '空氣對流傳熱係數',\r\n HighestTemperatureTimeInMinutes: '最高氣溫時間(分鐘)',\r\n SelectSunAnglesToShow: '選擇太陽角度顯示',\r\n ShowAzimuthAngle: '顯示方位角',\r\n ShowElevationAngle: '顯示高度角',\r\n ShowZenithAngle: '顯示天頂角',\r\n DirectLightBrightnessAtNoon: '正午直射光照度',\r\n AmbientLightBrightnessAtNoon: '正午環境光照度',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: '月份輻射度損失比',\r\n Vegetation: '植被',\r\n LeafOutDay: '樹葉長出的日子',\r\n LeafOffDay: '樹葉脫落的日子',\r\n Albedo: '反照率',\r\n ImageOnGround: '地面顯示圖像',\r\n WaterSurface: '水面',\r\n RemoveAllUnlockedTrees: '刪除所有非固定的樹木',\r\n RemoveAllUnlockedFlowers: '删除所有非固定的花草',\r\n RemoveAllUnlockedSolarPanels: '删除所有非固定的光伏板',\r\n RemoveAllUnlockedPeople: '删除所有非固定的人物',\r\n RemoveAllUnlockedFoundations: '删除所有非固定的地基',\r\n RemoveAllUnlockedCuboids: '删除所有非固定的長方體',\r\n DoYouReallyWantToRemoveAllPeople: '你確定刪除所有非固定的人物嗎',\r\n DoYouReallyWantToRemoveAllTrees: '你確定刪除所有非固定的樹木嗎',\r\n DoYouReallyWantToRemoveAllFlowers: '你確定刪除所有非固定的花草嗎',\r\n DoYouReallyWantToRemoveAllSolarPanels: '你確定刪除所有非固定的光伏板嗎',\r\n DoYouReallyWantToRemoveAllFoundations: '你確定刪除所有非固定的地基嗎',\r\n DoYouReallyWantToRemoveAllCuboids: '你確定刪除所有非固定的長方體嗎',\r\n LockAllElements: '固定所有的部件',\r\n UnlockAllElements: '解除所有的固定',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: '標籤',\r\n LabelText: '標籤的内容',\r\n LabelHeight: '標籤的高度',\r\n LabelSize: '標籤的大小',\r\n LabelFontSize: '字體的大小',\r\n LabelColor: '標籤的顏色',\r\n KeepShowingLabel: '顯示標籤',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: '刪除此地基上所有非固定的光伏板',\r\n RemoveAllUnlockedParabolicTroughs: '刪除此地基上所有非固定的拋物線槽',\r\n RemoveAllUnlockedParabolicDishes: '刪除此地基上所有非固定的拋物線碟',\r\n RemoveAllUnlockedFresnelReflectors: '刪除此地基上所有非固定的菲涅耳反射鏡',\r\n RemoveAllUnlockedHeliostats: '刪除此地基上所有非固定的定日鏡',\r\n RemoveAllUnlockedSensors: '刪除此地基上所有非固定的傳感器',\r\n RemoveAllUnlockedLights: '刪除此地基上所有非固定的電燈',\r\n RemoveAllUnlockedWalls: '刪除此地基上所有非固定的牆',\r\n RemoveAllUnlockedWindows: '刪除此地基上所有非固定的窗戶',\r\n RemoveAllUnlockedDoors: '刪除此地基上所有非固定的門',\r\n RemoveAllUnlockedPolygons: '刪除此地基上所有非固定的多邊形',\r\n RemoveAllUnlockedHumans: '刪除此地基上所有非固定的人物',\r\n RemoveAllUnlockedTrees: '刪除此地基上所有非固定的樹木',\r\n RemoveAllUnlockedFlowers: '刪除此地基上所有非固定的花草',\r\n Racks: '支架',\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n SolarPanels: '光伏板',\r\n SolarPanelArray: '光伏板陣列',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation: '你確定刪除此地基上所有非固定的光伏板嗎',\r\n ParabolicTroughs: '拋物線槽',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation: '你確定刪除此地基上所有非固定的拋物線槽嗎',\r\n ParabolicDishes: '拋物線碟',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation: '你確定刪除此地基上所有非固定的拋物線碟嗎',\r\n FresnelReflectors: '菲涅耳反射鏡',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation: '你確定刪除此地基上所有非固定的菲涅耳反射鏡嗎',\r\n Heliostats: '定日鏡',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation: '你確定刪除此地基上所有非固定的定日鏡嗎',\r\n Sensors: '傳感器',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation: '你確定刪除此地基上所有非固定的傳感器嗎',\r\n Lights: '電燈',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation: '你確定刪除此地基上所有非固定的電燈嗎',\r\n Walls: '牆',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation: '你確定刪除此地基上所有非固定的牆嗎',\r\n Windows: '窗戶',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation: '你確定刪除此地基上所有非固定的窗戶嗎',\r\n Doors: '門',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation: '你確定刪除此地基上所有非固定的門嗎',\r\n Polygons: '多邊形',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation: '你確定刪除此地基上所有非固定的多邊形嗎',\r\n Humans: '人物',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation: '你確定刪除此地基上所有非固定的人物嗎',\r\n Trees: '樹木',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation: '你確定刪除此地基上所有非固定的樹木嗎',\r\n Flowers: '花草',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation: '你確定刪除此地基上所有非固定的花草嗎',\r\n OnlyThisFoundation: '只這塊地基',\r\n AllConnectedFoundations: '所有相連的地基',\r\n AllSelectedFoundations: '所有選中的地基',\r\n AllFoundations: '所有的地基',\r\n AddPolygon: '添加多邊形',\r\n SolarStructure: '太陽能構型',\r\n GroupMaster: '主地基',\r\n LockAllElementsOnThisFoundation: '固定此地基上所有的部件',\r\n UnlockAllElementsOnThisFoundation: '解除此地基上所有的固定',\r\n GroundFloorRValue: '建築物地板的R值',\r\n OnlyThisGroundFloor: '只這個建築物的地板',\r\n AllGroundFloors: '所有建築物的地板',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: '和定日鏡配套的吸收塔',\r\n ReceiverTowerPhysicalProperties: '太陽能吸收塔的物理性質',\r\n ReceiverTowerHeight: '太陽能吸收塔的高度',\r\n ReceiverTowerRadius: '太陽能吸收塔的半徑',\r\n ReceiverAbsorptance: '太陽能吸收器的吸收率',\r\n ReceiverOpticalEfficiency: '太陽能吸收器的光效率',\r\n ReceiverThermalEfficiency: '太陽能吸收器的熱效率',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: '和菲涅爾反射鏡配套的吸收管',\r\n AbsorberPipePhysicalProperties: '太陽能吸收管的物理性質',\r\n AbsorberHeight: '太陽能吸收管的安装高度',\r\n AbsorberApertureWidth: '太陽能吸收管的孔徑',\r\n AbsorberPipePoleNumber: '太陽能吸收管的支柱數量',\r\n AbsorberAbsorptance: '太陽能吸收管的吸收率',\r\n AbsorberOpticalEfficiency: '太陽能吸收管的光效率',\r\n AbsorberThermalEfficiency: '太陽能吸收管的熱效率',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: '太陽能上升氣流塔',\r\n SolarUpdraftTowerPhysicalProperties: '太陽能上升氣流塔的物理性質',\r\n SolarUpdraftTowerChimneyHeight: '太陽能上升氣流塔煙囪的高度',\r\n SolarUpdraftTowerChimneyRadius: '太陽能上升氣流塔煙囪的半徑',\r\n SolarUpdraftTowerCollectorHeight: '太陽能上升氣流塔集熱棚的高度',\r\n SolarUpdraftTowerCollectorRadius: '太陽能上升氣流塔集熱棚的半徑',\r\n SolarUpdraftTowerCollectorTransmissivity: '太陽能上升氣流塔集熱棚的透射率',\r\n SolarUpdraftTowerCollectorEmissivity: '太陽能上升氣流塔集熱棚的發射率',\r\n SolarUpdraftTowerDischargeCoefficient: '太陽能上升氣流塔的流量係數',\r\n SolarUpdraftTowerTurbineEfficiency: '太陽能上升氣流塔的渦輪機效率',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n RemoveAllUnlockedSolarPanels: '刪除此長方體表面上所有非固定的光伏板',\r\n RemoveAllUnlockedSensors: '刪除此長方體表面上所有非固定的傳感器',\r\n RemoveAllUnlockedPolygons: '刪除此長方體表面上所有非固定的多邊形',\r\n RemoveAllUnlockedHumans: '刪除此長方體表面上所有非固定的人物',\r\n RemoveAllUnlockedTrees: '刪除此長方體表面上所有非固定的樹木',\r\n RemoveAllUnlockedFlowers: '刪除此長方體表面上所有非固定的花草',\r\n Racks: '支架',\r\n SolarPanels: '光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid: '你確定刪除此長方體表面上所有非固定的光伏板嗎',\r\n Sensors: '傳感器',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid: '你確定刪除此長方體表面上所有非固定的傳感器嗎',\r\n Polygons: '多邊形',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid: '你確定刪除此長方體表面上所有非固定的多邊形嗎',\r\n Humans: '人物',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid: '你確定刪除此長方體表面上所有非固定的人物嗎',\r\n Trees: '樹木',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid: '你確定刪除此長方體表面上所有非固定的樹木嗎',\r\n Flowers: '花草',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid: '你確定刪除此長方體表面上所有非固定的花草嗎',\r\n OnlyThisCuboid: '只這個長方體',\r\n AllCuboidsOnSameSurface: '同一表面上所有的長方體',\r\n AllCuboidsAboveSameBase: '同一地基上所有的長方體',\r\n AllSelectedCuboids: '所有選中的長方體',\r\n AllCuboids: '所有的長方體',\r\n OnlyThisSide: '只這個表面',\r\n AllSidesOfThisCuboid: '這個長方體所有的側面',\r\n AllSidesOfSelectedCuboids: '所有選中長方體所有的側面',\r\n AllSidesOfAllCuboids: '所有的長方體所有的側面',\r\n AddPolygon: '添加多邊形',\r\n Stackable: '可堆砌',\r\n GroupMaster: '主長方體',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n TextBox: '文字框',\r\n FontOutlineColor: '字體輪廓顏色',\r\n FontOutlineWidth: '字體輪廓線寬',\r\n FontStrokeColor: '字體描邊顏色',\r\n FontStrokeWidth: '字體描邊線寬',\r\n NoOutline: '無輪廓線',\r\n Shiny: '光澤',\r\n Filled: '填充',\r\n FillTexture: '填充材質',\r\n FillColor: '填充顏色',\r\n Opacity: '遮光度',\r\n LineColor: '線條顏色',\r\n LineWidth: '線條寬度',\r\n LineStyle: '線條樣式',\r\n SolidLine: '實線',\r\n DashedLine: '虛線',\r\n DottedLine: '點線',\r\n InsertVertexBeforeIndex: '前面插入頂點',\r\n InsertVertexAfterIndex: '後面插入頂點',\r\n DeleteVertex: '移除頂點',\r\n OnlyThisPolygon: '只這個多邊形',\r\n AllPolygonsOnSurface: '同一表面上所有的多邊形',\r\n AllPolygonsAboveFoundation: '同一地基上所有的多邊形',\r\n AllSelectedPolygons: '所有選中的多邊形',\r\n AllPolygons: '所有的多邊形',\r\n Layout: '佈局',\r\n SolarPanelArrayLayout: '光伏板陣列佈局',\r\n SolarPanelArrayLayoutParametricDesign: '光伏板陣列佈局參數化設計',\r\n SolarPanelArrayLayoutGenerativeDesign: '光伏板陣列佈局生成式設計',\r\n SolarPanelArrayModel: '光伏板型號',\r\n SolarPanelArrayOrientation: '排列方向',\r\n SolarPanelArrayTiltAngle: '傾斜角度',\r\n SolarPanelArrayRowWidth: '行寬度',\r\n SolarPanelArrayInterRowSpacing: '行間距',\r\n SolarPanelArrayRowSpacing: '行間距',\r\n SolarPanelArrayRowAxis: '行軸方向',\r\n SolarPanelArrayLeftRightRowAxis: '左右方向(相對)',\r\n SolarPanelArrayUpDownRowAxis: '上下方向(相對)',\r\n SolarPanelArrayEastWestRowAxis: '東西方向(絕對)',\r\n SolarPanelArrayNorthSouthRowAxis: '南北方向(絕對)',\r\n SolarPanelArrayMargin: '邊緣餘地',\r\n SolarPanelArrayPoleHeight: '支架高度',\r\n SolarPanelArrayPoleSpacing: '支柱間隔',\r\n SolarPanelArrayTotalYearlyCost: '全年總成本',\r\n SolarPanelArrayTotalYearlyRevenue: '全年總收入',\r\n SolarPanelArrayTotalYearlyYield: '全年總發電量',\r\n SolarPanelArrayMeanYearlyYield: '平均年發電量',\r\n SolarPanelArrayYearlyProfit: '全年利潤',\r\n LayoutNotAcceptedCheckYourParameters: '恕不能採用此佈局。請檢查您的參數設置。',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: '優化',\r\n Parameters: '參數',\r\n Variables: '變量',\r\n Constants: '常量',\r\n GeneticAlgorithm: '遺傳算法',\r\n GeneticAlgorithmSettings: '遺傳算法設定',\r\n ParticleSwarmOptimization: '粒子群優化',\r\n ParticleSwarmOptimizationSettings: '粒子群優化設定',\r\n SolarPanelTiltAngleOptimization: '光伏板傾斜角度優化',\r\n SolarPanelArrayLayout: '光伏板陣列佈局',\r\n Generation: '世代',\r\n Gene: '基因',\r\n NormalizedVariables: '標準化變量',\r\n Objective: '目標函數',\r\n ObjectiveFunctionDailyTotalYield: '當日總產出',\r\n ObjectiveFunctionYearlyTotalYield: '全年總產出',\r\n ObjectiveFunctionDailyMeanYield: '當日平均產出',\r\n ObjectiveFunctionYearlyMeanYield: '全年平均產出',\r\n ObjectiveFunctionDailyProfit: '當日利潤',\r\n ObjectiveFunctionYearlyProfit: '全年利潤',\r\n GeneticAlgorithmSelectionMethod: '遺傳算法選擇方法',\r\n RouletteWheel: '輪盤制',\r\n Tournament: '淘汰制',\r\n SearchMethod: '搜索方法',\r\n GlobalSearchUniformSelection: '全局搜索均勻取樣',\r\n LocalSearchRandomOptimization: '局部搜索隨機優化',\r\n PopulationSize: '種群個體數目',\r\n MaximumGenerations: '最大世代數目',\r\n SelectionRate: '選擇概率',\r\n CrossoverRate: '交配概率',\r\n MutationRate: '突變概率',\r\n Step: '步數',\r\n SwarmSize: '粒子數目',\r\n MaximumSteps: '最大步數',\r\n MaximumVelocity: '最大速度',\r\n InertiaWeight: '慣性權重',\r\n CognitiveCoefficient: '認知係數',\r\n SocialCoefficient: '社會係數',\r\n ConvergenceThreshold: '終止條件的收斂閾值',\r\n LocalSearchRadius: '局部搜索的半徑',\r\n RowsPerRackRange: '單個支架上光伏板行數的變化範圍',\r\n TiltAngleRange: '光伏板傾斜角度的變化範圍',\r\n InterRowSpacingRange: '光伏板陣列行間距的變化範圍',\r\n ClickTargetPolygonToActivate: '點擊目標多邊形激活',\r\n ClickTargetFoundationToActivate: '點擊目標地基激活',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: '顯示近似模型',\r\n Flip: '翻轉',\r\n Type: '樹種',\r\n Spread: '樹冠直徑',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: '翻轉',\r\n Type: '品種',\r\n Spread: '直徑',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: '改變人物',\r\n Flip: '轉身',\r\n Observer: '觀察者',\r\n ViewFromThisPerson: '視角移到此人位置',\r\n },\r\n\r\n lightMenu: {\r\n Color: '顏色',\r\n Intensity: '亮度',\r\n Decay: '衰减',\r\n MaximumDistance: '最大距離',\r\n Inside: '内部',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: '相對方位角',\r\n Pole: '支柱',\r\n PoleHeight: '支柱高度',\r\n PoleRadius: '支柱半徑',\r\n ExtraPoleHeight: '額外的支柱高度',\r\n ExtraPoleHeightInAdditionToHalfWidth: '寬度一半額外的支柱高度',\r\n DrawSunBeam: '顯示光束',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: '反射器鏡面反射率',\r\n ReceiverAbsorptance: '接收器吸收率',\r\n ReflectorOpticalEfficiency: '反射器光效率',\r\n ReceiverThermalEfficiency: '接收器熱效率',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: '逆變器效率',\r\n InverterEfficiencyExplained: '直流電轉換為交流電的效率。',\r\n DcToAcSizeRatio: '直流-交流容量比例',\r\n DcToAcSizeRatioExplained: '直流電容量和交流電容量的比例。',\r\n ChangePvModel: '改變光伏板型號',\r\n Orientation: '排列方向',\r\n Portrait: '縱向',\r\n Landscape: '橫向',\r\n FrameColor: '框架顏色',\r\n Panels: '塊',\r\n PanelsWide: '塊光伏板寬',\r\n PanelsLong: '塊光伏板長',\r\n TiltAngle: '傾斜角度',\r\n SouthFacingIsPositive: '朝南為正',\r\n Tracker: '追日系統',\r\n SolarTrackerFollowsSun: '追日系統提高光伏板產出。',\r\n PoleSpacing: '支柱間隔',\r\n NoTracker: '無追日系統',\r\n HorizontalSingleAxisTracker: '水平單軸追日系統',\r\n VerticalSingleAxisTracker: '豎直單軸追日系統',\r\n AltazimuthDualAxisTracker: '地平雙軸追日系統',\r\n OnlyThisSolarPanel: '只這個光伏板',\r\n AllSolarPanelsOnSurface: '同一表面上所有的光伏板',\r\n AllSolarPanelsAboveFoundation: '同一地基上所有的光伏板',\r\n AllSelectedSolarPanels: '所有選中的光伏板',\r\n AllSolarPanels: '所有的光伏板',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: '光伏板型號性能',\r\n Model: '型號',\r\n PanelSize: '尺寸',\r\n Cells: '電池組',\r\n CellType: '光伏電池類型',\r\n Monocrystalline: '單晶矽',\r\n Polycrystalline: '多晶矽',\r\n ThinFilm: '薄膜',\r\n Bifacial: '雙面',\r\n BifacialityFactor: '雙面性因子',\r\n Black: '黑色',\r\n Blue: '藍色',\r\n ShadeTolerance: '陰影耐受度',\r\n SolarCellEfficiency: '光伏電池效率',\r\n NominalOperatingCellTemperature: '名義電池運行溫度',\r\n TemperatureCoefficientOfPmax: 'Pmax溫度係數',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: '模塊長度',\r\n Modules: '模塊',\r\n ModulesLong: '模塊長',\r\n LatusRectum: '通徑',\r\n OnlyThisParabolicTrough: '只這個拋物線槽',\r\n AllParabolicTroughsAboveFoundation: '同一地基上所有的拋物線槽',\r\n AllSelectedParabolicTroughs: '所有選中的抛物线槽',\r\n AllParabolicTroughs: '所有的拋物線槽',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: '吸收管',\r\n SelectAbsorberToReflectSunlightTo: '選擇陽光反射到的吸收管',\r\n ModuleLength: '模塊長度',\r\n Modules: '模塊',\r\n ModulesLong: '模塊長',\r\n OnlyThisFresnelReflector: '只這個菲涅耳反射鏡',\r\n AllFresnelReflectorsAboveFoundation: '同一地基上所有的菲涅耳反射鏡',\r\n AllSelectedFresnelReflectors: '所有選中的菲涅耳反射镜',\r\n AllFresnelReflectors: '所有的菲涅耳反射鏡',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: '吸收塔',\r\n SelectTowerToReflectSunlightTo: '選擇陽光反射到的吸收塔',\r\n OnlyThisHeliostat: '只這個定日鏡',\r\n AllHeliostatsAboveFoundation: '同一地基上所有的定日鏡',\r\n AllSelectedHeliostats: '所有選中的定日镜',\r\n AllHeliostats: '所有的定日鏡',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: '接收器結構',\r\n CentralPole: '中心直柱',\r\n CentralPoleWithTripod: '三腳架和中心直柱',\r\n Quadrupod: '四脚架',\r\n RimDiameter: '外圈直徑',\r\n LatusRectum: '通徑',\r\n ExtraPoleHeightInAdditionToRadius: '半徑之外額外的支架高度',\r\n OnlyThisParabolicDish: '只這個拋物線碟',\r\n AllParabolicDishesAboveFoundation: '同一地基上所有的拋物線碟',\r\n AllSelectedParabolicDishes: '所有選中的抛物线碟',\r\n AllParabolicDishes: '所有的拋物線碟',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: '默認材質',\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n SizeOfWall: '牆的尺寸',\r\n OnlyThisWall: '只這堵牆',\r\n AllConnectedWalls: '所有連接的牆',\r\n AllWallsAboveFoundation: '同一地基上所有的牆',\r\n AllSelectedWalls: '所有選中的墙',\r\n AllWalls: '所有的牆',\r\n Windows: '窗戶',\r\n LockAllWindows: '固定所有的窗戶',\r\n UnlockAllWindows: '解除所有的窗戶固定',\r\n RemoveAllUnlockedWindows: '刪除這堵牆上所有非固定的窗戶',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: '你確定刪除這堵牆上所有非固定的窗戶嗎',\r\n Doors: '門',\r\n RemoveAllUnlockedDoors: '刪除這堵牆上所有非固定的門',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: '你確定刪除這堵牆上所有非固定的門嗎',\r\n SolarPanels: '光伏板',\r\n LockAllSolarPanels: '固定所有的光伏板',\r\n UnlockAllSolarPanels: '解除所有的光伏板固定',\r\n RemoveAllUnlockedSolarPanels: '刪除這堵牆上所有非固定的光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: '你確定刪除這堵牆上所有非固定的光伏板嗎',\r\n Sensors: '傳感器',\r\n LockAllSensors: '固定所有的傳感器',\r\n UnlockAllSensors: '解除所有的傳感器固定',\r\n RemoveAllUnlockedSensors: '刪除這堵牆上所有非固定的傳感器',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: '你確定刪除這堵牆上所有非固定的傳感器嗎',\r\n Lights: '電燈',\r\n RemoveAllUnlockedLights: '刪除這堵牆上所有非固定的電燈',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: '你確定刪除這堵牆上所有非固定的電燈嗎',\r\n LockAllPolygons: '固定這堵牆上所有的多邊形',\r\n UnlockAllPolygons: '解除這堵牆上所有的多邊形固定',\r\n RemoveAllUnlockedPolygons: '刪除這堵牆上所有非固定的多邊形',\r\n WallStructure: '牆結構',\r\n DefaultStructure: '默認',\r\n StudStructure: '牆柱',\r\n PillarStructure: '圓柱',\r\n Opacity: '遮光度',\r\n StructureSpacing: '結構間距',\r\n StructureWidth: '結構寬度',\r\n StructureThickness: '結構厚度',\r\n StructureColor: '結構颜色',\r\n Color: '牆体颜色',\r\n Height: '高度',\r\n Thickness: '厚度',\r\n Texture: '材質',\r\n AllLightsOnWallInside: '所有電燈在牆內',\r\n AllLightsOnWallOutside: '所有電燈在牆外',\r\n Fill: '填充',\r\n Full: '全部',\r\n Partial: '部分',\r\n Empty: '空白',\r\n OpenToOutside: '對外面開放',\r\n EavesLength: '屋簷延伸長度',\r\n Parapet: '女牆',\r\n ParapetColor: '女牆颜色',\r\n ParapetTexture: '女牆材質',\r\n ParapetHeight: '女牆高度',\r\n CopingsHeight: '頂蓋高度',\r\n CopingsWidth: '頂蓋寬度',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: '只這個窗戶',\r\n AllWindowsOnSurface: '同一表面上所有的窗戶',\r\n AllWindowsAboveFoundation: '同一地基上所有的窗戶',\r\n AllSelectedWindows: '所有選中的窗户',\r\n AllWindows: '所有的窗戶',\r\n Width: '寬度',\r\n Height: '高度',\r\n Setback: '離牆體外表面的距離',\r\n RelativeToWallThickness: '相對於牆的厚度',\r\n Mullion: '直櫺',\r\n HorizontalMullion: '水平的直櫺',\r\n VerticalMullion: '豎直的直櫺',\r\n MullionWidth: '直櫺寬度',\r\n HorizontalMullionSpacing: '水平直櫺的間距',\r\n VerticalMullionSpacing: '豎直直櫺的間距',\r\n MullionColor: '直櫺颜色',\r\n Tint: '著色',\r\n Opacity: '不透明度',\r\n SolarHeatGainCoefficient: '太陽輻射熱獲取係數(SHGC) = 1 - 不透明度',\r\n Shutter: '百葉窗',\r\n LeftShutter: '左側百葉窗',\r\n RightShutter: '右側百葉窗',\r\n BothShutters: '兩側百葉窗',\r\n ShutterWidth: '相對寬度',\r\n ShutterColor: '百葉窗顏色',\r\n Frame: '邊框',\r\n FrameWidth: '邊框寬度',\r\n SillWidth: '窗台寬度',\r\n Color: '邊框顔色',\r\n WindowType: '窗戶種類',\r\n Default: '默認',\r\n Arched: '拱形',\r\n Polygonal: '多邊形',\r\n Interior: '内窗',\r\n Empty: '空白',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: '默認材質',\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n OnlyThisRoof: '只這個屋顶',\r\n AllRoofsAboveFoundation: '同一地基上所有的屋顶',\r\n AllSelectedRoofs: '所有選中的屋顶',\r\n AllRoofs: '所有的屋顶',\r\n OnlyThisCeiling: '只這個天花板',\r\n AllCeilingsAboveFoundation: '同一地基上所有的天花板',\r\n AllCeilings: '所有的天花板',\r\n EavesOverhangLength: '屋簷延伸長度',\r\n RafterSpacing: '屋椽間距',\r\n RafterWidth: '屋椽寬度',\r\n RafterThickness: '屋椽厚度',\r\n RafterColor: '屋椽颜色',\r\n RoofColor: '屋顶颜色',\r\n RoofSideColor: '屋顶側面颜色',\r\n GlassTint: '玻璃顏色',\r\n Opacity: '遮光度',\r\n RoofStructure: '屋頂結構',\r\n DefaultStructure: '默認',\r\n RafterStructure: '屋椽',\r\n GlassStructure: '玻璃',\r\n SolarPanels: '光伏板',\r\n LockAllSolarPanels: '固定所有的光伏板',\r\n UnlockAllSolarPanels: '解除所有的光伏板固定',\r\n RemoveAllUnlockedSolarPanels: '刪除這個屋顶上所有非固定的光伏板',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: '你確定刪除這個屋顶上所有非固定的光伏板嗎',\r\n Windows: '天窗',\r\n LockAllWindows: '固定所有的天窗',\r\n UnlockAllWindows: '解除所有的天窗固定',\r\n RemoveAllUnlockedWindows: '刪除這個屋顶上所有非固定的天窗',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: '你確定刪除這個屋顶上所有非固定的天窗嗎',\r\n Sensors: '傳感器',\r\n LockAllSensors: '固定所有的傳感器',\r\n UnlockAllSensors: '解除所有的傳感器固定',\r\n RemoveAllUnlockedSensors: '刪除這個屋顶上所有非固定的傳感器',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: '你確定刪除這個屋顶上所有非固定的傳感器嗎',\r\n Lights: '電燈',\r\n RemoveAllUnlockedLights: '刪除這個屋顶上所有非固定的電燈',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: '你確定刪除這個屋顶上所有非固定的電燈嗎',\r\n AllLightsOnRoofInside: '所有電燈在屋頂內',\r\n AllLightsOnRoofOutside: '所有電燈在屋頂外',\r\n Rise: '相對高度',\r\n Ceiling: '天花板',\r\n RoofRValue: '屋顶R值',\r\n CeilingRValue: '天花板R值',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: '默認材質',\r\n Texture01: '一號材質',\r\n Texture02: '二號材質',\r\n Texture03: '三號材質',\r\n Texture04: '四號材質',\r\n Texture05: '五號材質',\r\n Texture06: '六號材質',\r\n Texture07: '七號材質',\r\n Texture08: '八號材質',\r\n Texture09: '九號材質',\r\n Texture10: '十號材質',\r\n Texture11: '十一號材質',\r\n Texture12: '十二號材質',\r\n Texture13: '十三號材質',\r\n Texture14: '十四號材質',\r\n Texture15: '十五號材質',\r\n Texture16: '十六號材質',\r\n Texture17: '十七號材質',\r\n OnlyThisDoor: '只這個門',\r\n AllDoorsOnWall: '同一面牆上所有的門',\r\n AllDoorsAboveFoundation: '同一地基上所有的門',\r\n AllSelectedDoors: '所有選中的门',\r\n AllDoors: '所有的門',\r\n DoorType: '門種類',\r\n Default: '默認',\r\n Arched: '拱形',\r\n Filled: '填充',\r\n FrameColor: '門框顏色',\r\n Interior: '內門',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: '最高溫度',\r\n Low: '最低温度',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: '選中的定日鏡總數',\r\n NumberOfSelectedSolarPanels: '選中的光伏板總數',\r\n ElectricityGeneratedDailyBySolarPanels: '這些光伏板的日發電量',\r\n SceneDiameter: '場景直徑',\r\n BuildingArea: '建築面積',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: '熱圖顏色對比度',\r\n FluxScale: '熱通量長度',\r\n ClickUpOrDownArrowButtonsToChange: '點擊上下箭頭改變參數',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: '旋轉',\r\n DragMouse: '拖動滑鼠',\r\n Zoom: '缩放',\r\n MouseWheelOrKeys: '滑鼠滾輪或者Ctrl+[和Ctrl+]',\r\n MouseWheelOrKeysMac: '滑鼠滾輪或者⌘+[和⌘+]',\r\n Pan: '平移',\r\n HoldCtrlDragMouse: '按下Ctrl鍵並拖動滑鼠',\r\n HoldMetaDragMouse: '按下⌘鍵並拖動滑鼠',\r\n Enter2DMode: '進入二維模式',\r\n Exit2DMode: '退出二維模式',\r\n NavigationMode: '導航模式',\r\n EnableNavigation: '進入導航模式',\r\n DisableNavigation: '退出導航模式',\r\n MoveForwardBack: '前後移動',\r\n MoveForwardBackInstruction: '按W/S鍵',\r\n MoveLeftRight: '左右移動',\r\n MoveLeftRightInstruction: '按A/D鍵',\r\n MoveUpDown: '上下移動',\r\n MoveUpDownInstruction: '按Z/X鍵',\r\n Turn: '拐彎',\r\n TurnInstruction: '按方向鍵',\r\n ResetView: '重置視角',\r\n AutoRotate: '自動旋轉',\r\n StartOrStop: '按F4鍵啟動或停止',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: '地面顯示圖像',\r\n WeatherStations: '氣象站',\r\n WeatherStationsNote: '關閉此選項以提高地圖速度',\r\n Coordinates: '經緯度坐標',\r\n Zoom: '放大程度',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: '光伏板對觀察者的可見度',\r\n Observer: '觀察者',\r\n VantagePoint: '觀察位置',\r\n ItemizedVisibilityByFields: '每個場的可見度',\r\n TotalVisibility: '總可見度',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: '光傳感器',\r\n WeatherDataFrom: '氣象數據來自',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: '建築物日能耗',\r\n YearlyBuildingEnergy: '建築物年能耗',\r\n Heater: '暖氣',\r\n AC: '空調',\r\n SolarPanel: '光伏',\r\n Net: '淨能耗',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: '光伏日發電量',\r\n SolarPanelYearlyYield: '光伏年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualSolarPanels: '顯示每行光伏板單獨發電量',\r\n Profit: '利潤',\r\n TotalCost: '總成本',\r\n TotalRevenue: '總收入',\r\n TotalYield: '總發電量',\r\n MeanYield: '平均發電量',\r\n ModuleCount: '光伏板總數',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: '拋物線槽日發電量',\r\n ParabolicTroughYearlyYield: '拋物線槽年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualParabolicTroughs: '顯示每行拋物線槽單獨發電量',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: '拋物線碟日發電量',\r\n ParabolicDishYearlyYield: '拋物線碟年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualParabolicDishes: '顯示每個拋物線碟單獨發電量',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: '菲涅耳反射鏡日發電量',\r\n FresnelReflectorYearlyYield: '菲涅耳反射鏡年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualFresnelReflectors: '顯示每個菲涅耳反射鏡單獨發電量',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: '定日鏡日發電量',\r\n HeliostatYearlyYield: '定日鏡年發電量',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualHeliostats: '顯示每個定日鏡單獨發電量',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: '太陽能上升氣流塔日發電量',\r\n UpdraftTowerYearlyYield: '太陽能上升氣流塔年發電量',\r\n ChimneyAirTemperature: '煙囪空氣溫度',\r\n ChimneyWindSpeed: '煙囪風速',\r\n Yield: '發電量',\r\n YieldPerHour: '每小時發電量',\r\n DailyTotal: '日發電總量',\r\n YearlyTotal: '年發電總量',\r\n ShowOutputsOfIndividualUpdraftTowers: '顯示每個太陽能上升氣流塔單獨發電量',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: '太陽和時間設置',\r\n SunAngles: '角度',\r\n TwentyFourHours: '24小時',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: '拷貝標題',\r\n TitleCopiedToClipBoard: '標題拷貝到剪貼板',\r\n SearchByTitle: '按標題搜索',\r\n MyLikes: '我喜歡的模型',\r\n MyCloudFiles: '我的雲文件',\r\n GenerateLink: '生成鏈接',\r\n LinkGeneratedInClipBoard: '鏈接生成到剪貼板',\r\n DoYouReallyWantToDelete: '您確定刪除此文檔',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks: '如果此文檔已被分享或發布, 改名會使已有鏈接失效',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: '拷貝標題',\r\n TitleCopiedToClipBoard: '標題拷貝到剪貼板',\r\n SearchByTitle: '按標題搜索',\r\n MyProjects: '我的項目',\r\n GenerateProjectLink: '生成項目鏈接',\r\n ProjectLinkGeneratedInClipBoard: '項目鏈接生成到剪貼板',\r\n DoYouReallyWantToDeleteProject: '您確定刪除項目',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks: '如果此項目已被分享或發布, 改名會使已有鏈接失效',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: '項目設定',\r\n ThumbnailImageSize: '縮略圖大小',\r\n ProjectByOtherPeople: '別人的項目',\r\n Project: '項目',\r\n ProjectType: '類别',\r\n ProjectDescription: '描述',\r\n MakeDescriptionEditable: '編輯描述',\r\n MakeDescriptionNonEditable: '不編輯描述',\r\n DoubleClickToMakeDescriptionEditable: '雙擊此描述激活編輯功能',\r\n SolarPanelArray: '光伏板陣列設計',\r\n CurateCurrentDesign: '收藏當前設計',\r\n UpdateSelectedDesign: '更新選中設計',\r\n RemoveSelectedDesign: '刪除選中設計',\r\n ClickToFlipSortingOrder: '點擊逆轉排序方向',\r\n DesignNotShownInSolutionSpaceClickToShow: '此設計目前不顯示在設計空間內,點擊顯示',\r\n DesignShownInSolutionSpaceClickToHide: '此設計目前顯示在設計空間內,點擊隱藏',\r\n DistributionInSolutionSpace: '方案在設計空間裡的分佈',\r\n ChooseSolutionSpace: '選擇設計空間',\r\n ChooseDataColoring: '選擇數據著色',\r\n SameColorForAllDesigns: '所有設計一個顏色',\r\n OneColorForEachDesign: '每個設計一個顏色',\r\n SolutionSpaceScreenshot: '設計空間截圖',\r\n ScatteredPlotScreenshot: '散點圖截圖',\r\n SingleClickToSelectDoubleClickToOpen: '單擊選擇,雙擊打開。',\r\n SingleClickToDeselectDoubleClickToOpen: '單擊取消選擇,雙擊打開。',\r\n GenerateScatteredPlot: '生成散點圖',\r\n SelectXAxis: '選擇X軸',\r\n SelectYAxis: '選擇Y軸',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: '我的賬戶設定',\r\n MyID: '我的🆔',\r\n ClickToCopyMyID: '點擊此處拷貝我的ID',\r\n IDInClipBoard: '您現在可以粘貼ID了。',\r\n StoreMyNameInMyFilesWhenSaving: '保存文檔時籤上我的大名',\r\n DoYouReallyWantToShowYourNameInYourFiles: '您確定在您的文檔裡保存您的大名嗎?',\r\n SignFileDisclaimer: '如果您選擇保存,您的大名可能被所有打開您的文檔的人看到。',\r\n Likes: '點贊總數',\r\n AllPublished: '發佈總數',\r\n PublishedUnderAliases: '别名發佈',\r\n UserCount: '用戶總數',\r\n SchoolID: '學校編號',\r\n ClassID: '班級編號',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: '日照時間',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: '選擇氣溫模型',\r\n Sinusoidal: '正弦函數',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: '經濟學參數',\r\n ElectricitySellingPrice: '銷售電價',\r\n OperationalCostPerUnit: '單位運行成本',\r\n SellingPrice: '銷售電價',\r\n UnitCost: '單位成本',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: '導航模式參數',\r\n MinimumMoveSpeed: '最小移動速度',\r\n MinimumTurnSpeed: '最小拐彎速度',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: '天空清晰度',\r\n ShowDaylightResults: '顯示日照時間結果',\r\n ShowSkyClearnessResults: '顯示天空清晰度結果',\r\n ShowAverageDailySolarRadiation: '顯示日平均輻射結果',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: '沒有傳感器收集數據。',\r\n NoSolarPanelForAnalysis: '沒有光伏板可以分析。',\r\n NoObserverForVisibilityAnalysis: '沒有找到可見度分析的觀察者。',\r\n NoWaterHeaterForAnalysis: '沒有太陽能熱水器可以分析。',\r\n NoParabolicDishForAnalysis: '沒有拋物線碟可以分析。',\r\n NoParabolicTroughForAnalysis: '沒有拋物線槽可以分析。',\r\n NoFresnelReflectorForAnalysis: '沒有菲涅耳反射鏡可以分析。',\r\n NoHeliostatForAnalysis: '沒有定日鏡可以分析。',\r\n NoSolarUpdraftTowerForAnalysis: '沒有太陽能上升氣流塔可以分析。',\r\n NoBuildingForAnalysis: '沒有建築物可以分析。',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: '雲文檔',\r\n Select: '選擇',\r\n AddFoundation: '添加地基',\r\n AddWall: '添加牆體',\r\n AddWindow: '添加窗戶',\r\n AddDoor: '添加門',\r\n AddPyramidRoof: '添加金字塔屋頂',\r\n AddGableRoof: '添加雙坡屋頂',\r\n AddHipRoof: '添加四坡屋顶',\r\n AddGambrelRoof: '添加复斜屋顶',\r\n AddMansardRoof: '添加折線屋顶',\r\n AddCuboid: '添加長方體',\r\n AddSensor: '添加傳感器',\r\n AddSolarPanel: '添加光伏板',\r\n AddWaterHeater: '添加太陽能熱水器',\r\n AddParabolicDish: '添加拋物線碟',\r\n AddParabolicTrough: '添加拋物線槽',\r\n AddFresnelReflector: '添加菲涅耳反射鏡',\r\n AddHeliostat: '添加定日鏡',\r\n AddWindTurbine: '添加風力渦輪機',\r\n AddLight: '添加電燈',\r\n AddTree: '添加樹木',\r\n AddFlower: '添加花草',\r\n AddPeople: '添加人物',\r\n DoubleClickToLockThisModeForNextAction: '雙擊按鈕給下個動作鎖定此模式',\r\n ClickToUnlockThisModeForNextAction: '點擊按鈕讓動作完成即離開此模式',\r\n ManipulateGroup: '整體操作一個組',\r\n ClearScene: '清空場景',\r\n ShowSunAndTimeSettings: '顯示太陽和時間設置',\r\n SpatialAnalysisOfEnergy: '能量的空間分析',\r\n DoYouReallyWantToClearContent: '您確定清空場景嗎',\r\n ClickForMoreButtons: '點擊此處切換到更多的按鈕模式',\r\n SwitchToAddingFoundation: '切換到添加地基模式',\r\n SwitchToAddingCuboid: '切換到添加長方體模式',\r\n SwitchToAddingWall: '切換到添加牆體模式',\r\n SwitchToAddingWindow: '切換到添加窗戶模式',\r\n SwitchToAddingDoor: '切換到添加門模式',\r\n SwitchToAddingPyramidRoof: '切換到添加金字塔屋頂模式',\r\n SwitchToAddingGableRoof: '切換到添加雙坡屋頂模式',\r\n SwitchToAddingHipRoof: '切換到添加四坡屋頂模式',\r\n SwitchToAddingGambrelRoof: '切換到添加复斜屋頂模式',\r\n SwitchToAddingMansardRoof: '切換到添加折線屋頂模式',\r\n SwitchToAddingSolarPanel: '切換到添加光伏板模式',\r\n SwitchToAddingSensor: '切換到添加傳感器模式',\r\n SwitchToAddingWaterHeater: '切換到添加太陽能熱水器模式',\r\n SwitchToAddingParabolicDish: '切換到添加拋物線碟模式',\r\n SwitchToAddingParabolicTrough: '切換到添加拋物線槽模式',\r\n SwitchToAddingFresnelReflector: '切換到添加菲涅耳反射鏡模式',\r\n SwitchToAddingHeliostat: '切換到添加定日鏡模式',\r\n SwitchToAddingWindTurbine: '切換到添加風力渦輪機模式',\r\n SwitchToAddingLight: '切換到添加電燈模式',\r\n SwitchToAddingTree: '切換到添加樹木模式',\r\n SwitchToAddingFlower: '切換到添加花草模式',\r\n SwitchToAddingPeople: '切換到添加人物模式',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: '訪問未來智能研究所',\r\n visitAladdinHomePage: '訪問阿拉丁主頁',\r\n clickToOpenMenu: '點擊打開主菜單',\r\n clickToAccessAccountSettings: '點擊打開賬號設定',\r\n },\r\n\r\n tree: {\r\n Apple: '蘋果樹',\r\n Birch: '白樺',\r\n Coconut: '椰子樹',\r\n Dogwood: '茱萸',\r\n Elm: '榆樹',\r\n FanPalm: '扇葉棕櫚',\r\n Linden: '菩提',\r\n Magnolia: '玉蘭',\r\n Maple: '楓樹',\r\n Oak: '橡樹',\r\n Pine: '松樹',\r\n Spruce: '雲杉',\r\n },\r\n\r\n flower: {\r\n Bellflower: '鈴蘭',\r\n Boxwood: '黃楊',\r\n CactusCombo1: '仙人掌組合一',\r\n CactusCombo2: '仙人掌組合二',\r\n CactusCombo3: '仙人掌組合三',\r\n CactusCombo4: '仙人掌組合四',\r\n Hibiscus: '木槿',\r\n Hosta: '玉簪',\r\n Hydrangea: '繡球花',\r\n Peony: '牡丹',\r\n RedRose: '紅玫瑰',\r\n Spirea: '繡線菊',\r\n Sunflower: '向日葵',\r\n TallBush: '高灌木',\r\n Tulip: '鬱金香',\r\n WhiteFlower: '白花',\r\n YellowFlower: '黄花',\r\n },\r\n\r\n people: {\r\n Jaah: '賈阿',\r\n Jack: '傑克',\r\n Jacob: '雅各布',\r\n Jacqueline: '杰奎琳',\r\n Jade: '美玉',\r\n Jamelia: '潔米莉雅',\r\n James: '詹姆斯',\r\n Jane: '簡',\r\n Jaya: '佳婭',\r\n Jaye: '傑伊',\r\n Jeanette: '珍妮特',\r\n Jedi: '傑迪',\r\n Jeff: '傑夫',\r\n Jena: '珍娜',\r\n Jennifer: '珍尼弗',\r\n Jess: '傑西',\r\n Jett: '傑特',\r\n Jill: '吉爾',\r\n Jiya: '吉娅',\r\n Joan: '瓊',\r\n Jocelyn: '喬斯林',\r\n Joel: '喬爾',\r\n Joey: '喬伊',\r\n John: '約翰',\r\n Jonathon: '喬納森',\r\n Jose: '何塞',\r\n Joseph: '約瑟夫',\r\n Joshua: '約書亞',\r\n Judd: '賈德',\r\n Judy: '朱蒂',\r\n Julia: '朱莉婭',\r\n Julio: '胡里奥',\r\n Jumapili: '祖瑪匹莉',\r\n June: '準衛',\r\n Juro: '朱諾',\r\n Justin: '賈斯汀',\r\n },\r\n\r\n compass: {\r\n N: '北',\r\n S: '南',\r\n W: '西',\r\n E: '東',\r\n },\r\n\r\n month: {\r\n January: '一月',\r\n February: '二月',\r\n March: '三月',\r\n April: '四月',\r\n May: '五月',\r\n June: '六月',\r\n July: '七月',\r\n August: '八月',\r\n September: '九月',\r\n October: '十月',\r\n November: '十一月',\r\n December: '十二月',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: '按發布者搜索',\r\n SearchByLabel: '按標籤搜索',\r\n MyPublishedModels: '我發布的模型',\r\n TotalNumberOfUserPublishedModels: '用戶發布的模型總數',\r\n SortFromOldestToNewest: '從早到晚排序',\r\n SortFromNewestToOldest: '從晚到早排序',\r\n ModelsFoundOnThisSite: '個模型在此位置',\r\n ShowModelsPublishedByThisAuthor: '展示此用戶發布的模型',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_es = {\r\n translation: {\r\n name: {\r\n IFI: 'Instituto de inteligencia futura',\r\n Aladdin: 'Aladdin',\r\n Tagline: 'Aladdin: Reimagining Design with Explainable AI — Institute for Future Intelligence',\r\n },\r\n\r\n cookie: {\r\n Statement: 'Clicando Aceptar, autoriza el uso de cookies para mejora la experiencia con Aladdin',\r\n Accept: 'Aceptar',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: 'Este producto esta hecho por',\r\n TermsOfService: 'Términos de servicio',\r\n PrivacyPolicy: 'Política de privacidad',\r\n Software: 'Programa',\r\n Content: 'Contenido',\r\n Research: 'Investigación',\r\n Support: 'Ayuda',\r\n Acknowledgment: 'Agradecimientos',\r\n FundingInformation:\r\n 'La National Science Foundation (NSF) proporcionó generosamente fondos para la investigación y el desarrollo de este producto a través de las subvenciones con número #2105695, #2131097, y #2301164. Sin embargo, todas las opiniones, hallazgos y conclusiones o recomendaciones expresados en este producto pertenecen a los autores y no reflejan necesariamente los puntos de vista de la NSF.',\r\n Contact: 'Para más información, por favor contacte con Charles Xie (charles@intofuture.org).',\r\n Translators: 'Translators',\r\n },\r\n\r\n word: {\r\n LastUpdate: 'Last Update',\r\n Small: 'Small',\r\n Medium: 'Medium',\r\n Large: 'Large',\r\n Design: 'Design',\r\n Information: 'Information',\r\n Type: 'Type',\r\n Text: 'Text',\r\n FontSize: 'Font Size',\r\n FontColor: 'Font Color',\r\n Model: 'Model',\r\n Models: 'Models',\r\n Upload: 'Upload',\r\n ClickCount: 'Click Count',\r\n Share: 'Share',\r\n AlreadyLike: 'Already like',\r\n Like: 'Like',\r\n MustLogInToLike: 'Must log in to like',\r\n AllRightsReserved: 'Todos los derechos reservados',\r\n MeterAbbreviation: 'm',\r\n Version: 'Versión',\r\n VersionInitial: 'V',\r\n Options: 'Opciones',\r\n Maximum: 'Maximum',\r\n Minimum: 'Minimum',\r\n MaximumNumber: 'Número máximo',\r\n MinimumNumber: 'Minimum Number',\r\n MaximumValue: 'Maximum Value',\r\n MinimumValue: 'Minimum Value',\r\n Or: 'O',\r\n None: 'Ninguno',\r\n High: 'High',\r\n Partial: 'Partial',\r\n Teacher: 'Profesor',\r\n Class: 'Clase',\r\n Total: 'Total',\r\n Leaderboard: 'Leaderboard',\r\n Latest: 'Latest',\r\n Range: 'Rango',\r\n SIUnit: 'SI Unit',\r\n USUnit: 'US Unit',\r\n ThermalTransmittance: 'Thermal Transmittance',\r\n ThermalResistance: 'Thermal Resistance',\r\n UValue: 'U-Value',\r\n RValue: 'R-Value',\r\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\r\n BuildingHVACSystem: 'Building HVAC System',\r\n ThermostatSetpoint: 'Thermostat Setpoint',\r\n TemperatureToleranceThreshold: 'Tolerance Threshold',\r\n TemperatureToleranceThresholdExplanation:\r\n 'Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.',\r\n Press: 'Press',\r\n Open: 'Abrir',\r\n Save: 'Guardar',\r\n SaveAsImage: 'Guardar como imagen',\r\n SaveAsCsv: 'Save as CSV',\r\n Update: 'Actualizar',\r\n Paste: 'Pegar',\r\n Copy: 'Copiar',\r\n Cut: 'Cortar',\r\n Delete: 'Eliminar',\r\n Lock: 'Cerrar con llave',\r\n Translucent: 'Translucent',\r\n Color: 'Color',\r\n Texture: 'Textura',\r\n Size: 'Tamaño',\r\n Thickness: 'Grosor',\r\n Yes: 'Sí',\r\n No: 'No',\r\n OK: 'OK',\r\n Cancel: 'Cancelar',\r\n Apply: 'Aplicar',\r\n Close: 'Cerrar',\r\n ApplyTo: 'Aplicar a',\r\n Run: 'Run',\r\n Pause: 'Pause',\r\n Resume: 'Resume',\r\n Clear: 'Limpiar',\r\n Warning: 'Aviso',\r\n Caution: 'Caution',\r\n Reminder: 'Reminder',\r\n Length: 'Longitud',\r\n Width: 'Ancho',\r\n Height: 'Altura',\r\n Radius: 'Radius',\r\n Angle: 'Ángulo',\r\n Azimuth: 'Azimut',\r\n Coordinates: 'Coordinates',\r\n Weather: 'Tiempo',\r\n Show: 'Mostrar',\r\n Animate: 'Animar',\r\n Date: 'Fecha',\r\n Time: 'Tiempo',\r\n Title: 'Título',\r\n Owner: 'Propietario',\r\n Action: 'Acción',\r\n Rename: 'Renombrar',\r\n Location: 'Location',\r\n Latitude: 'Latitud',\r\n Month: 'Mes',\r\n Day: 'Día',\r\n Hour: 'Hora',\r\n Daylight: 'Luz solar',\r\n Radiation: 'Radiación',\r\n Temperature: 'Temperatura',\r\n kWh: 'kWh',\r\n dollar: 'dollar',\r\n MeterPerSecond: 'm/s',\r\n NorthInitial: 'N',\r\n SouthInitial: 'S',\r\n EastInitial: 'E',\r\n WestInitial: 'O',\r\n Fixed: 'Fixed',\r\n Elements: 'Elements',\r\n Energy: 'Energy',\r\n Unknown: 'Unknown',\r\n Label: 'Label',\r\n Description: 'Description',\r\n NoDescription: 'No description',\r\n MaximumCharacters: 'Maximum characters',\r\n Author: 'Author',\r\n Publisher: 'Publisher',\r\n Building: 'Building',\r\n ResidentialBuilding: 'Residential Building',\r\n CommercialBuilding: 'Commercial Building',\r\n SchoolBuilding: 'School Building',\r\n TouristAttraction: 'Tourist Attraction',\r\n UnderConstruction: 'Under Construction',\r\n Photovoltaic: 'Photovoltaic',\r\n Anonymous: 'Anonymous',\r\n Nickname: 'Nickname',\r\n Pin: 'Pin',\r\n Unpin: 'Unpin',\r\n },\r\n\r\n shared: {\r\n NoTexture: 'Sin textura',\r\n FoundationElement: 'Bases',\r\n CuboidElement: 'Cuboide',\r\n PolygonElement: 'Polígon',\r\n SensorElement: 'Sensor',\r\n SolarPanelElement: 'Panel solar',\r\n WaterHeaterElement: 'Water Heater',\r\n ParabolicDishElement: 'Parabolic Dish',\r\n ParabolicTroughElement: 'Parabolic Trough',\r\n FresnelReflectorElement: 'Fresnel Reflector',\r\n HeliostatElement: 'Heliostat',\r\n WindTurbineElement: 'Wind Turbine',\r\n LightElement: 'Light',\r\n ElementLocked: 'Bloqueado',\r\n ModelType: 'Model Type',\r\n OutputBreakdown: 'Breakdown',\r\n MoreResults: 'More Results',\r\n },\r\n\r\n message: {\r\n ModelNotFound: 'Model not found',\r\n CannotSignIn: 'Cannot sign in',\r\n CannotSignOut: 'Cannot sign out',\r\n YourAccountWasCreated: 'Your account was created.',\r\n CannotCreateAccount: 'Cannot create an account',\r\n YourAccountSettingsWereSaved: 'Your account settings were saved.',\r\n CannotSaveYourAccountSettings: 'Cannot save your account settings',\r\n CannotSaveYourFileToCloud: 'Cannot save your file to the cloud',\r\n CannotCreateNewProject: 'Cannot create a new project',\r\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\r\n CannotOpenYourProjects: 'Cannot open your projects',\r\n CannotOpenProject: 'Cannot open the project',\r\n CannotDeleteProject: 'Cannot delete the project',\r\n CannotRenameProject: 'Cannot rename the project',\r\n CannotAddDesignToProject: 'Cannot add this design to the project',\r\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\r\n DesignRemovedFromProject: 'The design was successfully removed from the project',\r\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\r\n CannotUpdateProject: 'Cannot update the project',\r\n CannotFetchProjectData: 'Cannot fetch project data',\r\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\r\n CloudFileNotFound: 'The cloud file was not found',\r\n CannotLoadModelsOnMap: 'Cannot load models on map',\r\n CannotLoadLeaderboard: 'Cannot load leaderboard',\r\n CannotPublishModelOnMap: 'Cannot publish model on map',\r\n CannotLikeModelFromMap: 'Cannot like model from map',\r\n CannotDeleteModelFromMap: 'Cannot delete model from map',\r\n ModelDeletedFromMap: 'Model is deleted from map',\r\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\r\n CannotOpenCloudFile: 'Cannot open the cloud file',\r\n CannotReadCloudFile: 'Cannot read the cloud file',\r\n CannotWriteCloudFile: 'Cannot write the cloud file',\r\n CloudFileCopied: 'Cloud file copied',\r\n CannotOpenCloudFolder: 'Cannot open your cloud folder',\r\n CannotDeleteCloudFile: 'Cannot delete the cloud file',\r\n CannotRenameCloudFile: 'Cannot rename the cloud file',\r\n DoYouWantToSaveChanges: '¿Quieres guardar los cambios?',\r\n NotApplicableToSelectedAction: 'No se aplica a la acción seleccionada',\r\n ThisElementIsLocked: 'Este elemento está bloqueado',\r\n ThisCannotBeUndone: 'Esto no se puede deshacer',\r\n AzimuthOfNorthIsZero: 'Azimut del norte es 0°',\r\n CounterclockwiseAzimuthIsPositive: 'Hacia la izquierda es positivo',\r\n MoveCancelledBecauseOfOverlap: 'Move cancelled because of overlap.',\r\n MoveOutsideBoundaryCancelled: 'Move outside the boundary cancelled.',\r\n RotationCancelledBecauseOfOverlap: 'Rotation cancelled because of overlap.',\r\n RotationOutsideBoundaryCancelled: 'Rotation outside the boundary cancelled.',\r\n ResizingCancelledBecauseOfOverlap: 'Resizing cancelled because of overlap.',\r\n ResizingOutsideBoundaryCancelled: 'Resizing outside the boundary cancelled.',\r\n CannotPasteOutsideBoundary: 'Cannot paste outside this surface.',\r\n CannotPasteBecauseOfOverlap: 'Cannot paste because of overlap.',\r\n CannotMoveObjectTooFar: 'Cannot move object too far.',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\r\n 'Existing solar panels will be removed before applying the new layout.',\r\n DoYouWantToContinue: 'Do you want to continue?',\r\n SolarPanelsCannotIntersectWithGround: 'Solar panels cannot intersect with the ground.',\r\n SolarPanelsCannotOverlapWithOneAnother: 'Solar panels cannot overlap with one another.',\r\n ScreenshotSaved: 'A screenshot was saved.',\r\n CsvFileSaved: 'A CSV file was saved.',\r\n SimulationStarted: 'Simulation started.',\r\n SimulationCompleted: 'Simulation completed.',\r\n SimulationAborted: 'Simulation aborted.',\r\n SimulationPaused: 'Simulation paused.',\r\n CancelSimulation: 'Cancel simulation',\r\n PauseSimulation: 'Pause simulation',\r\n ResumeSimulation: 'Resume simulation',\r\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\r\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\r\n EvolutionStarted: 'Evolution started.',\r\n EvolutionCompleted: 'Evolution completed.',\r\n EvolutionAborted: 'Evolution aborted.',\r\n EvolutionPaused: 'Evolution paused.',\r\n EncounterEvolutionError: 'Encountered an evolution error.',\r\n CancelEvolution: 'Cancel evolution',\r\n PauseEvolution: 'Pause evolution',\r\n ResumeEvolution: 'Resume evolution',\r\n ConvergenceThresholdHasBeenReached: 'The convergence threshold has been reached.',\r\n MaximumNumberOfGenerationsHasBeenReached: 'The maximum number of generations has been reached.',\r\n MaximumNumberOfStepsHasBeenReached: 'The maximum number of steps has been reached.',\r\n ObjectiveFunctionTypeError:\r\n 'The current objective function is not supported by this operation. Please start from the menu.',\r\n WallsAreNotAtSameHeight: 'Walls are not at the same height.',\r\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\r\n WallsAreNotConnected: 'Walls are not connected.',\r\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\r\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\r\n BuildingRoofMissing: 'Building has a missing roof.',\r\n UnknownErrors: 'Unknown errors.',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: 'Analysis Options',\r\n option: {\r\n GridCellSize: 'Grid Cell Size',\r\n SamplingFrequency: 'Frecuencia de muestreo',\r\n TimesPerHour: 'Veces per hora',\r\n DaysPerYear: 'Days per Year',\r\n },\r\n mainMenu: 'Menu principal',\r\n cloudMenu: 'Menú en la nube',\r\n projectSubMenu: 'Project',\r\n project: {\r\n CreateNewProject: 'Create New Project',\r\n OpenProject: 'Open Project',\r\n SaveProjectAs: 'Save Project As',\r\n YouMustLogInToCreateProject: 'You must log in to create a new project',\r\n YouMustLogInToOpenProject: 'You must log in to open a project',\r\n },\r\n fileSubMenu: 'Archivo',\r\n file: {\r\n CreateNewFile: 'Crear nuevo archivo',\r\n OpenLocalFile: 'Abrir archivo local',\r\n SaveAsLocalFile: 'Guardar como archivo local',\r\n SavingAbortedMustHaveValidFileName: '!Error guardando! Debes tener un nombre de archivo válido',\r\n OpenCloudFile: 'Abrir archivo en la nube',\r\n SaveCloudFile: 'Guardar archivo en la nube',\r\n SaveAsCloudFile: 'Guardar como archivo en la nube',\r\n SavingAbortedMustHaveValidTitle: '!Error guardando! Debes tener un título válido para el archivo en la nube',\r\n ToSaveYourWorkPleaseSignIn: 'Para guardar tu trabajo, por favor regístrese.',\r\n TakeScreenshot: 'Hacer captura de pantalla',\r\n UseCloudFileName: 'Use Cloud File Name',\r\n PublishOnModelsMap: 'Publish on Models Map',\r\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\r\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\r\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\r\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\r\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\r\n },\r\n editSubMenu: 'Editar',\r\n edit: {\r\n Undo: 'Deshacer',\r\n Redo: 'Repetir',\r\n },\r\n viewSubMenu: 'Vista',\r\n view: {\r\n NavigationView: 'Navigation View',\r\n TwoDimensionalView: 'Vista 2D',\r\n ResetView: 'Resetear',\r\n ZoomIn: 'Acercar',\r\n ZoomOut: 'Alejar',\r\n AutoRotate: 'Auto rotación',\r\n ShowShadow: 'Mostrar sombra',\r\n ShowSurfaceShininess: 'Show Surface Shininess',\r\n TranslucentFloatingWindows: 'Translucent Floating Windows',\r\n accessoriesSubMenu: 'Accessories',\r\n accessories: {\r\n SiteInformation: 'Información del sitio',\r\n DesignInformation: 'Información de diseño',\r\n Instruction: 'Instrucción',\r\n StickyNote: 'Nota adhesiva',\r\n Note: 'Nota',\r\n },\r\n },\r\n settingsSubMenu: 'Settings',\r\n settings: {\r\n WeatherData: 'Datos del tiempo',\r\n DiurnalTemperature: 'Diurnal Temperature',\r\n Heliodon: 'Heliodon',\r\n SunAndTime: 'Sun & Time',\r\n },\r\n benchmarksSubMenu: 'Benchmarks',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: 'Solar Radiation Prediction vs. Measurement',\r\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\r\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\r\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\r\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\r\n },\r\n graph: {\r\n LineWidth: 'Line Width',\r\n SymbolSize: 'Symbol Size',\r\n BarCategoryGap: 'Bar Category Gap',\r\n ShowHorizontalGridLines: 'Show Horizontal Grid Lines',\r\n ShowVerticalGridLines: 'Show Vertical Grid Lines',\r\n },\r\n analysisSubMenu: 'Análisis',\r\n physicsSubMenu: 'Physics',\r\n physics: {\r\n DailySolarRadiationHeatmap: 'Daily Solar Radiation Heatmap',\r\n SolarRadiationHeatmapOptions: 'Solar Radiation Heatmap Options',\r\n SolarRadiationHeatmapGridCellSize: 'Solar Radiation Heatmap Grid Cell Size',\r\n SolarRadiationHeatmapMaxValue: 'Solar Radiation Heatmap Maximum Value',\r\n SolarRadiationHeatmapNoAnimation: 'No Animation for Static Model',\r\n ReflectionHeatmap: 'Reflection Heatmap',\r\n },\r\n sensorSubMenu: 'Sensores',\r\n sensor: {\r\n CollectDailyData: 'Recoger datos diarios',\r\n CollectYearlyData: 'Recoger datos anuales',\r\n SensorSimulationNoAnimation: 'No Animation for Collecting Sensor Data',\r\n },\r\n buildingSubMenu: 'Building',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\r\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\r\n },\r\n solarPanelSubMenu: 'Paneles solares',\r\n solarPanel: {\r\n AnalyzeDailyYield: 'Analizar el rendimiento diario',\r\n AnalyzeYearlyYield: 'Analizar el rendimiento anual',\r\n AnalyzeVisibility: 'Analyze Visibility',\r\n PanelDiscretization: 'Discretización del panel',\r\n Exact: 'Exacto',\r\n Approximate: 'Aproximado',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n VisibilityGridCellSize: 'View Factor Grid Cell Size',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n VisibilityAnalysisOptions: 'Visibility Analysis Options',\r\n SolarPanelSimulationNoAnimation: 'No Animation for Solar Panel Simulation',\r\n },\r\n parabolicTroughSubMenu: 'Parabolic Trough',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n parabolicDishSubMenu: 'Parabolic Dish',\r\n parabolicDish: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n fresnelReflectorSubMenu: 'Fresnel Reflector',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n heliostatSubMenu: 'Heliostat',\r\n heliostat: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n },\r\n solarUpdraftTowerSubMenu: 'Solar Updraft Tower',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: 'Analyze Daily Yield',\r\n AnalyzeYearlyYield: 'Analyze Yearly Yield',\r\n SolarUpdraftTowerSimulationNoAnimation: 'No Animation for Solar Updraft Tower Simulation',\r\n },\r\n\r\n tutorialsSubMenu: 'Tutorials',\r\n\r\n solarEnergyScienceSubMenu: 'Solar Science',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: 'Ángulos solares relativos a un observador en el suelo',\r\n InsolationAndClimate: 'Insolation and Climate',\r\n SolarRadiationToBox: 'Radiación solar a una caja',\r\n },\r\n\r\n buildingScienceSubMenu: 'Building Science',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\r\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\r\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\r\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\r\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\r\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\r\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\r\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\r\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\r\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\r\n },\r\n\r\n buildingDesignSubMenu: 'Building Design',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: 'Cape Cod Style House with Shed Dormer',\r\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\r\n GableRoofVsHipRoof: 'Gable Roof vs. Hip Roof',\r\n ColonialVsSaltbox: 'Colonial vs. Saltbox',\r\n GambrelRoofVsMansardRoof: 'Gambrel Roof vs. Mansard Roof',\r\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\r\n DutchGableRoof: 'Dutch Gable Roof',\r\n GableAndValleyRoof: 'Gable and Valley Roof',\r\n ClerestoryRoof: 'Clerestory Roof',\r\n MonitorRoof: 'Monitor Roof',\r\n AFrameHouse: 'A-Frame House',\r\n HalfTimberedHouse: 'Half-Timbered House',\r\n AllBasicRoofTypes: 'All Basic Roof Types',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: 'Photovoltaic Solar Power',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: 'Effect of Tilt Angle',\r\n EffectOfAzimuthOfSolarPanel: 'Effect of Azimuth',\r\n SolarPanelTypes: 'Solar Panel Types',\r\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\r\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\r\n SolarTrackers: 'Seguidores solares',\r\n CoveringGroundWithSolarPanels: 'Why Just Covering the Ground with Solar Panels is not a Good Idea',\r\n InterRowSpacingOfSolarPanelArray: 'Effect of Inter-Row Spacing in a Solar Panel Array',\r\n EffectOfOrientationOfSolarPanels: 'Effect of Orientation of Solar Panels',\r\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: 'Concentrated Solar Power',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: 'Effect of Azimuth of a Parabolic Trough',\r\n EffectOfLatusRectumOfParabolicTrough: 'Effect of Latus Rectum of a Parabolic Trough',\r\n FocusSunlightWithParabolicDish: 'Focus Sunlight with a Parabolic Dish',\r\n LinearFresnelReflectors: 'Linear Fresnel Reflectors',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\r\n 'Effect of Absorber Pipe Height for Linear Fresnel Reflectors',\r\n EffectOfAzimuthOfLinearFresnelReflectors: 'Effect of Azimuth of Linear Fresnel Reflectors',\r\n LinearFresnelReflectorsWithTwoAbsorbers: 'Linear Fresnel Reflectors with Two Absorbers',\r\n CosineEfficiencyOfHeliostats: 'Cosine Efficiency of Heliostats',\r\n ShadowingAndBlockingOfHeliostats: 'Shadowing and Blocking of Heliostats',\r\n EffectSolarPowerTowerHeight: 'Effect of Solar Power Tower Height',\r\n SolarPowerTower: 'Solar Power Tower',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: 'Other Types of Solar Power',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: 'Solar Updraft Tower',\r\n },\r\n\r\n generativeDesignSubMenu: 'Generative Design',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\r\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\r\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\r\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\r\n },\r\n\r\n examplesSubMenu: 'Ejemplos',\r\n\r\n solarEnergySubMenu: 'Energía Solar',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: 'Rayo de sol y heliodon',\r\n RooftopSolarPanels: 'Rooftop Solar Panels',\r\n NevadaSolarOneParabolicTroughArray: 'Nevada Solar One Parabolic Trough Array',\r\n TooeleParabolicDishArray: 'Tooele Parabolic Dish Array',\r\n PS10SolarPowerTower: 'PS10 Solar Power Tower',\r\n TucsonLinearFresnelReflectors: 'Tucson Linear Fresnel Reflectors',\r\n SolarCanopyFormFactors: 'Solar Canopy Form Factors',\r\n SolarCanopyOverBleachers: 'Solar Canopy Over Bleachers',\r\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\r\n SolarBusStop: 'Solar Bus Stop',\r\n SolarFacadeTesla: 'Tesla Solar Façade',\r\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\r\n Floatovoltaics: 'Floatovoltaics',\r\n Agrivoltaics: 'Agrivoltaics',\r\n VegetativeBuffer: 'Vegetative Buffer',\r\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\r\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\r\n SolarPanelsOverCanalBakersfieldCA: 'Hypothetical Solar Panels Over Canal in Bakersfield, CA',\r\n SolarNoiseBarrierLexingtonMA: 'Hypothetical Solar Noise Barrier in Lexington, MA',\r\n HSATSolarTrackersRaleighNC: 'Horizontal Single Axis Trackers (HSAT) in Raleigh, NC',\r\n AADATSolarTrackersLancasterCA: 'Azimuth–Altitude Dual Axis Trackers (AADAT) in Lancaster, CA',\r\n SolarUpdraftTowerInCity: 'Solar Updraft Tower in City',\r\n },\r\n\r\n builtEnvironmentSubMenu: 'Built Environment',\r\n residentialBuildingsSubMenu: 'Residential Buildings',\r\n residentialBuildingExamples: {\r\n ColonialHouse: 'Colonial House',\r\n DutchColonialHouse: 'Dutch Colonial House',\r\n TShapedHouse: 'T-Shaped House',\r\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\r\n Solarium: 'Solarium',\r\n Church1: 'Church 1',\r\n Cathedral1: 'Cathedral 1',\r\n Cathedral2: 'Cathedral 2',\r\n Mosque1: 'Mosque 1',\r\n AdobeTaosHouse: 'Adobe Taos House',\r\n RanchHouse: 'Ranch House',\r\n BonnetHouse: 'Bonnet House',\r\n BarnStyleHouse: 'Barn Style House',\r\n ModernHouse: 'Modern House',\r\n ButterflyRoofHouse: 'Butterfly Roof House',\r\n },\r\n commercialBuildingsSubMenu: 'Commercial Buildings',\r\n commercialBuildingExamples: {\r\n WhiteHouse: 'White House',\r\n BilimMersinTurkiye: 'BILIM, Mersin, Turkiye',\r\n SpanishStyleHotel: 'Spanish Style Hotel',\r\n ApartmentBuilding: 'Apartment Building',\r\n OfficeBuilding: 'Edificio de oficinas',\r\n Hotel: 'Hotel',\r\n },\r\n buildingComplexesSubMenu: 'Building Complexes',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, VT',\r\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\r\n },\r\n urbanPlanningSubMenu: 'Urban Planning',\r\n urbanPlanningExamples: {\r\n Heatmap1: 'Heatmap',\r\n },\r\n otherBuildingsSubMenu: 'Other Buildings',\r\n otherBuildingExamples: {\r\n Greenhouse: 'Greenhouse',\r\n Pavilion: 'Pavilion in a Park',\r\n OctagonalPagoda: 'Octagonal Pagoda',\r\n OceanFront: 'Ocean Front',\r\n EgyptianPyramids: 'Egyptian Pyramids',\r\n MayanPyramid: 'Mayan Pyramid',\r\n SiOSePol: 'Si-o-se-pol',\r\n StackedCuboids: 'Stacked Cuboids',\r\n },\r\n\r\n artificialIntelligenceSubMenu: 'Artificial Intelligence',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: 'Optimizing the Tilt Angle of a Solar Panel Row',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Optimizing the Tilt Angles of Multiple Solar Panel Rows',\r\n SolarFarmGenerativeDesign: 'Solar Farm Generative Design',\r\n SolarFarmGenerativeDesignWithBlock: 'Solar Farm Generative Design in the Presence of a Block',\r\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Solar Farm Generative Design',\r\n },\r\n\r\n languageSubMenu: 'Idioma',\r\n publicSubMenu: 'Public',\r\n ModelsGallery: 'Models Gallery',\r\n ModelsMap: 'Models Map',\r\n AboutUs: 'Sobre nosotros',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: 'Configuraciones de la cuenta',\r\n PrivacyStatementTitle: 'User Privacy Protection Statement',\r\n PrivacyStatement:\r\n 'When you sign in, your Google ID is used to create and access your Aladdin account. Only a random alphanumeric string is stored in our database as a reference. No personally identifiable data such as your name or email is ever gathered. For more information, see our ',\r\n SignIn: 'Iniciar sesión',\r\n SignOut: 'Desconectar',\r\n IfYouAreAStudent: 'Si eres un estudiante',\r\n },\r\n\r\n skyMenu: {\r\n Axes: 'Ejes',\r\n Theme: 'Tema',\r\n ThemeDefault: 'Por defecto',\r\n ThemeDesert: 'Desierto',\r\n ThemeDune: 'Dune',\r\n ThemeForest: 'Bosque',\r\n ThemeGrassland: 'Campo',\r\n ThemeHill: 'Hill',\r\n ThemeLake: 'Lake',\r\n ThemeMountain: 'Mountain',\r\n ThemeRural: 'Rural',\r\n SunlightAttenuationCoefficientInAir: 'Sunlight Attenuation Coefficient in Air',\r\n ConvectiveCoefficientOfAir: 'Convective Coefficient of Air',\r\n HighestTemperatureTimeInMinutes: 'Highest Temperature Time (Minutes)',\r\n SelectSunAnglesToShow: 'Select Sun Angles to Show',\r\n ShowAzimuthAngle: 'Show Azimuth Angle',\r\n ShowElevationAngle: 'Show Elevation Angle',\r\n ShowZenithAngle: 'Show Zenith Angle',\r\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\r\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\r\n Vegetation: 'Vegetation',\r\n LeafOutDay: 'Leaf-Out Day',\r\n LeafOffDay: 'Leaf-Off Day',\r\n Albedo: 'Albedo',\r\n ImageOnGround: 'Imagen en el suelo',\r\n WaterSurface: 'Water Surface',\r\n RemoveAllUnlockedTrees: 'Eliminar todos los árboles',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedPeople: 'Eliminar toda la gente',\r\n RemoveAllUnlockedFoundations: 'Eliminar todos las bases',\r\n RemoveAllUnlockedCuboids: 'Eliminar todos los cuboides',\r\n DoYouReallyWantToRemoveAllPeople: 'Estás seguro que quieres eliminar a toda la gente who are not locked',\r\n DoYouReallyWantToRemoveAllTrees: 'Estás seguro que quieres eliminar todos los árboles that are not locked',\r\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\r\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\r\n DoYouReallyWantToRemoveAllFoundations: 'Estás seguro que quieres eliminar todas las bases that are not locked',\r\n DoYouReallyWantToRemoveAllCuboids: 'Estás seguro que quieres eliminar todos los cuboides that are not locked',\r\n LockAllElements: 'Lock All Elements',\r\n UnlockAllElements: 'Unlock All Elements',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: 'Etiqueta',\r\n LabelText: 'Label Text',\r\n LabelHeight: 'Label Height',\r\n LabelSize: 'Label Size',\r\n LabelFontSize: 'Font Size',\r\n LabelColor: 'Label Color',\r\n KeepShowingLabel: 'Seguir mostrando etiqueta',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: 'Eliminar todos los paneles solares',\r\n RemoveAllUnlockedParabolicTroughs: 'Remove All Unlocked Parabolic Troughs',\r\n RemoveAllUnlockedParabolicDishes: 'Remove All Unlocked Parabolic Dishes',\r\n RemoveAllUnlockedFresnelReflectors: 'Remove All Unlocked Fresnel Reflectors',\r\n RemoveAllUnlockedHeliostats: 'Remove All Unlocked Heliostats',\r\n RemoveAllUnlockedSensors: 'Eliminar todos los sensores',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n RemoveAllUnlockedWalls: 'Eliminar todas las paredes',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\r\n RemoveAllUnlockedHumans: 'Remove All Humans',\r\n RemoveAllUnlockedTrees: 'Remove All Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Rejillas',\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n SolarPanels: 'Paneles solares',\r\n SolarPanelArray: 'Solar Panel Array',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\r\n 'Estás seguro que quieres eliminar todos los paneles solares en esta base that are not locked',\r\n ParabolicTroughs: 'Parabolic Troughs',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\r\n 'Do you really want to remove all the parabolic troughs on this foundation that are not locked',\r\n ParabolicDishes: 'Parabolic Dishes',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\r\n 'Do you really want to remove all the parabolic dishes on this foundation that are not locked',\r\n FresnelReflectors: 'Fresnel Reflectors',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\r\n 'Do you really want to remove all the Fresnel reflectors on this foundation that are not locked',\r\n Heliostats: 'Heliostats',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\r\n 'Do you really want to remove all the heliostats on this foundation that are not locked',\r\n Sensors: 'Sensores',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\r\n 'Estás seguro que quieres eliminar todos los sensores de esta base',\r\n Lights: 'Lights',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation:\r\n 'Do you really want to remove all the lights on this foundation that are not locked',\r\n Walls: 'Paredes',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation:\r\n 'Estás seguro que quieres eliminar todas las paredes de esta base that are not locked',\r\n Windows: 'Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\r\n 'Do you really want to remove all the windows on this foundation that are not locked',\r\n Doors: 'Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\r\n 'Do you really want to remove all the doors on this foundation that are not locked',\r\n Polygons: 'Polígonos',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\r\n 'Estás seguro que quieres eliminar todos los polígonos de esta base that are not locked',\r\n Humans: 'Humans',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation:\r\n 'Do you really want to remove all the humans on this foundation who are not locked',\r\n Trees: 'Trees',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation:\r\n 'Do you really want to remove all the trees on this foundation that are not locked',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\r\n 'Do you really want to remove all the flowers on this foundation that are not locked',\r\n OnlyThisFoundation: 'Solamente esta base',\r\n AllConnectedFoundations: 'Todas las bases conectadas',\r\n AllSelectedFoundations: 'All Selected Foundations',\r\n AllFoundations: 'Todas las bases',\r\n AddPolygon: 'Añadir polígono',\r\n SolarStructure: 'Solar Structure',\r\n GroupMaster: 'Group Master',\r\n LockAllElementsOnThisFoundation: 'Lock All Elements on This Foundation',\r\n UnlockAllElementsOnThisFoundation: 'Unlock All Elements on This Foundation',\r\n GroundFloorRValue: 'Ground Floor R-Value',\r\n OnlyThisGroundFloor: 'Only This Ground Floor',\r\n AllGroundFloors: 'All Ground Floors',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: 'Receiver Tower for Heliostats',\r\n ReceiverTowerPhysicalProperties: 'Physical Properties of Receiver Tower',\r\n ReceiverTowerHeight: 'Height of Receiver Tower',\r\n ReceiverTowerRadius: 'Radius of Receiver Tower',\r\n ReceiverAbsorptance: 'Absorptance of Receiver',\r\n ReceiverOpticalEfficiency: 'Optical Efficiency of Receiver',\r\n ReceiverThermalEfficiency: 'Thermal Efficiency of Receiver',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: 'Absorber Pipe for Fresnel Reflectors',\r\n AbsorberPipePhysicalProperties: 'Physical Properties of Absorber Pipe',\r\n AbsorberHeight: 'Height of Absorber Pipe',\r\n AbsorberApertureWidth: 'Aperture Width of Absorber Pipe',\r\n AbsorberPipePoleNumber: 'Pole Number for Absorber Pipe',\r\n AbsorberAbsorptance: 'Absorptance of Absorber',\r\n AbsorberOpticalEfficiency: 'Optical Efficiency of Absorber',\r\n AbsorberThermalEfficiency: 'Thermal Efficiency of Absorber',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: 'Solar Updraft Tower',\r\n SolarUpdraftTowerPhysicalProperties: 'Physical Properties of Solar Updraft Tower',\r\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Tower Chimney Height',\r\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Tower Chimney Radius',\r\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Tower Collector Height',\r\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Tower Collector Radius',\r\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Tower Collector Transmissivity',\r\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Tower Collector Emissivity',\r\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Tower Discharge Coefficient',\r\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Tower Turbine Efficiency',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n RemoveAllUnlockedSolarPanels: 'Eliminar todos los paneles solares',\r\n RemoveAllUnlockedSensors: 'Eliminar todos los sensores',\r\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\r\n RemoveAllUnlockedHumans: 'Remove All Humans',\r\n RemoveAllUnlockedTrees: 'Remove All Trees',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Rejillas',\r\n SolarPanels: 'Paneles solares',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\r\n 'Estás seguro que quieres eliminar todos los paneles solares de este cuboide that are not locked',\r\n Sensors: 'Sensores',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\r\n 'Estás seguro que quieres eliminar todos los sensores de este cuboide that are not locked',\r\n Polygons: 'Polígonos',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\r\n 'Estás seguro que quieres eliminar todos los polígonos de este cuboide that are not locked',\r\n Humans: 'Humans',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid:\r\n 'Do you really want to remove all the humans on this cuboid who are not locked',\r\n Trees: 'Trees',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid:\r\n 'Do you really want to remove all the trees on this cuboid that are not locked',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\r\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\r\n OnlyThisCuboid: 'Solamente este cuboide',\r\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\r\n AllCuboidsAboveSameBase: 'All Cuboids above Same Base',\r\n AllSelectedCuboids: 'All Selected Cuboids',\r\n AllCuboids: 'Todos los cuboides',\r\n OnlyThisSide: 'Solamente este lado',\r\n AllSidesOfThisCuboid: 'Todos los lados en este cuboide',\r\n AllSidesOfSelectedCuboids: 'All Sides of Selected Cuboids',\r\n AllSidesOfAllCuboids: 'Todos los lados en todos los cuboides',\r\n AddPolygon: 'Añadir polígono',\r\n Stackable: 'Stackable',\r\n GroupMaster: 'Group Master',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n TextBox: 'Text Box',\r\n FontOutlineColor: 'Font Outline Color',\r\n FontOutlineWidth: 'Font Outline Width',\r\n FontStrokeColor: 'Font Stroke Color',\r\n FontStrokeWidth: 'Font Stroke Width',\r\n NoOutline: 'No Outline',\r\n Shiny: 'Shiny',\r\n Filled: 'Rellenar',\r\n FillTexture: 'Rellenar textura',\r\n FillColor: 'Rellenar color',\r\n Opacity: 'Opacity',\r\n LineColor: 'Color de la línea',\r\n LineWidth: 'Line Width',\r\n LineStyle: 'Line Style',\r\n SolidLine: 'Solid Line',\r\n DashedLine: 'Dashed Line',\r\n DottedLine: 'Dotted Line',\r\n InsertVertexBeforeIndex: 'Añadir vértice antes del índice',\r\n InsertVertexAfterIndex: 'Añadir vértice después del índice',\r\n DeleteVertex: 'Eliminar vértice',\r\n OnlyThisPolygon: 'Solamente este polígono',\r\n AllPolygonsOnSurface: 'All Polygons on the Same Surface',\r\n AllPolygonsAboveFoundation: 'Todos los polígonos sobre la base',\r\n AllSelectedPolygons: 'All Selected Polygons',\r\n AllPolygons: 'Todos los polígonos',\r\n Layout: 'Layout',\r\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\r\n SolarPanelArrayLayoutParametricDesign: 'Solar Panel Array Layout: Parametric Design',\r\n SolarPanelArrayLayoutGenerativeDesign: 'Solar Panel Array Layout: Generative Design',\r\n SolarPanelArrayModel: 'Solar Panel Model',\r\n SolarPanelArrayOrientation: 'Orientation',\r\n SolarPanelArrayTiltAngle: 'Tilt Angle',\r\n SolarPanelArrayRowWidth: 'Row Width',\r\n SolarPanelArrayInterRowSpacing: 'Inter-Row Spacing',\r\n SolarPanelArrayRowSpacing: 'Row Spacing',\r\n SolarPanelArrayRowAxis: 'Row Axis',\r\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\r\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\r\n SolarPanelArrayEastWestRowAxis: 'East-West (Absolute)',\r\n SolarPanelArrayNorthSouthRowAxis: 'North-South (Absolute)',\r\n SolarPanelArrayMargin: 'Margin',\r\n SolarPanelArrayPoleHeight: 'Pole Height',\r\n SolarPanelArrayPoleSpacing: 'Pole Spacing',\r\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\r\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\r\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\r\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\r\n SolarPanelArrayYearlyProfit: 'Profit',\r\n LayoutNotAcceptedCheckYourParameters: 'This layout is not accepted. Please check your parameters.',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: 'Optimization',\r\n Parameters: 'Parameters',\r\n Variables: 'Variables',\r\n Constants: 'Constants',\r\n GeneticAlgorithm: 'Genetic Algorithm',\r\n GeneticAlgorithmSettings: 'Genetic Algorithm Settings',\r\n ParticleSwarmOptimization: 'Particle Swarm Optimization',\r\n ParticleSwarmOptimizationSettings: 'Particle Swarm Optimization Settings',\r\n SolarPanelTiltAngleOptimization: 'Solar Panel Tilt Angle Optimization',\r\n SolarPanelArrayLayout: 'Solar Panel Array Layout',\r\n Generation: 'Generation',\r\n Gene: 'Gene',\r\n NormalizedVariables: 'Normalized Variables',\r\n Objective: 'Objective',\r\n ObjectiveFunctionDailyTotalYield: 'Daily Total Yield',\r\n ObjectiveFunctionYearlyTotalYield: 'Yearly Total Yield',\r\n ObjectiveFunctionDailyMeanYield: 'Daily Mean Yield',\r\n ObjectiveFunctionYearlyMeanYield: 'Yearly Mean Yield',\r\n ObjectiveFunctionDailyProfit: 'Daily Profit',\r\n ObjectiveFunctionYearlyProfit: 'Yearly Profit',\r\n GeneticAlgorithmSelectionMethod: 'Genetic Algorithm Selection Method',\r\n RouletteWheel: 'Roulette Wheel',\r\n Tournament: 'Tournament',\r\n SearchMethod: 'Search Method',\r\n GlobalSearchUniformSelection: 'Global Search Uniform Selection',\r\n LocalSearchRandomOptimization: 'Local Search Random Optimization',\r\n PopulationSize: 'Population Size',\r\n MaximumGenerations: 'Maximum Generations',\r\n SelectionRate: 'Selection Rate',\r\n CrossoverRate: 'Crossover Rate',\r\n MutationRate: 'Mutation Rate',\r\n Step: 'Step',\r\n SwarmSize: 'Swarm Size',\r\n MaximumSteps: 'Maximum Steps',\r\n MaximumVelocity: 'Maximum Velocity',\r\n InertiaWeight: 'Inertia Weight',\r\n CognitiveCoefficient: 'Cognitive Coefficient',\r\n SocialCoefficient: 'Social Coefficient',\r\n ConvergenceThreshold: 'Convergence Threshold for Termination',\r\n LocalSearchRadius: 'Local Search Radius',\r\n RowsPerRackRange: 'Range for Rows per Rack',\r\n TiltAngleRange: 'Range for Tilt Angle',\r\n InterRowSpacingRange: 'Range for Inter-Row Spacing',\r\n ClickTargetPolygonToActivate: 'Click Target Polygon to Activate',\r\n ClickTargetFoundationToActivate: 'Click Target Foundation to Activate',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: 'Mostrar modelo',\r\n Flip: 'Flip',\r\n Type: 'Tipo',\r\n Spread: 'Extender',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: 'Flip',\r\n Type: 'Type',\r\n Spread: 'Spread',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: 'Cambiar persona',\r\n Flip: 'Flip',\r\n Observer: 'Observer',\r\n ViewFromThisPerson: 'View from This Person',\r\n },\r\n\r\n lightMenu: {\r\n Color: 'Color',\r\n Intensity: 'Intensity',\r\n Decay: 'Decay',\r\n MaximumDistance: 'Distance',\r\n Inside: 'Inside',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: 'Azimut relativa',\r\n Pole: 'Pole',\r\n PoleHeight: 'Altura del poste',\r\n PoleRadius: 'Pole Radius',\r\n ExtraPoleHeight: 'Extra Pole Height',\r\n ExtraPoleHeightInAdditionToHalfWidth: 'Extra Pole Height in Addition to Half Width',\r\n DrawSunBeam: 'Dibujar rayo del sol',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: 'Reflector Reflectance',\r\n ReceiverAbsorptance: 'Receiver Absorptance',\r\n ReflectorOpticalEfficiency: 'Reflector Optical Efficiency',\r\n ReceiverThermalEfficiency: 'Receiver Thermal Efficiency',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: 'Inverter Efficiency',\r\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\r\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\r\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\r\n ChangePvModel: 'Cambiar modelo PV',\r\n Orientation: 'Orientación',\r\n Portrait: 'Vertical',\r\n Landscape: 'Horizontal',\r\n FrameColor: 'Frame Color',\r\n Panels: 'paneles',\r\n PanelsWide: 'ancho paneles',\r\n PanelsLong: 'longitud paneles',\r\n TiltAngle: 'Inclinar ángulo',\r\n SouthFacingIsPositive: 'Orientado al sur es positivo',\r\n Tracker: 'Seguidor',\r\n SolarTrackerFollowsSun: 'Un seguidor sigue el sol para incrementar las salidas de los paneles solares',\r\n PoleSpacing: 'Espaciado entre postes',\r\n NoTracker: 'Sin seguimiento',\r\n HorizontalSingleAxisTracker: 'Seguidor horizontal de eje único',\r\n VerticalSingleAxisTracker: 'Seguidor vertical de eje único',\r\n AltazimuthDualAxisTracker: 'Seguidor de doble eje altazimutal',\r\n OnlyThisSolarPanel: 'Solamente este panel solar',\r\n AllSolarPanelsOnSurface: 'Todos los paneles solares en la misma superficie',\r\n AllSolarPanelsAboveFoundation: 'Todos los paneles solares sobre la misma base',\r\n AllSelectedSolarPanels: 'All Selected Solar Panels',\r\n AllSolarPanels: 'Todos los paneles solares',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: 'Especificaciones del panel solar',\r\n Model: 'Modelo',\r\n PanelSize: 'Tamaño del panel',\r\n Cells: 'Celdas',\r\n CellType: 'Tipo de celda',\r\n Monocrystalline: 'Monocristalino',\r\n Polycrystalline: 'Policristalino',\r\n ThinFilm: 'Película delgada',\r\n Bifacial: 'Bifacial',\r\n BifacialityFactor: 'Bifaciality Factor',\r\n Black: 'Negro',\r\n Blue: 'Azul',\r\n ShadeTolerance: 'Tolerancia a la sombra',\r\n SolarCellEfficiency: 'Eficiencia de la célula solar',\r\n NominalOperatingCellTemperature: 'Temperatura nominal de la celda de funcionamiento',\r\n TemperatureCoefficientOfPmax: 'Coeficiente de temperatura de Pmax',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: 'Module Length',\r\n Modules: 'modules',\r\n ModulesLong: 'modules long',\r\n LatusRectum: 'Latus Rectum',\r\n OnlyThisParabolicTrough: 'Only This Parabolic Trough',\r\n AllParabolicTroughsAboveFoundation: 'All Parabolic Troughs Above the Same Foundation',\r\n AllSelectedParabolicTroughs: 'All Selected Parabolic Troughs',\r\n AllParabolicTroughs: 'All Parabolic Troughs',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: 'Absorber Pipe',\r\n SelectAbsorberToReflectSunlightTo: 'Select Absorber to Reflect Sunlight to',\r\n ModuleLength: 'Module Length',\r\n Modules: 'modules',\r\n ModulesLong: 'modules long',\r\n OnlyThisFresnelReflector: 'Only This Fresnel Reflector',\r\n AllFresnelReflectorsAboveFoundation: 'All Fresnel Reflectors Above the Same Foundation',\r\n AllSelectedFresnelReflectors: 'All Selected Fresnel Reflectors',\r\n AllFresnelReflectors: 'All Fresnel Reflectors',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: 'Tower',\r\n SelectTowerToReflectSunlightTo: 'Select Tower to Reflect Sunlight to',\r\n OnlyThisHeliostat: 'Only This Heliostat',\r\n AllHeliostatsAboveFoundation: 'All Heliostats Above the Same Foundation',\r\n AllSelectedHeliostats: 'All Selected Heliostats',\r\n AllHeliostats: 'All Heliostats',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: 'Receiver Structure',\r\n CentralPole: 'Central Pole',\r\n CentralPoleWithTripod: 'Central Pole with Tripod',\r\n Quadrupod: 'Quadrupod',\r\n RimDiameter: 'Rim Diameter',\r\n LatusRectum: 'Latus Rectum',\r\n ExtraPoleHeightInAdditionToRadius: 'Extra Pole Height in Addition to Radius',\r\n OnlyThisParabolicDish: 'Only This Parabolic Dish',\r\n AllParabolicDishesAboveFoundation: 'All Parabolic Dishes Above the Same Foundation',\r\n AllSelectedParabolicDishes: 'All Selected Parabolic Dishes',\r\n AllParabolicDishes: 'All Parabolic Dishes',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: 'Por defecto',\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n SizeOfWall: 'Tamaño de la pared',\r\n OnlyThisWall: 'Solamente esta pared',\r\n AllConnectedWalls: 'All Connected Walls',\r\n AllWallsAboveFoundation: 'Todas las paredes sobre la misma base',\r\n AllSelectedWalls: 'All Selected Walls',\r\n AllWalls: 'Todo paredes',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Do you really want to remove all the windows on this wall',\r\n Doors: 'Doors',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Do you really want to remove all the doors on this wall',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Do you really want to remove all the solar panels on this wall',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\r\n LockAllPolygons: 'Lock All Polygons',\r\n UnlockAllPolygons: 'Unlock All Polygons',\r\n RemoveAllUnlockedPolygons: 'Eliminar todos los polígonos',\r\n WallStructure: 'Wall Structure',\r\n DefaultStructure: 'Default',\r\n StudStructure: 'Stud',\r\n PillarStructure: 'Pillar',\r\n Opacity: 'Opacity',\r\n StructureSpacing: 'Structure Spacing',\r\n StructureWidth: 'Structure Width',\r\n StructureThickness: 'Structure Thickness',\r\n StructureColor: 'Structure Color',\r\n Color: 'Wall Color',\r\n Height: 'Altura',\r\n Thickness: 'Thickness',\r\n Texture: 'Texture',\r\n AllLightsOnWallInside: 'All Lights on Wall Inside',\r\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\r\n Fill: 'Fill',\r\n Full: 'Full',\r\n Partial: 'Partial',\r\n Empty: 'Empty',\r\n OpenToOutside: 'Open to Outside',\r\n EavesLength: 'Eaves Overhang Length',\r\n Parapet: 'Parapet',\r\n ParapetColor: 'Parapet Color',\r\n ParapetTexture: 'Parapet Texture',\r\n ParapetHeight: 'Parapet Height',\r\n CopingsHeight: 'Copings Height',\r\n CopingsWidth: 'Copings Width',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: 'Only This Window',\r\n AllWindowsOnSurface: 'All Windows on the Same Surface',\r\n AllWindowsAboveFoundation: 'All Windows Above the Same Foundation',\r\n AllSelectedWindows: 'All Selected Windows',\r\n AllWindows: 'All Windows',\r\n Width: 'Ancho',\r\n Height: 'Altura',\r\n Setback: 'Setback from Exterior Surface',\r\n RelativeToWallThickness: 'Relative to wall thickness',\r\n Mullion: 'Mullion',\r\n HorizontalMullion: 'Horizontal Mullion',\r\n VerticalMullion: 'Vertical Mullion',\r\n MullionWidth: 'Mullion Width',\r\n HorizontalMullionSpacing: 'Horizontal Mullion Spacing',\r\n VerticalMullionSpacing: 'Vertical Mullion Spacing',\r\n MullionColor: 'Mullion Color',\r\n Tint: 'Tint',\r\n Opacity: 'Opacity',\r\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\r\n Shutter: 'Shutter',\r\n LeftShutter: 'Left Shutter',\r\n RightShutter: 'Right Shutter',\r\n BothShutters: 'Both Shutters',\r\n ShutterWidth: 'Relative Width',\r\n ShutterColor: 'Shutter Color',\r\n Frame: 'Frame',\r\n FrameWidth: 'Frame Width',\r\n SillWidth: 'Sill Width',\r\n Color: 'Frame Color',\r\n WindowType: 'Window Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Polygonal: 'Polygonal',\r\n Interior: 'Interior',\r\n Empty: 'Empty',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: 'Por defecto',\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n OnlyThisRoof: 'Only This Wall',\r\n AllRoofsAboveFoundation: 'All Walls Above the Same Foundation',\r\n AllSelectedRoofs: 'All Selected Roofs',\r\n AllRoofs: 'All Roofs',\r\n OnlyThisCeiling: 'Only This Ceiling',\r\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\r\n AllCeilings: 'All Ceilings',\r\n EavesOverhangLength: 'Eaves Overhang Length',\r\n RafterSpacing: 'Rafter Spacing',\r\n RafterWidth: 'Rafter Width',\r\n RafterThickness: 'Rafter Thickness',\r\n RafterColor: 'Rafter Color',\r\n RoofColor: 'Roof Color',\r\n RoofSideColor: 'Roof Side Color',\r\n GlassTint: 'Glass Tint',\r\n Opacity: 'Opacity',\r\n RoofStructure: 'Roof Structure',\r\n DefaultStructure: 'Default',\r\n RafterStructure: 'Rafter',\r\n GlassStructure: 'Glass',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\r\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\r\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\r\n Rise: 'Rise',\r\n Ceiling: 'Ceiling',\r\n RoofRValue: 'Roof R-Value',\r\n CeilingRValue: 'Ceiling R-Value',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: 'Por defecto',\r\n Texture01: 'Textura 1',\r\n Texture02: 'Textura 2',\r\n Texture03: 'Textura 3',\r\n Texture04: 'Textura 4',\r\n Texture05: 'Textura 5',\r\n Texture06: 'Textura 6',\r\n Texture07: 'Textura 7',\r\n Texture08: 'Textura 8',\r\n Texture09: 'Textura 9',\r\n Texture10: 'Textura 10',\r\n Texture11: 'Textura 11',\r\n Texture12: 'Textura 12',\r\n Texture13: 'Textura 13',\r\n Texture14: 'Textura 14',\r\n Texture15: 'Textura 15',\r\n Texture16: 'Textura 16',\r\n Texture17: 'Textura 17',\r\n OnlyThisDoor: 'Only This Door',\r\n AllDoorsOnWall: 'All Doors on the Same Wall',\r\n AllDoorsAboveFoundation: 'All Doors Above the Same Foundation',\r\n AllSelectedDoors: 'All Selected Doors',\r\n AllDoors: 'All Doors',\r\n DoorType: 'Door Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Filled: 'Filled',\r\n FrameColor: 'Frame Color',\r\n Interior: 'Interior',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: 'Alto',\r\n Low: 'Bajo',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: 'Number of selected heliostats',\r\n NumberOfSelectedSolarPanels: 'Number of selected solar panels',\r\n ElectricityGeneratedDailyBySolarPanels: 'Electricity generated daily by these solar panels',\r\n SceneDiameter: 'Scene diameter',\r\n BuildingArea: 'Building area',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: 'Color Contrast',\r\n FluxScale: 'Flux Scale',\r\n ClickUpOrDownArrowButtonsToChange: 'Click up or down arrow buttons to change',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: 'Rotar',\r\n DragMouse: 'Arrastrar el ratón',\r\n Zoom: 'Zoom',\r\n MouseWheelOrKeys: 'Girar el mouse o presionar Ctrl+[ o Ctrl+]',\r\n MouseWheelOrKeysMac: 'Girar el mouse o presionar ⌘+[ o ⌘+]',\r\n Pan: 'Panorámica',\r\n HoldCtrlDragMouse: 'Mantener Ctrl y mover el ratón',\r\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\r\n Enter2DMode: 'Enter 2D mode',\r\n Exit2DMode: 'Exit 2D mode',\r\n NavigationMode: 'Navigation mode',\r\n EnableNavigation: 'Enable navigation',\r\n DisableNavigation: 'Disable navigation',\r\n MoveForwardBack: 'Move forward/back',\r\n MoveForwardBackInstruction: 'Press W/S',\r\n MoveLeftRight: 'Move left/right',\r\n MoveLeftRightInstruction: 'Press A/D',\r\n MoveUpDown: 'Move up/down',\r\n MoveUpDownInstruction: 'Press Z/X',\r\n Turn: 'Turn',\r\n TurnInstruction: 'Press arrow keys',\r\n ResetView: 'Reset',\r\n AutoRotate: 'Auto rotar',\r\n StartOrStop: 'Presiona F4 para empezar o parar',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: 'Imagen en el suelo',\r\n WeatherStations: 'Weather Stations',\r\n WeatherStationsNote: 'Turn this off to speed up',\r\n Coordinates: 'Coordenadas',\r\n Zoom: 'Zoom',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: 'Solar Panel Visibility',\r\n Observer: 'Observer',\r\n VantagePoint: 'Vantage Point',\r\n ItemizedVisibilityByFields: 'Itemized by Fields',\r\n TotalVisibility: 'Total',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: 'Sensor de luz',\r\n WeatherDataFrom: 'Datos metereológicos de',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: 'Daily Building Energy',\r\n YearlyBuildingEnergy: 'Yearly Building Energy',\r\n Heater: 'Heater',\r\n AC: 'AC',\r\n SolarPanel: 'Solar Panel',\r\n Net: 'Net',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: 'Rendimiento diario del panel solar',\r\n SolarPanelYearlyYield: 'Rendimiento anual del panel solar',\r\n Yield: 'Rendimiento',\r\n YieldPerHour: 'Rendimiento por hora',\r\n DailyTotal: 'Total diario',\r\n YearlyTotal: 'Total anual',\r\n ShowOutputsOfIndividualSolarPanels: 'Mostrar salidas de paneles solares individuales',\r\n Profit: 'Profit',\r\n TotalCost: 'Total Cost',\r\n TotalRevenue: 'Total Revenue',\r\n TotalYield: 'Total Yield',\r\n MeanYield: 'Mean Yield',\r\n ModuleCount: 'Module Count',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: 'Parabolic Trough Daily Yield',\r\n ParabolicTroughYearlyYield: 'Parabolic Trough Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualParabolicTroughs: 'Show outputs of individual parabolic troughs',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: 'Parabolic Dish Daily Yield',\r\n ParabolicDishYearlyYield: 'Parabolic Dish Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualParabolicDishes: 'Show outputs of individual parabolic dishes',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: 'Fresnel Reflector Daily Yield',\r\n FresnelReflectorYearlyYield: 'Fresnel Reflector Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualFresnelReflectors: 'Show outputs of individual Fresnel feflectors',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: 'Heliostat Daily Yield',\r\n HeliostatYearlyYield: 'Heliostat Yearly Yield',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualHeliostats: 'Show outputs of individual heliostats',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: 'Solar Updraft Tower Daily Yield',\r\n UpdraftTowerYearlyYield: 'Solar Updraft Tower Yearly Yield',\r\n ChimneyAirTemperature: 'Chimney Air Temperature',\r\n ChimneyWindSpeed: 'Chimney Wind Speed',\r\n Yield: 'Yield',\r\n YieldPerHour: 'Yield per Hour',\r\n DailyTotal: 'Daily Total',\r\n YearlyTotal: 'Yearly Total',\r\n ShowOutputsOfIndividualUpdraftTowers: 'Show outputs of individual updraft towers',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: 'Sun & Time Settings',\r\n SunAngles: 'Ángulos',\r\n TwentyFourHours: '24 Hours',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyLikes: 'My Likes',\r\n MyCloudFiles: 'Mis archivos en la nube',\r\n GenerateLink: 'Generar enlace',\r\n LinkGeneratedInClipBoard: 'Se ha generado un enlace en el portapapeles',\r\n DoYouReallyWantToDelete: 'Estás seguro que quieres eliminar',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\r\n 'If this file has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyProjects: 'My Projects',\r\n GenerateProjectLink: 'Generate Project Link',\r\n ProjectLinkGeneratedInClipBoard: 'A link to the project was generated in the clip board',\r\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\r\n 'If this project has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: 'Project Settings',\r\n ThumbnailImageSize: 'Thumbnail Image Size',\r\n ProjectByOtherPeople: 'Project by Other People',\r\n Project: 'Project',\r\n ProjectType: 'Type',\r\n ProjectDescription: 'Description',\r\n MakeDescriptionEditable: 'Make this description editable',\r\n MakeDescriptionNonEditable: 'Make this description non-editable',\r\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\r\n SolarPanelArray: 'Solar Panel Array',\r\n CurateCurrentDesign: 'Curate current design',\r\n UpdateSelectedDesign: 'Update selected design',\r\n RemoveSelectedDesign: 'Remove selected design',\r\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\r\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\r\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\r\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\r\n ChooseSolutionSpace: 'Choose solution space',\r\n ChooseDataColoring: 'Choose data coloring',\r\n SameColorForAllDesigns: 'Same color for all designs',\r\n OneColorForEachDesign: 'One color for each design',\r\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\r\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\r\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\r\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\r\n GenerateScatteredPlot: 'Generate Scattered Plot',\r\n SelectXAxis: 'Select X Axis',\r\n SelectYAxis: 'Select Y Axis',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: 'Configuración de mi cuenta',\r\n MyID: 'My 🆔',\r\n ClickToCopyMyID: 'Click to copy my ID',\r\n IDInClipBoard: 'Your ID was copied and is ready to paste.',\r\n StoreMyNameInMyFilesWhenSaving: 'Store my name in my files when saving',\r\n DoYouReallyWantToShowYourNameInYourFiles: 'Do you really want to show your display name in your files?',\r\n SignFileDisclaimer: 'If yes, your display name may be seen by anyone who can access your files.',\r\n Likes: 'Likes',\r\n AllPublished: 'All Published',\r\n PublishedUnderAliases: 'Aliases',\r\n UserCount: 'User Count',\r\n SchoolID: 'School ID',\r\n ClassID: 'Class ID',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: 'Luz solar',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: 'Select Air Temperature Model',\r\n Sinusoidal: 'Sinusoidal',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: 'Economics Parameters',\r\n ElectricitySellingPrice: 'Electricity Selling Price',\r\n OperationalCostPerUnit: 'Operational Cost per Unit',\r\n SellingPrice: 'Selling Price',\r\n UnitCost: 'Unit Cost',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: 'Navigation Parameters',\r\n MinimumMoveSpeed: 'Minimum Move Speed',\r\n MinimumTurnSpeed: 'Minimum Turn Speed',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: 'Claridad',\r\n ShowDaylightResults: 'Mostrar resultados de la luz solar',\r\n ShowSkyClearnessResults: 'Mostrar resultados de claridad del cielo',\r\n ShowAverageDailySolarRadiation: 'Mostrar la radiación solar diaria promedio',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: 'Sin sensor para recopilar datos',\r\n NoSolarPanelForAnalysis: 'Sin panel solar para el análisis',\r\n NoObserverForVisibilityAnalysis: 'There is no observer for visibility analysis.',\r\n NoWaterHeaterForAnalysis: 'There is no water heater for analysis.',\r\n NoParabolicDishForAnalysis: 'There is no parabolic dish for analysis.',\r\n NoParabolicTroughForAnalysis: 'There is no parabolic trough for analysis.',\r\n NoFresnelReflectorForAnalysis: 'There is no Fresnel reflector for analysis.',\r\n NoHeliostatForAnalysis: 'There is no heliostat for analysis.',\r\n NoSolarUpdraftTowerForAnalysis: 'There is no solar updraft tower for analysis.',\r\n NoBuildingForAnalysis: 'There is no building for analysis.',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: 'Archivo en la nube',\r\n Select: 'Seleccionar',\r\n AddFoundation: 'Añadir base',\r\n AddWall: 'Añadir pared',\r\n AddWindow: 'Añadir ventana',\r\n AddDoor: 'Añadir door',\r\n AddPyramidRoof: 'Add pyramid roof',\r\n AddGableRoof: 'Add gable roof',\r\n AddHipRoof: 'Add hip roof',\r\n AddGambrelRoof: 'Add gambrel roof',\r\n AddMansardRoof: 'Add mansard roof',\r\n AddCuboid: 'Añadir cuboid',\r\n AddSensor: 'Añadir sensor',\r\n AddSolarPanel: 'Añadir panel solar',\r\n AddWaterHeater: 'Add water heater',\r\n AddParabolicDish: 'Add parabolic dish',\r\n AddParabolicTrough: 'Add parabolic trough',\r\n AddFresnelReflector: 'Add Fresnel reflector',\r\n AddHeliostat: 'Add heliostat',\r\n AddWindTurbine: 'Add wind turbine',\r\n AddLight: 'Add light',\r\n AddTree: 'Añadir árbol',\r\n AddFlower: 'Add flower',\r\n AddPeople: 'Añadir gente',\r\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\r\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\r\n ManipulateGroup: 'Manipulate a group',\r\n ClearScene: 'Clear escena',\r\n ShowSunAndTimeSettings: 'Show sun and time settings',\r\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\r\n DoYouReallyWantToClearContent: 'Estás seguro que quieres borrar el contenido',\r\n ClickForMoreButtons: 'Click for more buttons',\r\n SwitchToAddingFoundation: 'Switch to Adding Foundation',\r\n SwitchToAddingCuboid: 'Switch to Adding Cuboid',\r\n SwitchToAddingWall: 'Switch to Adding Wall',\r\n SwitchToAddingWindow: 'Switch to Adding Window',\r\n SwitchToAddingDoor: 'Switch to Adding Door',\r\n SwitchToAddingPyramidRoof: 'Switch to Adding Pyramid Roof',\r\n SwitchToAddingGableRoof: 'Switch to Adding Gable Roof',\r\n SwitchToAddingHipRoof: 'Switch to Adding Hip Roof',\r\n SwitchToAddingGambrelRoof: 'Switch to Adding Gambrel Roof',\r\n SwitchToAddingMansardRoof: 'Switch to Adding Mansard Roof',\r\n SwitchToAddingSolarPanel: 'Switch to Adding Solar Panel',\r\n SwitchToAddingSensor: 'Switch to Adding Sensor',\r\n SwitchToAddingWaterHeater: 'Switch to Adding Water Heater',\r\n SwitchToAddingParabolicDish: 'Switch to Adding Parabolic Dish',\r\n SwitchToAddingParabolicTrough: 'Switch to Adding Parabolic Trough',\r\n SwitchToAddingFresnelReflector: 'Switch to Adding Fresnel Reflector',\r\n SwitchToAddingHeliostat: 'Switch to Adding Heliostat',\r\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\r\n SwitchToAddingLight: 'Switch to Adding Light',\r\n SwitchToAddingTree: 'Switch to Adding Tree',\r\n SwitchToAddingFlower: 'Switch to Adding Flower',\r\n SwitchToAddingPeople: 'Switch to Adding People',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: 'Ver Institute for Future Intelligence',\r\n visitAladdinHomePage: 'Visita la página de Aladdin',\r\n clickToOpenMenu: 'Haz clic para abrir el menú principal',\r\n clickToAccessAccountSettings: 'Click to access account settings',\r\n },\r\n\r\n tree: {\r\n Apple: 'Apple',\r\n Birch: 'Birch',\r\n Coconut: 'Coconut',\r\n Dogwood: 'Cerezo silvestre',\r\n Elm: 'Olmo',\r\n FanPalm: 'Fan Palm',\r\n Linden: 'Tilo',\r\n Magnolia: 'Magnolia',\r\n Maple: 'Arce',\r\n Oak: 'Roble',\r\n Pine: 'Pino',\r\n Spruce: 'Spruce',\r\n },\r\n\r\n flower: {\r\n Bellflower: 'Bellflower',\r\n Boxwood: 'Boxwood',\r\n CactusCombo1: 'Cactus Combo 1',\r\n CactusCombo2: 'Cactus Combo 2',\r\n CactusCombo3: 'Cactus Combo 3',\r\n CactusCombo4: 'Cactus Combo 4',\r\n Hibiscus: 'Hibiscus',\r\n Hosta: 'Hosta',\r\n Hydrangea: 'Hydrangea',\r\n Peony: 'Peony',\r\n RedRose: 'Red Rose',\r\n Spirea: 'Spirea',\r\n Sunflower: 'Sunflower',\r\n TallBush: 'Tall Bush',\r\n Tulip: 'Tulip',\r\n WhiteFlower: 'White Flower',\r\n YellowFlower: 'Yellow Flower',\r\n },\r\n\r\n people: {\r\n Jaah: 'Jaah',\r\n Jack: 'Jack',\r\n Jacob: 'Jacob',\r\n Jacqueline: 'Jacqueline',\r\n Jade: 'Jade',\r\n Jamelia: 'Jamelia',\r\n James: 'James',\r\n Jane: 'Jane',\r\n Jaya: 'Jaya',\r\n Jaye: 'Jaye',\r\n Jeanette: 'Jeanette',\r\n Jedi: 'Jedi',\r\n Jeff: 'Jeff',\r\n Jena: 'Jena',\r\n Jennifer: 'Jennifer',\r\n Jess: 'Jess',\r\n Jett: 'Jett',\r\n Jill: 'Jill',\r\n Jiya: 'Jiya',\r\n Joan: 'Joan',\r\n Jocelyn: 'Jocelyn',\r\n Joel: 'Joel',\r\n Joey: 'Joey',\r\n John: 'John',\r\n Jonathon: 'Jonathon',\r\n Jose: 'Jose',\r\n Joseph: 'Joseph',\r\n Joshua: 'Joshua',\r\n Judd: 'Judd',\r\n Judy: 'Judy',\r\n Julia: 'Julia',\r\n Julio: 'Julio',\r\n Jumapili: 'Jumapili',\r\n June: 'June',\r\n Juro: 'Juro',\r\n Justin: 'Justin',\r\n },\r\n\r\n compass: {\r\n N: 'N',\r\n S: 'S',\r\n W: 'W',\r\n E: 'E',\r\n },\r\n\r\n month: {\r\n January: 'Jan',\r\n February: 'Feb',\r\n March: 'Mar',\r\n April: 'Apr',\r\n May: 'May',\r\n June: 'Jun',\r\n July: 'Jul',\r\n August: 'Aug',\r\n September: 'Sep',\r\n October: 'Oct',\r\n November: 'Nov',\r\n December: 'Dec',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: 'Search by publisher',\r\n SearchByLabel: 'Search by label',\r\n MyPublishedModels: 'My Published Models',\r\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\r\n SortFromOldestToNewest: 'Sort from oldest to newest',\r\n SortFromNewestToOldest: 'Sort from newest to oldest',\r\n ModelsFoundOnThisSite: 'models found on this site',\r\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_tr = {\r\n translation: {\r\n name: {\r\n IFI: 'Yarının Zekası Enstitüsü',\r\n Aladdin: 'Aladdin',\r\n Tagline: 'Aladdin: Açıklanabilir Yapay Zeka ile Tasarımı Yeniden Hayal Et — Yarının Zekası Enstitüsü',\r\n },\r\n\r\n cookie: {\r\n Statement: 'Kabul Ete tıklayarak, iyi bir Aladdin deneyimi için çerez kullanımını kabul etmiş olursunuz.',\r\n Accept: 'Kabul Et',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: 'Geliştiriciler',\r\n TermsOfService: 'Hizmet Şartları',\r\n PrivacyPolicy: 'Gizlilik Politikası',\r\n Software: 'Yazılım',\r\n Content: 'İçerik',\r\n Research: 'Araştırma',\r\n Support: 'Destek',\r\n Acknowledgment: 'Onay',\r\n FundingInformation:\r\n \"Ulusal Bilim Vakfı (NSF), #2105695, #2131097, ve #2301164 numaralı fon destekleriyle mevcut ürünün araştırma ve geliştirme çalışmalarına cömert bir mali kaynak sağlamıştır. Bununla birlikte üründe ifade edilen herhangi bir görüş, bulgu ve sonuç veya öneri yazarların kendi görüşleridir. NSF'nin kurumsal görüşlerini yansıtmayabilir.\",\r\n Contact: 'Daha fazla bilgi için lütfen Charles Xie (charles@intofuture.org) ile iletişime geçiniz.',\r\n Translators: 'Çevirmenler',\r\n },\r\n\r\n word: {\r\n LastUpdate: 'Last Update',\r\n Small: 'Small',\r\n Medium: 'Medium',\r\n Large: 'Large',\r\n Design: 'Design',\r\n Information: 'Information',\r\n Type: 'Type',\r\n Text: 'Text',\r\n FontSize: 'Font Size',\r\n FontColor: 'Font Color',\r\n Model: 'Model',\r\n Models: 'Models',\r\n Upload: 'Upload',\r\n ClickCount: 'Click Count',\r\n Share: 'Share',\r\n AlreadyLike: 'Already like',\r\n Like: 'Like',\r\n MustLogInToLike: 'Must log in to like',\r\n AllRightsReserved: 'Tüm Hakları Saklıdır.',\r\n MeterAbbreviation: 'm',\r\n Version: 'Sürüm',\r\n VersionInitial: 'S',\r\n Options: 'Seçenekler',\r\n Maximum: 'Maximum',\r\n Minimum: 'Minimum',\r\n MaximumNumber: 'Maksimum Sayı',\r\n MinimumNumber: 'Minimum Sayı',\r\n MaximumValue: 'Maksimum Değer',\r\n MinimumValue: 'Minimum Değer',\r\n Or: 'Veya',\r\n None: 'Hiçbiri',\r\n High: 'Yüksek',\r\n Partial: 'Kısmi',\r\n Teacher: 'Öğretmen',\r\n Class: 'Sınıf',\r\n Total: 'Toplam',\r\n Leaderboard: 'Leaderboard',\r\n Latest: 'Latest',\r\n Range: 'Aralık',\r\n SIUnit: 'SI Unit',\r\n USUnit: 'US Unit',\r\n ThermalTransmittance: 'Thermal Transmittance',\r\n ThermalResistance: 'Thermal Resistance',\r\n UValue: 'U-Value',\r\n RValue: 'R-Value',\r\n VolumetricHeatCapacity: 'Volumetric Heat Capacity',\r\n BuildingHVACSystem: 'Building HVAC System',\r\n ThermostatSetpoint: 'Thermostat Setpoint',\r\n TemperatureToleranceThreshold: 'Tolerance Threshold',\r\n TemperatureToleranceThresholdExplanation:\r\n 'Heater will not run if the lowest outside temperature of the day is higher than the setpoint minus this threshold.\\nAC will not run if the highest outside temperature of the day is lower than the setpoint plus this threshold.',\r\n Press: 'Tıkla',\r\n Open: 'Aç',\r\n Save: 'Kaydet',\r\n SaveAsImage: 'Resim Olarak Kaydet',\r\n SaveAsCsv: 'Save as CSV',\r\n Update: 'Güncelle',\r\n Paste: 'Yapıştır',\r\n Copy: 'Kopyala',\r\n Cut: 'Kes',\r\n Delete: 'Sil',\r\n Lock: 'Kilitle',\r\n Translucent: 'Yarı Saydam',\r\n Color: 'Renk',\r\n Texture: 'Doku',\r\n Size: 'Boyut',\r\n Thickness: 'Kalınlık',\r\n Yes: 'Evet',\r\n No: 'Hayır',\r\n OK: 'Tamam',\r\n Cancel: 'İptal',\r\n Apply: 'Uygula',\r\n Close: 'Kapat',\r\n ApplyTo: 'Uygula',\r\n Run: 'Çalıştır',\r\n Pause: 'Duraklat',\r\n Resume: 'Sürdür',\r\n Clear: 'Temizle',\r\n Warning: 'Uyarı',\r\n Caution: 'Caution',\r\n Reminder: 'Hatırlatıcı',\r\n Length: 'Uzunluk',\r\n Width: 'Genişlik',\r\n Height: 'Yükseklik',\r\n Radius: 'Yarıçap',\r\n Angle: 'Açı',\r\n Azimuth: 'Azimut',\r\n Coordinates: 'Koordinatlar',\r\n Weather: 'Hava Durumu',\r\n Show: 'Göster',\r\n Animate: 'Oynat',\r\n Date: 'Tarih',\r\n Time: 'Saat',\r\n Title: 'Başlık',\r\n Owner: 'Sahibi',\r\n Action: 'Eylem',\r\n Rename: 'Yeniden Adlandır',\r\n Location: 'Konum',\r\n Latitude: 'Enlem',\r\n Month: 'Ay',\r\n Day: 'Gün',\r\n Hour: 'Saat',\r\n Daylight: 'Gün Işığı',\r\n Radiation: 'Işınım',\r\n Temperature: 'Sıcaklık',\r\n kWh: 'kWh',\r\n dollar: 'dollar',\r\n MeterPerSecond: 'm/s',\r\n NorthInitial: 'N',\r\n SouthInitial: 'S',\r\n EastInitial: 'E',\r\n WestInitial: 'W',\r\n Fixed: 'Sabit',\r\n Elements: 'Öğeler',\r\n Energy: 'Energy',\r\n Unknown: 'Unknown',\r\n Label: 'Label',\r\n Description: 'Description',\r\n NoDescription: 'No description',\r\n MaximumCharacters: 'Maximum characters',\r\n Author: 'Author',\r\n Publisher: 'Publisher',\r\n Building: 'Building',\r\n ResidentialBuilding: 'Residential Building',\r\n CommercialBuilding: 'Commercial Building',\r\n SchoolBuilding: 'School Building',\r\n TouristAttraction: 'Tourist Attraction',\r\n UnderConstruction: 'Under Construction',\r\n Photovoltaic: 'Photovoltaic',\r\n Anonymous: 'Anonymous',\r\n Nickname: 'Nickname',\r\n Pin: 'Pin',\r\n Unpin: 'Unpin',\r\n },\r\n\r\n shared: {\r\n NoTexture: 'Doku Yok',\r\n FoundationElement: 'Temel',\r\n CuboidElement: 'Kübik',\r\n PolygonElement: 'Poligon',\r\n SensorElement: 'Sensör',\r\n SolarPanelElement: 'Güneş Paneli',\r\n WaterHeaterElement: 'Su Isıtıcı',\r\n ParabolicDishElement: 'Parabolik Çanak',\r\n ParabolicTroughElement: 'Parabolik Oluk',\r\n FresnelReflectorElement: 'Fresnel Reflektör',\r\n HeliostatElement: 'Heliostat',\r\n WindTurbineElement: 'Wind Turbine',\r\n LightElement: 'Light',\r\n ElementLocked: 'Kilitli',\r\n ModelType: 'Model Type',\r\n OutputBreakdown: 'Breakdown',\r\n MoreResults: 'More Results',\r\n },\r\n\r\n message: {\r\n ModelNotFound: 'Model not found',\r\n CannotSignIn: 'Oturum açılamıyor',\r\n CannotSignOut: 'Çıkış yapılamıyor',\r\n YourAccountWasCreated: 'Hesabınız oluşturuldu',\r\n CannotCreateAccount: 'Hesap oluşturulamıyor',\r\n YourAccountSettingsWereSaved: 'Hesap ayarlarınız kaydedildi.',\r\n CannotSaveYourAccountSettings: 'Hesap ayarlarınız kaydedilemiyor',\r\n CannotSaveYourFileToCloud: 'Dosyanız buluta kaydedilemiyor',\r\n CannotCreateNewProject: 'Cannot create a new project',\r\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\r\n CannotOpenYourProjects: 'Cannot open your projects',\r\n CannotOpenProject: 'Cannot open the project',\r\n CannotDeleteProject: 'Cannot delete the project',\r\n CannotRenameProject: 'Cannot rename the project',\r\n CannotAddDesignToProject: 'Cannot add this design to the project',\r\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\r\n DesignRemovedFromProject: 'The design was successfully removed from the project',\r\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\r\n CannotUpdateProject: 'Cannot update the project',\r\n CannotFetchProjectData: 'Cannot fetch project data',\r\n TitleUsedChooseDifferentOne: 'This title has been used. Choose a different one',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite: 'A cloud file with the title exists. Do you want to overwrite it?',\r\n CloudFileNotFound: 'Bulut dosyası bulunamadı',\r\n CannotLoadModelsOnMap: 'Cannot load models on map',\r\n CannotLoadLeaderboard: 'Cannot load leaderboard',\r\n CannotPublishModelOnMap: 'Cannot publish model on map',\r\n CannotLikeModelFromMap: 'Cannot like model from map',\r\n CannotDeleteModelFromMap: 'Cannot delete model from map',\r\n ModelDeletedFromMap: 'Model is deleted from map',\r\n DoYouWantToDeleteModelFromMap: 'Do you want to delete the model from map?',\r\n CannotOpenCloudFile: 'Bulut dosyası açılamıyor',\r\n CannotReadCloudFile: 'Cannot read the cloud file',\r\n CannotWriteCloudFile: 'Cannot write the cloud file',\r\n CloudFileCopied: 'Cloud file copied',\r\n CannotOpenCloudFolder: 'Bulut klasörünüz açılamıyor',\r\n CannotDeleteCloudFile: 'Bulut dosyası silinemiyor',\r\n CannotRenameCloudFile: 'Bulut dosyası yeniden adlandırılamıyor',\r\n DoYouWantToSaveChanges: 'Değişiklikleri kaydetmek istiyor musunuz?',\r\n NotApplicableToSelectedAction: 'Seçili eyleme uygulanamaz',\r\n ThisElementIsLocked: 'Bu öğe kilitli.',\r\n ThisCannotBeUndone: 'Geri alınamaz.',\r\n AzimuthOfNorthIsZero: 'Kuzey yönünün azimut açısı 0 ° derecedir.',\r\n CounterclockwiseAzimuthIsPositive: 'Saat yönünün tersi yönde azimut açısı pozitiftir.',\r\n MoveCancelledBecauseOfOverlap: 'Çakışma nedeniyle taşıma iptal edildi.',\r\n MoveOutsideBoundaryCancelled: 'Alan dışına çıkan taşıma iptal edildi.',\r\n RotationCancelledBecauseOfOverlap: 'Çakışma nedeniyle döndürme iptal edildi.',\r\n RotationOutsideBoundaryCancelled: 'Alan dışı döndürme iptal edildi.',\r\n ResizingCancelledBecauseOfOverlap: 'Çakışma nedeniyle yeniden boyutlandırma iptal edildi.',\r\n ResizingOutsideBoundaryCancelled: 'Alan dışında yeniden boyutlandırma iptal edildi.',\r\n CannotPasteOutsideBoundary: 'Alanın dışına yapıştırılamaz.',\r\n CannotPasteBecauseOfOverlap: 'Çakışma nedeniyle yapıştırılamıyor.',\r\n CannotMoveObjectTooFar: 'Nesne buraya taşınamaz.',\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\r\n 'Yeni yerleşim düzeni uygulanmadan önce mevcut güneş panelleri kaldırılacaktır.',\r\n DoYouWantToContinue: 'Devam etmek istiyor musunuz?',\r\n SolarPanelsCannotIntersectWithGround: 'Güneş panelleri zeminle kesişemez.',\r\n SolarPanelsCannotOverlapWithOneAnother: 'Güneş panelleri birbiriyle örtüşemez.',\r\n ScreenshotSaved: 'Ekran görüntüsü kaydedildi.',\r\n CsvFileSaved: 'A CSV file was saved.',\r\n SimulationStarted: 'Simülasyon başladı.',\r\n SimulationCompleted: 'Simülasyon tamamlandı.',\r\n SimulationAborted: 'Simülasyon iptal edildi.',\r\n SimulationPaused: 'Simülasyon duraklatıldı.',\r\n CancelSimulation: 'Simülasyonu iptal et',\r\n PauseSimulation: 'Simülasyonu duraklat',\r\n ResumeSimulation: 'Simülasyonu devam ettir',\r\n SimulationWillNotStartDueToErrors: 'Simulation will not start due to errors',\r\n SimulationWillStartDespiteWarnings: 'Simulation will start despite warnings.',\r\n EvolutionStarted: 'Evrim başladı.',\r\n EvolutionCompleted: 'Evrim tamamlandı.',\r\n EvolutionAborted: 'Evrim iptal edildi.',\r\n EvolutionPaused: 'Evrim duraklatıldı.',\r\n EncounterEvolutionError: 'Evrim hatasıyla karşılaşıldı.',\r\n CancelEvolution: 'Evrimi iptal et',\r\n PauseEvolution: 'Evrimi duraklat',\r\n ResumeEvolution: 'Evrime devam et',\r\n ConvergenceThresholdHasBeenReached: 'Yakınsama eşiğine ulaşıldı.',\r\n MaximumNumberOfGenerationsHasBeenReached: 'Maksimum nesil sayısına ulaşıldı.',\r\n MaximumNumberOfStepsHasBeenReached: 'Maksimum adım sayısına ulaşıldı.',\r\n ObjectiveFunctionTypeError: 'Geçerli işlev desteklenmiyor. Lütfen menüden başlatınız.',\r\n WallsAreNotAtSameHeight: 'Walls are not at same height.',\r\n WallsAreNotPerpendicular: 'Walls are not perpendicular.',\r\n WallsAreNotConnected: 'Walls are not connected.',\r\n WallsNumberNeedToBeFour: 'The number of walls needs to be four.',\r\n BuildingContainsEmptyWall: 'Building contains one or more empty wall.',\r\n BuildingRoofMissing: 'Building has a missing roof.',\r\n UnknownErrors: 'Unknown errors.',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: 'Analiz Seçenekleri',\r\n option: {\r\n GridCellSize: 'Hücre Boyutu',\r\n SamplingFrequency: 'Örneklem Frekansı',\r\n TimesPerHour: 'x 1/saat',\r\n DaysPerYear: 'Gün Sayısı / Yıl',\r\n },\r\n mainMenu: 'Ana Menü',\r\n cloudMenu: 'Bulut Menüsü',\r\n projectSubMenu: 'Project',\r\n project: {\r\n CreateNewProject: 'Create New Project',\r\n OpenProject: 'Open Project',\r\n SaveProjectAs: 'Save Project As',\r\n YouMustLogInToCreateProject: 'You must log in to create a new project',\r\n YouMustLogInToOpenProject: 'You must log in to open a project',\r\n },\r\n fileSubMenu: 'Dosya',\r\n file: {\r\n CreateNewFile: 'Yeni Dosya Oluştur',\r\n OpenLocalFile: 'Yerel Dosya Aç',\r\n SaveAsLocalFile: 'Yerel Dosya Olarak Kaydet',\r\n SavingAbortedMustHaveValidFileName: 'Kaydetme iptal edildi! Geçerli bir dosya adı kullanınız.',\r\n OpenCloudFile: 'Bulut Dosyası Aç',\r\n SaveCloudFile: 'Bulut Dosyasını Kaydet',\r\n SaveAsCloudFile: 'Bulut Dosyası Olarak Kaydet',\r\n SavingAbortedMustHaveValidTitle: 'Kaydetme iptal edildi! Dosya adı geçersiz!',\r\n ToSaveYourWorkPleaseSignIn: 'Çalışmanızı kaydetmek için lütfen oturum açınız.',\r\n TakeScreenshot: 'Ekran görüntüsü al',\r\n UseCloudFileName: 'Bulut Dosya Adını Kullan',\r\n PublishOnModelsMap: 'Publish on Models Map',\r\n PublishedOnModelsMap: 'Your model has been published on the Models Map',\r\n UpdatedOnModelsMap: 'Your model has been updated on the Models Map',\r\n YouMustLogInToPublishYourModel: 'You must log in to publish your model',\r\n YouCannotPublishAModelThatYouDoNotOwn: 'You cannot publish a model that you do not own',\r\n YouMustSaveModelOnCloudBeforePublishingIt: 'You must save the model on the cloud before publishing it',\r\n },\r\n editSubMenu: 'Düzen',\r\n edit: {\r\n Undo: 'Geri Al',\r\n Redo: 'Yinele',\r\n },\r\n viewSubMenu: 'Görünüm',\r\n view: {\r\n NavigationView: 'Navigation View',\r\n TwoDimensionalView: '2D',\r\n ResetView: 'Yenile',\r\n ZoomIn: 'Yaklaş',\r\n ZoomOut: 'Uzaklaş',\r\n AutoRotate: 'Otomatik Döndür',\r\n ShowShadow: 'Gölge',\r\n ShowSurfaceShininess: 'Show Surface Shininess',\r\n TranslucentFloatingWindows: 'Yüzer Pencere',\r\n accessoriesSubMenu: 'Accessories',\r\n accessories: {\r\n SiteInformation: 'Konum Bilgisi',\r\n DesignInformation: 'Izgara Hücre Sayısı',\r\n Instruction: 'Yardım',\r\n StickyNote: 'Notlar',\r\n Note: 'Notlar',\r\n },\r\n },\r\n settingsSubMenu: 'Settings',\r\n settings: {\r\n WeatherData: 'Hava Durumu',\r\n DiurnalTemperature: 'Günlük Sıcaklık',\r\n Heliodon: 'Heliodon',\r\n SunAndTime: 'Güneş & Zaman',\r\n },\r\n benchmarksSubMenu: 'Deneysel',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: 'Güneş Işınım Tahmini Vs. Ölçümü ',\r\n BESTESTCase600: 'Building Energy Simulation Test: BESTEST Case 600',\r\n BESTESTCase610: 'Building Energy Simulation Test: BESTEST Case 610',\r\n BESTESTCase620: 'Building Energy Simulation Test: BESTEST Case 620',\r\n BESTESTCase630: 'Building Energy Simulation Test: BESTEST Case 630',\r\n },\r\n graph: {\r\n LineWidth: 'Çizgi Kalınlığı',\r\n SymbolSize: 'Sembol Boyutu',\r\n BarCategoryGap: 'Bar Category Gap',\r\n ShowHorizontalGridLines: 'Yatay Izgara Çizgilerini Göster',\r\n ShowVerticalGridLines: 'Dikey Izgara Çizgilerini Göster',\r\n },\r\n analysisSubMenu: 'Analiz',\r\n physicsSubMenu: 'Fizik',\r\n physics: {\r\n DailySolarRadiationHeatmap: 'Günlük Isı Haritası',\r\n SolarRadiationHeatmapOptions: 'Isı Haritası Seçenekleri',\r\n SolarRadiationHeatmapGridCellSize: 'Hücre Boyutu',\r\n SolarRadiationHeatmapMaxValue: 'Işınım Maksimum Değer',\r\n SolarRadiationHeatmapNoAnimation: 'Animasyon Yok',\r\n ReflectionHeatmap: 'Yansıma Isı Haritası',\r\n },\r\n sensorSubMenu: 'Sensörler',\r\n sensor: {\r\n CollectDailyData: 'Günlük Veri Topla',\r\n CollectYearlyData: 'Yıllık Veri Topla',\r\n SensorSimulationNoAnimation: 'Animasyon Yok',\r\n },\r\n buildingSubMenu: 'Building',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: 'Analyze Daily Building Energy',\r\n AnalyzeYearlyBuildingEnergy: 'Analyze Yearly Building Energy',\r\n EnergyAnalysisOptions: 'Energy Analysis Options',\r\n EnergyGridCellSize: 'Energy Grid Cell Size',\r\n BuildingEnergySimulationNoAnimation: 'No Animation for Building Energy Simulation',\r\n },\r\n solarPanelSubMenu: 'Güneş Panelleri',\r\n solarPanel: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n AnalyzeVisibility: 'Görünüm Analizi',\r\n PanelDiscretization: 'Panel Ayrıklaştırma',\r\n Exact: 'Kesin',\r\n Approximate: '\tYaklaşık',\r\n EnergyGridCellSize: 'Hücre Boyutu',\r\n VisibilityGridCellSize: 'Hücre Boyutu',\r\n EnergyAnalysisOptions: 'Enerji Analiz Seçenekleri',\r\n VisibilityAnalysisOptions: 'Görünüm Analiz Seçenekleri',\r\n SolarPanelSimulationNoAnimation: 'Animasyon Yok',\r\n },\r\n parabolicTroughSubMenu: 'Parabolik Oluk',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n },\r\n parabolicDishSubMenu: 'Parabolik Çanak',\r\n parabolicDish: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n },\r\n fresnelReflectorSubMenu: 'Fresnel Yansıtıcı',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n },\r\n heliostatSubMenu: 'Heliostat',\r\n heliostat: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n },\r\n solarUpdraftTowerSubMenu: 'Solar Updraft Kulesi',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: 'Günlük Üretim Analizi',\r\n AnalyzeYearlyYield: 'Yıllık Üretim Analizi',\r\n SolarUpdraftTowerSimulationNoAnimation: 'Animasyon Yok',\r\n },\r\n\r\n tutorialsSubMenu: 'Öğrenme Merkezi',\r\n\r\n solarEnergyScienceSubMenu: 'Güneş Bilimi',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: 'Gözlemciye Göre Güneş Açıları',\r\n InsolationAndClimate: 'Güneşlenme ve İklim',\r\n SolarRadiationToBox: 'Kutu Güneş Işınımı',\r\n },\r\n\r\n buildingScienceSubMenu: 'Building Science',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: 'Thermal Envelope vs. Building Envelope',\r\n EffectOfSizeOnBuildingEnergy: 'Effect of Size on Building Energy',\r\n EffectOfOrientationOnBuildingEnergy: 'Effect of Orientation on Building Energy',\r\n EffectOfInsulationOnBuildingEnergy: 'Effect of Insulation on Building Energy',\r\n EffectOfRoofColorOnBuildingEnergy: 'Effect of Roof Color on Building Energy',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Effect of Eaves Overhang Length on Building Energy',\r\n EffectOfWindowSHGCOnBuildingEnergy: 'Effect of Window Solar Heat Gain on Building Energy',\r\n EffectOfThermostatSetpointOnBuildingEnergy: 'Effect of Thermostat Setpoint on Building Energy',\r\n EffectOfSolarPanelsOnBuildingEnergy: 'Effect of Solar Panels on Building Energy',\r\n EffectOfGroundTemperatureOnBuildingEnergy: 'Effect of Ground Temperature on Building Energy',\r\n EffectOfTreesOnBuildingEnergy: 'Effect of Trees on Building Energy',\r\n },\r\n\r\n buildingDesignSubMenu: 'Bina Tasarımı',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: 'Çatı Pencereli Cape Cod Evi',\r\n MansardRoofWithDormers: 'Mansard Roof with Dormers',\r\n GableRoofVsHipRoof: 'Beşik Çatı vs. Kırma Çatı',\r\n ColonialVsSaltbox: 'Koloni vs. Tuz Kutusu',\r\n GambrelRoofVsMansardRoof: 'Flemenk Çatı vs. Mansart Çatı',\r\n CombinationRoofVsBonnetRoof: 'Combination Roof vs. Bonnet Roof',\r\n DutchGableRoof: 'Dutch Gable Roof',\r\n GableAndValleyRoof: 'Gable and Valley Roof',\r\n ClerestoryRoof: 'Clerestory Roof',\r\n MonitorRoof: 'Monitor Roof',\r\n AFrameHouse: 'A-Frame House',\r\n HalfTimberedHouse: 'Half-Timbered House',\r\n AllBasicRoofTypes: 'Tüm Çatı Tipleri',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: 'Fotovoltaik Güneş Enerjisi',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: 'Güneş Paneli Eğim Açısı Etkisi',\r\n EffectOfAzimuthOfSolarPanel: 'Güneş Paneli Azimut Açısı Etkisi',\r\n SolarPanelTypes: 'Solar Panel Types',\r\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\r\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\r\n SolarTrackers: 'Güneş İzleyiciler',\r\n CoveringGroundWithSolarPanels:\r\n 'Sadece güneş panellerini kullanarak yüzeyi kaplamak neden iyi bir fikir değildir?',\r\n InterRowSpacingOfSolarPanelArray: 'Güneş Paneli Dizi Arası Boşluk Etkisi',\r\n EffectOfOrientationOfSolarPanels: 'Güneş Panelleri Yön Etkisi',\r\n SolarPanelArrayAutomaticLayout: 'Solar Panel Array Automatic Layout',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: 'Yoğunlaştırılmış Güneş Enerjisi',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: 'Parabolik Oluk Azimut Açısı Etkisi',\r\n EffectOfLatusRectumOfParabolicTrough: 'Parabolik Oluk Özkiriş Etkisi',\r\n FocusSunlightWithParabolicDish: 'Güneş Işığını Parabolik Çanakla Odaklama',\r\n LinearFresnelReflectors: 'Doğrusal Fresnel Reflektörler',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\r\n 'Doğrusal Fresnel Reflektörlerde Soğurucu Boru Yükseklik Etkisi',\r\n EffectOfAzimuthOfLinearFresnelReflectors: 'Doğrusal Fresnel Reflektörlerde Azimut Açısı Etkisi',\r\n LinearFresnelReflectorsWithTwoAbsorbers: 'İki Soğuruculu Doğrusal Fresnel Reflektörler',\r\n CosineEfficiencyOfHeliostats: 'Heliostatların Kosinüs Verimliliği',\r\n ShadowingAndBlockingOfHeliostats: 'Heliostatlarda Gölgeleme ve Engellenme',\r\n EffectSolarPowerTowerHeight: 'Güneş Güç Kulesi Yükseklik Etkisi',\r\n SolarPowerTower: 'Güneş Güç Kulesi',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: 'Diğer Güneş Gücü Türleri',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: 'Solar Updraft Kulesi',\r\n },\r\n\r\n generativeDesignSubMenu: 'Generative Design',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\r\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\r\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\r\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\r\n },\r\n\r\n examplesSubMenu: 'Örnekler',\r\n\r\n solarEnergySubMenu: 'Güneş Enerjisi',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: 'Güneş Işını ve Heliodon',\r\n RooftopSolarPanels: 'Çatı Üstü Güneş Panelleri',\r\n NevadaSolarOneParabolicTroughArray: 'Nevada Eyaletinde Parabolik Oluk Dizisi',\r\n TooeleParabolicDishArray: 'Tooele Şehrinde Parabolik Çanak Dizisi',\r\n PS10SolarPowerTower: 'PS10 Güneş Güç Kulesi',\r\n TucsonLinearFresnelReflectors: 'Tucson Şehrinde Doğrusal Fresnel Reflektörleri',\r\n SolarCanopyFormFactors: 'Solar Gölgelik Biçim Etkileri',\r\n SolarCanopyOverBleachers: 'Tirübün Üzeri Solar Gölgelik',\r\n SolarCanopyOverGarage: 'Solar Canopy Over Garage',\r\n SolarBusStop: 'Solar Otobüs Durağı',\r\n SolarFacadeTesla: 'Tesla Solar Façade',\r\n BuildingIntegratedPhotovoltaics: 'Building-Integrated Photovoltaics',\r\n Floatovoltaics: 'Floatovoltaics',\r\n Agrivoltaics: 'Agrivoltaics',\r\n VegetativeBuffer: 'Bitkisel Tampon',\r\n RainbowSwashSolarFarmBostonMA: 'Rainbow Swash Solar Farm in Boston, MA',\r\n MickeyMouseSolarFarmOrlandoFL: 'Mickey Mouse Solar Farm in Orlando, FL',\r\n SolarPanelsOverCanalBakersfieldCA: 'Bakersfield Şehrinde Kanal Üzerindeki Varsayımsal Güneş Panelleri',\r\n SolarNoiseBarrierLexingtonMA: 'Lexington Kasabasında Varsayımsal Güneş Gürültü Bariyeri',\r\n HSATSolarTrackersRaleighNC: 'Raleigh Şehrinde Yatay Tek Eksenli İzleyiciler (HSAT)',\r\n AADATSolarTrackersLancasterCA: 'Lancaster Şehrinde Azimut–İrtifa Çift Eksenli İzleyiciler (AADAT)',\r\n SolarUpdraftTowerInCity: 'Şehir Solar Updraft Kulesi',\r\n },\r\n\r\n builtEnvironmentSubMenu: 'Yapılı Çevre',\r\n residentialBuildingsSubMenu: 'Konut inşaatları',\r\n residentialBuildingExamples: {\r\n ColonialHouse: 'Colonial House',\r\n DutchColonialHouse: 'Flemenk Koloni Evi',\r\n TShapedHouse: 'T-Shaped House',\r\n CapeCodHouseWithGarage: 'Cape Cod House with Garage',\r\n Solarium: 'Solaryum',\r\n Church1: 'Kilise 1',\r\n Cathedral1: 'Cathedral 1',\r\n Cathedral2: 'Cathedral 2',\r\n Mosque1: 'Mosque 1',\r\n AdobeTaosHouse: 'Adobe Taos House',\r\n RanchHouse: 'Ranch House',\r\n BonnetHouse: 'Bonnet House',\r\n BarnStyleHouse: 'Çiftlik Evi',\r\n ModernHouse: 'Modern House',\r\n ButterflyRoofHouse: 'Butterfly Roof House',\r\n },\r\n commercialBuildingsSubMenu: 'Ticari Binalar',\r\n commercialBuildingExamples: {\r\n WhiteHouse: 'White House',\r\n BilimMersinTurkiye: 'Yenişehir Belediyesi Bilim ve Sanat Merkezi',\r\n SpanishStyleHotel: 'Spanish Style Hotel',\r\n ApartmentBuilding: 'Apartment Building',\r\n OfficeBuilding: 'Ofis Binası',\r\n Hotel: 'Hotel',\r\n },\r\n buildingComplexesSubMenu: 'Building Complexes',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: 'Güney Burlington Lisesi',\r\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, NM',\r\n },\r\n urbanPlanningSubMenu: 'Şehir Planlaması',\r\n urbanPlanningExamples: {\r\n Heatmap1: 'Isı Haritası',\r\n },\r\n otherBuildingsSubMenu: 'Other Buildings',\r\n otherBuildingExamples: {\r\n Greenhouse: 'Sera',\r\n Pavilion: 'Park Kamelyası',\r\n OctagonalPagoda: 'Octagonal Pagoda',\r\n OceanFront: 'Ocean Front',\r\n EgyptianPyramids: 'Egyptian Pyramids',\r\n MayanPyramid: 'Mayan Pyramid',\r\n SiOSePol: 'Si-o-se-pol',\r\n StackedCuboids: 'Stacked Cuboids',\r\n },\r\n\r\n artificialIntelligenceSubMenu: 'Yapay Zeka',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: 'Güneş Paneli Sıra Eğim Açısı Optimize Etme',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Çoklu Güneş Paneli Sıra Eğim Açısı Optimize Etme',\r\n SolarFarmGenerativeDesign: 'Güneş Tarlası Tasarımı',\r\n SolarFarmGenerativeDesignWithBlock: 'Blok Varlığında Güneş Tarlası Tasarımı',\r\n FitchburgSolarFarmGenerativeDesign: 'Fitchburg Güneş Tarlası Tasarımı',\r\n },\r\n\r\n languageSubMenu: 'Dil',\r\n publicSubMenu: 'Public',\r\n ModelsGallery: 'Models Gallery',\r\n ModelsMap: 'Models Map',\r\n AboutUs: 'Hakkımızda',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: 'Hesap Ayarları',\r\n PrivacyStatementTitle: 'User Privacy Protection Statement',\r\n PrivacyStatement:\r\n 'Oturum açtığınızda, Aladdin hesabınızı oluşturmak ve hesabınıza erişmek için Google Kimliğiniz kullanılır. Veritabanımızda referans olarak yalnızca rastgele bir alfasayısal dize depolanır. Adınız veya e-posta adresiniz gibi kişisel olarak tanımlanabilir hiçbir veri toplanmaz. Daha fazla bilgi için ',\r\n SignIn: 'Kayıt Ol',\r\n SignOut: 'Oturum Kapat',\r\n IfYouAreAStudent: 'Eğer Öğrenciyseniz',\r\n },\r\n\r\n skyMenu: {\r\n Axes: 'Eksenler',\r\n Theme: 'Tema',\r\n ThemeDefault: 'Varsayılan',\r\n ThemeDesert: 'Çöl',\r\n ThemeDune: 'Dune',\r\n ThemeForest: 'Orman',\r\n ThemeGrassland: 'Çayır',\r\n ThemeHill: 'Hill',\r\n ThemeLake: 'Lake',\r\n ThemeMountain: 'Mountain',\r\n ThemeRural: 'Rural',\r\n SunlightAttenuationCoefficientInAir: 'Havan Güneş Işığı Zayıflatma Katsayısı',\r\n ConvectiveCoefficientOfAir: 'Havan Isı İletkenlik Katsayısı',\r\n HighestTemperatureTimeInMinutes: 'En Yüksek Sıcaklık Süresi (Dakika)',\r\n SelectSunAnglesToShow: 'Gösterilecek Güneş Açılarını Seçin',\r\n ShowAzimuthAngle: 'Azimut Açısını Göster',\r\n ShowElevationAngle: 'Yükselme Açısını Göster',\r\n ShowZenithAngle: 'Zenit Açısını Göster',\r\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\r\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\r\n Vegetation: 'Vegetation',\r\n LeafOutDay: 'Leaf-Out Day',\r\n LeafOffDay: 'Leaf-Off Day',\r\n Albedo: 'Albedo',\r\n ImageOnGround: 'Yer Görüntüsü',\r\n WaterSurface: 'Water Surface',\r\n RemoveAllUnlockedTrees: 'Tüm Ağaçları Kaldır',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedPeople: 'Tüm Kişileri Kaldır',\r\n RemoveAllUnlockedFoundations: 'Tüm Temelleri Kaldır',\r\n RemoveAllUnlockedCuboids: 'Tüm Kübikleri Kaldır',\r\n DoYouReallyWantToRemoveAllPeople: 'Tüm Kişileri Kaldırmak İstiyor Musunuz?',\r\n DoYouReallyWantToRemoveAllTrees: 'Tüm Ağaçları Kaldırmak İstiyor Musunuz?',\r\n DoYouReallyWantToRemoveAllFlowers: 'Do you really want to remove all the flowers that are not locked',\r\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\r\n DoYouReallyWantToRemoveAllFoundations: 'Tüm Temelleri Kaldırmak İstiyor Musunuz?',\r\n DoYouReallyWantToRemoveAllCuboids: 'Tüm Kübikleri Kaldırmak İstiyor Musunuz?',\r\n LockAllElements: 'Tüm Öğeleri Kilitle',\r\n UnlockAllElements: 'Tüm Öğelerin Kilidini Aç',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: 'Etiket',\r\n LabelText: 'Label Text',\r\n LabelHeight: 'Label Height',\r\n LabelSize: 'Label Size',\r\n LabelFontSize: 'Font Size',\r\n LabelColor: 'Label Color',\r\n KeepShowingLabel: 'Etiketi Göstermeye Devam Et',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: 'Tüm Kilitlenmemiş Güneş Panellerini Kaldır',\r\n RemoveAllUnlockedParabolicTroughs: 'Tüm Kilitlenmemiş Parabolik Olukları Kaldır',\r\n RemoveAllUnlockedParabolicDishes: 'Tüm Kilitlenmemiş Parabolik Çanakları Kaldır',\r\n RemoveAllUnlockedFresnelReflectors: 'Tüm Kilitlenmemiş Fresnel Reflektörleri Kaldır',\r\n RemoveAllUnlockedHeliostats: 'Tüm Kilitlenmemiş Heliostatları Kaldır',\r\n RemoveAllUnlockedSensors: 'Tüm Kilitlenmemiş Sensörleri Kaldır',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n RemoveAllUnlockedWalls: 'Tüm Kilitlenmemiş Duvarları Kaldır',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n RemoveAllUnlockedDoors: 'Remove All Unlocked Doors',\r\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Çokgenleri Kaldır',\r\n RemoveAllUnlockedHumans: 'Tüm Kilitlenmemiş İnsanları Kaldır',\r\n RemoveAllUnlockedTrees: 'Tüm Kilitlenmemiş Ağaçları Kaldır',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Çerçeveler',\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n SolarPanels: 'Güneş Panelleri',\r\n SolarPanelArray: 'Solar Panel Array',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\r\n ' Seçili temel üzerindeki tüm güneş panellerini kaldırmak istiyor musunuz?',\r\n ParabolicTroughs: 'Parabolik Oluklar',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm parabolik olukları kaldırmak istiyor musunuz?',\r\n ParabolicDishes: 'Parabolik Çanaklar',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm parabolik çanakları kaldırmak istiyor musunuz?',\r\n FresnelReflectors: 'Fresnel Reflektörler',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm Fresnel reflektörlerini kaldırmak istiyor musunuz?',\r\n Heliostats: 'Heliostatlar',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm heliostatları kaldırmak istiyor musunuz?',\r\n Sensors: 'Sensörler',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm sensörleri kaldırmak istiyor musunuz?',\r\n Lights: 'Lights',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation:\r\n 'Do you really want to remove all the lights on this foundation that are not locked',\r\n Walls: 'Duvarlar',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm duvarları kaldırmak istiyor musunuz? ',\r\n Windows: 'Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\r\n 'Do you really want to remove all the windows on this foundation that are not locked',\r\n Doors: 'Doors',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\r\n 'Do you really want to remove all the doors on this foundation that are not locked',\r\n Polygons: 'Poligonlar',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm poligonları kaldırmak istiyor musunuz?',\r\n Humans: 'Kişiler',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm insanları kaldırmak istiyor musunuz?',\r\n Trees: 'Ağaçlar',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation:\r\n ' Seçili temel üzerinde kilitli olmayan tüm ağaçları kaldırmak istiyor musunuz?',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\r\n 'Do you really want to remove all the flowers on this foundation that are not locked',\r\n OnlyThisFoundation: 'Sadece Seçili Temel',\r\n AllConnectedFoundations: 'Tüm Bağlantılı Temeller',\r\n AllSelectedFoundations: 'All Selected Foundations',\r\n AllFoundations: 'Tüm Temeller',\r\n AddPolygon: 'Poligon Ekle',\r\n SolarStructure: 'Solar Yapı Seçin',\r\n GroupMaster: 'Grup Yöneticisi',\r\n LockAllElementsOnThisFoundation: ' Seçili temel üzerindeki tüm öğeleri kilitle',\r\n UnlockAllElementsOnThisFoundation: ' Seçili temel üzerindeki tüm öğelerin kilidini aç',\r\n GroundFloorRValue: 'Ground Floor R-Value',\r\n OnlyThisGroundFloor: 'Only This Ground Floor',\r\n AllGroundFloors: 'All Ground Floors',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: 'Heliostat Alıcı Kulesi',\r\n ReceiverTowerPhysicalProperties: 'Alıcı Kule Fiziksel Özellikler',\r\n ReceiverTowerHeight: 'Alıcı Kule Yükseklik',\r\n ReceiverTowerRadius: 'Alıcı Kule Yarıçap',\r\n ReceiverAbsorptance: 'Alıcı Absorbsiyon',\r\n ReceiverOpticalEfficiency: 'Alıcı Optik Verim',\r\n ReceiverThermalEfficiency: 'Alıcı Termal Verim',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: 'Fresnel Reflektör Soğurucu Boru',\r\n AbsorberPipePhysicalProperties: 'Soğurucu Boru Fiziksel Özellikler',\r\n AbsorberHeight: 'Soğurucu Boru Yükseklik',\r\n AbsorberApertureWidth: 'Soğurucu boru diyafram genişliği',\r\n AbsorberPipePoleNumber: 'Soğurucu Boru Sayısı',\r\n AbsorberAbsorptance: 'Soğurucu Absorbsiyonu',\r\n AbsorberOpticalEfficiency: 'Soğurucu Optik Verimlilik',\r\n AbsorberThermalEfficiency: 'Soğurucu Isıl Verimlilik',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: 'Solar Updraft Kulesi',\r\n SolarUpdraftTowerPhysicalProperties: 'Solar Updraft Kulesi Fiziksel Özellikler',\r\n SolarUpdraftTowerChimneyHeight: 'Solar Updraft Kulesi Baca Yüksekliği',\r\n SolarUpdraftTowerChimneyRadius: 'Solar Updraft Kulesi Baca Yarıçapı',\r\n SolarUpdraftTowerCollectorHeight: 'Solar Updraft Kulesi Collector Height',\r\n SolarUpdraftTowerCollectorRadius: 'Solar Updraft Kulesi Kollektör Yarıçapı',\r\n SolarUpdraftTowerCollectorTransmissivity: 'Solar Updraft Kulesi Kollektör Geçirgenliği',\r\n SolarUpdraftTowerCollectorEmissivity: 'Solar Updraft Kulesi Kollektör Emisivite',\r\n SolarUpdraftTowerDischargeCoefficient: 'Solar Updraft Kulesi Deşarj Katsayısı',\r\n SolarUpdraftTowerTurbineEfficiency: 'Solar Updraft Kulesi Türbin Verimliliği',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n RemoveAllUnlockedSolarPanels: 'Tüm Kilitlenmemiş Güneş Panellerini Kaldır',\r\n RemoveAllUnlockedSensors: 'Tüm Kilitlenmemiş Sensörleri Kaldır',\r\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Poligonları Kaldır',\r\n RemoveAllUnlockedHumans: 'Tüm Kilitlenmemiş Kişileri Kaldır',\r\n RemoveAllUnlockedTrees: 'Tüm Kilitlenmemiş Ağaçları Kaldır',\r\n RemoveAllUnlockedFlowers: 'Remove All Unlocked Flowers',\r\n Racks: 'Çerçeveler',\r\n SolarPanels: 'Güneş Panelleri',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm güneş panellerini kaldırmak istiyor musunuz?',\r\n Sensors: 'Sensörler',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm sensörleri kaldırmak istiyor musunuz?',\r\n Polygons: 'Poligonlar',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm poligonları kaldırmak istiyor musunuz?',\r\n Humans: 'İnsanlar',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm insanları kaldırmak istiyor musunuz?',\r\n Trees: 'Ağaçlar',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid:\r\n ' Seçili kübik üzerinde kilitlenmemiş tüm ağaçları kaldırmak istiyor musunuz?',\r\n Flowers: 'Flowers',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\r\n 'Do you really want to remove all the flowers on this cuboid that are not locked',\r\n OnlyThisCuboid: 'Sadece Seçili Kübik',\r\n AllCuboidsOnSameSurface: 'All Cuboids on Same Surface',\r\n AllCuboidsAboveSameBase: 'All Cuboids above Same Base',\r\n AllSelectedCuboids: 'All Selected Cuboids',\r\n AllCuboids: 'Tüm Kübikler',\r\n OnlyThisSide: 'Sadece Seçili Yüzey',\r\n AllSidesOfThisCuboid: 'Seçili Kübik Tüm Yüzeyler',\r\n AllSidesOfSelectedCuboids: 'All Sides of Selected Cuboids',\r\n AllSidesOfAllCuboids: 'Bütün Kübik Yüzeyleri ',\r\n AddPolygon: 'Poligon Ekle',\r\n Stackable: 'Stackable',\r\n GroupMaster: 'Group Master',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n TextBox: 'Text Box',\r\n FontOutlineColor: 'Font Outline Color',\r\n FontOutlineWidth: 'Font Outline Width',\r\n FontStrokeColor: 'Font Stroke Color',\r\n FontStrokeWidth: 'Font Stroke Width',\r\n NoOutline: 'No Outline',\r\n Shiny: 'Shiny',\r\n Filled: 'Dolgu',\r\n FillTexture: 'Dolgu Dokusu',\r\n FillColor: 'Dolgu Rengi',\r\n Opacity: 'Opaklık',\r\n LineColor: 'Çizgi Rengi',\r\n LineWidth: 'Çizgi Kalınlığı',\r\n LineStyle: 'Çizgi Stili',\r\n SolidLine: 'Düz çizgi',\r\n DashedLine: 'Kesik çizgi',\r\n DottedLine: 'Noktalı çizgi',\r\n InsertVertexBeforeIndex: 'İndeksten Önce Tepe Noktası Ekle',\r\n InsertVertexAfterIndex: 'İndeksten Sonra Tepe Noktası Ekle',\r\n DeleteVertex: 'Tepe Noktası Sil',\r\n OnlyThisPolygon: 'Sadece Seçili Poligon',\r\n AllPolygonsOnSurface: 'Tüm Poligonlar Aynı Yüzeyde',\r\n AllPolygonsAboveFoundation: 'Temel Üzerindeki Tüm Poligonlar',\r\n AllSelectedPolygons: 'All Selected Polygons',\r\n AllPolygons: 'Tüm Poligonlar',\r\n Layout: 'Düzen',\r\n SolarPanelArrayLayout: 'Güneş Paneli Dizi Düzeni',\r\n SolarPanelArrayLayoutParametricDesign: 'Güneş Paneli Dizi Düzeni: Parametrik Tasarım',\r\n SolarPanelArrayLayoutGenerativeDesign: 'Güneş Paneli Dizi Düzeni: Üretici Tasarım',\r\n SolarPanelArrayModel: 'Güneş Paneli Modeli',\r\n SolarPanelArrayOrientation: 'Oryantasyon',\r\n SolarPanelArrayTiltAngle: 'Eğim Açısı',\r\n SolarPanelArrayRowWidth: 'Dizi Sıra Genişliği',\r\n SolarPanelArrayInterRowSpacing: 'Dizi Sıra Arası Boşluk',\r\n SolarPanelArrayRowSpacing: 'Row Spacing',\r\n SolarPanelArrayRowAxis: 'Dizi Sıra Ekseni',\r\n SolarPanelArrayLeftRightRowAxis: 'Left-Right (Relative)',\r\n SolarPanelArrayUpDownRowAxis: 'Up-Down (Relative)',\r\n SolarPanelArrayEastWestRowAxis: 'Doğu-Batı (Absolute)',\r\n SolarPanelArrayNorthSouthRowAxis: 'Kuzey-Güney (Absolute)',\r\n SolarPanelArrayMargin: 'Margin',\r\n SolarPanelArrayPoleHeight: 'Direk Yükseklik',\r\n SolarPanelArrayPoleSpacing: 'Direk Aralık',\r\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\r\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\r\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\r\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\r\n SolarPanelArrayYearlyProfit: 'Profit',\r\n LayoutNotAcceptedCheckYourParameters: 'Bu yerleşim düzeni uygulanamaz. Lütfen parametrelerinizi kontrol edin.',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: 'Optimizasyon',\r\n Parameters: 'Parametreler',\r\n Variables: 'Değişkenler',\r\n Constants: 'Sabitler',\r\n GeneticAlgorithm: 'Genetik Algoritma',\r\n GeneticAlgorithmSettings: 'Genetik Algoritma Ayarı',\r\n ParticleSwarmOptimization: 'Parçacık Sürü Optimizasyon',\r\n ParticleSwarmOptimizationSettings: 'Parçacık Sürü Optimizasyon Ayarı',\r\n SolarPanelTiltAngleOptimization: 'Güneş Paneli Eğim Açısı Optimizasyonu',\r\n SolarPanelArrayLayout: 'Güneş Paneli Dizi Düzeni',\r\n Generation: 'Nesil',\r\n Gene: 'Gen',\r\n NormalizedVariables: 'Normalleştirilmiş Değişkenler',\r\n Objective: 'Amaç',\r\n ObjectiveFunctionDailyTotalYield: 'Günlük Toplam Üretim',\r\n ObjectiveFunctionYearlyTotalYield: 'Yıllık Toplam Üretim',\r\n ObjectiveFunctionDailyMeanYield: 'Günlük Ortalama Üretim',\r\n ObjectiveFunctionYearlyMeanYield: 'Yıllık Ortalama Üretim',\r\n ObjectiveFunctionDailyProfit: 'Günlük Kazanç',\r\n ObjectiveFunctionYearlyProfit: 'Yıllık Kazanç',\r\n GeneticAlgorithmSelectionMethod: 'Genetik Algoritma Seçim Yöntemi',\r\n RouletteWheel: 'Rulet Çarkı',\r\n Tournament: 'Turnuva',\r\n SearchMethod: 'Arama Yöntemi',\r\n GlobalSearchUniformSelection: 'Küresel Arama Standart Seçim',\r\n LocalSearchRandomOptimization: 'Yerel Arama Rastgele Optimizasyon',\r\n PopulationSize: 'Popülasyon Boyutu',\r\n MaximumGenerations: 'Maksimum Nesil',\r\n SelectionRate: 'Seçim Oranı',\r\n CrossoverRate: 'Geçiş Oranı',\r\n MutationRate: 'Mutasyon Oranı',\r\n Step: 'Adım',\r\n SwarmSize: 'Sürü Boyutu',\r\n MaximumSteps: 'Maksimum Adım',\r\n MaximumVelocity: 'Maksimum Hız',\r\n InertiaWeight: 'Atalet Ağırlığı',\r\n CognitiveCoefficient: 'Bilişsel Katsayı',\r\n SocialCoefficient: 'Sosyal Katsayı',\r\n ConvergenceThreshold: 'Sonlandırma için Yakınsama Eşiği',\r\n LocalSearchRadius: 'Yerel Arama Yarıçapı',\r\n RowsPerRackRange: 'Raf Başına Sıra Aralığı',\r\n TiltAngleRange: 'Eğim Açısı Aralığı',\r\n InterRowSpacingRange: 'Sıra Arası Aralık Ranjı',\r\n ClickTargetPolygonToActivate: 'Etkinleştirmek için Hedef Poligona Tıklayınız',\r\n ClickTargetFoundationToActivate: 'Etkinleştirmek için Hedef Temele Tıklayınız',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: 'Modeli Göster',\r\n Flip: 'Flip',\r\n Type: 'Tür',\r\n Spread: 'Yayılım',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: 'Flip',\r\n Type: 'Type',\r\n Spread: 'Spread',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: 'Kişi Değiştir',\r\n Flip: 'Flip',\r\n Observer: 'Gözlemci',\r\n ViewFromThisPerson: ' Seçili Kişiye Göre Perspektif',\r\n },\r\n\r\n lightMenu: {\r\n Color: 'Color',\r\n Intensity: 'Intensity',\r\n Decay: 'Decay',\r\n MaximumDistance: 'Distance',\r\n Inside: 'Inside',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: 'Göreceli Azimut Açısı',\r\n Pole: 'Pole',\r\n PoleHeight: 'Direk Yüksekliği',\r\n PoleRadius: 'Pole Radius',\r\n ExtraPoleHeight: 'Ekstra Direk Yüksekliği',\r\n ExtraPoleHeightInAdditionToHalfWidth: 'Yarım Genişliğe Ek Ekstra Direk Yüksekliği',\r\n DrawSunBeam: 'Güneş Işını Çiz',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: 'Reflektör Yansıma',\r\n ReceiverAbsorptance: 'Alıcı Absorbsiyonu',\r\n ReflectorOpticalEfficiency: 'Reflektör Optik Verimliliği',\r\n ReceiverThermalEfficiency: 'Alıcı Termal Verimliliği',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: 'Inverter Efficiency',\r\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\r\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\r\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\r\n ChangePvModel: 'PV Modelini Değiştir',\r\n Orientation: 'Oryantasyon',\r\n Portrait: 'Portre',\r\n Landscape: 'Peyzaj',\r\n FrameColor: 'Frame Color',\r\n Panels: 'Paneller',\r\n PanelsWide: 'Panel Genişliği',\r\n PanelsLong: 'Panel Uzunluğu',\r\n TiltAngle: 'Eğim Açısı',\r\n SouthFacingIsPositive: 'Güney yönünde açı pozitiftir.',\r\n Tracker: 'İzleyici',\r\n SolarTrackerFollowsSun: 'Güneş paneli verimini artırmak için bir güneş izleme sistemi güneşi sürekli takip eder.',\r\n PoleSpacing: 'Direk Aralığı',\r\n NoTracker: 'İzleme Sistemi Yok',\r\n HorizontalSingleAxisTracker: 'Yatay Tek Eksenli İzleme Sistemi',\r\n VerticalSingleAxisTracker: 'Dikey Tek Eksenli İzleme Sistemi',\r\n AltazimuthDualAxisTracker: 'Altazimut Çift Eksenli İzleme Sistemi',\r\n OnlyThisSolarPanel: 'Sadece Seçili Güneş Paneli',\r\n AllSolarPanelsOnSurface: 'Tüm Güneş Panelleri Aynı Yüzeyde',\r\n AllSolarPanelsAboveFoundation: 'Tüm Güneş Panelleri Aynı Temel Üzerinde',\r\n AllSelectedSolarPanels: 'All Selected Solar Panels',\r\n AllSolarPanels: 'Tüm Güneş Panelleri',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: 'Güneş Paneli Özellikleri',\r\n Model: 'Model',\r\n PanelSize: 'Panel Boyutu',\r\n Cells: 'Hücreler',\r\n CellType: 'Hücre Tipi',\r\n Monocrystalline: 'Monokristal',\r\n Polycrystalline: 'Polikristal',\r\n ThinFilm: 'İnce Katman',\r\n Bifacial: 'Bifacial',\r\n BifacialityFactor: 'Bifaciality Factor',\r\n Black: 'Siyah',\r\n Blue: 'Mavi',\r\n ShadeTolerance: 'Gölge Toleransı',\r\n SolarCellEfficiency: 'Güneş Pili Verimliliği',\r\n NominalOperatingCellTemperature: 'Nominal Çalışma Hücresi Sıcaklığı',\r\n TemperatureCoefficientOfPmax: 'Pmax Sıcaklık Katsayısı',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: 'Modül Uzunluğu',\r\n Modules: 'Modüller',\r\n ModulesLong: 'Modüllerin Uzunluğu',\r\n LatusRectum: 'Özkiriş',\r\n OnlyThisParabolicTrough: 'Sadece Seçili Parabolik Oluk',\r\n AllParabolicTroughsAboveFoundation: 'Aynı Temelin Üzerindeki Tüm Parabolik Oluklar',\r\n AllSelectedParabolicTroughs: 'All Selected Parabolic Troughs',\r\n AllParabolicTroughs: 'Tüm Parabolik Oluklar',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: 'Soğurucu Boru',\r\n SelectAbsorberToReflectSunlightTo: 'Güneş Işığı Yansıtılacak Soğurucuyu Seçin',\r\n ModuleLength: 'Modül Uzunluğu',\r\n Modules: 'Modüller',\r\n ModulesLong: 'Modüllerin Uzunluğu',\r\n OnlyThisFresnelReflector: 'Sadece Seçili Fresnel Reflektör',\r\n AllFresnelReflectorsAboveFoundation: 'Aynı Temel Üzerindeki Tüm Fresnel Reflektörler',\r\n AllSelectedFresnelReflectors: 'All Selected Fresnel Reflectors',\r\n AllFresnelReflectors: 'Tüm Fresnel Reflektörler',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: 'Kule',\r\n SelectTowerToReflectSunlightTo: 'Güneş Işığı Yansıtılacak Kuleyi Seçin',\r\n OnlyThisHeliostat: 'Sadece Seçili Heliostat',\r\n AllHeliostatsAboveFoundation: 'Aynı Temel Üzerindeki Tüm Heliostatlar',\r\n AllSelectedHeliostats: 'All Selected Heliostats',\r\n AllHeliostats: 'Tüm Heliostatlar',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: 'Alıcı Yapısı',\r\n CentralPole: 'Merkez Direk',\r\n CentralPoleWithTripod: 'Tripodlu Merkez Direk',\r\n Quadrupod: 'Dört Ayaklı',\r\n RimDiameter: 'Kasnak Çapı',\r\n LatusRectum: 'Özkiriş',\r\n ExtraPoleHeightInAdditionToRadius: 'Yarıçapa Ek Olarak Ekstra Direk Yüksekliği',\r\n OnlyThisParabolicDish: 'Sadece Seçili Parabolik Çanak',\r\n AllParabolicDishesAboveFoundation: 'Aynı Temel Üzerindeki Tüm Parabolik Çanaklar',\r\n AllSelectedParabolicDishes: 'All Selected Parabolic Dishes',\r\n AllParabolicDishes: 'Tüm Parabolik Çanaklar',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: 'Varsayılan',\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n SizeOfWall: 'Duvar Boyutu',\r\n OnlyThisWall: 'Sadece Seçili Duvar',\r\n AllConnectedWalls: 'All Connected Walls',\r\n AllWallsAboveFoundation: ' Aynı Temel Üzerindeki Tüm Duvarlar',\r\n AllSelectedWalls: 'All Selected Walls',\r\n AllWalls: 'Tüm Duvarlar',\r\n Windows: 'Pencereler',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Kilitlenmemiş Tüm Pencereleri Kaldır',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: ' Seçili duvardaki tüm pencereleri kaldırmak istiyor musunuz?',\r\n Doors: 'Kapılar',\r\n RemoveAllUnlockedDoors: 'Tüm Kilitlenmemiş Kapıları Kaldır',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: ' Seçili duvardaki tüm kapıları kaldırmak istiyor musun?',\r\n SolarPanels: 'Güneş Panelleri',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Kilitlenmemiş Tüm Güneş Panellerini Kaldır',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall:\r\n ' Seçili duvardaki tüm güneş panellerini kaldırmak istiyor musunuz?',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Do you really want to remove all the sensors on this wall',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Do you really want to remove all the lights on this wall',\r\n LockAllPolygons: 'Lock All Polygons',\r\n UnlockAllPolygons: 'Unlock All Polygons',\r\n RemoveAllUnlockedPolygons: 'Tüm Kilitlenmemiş Poligonları Kaldır',\r\n WallStructure: 'Duvar Yapısı',\r\n DefaultStructure: 'Varsayılan',\r\n StudStructure: 'Ahşap Dikme',\r\n PillarStructure: 'Pillar',\r\n Opacity: 'Opaklık',\r\n StructureSpacing: 'Structure Spacing',\r\n StructureWidth: 'Structure Width',\r\n StructureThickness: 'Structure Thickness',\r\n StructureColor: 'Structure Color',\r\n Color: 'Wall Color',\r\n Height: 'Height',\r\n Thickness: 'Thickness',\r\n Texture: 'Texture',\r\n AllLightsOnWallInside: 'All Lights on Wall Inside',\r\n AllLightsOnWallOutside: 'All Lights on Wall Outside',\r\n Fill: 'Fill',\r\n Full: 'Full',\r\n Partial: 'Partial',\r\n Empty: 'Empty',\r\n OpenToOutside: 'Open to Outside',\r\n EavesLength: 'Eaves Overhang Length',\r\n Parapet: 'Parapet',\r\n ParapetColor: 'Parapet Color',\r\n ParapetTexture: 'Parapet Texture',\r\n ParapetHeight: 'Parapet Height',\r\n CopingsHeight: 'Copings Height',\r\n CopingsWidth: 'Copings Width',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: 'Sadece Bu Pencere',\r\n AllWindowsOnSurface: 'All Windows on the Same Surface',\r\n AllWindowsAboveFoundation: 'Aynı Temelin Üzerindeki Tüm Pencereler',\r\n AllSelectedWindows: 'All Selected Windows',\r\n AllWindows: 'Tüm Pencereler',\r\n Width: 'Genişlik',\r\n Height: 'Yükseklik',\r\n Setback: 'Setback from Exterior Surface',\r\n RelativeToWallThickness: 'Relative to wall thickness',\r\n Mullion: 'Tiriz',\r\n HorizontalMullion: 'Horizontal Mullion',\r\n VerticalMullion: 'Vertical Mullion',\r\n MullionWidth: 'Tiriz Genişliği',\r\n HorizontalMullionSpacing: 'Horizontal Mullion Spacing',\r\n VerticalMullionSpacing: 'Vertical Mullion Spacing',\r\n MullionColor: 'Mullion Color',\r\n Tint: 'Ton',\r\n Opacity: 'Opaklık',\r\n SolarHeatGainCoefficient: 'Solar heat gain coefficient (SHGC) = 1 - opacity',\r\n Shutter: 'Kepenk',\r\n LeftShutter: 'Sol Kepenk',\r\n RightShutter: 'Sağ Kepenk',\r\n BothShutters: 'Kepenkler',\r\n ShutterWidth: 'Genişlik',\r\n ShutterColor: 'Kepenk Rengi',\r\n Frame: 'Frame',\r\n FrameWidth: 'Frame Width',\r\n SillWidth: 'Sill Width',\r\n Color: 'Frame Color',\r\n WindowType: 'Window Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Polygonal: 'Polygonal',\r\n Interior: 'Interior',\r\n Empty: 'Empty',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: 'Varsayılan',\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n OnlyThisRoof: 'Sadece Seçili Çatı',\r\n AllRoofsAboveFoundation: 'Aynı Temelin Üzerinde Tüm Çatılar',\r\n AllSelectedRoofs: 'All Selected Roofs',\r\n AllRoofs: 'Tüm Çatılar',\r\n OnlyThisCeiling: 'Only This Ceiling',\r\n AllCeilingsAboveFoundation: 'All Ceilings Above the Same Foundation',\r\n AllCeilings: 'All Ceilings',\r\n EavesOverhangLength: 'Eaves Overhang Length',\r\n RafterSpacing: 'Mertek Aralığı',\r\n RafterWidth: 'Mertek Genişliği',\r\n RafterThickness: 'Mertek Kalınlığı',\r\n RafterColor: 'Mertek Rengi',\r\n RoofColor: 'Çatı Rengi',\r\n RoofSideColor: 'Roof Side Color',\r\n GlassTint: 'Cam Tonu',\r\n Opacity: 'Opaklık',\r\n RoofStructure: 'Çatı Yapısı',\r\n DefaultStructure: 'Varsayılan',\r\n RafterStructure: 'Mertek',\r\n GlassStructure: 'Cam',\r\n SolarPanels: 'Solar Panels',\r\n LockAllSolarPanels: 'Lock All Solar Panels',\r\n UnlockAllSolarPanels: 'Unlock All Solar Panels',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Do you really want to remove all the solar panels on this roof',\r\n Windows: 'Windows',\r\n LockAllWindows: 'Lock All Windows',\r\n UnlockAllWindows: 'Unlock All Windows',\r\n RemoveAllUnlockedWindows: 'Remove All Unlocked Windows',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Do you really want to remove all the windows on this roof',\r\n Sensors: 'Sensors',\r\n LockAllSensors: 'Lock All Sensors',\r\n UnlockAllSensors: 'Unlock All Sensors',\r\n RemoveAllUnlockedSensors: 'Remove All Unlocked Sensors',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Do you really want to remove all the sensors on this roof',\r\n Lights: 'Lights',\r\n RemoveAllUnlockedLights: 'Remove All Unlocked Lights',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Do you really want to remove all the lights on this roof',\r\n AllLightsOnRoofInside: 'All Lights on Roof Inside',\r\n AllLightsOnRoofOutside: 'All Lights on Roof Outside',\r\n Rise: 'Rise',\r\n Ceiling: 'Ceiling',\r\n RoofRValue: 'Roof R-Value',\r\n CeilingRValue: 'Ceiling R-Value',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: 'Varsayılan',\r\n Texture01: 'Doku 1',\r\n Texture02: 'Doku 2',\r\n Texture03: 'Doku 3',\r\n Texture04: 'Doku 4',\r\n Texture05: 'Doku 5',\r\n Texture06: 'Doku 6',\r\n Texture07: 'Doku 7',\r\n Texture08: 'Doku 8',\r\n Texture09: 'Doku 9',\r\n Texture10: 'Doku 10',\r\n Texture11: 'Doku 11',\r\n Texture12: 'Doku 12',\r\n Texture13: 'Doku 13',\r\n Texture14: 'Doku 14',\r\n Texture15: 'Doku 15',\r\n Texture16: 'Doku 16',\r\n Texture17: 'Doku 17',\r\n OnlyThisDoor: 'Sadece Seçili Kapı',\r\n AllDoorsOnWall: 'Aynı Duvardaki Tüm Kapılar',\r\n AllDoorsAboveFoundation: 'Aynı Temelin Üstündeki Tüm Kapılar',\r\n AllSelectedDoors: 'All Selected Doors',\r\n AllDoors: 'Tüm Kapılar',\r\n DoorType: 'Door Type',\r\n Default: 'Default',\r\n Arched: 'Arched',\r\n Filled: 'Filled',\r\n FrameColor: 'Frame Color',\r\n Interior: 'Interior',\r\n },\r\n\r\n siteInfoPanel: {\r\n High: 'Yüksek',\r\n Low: 'Düşük',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: 'Seçilen heliostat sayısı',\r\n NumberOfSelectedSolarPanels: 'Seçilen güneş paneli sayısı',\r\n ElectricityGeneratedDailyBySolarPanels: 'Güneş panellerinin günlük elektrik üretimi',\r\n SceneDiameter: 'Scene diameter',\r\n BuildingArea: 'Building area',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: 'Renk Kontrastı',\r\n FluxScale: 'Flux Scale',\r\n ClickUpOrDownArrowButtonsToChange: 'Değiştirmek için yukarı veya aşağı ok butonlarına tıklayınız',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: 'Döndürme',\r\n DragMouse: 'Sol Tık + Sürükle',\r\n Zoom: 'Yakınlaştırma',\r\n MouseWheelOrKeys: 'Tekerlek veya Ctrl+[ veya Ctrl+]',\r\n MouseWheelOrKeysMac: 'Tekerlek veya ⌘+[ veya ⌘+]',\r\n Pan: 'Ekran Kaydırma',\r\n HoldCtrlDragMouse: 'Ctrl + Sürükle',\r\n HoldMetaDragMouse: 'Hold ⌘ and drag mouse',\r\n Enter2DMode: 'Enter 2D mode',\r\n Exit2DMode: 'Exit 2D mode',\r\n NavigationMode: 'Navigation mode',\r\n EnableNavigation: 'Enable navigation',\r\n DisableNavigation: 'Disable navigation',\r\n MoveForwardBack: 'Move forward/back',\r\n MoveForwardBackInstruction: 'Press W/S',\r\n MoveLeftRight: 'Move left/right',\r\n MoveLeftRightInstruction: 'Press A/D',\r\n MoveUpDown: 'Move up/down',\r\n MoveUpDownInstruction: 'Press Z/X',\r\n Turn: 'Turn',\r\n TurnInstruction: 'Press arrow keys',\r\n ResetView: 'Yeniden Başlat',\r\n AutoRotate: 'Otomatik Döndürme',\r\n StartOrStop: 'Başlat veya Durdur (F4)',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: 'Yüzey Görünümü',\r\n WeatherStations: 'Referans',\r\n WeatherStationsNote: 'Turn this off to speed up',\r\n Coordinates: 'Koordinatlar',\r\n Zoom: 'Büyüt',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: 'Güneş Paneli Görünüm',\r\n Observer: 'Gözlemci',\r\n VantagePoint: 'Referans Noktası',\r\n ItemizedVisibilityByFields: 'Alana Özel Perspektif',\r\n TotalVisibility: 'Toplam',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: 'Işık Sensörü',\r\n WeatherDataFrom: 'Hava Durumu',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: 'Daily Building Energy',\r\n YearlyBuildingEnergy: 'Yearly Building Energy',\r\n Heater: 'Heater',\r\n AC: 'AC',\r\n SolarPanel: 'Solar Panel',\r\n Net: 'Net',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: 'Güneş Paneli Günlük Üretim',\r\n SolarPanelYearlyYield: 'Güneş Paneli Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualSolarPanels: 'Herbir güneş panelinin üretimini göster',\r\n Profit: 'Kazanç',\r\n TotalCost: 'Total Cost',\r\n TotalRevenue: 'Total Revenue',\r\n TotalYield: 'Total Yield',\r\n MeanYield: 'Mean Yield',\r\n ModuleCount: 'Module Count',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: 'Parabolik Oluk Günlük Üretim',\r\n ParabolicTroughYearlyYield: 'Parabolik Oluk Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualParabolicTroughs: 'Herbir parabolik oluğun üretimini göster',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: 'Parabolik Çanak Günlük Üretim',\r\n ParabolicDishYearlyYield: 'Parabolik Çanak Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualParabolicDishes: 'Herbir parabolik çanağın üretimini göster',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: 'Fresnel Reflektör Günlük Üretim',\r\n FresnelReflectorYearlyYield: 'Fresnel Reflektör Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualFresnelReflectors: 'Herbir Fresnel yansıtıcısının üretimini göster',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: 'Heliostat Günlük Üretim',\r\n HeliostatYearlyYield: 'Heliostat Yıllık Üretim',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualHeliostats: 'Herbir heliostatın üretimini göster',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: 'Solar Updraft Kulesi Günlük Üretimi',\r\n UpdraftTowerYearlyYield: 'Solar Updraft Kulesi Yıllık Üretimi',\r\n ChimneyAirTemperature: 'Baca Hava Sıcaklığı',\r\n ChimneyWindSpeed: 'Baca Rüzgar Hızı',\r\n Yield: 'Üretim',\r\n YieldPerHour: 'Saatlik Üretim',\r\n DailyTotal: 'Günlük Toplam',\r\n YearlyTotal: 'Yıllık Toplam',\r\n ShowOutputsOfIndividualUpdraftTowers: 'Herbir updraft kulesinin üretimini göster',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: 'Güneş & Saat Ayarları',\r\n SunAngles: 'Açılar',\r\n TwentyFourHours: '24 Hours',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyLikes: 'My Likes',\r\n MyCloudFiles: 'Bulut Dosyalarım',\r\n GenerateLink: 'Link Oluştur',\r\n LinkGeneratedInClipBoard: 'Klip Panosunda Oluşturulan Link',\r\n DoYouReallyWantToDelete: 'Gerçekten silmek istiyor musun?',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\r\n 'If this file has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Search by title',\r\n MyProjects: 'My Projects',\r\n GenerateProjectLink: 'Generate Project Link',\r\n ProjectLinkGeneratedInClipBoard: 'A link to the project was generated in the clip board',\r\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\r\n 'If this project has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: 'Project Settings',\r\n ThumbnailImageSize: 'Thumbnail Image Size',\r\n ProjectByOtherPeople: 'Project by Other People',\r\n Project: 'Project',\r\n ProjectType: 'Type',\r\n ProjectDescription: 'Description',\r\n MakeDescriptionEditable: 'Make this description editable',\r\n MakeDescriptionNonEditable: 'Make this description non-editable',\r\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\r\n SolarPanelArray: 'Solar Panel Array',\r\n CurateCurrentDesign: 'Curate current design',\r\n UpdateSelectedDesign: 'Update selected design',\r\n RemoveSelectedDesign: 'Remove selected design',\r\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\r\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\r\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\r\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\r\n ChooseSolutionSpace: 'Choose solution space',\r\n ChooseDataColoring: 'Choose data coloring',\r\n SameColorForAllDesigns: 'Same color for all designs',\r\n OneColorForEachDesign: 'One color for each design',\r\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\r\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\r\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\r\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\r\n GenerateScatteredPlot: 'Generate Scattered Plot',\r\n SelectXAxis: 'Select X Axis',\r\n SelectYAxis: 'Select Y Axis',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: 'Hesap Ayarlarım',\r\n MyID: 'Bilgilerim',\r\n ClickToCopyMyID: 'Bilgilerinizi kopyalamak için tıklayın',\r\n IDInClipBoard: 'Kişisel bilgileriniz kopyalandı ve yapıştırmaya hazır.',\r\n StoreMyNameInMyFilesWhenSaving: 'Kaydederken, adımı dosyalarıma ekle',\r\n DoYouReallyWantToShowYourNameInYourFiles: 'Dosyalarınızda isminizin gösterilmesini istiyor musunuz?',\r\n SignFileDisclaimer: 'Evet ise, isiminiz dosyalarınıza erişimi olan bütün kişiler tarafından görülebilir.',\r\n Likes: 'Likes',\r\n AllPublished: 'All Published',\r\n PublishedUnderAliases: 'Aliases',\r\n UserCount: 'Kullanıcı Sayısı',\r\n SchoolID: 'Okul',\r\n ClassID: 'Sınıf',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: 'Gündüz Saatleri',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: 'Model Seç',\r\n Sinusoidal: 'Sinüzoidal',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: 'Ekonomik Parametreler',\r\n ElectricitySellingPrice: 'Elektrik Satış Fiyatı',\r\n OperationalCostPerUnit: 'Birim Başına İşletme Maliyeti',\r\n SellingPrice: 'Selling Price',\r\n UnitCost: 'Unit Cost',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: 'Navigation Parameters',\r\n MinimumMoveSpeed: 'Minimum Move Speed',\r\n MinimumTurnSpeed: 'Minimum Turn Speed',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: 'Gökyüzü Açıklığı',\r\n ShowDaylightResults: 'Gün Işığı Sonuçlarını Göster',\r\n ShowSkyClearnessResults: 'Gökyüzü Açıklığı Sonuçlarını Göster',\r\n ShowAverageDailySolarRadiation: 'Günlük ortalama güneş Işınımını göster',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: 'Veri toplamak için sensör yok.',\r\n NoSolarPanelForAnalysis: 'Analiz için güneş paneli yok.',\r\n NoObserverForVisibilityAnalysis: 'Görünürlük analizi için gözlemci yok.',\r\n NoWaterHeaterForAnalysis: 'Analiz için su ısıtıcısı yok',\r\n NoParabolicDishForAnalysis: 'Analiz için parabolik çanak yok',\r\n NoParabolicTroughForAnalysis: 'Analiz için parabolik oluk yok.',\r\n NoFresnelReflectorForAnalysis: 'Analiz için Fresnel reflektörü yok.',\r\n NoHeliostatForAnalysis: 'Analiz için heliostat yok.',\r\n NoSolarUpdraftTowerForAnalysis: 'Analiz için Solar Updraft Kulesi yok.',\r\n NoBuildingForAnalysis: 'There is no building for analysis.',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: 'Bulut Dosyası',\r\n Select: 'Seç',\r\n AddFoundation: 'Temel Ekle',\r\n AddWall: 'Duvar Ekle',\r\n AddWindow: 'Pencere Ekle',\r\n AddDoor: 'Kapı Ekle',\r\n AddPyramidRoof: 'Piramit Çatı Ekle',\r\n AddGableRoof: 'Beşik Çatı Ekle',\r\n AddHipRoof: 'Kırma Çatı Ekle',\r\n AddGambrelRoof: 'Flemenk Çatı Ekle',\r\n AddMansardRoof: 'Mansart Çatı Ekle',\r\n AddCuboid: 'Kübik Ekle',\r\n AddSensor: 'Sensör Ekle',\r\n AddSolarPanel: 'Güneş Paneli Ekle',\r\n AddWaterHeater: 'Su Isıtıcı Ekle',\r\n AddParabolicDish: 'Parabolik Çanak Ekle',\r\n AddParabolicTrough: 'Parabolik Oluk Ekle',\r\n AddFresnelReflector: 'Fresnel Reflektörü Ekle',\r\n AddHeliostat: 'Heliostat Ekle',\r\n AddWindTurbine: 'Add wind turbine',\r\n AddLight: 'Add light',\r\n AddTree: 'Ağaç Ekle',\r\n AddFlower: 'Add flower',\r\n AddPeople: 'İnsan Ekle',\r\n DoubleClickToLockThisModeForNextAction: 'Double-click to lock this mode for next action',\r\n ClickToUnlockThisModeForNextAction: 'Click to unlock this mode for next action',\r\n ManipulateGroup: 'Ölçeklendirme',\r\n ClearScene: 'Herşeyi Sil',\r\n ShowSunAndTimeSettings: 'Güneş & Zaman Ayarlarını Göster',\r\n SpatialAnalysisOfEnergy: 'Spatial analysis of energy',\r\n DoYouReallyWantToClearContent: 'İçeriği silmek istiyor musunuz',\r\n ClickForMoreButtons: 'Daha fazla buton için tıklayın',\r\n SwitchToAddingFoundation: 'Temel Ekle ',\r\n SwitchToAddingCuboid: 'Kübik Ekle ',\r\n SwitchToAddingWall: 'Duvar Ekle',\r\n SwitchToAddingWindow: \"Pencere Eklemeyi'Aç\",\r\n SwitchToAddingDoor: 'Kapı Ekle',\r\n SwitchToAddingPyramidRoof: 'Piramit Çatı Ekle',\r\n SwitchToAddingGableRoof: 'Beşik Çatı Ekle',\r\n SwitchToAddingHipRoof: 'Kırma Çatı Ekle',\r\n SwitchToAddingGambrelRoof: 'Flemenk Çatı Ekle',\r\n SwitchToAddingMansardRoof: 'Mansart Çatı Ekle',\r\n SwitchToAddingSolarPanel: 'Güneş Paneli Ekle',\r\n SwitchToAddingSensor: 'Sensör Ekle',\r\n SwitchToAddingWaterHeater: 'Su Isıtıcı Ekle',\r\n SwitchToAddingParabolicDish: 'Parabolik Çanak Ekle',\r\n SwitchToAddingParabolicTrough: 'Parabolik Oluk Ekle',\r\n SwitchToAddingFresnelReflector: 'Fresnel Reflektör Ekle',\r\n SwitchToAddingHeliostat: 'Heliostat Ekle',\r\n SwitchToAddingWindTurbine: 'Switch to Adding Wind Turbine',\r\n SwitchToAddingLight: 'Switch to Adding Light',\r\n SwitchToAddingTree: 'Ağaç Ekle',\r\n SwitchToAddingFlower: 'Switch to Adding Flower',\r\n SwitchToAddingPeople: 'Kişi Ekle',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: 'Yarının Zekası Enstitüsüne Git',\r\n visitAladdinHomePage: 'Aladdin Ana Sayfasını Ziyaret Edin',\r\n clickToOpenMenu: 'Ana Menüyü Açmak İçin Tıklayınız',\r\n clickToAccessAccountSettings: 'Click to access account settings',\r\n },\r\n\r\n tree: {\r\n Apple: 'Apple',\r\n Birch: 'Birch',\r\n Coconut: 'Coconut',\r\n Dogwood: 'Kızılcık Ağacı',\r\n Elm: 'Karaağaç',\r\n FanPalm: 'Fan Palm',\r\n Linden: 'Ihlamur Ağacı',\r\n Magnolia: 'Magnolia',\r\n Maple: 'Akçaağaç',\r\n Oak: 'Meşe Ağacı',\r\n Pine: 'Çam',\r\n Spruce: 'Alaçam',\r\n },\r\n\r\n flower: {\r\n Bellflower: 'Bellflower',\r\n Boxwood: 'Boxwood',\r\n CactusCombo1: 'Cactus Combo 1',\r\n CactusCombo2: 'Cactus Combo 2',\r\n CactusCombo3: 'Cactus Combo 3',\r\n CactusCombo4: 'Cactus Combo 4',\r\n Hibiscus: 'Hibiscus',\r\n Hosta: 'Hosta',\r\n Hydrangea: 'Hydrangea',\r\n Peony: 'Peony',\r\n RedRose: 'Red Rose',\r\n Spirea: 'Spirea',\r\n Sunflower: 'Sunflower',\r\n TallBush: 'Tall Bush',\r\n Tulip: 'Tulip',\r\n WhiteFlower: 'White Flower',\r\n YellowFlower: 'Yellow Flower',\r\n },\r\n\r\n people: {\r\n Jaah: 'Ata',\r\n Jack: 'Mete',\r\n Jacob: 'Jacob',\r\n Jacqueline: 'Beril',\r\n Jade: 'Ece',\r\n Jamelia: 'Bilge',\r\n James: 'James',\r\n Jane: 'Jane',\r\n Jaya: 'Asya',\r\n Jaye: 'Aylin',\r\n Jeanette: 'Jeanette',\r\n Jedi: 'Alp',\r\n Jeff: 'Kaya',\r\n Jena: 'Nehir',\r\n Jennifer: 'Defne',\r\n Jess: 'Zeynep',\r\n Jett: 'Umut',\r\n Jill: 'Jill',\r\n Jiya: 'Elif',\r\n Joan: 'Ezgi',\r\n Jocelyn: 'Jocelyn',\r\n Joel: 'Cenk',\r\n Joey: 'Azra',\r\n John: 'Can',\r\n Jonathon: 'Jonathon',\r\n Jose: 'Mert',\r\n Joseph: 'Joseph',\r\n Joshua: 'Joshua',\r\n Judd: 'Ozan',\r\n Judy: 'Judy',\r\n Julia: 'Julia',\r\n Julio: 'Bulut',\r\n Jumapili: 'Umay',\r\n June: 'Naz',\r\n Juro: 'Efe',\r\n Justin: 'Justin',\r\n },\r\n\r\n compass: {\r\n N: 'N',\r\n S: 'S',\r\n W: 'W',\r\n E: 'E',\r\n },\r\n\r\n month: {\r\n January: 'Jan',\r\n February: 'Feb',\r\n March: 'Mar',\r\n April: 'Apr',\r\n May: 'May',\r\n June: 'Jun',\r\n July: 'Jul',\r\n August: 'Aug',\r\n September: 'Sep',\r\n October: 'Oct',\r\n November: 'Nov',\r\n December: 'Dec',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: 'Search by publisher',\r\n SearchByLabel: 'Search by label',\r\n MyPublishedModels: 'My Published Models',\r\n TotalNumberOfUserPublishedModels: 'Total number of user-published models',\r\n SortFromOldestToNewest: 'Sort from oldest to newest',\r\n SortFromNewestToOldest: 'Sort from newest to oldest',\r\n ModelsFoundOnThisSite: 'models found on this site',\r\n ShowModelsPublishedByThisAuthor: 'Show the models published by this author',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nexport const i18n_ua = {\r\n translation: {\r\n name: {\r\n IFI: 'Інститут Інтелекту Майбутнього',\r\n Aladdin: 'Aladdin',\r\n Tagline: 'Aladdin: Переосмислення Дизайну з Пояснювальним Штучним Інтелектом - Інститут Інтелекту Майбутнього',\r\n },\r\n\r\n cookie: {\r\n Statement:\r\n 'Натиснувши «Прийняти», ви погоджуєтеся з використанням файлів cookie для покращення вашого досвіду з Aladdin.',\r\n Accept: 'Прийняти',\r\n },\r\n\r\n aboutUs: {\r\n ProductBroughtToYouBy: 'Цей Продукт Було Створено:',\r\n TermsOfService: 'Умови Використання',\r\n PrivacyPolicy: 'Політика Конфіденційності',\r\n Software: 'Програмне Забезпечення',\r\n Content: 'Матеріали',\r\n Research: 'Дослідження',\r\n Support: 'Підтримка',\r\n Acknowledgment: 'Подяка',\r\n FundingInformation:\r\n 'Національний Науковий Фонд (ННФ, Cполучені Штати Америки) надав фінансову підтримку для дослідження та розробки цього продукту за допомогою грантів №2105695, №2131097, та №#2301164. Однак, будь-які погляди, результати та висновки, висловлені у продукті, належать авторам і можуть не повністю відображати погляди ННФ.',\r\n Contact: 'Для отримання додаткової інформації, будь ласка, зверніться до Charles Xie (charles@intofuture.org).',\r\n Translators: 'Переклад',\r\n },\r\n\r\n word: {\r\n LastUpdate: 'Last Update',\r\n Small: 'Small',\r\n Medium: 'Medium',\r\n Large: 'Large',\r\n Design: 'Design',\r\n Information: 'Information',\r\n Type: 'Type',\r\n Text: 'Текст',\r\n FontSize: 'Розмір Шрифту',\r\n FontColor: 'Колір Шрифту',\r\n Model: ' Модель',\r\n Models: 'Моделі',\r\n Upload: 'Завантажити',\r\n ClickCount: 'Натисніть Підрахувати',\r\n Share: 'Поділитись',\r\n AlreadyLike: 'Вподобано',\r\n Like: 'Вподобати',\r\n MustLogInToLike: 'Потрібно Увійти, щоб Вподобати',\r\n AllRightsReserved: 'Усі Права Захищено',\r\n MeterAbbreviation: 'м',\r\n Version: 'Версія',\r\n VersionInitial: 'В',\r\n Options: 'Опції',\r\n Maximum: 'Максимум',\r\n Minimum: 'Мінімум',\r\n MaximumNumber: 'Максимальне Число',\r\n MinimumNumber: 'Мінімальне Число',\r\n MaximumValue: 'Максимальне Значення',\r\n MinimumValue: 'Мінімальне Значення',\r\n Or: 'Або',\r\n None: 'Жоден',\r\n High: 'Високий',\r\n Partial: 'Частковий',\r\n Teacher: 'Вчитель',\r\n Class: 'Клас',\r\n Total: 'Всього',\r\n Leaderboard: 'Таблиця Лідерів',\r\n Latest: 'Останнє',\r\n Range: 'Діапазон',\r\n SIUnit: 'SI Одиниця',\r\n USUnit: 'US Одиниця',\r\n ThermalTransmittance: 'Теплопередача',\r\n ThermalResistance: 'Термічний Опір',\r\n UValue: 'U-Значення',\r\n RValue: 'R-Значення',\r\n VolumetricHeatCapacity: \"Об'ємна Теплоємність\",\r\n BuildingHVACSystem: 'Побудова Системи Опалення, Вентиляції та Кондиціювання Повітря (ОВК)',\r\n ThermostatSetpoint: 'Задана Температура Термостата',\r\n TemperatureToleranceThreshold: 'Порогове Значення Допустимого Відхилення Температури',\r\n TemperatureToleranceThresholdExplanation:\r\n 'Обігрівач не працюватиме, якщо найнижча зовнішня температура дня вища за значення отриманe, якщо від заданої температури відняти порогове значення. Кондиціонер не працюватиме, якщо найвища зовнішня температура дня нижча за значення отримане, якщо від заданої температури відняти порогове значення.',\r\n Press: 'Натисніть',\r\n Open: 'Відкрити',\r\n Save: 'Зберегти',\r\n SaveAsImage: 'Зберегти як Зображення',\r\n SaveAsCsv: 'Зберегти як CSV',\r\n Update: 'Оновити',\r\n Paste: 'Вставити',\r\n Copy: 'Копіювати',\r\n Cut: 'Вирізати',\r\n Delete: 'Видалити',\r\n Lock: 'Заблокувати',\r\n Translucent: 'Півпрозорий',\r\n Color: 'Колір',\r\n Texture: 'Текстура',\r\n Size: 'Розмір',\r\n Thickness: 'Товщина',\r\n Yes: 'Так',\r\n No: 'Ні',\r\n OK: 'ОК',\r\n Cancel: 'Скасувати',\r\n Apply: 'Застосувати',\r\n Close: 'Закрити',\r\n ApplyTo: 'Застосувати До',\r\n Run: 'Запустити',\r\n Pause: 'Пауза',\r\n Resume: 'Відновити',\r\n Clear: 'Очистити',\r\n Warning: 'Попередження',\r\n Caution: 'Обережно',\r\n Reminder: 'Нагадування',\r\n Length: 'Довжина',\r\n Width: 'Ширина',\r\n Height: 'Висота',\r\n Radius: 'Радіус',\r\n Angle: 'Кут',\r\n Azimuth: 'Азимут',\r\n Coordinates: 'Координати',\r\n Weather: 'Погода',\r\n Show: 'Показати',\r\n Animate: 'Анімувати',\r\n Date: 'Дата',\r\n Time: 'Час',\r\n Title: 'Заголовок',\r\n Owner: 'Власник',\r\n Action: 'Дія',\r\n Rename: 'Перейменувати',\r\n Location: 'Місцезнаходження',\r\n Latitude: 'Широта',\r\n Month: 'Місяць',\r\n Day: 'День',\r\n Hour: 'Година',\r\n Daylight: 'Денне світло',\r\n Radiation: 'Радіаційне Випромінювання',\r\n Temperature: 'Температура',\r\n kWh: 'кВт-год',\r\n dollar: 'долар',\r\n MeterPerSecond: 'м/с',\r\n NorthInitial: 'Північ',\r\n SouthInitial: 'Південь',\r\n EastInitial: 'Схід',\r\n WestInitial: 'Захід',\r\n Fixed: 'Фіксований',\r\n Elements: 'Елементи',\r\n Energy: 'Енергія',\r\n Unknown: 'Невідомо',\r\n Label: 'Мітка',\r\n Description: 'Опис',\r\n NoDescription: 'Без опису',\r\n MaximumCharacters: 'Максимальна кількість символів',\r\n Author: 'Автор',\r\n Publisher: 'Видавець',\r\n Building: 'Будівля',\r\n ResidentialBuilding: 'Житлова будівля',\r\n CommercialBuilding: 'Комерційна будівля',\r\n SchoolBuilding: 'Шкільна будівля',\r\n TouristAttraction: \"Туристична визначна пам'ятка\",\r\n UnderConstruction: 'В стадії будівництва',\r\n Photovoltaic: 'Фотоелектричний',\r\n Anonymous: 'Анонімний',\r\n Nickname: 'Нікнейм',\r\n Pin: 'Закріпити',\r\n Unpin: 'Відкріпити',\r\n },\r\n\r\n shared: {\r\n NoTexture: 'Без текстури',\r\n FoundationElement: 'Фундамент',\r\n CuboidElement: 'Паралелепіпед',\r\n PolygonElement: 'Багатокутник',\r\n SensorElement: 'Сенсор',\r\n SolarPanelElement: 'Сонячна панель',\r\n WaterHeaterElement: 'Водонагрівач',\r\n ParabolicDishElement: 'Параболічна тарілка',\r\n ParabolicTroughElement: 'Параболічний сонячний колектор',\r\n FresnelReflectorElement: 'Відбивач Френеля',\r\n HeliostatElement: 'Геліостат',\r\n WindTurbineElement: 'Вітрова турбіна',\r\n LightElement: 'Світло',\r\n ElementLocked: 'Заблоковано',\r\n ModelType: 'Тип моделі',\r\n OutputBreakdown: 'Breakdown',\r\n MoreResults: 'More Results',\r\n },\r\n\r\n message: {\r\n ModelNotFound: 'Модель не знайдено',\r\n CannotSignIn: 'Не вдається увійти',\r\n CannotSignOut: 'Не вдається вийти',\r\n YourAccountWasCreated: 'Ваш обліковий запис був створений',\r\n CannotCreateAccount: 'Не вдається створити обліковий запис',\r\n YourAccountSettingsWereSaved: 'Налаштування облікового запису були збережені',\r\n CannotSaveYourAccountSettings: 'Не вдається зберегти налаштування облікового запису',\r\n CannotSaveYourFileToCloud: 'Не вдається зберегти ваш файл у хмарному середовищі',\r\n CannotCreateNewProject: 'Не вдається створити новий проєкт',\r\n CannotCreateNewProjectWithoutTitle: 'Cannot create a new project without a title',\r\n CannotOpenYourProjects: 'Не вдається відкрити ваші проєкти',\r\n CannotOpenProject: 'Cannot open the project',\r\n CannotDeleteProject: 'Cannot delete the project',\r\n CannotRenameProject: 'Cannot rename the project',\r\n CannotAddDesignToProject: 'Cannot add this design to the project',\r\n CannotAddDesignToProjectOwnedByOthers: 'Cannot add this design to a project owned by others',\r\n DesignRemovedFromProject: 'The design was successfully removed from the project',\r\n CannotRemoveDesignFromProject: 'Cannot remove this design from the project',\r\n CannotUpdateProject: 'Cannot update the project',\r\n CannotFetchProjectData: 'Cannot fetch project data',\r\n TitleUsedChooseDifferentOne: 'Ця назва була використана. Виберіть іншу',\r\n CloudFileWithTitleExistsDoYouWantToOverwrite:\r\n 'Хмарний файл з такою ж назвою вже існує. Ви хочете перезаписати його?',\r\n CloudFileNotFound: 'Файл у хмарному середовищі не знайдено',\r\n CannotLoadModelsOnMap: 'Не вдається завантажити моделі на карту',\r\n CannotLoadLeaderboard: 'Не вдається завантажити таблицю лідерів',\r\n CannotPublishModelOnMap: 'Не вдається опублікувати модель на карті',\r\n CannotLikeModelFromMap: 'Не вдається оцінити модель з карти',\r\n CannotDeleteModelFromMap: 'Не вдається видалити модель з карти',\r\n ModelDeletedFromMap: 'Модель видалена з карти',\r\n DoYouWantToDeleteModelFromMap: 'Ви бажаєте видалити модель з карти?',\r\n CannotOpenCloudFile: 'Не вдається відкрити файл у хмарному середовищі',\r\n CannotReadCloudFile: 'Cannot read the cloud file',\r\n CannotWriteCloudFile: 'Cannot write the cloud file',\r\n CloudFileCopied: 'Cloud file copied',\r\n CannotOpenCloudFolder: 'Не вдається відкрити папку у хмарному середовищі',\r\n CannotDeleteCloudFile: 'Не вдається видалити файл у хмарному середовищі',\r\n CannotRenameCloudFile: 'Не вдається перейменувати файл у хмарному середовищі',\r\n DoYouWantToSaveChanges: 'Бажаєте зберегти зміни?',\r\n NotApplicableToSelectedAction: 'Не застосовується до обраної дії',\r\n ThisElementIsLocked: 'Цей елемент заблокований.',\r\n ThisCannotBeUndone: 'Це не можна скасувати.',\r\n AzimuthOfNorthIsZero: 'Азимут півночі дорівнює 0°',\r\n CounterclockwiseAzimuthIsPositive: 'Азимут є позитивним проти годинникової стрілки.',\r\n MoveCancelledBecauseOfOverlap: 'Переміщення скасовано через перекриття.',\r\n MoveOutsideBoundaryCancelled: 'Переміщення за межі скасовано.',\r\n RotationCancelledBecauseOfOverlap: 'Ротацію скасовано через перекриття.',\r\n RotationOutsideBoundaryCancelled: 'Ротація за межі скасована.',\r\n ResizingCancelledBecauseOfOverlap: 'Зміна розміру скасована через перекриття.',\r\n ResizingOutsideBoundaryCancelled: 'Зміна розміру за межі скасована.',\r\n CannotPasteOutsideBoundary: 'Не можна вставити за межі.',\r\n CannotPasteBecauseOfOverlap: 'Не можна вставити через перекриття.',\r\n CannotMoveObjectTooFar: \"Не можна перемістити об'єкт занадто далеко.\",\r\n ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout:\r\n 'Існуючі сонячні панелі будуть видалені перед застосуванням нового макету.',\r\n DoYouWantToContinue: 'Бажаєте продовжити?',\r\n SolarPanelsCannotIntersectWithGround: 'Сонячні панелі не можуть перетинатися з землею.',\r\n SolarPanelsCannotOverlapWithOneAnother: 'Сонячні панелі не можуть накладатися одна на одну.',\r\n ScreenshotSaved: 'Знімок екрана збережено.',\r\n CsvFileSaved: 'CSV файл збережено.',\r\n SimulationStarted: 'Розпочато симуляцію.',\r\n SimulationCompleted: 'Симуляцію завершено.',\r\n SimulationAborted: 'Симуляцію перервано.',\r\n SimulationPaused: 'Симуляцію призупинено.',\r\n CancelSimulation: 'Скасувати симуляцію',\r\n PauseSimulation: 'Призупинити симуляцію',\r\n ResumeSimulation: 'Продовжити симуляцію',\r\n SimulationWillNotStartDueToErrors: 'Симуляція не розпочнеться через помилки',\r\n SimulationWillStartDespiteWarnings: 'Симуляція розпочнеться незважаючи на попередження.',\r\n EvolutionStarted: 'Еволюцію розпочато.',\r\n EvolutionCompleted: 'Еволюцію завершено.',\r\n EvolutionAborted: 'Еволюцію перервано.',\r\n EvolutionPaused: 'Еволюцію призупинено.',\r\n EncounterEvolutionError: 'Сталася помилка еволюції.',\r\n CancelEvolution: 'Скасувати еволюцію',\r\n PauseEvolution: 'Призупинити еволюцію',\r\n ResumeEvolution: 'Продовжити еволюцію',\r\n ConvergenceThresholdHasBeenReached: 'Досягнуто порогове значення збіжності.',\r\n MaximumNumberOfGenerationsHasBeenReached: 'Досягнуто максимальну кількість поколінь.',\r\n MaximumNumberOfStepsHasBeenReached: 'Досягнуто максимальну кількість кроків.',\r\n ObjectiveFunctionTypeError:\r\n 'Поточна цільова функція не підтримується цією операцією. Будь ласка, розпочніть з меню.',\r\n WallsAreNotAtSameHeight: 'Стіни не знаходяться на однаковій висоті.',\r\n WallsAreNotPerpendicular: 'Стіни не перпендикулярні.',\r\n WallsAreNotConnected: \"Стіни не з'єднані.\",\r\n WallsNumberNeedToBeFour: 'Кількість стін має дорівнювати чотири.',\r\n BuildingContainsEmptyWall: 'Будівля містить одну або кілька порожніх стін.',\r\n BuildingRoofMissing: 'У будівлі відсутній дах.',\r\n UnknownErrors: 'Невідомі помилки.',\r\n },\r\n\r\n menu: {\r\n AnalysisOptions: 'Опції аналізу',\r\n option: {\r\n GridCellSize: 'Розмір комірки сітки',\r\n SamplingFrequency: 'Частота вибірки',\r\n TimesPerHour: 'Разів на годину',\r\n DaysPerYear: 'Днів на рік',\r\n },\r\n mainMenu: 'Головне Меню',\r\n cloudMenu: 'Меню Хмарного Середовища',\r\n projectSubMenu: 'Проєкт',\r\n project: {\r\n CreateNewProject: 'Створити Новий Проєкт',\r\n OpenProject: 'Відкрити Проєкт',\r\n SaveProjectAs: 'Save Project As',\r\n YouMustLogInToCreateProject: 'Ви повинні увійти, щоб створити новий проєкт',\r\n YouMustLogInToOpenProject: 'Ви повинні увійти, щоб відкрити проєкт',\r\n },\r\n fileSubMenu: 'Файл',\r\n file: {\r\n CreateNewFile: 'Створити новий',\r\n OpenLocalFile: 'Відкрити локально',\r\n SaveAsLocalFile: 'Зберегти як',\r\n SavingAbortedMustHaveValidFileName: \"Збереження перервано! Вам потрібно мати дійсне ім'я файлу\",\r\n OpenCloudFile: 'Відкрити у хмарному середовищі',\r\n SaveCloudFile: 'Зберегти у хмарному середовищі',\r\n SaveAsCloudFile: 'Зберегти у хмарному середовищі',\r\n SavingAbortedMustHaveValidTitle: 'Збереження перервано! Вам потрібно мати дійсний заголовок для хмарного файлу',\r\n ToSaveYourWorkPleaseSignIn: 'Щоб зберегти вашу роботу, будь ласка, увійдіть в систему.',\r\n TakeScreenshot: 'Зробити знімок екрана',\r\n UseCloudFileName: \"Використовувати ім'я файлу у хмарному середовищі\",\r\n PublishOnModelsMap: 'Опублікувати на карті моделей',\r\n PublishedOnModelsMap: 'Вашу модель було опубліковано на карті моделей',\r\n UpdatedOnModelsMap: 'Ваша модель була оновлена на карті моделей',\r\n YouMustLogInToPublishYourModel: 'Вам потрібно увійти в систему, щоб опублікувати свою модель',\r\n YouCannotPublishAModelThatYouDoNotOwn: 'Ви не можете опублікувати модель, якою не володієте',\r\n YouMustSaveModelOnCloudBeforePublishingIt:\r\n 'Вам потрібно зберегти модель у хмарному середовищі перед її публікацією',\r\n },\r\n editSubMenu: 'Редагувати',\r\n edit: {\r\n Undo: 'Скасувати',\r\n Redo: 'Повторити',\r\n },\r\n viewSubMenu: 'Перегляд',\r\n view: {\r\n NavigationView: 'Navigation View',\r\n TwoDimensionalView: '2D Вигляд',\r\n ResetView: 'Скинути',\r\n ZoomIn: 'Збільшити масштаб',\r\n ZoomOut: 'Зменшити масштаб',\r\n AutoRotate: 'Автоматичний поворот',\r\n ShowShadow: 'Показати тінь',\r\n ShowSurfaceShininess: 'Показати блиск поверхні',\r\n TranslucentFloatingWindows: 'Напівпрозорі плаваючі вікна',\r\n accessoriesSubMenu: 'Додаткові елементи',\r\n accessories: {\r\n SiteInformation: 'Інформація про місце',\r\n DesignInformation: 'Інформація про дизайн',\r\n Instruction: 'Інструкція',\r\n StickyNote: 'Примітка',\r\n Note: 'Примітка',\r\n },\r\n },\r\n settingsSubMenu: 'Налаштування',\r\n settings: {\r\n WeatherData: 'Дані про погоду',\r\n DiurnalTemperature: 'Добова температура',\r\n Heliodon: 'Геліодон',\r\n SunAndTime: 'Сонце та час',\r\n },\r\n benchmarksSubMenu: 'Бенчмарки',\r\n benchmarks: {\r\n SolarRadiationPredictionVsMeasurement: 'Прогнозування сонячної радіації порівняно з вимірюванням',\r\n BESTESTCase600: 'Тестування енергоефективності будівель: BESTEST Case 600',\r\n BESTESTCase610: 'Тестування енергоефективності будівель: BESTEST Case 610',\r\n BESTESTCase620: 'Тестування енергоефективності будівель: BESTEST Case 620',\r\n BESTESTCase630: 'Тестування енергоефективності будівель: BESTEST Case 630',\r\n },\r\n graph: {\r\n LineWidth: 'Товщина лінії',\r\n SymbolSize: 'Розмір символу',\r\n BarCategoryGap: 'Відступ категорій стовпців',\r\n ShowHorizontalGridLines: 'Показати горизонтальні лінії сітки',\r\n ShowVerticalGridLines: 'Показати вертикальні лінії сітки',\r\n },\r\n analysisSubMenu: 'Аналіз',\r\n physicsSubMenu: 'Фізика',\r\n physics: {\r\n DailySolarRadiationHeatmap: 'Щоденна карта сонячної радіації',\r\n SolarRadiationHeatmapOptions: 'Параметри карти сонячної радіації',\r\n SolarRadiationHeatmapGridCellSize: 'Розмір комірки на карті сонячної радіації',\r\n SolarRadiationHeatmapMaxValue: 'Максимальне значення на карті',\r\n SolarRadiationHeatmapNoAnimation: 'Немає анімації для статичної моделі',\r\n ReflectionHeatmap: 'Карта відображень',\r\n },\r\n sensorSubMenu: 'Датчик',\r\n sensor: {\r\n CollectDailyData: 'Збирати щоденні дані',\r\n CollectYearlyData: 'Збирати щорічні дані',\r\n SensorSimulationNoAnimation: 'Немає анімації для збору даних датчика',\r\n },\r\n buildingSubMenu: 'Будівля',\r\n building: {\r\n AnalyzeDailyBuildingEnergy: 'Аналізувати щоденну енергію будівлі',\r\n AnalyzeYearlyBuildingEnergy: 'Аналізувати щорічну енергію будівлі',\r\n EnergyAnalysisOptions: 'Параметри аналізу енергії',\r\n EnergyGridCellSize: 'Розмір комірки сітки',\r\n BuildingEnergySimulationNoAnimation: 'Немає анімації симулювати енергію будівлі',\r\n },\r\n solarPanelSubMenu: 'Сонячна панель',\r\n solarPanel: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n AnalyzeVisibility: 'Аналізувати видимість',\r\n PanelDiscretization: 'Дискретизація панелі',\r\n Exact: 'Точний',\r\n Approximate: 'Наближений',\r\n EnergyGridCellSize: 'Розмір комірки сітки енергії',\r\n VisibilityGridCellSize: 'Розмір комірки сітки коефіцієнта видимості',\r\n EnergyAnalysisOptions: 'Параметри аналізу енергії',\r\n VisibilityAnalysisOptions: 'Параметри аналізу видимості',\r\n SolarPanelSimulationNoAnimation: 'Немає анімації для симуляції сонячної панелі',\r\n },\r\n parabolicTroughSubMenu: 'Параболічний сонячний колектор',\r\n parabolicTrough: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n },\r\n parabolicDishSubMenu: 'Параболічний диск',\r\n parabolicDish: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n },\r\n fresnelReflectorSubMenu: 'Відбивач Френеля',\r\n fresnelReflector: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n },\r\n heliostatSubMenu: 'Геліостат',\r\n heliostat: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n },\r\n solarUpdraftTowerSubMenu: 'Сонячна вежа з використаним повітрям',\r\n solarUpdraftTower: {\r\n AnalyzeDailyYield: 'Аналізувати щоденний дохід',\r\n AnalyzeYearlyYield: 'Аналізувати щорічний дохід',\r\n SolarUpdraftTowerSimulationNoAnimation: 'Немає анімації симулювати сонячну вежу з використаним повітрям',\r\n },\r\n\r\n tutorialsSubMenu: 'Посібники',\r\n\r\n solarEnergyScienceSubMenu: 'Сонячна наука',\r\n solarEnergyScienceTutorials: {\r\n SunAngles: 'Кути сонця відносно спостерігача на землі',\r\n InsolationAndClimate: 'Інсоляція та клімат',\r\n SolarRadiationToBox: 'Сонячна радіація в коробку',\r\n },\r\n\r\n buildingScienceSubMenu: 'Наука про будівлі',\r\n buildingScienceTutorials: {\r\n ThermalEnvelopeVsBuildingEnvelope: 'Теплозахисна оболонка проти будівельної оболонки',\r\n EffectOfSizeOnBuildingEnergy: 'Вплив розміру на енергію будівлі',\r\n EffectOfOrientationOnBuildingEnergy: 'Вплив орієнтації на енергію будівлі',\r\n EffectOfInsulationOnBuildingEnergy: 'Вплив інсоляції на енергію будівлі',\r\n EffectOfRoofColorOnBuildingEnergy: 'Вплив кольору даху на енергію будівлі',\r\n EffectOfEavesOverhangLengthOnBuildingEnergy: 'Вплив довжини виступу карнизу на енергію будівлі',\r\n EffectOfWindowSHGCOnBuildingEnergy: 'Вплив коефіцієнта сонячного теплозиску вікна на енергію будівлі',\r\n EffectOfThermostatSetpointOnBuildingEnergy: 'Вплив заданої температури на термостаті на енергію будівлі',\r\n EffectOfSolarPanelsOnBuildingEnergy: 'Вплив сонячних панелей на енергію будівлі',\r\n EffectOfGroundTemperatureOnBuildingEnergy: 'Вплив температури грунту на енергію будівлі',\r\n EffectOfTreesOnBuildingEnergy: 'Вплив дерев на енергію будівлі',\r\n },\r\n\r\n buildingDesignSubMenu: 'Дизайн будівлі',\r\n buildingDesignTutorials: {\r\n CapeCodStyleHouseWithShedDormer: 'Будинок у стилі Кейп Код з пристроєм типу \"шед-дормер\"',\r\n MansardRoofWithDormers: 'Мансарда з горизонтальними пристроями',\r\n GableRoofVsHipRoof: 'Схиловий дах проти двосхилих дахів',\r\n ColonialVsSaltbox: 'Колоніальний стиль проти стилю Saltbox',\r\n GambrelRoofVsMansardRoof: 'Півшаровий дах проти мансардного даху',\r\n CombinationRoofVsBonnetRoof: 'Комбінований дах проти капотного даху',\r\n DutchGableRoof: 'Голландський дах з рикетом',\r\n GableAndValleyRoof: 'Схиловий та долинний дах',\r\n ClerestoryRoof: 'Клересторний дах',\r\n MonitorRoof: 'Моніторний дах',\r\n AFrameHouse: 'Будинок у формі літери \"А\"',\r\n HalfTimberedHouse: \"Будинок з напівдерев'яними стінами\",\r\n AllBasicRoofTypes: 'Усі основні типи дахів',\r\n },\r\n\r\n photovoltaicSolarPowerSubMenu: 'Фотоелектрична сонячна енергія',\r\n photovoltaicSolarPowerTutorials: {\r\n EffectOfTiltAngleOfSolarPanel: 'Вплив кута нахилу сонячної панелі',\r\n EffectOfAzimuthOfSolarPanel: 'Вплив азимуту сонячної панелі',\r\n SolarPanelTypes: 'Типи сонячних панелей',\r\n VerticalBifacialSolarPanels: 'Vertical Bifacial Solar Panels',\r\n CompareMonofacialAndBifacialSolarPanels: 'Monofacial vs. Bifacial Solar Panels',\r\n SolarTrackers: 'Сонячні трекери',\r\n CoveringGroundWithSolarPanels: 'Чому просто покриття землі сонячними панелями - не найкраща ідея',\r\n InterRowSpacingOfSolarPanelArray: 'Вплив міжрядного простору в масиві сонячних панелей',\r\n EffectOfOrientationOfSolarPanels: 'Вплив орієнтації сонячних панелей',\r\n SolarPanelArrayAutomaticLayout: 'Автоматичне розміщення масиву сонячних панелей',\r\n },\r\n\r\n concentratedSolarPowerSubMenu: 'Концентрована сонячна енергія',\r\n concentratedSolarPowerTutorials: {\r\n EffectOfAzimuthOfParabolicTrough: 'Вплив азимуту параболічного сонячного колектора',\r\n EffectOfLatusRectumOfParabolicTrough: 'Вплив прямої лінії на параболічний сонячний колектор',\r\n FocusSunlightWithParabolicDish: 'Фокусування сонячного світла за допомогою параболічного диску',\r\n LinearFresnelReflectors: 'Лінійні відбивачі Френеля',\r\n EffectOfAbsorberPipeHeightForLinearFresnelReflectors:\r\n 'Вплив висоти поглинаючої трубки на лінійні відбивачі Френеля',\r\n EffectOfAzimuthOfLinearFresnelReflectors: 'Вплив азимуту на лінійні відбивачі Френеля',\r\n LinearFresnelReflectorsWithTwoAbsorbers: 'Лінійні відбивачі Френеля з двома поглинаючими елементами',\r\n CosineEfficiencyOfHeliostats: 'Косинусна ефективність геліостатів',\r\n ShadowingAndBlockingOfHeliostats: 'Затінення та блокування геліостатів',\r\n EffectSolarPowerTowerHeight: 'Вплив висоти сонячної вежі з використаним повітрям',\r\n SolarPowerTower: 'Сонячна вежа з використаним повітрям',\r\n },\r\n\r\n otherTypesOfSolarPowerSubMenu: 'Інші типи сонячної енергії',\r\n otherTypesOfSolarPowerTutorials: {\r\n SolarUpdraftTower: 'Сонячна вежа з використаним повітрям',\r\n },\r\n\r\n generativeDesignSubMenu: 'Generative Design',\r\n generativeDesignTutorials: {\r\n MonofacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Monofacial Solar Panel Array',\r\n BifacialSolarPanelArrayTiltAngle: 'The Tilt Angle of a Bifacial Solar Panel Array',\r\n OutputOfSolarPanelArrayInDifferentPlaces: 'The Output of a Solar Panel Array in Different Places',\r\n SimpleSolarFarmParetoFront: 'The Pareto Front for Designing a Simple Solar Farm',\r\n },\r\n\r\n examplesSubMenu: 'Приклади',\r\n\r\n solarEnergySubMenu: 'Сонячна енергія',\r\n solarEnergyExamples: {\r\n SunBeamAndHeliodon: 'Промінь сонця та геліодон',\r\n RooftopSolarPanels: 'Сонячні панелі на даху',\r\n NevadaSolarOneParabolicTroughArray: 'Масив параболічних сонячних колекторів Nevada Solar One',\r\n TooeleParabolicDishArray: 'Масив параболічних тарілок Tooele',\r\n PS10SolarPowerTower: 'Сонячна енергетична вежа PS10',\r\n TucsonLinearFresnelReflectors: 'Лінійні відбивачі Френеля в Tucson',\r\n SolarCanopyFormFactors: 'Форми сонячних козирків',\r\n SolarCanopyOverBleachers: 'Сонячний козирок над трибунами',\r\n SolarCanopyOverGarage: 'Сонячний козирок над гаражем',\r\n SolarBusStop: 'Сонячна автобусна зупинка',\r\n SolarFacadeTesla: 'Сонячна фасадна панель Tesla',\r\n BuildingIntegratedPhotovoltaics: 'Вбудовані фотоелектричні системи в будівлі',\r\n Floatovoltaics: 'Сонячні панелі на плавучих платформах',\r\n Agrivoltaics: 'Агровольтаїка',\r\n VegetativeBuffer: 'Вегетативна зона',\r\n RainbowSwashSolarFarmBostonMA: 'Сонячна ферма Rainbow Swash в Boston, MA',\r\n MickeyMouseSolarFarmOrlandoFL: 'Сонячна ферма Міккі Мауса в Orlando, FL',\r\n SolarPanelsOverCanalBakersfieldCA: 'Сонячні панелі над каналом в Bakersfield, CA',\r\n SolarNoiseBarrierLexingtonMA: \"Сонячний шумовий бар'єр в Lexington, MA\",\r\n HSATSolarTrackersRaleighNC: 'Сонячні трекери з горизонтальною віссю в Raleign, NC',\r\n AADATSolarTrackersLancasterCA: 'Сонячні трекери з азимутальною-вертикальною віссю в Lancaster, CA',\r\n SolarUpdraftTowerInCity: 'Сонячна вежа з використаним повітрям у місті',\r\n },\r\n\r\n builtEnvironmentSubMenu: 'Забудоване середовище',\r\n residentialBuildingsSubMenu: 'Житлові будівлі',\r\n residentialBuildingExamples: {\r\n ColonialHouse: 'Колоніальний будинок',\r\n DutchColonialHouse: 'Голландський колоніальний будинок',\r\n TShapedHouse: 'Будинок у формі літери Т',\r\n CapeCodHouseWithGarage: 'Будинок у стилі Cape Cod з гаражем',\r\n Solarium: 'Солярій',\r\n Church1: 'Церква 1',\r\n Cathedral1: 'Собор 1',\r\n Cathedral2: 'Собор 2',\r\n Mosque1: 'Мечеть 1',\r\n AdobeTaosHouse: 'Будинок з адобе в стилі Taos',\r\n RanchHouse: 'Ranch House',\r\n BonnetHouse: 'Будинок в стилі Bonnet',\r\n BarnStyleHouse: 'Будинок у стилі амбара',\r\n ModernHouse: 'Сучасний будинок',\r\n ButterflyRoofHouse: 'Будинок з метеликовим дахом',\r\n },\r\n commercialBuildingsSubMenu: 'Комерційні будівлі',\r\n commercialBuildingExamples: {\r\n WhiteHouse: 'Білий Дім',\r\n BilimMersinTurkiye: 'Bilim, Mersin, Туреччина',\r\n SpanishStyleHotel: 'Готель в іспанському стилі',\r\n ApartmentBuilding: 'Багатоквартирний будинок',\r\n OfficeBuilding: 'Офісна будівля',\r\n Hotel: 'Готель',\r\n },\r\n buildingComplexesSubMenu: 'Будівельні комплекси',\r\n buildingComplexExamples: {\r\n SouthBurlingtonHighSchoolVermont: 'South Burlington High School, Vermont',\r\n MescaleroApacheSchoolNewMexico: 'Mescalero Apache School, New Mexico',\r\n },\r\n urbanPlanningSubMenu: 'Міське планування',\r\n urbanPlanningExamples: {\r\n Heatmap1: 'Теплова карта',\r\n },\r\n otherBuildingsSubMenu: 'Інші будівлі',\r\n otherBuildingExamples: {\r\n Greenhouse: 'Теплиця',\r\n Pavilion: 'Павільйон у парку',\r\n OctagonalPagoda: 'Восьмикутна пагода',\r\n OceanFront: 'Будівля біля океану',\r\n EgyptianPyramids: 'Єгипетські піраміди',\r\n MayanPyramid: 'Піраміда Мая',\r\n SiOSePol: 'Si-O-Se-Pol',\r\n StackedCuboids: 'Стековані кубоїди',\r\n },\r\n\r\n artificialIntelligenceSubMenu: 'Штучний інтелект',\r\n artificialIntelligenceExamples: {\r\n OptimizingTiltAngleOfOneSolarPanelRow: 'Оптимізація кута нахилу одного ряду сонячних панелей',\r\n OptimizingTiltAnglesOfMultipleSolarPanelRows: 'Оптимізація кутів нахилу декількох рядів сонячних панелей',\r\n SolarFarmGenerativeDesign: 'Генеративний дизайн сонячної ферми',\r\n SolarFarmGenerativeDesignWithBlock: 'Генеративний дизайн сонячної ферми в присутності перешкоди',\r\n FitchburgSolarFarmGenerativeDesign: 'Генеративний дизайн сонячної ферми у Fitchburg',\r\n },\r\n languageSubMenu: 'Мова',\r\n publicSubMenu: 'Загальнодоступно',\r\n ModelsGallery: 'Галерея моделей',\r\n ModelsMap: 'Карта моделей',\r\n AboutUs: 'Про нас',\r\n },\r\n\r\n avatarMenu: {\r\n AccountSettings: 'Налаштування облікового запису',\r\n PrivacyStatementTitle: 'User Privacy Protection Statement',\r\n PrivacyStatement:\r\n \"Коли ви увійдете, ваш Google ID використовується для створення та доступу до вашого облікового запису Aladdin. В нашій базі даних зберігається лише випадковий алфавітно-цифровий рядок як посилання. Ми ніколи не збираємо особисто ідентифіковану інформацію, таку як ваше ім'я або електронна пошта. Для отримання додаткової інформації ознайомтесь з нашою \",\r\n SignIn: 'Увійти',\r\n SignOut: 'Вийти',\r\n IfYouAreAStudent: 'Якщо ви студент',\r\n },\r\n\r\n skyMenu: {\r\n Axes: 'Вісі',\r\n Theme: 'Тематика',\r\n ThemeDefault: 'За замовчуванням',\r\n ThemeDesert: 'Пустеля',\r\n ThemeDune: 'Дюна',\r\n ThemeForest: 'Ліс',\r\n ThemeGrassland: 'Степ',\r\n ThemeHill: 'Пагорб',\r\n ThemeLake: 'Озеро',\r\n ThemeMountain: 'Гора',\r\n ThemeRural: 'Сільська місцевість',\r\n SunlightAttenuationCoefficientInAir: 'Коефіцієнт затухання сонячного світла у повітрі',\r\n ConvectiveCoefficientOfAir: 'Коефіцієнт конвекції повітря',\r\n HighestTemperatureTimeInMinutes: 'Час найвищої температури (хвилини)',\r\n SelectSunAnglesToShow: 'Виберіть кути сонця, які показати',\r\n ShowAzimuthAngle: 'Показати азимутний кут',\r\n ShowElevationAngle: 'Показати висотний кут',\r\n ShowZenithAngle: 'Показати зенітний кут',\r\n DirectLightBrightnessAtNoon: 'Direct Light Brightness at Noon',\r\n AmbientLightBrightnessAtNoon: 'Ambient Light Brightness at Noon',\r\n },\r\n\r\n groundMenu: {\r\n MonthlyIrradianceLoss: 'Monthly Irradiance Loss',\r\n Vegetation: 'Рослинність',\r\n LeafOutDay: 'День розпускання листя',\r\n LeafOffDay: 'День опадання листя',\r\n Albedo: 'Альбедо',\r\n ImageOnGround: 'Зображення на поверхні',\r\n WaterSurface: 'Поверхня води',\r\n RemoveAllUnlockedTrees: 'Видалити всі розблоковані дерева',\r\n RemoveAllUnlockedFlowers: 'Видалити всі розблоковані квіти',\r\n RemoveAllUnlockedSolarPanels: 'Remove All Unlocked Solar Panels',\r\n RemoveAllUnlockedPeople: 'Видалити всіх розблокованих людей',\r\n RemoveAllUnlockedFoundations: 'Видалити всі розблоковані фундаменти',\r\n RemoveAllUnlockedCuboids: 'Видалити всі розблоковані кубоїди',\r\n DoYouReallyWantToRemoveAllPeople: 'Ви дійсно хочете видалити всіх людей, що не заблоковані',\r\n DoYouReallyWantToRemoveAllTrees: 'Ви дійсно хочете видалити всі дерева, що не заблоковані',\r\n DoYouReallyWantToRemoveAllFlowers: 'Ви дійсно хочете видалити всі квіти, що не заблоковані',\r\n DoYouReallyWantToRemoveAllSolarPanels: 'Do you really want to remove all the solar panels that are not locked',\r\n DoYouReallyWantToRemoveAllFoundations: 'Ви дійсно хочете видалити всі фундаменти, що не заблоковані',\r\n DoYouReallyWantToRemoveAllCuboids: 'Ви дійсно хочете видалити всі кубоїди, що не заблоковані',\r\n LockAllElements: 'Заблокувати всі елементи',\r\n UnlockAllElements: 'Розблокувати всі елементи',\r\n },\r\n\r\n labelSubMenu: {\r\n Label: 'Мітка',\r\n LabelText: 'Текст мітки',\r\n LabelHeight: 'Висота мітки',\r\n LabelSize: 'Розмір мітки',\r\n LabelFontSize: 'Розмір шрифту',\r\n LabelColor: 'Колір мітки',\r\n KeepShowingLabel: 'Залишати видимою мітку',\r\n },\r\n\r\n foundationMenu: {\r\n RemoveAllUnlockedSolarPanels: 'Видалити всі незаблоковані сонячні панелі',\r\n RemoveAllUnlockedParabolicTroughs: 'Видалити всі незаблоковані параболічні сонячні колектори',\r\n RemoveAllUnlockedParabolicDishes: 'Видалити всі незаблоковані параболічні антени',\r\n RemoveAllUnlockedFresnelReflectors: 'Видалити всі незаблоковані відбивачі Френеля',\r\n RemoveAllUnlockedHeliostats: 'Видалити всі незаблоковані геліостати',\r\n RemoveAllUnlockedSensors: 'Видалити всі незаблоковані датчики',\r\n RemoveAllUnlockedLights: 'Видалити всі незаблоковані освітлювальні прилади',\r\n RemoveAllUnlockedWalls: 'Видалити всі незаблоковані стіни',\r\n RemoveAllUnlockedWindows: 'Видалити всі незаблоковані вікна',\r\n RemoveAllUnlockedDoors: 'Видалити всі незаблоковані двері',\r\n RemoveAllUnlockedPolygons: 'Видалити всі незаблоковані полігони',\r\n RemoveAllUnlockedHumans: 'Видалити всіх незаблокованих людей',\r\n RemoveAllUnlockedTrees: 'Видалити всі незаблоковані дерева',\r\n RemoveAllUnlockedFlowers: 'Видалити всі незаблоковані квіти',\r\n Racks: 'Стелажі',\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n SolarPanels: 'Сонячні панелі',\r\n SolarPanelArray: 'Solar Panel Array',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому фундаменті, які не є заблокованими',\r\n ParabolicTroughs: 'Параболічні сонячні колектори',\r\n DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі параболічні сонячні колектори на цьому фундаменті, які не є заблокованими',\r\n ParabolicDishes: 'Параболічні антени',\r\n DoYouReallyWantToRemoveAllParabolicDishesOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі параболічні антени на цьому фундаменті, які не є заблокованими',\r\n FresnelReflectors: 'Відбивачі Френеля',\r\n DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі відбивачі Френеля на цьому фундаменті, які не є заблокованими',\r\n Heliostats: 'Геліостати',\r\n DoYouReallyWantToRemoveAllHeliostatsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі геліостати на цьому фундаменті, які не є заблокованими',\r\n Sensors: 'Датчики',\r\n DoYouReallyWantToRemoveAllSensorsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі датчики на цьому фундаменті, які не є заблокованими',\r\n Lights: 'Світильники',\r\n DoYouReallyWantToRemoveAllLightsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі світильники на цьому фундаменті, які не є заблокованими',\r\n Walls: 'Стіни',\r\n DoYouReallyWantToRemoveAllWallsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі стіни на цьому фундаменті, які не є заблокованими',\r\n Windows: 'Вікна',\r\n DoYouReallyWantToRemoveAllWindowsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі вікна на цьому фундаменті, які не є заблокованими',\r\n Doors: 'Двері',\r\n DoYouReallyWantToRemoveAllDoorsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі двері на цьому фундаменті, які не є заблокованими',\r\n Polygons: 'Багатокутники',\r\n DoYouReallyWantToRemoveAllPolygonsOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі багатокутники на цьому фундаменті, які не є заблокованими',\r\n Humans: 'Люди',\r\n DoYouReallyWantToRemoveAllHumansOnFoundation:\r\n 'Ви дійсно бажаєте видалити всіх людей на цьому фундаменті, які не є заблокованими',\r\n Trees: 'Дерева',\r\n DoYouReallyWantToRemoveAllTreesOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі дерева на цьому фундаменті, які не є заблокованими',\r\n Flowers: 'Квіти',\r\n DoYouReallyWantToRemoveAllFlowersOnFoundation:\r\n 'Ви дійсно бажаєте видалити всі квіти на цьому фундаменті, які не є заблокованими',\r\n OnlyThisFoundation: 'Тільки цей фундамент',\r\n AllConnectedFoundations: 'Всі пов’язані фундаменти',\r\n AllSelectedFoundations: 'All Selected Foundations',\r\n AllFoundations: 'Всі фундаменти',\r\n AddPolygon: 'Додати багатокутник',\r\n SolarStructure: 'Вибрати сонячну структуру',\r\n GroupMaster: 'Груповий майстер',\r\n LockAllElementsOnThisFoundation: 'Заблокувати всі елементи на цьому фундаменті',\r\n UnlockAllElementsOnThisFoundation: 'Розблокувати всі елементи на цьому фундаменті',\r\n GroundFloorRValue: 'Теплопровідність перекриття цокольного поверху',\r\n OnlyThisGroundFloor: 'Тільки цокольний поверх',\r\n AllGroundFloors: 'Всі цокольні поверхи',\r\n },\r\n\r\n solarPowerTowerMenu: {\r\n ReceiverTowerForHeliostats: 'Вежа приймача для геліостатів',\r\n ReceiverTowerPhysicalProperties: 'Фізичні властивості вежі приймача',\r\n ReceiverTowerHeight: 'Висота вежі приймача',\r\n ReceiverTowerRadius: 'Радіус вежі приймача',\r\n ReceiverAbsorptance: 'Поглинання приймача',\r\n ReceiverOpticalEfficiency: 'Оптична ефективність приймача',\r\n ReceiverThermalEfficiency: 'Теплова ефективність приймача',\r\n },\r\n\r\n solarAbsorberPipeMenu: {\r\n AbsorberPipeForFresnelReflectors: 'Трубопровід для відбивачів Френеля',\r\n AbsorberPipePhysicalProperties: 'Фізичні властивості трубопроводу поглинання',\r\n AbsorberHeight: 'Висота трубопроводу поглинання',\r\n AbsorberApertureWidth: 'Ширина отвору трубопроводу поглинання',\r\n AbsorberPipePoleNumber: 'Кількість полюсів для трубопроводу поглинання',\r\n AbsorberAbsorptance: 'Сила поглинання',\r\n AbsorberOpticalEfficiency: 'Оптична ефективність поглинача',\r\n AbsorberThermalEfficiency: 'Теплова ефективність поглинача',\r\n },\r\n\r\n solarUpdraftTowerMenu: {\r\n SolarUpdraftTower: 'Сонячна вежа з тяговим потоком',\r\n SolarUpdraftTowerPhysicalProperties: 'Фізичні властивості сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerChimneyHeight: 'Висота димової труби сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerChimneyRadius: 'Радіус димової труби сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerCollectorHeight: 'Висота колектора сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerCollectorRadius: 'Радіус колектора сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerCollectorTransmissivity: 'Проникність колектора сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerCollectorEmissivity: 'Випромінюваність колектора сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerDischargeCoefficient: 'Коефіцієнт викиду сонячної вежі з тяговим потоком',\r\n SolarUpdraftTowerTurbineEfficiency: 'Ефективність турбіни сонячної вежі з тяговим потоком',\r\n },\r\n\r\n cuboidMenu: {\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\r\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані сенсори',\r\n RemoveAllUnlockedPolygons: 'Видалити всі розблоковані полігони',\r\n RemoveAllUnlockedHumans: 'Видалити всіх розблокованих людей',\r\n RemoveAllUnlockedTrees: 'Видалити всі розблоковані дерева',\r\n RemoveAllUnlockedFlowers: 'Видалити всі розблоковані квіти',\r\n Racks: 'Стійки',\r\n SolarPanels: 'Сонячні панелі',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому кубоїді, які не заблоковані',\r\n Sensors: 'Сенсори',\r\n DoYouReallyWantToRemoveAllSensorsOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі сенсори на цьому кубоїді, які не заблоковані',\r\n Polygons: 'Полігони',\r\n DoYouReallyWantToRemoveAllPolygonsOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі полігони на цьому кубоїді, які не заблоковані',\r\n Humans: 'Люди',\r\n DoYouReallyWantToRemoveAllHumansOnCuboid:\r\n 'Ви дійсно бажаєте видалити всіх людей на цьому кубоїді, які не заблоковані',\r\n Trees: 'Дерева',\r\n DoYouReallyWantToRemoveAllTreesOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі дерева на цьому кубоїді, які не заблоковані',\r\n Flowers: 'Квіти',\r\n DoYouReallyWantToRemoveAllFlowersOnCuboid:\r\n 'Ви дійсно бажаєте видалити всі квіти на цьому кубоїді, які не заблоковані',\r\n OnlyThisCuboid: 'Тільки цей кубоїд',\r\n AllCuboidsOnSameSurface: 'Усі кубоїди на одній поверхні',\r\n AllCuboidsAboveSameBase: 'Усі кубоїди над тією ж основою',\r\n AllSelectedCuboids: 'All Selected Cuboids',\r\n AllCuboids: 'Всі кубоїди',\r\n OnlyThisSide: 'Тільки ця сторона',\r\n AllSidesOfThisCuboid: 'Всі сторони цього кубоїда',\r\n AllSidesOfSelectedCuboids: 'All Sides of Selected Cuboids',\r\n AllSidesOfAllCuboids: 'Всі сторони всіх кубоїдів',\r\n AddPolygon: 'Додати полігон',\r\n Stackable: 'Стекабельне',\r\n GroupMaster: 'Майстер групи',\r\n },\r\n\r\n polygonMenu: {\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n TextBox: 'Текстове поле',\r\n FontOutlineColor: 'Колір контуру шрифту',\r\n FontOutlineWidth: 'Товщина контуру шрифту',\r\n FontStrokeColor: 'Колір обводки шрифту',\r\n FontStrokeWidth: 'Товщина обводки шрифту',\r\n NoOutline: 'Без контуру',\r\n Shiny: 'Блискучий',\r\n Filled: 'Заповнений',\r\n FillTexture: 'Текстура заповнення',\r\n FillColor: 'Колір заповнення',\r\n Opacity: 'Прозорість',\r\n LineColor: 'Колір лінії',\r\n LineWidth: 'Товщина лінії',\r\n LineStyle: 'Стиль лінії',\r\n SolidLine: 'Суцільна лінія',\r\n DashedLine: 'Пунктирна лінія',\r\n DottedLine: 'Точкова лінія',\r\n InsertVertexBeforeIndex: 'Вставити вершину перед індексом',\r\n InsertVertexAfterIndex: 'Вставити вершину після індексу',\r\n DeleteVertex: 'Видалити вершину',\r\n OnlyThisPolygon: 'Тільки цей полігон',\r\n AllPolygonsOnSurface: 'Всі полігони на цій поверхні',\r\n AllPolygonsAboveFoundation: 'Всі полігони вище фундаменту',\r\n AllSelectedPolygons: 'All Selected Polygons',\r\n AllPolygons: 'Всі полігони',\r\n Layout: 'Розташування',\r\n SolarPanelArrayLayout: 'Розташування сонячних панелей',\r\n SolarPanelArrayLayoutParametricDesign: 'Розташування сонячних панелей: параметричний дизайн',\r\n SolarPanelArrayLayoutGenerativeDesign: 'Розташування сонячних панелей: генеративний дизайн',\r\n SolarPanelArrayModel: 'Модель сонячної панелі',\r\n SolarPanelArrayOrientation: 'Орієнтація',\r\n SolarPanelArrayTiltAngle: 'Кут нахилу',\r\n SolarPanelArrayRowWidth: 'Ширина ряду',\r\n SolarPanelArrayInterRowSpacing: 'Міжрядковий інтервал',\r\n SolarPanelArrayRowSpacing: 'Row Spacing',\r\n SolarPanelArrayRowAxis: 'Вісь ряду',\r\n SolarPanelArrayLeftRightRowAxis: 'Наліво-Направо (відносне)',\r\n SolarPanelArrayUpDownRowAxis: 'Вгору-Вниз (відносне)',\r\n SolarPanelArrayEastWestRowAxis: 'Схід-Захід (абсолютне)',\r\n SolarPanelArrayNorthSouthRowAxis: 'Північ-Південь (абсолютне)',\r\n SolarPanelArrayMargin: 'Відступ',\r\n SolarPanelArrayPoleHeight: 'Висота стовпа',\r\n SolarPanelArrayPoleSpacing: 'Інтервал між стовпами',\r\n SolarPanelArrayTotalYearlyCost: 'Total Cost',\r\n SolarPanelArrayTotalYearlyRevenue: 'Total Revenue',\r\n SolarPanelArrayTotalYearlyYield: 'Total Yield',\r\n SolarPanelArrayMeanYearlyYield: 'Mean Yield',\r\n SolarPanelArrayYearlyProfit: 'Profit',\r\n LayoutNotAcceptedCheckYourParameters: 'Це розташування не приймається. Будь ласка, перевірте ваші параметри.',\r\n },\r\n\r\n optimizationMenu: {\r\n Optimization: 'Оптимізація',\r\n Parameters: 'Параметри',\r\n Variables: 'Змінні',\r\n Constants: 'Константи',\r\n GeneticAlgorithm: 'Генетичний алгоритм',\r\n GeneticAlgorithmSettings: 'Налаштування генетичного алгоритму',\r\n ParticleSwarmOptimization: 'Оптимізація роєм частинок',\r\n ParticleSwarmOptimizationSettings: 'Налаштування оптимізації роєм частинок',\r\n SolarPanelTiltAngleOptimization: 'Оптимізація кута нахилу сонячних панелей',\r\n SolarPanelArrayLayout: 'Розташування сонячних панелей',\r\n Generation: 'Покоління',\r\n Gene: 'Ген',\r\n NormalizedVariables: 'Нормалізовані змінні',\r\n Objective: 'Ціль',\r\n ObjectiveFunctionDailyTotalYield: 'Щоденний загальний дохід',\r\n ObjectiveFunctionYearlyTotalYield: 'Щорічний загальний дохід',\r\n ObjectiveFunctionDailyMeanYield: 'Щоденний середній дохід',\r\n ObjectiveFunctionYearlyMeanYield: 'Щорічний середній дохід',\r\n ObjectiveFunctionDailyProfit: 'Щоденний прибуток',\r\n ObjectiveFunctionYearlyProfit: 'Щорічний прибуток',\r\n GeneticAlgorithmSelectionMethod: 'Метод вибору для генетичного алгоритму',\r\n RouletteWheel: 'Велосипедне колесо',\r\n Tournament: 'Турнір',\r\n SearchMethod: 'Метод пошуку',\r\n GlobalSearchUniformSelection: 'Глобальний пошук з однорідним вибором',\r\n LocalSearchRandomOptimization: 'Локальний пошук випадкової оптимізації',\r\n PopulationSize: 'Розмір населення',\r\n MaximumGenerations: 'Максимальна кількість поколінь',\r\n SelectionRate: 'Швидкість відбору',\r\n CrossoverRate: 'Швидкість схрещування',\r\n MutationRate: 'Швидкість мутації',\r\n Step: 'Крок',\r\n SwarmSize: 'Розмір рою',\r\n MaximumSteps: 'Максимальна кількість кроків',\r\n MaximumVelocity: 'Максимальна швидкість',\r\n InertiaWeight: 'Вага інерції',\r\n CognitiveCoefficient: 'Коефіцієнт когнітивної функції',\r\n SocialCoefficient: 'Коефіцієнт соціальної взаємодії',\r\n ConvergenceThreshold: 'Поріг збіжності для завершення',\r\n LocalSearchRadius: 'Радіус локального пошуку',\r\n RowsPerRackRange: 'Діапазон для рядів на стелаж',\r\n TiltAngleRange: 'Діапазон для кута нахилу',\r\n InterRowSpacingRange: 'Діапазон для міжрядкового проміжку',\r\n ClickTargetPolygonToActivate: 'Натисніть на цільовий полігон для активації',\r\n ClickTargetFoundationToActivate: 'Натисніть на цільовий фундамент для активації',\r\n },\r\n\r\n treeMenu: {\r\n ShowModel: 'Показати модель',\r\n Flip: 'Перевернути',\r\n Type: 'Тип',\r\n Spread: 'Розповсюдження',\r\n },\r\n\r\n flowerMenu: {\r\n Flip: 'Перевернути',\r\n Type: 'Тип',\r\n Spread: 'Розповсюдження',\r\n },\r\n\r\n peopleMenu: {\r\n ChangePerson: 'Змінити особу',\r\n Flip: 'Перевернути',\r\n Observer: 'Спостерігач',\r\n ViewFromThisPerson: 'Переглянути з цієї особи',\r\n },\r\n\r\n lightMenu: {\r\n Color: 'Колір',\r\n Intensity: 'Інтенсивність',\r\n Decay: 'Затухання',\r\n MaximumDistance: 'Максимальна відстань',\r\n Inside: 'Усередині',\r\n },\r\n\r\n solarCollectorMenu: {\r\n RelativeAzimuth: 'Відносний азимут',\r\n Pole: 'Стовп',\r\n PoleHeight: 'Висота стовпа',\r\n PoleRadius: 'Pole Radius',\r\n ExtraPoleHeight: 'Додаткова висота стовпа',\r\n ExtraPoleHeightInAdditionToHalfWidth: 'Додаткова висота стовпа на додаток до половини ширини',\r\n DrawSunBeam: 'Намалювати промінь сонця',\r\n },\r\n\r\n concentratedSolarPowerCollectorMenu: {\r\n ReflectorReflectance: 'Відбивання відбивача',\r\n ReceiverAbsorptance: 'Поглинання приймача',\r\n ReflectorOpticalEfficiency: 'Оптична ефективність відбивача',\r\n ReceiverThermalEfficiency: 'Теплова ефективність приймача',\r\n },\r\n\r\n solarPanelMenu: {\r\n InverterEfficiency: 'Inverter Efficiency',\r\n InverterEfficiencyExplained: 'The efficiency for converting direct current (DC) to alternating current (AC).',\r\n DcToAcSizeRatio: 'DC-to-AC Size Ratio',\r\n DcToAcSizeRatioExplained: \"The ratio of the solar panels' DC-rated size to the inverter's AC-rated size.\",\r\n ChangePvModel: 'Змінити модель',\r\n Orientation: 'Орієнтація',\r\n Portrait: 'Вертикальна',\r\n Landscape: 'Горизонтальна',\r\n FrameColor: 'Колір рамки',\r\n Panels: 'панелі',\r\n PanelsWide: 'панелі по ширині',\r\n PanelsLong: 'панелі по довжині',\r\n TiltAngle: 'Кут нахилу',\r\n SouthFacingIsPositive: 'Південь вважається позитивним',\r\n Tracker: 'Трекер',\r\n SolarTrackerFollowsSun: 'Трекер слідкує за сонцем для збільшення виходу сонячних панелей.',\r\n PoleSpacing: 'Відстань між стовпами',\r\n NoTracker: 'Без трекера',\r\n HorizontalSingleAxisTracker: 'Трекер з горизонтальною одноосевою орієнтацією',\r\n VerticalSingleAxisTracker: 'Трекер з вертикальною одноосевою орієнтацією',\r\n AltazimuthDualAxisTracker: 'Трекер з азимутально-альтазимутальною двоосевою орієнтацією',\r\n OnlyThisSolarPanel: 'Тільки ця сонячна панель',\r\n AllSolarPanelsOnSurface: 'Всі сонячні панелі на одній поверхні',\r\n AllSolarPanelsAboveFoundation: 'Всі сонячні панелі над однією фундаментом',\r\n AllSelectedSolarPanels: 'All Selected Solar Panels',\r\n AllSolarPanels: 'Всі сонячні панелі',\r\n },\r\n\r\n pvModelPanel: {\r\n SolarPanelSpecs: 'Технічні характеристики сонячної панелі',\r\n Model: 'Модель',\r\n PanelSize: 'Розмір панелі',\r\n Cells: 'Комірки',\r\n CellType: 'Тип комірок',\r\n Monocrystalline: 'Монокристалічні',\r\n Polycrystalline: 'Полікристалічні',\r\n ThinFilm: 'Тонкоплівкові',\r\n Bifacial: 'Bifacial',\r\n BifacialityFactor: 'Bifaciality Factor',\r\n Black: 'Чорний',\r\n Blue: 'Синій',\r\n ShadeTolerance: 'Стійкість до затінення',\r\n SolarCellEfficiency: 'Ефективність сонячної комірки',\r\n NominalOperatingCellTemperature: 'Номінальна робоча температура комірки',\r\n TemperatureCoefficientOfPmax: 'Температурний коефіцієнт Pmax',\r\n },\r\n\r\n parabolicTroughMenu: {\r\n ModuleLength: 'Довжина модуля',\r\n Modules: 'модулі',\r\n ModulesLong: 'модулів у довжину',\r\n LatusRectum: 'Велика піввісь',\r\n OnlyThisParabolicTrough: 'Тільки цей параболічний сонячний колектор',\r\n AllParabolicTroughsAboveFoundation: 'Усі параболічні сонячні колектори над цим фундаментом',\r\n AllSelectedParabolicTroughs: 'All Selected Parabolic Troughs',\r\n AllParabolicTroughs: 'Усі параболічні сонячні колектори',\r\n },\r\n\r\n fresnelReflectorMenu: {\r\n AbsorberPipe: 'Труба поглинання',\r\n SelectAbsorberToReflectSunlightTo: 'Виберіть поглинач, до якого буде відбиватися сонячне світло',\r\n ModuleLength: 'Довжина модуля',\r\n Modules: 'модулі',\r\n ModulesLong: 'модулів у довжину',\r\n OnlyThisFresnelReflector: 'Тільки цей відбивач Френеля',\r\n AllFresnelReflectorsAboveFoundation: 'Усі відбивачі Френеля над цим фундаментом',\r\n AllSelectedFresnelReflectors: 'All Selected Fresnel Reflectors',\r\n AllFresnelReflectors: 'Усі відбивачі Френеля',\r\n },\r\n\r\n heliostatMenu: {\r\n Tower: 'Вежа',\r\n SelectTowerToReflectSunlightTo: 'Виберіть вежу, до якої буде відбиватися сонячне світло',\r\n OnlyThisHeliostat: 'Тільки цей геліостат',\r\n AllHeliostatsAboveFoundation: 'Усі геліостати над цим фундаментом',\r\n AllSelectedHeliostats: 'All Selected Heliostats',\r\n AllHeliostats: 'Усі геліостати',\r\n },\r\n\r\n parabolicDishMenu: {\r\n ReceiverStructure: 'Структура приймача',\r\n CentralPole: 'Центральний стовп',\r\n CentralPoleWithTripod: 'Центральний стовп з триногою',\r\n Quadrupod: 'Чотиринога',\r\n RimDiameter: 'Діаметр ободу',\r\n LatusRectum: 'Велика піввісь',\r\n ExtraPoleHeightInAdditionToRadius: 'Додаткова висота стовпа плюс радіус',\r\n OnlyThisParabolicDish: 'Тільки ця параболічна тарілка',\r\n AllParabolicDishesAboveFoundation: 'Усі параболічні тарілки над цим фундаментом',\r\n AllSelectedParabolicDishes: 'All Selected Parabolic Dishes',\r\n AllParabolicDishes: 'Усі параболічні тарілки',\r\n },\r\n\r\n wallMenu: {\r\n TextureDefault: 'Типова текстура',\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n SizeOfWall: 'Розмір стіни',\r\n OnlyThisWall: 'Тільки ця стіна',\r\n AllConnectedWalls: \"Всі пов'язані стіни\",\r\n AllWallsAboveFoundation: 'Всі стіни над цим фундаментом',\r\n AllSelectedWalls: 'All Selected Walls',\r\n AllWalls: 'Всі стіни',\r\n Windows: 'Вікна',\r\n LockAllWindows: 'Заблокувати всі вікна',\r\n UnlockAllWindows: 'Розблокувати всі вікна',\r\n RemoveAllUnlockedWindows: 'Видалити всі розблоковані вікна',\r\n DoYouReallyWantToRemoveAllWindowsOnThisWall: 'Ви дійсно бажаєте видалити всі вікна на цій стіні',\r\n Doors: 'Двері',\r\n RemoveAllUnlockedDoors: 'Видалити всі розблоковані двері',\r\n DoYouReallyWantToRemoveAllDoorsOnThisWall: 'Ви дійсно бажаєте видалити всі двері на цій стіні',\r\n SolarPanels: 'Сонячні панелі',\r\n LockAllSolarPanels: 'Заблокувати всі сонячні панелі',\r\n UnlockAllSolarPanels: 'Розблокувати всі сонячні панелі',\r\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisWall: 'Ви дійсно бажаєте видалити всі сонячні панелі на цій стіні',\r\n Sensors: 'Датчики',\r\n LockAllSensors: 'Заблокувати всі датчики',\r\n UnlockAllSensors: 'Розблокувати всі датчики',\r\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані датчики',\r\n DoYouReallyWantToRemoveAllSensorsOnThisWall: 'Ви дійсно бажаєте видалити всі датчики на цій стіні',\r\n Lights: 'Лампи',\r\n RemoveAllUnlockedLights: 'Видалити всі розблоковані лампи',\r\n DoYouReallyWantToRemoveAllLightsOnThisWall: 'Ви дійсно бажаєте видалити всі лампи на цій стіні',\r\n LockAllPolygons: 'Заблокувати всі полігони',\r\n UnlockAllPolygons: 'Розблокувати всі полігони',\r\n RemoveAllUnlockedPolygons: 'Видалити всі розблоковані полігони',\r\n WallStructure: 'Структура стіни',\r\n DefaultStructure: 'Типова',\r\n StudStructure: 'Студ',\r\n PillarStructure: 'Пілар',\r\n Opacity: 'Непрозорість',\r\n StructureSpacing: 'Відстань між структурами',\r\n StructureWidth: 'Ширина структури',\r\n StructureThickness: 'Товщина структури',\r\n StructureColor: 'Колір структури',\r\n Color: 'Колір стіни',\r\n Height: 'Висота',\r\n Thickness: 'Товщина',\r\n Texture: 'Текстура',\r\n AllLightsOnWallInside: 'Всі лампи всередині стіни',\r\n AllLightsOnWallOutside: 'Всі лампи ззовні стіни',\r\n Fill: 'Заповнення',\r\n Full: 'Повне',\r\n Partial: 'Часткове',\r\n Empty: 'Порожнє',\r\n OpenToOutside: 'Відкрите на зовнішню сторону',\r\n EavesLength: 'Довжина карнизу',\r\n Parapet: 'Перила',\r\n ParapetColor: 'Колір перил',\r\n ParapetTexture: 'Текстура перил',\r\n ParapetHeight: 'Висота перил',\r\n CopingsHeight: 'Висота паркану',\r\n CopingsWidth: 'Ширина паркану',\r\n },\r\n\r\n windowMenu: {\r\n OnlyThisWindow: 'Тільки це вікно',\r\n AllWindowsOnSurface: 'All Windows on the Same Surface',\r\n AllWindowsAboveFoundation: 'Всі вікна над однією фундаментом',\r\n AllSelectedWindows: 'All Selected Windows',\r\n AllWindows: 'Всі вікна',\r\n Width: 'Ширина',\r\n Height: 'Висота',\r\n Setback: 'Setback from Exterior Surface',\r\n RelativeToWallThickness: 'Relative to wall thickness',\r\n Mullion: 'Розділовий стовпець',\r\n HorizontalMullion: 'Horizontal Mullion',\r\n VerticalMullion: 'Vertical Mullion',\r\n MullionWidth: 'Ширина розділового стовпця',\r\n HorizontalMullionSpacing: 'Horizontal Mullion Spacing',\r\n VerticalMullionSpacing: 'Vertical Mullion Spacing',\r\n MullionColor: 'Колір розділового стовпця',\r\n Tint: 'Відтінок',\r\n Opacity: 'Непрозорість',\r\n SolarHeatGainCoefficient: 'Коефіцієнт сонячного теплового навантаження (SHGC) = 1 - непрозорість',\r\n Shutter: 'Жалюзі',\r\n LeftShutter: 'Ліве жалюзі',\r\n RightShutter: 'Праве жалюзі',\r\n BothShutters: 'Обидві жалюзі',\r\n ShutterWidth: 'Відносна ширина',\r\n ShutterColor: 'Колір жалюзі',\r\n Frame: 'Рамка',\r\n FrameWidth: 'Ширина рамки',\r\n SillWidth: 'Ширина підвіконня',\r\n Color: 'Колір рамки',\r\n WindowType: 'Тип вікна',\r\n Default: 'Типове',\r\n Arched: 'Аркове',\r\n Polygonal: 'Багатокутне',\r\n Interior: \"Інтер'єр\",\r\n Empty: 'Порожнє',\r\n },\r\n\r\n roofMenu: {\r\n TextureDefault: 'Типове',\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n OnlyThisRoof: 'Тільки цей дах',\r\n AllRoofsAboveFoundation: 'Всі дахи над одним фундаментом',\r\n AllSelectedRoofs: 'All Selected Roofs',\r\n AllRoofs: 'Всі дахи',\r\n OnlyThisCeiling: 'Тільки ця стеля',\r\n AllCeilingsAboveFoundation: 'Всі стелі над одним фундаментом',\r\n AllCeilings: 'Всі стелі',\r\n EavesOverhangLength: 'Довжина виступу карнизу',\r\n RafterSpacing: 'Відстань між стропилами',\r\n RafterWidth: 'Ширина стропила',\r\n RafterThickness: 'Товщина стропила',\r\n RafterColor: 'Колір стропила',\r\n RoofColor: 'Колір даху',\r\n RoofSideColor: 'Колір бокової частини даху',\r\n GlassTint: 'Колір скла',\r\n Opacity: 'Непрозорість',\r\n RoofStructure: 'Структура даху',\r\n DefaultStructure: 'Типова',\r\n RafterStructure: 'Стропило',\r\n GlassStructure: 'Скло',\r\n SolarPanels: 'Сонячні панелі',\r\n LockAllSolarPanels: 'Заблокувати всі сонячні панелі',\r\n UnlockAllSolarPanels: 'Розблокувати всі сонячні панелі',\r\n RemoveAllUnlockedSolarPanels: 'Видалити всі розблоковані сонячні панелі',\r\n DoYouReallyWantToRemoveAllSolarPanelsOnThisRoof: 'Ви дійсно бажаєте видалити всі сонячні панелі на цьому даху',\r\n Windows: 'Вікна',\r\n LockAllWindows: 'Заблокувати всі вікна',\r\n UnlockAllWindows: 'Розблокувати всі вікна',\r\n RemoveAllUnlockedWindows: 'Видалити всі розблоковані вікна',\r\n DoYouReallyWantToRemoveAllWindowsOnThisRoof: 'Ви дійсно бажаєте видалити всі вікна на цьому даху',\r\n Sensors: 'Сенсори',\r\n LockAllSensors: 'Заблокувати всі сенсори',\r\n UnlockAllSensors: 'Розблокувати всі сенсори',\r\n RemoveAllUnlockedSensors: 'Видалити всі розблоковані сенсори',\r\n DoYouReallyWantToRemoveAllSensorsOnThisRoof: 'Ви дійсно бажаєте видалити всі сенсори на цьому даху',\r\n Lights: 'Лампи',\r\n RemoveAllUnlockedLights: 'Видалити всі розблоковані лампи',\r\n DoYouReallyWantToRemoveAllLightsOnThisRoof: 'Ви дійсно бажаєте видалити всі лампи на цьому даху',\r\n AllLightsOnRoofInside: 'Всі лампи на даху всередині',\r\n AllLightsOnRoofOutside: 'Всі лампи на даху ззовні',\r\n Rise: 'Піднімання',\r\n Ceiling: 'Стеля',\r\n RoofRValue: 'Значення R для даху',\r\n CeilingRValue: 'Значення R для стелі',\r\n },\r\n\r\n doorMenu: {\r\n TextureDefault: 'За замовчуванням',\r\n Texture01: 'Текстура 1',\r\n Texture02: 'Текстура 2',\r\n Texture03: 'Текстура 3',\r\n Texture04: 'Текстура 4',\r\n Texture05: 'Текстура 5',\r\n Texture06: 'Текстура 6',\r\n Texture07: 'Текстура 7',\r\n Texture08: 'Текстура 8',\r\n Texture09: 'Текстура 9',\r\n Texture10: 'Текстура 10',\r\n Texture11: 'Текстура 11',\r\n Texture12: 'Текстура 12',\r\n Texture13: 'Текстура 13',\r\n Texture14: 'Текстура 14',\r\n Texture15: 'Текстура 15',\r\n Texture16: 'Текстура 16',\r\n Texture17: 'Текстура 17',\r\n OnlyThisDoor: 'Тільки ці двері',\r\n AllDoorsOnWall: 'Всі двері на цій стіні',\r\n AllDoorsAboveFoundation: 'Всі двері над тим самим фундаментом',\r\n AllSelectedDoors: 'All Selected Doors',\r\n AllDoors: 'Всі двері',\r\n DoorType: 'Тип дверей',\r\n Default: 'За замовчуванням',\r\n Arched: 'Аркові',\r\n Filled: 'Заповнені',\r\n FrameColor: 'Колір рамки',\r\n Interior: \"Інтер'єр\",\r\n },\r\n\r\n siteInfoPanel: {\r\n High: 'Високо',\r\n Low: 'Низько',\r\n },\r\n\r\n designInfoPanel: {\r\n NumberOfSelectedHeliostats: 'Кількість вибраних геліостатів',\r\n NumberOfSelectedSolarPanels: 'Кількість вибраних сонячних панелей',\r\n ElectricityGeneratedDailyBySolarPanels: 'Електрика, що генерується щоденно цими сонячними панелями',\r\n SceneDiameter: 'Діаметр сцени',\r\n BuildingArea: 'Площа будівлі',\r\n },\r\n\r\n visualizationControlPanel: {\r\n ColorContrast: 'Контраст кольору',\r\n FluxScale: 'Шкала потоку',\r\n ClickUpOrDownArrowButtonsToChange: 'Натисніть кнопки зі стрілками вгору або вниз щоб змінити',\r\n },\r\n\r\n instructionPanel: {\r\n Rotate: 'Повернути',\r\n DragMouse: 'Перетягніть мишею',\r\n Zoom: 'Масштабування',\r\n MouseWheelOrKeys: 'Обертайте колесо миші або натисніть Ctrl+[ або Ctrl+]',\r\n MouseWheelOrKeysMac: 'Обертайте колесо миші або натисніть ⌘+[ або ⌘+]',\r\n Pan: 'Переміщення',\r\n HoldCtrlDragMouse: 'Натисніть і утримуйте Ctrl, перетягніть мишею',\r\n HoldMetaDragMouse: 'Натисніть і утримуйте ⌘, перетягніть мишею',\r\n Enter2DMode: 'Ввійти в 2D режим',\r\n Exit2DMode: 'Вийти з 2D режиму',\r\n NavigationMode: 'Режим навігації',\r\n EnableNavigation: 'Увімкнути навігацію',\r\n DisableNavigation: 'Вимкнути навігацію',\r\n MoveForwardBack: 'Рухатися вперед/назад',\r\n MoveForwardBackInstruction: 'Натисніть W/S',\r\n MoveLeftRight: 'Рухатися вліво/вправо',\r\n MoveLeftRightInstruction: 'Натисніть A/D',\r\n MoveUpDown: 'Рухатися вгору/вниз',\r\n MoveUpDownInstruction: 'Натисніть Z/X',\r\n Turn: 'Повернути',\r\n TurnInstruction: 'Натисніть клавіші зі стрілками',\r\n ResetView: 'Скинути',\r\n AutoRotate: 'Автоматичний поворот',\r\n StartOrStop: 'Натисніть F4, щоб почати або зупинити',\r\n },\r\n\r\n mapPanel: {\r\n ImageOnGround: 'Зображення на землі',\r\n WeatherStations: 'Метеостанції',\r\n WeatherStationsNote: 'Вимкніть це, щоб прискорити',\r\n Coordinates: 'Координати',\r\n Zoom: 'Масштабування',\r\n },\r\n\r\n visibilityPanel: {\r\n SolarPanelVisibility: 'Видимість сонячних панелей',\r\n Observer: 'Спостерігач',\r\n VantagePoint: 'Точка огляду',\r\n ItemizedVisibilityByFields: 'Розгорнутий за полями',\r\n TotalVisibility: 'Загальна видимість',\r\n },\r\n\r\n sensorPanel: {\r\n LightSensor: 'Датчик освітленості',\r\n WeatherDataFrom: 'Метеодані з',\r\n },\r\n\r\n buildingEnergyPanel: {\r\n DailyBuildingEnergy: 'Щоденна енергія будівлі',\r\n YearlyBuildingEnergy: 'Річна енергія будівлі',\r\n Heater: 'Обігрівач',\r\n AC: 'Кондиціонер',\r\n SolarPanel: 'Сонячна панель',\r\n Net: 'Всього',\r\n },\r\n\r\n solarPanelYieldPanel: {\r\n SolarPanelDailyYield: 'Щоденний дохід сонячних панелей',\r\n SolarPanelYearlyYield: 'Річний дохід сонячних панелей',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualSolarPanels: 'Показати дохід окремих сонячних панелей',\r\n Profit: 'Прибуток',\r\n TotalCost: 'Total Cost',\r\n TotalRevenue: 'Total Revenue',\r\n TotalYield: 'Total Yield',\r\n MeanYield: 'Mean Yield',\r\n ModuleCount: 'Module Count',\r\n },\r\n\r\n parabolicTroughYieldPanel: {\r\n ParabolicTroughDailyYield: 'Щоденний дохід параболічних сонячних колекторів',\r\n ParabolicTroughYearlyYield: 'Річний дохід параболічних сонячних колекторів',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualParabolicTroughs: 'Показати дохід окремих параболічних сонячних колекторів',\r\n },\r\n\r\n parabolicDishYieldPanel: {\r\n ParabolicDishDailyYield: 'Щоденний дохід параболічних тарілок',\r\n ParabolicDishYearlyYield: 'Річний дохід параболічних тарілок',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualParabolicDishes: 'Показати дохід окремих параболічних тарілок',\r\n },\r\n\r\n fresnelReflectorYieldPanel: {\r\n FresnelReflectorDailyYield: 'Щоденний дохід відбивача Френеля',\r\n FresnelReflectorYearlyYield: 'Річний дохід відбивача Френеля',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualFresnelReflectors: 'Показати дохід окремих відбивачів Френеля',\r\n },\r\n\r\n heliostatYieldPanel: {\r\n HeliostatDailyYield: 'Щоденний дохід геліостату',\r\n HeliostatYearlyYield: 'Річний дохід геліостату',\r\n Yield: 'Дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualHeliostats: 'Показати дохід окремих геліостатів',\r\n },\r\n\r\n updraftTowerYieldPanel: {\r\n UpdraftTowerDailyYield: 'Щоденний дохід сонячної вежі',\r\n UpdraftTowerYearlyYield: 'Річний дохід сонячної вежі',\r\n ChimneyAirTemperature: 'Температура повітря у димовій трубі',\r\n ChimneyWindSpeed: 'Швидкість вітру у димовій трубі',\r\n Yield: 'дохід',\r\n YieldPerHour: 'Дохід за годину',\r\n DailyTotal: 'Щоденний загальний',\r\n YearlyTotal: 'Річний загальний',\r\n ShowOutputsOfIndividualUpdraftTowers: 'Показати дохід окремих сонячних веж',\r\n },\r\n\r\n heliodonPanel: {\r\n SunAndTimeSettings: 'Налаштування Сонця та Часу',\r\n SunAngles: 'Кути Сонця',\r\n TwentyFourHours: '24 Години',\r\n },\r\n\r\n cloudFilePanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Пошук за назвою',\r\n MyLikes: 'Мої вподобання',\r\n MyCloudFiles: 'Мої файли у хмарному середовищі',\r\n GenerateLink: 'Створити посилання',\r\n LinkGeneratedInClipBoard: 'Посилання було створено та скопійовано до буферу обміну',\r\n DoYouReallyWantToDelete: 'Ви дійсно бажаєте видалити',\r\n IfSharedOrPublishedRenamingFileBreaksExistingLinks:\r\n 'Якщо цей файл було відкрито або опубліковано, зміна його назви порушить наявні посилання',\r\n },\r\n\r\n projectListPanel: {\r\n CopyTitle: 'Copy Title',\r\n TitleCopiedToClipBoard: 'The title was copied to the clip board',\r\n SearchByTitle: 'Пошук за назвою',\r\n MyProjects: 'My Projects',\r\n GenerateProjectLink: 'Generate Project Link',\r\n ProjectLinkGeneratedInClipBoard: 'A link to the project was generated in the clip board',\r\n DoYouReallyWantToDeleteProject: 'Do you really want to delete Project',\r\n IfSharedOrPublishedRenamingProjectBreaksExistingLinks:\r\n 'If this project has been shared or published, renaming it breaks existing links',\r\n },\r\n\r\n projectPanel: {\r\n ProjectSettings: 'Project Settings',\r\n ThumbnailImageSize: 'Thumbnail Image Size',\r\n ProjectByOtherPeople: 'Project by Other People',\r\n Project: 'Project',\r\n ProjectType: 'Тип проєкту',\r\n ProjectDescription: 'Description',\r\n MakeDescriptionEditable: 'Make this description editable',\r\n MakeDescriptionNonEditable: 'Make this description non-editable',\r\n DoubleClickToMakeDescriptionEditable: 'Double-click to make this description editable',\r\n SolarPanelArray: 'Solar Panel Array',\r\n CurateCurrentDesign: 'Curate current design',\r\n UpdateSelectedDesign: 'Update selected design',\r\n RemoveSelectedDesign: 'Remove selected design',\r\n ClickToFlipSortingOrder: 'Click to flip the sorting order',\r\n DesignNotShownInSolutionSpaceClickToShow: 'This design is not shown in solution space; click to show',\r\n DesignShownInSolutionSpaceClickToHide: 'This design is shown in solution space; click to hide',\r\n DistributionInSolutionSpace: 'Distribution in the Solution Space',\r\n ChooseSolutionSpace: 'Choose solution space',\r\n ChooseDataColoring: 'Choose data coloring',\r\n SameColorForAllDesigns: 'Same color for all designs',\r\n OneColorForEachDesign: 'One color for each design',\r\n SolutionSpaceScreenshot: 'Take a screenshot of the solution space',\r\n ScatteredPlotScreenshot: 'Take a screenshot of the scattered plot',\r\n SingleClickToSelectDoubleClickToOpen: 'Single-click to select, double-click to open.',\r\n SingleClickToDeselectDoubleClickToOpen: 'Single-click to deselect, double-click to open.',\r\n GenerateScatteredPlot: 'Generate Scattered Plot',\r\n SelectXAxis: 'Select X Axis',\r\n SelectYAxis: 'Select Y Axis',\r\n },\r\n\r\n accountSettingsPanel: {\r\n MyAccountSettings: 'Мої налаштування облікового запису',\r\n MyID: 'Моє 🆔',\r\n ClickToCopyMyID: 'Натисніть, щоб скопіювати моє ID',\r\n IDInClipBoard: 'Ваш ID було скопійоване і готове для вставки.',\r\n StoreMyNameInMyFilesWhenSaving: \"Зберігати моє ім'я в моїх файлах при збереженні\",\r\n DoYouReallyWantToShowYourNameInYourFiles: \"Ви дійсно бажаєте відображати ваше ім'я в файлах?\",\r\n SignFileDisclaimer: \"Якщо так, ваше ім'я зможе бачити будь-хто, хто матиме доступ до ваших файлів.\",\r\n Likes: 'Вподобання',\r\n AllPublished: 'Усі опубліковані',\r\n PublishedUnderAliases: 'Псевдоніми',\r\n UserCount: 'Кількість користувачів',\r\n SchoolID: 'ID Школи',\r\n ClassID: 'ID Класу',\r\n },\r\n\r\n weatherPanel: {\r\n SunshineHours: 'Сонячні години',\r\n },\r\n\r\n diurnalTemperaturePanel: {\r\n SelectAirTemperatureModel: 'Виберіть модель повітряної температури',\r\n Sinusoidal: 'Синусоїдальна',\r\n },\r\n\r\n economicsPanel: {\r\n EconomicsParameters: 'Параметри економіки',\r\n ElectricitySellingPrice: 'Ціна продажу електроенергії',\r\n OperationalCostPerUnit: 'Операційні витрати за одиницю',\r\n SellingPrice: 'Selling Price',\r\n UnitCost: 'Unit Cost',\r\n },\r\n\r\n navigationPanel: {\r\n NavigationParameters: 'Navigation Parameters',\r\n MinimumMoveSpeed: 'Minimum Move Speed',\r\n MinimumTurnSpeed: 'Minimum Turn Speed',\r\n },\r\n\r\n yearlyLightSensorPanel: {\r\n SkyClearness: 'Ясність неба',\r\n ShowDaylightResults: 'Показати результати денного освітлення',\r\n ShowSkyClearnessResults: 'Показати результати ясності неба',\r\n ShowAverageDailySolarRadiation: 'Показати середню щоденну сонячну радіацію',\r\n },\r\n\r\n analysisManager: {\r\n NoSensorForCollectingData: 'Немає датчика для збору даних.',\r\n NoSolarPanelForAnalysis: 'Немає сонячної панелі для аналізу.',\r\n NoObserverForVisibilityAnalysis: 'Немає спостерігача для аналізу видимості.',\r\n NoWaterHeaterForAnalysis: 'Немає водонагрівача для аналізу.',\r\n NoParabolicDishForAnalysis: 'Немає параболічної тарілки для аналізу.',\r\n NoParabolicTroughForAnalysis: 'Немає параболічного сонячного колектора для аналізу.',\r\n NoFresnelReflectorForAnalysis: 'Немає відбивача Френеля для аналізу.',\r\n NoHeliostatForAnalysis: 'Немає геліостата для аналізу.',\r\n NoSolarUpdraftTowerForAnalysis: 'Немає сонячної вежі для аналізу.',\r\n NoBuildingForAnalysis: 'Немає будівлі для аналізу.',\r\n },\r\n\r\n toolbar: {\r\n CloudFile: 'Хмарний файл',\r\n Select: 'Вибрати',\r\n AddFoundation: 'Додати фундамент',\r\n AddWall: 'Додати стіну',\r\n AddWindow: 'Додати вікно',\r\n AddDoor: 'Додати двері',\r\n AddPyramidRoof: 'Додати пірамідальний дах',\r\n AddGableRoof: 'Додати шатровий дах',\r\n AddHipRoof: 'Додати чотирихилий дах',\r\n AddGambrelRoof: 'Додати двосхилий дах',\r\n AddMansardRoof: 'Додати мансардний дах',\r\n AddCuboid: 'Додати прямокутний паралелепіпед',\r\n AddSensor: 'Додати датчик',\r\n AddSolarPanel: 'Додати сонячну панель',\r\n AddWaterHeater: 'Додати водонагрівач',\r\n AddParabolicDish: 'Додати параболічну тарілку',\r\n AddParabolicTrough: 'Додати параболічний сонячний колектор',\r\n AddFresnelReflector: 'Додати відбивач Френеля',\r\n AddHeliostat: 'Додати геліостат',\r\n AddWindTurbine: 'Додати вітрогенератор',\r\n AddLight: 'Додати світло',\r\n AddTree: 'Додати дерево',\r\n AddFlower: 'Додати квітку',\r\n AddPeople: 'Додати людей',\r\n DoubleClickToLockThisModeForNextAction: 'Подвійне клацання, щоб заблокувати цей режим для наступної дії',\r\n ClickToUnlockThisModeForNextAction: 'Клацніть, щоб розблокувати цей режим для наступної дії',\r\n ManipulateGroup: 'Маніпулювати групою',\r\n ClearScene: 'Очистити сцену',\r\n ShowSunAndTimeSettings: 'Показати налаштування Сонця та Часу',\r\n SpatialAnalysisOfEnergy: 'Просторовий аналіз енергії',\r\n DoYouReallyWantToClearContent: 'Ви дійсно бажаєте очистити вміст',\r\n ClickForMoreButtons: 'Натисніть для додаткових кнопок',\r\n SwitchToAddingFoundation: 'Переключитися на додавання фундаменту',\r\n SwitchToAddingCuboid: 'Переключитися на додавання прямокутного паралелепіпеду',\r\n SwitchToAddingWall: 'Переключитися на додавання стіни',\r\n SwitchToAddingWindow: 'Переключитися на додавання вікна',\r\n SwitchToAddingDoor: 'Переключитися на додавання дверей',\r\n SwitchToAddingPyramidRoof: 'Переключитися на додавання пірамідального даху',\r\n SwitchToAddingGableRoof: 'Переключитися на додавання шатрового даху',\r\n SwitchToAddingHipRoof: 'Переключитися на додавання чотирихилий даху',\r\n SwitchToAddingGambrelRoof: 'Переключитися на додавання двосхилий даху',\r\n SwitchToAddingMansardRoof: 'Переключитися на додавання мансардного даху',\r\n SwitchToAddingSolarPanel: 'Переключитися на додавання сонячної панелі',\r\n SwitchToAddingSensor: 'Переключитися на додавання датчика',\r\n SwitchToAddingWaterHeater: 'Переключитися на додавання водонагрівача',\r\n SwitchToAddingParabolicDish: 'Переключитися на додавання параболічної тарілки',\r\n SwitchToAddingParabolicTrough: 'Переключитися на додавання параболічного сонячного колектора',\r\n SwitchToAddingFresnelReflector: 'Переключитися на додавання відбивача Френеля',\r\n SwitchToAddingHeliostat: 'Переключитися на додавання геліостата',\r\n SwitchToAddingWindTurbine: 'Переключитися на додавання вітрогенератора',\r\n SwitchToAddingLight: 'Переключитися на додавання освітлення',\r\n SwitchToAddingTree: 'Переключитися на додавання дерева',\r\n SwitchToAddingFlower: 'Переключитися на додавання квітки',\r\n SwitchToAddingPeople: 'Переключитися на додавання людей',\r\n },\r\n\r\n tooltip: {\r\n gotoIFI: 'Перейти до Інституту Інтелекту Майбутнього',\r\n visitAladdinHomePage: 'Відвідати домашню сторінку Aladdin',\r\n clickToOpenMenu: 'Натисність, щоб відкрити Головне Меню',\r\n clickToAccessAccountSettings: 'Click to access account settings',\r\n },\r\n\r\n tree: {\r\n Apple: 'Яблуня',\r\n Birch: 'Береза',\r\n Coconut: 'Кокос',\r\n Dogwood: 'Дерен',\r\n Elm: \"В'яз\",\r\n FanPalm: 'Віяльна пальма',\r\n Linden: 'Липа',\r\n Magnolia: 'Магнолія',\r\n Maple: 'Клен',\r\n Oak: 'Дуб',\r\n Pine: 'Сосна',\r\n Spruce: 'Ялина',\r\n },\r\n\r\n flower: {\r\n Bellflower: 'Дзвоник',\r\n Boxwood: 'Самшит',\r\n CactusCombo1: 'Кактус Комбо 1',\r\n CactusCombo2: 'Кактус Комбо 2',\r\n CactusCombo3: 'Кактус Комбо 3',\r\n CactusCombo4: 'Кактус Комбо 4',\r\n Hibiscus: 'Гібіскус',\r\n Hosta: 'Госта',\r\n Hydrangea: 'Гортензія',\r\n Peony: 'Півонія',\r\n RedRose: 'Червона троянда',\r\n Spirea: 'Спірея',\r\n Sunflower: 'Соняшник',\r\n TallBush: 'Високий кущ',\r\n Tulip: 'Тюльпан',\r\n WhiteFlower: 'Біла квітка',\r\n YellowFlower: 'Жовта квітка',\r\n },\r\n\r\n people: {\r\n Jaah: 'Артем',\r\n Jack: 'Віталій',\r\n Jacob: 'Ярослав',\r\n Jacqueline: 'Олена',\r\n Jade: 'Ольга',\r\n Jamelia: 'Олександра',\r\n James: 'Андрій',\r\n Jane: 'Вікторія',\r\n Jaya: 'Ірина',\r\n Jaye: 'Назар',\r\n Jeanette: 'Соломія',\r\n Jedi: 'Євген',\r\n Jeff: 'Павло',\r\n Jena: 'Любов',\r\n Jennifer: 'Тетяна',\r\n Jess: 'Злата',\r\n Jett: 'Сергій',\r\n Jill: 'Надія',\r\n Jiya: 'Марина',\r\n Joan: 'Іванна',\r\n Jocelyn: 'Анастасія',\r\n Joel: 'Володимир',\r\n Joey: 'Вероніка',\r\n John: 'Іван',\r\n Jonathon: 'Петро',\r\n Jose: 'Микита',\r\n Joseph: 'Віктор',\r\n Joshua: 'Михайло',\r\n Judd: 'Владислав',\r\n Judy: 'Марія',\r\n Julia: 'Юлія',\r\n Julio: 'Дмитро',\r\n Jumapili: 'Марта',\r\n June: 'Анна',\r\n Juro: 'Юрій',\r\n Justin: 'Богдан',\r\n },\r\n\r\n compass: {\r\n N: 'Пн',\r\n S: 'Пд',\r\n W: 'Зx',\r\n E: 'Сх',\r\n },\r\n\r\n month: {\r\n January: 'Jan',\r\n February: 'Feb',\r\n March: 'Mar',\r\n April: 'Apr',\r\n May: 'May',\r\n June: 'Jun',\r\n July: 'Jul',\r\n August: 'Aug',\r\n September: 'Sep',\r\n October: 'Oct',\r\n November: 'Nov',\r\n December: 'Dec',\r\n },\r\n\r\n modelsMap: {\r\n SearchByPublisher: 'Пошук за виробником',\r\n SearchByLabel: 'Пошук за міткою',\r\n MyPublishedModels: 'Мої опубліковані моделі',\r\n TotalNumberOfUserPublishedModels: 'Загальна кількість моделей, опублікованих користувачами',\r\n SortFromOldestToNewest: 'Сортувати від найдавніших до найновіших',\r\n SortFromNewestToOldest: 'Сортувати від найновіших до найдавніших',\r\n ModelsFoundOnThisSite: 'моделей знайдено на цьому сайті',\r\n ShowModelsPublishedByThisAuthor: 'Показати моделі, опубліковані цим автором',\r\n },\r\n },\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { extend, Object3DNode } from '@react-three/fiber';\r\nimport TextSprite from 'three-spritetext';\r\nimport { MyOrbitControls } from './js/MyOrbitControls';\r\nimport { ParabolicCylinderGeometry } from './js/ParabolicCylinderGeometry';\r\nimport { ParaboloidGeometry } from './js/ParaboloidGeometry';\r\nimport { ConvexGeometry } from './js/ConvexGeometry';\r\nimport { Vector2 } from 'three';\r\n\r\n// Extend makes these JSX elements (with the first character lower-cased)\r\nextend({ TextSprite });\r\nextend({ MyOrbitControls });\r\nextend({ ParabolicCylinderGeometry });\r\nextend({ ParaboloidGeometry });\r\nextend({ ConvexGeometry });\r\n\r\ndeclare global {\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n textSprite: Object3DNode;\r\n myOrbitControls: Object3DNode;\r\n parabolicCylinderGeometry: Object3DNode;\r\n paraboloidGeometry: Object3DNode;\r\n convexGeometry: Object3DNode;\r\n }\r\n }\r\n}\r\n\r\nexport interface User {\r\n displayName: string | null;\r\n email: string | null;\r\n photoURL: string | null;\r\n uid: string | null;\r\n signFile: boolean;\r\n noLogging: boolean;\r\n schoolID: SchoolID;\r\n classID: ClassID;\r\n likes?: string[];\r\n published?: string[];\r\n aliases?: string[];\r\n}\r\n\r\nexport enum FirebaseName {\r\n FILES = 'Files',\r\n LOG_DATA = 'Log Data',\r\n}\r\n\r\nexport interface ModelSite {\r\n userid: string;\r\n title: string;\r\n latitude: number;\r\n longitude: number;\r\n address?: string;\r\n countryCode?: string;\r\n type?: string;\r\n author?: string;\r\n label?: string;\r\n description?: string;\r\n likeCount?: number;\r\n clickCount?: number;\r\n timeCreated?: number;\r\n pinned?: boolean;\r\n thumbnailUrl?: string;\r\n hashtags?: string;\r\n}\r\n\r\nexport interface Design {\r\n timestamp: number;\r\n title: string;\r\n thumbnail: string; // PNG Base64 data\r\n [key: string]: any;\r\n}\r\n\r\nexport enum SchoolID {\r\n UNKNOWN = 'UNKNOWN SCHOOL',\r\n SCHOOL1 = 'SCHOOL 1',\r\n SCHOOL2 = 'SCHOOL 2',\r\n SCHOOL3 = 'SCHOOL 3',\r\n SCHOOL4 = 'SCHOOL 4',\r\n SCHOOL5 = 'SCHOOL 5',\r\n}\r\n\r\nexport enum ClassID {\r\n UNKNOWN = 'UNKNOWN CLASS',\r\n CLASS1 = 'CLASS 1',\r\n CLASS2 = 'CLASS 2',\r\n CLASS3 = 'CLASS 3',\r\n CLASS4 = 'CLASS 4',\r\n CLASS5 = 'CLASS 5',\r\n CLASS6 = 'CLASS 6',\r\n CLASS7 = 'CLASS 7',\r\n CLASS8 = 'CLASS 8',\r\n CLASS9 = 'CLASS 9',\r\n}\r\n\r\nexport interface CloudFileInfo {\r\n readonly timestamp: number;\r\n readonly fileName: string;\r\n readonly uuid: string;\r\n readonly userid: string;\r\n}\r\n\r\nexport enum DataColoring {\r\n ALL = 0,\r\n INDIVIDUALS = 1,\r\n GROUPS = 2,\r\n}\r\n\r\nexport interface Range {\r\n variable: string;\r\n minimum: number;\r\n maximum: number;\r\n}\r\n\r\n// use null for undefined, as we need to persist this in Firebase\r\nexport interface ProjectInfo {\r\n owner: string | null;\r\n timestamp: number;\r\n title: string | null;\r\n description: string | null;\r\n type: DesignProblem;\r\n designs: Design[] | null;\r\n ranges: Range[] | null;\r\n hiddenParameters: string[] | null;\r\n counter: number;\r\n dataColoring: DataColoring;\r\n selectedProperty: string | null;\r\n sortDescending: boolean | null;\r\n xAxisNameScatteredPlot: string | null;\r\n yAxisNameScatteredPlot: string | null;\r\n dotSizeScatteredPlot: number | null;\r\n thumbnailWidth: number | null;\r\n}\r\n\r\nexport interface ActionInfo {\r\n readonly timestamp: number;\r\n readonly name: string;\r\n readonly elementId?: string;\r\n readonly elementType?: ObjectType;\r\n readonly result?: any;\r\n readonly details?: any;\r\n readonly steps?: number;\r\n}\r\n\r\nexport enum ModelType {\r\n UNKNOWN = 'Unknown',\r\n UNDER_CONSTRUCTION = 'Under Construction',\r\n RESIDENTIAL_BUILDING = 'Residential Building',\r\n COMMERCIAL_BUILDING = 'Commercial Building',\r\n SCHOOL_BUILDING = 'School Building',\r\n TOURIST_ATTRACTION = 'Tourist Attraction',\r\n PHOTOVOLTAIC = 'Photovoltaic',\r\n PARABOLIC_DISH = 'Parabolic Dish',\r\n PARABOLIC_TROUGH = 'Parabolic Trough',\r\n FRESNEL_REFLECTOR = 'Fresnel Reflector',\r\n SOLAR_POWER_TOWER = 'Solar Power Tower',\r\n}\r\n\r\nexport enum BuildingCompletionStatus {\r\n COMPLETE,\r\n ROOF_MISSING,\r\n WALL_DISJOINED,\r\n WALL_EMPTY,\r\n}\r\n\r\nexport enum DesignProblem {\r\n SOLAR_PANEL_TILT_ANGLE = 'Solar Panel Tilt Angle',\r\n SOLAR_PANEL_ARRAY = 'Solar Panel Array',\r\n}\r\n\r\nexport enum ObjectiveFunctionType {\r\n DAILY_TOTAL_OUTPUT = 1,\r\n YEARLY_TOTAL_OUTPUT = 2,\r\n DAILY_AVERAGE_OUTPUT = 3,\r\n YEARLY_AVERAGE_OUTPUT = 4,\r\n DAILY_PROFIT = 5,\r\n YEARLY_PROFIT = 6,\r\n}\r\n\r\nexport enum EvolutionMethod {\r\n GENETIC_ALGORITHM = 1,\r\n PARTICLE_SWARM_OPTIMIZATION = 2,\r\n}\r\n\r\nexport enum GeneticAlgorithmSelectionMethod {\r\n ROULETTE_WHEEL = 1,\r\n TOURNAMENT = 2,\r\n}\r\n\r\nexport enum SearchMethod {\r\n GLOBAL_SEARCH_UNIFORM_SELECTION = 1,\r\n LOCAL_SEARCH_RANDOM_OPTIMIZATION = 2, // https://en.wikipedia.org/wiki/Random_optimization\r\n GLOBAL_SEARCH_FITNESS_SHARING = 3, // https://stackoverflow.com/questions/13775810/what-is-niching-scheme\r\n}\r\n\r\nexport enum LineStyle {\r\n Solid = 1,\r\n Dashed = 2,\r\n Dotted = 3,\r\n}\r\n\r\nexport enum LineWidth {\r\n One = 1,\r\n Two = 2,\r\n Three = 3,\r\n Four = 4,\r\n Five = 5,\r\n}\r\n\r\nexport interface DatumEntry {\r\n [key: string]: number | undefined | string | boolean;\r\n}\r\n\r\nexport interface EnergyUsage {\r\n heater: number;\r\n ac: number;\r\n solarPanel: number;\r\n geothermal: number;\r\n label?: string;\r\n}\r\n\r\nexport enum ChartType {\r\n Line = 1,\r\n Area = 2,\r\n}\r\n\r\nexport enum GraphDataType {\r\n HourlyTemperatures = 1,\r\n MonthlyTemperatures = 2,\r\n SunshineHours = 3,\r\n DaylightData = 4,\r\n ClearnessData = 5,\r\n YearlyRadiationSensorData = 6,\r\n DailyRadiationSensorData = 7,\r\n YearlyPvYield = 8,\r\n DailyPvYield = 9,\r\n YearlyParabolicTroughYield = 10,\r\n DailyParabolicTroughYield = 11,\r\n YearlyParabolicDishYield = 12,\r\n DailyParabolicDishYield = 13,\r\n YearlyFresnelReflectorYield = 14,\r\n DailyFresnelReflectorYield = 15,\r\n YearlyHeliostatYield = 16,\r\n DailyHeliostatYield = 17,\r\n YearlyUpdraftTowerYield = 18,\r\n DailyUpdraftTowerYield = 19,\r\n YearlyBuildingEnergy = 20,\r\n DailyBuildingEnergy = 21,\r\n}\r\n\r\nexport enum Theme {\r\n Default = 'Default',\r\n Desert = 'Desert',\r\n Dune = 'Dune',\r\n Forest = 'Forest',\r\n Grassland = 'Grassland',\r\n Hill = 'Hill',\r\n Lake = 'Lake',\r\n Mountain = 'Mountain',\r\n Rural = 'Rural',\r\n}\r\n\r\nexport enum DiurnalTemperatureModel {\r\n Sinusoidal = 1,\r\n PartonLogan = 2, // https://www.sciencedirect.com/science/article/abs/pii/0002157181901059\r\n}\r\n\r\nexport enum Language {\r\n English = 'English',\r\n ChineseSimplified = '简体中文',\r\n ChineseTraditional = '繁体中文',\r\n Turkish = 'Türkçe',\r\n Spanish = 'Español',\r\n Ukrainian = 'Українська',\r\n}\r\n\r\nexport enum ObjectType {\r\n Sky = 'Sky',\r\n Ground = 'Ground',\r\n Foundation = 'Foundation',\r\n Wall = 'Wall',\r\n Window = 'Window',\r\n Door = 'Door',\r\n Roof = 'Roof',\r\n PyramidRoof = 'Pyramid Roof',\r\n GableRoof = 'Gable Roof',\r\n HipRoof = 'Hip Roof',\r\n GambrelRoof = 'Gambrel Roof',\r\n MansardRoof = 'Mansard Roof',\r\n Sensor = 'Sensor',\r\n SolarPanel = 'Solar Panel',\r\n WaterHeater = 'Water Heater',\r\n ParabolicDish = 'Parabolic Dish',\r\n ParabolicTrough = 'Parabolic Trough',\r\n FresnelReflector = 'Fresnel Reflector',\r\n Heliostat = 'Heliostat',\r\n WindTurbine = 'Wind Turbine',\r\n Cuboid = 'Cuboid',\r\n Human = 'Human',\r\n Tree = 'Tree',\r\n Flower = 'Flower',\r\n Polygon = 'Polygon',\r\n PolygonVertex = 'Polygon Vertex',\r\n Light = 'Light',\r\n None = 'None',\r\n}\r\n\r\nexport enum ParabolicDishStructureType {\r\n CentralPole = 1,\r\n CentralPoleWithTripod = 2,\r\n Quadrupod = 3,\r\n}\r\n\r\nexport enum SolarStructure {\r\n None = 0,\r\n FocusPipe = 1,\r\n FocusTower = 2,\r\n UpdraftTower = 3,\r\n}\r\n\r\nexport enum ActionType {\r\n Select = 'Select',\r\n Move = 'Move',\r\n Resize = 'Resize',\r\n Rotate = 'Rotate',\r\n ContextMenu = 'ContextMenu',\r\n}\r\n\r\nexport enum MoveHandleType {\r\n Default = 'Move Handle', // used when there is only one handle for moving\r\n Lower = 'Move Handle Lower',\r\n Upper = 'Move Handle Upper',\r\n Left = 'Move Handle Left',\r\n Right = 'Move Handle Right',\r\n Top = 'Move Handle Top',\r\n Mid = 'Move Handle Mid',\r\n}\r\n\r\nexport enum ResizeHandleType {\r\n LowerLeft = 'Resize Handle Lower Left',\r\n UpperLeft = 'Resize Handle Upper Left',\r\n LowerRight = 'Resize Handle Lower Right',\r\n UpperRight = 'Resize Handle Upper Right',\r\n LowerLeftTop = 'Resize Handle Lower Left Top',\r\n UpperLeftTop = 'Resize Handle Upper Left Top',\r\n LowerRightTop = 'Resize Handle Lower Right Top',\r\n UpperRightTop = 'Resize Handle Upper Right Top',\r\n Lower = 'Resize Handle Lower',\r\n Upper = 'Resize Handle Upper',\r\n Left = 'Resize Handle Left',\r\n Right = 'Resize Handle Right',\r\n Top = 'Resize Handle Top',\r\n Default = 'Resize Handle', // used for resizing a polygon\r\n Arch = 'Resize Handle Arch',\r\n WallPartialResizeLeft = 'Wall Partial Resize Handle Left',\r\n WallPartialResizeRight = 'Wall Partial Resize Handle Right',\r\n WallPartialResizeLeftTop = 'Wall Partial Resize Handle Left Top',\r\n WallPartialResizeRightTop = 'Wall Partial Resize Handle Right Top',\r\n}\r\n\r\nexport enum RotateHandleType {\r\n Lower = 'Rotate Handle Lower',\r\n Upper = 'Rotate Handle Upper',\r\n Tilt = 'Rotate Handle Tilt',\r\n}\r\n\r\nexport enum PolygonVertexAction {\r\n Delete = 'Delete Vertex',\r\n InsertBeforeIndex = 'Insert Vertex Before Index',\r\n InsertAfterIndex = 'Insert Vertex After Index',\r\n}\r\n\r\nexport enum IntersectionPlaneType {\r\n Horizontal = 'Horizontal',\r\n Vertical = 'Vertical',\r\n Ground = 'Ground',\r\n Sky = 'Sky',\r\n}\r\n\r\nexport enum Scope {\r\n OnlyThisObject = 1,\r\n AllObjectsOfThisTypeOnSurface = 2,\r\n AllObjectsOfThisTypeAboveFoundation = 3,\r\n AllObjectsOfThisType = 4,\r\n AllConnectedObjects = 5,\r\n OnlyThisSide = 6, // same wall\r\n AllSelectedObjectsOfThisType = 7,\r\n}\r\n\r\nexport enum Orientation {\r\n portrait = 'Portrait',\r\n landscape = 'Landscape',\r\n}\r\n\r\nexport enum RowAxis {\r\n eastWest = 'East-West', // absolute\r\n northSouth = 'North-South', // absolute\r\n leftRight = 'Left-Right', // relative to the parent\r\n upDown = 'Up-Down', // relative to the parent\r\n}\r\n\r\nexport enum TrackerType {\r\n NO_TRACKER = 'None',\r\n HORIZONTAL_SINGLE_AXIS_TRACKER = 'HSAT',\r\n ALTAZIMUTH_DUAL_AXIS_TRACKER = 'AADAT',\r\n VERTICAL_SINGLE_AXIS_TRACKER = 'VSAT',\r\n TILTED_SINGLE_AXIS_TRACKER = 'TSAT',\r\n}\r\n\r\nexport enum ShadeTolerance {\r\n NONE = 'None',\r\n HIGH = 'High',\r\n PARTIAL = 'Partial',\r\n}\r\n\r\nexport enum Discretization {\r\n EXACT = 'Exact',\r\n APPROXIMATE = 'Approximate',\r\n}\r\n\r\nexport enum TreeType {\r\n Apple = 'Apple',\r\n Birch = 'Birch',\r\n Coconut = 'Coconut',\r\n Dogwood = 'Dogwood',\r\n Elm = 'Elm',\r\n FanPalm = 'Fan Palm',\r\n Linden = 'Linden',\r\n Magnolia = 'Magnolia',\r\n Maple = 'Maple',\r\n Oak = 'Oak',\r\n Pine = 'Pine',\r\n Spruce = 'Spruce',\r\n}\r\n\r\nexport enum FlowerType {\r\n Bellflower = 'Bellflower',\r\n Boxwood = 'Boxwood',\r\n CactusCombo1 = 'Cactus Combo 1',\r\n CactusCombo2 = 'Cactus Combo 2',\r\n CactusCombo3 = 'Cactus Combo 3',\r\n CactusCombo4 = 'Cactus Combo 4',\r\n Hibiscus = 'Hibiscus',\r\n Hosta = 'Hosta',\r\n Hydrangea = 'Hydrangea',\r\n Peony = 'Peony',\r\n RedRose = 'Red Rose',\r\n Spirea = 'Spirea',\r\n Sunflower = 'Sunflower',\r\n TallBush = 'Tall Bush',\r\n Tulip = 'Tulip',\r\n WhiteFlower = 'White Flower',\r\n YellowFlower = 'Yellow Flower',\r\n}\r\n\r\nexport enum Gender {\r\n Male = 'Male',\r\n Female = 'Female',\r\n Other = 'Other',\r\n}\r\n\r\nexport enum HumanName {\r\n Jaah = 'Jaah',\r\n Jack = 'Jack',\r\n Jacob = 'Jacob',\r\n Jacqueline = 'Jacqueline',\r\n Jade = 'Jade',\r\n Jamelia = 'Jamelia',\r\n James = 'James',\r\n Jane = 'Jane',\r\n Jaya = 'Jaya',\r\n Jaye = 'Jaye',\r\n Jeanette = 'Jeanette',\r\n Jedi = 'Jedi',\r\n Jeff = 'Jeff',\r\n Jena = 'Jena',\r\n Jennifer = 'Jennifer',\r\n Jess = 'Jess',\r\n Jett = 'Jett',\r\n Jill = 'Jill',\r\n Jiya = 'Jiya',\r\n Jocelyn = 'Jocelyn',\r\n Joan = 'Joan',\r\n Joel = 'Joel',\r\n Joey = 'Joey',\r\n John = 'John',\r\n Jonathon = 'Jonathon',\r\n Joseph = 'Joseph',\r\n Jose = 'Jose',\r\n Joshua = 'Joshua',\r\n Judd = 'Judd',\r\n Judy = 'Judy',\r\n Julia = 'Julia',\r\n Julio = 'Julio',\r\n Jumapili = 'Jumapili',\r\n June = 'June',\r\n Juro = 'Juro',\r\n Justin = 'Justin',\r\n}\r\n\r\nexport enum PolygonTexture {\r\n Texture01 = 'Polygon Texture #1',\r\n Texture02 = 'Polygon Texture #2',\r\n Texture03 = 'Polygon Texture #3',\r\n Texture04 = 'Polygon Texture #4',\r\n Texture05 = 'Polygon Texture #5',\r\n Texture06 = 'Polygon Texture #6',\r\n Texture07 = 'Polygon Texture #7',\r\n Texture08 = 'Polygon Texture #8',\r\n Texture09 = 'Polygon Texture #9',\r\n Texture10 = 'Polygon Texture #10',\r\n NoTexture = 'No Polygon Texture',\r\n}\r\n\r\nexport enum FoundationTexture {\r\n Texture01 = 'Foundation Texture #1',\r\n Texture02 = 'Foundation Texture #2',\r\n Texture03 = 'Foundation Texture #3',\r\n Texture04 = 'Foundation Texture #4',\r\n Texture05 = 'Foundation Texture #5',\r\n Texture06 = 'Foundation Texture #6',\r\n Texture07 = 'Foundation Texture #7',\r\n Texture08 = 'Foundation Texture #8',\r\n Texture09 = 'Foundation Texture #9',\r\n Texture10 = 'Foundation Texture #10',\r\n NoTexture = 'No Foundation Texture',\r\n}\r\n\r\nexport enum CuboidTexture {\r\n Facade01 = 'Facade #1',\r\n Facade02 = 'Facade #2',\r\n Facade03 = 'Facade #3',\r\n Facade04 = 'Facade #4',\r\n Facade05 = 'Facade #5',\r\n Facade06 = 'Facade #6',\r\n Facade07 = 'Facade #7',\r\n Facade08 = 'Facade #8',\r\n Facade09 = 'Facade #9',\r\n Facade10 = 'Facade #10',\r\n NoTexture = 'No Facade Texture',\r\n}\r\n\r\nexport enum WallTexture {\r\n Default = 'Wall Texture Default',\r\n Texture01 = 'Wall Texture #1',\r\n Texture02 = 'Wall Texture #2',\r\n Texture03 = 'Wall Texture #3',\r\n Texture04 = 'Wall Texture #4',\r\n Texture05 = 'Wall Texture #5',\r\n Texture06 = 'Wall Texture #6',\r\n Texture07 = 'Wall Texture #7',\r\n Texture08 = 'Wall Texture #8',\r\n Texture09 = 'Wall Texture #9',\r\n Texture10 = 'Wall Texture #10',\r\n NoTexture = 'No Wall Texture',\r\n}\r\n\r\nexport enum DoorTexture {\r\n Default = 'Door Texture Default',\r\n Texture01 = 'Door Texture #1',\r\n Texture02 = 'Door Texture #2',\r\n Texture03 = 'Door Texture #3',\r\n Texture04 = 'Door Texture #4',\r\n Texture05 = 'Door Texture #5',\r\n Texture06 = 'Door Texture #6',\r\n Texture07 = 'Door Texture #7',\r\n Texture08 = 'Door Texture #8',\r\n Texture09 = 'Door Texture #9',\r\n Texture10 = 'Door Texture #10',\r\n Texture11 = 'Door Texture #11',\r\n Texture12 = 'Door Texture #12',\r\n Texture13 = 'Door Texture #13',\r\n Texture14 = 'Door Texture #14',\r\n Texture15 = 'Door Texture #15',\r\n Texture16 = 'Door Texture #16',\r\n Texture17 = 'Door Texture #17',\r\n NoTexture = 'No Door Texture',\r\n}\r\n\r\nexport enum RoofTexture {\r\n Default = 'Roof Texture Default',\r\n Texture01 = 'Roof Texture #1',\r\n Texture02 = 'Roof Texture #2',\r\n Texture03 = 'Roof Texture #3',\r\n Texture04 = 'Roof Texture #4',\r\n Texture05 = 'Roof Texture #5',\r\n Texture06 = 'Roof Texture #6',\r\n Texture07 = 'Roof Texture #7',\r\n NoTexture = 'No Roof Texture',\r\n}\r\n\r\nexport enum WallSide {\r\n Left = 'Left',\r\n Right = 'Right',\r\n}\r\n\r\nexport enum ElementState {\r\n Valid = 'Valid',\r\n OverLap = 'OverLap',\r\n OutsideBoundary = 'OutsideBoundary',\r\n Invalid = 'Invalid',\r\n}\r\n\r\nexport type WallAbsPos = {\r\n leftPointAbsPos: Vector2;\r\n rightPointAbsPos: Vector2;\r\n centerPointAbsPos: Vector2;\r\n};\r\n\r\nexport enum RoofHandleType {\r\n Mid = 'Mid',\r\n Left = 'Left',\r\n Right = 'Right',\r\n TopMid = 'TopMid',\r\n TopLeft = 'TopLeft',\r\n TopRight = 'TopRight',\r\n FrontLeft = 'FrontLeft',\r\n FrontRight = 'FrontRight',\r\n BackLeft = 'BackLeft',\r\n BackRight = 'BackRight',\r\n Top = 'Top',\r\n Ridge = 'Ridge',\r\n Null = 'Null',\r\n}\r\n\r\nexport interface OldRooftopElementData {\r\n parentId: string;\r\n foundationId?: string;\r\n position: number[];\r\n rotation: number[];\r\n normal: number[];\r\n}\r\n\r\nexport type BoxArgs = [width?: number | undefined, height?: number | undefined, depth?: number | undefined];\r\n","export default __webpack_public_path__ + \"static/media/weather.b0a3f5ef.csv\";","export default __webpack_public_path__ + \"static/media/solar_radiation_horizontal.38eaf9ed.csv\";","export default __webpack_public_path__ + \"static/media/solar_radiation_vertical.522681a8.csv\";","export default __webpack_public_path__ + \"static/media/pvmodules.3e173704.csv\";","import {\r\n Euler,\r\n EventDispatcher,\r\n MOUSE,\r\n Quaternion,\r\n Spherical,\r\n TOUCH,\r\n Vector2,\r\n Vector3\r\n} from 'three';\r\n\r\n// This set of controls performs orbiting, dollying (zooming), and panning.\r\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n//\r\n// Orbit - left mouse / touch: one-finger move\r\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\r\n// Pan - right mouse, or left mouse + ctrl/meta, or arrow keys / touch: two-finger move\r\n\r\nconst _changeEvent = { type: 'change' };\r\nconst _startEvent = { type: 'start' };\r\nconst _endEvent = { type: 'end' };\r\n\r\nclass MyOrbitControls extends EventDispatcher {\r\n\r\n constructor( object, domElement ) {\r\n\r\n super();\r\n\r\n if ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter \"domElement\" is now mandatory.' );\r\n if ( domElement === document ) console.error( 'THREE.OrbitControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.' );\r\n\r\n this.object = object;\r\n this.domElement = domElement;\r\n this.domElement.style.touchAction = 'none'; // disable touch scroll\r\n\r\n // Set to false to disable this control\r\n this.enabled = true;\r\n\r\n // \"target\" sets the location of focus, where the object orbits around\r\n this.target = new Vector3();\r\n\r\n // How far you can dolly in and out ( PerspectiveCamera only )\r\n this.minDistance = 0;\r\n this.maxDistance = Infinity;\r\n\r\n // How far you can zoom in and out ( OrthographicCamera only )\r\n this.minZoom = 0;\r\n this.maxZoom = Infinity;\r\n\r\n // How far you can orbit vertically, upper and lower limits.\r\n // Range is 0 to Math.PI radians.\r\n this.minPolarAngle = 0; // radians\r\n this.maxPolarAngle = Math.PI; // radians\r\n\r\n // How far you can orbit horizontally, upper and lower limits.\r\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\r\n this.minAzimuthAngle = - Infinity; // radians\r\n this.maxAzimuthAngle = Infinity; // radians\r\n\r\n // Set to true to enable damping (inertia)\r\n // If damping is enabled, you must call controls.update() in your animation loop\r\n this.enableDamping = false;\r\n this.dampingFactor = 0.05;\r\n\r\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\r\n // Set to false to disable zooming\r\n this.enableZoom = true;\r\n this.zoomSpeed = 1.0;\r\n\r\n // Set to false to disable rotating\r\n this.enableRotate = true;\r\n this.rotateSpeed = 1.0;\r\n\r\n // Set to false to disable panning\r\n this.enablePan = true;\r\n this.panSpeed = 1.0;\r\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\r\n this.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\r\n\r\n // Set to true to automatically rotate around the target\r\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\r\n this.autoRotate = false;\r\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\r\n\r\n // The four arrow keys\r\n this.moveSpeed = 1;\r\n this.turnSpeed = 1;\r\n this.keys = {\r\n MOVE_LEFT: 'KeyA',\r\n MOVE_RIGHT: 'KeyD',\r\n MOVE_FORWARD: 'KeyW',\r\n MOVE_BACKWARD: 'KeyS',\r\n MOVE_UP: 'KeyZ',\r\n MOVE_DOWN: 'KeyX',\r\n ROTATE_LEFT: 'ArrowLeft',\r\n ROTATE_UP: 'ArrowUp',\r\n ROTATE_RIGHT: 'ArrowRight',\r\n ROTATE_DOWN: 'ArrowDown'\r\n };\r\n\r\n // Mouse buttons\r\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\r\n\r\n // Touch fingers\r\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\r\n\r\n // for reset\r\n this.target0 = this.target.clone();\r\n this.position0 = this.object.position.clone();\r\n this.zoom0 = this.object.zoom;\r\n\r\n // the target DOM element for key events\r\n this._domElementKeyEvents = null;\r\n\r\n //\r\n // public methods\r\n //\r\n\r\n this.getPolarAngle = function () {\r\n\r\n return spherical.phi;\r\n\r\n };\r\n\r\n this.getAzimuthalAngle = function () {\r\n\r\n return spherical.theta;\r\n\r\n };\r\n\r\n this.getDistance = function () {\r\n\r\n return this.object.position.distanceTo( this.target );\r\n\r\n };\r\n\r\n this.listenToKeyEvents = function ( domElement ) {\r\n\r\n domElement.addEventListener( 'keydown', onKeyDown );\r\n this._domElementKeyEvents = domElement;\r\n\r\n reverse = false;\r\n oldZ = 0\r\n\r\n };\r\n\r\n this.removeKeyEvents = function () {\r\n\r\n if ( scope._domElementKeyEvents !== null ) {\r\n\r\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\r\n\r\n }\r\n\r\n }\r\n\r\n this.saveState = function () {\r\n\r\n scope.target0.copy( scope.target );\r\n scope.position0.copy( scope.object.position );\r\n scope.zoom0 = scope.object.zoom;\r\n\r\n };\r\n\r\n this.reset = function () {\r\n\r\n scope.target.copy( scope.target0 );\r\n scope.object.position.copy( scope.position0 );\r\n scope.object.zoom = scope.zoom0;\r\n\r\n scope.object.updateProjectionMatrix();\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.update();\r\n\r\n state = STATE.NONE;\r\n\r\n };\r\n\r\n // this method is exposed, but perhaps it would be better if we can make it private...\r\n this.update = function () {\r\n\r\n const offset = new Vector3();\r\n\r\n // so camera.up is the orbit axis\r\n const quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\r\n const quatInverse = quat.clone().invert();\r\n\r\n const lastPosition = new Vector3();\r\n const lastQuaternion = new Quaternion();\r\n\r\n const twoPI = 2 * Math.PI;\r\n\r\n return function update() {\r\n\r\n const position = scope.object.position;\r\n\r\n offset.copy( position ).sub( scope.target );\r\n\r\n // rotate offset to \"y-axis-is-up\" space\r\n offset.applyQuaternion( quat );\r\n\r\n // angle from z-axis around y-axis\r\n spherical.setFromVector3( offset );\r\n\r\n if ( scope.autoRotate && state === STATE.NONE ) {\r\n\r\n rotateLeft( getAutoRotationAngle() );\r\n\r\n }\r\n\r\n if ( scope.enableDamping ) {\r\n\r\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\r\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\r\n\r\n } else {\r\n\r\n spherical.theta += sphericalDelta.theta;\r\n spherical.phi += sphericalDelta.phi;\r\n\r\n }\r\n\r\n // restrict theta to be between desired limits\r\n\r\n let min = scope.minAzimuthAngle;\r\n let max = scope.maxAzimuthAngle;\r\n\r\n if ( isFinite( min ) && isFinite( max ) ) {\r\n\r\n if ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\r\n\r\n if ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\r\n\r\n if ( min <= max ) {\r\n\r\n spherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\r\n\r\n } else {\r\n\r\n spherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\r\n Math.max( min, spherical.theta ) :\r\n Math.min( max, spherical.theta );\r\n\r\n }\r\n\r\n }\r\n\r\n // restrict phi to be between desired limits\r\n spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\r\n\r\n spherical.makeSafe();\r\n\r\n\r\n spherical.radius *= scale;\r\n\r\n // restrict radius to be between desired limits\r\n spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\r\n\r\n // move target to panned location\r\n\r\n if ( scope.enableDamping === true ) {\r\n\r\n scope.target.addScaledVector( panOffset, scope.dampingFactor );\r\n\r\n } else {\r\n\r\n scope.target.add( panOffset );\r\n\r\n }\r\n\r\n offset.setFromSpherical( spherical );\r\n\r\n // rotate offset back to \"camera-up-vector-is-up\" space\r\n offset.applyQuaternion( quatInverse );\r\n\r\n position.copy( scope.target ).add( offset );\r\n\r\n scope.object.lookAt( scope.target );\r\n\r\n if ( scope.enableDamping === true ) {\r\n\r\n sphericalDelta.theta *= ( 1 - scope.dampingFactor );\r\n sphericalDelta.phi *= ( 1 - scope.dampingFactor );\r\n\r\n panOffset.multiplyScalar( 1 - scope.dampingFactor );\r\n\r\n } else {\r\n\r\n sphericalDelta.set( 0, 0, 0 );\r\n\r\n panOffset.set( 0, 0, 0 );\r\n\r\n }\r\n\r\n scale = 1;\r\n\r\n // update condition is:\r\n // min(camera displacement, camera rotation in radians)^2 > EPS\r\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\r\n\r\n if ( zoomChanged ||\r\n lastPosition.distanceToSquared( scope.object.position ) > EPS ||\r\n 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n lastPosition.copy( scope.object.position );\r\n lastQuaternion.copy( scope.object.quaternion );\r\n zoomChanged = false;\r\n\r\n return true;\r\n\r\n }\r\n\r\n return false;\r\n\r\n };\r\n\r\n }();\r\n\r\n this.dispose = function () {\r\n\r\n scope.domElement.removeEventListener( 'contextmenu', onContextMenu );\r\n\r\n scope.domElement.removeEventListener( 'pointerdown', onPointerDown );\r\n scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );\r\n scope.domElement.removeEventListener( 'wheel', onMouseWheel );\r\n\r\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\r\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\r\n\r\n\r\n if ( scope._domElementKeyEvents !== null ) {\r\n\r\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\r\n\r\n }\r\n\r\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\r\n\r\n };\r\n\r\n //\r\n // internals\r\n //\r\n\r\n const scope = this;\r\n\r\n const STATE = {\r\n NONE: - 1,\r\n ROTATE: 0,\r\n DOLLY: 1,\r\n PAN: 2,\r\n TOUCH_ROTATE: 3,\r\n TOUCH_PAN: 4,\r\n TOUCH_DOLLY_PAN: 5,\r\n TOUCH_DOLLY_ROTATE: 6\r\n };\r\n\r\n let state = STATE.NONE;\r\n\r\n const EPS = 0.000001;\r\n\r\n // current position in spherical coordinates\r\n const spherical = new Spherical();\r\n const sphericalDelta = new Spherical();\r\n\r\n let scale = 1;\r\n const panOffset = new Vector3();\r\n let zoomChanged = false;\r\n\r\n const rotateStart = new Vector2();\r\n const rotateEnd = new Vector2();\r\n const rotateDelta = new Vector2();\r\n\r\n const panStart = new Vector2();\r\n const panEnd = new Vector2();\r\n const panDelta = new Vector2();\r\n\r\n const dollyStart = new Vector2();\r\n const dollyEnd = new Vector2();\r\n const dollyDelta = new Vector2();\r\n\r\n const pointers = [];\r\n const pointerPositions = {};\r\n\r\n // navigation\r\n let reverse = false;\r\n let oldZ = 0;\r\n\r\n function getAutoRotationAngle() {\r\n\r\n return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\r\n\r\n }\r\n\r\n function getZoomScale() {\r\n\r\n return Math.pow( 0.95, scope.zoomSpeed );\r\n\r\n }\r\n\r\n function rotateLeft( angle ) {\r\n\r\n sphericalDelta.theta -= angle;\r\n\r\n }\r\n\r\n function rotateUp( angle ) {\r\n\r\n sphericalDelta.phi -= angle;\r\n\r\n }\r\n\r\n const panLeft = function () {\r\n\r\n const v = new Vector3();\r\n\r\n return function panLeft( distance, objectMatrix ) {\r\n\r\n v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\r\n v.multiplyScalar( - distance );\r\n\r\n panOffset.add( v );\r\n\r\n };\r\n\r\n }();\r\n\r\n const panUp = function () {\r\n\r\n const v = new Vector3();\r\n\r\n return function panUp( distance, objectMatrix ) {\r\n\r\n if ( scope.screenSpacePanning === true ) {\r\n\r\n v.setFromMatrixColumn( objectMatrix, 1 );\r\n\r\n } else {\r\n\r\n v.setFromMatrixColumn( objectMatrix, 0 );\r\n v.crossVectors( scope.object.up, v );\r\n\r\n }\r\n\r\n v.multiplyScalar( distance );\r\n\r\n panOffset.add( v );\r\n\r\n };\r\n\r\n }();\r\n\r\n // deltaX and deltaY are in pixels; right and down are positive\r\n const pan = function () {\r\n\r\n const offset = new Vector3();\r\n\r\n return function pan( deltaX, deltaY ) {\r\n\r\n const element = scope.domElement;\r\n\r\n if ( scope.object.isPerspectiveCamera ) {\r\n\r\n // perspective\r\n const position = scope.object.position;\r\n offset.copy( position ).sub( scope.target );\r\n let targetDistance = offset.length();\r\n\r\n // half of the fov is center to top of screen\r\n targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\r\n\r\n // we use only clientHeight here so aspect ratio does not distort speed\r\n panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\r\n panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\r\n\r\n } else if ( scope.object.isOrthographicCamera ) {\r\n\r\n // orthographic\r\n panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\r\n panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\r\n\r\n } else {\r\n\r\n // camera neither orthographic nor perspective\r\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\r\n scope.enablePan = false;\r\n\r\n }\r\n\r\n };\r\n\r\n }();\r\n\r\n const moveUp = function() {\r\n\r\n const _vector = new Vector3();\r\n\r\n return function moveUp( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _vector.setFromMatrixColumn( camera.matrix, 1 );\r\n\r\n _vector.multiplyScalar( distance * 0.1 );\r\n\r\n camera.position.add(_vector)\r\n\r\n camera.position.z = Math.max(0, camera.position.z);\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n }();\r\n\r\n const moveForward = function() {\r\n\r\n const _vector = new Vector3();\r\n\r\n return function moveForward( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _vector.setFromMatrixColumn( camera.matrix, 0 );\r\n\r\n _vector.crossVectors( camera.up, _vector );\r\n\r\n _vector.multiplyScalar( distance * 0.1 );\r\n\r\n camera.position.add(_vector)\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n }();\r\n\r\n const moveRight = function() {\r\n\r\n const _vector = new Vector3();\r\n\r\n return function moveRight( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _vector.setFromMatrixColumn( camera.matrix, 0 );\r\n\r\n _vector.multiplyScalar( distance * 0.1 );\r\n\r\n camera.position.add( _vector );\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n }();\r\n\r\n const spinUp = function() {\r\n\r\n const _euler = new Euler( 0, 0, 0, 'ZXY' );\r\n\r\n return function spinUp( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _euler.setFromQuaternion( camera.quaternion );\r\n\r\n if ( Math.abs( Math.abs( _euler.z - oldZ ) - Math.PI ) < 0.01 ) {\r\n\r\n reverse = !reverse;\r\n\r\n }\r\n\r\n if ( reverse ) {\r\n\r\n _euler.x -= 0.01 * distance;\r\n\r\n } else {\r\n\r\n _euler.x += 0.01 * distance;\r\n\r\n }\r\n\r\n _euler.x = Math.max(0.1, _euler.x);\r\n\r\n oldZ = _euler.z;\r\n\r\n camera.quaternion.setFromEuler( _euler );\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n }();\r\n\r\n const spinRight = function() {\r\n\r\n const _euler = new Euler( 0, 0, 0, 'ZXY' );\r\n\r\n return function rotateRight( distance ) {\r\n\r\n const camera = scope.object;\r\n\r\n _euler.setFromQuaternion( camera.quaternion );\r\n\r\n _euler.z -= 0.01 * distance;\r\n\r\n camera.quaternion.setFromEuler( _euler );\r\n\r\n scope.dispatchEvent( _changeEvent );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n }();\r\n\r\n function dollyOut( dollyScale ) {\r\n\r\n if ( scope.object.isPerspectiveCamera ) {\r\n\r\n scale /= dollyScale;\r\n\r\n } else if ( scope.object.isOrthographicCamera ) {\r\n\r\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\r\n scope.object.updateProjectionMatrix();\r\n zoomChanged = true;\r\n\r\n } else {\r\n\r\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\r\n scope.enableZoom = false;\r\n\r\n }\r\n\r\n }\r\n\r\n function dollyIn( dollyScale ) {\r\n\r\n if ( scope.object.isPerspectiveCamera ) {\r\n\r\n scale *= dollyScale;\r\n\r\n } else if ( scope.object.isOrthographicCamera ) {\r\n\r\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\r\n scope.object.updateProjectionMatrix();\r\n zoomChanged = true;\r\n\r\n } else {\r\n\r\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\r\n scope.enableZoom = false;\r\n\r\n }\r\n\r\n }\r\n\r\n //\r\n // event callbacks - update the object state\r\n //\r\n\r\n function handleMouseDownRotate( event ) {\r\n\r\n rotateStart.set( event.clientX, event.clientY );\r\n\r\n }\r\n\r\n function handleMouseDownDolly( event ) {\r\n\r\n dollyStart.set( event.clientX, event.clientY );\r\n\r\n }\r\n\r\n function handleMouseDownPan( event ) {\r\n\r\n panStart.set( event.clientX, event.clientY );\r\n\r\n }\r\n\r\n function handleMouseMoveRotate( event ) {\r\n\r\n rotateEnd.set( event.clientX, event.clientY );\r\n\r\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\r\n\r\n const element = scope.domElement;\r\n\r\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\r\n\r\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\r\n\r\n rotateStart.copy( rotateEnd );\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n function handleMouseMoveDolly( event ) {\r\n\r\n dollyEnd.set( event.clientX, event.clientY );\r\n\r\n dollyDelta.subVectors( dollyEnd, dollyStart );\r\n\r\n if ( dollyDelta.y > 0 ) {\r\n\r\n dollyOut( getZoomScale() );\r\n\r\n } else if ( dollyDelta.y < 0 ) {\r\n\r\n dollyIn( getZoomScale() );\r\n\r\n }\r\n\r\n dollyStart.copy( dollyEnd );\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n function handleMouseMovePan( event ) {\r\n\r\n panEnd.set( event.clientX, event.clientY );\r\n\r\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\r\n\r\n pan( panDelta.x, panDelta.y );\r\n\r\n panStart.copy( panEnd );\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n function handleMouseWheel( event ) {\r\n\r\n if ( event.deltaY < 0 ) {\r\n\r\n dollyIn( getZoomScale() );\r\n\r\n } else if ( event.deltaY > 0 ) {\r\n\r\n dollyOut( getZoomScale() );\r\n\r\n }\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n function handleKeyDown( event ) {\r\n\r\n let needsUpdate = false;\r\n\r\n switch ( event.code ) {\r\n\r\n case scope.keys.MOVE_FORWARD:\r\n moveForward(scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_BACKWARD:\r\n moveForward(-scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_UP:\r\n moveUp(scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_DOWN:\r\n moveUp(-scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_RIGHT:\r\n moveRight(scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.MOVE_LEFT:\r\n moveRight(-scope.moveSpeed);\r\n break;\r\n\r\n case scope.keys.ROTATE_UP:\r\n spinUp(scope.turnSpeed);\r\n break;\r\n\r\n case scope.keys.ROTATE_DOWN:\r\n spinUp(-scope.turnSpeed);\r\n break;\r\n\r\n case scope.keys.ROTATE_LEFT:\r\n spinRight( -scope.turnSpeed );\r\n break;\r\n\r\n case scope.keys.ROTATE_RIGHT:\r\n spinRight( scope.turnSpeed );\r\n break;\r\n\r\n }\r\n\r\n if ( needsUpdate ) {\r\n\r\n // prevent the browser from scrolling on cursor keys\r\n event.preventDefault();\r\n\r\n scope.update();\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n function handleTouchStartRotate() {\r\n\r\n if ( pointers.length === 1 ) {\r\n\r\n rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\r\n\r\n } else {\r\n\r\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\r\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\r\n\r\n rotateStart.set( x, y );\r\n\r\n }\r\n\r\n }\r\n\r\n function handleTouchStartPan() {\r\n\r\n if ( pointers.length === 1 ) {\r\n\r\n panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\r\n\r\n } else {\r\n\r\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\r\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\r\n\r\n panStart.set( x, y );\r\n\r\n }\r\n\r\n }\r\n\r\n function handleTouchStartDolly() {\r\n\r\n const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;\r\n const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;\r\n\r\n const distance = Math.sqrt( dx * dx + dy * dy );\r\n\r\n dollyStart.set( 0, distance );\r\n\r\n }\r\n\r\n function handleTouchStartDollyPan() {\r\n\r\n if ( scope.enableZoom ) handleTouchStartDolly();\r\n\r\n if ( scope.enablePan ) handleTouchStartPan();\r\n\r\n }\r\n\r\n function handleTouchStartDollyRotate() {\r\n\r\n if ( scope.enableZoom ) handleTouchStartDolly();\r\n\r\n if ( scope.enableRotate ) handleTouchStartRotate();\r\n\r\n }\r\n\r\n function handleTouchMoveRotate( event ) {\r\n\r\n if ( pointers.length === 1 ) {\r\n\r\n rotateEnd.set( event.pageX, event.pageY );\r\n\r\n } else {\r\n\r\n const position = getSecondPointerPosition( event );\r\n\r\n const x = 0.5 * ( event.pageX + position.x );\r\n const y = 0.5 * ( event.pageY + position.y );\r\n\r\n rotateEnd.set( x, y );\r\n\r\n }\r\n\r\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\r\n\r\n const element = scope.domElement;\r\n\r\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\r\n\r\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\r\n\r\n rotateStart.copy( rotateEnd );\r\n\r\n }\r\n\r\n function handleTouchMovePan( event ) {\r\n\r\n if ( pointers.length === 1 ) {\r\n\r\n panEnd.set( event.pageX, event.pageY );\r\n\r\n } else {\r\n\r\n const position = getSecondPointerPosition( event );\r\n\r\n const x = 0.5 * ( event.pageX + position.x );\r\n const y = 0.5 * ( event.pageY + position.y );\r\n\r\n panEnd.set( x, y );\r\n\r\n }\r\n\r\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\r\n\r\n pan( panDelta.x, panDelta.y );\r\n\r\n panStart.copy( panEnd );\r\n\r\n }\r\n\r\n function handleTouchMoveDolly( event ) {\r\n\r\n const position = getSecondPointerPosition( event );\r\n\r\n const dx = event.pageX - position.x;\r\n const dy = event.pageY - position.y;\r\n\r\n const distance = Math.sqrt( dx * dx + dy * dy );\r\n\r\n dollyEnd.set( 0, distance );\r\n\r\n dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\r\n\r\n dollyOut( dollyDelta.y );\r\n\r\n dollyStart.copy( dollyEnd );\r\n\r\n }\r\n\r\n function handleTouchMoveDollyPan( event ) {\r\n\r\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\r\n\r\n if ( scope.enablePan ) handleTouchMovePan( event );\r\n\r\n }\r\n\r\n function handleTouchMoveDollyRotate( event ) {\r\n\r\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\r\n\r\n if ( scope.enableRotate ) handleTouchMoveRotate( event );\r\n\r\n }\r\n\r\n //\r\n // event handlers - FSM: listen for events and reset state\r\n //\r\n\r\n function onPointerDown( event ) {\r\n\r\n if ( scope.enabled === false ) return;\r\n\r\n if ( pointers.length === 0 ) {\r\n\r\n scope.domElement.setPointerCapture( event.pointerId );\r\n\r\n scope.domElement.addEventListener( 'pointermove', onPointerMove );\r\n scope.domElement.addEventListener( 'pointerup', onPointerUp );\r\n\r\n }\r\n\r\n //\r\n\r\n addPointer( event );\r\n\r\n if ( event.pointerType === 'touch' ) {\r\n\r\n onTouchStart( event );\r\n\r\n } else {\r\n\r\n onMouseDown( event );\r\n\r\n }\r\n\r\n }\r\n\r\n function onPointerMove( event ) {\r\n\r\n if ( scope.enabled === false ) return;\r\n\r\n if ( event.pointerType === 'touch' ) {\r\n\r\n onTouchMove( event );\r\n\r\n } else {\r\n\r\n onMouseMove( event );\r\n\r\n }\r\n\r\n }\r\n\r\n function onPointerUp( event ) {\r\n\r\n removePointer( event );\r\n\r\n if ( pointers.length === 0 ) {\r\n\r\n scope.domElement.releasePointerCapture( event.pointerId );\r\n\r\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\r\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\r\n\r\n }\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n function onPointerCancel( event ) {\r\n\r\n removePointer( event );\r\n\r\n }\r\n\r\n function onMouseDown( event ) {\r\n\r\n let mouseAction;\r\n\r\n switch ( event.button ) {\r\n\r\n case 0:\r\n\r\n mouseAction = scope.mouseButtons.LEFT;\r\n break;\r\n\r\n case 1:\r\n\r\n mouseAction = scope.mouseButtons.MIDDLE;\r\n break;\r\n\r\n case 2:\r\n\r\n mouseAction = scope.mouseButtons.RIGHT;\r\n break;\r\n\r\n default:\r\n\r\n mouseAction = - 1;\r\n\r\n }\r\n\r\n switch ( mouseAction ) {\r\n\r\n case MOUSE.DOLLY:\r\n\r\n if ( scope.enableZoom === false ) return;\r\n\r\n handleMouseDownDolly( event );\r\n\r\n state = STATE.DOLLY;\r\n\r\n break;\r\n\r\n case MOUSE.ROTATE:\r\n\r\n // XIE: Default to pan in 2D mode\r\n if(scope.object.isOrthographicCamera) {\r\n\r\n if (scope.enablePan === false) return;\r\n\r\n handleMouseDownPan(event);\r\n\r\n state = STATE.PAN;\r\n\r\n } else {\r\n\r\n if (event.ctrlKey || event.metaKey) {\r\n\r\n if (scope.enablePan === false) return;\r\n\r\n handleMouseDownPan(event);\r\n\r\n state = STATE.PAN;\r\n\r\n } else {\r\n\r\n if (scope.enableRotate === false) return;\r\n\r\n handleMouseDownRotate(event);\r\n\r\n state = STATE.ROTATE;\r\n\r\n }\r\n\r\n }\r\n\r\n break;\r\n\r\n case MOUSE.PAN:\r\n\r\n if ( event.ctrlKey || event.metaKey ) {\r\n\r\n if ( scope.enableRotate === false ) return;\r\n\r\n handleMouseDownRotate( event );\r\n\r\n state = STATE.ROTATE;\r\n\r\n } else {\r\n\r\n if ( scope.enablePan === false ) return;\r\n\r\n handleMouseDownPan( event );\r\n\r\n state = STATE.PAN;\r\n\r\n }\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n if ( state !== STATE.NONE ) {\r\n\r\n scope.dispatchEvent( _startEvent );\r\n\r\n }\r\n\r\n }\r\n\r\n function onMouseMove( event ) {\r\n\r\n if ( scope.enabled === false ) return;\r\n\r\n switch ( state ) {\r\n\r\n case STATE.ROTATE:\r\n\r\n if ( scope.enableRotate === false ) return;\r\n\r\n handleMouseMoveRotate( event );\r\n\r\n break;\r\n\r\n case STATE.DOLLY:\r\n\r\n if ( scope.enableZoom === false ) return;\r\n\r\n handleMouseMoveDolly( event );\r\n\r\n break;\r\n\r\n case STATE.PAN:\r\n\r\n if ( scope.enablePan === false ) return;\r\n\r\n handleMouseMovePan( event );\r\n\r\n break;\r\n\r\n }\r\n\r\n }\r\n\r\n function onMouseWheel( event ) {\r\n\r\n if ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\r\n\r\n event.preventDefault();\r\n\r\n scope.dispatchEvent( _startEvent );\r\n\r\n handleMouseWheel( event );\r\n\r\n scope.dispatchEvent( _endEvent );\r\n\r\n }\r\n\r\n function onKeyDown( event ) {\r\n\r\n if ( scope.enabled === false || scope.enablePan === false ) return;\r\n\r\n handleKeyDown( event );\r\n\r\n }\r\n\r\n function onTouchStart( event ) {\r\n\r\n trackPointer( event );\r\n\r\n switch ( pointers.length ) {\r\n\r\n case 1:\r\n\r\n switch ( scope.touches.ONE ) {\r\n\r\n case TOUCH.ROTATE:\r\n\r\n if ( scope.enableRotate === false ) return;\r\n\r\n handleTouchStartRotate();\r\n\r\n state = STATE.TOUCH_ROTATE;\r\n\r\n break;\r\n\r\n case TOUCH.PAN:\r\n\r\n if ( scope.enablePan === false ) return;\r\n\r\n handleTouchStartPan();\r\n\r\n state = STATE.TOUCH_PAN;\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n break;\r\n\r\n case 2:\r\n\r\n switch ( scope.touches.TWO ) {\r\n\r\n case TOUCH.DOLLY_PAN:\r\n\r\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\r\n\r\n handleTouchStartDollyPan();\r\n\r\n state = STATE.TOUCH_DOLLY_PAN;\r\n\r\n break;\r\n\r\n case TOUCH.DOLLY_ROTATE:\r\n\r\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\r\n\r\n handleTouchStartDollyRotate();\r\n\r\n state = STATE.TOUCH_DOLLY_ROTATE;\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n if ( state !== STATE.NONE ) {\r\n\r\n scope.dispatchEvent( _startEvent );\r\n\r\n }\r\n\r\n }\r\n\r\n function onTouchMove( event ) {\r\n\r\n trackPointer( event );\r\n\r\n switch ( state ) {\r\n\r\n case STATE.TOUCH_ROTATE:\r\n\r\n if ( scope.enableRotate === false ) return;\r\n\r\n handleTouchMoveRotate( event );\r\n\r\n scope.update();\r\n\r\n break;\r\n\r\n case STATE.TOUCH_PAN:\r\n\r\n if ( scope.enablePan === false ) return;\r\n\r\n handleTouchMovePan( event );\r\n\r\n scope.update();\r\n\r\n break;\r\n\r\n case STATE.TOUCH_DOLLY_PAN:\r\n\r\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\r\n\r\n handleTouchMoveDollyPan( event );\r\n\r\n scope.update();\r\n\r\n break;\r\n\r\n case STATE.TOUCH_DOLLY_ROTATE:\r\n\r\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\r\n\r\n handleTouchMoveDollyRotate( event );\r\n\r\n scope.update();\r\n\r\n break;\r\n\r\n default:\r\n\r\n state = STATE.NONE;\r\n\r\n }\r\n\r\n }\r\n\r\n function onContextMenu( event ) {\r\n\r\n if ( scope.enabled === false ) return;\r\n\r\n event.preventDefault();\r\n\r\n }\r\n\r\n function addPointer( event ) {\r\n\r\n pointers.push( event );\r\n\r\n }\r\n\r\n function removePointer( event ) {\r\n\r\n delete pointerPositions[ event.pointerId ];\r\n\r\n for ( let i = 0; i < pointers.length; i ++ ) {\r\n\r\n if ( pointers[ i ].pointerId === event.pointerId ) {\r\n\r\n pointers.splice( i, 1 );\r\n return;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function trackPointer( event ) {\r\n\r\n let position = pointerPositions[ event.pointerId ];\r\n\r\n if ( position === undefined ) {\r\n\r\n position = new Vector2();\r\n pointerPositions[ event.pointerId ] = position;\r\n\r\n }\r\n\r\n position.set( event.pageX, event.pageY );\r\n\r\n }\r\n\r\n function getSecondPointerPosition( event ) {\r\n\r\n const pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ];\r\n\r\n return pointerPositions[ pointer.pointerId ];\r\n\r\n }\r\n\r\n //\r\n\r\n scope.domElement.addEventListener( 'contextmenu', onContextMenu );\r\n\r\n scope.domElement.addEventListener( 'pointerdown', onPointerDown );\r\n scope.domElement.addEventListener( 'pointercancel', onPointerCancel );\r\n scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );\r\n\r\n // force an update at start\r\n\r\n this.update();\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n// This set of controls performs orbiting, dollying (zooming), and panning.\r\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\r\n// This is very similar to OrbitControls, another set of touch behavior\r\n//\r\n// Orbit - right mouse, or left mouse + ctrl/meta / touch: two-finger rotate\r\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\r\n// Pan - left mouse, or arrow keys / touch: one-finger move\r\n\r\nclass MapControls extends MyOrbitControls {\r\n\r\n constructor( object, domElement ) {\r\n\r\n super( object, domElement );\r\n\r\n this.screenSpacePanning = false; // pan orthogonal to world-space direction camera.up\r\n\r\n this.mouseButtons.LEFT = MOUSE.PAN;\r\n this.mouseButtons.RIGHT = MOUSE.ROTATE;\r\n\r\n this.touches.ONE = TOUCH.PAN;\r\n this.touches.TWO = TOUCH.DOLLY_ROTATE;\r\n\r\n }\r\n\r\n}\r\n\r\nexport { MyOrbitControls, MapControls };\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport {BufferGeometry, Float32BufferAttribute, Vector3} from \"three\";\n\nclass ParabolicCylinderGeometry extends BufferGeometry {\n\n constructor( semiLatusRectum = 1, width = 2, length = 3, widthSegments = 8, lengthSegments = 1) {\n\n super();\n this.type = 'ParabolicCylinderGeometry';\n\n this.parameters = {\n semilatusRectum: semiLatusRectum,\n width: width,\n height: length,\n widthSegments: widthSegments,\n lengthSegments: lengthSegments,\n };\n\n const scope = this;\n widthSegments = Math.floor( widthSegments );\n lengthSegments = Math.floor( lengthSegments );\n\n // buffers\n const indices = [];\n const vertices = [];\n const normals = [];\n const uvs = [];\n\n // helper variables\n let index = 0;\n const indexArray = [];\n const halfHeight = length / 2;\n let groupStart = 0;\n\n // generate geometry\n generateTorso();\n\n // build geometry\n this.setIndex( indices );\n this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n function generateTorso() {\n\n const normal = new Vector3();\n const vertex = new Vector3();\n let groupCount = 0;\n const u0 = -0.5;\n const du = 1 / widthSegments;\n const max = width/semiLatusRectum;\n\n // generate vertices, normals and uvs\n // the parametric equation of a parabola y = x^2/(4a) is x = 2at, y = at^2, where 2a is the semi-latus rectum\n for ( let y = 0; y <= lengthSegments; y ++ ) {\n const indexRow = [];\n const v = y / lengthSegments;\n // current row\n for ( let x = 0; x <= widthSegments; x ++ ) {\n const u = u0 + x * du;\n const t = u * max;\n // vertex\n vertex.x = semiLatusRectum * t;\n vertex.y = - v * length + halfHeight;\n vertex.z = semiLatusRectum * t * t / 2;\n vertices.push( vertex.x, vertex.y, vertex.z );\n\n // normal vector: (-dy/du, dx/du), tangential vector: (dx/du, dy/du)\n normal.set( -semiLatusRectum * t, 0, semiLatusRectum ).normalize();\n normals.push( normal.x, normal.y, normal.z );\n\n // uv (make sure that u and v are within 0 and 1)\n uvs.push( u - u0, 1 - v );\n\n // save index of vertex in respective row\n indexRow.push( index ++ );\n }\n\n // now save vertices of the row in our index array\n indexArray.push( indexRow );\n\n }\n\n // generate indices\n for ( let x = 0; x < widthSegments; x ++ ) {\n for ( let y = 0; y < lengthSegments; y ++ ) {\n // we use the index array to access the correct indices\n const a = indexArray[ y ][ x ];\n const b = indexArray[ y + 1 ][ x ];\n const c = indexArray[ y + 1 ][ x + 1 ];\n const d = indexArray[ y ][ x + 1 ];\n // faces\n indices.push( a, b, d );\n indices.push( b, c, d );\n // update group counter\n groupCount += 6;\n }\n }\n\n // add a group to the geometry. this will ensure multi material support\n scope.addGroup( groupStart, groupCount, 0 );\n\n // calculate new start value for groups\n groupStart += groupCount;\n\n }\n\n }\n\n static fromJSON( data ) {\n return new ParabolicCylinderGeometry( data.semiLatusRectum, data.width, data.height, data.widthSegments, data.lengthSegments );\n }\n\n}\n\nexport { ParabolicCylinderGeometry };\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport {BufferGeometry, Float32BufferAttribute, Vector3} from \"three\";\n\n// paraboloid of revolution: z = (x^2 + y^2) / a, where a is the latus rectum (twice of the semi-latus rectum)\n\nclass ParaboloidGeometry extends BufferGeometry {\n\n constructor( semiLatusRectum = 1, rimRadius = 1, radialSegments = 16, depthSegments = 4) {\n\n super();\n this.type = 'ParaboloidGeometry';\n\n this.parameters = {\n semilatusRectum: semiLatusRectum,\n rimRadius: rimRadius,\n radialSegments: radialSegments,\n depthSegments: depthSegments\n };\n\n radialSegments = Math.max( 3, Math.floor( radialSegments ) );\n depthSegments = Math.max( 2, Math.floor( depthSegments ) );\n\n let index = 0;\n const grid = [];\n\n const vertex = new Vector3();\n const normal = new Vector3();\n const tangent1 = new Vector3();\n const tangent2 = new Vector3();\n\n // buffers\n\n const indices = [];\n const vertices = [];\n const normals = [];\n const uvs = [];\n\n const TWO_PI = Math.PI * 2;\n const maxY = rimRadius / semiLatusRectum;\n const dy = 1 / depthSegments;\n let cos, sin;\n\n // generate vertices, normals and uvs\n\n for ( let iy = 0; iy <= depthSegments; iy ++ ) {\n\n const verticesRow = [];\n\n const v = iy * dy;\n const t = v * maxY;\n\n // special case for the bottom\n // let uOffset = 0;\n // if ( iy === 0) {\n // uOffset = 0.5 / radialSegments;\n // }\n\n for ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n const u = ix / radialSegments;\n cos = Math.cos( u * TWO_PI );\n sin = Math.sin( u * TWO_PI );\n\n // vertex\n vertex.x = semiLatusRectum * cos * t;\n vertex.y = semiLatusRectum * sin * t;\n vertex.z = semiLatusRectum * t * t / 2;\n vertices.push( vertex.x, vertex.y, vertex.z );\n\n // tangential vectors\n tangent1.set(semiLatusRectum * sin, -semiLatusRectum * cos, semiLatusRectum * t).normalize();\n tangent2.set(cos, sin, 0);\n\n // normal vector\n normal.crossVectors(tangent1, tangent2);\n normals.push( normal.x, normal.y, normal.z );\n\n // uv\n uvs.push( 0.5 * v * cos + 0.5, 0.5 * v * sin + 0.5 );\n\n verticesRow.push( index ++ );\n\n }\n\n grid.push( verticesRow );\n\n }\n\n // indices\n for ( let iy = 0; iy < depthSegments; iy ++ ) {\n for ( let ix = 0; ix < radialSegments; ix ++ ) {\n const a = grid[ iy ][ ix + 1 ];\n const b = grid[ iy ][ ix ];\n const c = grid[ iy + 1 ][ ix ];\n const d = grid[ iy + 1 ][ ix + 1 ];\n if ( iy !== 0) indices.push( a, b, d );\n if ( iy !== depthSegments - 1) {\n indices.push( b, c, d );\n } else if ( iy === depthSegments - 1) {\n indices.push( a, b, c);\n indices.push( a, c, d );\n }\n }\n }\n\n // build geometry\n this.setIndex( indices );\n this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n }\n\n static fromJSON( data ) {\n return new ParaboloidGeometry(data.semiLatusRectum, data.rimRadius, data.radialSegments, data.depthSegments);\n }\n\n}\n\nexport { ParaboloidGeometry };\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport * as THREE from 'three';\nimport { Euler } from 'three';\nimport { ConvexHull } from 'three/examples/jsm/math/ConvexHull.js';\n\nclass ConvexGeometry extends THREE.BufferGeometry {\n constructor(points, angle, length) {\n super();\n\n const vertices = [];\n const normals = [];\n const uvs = [];\n const euler = new Euler(0, 0, angle);\n\n const convexHull = new ConvexHull().setFromPoints(points);\n\n const faces = convexHull.faces;\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i];\n let edge = face.edge;\n do {\n const point = edge.head().point;\n vertices.push(point.x, point.y, point.z);\n normals.push(face.normal.x, face.normal.y, face.normal.z);\n\n const p = point.clone().applyEuler(euler);\n\n const l2 = Math.sqrt(length * length + p.z * p.z);\n const y = p.y * l2 / length;\n uvs.push(p.x, y);\n\n edge = edge.next;\n } while (edge !== face.edge);\n }\n\n this.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n this.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));\n this.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));\n }\n}\n\nexport { ConvexGeometry };\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport { ElementModel } from './ElementModel';\nimport { WallTexture } from 'src/types';\n\nexport interface WallModel extends ElementModel {\n // using ly as wall thickness\n relativeAngle: number;\n leftPoint: number[];\n rightPoint: number[];\n leftJoints: string[];\n rightJoints: string[];\n textureType: WallTexture;\n\n roofId?: string | null;\n leftRoofHeight?: number;\n rightRoofHeight?: number;\n centerRoofHeight?: number[]; // [x, h];\n centerLeftRoofHeight?: number[]; // [x, h];\n centerRightRoofHeight?: number[]; // [x, h];\n\n wallStructure?: WallStructure;\n structureSpacing?: number;\n structureWidth?: number;\n structureColor?: string;\n\n opacity?: number;\n rValue: number;\n volumetricHeatCapacity: number;\n\n fill: WallFill;\n leftUnfilledHeight: number;\n rightUnfilledHeight: number;\n leftTopPartialHeight: number;\n rightTopPartialHeight: number;\n\n // When a wall is not full (partial or empty), is it open to the outside?\n // If so, this would result in a lot of heat exchange. By default, it is not.\n openToOutside?: boolean;\n\n eavesLength: number;\n\n parapet: ParapetArgs;\n\n // old property\n unfilledHeight?: number;\n}\n\nexport interface ParapetArgs {\n display: boolean;\n color: string;\n textureType: WallTexture;\n parapetHeight: number;\n copingsWidth: number;\n copingsHeight: number;\n}\n\nexport enum WallFill {\n Full = 'Full',\n Partial = 'Partial',\n Empty = 'Empty',\n}\n\nexport enum WallStructure {\n Default = 'Default',\n Stud = 'Stud',\n Pillar = 'Pillar',\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Color, Euler, Vector2, Vector3 } from 'three';\n\nexport const VERSION = '1.4.3';\n\nexport const isProd = process.env.NODE_ENV === 'production';\n\nexport const HOME_URL: string = isProd\n ? 'https://institute-for-future-intelligence.github.io/aladdin/'\n : 'http://localhost:3000/aladdin';\n\nexport const DEFAULT_ADDRESS = 'Natick, MA';\nexport const PRESET_COLORS = ['#627682', '#8884d8', '#f97356', '#1bc32c', '#c6502d', '#82ca9d', '#3eaec0', '#445111'];\n\nexport const Z_INDEX_FRONT_PANEL = 15;\n\nexport const UNDO_SHOW_INFO_DURATION = 0.5;\nexport const FLOATING_WINDOW_OPACITY = 0.8;\nexport const BLUE = new Color(0, 0, 1);\nexport const GREEN = new Color(0, 1, 0);\nexport const YELLOW = new Color(1, 1, 0);\nexport const RED = new Color(1, 0, 0);\nexport const SOLAR_HEATMAP_COLORS = [BLUE, GREEN, YELLOW, RED];\nexport const DEFAULT_HEAT_FLUX_SCALE_FACTOR = 20;\nexport const DEFAULT_HEAT_FLUX_COLOR = 'gray';\nexport const DEFAULT_HEAT_FLUX_WIDTH = 0.5;\nexport const DEFAULT_HEAT_FLUX_DENSITY_FACTOR = 4;\n\nexport const DEFAULT_GROUND_FLOOR_R_VALUE = 2;\nexport const DEFAULT_WALL_R_VALUE = 2;\nexport const DEFAULT_ROOF_R_VALUE = 2;\nexport const DEFAULT_CEILING_R_VALUE = 2;\nexport const DEFAULT_WINDOW_U_VALUE = 2;\nexport const DEFAULT_DOOR_U_VALUE = 1;\nexport const DEFAULT_FOUNDATION_SLAB_DEPTH = 1;\n\nexport const DEFAULT_SOLAR_PANEL_SHININESS = 100;\nexport const DEFAULT_WINDOW_SHININESS = 200;\nexport const SOLAR_PANEL_BLUE_SPECULAR = '#3BB9FF';\nexport const SOLAR_PANEL_BLACK_SPECULAR = '#36454F';\n\nexport const DEFAULT_MODEL_MAP_ZOOM = 10;\nexport const LAT_LNG_FRACTION_DIGITS = 4;\n\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nexport const DEFAULT_LEAF_OUT_DAY = 105;\nexport const DEFAULT_LEAF_OFF_DAY = 320;\n\nexport const DEFAULT_SKY_RADIUS = 5000;\nexport const DEFAULT_FOV = 45;\nexport const DEFAULT_FAR = 10_000;\nexport const STARLIGHT_INTENSITY = 0.1;\n\nexport const MOVE_HANDLE_RADIUS = 0.1;\nexport const RESIZE_HANDLE_SIZE = 0.16;\n\nexport const MOVE_HANDLE_COLOR_1 = 'orange';\nexport const MOVE_HANDLE_COLOR_2 = 'orchid';\nexport const MOVE_HANDLE_COLOR_3 = 'pink';\nexport const RESIZE_HANDLE_COLOR = 'white';\nexport const HIGHLIGHT_HANDLE_COLOR = 'red';\nexport const LOCKED_ELEMENT_SELECTION_COLOR = 'yellow';\n\nexport const GRID_RATIO = 5;\nexport const FINE_GRID_SCALE = 0.1;\nexport const NORMAL_GRID_SCALE = GRID_RATIO * FINE_GRID_SCALE;\n\n// solar panel texture\nexport const RESOLUTION = 250;\nexport const MARGIN_PERCENT = 0.01;\nexport const GAP_PERCENT = 0.005;\nexport const SOLAR_PANEL_CELL_COLOR_BLACK = '#000';\nexport const SOLAR_PANEL_CELL_COLOR_BLUE = '#01345B';\n\nexport const INVALID_ELEMENT_COLOR = '#fe6f5e';\n\nexport const GROUND_ID = 'Ground';\n\nexport const HALF_PI = Math.PI / 2;\n\nexport const TWO_PI = Math.PI * 2;\n\nexport const ZERO_TOLERANCE = 0.0001;\n\nexport const UNIT_VECTOR_POS_Z_ARRAY = [0, 0, 1];\n\nexport const UNIT_VECTOR_NEG_Y_ARRAY = [0, -1, 0];\n\nexport const UNIT_VECTOR_POS_X = new Vector3(1, 0, 0);\n\nexport const UNIT_VECTOR_NEG_X = new Vector3(-1, 0, 0);\n\nexport const UNIT_VECTOR_POS_Y = new Vector3(0, 1, 0);\n\nexport const UNIT_VECTOR_NEG_Y = new Vector3(0, -1, 0);\n\nexport const UNIT_VECTOR_POS_Z = new Vector3(0, 0, 1);\n\nexport const UNIT_VECTOR_NEG_Z = new Vector3(0, 0, -1);\n\nexport const ORIGIN_VECTOR2 = new Vector2(0, 0);\n\nexport const ORIGIN_VECTOR3 = new Vector3(0, 0, 0);\n\nexport const PARABOLIC_DISH_STRUCTURE_CENTRAL_POLE = 1;\n\nexport const PARABOLIC_DISH_STRUCTURE_TRIPOD = 2;\n\nexport const HALF_PI_Z_EULER = new Euler(0, 0, HALF_PI);\n\nexport const REGEX_ALLOWABLE_IN_NAME = /^[A-Za-z0-9\\s-_()!?%&,]*$/;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nexport class Rectangle {\n x: number;\n y: number;\n width: number;\n height: number;\n\n constructor(x: number, y: number, width: number, height: number) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n centerX(): number {\n return this.x + this.width / 2;\n }\n\n centerY(): number {\n return this.y + this.height / 2;\n }\n\n minX(): number {\n return this.x;\n }\n\n maxX(): number {\n return this.x + this.width;\n }\n\n minY(): number {\n return this.y;\n }\n\n maxY(): number {\n return this.y + this.height;\n }\n\n contains(x: number, y: number): boolean {\n return x > this.x && x < this.x + this.width && y > this.y && y < this.y + this.height;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { RoofTexture } from 'src/types';\nimport { ElementModel } from './ElementModel';\n\nexport interface RoofModel extends ElementModel {\n wallsId: string[];\n roofType: RoofType;\n roofStructure?: RoofStructure;\n textureType: RoofTexture;\n thickness: number;\n sideColor?: string;\n rafterSpacing?: number;\n rafterWidth?: number;\n rafterColor?: string;\n glassTint?: string;\n opacity?: number;\n rValue: number;\n volumetricHeatCapacity: number;\n rise: number;\n ceiling: boolean;\n ceilingRValue?: number;\n // old files\n overhang?: number;\n}\n\nexport interface PyramidRoofModel extends RoofModel {}\nexport interface GableRoofModel extends RoofModel {\n ridgeLeftPoint: number[];\n ridgeRightPoint: number[];\n}\nexport interface HipRoofModel extends RoofModel {\n rightRidgeLength: number;\n leftRidgeLength: number;\n}\n\nexport interface GambrelRoofModel extends RoofModel {\n // [x, h] from left side view\n topRidgePoint: number[];\n frontRidgePoint: number[]; // x >= 0\n backRidgePoint: number[]; // x <= 0\n // old files\n topRidgeLeftPoint?: number[];\n topRidgeRightPoint?: number[];\n frontRidgeLeftPoint?: number[];\n frontRidgeRightPoint?: number[];\n backRidgeLeftPoint?: number[];\n backRidgeRightPoint?: number[];\n}\n\nexport interface MansardRoofModel extends RoofModel {\n ridgeWidth: number;\n // old files\n frontRidge?: number;\n backRidge?: number;\n}\n\nexport interface Point3 {\n x: number;\n y: number;\n z: number;\n}\n\nexport enum RoofType {\n Pyramid = 'Pyramid',\n Gable = 'Gable',\n Hip = 'Hip',\n Gambrel = 'Gambrel',\n Mansard = 'Mansard',\n}\n\nexport enum RoofStructure {\n Default = 'Default',\n Rafter = 'Rafter',\n Glass = 'Glass',\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { ObjectType } from 'src/types';\nimport { ElementModel } from './ElementModel';\n\nexport interface WindowModel extends ElementModel {\n // solar heat gain coefficient (https://en.wikipedia.org/wiki/Solar_gain) = 1 - opacity\n opacity: number;\n tint: string;\n uValue: number;\n setback?: number;\n\n shutter: ShutterProps | undefined; // backward compatibility\n leftShutter: boolean;\n rightShutter: boolean;\n shutterColor: string;\n shutterWidth: number;\n\n mullion: boolean;\n horizontalMullion: boolean;\n verticalMullion: boolean;\n mullionSpacing: number;\n horizontalMullionSpacing: number;\n verticalMullionSpacing: number;\n mullionWidth: number;\n mullionColor: string;\n\n // frameColor is using color\n frame: boolean;\n frameWidth: number;\n sillWidth: number;\n\n windowType: WindowType;\n archHeight: number;\n\n parentType?: ObjectType.Wall | ObjectType.Roof;\n\n // polygonal window top vertex position [x, h], x is relative to center(from -0.5 to 0.5), h is absolute\n polygonTop?: number[];\n\n // if empty, it is a hole on its parent (roof or window)\n empty?: boolean;\n\n // Is this window inside a building? If yes, this will be no heat exchange. By default, it is not.\n interior?: boolean;\n}\n\n// backward compatibility\nexport interface ShutterProps {\n showLeft: boolean;\n showRight: boolean;\n color: string;\n width: number;\n}\n\nexport enum WindowType {\n Default = 'Default',\n Arched = 'Arched',\n Circular = 'Circular',\n Polygonal = 'Polygonal',\n}\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { RefObject } from 'react';\r\nimport { MyOrbitControls } from 'src/js/MyOrbitControls';\r\nimport { Group } from 'three';\r\nimport create from 'zustand';\r\nimport { useStore } from './common';\r\n\r\nexport interface RefStoreState {\r\n setEnableOrbitController: (b: boolean) => void;\r\n selectNone: () => void;\r\n contentRef: RefObject | null;\r\n compassRef: React.MutableRefObject | null;\r\n orbitControlsRef: RefObject | null;\r\n humanRef: RefObject | null;\r\n treeRef: RefObject | null;\r\n flowerRef: RefObject | null;\r\n foundationRef: RefObject | null;\r\n cuboidRef: RefObject | null;\r\n listenToAutoDeletionByDeleteRef: React.MutableRefObject | null;\r\n listenToAutoDeletionByCutRef: React.MutableRefObject | null;\r\n setListenToAutoDeletionByDelete: (b: boolean) => void;\r\n setListenToAutoDeletionByCut: (b: boolean) => void;\r\n}\r\n\r\nexport const useRefStore = create((set, get) => {\r\n return {\r\n setEnableOrbitController: (b: boolean) => {\r\n if (useStore.getState().viewState.navigationView) {\r\n return;\r\n }\r\n set((state) => {\r\n if (state.orbitControlsRef?.current) {\r\n state.orbitControlsRef.current.enabled = b;\r\n }\r\n });\r\n },\r\n selectNone: () => {\r\n set((state) => {\r\n state.humanRef = null;\r\n state.treeRef = null;\r\n state.foundationRef = null;\r\n });\r\n },\r\n contentRef: null,\r\n compassRef: null,\r\n orbitControlsRef: null,\r\n humanRef: null,\r\n treeRef: null,\r\n flowerRef: null,\r\n foundationRef: null,\r\n cuboidRef: null,\r\n listenToAutoDeletionByCutRef: null,\r\n listenToAutoDeletionByDeleteRef: null,\r\n setListenToAutoDeletionByCut: (b: boolean) => {\r\n const listenToAutoDeletionByCutRef = get().listenToAutoDeletionByCutRef;\r\n if (listenToAutoDeletionByCutRef) {\r\n listenToAutoDeletionByCutRef.current = b;\r\n }\r\n },\r\n setListenToAutoDeletionByDelete: (b: boolean) => {\r\n const listenToAutoDeletionByDeleteRef = get().listenToAutoDeletionByDeleteRef;\r\n if (listenToAutoDeletionByDeleteRef) {\r\n listenToAutoDeletionByDeleteRef.current = b;\r\n }\r\n },\r\n };\r\n});\r\n","export default __webpack_public_path__ + \"static/media/jaah.640ec7e4.png\";","export default __webpack_public_path__ + \"static/media/jack.fc5a1084.png\";","export default __webpack_public_path__ + \"static/media/jacob.f94b08ea.png\";","export default __webpack_public_path__ + \"static/media/jacqueline.90e4de66.png\";","export default __webpack_public_path__ + \"static/media/jade.7796c8cb.png\";","export default __webpack_public_path__ + \"static/media/jamelia.c18980a7.png\";","export default __webpack_public_path__ + \"static/media/james.bfd0036f.png\";","export default __webpack_public_path__ + \"static/media/jane.70c22fdf.png\";","export default __webpack_public_path__ + \"static/media/jaya.8e2e76b3.png\";","export default __webpack_public_path__ + \"static/media/jaye.b4a735cc.png\";","export default __webpack_public_path__ + \"static/media/jeanette.3152b17d.png\";","export default __webpack_public_path__ + \"static/media/jedi.c8e9053b.png\";","export default __webpack_public_path__ + \"static/media/jeff.fa34a949.png\";","export default __webpack_public_path__ + \"static/media/jena.330f8f74.png\";","export default __webpack_public_path__ + \"static/media/jennifer.db10d3b3.png\";","export default __webpack_public_path__ + \"static/media/jess.1b71461e.png\";","export default __webpack_public_path__ + \"static/media/jett.f742e41c.png\";","export default __webpack_public_path__ + \"static/media/jill.969e03db.png\";","export default __webpack_public_path__ + \"static/media/jiya.e86fd321.png\";","export default __webpack_public_path__ + \"static/media/joan.0eb4e36d.png\";","export default __webpack_public_path__ + \"static/media/jocelyn.cc2d66a0.png\";","export default __webpack_public_path__ + \"static/media/joel.979c7679.png\";","export default __webpack_public_path__ + \"static/media/joey.929d0c2b.png\";","export default __webpack_public_path__ + \"static/media/john.940131e1.png\";","export default __webpack_public_path__ + \"static/media/jonathon.4b1921a2.png\";","export default __webpack_public_path__ + \"static/media/jose.65247d55.png\";","export default __webpack_public_path__ + \"static/media/joseph.516ed377.png\";","export default __webpack_public_path__ + \"static/media/joshua.716b0462.png\";","export default __webpack_public_path__ + \"static/media/judd.b6a25f04.png\";","export default __webpack_public_path__ + \"static/media/judy.f092e7c8.png\";","export default __webpack_public_path__ + \"static/media/julia.42ea554a.png\";","export default __webpack_public_path__ + \"static/media/julio.8bb18e89.png\";","export default __webpack_public_path__ + \"static/media/jumapili.26e47d67.png\";","export default __webpack_public_path__ + \"static/media/june.827a5c6e.png\";","export default __webpack_public_path__ + \"static/media/juro.c5460006.png\";","export default __webpack_public_path__ + \"static/media/justin.490b3c19.png\";","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport JaahImage from './resources/jaah.png';\nimport JackImage from './resources/jack.png';\nimport JacobImage from './resources/jacob.png';\nimport JacquelineImage from './resources/jacqueline.png';\nimport JadeImage from './resources/jade.png';\nimport JameliaImage from './resources/jamelia.png';\nimport JamesImage from './resources/james.png';\nimport JaneImage from './resources/jane.png';\nimport JayaImage from './resources/jaya.png';\nimport JayeImage from './resources/jaye.png';\nimport JeanetteImage from './resources/jeanette.png';\nimport JediImage from './resources/jedi.png';\nimport JeffImage from './resources/jeff.png';\nimport JenaImage from './resources/jena.png';\nimport JenniferImage from './resources/jennifer.png';\nimport JessImage from './resources/jess.png';\nimport JettImage from './resources/jett.png';\nimport JillImage from './resources/jill.png';\nimport JiyaImage from './resources/jiya.png';\nimport JoanImage from './resources/joan.png';\nimport JocelynImage from './resources/jocelyn.png';\nimport JoelImage from './resources/joel.png';\nimport JoeyImage from './resources/joey.png';\nimport JohnImage from './resources/john.png';\nimport JonathonImage from './resources/jonathon.png';\nimport JoseImage from './resources/jose.png';\nimport JosephImage from './resources/joseph.png';\nimport JoshuaImage from './resources/joshua.png';\nimport JuddImage from './resources/judd.png';\nimport JudyImage from './resources/judy.png';\nimport JuliaImage from './resources/julia.png';\nimport JulioImage from './resources/julio.png';\nimport JumapiliImage from './resources/jumapili.png';\nimport JuneImage from './resources/june.png';\nimport JuroImage from './resources/juro.png';\nimport JustinImage from './resources/justin.png';\n\nimport { Gender, HumanName } from './types';\nimport i18n from './i18n/i18n';\n\nexport class HumanData {\n static fetchGender(name: string): Gender {\n switch (name) {\n case HumanName.Jaah:\n return Gender.Male;\n case HumanName.Jacqueline:\n return Gender.Female;\n case HumanName.Jade:\n return Gender.Female;\n case HumanName.Jamelia:\n return Gender.Female;\n case HumanName.James:\n return Gender.Male;\n case HumanName.Jane:\n return Gender.Female;\n case HumanName.Jaya:\n return Gender.Female;\n case HumanName.Jaye:\n return Gender.Male;\n case HumanName.Jeanette:\n return Gender.Female;\n case HumanName.Jedi:\n return Gender.Male;\n case HumanName.Jeff:\n return Gender.Male;\n case HumanName.Jena:\n return Gender.Female;\n case HumanName.Jennifer:\n return Gender.Female;\n case HumanName.Jess:\n return Gender.Female;\n case HumanName.Jett:\n return Gender.Male;\n case HumanName.Jill:\n return Gender.Female;\n case HumanName.Jiya:\n return Gender.Female;\n case HumanName.Joan:\n return Gender.Female;\n case HumanName.Jocelyn:\n return Gender.Female;\n case HumanName.Joel:\n return Gender.Male;\n case HumanName.Joey:\n return Gender.Female;\n case HumanName.John:\n return Gender.Male;\n case HumanName.Jonathon:\n return Gender.Male;\n case HumanName.Jose:\n return Gender.Male;\n case HumanName.Joseph:\n return Gender.Male;\n case HumanName.Joshua:\n return Gender.Male;\n case HumanName.Judd:\n return Gender.Male;\n case HumanName.Judy:\n return Gender.Female;\n case HumanName.Julia:\n return Gender.Female;\n case HumanName.Julio:\n return Gender.Male;\n case HumanName.Jumapili:\n return Gender.Female;\n case HumanName.June:\n return Gender.Female;\n case HumanName.Juro:\n return Gender.Male;\n case HumanName.Justin:\n return Gender.Male;\n default:\n return Gender.Male;\n }\n }\n\n static fetchLabel(name: string, lang: {}): string {\n switch (name) {\n case HumanName.Jaah:\n return i18n.t('people.Jaah', lang);\n case HumanName.Jacob:\n return i18n.t('people.Jacob', lang);\n case HumanName.Jacqueline:\n return i18n.t('people.Jacqueline', lang);\n case HumanName.Jade:\n return i18n.t('people.Jade', lang);\n case HumanName.Jamelia:\n return i18n.t('people.Jamelia', lang);\n case HumanName.James:\n return i18n.t('people.James', lang);\n case HumanName.Jane:\n return i18n.t('people.Jane', lang);\n case HumanName.Jaya:\n return i18n.t('people.Jaya', lang);\n case HumanName.Jaye:\n return i18n.t('people.Jaye', lang);\n case HumanName.Jeanette:\n return i18n.t('people.Jeanette', lang);\n case HumanName.Jedi:\n return i18n.t('people.Jedi', lang);\n case HumanName.Jeff:\n return i18n.t('people.Jeff', lang);\n case HumanName.Jena:\n return i18n.t('people.Jena', lang);\n case HumanName.Jennifer:\n return i18n.t('people.Jennifer', lang);\n case HumanName.Jess:\n return i18n.t('people.Jess', lang);\n case HumanName.Jett:\n return i18n.t('people.Jett', lang);\n case HumanName.Jill:\n return i18n.t('people.Jill', lang);\n case HumanName.Jiya:\n return i18n.t('people.Jiya', lang);\n case HumanName.Joan:\n return i18n.t('people.Joan', lang);\n case HumanName.Jocelyn:\n return i18n.t('people.Jocelyn', lang);\n case HumanName.Joel:\n return i18n.t('people.Joel', lang);\n case HumanName.Joey:\n return i18n.t('people.Joey', lang);\n case HumanName.John:\n return i18n.t('people.John', lang);\n case HumanName.Jonathon:\n return i18n.t('people.Jonathon', lang);\n case HumanName.Jose:\n return i18n.t('people.Jose', lang);\n case HumanName.Joseph:\n return i18n.t('people.Joseph', lang);\n case HumanName.Joshua:\n return i18n.t('people.Joshua', lang);\n case HumanName.Judd:\n return i18n.t('people.Judd', lang);\n case HumanName.Judy:\n return i18n.t('people.Judy', lang);\n case HumanName.Julia:\n return i18n.t('people.Julia', lang);\n case HumanName.Julio:\n return i18n.t('people.Julio', lang);\n case HumanName.Jumapili:\n return i18n.t('people.Jumapili', lang);\n case HumanName.June:\n return i18n.t('people.June', lang);\n case HumanName.Juro:\n return i18n.t('people.Juro', lang);\n case HumanName.Justin:\n return i18n.t('people.Justin', lang);\n default:\n return i18n.t('people.Jack', lang);\n }\n }\n\n static fetchHatOffsetY(name: string): number {\n switch (name) {\n case HumanName.Jonathon:\n return -0.22;\n }\n return 0;\n }\n\n static fetchHatOffsetX(name: string): number {\n switch (name) {\n case HumanName.Jaah:\n return -0.05;\n case HumanName.Jack:\n return -0.05;\n case HumanName.Jacob:\n return 0.09;\n case HumanName.Jade:\n return -0.04;\n case HumanName.Jaya:\n return 0.04;\n case HumanName.Jaye:\n return 0;\n case HumanName.Jamelia:\n return 0.05;\n case HumanName.Jane:\n return 0.02;\n case HumanName.Jeanette:\n return 0.08;\n case HumanName.Jedi:\n return -0.02;\n case HumanName.Jeff:\n return -0.05;\n case HumanName.Jena:\n return 0.05;\n case HumanName.Jennifer:\n return 0.02;\n case HumanName.Jess:\n return 0.01;\n case HumanName.Jett:\n return -0.04;\n case HumanName.Jill:\n return -0.03;\n case HumanName.Jiya:\n return -0.03;\n case HumanName.Joan:\n return -0.45;\n case HumanName.Jocelyn:\n return -0.01;\n case HumanName.Joel:\n return -0.48;\n case HumanName.Joey:\n return 0.01;\n case HumanName.John:\n return 0.01;\n case HumanName.Jonathon:\n return 0.02;\n case HumanName.Jose:\n return 0.05;\n case HumanName.Joseph:\n return 0.05;\n case HumanName.Joshua:\n return -0.01;\n case HumanName.Judy:\n return 0.02;\n case HumanName.Julia:\n return -0.02;\n case HumanName.Jumapili:\n return -0.04;\n case HumanName.June:\n return -0.1;\n case HumanName.Juro:\n return -0.08;\n case HumanName.Justin:\n return -0.06;\n default:\n return 0;\n }\n }\n\n static fetchHeight(name: string): number {\n switch (name) {\n case HumanName.Jaah:\n return 1.78;\n case HumanName.Jack:\n return 1.8;\n case HumanName.Jacob:\n return 1.82;\n case HumanName.Jacqueline:\n return 1.78;\n case HumanName.Jade:\n return 1.6;\n case HumanName.James:\n return 1.75;\n case HumanName.Jane:\n return 1.67;\n case HumanName.Jaya:\n return 1.55;\n case HumanName.Jaye:\n return 1.65;\n case HumanName.Jamelia:\n return 1.8;\n case HumanName.Jeanette:\n return 1.62;\n case HumanName.Jedi:\n return 1.75;\n case HumanName.Jeff:\n return 1.65;\n case HumanName.Jena:\n return 1.6;\n case HumanName.Jennifer:\n return 1.7;\n case HumanName.Jess:\n return 1.5;\n case HumanName.Jett:\n return 1.85;\n case HumanName.Jill:\n return 1.71;\n case HumanName.Jiya:\n return 1.74;\n case HumanName.Joan:\n return 1.68;\n case HumanName.Jocelyn:\n return 1.72;\n case HumanName.Joel:\n return 1.75;\n case HumanName.Joey:\n return 1.72;\n case HumanName.John:\n return 1.85;\n case HumanName.Jonathon:\n return 1.9;\n case HumanName.Jose:\n return 1.6;\n case HumanName.Joseph:\n return 1.88;\n case HumanName.Joshua:\n return 1.79;\n case HumanName.Judd:\n return 1.68;\n case HumanName.Judy:\n return 1.75;\n case HumanName.Julia:\n return 1.71;\n case HumanName.Julio:\n return 1.76;\n case HumanName.Jumapili:\n return 1.65;\n case HumanName.June:\n return 1.85;\n case HumanName.Juro:\n return 1.72;\n case HumanName.Justin:\n return 1.755;\n default:\n return 1.8;\n }\n }\n\n static fetchWidth(name: string): number {\n switch (name) {\n case HumanName.Jaah:\n return 0.74;\n case HumanName.Jack:\n return 0.42;\n case HumanName.Jacqueline:\n return 0.43;\n case HumanName.Jacob:\n return 0.8;\n case HumanName.Jade:\n return 0.48;\n case HumanName.James:\n return 0.472;\n case HumanName.Jane:\n return 0.4;\n case HumanName.Jaya:\n return 0.6;\n case HumanName.Jaye:\n return 0.55;\n case HumanName.Jamelia:\n return 0.65;\n case HumanName.Jeanette:\n return 0.4;\n case HumanName.Jedi:\n return 0.56;\n case HumanName.Jena:\n return 0.695;\n case HumanName.Jennifer:\n return 0.45;\n case HumanName.Jess:\n return 0.43;\n case HumanName.Jill:\n return 0.42;\n case HumanName.Joan:\n return 1.7;\n case HumanName.Jocelyn:\n return 0.4;\n case HumanName.Joel:\n return 1.8;\n case HumanName.Joey:\n return 0.462;\n case HumanName.John:\n return 0.6;\n case HumanName.Jonathon:\n return 0.6;\n case HumanName.Jose:\n return 2;\n case HumanName.Joseph:\n return 0.6;\n case HumanName.Joshua:\n return 0.5;\n case HumanName.Judd:\n return 0.544;\n case HumanName.Judy:\n return 0.41;\n case HumanName.Julia:\n return 0.43;\n case HumanName.Julio:\n return 0.5;\n case HumanName.Jumapili:\n return 0.75;\n case HumanName.June:\n return 0.65;\n case HumanName.Juro:\n return 0.494;\n case HumanName.Justin:\n return 0.6;\n default:\n return 0.6;\n }\n }\n\n static fetchTextureImage(name: string) {\n let textureImg;\n switch (name) {\n case HumanName.Jaah:\n textureImg = JaahImage;\n break;\n case HumanName.Jacob:\n textureImg = JacobImage;\n break;\n case HumanName.Jacqueline:\n textureImg = JacquelineImage;\n break;\n case HumanName.Jade:\n textureImg = JadeImage;\n break;\n case HumanName.Jamelia:\n textureImg = JameliaImage;\n break;\n case HumanName.James:\n textureImg = JamesImage;\n break;\n case HumanName.Jane:\n textureImg = JaneImage;\n break;\n case HumanName.Jaya:\n textureImg = JayaImage;\n break;\n case HumanName.Jaye:\n textureImg = JayeImage;\n break;\n case HumanName.Jeanette:\n textureImg = JeanetteImage;\n break;\n case HumanName.Jedi:\n textureImg = JediImage;\n break;\n case HumanName.Jeff:\n textureImg = JeffImage;\n break;\n case HumanName.Jena:\n textureImg = JenaImage;\n break;\n case HumanName.Jennifer:\n textureImg = JenniferImage;\n break;\n case HumanName.Jess:\n textureImg = JessImage;\n break;\n case HumanName.Jett:\n textureImg = JettImage;\n break;\n case HumanName.Jill:\n textureImg = JillImage;\n break;\n case HumanName.Jiya:\n textureImg = JiyaImage;\n break;\n case HumanName.Joan:\n textureImg = JoanImage;\n break;\n case HumanName.Jocelyn:\n textureImg = JocelynImage;\n break;\n case HumanName.Joel:\n textureImg = JoelImage;\n break;\n case HumanName.Joey:\n textureImg = JoeyImage;\n break;\n case HumanName.John:\n textureImg = JohnImage;\n break;\n case HumanName.Jonathon:\n textureImg = JonathonImage;\n break;\n case HumanName.Jose:\n textureImg = JoseImage;\n break;\n case HumanName.Joseph:\n textureImg = JosephImage;\n break;\n case HumanName.Joshua:\n textureImg = JoshuaImage;\n break;\n case HumanName.Judd:\n textureImg = JuddImage;\n break;\n case HumanName.Judy:\n textureImg = JudyImage;\n break;\n case HumanName.Julia:\n textureImg = JuliaImage;\n break;\n case HumanName.Julio:\n textureImg = JulioImage;\n break;\n case HumanName.Jumapili:\n textureImg = JumapiliImage;\n break;\n case HumanName.June:\n textureImg = JuneImage;\n break;\n case HumanName.Juro:\n textureImg = JuroImage;\n break;\n case HumanName.Justin:\n textureImg = JustinImage;\n break;\n default:\n textureImg = JackImage;\n }\n return textureImg;\n }\n}\n","export default __webpack_public_path__ + \"static/media/no_leaf_shrub.7b01fa4a.png\";","export default __webpack_public_path__ + \"static/media/bellflower.de03e9de.png\";","export default __webpack_public_path__ + \"static/media/boxwood.4de70ffb.png\";","export default __webpack_public_path__ + \"static/media/cactus_combo_1.21a73758.png\";","export default __webpack_public_path__ + \"static/media/cactus_combo_2.8b5298f8.png\";","export default __webpack_public_path__ + \"static/media/cactus_combo_3.2627c12d.png\";","export default __webpack_public_path__ + \"static/media/cactus_combo_4.731b15b4.png\";","export default __webpack_public_path__ + \"static/media/hibiscus.771d3166.png\";","export default __webpack_public_path__ + \"static/media/hydrangea.9367eebd.png\";","export default __webpack_public_path__ + \"static/media/hosta.744059f3.png\";","export default __webpack_public_path__ + \"static/media/peony.f379953c.png\";","export default __webpack_public_path__ + \"static/media/red_rose.6fbd03bc.png\";","export default __webpack_public_path__ + \"static/media/spirea.f1823a2e.png\";","export default __webpack_public_path__ + \"static/media/sunflower.2bfc3ca1.png\";","export default __webpack_public_path__ + \"static/media/tall_bush.5b2dde31.png\";","export default __webpack_public_path__ + \"static/media/tulip.595dc3b9.png\";","export default __webpack_public_path__ + \"static/media/white_flower.7c33e894.png\";","export default __webpack_public_path__ + \"static/media/yellow_flower.3da8cdb9.png\";","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport NoLeafFlowerImage from './resources/no_leaf_flower.png';\nimport NoLeafShrubImage from './resources/no_leaf_shrub.png';\nimport BellflowerImage from './resources/bellflower.png';\nimport BoxwoodImage from './resources/boxwood.png';\nimport CactusCombo1Image from './resources/cactus_combo_1.png';\nimport CactusCombo2Image from './resources/cactus_combo_2.png';\nimport CactusCombo3Image from './resources/cactus_combo_3.png';\nimport CactusCombo4Image from './resources/cactus_combo_4.png';\nimport HibiscusImage from './resources/hibiscus.png';\nimport HydrangeaImage from './resources/hydrangea.png';\nimport HostaImage from './resources/hosta.png';\nimport PeonyImage from './resources/peony.png';\nimport RedRoseImage from './resources/red_rose.png';\nimport SpireaImage from './resources/spirea.png';\nimport SunflowerImage from './resources/sunflower.png';\nimport TallBushImage from './resources/tall_bush.png';\nimport TulipImage from './resources/tulip.png';\nimport WhiteFlowerImage from './resources/white_flower.png';\nimport YellowFlowerImage from './resources/yellow_flower.png';\nimport { FlowerType } from './types';\nimport i18n from './i18n/i18n';\n\nexport class FlowerData {\n static fetchSpread(name: string): number {\n switch (name) {\n case FlowerType.Bellflower:\n return 0.45;\n case FlowerType.Boxwood:\n return 1.6;\n case FlowerType.CactusCombo1:\n return 1;\n case FlowerType.CactusCombo2:\n return 1;\n case FlowerType.CactusCombo3:\n return 1;\n case FlowerType.CactusCombo4:\n return 1;\n case FlowerType.Hosta:\n return 1;\n case FlowerType.Hibiscus:\n return 2;\n case FlowerType.Hydrangea:\n return 2;\n case FlowerType.Peony:\n return 1.5;\n case FlowerType.RedRose:\n return 0.5;\n case FlowerType.Spirea:\n return 1.8;\n case FlowerType.Sunflower:\n return 1;\n case FlowerType.TallBush:\n return 1;\n case FlowerType.Tulip:\n return 0.4;\n case FlowerType.YellowFlower:\n return 2;\n default:\n return 0.8;\n }\n }\n\n static fetchHeight(name: string): number {\n switch (name) {\n case FlowerType.Bellflower:\n return 0.4;\n case FlowerType.Boxwood:\n return 1.44;\n case FlowerType.CactusCombo1:\n return 1.18;\n case FlowerType.CactusCombo2:\n return 1.35;\n case FlowerType.CactusCombo3:\n return 1.24;\n case FlowerType.CactusCombo4:\n return 1.35;\n case FlowerType.Hosta:\n return 0.7;\n case FlowerType.Hibiscus:\n return 1.7;\n case FlowerType.Hydrangea:\n return 1.5;\n case FlowerType.Peony:\n return 1;\n case FlowerType.RedRose:\n return 0.8;\n case FlowerType.Spirea:\n return 1.6;\n case FlowerType.Sunflower:\n return 2;\n case FlowerType.TallBush:\n return 2;\n case FlowerType.Tulip:\n return 0.7;\n case FlowerType.YellowFlower:\n return 1.4;\n default:\n return 0.5;\n }\n }\n\n static fetchLabel(name: string, lang: {}): string {\n switch (name) {\n case FlowerType.Bellflower:\n return i18n.t('flower.Bellflower', lang);\n case FlowerType.Boxwood:\n return i18n.t('flower.Boxwood', lang);\n case FlowerType.CactusCombo1:\n return i18n.t('flower.CactusCombo1', lang);\n case FlowerType.CactusCombo2:\n return i18n.t('flower.CactusCombo2', lang);\n case FlowerType.CactusCombo3:\n return i18n.t('flower.CactusCombo3', lang);\n case FlowerType.CactusCombo4:\n return i18n.t('flower.CactusCombo4', lang);\n case FlowerType.Hibiscus:\n return i18n.t('flower.Hibiscus', lang);\n case FlowerType.Hydrangea:\n return i18n.t('flower.Hydrangea', lang);\n case FlowerType.Hosta:\n return i18n.t('flower.Hosta', lang);\n case FlowerType.Peony:\n return i18n.t('flower.Peony', lang);\n case FlowerType.RedRose:\n return i18n.t('flower.RedRose', lang);\n case FlowerType.Spirea:\n return i18n.t('flower.Spirea', lang);\n case FlowerType.Sunflower:\n return i18n.t('flower.Sunflower', lang);\n case FlowerType.TallBush:\n return i18n.t('flower.TallBush', lang);\n case FlowerType.Tulip:\n return i18n.t('flower.Tulip', lang);\n case FlowerType.YellowFlower:\n return i18n.t('flower.YellowFlower', lang);\n default:\n return i18n.t('flower.WhiteFlower', lang);\n }\n }\n\n static fetchTextureImage(name: string, noLeaves: boolean) {\n if (noLeaves) {\n if (\n name === FlowerType.Hibiscus ||\n name === FlowerType.Hydrangea ||\n name === FlowerType.YellowFlower ||\n name === FlowerType.Spirea\n ) {\n return NoLeafShrubImage;\n }\n if (name === FlowerType.Boxwood) {\n return BoxwoodImage;\n }\n if (name === FlowerType.TallBush) {\n return TallBushImage;\n }\n if (name === FlowerType.CactusCombo1) {\n return CactusCombo1Image;\n }\n if (name === FlowerType.CactusCombo2) {\n return CactusCombo2Image;\n }\n if (name === FlowerType.CactusCombo3) {\n return CactusCombo3Image;\n }\n if (name === FlowerType.CactusCombo4) {\n return CactusCombo4Image;\n }\n return NoLeafFlowerImage;\n }\n let textureImg;\n switch (name) {\n case FlowerType.Bellflower:\n textureImg = BellflowerImage;\n break;\n case FlowerType.Boxwood:\n textureImg = BoxwoodImage;\n break;\n case FlowerType.CactusCombo1:\n textureImg = CactusCombo1Image;\n break;\n case FlowerType.CactusCombo2:\n textureImg = CactusCombo2Image;\n break;\n case FlowerType.CactusCombo3:\n textureImg = CactusCombo3Image;\n break;\n case FlowerType.CactusCombo4:\n textureImg = CactusCombo4Image;\n break;\n case FlowerType.Hibiscus:\n textureImg = HibiscusImage;\n break;\n case FlowerType.Hydrangea:\n textureImg = HydrangeaImage;\n break;\n case FlowerType.Hosta:\n textureImg = HostaImage;\n break;\n case FlowerType.Peony:\n textureImg = PeonyImage;\n break;\n case FlowerType.RedRose:\n textureImg = RedRoseImage;\n break;\n case FlowerType.Spirea:\n textureImg = SpireaImage;\n break;\n case FlowerType.Sunflower:\n textureImg = SunflowerImage;\n break;\n case FlowerType.TallBush:\n textureImg = TallBushImage;\n break;\n case FlowerType.Tulip:\n textureImg = TulipImage;\n break;\n case FlowerType.YellowFlower:\n textureImg = YellowFlowerImage;\n break;\n default:\n textureImg = WhiteFlowerImage;\n }\n return textureImg;\n }\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAAHQCAYAAADZHROTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goJEQgA7kxGWwAAB2BJREFUeJzt3DGrZHcdx+HfX7a0SJFiiwUDJrhNIOkstlCImCJFQBshL8AXEFBIFdLEal+EvgALxTZgQIvABtIEohAwRYqUW1gsnBTzQSyWMPfeuTkzu88Dl9vNfKf58L/nnLlr27YBYOYHew8AOBeCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIIIIEEEEiCACRBABIogAEUSACCJABBEggggQQQSIIAJEEAEiiAARRIAIIkAEESCCCBBBBIggAkQQASKIABFEgAgiQAQRIHf2HsDzZa11Z2YezMxPZ+bHM3P3/37uzcxXM/P1zHzT73/PzMcz889t2/67x2aeH2vbtr038Ixba700M2/OzC9n5o2Z+eE1XubxHML415n5y7ZtX55oHvyPIHJr1lovz8x7M/POnPavkScz86eZ+cO2bZ+f8HV5zgkiJ7fWuj8zv5vTh/Bp/jwz72/b9uktvw/PAUHkpNZav5+ZD+b7vT79ZGY+nEMYn3yP78szRhA5ibXW3Zn54xyuEe7l45n5zbZtX+24gQvmsRtubK31s5l5NPvGcOZw9/qztdZbO+/gQjkhciNrrQcz87e53p3j2/JkZn6xbdtHew/hsggi19bNk7/PzIt7b3mKxzPz823bPtl7CJdDELmWrhk+msMD1efq6zlE0aM5HEUQuZa11j/m8G2Tc/f5zLzq7jPHcFOFK1tr/XYuI4YzM/dn5t29R3AZnBC5krXWizPzxcy8sPeWK3g8h1Pil3sP4bw5IXJVD+eyYjhzuAP+cO8RnD8nRI621ro3M//Ze8cNvO4rfnwXJ0Su4td7D7ihX+09gPPmhMjR1lqPZua1vXfcwL+2bXtl7xGcLydEjtK/8rrkGM7MvLzWuvTPwC0SRI719t4DTuTNvQdwvgSRY/1o7wEn8pO9B3C+BJFjvbT3gBO5t/cAzpcgcqxnJSTPyufgFnwLGlmHQ3j8ZX8AAAAASUVORK5CYII=\"","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport {\n CuboidTexture,\n DoorTexture,\n FlowerType,\n FoundationTexture,\n HumanName,\n ObjectType,\n Orientation,\n ParabolicDishStructureType,\n RoofTexture,\n TrackerType,\n TreeType,\n WallTexture,\n} from '../types';\nimport short from 'short-uuid';\nimport { Vector3 } from 'three';\nimport { ElementModel } from './ElementModel';\nimport { HumanModel } from './HumanModel';\nimport { TreeModel } from './TreeModel';\nimport { FlowerModel } from './FlowerModel';\nimport { SensorModel } from './SensorModel';\nimport { CuboidModel } from './CuboidModel';\nimport { FoundationModel } from './FoundationModel';\nimport { SolarPanelModel } from './SolarPanelModel';\nimport { PvModel } from './PvModel';\nimport { WallFill, WallModel, WallStructure } from './WallModel';\nimport {\n GableRoofModel,\n GambrelRoofModel,\n HipRoofModel,\n MansardRoofModel,\n PyramidRoofModel,\n RoofModel,\n RoofStructure,\n RoofType,\n} from './RoofModel';\nimport { GROUND_ID } from '../constants';\nimport { WindowModel } from './WindowModel';\nimport { Point2 } from './Point2';\nimport { PolygonModel } from './PolygonModel';\nimport { Util } from '../Util';\nimport { HumanData } from '../HumanData';\nimport { ParabolicTroughModel } from './ParabolicTroughModel';\nimport { ParabolicDishModel } from './ParabolicDishModel';\nimport { FresnelReflectorModel } from './FresnelReflectorModel';\nimport { HeliostatModel } from './HeliostatModel';\nimport { DoorModel } from './DoorModel';\nimport { WindTurbineModel } from './WindTurbineModel';\nimport { FlowerData } from '../FlowerData';\nimport { LightModel } from './LightModel';\nimport { HvacSystem } from './HvacSystem';\nimport { useStore } from 'src/stores/common';\nimport { RoofUtil } from '../views/roof/RoofUtil';\n\nexport class ElementModelFactory {\n static makeHuman(name: HumanName, parentId: string, x: number, y: number, z?: number) {\n return {\n type: ObjectType.Human,\n name: name ?? HumanName.Jack,\n cx: x,\n cy: y,\n cz: z,\n lx: HumanData.fetchWidth(name ?? HumanName.Jack),\n lz: HumanData.fetchHeight(name ?? HumanName.Jack),\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parentId,\n id: short.generate() as string,\n } as HumanModel;\n }\n\n static makeTree(type: TreeType, spread: number, height: number, parentId: string, x: number, y: number, z?: number) {\n return {\n type: ObjectType.Tree,\n name: type ?? TreeType.Dogwood,\n cx: x,\n cy: y,\n cz: z,\n lx: spread ?? 3,\n lz: height ?? 4,\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parentId,\n id: short.generate() as string,\n } as TreeModel;\n }\n\n static makeSolarPanel(\n parent: ElementModel,\n pvModel: PvModel,\n x: number,\n y: number,\n z?: number,\n orientation?: Orientation,\n poleHeight?: number,\n poleSpacing?: number,\n tiltAngle?: number,\n relativeAzimuth?: number,\n normal?: Vector3,\n rotation?: number[],\n frameColor?: string,\n lx?: number,\n ly?: number,\n parentType?: ObjectType,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n parentType = ObjectType.Foundation;\n break;\n case ObjectType.Cuboid:\n foundationId = parent.id;\n parentType = ObjectType.Cuboid;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.SolarPanel,\n pvModelName: pvModel.name,\n trackerType: TrackerType.NO_TRACKER,\n relativeAzimuth: relativeAzimuth ?? 0,\n tiltAngle: tiltAngle ?? 0,\n orientation: orientation ?? Orientation.landscape,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 1,\n poleRadius: 0.05,\n poleSpacing: poleSpacing ?? 3,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? (orientation === Orientation.landscape ? pvModel.length : pvModel.width),\n ly: ly ?? (orientation === Orientation.landscape ? pvModel.width : pvModel.length),\n lz: pvModel.thickness,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n color: '#fff',\n frameColor: frameColor ?? 'white',\n parentType: parentType,\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as SolarPanelModel;\n }\n\n static makeFlower(name: FlowerType, parentId: string, x: number, y: number, z?: number) {\n return {\n type: ObjectType.Flower,\n name: name ?? FlowerType.YellowFlower,\n cx: x,\n cy: y,\n cz: z,\n lx: FlowerData.fetchSpread(name ?? FlowerType.YellowFlower),\n lz: FlowerData.fetchHeight(name ?? FlowerType.YellowFlower),\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parentId,\n id: short.generate() as string,\n } as FlowerModel;\n }\n\n static makeCuboid(x: number, y: number, height: number, faceColors: string[], faceTextures: CuboidTexture[]) {\n return {\n type: ObjectType.Cuboid,\n cx: x,\n cy: y,\n cz: height ? height / 2 : 2,\n lx: 0.1,\n ly: 0.1,\n lz: height ?? 4,\n color: '#808080',\n faceColors: faceColors ?? ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'],\n textureTypes: faceTextures ?? [\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n ],\n stackable: useStore.getState().actionState.cuboidStackable,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: GROUND_ID,\n selected: false,\n id: short.generate() as string,\n } as CuboidModel;\n }\n\n static makeFoundation(x: number, y: number, height: number, color: string, texture: FoundationTexture) {\n return {\n type: ObjectType.Foundation,\n cx: x,\n cy: y,\n cz: height ? height / 2 : 0.05,\n lx: 0,\n ly: 0,\n lz: height ?? 0.1,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: GROUND_ID,\n selected: false,\n color: color ?? '#808080',\n textureType: texture ?? FoundationTexture.NoTexture,\n solarUpdraftTower: {},\n solarAbsorberPipe: {},\n solarPowerTower: {},\n hvacSystem: { thermostatSetpoint: 20 } as HvacSystem,\n id: short.generate() as string,\n } as FoundationModel;\n }\n\n static makeParabolicTrough(\n parent: ElementModel,\n reflectance: number,\n absorptance: number,\n opticalEfficiency: number,\n thermalEfficiency: number,\n latusRectum: number,\n poleHeight: number,\n moduleLength: number,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n lx?: number,\n ly?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.ParabolicTrough,\n reflectance: reflectance ?? 0.9,\n absorptance: absorptance ?? 0.95,\n opticalEfficiency: opticalEfficiency ?? 0.7,\n thermalEfficiency: thermalEfficiency ?? 0.3,\n moduleLength: moduleLength ?? 3,\n latusRectum: latusRectum ?? 2,\n relativeAzimuth: 0,\n tiltAngle: 0,\n absorberTubeRadius: 0.05,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width\n poleRadius: 0.05,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? 2,\n ly: ly ?? 9, // north-south alignment by default\n lz: 0.1,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as ParabolicTroughModel;\n }\n\n static makeParabolicDish(\n parent: ElementModel,\n reflectance: number,\n absorptance: number,\n opticalEfficiency: number,\n thermalEfficiency: number,\n latusRectum: number,\n poleHeight: number,\n receiverStructure: ParabolicDishStructureType,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n lx?: number,\n ly?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.ParabolicDish,\n reflectance: reflectance ?? 0.9,\n absorptance: absorptance ?? 0.95,\n opticalEfficiency: opticalEfficiency ?? 0.7,\n thermalEfficiency: thermalEfficiency ?? 0.3,\n moduleLength: 3,\n latusRectum: latusRectum ?? 8,\n relativeAzimuth: 0,\n tiltAngle: 0,\n structureType: receiverStructure ?? ParabolicDishStructureType.CentralPole,\n receiverRadius: 0.25,\n receiverPoleRadius: 0.1,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to the radius (half of lx or ly)\n poleRadius: 0.2,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? 4, // diameter of the rim\n ly: ly ?? 4, // diameter of the rim (identical to lx)\n lz: 0.1,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as ParabolicDishModel;\n }\n\n static makeFresnelReflector(\n parent: ElementModel,\n receiverId: string,\n reflectance: number,\n poleHeight: number,\n moduleLength: number,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n lx?: number,\n ly?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.FresnelReflector,\n receiverId: receiverId ?? 'None',\n reflectance: reflectance ?? 0.9,\n moduleLength: moduleLength ?? 3,\n relativeAzimuth: 0,\n tiltAngle: 0,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width\n poleRadius: 0.05,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? 2,\n ly: ly ?? 9, // north-south alignment by default\n lz: 0.1,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as FresnelReflectorModel;\n }\n\n static makeHeliostat(\n parent: ElementModel,\n towerId: string,\n reflectance: number,\n poleHeight: number,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n lx?: number,\n ly?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.Heliostat,\n towerId: towerId ?? 'None',\n reflectance: reflectance ?? 0.9,\n relativeAzimuth: 0,\n tiltAngle: 0,\n drawSunBeam: false,\n poleHeight: poleHeight ?? 0.2, // extra pole height in addition to half of the width or height, whichever is larger\n poleRadius: 0.1,\n cx: x,\n cy: y,\n cz: z,\n lx: lx ?? 2,\n ly: ly ?? 4,\n lz: 0.1,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as HeliostatModel;\n }\n\n static makeWindTurbine(parentId: string, x: number, y: number, z?: number) {\n return {\n type: ObjectType.WindTurbine,\n bladeRadius: 10,\n towerRadius: 0.5,\n towerHeight: 20,\n cx: x,\n cy: y,\n cz: z,\n lx: 3,\n lz: 15,\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parentId,\n id: short.generate() as string,\n } as WindTurbineModel;\n }\n\n static makePolygon(\n parent: ElementModel,\n x: number,\n y: number,\n z: number,\n normal?: Vector3,\n rotation?: number[],\n parentType?: ObjectType,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n const hx = 0.2;\n const hy = 0.2;\n const hz = 0.2;\n let rx = x;\n let ry = y;\n // if the parent is a cuboid, determine the 2D coordinates within each face\n if (parent.type === ObjectType.Cuboid && normal) {\n if (Util.isUnitVectorX(normal)) {\n // west and east face\n rx = z;\n } else if (Util.isUnitVectorY(normal)) {\n // south and north face\n ry = z;\n }\n } else if (parent.type === ObjectType.Wall) {\n ry = z;\n }\n return {\n type: ObjectType.Polygon,\n cx: rx,\n cy: ry,\n cz: 0,\n lx: 2 * hx,\n ly: 2 * hy,\n lz: 2 * hz,\n color: '#ffffff',\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n vertices: [\n { x: Math.max(-0.5, rx - hx), y: Math.max(-0.5, ry - hy) } as Point2,\n { x: Math.max(-0.5, rx - hx), y: Math.min(0.5, ry + hy) } as Point2,\n { x: Math.min(0.5, rx + hx), y: Math.min(0.5, ry + hy) } as Point2,\n { x: Math.min(0.5, rx + hx), y: Math.max(-0.5, ry - hy) } as Point2,\n ],\n parentId: parent.id,\n parentType: parentType,\n foundationId: foundationId,\n selected: false,\n filled: true,\n selectedIndex: -1,\n id: short.generate() as string,\n } as PolygonModel;\n }\n\n static makeWall(parent: ElementModel, x: number, y: number, z?: number, normal?: Vector3) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Wall,\n cx: x,\n cy: y,\n cz: z,\n lx: 0,\n ly: actionState.wallThickness ?? 0.3,\n lz: actionState.wallHeight ?? 5,\n parapet: actionState.wallParapet,\n eavesLength: actionState.wallEavesLength ?? 0.3,\n rValue: actionState.wallRValue ?? 3,\n fill: WallFill.Full,\n leftUnfilledHeight: 0.5,\n rightUnfilledHeight: 0.5,\n leftTopPartialHeight: actionState.wallHeight - 0.5,\n rightTopPartialHeight: actionState.wallHeight - 0.5,\n relativeAngle: 0,\n leftPoint: [],\n rightPoint: [],\n leftJoints: [],\n rightJoints: [],\n textureType: actionState.wallTexture ?? WallTexture.Default,\n color: actionState.wallColor ?? '#ffffff',\n volumetricHeatCapacity: actionState.wallVolumetricHeatCapacity ?? 0.5,\n wallStructure: actionState.wallStructure ?? WallStructure.Default,\n studSpacing: actionState.wallStructureSpacing ?? 2,\n studWidth: actionState.wallStructureWidth ?? 0.1,\n studColor: actionState.wallStructureColor ?? '#ffffff',\n opacity: actionState.wallOpacity !== undefined ? actionState.wallOpacity : 0.5,\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n windows: [],\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n } as WallModel;\n }\n\n static makeSensor(parent: ElementModel, x: number, y: number, z?: number, normal?: Vector3, rotation?: number[]) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Sensor,\n cx: x,\n cy: y,\n cz: z,\n lx: 0.1,\n ly: 0.1,\n lz: 0.01,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n parentType: parent.type,\n id: short.generate() as string,\n } as SensorModel;\n }\n\n static makeLight(\n parent: ElementModel,\n decay: number,\n distance: number,\n intensity: number,\n color: string,\n x: number,\n y: number,\n z?: number,\n normal?: Vector3,\n rotation?: number[],\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Light,\n decay: decay ?? 2,\n distance: distance ?? 5,\n intensity: intensity ?? 3,\n color: color ?? '#ffff99',\n cx: x,\n cy: y,\n cz: z,\n lx: 0.16,\n ly: 0.16,\n lz: 0.08,\n showLabel: false,\n normal: normal ? normal.toArray() : [0, 0, 1],\n rotation: rotation ? rotation : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n parentType: parent.type,\n id: short.generate() as string,\n } as LightModel;\n }\n\n static makeWindow(\n parent: ElementModel,\n cx: number,\n cy: number,\n cz: number,\n parentType: ObjectType,\n rotation?: number[],\n lx = 0,\n lz = 0,\n ) {\n let foundationId;\n let ly = 0;\n switch (parent.type) {\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n foundationId = parent.parentId;\n ly = parent.ly;\n break;\n case ObjectType.Roof:\n foundationId = parent.parentId;\n ly = (parent as RoofModel).thickness;\n break;\n }\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Window,\n cx: cx,\n cy: cy,\n cz: cz,\n lx: lx,\n ly: ly,\n lz: lz,\n leftShutter: actionState.windowShutterLeft,\n rightShutter: actionState.windowShutterRight,\n shutterColor: actionState.windowShutterColor,\n shutterWidth: actionState.windowShutterWidth,\n horizontalMullion: actionState.windowHorizontalMullion,\n verticalMullion: actionState.windowVerticalMullion,\n mullionWidth: actionState.windowMullionWidth,\n horizontalMullionSpacing: actionState.windowHorizontalMullionSpacing,\n verticalMullionSpacing: actionState.windowVerticalMullionSpacing,\n mullionColor: actionState.windowMullionColor,\n frame: actionState.windowFrame,\n frameWidth: actionState.windowFrameWidth,\n sillWidth: RoofUtil.isTypeRoof(parentType) ? 0 : actionState.windowSillWidth,\n windowType: actionState.windowType,\n empty: actionState.windowEmpty,\n interior: actionState.windowInterior,\n archHeight: actionState.windowArchHeight,\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n color: actionState.windowColor ?? '#ffffff', // frame color\n tint: actionState.windowTint ?? '#73D8FF', // glass color\n opacity: actionState.windowOpacity !== undefined ? actionState.windowOpacity : 0.5,\n uValue: actionState.windowUValue ?? 0.5,\n normal: [0, -1, 0],\n rotation: rotation ? [...rotation] : [0, 0, 0],\n parentId: parent.id,\n parentType: parentType,\n foundationId: foundationId,\n id: short.generate() as string,\n } as WindowModel;\n }\n\n static makeDoor(parent: ElementModel) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n foundationId = parent.parentId;\n break;\n }\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Door,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n doorType: actionState.doorType,\n filled: actionState.doorFilled,\n interior: actionState.doorInterior,\n archHeight: actionState.doorArchHeight,\n textureType: actionState.doorTexture ?? DoorTexture.Default,\n color: actionState.doorColor ?? '#ffffff',\n uValue: actionState.doorUValue ?? 0.5,\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 1, 0],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as DoorModel;\n }\n\n static makePyramidRoof(wallsId: string[], parent: ElementModel) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Pyramid,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n } as PyramidRoofModel;\n }\n\n static makeGableRoof(wallsId: string[], parent: ElementModel) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Gable,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n ridgeLeftPoint: [0, 1],\n ridgeRightPoint: [0, 1],\n } as GableRoofModel;\n }\n\n static makeHipRoof(wallsId: string[], parent: ElementModel, ridgeLength: number) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Hip,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n leftRidgeLength: (ridgeLength ?? 2) / 2,\n rightRidgeLength: (ridgeLength ?? 2) / 2,\n } as HipRoofModel;\n }\n\n static makeGambrelRoof(wallsId: string[], parent: ElementModel) {\n const xPercent = 0.35;\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Gambrel,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n topRidgePoint: [0, 1],\n frontRidgePoint: [xPercent, 0.5],\n backRidgePoint: [xPercent, 0.5],\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n } as GambrelRoofModel;\n }\n\n static makeMansardRoof(wallsId: string[], parent: ElementModel) {\n const actionState = useStore.getState().actionState;\n return {\n type: ObjectType.Roof,\n cx: 0,\n cy: 0,\n cz: 0,\n lx: 0,\n ly: 0,\n lz: 0,\n ceiling: actionState.roofCeiling ?? false,\n rise: actionState.roofRise < 0 ? 2 : actionState.roofRise,\n thickness: actionState.roofThickness ?? 0.2,\n rValue: actionState.roofRValue ?? 3,\n color: actionState.roofColor ?? '#454769',\n sideColor: actionState.roofSideColor ?? '#ffffff',\n textureType: actionState.roofTexture ?? RoofTexture.Default,\n roofType: RoofType.Mansard,\n roofStructure: RoofStructure.Default,\n wallsId: [...wallsId],\n ridgeWidth: 1,\n selected: false,\n lineWidth: 0.2,\n lineColor: '#000000',\n showLabel: false,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: parent.id,\n foundationId: parent.id,\n id: short.generate() as string,\n } as MansardRoofModel;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { CommonStoreState } from '../common';\n\nexport const pvModelName = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.pvModelName;\nexport const rowAxis = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.rowAxis;\nexport const rowWidth = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.rowsPerRack;\nexport const interRowSpacing = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.interRowSpacing;\nexport const margin = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.margin;\nexport const poleHeight = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.poleHeight;\nexport const poleSpacing = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.poleSpacing;\nexport const tiltAngle = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.tiltAngle;\nexport const orientation = (state: CommonStoreState) => state.solarPanelArrayLayoutParams.orientation;\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { CommonStoreState } from '../common';\n\nexport const navigationView = (state: CommonStoreState) => state.viewState.navigationView;\n\nexport const shadowEnabled = (state: CommonStoreState) => state.viewState.shadowEnabled;\n\nexport const solarPanelShininess = (state: CommonStoreState) => state.viewState.solarPanelShininess;\n\nexport const windowShininess = (state: CommonStoreState) => state.viewState.windowShininess;\n\nexport const heatFluxScaleFactor = (state: CommonStoreState) => state.viewState.heatFluxScaleFactor;\n\nexport const heatFluxColor = (state: CommonStoreState) => state.viewState.heatFluxColor;\n\nexport const heatFluxWidth = (state: CommonStoreState) => state.viewState.heatFluxWidth;\n\nexport const solarRadiationHeatmapMaxValue = (state: CommonStoreState) => state.viewState.solarRadiationHeatMapMaxValue;\n\nexport const solarRadiationHeatmapReflectionOnly = (state: CommonStoreState) =>\n state.viewState.solarRadiationHeatMapReflectionOnly;\n\nexport const axes = (state: CommonStoreState) => state.viewState.axes;\n\nexport const ambientLightIntensity = (state: CommonStoreState) => state.viewState.ambientLightIntensity;\n\nexport const directLightIntensity = (state: CommonStoreState) => state.viewState.directLightIntensity;\n\nexport const theme = (state: CommonStoreState) => state.viewState.theme;\n\nexport const showAzimuthAngle = (state: CommonStoreState) => state.viewState.showAzimuthAngle;\n\nexport const showElevationAngle = (state: CommonStoreState) => state.viewState.showElevationAngle;\n\nexport const showZenithAngle = (state: CommonStoreState) => state.viewState.showZenithAngle;\n\nexport const autoRotate = (state: CommonStoreState) => state.viewState.autoRotate;\n\nexport const groundImage = (state: CommonStoreState) => state.viewState.groundImage;\n\nexport const groundImageType = (state: CommonStoreState) => state.viewState.groundImageType;\n\nexport const groundColor = (state: CommonStoreState) => state.viewState.groundColor;\n\nexport const waterSurface = (state: CommonStoreState) => state.viewState.waterSurface;\n\nexport const orthographic = (state: CommonStoreState) => state.viewState.orthographic;\n\nexport const enableRotate = (state: CommonStoreState) => state.viewState.enableRotate;\n\nexport const cameraPosition = (state: CommonStoreState) => state.viewState.cameraPosition;\n\nexport const cameraPosition2D = (state: CommonStoreState) => state.viewState.cameraPosition2D;\n\nexport const panCenter = (state: CommonStoreState) => state.viewState.panCenter;\n\nexport const panCenter2D = (state: CommonStoreState) => state.viewState.panCenter2D;\n\nexport const cameraZoom = (state: CommonStoreState) => state.viewState.cameraZoom;\n\nexport const heliodon = (state: CommonStoreState) => state.viewState.heliodon;\n\nexport const showSunAngles = (state: CommonStoreState) => state.viewState.showSunAngles;\n\nexport const mapZoom = (state: CommonStoreState) => state.viewState.mapZoom;\n\nexport const mapTilt = (state: CommonStoreState) => state.viewState.mapTilt;\n\nexport const mapType = (state: CommonStoreState) => state.viewState.mapType;\n\nexport const showSiteInfoPanel = (state: CommonStoreState) => state.viewState.showSiteInfoPanel;\n\nexport const showDesignInfoPanel = (state: CommonStoreState) => state.viewState.showDesignInfoPanel;\n\nexport const showInstructionPanel = (state: CommonStoreState) => state.viewState.showInstructionPanel;\n\nexport const showHeliodonPanel = (state: CommonStoreState) => state.viewState.showHeliodonPanel;\n\nexport const heliodonPanelX = (state: CommonStoreState) => state.viewState.heliodonPanelX;\n\nexport const heliodonPanelY = (state: CommonStoreState) => state.viewState.heliodonPanelY;\n\nexport const showMapPanel = (state: CommonStoreState) => state.viewState.showMapPanel;\n\nexport const mapPanelX = (state: CommonStoreState) => state.viewState.mapPanelX;\n\nexport const mapPanelY = (state: CommonStoreState) => state.viewState.mapPanelY;\n\nexport const showWeatherPanel = (state: CommonStoreState) => state.viewState.showWeatherPanel;\n\nexport const weatherPanelRect = (state: CommonStoreState) => state.viewState.weatherPanelRect;\n\nexport const showDiurnalTemperaturePanel = (state: CommonStoreState) => state.viewState.showDiurnalTemperaturePanel;\n\nexport const diurnalTemperaturePanelRect = (state: CommonStoreState) => state.viewState.diurnalTemperaturePanelRect;\n\nexport const showStickyNotePanel = (state: CommonStoreState) => state.viewState.showStickyNotePanel;\n\nexport const stickyNotePanelRect = (state: CommonStoreState) => state.viewState.stickyNotePanelRect;\n\nexport const showDailyBuildingEnergyPanel = (state: CommonStoreState) => state.viewState.showDailyBuildingEnergyPanel;\n\nexport const dailyBuildingEnergyPanelRect = (state: CommonStoreState) => state.viewState.dailyBuildingEnergyPanelRect;\n\nexport const showYearlyBuildingEnergyPanel = (state: CommonStoreState) => state.viewState.showYearlyBuildingEnergyPanel;\n\nexport const yearlyBuildingEnergyPanelRect = (state: CommonStoreState) => state.viewState.yearlyBuildingEnergyPanelRect;\n\nexport const showDailyLightSensorPanel = (state: CommonStoreState) => state.viewState.showDailyLightSensorPanel;\n\nexport const dailyLightSensorPanelRect = (state: CommonStoreState) => state.viewState.dailyLightSensorPanelRect;\n\nexport const showYearlyLightSensorPanel = (state: CommonStoreState) => state.viewState.showYearlyLightSensorPanel;\n\nexport const yearlyLightSensorPanelRect = (state: CommonStoreState) => state.viewState.yearlyLightSensorPanelRect;\n\nexport const yearlyLightSensorPanelShowDaylight = (state: CommonStoreState) =>\n state.viewState.yearlyLightSensorPanelShowDaylight;\n\nexport const yearlyLightSensorPanelShowClearness = (state: CommonStoreState) =>\n state.viewState.yearlyLightSensorPanelShowClearness;\n\nexport const showDailyPvYieldPanel = (state: CommonStoreState) => state.viewState.showDailyPvYieldPanel;\n\nexport const dailyPvYieldPanelRect = (state: CommonStoreState) => state.viewState.dailyPvYieldPanelRect;\n\nexport const showYearlyPvYieldPanel = (state: CommonStoreState) => state.viewState.showYearlyPvYieldPanel;\n\nexport const yearlyPvYieldPanelRect = (state: CommonStoreState) => state.viewState.yearlyPvYieldPanelRect;\n\nexport const showVisibilityResultsPanel = (state: CommonStoreState) =>\n state.viewState.showSolarPanelVisibilityResultsPanel;\n\nexport const visibilityResultsPanelRect = (state: CommonStoreState) => state.viewState.visibilityResultsPanelRect;\n\nexport const showDailyParabolicTroughYieldPanel = (state: CommonStoreState) =>\n state.viewState.showDailyParabolicTroughYieldPanel;\n\nexport const dailyParabolicTroughYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.dailyParabolicTroughYieldPanelRect;\n\nexport const showYearlyParabolicTroughYieldPanel = (state: CommonStoreState) =>\n state.viewState.showYearlyParabolicTroughYieldPanel;\n\nexport const yearlyParabolicTroughYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.yearlyParabolicTroughYieldPanelRect;\n\nexport const showDailyParabolicDishYieldPanel = (state: CommonStoreState) =>\n state.viewState.showDailyParabolicDishYieldPanel;\n\nexport const dailyParabolicDishYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.dailyParabolicDishYieldPanelRect;\n\nexport const showYearlyParabolicDishYieldPanel = (state: CommonStoreState) =>\n state.viewState.showYearlyParabolicDishYieldPanel;\n\nexport const yearlyParabolicDishYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.yearlyParabolicDishYieldPanelRect;\n\nexport const showDailyFresnelReflectorYieldPanel = (state: CommonStoreState) =>\n state.viewState.showDailyFresnelReflectorYieldPanel;\n\nexport const dailyFresnelReflectorYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.dailyFresnelReflectorYieldPanelRect;\n\nexport const showYearlyFresnelReflectorYieldPanel = (state: CommonStoreState) =>\n state.viewState.showYearlyFresnelReflectorYieldPanel;\n\nexport const yearlyFresnelReflectorYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.yearlyFresnelReflectorYieldPanelRect;\n\nexport const showDailyHeliostatYieldPanel = (state: CommonStoreState) => state.viewState.showDailyHeliostatYieldPanel;\n\nexport const dailyHeliostatYieldPanelRect = (state: CommonStoreState) => state.viewState.dailyHeliostatYieldPanelRect;\n\nexport const showYearlyHeliostatYieldPanel = (state: CommonStoreState) => state.viewState.showYearlyHeliostatYieldPanel;\n\nexport const yearlyHeliostatYieldPanelRect = (state: CommonStoreState) => state.viewState.yearlyHeliostatYieldPanelRect;\n\nexport const showDailyUpdraftTowerYieldPanel = (state: CommonStoreState) =>\n state.viewState.showDailyUpdraftTowerYieldPanel;\n\nexport const dailyUpdraftTowerYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.dailyUpdraftTowerYieldPanelRect;\n\nexport const showYearlyUpdraftTowerYieldPanel = (state: CommonStoreState) =>\n state.viewState.showYearlyUpdraftTowerYieldPanel;\n\nexport const yearlyUpdraftTowerYieldPanelRect = (state: CommonStoreState) =>\n state.viewState.yearlyUpdraftTowerYieldPanelRect;\n\nexport const showEvolutionPanel = (state: CommonStoreState) => state.viewState.showEvolutionPanel;\n\nexport const evolutionPanelRect = (state: CommonStoreState) => state.viewState.evolutionPanelRect;\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { CommonStoreState } from '../common';\n\nexport const latitude = (state: CommonStoreState) => state.world.latitude;\n\nexport const longitude = (state: CommonStoreState) => state.world.longitude;\n\nexport const date = (state: CommonStoreState) => state.world.date;\n\nexport const leafDayOfYear1 = (state: CommonStoreState) => state.world.leafDayOfYear1;\n\nexport const leafDayOfYear2 = (state: CommonStoreState) => state.world.leafDayOfYear2;\n\nexport const ground = (state: CommonStoreState) => state.world.ground;\n\nexport const address = (state: CommonStoreState) => state.world.address;\n\nexport const countryCode = (state: CommonStoreState) => state.world.countryCode;\n\nexport const airAttenuationCoefficient = (state: CommonStoreState) => state.world.airAttenuationCoefficient;\n\nexport const airConvectiveCoefficient = (state: CommonStoreState) => state.world.airConvectiveCoefficient;\n\nexport const timesPerHour = (state: CommonStoreState) => state.world.timesPerHour;\n\nexport const daysPerYear = (state: CommonStoreState) => state.world.daysPerYear;\n\nexport const monthlyIrradianceLosses = (state: CommonStoreState) => state.world.monthlyIrradianceLosses;\n\nexport const discretization = (state: CommonStoreState) => state.world.discretization;\n\nexport const diurnalTemperatureModel = (state: CommonStoreState) => state.world.diurnalTemperatureModel;\n\nexport const highestTemperatureTimeInMinutes = (state: CommonStoreState) => state.world.highestTemperatureTimeInMinutes;\n\nexport const solarRadiationHeatmapGridCellSize = (state: CommonStoreState) =>\n state.world.solarRadiationHeatmapGridCellSize;\n\nexport const pvGridCellSize = (state: CommonStoreState) => state.world.pvGridCellSize;\n\nexport const solarPanelVisibilityGridCellSize = (state: CommonStoreState) =>\n state.world.solarPanelVisibilityGridCellSize;\n\nexport const cspTimesPerHour = (state: CommonStoreState) => state.world.cspTimesPerHour;\n\nexport const cspDaysPerYear = (state: CommonStoreState) => state.world.cspDaysPerYear;\n\nexport const cspGridCellSize = (state: CommonStoreState) => state.world.cspGridCellSize;\n\nexport const sutTimesPerHour = (state: CommonStoreState) => state.world.sutTimesPerHour;\n\nexport const sutDaysPerYear = (state: CommonStoreState) => state.world.sutDaysPerYear;\n\nexport const sutGridCellSize = (state: CommonStoreState) => state.world.sutGridCellSize;\n\nexport const noAnimationForHeatmapSimulation = (state: CommonStoreState) => state.world.noAnimationForHeatmapSimulation;\n\nexport const noAnimationForThermalSimulation = (state: CommonStoreState) => state.world.noAnimationForThermalSimulation;\n\nexport const noAnimationForSensorDataCollection = (state: CommonStoreState) =>\n state.world.noAnimationForSensorDataCollection;\n\nexport const noAnimationForSolarPanelSimulation = (state: CommonStoreState) =>\n state.world.noAnimationForSolarPanelSimulation;\n\nexport const noAnimationForSolarUpdraftTowerSimulation = (state: CommonStoreState) =>\n state.world.noAnimationForSolarUpdraftTowerSimulation;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { CommonStoreState } from '../common';\r\nimport { PrimitiveStoreState } from '../commonPrimitive';\r\nimport { DataStoreState } from '../commonData';\r\n\r\nexport const set = (state: CommonStoreState) => state.set;\r\n\r\nexport const user = (state: CommonStoreState) => state.user;\r\n\r\nexport const userCount = (state: PrimitiveStoreState) => state.userCount;\r\n\r\nexport const showEconomicsPanel = (state: PrimitiveStoreState) => state.showEconomicsPanel;\r\n\r\nexport const showNavigationPanel = (state: PrimitiveStoreState) => state.showNavigationPanel;\r\n\r\nexport const minimumNavigationMoveSpeed = (state: CommonStoreState) => state.minimumNavigationMoveSpeed;\r\n\r\nexport const minimumNavigationTurnSpeed = (state: CommonStoreState) => state.minimumNavigationTurnSpeed;\r\n\r\nexport const navigationMoveSpeed = (state: PrimitiveStoreState) => state.navigationMoveSpeed;\r\n\r\nexport const navigationTurnSpeed = (state: PrimitiveStoreState) => state.navigationTurnSpeed;\r\n\r\nexport const getHeatmap = (state: DataStoreState) => state.getHeatmap;\r\n\r\nexport const setHeatmap = (state: DataStoreState) => state.setHeatmap;\r\n\r\nexport const clearHeatmaps = (state: DataStoreState) => state.clearHeatmaps;\r\n\r\nexport const clearDataStore = (state: DataStoreState) => state.clearDataStore;\r\n\r\nexport const flagOfDailySimulation = (state: PrimitiveStoreState) => state.flagOfDailySimulation;\r\n\r\nexport const hourlyHeatExchangeArrayMap = (state: DataStoreState) => state.hourlyHeatExchangeArrayMap;\r\n\r\nexport const setHourlyHeatExchangeArray = (state: DataStoreState) => state.setHourlyHeatExchangeArray;\r\n\r\nexport const hourlySolarHeatGainArrayMap = (state: DataStoreState) => state.hourlySolarHeatGainArrayMap;\r\n\r\nexport const setHourlySolarHeatGainArray = (state: DataStoreState) => state.setHourlySolarHeatGainArray;\r\n\r\nexport const hourlySolarPanelOutputArrayMap = (state: DataStoreState) => state.hourlySolarPanelOutputArrayMap;\r\n\r\nexport const setHourlySolarPanelOutputArray = (state: DataStoreState) => state.setHourlySolarPanelOutputArray;\r\n\r\nexport const getRoofSegmentVertices = (state: DataStoreState) => state.getRoofSegmentVertices;\r\n\r\nexport const getRoofSegmentVerticesWithoutOverhang = (state: DataStoreState) =>\r\n state.getRoofSegmentVerticesWithoutOverhang;\r\n\r\nexport const changed = (state: PrimitiveStoreState) => state.changed;\r\n\r\nexport const setChanged = (state: PrimitiveStoreState) => state.setChanged;\r\n\r\nexport const setSkipChange = (state: PrimitiveStoreState) => state.setSkipChange;\r\n\r\nexport const applyCount = (state: CommonStoreState) => state.applyCount;\r\n\r\nexport const setApplyCount = (state: CommonStoreState) => state.setApplyCount;\r\n\r\nexport const revertApply = (state: CommonStoreState) => state.revertApply;\r\n\r\nexport const elements = (state: CommonStoreState) => state.elements;\r\n\r\nexport const notes = (state: CommonStoreState) => state.notes;\r\n\r\nexport const pvModules = (state: CommonStoreState) => state.pvModules;\r\n\r\nexport const loadPvModules = (state: CommonStoreState) => state.loadPvModules;\r\n\r\nexport const getPvModule = (state: CommonStoreState) => state.getPvModule;\r\n\r\nexport const floatingWindowOpacity = (state: CommonStoreState) => state.floatingWindowOpacity;\r\n\r\nexport const selectedFloatingWindow = (state: CommonStoreState) => state.selectedFloatingWindow;\r\n\r\nexport const language = (state: CommonStoreState) => state.language;\r\n\r\nexport const locale = (state: CommonStoreState) => state.locale;\r\n\r\nexport const loggable = (state: CommonStoreState) => state.loggable;\r\n\r\nexport const actionInfo = (state: CommonStoreState) => state.actionInfo;\r\n\r\nexport const currentUndoable = (state: CommonStoreState) => state.currentUndoable;\r\n\r\nexport const openModelsMap = (state: PrimitiveStoreState) => state.openModelsMap;\r\n\r\nexport const modelsMapLatitude = (state: CommonStoreState) => state.modelsMapLatitude;\r\n\r\nexport const modelsMapLongitude = (state: CommonStoreState) => state.modelsMapLongitude;\r\n\r\nexport const modelsMapZoom = (state: CommonStoreState) => state.modelsMapZoom;\r\n\r\nexport const modelsMapTilt = (state: CommonStoreState) => state.modelsMapTilt;\r\n\r\nexport const modelsMapType = (state: CommonStoreState) => state.modelsMapType;\r\n\r\nexport const modelsMapWeatherStations = (state: PrimitiveStoreState) => state.modelsMapWeatherStations;\r\n\r\nexport const showCloudFileTitleDialog = (state: CommonStoreState) => state.showCloudFileTitleDialog;\r\n\r\nexport const showCloudFileTitleDialogFlag = (state: CommonStoreState) => state.showCloudFileTitleDialogFlag;\r\n\r\nexport const cloudFile = (state: CommonStoreState) => state.cloudFile;\r\n\r\nexport const latestModelSite = (state: CommonStoreState) => state.latestModelSite;\r\n\r\nexport const modelSites = (state: CommonStoreState) => state.modelSites;\r\n\r\nexport const peopleModels = (state: CommonStoreState) => state.peopleModels;\r\n\r\nexport const saveCloudFileFlag = (state: PrimitiveStoreState) => state.saveCloudFileFlag;\r\n\r\nexport const createProjectFlag = (state: PrimitiveStoreState) => state.createProjectFlag;\r\n\r\nexport const saveProjectFlag = (state: PrimitiveStoreState) => state.saveProjectFlag;\r\n\r\nexport const curateDesignToProjectFlag = (state: PrimitiveStoreState) => state.curateDesignToProjectFlag;\r\n\r\nexport const showProjectsFlag = (state: PrimitiveStoreState) => state.showProjectsFlag;\r\n\r\nexport const updateProjectsFlag = (state: PrimitiveStoreState) => state.updateProjectsFlag;\r\n\r\nexport const modelsMapFlag = (state: PrimitiveStoreState) => state.modelsMapFlag;\r\n\r\nexport const leaderboardFlag = (state: PrimitiveStoreState) => state.leaderboardFlag;\r\n\r\nexport const showLeaderboard = (state: PrimitiveStoreState) => state.showLeaderboard;\r\n\r\nexport const publishOnModelsMapFlag = (state: PrimitiveStoreState) => state.publishOnModelsMapFlag;\r\n\r\nexport const listCloudFilesFlag = (state: PrimitiveStoreState) => state.listCloudFilesFlag;\r\n\r\nexport const localContentToImportAfterCloudFileUpdate = (state: CommonStoreState) =>\r\n state.localContentToImportAfterCloudFileUpdate;\r\n\r\nexport const localFileName = (state: CommonStoreState) => state.localFileName;\r\n\r\nexport const createNewFileFlag = (state: CommonStoreState) => state.createNewFileFlag;\r\n\r\nexport const openLocalFileFlag = (state: CommonStoreState) => state.openLocalFileFlag;\r\n\r\nexport const saveLocalFileDialogVisible = (state: PrimitiveStoreState) => state.saveLocalFileDialogVisible;\r\n\r\nexport const fileChanged = (state: CommonStoreState) => state.fileChanged;\r\n\r\nexport const undoManager = (state: CommonStoreState) => state.undoManager;\r\n\r\nexport const addUndoable = (state: CommonStoreState) => state.addUndoable;\r\n\r\nexport const importContent = (state: CommonStoreState) => state.importContent;\r\n\r\nexport const exportContent = (state: CommonStoreState) => state.exportContent;\r\n\r\nexport const clearContent = (state: CommonStoreState) => state.clearContent;\r\n\r\nexport const createEmptyFile = (state: CommonStoreState) => state.createEmptyFile;\r\n\r\nexport const aabb = (state: CommonStoreState) => state.aabb;\r\n\r\nexport const animateSun = (state: PrimitiveStoreState) => state.animateSun;\r\n\r\nexport const animate24Hours = (state: CommonStoreState) => state.animate24Hours;\r\n\r\nexport const runDailyThermalSimulation = (state: PrimitiveStoreState) => state.runDailyThermalSimulation;\r\n\r\nexport const pauseDailyThermalSimulation = (state: PrimitiveStoreState) => state.pauseDailyThermalSimulation;\r\n\r\nexport const runYearlyThermalSimulation = (state: PrimitiveStoreState) => state.runYearlyThermalSimulation;\r\n\r\nexport const pauseYearlyThermalSimulation = (state: PrimitiveStoreState) => state.pauseYearlyThermalSimulation;\r\n\r\nexport const clearDailySimulationResultsFlag = (state: PrimitiveStoreState) => state.clearDailySimulationResultsFlag;\r\n\r\nexport const clearYearlySimulationResultsFlag = (state: PrimitiveStoreState) => state.clearYearlySimulationResultsFlag;\r\n\r\nexport const runDynamicSimulation = (state: PrimitiveStoreState) => state.runDynamicSimulation;\r\n\r\nexport const runStaticSimulation = (state: PrimitiveStoreState) => state.runStaticSimulation;\r\n\r\nexport const pauseSimulation = (state: PrimitiveStoreState) => state.pauseSimulation;\r\n\r\nexport const runEvolution = (state: PrimitiveStoreState) => state.runEvolution;\r\n\r\nexport const pauseEvolution = (state: PrimitiveStoreState) => state.pauseEvolution;\r\n\r\nexport const objectiveEvaluationIndex = (state: PrimitiveStoreState) => state.objectiveEvaluationIndex;\r\n\r\nexport const evolutionMethod = (state: CommonStoreState) => state.evolutionMethod;\r\n\r\nexport const updateSceneRadiusFlag = (state: CommonStoreState) => state.updateSceneRadiusFlag;\r\n\r\nexport const updateSceneRadius = (state: CommonStoreState) => state.updateSceneRadius;\r\n\r\nexport const sceneRadius = (state: CommonStoreState) => state.sceneRadius;\r\n\r\nexport const cameraDirection = (state: CommonStoreState) => state.cameraDirection;\r\n\r\nexport const getCameraDirection = (state: CommonStoreState) => state.getCameraDirection;\r\n\r\nexport const getElementById = (state: CommonStoreState) => state.getElementById;\r\n\r\nexport const getFoundation = (state: CommonStoreState) => state.getFoundation;\r\n\r\nexport const getParent = (state: CommonStoreState) => state.getParent;\r\n\r\nexport const getChildren = (state: CommonStoreState) => state.getChildren;\r\n\r\nexport const getChildrenOfType = (state: CommonStoreState) => state.getChildrenOfType;\r\n\r\nexport const selectedElement = (state: CommonStoreState) => state.selectedElement;\r\n\r\nexport const selectedElementIdSet = (state: CommonStoreState) => state.selectedElementIdSet;\r\n\r\nexport const getSelectedElement = (state: CommonStoreState) => state.getSelectedElement;\r\n\r\nexport const overlapWithSibling = (state: CommonStoreState) => state.overlapWithSibling;\r\n\r\nexport const selectedSideIndex = (state: CommonStoreState) => state.selectedSideIndex;\r\n\r\nexport const setElementPosition = (state: CommonStoreState) => state.setElementPosition;\r\n\r\nexport const setElementSize = (state: CommonStoreState) => state.setElementSize;\r\n\r\nexport const setElementNormal = (state: CommonStoreState) => state.setElementNormal;\r\n\r\nexport const updateAllElementLocks = (state: CommonStoreState) => state.updateAllElementLocks;\r\n\r\nexport const updateElementLockByFoundationId = (state: CommonStoreState) => state.updateElementLockByFoundationId;\r\n\r\nexport const updateElementLockByParentId = (state: CommonStoreState) => state.updateElementLockByParentId;\r\n\r\nexport const updateElementLockById = (state: CommonStoreState) => state.updateElementLockById;\r\n\r\nexport const updateElementReferenceById = (state: CommonStoreState) => state.updateElementReferenceById;\r\n\r\nexport const updateElementLabelById = (state: CommonStoreState) => state.updateElementLabelById;\r\n\r\nexport const updateElementShowLabelById = (state: CommonStoreState) => state.updateElementShowLabelById;\r\n\r\nexport const updateElementCxById = (state: CommonStoreState) => state.updateElementCxById;\r\n\r\nexport const updateElementCyById = (state: CommonStoreState) => state.updateElementCyById;\r\n\r\nexport const updateElementCzById = (state: CommonStoreState) => state.updateElementCzById;\r\n\r\nexport const updateElementCzForAll = (state: CommonStoreState) => state.updateElementCzForAll;\r\n\r\nexport const updateElementLxById = (state: CommonStoreState) => state.updateElementLxById;\r\n\r\nexport const updateElementLxAboveFoundation = (state: CommonStoreState) => state.updateElementLxAboveFoundation;\r\n\r\nexport const updateElementLxForAll = (state: CommonStoreState) => state.updateElementLxForAll;\r\n\r\nexport const updateElementLyById = (state: CommonStoreState) => state.updateElementLyById;\r\n\r\nexport const updateElementLyAboveFoundation = (state: CommonStoreState) => state.updateElementLyAboveFoundation;\r\n\r\nexport const updateElementLyForAll = (state: CommonStoreState) => state.updateElementLyForAll;\r\n\r\nexport const updateElementLzById = (state: CommonStoreState) => state.updateElementLzById;\r\n\r\nexport const updateElementLzForAll = (state: CommonStoreState) => state.updateElementLzForAll;\r\n\r\nexport const updateElementColorById = (state: CommonStoreState) => state.updateElementColorById;\r\n\r\nexport const updateElementColorOnSurface = (state: CommonStoreState) => state.updateElementColorOnSurface;\r\n\r\nexport const updateElementColorAboveFoundation = (state: CommonStoreState) => state.updateElementColorAboveFoundation;\r\n\r\nexport const updateElementColorForAll = (state: CommonStoreState) => state.updateElementColorForAll;\r\n\r\nexport const updateElementLineColorById = (state: CommonStoreState) => state.updateElementLineColorById;\r\n\r\nexport const updateElementLineColorOnSurface = (state: CommonStoreState) => state.updateElementLineColorOnSurface;\r\n\r\nexport const updateElementLineColorAboveFoundation = (state: CommonStoreState) =>\r\n state.updateElementLineColorAboveFoundation;\r\n\r\nexport const updateElementLineColorForAll = (state: CommonStoreState) => state.updateElementLineColorForAll;\r\n\r\nexport const updateElementLineWidthById = (state: CommonStoreState) => state.updateElementLineWidthById;\r\n\r\nexport const updateElementLineWidthOnSurface = (state: CommonStoreState) => state.updateElementLineWidthOnSurface;\r\n\r\nexport const updateElementLineWidthAboveFoundation = (state: CommonStoreState) =>\r\n state.updateElementLineWidthAboveFoundation;\r\n\r\nexport const updateElementLineWidthForAll = (state: CommonStoreState) => state.updateElementLineWidthForAll;\r\n\r\nexport const updateElementRotationById = (state: CommonStoreState) => state.updateElementRotationById;\r\n\r\nexport const updateElementRotationForAll = (state: CommonStoreState) => state.updateElementRotationForAll;\r\n\r\nexport const foundationActionScope = (state: CommonStoreState) => state.foundationActionScope;\r\n\r\nexport const setFoundationActionScope = (state: CommonStoreState) => state.setFoundationActionScope;\r\n\r\nexport const polygonActionScope = (state: CommonStoreState) => state.polygonActionScope;\r\n\r\nexport const setPolygonActionScope = (state: CommonStoreState) => state.setPolygonActionScope;\r\n\r\nexport const updatePolygonVertexPositionById = (state: CommonStoreState) => state.updatePolygonVertexPositionById;\r\n\r\nexport const updatePolygonVerticesById = (state: CommonStoreState) => state.updatePolygonVerticesById;\r\n\r\nexport const cuboidActionScope = (state: CommonStoreState) => state.cuboidActionScope;\r\n\r\nexport const setCuboidActionScope = (state: CommonStoreState) => state.setCuboidActionScope;\r\n\r\nexport const solarPanelActionScope = (state: CommonStoreState) => state.solarPanelActionScope;\r\n\r\nexport const setSolarPanelActionScope = (state: CommonStoreState) => state.setSolarPanelActionScope;\r\n\r\nexport const updateSolarCollectorDailyYieldById = (state: CommonStoreState) => state.updateSolarCollectorDailyYieldById;\r\n\r\nexport const updateSolarCollectorYearlyYieldById = (state: CommonStoreState) =>\r\n state.updateSolarCollectorYearlyYieldById;\r\n\r\nexport const updateSolarPanelTiltAngleById = (state: CommonStoreState) => state.updateSolarPanelTiltAngleById;\r\n\r\nexport const updateSolarCollectorDrawSunBeamById = (state: CommonStoreState) =>\r\n state.updateSolarCollectorDrawSunBeamById;\r\n\r\nexport const updateSolarCollectorDrawSunBeamAboveFoundation = (state: CommonStoreState) =>\r\n state.updateSolarCollectorDrawSunBeamAboveFoundation;\r\n\r\nexport const updateSolarCollectorDrawSunBeamForAll = (state: CommonStoreState) =>\r\n state.updateSolarCollectorDrawSunBeamForAll;\r\n\r\nexport const updateSolarCollectorRelativeAzimuthById = (state: CommonStoreState) =>\r\n state.updateSolarCollectorRelativeAzimuthById;\r\n\r\nexport const updateSolarCollectorRelativeAzimuthOnSurface = (state: CommonStoreState) =>\r\n state.updateSolarCollectorRelativeAzimuthOnSurface;\r\n\r\nexport const updateSolarCollectorRelativeAzimuthAboveFoundation = (state: CommonStoreState) =>\r\n state.updateSolarCollectorRelativeAzimuthAboveFoundation;\r\n\r\nexport const updateSolarCollectorRelativeAzimuthForAll = (state: CommonStoreState) =>\r\n state.updateSolarCollectorRelativeAzimuthForAll;\r\n\r\nexport const updateSolarCollectorPoleHeightById = (state: CommonStoreState) => state.updateSolarCollectorPoleHeightById;\r\n\r\nexport const updateSolarCollectorPoleHeightOnSurface = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleHeightOnSurface;\r\n\r\nexport const updateSolarCollectorPoleHeightAboveFoundation = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleHeightAboveFoundation;\r\n\r\nexport const updateSolarCollectorPoleHeightForAll = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleHeightForAll;\r\n\r\nexport const updateSolarCollectorPoleRadiusById = (state: CommonStoreState) => state.updateSolarCollectorPoleRadiusById;\r\n\r\nexport const updateSolarCollectorPoleRadiusAboveFoundation = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleRadiusAboveFoundation;\r\n\r\nexport const updateSolarCollectorPoleRadiusForAll = (state: CommonStoreState) =>\r\n state.updateSolarCollectorPoleRadiusForAll;\r\n\r\nexport const updateCspReflectanceById = (state: CommonStoreState) => state.updateCspReflectanceById;\r\n\r\nexport const updateCspReflectanceAboveFoundation = (state: CommonStoreState) =>\r\n state.updateCspReflectanceAboveFoundation;\r\n\r\nexport const updateCspReflectanceForAll = (state: CommonStoreState) => state.updateCspReflectanceForAll;\r\n\r\nexport const updateParabolicCollectorAbsorptanceById = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorAbsorptanceById;\r\n\r\nexport const updateParabolicCollectorAbsorptanceAboveFoundation = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorAbsorptanceAboveFoundation;\r\n\r\nexport const updateParabolicCollectorAbsorptanceForAll = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorAbsorptanceForAll;\r\n\r\nexport const updateParabolicCollectorOpticalEfficiencyById = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorOpticalEfficiencyById;\r\n\r\nexport const updateParabolicCollectorOpticalEfficiencyAboveFoundation = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorOpticalEfficiencyAboveFoundation;\r\n\r\nexport const updateParabolicCollectorOpticalEfficiencyForAll = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorOpticalEfficiencyForAll;\r\n\r\nexport const updateParabolicCollectorThermalEfficiencyById = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorThermalEfficiencyById;\r\n\r\nexport const updateParabolicCollectorThermalEfficiencyAboveFoundation = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorThermalEfficiencyAboveFoundation;\r\n\r\nexport const updateParabolicCollectorThermalEfficiencyForAll = (state: CommonStoreState) =>\r\n state.updateParabolicCollectorThermalEfficiencyForAll;\r\n\r\nexport const parabolicTroughActionScope = (state: CommonStoreState) => state.parabolicTroughActionScope;\r\n\r\nexport const setParabolicTroughActionScope = (state: CommonStoreState) => state.setParabolicTroughActionScope;\r\n\r\nexport const fresnelReflectorActionScope = (state: CommonStoreState) => state.fresnelReflectorActionScope;\r\n\r\nexport const setFresnelReflectorActionScope = (state: CommonStoreState) => state.setFresnelReflectorActionScope;\r\n\r\nexport const heliostatActionScope = (state: CommonStoreState) => state.heliostatActionScope;\r\n\r\nexport const setHeliostatActionScope = (state: CommonStoreState) => state.setHeliostatActionScope;\r\n\r\nexport const updateSolarReceiverById = (state: CommonStoreState) => state.updateSolarReceiverById;\r\n\r\nexport const updateSolarReceiverAboveFoundation = (state: CommonStoreState) => state.updateSolarReceiverAboveFoundation;\r\n\r\nexport const updateSolarReceiverForAll = (state: CommonStoreState) => state.updateSolarReceiverForAll;\r\n\r\nexport const parabolicDishActionScope = (state: CommonStoreState) => state.parabolicDishActionScope;\r\n\r\nexport const setParabolicDishActionScope = (state: CommonStoreState) => state.setParabolicDishActionScope;\r\n\r\nexport const updateParabolaLatusRectumById = (state: CommonStoreState) => state.updateParabolaLatusRectumById;\r\n\r\nexport const updateParabolaLatusRectumAboveFoundation = (state: CommonStoreState) =>\r\n state.updateParabolaLatusRectumAboveFoundation;\r\n\r\nexport const updateParabolaLatusRectumForAll = (state: CommonStoreState) => state.updateParabolaLatusRectumForAll;\r\n\r\nexport const updateModuleLengthById = (state: CommonStoreState) => state.updateModuleLengthById;\r\n\r\nexport const updateModuleLengthAboveFoundation = (state: CommonStoreState) => state.updateModuleLengthAboveFoundation;\r\n\r\nexport const updateModuleLengthForAll = (state: CommonStoreState) => state.updateModuleLengthForAll;\r\n\r\nexport const updateInsideLightById = (state: CommonStoreState) => state.updateInsideLightById;\r\n\r\nexport const updateInsideLightsByParentId = (state: CommonStoreState) => state.updateInsideLightsByParentId;\r\n\r\nexport const copyElementById = (state: CommonStoreState) => state.copyElementById;\r\n\r\nexport const removeElementById = (state: CommonStoreState) => state.removeElementById;\r\n\r\nexport const removeElementsByType = (state: CommonStoreState) => state.removeElementsByType;\r\n\r\nexport const clearDeletedElements = (state: CommonStoreState) => state.clearDeletedElements;\r\n\r\nexport const countElementsByReferenceId = (state: CommonStoreState) => state.countElementsByReferenceId;\r\n\r\nexport const removeElementsByReferenceId = (state: CommonStoreState) => state.removeElementsByReferenceId;\r\n\r\nexport const removeAllChildElementsByType = (state: CommonStoreState) => state.removeAllChildElementsByType;\r\n\r\nexport const removeAllElementsOnFoundationByType = (state: CommonStoreState) =>\r\n state.removeAllElementsOnFoundationByType;\r\n\r\nexport const pasteElementsToPoint = (state: CommonStoreState) => state.pasteElementsToPoint;\r\n\r\nexport const pasteElementsByKey = (state: CommonStoreState) => state.pasteElementsByKey;\r\n\r\nexport const elementsToPaste = (state: CommonStoreState) => state.elementsToPaste;\r\n\r\nexport const selectMe = (state: CommonStoreState) => state.selectMe;\r\n\r\nexport const selectNone = (state: CommonStoreState) => state.selectNone;\r\n\r\nexport const addElement = (state: CommonStoreState) => state.addElement;\r\n\r\nexport const objectTypeToAdd = (state: CommonStoreState) => state.objectTypeToAdd;\r\n\r\nexport const actionModeLock = (state: CommonStoreState) => state.actionModeLock;\r\n\r\nexport const countElementsByType = (state: CommonStoreState) => state.countElementsByType;\r\n\r\nexport const countSolarStructuresByType = (state: CommonStoreState) => state.countSolarStructuresByType;\r\n\r\nexport const countObservers = (state: CommonStoreState) => state.countObservers;\r\n\r\nexport const countAllElements = (state: CommonStoreState) => state.countAllElements;\r\n\r\nexport const countAllElementsByType = (state: CommonStoreState) => state.countAllElementsByType;\r\n\r\nexport const countAllOffspringsByTypeAtOnce = (state: CommonStoreState) => state.countAllOffspringsByTypeAtOnce;\r\n\r\nexport const countSolarPanelsOnRack = (state: CommonStoreState) => state.countSolarPanelsOnRack;\r\n\r\nexport const selectedElementAngle = (state: CommonStoreState) => state.selectedElementAngle;\r\n\r\nexport const selectedElementHeight = (state: CommonStoreState) => state.selectedElementHeight;\r\n\r\nexport const waiting = (state: PrimitiveStoreState) => state.waiting;\r\n\r\nexport const simulationInProgress = (state: PrimitiveStoreState) => state.simulationInProgress;\r\n\r\nexport const simulationPaused = (state: PrimitiveStoreState) => state.simulationPaused;\r\n\r\nexport const evolutionInProgress = (state: PrimitiveStoreState) => state.evolutionInProgress;\r\n\r\nexport const evolutionPaused = (state: PrimitiveStoreState) => state.evolutionPaused;\r\n\r\nexport const contextMenuObjectType = (state: CommonStoreState) => state.contextMenuObjectType;\r\n\r\nexport const localFileDialogRequested = (state: CommonStoreState) => state.localFileDialogRequested;\r\n\r\nexport const enableFineGrid = (state: CommonStoreState) => state.enableFineGrid;\r\n\r\nexport const setEnableFineGrid = (state: CommonStoreState) => state.setEnableFineGrid;\r\n\r\nexport const showCloudFilePanel = (state: PrimitiveStoreState) => state.showCloudFilePanel;\r\n\r\nexport const projectInfo = (state: CommonStoreState) => state.projectInfo;\r\n\r\nexport const projectView = (state: CommonStoreState) => state.projectView;\r\n\r\nexport const showProjectListPanel = (state: PrimitiveStoreState) => state.showProjectListPanel;\r\n\r\nexport const showModelsGallery = (state: PrimitiveStoreState) => state.showModelsGallery;\r\n\r\nexport const showAccountSettingsPanel = (state: PrimitiveStoreState) => state.showAccountSettingsPanel;\r\n\r\nexport const showLikesPanel = (state: PrimitiveStoreState) => state.showLikesPanel;\r\n\r\nexport const showPublishedModelsPanel = (state: PrimitiveStoreState) => state.showPublishedModelsPanel;\r\n\r\n// science\r\nexport const weatherData = (state: CommonStoreState) => state.weatherData;\r\n\r\nexport const loadWeatherData = (state: CommonStoreState) => state.loadWeatherData;\r\n\r\nexport const getWeather = (state: CommonStoreState) => state.getWeather;\r\n\r\nexport const loadHorizontalSolarRadiationData = (state: CommonStoreState) => state.loadHorizontalSolarRadiationData;\r\n\r\nexport const getHorizontalSolarRadiation = (state: CommonStoreState) => state.getHorizontalSolarRadiation;\r\n\r\nexport const loadVerticalSolarRadiationData = (state: CommonStoreState) => state.loadVerticalSolarRadiationData;\r\n\r\nexport const getVerticalSolarRadiation = (state: CommonStoreState) => state.getVerticalSolarRadiation;\r\n\r\nexport const getClosestCity = (state: CommonStoreState) => state.getClosestCity;\r\n\r\nexport const sunlightDirection = (state: CommonStoreState) => state.sunlightDirection;\r\n\r\nexport const setSunlightDirection = (state: CommonStoreState) => state.setSunlightDirection;\r\n\r\nexport const showSolarRadiationHeatmap = (state: PrimitiveStoreState) => state.showSolarRadiationHeatmap;\r\n\r\nexport const showHeatFluxes = (state: PrimitiveStoreState) => state.showHeatFluxes;\r\n\r\n// solar panels (PV)\r\n\r\nexport const runSolarPanelVisibilityAnalysis = (state: PrimitiveStoreState) => state.runSolarPanelVisibilityAnalysis;\r\n\r\nexport const solarPanelVisibilityResults = (state: DataStoreState) => state.solarPanelVisibilityResults;\r\n\r\nexport const runDailySimulationForSolarPanels = (state: PrimitiveStoreState) => state.runDailySimulationForSolarPanels;\r\n\r\nexport const runDailySimulationForSolarPanelsLastStep = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForSolarPanelsLastStep;\r\n\r\nexport const runYearlySimulationForSolarPanels = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForSolarPanels;\r\n\r\nexport const runYearlySimulationForSolarPanelsLastStep = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForSolarPanelsLastStep;\r\n\r\nexport const pauseDailySimulationForSolarPanels = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForSolarPanels;\r\n\r\nexport const pauseYearlySimulationForSolarPanels = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForSolarPanels;\r\n\r\nexport const dailyPvYield = (state: DataStoreState) => state.dailyPvYield;\r\n\r\nexport const dailyPvIndividualOutputs = (state: CommonStoreState) => state.graphState?.dailyPvIndividualOutputs;\r\n\r\nexport const setDailyPvYield = (state: DataStoreState) => state.setDailyPvYield;\r\n\r\nexport const yearlyPvYield = (state: DataStoreState) => state.yearlyPvYield;\r\n\r\nexport const yearlyPvIndividualOutputs = (state: CommonStoreState) => state.graphState?.yearlyPvIndividualOutputs;\r\n\r\nexport const setYearlyPvYield = (state: DataStoreState) => state.setYearlyPvYield;\r\n\r\nexport const solarPanelLabels = (state: DataStoreState) => state.solarPanelLabels;\r\n\r\nexport const setSolarPanelLabels = (state: DataStoreState) => state.setSolarPanelLabels;\r\n\r\nexport const setTotalBuildingHeater = (state: DataStoreState) => state.setTotalBuildingHeater;\r\n\r\nexport const setTotalBuildingAc = (state: DataStoreState) => state.setTotalBuildingAc;\r\n\r\nexport const setTotalBuildingSolarPanel = (state: DataStoreState) => state.setTotalBuildingSolarPanel;\r\n\r\nexport const updateElementOnRoofFlag = (state: CommonStoreState) => state.updateElementOnRoofFlag;\r\n\r\n// parabolic troughs (CSP)\r\n\r\nexport const runDailySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForParabolicTroughs;\r\n\r\nexport const runYearlySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForParabolicTroughs;\r\n\r\nexport const pauseDailySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForParabolicTroughs;\r\n\r\nexport const pauseYearlySimulationForParabolicTroughs = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForParabolicTroughs;\r\n\r\nexport const dailyParabolicTroughYield = (state: DataStoreState) => state.dailyParabolicTroughYield;\r\n\r\nexport const dailyParabolicTroughIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyParabolicTroughIndividualOutputs;\r\n\r\nexport const setDailyParabolicTroughYield = (state: DataStoreState) => state.setDailyParabolicTroughYield;\r\n\r\nexport const yearlyParabolicTroughYield = (state: DataStoreState) => state.yearlyParabolicTroughYield;\r\n\r\nexport const yearlyParabolicTroughIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyParabolicTroughIndividualOutputs;\r\n\r\nexport const setYearlyParabolicTroughYield = (state: DataStoreState) => state.setYearlyParabolicTroughYield;\r\n\r\nexport const parabolicTroughLabels = (state: DataStoreState) => state.parabolicTroughLabels;\r\n\r\nexport const setParabolicTroughLabels = (state: DataStoreState) => state.setParabolicTroughLabels;\r\n\r\n// Fresnel reflectors (CSP)\r\n\r\nexport const runDailySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForFresnelReflectors;\r\n\r\nexport const runYearlySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForFresnelReflectors;\r\n\r\nexport const pauseDailySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForFresnelReflectors;\r\n\r\nexport const pauseYearlySimulationForFresnelReflectors = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForFresnelReflectors;\r\n\r\nexport const dailyFresnelReflectorYield = (state: DataStoreState) => state.dailyFresnelReflectorYield;\r\n\r\nexport const dailyFresnelReflectorIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyFresnelReflectorIndividualOutputs;\r\n\r\nexport const setDailyFresnelReflectorYield = (state: DataStoreState) => state.setDailyFresnelReflectorYield;\r\n\r\nexport const yearlyFresnelReflectorYield = (state: DataStoreState) => state.yearlyFresnelReflectorYield;\r\n\r\nexport const yearlyFresnelReflectorIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyFresnelReflectorIndividualOutputs;\r\n\r\nexport const setYearlyFresnelReflectorYield = (state: DataStoreState) => state.setYearlyFresnelReflectorYield;\r\n\r\nexport const fresnelReflectorLabels = (state: DataStoreState) => state.fresnelReflectorLabels;\r\n\r\nexport const setFresnelReflectorLabels = (state: DataStoreState) => state.setFresnelReflectorLabels;\r\n\r\n// heliostats (CSP)\r\n\r\nexport const runDailySimulationForHeliostats = (state: PrimitiveStoreState) => state.runDailySimulationForHeliostats;\r\n\r\nexport const runYearlySimulationForHeliostats = (state: PrimitiveStoreState) => state.runYearlySimulationForHeliostats;\r\n\r\nexport const pauseDailySimulationForHeliostats = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForHeliostats;\r\n\r\nexport const pauseYearlySimulationForHeliostats = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForHeliostats;\r\n\r\nexport const dailyHeliostatYield = (state: DataStoreState) => state.dailyHeliostatYield;\r\n\r\nexport const dailyHeliostatIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyHeliostatIndividualOutputs;\r\n\r\nexport const setDailyHeliostatYield = (state: DataStoreState) => state.setDailyHeliostatYield;\r\n\r\nexport const yearlyHeliostatYield = (state: DataStoreState) => state.yearlyHeliostatYield;\r\n\r\nexport const yearlyHeliostatIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyHeliostatIndividualOutputs;\r\n\r\nexport const setYearlyHeliostatYield = (state: DataStoreState) => state.setYearlyHeliostatYield;\r\n\r\nexport const heliostatLabels = (state: DataStoreState) => state.heliostatLabels;\r\n\r\nexport const setHeliostatLabels = (state: DataStoreState) => state.setHeliostatLabels;\r\n\r\n// solar updraft towers\r\n\r\nexport const runDailySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForUpdraftTower;\r\n\r\nexport const runYearlySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForUpdraftTower;\r\n\r\nexport const pauseDailySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForUpdraftTower;\r\n\r\nexport const pauseYearlySimulationForUpdraftTower = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForUpdraftTower;\r\n\r\nexport const dailyUpdraftTowerResults = (state: DataStoreState) => state.dailyUpdraftTowerResults;\r\n\r\nexport const dailyUpdraftTowerYield = (state: DataStoreState) => state.dailyUpdraftTowerYield;\r\n\r\nexport const dailyUpdraftTowerIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyUpdraftTowerIndividualOutputs;\r\n\r\nexport const setDailyUpdraftTowerResults = (state: DataStoreState) => state.setDailyUpdraftTowerResults;\r\n\r\nexport const setDailyUpdraftTowerYield = (state: DataStoreState) => state.setDailyUpdraftTowerYield;\r\n\r\nexport const yearlyUpdraftTowerYield = (state: DataStoreState) => state.yearlyUpdraftTowerYield;\r\n\r\nexport const yearlyUpdraftTowerIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyUpdraftTowerIndividualOutputs;\r\n\r\nexport const setYearlyUpdraftTowerYield = (state: DataStoreState) => state.setYearlyUpdraftTowerYield;\r\n\r\nexport const updraftTowerLabels = (state: DataStoreState) => state.updraftTowerLabels;\r\n\r\nexport const setUpdraftTowerLabels = (state: DataStoreState) => state.setUpdraftTowerLabels;\r\n\r\n// parabolic dishes (CSP)\r\n\r\nexport const runDailySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\r\n state.runDailySimulationForParabolicDishes;\r\n\r\nexport const runYearlySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\r\n state.runYearlySimulationForParabolicDishes;\r\n\r\nexport const pauseDailySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\r\n state.pauseDailySimulationForParabolicDishes;\r\n\r\nexport const pauseYearlySimulationForParabolicDishes = (state: PrimitiveStoreState) =>\r\n state.pauseYearlySimulationForParabolicDishes;\r\n\r\nexport const dailyParabolicDishYield = (state: DataStoreState) => state.dailyParabolicDishYield;\r\n\r\nexport const dailyParabolicDishIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.dailyParabolicDishIndividualOutputs;\r\n\r\nexport const setDailyParabolicDishYield = (state: DataStoreState) => state.setDailyParabolicDishYield;\r\n\r\nexport const yearlyParabolicDishYield = (state: DataStoreState) => state.yearlyParabolicDishYield;\r\n\r\nexport const yearlyParabolicDishIndividualOutputs = (state: CommonStoreState) =>\r\n state.graphState?.yearlyParabolicDishIndividualOutputs;\r\n\r\nexport const setYearlyParabolicDishYield = (state: DataStoreState) => state.setYearlyParabolicDishYield;\r\n\r\nexport const parabolicDishLabels = (state: DataStoreState) => state.parabolicDishLabels;\r\n\r\nexport const setParabolicDishLabels = (state: DataStoreState) => state.setParabolicDishLabels;\r\n\r\n// sensors\r\n\r\nexport const runDailyLightSensor = (state: PrimitiveStoreState) => state.runDailyLightSensor;\r\n\r\nexport const pauseDailyLightSensor = (state: PrimitiveStoreState) => state.pauseDailyLightSensor;\r\n\r\nexport const runYearlyLightSensor = (state: PrimitiveStoreState) => state.runYearlyLightSensor;\r\n\r\nexport const pauseYearlyLightSensor = (state: PrimitiveStoreState) => state.pauseYearlyLightSensor;\r\n\r\nexport const dailyLightSensorData = (state: DataStoreState) => state.dailyLightSensorData;\r\n\r\nexport const setDailyLightSensorData = (state: DataStoreState) => state.setDailyLightSensorData;\r\n\r\nexport const yearlyLightSensorData = (state: DataStoreState) => state.yearlyLightSensorData;\r\n\r\nexport const setYearlyLightSensorData = (state: DataStoreState) => state.setYearlyLightSensorData;\r\n\r\nexport const sensorLabels = (state: DataStoreState) => state.sensorLabels;\r\n\r\nexport const setSensorLabels = (state: DataStoreState) => state.setSensorLabels;\r\n\r\n// handles\r\n\r\nexport const hoveredHandle = (state: CommonStoreState) => state.hoveredHandle;\r\n\r\nexport const moveHandleType = (state: CommonStoreState) => state.moveHandleType;\r\n\r\nexport const resizeHandleType = (state: CommonStoreState) => state.resizeHandleType;\r\n\r\nexport const getResizeHandlePosition = (state: CommonStoreState) => state.getResizeHandlePosition;\r\n\r\nexport const rotateHandleType = (state: CommonStoreState) => state.rotateHandleType;\r\n\r\nexport const resizeAnchor = (state: CommonStoreState) => state.resizeAnchor;\r\n\r\n// elements\r\n\r\nexport const isAddingElement = (state: CommonStoreState) => state.isAddingElement;\r\n\r\nexport const addedFoundationId = (state: CommonStoreState) => state.addedFoundationId;\r\n\r\nexport const deletedFoundationId = (state: CommonStoreState) => state.deletedFoundationId;\r\n\r\nexport const addedCuboidId = (state: CommonStoreState) => state.addedCuboidId;\r\n\r\nexport const deletedCuboidId = (state: CommonStoreState) => state.deletedCuboidId;\r\n\r\nexport const addedWallId = (state: CommonStoreState) => state.addedWallId;\r\n\r\nexport const deletedWallId = (state: CommonStoreState) => state.deletedWallId;\r\n\r\nexport const deletedRoofId = (state: CommonStoreState) => state.deletedRoofId;\r\n\r\nexport const deletedRoofIdSet = (state: CommonStoreState) => state.deletedRoofIdSet;\r\n\r\nexport const autoDeletedRoofIdSet = (state: CommonStoreState) => state.autoDeletedRoofIdSet;\r\n\r\nexport const autoDeletedRoofs = (state: CommonStoreState) => state.autoDeletedRoofs;\r\n\r\nexport const autoDeletedChild = (state: CommonStoreState) => state.autoDeletedChild;\r\n\r\nexport const groupActionMode = (state: CommonStoreState) => state.groupActionMode;\r\n\r\nexport const groupActionUpdateFlag = (state: CommonStoreState) => state.groupActionUpdateFlag;\r\n\r\nexport const addedWindowId = (state: CommonStoreState) => state.addedWindowId;\r\n\r\nexport const addedDoorId = (state: CommonStoreState) => state.addedDoorId;\r\n\r\nexport const updateWallMapOnFoundationFlag = (state: CommonStoreState) => state.updateWallMapOnFoundationFlag;\r\n\r\nexport const wallActionScope = (state: CommonStoreState) => state.wallActionScope;\r\n\r\nexport const roofActionScope = (state: CommonStoreState) => state.roofActionScope;\r\n\r\nexport const windowActionScope = (state: CommonStoreState) => state.windowActionScope;\r\n\r\nexport const doorActionScope = (state: CommonStoreState) => state.doorActionScope;\r\n\r\nexport const setWallActionScope = (state: CommonStoreState) => state.setWallActionScope;\r\n\r\nexport const setRoofActionScope = (state: CommonStoreState) => state.setRoofActionScope;\r\n\r\nexport const setDoorActionScope = (state: CommonStoreState) => state.setDoorActionScope;\r\n\r\nexport const setWindowActionScope = (state: CommonStoreState) => state.setWindowActionScope;\r\n\r\nexport const updateWallLeftJointsById = (state: CommonStoreState) => state.updateWallLeftJointsById;\r\n\r\nexport const updateWallRightJointsById = (state: CommonStoreState) => state.updateWallRightJointsById;\r\n\r\nexport const updateWallLeftPointById = (state: CommonStoreState) => state.updateWallLeftPointById;\r\n\r\nexport const updateRoofRiseById = (state: CommonStoreState) => state.updateRoofRiseById;\r\n\r\nexport const updateRoofStructureById = (state: CommonStoreState) => state.updateRoofStructureById;\r\n\r\nexport * as solarPanelArrayLayoutParams from './solarPanelArrayLayoutParams';\r\n\r\nexport const economicsParams = (state: CommonStoreState) => state.economicsParams;\r\n\r\n// genetic algorithms and particle swarm optimization\r\n\r\nexport const fittestIndividualResults = (state: CommonStoreState) => state.fittestIndividualResults;\r\n\r\nexport const setFittestIndividualResults = (state: CommonStoreState) => state.setFittestIndividualResults;\r\n\r\nexport const variableLabels = (state: CommonStoreState) => state.variableLabels;\r\n\r\nexport const setVariableLabels = (state: CommonStoreState) => state.setVariableLabels;\r\n\r\nexport const evolutionaryAlgorithmState = (state: CommonStoreState) => state.evolutionaryAlgorithmState;\r\n\r\nexport const solarPanelArrayLayoutConstraints = (state: CommonStoreState) => state.solarPanelArrayLayoutConstraints;\r\n\r\nexport const geneticAlgorithmWizardSelectedTab = (state: CommonStoreState) => state.geneticAlgorithmWizardSelectedTab;\r\n\r\nexport const particleSwarmOptimizationWizardSelectedTab = (state: CommonStoreState) =>\r\n state.particleSwarmOptimizationWizardSelectedTab;\r\n\r\nexport const setPrimitiveStore = (state: PrimitiveStoreState) => state.setPrimitiveStore;\r\n\r\nexport * as viewState from './viewState';\r\n\r\nexport * as world from './world';\r\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Line } from '@react-three/drei';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { GRID_RATIO, FINE_GRID_SCALE, NORMAL_GRID_SCALE } from '../constants';\nimport { Euler, Vector3 } from 'three';\n\ninterface ElementGridProps {\n hx: number;\n hy: number;\n hz: number;\n position?: Vector3;\n rotation?: Euler;\n}\n\nexport const ElementGrid = React.memo(({ hx, hy, hz, position, rotation }: ElementGridProps) => {\n const enableFineGrid = useStore(Selector.enableFineGrid);\n const groundImage = useStore(Selector.viewState.groundImage);\n const lineColor = groundImage ? '#888888' : '#444444';\n\n const maxSize = Math.max(hx, hy);\n const [step, setStep] = useState(Math.floor(maxSize / 50) + 1);\n const [lineWidth, setLineWidth] = useState(0.5);\n\n useEffect(() => {\n if (enableFineGrid) {\n setStep((Math.floor(maxSize / 25) + 1) * FINE_GRID_SCALE);\n setLineWidth(groundImage ? 0.05 : 0.1);\n } else {\n setStep((Math.floor(maxSize / 25) + 1) * NORMAL_GRID_SCALE);\n setLineWidth((groundImage ? 0.05 : 0.1) * GRID_RATIO);\n }\n }, [enableFineGrid, maxSize]);\n\n const pointsX = useMemo(() => {\n const p: number[] = [0];\n for (let i = step; i <= hx; i += step) {\n p.push(i);\n p.push(-i);\n }\n return p;\n }, [step, hx]);\n\n const pointsY = useMemo(() => {\n const p: number[] = [0];\n for (let i = step; i <= hy; i += step) {\n p.push(i);\n p.push(-i);\n }\n return p;\n }, [step, hy]);\n\n return (\n \n {pointsX.map((value) => {\n return (\n \n );\n })}\n {pointsY.map((value) => {\n return (\n \n );\n })}\n \n );\n});\n\nexport default React.memo(ElementGrid);\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Mesh } from 'three';\r\nimport { Box } from '@react-three/drei';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ResizeHandleType } from 'src/types';\r\nimport * as Selector from 'src/stores/selector';\r\n\r\ninterface WindowResizeHandleProps {\r\n x: number;\r\n z: number;\r\n handleType: ResizeHandleType;\r\n scale?: number[];\r\n}\r\n\r\nexport const WINDOW_RESIZE_HANDLE_SIZE = 0.2;\r\n\r\nconst WindowResizeHandle = ({ x, z, handleType, scale = [1, 1, 1] }: WindowResizeHandleProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n\r\n const handleRef = useRef();\r\n\r\n const [color, setColor] = useState('white');\r\n\r\n const [a, b, c] = scale;\r\n\r\n useEffect(() => {\r\n if (resizeHandleType === handleType) {\r\n setColor('red');\r\n } else {\r\n setColor('white');\r\n }\r\n }, [resizeHandleType]);\r\n\r\n return (\r\n {\r\n setColor('red');\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handleType;\r\n });\r\n }}\r\n onPointerLeave={() => {\r\n if (resizeHandleType === null) {\r\n setColor('white');\r\n }\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WindowResizeHandle);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Mesh } from 'three';\r\nimport { Sphere } from '@react-three/drei';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { MoveHandleType } from 'src/types';\r\n\r\ninterface WindowMoveHandleProps {\r\n handleType: MoveHandleType;\r\n}\r\n\r\nconst WindowMoveHandle = ({ handleType }: WindowMoveHandleProps) => {\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n\r\n const handleRef = useRef();\r\n\r\n const [color, setColor] = useState('white');\r\n\r\n useEffect(() => {\r\n if (moveHandleType === MoveHandleType.Mid) {\r\n setColor('red');\r\n } else {\r\n setColor('white');\r\n }\r\n }, [moveHandleType]);\r\n\r\n return (\r\n {\r\n setColor('red');\r\n }}\r\n onPointerLeave={() => {\r\n if (moveHandleType === null) {\r\n setColor('white');\r\n }\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WindowMoveHandle);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport create from 'zustand';\r\nimport { DesignProblem } from '../types';\r\n\r\n// avoid using undefined value in the store for now.\r\nexport interface PrimitiveStoreState {\r\n setPrimitiveStore: (key: K, val: V) => void;\r\n\r\n changed: boolean;\r\n setChanged: (b: boolean) => void;\r\n skipChange: boolean;\r\n setSkipChange: (b: boolean) => void;\r\n\r\n waiting: boolean;\r\n\r\n showEconomicsPanel: boolean;\r\n showNavigationPanel: boolean;\r\n\r\n saveCloudFileFlag: boolean;\r\n setSaveCloudFileFlag: (b: boolean) => void;\r\n listCloudFilesFlag: boolean;\r\n saveLocalFileDialogVisible: boolean;\r\n\r\n modelsMapFlag: boolean;\r\n leaderboardFlag: boolean;\r\n showLeaderboard: boolean;\r\n publishOnModelsMapFlag: boolean;\r\n modelsMapWeatherStations: boolean;\r\n\r\n createProjectFlag: boolean;\r\n saveProjectFlag: boolean;\r\n curateDesignToProjectFlag: boolean;\r\n showProjectsFlag: boolean;\r\n updateProjectsFlag: boolean;\r\n showProjectListPanel: boolean;\r\n projectImagesUpdateFlag: boolean;\r\n\r\n // These stores the settings from createNewProjectDialog.tsx, because we don't want to overwrite\r\n // the local state in the common store yet. Don't be confused with commonStore's projectInfo.\r\n projectType: DesignProblem;\r\n projectTitle: string | null;\r\n projectDescription: string | null;\r\n\r\n userCount: number;\r\n showCloudFilePanel: boolean;\r\n openModelsMap: boolean;\r\n showModelsGallery: boolean;\r\n showAccountSettingsPanel: boolean;\r\n showLikesPanel: boolean;\r\n showPublishedModelsPanel: boolean;\r\n\r\n animateSun: boolean;\r\n\r\n simulationInProgress: boolean;\r\n simulationPaused: boolean;\r\n evolutionInProgress: boolean;\r\n evolutionPaused: boolean;\r\n\r\n runEvolution: boolean;\r\n pauseEvolution: boolean;\r\n objectiveEvaluationIndex: number; // index for evaluating objective function in genetic algorithms\r\n\r\n runDailyThermalSimulation: boolean;\r\n pauseDailyThermalSimulation: boolean;\r\n runYearlyThermalSimulation: boolean;\r\n pauseYearlyThermalSimulation: boolean;\r\n clearDailySimulationResultsFlag: boolean;\r\n clearYearlySimulationResultsFlag: boolean;\r\n\r\n runDynamicSimulation: boolean;\r\n runStaticSimulation: boolean;\r\n pauseSimulation: boolean;\r\n\r\n runDailySimulationForParabolicDishes: boolean;\r\n runYearlySimulationForParabolicDishes: boolean;\r\n pauseDailySimulationForParabolicDishes: boolean;\r\n pauseYearlySimulationForParabolicDishes: boolean;\r\n\r\n runDailySimulationForParabolicTroughs: boolean;\r\n runYearlySimulationForParabolicTroughs: boolean;\r\n pauseDailySimulationForParabolicTroughs: boolean;\r\n pauseYearlySimulationForParabolicTroughs: boolean;\r\n\r\n runDailySimulationForFresnelReflectors: boolean;\r\n runYearlySimulationForFresnelReflectors: boolean;\r\n pauseDailySimulationForFresnelReflectors: boolean;\r\n pauseYearlySimulationForFresnelReflectors: boolean;\r\n\r\n runDailySimulationForHeliostats: boolean;\r\n runYearlySimulationForHeliostats: boolean;\r\n pauseDailySimulationForHeliostats: boolean;\r\n pauseYearlySimulationForHeliostats: boolean;\r\n\r\n runSolarPanelVisibilityAnalysis: boolean;\r\n runDailySimulationForSolarPanels: boolean;\r\n pauseDailySimulationForSolarPanels: boolean;\r\n runYearlySimulationForSolarPanels: boolean;\r\n pauseYearlySimulationForSolarPanels: boolean;\r\n runDailySimulationForSolarPanelsLastStep: boolean;\r\n runYearlySimulationForSolarPanelsLastStep: boolean;\r\n\r\n runDailyLightSensor: boolean;\r\n pauseDailyLightSensor: boolean;\r\n runYearlyLightSensor: boolean;\r\n pauseYearlyLightSensor: boolean;\r\n\r\n runDailySimulationForUpdraftTower: boolean;\r\n runYearlySimulationForUpdraftTower: boolean;\r\n pauseDailySimulationForUpdraftTower: boolean;\r\n pauseYearlySimulationForUpdraftTower: boolean;\r\n\r\n flagOfDailySimulation: boolean; // used as a flag to notify that daily results are ready\r\n\r\n showSolarRadiationHeatmap: boolean;\r\n showHeatFluxes: boolean;\r\n\r\n duringCameraInteraction: boolean;\r\n\r\n navigationMoveSpeed: number;\r\n navigationTurnSpeed: number;\r\n\r\n // element being deleted by esc when adding\r\n elementBeingCanceledId: string | null;\r\n\r\n showWallIntersectionPlaneId: string | null;\r\n\r\n oldParentId: string | null;\r\n oldFoundationId: string | null | undefined;\r\n\r\n // used for listen to auto deletion\r\n selectedElementId: string | null;\r\n\r\n foundationMovedFlag: boolean;\r\n updateFoundationMovedFlag: () => void;\r\n\r\n isCameraUnderGround: boolean;\r\n}\r\n\r\nexport const usePrimitiveStore = create((set, get) => {\r\n return {\r\n setPrimitiveStore(key, val) {\r\n set((state) => {\r\n if (state[key] !== undefined) {\r\n state[key] = val;\r\n } else {\r\n console.error(`key ${key} is not defined in PrimitiveStoreState`);\r\n }\r\n });\r\n },\r\n\r\n changed: false,\r\n setChanged(b) {\r\n set((state: PrimitiveStoreState) => {\r\n state.changed = b;\r\n });\r\n },\r\n skipChange: true,\r\n setSkipChange(b) {\r\n set((state: PrimitiveStoreState) => {\r\n state.skipChange = b;\r\n });\r\n },\r\n\r\n waiting: false,\r\n\r\n showEconomicsPanel: false,\r\n showNavigationPanel: false,\r\n\r\n saveCloudFileFlag: false,\r\n setSaveCloudFileFlag(b) {\r\n set((state) => {\r\n state.saveCloudFileFlag = b;\r\n });\r\n },\r\n listCloudFilesFlag: false,\r\n saveLocalFileDialogVisible: false,\r\n\r\n modelsMapFlag: false,\r\n leaderboardFlag: false,\r\n showLeaderboard: false,\r\n publishOnModelsMapFlag: false,\r\n modelsMapWeatherStations: false,\r\n\r\n createProjectFlag: false,\r\n saveProjectFlag: false,\r\n curateDesignToProjectFlag: false,\r\n showProjectsFlag: false,\r\n updateProjectsFlag: false,\r\n showProjectListPanel: false,\r\n projectImagesUpdateFlag: false,\r\n projectType: DesignProblem.SOLAR_PANEL_ARRAY,\r\n projectTitle: null,\r\n projectDescription: null,\r\n\r\n userCount: 0,\r\n showCloudFilePanel: false,\r\n openModelsMap: false,\r\n showModelsGallery: false,\r\n showAccountSettingsPanel: false,\r\n showLikesPanel: false,\r\n showPublishedModelsPanel: false,\r\n\r\n animateSun: false,\r\n\r\n simulationInProgress: false,\r\n simulationPaused: false,\r\n evolutionInProgress: false,\r\n evolutionPaused: false,\r\n\r\n runEvolution: false,\r\n pauseEvolution: false,\r\n objectiveEvaluationIndex: 0,\r\n\r\n runDailyThermalSimulation: false,\r\n pauseDailyThermalSimulation: false,\r\n runYearlyThermalSimulation: false,\r\n pauseYearlyThermalSimulation: false,\r\n clearDailySimulationResultsFlag: false,\r\n clearYearlySimulationResultsFlag: false,\r\n\r\n runDynamicSimulation: false,\r\n runStaticSimulation: false,\r\n pauseSimulation: false,\r\n\r\n runDailySimulationForParabolicDishes: false,\r\n runYearlySimulationForParabolicDishes: false,\r\n pauseDailySimulationForParabolicDishes: false,\r\n pauseYearlySimulationForParabolicDishes: false,\r\n\r\n runDailySimulationForParabolicTroughs: false,\r\n runYearlySimulationForParabolicTroughs: false,\r\n pauseDailySimulationForParabolicTroughs: false,\r\n pauseYearlySimulationForParabolicTroughs: false,\r\n\r\n runDailySimulationForFresnelReflectors: false,\r\n runYearlySimulationForFresnelReflectors: false,\r\n pauseDailySimulationForFresnelReflectors: false,\r\n pauseYearlySimulationForFresnelReflectors: false,\r\n\r\n runDailySimulationForHeliostats: false,\r\n runYearlySimulationForHeliostats: false,\r\n pauseDailySimulationForHeliostats: false,\r\n pauseYearlySimulationForHeliostats: false,\r\n\r\n runSolarPanelVisibilityAnalysis: false,\r\n runDailySimulationForSolarPanels: false,\r\n pauseDailySimulationForSolarPanels: false,\r\n runYearlySimulationForSolarPanels: false,\r\n pauseYearlySimulationForSolarPanels: false,\r\n runDailySimulationForSolarPanelsLastStep: false,\r\n runYearlySimulationForSolarPanelsLastStep: false,\r\n\r\n runDailyLightSensor: false,\r\n pauseDailyLightSensor: false,\r\n runYearlyLightSensor: false,\r\n pauseYearlyLightSensor: false,\r\n\r\n runDailySimulationForUpdraftTower: false,\r\n runYearlySimulationForUpdraftTower: false,\r\n pauseDailySimulationForUpdraftTower: false,\r\n pauseYearlySimulationForUpdraftTower: false,\r\n\r\n flagOfDailySimulation: false,\r\n\r\n showSolarRadiationHeatmap: false,\r\n showHeatFluxes: false,\r\n\r\n duringCameraInteraction: false,\r\n\r\n navigationMoveSpeed: 3,\r\n navigationTurnSpeed: 3,\r\n\r\n elementBeingCanceledId: null,\r\n\r\n showWallIntersectionPlaneId: null,\r\n\r\n oldParentId: null,\r\n oldFoundationId: null,\r\n\r\n selectedElementId: null,\r\n\r\n foundationMovedFlag: false,\r\n updateFoundationMovedFlag() {\r\n set((state) => {\r\n state.foundationMovedFlag = !state.foundationMovedFlag;\r\n });\r\n },\r\n\r\n isCameraUnderGround: false,\r\n };\r\n});\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport create from 'zustand';\nimport { DatumEntry } from '../types';\nimport { Vantage } from '../analysis/Vantage';\nimport { Util } from '../Util';\nimport { useStore } from './common';\nimport { usePrimitiveStore } from './commonPrimitive';\nimport { Vector3 } from 'three';\n\nexport interface DataStoreState {\n dailyLightSensorData: DatumEntry[];\n setDailyLightSensorData: (data: DatumEntry[]) => void;\n yearlyLightSensorData: DatumEntry[];\n setYearlyLightSensorData: (data: DatumEntry[]) => void;\n sensorLabels: string[];\n setSensorLabels: (labels: string[]) => void;\n\n dailyPvYield: DatumEntry[];\n setDailyPvYield: (data: DatumEntry[]) => void;\n sumDailyPvYield: () => number;\n getDailyPvProfit: () => number;\n yearlyPvYield: DatumEntry[];\n setYearlyPvYield: (data: DatumEntry[]) => void;\n sumYearlyPvYield: () => number;\n getYearlyPvProfit: () => number;\n solarPanelLabels: string[];\n setSolarPanelLabels: (labels: string[]) => void;\n solarPanelVisibilityResults: Map>;\n setSolarPanelVisibilityResult: (vantage: Vantage, result: Map) => void;\n clearSolarPanelVisibilityResults: () => void;\n\n dailyParabolicDishYield: DatumEntry[];\n setDailyParabolicDishYield: (data: DatumEntry[]) => void;\n sumDailyParabolicDishYield: () => number;\n yearlyParabolicDishYield: DatumEntry[];\n setYearlyParabolicDishYield: (data: DatumEntry[]) => void;\n sumYearlyParabolicDishYield: () => number;\n parabolicDishLabels: string[];\n setParabolicDishLabels: (labels: string[]) => void;\n\n dailyParabolicTroughYield: DatumEntry[];\n setDailyParabolicTroughYield: (data: DatumEntry[]) => void;\n sumDailyParabolicTroughYield: () => number;\n yearlyParabolicTroughYield: DatumEntry[];\n setYearlyParabolicTroughYield: (data: DatumEntry[]) => void;\n sumYearlyParabolicTroughYield: () => number;\n parabolicTroughLabels: string[];\n setParabolicTroughLabels: (labels: string[]) => void;\n\n dailyFresnelReflectorYield: DatumEntry[];\n setDailyFresnelReflectorYield: (data: DatumEntry[]) => void;\n sumDailyFresnelReflectorYield: () => number;\n yearlyFresnelReflectorYield: DatumEntry[];\n setYearlyFresnelReflectorYield: (data: DatumEntry[]) => void;\n sumYearlyFresnelReflectorYield: () => number;\n fresnelReflectorLabels: string[];\n setFresnelReflectorLabels: (labels: string[]) => void;\n\n dailyHeliostatYield: DatumEntry[];\n setDailyHeliostatYield: (data: DatumEntry[]) => void;\n sumDailyHeliostatYield: () => number;\n yearlyHeliostatYield: DatumEntry[];\n setYearlyHeliostatYield: (data: DatumEntry[]) => void;\n sumYearlyHeliostatYield: () => number;\n heliostatLabels: string[];\n setHeliostatLabels: (labels: string[]) => void;\n\n dailyUpdraftTowerResults: DatumEntry[];\n dailyUpdraftTowerYield: DatumEntry[];\n setDailyUpdraftTowerResults: (data: DatumEntry[]) => void;\n setDailyUpdraftTowerYield: (data: DatumEntry[]) => void;\n sumDailyUpdraftTowerYield: () => number;\n yearlyUpdraftTowerYield: DatumEntry[];\n setYearlyUpdraftTowerYield: (data: DatumEntry[]) => void;\n sumYearlyUpdraftTowerYield: () => number;\n updraftTowerLabels: string[];\n setUpdraftTowerLabels: (labels: string[]) => void;\n\n // store the calculated heat map on the surface of an element\n heatmaps: Map;\n setHeatmap: (id: string, data: number[][]) => void;\n getHeatmap: (id: string) => number[][] | undefined;\n clearHeatmaps: () => void;\n\n // store the calculated hourly heat exchange result between inside and outside through an element of a building\n hourlyHeatExchangeArrayMap: Map;\n setHourlyHeatExchangeArray: (id: string, data: number[]) => void;\n\n // store the calculated results for hourly solar heat gains of a building through windows\n hourlySolarHeatGainArrayMap: Map;\n setHourlySolarHeatGainArray: (id: string, data: number[]) => void;\n\n // store the calculated results for hourly solar panel outputs of a building through windows\n hourlySolarPanelOutputArrayMap: Map;\n setHourlySolarPanelOutputArray: (id: string, data: number[]) => void;\n\n // for logger: store the calculated total heater, AC, and solar panel results of building energy analysis\n totalBuildingHeater: number;\n setTotalBuildingHeater: (heater: number) => void;\n totalBuildingAc: number;\n setTotalBuildingAc: (ac: number) => void;\n totalBuildingSolarPanel: number;\n setTotalBuildingSolarPanel: (solarPanel: number) => void;\n\n roofSegmentVerticesMap: Map; // key: roofId, val: [segmentIndex][vertex]\n setRoofSegmentVertices: (id: string, vertices: Vector3[][]) => void;\n getRoofSegmentVertices: (id: string) => Vector3[][] | undefined;\n deleteRoofSegmentVertices: (id: string) => void;\n\n roofSegmentVerticesWithoutOverhangMap: Map; // key: roofId, val: [segmentIndex][vertex]\n setRoofSegmentVerticesWithoutOverhang: (id: string, vertices: Vector3[][]) => void;\n getRoofSegmentVerticesWithoutOverhang: (id: string) => Vector3[][] | undefined;\n deleteRoofSegmentVerticesWithoutOverhang: (id: string) => void;\n\n clearDataStore: () => void;\n clearRoofVerticesMap: () => void;\n}\n\nexport const useDataStore = create((set, get) => {\n return {\n roofSegmentVerticesMap: new Map(),\n setRoofSegmentVertices(id, vertices) {\n // this set doesn't mutate map, so it won't cause re-render. But its value is updated when we are using it.\n set((state) => {\n state.roofSegmentVerticesMap.set(id, [...vertices]);\n });\n },\n getRoofSegmentVertices(id) {\n return get().roofSegmentVerticesMap.get(id);\n },\n deleteRoofSegmentVertices(id) {\n set((state) => {\n state.roofSegmentVerticesMap.delete(id);\n });\n },\n\n roofSegmentVerticesWithoutOverhangMap: new Map(),\n setRoofSegmentVerticesWithoutOverhang(id, vertices) {\n // this set mutate map, so it won't cause re-render. But its value is updated when we are using it.\n set((state) => {\n state.roofSegmentVerticesWithoutOverhangMap.set(id, vertices);\n });\n },\n getRoofSegmentVerticesWithoutOverhang(id) {\n return get().roofSegmentVerticesWithoutOverhangMap.get(id);\n },\n deleteRoofSegmentVerticesWithoutOverhang(id) {\n set((state) => {\n state.roofSegmentVerticesWithoutOverhangMap.delete(id);\n });\n },\n\n dailyLightSensorData: [],\n setDailyLightSensorData(data) {\n set((state) => {\n state.dailyLightSensorData = [...data];\n });\n },\n yearlyLightSensorData: [],\n setYearlyLightSensorData(data) {\n set((state) => {\n state.yearlyLightSensorData = [...data];\n });\n },\n sensorLabels: [],\n setSensorLabels(labels) {\n set((state) => {\n state.sensorLabels = [...labels];\n });\n },\n\n dailyPvYield: [],\n setDailyPvYield(data) {\n set((state) => {\n state.dailyPvYield = [...data];\n });\n // increment the index of objective evaluation to notify the genetic algorithm that\n // this simulation has completed and the result has been reported to the common store\n usePrimitiveStore.setState((state) => {\n if (state.runEvolution) {\n state.objectiveEvaluationIndex++;\n }\n });\n },\n sumDailyPvYield() {\n let sum = 0;\n for (const datum of this.dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n getDailyPvProfit() {\n const dailyYield = this.sumDailyPvYield();\n const solarPanelNumber = Util.countAllSolarPanels();\n return (\n dailyYield * useStore.getState().economicsParams.electricitySellingPrice -\n solarPanelNumber * useStore.getState().economicsParams.operationalCostPerUnit\n );\n },\n yearlyPvYield: [],\n setYearlyPvYield(data) {\n set((state) => {\n state.yearlyPvYield = [...data];\n });\n // increment the index of objective evaluation to notify the genetic algorithm that\n // this simulation has completed and the result has been reported to the common store\n usePrimitiveStore.setState((state) => {\n if (state.runEvolution) {\n state.objectiveEvaluationIndex++;\n }\n });\n },\n sumYearlyPvYield() {\n let sum = 0;\n for (const datum of this.yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n const yearScaleFactor = 12 / (useStore.getState().world?.daysPerYear ?? 6);\n return sum * yearScaleFactor;\n },\n getYearlyPvProfit() {\n const solarPanelNumber = Util.countAllSolarPanels();\n const yearlyYield = this.sumYearlyPvYield();\n return (\n yearlyYield * useStore.getState().economicsParams.electricitySellingPrice -\n solarPanelNumber * useStore.getState().economicsParams.operationalCostPerUnit * 365\n );\n },\n solarPanelLabels: [],\n setSolarPanelLabels(labels) {\n set((state) => {\n state.solarPanelLabels = [...labels];\n });\n },\n solarPanelVisibilityResults: new Map>(),\n setSolarPanelVisibilityResult(vantage, result) {\n set((state) => {\n state.solarPanelVisibilityResults.set(vantage, result);\n });\n },\n clearSolarPanelVisibilityResults() {\n set((state) => {\n // must create a new map in order for the dependency on it to change for re-rendering\n state.solarPanelVisibilityResults = new Map>();\n });\n },\n\n dailyParabolicDishYield: [],\n setDailyParabolicDishYield(data) {\n set((state) => {\n state.dailyParabolicDishYield = [...data];\n });\n },\n sumDailyParabolicDishYield() {\n let sum = 0;\n for (const datum of this.dailyParabolicDishYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyParabolicDishYield: [],\n setYearlyParabolicDishYield(data) {\n set((state) => {\n state.yearlyParabolicDishYield = [...data];\n });\n },\n sumYearlyParabolicDishYield() {\n let sum = 0;\n for (const datum of this.yearlyParabolicDishYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n parabolicDishLabels: [],\n setParabolicDishLabels(labels) {\n set((state) => {\n state.parabolicDishLabels = [...labels];\n });\n },\n\n dailyParabolicTroughYield: [],\n setDailyParabolicTroughYield(data) {\n set((state) => {\n state.dailyParabolicTroughYield = [...data];\n });\n },\n sumDailyParabolicTroughYield() {\n let sum = 0;\n for (const datum of this.dailyParabolicTroughYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyParabolicTroughYield: [],\n setYearlyParabolicTroughYield(data) {\n set((state) => {\n state.yearlyParabolicTroughYield = [...data];\n });\n },\n sumYearlyParabolicTroughYield() {\n let sum = 0;\n for (const datum of this.yearlyParabolicTroughYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n parabolicTroughLabels: [],\n setParabolicTroughLabels(labels) {\n set((state) => {\n state.parabolicTroughLabels = [...labels];\n });\n },\n\n dailyFresnelReflectorYield: [],\n setDailyFresnelReflectorYield(data) {\n set((state) => {\n state.dailyFresnelReflectorYield = [...data];\n });\n },\n sumDailyFresnelReflectorYield() {\n let sum = 0;\n for (const datum of this.dailyFresnelReflectorYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyFresnelReflectorYield: [],\n setYearlyFresnelReflectorYield(data) {\n set((state) => {\n state.yearlyFresnelReflectorYield = [...data];\n });\n },\n sumYearlyFresnelReflectorYield() {\n let sum = 0;\n for (const datum of this.yearlyFresnelReflectorYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n fresnelReflectorLabels: [],\n setFresnelReflectorLabels(labels) {\n set((state) => {\n state.fresnelReflectorLabels = [...labels];\n });\n },\n\n dailyHeliostatYield: [],\n setDailyHeliostatYield(data) {\n set((state) => {\n state.dailyHeliostatYield = [...data];\n });\n },\n sumDailyHeliostatYield() {\n let sum = 0;\n for (const datum of this.dailyHeliostatYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyHeliostatYield: [],\n setYearlyHeliostatYield(data) {\n set((state) => {\n state.yearlyHeliostatYield = [...data];\n });\n },\n sumYearlyHeliostatYield() {\n let sum = 0;\n for (const datum of this.yearlyHeliostatYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n heliostatLabels: [],\n setHeliostatLabels(labels) {\n set((state) => {\n state.heliostatLabels = [...labels];\n });\n },\n\n dailyUpdraftTowerResults: [],\n dailyUpdraftTowerYield: [],\n setDailyUpdraftTowerResults(data) {\n set((state) => {\n state.dailyUpdraftTowerResults = [...data];\n });\n },\n setDailyUpdraftTowerYield(data) {\n set((state) => {\n state.dailyUpdraftTowerYield = [...data];\n });\n },\n sumDailyUpdraftTowerYield() {\n let sum = 0;\n for (const datum of this.dailyUpdraftTowerYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n yearlyUpdraftTowerYield: [],\n setYearlyUpdraftTowerYield(data) {\n set((state) => {\n state.yearlyUpdraftTowerYield = [...data];\n });\n },\n sumYearlyUpdraftTowerYield() {\n let sum = 0;\n for (const datum of this.yearlyUpdraftTowerYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n sum += datum[prop] as number;\n }\n }\n }\n }\n return sum;\n },\n updraftTowerLabels: [],\n setUpdraftTowerLabels(labels) {\n set((state) => {\n state.updraftTowerLabels = [...labels];\n });\n },\n\n heatmaps: new Map(),\n setHeatmap(id, data) {\n set((state) => {\n state.heatmaps.set(id, data);\n });\n },\n getHeatmap(id) {\n return get().heatmaps.get(id);\n },\n\n hourlyHeatExchangeArrayMap: new Map(),\n setHourlyHeatExchangeArray(id, data) {\n set((state) => {\n state.hourlyHeatExchangeArrayMap.set(id, data);\n });\n },\n\n hourlySolarHeatGainArrayMap: new Map(),\n setHourlySolarHeatGainArray(id, data) {\n set((state) => {\n state.hourlySolarHeatGainArrayMap.set(id, data);\n });\n },\n\n hourlySolarPanelOutputArrayMap: new Map(),\n setHourlySolarPanelOutputArray(id, data) {\n set((state) => {\n state.hourlySolarPanelOutputArrayMap.set(id, data);\n });\n },\n\n totalBuildingHeater: 0,\n setTotalBuildingHeater: (heater: number) => {\n set((state) => {\n state.totalBuildingHeater = heater;\n });\n },\n\n totalBuildingAc: 0,\n setTotalBuildingAc: (ac: number) => {\n set((state) => {\n state.totalBuildingAc = ac;\n });\n },\n\n totalBuildingSolarPanel: 0,\n setTotalBuildingSolarPanel: (solarPanel: number) => {\n set((state) => {\n state.totalBuildingSolarPanel = solarPanel;\n });\n },\n\n clearHeatmaps() {\n set((state) => {\n state.heatmaps.clear();\n });\n },\n\n clearDataStore() {\n set((state) => {\n // create a new empty map in the following\n // do not just clear it as it may not trigger re-rendering\n\n state.heatmaps = new Map();\n state.hourlyHeatExchangeArrayMap = new Map();\n state.hourlySolarHeatGainArrayMap = new Map();\n state.hourlySolarPanelOutputArrayMap = new Map();\n state.solarPanelVisibilityResults = new Map>();\n\n // create a new empty array in the following\n // do not just set the length to zero as it will not trigger re-rendering\n\n state.dailyLightSensorData = [];\n state.yearlyLightSensorData = [];\n state.sensorLabels = [];\n\n state.dailyPvYield = [];\n state.yearlyPvYield = [];\n state.solarPanelLabels = [];\n\n state.dailyParabolicDishYield = [];\n state.yearlyParabolicDishYield = [];\n state.parabolicDishLabels = [];\n\n state.dailyParabolicTroughYield = [];\n state.yearlyParabolicTroughYield = [];\n state.parabolicTroughLabels = [];\n\n state.dailyFresnelReflectorYield = [];\n state.yearlyFresnelReflectorYield = [];\n state.fresnelReflectorLabels = [];\n\n state.dailyHeliostatYield = [];\n state.yearlyHeliostatYield = [];\n state.heliostatLabels = [];\n\n state.dailyUpdraftTowerYield = [];\n state.dailyUpdraftTowerResults = [];\n state.yearlyUpdraftTowerYield = [];\n state.updraftTowerLabels = [];\n });\n },\n clearRoofVerticesMap() {\n set((state) => {\n state.roofSegmentVerticesMap.clear();\n state.roofSegmentVerticesWithoutOverhangMap.clear();\n });\n },\n };\n});\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEASwzc1iU9gAAABRJREFUCJlj/P//PwMSYGJABaTyAer2AwfmvmPmAAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/roof_01.1418beb1.png\";","export default __webpack_public_path__ + \"static/media/roof_02.055d6e06.png\";","export default __webpack_public_path__ + \"static/media/roof_03.1d45e089.png\";","export default __webpack_public_path__ + \"static/media/roof_04.20dee2dd.png\";","export default __webpack_public_path__ + \"static/media/roof_05.34757ec1.png\";","export default __webpack_public_path__ + \"static/media/roof_06.0fce42da.png\";","export default __webpack_public_path__ + \"static/media/roof_07.d0b809f8.png\";","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef } from 'react';\nimport { CatmullRomCurve3, EllipseCurve, Euler, FrontSide, MeshStandardMaterial, Shape, Vector3 } from 'three';\nimport { Box, Cone, Cylinder, Extrude, Line, Plane } from '@react-three/drei';\nimport { useStore } from 'src/stores/common';\nimport * as Selector from 'src/stores/selector';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { FrameDataType, MullionDataType, Shutter, WireframeDataType } from './window';\nimport { Util } from '../../Util';\nimport { useDataStore } from '../../stores/commonData';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface ArchedWindowProps {\n id: string;\n dimension: number[];\n position: number[];\n mullionData: MullionDataType;\n frameData: FrameDataType;\n wireframeData: WireframeDataType;\n leftShutter: boolean;\n rightShutter: boolean;\n shutterColor: string;\n shutterWidth: number;\n glassMaterial: JSX.Element;\n showHeatFluxes: boolean;\n area: number;\n empty: boolean;\n interior: boolean;\n foundation: FoundationModel | null;\n}\n\ninterface MullionProps {\n dimension: number[];\n mullionData: MullionDataType;\n shadowEnabled: boolean;\n}\n\ninterface FrameProps {\n dimension: number[];\n frameData: FrameDataType;\n shadowEnabled: boolean;\n}\n\ninterface ArchedWireframeProps {\n cy: number;\n dimension: number[];\n wireframeData: WireframeDataType;\n drawBottom?: boolean;\n}\n\ntype ArgsType = [x: number, y: number, z: number];\n\nconst sealPlanesMaterial = new MeshStandardMaterial({ color: 'white', side: FrontSide });\n\nconst Mullion = React.memo(({ dimension, mullionData, shadowEnabled }: MullionProps) => {\n const [lx, ly, lz, archHeight] = dimension;\n const ah = Math.min(archHeight, lz, lx / 2);\n\n const { width, horizontalMullionSpacing, verticalMullionSpacing, color } = mullionData;\n\n const radialSegments = 3;\n const heightSegments = 1;\n const mullionRadius = width / 2;\n const radialMullionAngle = useMemo(() => Math.atan2(lx / 2, ah), [lx, ah]);\n const radialMullionLength = useMemo(() => {\n if (ah === 0 || lx === 0) {\n return 0;\n }\n const r = ah / 2 + lx ** 2 / (8 * ah);\n const a = r - ah;\n const angle = Math.PI - radialMullionAngle;\n const aSquare = a ** 2;\n const bSquare = r ** 2;\n const cSquare =\n aSquare +\n bSquare -\n 2 * aSquare * Math.sin(angle) ** 2 -\n 2 * a * Math.sqrt((bSquare - aSquare * Math.sin(angle) ** 2) * Math.cos(angle) ** 2);\n return Math.sqrt(cSquare);\n }, [lx, ah, radialMullionAngle]);\n\n const material = useMemo(() => , [color]);\n\n const drawArchMullionShape = (radius: number) => {\n return new Shape()\n .moveTo(0, radius)\n .quadraticCurveTo(radius, radius, radius, 0)\n .quadraticCurveTo(radius, -radius, 0, -radius)\n .quadraticCurveTo(-radius, -radius, -radius, 0)\n .quadraticCurveTo(-radius, radius, 0, radius);\n };\n\n const drawArchMullionPath = (ah: number, x: number) => {\n const h = (ah * x) / (lx / 2);\n const r = h / 2 + (x * 2) ** 2 / (8 * h);\n const startAngle = Math.acos(Math.min(1, x / r));\n const endAngle = Math.PI - startAngle;\n const points = new EllipseCurve(0, h - r, r, r, startAngle, endAngle, false, 0)\n .getPoints(24)\n .map((v2) => new Vector3(v2.x, v2.y));\n return new CatmullRomCurve3(points);\n };\n\n const verticalMullions = useMemo(() => {\n const arr: number[] = [];\n const dividers = Math.round(lx / verticalMullionSpacing) - 1;\n if (dividers <= 0 || width === 0) {\n return null;\n }\n const step = lx / (dividers + 1);\n let x = step / 2;\n if (dividers % 2 !== 0) {\n arr.push(0);\n x = step;\n }\n for (let num = 0; num < Math.floor(dividers / 2); num++, x += step) {\n arr.push(x, -x);\n }\n return arr;\n }, [lx, width, verticalMullionSpacing]);\n\n const horizontalMullions = useMemo(() => {\n const arr: number[] = [];\n if (width === 0) {\n return arr;\n }\n const top = lz / 2 - ah; // include\n const totalDist = lz - ah;\n const number = Math.ceil(totalDist / horizontalMullionSpacing);\n let curr = top;\n for (let i = 0; i < number; i++) {\n arr.push(curr);\n curr -= horizontalMullionSpacing;\n }\n return arr;\n }, [lx, lz, ah, width, horizontalMullionSpacing]);\n\n const archMullions = useMemo(() => {\n const arr: number[] = [];\n\n const dividers = Math.round(lx / verticalMullionSpacing) - 1;\n if (dividers <= 0 || width === 0) {\n return null;\n }\n const step = lx / (dividers + 1);\n let x = step / 2;\n if (dividers % 2 !== 0) {\n x = step;\n }\n for (let num = 0; num < Math.floor(dividers / 2); num++, x += step) {\n if (x !== 0) {\n arr.push(x);\n }\n }\n\n const shape = drawArchMullionShape(mullionRadius / 2);\n\n return arr.map((x, idx) => {\n if (ah < lx / 4 && idx % 2 === 1) {\n return null;\n }\n if (ah < lx / 6 && idx % 3 !== 0) {\n return null;\n }\n return { shape, path: drawArchMullionPath(ah, x) };\n });\n }, [lx, lz, ah, width, verticalMullionSpacing]);\n\n const renderRadialMullion = (length: number, angle: number) => {\n return (\n \n \n {material}\n \n \n );\n };\n\n return (\n \n {mullionData.horizontalMullion &&\n horizontalMullions.map((z, index) => (\n \n {material}\n \n ))}\n {mullionData.verticalMullion &&\n verticalMullions?.map((x, index) => (\n \n {material}\n \n ))}\n {ah > 0 &&\n archMullions?.map((item, index) => {\n if (item === null) return null;\n const { shape, path } = item;\n return (\n \n {material}\n \n );\n })}\n {radialMullionLength > 0 && (\n <>\n {renderRadialMullion(ah, 0)}\n {renderRadialMullion(radialMullionLength, radialMullionAngle)}\n {renderRadialMullion(radialMullionLength, -radialMullionAngle)}\n \n )}\n \n );\n});\n\nconst Frame = React.memo(({ dimension, frameData, shadowEnabled }: FrameProps) => {\n const [lx, ly, lz, archHeight] = dimension;\n const hx = lx / 2;\n const ah = Math.min(archHeight, lz, hx);\n\n const { color, width, sillWidth } = frameData;\n const material = useMemo(() => , [color]);\n\n const halfWidth = width / 2;\n const depth = halfWidth / 2;\n const sillLength = lx + width * 3;\n const sillThickness = width;\n\n const archedFrameShape = useMemo(() => {\n const [x1, x2] = [hx + width, hx];\n\n const h1 = ah + width;\n const r1 = h1 / 2 + (x1 * 2) ** 2 / (8 * h1);\n const startAngle1 = Math.acos(Math.min(1, x1 / r1));\n const endAngle1 = Math.PI - startAngle1;\n const y1 = h1 - r1;\n\n const h2 = ah;\n const r2 = h2 / 2 + (x2 * 2) ** 2 / (8 * h2);\n const startAngle2 = Math.acos(Math.min(1, x2 / r2));\n const endAngle2 = Math.PI - startAngle2;\n const y2 = h2 - r2;\n\n const points1 = new EllipseCurve(0, y1, r1, r1, startAngle1, endAngle1, false, 0).getPoints(36);\n const points2 = new EllipseCurve(0, y2, r2, r2, endAngle2, startAngle2, true, 0).getPoints(36);\n\n return new Shape([...points1, ...points2]);\n }, [archHeight, lz, lx, width]);\n\n return (\n \n {/* top */}\n {ah > 0.1 ? (\n \n {material}\n \n ) : (\n \n {material}\n \n )}\n\n {/* left */}\n \n {material}\n \n\n {/* right */}\n \n {material}\n \n\n {/* bottom */}\n \n {material}\n \n \n );\n});\n\nexport const ArchedWireframe = React.memo(({ cy, dimension, wireframeData, drawBottom }: ArchedWireframeProps) => {\n const [lx, ly, lz, archHeight] = dimension;\n const { lineWidth, lineColor, selected, locked, opacity } = wireframeData;\n\n const thinLine = lineWidth / 20;\n const boldLine = lineWidth / 5;\n\n const hx = lx / 2;\n const hz = lz / 2;\n const ah = Math.min(archHeight, lz, hx);\n\n const radialSegments = 6;\n const heightSegments = 1;\n\n const drawArchedPath = (ah: number, x: number) => {\n const r = ah / 2 + (x * 2) ** 2 / (8 * ah);\n const startAngle = Math.acos(Math.min(1, x / r));\n const endAngle = Math.PI - startAngle;\n const points = new EllipseCurve(0, ah - r, r, r, startAngle, endAngle, false, 0)\n .getPoints(24)\n .map((v2) => new Vector3(v2.x, v2.y));\n return new CatmullRomCurve3(points);\n };\n\n const drawCircleShape = (radius: number) => {\n return new Shape()\n .moveTo(0, radius)\n .quadraticCurveTo(radius, radius, radius, 0)\n .quadraticCurveTo(radius, -radius, 0, -radius)\n .quadraticCurveTo(-radius, -radius, -radius, 0)\n .quadraticCurveTo(-radius, radius, 0, radius);\n };\n\n const material = useMemo(() => new MeshStandardMaterial({ color: lineColor }), [lineColor]);\n const highLightMaterial = useMemo(() => new MeshStandardMaterial({ color: LOCKED_ELEMENT_SELECTION_COLOR }), []);\n\n const renderLines = (width: number, mat: MeshStandardMaterial) => {\n return (\n <>\n {/* top */}\n {ah > 0.1 ? (\n \n ) : (\n \n )}\n\n {/* bottom */}\n {drawBottom && (\n \n )}\n\n {/* right */}\n \n\n {/* left */}\n \n \n );\n };\n\n return (\n \n {opacity > 0 && {renderLines(thinLine, material)}}\n {locked && selected && renderLines(boldLine, highLightMaterial)}\n \n );\n});\n\nconst ArchedWindow = ({\n id,\n dimension,\n position,\n mullionData,\n frameData,\n wireframeData,\n leftShutter,\n rightShutter,\n shutterColor,\n shutterWidth,\n glassMaterial,\n showHeatFluxes,\n area,\n empty,\n interior,\n foundation,\n}: ArchedWindowProps) => {\n const world = useStore.getState().world;\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [lx, ly, lz, archHeight] = dimension;\n const [cx, cy, cz] = position;\n\n const pointWithinArch = (x: number, z: number) => {\n if (archHeight > 0) {\n const hx = 0.5 * lx;\n const hz = 0.5 * lz;\n const ah = Math.min(archHeight, lz, hx); // actual arch height\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\n // check if the point is within the rectangular part\n if (Math.abs(x) < hx && z < hz - ah && z > -hz) {\n return true;\n }\n // check if the point is within the arch part\n const dz = z - (lz - r - hz);\n return x * x + dz * dz < r * r;\n }\n return true;\n };\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes || interior) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinArch(rx, rz)) {\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, intensity, rz));\n vectors.push(v);\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinArch(rx, rz)) {\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, -intensity, rz));\n vectors.push(v);\n }\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const widthShutter = useMemo(() => shutterWidth * lx, [lx, shutterWidth]);\n const heightShutter = useMemo(() => lz - Math.min(archHeight, lz, lx / 2), [lx, lz, archHeight]);\n const shutterPosX = useMemo(\n () => ((widthShutter + frameData.width + lx) / 2) * 1.025,\n [lx, widthShutter, frameData.width],\n );\n const shutterPosZ = useMemo(() => -Math.min(archHeight, lz, lx / 2) / 2, [lz, heightShutter]);\n\n const glassShape = useMemo(() => getArchedWindowShape(lx, lz, archHeight), [lx, lz, archHeight]);\n\n const renderSealPlane = (args: [width: number, height: number], position: ArgsType, rotation?: ArgsType) => (\n \n );\n\n return (\n <>\n {!empty && (\n \n \n \n {glassMaterial}\n \n\n {(mullionData.horizontalMullion || mullionData.verticalMullion) && archHeight !== undefined && (\n \n )}\n \n )}\n\n {frameData.showFrame && }\n\n \n\n \n\n {renderSealPlane([ly, lz], [-lx / 2, ly / 2, 0], [HALF_PI, HALF_PI, 0])}\n {renderSealPlane([ly, lz], [lx / 2, ly / 2, 0], [HALF_PI, -HALF_PI, 0])}\n {/* {renderSealPlane([lx, ly], [0, ly / 2, lz / 2], [Math.PI, 0, 0])} */}\n {renderSealPlane([lx, ly], [0, ly / 2, -lz / 2])}\n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n};\n\nexport const getArchedWindowShape = (lx: number, lz: number, archHeight: number, cx = 0, cy = 0) => {\n const s = new Shape();\n const hx = lx / 2;\n const hz = lz / 2;\n const ah = Math.min(archHeight, lz, hx);\n s.moveTo(cx - hx, cy - hz);\n s.lineTo(cx + hx, cy - hz);\n s.lineTo(cx + hx, cy + hz - ah);\n if (ah > 0.01) {\n const r = ah / 2 + lx ** 2 / (8 * ah);\n const [cX, cY] = [cx, cy + hz - r];\n const startAngle = Math.acos(Math.min(1, hx / r));\n const endAngle = Math.PI - startAngle;\n s.absarc(cX, cY, r, startAngle, endAngle, false);\n } else {\n s.lineTo(cx - hx, cy + hz);\n }\n s.closePath();\n return s;\n};\n\nexport default React.memo(ArchedWindow);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Box, Cone, Cylinder, Extrude, Line, Plane } from '@react-three/drei';\nimport React, { useMemo, useRef } from 'react';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { useStore } from 'src/stores/common';\nimport { DoubleSide, Euler, MeshStandardMaterial, Shape, Vector3 } from 'three';\nimport * as Selector from 'src/stores/selector';\nimport { FrameDataType, Shutter, WireframeDataType } from './window';\nimport { RoofUtil } from '../roof/RoofUtil';\nimport { useDataStore } from '../../stores/commonData';\nimport { Util } from '../../Util';\nimport { Point2 } from '../../models/Point2';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface PolygonalWindowProps {\n id: string;\n dimension: number[];\n position: number[];\n polygonTop: number[];\n glassMaterial: JSX.Element;\n empty: boolean;\n interior: boolean;\n wireframeData: WireframeDataType;\n frameData: FrameDataType;\n leftShutter: boolean;\n rightShutter: boolean;\n shutterColor: string;\n shutterWidth: number;\n area: number;\n showHeatFluxes: boolean;\n foundation: FoundationModel | null;\n}\n\ninterface FrameProps {\n dimension: number[];\n polygonTop: number[];\n frameData: FrameDataType;\n shadowEnabled: boolean;\n}\n\nconst CYLINDER_HEIGHT_SEGMENTS = 1;\nconst CYLINDER_RADIAL_SEGMENTS = 3;\nconst sealPlanesMaterial = new MeshStandardMaterial({ color: 'white', side: DoubleSide });\nconst HALF_PI_Z_EULER = new Euler(0, 0, -HALF_PI);\n\nconst Frame = React.memo(({ dimension, polygonTop, frameData, shadowEnabled }: FrameProps) => {\n const [lx, ly, lz] = dimension;\n const [topX, topH] = polygonTop;\n const { color, width, sillWidth } = frameData;\n const material = useMemo(() => , [color]);\n\n const [hx, hz] = [lx / 2, lz / 2];\n const halfWidth = width / 2;\n const depth = halfWidth / 2;\n const sillLength = lx + width * 3;\n const sillThickness = width;\n\n // from right to left, 2D. length should be 5.\n const innerPoints = useMemo(() => {\n const botRight = new Vector3(hx, -hz);\n const topRight = new Vector3(hx, hz);\n const topLeft = new Vector3(-hx, hz);\n const botLeft = new Vector3(-hx, -hz);\n const topMid = new Vector3(topX * lx, topH + hz);\n return [botRight, topRight, topMid, topLeft, botLeft];\n }, [hx, hz, topX, topH]);\n\n const outerPoints = useMemo(() => {\n const normals: Vector3[] = [];\n for (let i = 1; i < innerPoints.length; i++) {\n const p1 = innerPoints[i - 1];\n const p2 = innerPoints[i];\n const n = new Vector3().subVectors(p2, p1).normalize().applyEuler(HALF_PI_Z_EULER);\n normals.push(n);\n }\n\n const edgesAfterOffset: { start: Vector3; end: Vector3 }[] = [];\n for (let i = 0; i < normals.length; i++) {\n const n = normals[i];\n const offset = n.clone().multiplyScalar(width);\n if (i < innerPoints.length - 1) {\n const p1 = innerPoints[i].clone().add(offset);\n const p2 = innerPoints[i + 1].clone().add(offset);\n edgesAfterOffset.push({ start: p1, end: p2 });\n }\n }\n\n const points: Vector3[] = [];\n points.push(edgesAfterOffset[0].start);\n for (let i = 1; i < edgesAfterOffset.length; i++) {\n const edge1 = edgesAfterOffset[i - 1];\n const edge2 = edgesAfterOffset[i];\n const point = RoofUtil.getIntersectionPoint(edge1.start, edge1.end, edge2.start, edge2.end);\n points.push(point);\n }\n points.push(edgesAfterOffset[edgesAfterOffset.length - 1].end);\n\n return points;\n }, [innerPoints, width]);\n\n const shape = useMemo(() => {\n const s = new Shape();\n for (let i = 0; i < outerPoints.length; i++) {\n const point = outerPoints[i];\n if (i === 0) {\n s.moveTo(point.x, point.y);\n } else {\n s.lineTo(point.x, point.y);\n }\n }\n for (let i = innerPoints.length - 1; i >= 0; i--) {\n const point = innerPoints[i];\n s.lineTo(point.x, point.y);\n }\n s.closePath();\n return s;\n }, [innerPoints, outerPoints]);\n\n return (\n \n \n {material}\n \n {/* bottom */}\n \n {material}\n \n \n );\n});\n\nconst PolygonalWindow = ({\n id,\n dimension,\n polygonTop,\n position,\n glassMaterial,\n empty,\n interior,\n wireframeData,\n frameData,\n leftShutter,\n rightShutter,\n shutterColor,\n shutterWidth,\n area,\n showHeatFluxes,\n foundation,\n}: PolygonalWindowProps) => {\n const world = useStore.getState().world;\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [cx, cy, cz] = position;\n const [lx, ly, lz] = dimension;\n const [hx, hy, hz] = dimension.map((v) => v / 2);\n const [topX, topH] = polygonTop;\n const { lineWidth, lineColor, selected, locked, opacity } = wireframeData;\n\n const absTopX = topX * lx;\n const topRightLength = Math.hypot(topH, hx - absTopX);\n const topRightRotation = Math.asin(topH / topRightLength);\n const topLeftLength = Math.hypot(topH, hx + absTopX);\n const topLeftRotation = -Math.asin(topH / topLeftLength);\n\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n\n const pointWithinPolygon = (x: number, z: number) => {\n const hx = 0.5 * lx;\n const hz = 0.5 * (lz + polygonTop[1]);\n const shiftZ = polygonTop[1];\n const points: Point2[] = [\n { x: -hx, y: -hz } as Point2,\n { x: hx, y: -hz } as Point2,\n { x: hx, y: hz - shiftZ } as Point2,\n { x: lx * polygonTop[0], y: hz } as Point2,\n { x: -hx, y: hz - shiftZ } as Point2,\n ];\n return Util.isPointInside(x, z, points);\n };\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes || interior) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const bz = lz + polygonTop[1];\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(bz / cellSize));\n const dx = lx / nx;\n const dz = bz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n const shiftZ = polygonTop[1] / 2;\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinPolygon(rx, rz)) {\n v.push(new Vector3(rx, 0, rz + shiftZ));\n v.push(new Vector3(rx, intensity, rz + shiftZ));\n vectors.push(v);\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinPolygon(rx, rz)) {\n v.push(new Vector3(rx, 0, rz + shiftZ));\n v.push(new Vector3(rx, -intensity, rz + shiftZ));\n vectors.push(v);\n }\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const shutterLength = useMemo(() => shutterWidth * lx, [lx, shutterWidth]);\n const shutterPosX = useMemo(\n () => ((shutterLength + frameData.width + lx) / 2) * 1.025,\n [lx, shutterLength, frameData.width],\n );\n\n const glassShape = useMemo(() => {\n const [hx, hz] = [lx / 2, lz / 2];\n const tx = topX * lx; // abs\n return getPolygonWindowShape(hx, hz, tx, topH);\n }, [lx, lz, topX, topH]);\n\n const wireframeMaterial = useMemo(() => {\n if (selected && locked) {\n return new MeshStandardMaterial({ color: LOCKED_ELEMENT_SELECTION_COLOR });\n } else {\n return new MeshStandardMaterial({ color: lineColor });\n }\n }, [lineColor, selected, locked]);\n\n const wireframeWidth = useMemo(() => {\n if (locked && selected) {\n return lineWidth / 5;\n } else {\n return lineWidth / 20;\n }\n }, [lineWidth, selected, locked]);\n\n const wireframeCy = useMemo(() => {\n if (locked && selected) {\n return -ly / 2;\n } else {\n return -cy;\n }\n }, [cy, ly, selected, locked]);\n\n const renderWireframeLine = (length: number, offset = 0) => {\n return (\n \n );\n };\n\n const renderSealPlane = (length: number, offset = 0) => {\n return (\n \n );\n };\n\n return (\n <>\n {!empty && (\n \n \n {glassMaterial}\n \n )}\n\n {frameData.showFrame && (\n \n )}\n\n \n\n \n {renderSealPlane(lx)}\n {renderWireframeLine(lx)}\n \n\n \n {renderSealPlane(lz)}\n {renderWireframeLine(lz)}\n \n\n \n {renderSealPlane(lz)}\n {renderWireframeLine(lz)}\n \n\n \n {renderSealPlane(topLeftLength, topLeftLength / 2)}\n {renderWireframeLine(topLeftLength, topLeftLength / 2)}\n \n\n \n {renderSealPlane(topRightLength, -topRightLength / 2)}\n {renderWireframeLine(topRightLength, -topRightLength / 2)}\n \n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n};\n\nexport const getPolygonWindowShape = (hx: number, hy: number, tx: number, th: number, cx = 0, cy = 0) => {\n const shape = new Shape();\n shape.moveTo(cx - hx, cy - hy);\n shape.lineTo(cx + hx, cy - hy);\n shape.lineTo(cx + hx, cy + hy);\n shape.lineTo(cx + tx, cy + hy + th);\n shape.lineTo(cx - hx, cy + hy);\n shape.closePath();\n return shape;\n};\n\nexport default React.memo(PolygonalWindow);\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport { useTransparent } from './hooks';\r\nimport { RoofSegmentProps } from './roofRenderer';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { useStore } from 'src/stores/common';\r\nimport {\r\n BoxBufferGeometry,\r\n CanvasTexture,\r\n Euler,\r\n ExtrudeBufferGeometry,\r\n Float32BufferAttribute,\r\n Mesh,\r\n Texture,\r\n Vector2,\r\n Vector3,\r\n} from 'three';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { Util } from '../../Util';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../../constants';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { Cone, Line } from '@react-three/drei';\r\nimport { Point2 } from '../../models/Point2';\r\nimport { RoofType } from '../../models/RoofModel';\r\nimport { CSG } from 'three-csg-ts';\r\nimport { ObjectType } from 'src/types';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { WindowType } from 'src/models/WindowModel';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { getArchedWindowShape } from '../window/archedWindow';\r\nimport { getPolygonWindowShape } from '../window/polygonalWindow';\r\nimport { FoundationModel } from '../../models/FoundationModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\nimport shallow from 'zustand/shallow';\r\n\r\nexport type WindowData = {\r\n dimension: Vector3;\r\n position: Vector3;\r\n rotation: Euler;\r\n windowType: WindowType;\r\n archHeight: number;\r\n topPosition?: number[];\r\n};\r\n\r\nexport const RoofSegment = ({\r\n id,\r\n index,\r\n foundationModel,\r\n roofType,\r\n segment,\r\n centroid,\r\n thickness,\r\n color,\r\n sideColor,\r\n texture,\r\n heatmap,\r\n windows,\r\n}: {\r\n id: string;\r\n index: number;\r\n foundationModel: FoundationModel | null;\r\n roofType: RoofType;\r\n segment: RoofSegmentProps;\r\n centroid: Vector3;\r\n thickness: number;\r\n color: string;\r\n sideColor: string;\r\n texture: Texture;\r\n heatmap?: CanvasTexture;\r\n windows: WindowModel[];\r\n}) => {\r\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\r\n\r\n const { transparent, opacity } = useTransparent();\r\n\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowLength = useRef();\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const world = useStore.getState().world;\r\n const hourlyHeatExchangeArrayMap = useDataStore.getState().hourlyHeatExchangeArrayMap;\r\n const { points } = segment;\r\n\r\n const overhangLines: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments) return undefined;\r\n const lines: Vector3[][] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness + 0.1);\r\n switch (roofType) {\r\n case RoofType.Hip:\r\n case RoofType.Pyramid:\r\n for (const seg of segments) {\r\n const p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n break;\r\n case RoofType.Mansard:\r\n for (const [i, seg] of segments.entries()) {\r\n if (i === segments.length - 1) continue;\r\n const p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n break;\r\n case RoofType.Gambrel:\r\n for (const [i, seg] of segments.entries()) {\r\n if (i === 0 || i === 3) {\r\n const p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n let p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[3].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n p = [];\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[2].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n break;\r\n }\r\n return lines;\r\n }, [showHeatFluxes]);\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (foundationModel && foundationModel.notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id + '-' + index);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments || !segments[index]) return undefined;\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft, wallLeftAfterOverhang] = points;\r\n const thickness = wallLeftAfterOverhang.z - wallLeft.z;\r\n const s = segments[index].map((v) => v.clone().sub(centroid).add(new Vector3(0, 0, thickness)));\r\n if (!s) return undefined;\r\n const projectedVertices: Point2[] = [];\r\n for (const t of s) {\r\n projectedVertices.push({ x: t.x, y: t.y } as Point2);\r\n }\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const s0 = s[0].clone();\r\n const s1 = s[1].clone();\r\n const s2 = s[2].clone();\r\n const v10 = new Vector3().subVectors(s1, s0);\r\n const v20 = new Vector3().subVectors(s2, s0);\r\n const v21 = new Vector3().subVectors(s2, s1);\r\n const length10 = v10.length();\r\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\r\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\r\n const m = Math.max(2, Math.floor(length10 / cellSize));\r\n const n = Math.max(2, Math.floor(distance / cellSize));\r\n v10.normalize();\r\n v20.normalize();\r\n v21.normalize();\r\n // find the normal vector of the quad\r\n const normal = new Vector3().crossVectors(v20, v21).normalize();\r\n // find the incremental vector going along the bottom edge (half of length)\r\n const dm = v10.multiplyScalar((0.5 * length10) / m);\r\n // find the incremental vector going from bottom to top (half of length)\r\n const dn = new Vector3()\r\n .crossVectors(normal, v10)\r\n .normalize()\r\n .multiplyScalar((0.5 * distance) / n);\r\n // find the starting point of the grid (shift half of length in both directions)\r\n const v0 = s0.clone().add(dm).add(dn);\r\n // double half-length to full-length for the increment vectors in both directions\r\n dm.multiplyScalar(2);\r\n dn.multiplyScalar(2);\r\n heatFluxArrowLength.current = normal.clone().multiplyScalar(0.1);\r\n const vectors: Vector3[][] = [];\r\n const origin = new Vector3();\r\n let area =\r\n s.length === 4\r\n ? Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0])\r\n : Util.getTriangleArea(s[0], s[1], s[2]);\r\n if (area === 0) return undefined;\r\n let windows = getChildrenOfType(ObjectType.Window, id);\r\n const segmentsWithoutOverhang = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (segmentsWithoutOverhang && segmentsWithoutOverhang[index]) {\r\n windows = windows.filter((e) => {\r\n const w = e as WindowModel;\r\n const wcy = w.cy + (w.windowType === WindowType.Polygonal && w.polygonTop ? w.polygonTop[1] / 2 : 0);\r\n return RoofUtil.onSegment(segmentsWithoutOverhang[index], e.cx, wcy);\r\n });\r\n }\r\n if (windows && windows.length > 0) {\r\n for (const w of windows) {\r\n area -= Util.getWindowArea(w as WindowModel);\r\n }\r\n }\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowEuler.current = Util.getEuler(UNIT_VECTOR_POS_Z, normal, 'YXZ', -Math.sign(intensity) * HALF_PI);\r\n let isRoof;\r\n for (let p = 0; p < m; p++) {\r\n const dmp = dm.clone().multiplyScalar(p);\r\n for (let q = 0; q < n; q++) {\r\n origin.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\r\n isRoof = true;\r\n if (windows && windows.length > 0) {\r\n // add the centroid back as the vertices of the window are not relative to it\r\n const ox = origin.x + centroid.x;\r\n const oy = origin.y + centroid.y;\r\n for (const w of windows) {\r\n const vertices = RoofUtil.getRelativeWindowVerticesOnRoof(w as WindowModel);\r\n const points = Util.getPoints(vertices);\r\n if (Util.isPointInside(ox, oy, points)) {\r\n isRoof = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (isRoof) {\r\n if (Util.isPointInside(origin.x, origin.y, projectedVertices)) {\r\n const v: Vector3[] = [];\r\n if (intensity < 0) {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(-intensity)));\r\n } else {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(intensity)));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [showHeatFluxes, heatFluxScaleFactor]);\r\n\r\n return (\r\n <>\r\n \r\n\r\n {overhangLines &&\r\n overhangLines.map((v, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {heatFluxes &&\r\n heatFluxes.map((v, index) => {\r\n return (\r\n \r\n \r\n ;\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\ninterface BufferRoofSegmentProps {\r\n id: string;\r\n index: number;\r\n segment: RoofSegmentProps;\r\n color: string;\r\n sideColor: string;\r\n texture: Texture;\r\n heatmap?: CanvasTexture;\r\n transparent: boolean;\r\n opacity: number;\r\n windows: WindowModel[];\r\n centroid: Vector3;\r\n}\r\n\r\nexport const BufferRoofSegment = React.memo(\r\n ({\r\n id,\r\n index,\r\n segment,\r\n color,\r\n sideColor,\r\n texture,\r\n heatmap,\r\n transparent,\r\n opacity,\r\n windows,\r\n centroid,\r\n }: BufferRoofSegmentProps) => {\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n\r\n const ref = useRef(null);\r\n\r\n const { points } = segment;\r\n const topLayerTexture = showSolarRadiationHeatmap ? heatmap : texture;\r\n const isTri = points.length === 6;\r\n const isQuad = points.length === 8;\r\n\r\n const holeMeshes = useMemo(\r\n () =>\r\n windows.map((w) => {\r\n const dimension = new Vector3(w.lx, w.lz, w.ly * 2);\r\n const position = new Vector3(w.cx, w.cy, w.cz).sub(centroid);\r\n const rotation = new Euler().fromArray([...w.rotation, 'ZXY']);\r\n\r\n if (w.windowType === WindowType.Polygonal) {\r\n // triangle window\r\n const [topX, topH] = w.polygonTop ?? DEFAULT_POLYGONTOP;\r\n const [hx, hy, tx] = [dimension.x / 2, dimension.y / 2, topX * dimension.x];\r\n\r\n const shape = getPolygonWindowShape(hx, hy, tx, topH);\r\n const holeMesh = new Mesh(\r\n new ExtrudeBufferGeometry([shape], { steps: 1, depth: dimension.z, bevelEnabled: false }),\r\n );\r\n const offset = new Vector3(0, 0, -dimension.z).applyEuler(rotation);\r\n holeMesh.position.copy(position.clone().add(offset));\r\n holeMesh.rotation.copy(rotation);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n } else if (w.windowType === WindowType.Arched) {\r\n const shape = getArchedWindowShape(dimension.x, dimension.y, w.archHeight);\r\n const holeMesh = new Mesh(\r\n new ExtrudeBufferGeometry([shape], { steps: 1, depth: dimension.z, bevelEnabled: false }),\r\n );\r\n const offset = new Vector3(0, 0, -dimension.z).applyEuler(rotation);\r\n holeMesh.position.copy(position.clone().add(offset));\r\n holeMesh.rotation.copy(rotation);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n } else {\r\n // rectangle window\r\n const holeMesh = new Mesh(new BoxBufferGeometry(dimension.x, dimension.y, dimension.z));\r\n holeMesh.position.copy(position);\r\n holeMesh.rotation.copy(rotation);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }\r\n }),\r\n [windows, centroid],\r\n );\r\n\r\n const materialGroupNumber = render() ?? 6;\r\n\r\n const materialArray = useMemo(() => Array(materialGroupNumber).fill(0), [materialGroupNumber]);\r\n\r\n useEffect(() => {\r\n render();\r\n }, []);\r\n\r\n if (!isTri && !isQuad) return null;\r\n\r\n function render() {\r\n if (!ref.current || (!isTri && !isQuad)) return;\r\n\r\n const geometry = ref.current.geometry;\r\n geometry.index = null;\r\n geometry.clearGroups();\r\n\r\n const positions: number[] = [];\r\n const uvs: number[] = [];\r\n\r\n let vertexIndex = 0;\r\n let materialIndex = 0;\r\n\r\n /*\r\n 7----6\r\n /| /| 5\r\n 4----5 | /|\\\r\n | | | | 3---4\r\n | 3--|-2 | 2 |\r\n |/ |/ |/ \\|\r\n 0----1 0---1\r\n quad tri\r\n */\r\n\r\n if (isTri) {\r\n // set top layer positions, uvs and groups\r\n const topLayerPoints = points.slice(points.length / 2);\r\n addPositions(topLayerPoints);\r\n showSolarRadiationHeatmap ? addHeatmapUVs() : addUVs(topLayerPoints);\r\n addGroup(3);\r\n\r\n // set bottom layer positions, uvs, groups\r\n const bottomLayerPoints = points.slice(0, points.length / 2).reverse();\r\n addPositions(bottomLayerPoints);\r\n uvs.push(0, 0, 1, 0, 0, 1);\r\n addGroup(3);\r\n\r\n // side surfaces\r\n buildSideSurface([\r\n [0, 1, 4, 3],\r\n [1, 2, 5, 4],\r\n [2, 0, 3, 5],\r\n ]);\r\n } else if (isQuad) {\r\n // set top layer positions\r\n const topLayerPoints = points.slice(points.length / 2);\r\n const [triTopLower, triTopUpper] = triangulate(topLayerPoints);\r\n addPositions(triTopLower);\r\n addPositions(triTopUpper);\r\n\r\n const [ta, tb, tc, td] = topLayerPoints;\r\n const isLowerLeft = triTopLower[2].equals(td); // is segment triangulated by lowerLeft and upperRight\r\n\r\n // set top layer uvs\r\n if (!showSolarRadiationHeatmap) {\r\n const ab = new Vector3().subVectors(tb, ta);\r\n const ac = new Vector3().subVectors(tc, ta);\r\n const ad = new Vector3().subVectors(td, ta);\r\n const abxy = new Vector2(tb.x - ta.x, tb.y - ta.y);\r\n const lab = abxy.length();\r\n\r\n const ub = lab;\r\n const vb = 0;\r\n const uc = ab.dot(ac) / lab;\r\n const vc = ab.clone().cross(ac).length() / lab;\r\n const ud = ab.dot(ad) / lab;\r\n const vd = ab.clone().cross(ad).length() / lab;\r\n\r\n if (isLowerLeft) {\r\n uvs.push(0, 0, ub, vb, ud, vd); // lower\r\n uvs.push(ub, vb, uc, vc, ud, vd); // upper\r\n } else {\r\n uvs.push(0, 0, ub, vb, uc, vc); // lower\r\n uvs.push(0, 0, uc, vc, ud, vd); // upper\r\n }\r\n } else {\r\n addHeatmapUVs(isLowerLeft);\r\n }\r\n\r\n // set top layer groups\r\n addGroup(6);\r\n\r\n // set bottom layer positions, uvs, groups\r\n const bottomLayerPoints = points.slice(0, points.length / 2);\r\n const [triBotLower, triBotUpper] = triangulate(bottomLayerPoints);\r\n addPositions(triBotLower.reverse());\r\n addPositions(triBotUpper.reverse());\r\n uvs.push(0, 0, 1, 0, 0, 1);\r\n uvs.push(0, 1, 1, 0, 1, 1);\r\n addGroup(6);\r\n\r\n // side surfaces\r\n buildSideSurface([\r\n [0, 1, 5, 4],\r\n [1, 2, 6, 5],\r\n [2, 3, 7, 6],\r\n [3, 0, 4, 7],\r\n ]);\r\n } else {\r\n throw new Error('segment is neither quad nor tri');\r\n }\r\n\r\n geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));\r\n geometry.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\r\n geometry.computeVertexNormals();\r\n geometry.computeBoundingSphere(); // add this to update hit test.\r\n\r\n if (windows.length > 0) {\r\n const operationBuffer: Mesh[] = [];\r\n\r\n // don't know why single variable not working, have to use array to save last operated mesh\r\n for (let i = 0; i < holeMeshes.length; i++) {\r\n const holeMesh = holeMeshes[i];\r\n if (i === 0) {\r\n operationBuffer.push(CSG.subtract(ref.current, holeMesh));\r\n } else {\r\n operationBuffer.push(CSG.subtract(operationBuffer[i - 1], holeMesh));\r\n }\r\n }\r\n\r\n const resultMesh = operationBuffer.pop();\r\n\r\n if (resultMesh) {\r\n geometry.copy(resultMesh.geometry);\r\n }\r\n }\r\n\r\n return geometry.groups.length;\r\n\r\n function addPositions(points: Vector3[]) {\r\n for (const point of points) {\r\n const { x, y, z } = point;\r\n positions.push(x, y, z);\r\n }\r\n }\r\n\r\n function addUVs(points: Vector3[]) {\r\n const [a, b, c] = points;\r\n const ab = new Vector3().subVectors(b, a);\r\n const lab = ab.length();\r\n const ac = new Vector3().subVectors(c, a);\r\n const abxy = new Vector2(b.x - a.x, b.y - a.y);\r\n\r\n const ub = abxy.length();\r\n const vb = 0;\r\n const uc = ab.dot(ac) / lab;\r\n const vc = ab.clone().cross(ac).length() / lab;\r\n\r\n uvs.push(0, 0, ub, vb, uc, vc);\r\n }\r\n\r\n function addHeatmapUVs(isLowerLeft = false) {\r\n const v10 = new Vector3().subVectors(points[1], points[0]);\r\n const length10 = v10.length();\r\n v10.normalize();\r\n const v20 = new Vector3().subVectors(points[2], points[0]);\r\n if (isTri) {\r\n // find the position of the top point relative to the first edge point\r\n const mid = v20.dot(v10) / length10;\r\n uvs.push(0, 0, 1, 0, mid, 1);\r\n } else if (isQuad) {\r\n // find the position of the top-left and top-right points relative to the lower-left point\r\n // the points go anticlockwise\r\n const v30 = new Vector3().subVectors(points[3], points[0]);\r\n const topLeft = v30.dot(v10) / length10;\r\n const topRight = v20.dot(v10) / length10;\r\n if (isLowerLeft) {\r\n uvs.push(0, 0, 1, 0, topLeft, 1);\r\n uvs.push(1, 0, topRight, 1, topLeft, 1);\r\n } else {\r\n uvs.push(0, 0, 1, 0, topRight, 1);\r\n uvs.push(0, 0, topRight, 1, topLeft, 1);\r\n }\r\n }\r\n }\r\n\r\n function addGroup(verticesNumber: number) {\r\n geometry.addGroup(vertexIndex, verticesNumber, materialIndex++);\r\n vertexIndex += verticesNumber;\r\n }\r\n\r\n function buildSideSurface(surfacePointIndices: number[][]) {\r\n for (const indices of surfacePointIndices) {\r\n const [a, b, c, d] = indices;\r\n const tri1 = [a, b, d].reduce((acc, i) => acc.concat(points[i].x, points[i].y, points[i].z), [] as number[]);\r\n const tri2 = [d, b, c].reduce((acc, i) => acc.concat(points[i].x, points[i].y, points[i].z), [] as number[]);\r\n positions.push(...tri1);\r\n positions.push(...tri2);\r\n uvs.push(0, 0, 1, 0, 0, 1);\r\n uvs.push(0, 1, 1, 0, 1, 1);\r\n addGroup(6);\r\n }\r\n }\r\n }\r\n\r\n function triangulate(points: Vector3[]) {\r\n const [a, b, c, d] = points;\r\n const dDis = Util.distanceFromPointToLine2D(d, a, b);\r\n const cDis = Util.distanceFromPointToLine2D(c, a, b);\r\n const lower: Vector3[] = [];\r\n const upper: Vector3[] = [];\r\n if (Math.abs(dDis - cDis) < 0.01) {\r\n if (a.z > b.z) {\r\n lower.push(a, b, c);\r\n upper.push(a, c, d);\r\n } else {\r\n lower.push(a, b, d);\r\n upper.push(b, c, d);\r\n }\r\n } else if (dDis <= cDis) {\r\n lower.push(a, b, d);\r\n upper.push(b, c, d);\r\n } else {\r\n lower.push(a, b, c);\r\n upper.push(a, c, d);\r\n }\r\n return [lower, upper];\r\n }\r\n\r\n const HeatMapMaterial = () => (\r\n \r\n );\r\n\r\n const TopLayerMaterial = () => (\r\n \r\n );\r\n\r\n const SideSurfaceMaterial = () => (\r\n \r\n );\r\n\r\n const enableShadow = shadowEnabled && !showSolarRadiationHeatmap;\r\n\r\n return (\r\n \r\n {materialArray.map((_, i) => {\r\n if (i !== 0) {\r\n return ;\r\n } else if (showSolarRadiationHeatmap) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n })}\r\n \r\n );\r\n },\r\n);\r\n\r\nexport default React.memo(RoofSegment);\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Extrude } from '@react-three/drei';\r\nimport React from 'react';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { DoubleSide, Shape, Vector3 } from 'three';\r\n\r\ninterface CeilingProps {\r\n cz: number;\r\n points: Vector3[];\r\n}\r\n\r\nconst Ceiling = ({ cz, points }: CeilingProps) => {\r\n const shape = new Shape();\r\n\r\n shape.moveTo(points[0].x, points[0].y);\r\n\r\n for (const { x, y } of points) {\r\n shape.lineTo(x, y);\r\n }\r\n\r\n shape.closePath();\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Ceiling);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from '../stores/selector';\r\n\r\nexport const useSelected = (id: string) => {\r\n return useStore((state) => state.selectedElementIdSet.has(id) && !state.groupActionMode);\r\n};\r\n\r\nexport const useLanguage = () => {\r\n return { lng: useStore(Selector.language) };\r\n};\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { PyramidRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { CanvasTexture, Euler, Mesh, Raycaster, RepeatWrapping, Vector2, Vector3 } from 'three';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { Line, Plane } from '@react-three/drei';\r\nimport { HALF_PI, HALF_PI_Z_EULER, TWO_PI } from 'src/constants';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { useThree } from '@react-three/fiber';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { Util } from 'src/Util';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n areRoofsEqual,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n RoofHandle,\r\n RoofSegmentGroupUserData,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n} from './roofRenderer';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport {\r\n useIsFirstRender,\r\n useMultiCurrWallArray,\r\n useRoofHeight,\r\n useRoofTexture,\r\n useUpdateOldRoofFiles,\r\n useUpdateRooftopElements,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n useUserData,\r\n} from './hooks';\r\nimport RoofSegment from './roofSegment';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Ceiling from './ceiling';\r\nimport FlatRoof from './flatRoof';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport shallow from 'zustand/shallow';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zeroVector = new Vector3();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\nconst PyramidRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n if (roofSegments.length === 0) {\r\n return null;\r\n }\r\n const peripheryPoints: Vector3[] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness);\r\n\r\n for (let i = 0; i < roofSegments.length; i++) {\r\n const [leftPoint, rightPoint] = roofSegments[i].points;\r\n peripheryPoints.push(leftPoint);\r\n if (i === roofSegments.length - 1) {\r\n peripheryPoints.push(rightPoint);\r\n }\r\n }\r\n\r\n const periphery = ;\r\n\r\n return (\r\n <>\r\n {periphery}\r\n \r\n {periphery}\r\n {roofSegments.map((segment, idx) => {\r\n const [leftPoint, rightPoint, zeroVector] = segment.points;\r\n const isFlat = Math.abs(leftPoint.z) < 0.015;\r\n const points = [leftPoint.clone().sub(thicknessVector), leftPoint];\r\n if (!isFlat) {\r\n points.push(zeroVector);\r\n }\r\n return ;\r\n })}\r\n \r\n \r\n );\r\n});\r\n\r\ninterface PyramidRoofProps extends BuildingParts {\r\n roofModel: PyramidRoofModel;\r\n}\r\n\r\nconst PyramidRoof = ({ roofModel, foundationModel }: PyramidRoofProps) => {\r\n let {\r\n cx,\r\n cy,\r\n lz,\r\n id,\r\n wallsId,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n thickness = 0.2,\r\n locked,\r\n lineWidth = 0.2,\r\n lineColor = 'black',\r\n roofType,\r\n foundationId,\r\n rise = lz,\r\n ceiling = false,\r\n } = roofModel;\r\n\r\n const texture = useRoofTexture(textureType);\r\n\r\n const selected = useSelected(id);\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const { camera, gl } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const isPointerDownRef = useRef(false);\r\n const oldRiseRef = useRef(rise);\r\n\r\n const prevWallsIdSet = new Set(wallsId);\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const getWallPoint = (wallArray: WallModel[]) => {\r\n const arr: Point2[] = [];\r\n const length = wallArray.length;\r\n for (const w of wallArray) {\r\n if (w.leftPoint[0] !== undefined && w.leftPoint[1] !== undefined) {\r\n arr.push({ x: w.leftPoint[0], y: w.leftPoint[1] });\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n if (\r\n (wallArray[length - 1].rightPoint[0] || wallArray[length - 1].rightPoint[0] === 0) &&\r\n (wallArray[length - 1].rightPoint[1] || wallArray[length - 1].rightPoint[1] === 0)\r\n ) {\r\n arr.push({ x: wallArray[length - 1].rightPoint[0], y: wallArray[length - 1].rightPoint[1] });\r\n }\r\n }\r\n return arr;\r\n };\r\n\r\n const needUpdateWallsId = (wallArray: WallModel[], wallsIdSet: Set) => {\r\n if (wallArray.length !== wallsIdSet.size) {\r\n return true;\r\n }\r\n for (const w of wallArray) {\r\n if (!wallsIdSet.has(w.id)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getOverhangHeight = () => {\r\n let height = Infinity;\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n const leftPoint = new Vector3(w.leftPoint[0], w.leftPoint[1]);\r\n const rightPoint = new Vector3(w.rightPoint[0], w.rightPoint[1]);\r\n // const { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n const dLeft = RoofUtil.getDistance(leftPoint, rightPoint, centerPointV3);\r\n const overhangHeightLeft = Math.min(((w.eavesLength ?? 0) / dLeft) * (centerPointV3.z - w.lz), w.lz);\r\n const dRight = RoofUtil.getDistance(leftPoint, rightPoint, centerPointV3);\r\n const overhangHeightRight = Math.min(((w.eavesLength ?? 0) / dRight) * (centerPointV3.z - w.lz), w.lz);\r\n height = Math.min(Math.min(overhangHeightLeft, overhangHeightRight), height);\r\n }\r\n\r\n return Number.isNaN(height) ? 0 : height;\r\n };\r\n\r\n const { currentWallArray, isLoopRef } = useMultiCurrWallArray(foundationId, id, wallsId);\r\n\r\n const { highestWallHeight, topZ } = useRoofHeight(currentWallArray, rise);\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const centerPoint = useMemo(() => {\r\n if (currentWallArray.length < 2) {\r\n return { x: 0, y: 0 };\r\n }\r\n const points = getWallPoint(currentWallArray);\r\n if (points.length < 3) {\r\n return { x: 0, y: 0 };\r\n }\r\n const p = Util.calculatePolygonCentroid(points);\r\n if (Number.isNaN(p.x) || Number.isNaN(p.y)) {\r\n return { x: 0, y: 0 };\r\n }\r\n return p;\r\n }, [currentWallArray, topZ]);\r\n\r\n const centerPointV3 = useMemo(() => {\r\n return new Vector3(centerPoint.x, centerPoint.y, topZ);\r\n }, [centerPoint, topZ]);\r\n\r\n const overhangs = useMemo(() => {\r\n const res = currentWallArray.map((wall) => RoofUtil.getWallNormal(wall).multiplyScalar(wall.eavesLength ?? 0));\r\n if (!isLoopRef.current && res.length !== 0) {\r\n const n = new Vector3()\r\n .subVectors(\r\n new Vector3(\r\n currentWallArray[currentWallArray.length - 1].rightPoint[0],\r\n currentWallArray[currentWallArray.length - 1].rightPoint[1],\r\n ),\r\n new Vector3(currentWallArray[0].leftPoint[0], currentWallArray[0].leftPoint[1]),\r\n )\r\n .applyEuler(HALF_PI_Z_EULER)\r\n .normalize()\r\n .multiplyScalar(0.3);\r\n res.push(n);\r\n }\r\n return res;\r\n }, [currentWallArray]);\r\n\r\n const wallPointsAfterOffset = useMemo(() => {\r\n const res = currentWallArray.map((wall, idx) => ({\r\n leftPoint: new Vector3(wall.leftPoint[0], wall.leftPoint[1]).add(overhangs[idx]),\r\n rightPoint: new Vector3(wall.rightPoint[0], wall.rightPoint[1]).add(overhangs[idx]),\r\n }));\r\n if (!isLoopRef.current && res.length !== 0) {\r\n res.push({\r\n leftPoint: new Vector3(\r\n currentWallArray[currentWallArray.length - 1].rightPoint[0],\r\n currentWallArray[currentWallArray.length - 1].rightPoint[1],\r\n ).add(overhangs[overhangs.length - 1]),\r\n rightPoint: new Vector3(currentWallArray[0].leftPoint[0], currentWallArray[0].leftPoint[1]).add(\r\n overhangs[overhangs.length - 1],\r\n ),\r\n });\r\n }\r\n return res;\r\n }, [currentWallArray, overhangs]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n if (currentWallArray.length < 2) {\r\n return segments;\r\n }\r\n\r\n const overhangHeight = getOverhangHeight();\r\n\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n if (\r\n w.leftPoint.length > 0 &&\r\n w.rightPoint.length > 0 &&\r\n (w.leftPoint[0] !== w.rightPoint[0] || w.leftPoint[1] !== w.rightPoint[1])\r\n ) {\r\n const points = [];\r\n let { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n if (!isLoopRef.current) {\r\n if (i === 0) {\r\n lh = currentWallArray[0].lz;\r\n }\r\n if (i === currentWallArray.length - 1) {\r\n rh = currentWallArray[currentWallArray.length - 1].lz;\r\n }\r\n }\r\n\r\n const wallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[(i + wallPointsAfterOffset.length - 1) % wallPointsAfterOffset.length].leftPoint,\r\n wallPointsAfterOffset[(i + wallPointsAfterOffset.length - 1) % wallPointsAfterOffset.length].rightPoint,\r\n wallPointsAfterOffset[i].leftPoint,\r\n wallPointsAfterOffset[i].rightPoint,\r\n )\r\n .setZ(lh - overhangHeight)\r\n .sub(centerPointV3);\r\n\r\n const wallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[i].leftPoint,\r\n wallPointsAfterOffset[i].rightPoint,\r\n wallPointsAfterOffset[(i + 1) % wallPointsAfterOffset.length].leftPoint,\r\n wallPointsAfterOffset[(i + 1) % wallPointsAfterOffset.length].rightPoint,\r\n )\r\n .setZ(rh - overhangHeight)\r\n .sub(centerPointV3);\r\n\r\n const length = new Vector3(w.cx, w.cy).sub(centerPointV3.clone().setZ(0)).length();\r\n points.push(wallLeftPointAfterOverhang, wallRightPointAfterOverhang, zeroVector);\r\n points.push(\r\n wallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n wallRightPointAfterOverhang.clone().add(thicknessVector),\r\n zeroVector.clone().add(thicknessVector),\r\n );\r\n segments.push({ points, angle: -w.relativeAngle, length });\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n const idx = wallPointsAfterOffset.length - 1;\r\n const leftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[idx - 1].leftPoint,\r\n wallPointsAfterOffset[idx - 1].rightPoint,\r\n wallPointsAfterOffset[idx].leftPoint,\r\n wallPointsAfterOffset[idx].rightPoint,\r\n )\r\n .setZ(currentWallArray[currentWallArray.length - 1].lz - overhangHeight)\r\n .sub(centerPointV3);\r\n const rightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[idx].leftPoint,\r\n wallPointsAfterOffset[idx].rightPoint,\r\n wallPointsAfterOffset[0].leftPoint,\r\n wallPointsAfterOffset[0].rightPoint,\r\n )\r\n .setZ(currentWallArray[0].lz - overhangHeight)\r\n .sub(centerPointV3);\r\n\r\n let angle = Math.atan2(\r\n rightPointAfterOverhang.y - leftPointAfterOverhang.y,\r\n rightPointAfterOverhang.x - leftPointAfterOverhang.x,\r\n );\r\n angle = angle >= 0 ? angle : (TWO_PI + angle) % TWO_PI;\r\n\r\n const length = new Vector3()\r\n .addVectors(leftPointAfterOverhang, rightPointAfterOverhang)\r\n .setZ(0)\r\n .divideScalar(2)\r\n .length();\r\n\r\n const points = [];\r\n points.push(leftPointAfterOverhang, rightPointAfterOverhang, zeroVector);\r\n points.push(\r\n leftPointAfterOverhang.clone().add(thicknessVector),\r\n rightPointAfterOverhang.clone().add(thicknessVector),\r\n zeroVector.clone().add(thicknessVector),\r\n );\r\n segments.push({ points, angle: -angle, length });\r\n }\r\n\r\n return segments;\r\n }, [currentWallArray, centerPoint, thickness]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n const points: Vector3[] = [];\r\n if (currentWallArray.length === 0) return points;\r\n points.push(new Vector3().fromArray(currentWallArray[0].leftPoint));\r\n for (const wall of currentWallArray) {\r\n points.push(new Vector3().fromArray(wall.rightPoint));\r\n }\r\n return points;\r\n }, [currentWallArray]);\r\n\r\n // set position and rotation\r\n let rotation = 0;\r\n if (foundationModel) {\r\n cx = foundationModel.cx;\r\n cy = foundationModel.cy;\r\n rotation = foundationModel.rotation[2];\r\n\r\n const r = -Math.atan2(camera.position.x - cx, camera.position.y - cy) - rotation;\r\n intersectionPlanePosition.set(centerPoint.x, centerPoint.y, topZ);\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n\r\n const isFirstRender = useIsFirstRender();\r\n\r\n useEffect(() => {\r\n if (isFirstRender) return;\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id)) {\r\n if (currentWallArray.length >= 2 && needUpdateWallsId(currentWallArray, prevWallsIdSet)) {\r\n const newWallsIdArray = currentWallArray.map((v) => v.id);\r\n const newWallsIdSet = new Set(newWallsIdArray);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof) {\r\n if (e.id === id) {\r\n (e as RoofModel).wallsId = newWallsIdArray;\r\n }\r\n } else if (e.type === ObjectType.Wall) {\r\n if (prevWallsIdSet.has(e.id) && !newWallsIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n w.roofId = null;\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n }\r\n }\r\n }\r\n });\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n }\r\n }, [prevWallsIdSet]);\r\n\r\n // update wall's roofId when adding new roof\r\n useEffect(() => {\r\n if (currentWallArray.length > 1) {\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id)) {\r\n // update walls\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === currentWallArray[i].id && e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n w.roofId = id;\r\n // some old files set wall's roof height, which should not\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n } else {\r\n removeElementById(id, false, false, true);\r\n }\r\n }, [currentWallArray]);\r\n\r\n useUpdateRooftopElements(foundationModel, id, roofSegments, centerPointV3, topZ, thickness);\r\n\r\n const checkIsFlatRoof = () => {\r\n if (currentWallArray.length < 2) {\r\n return false;\r\n }\r\n const height = currentWallArray[0].lz;\r\n\r\n for (const wall of currentWallArray) {\r\n if (Math.abs(wall.lz - height) > 0.01) {\r\n return false;\r\n }\r\n }\r\n\r\n for (const segment of roofSegments) {\r\n const [leftPoint, rightPoint] = segment.points;\r\n if (Math.abs(leftPoint.z) > 0.01 || Math.abs(rightPoint.z) > 0.01) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const [isFlatRoof, setIsFlatRoof] = useState(checkIsFlatRoof);\r\n\r\n useEffect(() => {\r\n setIsFlatRoof(checkIsFlatRoof());\r\n }, [currentWallArray, topZ]);\r\n\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n const [flatHeatmapTexture, setFlatHeatmapTexture] = useState(null);\r\n const selectMe = useStore(Selector.selectMe);\r\n\r\n const updateSegmentVertices = useUpdateSegmentVerticesMap(\r\n id,\r\n centerPointV3,\r\n roofSegments,\r\n isFlatRoof,\r\n RoofType.Pyramid,\r\n );\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n if (isFlatRoof) {\r\n const heatmap = getHeatmap(id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n // obtain the bounding rectangle\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices && segmentVertices.length > 0 && foundationModel) {\r\n const euler = new Euler(0, 0, foundationModel.rotation[2], 'ZYX');\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const s of segmentVertices) {\r\n for (const v of s) {\r\n const v2 = v.clone().applyEuler(euler);\r\n if (v2.x > maxX) maxX = v2.x;\r\n if (v2.x < minX) minX = v2.x;\r\n if (v2.y > maxY) maxY = v2.y;\r\n if (v2.y < minY) minY = v2.y;\r\n }\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n const vcx = (minX + maxX) / 2;\r\n const vcy = (minY + maxY) / 2;\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n t.offset.set(-minX / dx, -minY / dy);\r\n t.center.set(vcx / dx, vcy / dy);\r\n t.rotation = -foundationModel.rotation[2];\r\n t.repeat.set(1 / dx, 1 / dy);\r\n }\r\n setFlatHeatmapTexture(t);\r\n }\r\n }\r\n } else {\r\n const n = roofSegments.length;\r\n if (n > 0) {\r\n const textures = [];\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices) {\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n const segmentVertices: Vector3[][] = [];\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n if (\r\n w.leftPoint.length > 0 &&\r\n w.rightPoint.length > 0 &&\r\n (w.leftPoint[0] !== w.rightPoint[0] || w.leftPoint[1] !== w.rightPoint[1])\r\n ) {\r\n let { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n if (!isLoopRef.current) {\r\n if (i === 0) {\r\n lh = currentWallArray[0].lz;\r\n }\r\n if (i === currentWallArray.length - 1) {\r\n rh = currentWallArray[currentWallArray.length - 1].lz;\r\n }\r\n }\r\n\r\n const wallLeftPoint = new Vector3(w.leftPoint[0], w.leftPoint[1], lh);\r\n const wallRightPoint = new Vector3(w.rightPoint[0], w.rightPoint[1], rh);\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, centerPointV3.clone()]);\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n const firstWall = currentWallArray[0];\r\n const lastWall = currentWallArray[currentWallArray.length - 1];\r\n const leftPoint = new Vector3(lastWall.rightPoint[0], lastWall.rightPoint[1], lastWall.lz);\r\n const rightPoint = new Vector3(firstWall.leftPoint[0], firstWall.leftPoint[1], firstWall.lz);\r\n segmentVertices.push([leftPoint, rightPoint, centerPointV3.clone()]);\r\n }\r\n\r\n if (isFlatRoof) {\r\n const seg: Vector3[] = [];\r\n for (const segment of segmentVertices) {\r\n seg.push(segment[0].clone());\r\n }\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, [seg]);\r\n } else {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n }\r\n };\r\n\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const userData = useUserData(id, foundationModel, centerPointV3, roofSegments);\r\n\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n return (\r\n \r\n {/* roof segments group */}\r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, centerPointV3);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {isFlatRoof ? (\r\n \r\n ) : (\r\n <>\r\n {roofSegments.map((segment, index) => {\r\n const { points } = segment;\r\n if (points.length > 0) {\r\n const [leftPoint, rightPoint] = points;\r\n if (leftPoint.distanceTo(rightPoint) > 0.1) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n return null;\r\n })}\r\n \r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && }\r\n\r\n {/* handle */}\r\n {selected && !locked && (\r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n setShowIntersectionPlane(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerUp={() => {\r\n setShowIntersectionPlane(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = centerPoint.x;\r\n state.selectedElementY = centerPoint.y;\r\n });\r\n }}\r\n />\r\n )}\r\n\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n {\r\n if (intersectionPlaneRef.current && isPointerDownRef.current && foundationModel) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0]) {\r\n const point = intersects[0].point;\r\n if (point.z < 0.001) {\r\n return;\r\n }\r\n const newRise = Math.max(0, point.z - foundationModel.lz - 0.3 - highestWallHeight);\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, topZ + roofModel.thickness);\r\n }\r\n }\r\n }}\r\n onPointerUp={(e) => {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n setShowIntersectionPlane(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n isPointerDownRef.current = false;\r\n }}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(PyramidRoof, areRoofsEqual);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Line, Plane } from '@react-three/drei';\r\nimport { useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { HALF_PI } from 'src/constants';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { GambrelRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { UnoableResizeGambrelRoofRidge } from 'src/undo/UndoableResize';\r\nimport { Util } from 'src/Util';\r\nimport { CanvasTexture, DoubleSide, Euler, Mesh, Raycaster, RepeatWrapping, Vector2, Vector3 } from 'three';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n areRoofsEqual,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n RoofHandle,\r\n RoofSegmentGroupUserData,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n updateRooftopElements,\r\n} from './roofRenderer';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport {\r\n useComposedWallArray,\r\n useComposedRoofHeight,\r\n useRoofTexture,\r\n useUpdateOldRoofFiles,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n ComposedWall,\r\n useUpdateRooftopElementsByContextMenuChanges,\r\n useIsFirstRender,\r\n useUserData,\r\n} from './hooks';\r\nimport RoofSegment from './roofSegment';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Ceiling from './ceiling';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport FlatRoof from './flatRoof';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\nimport shallow from 'zustand/shallow';\r\nimport { useSelected } from '../hooks';\r\n\r\ntype RoofEdge = {\r\n start: number;\r\n end: number;\r\n k: number;\r\n b: number;\r\n};\r\n\r\nexport type WallHeights = {\r\n left: number;\r\n centerLeft?: number[] | null;\r\n center?: number[] | null;\r\n centerRight?: number[] | null;\r\n right: number;\r\n};\r\n\r\nexport const getWallShapePoints = (lx: number, lz: number, wallHeights: WallHeights) => {\r\n const { left, right, center, centerLeft, centerRight } = wallHeights;\r\n const [hx, hz] = [lx / 2, lz / 2];\r\n const points: Point2[] = [\r\n { x: -hx, y: left - hz },\r\n { x: -hx, y: -hz },\r\n { x: hx, y: -hz },\r\n { x: hx, y: right - hz },\r\n ];\r\n if (centerRight) {\r\n const [crX, crY] = centerRight;\r\n points.push({ x: crX * lx, y: crY - hz });\r\n }\r\n if (center) {\r\n const [cX, cY] = center;\r\n points.push({ x: cX * lx, y: cY - hz });\r\n }\r\n if (centerLeft) {\r\n const [clX, clY] = centerLeft;\r\n points.push({ x: clX * lx, y: clY - hz });\r\n }\r\n return points;\r\n};\r\n\r\nexport const isRoofValid = (wallHeightsMap: Map, foundationId: string) => {\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundationId && wallHeightsMap.has(e.id)) {\r\n const wallHeights = wallHeightsMap.get(e.id);\r\n if (wallHeights) {\r\n const wall = e as WallModel;\r\n const wallShapePoints = getWallShapePoints(wall.lx, wall.lz, wallHeights);\r\n\r\n for (const child of useStore.getState().elements) {\r\n if (child.parentId === wall.id) {\r\n let { cx, cz, lx, ly, lz } = child;\r\n cx *= wall.lx;\r\n cz *= wall.lz;\r\n if (child.type !== ObjectType.SolarPanel) {\r\n lx *= wall.lx;\r\n lz *= wall.lz;\r\n } else {\r\n lz = ly;\r\n }\r\n if (child.type === ObjectType.Window && (child as WindowModel).windowType === WindowType.Polygonal) {\r\n const [tx, th] = (child as WindowModel).polygonTop ?? DEFAULT_POLYGONTOP;\r\n const px = cx + tx * lx;\r\n const pz = cz + lz / 2 + th;\r\n if (!Util.isPointInside(px, pz, wallShapePoints)) {\r\n return false;\r\n }\r\n }\r\n if (\r\n !Util.isElementInsideWall(new Vector3(cx, 0, cz), lx, lz, wallShapePoints, child.type === ObjectType.Door)\r\n ) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n};\r\n\r\nconst GambrelRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n if (roofSegments.length === 0) {\r\n return null;\r\n }\r\n const peripheryPoints: Vector3[] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness);\r\n\r\n const frontSideSegmentPoints = roofSegments[0].points;\r\n const frontTopSegmentPoints = roofSegments[1].points;\r\n const backTopSegmentPoints = roofSegments[2].points;\r\n const backSideSegmentPoints = roofSegments[3].points;\r\n\r\n peripheryPoints.push(\r\n frontTopSegmentPoints[3],\r\n frontTopSegmentPoints[0],\r\n frontSideSegmentPoints[0],\r\n frontSideSegmentPoints[1],\r\n frontSideSegmentPoints[2],\r\n frontTopSegmentPoints[2],\r\n backTopSegmentPoints[0],\r\n backSideSegmentPoints[0],\r\n backSideSegmentPoints[1],\r\n backTopSegmentPoints[1],\r\n frontTopSegmentPoints[3],\r\n );\r\n\r\n const isFlat = Math.abs(frontSideSegmentPoints[0].z) < 0.15;\r\n\r\n const periphery = ;\r\n const ridges = (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n return (\r\n <>\r\n {periphery}\r\n {!isFlat && ridges}\r\n \r\n {periphery}\r\n {!isFlat && ridges}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zeroVector2 = new Vector2();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\ninterface GambrelRoofProps extends BuildingParts {\r\n roofModel: GambrelRoofModel;\r\n}\r\nconst GambrelRoof = ({ roofModel, foundationModel }: GambrelRoofProps) => {\r\n let {\r\n id,\r\n cx,\r\n cy,\r\n lz,\r\n wallsId,\r\n parentId,\r\n topRidgeLeftPoint,\r\n frontRidgeLeftPoint,\r\n backRidgeLeftPoint,\r\n topRidgePoint,\r\n frontRidgePoint,\r\n backRidgePoint,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n thickness = 0.2,\r\n locked,\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n roofType,\r\n rise = lz,\r\n ceiling = false,\r\n } = roofModel;\r\n\r\n if (topRidgePoint === undefined) {\r\n topRidgePoint = topRidgeLeftPoint ? [...topRidgeLeftPoint] : [0, 1];\r\n }\r\n if (frontRidgePoint === undefined) {\r\n frontRidgePoint = frontRidgeLeftPoint ? [...frontRidgeLeftPoint] : [0.35, 0.5];\r\n }\r\n if (backRidgePoint === undefined) {\r\n backRidgePoint = backRidgeLeftPoint ? [...backRidgeLeftPoint] : [0.35, 0.5];\r\n }\r\n\r\n const selected = useSelected(id);\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const texture = useRoofTexture(textureType);\r\n\r\n const [roofHandleType, setRoofHandleType] = useState(RoofHandleType.Null);\r\n const [enableIntersectionPlane, setEnableIntersectionPlane] = useState(false);\r\n const intersectionPlaneRef = useRef(null);\r\n const { gl, camera } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const oldRidgeVal = useRef([0, 0]);\r\n const oldRiseRef = useRef(rise);\r\n const isPointerDownRef = useRef(false);\r\n\r\n const isFlat = rise < 0.01;\r\n\r\n const updateRidge = (elemId: string, type: string, val: number[]) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Gambrel) {\r\n const gr = e as GambrelRoofModel;\r\n switch (type) {\r\n case RoofHandleType.FrontLeft:\r\n case RoofHandleType.FrontRight:\r\n gr.frontRidgePoint = [...val];\r\n break;\r\n case RoofHandleType.TopLeft:\r\n case RoofHandleType.TopRight:\r\n gr.topRidgePoint = [...val];\r\n break;\r\n case RoofHandleType.BackLeft:\r\n case RoofHandleType.BackRight:\r\n gr.backRidgePoint = [...val];\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleUndoableResizeRidge = (elemId: string, type: RoofHandleType, oldVal: number[], newVal: number[]) => {\r\n const undoable = {\r\n name: 'Resize Gambrel Roof Ridge',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldVal: [...oldVal],\r\n newVal: [...newVal],\r\n type: type,\r\n undo: () => {\r\n updateRidge(undoable.resizedElementId, undoable.type, undoable.oldVal);\r\n },\r\n redo: () => {\r\n updateRidge(undoable.resizedElementId, undoable.type, undoable.newVal);\r\n },\r\n } as UnoableResizeGambrelRoofRidge;\r\n useStore.getState().addUndoable(undoable);\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const setInterSectionPlane = (handlePointV3: Vector3, wall: ComposedWall) => {\r\n setEnableIntersectionPlane(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n intersectionPlanePosition.set(handlePointV3.x, handlePointV3.y, handlePointV3.z).add(centroid);\r\n if (foundationModel && wall) {\r\n intersectionPlaneRotation.set(HALF_PI, 0, wall.relativeAngle, 'ZXY');\r\n }\r\n };\r\n\r\n const getRelPos = (foundation: ElementModel, wall: ComposedWall, point: Vector3) => {\r\n const foundationCenter = new Vector2(foundation.cx, foundation.cy);\r\n const wallCenter = RoofUtil.getComposedWallCenter(wall);\r\n const wallLength = RoofUtil.getComposedWallLength(wall);\r\n const wallAbsCenter = new Vector2(wallCenter.x, wallCenter.y)\r\n .rotateAround(zeroVector2, foundation.rotation[2])\r\n .add(foundationCenter);\r\n const wallAbsAngle = foundation.rotation[2] + wall.relativeAngle;\r\n const p = new Vector2(point.x, point.y).sub(wallAbsCenter).rotateAround(zeroVector2, -wallAbsAngle);\r\n const x = p.x / wallLength;\r\n return Math.min(Math.abs(x), 0.5) * (x >= 0 ? 1 : -1);\r\n };\r\n\r\n const getRidgePoint = (currWall: ComposedWall, px: number, ph: number, sideWall?: ComposedWall) => {\r\n if (!currWall) {\r\n return new Vector3();\r\n }\r\n const length = RoofUtil.getComposedWallLength(currWall);\r\n const e = new Euler(0, 0, currWall.relativeAngle);\r\n const v = new Vector3(px * length, 0, 0);\r\n let height = topZ;\r\n if (sideWall) {\r\n height = ph * (topZ - sideWall.lz) + sideWall.lz;\r\n }\r\n const center = RoofUtil.getComposedWallCenter(currWall);\r\n return new Vector3(center.x, center.y, height).add(v.applyEuler(e));\r\n };\r\n\r\n const getWallHeight = (arr: ComposedWall[], i: number) => {\r\n const w = arr[i];\r\n let lh;\r\n let rh;\r\n if (i === 0 || i === 2) {\r\n lh = w.lz;\r\n rh = w.lz;\r\n } else if (i === 1) {\r\n lh = arr[0].lz;\r\n rh = arr[2].lz;\r\n } else {\r\n lh = arr[2].lz;\r\n rh = arr[0].lz;\r\n }\r\n return { lh, rh };\r\n };\r\n\r\n const isThisIdAndType = (e: ElementModel) => {\r\n return e.id === id && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Gambrel;\r\n };\r\n\r\n const getEdgeLine = (startPoint: Vector2, endPoint: Vector2) => {\r\n const dx = endPoint.x - startPoint.x;\r\n const dy = endPoint.y - startPoint.y;\r\n const k = dy / dx;\r\n const b = startPoint.y - k * startPoint.x;\r\n return {\r\n start: startPoint.x,\r\n end: endPoint.x,\r\n k,\r\n b,\r\n } as RoofEdge;\r\n };\r\n\r\n const getRoofSideEdges = (\r\n composedWalls: ComposedWall[],\r\n index: number,\r\n topZ: number,\r\n leftBaseHeight: number,\r\n rightBaseHeight: number,\r\n leftPoint: number[],\r\n midPoint: number[],\r\n rightPoint: number[],\r\n ) => {\r\n const composedWall = composedWalls[index];\r\n const { lh, rh } = getWallHeight(composedWalls, index);\r\n const length = new Vector3().subVectors(composedWall.leftPoint, composedWall.rightPoint).length();\r\n const halfLength = length / 2;\r\n\r\n const getX = (x: number) => x * length + halfLength;\r\n const getY = (y: number, baseHeight: number) => y * (topZ - baseHeight) + baseHeight;\r\n\r\n const points = [\r\n new Vector2(getX(-leftPoint[0]), getY(leftPoint[1], leftBaseHeight)),\r\n new Vector2(getX(midPoint[0]), topZ),\r\n new Vector2(getX(rightPoint[0]), getY(rightPoint[1], rightBaseHeight)),\r\n new Vector2(length, rh),\r\n ];\r\n const edges = points.map((p, i) => {\r\n const start = i === 0 ? new Vector2(0, lh) : points[i - 1];\r\n return getEdgeLine(start, p);\r\n });\r\n return edges;\r\n };\r\n\r\n const getYOnEdge = (edges: RoofEdge[], x: number) => {\r\n for (const edge of edges) {\r\n const { start, end, k, b } = edge;\r\n if (x >= start && x <= end) {\r\n return k * x + b;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const updateFlatRoofWalls = (composedWalls: ComposedWall[]) => {\r\n const idSet = new Set();\r\n for (const composedWall of composedWalls) {\r\n composedWall.wallsId.forEach((id) => idSet.add(id));\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === parentId && idSet.has(e.id)) {\r\n const wall = e as WallModel;\r\n wall.leftRoofHeight = topZ;\r\n wall.rightRoofHeight = topZ;\r\n wall.centerLeftRoofHeight = undefined;\r\n wall.centerRightRoofHeight = undefined;\r\n wall.centerRoofHeight = undefined;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setSideWallHeightsMap = (\r\n map: Map,\r\n composedWalls: ComposedWall[],\r\n index: number,\r\n topZ: number,\r\n frontRidgePoint: number[],\r\n topRidgePoint: number[],\r\n backRidgePoint: number[],\r\n ) => {\r\n if (index !== 1 && index !== 3) return;\r\n const isLeftSide = index === 3;\r\n const { lh, rh } = getWallHeight(composedWalls, index);\r\n const leftPoint = isLeftSide ? backRidgePoint : frontRidgePoint;\r\n const rightPoint = isLeftSide ? frontRidgePoint : backRidgePoint;\r\n const midPoint = isLeftSide ? topRidgePoint : [-topRidgePoint[0], topRidgePoint[1]];\r\n\r\n const roofEdges = getRoofSideEdges(composedWalls, index, topZ, lh, rh, leftPoint, midPoint, rightPoint);\r\n const roofPointsX = roofEdges.slice(1).map((edge) => edge.start);\r\n\r\n const composedWall = composedWalls[index];\r\n const wallPointsX = composedWall.wallsId.reduce(\r\n (acc, currId) => {\r\n const wall = useStore.getState().elements.find((e) => e.id === currId) as WallModel;\r\n if (!wall) return acc;\r\n return [...acc, wall.lx + acc[acc.length - 1]];\r\n },\r\n [0],\r\n );\r\n\r\n for (let i = 0; i < composedWall.wallsId.length; i++) {\r\n const id = composedWall.wallsId[i];\r\n const [wallStartX, wallEndX] = [wallPointsX[i], wallPointsX[i + 1]];\r\n const wallStartY = getYOnEdge(roofEdges, wallStartX);\r\n const wallEndY = getYOnEdge(roofEdges, wallEndX);\r\n\r\n if (wallStartY !== null && wallEndY !== null) {\r\n const wallLength = wallEndX - wallStartX;\r\n const wallCenterX = (wallStartX + wallEndX) / 2;\r\n\r\n const wallHeights: WallHeights = {\r\n left: wallStartY,\r\n right: wallEndY,\r\n };\r\n\r\n for (let i = 0; i < roofPointsX.length; i++) {\r\n const roofPointX = roofPointsX[i];\r\n if (roofPointX >= wallStartX && roofPointX <= wallEndX) {\r\n const x = (roofPointX - wallCenterX) / wallLength;\r\n const y = getYOnEdge(roofEdges, roofPointX);\r\n if (y !== null) {\r\n if (i === 0) {\r\n wallHeights.centerLeft = [x, y];\r\n } else if (i === 1) {\r\n wallHeights.center = [x, y];\r\n } else if (i === 2) {\r\n wallHeights.centerRight = [x, y];\r\n }\r\n }\r\n }\r\n }\r\n\r\n map.set(id, wallHeights);\r\n }\r\n }\r\n\r\n return map;\r\n };\r\n\r\n const getSideWallHeightsMap = (\r\n composedWalls: ComposedWall[],\r\n topZ: number,\r\n frontRidgePoint: number[],\r\n topRidgePoint: number[],\r\n backRidgePoint: number[],\r\n ) => {\r\n const map = new Map();\r\n setSideWallHeightsMap(map, composedWalls, 1, topZ, frontRidgePoint, topRidgePoint, backRidgePoint);\r\n setSideWallHeightsMap(map, composedWalls, 3, topZ, frontRidgePoint, topRidgePoint, backRidgePoint);\r\n return map;\r\n };\r\n\r\n const updateWalls = (\r\n composedWalls: ComposedWall[],\r\n topZ: number,\r\n frontRidgePoint: number[],\r\n topRidgePoint: number[],\r\n backRidgePoint: number[],\r\n ) => {\r\n const frontWallsIdSet = new Set(composedWalls[0].wallsId);\r\n const backWallsIdSet = new Set(composedWalls[2].wallsId);\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n topRidgePoint,\r\n backRidgePoint,\r\n );\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === parentId) {\r\n if (frontWallsIdSet.has(e.id)) {\r\n const wall = e as WallModel;\r\n const { lh, rh } = getWallHeight(composedWalls, 0);\r\n wall.roofId = id;\r\n wall.leftRoofHeight = lh;\r\n wall.rightRoofHeight = rh;\r\n } else if (backWallsIdSet.has(e.id)) {\r\n const wall = e as WallModel;\r\n const { lh, rh } = getWallHeight(composedWalls, 2);\r\n wall.roofId = id;\r\n wall.leftRoofHeight = lh;\r\n wall.rightRoofHeight = rh;\r\n } else if (sideWallHeightsMap.has(e.id)) {\r\n const wallHeights = sideWallHeightsMap.get(e.id);\r\n if (wallHeights) {\r\n const wall = e as WallModel;\r\n const { left, right, center, centerLeft, centerRight } = wallHeights;\r\n wall.roofId = id;\r\n wall.leftRoofHeight = left;\r\n wall.rightRoofHeight = right;\r\n if (centerLeft) {\r\n const [x, y] = centerLeft;\r\n if (wall.centerLeftRoofHeight) {\r\n wall.centerLeftRoofHeight[0] = x;\r\n wall.centerLeftRoofHeight[1] = y;\r\n } else {\r\n wall.centerLeftRoofHeight = [x, y];\r\n }\r\n } else {\r\n wall.centerLeftRoofHeight = undefined;\r\n }\r\n if (center) {\r\n const [x, y] = center;\r\n if (wall.centerRoofHeight) {\r\n wall.centerRoofHeight[0] = x;\r\n wall.centerRoofHeight[1] = y;\r\n } else {\r\n wall.centerRoofHeight = [x, y];\r\n }\r\n } else {\r\n wall.centerRoofHeight = undefined;\r\n }\r\n if (centerRight) {\r\n const [x, y] = centerRight;\r\n if (wall.centerRightRoofHeight) {\r\n wall.centerRightRoofHeight[0] = x;\r\n wall.centerRightRoofHeight[1] = y;\r\n } else {\r\n wall.centerRightRoofHeight = [x, y];\r\n }\r\n } else {\r\n wall.centerRightRoofHeight = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const composedWalls = useComposedWallArray(wallsId[0], parentId);\r\n\r\n const { highestWallHeight, topZ } = useComposedRoofHeight(composedWalls, rise, true);\r\n\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const centroid = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const points = composedWalls.map((w) => ({ x: w.leftPoint.x, y: w.leftPoint.y } as Point2));\r\n const p = Util.calculatePolygonCentroid(points);\r\n return new Vector3(p.x, p.y, topZ);\r\n }, [composedWalls, topZ]);\r\n\r\n // top ridge\r\n const topRidgeLeftPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[3];\r\n const [x, h] = topRidgePoint; // percent\r\n return getRidgePoint(wall, x, h).sub(centroid);\r\n }, [composedWalls, centroid, topRidgePoint]);\r\n\r\n const topRidgeRightPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[1];\r\n const [x, h] = topRidgePoint;\r\n return getRidgePoint(wall, -x, h).sub(centroid);\r\n }, [composedWalls, centroid, topRidgePoint]);\r\n\r\n const topRidgeMidPointV3 = useMemo(() => {\r\n return new Vector3().addVectors(topRidgeLeftPointV3, topRidgeRightPointV3).divideScalar(2);\r\n }, [topRidgeLeftPointV3, topRidgeRightPointV3]);\r\n\r\n // front ridge\r\n const frontRidgeLeftPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[3];\r\n const [x, h] = frontRidgePoint;\r\n return getRidgePoint(wall, x, h, composedWalls[0]).sub(centroid);\r\n }, [composedWalls, centroid, frontRidgePoint]);\r\n\r\n const frontRidgeRightPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[1];\r\n const [x, h] = frontRidgePoint;\r\n return getRidgePoint(wall, -x, h, composedWalls[0]).sub(centroid);\r\n }, [composedWalls, centroid, frontRidgePoint]);\r\n\r\n // back ridge\r\n const backRidgeLeftPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[1];\r\n const [x, h] = backRidgePoint;\r\n return getRidgePoint(wall, x, h, composedWalls[2]).sub(centroid);\r\n }, [composedWalls, centroid, backRidgePoint]);\r\n\r\n const backRidgeRightPointV3 = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return new Vector3();\r\n const wall = composedWalls[3];\r\n const [x, h] = backRidgePoint;\r\n return getRidgePoint(wall, -x, h, composedWalls[2]).sub(centroid);\r\n }, [composedWalls, centroid, backRidgePoint]);\r\n\r\n const overhangs = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return [] as Vector3[];\r\n return composedWalls.map((wall) => RoofUtil.getComposedWallNormal(wall).multiplyScalar(wall.eavesLength));\r\n }, [composedWalls]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n\r\n if (!composedWalls || composedWalls.length !== 4) return segments;\r\n\r\n const [frontWall, rightWall, backWall, leftWall] = composedWalls;\r\n const [frontOverhang, rightOverhang, backOverhang, leftOverhang] = overhangs;\r\n\r\n const wallPoint0 = frontWall.leftPoint;\r\n const wallPoint1 = frontWall.rightPoint;\r\n const wallPoint2 = backWall.leftPoint;\r\n const wallPoint3 = backWall.rightPoint;\r\n\r\n const frontWallLeftPointAfterOffset = wallPoint0.clone().add(frontOverhang);\r\n const frontWallRightPointAfterOffset = wallPoint1.clone().add(frontOverhang);\r\n const leftWallLeftPointAfterOffset = wallPoint3.clone().add(leftOverhang);\r\n const leftWallRightPointAfterOffset = wallPoint0.clone().add(leftOverhang);\r\n const rightWallLeftPointAfterOffset = wallPoint1.clone().add(rightOverhang);\r\n const rightWallRightPointAfterOffset = wallPoint2.clone().add(rightOverhang);\r\n const backWallLeftPointAfterOffset = wallPoint2.clone().add(backOverhang);\r\n const backWallRightPointAfterOffset = wallPoint3.clone().add(backOverhang);\r\n\r\n // front side\r\n const frontSidePoints: Vector3[] = [];\r\n const { lh: frontWallLh, rh: frontWallRh } = getWallHeight(composedWalls, 0);\r\n\r\n const d0 = RoofUtil.getDistance(wallPoint0, wallPoint1, frontRidgeLeftPointV3.clone().add(centroid));\r\n const overhangHeight0 = Math.min(\r\n ((frontWall.eavesLength ?? 0) / d0) * (frontRidgeLeftPointV3.clone().add(centroid).z - frontWallLh),\r\n frontWallLh,\r\n );\r\n\r\n const d1 = RoofUtil.getDistance(wallPoint0, wallPoint1, frontRidgeRightPointV3.clone().add(centroid));\r\n const overhangHeight1 = Math.min(\r\n ((frontWall.eavesLength ?? 0) / d1) * (frontRidgeRightPointV3.clone().add(centroid).z - frontWallRh),\r\n frontWallRh,\r\n );\r\n\r\n const frontWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallLh - overhangHeight0)\r\n .sub(centroid);\r\n\r\n const frontWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallRh - overhangHeight1)\r\n .sub(centroid);\r\n\r\n const frontRidgeLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontRidgeLeftPointV3,\r\n frontRidgeRightPointV3,\r\n leftWallLeftPointAfterOffset.clone().sub(centroid),\r\n leftWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(frontRidgeLeftPointV3.z);\r\n\r\n const frontRidgeRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontRidgeRightPointV3,\r\n frontRidgeLeftPointV3,\r\n rightWallLeftPointAfterOffset.clone().sub(centroid),\r\n rightWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(frontRidgeRightPointV3.z);\r\n\r\n frontSidePoints.push(\r\n frontWallLeftPointAfterOverhang,\r\n frontWallRightPointAfterOverhang,\r\n frontRidgeRightPointAfterOverhang,\r\n frontRidgeLeftPointAfterOverhang,\r\n );\r\n frontSidePoints.push(\r\n frontWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n frontWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n frontRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n frontRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n\r\n const frontCenter = RoofUtil.getComposedWallCenter(frontWall);\r\n const frontAngle = -frontWall.relativeAngle;\r\n const frontSideLength = new Vector3(frontCenter.x, frontCenter.y).sub(topRidgeMidPointV3.clone().setZ(0)).length();\r\n segments.push({ points: frontSidePoints, angle: frontAngle, length: frontSideLength });\r\n\r\n // front top\r\n const frontTopPoints: Vector3[] = [];\r\n const topRidgeLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n topRidgeLeftPointV3,\r\n topRidgeRightPointV3,\r\n leftWallLeftPointAfterOffset.clone().sub(centroid),\r\n leftWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(topRidgeLeftPointV3.z);\r\n\r\n const topRidgeRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n topRidgeLeftPointV3,\r\n topRidgeRightPointV3,\r\n rightWallLeftPointAfterOffset.clone().sub(centroid),\r\n rightWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(topRidgeRightPointV3.z);\r\n\r\n frontTopPoints.push(\r\n frontRidgeLeftPointAfterOverhang,\r\n frontRidgeRightPointAfterOverhang,\r\n topRidgeRightPointAfterOverhang,\r\n topRidgeLeftPointAfterOverhang,\r\n );\r\n frontTopPoints.push(\r\n frontRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n frontRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n topRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n topRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n\r\n segments.push({ points: frontTopPoints, angle: frontAngle, length: frontSideLength });\r\n\r\n // back top\r\n const backAngle = -backWall.relativeAngle;\r\n const { lh: backWallLh, rh: backWallRh } = getWallHeight(composedWalls, 2);\r\n\r\n const d2 = RoofUtil.getDistance(wallPoint2, wallPoint3, backRidgeLeftPointV3.clone().add(centroid));\r\n const overhangHeight2 = Math.min(\r\n ((backWall.eavesLength ?? 0) / d2) * (backRidgeLeftPointV3.clone().add(centroid).z - backWallLh),\r\n backWallLh,\r\n );\r\n\r\n const d3 = RoofUtil.getDistance(wallPoint2, wallPoint3, backRidgeRightPointV3.clone().add(centroid));\r\n const overhangHeight3 = Math.min(\r\n ((backWall.eavesLength ?? 0) / d3) * (backRidgeRightPointV3.clone().add(centroid).z - backWallRh),\r\n backWallRh,\r\n );\r\n\r\n const backWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n )\r\n .setZ(backWallLh - overhangHeight2)\r\n .sub(centroid);\r\n\r\n const backWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n )\r\n .setZ(backWallRh - overhangHeight3)\r\n .sub(centroid);\r\n\r\n const backRidgeLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backRidgeLeftPointV3,\r\n backRidgeRightPointV3,\r\n rightWallLeftPointAfterOffset.clone().sub(centroid),\r\n rightWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(backRidgeRightPointV3.z);\r\n\r\n const backRidgeRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backRidgeRightPointV3,\r\n backRidgeLeftPointV3,\r\n leftWallLeftPointAfterOffset.clone().sub(centroid),\r\n leftWallRightPointAfterOffset.clone().sub(centroid),\r\n ).setZ(backRidgeRightPointV3.z);\r\n\r\n const backCenter = RoofUtil.getComposedWallCenter(backWall);\r\n const backSideLength = new Vector3(backCenter.x, backCenter.y).sub(topRidgeMidPointV3.clone().setZ(0)).length();\r\n\r\n const backTopPoints: Vector3[] = [];\r\n backTopPoints.push(\r\n backRidgeLeftPointAfterOverhang,\r\n backRidgeRightPointAfterOverhang,\r\n topRidgeLeftPointAfterOverhang,\r\n topRidgeRightPointAfterOverhang,\r\n );\r\n backTopPoints.push(\r\n backRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n backRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n topRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n topRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n segments.push({ points: backTopPoints, angle: backAngle, length: backSideLength });\r\n\r\n // back side\r\n const backSidePoints: Vector3[] = [];\r\n backSidePoints.push(\r\n backWallLeftPointAfterOverhang,\r\n backWallRightPointAfterOverhang,\r\n backRidgeRightPointAfterOverhang,\r\n backRidgeLeftPointAfterOverhang,\r\n );\r\n backSidePoints.push(\r\n backWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n backWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n backRidgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n backRidgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n segments.push({ points: backSidePoints, angle: backAngle, length: backSideLength });\r\n\r\n return segments;\r\n }, [composedWalls, topZ, thickness, topRidgePoint, frontRidgePoint, backRidgePoint]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall) => wall.leftPoint);\r\n }, [composedWalls]);\r\n\r\n // handle remove roof\r\n useEffect(() => {\r\n if (!composedWalls || composedWalls.length !== 4) {\r\n removeElementById(id, false, false, true);\r\n }\r\n }, [composedWalls]);\r\n\r\n const isFirstRender = useIsFirstRender();\r\n\r\n // update walls\r\n useEffect(() => {\r\n if (composedWalls?.length !== 4) return;\r\n\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id) || !isFirstRender) {\r\n if (isFlat) {\r\n updateFlatRoofWalls(composedWalls);\r\n } else {\r\n // update caused by changing wall height\r\n updateWalls(composedWalls, topZ, frontRidgePoint, topRidgePoint, backRidgePoint);\r\n }\r\n updateRooftopElements(foundationModel, id, roofSegments, centroid, topZ, thickness, isFlat);\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n }, [roofSegments]);\r\n\r\n useUpdateRooftopElementsByContextMenuChanges(foundationModel, id, roofSegments, centroid, topZ, thickness, isFlat);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n const segmentVertices: Vector3[][] = [];\r\n if (!composedWalls || composedWalls.length !== 4) return segmentVertices;\r\n\r\n const wallPoints = composedWalls.map(\r\n (w, i, arr) => new Vector3(w.leftPoint.x, w.leftPoint.y, getWallHeight(arr, i).lh),\r\n );\r\n\r\n const ridgeFLPoint = frontRidgeLeftPointV3.clone().add(centroid);\r\n const ridgeFRPoint = frontRidgeRightPointV3.clone().add(centroid);\r\n const ridgeBLPoint = backRidgeLeftPointV3.clone().add(centroid);\r\n const ridgeBRPoint = backRidgeRightPointV3.clone().add(centroid);\r\n const ridgeTLPoint = topRidgeLeftPointV3.clone().add(centroid);\r\n const ridgeTRPoint = topRidgeRightPointV3.clone().add(centroid);\r\n\r\n segmentVertices.push([wallPoints[0], wallPoints[1], ridgeFRPoint, ridgeFLPoint]);\r\n segmentVertices.push([ridgeFLPoint, ridgeFRPoint, ridgeTRPoint, ridgeTLPoint]);\r\n segmentVertices.push([ridgeTLPoint, ridgeTRPoint, ridgeBLPoint, ridgeBRPoint]);\r\n segmentVertices.push([wallPoints[2], wallPoints[3], ridgeBRPoint, ridgeBLPoint]);\r\n\r\n if (isFlat) {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, [wallPoints]);\r\n } else {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n }\r\n };\r\n\r\n const updateSegmentVertices = useUpdateSegmentVerticesMap(id, centroid, roofSegments, isFlat, RoofType.Gambrel);\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const selectMe = useStore(Selector.selectMe);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [flatHeatmapTexture, setFlatHeatmapTexture] = useState(null);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n if (isFlat) {\r\n const heatmap = getHeatmap(id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n // obtain the bounding rectangle\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices && segmentVertices.length > 0 && foundationModel) {\r\n const euler = new Euler(0, 0, foundationModel.rotation[2], 'ZYX');\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const s of segmentVertices) {\r\n for (const v of s) {\r\n const v2 = v.clone().applyEuler(euler);\r\n if (v2.x > maxX) maxX = v2.x;\r\n if (v2.x < minX) minX = v2.x;\r\n if (v2.y > maxY) maxY = v2.y;\r\n if (v2.y < minY) minY = v2.y;\r\n }\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n const vcx = (minX + maxX) / 2;\r\n const vcy = (minY + maxY) / 2;\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n t.offset.set(-minX / dx, -minY / dy);\r\n t.center.set(vcx / dx, vcy / dy);\r\n t.rotation = -foundationModel.rotation[2];\r\n t.repeat.set(1 / dx, 1 / dy);\r\n }\r\n setFlatHeatmapTexture(t);\r\n }\r\n }\r\n } else {\r\n const n = roofSegments.length;\r\n if (n > 0) {\r\n const textures = [];\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const userData = useUserData(id, foundationModel, centroid, roofSegments);\r\n\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n\r\n return (\r\n \r\n {/* roof segments */}\r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, centroid);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {isFlat ? (\r\n \r\n ) : (\r\n <>\r\n {roofSegments.map((segment, index, arr) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && composedWalls[0].lz === composedWalls[2].lz && ceilingPoints && (\r\n \r\n )}\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(topRidgeMidPointV3.x, topRidgeMidPointV3.y, topZ).add(centroid);\r\n if (foundationModel) {\r\n const r = -Math.atan2(camera.position.x - cx, camera.position.y - cy) - foundationModel.rotation[2];\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.TopMid);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.TopMid;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = topRidgeMidPointV3.x;\r\n state.selectedElementY = topRidgeMidPointV3.y;\r\n });\r\n }}\r\n />\r\n {!isFlat && (\r\n <>\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...topRidgePoint];\r\n setInterSectionPlane(topRidgeLeftPointV3, composedWalls[3]);\r\n setRoofHandleType(RoofHandleType.TopLeft);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...topRidgePoint];\r\n setInterSectionPlane(topRidgeRightPointV3, composedWalls[1]);\r\n setRoofHandleType(RoofHandleType.TopRight);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...frontRidgePoint];\r\n setInterSectionPlane(frontRidgeLeftPointV3, composedWalls[3]);\r\n setRoofHandleType(RoofHandleType.FrontLeft);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...frontRidgePoint];\r\n setInterSectionPlane(frontRidgeRightPointV3, composedWalls[1]);\r\n setRoofHandleType(RoofHandleType.FrontRight);\r\n }}\r\n />\r\n\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...backRidgePoint];\r\n setInterSectionPlane(backRidgeLeftPointV3, composedWalls[1]);\r\n setRoofHandleType(RoofHandleType.BackLeft);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeVal.current = [...backRidgePoint];\r\n setInterSectionPlane(backRidgeRightPointV3, composedWalls[3]);\r\n setRoofHandleType(RoofHandleType.BackRight);\r\n }}\r\n />\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {enableIntersectionPlane && (\r\n {\r\n if (\r\n intersectionPlaneRef.current &&\r\n isPointerDownRef.current &&\r\n composedWalls &&\r\n composedWalls.length === 4\r\n ) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0] && foundationModel) {\r\n const point = intersects[0].point;\r\n if (point.z < 0.001) {\r\n return;\r\n }\r\n switch (roofHandleType) {\r\n case RoofHandleType.TopMid: {\r\n const newRise = Math.max(0, point.z - foundationModel.lz - 0.3 - highestWallHeight);\r\n const newTopZ = highestWallHeight + newRise;\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n newTopZ,\r\n frontRidgePoint,\r\n topRidgePoint,\r\n backRidgePoint,\r\n );\r\n // check if new height no confilc with childs on walls\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, newTopZ + roofModel.thickness);\r\n }\r\n break;\r\n }\r\n case RoofHandleType.FrontLeft: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[3], point),\r\n topRidgePoint[0] + 0.05,\r\n 0.45,\r\n );\r\n const hDiff = topZ - composedWalls[0].lz;\r\n const pz = Util.clamp((point.z - foundationModel.lz - composedWalls[0].lz) / hDiff, 0, 1);\r\n const newFrontRidgePoint = [px, pz];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n newFrontRidgePoint,\r\n topRidgePoint,\r\n backRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.frontRidgePoint[0] = newFrontRidgePoint[0];\r\n roof.frontRidgePoint[1] = newFrontRidgePoint[1];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.FrontRight: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[1], point),\r\n -0.45,\r\n -topRidgePoint[0] - 0.05,\r\n );\r\n const hDiff = topZ - composedWalls[0].lz;\r\n const pz = Util.clamp((point.z - foundationModel.lz - composedWalls[0].lz) / hDiff, 0, 1);\r\n const newFrontRidgePoint = [-px, pz];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n newFrontRidgePoint,\r\n topRidgePoint,\r\n backRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.frontRidgePoint = [...newFrontRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.TopLeft: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[3], point),\r\n -backRidgePoint[0] + 0.05,\r\n frontRidgePoint[0] - 0.05,\r\n );\r\n const newTopRidgePoint = [px, topRidgePoint[1]];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n newTopRidgePoint,\r\n backRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.topRidgePoint = [...newTopRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.TopRight: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[1], point),\r\n -frontRidgePoint[0] + 0.05,\r\n backRidgePoint[0] - 0.05,\r\n );\r\n const newTopRidgePoint = [-px, topRidgePoint[1]];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n newTopRidgePoint,\r\n backRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.topRidgePoint = [...newTopRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.BackLeft: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[1], point),\r\n -topRidgePoint[0] + 0.05,\r\n 0.45,\r\n );\r\n const hDiff = topZ - composedWalls[2].lz;\r\n const pz = Util.clamp((point.z - foundationModel.lz - composedWalls[2].lz) / hDiff, 0, 1);\r\n const newBackRidgePoint = [px, pz];\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n topRidgePoint,\r\n newBackRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.backRidgePoint = [...newBackRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.BackRight: {\r\n if (foundationModel && composedWalls && composedWalls.length === 4) {\r\n const px = Util.clamp(\r\n getRelPos(foundationModel, composedWalls[3], point),\r\n -0.45,\r\n topRidgePoint[0] - 0.05,\r\n );\r\n const hDiff = topZ - composedWalls[2].lz;\r\n const pz = Util.clamp((point.z - foundationModel.lz - composedWalls[2].lz) / hDiff, 0, 1);\r\n const newBackRidgePoint = [-px, pz];\r\n\r\n const sideWallHeightsMap = getSideWallHeightsMap(\r\n composedWalls,\r\n topZ,\r\n frontRidgePoint,\r\n topRidgePoint,\r\n newBackRidgePoint,\r\n );\r\n if (isRoofValid(sideWallHeightsMap, parentId)) {\r\n setCommonStore((state) => {\r\n const roof = state.elements.find((e) => isThisIdAndType(e)) as GambrelRoofModel;\r\n if (!roof) return;\r\n roof.backRidgePoint = [...newBackRidgePoint];\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n onPointerUp={() => {\r\n switch (roofHandleType) {\r\n case RoofHandleType.TopMid: {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n break;\r\n }\r\n case RoofHandleType.TopLeft:\r\n case RoofHandleType.TopRight: {\r\n handleUndoableResizeRidge(id, roofHandleType, oldRidgeVal.current, topRidgePoint);\r\n break;\r\n }\r\n case RoofHandleType.FrontLeft:\r\n case RoofHandleType.FrontRight: {\r\n handleUndoableResizeRidge(id, roofHandleType, oldRidgeVal.current, frontRidgePoint);\r\n break;\r\n }\r\n case RoofHandleType.BackLeft:\r\n case RoofHandleType.BackRight: {\r\n handleUndoableResizeRidge(id, roofHandleType, oldRidgeVal.current, backRidgePoint);\r\n break;\r\n }\r\n }\r\n isPointerDownRef.current = false;\r\n setEnableIntersectionPlane(false);\r\n setRoofHandleType(RoofHandleType.Null);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(GambrelRoof, areRoofsEqual);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Cone, Extrude, Line, Plane } from '@react-three/drei';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { GableRoofModel, RoofModel, RoofStructure, RoofType } from 'src/models/RoofModel';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport {\r\n CanvasTexture,\r\n DoubleSide,\r\n Euler,\r\n Float32BufferAttribute,\r\n Mesh,\r\n Raycaster,\r\n Shape,\r\n Vector2,\r\n Vector3,\r\n} from 'three';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { useThree } from '@react-three/fiber';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n UNIT_VECTOR_POS_Z,\r\n} from 'src/constants';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n handleRoofBodyPointerDown,\r\n RoofHandle,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n updateRooftopElements,\r\n areRoofsEqual,\r\n} from './roofRenderer';\r\nimport { UnoableResizeGableRoofRidge } from 'src/undo/UndoableResize';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport { Util } from 'src/Util';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport {\r\n ComposedWall,\r\n useComposedWallArray,\r\n useIsFirstRender,\r\n useComposedRoofHeight,\r\n useRoofTexture,\r\n useTransparent,\r\n useUpdateOldRoofFiles,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n useUpdateRooftopElementsByContextMenuChanges,\r\n useUserData,\r\n} from './hooks';\r\nimport { ConvexGeometry } from 'src/js/ConvexGeometry';\r\nimport { CSG } from 'three-csg-ts';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { BufferRoofSegment, WindowData } from './roofSegment';\r\nimport Ceiling from './ceiling';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { WallHeights, isRoofValid } from './gambrelRoof';\r\nimport shallow from 'zustand/shallow';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zeroVector2 = new Vector2();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\ninterface RafterUnitProps {\r\n start: Vector3;\r\n end: Vector3;\r\n width: number;\r\n height: number;\r\n color: string;\r\n offset?: Vector3;\r\n}\r\ninterface RafterProps {\r\n ridgeLeftPoint: Vector3;\r\n ridgeRightPoint: Vector3;\r\n wallArray: ComposedWall[];\r\n overhang: number;\r\n isShed: boolean;\r\n height: number;\r\n width: number;\r\n spacing: number;\r\n color: string;\r\n}\r\n\r\nconst RafterUnit = React.memo(({ start, end, width, height, offset, color }: RafterUnitProps) => {\r\n const startV2 = useMemo(() => new Vector2(start.x, start.y), [start]);\r\n const endV2 = useMemo(() => new Vector2(end.x, end.y), [end]);\r\n\r\n const rotationZ = useMemo(() => new Vector2().subVectors(endV2, startV2).angle(), [startV2, endV2]);\r\n\r\n const shape = useMemo(() => {\r\n const s = new Shape();\r\n\r\n const x = startV2.distanceTo(endV2);\r\n const y = start.z - end.z;\r\n\r\n s.moveTo(0, 0);\r\n s.lineTo(x, -y);\r\n s.lineTo(x, -y + height);\r\n s.lineTo(0, height);\r\n s.closePath();\r\n\r\n return s;\r\n }, [start, end, startV2, endV2, height]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nconst Rafter = ({\r\n ridgeLeftPoint,\r\n ridgeRightPoint,\r\n wallArray,\r\n // overhang,\r\n height,\r\n isShed,\r\n width,\r\n spacing,\r\n color,\r\n}: RafterProps) => {\r\n const [frontWall, rightWall, backWall, leftWall] = wallArray;\r\n\r\n const ridgeUnitVector = useMemo(() => new Vector3().subVectors(ridgeRightPoint, ridgeLeftPoint).normalize(), []);\r\n\r\n const ridgeLeftPointAfterOverhang = useMemo(\r\n () => ridgeLeftPoint.clone().add(ridgeUnitVector.clone().multiplyScalar(-(leftWall.eavesLength ?? 0) / 2)),\r\n [ridgeLeftPoint, leftWall.eavesLength],\r\n );\r\n\r\n const ridgeRightPointAfterOverhang = useMemo(\r\n () => ridgeRightPoint.clone().add(ridgeUnitVector.clone().multiplyScalar((rightWall.eavesLength ?? 0) / 2)),\r\n [ridgeLeftPoint, rightWall.eavesLength],\r\n );\r\n\r\n const frontWallLeftPoint = frontWall.leftPoint.clone().setZ(frontWall.lz);\r\n const backWallRightPoint = backWall.rightPoint.clone().setZ(backWall.lz);\r\n\r\n const array = useMemo(() => {\r\n if (wallArray.length < 4) {\r\n return [];\r\n }\r\n\r\n const frontWallUnitVector = new Vector3()\r\n .subVectors(new Vector3(frontWall.rightPoint.x, frontWall.rightPoint.y, frontWall.lz), frontWallLeftPoint)\r\n .normalize();\r\n\r\n const backWallUnitVector = new Vector3()\r\n .subVectors(new Vector3(backWall.leftPoint.x, backWall.leftPoint.y, backWall.lz), backWallRightPoint)\r\n .normalize();\r\n\r\n const ridgeLength = ridgeLeftPoint.distanceTo(ridgeRightPoint);\r\n const frontWallLength = new Vector3().subVectors(frontWall.leftPoint, frontWall.rightPoint).length();\r\n const backWallLength = new Vector3().subVectors(backWall.leftPoint, backWall.rightPoint).length();\r\n\r\n const offset = width;\r\n const number = Math.floor((Math.min(ridgeLength, frontWallLength, backWallLength) - width) / spacing) + 2;\r\n return new Array(number).fill(0).map((v, i) => {\r\n let len;\r\n if (i === number - 1) {\r\n len = ridgeLength;\r\n } else {\r\n len = i * spacing + offset;\r\n }\r\n const ridge = ridgeLeftPoint.clone().add(ridgeUnitVector.clone().multiplyScalar(len));\r\n const front = frontWallLeftPoint.clone().add(frontWallUnitVector.clone().multiplyScalar(len));\r\n const back = backWallRightPoint.clone().add(backWallUnitVector.clone().multiplyScalar(len));\r\n const frontOverhang = new Vector3()\r\n .subVectors(front, ridge)\r\n .normalize()\r\n .multiplyScalar(frontWall.eavesLength ?? 0);\r\n const backOverhang = new Vector3()\r\n .subVectors(back, ridge)\r\n .normalize()\r\n .multiplyScalar(backWall.eavesLength ?? 0);\r\n front.add(frontOverhang);\r\n back.add(backOverhang);\r\n return { ridge, front, back };\r\n });\r\n }, [spacing, ridgeLeftPoint]);\r\n\r\n const showFront = ridgeLeftPoint.distanceTo(frontWallLeftPoint) > ridgeLeftPoint.distanceTo(backWallRightPoint);\r\n\r\n const offset = new Vector3(-width, 0, 0);\r\n const offsetTop = new Vector3(0, width / 2, 0);\r\n\r\n return (\r\n <>\r\n {array.map((v, i) => (\r\n \r\n {isShed ? (\r\n showFront ? (\r\n \r\n ) : (\r\n \r\n )\r\n ) : (\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nconst GableRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n if (roofSegments.length === 0) {\r\n return null;\r\n }\r\n const peripheryPoints: Vector3[] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness);\r\n\r\n const isShed = roofSegments.length === 1;\r\n\r\n for (const segment of roofSegments) {\r\n const [leftRoof, rightRoof, rightRidge, leftRidge] = segment.points;\r\n peripheryPoints.push(leftRidge, leftRoof, rightRoof, rightRidge);\r\n if (isShed) {\r\n peripheryPoints.push(leftRidge);\r\n }\r\n }\r\n\r\n const isFlat = Math.abs(roofSegments[0].points[0].z) < 0.015;\r\n const leftRidge = roofSegments[0].points[3];\r\n const rightRidge = roofSegments[0].points[2];\r\n\r\n const periphery = ;\r\n const ridge = ;\r\n return (\r\n <>\r\n {periphery}\r\n {!isFlat && !isShed && ridge}\r\n \r\n {periphery}\r\n {!isFlat && !isShed && ridge}\r\n \r\n {roofSegments.map((segment, idx) => {\r\n const [leftRoof, rightRoof, rightRidge, leftRidge] = segment.points;\r\n return (\r\n \r\n \r\n \r\n {isShed && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n );\r\n});\r\n\r\ninterface GableRoofProps extends BuildingParts {\r\n roofModel: GableRoofModel;\r\n}\r\n\r\nconst GableRoof = ({ roofModel, foundationModel }: GableRoofProps) => {\r\n let {\r\n id,\r\n parentId,\r\n wallsId,\r\n lz,\r\n rise = lz,\r\n thickness = 0.2,\r\n ridgeLeftPoint,\r\n ridgeRightPoint,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n locked,\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n roofStructure,\r\n rafterSpacing = 2,\r\n rafterWidth = 0.1,\r\n rafterColor = 'white',\r\n glassTint = '#73D8FF',\r\n opacity = 0.5,\r\n ceiling = false,\r\n } = roofModel;\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const selected = useSelected(id);\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n const { gl, camera } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [roofHandleType, setRoofHandleType] = useState(RoofHandleType.Null);\r\n\r\n const isShed = Math.abs(ridgeLeftPoint[0]) > 0.45;\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const oldRidgeLeft = useRef(ridgeLeftPoint[0]);\r\n const oldRidgeRight = useRef(ridgeRightPoint[0]);\r\n const oldRiseRef = useRef(rise);\r\n const isPointerDownRef = useRef(false);\r\n\r\n const updateRoofTopRidge = (elemId: string, left: number, right: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Gable) {\r\n (e as GableRoofModel).ridgeLeftPoint[0] = left;\r\n (e as GableRoofModel).ridgeRightPoint[0] = right;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleUndoableResizeTopRidge = (\r\n elemId: string,\r\n oldLeft: number,\r\n oldRight: number,\r\n newLeft: number,\r\n newRight: number,\r\n ) => {\r\n const undoable = {\r\n name: 'Resize Gable Roof Ridge',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldLeft: oldLeft,\r\n oldRight: oldRight,\r\n newLeft: newLeft,\r\n newRight: newRight,\r\n undo: () => {\r\n updateRoofTopRidge(undoable.resizedElementId, oldLeft, oldRight);\r\n },\r\n redo: () => {\r\n updateRoofTopRidge(undoable.resizedElementId, newLeft, newRight);\r\n },\r\n } as UnoableResizeGableRoofRidge;\r\n useStore.getState().addUndoable(undoable);\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const getRelPos = (foundation: ElementModel, wall: ComposedWall, point: Vector3) => {\r\n const foundationCenter = new Vector2(foundation.cx, foundation.cy);\r\n const wallCenter = new Vector3().addVectors(wall.leftPoint, wall.rightPoint).divideScalar(2);\r\n const wallLength = new Vector3().subVectors(wall.leftPoint, wall.rightPoint).length();\r\n const wallAbsCenter = new Vector2(wallCenter.x, wallCenter.y)\r\n .rotateAround(zeroVector2, foundation.rotation[2])\r\n .add(foundationCenter);\r\n const wallAbsAngle = foundation.rotation[2] + wall.relativeAngle;\r\n const p = new Vector2(point.x, point.y).sub(wallAbsCenter).rotateAround(zeroVector2, -wallAbsAngle);\r\n const x = p.x / wallLength;\r\n return Math.min(Math.abs(x), 0.5) * (x >= 0 ? 1 : -1);\r\n };\r\n\r\n const getRidgePoint = (wall: ComposedWall, px: number, ph: number) => {\r\n if (!wall) {\r\n return new Vector3();\r\n }\r\n const lx = new Vector3().subVectors(wall.leftPoint, wall.rightPoint).length();\r\n const center = new Vector3().addVectors(wall.leftPoint, wall.rightPoint).divideScalar(2);\r\n const e = new Euler(0, 0, wall.relativeAngle);\r\n const v = new Vector3(px * lx, 0, 0);\r\n const height = ph * rise + highestWallHeight;\r\n return new Vector3(center.x, center.y, height).add(v.applyEuler(e));\r\n };\r\n\r\n const getWallHeight = (arr: ComposedWall[], i: number) => {\r\n const w = arr[i];\r\n let lh;\r\n let rh;\r\n if (i === 0 || i === 2) {\r\n lh = w.lz;\r\n rh = w.lz;\r\n } else if (i === 1) {\r\n lh = arr[0].lz;\r\n rh = arr[2].lz;\r\n } else {\r\n lh = arr[2].lz;\r\n rh = arr[0].lz;\r\n }\r\n return { lh, rh };\r\n };\r\n\r\n const getShiftedArr = (array: T[], idx: number) => {\r\n const arr = array.slice().reverse();\r\n swap(arr, 0, idx - 1);\r\n swap(arr, idx, arr.length - 1);\r\n return arr;\r\n };\r\n\r\n const swap = (arr: T[], i: number, j: number) => {\r\n while (i < j) {\r\n const temp = arr[i];\r\n arr[i] = arr[j];\r\n arr[j] = temp;\r\n i++;\r\n j--;\r\n }\r\n };\r\n\r\n const getY = (k: number, b: number, x: number) => {\r\n return k * x + b;\r\n };\r\n\r\n const setGabledWallHeightsMap = (\r\n map: Map,\r\n composedWalls: ComposedWall[],\r\n index: number,\r\n topZ: number,\r\n ridgePoint: number[],\r\n ) => {\r\n const composedWall = composedWalls[index];\r\n const length = new Vector3().subVectors(composedWall.leftPoint, composedWall.rightPoint).length();\r\n const ridgeX = (ridgePoint[0] + 0.5) * length;\r\n const { lh, rh } = getWallHeight(composedWalls, index);\r\n const leftHalfK = (ridgePoint[1] * (topZ - lh)) / ridgeX;\r\n const leftHalfB = lh;\r\n const rightHalfK = -(ridgePoint[1] * (topZ - rh)) / (length - ridgeX);\r\n const rightHalfB = rh - rightHalfK * length;\r\n\r\n const wallPointsX = composedWall.wallsId.reduce(\r\n (acc, currId) => {\r\n const wall = useStore.getState().elements.find((e) => e.id === currId) as WallModel;\r\n if (!wall) return acc;\r\n return [...acc, wall.lx + acc[acc.length - 1]];\r\n },\r\n [0],\r\n );\r\n\r\n for (let i = 0; i < composedWall.wallsId.length; i++) {\r\n const id = composedWall.wallsId[i];\r\n const [leftX, rightX] = [wallPointsX[i], wallPointsX[i + 1]];\r\n const wallLength = rightX - leftX;\r\n\r\n const wallHeights: WallHeights = { left: 0, right: 0 };\r\n if (leftX < ridgeX) {\r\n wallHeights.left = getY(leftHalfK, leftHalfB, leftX);\r\n } else if (leftX === ridgeX) {\r\n wallHeights.left = getY(rightHalfK, rightHalfB, leftX);\r\n wallHeights.center = [-0.5, topZ];\r\n } else {\r\n wallHeights.left = getY(rightHalfK, rightHalfB, leftX);\r\n wallHeights.center = undefined;\r\n }\r\n\r\n if (rightX < ridgeX) {\r\n wallHeights.right = getY(leftHalfK, leftHalfB, rightX);\r\n wallHeights.center = undefined;\r\n } else if (rightX === ridgeX) {\r\n wallHeights.right = getY(leftHalfK, leftHalfB, rightX);\r\n wallHeights.center = [0.5, topZ];\r\n } else {\r\n wallHeights.right = getY(rightHalfK, rightHalfB, rightX);\r\n }\r\n if (leftX < ridgeX && rightX > ridgeX) {\r\n wallHeights.center = [(ridgeX - leftX) / wallLength - 0.5, topZ];\r\n }\r\n\r\n map.set(id, wallHeights);\r\n }\r\n\r\n return map;\r\n };\r\n\r\n const getGabledWallsHeightsMap = (\r\n composedWalls: ComposedWall[],\r\n topZ: number,\r\n ridgeLeftPoint: number[],\r\n ridgeRightPoint: number[],\r\n ) => {\r\n const map = new Map();\r\n setGabledWallHeightsMap(map, composedWalls, 1, topZ, ridgeRightPoint);\r\n setGabledWallHeightsMap(map, composedWalls, 3, topZ, ridgeLeftPoint);\r\n return map;\r\n };\r\n\r\n const updateWalls = (\r\n composedWalls: ComposedWall[],\r\n topZ: number,\r\n ridgeLeftPoint: number[],\r\n ridgeRightPoint: number[],\r\n ) => {\r\n const [frontWall, rightWall, backWall, leftWall] = composedWalls;\r\n\r\n const frontWallsIdSet = new Set(frontWall.wallsId);\r\n const backWallsIdSet = new Set(backWall.wallsId);\r\n const gabledWallsHeightsMap = getGabledWallsHeightsMap(composedWalls, topZ, ridgeLeftPoint, ridgeRightPoint);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === parentId) {\r\n if (frontWallsIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n w.roofId = id;\r\n if (ridgeLeftPoint[0] === 0.5) {\r\n w.leftRoofHeight = topZ;\r\n w.rightRoofHeight = topZ;\r\n w.centerRoofHeight = undefined;\r\n } else {\r\n const { lh, rh } = getWallHeight(composedWalls, 0);\r\n w.leftRoofHeight = lh;\r\n w.rightRoofHeight = rh;\r\n }\r\n } else if (backWallsIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n w.roofId = id;\r\n if (ridgeLeftPoint[0] === -0.5) {\r\n w.leftRoofHeight = topZ;\r\n w.rightRoofHeight = topZ;\r\n w.centerRoofHeight = undefined;\r\n } else {\r\n const { lh, rh } = getWallHeight(composedWalls, 2);\r\n w.leftRoofHeight = lh;\r\n w.rightRoofHeight = rh;\r\n }\r\n } else if (gabledWallsHeightsMap.has(e.id)) {\r\n const gabledWallHeights = gabledWallsHeightsMap.get(e.id);\r\n if (gabledWallHeights) {\r\n const wall = e as WallModel;\r\n const { left, right, center } = gabledWallHeights;\r\n wall.roofId = id;\r\n wall.leftRoofHeight = left;\r\n wall.rightRoofHeight = right;\r\n if (center) {\r\n const [x, h] = center;\r\n if (wall.centerRoofHeight) {\r\n wall.centerRoofHeight[0] = x;\r\n wall.centerRoofHeight[1] = h;\r\n } else {\r\n wall.centerRoofHeight = [x, h];\r\n }\r\n } else {\r\n wall.centerRoofHeight = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const composedWalls = useComposedWallArray(wallsId[0], parentId);\r\n\r\n const { highestWallHeight, topZ } = useComposedRoofHeight(composedWalls, rise, true);\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const centroid = useMemo(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) return new Vector3();\r\n const points = composedWalls.map((w) => ({ x: w.leftPoint.x, y: w.leftPoint.y } as Point2));\r\n const p = Util.calculatePolygonCentroid(points);\r\n return new Vector3(p.x, p.y, topZ);\r\n }, [composedWalls, topZ]);\r\n\r\n const ridgeLeftPointV3 = useMemo(() => {\r\n if (composedWalls === null) return new Vector3();\r\n const leftComposedWall = composedWalls[3];\r\n const [x, h] = ridgeLeftPoint; // percent\r\n return getRidgePoint(leftComposedWall, x, h);\r\n }, [composedWalls, topZ, ridgeLeftPoint]);\r\n\r\n const ridgeRightPointV3 = useMemo(() => {\r\n if (composedWalls === null) return new Vector3();\r\n const rightComposedWall = composedWalls[1];\r\n const [x, h] = ridgeRightPoint; // percent\r\n return getRidgePoint(rightComposedWall, x, h);\r\n }, [composedWalls, topZ, ridgeRightPoint]);\r\n\r\n const ridgeMidPoint = useMemo(() => {\r\n return new Vector3(\r\n (ridgeLeftPointV3.x + ridgeRightPointV3.x) / 2,\r\n (ridgeLeftPointV3.y + ridgeRightPointV3.y) / 2,\r\n topZ,\r\n );\r\n }, [ridgeLeftPointV3, ridgeRightPointV3]);\r\n\r\n const overhangs = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall) => RoofUtil.getComposedWallNormal(wall).multiplyScalar(wall.eavesLength));\r\n }, [composedWalls]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n\r\n if (!composedWalls || composedWalls.length !== 4 || !overhangs) return segments;\r\n\r\n // shed roof\r\n if (isShed) {\r\n const points: Vector3[] = [];\r\n const idx = ridgeLeftPoint[0] < 0 ? 0 : 2;\r\n const shiftedWallArray = getShiftedArr(composedWalls, idx);\r\n const shiftedOverhangs = getShiftedArr(overhangs, idx);\r\n const [frontWall, rightWall, backWall, leftWall] = shiftedWallArray;\r\n const [frontOverhang, rightOverhang, backOverhang, leftOverhang] = shiftedOverhangs;\r\n const wallPoint0 = frontWall.leftPoint;\r\n const wallPoint1 = frontWall.rightPoint;\r\n const wallPoint2 = backWall.leftPoint;\r\n const wallPoint3 = backWall.rightPoint;\r\n const frontWallLeftPointAfterOffset = wallPoint0.clone().add(frontOverhang);\r\n const frontWallRightPointAfterOffset = wallPoint1.clone().add(frontOverhang);\r\n const leftWallLeftPointAfterOffset = wallPoint3.clone().add(leftOverhang);\r\n const leftWallRightPointAfterOffset = wallPoint0.clone().add(leftOverhang);\r\n const rightWallLeftPointAfterOffset = wallPoint1.clone().add(rightOverhang);\r\n const rightWallRightPointAfterOffset = wallPoint2.clone().add(rightOverhang);\r\n const backWallLeftPointAfterOffset = wallPoint2.clone().add(backOverhang);\r\n const backWallRightPointAfterOffset = wallPoint3.clone().add(backOverhang);\r\n const { lh: frontWallLh, rh: frontWallRh } = getWallHeight(shiftedWallArray, 0);\r\n const { lh: backWallLh, rh: backWallRh } = getWallHeight(shiftedWallArray, 2);\r\n const d0 = RoofUtil.getDistance(wallPoint0, wallPoint1, wallPoint3);\r\n const overhangHeight0 = Math.min(((frontWall.eavesLength ?? 0) / d0) * (topZ - frontWallLh), frontWallLh);\r\n const d1 = RoofUtil.getDistance(wallPoint0, wallPoint1, wallPoint2);\r\n const overhangHeight1 = Math.min(((frontWall.eavesLength ?? 0) / d1) * (topZ - frontWallRh), frontWallRh);\r\n const d2 = RoofUtil.getDistance(wallPoint2, wallPoint3, wallPoint1);\r\n const overhangHeight2 = Math.min(((backWall.eavesLength ?? 0) / d2) * (topZ - frontWallRh), backWallLh);\r\n const d3 = RoofUtil.getDistance(wallPoint2, wallPoint3, wallPoint0);\r\n const overhangHeight3 = Math.min(((backWall.eavesLength ?? 0) / d3) * (topZ - frontWallLh), backWallRh);\r\n const frontWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallLh - overhangHeight0)\r\n .sub(centroid);\r\n const frontWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallRh - overhangHeight1)\r\n .sub(centroid);\r\n const backWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n )\r\n .setZ(topZ + overhangHeight2)\r\n .sub(centroid);\r\n const backWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n )\r\n .setZ(topZ + overhangHeight3)\r\n .sub(centroid);\r\n points.push(\r\n frontWallLeftPointAfterOverhang,\r\n frontWallRightPointAfterOverhang,\r\n backWallLeftPointAfterOverhang,\r\n backWallRightPointAfterOverhang,\r\n );\r\n points.push(\r\n frontWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n frontWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n backWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n backWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n const frontWallCenter = new Vector3().addVectors(frontWall.leftPoint, frontWall.rightPoint).divideScalar(2);\r\n const length = frontWallCenter.clone().sub(ridgeMidPoint.clone().setZ(0)).length();\r\n segments.push({ points, angle: -frontWall.relativeAngle, length });\r\n }\r\n // gable roof\r\n else {\r\n const [frontWall, rightWall, backWall, leftWall] = composedWalls;\r\n const [frontOverhang, rightOverhang, backOverhang, leftOverhang] = overhangs;\r\n\r\n const frontWallLeftPointAfterOffset = frontWall.leftPoint.clone().add(frontOverhang);\r\n const frontWallRightPointAfterOffset = frontWall.rightPoint.clone().add(frontOverhang);\r\n const leftWallLeftPointAfterOffset = backWall.rightPoint.clone().add(leftOverhang);\r\n const leftWallRightPointAfterOffset = frontWall.leftPoint.clone().add(leftOverhang);\r\n const rightWallLeftPointAfterOffset = frontWall.rightPoint.clone().add(rightOverhang);\r\n const rightWallRightPointAfterOffset = backWall.leftPoint.clone().add(rightOverhang);\r\n const backWallLeftPointAfterOffset = backWall.leftPoint.clone().add(backOverhang);\r\n const backWallRightPointAfterOffset = backWall.rightPoint.clone().add(backOverhang);\r\n\r\n const ridgeLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n ridgeLeftPointV3,\r\n ridgeRightPointV3,\r\n leftWallLeftPointAfterOffset.clone(),\r\n leftWallRightPointAfterOffset.clone(),\r\n )\r\n .setZ(ridgeLeftPointV3.z)\r\n .sub(centroid);\r\n\r\n const ridgeRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n ridgeLeftPointV3,\r\n ridgeRightPointV3,\r\n rightWallLeftPointAfterOffset.clone(),\r\n rightWallRightPointAfterOffset.clone(),\r\n )\r\n .setZ(ridgeRightPointV3.z)\r\n .sub(centroid);\r\n\r\n // front\r\n const frontPoints: Vector3[] = [];\r\n const { lh: frontWallLh, rh: frontWallRh } = getWallHeight(composedWalls, 0);\r\n\r\n const d0 = RoofUtil.getDistance(frontWall.leftPoint, frontWall.rightPoint, ridgeLeftPointV3);\r\n const overhangHeight0 = Math.min(\r\n ((frontWall.eavesLength ?? 0) / d0) * (ridgeLeftPointV3.z - frontWallLh),\r\n frontWallLh,\r\n );\r\n\r\n const d1 = RoofUtil.getDistance(frontWall.leftPoint, frontWall.rightPoint, ridgeRightPointV3);\r\n const overhangHeight1 = Math.min(\r\n ((frontWall.eavesLength ?? 0) / d1) * (ridgeRightPointV3.z - frontWallRh),\r\n frontWallRh,\r\n );\r\n\r\n const frontWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallLh - overhangHeight0)\r\n .sub(centroid);\r\n\r\n const frontWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n frontWallLeftPointAfterOffset,\r\n frontWallRightPointAfterOffset,\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n )\r\n .setZ(frontWallRh - overhangHeight1)\r\n .sub(centroid);\r\n\r\n frontPoints.push(\r\n frontWallLeftPointAfterOverhang,\r\n frontWallRightPointAfterOverhang,\r\n ridgeRightPointAfterOverhang,\r\n ridgeLeftPointAfterOverhang,\r\n );\r\n frontPoints.push(\r\n frontWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n frontWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n\r\n const frontWallCenter = new Vector3().addVectors(frontWall.leftPoint, frontWall.rightPoint).divideScalar(2);\r\n const frontLength = frontWallCenter.clone().sub(centroid.clone().setZ(0)).length();\r\n segments.push({ points: frontPoints, angle: -frontWall.relativeAngle, length: frontLength });\r\n\r\n // back\r\n const backPoints: Vector3[] = [];\r\n const { lh: backWallLh, rh: backWallRh } = getWallHeight(composedWalls, 2);\r\n const d2 = RoofUtil.getDistance(backWall.leftPoint, backWall.rightPoint, ridgeRightPointV3);\r\n const overhangHeight2 = Math.min(\r\n ((backWall.eavesLength ?? 0) / d2) * (ridgeRightPointV3.z - backWallLh),\r\n backWallLh,\r\n );\r\n\r\n const d3 = RoofUtil.getDistance(backWall.leftPoint, backWall.rightPoint, ridgeLeftPointV3);\r\n const overhangHeight3 = Math.min(\r\n ((backWall.eavesLength ?? 0) / d3) * (ridgeLeftPointV3.z - backWallRh),\r\n backWallRh,\r\n );\r\n\r\n const backWallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n rightWallLeftPointAfterOffset,\r\n rightWallRightPointAfterOffset,\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n )\r\n .setZ(backWallLh - overhangHeight2)\r\n .sub(centroid);\r\n\r\n const backWallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n backWallLeftPointAfterOffset,\r\n backWallRightPointAfterOffset,\r\n leftWallLeftPointAfterOffset,\r\n leftWallRightPointAfterOffset,\r\n )\r\n .setZ(backWallRh - overhangHeight3)\r\n .sub(centroid);\r\n\r\n backPoints.push(\r\n backWallLeftPointAfterOverhang,\r\n backWallRightPointAfterOverhang,\r\n ridgeLeftPointAfterOverhang,\r\n ridgeRightPointAfterOverhang,\r\n );\r\n backPoints.push(\r\n backWallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n backWallRightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeLeftPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeRightPointAfterOverhang.clone().add(thicknessVector),\r\n );\r\n\r\n const backWallCenter = new Vector3().addVectors(backWall.leftPoint, backWall.rightPoint).divideScalar(2);\r\n const backLength = backWallCenter.clone().sub(centroid.clone().setZ(0)).length();\r\n segments.push({ points: backPoints, angle: -backWall.relativeAngle, length: backLength });\r\n }\r\n return segments;\r\n }, [composedWalls, ridgeLeftPointV3, ridgeRightPointV3, topZ, thickness]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall) => wall.leftPoint);\r\n }, [composedWalls]);\r\n\r\n // handle remove roof\r\n useEffect(() => {\r\n if (!composedWalls || composedWalls.length !== 4) {\r\n removeElementById(id, false, false, true);\r\n }\r\n }, [composedWalls]);\r\n\r\n const isFirstRender = useIsFirstRender();\r\n\r\n // update walls when adding new roof\r\n useEffect(() => {\r\n if (composedWalls?.length !== 4) return;\r\n\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id) || !isFirstRender) {\r\n updateWalls(composedWalls, topZ, ridgeLeftPoint, ridgeRightPoint);\r\n updateRooftopElements(foundationModel, id, roofSegments, centroid, topZ, thickness);\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n }, [roofSegments]);\r\n\r\n useUpdateRooftopElementsByContextMenuChanges(foundationModel, id, roofSegments, centroid, topZ, thickness);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n if (!composedWalls || composedWalls.length !== 4) return;\r\n\r\n const segmentVertices: Vector3[][] = [];\r\n // shed roof\r\n if (isShed) {\r\n const idx = ridgeLeftPoint[0] < 0 ? 0 : 2;\r\n\r\n const shiftedWallArray = getShiftedArr(composedWalls, idx);\r\n\r\n const wallPoints = shiftedWallArray.map(\r\n (w, i, arr) => new Vector3(w.leftPoint.x, w.leftPoint.y, getWallHeight(arr, i).lh),\r\n );\r\n segmentVertices.push(wallPoints);\r\n }\r\n // gable roof\r\n else {\r\n const wallPoints = composedWalls.map(\r\n (w, i, arr) => new Vector3(w.leftPoint.x, w.leftPoint.y, getWallHeight(arr, i).lh),\r\n );\r\n segmentVertices.push([wallPoints[0], wallPoints[1], ridgeRightPointV3.clone(), ridgeLeftPointV3.clone()]);\r\n segmentVertices.push([wallPoints[2], wallPoints[3], ridgeLeftPointV3.clone(), ridgeRightPointV3.clone()]);\r\n }\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n };\r\n\r\n useUpdateSegmentVerticesMap(id, centroid, roofSegments, false, RoofType.Gable);\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const selectMe = useStore(Selector.selectMe);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n const n = roofSegments.length;\r\n if (n > 0) {\r\n const textures = [];\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const userData = useUserData(id, foundationModel, centroid, roofSegments);\r\n\r\n if (composedWalls === null || composedWalls.length !== 4) return null;\r\n\r\n return (\r\n \r\n {/* roof segments group */}\r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, centroid);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {roofSegments.map((segment, i, arr) => {\r\n const { points, angle, length } = segment;\r\n const isFlat = Math.abs(points[0].z) < 0.1;\r\n if (!composedWalls) return null;\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/* wireframe */}\r\n {opacity > 0 && (\r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && composedWalls[0].lz === composedWalls[2].lz && ceilingPoints && (\r\n \r\n )}\r\n\r\n {/* rafter */}\r\n {roofStructure === RoofStructure.Rafter && composedWalls && composedWalls.length === 4 && (\r\n {\r\n handleContextMenu(e, id);\r\n }}\r\n onPointerDown={(e) => {\r\n handleRoofBodyPointerDown(e, id, parentId);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n {/* mid handle */}\r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setShowIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeMidPoint.x, ridgeMidPoint.y, topZ);\r\n if (foundationModel) {\r\n const r =\r\n -Math.atan2(camera.position.x - foundationModel.cx, camera.position.y - foundationModel.cy) -\r\n foundationModel.rotation[2];\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Mid);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.Mid;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = ridgeMidPoint.x;\r\n state.selectedElementY = ridgeMidPoint.y;\r\n });\r\n }}\r\n />\r\n {/* side handles */}\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeLeft.current = ridgeLeftPoint[0];\r\n oldRidgeRight.current = ridgeRightPoint[0];\r\n setShowIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeLeftPointV3.x, ridgeLeftPointV3.y, topZ);\r\n if (foundationModel && composedWalls && composedWalls[3]) {\r\n const dir = new Vector3().subVectors(ridgeLeftPointV3, camera.position).normalize();\r\n const rX = Math.atan2(dir.z, Math.hypot(dir.x, dir.y));\r\n const rZ = composedWalls[3].relativeAngle;\r\n intersectionPlaneRotation.set(-HALF_PI + rX, 0, rZ, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Left);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n />\r\n {\r\n isPointerDownRef.current = true;\r\n oldRidgeLeft.current = ridgeLeftPoint[0];\r\n oldRidgeRight.current = ridgeRightPoint[0];\r\n setShowIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeRightPointV3.x, ridgeRightPointV3.y, topZ);\r\n if (foundationModel && composedWalls && composedWalls[1]) {\r\n const dir = new Vector3().subVectors(ridgeRightPointV3, camera.position).normalize();\r\n const rX = Math.atan2(dir.z, Math.hypot(dir.x, dir.y));\r\n const rZ = composedWalls[1].relativeAngle;\r\n intersectionPlaneRotation.set(-HALF_PI + rX, 0, rZ, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Right);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n {\r\n if (\r\n intersectionPlaneRef.current &&\r\n isPointerDownRef.current &&\r\n foundationModel &&\r\n composedWalls &&\r\n composedWalls.length === 4\r\n ) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0]) {\r\n const point = intersects[0].point;\r\n if (point.z < 0.001) {\r\n return;\r\n }\r\n switch (roofHandleType) {\r\n case RoofHandleType.Left: {\r\n const wall = composedWalls[3];\r\n if (wall) {\r\n let x = getRelPos(foundationModel, wall, point);\r\n if (Math.abs(x) >= 0.45 && Math.abs(x) < 0.5) {\r\n x = 0.45 * Math.sign(x);\r\n }\r\n const newRidgeLeftPoint = [x, ridgeLeftPoint[1]];\r\n const newRidgeRightPoint = [-x, ridgeRightPoint[1]];\r\n const gabledWallsHeightsMap = getGabledWallsHeightsMap(\r\n composedWalls,\r\n topZ,\r\n newRidgeLeftPoint,\r\n newRidgeRightPoint,\r\n );\r\n if (isRoofValid(gabledWallsHeightsMap, parentId)) {\r\n updateRoofTopRidge(id, x, -x);\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.Right: {\r\n const wall = composedWalls[1];\r\n if (wall) {\r\n let x = getRelPos(foundationModel, wall, point);\r\n if (Math.abs(x) >= 0.45 && Math.abs(x) < 0.5) {\r\n x = 0.45 * Math.sign(x);\r\n }\r\n const newRidgeLeftPoint = [-x, ridgeLeftPoint[1]];\r\n const newRidgeRightPoint = [x, ridgeRightPoint[1]];\r\n const gabledWallsHeightsMap = getGabledWallsHeightsMap(\r\n composedWalls,\r\n topZ,\r\n newRidgeLeftPoint,\r\n newRidgeRightPoint,\r\n );\r\n if (isRoofValid(gabledWallsHeightsMap, parentId)) {\r\n updateRoofTopRidge(id, -x, x);\r\n }\r\n }\r\n break;\r\n }\r\n case RoofHandleType.Mid: {\r\n let newRise: number;\r\n if (isShed) {\r\n newRise = Math.max(0, point.z - foundationModel.lz - 0.3 - highestWallHeight);\r\n } else {\r\n newRise = point.z - foundationModel.lz - 0.3 - highestWallHeight;\r\n }\r\n const newTopZ = highestWallHeight + newRise;\r\n const gabledWallsHeightsMap = getGabledWallsHeightsMap(\r\n composedWalls,\r\n newTopZ,\r\n ridgeLeftPoint,\r\n ridgeRightPoint,\r\n );\r\n if (isRoofValid(gabledWallsHeightsMap, parentId)) {\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, topZ + roofModel.thickness);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n onPointerUp={() => {\r\n switch (roofHandleType) {\r\n case RoofHandleType.Mid: {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n break;\r\n }\r\n case RoofHandleType.Left:\r\n case RoofHandleType.Right: {\r\n handleUndoableResizeTopRidge(\r\n id,\r\n oldRidgeLeft.current,\r\n oldRidgeRight.current,\r\n ridgeLeftPoint[0],\r\n ridgeRightPoint[0],\r\n );\r\n }\r\n }\r\n isPointerDownRef.current = false;\r\n setShowIntersectionPlane(false);\r\n setRoofHandleType(RoofHandleType.Null);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst RoofSegment = ({\r\n index,\r\n id,\r\n points,\r\n centroid,\r\n angle,\r\n length,\r\n textureType,\r\n heatmaps,\r\n color = 'white',\r\n sideColor,\r\n relativeAngle,\r\n foundation,\r\n roofStructure,\r\n glassTint,\r\n opacity = 0.5,\r\n windows,\r\n}: {\r\n index: number;\r\n id: string;\r\n points: Vector3[];\r\n centroid: Vector3;\r\n angle: number;\r\n length: number;\r\n textureType: RoofTexture;\r\n heatmaps: CanvasTexture[];\r\n color: string | undefined;\r\n sideColor: string | undefined;\r\n relativeAngle: number;\r\n foundation: FoundationModel | null;\r\n roofStructure?: RoofStructure;\r\n glassTint?: string;\r\n opacity?: number;\r\n windows: WindowModel[];\r\n}) => {\r\n const world = useStore.getState().world;\r\n const getElementById = useStore(Selector.getElementById);\r\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\r\n const hourlyHeatExchangeArrayMap = useDataStore.getState().hourlyHeatExchangeArrayMap;\r\n\r\n const texture = useRoofTexture(roofStructure === RoofStructure.Rafter ? RoofTexture.NoTexture : textureType);\r\n const { transparent, opacity: _opacity } = useTransparent(roofStructure === RoofStructure.Rafter, opacity);\r\n const { invalidate } = useThree();\r\n\r\n const heatmapMeshRef = useRef(null);\r\n const bulkMeshRef = useRef(null);\r\n const planeRef = useRef(null);\r\n const mullionRef = useRef(null);\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowLength = useRef();\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const [mullionLx, setMullionLx] = useState(0);\r\n const [mullionLz, setMullionLz] = useState(0);\r\n const [show, setShow] = useState(true);\r\n\r\n const checkValid = (v1: Vector3, v2: Vector3) => {\r\n return v1.clone().setZ(0).distanceTo(v2.clone().setZ(0)) > 2;\r\n };\r\n\r\n const isNorthWest = (relativeAngle: number) => {\r\n return (\r\n Math.abs(relativeAngle) < Math.PI / 4 ||\r\n Math.abs(relativeAngle - Math.PI * 2) < Math.PI / 4 ||\r\n Math.abs(relativeAngle - Math.PI) < Math.PI / 4\r\n );\r\n };\r\n\r\n const overhangLines: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments) return undefined;\r\n const lines: Vector3[][] = [];\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft, wallLeftAfterOverhang] = points;\r\n const thickness = wallLeftAfterOverhang.z - wallLeft.z;\r\n const thicknessVector = new Vector3(0, 0, thickness + 0.1);\r\n for (const seg of segments.values()) {\r\n let p: Vector3[] = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n p = [];\r\n p.push(seg[0].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[3].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n p = [];\r\n p.push(seg[1].clone().sub(centroid).add(thicknessVector));\r\n p.push(seg[2].clone().sub(centroid).add(thicknessVector));\r\n lines.push(p);\r\n }\r\n return lines;\r\n }, [showHeatFluxes]);\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (foundation && foundation.notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id + '-' + index);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments || !segments[index]) return undefined;\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft, wallLeftAfterOverhang] = points;\r\n const thickness = wallLeftAfterOverhang.z - wallLeft.z;\r\n const s = segments[index].map((v) => v.clone().sub(centroid).add(new Vector3(0, 0, thickness)));\r\n if (!s) return undefined;\r\n let area = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\r\n if (area === 0) return undefined;\r\n let windows = getChildrenOfType(ObjectType.Window, id);\r\n const segmentsWithoutOverhang = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (segmentsWithoutOverhang && segmentsWithoutOverhang[index]) {\r\n windows = windows.filter((e) => {\r\n const w = e as WindowModel;\r\n const wcy = w.cy + (w.windowType === WindowType.Polygonal && w.polygonTop ? w.polygonTop[1] / 2 : 0);\r\n return RoofUtil.onSegment(segmentsWithoutOverhang[index], e.cx, wcy);\r\n });\r\n }\r\n if (windows && windows.length > 0) {\r\n for (const w of windows) {\r\n area -= Util.getWindowArea(w as WindowModel);\r\n }\r\n }\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const s0 = s[0].clone();\r\n const s1 = s[1].clone();\r\n const s2 = s[2].clone();\r\n const v10 = new Vector3().subVectors(s1, s0);\r\n const v20 = new Vector3().subVectors(s2, s0);\r\n const v21 = new Vector3().subVectors(s2, s1);\r\n const length10 = v10.length();\r\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\r\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\r\n const m = Math.max(2, Math.round(length10 / cellSize));\r\n const n = Math.max(2, Math.round(distance / cellSize));\r\n v10.normalize();\r\n v20.normalize();\r\n v21.normalize();\r\n // find the normal vector of the quad\r\n const normal = new Vector3().crossVectors(v20, v21).normalize();\r\n // find the incremental vector going along the bottom edge (half of length)\r\n const dm = v10.multiplyScalar((0.5 * length10) / m);\r\n // find the incremental vector going from bottom to top (half of length)\r\n const dn = new Vector3()\r\n .crossVectors(normal, v10)\r\n .normalize()\r\n .multiplyScalar((0.5 * distance) / n);\r\n // find the starting point of the grid (shift half of length in both directions)\r\n const v0 = s0.clone().add(dm).add(dn);\r\n // double half-length to full-length for the increment vectors in both directions\r\n dm.multiplyScalar(2);\r\n dn.multiplyScalar(2);\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowLength.current = normal.clone().multiplyScalar(0.1);\r\n heatFluxArrowEuler.current = Util.getEuler(UNIT_VECTOR_POS_Z, normal, 'YXZ', -Math.sign(intensity) * HALF_PI);\r\n const vectors: Vector3[][] = [];\r\n const origin = new Vector3();\r\n let isRoof;\r\n for (let p = 0; p < m; p++) {\r\n const dmp = dm.clone().multiplyScalar(p);\r\n for (let q = 0; q < n; q++) {\r\n origin.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\r\n isRoof = true;\r\n if (windows && windows.length > 0) {\r\n // add the centroid back as the vertices of the window are not relative to it\r\n const ox = origin.x + centroid.x;\r\n const oy = origin.y + centroid.y;\r\n for (const w of windows) {\r\n const vertices = RoofUtil.getRelativeWindowVerticesOnRoof(w as WindowModel);\r\n const points = Util.getPoints(vertices);\r\n if (Util.isPointInside(ox, oy, points)) {\r\n isRoof = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (isRoof) {\r\n const v: Vector3[] = [];\r\n if (intensity < 0) {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(-intensity)));\r\n } else {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(intensity)));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [showHeatFluxes, heatFluxScaleFactor, centroid, points]);\r\n\r\n useEffect(() => {\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft, wallLeftAfterOverhang] = points;\r\n const thickness = wallLeftAfterOverhang.z - wallLeft.z;\r\n\r\n if (heatmapMeshRef.current) {\r\n const geo = heatmapMeshRef.current.geometry;\r\n if (geo) {\r\n const positions = new Float32Array(18);\r\n const zOffset = thickness + 0.01; // a small number to ensure the surface mesh stay atop;\r\n positions[0] = points[0].x;\r\n positions[1] = points[0].y;\r\n positions[2] = points[0].z + zOffset;\r\n positions[3] = points[1].x;\r\n positions[4] = points[1].y;\r\n positions[5] = points[1].z + zOffset;\r\n positions[6] = points[2].x;\r\n positions[7] = points[2].y;\r\n positions[8] = points[2].z + zOffset;\r\n positions[9] = points[2].x;\r\n positions[10] = points[2].y;\r\n positions[11] = points[2].z + zOffset;\r\n positions[12] = points[3].x;\r\n positions[13] = points[3].y;\r\n positions[14] = points[3].z + zOffset;\r\n positions[15] = points[0].x;\r\n positions[16] = points[0].y;\r\n positions[17] = points[0].z + zOffset;\r\n // don't call geo.setFromPoints. It doesn't seem to work correctly.\r\n geo.setAttribute('position', new Float32BufferAttribute(positions, 3));\r\n geo.computeVertexNormals();\r\n const uvs = [];\r\n uvs.push(0, 0);\r\n uvs.push(1, 0);\r\n uvs.push(1, 1);\r\n uvs.push(1, 1);\r\n uvs.push(0, 1);\r\n uvs.push(0, 0);\r\n geo.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\r\n }\r\n }\r\n\r\n if (bulkMeshRef.current) {\r\n bulkMeshRef.current.geometry = new ConvexGeometry(points, angle, length);\r\n const isValid = checkValid(wallLeft, ridgeLeft) && checkValid(wallRight, ridgeRight);\r\n setShow(isValid);\r\n\r\n if (roofStructure === RoofStructure.Glass && isValid) {\r\n const center = Util.calculatePolygonCentroid(points.map(Util.mapVector3ToPoint2));\r\n const centerV3 = new Vector3(center.x, center.y, 0);\r\n\r\n const width = 0.25;\r\n const wl = new Vector3().addVectors(\r\n wallLeft,\r\n centerV3.clone().sub(wallLeft).setZ(0).normalize().multiplyScalar(width),\r\n );\r\n const wr = new Vector3().addVectors(\r\n wallRight,\r\n centerV3.clone().sub(wallRight).setZ(0).normalize().multiplyScalar(width),\r\n );\r\n const rr = new Vector3().addVectors(\r\n ridgeRight,\r\n centerV3.clone().sub(ridgeRight).normalize().multiplyScalar(width),\r\n );\r\n const rl = new Vector3().addVectors(\r\n ridgeLeft,\r\n centerV3.clone().sub(ridgeLeft).normalize().multiplyScalar(width),\r\n );\r\n\r\n const h: Vector3[] = [];\r\n h.push(wl);\r\n h.push(wr);\r\n h.push(rr.setZ(wr.z));\r\n h.push(rl.setZ(wl.z));\r\n h.push(wl.clone().setZ(1));\r\n h.push(wr.clone().setZ(1));\r\n h.push(rr.clone().setZ(1));\r\n h.push(rl.clone().setZ(1));\r\n\r\n const holeMesh = new Mesh(new ConvexGeometry(h));\r\n const resMesh = CSG.subtract(bulkMeshRef.current, holeMesh);\r\n bulkMeshRef.current.geometry = resMesh.geometry;\r\n\r\n if (isNorthWest(relativeAngle)) {\r\n const lx = wl.distanceTo(wr);\r\n const ly = wallLeft.distanceTo(ridgeLeft);\r\n\r\n setMullionLx(lx);\r\n setMullionLz(ly);\r\n\r\n const rotationX = new Vector3().subVectors(wallLeft, ridgeLeft).angleTo(new Vector3(0, -1, 0));\r\n if (planeRef.current) {\r\n planeRef.current.scale.set(lx, ly, 1);\r\n planeRef.current.rotation.set(rotationX, 0, 0);\r\n }\r\n if (mullionRef.current) {\r\n mullionRef.current.rotation.set(rotationX - HALF_PI, 0, 0);\r\n }\r\n } else {\r\n const lx = wallLeft.distanceTo(ridgeLeft);\r\n const ly = wl.distanceTo(wr);\r\n\r\n setMullionLx(lx);\r\n setMullionLz(ly);\r\n\r\n const rotationY = new Vector3().subVectors(wallLeft, ridgeLeft).angleTo(new Vector3(1, 0, 0));\r\n if (planeRef.current) {\r\n planeRef.current.scale.set(lx, ly, 1);\r\n planeRef.current.rotation.set(0, rotationY, 0);\r\n }\r\n if (mullionRef.current) {\r\n mullionRef.current.rotation.set(HALF_PI, rotationY, 0, 'YXZ');\r\n }\r\n }\r\n\r\n const cz = (wallLeft.z + ridgeLeft.z) / 2 + thickness * 0.75;\r\n if (planeRef.current) {\r\n planeRef.current.position.set(center.x, center.y, cz);\r\n }\r\n if (mullionRef.current) {\r\n mullionRef.current.position.set(center.x, center.y, cz);\r\n }\r\n }\r\n }\r\n invalidate();\r\n }, [points, angle, length, relativeAngle, show, showSolarRadiationHeatmap, roofStructure]);\r\n\r\n // FIXME: Bulk mesh can be null if it is not initialized. Refreshing the page fixes the problem.\r\n\r\n const segment = { points: points, angle: angle, length: length };\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n return (\r\n <>\r\n {((_opacity > 0 && roofStructure === RoofStructure.Rafter) || roofStructure !== RoofStructure.Rafter) && (\r\n <>\r\n \r\n \r\n )}\r\n {/* {roofStructure === RoofStructure.Glass && show && (\r\n <>\r\n {_opacity > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )} */}\r\n\r\n {overhangLines &&\r\n overhangLines.map((v, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {heatFluxes &&\r\n heatFluxes.map((v, index) => {\r\n return (\r\n \r\n \r\n ;\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(GableRoof, areRoofsEqual);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\nimport { Line, Plane } from '@react-three/drei';\r\nimport { useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { HALF_PI } from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { HipRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport { UndoableResizeHipRoofRidge } from 'src/undo/UndoableResize';\r\nimport { Util } from 'src/Util';\r\nimport { CanvasTexture, DoubleSide, Euler, Mesh, Raycaster, RepeatWrapping, Vector2, Vector3 } from 'three';\r\nimport {\r\n ComposedWall,\r\n useComposedWallArray,\r\n useComposedRoofHeight,\r\n useRoofTexture,\r\n useUpdateOldRoofFiles,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n useUpdateRooftopElements,\r\n useUserData,\r\n} from './hooks';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n areRoofsEqual,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n RoofHandle,\r\n RoofSegmentGroupUserData,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n} from './roofRenderer';\r\nimport RoofSegment from './roofSegment';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Ceiling from './ceiling';\r\nimport FlatRoof from './flatRoof';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport shallow from 'zustand/shallow';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst HipRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n if (roofSegments.length === 0) {\r\n return null;\r\n }\r\n const peripheryPoints: Vector3[] = [];\r\n const thicknessVector = new Vector3(0, 0, thickness);\r\n\r\n for (let i = 0; i < roofSegments.length; i++) {\r\n const [leftPoint, rightPoint] = roofSegments[i].points;\r\n peripheryPoints.push(leftPoint);\r\n if (i === roofSegments.length - 1) {\r\n peripheryPoints.push(rightPoint);\r\n }\r\n }\r\n\r\n const isFlat = Math.abs(roofSegments[0].points[0].z) < 0.015;\r\n const leftRidge = roofSegments[0].points[3].clone().add(thicknessVector);\r\n const rightRidge = roofSegments[0].points[2].clone().add(thicknessVector);\r\n const periphery = ;\r\n\r\n return (\r\n <>\r\n {periphery}\r\n {!isFlat && }\r\n \r\n {periphery}\r\n {roofSegments.map((segment, idx) => {\r\n const [leftRoof, rightRoof, rightRidge, leftRidge] = segment.points;\r\n const points = [leftRoof.clone().sub(thicknessVector), leftRoof];\r\n return ;\r\n })}\r\n \r\n \r\n );\r\n});\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\ninterface HipRoofProps extends BuildingParts {\r\n roofModel: HipRoofModel;\r\n}\r\n\r\nconst HipRoof = ({ roofModel, foundationModel }: HipRoofProps) => {\r\n let {\r\n id,\r\n parentId,\r\n cx,\r\n cy,\r\n lz,\r\n wallsId,\r\n leftRidgeLength,\r\n rightRidgeLength,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n thickness = 0.2,\r\n locked,\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n roofType,\r\n rise = lz,\r\n ceiling = false,\r\n } = roofModel;\r\n\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const composedWalls = useComposedWallArray(wallsId[0], parentId);\r\n const texture = useRoofTexture(textureType);\r\n\r\n const selected = useSelected(id);\r\n\r\n const [enableIntersectionPlane, setEnableIntersectionPlane] = useState(false);\r\n const [roofHandleType, setRoofHandleType] = useState(RoofHandleType.Null);\r\n const [leftRidgeLengthCurr, setLeftRidgeLengthCurr] = useState(leftRidgeLength);\r\n const [rightRidgeLengthCurr, setRightRidgeLengthCurr] = useState(rightRidgeLength);\r\n\r\n const { highestWallHeight, topZ } = useComposedRoofHeight(composedWalls, rise);\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const { gl, camera } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const isPointerDownRef = useRef(false);\r\n const oldRiseRef = useRef(rise);\r\n\r\n const isFlat = rise < 0.01;\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n useEffect(() => {\r\n setLeftRidgeLengthCurr(leftRidgeLength);\r\n }, [leftRidgeLength]);\r\n\r\n useEffect(() => {\r\n setRightRidgeLengthCurr(rightRidgeLength);\r\n }, [rightRidgeLength]);\r\n\r\n const setHipRoofRidgeLength = (elemId: string, leftRidge: number, rightRidge: number, manualUpdate = false) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Hip) {\r\n (e as HipRoofModel).leftRidgeLength = leftRidge;\r\n (e as HipRoofModel).rightRidgeLength = rightRidge;\r\n if (manualUpdate) {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleUndoableResizeRidgeLength = (\r\n elemId: string,\r\n oldLeft: number,\r\n oldRight: number,\r\n newLeft: number,\r\n newRight: number,\r\n ) => {\r\n const undoable = {\r\n name: 'Resize Hip Roof Ridge',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldLeftRidgeLength: oldLeft,\r\n oldRightRidgeLength: oldRight,\r\n newLeftRidgeLength: newLeft,\r\n newRightRidgeLength: newRight,\r\n undo: () => {\r\n setHipRoofRidgeLength(\r\n undoable.resizedElementId,\r\n undoable.oldLeftRidgeLength,\r\n undoable.oldRightRidgeLength,\r\n true,\r\n );\r\n },\r\n redo: () => {\r\n setHipRoofRidgeLength(\r\n undoable.resizedElementId,\r\n undoable.newLeftRidgeLength,\r\n undoable.newRightRidgeLength,\r\n true,\r\n );\r\n },\r\n } as UndoableResizeHipRoofRidge;\r\n useStore.getState().addUndoable(undoable);\r\n };\r\n\r\n const getWallsPoint2 = (wallArray: ComposedWall[]) => {\r\n const arr: Point2[] = [];\r\n for (const w of wallArray) {\r\n arr.push({ x: w.leftPoint.x, y: w.leftPoint.y });\r\n }\r\n return arr;\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const makeSegment = (vector: Vector3[], p1: Vector3, p2: Vector3, p3: Vector3, p4?: Vector3) => {\r\n vector.push(p1, p2, p3);\r\n if (p4) {\r\n vector.push(p4);\r\n }\r\n vector.push(p1.clone().add(thicknessVector), p2.clone().add(thicknessVector), p3.clone().add(thicknessVector));\r\n if (p4) {\r\n vector.push(p4.clone().add(thicknessVector));\r\n }\r\n };\r\n\r\n const getOverhangHeight = () => {\r\n if (composedWalls === null || composedWalls.length !== 4) return 0;\r\n\r\n const wallPoints = composedWalls.map((w) => w.leftPoint);\r\n const ridges = [ridgeLeftPoint, ridgeRightPoint, ridgeRightPoint, ridgeLeftPoint];\r\n\r\n let height = Infinity;\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const w = composedWalls[i];\r\n const dLeft = RoofUtil.getDistance(wallPoints[i], wallPoints[(i + 1) % 4], ridges[i]);\r\n const overhangHeightLeft = Math.min(((w.eavesLength ?? 0) / dLeft) * (ridges[i].z - w.lz), w.lz);\r\n const dRight = RoofUtil.getDistance(wallPoints[i], wallPoints[(i + 1) % 4], ridges[(i + 1) % 4]);\r\n const overhangHeightRight = Math.min(((w.eavesLength ?? 0) / dRight) * (ridges[(i + 1) % 4].z - w.lz), w.lz);\r\n height = Math.min(Math.min(overhangHeightLeft, overhangHeightRight), height);\r\n }\r\n\r\n return Number.isNaN(height) ? 0 : height;\r\n };\r\n\r\n const centroid2D = useMemo(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) return new Vector2();\r\n\r\n const points = getWallsPoint2(composedWalls);\r\n const p = Util.calculatePolygonCentroid(points);\r\n return new Vector2(p.x, p.y);\r\n }, [composedWalls]);\r\n\r\n const ridgeLeftPoint = useMemo(() => {\r\n const vector = new Vector3();\r\n const center = new Vector3(centroid2D.x, centroid2D.y, topZ);\r\n const wall = getElementById(wallsId[0]) as WallModel;\r\n if (wall) {\r\n vector.setX(-leftRidgeLengthCurr).applyEuler(new Euler(0, 0, wall.relativeAngle)).add(center);\r\n }\r\n return vector;\r\n }, [centroid2D, topZ, leftRidgeLengthCurr]);\r\n\r\n const ridgeRightPoint = useMemo(() => {\r\n const vector = new Vector3();\r\n const center = new Vector3(centroid2D.x, centroid2D.y, topZ);\r\n const wall = getElementById(wallsId[0]) as WallModel;\r\n if (wall) {\r\n vector.setX(rightRidgeLengthCurr).applyEuler(new Euler(0, 0, wall.relativeAngle)).add(center);\r\n }\r\n return vector;\r\n }, [centroid2D, topZ, rightRidgeLengthCurr]);\r\n\r\n const ridgeMidPoint = useMemo(() => {\r\n return new Vector3(centroid2D.x, centroid2D.y, topZ);\r\n }, [centroid2D, topZ]);\r\n\r\n const overhangs = useMemo(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) return [] as Vector3[];\r\n return composedWalls.map((wall) => RoofUtil.getComposedWallNormal(wall).multiplyScalar(wall.eavesLength));\r\n }, [composedWalls]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const wallPointsAfterOffset = useMemo(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall, idx) => ({\r\n leftPoint: wall.leftPoint.clone().add(overhangs[idx]),\r\n rightPoint: wall.rightPoint.clone().add(overhangs[idx]),\r\n }));\r\n }, [composedWalls, overhangs]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n if (composedWalls === null || composedWalls.length !== 4 || wallPointsAfterOffset === null) return segments;\r\n\r\n const overhangHeight = getOverhangHeight();\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const points: Vector3[] = [];\r\n const wall = composedWalls[i];\r\n const { lh, rh } = RoofUtil.getComposedWallHeight(composedWalls, i);\r\n\r\n const wallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[(i + 3) % 4].leftPoint,\r\n wallPointsAfterOffset[(i + 3) % 4].rightPoint,\r\n wallPointsAfterOffset[i].leftPoint,\r\n wallPointsAfterOffset[i].rightPoint,\r\n )\r\n .setZ(lh - overhangHeight)\r\n .sub(ridgeMidPoint);\r\n\r\n const wallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOffset[i].leftPoint,\r\n wallPointsAfterOffset[i].rightPoint,\r\n wallPointsAfterOffset[(i + 1) % 4].leftPoint,\r\n wallPointsAfterOffset[(i + 1) % 4].rightPoint,\r\n )\r\n .setZ(rh - overhangHeight)\r\n .sub(ridgeMidPoint);\r\n\r\n const wallCenter = new Vector3().addVectors(wall.leftPoint, wall.rightPoint).divideScalar(2);\r\n const ridgeLeft = ridgeLeftPoint.clone().sub(ridgeMidPoint);\r\n const ridgeRight = ridgeRightPoint.clone().sub(ridgeMidPoint);\r\n let length = 0;\r\n switch (i) {\r\n case 0:\r\n length = wallCenter.clone().sub(ridgeMidPoint.clone().setZ(0)).length();\r\n makeSegment(points, wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeRight, ridgeLeft);\r\n break;\r\n case 1:\r\n length = wallCenter.clone().sub(ridgeRightPoint.clone().setZ(0)).length();\r\n makeSegment(points, wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeRight);\r\n break;\r\n case 2:\r\n length = wallCenter.clone().sub(ridgeMidPoint.clone().setZ(0)).length();\r\n makeSegment(points, wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeLeft, ridgeRight);\r\n break;\r\n case 3:\r\n length = wallCenter.clone().sub(ridgeLeftPoint.clone().setZ(0)).length();\r\n makeSegment(points, wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeLeft);\r\n break;\r\n }\r\n segments.push({ points, angle: -wall.relativeAngle, length });\r\n }\r\n return segments;\r\n }, [composedWalls, ridgeLeftPoint, ridgeRightPoint, topZ, thickness]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n if (!composedWalls || composedWalls.length !== 4) return null;\r\n return composedWalls.map((wall) => wall.leftPoint);\r\n }, [composedWalls]);\r\n\r\n // update related walls roofId when adding new roof\r\n useEffect(() => {\r\n if (composedWalls === null || composedWalls.length !== 4) {\r\n removeElementById(id, false, false, true);\r\n } else {\r\n const addedRoofIdSet = useStore.getState().addedRoofIdSet;\r\n if (addedRoofIdSet.has(id)) {\r\n for (let i = 0; i < composedWalls.length; i++) {\r\n const wallsIdSet = new Set(composedWalls[i].wallsId);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && wallsIdSet.has(e.id)) {\r\n const wall = e as WallModel;\r\n wall.roofId = id;\r\n // some old files set wall's roof height, which should not\r\n wall.leftRoofHeight = undefined;\r\n wall.rightRoofHeight = undefined;\r\n }\r\n }\r\n });\r\n }\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n }\r\n }, [composedWalls]);\r\n\r\n useUpdateRooftopElements(foundationModel, id, roofSegments, ridgeMidPoint, topZ, thickness);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n if (!composedWalls) return;\r\n\r\n const segmentVertices: Vector3[][] = [];\r\n for (let i = 0; i < 4; i++) {\r\n const wall = composedWalls[i];\r\n const { lh, rh } = RoofUtil.getComposedWallHeight(composedWalls, i);\r\n\r\n const wallLeftPoint = wall.leftPoint.clone().setZ(lh);\r\n const wallRightPoint = wall.rightPoint.clone().setZ(rh);\r\n const ridgeLPoint = ridgeLeftPoint.clone();\r\n const ridgeRPoint = ridgeRightPoint.clone();\r\n\r\n switch (i) {\r\n case 0:\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeRPoint, ridgeLPoint]);\r\n break;\r\n case 1:\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeRPoint]);\r\n break;\r\n case 2:\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeLPoint, ridgeRPoint]);\r\n break;\r\n case 3:\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeLPoint]);\r\n break;\r\n }\r\n }\r\n if (isFlat) {\r\n const seg: Vector3[] = [];\r\n for (const segment of segmentVertices) {\r\n seg.push(segment[0].clone());\r\n }\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, [seg]);\r\n } else {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n }\r\n };\r\n\r\n const updateSegmentVertices = useUpdateSegmentVerticesMap(\r\n id,\r\n new Vector3(centroid2D.x, centroid2D.y, topZ),\r\n roofSegments,\r\n isFlat,\r\n RoofType.Hip,\r\n );\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const selectMe = useStore(Selector.selectMe);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [flatHeatmapTexture, setFlatHeatmapTexture] = useState(null);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n if (rise > 0) {\r\n const n = roofSegments.length;\r\n if (n > 0) {\r\n const textures = [];\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n } else {\r\n // flat roof\r\n const heatmap = getHeatmap(id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n // obtain the bounding rectangle\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices && segmentVertices.length > 0 && foundationModel) {\r\n const euler = new Euler(0, 0, foundationModel.rotation[2], 'ZYX');\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const s of segmentVertices) {\r\n for (const v of s) {\r\n const v2 = v.clone().applyEuler(euler);\r\n if (v2.x > maxX) maxX = v2.x;\r\n if (v2.x < minX) minX = v2.x;\r\n if (v2.y > maxY) maxY = v2.y;\r\n if (v2.y < minY) minY = v2.y;\r\n }\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n const vcx = (minX + maxX) / 2;\r\n const vcy = (minY + maxY) / 2;\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n t.offset.set(-minX / dx, -minY / dy);\r\n t.center.set(vcx / dx, vcy / dy);\r\n t.rotation = -foundationModel.rotation[2];\r\n t.repeat.set(1 / dx, 1 / dy);\r\n }\r\n setFlatHeatmapTexture(t);\r\n }\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const userData = useUserData(id, foundationModel, ridgeMidPoint, roofSegments);\r\n\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n if (composedWalls === null || composedWalls.length !== 4) return null;\r\n\r\n return (\r\n \r\n {/* roof segment group */}\r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, ridgeMidPoint);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {isFlat ? (\r\n \r\n ) : (\r\n <>\r\n {roofSegments.map((segment, index, arr) => {\r\n return (\r\n // Roof segment idx is important for calculate normal\r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && ceilingPoints && }\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n {/* left handle */}\r\n {\r\n isPointerDownRef.current = true;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeLeftPoint.x, ridgeLeftPoint.y, topZ);\r\n if (foundationModel && composedWalls[0]) {\r\n const dir = useStore.getState().cameraDirection;\r\n const rX = Math.atan2(dir.z, dir.y);\r\n const rZ = composedWalls[0].relativeAngle;\r\n intersectionPlaneRotation.set(-HALF_PI - rX, 0, rZ, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Left);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n />\r\n {/* mid handle */}\r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeMidPoint.x, ridgeMidPoint.y, topZ);\r\n if (foundationModel) {\r\n const r = -Math.atan2(camera.position.x - cx, camera.position.y - cy) - foundationModel.rotation[2];\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Mid);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.Mid;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = centroid2D.x;\r\n state.selectedElementY = centroid2D.y;\r\n });\r\n }}\r\n />\r\n {/* right handle */}\r\n {\r\n isPointerDownRef.current = true;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(ridgeRightPoint.x, ridgeRightPoint.y, topZ);\r\n if (foundationModel && composedWalls[0]) {\r\n const dir = useStore.getState().cameraDirection;\r\n const rX = Math.atan2(dir.z, dir.y);\r\n const rZ = composedWalls[0].relativeAngle;\r\n intersectionPlaneRotation.set(-HALF_PI - rX, 0, rZ, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Right);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {enableIntersectionPlane && (\r\n {\r\n if (intersectionPlaneRef.current && isPointerDownRef.current) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0] && foundationModel) {\r\n const point = intersects[0].point;\r\n if (point.z < 0.001) {\r\n return;\r\n }\r\n const composedWall = composedWalls[0];\r\n const length = new Vector3().subVectors(composedWall.rightPoint, composedWall.leftPoint).length();\r\n switch (roofHandleType) {\r\n case RoofHandleType.Left: {\r\n const midPointVector = ridgeMidPoint\r\n .clone()\r\n .sub(intersectionPlanePosition)\r\n .applyEuler(new Euler(0, 0, -intersectionPlaneRotation.z));\r\n\r\n const p = point\r\n .clone()\r\n .sub(new Vector3(foundationModel.cx, foundationModel.cy, foundationModel.cz))\r\n .applyEuler(new Euler(0, 0, -foundationModel.rotation[2]))\r\n .sub(intersectionPlanePosition)\r\n .applyEuler(new Euler(0, 0, -intersectionPlaneRotation.z));\r\n\r\n const d = new Vector3().subVectors(p, midPointVector).x;\r\n setLeftRidgeLengthCurr(Util.clamp(-d, -rightRidgeLengthCurr + 0.1, length / 2 - 0.01));\r\n break;\r\n }\r\n case RoofHandleType.Right: {\r\n const midPointVector = ridgeMidPoint\r\n .clone()\r\n .sub(intersectionPlanePosition)\r\n .applyEuler(new Euler(0, 0, -intersectionPlaneRotation.z));\r\n\r\n const p = point\r\n .clone()\r\n .sub(new Vector3(foundationModel.cx, foundationModel.cy, foundationModel.cz))\r\n .applyEuler(new Euler(0, 0, -foundationModel.rotation[2]))\r\n .sub(intersectionPlanePosition)\r\n .applyEuler(new Euler(0, 0, -intersectionPlaneRotation.z));\r\n\r\n const d = new Vector3().subVectors(p, midPointVector).x;\r\n\r\n setRightRidgeLengthCurr(Util.clamp(d, -leftRidgeLengthCurr + 0.1, length / 2 - 0.01));\r\n break;\r\n }\r\n case RoofHandleType.Mid: {\r\n const newRise = Math.max(0, point.z - foundationModel.lz - 0.3 - highestWallHeight);\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, topZ + roofModel.thickness);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n onPointerUp={() => {\r\n switch (roofHandleType) {\r\n case RoofHandleType.Mid: {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n break;\r\n }\r\n case RoofHandleType.Left:\r\n case RoofHandleType.Right: {\r\n setHipRoofRidgeLength(id, leftRidgeLengthCurr, rightRidgeLengthCurr);\r\n handleUndoableResizeRidgeLength(\r\n id,\r\n leftRidgeLength,\r\n rightRidgeLength,\r\n leftRidgeLengthCurr,\r\n rightRidgeLengthCurr,\r\n );\r\n }\r\n }\r\n isPointerDownRef.current = false;\r\n setEnableIntersectionPlane(false);\r\n setRoofHandleType(RoofHandleType.Null);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(HipRoof, areRoofsEqual);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Cone, Line, Plane } from '@react-three/drei';\r\nimport { useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n HALF_PI_Z_EULER,\r\n TWO_PI,\r\n} from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { MansardRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ActionType, ObjectType, ResizeHandleType, RoofHandleType, RoofTexture } from 'src/types';\r\nimport { UnoableResizeMansardRoofRidge } from 'src/undo/UndoableResize';\r\nimport { Util } from 'src/Util';\r\nimport {\r\n BoxBufferGeometry,\r\n CanvasTexture,\r\n DoubleSide,\r\n Euler,\r\n Float32BufferAttribute,\r\n Mesh,\r\n RepeatWrapping,\r\n Shape,\r\n Vector3,\r\n} from 'three';\r\nimport {\r\n useMultiCurrWallArray,\r\n useRoofHeight,\r\n useRoofTexture,\r\n useTransparent,\r\n useUpdateOldRoofFiles,\r\n useUpdateRooftopElements,\r\n useUpdateSegmentVerticesMap,\r\n useUpdateSegmentVerticesWithoutOverhangMap,\r\n useUserData,\r\n} from './hooks';\r\nimport {\r\n addUndoableResizeRoofRise,\r\n areRoofsEqual,\r\n handleContextMenu,\r\n handlePointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n RoofHandle,\r\n RoofSegmentGroupUserData,\r\n RoofSegmentProps,\r\n RoofWireframeProps,\r\n} from './roofRenderer';\r\nimport RoofSegment from './roofSegment';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Ceiling from './ceiling';\r\nimport FlatRoof, { TopExtrude } from './flatRoof';\r\nimport { BuildingParts, FoundationModel } from '../../models/FoundationModel';\r\nimport shallow from 'zustand/shallow';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst intersectionPlanePosition = new Vector3();\r\nconst intersectionPlaneRotation = new Euler();\r\nconst zVector3 = new Vector3(0, 0, 1);\r\n\r\nconst MansardRoofWireframe = React.memo(({ roofSegments, thickness, lineWidth, lineColor }: RoofWireframeProps) => {\r\n const wallPoints = useMemo(\r\n () => roofSegments.reduce((arr, segment) => arr.concat(segment.points[1]), [roofSegments[0].points[0]]),\r\n [roofSegments],\r\n );\r\n\r\n const ridgePoints = useMemo(\r\n () =>\r\n roofSegments.reduce((arr, segment) => arr.concat(segment.points[6].clone()), [roofSegments[0].points[7].clone()]),\r\n [roofSegments],\r\n );\r\n\r\n const wallLine = useMemo(\r\n () => ,\r\n [wallPoints, lineWidth, lineColor],\r\n );\r\n\r\n if (roofSegments.length < 2) {\r\n return null;\r\n }\r\n\r\n // segments array\r\n // [wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeRightPoint, ridgeLeftPoint,\r\n // wallLeftPointAfterOverhang.add(thicknessVector),\r\n // wallRightPointAfterOverhang.add(thicknessVector),\r\n // ridgeRightPoint.add(thicknessVector),\r\n // ridgeLeftPoint.add(thicknessVector)]\r\n\r\n const isFlat = Math.abs(roofSegments[0].points[0].z - roofSegments[0].points[3].z) < 0.1;\r\n\r\n return (\r\n <>\r\n {!isFlat && }\r\n {wallLine}\r\n {wallLine}\r\n {roofSegments.map((segment, idx) => {\r\n return (\r\n \r\n {!isFlat && (\r\n \r\n )}\r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n});\r\n\r\ninterface MansardRoofProps extends BuildingParts {\r\n roofModel: MansardRoofModel;\r\n}\r\n\r\nconst MansardRoof = ({ roofModel, foundationModel }: MansardRoofProps) => {\r\n let {\r\n id,\r\n wallsId,\r\n cx,\r\n cy,\r\n lz,\r\n textureType,\r\n color = 'white',\r\n sideColor = 'white',\r\n thickness = 0.2,\r\n locked,\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n roofType,\r\n foundationId,\r\n ridgeWidth = 1,\r\n rise = lz,\r\n ceiling = false,\r\n // old files data\r\n frontRidge,\r\n backRidge,\r\n } = roofModel;\r\n\r\n const texture = useRoofTexture(textureType);\r\n\r\n const selected = useSelected(id);\r\n\r\n [lineColor, lineWidth] = RoofUtil.getWireframetStyle(lineColor, lineWidth, selected, locked);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const ray = useStore((state) => state.ray);\r\n const mouse = useStore((state) => state.mouse);\r\n\r\n const [width, setWidth] = useState(ridgeWidth);\r\n const [maxWidth, setMaxWidth] = useState(null);\r\n const [enableIntersectionPlane, setEnableIntersectionPlane] = useState(false);\r\n const [roofHandleType, setRoofHandleType] = useState(RoofHandleType.Null);\r\n const [ridgeHandleIndex, setRidgeHandleIndex] = useState(null);\r\n\r\n const oldWidth = useRef(width);\r\n const oldRiseRef = useRef(rise);\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const isPointerDownRef = useRef(false);\r\n const { gl, camera } = useThree();\r\n\r\n const isFlat = rise < 0.01;\r\n\r\n const getWallPoint2 = (wallArray: WallModel[]) => {\r\n const arr: Point2[] = [];\r\n const length = wallArray.length;\r\n for (const w of wallArray) {\r\n if (w.leftPoint[0] !== undefined && w.leftPoint[1] !== undefined) {\r\n arr.push({ x: w.leftPoint[0], y: w.leftPoint[1] });\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n if (\r\n (wallArray[length - 1].rightPoint[0] || wallArray[length - 1].rightPoint[0] === 0) &&\r\n (wallArray[length - 1].rightPoint[1] || wallArray[length - 1].rightPoint[1] === 0)\r\n ) {\r\n arr.push({ x: wallArray[length - 1].rightPoint[0], y: wallArray[length - 1].rightPoint[1] });\r\n }\r\n }\r\n return arr;\r\n };\r\n\r\n const getWallPointFromHandleIdx = (idx: number) => {\r\n if (idx < currentWallArray.length) {\r\n const wall = currentWallArray[idx];\r\n return new Vector3(wall.leftPoint[0], wall.leftPoint[1]);\r\n } else {\r\n const wall = currentWallArray[idx - 1];\r\n return new Vector3(wall.rightPoint[0], wall.rightPoint[1]);\r\n }\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const updateRidge = (elemId: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Mansard) {\r\n (e as MansardRoofModel).ridgeWidth = val;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const getOverhangHeight = () => {\r\n let height = Infinity;\r\n\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n const leftPoint = new Vector3(w.leftPoint[0], w.leftPoint[1]);\r\n const rightPoint = new Vector3(w.rightPoint[0], w.rightPoint[1]);\r\n // const { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n const dLeft = RoofUtil.getDistance(leftPoint, rightPoint, ridgePoints[i].leftPoint);\r\n const overhangHeightLeft = Math.min(((w.eavesLength ?? 0) / dLeft) * (ridgePoints[i].leftPoint.z - w.lz), w.lz);\r\n const dRight = RoofUtil.getDistance(leftPoint, rightPoint, ridgePoints[i].rightPoint);\r\n const overhangHeightRight = Math.min(\r\n ((w.eavesLength ?? 0) / dRight) * (ridgePoints[i].rightPoint.z - w.lz),\r\n w.lz,\r\n );\r\n height = Math.min(Math.min(overhangHeightLeft, overhangHeightRight), height);\r\n }\r\n\r\n return Number.isNaN(height) ? 0 : height;\r\n };\r\n\r\n const addUndoableResizeRidge = (elemId: string, type: RoofHandleType, oldVal: number, newVal: number) => {\r\n const undoable = {\r\n name: 'Resize Mansard Roof Ridge',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldVal: oldVal,\r\n newVal: newVal,\r\n type: type,\r\n undo: () => {\r\n updateRidge(undoable.resizedElementId, undoable.oldVal);\r\n },\r\n redo: () => {\r\n updateRidge(undoable.resizedElementId, undoable.newVal);\r\n },\r\n } as UnoableResizeMansardRoofRidge;\r\n useStore.getState().addUndoable(undoable);\r\n };\r\n const { currentWallArray, isLoopRef } = useMultiCurrWallArray(foundationId, id, wallsId);\r\n\r\n const { highestWallHeight, topZ } = useRoofHeight(currentWallArray, rise);\r\n useUpdateOldRoofFiles(roofModel, highestWallHeight);\r\n\r\n const centroid = useMemo(() => {\r\n if (currentWallArray.length < 2) {\r\n return new Vector3();\r\n }\r\n const points = getWallPoint2(currentWallArray);\r\n const p = Util.calculatePolygonCentroid(points);\r\n if (Number.isNaN(p.x) || Number.isNaN(p.y)) {\r\n return new Vector3();\r\n }\r\n return new Vector3(p.x, p.y, topZ);\r\n }, [currentWallArray, topZ]);\r\n\r\n const overhangs = useMemo(() => {\r\n const res = currentWallArray.map((wall) => RoofUtil.getWallNormal(wall).multiplyScalar(wall.eavesLength ?? 0));\r\n if (!isLoopRef.current && res.length !== 0) {\r\n const n = new Vector3()\r\n .subVectors(\r\n new Vector3(\r\n currentWallArray[currentWallArray.length - 1].rightPoint[0],\r\n currentWallArray[currentWallArray.length - 1].rightPoint[1],\r\n ),\r\n new Vector3(currentWallArray[0].leftPoint[0], currentWallArray[0].leftPoint[1]),\r\n )\r\n .applyEuler(HALF_PI_Z_EULER)\r\n .normalize()\r\n .multiplyScalar(0.3);\r\n res.push(n);\r\n }\r\n return res;\r\n }, [currentWallArray]);\r\n\r\n const wallPointsAfterOverhang = useMemo(() => {\r\n const res = currentWallArray.map((wall, idx) => ({\r\n leftPoint: new Vector3(wall.leftPoint[0], wall.leftPoint[1]).add(overhangs[idx]),\r\n rightPoint: new Vector3(wall.rightPoint[0], wall.rightPoint[1]).add(overhangs[idx]),\r\n }));\r\n if (!isLoopRef.current && res.length !== 0) {\r\n res.push({\r\n leftPoint: new Vector3(\r\n currentWallArray[currentWallArray.length - 1].rightPoint[0],\r\n currentWallArray[currentWallArray.length - 1].rightPoint[1],\r\n ).add(overhangs[overhangs.length - 1]),\r\n rightPoint: new Vector3(currentWallArray[0].leftPoint[0], currentWallArray[0].leftPoint[1]).add(\r\n overhangs[overhangs.length - 1],\r\n ),\r\n });\r\n }\r\n return res;\r\n }, [currentWallArray, overhangs]);\r\n\r\n const ridgePoints = useMemo(() => {\r\n const res = currentWallArray.map((wall, idx) => {\r\n const leftPoint = new Vector3(wall.leftPoint[0], wall.leftPoint[1]);\r\n const rightPoint = new Vector3(wall.rightPoint[0], wall.rightPoint[1]);\r\n const leftDiff = new Vector3().subVectors(centroid, leftPoint).setZ(0).normalize().multiplyScalar(width);\r\n const rightDiff = new Vector3().subVectors(centroid, rightPoint).setZ(0).normalize().multiplyScalar(width);\r\n leftPoint.add(leftDiff).setZ(topZ);\r\n rightPoint.add(rightDiff).setZ(topZ);\r\n return { leftPoint, rightPoint };\r\n });\r\n if (!isLoopRef.current && res.length !== 0) {\r\n res.push({ leftPoint: res[res.length - 1].rightPoint, rightPoint: res[0].leftPoint });\r\n }\r\n return res;\r\n }, [currentWallArray, centroid, width]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return zVector3.clone().multiplyScalar(thickness);\r\n }, [thickness]);\r\n\r\n const roofSegments = useMemo(() => {\r\n const segments: RoofSegmentProps[] = [];\r\n if (currentWallArray.length < 2) {\r\n return segments;\r\n }\r\n const overhangHeight = getOverhangHeight();\r\n\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n if (\r\n w.leftPoint.length > 0 &&\r\n w.rightPoint.length > 0 &&\r\n (w.leftPoint[0] !== w.rightPoint[0] || w.leftPoint[1] !== w.rightPoint[1])\r\n ) {\r\n const points = [];\r\n let { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n if (!isLoopRef.current) {\r\n if (i === 0) {\r\n lh = currentWallArray[0].lz;\r\n }\r\n if (i === currentWallArray.length - 1) {\r\n rh = currentWallArray[currentWallArray.length - 1].lz;\r\n }\r\n }\r\n\r\n const wallLeftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOverhang[(i + wallPointsAfterOverhang.length - 1) % wallPointsAfterOverhang.length].leftPoint,\r\n wallPointsAfterOverhang[(i + wallPointsAfterOverhang.length - 1) % wallPointsAfterOverhang.length].rightPoint,\r\n wallPointsAfterOverhang[i].leftPoint,\r\n wallPointsAfterOverhang[i].rightPoint,\r\n )\r\n .setZ(lh - overhangHeight)\r\n .sub(centroid);\r\n\r\n const wallRightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOverhang[i].leftPoint,\r\n wallPointsAfterOverhang[i].rightPoint,\r\n wallPointsAfterOverhang[(i + 1) % wallPointsAfterOverhang.length].leftPoint,\r\n wallPointsAfterOverhang[(i + 1) % wallPointsAfterOverhang.length].rightPoint,\r\n )\r\n .setZ(rh - overhangHeight)\r\n .sub(centroid);\r\n\r\n const ridgeLeftPoint = ridgePoints[i].leftPoint.clone().sub(centroid);\r\n const ridgeRightPoint = ridgePoints[i].rightPoint.clone().sub(centroid);\r\n\r\n const length = new Vector3(w.cx, w.cy).sub(centroid.clone().setZ(0)).length();\r\n points.push(wallLeftPointAfterOverhang, wallRightPointAfterOverhang, ridgeRightPoint, ridgeLeftPoint);\r\n points.push(\r\n wallLeftPointAfterOverhang.clone().add(thicknessVector),\r\n wallRightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeRightPoint.clone().add(thicknessVector),\r\n ridgeLeftPoint.clone().add(thicknessVector),\r\n );\r\n segments.push({ points, angle: -w.relativeAngle, length });\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n const idx = wallPointsAfterOverhang.length - 1;\r\n const leftPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOverhang[idx - 1].leftPoint,\r\n wallPointsAfterOverhang[idx - 1].rightPoint,\r\n wallPointsAfterOverhang[idx].leftPoint,\r\n wallPointsAfterOverhang[idx].rightPoint,\r\n )\r\n .setZ(currentWallArray[currentWallArray.length - 1].lz - overhangHeight)\r\n .sub(centroid);\r\n const rightPointAfterOverhang = RoofUtil.getIntersectionPoint(\r\n wallPointsAfterOverhang[idx].leftPoint,\r\n wallPointsAfterOverhang[idx].rightPoint,\r\n wallPointsAfterOverhang[0].leftPoint,\r\n wallPointsAfterOverhang[0].rightPoint,\r\n )\r\n .setZ(currentWallArray[0].lz - overhangHeight)\r\n .sub(centroid);\r\n\r\n const ridgeLeftPoint = ridgePoints[idx].leftPoint.clone().sub(centroid);\r\n const ridgeRightPoint = ridgePoints[idx].rightPoint.clone().sub(centroid);\r\n\r\n let angle = Math.atan2(\r\n rightPointAfterOverhang.y - leftPointAfterOverhang.y,\r\n rightPointAfterOverhang.x - leftPointAfterOverhang.x,\r\n );\r\n angle = angle >= 0 ? angle : (TWO_PI + angle) % TWO_PI;\r\n\r\n const length = new Vector3()\r\n .addVectors(leftPointAfterOverhang, rightPointAfterOverhang)\r\n .setZ(0)\r\n .divideScalar(2)\r\n .length();\r\n\r\n const points = [];\r\n points.push(leftPointAfterOverhang, rightPointAfterOverhang, ridgeRightPoint, ridgeLeftPoint);\r\n points.push(\r\n leftPointAfterOverhang.clone().add(thicknessVector),\r\n rightPointAfterOverhang.clone().add(thicknessVector),\r\n ridgeRightPoint.clone().add(thicknessVector),\r\n ridgeLeftPoint.clone().add(thicknessVector),\r\n );\r\n segments.push({ points, angle: -angle, length });\r\n }\r\n return segments;\r\n }, [currentWallArray, topZ, width, thickness]);\r\n\r\n const topRidgeShape = useMemo(() => {\r\n const shape = new Shape();\r\n if (ridgePoints.length > 0) {\r\n const startPoint = ridgePoints[0].leftPoint.clone().sub(centroid);\r\n shape.moveTo(startPoint.x, startPoint.y);\r\n for (const point of ridgePoints) {\r\n const rightPoint = point.rightPoint.clone().sub(centroid);\r\n shape.lineTo(rightPoint.x, rightPoint.y);\r\n }\r\n shape.closePath();\r\n }\r\n return shape;\r\n }, [currentWallArray, ridgePoints]);\r\n\r\n const ceilingPoints = useMemo(() => {\r\n const points: Vector3[] = [];\r\n if (currentWallArray.length === 0) return points;\r\n points.push(new Vector3().fromArray(currentWallArray[0].leftPoint));\r\n for (const wall of currentWallArray) {\r\n points.push(new Vector3().fromArray(wall.rightPoint));\r\n }\r\n return points;\r\n }, [currentWallArray]);\r\n\r\n useEffect(() => {\r\n if (ridgeWidth !== width) {\r\n setWidth(ridgeWidth);\r\n }\r\n }, [ridgeWidth]);\r\n\r\n useEffect(() => {\r\n if (currentWallArray.length > 1) {\r\n if (useStore.getState().addedRoofIdSet.has(id)) {\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === currentWallArray[i].id && e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n w.roofId = id;\r\n // some old files set wall's roof height, which should not\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n useStore.getState().deleteAddedRoofId(id);\r\n }\r\n } else {\r\n removeElementById(id, false, false, true);\r\n }\r\n }, [currentWallArray]);\r\n\r\n useUpdateRooftopElements(foundationModel, id, roofSegments, centroid, topZ, thickness);\r\n\r\n // update old files\r\n useEffect(() => {\r\n // handle old files\r\n if (frontRidge !== undefined || backRidge !== undefined) {\r\n setCommonStore((state) => {\r\n for (const el of state.elements) {\r\n if (el.type === ObjectType.Wall) {\r\n const w = el as WallModel;\r\n if (w.roofId === id) {\r\n w.centerLeftRoofHeight = undefined;\r\n w.centerRightRoofHeight = undefined;\r\n }\r\n } else if (el.type === ObjectType.Roof && (el as RoofModel).roofType === RoofType.Mansard) {\r\n if (el.id === id) {\r\n (el as MansardRoofModel).frontRidge = undefined;\r\n (el as MansardRoofModel).backRidge = undefined;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }, []);\r\n\r\n const updateSegmentVerticesWithoutOverhangMap = () => {\r\n const segmentVertices: Vector3[][] = [];\r\n\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const w = currentWallArray[i];\r\n if (\r\n w.leftPoint.length > 0 &&\r\n w.rightPoint.length > 0 &&\r\n (w.leftPoint[0] !== w.rightPoint[0] || w.leftPoint[1] !== w.rightPoint[1])\r\n ) {\r\n let { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n if (!isLoopRef.current) {\r\n if (i === 0) {\r\n lh = currentWallArray[0].lz;\r\n }\r\n if (i === currentWallArray.length - 1) {\r\n rh = currentWallArray[currentWallArray.length - 1].lz;\r\n }\r\n }\r\n\r\n const wallLeftPoint = new Vector3(w.leftPoint[0], w.leftPoint[1], lh);\r\n const wallRightPoint = new Vector3(w.rightPoint[0], w.rightPoint[1], rh);\r\n const ridgeLeftPoint = ridgePoints[i].leftPoint.clone();\r\n const ridgeRightPoint = ridgePoints[i].rightPoint.clone();\r\n\r\n segmentVertices.push([wallLeftPoint, wallRightPoint, ridgeRightPoint, ridgeLeftPoint]);\r\n }\r\n }\r\n if (!isLoopRef.current) {\r\n const lastIdx = currentWallArray.length - 1;\r\n const firstWall = currentWallArray[0];\r\n const lastWall = currentWallArray[lastIdx];\r\n const leftPoint = new Vector3(lastWall.rightPoint[0], lastWall.rightPoint[1], lastWall.lz);\r\n const rightPoint = new Vector3(firstWall.leftPoint[0], firstWall.leftPoint[1], firstWall.lz);\r\n const ridgeLeftPoint = ridgePoints[lastIdx].leftPoint.clone();\r\n const ridgeRightPoint = ridgePoints[lastIdx].rightPoint.clone();\r\n segmentVertices.push([leftPoint, rightPoint, ridgeRightPoint, ridgeLeftPoint]);\r\n }\r\n const ridgeVertices = ridgePoints.map((ridge) => ridge.leftPoint.clone());\r\n segmentVertices.push(ridgeVertices);\r\n\r\n if (isFlat) {\r\n const seg: Vector3[] = [];\r\n for (const segment of segmentVertices.slice(0, -1)) {\r\n seg.push(segment[0].clone());\r\n }\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, [seg]);\r\n } else {\r\n useDataStore.getState().setRoofSegmentVerticesWithoutOverhang(id, segmentVertices);\r\n }\r\n };\r\n\r\n const updateSegmentVertices = useUpdateSegmentVerticesMap(\r\n id,\r\n centroid,\r\n roofSegments,\r\n isFlat,\r\n RoofType.Mansard,\r\n ridgePoints.map((ridge) => ridge.leftPoint.clone().add(thicknessVector)),\r\n );\r\n useUpdateSegmentVerticesWithoutOverhangMap(updateSegmentVerticesWithoutOverhangMap);\r\n\r\n const world = useStore.getState().world;\r\n const selectMe = useStore(Selector.selectMe);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [heatmapTextures, setHeatmapTextures] = useState([]);\r\n const [flatHeatmapTexture, setFlatHeatmapTexture] = useState(null);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n\r\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\r\n const hourlyHeatExchangeArrayMap = useDataStore.getState().hourlyHeatExchangeArrayMap;\r\n const topSurfaceMeshRef = useRef(null);\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowLength = useRef();\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const { transparent, opacity } = useTransparent();\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n if (isFlat) {\r\n const heatmap = getHeatmap(id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n // obtain the bounding rectangle\r\n const segmentVertices = updateSegmentVertices();\r\n if (segmentVertices && segmentVertices.length > 0 && foundationModel) {\r\n const euler = new Euler(0, 0, foundationModel.rotation[2], 'ZYX');\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const s of segmentVertices) {\r\n for (const v of s) {\r\n const v2 = v.clone().applyEuler(euler);\r\n if (v2.x > maxX) maxX = v2.x;\r\n if (v2.x < minX) minX = v2.x;\r\n if (v2.y > maxY) maxY = v2.y;\r\n if (v2.y < minY) minY = v2.y;\r\n }\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n const vcx = (minX + maxX) / 2;\r\n const vcy = (minY + maxY) / 2;\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n t.offset.set(-minX / dx, -minY / dy);\r\n t.center.set(vcx / dx, vcy / dy);\r\n t.rotation = -foundationModel.rotation[2];\r\n t.repeat.set(1 / dx, 1 / dy);\r\n }\r\n setFlatHeatmapTexture(t);\r\n }\r\n }\r\n } else {\r\n const n = roofSegments.length + 1; // roofSegments does not include the top surface, so we add 1 here.\r\n const textures = [];\r\n for (let i = 0; i < n; i++) {\r\n const heatmap = getHeatmap(id + '-' + i);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n if (i === n - 1 && foundationModel) {\r\n // FIXME: I have no idea why the top heatmap needs to be rotated as follows\r\n t.center.set(0.5, 0.5);\r\n t.rotation = -foundationModel.rotation[2];\r\n }\r\n textures.push(t);\r\n }\r\n }\r\n }\r\n setHeatmapTextures(textures);\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n if (topSurfaceMeshRef.current) {\r\n const points = topRidgeShape.extractPoints(1).shape;\r\n const zOffset = 0.01; // a small number to ensure the surface mesh stay atop\r\n const geo = topSurfaceMeshRef.current.geometry;\r\n const n = points.length - 1;\r\n if (n === 4) {\r\n // special case: a quad can be more efficiently represented using only two triangles\r\n const positions = new Float32Array(18);\r\n positions[0] = points[3].x;\r\n positions[1] = points[3].y;\r\n positions[2] = zOffset;\r\n positions[3] = points[0].x;\r\n positions[4] = points[0].y;\r\n positions[5] = zOffset;\r\n positions[6] = points[2].x;\r\n positions[7] = points[2].y;\r\n positions[8] = zOffset;\r\n positions[9] = points[2].x;\r\n positions[10] = points[2].y;\r\n positions[11] = zOffset;\r\n positions[12] = points[0].x;\r\n positions[13] = points[0].y;\r\n positions[14] = zOffset;\r\n positions[15] = points[1].x;\r\n positions[16] = points[1].y;\r\n positions[17] = zOffset;\r\n // don't call geo.setFromPoints. It doesn't seem to work correctly.\r\n geo.setAttribute('position', new Float32BufferAttribute(positions, 3));\r\n geo.computeVertexNormals();\r\n const scale = showSolarRadiationHeatmap ? 1 : 6;\r\n const uvs = [];\r\n uvs.push(0, 0);\r\n uvs.push(scale, 0);\r\n uvs.push(0, scale);\r\n uvs.push(0, scale);\r\n uvs.push(scale, 0);\r\n uvs.push(scale, scale);\r\n geo.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\r\n } else {\r\n const geo = topSurfaceMeshRef.current.geometry;\r\n const positions = new Float32Array(n * 9);\r\n const scale = showSolarRadiationHeatmap ? 1 : 6;\r\n const uvs = [];\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n for (const p of points) {\r\n if (p.x > maxX) maxX = p.x;\r\n else if (p.x < minX) minX = p.x;\r\n if (p.y > maxY) maxY = p.y;\r\n else if (p.y < minY) minY = p.y;\r\n }\r\n const dx = maxX - minX;\r\n const dy = maxY - minY;\r\n for (let i = 0; i < n; i++) {\r\n const j = i * 9;\r\n positions[j] = points[i].x;\r\n positions[j + 1] = points[i].y;\r\n positions[j + 2] = zOffset;\r\n positions[j + 3] = points[i + 1].x;\r\n positions[j + 4] = points[i + 1].y;\r\n positions[j + 5] = zOffset;\r\n positions[j + 6] = 0;\r\n positions[j + 7] = 0;\r\n positions[j + 8] = zOffset;\r\n if (showSolarRadiationHeatmap) {\r\n uvs.push(((points[i].x - minX) / dx) * scale, ((points[i].y - minY) / dy) * scale);\r\n uvs.push(((points[i + 1].x - minX) / dx) * scale, ((points[i + 1].y - minY) / dy) * scale);\r\n } else {\r\n // I have no idea why the regular texture coordinates should not subtract minX and minY\r\n uvs.push((points[i].x / dx) * scale, (points[i].y / dy) * scale);\r\n uvs.push((points[i + 1].x / dx) * scale, (points[i + 1].y / dy) * scale);\r\n }\r\n uvs.push(0, 0);\r\n }\r\n // don't call geo.setFromPoints. It doesn't seem to work correctly.\r\n geo.setAttribute('position', new Float32BufferAttribute(positions, 3));\r\n geo.computeVertexNormals();\r\n geo.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\r\n }\r\n } else if (showSolarRadiationHeatmap && !updateFlag) {\r\n setUpdateFlag(!updateFlag);\r\n }\r\n }, [topRidgeShape, showSolarRadiationHeatmap, updateFlag]);\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (foundationModel && (foundationModel as FoundationModel).notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id + '-' + roofSegments.length);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments || !segments[roofSegments.length]) return undefined;\r\n const s = segments[roofSegments.length].map((v) =>\r\n v\r\n .clone()\r\n .sub(centroid)\r\n .add(new Vector3(0, 0, centroid.z + thickness)),\r\n );\r\n if (!s) return undefined;\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const s0 = s[0].clone();\r\n const s1 = s[1].clone();\r\n const s2 = s[2].clone();\r\n const v10 = new Vector3().subVectors(s1, s0);\r\n const v20 = new Vector3().subVectors(s2, s0);\r\n const v21 = new Vector3().subVectors(s2, s1);\r\n const length10 = v10.length();\r\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\r\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\r\n const m = Math.max(2, Math.floor(length10 / cellSize));\r\n const n = Math.max(2, Math.floor(distance / cellSize));\r\n v10.normalize();\r\n v20.normalize();\r\n v21.normalize();\r\n // find the normal vector of the quad\r\n const normal = new Vector3().crossVectors(v20, v21).normalize();\r\n // find the incremental vector going along the bottom edge (half of length)\r\n const dm = v10.multiplyScalar((0.5 * length10) / m);\r\n // find the incremental vector going from bottom to top (half of length)\r\n const dn = new Vector3()\r\n .crossVectors(normal, v10)\r\n .normalize()\r\n .multiplyScalar((0.5 * distance) / n);\r\n // find the starting point of the grid (shift half of length in both directions)\r\n const v0 = s0.clone().add(dm).add(dn).add(new Vector3(0, 0, thickness));\r\n // double half-length to full-length for the increment vectors in both directions\r\n dm.multiplyScalar(2);\r\n dn.multiplyScalar(2);\r\n heatFluxArrowLength.current = normal.clone().multiplyScalar(0.1);\r\n const vectors: Vector3[][] = [];\r\n const origin = new Vector3();\r\n const vertices = new Array();\r\n for (const p of s) {\r\n vertices.push({ x: p.x, y: p.y } as Point2);\r\n }\r\n const area = Util.getPolygonArea(vertices);\r\n if (area === 0) return undefined;\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowEuler.current = new Euler(-Math.sign(intensity) * HALF_PI, 0, 0);\r\n for (let p = 0; p < m; p++) {\r\n const dmp = dm.clone().multiplyScalar(p);\r\n for (let q = 0; q < n; q++) {\r\n origin.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\r\n if (Util.isPointInside(origin.x, origin.y, vertices)) {\r\n const v: Vector3[] = [];\r\n if (intensity < 0) {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(-intensity)));\r\n } else {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(intensity)));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [showHeatFluxes, heatFluxScaleFactor]);\r\n\r\n const userData = useUserData(id, foundationModel, centroid, roofSegments);\r\n\r\n const topLayerColor = textureType === RoofTexture.Default || textureType === RoofTexture.NoTexture ? color : 'white';\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.parentId === id && e.type === ObjectType.Window),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const holeMeshes = useMemo(\r\n () =>\r\n windows.map((w) => {\r\n const dimension = new Vector3(w.lx, w.lz, w.ly * 2);\r\n const position = new Vector3(w.cx, w.cy, w.cz).sub(centroid);\r\n const rotation = new Euler().fromArray([...w.rotation, 'ZXY']);\r\n\r\n const holeMesh = new Mesh(new BoxBufferGeometry(dimension.x, dimension.y, dimension.z));\r\n holeMesh.position.copy(position);\r\n holeMesh.rotation.copy(rotation);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }),\r\n [windows, centroid],\r\n );\r\n\r\n const noTextureAndOneColor = textureType === RoofTexture.NoTexture && color && color === sideColor;\r\n const castShadow = shadowEnabled && !transparent;\r\n\r\n return (\r\n \r\n {\r\n handlePointerDown(e, foundationModel.id, id, roofSegments, centroid);\r\n }}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, id);\r\n }}\r\n onPointerUp={(e) => {\r\n handlePointerUp(e, roofModel);\r\n }}\r\n onContextMenu={(e) => {\r\n handleContextMenu(e, id);\r\n }}\r\n >\r\n {isFlat ? (\r\n \r\n ) : (\r\n <>\r\n {roofSegments.map((segment, index, arr) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/*special case: the whole roof segment has no texture and only one color */}\r\n {noTextureAndOneColor && !showSolarRadiationHeatmap ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {showSolarRadiationHeatmap && heatmapTextures.length === roofSegments.length + 1 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n {/* wireframe */}\r\n {roofSegments.length > 0 && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n\r\n {/* ceiling */}\r\n {ceiling && rise > 0 && }\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n {\r\n selectMe(roofModel.id, e, ActionType.Select);\r\n isPointerDownRef.current = true;\r\n oldRiseRef.current = rise;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(centroid.x, centroid.y, topZ);\r\n if (foundationModel) {\r\n const r = -Math.atan2(camera.position.x - cx, camera.position.y - cy) - foundationModel.rotation[2];\r\n intersectionPlaneRotation.set(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n setRoofHandleType(RoofHandleType.Top);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n });\r\n }}\r\n onPointerOver={() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = RoofHandleType.Top;\r\n state.selectedElementHeight = topZ + roofModel.thickness;\r\n state.selectedElementX = centroid.x;\r\n state.selectedElementY = centroid.y;\r\n });\r\n }}\r\n />\r\n {ridgePoints.map((ridge, idx) => {\r\n const point = ridge.leftPoint.clone().sub(centroid);\r\n return (\r\n {\r\n isPointerDownRef.current = true;\r\n setEnableIntersectionPlane(true);\r\n intersectionPlanePosition.set(point.x, point.y, topZ + 0.15);\r\n intersectionPlaneRotation.set(0, 0, 0);\r\n setRoofHandleType(RoofHandleType.Ridge);\r\n setRidgeHandleIndex(idx);\r\n setMaxWidth(\r\n currentWallArray.reduce(\r\n (max, wall) =>\r\n Math.min(max, new Vector3(wall.leftPoint[0], wall.leftPoint[1], topZ).distanceTo(centroid) - 1),\r\n Infinity,\r\n ),\r\n );\r\n useRefStore.getState().setEnableOrbitController(false);\r\n oldWidth.current = width;\r\n }}\r\n />\r\n );\r\n })}\r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {enableIntersectionPlane && (\r\n {\r\n if (intersectionPlaneRef.current && isPointerDownRef.current) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects[0] && foundationModel) {\r\n const pointer = intersects[0].point;\r\n if (pointer.z < 0.001) {\r\n return;\r\n }\r\n switch (roofHandleType) {\r\n case RoofHandleType.Top: {\r\n const newRise = Math.max(0, pointer.z - foundationModel.lz - 0.6 - highestWallHeight);\r\n // the vertical ruler needs to display the latest rise when the handle is being dragged\r\n useStore.getState().updateRoofRiseById(id, newRise, topZ + roofModel.thickness);\r\n break;\r\n }\r\n case RoofHandleType.Ridge: {\r\n if (foundationModel && ridgeHandleIndex !== null) {\r\n const p = pointer\r\n .clone()\r\n .applyEuler(new Euler(0, 0, foundationModel.rotation[2]))\r\n .sub(new Vector3(foundationModel.cx, foundationModel.cy))\r\n .setZ(0);\r\n\r\n const wallPoint = getWallPointFromHandleIdx(ridgeHandleIndex);\r\n const d = p.distanceTo(wallPoint);\r\n const dir = new Vector3().subVectors(centroid.clone().setZ(0), wallPoint);\r\n const angle = p.clone().sub(wallPoint).angleTo(dir);\r\n if (angle < HALF_PI) {\r\n setWidth(Util.clamp(d, 0.5, maxWidth ?? dir.length() - 1));\r\n } else {\r\n setWidth(0.5);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n onPointerUp={() => {\r\n switch (roofHandleType) {\r\n case RoofHandleType.Top: {\r\n addUndoableResizeRoofRise(id, oldRiseRef.current, rise);\r\n break;\r\n }\r\n case RoofHandleType.Ridge: {\r\n addUndoableResizeRidge(id, roofHandleType, oldWidth.current, width);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Roof && (e as RoofModel).roofType === RoofType.Mansard) {\r\n (e as MansardRoofModel).ridgeWidth = width;\r\n break;\r\n }\r\n }\r\n });\r\n isPointerDownRef.current = false;\r\n setEnableIntersectionPlane(false);\r\n setRoofHandleType(RoofHandleType.Null);\r\n setRidgeHandleIndex(null);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {heatFluxes &&\r\n heatFluxes.map((v, index) => {\r\n return (\r\n \r\n \r\n ;\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n
\r\n );\r\n};\r\n\r\nexport default React.memo(MansardRoof, areRoofsEqual);\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { message } from 'antd';\nimport html2canvas from 'html2canvas';\nimport { saveAs } from 'file-saver';\nimport { DatumEntry } from './types';\n\nexport const visitIFI = () => {\n window.open('https://intofuture.org', '_blank');\n};\n\nexport const visitHomepage = () => {\n window.open('https://intofuture.org/aladdin.html', '_blank');\n};\n\nexport const getSatelliteImage = (size: number, lat: number, lng: number, zoom: number) => {\n return (\n 'https://maps.googleapis.com/maps/api/staticmap?maptype=satellite¢er=' +\n lat +\n ',' +\n lng +\n '&zoom=' +\n zoom +\n '&size=' +\n size +\n 'x' +\n size +\n '&scale=2&key=' +\n process.env.REACT_APP_MAPS_API_KEY\n );\n};\n\nexport const getRoadMap = (size: number, lat: number, lng: number, zoom: number) => {\n return (\n 'https://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&style=feature:poi|element:labels|visibility:off¢er=' +\n lat +\n ',' +\n lng +\n '&zoom=' +\n zoom +\n '&size=' +\n size +\n 'x' +\n size +\n '&scale=2&key=' +\n process.env.REACT_APP_MAPS_API_KEY\n );\n};\n\nexport const showSuccess = (msg: string, duration?: number) => {\n message.success({\n duration: duration ?? 2,\n content: msg,\n className: 'custom-class',\n style: {\n marginTop: '20vh',\n },\n onClick: () => {\n message.destroy();\n },\n });\n};\n\nexport const showInfo = (msg: string, duration?: number) => {\n message.info({\n duration: duration ?? 2,\n content: msg,\n className: 'custom-class',\n style: {\n marginTop: '20vh',\n },\n onClick: () => {\n message.destroy();\n },\n });\n};\n\nexport const showWarning = (msg: string, duration?: number) => {\n message.warning({\n duration: duration ?? 2,\n content: msg,\n className: 'custom-class',\n style: {\n marginTop: '20vh',\n },\n onClick: () => {\n message.destroy();\n },\n });\n};\n\nexport const showError = (msg: string, duration?: number) => {\n message.error({\n duration: duration ?? 2,\n content: msg,\n className: 'custom-class',\n style: {\n marginTop: '20vh',\n },\n onClick: () => {\n message.destroy();\n },\n });\n};\n\nexport const openInNewTab = (url: string) => {\n const win = window.open(url, '_blank');\n if (win) {\n win.focus();\n }\n};\n\nexport const extractText = (html: string) => {\n return new DOMParser().parseFromString(html, 'text/html').documentElement.textContent;\n};\n\nexport const containedInDOMRect = (rect: DOMRect, x: number, y: number, margin: number) => {\n return (\n x > rect.x - margin && x < rect.x + rect.width + margin && y > rect.y - margin && y < rect.y + rect.height + margin\n );\n};\n\nexport const copyTextToClipboard = (text: string) => {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.setAttribute('readonly', '');\n textArea.style.position = 'absolute';\n textArea.style.left = '-9999px'; // Move outside the screen to make it invisible\n document.body.appendChild(textArea);\n const selection = document.getSelection();\n if (selection) {\n const selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n if (selected) {\n selection.removeAllRanges();\n selection.addRange(selected);\n }\n }\n};\n\nexport const saveImage = (fileName: string, imgUrl: string) => {\n let a = document.createElement('a') as HTMLAnchorElement;\n a.download = fileName;\n a.href = imgUrl;\n a.click();\n};\n\nexport const screenshot = async (elementId: string, name: string, options: {}) => {\n const source = window.document.getElementById(elementId);\n if (source) {\n const canvas = await html2canvas(source, { ...options, removeContainer: true });\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png', 1.0);\n a.download = `${name}.png`;\n a.click();\n } else {\n throw new Error(`Cannot find element with ID ${elementId}`);\n }\n};\n\nexport const saveCsv = (data: DatumEntry[], fileName: string) => {\n let content = '';\n for (const k of Object.keys(data[0])) {\n content += k + ', ';\n }\n content += '\\n';\n for (const o of data) {\n for (const v of Object.values(o)) {\n content += v + ', ';\n }\n content += '\\n';\n }\n const blob = new Blob([content], { type: 'text/csv;charset=utf-8' });\n saveAs(blob, fileName);\n};\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS4JqPmK1AAAAKJJREFUeJzt2rENwDAMxEA58P4rO2NcIXICPgF1OjPzZjH3vdX759MCmgJoAU0BtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQFMALaApgBbQFEALaNYHONN/wOr9nUABtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQFMALaApgBbQFEALaAqgBTTrA/zujAh7/zc8ggAAAABJRU5ErkJggg==\"","export default __webpack_public_path__ + \"static/media/wall_01.a34e191a.png\";","export default __webpack_public_path__ + \"static/media/wall_03.9fd1fc56.png\";","export default __webpack_public_path__ + \"static/media/wall_04.ba3c85fa.png\";","export default __webpack_public_path__ + \"static/media/wall_05.a7b7b6d2.png\";","export default __webpack_public_path__ + \"static/media/wall_06.a62f49a9.png\";","export default __webpack_public_path__ + \"static/media/wall_07.ad5fe7c0.png\";","export default __webpack_public_path__ + \"static/media/wall_08.cfa0113c.png\";","export default __webpack_public_path__ + \"static/media/wall_09.ad49123e.png\";","export default __webpack_public_path__ + \"static/media/wall_10.ad1052ed.png\";","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport WallTextureDefault from 'src/resources/wall_edge.png';\r\nimport WallTexture00 from 'src/resources/tiny_white_square.png';\r\nimport WallTexture01 from 'src/resources/wall_01.png';\r\nimport WallTexture02 from 'src/resources/wall_02.png';\r\nimport WallTexture03 from 'src/resources/wall_03.png';\r\nimport WallTexture04 from 'src/resources/wall_04.png';\r\nimport WallTexture05 from 'src/resources/wall_05.png';\r\nimport WallTexture06 from 'src/resources/wall_06.png';\r\nimport WallTexture07 from 'src/resources/wall_07.png';\r\nimport WallTexture08 from 'src/resources/wall_08.png';\r\nimport WallTexture09 from 'src/resources/wall_09.png';\r\nimport WallTexture10 from 'src/resources/wall_10.png';\r\n\r\nimport { useEffect, useMemo, useRef } from 'react';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { WallModel, WallFill, WallStructure } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { Util } from 'src/Util';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { RepeatWrapping, TextureLoader, Vector3 } from 'three';\r\nimport { ObjectType, WallTexture } from 'src/types';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { DEFAULT_PARAPET_SETTINGS } from './parapet';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\n\r\nexport const useElements = (id: string, leftWallId?: string, rightWallId?: string, roofId?: string) => {\r\n const isElementTriggerWallChange = (elem: ElementModel) => {\r\n return elem.parentId === id || elem.id === roofId;\r\n };\r\n\r\n const leftWall = useStore((state) => {\r\n if (leftWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId) {\r\n return e as WallModel;\r\n }\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n const rightWall = useStore((state) => {\r\n if (rightWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === rightWallId) {\r\n return e as WallModel;\r\n }\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n const elementsTriggerChange = useStore((state) => JSON.stringify(state.elements.filter(isElementTriggerWallChange)));\r\n\r\n const elementsOnWall = useMemo(\r\n () => useStore.getState().elements.filter((el) => isElementTriggerWallChange(el) && Util.isLegalOnWall(el.type)),\r\n [elementsTriggerChange],\r\n );\r\n\r\n return { elementsOnWall, leftWall, rightWall };\r\n};\r\n\r\nexport const useHandleSize = (size = 0.3) => {\r\n const orthographic = useStore((state) => state.viewState.orthographic);\r\n const cameraPosition = useStore((state) => state.viewState.cameraPosition);\r\n const cameraZoom = useStore((state) => state.viewState.cameraZoom);\r\n\r\n let handleSize;\r\n\r\n if (orthographic) {\r\n handleSize = Math.max(size, 15 / cameraZoom);\r\n } else {\r\n const panCenter = useStore.getState().viewState.panCenter;\r\n const p = new Vector3(...panCenter);\r\n const c = new Vector3(...cameraPosition);\r\n const distance = c.distanceTo(p);\r\n handleSize = Math.max(size, distance / 100);\r\n }\r\n\r\n return handleSize;\r\n};\r\n\r\nexport const useWallTexture = (textureType: WallTexture, wallStructure?: WallStructure) => {\r\n const textureLoader = useMemo(() => new TextureLoader(), []);\r\n\r\n const texture = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case WallTexture.Default:\r\n textureImg = WallTextureDefault;\r\n break;\r\n case WallTexture.NoTexture:\r\n textureImg = WallTexture00;\r\n break;\r\n case WallTexture.Texture01:\r\n textureImg = WallTexture01;\r\n break;\r\n case WallTexture.Texture02:\r\n textureImg = WallTexture02;\r\n break;\r\n case WallTexture.Texture03:\r\n textureImg = WallTexture03;\r\n break;\r\n case WallTexture.Texture04:\r\n textureImg = WallTexture04;\r\n break;\r\n case WallTexture.Texture05:\r\n textureImg = WallTexture05;\r\n break;\r\n case WallTexture.Texture06:\r\n textureImg = WallTexture06;\r\n break;\r\n case WallTexture.Texture07:\r\n textureImg = WallTexture07;\r\n break;\r\n case WallTexture.Texture08:\r\n textureImg = WallTexture08;\r\n break;\r\n case WallTexture.Texture09:\r\n textureImg = WallTexture09;\r\n break;\r\n case WallTexture.Texture10:\r\n textureImg = WallTexture10;\r\n break;\r\n default:\r\n textureImg = WallTexture00;\r\n }\r\n\r\n if (wallStructure === WallStructure.Stud) {\r\n textureImg = WallTexture00;\r\n }\r\n\r\n return textureLoader.load(textureImg, (texture) => {\r\n texture.wrapS = texture.wrapT = RepeatWrapping;\r\n texture.offset.set(0, 0);\r\n let repeatX = 0.6;\r\n let repeatY = 0.6;\r\n switch (textureType) {\r\n case WallTexture.Default:\r\n repeatX = 2;\r\n repeatY = 2;\r\n break;\r\n case WallTexture.Texture03:\r\n repeatX = 2;\r\n repeatY = 1;\r\n break;\r\n case WallTexture.Texture06:\r\n repeatX = 1;\r\n repeatY = 1;\r\n break;\r\n }\r\n texture.repeat.set(repeatX, repeatY);\r\n invalidate();\r\n });\r\n }, [textureType]);\r\n\r\n return texture;\r\n};\r\n\r\nexport const useLatestFoundation = (foundationModel: FoundationModel) => {\r\n const isFirstRenderRef = useRef(true);\r\n usePrimitiveStore((state) => state.foundationMovedFlag);\r\n\r\n let foundation = foundationModel;\r\n\r\n if (!isFirstRenderRef.current) {\r\n const latestFoundation = useStore\r\n .getState()\r\n .elements.find((e) => e.id === foundationModel.id && e.type === ObjectType.Foundation);\r\n if (latestFoundation) {\r\n foundation = latestFoundation as FoundationModel;\r\n }\r\n }\r\n\r\n isFirstRenderRef.current = false;\r\n\r\n return foundation;\r\n};\r\n","export default \"data:image/png;base64,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\"","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { useStore } from '../stores/common';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { ObjectType } from '../types';\r\nimport { SolarPanelModel } from '../models/SolarPanelModel';\r\nimport { Vector3 } from 'three';\r\nimport { UndoableMove } from '../undo/UndoableMove';\r\nimport { PolygonModel } from '../models/PolygonModel';\r\nimport { Point2 } from '../models/Point2';\r\n\r\nexport class SharedUtil {\r\n static WALL_OUTSIDE_SURFACE_MESH_NAME = 'Wall Outside Surface';\r\n\r\n static addUndoableMove() {\r\n const oldElement = useStore.getState().selectedElement;\r\n if (!oldElement) return;\r\n const newElement = useStore.getState().getElementById(oldElement.id);\r\n const oldParentId = usePrimitiveStore.getState().oldParentId;\r\n const oldFoundationId = usePrimitiveStore.getState().oldFoundationId;\r\n if (!newElement || !oldParentId || !oldFoundationId) return;\r\n\r\n const isSolarPanel = oldElement.type === ObjectType.SolarPanel;\r\n const isPolygon = oldElement.type === ObjectType.Polygon;\r\n const undoableMove = {\r\n name: 'Move',\r\n timestamp: Date.now(),\r\n movedElementId: newElement.id,\r\n movedElementType: newElement.type,\r\n oldCx: oldElement.cx,\r\n oldCy: oldElement.cy,\r\n oldCz: oldElement.cz,\r\n newCx: newElement.cx,\r\n newCy: newElement.cy,\r\n newCz: newElement.cz,\r\n oldParentType: isSolarPanel ? (oldElement as SolarPanelModel).parentType : undefined,\r\n newParentType: isSolarPanel ? (newElement as SolarPanelModel).parentType : undefined,\r\n oldParentId: oldParentId,\r\n newParentId: newElement.parentId,\r\n oldFoundationId: oldFoundationId,\r\n newFoundationId: newElement.foundationId,\r\n oldNormal: new Vector3().fromArray(oldElement.normal),\r\n newNormal: new Vector3().fromArray(newElement.normal),\r\n oldRotation: [...oldElement.rotation],\r\n newRotation: [...newElement.rotation],\r\n undo() {\r\n setUndoRedoMove(\r\n this.movedElementId,\r\n [this.oldCx, this.oldCy, this.oldCz],\r\n this.oldParentId,\r\n this.newParentId,\r\n this.oldFoundationId,\r\n this.oldParentType,\r\n this.oldRotation,\r\n this.oldNormal,\r\n isPolygon ? (oldElement as PolygonModel).vertices : undefined,\r\n );\r\n },\r\n redo() {\r\n setUndoRedoMove(\r\n this.movedElementId,\r\n [this.newCx, this.newCy, this.newCz],\r\n this.newParentId,\r\n this.oldParentId,\r\n this.newFoundationId,\r\n this.newParentType,\r\n this.newRotation,\r\n this.newNormal,\r\n isPolygon ? (newElement as PolygonModel).vertices : undefined,\r\n );\r\n },\r\n } as UndoableMove;\r\n useStore.getState().addUndoable(undoableMove);\r\n\r\n const setUndoRedoMove = (\r\n id: string,\r\n pos: number[],\r\n oldParentId?: string,\r\n newParentId?: string,\r\n foundationId?: string | null,\r\n parentType?: ObjectType,\r\n rotation?: number[],\r\n normal?: Vector3,\r\n vertices?: Point2[],\r\n ) => {\r\n useStore.getState().set((state) => {\r\n const el = state.elements.find((e) => e.id === id);\r\n if (!el) return;\r\n if (el.type === ObjectType.Polygon) {\r\n if (vertices) {\r\n const pg = el as PolygonModel;\r\n pg.vertices = [...vertices];\r\n }\r\n } else {\r\n [el.cx, el.cy, el.cz] = [...pos];\r\n }\r\n if (oldParentId && newParentId && foundationId) {\r\n el.parentId = oldParentId;\r\n el.foundationId = foundationId;\r\n\r\n if (parentType && el.type === ObjectType.SolarPanel) {\r\n (el as SolarPanelModel).parentType = parentType;\r\n }\r\n if (rotation) {\r\n el.rotation = [...rotation];\r\n }\r\n if (normal) {\r\n el.normal = [normal.x, normal.y, normal.z];\r\n }\r\n\r\n // keep abs size\r\n if (el.type === ObjectType.Window) {\r\n const oldParent = state.elements.find((e) => e.id === oldParentId);\r\n const newParent = state.elements.find((e) => e.id === newParentId);\r\n if (!oldParent || !newParent) return;\r\n const absLx = el.lx * newParent.lx;\r\n const absLz = el.lz * newParent.lz;\r\n el.lx = absLx / oldParent.lx;\r\n el.lz = absLz / oldParent.lz;\r\n }\r\n }\r\n });\r\n };\r\n }\r\n\r\n static undoInvalidOperation() {\r\n useStore.getState().set((state) => {\r\n if (!state.selectedElement) return;\r\n for (let i = 0; i < state.elements.length; i++) {\r\n const element = state.elements[i];\r\n if (element.id === state.selectedElement?.id) {\r\n const oldElement = state.selectedElement;\r\n const oldParentId = usePrimitiveStore.getState().oldParentId;\r\n const oldFoundationId = usePrimitiveStore.getState().oldFoundationId;\r\n if (oldParentId) {\r\n oldElement.parentId = oldParentId;\r\n }\r\n if (oldFoundationId) {\r\n oldElement.foundationId = oldFoundationId;\r\n }\r\n state.elements[i] = oldElement;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { useStore } from '../../stores/common';\r\nimport {\r\n GableRoofModel,\r\n GambrelRoofModel,\r\n HipRoofModel,\r\n MansardRoofModel,\r\n PyramidRoofModel,\r\n RoofModel,\r\n RoofType,\r\n} from '../../models/RoofModel';\r\nimport * as Selector from '../../stores/selector';\r\nimport PyramidRoof from './pyramidRoof';\r\nimport GableRoof from './gableRoof';\r\nimport HipRoof from './hipRoof';\r\nimport GambrelRoof from './gambrelRoof';\r\nimport { UndoableResizeRoofRise } from 'src/undo/UndoableResize';\r\nimport MansardRoof from './mansardRoof';\r\nimport { Euler, Mesh, Vector3 } from 'three';\r\nimport { ObjectType, Orientation } from 'src/types';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport { HIGHLIGHT_HANDLE_COLOR, LOCKED_ELEMENT_SELECTION_COLOR } from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { showError } from 'src/helpers';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { ElementModelFactory } from 'src/models/ElementModelFactory';\r\nimport { UndoableAdd } from 'src/undo/UndoableAdd';\r\nimport { Sphere } from '@react-three/drei';\r\nimport { useHandleSize } from '../wall/hooks';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { SharedUtil } from '../SharedUtil';\r\nimport { BuildingParts } from 'src/models/FoundationModel';\r\n\r\nexport interface RoofSegmentGroupUserData {\r\n roofId: string;\r\n foundation: ElementModel | null;\r\n centroid: Vector3;\r\n roofSegments: RoofSegmentProps[];\r\n}\r\nexport interface RoofSegmentProps {\r\n points: Vector3[];\r\n angle: number;\r\n length: number;\r\n}\r\n\r\nexport interface RoofWireframeProps {\r\n roofSegments: RoofSegmentProps[];\r\n thickness: number;\r\n lineWidth: number;\r\n lineColor: string;\r\n}\r\n\r\ninterface RoofHandleProps {\r\n position: [x: number, y: number, z: number];\r\n onPointerDown?: (event: ThreeEvent) => void;\r\n onPointerUp?: (event: ThreeEvent) => void;\r\n onPointerOver?: (event: ThreeEvent) => void;\r\n}\r\n\r\nconst addUndoableAddRooftopElement = (elem: ElementModel) => {\r\n const undoableAdd = {\r\n name: `Add ${elem.type} on Roof`,\r\n timestamp: Date.now(),\r\n addedElement: elem,\r\n undo: () => {\r\n useStore.getState().removeElementById(elem.id, false);\r\n },\r\n redo: () => {\r\n useStore.getState().set((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n useStore.getState().addUndoable(undoableAdd);\r\n};\r\n\r\nconst getPointerOnRoof = (e: ThreeEvent) => {\r\n for (const intersection of e.intersections) {\r\n if (intersection.eventObject.name.includes('Roof Segments Group')) {\r\n if (intersection.object.name.includes('Flat roof')) {\r\n return intersection.point.clone().setZ(intersection.point.z - 0.01);\r\n } else {\r\n return intersection.point;\r\n }\r\n }\r\n }\r\n return e.intersections[0].point;\r\n};\r\n\r\nconst handleAddElementOnRoof = (\r\n e: ThreeEvent,\r\n foundationId: string,\r\n roofId: string,\r\n roofSegments: RoofSegmentProps[],\r\n ridgeMidPoint: Vector3,\r\n) => {\r\n if (e.intersections.length === 0) return;\r\n\r\n const objectTypeToAdd = useStore.getState().objectTypeToAdd;\r\n if (objectTypeToAdd === ObjectType.None) return;\r\n\r\n const roof = useStore.getState().getElementById(roofId);\r\n const foundation = useStore.getState().getElementById(foundationId);\r\n if (!roof || !foundation) return;\r\n\r\n const pointer = getPointerOnRoof(e);\r\n const posRelToFoundation = new Vector3()\r\n .subVectors(pointer, new Vector3(foundation.cx, foundation.cy, foundation.lz))\r\n .applyEuler(new Euler(0, 0, -foundation.rotation[2]));\r\n const posRelToCentroid = posRelToFoundation.clone().sub(ridgeMidPoint);\r\n\r\n switch (objectTypeToAdd) {\r\n case ObjectType.SolarPanel: {\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n const actionState = useStore.getState().actionState;\r\n const newElement = ElementModelFactory.makeSolarPanel(\r\n roof,\r\n useStore.getState().getPvModule(actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\r\n posRelToFoundation.x / foundation.lx,\r\n posRelToFoundation.y / foundation.ly,\r\n posRelToFoundation.z,\r\n actionState.solarPanelOrientation ?? Orientation.landscape,\r\n actionState.solarPanelPoleHeight ?? 1,\r\n actionState.solarPanelPoleSpacing ?? 3,\r\n actionState.solarPanelTiltAngle ?? 0,\r\n actionState.solarPanelRelativeAzimuth ?? 0,\r\n normal,\r\n rotation ?? [0, 0, 1],\r\n actionState.solarPanelFrameColor,\r\n undefined,\r\n undefined,\r\n ObjectType.Roof,\r\n );\r\n useStore.getState().set((state) => {\r\n state.elements.push(newElement);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n addUndoableAddRooftopElement(newElement);\r\n\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n const newElement = ElementModelFactory.makeWindow(\r\n roof,\r\n posRelToFoundation.x,\r\n posRelToFoundation.y,\r\n posRelToFoundation.z,\r\n ObjectType.Roof,\r\n rotation,\r\n 0.5,\r\n 0.5,\r\n );\r\n useStore.getState().set((state) => {\r\n state.elements.push(newElement);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n addUndoableAddRooftopElement(newElement);\r\n\r\n break;\r\n }\r\n case ObjectType.Sensor: {\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n const newElement = ElementModelFactory.makeSensor(\r\n roof,\r\n posRelToFoundation.x / foundation.lx,\r\n posRelToFoundation.y / foundation.ly,\r\n posRelToFoundation.z,\r\n normal,\r\n rotation ?? [0, 0, 1],\r\n );\r\n useStore.getState().set((state) => {\r\n state.elements.push(newElement);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n addUndoableAddRooftopElement(newElement);\r\n\r\n break;\r\n }\r\n case ObjectType.Light: {\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n const actionState = useStore.getState().actionState;\r\n const newElement = ElementModelFactory.makeLight(\r\n roof,\r\n 2,\r\n actionState.lightDistance,\r\n actionState.lightIntensity,\r\n actionState.lightColor,\r\n posRelToFoundation.x / foundation.lx,\r\n posRelToFoundation.y / foundation.ly,\r\n posRelToFoundation.z,\r\n normal,\r\n rotation ?? [0, 0, 1],\r\n );\r\n useStore.getState().set((state) => {\r\n state.elements.push(newElement);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n addUndoableAddRooftopElement(newElement);\r\n\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const handleRoofBodyPointerDown = (e: ThreeEvent, id: string, foundationId: string) => {\r\n if (useStore.getState().isAddingElement() || useStore.getState().objectTypeToAdd !== ObjectType.None) {\r\n return;\r\n }\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === e.eventObject.name) {\r\n e.stopPropagation();\r\n useStore.getState().set((state) => {\r\n if (state.groupActionMode) {\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (state.selectedElementIdSet.has(foundationId)) {\r\n state.selectedElementIdSet.delete(foundationId);\r\n } else {\r\n state.selectedElementIdSet.add(foundationId);\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.selected = true;\r\n state.selectedElement = e;\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport const addUndoableResizeRoofRise = (elemId: string, oldRise: number, newRise: number) => {\r\n const undoable = {\r\n name: 'Resize Roof Rise',\r\n timestamp: Date.now(),\r\n resizedElementId: elemId,\r\n resizedElementType: ObjectType.Roof,\r\n oldRise: oldRise,\r\n newRise: newRise,\r\n undo: () => {\r\n useStore.getState().updateRoofRiseById(undoable.resizedElementId, undoable.oldRise, 0);\r\n },\r\n redo: () => {\r\n useStore.getState().updateRoofRiseById(undoable.resizedElementId, undoable.newRise, 0);\r\n },\r\n } as UndoableResizeRoofRise;\r\n useStore.getState().addUndoable(undoable);\r\n};\r\n\r\nexport const spBoundaryCheck = (solarPanelVertices: Vector3[], wallVertices: Point2[]) => {\r\n const lang = { lng: useStore.getState().language };\r\n if (RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, wallVertices)) {\r\n return true;\r\n } else {\r\n if (useStore.getState().moveHandleType || useStore.getState().viewState.orthographic) {\r\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\r\n } else if (useStore.getState().resizeHandleType) {\r\n showError(i18n.t('message.ResizingOutsideBoundaryCancelled', lang));\r\n } else if (useStore.getState().rotateHandleType) {\r\n showError(i18n.t('message.RotationOutsideBoundaryCancelled', lang));\r\n }\r\n return false;\r\n }\r\n};\r\n\r\nexport const spCollisionCheck = (sp: SolarPanelModel, foundation: ElementModel, spVertices: Vector3[]) => {\r\n const lang = { lng: useStore.getState().language };\r\n if (RoofUtil.rooftopSPCollisionCheck(sp, foundation, spVertices)) {\r\n return true;\r\n } else {\r\n if (useStore.getState().moveHandleType || useStore.getState().viewState.orthographic) {\r\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\r\n } else if (useStore.getState().resizeHandleType) {\r\n showError(i18n.t('message.ResizingCancelledBecauseOfOverlap', lang));\r\n } else if (useStore.getState().rotateHandleType) {\r\n showError(i18n.t('message.RotationCancelledBecauseOfOverlap', lang));\r\n }\r\n return false;\r\n }\r\n};\r\n\r\nexport const updateRooftopElements = (\r\n foundation: ElementModel | null,\r\n roofId: string,\r\n roofSegments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n h: number,\r\n thickness: number,\r\n isFlatGambrel?: boolean,\r\n) => {\r\n if (foundation === null) return;\r\n useStore.getState().set((state) => {\r\n if (foundation === null) return;\r\n for (const e of state.elements) {\r\n if (e.parentId === roofId && e.foundationId) {\r\n if (e.type === ObjectType.SolarPanel) {\r\n const posRelToFoundation = new Vector3(e.cx * foundation.lx, e.cy * foundation.ly, e.cz + foundation.lz);\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n const { segmentVertices, normal, rotation } = RoofUtil.computeState(\r\n roofSegments,\r\n posRelToCentroid,\r\n isFlatGambrel,\r\n );\r\n let z;\r\n if (segmentVertices) {\r\n z = RoofUtil.getRooftopElementZ(segmentVertices, posRelToCentroid, h + thickness);\r\n } else {\r\n z = h + thickness;\r\n }\r\n if (normal && rotation && z !== undefined) {\r\n e.normal = normal.toArray();\r\n e.rotation = [...rotation];\r\n e.cz = z;\r\n }\r\n } else if (e.type === ObjectType.Window) {\r\n const posRelToFoundation = new Vector3(e.cx, e.cy, e.cz + foundation.lz);\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n const { segmentVertices, normal, rotation } = RoofUtil.computeState(\r\n roofSegments,\r\n posRelToCentroid,\r\n isFlatGambrel,\r\n );\r\n let z;\r\n if (segmentVertices) {\r\n z = RoofUtil.getRooftopElementZ(segmentVertices, posRelToCentroid, h + thickness);\r\n } else {\r\n z = h + thickness;\r\n }\r\n if (normal && rotation && z !== undefined) {\r\n e.rotation = [...rotation];\r\n e.cz = z;\r\n }\r\n } else if (e.type === ObjectType.Sensor || e.type === ObjectType.Light) {\r\n const posRelToFoundation = new Vector3(e.cx * foundation.lx, e.cy * foundation.ly, e.cz + foundation.lz);\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n const { segmentVertices, normal, rotation } = RoofUtil.computeState(\r\n roofSegments,\r\n posRelToCentroid,\r\n isFlatGambrel,\r\n );\r\n let z;\r\n if (segmentVertices) {\r\n z = RoofUtil.getRooftopElementZ(segmentVertices, posRelToCentroid, h + thickness);\r\n } else {\r\n z = h + thickness;\r\n }\r\n if (normal && rotation && z !== undefined) {\r\n e.normal = normal.toArray();\r\n e.rotation = [...rotation];\r\n e.cz = z;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n};\r\n\r\n// handle pointer events\r\nexport const handlePointerDown = (\r\n e: ThreeEvent,\r\n foundationId: string,\r\n roofId: string,\r\n roofSegments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n) => {\r\n if (e.button === 2) return;\r\n // click on child\r\n if (e.intersections[0].eventObject.name !== e.eventObject.name) {\r\n }\r\n // click on roof body\r\n else {\r\n handleRoofBodyPointerDown(e, roofId, foundationId);\r\n handleAddElementOnRoof(e, foundationId, roofId, roofSegments, centroid);\r\n }\r\n};\r\n\r\nexport const handlePointerUp = (event: ThreeEvent, roofModel: RoofModel) => {\r\n const selectedElement = useStore.getState().selectedElement;\r\n if (!selectedElement || !RoofUtil.isValidOnRoof(selectedElement)) return;\r\n\r\n const element = useStore.getState().getElementById(selectedElement.id);\r\n if (element && useStore.getState().moveHandleType) {\r\n const intersectionRoofs = event.intersections.filter((i) => i.eventObject.name.includes('Roof'));\r\n const isFirstIntersectedRoof = intersectionRoofs[0].eventObject.userData.roofId === roofModel.id;\r\n if (isFirstIntersectedRoof && element.foundationId) {\r\n const foundation = useStore.getState().getElementById(element.foundationId);\r\n\r\n if (foundation) {\r\n switch (element.type) {\r\n case ObjectType.SolarPanel: {\r\n const solarPanel = element as SolarPanelModel;\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(roofModel);\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(solarPanel, foundation);\r\n if (\r\n !spBoundaryCheck(solarPanelVertices, boundaryVertices) ||\r\n !spCollisionCheck(solarPanel, foundation, solarPanelVertices)\r\n ) {\r\n SharedUtil.undoInvalidOperation();\r\n } else {\r\n SharedUtil.addUndoableMove();\r\n }\r\n break;\r\n }\r\n case ObjectType.Sensor:\r\n SharedUtil.addUndoableMove();\r\n break;\r\n case ObjectType.Light:\r\n SharedUtil.addUndoableMove();\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n useStore.getState().set((state) => {\r\n state.moveHandleType = null;\r\n });\r\n};\r\n\r\nexport const handlePointerMove = (event: ThreeEvent, id: string) => {\r\n const selectedElement = useStore.getState().getSelectedElement();\r\n if (!selectedElement || !RoofUtil.isValidOnRoof(selectedElement)) return;\r\n\r\n switch (selectedElement.type) {\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel: {\r\n if (\r\n selectedElement.type === ObjectType.SolarPanel &&\r\n (selectedElement as SolarPanelModel).parentType === undefined\r\n )\r\n return;\r\n if (useStore.getState().moveHandleType) {\r\n const intersectionObjects = event.intersections.filter(\r\n (i) =>\r\n i.eventObject.name.includes('Roof') ||\r\n i.eventObject.name.includes(SharedUtil.WALL_OUTSIDE_SURFACE_MESH_NAME),\r\n );\r\n const isFirstIntersectedRoof = intersectionObjects[0].eventObject.userData.roofId === id;\r\n\r\n if (isFirstIntersectedRoof) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === selectedElement.id) {\r\n const { roofId, foundation, centroid, roofSegments } = intersectionObjects[0].eventObject\r\n .userData as RoofSegmentGroupUserData;\r\n\r\n if (foundation && centroid && roofSegments && roofId) {\r\n const pointer = intersectionObjects[0].point;\r\n const posRelToFoundation = new Vector3()\r\n .subVectors(pointer, new Vector3(foundation.cx, foundation.cy))\r\n .applyEuler(new Euler(0, 0, -foundation.rotation[2]));\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n const { normal, rotation } = RoofUtil.computeState(roofSegments, posRelToCentroid);\r\n e.cx = posRelToFoundation.x / foundation.lx;\r\n e.cy = posRelToFoundation.y / foundation.ly;\r\n e.cz = posRelToFoundation.z - foundation.lz;\r\n e.rotation = [...rotation];\r\n e.normal = normal.toArray();\r\n e.parentId = roofId;\r\n e.foundationId = foundation.id;\r\n if (e.type === ObjectType.SolarPanel) {\r\n (e as SolarPanelModel).parentType = ObjectType.Roof;\r\n e.color = '#fff';\r\n }\r\n if (state.selectedElement) {\r\n state.selectedElement.parentId = roofId;\r\n state.selectedElement.foundationId = foundation.id;\r\n }\r\n usePrimitiveStore.getState().setPrimitiveStore('showWallIntersectionPlaneId', null);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const handleContextMenu = (e: ThreeEvent, id: string) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === e.eventObject.name) {\r\n e.stopPropagation();\r\n useStore.getState().set((state) => {\r\n state.contextMenuObjectType = ObjectType.Roof;\r\n state.pastePoint.copy(e.intersections[0].point);\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.selected = true;\r\n state.selectedElement = e;\r\n\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport const RoofHandle = ({ position, onPointerDown, onPointerUp, onPointerOver }: RoofHandleProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const roofHandleSize = useHandleSize();\r\n const { gl } = useThree();\r\n\r\n const pointerDownRef = useRef(false);\r\n const hoveredRef = useRef(false);\r\n const haveFiredEvent = useRef(false);\r\n const handleRef = useRef();\r\n\r\n const [color, setColor] = useState('white');\r\n\r\n const setHeightLight = (b: boolean) => {\r\n if (b) {\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n gl.domElement.style.cursor = 'pointer';\r\n } else {\r\n setColor('white');\r\n gl.domElement.style.cursor = 'default';\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n if (hoveredRef.current) {\r\n haveFiredEvent.current = true;\r\n }\r\n\r\n if (!hoveredRef.current && pointerDownRef.current) {\r\n setHeightLight(false);\r\n }\r\n pointerDownRef.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const isFirstHandle = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n for (const { eventObject } of e.intersections) {\r\n if (eventObject.name === 'Roof Handle') {\r\n return eventObject === handleRef.current;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n return (\r\n {\r\n if (isFirstHandle(e)) {\r\n haveFiredEvent.current = false;\r\n if (!hoveredRef.current) {\r\n hoveredRef.current = true;\r\n setHeightLight(true);\r\n }\r\n } else {\r\n setColor('white');\r\n }\r\n }}\r\n // this will fire once after pointerup when hovered\r\n onPointerOut={(e) => {\r\n if (haveFiredEvent.current) {\r\n return;\r\n }\r\n if (!pointerDownRef.current) {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === 'Roof Handle') {\r\n setColor('white');\r\n } else {\r\n setHeightLight(false);\r\n }\r\n }\r\n hoveredRef.current = false;\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n }}\r\n onPointerDown={(e) => {\r\n if (isFirstHandle(e)) {\r\n if (onPointerDown) {\r\n onPointerDown(e);\r\n }\r\n pointerDownRef.current = true;\r\n }\r\n }}\r\n onPointerUp={(e) => {\r\n if (isFirstHandle(e)) {\r\n if (onPointerUp) {\r\n onPointerUp(e);\r\n }\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n if (isFirstHandle(e)) {\r\n if (onPointerOver) {\r\n onPointerOver(e);\r\n }\r\n }\r\n }}\r\n onPointerLeave={(e) => {\r\n if (isFirstHandle(e)) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n }\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport interface RoofRendererProps extends BuildingParts {\r\n roofModel: RoofModel;\r\n}\r\n\r\nconst RoofRenderer = ({ roofModel, foundationModel }: RoofRendererProps) => {\r\n const removeElementById = useStore(Selector.removeElementById);\r\n\r\n const { id, wallsId, roofType } = roofModel;\r\n\r\n useEffect(() => {\r\n if (wallsId.length === 0) {\r\n removeElementById(id, false);\r\n }\r\n }, [wallsId]);\r\n\r\n const renderRoof = () => {\r\n switch (roofType) {\r\n case RoofType.Pyramid:\r\n return ;\r\n case RoofType.Gable:\r\n return ;\r\n case RoofType.Hip:\r\n return ;\r\n case RoofType.Gambrel:\r\n return ;\r\n case RoofType.Mansard:\r\n return ;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return renderRoof();\r\n};\r\n\r\nexport function areRoofsEqual(prev: RoofRendererProps, curr: RoofRendererProps) {\r\n return (\r\n prev.roofModel === curr.roofModel &&\r\n prev.foundationModel.lx === curr.foundationModel.lx &&\r\n prev.foundationModel.ly === curr.foundationModel.ly &&\r\n prev.foundationModel.lz === curr.foundationModel.lz\r\n );\r\n}\r\n\r\nexport default React.memo(RoofRenderer, areRoofsEqual);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Undoable } from './Undoable';\r\nimport { ElementModel } from '../models/ElementModel';\r\n\r\nexport interface UndoableAdd extends Undoable {\r\n addedElement: ElementModel;\r\n}\r\n\r\nexport interface UndoableAddWall extends UndoableAdd {\r\n flippedWallSide: FlippedWallSide;\r\n}\r\n\r\nexport enum FlippedWallSide {\r\n left = 'Left',\r\n right = 'Right',\r\n loop = 'Loop',\r\n null = 'Null',\r\n}\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ObjectType, RoofTexture } from 'src/types';\r\n\r\nimport RoofTextureDefault from 'src/resources/roof_edge.png';\r\nimport RoofTexture00 from 'src/resources/tiny_white_square.png';\r\nimport RoofTexture01 from 'src/resources/roof_01.png';\r\nimport RoofTexture02 from 'src/resources/roof_02.png';\r\nimport RoofTexture03 from 'src/resources/roof_03.png';\r\nimport RoofTexture04 from 'src/resources/roof_04.png';\r\nimport RoofTexture05 from 'src/resources/roof_05.png';\r\nimport RoofTexture06 from 'src/resources/roof_06.png';\r\nimport RoofTexture07 from 'src/resources/roof_07.png';\r\nimport { RepeatWrapping, TextureLoader, Vector3 } from 'three';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useThree } from '@react-three/fiber';\r\nimport { RoofSegmentGroupUserData, RoofSegmentProps, updateRooftopElements } from './roofRenderer';\r\nimport { RoofUtil } from './RoofUtil';\r\nimport { GambrelRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { getRoofPointsOfGambrelRoof } from './flatRoof';\r\nimport shallow from 'zustand/shallow';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { useDataStore } from 'src/stores/commonData';\r\nimport { useLatestFoundation } from '../wall/hooks';\r\n\r\nexport type ComposedWall = {\r\n leftPoint: Vector3;\r\n rightPoint: Vector3;\r\n relativeAngle: number;\r\n lz: number;\r\n eavesLength: number;\r\n wallsId: string[];\r\n};\r\n\r\nexport const useRoofTexture = (textureType: RoofTexture) => {\r\n const textureLoader = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case RoofTexture.NoTexture:\r\n textureImg = RoofTexture00;\r\n break;\r\n case RoofTexture.Texture01:\r\n textureImg = RoofTexture01;\r\n break;\r\n case RoofTexture.Texture02:\r\n textureImg = RoofTexture02;\r\n break;\r\n case RoofTexture.Texture03:\r\n textureImg = RoofTexture03;\r\n break;\r\n case RoofTexture.Texture04:\r\n textureImg = RoofTexture04;\r\n break;\r\n case RoofTexture.Texture05:\r\n textureImg = RoofTexture05;\r\n break;\r\n case RoofTexture.Texture06:\r\n textureImg = RoofTexture06;\r\n break;\r\n case RoofTexture.Texture07:\r\n textureImg = RoofTexture07;\r\n break;\r\n default:\r\n textureImg = RoofTextureDefault;\r\n }\r\n return new TextureLoader().load(textureImg, (texture) => {\r\n texture.wrapS = texture.wrapT = RepeatWrapping;\r\n switch (textureType) {\r\n case RoofTexture.NoTexture:\r\n case RoofTexture.Default:\r\n texture.repeat.set(5, 3);\r\n break;\r\n case RoofTexture.Texture01:\r\n texture.repeat.set(0.5, 0.25);\r\n break;\r\n case RoofTexture.Texture03:\r\n texture.repeat.set(0.9, 0.9);\r\n break;\r\n case RoofTexture.Texture04:\r\n case RoofTexture.Texture05:\r\n case RoofTexture.Texture06:\r\n texture.repeat.set(0.75, 0.75);\r\n break;\r\n default:\r\n texture.repeat.set(0.5, 0.5);\r\n }\r\n setTexture(texture);\r\n invalidate();\r\n });\r\n }, [textureType]);\r\n\r\n const [texture, setTexture] = useState(textureLoader);\r\n const { invalidate } = useThree();\r\n return texture;\r\n};\r\n\r\nexport const useTransparent = (transparent?: boolean, opacity?: number) => {\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n\r\n const _transparent = groundImage && orthographic;\r\n const _opacity = _transparent ? 0.25 : 1;\r\n\r\n return { transparent: transparent || _transparent, opacity: Math.min(opacity !== undefined ? opacity : 1, _opacity) };\r\n};\r\n\r\nexport const useMultiCurrWallArray = (fId: string | undefined, roofId: string, wallsId: string[]) => {\r\n const wallsOnSameFoundation = useStore(\r\n (state) => state.elements.filter((e) => e.foundationId === fId && e.type === ObjectType.Wall),\r\n shallow,\r\n );\r\n\r\n const getWallOnSameFoundation = (id: string) => wallsOnSameFoundation.find((e) => e.id === id) as WallModel;\r\n\r\n const isLoopRef = useRef(false);\r\n\r\n const currentWallArray = useMemo(() => {\r\n for (const wid of wallsId) {\r\n let wall = getWallOnSameFoundation(wid) as WallModel;\r\n if (!wall) return [];\r\n\r\n const array = [];\r\n const startWall = wall;\r\n let i = 0;\r\n while (wall && (!wall.roofId || wall.roofId === roofId) && i++ < 100) {\r\n array.push(wall);\r\n if (wall.leftJoints[0]) {\r\n if (wall.leftJoints[0] !== startWall.id) {\r\n wall = getWallOnSameFoundation(wall.leftJoints[0]) as WallModel;\r\n }\r\n // is a loop\r\n else {\r\n array.reverse();\r\n isLoopRef.current = true;\r\n return array;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n array.reverse();\r\n\r\n wall = getWallOnSameFoundation(startWall.rightJoints[0]) as WallModel;\r\n i = 0;\r\n while (wall && (!wall.roofId || wall.roofId === roofId) && i++ < 100) {\r\n array.push(wall);\r\n if (wall.rightJoints[0] && wall.rightJoints[0] !== startWall.id) {\r\n wall = getWallOnSameFoundation(wall.rightJoints[0]) as WallModel;\r\n } else {\r\n break;\r\n }\r\n }\r\n isLoopRef.current = false;\r\n if (array.length > 1) {\r\n return array;\r\n }\r\n }\r\n return [];\r\n }, [wallsId, wallsOnSameFoundation]);\r\n\r\n return { currentWallArray, isLoopRef };\r\n};\r\n\r\nexport const useComposedWallArray = (wId: string, fId: string) => {\r\n const wallsOnSameFoundation = useStore(\r\n (state) => state.elements.filter((e) => e.foundationId === fId && e.type === ObjectType.Wall),\r\n shallow,\r\n );\r\n\r\n const composedWallsArray = useMemo(() => {\r\n const getWallOnSameFoundation = (id: string) => wallsOnSameFoundation.find((e) => e.id === id) as WallModel;\r\n\r\n const wallMap = new Map();\r\n const rotationMap = new Map();\r\n const startWall: WallModel | null = getWallOnSameFoundation(wId);\r\n let wall: WallModel | null = startWall;\r\n let count = 0;\r\n let isLoop = false;\r\n\r\n while (wall && wall.type === ObjectType.Wall && count < 100) {\r\n wallMap.set(wall.id, wall);\r\n const rotation = wall.relativeAngle.toFixed(1);\r\n if (rotationMap.has(rotation)) {\r\n rotationMap.get(rotation)?.push(wall);\r\n } else {\r\n rotationMap.set(rotation, [wall]);\r\n }\r\n if (wall.rightJoints.length !== 0) {\r\n wall = getWallOnSameFoundation(wall.rightJoints[0]);\r\n if (wall && wall.id === startWall.id) {\r\n isLoop = true;\r\n break;\r\n }\r\n count++;\r\n } else {\r\n wall = null;\r\n }\r\n }\r\n\r\n if (!isLoop || rotationMap.size !== 4) return null;\r\n\r\n const arr: ComposedWall[] = [];\r\n for (const [rot, walls] of rotationMap) {\r\n // check connection\r\n let count = 0;\r\n for (const wall of walls) {\r\n const lw = wallMap.get(wall.leftJoints[0]);\r\n const rw = wallMap.get(wall.rightJoints[0]);\r\n if (lw && lw.relativeAngle.toFixed(1) !== rot) {\r\n count++;\r\n }\r\n if (rw && rw.relativeAngle.toFixed(1) !== rot) {\r\n count++;\r\n }\r\n if (count > 2) break;\r\n }\r\n if (count !== 2) return null;\r\n\r\n let leftMostWall: WallModel | null = null;\r\n let rightMostWall: WallModel | null = null;\r\n let highestLz = 0;\r\n let longestEavesLength = -1;\r\n for (const wall of walls) {\r\n const lw = wallMap.get(wall.leftJoints[0]);\r\n const rw = wallMap.get(wall.rightJoints[0]);\r\n highestLz = Math.max(highestLz, wall.lz);\r\n longestEavesLength = Math.max(longestEavesLength, wall.eavesLength);\r\n if (lw && lw.relativeAngle.toFixed(1) !== rot) {\r\n leftMostWall = wall;\r\n }\r\n if (rw && rw.relativeAngle.toFixed(1) !== rot) {\r\n rightMostWall = wall;\r\n }\r\n }\r\n\r\n if (leftMostWall && rightMostWall && highestLz > 0 && longestEavesLength !== -1) {\r\n arr.push({\r\n leftPoint: new Vector3().fromArray(leftMostWall.leftPoint),\r\n rightPoint: new Vector3().fromArray(rightMostWall.rightPoint),\r\n relativeAngle: leftMostWall.relativeAngle,\r\n lz: highestLz,\r\n eavesLength: longestEavesLength,\r\n wallsId: walls.map((w) => w.id),\r\n });\r\n }\r\n }\r\n\r\n if (arr.length !== 4) return null;\r\n return arr;\r\n }, [wallsOnSameFoundation]);\r\n\r\n return composedWallsArray;\r\n};\r\n\r\nexport const useComposedRoofHeight = (composedWallArray: ComposedWall[] | null, rise: number, isGabled?: boolean) => {\r\n const highestWallHeight = useMemo(\r\n () => RoofUtil.getHighestComposedWallHeight(composedWallArray, isGabled),\r\n [composedWallArray],\r\n );\r\n\r\n const topZ = useMemo(() => highestWallHeight + rise, [highestWallHeight, rise]); // height from top to foundation\r\n\r\n return { highestWallHeight, topZ };\r\n};\r\n\r\nexport const useRoofHeight = (currentWallArray: WallModel[], rise: number, ignoreSide?: boolean) => {\r\n const highestWallHeight = useMemo(\r\n () => RoofUtil.getHighestWallHeight(currentWallArray, ignoreSide),\r\n [currentWallArray],\r\n );\r\n const [riseInnerState, setRiseInnerState] = useState(rise); // height from top to maxWallHeight\r\n const topZ = highestWallHeight + riseInnerState; // height from top to foundation\r\n useEffect(() => {\r\n if (rise !== riseInnerState) {\r\n setRiseInnerState(rise);\r\n }\r\n }, [rise]);\r\n\r\n return { highestWallHeight, topZ, riseInnerState, setRiseInnerState };\r\n};\r\n\r\nexport const useUpdateSegmentVerticesMap = (\r\n roofId: string,\r\n centroid: Vector3,\r\n roofSegments: RoofSegmentProps[],\r\n isFlat: boolean,\r\n roofType: RoofType,\r\n mansardTop?: Vector3[],\r\n) => {\r\n const runDynamicSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\r\n const runStaticSimulation = usePrimitiveStore(Selector.runStaticSimulation);\r\n const runDailyThermalSimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\r\n\r\n const updateSegmentVertices = () => {\r\n const relToFoundation = (v: Vector3) => v.clone().add(centroid);\r\n\r\n let vertices: Vector3[][] = [];\r\n\r\n // FIXME\r\n // In the following, the vertices are relative to the foundation only in terms of position.\r\n // To get the absolute coordinates, we must apply the foundation's orientation.\r\n if (isFlat) {\r\n if (roofType === RoofType.Gambrel) {\r\n vertices.push(getRoofPointsOfGambrelRoof(roofSegments).map(relToFoundation));\r\n } else {\r\n const points: Vector3[] = [];\r\n for (const segment of roofSegments) {\r\n points.push(segment.points[1].clone().add(centroid));\r\n }\r\n vertices.push(points);\r\n }\r\n } else {\r\n for (const segment of roofSegments) {\r\n const points = segment.points;\r\n // triangle segment\r\n if (points.length === 6) {\r\n vertices.push(points.slice(3).map(relToFoundation));\r\n }\r\n // quad segment\r\n else if (points.length === 8) {\r\n vertices.push(points.slice(4).map(relToFoundation));\r\n } else {\r\n throw new Error('Invalid Roof segment data');\r\n }\r\n }\r\n if (mansardTop) {\r\n vertices.push(mansardTop);\r\n }\r\n }\r\n useDataStore.getState().setRoofSegmentVertices(roofId, vertices);\r\n return vertices;\r\n };\r\n\r\n // we don't render heatmaps in yearly thermal simulations\r\n if (runDynamicSimulation || runStaticSimulation || runDailyThermalSimulation) {\r\n updateSegmentVertices();\r\n }\r\n\r\n useEffect(() => {\r\n updateSegmentVertices();\r\n }, [roofSegments]);\r\n\r\n return updateSegmentVertices;\r\n};\r\n\r\nexport const useUpdateSegmentVerticesWithoutOverhangMap = (update: () => void): void => {\r\n const runDailyThermalSimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\r\n const runYearlyThermalSimulation = usePrimitiveStore(Selector.runYearlyThermalSimulation);\r\n\r\n if (runDailyThermalSimulation || runYearlyThermalSimulation) {\r\n update();\r\n }\r\n};\r\n\r\nexport const useUpdateOldRoofFiles = (roofModel: RoofModel, highestWallHeight: number) => {\r\n const fileChanged = useStore(Selector.fileChanged);\r\n useEffect(() => {\r\n if (roofModel.rise === undefined) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === roofModel.id && e.type === ObjectType.Roof) {\r\n const roof = e as RoofModel;\r\n if (roof.rise === undefined) {\r\n roof.rise = roof.lz - highestWallHeight;\r\n roof.lz = 0;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }, [fileChanged]);\r\n};\r\n\r\nexport const useUpdateAfterMounted = () => {\r\n const [, setUpdate] = useState(false);\r\n useEffect(() => {\r\n setUpdate((b) => !b);\r\n }, []);\r\n};\r\n\r\nexport const useIsFirstRender = () => {\r\n const isFirstRenderRef = useRef(true);\r\n if (isFirstRenderRef.current) {\r\n isFirstRenderRef.current = false;\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport const useUpdateRooftopElementsByContextMenuChanges = (\r\n foundation: FoundationModel | null,\r\n roofId: string,\r\n roofSegments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n topZ: number,\r\n thickness: number,\r\n isFlatGambrel?: boolean,\r\n) => {\r\n const updateFlag = useStore((state) => state.updateElementOnRoofFlag);\r\n\r\n // only update by context menu changes\r\n useEffect(() => {\r\n if (updateFlag) {\r\n updateRooftopElements(foundation, roofId, roofSegments, centroid, topZ, thickness, isFlatGambrel);\r\n useStore.getState().setUpdateElementOnRoofFlag(false);\r\n }\r\n }, [topZ, thickness, updateFlag]);\r\n};\r\n\r\nexport const useUpdateRooftopElementsByControlPoints = (\r\n foundation: FoundationModel | null,\r\n rId: string,\r\n segments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n topZ: number,\r\n thickness: number,\r\n isFlatGambrel?: boolean,\r\n) => {\r\n const isFirstRender = useIsFirstRender();\r\n useEffect(() => {\r\n if (isFirstRender) return;\r\n updateRooftopElements(foundation, rId, segments, centroid, topZ, thickness, isFlatGambrel);\r\n }, [segments]);\r\n};\r\n\r\nexport const useUpdateRooftopElements = (\r\n foundation: FoundationModel | null,\r\n roofId: string,\r\n segments: RoofSegmentProps[],\r\n centroid: Vector3,\r\n topZ: number,\r\n thickness: number,\r\n isFlatGambrel?: boolean,\r\n) => {\r\n useUpdateRooftopElementsByControlPoints(foundation, roofId, segments, centroid, topZ, thickness, isFlatGambrel);\r\n useUpdateRooftopElementsByContextMenuChanges(foundation, roofId, segments, centroid, topZ, thickness, isFlatGambrel);\r\n};\r\n\r\nexport const useUserData = (\r\n roofId: string,\r\n foundationModel: FoundationModel,\r\n centroid: Vector3,\r\n roofSegments: RoofSegmentProps[],\r\n) => {\r\n const latestFoundation = useLatestFoundation(foundationModel);\r\n\r\n // used for move rooftop elements between different roofs, passed to handlePointerMove in roofRenderer\r\n const userData: RoofSegmentGroupUserData = useMemo(\r\n () => ({\r\n roofId: roofId,\r\n foundation: latestFoundation,\r\n centroid: centroid,\r\n roofSegments: roofSegments,\r\n }),\r\n [roofId, centroid, roofSegments, latestFoundation],\r\n );\r\n\r\n return userData;\r\n};\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC\"","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport {\r\n BoxBufferGeometry,\r\n BufferGeometry,\r\n CanvasTexture,\r\n Euler,\r\n ExtrudeBufferGeometry,\r\n FrontSide,\r\n Material,\r\n Mesh,\r\n Shape,\r\n Vector3,\r\n} from 'three';\r\nimport { RoofSegmentProps } from './roofRenderer';\r\nimport { ObjectType, RoofTexture } from 'src/types';\r\nimport React, { useMemo, useRef } from 'react';\r\nimport { CSG } from 'three-csg-ts';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useDataStore } from 'src/stores/commonData';\r\nimport { useRoofTexture, useTransparent, useUpdateAfterMounted } from './hooks';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n} from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { Util } from 'src/Util';\r\nimport { Cone, Line } from '@react-three/drei';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { getPolygonWindowShape } from '../window/polygonalWindow';\r\nimport { getArchedWindowShape } from '../window/archedWindow';\r\nimport { FoundationModel } from '../../models/FoundationModel';\r\nimport { RoofType } from '../../models/RoofModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\nimport shallow from 'zustand/shallow';\r\n\r\ninterface TopExtrudeProps {\r\n uuid?: string;\r\n simulation?: boolean;\r\n shape: Shape;\r\n thickness: number;\r\n holeMeshes: Mesh[];\r\n castShadow: boolean;\r\n receiveShadow: boolean;\r\n children: JSX.Element;\r\n}\r\n\r\ninterface FlatRoofProps {\r\n id: string;\r\n foundationModel: FoundationModel | null;\r\n roofType: RoofType;\r\n roofSegments: RoofSegmentProps[];\r\n center: Vector3;\r\n thickness: number;\r\n lineWidth: number;\r\n lineColor: string;\r\n sideColor: string;\r\n color: string;\r\n textureType: RoofTexture;\r\n heatmap: CanvasTexture | null;\r\n}\r\n\r\nconst drawShapeOfGambrelRoof = (shape: Shape, roofSegments: RoofSegmentProps[]) => {\r\n const [frontSide, frontTop, backTop, backSide] = roofSegments;\r\n shape.moveTo(frontSide.points[0].x, frontSide.points[0].y);\r\n shape.lineTo(frontSide.points[1].x, frontSide.points[1].y);\r\n shape.lineTo(backSide.points[0].x, backSide.points[0].y);\r\n shape.lineTo(backSide.points[1].x, backSide.points[1].y);\r\n shape.closePath();\r\n};\r\n\r\nexport const getRoofPointsOfGambrelRoof = (roofSegments: RoofSegmentProps[], array?: Vector3[]) => {\r\n const arr: Vector3[] = [];\r\n const [frontSide, frontTop, backTop, backSide] = roofSegments;\r\n arr.push(frontSide.points[0].clone());\r\n arr.push(frontSide.points[1].clone());\r\n arr.push(backSide.points[0].clone());\r\n arr.push(backSide.points[1].clone());\r\n if (array) {\r\n array.push(...arr);\r\n return array;\r\n } else {\r\n return arr;\r\n }\r\n};\r\n\r\nexport const TopExtrude = ({\r\n uuid,\r\n shape,\r\n thickness,\r\n holeMeshes,\r\n simulation,\r\n castShadow,\r\n receiveShadow,\r\n children,\r\n}: TopExtrudeProps) => {\r\n const ref = useRef(null);\r\n\r\n if (ref.current) {\r\n ref.current.geometry = new ExtrudeBufferGeometry(shape, { steps: 1, depth: thickness, bevelEnabled: false });\r\n ref.current.updateMatrix();\r\n\r\n if (holeMeshes.length > 0) {\r\n const operationBuffer: Mesh[] = [];\r\n\r\n for (let i = 0; i < holeMeshes.length; i++) {\r\n const holeMesh = holeMeshes[i];\r\n if (i === 0) {\r\n operationBuffer.push(CSG.subtract(ref.current, holeMesh));\r\n } else {\r\n operationBuffer.push(CSG.subtract(operationBuffer[i - 1], holeMesh));\r\n }\r\n }\r\n\r\n const resultMesh = operationBuffer.pop();\r\n\r\n if (resultMesh) {\r\n ref.current.geometry = resultMesh.geometry;\r\n ref.current.updateMatrix();\r\n }\r\n }\r\n }\r\n\r\n useUpdateAfterMounted();\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nconst FlatRoof = ({\r\n id,\r\n foundationModel,\r\n roofType,\r\n roofSegments,\r\n center,\r\n thickness,\r\n lineColor,\r\n lineWidth,\r\n sideColor,\r\n color,\r\n textureType,\r\n heatmap,\r\n}: FlatRoofProps) => {\r\n const world = useStore.getState().world;\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\r\n const hourlyHeatExchangeArrayMap = useDataStore.getState().hourlyHeatExchangeArrayMap;\r\n\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowLength = useRef();\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const { transparent, opacity } = useTransparent();\r\n\r\n const windows = useStore(\r\n (state) => state.elements.filter((e) => e.type === ObjectType.Window && e.parentId === id),\r\n shallow,\r\n ) as WindowModel[];\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (foundationModel && foundationModel.notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const segments = getRoofSegmentVerticesWithoutOverhang(id);\r\n if (!segments || !segments[0]) return undefined;\r\n const vectors: Vector3[][] = [];\r\n const s = segments[0].map((v) => v.clone().sub(center));\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const s0 = s[0].clone();\r\n const s1 = s[1].clone();\r\n const s2 = s[2].clone();\r\n const v10 = new Vector3().subVectors(s1, s0);\r\n const v20 = new Vector3().subVectors(s2, s0);\r\n const v21 = new Vector3().subVectors(s2, s1);\r\n const length10 = v10.length();\r\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\r\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\r\n const m = Math.max(2, Math.floor(length10 / cellSize));\r\n const n = Math.max(2, Math.floor(distance / cellSize));\r\n v10.normalize();\r\n v20.normalize();\r\n v21.normalize();\r\n // find the normal vector of the quad\r\n const normal = new Vector3().crossVectors(v20, v21).normalize();\r\n // find the incremental vector going along the bottom edge (half of length)\r\n const dm = v10.multiplyScalar((0.5 * length10) / m);\r\n // find the incremental vector going from bottom to top (half of length)\r\n const dn = new Vector3()\r\n .crossVectors(normal, v10)\r\n .normalize()\r\n .multiplyScalar((0.5 * distance) / n);\r\n // find the starting point of the grid (shift half of length in both directions)\r\n const v0 = s0.clone().add(dm).add(dn).add(new Vector3(0, 0, thickness));\r\n // double half-length to full-length for the increment vectors in both directions\r\n dm.multiplyScalar(2);\r\n dn.multiplyScalar(2);\r\n heatFluxArrowLength.current = normal.clone().multiplyScalar(0.1);\r\n const origin = new Vector3();\r\n const vertices = new Array();\r\n for (const p of s) {\r\n vertices.push({ x: p.x, y: p.y } as Point2);\r\n }\r\n const area = Util.getPolygonArea(vertices);\r\n if (area === 0) return undefined;\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowEuler.current = new Euler(-Math.sign(intensity) * HALF_PI, 0, 0);\r\n for (let p = 0; p < m; p++) {\r\n const dmp = dm.clone().multiplyScalar(p);\r\n for (let q = 0; q < n; q++) {\r\n origin.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\r\n if (Util.isPointInside(origin.x, origin.y, vertices)) {\r\n const v: Vector3[] = [];\r\n if (intensity < 0) {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(-intensity)));\r\n } else {\r\n v.push(origin.clone());\r\n v.push(origin.clone().add(normal.clone().multiplyScalar(intensity)));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [showHeatFluxes, heatFluxScaleFactor]);\r\n\r\n const wireFramePoints = useMemo(() => {\r\n // this can still be triggered when the roof is deleted because all walls are removed\r\n if (roofSegments.length === 0) return [new Vector3()];\r\n const points: Vector3[] = [];\r\n if (roofType === RoofType.Gambrel) {\r\n getRoofPointsOfGambrelRoof(roofSegments, points);\r\n const maxZ = points.reduce((prev, curr) => Math.max(prev, curr.z), 0);\r\n points.forEach((p) => p.setZ(maxZ));\r\n } else {\r\n points.push(roofSegments[0].points[0]);\r\n for (const segment of roofSegments) {\r\n const rightPoint = segment.points[1];\r\n points.push(rightPoint);\r\n }\r\n }\r\n return points;\r\n }, [roofSegments, roofType]);\r\n\r\n const thicknessVector = useMemo(() => {\r\n return new Vector3(0, 0, thickness);\r\n }, [thickness]);\r\n\r\n const periphery = ;\r\n const texture = useRoofTexture(textureType);\r\n\r\n const shape = useMemo(() => {\r\n const shape = new Shape();\r\n // this can still be triggered when the roof is deleted because all walls are removed\r\n if (roofSegments.length === 0) return shape;\r\n if (roofType === RoofType.Gambrel) {\r\n drawShapeOfGambrelRoof(shape, roofSegments);\r\n } else {\r\n const startPoint = roofSegments[0].points[0];\r\n shape.moveTo(startPoint.x, startPoint.y);\r\n for (const segment of roofSegments) {\r\n const rightPoint = segment.points[1];\r\n shape.lineTo(rightPoint.x, rightPoint.y);\r\n }\r\n shape.closePath();\r\n }\r\n return shape;\r\n }, [roofSegments, center, roofType]);\r\n\r\n const shapeWithHoles = useMemo(() => {\r\n const shape = new Shape();\r\n if (roofSegments.length === 0) return shape;\r\n if (roofType === RoofType.Gambrel) {\r\n drawShapeOfGambrelRoof(shape, roofSegments);\r\n } else {\r\n const startPoint = roofSegments[0].points[0];\r\n shape.moveTo(startPoint.x, startPoint.y);\r\n for (const segment of roofSegments) {\r\n const rightPoint = segment.points[1];\r\n shape.lineTo(rightPoint.x, rightPoint.y);\r\n }\r\n shape.closePath();\r\n }\r\n\r\n if (windows.length > 0) {\r\n for (const window of windows) {\r\n const c = new Vector3(window.cx, window.cy, window.cz).sub(center);\r\n switch (window.windowType) {\r\n case WindowType.Polygonal: {\r\n const [topX, topH] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n const [hx, hy, tx] = [window.lx / 2, window.lz / 2, topX * window.lx];\r\n const hole = getPolygonWindowShape(hx, hy, tx, topH, c.x, c.y);\r\n shape.holes.push(hole);\r\n break;\r\n }\r\n case WindowType.Arched: {\r\n const hole = getArchedWindowShape(window.lx, window.lz, window.archHeight, c.x, c.y);\r\n shape.holes.push(hole);\r\n break;\r\n }\r\n default: {\r\n const hole = new Shape();\r\n const [hx, hy] = [window.lx / 2, window.lz / 2];\r\n hole.moveTo(c.x - hx, c.y - hy);\r\n hole.lineTo(c.x + hx, c.y - hy);\r\n hole.lineTo(c.x + hx, c.y + hy);\r\n hole.lineTo(c.x - hx, c.y + hy);\r\n hole.closePath();\r\n shape.holes.push(hole);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return shape;\r\n }, [roofSegments, center, windows, roofType]);\r\n\r\n const holeMeshes = useMemo(\r\n () =>\r\n windows.map((window) => {\r\n const [a, b, c] = window.rotation;\r\n const position = new Vector3(window.cx, window.cy, window.cz).sub(center);\r\n const euler = new Euler().fromArray([...window.rotation, 'ZXY']);\r\n switch (window.windowType) {\r\n case WindowType.Polygonal: {\r\n const [topX, topH] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n const [hx, hy, tx] = [window.lx / 2, window.lz / 2, topX * window.lx];\r\n const shape = getPolygonWindowShape(hx, hy, tx, topH);\r\n const holeMesh = new Mesh(\r\n new ExtrudeBufferGeometry([shape], { steps: 1, depth: window.ly, bevelEnabled: false }),\r\n );\r\n const offset = new Vector3(0, 0, -window.ly).applyEuler(euler);\r\n holeMesh.position.copy(position.clone().add(offset));\r\n holeMesh.rotation.copy(euler);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }\r\n case WindowType.Arched: {\r\n const shape = getArchedWindowShape(window.lx, window.lz, window.archHeight);\r\n const holeMesh = new Mesh(\r\n new ExtrudeBufferGeometry([shape], { steps: 1, depth: window.ly, bevelEnabled: false }),\r\n );\r\n const offset = new Vector3(0, 0, -window.ly).applyEuler(euler);\r\n holeMesh.position.copy(position.clone().add(offset));\r\n holeMesh.rotation.copy(euler);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }\r\n default: {\r\n const holeMesh = new Mesh(new BoxBufferGeometry(window.lx, window.lz, window.ly * 2));\r\n holeMesh.position.copy(position);\r\n holeMesh.rotation.set(a, b, c);\r\n holeMesh.updateMatrix();\r\n return holeMesh;\r\n }\r\n }\r\n }),\r\n [windows, thickness],\r\n );\r\n\r\n const noTextureAndOneColor = textureType === RoofTexture.NoTexture && color && color === sideColor;\r\n const castShadow = shadowEnabled && !transparent;\r\n const showHeatmap = showSolarRadiationHeatmap && heatmap;\r\n\r\n return (\r\n <>\r\n {/*special case: the whole roof segment has no texture and only one color */}\r\n {noTextureAndOneColor && !showHeatmap ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {/* texture layer */}\r\n \r\n \r\n {showHeatmap ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {/* body */}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* wireframe */}\r\n {periphery}\r\n \r\n {periphery}\r\n {wireFramePoints.map((point, idx) => {\r\n const points = [point.clone().sub(thicknessVector), point];\r\n return ;\r\n })}\r\n \r\n\r\n {heatFluxes &&\r\n heatFluxes.map((v, index) => {\r\n return (\r\n \r\n \r\n ;\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default FlatRoof;\r\n","export default __webpack_public_path__ + \"static/media/foundation_01.bda6fc00.png\";","export default __webpack_public_path__ + \"static/media/foundation_02.a1240091.png\";","export default __webpack_public_path__ + \"static/media/foundation_03.6be5f733.png\";","export default __webpack_public_path__ + \"static/media/foundation_04.8100e8d2.png\";","export default __webpack_public_path__ + \"static/media/foundation_05.8164fdc8.png\";","export default __webpack_public_path__ + \"static/media/foundation_06.fc1babc0.png\";","export default __webpack_public_path__ + \"static/media/foundation_07.e759a1c6.png\";","export default __webpack_public_path__ + \"static/media/helvetiker_regular.typeface.9a3651b4.fnt\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { DoubleSide, FontLoader, TextGeometryParameters, Vector3 } from 'three';\r\nimport { useLoader } from '@react-three/fiber';\r\nimport { Ring } from '@react-three/drei';\r\nimport helvetikerFont from '../fonts/helvetiker_regular.typeface.fnt';\r\nimport { Util } from '../Util';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ObjectType } from '../types';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { HALF_PI } from '../constants';\r\n\r\nexport const PolarGrid = ({ element, height }: { element: ElementModel; height?: number }) => {\r\n const rotateHandle = useStore(Selector.rotateHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n const angle = useStore(Selector.selectedElementAngle);\r\n const getParent = useStore(Selector.getParent);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n\r\n const [position, setPosition] = useState();\r\n const [radius, setRadius] = useState(10);\r\n const [rotation, setRotation] = useState(0);\r\n\r\n useEffect(() => {\r\n if (rotateHandle || hoveredHandle) {\r\n const { cx, cy, lx, ly, type } = element;\r\n switch (type) {\r\n case ObjectType.SolarPanel:\r\n const currParent = getParent(element);\r\n if (currParent) {\r\n const rcx = cx * currParent.lx;\r\n const rcy = cy * currParent.ly;\r\n setPosition(new Vector3(rcx, rcy, height ?? currParent.lz));\r\n }\r\n break;\r\n case ObjectType.Foundation:\r\n setPosition(new Vector3(cx, cy, groundImage ? 0.1 : 0));\r\n break;\r\n case ObjectType.Cuboid:\r\n const { pos } = Util.getWorldDataById(element.id);\r\n const { rot } = Util.getWorldDataById(element.parentId);\r\n setPosition(new Vector3(pos.x, pos.y, pos.z - element.lz / 2 + 0.2));\r\n setRotation(rot);\r\n break;\r\n default:\r\n setPosition(new Vector3(cx, cy, groundImage ? 0.2 : 0));\r\n }\r\n setRadius(Math.max(5, Math.hypot(lx, ly) * 0.75));\r\n }\r\n }, [rotateHandle, hoveredHandle]);\r\n\r\n const font = useLoader(FontLoader, helvetikerFont);\r\n const fontSize = radius * 0.05;\r\n const textGeometryParams = {\r\n font: font,\r\n height: 0.0,\r\n size: fontSize,\r\n } as TextGeometryParameters;\r\n\r\n const tickLabels = new Array(25).fill(0);\r\n\r\n const getOffset = (i: number) => {\r\n if (i === 0) {\r\n return -fontSize * 0.3;\r\n } else if (i > 0 && i < 7) {\r\n return -fontSize * 0.8;\r\n } else {\r\n return -fontSize * 1.2;\r\n }\r\n };\r\n\r\n const color = groundImage ? '#222' : '#ccc';\r\n\r\n return (\r\n <>\r\n {position && (\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* shown angle */}\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* tick labels */}\r\n {tickLabels.map((v, i) => {\r\n let times = Math.ceil(i / 2) * (i % 2 === 0 ? 1 : -1);\r\n if (times === -12) times = 12;\r\n const offset = getOffset(Math.abs(times));\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n })}\r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(PolarGrid);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { Torus, Cone, Circle, Plane } from '@react-three/drei';\r\nimport { ActionType, MoveHandleType, ResizeHandleType, RotateHandleType } from '../types';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { HALF_PI, HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR } from '../constants';\r\n\r\nexport interface RotateHandleProps {\r\n id: string;\r\n position: [x: number, y: number, z: number];\r\n color?: string;\r\n ratio: number;\r\n handleType: RotateHandleType;\r\n hoverHandle: (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => void;\r\n noHoverHandle: () => void;\r\n}\r\n\r\nconst RotateHandle = ({ id, position, ratio, handleType, hoverHandle, noHoverHandle }: RotateHandleProps) => {\r\n const selectMe = useStore(Selector.selectMe);\r\n\r\n const rotateHandleType = useStore(Selector.rotateHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const color =\r\n hoveredHandle === handleType || rotateHandleType === handleType ? HIGHLIGHT_HANDLE_COLOR : RESIZE_HANDLE_COLOR;\r\n\r\n const rotationHandleLMesh = ;\r\n\r\n return (\r\n \r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Rotate);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, handleType);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(RotateHandle);\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n *\n * Not sure why I wanted wireframe to be treated differently in a previous version\n * when there is a ground image.\n */\n\nimport React from 'react';\nimport { Line } from '@react-three/drei';\n\nexport interface WireframeProps {\n hx: number;\n hy: number;\n hz: number;\n lineColor?: string;\n lineWidth?: number;\n}\n\nconst Wireframe = ({ hx, hy, hz, lineColor = 'black', lineWidth = 0.2 }: WireframeProps) => {\n return (\n \n );\n};\n\nexport default React.memo(Wireframe);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Line } from '@react-three/drei';\nimport { ElementModel } from '../models/ElementModel';\nimport { ObjectType, ResizeHandleType } from '../types';\nimport i18n from '../i18n/i18n';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\n\nexport interface HorizontalRulerProps {\n element: ElementModel;\n verticalLift: number;\n}\n\nexport const HorizontalRuler = ({ element, verticalLift }: HorizontalRulerProps) => {\n const language = useStore(Selector.language);\n const orthographic = useStore(Selector.viewState.orthographic);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const hoveredHandle = useStore(Selector.hoveredHandle);\n\n const hx = element.lx / 2;\n const hy = element.ly / 2;\n const rulerArrowOffset = 0.2;\n const rulerLineWidth = 1;\n const rulerTickMarkWidth = 0.5;\n const color = element.lineColor ?? 'white';\n const labelBackgroundColor = 'darkorchid';\n const ratio = Math.max(1, (hx + hy) / 32);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const rulerOffset = useMemo(() => {\n switch (element.type) {\n case ObjectType.Cuboid:\n return Math.max(0.5, Math.max(hx, hy) * 0.1);\n }\n return 0.5;\n }, [element.type, hx, hy]);\n\n const hz = useMemo(() => {\n switch (element.type) {\n case ObjectType.Cuboid:\n return orthographic ? element.lz / 2 + 0.1 : -element.lz / 2 + 0.1;\n case ObjectType.Foundation:\n return element.lz + 0.1;\n }\n return 0.1;\n }, [element.type, element.lz]);\n\n const ll2ul = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hy, hz]);\n\n const lr2ur = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hy, hz]);\n\n const ll2lr = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hy, hz]);\n\n const ul2ur = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hy, hz]);\n\n if (resizeHandleType) {\n if (element.type === ObjectType.Wall) {\n switch (resizeHandleType) {\n case ResizeHandleType.LowerLeft:\n return ll2lr;\n case ResizeHandleType.LowerRight:\n return ll2lr;\n }\n } else {\n switch (resizeHandleType) {\n case ResizeHandleType.LowerLeft:\n return (\n <>\n {ll2ul}\n {ll2lr}\n \n );\n case ResizeHandleType.LowerRight:\n return (\n <>\n {lr2ur}\n {ll2lr}\n \n );\n case ResizeHandleType.UpperLeft:\n return (\n <>\n {ll2ul}\n {ul2ur}\n \n );\n case ResizeHandleType.UpperRight:\n return (\n <>\n {lr2ur}\n {ul2ur}\n \n );\n }\n }\n }\n\n if (hoveredHandle) {\n if (element.type === ObjectType.Wall) {\n switch (hoveredHandle) {\n case ResizeHandleType.LowerLeft:\n return ll2lr;\n case ResizeHandleType.LowerRight:\n return ll2lr;\n }\n } else {\n switch (hoveredHandle) {\n case ResizeHandleType.LowerLeft:\n return (\n <>\n {ll2ul}\n {ll2lr}\n \n );\n case ResizeHandleType.LowerRight:\n return (\n <>\n {lr2ur}\n {ll2lr}\n \n );\n case ResizeHandleType.UpperLeft:\n return (\n <>\n {ll2ul}\n {ul2ur}\n \n );\n case ResizeHandleType.UpperRight:\n return (\n <>\n {lr2ur}\n {ul2ur}\n \n );\n }\n }\n }\n\n return <>;\n};\n\nexport default React.memo(HorizontalRuler);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\n// in kW/m^2, see http://en.wikipedia.org/wiki/Solar_constant\nexport const SOLAR_CONSTANT = 1.361;\n\n// in m/s^2\nexport const GRAVITATIONAL_ACCELERATION = 9.8067;\n\n// in J/(kg*K) https://www.engineeringtoolbox.com/air-specific-heat-capacity-d_705.html\nexport const AIR_ISOBARIC_SPECIFIC_HEAT = 1012;\n\n// in kg/m^3 (at 101.325 kPa and 15 °C)\nexport const AIR_DENSITY = 1.225;\n\n// 0 °C in K\nexport const KELVIN_AT_ZERO_CELSIUS = 273.15;\n\n// in W/(m^2*K^4) Stefan–Boltzmann constant\nexport const STEFAN_BOLTZMANN_CONSTANT = 5.67e-8;\n\n// original ASHRAE_C = [0.058, 0.060, 0.071, 0.097, 0.121, 0.134, 0.136, 0.122, 0.092, 0.073, 0.063, 0.057];\n// http://www.physics.arizona.edu/~cronin/Solar/References/Irradiance%20Models%20and%20Data/WOC01.pdf\n// revised C coefficients found from Iqbal's book\nexport const ASHRAE_C = [0.103, 0.104, 0.109, 0.12, 0.13, 0.137, 0.138, 0.134, 0.121, 0.111, 0.106, 0.103];\n\nexport enum AirMass {\n NONE = 0,\n KASTEN_YOUNG = 1,\n SPHERE_MODEL = 2,\n}\n\nexport const MINUTES_OF_DAY = 1440;\n\n// the daily cycle is 1440 minutes\nexport const OMEGA_DAY = Math.PI / 720;\n\n// the annual cycle is 365 days\nexport const OMEGA_YEAR = Math.PI / 182.5;\n\nexport const YEARLY_LAG_IN_DAYS = 30;\n\nexport const DAILY_LAG_IN_MINUTES = 120;\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { DoorTexture } from 'src/types';\nimport { ElementModel } from './ElementModel';\n\nexport interface DoorModel extends ElementModel {\n uValue: number;\n volumetricHeatCapacity: number;\n textureType: DoorTexture;\n doorType: DoorType;\n\n archHeight: number;\n filled: boolean;\n opacity?: number;\n frameColor?: string;\n\n // Is this door inside a building? If yes, this will be no heat exchange. By default, it is not.\n interior?: boolean;\n}\n\nexport enum DoorType {\n Default = 'Default',\n Arched = 'Arched',\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nexport class SunMinutes {\n sunrise: number; // sunrise time in minutes from midnight\n sunset: number; // sunset time in minutes from midnight\n\n constructor(sunrise: number, sunset: number) {\n this.sunrise = sunrise;\n this.sunset = sunset;\n }\n\n daylight() {\n return this.sunset - this.sunrise;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Vector3 } from 'three';\nimport { Util } from '../Util';\nimport { AirMass, ASHRAE_C, SOLAR_CONSTANT } from './analysisConstants';\nimport { GroundModel } from '../models/GroundModel';\nimport { TWO_PI, UNIT_VECTOR_POS_Z } from '../constants';\nimport { SunMinutes } from './SunMinutes';\n\n// An object receives no indirect solar radiation if its distance to the nearest object\n// in the light path is shorter than this threshold.\nexport const AMBIENT_LIGHT_THRESHOLD = 0.5;\n\n// This is used to offset a roof by default in solar radiation calculation\nexport const ROOFTOP_SOLAR_PANEL_OFFSET = 0.1;\n\nexport const TILT_ANGLE = (23.45 / 180.0) * Math.PI;\n\nconst DAY_MILLISECONDS = 1000 * 60 * 60 * 24;\nconst HALF_DAY_MINUTES = 720;\n\nexport const computeDeclinationAngle = (date: Date) => {\n const days = Math.floor((date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / DAY_MILLISECONDS);\n return TILT_ANGLE * Math.sin((TWO_PI * (284 + days)) / 365.25);\n};\n\n// https://en.wikipedia.org/wiki/Sunrise_equation\n// from sunrise to noon and from noon to sunset have the same minutes\nexport const computeSunriseAndSunsetInMinutes = (date: Date, latitude: number) => {\n const a = Math.tan(Util.toRadians(latitude)) * Math.tan(computeDeclinationAngle(date));\n if (Math.abs(a) > 1) {\n return new SunMinutes(0, a > 0 ? HALF_DAY_MINUTES * 2 : 0);\n }\n const b = (60 * Math.acos(-a)) / Util.toRadians(15);\n return new SunMinutes(HALF_DAY_MINUTES - b, HALF_DAY_MINUTES + b);\n};\n\nexport const computeHourAngle = (date: Date) => {\n const minutes = date.getHours() * 60 + date.getMinutes() - HALF_DAY_MINUTES;\n return (minutes / HALF_DAY_MINUTES) * Math.PI;\n};\n\nexport const computeHourAngleAtMinute = (minutes: number) => {\n return (minutes / HALF_DAY_MINUTES - 1) * Math.PI;\n};\n\nexport const getSunDirection = (date: Date, latitude: number) => {\n return computeSunLocation(\n 1,\n computeHourAngle(date),\n computeDeclinationAngle(date),\n Util.toRadians(latitude),\n ).normalize();\n};\n\nexport const computeSunLocation = (radius: number, hourAngle: number, declinationAngle: number, latitude: number) => {\n const cosDec = Math.cos(declinationAngle);\n const sinDec = Math.sin(declinationAngle);\n const cosLat = Math.cos(latitude);\n const sinLat = Math.sin(latitude);\n const cosHou = Math.cos(hourAngle);\n const sinHou = Math.sin(hourAngle);\n const altitudeAngle = Math.asin(sinDec * sinLat + cosDec * cosHou * cosLat);\n const xAzm = sinHou * cosDec;\n const yAzm = cosLat * sinDec - cosHou * cosDec * sinLat;\n const azimuthAngle = Math.atan2(yAzm, xAzm);\n const coords = new Vector3(radius, azimuthAngle, altitudeAngle);\n Util.sphericalToCartesianZ(coords);\n // reverse the x so that sun moves from east to west\n coords.x = -coords.x;\n return coords;\n};\n\n// Solar radiation incident outside the earth's atmosphere is called extraterrestrial radiation, in kW/m^2.\n// https://pvpmc.sandia.gov/modeling-steps/1-weather-design-inputs/irradiance-and-insolation-2/extraterrestrial-radiation/\nconst getExtraterrestrialRadiation = (dayOfYear: number) => {\n const b = (TWO_PI * dayOfYear) / 365;\n const er =\n 1.00011 + 0.034221 * Math.cos(b) + 0.00128 * Math.sin(b) + 0.000719 * Math.cos(2 * b) + 0.000077 * Math.sin(2 * b);\n return SOLAR_CONSTANT * er;\n};\n\n// air mass calculation from http://en.wikipedia.org/wiki/Air_mass_(solar_energy)#At_higher_altitudes\nconst computeAirMass = (airMassType: AirMass, sunDirection: Vector3, altitude: number) => {\n let zenithAngle;\n switch (airMassType) {\n case AirMass.NONE:\n return 1;\n case AirMass.KASTEN_YOUNG:\n zenithAngle = sunDirection.angleTo(UNIT_VECTOR_POS_Z);\n return 1 / (Math.cos(zenithAngle) + 0.50572 * Math.pow(96.07995 - (zenithAngle / Math.PI) * 180, -1.6364));\n default:\n zenithAngle = sunDirection.angleTo(UNIT_VECTOR_POS_Z);\n const cos = Math.cos(zenithAngle);\n const r = 708;\n const c = altitude / 9000;\n return Math.sqrt((r + c) * (r + c) * cos * cos + (2 * r + 1 + c) * (1 - c)) - (r + c) * cos;\n }\n};\n\n// Reused peak solar radiation value. Must be called once and only once before\n// calling calculateDirectRadiation and calculateDiffusionAndReflection, the unit is in kW/m^2\nexport const calculatePeakRadiation = (\n sunDirection: Vector3,\n dayOfYear: number,\n altitude: number,\n airMassType: AirMass,\n) => {\n // don't use the 1.1 factor as we consider diffuse radiation in the ASHRAE model\n return (\n getExtraterrestrialRadiation(dayOfYear) *\n Math.pow(0.7, Math.pow(computeAirMass(airMassType, sunDirection, altitude), 0.678))\n );\n};\n\n// see: http://www.physics.arizona.edu/~cronin/Solar/References/Irradiance%20Models%20and%20Data/WOC01.pdf\nexport const calculateDiffuseAndReflectedRadiation = (\n ground: GroundModel,\n month: number,\n normal: Vector3,\n peakRadiation: number,\n) => {\n let result = 0;\n const cos = normal.dot(UNIT_VECTOR_POS_Z);\n const viewFactorWithSky = 0.5 * (1 + cos);\n if (viewFactorWithSky > 0) {\n // diffuse irradiance from the sky\n result += ASHRAE_C[month] * viewFactorWithSky * peakRadiation;\n }\n // if a surface faces down, it should receive ground reflection as well\n const viewFactorWithGround = 0.5 * Math.abs(1 - cos);\n if (!Util.isZero(viewFactorWithGround)) {\n // short-wave reflection from the ground\n result += ground.albedo * viewFactorWithGround * peakRadiation;\n }\n return result;\n};\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Circle, Cone, Cylinder, Line } from '@react-three/drei';\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Group, Vector3 } from 'three';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { HALF_PI, TWO_PI } from '../constants';\nimport { LineData } from './LineData';\nimport { getSunDirection } from '../analysis/sunTools';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { useFrame } from '@react-three/fiber';\nimport { Line2 } from 'three/examples/jsm/lines/Line2';\nimport { Util } from '../Util';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst SolarUpdraftTower = ({ foundation }: { foundation: FoundationModel }) => {\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const animate = usePrimitiveStore(Selector.animateSun);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const simulationPaused = usePrimitiveStore(Selector.simulationPaused);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const getHeatmap = useDataStore(Selector.getHeatmap);\n\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n const streamlinesRef = useRef();\n\n const { lx, ly, lz, solarUpdraftTower } = foundation;\n\n const arrowRadius = (solarUpdraftTower?.collectorRadius ?? 100) * 0.016;\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n\n const streamlines = useMemo(() => {\n const array: LineData[] = [];\n const airInletZ = ((solarUpdraftTower?.collectorHeight ?? Math.max(3, 10 * lz)) + lz) / 2;\n const airOutletZ = solarUpdraftTower?.chimneyHeight ?? Math.max(lx, ly);\n const collectorRadius = solarUpdraftTower?.collectorRadius ?? Math.min(lx, ly) / 2;\n const chimneyRadius = solarUpdraftTower?.chimneyRadius ?? Math.max(1, 0.025 * Math.min(lx, ly));\n const airInletR1 = collectorRadius * 1.15;\n const airInletR2 = chimneyRadius * 0.5;\n const airOutletR1 = chimneyRadius;\n const airOutletR2 = chimneyRadius * 2;\n const airOutletR3 = chimneyRadius * 4;\n const n = 6;\n for (let i = 0; i < n; i++) {\n const angle = (TWO_PI / n) * i;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const line: Vector3[] = [];\n line.push(new Vector3(airInletR1 * cos, airInletR1 * sin, airInletZ));\n line.push(new Vector3(airInletR2 * cos, airInletR2 * sin, airInletZ));\n line.push(new Vector3(airInletR2 * cos, airInletR2 * sin, airOutletZ));\n line.push(new Vector3(airOutletR1 * cos, airOutletR1 * sin, airOutletZ * 1.02));\n line.push(new Vector3(airOutletR2 * cos, airOutletR2 * sin, airOutletZ * 1.04));\n line.push(new Vector3(airOutletR3 * cos, airOutletR3 * sin, airOutletZ * 1.06));\n array.push({ points: line } as LineData);\n }\n return array;\n }, [\n lx,\n ly,\n lz,\n solarUpdraftTower?.collectorRadius,\n solarUpdraftTower?.collectorHeight,\n solarUpdraftTower?.chimneyRadius,\n solarUpdraftTower?.chimneyHeight,\n ]);\n\n const gridLines = useMemo(() => {\n const array: LineData[] = [];\n const h = (solarUpdraftTower?.collectorHeight ?? Math.max(3, 10 * lz)) + lz;\n const r = solarUpdraftTower?.collectorRadius ?? Math.min(lx, ly) / 2;\n const n = 25;\n const delta = (2 * r) / n;\n for (let i = 0; i <= n; i++) {\n const line: Vector3[] = [];\n const y = -r + i * delta;\n const x = Math.sqrt(r * r - y * y);\n line.push(new Vector3(-x, y, h));\n line.push(new Vector3(x, y, h));\n array.push({ points: line } as LineData);\n }\n for (let i = 0; i <= n; i++) {\n const line: Vector3[] = [];\n const x = -r + i * delta;\n const y = Math.sqrt(r * r - x * x);\n line.push(new Vector3(x, -y, h));\n line.push(new Vector3(x, y, h));\n array.push({ points: line } as LineData);\n }\n return array;\n }, [lx, ly, lz, solarUpdraftTower?.collectorRadius, solarUpdraftTower?.collectorHeight]);\n\n useEffect(() => {\n if (foundation && showSolarRadiationHeatmap) {\n const heatmap = getHeatmap(foundation.id + '-sut');\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n useFrame((state, delta) => {\n if ((animate || (simulationInProgress && !simulationPaused)) && sunDirection.z > 0) {\n if (streamlinesRef.current) {\n streamlinesRef.current.children.forEach((child) => {\n if (child.name === 'Streamlines') {\n const line = child as Line2;\n line.material.uniforms.dashOffset.value -= delta * arrowRadius * 10;\n }\n });\n }\n }\n });\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n {showSolarRadiationHeatmap && heatmapTexture ? (\n \n ) : (\n \n )}\n \n \n \n \n {gridLines &&\n gridLines.map((lineData, index) => {\n return (\n \n );\n })}\n {sunDirection.z > 0 && streamlines && (\n \n {streamlines.map((lineData, index) => {\n const x2 = lineData.points[0].x + lineData.points[1].x;\n const y2 = lineData.points[0].y + lineData.points[1].y;\n const angle = new Euler(0, 0, (TWO_PI * index) / streamlines.length + HALF_PI);\n const dashSize = arrowRadius;\n const gapSize = arrowRadius;\n return (\n \n \n \n \n \n \n \n \n \n );\n })}\n \n )}\n \n );\n};\n\nexport default React.memo(SolarUpdraftTower);\n","export default __webpack_public_path__ + \"static/media/glow.def60647.png\";","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Cylinder, useTexture } from '@react-three/drei';\nimport { AdditiveBlending } from 'three';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { HALF_PI } from '../constants';\nimport GlowImage from '../resources/glow.png';\nimport { getSunDirection } from '../analysis/sunTools';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\n\nconst SolarPowerTower = ({ foundation }: { foundation: FoundationModel }) => {\n const date = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n\n const glowTexture = useTexture(GlowImage);\n\n const sunDirection = useMemo(() => {\n return getSunDirection(new Date(date), latitude);\n }, [date, latitude]);\n\n const { lz, solarPowerTower } = foundation;\n\n const towerRadius = solarPowerTower?.towerRadius ?? 1;\n const towerHeight = solarPowerTower?.towerHeight ?? 20;\n const receiverHeight = towerHeight / 10;\n const receiverRadius = towerRadius * 1.5;\n const haloSize = Math.max(receiverHeight, receiverRadius) * 2.4;\n\n return (\n \n \n \n \n \n \n \n {/* simple glow effect to create a halo */}\n {sunDirection.z > 0 && (\n \n \n \n \n \n )}\n \n );\n};\n\nexport default React.memo(SolarPowerTower);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Cylinder } from '@react-three/drei';\nimport { DoubleSide, Vector3 } from 'three';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { HALF_PI } from '../constants';\n\nconst SolarReceiverPipe = ({ foundation }: { foundation: FoundationModel }) => {\n const { ly, lz, solarAbsorberPipe } = foundation;\n\n const absorberHeight = solarAbsorberPipe?.absorberHeight ?? 10;\n const apertureWidth = solarAbsorberPipe?.apertureWidth ?? 0.6;\n const relativeLength = solarAbsorberPipe?.relativeLength ?? 0.9;\n const poleNumber = solarAbsorberPipe?.poleNumber ?? 5;\n\n const solarReceiverPipePoles = useMemo(() => {\n const array: Vector3[] = [];\n const dy = (relativeLength * ly) / (poleNumber + 1);\n for (let i = 1; i <= poleNumber; i++) {\n array.push(new Vector3(0, i * dy - (relativeLength * ly) / 2, absorberHeight / 2 + lz / 2));\n }\n return array;\n }, [ly, lz, poleNumber, absorberHeight, relativeLength]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n {/* draw poles */}\n {solarReceiverPipePoles &&\n solarReceiverPipePoles.map((p, i) => {\n return (\n \n \n \n );\n })}\n \n );\n};\n\nexport default React.memo(SolarReceiverPipe);\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { CommonStoreState } from './common';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from 'src/types';\r\n\r\nexport class InnerCommonStoreState {\r\n static selectMe(state: CommonStoreState, id: string, e: ThreeEvent, action?: ActionType) {\r\n if (e.intersections.length > 0) {\r\n const intersectableObjects = e.intersections.filter(\r\n (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\r\n );\r\n if (intersectableObjects[0].object === e.eventObject) {\r\n for (const elem of state.elements) {\r\n if (elem.id === id) {\r\n elem.selected = true;\r\n state.selectedElement = elem;\r\n // TODO: lz is now zero for roof. So this may need to be set from elsewhere for roofs.\r\n state.selectedElementHeight = elem.lz;\r\n } else {\r\n elem.selected = false;\r\n }\r\n }\r\n\r\n if (!state.selectedElement) return;\r\n\r\n if (action === ActionType.ContextMenu) {\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.rotateHandleType = null;\r\n if (action) {\r\n switch (action) {\r\n case ActionType.Move:\r\n if (state.selectedElement?.type === ObjectType.Tree || state.selectedElement?.type === ObjectType.Human) {\r\n // selecting the above two types of object automatically sets them to the moving state\r\n state.moveHandleType = MoveHandleType.Default;\r\n } else {\r\n state.moveHandleType = e.eventObject.name as MoveHandleType;\r\n }\r\n break;\r\n case ActionType.Resize:\r\n state.resizeHandleType = e.eventObject.name as ResizeHandleType;\r\n break;\r\n case ActionType.Rotate:\r\n state.rotateHandleType = e.eventObject.name as RotateHandleType;\r\n break;\r\n case ActionType.Select:\r\n state.selectedElementAngle = e.object.parent?.rotation.z ?? 0;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n static selectNone(state: CommonStoreState) {\r\n state.selectedElementIdSet.clear();\r\n for (const e of state.elements) {\r\n e.selected = false;\r\n }\r\n state.selectedElement = null;\r\n state.selectedElementIdSet.clear();\r\n }\r\n\r\n static clearThenAddSelectedElementIdSet(state: CommonStoreState, id: string) {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n}\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { useEffect, useMemo, useState } from 'react';\nimport {\n GAP_PERCENT,\n MARGIN_PERCENT,\n RESOLUTION,\n SOLAR_PANEL_CELL_COLOR_BLACK,\n SOLAR_PANEL_CELL_COLOR_BLUE,\n} from 'src/constants';\nimport { PvModel } from 'src/models/PvModel';\nimport { useStore } from 'src/stores/common';\nimport { Orientation } from 'src/types';\nimport { Util } from 'src/Util';\nimport { CanvasTexture, RepeatWrapping } from 'three';\nimport * as Selector from '../../stores/selector';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nexport const useSolarPanelHeatmapTexture = (id: string) => {\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const [heatmapTexture, setHeatmapTexture] = useState(null);\n\n useEffect(() => {\n if (showSolarRadiationHeatmap) {\n const heatmap = useDataStore.getState().getHeatmap(id);\n if (heatmap) {\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\n }\n }\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\n\n return heatmapTexture;\n};\n\nexport const useSolarPanelTexture = (\n lx: number,\n ly: number,\n pvModel: PvModel,\n orientation: Orientation,\n customizedFrameColor: string | undefined,\n customizedBacksheetColor: string | undefined,\n) => {\n const frameColor =\n customizedFrameColor ??\n (pvModel?.color === 'Black' && pvModel?.cellType === 'Monocrystalline' ? 'silver' : 'white');\n const backsheetColor = customizedBacksheetColor ?? 'gray';\n\n const canvasTexture = useMemo(() => {\n if (!pvModel) return null;\n const { cellType, length, width, m, n, color } = pvModel;\n if (orientation === Orientation.portrait) {\n return drawSolarPanelCanvasTexture(cellType, width, length, n, m, color, frameColor, backsheetColor);\n } else {\n return drawSolarPanelCanvasTexture(cellType, length, width, m, n, color, frameColor, backsheetColor);\n }\n }, [pvModel, orientation, frameColor, backsheetColor]);\n\n const [texture, setTexture] = useState(canvasTexture);\n\n useEffect(() => {\n if (canvasTexture && pvModel) {\n const { length, width } = pvModel;\n const nx = Math.max(1, Math.round(lx / (orientation === Orientation.landscape ? length : width)));\n const ny = Math.max(1, Math.round(ly / (orientation === Orientation.landscape ? width : length)));\n canvasTexture.repeat.set(nx, ny);\n canvasTexture.wrapS = canvasTexture.wrapT = RepeatWrapping;\n setTexture(canvasTexture.clone());\n }\n }, [canvasTexture, lx, ly]);\n\n return texture;\n};\n\nconst drawSolarPanelCanvasTexture = (\n cellType: string,\n length: number, // x\n width: number, // y\n m: number,\n n: number,\n color: string,\n frameColor: string,\n backsheetColor: string,\n) => {\n length *= RESOLUTION;\n width *= RESOLUTION;\n\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\n [canvas.width, canvas.height] = [length, width];\n\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.fillStyle = frameColor;\n ctx.fillRect(0, 0, length, width);\n\n const margin = Math.max(length, width) * MARGIN_PERCENT;\n ctx.fillStyle = backsheetColor;\n ctx.fillRect(margin, margin, length - 2 * margin, width - 2 * margin);\n\n // cell color\n ctx.fillStyle = color === 'Black' ? SOLAR_PANEL_CELL_COLOR_BLACK : SOLAR_PANEL_CELL_COLOR_BLUE;\n\n if (cellType === 'Thin Film') {\n const padding = margin * 0.6;\n ctx.fillRect(padding, padding, length - padding * 2, width - padding * 2);\n } else {\n const gap = Math.max(length, width) * GAP_PERCENT;\n const padding = margin + gap;\n const cellSizeX = (length - padding * 2 - gap * (m - 1)) / m;\n const cellSizeY = (width - padding * 2 - gap * (n - 1)) / n;\n const offsetX = cellSizeX * 0.1;\n const offsetY = cellSizeY * 0.1;\n if (cellType === 'Monocrystalline') {\n for (let i = 0; i < n; i++) {\n const y = padding + (cellSizeY + gap) * i;\n for (let j = 0; j < m; j++) {\n const x = padding + (cellSizeX + gap) * j;\n ctx.beginPath();\n ctx.moveTo(x, y + offsetY);\n ctx.lineTo(x, y + cellSizeY - offsetY);\n ctx.lineTo(x + offsetX, y + cellSizeY);\n ctx.lineTo(x + cellSizeX - offsetX, y + cellSizeY);\n ctx.lineTo(x + cellSizeX, y + cellSizeY - offsetY);\n ctx.lineTo(x + cellSizeX, y + offsetY);\n ctx.lineTo(x + cellSizeX - offsetX, y);\n ctx.lineTo(x + offsetX, y);\n ctx.closePath();\n ctx.fill();\n }\n }\n } else if (cellType === 'Polycrystalline') {\n for (let i = 0; i < n; i++) {\n const y = padding + (cellSizeY + gap) * i;\n for (let j = 0; j < m; j++) {\n const x = padding + (cellSizeX + gap) * j;\n ctx.fillRect(x, y, cellSizeX, cellSizeY);\n }\n }\n }\n }\n }\n\n return new CanvasTexture(canvas);\n};\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Circle, Cone, Cylinder, Line, Plane, Ring, Sphere, Torus } from '@react-three/drei';\r\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n ORIGIN_VECTOR2,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n SOLAR_PANEL_BLACK_SPECULAR,\r\n SOLAR_PANEL_BLUE_SPECULAR,\r\n TWO_PI,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, Orientation, ResizeHandleType, RotateHandleType } from '../../types';\r\nimport { Util } from '../../Util';\r\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\r\nimport { LineData } from '../LineData';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { spBoundaryCheck, spCollisionCheck } from '../roof/roofRenderer';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UnoableResizeSolarPanelOnRoof } from 'src/undo/UndoableResize';\r\nimport { getSunDirection, ROOFTOP_SOLAR_PANEL_OFFSET } from 'src/analysis/sunTools';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { RoofUtil } from '../roof/RoofUtil';\r\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { PvModel } from 'src/models/PvModel';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface MoveHandleProps {\r\n id: string;\r\n parentId: string;\r\n foundationId?: string;\r\n handleSize: number;\r\n}\r\n\r\ninterface ResizeHandleProps {\r\n pos: number[]; // x, y, z\r\n dms: number[]; // lz, handleSize\r\n handleType: ResizeHandleType;\r\n initPointerDown: () => void;\r\n}\r\n\r\ninterface RotateHandleProps {\r\n position: [x: number, y: number, z: number];\r\n ratio: number;\r\n handleType: RotateHandleType;\r\n initPointerDown: () => void;\r\n}\r\n\r\ninterface TiltHandleProps {\r\n rotationZ: number;\r\n tiltAngle: number;\r\n handleSize: number;\r\n initPointerDown: () => void;\r\n handlePointerMove: (e: ThreeEvent, tiltHandleRef: React.MutableRefObject) => void;\r\n handlePointerUp: () => void;\r\n}\r\n\r\ninterface SunbeamProps {\r\n drawSunbeam: boolean;\r\n rotation: number[];\r\n normal: number[];\r\n relativeEuler: Euler;\r\n fRotation: number;\r\n}\r\n\r\ninterface LabelProps {\r\n id: string;\r\n}\r\n\r\nconst MoveHandle = ({ id, parentId, foundationId, handleSize }: MoveHandleProps) => {\r\n const domElement = useThree().gl.domElement;\r\n\r\n return (\r\n {\r\n domElement.style.cursor = 'move';\r\n }}\r\n onPointerOut={() => {\r\n domElement.style.cursor = 'default';\r\n }}\r\n onPointerDown={(e) => {\r\n useStore.getState().selectMe(id, e, ActionType.Move);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst ResizeHandle = ({ pos, dms, handleType, initPointerDown }: ResizeHandleProps) => {\r\n const [cx, cy, cz] = pos;\r\n const [lz, handleSize] = dms;\r\n const domElement = useThree().gl.domElement;\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const ref = useRef(null);\r\n\r\n const handlePointerDown = () => {\r\n initPointerDown();\r\n const vector = new Vector3();\r\n switch (handleType) {\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n vector.set(-cx * 2, 0, -cz);\r\n break;\r\n case ResizeHandleType.Upper:\r\n case ResizeHandleType.Lower:\r\n vector.set(0, -cy * 2, -cz);\r\n break;\r\n }\r\n useStore.getState().set((state) => {\r\n if (ref.current) {\r\n state.resizeAnchor = ref.current.localToWorld(vector);\r\n state.resizeHandleType = handleType;\r\n }\r\n });\r\n };\r\n\r\n return (\r\n {\r\n domElement.style.cursor = 'pointer';\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n }}\r\n onPointerOut={() => {\r\n domElement.style.cursor = 'default';\r\n setColor(RESIZE_HANDLE_COLOR);\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst RotateHandle = ({ position, ratio, handleType, initPointerDown }: RotateHandleProps) => {\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const domElement = useThree().gl.domElement;\r\n const rotationHandleLMesh = useMemo(() => , [color]);\r\n\r\n const handlePointerDown = () => {\r\n initPointerDown();\r\n useStore.getState().set((state) => {\r\n state.rotateHandleType = handleType;\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {rotationHandleLMesh}\r\n \r\n \r\n {\r\n domElement.style.cursor = 'grab';\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n }}\r\n onPointerOut={() => {\r\n domElement.style.cursor = 'default';\r\n setColor(RESIZE_HANDLE_COLOR);\r\n }}\r\n />\r\n \r\n );\r\n};\r\n\r\nconst TiltHandle = ({\r\n rotationZ,\r\n tiltAngle,\r\n handleSize,\r\n initPointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n}: TiltHandleProps) => {\r\n const { gl } = useThree();\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const [showTiltAngle, setShowTiltAngle] = useState(false);\r\n const tiltHandleRef = useRef();\r\n const degree = useMemo(() => new Array(13).fill(0), []);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n return (\r\n <>\r\n {/* ring handles */}\r\n {\r\n gl.domElement.style.cursor = 'grab';\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n }}\r\n onPointerOut={() => {\r\n gl.domElement.style.cursor = 'default';\r\n setColor(RESIZE_HANDLE_COLOR);\r\n }}\r\n onPointerDown={(e) => {\r\n initPointerDown();\r\n e.stopPropagation();\r\n setShowTiltAngle(true);\r\n setCommonStore((state) => {\r\n state.rotateHandleType = RotateHandleType.Tilt;\r\n });\r\n }}\r\n >\r\n \r\n \r\n {showTiltAngle && (\r\n <>\r\n {/* intersection plane */}\r\n {}}\r\n onPointerMove={(e) => {\r\n handlePointerMove(e, tiltHandleRef);\r\n }}\r\n onPointerUp={() => {\r\n setShowTiltAngle(false);\r\n handlePointerUp();\r\n }}\r\n >\r\n \r\n \r\n {/* pointer */}\r\n \r\n {/* scale */}\r\n {degree.map((e, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {/* show current degree */}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst Sunbeam = React.memo(({ drawSunbeam, rotation, normal, relativeEuler, fRotation }: SunbeamProps) => {\r\n const euler = new Euler().fromArray([...rotation, 'ZXY']);\r\n\r\n const normalVector = useMemo(() => {\r\n if (rotation[0] === 0) {\r\n return new Vector3()\r\n .fromArray(normal)\r\n .applyEuler(new Euler(relativeEuler.x, relativeEuler.y, relativeEuler.z + rotation[2] + fRotation, 'ZXY'));\r\n }\r\n return new Vector3(0, 0, 1).applyEuler(euler).applyEuler(new Euler(0, 0, fRotation));\r\n }, [rotation, relativeEuler, fRotation]);\r\n\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n\r\n return (\r\n <>\r\n {drawSunbeam && sunDirection.z > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n\r\nconst Label = ({ id }: LabelProps) => {\r\n useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const language = useStore(Selector.language);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const sp = useMemo(() => getElementById(id) as SolarPanelModel, [id]);\r\n\r\n if (!sp || !sp.foundationId) {\r\n return null;\r\n }\r\n\r\n const foundation = getElementById(sp.foundationId) as FoundationModel;\r\n\r\n if (!foundation) {\r\n return null;\r\n }\r\n\r\n const fCenter = new Vector3(foundation.cx, foundation.cy, foundation.cz);\r\n\r\n const center = new Vector3(\r\n sp.cx * foundation.lx,\r\n sp.cy * foundation.ly,\r\n foundation.lz / 2 + sp.cz + sp.lz / 2 + sp.poleHeight,\r\n )\r\n .applyEuler(new Euler(0, 0, foundation.rotation[2]))\r\n .add(fCenter);\r\n\r\n const labelText =\r\n (sp?.label ?? i18n.t('shared.SolarPanelElement', lang)) +\r\n (sp?.locked ? ` ( + ${i18n.t('shared.ElementLocked', lang)} + )` : '') +\r\n (sp?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n center.x.toFixed(1) +\r\n ', ' +\r\n center.y.toFixed(1) +\r\n ', ' +\r\n center.z.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang));\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst SolarPanelOnRoof = ({\r\n id,\r\n pvModelName = 'SPR-X21-335-BLK',\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n tiltAngle,\r\n relativeAzimuth,\r\n poleHeight,\r\n poleRadius,\r\n poleSpacing,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = 'white',\r\n frameColor,\r\n backsheetColor,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n foundationId,\r\n foundationModel,\r\n orientation = Orientation.portrait,\r\n}: SolarPanelModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const selectMe = useStore(Selector.selectMe);\r\n const getElementById = useStore(Selector.getElementById);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const pvModules = useStore(Selector.pvModules);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n\r\n const selected = useSelected(id);\r\n\r\n const latestFoundationRef = useRef(null);\r\n\r\n const pvModel = pvModules[pvModelName] as PvModel;\r\n if (pvModel) {\r\n lz = Math.max(pvModel.thickness, 0.02);\r\n }\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const radialSegmentsPole = useStore.getState().elements.length < 100 ? 4 : 2;\r\n const poleZ = -poleHeight / 2 - lz / 2;\r\n\r\n const [drawPole, setDrawPole] = useState(rotation[0] === 0);\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [hovered, setHovered] = useState(false);\r\n const { gl, camera } = useThree();\r\n\r\n const baseRef = useRef();\r\n const solarPanelLinesRef = useRef();\r\n const intersectionPlaneRef = useRef(null);\r\n const pointerDownRef = useRef(false);\r\n\r\n const oldPosRef = useRef(null);\r\n const oldDmsRef = useRef(null);\r\n const oldAziRef = useRef(null);\r\n const oldTiltRef = useRef(null);\r\n const oldRotRef = useRef(null);\r\n const oldNorRef = useRef(null);\r\n\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const position = useMemo(() => {\r\n if (drawPole) {\r\n return new Vector3(cx, cy, cz + hz + poleHeight);\r\n }\r\n return new Vector3(cx, cy, cz + lz / 2 + 0.02); // raise it by 2cm to show\r\n }, [cx, cy, cz, hz, drawPole, poleHeight, sceneRadius]);\r\n\r\n const euler = useMemo(() => {\r\n return new Euler().fromArray([...rotation, 'ZXY']);\r\n }, [rotation]);\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (drawPole) {\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }\r\n return new Euler();\r\n }, [tiltAngle, relativeAzimuth, drawPole]);\r\n\r\n const poles = useMemo(() => {\r\n const poleArray: Vector3[] = [];\r\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\r\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\r\n const sinTilt = 0.5 * Math.sin(tiltAngle);\r\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\r\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\r\n for (let ix = -poleNx; ix <= poleNx; ix++) {\r\n for (let iy = -poleNy; iy <= poleNy; iy++) {\r\n const xi = ix * cosAz - iy * sinAz;\r\n const yi = ix * sinAz + iy * cosAz;\r\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\r\n }\r\n }\r\n return poleArray;\r\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleHeight, lz]);\r\n\r\n useEffect(() => {\r\n setDrawPole(rotation[0] === 0);\r\n }, [rotation]);\r\n\r\n useEffect(() => {\r\n if (pvModel) {\r\n let mx, my;\r\n if (orientation === Orientation.portrait) {\r\n mx = Math.max(1, Math.round(lx / pvModel.width));\r\n my = Math.max(1, Math.round(ly / pvModel.length));\r\n } else {\r\n mx = Math.max(1, Math.round(lx / pvModel.length));\r\n my = Math.max(1, Math.round(ly / pvModel.width));\r\n }\r\n solarPanelLinesRef.current = [];\r\n const dx = lx / mx;\r\n const dy = ly / my;\r\n for (let i = 0; i <= mx; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\r\n } as LineData);\r\n }\r\n for (let i = 0; i <= my; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\r\n } as LineData);\r\n }\r\n }\r\n }, [orientation, pvModelName, lx, ly, lz]);\r\n\r\n const undoOperation = () => {\r\n setCommonStore((state) => {\r\n if (\r\n oldPosRef.current &&\r\n oldAziRef.current !== null &&\r\n oldNorRef.current &&\r\n oldDmsRef.current &&\r\n oldRotRef.current\r\n ) {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n [e.cx, e.cy, e.cz] = [...oldPosRef.current];\r\n [e.lx, e.ly, e.lz] = [...oldDmsRef.current];\r\n (e as SolarPanelModel).relativeAzimuth = oldAziRef.current;\r\n e.normal = [...oldNorRef.current];\r\n e.rotation = [...oldRotRef.current];\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handlePointerUp = () => {\r\n if (pointerDownRef.current) {\r\n const roof = getElementById(parentId) as RoofModel;\r\n if (roof && foundationId) {\r\n const sp = getElementById(id) as SolarPanelModel;\r\n const foundation = latestFoundationRef.current;\r\n\r\n if (sp && foundation) {\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(roof);\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(sp, foundation);\r\n if (\r\n !spBoundaryCheck(solarPanelVertices, boundaryVertices) ||\r\n !spCollisionCheck(sp, foundation, solarPanelVertices)\r\n ) {\r\n undoOperation();\r\n } else {\r\n AddUndoableOperation(sp);\r\n }\r\n }\r\n }\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDownRef.current = false;\r\n setShowIntersectionPlane(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.rotateHandleType = null;\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n latestFoundationRef.current = null;\r\n }\r\n };\r\n\r\n // add pointerup event listener\r\n // useEffect(() => {\r\n // window.addEventListener('pointerup', handlePointerUp);\r\n // return () => {\r\n // window.removeEventListener('pointerup', handlePointerUp);\r\n // };\r\n // }, []);\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const tiltHandleSize = (baseSize * 2) / 3;\r\n\r\n const initPointerDown = () => {\r\n const latestFoundation = useStore\r\n .getState()\r\n .elements.find((e) => e.id === foundationId && e.type === ObjectType.Foundation) as FoundationModel;\r\n if (latestFoundation) {\r\n oldPosRef.current = [cx / latestFoundation.lx, cy / latestFoundation.ly, cz - latestFoundation.lz / 2];\r\n oldDmsRef.current = [lx, ly, lz];\r\n oldAziRef.current = relativeAzimuth;\r\n oldTiltRef.current = tiltAngle;\r\n oldNorRef.current = [...normal];\r\n oldRotRef.current = [...rotation];\r\n latestFoundationRef.current = latestFoundation;\r\n }\r\n setShowIntersectionPlane(true);\r\n pointerDownRef.current = true;\r\n useRefStore.getState().setEnableOrbitController(false);\r\n };\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const isTouchingRoof = (newLy: number, newTAngle: number) => {\r\n if (drawPole && newTAngle !== 0 && 0.5 * newLy * Math.abs(Math.sin(newTAngle)) > poleHeight) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const intersectionPlanePointerMove = (event: ThreeEvent) => {\r\n if (intersectionPlaneRef.current && pointerDownRef.current && latestFoundationRef.current && pvModel) {\r\n setRayCast(event);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const pointer = intersects[0].point;\r\n if (pointer.z < 0.001) {\r\n return;\r\n }\r\n const rotateHandleType = useStore.getState().rotateHandleType;\r\n if (useStore.getState().resizeHandleType) {\r\n const azimuth = drawPole ? relativeAzimuth : 0;\r\n const anchor = useStore.getState().resizeAnchor;\r\n const fCenter = new Vector3(\r\n latestFoundationRef.current.cx,\r\n latestFoundationRef.current.cy,\r\n latestFoundationRef.current.lz,\r\n );\r\n const r = new Vector3()\r\n .subVectors(pointer, anchor)\r\n .applyEuler(new Euler(0, 0, -rotation[2] - latestFoundationRef.current.rotation[2] - azimuth));\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && latestFoundationRef.current) {\r\n switch (state.resizeHandleType) {\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right: {\r\n const unitLength =\r\n (e as SolarPanelModel).orientation === Orientation.landscape ? pvModel.length : pvModel.width;\r\n const dx = Math.abs(r.x);\r\n const nx = Math.max(1, Math.ceil((dx - unitLength / 2) / unitLength));\r\n const lx = nx * unitLength;\r\n const v = new Vector3((Math.sign(r.x) * lx) / 2, 0, 0).applyEuler(\r\n new Euler(0, 0, rotation[2] + latestFoundationRef.current.rotation[2] + azimuth),\r\n );\r\n const center = new Vector3()\r\n .addVectors(anchor, v)\r\n .sub(fCenter)\r\n .applyEuler(new Euler(0, 0, -latestFoundationRef.current.rotation[2]));\r\n e.lx = lx;\r\n e.cx = center.x / latestFoundationRef.current.lx;\r\n e.cy = center.y / latestFoundationRef.current.ly;\r\n break;\r\n }\r\n case ResizeHandleType.Upper:\r\n case ResizeHandleType.Lower: {\r\n const dy = Math.abs(r.y);\r\n const dz = Math.abs(r.z);\r\n const dl = Math.hypot(dy, dz);\r\n const unitLength =\r\n (e as SolarPanelModel).orientation === Orientation.landscape ? pvModel.width : pvModel.length;\r\n const nl = Math.max(1, Math.ceil((dl - unitLength / 2) / unitLength));\r\n const l = nl * unitLength;\r\n const v = new Vector3(0, (l * Math.sign(r.y)) / 2, 0).applyEuler(\r\n new Euler(\r\n rotation[0],\r\n rotation[1],\r\n rotation[2] + latestFoundationRef.current.rotation[2] + azimuth,\r\n 'ZXY',\r\n ),\r\n );\r\n const center = new Vector3()\r\n .addVectors(anchor, v)\r\n .sub(fCenter)\r\n .applyEuler(new Euler(0, 0, -latestFoundationRef.current.rotation[2]));\r\n if (!isTouchingRoof(l, tiltAngle)) {\r\n e.ly = l;\r\n e.cx = center.x / latestFoundationRef.current.lx;\r\n e.cy = center.y / latestFoundationRef.current.ly;\r\n if (!drawPole) {\r\n e.cz = center.z - hz;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n } else if (rotateHandleType === RotateHandleType.Lower || rotateHandleType === RotateHandleType.Upper) {\r\n const pr = latestFoundationRef.current.rotation[2]; // parent rotation\r\n const pc = new Vector2(latestFoundationRef.current.cx, latestFoundationRef.current.cy); // world parent center\r\n const cc = new Vector2(cx, cy).rotateAround(ORIGIN_VECTOR2, pr);\r\n const wc = new Vector2().addVectors(cc, pc); // world current center\r\n const rotation =\r\n Math.atan2(-pointer.x + wc.x, pointer.y - wc.y) -\r\n pr +\r\n (rotateHandleType === RotateHandleType.Lower ? Math.PI : 0);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0; // make sure angle is between -PI to PI\r\n const newAzimuth = rotation + offset;\r\n useStore.getState().updateSolarCollectorRelativeAzimuthById(id, newAzimuth);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const tiltHandlePointerMove = (\r\n e: ThreeEvent,\r\n tiltHandleRef: React.MutableRefObject,\r\n ) => {\r\n if (pointerDownRef.current) {\r\n setRayCast(e);\r\n if (tiltHandleRef.current && useStore.getState().rotateHandleType === RotateHandleType.Tilt) {\r\n const intersects = ray.intersectObjects([tiltHandleRef.current]);\r\n if (intersects.length > 0) {\r\n const pointer = intersects[0].point;\r\n const center = tiltHandleRef.current.parent?.localToWorld(new Vector3()); // rotate center in world coordinate\r\n if (center) {\r\n const cv = new Vector3().subVectors(pointer, center);\r\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\r\n const touch = 0.5 * ly * Math.abs(Math.sin(angle)) > poleHeight;\r\n if (!touch) {\r\n const wr = relativeAzimuth + rotation[2] + (latestFoundationRef.current?.rotation[2] ?? 0);\r\n const sign =\r\n wr % Math.PI === 0\r\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\r\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\r\n angle *= sign;\r\n useStore.getState().updateSolarPanelTiltAngleById(id, angle);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const tiltHandlePointerUp = () => {\r\n const sp = getElementById(id) as SolarPanelModel;\r\n if (sp && oldTiltRef.current && Math.abs(sp.tiltAngle - oldTiltRef.current) > ZERO_TOLERANCE) {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltRef.current,\r\n newValue: sp.tiltAngle,\r\n changedElementId: id,\r\n changedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n useStore.getState().addUndoable(undoableChange);\r\n }\r\n };\r\n\r\n const AddUndoableOperation = (sp: SolarPanelModel) => {\r\n if (useStore.getState().resizeHandleType) {\r\n if (oldDmsRef.current && oldPosRef.current && oldNorRef.current && oldRotRef.current) {\r\n const undoableResize = {\r\n name: 'Resize Solar Panel On Roof',\r\n timestamp: Date.now(),\r\n id: sp.id,\r\n oldDms: [...oldDmsRef.current],\r\n oldNor: [...oldNorRef.current],\r\n oldPos: [...oldPosRef.current],\r\n oldRot: [...oldRotRef.current],\r\n newDms: [sp.lx, sp.ly, sp.lz],\r\n newPos: [sp.cx, sp.cy, sp.cz],\r\n newNor: [...sp.normal],\r\n newRot: [...sp.rotation],\r\n undo() {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.id) {\r\n [e.cx, e.cy, e.cz] = [...undoableResize.oldPos];\r\n [e.lx, e.ly, e.lz] = [...undoableResize.oldDms];\r\n e.normal = [...undoableResize.oldNor];\r\n e.rotation = [...undoableResize.oldRot];\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n redo() {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.id) {\r\n [e.cx, e.cy, e.cz] = [...undoableResize.newPos];\r\n [e.lx, e.ly, e.lz] = [...undoableResize.newDms];\r\n e.normal = [...undoableResize.newNor];\r\n e.rotation = [...undoableResize.newRot];\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n } as UnoableResizeSolarPanelOnRoof;\r\n useStore.getState().addUndoable(undoableResize);\r\n }\r\n } else if (useStore.getState().rotateHandleType) {\r\n if (oldAziRef.current !== undefined) {\r\n const undoableRotate = {\r\n name: 'Rotate Solar Panel On Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldAziRef.current,\r\n newValue: sp.relativeAzimuth,\r\n changedElementId: sp.id,\r\n changedElementType: sp.type,\r\n undo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarCollectorRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarCollectorRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n useStore.getState().addUndoable(undoableRotate);\r\n }\r\n }\r\n };\r\n\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n const texture = useSolarPanelTexture(lx, ly, pvModel, orientation, frameColor, backsheetColor);\r\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\r\n\r\n const renderTopTextureMaterial = () => {\r\n if (showSolarRadiationHeatmap && heatmapTexture) {\r\n return ;\r\n }\r\n if (!texture) return ;\r\n if (orthographic || solarPanelShininess === 0) {\r\n return ;\r\n }\r\n return (\r\n \r\n );\r\n };\r\n\r\n const renderBotTextureMaterial = () => {\r\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n return (\r\n \r\n );\r\n };\r\n\r\n if (parent && parent.type === ObjectType.Roof && (parent as RoofModel).opacity === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {/* draw panel */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n if (useStore.getState().objectTypeToAdd !== ObjectType.None) return;\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.SolarPanel;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {renderTopTextureMaterial()}\r\n {renderBotTextureMaterial()}\r\n \r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* move handle */}\r\n \r\n\r\n {/* resize handles */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* simulation panel */}\r\n \r\n \r\n \r\n\r\n {showSolarRadiationHeatmap &&\r\n heatmapTexture &&\r\n solarPanelLinesRef.current &&\r\n solarPanelLinesRef.current.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {selected && locked && (\r\n \r\n )}\r\n \r\n\r\n {/* rotate and tilt handles */}\r\n {drawPole && selected && !locked && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n \r\n )}\r\n\r\n {drawPole &&\r\n poleHeight > 0 &&\r\n poles.map((p, i) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/*draw sun beam*/}\r\n \r\n\r\n {/*draw label */}\r\n {(hovered || showLabel) && !selected && \r\n );\r\n};\r\n\r\nexport default SolarPanelOnRoof;\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Plane } from '@react-three/drei';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport React, { useEffect } from 'react';\r\nimport { HALF_PI } from 'src/constants';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ActionType, ObjectType } from 'src/types';\r\nimport { DoubleSide } from 'three';\r\nimport * as Selector from 'src/stores/selector';\r\n\r\nconst EmptyWall = (wallModel: WallModel) => {\r\n const { lx, lz, parentId, id, roofId } = wallModel;\r\n\r\n const deletedRoofId = useStore(Selector.deletedRoofId);\r\n const deletedRoofIdSet = useStore(Selector.deletedRoofIdSet);\r\n\r\n useEffect(() => {\r\n if (!roofId) return;\r\n if (deletedRoofId === roofId || deletedRoofIdSet.has(roofId)) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n wall.roofId = null;\r\n wall.leftRoofHeight = undefined;\r\n wall.rightRoofHeight = undefined;\r\n wall.centerRoofHeight = undefined;\r\n wall.centerLeftRoofHeight = undefined;\r\n wall.centerRightRoofHeight = undefined;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }, [roofId, deletedRoofId, deletedRoofIdSet]);\r\n\r\n const checkIfCanSelectMe = (e: ThreeEvent) => {\r\n return !(\r\n e.button === 2 ||\r\n useStore.getState().moveHandleType ||\r\n useStore.getState().resizeHandleType ||\r\n useStore.getState().objectTypeToAdd !== ObjectType.None ||\r\n useStore.getState().isAddingElement()\r\n );\r\n };\r\n\r\n const handleWallBodyPointerDown = (e: ThreeEvent) => {\r\n if (checkIfCanSelectMe(e)) {\r\n useStore.getState().set((state) => {\r\n state.contextMenuObjectType = null;\r\n });\r\n useStore.getState().selectMe(id, e, ActionType.Select);\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n useStore.getState().selectMe(id, e, ActionType.ContextMenu);\r\n useStore.getState().set((state) => {\r\n if (e.intersections.length > 0 && e.intersections[0].object === e.eventObject) {\r\n state.contextMenuObjectType = ObjectType.Wall;\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(EmptyWall);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Sphere } from '@react-three/drei';\r\nimport { HIGHLIGHT_HANDLE_COLOR, MOVE_HANDLE_COLOR_2 } from 'src/constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { MoveHandleType } from 'src/types';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { useHandleSize } from './hooks';\r\n\r\ninterface HandleProps {\r\n cy: number;\r\n size: number;\r\n type: MoveHandleType;\r\n}\r\n\r\ninterface WrapperProps {\r\n ply: number;\r\n phz: number;\r\n}\r\n\r\nconst MoveHandle = ({ cy, size, type }: HandleProps) => {\r\n const [color, setColor] = useState(MOVE_HANDLE_COLOR_2);\r\n\r\n const onPointerEnter = () => {\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n };\r\n\r\n const onPointerOut = () => {\r\n setColor(MOVE_HANDLE_COLOR_2);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst WallMoveHandleWrapper = ({ ply, phz }: WrapperProps) => {\r\n const handleSize = useHandleSize();\r\n\r\n const onPointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.parent === e.eventObject) {\r\n useStore.getState().set((state) => {\r\n state.moveHandleType = e.object.name as MoveHandleType;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WallMoveHandleWrapper);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport { Box, Plane } from '@react-three/drei';\r\nimport { DoubleSide, Euler, Mesh, Vector3 } from 'three';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ObjectType, ResizeHandleType } from 'src/types';\r\nimport { HALF_PI, HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR } from 'src/constants';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { WallFill, WallModel } from 'src/models/WallModel';\r\nimport { useHandleSize } from './hooks';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableResizeWallHeight } from 'src/undo/UndoableResize';\r\nimport { RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\n\r\ninterface ResizeHandlesProps {\r\n x: number;\r\n z: number;\r\n handleType: ResizeHandleType;\r\n highLight: boolean;\r\n handleSize: number;\r\n partial?: boolean;\r\n}\r\n\r\ninterface WallResizeHandleWrapperProps {\r\n id: string;\r\n parentLz: number;\r\n roofId: string | null | undefined;\r\n x: number;\r\n z: number;\r\n absAngle: number;\r\n highLight: boolean;\r\n fill: WallFill;\r\n wallLeftHeight: number;\r\n wallRightHeight: number;\r\n leftUnfilledHeight: number;\r\n rightUnfilledHeight: number;\r\n leftTopPartialResizeHandleHeight: number;\r\n rightTopPartialResizeHandleHeight: number;\r\n leftJoints: string[];\r\n rightJoints: string[];\r\n}\r\n\r\nconst PARTIAL_RESIZE_HANDLE_COLOR = '#ADD8E6';\r\n\r\nconst WallResizeHandle = React.memo(({ x, z, handleType, highLight, handleSize, partial }: ResizeHandlesProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const addedWallID = useStore(Selector.addedWallId);\r\n\r\n const [hovered, setHovered] = useState(false);\r\n\r\n const color = // handleType === RType.UpperRight ? 'blue' : 'white';\r\n highLight ||\r\n hovered ||\r\n handleType === resizeHandleType ||\r\n (addedWallID && (handleType === ResizeHandleType.LowerRight || handleType === ResizeHandleType.UpperRight))\r\n ? HIGHLIGHT_HANDLE_COLOR\r\n : partial\r\n ? PARTIAL_RESIZE_HANDLE_COLOR\r\n : RESIZE_HANDLE_COLOR;\r\n\r\n let lx = handleSize,\r\n ly = handleSize,\r\n lz = handleSize;\r\n if (handleType === ResizeHandleType.LowerRight || handleType === ResizeHandleType.LowerLeft) {\r\n lx = handleSize * 1.7;\r\n } else if (partial) {\r\n lx *= 0.75;\r\n ly = handleSize / 2;\r\n lz = handleSize * 2.5;\r\n const offset = lz / 4;\r\n if (\r\n handleType === ResizeHandleType.WallPartialResizeLeft ||\r\n handleType === ResizeHandleType.WallPartialResizeRight\r\n ) {\r\n z -= offset;\r\n } else if (\r\n handleType === ResizeHandleType.WallPartialResizeLeftTop ||\r\n handleType === ResizeHandleType.WallPartialResizeRightTop\r\n ) {\r\n z += offset;\r\n }\r\n } else {\r\n ly = handleSize / 2;\r\n lz = handleSize * 1.7;\r\n }\r\n return (\r\n {\r\n setHovered(true);\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handleType;\r\n });\r\n }}\r\n onPointerLeave={() => {\r\n setHovered(false);\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n }}\r\n >\r\n \r\n \r\n );\r\n});\r\n\r\nconst WallResizeHandleWrapper = React.memo(\r\n ({\r\n id,\r\n parentLz,\r\n roofId,\r\n x,\r\n z,\r\n absAngle,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n fill,\r\n wallLeftHeight,\r\n wallRightHeight,\r\n highLight,\r\n leftJoints,\r\n rightJoints,\r\n }: WallResizeHandleWrapperProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n\r\n const handleSize = useHandleSize();\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [intersectionPlanePosition, setIntersectionPlanePosition] = useState(new Vector3());\r\n const [intersectionPlaneRotation, setIntersectionPlaneRotation] = useState(new Euler());\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const pointerDownRef = useRef(false);\r\n const oldHeightsRef = useRef([z * 2, leftUnfilledHeight, rightUnfilledHeight]);\r\n const oldSameBuildingWallsHeightMapRef = useRef>(new Map()); // for same roofId\r\n const leftWallLzRef = useRef(null);\r\n const rightWallLzRef = useRef(null);\r\n const childElements = useRef([]);\r\n\r\n const roofType = useMemo(() => {\r\n if (!roofId) return null;\r\n const roof = useStore.getState().elements.find((e) => e.id === roofId && e.type === ObjectType.Roof);\r\n if (!roof) return null;\r\n return (roof as RoofModel).roofType;\r\n }, [roofId]);\r\n\r\n if (orthographic) {\r\n z = -z;\r\n }\r\n\r\n const setIntersectionPlane = (x: number) => {\r\n const dir = useStore.getState().cameraDirection;\r\n const r = Math.atan2(dir.x, dir.y);\r\n setIntersectionPlanePosition(new Vector3(x, 0, 0));\r\n setIntersectionPlaneRotation(new Euler(HALF_PI, 0, -r - absAngle, 'ZXY'));\r\n setShowIntersectionPlane(true);\r\n };\r\n\r\n const updateUndoChange = (id: string, values: number[], sameBuildingWallsHeightMap: Map) => {\r\n const [\r\n lz,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n ] = values;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n e.lz = lz;\r\n wall.leftUnfilledHeight = leftUnfilledHeight;\r\n wall.rightUnfilledHeight = rightUnfilledHeight;\r\n wall.leftTopPartialHeight = leftTopPartialResizeHandleHeight;\r\n wall.rightTopPartialHeight = rightTopPartialResizeHandleHeight;\r\n } else if (e.type === ObjectType.Wall && sameBuildingWallsHeightMap.has(e.id)) {\r\n const height = sameBuildingWallsHeightMap.get(e.id);\r\n if (height !== undefined) {\r\n e.lz = height;\r\n e.cz = height / 2;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const getConnectedWallsHeight = () => {\r\n if (!roofId) return;\r\n\r\n if (leftJoints.length > 0 || rightJoints.length > 0) {\r\n if (roofType === RoofType.Gable || roofType === RoofType.Gambrel) {\r\n useStore.getState().elements.forEach((e) => {\r\n if (e.id === leftJoints[0]) leftWallLzRef.current = e.lz;\r\n if (e.id === rightJoints[0]) rightWallLzRef.current = e.lz;\r\n });\r\n } else {\r\n oldSameBuildingWallsHeightMapRef.current.clear();\r\n useStore.getState().elements.forEach((e) => {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n oldSameBuildingWallsHeightMapRef.current.set(e.id, e.lz);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n const getChildElements = () => {\r\n childElements.current = useStore.getState().elements.filter((e) => e.parentId === id);\r\n };\r\n\r\n const getWallShapePoints = (\r\n wall: WallModel,\r\n leftUnfilledHeight: number,\r\n rightUnfilledHeight: number,\r\n leftTopPartialHeight: number,\r\n rightTopPartialHeight: number,\r\n ) => {\r\n const {\r\n lx,\r\n lz,\r\n roofId,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n centerRoofHeight,\r\n } = wall;\r\n\r\n const isPartial = fill === WallFill.Partial;\r\n const realWallLeftHeight = isPartial ? Math.min(wallLeftHeight, leftTopPartialHeight) : wallLeftHeight;\r\n const realWallRightHeight = isPartial ? Math.min(wallRightHeight, rightTopPartialHeight) : wallRightHeight;\r\n const isTopPartial =\r\n isPartial &&\r\n (!Util.isZero(wallLeftHeight - realWallLeftHeight) || !Util.isZero(wallRightHeight - realWallRightHeight));\r\n\r\n const [hx, hy] = [lx / 2, lz / 2];\r\n\r\n const points: Point2[] = [];\r\n\r\n // from lower left, counter-clockwise\r\n points.push({ x: -hx, y: -hy + leftUnfilledHeight }, { x: hx, y: -hy + rightUnfilledHeight });\r\n\r\n if (isTopPartial) {\r\n points.push({ x: hx, y: -hy + realWallRightHeight }, { x: -hx, y: -hy + realWallLeftHeight });\r\n } else if (!roofId) {\r\n points.push({ x: hx, y: hy }, { x: -hx, y: hy });\r\n } else {\r\n if (rightRoofHeight) {\r\n points.push({ x: hx, y: -hy + rightRoofHeight });\r\n } else {\r\n points.push({ x: hx, y: hy });\r\n }\r\n if (centerRightRoofHeight) {\r\n points.push({ x: centerRightRoofHeight[0] * lx, y: -hy + centerRightRoofHeight[1] });\r\n }\r\n if (centerRoofHeight) {\r\n points.push({ x: centerRoofHeight[0] * lx, y: -hy + centerRoofHeight[1] });\r\n }\r\n if (centerLeftRoofHeight) {\r\n points.push({ x: centerLeftRoofHeight[0] * lx, y: -hy + centerLeftRoofHeight[1] });\r\n }\r\n if (leftRoofHeight) {\r\n points.push({ x: -hx, y: -hy + leftRoofHeight });\r\n } else {\r\n points.push({ x: -hx, y: hy });\r\n }\r\n }\r\n\r\n return points;\r\n };\r\n\r\n const isPartialWallValid = (\r\n wall: WallModel,\r\n leftUnfilledHeight: number,\r\n rightUnfilledHeight: number,\r\n leftTopPartialResizeHandleHeight: number,\r\n rightTopPartialResizeHandleHeight: number,\r\n ) => {\r\n const wallShapePoints = getWallShapePoints(\r\n wall,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n );\r\n\r\n if (childElements.current.length > 0) {\r\n for (const el of childElements.current) {\r\n let { cx, cz, lx, ly, lz } = el;\r\n cx *= wall.lx;\r\n cz *= wall.lz;\r\n if (el.type !== ObjectType.SolarPanel) {\r\n lx *= wall.lx;\r\n lz *= wall.lz;\r\n } else {\r\n lz = ly;\r\n }\r\n if (el.type === ObjectType.Window && (el as WindowModel).windowType === WindowType.Polygonal) {\r\n const [tx, th] = (el as WindowModel).polygonTop ?? DEFAULT_POLYGONTOP;\r\n const px = cx + tx * lx;\r\n const pz = cz + lz / 2 + th;\r\n if (!Util.isPointInside(px, pz, wallShapePoints)) {\r\n return false;\r\n }\r\n }\r\n if (!Util.isElementInsideWall(new Vector3(cx, 0, cz), lx, lz, wallShapePoints, el.type === ObjectType.Door)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const resetJointedWallLz = () => {\r\n leftWallLzRef.current = null;\r\n rightWallLzRef.current = null;\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (useStore.getState().addedWallId || e.object !== e.intersections[0]?.object) return;\r\n\r\n const resizeHandleObject = e.object;\r\n switch (resizeHandleObject.name) {\r\n case ResizeHandleType.LowerLeft: {\r\n setCommonStore((state) => {\r\n state.resizeAnchor.copy(resizeHandleObject.localToWorld(new Vector3(x * 2, 0, 0)));\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.LowerRight: {\r\n setCommonStore((state) => {\r\n state.resizeAnchor.copy(resizeHandleObject.localToWorld(new Vector3(-x * 2, 0, 0)));\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.WallPartialResizeLeft:\r\n case ResizeHandleType.WallPartialResizeLeftTop: {\r\n setIntersectionPlane(-x);\r\n getConnectedWallsHeight();\r\n getChildElements();\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight:\r\n case ResizeHandleType.WallPartialResizeRight:\r\n case ResizeHandleType.WallPartialResizeRightTop: {\r\n setIntersectionPlane(x);\r\n getConnectedWallsHeight();\r\n getChildElements();\r\n break;\r\n }\r\n default:\r\n console.error('Wall resize handle unknown');\r\n return;\r\n }\r\n setCommonStore((state) => {\r\n state.resizeHandleType = resizeHandleObject.name as ResizeHandleType;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n pointerDownRef.current = true;\r\n oldHeightsRef.current = [\r\n z * 2,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n ];\r\n };\r\n\r\n const handlePointerMove = (e: ThreeEvent) => {\r\n if (e.intersections.length === 0 || !pointerDownRef.current) return;\r\n const p = e.intersections[0].point;\r\n switch (useStore.getState().resizeHandleType) {\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight: {\r\n setCommonStore((state) => {\r\n const minZ = fill === WallFill.Partial ? Math.max(leftUnfilledHeight, rightUnfilledHeight) : 0;\r\n let newLz = Math.max(minZ + handleSize, p.z - parentLz);\r\n if (roofType === null || roofType === RoofType.Gable || roofType === RoofType.Gambrel) {\r\n if (leftWallLzRef.current || rightWallLzRef.current) {\r\n const leftDiff = Math.abs(newLz - (leftWallLzRef.current ?? Infinity));\r\n const rightDiff = Math.abs(newLz - (rightWallLzRef.current ?? Infinity));\r\n if (leftDiff < rightDiff && leftDiff < 0.5 && leftWallLzRef.current) {\r\n newLz = leftWallLzRef.current;\r\n } else if (rightDiff <= leftDiff && rightDiff < 0.5 && rightWallLzRef.current) {\r\n newLz = rightWallLzRef.current;\r\n }\r\n }\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id) {\r\n const wall = e as WallModel;\r\n if (wall.fill === WallFill.Partial) {\r\n newLz = Math.max(newLz, wall.leftTopPartialHeight, wall.rightTopPartialHeight);\r\n }\r\n wall.lz = newLz;\r\n wall.cz = newLz / 2;\r\n // if (newLz < wall.leftTopPartialHeight) {\r\n // wall.leftTopPartialHeight = newLz;\r\n // }\r\n // if (newLz < wall.rightTopPartialHeight) {\r\n // wall.rightTopPartialHeight = newLz;\r\n // }\r\n break;\r\n }\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n const wall = e as WallModel;\r\n if (wall.fill === WallFill.Partial) {\r\n newLz = Math.max(newLz, wall.leftTopPartialHeight, wall.rightTopPartialHeight);\r\n }\r\n }\r\n }\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n e.lz = newLz;\r\n e.cz = newLz / 2;\r\n }\r\n }\r\n }\r\n state.selectedElementHeight = Math.max(0.1, p.z);\r\n state.actionState.wallHeight = newLz;\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.WallPartialResizeLeft: {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n let newUnfilledHeight = Util.clamp(p.z - parentLz, 0, wall.leftTopPartialHeight);\r\n if (wall.leftJoints.length > 0) {\r\n const leftWall = state.elements.find(\r\n (e) => e.id === wall.leftJoints[0] && e.type === ObjectType.Wall,\r\n ) as WallModel;\r\n if (leftWall && leftWall.fill === WallFill.Partial) {\r\n const leftWallRightUnfilledHeight = leftWall.rightUnfilledHeight;\r\n if (Math.abs(newUnfilledHeight - leftWallRightUnfilledHeight) < 0.5) {\r\n newUnfilledHeight = leftWallRightUnfilledHeight;\r\n }\r\n }\r\n }\r\n if (\r\n isPartialWallValid(\r\n wall,\r\n newUnfilledHeight,\r\n state.enableFineGrid ? newUnfilledHeight : wall.rightUnfilledHeight,\r\n wall.leftTopPartialHeight,\r\n wall.rightTopPartialHeight,\r\n )\r\n ) {\r\n wall.leftUnfilledHeight = newUnfilledHeight;\r\n if (state.enableFineGrid) {\r\n wall.rightUnfilledHeight = newUnfilledHeight;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.WallPartialResizeRight: {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n let newUnfilledHeight = Util.clamp(p.z - parentLz, 0, wall.rightTopPartialHeight);\r\n if (wall.rightJoints.length > 0) {\r\n const rightWall = state.elements.find(\r\n (e) => e.id === wall.rightJoints[0] && e.type === ObjectType.Wall,\r\n ) as WallModel;\r\n if (rightWall && rightWall.fill === WallFill.Partial) {\r\n const rightWallLeftUnfilledHeight = rightWall.leftUnfilledHeight;\r\n if (Math.abs(newUnfilledHeight - rightWallLeftUnfilledHeight) < 0.5) {\r\n newUnfilledHeight = rightWallLeftUnfilledHeight;\r\n }\r\n }\r\n }\r\n if (\r\n isPartialWallValid(\r\n wall,\r\n state.enableFineGrid ? newUnfilledHeight : wall.leftUnfilledHeight,\r\n newUnfilledHeight,\r\n wall.leftTopPartialHeight,\r\n wall.rightTopPartialHeight,\r\n )\r\n ) {\r\n wall.rightUnfilledHeight = newUnfilledHeight;\r\n if (state.enableFineGrid) {\r\n wall.leftUnfilledHeight = newUnfilledHeight;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.WallPartialResizeLeftTop: {\r\n setCommonStore((state) => {\r\n const wall = state.elements.find((e) => e.id === id && e.type === ObjectType.Wall) as WallModel;\r\n if (wall) {\r\n let newTopPartialResizeHandleHeight = Util.clamp(p.z - parentLz, wall.leftUnfilledHeight, wall.lz);\r\n if (wall.leftJoints.length > 0) {\r\n const leftWall = state.elements.find(\r\n (e) => e.id === wall.leftJoints[0] && e.type === ObjectType.Wall,\r\n ) as WallModel;\r\n if (leftWall && leftWall.fill === WallFill.Partial) {\r\n const leftWallPartialResizeRightTop = leftWall.rightTopPartialHeight;\r\n if (Math.abs(newTopPartialResizeHandleHeight - leftWallPartialResizeRightTop) < 0.5) {\r\n newTopPartialResizeHandleHeight = leftWallPartialResizeRightTop;\r\n }\r\n }\r\n }\r\n if (\r\n isPartialWallValid(\r\n wall,\r\n wall.leftUnfilledHeight,\r\n wall.rightUnfilledHeight,\r\n newTopPartialResizeHandleHeight,\r\n state.enableFineGrid ? newTopPartialResizeHandleHeight : wall.rightTopPartialHeight,\r\n )\r\n ) {\r\n wall.leftTopPartialHeight = newTopPartialResizeHandleHeight;\r\n if (state.enableFineGrid) {\r\n wall.rightTopPartialHeight = newTopPartialResizeHandleHeight;\r\n }\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.WallPartialResizeRightTop: {\r\n setCommonStore((state) => {\r\n const wall = state.elements.find((e) => e.id === id && e.type === ObjectType.Wall) as WallModel;\r\n if (wall) {\r\n let newTopPartialResizeHandleHeight = Util.clamp(p.z - parentLz, wall.rightUnfilledHeight, wall.lz);\r\n if (wall.rightJoints.length > 0) {\r\n const rightWall = state.elements.find(\r\n (e) => e.id === wall.rightJoints[0] && e.type === ObjectType.Wall,\r\n ) as WallModel;\r\n if (rightWall && rightWall.fill === WallFill.Partial) {\r\n const rightWallPartialResizeLeftTop = rightWall.leftTopPartialHeight;\r\n if (Math.abs(newTopPartialResizeHandleHeight - rightWallPartialResizeLeftTop) < 0.5) {\r\n newTopPartialResizeHandleHeight = rightWallPartialResizeLeftTop;\r\n }\r\n }\r\n }\r\n if (\r\n isPartialWallValid(\r\n wall,\r\n wall.leftUnfilledHeight,\r\n wall.rightUnfilledHeight,\r\n state.enableFineGrid ? newTopPartialResizeHandleHeight : wall.leftTopPartialHeight,\r\n newTopPartialResizeHandleHeight,\r\n )\r\n ) {\r\n wall.rightTopPartialHeight = newTopPartialResizeHandleHeight;\r\n if (state.enableFineGrid) {\r\n wall.leftTopPartialHeight = newTopPartialResizeHandleHeight;\r\n }\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n setShowIntersectionPlane(false);\r\n resetJointedWallLz();\r\n pointerDownRef.current = false;\r\n\r\n const newSameBuildingWallsHeightMap = new Map();\r\n if (roofId && roofType !== RoofType.Gable && roofType !== RoofType.Gambrel) {\r\n useStore.getState().elements.forEach((e) => {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n newSameBuildingWallsHeightMap.set(e.id, e.lz);\r\n }\r\n });\r\n }\r\n\r\n const undoableChangeHeight = {\r\n name: 'Change Wall Height',\r\n timestamp: Date.now(),\r\n resizedElementId: id,\r\n resizedElementType: ObjectType.Wall,\r\n oldHeights: [...oldHeightsRef.current],\r\n newHeights: [\r\n z * 2,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialResizeHandleHeight,\r\n rightTopPartialResizeHandleHeight,\r\n ],\r\n oldSameBuildingWallsHeightMap: new Map(oldSameBuildingWallsHeightMapRef.current),\r\n newSameBuildingWallsHeightMap: newSameBuildingWallsHeightMap,\r\n undo() {\r\n updateUndoChange(this.resizedElementId, this.oldHeights, this.oldSameBuildingWallsHeightMap);\r\n },\r\n redo() {\r\n updateUndoChange(this.resizedElementId, this.newHeights, this.newSameBuildingWallsHeightMap);\r\n },\r\n } as UndoableResizeWallHeight;\r\n useStore.getState().addUndoable(undoableChangeHeight);\r\n setCommonStore((state) => {\r\n state.actionState.wallHeight = z * 2;\r\n state.resizeHandleType = null;\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {!orthographic && (\r\n <>\r\n \r\n \r\n\r\n {/* partial resize */}\r\n {fill === WallFill.Partial && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n },\r\n);\r\n\r\nexport default WallResizeHandleWrapper;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { WallModel, WallFill } from 'src/models/WallModel';\r\nimport EmptyWall from './emptyWall';\r\nimport Wall from './wall';\r\nimport WallMoveHandleWrapper from './wallMoveHandleWrapper';\r\nimport WallResizeHandleWrapper from './wallResizeHandleWrapper';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface WallRendererProps {\r\n wallModel: WallModel;\r\n foundationModel: FoundationModel;\r\n}\r\n\r\nconst WallRenderer = ({ wallModel, foundationModel }: WallRendererProps) => {\r\n const {\r\n id,\r\n roofId,\r\n cx,\r\n cy,\r\n lx,\r\n ly,\r\n lz,\r\n relativeAngle,\r\n fill,\r\n locked,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftTopPartialHeight,\r\n rightTopPartialHeight,\r\n leftJoints,\r\n rightJoints,\r\n } = wallModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const [hx, hz] = [lx / 2, lz / 2];\r\n\r\n const isPartial = fill === WallFill.Partial;\r\n const leftRoofHeight = leftJoints.length > 0 ? wallModel.leftRoofHeight : lz;\r\n const rightRoofHeight = rightJoints.length > 0 ? wallModel.rightRoofHeight : lz;\r\n const wallLeftHeight = leftRoofHeight ?? lz;\r\n const wallRightHeight = rightRoofHeight ?? lz;\r\n const realWallLeftHeight = isPartial ? Math.min(wallLeftHeight, leftTopPartialHeight) : wallLeftHeight;\r\n const realWallRightHeight = isPartial ? Math.min(wallRightHeight, rightTopPartialHeight) : wallRightHeight;\r\n const highLight = lx === 0;\r\n\r\n const renderWall = () => {\r\n if (fill === WallFill.Empty) {\r\n return ;\r\n }\r\n return ;\r\n };\r\n\r\n return (\r\n \r\n {renderWall()}\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n <>\r\n {lx > 0.5 && }\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst areEqual = (prev: WallRendererProps, curr: WallRendererProps) => prev.wallModel === curr.wallModel;\r\n\r\nexport default React.memo(WallRenderer, areEqual);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ObjectType } from 'src/types';\r\nimport SolarPanelOnRoof from '../solarPanel/solarPanelOnRoof';\r\nimport shallow from 'zustand/shallow';\r\nimport Window from '../window/window';\r\nimport WallRenderer from '../wall/wallRenderer';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport RoofRenderer from '../roof/roofRenderer';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\n\r\nexport const BUILDING_GROUP_NAME = 'Building Group';\r\n\r\nconst BuildingRenderer = (foundationModel: FoundationModel) => {\r\n const { id, lx, ly, lz } = foundationModel;\r\n\r\n const isBuildingParts = (e: ElementModel) => {\r\n if (e.foundationId !== id) return false;\r\n return (\r\n e.type === ObjectType.Wall ||\r\n e.type === ObjectType.Roof ||\r\n (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) ||\r\n (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Roof)\r\n );\r\n };\r\n\r\n const buildingParts = useStore((state) => state.elements.filter(isBuildingParts), shallow);\r\n\r\n if (buildingParts.length === 0) return null;\r\n\r\n return (\r\n \r\n {buildingParts.map((e) => {\r\n switch (e.type) {\r\n case ObjectType.Wall:\r\n return ;\r\n case ObjectType.Roof:\r\n return ;\r\n case ObjectType.SolarPanel:\r\n // rooftop solar panels\r\n return (\r\n \r\n );\r\n case ObjectType.Window:\r\n // rooftop windows\r\n return ;\r\n default:\r\n return null;\r\n }\r\n })}\r\n \r\n );\r\n};\r\n\r\nconst areEuqal = (prev: FoundationModel, curr: FoundationModel) =>\r\n prev.lx === curr.lx && prev.ly === curr.ly && prev.lz === curr.lz && prev.rotation === curr.rotation;\r\n\r\nexport default React.memo(BuildingRenderer, areEuqal);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport FoundationTexture00 from '../../resources/tiny_white_square.png';\r\nimport FoundationTexture01 from '../../resources/foundation_01.png';\r\nimport FoundationTexture02 from '../../resources/foundation_02.png';\r\nimport FoundationTexture03 from '../../resources/foundation_03.png';\r\nimport FoundationTexture04 from '../../resources/foundation_04.png';\r\nimport FoundationTexture05 from '../../resources/foundation_05.png';\r\nimport FoundationTexture06 from '../../resources/foundation_06.png';\r\nimport FoundationTexture07 from '../../resources/foundation_07.png';\r\n\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Line, Plane, Sphere } from '@react-three/drei';\r\nimport { CanvasTexture, Euler, Group, Mesh, Raycaster, RepeatWrapping, TextureLoader, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from '../../stores/commonRef';\r\nimport { FoundationModel } from '../../models/FoundationModel';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n ActionType,\r\n FoundationTexture,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n SolarStructure,\r\n WallSide,\r\n} from '../../types';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_COLOR_1,\r\n MOVE_HANDLE_COLOR_2,\r\n ORIGIN_VECTOR2,\r\n RESIZE_HANDLE_COLOR,\r\n TWO_PI,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport { Util } from '../../Util';\r\nimport { ElementModel } from '../../models/ElementModel';\r\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\r\nimport { ParabolicTroughModel } from '../../models/ParabolicTroughModel';\r\nimport { ParabolicDishModel } from '../../models/ParabolicDishModel';\r\nimport { PolarGrid } from '../polarGrid';\r\nimport { WallModel } from '../../models/WallModel';\r\nimport RotateHandle from '../../components/rotateHandle';\r\nimport Wireframe from '../../components/wireframe';\r\nimport * as Selector from '../../stores/selector';\r\nimport { FlippedWallSide, UndoableAdd, UndoableAddWall } from '../../undo/UndoableAdd';\r\nimport { UndoableMove, UndoableMoveWall } from '../../undo/UndoableMove';\r\nimport { UndoableResize, UndoableResizeWall } from '../../undo/UndoableResize';\r\nimport { UndoableChange } from '../../undo/UndoableChange';\r\nimport { ElementGrid } from '../elementGrid';\r\nimport i18n from '../../i18n/i18n';\r\nimport { PolygonModel } from '../../models/PolygonModel';\r\nimport { Point2 } from '../../models/Point2';\r\nimport { HorizontalRuler } from '../horizontalRuler';\r\nimport { showError } from '../../helpers';\r\nimport { SolarCollector } from '../../models/SolarCollector';\r\nimport { FresnelReflectorModel } from '../../models/FresnelReflectorModel';\r\nimport SolarUpdraftTower from '../solarUpdraftTower';\r\nimport SolarPowerTower from '../solarPowerTower';\r\nimport SolarReceiverPipe from '../solarReceiverPipe';\r\nimport { UndoablePaste } from '../../undo/UndoablePaste';\r\nimport { useHandleSize } from '../wall/hooks';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { InnerCommonStoreState } from 'src/stores/InnerCommonState';\r\nimport produce from 'immer';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { useSelected } from '../hooks';\r\nimport { debounce } from 'lodash';\r\nimport BuildingRenderer from './buildingRenderer';\r\n\r\ninterface WallAuxiliaryType {\r\n show: boolean;\r\n direction: 'x' | 'y' | 'xy' | null;\r\n position: number[] | null;\r\n}\r\n\r\ninterface SnapTargetType {\r\n id: string | null;\r\n point: Vector3 | null;\r\n side: WallSide | null;\r\n jointId: string | undefined;\r\n}\r\n\r\nexport const FOUNDATION_GROUP_NAME = 'Foundation Group';\r\n\r\nconst Foundation = (foundationModel: FoundationModel) => {\r\n const {\r\n id,\r\n cx,\r\n cy,\r\n lx = 1,\r\n ly = 1,\r\n lz = 0.1,\r\n rotation = [0, 0, 0],\r\n color = 'gray',\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n locked = false,\r\n showLabel = false,\r\n textureType = FoundationTexture.NoTexture,\r\n solarStructure,\r\n } = foundationModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const setCommonStore = useStore(Selector.set);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const setElementSize = useStore(Selector.setElementSize);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLyById = useStore(Selector.updateElementLyById);\r\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\r\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\r\n const updateWallLeftPointById = useStore(Selector.updateWallLeftPointById);\r\n const updateSolarCollectorRelativeAzimuthById = useStore(Selector.updateSolarCollectorRelativeAzimuthById);\r\n const updatePolygonVertexPositionById = useStore(Selector.updatePolygonVertexPositionById);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const pasteElements = useStore(Selector.pasteElementsToPoint);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const addElement = useStore(Selector.addElement);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const deletedWallID = useStore(Selector.deletedWallId);\r\n const updateWallMapOnFoundationFlag = useStore(Selector.updateWallMapOnFoundationFlag);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const addedFoundationID = useStore(Selector.addedFoundationId);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const isAddingElement = useStore(Selector.isAddingElement);\r\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const solarRadiationHeatmapReflectionOnly = useStore(Selector.viewState.solarRadiationHeatmapReflectionOnly);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n\r\n const {\r\n camera,\r\n gl: { domElement },\r\n } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const [showGrid, setShowGrid] = useState(false);\r\n const [wallAuxToAxis, setWallAuxToAxis] = useState({\r\n show: false,\r\n direction: null,\r\n position: null,\r\n });\r\n const [wallAuxToWallArray, setWallAuxToWallArray] = useState([\r\n { show: false, direction: null, position: null },\r\n { show: false, direction: null, position: null },\r\n ]);\r\n\r\n const addedWallIdRef = useRef(null);\r\n const isSettingWallStartPointRef = useRef(false);\r\n const isSettingWallEndPointRef = useRef(false);\r\n const elementsStateBeforeResizingRef = useRef(null);\r\n const flippedWallSide = useRef(FlippedWallSide.null);\r\n\r\n // Use 1: Directly use to get wall points to snap.\r\n // Use 2: Need update first before other use. Intend to reduce call getElementById()\r\n const wallMapOnFoundation = useRef>(new Map());\r\n\r\n const groupRef = useRef(null);\r\n const baseRef = useRef();\r\n const grabRef = useRef(null);\r\n const intersectPlaneRef = useRef();\r\n const resizeHandleLLRef = useRef();\r\n const resizeHandleULRef = useRef();\r\n const resizeHandleLRRef = useRef();\r\n const resizeHandleURRef = useRef();\r\n const moveHandleLowerRef = useRef();\r\n const moveHandleUpperRef = useRef();\r\n const moveHandleLeftRef = useRef();\r\n const moveHandleRightRef = useRef();\r\n const oldPositionRef = useRef(new Vector3());\r\n const newPositionRef = useRef(new Vector3());\r\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const newDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const oldAzimuthRef = useRef(0);\r\n const newAzimuthRef = useRef(0);\r\n const oldVerticesRef = useRef([]);\r\n const newVerticesRef = useRef([]);\r\n const oldJointsRef = useRef([]);\r\n const newJointsRef = useRef([]);\r\n const oldPointRef = useRef([]);\r\n const newPointRef = useRef([]);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const positionLL = useMemo(() => new Vector3(-hx, -hy, hz), [hx, hy, hz]);\r\n const positionUL = useMemo(() => new Vector3(-hx, hy, hz), [hx, hy, hz]);\r\n const positionLR = useMemo(() => new Vector3(hx, -hy, hz), [hx, hy, hz]);\r\n const positionUR = useMemo(() => new Vector3(hx, hy, hz), [hx, hy, hz]);\r\n\r\n // experimental wall handle size, may useful for foundation handles too\r\n const handleRadius = useHandleSize();\r\n\r\n const moveHandleRadius = handleRadius;\r\n const resizeHandleRadius = handleRadius;\r\n const rotateHandleRadius = handleRadius * 4;\r\n const rotateHandlePosition = hy + rotateHandleRadius;\r\n\r\n // for undo auto deletion\r\n type UndoMoveWall = { wall: WallModel; newAngle: number; newJoints: string[][] };\r\n const listenToAutoDeletionRef = useRef(false);\r\n const undoableMoveWallArgsRef = useRef(null);\r\n // only one roof is affected, so no need to use set\r\n const autoDeletedRoofs = useStore(Selector.autoDeletedRoofs);\r\n const autoDeletedChild = useStore(Selector.autoDeletedChild);\r\n\r\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\r\n if (grabRef.current) {\r\n let poleHeight = -1;\r\n switch (grabRef.current.type) {\r\n case ObjectType.SolarPanel:\r\n poleHeight = (grabRef.current as SolarPanelModel).poleHeight;\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n // pole height of parabolic trough is relative to its half width\r\n const trough = grabRef.current as ParabolicTroughModel;\r\n poleHeight = trough.poleHeight + trough.lx / 2;\r\n break;\r\n case ObjectType.ParabolicDish:\r\n // pole height of parabolic dish is relative to its radius\r\n const dish = grabRef.current as ParabolicDishModel;\r\n poleHeight = dish.poleHeight + dish.lx / 2 + (dish.lx * dish.lx) / (4 * dish.latusRectum);\r\n break;\r\n case ObjectType.FresnelReflector:\r\n // pole height of Fresnel reflector is relative to its half width\r\n const reflector = grabRef.current as FresnelReflectorModel;\r\n poleHeight = reflector.poleHeight + reflector.lx / 2;\r\n break;\r\n }\r\n if (poleHeight >= 0) {\r\n intersectionPlanePosition.set(0, 0, foundationModel?.lz / 2 + poleHeight);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n }, [updateWallMapOnFoundationFlag]);\r\n\r\n useEffect(() => {\r\n if (deletedWallID && deletedWallID === addedWallIdRef.current) {\r\n wallMapOnFoundation.current.delete(deletedWallID);\r\n isSettingWallStartPointRef.current = false;\r\n isSettingWallEndPointRef.current = false;\r\n addedWallIdRef.current = null;\r\n setCommonStore((state) => {\r\n if (state.addedWallId === state.deletedWallId) {\r\n state.addedWallId = null;\r\n }\r\n state.deletedWallId = null;\r\n });\r\n useRefStore.getState().setEnableOrbitController(true);\r\n setWallAuxToAxis({ show: false, direction: null, position: null });\r\n setWallAuxToWallArray([\r\n { show: false, direction: null, position: null },\r\n { show: false, direction: null, position: null },\r\n ]);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [deletedWallID]);\r\n\r\n useEffect(() => {\r\n if (foundationModel && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(foundationModel.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n } else {\r\n setHeatmapTexture(null);\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue, solarRadiationHeatmapReflectionOnly]);\r\n\r\n // for undo auto deletion\r\n useEffect(() => {\r\n if (!listenToAutoDeletionRef.current || !useStore.getState().getAutoDeletedElements()) return;\r\n handleUndoMoveWallWithAutoDeletion();\r\n }, [autoDeletedRoofs, autoDeletedChild]);\r\n\r\n const handleUndoMoveWallWithAutoDeletion = debounce(() => {\r\n if (!undoableMoveWallArgsRef.current) return;\r\n\r\n const autoDeletedElements = useStore.getState().getAutoDeletedElements();\r\n if (!autoDeletedElements) return;\r\n\r\n const { wall, newAngle, newJoints } = undoableMoveWallArgsRef.current;\r\n const undoableMove = {\r\n name: 'Move Wall',\r\n timestamp: Date.now(),\r\n id: wall.id,\r\n oldPoints: [[...oldPointRef.current[0]], [...oldPointRef.current[1]]],\r\n newPoints: [[...wall.leftPoint], [...wall.rightPoint]],\r\n oldJoints: [[...oldJointsRef.current[0]], [...oldJointsRef.current[1]]],\r\n newJoints: [[...newJoints[0]], [...newJoints[1]]],\r\n oldAngle: oldAzimuthRef.current,\r\n newAngle: newAngle,\r\n flippedWallSide: flippedWallSide.current,\r\n autoDeletedElements: [...autoDeletedElements],\r\n undo() {\r\n switch (this.flippedWallSide) {\r\n case FlippedWallSide.loop:\r\n flipWallLoop(this.id);\r\n break;\r\n case FlippedWallSide.left:\r\n const lw = getElementById(this.newJoints[0][0]) as WallModel;\r\n if (lw) {\r\n flipWallsClockwise(lw);\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n const rw = getElementById(this.newJoints[1][0]) as WallModel;\r\n if (rw) {\r\n flipWallsCounterClockwise(rw);\r\n }\r\n break;\r\n }\r\n const [oldLeftJoints, oldRightJoints] = this.oldJoints;\r\n const [newLeftJoints, newRightJoints] = this.newJoints;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === this.id) {\r\n const [leftPoint, rightPoint] = this.oldPoints;\r\n e.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n e.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n e.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n const w = e as WallModel;\r\n w.relativeAngle = this.oldAngle;\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n w.leftJoints = [...oldLeftJoints];\r\n w.rightJoints = [...oldRightJoints];\r\n break;\r\n }\r\n }\r\n state.resizeHandleType = null;\r\n state.elements.push(...this.autoDeletedElements);\r\n state.deletedRoofId = null;\r\n state.autoDeletedChild = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n });\r\n if (oldLeftJoints[0] !== newLeftJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldLeftJoints[0]) {\r\n (e as WallModel).rightJoints = [this.id];\r\n }\r\n if (e.id === newLeftJoints[0]) {\r\n if (this.flippedWallSide !== FlippedWallSide.left) {\r\n (e as WallModel).rightJoints = [];\r\n } else {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (oldRightJoints[0] !== newRightJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldRightJoints[0]) {\r\n (e as WallModel).leftJoints = [this.id];\r\n }\r\n if (e.id === newRightJoints[0]) {\r\n if (this.flippedWallSide !== FlippedWallSide.right) {\r\n (e as WallModel).leftJoints = [];\r\n } else {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n redo() {\r\n const [oldLeftJoints, oldRightJoints] = this.oldJoints;\r\n const [newLeftJoints, newRightJoints] = this.newJoints;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === this.id && e.type === ObjectType.Wall) {\r\n const [leftPoint, rightPoint] = this.newPoints;\r\n e.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n e.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n e.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n const w = e as WallModel;\r\n w.relativeAngle = this.newAngle;\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n w.leftJoints = [...newLeftJoints];\r\n w.rightJoints = [...newRightJoints];\r\n break;\r\n }\r\n }\r\n });\r\n if (oldLeftJoints[0] !== newLeftJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldLeftJoints[0]) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n if (e.id === newLeftJoints[0]) {\r\n if (this.flippedWallSide === FlippedWallSide.right) {\r\n (e as WallModel).leftJoints = [this.id];\r\n } else {\r\n (e as WallModel).rightJoints = [this.id];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (oldRightJoints[0] !== newRightJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldRightJoints[0]) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n if (e.id === newRightJoints[0]) {\r\n if (this.flippedWallSide === FlippedWallSide.right) {\r\n (e as WallModel).rightJoints = [this.id];\r\n } else {\r\n (e as WallModel).leftJoints = [this.id];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n switch (this.flippedWallSide) {\r\n case FlippedWallSide.loop:\r\n flipWallLoop(this.id);\r\n break;\r\n case FlippedWallSide.left:\r\n const lw = getElementById(this.newJoints[0][0]) as WallModel;\r\n if (lw) {\r\n flipWallsCounterClockwise(lw);\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n const rw = getElementById(this.newJoints[1][0]) as WallModel;\r\n if (rw) {\r\n flipWallsClockwise(rw);\r\n }\r\n break;\r\n }\r\n const set = new Set(this.autoDeletedElements.map((e) => e.id));\r\n setCommonStore((state) => {\r\n state.resizeHandleType = null;\r\n state.elements = state.elements.filter((e) => !set.has(e.id));\r\n const deletedRoof = this.autoDeletedElements.find((e) => e.type === ObjectType.Roof);\r\n if (deletedRoof) {\r\n state.deletedRoofId = deletedRoof.id;\r\n }\r\n });\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n } as UndoableMoveWall;\r\n addUndoable(undoableMove);\r\n\r\n listenToAutoDeletionRef.current = false;\r\n setCommonStore((state) => {\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n });\r\n }, 100);\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const fetchRepeatDividers = (textureType: FoundationTexture) => {\r\n switch (textureType) {\r\n case FoundationTexture.Texture01:\r\n return { x: 1, y: 1 };\r\n case FoundationTexture.Texture02:\r\n return { x: 2, y: 2 };\r\n case FoundationTexture.Texture03:\r\n return { x: 0.4, y: 0.4 };\r\n case FoundationTexture.Texture04:\r\n return { x: 0.25, y: 0.25 };\r\n case FoundationTexture.Texture05:\r\n return { x: 5, y: 5 };\r\n case FoundationTexture.Texture06:\r\n return { x: 1, y: 1 };\r\n case FoundationTexture.Texture07:\r\n return { x: 1, y: 1 };\r\n default:\r\n return { x: 1, y: 1 };\r\n }\r\n };\r\n\r\n const textureLoader = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case FoundationTexture.Texture01:\r\n textureImg = FoundationTexture01;\r\n break;\r\n case FoundationTexture.Texture02:\r\n textureImg = FoundationTexture02;\r\n break;\r\n case FoundationTexture.Texture03:\r\n textureImg = FoundationTexture03;\r\n break;\r\n case FoundationTexture.Texture04:\r\n textureImg = FoundationTexture04;\r\n break;\r\n case FoundationTexture.Texture05:\r\n textureImg = FoundationTexture05;\r\n break;\r\n case FoundationTexture.Texture06:\r\n textureImg = FoundationTexture06;\r\n break;\r\n case FoundationTexture.Texture07:\r\n textureImg = FoundationTexture07;\r\n break;\r\n default:\r\n textureImg = FoundationTexture00;\r\n }\r\n return new TextureLoader().load(textureImg, (t) => {\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n const param = fetchRepeatDividers(textureType);\r\n t.repeat.set(lx / param.x, ly / param.y);\r\n setTexture(t);\r\n });\r\n }, [textureType, lx, ly]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n domElement.style.cursor = 'move';\r\n } else if (handle === RotateHandleType.Lower || handle === RotateHandleType.Upper) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = useStore.getState().addedFoundationId ? 'crosshair' : 'pointer';\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n domElement.style.cursor = useStore.getState().addedFoundationId ? 'crosshair' : 'default';\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n // only these elements are allowed to be on the foundation\r\n const legalOnFoundation = (type: ObjectType) => {\r\n switch (type) {\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Polygon:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.WindTurbine:\r\n case ObjectType.Wall:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n const findMagnetPoint = (pointer: Vector3, minDist: number) => {\r\n let min = minDist;\r\n let targetPoint: Vector3 | null = null;\r\n let targetID: string | null = null;\r\n let targetSide: WallSide | null = null;\r\n let jointId: string | undefined = undefined;\r\n if (!useStore.getState().enableFineGrid) {\r\n for (const [id, wall] of wallMapOnFoundation.current) {\r\n if (id === addedWallIdRef.current || (grabRef.current && id === grabRef.current.id)) continue;\r\n const leftPoint = new Vector3(wall.leftPoint[0], wall.leftPoint[1], 0);\r\n const rightPoint = new Vector3(wall.rightPoint[0], wall.rightPoint[1], 0);\r\n const distStart = leftPoint?.distanceTo(pointer) ?? Number.MAX_VALUE;\r\n const distEnd = rightPoint?.distanceTo(pointer) ?? Number.MAX_VALUE;\r\n const flag = distStart <= distEnd;\r\n const dist = flag ? distStart : distEnd;\r\n const point = flag ? leftPoint : rightPoint;\r\n if (dist <= min + 0.01) {\r\n min = dist;\r\n targetPoint = point;\r\n jointId = flag ? wall.leftJoints[0] : wall.rightJoints[0];\r\n targetID = id;\r\n targetSide = flag ? WallSide.Left : WallSide.Right;\r\n // if (targetID && !jointId) {\r\n // return { id: targetID, point: targetPoint, side: targetSide, jointId };\r\n // }\r\n }\r\n }\r\n }\r\n return { id: targetID, point: targetPoint, side: targetSide, jointId } as SnapTargetType;\r\n };\r\n\r\n const updatePointer = (p: Vector3, targetPoint?: Vector3 | null) => {\r\n if (!useStore.getState().enableFineGrid) {\r\n if (targetPoint) {\r\n p = targetPoint;\r\n } else {\r\n p = Util.snapToNormalGrid(p);\r\n }\r\n } else {\r\n p = Util.snapToFineGrid(p);\r\n targetPoint = null;\r\n }\r\n return p;\r\n };\r\n\r\n const flipWallLoop = (currentWallId: string) => {\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n let wall = wallMapOnFoundation.current.get(currentWallId);\r\n while (wall && wall.leftJoints.length > 0) {\r\n const wallCopy = wallMapOnFoundation.current.get(wall.id) as WallModel;\r\n if (!wallCopy) {\r\n break;\r\n }\r\n\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === wallCopy.id) {\r\n const w = e as WallModel;\r\n w.relativeAngle = (wallCopy.relativeAngle + Math.PI) % TWO_PI;\r\n w.leftPoint = [...wallCopy.rightPoint];\r\n w.rightPoint = [...wallCopy.leftPoint];\r\n w.leftJoints = [wallCopy.rightJoints[0]];\r\n w.rightJoints = [wallCopy.leftJoints[0]];\r\n break;\r\n }\r\n }\r\n });\r\n\r\n wall = wallMapOnFoundation.current.get(wall.leftJoints[0]);\r\n if (wall && wall!.id === currentWallId) {\r\n break;\r\n }\r\n }\r\n\r\n setCommonStore((state) => {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n if (useStore.getState().resizeHandleType) {\r\n state.resizeHandleType =\r\n useStore.getState().resizeHandleType === ResizeHandleType.LowerLeft\r\n ? ResizeHandleType.LowerRight\r\n : ResizeHandleType.LowerLeft;\r\n }\r\n });\r\n\r\n flippedWallSide.current =\r\n flippedWallSide.current === FlippedWallSide.null ? FlippedWallSide.loop : FlippedWallSide.null;\r\n };\r\n\r\n const flipWallsClockwise = (currWall: WallModel, targetWall?: WallModel) => {\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n const flipWallHead = currWall;\r\n let flipWall = currWall;\r\n while (flipWall) {\r\n const flipWallCopy = wallMapOnFoundation.current.get(flipWall.id) as WallModel;\r\n if (!flipWallCopy) {\r\n break;\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (flipWallCopy && e.id === flipWallCopy.id) {\r\n const wall = e as WallModel;\r\n wall.relativeAngle = (flipWallCopy.relativeAngle + Math.PI) % TWO_PI;\r\n wall.leftPoint = [...flipWallCopy.rightPoint];\r\n wall.rightPoint = [...flipWallCopy.leftPoint];\r\n wall.leftJoints = flipWallCopy.rightJoints.length > 0 ? [flipWallCopy.rightJoints[0]] : [];\r\n wall.rightJoints = flipWallCopy.leftJoints.length > 0 ? [flipWallCopy.leftJoints[0]] : [];\r\n break;\r\n }\r\n }\r\n });\r\n let nextWall: WallModel | undefined = undefined;\r\n if (flipWallCopy.leftJoints.length > 0) {\r\n nextWall = wallMapOnFoundation.current.get(flipWallCopy.leftJoints[0]);\r\n }\r\n if (nextWall && nextWall.id !== flipWallHead.id) {\r\n flipWall = nextWall;\r\n } else {\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n if (targetWall) {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === flipWallHead.id) {\r\n (e as WallModel).leftJoints = [targetWall.id];\r\n }\r\n if (e.id === targetWall.id) {\r\n (e as WallModel).rightJoints = [flipWallHead.id];\r\n }\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.resizeHandleType = ResizeHandleType.LowerLeft;\r\n });\r\n\r\n // side after flip\r\n flippedWallSide.current =\r\n flippedWallSide.current === FlippedWallSide.null ? FlippedWallSide.right : FlippedWallSide.null;\r\n };\r\n\r\n const flipWallsCounterClockwise = (currWall: WallModel, targetWall?: WallModel) => {\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n const flipWallHead = currWall;\r\n let flipWall = currWall;\r\n while (flipWall) {\r\n const flipWallCopy = wallMapOnFoundation.current.get(flipWall.id) as WallModel;\r\n if (!flipWallCopy) {\r\n break;\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (flipWallCopy && e.id === flipWallCopy.id) {\r\n const wall = e as WallModel;\r\n wall.relativeAngle = (flipWallCopy.relativeAngle + Math.PI) % TWO_PI;\r\n wall.leftPoint = [...flipWallCopy.rightPoint];\r\n wall.rightPoint = [...flipWallCopy.leftPoint];\r\n wall.leftJoints = flipWallCopy.rightJoints.length > 0 ? [flipWallCopy.rightJoints[0]] : [];\r\n wall.rightJoints = flipWallCopy.leftJoints.length > 0 ? [flipWallCopy.leftJoints[0]] : [];\r\n break;\r\n }\r\n }\r\n });\r\n let nextWall: WallModel | undefined = undefined;\r\n if (flipWallCopy.rightJoints.length > 0) {\r\n nextWall = wallMapOnFoundation.current.get(flipWallCopy.rightJoints[0]);\r\n }\r\n if (nextWall && nextWall.id !== flipWallHead.id) {\r\n flipWall = nextWall;\r\n } else {\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n if (targetWall) {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === flipWallHead.id) {\r\n (e as WallModel).rightJoints = [targetWall.id];\r\n }\r\n if (e.id === targetWall.id) {\r\n (e as WallModel).leftJoints = [flipWallHead.id];\r\n }\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.resizeHandleType = ResizeHandleType.LowerRight;\r\n });\r\n // side after flip\r\n flippedWallSide.current =\r\n flippedWallSide.current === FlippedWallSide.null ? FlippedWallSide.left : FlippedWallSide.null;\r\n };\r\n\r\n const checkWallLoop = (currentWallId: string) => {\r\n let wall: WallModel | undefined = undefined;\r\n\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.id === currentWallId) {\r\n wall = e as WallModel;\r\n }\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n\r\n // check is loop closed\r\n let isClosed = false;\r\n while (wall && wall.leftJoints.length > 0) {\r\n wall = wallMapOnFoundation.current.get(wall.leftJoints[0]);\r\n if (wall?.id === currentWallId) {\r\n isClosed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isClosed) {\r\n // get interior angle sum\r\n let totalAngle = 0;\r\n let totalNumber = 0;\r\n while (wall && wall.leftJoints.length > 0) {\r\n const targetWall = wallMapOnFoundation.current.get(wall.leftJoints[0]);\r\n const deltaAngle = (Math.PI * 3 - (wall.relativeAngle - targetWall!.relativeAngle)) % TWO_PI;\r\n totalAngle += deltaAngle;\r\n totalNumber += 1;\r\n wall = targetWall;\r\n if (wall!.id === currentWallId) {\r\n break;\r\n }\r\n }\r\n\r\n // check if it needs a flip\r\n if (totalAngle > (totalNumber - 2) * Math.PI + 0.1) {\r\n flipWallLoop(currentWallId);\r\n } else {\r\n if (flippedWallSide.current !== FlippedWallSide.null) {\r\n flippedWallSide.current = FlippedWallSide.loop;\r\n }\r\n }\r\n }\r\n\r\n return isClosed;\r\n };\r\n\r\n const handleUndoableAdd = (element: ElementModel) => {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: element,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n };\r\n\r\n const handleUndoableAddWall = (element: WallModel) => {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: element,\r\n flippedWallSide: flippedWallSide.current,\r\n undo: () => {\r\n const wall = undoableAdd.addedElement as WallModel;\r\n removeElementById(wall.id, false);\r\n if (\r\n (undoableAdd.flippedWallSide === FlippedWallSide.right ||\r\n undoableAdd.flippedWallSide === FlippedWallSide.loop) &&\r\n wall.rightJoints.length > 0\r\n ) {\r\n const rightWall = getElementById(wall.rightJoints[0]);\r\n if (rightWall) {\r\n flipWallsCounterClockwise(rightWall as WallModel);\r\n }\r\n } else if (undoableAdd.flippedWallSide === FlippedWallSide.left && wall.leftJoints.length > 0) {\r\n const leftWall = getElementById(wall.leftJoints[0]);\r\n if (leftWall) {\r\n flipWallsClockwise(leftWall as WallModel);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const wall = undoableAdd.addedElement as WallModel;\r\n if (\r\n undoableAdd.flippedWallSide === FlippedWallSide.right ||\r\n (undoableAdd.flippedWallSide === FlippedWallSide.loop && wall.rightJoints.length > 0)\r\n ) {\r\n const rightWall = getElementById(wall.rightJoints[0]);\r\n if (rightWall) {\r\n flipWallsClockwise(rightWall as WallModel);\r\n }\r\n } else if (undoableAdd.flippedWallSide === FlippedWallSide.left && wall.leftJoints.length > 0) {\r\n const leftWall = getElementById(wall.leftJoints[0]);\r\n if (leftWall) {\r\n flipWallsCounterClockwise(leftWall as WallModel);\r\n }\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\r\n }\r\n if (wall.leftJoints.length > 0) {\r\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\r\n }\r\n setCommonStore((state) => {\r\n state.elements.push(wall);\r\n state.selectedElement = wall;\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n },\r\n } as UndoableAddWall;\r\n addUndoable(undoableAdd);\r\n };\r\n\r\n const handleUndoableResizeWall = (element: WallModel) => {\r\n const autoDeletedElement = useStore.getState().getAutoDeletedElements();\r\n const undoableResize = {\r\n name: 'Resize Wall',\r\n timestamp: Date.now(),\r\n resizedElementId: element.id,\r\n resizedElementType: element.type,\r\n oldPosition: oldPositionRef.current.clone(),\r\n newPosition: newPositionRef.current.clone(),\r\n oldDimension: oldDimensionRef.current.clone(),\r\n newDimension: newDimensionRef.current.clone(),\r\n oldAngle: oldAzimuthRef.current,\r\n newAngle: newAzimuthRef.current,\r\n oldJoints: [[...oldJointsRef.current[0]], [...oldJointsRef.current[1]]],\r\n newJoints: [[...newJointsRef.current[0]], [...newJointsRef.current[1]]],\r\n oldPoint: [[...oldPointRef.current[0]], [...oldPointRef.current[1]]],\r\n newPoint: [[...newPointRef.current[0]], [...newPointRef.current[1]]],\r\n flippedWallSide: flippedWallSide.current,\r\n autoDeletedElement: autoDeletedElement ? [...autoDeletedElement] : [],\r\n undo: () => {\r\n switch (undoableResize.flippedWallSide) {\r\n case FlippedWallSide.right:\r\n if (undoableResize.newJoints[1]) {\r\n const rightWall = getElementById(undoableResize.newJoints[1][0]);\r\n if (rightWall) {\r\n flipWallsCounterClockwise(rightWall as WallModel);\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.left:\r\n if (undoableResize.newJoints[0]) {\r\n const leftWall = getElementById(undoableResize.newJoints[0][0]);\r\n if (leftWall) {\r\n flipWallsClockwise(leftWall as WallModel);\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.loop:\r\n if (undoableResize.newJoints[0] && undoableResize.newJoints[1]) {\r\n flipWallLoop(undoableResize.resizedElementId);\r\n } else if (undoableResize.newJoints[1]) {\r\n const rightWall = getElementById(undoableResize.newJoints[1][0]);\r\n if (rightWall) {\r\n flipWallsCounterClockwise(rightWall as WallModel);\r\n }\r\n } else if (undoableResize.newJoints[0]) {\r\n const leftWall = getElementById(undoableResize.newJoints[0][0]);\r\n if (leftWall) {\r\n flipWallsClockwise(leftWall as WallModel);\r\n }\r\n }\r\n break;\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.resizedElementId) {\r\n const w = e as WallModel;\r\n w.cx = undoableResize.oldPosition.x;\r\n w.cy = undoableResize.oldPosition.y;\r\n w.cz = undoableResize.oldPosition.z;\r\n w.lx = undoableResize.oldDimension.x;\r\n w.ly = undoableResize.oldDimension.y;\r\n w.lz = undoableResize.oldDimension.z;\r\n w.relativeAngle = undoableResize.oldAngle;\r\n w.leftJoints = [...undoableResize.oldJoints[0]];\r\n w.rightJoints = [...undoableResize.oldJoints[1]];\r\n w.leftPoint = [...undoableResize.oldPoint[0]];\r\n w.rightPoint = [...undoableResize.oldPoint[1]];\r\n\r\n switch (undoableResize.flippedWallSide) {\r\n case FlippedWallSide.loop: {\r\n // old left\r\n if (undoableResize.oldJoints[0] !== undoableResize.newJoints[1]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).rightJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [undoableResize.resizedElementId];\r\n }\r\n }\r\n }\r\n }\r\n // old right\r\n else if (undoableResize.oldJoints[1] !== undoableResize.newJoints[0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).leftJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [undoableResize.resizedElementId];\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case FlippedWallSide.left:\r\n case FlippedWallSide.right: {\r\n // old left attach, do: new right detach\r\n if (!undoableResize.oldJoints[0] && undoableResize.newJoints[1]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall && n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n break;\r\n }\r\n }\r\n }\r\n // old right attach, do: new left detach\r\n else if (!undoableResize.oldJoints[1] && undoableResize.newJoints[0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall && n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n break;\r\n }\r\n }\r\n }\r\n // change old left attach side\r\n else if (undoableResize.flippedWallSide === FlippedWallSide.left && undoableResize.oldJoints[0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [w.id];\r\n }\r\n }\r\n }\r\n }\r\n // change old right attach side\r\n else if (undoableResize.flippedWallSide === FlippedWallSide.right && undoableResize.oldJoints[1]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [w.id];\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case FlippedWallSide.null: {\r\n // left handle\r\n if (undoableResize.oldJoints[0] !== undoableResize.newJoints[0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [w.id];\r\n }\r\n }\r\n }\r\n }\r\n // right handle\r\n if (undoableResize.oldJoints[1] !== undoableResize.newJoints[1]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n }\r\n if (n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [w.id];\r\n }\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n state.elements.push(...undoableResize.autoDeletedElement);\r\n state.resizeHandleType = null;\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n });\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n redo: () => {\r\n if (undoableResize.autoDeletedElement.length > 0) {\r\n removeElementById(undoableResize.autoDeletedElement[0].id, false, false, true);\r\n }\r\n const deletedIdSet = new Set(undoableResize.autoDeletedElement.map((e) => e.id));\r\n setCommonStore((state) => {\r\n state.elements = state.elements.filter((e) => !deletedIdSet.has(e.id));\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.resizedElementId) {\r\n const w = e as WallModel;\r\n w.cx = undoableResize.newPosition.x;\r\n w.cy = undoableResize.newPosition.y;\r\n w.cz = undoableResize.newPosition.z;\r\n w.lx = undoableResize.newDimension.x;\r\n w.ly = undoableResize.newDimension.y;\r\n w.lz = undoableResize.newDimension.z;\r\n\r\n switch (undoableResize.flippedWallSide) {\r\n case FlippedWallSide.left:\r\n w.relativeAngle = (undoableResize.newAngle + Math.PI) % TWO_PI;\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall && n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n break;\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n w.relativeAngle = (undoableResize.newAngle + Math.PI) % TWO_PI;\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall && n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n break;\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.loop:\r\n w.relativeAngle = (undoableResize.newAngle + Math.PI) % TWO_PI;\r\n w.leftJoints = [...undoableResize.newJoints[1]];\r\n w.rightJoints = [...undoableResize.newJoints[0]];\r\n w.leftPoint = [...undoableResize.newPoint[1]];\r\n w.rightPoint = [...undoableResize.newPoint[0]];\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).leftJoints = [w.id];\r\n }\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).rightJoints = [w.id];\r\n }\r\n }\r\n }\r\n break;\r\n case FlippedWallSide.null:\r\n w.relativeAngle = undoableResize.newAngle;\r\n w.leftJoints = [...undoableResize.newJoints[0]];\r\n w.rightJoints = [...undoableResize.newJoints[1]];\r\n w.leftPoint = [...undoableResize.newPoint[0]];\r\n w.rightPoint = [...undoableResize.newPoint[1]];\r\n // left handle\r\n if (undoableResize.oldJoints[0][0] !== undoableResize.newJoints[0][0]) {\r\n // left handle\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[0][0]) {\r\n (n as WallModel).rightJoints = [w.id];\r\n }\r\n if (n.id === undoableResize.oldJoints[0][0]) {\r\n (n as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n // right handle\r\n if (undoableResize.oldJoints[1][0] !== undoableResize.newJoints[1][0]) {\r\n for (const n of state.elements) {\r\n if (n.type === ObjectType.Wall) {\r\n if (n.id === undoableResize.newJoints[1][0]) {\r\n (n as WallModel).leftJoints = [w.id];\r\n }\r\n if (n.id === undoableResize.oldJoints[1][0]) {\r\n (n as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n state.resizeHandleType = null;\r\n });\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n });\r\n });\r\n switch (undoableResize.flippedWallSide) {\r\n case FlippedWallSide.left: {\r\n const currWall = getElementById(undoableResize.resizedElementId) as WallModel;\r\n const targetWall = getElementById(undoableResize.newJoints[1][0]) as WallModel;\r\n flipWallsCounterClockwise(currWall, targetWall);\r\n break;\r\n }\r\n case FlippedWallSide.right: {\r\n const currWall = getElementById(undoableResize.resizedElementId) as WallModel;\r\n const targetWall = getElementById(undoableResize.newJoints[0][0]) as WallModel;\r\n flipWallsClockwise(currWall, targetWall);\r\n break;\r\n }\r\n case FlippedWallSide.loop:\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n flipWallLoop(undoableResize.resizedElementId);\r\n break;\r\n }\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n } as UndoableResizeWall;\r\n addUndoable(undoableResize);\r\n setCommonStore((state) => {\r\n state.actionState.wallHeight = element.lz;\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = [];\r\n });\r\n };\r\n\r\n const handleUndoableMoveWall = (wall: WallModel, newAngle: number, newJoints: string[][]) => {\r\n if (!wall.roofId) {\r\n const undoableMove = {\r\n name: 'Move Wall',\r\n timestamp: Date.now(),\r\n id: wall.id,\r\n oldPoints: [[...oldPointRef.current[0]], [...oldPointRef.current[1]]],\r\n newPoints: [[...wall.leftPoint], [...wall.rightPoint]],\r\n oldJoints: [[...oldJointsRef.current[0]], [...oldJointsRef.current[1]]],\r\n newJoints: [[...newJoints[0]], [...newJoints[1]]],\r\n oldAngle: oldAzimuthRef.current,\r\n newAngle: newAngle,\r\n flippedWallSide: flippedWallSide.current,\r\n undo() {\r\n switch (this.flippedWallSide) {\r\n case FlippedWallSide.loop:\r\n flipWallLoop(this.id);\r\n break;\r\n case FlippedWallSide.left:\r\n const lw = getElementById(this.newJoints[0][0]) as WallModel;\r\n if (lw) {\r\n flipWallsClockwise(lw);\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n const rw = getElementById(this.newJoints[1][0]) as WallModel;\r\n if (rw) {\r\n flipWallsCounterClockwise(rw);\r\n }\r\n break;\r\n }\r\n const [oldLeftJoints, oldRightJoints] = this.oldJoints;\r\n const [newLeftJoints, newRightJoints] = this.newJoints;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === this.id) {\r\n const [leftPoint, rightPoint] = this.oldPoints;\r\n e.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n e.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n e.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n const w = e as WallModel;\r\n w.relativeAngle = this.oldAngle;\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n w.leftJoints = [...oldLeftJoints];\r\n w.rightJoints = [...oldRightJoints];\r\n break;\r\n }\r\n }\r\n state.resizeHandleType = null;\r\n });\r\n if (oldLeftJoints[0] !== newLeftJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldLeftJoints[0]) {\r\n (e as WallModel).rightJoints = [this.id];\r\n }\r\n if (e.id === newLeftJoints[0]) {\r\n if (this.flippedWallSide !== FlippedWallSide.left) {\r\n (e as WallModel).rightJoints = [];\r\n } else {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (oldRightJoints[0] !== newRightJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldRightJoints[0]) {\r\n (e as WallModel).leftJoints = [this.id];\r\n }\r\n if (e.id === newRightJoints[0]) {\r\n if (this.flippedWallSide !== FlippedWallSide.right) {\r\n (e as WallModel).leftJoints = [];\r\n } else {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n redo() {\r\n const [oldLeftJoints, oldRightJoints] = this.oldJoints;\r\n const [newLeftJoints, newRightJoints] = this.newJoints;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === this.id && e.type === ObjectType.Wall) {\r\n const [leftPoint, rightPoint] = this.newPoints;\r\n e.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n e.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n e.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n const w = e as WallModel;\r\n w.relativeAngle = this.newAngle;\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n w.leftJoints = [...newLeftJoints];\r\n w.rightJoints = [...newRightJoints];\r\n break;\r\n }\r\n }\r\n });\r\n if (oldLeftJoints[0] !== newLeftJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldLeftJoints[0]) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n if (e.id === newLeftJoints[0]) {\r\n if (this.flippedWallSide === FlippedWallSide.right) {\r\n (e as WallModel).leftJoints = [this.id];\r\n } else {\r\n (e as WallModel).rightJoints = [this.id];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (oldRightJoints[0] !== newRightJoints[0]) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === oldRightJoints[0]) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n if (e.id === newRightJoints[0]) {\r\n if (this.flippedWallSide === FlippedWallSide.right) {\r\n (e as WallModel).rightJoints = [this.id];\r\n } else {\r\n (e as WallModel).leftJoints = [this.id];\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n switch (this.flippedWallSide) {\r\n case FlippedWallSide.loop:\r\n flipWallLoop(this.id);\r\n break;\r\n case FlippedWallSide.left:\r\n const lw = getElementById(this.newJoints[0][0]) as WallModel;\r\n if (lw) {\r\n flipWallsCounterClockwise(lw);\r\n }\r\n break;\r\n case FlippedWallSide.right:\r\n const rw = getElementById(this.newJoints[1][0]) as WallModel;\r\n if (rw) {\r\n flipWallsClockwise(rw);\r\n }\r\n break;\r\n }\r\n setCommonStore((state) => {\r\n state.resizeHandleType = null;\r\n });\r\n flippedWallSide.current = FlippedWallSide.null;\r\n },\r\n } as UndoableMoveWall;\r\n addUndoable(undoableMove);\r\n } else {\r\n listenToAutoDeletionRef.current = true;\r\n undoableMoveWallArgsRef.current = { wall, newAngle, newJoints: [[...newJoints[0]], [...newJoints[1]]] };\r\n }\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.button === 2) {\r\n if (e.altKey) {\r\n selectMe(id, e, ActionType.Select);\r\n }\r\n return;\r\n }\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = null;\r\n });\r\n if (useStore.getState().objectTypeToAdd !== ObjectType.Window && !isAddingElement()) {\r\n selectMe(id, e, ActionType.Select);\r\n }\r\n const selectedElement = getSelectedElement();\r\n let bypass = false;\r\n if (\r\n e.intersections[0].object.name === ObjectType.Polygon &&\r\n useStore.getState().objectTypeToAdd !== ObjectType.None\r\n ) {\r\n bypass = true;\r\n }\r\n // no child of this foundation is clicked\r\n if (selectedElement?.id === id || bypass) {\r\n if (legalOnFoundation(useStore.getState().objectTypeToAdd)) {\r\n if (foundationModel) {\r\n setShowGrid(true);\r\n const position = e.intersections.filter(\r\n (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\r\n )[0].point;\r\n const addedElement = addElement(foundationModel, position);\r\n if (addedElement) {\r\n handleUndoableAdd(addedElement);\r\n }\r\n setCommonStore((state) => {\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n } else {\r\n useRefStore.getState().selectNone();\r\n useRefStore.setState((state) => {\r\n state.foundationRef = groupRef;\r\n });\r\n }\r\n }\r\n // a child of this foundation is clicked\r\n else {\r\n if (selectedElement && selectedElement.parentId === id) {\r\n if (legalOnFoundation(selectedElement.type)) {\r\n grabRef.current = selectedElement;\r\n if (selectedElement.type === ObjectType.Wall && !isSettingWallStartPointRef.current) {\r\n elementsStateBeforeResizingRef.current = [...useStore.getState().elements];\r\n }\r\n setShowGrid(true);\r\n oldPositionRef.current.set(selectedElement.cx, selectedElement.cy, selectedElement.cz);\r\n oldDimensionRef.current.set(selectedElement.lx, selectedElement.ly, selectedElement.lz);\r\n switch (selectedElement.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n oldAzimuthRef.current = (selectedElement as SolarCollector).relativeAzimuth;\r\n break;\r\n case ObjectType.Polygon:\r\n oldVerticesRef.current = (selectedElement as PolygonModel).vertices.map((v) => ({ ...v }));\r\n break;\r\n case ObjectType.Wall:\r\n const wall = selectedElement as WallModel;\r\n oldAzimuthRef.current = wall.relativeAngle;\r\n oldJointsRef.current = [[...wall.leftJoints], [...wall.rightJoints]];\r\n oldPointRef.current = [[...wall.leftPoint], [...wall.rightPoint]];\r\n wallNewLeftJointIdRef.current = wall.leftJoints[0];\r\n wallNewRightJointIdRef.current = wall.rightJoints[0];\r\n wallMapOnFoundation.current.clear();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && e.parentId === id) {\r\n wallMapOnFoundation.current.set(e.id, e as WallModel);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (isSettingWallStartPointRef.current && addedWallIdRef.current && baseRef.current) {\r\n const intersects = ray.intersectObjects([baseRef.current]);\r\n if (intersects.length === 0) return;\r\n let p = Util.wallRelativePosition(intersects[0].point, foundationModel);\r\n\r\n if (wallAuxToWallArray[0].position) {\r\n p.setX(wallAuxToWallArray[0].position[0]);\r\n p.setY(wallAuxToWallArray[0].position[1]);\r\n }\r\n\r\n const { id: targetID, point: targetPoint, side: targetSide, jointId: targetJointId } = findMagnetPoint(p, 1.5);\r\n p = updatePointer(p, targetPoint);\r\n\r\n let resizeHandleType = ResizeHandleType.LowerRight;\r\n\r\n // attach to other wall\r\n if (targetID) {\r\n const targetWall = getElementById(targetID) as WallModel;\r\n\r\n // left to right\r\n if (targetSide === WallSide.Right) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === addedWallIdRef.current) {\r\n const wall = e as WallModel;\r\n wall.cx = p.x;\r\n wall.cy = p.y;\r\n if (targetWall.rightJoints.length === 0) {\r\n wall.leftJoints = [targetWall.id];\r\n }\r\n }\r\n if (e.id === targetID && targetWall.rightJoints.length === 0) {\r\n (e as WallModel).rightJoints = addedWallIdRef.current ? [addedWallIdRef.current] : [];\r\n }\r\n }\r\n }\r\n });\r\n }\r\n // left to left\r\n else if (targetSide === WallSide.Left && !targetJointId) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === addedWallIdRef.current) {\r\n const wall = e as WallModel;\r\n wall.cx = p.x;\r\n wall.cy = p.y;\r\n if (targetWall.leftJoints.length === 0) {\r\n wall.rightJoints = [targetWall.id];\r\n }\r\n }\r\n if (e.id === targetID && targetWall.leftJoints.length === 0) {\r\n (e as WallModel).leftJoints = addedWallIdRef.current ? [addedWallIdRef.current] : [];\r\n }\r\n }\r\n }\r\n });\r\n resizeHandleType = ResizeHandleType.LowerLeft;\r\n }\r\n }\r\n // no attach to wall\r\n else {\r\n setElementPosition(addedWallIdRef.current, p.x, p.y);\r\n }\r\n isSettingWallStartPointRef.current = false;\r\n isSettingWallEndPointRef.current = true;\r\n updateWallLeftPointById(addedWallIdRef.current, [p.x, p.y, p.z]);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = resizeHandleType;\r\n state.resizeAnchor = Util.wallAbsolutePosition(p, foundationModel);\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n grabRef.current = selectedElement;\r\n }\r\n };\r\n\r\n const handlePointerUp = (e: ThreeEvent) => {\r\n if (e.altKey && e.button === 2) {\r\n // for pasting to the right-clicked position while the alt key is held down\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n setCommonStore((state) => {\r\n state.pastePoint.copy(e.intersections[0].point);\r\n state.clickObjectType = ObjectType.Foundation;\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n });\r\n const pastedElements = pasteElements();\r\n if (pastedElements.length > 0) {\r\n const undoablePaste = {\r\n name: 'Paste to Point',\r\n timestamp: Date.now(),\r\n pastedElements: pastedElements.map((m) => ({ ...m })),\r\n undo: () => {\r\n for (const elem of undoablePaste.pastedElements) {\r\n removeElementById(elem.id, false);\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoablePaste.pastedElements);\r\n state.selectedElement = undoablePaste.pastedElements[0];\r\n });\r\n },\r\n } as UndoablePaste;\r\n addUndoable(undoablePaste);\r\n }\r\n }\r\n }\r\n if (\r\n !grabRef.current ||\r\n grabRef.current.parentId !== id ||\r\n grabRef.current.type === ObjectType.Tree ||\r\n grabRef.current.type === ObjectType.Flower ||\r\n grabRef.current.type === ObjectType.Human\r\n )\r\n return;\r\n const elem = getElementById(grabRef.current.id);\r\n if (!elem) return;\r\n switch (elem.type) {\r\n case ObjectType.Wall: {\r\n const wall = elem as WallModel;\r\n if (isSettingWallStartPointRef.current) {\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n state.addedWallId = null;\r\n if (state.actionModeLock) {\r\n state.objectTypeToAdd = ObjectType.Wall;\r\n InnerCommonStoreState.selectNone(state);\r\n }\r\n });\r\n if (addedWallIdRef.current) {\r\n wallMapOnFoundation.current.delete(addedWallIdRef.current);\r\n }\r\n addedWallIdRef.current = null;\r\n isSettingWallStartPointRef.current = false;\r\n isSettingWallEndPointRef.current = false;\r\n } else if (isSettingWallEndPointRef.current && addedWallIdRef.current && baseRef.current) {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n setCommonStore((state) => {\r\n if (state.actionModeLock) {\r\n state.objectTypeToAdd = ObjectType.Wall;\r\n InnerCommonStoreState.selectNone(state);\r\n }\r\n state.addedWallId = null;\r\n if (wall.lx === 0 && elementsStateBeforeResizingRef.current) {\r\n state.elements = [...elementsStateBeforeResizingRef.current];\r\n if (addedWallIdRef.current) {\r\n wallMapOnFoundation.current.delete(addedWallIdRef.current);\r\n }\r\n } else {\r\n handleUndoableAddWall(wall as WallModel);\r\n wallMapOnFoundation.current.set(wall.id, wall);\r\n }\r\n });\r\n addedWallIdRef.current = null;\r\n isSettingWallEndPointRef.current = false;\r\n } else {\r\n if (useStore.getState().resizeHandleType) {\r\n if (wall.lx > 0.45) {\r\n wallMapOnFoundation.current.set(wall.id, wall);\r\n newPositionRef.current.set(wall.cx, wall.cy, wall.cz);\r\n newDimensionRef.current.set(wall.lx, wall.ly, wall.lz);\r\n newAzimuthRef.current = wall.relativeAngle;\r\n newJointsRef.current = [[...wall.leftJoints], [...wall.rightJoints]];\r\n newPointRef.current = [[...wall.leftPoint], [...wall.rightPoint]];\r\n handleUndoableResizeWall(wall);\r\n } else {\r\n setCommonStore((state) => {\r\n if (elementsStateBeforeResizingRef.current) {\r\n state.elements = [...elementsStateBeforeResizingRef.current];\r\n elementsStateBeforeResizingRef.current = null;\r\n }\r\n });\r\n }\r\n } else if (useStore.getState().moveHandleType) {\r\n let newAngle = wall.relativeAngle;\r\n let newLeftJoints: string[] = [];\r\n let newRightJoints: string[] = [];\r\n\r\n if (wallNewLeftJointIdRef.current) {\r\n // detach old left wall\r\n if (\r\n wall.leftJoints.length > 0 &&\r\n (wallNewLeftJointIdRef.current !== wall.leftJoints[0] ||\r\n (wallNewLeftJointIdRef.current === wall.leftJoints[0] && flipCurrWallRef.current))\r\n ) {\r\n updateWallRightJointsById(wall.leftJoints[0], []);\r\n }\r\n // attach new\r\n if (flipCurrWallRef.current) {\r\n updateWallLeftJointsById(wallNewLeftJointIdRef.current, [wall.id]);\r\n newRightJoints = [wallNewLeftJointIdRef.current];\r\n } else {\r\n newLeftJoints = [wallNewLeftJointIdRef.current];\r\n if (flipLeftHandSideWallRef.current) {\r\n updateWallLeftJointsById(wallNewLeftJointIdRef.current, [wall.id]);\r\n const lw = getElementById(wallNewLeftJointIdRef.current) as WallModel;\r\n if (lw) {\r\n flipWallsCounterClockwise(lw);\r\n }\r\n } else {\r\n updateWallRightJointsById(wallNewLeftJointIdRef.current, [wall.id]);\r\n }\r\n }\r\n }\r\n // detach old\r\n else if (wall.leftJoints.length > 0 && wall.leftJoints[0] !== wallNewRightJointIdRef.current) {\r\n newLeftJoints = [];\r\n updateWallRightJointsById(wall.leftJoints[0], []);\r\n }\r\n\r\n if (wallNewRightJointIdRef.current) {\r\n // detach old right wall\r\n if (\r\n wall.rightJoints.length > 0 &&\r\n (wallNewRightJointIdRef.current !== wall.rightJoints[0] ||\r\n (wallNewRightJointIdRef.current === wall.rightJoints[0] && flipCurrWallRef.current)) &&\r\n wall.rightJoints[0] !== wallNewLeftJointIdRef.current\r\n ) {\r\n updateWallLeftJointsById(wall.rightJoints[0], []);\r\n }\r\n // attach new\r\n if (flipCurrWallRef.current) {\r\n updateWallRightJointsById(wallNewRightJointIdRef.current, [wall.id]);\r\n newLeftJoints = [wallNewRightJointIdRef.current!];\r\n } else {\r\n newRightJoints = [wallNewRightJointIdRef.current];\r\n if (flipRightHandSideWallRef.current) {\r\n updateWallRightJointsById(wallNewRightJointIdRef.current, [wall.id]);\r\n const rw = getElementById(wallNewRightJointIdRef.current) as WallModel;\r\n if (rw) {\r\n flipWallsClockwise(rw);\r\n }\r\n } else {\r\n updateWallLeftJointsById(wallNewRightJointIdRef.current, [wall.id]);\r\n }\r\n }\r\n }\r\n // detach old\r\n else if (wall.rightJoints.length > 0 && wall.rightJoints[0] !== wallNewLeftJointIdRef.current) {\r\n newRightJoints = [];\r\n updateWallLeftJointsById(wall.rightJoints[0], []);\r\n }\r\n\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === wall.id && e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n if (flipCurrWallRef.current) {\r\n newAngle = (w.relativeAngle + Math.PI) % TWO_PI;\r\n w.relativeAngle = newAngle;\r\n [w.leftPoint, w.rightPoint] = [[...w.rightPoint], [...w.leftPoint]];\r\n }\r\n\r\n if (newLeftJoints.length === 0 && newRightJoints.length === 0) {\r\n w.roofId = null;\r\n } else if (newLeftJoints.length > 0) {\r\n const newLeftWall = state.elements.find((e) => e.id === newLeftJoints[0]) as WallModel;\r\n if (newLeftWall) {\r\n w.roofId = newLeftWall.roofId;\r\n }\r\n } else if (newRightJoints.length > 0) {\r\n const newRightWall = state.elements.find((e) => e.id === newRightJoints[0]) as WallModel;\r\n if (newRightWall) {\r\n w.roofId = newRightWall.roofId;\r\n }\r\n }\r\n\r\n w.leftJoints = [...newLeftJoints];\r\n w.rightJoints = [...newRightJoints];\r\n break;\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n\r\n checkWallLoop(wall.id);\r\n\r\n handleUndoableMoveWall(wall, newAngle, [[...newLeftJoints], [...newRightJoints]]);\r\n\r\n flipCurrWallRef.current = false;\r\n flipLeftHandSideWallRef.current = false;\r\n flipRightHandSideWallRef.current = false;\r\n wallNewLeftJointIdRef.current = null;\r\n wallNewRightJointIdRef.current = null;\r\n }\r\n }\r\n flippedWallSide.current = FlippedWallSide.null;\r\n setCommonStore((state) => {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n setWallAuxToAxis({ show: false, direction: null, position: null });\r\n setWallAuxToWallArray([\r\n { show: false, direction: null, position: null },\r\n { show: false, direction: null, position: null },\r\n ]);\r\n break;\r\n }\r\n case ObjectType.Polygon: {\r\n if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType) {\r\n newVerticesRef.current = (elem as PolygonModel).vertices.map((v) => ({ ...v }));\r\n const undoableEditPolygon = {\r\n name: useStore.getState().moveHandleType ? 'Move Polygon' : 'Resize Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldVerticesRef.current,\r\n newValue: newVerticesRef.current,\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n undo: () => {\r\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.oldValue as Point2[]);\r\n },\r\n redo: () => {\r\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.newValue as Point2[]);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableEditPolygon);\r\n }\r\n break;\r\n }\r\n default: {\r\n if (useStore.getState().resizeHandleType) {\r\n newPositionRef.current.set(elem.cx, elem.cy, elem.cz);\r\n newDimensionRef.current.set(elem.lx, elem.ly, elem.lz);\r\n if (\r\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE ||\r\n newDimensionRef.current.distanceToSquared(oldDimensionRef.current) > ZERO_TOLERANCE\r\n ) {\r\n const undoableResize = {\r\n name: 'Resize',\r\n timestamp: Date.now(),\r\n resizedElementId: grabRef.current.id,\r\n resizedElementType: grabRef.current.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n oldLx: oldDimensionRef.current.x,\r\n oldLy: oldDimensionRef.current.y,\r\n oldLz: oldDimensionRef.current.z,\r\n newLx: newDimensionRef.current.x,\r\n newLy: newDimensionRef.current.y,\r\n newLz: newDimensionRef.current.z,\r\n undo: () => {\r\n setElementPosition(\r\n undoableResize.resizedElementId,\r\n undoableResize.oldCx,\r\n undoableResize.oldCy,\r\n undoableResize.oldCz,\r\n );\r\n setElementSize(\r\n undoableResize.resizedElementId,\r\n undoableResize.oldLx,\r\n undoableResize.oldLy,\r\n undoableResize.oldLz,\r\n );\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableResize.resizedElementId,\r\n undoableResize.newCx,\r\n undoableResize.newCy,\r\n undoableResize.newCz,\r\n );\r\n setElementSize(\r\n undoableResize.resizedElementId,\r\n undoableResize.newLx,\r\n undoableResize.newLy,\r\n undoableResize.newLz,\r\n );\r\n },\r\n } as UndoableResize;\r\n addUndoable(undoableResize);\r\n }\r\n } else if (useStore.getState().rotateHandleType) {\r\n // currently, solar collectors are the only type of child that can be rotated\r\n if (Util.isSolarCollector(grabRef.current)) {\r\n const collector = grabRef.current as SolarCollector;\r\n if (Math.abs(newAzimuthRef.current - oldAzimuthRef.current) > ZERO_TOLERANCE) {\r\n if (isSolarCollectorNewAzimuthOk(collector, newAzimuthRef.current)) {\r\n setCommonStore((state) => {\r\n state.selectedElementAngle = newAzimuthRef.current;\r\n });\r\n const undoableRotate = {\r\n name: 'Rotate',\r\n timestamp: Date.now(),\r\n oldValue: oldAzimuthRef.current,\r\n newValue: newAzimuthRef.current,\r\n changedElementId: collector.id,\r\n changedElementType: collector.type,\r\n undo: () => {\r\n updateSolarCollectorRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n updateSolarCollectorRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableRotate);\r\n } else {\r\n updateSolarCollectorRelativeAzimuthById(collector.id, oldAzimuthRef.current);\r\n }\r\n }\r\n }\r\n } else {\r\n // for moving sensors, lights, and solar collectors\r\n newPositionRef.current.set(elem.cx, elem.cy, elem.cz);\r\n if (newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE) {\r\n let accept = true;\r\n if (Util.isSolarCollector(elem)) {\r\n accept = isSolarCollectorNewPositionOk(elem as SolarCollector, elem.cx, elem.cy);\r\n }\r\n if (accept) {\r\n const undoableMove = {\r\n name: 'Move',\r\n timestamp: Date.now(),\r\n movedElementId: elem.id,\r\n movedElementType: elem.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n undo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.oldCx,\r\n undoableMove.oldCy,\r\n undoableMove.oldCz,\r\n );\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.newCx,\r\n undoableMove.newCy,\r\n undoableMove.newCz,\r\n );\r\n },\r\n } as UndoableMove;\r\n addUndoable(undoableMove);\r\n } else {\r\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n setShowGrid(false);\r\n grabRef.current = null;\r\n setCommonStore((state) => {\r\n state.resizeHandleType = null;\r\n state.moveHandleType = null;\r\n });\r\n };\r\n\r\n const wallNewLeftJointIdRef = useRef(null);\r\n const wallNewRightJointIdRef = useRef(null);\r\n const flipCurrWallRef = useRef(false);\r\n const flipRightHandSideWallRef = useRef(false);\r\n const flipLeftHandSideWallRef = useRef(false);\r\n\r\n const getWallAngleByPointer = (anchor: Vector3, pointer: Vector3, handleType: ResizeHandleType) => {\r\n let angle =\r\n Math.atan2(pointer.y - anchor.y, pointer.x - anchor.x) -\r\n (handleType === ResizeHandleType.LowerLeft ? Math.PI : 0);\r\n angle = angle >= 0 ? angle : (TWO_PI + angle) % TWO_PI;\r\n return angle;\r\n };\r\n\r\n const alignToWall = (p: Vector3, targetId?: string | null) => {\r\n const THRESHOLD = 1;\r\n let alignedX: number | null = null;\r\n let alignedY: number | null = null;\r\n let minX = Infinity;\r\n let minY = Infinity;\r\n for (const [id, wall] of wallMapOnFoundation.current) {\r\n if (grabRef.current !== null && wall.id !== grabRef.current.id && wall.id !== targetId) {\r\n const leftXDiff = Math.abs(p.x - wall.leftPoint[0]);\r\n const rightXDiff = Math.abs(p.x - wall.rightPoint[0]);\r\n const leftYDiff = Math.abs(p.y - wall.leftPoint[1]);\r\n const rightYDiff = Math.abs(p.y - wall.rightPoint[1]);\r\n if (leftXDiff < THRESHOLD && leftXDiff < minX) {\r\n minX = leftXDiff;\r\n alignedX = wall.leftPoint[0];\r\n }\r\n if (rightXDiff < THRESHOLD && rightXDiff < minX) {\r\n minX = rightXDiff;\r\n alignedX = wall.rightPoint[0];\r\n }\r\n if (leftYDiff < THRESHOLD && leftYDiff < minY) {\r\n minY = leftYDiff;\r\n alignedY = wall.leftPoint[1];\r\n }\r\n if (rightYDiff < THRESHOLD && rightYDiff < minY) {\r\n minY = rightYDiff;\r\n alignedY = wall.rightPoint[1];\r\n }\r\n }\r\n }\r\n\r\n return [alignedX, alignedY];\r\n };\r\n\r\n const alignToAxis = (anchor: Vector3, p: Vector3, handle: ResizeHandleType) => {\r\n const ALIGN_ANGLE_THRESHOLD = 0.05;\r\n const ALIGN_LENGTH_THRESHOLD = 1;\r\n const angle = getWallAngleByPointer(anchor, p, handle);\r\n let alignedX: number | null = null;\r\n let alignedY: number | null = null;\r\n if (\r\n angle < ALIGN_ANGLE_THRESHOLD ||\r\n angle > TWO_PI - ALIGN_ANGLE_THRESHOLD ||\r\n Math.abs(angle - Math.PI) < ALIGN_ANGLE_THRESHOLD ||\r\n Math.abs(p.y - anchor.y) < ALIGN_LENGTH_THRESHOLD\r\n ) {\r\n alignedY = anchor.y;\r\n } else if (\r\n Math.abs(angle - Math.PI / 2) < ALIGN_ANGLE_THRESHOLD ||\r\n Math.abs(angle - (3 * Math.PI) / 2) < ALIGN_ANGLE_THRESHOLD ||\r\n Math.abs(p.x - anchor.x) < ALIGN_LENGTH_THRESHOLD\r\n ) {\r\n alignedX = anchor.x;\r\n }\r\n return [alignedX, alignedY];\r\n };\r\n\r\n const alignPointer = (anchor: Vector3, p: Vector3, handle: ResizeHandleType, targetId?: string | null) => {\r\n const [alignedToWallX, alignedToWallY] = alignToWall(p);\r\n const [alignedToAxisX, alignedToAxisY] = alignToAxis(anchor, p, handle); // coordinates after align to axis\r\n\r\n const alignedX = getClosestAlignedPoint(p.x, alignedToWallX, alignedToAxisX);\r\n const alignedY = getClosestAlignedPoint(p.y, alignedToWallY, alignedToAxisY);\r\n\r\n return new Vector3(alignedX, alignedY, p.z);\r\n };\r\n\r\n const getClosestAlignedPoint = (p: number, val1: number | null, val2: number | null) => {\r\n if (val1 !== null && val2 !== null) {\r\n return Math.abs(val1 - p) < Math.abs(val2 - p) ? val1 : val2;\r\n } else if (val1 !== null) {\r\n return val1;\r\n } else if (val2 !== null) {\r\n return val2;\r\n }\r\n return p;\r\n };\r\n\r\n const checkAndSetPosAlignToWall = (p: Vector3, idx = 0, targetId?: string | null) => {\r\n let [minX, minY] = [Infinity, Infinity];\r\n let alignedX: number | null = null;\r\n let alignedY: number | null = null;\r\n for (const [id, wall] of wallMapOnFoundation.current) {\r\n if (grabRef.current !== null && wall.id !== grabRef.current.id && wall.id !== targetId) {\r\n const leftXDiff = Math.abs(p.x - wall.leftPoint[0]);\r\n const rightXDiff = Math.abs(p.x - wall.rightPoint[0]);\r\n if (leftXDiff < 0.01 && leftXDiff < minX) {\r\n minX = leftXDiff;\r\n alignedX = wall.leftPoint[0];\r\n }\r\n if (rightXDiff < 0.01 && rightXDiff < minX) {\r\n minX = rightXDiff;\r\n alignedX = wall.rightPoint[0];\r\n }\r\n\r\n const leftYDiff = Math.abs(p.y - wall.leftPoint[1]);\r\n const rightYDiff = Math.abs(p.y - wall.rightPoint[1]);\r\n if (leftYDiff < 0.01 && leftYDiff < minY) {\r\n minY = leftYDiff;\r\n alignedY = wall.leftPoint[1];\r\n }\r\n if (rightYDiff < 0.01 && rightYDiff < minY) {\r\n minY = rightYDiff;\r\n alignedY = wall.rightPoint[1];\r\n }\r\n }\r\n }\r\n setWallAuxToWallArray(\r\n produce((draft) => {\r\n if (alignedX !== null && alignedY !== null) {\r\n draft[idx].direction = 'xy';\r\n draft[idx].position = [alignedX, alignedY];\r\n } else if (alignedX !== null) {\r\n draft[idx].direction = 'y';\r\n draft[idx].position = [alignedX, p.y];\r\n } else if (alignedY !== null) {\r\n draft[idx].direction = 'x';\r\n draft[idx].position = [p.x, alignedY];\r\n } else {\r\n draft[idx].direction = null;\r\n draft[idx].position = null;\r\n }\r\n }),\r\n );\r\n return [alignedX !== null, alignedY !== null];\r\n };\r\n\r\n const checkAndSetPosAlignToAxis = (p: Vector3, angle: number) => {\r\n if (Math.abs(angle) < 0.01 || Math.abs(angle - Math.PI) < 0.01) {\r\n setWallAuxToAxis((prev) => ({ ...prev, direction: 'x', position: [p.x, p.y] }));\r\n return [true, false];\r\n } else if (Math.abs(angle - Math.PI / 2) < 0.01 || Math.abs(angle - (3 * Math.PI) / 2) < 0.01) {\r\n setWallAuxToAxis((prev) => ({ ...prev, direction: 'y', position: [p.x, p.y] }));\r\n return [false, true];\r\n } else {\r\n setWallAuxToAxis((prev) => ({ ...prev, direction: null, position: null }));\r\n return [false, false];\r\n }\r\n };\r\n\r\n const setShowWallAux = (toWall: boolean, toAxis: boolean) => {\r\n setWallAuxToWallArray(\r\n produce((draft) => {\r\n draft[0].show = toWall;\r\n }),\r\n );\r\n setWallAuxToAxis((prev) => ({ ...prev, show: toAxis }));\r\n };\r\n\r\n const handleShowAuxiliary = (p: Vector3, angle: number) => {\r\n const [isAlignedToWallX, isAlignedToWallY] = checkAndSetPosAlignToWall(p);\r\n const [isAlignedToAxisX, isAlignedToAxisY] = checkAndSetPosAlignToAxis(p, angle);\r\n\r\n if (isAlignedToWallX && isAlignedToWallY) {\r\n setShowWallAux(true, false);\r\n } else if (isAlignedToWallX) {\r\n setShowWallAux(true, !isAlignedToAxisY && isAlignedToAxisX);\r\n } else if (isAlignedToWallY) {\r\n setShowWallAux(true, !isAlignedToAxisX && isAlignedToAxisY);\r\n } else {\r\n setShowWallAux(false, isAlignedToAxisX || isAlignedToAxisY);\r\n }\r\n };\r\n\r\n // handle pointer move\r\n const handlePointerMove = (e: ThreeEvent) => {\r\n if (!foundationModel) return;\r\n if (grabRef.current && Util.isSolarCollector(grabRef.current)) return;\r\n const objectTypeToAdd = useStore.getState().objectTypeToAdd;\r\n if (!grabRef.current && !addedWallIdRef.current && objectTypeToAdd !== ObjectType.Wall) return;\r\n if (grabRef.current?.parentId !== id && objectTypeToAdd === ObjectType.None) return;\r\n const moveHandleType = useStore.getState().moveHandleType;\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n setRayCast(e);\r\n if (baseRef.current) {\r\n const intersects = ray.intersectObjects([baseRef.current]);\r\n if (intersects.length === 0) return;\r\n let p = intersects[0].point;\r\n if (grabRef.current && grabRef.current.type && !grabRef.current.locked && intersects.length > 0) {\r\n switch (grabRef.current.type) {\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n p = Util.relativeCoordinates(p.x, p.y, p.z, foundationModel);\r\n setElementPosition(grabRef.current.id, p.x, p.y);\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = grabRef.current as PolygonModel;\r\n if (moveHandleType === MoveHandleType.Default) {\r\n // do not snap the centroid to the grid\r\n p = Util.relativeCoordinates(p.x, p.y, p.z, foundationModel);\r\n const centroid = Util.calculatePolygonCentroid(polygon.vertices);\r\n const dx = p.x - centroid.x;\r\n const dy = p.y - centroid.y;\r\n const copy = polygon.vertices.map((v) => ({ ...v }));\r\n copy.forEach((v: Point2) => {\r\n v.x += dx;\r\n v.y += dy;\r\n });\r\n // update all the vertices at once with the DEEP COPY above\r\n // do not update each vertex's position one by one (it is slower)\r\n updatePolygonVerticesById(polygon.id, copy);\r\n } else if (resizeHandleType === ResizeHandleType.Default) {\r\n // snap to the grid (do not call Util.relativeCoordinates because we have to snap in the middle)\r\n p.x -= foundationModel.cx;\r\n p.y -= foundationModel.cy;\r\n p.applyEuler(new Euler().fromArray(foundationModel.rotation.map((a) => -a)));\r\n p = useStore.getState().enableFineGrid ? Util.snapToFineGrid(p) : Util.snapToNormalGrid(p);\r\n p.x /= foundationModel.lx;\r\n p.y /= foundationModel.ly;\r\n updatePolygonVertexPositionById(polygon.id, polygon.selectedIndex, p.x, p.y);\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (useStore.getState().selectedElement?.type !== ObjectType.Wall) break;\r\n if (\r\n resizeHandleType &&\r\n (resizeHandleType === ResizeHandleType.LowerLeft || resizeHandleType === ResizeHandleType.LowerRight)\r\n ) {\r\n const anchor = Util.wallRelativePosition(resizeAnchor, foundationModel);\r\n p = Util.wallRelativePosition(p, foundationModel);\r\n\r\n let target: SnapTargetType | null = null;\r\n\r\n if (useStore.getState().enableFineGrid) {\r\n p = Util.snapToFineGrid(p);\r\n } else {\r\n target = findMagnetPoint(p, 1.5);\r\n if (target?.point) {\r\n p = target.point;\r\n } else {\r\n p = Util.snapToNormalGrid(p);\r\n p = alignPointer(anchor, p, resizeHandleType);\r\n\r\n target = findMagnetPoint(p, 1.5);\r\n if (target?.point) {\r\n p = target.point;\r\n }\r\n }\r\n }\r\n\r\n const angle = getWallAngleByPointer(anchor, p, resizeHandleType);\r\n handleShowAuxiliary(p, angle);\r\n\r\n const lx = p.distanceTo(anchor);\r\n const relativeCenter = new Vector3().addVectors(p, anchor).divideScalar(2);\r\n const leftPoint = resizeHandleType === ResizeHandleType.LowerLeft ? p : anchor;\r\n const rightPoint = resizeHandleType === ResizeHandleType.LowerLeft ? anchor : p;\r\n\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n wall.cx = relativeCenter.x;\r\n wall.cy = relativeCenter.y;\r\n wall.lx = lx;\r\n wall.relativeAngle = angle;\r\n wall.leftPoint = [leftPoint.x, leftPoint.y, 0];\r\n wall.rightPoint = [rightPoint.x, rightPoint.y, 0];\r\n break;\r\n }\r\n }\r\n });\r\n\r\n const currWall = getElementById(grabRef.current.id) as WallModel;\r\n if (currWall) {\r\n // attach to other wall\r\n if (target && target.point) {\r\n if (target.id && target.side && !target.jointId) {\r\n const targetWall = getElementById(target.id) as WallModel;\r\n if (targetWall) {\r\n // left to left\r\n if (\r\n resizeHandleType === ResizeHandleType.LowerLeft &&\r\n targetWall.leftJoints.length === 0 &&\r\n target.side === WallSide.Left\r\n ) {\r\n if (currWall.leftJoints.length > 0 && currWall.leftJoints[0] !== target.id) {\r\n const detachId = currWall.leftJoints[0];\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === detachId && e.type === ObjectType.Wall) {\r\n (e as WallModel).rightJoints = [];\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n flipWallsCounterClockwise(currWall, targetWall);\r\n }\r\n // right to right\r\n else if (\r\n resizeHandleType === ResizeHandleType.LowerRight &&\r\n targetWall.rightJoints.length === 0 &&\r\n target.side === WallSide.Right\r\n ) {\r\n if (currWall.rightJoints.length > 0 && currWall.rightJoints[0] !== target.id) {\r\n const detachId = currWall.rightJoints[0];\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === detachId && e.type === ObjectType.Wall) {\r\n (e as WallModel).leftJoints = [];\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n flipWallsClockwise(currWall, targetWall);\r\n }\r\n // right to left side\r\n else if (\r\n resizeHandleType === ResizeHandleType.LowerRight &&\r\n target.side === WallSide.Left &&\r\n targetWall.leftJoints.length === 0 &&\r\n targetWall.rightJoints[0] !== currWall.id\r\n ) {\r\n setCommonStore((state) => {\r\n let detachId: string | null = null;\r\n if (currWall.rightJoints.length > 0 && currWall.rightJoints[0] !== target?.id) {\r\n detachId = currWall.rightJoints[0];\r\n }\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === currWall.id) {\r\n (e as WallModel).rightJoints = [targetWall.id];\r\n }\r\n if (e.id === targetWall.id) {\r\n (e as WallModel).leftJoints = [currWall.id];\r\n }\r\n if (e.id === detachId) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n });\r\n }\r\n // left to right side\r\n else if (\r\n resizeHandleType === ResizeHandleType.LowerLeft &&\r\n target.side === WallSide.Right &&\r\n targetWall.rightJoints.length === 0 &&\r\n targetWall.leftJoints[0] !== currWall.id\r\n ) {\r\n setCommonStore((state) => {\r\n let detachId: string | null = null;\r\n if (currWall.leftJoints.length > 0 && currWall.leftJoints[0] !== target?.id) {\r\n detachId = currWall.leftJoints[0];\r\n }\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === currWall.id) {\r\n (e as WallModel).leftJoints = [targetWall.id];\r\n }\r\n if (e.id === targetWall.id) {\r\n (e as WallModel).rightJoints = [currWall.id];\r\n }\r\n if (e.id === detachId) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n checkWallLoop(currWall.id);\r\n }\r\n }\r\n }\r\n // detach\r\n else {\r\n if (resizeHandleType === ResizeHandleType.LowerRight && currWall.rightJoints.length > 0) {\r\n const targetWallId = currWall.rightJoints[0];\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === currWall.id) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n if (e.id === targetWallId) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n } else if (resizeHandleType === ResizeHandleType.LowerLeft && currWall.leftJoints.length > 0) {\r\n const targetWallId = currWall.leftJoints[0];\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall) {\r\n if (e.id === currWall.id) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n if (e.id === targetWallId) {\r\n (e as WallModel).rightJoints = [];\r\n }\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n }\r\n }\r\n }\r\n } else if (moveHandleType) {\r\n const currWall = getElementById(grabRef.current.id) as WallModel;\r\n if (currWall) {\r\n p = Util.wallRelativePosition(p, foundationModel);\r\n\r\n const handleOffset = new Vector3();\r\n const euler = new Euler(0, 0, currWall.relativeAngle);\r\n if (moveHandleType === MoveHandleType.Lower) {\r\n handleOffset.setY(handleRadius);\r\n } else if (moveHandleType === MoveHandleType.Upper) {\r\n handleOffset.setY(-handleRadius - currWall.ly);\r\n }\r\n p.add(handleOffset.applyEuler(euler));\r\n\r\n const leftPoint = new Vector3().addVectors(p, new Vector3(-currWall.lx / 2, 0, 0).applyEuler(euler));\r\n const rightPoint = new Vector3().addVectors(p, new Vector3(currWall.lx / 2, 0, 0).applyEuler(euler));\r\n let leftFlip: boolean | null = null;\r\n let rightFlip: boolean | null = null;\r\n let stretched = false;\r\n\r\n flipCurrWallRef.current = false;\r\n flipLeftHandSideWallRef.current = false;\r\n flipRightHandSideWallRef.current = false;\r\n wallNewLeftJointIdRef.current = null;\r\n wallNewRightJointIdRef.current = null;\r\n\r\n const updateWallPointAfterSnap = (targetPoint: Vector3, side: 'left' | 'right') => {\r\n const point = side === 'left' ? leftPoint : rightPoint;\r\n const magnetOffset = new Vector3().subVectors(targetPoint, point);\r\n p.add(magnetOffset);\r\n leftPoint.add(magnetOffset);\r\n rightPoint.add(magnetOffset);\r\n };\r\n\r\n if (!useStore.getState().enableFineGrid) {\r\n let leftTarget = findMagnetPoint(leftPoint, 1);\r\n if (leftTarget.point) {\r\n updateWallPointAfterSnap(leftTarget.point, 'left');\r\n if (leftTarget.id && (!leftTarget.jointId || leftTarget.jointId === currWall.id)) {\r\n wallNewLeftJointIdRef.current = leftTarget.id;\r\n leftFlip = leftTarget.side === WallSide.Left;\r\n }\r\n } else {\r\n wallNewLeftJointIdRef.current = null;\r\n }\r\n\r\n let rightTarget = findMagnetPoint(rightPoint, 1);\r\n if (rightTarget.point) {\r\n if (!leftTarget.id) {\r\n updateWallPointAfterSnap(rightTarget.point, 'right');\r\n }\r\n if (\r\n rightTarget.id &&\r\n (!rightTarget.jointId || rightTarget.jointId === currWall.id) &&\r\n (leftTarget.id !== rightTarget.id || leftTarget.side !== rightTarget.side)\r\n ) {\r\n wallNewRightJointIdRef.current = rightTarget.id;\r\n rightFlip = rightTarget.side === WallSide.Right;\r\n }\r\n } else {\r\n wallNewRightJointIdRef.current = null;\r\n }\r\n\r\n if (!leftTarget.point && !rightTarget.point) {\r\n const [leftAlignedToWallX, leftAlignedToWallY] = alignToWall(leftPoint);\r\n const [rightAlignedToWallX, rightAlignedToWallY] = alignToWall(rightPoint);\r\n\r\n if (leftAlignedToWallX !== null || rightAlignedToWallX !== null) {\r\n const leftDiffX = (leftAlignedToWallX ?? Infinity) - leftPoint.x;\r\n const rightDiffX = (rightAlignedToWallX ?? Infinity) - rightPoint.x;\r\n const diffX = Math.min(leftDiffX, rightDiffX);\r\n leftPoint.setX(leftPoint.x + diffX);\r\n rightPoint.setX(rightPoint.x + diffX);\r\n p.setX(p.x + diffX);\r\n\r\n leftTarget = findMagnetPoint(leftPoint, 1);\r\n if (leftTarget.point) {\r\n updateWallPointAfterSnap(leftTarget.point, 'left');\r\n if (leftTarget.id && (!leftTarget.jointId || leftTarget.jointId === currWall.id)) {\r\n wallNewLeftJointIdRef.current = leftTarget.id;\r\n leftFlip = leftTarget.side === WallSide.Left;\r\n }\r\n } else {\r\n wallNewLeftJointIdRef.current = null;\r\n }\r\n }\r\n if (leftAlignedToWallY !== null || rightAlignedToWallY !== null) {\r\n const leftDiffY = (leftAlignedToWallY ?? Infinity) - leftPoint.y;\r\n const rightDiffY = (rightAlignedToWallY ?? Infinity) - rightPoint.y;\r\n const diffY = Math.min(leftDiffY, rightDiffY);\r\n leftPoint.setY(leftPoint.y + diffY);\r\n rightPoint.setY(rightPoint.y + diffY);\r\n p.setY(p.y + diffY);\r\n\r\n rightTarget = findMagnetPoint(rightPoint, 1);\r\n if (rightTarget.point) {\r\n if (!leftTarget.id) {\r\n updateWallPointAfterSnap(rightTarget.point, 'right');\r\n }\r\n if (\r\n rightTarget.id &&\r\n (!rightTarget.jointId || rightTarget.jointId === currWall.id) &&\r\n (leftTarget.id !== rightTarget.id || leftTarget.side !== rightTarget.side)\r\n ) {\r\n wallNewRightJointIdRef.current = rightTarget.id;\r\n rightFlip = rightTarget.side === WallSide.Right;\r\n }\r\n } else {\r\n wallNewRightJointIdRef.current = null;\r\n }\r\n }\r\n }\r\n\r\n const [isLeftAlignedToWallX, isLeftAlignedToWallY] = checkAndSetPosAlignToWall(leftPoint, 0);\r\n const [isRightAlignedToWallX, isRightAlignedToWallY] = checkAndSetPosAlignToWall(rightPoint, 1);\r\n setWallAuxToWallArray(\r\n produce((draft) => {\r\n draft[0].show = isLeftAlignedToWallX || isLeftAlignedToWallY;\r\n draft[1].show = isRightAlignedToWallX || isRightAlignedToWallY;\r\n }),\r\n );\r\n\r\n // *notice the different between false and null\r\n if ((leftFlip && rightFlip === null) || (rightFlip && leftFlip === null) || (leftFlip && rightFlip)) {\r\n flipCurrWallRef.current = true;\r\n } else if ((leftFlip && rightFlip === false) || (rightFlip && leftFlip === false)) {\r\n flipLeftHandSideWallRef.current = leftFlip;\r\n flipRightHandSideWallRef.current = rightFlip;\r\n }\r\n\r\n if (leftTarget.point && rightTarget.point) {\r\n if (leftTarget.id !== rightTarget.id || leftTarget.side !== rightTarget.side) {\r\n leftPoint.copy(leftTarget.point);\r\n rightPoint.copy(rightTarget.point);\r\n stretched = true;\r\n }\r\n }\r\n }\r\n\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current?.id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n if (stretched) {\r\n wall.cx = (leftPoint.x + rightPoint.x) / 2;\r\n wall.cy = (leftPoint.y + rightPoint.y) / 2;\r\n wall.lx = leftPoint.distanceTo(rightPoint);\r\n let angle = Math.atan2(rightPoint.y - leftPoint.y, rightPoint.x - leftPoint.x);\r\n angle = angle >= 0 ? angle : (TWO_PI + angle) % TWO_PI;\r\n wall.relativeAngle = angle;\r\n } else {\r\n wall.cx = p.x;\r\n wall.cy = p.y;\r\n }\r\n wall.leftPoint = leftPoint.toArray();\r\n wall.rightPoint = rightPoint.toArray();\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (objectTypeToAdd === ObjectType.Wall && !isSettingWallStartPointRef.current) {\r\n elementsStateBeforeResizingRef.current = [...useStore.getState().elements];\r\n const addedWall = addElement(foundationModel, p) as WallModel;\r\n grabRef.current = addedWall;\r\n addedWallIdRef.current = addedWall.id;\r\n isSettingWallStartPointRef.current = true;\r\n setShowGrid(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.addedWallId = addedWall.id;\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n if (addedWallIdRef.current && isSettingWallStartPointRef.current) {\r\n p = Util.wallRelativePosition(intersects[0].point, foundationModel);\r\n\r\n let target: SnapTargetType | null = null;\r\n\r\n if (useStore.getState().enableFineGrid) {\r\n p = Util.snapToFineGrid(p);\r\n } else {\r\n target = findMagnetPoint(p, 1.5);\r\n if (target?.point) {\r\n p = target.point;\r\n } else {\r\n p = Util.snapToNormalGrid(p);\r\n\r\n const [alignedX, alignedY] = alignToWall(p);\r\n if (alignedX !== null) p.setX(alignedX);\r\n if (alignedY !== null) p.setY(alignedY);\r\n\r\n target = findMagnetPoint(p, 1.5);\r\n if (target?.point) {\r\n p = target.point;\r\n }\r\n }\r\n }\r\n\r\n const [isAlignedToWallX, isAlignedToWallY] = checkAndSetPosAlignToWall(p);\r\n setWallAuxToWallArray(\r\n produce((draft) => {\r\n draft[0].show = isAlignedToWallX || isAlignedToWallY;\r\n }),\r\n );\r\n\r\n setElementPosition(addedWallIdRef.current, p.x, p.y);\r\n }\r\n }\r\n };\r\n\r\n const handlePointerOver = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n setCommonStore((state) => {\r\n InnerCommonStoreState.selectMe(state, id, e, ActionType.ContextMenu);\r\n state.pastePoint.copy(e.intersections[0].point);\r\n state.clickObjectType = ObjectType.Foundation;\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n if (e.altKey) {\r\n // when alt key is pressed, don't invoke context menu as it is reserved for fast click-paste\r\n state.contextMenuObjectType = null;\r\n } else {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Foundation;\r\n }\r\n }\r\n }\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n });\r\n };\r\n\r\n const handlePointerOut = () => {\r\n setHovered(false);\r\n setShowGrid(false);\r\n if (grabRef.current) {\r\n if (isSettingWallStartPointRef.current) {\r\n removeElementById(grabRef.current.id, false);\r\n isSettingWallStartPointRef.current = false;\r\n setCommonStore((state) => {\r\n state.addedWallId = null;\r\n state.objectTypeToAdd = ObjectType.Wall;\r\n });\r\n grabRef.current = null;\r\n }\r\n }\r\n setWallAuxToAxis({ show: false, direction: null, position: null });\r\n setWallAuxToWallArray([\r\n { show: false, direction: null, position: null },\r\n { show: false, direction: null, position: null },\r\n ]);\r\n };\r\n\r\n const handlePointerEnter = (e: ThreeEvent) => {\r\n if (grabRef.current && Util.isPlantOrHuman(grabRef.current)) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setShowGrid(true);\r\n }\r\n }\r\n };\r\n\r\n const isSolarCollectorNewPositionOk = (sc: SolarCollector, cx: number, cy: number) => {\r\n const clone = JSON.parse(JSON.stringify(sc)) as SolarCollector;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, foundationModel)) {\r\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const isSolarCollectorNewAzimuthOk = (sc: SolarCollector, az: number) => {\r\n const clone = JSON.parse(JSON.stringify(sc)) as SolarCollector;\r\n clone.relativeAzimuth = az;\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.RotationCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, foundationModel)) {\r\n showError(i18n.t('message.RotationOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const isSolarCollectorNewSizeOk = (sc: SolarCollector, cx: number, cy: number, lx: number, ly: number) => {\r\n // check if the new length will cause the solar collector to intersect with the foundation\r\n if (\r\n sc.type === ObjectType.SolarPanel &&\r\n sc.tiltAngle !== 0 &&\r\n 0.5 * ly * Math.abs(Math.sin(sc.tiltAngle)) > sc.poleHeight\r\n ) {\r\n // we only need to check solar panels, other collectors are guaranteed to not touch the ground\r\n return false;\r\n }\r\n // check if the new size will be within the foundation\r\n const clone = JSON.parse(JSON.stringify(sc)) as SolarCollector;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n clone.lx = lx;\r\n clone.ly = ly;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, foundationModel);\r\n };\r\n\r\n const handleSolarCollectorPointerOut = () => {\r\n if (grabRef.current && Util.isSolarCollector(grabRef.current)) {\r\n // Have to get the latest from the store (we may change this to ref in the future)\r\n const sp = useStore.getState().getElementById(grabRef.current.id) as SolarCollector;\r\n if (useStore.getState().moveHandleType && !isSolarCollectorNewPositionOk(sp, sp.cx, sp.cy)) {\r\n setElementPosition(sp.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n }\r\n }\r\n };\r\n\r\n const handleSolarCollectorPointerMove = (e: ThreeEvent) => {\r\n if (!intersectPlaneRef.current) return;\r\n if (!foundationModel) return;\r\n if (grabRef.current && foundationModel) {\r\n if (!Util.isSolarCollector(grabRef.current)) return;\r\n const collector = grabRef.current as SolarCollector;\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([intersectPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n let p = intersects[0].point; // world coordinate\r\n const moveHandleType = useStore.getState().moveHandleType;\r\n const rotateHandleType = useStore.getState().rotateHandleType;\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n if (moveHandleType && foundationModel) {\r\n p = Util.relativeCoordinates(p.x, p.y, p.z, foundationModel);\r\n setElementPosition(collector.id, p.x, p.y);\r\n } else if (rotateHandleType) {\r\n // tilt of solar panels not handled here\r\n if (rotateHandleType === RotateHandleType.Upper || rotateHandleType === RotateHandleType.Lower) {\r\n const pr = foundationModel.rotation[2]; // parent rotation\r\n const pc = new Vector2(foundationModel.cx, foundationModel.cy); // world parent center\r\n const cc = new Vector2(foundationModel.lx * collector.cx, foundationModel.ly * collector.cy) //local current center\r\n .rotateAround(ORIGIN_VECTOR2, pr); // add parent rotation\r\n const wc = new Vector2().addVectors(cc, pc); // world current center\r\n const rotation =\r\n Math.atan2(-p.x + wc.x, p.y - wc.y) - pr + (rotateHandleType === RotateHandleType.Lower ? 0 : Math.PI);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0; // make sure angle is between -PI to PI\r\n const newAzimuth = rotation + offset;\r\n updateSolarCollectorRelativeAzimuthById(collector.id, newAzimuth);\r\n newAzimuthRef.current = newAzimuth;\r\n }\r\n } else if (resizeHandleType) {\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n const wp = new Vector2(p.x, p.y);\r\n const resizeAnchor2D = new Vector2(resizeAnchor.x, resizeAnchor.y);\r\n const distance = wp.distanceTo(resizeAnchor2D);\r\n const angle = collector.relativeAzimuth + rotation[2]; // world panel azimuth\r\n const rp = new Vector2().subVectors(wp, resizeAnchor2D); // relative vector from anchor to pointer\r\n const wbc = new Vector2(cx, cy); // world foundation center\r\n if (collector.type === ObjectType.SolarPanel) {\r\n const solarPanel = collector as SolarPanelModel;\r\n const pvModel = getPvModule(solarPanel.pvModelName);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n {\r\n const sign = resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\r\n const theta = rp.angle() - angle + sign * HALF_PI;\r\n let dyl = distance * Math.cos(theta);\r\n if (solarPanel.orientation === Orientation.portrait) {\r\n const nx = Math.max(1, Math.ceil((dyl - pvModel.length / 2) / pvModel.length));\r\n dyl = nx * pvModel.length;\r\n } else {\r\n const nx = Math.max(1, Math.ceil((dyl - pvModel.width / 2) / pvModel.width));\r\n dyl = nx * pvModel.width;\r\n }\r\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\r\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy); // world panel center\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, collector.lx, dyl)) {\r\n updateElementLyById(collector.id, dyl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n {\r\n let sign = resizeHandleType === ResizeHandleType.Left ? -1 : 1;\r\n const theta = rp.angle() - angle + (resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\r\n let dxl = distance * Math.cos(theta);\r\n if (solarPanel.orientation === Orientation.portrait) {\r\n const nx = Math.max(1, Math.ceil((dxl - pvModel.width / 2) / pvModel.width));\r\n dxl = nx * pvModel.width;\r\n } else {\r\n const nx = Math.max(1, Math.ceil((dxl - pvModel.length / 2) / pvModel.length));\r\n dxl = nx * pvModel.length;\r\n }\r\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\r\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy);\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, dxl, collector.ly)) {\r\n updateElementLxById(collector.id, dxl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n }\r\n } else if (collector.type === ObjectType.ParabolicTrough) {\r\n const parabolicTrough = collector as ParabolicTroughModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n // these two handles change the length, which is controlled by module length\r\n {\r\n const sign = resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\r\n const theta = rp.angle() - angle + sign * HALF_PI;\r\n let dyl = distance * Math.cos(theta);\r\n const n = Math.max(\r\n 1,\r\n Math.ceil((dyl - parabolicTrough.moduleLength / 2) / parabolicTrough.moduleLength),\r\n );\r\n dyl = n * parabolicTrough.moduleLength;\r\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\r\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy); // world panel center\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, collector.lx, dyl)) {\r\n updateElementLyById(collector.id, dyl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n // these two handles change the width, which is not controlled by module length\r\n {\r\n let sign = resizeHandleType === ResizeHandleType.Left ? -1 : 1;\r\n const theta = rp.angle() - angle + (resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\r\n let dxl = distance * Math.cos(theta);\r\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\r\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy);\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, dxl, collector.ly)) {\r\n updateElementLxById(collector.id, dxl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughWidth = dxl;\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n } else if (collector.type === ObjectType.FresnelReflector) {\r\n const fresnelReflector = collector as FresnelReflectorModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n // these two handles change the length, which is controlled by module length\r\n {\r\n const sign = resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\r\n const theta = rp.angle() - angle + sign * HALF_PI;\r\n let dyl = distance * Math.cos(theta);\r\n const n = Math.max(\r\n 1,\r\n Math.ceil((dyl - fresnelReflector.moduleLength / 2) / fresnelReflector.moduleLength),\r\n );\r\n dyl = n * fresnelReflector.moduleLength;\r\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\r\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy); // world panel center\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, collector.lx, dyl)) {\r\n updateElementLyById(collector.id, dyl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n // these two handles change the width, which is not controlled by module length\r\n {\r\n let sign = resizeHandleType === ResizeHandleType.Left ? -1 : 1;\r\n const theta = rp.angle() - angle + (resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\r\n let dxl = distance * Math.cos(theta);\r\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\r\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy);\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -rotation[2]);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarCollectorNewSizeOk(collector, newCx, newCy, dxl, collector.ly)) {\r\n updateElementLxById(collector.id, dxl);\r\n setElementPosition(collector.id, newCx, newCy);\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorWidth = dxl;\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n } else if (collector.type === ObjectType.ParabolicDish) {\r\n const parabolicDish = collector as ParabolicDishModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper: // all handles change the diameter of the dish\r\n const diameter = Math.min(10, distance);\r\n if (isSolarCollectorNewSizeOk(collector, parabolicDish.cx, parabolicDish.cy, collector.lx, diameter)) {\r\n updateElementLxById(collector.id, diameter);\r\n updateElementLyById(collector.id, diameter);\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishRimDiameter = diameter;\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const opacity = groundImage ? (orthographic ? 0.25 : 0.75) : 1;\r\n\r\n return (\r\n <>\r\n \r\n {/* draw rectangle */}\r\n \r\n \r\n \r\n \r\n \r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n\r\n {/* intersection plane */}\r\n {grabRef.current && Util.isSolarCollector(grabRef.current) && !grabRef.current.locked && (\r\n \r\n )}\r\n\r\n {showGrid && (\r\n <>\r\n {useStore.getState().rotateHandleType && grabRef.current && Util.isSolarCollector(grabRef.current) && (\r\n \r\n )}\r\n {(useStore.getState().moveHandleType || useStore.getState().resizeHandleType || addedWallIdRef.current) && (\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* ruler */}\r\n {selected && }\r\n\r\n {/* wireFrame */}\r\n {(!selected || groundImage) && (\r\n \r\n )}\r\n\r\n {/* highlight with a thick wireframe when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* wall axis auxiliary line */}\r\n {wallAuxToAxis.show && (\r\n \r\n \r\n \r\n )}\r\n \r\n {wallAuxToWallArray.map((wallAuxToWall, idx) => {\r\n if (!wallAuxToWall.show) return null;\r\n return (\r\n \r\n );\r\n })}\r\n \r\n\r\n {/* draw handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* resize handles */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLLRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLLRef.current!.localToWorld(new Vector3(lx, ly, 0));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.LowerLeft);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleULRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleULRef.current!.localToWorld(new Vector3(lx, -ly, 0));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.UpperLeft);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLRRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLRRef.current!.localToWorld(new Vector3(-lx, ly, 0));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.LowerRight);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleURRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleURRef.current!.localToWorld(new Vector3(-lx, -ly, 0));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.UpperRight);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n\r\n {!addedFoundationID && (\r\n <>\r\n {/* move handles */}\r\n {\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Lower;\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Lower);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Upper;\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Upper);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Left;\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Left);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n {\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Right;\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Right);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n\r\n {/* rotation handle */}\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* text */}\r\n {!addedFoundationID && (\r\n <>\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n {!locked && hoveredHandle === ResizeHandleType.LowerLeft && (\r\n \r\n )}\r\n {!locked && hoveredHandle === ResizeHandleType.UpperLeft && (\r\n \r\n )}\r\n {!locked && hoveredHandle === ResizeHandleType.LowerRight && (\r\n \r\n )}\r\n {!locked && hoveredHandle === ResizeHandleType.UpperRight && (\r\n \r\n )}\r\n \r\n )}\r\n {solarStructure === SolarStructure.FocusPipe && }\r\n {solarStructure === SolarStructure.FocusTower && }\r\n {solarStructure === SolarStructure.UpdraftTower && }\r\n\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst WallAuxiliaryLine = ({\r\n hx,\r\n hy,\r\n position,\r\n direction,\r\n color,\r\n}: {\r\n hx: number;\r\n hy: number;\r\n position: number[] | null;\r\n direction: 'x' | 'y' | 'xy' | null;\r\n color: string;\r\n}) => {\r\n if (position === null) return null;\r\n\r\n const [x, y] = position;\r\n const points: [number, number, number][] = [];\r\n\r\n if (direction === 'x') {\r\n points.push([-hx, y, 0]);\r\n points.push([hx, y, 0]);\r\n } else if (direction === 'y') {\r\n points.push([x, -hy, 0]);\r\n points.push([x, hy, 0]);\r\n } else if (direction === 'xy') {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n\r\n return ;\r\n};\r\n\r\nexport default React.memo(Foundation);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport { DoubleSide, Euler, Mesh, Vector3 } from 'three';\r\nimport { Box, Plane } from '@react-three/drei';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType } from 'src/types';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport WindowResizeHandle from './windowResizeHandle';\r\nimport WindowMoveHandle from './windowMoveHandle';\r\nimport { HALF_PI } from 'src/constants';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useStore } from 'src/stores/common';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { RoofUtil } from '../roof/RoofUtil';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { RoofSegmentGroupUserData, RoofSegmentProps } from '../roof/roofRenderer';\r\nimport { RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableMoveSkylight } from 'src/undo/UndoableMove';\r\nimport { UndoableResizeSkylight, UndoableResizeSkylightPolygonTop } from 'src/undo/UndoableResize';\r\nimport { getRoofPointsOfGambrelRoof } from '../roof/flatRoof';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { DEFAULT_POLYGONTOP } from './window';\r\nimport { FOUNDATION_GROUP_NAME } from '../foundation/foundation';\r\nimport { BUILDING_GROUP_NAME } from '../foundation/buildingRenderer';\r\nimport { useDataStore } from 'src/stores/commonData';\r\n\r\ninterface WindowHandleWrapperProps {\r\n id: string;\r\n parentId: string;\r\n foundationId?: string;\r\n lx: number;\r\n lz: number;\r\n polygonTop: number[];\r\n rotation: number[];\r\n windowType: WindowType;\r\n parentType: ObjectType;\r\n}\r\n\r\ntype HandleType = MoveHandleType | ResizeHandleType;\r\n\r\nconst INTERSECTION_PLANE_NAME = 'Handles Intersection Plane';\r\n\r\nconst getPointerOnIntersectionPlane = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n for (const intersection of e.intersections) {\r\n if (intersection.eventObject.name === INTERSECTION_PLANE_NAME) {\r\n // don't know why there is case point.z is negtive\r\n if (intersection.point.z < 0) return null;\r\n return intersection.point;\r\n }\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst getPosRelToFoundation = (p: Vector3, foundation: FoundationModel) => {\r\n return new Vector3()\r\n .subVectors(p, new Vector3(foundation.cx, foundation.cy, foundation.lz))\r\n .applyEuler(new Euler(0, 0, -foundation.rotation[2]));\r\n};\r\n\r\nconst isRectWindowInsideVertices = (\r\n center: Vector3,\r\n lx: number,\r\n ly: number,\r\n rotation: number[],\r\n vertices: Vector3[],\r\n) => {\r\n const [hx, hy] = [lx / 2, ly / 2];\r\n const [a, b, c] = rotation;\r\n const euler = new Euler().fromArray([a - HALF_PI, b, c, 'ZXY']);\r\n const boundaryPoint2 = vertices.map((v) => ({ x: v.x, y: v.y }));\r\n\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const v = new Vector3(hx * i, 0, hy * j).applyEuler(euler);\r\n const vertex = new Vector3().addVectors(center, v);\r\n if (!Util.isPointInside(vertex.x, vertex.y, boundaryPoint2)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n};\r\n\r\nconst isPolygonalWindowInsideVertices = (\r\n center: Vector3,\r\n lx: number,\r\n ly: number,\r\n topX: number,\r\n topH: number,\r\n rotation: number[],\r\n vertices: Vector3[],\r\n) => {\r\n const [hx, hy] = [lx / 2, ly / 2];\r\n const [a, b, c] = rotation;\r\n const euler = new Euler().fromArray([a - HALF_PI, b, c, 'ZXY']);\r\n const boundaryPoint2 = vertices.map((v) => ({ x: v.x, y: v.y }));\r\n\r\n const topVertex = new Vector3().addVectors(center, new Vector3(topX * lx, 0, hy + topH).applyEuler(euler));\r\n if (!Util.isPointInside(topVertex.x, topVertex.y, boundaryPoint2)) return false;\r\n\r\n if (!isRectWindowInsideVertices(center, lx, ly, rotation, vertices)) return false;\r\n\r\n return true;\r\n};\r\n\r\nconst getDataOnRoof = (e: ThreeEvent, windowId: string, roofId: string) => {\r\n if (e.intersections.length > 0) {\r\n for (const intersection of e.intersections) {\r\n const eventObjectName = intersection.eventObject.name;\r\n if (\r\n eventObjectName.includes('Window') &&\r\n eventObjectName.includes(windowId) &&\r\n intersection.object.name !== INTERSECTION_PLANE_NAME\r\n )\r\n return null;\r\n\r\n if (eventObjectName.includes('Roof') && eventObjectName.includes(roofId)) {\r\n const pointer = intersection.point.clone();\r\n const segmentIdx = Number.parseInt(intersection.object.name.split(' ').pop() ?? '-1');\r\n return { pointer, segmentIdx };\r\n }\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst isResizeHandle = (handleType: HandleType | null) => {\r\n switch (handleType) {\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nconst getNewResizedData = (anchor: Vector3, pointer: Vector3, r: number) => {\r\n const diffVector = new Vector3().subVectors(pointer, anchor).applyEuler(new Euler(0, 0, -r));\r\n const newLx = Math.abs(diffVector.x);\r\n const newLz = Math.hypot(diffVector.y, diffVector.z);\r\n const newCenter = new Vector3().addVectors(anchor, pointer).divideScalar(2);\r\n return { newLx, newLz, newCenter };\r\n};\r\n\r\nconst getRoofBoundaryVertices = (roofSegments: RoofSegmentProps[], roofCentroid: Vector3, roofType: RoofType) => {\r\n if (roofType === RoofType.Gambrel) {\r\n return getRoofPointsOfGambrelRoof(roofSegments).map((v) => v.add(roofCentroid));\r\n } else {\r\n return roofSegments.map((segment) => segment.points[0].clone().add(roofCentroid));\r\n }\r\n};\r\n\r\nconst setUndoableMove = (id: string, position: number[], rotation: number[]) => {\r\n useStore.getState().set((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n [window.cx, window.cy, window.cz] = position;\r\n window.rotation = [...rotation];\r\n });\r\n};\r\n\r\nconst setUndoableResize = (id: string, position: number[], dimension: number[], archHeight?: number | null) => {\r\n useStore.getState().set((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n [window.cx, window.cy, window.cz] = position;\r\n [window.lx, window.ly, window.lz] = dimension;\r\n if (archHeight !== undefined && archHeight !== null) {\r\n window.archHeight = archHeight;\r\n }\r\n });\r\n};\r\n\r\nconst setUndoableResizePolygonTop = (id: string, polygonTop: number[]) => {\r\n useStore.getState().set((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n window.polygonTop = [...polygonTop];\r\n });\r\n};\r\n\r\nconst getElementVerticesOnRoof = (el: ElementModel, foundation: FoundationModel, margin = 0.01) => {\r\n if (el.type !== ObjectType.SolarPanel && el.type !== ObjectType.Window) return null;\r\n\r\n const euler = new Euler().fromArray([...el.rotation, 'ZXY']);\r\n const center = new Vector3();\r\n const hx = el.lx / 2 + margin;\r\n let hy = margin;\r\n if (el.type === ObjectType.SolarPanel) {\r\n hy += el.ly / 2;\r\n center.set(el.cx * foundation.lx, el.cy * foundation.ly, 0);\r\n } else {\r\n hy += el.lz / 2;\r\n center.set(el.cx, el.cy, 0);\r\n }\r\n\r\n const vertices: Point2[] = [];\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const v = new Vector3(i * hx, i * j * hy).applyEuler(euler).add(center);\r\n vertices.push(v);\r\n }\r\n }\r\n if (el.type === ObjectType.Window && (el as WindowModel).windowType === WindowType.Polygonal) {\r\n const [tx, th] = (el as WindowModel).polygonTop ?? DEFAULT_POLYGONTOP;\r\n const v = new Vector3(tx * hx, th + hy).applyEuler(euler).add(center);\r\n vertices.push(v);\r\n }\r\n return vertices;\r\n};\r\n\r\nconst getPolygonTop = (window: WindowModel) => {\r\n if (window.windowType !== WindowType.Polygonal) return;\r\n return window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n};\r\n\r\nexport const ArchResizeHandle = ({ z }: { z: number }) => {\r\n const ref = useRef();\r\n\r\n const [color, setColor] = useState('white');\r\n return (\r\n {\r\n setColor('red');\r\n }}\r\n onPointerLeave={() => {\r\n setColor('white');\r\n }}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst WindowHandleWrapper = ({\r\n id,\r\n parentId,\r\n foundationId,\r\n lx,\r\n lz,\r\n polygonTop,\r\n rotation,\r\n windowType,\r\n parentType,\r\n}: WindowHandleWrapperProps) => {\r\n const addedWindowId = useStore((state) => state.addedWindowId);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const isSettingNewWindow = addedWindowId === id;\r\n const isOnRoof = parentType === ObjectType.Roof;\r\n\r\n const handleTypeRef = useRef(null);\r\n const foundationModelRef = useRef(null);\r\n const roofModelRef = useRef(null);\r\n const roofSegmentsRef = useRef(null);\r\n const roofCentroidRef = useRef(null);\r\n const currRoofSegmentIdxRef = useRef(null);\r\n const resizeAnchorWorldPosRef = useRef(null);\r\n const roofBoundaryVerticesRef = useRef(null);\r\n const roofChildVertices2DRef = useRef([]);\r\n\r\n const oldPositionRef = useRef(null);\r\n const oldRotationRef = useRef(null);\r\n const oldDimensionRef = useRef(null);\r\n const oldArchHeight = useRef(null);\r\n const oldPolygonTop = useRef(null);\r\n\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n\r\n const [hx, hz] = [lx / 2, lz / 2];\r\n const [topX, topH] = polygonTop;\r\n\r\n const absTopX = useMemo(() => lx * topX, [lx, topX]);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const getResizeAnchor = (event: ThreeEvent, lx: number, lz: number) => {\r\n if (!foundationId) return null;\r\n const foundationModel = useStore\r\n .getState()\r\n .elements.find((e) => e.id === foundationId && e.type === ObjectType.Foundation);\r\n if (!foundationModel) return null;\r\n const worldPosition = event.object.localToWorld(new Vector3());\r\n const [a, b, c] = rotation;\r\n const euler = new Euler().fromArray([a - HALF_PI, b, c + foundationModel.rotation[2], 'ZXY']);\r\n const v = new Vector3(lx, 0, lz).applyEuler(euler);\r\n return new Vector3().addVectors(worldPosition, v);\r\n };\r\n\r\n const setRefDataBeforePointerMove = (handleType: HandleType) => {\r\n let windowModel: WindowModel | undefined;\r\n let foundationModel: FoundationModel | undefined;\r\n let roofModel: RoofModel | undefined;\r\n\r\n for (const el of useStore.getState().elements) {\r\n if (el.id === id && el.type === ObjectType.Window) {\r\n windowModel = el as WindowModel;\r\n } else if (el.id === foundationId && el.type === ObjectType.Foundation) {\r\n foundationModel = el as FoundationModel;\r\n } else if (el.id === parentId && el.type === ObjectType.Roof) {\r\n roofModel = el as RoofModel;\r\n }\r\n }\r\n\r\n const contentRef = useRefStore.getState().contentRef;\r\n if (!windowModel || !foundationModel || !roofModel || !contentRef || !contentRef.current) return;\r\n\r\n const fId = foundationModel.id;\r\n const foundationGroup = contentRef.current.children.find((obj) => obj.name === `${FOUNDATION_GROUP_NAME} ${fId}`);\r\n if (!foundationGroup) return;\r\n\r\n const buildingGroup = foundationGroup.children.find((obj) => obj.name === BUILDING_GROUP_NAME);\r\n if (!buildingGroup) return;\r\n\r\n const roofGroup = buildingGroup.children.find((obj) => obj.name.includes('Roof') && obj.name.includes(parentId));\r\n if (!roofGroup) return;\r\n\r\n const segmentGroup = roofGroup.children[0];\r\n if (!segmentGroup) return;\r\n\r\n for (const el of useStore.getState().elements) {\r\n if (el.parentId === parentId && el.id !== id) {\r\n const vertices = getElementVerticesOnRoof(el, foundationModel);\r\n if (vertices) {\r\n roofChildVertices2DRef.current.push(vertices);\r\n }\r\n }\r\n }\r\n\r\n const { centroid, roofSegments } = segmentGroup.userData as RoofSegmentGroupUserData;\r\n const posRelToFoundation = new Vector3(windowModel.cx, windowModel.cy, windowModel.cz + foundationModel.lz);\r\n const posRelToCentroid = posRelToFoundation.clone().sub(centroid);\r\n\r\n handleTypeRef.current = handleType;\r\n foundationModelRef.current = foundationModel;\r\n roofModelRef.current = roofModel;\r\n currRoofSegmentIdxRef.current = RoofUtil.getSegmentIdx(roofSegments, posRelToCentroid);\r\n roofCentroidRef.current = centroid;\r\n roofSegmentsRef.current = roofSegments;\r\n roofBoundaryVerticesRef.current = getRoofBoundaryVertices(\r\n roofSegmentsRef.current,\r\n roofCentroidRef.current,\r\n roofModel.roofType,\r\n );\r\n\r\n oldPositionRef.current = [windowModel.cx, windowModel.cy, windowModel.cz];\r\n oldDimensionRef.current = [windowModel.lx, windowModel.ly, windowModel.lz];\r\n oldRotationRef.current = [...windowModel.rotation];\r\n oldArchHeight.current = windowModel.archHeight;\r\n oldPolygonTop.current = windowModel.polygonTop ?? null;\r\n };\r\n\r\n const addUndoableMove = () => {\r\n if (!oldPositionRef.current || !oldRotationRef.current) return;\r\n const window = useStore.getState().elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const undoable = {\r\n name: 'Move skylight',\r\n timestamp: Date.now(),\r\n id: window.id,\r\n oldPosition: [...oldPositionRef.current],\r\n newPosition: [window.cx, window.cy, window.cz],\r\n oldRotation: [...oldRotationRef.current],\r\n newRotation: [...window.rotation],\r\n undo() {\r\n setUndoableMove(undoable.id, undoable.oldPosition, undoable.oldRotation);\r\n },\r\n redo() {\r\n setUndoableMove(undoable.id, undoable.newPosition, undoable.newRotation);\r\n },\r\n } as UndoableMoveSkylight;\r\n\r\n addUndoable(undoable);\r\n };\r\n\r\n const addUndoableResize = () => {\r\n if (!oldDimensionRef.current || !oldPositionRef.current) return;\r\n const window = useStore.getState().elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const undoable = {\r\n name: 'Resize skylight',\r\n timestamp: Date.now(),\r\n id: window.id,\r\n oldPosition: [...oldPositionRef.current],\r\n newPosition: [window.cx, window.cy, window.cz],\r\n oldDimension: [...oldDimensionRef.current],\r\n newDimension: [window.lx, window.ly, window.lz],\r\n oldArchHeight: oldArchHeight.current,\r\n newArchHeight: window.archHeight,\r\n undo() {\r\n setUndoableResize(this.id, this.oldPosition, this.oldDimension, this.oldArchHeight);\r\n },\r\n redo() {\r\n setUndoableResize(this.id, this.newPosition, this.newDimension, this.newArchHeight);\r\n },\r\n } as UndoableResizeSkylight;\r\n addUndoable(undoable);\r\n };\r\n\r\n const addUndoableReizePolygonTop = () => {\r\n if (!oldPolygonTop.current) return;\r\n const window = useStore.getState().elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const undoable = {\r\n name: 'Resize skylight top vertex',\r\n timestamp: Date.now(),\r\n id: window.id,\r\n oldPolygonTop: [...oldPolygonTop.current],\r\n newPolygonTop: window.polygonTop ?? DEFAULT_POLYGONTOP,\r\n undo() {\r\n setUndoableResizePolygonTop(this.id, this.oldPolygonTop);\r\n },\r\n redo() {\r\n setUndoableResizePolygonTop(this.id, this.newPolygonTop);\r\n },\r\n } as UndoableResizeSkylightPolygonTop;\r\n addUndoable(undoable);\r\n };\r\n\r\n const isFlatRoof = (roof: RoofModel) => {\r\n if (roof.roofType === RoofType.Gable) return false;\r\n return Math.abs(roof.rise) < 0.001;\r\n };\r\n\r\n const getBoundary = (segmentIdx?: number | null) => {\r\n const isOnFlatRoof = roofModelRef.current && isFlatRoof(roofModelRef.current);\r\n if (isOnFlatRoof) {\r\n return roofBoundaryVerticesRef.current;\r\n } else if (segmentIdx !== undefined && segmentIdx !== null) {\r\n const segmentVertices = useDataStore.getState().getRoofSegmentVertices(parentId);\r\n if (!segmentVertices) return;\r\n const idx = segmentIdx === -1 ? segmentVertices.length - 1 : segmentIdx;\r\n const vertices = segmentVertices[idx];\r\n return vertices;\r\n }\r\n };\r\n\r\n const collisionCheck = (center: Vector3, lx: number, ly: number, rotation: number[], polygonTop?: number[]) => {\r\n const [hx, hy] = [lx / 2, ly / 2];\r\n const euler = new Euler().fromArray([...rotation, 'ZXY']);\r\n\r\n const currentVertices: Vector3[] = [];\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const v = new Vector3(i * hx, i * j * hy).applyEuler(euler).add(center);\r\n currentVertices.push(v);\r\n }\r\n }\r\n if (polygonTop) {\r\n const [tx, th] = polygonTop;\r\n const v = new Vector3(tx * hx * 2, th + hy).applyEuler(euler).add(center);\r\n currentVertices.push(v);\r\n }\r\n\r\n for (const targetVertices of roofChildVertices2DRef.current) {\r\n // check if current element vertices inside other(target) element\r\n for (const currentVertex of currentVertices) {\r\n if (Util.isPointInside(currentVertex.x, currentVertex.y, targetVertices)) {\r\n return false;\r\n }\r\n }\r\n // check if other element vertices inside current element\r\n for (const targetVertex of targetVertices) {\r\n if (Util.isPointInside(targetVertex.x, targetVertex.y, currentVertices)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const boundaryCheck = (\r\n boundary: Vector3[],\r\n center: Vector3,\r\n lx: number,\r\n ly: number,\r\n rotation: number[],\r\n polygonTop?: number[],\r\n ) => {\r\n if (polygonTop) {\r\n const [topX, topH] = polygonTop;\r\n return isPolygonalWindowInsideVertices(center, lx, ly, topX, topH, rotation, boundary);\r\n } else {\r\n return isRectWindowInsideVertices(center, lx, ly, rotation, boundary);\r\n }\r\n };\r\n\r\n const handlePointerDown = (event: ThreeEvent) => {\r\n if (!isOnRoof || isSettingNewWindow) return;\r\n\r\n const handleType = event.object.name as HandleType;\r\n\r\n switch (handleType) {\r\n case MoveHandleType.Mid: {\r\n // use break to avoid default return\r\n break;\r\n }\r\n case ResizeHandleType.LowerLeft: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, lx, lz);\r\n break;\r\n }\r\n case ResizeHandleType.LowerRight: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, -lx, lz);\r\n break;\r\n }\r\n case ResizeHandleType.UpperLeft: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, lx, -lz);\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, -lx, -lz);\r\n break;\r\n }\r\n case ResizeHandleType.Arch: {\r\n resizeAnchorWorldPosRef.current = getResizeAnchor(event, 0, -lz);\r\n break;\r\n }\r\n case ResizeHandleType.Upper:\r\n // use break to avoid default return\r\n break;\r\n default:\r\n // just in case handle type is not correct\r\n return;\r\n }\r\n\r\n setRefDataBeforePointerMove(handleType);\r\n setShowIntersectionPlane(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n };\r\n\r\n const handlePointerMove = (event: ThreeEvent) => {\r\n if (\r\n handleTypeRef.current === null ||\r\n !foundationModelRef.current ||\r\n !roofModelRef.current ||\r\n !roofSegmentsRef.current ||\r\n !roofCentroidRef.current ||\r\n !roofBoundaryVerticesRef.current\r\n )\r\n return;\r\n\r\n const foundation = foundationModelRef.current;\r\n\r\n if (handleTypeRef.current === MoveHandleType.Mid) {\r\n const roof = roofModelRef.current;\r\n const dataOnRoof = getDataOnRoof(event, id, parentId);\r\n const pointer = new Vector3();\r\n\r\n if (isFlatRoof(roof)) {\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n if (!pointerOnIntersectionPlane) return;\r\n pointer.copy(pointerOnIntersectionPlane);\r\n const newCenter = getPosRelToFoundation(pointer, foundation);\r\n\r\n setCommonStore((state) => {\r\n if (!roofBoundaryVerticesRef.current) return;\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const { lx, lz, rotation } = window;\r\n const boundary = roofBoundaryVerticesRef.current;\r\n const polygonTop = getPolygonTop(window);\r\n const insideBoundary = boundaryCheck(boundary, newCenter, lx, lz, rotation, polygonTop);\r\n const noCollision = collisionCheck(newCenter, lx, lz, rotation, polygonTop);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.cx = newCenter.x;\r\n window.cy = newCenter.y;\r\n window.cz = newCenter.z;\r\n }\r\n });\r\n } else {\r\n // segment changed\r\n if (dataOnRoof && dataOnRoof.segmentIdx !== currRoofSegmentIdxRef.current) {\r\n const pointerOnRoof = dataOnRoof.pointer;\r\n pointer.copy(pointerOnRoof);\r\n }\r\n // segment not changed\r\n else {\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n if (!pointerOnIntersectionPlane) return;\r\n pointer.copy(pointerOnIntersectionPlane);\r\n }\r\n\r\n const newCenter = getPosRelToFoundation(pointer, foundation);\r\n const posRelToCentroid = newCenter.clone().sub(roofCentroidRef.current);\r\n const { rotation, segmentVertices, segmentIdx } = RoofUtil.computeState(\r\n roofSegmentsRef.current,\r\n posRelToCentroid,\r\n );\r\n if (segmentVertices) {\r\n newCenter.setZ(\r\n RoofUtil.getRooftopElementZ(segmentVertices, posRelToCentroid, roofCentroidRef.current.z + roof.thickness),\r\n );\r\n } else {\r\n newCenter.setZ(roofCentroidRef.current.z + roof.thickness);\r\n }\r\n\r\n setCommonStore((state) => {\r\n const segmentVertices = useDataStore.getState().getRoofSegmentVertices(parentId);\r\n if (!segmentVertices) return;\r\n // mansard top surface idx is -1, and its vertices is the last in the arrary\r\n const idx = segmentIdx === -1 ? segmentVertices.length - 1 : segmentIdx;\r\n const vertices = segmentVertices[idx];\r\n if (!vertices) return;\r\n\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const { lx, lz } = window;\r\n const polygonTop = getPolygonTop(window);\r\n const insideBoundary = boundaryCheck(vertices, newCenter, lx, lz, rotation, polygonTop);\r\n const noCollision = collisionCheck(newCenter, lx, lz, rotation, polygonTop);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.cx = newCenter.x;\r\n window.cy = newCenter.y;\r\n window.cz = newCenter.z;\r\n window.rotation = [...rotation];\r\n if (dataOnRoof && dataOnRoof.segmentIdx !== currRoofSegmentIdxRef.current) {\r\n currRoofSegmentIdxRef.current = dataOnRoof.segmentIdx;\r\n }\r\n }\r\n });\r\n }\r\n } else if (isResizeHandle(handleTypeRef.current)) {\r\n const boundary = getBoundary(currRoofSegmentIdxRef.current);\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n const anchorWorldPos = resizeAnchorWorldPosRef.current;\r\n if (!pointerOnIntersectionPlane || !anchorWorldPos || !boundary) return;\r\n\r\n const pointerRelToFoundation = getPosRelToFoundation(pointerOnIntersectionPlane, foundation);\r\n const anchorRelToFoundation = getPosRelToFoundation(anchorWorldPos, foundation);\r\n const { newLx, newLz, newCenter } = getNewResizedData(anchorRelToFoundation, pointerRelToFoundation, rotation[2]);\r\n\r\n useStore.getState().set((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const polygonTop = getPolygonTop(window);\r\n const insideBoundary = boundaryCheck(boundary, newCenter, newLx, newLz, rotation, polygonTop);\r\n const noCollision = collisionCheck(newCenter, newLx, newLz, rotation, polygonTop);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.cx = newCenter.x;\r\n window.cy = newCenter.y;\r\n window.cz = newCenter.z;\r\n window.lx = newLx;\r\n window.lz = Math.max(0.001, newLz);\r\n }\r\n });\r\n } else if (handleTypeRef.current === ResizeHandleType.Upper) {\r\n const boundary = getBoundary(currRoofSegmentIdxRef.current);\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n if (!pointerOnIntersectionPlane || !boundary) return;\r\n\r\n const pointerRelToFoundation = getPosRelToFoundation(pointerOnIntersectionPlane, foundation);\r\n\r\n setCommonStore((state) => {\r\n const window = state.elements.find((e) => e.id === id) as WindowModel;\r\n if (!window) return;\r\n\r\n const [whx, whz] = [window.lx / 2, window.lz / 2];\r\n\r\n const centerPoint = new Vector3(window.cx, window.cy, window.cz);\r\n const euler = new Euler().fromArray([...window.rotation, 'ZXY']);\r\n const lowerLeftPoint = new Vector3(-whx, -whz, 0).applyEuler(euler).add(centerPoint);\r\n const lowerRightPoint = new Vector3(whx, -whz, 0).applyEuler(euler).add(centerPoint);\r\n\r\n const pointerRelToLowerLeft = new Vector3().subVectors(pointerRelToFoundation, lowerLeftPoint);\r\n const botNormal = new Vector3().subVectors(lowerRightPoint, lowerLeftPoint).normalize();\r\n const topXRelToLeft = pointerRelToLowerLeft\r\n .clone()\r\n .projectOnVector(botNormal)\r\n .applyEuler(new Euler(0, 0, -window.rotation[2]));\r\n const newTopX = Util.clamp((topXRelToLeft.x - whx) / window.lx, -0.5, 0.5);\r\n\r\n const topToBotDist2D = RoofUtil.getDistance(lowerLeftPoint, lowerRightPoint, pointerRelToFoundation);\r\n const topToBotDist = Math.hypot(topToBotDist2D, pointerRelToFoundation.z - lowerLeftPoint.z);\r\n const newTopH = Math.max(0, topToBotDist - window.lz);\r\n const newPolygonTop = [newTopX, newTopH];\r\n\r\n const center = new Vector3(window.cx, window.cy, window.cz);\r\n const { lx, lz } = window;\r\n const insideBoundary = boundaryCheck(boundary, center, lx, lz, rotation, newPolygonTop);\r\n const noCollision = collisionCheck(center, lx, lz, rotation, newPolygonTop);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.polygonTop = [...newPolygonTop];\r\n }\r\n });\r\n } else if (handleTypeRef.current === ResizeHandleType.Arch) {\r\n const pointerOnIntersectionPlane = getPointerOnIntersectionPlane(event);\r\n const anchorWorldPos = resizeAnchorWorldPosRef.current;\r\n const boundary = getBoundary(currRoofSegmentIdxRef.current);\r\n if (!pointerOnIntersectionPlane || !anchorWorldPos || !boundary) return;\r\n\r\n const pointerRelToFoundation = getPosRelToFoundation(pointerOnIntersectionPlane, foundation);\r\n const anchorRelToFoundation = getPosRelToFoundation(anchorWorldPos, foundation);\r\n\r\n setCommonStore((state) => {\r\n const window = state.elements.find((e) => e.id === id && e.type === ObjectType.Window) as WindowModel;\r\n if (!window) return;\r\n\r\n const [whx, whz] = [window.lx / 2, window.lz / 2];\r\n\r\n const centerPoint = new Vector3(window.cx, window.cy, window.cz);\r\n const euler = new Euler().fromArray([...window.rotation, 'ZXY']);\r\n const lowerLeftPoint = new Vector3(-whx, -whz, 0).applyEuler(euler).add(centerPoint);\r\n const lowerRightPoint = new Vector3(whx, -whz, 0).applyEuler(euler).add(centerPoint);\r\n\r\n const topToBotDist2D = RoofUtil.getDistance(lowerLeftPoint, lowerRightPoint, pointerRelToFoundation);\r\n let newLz = Math.hypot(topToBotDist2D, pointerRelToFoundation.z - lowerLeftPoint.z);\r\n\r\n const ah = Math.min(window.archHeight, window.lz, window.lx / 2);\r\n const rectHeight = window.lz - ah;\r\n\r\n if (newLz > rectHeight && newLz < window.lx / 2 + rectHeight) {\r\n const anchorToCenterNormal = new Vector3().subVectors(centerPoint, anchorRelToFoundation).normalize();\r\n const newCenter = new Vector3().addVectors(\r\n anchorRelToFoundation,\r\n anchorToCenterNormal.multiplyScalar(newLz / 2),\r\n );\r\n const newArchHeight = newLz - rectHeight;\r\n\r\n const insideBoundary = boundaryCheck(boundary, newCenter, window.lx, newLz, rotation);\r\n const noCollision = collisionCheck(newCenter, window.lx, newLz, rotation);\r\n\r\n if (insideBoundary && noCollision) {\r\n window.cx = newCenter.x;\r\n window.cy = newCenter.y;\r\n window.cz = newCenter.z;\r\n window.lz = newLz;\r\n window.archHeight = newArchHeight;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const handlePointerUp = () => {\r\n if (handleTypeRef.current === MoveHandleType.Mid) {\r\n addUndoableMove();\r\n } else if (isResizeHandle(handleTypeRef.current)) {\r\n addUndoableResize();\r\n } else if (handleTypeRef.current === ResizeHandleType.Upper) {\r\n addUndoableReizePolygonTop();\r\n } else if (handleTypeRef.current === ResizeHandleType.Arch) {\r\n addUndoableResize();\r\n }\r\n oldPositionRef.current = null;\r\n oldDimensionRef.current = null;\r\n oldRotationRef.current = null;\r\n oldArchHeight.current = null;\r\n oldPolygonTop.current = null;\r\n\r\n handleTypeRef.current = null;\r\n foundationModelRef.current = null;\r\n roofModelRef.current = null;\r\n roofSegmentsRef.current = null;\r\n roofCentroidRef.current = null;\r\n currRoofSegmentIdxRef.current = null;\r\n resizeAnchorWorldPosRef.current = null;\r\n roofBoundaryVerticesRef.current = null;\r\n roofChildVertices2DRef.current = [];\r\n setShowIntersectionPlane(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {!isSettingNewWindow && (\r\n <>\r\n {windowType === WindowType.Polygonal && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n\r\n {/* arch resize handle */}\r\n {windowType === WindowType.Arched && }\r\n \r\n )}\r\n \r\n \r\n\r\n {isOnRoof && showIntersectionPlane && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WindowHandleWrapper);\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef } from 'react';\nimport { DoubleSide, Euler, MeshStandardMaterial, Vector3 } from 'three';\nimport { Box, Cone, Cylinder, Line, Plane } from '@react-three/drei';\nimport { useStore } from 'src/stores/common';\nimport * as Selector from 'src/stores/selector';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { FrameDataType, MullionDataType, Shutter, WireframeDataType } from './window';\nimport { Util } from '../../Util';\nimport { useDataStore } from '../../stores/commonData';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface RectangleWindowProps {\n id: string;\n dimension: number[];\n position: number[];\n mullionData: MullionDataType;\n frameData: FrameDataType;\n wireframeData: WireframeDataType;\n leftShutter: boolean;\n rightShutter: boolean;\n shutterColor: string;\n shutterWidth: number;\n glassMaterial: JSX.Element;\n showHeatFluxes: boolean;\n area: number;\n empty: boolean;\n interior: boolean;\n foundation: FoundationModel | null;\n}\n\ninterface MullionProps {\n dimension: number[];\n mullionData: MullionDataType;\n shadowEnabled: boolean;\n}\n\ninterface FrameProps {\n dimension: number[];\n frameData: FrameDataType;\n shadowEnabled: boolean;\n}\n\ninterface WireframeProps {\n cy: number;\n dimension: number[];\n wireframeData: WireframeDataType;\n}\n\ntype ArgsType = [x: number, y: number, z: number];\n\nconst sealPlanesMaterial = new MeshStandardMaterial({ color: 'white', side: DoubleSide });\n\nconst Mullion = React.memo(({ dimension, mullionData, shadowEnabled }: MullionProps) => {\n const [lx, ly, lz] = dimension;\n\n const { width: mullionWidth, horizontalMullionSpacing, verticalMullionSpacing, color: mullionColor } = mullionData;\n\n const radialSegments = 3;\n const heightSegments = 1;\n\n const mullionRadius = mullionWidth / 2;\n\n const material = useMemo(() => , [mullionColor]);\n\n const verticalMullions = useMemo(() => {\n const arr: number[] = [];\n const dividers = Math.round(lx / verticalMullionSpacing) - 1;\n if (dividers <= 0 || mullionWidth === 0) {\n return arr;\n }\n const step = lx / (dividers + 1);\n let x = step / 2;\n if (dividers % 2 !== 0) {\n arr.push(0);\n x = step;\n }\n for (let num = 0; num < Math.floor(dividers / 2); num++, x += step) {\n arr.push(x, -x);\n }\n return arr;\n }, [lx, mullionWidth, verticalMullionSpacing]);\n\n const horizontalMullions = useMemo(() => {\n const arr: number[] = [];\n const dividers = Math.round(lz / horizontalMullionSpacing) - 1;\n if (dividers <= 0 || mullionWidth === 0) {\n return arr;\n }\n const step = lz / (dividers + 1);\n let z = step / 2;\n if (dividers % 2 !== 0) {\n arr.push(0);\n z = step;\n }\n for (let num = 0; num < Math.floor(dividers / 2); num++, z += step) {\n arr.push(z, -z);\n }\n return arr;\n }, [lz, mullionWidth, horizontalMullionSpacing]);\n\n return (\n \n {mullionData.verticalMullion &&\n verticalMullions.map((x, index) => (\n \n {material}\n \n ))}\n {mullionData.horizontalMullion &&\n horizontalMullions.map((z, index) => (\n \n {material}\n \n ))}\n \n );\n});\n\nconst Frame = React.memo(({ dimension, frameData, shadowEnabled }: FrameProps) => {\n const [lx, ly, lz] = dimension;\n const { color, width, sillWidth } = frameData;\n const material = useMemo(() => , [color]);\n\n const halfWidth = width / 2;\n const depth = halfWidth / 2;\n const sillLength = lx + width * 3;\n const sillThickness = width;\n\n return (\n \n {/* top */}\n \n {material}\n \n\n {/* left */}\n \n {material}\n \n\n {/* right */}\n \n {material}\n \n\n {/* bottom */}\n \n {material}\n \n \n );\n});\n\nconst Wireframe = React.memo(({ cy, dimension, wireframeData }: WireframeProps) => {\n const [lx, ly, lz] = dimension;\n const { lineWidth, lineColor, selected, locked, opacity } = wireframeData;\n\n const hx = lx / 2;\n const hz = lz / 2;\n\n const radialSegments = 3;\n const heightSegments = 1;\n\n const material = useMemo(() => new MeshStandardMaterial({ color: lineColor }), [lineColor]);\n const highLightMaterial = useMemo(() => new MeshStandardMaterial({ color: LOCKED_ELEMENT_SELECTION_COLOR }), []);\n\n const renderLines = (width: number, mat: MeshStandardMaterial) => {\n const wireframeRadius = width / 2;\n return (\n <>\n \n \n \n \n \n );\n };\n\n return (\n \n {opacity > 0 && {renderLines(lineWidth / 20, material)}}\n {locked && selected && renderLines(lineWidth / 5, highLightMaterial)}\n \n );\n});\n\nconst RectangleWindow = ({\n id,\n dimension,\n position,\n mullionData,\n frameData,\n wireframeData,\n leftShutter,\n rightShutter,\n shutterColor,\n shutterWidth,\n glassMaterial,\n showHeatFluxes,\n area,\n empty,\n interior,\n foundation,\n}: RectangleWindowProps) => {\n const world = useStore.getState().world;\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [lx, ly, lz] = dimension;\n const [cx, cy, cz] = position;\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes || interior) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, intensity, rz));\n vectors.push(v);\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, -intensity, rz));\n vectors.push(v);\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const shutterLength = useMemo(() => shutterWidth * lx, [lx, shutterWidth]);\n const shutterPosX = useMemo(\n () => ((shutterLength + frameData.width + lx) / 2) * 1.025,\n [lx, shutterLength, frameData.width],\n );\n\n const renderSealPlane = (args: [width: number, height: number], position: ArgsType, rotation?: ArgsType) => (\n \n );\n\n return (\n <>\n {!empty && (\n \n \n {glassMaterial}\n \n\n {(mullionData.horizontalMullion || mullionData.verticalMullion) && (\n \n )}\n \n )}\n\n {frameData.showFrame && }\n\n \n\n \n\n {renderSealPlane([ly, lz], [-lx / 2 + 0.001, ly / 2, 0], [HALF_PI, HALF_PI, 0])}\n {renderSealPlane([ly, lz], [lx / 2 - 0.0001, ly / 2, 0], [HALF_PI, -HALF_PI, 0])}\n {renderSealPlane([lx, ly], [0, ly / 2, lz / 2 - 0.001], [Math.PI, 0, 0])}\n {renderSealPlane([lx, ly], [0, ly / 2, -lz / 2 + 0.001])}\n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n};\n\nexport default React.memo(RectangleWindow);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Line } from '@react-three/drei';\nimport { ElementModel } from '../models/ElementModel';\nimport { ResizeHandleType } from '../types';\nimport i18n from '../i18n/i18n';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\n\nexport interface RulerOnWallProps {\n element: ElementModel;\n}\n\nexport const RulerOnWall = ({ element }: RulerOnWallProps) => {\n const language = useStore(Selector.language);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const hoveredHandle = useStore(Selector.hoveredHandle);\n\n const hx = element.lx / 2;\n const hz = element.lz / 2;\n const rulerArrowOffset = 0.05;\n const rulerLineWidth = 1;\n const rulerTickMarkWidth = 0.5;\n const color = element.lineColor ?? 'white';\n const labelBackgroundColor = 'darkorchid';\n const ratio = Math.max(0.25, (hx + hz) / 32);\n const rulerOffset = 0.25;\n const fontSize = 30;\n const yOffset = -0.1;\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // lower-left to upper-left\n const ll2ul = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hz]);\n\n // lower-right to upper-right\n const lr2ur = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hz]);\n\n // lower-left to lower-right\n const ll2lr = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hz]);\n\n // upper-left to upper-right\n const ul2ur = useMemo(() => {\n return (\n <>\n \n \n \n \n \n \n \n );\n }, [hx, hz]);\n\n if (resizeHandleType) {\n switch (resizeHandleType) {\n case ResizeHandleType.LowerLeft:\n return (\n <>\n {ll2ul}\n {ll2lr}\n \n );\n case ResizeHandleType.LowerRight:\n return (\n <>\n {lr2ur}\n {ll2lr}\n \n );\n case ResizeHandleType.UpperLeft:\n return (\n <>\n {ll2ul}\n {ul2ur}\n \n );\n case ResizeHandleType.UpperRight:\n return (\n <>\n {lr2ur}\n {ul2ur}\n \n );\n }\n }\n\n if (hoveredHandle) {\n switch (hoveredHandle) {\n case ResizeHandleType.LowerLeft:\n return (\n <>\n {ll2ul}\n {ll2lr}\n \n );\n case ResizeHandleType.LowerRight:\n return (\n <>\n {lr2ur}\n {ll2lr}\n \n );\n case ResizeHandleType.UpperLeft:\n return (\n <>\n {ll2ul}\n {ul2ur}\n \n );\n case ResizeHandleType.UpperRight:\n return (\n <>\n {lr2ur}\n {ul2ur}\n \n );\n }\n }\n\n return <>;\n};\n\nexport default React.memo(RulerOnWall);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { Color, DoubleSide, Euler, Vector3 } from 'three';\r\nimport { Box } from '@react-three/drei';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType } from 'src/types';\r\nimport * as Selector from 'src/stores/selector';\r\nimport WindowHandleWrapper from './windowHandleWrapper';\r\nimport { DEFAULT_WINDOW_SHININESS, HALF_PI } from 'src/constants';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport RectangleWindow from './rectangleWindow';\r\nimport ArchedWindow from './archedWindow';\r\nimport { RulerOnWall } from '../rulerOnWall';\r\nimport { Util } from '../../Util';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport PolygonalWindow from './polygonalWindow';\r\nimport { useSelected } from '../hooks';\r\n\r\nexport type MullionDataType = {\r\n horizontalMullion: boolean;\r\n verticalMullion: boolean;\r\n width: number;\r\n horizontalMullionSpacing: number;\r\n verticalMullionSpacing: number;\r\n color: string;\r\n};\r\n\r\nexport type FrameDataType = {\r\n showFrame: boolean;\r\n width: number;\r\n sillWidth: number;\r\n color: string;\r\n};\r\n\r\nexport type WireframeDataType = {\r\n lineColor: string;\r\n lineWidth: number;\r\n selected: boolean;\r\n locked: boolean;\r\n opacity: number;\r\n};\r\n\r\ninterface ShutterProps {\r\n cx: number;\r\n cz?: number;\r\n lx: number;\r\n lz: number;\r\n color: string;\r\n showLeft: boolean;\r\n showRight: boolean;\r\n spacing: number;\r\n}\r\n\r\nexport const Shutter = ({ cx, cz = 0, lx, lz, color, showLeft, showRight, spacing }: ShutterProps) => {\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n if (showSolarRadiationHeatmap || showHeatFluxes) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {showRight && (\r\n \r\n \r\n \r\n )}\r\n {showLeft && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const WINDOW_GROUP_NAME = 'Window Group';\r\n\r\nexport const DEFAULT_POLYGONTOP = [0, 0.5];\r\n\r\nconst Window = (windowModel: WindowModel) => {\r\n const {\r\n id,\r\n parentId,\r\n foundationId,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n rotation,\r\n locked,\r\n lineWidth = 0.2,\r\n lineColor = 'black',\r\n horizontalMullion = true,\r\n verticalMullion = true,\r\n mullionWidth = 0.06,\r\n horizontalMullionSpacing = 0.5,\r\n verticalMullionSpacing = 0.5,\r\n tint = '#73D8FF',\r\n opacity = 0.5,\r\n leftShutter = false,\r\n rightShutter = false,\r\n shutterColor = 'gray',\r\n shutterWidth = 0.5,\r\n mullionColor = 'white',\r\n frame = false,\r\n color = 'white',\r\n frameWidth = 0.1,\r\n sillWidth = 0.1,\r\n windowType = WindowType.Default,\r\n archHeight,\r\n parentType = ObjectType.Wall, // undefined is wall\r\n polygonTop = DEFAULT_POLYGONTOP,\r\n } = windowModel;\r\n\r\n const GROUP_NAME = `${WINDOW_GROUP_NAME} ${id}`;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const getFoundation = useStore(Selector.getFoundation);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const windowShininess = useStore(Selector.viewState.windowShininess);\r\n\r\n const selected = useSelected(id);\r\n\r\n const selectMe = (isContextMenu = false) => {\r\n setCommonStore((state) => {\r\n if (state.groupActionMode) {\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (windowModel.foundationId) {\r\n if (state.selectedElementIdSet.has(parentId)) {\r\n state.selectedElementIdSet.delete(parentId);\r\n } else {\r\n state.selectedElementIdSet.add(windowModel.foundationId);\r\n }\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.selected = true;\r\n state.selectedElement = e;\r\n\r\n if (isContextMenu) {\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const isAllowedToSelectMe = (e: ThreeEvent) => {\r\n return (\r\n e.intersections.length > 0 &&\r\n e.intersections[0].eventObject.name === GROUP_NAME &&\r\n !useStore.getState().moveHandleType &&\r\n !useStore.getState().resizeHandleType &&\r\n !useStore.getState().isAddingElement() &&\r\n useStore.getState().objectTypeToAdd === ObjectType.None\r\n );\r\n };\r\n\r\n const isClickedOnHandles = (e: ThreeEvent) => {\r\n if (e.eventObject.name === GROUP_NAME && e.intersections.length > 0) {\r\n switch (e.object.name) {\r\n case MoveHandleType.Mid:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.Arch:\r\n case ResizeHandleType.Upper:\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const onClickResizeHandle = (handleType: ResizeHandleType, p: Vector3) => {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setPrimitiveStore('showWallIntersectionPlaneId', parentId);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = handleType;\r\n state.resizeAnchor.copy(new Vector3(cx, 0, cz).add(p));\r\n });\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.button === 2 || useStore.getState().addedWallId) return; // ignore right-click\r\n if (isAllowedToSelectMe(e)) {\r\n selectMe();\r\n }\r\n\r\n if (isClickedOnHandles(e)) {\r\n const handleType = e.intersections[0].eventObject.name;\r\n switch (handleType) {\r\n case MoveHandleType.Mid: {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = handleType;\r\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.UpperLeft: {\r\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, -lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, -lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.LowerLeft: {\r\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.LowerRight: {\r\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.Arch: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, 0));\r\n break;\r\n }\r\n case ResizeHandleType.Upper: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, lz / 2));\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n if (useStore.getState().addedWallId) return;\r\n if (isAllowedToSelectMe(e)) {\r\n selectMe(true);\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = ObjectType.Window;\r\n });\r\n }\r\n };\r\n\r\n const euler = useMemo(() => {\r\n if (parentType === ObjectType.Roof) {\r\n const [x, y, z] = rotation;\r\n return new Euler().fromArray([x - HALF_PI, y, z, 'ZXY']);\r\n } else {\r\n return new Euler();\r\n }\r\n }, [parentType, rotation]);\r\n\r\n const glassMaterial = useMemo(\r\n () => (\r\n \r\n ),\r\n [windowShininess, tint, opacity],\r\n );\r\n\r\n const dimensionData = useMemo(() => {\r\n if (archHeight !== undefined) {\r\n return [lx, ly, lz, archHeight];\r\n }\r\n return [lx, ly, lz];\r\n }, [lx, ly, lz, archHeight]);\r\n\r\n const positionData = useMemo(() => {\r\n if (parentType === ObjectType.Roof) {\r\n return [cx, 0.05, cz];\r\n } else {\r\n return [cx, cy, cz];\r\n }\r\n }, [cx, cy, cz, parentType]);\r\n\r\n const mullionData = useMemo(\r\n () =>\r\n ({\r\n horizontalMullion,\r\n verticalMullion,\r\n width: mullionWidth,\r\n horizontalMullionSpacing,\r\n verticalMullionSpacing,\r\n color: mullionColor,\r\n } as MullionDataType),\r\n [horizontalMullion, verticalMullion, mullionWidth, horizontalMullionSpacing, verticalMullionSpacing, mullionColor],\r\n );\r\n\r\n const frameData = useMemo(\r\n () => ({ showFrame: frame, width: frameWidth, color, sillWidth } as FrameDataType),\r\n [frame, frameWidth, color, sillWidth],\r\n );\r\n\r\n const wireframeData = useMemo(\r\n () => ({ lineColor, lineWidth, selected, locked, opacity } as WireframeDataType),\r\n [lineColor, lineWidth, selected, locked, opacity],\r\n );\r\n\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n\r\n const renderWindow = () => {\r\n switch (windowType) {\r\n case WindowType.Default:\r\n return (\r\n \r\n );\r\n case WindowType.Arched:\r\n return (\r\n \r\n );\r\n case WindowType.Polygonal:\r\n return (\r\n \r\n );\r\n }\r\n };\r\n\r\n const positionY = parentType === ObjectType.Roof ? cy : 0;\r\n\r\n return (\r\n {\r\n /* Do Not Delete! Capture event for wall pointer move*/\r\n }}\r\n >\r\n {renderWindow()}\r\n\r\n {/* ruler */}\r\n {selected && }\r\n\r\n {/* handles */}\r\n {selected && !locked && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Window);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Line } from '@react-three/drei';\r\nimport { HALF_PI } from '../../constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { WallFill } from 'src/models/WallModel';\r\n\r\ninterface WallWireFrameProps {\r\n lineColor: string;\r\n lineWidth: number;\r\n hx: number;\r\n hz: number;\r\n fill: WallFill;\r\n isTopPartial: boolean;\r\n leftUnfilledHeight: number;\r\n rightUnfilledHeight: number;\r\n showParapet: boolean;\r\n leftHeight?: number;\r\n rightHeight?: number;\r\n center?: number[];\r\n centerLeft?: number[];\r\n centerRight?: number[];\r\n}\r\n\r\nconst WallWireFrame = React.memo(\r\n ({\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n hx,\r\n hz,\r\n fill,\r\n isTopPartial,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n showParapet = false,\r\n leftHeight = 2 * hz,\r\n rightHeight = 2 * hz,\r\n center,\r\n centerLeft,\r\n centerRight,\r\n }: WallWireFrameProps) => {\r\n const orthographic = useStore((state) => state.viewState.orthographic);\r\n\r\n const lowerLeft: [number, number, number] = [\r\n -hx,\r\n -hz + 0.001 + (fill === WallFill.Partial ? leftUnfilledHeight : 0),\r\n 0.001,\r\n ];\r\n const lowerRight: [number, number, number] = [\r\n hx,\r\n -hz + 0.001 + (fill === WallFill.Partial ? rightUnfilledHeight : 0),\r\n 0.001,\r\n ];\r\n const upperLeft: [number, number, number] = [-hx, leftHeight - hz - 0.001, 0.001];\r\n const upperRight: [number, number, number] = [hx, rightHeight - hz - 0.001, 0.001];\r\n\r\n const lx = hx * 2;\r\n const points = [];\r\n\r\n if (orthographic) {\r\n lineWidth = 2;\r\n points.push(upperLeft, upperRight);\r\n } else if (showParapet) {\r\n points.push(upperLeft, lowerLeft, lowerRight, upperRight);\r\n } else if (isTopPartial) {\r\n points.push(lowerLeft, upperLeft, upperRight, lowerRight, lowerLeft);\r\n } else {\r\n points.push(lowerLeft, upperLeft);\r\n if (centerLeft) {\r\n const cl: [number, number, number] = [centerLeft[0] * lx, centerLeft[1] - hz, 0.001];\r\n points.push(cl);\r\n }\r\n if (center) {\r\n const c: [number, number, number] = [center[0] * lx, center[1] - hz, 0.001];\r\n points.push(c);\r\n }\r\n if (centerRight) {\r\n const cr: [number, number, number] = [centerRight[0] * lx, centerRight[1] - hz, 0.001];\r\n points.push(cr);\r\n }\r\n points.push(upperRight, lowerRight);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n },\r\n);\r\n\r\nexport default WallWireFrame;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef } from 'react';\nimport { Box, Cone, Line } from '@react-three/drei';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n LOCKED_ELEMENT_SELECTION_COLOR,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { DoubleSide, Euler, Material, Shape, Vector3 } from 'three';\nimport * as Selector from 'src/stores/selector';\nimport { useStore } from 'src/stores/common';\nimport { Util } from '../../Util';\nimport { useDataStore } from '../../stores/commonData';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface RectangleDoorProps {\n id: string;\n dimension: number[];\n color: string;\n frameColor: string;\n selected: boolean;\n locked: boolean;\n material: Material;\n filled: boolean;\n showHeatFluxes: boolean;\n area: number;\n foundation: FoundationModel | null;\n}\n\ninterface DoorWireFrameProps {\n dimension: number[];\n lineColor: string;\n lineWidth: number;\n}\n\ninterface DoorFrameProps {\n dimension: number[];\n color: string;\n}\n\nconst DoorWireFrame = React.memo(({ dimension, lineColor, lineWidth }: DoorWireFrameProps) => {\n const [hx, hy, hz] = dimension.map((val) => val / 2);\n const ul: [number, number, number] = [-hx, 0, hz + 0.05];\n const ur: [number, number, number] = [hx, 0, hz + 0.05];\n const ll: [number, number, number] = [-hx, 0, -hz];\n const lr: [number, number, number] = [hx, 0, -hz];\n return ;\n});\n\nconst DoorFrame = React.memo(({ dimension, color }: DoorFrameProps) => {\n const [lx, ly, lz] = dimension;\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n\n const material = useMemo(() => , [color]);\n\n const width = 0.1;\n const halfWidth = width / 2;\n\n return (\n \n {/* top */}\n \n {material}\n \n\n {/* left */}\n \n {material}\n \n\n {/* right */}\n \n {material}\n \n \n );\n});\n\nconst RectangleDoor = React.memo(\n ({\n id,\n dimension,\n color,\n frameColor,\n selected,\n locked,\n material,\n filled,\n area,\n showHeatFluxes,\n foundation,\n }: RectangleDoorProps) => {\n const world = useStore.getState().world;\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [lx, ly, lz] = dimension;\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, intensity, rz));\n vectors.push(v);\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, -intensity, rz));\n vectors.push(v);\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const doorShape = useMemo(() => {\n const s = new Shape();\n const [hx, hz] = [lx / 2, lz / 2];\n const width = Math.max(hx, hz) * 0.2;\n s.moveTo(-hx, -hz);\n s.lineTo(-hx, hz);\n s.lineTo(hx, hz);\n s.lineTo(hx, -hz);\n if (!filled) {\n s.lineTo(hx - width, -hz);\n s.lineTo(hx - width, hz - width);\n s.lineTo(-hx + width, hz - width);\n s.lineTo(-hx + width, -hz);\n }\n s.closePath();\n return s;\n }, [lx, lz, filled]);\n\n return (\n \n \n \n \n\n {filled && (\n \n \n \n \n )}\n\n {filled && (\n \n \n \n )}\n\n \n\n \n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n },\n);\n\nexport default RectangleDoor;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo, useRef } from 'react';\nimport {\n DEFAULT_HEAT_FLUX_COLOR,\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\n DEFAULT_HEAT_FLUX_WIDTH,\n HALF_PI,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n} from 'src/constants';\nimport { useStore } from 'src/stores/common';\nimport { DoubleSide, Euler, Material, Shape, Vector3 } from 'three';\nimport { ArchedWireframe } from '../window/archedWindow';\nimport { WireframeDataType } from '../window/window';\nimport * as Selector from 'src/stores/selector';\nimport { Cone, Line } from '@react-three/drei';\nimport { Util } from '../../Util';\nimport { useDataStore } from '../../stores/commonData';\nimport { FoundationModel } from '../../models/FoundationModel';\n\ninterface ArchedDoorProps {\n id: string;\n dimension: number[];\n color: string;\n frameColor: string;\n selected: boolean;\n locked: boolean;\n material: Material;\n filled: boolean;\n showHeatFluxes: boolean;\n area: number;\n foundation: FoundationModel | null;\n}\n\nconst ArchedDoor = React.memo(\n ({\n id,\n dimension,\n color,\n frameColor,\n selected,\n locked,\n material,\n filled,\n showHeatFluxes,\n area,\n foundation,\n }: ArchedDoorProps) => {\n const world = useStore.getState().world;\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n\n const heatFluxArrowHead = useRef(0);\n const heatFluxArrowEuler = useRef();\n\n const [lx, ly, lz, archHeight] = dimension;\n\n const pointWithinArch = (x: number, z: number) => {\n if (archHeight > 0) {\n const hx = 0.5 * lx;\n const hz = 0.5 * lz;\n const ah = Math.min(archHeight, lz, hx); // actual arch height\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\n // check if the point is within the rectangular part\n if (Math.abs(x) < hx && z < hz - ah && z > -hz) {\n return true;\n }\n // check if the point is within the arch part\n const dz = z - (lz - r - hz);\n return x * x + dz * dz < r * r;\n }\n return true;\n };\n\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\n if (!showHeatFluxes) return undefined;\n if (foundation && foundation.notBuilding) return undefined;\n const heat = hourlyHeatExchangeArrayMap.get(id);\n if (!heat) return undefined;\n const sum = heat.reduce((a, b) => a + b, 0);\n if (area === 0) return undefined;\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\n heatFluxArrowEuler.current = Util.getEuler(\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Y,\n 'YXZ',\n Math.sign(intensity) * HALF_PI,\n );\n const vectors: Vector3[][] = [];\n if (intensity < 0) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinArch(rx, rz)) {\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, intensity, rz));\n vectors.push(v);\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const v: Vector3[] = [];\n const rx = (kx - nx / 2 + 0.5) * dx;\n const rz = (kz - nz / 2 + 0.5) * dz;\n if (pointWithinArch(rx, rz)) {\n v.push(new Vector3(rx, 0, rz));\n v.push(new Vector3(rx, -intensity, rz));\n vectors.push(v);\n }\n }\n }\n }\n return vectors;\n }, [id, dimension, showHeatFluxes, heatFluxScaleFactor]);\n\n const doorShape = useMemo(() => {\n const s = new Shape();\n const hx = lx / 2;\n const hz = lz / 2;\n const ah = Math.min(archHeight, lz, hx);\n s.moveTo(hx, -hz);\n s.lineTo(hx, hz - ah);\n if (ah > 0.1) {\n const r = ah / 2 + lx ** 2 / (8 * ah);\n const [cX, cY] = [0, hz - r];\n const startAngle = Math.acos(Math.min(hx / r, 1));\n const endAngle = Math.PI - startAngle;\n s.absarc(cX, cY, r, startAngle, endAngle, false);\n } else {\n s.lineTo(-hx, hz);\n }\n s.lineTo(-hx, -hz);\n\n if (!filled) {\n const ihx = lx * 0.4;\n const ihz = lz * 0.4;\n const iah = Math.min(archHeight * 0.8, lz * 0.8, hx * 0.8);\n s.lineTo(-ihx, -hz);\n if (iah > 0.1) {\n s.lineTo(-ihx, hz - iah);\n const r = iah / 2 + (lx * 0.8) ** 2 / (8 * iah);\n const [cX, cY] = [0, ihz - r];\n const startAngle = Math.acos(Math.min(ihx / r, 1));\n const endAngle = Math.PI - startAngle;\n s.absarc(cX, cY, r, endAngle, startAngle, true);\n } else {\n s.lineTo(-ihx, ihz);\n s.lineTo(ihx, ihz);\n }\n s.lineTo(ihx, -hz);\n }\n s.closePath();\n return s;\n }, [lx, lz, archHeight, filled]);\n\n const wireframeData = useMemo(() => {\n const lineWidth = locked && selected ? 0.2 : 0.1;\n return { lineColor: 'black', lineWidth, opacity: 1, selected, locked } as WireframeDataType;\n }, [selected, locked]);\n\n return (\n \n \n \n \n\n {filled && (\n \n \n \n \n )}\n\n {filled && (\n \n \n
\n )}\n\n \n \n\n {heatFluxes &&\n heatFluxes.map((v, index) => {\n return (\n \n \n ;\n \n \n \n \n );\n })}\n \n );\n },\n);\n\nexport default ArchedDoor;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAEACAYAAAB7+X6nAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsEARs4dI3tSgAABDpJREFUeJzt2iFLq1EcgPH/keGMhoEiIhg1CAaDyWRX/AI2bXYx+gX0ExhFBLG6sCBoNGoQVkQMbxCjYeeGq4N51+57Jux5fvEwDgf27L8X3pMiIoewGhERm5ubsbS09Ntn0Qg9Pj5Gu93+G8Di4mKcnJyk3z6URmdvby9HfE2Ab2dnZ/nl5SU+Pz9/51QqanJyMubn52N3d7f/Yx8I4P39PU5PT6OqqpiYmBj9CVVMr9eLVqsVh4eHA+uNYR/e3t6O1dXVkRxMo/Hw8BC3t7f/rA8NoNVqxdHRkc8EY+T7P/8n5zycAcAZAJwBwBkAnAHAGQCcAcAZAJwBwBkAnAHAGQCcAcANfR38P1JKXjItKOdc62t6JwBc7RPgW92l0pWarE4AOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAa5TaOKWUS+2t+jgB4GqfADnnVPeeKscJAGcAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAFf720DvAZRV99tWJwBcsRtB3guoV6nJ6gSAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwC4RqmNU0q51N6qjxMArvYJkHNOde+pcpwAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAGcAcAYAZwBwBgBnAHAGAGcAcAYAN/RSaFVVcXx87LXuMVJVVaSUYnp6Oi4vL/vf7dAArq6u4vr6enSnU3G9Xi8WFhZiY2Mj3t7e+usDAczOzsbFxUU8PT3F6+vryA+pcubm5mJ5eTmen5/j4+Ojvz4QwNTUVKytrUWz2Yz9/X3v94+R+/v7vLKyEu12O3Z2dtLNzU2O+Aqg2+3GwcFBbjabsbW1lTqdTj4/P/cZYIzMzMzE+vp6uru7y51OJ3e73YiISBHhFw32Bx94jOPwP7lbAAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/door_01.370d5c48.png\";","export default __webpack_public_path__ + \"static/media/door_02.589dadc7.png\";","export default __webpack_public_path__ + \"static/media/door_03.25d0bf9d.png\";","export default __webpack_public_path__ + \"static/media/door_04.06a40fe3.png\";","export default __webpack_public_path__ + \"static/media/door_05.4515bf2c.png\";","export default __webpack_public_path__ + \"static/media/door_06.5a0271c1.png\";","export default __webpack_public_path__ + \"static/media/door_07.b3fa7c12.png\";","export default __webpack_public_path__ + \"static/media/door_08.44d7e7a4.png\";","export default __webpack_public_path__ + \"static/media/door_09.cc418cf3.png\";","export default __webpack_public_path__ + \"static/media/door_10.69a33f87.png\";","export default __webpack_public_path__ + \"static/media/door_11.885157c0.png\";","export default __webpack_public_path__ + \"static/media/door_12.1978a1a1.png\";","export default __webpack_public_path__ + \"static/media/door_13.0e06b1ac.png\";","export default __webpack_public_path__ + \"static/media/door_14.97d8561e.png\";","export default __webpack_public_path__ + \"static/media/door_15.059947bb.png\";","export default __webpack_public_path__ + \"static/media/door_16.c2cd4b21.png\";","export default __webpack_public_path__ + \"static/media/door_17.6410d727.png\";","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { DoorTexture, ObjectType, ResizeHandleType } from 'src/types';\r\nimport WindowResizeHandle from '../window/windowResizeHandle';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport RectangleDoor from './rectangleDoor';\r\nimport ArchedDoor from './archedDoor';\r\nimport { useDoorTexture } from './hooks';\r\nimport { ArchResizeHandle } from '../window/windowHandleWrapper';\r\nimport {\r\n CanvasTexture,\r\n DoubleSide,\r\n FrontSide,\r\n MeshBasicMaterial,\r\n MeshPhongMaterial,\r\n MeshStandardMaterial,\r\n RepeatWrapping,\r\n Vector3,\r\n} from 'three';\r\nimport { Plane } from '@react-three/drei';\r\nimport { DEFAULT_WINDOW_SHININESS, HALF_PI, INVALID_ELEMENT_COLOR } from 'src/constants';\r\nimport { RulerOnWall } from '../rulerOnWall';\r\nimport { Util } from '../../Util';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface DoorHandleWrapperProps {\r\n dimension: number[];\r\n doorType: DoorType;\r\n}\r\n\r\ninterface DoorSealPlanesProps {\r\n dimension: number[];\r\n}\r\n\r\ntype ArgsType = [x: number, y: number, z: number];\r\n\r\nconst sealPlanesMaterial = new MeshStandardMaterial({ color: 'white', side: FrontSide });\r\n\r\nconst DoorHandleWrapper = React.memo(({ dimension, doorType }: DoorHandleWrapperProps) => {\r\n const [hx, hy, hz] = dimension.map((val) => val / 2);\r\n const isAddingNewDoor = hx === 0 && hz === 0;\r\n\r\n if (isAddingNewDoor) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {doorType === DoorType.Arched && }\r\n \r\n );\r\n});\r\n\r\nconst DoorSealPlanes = React.memo(({ dimension }: DoorSealPlanesProps) => {\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const [lx, ly, lz] = dimension;\r\n const [hx, hy, hz] = dimension.map((val) => val / 2);\r\n const renderSealPlane = (args: [width: number, height: number], position: ArgsType, rotation?: ArgsType) => (\r\n \r\n );\r\n return (\r\n \r\n {renderSealPlane([ly, lz], [-hx, hy, 0], [HALF_PI, HALF_PI, 0])}\r\n {renderSealPlane([ly, lz], [hx, hy, 0], [HALF_PI, -HALF_PI, 0])}\r\n {renderSealPlane([lx, ly], [0, hy, hz], [Math.PI, 0, 0])}\r\n \r\n );\r\n});\r\n\r\nconst Door = (doorModel: DoorModel) => {\r\n const {\r\n id,\r\n parentId,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n textureType,\r\n locked = false,\r\n color = 'white',\r\n doorType = DoorType.Default,\r\n archHeight = 1,\r\n filled = true,\r\n opacity = 1,\r\n frameColor = 'white',\r\n } = doorModel;\r\n\r\n const GROUP_NAME = `Door Group ${id}`;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const windowShininess = useStore(Selector.viewState.windowShininess);\r\n\r\n const selected = useSelected(id);\r\n\r\n // don't know why pointerDown event get called twice. So use a ref to avoid second call\r\n const pointerDownRef = useRef(false);\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n pointerDownRef.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => window.removeEventListener('pointerup', handlePointerUp);\r\n }, []);\r\n\r\n const selectMe = (isContextMenu = false) => {\r\n setCommonStore((state) => {\r\n if (state.groupActionMode) {\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (doorModel.foundationId) {\r\n if (state.selectedElementIdSet.has(parentId)) {\r\n state.selectedElementIdSet.delete(parentId);\r\n } else {\r\n state.selectedElementIdSet.add(doorModel.foundationId);\r\n }\r\n }\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.selected = true;\r\n state.selectedElement = e;\r\n\r\n if (isContextMenu) {\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const isAllowedToSelectMe = (e: ThreeEvent) => {\r\n // const intersectableObjects = e.intersections.filter(\r\n // (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\r\n // );\r\n return (\r\n e.intersections.length > 0 &&\r\n e.intersections[0].eventObject.name === GROUP_NAME &&\r\n !useStore.getState().moveHandleType &&\r\n !useStore.getState().resizeHandleType &&\r\n !useStore.getState().isAddingElement() &&\r\n useStore.getState().objectTypeToAdd === ObjectType.None\r\n );\r\n };\r\n\r\n const isClickedOnHandles = (e: ThreeEvent) => {\r\n if (e.eventObject.name === GROUP_NAME && e.intersections.length > 0) {\r\n switch (e.object.name) {\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n case ResizeHandleType.Arch:\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const onClickResizeHandle = (handleType: ResizeHandleType, p: Vector3) => {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setPrimitiveStore('showWallIntersectionPlaneId', parentId);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = handleType;\r\n state.resizeAnchor.copy(new Vector3(cx, 0, cz).add(p));\r\n state.selectedElement = state.elements.find((e) => e.selected) as ElementModel;\r\n });\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n if (useStore.getState().addedWallId) return;\r\n if (isAllowedToSelectMe(e)) {\r\n selectMe(true);\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = ObjectType.Door;\r\n });\r\n }\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (pointerDownRef.current || e.button === 2 || useStore.getState().addedWallId) return; // ignore right-click\r\n pointerDownRef.current = true;\r\n if (isAllowedToSelectMe(e)) {\r\n selectMe();\r\n }\r\n\r\n if (isClickedOnHandles(e)) {\r\n const handleType = e.intersections[0].eventObject.name;\r\n switch (handleType) {\r\n case ResizeHandleType.UpperLeft: {\r\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, -lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, -lz / 2));\r\n break;\r\n }\r\n case ResizeHandleType.Arch: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, 0));\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const getFoundation = useStore(Selector.getFoundation);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n\r\n const renderDoor = () => {\r\n switch (doorType) {\r\n case DoorType.Default:\r\n return (\r\n \r\n );\r\n case DoorType.Arched:\r\n return (\r\n \r\n );\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (doorModel && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(doorModel.id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n t.wrapS = RepeatWrapping;\r\n t.wrapT = RepeatWrapping;\r\n t.offset.set(-lx / 2, -lz / 2);\r\n t.center.set(lx / 2, lz / 2);\r\n t.repeat.set(1 / lx, 1 / lz);\r\n setHeatmapTexture(t);\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const texture = useDoorTexture(textureType, doorType, lx, lz);\r\n\r\n const dimensionData = useMemo(() => [lx, ly, lz, archHeight], [lx, ly, lz, archHeight]);\r\n\r\n const doorMaterial = useMemo(() => {\r\n if (showSolarRadiationHeatmap && heatmapTexture && doorModel.filled) {\r\n return new MeshBasicMaterial({\r\n color: color,\r\n map: heatmapTexture,\r\n side: FrontSide,\r\n });\r\n }\r\n if (!filled) {\r\n return new MeshStandardMaterial({\r\n opacity: color === INVALID_ELEMENT_COLOR ? 0.5 : 0,\r\n color: color,\r\n transparent: true,\r\n side: DoubleSide,\r\n });\r\n }\r\n if (textureType === DoorTexture.Default || textureType === DoorTexture.NoTexture) {\r\n if (opacity < 1) {\r\n return new MeshPhongMaterial({\r\n specular: 'white',\r\n shininess: windowShininess ?? DEFAULT_WINDOW_SHININESS,\r\n color: color,\r\n side: FrontSide,\r\n opacity: opacity,\r\n transparent: true,\r\n });\r\n } else {\r\n return new MeshStandardMaterial({\r\n map: texture,\r\n color: color,\r\n side: FrontSide,\r\n });\r\n }\r\n }\r\n return new MeshStandardMaterial({ map: texture, side: FrontSide });\r\n }, [showSolarRadiationHeatmap, heatmapTexture, color, textureType, texture, filled, opacity]);\r\n\r\n return (\r\n \r\n {renderDoor()}\r\n\r\n {selected && }\r\n\r\n {selected && !locked && }\r\n\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Door);\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport { DoorTexture, ObjectType } from 'src/types';\r\nimport DoorTextureDefault from 'src/resources/door_edge.png';\r\nimport DoorTexture00 from 'src/resources/tiny_white_square.png';\r\nimport DoorTexture01 from 'src/resources/door_01.png';\r\nimport DoorTexture02 from 'src/resources/door_02.png';\r\nimport DoorTexture03 from 'src/resources/door_03.png';\r\nimport DoorTexture04 from 'src/resources/door_04.png';\r\nimport DoorTexture05 from 'src/resources/door_05.png';\r\nimport DoorTexture06 from 'src/resources/door_06.png';\r\nimport DoorTexture07 from 'src/resources/door_07.png';\r\nimport DoorTexture08 from 'src/resources/door_08.png';\r\nimport DoorTexture09 from 'src/resources/door_09.png';\r\nimport DoorTexture10 from 'src/resources/door_10.png';\r\nimport DoorTexture11 from 'src/resources/door_11.png';\r\nimport DoorTexture12 from 'src/resources/door_12.png';\r\nimport DoorTexture13 from 'src/resources/door_13.png';\r\nimport DoorTexture14 from 'src/resources/door_14.png';\r\nimport DoorTexture15 from 'src/resources/door_15.png';\r\nimport DoorTexture16 from 'src/resources/door_16.png';\r\nimport DoorTexture17 from 'src/resources/door_17.png';\r\nimport { TextureLoader } from 'three';\r\nimport { useThree } from '@react-three/fiber';\r\nimport { useStore } from 'src/stores/common';\r\nimport { fileChanged } from 'src/stores/selector';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\n\r\nexport const useDoorTexture = (textureType: DoorTexture, doorType: DoorType, lx?: number, lz?: number) => {\r\n const textureLoader = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case DoorTexture.Default:\r\n textureImg = DoorTextureDefault;\r\n break;\r\n case DoorTexture.NoTexture:\r\n textureImg = DoorTexture00;\r\n break;\r\n case DoorTexture.Texture01:\r\n textureImg = DoorTexture01;\r\n break;\r\n case DoorTexture.Texture02:\r\n textureImg = DoorTexture02;\r\n break;\r\n case DoorTexture.Texture03:\r\n textureImg = DoorTexture03;\r\n break;\r\n case DoorTexture.Texture04:\r\n textureImg = DoorTexture04;\r\n break;\r\n case DoorTexture.Texture05:\r\n textureImg = DoorTexture05;\r\n break;\r\n case DoorTexture.Texture06:\r\n textureImg = DoorTexture06;\r\n break;\r\n case DoorTexture.Texture07:\r\n textureImg = DoorTexture07;\r\n break;\r\n case DoorTexture.Texture08:\r\n textureImg = DoorTexture08;\r\n break;\r\n case DoorTexture.Texture09:\r\n textureImg = DoorTexture09;\r\n break;\r\n case DoorTexture.Texture10:\r\n textureImg = DoorTexture10;\r\n break;\r\n case DoorTexture.Texture11:\r\n textureImg = DoorTexture11;\r\n break;\r\n case DoorTexture.Texture12:\r\n textureImg = DoorTexture12;\r\n break;\r\n case DoorTexture.Texture13:\r\n textureImg = DoorTexture13;\r\n break;\r\n case DoorTexture.Texture14:\r\n textureImg = DoorTexture14;\r\n break;\r\n case DoorTexture.Texture15:\r\n textureImg = DoorTexture15;\r\n break;\r\n case DoorTexture.Texture16:\r\n textureImg = DoorTexture16;\r\n break;\r\n case DoorTexture.Texture17:\r\n textureImg = DoorTexture17;\r\n break;\r\n default:\r\n textureImg = DoorTexture02;\r\n }\r\n\r\n return new TextureLoader().load(textureImg, (texture) => {\r\n if (lx !== undefined && lz !== undefined) {\r\n texture.offset.set(0.5, 0.5);\r\n texture.repeat.set(1 / lx, 1 / lz);\r\n }\r\n setTexture(texture);\r\n invalidate();\r\n });\r\n }, [textureType, doorType, lx, lz]);\r\n\r\n const [texture, setTexture] = useState(textureLoader);\r\n const { invalidate } = useThree();\r\n return texture;\r\n};\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cone, Line, Plane, Ring, Sphere } from '@react-three/drei';\r\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n SOLAR_PANEL_BLACK_SPECULAR,\r\n SOLAR_PANEL_BLUE_SPECULAR,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, Orientation, ResizeHandleType, RotateHandleType } from '../../types';\r\nimport { Util } from '../../Util';\r\nimport { SolarPanelModel, SolarPanelModelOnWall } from '../../models/SolarPanelModel';\r\nimport { LineData } from '../LineData';\r\nimport { getSunDirection } from 'src/analysis/sunTools';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { PvModel } from 'src/models/PvModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface SunbeamProps {\r\n drawSunbeam: boolean;\r\n absRotation: number;\r\n tiltAngle: number;\r\n}\r\n\r\ninterface LabelProps {\r\n sp: SolarPanelModelOnWall;\r\n}\r\n\r\ninterface TiltHandleProps {\r\n tiltAngle: number;\r\n handleSize: number;\r\n initPointerDown: () => void;\r\n handlePointerMove: (e: ThreeEvent, tiltHandleRef: React.MutableRefObject) => void;\r\n handlePointerUp: () => void;\r\n}\r\n\r\nconst Sunbeam = React.memo(({ drawSunbeam, absRotation, tiltAngle }: SunbeamProps) => {\r\n const normalVector = new Vector3(0, 0, 1);\r\n\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude).applyEuler(new Euler(-HALF_PI - tiltAngle, 0, -absRotation));\r\n }, [date, latitude, absRotation, tiltAngle]);\r\n\r\n return (\r\n <>\r\n {drawSunbeam && sunDirection.z > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n\r\nconst Label = ({ sp }: LabelProps) => {\r\n useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const language = useStore(Selector.language);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n if (!sp.foundationId || !sp.parentId) {\r\n return null;\r\n }\r\n\r\n const wall = getElementById(sp.parentId) as WallModel;\r\n const foundation = getElementById(sp.foundationId) as FoundationModel;\r\n\r\n if (!wall || !foundation) {\r\n return null;\r\n }\r\n\r\n const fCenter = new Vector3(foundation.cx, foundation.cy, foundation.cz);\r\n const wCenter = new Vector3(wall.cx, wall.cy, wall.cz);\r\n\r\n const center = new Vector3(sp.cx * wall.lx, 0, sp.cz * wall.lz)\r\n .applyEuler(new Euler(0, 0, wall.relativeAngle))\r\n .add(wCenter)\r\n .applyEuler(new Euler(0, 0, foundation.rotation[2]))\r\n .add(fCenter);\r\n\r\n const labelText =\r\n (sp?.label ?? i18n.t('shared.SolarPanelElement', lang)) +\r\n (sp?.locked ? ` ( + ${i18n.t('shared.ElementLocked', lang)} + )` : '') +\r\n (sp?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n center.x.toFixed(1) +\r\n ', ' +\r\n center.y.toFixed(1) +\r\n ', ' +\r\n center.z.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang));\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst TiltHandle = ({\r\n tiltAngle,\r\n handleSize,\r\n initPointerDown,\r\n handlePointerMove,\r\n handlePointerUp,\r\n}: TiltHandleProps) => {\r\n const { gl } = useThree();\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const [showTiltAngle, setShowTiltAngle] = useState(false);\r\n const [showIntersection, setShowIntersectionPlane] = useState(false);\r\n const tiltHandleRef = useRef();\r\n const intersectionPlaneRef = useRef();\r\n const degree = useMemo(() => new Array(7).fill(0), []);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n return (\r\n <>\r\n {/* ring handles */}\r\n {\r\n gl.domElement.style.cursor = 'grab';\r\n setColor(HIGHLIGHT_HANDLE_COLOR);\r\n }}\r\n onPointerOut={() => {\r\n gl.domElement.style.cursor = 'default';\r\n setColor(RESIZE_HANDLE_COLOR);\r\n }}\r\n onPointerDown={(e) => {\r\n initPointerDown();\r\n e.stopPropagation();\r\n setShowTiltAngle(true);\r\n setShowIntersectionPlane(true);\r\n setCommonStore((state) => {\r\n state.rotateHandleType = RotateHandleType.Tilt;\r\n });\r\n }}\r\n >\r\n \r\n \r\n {showTiltAngle && (\r\n <>\r\n {/* intersection plane */}\r\n {showIntersection && (\r\n {\r\n handlePointerMove(e, intersectionPlaneRef);\r\n }}\r\n onPointerUp={() => {\r\n handlePointerUp();\r\n setShowIntersectionPlane(false);\r\n setShowTiltAngle(false);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {/* pointer */}\r\n \r\n {/* scale */}\r\n {degree.map((e, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {/* show current degree */}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst Mount = React.memo(\r\n ({ tiltAngle, spCy, spLy, lx, nx }: { tiltAngle: number; spCy: number; spLy: number; lx: number; nx: number }) => {\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n\r\n const mountUnit = useMemo(() => {\r\n const halfLz = (spLy * Math.cos(tiltAngle)) / 2;\r\n const startZ = spLy * 0.75 - halfLz;\r\n const ly = -spCy * 1.5;\r\n const lz = startZ - halfLz / 2;\r\n const length = Math.hypot(ly, lz);\r\n const rotationX = Math.atan2(lz, ly);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }, [tiltAngle, spCy, spLy]);\r\n\r\n const arr = useMemo(() => {\r\n const arr: number[] = [];\r\n let curr = nx % 2 === 0 ? lx / 2 : 0;\r\n while (curr < (nx * lx) / 2) {\r\n arr.push(curr, -curr);\r\n curr += lx;\r\n }\r\n return arr;\r\n }, [lx, nx]);\r\n\r\n return (\r\n \r\n {arr.map((val, idx) => (\r\n \r\n {mountUnit}\r\n \r\n ))}\r\n \r\n );\r\n },\r\n);\r\n\r\nconst HANDLE_GROUP_NAME = 'Handle Group Move & Resize';\r\n\r\nconst SolarPanelOnWall = ({\r\n id,\r\n pvModelName = 'SPR-X21-335-BLK',\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n color = 'white',\r\n locked = false,\r\n parentId,\r\n foundationId,\r\n orientation = Orientation.portrait,\r\n showLabel,\r\n drawSunBeam,\r\n absRotation,\r\n tiltAngle,\r\n relativeAzimuth,\r\n}: SolarPanelModelOnWall) => {\r\n tiltAngle = Math.min(0, tiltAngle);\r\n\r\n const selected = useSelected(id);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const pvModules = useStore(Selector.pvModules);\r\n\r\n const { camera, gl } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [nx, setNx] = useState(1);\r\n const baseRef = useRef();\r\n const solarPanelLinesRef = useRef();\r\n const pointerDownRef = useRef(false);\r\n const oldTiltRef = useRef(null);\r\n\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const pvModel = pvModules[pvModelName] as PvModel;\r\n\r\n if (pvModel) {\r\n lz = Math.max(pvModel.thickness, 0.02);\r\n }\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const positionLL = new Vector3(-hx, -hy, hz);\r\n const positionUL = new Vector3(-hx, hy, hz);\r\n const positionLR = new Vector3(hx, -hy, hz);\r\n const positionUR = new Vector3(hx, hy, hz);\r\n const solarPanel = getElementById(id) as SolarPanelModelOnWall;\r\n\r\n useEffect(() => {\r\n if (pvModel) {\r\n let mx, my;\r\n if (orientation === Orientation.portrait) {\r\n mx = Math.max(1, Math.round(lx / pvModel.width));\r\n my = Math.max(1, Math.round(ly / pvModel.length));\r\n } else {\r\n mx = Math.max(1, Math.round(lx / pvModel.length));\r\n my = Math.max(1, Math.round(ly / pvModel.width));\r\n }\r\n setNx(mx);\r\n solarPanelLinesRef.current = [];\r\n const dx = lx / mx;\r\n const dy = ly / my;\r\n for (let i = 0; i <= mx; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\r\n } as LineData);\r\n }\r\n for (let i = 0; i <= my; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\r\n } as LineData);\r\n }\r\n }\r\n }, [orientation, pvModelName, lx, ly, lz]);\r\n\r\n const euler = useMemo(() => {\r\n return new Euler(HALF_PI, 0, 0);\r\n }, []);\r\n\r\n const relativeEuler = useMemo(() => {\r\n return new Euler(tiltAngle, 0, 0, 'ZXY');\r\n }, [tiltAngle]);\r\n\r\n const hoverHandle = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.eventObject.name.includes(HANDLE_GROUP_NAME);\r\n if (intersected) {\r\n const handle = e.object.name as MoveHandleType | ResizeHandleType | RotateHandleType | null;\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n gl.domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n gl.domElement.style.cursor = 'grab';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n gl.domElement.style.cursor = 'default';\r\n };\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const tiltHandleSize = (baseSize * 2) / 3;\r\n\r\n cy = (ly * Math.sin(tiltAngle)) / 2;\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n };\r\n\r\n const initPointerDown = () => {\r\n oldTiltRef.current = tiltAngle;\r\n pointerDownRef.current = true;\r\n useRefStore.getState().setEnableOrbitController(false);\r\n };\r\n\r\n const tiltHandlePointerMove = (\r\n e: ThreeEvent,\r\n intersectionPlaneRef: React.MutableRefObject,\r\n ) => {\r\n if (pointerDownRef.current) {\r\n setRayCast(e);\r\n if (intersectionPlaneRef.current && useStore.getState().rotateHandleType === RotateHandleType.Tilt) {\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const pointer = intersects[0].point;\r\n const center = intersectionPlaneRef.current.parent?.localToWorld(new Vector3()); // rotate center in world coordinate\r\n if (center) {\r\n const cv = new Vector3().subVectors(pointer, center);\r\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\r\n const wr = absRotation;\r\n const sign =\r\n wr % Math.PI === 0\r\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\r\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\r\n angle = sign * angle - HALF_PI;\r\n angle = Util.clamp(angle, -HALF_PI, 0);\r\n useStore.getState().updateSolarPanelTiltAngleById(id, angle);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const tiltHandlePointerUp = () => {\r\n const sp = getElementById(id) as SolarPanelModel;\r\n if (sp && oldTiltRef.current !== null && Math.abs(sp.tiltAngle - oldTiltRef.current) > ZERO_TOLERANCE) {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltRef.current,\r\n newValue: sp.tiltAngle,\r\n changedElementId: id,\r\n changedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n useStore\r\n .getState()\r\n .updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n useStore.getState().addUndoable(undoableChange);\r\n }\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDownRef.current = false;\r\n };\r\n\r\n const onClickResizeHandle = (handleType: ResizeHandleType, p: Vector3) => {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.resizeHandleType = handleType;\r\n state.resizeAnchor.copy(new Vector3(cx, 0, cz).add(p));\r\n });\r\n };\r\n\r\n const clickHandle = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === HANDLE_GROUP_NAME) {\r\n const handleType = e.object.name;\r\n switch (handleType) {\r\n case MoveHandleType.Default: {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = handleType;\r\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.Left: {\r\n onClickResizeHandle(handleType, new Vector3(lx / 2, 0, 0));\r\n break;\r\n }\r\n case ResizeHandleType.Right: {\r\n onClickResizeHandle(handleType, new Vector3(-lx / 2, 0, 0));\r\n break;\r\n }\r\n case ResizeHandleType.Lower: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, ly / 2));\r\n break;\r\n }\r\n case ResizeHandleType.Upper: {\r\n onClickResizeHandle(handleType, new Vector3(0, 0, -ly / 2));\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const texture = useSolarPanelTexture(\r\n lx,\r\n ly,\r\n pvModel,\r\n orientation,\r\n solarPanel?.frameColor,\r\n solarPanel?.backsheetColor,\r\n );\r\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\r\n\r\n const renderTopTextureMaterial = () => {\r\n if (showSolarRadiationHeatmap && heatmapTexture) {\r\n return ;\r\n }\r\n if (!texture) return ;\r\n if (orthographic || solarPanelShininess === 0) {\r\n return ;\r\n }\r\n return (\r\n \r\n );\r\n };\r\n\r\n const renderBotTextureMaterial = () => {\r\n if (pvModel?.bifacialityFactor === 0 || tiltAngle === 0) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n return (\r\n \r\n );\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {/* draw panel */}\r\n {\r\n if (\r\n e.button === 2 ||\r\n useStore.getState().isAddingElement() ||\r\n useStore.getState().objectTypeToAdd !== ObjectType.None\r\n )\r\n return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.SolarPanel;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n gl.domElement.style.cursor = 'move';\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n gl.domElement.style.cursor = 'default';\r\n setHovered(false);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {renderTopTextureMaterial()}\r\n {renderBotTextureMaterial()}\r\n \r\n\r\n {showSolarRadiationHeatmap &&\r\n heatmapTexture &&\r\n solarPanelLinesRef.current &&\r\n solarPanelLinesRef.current.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/* simulation panel */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n\r\n {/*draw label */}\r\n {(hovered || showLabel) && !selected && \r\n\r\n {tiltAngle !== 0 && pvModel && (\r\n \r\n )}\r\n \r\n\r\n {selected && !locked && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(SolarPanelOnWall);\r\n","export default __webpack_public_path__ + \"static/media/polygon_08.acf0bf8f.png\";","export default __webpack_public_path__ + \"static/media/polygon_09.26eed538.png\";","export default __webpack_public_path__ + \"static/media/polygon_10.749fa717.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport PolygonTexture01 from '../resources/foundation_01.png';\r\nimport PolygonTexture02 from '../resources/foundation_02.png';\r\nimport PolygonTexture03 from '../resources/foundation_03.png';\r\nimport PolygonTexture04 from '../resources/foundation_04.png';\r\nimport PolygonTexture05 from '../resources/foundation_05.png';\r\nimport PolygonTexture06 from '../resources/foundation_06.png';\r\nimport PolygonTexture07 from '../resources/foundation_07.png';\r\nimport PolygonTexture08 from '../resources/polygon_08.png';\r\nimport PolygonTexture09 from '../resources/polygon_09.png';\r\nimport PolygonTexture10 from '../resources/polygon_10.png';\r\nimport PolygonTexture00 from '../resources/tiny_white_square.png';\r\n\r\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\r\nimport { Box, Line, Sphere, Text } from '@react-three/drei';\r\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, RepeatWrapping, Shape, TextureLoader, Vector3 } from 'three';\r\nimport { CommonStoreState, useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n} from '../constants';\r\nimport { ActionType, LineStyle, MoveHandleType, ObjectType, PolygonTexture, ResizeHandleType } from '../types';\r\nimport { Util } from '../Util';\r\nimport i18n from '../i18n/i18n';\r\nimport { PolygonModel } from '../models/PolygonModel';\r\nimport { Point2 } from '../models/Point2';\r\nimport { useRefStore } from '../stores/commonRef';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Polygon = ({\r\n id,\r\n lz = 0.1,\r\n filled = false,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = 'yellow',\r\n label,\r\n text,\r\n fontSize = 1,\r\n fontColor = 'black',\r\n fontOutlineWidth = 0,\r\n fontOutlineColor = 'white',\r\n fontStrokeWidth = 0,\r\n fontStrokeColor = 'black',\r\n lineStyle = LineStyle.Solid,\r\n lineColor = 'black',\r\n lineWidth = 1,\r\n locked = false,\r\n showLabel = false,\r\n parentId,\r\n foundationId,\r\n vertices,\r\n opacity = 1,\r\n noOutline = false,\r\n shininess = 0,\r\n selectedIndex = -1,\r\n textureType = PolygonTexture.NoTexture,\r\n}: PolygonModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const selectMe = useStore(Selector.selectMe);\r\n const objectTypeToAdd = useStore(Selector.objectTypeToAdd);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const [centerX, setCenterX] = useState(0);\r\n const [centerY, setCenterY] = useState(0);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n\r\n const baseRef = useRef();\r\n const centerRef = useRef();\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n // if any\r\n const cuboidWorldPosition = new Vector3();\r\n const cuboidWorldRotation = new Euler();\r\n if (parent?.type === ObjectType.Cuboid) {\r\n const { pos, rot } = Util.getWorldDataById(parent.id);\r\n cuboidWorldPosition.copy(pos);\r\n cuboidWorldRotation.set(0, 0, rot);\r\n }\r\n\r\n const ratio = parent ? Math.max(1, Math.max(parent.lx, parent.ly) / 24) : 1;\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * ratio;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * ratio;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const updatePolygonSelectedIndexById = (id: string, index: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).selectedIndex = index;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const absoluteVertices = useMemo(() => {\r\n const av = new Array();\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n for (const v of vertices) {\r\n av.push({ x: v.x * parent.lx, y: v.y * parent.ly } as Point2);\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n for (const v of vertices) {\r\n av.push({ x: v.x * parent.lx, y: v.y * parent.lz } as Point2);\r\n }\r\n break;\r\n case ObjectType.Cuboid:\r\n const n = new Vector3().fromArray(normal);\r\n let lx, ly;\r\n if (Util.isUnitVectorX(n)) {\r\n // east or west face in model coordinate system\r\n lx = parent.lz;\r\n ly = parent.ly;\r\n } else if (Util.isUnitVectorY(n)) {\r\n // south or north face\r\n lx = parent.lx;\r\n ly = parent.lz;\r\n } else {\r\n // top face\r\n lx = parent.lx;\r\n ly = parent.ly;\r\n }\r\n for (const v of vertices) {\r\n av.push({ x: v.x * lx, y: v.y * ly } as Point2);\r\n }\r\n break;\r\n }\r\n const centroid = Util.calculatePolygonCentroid(av);\r\n setCenterX(centroid.x);\r\n setCenterY(centroid.y);\r\n }\r\n return av;\r\n }, [vertices, parent, normal]);\r\n\r\n const getCz = () => {\r\n if (parent?.type === ObjectType.Cuboid) {\r\n const top = Util.isIdentical(normal, UNIT_VECTOR_POS_Z_ARRAY);\r\n // not sure why we need lz here\r\n return cuboidWorldPosition.z + (parent.lz + (top ? 0 : lz)) / 2 + 0.01;\r\n }\r\n if (parent?.type === ObjectType.Foundation) {\r\n return parent.lz + 0.01;\r\n }\r\n return lz / 2 + 0.01;\r\n };\r\n\r\n const cz = getCz();\r\n\r\n const getEuler = () => {\r\n if (parent?.type === ObjectType.Wall) {\r\n return new Euler(-HALF_PI, 0, Math.PI, 'ZXY');\r\n }\r\n const n = new Vector3().fromArray(normal);\r\n let r = rotation[2];\r\n if (parent?.type === ObjectType.Cuboid) {\r\n r = cuboidWorldRotation.z;\r\n }\r\n // east face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n return new Euler(0, HALF_PI, r, 'ZXY');\r\n }\r\n // west face\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n return new Euler(0, -HALF_PI, r, 'ZXY');\r\n }\r\n // north face\r\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n return new Euler(-HALF_PI, 0, r, 'ZXY');\r\n }\r\n // south face\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n return new Euler(HALF_PI, 0, r, 'ZXY');\r\n }\r\n // top face\r\n return new Euler(0, 0, r, 'ZXY');\r\n };\r\n\r\n const euler = getEuler();\r\n\r\n const getPosition = () => {\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid) {\r\n const p = new Vector3(cuboidWorldPosition.x, cuboidWorldPosition.y, cz);\r\n const n = new Vector3().fromArray(normal);\r\n let sideFace = false;\r\n const shift = new Vector3();\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n // east face in model coordinate system\r\n sideFace = true;\r\n shift.x = parent.lx / 2 + 0.01;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n // west face\r\n sideFace = true;\r\n shift.x = -parent.lx / 2 - 0.01;\r\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n // north face\r\n sideFace = true;\r\n shift.y = parent.ly / 2 + 0.01;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n // south face\r\n sideFace = true;\r\n shift.y = -parent.ly / 2 - 0.01;\r\n }\r\n if (sideFace) {\r\n shift.applyEuler(cuboidWorldRotation);\r\n p.x = cuboidWorldPosition.x + shift.x;\r\n p.y = cuboidWorldPosition.y + shift.y;\r\n p.z = cuboidWorldPosition.z + shift.z;\r\n }\r\n return p;\r\n } else if (parent.type === ObjectType.Wall) {\r\n // polygon on wall is relative to the wall\r\n return new Vector3(0, -0.01, 0);\r\n }\r\n }\r\n return new Vector3(parent?.cx ?? 0, parent?.cy ?? 0, cz);\r\n };\r\n\r\n const position = getPosition();\r\n\r\n const points = useMemo(() => {\r\n const p = new Array();\r\n for (const v of absoluteVertices) {\r\n p.push(new Vector3(v.x, v.y, 0));\r\n }\r\n // close the polygon\r\n p.push(new Vector3(absoluteVertices[0].x, absoluteVertices[0].y, 0));\r\n return p;\r\n }, [absoluteVertices]);\r\n\r\n const shape = useMemo(() => {\r\n const s = new Shape();\r\n s.moveTo(absoluteVertices[0].x, absoluteVertices[0].y);\r\n for (let i = 1; i < absoluteVertices.length; i++) {\r\n s.lineTo(absoluteVertices[i].x, absoluteVertices[i].y);\r\n }\r\n s.closePath();\r\n return s;\r\n }, [absoluteVertices]);\r\n\r\n const hoverHandle = useCallback((e: ThreeEvent, handle: MoveHandleType | ResizeHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Default) {\r\n domElement.style.cursor = 'move';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const fetchRepeatDividers = (textureType: PolygonTexture) => {\r\n switch (textureType) {\r\n case PolygonTexture.Texture01:\r\n return { x: 1, y: 1 };\r\n case PolygonTexture.Texture02:\r\n return { x: 2, y: 2 };\r\n case PolygonTexture.Texture03:\r\n return { x: 0.4, y: 0.4 };\r\n case PolygonTexture.Texture04:\r\n return { x: 0.25, y: 0.25 };\r\n case PolygonTexture.Texture05:\r\n return { x: 5, y: 5 };\r\n case PolygonTexture.Texture06:\r\n return { x: 1, y: 1 };\r\n case PolygonTexture.Texture07:\r\n return { x: 1, y: 1 };\r\n case PolygonTexture.Texture08:\r\n return { x: 2, y: 2 };\r\n case PolygonTexture.Texture09:\r\n return { x: 2, y: 2 };\r\n case PolygonTexture.Texture10:\r\n return { x: 4, y: 4 };\r\n default:\r\n return { x: 1, y: 1 };\r\n }\r\n };\r\n\r\n const textureLoader = useMemo(() => {\r\n let textureImg;\r\n switch (textureType) {\r\n case PolygonTexture.Texture01:\r\n textureImg = PolygonTexture01;\r\n break;\r\n case PolygonTexture.Texture02:\r\n textureImg = PolygonTexture02;\r\n break;\r\n case PolygonTexture.Texture03:\r\n textureImg = PolygonTexture03;\r\n break;\r\n case PolygonTexture.Texture04:\r\n textureImg = PolygonTexture04;\r\n break;\r\n case PolygonTexture.Texture05:\r\n textureImg = PolygonTexture05;\r\n break;\r\n case PolygonTexture.Texture06:\r\n textureImg = PolygonTexture06;\r\n break;\r\n case PolygonTexture.Texture07:\r\n textureImg = PolygonTexture07;\r\n break;\r\n case PolygonTexture.Texture08:\r\n textureImg = PolygonTexture08;\r\n break;\r\n case PolygonTexture.Texture09:\r\n textureImg = PolygonTexture09;\r\n break;\r\n case PolygonTexture.Texture10:\r\n textureImg = PolygonTexture10;\r\n break;\r\n default:\r\n textureImg = PolygonTexture00;\r\n }\r\n return new TextureLoader().load(textureImg, (t) => {\r\n const params = fetchRepeatDividers(textureType);\r\n t.wrapT = t.wrapS = RepeatWrapping;\r\n // Don't know why, but we have to use 1, instead of the actual dimension, to divide as follows\r\n t.repeat.set(1 / params.x, 1 / params.y);\r\n const n = new Vector3().fromArray(normal);\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n t.rotation = HALF_PI;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n t.rotation = -HALF_PI;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n t.rotation = Math.PI;\r\n }\r\n setTexture(t);\r\n });\r\n }, [textureType, normal]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n return (\r\n \r\n {filled && (\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n if (objectTypeToAdd === ObjectType.None) {\r\n selectMe(id, e);\r\n }\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n if (e.intersections.length > 1) {\r\n // pass paste point to its parent\r\n state.pastePoint.copy(e.intersections[1].point);\r\n }\r\n state.contextMenuObjectType = ObjectType.Polygon;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={() => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n {shininess === undefined || shininess === 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n\r\n {text && (\r\n \r\n {text}\r\n \r\n )}\r\n\r\n {/* wireframe */}\r\n {(!noOutline || (locked && selected)) && (\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e);\r\n }}\r\n onContextMenu={(e) => {\r\n if (objectTypeToAdd !== ObjectType.None) return;\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const obj = e.intersections[0].object;\r\n const intersected = obj.name === 'Polygon Wireframe' && obj.uuid === id;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Polygon;\r\n }\r\n }\r\n });\r\n }}\r\n />\r\n )}\r\n {/* if not filled, add an enlarged, lifted invisible line for easier selection */}\r\n {!filled && (\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e);\r\n }}\r\n onContextMenu={(e) => {\r\n if (objectTypeToAdd !== ObjectType.None) return;\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const obj = e.intersections[0].object;\r\n const intersected = obj.name === 'Polygon Enlarged Line' && obj.uuid === id;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Polygon;\r\n }\r\n }\r\n });\r\n }}\r\n />\r\n )}\r\n\r\n {/* draw handle */}\r\n {selected && !locked && (\r\n {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Default;\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n >\r\n \r\n \r\n )}\r\n {selected &&\r\n !locked &&\r\n absoluteVertices.map((p, i) => {\r\n return (\r\n \r\n {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Resize);\r\n updatePolygonSelectedIndexById(id, i);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.resizeHandleType = ResizeHandleType.Default;\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Default);\r\n updatePolygonSelectedIndexById(id, i);\r\n }}\r\n onPointerOut={noHoverHandle}\r\n onContextMenu={(e) => {\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const vertexIndex = e.intersections[0].object.userData.vertexIndex;\r\n if (vertexIndex !== undefined) {\r\n state.contextMenuObjectType = ObjectType.PolygonVertex;\r\n updatePolygonSelectedIndexById(id, vertexIndex);\r\n }\r\n }\r\n });\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Polygon;\r\n","import React, { useMemo } from 'react';\r\nimport { Extrude, Line } from '@react-three/drei';\r\nimport { HALF_PI, ZERO_TOLERANCE } from 'src/constants';\r\nimport { ParapetArgs } from 'src/models/WallModel';\r\nimport { ActionType, ObjectType, WallTexture } from 'src/types';\r\nimport { Euler, Shape, Vector3 } from 'three';\r\nimport { useWallTexture } from './hooks';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useStore } from 'src/stores/common';\r\n\r\nexport const DEFAULT_PARAPET_SETTINGS: ParapetArgs = {\r\n display: false,\r\n color: 'white',\r\n textureType: WallTexture.NoTexture,\r\n parapetHeight: 1,\r\n copingsWidth: 0.5,\r\n copingsHeight: 0.1,\r\n};\r\n\r\nexport interface WallData {\r\n id: string;\r\n parentId: string;\r\n cx: number;\r\n cy: number;\r\n hx: number;\r\n hy: number;\r\n angle: number;\r\n selected: boolean;\r\n}\r\n\r\nexport interface WallPointData {\r\n leftPoint: number[];\r\n rightPoint: number[];\r\n ly: number;\r\n copingsWidth: number;\r\n}\r\n\r\nexport interface ParapetProps {\r\n args: ParapetArgs;\r\n wallData: WallData;\r\n parapetZ: number;\r\n currWallPointData: WallPointData;\r\n leftWallPointData: WallPointData | null;\r\n rightWallPointData: WallPointData | null;\r\n}\r\n\r\ntype WallPoints = {\r\n leftPoint: Vector3;\r\n rightPoint: Vector3;\r\n};\r\n\r\ntype CopingsPoints = {\r\n innerPoints: WallPoints;\r\n outerPoints: WallPoints;\r\n};\r\n\r\nconst Parapet = ({\r\n args,\r\n wallData,\r\n parapetZ,\r\n currWallPointData,\r\n leftWallPointData,\r\n rightWallPointData,\r\n}: ParapetProps) => {\r\n const { display, color, textureType, parapetHeight, copingsWidth, copingsHeight } = args;\r\n const { id, parentId, cx, cy, hx, hy, angle, selected } = wallData;\r\n const bodyHeight = parapetHeight - copingsHeight;\r\n\r\n const texture = useWallTexture(textureType);\r\n\r\n const copingsPoints = useMemo(() => {\r\n const outerLeft = new Vector3(-hx, hy - copingsWidth / 2);\r\n const outerRight = new Vector3(hx, hy - copingsWidth / 2);\r\n const innerRight = new Vector3(hx, hy + copingsWidth / 2);\r\n const innerLeft = new Vector3(-hx, hy + copingsWidth / 2);\r\n\r\n const points = [outerLeft, outerRight, innerRight, innerLeft];\r\n\r\n if (rightWallPointData || leftWallPointData) {\r\n const currWallCopingsPoints = getCopingsPoints(currWallPointData);\r\n\r\n if (rightWallPointData && isSamePoint(currWallPointData.rightPoint, rightWallPointData.leftPoint)) {\r\n const copingsInterSectionPoints = getCopingsIntersectionPoints(currWallCopingsPoints, rightWallPointData);\r\n if (copingsInterSectionPoints) {\r\n outerRight.copy(copingsInterSectionPoints.outerIntersection);\r\n innerRight.copy(copingsInterSectionPoints.innerIntersection);\r\n }\r\n }\r\n if (leftWallPointData && isSamePoint(currWallPointData.leftPoint, leftWallPointData.rightPoint)) {\r\n const copingsInterSectionPoints = getCopingsIntersectionPoints(currWallCopingsPoints, leftWallPointData);\r\n if (copingsInterSectionPoints) {\r\n outerLeft.copy(copingsInterSectionPoints.outerIntersection);\r\n innerLeft.copy(copingsInterSectionPoints.innerIntersection);\r\n }\r\n }\r\n }\r\n\r\n return points;\r\n }, [hy, copingsWidth, currWallPointData, leftWallPointData, rightWallPointData]);\r\n\r\n const bodyShape = useMemo(() => {\r\n const shape = new Shape();\r\n\r\n const leftPoint = new Vector3(-hx, hy * 2);\r\n const rightPoint = new Vector3(hx, hy * 2);\r\n\r\n if (rightWallPointData || leftWallPointData) {\r\n const currWallInnerPoint = getWallPointsAfterOffset(currWallPointData, currWallPointData.ly);\r\n\r\n if (rightWallPointData && isSamePoint(currWallPointData.rightPoint, rightWallPointData.leftPoint)) {\r\n const rel = getBodyRelativeIntersectionPoint(currWallInnerPoint, rightWallPointData);\r\n rel && rightPoint.copy(rel);\r\n }\r\n if (leftWallPointData && isSamePoint(currWallPointData.leftPoint, leftWallPointData.rightPoint)) {\r\n const rel = getBodyRelativeIntersectionPoint(currWallInnerPoint, leftWallPointData);\r\n rel && leftPoint.copy(rel);\r\n }\r\n }\r\n\r\n shape.moveTo(-hx, 0);\r\n shape.lineTo(hx, 0);\r\n shape.lineTo(rightPoint.x, rightPoint.y);\r\n shape.lineTo(leftPoint.x, leftPoint.y);\r\n shape.closePath();\r\n return shape;\r\n }, [hx, currWallPointData, leftWallPointData, rightWallPointData]);\r\n\r\n const copingsShape = useMemo(() => {\r\n const shape = new Shape();\r\n if (copingsWidth === 0) return shape;\r\n\r\n const [outerLeft, outerRight, innerRight, innerLeft] = copingsPoints;\r\n\r\n shape.moveTo(outerLeft.x, outerLeft.y);\r\n shape.lineTo(outerRight.x, outerRight.y);\r\n shape.lineTo(innerRight.x, innerRight.y);\r\n shape.lineTo(innerLeft.x, innerLeft.y);\r\n shape.closePath();\r\n return shape;\r\n }, [hy, copingsWidth, copingsPoints]);\r\n\r\n const copingsWireframePoints = useMemo(() => {\r\n return copingsPoints.map((v) => v.toArray() as [number, number, number]);\r\n }, [hy, copingsPoints]);\r\n\r\n const bodyHorizontalWireframePoints = useMemo(() => [new Vector3(-hx, 0, 0), new Vector3(hx, 0, 0)], [hx]);\r\n const bodyVerticalWireframePoints = useMemo(() => [new Vector3(), new Vector3(0, 0, bodyHeight)], [bodyHeight]);\r\n\r\n function getCopingsIntersectionPoints(currCopingsPoints: CopingsPoints, sideWallPointData: WallPointData) {\r\n const sideWallCopingsPoints = getCopingsPoints(sideWallPointData);\r\n\r\n const outerIntersection = getIntersectionPoint(\r\n currCopingsPoints.outerPoints.leftPoint,\r\n currCopingsPoints.outerPoints.rightPoint,\r\n sideWallCopingsPoints.outerPoints.leftPoint,\r\n sideWallCopingsPoints.outerPoints.rightPoint,\r\n );\r\n if (!outerIntersection) return null;\r\n\r\n const innerIntersection = getIntersectionPoint(\r\n currCopingsPoints.innerPoints.leftPoint,\r\n currCopingsPoints.innerPoints.rightPoint,\r\n sideWallCopingsPoints.innerPoints.leftPoint,\r\n sideWallCopingsPoints.innerPoints.rightPoint,\r\n );\r\n if (!innerIntersection) return null;\r\n\r\n return {\r\n innerIntersection: new Vector3()\r\n .subVectors(innerIntersection, new Vector3(cx, cy))\r\n .applyEuler(new Euler(0, 0, -angle)),\r\n outerIntersection: new Vector3()\r\n .subVectors(outerIntersection, new Vector3(cx, cy))\r\n .applyEuler(new Euler(0, 0, -angle)),\r\n };\r\n }\r\n\r\n function getBodyRelativeIntersectionPoint(currPoints: WallPoints, sideWallPointData: WallPointData) {\r\n const sideWallPoints = getWallPointsAfterOffset(sideWallPointData, sideWallPointData.ly);\r\n const intersection = getIntersectionPoint(\r\n currPoints.leftPoint,\r\n currPoints.rightPoint,\r\n sideWallPoints.leftPoint,\r\n sideWallPoints.rightPoint,\r\n );\r\n if (!intersection) return null;\r\n return new Vector3().subVectors(intersection, new Vector3(cx, cy)).applyEuler(new Euler(0, 0, -angle));\r\n }\r\n\r\n function isAllowedToSelectMe() {\r\n if (\r\n useStore.getState().moveHandleType ||\r\n useStore.getState().resizeHandleType ||\r\n useStore.getState().isAddingElement()\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function handleParapetPointerDown(e: ThreeEvent) {\r\n if (e.button !== 2 && e.intersections.length > 0 && e.intersections[0].eventObject === e.eventObject) {\r\n if (isAllowedToSelectMe()) {\r\n useStore.getState().selectMe(id, e, ActionType.Select, true);\r\n }\r\n }\r\n }\r\n\r\n function handleParapetContextMenu(e: ThreeEvent) {\r\n useStore.getState().selectMe(id, e, ActionType.ContextMenu, true);\r\n useStore.getState().set((state) => {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject === e.eventObject) {\r\n state.contextMenuObjectType = ObjectType.Wall;\r\n }\r\n });\r\n }\r\n\r\n if (!display) return null;\r\n\r\n return (\r\n \r\n {/* body */}\r\n \r\n \r\n \r\n\r\n {/* body wireframe */}\r\n \r\n \r\n \r\n\r\n {/* copings */}\r\n \r\n \r\n \r\n\r\n {/* copings wireframe */}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nfunction getCopingsPoints(wallPointData: WallPointData): CopingsPoints {\r\n const innerOffset = (wallPointData.ly + wallPointData.copingsWidth) / 2;\r\n const outerOffset = (wallPointData.ly - wallPointData.copingsWidth) / 2;\r\n return {\r\n innerPoints: getWallPointsAfterOffset(wallPointData, innerOffset),\r\n outerPoints: getWallPointsAfterOffset(wallPointData, outerOffset),\r\n };\r\n}\r\n\r\nfunction getWallPointsAfterOffset(wallPointData: WallPointData, y: number) {\r\n const { leftPoint, rightPoint } = wallPointData;\r\n const leftPointV3 = new Vector3().fromArray(leftPoint);\r\n const rightPointV3 = new Vector3().fromArray(rightPoint);\r\n const normal = new Vector3().subVectors(rightPointV3, leftPointV3).applyEuler(new Euler(0, 0, HALF_PI)).normalize();\r\n const offset = normal.clone().multiplyScalar(y);\r\n return {\r\n leftPoint: leftPointV3.clone().add(offset),\r\n rightPoint: rightPointV3.clone().add(offset),\r\n };\r\n}\r\n\r\nfunction isSamePoint(u: number[], v: number[]) {\r\n return Math.abs(u[0] - v[0]) < ZERO_TOLERANCE && Math.abs(u[1] - v[1]) < ZERO_TOLERANCE;\r\n}\r\n\r\nfunction getIntersectionPoint(v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3) {\r\n if (Math.abs(v1.x - v2.x) < 0.001 && Math.abs(v3.x - v4.x) < 0.001) {\r\n return null;\r\n }\r\n const k1 = (v2.y - v1.y) / (v2.x - v1.x);\r\n const k2 = (v4.y - v3.y) / (v4.x - v3.x);\r\n if (Math.abs(k1 - k2) < 0.001) {\r\n return null;\r\n }\r\n const x = [v1.x, v2.x, v3.x, v4.x];\r\n const y = [v1.y, v2.y, v3.y, v4.y];\r\n const x0 =\r\n ((x[2] - x[3]) * (x[1] * y[0] - x[0] * y[1]) - (x[0] - x[1]) * (x[3] * y[2] - x[2] * y[3])) /\r\n ((x[2] - x[3]) * (y[0] - y[1]) - (x[0] - x[1]) * (y[2] - y[3]));\r\n const y0 =\r\n ((y[2] - y[3]) * (y[1] * x[0] - y[0] * x[1]) - (y[0] - y[1]) * (y[3] * x[2] - y[2] * x[3])) /\r\n ((y[2] - y[3]) * (x[0] - x[1]) - (y[0] - y[1]) * (x[2] - x[3]));\r\n if (!Number.isFinite(x0) || !Number.isFinite(y0)) {\r\n return null;\r\n }\r\n return new Vector3(x0, y0);\r\n}\r\n\r\nexport default React.memo(Parapet);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport {\r\n BackSide,\r\n CanvasTexture,\r\n DoubleSide,\r\n Euler,\r\n FrontSide,\r\n Mesh,\r\n MeshStandardMaterial,\r\n Object3D,\r\n Raycaster,\r\n RepeatWrapping,\r\n Shape,\r\n Vector2,\r\n Vector3,\r\n} from 'three';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport { Box, Cylinder, Plane } from '@react-three/drei';\r\nimport { ActionType, MoveHandleType, ObjectType, Orientation, ResizeHandleType, WallTexture } from 'src/types';\r\nimport { Util } from 'src/Util';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { WallFill, WallModel, WallStructure } from 'src/models/WallModel';\r\nimport { ElementModelFactory } from 'src/models/ElementModelFactory';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { ElementGrid } from '../elementGrid';\r\nimport Window, { DEFAULT_POLYGONTOP, WINDOW_GROUP_NAME } from '../window/window';\r\nimport WallWireFrame from './wallWireFrame';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { UndoableAdd } from 'src/undo/UndoableAdd';\r\nimport { UndoableResizeElementOnWall } from 'src/undo/UndoableResize';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\nimport Door from '../door/door';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport SolarPanelOnWall from '../solarPanel/solarPanelOnWall';\r\nimport { useElements, useLatestFoundation, useWallTexture } from './hooks';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { HorizontalRuler } from '../horizontalRuler';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport { showError } from 'src/helpers';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { RoofUtil } from '../roof/RoofUtil';\r\nimport {\r\n FINE_GRID_SCALE,\r\n HALF_PI,\r\n INVALID_ELEMENT_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n NORMAL_GRID_SCALE,\r\n} from 'src/constants';\r\nimport { PolygonModel } from '../../models/PolygonModel';\r\nimport Polygon from '../polygon';\r\nimport { SharedUtil } from '../SharedUtil';\r\nimport { UndoableChange } from '../../undo/UndoableChange';\r\nimport Parapet, { DEFAULT_PARAPET_SETTINGS } from './parapet';\r\nimport { InnerCommonStoreState } from 'src/stores/InnerCommonState';\r\nimport WallHeatFlux from './wallHeatFlux';\r\nimport { useSelected } from '../hooks';\r\n\r\nexport const WALL_BLOCK_PLANE = 'Wall Block Plane';\r\n\r\nexport const WALL_INTERSECTION_PLANE_NAME = 'Wall Intersection Plane';\r\n\r\nexport const WALL_PADDING = 0.1;\r\nexport interface WallProps {\r\n wallModel: WallModel;\r\n foundationModel: FoundationModel;\r\n}\r\n\r\nconst PERPENDICULAR_THRESHOLD = 0.087; // 5 degree\r\n\r\nenum ElBeingAddedStatus {\r\n SettingStartPoint,\r\n SettingEndPoint,\r\n}\r\n\r\ntype ElBeingAdded = {\r\n id: string;\r\n type: ObjectType;\r\n status: ElBeingAddedStatus;\r\n};\r\n\r\ntype BoundedPointerOptions = {\r\n elementHalfSize?: number[];\r\n ignorePadding?: boolean;\r\n resizeAnchor?: Vector3;\r\n};\r\n\r\nconst InsideWallMaterial = React.memo(\r\n ({ transparent, color, opacity }: { transparent: boolean; color: string; opacity: number }) => {\r\n const sunlightDirection = useStore(Selector.sunlightDirection);\r\n const night = sunlightDirection.z <= 0;\r\n return (\r\n \r\n );\r\n },\r\n);\r\n\r\nconst Wall = ({ wallModel, foundationModel }: WallProps) => {\r\n let {\r\n id,\r\n cx,\r\n cy,\r\n lx = 1,\r\n ly = 0.5,\r\n lz = 5,\r\n relativeAngle,\r\n leftJoints,\r\n rightJoints,\r\n textureType,\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.2,\r\n parentId,\r\n locked = false,\r\n roofId,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n wallStructure = WallStructure.Default,\r\n structureSpacing = 2,\r\n structureWidth = 0.1,\r\n structureColor = 'white',\r\n opacity = 0.5,\r\n fill = WallFill.Full,\r\n leftUnfilledHeight = 0.5,\r\n rightUnfilledHeight = 0.5,\r\n leftTopPartialHeight = lz,\r\n rightTopPartialHeight = lz,\r\n parapet = DEFAULT_PARAPET_SETTINGS,\r\n leftPoint,\r\n rightPoint,\r\n } = wallModel;\r\n\r\n leftRoofHeight = leftJoints.length > 0 ? leftRoofHeight : lz;\r\n rightRoofHeight = rightJoints.length > 0 ? rightRoofHeight : lz;\r\n\r\n const texture = useWallTexture(textureType);\r\n\r\n const selected = useSelected(id);\r\n\r\n // common store\r\n const setCommonStore = useStore(Selector.set);\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const selectMe = useStore(Selector.selectMe);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const isAddingElement = useStore(Selector.isAddingElement);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const deletedRoofIdSet = useStore(Selector.deletedRoofIdSet);\r\n const autoDeletedRoofIdSet = useStore(Selector.autoDeletedRoofIdSet);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n // const roofRise = useStore((state) => {\r\n // if (!roofId) return 0;\r\n // const roof = state.elements.find((e) => e.id === roofId) as RoofModel;\r\n // if (!roof) return 0;\r\n // return roof.rise;\r\n // });\r\n\r\n // primitive store\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const elementBeingCanceledId = usePrimitiveStore((state) => state.elementBeingCanceledId);\r\n const showWallIntersectionPlaneId = usePrimitiveStore((state) => state.showWallIntersectionPlaneId);\r\n\r\n // state\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n\r\n // hooks\r\n const { camera, gl, invalidate } = useThree();\r\n const { elementsOnWall, leftWall, rightWall } = useElements(id, leftJoints[0], rightJoints[0]);\r\n const latestFoundation = useLatestFoundation(foundationModel);\r\n\r\n // object ref\r\n const outsideWallRef = useRef(null);\r\n const insideWallRef = useRef(null);\r\n const topSurfaceRef = useRef(null);\r\n const intersectionPlaneRef = useRef(null);\r\n\r\n // variables\r\n const grabRef = useRef(null);\r\n const addedWindowIdRef = useRef(null);\r\n const invalidElementIdRef = useRef(null);\r\n const elBeingAddedRef = useRef(null);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const wallAbsAngle = latestFoundation ? latestFoundation.rotation[2] + relativeAngle : relativeAngle;\r\n const leftOffset = Util.getInnerWallOffset(leftWall, lx, ly, relativeAngle, 'left');\r\n const rightOffset = Util.getInnerWallOffset(rightWall, lx, ly, relativeAngle, 'right');\r\n const transparent = wallStructure === WallStructure.Stud || wallStructure === WallStructure.Pillar;\r\n const wallLeftHeight = leftRoofHeight ?? lz;\r\n const wallRightHeight = rightRoofHeight ?? lz;\r\n const isPartial = fill === WallFill.Partial;\r\n const realLeftUnfilledHeight = isPartial ? leftUnfilledHeight : 0;\r\n const realRightUnfilledHeight = isPartial ? rightUnfilledHeight : 0;\r\n const realWallLeftHeight = isPartial ? Math.min(wallLeftHeight, leftTopPartialHeight) : wallLeftHeight;\r\n const realWallRightHeight = isPartial ? Math.min(wallRightHeight, rightTopPartialHeight) : wallRightHeight;\r\n const isTopPartial =\r\n isPartial &&\r\n (!Util.isZero(wallLeftHeight - realWallLeftHeight) || !Util.isZero(wallRightHeight - realWallRightHeight));\r\n const castShadow = shadowEnabled && !transparent;\r\n const showParapet = parapet.display;\r\n const parapetZ = Math.max(realWallLeftHeight, realWallRightHeight) - hz;\r\n\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const ray = useMemo(() => new Raycaster(), []);\r\n\r\n const whiteMaterialDouble = useMemo(\r\n () => new MeshStandardMaterial({ color: 'white', side: DoubleSide, transparent: transparent, opacity: opacity }),\r\n [transparent, opacity],\r\n );\r\n\r\n const zmax = useMemo(() => {\r\n return Util.getHighestPointOfWall(wallModel);\r\n }, [\r\n wallModel.lz,\r\n wallModel.leftRoofHeight,\r\n wallModel.rightRoofHeight,\r\n wallModel.centerRoofHeight,\r\n wallModel.centerLeftRoofHeight,\r\n wallModel.centerRightRoofHeight,\r\n ]);\r\n\r\n const outsideWallShape = useMemo(() => {\r\n const wallShape = new Shape();\r\n drawWallShape(wallShape, lx, lz, 0, 0, 0, 0);\r\n\r\n elementsOnWall.forEach((e) => {\r\n if (e.type === ObjectType.Window && e.id !== invalidElementIdRef.current && e.lx > 0 && e.lz > 0) {\r\n const window = e as WindowModel;\r\n const windowShape = new Shape();\r\n const [wlx, wly, wcx, wcy] = [e.lx * lx, e.lz * lz, e.cx * lx, e.cz * lz];\r\n // old files don't have windowType\r\n if (window.windowType) {\r\n switch (window.windowType) {\r\n case WindowType.Arched:\r\n drawArchWindow(windowShape, wlx, wly, wcx, wcy, window.archHeight);\r\n break;\r\n case WindowType.Polygonal: {\r\n const [tx, th] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n drawPolygonalWindow(windowShape, wlx, wly, wcx, wcy, tx * wlx, th);\r\n break;\r\n }\r\n case WindowType.Default:\r\n default:\r\n drawRectWindow(windowShape, wlx, wly, wcx, wcy);\r\n }\r\n } else {\r\n drawRectWindow(windowShape, wlx, wly, wcx, wcy);\r\n }\r\n wallShape.holes.push(windowShape);\r\n }\r\n });\r\n\r\n return wallShape;\r\n }, [\r\n lx,\r\n lz,\r\n fill,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n realWallLeftHeight,\r\n realWallRightHeight,\r\n elementsOnWall,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n ]);\r\n\r\n const insideWallShape = useMemo(() => {\r\n const wallShape = new Shape();\r\n\r\n const ly = lz;\r\n const hy = lz / 2;\r\n\r\n // lower edge, from left to right\r\n if (isPartial) {\r\n wallShape.moveTo(-hx + leftOffset, -hy + leftUnfilledHeight); // lower left\r\n wallShape.lineTo(hx - rightOffset, -hy + rightUnfilledHeight); // lower right\r\n } else {\r\n wallShape.moveTo(-hx + leftOffset, -hy); // lower left\r\n const doors = elementsOnWall.filter((e) => e.type === ObjectType.Door).sort((a, b) => a.cx - b.cx) as DoorModel[];\r\n for (const door of doors) {\r\n if (door.id !== invalidElementIdRef.current) {\r\n const [dcx, dcy, dlx, dly] = [door.cx * lx, door.cz * ly, door.lx * lx, door.lz * ly];\r\n if (door.doorType === DoorType.Default) {\r\n wallShape.lineTo(dcx - dlx / 2, -hy);\r\n wallShape.lineTo(dcx - dlx / 2, -hy + dly);\r\n wallShape.lineTo(dcx + dlx / 2, -hy + dly);\r\n wallShape.lineTo(dcx + dlx / 2, -hy);\r\n } else {\r\n const ah = Math.min(door.archHeight, dly, dlx / 2);\r\n wallShape.lineTo(dcx - dlx / 2, -hy);\r\n if (ah > 0.1) {\r\n wallShape.lineTo(dcx - dlx / 2, -hy + dly / 2 - ah);\r\n const r = ah / 2 + dlx ** 2 / (8 * ah);\r\n const [cX, cY] = [dcx, dcy + dly / 2 - r];\r\n const endAngle = Math.acos(Math.min(dlx / 2 / r, 1));\r\n const startAngle = Math.PI - endAngle;\r\n wallShape.absarc(cX, cY, r, startAngle, endAngle, true);\r\n } else {\r\n wallShape.lineTo(dcx - dlx / 2, -hy + dly);\r\n wallShape.lineTo(dcx + dlx / 2, -hy + dly);\r\n }\r\n wallShape.lineTo(dcx + dlx / 2, -hy);\r\n }\r\n }\r\n }\r\n wallShape.lineTo(hx - rightOffset, -hy); // lower right\r\n }\r\n\r\n // upper edge, from right to left\r\n if (isTopPartial) {\r\n const dh = realWallRightHeight - realWallLeftHeight;\r\n const rightOffsetHeight = ((lx - rightOffset) * dh) / lx;\r\n const leftOffsetHeight = (leftOffset * dh) / lx;\r\n\r\n wallShape.lineTo(hx - rightOffset, -hy + realWallLeftHeight + rightOffsetHeight); // upper right\r\n wallShape.lineTo(-hx + leftOffset, -hy + realWallLeftHeight + leftOffsetHeight); // upper left\r\n } else if (roofId) {\r\n if (rightRoofHeight) {\r\n wallShape.lineTo(hx - rightOffset, rightRoofHeight - hy);\r\n } else {\r\n wallShape.lineTo(hx - rightOffset, hy); // upper right\r\n }\r\n centerRightRoofHeight && wallShape.lineTo(centerRightRoofHeight[0] * lx, centerRightRoofHeight[1] - hy);\r\n centerRoofHeight && wallShape.lineTo(centerRoofHeight[0] * lx, centerRoofHeight[1] - hy);\r\n centerLeftRoofHeight && wallShape.lineTo(centerLeftRoofHeight[0] * lx, centerLeftRoofHeight[1] - hy);\r\n if (leftRoofHeight) {\r\n wallShape.lineTo(-hx + leftOffset, leftRoofHeight - hy);\r\n } else {\r\n wallShape.lineTo(-hx + leftOffset, hy); // upper left\r\n }\r\n } else {\r\n wallShape.lineTo(hx - rightOffset, hy); // upper right\r\n wallShape.lineTo(-hx + leftOffset, hy); // upper left\r\n }\r\n\r\n wallShape.closePath();\r\n\r\n elementsOnWall.forEach((w) => {\r\n if (w.type === ObjectType.Window && w.id !== invalidElementIdRef.current && w.lx > 0 && w.lz > 0) {\r\n const window = w as WindowModel;\r\n const windowShape = new Shape();\r\n const [wlx, wly, wcx, wcy] = [w.lx * lx, w.lz * lz, w.cx * lx, w.cz * lz];\r\n // old files don't have windowType\r\n if (window.windowType) {\r\n switch (window.windowType) {\r\n case WindowType.Arched:\r\n drawArchWindow(windowShape, wlx, wly, wcx, wcy, window.archHeight);\r\n break;\r\n case WindowType.Polygonal: {\r\n const [tx, th] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n drawPolygonalWindow(windowShape, wlx, wly, wcx, wcy, tx * wlx, th);\r\n break;\r\n }\r\n case WindowType.Default:\r\n default:\r\n drawRectWindow(windowShape, wlx, wly, wcx, wcy);\r\n break;\r\n }\r\n } else {\r\n drawRectWindow(windowShape, wlx, wly, wcx, wcy);\r\n }\r\n wallShape.holes.push(windowShape);\r\n }\r\n });\r\n return wallShape;\r\n }, [\r\n lx,\r\n lz,\r\n fill,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n realWallLeftHeight,\r\n realWallRightHeight,\r\n leftOffset,\r\n rightOffset,\r\n elementsOnWall,\r\n roofId,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n ]);\r\n\r\n const topSurfaceHeight = useMemo(() => {\r\n if (!isPartial) return hz;\r\n return (realWallLeftHeight + realWallRightHeight) / 2 - hz;\r\n }, [hz, isPartial, realWallLeftHeight, realWallRightHeight]);\r\n\r\n const topSurfaceRotationY = useMemo(() => {\r\n const dh = realWallRightHeight - realWallLeftHeight;\r\n if (!isPartial || Math.abs(dh) < 0.01) return 0;\r\n return Math.atan2(dh, lx);\r\n }, [lx, isPartial, realWallLeftHeight, realWallRightHeight]);\r\n\r\n const topWallShape = useMemo(() => {\r\n const shape = new Shape();\r\n if (!isPartial || Math.abs(topSurfaceRotationY) < 0.0001) {\r\n drawTopSurface(shape, lx, ly, leftOffset, rightOffset);\r\n return shape;\r\n } else {\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const t = Math.cos(topSurfaceRotationY);\r\n const tHx = hx / t;\r\n const tInnerLeftHx = (hx - leftOffset) / t;\r\n const tInnerRightHx = (hx - rightOffset) / t;\r\n\r\n shape.moveTo(-tHx, -hy);\r\n shape.lineTo(tHx, -hy);\r\n shape.lineTo(tInnerRightHx, hy);\r\n shape.lineTo(-tInnerLeftHx, hy);\r\n shape.closePath();\r\n\r\n return shape;\r\n }\r\n }, [lx, ly, leftOffset, rightOffset, isPartial, topSurfaceRotationY]);\r\n\r\n const outerWallPoints2D = useMemo(() => {\r\n const points: Point2[] = [];\r\n const x = lx / 2;\r\n const y = lz / 2;\r\n\r\n if (isPartial) {\r\n points.push({ x: -x + leftOffset, y: -y + realLeftUnfilledHeight });\r\n points.push({ x: x - rightOffset, y: -y + realRightUnfilledHeight });\r\n } else {\r\n points.push({ x: -x, y: -y });\r\n points.push({ x: x, y: -y });\r\n }\r\n\r\n if (isTopPartial) {\r\n points.push({ x: x - rightOffset, y: -y + realWallRightHeight });\r\n points.push({ x: -x + leftOffset, y: -y + realWallLeftHeight });\r\n } else {\r\n rightRoofHeight ? points.push({ x: x, y: rightRoofHeight - y }) : points.push({ x: x, y: y });\r\n if (centerRightRoofHeight) {\r\n points.push({ x: centerRightRoofHeight[0] * lx, y: centerRightRoofHeight[1] - y });\r\n }\r\n if (centerRoofHeight) {\r\n points.push({ x: centerRoofHeight[0] * lx, y: centerRoofHeight[1] - y });\r\n }\r\n if (centerLeftRoofHeight) {\r\n points.push({ x: centerLeftRoofHeight[0] * lx, y: centerLeftRoofHeight[1] - y });\r\n }\r\n leftRoofHeight ? points.push({ x: -x, y: leftRoofHeight - y }) : points.push({ x: -x, y: y });\r\n }\r\n\r\n return points;\r\n }, [\r\n lx,\r\n lz,\r\n fill,\r\n realLeftUnfilledHeight,\r\n realRightUnfilledHeight,\r\n realWallLeftHeight,\r\n realWallRightHeight,\r\n leftRoofHeight,\r\n rightRoofHeight,\r\n centerRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRightRoofHeight,\r\n ]);\r\n\r\n const structureUnitArray = useMemo(() => {\r\n const arr: number[][] = [];\r\n let k = 0,\r\n b = 0;\r\n if (fill === WallFill.Partial) {\r\n const dy = rightUnfilledHeight - leftUnfilledHeight;\r\n k = dy / lx;\r\n b = leftUnfilledHeight + hx * k;\r\n }\r\n if (wallStructure === WallStructure.Stud) {\r\n let pos = -hx + structureWidth / 2;\r\n while (pos <= hx) {\r\n arr.push([pos, k * pos + b]);\r\n pos += structureSpacing;\r\n }\r\n pos = hx - structureWidth / 2;\r\n arr.push([pos, k * pos + b]);\r\n } else if (wallStructure === WallStructure.Pillar) {\r\n let pos = -hx;\r\n while (pos <= hx) {\r\n arr.push([pos, k * pos + b]);\r\n pos += structureSpacing;\r\n }\r\n arr.push([hx, k * hx + b]);\r\n }\r\n\r\n return arr;\r\n }, [wallStructure, structureWidth, structureSpacing, lx, ly, lz, leftUnfilledHeight, rightUnfilledHeight]);\r\n\r\n // parapet\r\n const wallDataToParapet = useMemo(\r\n () => ({ id, parentId, cx, cy, hx, hy, angle: relativeAngle, selected }),\r\n [id, parentId, cx, cy, hx, hy, relativeAngle, selected],\r\n );\r\n\r\n const currWallPointDataToParapet = useMemo(\r\n () => ({\r\n leftPoint,\r\n rightPoint,\r\n ly,\r\n copingsWidth: parapet.copingsWidth,\r\n }),\r\n [leftPoint, rightPoint, ly, parapet.copingsWidth],\r\n );\r\n\r\n const leftWallPointDataToParapet = useMemo(() => {\r\n if (!leftWall || !leftWall.parapet || !leftWall.parapet.display) return null;\r\n return {\r\n leftPoint: leftWall.leftPoint,\r\n rightPoint: leftWall.rightPoint,\r\n ly: leftWall.ly,\r\n copingsWidth: leftWall.parapet.copingsWidth,\r\n };\r\n }, [\r\n leftWall?.leftPoint,\r\n leftWall?.rightPoint,\r\n leftWall?.ly,\r\n leftWall?.parapet?.copingsWidth,\r\n leftWall?.parapet?.display,\r\n ]);\r\n\r\n const rightWallPointDataToParapet = useMemo(() => {\r\n if (!rightWall || !rightWall.parapet || !rightWall.parapet.display) return null;\r\n return {\r\n leftPoint: rightWall.leftPoint,\r\n rightPoint: rightWall.rightPoint,\r\n ly: rightWall.ly,\r\n copingsWidth: rightWall.parapet.copingsWidth,\r\n };\r\n }, [\r\n rightWall?.leftPoint,\r\n rightWall?.rightPoint,\r\n rightWall?.ly,\r\n rightWall?.parapet?.copingsWidth,\r\n rightWall?.parapet?.display,\r\n ]);\r\n\r\n // effects\r\n useEffect(() => {\r\n if (elBeingAddedRef.current && elBeingAddedRef.current.id === elementBeingCanceledId) {\r\n elBeingAddedRef.current = null;\r\n resetBeingAddedChildId();\r\n }\r\n }, [elementBeingCanceledId]);\r\n\r\n useEffect(() => {\r\n if (wallModel && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(wallModel.id);\r\n if (heatmap) {\r\n const t = Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5);\r\n if (t) {\r\n t.wrapS = RepeatWrapping;\r\n t.wrapT = RepeatWrapping;\r\n const shiftZ = lz === zmax ? 0 : (1 - lz / zmax) / 2;\r\n t.offset.set(-lx / 2, -zmax / 2 - shiftZ);\r\n t.center.set(lx / 2, zmax / 2);\r\n t.repeat.set(1 / lx, 1 / zmax);\r\n setHeatmapTexture(t);\r\n }\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n if (!roofId) return;\r\n if (deletedRoofIdSet.has(roofId) || autoDeletedRoofIdSet.has(roofId)) {\r\n useStore.getState().set((state) => {\r\n const invalidateIdSet = new Set();\r\n\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n wall.roofId = null;\r\n wall.leftRoofHeight = undefined;\r\n wall.rightRoofHeight = undefined;\r\n wall.centerRoofHeight = undefined;\r\n wall.centerLeftRoofHeight = undefined;\r\n wall.centerRightRoofHeight = undefined;\r\n\r\n if (elementsOnWall.length > 0) {\r\n const wallPoints = RoofUtil.getWallPoints2D(wall);\r\n elementsOnWall.forEach((e) => {\r\n if (e.type === ObjectType.Polygon) return;\r\n const isDoor = e.type === ObjectType.Door;\r\n const isSolarPanel = e.type === ObjectType.SolarPanel;\r\n const eLx = isSolarPanel ? e.lx - 0.01 : e.lx * lx;\r\n const eLz = isSolarPanel ? e.ly - 0.01 : e.lz * lz;\r\n const center = new Vector3(e.cx * lx, 0, e.cz * lz);\r\n if (!Util.isElementInsideWall(center, eLx, eLz, wallPoints, isDoor)) {\r\n invalidateIdSet.add(e.id);\r\n if (state.autoDeletedChild) {\r\n state.autoDeletedChild.push(e);\r\n } else {\r\n state.autoDeletedChild = [e];\r\n }\r\n }\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n if (invalidateIdSet.size > 0) {\r\n state.elements = state.elements.filter((e) => !invalidateIdSet.has(e.id));\r\n } else {\r\n if (state.autoDeletedChild === null) {\r\n state.autoDeletedChild = [];\r\n }\r\n }\r\n });\r\n }\r\n }, [roofId, deletedRoofIdSet, autoDeletedRoofIdSet]);\r\n\r\n function drawWallShape(\r\n shape: Shape,\r\n lx: number,\r\n ly: number,\r\n cx = 0,\r\n cy = 0,\r\n leftOffset = 0,\r\n rightOffset = 0,\r\n drawDoorShape = true,\r\n ) {\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n\r\n // lower left\r\n if (isPartial) {\r\n shape.moveTo(cx - hx + leftOffset, cy - hy + leftUnfilledHeight);\r\n } else {\r\n shape.moveTo(cx - hx + leftOffset, cy - hy);\r\n }\r\n\r\n // doors\r\n if (drawDoorShape) {\r\n const doors = elementsOnWall.filter((e) => e.type === ObjectType.Door).sort((a, b) => a.cx - b.cx) as DoorModel[];\r\n for (const door of doors) {\r\n if (door.id !== invalidElementIdRef.current) {\r\n const [dcx, dcy, dlx, dly] = [door.cx * lx, door.cz * ly, door.lx * lx, door.lz * lz];\r\n if (door.doorType === DoorType.Default) {\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy);\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy + dly);\r\n shape.lineTo(cx + dcx + dlx / 2, cy - hy + dly);\r\n shape.lineTo(cx + dcx + dlx / 2, cy - hy);\r\n } else {\r\n const ah = Math.min(door.archHeight, dly, dlx / 2);\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy);\r\n if (ah > 0.1) {\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy + dly / 2 - ah);\r\n const r = ah / 2 + dlx ** 2 / (8 * ah);\r\n const [cX, cY] = [dcx, cy + dcy + dly / 2 - r];\r\n const endAngle = Math.acos(Math.min(dlx / 2 / r, 1));\r\n const startAngle = Math.PI - endAngle;\r\n shape.absarc(cX, cY, r, startAngle, endAngle, true);\r\n } else {\r\n shape.lineTo(cx + dcx - dlx / 2, cy - hy + dly);\r\n shape.lineTo(cx + dcx + dlx / 2, cy - hy + dly);\r\n }\r\n shape.lineTo(cx + dcx + dlx / 2, cy - hy);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // lower right\r\n if (isPartial) {\r\n shape.lineTo(cx + hx - rightOffset, cy - hy + rightUnfilledHeight);\r\n } else {\r\n shape.lineTo(cx + hx - rightOffset, cy - hy);\r\n }\r\n\r\n // top edges\r\n if (isTopPartial) {\r\n shape.lineTo(cx + hx - rightOffset, cy - hy + realWallRightHeight); // top right\r\n shape.lineTo(cx - hx + leftOffset, cy - hy + realWallLeftHeight); // top left\r\n } else if (roofId) {\r\n if (rightRoofHeight) {\r\n shape.lineTo(cx + hx - rightOffset, rightRoofHeight - hy);\r\n } else {\r\n shape.lineTo(cx + hx - rightOffset, cy + hy); // upper right\r\n }\r\n centerRightRoofHeight && shape.lineTo(centerRightRoofHeight[0] * lx, centerRightRoofHeight[1] - hy);\r\n centerRoofHeight && shape.lineTo(centerRoofHeight[0] * lx, centerRoofHeight[1] - hy);\r\n centerLeftRoofHeight && shape.lineTo(centerLeftRoofHeight[0] * lx, centerLeftRoofHeight[1] - hy);\r\n if (leftRoofHeight) {\r\n shape.lineTo(cx - hx + leftOffset, leftRoofHeight - hy);\r\n } else {\r\n shape.lineTo(cx - hx + leftOffset, cy + hy); // upper left\r\n }\r\n } else {\r\n shape.lineTo(cx + hx - rightOffset, cy + hy); // upper right\r\n shape.lineTo(cx - hx + leftOffset, cy + hy); // upper left\r\n }\r\n\r\n shape.closePath();\r\n }\r\n\r\n function getRelativePosOnWall(p: Vector3, wall: WallModel) {\r\n const { cx, cy, cz } = wall;\r\n if (latestFoundation && wallAbsAngle !== undefined) {\r\n const wallAbsPos = Util.wallAbsolutePosition(new Vector3(cx, cy, cz), latestFoundation).setZ(\r\n lz / 2 + latestFoundation.lz,\r\n );\r\n return new Vector3().subVectors(p, wallAbsPos).applyEuler(new Euler(0, 0, -wallAbsAngle));\r\n }\r\n return new Vector3();\r\n }\r\n\r\n function getElementVerticesOnWall(e: ElementModel) {\r\n const vertices: Point2[] = [];\r\n\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const [signX, signY] = [i, i * j];\r\n switch (e.type) {\r\n case ObjectType.Window: {\r\n const [cx, cy] = [e.cx * lx, e.cz * lz];\r\n const [hlx, hly] = [(e.lx * lx) / 2, (e.lz * lz) / 2];\r\n const x = cx + signX * hlx;\r\n const y = cy + signY * hly;\r\n vertices.push({ x, y } as Point2);\r\n break;\r\n }\r\n case ObjectType.Door: {\r\n const [cx, cy] = [e.cx * lx, e.cz * lz];\r\n const [hlx, hly] = [(e.lx * lx) / 2, (e.lz * lz) / 2];\r\n const x = cx + signX * hlx;\r\n const y = cy + signY * hly;\r\n vertices.push({ x, y } as Point2);\r\n break;\r\n }\r\n case ObjectType.SolarPanel: {\r\n const [cx, cy] = [e.cx * lx, e.cz * lz];\r\n const [hlx, hly] = [e.lx / 2, e.ly / 2];\r\n const x = cx + signX * hlx;\r\n const y = cy + signY * hly;\r\n vertices.push({ x, y } as Point2);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (e.type === ObjectType.Window && (e as WindowModel).windowType === WindowType.Polygonal) {\r\n const window = e as WindowModel;\r\n const [topX, topH] = window.polygonTop ?? [0, 0];\r\n vertices.push({ x: e.cx * lx + topX * e.lx * lx, y: e.cz * lz + (e.lz * lz) / 2 + topH } as Point2);\r\n }\r\n\r\n return vertices;\r\n }\r\n\r\n function getWallBoundary(wall: WallModel, margin = 0): Point2[] {\r\n if (!isPartial) return Util.getWallVertices(wall, margin);\r\n const hx = wall.lx / 2;\r\n const hz = wall.lz / 2;\r\n const lowerLeft = { x: -hx - margin, y: wall.leftUnfilledHeight - hz - margin } as Point2;\r\n const lowerRight = { x: hx + margin, y: wall.rightUnfilledHeight - hz - margin } as Point2;\r\n const upperLeft = { x: -hx - margin, y: wall.leftTopPartialHeight - hz + margin } as Point2;\r\n const upperRight = { x: hx + margin, y: wall.rightTopPartialHeight - hz + margin } as Point2;\r\n const vertices: Point2[] = [];\r\n vertices.push(upperLeft, lowerLeft, lowerRight, upperRight);\r\n if (!isTopPartial) {\r\n if (wall.centerRightRoofHeight) {\r\n vertices.push({\r\n x: wall.centerRightRoofHeight[0] * wall.lx,\r\n y: wall.centerRightRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n if (wall.centerRoofHeight) {\r\n vertices.push({ x: wall.centerRoofHeight[0] * wall.lx, y: wall.centerRoofHeight[1] - hz + margin } as Point2);\r\n }\r\n if (wall.centerLeftRoofHeight) {\r\n vertices.push({\r\n x: wall.centerLeftRoofHeight[0] * wall.lx,\r\n y: wall.centerLeftRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n function checkCollision(id: string, p: Vector3, elx: number, elz: number, polygonTop?: number[]) {\r\n if (elx < 0.1 || elz < 0.1) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n\r\n if (elx > lx || (!roofId && elz > lz)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n\r\n const margin = 0.1;\r\n elx += margin;\r\n elz += margin;\r\n\r\n for (const el of elementsOnWall) {\r\n if (el.id === id || el.type === ObjectType.Polygon) continue;\r\n\r\n // target element vertices\r\n const targetVertices = getElementVerticesOnWall(el);\r\n const currentVertices: Point2[] = [];\r\n\r\n // check if current element vertices inside target element vertices\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const pointX = p.x + (i * elx) / 2;\r\n const pointY = p.z + (i * j * elz) / 2;\r\n currentVertices.push({ x: pointX, y: pointY });\r\n if (Util.isPointInside(pointX, pointY, targetVertices)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n }\r\n }\r\n if (polygonTop) {\r\n const [topX, topH] = polygonTop;\r\n const pointX = p.x + topX * elx;\r\n const pointY = p.z + elz / 2 + topH;\r\n currentVertices.push({ x: pointX, y: pointY });\r\n if (Util.isPointInside(pointX, pointY, targetVertices)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n }\r\n\r\n // check if target element vertices inside current element vertices\r\n for (const targetVertex of targetVertices) {\r\n if (Util.isPointInside(targetVertex.x, targetVertex.y, currentVertices)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n invalidElementIdRef.current = null;\r\n return true; // no collision\r\n }\r\n\r\n function checkInsideBoundary(id: string, center: Vector3, eLx: number, eLz: number, isDoor?: boolean) {\r\n if (!Util.isElementInsideWall(center, eLx, eLz, outerWallPoints2D, isDoor)) {\r\n invalidElementIdRef.current = id;\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function checkPolygonTopInsideBoundary(center: Vector3, wLx: number, wLz: number, polygonTop: number[]) {\r\n const [tx, th] = polygonTop;\r\n const topPointX = center.x + wLx * tx;\r\n const topPointY = center.z + wLz / 2 + th;\r\n if (!Util.isPointInside(topPointX, topPointY, getWallBoundary(wallModel, 0))) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function setRayCast(e: PointerEvent) {\r\n mouse.x = (e.offsetX / gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n }\r\n\r\n function checkIfCanSelectMe(e: ThreeEvent) {\r\n return !(\r\n e.button === 2 ||\r\n useStore.getState().addedWallId ||\r\n addedWindowIdRef.current ||\r\n useStore.getState().moveHandleType ||\r\n useStore.getState().resizeHandleType ||\r\n useStore.getState().objectTypeToAdd !== ObjectType.None ||\r\n selected ||\r\n isAddingElement()\r\n );\r\n }\r\n\r\n function drawTopSurface(shape: Shape, lx: number, ly: number, leftOffset: number, rightOffset: number) {\r\n const x = lx / 2;\r\n const y = ly / 2;\r\n shape.moveTo(-x, -y);\r\n shape.lineTo(x, -y);\r\n shape.lineTo(x - rightOffset, y);\r\n shape.lineTo(-x + leftOffset, y);\r\n shape.closePath();\r\n }\r\n\r\n function drawRectWindow(shape: Shape, lx: number, ly: number, cx = 0, cy = 0) {\r\n const x = lx / 2;\r\n const y = ly / 2;\r\n shape.moveTo(cx - x, cy - y);\r\n shape.lineTo(cx + x, cy - y);\r\n shape.lineTo(cx + x, cy + y);\r\n shape.lineTo(cx - x, cy + y);\r\n shape.closePath();\r\n }\r\n\r\n function drawArchWindow(shape: Shape, lx: number, ly: number, cx: number, cy: number, archHeight = 0) {\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const ah = Math.min(archHeight, ly, hx);\r\n\r\n shape.moveTo(cx - hx, cy - hy);\r\n shape.lineTo(cx + hx, cy - hy);\r\n shape.lineTo(cx + hx, cy + hy - ah);\r\n\r\n if (ah > 0) {\r\n const r = ah / 2 + lx ** 2 / (8 * ah);\r\n const [cX, cY] = [cx, cy + hy - r];\r\n const startAngle = Math.acos(Math.min(1, hx / r));\r\n const endAngle = Math.PI - startAngle;\r\n shape.absarc(cX, cY, r, startAngle, endAngle, false);\r\n } else {\r\n shape.lineTo(cx - hx, cy + hy);\r\n }\r\n\r\n shape.closePath();\r\n }\r\n\r\n function drawPolygonalWindow(shape: Shape, lx: number, ly: number, cx: number, cy: number, tx: number, th: number) {\r\n const [hx, hy] = [lx / 2, ly / 2];\r\n shape.moveTo(cx - hx, cy - hy);\r\n shape.lineTo(cx + hx, cy - hy);\r\n shape.lineTo(cx + hx, cy + hy);\r\n shape.lineTo(cx + tx, cy + hy + th);\r\n shape.lineTo(cx - hx, cy + hy);\r\n shape.closePath();\r\n }\r\n\r\n function snapToNormalGrid(v: Vector3) {\r\n const x = parseFloat((Math.round(v.x / NORMAL_GRID_SCALE) * NORMAL_GRID_SCALE).toFixed(1));\r\n const z = parseFloat((Math.round(v.z / NORMAL_GRID_SCALE) * NORMAL_GRID_SCALE).toFixed(1));\r\n return new Vector3(x, v.y, z);\r\n }\r\n\r\n function snapToFineGrid(v: Vector3) {\r\n const x = parseFloat((Math.round(v.x / FINE_GRID_SCALE) * FINE_GRID_SCALE).toFixed(1));\r\n const z = parseFloat((Math.round(v.z / FINE_GRID_SCALE) * FINE_GRID_SCALE).toFixed(1));\r\n return new Vector3(x, v.y, z);\r\n }\r\n\r\n function getPositionOnGrid(p: Vector3) {\r\n if (useStore.getState().enableFineGrid) {\r\n p = snapToFineGrid(p);\r\n } else {\r\n p = snapToNormalGrid(p);\r\n }\r\n return p;\r\n }\r\n\r\n function collisionHelper(args: number[], tolerance = 0) {\r\n let [tMinX, tMaxX, tMinZ, tMaxZ, cMinX, cMaxX, cMinZ, cMaxZ] = args;\r\n cMinX += tolerance;\r\n cMaxX -= tolerance;\r\n cMinZ += tolerance;\r\n cMaxZ -= tolerance;\r\n return (\r\n ((cMinX >= tMinX && cMinX <= tMaxX) ||\r\n (cMaxX >= tMinX && cMaxX <= tMaxX) ||\r\n (tMinX >= cMinX && tMinX <= cMaxX) ||\r\n (tMaxX >= cMinX && tMaxX <= cMaxX)) &&\r\n ((cMinZ >= tMinZ && cMinZ <= tMaxZ) ||\r\n (cMaxZ >= tMinZ && cMaxZ <= tMaxZ) ||\r\n (tMinZ >= cMinZ && tMinZ <= cMaxZ) ||\r\n (tMaxZ >= cMinZ && tMaxZ <= cMaxZ))\r\n );\r\n }\r\n\r\n function checkPerpendicular(leftWall: WallModel, rightWall: WallModel) {\r\n // from right point to left point\r\n const vLeft = new Vector3().subVectors(\r\n new Vector3().fromArray(leftWall.leftPoint).setZ(0),\r\n new Vector3().fromArray(leftWall.rightPoint).setZ(0),\r\n );\r\n const vRight = new Vector3().subVectors(\r\n new Vector3().fromArray(rightWall.rightPoint).setZ(0),\r\n new Vector3().fromArray(rightWall.leftPoint).setZ(0),\r\n );\r\n const angle = vRight.angleTo(vLeft);\r\n return Math.abs(angle - Math.PI / 2) < PERPENDICULAR_THRESHOLD;\r\n }\r\n\r\n function setElementPosDms(id: string, pos: number[], dms: number[], archHeight?: number, polygonTop?: number[]) {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n [e.cx, e.cy, e.cz] = pos;\r\n [e.lx, e.ly, e.lz] = dms;\r\n if (archHeight !== undefined) {\r\n if (e.type === ObjectType.Window) {\r\n (e as WindowModel).archHeight = archHeight;\r\n } else if (e.type === ObjectType.Door) {\r\n (e as DoorModel).archHeight = archHeight;\r\n }\r\n }\r\n if (polygonTop !== undefined && e.type === ObjectType.Window) {\r\n const w = e as WindowModel;\r\n if (w.windowType === WindowType.Polygonal) {\r\n w.polygonTop = [...polygonTop];\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function hasPolygonTop(elem: ElementModel) {\r\n return (\r\n elem.type === ObjectType.Window &&\r\n (elem as WindowModel).windowType === WindowType.Polygonal &&\r\n (elem as WindowModel).polygonTop\r\n );\r\n }\r\n\r\n function handleUndoableAdd(elem: ElementModel) {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: elem,\r\n undo: () => {\r\n useStore.getState().removeElementById(elem.id, false);\r\n },\r\n redo: () => {\r\n useStore.getState().set((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n state.deletedRoofId = null;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n }\r\n\r\n function handleUndoableResize() {\r\n const oldElement = useStore.getState().selectedElement;\r\n if (!oldElement) return;\r\n const newElement = useStore.getState().getElementById(oldElement.id);\r\n if (!newElement) return;\r\n\r\n switch (newElement.type) {\r\n case ObjectType.Door:\r\n case ObjectType.Window:\r\n case ObjectType.SolarPanel:\r\n const undoableResize = {\r\n name: `Resize ${newElement.type}`,\r\n timestamp: Date.now(),\r\n resizedElementId: newElement.id,\r\n resizedElementType: newElement.type,\r\n oldPosition: [oldElement.cx, oldElement.cy, oldElement.cz],\r\n oldDimension: [oldElement.lx, oldElement.ly, oldElement.lz],\r\n newPosition: [newElement.cx, newElement.cy, newElement.cz],\r\n newDimension: [newElement.lx, newElement.ly, newElement.lz],\r\n oldArchHeight:\r\n oldElement.type === ObjectType.Window || oldElement.type === ObjectType.Door\r\n ? (oldElement as WindowModel).archHeight\r\n : undefined,\r\n newArchHeight:\r\n newElement.type === ObjectType.Window || newElement.type === ObjectType.Door\r\n ? (newElement as WindowModel).archHeight\r\n : undefined,\r\n oldPolygonTop: hasPolygonTop(oldElement) ? [...(oldElement as WindowModel).polygonTop!] : undefined,\r\n newPolygonTop: hasPolygonTop(newElement) ? [...(newElement as WindowModel).polygonTop!] : undefined,\r\n undo() {\r\n setElementPosDms(\r\n this.resizedElementId,\r\n this.oldPosition,\r\n this.oldDimension,\r\n this.oldArchHeight,\r\n this.oldPolygonTop,\r\n );\r\n },\r\n redo() {\r\n setElementPosDms(\r\n this.resizedElementId,\r\n this.newPosition,\r\n this.newDimension,\r\n this.newArchHeight,\r\n this.newPolygonTop,\r\n );\r\n },\r\n } as UndoableResizeElementOnWall;\r\n addUndoable(undoableResize);\r\n break;\r\n case ObjectType.Polygon:\r\n const oldPg = oldElement as PolygonModel;\r\n const newPg = newElement as PolygonModel;\r\n const undoableEditPolygon = {\r\n name: 'Edit Polygon',\r\n timestamp: Date.now(),\r\n oldValue: [...oldPg.vertices],\r\n newValue: [...newPg.vertices],\r\n changedElementId: newPg.id,\r\n changedElementType: newPg.type,\r\n undo() {\r\n updatePolygonVerticesById(this.changedElementId, this.oldValue as Point2[]);\r\n },\r\n redo() {\r\n updatePolygonVerticesById(this.changedElementId, this.newValue as Point2[]);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableEditPolygon);\r\n break;\r\n }\r\n }\r\n\r\n function resetBeingAddedChildId() {\r\n useStore.getState().set((state) => {\r\n state.addedWindowId = null;\r\n state.addedDoorId = null;\r\n });\r\n }\r\n\r\n function isElementAllowedMovingAdd(objectType: ObjectType) {\r\n return objectType === ObjectType.Window || objectType === ObjectType.Door;\r\n }\r\n\r\n function isFirstIntersectedWall(e: ThreeEvent, id: string) {\r\n const intersectedWalls = e.intersections.filter((i) => i.object.name !== WALL_INTERSECTION_PLANE_NAME);\r\n if (\r\n intersectedWalls.length > 0 &&\r\n intersectedWalls[0].object.name === `${SharedUtil.WALL_OUTSIDE_SURFACE_MESH_NAME} ${id}`\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function isFirstIntersectedObject(e: ThreeEvent) {\r\n return e.intersections.length > 0 && e.intersections[0].object === e.eventObject;\r\n }\r\n\r\n function ifChildNeedsChangeParent(wallId: string, child: ElementModel | null, event: ThreeEvent) {\r\n if (useStore.getState().moveHandleType && child && isChildType(child) && child.parentId !== wallId) {\r\n const intersections = event.intersections.filter(\r\n (i) =>\r\n i.eventObject.name.includes(SharedUtil.WALL_OUTSIDE_SURFACE_MESH_NAME) ||\r\n i.eventObject.name.includes(WINDOW_GROUP_NAME) ||\r\n i.eventObject.name === WALL_BLOCK_PLANE,\r\n );\r\n const hasBlockedPlane =\r\n intersections.length > 0 &&\r\n (intersections[0].eventObject.name === WALL_BLOCK_PLANE ||\r\n intersections[0].eventObject.name.includes(WINDOW_GROUP_NAME));\r\n\r\n if (!hasBlockedPlane) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function isChildType(el: ElementModel | null) {\r\n if (!el) return false;\r\n switch (el.type) {\r\n case ObjectType.Window:\r\n case ObjectType.Door:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Light:\r\n case ObjectType.Sensor:\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function isArchedResize(el: ElementModel) {\r\n if (useStore.getState().resizeHandleType !== ResizeHandleType.Arch) return false;\r\n if (el.type === ObjectType.Window) {\r\n const window = el as WindowModel;\r\n return window.windowType === WindowType.Arched && window.archHeight !== undefined;\r\n }\r\n if (el.type === ObjectType.Door) {\r\n const door = el as DoorModel;\r\n return door.doorType === DoorType.Arched && door.archHeight !== undefined;\r\n }\r\n }\r\n\r\n function isPointerOutsideShape(boundedShape: Shape, pointer2D: Vector2) {\r\n const points = boundedShape.getPoints().map((point) => ({ x: point.x, y: point.y }));\r\n return !Util.isPointInside(pointer2D.x, pointer2D.y, points);\r\n }\r\n\r\n function offsetWallEdgePoints(\r\n start: Vector3,\r\n end: Vector3,\r\n elHx: number,\r\n elHy: number,\r\n padding: number,\r\n isWallPoints = false,\r\n ) {\r\n const edgeVector = new Vector3().subVectors(end, start).normalize();\r\n const [s, e] = isWallPoints ? [end.y, start.y] : [start.y, end.y];\r\n let d;\r\n if (s < e) {\r\n const a = edgeVector.angleTo(new Vector3(-elHx, -elHy));\r\n d = Math.sin(a) * Math.hypot(elHx, elHy);\r\n } else {\r\n const a = edgeVector.angleTo(new Vector3(elHx, -elHy));\r\n d = Math.sin(Math.PI - a) * Math.hypot(elHx, elHy);\r\n }\r\n const offsetVector = edgeVector\r\n .clone()\r\n .applyEuler(new Euler(0, 0, HALF_PI))\r\n .multiplyScalar(d + padding);\r\n start.add(offsetVector);\r\n end.add(offsetVector);\r\n }\r\n\r\n function getClosestPointOnPolygon(polygon: Shape, point: Vector2) {\r\n const edges = polygon.getPoints();\r\n let closestPoint = point;\r\n let closestDistance = Infinity;\r\n for (let i = 0; i < edges.length; i++) {\r\n const edgeStart = edges[i];\r\n const edgeEnd = edges[(i + 1) % edges.length];\r\n const edgeDirection = edgeEnd.clone().sub(edgeStart);\r\n const edgeLengthSq = edgeDirection.lengthSq();\r\n const toStart = point.clone().sub(edgeStart);\r\n const projectionFactor = Math.max(0, Math.min(1, toStart.dot(edgeDirection) / edgeLengthSq));\r\n const closestEdgePoint = edgeStart.clone().add(edgeDirection.clone().multiplyScalar(projectionFactor));\r\n const distanceSq = closestEdgePoint.distanceToSquared(point);\r\n if (distanceSq < closestDistance) {\r\n closestPoint = closestEdgePoint;\r\n closestDistance = distanceSq;\r\n }\r\n }\r\n return closestPoint;\r\n }\r\n\r\n function getDiagonalResizedData(e: ThreeEvent, pointer: Vector3, anchor: Vector3) {\r\n const diagonal = new Vector3().subVectors(anchor, pointer);\r\n const center = new Vector3().addVectors(anchor, pointer).divideScalar(2);\r\n return {\r\n dimensionXZ: { x: Math.abs(diagonal.x), z: Math.abs(diagonal.z) },\r\n positionXZ: { x: center.x, z: center.z },\r\n };\r\n }\r\n\r\n function isValidToAddRoof(rect: boolean, sameHeight: boolean) {\r\n const wallMapOnFoundation = useStore.getState().elements.reduce((map, el) => {\r\n if (el.type === ObjectType.Wall && el.parentId === parentId) {\r\n map.set(el.id, el as WallModel);\r\n }\r\n return map;\r\n }, new Map());\r\n\r\n let isLoop = false,\r\n isSameHeight = true,\r\n isPerpendicular = true,\r\n count = 0;\r\n\r\n const lang = { lng: useStore.getState().language };\r\n const startWall = wallModel;\r\n let w = startWall;\r\n while (w && w.rightJoints.length > 0) {\r\n count++;\r\n const rightWall = wallMapOnFoundation.get(w.rightJoints[0]);\r\n if (!rightWall) break;\r\n if (sameHeight && rightWall.lz !== startWall.lz) {\r\n isSameHeight = false;\r\n showError(i18n.t('message.WallsAreNotAtSameHeight', lang));\r\n return false;\r\n }\r\n if (rect && !checkPerpendicular(w, rightWall)) {\r\n isPerpendicular = false;\r\n showError(i18n.t('message.WallsAreNotPerpendicular', lang));\r\n return false;\r\n }\r\n if (rightWall.id === startWall.id) {\r\n isLoop = true;\r\n break;\r\n }\r\n w = rightWall;\r\n // avoid infinite loop\r\n if (count > 100) break;\r\n }\r\n\r\n if (!isLoop) {\r\n showError(i18n.t('message.WallsAreNotConnected', lang));\r\n return false;\r\n }\r\n if (rect && count !== 4) {\r\n showError(i18n.t('message.WallsNumberNeedToBeFour', lang));\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function isSettingElementStartPoint() {\r\n return (\r\n elBeingAddedRef.current &&\r\n elBeingAddedRef.current.status === ElBeingAddedStatus.SettingStartPoint &&\r\n useStore.getState().moveHandleType === MoveHandleType.Mid\r\n );\r\n }\r\n\r\n function isAllowedToSelectMe() {\r\n if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType || isAddingElement()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n function isRectWall() {\r\n if (isTopPartial || leftUnfilledHeight !== rightUnfilledHeight || leftTopPartialHeight !== rightTopPartialHeight)\r\n return false;\r\n if (!roofId) return true;\r\n if (leftRoofHeight !== rightRoofHeight) return false;\r\n if (centerRoofHeight !== undefined || centerLeftRoofHeight !== undefined || centerRightRoofHeight !== undefined)\r\n return false;\r\n return true;\r\n }\r\n\r\n /** Relative to wall and snapped to grid */\r\n function getPointer(e: ThreeEvent, object3D?: Object3D | null, diagonalVector?: Vector3) {\r\n setRayCast(e);\r\n const intersections = object3D ? ray.intersectObjects([object3D]) : e.intersections;\r\n const pointer = intersections[0]?.point ?? e.point;\r\n const relativePositionOnWall = getRelativePosOnWall(pointer, wallModel);\r\n const positionOnGrid = diagonalVector\r\n ? getPositionOnGrid(relativePositionOnWall.clone().add(diagonalVector)).sub(diagonalVector)\r\n : getPositionOnGrid(relativePositionOnWall);\r\n return {\r\n relativePointer: relativePositionOnWall,\r\n pointerOnGrid: positionOnGrid,\r\n };\r\n }\r\n\r\n function makeNewMovingElement(e: ThreeEvent, objectTypeToAdd: ObjectType) {\r\n if (!outsideWallRef.current) return null;\r\n const { pointerOnGrid } = getPointer(e, outsideWallRef.current);\r\n const cx = pointerOnGrid.x / wallModel.lx;\r\n const cz = pointerOnGrid.z / wallModel.lz;\r\n if (objectTypeToAdd === ObjectType.Window) {\r\n return ElementModelFactory.makeWindow(wallModel, cx, 0, cz, ObjectType.Wall);\r\n }\r\n if (objectTypeToAdd === ObjectType.Door) {\r\n return ElementModelFactory.makeDoor(wallModel);\r\n }\r\n return null;\r\n }\r\n\r\n function setElementHasBeenAdded(newElement: ElementModel | null) {\r\n if (newElement) {\r\n elBeingAddedRef.current = {\r\n id: newElement.id,\r\n type: newElement.type,\r\n status: ElBeingAddedStatus.SettingStartPoint,\r\n };\r\n }\r\n setCommonStore((state) => {\r\n if (newElement) {\r\n state.elements.push(newElement);\r\n state.selectedElement = newElement;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(newElement.id);\r\n if (newElement.type === ObjectType.Window) {\r\n state.addedWindowId = newElement.id;\r\n } else if (newElement.type === ObjectType.Door) {\r\n state.addedDoorId = newElement.id;\r\n }\r\n }\r\n state.moveHandleType = MoveHandleType.Mid;\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n\r\n function resetToAddingNewObjectStatus(elBeingAdded: ElBeingAdded | null) {\r\n if (!elBeingAdded) return;\r\n const { id, type } = elBeingAdded;\r\n setCommonStore((state) => {\r\n state.elements = state.elements.filter((e) => e.id !== id);\r\n state.selectedElement = null;\r\n state.moveHandleType = null;\r\n state.objectTypeToAdd = type;\r\n state.addedWindowId = null;\r\n state.addedDoorId = null;\r\n });\r\n elBeingAddedRef.current = null;\r\n }\r\n\r\n function getElementHalfSize(element?: ElementModel) {\r\n if (!element) return [0, 0];\r\n\r\n switch (element.type) {\r\n case ObjectType.Window: {\r\n const oldParentId = usePrimitiveStore.getState().oldParentId;\r\n if (element.parentId !== oldParentId) {\r\n const oldParent = useStore.getState().elements.find((e) => e.id === oldParentId);\r\n if (!oldParent) return [0, 0];\r\n return [(element.lx * oldParent.lx) / 2, (element.lz * oldParent.lz) / 2];\r\n } else {\r\n return [(element.lx * lx) / 2, (element.lz * lz) / 2];\r\n }\r\n }\r\n case ObjectType.Door: {\r\n return [(element.lx * lx) / 2, (element.lz * lz) / 2];\r\n }\r\n case ObjectType.SolarPanel: {\r\n return [element.lx / 2, element.ly / 2];\r\n }\r\n }\r\n return [WALL_PADDING, WALL_PADDING];\r\n }\r\n\r\n /** only use x y as 2D, from right to left */\r\n function getRoofPoints() {\r\n const roofPoints: Vector3[] = [];\r\n\r\n // exception: shed roof\r\n if (centerRoofHeight) {\r\n const x = centerRoofHeight[0];\r\n if (x === 0.5 && leftRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(hx, centerRoofHeight[1] - hz), new Vector3(-hx, leftRoofHeight - hz));\r\n return roofPoints;\r\n }\r\n if (x === -0.5 && rightRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(hx, rightRoofHeight - hz), new Vector3(-hx, centerRoofHeight[1] - hz));\r\n return roofPoints;\r\n }\r\n }\r\n\r\n if (rightRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(hx, rightRoofHeight - hz));\r\n } else {\r\n roofPoints.push(new Vector3(hx, hz));\r\n }\r\n if (centerRightRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(centerRightRoofHeight[0] * lx, centerRightRoofHeight[1] - hz));\r\n }\r\n if (centerRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(centerRoofHeight[0] * lx, centerRoofHeight[1] - hz));\r\n }\r\n if (centerLeftRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(centerLeftRoofHeight[0] * lx, centerLeftRoofHeight[1] - hz));\r\n }\r\n if (leftRoofHeight !== undefined) {\r\n roofPoints.push(new Vector3(-hx, leftRoofHeight - hz));\r\n } else {\r\n roofPoints.push(new Vector3(-hx, hz));\r\n }\r\n return roofPoints;\r\n }\r\n\r\n function getBoundedPointer(pointer: Vector3, options?: BoundedPointerOptions) {\r\n const ignorePadding = options?.ignorePadding;\r\n const elementHalfSize = options?.elementHalfSize ? [...options.elementHalfSize] : [0, 0];\r\n\r\n const padding = ignorePadding ? 0 : WALL_PADDING;\r\n const leftPadding = ignorePadding ? 0 : WALL_PADDING + leftOffset;\r\n const rightPadding = ignorePadding ? 0 : WALL_PADDING + rightOffset;\r\n const [elHx, elHz] = elementHalfSize;\r\n\r\n const [boundingMinX, boundingMaxX, boundingMinZ, boundingMaxZ] = [\r\n -hx + elHx + leftPadding,\r\n hx - elHx - rightPadding,\r\n -hz + elHz + padding,\r\n hz - elHz - padding,\r\n ];\r\n\r\n const boundedPointer = pointer.clone();\r\n if (isRectWall()) {\r\n const botHeight = isPartial ? leftUnfilledHeight : 0;\r\n const topHeight = lz - (isPartial ? realWallLeftHeight : lz);\r\n boundedPointer.setX(Util.clamp(pointer.x, boundingMinX, boundingMaxX));\r\n boundedPointer.setZ(Util.clamp(pointer.z, boundingMinZ + botHeight, boundingMaxZ - topHeight));\r\n return boundedPointer;\r\n } else {\r\n const boundedShape = getBoundedShape(elHx, elHz, boundingMinX, boundingMaxX, padding);\r\n const pointer2D = new Vector2(pointer.x, pointer.z);\r\n\r\n let maxY = Infinity;\r\n let minY = -Infinity;\r\n if (options?.resizeAnchor) {\r\n const anchorX = options.resizeAnchor.x;\r\n const points: Vector3[] = [];\r\n\r\n if (isTopPartial) {\r\n points.push(new Vector3(-hx, -hz + realWallLeftHeight), new Vector3(hx, -hz + realWallRightHeight));\r\n } else {\r\n const roofPoints = getRoofPoints().reverse(); // from left to right.\r\n points.push(...roofPoints);\r\n }\r\n for (let i = 1; i < points.length; i++) {\r\n const start = points[i - 1];\r\n const end = points[i];\r\n if (anchorX >= start.x && anchorX <= end.x) {\r\n const k = (end.y - start.y) / (end.x - start.x);\r\n const b = -k * start.x + start.y;\r\n maxY = k * anchorX + b;\r\n break;\r\n }\r\n }\r\n const botLeftPoint = new Vector3(-hx, -hz + realLeftUnfilledHeight);\r\n const botRightPoint = new Vector3(hx, -hz + realRightUnfilledHeight);\r\n const k = (botRightPoint.y - botLeftPoint.y) / (botRightPoint.x - botLeftPoint.x);\r\n const b = -k * botLeftPoint.x + botLeftPoint.y;\r\n minY = k * anchorX + b;\r\n }\r\n const isElementOutside = pointer2D.y > maxY;\r\n const isPointerOutside = isPointerOutsideShape(boundedShape, pointer2D);\r\n\r\n if (isPointerOutside) {\r\n const p = getClosestPointOnPolygon(boundedShape, pointer2D);\r\n boundedPointer.setX(p.x);\r\n boundedPointer.setZ(Util.clamp(p.y, minY + padding, maxY - padding));\r\n } else if (isElementOutside) {\r\n boundedPointer.setZ(maxY - padding);\r\n }\r\n }\r\n\r\n boundedPointer.setZ(Math.max(boundingMinZ, boundedPointer.z));\r\n return boundedPointer;\r\n }\r\n\r\n function moveElement(id: string, pointer: Vector3) {\r\n setCommonStore((state) => {\r\n const el = state.elements.find((e) => e.id === id);\r\n if (!el) return;\r\n\r\n switch (el.type) {\r\n case ObjectType.Window: {\r\n el.cx = pointer.x / lx;\r\n el.cz = pointer.z / lz;\r\n el.cy = el.id === invalidElementIdRef.current ? -0.01 : 0.3;\r\n (el as WindowModel).tint =\r\n el.id === invalidElementIdRef.current ? 'red' : (state.selectedElement as WindowModel).tint; // usePrimitiveStore.getState().oldWindowTint ?? '#73D8FF';\r\n break;\r\n }\r\n case ObjectType.Door: {\r\n const hz = lz / 2;\r\n el.cx = pointer.x / lx;\r\n el.cz = (pointer.z - hz) / 2 / lz;\r\n el.lz = (pointer.z + hz) / lz;\r\n break;\r\n }\r\n case ObjectType.SolarPanel: {\r\n el.cx = pointer.x / lx;\r\n el.cz = pointer.z / lz;\r\n el.color = el.id === invalidElementIdRef.current ? 'red' : '#fff';\r\n break;\r\n }\r\n case ObjectType.Sensor:\r\n case ObjectType.Light: {\r\n el.cx = pointer.x / lx;\r\n el.cz = pointer.z / lz;\r\n break;\r\n }\r\n case ObjectType.Polygon: {\r\n const pg = el as PolygonModel;\r\n if (pg.vertices.length > 0) {\r\n const centroid = Util.calculatePolygonCentroid(pg.vertices);\r\n const dx = -pointer.x / lx - centroid.x;\r\n const dy = -pointer.z / lz - centroid.y;\r\n const newVertices = pg.vertices.map((v) => ({ x: v.x + dx, y: v.y + dy }));\r\n (el as PolygonModel).vertices = newVertices;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getBoundedShape(elHx: number, elHz: number, boundingMinX: number, boundingMaxX: number, padding: number) {\r\n const edgesPoints: { start: Vector3; end: Vector3 }[] = [];\r\n\r\n const botLeftPoint = new Vector3(-hx, -hz + realLeftUnfilledHeight);\r\n const botRightPoint = new Vector3(hx, -hz + realRightUnfilledHeight);\r\n offsetWallEdgePoints(botLeftPoint, botRightPoint, elHx, elHz, padding, true);\r\n\r\n // starting from wall left edge, counter-clockwise\r\n edgesPoints.push({ start: new Vector3(boundingMinX, hz), end: new Vector3(boundingMinX, botLeftPoint.y) });\r\n\r\n // bottom edge\r\n edgesPoints.push({ start: botLeftPoint.clone(), end: botRightPoint.clone() });\r\n\r\n // right\r\n edgesPoints.push({ start: new Vector3(boundingMaxX, botRightPoint.y), end: new Vector3(boundingMaxX, hz) });\r\n\r\n if (isTopPartial) {\r\n // top edge\r\n const topRightPoint = new Vector3(hx, -hz + realWallRightHeight);\r\n const topLeftPoint = new Vector3(-hx, -hz + realWallLeftHeight);\r\n offsetWallEdgePoints(topRightPoint, topLeftPoint, elHx, elHz, padding);\r\n edgesPoints.push({ start: topRightPoint.clone(), end: topLeftPoint.clone() });\r\n } else {\r\n const roofPoints = getRoofPoints();\r\n for (let i = 1; i < roofPoints.length; i++) {\r\n const start = roofPoints[i - 1].clone();\r\n const end = roofPoints[i].clone();\r\n offsetWallEdgePoints(start, end, elHx, elHz, padding);\r\n edgesPoints.push({ start, end });\r\n }\r\n }\r\n\r\n const shape = new Shape();\r\n edgesPoints.push(edgesPoints[0]);\r\n for (let i = 1; i < edgesPoints.length; i++) {\r\n const edge1 = edgesPoints[i - 1];\r\n const edge2 = edgesPoints[i];\r\n const point = RoofUtil.getIntersectionPoint(edge1.start, edge1.end, edge2.start, edge2.end);\r\n if (i === 1) {\r\n shape.moveTo(point.x, point.y);\r\n } else {\r\n shape.lineTo(point.x, point.y);\r\n }\r\n }\r\n shape.closePath();\r\n return shape;\r\n }\r\n\r\n function getArchedResizedData(archedElement: WindowModel | DoorModel, pointer: Vector3, anchor: Vector3) {\r\n const [wlx, wlz] = [archedElement.lx * lx, archedElement.lz * lz];\r\n const archHeightBottom = wlz / 2 - Math.min(archedElement.archHeight, wlx / 2, wlz);\r\n const newArchHeight = Math.max(0, Math.min(pointer.z - anchor.z - archHeightBottom, wlx / 2));\r\n const newLz = archHeightBottom + newArchHeight + wlz / 2;\r\n const center = new Vector3(archedElement.cx * lx, archedElement.cy, archedElement.cz * lz + (newLz - wlz) / 2);\r\n return { newLz: newLz, newCz: center.z, newArchHeight: newArchHeight };\r\n }\r\n\r\n function handleWallBodyPointMove(e: ThreeEvent) {\r\n if (isFirstIntersectedWall(e, id)) {\r\n const objectTypeToAdd = useStore.getState().objectTypeToAdd;\r\n // add new element\r\n if (isElementAllowedMovingAdd(objectTypeToAdd)) {\r\n const newElement = makeNewMovingElement(e, objectTypeToAdd);\r\n setElementHasBeenAdded(newElement);\r\n }\r\n // move element being added\r\n if (isSettingElementStartPoint()) {\r\n const { pointerOnGrid } = getPointer(e, outsideWallRef.current);\r\n const boundedPointer = getBoundedPointer(pointerOnGrid);\r\n moveElement(elBeingAddedRef.current!.id, boundedPointer);\r\n }\r\n // move child across different parent\r\n const selectedElement = useStore.getState().selectedElement;\r\n if (ifChildNeedsChangeParent(id, selectedElement, e)) {\r\n setCommonStore((state) => {\r\n const el = state.elements.find((e) => e.id === selectedElement?.id);\r\n if (!el || (el.type === ObjectType.SolarPanel && (el as SolarPanelModel).parentType === undefined)) return;\r\n\r\n // keep old abs dimension\r\n if (el.type === ObjectType.Window) {\r\n const oldParent = state.elements.find((e) => e.id === el.parentId);\r\n if (oldParent) {\r\n const absLx = el.lx * oldParent.lx;\r\n const absLz = el.lz * oldParent.lz;\r\n el.lx = absLx / lx;\r\n el.lz = absLz / lz;\r\n }\r\n }\r\n\r\n const { pointerOnGrid } = getPointer(e, outsideWallRef.current);\r\n const elementHalfSize = getElementHalfSize(el);\r\n const boundedPointer = getBoundedPointer(pointerOnGrid, {\r\n elementHalfSize,\r\n ignorePadding: el.type === ObjectType.SolarPanel,\r\n });\r\n checkCollision(el.id, boundedPointer, elementHalfSize[0] * 2, elementHalfSize[1] * 2);\r\n\r\n el.cx = boundedPointer.x / lx;\r\n el.cz = boundedPointer.z / lz;\r\n el.parentId = id;\r\n el.foundationId = parentId;\r\n if (state.selectedElement) {\r\n state.selectedElement.parentId = id;\r\n state.selectedElement.foundationId = parentId;\r\n }\r\n\r\n if (el.type === ObjectType.Window) {\r\n el.cy = el.id === invalidElementIdRef.current ? -0.01 : 0;\r\n (el as WindowModel).tint =\r\n el.id === invalidElementIdRef.current ? 'red' : (state.selectedElement as WindowModel).tint;\r\n } else if (el.type === ObjectType.SolarPanel) {\r\n el.color = el.id === invalidElementIdRef.current ? 'red' : '#fff';\r\n (el as SolarPanelModel).parentType = ObjectType.Wall;\r\n }\r\n });\r\n setPrimitiveStore('showWallIntersectionPlaneId', id);\r\n }\r\n } else if (isSettingElementStartPoint()) {\r\n resetToAddingNewObjectStatus(elBeingAddedRef.current);\r\n }\r\n }\r\n\r\n function handleWallBodyPointerDown(e: ThreeEvent) {\r\n if (e.button === 2) return;\r\n if (isSettingElementStartPoint()) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setShowIntersectionPlane(true);\r\n const { pointerOnGrid } = getPointer(e, outsideWallRef.current);\r\n const boundedPointer = getBoundedPointer(pointerOnGrid);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n if (elBeingAddedRef.current?.type === ObjectType.Window) {\r\n state.resizeHandleType = ResizeHandleType.LowerRight;\r\n state.resizeAnchor.copy(boundedPointer); // relative to wall\r\n } else if (elBeingAddedRef.current?.type === ObjectType.Door) {\r\n state.resizeHandleType = ResizeHandleType.UpperRight;\r\n state.resizeAnchor.copy(boundedPointer).setZ(-lz / 2); // relative to wall\r\n }\r\n });\r\n elBeingAddedRef.current!.status = ElBeingAddedStatus.SettingEndPoint;\r\n } else if (isFirstIntersectedObject(e)) {\r\n const isAddingNewChildByClick = useStore.getState().objectTypeToAdd !== ObjectType.None;\r\n if (isAddingNewChildByClick) {\r\n const pointer = e.point; // should use getBoundedPointer\r\n addElementByClick(pointer, true);\r\n } else if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n e.selected = e.id === parentId;\r\n }\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (state.selectedElementIdSet.has(parentId)) {\r\n state.selectedElementIdSet.delete(parentId);\r\n } else {\r\n state.selectedElementIdSet.add(parentId);\r\n }\r\n });\r\n e.stopPropagation();\r\n } else if (isAllowedToSelectMe()) {\r\n useStore.getState().selectMe(id, e, ActionType.Select);\r\n }\r\n }\r\n }\r\n\r\n function handleWallBodyPointerUp() {\r\n if (elBeingAddedRef.current && elBeingAddedRef.current.status === ElBeingAddedStatus.SettingStartPoint) {\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n state.addedDoorId = null;\r\n state.addedWindowId = null;\r\n state.moveHandleType = null;\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n }\r\n });\r\n elBeingAddedRef.current = null;\r\n }\r\n }\r\n\r\n function handleWallBodyPointerOut() {\r\n if (isSettingElementStartPoint()) {\r\n resetToAddingNewObjectStatus(elBeingAddedRef.current);\r\n }\r\n invalidElementIdRef.current = null;\r\n }\r\n\r\n // pointer move\r\n function handleIntersectionPlanePointerMove(e: ThreeEvent) {\r\n const selectedElement = useStore.getState().selectedElement ?? getSelectedElement();\r\n if (selectedElement?.parentId === wallModel.id) {\r\n // move element\r\n if (useStore.getState().moveHandleType) {\r\n const diagonalVector =\r\n selectedElement.type !== ObjectType.Polygon\r\n ? new Vector3((-selectedElement.lx / 2) * lx, 0, (selectedElement.lz / 2) * lz)\r\n : undefined;\r\n const { relativePointer, pointerOnGrid } = getPointer(e, intersectionPlaneRef.current, diagonalVector);\r\n const elementHalfSize = getElementHalfSize(selectedElement);\r\n const boundedPointer = getBoundedPointer(pointerOnGrid, {\r\n elementHalfSize,\r\n ignorePadding: selectedElement.type === ObjectType.SolarPanel,\r\n });\r\n const [eLx, eLz] = [elementHalfSize[0] * 2, elementHalfSize[1] * 2];\r\n if (selectedElement.type !== ObjectType.SolarPanel) {\r\n checkInsideBoundary(selectedElement.id, boundedPointer, eLx, eLz);\r\n }\r\n if (selectedElement.type !== ObjectType.Polygon) {\r\n let isInside = true;\r\n let polygonTop: number[] | undefined = undefined;\r\n if (\r\n selectedElement.type === ObjectType.Window &&\r\n (selectedElement as WindowModel).windowType === WindowType.Polygonal\r\n ) {\r\n polygonTop = (selectedElement as WindowModel).polygonTop ?? DEFAULT_POLYGONTOP;\r\n isInside = checkPolygonTopInsideBoundary(boundedPointer, eLx, eLz, polygonTop);\r\n }\r\n const isvalid = checkCollision(selectedElement.id, boundedPointer, eLx, eLz, polygonTop);\r\n if (isInside && isvalid) {\r\n invalidElementIdRef.current = null;\r\n } else {\r\n invalidElementIdRef.current = selectedElement.id;\r\n }\r\n }\r\n moveElement(selectedElement.id, boundedPointer);\r\n }\r\n // resize element\r\n else if (useStore.getState().resizeHandleType) {\r\n const { relativePointer, pointerOnGrid } = getPointer(e, intersectionPlaneRef.current);\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n switch (selectedElement.type) {\r\n case ObjectType.Window: {\r\n const window = selectedElement as WindowModel;\r\n const boundedPointer = getBoundedPointer(pointerOnGrid, { resizeAnchor });\r\n if (isArchedResize(window)) {\r\n const { newLz, newCz, newArchHeight } = getArchedResizedData(window, boundedPointer, resizeAnchor);\r\n const center = new Vector3(window.cx * lx, 0, newCz);\r\n checkCollision(window.id, center, window.lx * lx, newLz);\r\n checkInsideBoundary(window.id, center, window.lx * lx, newLz);\r\n setCommonStore((state) => {\r\n const w = state.elements.find((e) => e.id === window.id) as WindowModel;\r\n if (!w) return;\r\n w.lz = newLz / lz;\r\n w.cz = newCz / lz;\r\n w.archHeight = newArchHeight;\r\n w.cy = w.id === invalidElementIdRef.current ? -0.01 : 0.3;\r\n w.tint = w.id === invalidElementIdRef.current ? 'red' : window.tint;\r\n });\r\n } else if (resizeHandleType === ResizeHandleType.Upper) {\r\n // polygonal top vertex\r\n // todo: add boundary check\r\n const center = new Vector3(window.cx * lx, 0, window.cz * lz);\r\n const [wlx, wlz] = [window.lx * lx, window.lz * lz];\r\n const tx = Util.clamp((pointerOnGrid.x - resizeAnchor.x) / wlx, -0.5, 0.5);\r\n const th = Math.max(0, pointerOnGrid.z - resizeAnchor.z);\r\n const newPolygonTop = [tx, th];\r\n if (\r\n !checkCollision(window.id, center, wlx, wlz, newPolygonTop) ||\r\n !checkPolygonTopInsideBoundary(center, wlx, wlz, newPolygonTop)\r\n ) {\r\n invalidElementIdRef.current = window.id;\r\n }\r\n setCommonStore((state) => {\r\n const w = state.elements.find((e) => e.id === window.id) as WindowModel;\r\n if (!w) return;\r\n w.polygonTop = [...newPolygonTop];\r\n w.cy = w.id === invalidElementIdRef.current ? -0.01 : 0.3;\r\n w.tint = w.id === invalidElementIdRef.current ? 'red' : window.tint;\r\n });\r\n } else {\r\n const { dimensionXZ, positionXZ } = getDiagonalResizedData(e, boundedPointer, resizeAnchor);\r\n const center = new Vector3(positionXZ.x, 0, positionXZ.z);\r\n let isPolygonTopInside = true;\r\n let polygonTop: number[] | undefined = undefined;\r\n if (window.windowType === WindowType.Polygonal) {\r\n polygonTop = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n isPolygonTopInside = checkPolygonTopInsideBoundary(center, dimensionXZ.x, dimensionXZ.z, polygonTop);\r\n }\r\n if (\r\n !checkCollision(window.id, center, dimensionXZ.x, dimensionXZ.z, polygonTop) ||\r\n !isPolygonTopInside ||\r\n !checkInsideBoundary(window.id, center, dimensionXZ.x, dimensionXZ.z)\r\n ) {\r\n invalidElementIdRef.current = window.id;\r\n }\r\n\r\n setCommonStore((state) => {\r\n const w = state.elements.find((e) => e.id === window.id) as WindowModel;\r\n if (!w) return;\r\n w.lx = dimensionXZ.x / lx;\r\n w.lz = dimensionXZ.z / lz;\r\n w.cx = positionXZ.x / lx;\r\n w.cz = positionXZ.z / lz;\r\n w.cy = w.id === invalidElementIdRef.current ? -0.01 : 0.3;\r\n w.tint = w.id === invalidElementIdRef.current ? 'red' : window.tint;\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.Door: {\r\n const door = selectedElement as DoorModel;\r\n const boundedPointer = getBoundedPointer(pointerOnGrid, { resizeAnchor });\r\n if (isArchedResize(door)) {\r\n const { newLz, newCz, newArchHeight } = getArchedResizedData(door, boundedPointer, resizeAnchor);\r\n const center = new Vector3(door.cx * lx, 0, newCz);\r\n checkCollision(door.id, center, door.lx * lx, newLz);\r\n checkInsideBoundary(door.id, center, door.lx * lx, newLz, true);\r\n setCommonStore((state) => {\r\n const d = state.elements.find((e) => e.id === door.id) as DoorModel;\r\n if (!d) return;\r\n d.lz = newLz / lz;\r\n d.cz = newCz / lz;\r\n d.archHeight = newArchHeight;\r\n d.color = d.id === invalidElementIdRef.current ? INVALID_ELEMENT_COLOR : selectedElement.color;\r\n });\r\n } else {\r\n const { dimensionXZ, positionXZ } = getDiagonalResizedData(e, boundedPointer, resizeAnchor);\r\n const center = new Vector3(positionXZ.x, 0, positionXZ.z);\r\n checkCollision(door.id, center, dimensionXZ.x, dimensionXZ.z);\r\n checkInsideBoundary(door.id, center, dimensionXZ.x, dimensionXZ.z, true);\r\n setCommonStore((state) => {\r\n const d = state.elements.find((e) => e.id === door.id) as DoorModel;\r\n if (!d) return;\r\n d.cx = positionXZ.x / lx;\r\n d.lx = dimensionXZ.x / lx;\r\n d.cz = (boundedPointer.z - lz / 2) / 2 / lz;\r\n d.lz = (boundedPointer.z + lz / 2) / lz;\r\n d.color = d.id === invalidElementIdRef.current ? INVALID_ELEMENT_COLOR : selectedElement.color;\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel: {\r\n const solarPanel = selectedElement as SolarPanelModel;\r\n const [unitX, unitY] = getSolarPanelUnitLength(solarPanel);\r\n // Z direction\r\n if (resizeHandleType === ResizeHandleType.Lower || resizeHandleType === ResizeHandleType.Upper) {\r\n const ny = Math.max(1, Math.round(Math.abs(relativePointer.z - resizeAnchor.z) / unitY));\r\n const length = ny * unitY;\r\n const v = new Vector3(0, 0, relativePointer.z - resizeAnchor.z).normalize().multiplyScalar(length);\r\n const center = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\r\n if (!Util.isElementInsideWall(center, solarPanel.lx - 0.01, length - 0.01, outerWallPoints2D)) {\r\n return;\r\n }\r\n checkCollision(solarPanel.id, center, solarPanel.lx, Math.abs(v.z));\r\n setCommonStore((state) => {\r\n const sp = state.elements.find((e) => e.id === solarPanel.id);\r\n if (!sp) return;\r\n sp.cz = center.z / lz;\r\n sp.ly = Math.abs(v.z);\r\n sp.color = sp.id === invalidElementIdRef.current ? 'red' : '#fff';\r\n });\r\n }\r\n // X direction\r\n else if (resizeHandleType === ResizeHandleType.Left || resizeHandleType === ResizeHandleType.Right) {\r\n const nx = Math.max(1, Math.round(Math.abs(relativePointer.x - resizeAnchor.x) / unitX));\r\n const length = nx * unitX;\r\n const v = new Vector3(relativePointer.x - resizeAnchor.x, 0, 0).normalize().multiplyScalar(length);\r\n const center = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\r\n if (!Util.isElementInsideWall(center, length - 0.01, solarPanel.ly - 0.01, outerWallPoints2D)) {\r\n return;\r\n }\r\n checkCollision(solarPanel.id, center, Math.abs(v.x), solarPanel.ly);\r\n setCommonStore((state) => {\r\n const sp = state.elements.find((e) => e.id === solarPanel.id);\r\n if (!sp) return;\r\n sp.cx = center.x / lx;\r\n sp.lx = Math.abs(v.x);\r\n sp.color = sp.id === invalidElementIdRef.current ? 'red' : '#fff';\r\n });\r\n }\r\n break;\r\n }\r\n case ObjectType.Polygon: {\r\n setCommonStore((state) => {\r\n const p = state.elements.find((e) => e.id === selectedElement.id) as PolygonModel;\r\n if (p?.selectedIndex >= 0) {\r\n p.vertices[p.selectedIndex].x = -pointerOnGrid.x / lx;\r\n p.vertices[p.selectedIndex].y = -pointerOnGrid.z / lz;\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n function handleIntersectionPlanePointerUp() {\r\n if (invalidElementIdRef.current) {\r\n if (elBeingAddedRef.current && elBeingAddedRef.current.status === ElBeingAddedStatus.SettingEndPoint) {\r\n // remove new element directly\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n }\r\n });\r\n elBeingAddedRef.current = null;\r\n } else if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType) {\r\n SharedUtil.undoInvalidOperation();\r\n }\r\n } else {\r\n if (elBeingAddedRef.current) {\r\n if (elBeingAddedRef.current.status === ElBeingAddedStatus.SettingStartPoint) {\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n }\r\n });\r\n elBeingAddedRef.current = null;\r\n } else if (elBeingAddedRef.current.status === ElBeingAddedStatus.SettingEndPoint) {\r\n const elements = useStore.getState().elements;\r\n const newElement = elements[elements.length - 1];\r\n if (newElement.lx * lx < 0.1 || newElement.lz * lz < 0.1) {\r\n setCommonStore((state) => {\r\n state.elements.pop();\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n }\r\n });\r\n } else {\r\n setCommonStore((state) => {\r\n if (state.actionModeLock && elBeingAddedRef.current) {\r\n state.objectTypeToAdd = elBeingAddedRef.current.type;\r\n InnerCommonStoreState.selectNone(state);\r\n }\r\n });\r\n handleUndoableAdd(newElement);\r\n }\r\n elBeingAddedRef.current = null;\r\n }\r\n } else if (useStore.getState().moveHandleType) {\r\n SharedUtil.addUndoableMove();\r\n } else if (useStore.getState().resizeHandleType) {\r\n handleUndoableResize();\r\n }\r\n }\r\n\r\n useRefStore.getState().setEnableOrbitController(true);\r\n setShowIntersectionPlane(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\r\n });\r\n setPrimitiveStore('showWallIntersectionPlaneId', null);\r\n invalidElementIdRef.current = null;\r\n resetBeingAddedChildId();\r\n }\r\n\r\n function addElementByClick(pointer?: Vector3, body?: boolean) {\r\n // add new elements\r\n if (latestFoundation && useStore.getState().objectTypeToAdd) {\r\n let newElement: ElementModel | null = null;\r\n switch (useStore.getState().objectTypeToAdd) {\r\n case ObjectType.PyramidRoof: {\r\n if (!roofId && isValidToAddRoof(false, true)) {\r\n newElement = ElementModelFactory.makePyramidRoof([wallModel.id], latestFoundation);\r\n }\r\n break;\r\n }\r\n case ObjectType.GableRoof: {\r\n if (!roofId && isValidToAddRoof(false, false)) {\r\n newElement = ElementModelFactory.makeGableRoof([wallModel.id], latestFoundation);\r\n }\r\n break;\r\n }\r\n case ObjectType.HipRoof: {\r\n if (!roofId && isValidToAddRoof(false, true)) {\r\n newElement = ElementModelFactory.makeHipRoof([wallModel.id], latestFoundation, lx / 2);\r\n }\r\n break;\r\n }\r\n case ObjectType.GambrelRoof: {\r\n if (!roofId && isValidToAddRoof(false, false)) {\r\n newElement = ElementModelFactory.makeGambrelRoof([wallModel.id], latestFoundation);\r\n }\r\n break;\r\n }\r\n case ObjectType.MansardRoof: {\r\n if (!roofId && isValidToAddRoof(false, true)) {\r\n newElement = ElementModelFactory.makeMansardRoof([wallModel.id], latestFoundation);\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel: {\r\n if (pointer && body) {\r\n const p = getRelativePosOnWall(pointer, wallModel);\r\n const angle = wallModel.relativeAngle - HALF_PI;\r\n const actionState = useStore.getState().actionState;\r\n newElement = ElementModelFactory.makeSolarPanel(\r\n wallModel,\r\n useStore.getState().getPvModule(actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\r\n p.x / lx,\r\n 0,\r\n p.z / lz,\r\n actionState.solarPanelOrientation ?? Orientation.landscape,\r\n actionState.solarPanelPoleHeight ?? 1,\r\n actionState.solarPanelPoleSpacing ?? 3,\r\n 0,\r\n 0,\r\n new Vector3(Math.cos(angle), Math.sin(angle), 0),\r\n [0, 0, 0],\r\n actionState.solarPanelFrameColor,\r\n undefined,\r\n undefined,\r\n ObjectType.Wall,\r\n );\r\n }\r\n break;\r\n }\r\n case ObjectType.Sensor: {\r\n if (pointer && body) {\r\n const p = getRelativePosOnWall(pointer, wallModel);\r\n const angle = wallModel.relativeAngle - HALF_PI;\r\n newElement = ElementModelFactory.makeSensor(\r\n wallModel,\r\n (p.x - 0.05) / lx,\r\n 0,\r\n (p.z - 0.05) / lz,\r\n new Vector3(Math.cos(angle), Math.sin(angle), 0),\r\n [0, 0, 0],\r\n );\r\n }\r\n break;\r\n }\r\n case ObjectType.Light: {\r\n if (pointer && body) {\r\n const p = getRelativePosOnWall(pointer, wallModel);\r\n const angle = wallModel.relativeAngle - HALF_PI;\r\n const actionState = useStore.getState().actionState;\r\n newElement = ElementModelFactory.makeLight(\r\n wallModel,\r\n 2,\r\n actionState.lightDistance,\r\n actionState.lightIntensity,\r\n actionState.lightColor,\r\n (p.x - 0.05) / lx,\r\n 0,\r\n (p.z - 0.05) / lz,\r\n new Vector3(Math.cos(angle), Math.sin(angle), 0),\r\n [0, 0, 0],\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n if (newElement) {\r\n handleUndoableAdd(newElement);\r\n setCommonStore((state) => {\r\n state.elements.push(newElement as ElementModel);\r\n if (newElement && newElement.type === ObjectType.Roof) {\r\n state.addedRoofIdSet.add(newElement.id);\r\n }\r\n if (!state.actionModeLock) {\r\n state.objectTypeToAdd = ObjectType.None;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n function handleContextMenu(e: ThreeEvent, mesh: Mesh | null, canPaste?: boolean) {\r\n if (grabRef.current) return;\r\n\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0 && e.intersections[0].object === mesh) {\r\n state.contextMenuObjectType = ObjectType.Wall;\r\n if (canPaste) {\r\n state.pastePoint.copy(e.intersections[0].point);\r\n }\r\n }\r\n });\r\n e.stopPropagation();\r\n }\r\n\r\n function handleWallSideSurfacePointerDown(e: ThreeEvent) {\r\n if (e.button === 2) return;\r\n const objectTypeToAdd = useStore.getState().objectTypeToAdd;\r\n if (\r\n !isSettingElementStartPoint() &&\r\n !isAddingElement() &&\r\n isFirstIntersectedObject(e) &&\r\n objectTypeToAdd === ObjectType.None\r\n ) {\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n e.selected = true;\r\n } else {\r\n e.selected = false;\r\n }\r\n }\r\n });\r\n e.stopPropagation();\r\n } else if (isAllowedToSelectMe()) {\r\n useStore.getState().selectMe(id, e, ActionType.Select);\r\n }\r\n } else if (RoofUtil.isTypeRoof(objectTypeToAdd)) {\r\n handleWallBodyPointerDown(e);\r\n }\r\n }\r\n\r\n function handleStudPointerDown(e: ThreeEvent) {\r\n if (e.button === 2 || e.intersections.length === 0 || e.intersections[0].object !== e.eventObject) return;\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n e.selected = e.id === parentId;\r\n }\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(parentId);\r\n });\r\n } else {\r\n if (checkIfCanSelectMe(e)) {\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = null;\r\n });\r\n selectMe(id, e, ActionType.Select);\r\n }\r\n addElementByClick();\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n function handleStudContextMenu(e: ThreeEvent) {\r\n if (e.intersections.length > 0 && e.intersections[0].object === e.eventObject) {\r\n setCommonStore((state) => {\r\n state.contextMenuObjectType = ObjectType.Wall;\r\n });\r\n selectMe(id, e, ActionType.ContextMenu);\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n function renderStuds() {\r\n let [wallCenterPos, wallCenterHeight] = centerRoofHeight ?? [0, (realWallLeftHeight + realWallRightHeight) / 2];\r\n wallCenterPos = wallCenterPos * lx;\r\n\r\n const leftX = wallCenterPos + hx;\r\n const leftLength = Math.hypot(leftX, wallCenterHeight - realWallLeftHeight);\r\n const leftRotationY = -Math.atan2(wallCenterHeight - realWallLeftHeight, leftX);\r\n\r\n const rightX = hx - wallCenterPos;\r\n const rightLength = Math.hypot(rightX, realWallRightHeight - wallCenterHeight);\r\n const rightRotationY = -Math.atan2(realWallRightHeight - wallCenterHeight, rightX);\r\n\r\n return (\r\n \r\n {structureUnitArray.map(([pos, y], idx) => {\r\n let height;\r\n if (pos < wallCenterPos) {\r\n height =\r\n ((pos + hx) * (wallCenterHeight - realWallLeftHeight)) / (wallCenterPos + hx) + realWallLeftHeight - y;\r\n } else {\r\n height =\r\n ((pos - hx) * (wallCenterHeight - realWallRightHeight)) / (wallCenterPos - hx) + realWallRightHeight - y;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function renderPillars() {\r\n let [wallCenterPos, wallCenterHeight] = centerRoofHeight ?? [0, (realWallLeftHeight + realWallRightHeight) / 2];\r\n wallCenterPos = wallCenterPos * lx;\r\n\r\n const leftX = wallCenterPos + hx;\r\n const leftLength = Math.hypot(leftX, wallCenterHeight - realWallLeftHeight);\r\n const leftRotationY = -Math.atan2(wallCenterHeight - realWallLeftHeight, leftX);\r\n\r\n const rightX = hx - wallCenterPos;\r\n const rightLength = Math.hypot(rightX, realWallRightHeight - wallCenterHeight);\r\n const rightRotationY = -Math.atan2(realWallRightHeight - wallCenterHeight, rightX);\r\n\r\n const topBarThickness = ly;\r\n\r\n return (\r\n \r\n {structureUnitArray.map(([pos, y], idx) => {\r\n let height;\r\n if (pos < wallCenterPos) {\r\n height =\r\n ((pos + hx) * (wallCenterHeight - realWallLeftHeight)) / (wallCenterPos + hx) + realWallLeftHeight - y;\r\n } else {\r\n height =\r\n ((pos - hx) * (wallCenterHeight - realWallRightHeight)) / (wallCenterPos - hx) + realWallRightHeight - y;\r\n }\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {(opacity > 0 || wallStructure === WallStructure.Default) && (\r\n <>\r\n {/* simulation mesh */}\r\n \r\n \r\n \r\n \r\n {/* wall outside surface */}\r\n {\r\n handleContextMenu(e, outsideWallRef.current, true);\r\n }}\r\n onPointerMove={handleWallBodyPointMove}\r\n onPointerDown={handleWallBodyPointerDown}\r\n onPointerUp={handleWallBodyPointerUp}\r\n onPointerOut={handleWallBodyPointerOut}\r\n >\r\n \r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {/* inside wall */}\r\n {\r\n handleContextMenu(e, insideWallRef.current);\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {/* top surface */}\r\n {(!roofId || isTopPartial) && !showParapet && (\r\n {\r\n handleContextMenu(e, topSurfaceRef.current);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {/* side surfaces */}\r\n {leftOffset === 0 && (\r\n \r\n )}\r\n {rightOffset === 0 && (\r\n \r\n )}\r\n\r\n {/* intersection planes for children */}\r\n {(showIntersectionPlane || showWallIntersectionPlaneId === id) &&\r\n useStore.getState().selectedElement?.parentId === id && (\r\n <>\r\n \r\n \r\n \r\n {/* block plane */}\r\n {\r\n /* Do Not Delete! Capture event for wall pointer move*/\r\n }}\r\n visible={false}\r\n />\r\n \r\n )}\r\n\r\n {elementsOnWall.map((e) => {\r\n switch (e.type) {\r\n case ObjectType.Window: {\r\n return (\r\n \r\n );\r\n }\r\n case ObjectType.Door: {\r\n if (fill !== WallFill.Full) return null;\r\n return (\r\n \r\n );\r\n }\r\n case ObjectType.SolarPanel:\r\n let r = 0;\r\n if (latestFoundation && wallModel) {\r\n r = latestFoundation.rotation[2] + wallModel.relativeAngle;\r\n }\r\n return (\r\n \r\n \r\n \r\n );\r\n default:\r\n return null;\r\n }\r\n })}\r\n \r\n )}\r\n\r\n {/* polygon */}\r\n {elementsOnWall.map((e) => {\r\n if (e.type === ObjectType.Polygon && fill !== WallFill.Empty) {\r\n return ;\r\n }\r\n return null;\r\n })}\r\n\r\n {wallStructure === WallStructure.Stud && renderStuds()}\r\n {wallStructure === WallStructure.Pillar && renderPillars()}\r\n\r\n {/* parapet */}\r\n {showParapet && (\r\n \r\n )}\r\n\r\n {/* wireFrame */}\r\n {(wallStructure === WallStructure.Default || (locked && selected)) && (\r\n \r\n )}\r\n\r\n {/* ruler */}\r\n {selected && }\r\n\r\n {/* grid */}\r\n {(showIntersectionPlane || showWallIntersectionPlaneId === id) &&\r\n useStore.getState().selectedElement?.parentId === id && (\r\n \r\n \r\n \r\n )}\r\n\r\n {/* heat flux */}\r\n {}\r\n \r\n );\r\n};\r\n\r\nexport function getSolarPanelUnitLength(solarPanel: SolarPanelModel) {\r\n const pvModel = useStore.getState().getPvModule(solarPanel.pvModelName);\r\n if (solarPanel.orientation === Orientation.landscape) {\r\n return [pvModel.length, pvModel.width];\r\n } else {\r\n return [pvModel.width, pvModel.length];\r\n }\r\n}\r\n\r\nconst areEqual = (prev: WallProps, curr: WallProps) => prev.wallModel === curr.wallModel;\r\n\r\nexport default React.memo(Wall, areEqual);\r\n","import { Cone, Line } from '@react-three/drei';\r\nimport React, { useMemo, useRef } from 'react';\r\nimport { Util } from 'src/Util';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_DENSITY_FACTOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n HALF_PI,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n} from 'src/constants';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { WallFill, WallModel } from 'src/models/WallModel';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useDataStore } from 'src/stores/commonData';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType } from 'src/types';\r\nimport { Euler, Vector3 } from 'three';\r\n\r\ninterface HeatFluxProps {\r\n wallModel: WallModel;\r\n notBuilding?: boolean;\r\n}\r\n\r\nconst WallHeatFlux = ({ wallModel, notBuilding }: HeatFluxProps) => {\r\n const { id, lx, lz } = wallModel;\r\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\r\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\r\n const heatFluxColor = useStore(Selector.viewState.heatFluxColor);\r\n const heatFluxWidth = useStore(Selector.viewState.heatFluxWidth);\r\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n\r\n const heatFluxArrowHead = useRef(0);\r\n const heatFluxArrowEuler = useRef();\r\n\r\n const heatFluxes: Vector3[][] | undefined = useMemo(() => {\r\n if (!showHeatFluxes) return undefined;\r\n if (notBuilding) return undefined;\r\n const heat = hourlyHeatExchangeArrayMap.get(id);\r\n if (!heat) return undefined;\r\n const sum = heat.reduce((a, b) => a + b, 0);\r\n const partial = wallModel.fill === WallFill.Partial && !Util.isPartialWallFull(wallModel);\r\n const frameVertices = Util.getWallVertices(wallModel, 0);\r\n const partialWallVertices = partial ? Util.getPartialWallVertices(wallModel, 0) : frameVertices;\r\n const frameArea = Util.getPolygonArea(frameVertices);\r\n let area = partial ? Util.getPolygonArea(partialWallVertices) : frameArea;\r\n if (area === 0) return undefined;\r\n const windows = getChildrenOfType(ObjectType.Window, id);\r\n const doors = getChildrenOfType(ObjectType.Door, id);\r\n if (windows && windows.length > 0) {\r\n for (const w of windows) {\r\n // window dimension is relative to the wall\r\n area -= Util.getWindowArea(w as WindowModel, wallModel);\r\n }\r\n }\r\n if (doors && doors.length > 0) {\r\n for (const d of doors) {\r\n // door dimension is relative to the wall\r\n area -= d.lx * d.lz * wallModel.lx * wallModel.lz;\r\n }\r\n }\r\n const world = useStore.getState().world;\r\n const cellSize = DEFAULT_HEAT_FLUX_DENSITY_FACTOR * (world.solarRadiationHeatmapGridCellSize ?? 0.5);\r\n const lz = Util.getHighestPointOfWall(wallModel); // height\r\n const nx = Math.max(2, Math.round(lx / cellSize));\r\n const nz = Math.max(2, Math.round(lz / cellSize));\r\n const dx = lx / nx;\r\n const dz = lz / nz;\r\n const halfDif = (lz - wallModel.lz) / 2;\r\n const intensity = (sum / area) * (heatFluxScaleFactor ?? DEFAULT_HEAT_FLUX_SCALE_FACTOR);\r\n heatFluxArrowHead.current = intensity < 0 ? 1 : 0;\r\n heatFluxArrowEuler.current = Util.getEuler(\r\n UNIT_VECTOR_POS_Z,\r\n UNIT_VECTOR_POS_Y,\r\n 'YXZ',\r\n Math.sign(intensity) * HALF_PI,\r\n );\r\n const vectors: Vector3[][] = [];\r\n const polygon = partial ? Util.getPartialWallVertices(wallModel, 0) : Util.getWallVertices(wallModel, 0);\r\n let isWall;\r\n for (let kx = 0; kx < nx; kx++) {\r\n for (let kz = 0; kz < nz; kz++) {\r\n const v: Vector3[] = [];\r\n const rx = (kx - nx / 2 + 0.5) * dx;\r\n const rz = (kz - nz / 2 + 0.5) * dz + halfDif;\r\n if (Util.isPointInside(rx, rz, polygon)) {\r\n isWall = true;\r\n if (windows && windows.length > 0) {\r\n for (const w of windows) {\r\n if (w.type !== ObjectType.Window) continue;\r\n const cx = w.cx * wallModel.lx;\r\n const cz = w.cz * wallModel.lz;\r\n const hx = (w.lx * wallModel.lx) / 2;\r\n const hz = (w.lz * wallModel.lz) / 2;\r\n const win = w as WindowModel;\r\n if (win.windowType === WindowType.Arched) {\r\n // TODO: Deal with arched window\r\n if (rx >= cx - hx && rx < cx + hx && rz >= cz - hz && rz < cz + hz) {\r\n isWall = false;\r\n break;\r\n }\r\n } else {\r\n if (rx >= cx - hx && rx < cx + hx && rz >= cz - hz && rz < cz + hz) {\r\n isWall = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (doors && doors.length > 0) {\r\n for (const d of doors) {\r\n const cx = d.cx * lx;\r\n const cz = d.cz * lz;\r\n const hx = (d.lx * lx) / 2;\r\n const hz = (d.lz * lz) / 2;\r\n // TODO: Deal with arched door\r\n if (rx >= cx - hx && rx < cx + hx && rz >= cz - hz && rz < cz + hz) {\r\n isWall = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (isWall) {\r\n if (intensity < 0) {\r\n v.push(new Vector3(rx, 0, rz));\r\n v.push(new Vector3(rx, intensity, rz));\r\n } else {\r\n v.push(new Vector3(rx, 0, rz));\r\n v.push(new Vector3(rx, -intensity, rz));\r\n }\r\n vectors.push(v);\r\n }\r\n }\r\n }\r\n }\r\n return vectors;\r\n }, [lx, lz, showHeatFluxes, heatFluxScaleFactor, notBuilding]);\r\n\r\n if (!heatFluxes) return null;\r\n\r\n return (\r\n <>\r\n {heatFluxes.map((v, index) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(WallHeatFlux);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Euler, Vector3 } from 'three';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { Util } from 'src/Util';\r\nimport { RoofSegmentProps } from './roofRenderer';\r\nimport { HALF_PI_Z_EULER, LOCKED_ELEMENT_SELECTION_COLOR, UNIT_VECTOR_POS_Z } from 'src/constants';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { useStore } from 'src/stores/common';\r\nimport { ObjectType } from 'src/types';\r\nimport { RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { WALL_PADDING } from '../wall/wall';\r\nimport { WindowModel, WindowType } from '../../models/WindowModel';\r\nimport { FoundationModel } from '../../models/FoundationModel';\r\nimport { DEFAULT_POLYGONTOP } from '../window/window';\r\nimport { ComposedWall } from './hooks';\r\nimport { useDataStore } from 'src/stores/commonData';\r\n\r\nexport class RoofUtil {\r\n // roof related\r\n\r\n static getWireframetStyle(lineColor: string, lineWidth: number, selected: boolean, locked?: boolean) {\r\n const _lineColor = selected && locked ? LOCKED_ELEMENT_SELECTION_COLOR : lineColor;\r\n const _lineWidth = selected && locked ? 1 : lineWidth;\r\n return [_lineColor, _lineWidth] as [string, number];\r\n }\r\n\r\n static getComposedWallNormal(wall: ComposedWall) {\r\n return new Vector3().subVectors(wall.leftPoint, wall.rightPoint).applyEuler(HALF_PI_Z_EULER).normalize();\r\n }\r\n\r\n // to be deleted\r\n static getWallNormal(wall: WallModel) {\r\n return new Vector3()\r\n .subVectors(\r\n new Vector3(wall.leftPoint[0], wall.leftPoint[1]),\r\n new Vector3(wall.rightPoint[0], wall.rightPoint[1]),\r\n )\r\n .applyEuler(HALF_PI_Z_EULER)\r\n .normalize();\r\n }\r\n\r\n static isTypeRoof(type: ObjectType) {\r\n return (\r\n type === ObjectType.Roof ||\r\n type === ObjectType.PyramidRoof ||\r\n type === ObjectType.HipRoof ||\r\n type === ObjectType.GableRoof ||\r\n type === ObjectType.GambrelRoof ||\r\n type === ObjectType.MansardRoof\r\n );\r\n }\r\n\r\n static getIntersectionPoint(v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3) {\r\n if (Math.abs(v1.x - v2.x) < 0.001 && Math.abs(v3.x - v4.x) < 0.001) {\r\n return v2.clone();\r\n }\r\n const k1 = (v2.y - v1.y) / (v2.x - v1.x);\r\n const k2 = (v4.y - v3.y) / (v4.x - v3.x);\r\n if (Math.abs(k1 - k2) < 0.001) {\r\n return v2.clone();\r\n }\r\n const x = [v1.x, v2.x, v3.x, v4.x];\r\n const y = [v1.y, v2.y, v3.y, v4.y];\r\n const x0 =\r\n ((x[2] - x[3]) * (x[1] * y[0] - x[0] * y[1]) - (x[0] - x[1]) * (x[3] * y[2] - x[2] * y[3])) /\r\n ((x[2] - x[3]) * (y[0] - y[1]) - (x[0] - x[1]) * (y[2] - y[3]));\r\n const y0 =\r\n ((y[2] - y[3]) * (y[1] * x[0] - y[0] * x[1]) - (y[0] - y[1]) * (y[3] * x[2] - y[2] * x[3])) /\r\n ((y[2] - y[3]) * (x[0] - x[1]) - (y[0] - y[1]) * (x[2] - x[3]));\r\n if (!Number.isFinite(x0) || !Number.isFinite(y0)) {\r\n return v2.clone();\r\n }\r\n return new Vector3(x0, y0);\r\n }\r\n\r\n /** distance from point p3 to line formed by p1 and p2 in 2D */\r\n static getDistance(p1: Vector3, p2: Vector3, p3: Vector3) {\r\n const A = p2.y - p1.y;\r\n if (A === 0) {\r\n return Math.abs(p1.y - p3.y);\r\n }\r\n const B = p1.x - p2.x;\r\n if (B === 0) {\r\n return Math.abs(p1.x - p3.x);\r\n }\r\n const C = p2.x * p1.y - p1.x * p2.y;\r\n const res = Math.abs((A * p3.x + B * p3.y + C) / Math.sqrt(A * A + B * B));\r\n return res === 0 ? Infinity : res;\r\n }\r\n\r\n static getWallPoints2D(\r\n wall: WallModel,\r\n centerRoofHeight?: number[],\r\n centerLeftRoofHeight?: number[],\r\n centerRightRoofHeight?: number[],\r\n ) {\r\n const { lx, lz, rightRoofHeight, leftRoofHeight } = wall;\r\n const centerLeft = centerLeftRoofHeight ?? wall.centerLeftRoofHeight;\r\n const center = centerRoofHeight ?? wall.centerRoofHeight;\r\n const centerRight = centerRightRoofHeight ?? wall.centerRightRoofHeight;\r\n\r\n const points: Point2[] = [];\r\n const x = lx / 2;\r\n const y = lz / 2;\r\n points.push({ x: -x, y: -y });\r\n points.push({ x: x, y: -y });\r\n rightRoofHeight ? points.push({ x: x, y: rightRoofHeight - y }) : points.push({ x: x, y: y });\r\n if (centerRight) {\r\n points.push({ x: centerRight[0] * lx, y: centerRight[1] - y });\r\n }\r\n if (center) {\r\n points.push({ x: center[0] * lx, y: center[1] - y });\r\n }\r\n if (centerLeft) {\r\n points.push({ x: centerLeft[0] * lx, y: centerLeft[1] - y });\r\n }\r\n leftRoofHeight ? points.push({ x: -x, y: leftRoofHeight - y }) : points.push({ x: -x, y: y });\r\n return points;\r\n }\r\n\r\n static isPointInside(wallPoints2D: Point2[], x: number, y: number) {\r\n let inside = false;\r\n for (let i = 0, j = wallPoints2D.length - 1; i < wallPoints2D.length; j = i++) {\r\n const xi = wallPoints2D[i].x;\r\n const yi = wallPoints2D[i].y;\r\n const xj = wallPoints2D[j].x;\r\n const yj = wallPoints2D[j].y;\r\n if (yi > y != yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {\r\n inside = !inside;\r\n }\r\n }\r\n return inside;\r\n }\r\n\r\n static isRoofValid(\r\n roofId: string,\r\n currWallId?: string,\r\n counterWallId?: string,\r\n centerRoofHeight?: number[],\r\n centerLeftRoofHeight?: number[],\r\n centerRightRoofHeight?: number[],\r\n ) {\r\n for (const element of useStore.getState().elements) {\r\n if (element.type === ObjectType.Wall && (element as WallModel).roofId === roofId) {\r\n const wall = element as WallModel;\r\n let points: Point2[] = [];\r\n if (wall.id === currWallId) {\r\n points = RoofUtil.getWallPoints2D(wall, centerRoofHeight, centerLeftRoofHeight, centerRightRoofHeight);\r\n } else if (wall.id === counterWallId) {\r\n let ch: number[] | undefined = undefined;\r\n let cl: number[] | undefined = undefined;\r\n let cr: number[] | undefined = undefined;\r\n if (centerRoofHeight) {\r\n ch = [-centerRoofHeight[0], centerRoofHeight[1]];\r\n }\r\n if (centerRightRoofHeight) {\r\n cl = [-centerRightRoofHeight[0], centerRightRoofHeight[1]];\r\n }\r\n if (centerLeftRoofHeight) {\r\n cr = [-centerLeftRoofHeight[0], centerLeftRoofHeight[1]];\r\n }\r\n points = RoofUtil.getWallPoints2D(wall, ch, cl, cr);\r\n }\r\n if (wall.id === currWallId || wall.id === counterWallId) {\r\n for (const e of useStore.getState().elements) {\r\n if (e.parentId === wall.id) {\r\n let hx = e.lx / 2;\r\n let hz = e.lz / 2;\r\n let padding = WALL_PADDING;\r\n if (e.type === ObjectType.SolarPanel) {\r\n hx = (hx - 0.01) / wall.lx;\r\n hz = (e.ly / 2 - 0.01) / wall.lz;\r\n padding = 0;\r\n }\r\n const minX = e.cx * wall.lx - hx * wall.lx;\r\n const maxX = e.cx * wall.lx + hx * wall.lx;\r\n const maxZ = e.cz * wall.lz + hz * wall.lz + padding;\r\n if (!RoofUtil.isPointInside(points, minX, maxZ) || !RoofUtil.isPointInside(points, maxX, maxZ)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // for solar panels and skylight windows on a roof segment\r\n static getSegmentIdx(roofSegments: RoofSegmentProps[], posRelToCentroid: Vector3): number {\r\n for (let i = 0; i < roofSegments.length; i++) {\r\n const points = roofSegments[i].points.slice(0, 4);\r\n if (Util.isPointInside(posRelToCentroid.x, posRelToCentroid.y, points.map(Util.mapVector3ToPoint2))) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n static onSegment(vertices: Vector3[], cx: number, cy: number): boolean {\r\n return Util.isPointInside(cx, cy, vertices.map(Util.mapVector3ToPoint2));\r\n }\r\n\r\n // less compute but easier to appear bugs\r\n static getSegmentIdxFromPointerEvent(e: ThreeEvent) {\r\n for (const intersection of e.intersections) {\r\n if (intersection.object.name.includes('Roof segment')) {\r\n return parseInt(intersection.object.name.slice(-1));\r\n }\r\n }\r\n return Number.NaN;\r\n }\r\n\r\n static getSegmentVertices(roofSegments: RoofSegmentProps[], segmentIdx: number, pointer: Vector3) {\r\n // return orders matter: counterclockwise\r\n const [wallLeft, wallRight, ridgeRight, ridgeLeft] = roofSegments[segmentIdx].points;\r\n if (roofSegments[segmentIdx].points.length === 6) {\r\n return [wallRight, ridgeRight, wallLeft];\r\n }\r\n const leftDis = Util.distanceFromPointToLine2D(ridgeLeft, wallLeft, wallRight);\r\n const rightDis = Util.distanceFromPointToLine2D(ridgeRight, wallLeft, wallRight);\r\n if (Math.abs(leftDis - rightDis) < 0.01) {\r\n if (wallLeft.z > wallRight.z) {\r\n const upperHalf = [ridgeLeft, ridgeRight, wallLeft];\r\n if (Util.isPointInside(pointer.x, pointer.y, upperHalf.map(Util.mapVector3ToPoint2))) {\r\n return [wallLeft, ridgeRight, ridgeLeft];\r\n } else {\r\n return [wallLeft, wallRight, ridgeRight];\r\n }\r\n } else {\r\n const upperHalf = [ridgeLeft, ridgeRight, wallRight];\r\n if (Util.isPointInside(pointer.x, pointer.y, upperHalf.map(Util.mapVector3ToPoint2))) {\r\n return [wallRight, ridgeRight, ridgeLeft];\r\n } else {\r\n return [wallRight, ridgeLeft, wallLeft];\r\n }\r\n }\r\n } else if (leftDis <= rightDis) {\r\n const upperHalf = [ridgeLeft, ridgeRight, wallRight];\r\n if (Util.isPointInside(pointer.x, pointer.y, upperHalf.map(Util.mapVector3ToPoint2))) {\r\n return [wallRight, ridgeRight, ridgeLeft];\r\n } else {\r\n return [wallRight, ridgeLeft, wallLeft];\r\n }\r\n } else {\r\n const upperHalf = [ridgeLeft, ridgeRight, wallLeft];\r\n if (Util.isPointInside(pointer.x, pointer.y, upperHalf.map(Util.mapVector3ToPoint2))) {\r\n return [wallLeft, ridgeRight, ridgeLeft];\r\n } else {\r\n return [wallLeft, wallRight, ridgeRight];\r\n }\r\n }\r\n }\r\n\r\n static getSegmentNormal(vertices: Vector3[]) {\r\n // order matters for cross product, counterclockwise, v1 is shared vertex\r\n const [v1, v2, v3] = vertices;\r\n return new Vector3().crossVectors(new Vector3().subVectors(v1, v2), new Vector3().subVectors(v1, v3)).normalize();\r\n }\r\n\r\n static getRotationFromNormal(normal: Vector3) {\r\n return Util.isSame(normal.normalize(), UNIT_VECTOR_POS_Z)\r\n ? [0, 0, 0]\r\n : [\r\n Math.PI / 2 - Math.atan2(normal.z, Math.hypot(normal.x, normal.y)),\r\n 0,\r\n Math.atan2(normal.y, normal.x) + Math.PI / 2,\r\n ];\r\n }\r\n\r\n static getRooftopElementZ(vertices: Vector3[], pos: Vector3, roofHeight: number) {\r\n const [v1, v2, v3] = vertices;\r\n const A = (v2.y - v1.y) * (v3.z - v1.z) - (v2.z - v1.z) * (v3.y - v1.y);\r\n const B = (v2.z - v1.z) * (v3.x - v1.x) - (v2.x - v1.x) * (v3.z - v1.z);\r\n const C = (v2.x - v1.x) * (v3.y - v1.y) - (v2.y - v1.y) * (v3.x - v1.x);\r\n const D = -(A * v1.x + B * v1.y + C * v1.z);\r\n return -(D + A * pos.x + B * pos.y) / C + roofHeight;\r\n }\r\n\r\n // return triangulated vertices\r\n static computeState(roofSegments: RoofSegmentProps[], posRelToCentroid: Vector3, isFlatGambrel?: boolean) {\r\n const segmentIdx = RoofUtil.getSegmentIdx(roofSegments, posRelToCentroid);\r\n if (isFlatGambrel) {\r\n return { segmentIdx: -1, segmentVertices: null, normal: new Vector3(0, 0, 1), rotation: [0, 0, 0] };\r\n }\r\n if (segmentIdx !== -1) {\r\n const segmentVertices = RoofUtil.getSegmentVertices(roofSegments, segmentIdx, posRelToCentroid);\r\n const normal = RoofUtil.getSegmentNormal(segmentVertices);\r\n const rotation = RoofUtil.getRotationFromNormal(normal);\r\n return { segmentIdx, segmentVertices, normal, rotation };\r\n } else {\r\n // mansard rooftop surface\r\n return { segmentIdx: -1, segmentVertices: null, normal: new Vector3(0, 0, 1), rotation: [0, 0, 0] };\r\n }\r\n }\r\n\r\n // todo: need to add roofId to each wall when adding roof\r\n static getOrderedWallArrayOfRoof(roofId: string) {\r\n const wallMap = new Map();\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Wall && (e as WallModel).roofId === roofId) {\r\n wallMap.set(e.id, e as WallModel);\r\n }\r\n }\r\n\r\n if (wallMap.size === 0) {\r\n return { orderedWallArray: [] as WallModel[], isLoop: false };\r\n }\r\n\r\n const wall0 = wallMap.entries().next().value[1] as WallModel;\r\n const orderedWallArray = [wall0];\r\n\r\n let nextId = wall0.rightJoints[0];\r\n while (nextId && nextId !== wall0.id) {\r\n const nextWall = wallMap.get(nextId);\r\n if (nextWall) {\r\n orderedWallArray.push(nextWall);\r\n nextId = nextWall.rightJoints[0];\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (nextId === wall0.id) {\r\n return { orderedWallArray, isLoop: true };\r\n }\r\n\r\n nextId = wall0.leftJoints[0];\r\n while (nextId) {\r\n const nextWall = wallMap.get(nextId);\r\n if (nextWall) {\r\n orderedWallArray.unshift(nextWall);\r\n nextId = nextWall.leftJoints[0];\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return { orderedWallArray, isLoop: false };\r\n }\r\n\r\n static getRoofBoundaryVertices(roof: RoofModel) {\r\n const segments = useDataStore.getState().roofSegmentVerticesMap.get(roof.id);\r\n if (!segments) throw new Error();\r\n // flat roof\r\n if (roof.roofType !== RoofType.Gable && roof.rise < 0.01) {\r\n return segments[0].map((v) => ({ x: v.x, y: v.y } as Point2));\r\n }\r\n switch (roof.roofType) {\r\n case RoofType.Gable: {\r\n if (segments.length === 1) {\r\n return segments[0].map((p) => ({ x: p.x, y: p.y }));\r\n }\r\n return segments.reduce((acc, points) => {\r\n acc.push({ x: points[0].x, y: points[0].y }, { x: points[1].x, y: points[1].y });\r\n return acc;\r\n }, [] as Point2[]);\r\n }\r\n case RoofType.Gambrel: {\r\n return segments.reduce((acc, points, idx) => {\r\n if (idx === 0 || idx === 3) {\r\n acc.push({ x: points[0].x, y: points[0].y }, { x: points[1].x, y: points[1].y });\r\n }\r\n return acc;\r\n }, [] as Point2[]);\r\n }\r\n case RoofType.Mansard: {\r\n return segments.reduce((acc, points, idx) => {\r\n if (idx !== segments.length - 1) {\r\n acc.push({ x: points[0].x, y: points[0].y });\r\n }\r\n return acc;\r\n }, [] as Point2[]);\r\n }\r\n default: {\r\n return segments.reduce((acc, points, idx) => {\r\n acc.push({ x: points[0].x, y: points[0].y });\r\n return acc;\r\n }, [] as Point2[]);\r\n }\r\n }\r\n }\r\n\r\n static getAbsoluteWindowVerticesOnRoof(window: WindowModel, foundation: FoundationModel): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(window.cx, window.cy, window.cz);\r\n const foundationCenter = new Vector3(foundation.cx, foundation.cy, foundation.lz);\r\n if (window.windowType === WindowType.Arched) {\r\n const ah = Math.min(window.archHeight, window.lx / 2, window.lz);\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex =\r\n i * j > 0\r\n ? new Vector3((window.lx / 2) * i, (window.lz / 2 - ah) * j * i, 0)\r\n : new Vector3((window.lx / 2) * i, (window.lz / 2) * j * i, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n }\r\n }\r\n // approximate the arc with a triangle (arch height is included in window.lz)\r\n const vertex = new Vector3(0, window.lz / 2, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n } else {\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3((window.lx / 2) * i, (window.lz / 2) * j * i, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n }\r\n }\r\n if (window.windowType === WindowType.Polygonal && window.polygonTop) {\r\n const vertex = new Vector3(window.lx * window.polygonTop[0], window.lz / 2 + window.polygonTop[1], 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n static getRelativeWindowVerticesOnRoof(window: WindowModel): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(window.cx, window.cy, window.cz);\r\n if (window.windowType === WindowType.Arched) {\r\n const ah = Math.min(window.archHeight, window.lx / 2, window.lz);\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex =\r\n i * j > 0\r\n ? new Vector3((window.lx / 2) * i, (window.lz / 2 - ah) * j * i, 0)\r\n : new Vector3((window.lx / 2) * i, (window.lz / 2) * j * i, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertices.push(vertex);\r\n }\r\n }\r\n // approximate the arc with a triangle (arch height is included in window.lz)\r\n const vertex = new Vector3(0, window.lz / 2, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertices.push(vertex);\r\n } else {\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3((window.lx / 2) * i, (window.lz / 2) * j * i, 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertices.push(vertex);\r\n }\r\n }\r\n if (window.windowType === WindowType.Polygonal && window.polygonTop) {\r\n const vertex = new Vector3(window.lx * window.polygonTop[0], window.lz / 2 + window.polygonTop[1], 0);\r\n vertex.applyEuler(new Euler(window.rotation[0], window.rotation[1], window.rotation[2], 'ZXY')).add(center);\r\n vertices.push(vertex);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n static getAbsoluteSolarPanelVerticesOnRoof(sp: SolarPanelModel, foundation: FoundationModel): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(sp.cx * foundation.lx, sp.cy * foundation.ly, sp.cz);\r\n const foundationCenter = new Vector3(foundation.cx, foundation.cy, foundation.lz);\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3((sp.lx / 2) * i, (sp.ly / 2) * j * i, 0);\r\n if (sp.rotation[0] === 0) {\r\n // has pole\r\n vertex.applyEuler(new Euler(sp.tiltAngle, 0, sp.relativeAzimuth, 'ZXY')).add(center);\r\n } else {\r\n vertex.applyEuler(new Euler(sp.rotation[0], sp.rotation[1], sp.rotation[2], 'ZXY')).add(center);\r\n }\r\n vertex.applyEuler(new Euler(0, 0, foundation.rotation[2], 'ZXY')).add(foundationCenter);\r\n vertices.push(vertex);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n static getSolarPanelVerticesOnRoof(sp: SolarPanelModel, foundation: ElementModel): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(sp.cx * foundation.lx, sp.cy * foundation.ly, sp.cz + foundation.lz);\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3((sp.lx / 2) * i, (sp.ly / 2) * j * i, 0);\r\n if (sp.rotation[0] === 0) {\r\n // has pole\r\n vertex.applyEuler(new Euler(sp.tiltAngle, 0, sp.relativeAzimuth, 'ZXY')).add(center);\r\n } else {\r\n vertex.applyEuler(new Euler(sp.rotation[0], sp.rotation[1], sp.rotation[2], 'ZXY')).add(center);\r\n }\r\n vertices.push(vertex);\r\n }\r\n }\r\n return vertices;\r\n }\r\n\r\n static getWindowVerticesOnRoof(window: WindowModel, margin = 0): Vector3[] {\r\n const vertices: Vector3[] = [];\r\n const center = new Vector3(window.cx, window.cy, window.cz);\r\n const [hx, hy] = [window.lx / 2 + margin, window.lz / 2 + margin];\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n const vertex = new Vector3(i * hx, i * j * hy);\r\n vertex.applyEuler(new Euler().fromArray([...window.rotation, 'ZXY'])).add(center);\r\n vertices.push(vertex);\r\n }\r\n }\r\n if (window.windowType === WindowType.Polygonal) {\r\n const [tx, th] = window.polygonTop ?? DEFAULT_POLYGONTOP;\r\n const vertex = new Vector3(tx * window.lx, window.lz + th).add(center);\r\n vertices.push(vertex);\r\n }\r\n return vertices;\r\n }\r\n\r\n // state check\r\n static rooftopElementBoundaryCheck(elementVertices: Vector3[], boundaryVertices: Point2[]): boolean {\r\n for (const vertex of elementVertices) {\r\n if (!Util.isPointInside(vertex.x, vertex.y, boundaryVertices)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static rooftopWindowCollisionCheck(currId: string, currVertices: Vector3[], roofId: string) {\r\n const targetElementsVertices: Vector3[][] = [];\r\n for (const el of useStore.getState().elements) {\r\n if (el.parentId === roofId && el.id !== currId) {\r\n const vertices = RoofUtil.getWindowVerticesOnRoof(el as WindowModel);\r\n targetElementsVertices.push(vertices);\r\n }\r\n }\r\n\r\n for (const targetVertices of targetElementsVertices) {\r\n // check if current element vertices inside other(target) element\r\n for (const currentVertex of currVertices) {\r\n if (Util.isPointInside(currentVertex.x, currentVertex.y, targetVertices)) {\r\n return false;\r\n }\r\n }\r\n // check if other element vertices inside current element\r\n for (const targetVertex of targetVertices) {\r\n if (Util.isPointInside(targetVertex.x, targetVertex.y, currVertices)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static rooftopSPCollisionCheck(sp: SolarPanelModel, foundation: ElementModel, spVertices: Vector3[]): boolean {\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === sp.type && elem.parentId === sp.parentId && elem.id !== sp.id) {\r\n const sp2Vertices = RoofUtil.getSolarPanelVerticesOnRoof(elem as SolarPanelModel, foundation);\r\n for (const vertex of spVertices) {\r\n if (Util.isPointInside(vertex.x, vertex.y, sp2Vertices)) {\r\n return false;\r\n }\r\n }\r\n for (const vertex of sp2Vertices) {\r\n if (Util.isPointInside(vertex.x, vertex.y, spVertices)) {\r\n return false;\r\n }\r\n }\r\n const v1 = spVertices.map(Util.mapVector3ToPoint2);\r\n const v2 = sp2Vertices.map(Util.mapVector3ToPoint2);\r\n v1.push(v1[0]);\r\n v2.push(v2[0]);\r\n for (let i1 = 0; i1 < v1.length - 1; i1++) {\r\n const from1 = v1[i1];\r\n const to1 = v1[i1 + 1];\r\n for (let i2 = 0; i2 < v2.length - 1; i2++) {\r\n const from2 = v2[i2];\r\n const to2 = v2[i2 + 1];\r\n if (Util.lineIntersection(from1, to1, from2, to2)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static getComposedWallHeight(arr: ComposedWall[], i: number) {\r\n const w = arr[i];\r\n let lh;\r\n let rh;\r\n if (i === 0) {\r\n lh = Math.max(w.lz, arr[arr.length - 1].lz);\r\n rh = Math.max(w.lz, arr[i + 1].lz);\r\n } else if (i === arr.length - 1) {\r\n lh = Math.max(w.lz, arr[i - 1].lz);\r\n rh = Math.max(w.lz, arr[0].lz);\r\n } else {\r\n lh = Math.max(w.lz, arr[i - 1].lz);\r\n rh = Math.max(w.lz, arr[i + 1].lz);\r\n }\r\n return { lh, rh };\r\n }\r\n\r\n static getHighestComposedWallHeight(composedWallArray: ComposedWall[] | null, ignoreSide?: boolean) {\r\n if (composedWallArray === null) return 0;\r\n\r\n let maxWallHeight = 0;\r\n if (ignoreSide && composedWallArray.length === 4) {\r\n return Math.max(composedWallArray[0].lz, composedWallArray[2].lz);\r\n }\r\n for (let i = 0; i < composedWallArray.length; i++) {\r\n const { lh, rh } = RoofUtil.getComposedWallHeight(composedWallArray, i);\r\n maxWallHeight = Math.max(maxWallHeight, lh, rh);\r\n }\r\n return maxWallHeight;\r\n }\r\n\r\n // to be deleted\r\n static getWallHeight(arr: WallModel[], i: number) {\r\n const w = arr[i];\r\n let lh;\r\n let rh;\r\n if (i === 0) {\r\n lh = Math.max(w.lz, arr[arr.length - 1].lz);\r\n rh = Math.max(w.lz, arr[i + 1].lz);\r\n } else if (i === arr.length - 1) {\r\n lh = Math.max(w.lz, arr[i - 1].lz);\r\n rh = Math.max(w.lz, arr[0].lz);\r\n } else {\r\n lh = Math.max(w.lz, arr[i - 1].lz);\r\n rh = Math.max(w.lz, arr[i + 1].lz);\r\n }\r\n return { lh, rh };\r\n }\r\n\r\n static getHighestWallHeight(currentWallArray: WallModel[], ignoreSide?: boolean) {\r\n let maxWallHeight = 0;\r\n if (ignoreSide && currentWallArray.length === 4) {\r\n return Math.max(currentWallArray[0].lz, currentWallArray[2].lz);\r\n }\r\n for (let i = 0; i < currentWallArray.length; i++) {\r\n const { lh, rh } = RoofUtil.getWallHeight(currentWallArray, i);\r\n maxWallHeight = Math.max(maxWallHeight, lh, rh);\r\n }\r\n return maxWallHeight;\r\n }\r\n\r\n static isValidOnRoof(elem: ElementModel | null) {\r\n if (!elem) return false;\r\n switch (elem.type) {\r\n case ObjectType.SolarPanel:\r\n // return (elem as SolarPanelModel).parentType === ObjectType.Roof;\r\n case ObjectType.Light:\r\n case ObjectType.Sensor:\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** position is relative to foundation */\r\n static getRotationOnRoof(roofId: string, position: Vector3) {\r\n const segments = useDataStore.getState().getRoofSegmentVertices(roofId);\r\n if (!segments) return null;\r\n for (const segment of segments) {\r\n if (Util.isPointInside(position.x, position.y, segment)) {\r\n const normal = RoofUtil.getSegmentNormal(segment);\r\n const rotation = RoofUtil.getRotationFromNormal(normal);\r\n return rotation;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static getRoofSegmentBoundary(roofId: string, position: Vector3) {\r\n const segments = useDataStore.getState().getRoofSegmentVertices(roofId);\r\n if (!segments) return null;\r\n for (const segment of segments) {\r\n if (Util.isPointInside(position.x, position.y, segment)) {\r\n return segment;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static getComposedWallLength(wall: ComposedWall) {\r\n return new Vector3().subVectors(wall.leftPoint, wall.rightPoint).length();\r\n }\r\n\r\n static getComposedWallCenter(wall: ComposedWall) {\r\n return new Vector3().addVectors(wall.leftPoint, wall.rightPoint).divideScalar(2);\r\n }\r\n}\r\n","import { ObjectType } from 'src/types';\r\nimport { ElementModel } from './ElementModel';\r\n\r\nexport interface Stackable {\r\n stackable?: boolean;\r\n}\r\n\r\nexport type StackableModel = ElementModel & Stackable;\r\n\r\nexport function isStackableModel(element: ElementModel) {\r\n return element.type === ObjectType.Cuboid;\r\n}\r\n","export default __webpack_public_path__ + \"static/media/building_facade_01.15119408.png\";","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Plane } from '@react-three/drei';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\r\nimport MoveHandle from 'src/components/moveHandle';\r\nimport ResizeHandle from 'src/components/resizeHandle';\r\nimport RotateHandle from 'src/components/rotateHandle';\r\nimport { GROUND_ID, HALF_PI, RESIZE_HANDLE_SIZE, TWO_PI } from 'src/constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from 'src/types';\r\nimport { Util } from 'src/Util';\r\nimport { Euler, Mesh, Vector3 } from 'three';\r\nimport * as Selector from '../../stores/selector';\r\nimport { useHandleSize } from '../wall/hooks';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\n\r\ninterface HandlesProps {\r\n id: string;\r\n args: number[];\r\n}\r\n\r\ntype IntersectionPlaneData = {\r\n position: Vector3;\r\n rotation: Euler;\r\n};\r\n\r\nenum CuboidFace {\r\n Top = 'Top',\r\n NS = 'NS',\r\n EW = 'EW',\r\n}\r\n\r\nconst Handles = ({ id, args }: HandlesProps) => {\r\n const [hx, hy, hz] = args;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n const addedCuboidId = useStore(Selector.addedCuboidId);\r\n\r\n const [intersectionPlaneData, setIntersectionPlaneData] = useState(null);\r\n\r\n const { gl, raycaster } = useThree();\r\n const size = useHandleSize();\r\n\r\n const cuboidWorldBottomHeight = useRef(null);\r\n const cuboidWorldPosition = useRef(null);\r\n const cuboidWorldRotation = useRef(null);\r\n const parentWorldRotation = useRef(null);\r\n const parentWorldPosition = useRef(null);\r\n const childPositionMap = useRef>(new Map());\r\n const childSideMap = useRef>(new Map());\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n\r\n const lowerRotateHandlePosition: [x: number, y: number, z: number] = useMemo(() => {\r\n return [0, Math.min(-1.2 * hy, -hy - 0.75) - size * 2, RESIZE_HANDLE_SIZE / 2 - hz];\r\n }, [hy, hz, size]);\r\n\r\n const upperRotateHandlePosition: [x: number, y: number, z: number] = useMemo(() => {\r\n return [0, Math.max(1.2 * hy, hy + 0.75) + size * 2, RESIZE_HANDLE_SIZE / 2 - hz];\r\n }, [hy, hz, size]);\r\n\r\n const showIntersectionPlane = intersectionPlaneData !== null;\r\n const showTopResizeHandles = !orthographic;\r\n const showMoveAndRotateHandles = !addedCuboidId;\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n const cm = getElementById(id);\r\n if (cm) {\r\n state.selectedElementAngle = cm.rotation[2];\r\n state.selectedElementHeight = cm.lz;\r\n }\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n gl.domElement.style.cursor = 'move';\r\n } else if (handle === RotateHandleType.Upper || handle === RotateHandleType.Lower) {\r\n gl.domElement.style.cursor = 'grab';\r\n } else {\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'pointer';\r\n }\r\n }\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'default';\r\n }, []);\r\n\r\n const getWorldRotation = (id: string): number => {\r\n const el = getElementById(id);\r\n if (!el) return 0;\r\n\r\n const rotation = el.rotation[2];\r\n if (el.parentId === GROUND_ID) return rotation;\r\n\r\n return rotation + getWorldRotation(el.parentId);\r\n };\r\n\r\n const setCuboidHeight = (id: string, newLz: number) => {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id);\r\n if (!cuboid) return;\r\n cuboid.lz = newLz;\r\n cuboid.cz = newLz / 2;\r\n state.selectedElementHeight = newLz;\r\n });\r\n };\r\n\r\n const isHumanOrPlant = (type: string) => {\r\n switch (type) {\r\n case ObjectType.Human:\r\n case ObjectType.Flower:\r\n case ObjectType.Tree:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const isAbsPosChildType = (type: string) => {\r\n return isHumanOrPlant(type) || type === ObjectType.Cuboid;\r\n };\r\n\r\n const resizeXY = (pointer: Vector3) => {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id);\r\n if (!cuboid) return;\r\n\r\n const p = pointer.clone().setZ(0);\r\n const anchor = useStore.getState().resizeAnchor.clone().setZ(0);\r\n\r\n const v = new Vector3().subVectors(p, anchor).applyEuler(new Euler(0, 0, -(cuboidWorldRotation.current ?? 0)));\r\n const worldCenter = new Vector3().addVectors(p, anchor).multiplyScalar(0.5);\r\n const { pos, rot } = Util.getWorldDataById(cuboid.parentId);\r\n const center = new Vector3().subVectors(worldCenter, pos).applyEuler(new Euler(0, 0, -rot));\r\n cuboid.cx = center.x;\r\n cuboid.cy = center.y;\r\n const newLx = Math.abs(v.x);\r\n const newLy = Math.abs(v.y);\r\n cuboid.lx = newLx;\r\n cuboid.ly = newLy;\r\n\r\n const currWorldPosition = new Vector3(center.x, center.y, cuboid.cz).applyEuler(new Euler(0, 0, rot)).add(pos);\r\n const currWorldRotation = cuboid.rotation[2] + rot;\r\n if (childPositionMap.current.size > 0) {\r\n for (const e of state.elements) {\r\n const childWorldPosition = childPositionMap.current.get(e.id);\r\n if (childWorldPosition) {\r\n const relPos = childWorldPosition\r\n .clone()\r\n .sub(currWorldPosition)\r\n .applyEuler(new Euler(0, 0, -currWorldRotation));\r\n if (isHumanOrPlant(e.type)) {\r\n const c = childSideMap.current.get(e.id);\r\n if (c) {\r\n const [face, sign] = c;\r\n if (face === CuboidFace.Top) {\r\n e.cx = relPos.x;\r\n e.cy = relPos.y;\r\n } else if (face === CuboidFace.NS) {\r\n e.cx = relPos.x;\r\n e.cy = Math.sign(sign) * (newLy / 2);\r\n } else if (face === CuboidFace.EW) {\r\n e.cx = Math.sign(sign) * (newLx / 2);\r\n e.cy = relPos.y;\r\n }\r\n }\r\n } else if (e.type === ObjectType.Cuboid) {\r\n e.cx = relPos.x;\r\n e.cy = relPos.y;\r\n } else {\r\n e.cx = relPos.x / newLx;\r\n e.cy = relPos.y / newLy;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const resizeLx = (pointer: Vector3) => {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id);\r\n if (!cuboid) return;\r\n\r\n const p = pointer.clone().setZ(0);\r\n const anchor = useStore.getState().resizeAnchor.clone().setZ(0);\r\n\r\n const v = new Vector3().subVectors(p, anchor).applyEuler(new Euler(0, 0, -(cuboidWorldRotation.current ?? 0)));\r\n const worldCenter = new Vector3().addVectors(p, anchor).multiplyScalar(0.5);\r\n const { pos, rot } = Util.getWorldDataById(cuboid.parentId);\r\n const center = new Vector3().subVectors(worldCenter, pos).applyEuler(new Euler(0, 0, -rot));\r\n cuboid.cx = center.x;\r\n const newLx = Math.abs(v.x);\r\n cuboid.lx = newLx;\r\n\r\n const currWorldPosition = new Vector3(center.x, center.y, cuboid.cz).applyEuler(new Euler(0, 0, rot)).add(pos);\r\n const currWorldRotation = cuboid.rotation[2] + rot;\r\n if (childPositionMap.current.size > 0) {\r\n for (const e of state.elements) {\r\n const childWorldPosition = childPositionMap.current.get(e.id);\r\n if (childWorldPosition) {\r\n const relPos = childWorldPosition\r\n .clone()\r\n .sub(currWorldPosition)\r\n .applyEuler(new Euler(0, 0, -currWorldRotation));\r\n if (isHumanOrPlant(e.type)) {\r\n const c = childSideMap.current.get(e.id);\r\n if (c) {\r\n const [face, sign] = c;\r\n if (face === CuboidFace.Top) {\r\n e.cx = relPos.x;\r\n } else if (face === CuboidFace.NS) {\r\n e.cx = relPos.x;\r\n } else if (face === CuboidFace.EW) {\r\n e.cx = Math.sign(sign) * (newLx / 2);\r\n }\r\n }\r\n } else if (e.type === ObjectType.Cuboid) {\r\n e.cx = relPos.x;\r\n } else {\r\n e.cx = relPos.x / newLx;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const resizeLy = (pointer: Vector3) => {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id);\r\n if (!cuboid) return;\r\n\r\n const p = pointer.clone().setZ(0);\r\n const anchor = useStore.getState().resizeAnchor.clone().setZ(0);\r\n\r\n const v = new Vector3().subVectors(p, anchor).applyEuler(new Euler(0, 0, -(cuboidWorldRotation.current ?? 0)));\r\n const worldCenter = new Vector3().addVectors(p, anchor).multiplyScalar(0.5);\r\n const { pos, rot } = Util.getWorldDataById(cuboid.parentId);\r\n const center = new Vector3().subVectors(worldCenter, pos).applyEuler(new Euler(0, 0, -rot));\r\n cuboid.cy = center.y;\r\n const newLy = Math.abs(v.y);\r\n cuboid.ly = newLy;\r\n\r\n const currWorldPosition = new Vector3(center.x, center.y, cuboid.cz).applyEuler(new Euler(0, 0, rot)).add(pos);\r\n const currWorldRotation = cuboid.rotation[2] + rot;\r\n if (childPositionMap.current.size > 0) {\r\n for (const e of state.elements) {\r\n const childWorldPosition = childPositionMap.current.get(e.id);\r\n if (childWorldPosition) {\r\n const relPos = childWorldPosition\r\n .clone()\r\n .sub(currWorldPosition)\r\n .applyEuler(new Euler(0, 0, -currWorldRotation));\r\n if (isHumanOrPlant(e.type)) {\r\n const c = childSideMap.current.get(e.id);\r\n if (c) {\r\n const [face, sign] = c;\r\n if (face === CuboidFace.Top) {\r\n e.cy = relPos.y;\r\n } else if (face === CuboidFace.NS) {\r\n e.cy = Math.sign(sign) * (newLy / 2);\r\n } else if (face === CuboidFace.EW) {\r\n e.cy = relPos.y;\r\n }\r\n }\r\n } else if (e.type === ObjectType.Cuboid) {\r\n e.cy = relPos.y;\r\n } else {\r\n e.cy = relPos.y / newLy;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const resizeLz = (pointer: Vector3) => {\r\n if (cuboidWorldBottomHeight.current !== null) {\r\n const newLz = Math.max(1, pointer.z - cuboidWorldBottomHeight.current);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.lz = newLz;\r\n e.cz = newLz / 2;\r\n state.selectedElementHeight = newLz;\r\n }\r\n if (e.parentId === id && isHumanOrPlant(e.type)) {\r\n const c = childSideMap.current.get(e.id);\r\n if (c && c[0] === CuboidFace.Top) {\r\n e.cz = newLz / 2;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const handleRotate = (pointer: Vector3) => {\r\n if (cuboidWorldPosition.current) {\r\n const [cx, cy] = cuboidWorldPosition.current;\r\n let rotation =\r\n Math.atan2(cx - pointer.x, pointer.y - cy) +\r\n (useStore.getState().rotateHandleType === RotateHandleType.Upper ? 0 : Math.PI);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0;\r\n if (parentWorldRotation.current) {\r\n rotation -= parentWorldRotation.current;\r\n }\r\n useStore.getState().updateElementRotationById(id, 0, 0, rotation + offset);\r\n }\r\n };\r\n\r\n // pointer down events\r\n const handleBottomResizeHandlePointerDown = (e: ThreeEvent) => {\r\n if (\r\n (e.intersections.length > 0 && e.intersections[0].object.name === e.object.name) ||\r\n useStore.getState().addedCuboidId\r\n ) {\r\n const cuboid = getElementById(id);\r\n if (cuboid && cuboid.parentId !== GROUND_ID) {\r\n setIntersectionPlaneData({ position: new Vector3(0, 0, -hz), rotation: new Euler() });\r\n const { pos: parentWorldPos, rot: parentWorldRot } = Util.getWorldDataById(cuboid.parentId);\r\n parentWorldPosition.current = parentWorldPos;\r\n parentWorldRotation.current = parentWorldRot;\r\n cuboidWorldRotation.current = parentWorldRot + cuboid.rotation[2];\r\n const cuboidWorldPosition = new Vector3(cuboid.cx, cuboid.cy, cuboid.cz)\r\n .applyEuler(new Euler(0, 0, parentWorldRot))\r\n .add(parentWorldPos);\r\n\r\n const children = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => e.parentId === cuboid.id && (isAbsPosChildType(e.type) || Util.isIdentical(e.normal, [0, 0, 1])),\r\n );\r\n childPositionMap.current.clear();\r\n childSideMap.current.clear();\r\n for (const child of children) {\r\n const worldPos = new Vector3();\r\n if (isHumanOrPlant(child.type)) {\r\n worldPos.set(child.cx, child.cy, child.cz);\r\n if (Math.abs(child.cz - hz) < 0.01) {\r\n childSideMap.current.set(child.id, [CuboidFace.Top, 1]);\r\n } else if (Math.abs(Math.abs(child.cx) - hx) < 0.01) {\r\n childSideMap.current.set(child.id, [CuboidFace.EW, Math.sign(child.cx)]);\r\n } else {\r\n childSideMap.current.set(child.id, [CuboidFace.NS, Math.sign(child.cy)]);\r\n }\r\n } else if (child.type === ObjectType.Cuboid) {\r\n worldPos.set(child.cx, child.cy, child.cz);\r\n } else {\r\n worldPos.set(child.cx * cuboid.lx, child.cy * cuboid.ly, 0);\r\n }\r\n worldPos.applyEuler(new Euler(0, 0, cuboidWorldRotation.current)).add(cuboidWorldPosition);\r\n childPositionMap.current.set(child.id, worldPos);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n });\r\n }\r\n };\r\n\r\n const handleTopResizeHandlePointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].object.name === e.object.name) {\r\n const handleObject = e.intersections[0].object;\r\n const cameraDirection = useStore.getState().cameraDirection;\r\n const rotation = Math.atan2(cameraDirection.x, cameraDirection.y) + getWorldRotation(id);\r\n setIntersectionPlaneData({ position: handleObject.position.clone(), rotation: new Euler(-HALF_PI, rotation, 0) });\r\n const topHandleWorldPosition = handleObject.localToWorld(new Vector3());\r\n cuboidWorldBottomHeight.current = topHandleWorldPosition.z - hz * 2;\r\n const children = useStore.getState().elements.filter((e) => e.parentId === id && isHumanOrPlant(e.type));\r\n\r\n childSideMap.current.clear();\r\n for (const child of children) {\r\n const worldPos = new Vector3();\r\n worldPos.set(child.cx, child.cy, child.cz);\r\n if (Math.abs(child.cz - hz) < 0.01) {\r\n childSideMap.current.set(child.id, [CuboidFace.Top, 1]);\r\n }\r\n }\r\n\r\n setCommonStore((state) => {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n state.selectedElement = state.elements.find((e) => e.id === id) ?? null;\r\n });\r\n }\r\n };\r\n\r\n const handleRotateHandlePointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0 && e.intersections[0].object.name === e.object.name) {\r\n setIntersectionPlaneData({ position: new Vector3(0, 0, -hz), rotation: new Euler(0, 0, 0) });\r\n const handleGroup = e.eventObject;\r\n cuboidWorldPosition.current = handleGroup.localToWorld(new Vector3()).toArray();\r\n const cuboid = getElementById(id);\r\n if (cuboid) {\r\n parentWorldRotation.current = getWorldRotation(cuboid.parentId);\r\n }\r\n }\r\n };\r\n\r\n const handleMoveHandlePointerDown = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const handleType = e.intersections[0].eventObject.name;\r\n switch (handleType) {\r\n case MoveHandleType.Lower:\r\n case MoveHandleType.Upper:\r\n case MoveHandleType.Left:\r\n case MoveHandleType.Right:\r\n case MoveHandleType.Top: {\r\n useStore.getState().set((state) => {\r\n const cuboid = state.elements.find((e) => e.id === id) ?? null;\r\n if (!cuboid) return;\r\n\r\n state.selectedElement = cuboid;\r\n if (cuboid.parentId === GROUND_ID) {\r\n for (const e of state.elements) {\r\n if (state.selectedElementIdSet.has(e.id) && !Util.isElementAllowedMultipleMoveOnGround(e)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(cuboid.id);\r\n }\r\n state.moveHandleType = handleType;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n // pointer move event\r\n const handleIntersectionPlaneMove = (e: ThreeEvent) => {\r\n // set ray cast, need change wall together\r\n if (intersectionPlaneRef.current) {\r\n const intersections = raycaster.intersectObject(intersectionPlaneRef.current);\r\n if (intersections.length) {\r\n const pointer = intersections[0].point;\r\n // resize\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n if (resizeHandleType) {\r\n if (Util.isTopResizeHandle(resizeHandleType)) {\r\n resizeLz(pointer);\r\n } else if (Util.isXResizeHandle(resizeHandleType)) {\r\n resizeLx(pointer);\r\n } else if (Util.isYResizeHandle(resizeHandleType)) {\r\n resizeLy(pointer);\r\n } else {\r\n resizeXY(pointer);\r\n }\r\n }\r\n // rotate\r\n else if (useStore.getState().rotateHandleType) {\r\n handleRotate(pointer);\r\n }\r\n }\r\n }\r\n };\r\n\r\n // pointer up\r\n const handleIntersectionPlanePointerUp = () => {\r\n setIntersectionPlaneData(null);\r\n cuboidWorldBottomHeight.current = null;\r\n cuboidWorldPosition.current = null;\r\n cuboidWorldRotation.current = null;\r\n parentWorldRotation.current = null;\r\n parentWorldPosition.current = null;\r\n };\r\n\r\n return (\r\n <>\r\n {/* intersection plane */}\r\n {showIntersectionPlane && (\r\n \r\n )}\r\n\r\n {/* bottom resize handles */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* top resize handles */}\r\n {showTopResizeHandles && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* move and rotate handles */}\r\n {showMoveAndRotateHandles && (\r\n <>\r\n {/* move handles */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* rotate handles */}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Handles);\r\n","export default __webpack_public_path__ + \"static/media/building_facade_02.a8bad934.png\";","export default __webpack_public_path__ + \"static/media/building_facade_03.60816e85.png\";","export default __webpack_public_path__ + \"static/media/building_facade_04.1253be24.png\";","export default __webpack_public_path__ + \"static/media/building_facade_05.6f979c80.png\";","export default __webpack_public_path__ + \"static/media/building_facade_06.b02d8ad2.png\";","export default __webpack_public_path__ + \"static/media/building_facade_07.10224e5f.png\";","export default __webpack_public_path__ + \"static/media/building_facade_08.9d33b002.png\";","export default __webpack_public_path__ + \"static/media/building_facade_09.65f795a5.png\";","export default __webpack_public_path__ + \"static/media/building_facade_10.6520a3bf.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Sphere } from '@react-three/drei';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useRef } from 'react';\r\nimport { HIGHLIGHT_HANDLE_COLOR, MOVE_HANDLE_COLOR_1, MOVE_HANDLE_COLOR_2, MOVE_HANDLE_COLOR_3 } from 'src/constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { MoveHandleType, ResizeHandleType, RotateHandleType } from 'src/types';\r\nimport { Mesh } from 'three';\r\nimport * as Selector from '../stores/selector';\r\n\r\ninterface MoveHandleProps {\r\n position: number[];\r\n size: number;\r\n handleType: MoveHandleType;\r\n onPointerDown?: (e: ThreeEvent) => void;\r\n onPointerOver: (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => void;\r\n onPointerOut: () => void;\r\n}\r\n\r\nconst MoveHandle = ({ handleType, position, size, onPointerDown, onPointerOver, onPointerOut }: MoveHandleProps) => {\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const handleRef = useRef();\r\n\r\n const [cx, cy, cz] = position;\r\n\r\n let handleColor = MOVE_HANDLE_COLOR_1;\r\n if (cx === 0 && cy === 0) {\r\n handleColor = MOVE_HANDLE_COLOR_3;\r\n } else if (cx === 0) {\r\n handleColor = MOVE_HANDLE_COLOR_2;\r\n } else if (cy === 0) {\r\n handleColor = MOVE_HANDLE_COLOR_1;\r\n }\r\n\r\n const color = hoveredHandle === handleType || moveHandleType === handleType ? HIGHLIGHT_HANDLE_COLOR : handleColor;\r\n\r\n return (\r\n {\r\n onPointerOver(e, handleType);\r\n }}\r\n onPointerOut={onPointerOut}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default MoveHandle;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Box } from '@react-three/drei';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { useRef } from 'react';\r\nimport { HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR } from 'src/constants';\r\nimport { useStore } from 'src/stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { MoveHandleType, ResizeHandleType, RotateHandleType } from 'src/types';\r\nimport { Mesh, Vector3 } from 'three';\r\nimport * as Selector from '../stores/selector';\r\n\r\ninterface ResizeHandleProps {\r\n position: number[];\r\n handleType: ResizeHandleType;\r\n size: number;\r\n onPointerOver: (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => void;\r\n onPointerOut: () => void;\r\n}\r\n\r\nconst ResizeHandle = ({ handleType, position, size, onPointerOver, onPointerOut }: ResizeHandleProps) => {\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const handleRef = useRef();\r\n\r\n const [cx, cy, cz] = position;\r\n const color =\r\n hoveredHandle === handleType || resizeHandleType === handleType ? HIGHLIGHT_HANDLE_COLOR : RESIZE_HANDLE_COLOR;\r\n\r\n const handlePointerDown = () => {\r\n if (handleRef.current) {\r\n const anchor = handleRef.current.localToWorld(new Vector3(-cx * 2, -cy * 2, 0));\r\n useStore.getState().set((state) => {\r\n state.resizeAnchor.copy(anchor);\r\n state.resizeHandleType = handleType;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n }\r\n };\r\n\r\n return (\r\n {\r\n onPointerOver(e, handleType);\r\n }}\r\n onPointerOut={onPointerOut}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ResizeHandle;\r\n","import { Box, Cone, Cylinder, Line, Plane, Ring, Sphere } from '@react-three/drei';\r\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { getSunDirection } from 'src/analysis/sunTools';\r\nimport RotateHandle from 'src/components/rotateHandle';\r\nimport {\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n SOLAR_PANEL_BLACK_SPECULAR,\r\n SOLAR_PANEL_BLUE_SPECULAR,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from 'src/constants';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { PvModel } from 'src/models/PvModel';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport {\r\n ActionType,\r\n BoxArgs,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n TrackerType,\r\n} from 'src/types';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { Util } from 'src/Util';\r\nimport { Euler, Vector3, Mesh, DoubleSide, Color, FrontSide } from 'three';\r\nimport * as Selector from '../../stores/selector';\r\nimport { LineData } from '../LineData';\r\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\r\nimport { useSelected } from '../hooks';\r\n\r\ninterface SolarPanelBoxGroupProps {\r\n solarPanelModel: SolarPanelModel;\r\n groupRotation: Euler;\r\n panelRotation: Euler;\r\n}\r\n\r\ninterface SunbeamProps {\r\n sunDirection: Vector3;\r\n}\r\n\r\nconst HANDLE_GROUP_NAME = 'Handle Group Move & Resize';\r\n\r\nconst SolarPanelOnCuboid = (solarPanelModel: SolarPanelModel) => {\r\n const {\r\n id,\r\n parentId,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n normal,\r\n locked,\r\n trackerType,\r\n tiltAngle,\r\n relativeAzimuth,\r\n poleHeight,\r\n poleRadius,\r\n poleSpacing,\r\n color = 'white',\r\n } = solarPanelModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const isTop = isSolarPanelOnTopFace(normal);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = isTop ? poleHeight : 0;\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const rotateHandleSize = (baseSize * 2) / 3;\r\n const tiltHandleSize = (baseSize * 2) / 3;\r\n const poleZ = -poleHeight / 2 - lz / 2;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n\r\n const {\r\n gl: { domElement },\r\n camera,\r\n raycaster,\r\n mouse,\r\n } = useThree();\r\n\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [showTiltAngle, setShowTiltAngle] = useState(false);\r\n\r\n const pointerDown = useRef(false);\r\n const oldTiltAngleRef = useRef(0);\r\n const newTiltAngleRef = useRef(0);\r\n const parentWorldPositionRef = useRef(null);\r\n const parentWorldRotationRef = useRef(null);\r\n\r\n const tiltHandleRef = useRef();\r\n\r\n const degree = useMemo(() => new Array(13).fill(0), []);\r\n const dateObject = useMemo(() => new Date(date), [date]);\r\n\r\n const poles = useMemo(() => {\r\n const poleArray: Vector3[] = [];\r\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\r\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\r\n const sinTilt = 0.5 * Math.sin(tiltAngle);\r\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\r\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\r\n for (let ix = -poleNx; ix <= poleNx; ix++) {\r\n for (let iy = -poleNy; iy <= poleNy; iy++) {\r\n const xi = ix * cosAz - iy * sinAz;\r\n const yi = ix * sinAz + iy * cosAz;\r\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\r\n }\r\n }\r\n return poleArray;\r\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleZ]);\r\n\r\n const groupRotation = useMemo(() => getRotationFromNormal(normal), [normal]);\r\n\r\n const panelRotation = useMemo(() => {\r\n if (isTop) {\r\n if (trackerType === TrackerType.NO_TRACKER) {\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }\r\n const sunDirection = getSunDirection(dateObject, latitude);\r\n const rot = getWorldRotationZ(parentId, groupRotation.z) - groupRotation.z;\r\n switch (trackerType) {\r\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\r\n const r = Math.hypot(sunDirection.x, sunDirection.y);\r\n return new Euler(\r\n Math.atan2(r, sunDirection.z),\r\n 0,\r\n Math.atan2(sunDirection.y, sunDirection.x) + HALF_PI - rot,\r\n 'ZXY',\r\n );\r\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\r\n return new Euler(0, Math.atan2(sunDirection.x, sunDirection.z), -rot + (lx < ly ? 0 : HALF_PI), 'XYZ');\r\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\r\n return new Euler(tiltAngle, 0, Math.atan2(sunDirection.y, sunDirection.x) + HALF_PI - rot, 'ZXY');\r\n }\r\n }\r\n return new Euler();\r\n }, [isTop, tiltAngle, relativeAzimuth, trackerType, dateObject, latitude]);\r\n\r\n const showRotateHandle = selected && !locked && trackerType === TrackerType.NO_TRACKER && isTop;\r\n const showTiltHandle =\r\n selected && !locked && trackerType === TrackerType.NO_TRACKER && isTop && Math.abs(actualPoleHeight) > 0.1;\r\n const showPoles = actualPoleHeight > 0 && isTop;\r\n\r\n // handle pointer up\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n setShowTiltAngle(false);\r\n setCommonStore((state) => {\r\n state.rotateHandleType = null;\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n });\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const getRotateHandleColor = (rotateHandleType: RotateHandleType) => {\r\n return hoveredHandle === rotateHandleType || useStore.getState().rotateHandleType === rotateHandleType\r\n ? HIGHLIGHT_HANDLE_COLOR\r\n : RESIZE_HANDLE_COLOR;\r\n };\r\n\r\n return (\r\n \r\n \r\n\r\n {/* draw rotate handles */}\r\n {showRotateHandle && (\r\n \r\n {/* rotate handles */}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw tilt handles */}\r\n {showTiltHandle && (\r\n <>\r\n {/* ring handles */}\r\n {\r\n hoverHandle(e, RotateHandleType.Tilt);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n setShowTiltAngle(true);\r\n if (hoveredHandle) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n pointerDown.current = true;\r\n // const sp = getElementById(id) as SolarPanelModel;\r\n oldTiltAngleRef.current = tiltAngle;\r\n const { rot } = Util.getWorldDataById(parentId);\r\n parentWorldRotationRef.current = rot;\r\n }\r\n setCommonStore((state) => {\r\n state.rotateHandleType = RotateHandleType.Tilt;\r\n });\r\n }}\r\n >\r\n \r\n \r\n {showTiltAngle && (\r\n <>\r\n {/* intersection plane */}\r\n {\r\n if (Math.abs(newTiltAngleRef.current - oldTiltAngleRef.current) > ZERO_TOLERANCE) {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltAngleRef.current,\r\n newValue: newTiltAngleRef.current,\r\n changedElementId: id,\r\n changedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n updateSolarPanelTiltAngleById(\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n updateSolarPanelTiltAngleById(\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n }\r\n }}\r\n onPointerMove={(e) => {\r\n if (pointerDown.current) {\r\n raycaster.setFromCamera(mouse, camera);\r\n if (tiltHandleRef.current) {\r\n const intersects = raycaster.intersectObjects([tiltHandleRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point;\r\n const parent = tiltHandleRef.current.parent;\r\n if (parent) {\r\n const ov = parent.localToWorld(new Vector3()); // rotate point in world coordinate\r\n const cv = new Vector3().subVectors(p, ov);\r\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\r\n const touch = 0.5 * ly * Math.abs(Math.sin(angle)) > actualPoleHeight;\r\n if (!touch) {\r\n const wr = relativeAzimuth + (parentWorldRotationRef.current ?? 0);\r\n const sign =\r\n wr % Math.PI === 0\r\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\r\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\r\n angle *= sign;\r\n updateSolarPanelTiltAngleById(id, angle);\r\n newTiltAngleRef.current = angle;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n >\r\n \r\n \r\n {/* pointer */}\r\n \r\n {/* scale */}\r\n {degree.map((e, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {/* show current degree */}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* draw poles */}\r\n {showPoles &&\r\n poles.map((p, i) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nconst SolarPanelBoxGroup = ({ solarPanelModel, groupRotation, panelRotation }: SolarPanelBoxGroupProps) => {\r\n let {\r\n id,\r\n parentId,\r\n lx,\r\n ly,\r\n lz,\r\n cx,\r\n cy,\r\n cz,\r\n normal,\r\n tiltAngle,\r\n relativeAzimuth,\r\n trackerType,\r\n drawSunBeam,\r\n locked,\r\n showLabel,\r\n label,\r\n pvModelName,\r\n orientation,\r\n frameColor,\r\n backsheetColor,\r\n color,\r\n poleHeight,\r\n } = solarPanelModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const selectMe = useStore(Selector.selectMe);\r\n\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const language = useStore(Selector.language);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const pvModules = useStore(Selector.pvModules);\r\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const isTop = isSolarPanelOnTopFace(normal);\r\n const actualTiltAngle = isTop ? tiltAngle : 0;\r\n const actualRelativeAzimuth = isTop ? relativeAzimuth : 0;\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const [hx, hy, hz] = [lx, ly, lz].map((v) => v / 2);\r\n const resizeHandleArgs = [resizeHandleSize, resizeHandleSize, lz * 1.2] as BoxArgs;\r\n const pvModel = pvModules[pvModelName] as PvModel;\r\n\r\n if (pvModel) {\r\n lz = Math.max(pvModel.thickness, 0.02);\r\n }\r\n\r\n const dateObject = useMemo(() => new Date(date), [date]);\r\n const labelText = useMemo(() => {\r\n return (\r\n (label ? label : i18n.t('shared.SolarPanelElement', lang)) +\r\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [label, locked, language, cx, cy, cz]);\r\n\r\n const solarPanelLines = useMemo(() => {\r\n const lines: LineData[] = [];\r\n if (pvModel) {\r\n let mx, my;\r\n if (orientation === Orientation.portrait) {\r\n mx = Math.max(1, Math.round(lx / pvModel.width));\r\n my = Math.max(1, Math.round(ly / pvModel.length));\r\n } else {\r\n mx = Math.max(1, Math.round(lx / pvModel.length));\r\n my = Math.max(1, Math.round(ly / pvModel.width));\r\n }\r\n const dx = lx / mx;\r\n const dy = ly / my;\r\n for (let i = 0; i <= mx; i++) {\r\n lines.push({\r\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\r\n } as LineData);\r\n }\r\n for (let i = 0; i <= my; i++) {\r\n lines.push({\r\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\r\n } as LineData);\r\n }\r\n }\r\n return lines;\r\n }, [pvModel, orientation, pvModelName, lx, ly, lz]);\r\n\r\n const [relativeSunDirection, setRelativeSunDirection] = useState(getRelativeSunDirection());\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n\r\n const baseRef = useRef(null);\r\n\r\n const { gl } = useThree();\r\n const texture = useSolarPanelTexture(lx, ly, pvModel, orientation, frameColor, backsheetColor);\r\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\r\n\r\n useFrame(() => {\r\n const newRelativeSunDirection = getRelativeSunDirection();\r\n if (!newRelativeSunDirection.equals(relativeSunDirection)) {\r\n setRelativeSunDirection(newRelativeSunDirection);\r\n }\r\n });\r\n\r\n function getRelativeSunDirection(): Vector3 {\r\n const euler = new Euler();\r\n const worldRotationZ = getWorldRotationZ(parentId, groupRotation.z);\r\n if (trackerType === TrackerType.NO_TRACKER) {\r\n euler.set(-groupRotation.x - actualTiltAngle, 0, -worldRotationZ - actualRelativeAzimuth);\r\n } else {\r\n euler.set(-groupRotation.x - panelRotation.x, -panelRotation.y, -worldRotationZ - panelRotation.z);\r\n }\r\n return getSunDirection(dateObject, latitude).applyEuler(euler);\r\n }\r\n\r\n function getResizeHandleColor(handleType: ResizeHandleType) {\r\n return hoveredHandle === handleType || resizeHandleType === handleType\r\n ? HIGHLIGHT_HANDLE_COLOR\r\n : RESIZE_HANDLE_COLOR;\r\n }\r\n\r\n function hoverHandle(e: ThreeEvent) {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.eventObject.name.includes(HANDLE_GROUP_NAME);\r\n if (intersected) {\r\n const handle = e.object.name as MoveHandleType | ResizeHandleType | RotateHandleType | null;\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n gl.domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n gl.domElement.style.cursor = 'grab';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n }\r\n\r\n function noHoverHandle() {\r\n setHoveredHandle(null);\r\n gl.domElement.style.cursor = 'default';\r\n }\r\n\r\n function onClickResizeHandle(handleType: ResizeHandleType, anchor: Vector3) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.resizeHandleType = handleType;\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n\r\n function clickHandle(e: ThreeEvent) {\r\n if (e.intersections.length > 0 && e.intersections[0].eventObject.name === HANDLE_GROUP_NAME) {\r\n const handleType = e.object.name;\r\n switch (handleType) {\r\n case MoveHandleType.Default: {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = handleType;\r\n state.selectedElement = state.elements.find((e) => e.id === state.selectedElement?.id) as ElementModel;\r\n });\r\n break;\r\n }\r\n case ResizeHandleType.Left: {\r\n const anchor = e.object.localToWorld(new Vector3(lx, 0, 0));\r\n onClickResizeHandle(handleType, anchor);\r\n break;\r\n }\r\n case ResizeHandleType.Right: {\r\n const anchor = e.object.localToWorld(new Vector3(-lx, 0, 0));\r\n onClickResizeHandle(handleType, anchor);\r\n break;\r\n }\r\n case ResizeHandleType.Lower: {\r\n const anchor = e.object.localToWorld(new Vector3(0, ly, 0));\r\n onClickResizeHandle(handleType, anchor);\r\n break;\r\n }\r\n case ResizeHandleType.Upper: {\r\n const anchor = e.object.localToWorld(new Vector3(0, -ly, 0));\r\n onClickResizeHandle(handleType, anchor);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function renderTopTextureMaterial() {\r\n if (showSolarRadiationHeatmap && heatmapTexture) {\r\n return ;\r\n }\r\n if (!texture) return ;\r\n if (orthographic || solarPanelShininess === 0) {\r\n return ;\r\n }\r\n return (\r\n \r\n );\r\n }\r\n\r\n function renderBotTextureMaterial() {\r\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.SolarPanel;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n gl.domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n gl.domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {renderTopTextureMaterial()}\r\n {renderBotTextureMaterial()}\r\n \r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* sun beam */}\r\n {drawSunBeam && relativeSunDirection.z > 0 && }\r\n\r\n {showSolarRadiationHeatmap &&\r\n heatmapTexture &&\r\n solarPanelLines.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/* simulation panel */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n \r\n\r\n {/*draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst Sunbeam = React.memo(({ sunDirection }: SunbeamProps) => {\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n\r\n const sunBeamLength = useMemo(() => Math.max(100, 10 * sceneRadius), [sceneRadius]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nexport function getRotationFromNormal(normal: number[]) {\r\n const [x, y, z] = normal;\r\n if (z === 1) {\r\n return new Euler(0, 0, 0);\r\n }\r\n if (x !== 0) {\r\n return new Euler(HALF_PI, 0, x * HALF_PI, 'ZXY');\r\n }\r\n if (y !== 0) {\r\n return new Euler(-y * HALF_PI, 0, 0);\r\n }\r\n return new Euler();\r\n}\r\n\r\nexport function isSolarPanelOnTopFace(normal: number[]) {\r\n return Math.abs(normal[2] - 1) < 0.01;\r\n}\r\n\r\nfunction getWorldRotationZ(parentId: string, selfRotation: number) {\r\n const { rot } = Util.getWorldDataById(parentId);\r\n return rot + selfRotation;\r\n}\r\n\r\nexport default React.memo(SolarPanelOnCuboid);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport Facade_Texture_00 from '../../resources/tiny_white_square.png';\r\nimport Facade_Texture_01 from '../../resources/building_facade_01.png';\r\nimport Facade_Texture_02 from '../../resources/building_facade_02.png';\r\nimport Facade_Texture_03 from '../../resources/building_facade_03.png';\r\nimport Facade_Texture_04 from '../../resources/building_facade_04.png';\r\nimport Facade_Texture_05 from '../../resources/building_facade_05.png';\r\nimport Facade_Texture_06 from '../../resources/building_facade_06.png';\r\nimport Facade_Texture_07 from '../../resources/building_facade_07.png';\r\nimport Facade_Texture_08 from '../../resources/building_facade_08.png';\r\nimport Facade_Texture_09 from '../../resources/building_facade_09.png';\r\nimport Facade_Texture_10 from '../../resources/building_facade_10.png';\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Plane } from '@react-three/drei';\r\nimport { CanvasTexture, Euler, FrontSide, Group, Mesh, RepeatWrapping, TextureLoader, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from '../../stores/commonRef';\r\nimport * as Selector from '../../stores/selector';\r\nimport { CuboidModel } from '../../models/CuboidModel';\r\nimport { invalidate, ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n ActionType,\r\n CuboidTexture,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n} from '../../types';\r\nimport {\r\n HALF_PI,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n ORIGIN_VECTOR2,\r\n TWO_PI,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport { Util } from '../../Util';\r\nimport { ElementModel } from '../../models/ElementModel';\r\nimport { PolarGrid } from '../polarGrid';\r\nimport Wireframe from '../../components/wireframe';\r\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\r\nimport { UndoableAdd } from '../../undo/UndoableAdd';\r\nimport { UndoableMove } from '../../undo/UndoableMove';\r\nimport { UndoableResize } from '../../undo/UndoableResize';\r\nimport { UndoableChange } from '../../undo/UndoableChange';\r\nimport i18n from '../../i18n/i18n';\r\nimport { Point2 } from '../../models/Point2';\r\nimport { PolygonModel } from '../../models/PolygonModel';\r\nimport { ElementGrid } from '../elementGrid';\r\nimport { HorizontalRuler } from '../horizontalRuler';\r\nimport { showError } from '../../helpers';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useDataStore } from '../../stores/commonData';\r\nimport Handles from './handles';\r\nimport { ElementModelFactory } from 'src/models/ElementModelFactory';\r\nimport { getSolarPanelUnitLength } from '../wall/wall';\r\nimport { isSolarPanelOnTopFace } from '../solarPanel/solarPanelOnCuboid';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst Cuboid = (cuboidModel: CuboidModel) => {\r\n const {\r\n id,\r\n cx,\r\n cy,\r\n lx = 1,\r\n ly = 1,\r\n lz = 1,\r\n color = 'silver',\r\n lineColor = 'black',\r\n lineWidth = 0.1,\r\n locked = false,\r\n showLabel = false,\r\n textureTypes = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ],\r\n stackable,\r\n } = cuboidModel;\r\n\r\n const selected = useSelected(id);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const addElement = useStore(Selector.addElement);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLyById = useStore(Selector.updateElementLyById);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const setElementSize = useStore(Selector.setElementSize);\r\n const setElementNormal = useStore(Selector.setElementNormal);\r\n const selectMe = useStore(Selector.selectMe);\r\n const updateSolarPanelRelativeAzimuthById = useStore(Selector.updateSolarCollectorRelativeAzimuthById);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const isAddingElement = useStore(Selector.isAddingElement);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const updatePolygonVertexPositionById = useStore(Selector.updatePolygonVertexPositionById);\r\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n\r\n const {\r\n camera,\r\n gl: { domElement },\r\n raycaster,\r\n mouse,\r\n } = useThree();\r\n const [heatmapTextureTop, setHeatmapTextureTop] = useState(null);\r\n const [heatmapTextureSouth, setHeatmapTextureSouth] = useState(null);\r\n const [heatmapTextureNorth, setHeatmapTextureNorth] = useState(null);\r\n const [heatmapTextureWest, setHeatmapTextureWest] = useState(null);\r\n const [heatmapTextureEast, setHeatmapTextureEast] = useState(null);\r\n const [hovered, setHovered] = useState(false);\r\n const [showGrid, setShowGrid] = useState(false);\r\n const [normal, setNormal] = useState();\r\n\r\n const groupRef = useRef(null);\r\n const baseRef = useRef();\r\n const grabRef = useRef(null);\r\n const faceNormalRef = useRef(UNIT_VECTOR_POS_Z);\r\n const gridPositionRef = useRef(new Vector3(0, 0, 0));\r\n const gridRotationRef = useRef(new Euler(0, 0, 0));\r\n const gridDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const oldPositionRef = useRef(new Vector3());\r\n const newPositionRef = useRef(new Vector3());\r\n const oldNormalRef = useRef(new Vector3());\r\n const newNormalRef = useRef(new Vector3());\r\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const newDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const oldAzimuthRef = useRef(0);\r\n const newAzimuthRef = useRef(0);\r\n const oldVerticesRef = useRef([]);\r\n const newVerticesRef = useRef([]);\r\n const intersectPlaneRef = useRef();\r\n const worldPositionRef = useRef(new Vector3());\r\n const worldRotationRef = useRef(0);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n\r\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\r\n if (grabRef.current && grabRef.current.type === ObjectType.SolarPanel) {\r\n const isTop = isSolarPanelOnTopFace(grabRef.current.normal);\r\n const actualPoleHeight = isTop ? (grabRef.current as SolarPanelModel).poleHeight : 0;\r\n intersectionPlanePosition.set(0, 0, cuboidModel.lz / 2 + actualPoleHeight);\r\n }\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (cuboidModel?.label ? cuboidModel.label : i18n.t('shared.CuboidElement', lang)) +\r\n (cuboidModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (cuboidModel?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n (lz / 2).toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [cuboidModel?.label, locked, language, cx, cy, lz]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n grabRef.current = null;\r\n setShowGrid(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (useStore.getState().tempHumanPlant.length > 0) {\r\n setCommonStore((state) => {\r\n state.elements.push(...state.tempHumanPlant);\r\n state.tempHumanPlant = [];\r\n });\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (cuboidModel && showSolarRadiationHeatmap) {\r\n const maxValue = solarRadiationHeatmapMaxValue ?? 5;\r\n const heatmapTop = getHeatmap(cuboidModel.id + '-top');\r\n if (heatmapTop) {\r\n setHeatmapTextureTop(Util.fetchHeatmapTexture(heatmapTop, maxValue));\r\n }\r\n const heatmapSouth = getHeatmap(cuboidModel.id + '-south');\r\n if (heatmapSouth) {\r\n setHeatmapTextureSouth(Util.fetchHeatmapTexture(heatmapSouth, maxValue));\r\n }\r\n const heatmapNorth = getHeatmap(cuboidModel.id + '-north');\r\n if (heatmapNorth) {\r\n setHeatmapTextureNorth(Util.fetchHeatmapTexture(heatmapNorth, maxValue));\r\n }\r\n const heatmapWest = getHeatmap(cuboidModel.id + '-west');\r\n if (heatmapWest) {\r\n setHeatmapTextureWest(Util.fetchHeatmapTexture(heatmapWest, maxValue));\r\n }\r\n const heatmapEast = getHeatmap(cuboidModel.id + '-east');\r\n if (heatmapEast) {\r\n setHeatmapTextureEast(Util.fetchHeatmapTexture(heatmapEast, maxValue, true));\r\n }\r\n // note: unfortunately, setting the rotation of the canvas textures seems to\r\n // have no effect. so we must do it in a different way.\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n const fetchTextureImage = (textureType: CuboidTexture) => {\r\n switch (textureType) {\r\n case CuboidTexture.Facade01:\r\n return Facade_Texture_01;\r\n case CuboidTexture.Facade02:\r\n return Facade_Texture_02;\r\n case CuboidTexture.Facade03:\r\n return Facade_Texture_03;\r\n case CuboidTexture.Facade04:\r\n return Facade_Texture_04;\r\n case CuboidTexture.Facade05:\r\n return Facade_Texture_05;\r\n case CuboidTexture.Facade06:\r\n return Facade_Texture_06;\r\n case CuboidTexture.Facade07:\r\n return Facade_Texture_07;\r\n case CuboidTexture.Facade08:\r\n return Facade_Texture_08;\r\n case CuboidTexture.Facade09:\r\n return Facade_Texture_09;\r\n case CuboidTexture.Facade10:\r\n return Facade_Texture_10;\r\n default:\r\n return Facade_Texture_00;\r\n }\r\n };\r\n\r\n const fetchRepeatDividers = (textureType: CuboidTexture) => {\r\n switch (textureType) {\r\n case CuboidTexture.Facade01:\r\n return { x: 14, y: 6.5 };\r\n case CuboidTexture.Facade02:\r\n return { x: 14, y: 6.5 };\r\n case CuboidTexture.Facade03:\r\n return { x: 10, y: 12 };\r\n case CuboidTexture.Facade04:\r\n return { x: 20, y: 11 };\r\n case CuboidTexture.Facade05:\r\n return { x: 15, y: 10 };\r\n case CuboidTexture.Facade06:\r\n return { x: 11, y: 3.5 };\r\n case CuboidTexture.Facade07:\r\n return { x: 11, y: 10 };\r\n case CuboidTexture.Facade08:\r\n return { x: 16, y: 9 };\r\n case CuboidTexture.Facade09:\r\n return { x: 10, y: 9 };\r\n case CuboidTexture.Facade10:\r\n return { x: 12, y: 9 };\r\n default:\r\n return { x: 1, y: 1 }; // maybe for rooftop\r\n }\r\n };\r\n\r\n const textureLoaderEast = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[0]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[0]);\r\n t.repeat.set(ly / param.x, lz / param.y);\r\n t.rotation = HALF_PI;\r\n t.center.x = 1;\r\n t.center.y = 0;\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureEast(t);\r\n });\r\n }, [textureTypes[0], ly, lz]);\r\n const [textureEast, setTextureEast] = useState(textureLoaderEast);\r\n\r\n const textureLoaderWest = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[1]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[1]);\r\n t.repeat.set(ly / param.x, lz / param.y);\r\n t.rotation = -HALF_PI;\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureWest(t);\r\n });\r\n }, [textureTypes[1], ly, lz]);\r\n const [textureWest, setTextureWest] = useState(textureLoaderWest);\r\n\r\n const textureLoaderNorth = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[2]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[2]);\r\n t.repeat.set(lx / param.x, lz / param.y);\r\n t.rotation = Math.PI;\r\n t.center.x = 0;\r\n t.center.y = 1;\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureNorth(t);\r\n });\r\n }, [textureTypes[2], lx, lz]);\r\n const [textureNorth, setTextureNorth] = useState(textureLoaderNorth);\r\n\r\n const textureLoaderSouth = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[3]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[3]);\r\n t.repeat.set(lx / param.x, lz / param.y);\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureSouth(t);\r\n });\r\n }, [textureTypes[3], lx, lz]);\r\n const [textureSouth, setTextureSouth] = useState(textureLoaderSouth);\r\n\r\n const textureLoaderTop = useMemo(() => {\r\n return new TextureLoader().load(textureTypes ? fetchTextureImage(textureTypes[4]) : Facade_Texture_00, (t) => {\r\n const param = fetchRepeatDividers(textureTypes[4]);\r\n t.repeat.set(lx / param.x, ly / param.y);\r\n t.wrapS = t.wrapT = RepeatWrapping;\r\n setTextureTop(t);\r\n });\r\n }, [textureTypes[4], lx, ly]);\r\n const [textureTop, setTextureTop] = useState(textureLoaderTop);\r\n\r\n useEffect(() => {\r\n invalidate();\r\n }, [...textureTypes]);\r\n\r\n const legalOnCuboid = (type: ObjectType) => {\r\n switch (type) {\r\n case ObjectType.Polygon:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const legalAddToCuboid = (type: ObjectType) => {\r\n switch (type) {\r\n case ObjectType.Polygon:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const setupGridParams = (face: Vector3) => {\r\n faceNormalRef.current = face;\r\n const aboveDistance = 0.01;\r\n if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_Z)) {\r\n gridPositionRef.current = new Vector3(0, 0, hz + aboveDistance);\r\n gridRotationRef.current = new Euler(0, 0, 0);\r\n gridDimensionRef.current.set(hx, hy, hz);\r\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_X)) {\r\n // east face in view coordinate system\r\n gridPositionRef.current = new Vector3(hx + aboveDistance, 0, 0);\r\n gridRotationRef.current = new Euler(0, HALF_PI, 0);\r\n gridDimensionRef.current.set(hz, hy, hx);\r\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_NEG_X)) {\r\n // west face in view coordinate system\r\n gridPositionRef.current = new Vector3(-hx - aboveDistance, 0, 0);\r\n gridRotationRef.current = new Euler(0, -HALF_PI, 0);\r\n gridDimensionRef.current.set(hz, hy, hx);\r\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_NEG_Y)) {\r\n // south face in the view coordinate system\r\n gridPositionRef.current = new Vector3(0, -hy - aboveDistance, 0);\r\n gridRotationRef.current = new Euler(HALF_PI, 0, 0);\r\n gridDimensionRef.current.set(hx, hz, hy);\r\n } else if (Util.isSame(faceNormalRef.current, UNIT_VECTOR_POS_Y)) {\r\n // north face in the view coordinate system\r\n gridPositionRef.current = new Vector3(0, hy + aboveDistance, 0);\r\n gridRotationRef.current = new Euler(-HALF_PI, 0, 0);\r\n gridDimensionRef.current.set(hx, hz, hy);\r\n }\r\n };\r\n\r\n const ratio = Math.max(1, Math.max(lx, ly) / 8);\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * ratio;\r\n\r\n const onTopSurface = Util.isIdentical(grabRef.current?.normal, UNIT_VECTOR_POS_Z_ARRAY);\r\n\r\n const handleAddElement = (e: ThreeEvent) => {\r\n const intersection = e.intersections[0];\r\n const objectToAdd = useStore.getState().objectTypeToAdd;\r\n if (objectToAdd === ObjectType.SolarPanel) {\r\n const pointer = intersection.point;\r\n const { pos, rot } = Util.getWorldDataById(id);\r\n const diff = new Vector3().subVectors(pointer, pos).applyEuler(new Euler(0, 0, -rot));\r\n const addedElement = ElementModelFactory.makeSolarPanel(\r\n cuboidModel,\r\n useStore.getState().getPvModule(useStore.getState().actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\r\n diff.x / lx,\r\n diff.y / ly,\r\n diff.z / lz,\r\n useStore.getState().actionState.solarPanelOrientation ?? Orientation.landscape,\r\n useStore.getState().actionState.solarPanelPoleHeight ?? 1,\r\n useStore.getState().actionState.solarPanelPoleSpacing ?? 3,\r\n useStore.getState().actionState.solarPanelTiltAngle ?? 0,\r\n useStore.getState().actionState.solarPanelRelativeAzimuth ?? 0,\r\n intersection.face?.normal,\r\n [0, 0, 0],\r\n useStore.getState().actionState.solarPanelFrameColor ?? 'white',\r\n );\r\n setCommonStore((state) => {\r\n state.elements.push(addedElement);\r\n });\r\n return addedElement;\r\n } else {\r\n return addElement(cuboidModel, intersection.point, intersection.face?.normal);\r\n }\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (!isAddingElement()) {\r\n selectMe(id, e, ActionType.Select);\r\n }\r\n const selectedElement = getSelectedElement();\r\n let bypass = false;\r\n if (\r\n e.intersections[0].object.name === ObjectType.Polygon &&\r\n useStore.getState().objectTypeToAdd !== ObjectType.None\r\n ) {\r\n bypass = true;\r\n }\r\n if (selectedElement?.id === id || bypass) {\r\n // no child of this cuboid is clicked\r\n if (legalAddToCuboid(useStore.getState().objectTypeToAdd) && cuboidModel) {\r\n setShowGrid(true);\r\n const addedElement = handleAddElement(e);\r\n if (addedElement) {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: addedElement,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n } else {\r\n useRefStore.getState().selectNone();\r\n useRefStore.setState((state) => {\r\n state.cuboidRef = groupRef;\r\n });\r\n }\r\n } else {\r\n // a child of this cuboid is clicked\r\n if (selectedElement && selectedElement.parentId === id) {\r\n if (legalOnCuboid(selectedElement.type)) {\r\n setShowGrid(true);\r\n const { rot, pos } = Util.getWorldDataById(id);\r\n worldPositionRef.current.copy(pos);\r\n worldRotationRef.current = rot;\r\n grabRef.current = selectedElement;\r\n let face;\r\n for (const x of e.intersections) {\r\n if (x.object === baseRef.current) {\r\n face = x.face;\r\n break;\r\n }\r\n }\r\n if (face) {\r\n setupGridParams(face.normal);\r\n if (!normal || !normal.equals(face.normal)) {\r\n setNormal(face.normal);\r\n }\r\n }\r\n useRefStore.getState().setEnableOrbitController(false);\r\n oldPositionRef.current.x = selectedElement.cx;\r\n oldPositionRef.current.y = selectedElement.cy;\r\n oldPositionRef.current.z = selectedElement.cz;\r\n oldNormalRef.current.fromArray(selectedElement.normal);\r\n oldDimensionRef.current.x = selectedElement.lx;\r\n oldDimensionRef.current.y = selectedElement.ly;\r\n oldDimensionRef.current.z = selectedElement.lz;\r\n switch (selectedElement.type) {\r\n case ObjectType.SolarPanel:\r\n oldAzimuthRef.current = (selectedElement as SolarPanelModel).relativeAzimuth;\r\n break;\r\n case ObjectType.Polygon:\r\n oldVerticesRef.current = (selectedElement as PolygonModel).vertices.map((v) => ({ ...v }));\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handlePointerMove = (e: ThreeEvent) => {\r\n if (grabRef.current && cuboidModel) {\r\n if (grabRef.current.type === ObjectType.SolarPanel && onTopSurface) return;\r\n if (grabRef.current.parentId === id && grabRef.current.type && !grabRef.current.locked) {\r\n const mouse = new Vector2(\r\n (e.offsetX / domElement.clientWidth) * 2 - 1,\r\n 1 - (e.offsetY / domElement.clientHeight) * 2,\r\n );\r\n raycaster.setFromCamera(mouse, camera);\r\n if (baseRef.current) {\r\n const intersects = raycaster.intersectObjects([baseRef.current]);\r\n if (intersects.length > 0) {\r\n let p = intersects[0].point;\r\n const face = intersects[0].face;\r\n if (useStore.getState().moveHandleType) {\r\n if (face) {\r\n const n = face.normal;\r\n if (normal && !normal.equals(n)) {\r\n setNormal(n);\r\n }\r\n setupGridParams(n);\r\n setElementNormal(grabRef.current.id, n.x, n.y, n.z);\r\n }\r\n p = Util.relativeCoordinates(p.x, p.y, p.z, cuboidModel);\r\n if (grabRef.current.type === ObjectType.Polygon) {\r\n const polygon = grabRef.current as PolygonModel;\r\n if (useStore.getState().moveHandleType === MoveHandleType.Default) {\r\n const centroid = Util.calculatePolygonCentroid(oldVerticesRef.current);\r\n const n = new Vector3().fromArray(polygon.normal);\r\n let dx: number, dy: number;\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n // east face\r\n dx = -(centroid.x + p.z);\r\n dy = p.y - centroid.y;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n // west face\r\n dx = p.z - centroid.x;\r\n dy = p.y - centroid.y;\r\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n // north face\r\n dx = p.x - centroid.x;\r\n dy = -(centroid.y + p.z);\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n // south face\r\n dx = p.x - centroid.x;\r\n dy = p.z - centroid.y;\r\n } else {\r\n // top face\r\n dx = p.x - centroid.x;\r\n dy = p.y - centroid.y;\r\n }\r\n const copy = oldVerticesRef.current.map((v) => ({ ...v }));\r\n copy.forEach((v: Point2) => {\r\n v.x += dx;\r\n v.y += dy;\r\n });\r\n // update all the vertices at once with the DEEP COPY above\r\n // do not update each vertex's position one by one (it is slower)\r\n updatePolygonVerticesById(polygon.id, copy);\r\n }\r\n } else {\r\n setElementPosition(grabRef.current.id, p.x, p.y, p.z);\r\n }\r\n } else if (useStore.getState().resizeHandleType) {\r\n switch (grabRef.current.type) {\r\n case ObjectType.SolarPanel:\r\n const solarPanel = grabRef.current as SolarPanelModel;\r\n const [unitX, unitY] = getSolarPanelUnitLength(solarPanel);\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n\r\n // z direction\r\n if (resizeHandleType === ResizeHandleType.Lower || resizeHandleType === ResizeHandleType.Upper) {\r\n const ny = Math.max(1, Math.round(Math.abs(p.z - resizeAnchor.z) / unitY));\r\n const length = ny * unitY;\r\n const v = new Vector3(0, 0, p.z - resizeAnchor.z).normalize().multiplyScalar(length);\r\n const worldCenter = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\r\n setCommonStore((state) => {\r\n const sp = state.elements.find((e) => e.id === solarPanel.id);\r\n if (!sp) return;\r\n sp.cz = (worldCenter.z - worldPositionRef.current.z) / lz;\r\n sp.ly = Math.abs(v.z);\r\n });\r\n }\r\n // XY direction\r\n else if (resizeHandleType === ResizeHandleType.Left || resizeHandleType === ResizeHandleType.Right) {\r\n const diff = new Vector3().subVectors(p, resizeAnchor).setZ(0);\r\n const nx = Math.max(1, Math.round(diff.length() / unitX));\r\n const length = nx * unitX;\r\n const v = diff.clone().normalize().multiplyScalar(length);\r\n const worldCenter = new Vector3().addVectors(resizeAnchor, v.clone().divideScalar(2));\r\n const relativeCenter = new Vector3()\r\n .subVectors(worldCenter, worldPositionRef.current)\r\n .applyEuler(new Euler(0, 0, -worldRotationRef.current));\r\n setCommonStore((state) => {\r\n const sp = state.elements.find((e) => e.id === solarPanel.id);\r\n if (!sp) return;\r\n if (Math.abs(Math.abs(sp.normal[1]) - 1) < 0.01) {\r\n sp.cx = relativeCenter.x / lx;\r\n } else {\r\n sp.cy = relativeCenter.y / ly;\r\n }\r\n sp.lx = v.length();\r\n });\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n if (useStore.getState().resizeHandleType === ResizeHandleType.Default) {\r\n // first, reverse the rotation of p.x and p.y around the center of the cuboid\r\n let q = new Vector3(\r\n p.x - worldPositionRef.current.x,\r\n p.y - worldPositionRef.current.y,\r\n 0,\r\n ).applyEuler(new Euler(0, 0, -worldRotationRef.current, 'ZXY'));\r\n // then do the vertex on each face in the de-rotated coordinate system\r\n const polygon = grabRef.current as PolygonModel;\r\n const n = new Vector3().fromArray(polygon.normal);\r\n let lx, ly;\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n // east face\r\n lx = cuboidModel.lz;\r\n ly = cuboidModel.ly;\r\n q.x = -p.z + worldPositionRef.current.z;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n // west face\r\n lx = cuboidModel.lz;\r\n ly = cuboidModel.ly;\r\n q.x = p.z - worldPositionRef.current.z;\r\n } else if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n // north face\r\n lx = cuboidModel.lx;\r\n ly = cuboidModel.lz;\r\n q.y = -p.z + worldPositionRef.current.z;\r\n } else if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n // south face\r\n lx = cuboidModel.lx;\r\n ly = cuboidModel.lz;\r\n q.y = p.z - worldPositionRef.current.z;\r\n } else {\r\n // top face\r\n lx = cuboidModel.lx;\r\n ly = cuboidModel.ly;\r\n }\r\n q = useStore.getState().enableFineGrid ? Util.snapToFineGrid(q) : Util.snapToNormalGrid(q);\r\n q.x /= lx;\r\n q.y /= ly;\r\n updatePolygonVertexPositionById(polygon.id, polygon.selectedIndex, q.x, q.y);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleSolarPanelPointerMoveOnTopSurface = (e: ThreeEvent) => {\r\n if (intersectPlaneRef.current && grabRef.current && cuboidModel) {\r\n if (grabRef.current.type !== ObjectType.SolarPanel || !onTopSurface) return;\r\n const solarPanel = grabRef.current as SolarPanelModel;\r\n if (solarPanel.parentId !== id || solarPanel.locked) return;\r\n raycaster.setFromCamera(mouse, camera);\r\n const intersects = raycaster.intersectObjects([intersectPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n let p = intersects[0].point.clone();\r\n if (useStore.getState().moveHandleType) {\r\n p = Util.relativeCoordinates(p.x, p.y, p.z - solarPanel.poleHeight, cuboidModel);\r\n setElementPosition(solarPanel.id, p.x, p.y, p.z);\r\n } else if (\r\n useStore.getState().rotateHandleType &&\r\n useStore.getState().rotateHandleType !== RotateHandleType.Tilt\r\n ) {\r\n const pr = worldRotationRef.current; //parent rotation\r\n const pc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y); //world parent center\r\n const cc = new Vector2(cuboidModel.lx * solarPanel.cx, cuboidModel.ly * solarPanel.cy) //local current center\r\n .rotateAround(ORIGIN_VECTOR2, pr); //add parent rotation\r\n const wc = new Vector2().addVectors(cc, pc); //world current center\r\n const rotation =\r\n -pr +\r\n Math.atan2(-p.x + wc.x, p.y - wc.y) +\r\n (useStore.getState().rotateHandleType === RotateHandleType.Lower ? 0 : Math.PI);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0; // make sure angle is between -PI to PI\r\n const newAzimuth = rotation + offset;\r\n updateSolarPanelRelativeAzimuthById(solarPanel.id, newAzimuth);\r\n newAzimuthRef.current = newAzimuth;\r\n } else if (useStore.getState().resizeHandleType) {\r\n const resizeAnchor = useStore.getState().resizeAnchor;\r\n const pvModel = getPvModule(solarPanel.pvModelName);\r\n const wp = new Vector2(p.x, p.y);\r\n const resizeAnchor2D = new Vector2(resizeAnchor.x, resizeAnchor.y);\r\n const distance = wp.distanceTo(resizeAnchor2D);\r\n const angle = solarPanel.relativeAzimuth + worldRotationRef.current; // world panel azimuth\r\n const rp = new Vector2().subVectors(wp, resizeAnchor2D); // relative vector from anchor to pointer\r\n switch (useStore.getState().resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n {\r\n const sign = useStore.getState().resizeHandleType === ResizeHandleType.Lower ? 1 : -1;\r\n const theta = rp.angle() - angle + sign * HALF_PI;\r\n let dyl = distance * Math.cos(theta);\r\n if (solarPanel.orientation === Orientation.portrait) {\r\n const nx = Math.max(1, Math.ceil((dyl - pvModel.length / 2) / pvModel.length));\r\n dyl = nx * pvModel.length;\r\n } else {\r\n const nx = Math.max(1, Math.ceil((dyl - pvModel.width / 2) / pvModel.width));\r\n dyl = nx * pvModel.width;\r\n }\r\n const wcx = resizeAnchor.x + (sign * (dyl * Math.sin(angle))) / 2;\r\n const wcy = resizeAnchor.y - (sign * (dyl * Math.cos(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy); // world panel center\r\n const wbc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y); // world foundation center\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -worldRotationRef.current);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarPanelNewSizeOk(solarPanel, newCx, newCy, solarPanel.lx, dyl)) {\r\n updateElementLyById(solarPanel.id, dyl);\r\n setElementPosition(solarPanel.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n {\r\n let sign = useStore.getState().resizeHandleType === ResizeHandleType.Left ? -1 : 1;\r\n const theta =\r\n rp.angle() - angle + (useStore.getState().resizeHandleType === ResizeHandleType.Left ? Math.PI : 0);\r\n let dxl = distance * Math.cos(theta);\r\n if (solarPanel.orientation === Orientation.portrait) {\r\n const nx = Math.max(1, Math.ceil((dxl - pvModel.width / 2) / pvModel.width));\r\n dxl = nx * pvModel.width;\r\n } else {\r\n const nx = Math.max(1, Math.ceil((dxl - pvModel.length / 2) / pvModel.length));\r\n dxl = nx * pvModel.length;\r\n }\r\n const wcx = resizeAnchor.x + (sign * (dxl * Math.cos(angle))) / 2;\r\n const wcy = resizeAnchor.y + (sign * (dxl * Math.sin(angle))) / 2;\r\n const wc = new Vector2(wcx, wcy);\r\n const wbc = new Vector2(worldPositionRef.current.x, worldPositionRef.current.y);\r\n const rc = new Vector2().subVectors(wc, wbc).rotateAround(ORIGIN_VECTOR2, -worldRotationRef.current);\r\n const newCx = rc.x / lx;\r\n const newCy = rc.y / ly;\r\n if (isSolarPanelNewSizeOk(solarPanel, newCx, newCy, dxl, solarPanel.ly)) {\r\n updateElementLxById(solarPanel.id, dxl);\r\n setElementPosition(solarPanel.id, newCx, newCy);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const isSolarPanelNewPositionOk = (sp: SolarPanelModel, cx: number, cy: number) => {\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // only check solar panels on top face\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\r\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const isSolarPanelNewAzimuthOk = (sp: SolarPanelModel, az: number) => {\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.relativeAzimuth = az;\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.RotationCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\r\n showError(i18n.t('message.RotationOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const isSolarPanelNewSizeOk = (sp: SolarPanelModel, cx: number, cy: number, lx: number, ly: number) => {\r\n // check if the new length will cause the solar panel to intersect with the foundation\r\n if (sp.tiltAngle !== 0 && 0.5 * ly * Math.abs(Math.sin(sp.tiltAngle)) > sp.poleHeight) {\r\n return false;\r\n }\r\n // check if the new size will be within the foundation\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n clone.lx = lx;\r\n clone.ly = ly;\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(clone, cuboidModel)) {\r\n // showError(i18n.t('message.ResizingOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const handlePointerUp = () => {\r\n if (!grabRef.current) return;\r\n const elem = getElementById(grabRef.current.id);\r\n if (!elem || elem.parentId !== id) return;\r\n if (elem.type === ObjectType.Polygon) {\r\n if (useStore.getState().moveHandleType || useStore.getState().resizeHandleType) {\r\n newVerticesRef.current = (elem as PolygonModel).vertices.map((v) => ({ ...v }));\r\n const undoableEditPolygon = {\r\n name: useStore.getState().moveHandleType ? 'Move Polygon' : 'Resize Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldVerticesRef.current,\r\n newValue: newVerticesRef.current,\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n undo: () => {\r\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.oldValue as Point2[]);\r\n },\r\n redo: () => {\r\n updatePolygonVerticesById(undoableEditPolygon.changedElementId, undoableEditPolygon.newValue as Point2[]);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableEditPolygon);\r\n }\r\n } else {\r\n if (useStore.getState().resizeHandleType) {\r\n newPositionRef.current.x = elem.cx;\r\n newPositionRef.current.y = elem.cy;\r\n newPositionRef.current.z = elem.cz;\r\n newDimensionRef.current.x = elem.lx;\r\n newDimensionRef.current.y = elem.ly;\r\n newDimensionRef.current.z = elem.lz;\r\n if (\r\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE &&\r\n newDimensionRef.current.distanceToSquared(oldDimensionRef.current) > ZERO_TOLERANCE\r\n ) {\r\n const undoableResize = {\r\n name: 'Resize',\r\n timestamp: Date.now(),\r\n resizedElementId: grabRef.current.id,\r\n resizedElementType: grabRef.current.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n oldLx: oldDimensionRef.current.x,\r\n oldLy: oldDimensionRef.current.y,\r\n oldLz: oldDimensionRef.current.z,\r\n newLx: newDimensionRef.current.x,\r\n newLy: newDimensionRef.current.y,\r\n newLz: newDimensionRef.current.z,\r\n undo: () => {\r\n setElementPosition(\r\n undoableResize.resizedElementId,\r\n undoableResize.oldCx,\r\n undoableResize.oldCy,\r\n undoableResize.oldCz,\r\n );\r\n setElementSize(\r\n undoableResize.resizedElementId,\r\n undoableResize.oldLx,\r\n undoableResize.oldLy,\r\n undoableResize.oldLz,\r\n );\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableResize.resizedElementId,\r\n undoableResize.newCx,\r\n undoableResize.newCy,\r\n undoableResize.newCz,\r\n );\r\n setElementSize(\r\n undoableResize.resizedElementId,\r\n undoableResize.newLx,\r\n undoableResize.newLy,\r\n undoableResize.newLz,\r\n );\r\n },\r\n } as UndoableResize;\r\n addUndoable(undoableResize);\r\n }\r\n } else if (useStore.getState().rotateHandleType) {\r\n // currently, solar panels are the only type of child that can be rotated\r\n if (grabRef.current.type === ObjectType.SolarPanel) {\r\n const solarPanel = grabRef.current as SolarPanelModel;\r\n if (Math.abs(newAzimuthRef.current - oldAzimuthRef.current) > ZERO_TOLERANCE) {\r\n if (isSolarPanelNewAzimuthOk(solarPanel, newAzimuthRef.current)) {\r\n setCommonStore((state) => {\r\n state.selectedElementAngle = newAzimuthRef.current;\r\n });\r\n const undoableRotate = {\r\n name: 'Rotate',\r\n timestamp: Date.now(),\r\n oldValue: oldAzimuthRef.current,\r\n newValue: newAzimuthRef.current,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n updateSolarPanelRelativeAzimuthById(\r\n undoableRotate.changedElementId,\r\n undoableRotate.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableRotate);\r\n } else {\r\n updateSolarPanelRelativeAzimuthById(solarPanel.id, oldAzimuthRef.current);\r\n }\r\n }\r\n }\r\n } else {\r\n // for moving sensors, lights, and solar panels\r\n newPositionRef.current.x = elem.cx;\r\n newPositionRef.current.y = elem.cy;\r\n newPositionRef.current.z = elem.cz;\r\n newNormalRef.current.fromArray(elem.normal);\r\n if (newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE) {\r\n let accept = true;\r\n if (elem.type === ObjectType.SolarPanel) {\r\n accept = isSolarPanelNewPositionOk(elem as SolarPanelModel, elem.cx, elem.cy);\r\n }\r\n if (accept) {\r\n const undoableMove = {\r\n name: 'Move',\r\n timestamp: Date.now(),\r\n movedElementId: grabRef.current.id,\r\n movedElementType: grabRef.current?.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n oldNormal: oldNormalRef.current.clone(),\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n newNormal: newNormalRef.current.clone(),\r\n undo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.oldCx,\r\n undoableMove.oldCy,\r\n undoableMove.oldCz,\r\n );\r\n if (undoableMove.oldNormal) {\r\n setElementNormal(\r\n undoableMove.movedElementId,\r\n undoableMove.oldNormal.x,\r\n undoableMove.oldNormal.y,\r\n undoableMove.oldNormal.z,\r\n );\r\n }\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.newCx,\r\n undoableMove.newCy,\r\n undoableMove.newCz,\r\n );\r\n if (undoableMove.newNormal) {\r\n setElementNormal(\r\n undoableMove.movedElementId,\r\n undoableMove.newNormal.x,\r\n undoableMove.newNormal.y,\r\n undoableMove.newNormal.z,\r\n );\r\n }\r\n },\r\n } as UndoableMove;\r\n addUndoable(undoableMove);\r\n } else {\r\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n }\r\n }\r\n }\r\n }\r\n grabRef.current = null;\r\n };\r\n\r\n const handlePointerOver = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n };\r\n\r\n const handlePointerEnter = (e: ThreeEvent) => {\r\n // TODO: make tree, flower, and human legal\r\n if (grabRef.current && Util.isPlantOrHuman(grabRef.current)) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setShowGrid(true);\r\n }\r\n }\r\n };\r\n\r\n const handlePointerOut = () => {\r\n setHovered(false);\r\n if (grabRef.current) {\r\n switch (grabRef.current.type) {\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n setShowGrid(false);\r\n break;\r\n case ObjectType.SolarPanel:\r\n // Have to get the latest from the store (we may change this to ref in the future)\r\n const sp = useStore.getState().getElementById(grabRef.current.id) as SolarPanelModel;\r\n if (useStore.getState().moveHandleType && !isSolarPanelNewPositionOk(sp, sp.cx, sp.cy)) {\r\n setElementPosition(sp.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n state.pastePoint.copy(e.intersections[0].point);\r\n const face = e.intersections[0].face;\r\n if (face) {\r\n state.pasteNormal = face.normal.clone();\r\n if (Util.isSame(face.normal, UNIT_VECTOR_POS_X)) {\r\n state.selectedSideIndex = 0;\r\n } else if (Util.isSame(face.normal, UNIT_VECTOR_NEG_X)) {\r\n state.selectedSideIndex = 1;\r\n } else if (Util.isSame(face.normal, UNIT_VECTOR_POS_Y)) {\r\n state.selectedSideIndex = 2;\r\n } else if (Util.isSame(face.normal, UNIT_VECTOR_NEG_Y)) {\r\n state.selectedSideIndex = 3;\r\n } else if (Util.isSame(face.normal, UNIT_VECTOR_POS_Z)) {\r\n state.selectedSideIndex = 4;\r\n }\r\n }\r\n state.clickObjectType = ObjectType.Cuboid;\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Cuboid;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const opacity = groundImage ? (orthographic ? 0.25 : 0.75) : 1;\r\n\r\n const faces: number[] = [0, 1, 2, 3, 4, 5];\r\n const textures = [\r\n showSolarRadiationHeatmap && heatmapTextureEast ? heatmapTextureEast : textureEast,\r\n showSolarRadiationHeatmap && heatmapTextureWest ? heatmapTextureWest : textureWest,\r\n showSolarRadiationHeatmap && heatmapTextureNorth ? heatmapTextureNorth : textureNorth,\r\n showSolarRadiationHeatmap && heatmapTextureSouth ? heatmapTextureSouth : textureSouth,\r\n showSolarRadiationHeatmap && heatmapTextureTop ? heatmapTextureTop : textureTop,\r\n null,\r\n ];\r\n const materials =\r\n cuboidModel && cuboidModel.faceColors ? (\r\n faces.map((i) => {\r\n if (textureTypes && textureTypes[i] !== CuboidTexture.NoTexture) {\r\n return showSolarRadiationHeatmap ? (\r\n \r\n ) : (\r\n \r\n );\r\n } else {\r\n return showSolarRadiationHeatmap ? (\r\n \r\n ) : (\r\n \r\n );\r\n }\r\n })\r\n ) : (\r\n \r\n );\r\n\r\n const handleArgs = useMemo(() => [hx, hy, hz], [hx, hy, hz]);\r\n\r\n const showHandles = selected && !locked;\r\n\r\n return (\r\n \r\n {/* draw rectangular cuboid */}\r\n \r\n {materials}\r\n \r\n\r\n {/* intersection plane that goes through the center of the selected solar panel */}\r\n {grabRef.current?.type === ObjectType.SolarPanel && onTopSurface && !grabRef.current.locked && (\r\n \r\n )}\r\n\r\n {showGrid && (\r\n <>\r\n {(useStore.getState().moveHandleType || useStore.getState().resizeHandleType) && (\r\n \r\n )}\r\n {useStore.getState().rotateHandleType &&\r\n grabRef.current &&\r\n grabRef.current.type === ObjectType.SolarPanel && (\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* ruler */}\r\n {selected && }\r\n\r\n {/* wireFrame */}\r\n {(!selected || groundImage) && (\r\n \r\n )}\r\n\r\n {/* highlight with a thick wireframe when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* handles */}\r\n {showHandles && }\r\n\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Cuboid);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport { Box, Cylinder, Sphere } from '@react-three/drei';\r\nimport { Euler, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { SensorModel } from '../models/SensorModel';\r\nimport { useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType } from '../types';\r\nimport { Util } from '../Util';\r\nimport Wireframe from '../components/wireframe';\r\nimport i18n from '../i18n/i18n';\r\nimport { WallModel } from '../models/WallModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { getRotationFromNormal } from './solarPanel/solarPanelOnCuboid';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Sensor = (sensorModel: SensorModel) => {\r\n let {\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx = 1,\r\n ly = 1,\r\n lz = 0.1,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.1,\r\n locked = false,\r\n showLabel = false,\r\n parentId,\r\n foundationId,\r\n light = true,\r\n heatFlux = false,\r\n } = sensorModel;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const selectMe = useStore(Selector.selectMe);\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const baseRef = useRef();\r\n const handleRef = useRef();\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n const foundation = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === foundationId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = parent.cz + parent.lz / 2;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (foundation?.type === ObjectType.Foundation) {\r\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\r\n cx = absoluteCoordinates.x;\r\n cy = absoluteCoordinates.y;\r\n cz = absoluteCoordinates.z;\r\n }\r\n break;\r\n case ObjectType.Roof:\r\n if (foundation?.type === ObjectType.Foundation) {\r\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\r\n cx = absoluteCoordinates.x;\r\n cy = absoluteCoordinates.y;\r\n cz = absoluteCoordinates.z;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n const hz = lz / 2;\r\n\r\n const euler = useMemo(() => {\r\n if (parent?.type === ObjectType.Wall) {\r\n const wall = parent as WallModel;\r\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\r\n return new Euler(HALF_PI, 0, wallAbsAngle, 'ZXY');\r\n }\r\n if (parent?.type === ObjectType.Roof) {\r\n return new Euler(\r\n rotation[0],\r\n rotation[1],\r\n foundation ? foundation.rotation[2] + rotation[2] : rotation[2],\r\n 'ZXY',\r\n );\r\n }\r\n if (parent?.type === ObjectType.Cuboid) {\r\n return getRotationFromNormal(normal);\r\n }\r\n // the normal below seems to be relative to its parent\r\n const n = new Vector3().fromArray(normal);\r\n // east face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n return new Euler(0, HALF_PI, rotation[2], 'ZXY');\r\n }\r\n // west face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n return new Euler(0, -HALF_PI, rotation[2], 'ZXY');\r\n }\r\n // south face in the model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n return new Euler(-HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // north face in the model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // top face in model coordinate system\r\n return new Euler(0, 0, rotation[2]);\r\n }, [normal, rotation, foundation?.rotation]);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (sensorModel?.label ? sensorModel.label : i18n.t('shared.SensorElement', lang)) +\r\n (sensorModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang)\r\n );\r\n }, [sensorModel?.label, locked, language, cx, cy, cz]);\r\n\r\n return (\r\n \r\n {/* draw rectangle (too small to cast shadow) */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Default;\r\n });\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Sensor;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={() => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* wireFrame */}\r\n {!selected && }\r\n\r\n {/* highlight with a thick wireframe when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* draw handle */}\r\n {selected && !locked && (\r\n {\r\n if (e.button === 2) {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === handleRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Sensor;\r\n }\r\n }\r\n });\r\n } else {\r\n selectMe(id, e, ActionType.Move);\r\n }\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n setCommonStore((state) => {\r\n state.moveHandleType = MoveHandleType.Default;\r\n });\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Sensor);\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport { Cylinder, Sphere } from '@react-three/drei';\r\nimport { Euler, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n TWO_PI,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType } from '../types';\r\nimport { Util } from '../Util';\r\nimport Wireframe from '../components/wireframe';\r\nimport i18n from '../i18n/i18n';\r\nimport { WallModel } from '../models/WallModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport { LightModel } from '../models/LightModel';\r\nimport { RoofModel } from '../models/RoofModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { getRotationFromNormal } from './solarPanel/solarPanelOnCuboid';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Light = (lightModel: LightModel) => {\r\n let {\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx = 1,\r\n ly = 1,\r\n lz = 0.1,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = '#ffff99',\r\n lineColor = 'black',\r\n lineWidth = 0.1,\r\n locked = false,\r\n showLabel = false,\r\n parentId,\r\n foundationId,\r\n decay = 2,\r\n distance = 5,\r\n intensity = 3,\r\n inside = false,\r\n } = lightModel;\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sunlightDirection = useStore(Selector.sunlightDirection);\r\n const night = sunlightDirection.z <= 0;\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const baseRef = useRef();\r\n const handleRef = useRef();\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n const foundation = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === foundationId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n let parentThickness = 0.1;\r\n\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = parent.cz + parent.lz / 2;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (foundation?.type === ObjectType.Foundation) {\r\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\r\n cx = absoluteCoordinates.x;\r\n cy = absoluteCoordinates.y;\r\n cz = absoluteCoordinates.z;\r\n }\r\n parentThickness = (parent as WallModel).ly;\r\n break;\r\n case ObjectType.Roof:\r\n if (foundation?.type === ObjectType.Foundation) {\r\n const absoluteCoordinates = Util.absoluteCoordinates(cx, cy, cz, parent, foundation as FoundationModel);\r\n cx = absoluteCoordinates.x;\r\n cy = absoluteCoordinates.y;\r\n cz = absoluteCoordinates.z;\r\n }\r\n parentThickness = (parent as RoofModel).thickness;\r\n break;\r\n }\r\n }\r\n }\r\n const hz = lz / 2;\r\n\r\n const euler = useMemo(() => {\r\n if (parent?.type === ObjectType.Wall) {\r\n const wall = parent as WallModel;\r\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\r\n return new Euler(HALF_PI, 0, wallAbsAngle, 'ZXY');\r\n }\r\n if (parent?.type === ObjectType.Roof) {\r\n return new Euler(\r\n rotation[0],\r\n rotation[1],\r\n foundation ? foundation.rotation[2] + rotation[2] : rotation[2],\r\n 'ZXY',\r\n );\r\n }\r\n if (parent?.type === ObjectType.Cuboid) {\r\n return getRotationFromNormal(normal);\r\n }\r\n // the normal below seems to be relative to its parent\r\n const n = new Vector3().fromArray(normal);\r\n // east face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_X)) {\r\n return new Euler(0, HALF_PI, rotation[2], 'ZXY');\r\n }\r\n // west face in model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_X)) {\r\n return new Euler(0, -HALF_PI, rotation[2], 'ZXY');\r\n }\r\n // south face in the model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_POS_Y)) {\r\n return new Euler(-HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // north face in the model coordinate system\r\n if (Util.isSame(n, UNIT_VECTOR_NEG_Y)) {\r\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // top face in model coordinate system\r\n return new Euler(0, 0, rotation[2]);\r\n }, [normal, rotation, foundation?.rotation]);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (lightModel?.label ? lightModel.label : i18n.t('shared.LightElement', lang)) +\r\n (lightModel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang)\r\n );\r\n }, [lightModel?.label, locked, language, cx, cy, cz]);\r\n\r\n return (\r\n \r\n {night && (\r\n \r\n )}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Light;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={() => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n {night ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {/* highlight with a thick wireframe when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* draw handle */}\r\n {selected && !locked && (\r\n {\r\n if (e.button === 2) {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === handleRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Light;\r\n }\r\n }\r\n });\r\n } else {\r\n selectMe(id, e, ActionType.Move);\r\n }\r\n useRefStore.getState().setEnableOrbitController(false);\r\n usePrimitiveStore.setState((state) => {\r\n state.showWallIntersectionPlaneId = parentId;\r\n state.oldParentId = parentId;\r\n state.oldFoundationId = foundationId;\r\n });\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Light);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { CuboidModel } from 'src/models/CuboidModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { isStackableModel } from 'src/models/Stackable';\r\nimport { useStore } from 'src/stores/common';\r\nimport Cuboid from './cuboid';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ObjectType } from 'src/types';\r\nimport SolarPanelOnCuboid from '../solarPanel/solarPanelOnCuboid';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport Sensor from '../sensor';\r\nimport { SensorModel } from 'src/models/SensorModel';\r\nimport Light from '../light';\r\nimport { LightModel } from 'src/models/LightModel';\r\nimport { GROUND_ID } from '../../constants';\r\n\r\nexport interface CuboidRendererProps {\r\n elements: ElementModel[];\r\n cuboidModel: CuboidModel;\r\n}\r\n\r\nexport const CUBOID_WRAPPER_NAME = 'Cuboid Wrapper';\r\n\r\nexport const CUBOID_STACKABLE_CHILD = 'Cuboid Stackable Child';\r\n\r\nconst CuboidRenderer = ({ elements, cuboidModel }: CuboidRendererProps) => {\r\n const { cx, cy, lz, rotation } = cuboidModel;\r\n\r\n const hz = lz / 2;\r\n\r\n const isStackableChild = (e: ElementModel) => isStackableModel(e) && e.parentId === cuboidModel.id;\r\n\r\n return (\r\n <>\r\n \r\n \r\n\r\n {elements.map((e) => {\r\n if (isStackableChild(e)) {\r\n return (\r\n \r\n \r\n \r\n );\r\n } else if (e.parentId === cuboidModel.id) {\r\n const { lx, ly, lz } = cuboidModel;\r\n switch (e.type) {\r\n case ObjectType.SolarPanel: {\r\n return (\r\n \r\n );\r\n }\r\n case ObjectType.Sensor: {\r\n return ;\r\n }\r\n case ObjectType.Light: {\r\n return ;\r\n }\r\n default:\r\n return null;\r\n }\r\n }\r\n })}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CuboidRenderer;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport {\r\n FINE_GRID_SCALE,\r\n GROUND_ID,\r\n HALF_PI,\r\n LAT_LNG_FRACTION_DIGITS,\r\n NORMAL_GRID_SCALE,\r\n ORIGIN_VECTOR2,\r\n SOLAR_HEATMAP_COLORS,\r\n TWO_PI,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n ZERO_TOLERANCE,\r\n} from './constants';\r\nimport { CanvasTexture, Color, Euler, Object3D, Quaternion, Scene, Triangle, Vector2, Vector3 } from 'three';\r\nimport { ElementModel } from './models/ElementModel';\r\nimport { SolarPanelModel } from './models/SolarPanelModel';\r\nimport {\r\n BuildingCompletionStatus,\r\n Design,\r\n ElementState,\r\n ModelSite,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RoofHandleType,\r\n RotateHandleType,\r\n TrackerType,\r\n} from './types';\r\nimport { PvModel } from './models/PvModel';\r\nimport { SensorModel } from './models/SensorModel';\r\nimport { WallFill, WallModel } from './models/WallModel';\r\nimport { PolygonModel } from './models/PolygonModel';\r\nimport { Point2 } from './models/Point2';\r\nimport { useStore } from './stores/common';\r\nimport { SolarCollector } from './models/SolarCollector';\r\nimport { Rectangle } from './models/Rectangle';\r\nimport platform from 'platform';\r\nimport { RoofModel, RoofType } from './models/RoofModel';\r\nimport { RoofUtil } from './views/roof/RoofUtil';\r\nimport { FoundationModel } from './models/FoundationModel';\r\nimport { WindowModel, WindowType } from './models/WindowModel';\r\nimport { DoorModel, DoorType } from './models/DoorModel';\r\nimport { CUBOID_STACKABLE_CHILD, CUBOID_WRAPPER_NAME } from './views/cuboid';\r\n\r\nexport class Util {\r\n // calculate the annual profit in 1,000 dollars\r\n static calculateProfit(design: Design): number {\r\n return (design.yearlyYield * design.sellingPrice - design.panelCount * design.unitCost * 365) * 0.001;\r\n }\r\n\r\n static calculateCost(design: Design): number {\r\n return design.panelCount * design.unitCost * 0.365;\r\n }\r\n\r\n static getLatLngKey(lat: number, lng: number): string {\r\n return lat.toFixed(LAT_LNG_FRACTION_DIGITS) + ', ' + lng.toFixed(LAT_LNG_FRACTION_DIGITS);\r\n }\r\n\r\n static getModelKey(model: ModelSite): string {\r\n return model.title + ', ' + model.userid;\r\n }\r\n\r\n static resizeCanvas(canvas: HTMLCanvasElement, newWidth: number, newHeight?: number): HTMLCanvasElement {\r\n const resizedCanvas = document.createElement('canvas');\r\n resizedCanvas.width = newWidth;\r\n resizedCanvas.height = newHeight ? newHeight : (newWidth * canvas.height) / canvas.width;\r\n const ctx = resizedCanvas.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(canvas, 0, 0, canvas.width, canvas.height, 0, 0, resizedCanvas.width, resizedCanvas.height);\r\n }\r\n return resizedCanvas;\r\n }\r\n\r\n static getEuler(\r\n from: Vector3,\r\n to: Vector3,\r\n order?: string,\r\n rotateX?: number,\r\n rotateY?: number,\r\n rotateZ?: number,\r\n ): Euler {\r\n const quaternion = new Quaternion();\r\n quaternion.setFromUnitVectors(from, to);\r\n const euler = new Euler();\r\n euler.setFromQuaternion(quaternion);\r\n if (order) euler.order = order;\r\n if (rotateX) euler.x += rotateX;\r\n if (rotateY) euler.y += rotateY;\r\n if (rotateZ) euler.z += rotateZ;\r\n return euler;\r\n }\r\n\r\n static zero2DArray(array: number[][]): void {\r\n for (let i = 0; i < array.length; i++) {\r\n for (let j = 0; j < array[i].length; j++) {\r\n array[i][j] = 0;\r\n }\r\n }\r\n }\r\n\r\n static getTriangleArea(a: Vector3, b: Vector3, c: Vector3): number {\r\n return new Triangle(a, b, c).getArea();\r\n }\r\n\r\n static getPolygonArea(vertices: Point2[]): number {\r\n let total = 0;\r\n for (let i = 0, l = vertices.length; i < l; i++) {\r\n const addX = vertices[i].x;\r\n const addY = vertices[i === vertices.length - 1 ? 0 : i + 1].y;\r\n const subX = vertices[i === vertices.length - 1 ? 0 : i + 1].x;\r\n const subY = vertices[i].y;\r\n total += addX * addY;\r\n total -= subX * subY;\r\n }\r\n return Math.abs(total) * 0.5;\r\n }\r\n\r\n static getBuildingArea(foundation: FoundationModel, elements: ElementModel[]): number {\r\n let area = 0;\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === foundation.id) {\r\n area += Util.calculateBuildingArea(e as RoofModel);\r\n }\r\n }\r\n return area;\r\n }\r\n\r\n static getBuildingCompletionStatus(foundation: FoundationModel, elements: ElementModel[]): BuildingCompletionStatus {\r\n // check roof first\r\n let hasRoof = false;\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof) {\r\n if (e.foundationId === foundation.id) {\r\n hasRoof = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!hasRoof) return BuildingCompletionStatus.ROOF_MISSING;\r\n // check walls now\r\n\r\n // let emptyWall = false;\r\n // for (const e of elements) {\r\n // if (e.type === ObjectType.Wall) {\r\n // if (e.foundationId === foundation.id) {\r\n // const wall = e as WallModel;\r\n // if (wall.fill === WallFill.Empty) {\r\n // emptyWall = true;\r\n // break;\r\n // }\r\n // }\r\n // }\r\n // }\r\n // if (emptyWall) return BuildingCompletionStatus.WALL_EMPTY;\r\n\r\n // check if the walls are joined\r\n const walls: WallModel[] = [];\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundation.id) {\r\n walls.push(e as WallModel);\r\n }\r\n }\r\n if (walls.length > 0) {\r\n for (const w of walls) {\r\n if (!w.leftJoints || w.leftJoints.length === 0) return BuildingCompletionStatus.WALL_DISJOINED;\r\n if (!w.rightJoints || w.rightJoints.length === 0) return BuildingCompletionStatus.WALL_DISJOINED;\r\n }\r\n }\r\n return BuildingCompletionStatus.COMPLETE;\r\n }\r\n\r\n static calculateBuildingArea(roof: RoofModel): number {\r\n const wallPoints = Util.getWallPointsOfRoof(roof);\r\n return Util.getPolygonArea(wallPoints);\r\n }\r\n\r\n static toUValueInUS(uValueInSI: number): number {\r\n return uValueInSI / 5.67826;\r\n }\r\n\r\n static toUValueInSI(uValueInUS: number): number {\r\n return uValueInUS * 5.67826;\r\n }\r\n\r\n static toRValueInUS(rValueInSI: number): number {\r\n return rValueInSI * 5.67826;\r\n }\r\n\r\n static toRValueInSI(rValueInUS: number): number {\r\n return rValueInUS / 5.67826;\r\n }\r\n\r\n static WATER_TEXTURE = Util.fetchWaterTexture(100, 100);\r\n static WHITE_TEXTURE = Util.fetchWhiteTexture(2, 2);\r\n\r\n static fetchWaterTexture(w: number, h: number): CanvasTexture {\r\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\r\n canvas.width = w;\r\n canvas.height = h;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n const grd = ctx.createRadialGradient(w / 2, h / 2, 0, w / 2, h / 2, Math.max(w, h) / 2);\r\n grd.addColorStop(0, '#45AAEA');\r\n grd.addColorStop(0.04, '#2B65EC');\r\n grd.addColorStop(0.2, '#0000FF');\r\n ctx.fillStyle = grd;\r\n ctx.fillRect(0, 0, w, h);\r\n }\r\n return new CanvasTexture(canvas);\r\n }\r\n\r\n static fetchWhiteTexture(w: number, h: number): CanvasTexture {\r\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\r\n canvas.width = w;\r\n canvas.height = h;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n ctx.fillStyle = 'white';\r\n ctx.fillRect(0, 0, w, h);\r\n }\r\n return new CanvasTexture(canvas);\r\n }\r\n\r\n static fetchIntersectables(scene: Scene): Object3D[] {\r\n const objects: Object3D[] = [];\r\n scene.traverse((o) => {\r\n if (!o.userData.unintersectable) {\r\n objects.push(o);\r\n }\r\n });\r\n return objects;\r\n }\r\n\r\n static fetchSimulationElements(obj: Object3D, arr: Object3D[]): void {\r\n if (obj.userData['simulation']) {\r\n arr.push(obj);\r\n }\r\n if (obj.children.length > 0) {\r\n for (const c of obj.children) {\r\n Util.fetchSimulationElements(c, arr);\r\n }\r\n }\r\n }\r\n\r\n static getSimulationElements(obj: Object3D, arr: Object3D[], id?: string): void {\r\n if (obj.userData['simulation'] && obj.uuid !== id) {\r\n arr.push(obj);\r\n }\r\n if (obj.children.length > 0) {\r\n for (const c of obj.children) {\r\n Util.getSimulationElements(c, arr, id);\r\n }\r\n }\r\n }\r\n\r\n static hasMovingParts(elements: ElementModel[]): boolean {\r\n for (const e of elements) {\r\n switch (e.type) {\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n return true;\r\n case ObjectType.SolarPanel:\r\n if ((e as SolarPanelModel).trackerType !== TrackerType.NO_TRACKER) return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n static onBuildingEnvelope(e: ElementModel): boolean {\r\n return (\r\n e.type === ObjectType.Foundation ||\r\n e.type === ObjectType.Window ||\r\n e.type === ObjectType.Door ||\r\n e.type === ObjectType.Wall ||\r\n e.type === ObjectType.Roof\r\n );\r\n }\r\n\r\n // Area of an arch given height and radius: https://keisan.casio.com/exec/system/14407397055469\r\n static getWindowArea(window: WindowModel, parent?: ElementModel): number {\r\n if (parent) {\r\n // if parent is set, window dimension is relative to it (e.g., when it is on a wall)\r\n if (window.windowType === WindowType.Arched && window.archHeight > 0) {\r\n const hx = 0.5 * window.lx * parent.lx;\r\n const lz = window.lz * parent.lz;\r\n const ah = Math.min(window.archHeight, lz, hx); // actual arc height\r\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\r\n const startAngle = Math.acos(Math.min(hx / r, 1));\r\n const extent = Math.PI - startAngle * 2;\r\n return 0.5 * extent * r * r - hx * (r - ah) + (lz - ah) * hx * 2;\r\n } else if (window.windowType === WindowType.Polygonal && window.polygonTop) {\r\n let a = window.lx * window.lz * parent.lx * parent.lz;\r\n a += (window.lx * parent.lx * window.polygonTop[1]) / 2;\r\n return a;\r\n }\r\n return window.lx * window.lz * parent.lx * parent.lz;\r\n } else {\r\n // if parent is not set, window dimension is absolute (e.g., when it is on a roof)\r\n if (window.windowType === WindowType.Arched && window.archHeight > 0) {\r\n const hx = 0.5 * window.lx;\r\n const lz = window.lz;\r\n const ah = Math.min(window.archHeight, lz, hx); // actual arc height\r\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\r\n const startAngle = Math.acos(Math.min(hx / r, 1));\r\n const extent = Math.PI - startAngle * 2;\r\n return 0.5 * extent * r * r - hx * (r - ah) + (lz - ah) * hx * 2;\r\n } else if (window.windowType === WindowType.Polygonal && window.polygonTop) {\r\n let a = window.lx * window.lz;\r\n a += (window.lx * window.polygonTop[1]) / 2;\r\n return a;\r\n }\r\n return window.lx * window.lz;\r\n }\r\n }\r\n\r\n // Area of an arch given height and radius: https://keisan.casio.com/exec/system/14407397055469\r\n static getDoorArea(door: DoorModel, parent?: ElementModel): number {\r\n if (parent) {\r\n // if parent is set, door dimension is relative to it\r\n if (door.doorType === DoorType.Arched && door.archHeight > 0) {\r\n const hx = 0.5 * door.lx * parent.lx;\r\n const lz = door.lz * parent.lz;\r\n const ah = Math.min(door.archHeight, lz, hx); // actual arch height\r\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\r\n const startAngle = Math.acos(Math.min(hx / r, 1));\r\n const extent = Math.PI - startAngle * 2;\r\n return 0.5 * extent * r * r - hx * (r - ah) + (lz - ah) * hx * 2;\r\n }\r\n return door.lx * door.lz * parent.lx * parent.lz;\r\n } else {\r\n // if parent is not set, door dimension is absolute\r\n if (door.doorType === DoorType.Arched && door.archHeight > 0) {\r\n const hx = 0.5 * door.lx;\r\n const lz = door.lz;\r\n const ah = Math.min(door.archHeight, lz, hx); // actual arch height\r\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\r\n const startAngle = Math.acos(Math.min(hx / r, 1));\r\n const extent = Math.PI - startAngle * 2;\r\n return 0.5 * extent * r * r - hx * (r - ah) + (lz - ah) * hx * 2;\r\n }\r\n return door.lx * door.lz;\r\n }\r\n }\r\n\r\n static hasHeliostatOrFresnelReflectors(elements: ElementModel[]): boolean {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector || e.type === ObjectType.Heliostat) return true;\r\n }\r\n return false;\r\n }\r\n\r\n static lineIntersection(from1: Point2, to1: Point2, from2: Point2, to2: Point2): Point2 | undefined {\r\n const dx: number = to1.x - from1.x;\r\n const dy: number = to1.y - from1.y;\r\n\r\n const determinant: number = dx * (to2.y - from2.y) - (to2.x - from2.x) * dy;\r\n if (determinant === 0) return undefined; // parallel lines\r\n\r\n const lambda: number =\r\n ((to2.y - from2.y) * (to2.x - from1.x) + (from2.x - to2.x) * (to2.y - from1.y)) / determinant;\r\n const gamma: number = ((from1.y - to1.y) * (to2.x - from1.x) + dx * (to2.y - from1.y)) / determinant;\r\n\r\n // check if there is an intersection\r\n if (!(0 <= lambda && lambda <= 1) || !(0 <= gamma && gamma <= 1)) return undefined;\r\n\r\n return {\r\n x: from1.x + lambda * dx,\r\n y: from1.y + lambda * dy,\r\n } as Point2;\r\n }\r\n\r\n static calculateSolarRadiationColor(value: number, maxValue: number): Color {\r\n const valuePerColorRange = maxValue / (SOLAR_HEATMAP_COLORS.length - 1);\r\n let colorIndex = Math.max(0, Math.floor(value / valuePerColorRange));\r\n if (colorIndex > SOLAR_HEATMAP_COLORS.length - 2) colorIndex = SOLAR_HEATMAP_COLORS.length - 2;\r\n const scalar = Math.min(1, (value - valuePerColorRange * colorIndex) / valuePerColorRange);\r\n return new Color(SOLAR_HEATMAP_COLORS[colorIndex]).lerp(SOLAR_HEATMAP_COLORS[colorIndex + 1], scalar);\r\n }\r\n\r\n static transpose(array2d: number[][]): number[][] {\r\n return array2d[0].map((col, i) => array2d.map((row) => row[i]));\r\n }\r\n\r\n static clone2DArray(array: any[][]) {\r\n return array.map((row) => [...row]);\r\n }\r\n\r\n static fetchHeatmapTexture(data: number[][] | undefined, maxValue: number, flip?: boolean): CanvasTexture | null {\r\n if (!data) return null;\r\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\r\n const w = data.length;\r\n const h = data[0].length;\r\n canvas.width = w;\r\n canvas.height = h;\r\n const ctx = canvas.getContext('2d');\r\n if (ctx) {\r\n ctx.clearRect(0, 0, w, h);\r\n const imageData = ctx.getImageData(0, 0, w, h);\r\n const pixels = imageData.data;\r\n for (let i = 0; i < w; i++) {\r\n for (let j = 0; j < h; j++) {\r\n const c = Util.calculateSolarRadiationColor(data[flip ? w - 1 - i : i][j], maxValue);\r\n const off = ((h - 1 - j) * w + i) * 4;\r\n pixels[off] = Math.floor(c.r * 255);\r\n pixels[off + 1] = Math.floor(c.g * 255);\r\n pixels[off + 2] = Math.floor(c.b * 255);\r\n pixels[off + 3] = 255;\r\n }\r\n }\r\n ctx.putImageData(imageData, 0, 0);\r\n }\r\n return new CanvasTexture(canvas);\r\n }\r\n\r\n static countSolarPanelsOnRack(rack: SolarPanelModel, pvModel: PvModel): number {\r\n let count = 0;\r\n if (pvModel && rack) {\r\n let nx, ny;\r\n if (rack.orientation === Orientation.portrait) {\r\n nx = Math.max(1, Math.round(rack.lx / pvModel.width));\r\n ny = Math.max(1, Math.round(rack.ly / pvModel.length));\r\n } else {\r\n nx = Math.max(1, Math.round(rack.lx / pvModel.length));\r\n ny = Math.max(1, Math.round(rack.ly / pvModel.width));\r\n }\r\n count += nx * ny;\r\n }\r\n return count;\r\n }\r\n\r\n static countAllSolarPanelDailyYields(): number {\r\n let total = 0;\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.SolarPanel) {\r\n total += (e as SolarPanelModel).dailyYield ?? 0;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n static countAllSolarPanelYearlyYields(): number {\r\n let total = 0;\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.SolarPanel) {\r\n total += (e as SolarPanelModel).yearlyYield ?? 0;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n static countAllSolarPanels(): number {\r\n let count = 0;\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.SolarPanel) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = useStore.getState().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n count += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n static hasSolarPanels(elements: ElementModel[]): boolean {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel) return true;\r\n }\r\n return false;\r\n }\r\n\r\n // special case as a rack may have many solar panels\r\n static countAllChildSolarPanels(parentId: string, excludeLocked?: boolean): number {\r\n let count = 0;\r\n const elements = useStore.getState().elements;\r\n if (excludeLocked) {\r\n for (const e of elements) {\r\n if (!e.locked && e.type === ObjectType.SolarPanel && e.parentId === parentId) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = useStore.getState().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n count += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === parentId) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = useStore.getState().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n count += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n }\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n static countAllChildSolarPanelDailyYields(parentId: string): number {\r\n let total = 0;\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === parentId) {\r\n total += (e as SolarPanelModel).dailyYield ?? 0;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n static countAllChildElementsByType(parentId: string, type: ObjectType, excludeLocked?: boolean): number {\r\n let count = 0;\r\n const elements = useStore.getState().elements;\r\n if (excludeLocked) {\r\n for (const e of elements) {\r\n if (!e.locked && e.type === type && e.parentId === parentId) {\r\n count++;\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === type && e.parentId === parentId) {\r\n count++;\r\n }\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n static areTwoBasesOverlapped(f1: ElementModel, f2: ElementModel): boolean {\r\n const v1 = Util.fetchFoundationVertexCoordinates(f1);\r\n const v2 = Util.fetchFoundationVertexCoordinates(f2);\r\n for (const v of v1) {\r\n if (Util.isPointInside(v.x, v.y, v2)) {\r\n return true;\r\n }\r\n }\r\n for (const v of v2) {\r\n if (Util.isPointInside(v.x, v.y, v1)) {\r\n return true;\r\n }\r\n }\r\n v1.push(v1[0]);\r\n v2.push(v2[0]);\r\n for (let i1 = 0; i1 < v1.length - 1; i1++) {\r\n const from1 = v1[i1];\r\n const to1 = v1[i1 + 1];\r\n for (let i2 = 0; i2 < v2.length - 1; i2++) {\r\n const from2 = v2[i2];\r\n const to2 = v2[i2 + 1];\r\n if (Util.lineIntersection(from1, to1, from2, to2)) return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n static fetchFoundationVertexCoordinates(foundation: ElementModel): Point2[] {\r\n const { pos } = Util.getWorldDataById(foundation.id);\r\n const xc = pos.x;\r\n const yc = pos.y;\r\n const cosaz = Math.cos(foundation.rotation[2]);\r\n const sinaz = Math.sin(foundation.rotation[2]);\r\n const rx = foundation.lx * 0.5;\r\n const ry = foundation.ly * 0.5;\r\n // corners are stored in the clockwise direction\r\n const vertices: Point2[] = [];\r\n // upper-right corner\r\n vertices.push({\r\n x: xc + rx * cosaz - ry * sinaz,\r\n y: yc + rx * sinaz + ry * cosaz,\r\n } as Point2);\r\n // lower-right corner\r\n vertices.push({\r\n x: xc + rx * cosaz + ry * sinaz,\r\n y: yc + rx * sinaz - ry * cosaz,\r\n } as Point2);\r\n // lower-left corner\r\n vertices.push({\r\n x: xc - rx * cosaz + ry * sinaz,\r\n y: yc - rx * sinaz - ry * cosaz,\r\n } as Point2);\r\n // upper-left corner\r\n vertices.push({\r\n x: xc - rx * cosaz - ry * sinaz,\r\n y: yc - rx * sinaz + ry * cosaz,\r\n } as Point2);\r\n return vertices;\r\n }\r\n\r\n static doSolarPanelsOverlap(sp1: SolarPanelModel, sp2: SolarPanelModel, parent: ElementModel): boolean {\r\n if (sp1.parentId !== parent.id || sp2.parentId !== parent.id) return false;\r\n if (!Util.isIdentical(sp1.normal, sp2.normal)) return false;\r\n const v1 = Util.fetchSolarPanelVertexCoordinates(sp1, parent);\r\n const v2 = Util.fetchSolarPanelVertexCoordinates(sp2, parent);\r\n v1.push(v1[0]);\r\n v2.push(v2[0]);\r\n for (let i1 = 0; i1 < v1.length - 1; i1++) {\r\n const from1 = v1[i1];\r\n const to1 = v1[i1 + 1];\r\n for (let i2 = 0; i2 < v2.length - 1; i2++) {\r\n const from2 = v2[i2];\r\n const to2 = v2[i2 + 1];\r\n if (Util.lineIntersection(from1, to1, from2, to2)) return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n static fetchSolarPanelVertexCoordinates(sp: SolarPanelModel, parent: ElementModel): Point2[] {\r\n const xc = sp.cx * parent.lx;\r\n const yc = sp.cy * parent.ly;\r\n const cosaz = Math.cos(sp.relativeAzimuth);\r\n const sinaz = Math.sin(sp.relativeAzimuth);\r\n const rx = sp.lx * 0.5;\r\n const ry = sp.ly * 0.5 * Math.cos(sp.tiltAngle);\r\n // corners are stored in the clockwise direction\r\n const vertices: Point2[] = [];\r\n // upper-right corner of solar panel\r\n vertices.push({\r\n x: xc + rx * cosaz - ry * sinaz,\r\n y: yc + rx * sinaz + ry * cosaz,\r\n } as Point2);\r\n // lower-right corner of solar panel\r\n vertices.push({\r\n x: xc + rx * cosaz + ry * sinaz,\r\n y: yc + rx * sinaz - ry * cosaz,\r\n } as Point2);\r\n // lower-left corner of solar panel\r\n vertices.push({\r\n x: xc - rx * cosaz + ry * sinaz,\r\n y: yc - rx * sinaz - ry * cosaz,\r\n } as Point2);\r\n // upper-left corner of solar panel\r\n vertices.push({\r\n x: xc - rx * cosaz - ry * sinaz,\r\n y: yc - rx * sinaz + ry * cosaz,\r\n } as Point2);\r\n return vertices;\r\n }\r\n\r\n static changeOrientation(solarPanel: SolarPanelModel, pvModel: PvModel, value: Orientation): void {\r\n if (solarPanel) {\r\n solarPanel.orientation = value;\r\n // add a small number because the round-off error may cause the floor to drop one\r\n solarPanel.lx += 0.00001;\r\n solarPanel.ly += 0.00001;\r\n if (value === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.floor(solarPanel.lx / pvModel.width));\r\n const ny = Math.max(1, Math.floor(solarPanel.ly / pvModel.length));\r\n solarPanel.lx = nx * pvModel.width;\r\n solarPanel.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.floor(solarPanel.lx / pvModel.length));\r\n const ny = Math.max(1, Math.floor(solarPanel.ly / pvModel.width));\r\n solarPanel.lx = nx * pvModel.length;\r\n solarPanel.ly = ny * pvModel.width;\r\n }\r\n }\r\n }\r\n\r\n static panelizeLx(solarPanel: SolarPanelModel, pvModel: PvModel, value: number): number {\r\n const dx = solarPanel.orientation === Orientation.portrait ? pvModel.width : pvModel.length;\r\n let lx = value ?? 1;\r\n const n = Math.max(1, Math.ceil((lx - dx / 2) / dx));\r\n lx = n * dx;\r\n return lx;\r\n }\r\n\r\n static panelizeLy(solarPanel: SolarPanelModel, pvModel: PvModel, value: number): number {\r\n const dy = solarPanel.orientation === Orientation.portrait ? pvModel.length : pvModel.width;\r\n let ly = value ?? 1;\r\n const n = Math.max(1, Math.ceil((ly - dy / 2) / dy));\r\n ly = n * dy;\r\n return ly;\r\n }\r\n\r\n // ray-casting algorithm based on\r\n static isPointInside(x: number, y: number, vertices: Point2[]): boolean {\r\n let inside = false;\r\n for (let i = 0, j = vertices.length - 1; i < vertices.length; j = i++) {\r\n const xi = vertices[i].x;\r\n const yi = vertices[i].y;\r\n const xj = vertices[j].x;\r\n const yj = vertices[j].y;\r\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {\r\n inside = !inside;\r\n }\r\n }\r\n return inside;\r\n }\r\n\r\n static getPoints(vertices: Vector3[]): Point2[] {\r\n const points: Point2[] = [];\r\n for (const v of vertices) {\r\n points.push({ x: v.x, y: v.y } as Point2);\r\n }\r\n return points;\r\n }\r\n\r\n static polygonIntersections(a: Point2, b: Point2, vertices: Point2[]): Point2[] {\r\n const intersections = new Array();\r\n let v1: Point2, v2: Point2, p: Point2 | undefined;\r\n for (let i = 0; i < vertices.length - 1; i++) {\r\n v1 = vertices[i];\r\n v2 = vertices[i + 1];\r\n p = Util.lineIntersection(a, b, v1, v2);\r\n if (p) {\r\n intersections.push(p);\r\n }\r\n }\r\n v1 = vertices[vertices.length - 1];\r\n v2 = vertices[0];\r\n p = Util.lineIntersection(a, b, v1, v2);\r\n if (p) {\r\n intersections.push(p);\r\n }\r\n return intersections;\r\n }\r\n\r\n static calculatePolygonBounds(vertices: Point2[]): Rectangle {\r\n let minX = vertices[0].x;\r\n let maxX = vertices[0].x;\r\n let minY = vertices[0].y;\r\n let maxY = vertices[0].y;\r\n for (const [i, v] of vertices.entries()) {\r\n if (i > 0) {\r\n if (minX > v.x) minX = v.x;\r\n if (minY > v.y) minY = v.y;\r\n if (maxX < v.x) maxX = v.x;\r\n if (maxY < v.y) maxY = v.y;\r\n }\r\n }\r\n return new Rectangle(minX, minY, maxX - minX, maxY - minY);\r\n }\r\n\r\n static calculatePolygonCentroid(vertices: Point2[]): Point2 {\r\n // it is OK to use a shallow copy here since we are not modifying the objects in the array\r\n const pts = [...vertices];\r\n const first = pts[0];\r\n const last = pts[pts.length - 1];\r\n if (first.x !== last.x || first.y !== last.y) pts.push(first);\r\n const nPts = pts.length;\r\n let twiceArea = 0,\r\n x = 0,\r\n y = 0;\r\n let p1, p2, f;\r\n for (let i = 0, j = nPts - 1; i < nPts; j = i++) {\r\n p1 = pts[i];\r\n p2 = pts[j];\r\n f = (p1.y - first.y) * (p2.x - first.x) - (p2.y - first.y) * (p1.x - first.x);\r\n twiceArea += f;\r\n x += (p1.x + p2.x - 2 * first.x) * f;\r\n y += (p1.y + p2.y - 2 * first.y) * f;\r\n }\r\n f = twiceArea * 3;\r\n return { x: x / f + first.x, y: y / f + first.y } as Point2;\r\n }\r\n\r\n static translatePolygonCenterTo(polygonModel: PolygonModel, x: number, y: number): void {\r\n const n = polygonModel.vertices.length;\r\n if (n === 0) return;\r\n const centroid = Util.calculatePolygonCentroid(polygonModel.vertices);\r\n const dx = x - centroid.x;\r\n const dy = y - centroid.y;\r\n for (const v of polygonModel.vertices) {\r\n v.x += dx;\r\n v.y += dy;\r\n }\r\n }\r\n\r\n static rotatePolygon(vertices: Point2[], cx: number, cy: number, angleInRadian: number): Point2[] {\r\n const rotatedVertices: Point2[] = [];\r\n const cos = Math.cos(angleInRadian);\r\n const sin = Math.sin(angleInRadian);\r\n for (const v of vertices) {\r\n const dx = v.x - cx;\r\n const dy = v.y - cy;\r\n rotatedVertices.push({ x: cx + dx * cos - dy * sin, y: cy + dx * sin + dy * cos } as Point2);\r\n }\r\n return rotatedVertices;\r\n }\r\n\r\n static rotatePoint(point: Point2, cx: number, cy: number, angleInRadian: number): Point2 {\r\n const cos = Math.cos(angleInRadian);\r\n const sin = Math.sin(angleInRadian);\r\n const dx = point.x - cx;\r\n const dy = point.y - cy;\r\n return { x: cx + dx * cos - dy * sin, y: cy + dx * sin + dy * cos } as Point2;\r\n }\r\n\r\n // note: this assumes that the center of the parent does NOT change\r\n static doesNewSizeContainAllChildren(\r\n parent: ElementModel,\r\n children: ElementModel[],\r\n lx: number,\r\n ly: number,\r\n ): boolean {\r\n const childAbsPosMap = new Map();\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n // TODO\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const absPos = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(\r\n ORIGIN_VECTOR2,\r\n parent.rotation[2],\r\n );\r\n childAbsPosMap.set(c.id, absPos);\r\n break;\r\n }\r\n }\r\n const childrenClone: ElementModel[] = [];\r\n for (const c of children) {\r\n const childClone = JSON.parse(JSON.stringify(c));\r\n childrenClone.push(childClone);\r\n const childAbsPos = childAbsPosMap.get(c.id);\r\n if (childAbsPos) {\r\n const relativePos = new Vector2(childAbsPos.x, childAbsPos.y).rotateAround(ORIGIN_VECTOR2, -c.rotation[2]);\r\n childClone.cx = relativePos.x / lx;\r\n childClone.cy = relativePos.y / ly;\r\n }\r\n }\r\n const parentClone = JSON.parse(JSON.stringify(parent));\r\n parentClone.lx = lx;\r\n parentClone.ly = ly;\r\n return Util.doesParentContainAllChildren(parentClone, childrenClone);\r\n }\r\n\r\n // TODO: Vertical surfaces\r\n static doesParentContainAllChildren(parent: ElementModel, children: ElementModel[]): boolean {\r\n for (const e of children) {\r\n switch (e.type) {\r\n // solar panels can be installed on any surface, but we can only check horizontal surfaces now\r\n case ObjectType.SolarPanel:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, parent)) {\r\n return false;\r\n }\r\n }\r\n break;\r\n // these CSP collectors can only be installed on a foundation\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n if (!Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, parent)) {\r\n return false;\r\n }\r\n break;\r\n // sensors can be placed on any surface, but we can only check horizontal surfaces now\r\n case ObjectType.Sensor:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n if (!Util.isSensorWithin(e as SensorModel, parent)) {\r\n return false;\r\n }\r\n }\r\n break;\r\n case ObjectType.Wall:\r\n if (!Util.isWallWithin(e as WallModel, parent)) {\r\n return false;\r\n }\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static isWallWithin(wall: WallModel, parent: ElementModel): boolean {\r\n const dx = parent.lx * 0.5;\r\n const dy = parent.ly * 0.5;\r\n const lx = wall.leftPoint[0]; // left point x\r\n const ly = wall.leftPoint[1]; // left point y\r\n if (Math.abs(lx) >= dx || Math.abs(ly) >= dy) {\r\n return false;\r\n }\r\n const rx = wall.rightPoint[0]; // right point x\r\n const ry = wall.rightPoint[1]; // right point y\r\n if (Math.abs(rx) >= dx || Math.abs(ry) >= dy) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n static isSensorWithin(sensor: SensorModel, parent: ElementModel): boolean {\r\n return Math.abs(sensor.cx) < 0.5 - sensor.lx / parent.lx && Math.abs(sensor.cy) < 0.5 - sensor.ly / parent.ly;\r\n }\r\n\r\n static isSolarCollectorWithinHorizontalSurface(collector: SolarCollector, parent: ElementModel): boolean {\r\n const x0 = collector.cx * parent.lx;\r\n const y0 = collector.cy * parent.ly;\r\n const cosaz = Math.cos(collector.relativeAzimuth);\r\n const sinaz = Math.sin(collector.relativeAzimuth);\r\n const dx = parent.lx * 0.5;\r\n const dy = parent.ly * 0.5;\r\n const rx = collector.lx * 0.5;\r\n const ry = collector.ly * 0.5 * Math.cos(collector.tiltAngle);\r\n // vertex 1\r\n let x = x0 + rx * cosaz - ry * sinaz;\r\n let y = y0 + rx * sinaz + ry * cosaz;\r\n if (Math.abs(x) > dx || Math.abs(y) > dy) return false;\r\n // vertex 2\r\n x = x0 + rx * cosaz + ry * sinaz;\r\n y = y0 + rx * sinaz - ry * cosaz;\r\n if (Math.abs(x) > dx || Math.abs(y) > dy) return false;\r\n // vertex 3\r\n x = x0 - rx * cosaz - ry * sinaz;\r\n y = y0 - rx * sinaz + ry * cosaz;\r\n if (Math.abs(x) > dx || Math.abs(y) > dy) return false;\r\n // vertex 4\r\n x = x0 - rx * cosaz + ry * sinaz;\r\n y = y0 - rx * sinaz - ry * cosaz;\r\n if (Math.abs(x) > dx || Math.abs(y) > dy) return false;\r\n // all in\r\n return true;\r\n }\r\n\r\n static isUnitVectorX(v: Vector3): boolean {\r\n return Util.isSame(v, UNIT_VECTOR_POS_X) || Util.isSame(v, UNIT_VECTOR_NEG_X);\r\n }\r\n\r\n static isUnitVectorY(v: Vector3): boolean {\r\n return Util.isSame(v, UNIT_VECTOR_POS_Y) || Util.isSame(v, UNIT_VECTOR_NEG_Y);\r\n }\r\n\r\n static isSame(u: Vector3, v: Vector3): boolean {\r\n return (\r\n Math.abs(u.x - v.x) < ZERO_TOLERANCE &&\r\n Math.abs(u.y - v.y) < ZERO_TOLERANCE &&\r\n Math.abs(u.z - v.z) < ZERO_TOLERANCE\r\n );\r\n }\r\n\r\n static isIdentical(u?: number[], v?: number[]): boolean {\r\n if (!u || !v || u.length !== v.length) return false;\r\n if (u === v) return true;\r\n for (let i = 0; i < u.length; i++) {\r\n if (Math.abs(u[i] - v[i]) > ZERO_TOLERANCE) return false;\r\n }\r\n return true;\r\n }\r\n\r\n static isZero(x: number): boolean {\r\n return Math.abs(x) < ZERO_TOLERANCE;\r\n }\r\n\r\n static deleteElement(a: any[], e: any): void {\r\n const i = a.indexOf(e, 0);\r\n if (i > -1) {\r\n a.splice(i, 1);\r\n }\r\n }\r\n\r\n static fixElements(elements: ElementModel[]): void {\r\n const found: ElementModel[] = [];\r\n for (const e of elements) {\r\n if (!e.type) {\r\n found.push(e);\r\n }\r\n }\r\n if (found.length > 0) {\r\n for (const e of found) {\r\n Util.deleteElement(elements, e);\r\n }\r\n }\r\n }\r\n\r\n static isResizingVertical(handle: ResizeHandleType | null): boolean {\r\n switch (handle) {\r\n case ResizeHandleType.LowerLeftTop:\r\n case ResizeHandleType.UpperLeftTop:\r\n case ResizeHandleType.LowerRightTop:\r\n case ResizeHandleType.UpperRightTop:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n static isTopResizeHandle(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n // unfortunately, I cannot find a better way to tell the type of enum variable\r\n return (\r\n handle === ResizeHandleType.LowerLeftTop ||\r\n handle === ResizeHandleType.LowerRightTop ||\r\n handle === ResizeHandleType.UpperLeftTop ||\r\n handle === ResizeHandleType.UpperRightTop ||\r\n handle === ResizeHandleType.Top\r\n );\r\n }\r\n\r\n static isXResizeHandle(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n // unfortunately, I cannot find a better way to tell the type of enum variable\r\n return handle === ResizeHandleType.Left || handle === ResizeHandleType.Right;\r\n }\r\n\r\n static isYResizeHandle(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n // unfortunately, I cannot find a better way to tell the type of enum variable\r\n return handle === ResizeHandleType.Upper || handle === ResizeHandleType.Lower;\r\n }\r\n\r\n static isTopResizeHandleOfWall(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n return handle === ResizeHandleType.UpperLeft || handle === ResizeHandleType.UpperRight;\r\n }\r\n\r\n static isRiseHandleOfRoof(\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ): boolean {\r\n return handle === RoofHandleType.Top || handle === RoofHandleType.Mid || handle === RoofHandleType.TopMid;\r\n }\r\n\r\n static isMoveHandle(handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null): boolean {\r\n // unfortunately, I cannot find a better way to tell the type of enum variable\r\n return (\r\n handle === MoveHandleType.Default ||\r\n handle === MoveHandleType.Top ||\r\n handle === MoveHandleType.Upper ||\r\n handle === MoveHandleType.Lower ||\r\n handle === MoveHandleType.Left ||\r\n handle === MoveHandleType.Right\r\n );\r\n }\r\n\r\n static snapToNormalGrid(v: Vector3): Vector3 {\r\n const x = Math.round(v.x / NORMAL_GRID_SCALE) * NORMAL_GRID_SCALE;\r\n const y = Math.round(v.y / NORMAL_GRID_SCALE) * NORMAL_GRID_SCALE;\r\n return new Vector3(x, y, v.z);\r\n }\r\n\r\n static snapToFineGrid(v: Vector3): Vector3 {\r\n const x = Math.round(v.x / FINE_GRID_SCALE) * FINE_GRID_SCALE;\r\n const y = Math.round(v.y / FINE_GRID_SCALE) * FINE_GRID_SCALE;\r\n return new Vector3(x, y, v.z);\r\n }\r\n\r\n static isPositionRelative(objectType: ObjectType): boolean {\r\n return (\r\n objectType === ObjectType.SolarPanel ||\r\n objectType === ObjectType.ParabolicTrough ||\r\n objectType === ObjectType.ParabolicDish ||\r\n objectType === ObjectType.FresnelReflector ||\r\n objectType === ObjectType.Heliostat ||\r\n objectType === ObjectType.WaterHeater ||\r\n objectType === ObjectType.Sensor ||\r\n objectType === ObjectType.Light ||\r\n objectType === ObjectType.Polygon ||\r\n objectType === ObjectType.Window ||\r\n objectType === ObjectType.Door ||\r\n objectType === ObjectType.Roof ||\r\n objectType === ObjectType.Wall\r\n );\r\n }\r\n\r\n static isPlantOrHuman(elem: ElementModel): boolean {\r\n return elem.type === ObjectType.Tree || elem.type === ObjectType.Flower || elem.type === ObjectType.Human;\r\n }\r\n\r\n static isFoundationOrCuboid(elem: ElementModel): boolean {\r\n return elem.type === ObjectType.Foundation || elem.type === ObjectType.Cuboid;\r\n }\r\n\r\n static isSolarCollector(elem: ElementModel): boolean {\r\n return Util.isSolarCollectorType(elem.type);\r\n }\r\n\r\n static isSolarCollectorType(type: ObjectType): boolean {\r\n return type === ObjectType.SolarPanel || type === ObjectType.WaterHeater || Util.isCspCollectorType(type);\r\n }\r\n\r\n static isCspCollector(elem: ElementModel): boolean {\r\n return Util.isCspCollectorType(elem.type);\r\n }\r\n\r\n static isCspCollectorType(type: ObjectType): boolean {\r\n return (\r\n type === ObjectType.ParabolicDish ||\r\n type === ObjectType.ParabolicTrough ||\r\n type === ObjectType.FresnelReflector ||\r\n type === ObjectType.Heliostat\r\n );\r\n }\r\n\r\n static isParabolicCollector(elem: ElementModel): boolean {\r\n return Util.isParabolaType(elem.type);\r\n }\r\n\r\n static isParabolaType(type: ObjectType): boolean {\r\n return type === ObjectType.ParabolicDish || type === ObjectType.ParabolicTrough;\r\n }\r\n\r\n static isParabolicTroughOrFresnelReflector(type: ObjectType): boolean {\r\n return type === ObjectType.FresnelReflector || type === ObjectType.ParabolicTrough;\r\n }\r\n\r\n static isHeliostatOrFresnelReflector(type: ObjectType): boolean {\r\n return type === ObjectType.FresnelReflector || type === ObjectType.Heliostat;\r\n }\r\n\r\n static isLegalOnWall(type: ObjectType): boolean {\r\n switch (type) {\r\n case ObjectType.Window:\r\n case ObjectType.Door:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Polygon:\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n static isDescendantOf(child: ElementModel, targetId: string): boolean {\r\n const parentId = child.parentId;\r\n if (!parentId || parentId === GROUND_ID) return false;\r\n const parent = useStore.getState().getElementById(parentId);\r\n if (!parent) return false;\r\n if (parent.id === targetId) return true;\r\n return Util.isDescendantOf(parent, targetId);\r\n }\r\n\r\n // p is relative position on wall\r\n static isElementInsideWall(\r\n p: Vector3,\r\n wlx: number,\r\n wlz: number,\r\n boundingPoints: Point2[],\r\n isDoor?: boolean,\r\n ): boolean {\r\n const hx = wlx / 2;\r\n const hz = wlz / 2;\r\n for (let i = -1; i <= 1; i += 2) {\r\n for (let j = -1; j <= 1; j += 2) {\r\n if (isDoor && j === -1) continue;\r\n const x = p.x + hx * i;\r\n const y = p.z + hz * j;\r\n if (!Util.isPointInside(x, y, boundingPoints)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n const elementPoints = [\r\n { x: p.x - hx, y: p.z - hz },\r\n { x: p.x - hx, y: p.z + hz },\r\n { x: p.x + hx, y: p.z + hz },\r\n { x: p.x + hx, y: p.z - hz },\r\n ];\r\n\r\n for (const p of boundingPoints) {\r\n if (Util.isPointInside(p.x, p.y, elementPoints)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n static checkElementOnWallState(elem: ElementModel, parent?: ElementModel): ElementState {\r\n const margin = 0.00001;\r\n\r\n let hx = elem.lx / 2 + margin;\r\n let hz = elem.lz / 2 + margin;\r\n if (parent && elem.type === ObjectType.SolarPanel) {\r\n hx = hx / parent.lx + margin;\r\n hz = elem.ly / 2 / parent.lz + margin;\r\n }\r\n const eMinX = elem.cx - hx;\r\n const eMaxX = elem.cx + hx;\r\n const eMinZ = elem.cz - hz;\r\n const eMaxZ = elem.cz + hz;\r\n\r\n if (\r\n parent &&\r\n parent.type === ObjectType.Wall &&\r\n !Util.isElementInsideWall(\r\n new Vector3(elem.cx * parent.lx, elem.cy, elem.cz * parent.lz),\r\n parent.lx * hx * 2,\r\n parent.lz * hz * 2,\r\n Util.getWallInnerSideShapePoints(parent as WallModel),\r\n elem.type === ObjectType.Door,\r\n )\r\n ) {\r\n return ElementState.OutsideBoundary;\r\n }\r\n for (const e of useStore.getState().elements) {\r\n // check collision with other elements (except polygons)\r\n if (\r\n Util.isLegalOnWall(e.type) &&\r\n e.type !== ObjectType.Polygon &&\r\n e.parentId === elem.parentId &&\r\n e.id !== elem.id\r\n ) {\r\n let ehx = e.lx / 2;\r\n let ehz = e.lz / 2;\r\n if (parent && e.type === ObjectType.SolarPanel) {\r\n ehx = ehx / parent.lx;\r\n ehz = e.ly / 2 / parent.lz;\r\n }\r\n // target element\r\n const tMinX = e.cx - ehx;\r\n const tMaxX = e.cx + ehx;\r\n const tMinZ = e.cz - ehz;\r\n const tMaxZ = e.cz + ehz;\r\n if (\r\n ((eMinX >= tMinX && eMinX <= tMaxX) ||\r\n (eMaxX >= tMinX && eMaxX <= tMaxX) ||\r\n (tMinX >= eMinX && tMinX <= eMaxX) ||\r\n (tMaxX >= eMinX && tMaxX <= eMaxX)) &&\r\n ((eMinZ >= tMinZ && eMinZ <= tMaxZ) ||\r\n (eMaxZ >= tMinZ && eMaxZ <= tMaxZ) ||\r\n (tMinZ >= eMinZ && tMinZ <= eMaxZ) ||\r\n (tMaxZ >= eMinZ && tMaxZ <= eMaxZ))\r\n ) {\r\n return ElementState.OverLap;\r\n }\r\n }\r\n }\r\n return ElementState.Valid;\r\n }\r\n\r\n static checkElementOnRoofState(sp: SolarPanelModel, roof: RoofModel): ElementState {\r\n if (sp.foundationId) {\r\n const foundation = useStore.getState().getElementById(sp.foundationId);\r\n if (foundation) {\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(sp as SolarPanelModel, foundation);\r\n const wallVertices = RoofUtil.getRoofBoundaryVertices(roof);\r\n if (!RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, wallVertices)) {\r\n return ElementState.OutsideBoundary;\r\n }\r\n if (!RoofUtil.rooftopSPCollisionCheck(sp as SolarPanelModel, foundation, solarPanelVertices)) {\r\n return ElementState.OverLap;\r\n }\r\n return ElementState.Valid;\r\n }\r\n }\r\n return ElementState.Invalid;\r\n }\r\n\r\n static relativeCoordinates(x: number, y: number, z: number, parent: ElementModel): Vector3 {\r\n const v = new Vector3(x, y, z);\r\n if (parent.type === ObjectType.Wall) {\r\n const parentPos = new Vector3(parent.cx, parent.cy); // relative\r\n const grandParent = useStore.getState().getParent(parent);\r\n if (grandParent) {\r\n const grandParentPos = new Vector3(grandParent.cx, grandParent.cy); // world\r\n parentPos\r\n .applyEuler(new Euler(0, 0, grandParent.rotation[2]))\r\n .add(grandParentPos)\r\n .setZ(grandParent.lz + parent.lz / 2); // world\r\n v.sub(parentPos).applyEuler(new Euler(0, 0, -(parent as WallModel).relativeAngle - grandParent.rotation[2]));\r\n }\r\n } else {\r\n const { pos, rot } = Util.getWorldDataById(parent.id);\r\n v.set(x - pos.x, y - pos.y, z - pos.z);\r\n v.applyEuler(new Euler(0, 0, -rot));\r\n }\r\n v.x /= parent.lx;\r\n v.y /= parent.ly;\r\n v.z /= parent.lz;\r\n return v;\r\n }\r\n\r\n // don't use this for humans or trees or flowers\r\n static absoluteCoordinates(\r\n x: number,\r\n y: number,\r\n z: number,\r\n parent: ElementModel,\r\n foundation?: FoundationModel | null,\r\n shift?: number,\r\n ): Vector3 {\r\n if (parent.type === ObjectType.Wall && foundation) {\r\n const wall = parent as WallModel;\r\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\r\n if (wallAbsAngle !== undefined) {\r\n const wallAbsPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\r\n wall.lz / 2 + foundation.lz,\r\n );\r\n const v = new Vector3(x * wall.lx, y * wall.ly, z * wall.lz);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, wallAbsAngle);\r\n if (shift) {\r\n const dx = shift * Math.cos(wallAbsAngle - HALF_PI);\r\n const dy = shift * Math.sin(wallAbsAngle - HALF_PI);\r\n return new Vector3(wallAbsPos.x + v.x + dx, wallAbsPos.y + v.y + dy, wallAbsPos.z + v.z);\r\n }\r\n return new Vector3(wallAbsPos.x + v.x, wallAbsPos.y + v.y, wallAbsPos.z + v.z);\r\n }\r\n }\r\n if (parent.type === ObjectType.Roof && foundation) {\r\n const v = new Vector3(x * foundation.lx, y * foundation.ly, z + foundation.lz);\r\n v.applyEuler(new Euler().fromArray(foundation.rotation));\r\n v.x += foundation.cx;\r\n v.y += foundation.cy;\r\n return v;\r\n }\r\n const v = new Vector3(x * parent.lx, y * parent.ly, z * parent.lz);\r\n v.applyEuler(new Euler().fromArray(parent.rotation));\r\n v.x += parent.cx;\r\n v.y += parent.cy;\r\n v.z += parent.cz;\r\n return v;\r\n }\r\n\r\n // use this only for humans or trees or flowers\r\n static absoluteHumanOrTreeCoordinates(x: number, y: number, z: number, parent: ElementModel): Vector3 {\r\n const v = new Vector3(x, y, z);\r\n v.applyEuler(new Euler().fromArray(parent.rotation));\r\n v.x += parent.cx;\r\n v.y += parent.cy;\r\n v.z += parent.cz;\r\n return v;\r\n }\r\n\r\n // no normalization\r\n static relativePoint(point: Vector3, parent: ElementModel): Vector3 {\r\n const v = new Vector3(point.x - parent.cx, point.y - parent.cy, point.z - parent.cz);\r\n v.applyEuler(new Euler().fromArray(parent.rotation.map((a) => -a)));\r\n return v;\r\n }\r\n\r\n static wallAbsolutePosition(v: Vector3, parent: ElementModel): Vector3 {\r\n const parentPos = new Vector3(parent.cx, parent.cy);\r\n return new Vector3().addVectors(\r\n parentPos,\r\n new Vector3(v.x, v.y).applyAxisAngle(UNIT_VECTOR_POS_Z, parent.rotation[2]),\r\n );\r\n }\r\n\r\n static wallRelativePosition(v: Vector3, parent: ElementModel): Vector3 {\r\n const parentPos = new Vector3(parent.cx, parent.cy);\r\n return new Vector3()\r\n .subVectors(new Vector3(v.x, v.y), parentPos)\r\n .applyAxisAngle(UNIT_VECTOR_POS_Z, -parent.rotation[2]);\r\n }\r\n\r\n static getObjectChildById(object: Object3D | null | undefined, id: string): Object3D | null {\r\n if (object) {\r\n for (const children of object.children) {\r\n if (children.name === CUBOID_WRAPPER_NAME) {\r\n const child = Util.getStackCuboidObjectById(children, id);\r\n if (child) return child;\r\n } else if (children.name.includes(id)) {\r\n return children;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static getStackCuboidObjectById(wrapper: Object3D | null | undefined, id: string): Object3D | null {\r\n if (wrapper) {\r\n for (const child of wrapper.children) {\r\n if (child.name.includes(id)) {\r\n return child;\r\n }\r\n if (child.name === CUBOID_STACKABLE_CHILD) {\r\n const c = Util.getStackCuboidObjectById(child.children[0], id);\r\n if (c) return c;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static toRadians(degrees: number): number {\r\n return degrees * (Math.PI / 180);\r\n }\r\n\r\n static toDegrees(radians: number): number {\r\n return radians * (180 / Math.PI);\r\n }\r\n\r\n // returns the maximum of a 1D array\r\n static getArrayMax(array: number[]): number {\r\n return array.reduce((a, b) => Math.max(a, b));\r\n }\r\n\r\n // returns the minimum of a 1D array\r\n static getArrayMin(array: number[]): number {\r\n return array.reduce((a, b) => Math.min(a, b));\r\n }\r\n\r\n // returns the maximum of a 2D array\r\n static getArrayMax2D(array2d: number[][]): number {\r\n return Util.getArrayMax(array2d.map(Util.getArrayMax));\r\n }\r\n\r\n // returns the minimum of a 2D array\r\n static getArrayMin2D(array2d: number[][]): number {\r\n return Util.getArrayMin(array2d.map(Util.getArrayMin));\r\n }\r\n\r\n static sphericalToCartesianZ(sphereCoords: Vector3): Vector3 {\r\n let a = sphereCoords.x * Math.cos(sphereCoords.z);\r\n let x = a * Math.cos(sphereCoords.y);\r\n let y = a * Math.sin(sphereCoords.y);\r\n let z = sphereCoords.x * Math.sin(sphereCoords.z);\r\n sphereCoords.set(x, y, z);\r\n return sphereCoords;\r\n }\r\n\r\n // the spherical law of cosines: https://en.wikipedia.org/wiki/Spherical_law_of_cosines\r\n static getDistance(lng1: number, lat1: number, lng2: number, lat2: number): number {\r\n lng1 = Util.toRadians(lng1);\r\n lat1 = Util.toRadians(lat1);\r\n lng2 = Util.toRadians(lng2);\r\n lat2 = Util.toRadians(lat2);\r\n return Math.acos(\r\n Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(Math.abs(lng1 - lng2)),\r\n );\r\n }\r\n\r\n static minutesIntoDay(date: Date): number {\r\n return date.getHours() * 60 + date.getMinutes();\r\n }\r\n\r\n // convert to UTC to avoid problems caused by the daylight saving time\r\n static dayOfYear(date: Date): number {\r\n return (\r\n (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) - Date.UTC(date.getFullYear(), 0, 0)) / 86400000\r\n );\r\n }\r\n\r\n // https://en.wikipedia.org/wiki/Leap_year\r\n static daysInYear(date: Date): number {\r\n const year = date.getFullYear();\r\n return (year % 4 === 0 && year % 100 > 0) || year % 400 === 0 ? 366 : 365;\r\n }\r\n\r\n static daysOfMonth(month: number, year: number): number {\r\n return new Date(year, month + 1, 0).getDate();\r\n }\r\n\r\n static fahrenheitToCelsius(temp: number): number {\r\n return ((temp - 32) * 5) / 9;\r\n }\r\n\r\n static celsiusToFahrenheit(temp: number): number {\r\n return temp * (9 / 5) + 32;\r\n }\r\n\r\n static getOS(): string | undefined {\r\n return platform.os?.family;\r\n }\r\n\r\n static isMac(): boolean {\r\n const os = Util.getOS();\r\n if (os) return os.includes('Mac') || os.includes('OS X');\r\n return false;\r\n }\r\n\r\n static isChrome(): boolean {\r\n const os = Util.getOS();\r\n if (os) return os.includes('Chrome');\r\n return false;\r\n }\r\n\r\n static detectWebGLContext(): boolean {\r\n try {\r\n const canvas = document.createElement('canvas');\r\n return (\r\n !!window.WebGLRenderingContext && (!!canvas.getContext('webgl') || !!canvas.getContext('experimental-webgl'))\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n static clamp(num: number, min: number, max: number): number {\r\n if (min > max) {\r\n return (min + max) / 2;\r\n }\r\n return Math.min(Math.max(num, min), max);\r\n }\r\n\r\n static distanceFromPointToLine2D(p: Vector3, l1: Vector3, l2: Vector3): number {\r\n const [x, y] = [p.x, p.y];\r\n const [x1, y1] = [l1.x, l1.y];\r\n const [x2, y2] = [l2.x, l2.y];\r\n\r\n const A = x - x1;\r\n const B = y - y1;\r\n const C = x2 - x1;\r\n const D = y2 - y1;\r\n\r\n const dot = A * C + B * D;\r\n const len_sq = C * C + D * D;\r\n let param = -1;\r\n if (len_sq !== 0) {\r\n param = dot / len_sq;\r\n }\r\n\r\n let xx, yy;\r\n\r\n if (param < 0) {\r\n xx = x1;\r\n yy = y1;\r\n } else if (param > 1) {\r\n xx = x2;\r\n yy = y2;\r\n } else {\r\n xx = x1 + param * C;\r\n yy = y1 + param * D;\r\n }\r\n\r\n const dx = x - xx;\r\n const dy = y - yy;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n\r\n static mapVector3ToPoint2(v: Vector3): Point2 {\r\n return { x: v.x, y: v.y } as Point2;\r\n }\r\n\r\n // get the relative 2D vertices of a wall (can be a quad, pentagon, or heptagon)\r\n static getWallVertices(wall: WallModel, margin: number): Point2[] {\r\n const hx = wall.lx / 2;\r\n const hz = wall.lz / 2;\r\n const lowerLeft = { x: -hx - margin, y: -hz - margin } as Point2;\r\n const lowerRight = { x: hx + margin, y: -hz - margin } as Point2;\r\n const upperLeft = { x: -hx - margin, y: (wall.leftRoofHeight ?? wall.lz) - hz + margin } as Point2;\r\n const upperRight = { x: hx + margin, y: (wall.rightRoofHeight ?? wall.lz) - hz + margin } as Point2;\r\n const vertices: Point2[] = [];\r\n vertices.push(upperLeft, lowerLeft, lowerRight, upperRight);\r\n if (wall.centerRightRoofHeight) {\r\n vertices.push({\r\n x: wall.centerRightRoofHeight[0] * wall.lx,\r\n y: wall.centerRightRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n if (wall.centerRoofHeight) {\r\n vertices.push({ x: wall.centerRoofHeight[0] * wall.lx, y: wall.centerRoofHeight[1] - hz + margin } as Point2);\r\n }\r\n if (wall.centerLeftRoofHeight) {\r\n vertices.push({\r\n x: wall.centerLeftRoofHeight[0] * wall.lx,\r\n y: wall.centerLeftRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n return vertices;\r\n }\r\n\r\n // check if a partial wall is effectively full\r\n static isPartialWallFull(wall: WallModel): boolean {\r\n return (\r\n Util.isZero((wall.leftRoofHeight ?? wall.lz) - wall.leftTopPartialHeight) &&\r\n Util.isZero((wall.rightRoofHeight ?? wall.lz) - wall.rightTopPartialHeight) &&\r\n Util.isZero(wall.leftUnfilledHeight) &&\r\n Util.isZero(wall.rightUnfilledHeight)\r\n );\r\n }\r\n\r\n // get the relative 2D vertices of a partial wall (a quad)\r\n static getPartialWallVertices(wall: WallModel, margin: number): Point2[] {\r\n if (Util.isPartialWallFull(wall)) return Util.getWallVertices(wall, margin);\r\n const hx = wall.lx / 2;\r\n const hz = wall.lz / 2;\r\n const lowerLeft = { x: -hx - margin, y: wall.leftUnfilledHeight - hz - margin } as Point2;\r\n const lowerRight = { x: hx + margin, y: wall.rightUnfilledHeight - hz - margin } as Point2;\r\n const upperLeft = { x: -hx - margin, y: wall.leftTopPartialHeight - hz + margin } as Point2;\r\n const upperRight = { x: hx + margin, y: wall.rightTopPartialHeight - hz + margin } as Point2;\r\n const vertices: Point2[] = [];\r\n vertices.push(upperLeft, lowerLeft, lowerRight, upperRight);\r\n if (wall.centerRightRoofHeight) {\r\n vertices.push({\r\n x: wall.centerRightRoofHeight[0] * wall.lx,\r\n y: wall.centerRightRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n if (wall.centerRoofHeight) {\r\n vertices.push({ x: wall.centerRoofHeight[0] * wall.lx, y: wall.centerRoofHeight[1] - hz + margin } as Point2);\r\n }\r\n if (wall.centerLeftRoofHeight) {\r\n vertices.push({\r\n x: wall.centerLeftRoofHeight[0] * wall.lx,\r\n y: wall.centerLeftRoofHeight[1] - hz + margin,\r\n } as Point2);\r\n }\r\n return vertices;\r\n }\r\n\r\n // get the highest point of a wall (can be a quad, pentagon, or heptagon)\r\n static getHighestPointOfWall(wall: WallModel): number {\r\n let h = wall.lz;\r\n if (wall.leftRoofHeight) {\r\n h = Math.max(h, wall.leftRoofHeight);\r\n }\r\n if (wall.rightRoofHeight) {\r\n h = Math.max(h, wall.rightRoofHeight);\r\n }\r\n if (wall.centerRightRoofHeight) {\r\n h = Math.max(h, wall.centerRightRoofHeight[1]);\r\n }\r\n if (wall.centerRoofHeight) {\r\n h = Math.max(h, wall.centerRoofHeight[1]);\r\n }\r\n if (wall.centerLeftRoofHeight) {\r\n h = Math.max(h, wall.centerLeftRoofHeight[1]);\r\n }\r\n return h;\r\n }\r\n\r\n // get the points for all the walls under a roof\r\n static getWallPointsOfRoof(roof: RoofModel, wallModel?: WallModel) {\r\n let wall = wallModel ?? (useStore.getState().getElementById(roof.wallsId[0]) as WallModel);\r\n if (!wall) return [];\r\n const startWall = wall;\r\n const array = [];\r\n\r\n while (wall && (!wall.roofId || wall.roofId === roof.id)) {\r\n array.push({ x: wall.leftPoint[0], y: wall.leftPoint[1], eave: wall.eavesLength ?? 0 });\r\n if (wall.leftJoints[0]) {\r\n if (wall.leftJoints[0] !== startWall.id) {\r\n wall = useStore.getState().getElementById(wall.leftJoints[0]) as WallModel;\r\n }\r\n // is a loop\r\n else {\r\n array.reverse();\r\n return array;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n array.reverse();\r\n\r\n wall = useStore.getState().getElementById(startWall?.rightJoints[0]) as WallModel;\r\n while (wall && (!wall.roofId || wall.roofId === roof.id)) {\r\n array.push({ x: wall.leftPoint[0], y: wall.leftPoint[1], eave: wall.eavesLength ?? 0 });\r\n if (wall.rightJoints[0] && wall.rightJoints[0] !== startWall.id) {\r\n wall = useStore.getState().getElementById(wall.rightJoints[0]) as WallModel;\r\n } else {\r\n break;\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n static getWallInnerSideShapePoints(wallModel: WallModel) {\r\n const {\r\n lx,\r\n ly,\r\n lz,\r\n relativeAngle,\r\n fill,\r\n leftUnfilledHeight,\r\n rightUnfilledHeight,\r\n leftRoofHeight,\r\n centerLeftRoofHeight,\r\n centerRoofHeight,\r\n centerRightRoofHeight,\r\n rightRoofHeight,\r\n leftJoints,\r\n rightJoints,\r\n } = wallModel;\r\n\r\n const leftWall = leftJoints.length > 0 ? useStore.getState().getElementById(leftJoints[0]) : null;\r\n const rightWall = rightJoints.length > 0 ? useStore.getState().getElementById(rightJoints[0]) : null;\r\n\r\n const leftOffset =\r\n leftWall && leftWall.type === ObjectType.Wall\r\n ? Util.getInnerWallOffset(leftWall as WallModel, lx, ly, relativeAngle, 'left')\r\n : 0;\r\n const rightOffset =\r\n rightWall && rightWall.type === ObjectType.Wall\r\n ? Util.getInnerWallOffset(rightWall as WallModel, lx, ly, relativeAngle, 'right')\r\n : 0;\r\n\r\n const points: Point2[] = [];\r\n const x = lx / 2;\r\n const y = lz / 2;\r\n if (fill === WallFill.Partial) {\r\n points.push({ x: -x + leftOffset, y: -y + leftUnfilledHeight });\r\n points.push({ x: x - rightOffset, y: -y + rightUnfilledHeight });\r\n } else {\r\n points.push({ x: -x + leftOffset, y: -y });\r\n points.push({ x: x - rightOffset, y: -y });\r\n }\r\n rightRoofHeight\r\n ? points.push({ x: x - rightOffset, y: rightRoofHeight - y })\r\n : points.push({ x: x - rightOffset, y: y });\r\n if (centerRightRoofHeight) {\r\n points.push({ x: centerRightRoofHeight[0] * lx, y: centerRightRoofHeight[1] - y });\r\n }\r\n if (centerRoofHeight) {\r\n points.push({ x: centerRoofHeight[0] * lx, y: centerRoofHeight[1] - y });\r\n }\r\n if (centerLeftRoofHeight) {\r\n points.push({ x: centerLeftRoofHeight[0] * lx, y: centerLeftRoofHeight[1] - y });\r\n }\r\n leftRoofHeight\r\n ? points.push({ x: -x + leftOffset, y: leftRoofHeight - y })\r\n : points.push({ x: -x + leftOffset, y: y });\r\n\r\n return points;\r\n }\r\n\r\n static getInnerWallOffset(\r\n sideWall: WallModel | null,\r\n lx: number,\r\n ly: number,\r\n relativeAngle: number,\r\n side: 'left' | 'right',\r\n ) {\r\n let offset = 0;\r\n if (sideWall && sideWall.fill !== WallFill.Empty) {\r\n const sign = side === 'left' ? -1 : 1;\r\n const deltaAngle = (Math.PI * 3 + sign * (relativeAngle - sideWall.relativeAngle)) % TWO_PI;\r\n if (deltaAngle <= HALF_PI + 0.01 && deltaAngle > 0) {\r\n offset = Math.min(ly / Math.tan(deltaAngle) + sideWall.ly, lx);\r\n }\r\n }\r\n return offset;\r\n }\r\n\r\n static getAllConnectedWalls = (wall: WallModel) => {\r\n const getElementById = useStore.getState().getElementById;\r\n\r\n const array = [];\r\n const startWall = wall;\r\n while (wall) {\r\n array.push(wall);\r\n if (wall.leftJoints[0]) {\r\n if (wall.leftJoints[0] !== startWall.id) {\r\n const w = getElementById(wall.leftJoints[0]);\r\n if (w && w.type === ObjectType.Wall) {\r\n wall = w as WallModel;\r\n }\r\n }\r\n // is a loop\r\n else {\r\n return array;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n const w = getElementById(startWall.rightJoints[0]);\r\n if (w && w.type === ObjectType.Wall) {\r\n wall = w as WallModel;\r\n }\r\n while (wall) {\r\n array.push(wall);\r\n if (wall.rightJoints[0] && wall.rightJoints[0] !== startWall.id) {\r\n const w = getElementById(wall.rightJoints[0]);\r\n if (w) {\r\n wall = w as WallModel;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return array;\r\n };\r\n\r\n static getWorldDataById = (id: string): { pos: Vector3; rot: number; topZ: number } => {\r\n const el = useStore.getState().getElementById(id);\r\n if (!el) return { pos: new Vector3(), rot: 0, topZ: 0 };\r\n\r\n const currPos = new Vector3(el.cx, el.cy, el.cz);\r\n const currRot = el.rotation[2];\r\n const currTopZ = el.lz;\r\n\r\n if (el.parentId === GROUND_ID) {\r\n return { pos: currPos, rot: currRot, topZ: currTopZ };\r\n }\r\n const { pos: worldPos, rot: worldRot, topZ: worldTopZ } = Util.getWorldDataById(el.parentId);\r\n const euler = new Euler(0, 0, worldRot);\r\n\r\n return {\r\n pos: new Vector3().addVectors(currPos.applyEuler(euler), worldPos.clone().setZ(worldTopZ)),\r\n rot: currRot + worldRot,\r\n topZ: currTopZ + worldTopZ,\r\n };\r\n };\r\n\r\n /** check is child recursively */\r\n static isChild = (baseId: string, childId: string, checkLock = false): boolean => {\r\n const child = useStore.getState().getElementById(childId);\r\n if (!child) return false;\r\n if (checkLock && child.locked) return false;\r\n if (child.parentId === baseId) return true;\r\n return Util.isChild(baseId, child.parentId, checkLock);\r\n };\r\n\r\n static getBaseId = (id: string): string | null => {\r\n const el = useStore.getState().getElementById(id);\r\n if (!el) return null;\r\n if (el.parentId === GROUND_ID) return el.id;\r\n return Util.getBaseId(el.parentId);\r\n };\r\n\r\n static isElementTriggerAutoDeletion = (el: ElementModel) => {\r\n if (el.type === ObjectType.Roof) {\r\n const roof = el as RoofModel;\r\n if (roof.roofType === RoofType.Gable || roof.roofType === RoofType.Gambrel) {\r\n return true;\r\n }\r\n }\r\n if (el.type !== ObjectType.Wall) return false;\r\n\r\n const wall = el as WallModel;\r\n if (!wall.roofId) return false;\r\n\r\n const roof = useStore.getState().getElementById(wall.roofId) as RoofModel;\r\n if (!roof) return false;\r\n\r\n switch (roof.roofType) {\r\n case RoofType.Hip:\r\n case RoofType.Gable:\r\n case RoofType.Gambrel:\r\n return true;\r\n case RoofType.Pyramid:\r\n case RoofType.Mansard: {\r\n if (roof.wallsId.length === 0) return false;\r\n return roof.wallsId[0] === wall.id;\r\n }\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n static isElementAllowedMultipleMoveOnGround(e: ElementModel) {\r\n if (e.type === ObjectType.Foundation) return true;\r\n if (e.type === ObjectType.Cuboid && e.parentId === GROUND_ID) return true;\r\n return false;\r\n }\r\n}\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { ElementModel } from '../models/ElementModel';\nimport { Discretization, DiurnalTemperatureModel, FoundationTexture, HumanName, ObjectType } from '../types';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { SensorModel } from '../models/SensorModel';\nimport { WorldModel } from '../models/WorldModel';\nimport { GroundModel } from '../models/GroundModel';\nimport { HumanModel } from '../models/HumanModel';\nimport short from 'short-uuid';\nimport { DEFAULT_ADDRESS, DEFAULT_LEAF_OFF_DAY, DEFAULT_LEAF_OUT_DAY, GROUND_ID } from '../constants';\nimport { HumanData } from '../HumanData';\nimport { immerable } from 'immer';\n\n// default scene\n\nexport class DefaultWorldModel implements WorldModel {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n name: string;\n date: string;\n ground: GroundModel;\n latitude: number;\n longitude: number;\n address: string;\n countryCode: string;\n leafDayOfYear1?: number;\n leafDayOfYear2?: number;\n airAttenuationCoefficient: number;\n airConvectiveCoefficient: number;\n timesPerHour: number;\n daysPerYear: number;\n monthlyIrradianceLosses: number[];\n pvGridCellSize: number;\n discretization: Discretization;\n diurnalTemperatureModel: DiurnalTemperatureModel;\n highestTemperatureTimeInMinutes: number;\n\n solarPanelVisibilityGridCellSize: number;\n solarRadiationHeatmapGridCellSize: number;\n\n cspTimesPerHour: number;\n cspDaysPerYear: number;\n cspGridCellSize: number;\n\n sutTimesPerHour: number;\n sutDaysPerYear: number;\n sutGridCellSize: number;\n\n noAnimationForHeatmapSimulation: boolean;\n noAnimationForThermalSimulation: boolean;\n noAnimationForSensorDataCollection: boolean;\n noAnimationForSolarPanelSimulation: boolean;\n noAnimationForSolarUpdraftTowerSimulation: boolean;\n\n constructor() {\n this.latitude = 42.2844063;\n this.longitude = -71.3488548;\n this.address = DEFAULT_ADDRESS;\n this.countryCode = 'US';\n this.date = new Date(new Date().getFullYear(), 5, 22, 12).toLocaleString('en-US');\n\n this.name = 'default';\n this.ground = {\n albedo: 0.3,\n thermalDiffusivity: 0.05,\n snowReflectionFactors: new Array(12).fill(0),\n } as GroundModel;\n\n // The default values are for Natick, MA\n this.leafDayOfYear1 = DEFAULT_LEAF_OUT_DAY;\n this.leafDayOfYear2 = DEFAULT_LEAF_OFF_DAY;\n\n this.airAttenuationCoefficient = 0.01;\n this.airConvectiveCoefficient = 5;\n\n this.timesPerHour = 1; // how many times per hour to collect data\n this.daysPerYear = 12; // how many days per year for sampling\n this.monthlyIrradianceLosses = new Array(12).fill(0.05);\n this.pvGridCellSize = 0.5;\n this.discretization = Discretization.APPROXIMATE;\n this.diurnalTemperatureModel = DiurnalTemperatureModel.Sinusoidal;\n this.highestTemperatureTimeInMinutes = 900; // assume it is 3pm (at 15*60 minutes)\n\n this.solarPanelVisibilityGridCellSize = 0.2;\n this.solarRadiationHeatmapGridCellSize = 0.5;\n\n this.cspTimesPerHour = 1;\n this.cspDaysPerYear = 4;\n this.cspGridCellSize = 0.5;\n\n this.sutTimesPerHour = 1;\n this.sutDaysPerYear = 4;\n this.sutGridCellSize = 1;\n\n this.noAnimationForHeatmapSimulation = false;\n this.noAnimationForThermalSimulation = false;\n this.noAnimationForSensorDataCollection = false;\n this.noAnimationForSolarPanelSimulation = false;\n this.noAnimationForSolarUpdraftTowerSimulation = false;\n }\n\n static resetWorldModel(worldModel: WorldModel) {\n worldModel.latitude = 42.2844063;\n worldModel.longitude = -71.3488548;\n worldModel.address = DEFAULT_ADDRESS;\n worldModel.countryCode = 'US';\n worldModel.date = new Date(new Date().getFullYear(), 5, 22, 12).toLocaleString('en-US');\n\n worldModel.name = 'default';\n worldModel.ground.albedo = 0.3;\n worldModel.ground.thermalDiffusivity = 0.05;\n worldModel.ground.snowReflectionFactors.fill(0);\n\n worldModel.airAttenuationCoefficient = 0.01;\n worldModel.airConvectiveCoefficient = 5;\n\n worldModel.timesPerHour = 1; // how many times per hour to collect data\n worldModel.daysPerYear = 12; // how many days per year for sampling\n worldModel.monthlyIrradianceLosses = new Array(12).fill(0.05);\n worldModel.pvGridCellSize = 0.5;\n worldModel.discretization = Discretization.APPROXIMATE;\n worldModel.diurnalTemperatureModel = DiurnalTemperatureModel.Sinusoidal;\n worldModel.highestTemperatureTimeInMinutes = 900;\n\n worldModel.solarPanelVisibilityGridCellSize = 0.2;\n worldModel.solarRadiationHeatmapGridCellSize = 0.5;\n\n worldModel.cspTimesPerHour = 1;\n worldModel.cspDaysPerYear = 4;\n worldModel.cspGridCellSize = 0.5;\n\n worldModel.sutTimesPerHour = 1;\n worldModel.sutDaysPerYear = 4;\n worldModel.sutGridCellSize = 1;\n\n worldModel.noAnimationForHeatmapSimulation = false;\n worldModel.noAnimationForThermalSimulation = false;\n worldModel.noAnimationForSensorDataCollection = false;\n worldModel.noAnimationForSolarPanelSimulation = false;\n worldModel.noAnimationForSolarUpdraftTowerSimulation = false;\n }\n\n getElements() {\n const elements: ElementModel[] = [];\n\n const foundation = {\n type: ObjectType.Foundation,\n cx: 0,\n cy: 0,\n cz: 0.05,\n lx: 10,\n ly: 10,\n lz: 0.1,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n parentId: GROUND_ID,\n textureType: FoundationTexture.NoTexture,\n id: short.generate() as string,\n } as FoundationModel;\n elements.push(foundation);\n\n const sensor = {\n type: ObjectType.Sensor,\n cx: -0.1,\n cy: 0,\n cz: 0.105,\n lx: 0.1,\n ly: 0.1,\n lz: 0.01,\n parentId: foundation.id,\n foundationId: foundation.id,\n normal: [0, 0, 1],\n rotation: [0, 0, 0],\n id: short.generate() as string,\n showLabel: true,\n light: true,\n heatFlux: false,\n } as SensorModel;\n elements.push(sensor);\n\n const woman = {\n type: ObjectType.Human,\n name: HumanName.Judd,\n cx: 1,\n cy: -1,\n cz: 0,\n lx: HumanData.fetchWidth(HumanName.Jiya),\n lz: HumanData.fetchHeight(HumanName.Jiya),\n normal: [1, 0, 0],\n rotation: [0, 0, 0],\n parentId: GROUND_ID,\n id: short.generate() as string,\n } as HumanModel;\n elements.push(woman);\n\n return elements;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport short from 'short-uuid';\nimport { HumanModel } from './HumanModel';\nimport { CuboidTexture, ObjectType } from '../types';\nimport { TreeModel } from './TreeModel';\nimport { SensorModel } from './SensorModel';\nimport { FoundationModel } from './FoundationModel';\nimport { CuboidModel } from './CuboidModel';\nimport { ElementModel } from './ElementModel';\nimport { SolarPanelModel } from './SolarPanelModel';\nimport { WallModel } from './WallModel';\nimport { WindowModel } from './WindowModel';\nimport { GableRoofModel, GambrelRoofModel, HipRoofModel, MansardRoofModel, RoofModel, RoofType } from './RoofModel';\nimport { PolygonModel } from './PolygonModel';\nimport { Util } from '../Util';\nimport { Vector3 } from 'three';\nimport {\n DEFAULT_CEILING_R_VALUE,\n DEFAULT_GROUND_FLOOR_R_VALUE,\n GROUND_ID,\n UNIT_VECTOR_NEG_X,\n UNIT_VECTOR_NEG_Y,\n UNIT_VECTOR_POS_X,\n UNIT_VECTOR_POS_Y,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { ParabolicTroughModel } from './ParabolicTroughModel';\nimport { ParabolicDishModel } from './ParabolicDishModel';\nimport { FresnelReflectorModel } from './FresnelReflectorModel';\nimport { HeliostatModel } from './HeliostatModel';\nimport { DoorModel } from './DoorModel';\nimport { WindTurbineModel } from './WindTurbineModel';\nimport { FlowerModel } from './FlowerModel';\nimport { LightModel } from './LightModel';\n\nexport class ElementModelCloner {\n static clone(\n parent: ElementModel | null,\n e: ElementModel,\n x: number,\n y: number,\n z?: number,\n noMove?: boolean,\n normal?: Vector3,\n oldParent?: ElementModel | null,\n ) {\n let clone = null;\n switch (e.type) {\n case ObjectType.Polygon:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.clonePolygon(parent, e as PolygonModel, x, y, z, noMove, normal);\n }\n break;\n case ObjectType.Sensor:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneSensor(parent, e as SensorModel, x, y, z);\n }\n break;\n case ObjectType.Light:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneLight(parent, e as LightModel, x, y, z);\n }\n break;\n case ObjectType.SolarPanel:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneSolarPanel(parent, e as SolarPanelModel, x, y, z);\n }\n break;\n case ObjectType.ParabolicTrough:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneParabolicTrough(parent, e as ParabolicTroughModel, x, y, z);\n }\n break;\n case ObjectType.ParabolicDish:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneParabolicDish(parent, e as ParabolicDishModel, x, y, z);\n }\n break;\n case ObjectType.FresnelReflector:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneFresnelReflector(parent, e as FresnelReflectorModel, x, y, z);\n }\n break;\n case ObjectType.Heliostat:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneHeliostat(parent, e as HeliostatModel, x, y, z);\n }\n break;\n case ObjectType.WindTurbine:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneWindTurbine(parent, e as WindTurbineModel, x, y, z);\n }\n break;\n case ObjectType.Wall:\n if (parent) {\n clone = ElementModelCloner.cloneWall(parent, e as WallModel, x, y, z);\n }\n break;\n case ObjectType.Window:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneWindow(parent, e as WindowModel, x, y, z, oldParent);\n }\n break;\n case ObjectType.Door:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneDoor(parent, e as DoorModel, x, y, z);\n }\n break;\n case ObjectType.Roof:\n if (parent) {\n // must have a parent\n clone = ElementModelCloner.cloneRoof(parent, e as RoofModel, x, y, z);\n }\n break;\n case ObjectType.Human:\n clone = ElementModelCloner.cloneHuman(e as HumanModel, x, y, z, parent);\n break;\n case ObjectType.Tree:\n clone = ElementModelCloner.cloneTree(e as TreeModel, x, y, z, parent);\n break;\n case ObjectType.Flower:\n clone = ElementModelCloner.cloneFlower(e as FlowerModel, x, y, z, parent);\n break;\n case ObjectType.Foundation:\n clone = ElementModelCloner.cloneFoundation(e as FoundationModel, x, y);\n break;\n case ObjectType.Cuboid:\n const parentId = parent ? parent.id : GROUND_ID;\n clone = ElementModelCloner.cloneCuboid(parentId, e as CuboidModel, x, y);\n break;\n }\n return clone;\n }\n\n private static cloneHuman(human: HumanModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\n return {\n type: ObjectType.Human,\n name: human.name,\n flip: human.flip,\n cx: x,\n cy: y,\n cz: z,\n lx: human.lx,\n ly: human.ly,\n lz: human.lz,\n normal: [...human.normal],\n rotation: [...human.rotation],\n parentId: parent?.id ?? human.parentId,\n id: short.generate() as string,\n } as HumanModel;\n }\n\n private static cloneTree(tree: TreeModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\n return {\n type: ObjectType.Tree,\n name: tree.name,\n flip: tree.flip,\n cx: x,\n cy: y,\n cz: z,\n lx: tree.lx,\n ly: tree.ly,\n lz: tree.lz,\n normal: [...tree.normal],\n rotation: [...tree.rotation],\n parentId: parent?.id ?? tree.parentId,\n id: short.generate() as string,\n } as TreeModel;\n }\n\n private static cloneFlower(flower: FlowerModel, x: number, y: number, z?: number, parent?: ElementModel | null) {\n return {\n type: ObjectType.Flower,\n name: flower.name,\n flip: flower.flip,\n cx: x,\n cy: y,\n cz: z,\n lx: flower.lx,\n ly: flower.ly,\n lz: flower.lz,\n normal: [...flower.normal],\n rotation: [...flower.rotation],\n parentId: parent?.id ?? flower.parentId,\n id: short.generate() as string,\n } as FlowerModel;\n }\n\n private static clonePolygon(\n parent: ElementModel,\n polygon: PolygonModel,\n x: number,\n y: number,\n z?: number,\n noMove?: boolean,\n normal?: Vector3,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n const vertices = polygon.vertices.map((v) => ({ ...v })); // deep copy;\n const pm = {\n type: ObjectType.Polygon,\n cx: x,\n cy: y,\n cz: z,\n lx: polygon.lx,\n ly: polygon.ly,\n lz: polygon.lz,\n filled: polygon.filled,\n noOutline: polygon.noOutline,\n color: polygon.color,\n lineColor: polygon.lineColor,\n lineWidth: polygon.lineWidth,\n opacity: polygon.opacity,\n textureType: polygon.textureType,\n text: polygon.text,\n fontSize: polygon.fontSize,\n fontColor: polygon.fontColor,\n normal: [...polygon.normal],\n rotation: polygon.parentId ? [...parent.rotation] : [0, 0, 0],\n vertices: vertices,\n parentId: parent.id,\n parentType: parent.type,\n foundationId: foundationId,\n id: short.generate() as string,\n } as PolygonModel;\n if (!noMove) {\n let x1 = x;\n let y1 = y;\n if (parent.type === ObjectType.Cuboid && normal) {\n if (Util.isSame(normal, UNIT_VECTOR_NEG_X)) {\n x1 = z ?? 0;\n } else if (Util.isSame(normal, UNIT_VECTOR_POS_X)) {\n x1 = -(z ?? 0);\n } else if (Util.isSame(normal, UNIT_VECTOR_NEG_Y)) {\n y1 = z ?? 0;\n } else if (Util.isSame(normal, UNIT_VECTOR_POS_Y)) {\n y1 = -(z ?? 0);\n }\n const dot = normal.dot(new Vector3().fromArray(polygon.normal));\n if (Math.abs(dot) < ZERO_TOLERANCE) {\n for (const v of pm.vertices) {\n [v.x, v.y] = [v.y, v.x];\n }\n }\n } else if (parent.type === ObjectType.Wall) {\n x1 = -x;\n y1 = -(z ?? 0);\n }\n Util.translatePolygonCenterTo(pm, x1, y1);\n }\n return pm;\n }\n\n private static cloneSensor(parent: ElementModel, sensor: SensorModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Sensor,\n cx: x,\n cy: y,\n cz: z,\n lx: sensor.lx,\n ly: sensor.ly,\n lz: sensor.lz,\n showLabel: sensor.showLabel,\n normal: [...sensor.normal],\n rotation: sensor.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as SensorModel;\n }\n\n private static cloneLight(parent: ElementModel, light: LightModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Light,\n cx: x,\n cy: y,\n cz: z,\n lx: light.lx,\n ly: light.ly,\n lz: light.lz,\n intensity: light.intensity,\n distance: light.distance,\n decay: light.decay,\n color: light.color,\n showLabel: light.showLabel,\n normal: [...light.normal],\n rotation: light.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as LightModel;\n }\n\n private static cloneSolarPanel(parent: ElementModel, solarPanel: SolarPanelModel, x: number, y: number, z?: number) {\n let foundationId;\n let parentType;\n switch (parent.type) {\n case ObjectType.Foundation:\n case ObjectType.Cuboid:\n foundationId = parent.id;\n parentType = parent.type;\n break;\n case ObjectType.Wall:\n foundationId = parent.parentId;\n parentType = ObjectType.Wall;\n break;\n case ObjectType.Roof:\n parentType = ObjectType.Roof;\n foundationId = parent.parentId;\n break;\n }\n let rotation;\n if (solarPanel.parentType === ObjectType.Roof) {\n rotation = [...solarPanel.rotation];\n } else {\n rotation = solarPanel.parentId ? [...parent.rotation] : [0, 0, 0];\n }\n return {\n type: ObjectType.SolarPanel,\n pvModelName: solarPanel.pvModelName,\n cx: x,\n cy: y,\n cz: z,\n lx: solarPanel.lx,\n ly: solarPanel.ly,\n lz: solarPanel.lz,\n trackerType: solarPanel.trackerType,\n tiltAngle: solarPanel.tiltAngle,\n relativeAzimuth: solarPanel.relativeAzimuth,\n orientation: solarPanel.orientation,\n poleRadius: solarPanel.poleRadius,\n poleHeight: solarPanel.poleHeight,\n poleSpacing: solarPanel.poleSpacing,\n showLabel: solarPanel.showLabel,\n normal: [...solarPanel.normal],\n rotation: rotation,\n parentType: parentType,\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as SolarPanelModel;\n }\n\n private static cloneParabolicTrough(\n parent: ElementModel,\n trough: ParabolicTroughModel,\n x: number,\n y: number,\n z?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.ParabolicTrough,\n cx: x,\n cy: y,\n cz: z,\n lx: trough.lx,\n ly: trough.ly,\n lz: trough.lz,\n reflectance: trough.reflectance,\n absorptance: trough.absorptance,\n opticalEfficiency: trough.opticalEfficiency,\n thermalEfficiency: trough.thermalEfficiency,\n absorberTubeRadius: trough.absorberTubeRadius,\n moduleLength: trough.moduleLength,\n latusRectum: trough.latusRectum,\n tiltAngle: trough.tiltAngle,\n relativeAzimuth: trough.relativeAzimuth,\n poleRadius: trough.poleRadius,\n poleHeight: trough.poleHeight,\n showLabel: trough.showLabel,\n normal: [...trough.normal],\n rotation: trough.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as ParabolicTroughModel;\n }\n\n private static cloneParabolicDish(parent: ElementModel, dish: ParabolicDishModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.ParabolicDish,\n cx: x,\n cy: y,\n cz: z,\n lx: dish.lx,\n ly: dish.ly,\n lz: dish.lz,\n reflectance: dish.reflectance,\n absorptance: dish.absorptance,\n opticalEfficiency: dish.opticalEfficiency,\n thermalEfficiency: dish.thermalEfficiency,\n receiverRadius: dish.receiverRadius,\n structureType: dish.structureType,\n latusRectum: dish.latusRectum,\n tiltAngle: dish.tiltAngle,\n relativeAzimuth: dish.relativeAzimuth,\n poleRadius: dish.poleRadius,\n poleHeight: dish.poleHeight,\n showLabel: dish.showLabel,\n normal: [...dish.normal],\n rotation: dish.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as ParabolicDishModel;\n }\n\n private static cloneFresnelReflector(\n parent: ElementModel,\n reflector: FresnelReflectorModel,\n x: number,\n y: number,\n z?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.FresnelReflector,\n cx: x,\n cy: y,\n cz: z,\n lx: reflector.lx,\n ly: reflector.ly,\n lz: reflector.lz,\n reflectance: reflector.reflectance,\n moduleLength: reflector.moduleLength,\n tiltAngle: reflector.tiltAngle,\n relativeAzimuth: reflector.relativeAzimuth,\n poleRadius: reflector.poleRadius,\n poleHeight: reflector.poleHeight,\n showLabel: reflector.showLabel,\n normal: [...reflector.normal],\n rotation: reflector.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n receiverId: reflector.receiverId,\n foundationId: foundationId,\n id: short.generate() as string,\n } as FresnelReflectorModel;\n }\n\n private static cloneHeliostat(parent: ElementModel, heliostat: HeliostatModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.Heliostat,\n cx: x,\n cy: y,\n cz: z,\n lx: heliostat.lx,\n ly: heliostat.ly,\n lz: heliostat.lz,\n reflectance: heliostat.reflectance,\n tiltAngle: heliostat.tiltAngle,\n relativeAzimuth: heliostat.relativeAzimuth,\n poleRadius: heliostat.poleRadius,\n poleHeight: heliostat.poleHeight,\n showLabel: heliostat.showLabel,\n normal: [...heliostat.normal],\n rotation: heliostat.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n towerId: heliostat.towerId,\n foundationId: foundationId,\n id: short.generate() as string,\n } as HeliostatModel;\n }\n\n private static cloneWindTurbine(\n parent: ElementModel,\n windTurbine: WindTurbineModel,\n x: number,\n y: number,\n z?: number,\n ) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Foundation:\n foundationId = parent.id;\n break;\n }\n return {\n type: ObjectType.WindTurbine,\n cx: x,\n cy: y,\n cz: z,\n lx: windTurbine.lx,\n ly: windTurbine.ly,\n lz: windTurbine.lz,\n bladeRadius: windTurbine.bladeRadius,\n towerRadius: windTurbine.towerRadius,\n towerHeight: windTurbine.towerHeight,\n showLabel: windTurbine.showLabel,\n normal: [...windTurbine.normal],\n rotation: windTurbine.parentId ? [...parent.rotation] : [0, 0, 0],\n parentId: parent.id,\n foundationId: foundationId,\n id: short.generate() as string,\n } as WindTurbineModel;\n }\n\n private static cloneFoundation(foundation: FoundationModel, x: number, y: number) {\n return {\n type: ObjectType.Foundation,\n cx: x,\n cy: y,\n cz: foundation.cz,\n lx: foundation.lx,\n ly: foundation.ly,\n lz: foundation.lz,\n normal: [...foundation.normal],\n rotation: [...foundation.rotation],\n parentId: foundation.parentId,\n color: foundation.color,\n textureType: foundation.textureType,\n solarStructure: foundation.solarStructure,\n solarUpdraftTower: { ...foundation.solarUpdraftTower },\n solarAbsorberPipe: { ...foundation.solarAbsorberPipe },\n solarPowerTower: { ...foundation.solarPowerTower },\n hvacSystem: { ...foundation.hvacSystem },\n labelHeight: foundation.labelHeight,\n labelSize: foundation.labelSize,\n showLabel: foundation.showLabel,\n rValue: foundation.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE,\n id: short.generate() as string,\n } as FoundationModel;\n }\n\n private static cloneCuboid(parentId: string, cuboid: CuboidModel, x: number, y: number) {\n return {\n type: ObjectType.Cuboid,\n cx: x,\n cy: y,\n cz: cuboid.cz,\n lx: cuboid.lx,\n ly: cuboid.ly,\n lz: cuboid.lz,\n color: cuboid.color,\n faceColors: cuboid.faceColors ? [...cuboid.faceColors] : ['gray', 'gray', 'gray', 'gray', 'gray', 'gray'],\n textureTypes: cuboid.textureTypes\n ? [...cuboid.textureTypes]\n : [\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n ],\n normal: [...cuboid.normal],\n rotation: [...cuboid.rotation],\n stackable: cuboid.stackable,\n enableGroupMaster: cuboid.enableGroupMaster,\n parentId: parentId,\n id: short.generate() as string,\n } as CuboidModel;\n }\n\n private static cloneWall(parent: ElementModel, wall: WallModel, x: number, y: number, z?: number) {\n return {\n type: ObjectType.Wall,\n cx: x,\n cy: y,\n cz: z,\n lx: wall.lx,\n ly: wall.ly,\n lz: wall.lz,\n parapet: { ...wall.parapet },\n eavesLength: wall.eavesLength ?? 0,\n rValue: wall.rValue,\n volumetricHeatCapacity: wall.volumetricHeatCapacity,\n fill: wall.fill,\n leftUnfilledHeight: wall.leftUnfilledHeight,\n rightUnfilledHeight: wall.rightUnfilledHeight,\n leftTopPartialHeight: wall.leftTopPartialHeight,\n rightTopPartialHeight: wall.rightTopPartialHeight,\n leftJoints: [],\n rightJoints: [],\n leftPoint: [...wall.leftPoint],\n rightPoint: [...wall.rightPoint],\n relativeAngle: wall.relativeAngle,\n textureType: wall.textureType,\n color: wall.color,\n normal: [...wall.normal],\n rotation: [...wall.rotation],\n id: short.generate() as string,\n parentId: parent.id,\n foundationId: parent.id,\n wallStructure: wall.wallStructure,\n structureSpacing: wall.structureSpacing,\n structureColor: wall.structureColor,\n structureWidth: wall.structureWidth,\n opacity: wall.opacity,\n roofId: wall.roofId,\n leftRoofHeight: wall.leftRoofHeight,\n rightRoofHeight: wall.rightRoofHeight,\n centerRoofHeight: wall.centerRoofHeight,\n centerLeftRoofHeight: wall.centerLeftRoofHeight,\n centerRightRoofHeight: wall.centerRightRoofHeight,\n } as WallModel;\n }\n\n private static cloneWindow(\n parent: ElementModel,\n window: WindowModel,\n x: number,\n y: number,\n z?: number,\n oldParent?: ElementModel | null,\n ) {\n let foundationId;\n let [lx, ly, lz] = [window.lx, parent.ly, window.lz];\n let cy = 0.1;\n let rotation = [...window.rotation];\n switch (parent.type) {\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n foundationId = parent.parentId;\n rotation = [0, -1, 0];\n break;\n case ObjectType.Roof:\n foundationId = parent.parentId;\n cy = y;\n ly = (parent as RoofModel).thickness;\n break;\n }\n\n // copy to wall\n if (parent.type === ObjectType.Wall) {\n lx = window.lx / parent.lx;\n lz = window.lz / parent.lz;\n }\n return {\n type: ObjectType.Window,\n cx: x,\n cy: cy,\n cz: z,\n lx: lx,\n ly: ly,\n lz: lz,\n uValue: window.uValue,\n horizontalMullion: window.horizontalMullion,\n verticalMullion: window.verticalMullion,\n mullionWidth: window.mullionWidth,\n horizontalMullionSpacing: window.horizontalMullionSpacing,\n verticalMullionSpacing: window.verticalMullionSpacing,\n mullionColor: window.mullionColor,\n frame: window.frame,\n frameWidth: window.frameWidth,\n sillWidth: window.sillWidth,\n windowType: window.windowType,\n archHeight: window.archHeight,\n color: window.color,\n normal: [0, 0, 0],\n rotation: rotation,\n id: short.generate() as string,\n parentId: parent.id,\n foundationId: foundationId,\n tint: window.tint,\n opacity: window.opacity,\n leftShutter: window.leftShutter,\n rightShutter: window.rightShutter,\n shutterColor: window.shutterColor,\n shutterWidth: window.shutterWidth,\n empty: window.empty,\n interior: window.interior,\n parentType: parent.type,\n polygonTop: window.polygonTop,\n } as WindowModel;\n }\n\n private static cloneDoor(parent: ElementModel, door: DoorModel, x: number, y: number, z?: number) {\n let foundationId;\n switch (parent.type) {\n case ObjectType.Cuboid:\n foundationId = parent.id;\n break;\n case ObjectType.Wall:\n case ObjectType.Roof:\n foundationId = parent.parentId;\n break;\n }\n return {\n type: ObjectType.Door,\n cx: x,\n cy: door.cy,\n cz: door.cz,\n lx: door.lx,\n ly: door.ly,\n lz: door.lz,\n color: door.color,\n frameColor: door.frameColor,\n opacity: door.opacity,\n uValue: door.uValue,\n volumetricHeatCapacity: door.volumetricHeatCapacity,\n textureType: door.textureType,\n filled: door.filled,\n interior: door.interior,\n doorType: door.doorType,\n archHeight: door.archHeight,\n normal: [...door.normal],\n rotation: [...door.rotation],\n id: short.generate() as string,\n parentId: parent.id,\n foundationId: foundationId,\n } as DoorModel;\n }\n\n private static cloneRoof(parent: ElementModel, roof: RoofModel, x: number, y: number, z?: number) {\n const newRoof = {\n id: short.generate() as string,\n type: ObjectType.Roof,\n cx: x,\n cy: y,\n cz: z,\n lx: roof.lx,\n ly: roof.ly,\n lz: roof.lz,\n ceiling: roof.ceiling,\n rise: roof.rise,\n color: roof.color,\n rValue: roof.rValue,\n ceilingRValue: roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE,\n volumetricHeatCapacity: roof.volumetricHeatCapacity,\n sideColor: roof.sideColor,\n normal: [...roof.normal],\n rotation: [...roof.rotation],\n parentId: parent.id,\n foundationId: parent.id,\n roofType: roof.roofType,\n roofStructure: roof.roofStructure,\n rafterColor: roof.rafterColor,\n rafterSpacing: roof.rafterSpacing,\n rafterWidth: roof.rafterWidth,\n textureType: roof.textureType,\n thickness: roof.thickness,\n wallsId: [...roof.wallsId], // handled in common store\n opacity: roof.opacity,\n glassTint: roof.glassTint,\n } as RoofModel;\n switch (roof.roofType) {\n case RoofType.Gable:\n (newRoof as GableRoofModel).ridgeLeftPoint = [...(roof as GableRoofModel).ridgeLeftPoint];\n (newRoof as GableRoofModel).ridgeRightPoint = [...(roof as GableRoofModel).ridgeRightPoint];\n break;\n case RoofType.Gambrel:\n const newGambrelRoof = newRoof as GambrelRoofModel;\n const oldGambrelRoof = roof as GambrelRoofModel;\n newGambrelRoof.topRidgePoint = [...oldGambrelRoof.topRidgePoint];\n newGambrelRoof.frontRidgePoint = [...oldGambrelRoof.frontRidgePoint];\n newGambrelRoof.backRidgePoint = [...oldGambrelRoof.backRidgePoint];\n break;\n case RoofType.Hip:\n (newRoof as HipRoofModel).rightRidgeLength = (roof as HipRoofModel).rightRidgeLength;\n (newRoof as HipRoofModel).leftRidgeLength = (roof as HipRoofModel).leftRidgeLength;\n break;\n case RoofType.Mansard:\n (newRoof as MansardRoofModel).ridgeWidth = (roof as MansardRoofModel).ridgeWidth;\n break;\n }\n return newRoof as ElementModel;\n }\n}\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { ViewState } from './ViewState';\r\nimport { immerable } from 'immer';\r\nimport { Rectangle } from '../models/Rectangle';\r\nimport {\r\n DEFAULT_HEAT_FLUX_COLOR,\r\n DEFAULT_HEAT_FLUX_SCALE_FACTOR,\r\n DEFAULT_HEAT_FLUX_WIDTH,\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n DEFAULT_WINDOW_SHININESS,\r\n} from '../constants';\r\n\r\nexport class DefaultViewState implements ViewState {\r\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\r\n [immerable] = true;\r\n\r\n navigationView: boolean;\r\n orthographic: boolean;\r\n enableRotate: boolean;\r\n directLightIntensity: number;\r\n ambientLightIntensity: number;\r\n cameraPosition: number[];\r\n cameraPosition2D: number[];\r\n panCenter: number[];\r\n panCenter2D: number[];\r\n cameraZoom: number;\r\n cameraPositionNav: number[];\r\n cameraRotationNav: number[];\r\n\r\n axes: boolean;\r\n heatFluxScaleFactor: number;\r\n heatFluxColor: string;\r\n heatFluxWidth: number;\r\n solarRadiationHeatMapMaxValue: number;\r\n solarRadiationHeatMapReflectionOnly: boolean; // for heliostats and Fresnel reflectors\r\n shadowEnabled: boolean;\r\n theme: string;\r\n heliodon: boolean;\r\n showSunAngles: boolean;\r\n showAzimuthAngle: boolean;\r\n showElevationAngle: boolean;\r\n showZenithAngle: boolean;\r\n groundImage: boolean;\r\n groundImageType: string;\r\n groundColor: string;\r\n waterSurface: boolean;\r\n solarPanelShininess: number;\r\n windowShininess: number;\r\n\r\n showMapPanel: boolean;\r\n showHeliodonPanel: boolean;\r\n showWeatherPanel: boolean;\r\n showDiurnalTemperaturePanel: boolean;\r\n showStickyNotePanel: boolean;\r\n showSiteInfoPanel: boolean;\r\n showDesignInfoPanel: boolean;\r\n showInstructionPanel: boolean;\r\n showDailyLightSensorPanel: boolean;\r\n showYearlyLightSensorPanel: boolean;\r\n showDailyPvYieldPanel: boolean;\r\n showYearlyPvYieldPanel: boolean;\r\n showSolarPanelVisibilityResultsPanel: boolean;\r\n showDailyParabolicTroughYieldPanel: boolean;\r\n showYearlyParabolicTroughYieldPanel: boolean;\r\n showDailyParabolicDishYieldPanel: boolean;\r\n showYearlyParabolicDishYieldPanel: boolean;\r\n showDailyFresnelReflectorYieldPanel: boolean;\r\n showYearlyFresnelReflectorYieldPanel: boolean;\r\n showDailyHeliostatYieldPanel: boolean;\r\n showYearlyHeliostatYieldPanel: boolean;\r\n showDailyUpdraftTowerYieldPanel: boolean;\r\n showYearlyUpdraftTowerYieldPanel: boolean;\r\n showDailyBuildingEnergyPanel: boolean;\r\n showYearlyBuildingEnergyPanel: boolean;\r\n showEvolutionPanel: boolean;\r\n autoRotate: boolean;\r\n\r\n heliodonPanelX: number;\r\n heliodonPanelY: number;\r\n mapPanelX: number;\r\n mapPanelY: number;\r\n weatherPanelRect: Rectangle;\r\n diurnalTemperaturePanelRect: Rectangle;\r\n stickyNotePanelRect: Rectangle;\r\n dailyLightSensorPanelRect: Rectangle;\r\n yearlyLightSensorPanelRect: Rectangle;\r\n yearlyLightSensorPanelShowDaylight: boolean;\r\n yearlyLightSensorPanelShowClearness: boolean;\r\n dailyPvYieldPanelRect: Rectangle;\r\n yearlyPvYieldPanelRect: Rectangle;\r\n visibilityResultsPanelRect: Rectangle;\r\n dailyParabolicTroughYieldPanelRect: Rectangle;\r\n yearlyParabolicTroughYieldPanelRect: Rectangle;\r\n dailyParabolicDishYieldPanelRect: Rectangle;\r\n yearlyParabolicDishYieldPanelRect: Rectangle;\r\n dailyFresnelReflectorYieldPanelRect: Rectangle;\r\n yearlyFresnelReflectorYieldPanelRect: Rectangle;\r\n dailyHeliostatYieldPanelRect: Rectangle;\r\n yearlyHeliostatYieldPanelRect: Rectangle;\r\n dailyUpdraftTowerYieldPanelRect: Rectangle;\r\n yearlyUpdraftTowerYieldPanelRect: Rectangle;\r\n dailyBuildingEnergyPanelRect: Rectangle;\r\n yearlyBuildingEnergyPanelRect: Rectangle;\r\n evolutionPanelRect: Rectangle;\r\n\r\n mapZoom: number;\r\n mapType: string;\r\n mapTilt: number;\r\n\r\n constructor() {\r\n this.navigationView = false;\r\n this.orthographic = false;\r\n this.enableRotate = true;\r\n this.directLightIntensity = 1;\r\n this.ambientLightIntensity = 0.1;\r\n this.cameraPosition = [5, -30, 1];\r\n this.cameraPosition2D = [0, 0, 150];\r\n this.panCenter = [0, 0, 0];\r\n this.panCenter2D = [0, 0, 0];\r\n this.cameraZoom = 20;\r\n this.cameraPositionNav = [5, -30, 1];\r\n this.cameraRotationNav = [1.5374753309166491, 0.16505866097993566, 0.005476951734475092];\r\n\r\n this.axes = true;\r\n this.heatFluxScaleFactor = DEFAULT_HEAT_FLUX_SCALE_FACTOR;\r\n this.heatFluxColor = DEFAULT_HEAT_FLUX_COLOR;\r\n this.heatFluxWidth = DEFAULT_HEAT_FLUX_WIDTH;\r\n this.solarRadiationHeatMapMaxValue = 5;\r\n this.solarRadiationHeatMapReflectionOnly = false;\r\n this.shadowEnabled = true;\r\n this.theme = 'Default';\r\n this.heliodon = false;\r\n this.showSunAngles = false;\r\n this.showAzimuthAngle = true;\r\n this.showElevationAngle = true;\r\n this.showZenithAngle = true;\r\n this.groundImage = false;\r\n this.groundImageType = 'roadmap';\r\n this.groundColor = '#16A5A5';\r\n this.waterSurface = false;\r\n this.solarPanelShininess = DEFAULT_SOLAR_PANEL_SHININESS;\r\n this.windowShininess = DEFAULT_WINDOW_SHININESS;\r\n\r\n this.showMapPanel = false;\r\n this.showHeliodonPanel = false;\r\n this.showWeatherPanel = false;\r\n this.showDiurnalTemperaturePanel = false;\r\n this.showStickyNotePanel = false;\r\n this.showSiteInfoPanel = true;\r\n this.showDesignInfoPanel = false;\r\n this.showInstructionPanel = true;\r\n this.showDailyLightSensorPanel = false;\r\n this.showYearlyLightSensorPanel = false;\r\n this.showDailyPvYieldPanel = false;\r\n this.showYearlyPvYieldPanel = false;\r\n this.showSolarPanelVisibilityResultsPanel = false;\r\n this.showDailyParabolicTroughYieldPanel = false;\r\n this.showYearlyParabolicTroughYieldPanel = false;\r\n this.showDailyParabolicDishYieldPanel = false;\r\n this.showYearlyParabolicDishYieldPanel = false;\r\n this.showDailyFresnelReflectorYieldPanel = false;\r\n this.showYearlyFresnelReflectorYieldPanel = false;\r\n this.showDailyHeliostatYieldPanel = false;\r\n this.showYearlyHeliostatYieldPanel = false;\r\n this.showDailyUpdraftTowerYieldPanel = false;\r\n this.showYearlyUpdraftTowerYieldPanel = false;\r\n this.showDailyBuildingEnergyPanel = false;\r\n this.showYearlyBuildingEnergyPanel = false;\r\n this.showEvolutionPanel = false;\r\n this.autoRotate = false;\r\n\r\n this.heliodonPanelX = 0;\r\n this.heliodonPanelY = 0;\r\n this.mapPanelX = 0;\r\n this.mapPanelY = 0;\r\n this.weatherPanelRect = new Rectangle(0, 0, 500, 500);\r\n this.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\r\n this.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\r\n this.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\r\n this.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\r\n this.yearlyLightSensorPanelShowDaylight = false;\r\n this.yearlyLightSensorPanelShowClearness = false;\r\n this.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\r\n this.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\r\n this.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\r\n this.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\r\n\r\n this.mapZoom = 18;\r\n this.mapType = 'roadmap';\r\n this.mapTilt = 0;\r\n }\r\n\r\n static resetViewState(viewState: ViewState) {\r\n viewState.navigationView = false;\r\n viewState.orthographic = false;\r\n viewState.enableRotate = true;\r\n viewState.cameraPosition = [5, -30, 1];\r\n viewState.panCenter = [0, 0, 0];\r\n viewState.cameraZoom = 20;\r\n viewState.cameraPosition2D = [0, 0, 20];\r\n viewState.panCenter2D = [0, 0, 0];\r\n viewState.directLightIntensity = 1;\r\n viewState.ambientLightIntensity = 0.1;\r\n viewState.cameraPositionNav = [5, -30, 1];\r\n viewState.cameraRotationNav = [1.5374753309166491, 0.16505866097993566, 0.005476951734475092];\r\n\r\n viewState.axes = true;\r\n viewState.heatFluxScaleFactor = DEFAULT_HEAT_FLUX_SCALE_FACTOR;\r\n viewState.heatFluxColor = DEFAULT_HEAT_FLUX_COLOR;\r\n viewState.heatFluxWidth = DEFAULT_HEAT_FLUX_WIDTH;\r\n viewState.solarRadiationHeatMapMaxValue = 5;\r\n viewState.solarRadiationHeatMapReflectionOnly = false;\r\n viewState.shadowEnabled = true;\r\n viewState.theme = 'Default';\r\n viewState.heliodon = false;\r\n viewState.showSunAngles = false;\r\n viewState.showAzimuthAngle = true;\r\n viewState.showElevationAngle = true;\r\n viewState.showZenithAngle = true;\r\n viewState.groundImage = false;\r\n viewState.groundImageType = 'roadmap';\r\n viewState.groundColor = '#16A5A5';\r\n viewState.waterSurface = false;\r\n viewState.solarPanelShininess = DEFAULT_SOLAR_PANEL_SHININESS;\r\n viewState.windowShininess = DEFAULT_WINDOW_SHININESS;\r\n\r\n viewState.showMapPanel = false;\r\n viewState.showHeliodonPanel = false;\r\n viewState.showWeatherPanel = false;\r\n viewState.showDiurnalTemperaturePanel = false;\r\n viewState.showStickyNotePanel = false;\r\n viewState.showSiteInfoPanel = true;\r\n viewState.showDesignInfoPanel = true;\r\n viewState.showInstructionPanel = true;\r\n viewState.showDailyLightSensorPanel = false;\r\n viewState.showYearlyLightSensorPanel = false;\r\n viewState.showDailyPvYieldPanel = false;\r\n viewState.showYearlyPvYieldPanel = false;\r\n viewState.showSolarPanelVisibilityResultsPanel = false;\r\n viewState.showDailyParabolicTroughYieldPanel = false;\r\n viewState.showYearlyParabolicTroughYieldPanel = false;\r\n viewState.showDailyParabolicDishYieldPanel = false;\r\n viewState.showYearlyParabolicDishYieldPanel = false;\r\n viewState.showDailyFresnelReflectorYieldPanel = false;\r\n viewState.showYearlyFresnelReflectorYieldPanel = false;\r\n viewState.showDailyHeliostatYieldPanel = false;\r\n viewState.showYearlyHeliostatYieldPanel = false;\r\n viewState.showDailyUpdraftTowerYieldPanel = false;\r\n viewState.showYearlyUpdraftTowerYieldPanel = false;\r\n viewState.showDailyBuildingEnergyPanel = false;\r\n viewState.showYearlyBuildingEnergyPanel = false;\r\n viewState.showEvolutionPanel = false;\r\n viewState.autoRotate = false;\r\n\r\n viewState.heliodonPanelX = 0;\r\n viewState.heliodonPanelY = 0;\r\n viewState.mapPanelX = 0;\r\n viewState.mapPanelY = 0;\r\n viewState.weatherPanelRect = new Rectangle(0, 0, 500, 500);\r\n viewState.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\r\n viewState.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\r\n viewState.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\r\n viewState.yearlyLightSensorPanelShowDaylight = false;\r\n viewState.yearlyLightSensorPanelShowClearness = false;\r\n viewState.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\r\n viewState.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\r\n viewState.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 400);\r\n viewState.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\r\n\r\n viewState.mapZoom = 18;\r\n viewState.mapType = 'roadmap';\r\n viewState.mapTilt = 0;\r\n }\r\n}\r\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Undoable } from './Undoable';\n\nexport class UndoManager {\n private commands: Undoable[];\n private index: number;\n private limit: number;\n private isExecuting: boolean;\n\n constructor() {\n this.commands = [];\n this.index = -1;\n this.limit = 0;\n this.isExecuting = false;\n }\n\n // Add a command to the queue\n add(command: Undoable): void {\n if (this.isExecuting) {\n return;\n }\n // if we are here after having called undo, invalidate items higher on the stack\n this.commands.splice(this.index + 1, this.commands.length - this.index);\n this.commands.push(command);\n // if limit is set, remove items from the start of the commands array\n if (this.limit > 0 && this.commands.length > this.limit) {\n this.commands.splice(0, this.commands.length - this.limit);\n }\n // set the current index to the end\n this.index = this.commands.length - 1;\n }\n\n // Call the undo function at the current index and decrease the index by 1.\n undo(): string | undefined {\n const command = this.commands[this.index];\n if (!command) {\n return undefined;\n }\n this.isExecuting = true;\n command.undo();\n this.isExecuting = false;\n this.index--;\n return command.name;\n }\n\n // Call the redo function at the next index and increase the index by 1.\n redo(): string | undefined {\n const command = this.commands[this.index + 1];\n if (!command) {\n return undefined;\n }\n this.isExecuting = true;\n command.redo();\n this.isExecuting = false;\n this.index++;\n return command.name;\n }\n\n // Clears the memory, losing all stored states. Reset the index.\n clear(): void {\n this.commands = [];\n this.index = -1;\n }\n\n hasUndo(): boolean {\n return this.index !== -1;\n }\n\n hasRedo(): boolean {\n return this.index < this.commands.length - 1;\n }\n\n getLastUndoName(): string | undefined {\n const command = this.commands[this.index];\n if (!command) {\n return undefined;\n }\n return command.name;\n }\n\n getLastRedoName(): string | undefined {\n const command = this.commands[this.index + 1];\n if (!command) {\n return undefined;\n }\n return command.name;\n }\n\n setLimit(l: number): void {\n this.limit = l;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { SolarPanelArrayLayoutParams } from './SolarPanelArrayLayoutParams';\nimport { Orientation, RowAxis } from '../types';\nimport { immerable } from 'immer';\n\nexport class DefaultSolarPanelArrayLayoutParams implements SolarPanelArrayLayoutParams {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n pvModelName: string;\n rowAxis: RowAxis;\n orientation: Orientation;\n tiltAngle: number;\n rowsPerRack: number;\n interRowSpacing: number;\n poleHeight: number;\n poleSpacing: number;\n margin: number;\n\n constructor() {\n this.pvModelName = 'CS6X-355P-FG';\n this.rowAxis = RowAxis.leftRight;\n this.orientation = Orientation.landscape;\n this.tiltAngle = 0;\n this.rowsPerRack = 1;\n this.interRowSpacing = 2;\n this.poleHeight = 1;\n this.poleSpacing = 3;\n this.margin = 0;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nexport class ElementCounter {\n foundationCount: number = 0;\n cuboidCount: number = 0;\n wallCount: number = 0;\n windowCount: number = 0;\n doorCount: number = 0;\n humanCount: number = 0;\n treeCount: number = 0;\n flowerCount: number = 0;\n polygonCount: number = 0;\n sensorCount: number = 0;\n insideLightCount: number = 0;\n outsideLightCount: number = 0;\n solarPanelCount: number = 0;\n solarPanelModuleCount: number = 0;\n parabolicDishCount: number = 0;\n parabolicTroughCount: number = 0;\n fresnelReflectorCount: number = 0;\n heliostatCount: number = 0;\n solarUpdraftTowerCount: number = 0;\n windTurbineCount: number = 0;\n\n gotSome() {\n return (\n this.foundationCount > 0 ||\n this.cuboidCount > 0 ||\n this.wallCount > 0 ||\n this.windowCount > 0 ||\n this.doorCount > 0 ||\n this.humanCount > 0 ||\n this.treeCount > 0 ||\n this.flowerCount > 0 ||\n this.polygonCount > 0 ||\n this.sensorCount > 0 ||\n this.insideLightCount > 0 ||\n this.outsideLightCount > 0 ||\n this.solarPanelCount > 0 ||\n this.parabolicTroughCount > 0 ||\n this.parabolicDishCount > 0 ||\n this.fresnelReflectorCount > 0 ||\n this.heliostatCount > 0 ||\n this.solarUpdraftTowerCount > 0 ||\n this.windTurbineCount > 0\n );\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { GeneticAlgorithmParams } from './GeneticAlgorithmParams';\nimport { SearchMethod, GeneticAlgorithmSelectionMethod, ObjectiveFunctionType, DesignProblem } from '../types';\nimport { immerable } from 'immer';\n\nexport class DefaultGeneticAlgorithmParams implements GeneticAlgorithmParams {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n problem: DesignProblem;\n objectiveFunctionType: ObjectiveFunctionType;\n selectionMethod: GeneticAlgorithmSelectionMethod;\n searchMethod: SearchMethod;\n populationSize: number;\n maximumGenerations: number;\n selectionRate: number;\n crossoverRate: number;\n mutationRate: number;\n convergenceThreshold: number;\n localSearchRadius: number;\n\n constructor(problem: DesignProblem) {\n this.problem = problem;\n this.objectiveFunctionType = ObjectiveFunctionType.DAILY_TOTAL_OUTPUT;\n this.selectionMethod = GeneticAlgorithmSelectionMethod.ROULETTE_WHEEL;\n this.searchMethod = SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION;\n this.populationSize = 20;\n this.maximumGenerations = 5;\n this.selectionRate = 0.5;\n this.crossoverRate = 0.5;\n this.mutationRate = 0.1;\n this.convergenceThreshold = 0.01;\n this.localSearchRadius = 0.1;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { SearchMethod, ObjectiveFunctionType, DesignProblem } from '../types';\nimport { ParticleSwarmOptimizationParams } from './ParticleSwarmOptimizationParams';\nimport { immerable } from 'immer';\n\nexport class DefaultParticleSwarmOptimizationParams implements ParticleSwarmOptimizationParams {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n problem: DesignProblem;\n objectiveFunctionType: ObjectiveFunctionType;\n searchMethod: SearchMethod;\n swarmSize: number;\n maximumSteps: number;\n vmax: number;\n inertia: number;\n cognitiveCoefficient: number;\n socialCoefficient: number;\n convergenceThreshold: number;\n localSearchRadius: number;\n\n constructor(problem: DesignProblem) {\n this.problem = problem;\n this.objectiveFunctionType = ObjectiveFunctionType.DAILY_TOTAL_OUTPUT;\n this.searchMethod = SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION;\n this.swarmSize = 20;\n this.maximumSteps = 5;\n this.vmax = 0.01;\n this.inertia = 0.8;\n this.cognitiveCoefficient = 0.1;\n this.socialCoefficient = 0.1;\n this.convergenceThreshold = 0.01;\n this.localSearchRadius = 0.1;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { EvolutionaryAlgorithmState } from './EvolutionaryAlgorithmState';\nimport { GeneticAlgorithmParams } from './GeneticAlgorithmParams';\nimport { DefaultGeneticAlgorithmParams } from './DefaultGeneticAlgorithmParams';\nimport { ParticleSwarmOptimizationParams } from './ParticleSwarmOptimizationParams';\nimport { DefaultParticleSwarmOptimizationParams } from './DefaultParticleSwarmOptimizationParams';\nimport { DesignProblem } from '../types';\nimport { immerable } from 'immer';\n\nexport class DefaultEvolutionaryAlgorithmState implements EvolutionaryAlgorithmState {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n geneticAlgorithmParams: GeneticAlgorithmParams;\n particleSwarmOptimizationParams: ParticleSwarmOptimizationParams;\n\n constructor() {\n this.geneticAlgorithmParams = new DefaultGeneticAlgorithmParams(DesignProblem.SOLAR_PANEL_TILT_ANGLE);\n this.particleSwarmOptimizationParams = new DefaultParticleSwarmOptimizationParams(\n DesignProblem.SOLAR_PANEL_TILT_ANGLE,\n );\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { SolarPanelArrayLayoutConstraints } from './SolarPanelArrayLayoutConstraints';\nimport { HALF_PI } from '../constants';\nimport { immerable } from 'immer';\nimport { Orientation, RowAxis } from '../types';\n\nexport class DefaultSolarPanelArrayLayoutConstraints implements SolarPanelArrayLayoutConstraints {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n minimumInterRowSpacing: number;\n maximumInterRowSpacing: number;\n minimumRowsPerRack: number;\n maximumRowsPerRack: number;\n minimumTiltAngle: number;\n maximumTiltAngle: number;\n poleHeight: number;\n poleSpacing: number;\n orientation: Orientation;\n pvModelName: string;\n rowAxis: RowAxis;\n margin?: number;\n\n constructor() {\n this.minimumInterRowSpacing = 2;\n this.maximumInterRowSpacing = 10;\n this.minimumRowsPerRack = 1;\n this.maximumRowsPerRack = 6;\n this.minimumTiltAngle = -HALF_PI;\n this.maximumTiltAngle = HALF_PI;\n this.poleHeight = 1;\n this.poleSpacing = 5;\n this.orientation = Orientation.landscape;\n this.pvModelName = 'CS6X-355P-FG';\n this.rowAxis = RowAxis.leftRight;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { EconomicsParams } from './EconomicsParams';\nimport { immerable } from 'immer';\n\nexport class DefaultEconomicsParams implements EconomicsParams {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n projectLifeSpan: number;\n electricitySellingPrice: number;\n operationalCostPerUnit: number;\n\n constructor() {\n this.projectLifeSpan = 25;\n this.electricitySellingPrice = 0.25; // US dollars per kWh\n this.operationalCostPerUnit = 0.15; // US dollars per day\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { immerable } from 'immer';\nimport { ActionState } from './ActionState';\nimport {\n CuboidTexture,\n DoorTexture,\n FlowerType,\n FoundationTexture,\n HumanName,\n Orientation,\n ParabolicDishStructureType,\n RoofTexture,\n TreeType,\n WallTexture,\n} from '../types';\nimport { ParapetArgs, WallStructure } from '../models/WallModel';\nimport { WindowType } from 'src/models/WindowModel';\nimport { RoofStructure } from '../models/RoofModel';\nimport { DoorType } from 'src/models/DoorModel';\nimport {\n DEFAULT_CEILING_R_VALUE,\n DEFAULT_DOOR_U_VALUE,\n DEFAULT_GROUND_FLOOR_R_VALUE,\n DEFAULT_ROOF_R_VALUE,\n DEFAULT_WALL_R_VALUE,\n DEFAULT_WINDOW_U_VALUE,\n} from '../constants';\nimport { DEFAULT_PARAPET_SETTINGS } from 'src/views/wall/parapet';\n\nexport class DefaultActionState implements ActionState {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n humanName: HumanName;\n\n flowerType: FlowerType;\n\n treeType: TreeType;\n treeSpread: number;\n treeHeight: number;\n\n foundationHeight: number;\n foundationColor: string;\n foundationTexture: FoundationTexture;\n groundFloorRValue: number;\n\n cuboidHeight: number;\n cuboidFaceColors: string[];\n cuboidFaceTextures: CuboidTexture[];\n cuboidStackable: boolean;\n\n wallHeight: number;\n wallThickness: number;\n wallColor: string;\n wallTexture: WallTexture;\n wallStructure: WallStructure;\n wallStructureSpacing: number;\n wallStructureWidth: number;\n wallStructureColor: string;\n wallOpacity: number;\n wallRValue: number;\n wallVolumetricHeatCapacity: number;\n wallEavesLength: number;\n wallParapet: ParapetArgs;\n\n roofColor: string;\n roofSideColor: string;\n roofTexture: RoofTexture;\n roofThickness: number;\n roofStructure: RoofStructure;\n roofGlassOpacity: number;\n roofGlassTint: string;\n roofRafterWidth: number;\n roofRafterSpacing: number;\n roofRafterColor: string;\n roofRValue: number;\n roofVolumetricHeatCapacity: number;\n roofRise: number;\n roofCeiling: boolean;\n ceilingRValue: number;\n\n doorColor: string;\n doorFrameColor: string;\n doorTexture: DoorTexture;\n doorType: DoorType;\n doorArchHeight: number;\n doorFilled: boolean;\n doorInterior: boolean;\n doorUValue: number;\n doorOpacity: number;\n doorVolumetricHeatCapacity: number;\n\n windowWidth: number;\n windowHeight: number;\n windowColor: string;\n windowTint: string;\n windowOpacity: number;\n windowUValue: number;\n windowHorizontalMullion: boolean;\n windowVerticalMullion: boolean;\n windowMullionWidth: number;\n windowHorizontalMullionSpacing: number;\n windowVerticalMullionSpacing: number;\n windowMullionColor: string;\n windowShutterLeft: boolean;\n windowShutterRight: boolean;\n windowShutterColor: string;\n windowShutterWidth: number;\n windowFrame: boolean;\n windowFrameWidth: number;\n windowSillWidth: number;\n windowType: WindowType;\n windowArchHeight: number;\n windowEmpty: boolean;\n windowInterior: boolean;\n\n solarPanelModelName: string;\n solarPanelOrientation: Orientation;\n solarPanelPoleHeight: number;\n solarPanelPoleSpacing: number;\n solarPanelTiltAngle: number;\n solarPanelRelativeAzimuth: number;\n solarPanelFrameColor: string;\n\n parabolicDishReflectance: number;\n parabolicDishAbsorptance: number;\n parabolicDishOpticalEfficiency: number;\n parabolicDishThermalEfficiency: number;\n parabolicDishRimDiameter: number;\n parabolicDishLatusRectum: number;\n parabolicDishPoleHeight: number;\n parabolicDishPoleRadius: number;\n parabolicDishReceiverStructure: ParabolicDishStructureType;\n\n parabolicTroughReflectance: number;\n parabolicTroughAbsorptance: number;\n parabolicTroughOpticalEfficiency: number;\n parabolicTroughThermalEfficiency: number;\n parabolicTroughLatusRectum: number;\n parabolicTroughPoleHeight: number;\n parabolicTroughWidth: number;\n parabolicTroughModuleLength: number;\n\n fresnelReflectorReceiver: string;\n fresnelReflectorReflectance: number;\n fresnelReflectorPoleHeight: number;\n fresnelReflectorWidth: number;\n fresnelReflectorModuleLength: number;\n\n heliostatTower: string;\n heliostatReflectance: number;\n heliostatPoleHeight: number;\n heliostatPoleRadius: number;\n heliostatWidth: number;\n heliostatLength: number;\n\n lightColor: string;\n lightIntensity: number;\n lightDistance: number;\n\n constructor() {\n this.humanName = HumanName.Jack;\n\n this.flowerType = FlowerType.YellowFlower;\n\n this.treeType = TreeType.Dogwood;\n this.treeSpread = 3;\n this.treeHeight = 4;\n\n this.foundationHeight = 0.1;\n this.foundationColor = '#808080';\n this.foundationTexture = FoundationTexture.NoTexture;\n this.groundFloorRValue = DEFAULT_GROUND_FLOOR_R_VALUE;\n\n this.cuboidHeight = 4;\n this.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\n this.cuboidFaceTextures = [\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n CuboidTexture.NoTexture,\n ];\n this.cuboidStackable = false;\n\n this.wallHeight = 5;\n this.wallThickness = 0.3;\n this.wallColor = '#ffffff';\n this.wallTexture = WallTexture.Default;\n this.wallStructure = WallStructure.Default;\n this.wallStructureSpacing = 2;\n this.wallStructureWidth = 0.1;\n this.wallStructureColor = '#ffffff';\n this.wallOpacity = 0.5;\n this.wallRValue = DEFAULT_WALL_R_VALUE;\n this.wallVolumetricHeatCapacity = 0.5;\n this.wallEavesLength = 0.3;\n this.wallParapet = DEFAULT_PARAPET_SETTINGS;\n\n this.roofColor = '#454769';\n this.roofSideColor = '#ffffff';\n this.roofTexture = RoofTexture.Default;\n this.roofThickness = 0.2;\n this.roofStructure = RoofStructure.Default;\n this.roofGlassOpacity = 0.5;\n this.roofGlassTint = '#73D8FF';\n this.roofRafterWidth = 0.1;\n this.roofRafterSpacing = 1;\n this.roofRafterColor = '#ffffff';\n this.roofRValue = DEFAULT_ROOF_R_VALUE;\n this.roofVolumetricHeatCapacity = 0.5;\n this.roofRise = 2;\n this.roofCeiling = false;\n this.ceilingRValue = DEFAULT_CEILING_R_VALUE;\n\n this.doorColor = '#ffffff';\n this.doorFrameColor = '#ffffff';\n this.doorTexture = DoorTexture.Default;\n this.doorType = DoorType.Default;\n this.doorArchHeight = 1;\n this.doorFilled = true;\n this.doorInterior = false;\n this.doorUValue = DEFAULT_DOOR_U_VALUE;\n this.doorOpacity = 1;\n this.doorVolumetricHeatCapacity = 0.5;\n\n this.windowWidth = 1;\n this.windowHeight = 1;\n this.windowColor = '#ffffff';\n this.windowTint = '#73D8FF';\n this.windowOpacity = 0.5;\n this.windowUValue = DEFAULT_WINDOW_U_VALUE;\n this.windowHorizontalMullion = true;\n this.windowVerticalMullion = true;\n this.windowMullionWidth = 0.06;\n this.windowHorizontalMullionSpacing = 0.5;\n this.windowVerticalMullionSpacing = 0.5;\n this.windowMullionColor = '#ffffff';\n this.windowFrame = false;\n this.windowFrameWidth = 0.1;\n this.windowSillWidth = 0.1;\n this.windowType = WindowType.Default;\n this.windowArchHeight = 1;\n // I worry about this using Shutter objects may cause default to be accidentally overwritten.\n this.windowShutterLeft = false;\n this.windowShutterRight = false;\n this.windowShutterColor = 'gray';\n this.windowShutterWidth = 0.5;\n this.windowEmpty = false;\n this.windowInterior = false;\n\n this.solarPanelModelName = 'SPR-X21-335-BLK';\n this.solarPanelOrientation = Orientation.landscape;\n this.solarPanelPoleHeight = 1;\n this.solarPanelPoleSpacing = 3;\n this.solarPanelTiltAngle = 0;\n this.solarPanelRelativeAzimuth = 0;\n this.solarPanelFrameColor = '#ffffff';\n\n this.parabolicDishReflectance = 0.9;\n this.parabolicDishAbsorptance = 0.95;\n this.parabolicDishOpticalEfficiency = 0.7;\n this.parabolicDishThermalEfficiency = 0.3;\n this.parabolicDishRimDiameter = 4;\n this.parabolicDishLatusRectum = 8;\n this.parabolicDishPoleHeight = 0.2;\n this.parabolicDishPoleRadius = 0.1;\n this.parabolicDishReceiverStructure = ParabolicDishStructureType.CentralPole;\n\n this.parabolicTroughReflectance = 0.9;\n this.parabolicTroughAbsorptance = 0.95;\n this.parabolicTroughOpticalEfficiency = 0.7;\n this.parabolicTroughThermalEfficiency = 0.3;\n this.parabolicTroughLatusRectum = 2;\n this.parabolicTroughPoleHeight = 0.2;\n this.parabolicTroughWidth = 2;\n this.parabolicTroughModuleLength = 3;\n\n this.fresnelReflectorReceiver = 'None';\n this.fresnelReflectorReflectance = 0.9;\n this.fresnelReflectorPoleHeight = 0.2;\n this.fresnelReflectorWidth = 2;\n this.fresnelReflectorModuleLength = 3;\n\n this.heliostatTower = 'None';\n this.heliostatReflectance = 0.9;\n this.heliostatPoleHeight = 0.2;\n this.heliostatPoleRadius = 0.1;\n this.heliostatWidth = 4;\n this.heliostatLength = 2;\n\n this.lightColor = '#ffff99';\n this.lightIntensity = 3;\n this.lightDistance = 5;\n }\n}\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { immerable } from 'immer';\nimport { GraphState } from './GraphState';\n\nexport class DefaultGraphState implements GraphState {\n // Needed for immer drafting to work properly: https://immerjs.github.io/immer/docs/complex-objects\n [immerable] = true;\n\n dailyPvIndividualOutputs: boolean;\n yearlyPvIndividualOutputs: boolean;\n\n dailyParabolicDishIndividualOutputs: boolean;\n yearlyParabolicDishIndividualOutputs: boolean;\n\n dailyParabolicTroughIndividualOutputs: boolean;\n yearlyParabolicTroughIndividualOutputs: boolean;\n\n dailyFresnelReflectorIndividualOutputs: boolean;\n yearlyFresnelReflectorIndividualOutputs: boolean;\n\n dailyHeliostatIndividualOutputs: boolean;\n yearlyHeliostatIndividualOutputs: boolean;\n\n dailyUpdraftTowerIndividualOutputs: boolean;\n yearlyUpdraftTowerIndividualOutputs: boolean;\n\n constructor() {\n this.dailyPvIndividualOutputs = false;\n this.yearlyPvIndividualOutputs = false;\n\n this.dailyParabolicDishIndividualOutputs = false;\n this.yearlyParabolicDishIndividualOutputs = false;\n\n this.dailyParabolicTroughIndividualOutputs = false;\n this.yearlyParabolicTroughIndividualOutputs = false;\n\n this.dailyFresnelReflectorIndividualOutputs = false;\n this.yearlyFresnelReflectorIndividualOutputs = false;\n\n this.dailyHeliostatIndividualOutputs = false;\n this.yearlyHeliostatIndividualOutputs = false;\n\n this.dailyUpdraftTowerIndividualOutputs = false;\n this.yearlyUpdraftTowerIndividualOutputs = false;\n }\n}\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { Design, DesignProblem, Orientation } from '../types';\nimport i18n from '../i18n/i18n';\nimport { Util } from '../Util';\n\nexport class ProjectUtil {\n static getDefaultHiddenParameters(projectType: DesignProblem): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n return ['latitude', 'orientation', 'poleHeight'];\n }\n return [];\n }\n\n static getVariables(projectType: DesignProblem, hidden: string[]): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: string[] = [];\n if (!hidden.includes('rowWidth')) a.push('rowWidth');\n if (!hidden.includes('tiltAngle')) a.push('tiltAngle');\n if (!hidden.includes('interRowSpacing')) a.push('interRowSpacing');\n if (!hidden.includes('latitude')) a.push('latitude');\n if (!hidden.includes('orientation')) a.push('orientation');\n if (!hidden.includes('poleHeight')) a.push('poleHeight');\n if (!hidden.includes('unitCost')) a.push('unitCost');\n if (!hidden.includes('sellingPrice')) a.push('sellingPrice');\n if (!hidden.includes('totalYearlyCost')) a.push('totalYearlyCost');\n if (!hidden.includes('totalYearlyYield')) a.push('totalYearlyYield');\n if (!hidden.includes('meanYearlyYield')) a.push('meanYearlyYield');\n if (!hidden.includes('yearlyProfit')) a.push('yearlyProfit');\n return a;\n }\n return [];\n }\n\n static getTitles(projectType: DesignProblem, l: { lng: string }, hidden: string[]): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: string[] = [];\n if (!hidden.includes('rowWidth')) a.push(i18n.t('polygonMenu.SolarPanelArrayRowWidth', l));\n if (!hidden.includes('tiltAngle')) a.push(i18n.t('polygonMenu.SolarPanelArrayTiltAngle', l));\n if (!hidden.includes('interRowSpacing')) a.push(i18n.t('polygonMenu.SolarPanelArrayRowSpacing', l));\n if (!hidden.includes('latitude')) a.push(i18n.t('word.Latitude', l));\n if (!hidden.includes('orientation')) a.push(i18n.t('polygonMenu.SolarPanelArrayOrientation', l));\n if (!hidden.includes('poleHeight')) a.push(i18n.t('polygonMenu.SolarPanelArrayPoleHeight', l));\n if (!hidden.includes('unitCost')) a.push(i18n.t('economicsPanel.UnitCost', l));\n if (!hidden.includes('sellingPrice')) a.push(i18n.t('economicsPanel.SellingPrice', l));\n if (!hidden.includes('totalYearlyCost')) a.push(i18n.t('polygonMenu.SolarPanelArrayTotalYearlyCost', l));\n if (!hidden.includes('totalYearlyYield')) a.push(i18n.t('polygonMenu.SolarPanelArrayTotalYearlyYield', l));\n if (!hidden.includes('meanYearlyYield')) a.push(i18n.t('polygonMenu.SolarPanelArrayMeanYearlyYield', l));\n if (!hidden.includes('yearlyProfit')) a.push(i18n.t('polygonMenu.SolarPanelArrayYearlyProfit', l));\n return a;\n }\n return [];\n }\n\n static getTypes(projectType: DesignProblem, hidden: string[]): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: string[] = [];\n if (!hidden.includes('rowWidth')) a.push('number');\n if (!hidden.includes('tiltAngle')) a.push('number');\n if (!hidden.includes('interRowSpacing')) a.push('number');\n if (!hidden.includes('latitude')) a.push('number');\n if (!hidden.includes('orientation')) a.push('boolean');\n if (!hidden.includes('poleHeight')) a.push('number');\n if (!hidden.includes('unitCost')) a.push('number');\n if (!hidden.includes('sellingPrice')) a.push('number');\n if (!hidden.includes('totalYearlyCost')) a.push('number');\n if (!hidden.includes('totalYearlyYield')) a.push('number');\n if (!hidden.includes('meanYearlyYield')) a.push('number');\n if (!hidden.includes('yearlyProfit')) a.push('number');\n return a;\n }\n return [];\n }\n\n static getDigits(projectType: DesignProblem, hidden: string[]): number[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: number[] = [];\n if (!hidden.includes('rowWidth')) a.push(0);\n if (!hidden.includes('tiltAngle')) a.push(1);\n if (!hidden.includes('interRowSpacing')) a.push(1);\n if (!hidden.includes('latitude')) a.push(1);\n if (!hidden.includes('orientation')) a.push(0);\n if (!hidden.includes('poleHeight')) a.push(1);\n if (!hidden.includes('unitCost')) a.push(2);\n if (!hidden.includes('sellingPrice')) a.push(2);\n if (!hidden.includes('totalYearlyCost')) a.push(1);\n if (!hidden.includes('totalYearlyYield')) a.push(1);\n if (!hidden.includes('meanYearlyYield')) a.push(1);\n if (!hidden.includes('yearlyProfit')) a.push(3);\n return a;\n }\n return [];\n }\n\n static getTickIntegers(projectType: DesignProblem, hidden: string[]): boolean[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: boolean[] = [];\n if (!hidden.includes('rowWidth')) a.push(true);\n if (!hidden.includes('tiltAngle')) a.push(false);\n if (!hidden.includes('interRowSpacing')) a.push(false);\n if (!hidden.includes('latitude')) a.push(false);\n if (!hidden.includes('orientation')) a.push(true);\n if (!hidden.includes('poleHeight')) a.push(false);\n if (!hidden.includes('unitCost')) a.push(false);\n if (!hidden.includes('sellingPrice')) a.push(false);\n if (!hidden.includes('totalYearlyCost')) a.push(false);\n if (!hidden.includes('totalYearlyYield')) a.push(false);\n if (!hidden.includes('meanYearlyYield')) a.push(false);\n if (!hidden.includes('yearlyProfit')) a.push(false);\n return a;\n }\n return [];\n }\n\n static getUnits(projectType: DesignProblem, l: { lng: string }, hidden: string[]): string[] {\n if (projectType === DesignProblem.SOLAR_PANEL_ARRAY) {\n const a: string[] = [];\n if (!hidden.includes('rowWidth')) a.push(' ' + i18n.t('solarPanelMenu.Panels', l));\n if (!hidden.includes('tiltAngle')) a.push('°');\n if (!hidden.includes('interRowSpacing')) a.push(' ' + i18n.t('word.MeterAbbreviation', l));\n if (!hidden.includes('latitude')) a.push('°');\n if (!hidden.includes('orientation')) a.push('');\n if (!hidden.includes('poleHeight')) a.push(' ' + i18n.t('word.MeterAbbreviation', l));\n if (!hidden.includes('unitCost')) a.push('');\n if (!hidden.includes('sellingPrice')) a.push('');\n if (!hidden.includes('totalYearlyCost')) a.push('K');\n if (!hidden.includes('totalYearlyYield')) a.push(' MWh');\n if (!hidden.includes('meanYearlyYield')) a.push(' kWh');\n if (!hidden.includes('yearlyProfit')) a.push('K');\n return a;\n }\n return [];\n }\n\n static getUnit(variable: string, l: { lng: string }): string {\n if (variable === 'tiltAngle' || variable === 'latitude') return '°';\n if (variable === 'interRowSpacing') return i18n.t('word.MeterAbbreviation', l);\n if (variable === 'poleHeight') return i18n.t('word.MeterAbbreviation', l);\n if (variable === 'totalYearlyYield') return 'MWh';\n if (variable === 'meanYearlyYield') return 'kWh';\n if (variable === 'totalYearlyCost') return 'K';\n if (variable === 'yearlyProfit') return 'K';\n return '';\n }\n\n static setScatterData(name: string, axis: 'x' | 'y', datum: { x: number; y: number }, design: Design) {\n switch (name) {\n case 'rowWidth':\n datum[axis] = design.rowsPerRack;\n break;\n case 'tiltAngle':\n datum[axis] = Util.toDegrees(design.tiltAngle);\n break;\n case 'interRowSpacing':\n datum[axis] = design.interRowSpacing;\n break;\n case 'latitude':\n datum[axis] = design.latitude;\n break;\n case 'orientation':\n datum[axis] = design.orientation === Orientation.landscape ? 0 : 1;\n break;\n case 'poleHeight':\n datum[axis] = design.poleHeight;\n break;\n case 'unitCost':\n datum[axis] = design.unitCost;\n break;\n case 'sellingPrice':\n datum[axis] = design.sellingPrice;\n break;\n case 'totalYearlyCost':\n datum[axis] = Util.calculateCost(design);\n break;\n case 'totalYearlyYield':\n datum[axis] = design.yearlyYield * 0.001;\n break;\n case 'meanYearlyYield':\n datum[axis] = design.yearlyYield / design.panelCount;\n break;\n case 'yearlyProfit':\n datum[axis] = Util.calculateProfit(design);\n break;\n }\n }\n}\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { CommonStoreState } from './common';\r\nimport { ObjectType } from 'src/types';\r\nimport { WindowModel, WindowType } from 'src/models/WindowModel';\r\nimport { WallFill, WallModel, WallStructure } from 'src/models/WallModel';\r\nimport { DEFAULT_PARAPET_SETTINGS } from 'src/views/wall/parapet';\r\nimport { GambrelRoofModel, RoofModel, RoofType } from 'src/models/RoofModel';\r\nimport { GROUND_ID } from 'src/constants';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\n\r\n// should put this inside immerSet function, because it mutate state directly\r\nexport class StoreUtil {\r\n static updateOldFileData(state: CommonStoreState) {\r\n const elementMap = new Map();\r\n for (const e of state.elements) {\r\n elementMap.set(e.id, e);\r\n }\r\n for (const e of state.elements) {\r\n switch (e.type) {\r\n case ObjectType.Foundation: {\r\n // TODO: fix these bugs that are tentatively corrected here\r\n if (e.parentId !== GROUND_ID) {\r\n console.error('Error: ' + e.parentId + ' is not ground!');\r\n e.parentId = GROUND_ID;\r\n }\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = e as WallModel;\r\n if (wall.wallStructure === undefined) {\r\n wall.wallStructure = WallStructure.Default;\r\n }\r\n if (wall.structureSpacing === undefined) {\r\n wall.structureSpacing = 2;\r\n }\r\n if (wall.structureWidth === undefined) {\r\n wall.structureWidth = 0.1;\r\n }\r\n if (wall.structureColor === undefined) {\r\n wall.structureColor = 'white';\r\n }\r\n if (wall.opacity === undefined) {\r\n wall.opacity = 0.5;\r\n }\r\n if (wall.fill === undefined) {\r\n wall.fill = WallFill.Full;\r\n }\r\n if (wall.unfilledHeight === undefined) {\r\n wall.unfilledHeight = 0.5;\r\n }\r\n if (wall.leftUnfilledHeight === undefined || wall.rightUnfilledHeight === undefined) {\r\n const val = wall.unfilledHeight ?? 0.5;\r\n wall.leftUnfilledHeight = val;\r\n wall.rightUnfilledHeight = val;\r\n }\r\n if (wall.leftTopPartialHeight === undefined || wall.rightTopPartialHeight === undefined) {\r\n wall.leftTopPartialHeight = wall.lz;\r\n wall.rightTopPartialHeight = wall.lz;\r\n }\r\n if (wall.eavesLength === undefined) {\r\n if (wall.roofId) {\r\n const el = elementMap.get(wall.roofId);\r\n if (el && el.type === ObjectType.Roof) {\r\n const roof = el as RoofModel;\r\n wall.eavesLength = roof.overhang !== undefined ? roof.overhang : 0.3;\r\n } else {\r\n wall.eavesLength = 0.3;\r\n }\r\n }\r\n }\r\n if (wall.parapet === undefined) {\r\n wall.parapet = { ...DEFAULT_PARAPET_SETTINGS };\r\n }\r\n\r\n if (wall.roofId) {\r\n const el = elementMap.get(wall.roofId);\r\n if (el && el.type === ObjectType.Roof) {\r\n const roof = el as RoofModel;\r\n if (\r\n roof.roofType === RoofType.Pyramid ||\r\n roof.roofType === RoofType.Hip ||\r\n roof.roofType === RoofType.Mansard\r\n ) {\r\n wall.leftRoofHeight = undefined;\r\n wall.rightRoofHeight = undefined;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = e as WindowModel;\r\n if (window.horizontalMullion === undefined) {\r\n window.horizontalMullion = window.mullion;\r\n }\r\n if (window.verticalMullion === undefined) {\r\n window.verticalMullion = window.mullion;\r\n }\r\n if (window.mullionWidth === undefined) {\r\n window.mullionWidth = 0.06;\r\n }\r\n if (window.horizontalMullionSpacing === undefined) {\r\n window.horizontalMullionSpacing = window.mullionSpacing ?? 0.5;\r\n }\r\n if (window.verticalMullionSpacing === undefined) {\r\n window.verticalMullionSpacing = window.mullionSpacing ?? 0.5;\r\n }\r\n if (window.tint === undefined) {\r\n window.tint = '#73D8FF';\r\n }\r\n if (window.opacity === undefined) {\r\n window.opacity = 0.5;\r\n }\r\n if (window.shutter) {\r\n window.leftShutter = window.shutter.showLeft;\r\n window.rightShutter = window.shutter.showRight;\r\n window.shutterColor = window.shutter.color;\r\n window.shutterWidth = window.shutter.width;\r\n window.shutter = undefined;\r\n }\r\n if (window.shutterColor === undefined) {\r\n window.shutterColor = 'gray';\r\n }\r\n if (window.shutterWidth === undefined) {\r\n window.shutterWidth = 0.5;\r\n }\r\n if (window.mullionColor === undefined) {\r\n window.mullionColor = 'white';\r\n }\r\n if (window.frame === undefined) {\r\n window.frame = false;\r\n }\r\n if (window.color === undefined) {\r\n window.color = 'white';\r\n }\r\n if (window.frameWidth === undefined) {\r\n window.frameWidth = 0.1;\r\n }\r\n if (window.windowType === undefined) {\r\n window.windowType = WindowType.Default;\r\n }\r\n if (window.archHeight === undefined) {\r\n window.archHeight = 1;\r\n }\r\n break;\r\n }\r\n case ObjectType.Door: {\r\n const door = e as DoorModel;\r\n if (door.doorType === undefined) {\r\n door.doorType = DoorType.Default;\r\n }\r\n if (door.archHeight === undefined) {\r\n door.archHeight = 1;\r\n }\r\n if (door.filled === undefined) {\r\n door.filled = true;\r\n }\r\n break;\r\n }\r\n case ObjectType.Roof: {\r\n const roof = e as RoofModel;\r\n if (roof.ceiling === undefined) {\r\n roof.ceiling = false;\r\n }\r\n if (roof.roofType === RoofType.Gambrel) {\r\n const gambrelRoof = roof as GambrelRoofModel;\r\n if (gambrelRoof.frontRidgePoint === undefined) {\r\n gambrelRoof.frontRidgePoint = gambrelRoof.frontRidgeLeftPoint\r\n ? [...gambrelRoof.frontRidgeLeftPoint]\r\n : [0.35, 0.5];\r\n gambrelRoof.frontRidgeLeftPoint = undefined;\r\n gambrelRoof.frontRidgeRightPoint = undefined;\r\n }\r\n if (gambrelRoof.backRidgePoint === undefined) {\r\n gambrelRoof.backRidgePoint = gambrelRoof.backRidgeLeftPoint\r\n ? [...gambrelRoof.backRidgeLeftPoint]\r\n : [-0.35, 0.5];\r\n gambrelRoof.backRidgeLeftPoint = undefined;\r\n gambrelRoof.backRidgeRightPoint = undefined;\r\n }\r\n if (gambrelRoof.topRidgePoint === undefined) {\r\n gambrelRoof.topRidgePoint = gambrelRoof.topRidgeLeftPoint ? [...gambrelRoof.topRidgeLeftPoint] : [0, 1];\r\n gambrelRoof.topRidgeLeftPoint = undefined;\r\n gambrelRoof.topRidgeRightPoint = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { ObjectType } from 'src/types';\r\nimport { ElementModel } from './ElementModel';\r\n\r\nexport interface Groupable {\r\n enableGroupMaster?: boolean;\r\n}\r\n\r\nexport type GroupableModel = ElementModel & Groupable;\r\n\r\nexport function isGroupable(element: ElementModel) {\r\n return element.type === ObjectType.Foundation || element.type === ObjectType.Cuboid;\r\n}\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport create from 'zustand';\r\nimport short from 'short-uuid';\r\nimport dayjs from 'dayjs';\r\nimport Papa from 'papaparse';\r\nimport i18n from '../i18n/i18n';\r\nimport enUS from 'antd/lib/locale/en_US';\r\nimport weather from '../resources/weather.csv';\r\nimport solar_radiation_horizontal from '../resources/solar_radiation_horizontal.csv';\r\nimport solar_radiation_vertical from '../resources/solar_radiation_vertical.csv';\r\nimport pvmodules from '../resources/pvmodules.csv';\r\nimport produce, { enableMapSet } from 'immer';\r\nimport {\r\n ActionInfo,\r\n ActionType,\r\n DataColoring,\r\n DatumEntry,\r\n Design,\r\n DesignProblem,\r\n ElementState,\r\n EvolutionMethod,\r\n ModelSite,\r\n ModelType,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ProjectInfo,\r\n Range,\r\n ResizeHandleType,\r\n RoofHandleType,\r\n RotateHandleType,\r\n Scope,\r\n SolarStructure,\r\n User,\r\n} from '../types';\r\nimport { devtools, persist } from 'zustand/middleware';\r\nimport { WorldModel } from '../models/WorldModel';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { WeatherModel } from '../models/WeatherModel';\r\nimport { Util } from '../Util';\r\nimport { DefaultWorldModel } from './DefaultWorldModel';\r\nimport { Box3, Euler, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { ElementModelCloner } from '../models/ElementModelCloner';\r\nimport { DefaultViewState } from './DefaultViewState';\r\nimport { ViewState } from './ViewState';\r\nimport { ElementModelFactory } from '../models/ElementModelFactory';\r\nimport { GroundModel } from '../models/GroundModel';\r\nimport { PvModel } from '../models/PvModel';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { SolarPanelModel } from '../models/SolarPanelModel';\r\nimport { WallModel } from '../models/WallModel';\r\nimport { Locale } from 'antd/lib/locale-provider';\r\nimport { Undoable } from '../undo/Undoable';\r\nimport { UndoManager } from '../undo/UndoManager';\r\nimport { HumanModel } from '../models/HumanModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport {\r\n DEFAULT_ADDRESS,\r\n DEFAULT_MODEL_MAP_ZOOM,\r\n FLOATING_WINDOW_OPACITY,\r\n GROUND_ID,\r\n HALF_PI,\r\n ORIGIN_VECTOR2,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n} from '../constants';\r\nimport { PolygonModel } from '../models/PolygonModel';\r\nimport { Point2 } from '../models/Point2';\r\nimport { useRefStore } from './commonRef';\r\nimport { showError } from '../helpers';\r\nimport { SolarPanelArrayLayoutParams } from './SolarPanelArrayLayoutParams';\r\nimport { DefaultSolarPanelArrayLayoutParams } from './DefaultSolarPanelArrayLayoutParams';\r\nimport { SolarCollector } from '../models/SolarCollector';\r\nimport { ConcentratedSolarPowerCollector } from '../models/ConcentratedSolarPowerCollector';\r\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\r\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\r\nimport { ElementCounter } from './ElementCounter';\r\nimport { ParabolicCollector } from '../models/ParabolicCollector';\r\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\r\nimport { HeliostatModel } from '../models/HeliostatModel';\r\nimport { SolarRadiationData } from '../models/SolarRadiationData';\r\nimport { EvolutionaryAlgorithmState } from './EvolutionaryAlgorithmState';\r\nimport { DefaultEvolutionaryAlgorithmState } from './DefaultEvolutionaryAlgorithmState';\r\nimport { RoofModel, RoofStructure } from 'src/models/RoofModel';\r\nimport { SolarPanelArrayLayoutConstraints } from './SolarPanelArrayLayoutConstraints';\r\nimport { DefaultSolarPanelArrayLayoutConstraints } from './DefaultSolarPanelArrayLayoutConstraints';\r\nimport { EconomicsParams } from './EconomicsParams';\r\nimport { DefaultEconomicsParams } from './DefaultEconomicsParams';\r\nimport { RoofUtil } from 'src/views/roof/RoofUtil';\r\nimport { ActionState } from './ActionState';\r\nimport { DefaultActionState } from './DefaultActionState';\r\nimport { LightModel } from '../models/LightModel';\r\nimport { usePrimitiveStore } from './commonPrimitive';\r\nimport { useDataStore } from './commonData';\r\nimport { GraphState } from './GraphState';\r\nimport { DefaultGraphState } from './DefaultGraphState';\r\nimport { isStackableModel } from 'src/models/Stackable';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { ProjectUtil } from '../panels/ProjectUtil';\r\nimport { StoreUtil } from './StoreUtil';\r\nimport { isGroupable } from 'src/models/Groupable';\r\n\r\nenableMapSet();\r\n\r\nexport interface CommonStoreState {\r\n set: (fn: (state: CommonStoreState) => void) => void;\r\n\r\n // only the following properties are persisted (see the whitelist at the end)\r\n world: WorldModel;\r\n elements: ElementModel[];\r\n viewState: ViewState;\r\n actionState: ActionState;\r\n graphState: GraphState;\r\n modelType: ModelType;\r\n modelAuthor: string | null;\r\n modelLabel: string | null;\r\n modelDescription: string | null;\r\n projectView: boolean;\r\n projectInfo: ProjectInfo;\r\n projectImages: Map;\r\n designProjectType: DesignProblem | null; // this belongs to a design of a project\r\n notes: string[];\r\n user: User;\r\n language: string;\r\n floatingWindowOpacity: number;\r\n selectedFloatingWindow: string | null;\r\n cloudFile: string | undefined;\r\n latestModelSite?: ModelSite;\r\n modelSites: Map>; // primary key: 'lat, lng', secondary key: 'title, userid'\r\n peopleModels: Map>; // primary key: author, secondary key: 'title, userid'\r\n modelsMapLatitude: number;\r\n modelsMapLongitude: number;\r\n modelsMapAddress: string;\r\n modelsMapZoom: number;\r\n modelsMapType: string;\r\n modelsMapTilt: number;\r\n\r\n minimumNavigationMoveSpeed: number;\r\n minimumNavigationTurnSpeed: number;\r\n\r\n ray: Raycaster;\r\n mouse: Vector2;\r\n\r\n fileChanged: boolean;\r\n applyCount: number;\r\n setApplyCount: (count: number) => void;\r\n revertApply: () => void;\r\n\r\n importContent: (input: any, title?: string) => void;\r\n exportContent: () => {};\r\n clearContent: () => void;\r\n createEmptyFile: () => void;\r\n undoManager: UndoManager;\r\n addUndoable: (undoable: Undoable) => void;\r\n\r\n weatherData: { [key: string]: WeatherModel };\r\n getWeather: (location: string) => WeatherModel;\r\n loadWeatherData: () => void;\r\n horizontalSolarRadiationData: { [key: string]: SolarRadiationData };\r\n getHorizontalSolarRadiation: (location: string) => SolarRadiationData;\r\n loadHorizontalSolarRadiationData: () => void;\r\n verticalSolarRadiationData: { [key: string]: SolarRadiationData };\r\n getVerticalSolarRadiation: (location: string) => SolarRadiationData;\r\n loadVerticalSolarRadiationData: () => void;\r\n getClosestCity: (lat: number, lng: number) => string | null;\r\n\r\n pvModules: { [key: string]: PvModel };\r\n getPvModule: (name: string) => PvModel;\r\n loadPvModules: () => void;\r\n\r\n aabb: Box3; // axis-aligned bounding box of elements\r\n animate24Hours: boolean;\r\n evolutionMethod: EvolutionMethod;\r\n clickObjectType: ObjectType | null;\r\n contextMenuObjectType: ObjectType | null;\r\n hoveredHandle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null;\r\n moveHandleType: MoveHandleType | null;\r\n resizeHandleType: ResizeHandleType | null;\r\n rotateHandleType: RotateHandleType | null;\r\n resizeAnchor: Vector3;\r\n selectedElement: ElementModel | null;\r\n getSelectedElement: () => ElementModel | null;\r\n findNearestSibling: (id: string) => string | null;\r\n overlapWithSibling: (me: ElementModel, threshold?: number) => boolean;\r\n selectedSideIndex: number;\r\n getResizeHandlePosition: (e: ElementModel, type: ResizeHandleType) => Vector3;\r\n getElementById: (id: string) => ElementModel | null;\r\n getParent: (child: ElementModel) => ElementModel | null;\r\n getFoundation: (elem: ElementModel) => FoundationModel | null;\r\n selectMe: (id: string, e: ThreeEvent, action?: ActionType, select?: boolean) => void;\r\n selectNone: () => void;\r\n setElementPosition: (id: string, x: number, y: number, z?: number) => void;\r\n setElementNormal: (id: string, x: number, y: number, z: number) => void;\r\n setElementSize: (id: string, lx: number, ly: number, lz?: number) => void;\r\n\r\n selectedElementIdSet: Set;\r\n multiSelectionsMode: boolean;\r\n\r\n // for all types of elements\r\n updateAllElementLocks: (locked: boolean) => void;\r\n updateElementLockByFoundationId: (foundationId: string, locked: boolean) => void;\r\n updateElementLockByParentId: (parentId: string, type: ObjectType, locked: boolean) => void;\r\n updateElementLockById: (id: string, locked: boolean) => void;\r\n updateElementReferenceById: (id: string, referenceId: string) => void;\r\n updateElementLabelById: (id: string, label: string) => void;\r\n updateElementShowLabelById: (id: string, showLabel: boolean) => void;\r\n\r\n updateElementColorById: (id: string, color: string) => void;\r\n updateElementColorOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n color: string,\r\n ) => void;\r\n updateElementColorAboveFoundation: (type: ObjectType, foundationId: string, color: string) => void;\r\n updateElementColorForAll: (type: ObjectType, color: string) => void;\r\n\r\n updateElementLineColorById: (id: string, color: string) => void;\r\n updateElementLineColorOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n color: string,\r\n ) => void;\r\n updateElementLineColorAboveFoundation: (type: ObjectType, foundationId: string, color: string) => void;\r\n updateElementLineColorForAll: (type: ObjectType, color: string) => void;\r\n\r\n updateElementLineWidthById: (id: string, width: number) => void;\r\n updateElementLineWidthOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n width: number,\r\n ) => void;\r\n updateElementLineWidthAboveFoundation: (type: ObjectType, foundationId: string, width: number) => void;\r\n updateElementLineWidthForAll: (type: ObjectType, width: number) => void;\r\n\r\n updateElementRotationById: (id: string, x: number, y: number, z: number) => void;\r\n updateElementRotationForAll: (type: ObjectType, x: number, y: number, z: number) => void;\r\n\r\n updateElementCxById: (id: string, cx: number) => void;\r\n updateElementCyById: (id: string, cy: number) => void;\r\n updateElementCzById: (id: string, cz: number) => void;\r\n updateElementCzForAll: (type: ObjectType, cz: number) => void;\r\n\r\n updateElementLxById: (id: string, lx: number) => void;\r\n updateElementLxOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, lx: number) => void;\r\n updateElementLxAboveFoundation: (type: ObjectType, foundationId: string, lx: number) => void;\r\n updateElementLxForAll: (type: ObjectType, lx: number) => void;\r\n\r\n updateElementLyById: (id: string, ly: number) => void;\r\n updateElementLyOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, ly: number) => void;\r\n updateElementLyAboveFoundation: (type: ObjectType, foundationId: string, ly: number) => void;\r\n updateElementLyForAll: (type: ObjectType, ly: number) => void;\r\n\r\n updateElementLzById: (id: string, lz: number) => void;\r\n updateElementLzOnSurface: (type: ObjectType, parentId: string, normal: number[] | undefined, lz: number) => void;\r\n updateElementLzAboveFoundation: (type: ObjectType, foundationId: string, lz: number) => void;\r\n updateElementLzForAll: (type: ObjectType, lz: number) => void;\r\n\r\n // for all types of solar collectors\r\n updateSolarCollectorDrawSunBeamById: (id: string, draw: boolean) => void;\r\n updateSolarCollectorDrawSunBeamAboveFoundation: (type: ObjectType, foundationId: string, draw: boolean) => void;\r\n updateSolarCollectorDrawSunBeamForAll: (type: ObjectType, draw: boolean) => void;\r\n updateSolarCollectorRelativeAzimuthById: (id: string, relativeAzimuth: number) => void;\r\n updateSolarCollectorRelativeAzimuthOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n relativeAzimuth: number,\r\n ) => void;\r\n updateSolarCollectorRelativeAzimuthAboveFoundation: (\r\n type: ObjectType,\r\n foundationId: string,\r\n relativeAzimuth: number,\r\n ) => void;\r\n updateSolarCollectorRelativeAzimuthForAll: (type: ObjectType, relativeAzimuth: number) => void;\r\n updateSolarCollectorPoleHeightById: (id: string, poleHeight: number) => void;\r\n updateSolarCollectorPoleHeightOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n poleHeight: number,\r\n ) => void;\r\n updateSolarCollectorPoleHeightAboveFoundation: (type: ObjectType, foundationId: string, poleHeight: number) => void;\r\n updateSolarCollectorPoleHeightForAll: (type: ObjectType, poleHeight: number) => void;\r\n\r\n updateSolarCollectorPoleRadiusById: (id: string, poleRadius: number) => void;\r\n updateSolarCollectorPoleRadiusOnSurface: (\r\n type: ObjectType,\r\n parentId: string,\r\n normal: number[] | undefined,\r\n poleRadius: number,\r\n ) => void;\r\n updateSolarCollectorPoleRadiusAboveFoundation: (type: ObjectType, foundationId: string, poleRadius: number) => void;\r\n updateSolarCollectorPoleRadiusForAll: (type: ObjectType, poleRadius: number) => void;\r\n\r\n clearAllSolarCollectorYields: () => void;\r\n updateSolarCollectorDailyYieldById: (id: string, dailyYield: number) => void;\r\n updateSolarCollectorYearlyYieldById: (id: string, yearlyYield: number) => void;\r\n\r\n // for all types of concentrated solar power collectors\r\n updateCspReflectanceById: (id: string, reflectance: number) => void;\r\n updateCspReflectanceAboveFoundation: (type: ObjectType, foundationId: string, reflectance: number) => void;\r\n updateCspReflectanceForAll: (type: ObjectType, reflectance: number) => void;\r\n\r\n // for all types of parabolic solar collectors (that are standalone units)\r\n updateParabolicCollectorAbsorptanceById: (id: string, absorptance: number) => void;\r\n updateParabolicCollectorAbsorptanceAboveFoundation: (\r\n type: ObjectType,\r\n foundationId: string,\r\n absorptance: number,\r\n ) => void;\r\n updateParabolicCollectorAbsorptanceForAll: (type: ObjectType, absorptance: number) => void;\r\n updateParabolicCollectorOpticalEfficiencyById: (id: string, opticalEfficiency: number) => void;\r\n updateParabolicCollectorOpticalEfficiencyAboveFoundation: (\r\n type: ObjectType,\r\n foundationId: string,\r\n opticalEfficiency: number,\r\n ) => void;\r\n updateParabolicCollectorOpticalEfficiencyForAll: (type: ObjectType, opticalEfficiency: number) => void;\r\n updateParabolicCollectorThermalEfficiencyById: (id: string, thermalEfficiency: number) => void;\r\n updateParabolicCollectorThermalEfficiencyAboveFoundation: (\r\n type: ObjectType,\r\n foundationId: string,\r\n thermalEfficiency: number,\r\n ) => void;\r\n updateParabolicCollectorThermalEfficiencyForAll: (type: ObjectType, thermalEfficiency: number) => void;\r\n\r\n // for foundations\r\n foundationActionScope: Scope;\r\n setFoundationActionScope: (scope: Scope) => void;\r\n\r\n // for cuboids\r\n cuboidActionScope: Scope;\r\n setCuboidActionScope: (scope: Scope) => void;\r\n\r\n // for polygons\r\n polygonActionScope: Scope;\r\n setPolygonActionScope: (scope: Scope) => void;\r\n updatePolygonVertexPositionById: (id: string, index: number, x: number, y: number) => void;\r\n updatePolygonVerticesById: (id: string, vertices: Point2[]) => void;\r\n\r\n // for solar panels\r\n solarPanelActionScope: Scope;\r\n setSolarPanelActionScope: (scope: Scope) => void;\r\n updateSolarPanelTiltAngleById: (id: string, tiltAngle: number) => void;\r\n setSolarPanelOrientation: (sp: SolarPanelModel, pvModel: PvModel, orientation: Orientation) => void;\r\n\r\n // for parabolic troughs\r\n parabolicTroughActionScope: Scope;\r\n setParabolicTroughActionScope: (scope: Scope) => void;\r\n\r\n // for Fresnel reflectors\r\n fresnelReflectorActionScope: Scope;\r\n setFresnelReflectorActionScope: (scope: Scope) => void;\r\n\r\n // for heliostats\r\n heliostatActionScope: Scope;\r\n setHeliostatActionScope: (scope: Scope) => void;\r\n\r\n // for Fresnel reflectors and heliostats\r\n updateSolarReceiverById: (id: string, receiverId: string) => void;\r\n updateSolarReceiverAboveFoundation: (type: ObjectType, foundationId: string, receiverId: string) => void;\r\n updateSolarReceiverForAll: (type: ObjectType, receiverId: string) => void;\r\n\r\n // for parabolic dishes\r\n parabolicDishActionScope: Scope;\r\n setParabolicDishActionScope: (scope: Scope) => void;\r\n\r\n // for parabolic troughs and Fresnel reflectors\r\n updateModuleLengthById: (id: string, moduleLength: number) => void;\r\n updateModuleLengthAboveFoundation: (type: ObjectType, foundationId: string, moduleLength: number) => void;\r\n updateModuleLengthForAll: (type: ObjectType, moduleLength: number) => void;\r\n\r\n // for parabolic troughs and dishes\r\n updateParabolaLatusRectumById: (id: string, latusRectum: number) => void;\r\n updateParabolaLatusRectumAboveFoundation: (type: ObjectType, foundationId: string, latusRectum: number) => void;\r\n updateParabolaLatusRectumForAll: (type: ObjectType, latusRectum: number) => void;\r\n\r\n // for walls\r\n wallActionScope: Scope;\r\n setWallActionScope: (scope: Scope) => void;\r\n\r\n // for roofs\r\n roofActionScope: Scope;\r\n setRoofActionScope: (scope: Scope) => void;\r\n\r\n // for windows\r\n windowActionScope: Scope;\r\n setWindowActionScope: (scope: Scope) => void;\r\n\r\n // for doors\r\n doorActionScope: Scope;\r\n setDoorActionScope: (scope: Scope) => void;\r\n\r\n updateWallRelativeAngleById: (id: string, angle: number) => void;\r\n updateWallLeftJointsById: (id: string, joints: string[]) => void;\r\n updateWallRightJointsById: (id: string, joints: string[]) => void;\r\n updateWallLeftPointById: (id: string, point: number[]) => void;\r\n updateWallRightPointById: (id: string, point: number[]) => void;\r\n\r\n // for roofs\r\n updateRoofRiseById: (id: string, rise: number, topZ?: number) => void;\r\n updateRoofStructureById: (id: string, structure: RoofStructure) => void;\r\n\r\n // for lights\r\n updateInsideLightById: (id: string, inside: boolean) => void;\r\n updateInsideLightsByParentId: (parentId: string, inside: boolean) => void;\r\n\r\n actionModeLock: boolean;\r\n objectTypeToAdd: ObjectType;\r\n addElement: (parent: ElementModel | GroundModel, position: Vector3, normal?: Vector3) => ElementModel | null;\r\n\r\n pastePoint: Vector3;\r\n pasteNormal: Vector3 | undefined;\r\n elementsToPaste: ElementModel[]; // this is for undoing cut and pasting\r\n deletedElements: ElementModel[]; // this is for undoing deletion\r\n clearDeletedElements: () => void;\r\n copyElementById: (id: string) => void;\r\n removeSelectedElements: () => ElementModel[];\r\n removeElementById: (id: string, cut: boolean, selectNone?: boolean, auto?: boolean) => ElementModel[]; // set cut to false for deletion\r\n copyCutElements: () => ElementModel[];\r\n pasteElementsToPoint: () => ElementModel[];\r\n pasteElementsByKey: () => ElementModel[];\r\n countElementsByType: (type: ObjectType, excludeLocked?: boolean) => number;\r\n countSolarStructuresByType: (type: SolarStructure, excludeLocked?: boolean) => number;\r\n countObservers: () => number;\r\n removeElementsByType: (type: ObjectType) => void;\r\n countElementsByReferenceId: (id: string) => number;\r\n removeElementsByReferenceId: (id: string, cache: boolean) => void;\r\n getChildren: (id: string) => ElementModel[];\r\n getChildrenOfType: (type: ObjectType, id: string) => ElementModel[];\r\n // the following goes faster than counting individual types of children through multiple loops\r\n countAllElements: (excludeLocked?: boolean) => number;\r\n countAllElementsByType: (excludeLocked?: boolean) => ElementCounter;\r\n countAllOffspringsByTypeAtOnce: (ancestorId: string, includingLocked: boolean) => ElementCounter;\r\n countSolarPanelsOnRack: (id: string) => number;\r\n removeAllChildElementsByType: (parentId: string, type: ObjectType) => void;\r\n removeAllElementsOnFoundationByType: (foundationId: string, type: ObjectType) => void;\r\n\r\n // genetic algorithms and particle swarm optimization\r\n fittestIndividualResults: DatumEntry[];\r\n setFittestIndividualResults: (data: DatumEntry[]) => void;\r\n variableLabels: (string | undefined)[];\r\n setVariableLabels: (labels: (string | undefined)[]) => void;\r\n\r\n sunlightDirection: Vector3;\r\n setSunlightDirection: (vector: Vector3) => void;\r\n\r\n cameraDirection: Vector3;\r\n getCameraDirection: () => Vector3;\r\n\r\n updateSceneRadiusFlag: boolean;\r\n updateSceneRadius: () => void;\r\n sceneRadius: number;\r\n setSceneRadius: (radius: number) => void;\r\n\r\n selectedElementAngle: number;\r\n selectedElementHeight: number;\r\n selectedElementX: number;\r\n selectedElementY: number;\r\n\r\n isAddingElement: () => boolean;\r\n addedFoundationId: string | null;\r\n deletedFoundationId: string | null;\r\n\r\n addedCuboidId: string | null;\r\n deletedCuboidId: string | null;\r\n\r\n addedWallId: string | null;\r\n deletedWallId: string | null;\r\n updateWallMapOnFoundationFlag: boolean;\r\n updateWallMapOnFoundation: () => void;\r\n\r\n updateElementOnRoofFlag: boolean;\r\n setUpdateElementOnRoofFlag: (b: boolean) => void;\r\n updateElementOnRoofFn: () => void;\r\n\r\n addedWindowId: string | null;\r\n\r\n addedDoorId: string | null;\r\n\r\n deletedRoofId: string | null;\r\n deletedRoofIdSet: Set;\r\n addedRoofIdSet: Set; // new roof or undo multiple deleted roof, to notify roof to update walls.\r\n deleteAddedRoofId: (id: string) => void;\r\n\r\n autoDeletedRoofs: RoofModel[] | null;\r\n autoDeletedRoofIdSet: Set;\r\n autoDeletedChild: ElementModel[] | null; // [] means checked but no element, null means haven't check yet.\r\n getAutoDeletedElements: () => ElementModel[] | null;\r\n\r\n groupActionMode: boolean;\r\n setGroupActionMode: (b: boolean) => void;\r\n groupActionUpdateFlag: boolean;\r\n\r\n locale: Locale;\r\n localFileName: string;\r\n createNewFileFlag: boolean;\r\n setCreateNewFileFlag: (b: boolean) => void;\r\n openLocalFileFlag: boolean;\r\n setOpenLocalFileFlag: (b: boolean) => void;\r\n enableFineGrid: boolean;\r\n setEnableFineGrid: (b: boolean) => void;\r\n\r\n loggable: boolean;\r\n actionInfo: ActionInfo | undefined;\r\n currentUndoable: Undoable | undefined;\r\n showCloudFileTitleDialog: boolean;\r\n // we have to use the sure flip of an additional flag to ensure it triggers useEffect hook\r\n showCloudFileTitleDialogFlag: boolean;\r\n localContentToImportAfterCloudFileUpdate: any;\r\n\r\n solarPanelArrayLayoutParams: SolarPanelArrayLayoutParams;\r\n solarPanelArrayLayoutConstraints: SolarPanelArrayLayoutConstraints;\r\n evolutionaryAlgorithmState: EvolutionaryAlgorithmState;\r\n economicsParams: EconomicsParams;\r\n\r\n geneticAlgorithmWizardSelectedTab: string;\r\n particleSwarmOptimizationWizardSelectedTab: string;\r\n\r\n // the following is to fix the bug that when ctrl+o is pressed, the file dialog gets fired up multiple times\r\n localFileDialogRequested: boolean;\r\n\r\n tempHumanPlant: ElementModel[];\r\n}\r\n\r\nexport const useStore = create(\r\n devtools(\r\n persist(\r\n (set, get) => {\r\n const immerSet: CommonStoreState['set'] = (fn) => set(produce(fn));\r\n const defaultWorldModel = new DefaultWorldModel();\r\n const defaultElements = defaultWorldModel.getElements();\r\n\r\n return {\r\n set: (fn) => {\r\n try {\r\n immerSet(fn);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n },\r\n world: defaultWorldModel,\r\n elements: defaultElements,\r\n user: {} as User,\r\n viewState: new DefaultViewState(),\r\n actionState: new DefaultActionState(),\r\n graphState: new DefaultGraphState(),\r\n solarPanelArrayLayoutParams: new DefaultSolarPanelArrayLayoutParams(),\r\n solarPanelArrayLayoutConstraints: new DefaultSolarPanelArrayLayoutConstraints(),\r\n evolutionaryAlgorithmState: new DefaultEvolutionaryAlgorithmState(),\r\n economicsParams: new DefaultEconomicsParams(),\r\n geneticAlgorithmWizardSelectedTab: '1',\r\n particleSwarmOptimizationWizardSelectedTab: '1',\r\n modelType: ModelType.UNKNOWN,\r\n modelAuthor: null,\r\n modelLabel: null,\r\n modelDescription: null,\r\n projectView: false,\r\n projectInfo: {\r\n owner: null,\r\n title: null,\r\n description: null,\r\n type: DesignProblem.SOLAR_PANEL_ARRAY,\r\n designs: new Array(),\r\n ranges: new Array(),\r\n hiddenParameters: ProjectUtil.getDefaultHiddenParameters(DesignProblem.SOLAR_PANEL_ARRAY),\r\n counter: 0,\r\n dataColoring: DataColoring.ALL,\r\n selectedProperty: null,\r\n sortDescending: false,\r\n xAxisNameScatteredPlot: null,\r\n yAxisNameScatteredPlot: null,\r\n dotSizeScatteredPlot: 5,\r\n thumbnailWidth: 200,\r\n } as ProjectInfo,\r\n projectImages: new Map(),\r\n designProjectType: null,\r\n notes: [],\r\n language: 'en',\r\n floatingWindowOpacity: FLOATING_WINDOW_OPACITY,\r\n selectedFloatingWindow: null,\r\n cloudFile: undefined,\r\n latestModelSite: undefined,\r\n modelSites: new Map>(),\r\n peopleModels: new Map>(),\r\n modelsMapLatitude: 42.2844063,\r\n modelsMapLongitude: -71.3488548,\r\n modelsMapAddress: DEFAULT_ADDRESS,\r\n modelsMapZoom: DEFAULT_MODEL_MAP_ZOOM,\r\n modelsMapType: 'roadmap',\r\n modelsMapTilt: 0,\r\n\r\n minimumNavigationMoveSpeed: 3,\r\n minimumNavigationTurnSpeed: 3,\r\n\r\n tempHumanPlant: [],\r\n\r\n ray: new Raycaster(),\r\n mouse: new Vector2(),\r\n\r\n fileChanged: false,\r\n\r\n applyCount: 0,\r\n setApplyCount(count) {\r\n immerSet((state: CommonStoreState) => {\r\n state.applyCount = count;\r\n });\r\n },\r\n // Not sure why we cannot do this within immerSet\r\n revertApply() {\r\n if (get().applyCount) {\r\n for (let i = 0; i < get().applyCount; i++) {\r\n get().undoManager.undo();\r\n }\r\n get().setApplyCount(0);\r\n }\r\n },\r\n\r\n importContent(content, title) {\r\n immerSet((state: CommonStoreState) => {\r\n state.world = content.world;\r\n state.viewState = content.view;\r\n state.graphState = content.graphState ?? new DefaultGraphState();\r\n state.elements = content.elements;\r\n state.notes = content.notes ?? [];\r\n state.modelType = content.modelType ?? ModelType.UNKNOWN;\r\n state.modelAuthor = content.modelAuthor ?? null;\r\n state.modelLabel = content.modelLabel ?? null;\r\n state.modelDescription = content.modelDescription ?? null;\r\n state.designProjectType = content.designProjectType ?? null;\r\n state.cloudFile = title;\r\n state.currentUndoable = undefined;\r\n state.actionInfo = undefined;\r\n state.sceneRadius = content.sceneRadius ?? 100;\r\n state.updateSceneRadiusFlag = !state.updateSceneRadiusFlag;\r\n state.localContentToImportAfterCloudFileUpdate = undefined;\r\n state.fileChanged = !state.fileChanged;\r\n state.evolutionMethod = content.evolutionMethod ?? EvolutionMethod.GENETIC_ALGORITHM;\r\n state.solarPanelArrayLayoutParams =\r\n content.solarPanelArrayLayoutParams ?? new DefaultSolarPanelArrayLayoutParams();\r\n state.solarPanelArrayLayoutConstraints =\r\n content.solarPanelArrayLayoutConstraints ?? new DefaultSolarPanelArrayLayoutConstraints();\r\n state.evolutionaryAlgorithmState =\r\n content.evolutionaryAlgorithmState ?? new DefaultEvolutionaryAlgorithmState();\r\n state.economicsParams = content.economicsParams ?? new DefaultEconomicsParams();\r\n state.minimumNavigationMoveSpeed = content.minimumNavigationMoveSpeed ?? 3;\r\n state.minimumNavigationTurnSpeed = content.minimumNavigationTurnSpeed ?? 3;\r\n // clear existing data, if any\r\n state.fittestIndividualResults.length = 0;\r\n state.undoManager.clear();\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n state.deletedRoofIdSet.clear();\r\n state.addedRoofIdSet.clear();\r\n state.actionState = new DefaultActionState();\r\n state.multiSelectionsMode = false;\r\n state.selectedElementIdSet.clear();\r\n state.groupActionMode = false;\r\n state.selectedFloatingWindow = null;\r\n StoreUtil.updateOldFileData(state);\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.changed = false;\r\n state.skipChange = true;\r\n state.showSolarRadiationHeatmap = false;\r\n state.showHeatFluxes = false;\r\n state.simulationInProgress = false;\r\n state.simulationPaused = false;\r\n state.clearDailySimulationResultsFlag = !state.clearDailySimulationResultsFlag;\r\n state.clearYearlySimulationResultsFlag = !state.clearYearlySimulationResultsFlag;\r\n state.navigationMoveSpeed = content.minimumNavigationMoveSpeed ?? 3;\r\n state.navigationTurnSpeed = content.minimumNavigationTurnSpeed ?? 3;\r\n });\r\n useDataStore.getState().clearDataStore();\r\n useDataStore.getState().clearRoofVerticesMap();\r\n },\r\n exportContent() {\r\n const state = get();\r\n const date = new Date();\r\n const elements = JSON.parse(JSON.stringify(state.elements));\r\n Util.fixElements(elements);\r\n return {\r\n docid: short.generate(),\r\n time: dayjs(date).format('MM/DD/YYYY hh:mm A'),\r\n timestamp: date.getTime(),\r\n userid: state.user.uid,\r\n owner: state.user.signFile ? state.user.displayName : null,\r\n email: state.user.signFile ? state.user.email : null,\r\n world: JSON.parse(JSON.stringify(state.world)),\r\n elements: elements,\r\n sceneRadius: state.sceneRadius,\r\n view: JSON.parse(JSON.stringify(state.viewState)),\r\n graphState: JSON.parse(JSON.stringify(state.graphState)),\r\n evolutionMethod: state.evolutionMethod,\r\n solarPanelArrayLayoutParams: JSON.parse(JSON.stringify(state.solarPanelArrayLayoutParams)),\r\n solarPanelArrayLayoutConstraints: JSON.parse(JSON.stringify(state.solarPanelArrayLayoutConstraints)),\r\n evolutionaryAlgorithmState: JSON.parse(JSON.stringify(state.evolutionaryAlgorithmState)),\r\n economicsParams: JSON.parse(JSON.stringify(state.economicsParams)),\r\n modelType: state.modelType,\r\n modelAuthor: state.modelAuthor,\r\n modelLabel: state.modelLabel,\r\n modelDescription: state.modelDescription,\r\n designProjectType: state.designProjectType,\r\n notes: state.notes,\r\n minimumNavigationMoveSpeed: state.minimumNavigationMoveSpeed,\r\n minimumNavigationTurnSpeed: state.minimumNavigationTurnSpeed,\r\n };\r\n },\r\n clearContent() {\r\n immerSet((state: CommonStoreState) => {\r\n state.elements = [];\r\n state.sceneRadius = 100;\r\n });\r\n useDataStore.getState().clearDataStore();\r\n useDataStore.getState().clearRoofVerticesMap();\r\n },\r\n createEmptyFile() {\r\n immerSet((state: CommonStoreState) => {\r\n DefaultWorldModel.resetWorldModel(state.world);\r\n DefaultViewState.resetViewState(state.viewState);\r\n // don't create a new instance like this (otherwise some UI elements may not update):\r\n // state.world = new DefaultWorldModel()\r\n state.elements = [];\r\n state.sceneRadius = 100;\r\n state.cloudFile = undefined;\r\n state.localContentToImportAfterCloudFileUpdate = undefined;\r\n state.notes = [];\r\n state.fileChanged = !state.fileChanged;\r\n state.currentUndoable = undefined;\r\n state.actionInfo = undefined;\r\n state.undoManager.clear();\r\n state.modelType = ModelType.UNKNOWN;\r\n state.modelLabel = null;\r\n state.modelDescription = null;\r\n state.designProjectType = null;\r\n state.minimumNavigationMoveSpeed = 3;\r\n state.minimumNavigationTurnSpeed = 3;\r\n state.multiSelectionsMode = false;\r\n state.selectedElementIdSet.clear();\r\n state.groupActionMode = false;\r\n state.selectedFloatingWindow = null;\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n state.deletedRoofIdSet.clear();\r\n state.addedRoofIdSet.clear();\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.changed = false;\r\n state.skipChange = true;\r\n state.showSolarRadiationHeatmap = false;\r\n state.showHeatFluxes = false;\r\n });\r\n useDataStore.getState().clearDataStore();\r\n useDataStore.getState().clearRoofVerticesMap();\r\n },\r\n undoManager: new UndoManager(),\r\n addUndoable(undoable: Undoable) {\r\n immerSet((state: CommonStoreState) => {\r\n if (state.loggable) {\r\n state.currentUndoable = undoable;\r\n }\r\n state.undoManager.add(undoable);\r\n });\r\n },\r\n\r\n // genetic algorithms\r\n fittestIndividualResults: [],\r\n setFittestIndividualResults(data) {\r\n immerSet((state: CommonStoreState) => {\r\n state.fittestIndividualResults = [...data];\r\n });\r\n },\r\n variableLabels: [],\r\n setVariableLabels(labels) {\r\n immerSet((state: CommonStoreState) => {\r\n state.variableLabels = [...labels];\r\n });\r\n },\r\n\r\n // aabb must be initialized with defined vectors, or it may cause problems as it may be used to\r\n // determine the scopes of the axes.\r\n aabb: new Box3(new Vector3(-10, -10, -10), new Vector3(10, 10, 10)),\r\n animate24Hours: false,\r\n evolutionMethod: EvolutionMethod.GENETIC_ALGORITHM,\r\n clickObjectType: null,\r\n contextMenuObjectType: null,\r\n hoveredHandle: null,\r\n moveHandleType: null,\r\n resizeHandleType: null,\r\n rotateHandleType: null,\r\n resizeAnchor: new Vector3(),\r\n\r\n selectedElement: null,\r\n getSelectedElement() {\r\n if (get().selectedElementIdSet.size === 0) return null;\r\n const selectedElement = get().selectedElement;\r\n if (!selectedElement) return null;\r\n return get().elements.find((e) => e.id === selectedElement.id) ?? null;\r\n },\r\n\r\n selectedElementIdSet: new Set(),\r\n multiSelectionsMode: false,\r\n\r\n // a sibling is defined as an element of the same type of the same parent\r\n findNearestSibling(id) {\r\n let foundId: string | null = null;\r\n const me = get().getElementById(id);\r\n if (me) {\r\n let distanceSquare = Number.MAX_VALUE;\r\n for (const e of get().elements) {\r\n if (e.type === me.type && e.parentId === me.parentId && e.id !== id) {\r\n const dx = me.cx - e.cx;\r\n const dy = me.cy - e.cy;\r\n const dz = me.cz - e.cz;\r\n const sq = dx * dx + dy * dy + dz * dz;\r\n if (distanceSquare > sq) {\r\n distanceSquare = sq;\r\n foundId = e.id;\r\n }\r\n }\r\n }\r\n }\r\n return foundId;\r\n },\r\n overlapWithSibling(me, threshold) {\r\n let overlap = false;\r\n if (threshold === undefined) {\r\n // when threshold is not set, check overlap of bounding boxes\r\n const parent = get().getParent(me);\r\n if (parent) {\r\n for (const e of get().elements) {\r\n if (e.type === me.type && e.parentId === me.parentId && e.id !== me.id) {\r\n if (me.type === ObjectType.SolarPanel) {\r\n if (Util.doSolarPanelsOverlap(me as SolarPanelModel, e as SolarPanelModel, parent)) {\r\n overlap = true;\r\n break;\r\n }\r\n } else {\r\n if (\r\n Math.abs(me.cx - e.cx) * parent.lx < 0.5 * (me.lx + e.lx) &&\r\n Math.abs(me.cy - e.cy) * parent.ly < 0.5 * (me.ly + e.ly) &&\r\n Math.abs(me.cz - e.cz) * parent.lz < 0.5 * (me.lz + e.lz)\r\n ) {\r\n overlap = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // when threshold is set, use the distance between centers to detect overlap using it\r\n const thresholdSquared = threshold * threshold;\r\n const parent = get().getParent(me);\r\n for (const e of get().elements) {\r\n if (e.type === me.type && e.parentId === me.parentId && e.id !== me.id) {\r\n const dx = (me.cx - e.cx) * (parent ? parent.lx : 1);\r\n const dy = (me.cy - e.cy) * (parent ? parent.ly : 1);\r\n const dz = (me.cz - e.cz) * (parent ? parent.lz : 1);\r\n const sq = dx * dx + dy * dy + dz * dz;\r\n if (sq < thresholdSquared) {\r\n overlap = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return overlap;\r\n },\r\n\r\n selectedSideIndex: -1,\r\n\r\n getResizeHandlePosition(el, handleType) {\r\n const { cx, cy, lx, ly, lz, type, parentId } = el;\r\n const p = new Vector3(cx, cy, 0);\r\n switch (type) {\r\n case ObjectType.Cuboid: {\r\n const v = new Vector2();\r\n switch (handleType) {\r\n case ResizeHandleType.LowerLeftTop:\r\n v.set(-lx / 2, -ly / 2);\r\n break;\r\n case ResizeHandleType.LowerRightTop:\r\n v.set(lx / 2, -ly / 2);\r\n break;\r\n case ResizeHandleType.UpperLeftTop:\r\n v.set(-lx / 2, ly / 2);\r\n break;\r\n case ResizeHandleType.UpperRightTop:\r\n v.set(lx / 2, ly / 2);\r\n break;\r\n }\r\n const { pos, rot } = Util.getWorldDataById(el.id);\r\n v.rotateAround(ORIGIN_VECTOR2, rot);\r\n p.set(pos.x + v.x, pos.y + v.y, pos.z - lz / 2);\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = el as WallModel;\r\n const parent = get().elements.find((e) => e.id === parentId);\r\n if (parent) {\r\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.lz);\r\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\r\n const handlePosition = new Vector3();\r\n switch (handleType) {\r\n case ResizeHandleType.UpperLeft: {\r\n handlePosition.fromArray(wall.leftPoint).setZ(0);\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n handlePosition.fromArray(wall.rightPoint).setZ(0);\r\n break;\r\n }\r\n }\r\n p.copy(handlePosition.applyEuler(parentRotation).add(parentPosition));\r\n }\r\n break;\r\n }\r\n case ObjectType.Roof: {\r\n const parent = get().elements.find((e) => e.id === parentId);\r\n if (parent) {\r\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.lz);\r\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\r\n const handlePosition = new Vector3(get().selectedElementX, get().selectedElementY)\r\n .applyEuler(parentRotation)\r\n .add(parentPosition);\r\n p.set(handlePosition.x, handlePosition.y, parent.lz);\r\n }\r\n break;\r\n }\r\n case ObjectType.Tree: {\r\n const parent = get().elements.find((e) => e.id === parentId);\r\n if (parent) {\r\n const parentPosition = new Vector3(parent.cx, parent.cy, parent.cz + parent.lz / 2);\r\n const parentRotation = new Euler(0, 0, parent.rotation[2]);\r\n p.copy(new Vector3(el.cx, el.cy, parent.lz).applyEuler(parentRotation).add(parentPosition));\r\n }\r\n break;\r\n }\r\n }\r\n return p;\r\n },\r\n getElementById(id) {\r\n const elements = get().elements;\r\n for (const e of elements) {\r\n if (e.id === id) {\r\n return e;\r\n }\r\n }\r\n return null;\r\n },\r\n getParent(child) {\r\n const elements = get().elements;\r\n for (const e of elements) {\r\n if (e.id === child.parentId) {\r\n return e;\r\n }\r\n }\r\n return null;\r\n },\r\n getFoundation(elem) {\r\n const elements = get().elements;\r\n for (const e of elements) {\r\n if (e.id === elem.foundationId && e.type === ObjectType.Foundation) {\r\n return e as FoundationModel;\r\n }\r\n }\r\n return null;\r\n },\r\n selectNone() {\r\n immerSet((state: CommonStoreState) => {\r\n state.selectedElementIdSet.clear();\r\n for (const e of state.elements) {\r\n e.selected = false;\r\n }\r\n state.selectedElement = null;\r\n });\r\n useRefStore.getState().selectNone();\r\n },\r\n selectMe(id, e, action, select) {\r\n const setEnableOrbitController = useRefStore.getState().setEnableOrbitController;\r\n if (e.intersections.length > 0) {\r\n const intersectableObjects = e.intersections.filter(\r\n (obj) => !obj.eventObject.name.startsWith('Wall Intersection Plane'),\r\n );\r\n if (intersectableObjects[0].object === e.eventObject || select) {\r\n immerSet((state) => {\r\n for (const elem of state.elements) {\r\n if (elem.id === id) {\r\n elem.selected = true;\r\n state.selectedElement = elem;\r\n // TODO: lz is now zero for roof. So this may need to be set from elsewhere for roofs.\r\n state.selectedElementHeight = elem.lz;\r\n\r\n if (state.groupActionMode) {\r\n let fId = elem.foundationId ?? null;\r\n if (!fId && isGroupable(elem)) {\r\n fId = Util.getBaseId(elem.id);\r\n }\r\n if (fId) {\r\n if (!state.multiSelectionsMode) {\r\n state.selectedElementIdSet.clear();\r\n }\r\n if (state.selectedElementIdSet.has(fId)) {\r\n state.selectedElementIdSet.delete(fId);\r\n } else {\r\n state.selectedElementIdSet.add(fId);\r\n }\r\n }\r\n } else {\r\n if (action === ActionType.ContextMenu) {\r\n // right click on selected element\r\n if (state.selectedElementIdSet.has(id)) {\r\n // de-select other type of elements\r\n for (const elem of state.elements) {\r\n if (state.selectedElementIdSet.has(elem.id) && elem.type !== state.selectedElement.type) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n }\r\n // right click on new element\r\n else {\r\n if (state.multiSelectionsMode) {\r\n state.selectedElementIdSet.add(id);\r\n for (const elem of state.elements) {\r\n if (\r\n state.selectedElementIdSet.has(elem.id) &&\r\n elem.type !== state.selectedElement.type\r\n ) {\r\n state.selectedElementIdSet.delete(elem.id);\r\n }\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n } else {\r\n if (state.multiSelectionsMode) {\r\n if (state.selectedElementIdSet.has(id)) {\r\n state.selectedElementIdSet.delete(id);\r\n } else {\r\n state.selectedElementIdSet.add(id);\r\n }\r\n } else {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(id);\r\n }\r\n }\r\n }\r\n } else {\r\n elem.selected = false;\r\n }\r\n }\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.rotateHandleType = null;\r\n if (action) {\r\n switch (action) {\r\n case ActionType.Move:\r\n if (\r\n state.selectedElement?.type === ObjectType.Tree ||\r\n state.selectedElement?.type === ObjectType.Human\r\n ) {\r\n // selecting the above two types of object automatically sets them to the moving state\r\n state.moveHandleType = MoveHandleType.Default;\r\n } else {\r\n state.moveHandleType = e.eventObject.name as MoveHandleType;\r\n }\r\n setEnableOrbitController(false);\r\n break;\r\n case ActionType.Resize:\r\n state.resizeHandleType = e.eventObject.name as ResizeHandleType;\r\n setEnableOrbitController(false);\r\n break;\r\n case ActionType.Rotate:\r\n state.rotateHandleType = e.eventObject.name as RotateHandleType;\r\n setEnableOrbitController(false);\r\n break;\r\n case ActionType.Select:\r\n state.selectedElementAngle = e.object.parent?.rotation.z ?? 0;\r\n setEnableOrbitController(true);\r\n break;\r\n default:\r\n setEnableOrbitController(true);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n },\r\n\r\n // for all types of elements\r\n updateAllElementLocks(locked) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n e.locked = locked;\r\n }\r\n });\r\n },\r\n updateElementLockByFoundationId(foundationId, locked) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId || e.parentId === foundationId || e.id === foundationId) {\r\n e.locked = locked;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLockByParentId(parentId, type: ObjectType, locked) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === parentId && type === e.type) {\r\n e.locked = locked;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLockById(id, locked) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.locked = locked;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementReferenceById(id, referenceId) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.referenceId = referenceId;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateElementLabelById(id, label) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.label = label;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementShowLabelById(id, showLabel) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.showLabel = showLabel;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // color\r\n updateElementColorById(id, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.color = color;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementColorOnSurface(type, parentId, normal, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementColorAboveFoundation(type, foundationId, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementColorForAll(type, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineColorById(id, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.lineColor = color;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineColorOnSurface(type, parentId, normal, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\r\n e.lineColor = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineColorAboveFoundation(type, foundationId, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.lineColor = color;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineColorForAll(type, color) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lineColor = color;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateElementLineWidthById(id, width) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.lineWidth = width;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineWidthOnSurface(type, parentId, normal, width) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.parentId === parentId && Util.isIdentical(e.normal, normal) && !e.locked) {\r\n e.lineWidth = width;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineWidthAboveFoundation(type, foundationId, width) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.lineWidth = width;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLineWidthForAll(type, width) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lineWidth = width;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateElementCxById(id, cx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.cx = cx;\r\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementCyById(id, cy) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.cy = cy;\r\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementCzById(id, cz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.cz = cz;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementCzForAll(type, cz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.cz = cz;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // lx\r\n updateElementLxById(id, lx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.lx = lx;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLxAboveFoundation(type, foundationId, lx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.lx = lx;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLxOnSurface(type, parentId, normal, lx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n e.lx = lx;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateElementLxForAll(type, lx) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lx = lx;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // ly\r\n updateElementLyById(id, ly) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.ly = ly;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLyAboveFoundation(type, foundationId, ly) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.ly = ly;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLyOnSurface(type, parentId, normal, ly) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n e.ly = ly;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateElementLyForAll(type, ly) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.ly = ly;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // lz\r\n updateElementLzById(id, lz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.lz = lz;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLzAboveFoundation(type, foundationId, lz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId && !e.locked) {\r\n e.lz = lz;\r\n }\r\n }\r\n });\r\n },\r\n updateElementLzOnSurface(type, parentId, normal, lz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n e.lz = lz;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateElementLzForAll(type, lz) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lz = lz;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateElementRotationById(id, x, y, z) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n e.rotation[0] = x;\r\n e.rotation[1] = y;\r\n e.rotation[2] = z;\r\n } else if (e.parentId === id && !isStackableModel(e)) {\r\n e.rotation[0] = x;\r\n e.rotation[1] = y;\r\n e.rotation[2] = z;\r\n }\r\n }\r\n state.selectedElementAngle = z;\r\n });\r\n },\r\n updateElementRotationForAll(type, x, y, z) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n if (!e.locked) {\r\n e.rotation[0] = x;\r\n e.rotation[1] = y;\r\n e.rotation[2] = z;\r\n }\r\n } else {\r\n // FIXME: I don't understand the logic below\r\n const parent = state.getParent(e);\r\n if (parent && !parent.locked && parent.type === type) {\r\n e.rotation[0] = x;\r\n e.rotation[1] = y;\r\n e.rotation[2] = z;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for solar collectors\r\n updateSolarCollectorDrawSunBeamById(id, draw) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (Util.isSolarCollector(e)) {\r\n (e as SolarCollector).drawSunBeam = draw;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorDrawSunBeamAboveFoundation(type, foundationId, draw) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === type) {\r\n (e as SolarCollector).drawSunBeam = draw;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorDrawSunBeamForAll(type, draw) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === type) {\r\n (e as SolarCollector).drawSunBeam = draw;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorRelativeAzimuthById(id, relativeAzimuth) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\r\n state.selectedElementAngle = relativeAzimuth;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorRelativeAzimuthAboveFoundation(type, foundationId, relativeAzimuth) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (\r\n e.type === type &&\r\n e.foundationId === foundationId &&\r\n !e.locked &&\r\n (e as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorRelativeAzimuthOnSurface(type, parentId, normal, relativeAzimuth) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorRelativeAzimuthForAll(type, relativeAzimuth) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked && (e as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n (e as SolarCollector).relativeAzimuth = relativeAzimuth;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateSolarCollectorPoleHeightById(id, poleHeight) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).poleHeight = poleHeight;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleHeightAboveFoundation(type, foundationId, poleHeight) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked && e.type === type) {\r\n (e as SolarCollector).poleHeight = poleHeight;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleHeightOnSurface(type, parentId, normal, poleHeight) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === type) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarCollector).poleHeight = poleHeight;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleHeightForAll(type, poleHeight) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n (e as SolarCollector).poleHeight = poleHeight;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateSolarCollectorPoleRadiusById(id, poleRadius) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).poleRadius = poleRadius;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleRadiusAboveFoundation(type, foundationId, poleRadius) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked && e.type === type) {\r\n (e as SolarCollector).poleRadius = poleRadius;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleRadiusOnSurface(type, parentId, normal, poleRadius) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === type) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarCollector).poleRadius = poleRadius;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorPoleRadiusForAll(type, poleRadius) {\r\n if (!Util.isSolarCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n (e as SolarCollector).poleRadius = poleRadius;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // this should be called if any of the solar collectors changes\r\n clearAllSolarCollectorYields() {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (Util.isSolarCollector(e)) {\r\n const sc = e as SolarCollector;\r\n sc.dailyYield = 0;\r\n sc.yearlyYield = 0;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorDailyYieldById(id, dailyYield) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).dailyYield = dailyYield;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateSolarCollectorYearlyYieldById(id, yearlyYield) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isSolarCollector(e)) {\r\n (e as SolarCollector).yearlyYield = yearlyYield;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for concentrated solar power collectors\r\n updateCspReflectanceById(id, reflectance) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isCspCollector(e)) {\r\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateCspReflectanceAboveFoundation(type, foundationId, reflectance) {\r\n if (!Util.isCspCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId) {\r\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\r\n }\r\n }\r\n });\r\n },\r\n updateCspReflectanceForAll(type, reflectance) {\r\n if (!Util.isCspCollectorType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n (e as ConcentratedSolarPowerCollector).reflectance = reflectance;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateParabolicCollectorAbsorptanceById(id, absorptance) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isParabolicCollector(e)) {\r\n (e as ParabolicCollector).absorptance = absorptance;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorAbsorptanceAboveFoundation(type, foundationId, absorptance) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId) {\r\n (e as ParabolicCollector).absorptance = absorptance;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorAbsorptanceForAll(type, absorptance) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n (e as ParabolicCollector).absorptance = absorptance;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateParabolicCollectorOpticalEfficiencyById(id, opticalEfficiency) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isParabolicCollector(e)) {\r\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorOpticalEfficiencyAboveFoundation(type, foundationId, opticalEfficiency) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId) {\r\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorOpticalEfficiencyForAll(type, opticalEfficiency) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n (e as ParabolicCollector).opticalEfficiency = opticalEfficiency;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateParabolicCollectorThermalEfficiencyById(id, thermalEfficiency) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && Util.isParabolicCollector(e)) {\r\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorThermalEfficiencyAboveFoundation(type, foundationId, thermalEfficiency) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && e.foundationId === foundationId) {\r\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolicCollectorThermalEfficiencyForAll(type, thermalEfficiency) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === type) {\r\n (e as ParabolicCollector).thermalEfficiency = thermalEfficiency;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for foundations\r\n foundationActionScope: Scope.OnlyThisObject,\r\n setFoundationActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.foundationActionScope = scope;\r\n });\r\n },\r\n\r\n // for cuboids\r\n cuboidActionScope: Scope.OnlyThisSide,\r\n setCuboidActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.cuboidActionScope = scope;\r\n });\r\n },\r\n\r\n // for polygons\r\n polygonActionScope: Scope.OnlyThisObject,\r\n setPolygonActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.polygonActionScope = scope;\r\n });\r\n },\r\n updatePolygonVertexPositionById(id, index, x, y) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n if (index >= 0 && index < p.vertices.length) {\r\n p.vertices[index].x = x;\r\n p.vertices[index].y = y;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n // must feed a deep copy of the vertices\r\n updatePolygonVerticesById(id, vertices) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n p.vertices = vertices;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for solar panels\r\n solarPanelActionScope: Scope.OnlyThisObject,\r\n setSolarPanelActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.solarPanelActionScope = scope;\r\n });\r\n },\r\n updateSolarPanelTiltAngleById(id, tiltAngle) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.tiltAngle = tiltAngle;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n setSolarPanelOrientation(sp, pvModel, orientation) {\r\n sp.orientation = orientation;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n },\r\n\r\n // for parabolic troughs\r\n parabolicTroughActionScope: Scope.OnlyThisObject,\r\n setParabolicTroughActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.parabolicTroughActionScope = scope;\r\n });\r\n },\r\n\r\n // for Fresnel reflector\r\n fresnelReflectorActionScope: Scope.OnlyThisObject,\r\n setFresnelReflectorActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.fresnelReflectorActionScope = scope;\r\n });\r\n },\r\n\r\n // for heliostat\r\n heliostatActionScope: Scope.OnlyThisObject,\r\n setHeliostatActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.heliostatActionScope = scope;\r\n });\r\n },\r\n updateSolarReceiverById(id, receiverId) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (e.type === ObjectType.Heliostat) {\r\n (e as HeliostatModel).towerId = receiverId;\r\n break;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).receiverId = receiverId;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarReceiverAboveFoundation(type: ObjectType, foundationId, receiverId) {\r\n if (!Util.isHeliostatOrFresnelReflector(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === ObjectType.Heliostat) {\r\n (e as HeliostatModel).towerId = receiverId;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).receiverId = receiverId;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateSolarReceiverForAll(type, receiverId) {\r\n if (!Util.isHeliostatOrFresnelReflector(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === ObjectType.Heliostat) {\r\n (e as HeliostatModel).towerId = receiverId;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).receiverId = receiverId;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for parabolic dishes\r\n parabolicDishActionScope: Scope.OnlyThisObject,\r\n setParabolicDishActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.parabolicDishActionScope = scope;\r\n });\r\n },\r\n\r\n // for parabolic troughs and Fresnel reflectors\r\n updateModuleLengthById(id, moduleLength) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).moduleLength = moduleLength;\r\n break;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).moduleLength = moduleLength;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateModuleLengthAboveFoundation(type, foundationId, moduleLength) {\r\n if (!Util.isParabolicTroughOrFresnelReflector(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).moduleLength = moduleLength;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).moduleLength = moduleLength;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateModuleLengthForAll(type, moduleLength) {\r\n if (!Util.isParabolicTroughOrFresnelReflector(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).moduleLength = moduleLength;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).moduleLength = moduleLength;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for parabolic troughs and dishes\r\n updateParabolaLatusRectumById(id, latusRectum) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).latusRectum = latusRectum;\r\n } else if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).latusRectum = latusRectum;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateParabolaLatusRectumAboveFoundation(type, foundationId, latusRectum) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).latusRectum = latusRectum;\r\n } else if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).latusRectum = latusRectum;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n updateParabolaLatusRectumForAll(type, latusRectum) {\r\n if (!Util.isParabolaType(type)) return;\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === ObjectType.ParabolicTrough) {\r\n (e as ParabolicTroughModel).latusRectum = latusRectum;\r\n } else if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).latusRectum = latusRectum;\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // for walls\r\n wallActionScope: Scope.OnlyThisObject,\r\n setWallActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.wallActionScope = scope;\r\n });\r\n },\r\n // for roofs\r\n roofActionScope: Scope.OnlyThisObject,\r\n setRoofActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.roofActionScope = scope;\r\n });\r\n },\r\n // for windows\r\n windowActionScope: Scope.OnlyThisObject,\r\n setWindowActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.windowActionScope = scope;\r\n });\r\n },\r\n\r\n // for doors\r\n doorActionScope: Scope.OnlyThisObject,\r\n setDoorActionScope(scope) {\r\n immerSet((state: CommonStoreState) => {\r\n state.doorActionScope = scope;\r\n });\r\n },\r\n\r\n updateWallRelativeAngleById(id, angle) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).relativeAngle = angle;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateWallLeftJointsById(id, joints) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id) {\r\n (e as WallModel).leftJoints = joints;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateWallRightJointsById(id, joints) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id) {\r\n (e as WallModel).rightJoints = joints;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateWallLeftPointById(id, point) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).leftPoint = [...point];\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateWallRightPointById(id, point) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).rightPoint = [...point];\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateRoofRiseById(id, rise, topZ) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Roof) {\r\n (e as RoofModel).rise = rise;\r\n state.actionState.roofRise = rise;\r\n if (topZ !== undefined) {\r\n state.selectedElementHeight = topZ;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateRoofStructureById(id, structure) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Roof) {\r\n const roofModel = e as RoofModel;\r\n roofModel.roofStructure = structure;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n updateInsideLightById(id, inside) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Light && e.id === id) {\r\n (e as LightModel).inside = inside;\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n updateInsideLightsByParentId(parentId, inside) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === parentId && e.type === ObjectType.Light) {\r\n (e as LightModel).inside = inside;\r\n }\r\n }\r\n });\r\n },\r\n\r\n setElementPosition(id, x, y, z?) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const [i, e] of state.elements.entries()) {\r\n if (e.id === id) {\r\n state.elements[i].cx = x;\r\n state.elements[i].cy = y;\r\n if (z !== undefined) {\r\n state.elements[i].cz = z;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n setElementNormal(id, x, y, z) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const [i, e] of state.elements.entries()) {\r\n if (e.id === id || e.parentId === id) {\r\n const elem = state.elements[i];\r\n elem.normal[0] = x;\r\n elem.normal[1] = y;\r\n elem.normal[2] = z;\r\n }\r\n }\r\n });\r\n },\r\n setElementSize(id, lx, ly, lz?) {\r\n immerSet((state: CommonStoreState) => {\r\n for (const [i, e] of state.elements.entries()) {\r\n if (e.id === id) {\r\n state.elements[i].lx = lx;\r\n state.elements[i].ly = ly;\r\n if (lz) {\r\n state.elements[i].lz = lz;\r\n state.selectedElementHeight = lz;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n },\r\n\r\n actionModeLock: false,\r\n objectTypeToAdd: ObjectType.None,\r\n addElement(parent, p, normal) {\r\n let model: ElementModel | null = null;\r\n const parentId = 'id' in parent ? parent.id : GROUND_ID;\r\n immerSet((state: CommonStoreState) => {\r\n switch (state.objectTypeToAdd) {\r\n case ObjectType.Human: {\r\n const position = new Vector3().copy(p);\r\n if (parentId !== GROUND_ID) {\r\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\r\n position\r\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n }\r\n const human = ElementModelFactory.makeHuman(\r\n state.actionState.humanName,\r\n parentId,\r\n position.x,\r\n position.y,\r\n position.z,\r\n );\r\n model = human;\r\n state.elements.push(human);\r\n break;\r\n }\r\n case ObjectType.Tree: {\r\n const position = new Vector3().copy(p);\r\n if (parentId !== GROUND_ID) {\r\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\r\n position\r\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n }\r\n const tree = ElementModelFactory.makeTree(\r\n state.actionState.treeType,\r\n state.actionState.treeSpread,\r\n state.actionState.treeHeight,\r\n parentId,\r\n position.x,\r\n position.y,\r\n position.z,\r\n );\r\n model = tree;\r\n state.elements.push(tree);\r\n break;\r\n }\r\n case ObjectType.Flower: {\r\n const position = new Vector3().copy(p);\r\n if (parentId !== GROUND_ID) {\r\n const { rot: parentWorldRotation, pos: parentWorldPosition } = Util.getWorldDataById(parentId);\r\n position\r\n .sub(new Vector3(parentWorldPosition.x, parentWorldPosition.y, parentWorldPosition.z))\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n }\r\n const flower = ElementModelFactory.makeFlower(\r\n state.actionState.flowerType,\r\n parentId,\r\n position.x,\r\n position.y,\r\n position.z,\r\n );\r\n model = flower;\r\n state.elements.push(flower);\r\n break;\r\n }\r\n case ObjectType.Polygon:\r\n const polygonParentModel = parent as ElementModel;\r\n const polygonRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, polygonParentModel);\r\n const polygon = ElementModelFactory.makePolygon(\r\n polygonParentModel,\r\n polygonRelativeCoordinates.x,\r\n polygonRelativeCoordinates.y,\r\n polygonRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n polygonParentModel.type,\r\n );\r\n model = polygon;\r\n state.elements.push(polygon);\r\n break;\r\n case ObjectType.Sensor:\r\n const sensorParentModel = parent as ElementModel;\r\n const sensorRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, sensorParentModel);\r\n const sensor = ElementModelFactory.makeSensor(\r\n sensorParentModel,\r\n sensorRelativeCoordinates.x,\r\n sensorRelativeCoordinates.y,\r\n sensorRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n );\r\n model = sensor;\r\n state.elements.push(sensor);\r\n break;\r\n case ObjectType.Light:\r\n const lightParentModel = parent as ElementModel;\r\n const lightRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, lightParentModel);\r\n const light = ElementModelFactory.makeLight(\r\n lightParentModel,\r\n 2,\r\n state.actionState.lightDistance,\r\n state.actionState.lightIntensity,\r\n state.actionState.lightColor,\r\n lightRelativeCoordinates.x,\r\n lightRelativeCoordinates.y,\r\n lightRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n );\r\n model = light;\r\n state.elements.push(light);\r\n break;\r\n case ObjectType.SolarPanel:\r\n const solarPanelParentModel = parent as ElementModel;\r\n const solarPanelRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, solarPanelParentModel);\r\n const solarPanel = ElementModelFactory.makeSolarPanel(\r\n solarPanelParentModel,\r\n state.getPvModule(state.actionState.solarPanelModelName ?? 'SPR-X21-335-BLK'),\r\n solarPanelRelativeCoordinates.x,\r\n solarPanelRelativeCoordinates.y,\r\n solarPanelRelativeCoordinates.z,\r\n state.actionState.solarPanelOrientation ?? Orientation.landscape,\r\n state.actionState.solarPanelPoleHeight ?? 1,\r\n state.actionState.solarPanelPoleSpacing ?? 3,\r\n state.actionState.solarPanelTiltAngle ?? 0,\r\n state.actionState.solarPanelRelativeAzimuth ?? 0,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.solarPanelFrameColor ?? 'white',\r\n );\r\n model = solarPanel;\r\n state.elements.push(solarPanel);\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n const parabolicTroughParentModel = parent as ElementModel;\r\n const parabolicTroughRelativeCoordinates = Util.relativeCoordinates(\r\n p.x,\r\n p.y,\r\n p.z,\r\n parabolicTroughParentModel,\r\n );\r\n const parabolicTrough = ElementModelFactory.makeParabolicTrough(\r\n parabolicTroughParentModel,\r\n state.actionState.parabolicTroughReflectance,\r\n state.actionState.parabolicTroughAbsorptance,\r\n state.actionState.parabolicTroughOpticalEfficiency,\r\n state.actionState.parabolicTroughThermalEfficiency,\r\n state.actionState.parabolicTroughLatusRectum,\r\n state.actionState.parabolicTroughPoleHeight,\r\n state.actionState.parabolicTroughModuleLength,\r\n parabolicTroughRelativeCoordinates.x,\r\n parabolicTroughRelativeCoordinates.y,\r\n parabolicTroughRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.parabolicTroughWidth,\r\n );\r\n model = parabolicTrough;\r\n state.elements.push(parabolicTrough);\r\n break;\r\n case ObjectType.ParabolicDish:\r\n const parabolicDishParentModel = parent as ElementModel;\r\n const parabolicDishRelativeCoordinates = Util.relativeCoordinates(\r\n p.x,\r\n p.y,\r\n p.z,\r\n parabolicDishParentModel,\r\n );\r\n const parabolicDish = ElementModelFactory.makeParabolicDish(\r\n parabolicDishParentModel,\r\n state.actionState.parabolicDishReflectance,\r\n state.actionState.parabolicDishAbsorptance,\r\n state.actionState.parabolicDishOpticalEfficiency,\r\n state.actionState.parabolicDishThermalEfficiency,\r\n state.actionState.parabolicDishLatusRectum,\r\n state.actionState.parabolicDishPoleHeight,\r\n state.actionState.parabolicDishReceiverStructure,\r\n parabolicDishRelativeCoordinates.x,\r\n parabolicDishRelativeCoordinates.y,\r\n parabolicDishRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.parabolicDishRimDiameter,\r\n state.actionState.parabolicDishRimDiameter,\r\n );\r\n model = parabolicDish;\r\n state.elements.push(parabolicDish);\r\n break;\r\n case ObjectType.FresnelReflector:\r\n const fresnelReflectorParentModel = parent as ElementModel;\r\n const fresnelReflectorRelativeCoordinates = Util.relativeCoordinates(\r\n p.x,\r\n p.y,\r\n p.z,\r\n fresnelReflectorParentModel,\r\n );\r\n const fresnelReflector = ElementModelFactory.makeFresnelReflector(\r\n fresnelReflectorParentModel,\r\n state.actionState.fresnelReflectorReceiver,\r\n state.actionState.fresnelReflectorReflectance,\r\n state.actionState.fresnelReflectorPoleHeight,\r\n state.actionState.fresnelReflectorModuleLength,\r\n fresnelReflectorRelativeCoordinates.x,\r\n fresnelReflectorRelativeCoordinates.y,\r\n fresnelReflectorRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.fresnelReflectorWidth,\r\n );\r\n model = fresnelReflector;\r\n state.elements.push(fresnelReflector);\r\n break;\r\n case ObjectType.Heliostat:\r\n const heliostatParentModel = parent as ElementModel;\r\n const heliostatRelativeCoordinates = Util.relativeCoordinates(p.x, p.y, p.z, heliostatParentModel);\r\n const heliostat = ElementModelFactory.makeHeliostat(\r\n heliostatParentModel,\r\n state.actionState.heliostatTower,\r\n state.actionState.heliostatReflectance,\r\n state.actionState.heliostatPoleHeight,\r\n heliostatRelativeCoordinates.x,\r\n heliostatRelativeCoordinates.y,\r\n heliostatRelativeCoordinates.z,\r\n normal,\r\n 'rotation' in parent ? parent.rotation : undefined,\r\n state.actionState.heliostatLength,\r\n state.actionState.heliostatWidth,\r\n );\r\n model = heliostat;\r\n state.elements.push(heliostat);\r\n break;\r\n case ObjectType.Foundation:\r\n const foundation = ElementModelFactory.makeFoundation(\r\n p.x,\r\n p.y,\r\n state.actionState.foundationHeight,\r\n state.actionState.foundationColor,\r\n state.actionState.foundationTexture,\r\n );\r\n model = foundation;\r\n state.elements.push(foundation);\r\n break;\r\n case ObjectType.Cuboid:\r\n const cuboid = ElementModelFactory.makeCuboid(\r\n p.x,\r\n p.y,\r\n state.actionState.cuboidHeight,\r\n state.actionState.cuboidFaceColors,\r\n state.actionState.cuboidFaceTextures,\r\n );\r\n model = cuboid;\r\n state.elements.push(cuboid);\r\n break;\r\n case ObjectType.Wall:\r\n const wallParentModel = parent as ElementModel;\r\n const relativePos = Util.wallRelativePosition(new Vector3(p.x, p.y), wallParentModel);\r\n const wall = ElementModelFactory.makeWall(\r\n wallParentModel,\r\n relativePos.x,\r\n relativePos.y,\r\n relativePos.z,\r\n normal,\r\n );\r\n state.elements.push(wall);\r\n state.selectedElement = wall;\r\n model = wall;\r\n break;\r\n }\r\n if (model) {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(model.id);\r\n }\r\n });\r\n return model;\r\n },\r\n\r\n elementsToPaste: [],\r\n deletedElements: [],\r\n clearDeletedElements() {\r\n immerSet((state: CommonStoreState) => {\r\n state.deletedElements = [];\r\n });\r\n },\r\n pastePoint: new Vector3(),\r\n pasteNormal: undefined,\r\n copyElementById(id) {\r\n immerSet((state: CommonStoreState) => {\r\n state.elementsToPaste = [];\r\n // make sure that the first element to paste is the current one when it may be a parent\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (e.type === ObjectType.Polygon) {\r\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\r\n const centroid = Util.calculatePolygonCentroid((e as PolygonModel).vertices);\r\n e.cx = centroid.x;\r\n e.cy = centroid.y;\r\n state.elementsToPaste.push(e);\r\n } else if (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Wall) {\r\n const parentWall = state.elements.find(\r\n (el) => el.id === e.parentId && el.type === ObjectType.Wall,\r\n ) as WallModel | undefined;\r\n if (parentWall) {\r\n const copiedWindow = { ...e };\r\n copiedWindow.lx = e.lx * parentWall.lx;\r\n copiedWindow.lz = e.lz * parentWall.lz;\r\n state.elementsToPaste.push(copiedWindow);\r\n }\r\n } else {\r\n state.elementsToPaste.push(e);\r\n }\r\n break;\r\n }\r\n }\r\n for (const e of state.elements) {\r\n if (Util.isChild(id, e.id)) {\r\n if (e.type === ObjectType.Polygon) {\r\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\r\n const centroid = Util.calculatePolygonCentroid((e as PolygonModel).vertices);\r\n e.cx = centroid.x;\r\n e.cy = centroid.y;\r\n }\r\n state.elementsToPaste.push(e);\r\n }\r\n }\r\n });\r\n },\r\n removeSelectedElements() {\r\n const selectedIdSet = get().selectedElementIdSet;\r\n if (selectedIdSet.size === 0) return [];\r\n\r\n const selectedIds = Array.from(selectedIdSet);\r\n const deletedElementSet = new Set();\r\n const deletedElementIdSet = new Set();\r\n for (const e of get().elements) {\r\n if (selectedIdSet.has(e.id)) {\r\n deletedElementSet.add(e);\r\n deletedElementIdSet.add(e.id);\r\n } else {\r\n for (const id of selectedIds) {\r\n if (Util.isChild(id, e.id)) {\r\n deletedElementSet.add(e);\r\n deletedElementIdSet.add(e.id);\r\n }\r\n }\r\n }\r\n }\r\n\r\n immerSet((state) => {\r\n state.autoDeletedRoofs = [];\r\n state.deletedElements = Array.from(deletedElementSet);\r\n state.elements = state.elements.filter((e) => {\r\n if (deletedElementIdSet.has(e.id)) {\r\n switch (e.type) {\r\n case ObjectType.Wall: {\r\n const currentWall = e as WallModel;\r\n let leftWallId = '';\r\n let rightWallId = '';\r\n if (currentWall.leftJoints.length > 0) {\r\n leftWallId = state.getElementById(currentWall.leftJoints[0])?.id ?? '';\r\n }\r\n if (currentWall.rightJoints.length > 0) {\r\n rightWallId = state.getElementById(currentWall.rightJoints[0])?.id ?? '';\r\n }\r\n for (const el of state.elements) {\r\n if (el.id === leftWallId) {\r\n (el as WallModel).rightJoints = [];\r\n } else if (el.id === rightWallId) {\r\n (el as WallModel).leftJoints = [];\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n break;\r\n }\r\n case ObjectType.Roof: {\r\n state.deletedRoofIdSet.add(e.id);\r\n useDataStore.getState().deleteRoofSegmentVertices(e.id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(e.id);\r\n break;\r\n }\r\n }\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n });\r\n\r\n return Array.from(deletedElementSet);\r\n },\r\n removeElementById(id, cut, selectNone = true, autoDeleted) {\r\n const removed = get().elements.filter((e) => e.id === id || Util.isChild(id, e.id));\r\n immerSet((state: CommonStoreState) => {\r\n for (const elem of state.elements) {\r\n if (elem.id === id) {\r\n // the first element must be the parent if there are children needed to be removed as well\r\n if (cut) {\r\n if (elem.type === ObjectType.Polygon) {\r\n // set cx and cy for polygon for pasting (otherwise, they may be unset)\r\n const centroid = Util.calculatePolygonCentroid((elem as PolygonModel).vertices);\r\n elem.cx = centroid.x;\r\n elem.cy = centroid.y;\r\n state.elementsToPaste = [elem];\r\n } else if (\r\n elem.type === ObjectType.Window &&\r\n (elem as WindowModel).parentType === ObjectType.Wall\r\n ) {\r\n const parentWall = state.elements.find(\r\n (el) => el.id === elem.parentId && el.type === ObjectType.Wall,\r\n ) as WallModel | undefined;\r\n if (parentWall) {\r\n const copiedWindow = { ...elem };\r\n copiedWindow.lx = elem.lx * parentWall.lx;\r\n copiedWindow.lz = elem.lz * parentWall.lz;\r\n state.elementsToPaste = [copiedWindow];\r\n }\r\n } else {\r\n state.elementsToPaste = [elem];\r\n }\r\n } else if (!autoDeleted) {\r\n state.deletedElements = [elem];\r\n }\r\n elem.selected = false;\r\n switch (elem.type) {\r\n case ObjectType.Roof: {\r\n const roof = elem as RoofModel;\r\n state.deletedRoofId = elem.id;\r\n state.deletedRoofIdSet.add(elem.id);\r\n useDataStore.getState().deleteRoofSegmentVertices(id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(id);\r\n if (autoDeleted) {\r\n if (state.autoDeletedRoofs) {\r\n state.autoDeletedRoofs.push(roof);\r\n } else {\r\n state.autoDeletedRoofs = [roof];\r\n }\r\n state.autoDeletedRoofIdSet.add(roof.id);\r\n }\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const currentWall = elem as WallModel;\r\n let leftWallId = '';\r\n let rightWallId = '';\r\n if (currentWall.leftJoints.length > 0) {\r\n leftWallId = state.getElementById(currentWall.leftJoints[0])?.id ?? '';\r\n }\r\n if (currentWall.rightJoints.length > 0) {\r\n rightWallId = state.getElementById(currentWall.rightJoints[0])?.id ?? '';\r\n }\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId) {\r\n (e as WallModel).rightJoints = [];\r\n } else if (e.id === rightWallId) {\r\n (e as WallModel).leftJoints = [];\r\n }\r\n }\r\n state.elements = state.elements.filter(\r\n (e) => !(e.type === ObjectType.Roof && (e as RoofModel).wallsId.length === 0),\r\n );\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.deletedWallId = elem.id;\r\n break;\r\n }\r\n case ObjectType.Foundation: {\r\n state.deletedFoundationId = elem.id;\r\n break;\r\n }\r\n case ObjectType.Cuboid: {\r\n state.deletedCuboidId = elem.id;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (autoDeleted) {\r\n for (const child of state.elements) {\r\n if (Util.isChild(id, child.id)) {\r\n if (state.autoDeletedChild) {\r\n state.autoDeletedChild.push(child);\r\n } else {\r\n state.autoDeletedChild = [child];\r\n }\r\n }\r\n }\r\n } else {\r\n if (cut) {\r\n for (const child of state.elements) {\r\n if (Util.isChild(id, child.id)) {\r\n state.elementsToPaste.push(child);\r\n }\r\n }\r\n } else {\r\n for (const child of state.elements) {\r\n if (Util.isChild(id, child.id)) {\r\n state.deletedElements.push(child);\r\n }\r\n }\r\n }\r\n }\r\n state.elements = state.elements.filter((e) => {\r\n if (e.id === id || e.parentId === id || e.foundationId === id || Util.isChild(id, e.id)) {\r\n if (e.type === ObjectType.Roof) {\r\n useDataStore.getState().deleteRoofSegmentVertices(id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(id);\r\n }\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n state.selectedElementIdSet.delete(id);\r\n if (selectNone) {\r\n state.selectedElement = null;\r\n state.selectedElementIdSet.clear();\r\n }\r\n });\r\n return removed;\r\n },\r\n removeElementsByType(type) {\r\n immerSet((state: CommonStoreState) => {\r\n if (type === ObjectType.Foundation) {\r\n state.elements = state.elements.filter((x) => {\r\n if (x.locked || (x.type !== ObjectType.Foundation && !x.foundationId)) {\r\n return true;\r\n } else {\r\n if (x.type === ObjectType.Roof) {\r\n useDataStore.getState().deleteRoofSegmentVertices(x.id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(x.id);\r\n }\r\n return false;\r\n }\r\n });\r\n } else {\r\n state.elements = state.elements.filter((x) => {\r\n if (x.locked || x.type !== type) {\r\n return true;\r\n } else {\r\n if (x.type === ObjectType.Roof) {\r\n useDataStore.getState().deleteRoofSegmentVertices(x.id);\r\n useDataStore.getState().deleteRoofSegmentVerticesWithoutOverhang(x.id);\r\n }\r\n return false;\r\n }\r\n });\r\n }\r\n });\r\n },\r\n countElementsByType(type, excludeLocked) {\r\n let count = 0;\r\n if (excludeLocked) {\r\n for (const e of get().elements) {\r\n if (e.type === type && !e.locked) {\r\n count++;\r\n }\r\n }\r\n } else {\r\n for (const e of get().elements) {\r\n if (e.type === type) {\r\n count++;\r\n }\r\n }\r\n }\r\n return count;\r\n },\r\n countSolarStructuresByType(type, excludeLocked) {\r\n let count = 0;\r\n if (excludeLocked) {\r\n for (const e of get().elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n if ((e as FoundationModel).solarStructure === type) {\r\n count++;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of get().elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n if ((e as FoundationModel).solarStructure === type) {\r\n count++;\r\n }\r\n }\r\n }\r\n }\r\n return count;\r\n },\r\n countObservers() {\r\n let count = 0;\r\n for (const e of get().elements) {\r\n if (e.type === ObjectType.Human && (e as HumanModel).observer) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n },\r\n removeElementsByReferenceId(id, cache) {\r\n immerSet((state: CommonStoreState) => {\r\n if (cache) {\r\n state.deletedElements = [];\r\n for (const e of state.elements) {\r\n if (e.referenceId === id) {\r\n state.deletedElements.push(e);\r\n }\r\n }\r\n }\r\n state.elements = state.elements.filter((e) => {\r\n return e.referenceId !== id;\r\n });\r\n });\r\n },\r\n countElementsByReferenceId(id) {\r\n let count = 0;\r\n for (const e of get().elements) {\r\n if (e.referenceId === id) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n },\r\n\r\n getChildren(id) {\r\n const children: ElementModel[] = [];\r\n for (const e of get().elements) {\r\n if (e.parentId === id) {\r\n children.push(e);\r\n }\r\n }\r\n return children;\r\n },\r\n getChildrenOfType(type: ObjectType, id) {\r\n const children: ElementModel[] = [];\r\n for (const e of get().elements) {\r\n if (e.type === type && e.parentId === id) {\r\n children.push(e);\r\n }\r\n }\r\n return children;\r\n },\r\n removeAllChildElementsByType(parentId, type) {\r\n immerSet((state: CommonStoreState) => {\r\n state.elements = state.elements.filter((x) => x.locked || x.type !== type || x.parentId !== parentId);\r\n if (type === ObjectType.Wall) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n },\r\n removeAllElementsOnFoundationByType(foundationId, type) {\r\n immerSet((state: CommonStoreState) => {\r\n state.elements = state.elements.filter(\r\n (x) => x.locked || x.type !== type || x.foundationId !== foundationId,\r\n );\r\n if (type === ObjectType.Wall) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n },\r\n countAllElements(excludeLocked) {\r\n let count = 0;\r\n if (excludeLocked) {\r\n for (const e of get().elements) {\r\n if (!e.locked) {\r\n count++;\r\n }\r\n }\r\n } else {\r\n count = get().elements.length;\r\n }\r\n return count;\r\n },\r\n countAllElementsByType(excludeLocked) {\r\n const counter = new ElementCounter();\r\n for (const e of get().elements) {\r\n if (excludeLocked && e.locked) continue;\r\n switch (e.type) {\r\n case ObjectType.Foundation:\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n counter.solarUpdraftTowerCount++;\r\n }\r\n counter.foundationCount++;\r\n break;\r\n case ObjectType.Cuboid:\r\n counter.cuboidCount++;\r\n break;\r\n case ObjectType.Wall:\r\n counter.wallCount++;\r\n break;\r\n case ObjectType.Window:\r\n counter.windowCount++;\r\n break;\r\n case ObjectType.Door:\r\n counter.doorCount++;\r\n break;\r\n case ObjectType.Human:\r\n counter.humanCount++;\r\n break;\r\n case ObjectType.Tree:\r\n counter.treeCount++;\r\n break;\r\n case ObjectType.Flower:\r\n counter.flowerCount++;\r\n break;\r\n case ObjectType.Polygon:\r\n counter.polygonCount++;\r\n break;\r\n case ObjectType.Sensor:\r\n counter.sensorCount++;\r\n break;\r\n case ObjectType.Light:\r\n if ((e as LightModel).inside) {\r\n counter.insideLightCount++;\r\n } else {\r\n counter.outsideLightCount++;\r\n }\r\n break;\r\n case ObjectType.SolarPanel:\r\n counter.solarPanelCount++;\r\n const sp = e as SolarPanelModel;\r\n const pvModel = get().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n counter.solarPanelModuleCount += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n break;\r\n case ObjectType.ParabolicDish:\r\n counter.parabolicDishCount++;\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n counter.parabolicTroughCount++;\r\n break;\r\n case ObjectType.FresnelReflector:\r\n counter.fresnelReflectorCount++;\r\n break;\r\n case ObjectType.Heliostat:\r\n counter.heliostatCount++;\r\n break;\r\n case ObjectType.WindTurbine:\r\n counter.windTurbineCount++;\r\n break;\r\n }\r\n }\r\n return counter;\r\n },\r\n countAllOffspringsByTypeAtOnce(ancestorId, includingLocked) {\r\n const counter = new ElementCounter();\r\n for (const e of get().elements) {\r\n // foundationId applies to both foundations and cuboids, should have been named ancestorId\r\n const idOk = e.parentId === ancestorId || e.foundationId === ancestorId;\r\n if (includingLocked ? idOk : !e.locked && idOk) {\r\n switch (e.type) {\r\n case ObjectType.Foundation:\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n counter.solarUpdraftTowerCount++;\r\n }\r\n counter.foundationCount++;\r\n break;\r\n case ObjectType.Cuboid:\r\n counter.cuboidCount++;\r\n break;\r\n case ObjectType.Wall:\r\n counter.wallCount++;\r\n break;\r\n case ObjectType.Window:\r\n counter.windowCount++;\r\n break;\r\n case ObjectType.Door:\r\n counter.doorCount++;\r\n break;\r\n case ObjectType.Human:\r\n counter.humanCount++;\r\n break;\r\n case ObjectType.Tree:\r\n counter.treeCount++;\r\n break;\r\n case ObjectType.Flower:\r\n counter.flowerCount++;\r\n break;\r\n case ObjectType.Polygon:\r\n counter.polygonCount++;\r\n break;\r\n case ObjectType.Sensor:\r\n counter.sensorCount++;\r\n break;\r\n case ObjectType.Light:\r\n if ((e as LightModel).inside) {\r\n counter.insideLightCount++;\r\n } else {\r\n counter.outsideLightCount++;\r\n }\r\n break;\r\n case ObjectType.SolarPanel:\r\n counter.solarPanelCount++;\r\n const sp = e as SolarPanelModel;\r\n const pvModel = get().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n counter.solarPanelModuleCount += Util.countSolarPanelsOnRack(sp, pvModel);\r\n }\r\n break;\r\n case ObjectType.ParabolicDish:\r\n counter.parabolicDishCount++;\r\n break;\r\n case ObjectType.ParabolicTrough:\r\n counter.parabolicTroughCount++;\r\n break;\r\n case ObjectType.FresnelReflector:\r\n counter.fresnelReflectorCount++;\r\n break;\r\n case ObjectType.Heliostat:\r\n counter.heliostatCount++;\r\n break;\r\n case ObjectType.WindTurbine:\r\n counter.windTurbineCount++;\r\n break;\r\n }\r\n }\r\n }\r\n return counter;\r\n },\r\n countSolarPanelsOnRack(id) {\r\n let count = 0;\r\n for (const e of get().elements) {\r\n if (e.id === id && e.type === ObjectType.SolarPanel) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = get().getPvModule(sp.pvModelName);\r\n if (pvModel) {\r\n count = Util.countSolarPanelsOnRack(sp, pvModel);\r\n break;\r\n }\r\n }\r\n }\r\n return count;\r\n },\r\n\r\n // must copy the elements because they may be pasted multiple times.\r\n // so we must treat them as newly added elements each time.\r\n // note that the case of deletion is treated differently because the deleted elements cannot be pasted.\r\n copyCutElements() {\r\n const copiedElements: ElementModel[] = [];\r\n const map = new Map(); // oldId => newElement\r\n const elementsMapOldToNew = new Map();\r\n const elementsMapNewToOld = new Map();\r\n for (let i = 0; i < get().elementsToPaste.length; i++) {\r\n const oldElem = get().elementsToPaste[i];\r\n let newElem: ElementModel | null = null;\r\n if (i === 0) {\r\n // the first element is the parent\r\n if (get().getElementById(oldElem.id)) {\r\n // make a clone with a new ID if the old ID is in the elements\r\n newElem = ElementModelCloner.clone(\r\n get().getParent(oldElem),\r\n oldElem,\r\n oldElem.cx,\r\n oldElem.cy,\r\n oldElem.cz,\r\n );\r\n } else {\r\n // preserve the ID if it is not in the elements\r\n newElem = JSON.parse(JSON.stringify(oldElem));\r\n }\r\n if (newElem?.type === ObjectType.Wall) {\r\n const w = newElem as WallModel;\r\n w.roofId = undefined;\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n w.centerLeftRoofHeight = undefined;\r\n w.centerRightRoofHeight = undefined;\r\n w.centerRoofHeight = undefined;\r\n }\r\n } else {\r\n const oldParent = get().elementsToPaste.find((el) => el.id === oldElem.parentId);\r\n if (oldParent) {\r\n const newParent = map.get(oldParent.id);\r\n if (newParent) {\r\n if (get().getElementById(oldElem.id)) {\r\n // make a clone with a new ID if the old ID is in the elements\r\n newElem = ElementModelCloner.clone(\r\n newParent,\r\n oldElem,\r\n oldElem.cx,\r\n oldElem.cy,\r\n oldElem.cz,\r\n oldElem.type === ObjectType.Polygon,\r\n );\r\n if (\r\n newElem?.type === ObjectType.Window &&\r\n (newElem as WindowModel).parentType === ObjectType.Wall\r\n ) {\r\n newElem.lx *= newParent.lx;\r\n newElem.lz *= newParent.lz;\r\n }\r\n } else {\r\n // preserve the ID if it is not in the elements\r\n newElem = JSON.parse(JSON.stringify(oldElem));\r\n }\r\n }\r\n }\r\n }\r\n if (newElem) {\r\n map.set(oldElem.id, newElem);\r\n elementsMapOldToNew.set(oldElem.id, newElem.id);\r\n elementsMapNewToOld.set(newElem.id, oldElem.id);\r\n copiedElements.push(newElem);\r\n }\r\n }\r\n for (const e of copiedElements) {\r\n // search new roof\r\n if (e.type === ObjectType.Roof) {\r\n const oldRoofId = elementsMapNewToOld.get(e.id);\r\n if (oldRoofId) {\r\n for (const o of get().elementsToPaste) {\r\n if (o.id === oldRoofId) {\r\n (e as RoofModel).wallsId = (o as RoofModel).wallsId.map(\r\n (v) => elementsMapOldToNew.get(v) as string,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n // search new wall\r\n if (e.type === ObjectType.Wall) {\r\n const oldWallId = elementsMapNewToOld.get(e.id);\r\n if (oldWallId) {\r\n for (const o of get().elementsToPaste) {\r\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\r\n const w = o as WallModel;\r\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\r\n if (left) {\r\n (e as WallModel).leftJoints = [left];\r\n }\r\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\r\n if (right) {\r\n (e as WallModel).rightJoints = [right];\r\n }\r\n if (w.roofId) {\r\n const roofId = elementsMapOldToNew.get(w.roofId as string);\r\n if (roofId) {\r\n (e as WallModel).roofId = roofId;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return copiedElements;\r\n },\r\n\r\n pasteElementsToPoint() {\r\n const pastedElements: ElementModel[] = [];\r\n immerSet((state: CommonStoreState) => {\r\n if (state.elementsToPaste.length === 1) {\r\n // only the parent element is included in elementsToPaste when copied,\r\n // so we have to copy its children and grandchildren from existing elements\r\n let m = state.pastePoint;\r\n const elemToPaste = state.elementsToPaste[0];\r\n let newParent = state.selectedElement;\r\n const oldParent = state.getParent(elemToPaste);\r\n if (newParent) {\r\n if (newParent.type === ObjectType.Polygon) {\r\n // paste action of polygon is passed to its parent\r\n const q = state.getParent(newParent);\r\n if (q) {\r\n newParent = q;\r\n elemToPaste.parentId = newParent.id;\r\n if (Util.isPositionRelative(elemToPaste.type)) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n }\r\n }\r\n } else if (newParent.type === ObjectType.Roof) {\r\n if (newParent.parentId) {\r\n const foundation = state.getElementById(newParent.parentId);\r\n if (foundation) {\r\n m.sub(new Vector3(foundation.cx, foundation.cy, foundation.lz)).applyEuler(\r\n new Euler(0, 0, -foundation.rotation[2]),\r\n );\r\n if (elemToPaste.type !== ObjectType.Window) {\r\n m.setX(m.x / foundation.lx);\r\n m.setY(m.y / foundation.ly);\r\n }\r\n }\r\n }\r\n } else if (newParent.type === ObjectType.Cuboid) {\r\n if (elemToPaste.type === ObjectType.Cuboid) {\r\n const { pos } = Util.getWorldDataById(newParent.id);\r\n m.sub(pos);\r\n } else if (Util.isPositionRelative(elemToPaste.type)) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n }\r\n elemToPaste.parentId = newParent.id;\r\n } else if (newParent.type === ObjectType.Wall) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n } else {\r\n // if the old parent is ground, it has no type definition, but we use it to check its type\r\n if (oldParent && oldParent.type) {\r\n if (elemToPaste.type !== ObjectType.Foundation) {\r\n elemToPaste.parentId = newParent.id;\r\n if (Util.isPositionRelative(elemToPaste.type)) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n }\r\n }\r\n }\r\n }\r\n if (elemToPaste.type === ObjectType.Wall) {\r\n m.set(m.x * newParent.lx, m.y * newParent.ly, 0);\r\n }\r\n }\r\n const e = ElementModelCloner.clone(\r\n newParent,\r\n elemToPaste,\r\n m.x,\r\n m.y,\r\n m.z,\r\n false,\r\n state.pasteNormal,\r\n oldParent,\r\n );\r\n if (e) {\r\n if (state.pasteNormal) {\r\n e.normal = state.pasteNormal.toArray();\r\n }\r\n const lang = { lng: state.language };\r\n let approved = false;\r\n switch (e.type) {\r\n case ObjectType.Cuboid: {\r\n const getAllChildren = (el: ElementModel) => {\r\n const res: ElementModel[] = [];\r\n for (const e of get().elements) {\r\n if (e.parentId === el.id) {\r\n res.push(e);\r\n switch (e.type) {\r\n case ObjectType.Cuboid:\r\n case ObjectType.Foundation:\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n res.push(...getAllChildren(e));\r\n }\r\n }\r\n }\r\n return res;\r\n };\r\n const child = getAllChildren(elemToPaste);\r\n const elementMap = new Map(); // oldId -> newModel\r\n pastedElements.push(e);\r\n elementMap.set(elemToPaste.id, e);\r\n\r\n for (const c of child) {\r\n const parent = elementMap.get(c.parentId);\r\n if (parent) {\r\n const newChild = ElementModelCloner.clone(\r\n parent,\r\n c,\r\n c.cx,\r\n c.cy,\r\n c.cz,\r\n c.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...c.normal];\r\n }\r\n pastedElements.push(newChild);\r\n elementMap.set(c.id, newChild);\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.elementsToPaste = [e];\r\n approved = false;\r\n\r\n break;\r\n }\r\n case ObjectType.Foundation: {\r\n const elementsMapNewToOld = new Map();\r\n const elementsMapOldToNew = new Map();\r\n for (const child of state.elements) {\r\n if (child.parentId === elemToPaste.id) {\r\n const newChild = ElementModelCloner.clone(\r\n e,\r\n child,\r\n child.cx,\r\n child.cy,\r\n child.cz,\r\n child.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...child.normal];\r\n }\r\n pastedElements.push(newChild);\r\n if (newChild?.type === ObjectType.Wall || newChild?.type === ObjectType.Roof) {\r\n elementsMapNewToOld.set(newChild.id, child.id);\r\n elementsMapOldToNew.set(child.id, newChild.id);\r\n for (const grandChild of state.elements) {\r\n if (grandChild.parentId === child.id) {\r\n const newGrandChild = ElementModelCloner.clone(\r\n newChild,\r\n grandChild,\r\n grandChild.cx,\r\n grandChild.cy,\r\n grandChild.cz,\r\n );\r\n if (newGrandChild) {\r\n if (child.normal) {\r\n newGrandChild.normal = [...grandChild.normal];\r\n }\r\n pastedElements.push(newGrandChild);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n approved = true;\r\n for (const e of state.elements) {\r\n // search new roof\r\n if (e.type === ObjectType.Roof) {\r\n const oldRoofId = elementsMapNewToOld.get(e.id);\r\n if (oldRoofId) {\r\n const oldRoof = get().getElementById(oldRoofId) as RoofModel;\r\n if (oldRoof) {\r\n (e as RoofModel).wallsId = oldRoof.wallsId.map(\r\n (v) => elementsMapOldToNew.get(v) as string,\r\n );\r\n }\r\n }\r\n }\r\n // search new wall\r\n if (e.type === ObjectType.Wall) {\r\n const oldWallId = elementsMapNewToOld.get(e.id);\r\n if (oldWallId) {\r\n for (const o of state.elements) {\r\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\r\n const w = o as WallModel;\r\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\r\n if (left) {\r\n (e as WallModel).leftJoints = [left];\r\n }\r\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\r\n if (right) {\r\n (e as WallModel).rightJoints = [right];\r\n }\r\n if (w.roofId) {\r\n const roofId = elementsMapOldToNew.get(w.roofId as string);\r\n if (roofId) {\r\n (e as WallModel).roofId = roofId;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.Heliostat:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.ParabolicTrough: {\r\n if (newParent?.type === ObjectType.Wall) {\r\n if (newParent) {\r\n switch (Util.checkElementOnWallState(e, newParent)) {\r\n case ElementState.Valid:\r\n const angle = (newParent as WallModel).relativeAngle - HALF_PI;\r\n e.normal = [Math.cos(angle), Math.sin(angle), 0];\r\n approved = true;\r\n break;\r\n case ElementState.OverLap:\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n break;\r\n case ElementState.OutsideBoundary:\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n if (newParent && newParent.type === ObjectType.Roof) {\r\n if (e.foundationId) {\r\n const foundation = state.getElementById(e.foundationId);\r\n if (foundation) {\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\r\n e as SolarPanelModel,\r\n foundation,\r\n );\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(newParent as RoofModel);\r\n\r\n if (!RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices)) {\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n break;\r\n }\r\n if (\r\n !RoofUtil.rooftopSPCollisionCheck(e as SolarPanelModel, foundation, solarPanelVertices)\r\n ) {\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n break;\r\n }\r\n approved = true;\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n }\r\n break;\r\n }\r\n if (state.overlapWithSibling(e)) {\r\n // overlap, do not approve\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n } else {\r\n if (newParent) {\r\n if (\r\n newParent.type === ObjectType.Foundation ||\r\n (newParent.type === ObjectType.Cuboid &&\r\n Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY))\r\n ) {\r\n approved = Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, newParent);\r\n if (!approved) {\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n }\r\n } else {\r\n // TODO: other surfaces\r\n approved = true;\r\n }\r\n } else {\r\n approved = true;\r\n }\r\n }\r\n break;\r\n }\r\n case ObjectType.Wall: {\r\n const center = new Vector3(e.cx, e.cy, 0);\r\n const vrx = new Vector3(e.lx / 2, 0, 0);\r\n const vlx = new Vector3(-e.lx / 2, 0, 0);\r\n const w = e as WallModel;\r\n const euler = new Euler(0, 0, w.relativeAngle);\r\n w.leftPoint = center.clone().add(vlx.applyEuler(euler)).toArray();\r\n w.rightPoint = center.clone().add(vrx.applyEuler(euler)).toArray();\r\n w.roofId = undefined;\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n w.centerLeftRoofHeight = undefined;\r\n w.centerRightRoofHeight = undefined;\r\n w.centerRoofHeight = undefined;\r\n for (const child of state.elements) {\r\n if (child.parentId === elemToPaste.id) {\r\n const newChild = ElementModelCloner.clone(\r\n e,\r\n child,\r\n child.cx,\r\n child.cy,\r\n child.cz,\r\n child.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...child.normal];\r\n }\r\n pastedElements.push(newChild);\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n approved = true;\r\n break;\r\n }\r\n case ObjectType.Door:\r\n case ObjectType.Window: {\r\n if (newParent?.type === ObjectType.Wall) {\r\n switch (Util.checkElementOnWallState(e, newParent)) {\r\n case ElementState.Valid:\r\n approved = true;\r\n break;\r\n case ElementState.OverLap:\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n break;\r\n case ElementState.OutsideBoundary:\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n break;\r\n }\r\n } else if (newParent?.type === ObjectType.Roof) {\r\n const rotation = RoofUtil.getRotationOnRoof(newParent.id, m);\r\n if (rotation) {\r\n e.rotation = [...rotation];\r\n }\r\n const windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n const boundaryVertices = RoofUtil.getRoofSegmentBoundary(newParent.id, m);\r\n if (!boundaryVertices) break;\r\n if (!RoofUtil.rooftopElementBoundaryCheck(windowVertices, boundaryVertices)) {\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n break;\r\n }\r\n if (!RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, newParent.id)) {\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n break;\r\n }\r\n approved = true;\r\n }\r\n break;\r\n }\r\n default: {\r\n approved = true;\r\n if (Util.isPlantOrHuman(e)) {\r\n if (newParent) {\r\n // paste on a parent\r\n const parent = state.getParent(e);\r\n if (parent) {\r\n const p = Util.relativePoint(state.pastePoint, parent);\r\n e.cx = p.x;\r\n e.cy = p.y;\r\n e.cz = p.z;\r\n }\r\n } else {\r\n // paste on the ground\r\n e.parentId = GROUND_ID;\r\n }\r\n }\r\n }\r\n }\r\n if (approved) {\r\n state.elements.push(e);\r\n pastedElements.push(e);\r\n }\r\n }\r\n } else if (state.elementsToPaste.length > 1) {\r\n // when a parent with children is cut, the removed children are no longer in elements array,\r\n // so we have to restore them from elementsToPaste.\r\n let m = state.pastePoint;\r\n const cutElements = state.copyCutElements();\r\n if (cutElements.length > 0) {\r\n if (cutElements[0].type === ObjectType.Cuboid) {\r\n const newParent = state.selectedElement;\r\n if (newParent && newParent.type === ObjectType.Cuboid) {\r\n const { pos } = Util.getWorldDataById(newParent.id);\r\n m.sub(pos);\r\n cutElements[0].parentId = newParent.id;\r\n }\r\n } else if (cutElements[0].type === ObjectType.Wall) {\r\n const newParent = state.selectedElement;\r\n if (newParent && newParent.type === ObjectType.Foundation) {\r\n m = Util.relativeCoordinates(m.x, m.y, m.z, newParent);\r\n m.set(m.x * newParent.lx, m.y * newParent.ly, 0);\r\n cutElements[0].parentId = newParent.id;\r\n cutElements[0].foundationId = newParent.id;\r\n }\r\n }\r\n cutElements[0].cx = m.x;\r\n cutElements[0].cy = m.y;\r\n cutElements[0].cz = m.z;\r\n if (cutElements[0].type === ObjectType.Foundation) {\r\n cutElements[0].cz += cutElements[0].lz / 2;\r\n } else if (cutElements[0].type === ObjectType.Cuboid) {\r\n cutElements[0].cz = cutElements[0].lz / 2;\r\n }\r\n state.elements.push(...cutElements);\r\n pastedElements.push(...cutElements);\r\n }\r\n }\r\n if (pastedElements.length > 0) {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(pastedElements[0].id);\r\n state.selectedElement = pastedElements[0];\r\n }\r\n });\r\n return pastedElements;\r\n },\r\n\r\n pasteElementsByKey() {\r\n const pastedElements: ElementModel[] = [];\r\n immerSet((state: CommonStoreState) => {\r\n if (state.elementsToPaste.length > 0) {\r\n const elem = state.elementsToPaste[0];\r\n const parent = state.getParent(elem);\r\n const e = ElementModelCloner.clone(parent, elem, elem.cx, elem.cy, elem.cz);\r\n if (e) {\r\n let approved = false;\r\n switch (e.type) {\r\n case ObjectType.Door:\r\n case ObjectType.Window:\r\n if (parent) {\r\n const hx = e.lx / 2;\r\n e.cx += hx * 3;\r\n // searching +x direction\r\n if (parent.type === ObjectType.Wall) {\r\n while (e.cx + hx < 0.5) {\r\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\r\n state.elements.push(e);\r\n // state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx += hx;\r\n }\r\n }\r\n } else if (parent.type === ObjectType.Roof) {\r\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\r\n if (rot) {\r\n e.rotation = [...rot];\r\n }\r\n let windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n let segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\r\n const roofVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\r\n while (RoofUtil.rooftopElementBoundaryCheck(windowVertices, roofVertices)) {\r\n if (\r\n segmentVertices &&\r\n RoofUtil.rooftopElementBoundaryCheck(windowVertices, segmentVertices) &&\r\n RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, parent.id)\r\n ) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx += hx / 2;\r\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\r\n if (rot) {\r\n e.rotation = [...rot];\r\n }\r\n windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\r\n }\r\n }\r\n }\r\n\r\n // searching -x direction\r\n if (!approved) {\r\n e.cx = elem.cx - hx * 3;\r\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\r\n if (rot) {\r\n e.rotation = [...rot];\r\n }\r\n if (parent.type === ObjectType.Wall) {\r\n while (e.cx - hx > -0.5) {\r\n if (parent.type === ObjectType.Wall) {\r\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\r\n state.elements.push(e);\r\n // state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx -= hx;\r\n }\r\n }\r\n }\r\n } else if (parent.type === ObjectType.Roof) {\r\n let windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n let segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\r\n const roofVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\r\n while (RoofUtil.rooftopElementBoundaryCheck(windowVertices, roofVertices)) {\r\n if (\r\n segmentVertices &&\r\n RoofUtil.rooftopElementBoundaryCheck(windowVertices, segmentVertices) &&\r\n RoofUtil.rooftopWindowCollisionCheck(e.id, windowVertices, parent.id)\r\n ) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx -= hx;\r\n const rot = RoofUtil.getRotationOnRoof(parent.id, new Vector3(e.cx, e.cy));\r\n if (rot) {\r\n e.rotation = [...rot];\r\n }\r\n windowVertices = RoofUtil.getWindowVerticesOnRoof(e as WindowModel);\r\n segmentVertices = RoofUtil.getRoofSegmentBoundary(parent.id, new Vector3(e.cx, e.cy));\r\n }\r\n }\r\n }\r\n }\r\n if (!approved) {\r\n const lang = { lng: state.language };\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n }\r\n if (parent.type === ObjectType.Roof && approved) {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n }\r\n break;\r\n case ObjectType.Human:\r\n e.cx += 1;\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n e.cx += e.lx;\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n if (e.parentId) {\r\n const parent = state.getParent(e);\r\n if (parent) {\r\n if (parent.type === ObjectType.Wall) {\r\n const hx = e.lx / parent.lx / 2;\r\n e.cx += hx * 3;\r\n // searching +x direction\r\n while (e.cx + hx < 0.5) {\r\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx += hx;\r\n }\r\n }\r\n // searching -x direction\r\n if (!approved) {\r\n e.cx = elem.cx - hx * 3;\r\n while (e.cx - hx > -0.5) {\r\n if (Util.checkElementOnWallState(e, parent) === ElementState.Valid) {\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx -= hx;\r\n }\r\n }\r\n }\r\n if (!approved) {\r\n const lang = { lng: state.language };\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n } else {\r\n }\r\n break;\r\n } else if (parent.type === ObjectType.Roof) {\r\n if (elem.foundationId) {\r\n const foundation = state.getElementById(elem.foundationId);\r\n if (foundation) {\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(parent as RoofModel);\r\n\r\n const hx = e.lx / foundation.lx / 2;\r\n e.cx += hx * 1.25;\r\n\r\n while (e.cx + hx < 0.5) {\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\r\n e as SolarPanelModel,\r\n foundation,\r\n );\r\n if (\r\n RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices) &&\r\n RoofUtil.rooftopSPCollisionCheck(\r\n e as SolarPanelModel,\r\n foundation,\r\n solarPanelVertices,\r\n )\r\n ) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx += hx * 1.25;\r\n }\r\n }\r\n if (!approved) {\r\n e.cx = elem.cx - hx * 1.25;\r\n while (e.cx - hx > -0.5) {\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(\r\n e as SolarPanelModel,\r\n foundation,\r\n );\r\n if (\r\n RoofUtil.rooftopElementBoundaryCheck(solarPanelVertices, boundaryVertices) &&\r\n RoofUtil.rooftopSPCollisionCheck(\r\n e as SolarPanelModel,\r\n foundation,\r\n solarPanelVertices,\r\n )\r\n ) {\r\n state.elements.push(e);\r\n approved = true;\r\n break;\r\n } else {\r\n e.cx -= hx * 1.25;\r\n }\r\n }\r\n }\r\n if (!approved) {\r\n const lang = { lng: state.language };\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n } else {\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n const nearestNeighborId = state.findNearestSibling(elem.id);\r\n if (nearestNeighborId) {\r\n const nearestNeighbor = state.getElementById(nearestNeighborId);\r\n if (nearestNeighbor) {\r\n const oldX = e.cx;\r\n const oldY = e.cy;\r\n const oldZ = e.cz;\r\n const dx = nearestNeighbor.cx - elem.cx;\r\n const dy = nearestNeighbor.cy - elem.cy;\r\n const dz = nearestNeighbor.cz - elem.cz;\r\n e.cx = nearestNeighbor.cx + dx;\r\n e.cy = nearestNeighbor.cy + dy;\r\n e.cz = nearestNeighbor.cz + dz;\r\n if (state.overlapWithSibling(e)) {\r\n // try the opposite direction first before giving up\r\n e.cx = elem.cx - dx;\r\n e.cy = elem.cy - dy;\r\n e.cz = elem.cz - dz;\r\n if (state.overlapWithSibling(e)) {\r\n // we may need to hop twice in the opposite direction\r\n e.cx = elem.cx - 2 * dx;\r\n e.cy = elem.cy - 2 * dy;\r\n e.cz = elem.cz - 2 * dz;\r\n if (state.overlapWithSibling(e)) {\r\n e.cx = oldX - dx;\r\n e.cy = oldY - dy;\r\n e.cz = oldZ - dz;\r\n }\r\n }\r\n }\r\n } else {\r\n e.cx += e.lx / parent.lx;\r\n }\r\n } else {\r\n // a loner\r\n e.cx += e.lx / parent.lx;\r\n }\r\n const lang = { lng: state.language };\r\n if (!state.overlapWithSibling(e)) {\r\n if (\r\n parent.type === ObjectType.Foundation ||\r\n (parent.type === ObjectType.Cuboid && Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY))\r\n ) {\r\n if (Util.isSolarCollectorWithinHorizontalSurface(e as SolarCollector, parent)) {\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n } else {\r\n showError(i18n.t('message.CannotPasteOutsideBoundary', lang));\r\n }\r\n } else {\r\n // TODO: For other surfaces, handle out-of-bounds errors here\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n }\r\n } else {\r\n showError(i18n.t('message.CannotPasteBecauseOfOverlap', lang));\r\n }\r\n }\r\n }\r\n break;\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n if (e.parentId) {\r\n const parent = state.getParent(e);\r\n if (parent) {\r\n e.cx += e.lx / parent.lx;\r\n }\r\n if (e.cx < 0.5) {\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n approved = true;\r\n }\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = e as PolygonModel;\r\n for (const v of polygon.vertices) {\r\n v.x += 0.1;\r\n }\r\n polygon.cx += 0.1;\r\n state.elements.push(polygon);\r\n state.elementsToPaste = [polygon];\r\n approved = true;\r\n break;\r\n case ObjectType.Cuboid:\r\n e.cx += e.lx;\r\n if (state.elementsToPaste.length === 1) {\r\n const getAllChildren = (el: ElementModel) => {\r\n const res: ElementModel[] = [];\r\n for (const e of get().elements) {\r\n if (e.parentId === el.id) {\r\n res.push(e);\r\n switch (e.type) {\r\n case ObjectType.Cuboid:\r\n case ObjectType.Foundation:\r\n case ObjectType.Wall:\r\n case ObjectType.Roof:\r\n res.push(...getAllChildren(e));\r\n }\r\n }\r\n }\r\n return res;\r\n };\r\n const child = getAllChildren(elem);\r\n const elementMap = new Map(); // oldId -> newModel\r\n pastedElements.push(e);\r\n elementMap.set(elem.id, e);\r\n\r\n for (const c of child) {\r\n const parent = elementMap.get(c.parentId);\r\n if (parent) {\r\n const newChild = ElementModelCloner.clone(\r\n parent,\r\n c,\r\n c.cx,\r\n c.cy,\r\n c.cz,\r\n c.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...c.normal];\r\n }\r\n pastedElements.push(newChild);\r\n elementMap.set(c.id, newChild);\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.elementsToPaste = [e];\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(e.id);\r\n state.selectedElement = e;\r\n } else if (state.elementsToPaste.length > 1) {\r\n const cutElements = state.copyCutElements();\r\n if (cutElements.length > 0) {\r\n cutElements[0].cx += cutElements[0].lx;\r\n state.elements.push(...cutElements);\r\n state.elementsToPaste = [...cutElements];\r\n pastedElements.push(...cutElements);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(cutElements[0].id);\r\n state.selectedElement = cutElements[0];\r\n }\r\n }\r\n approved = false;\r\n break;\r\n case ObjectType.Foundation:\r\n e.cx += e.lx;\r\n if (state.elementsToPaste.length === 1) {\r\n // When copying from an existing container, elementsToPaste stores only the container.\r\n // So we have to copy its children and grandchildren as well. This differs from the\r\n // situation of cutting, in which case all the children and grandchildren must be\r\n // stored in elementsToPaste.\r\n const elementsMapNewToOld = new Map();\r\n const elementsMapOldToNew = new Map();\r\n for (const child of state.elements) {\r\n // technically, parentId must not be the same as ID, but just to be sure...\r\n if (child.parentId === elem.id && child.parentId !== child.id) {\r\n const newChild = ElementModelCloner.clone(\r\n e,\r\n child,\r\n child.cx,\r\n child.cy,\r\n child.cz,\r\n child.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...child.normal];\r\n }\r\n pastedElements.push(newChild);\r\n if (newChild?.type === ObjectType.Wall || newChild?.type === ObjectType.Roof) {\r\n elementsMapNewToOld.set(newChild.id, child.id);\r\n elementsMapOldToNew.set(child.id, newChild.id);\r\n for (const grandChild of state.elements) {\r\n if (grandChild.parentId === child.id) {\r\n const newGrandChild = ElementModelCloner.clone(\r\n newChild,\r\n grandChild,\r\n grandChild.cx,\r\n grandChild.cy,\r\n grandChild.cz,\r\n );\r\n if (newGrandChild) {\r\n if (child.normal) {\r\n newGrandChild.normal = [...grandChild.normal];\r\n }\r\n pastedElements.push(newGrandChild);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n for (const e of state.elements) {\r\n // search new roof\r\n if (e.type === ObjectType.Roof) {\r\n const oldRoofId = elementsMapNewToOld.get(e.id);\r\n if (oldRoofId) {\r\n const oldRoof = get().getElementById(oldRoofId) as RoofModel;\r\n if (oldRoof) {\r\n (e as RoofModel).wallsId = oldRoof.wallsId.map(\r\n (v) => elementsMapOldToNew.get(v) as string,\r\n );\r\n }\r\n }\r\n }\r\n // search new wall\r\n if (e.type === ObjectType.Wall) {\r\n const oldWallId = elementsMapNewToOld.get(e.id);\r\n if (oldWallId) {\r\n for (const o of state.elements) {\r\n if (o.id === oldWallId && o.type === ObjectType.Wall) {\r\n const w = o as WallModel;\r\n const left = elementsMapOldToNew.get(w.leftJoints[0]);\r\n if (left) {\r\n (e as WallModel).leftJoints = [left];\r\n }\r\n const right = elementsMapOldToNew.get(w.rightJoints[0]);\r\n if (right) {\r\n (e as WallModel).rightJoints = [right];\r\n }\r\n if (w.roofId) {\r\n const roofId = elementsMapOldToNew.get(w.roofId as string);\r\n if (roofId) {\r\n (e as WallModel).roofId = roofId;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } else if (state.elementsToPaste.length > 1) {\r\n // when a parent with children is cut, the removed children are no longer in elements array,\r\n // so we have to restore them from elementsToPaste.\r\n const cutElements = state.copyCutElements();\r\n if (cutElements.length > 0) {\r\n cutElements[0].cx += cutElements[0].lx;\r\n state.elements.push(...cutElements);\r\n pastedElements.push(...cutElements);\r\n state.elementsToPaste = cutElements;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(cutElements[0].id);\r\n state.selectedElement = cutElements[0];\r\n }\r\n }\r\n approved = true;\r\n break;\r\n case ObjectType.Wall:\r\n const w = e as WallModel;\r\n const step = new Vector3(1, -1, 0).applyEuler(new Euler(0, 0, w.relativeAngle));\r\n e.cx += step.x;\r\n e.cy += step.y;\r\n if (state.elementsToPaste.length === 1) {\r\n const center = new Vector3(e.cx, e.cy, 0);\r\n const vrx = new Vector3(e.lx / 2, 0, 0);\r\n const vlx = new Vector3(-e.lx / 2, 0, 0);\r\n const euler = new Euler(0, 0, w.relativeAngle);\r\n w.leftPoint = center.clone().add(vlx.applyEuler(euler)).toArray();\r\n w.rightPoint = center.clone().add(vrx.applyEuler(euler)).toArray();\r\n w.roofId = undefined;\r\n w.leftRoofHeight = undefined;\r\n w.rightRoofHeight = undefined;\r\n w.centerLeftRoofHeight = undefined;\r\n w.centerRightRoofHeight = undefined;\r\n w.centerRoofHeight = undefined;\r\n for (const child of state.elements) {\r\n if (child.parentId === elem.id) {\r\n const newChild = ElementModelCloner.clone(\r\n e,\r\n child,\r\n child.cx,\r\n child.cy,\r\n child.cz,\r\n child.type === ObjectType.Polygon,\r\n );\r\n if (newChild) {\r\n if (e.normal) {\r\n newChild.normal = [...child.normal];\r\n }\r\n pastedElements.push(newChild);\r\n }\r\n }\r\n }\r\n state.elements.push(...pastedElements);\r\n state.elements.push(e);\r\n state.elementsToPaste = [e];\r\n } else if (state.elementsToPaste.length > 1) {\r\n const cutElements = state.copyCutElements();\r\n if (cutElements.length > 0) {\r\n cutElements[0].cx += step.x;\r\n cutElements[0].cy -= step.y;\r\n state.elements.push(...cutElements);\r\n pastedElements.push(...cutElements);\r\n state.elementsToPaste = cutElements;\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(cutElements[0].id);\r\n state.selectedElement = cutElements[0];\r\n }\r\n }\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n approved = true;\r\n break;\r\n }\r\n if (state.elementsToPaste.length === 1 && approved) {\r\n pastedElements.push(e);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(e.id);\r\n state.selectedElement = e;\r\n }\r\n }\r\n }\r\n });\r\n return pastedElements;\r\n },\r\n\r\n pvModules: {},\r\n loadPvModules() {\r\n const pvModels: PvModel[] = [];\r\n Papa.parse(pvmodules, {\r\n download: true,\r\n complete: function (results) {\r\n for (const row of results.data) {\r\n if (Array.isArray(row) && row.length > 1) {\r\n const pv = {\r\n name: row[0].trim(),\r\n brand: row[1].trim(),\r\n cellType: row[2].trim(),\r\n efficiency: parseFloat(row[3].trim()),\r\n length: parseFloat(row[4].trim()),\r\n nominalLength: parseFloat(row[5].trim()),\r\n width: parseFloat(row[6].trim()),\r\n nominalWidth: parseFloat(row[7].trim()),\r\n thickness: parseFloat(row[8].trim()),\r\n m: parseFloat(row[9].trim()),\r\n n: parseFloat(row[10].trim()),\r\n pmax: parseFloat(row[11].trim()),\r\n vmpp: parseFloat(row[12].trim()),\r\n impp: parseFloat(row[13].trim()),\r\n voc: parseFloat(row[14].trim()),\r\n isc: parseFloat(row[15].trim()),\r\n pmaxTC: parseFloat(row[16].trim()),\r\n noct: parseFloat(row[17].trim()),\r\n weight: parseFloat(row[18].trim()),\r\n color: row[19].trim(),\r\n shadeTolerance: row[20].trim(),\r\n bifacialityFactor: parseFloat(row[21].trim()),\r\n } as PvModel;\r\n pvModels.push(pv);\r\n }\r\n }\r\n immerSet((state: CommonStoreState) => {\r\n for (const model of pvModels) {\r\n state.pvModules[model.name] = model;\r\n }\r\n });\r\n },\r\n });\r\n },\r\n getPvModule(name: string) {\r\n return get().pvModules[name];\r\n },\r\n\r\n weatherData: {},\r\n loadWeatherData() {\r\n const data: WeatherModel[] = [];\r\n Papa.parse(weather, {\r\n download: true,\r\n complete: function (results) {\r\n for (const row of results.data) {\r\n if (Array.isArray(row) && row.length > 1) {\r\n const lows: number[] = [];\r\n const highs: number[] = [];\r\n const sun: number[] = [];\r\n for (let i = 5; i < 29; i++) {\r\n if ((i - 5) % 2 === 0) {\r\n lows.push(parseFloat(row[i].trim()));\r\n } else {\r\n highs.push(parseFloat(row[i].trim()));\r\n }\r\n }\r\n for (let i = 29; i < 41; i++) {\r\n sun.push(parseFloat(row[i].trim()));\r\n }\r\n const wm = {\r\n city: row[0].trim(),\r\n country: row[1].trim(),\r\n longitude: parseFloat(row[2].trim()),\r\n latitude: parseFloat(row[3].trim()),\r\n elevation: parseFloat(row[4].trim()),\r\n lowestTemperatures: lows,\r\n highestTemperatures: highs,\r\n sunshineHours: sun,\r\n } as WeatherModel;\r\n data.push(wm);\r\n }\r\n }\r\n immerSet((state: CommonStoreState) => {\r\n for (const row of data) {\r\n state.weatherData[row.city + ', ' + row.country] = row;\r\n }\r\n });\r\n },\r\n });\r\n },\r\n getWeather(location) {\r\n return get().weatherData[location];\r\n },\r\n horizontalSolarRadiationData: {},\r\n loadHorizontalSolarRadiationData() {\r\n const radiationData: SolarRadiationData[] = [];\r\n Papa.parse(solar_radiation_horizontal, {\r\n download: true,\r\n complete: function (results) {\r\n for (const row of results.data) {\r\n if (Array.isArray(row) && row.length > 1) {\r\n const data: number[] = [];\r\n for (let i = 2; i < 14; i++) {\r\n data.push(parseFloat(row[i].trim()));\r\n }\r\n const sr = {\r\n city: row[0].trim(),\r\n country: row[1].trim(),\r\n data: data,\r\n } as SolarRadiationData;\r\n radiationData.push(sr);\r\n }\r\n }\r\n immerSet((state: CommonStoreState) => {\r\n for (const x of radiationData) {\r\n state.horizontalSolarRadiationData[x.city + ', ' + x.country] = x;\r\n }\r\n });\r\n },\r\n });\r\n },\r\n getHorizontalSolarRadiation(location) {\r\n return get().horizontalSolarRadiationData[location];\r\n },\r\n verticalSolarRadiationData: {},\r\n loadVerticalSolarRadiationData() {\r\n const radiationData: SolarRadiationData[] = [];\r\n Papa.parse(solar_radiation_vertical, {\r\n download: true,\r\n complete: function (results) {\r\n for (const row of results.data) {\r\n if (Array.isArray(row) && row.length > 1) {\r\n const data: number[] = [];\r\n for (let i = 2; i < 14; i++) {\r\n data.push(parseFloat(row[i].trim()));\r\n }\r\n const sr = {\r\n city: row[0].trim(),\r\n country: row[1].trim(),\r\n data: data,\r\n } as SolarRadiationData;\r\n radiationData.push(sr);\r\n }\r\n }\r\n immerSet((state: CommonStoreState) => {\r\n for (const x of radiationData) {\r\n state.verticalSolarRadiationData[x.city + ', ' + x.country] = x;\r\n }\r\n });\r\n },\r\n });\r\n },\r\n getVerticalSolarRadiation(location) {\r\n return get().verticalSolarRadiationData[location];\r\n },\r\n getClosestCity(lat, lng) {\r\n let min: number = Number.MAX_VALUE;\r\n let city = null;\r\n let distance: number;\r\n const wd = get().weatherData;\r\n for (const name in wd) {\r\n if (wd.hasOwnProperty(name)) {\r\n distance = Util.getDistance(lng, lat, wd[name].longitude, wd[name].latitude);\r\n if (distance < min) {\r\n min = distance;\r\n city = name;\r\n }\r\n }\r\n }\r\n return city;\r\n },\r\n\r\n sunlightDirection: new Vector3(0, 2, 2),\r\n setSunlightDirection(vector) {\r\n immerSet((state: CommonStoreState) => {\r\n state.sunlightDirection = vector.clone();\r\n });\r\n },\r\n\r\n cameraDirection: new Vector3(),\r\n getCameraDirection() {\r\n return get().cameraDirection;\r\n },\r\n\r\n updateSceneRadiusFlag: false,\r\n updateSceneRadius() {\r\n immerSet((state: CommonStoreState) => {\r\n state.updateSceneRadiusFlag = !state.updateSceneRadiusFlag;\r\n });\r\n },\r\n sceneRadius: 100,\r\n setSceneRadius(radius) {\r\n immerSet((state: CommonStoreState) => {\r\n state.sceneRadius = radius;\r\n });\r\n },\r\n\r\n selectedElementAngle: 0,\r\n selectedElementHeight: 0,\r\n selectedElementX: 0,\r\n selectedElementY: 0,\r\n\r\n isAddingElement() {\r\n return !!(\r\n get().addedCuboidId ||\r\n get().addedFoundationId ||\r\n get().addedWallId ||\r\n get().addedWindowId ||\r\n get().addedDoorId\r\n );\r\n },\r\n\r\n addedFoundationId: null,\r\n deletedFoundationId: null,\r\n\r\n addedCuboidId: null,\r\n deletedCuboidId: null,\r\n\r\n addedWallId: null,\r\n deletedWallId: null,\r\n updateWallMapOnFoundationFlag: false,\r\n updateWallMapOnFoundation() {\r\n immerSet((state: CommonStoreState) => {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n },\r\n\r\n updateElementOnRoofFlag: false,\r\n setUpdateElementOnRoofFlag(b) {\r\n immerSet((state: CommonStoreState) => {\r\n state.updateElementOnRoofFlag = b;\r\n });\r\n },\r\n updateElementOnRoofFn() {\r\n immerSet((state: CommonStoreState) => {\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n },\r\n\r\n addedWindowId: null,\r\n\r\n addedDoorId: null,\r\n\r\n addedRoofIdSet: new Set(),\r\n deletedRoofId: null,\r\n deletedRoofIdSet: new Set(),\r\n autoDeletedRoofs: null,\r\n autoDeletedRoofIdSet: new Set(),\r\n autoDeletedChild: null,\r\n getAutoDeletedElements() {\r\n const autoDeletedRoofs = get().autoDeletedRoofs;\r\n const autoDeletedChild = get().autoDeletedChild;\r\n\r\n if (!autoDeletedRoofs || !autoDeletedChild) return null;\r\n\r\n const arr = [...autoDeletedRoofs, ...autoDeletedChild];\r\n return arr;\r\n },\r\n deleteAddedRoofId(id: string) {\r\n immerSet((state) => {\r\n state.addedRoofIdSet.delete(id);\r\n });\r\n },\r\n\r\n groupActionMode: false,\r\n setGroupActionMode(b: boolean) {\r\n immerSet((state) => {\r\n state.groupActionMode = b;\r\n });\r\n },\r\n groupActionUpdateFlag: false,\r\n\r\n locale: enUS,\r\n localFileName: 'aladdin.ala',\r\n createNewFileFlag: false,\r\n setCreateNewFileFlag(b) {\r\n immerSet((state) => {\r\n state.createNewFileFlag = b;\r\n });\r\n },\r\n openLocalFileFlag: false,\r\n setOpenLocalFileFlag(b) {\r\n immerSet((state) => {\r\n state.openLocalFileFlag = b;\r\n });\r\n },\r\n localFileDialogRequested: false,\r\n pvModelDialogVisible: false,\r\n loggable: false,\r\n actionInfo: undefined,\r\n currentUndoable: undefined,\r\n showCloudFileTitleDialog: false,\r\n showCloudFileTitleDialogFlag: false,\r\n localContentToImportAfterCloudFileUpdate: undefined,\r\n\r\n enableFineGrid: false,\r\n setEnableFineGrid(b) {\r\n immerSet((state: CommonStoreState) => {\r\n state.enableFineGrid = b;\r\n });\r\n },\r\n };\r\n },\r\n {\r\n name: 'aladdin-storage',\r\n getStorage: () => {\r\n const params = new URLSearchParams(window.location.search);\r\n const viewOnly = params.get('viewonly') === 'true';\r\n return viewOnly ? sessionStorage : localStorage;\r\n },\r\n whitelist: [\r\n 'language',\r\n 'animate24Hours',\r\n 'floatingWindowOpacity',\r\n 'selectedFloatingWindow',\r\n 'locale',\r\n 'cloudFile',\r\n 'latestModelSite',\r\n 'modelSites',\r\n 'modelsMapLatitude',\r\n 'modelsMapLongitude',\r\n 'modelsMapAddress',\r\n 'modelsMapZoom',\r\n 'modelsMapType',\r\n 'modelsMapTilt',\r\n 'world',\r\n 'elements',\r\n 'viewState',\r\n 'graphState',\r\n 'actionState',\r\n 'modelType',\r\n 'modelAuthor',\r\n 'modelLabel',\r\n 'modelDescription',\r\n 'projectView',\r\n 'projectInfo',\r\n 'designProjectType',\r\n 'notes',\r\n 'user',\r\n 'sceneRadius',\r\n 'weatherData',\r\n 'solarPanelArrayLayoutParams',\r\n 'solarPanelArrayLayoutConstraints',\r\n 'economicsParams',\r\n 'evolutionMethod',\r\n 'evolutionaryAlgorithmState',\r\n 'geneticAlgorithmWizardSelectedTab',\r\n 'particleSwarmOptimizationWizardSelectedTab',\r\n 'minimumNavigationMoveSpeed',\r\n 'minimumNavigationTurnSpeed',\r\n ],\r\n },\r\n ),\r\n ),\r\n);\r\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { ErrorInfo } from 'react';\n\nclass ErrorPage extends React.Component<{}, { hasError: boolean }> {\n constructor(props: any) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error) {\n // Update state so the next render will show the fallback UI.\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // You can also log the error to an error reporting service\n //logErrorToMyService(error, errorInfo);\n }\n\n clearCacheAndReload() {\n localStorage.clear();\n window.location.reload();\n }\n\n render() {\n if (this.state.hasError) {\n // You can render any custom fallback UI\n return (\n \n

Error

\n

Something went wrong. Please click the following button to clear the cache and reload the page.

\n

\n \n

\n \n );\n }\n return this.props.children;\n }\n}\n\nexport default ErrorPage;\n","export default __webpack_public_path__ + \"static/media/daysky.66925efd.jpg\";","export default __webpack_public_path__ + \"static/media/desert.e1e10657.jpg\";","export default __webpack_public_path__ + \"static/media/dune.5b4e54f9.jpg\";","export default __webpack_public_path__ + \"static/media/forest.7e47e4d2.jpg\";","export default __webpack_public_path__ + \"static/media/grassland.a0c4d0ac.jpg\";","export default __webpack_public_path__ + \"static/media/hill-spring.f8b76c57.jpg\";","export default __webpack_public_path__ + \"static/media/hill-summer.26c46362.jpg\";","export default __webpack_public_path__ + \"static/media/hill-fall.9b0790b7.jpg\";","export default __webpack_public_path__ + \"static/media/hill-winter.416b6801.jpg\";","export default __webpack_public_path__ + \"static/media/lake.a9a56bcc.jpg\";","export default __webpack_public_path__ + \"static/media/mountain.af82417a.jpg\";","export default __webpack_public_path__ + \"static/media/rural.bc238e1c.jpg\";","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { RefObject, useMemo, useRef, useState } from 'react';\nimport { BackSide, DoubleSide, Euler, Group, Intersection, Mesh, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { invalidate, ThreeEvent, useThree } from '@react-three/fiber';\nimport { Plane, useTexture } from '@react-three/drei';\n\nimport DefaultImage from '../resources/daysky.jpg';\nimport DesertImage from '../resources/desert.jpg';\nimport DuneImage from '../resources/dune.jpg';\nimport ForestImage from '../resources/forest.jpg';\nimport GrasslandImage from '../resources/grassland.jpg';\nimport HillSpringImage from '../resources/hill-spring.jpg';\nimport HillSummerImage from '../resources/hill-summer.jpg';\nimport HillFallImage from '../resources/hill-fall.jpg';\nimport HillWinterImage from '../resources/hill-winter.jpg';\nimport LakeImage from '../resources/lake.jpg';\nimport MountainImage from '../resources/mountain.jpg';\nimport RuralImage from '../resources/rural.jpg';\n\nimport { useStore } from '../stores/common';\nimport { useRefStore } from 'src/stores/commonRef';\nimport * as Selector from '../stores/selector';\nimport { IntersectionPlaneType, ObjectType, ResizeHandleType, Theme } from '../types';\nimport { ElementModel } from '../models/ElementModel';\nimport {\n DEFAULT_SKY_RADIUS,\n GROUND_ID,\n HALF_PI,\n ORIGIN_VECTOR2,\n TWO_PI,\n UNIT_VECTOR_POS_Z_ARRAY,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { Util } from 'src/Util';\nimport { PolygonModel } from 'src/models/PolygonModel';\nimport { TreeModel } from '../models/TreeModel';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { UndoableMove } from 'src/undo/UndoableMove';\nimport { showError } from 'src/helpers';\nimport i18n from 'src/i18n/i18n';\n\nexport interface SkyProps {\n theme?: string;\n}\n\nconst Sky = ({ theme = 'Default' }: SkyProps) => {\n const setCommonStore = useStore(Selector.set);\n const selectNone = useStore(Selector.selectNone);\n const getSelectedElement = useStore(Selector.getSelectedElement);\n const getCameraDirection = useStore(Selector.getCameraDirection);\n const getResizeHandlePosition = useStore(Selector.getResizeHandlePosition);\n const getChildren = useStore(Selector.getChildren);\n const getElementById = useStore(Selector.getElementById);\n const updateElementLxById = useStore(Selector.updateElementLxById);\n const updateElementLzById = useStore(Selector.updateElementLzById);\n const resizeHandleType = useStore(Selector.resizeHandleType);\n const latitude = useStore(Selector.world.latitude);\n const date = useStore(Selector.world.date);\n const addUndoable = useStore(Selector.addUndoable);\n const setElementPosition = useStore(Selector.setElementPosition);\n const language = useStore(Selector.language);\n const updateSceneRadius = useStore(Selector.updateSceneRadius);\n\n const {\n scene,\n camera,\n gl: { domElement },\n } = useThree();\n const meshRef = useRef(null!);\n const grabRef = useRef(null);\n const intersectionPlaneRef = useRef();\n const absPosMapRef = useRef>(new Map());\n const polygonsAbsPosMapRef = useRef>(new Map());\n const oldPositionRef = useRef(new Vector3());\n const newPositionRef = useRef(new Vector3());\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\n const oldWidthRef = useRef(0);\n const oldHeightRef = useRef(0);\n const oldChildrenPositionsMapRef = useRef>(new Map());\n const oldChildrenParentIdMapRef = useRef>(new Map());\n const newChildrenPositionsMapRef = useRef>(new Map());\n const newChildrenParentIdMapRef = useRef>(new Map());\n const oldHumanOrTreeParentIdRef = useRef(null);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const ray = useMemo(() => new Raycaster(), []);\n const elementParentRotation = useMemo(() => new Euler(), []);\n\n const now = new Date(date);\n const month = now.getMonth() + 1;\n\n const [intersectionPlaneType, setIntersectionPlaneType] = useState(IntersectionPlaneType.Sky);\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\n const intersectionPlaneAngle = useMemo(() => new Euler(), []);\n if (grabRef.current && resizeHandleType) {\n if (intersectionPlaneType !== IntersectionPlaneType.Vertical) {\n setIntersectionPlaneType(IntersectionPlaneType.Vertical);\n }\n const handlePosition = getResizeHandlePosition(grabRef.current, resizeHandleType);\n const cameraDir = getCameraDirection();\n const rotation = -Math.atan2(cameraDir.x, cameraDir.y);\n intersectionPlanePosition.set(handlePosition.x, handlePosition.y, 0);\n intersectionPlaneAngle.set(-HALF_PI, 0, rotation, 'ZXY');\n }\n\n const scale = useMemo(() => {\n switch (theme) {\n case Theme.Desert:\n return 0.5;\n case Theme.Dune:\n return 0.25;\n case Theme.Forest:\n return 0.25;\n case Theme.Grassland:\n return 0.15;\n case Theme.Hill:\n return 0.3;\n case Theme.Lake:\n return 0.1;\n case Theme.Mountain:\n return 0.4;\n case Theme.Rural:\n return 0.25;\n default:\n return 0.2;\n }\n }, [theme]);\n\n const textureImg = useMemo(() => {\n switch (theme) {\n case Theme.Desert:\n return DesertImage;\n case Theme.Dune:\n return DuneImage;\n case Theme.Forest:\n return ForestImage;\n case Theme.Grassland:\n return GrasslandImage;\n case Theme.Hill:\n if (latitude > 0) {\n if (month >= 12 || month <= 3) {\n return HillWinterImage;\n } else if (month > 3 && month <= 5) {\n return HillSpringImage;\n } else if (month > 5 && month <= 9) {\n return HillSummerImage;\n } else {\n // November\n return HillFallImage;\n }\n } else {\n if (month >= 12 || month <= 3) {\n return HillSummerImage;\n } else if (month > 3 && month <= 5) {\n return HillFallImage;\n } else if (month > 5 && month <= 9) {\n return HillWinterImage;\n } else {\n return HillSpringImage;\n }\n }\n case Theme.Lake:\n return LakeImage;\n case Theme.Mountain:\n return MountainImage;\n case Theme.Rural:\n return RuralImage;\n default:\n return DefaultImage;\n }\n }, [theme, date, latitude]);\n\n const texture = useTexture(textureImg);\n\n const legalOnGround = (type: ObjectType) => {\n return (\n type === ObjectType.Foundation ||\n type === ObjectType.Cuboid ||\n type === ObjectType.Tree ||\n type === ObjectType.Flower ||\n type === ObjectType.Human\n );\n };\n\n const clickSky = (e: ThreeEvent) => {\n // We must check if there is really a first intersection, onClick does not guarantee it\n // onClick listener for an object can still fire an event even when the object is behind another one\n if (e.intersections.length > 0) {\n const skyClicked = e.intersections[0].object === meshRef.current;\n if (skyClicked) {\n selectNone();\n setCommonStore((state) => {\n state.clickObjectType = ObjectType.Sky;\n });\n } else {\n const selectedElement = getSelectedElement();\n if (selectedElement) {\n if (legalOnGround(selectedElement.type)) {\n grabRef.current = selectedElement;\n if (Util.isPlantOrHuman(grabRef.current)) {\n setIntersectionPlaneType(IntersectionPlaneType.Vertical);\n intersectionPlaneAngle.set(-HALF_PI, 0, 0, 'ZXY');\n }\n if (selectedElement.type !== ObjectType.Foundation && selectedElement.type !== ObjectType.Cuboid) {\n useRefStore.getState().setEnableOrbitController(false);\n }\n }\n }\n }\n }\n };\n\n const getObjectId = (obj: Object3D | null): string => {\n if (!obj) return '';\n\n const nameArray = obj.name.split(' ');\n if (nameArray[2]) {\n return nameArray[2];\n }\n\n return getObjectId(obj.parent);\n };\n\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\n if (object === null || object === undefined) return null;\n for (const obj of object.children) {\n if (obj.name.includes(`${id}`)) {\n return obj;\n }\n }\n return null;\n };\n\n const handleDetachParent = (elem: ElementModel, e: ElementModel) => {\n const contentRef = useRefStore.getState().contentRef;\n const parentObject = getObjectChildById(contentRef?.current, elem.id);\n if (parentObject) {\n for (const obj of parentObject.children) {\n if (obj.name.includes(`${e.id}`)) {\n useRefStore.getState().contentRef?.current?.add(obj);\n break;\n }\n }\n }\n e.parentId = GROUND_ID;\n const absPos = new Vector3(e.cx, e.cy, e.cz)\n .applyEuler(new Euler(0, 0, elem.rotation[2]))\n .add(oldPositionRef.current);\n e.cx = absPos.x;\n e.cy = absPos.y;\n e.cz = 0;\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\n };\n\n const attachToGroup = (\n attachParentId: string | null | undefined,\n currParentId: string | null | undefined,\n currId: string,\n ) => {\n if (!attachParentId || !currParentId) return;\n const contentRef = useRefStore.getState().contentRef;\n if (contentRef?.current) {\n const currParentObj = Util.getObjectChildById(contentRef.current, currParentId);\n const currObj = Util.getObjectChildById(currParentId === GROUND_ID ? contentRef.current : currParentObj, currId);\n if (currObj) {\n if (attachParentId === GROUND_ID) {\n contentRef.current.add(currObj);\n } else {\n const attachParentObj = Util.getObjectChildById(contentRef.current, attachParentId);\n attachParentObj?.add(currObj);\n }\n invalidate();\n }\n }\n };\n\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\n if (!parentId) return;\n setCommonStore((state) => {\n for (const e of state.elements) {\n // don't set parentId for foundations or cuboids as their parents are allowed to be ground only (for now)\n if (e.id === elementId && !Util.isFoundationOrCuboid(e)) {\n e.parentId = parentId;\n break;\n }\n }\n });\n };\n\n const getIntersectionToStand = (intersections: Intersection[]) => {\n for (const intersection of intersections) {\n if (intersection.object.userData.stand) {\n return intersection;\n }\n }\n return null;\n };\n\n const handleTreeOrHumanRefMove = (elementRef: RefObject | null, e: ThreeEvent) => {\n if (elementRef && elementRef.current) {\n const intersection = getIntersectionToStand(e.intersections);\n if (intersection) {\n const intersectionObj = intersection.object; // Mesh\n const elementParentRef = elementRef.current.parent;\n\n // stand on ground\n if (intersectionObj.name === 'Ground') {\n // change parent: attach dom, set parentId?\n if (elementParentRef && elementParentRef.name !== 'Content') {\n const contentRef = useRefStore.getState().contentRef;\n if (contentRef && contentRef.current) {\n contentRef.current.add(elementRef.current);\n setParentIdById(GROUND_ID, getObjectId(elementRef.current));\n }\n }\n elementRef.current.position.copy(intersection.point); // world position\n invalidate();\n }\n // stand on standable elements\n else if (intersectionObj.userData.stand) {\n const intersectionObjGroup = intersectionObj.parent; // Group\n if (intersectionObjGroup) {\n // change parent: attach dom, set parentId?\n if (elementParentRef && elementParentRef.uuid !== intersectionObjGroup.uuid) {\n intersectionObjGroup.add(elementRef.current); // attach to Group\n setParentIdById(getObjectId(intersectionObjGroup), getObjectId(elementRef.current));\n }\n elementParentRotation.set(0, 0, -intersectionObjGroup.rotation.z);\n const relPos = new Vector3()\n .subVectors(intersection.point, intersectionObjGroup.position)\n .applyEuler(elementParentRotation);\n elementRef.current.position.copy(relPos); // relative abs position\n invalidate();\n }\n }\n }\n }\n };\n\n // for tree and human for now\n const handleSetElementState = (elemId: string, standObjId: string, position: Vector3) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === elemId) {\n // don't set parentId for foundations or cuboids as their parents are allowed to be ground only (for now)\n if (!Util.isFoundationOrCuboid(e)) e.parentId = standObjId;\n e.cx = position.x;\n e.cy = position.y;\n e.cz = position.z;\n break;\n }\n }\n });\n };\n\n const isMoveToSky = () => {\n if (useStore.getState().viewState.orthographic) return false; // impossible to move to sky in 2D mode\n if (meshRef.current) {\n const intersections = ray.intersectObjects(Util.fetchIntersectables(scene), false);\n if (intersections.length > 0) {\n for (const intersection of intersections) {\n if (intersection.object.userData.stand) {\n return false;\n }\n }\n }\n }\n return ray.intersectObjects([meshRef.current!]).length > 0;\n };\n\n const handlePointerMove = (e: ThreeEvent) => {\n if (grabRef.current && grabRef.current.type && !grabRef.current.locked) {\n const mouse = new Vector2();\n mouse.x = (e.offsetX / domElement.clientWidth) * 2 - 1;\n mouse.y = -(e.offsetY / domElement.clientHeight) * 2 + 1;\n ray.setFromCamera(mouse, camera);\n let intersects;\n if (intersectionPlaneRef.current && intersectionPlaneType === IntersectionPlaneType.Vertical) {\n intersects = ray.intersectObjects([intersectionPlaneRef.current]);\n if (intersects && intersects.length > 0) {\n const p = intersects[0].point;\n switch (grabRef.current.type) {\n case ObjectType.Tree:\n const tree = grabRef.current as TreeModel;\n switch (resizeHandleType) {\n case ResizeHandleType.Top:\n updateElementLzById(tree.id, p.z);\n setCommonStore((state) => {\n state.selectedElementHeight = Math.max(1, p.z);\n });\n break;\n case ResizeHandleType.Left:\n case ResizeHandleType.Right:\n case ResizeHandleType.Upper:\n case ResizeHandleType.Lower:\n updateElementLxById(tree.id, 2 * Math.hypot(p.x - tree.cx, p.y - tree.cy));\n break;\n }\n handleTreeOrHumanRefMove(useRefStore.getState().treeRef, e);\n break;\n case ObjectType.Human:\n handleTreeOrHumanRefMove(useRefStore.getState().humanRef, e);\n break;\n case ObjectType.Cuboid:\n if (Util.isTopResizeHandle(resizeHandleType)) {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === grabRef.current?.id) {\n e.cz = Math.max(0.5, p.z / 2);\n e.lz = Math.max(1, p.z);\n break;\n }\n }\n state.selectedElementHeight = Math.max(1, p.z);\n });\n const cuboidRef = useRefStore.getState().cuboidRef;\n if (cuboidRef?.current) {\n for (const obj of cuboidRef.current.children) {\n if (obj.name.includes('Human') || obj.name.includes('Tree')) {\n const absPos = absPosMapRef.current.get(getObjectId(obj));\n if (absPos) {\n // stand on top face\n if (Math.abs(oldHeightRef.current - absPos.z) < 0.01) {\n obj.position.setZ(Math.max(p.z / 2, 0.5));\n }\n // stand on side faces\n else {\n obj.position.setZ(absPos.z - cuboidRef.current.position.z);\n }\n }\n }\n }\n }\n }\n break;\n }\n }\n }\n }\n };\n\n const handlePointerDown = (e: ThreeEvent) => {\n if (e.button === 2) return; // ignore right-click\n setCommonStore((state) => {\n state.contextMenuObjectType = null;\n });\n clickSky(e);\n\n const selectedElement = grabRef.current;\n if (selectedElement) {\n // save info for undo\n oldHeightRef.current = selectedElement.lz;\n oldPositionRef.current.set(selectedElement.cx, selectedElement.cy, selectedElement.cz);\n\n // store the positions of children\n switch (selectedElement.type) {\n case ObjectType.Human:\n oldHumanOrTreeParentIdRef.current = selectedElement.parentId;\n break;\n case ObjectType.Tree:\n oldHumanOrTreeParentIdRef.current = selectedElement.parentId;\n oldWidthRef.current = selectedElement.lx; // crown spread of tree\n break;\n case ObjectType.Cuboid: {\n oldPositionRef.current.set(selectedElement.cx, selectedElement.cy, selectedElement.cz);\n oldDimensionRef.current.set(selectedElement.lx, selectedElement.ly, selectedElement.lz);\n\n absPosMapRef.current.clear();\n const cuboidCenter = new Vector3(selectedElement.cx, selectedElement.cy, selectedElement.cz);\n const cuboidChildren = getChildren(selectedElement.id);\n if (cuboidChildren.length > 0) {\n oldChildrenPositionsMapRef.current.clear();\n const a = selectedElement.rotation[2];\n for (const e of cuboidChildren) {\n switch (e.type) {\n case ObjectType.Tree:\n case ObjectType.Human:\n const centerAbsPos = new Vector3(e.cx, e.cy, e.cz).applyEuler(new Euler(0, 0, a));\n centerAbsPos.add(cuboidCenter);\n absPosMapRef.current.set(e.id, centerAbsPos);\n oldChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, e.cz));\n break;\n case ObjectType.SolarPanel:\n case ObjectType.Sensor:\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\n const centerAbsPos = new Vector3(\n e.cx * selectedElement.lx,\n e.cy * selectedElement.ly,\n e.cz * selectedElement.lz,\n ).applyEuler(new Euler(0, 0, a));\n centerAbsPos.add(cuboidCenter);\n absPosMapRef.current.set(e.id, centerAbsPos);\n }\n break;\n case ObjectType.Polygon:\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\n const polygon = e as PolygonModel;\n const vertexAbsPosArray: Vector2[] = [];\n for (const v of polygon.vertices) {\n const vertexAbsPos = new Vector2(v.x * selectedElement.lx, v.y * selectedElement.ly).rotateAround(\n ORIGIN_VECTOR2,\n a,\n );\n vertexAbsPos.add(new Vector2(cuboidCenter.x, cuboidCenter.y));\n vertexAbsPosArray.push(vertexAbsPos);\n }\n polygonsAbsPosMapRef.current.set(polygon.id, vertexAbsPosArray);\n }\n break;\n }\n }\n }\n break;\n }\n }\n }\n };\n\n const handlePointerUp = () => {\n if (grabRef.current) {\n const elem = getElementById(grabRef.current.id);\n if (elem && !elem.locked) {\n let elementRef: Group | null | undefined = null;\n let newHumanOrTreeParentId: string | null = oldHumanOrTreeParentIdRef.current;\n switch (elem.type) {\n case ObjectType.Cuboid:\n switch (resizeHandleType) {\n case ResizeHandleType.UpperLeftTop:\n case ResizeHandleType.UpperRightTop:\n case ResizeHandleType.LowerLeftTop:\n case ResizeHandleType.LowerRightTop:\n oldChildrenParentIdMapRef.current.clear();\n setCommonStore((state) => {\n state.actionState.cuboidHeight = elem.lz;\n // set ref children state\n for (const e of state.elements) {\n if (Util.isPlantOrHuman(e)) {\n if (e.parentId === elem.id) {\n oldChildrenParentIdMapRef.current.set(e.id, elem.id);\n // stand on top face\n if (Math.abs(oldDimensionRef.current.z / 2 - e.cz) < 0.01) {\n e.cz = elem.lz / 2;\n }\n // stand on side faces\n else {\n const newRelZ = e.cz + oldPositionRef.current.z - elem.cz;\n if (Math.abs(newRelZ) > elem.lz / 2) {\n handleDetachParent(elem, e);\n } else {\n e.cz = newRelZ;\n }\n }\n }\n }\n }\n });\n const children = getChildren(elem.id);\n if (children.length > 0) {\n for (const c of children) {\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\n }\n }\n const undoableChangeHeight = {\n name: 'Change Cuboid Height',\n timestamp: Date.now(),\n changedElementId: elem.id,\n changedElementType: elem.type,\n oldValue: oldHeightRef.current,\n newValue: elem.lz,\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\n undo: () => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === undoableChangeHeight.changedElementId) {\n e.lz = undoableChangeHeight.oldValue as number;\n e.cz = (undoableChangeHeight.oldValue as number) / 2;\n break;\n }\n }\n });\n if (\n undoableChangeHeight.oldChildrenPositionsMap &&\n undoableChangeHeight.oldChildrenPositionsMap.size > 0\n ) {\n for (const [id, p] of undoableChangeHeight.oldChildrenPositionsMap.entries()) {\n const elem = getElementById(id);\n if (elem?.type !== ObjectType.Polygon) {\n setElementPosition(id, p.x, p.y, p.z);\n const oldParentId = undoableChangeHeight.oldChildrenParentIdMap?.get(id);\n const newParentId = undoableChangeHeight.newChildrenParentIdMap?.get(id);\n if (oldParentId && newParentId && oldParentId !== newParentId) {\n attachToGroup(oldParentId, newParentId, id);\n setParentIdById(oldParentId, id);\n }\n }\n }\n }\n },\n redo: () => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === undoableChangeHeight.changedElementId) {\n e.lz = undoableChangeHeight.newValue as number;\n e.cz = (undoableChangeHeight.newValue as number) / 2;\n break;\n }\n }\n });\n if (\n undoableChangeHeight.newChildrenPositionsMap &&\n undoableChangeHeight.newChildrenPositionsMap.size > 0\n ) {\n for (const [id, p] of undoableChangeHeight.newChildrenPositionsMap.entries()) {\n setElementPosition(id, p.x, p.y, p.z);\n const oldParentId = undoableChangeHeight.oldChildrenParentIdMap?.get(id);\n const newParentId = undoableChangeHeight.newChildrenParentIdMap?.get(id);\n if (oldParentId && newParentId && oldParentId !== newParentId) {\n attachToGroup(newParentId, oldParentId, id);\n setParentIdById(newParentId, id);\n }\n }\n }\n },\n } as UndoableChange;\n addUndoable(undoableChangeHeight);\n break;\n }\n break;\n case ObjectType.Tree:\n switch (resizeHandleType) {\n case ResizeHandleType.Top:\n const undoableChangeHeight = {\n name: 'Change Tree Height',\n timestamp: Date.now(),\n changedElementId: elem.id,\n changedElementType: elem.type,\n oldValue: oldHeightRef.current,\n newValue: elem.lz,\n undo: () => {\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.oldValue as number);\n },\n redo: () => {\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChangeHeight);\n setCommonStore((state) => {\n state.actionState.treeHeight = elem.lz;\n });\n break;\n case ResizeHandleType.Left:\n case ResizeHandleType.Right:\n case ResizeHandleType.Lower:\n case ResizeHandleType.Upper:\n const undoableChangeSpread = {\n name: 'Change Tree Spread',\n timestamp: Date.now(),\n changedElementId: elem.id,\n changedElementType: elem.type,\n oldValue: oldWidthRef.current,\n newValue: elem.lx,\n undo: () => {\n updateElementLxById(undoableChangeSpread.changedElementId, undoableChangeSpread.oldValue as number);\n },\n redo: () => {\n updateElementLxById(undoableChangeSpread.changedElementId, undoableChangeSpread.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChangeSpread);\n setCommonStore((state) => {\n state.actionState.treeSpread = elem.lx;\n });\n break;\n }\n elementRef = useRefStore.getState().treeRef?.current;\n break;\n case ObjectType.Human:\n elementRef = useRefStore.getState().humanRef?.current;\n break;\n }\n if (elementRef) {\n const intersections = ray.intersectObjects(Util.fetchIntersectables(scene), false);\n const intersection = getIntersectionToStand(intersections); // could simplify???\n if (intersection) {\n const p = intersection.point;\n // on ground\n if (intersection.object.name === 'Ground') {\n handleSetElementState(elem.id, GROUND_ID, p);\n newPositionRef.current.set(p.x, p.y, p.z);\n newHumanOrTreeParentId = GROUND_ID;\n }\n // on other standable elements\n else if (intersection.object.userData.stand) {\n const intersectionObjId = getObjectId(intersection.object);\n const intersectionObjGroup = intersection.object.parent;\n if (intersectionObjGroup) {\n const relPos = new Vector3()\n .subVectors(p, intersectionObjGroup.position)\n .applyEuler(elementParentRotation);\n handleSetElementState(elem.id, intersectionObjId, relPos);\n newPositionRef.current.set(relPos.x, relPos.y, relPos.z);\n newHumanOrTreeParentId = intersectionObjId;\n }\n }\n }\n }\n if (\n useStore.getState().moveHandleType &&\n Util.isPlantOrHuman(elem) &&\n (newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE ||\n ray.intersectObjects([meshRef.current!]).length > 0)\n ) {\n let moveOk = true;\n // not sure why we need to check this as I cannot imagine which object will be dragged in the sky\n if (!useStore.getState().viewState.orthographic) {\n // OK to move closer to the origin\n moveOk = newPositionRef.current.length() < oldPositionRef.current.length();\n if (!moveOk) {\n // in the case that it is moving away from the origin, check it will be too far\n const screenPosition = newPositionRef.current.clone().project(camera);\n const screenLx = newPositionRef.current\n .clone()\n .add(new Vector3(elem.lx, 0, 0))\n .project(camera)\n .distanceTo(screenPosition);\n const screenLy = newPositionRef.current\n .clone()\n .add(new Vector3(0, elem.ly ?? 1, 0))\n .project(camera)\n .distanceTo(screenPosition);\n const screenLz = newPositionRef.current\n .clone()\n .add(new Vector3(0, 0, elem.lz))\n .project(camera)\n .distanceTo(screenPosition);\n // OK if larger than 2% of screen dimension\n moveOk = Math.max(screenLx, screenLy, screenLz) > 0.02;\n }\n }\n if (!moveOk || isMoveToSky()) {\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\n if (elementRef) {\n if (Util.isPlantOrHuman(elem)) {\n elementRef.position.copy(oldPositionRef.current);\n }\n }\n if (Util.isPlantOrHuman(elem)) {\n setParentIdById(oldHumanOrTreeParentIdRef.current, elem.id);\n }\n const contentRef = useRefStore.getState().contentRef;\n if (contentRef?.current && oldHumanOrTreeParentIdRef.current && elementRef) {\n if (oldHumanOrTreeParentIdRef.current === GROUND_ID) {\n contentRef.current.add(elementRef);\n } else {\n const attachParentObj = Util.getObjectChildById(contentRef.current, oldHumanOrTreeParentIdRef.current);\n attachParentObj?.add(elementRef);\n }\n invalidate();\n }\n showError(i18n.t('message.CannotMoveObjectTooFar', lang));\n } else {\n const undoableMove = {\n name: 'Move',\n timestamp: Date.now(),\n movedElementId: elem.id,\n movedElementType: elem.type,\n oldCx: oldPositionRef.current.x,\n oldCy: oldPositionRef.current.y,\n oldCz: oldPositionRef.current.z,\n newCx: newPositionRef.current.x,\n newCy: newPositionRef.current.y,\n newCz: newPositionRef.current.z,\n oldParentId: oldHumanOrTreeParentIdRef.current,\n newParentId: newHumanOrTreeParentId,\n undo: () => {\n setElementPosition(\n undoableMove.movedElementId,\n undoableMove.oldCx,\n undoableMove.oldCy,\n undoableMove.oldCz,\n );\n setParentIdById(undoableMove.oldParentId, undoableMove.movedElementId);\n attachToGroup(undoableMove.oldParentId, undoableMove.newParentId, undoableMove.movedElementId);\n },\n redo: () => {\n setElementPosition(\n undoableMove.movedElementId,\n undoableMove.newCx,\n undoableMove.newCy,\n undoableMove.newCz,\n );\n setParentIdById(undoableMove.newParentId, undoableMove.movedElementId);\n attachToGroup(undoableMove.newParentId, undoableMove.oldParentId, undoableMove.movedElementId);\n },\n } as UndoableMove;\n addUndoable(undoableMove);\n updateSceneRadius();\n }\n }\n }\n grabRef.current = null;\n setIntersectionPlaneType(IntersectionPlaneType.Sky);\n setCommonStore((state) => {\n state.moveHandleType = null;\n state.resizeHandleType = null;\n state.rotateHandleType = null;\n });\n useRefStore.setState((state) => {\n state.humanRef = null;\n state.treeRef = null;\n state.setEnableOrbitController(true);\n });\n }\n };\n\n return (\n <>\n {\n if (e.intersections.length > 0) {\n const skyClicked = e.intersections[0].object === meshRef.current;\n if (skyClicked) {\n selectNone();\n setCommonStore((state) => {\n state.clickObjectType = ObjectType.Sky;\n state.contextMenuObjectType = ObjectType.Sky;\n });\n }\n }\n }}\n onPointerDown={handlePointerDown}\n >\n \n \n \n {grabRef.current && intersectionPlaneType !== IntersectionPlaneType.Sky && (\n \n \n \n )}\n \n );\n};\n\nexport default React.memo(Sky);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Line } from '@react-three/drei';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { useLoader } from '@react-three/fiber';\nimport { FontLoader, TextGeometryParameters } from 'three';\nimport helvetikerFont from '../fonts/helvetiker_regular.typeface.fnt';\n\nexport interface AxesProps {\n lineWidth?: number;\n endPoint?: number;\n showTickMarks?: boolean;\n showTickLabels?: boolean;\n}\n\nconst Axes = ({ lineWidth = 1, endPoint = 1000, showTickMarks = true, showTickLabels = true }: AxesProps) => {\n const aabb = useStore(Selector.aabb);\n const sceneRadius = useStore(Selector.sceneRadius);\n const orthographic = useStore(Selector.viewState.orthographic);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n\n const nTicks = 50;\n const tickIntervalRef = useRef(1);\n const labelIntervalRef = useRef(tickIntervalRef.current * 10);\n const arrayRef = useRef(new Array(nTicks).fill(1));\n\n const minorTickLength = 0.1;\n const majorTickLength = 0.3;\n const tickMarkColor = 'FloralWhite';\n const tickMarkLineWidth = lineWidth / 2;\n const font = useLoader(FontLoader, helvetikerFont);\n const fontSize = Math.min(1, Math.max(0.5, sceneRadius * 0.01));\n const textGeometryParams = {\n font: font,\n height: 0,\n size: fontSize,\n } as TextGeometryParameters;\n const cameraZ: number = orthographic ? aabb.max.z + 0.01 : 0;\n\n useEffect(() => {\n if (sceneRadius < 50) {\n tickIntervalRef.current = 1;\n } else if (sceneRadius < 100) {\n tickIntervalRef.current = 2;\n } else {\n tickIntervalRef.current = 5;\n }\n labelIntervalRef.current = 10 * tickIntervalRef.current;\n arrayRef.current = new Array(nTicks).fill(1);\n setUpdateFlag(!updateFlag);\n }, [sceneRadius]);\n\n const fetchTickLength = (i: number) => {\n return i % (5 * tickIntervalRef.current) === 0 ? majorTickLength : minorTickLength;\n };\n\n return (\n <>\n {/* x axis */}\n \n {orthographic &&\n showTickMarks &&\n arrayRef.current.map((value, i) => {\n const j = (i + 1) * tickIntervalRef.current;\n const a = fetchTickLength(j);\n return (\n \n \n \n \n );\n })}\n {orthographic &&\n showTickLabels &&\n arrayRef.current.map((value, i) => {\n const j = (i + 1) * tickIntervalRef.current;\n return j % labelIntervalRef.current === 0 ? (\n \n \n \n \n ) : (\n \n );\n })}\n {orthographic &&\n showTickLabels &&\n arrayRef.current.map((value, i) => {\n const j = -(i + 1) * tickIntervalRef.current;\n return j % labelIntervalRef.current === 0 ? (\n \n -10 ? ' ' : '') + j, textGeometryParams]} />\n \n
\n ) : (\n \n );\n })}\n\n {/* y axis */}\n \n {/* tick mark line width is enlarged because they appear to be thinner in the y direction */}\n {orthographic &&\n showTickMarks &&\n arrayRef.current.map((value, i) => {\n const j = (i + 1) * tickIntervalRef.current;\n const a = fetchTickLength(j);\n return (\n \n \n \n \n );\n })}\n {orthographic &&\n showTickLabels &&\n arrayRef.current.map((value, i) => {\n const j = (i + 1) * tickIntervalRef.current;\n return j % labelIntervalRef.current === 0 ? (\n \n \n \n
\n ) : (\n \n );\n })}\n {orthographic &&\n showTickLabels &&\n arrayRef.current.map((value, i) => {\n const j = -(i + 1) * tickIntervalRef.current;\n return j % labelIntervalRef.current === 0 ? (\n \n \n \n
\n ) : (\n \n );\n })}\n\n {/* z axis */}\n {!orthographic && (\n \n )}\n \n );\n};\n\nexport default React.memo(Axes);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DoubleSide, Group, Mesh, RepeatWrapping, TextureLoader, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\r\nimport { HumanModel } from '../models/HumanModel';\r\nimport { Billboard, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\r\nimport {\r\n GROUND_ID,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_COLOR_1,\r\n MOVE_HANDLE_RADIUS,\r\n TWO_PI,\r\n} from '../constants';\r\nimport {\r\n ActionType,\r\n Gender,\r\n HumanName,\r\n MoveHandleType,\r\n ObjectType,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n} from '../types';\r\nimport i18n from '../i18n/i18n';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { HumanData } from '../HumanData';\r\nimport { Util } from '../Util';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Human = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n name = HumanName.Jack,\r\n locked = false,\r\n flip = false,\r\n observer = false,\r\n parentId,\r\n}: HumanModel) => {\r\n let isRender = false;\r\n useStore((state) => {\r\n if (parentId === GROUND_ID) {\r\n isRender = true;\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n isRender = true;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n const removeElementById = useStore(Selector.removeElementById);\r\n useEffect(() => {\r\n if (!isRender) {\r\n removeElementById(id, false);\r\n }\r\n }, [isRender, id]);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const selectMe = useStore(Selector.selectMe);\r\n const getElementById = useStore(Selector.getElementById);\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const selected = useSelected(id);\r\n\r\n const { gl } = useThree();\r\n const [hovered, setHovered] = useState(false);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n\r\n const contentRef = useRefStore((state) => state.contentRef);\r\n const groupRef = useRef(null);\r\n const planeRef = useRef(null);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const humanModel = useMemo(() => getElementById(id) as HumanModel, [id]);\r\n\r\n const fileChangedRef = useRef(false);\r\n const fileChangedState = useStore(Selector.fileChanged);\r\n\r\n // after we delete their parent(change file), we have to add the ref to content immediately,\r\n // because their new parent may not be mounted yet.\r\n if (fileChangedState !== fileChangedRef.current) {\r\n fileChangedRef.current = fileChangedState;\r\n if (contentRef?.current && groupRef.current) {\r\n contentRef.current.add(groupRef.current);\r\n }\r\n }\r\n\r\n // once useEffect detect state change, that means their parent is now mounted, then we add ref to their new parent.\r\n useEffect(() => {\r\n if (parentId !== GROUND_ID) {\r\n const obj = getParentObject();\r\n if (obj && groupRef.current) {\r\n obj.add(groupRef.current);\r\n }\r\n }\r\n }, [fileChangedState]);\r\n\r\n const textureLoader = useMemo(() => {\r\n return new TextureLoader().load(HumanData.fetchTextureImage(name), (texture) => {\r\n if (flip) {\r\n texture.wrapS = RepeatWrapping;\r\n texture.repeat.x = -1;\r\n }\r\n setTexture(texture);\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }, [name, flip]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n const width = useMemo(() => {\r\n return HumanData.fetchWidth(name);\r\n }, [name]);\r\n\r\n const height = useMemo(() => {\r\n return HumanData.fetchHeight(name);\r\n }, [name]);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n HumanData.fetchLabel(name, lang) +\r\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang)\r\n );\r\n }, [name, locked, language, cx, cy]);\r\n\r\n // attach parent dom element if parent is not Ground\r\n useEffect(() => {\r\n const parentObject = getParentObject();\r\n if (parentObject && groupRef.current) {\r\n parentObject.add(groupRef.current);\r\n }\r\n }, [contentRef]);\r\n\r\n // return null if parent is Ground\r\n const getParentObject = () => {\r\n if (parentId !== GROUND_ID && contentRef?.current) {\r\n return Util.getObjectChildById(contentRef.current, parentId);\r\n }\r\n return null;\r\n };\r\n\r\n useFrame(({ camera }) => {\r\n // rotation\r\n if (groupRef.current) {\r\n const { rot: parentWorldRotation } = Util.getWorldDataById(parentId);\r\n if (!orthographic) {\r\n const { x: cameraX, y: cameraY } = camera.position;\r\n const { x: currX, y: currY } = groupRef.current.localToWorld(new Vector3());\r\n groupRef.current.rotation.set(0, 0, -Math.atan2(cameraX - currX, cameraY - currY) - parentWorldRotation);\r\n } else {\r\n groupRef.current.rotation.set(HALF_PI, Math.PI - parentWorldRotation, 0);\r\n }\r\n }\r\n });\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n state.selectedElementHeight = humanModel.lz;\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n gl.domElement.style.cursor = 'move';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'default';\r\n }, []);\r\n\r\n const gender = observer ? HumanData.fetchGender(humanModel.name) : Gender.Male;\r\n const hatOffsetX = observer ? (humanModel.flip ? -1 : 1) * HumanData.fetchHatOffsetX(humanModel.name) : 0;\r\n const hatOffsetY = observer ? HumanData.fetchHatOffsetY(humanModel.name) : 0;\r\n\r\n if (!isRender) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === planeRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Human;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.humanRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === planeRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {/* highlight this person when he or she is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* mark this person with a hat when he or she is an observer */}\r\n {observer && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw handle */}\r\n {selected && !locked && (\r\n {\r\n if (e.button !== 2 && e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.humanRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n )}\r\n {hovered && !selected && (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Human);\r\n","export default __webpack_public_path__ + \"static/media/apple_spring.0cad3025.png\";","export default __webpack_public_path__ + \"static/media/apple_summer.46de7d87.png\";","export default __webpack_public_path__ + \"static/media/apple_fall.27ba1ce5.png\";","export default __webpack_public_path__ + \"static/media/apple_winter.d23599a6.png\";","export default __webpack_public_path__ + \"static/media/birch_spring.6960e824.png\";","export default __webpack_public_path__ + \"static/media/birch_summer.59ae1138.png\";","export default __webpack_public_path__ + \"static/media/birch_fall.210e663d.png\";","export default __webpack_public_path__ + \"static/media/birch_winter.c4988403.png\";","export default __webpack_public_path__ + \"static/media/coconut.d38cdccd.png\";","export default __webpack_public_path__ + \"static/media/dogwood_spring.c53ecf05.png\";","export default __webpack_public_path__ + \"static/media/dogwood_summer.8f3157af.png\";","export default __webpack_public_path__ + \"static/media/dogwood_fall.cb8fd9b6.png\";","export default __webpack_public_path__ + \"static/media/dogwood_winter.745583bb.png\";","export default __webpack_public_path__ + \"static/media/elm_spring.a67f6f9c.png\";","export default __webpack_public_path__ + \"static/media/elm_summer.0e729b1c.png\";","export default __webpack_public_path__ + \"static/media/elm_fall.720b87ef.png\";","export default __webpack_public_path__ + \"static/media/elm_winter.49563d13.png\";","export default __webpack_public_path__ + \"static/media/fan_palm.dd78413a.png\";","export default __webpack_public_path__ + \"static/media/linden_spring.073d4e74.png\";","export default __webpack_public_path__ + \"static/media/linden_summer.7a1479da.png\";","export default __webpack_public_path__ + \"static/media/linden_fall.3e8bb305.png\";","export default __webpack_public_path__ + \"static/media/linden_winter.9af7eb0e.png\";","export default __webpack_public_path__ + \"static/media/magnolia_spring.8dc3ef2d.png\";","export default __webpack_public_path__ + \"static/media/magnolia_summer.00567305.png\";","export default __webpack_public_path__ + \"static/media/magnolia_fall.475b9098.png\";","export default __webpack_public_path__ + \"static/media/magnolia_winter.8a371c67.png\";","export default __webpack_public_path__ + \"static/media/maple_spring.e1e24394.png\";","export default __webpack_public_path__ + \"static/media/maple_summer.7b3e9753.png\";","export default __webpack_public_path__ + \"static/media/maple_fall.5e8e43bb.png\";","export default __webpack_public_path__ + \"static/media/maple_winter.37fba60e.png\";","export default __webpack_public_path__ + \"static/media/oak_spring.3b768daa.png\";","export default __webpack_public_path__ + \"static/media/oak_summer.54230708.png\";","export default __webpack_public_path__ + \"static/media/oak_fall.ba997613.png\";","export default __webpack_public_path__ + \"static/media/oak_winter.02087599.png\";","export default __webpack_public_path__ + \"static/media/pine.80a6a140.png\";","export default __webpack_public_path__ + \"static/media/spruce.dea2071b.png\";","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport AppleSpringImage from './resources/apple_spring.png';\nimport AppleSummerImage from './resources/apple_summer.png';\nimport AppleFallImage from './resources/apple_fall.png';\nimport AppleWinterImage from './resources/apple_winter.png';\nimport BirchSpringImage from './resources/birch_spring.png';\nimport BirchSummerImage from './resources/birch_summer.png';\nimport BirchFallImage from './resources/birch_fall.png';\nimport BirchWinterImage from './resources/birch_winter.png';\nimport CoconutImage from './resources/coconut.png';\nimport DogwoodSpringImage from './resources/dogwood_spring.png';\nimport DogwoodSummerImage from './resources/dogwood_summer.png';\nimport DogwoodFallImage from './resources/dogwood_fall.png';\nimport DogwoodWinterImage from './resources/dogwood_winter.png';\nimport ElmSpringImage from './resources/elm_spring.png';\nimport ElmSummerImage from './resources/elm_summer.png';\nimport ElmFallImage from './resources/elm_fall.png';\nimport ElmWinterImage from './resources/elm_winter.png';\nimport FanPalmImage from './resources/fan_palm.png';\nimport LindenSpringImage from './resources/linden_spring.png';\nimport LindenSummerImage from './resources/linden_summer.png';\nimport LindenFallImage from './resources/linden_fall.png';\nimport LindenWinterImage from './resources/linden_winter.png';\nimport MagnoliaSpringImage from './resources/magnolia_spring.png';\nimport MagnoliaSummerImage from './resources/magnolia_summer.png';\nimport MagnoliaFallImage from './resources/magnolia_fall.png';\nimport MagnoliaWinterImage from './resources/magnolia_winter.png';\nimport MapleSpringImage from './resources/maple_spring.png';\nimport MapleSummerImage from './resources/maple_summer.png';\nimport MapleFallImage from './resources/maple_fall.png';\nimport MapleWinterImage from './resources/maple_winter.png';\nimport OakSpringImage from './resources/oak_spring.png';\nimport OakSummerImage from './resources/oak_summer.png';\nimport OakFallImage from './resources/oak_fall.png';\nimport OakWinterImage from './resources/oak_winter.png';\nimport PineImage from './resources/pine.png';\nimport SpruceImage from './resources/spruce.png';\nimport { TreeType } from './types';\nimport i18n from './i18n/i18n';\n\nexport class TreeData {\n static isEvergreen(type: TreeType): boolean {\n return type === TreeType.Spruce || type === TreeType.Pine || type === TreeType.FanPalm || type === TreeType.Coconut;\n }\n\n static isConic(type: TreeType): boolean {\n return type === TreeType.Spruce;\n }\n\n static fetchLabel(name: string, lang: {}): string {\n switch (name) {\n case TreeType.Apple:\n return i18n.t('tree.Apple', lang);\n case TreeType.Birch:\n return i18n.t('tree.Birch', lang);\n case TreeType.Coconut:\n return i18n.t('tree.Coconut', lang);\n case TreeType.Dogwood:\n return i18n.t('tree.Dogwood', lang);\n case TreeType.Elm:\n return i18n.t('tree.Elm', lang);\n case TreeType.FanPalm:\n return i18n.t('tree.FanPalm', lang);\n case TreeType.Linden:\n return i18n.t('tree.Linden', lang);\n case TreeType.Magnolia:\n return i18n.t('tree.Magnolia', lang);\n case TreeType.Maple:\n return i18n.t('tree.Maple', lang);\n case TreeType.Oak:\n return i18n.t('tree.Oak', lang);\n case TreeType.Spruce:\n return i18n.t('tree.Spruce', lang);\n default:\n return i18n.t('tree.Pine', lang);\n }\n }\n\n static fetchTheta(name: string): number {\n switch (name) {\n case TreeType.Apple:\n return 0.65 * Math.PI;\n case TreeType.Birch:\n return 0.72 * Math.PI;\n case TreeType.Coconut:\n return 0.5 * Math.PI;\n case TreeType.Dogwood:\n return 0.65 * Math.PI;\n case TreeType.Elm:\n return 0.78 * Math.PI;\n case TreeType.FanPalm:\n return 0.52 * Math.PI;\n case TreeType.Linden:\n return 0.75 * Math.PI;\n case TreeType.Magnolia:\n return 0.68 * Math.PI;\n case TreeType.Maple:\n return 0.65 * Math.PI;\n case TreeType.Oak:\n return 0.75 * Math.PI;\n case TreeType.Spruce:\n return Math.PI;\n default:\n return Math.PI * 0.5;\n }\n }\n\n // month is from 1 to 12\n static fetchTextureImage(name: string, dayOfYear: number, latitude: number, leafOutDay: number, leafOffDay: number) {\n let textureImg;\n const lastDayOfSpring = leafOutDay + 30;\n const lastDayOfSummer = leafOffDay - 30;\n const northernHemisphere = latitude > 0;\n switch (name) {\n case TreeType.Apple:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? AppleWinterImage : AppleSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? AppleSpringImage : AppleFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? AppleSummerImage : AppleWinterImage;\n } else {\n textureImg = northernHemisphere ? AppleFallImage : AppleSpringImage;\n }\n break;\n case TreeType.Birch:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? BirchWinterImage : BirchSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? BirchSpringImage : BirchFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? BirchSummerImage : BirchWinterImage;\n } else {\n textureImg = northernHemisphere ? BirchFallImage : BirchSpringImage;\n }\n break;\n case TreeType.Coconut:\n textureImg = CoconutImage;\n break;\n case TreeType.Dogwood:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? DogwoodWinterImage : DogwoodSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? DogwoodSpringImage : DogwoodFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? DogwoodSummerImage : DogwoodWinterImage;\n } else {\n textureImg = northernHemisphere ? DogwoodFallImage : DogwoodSpringImage;\n }\n break;\n case TreeType.Elm:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? ElmWinterImage : ElmSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? ElmSpringImage : ElmFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? ElmSummerImage : ElmWinterImage;\n } else {\n textureImg = northernHemisphere ? ElmFallImage : ElmSpringImage;\n }\n break;\n case TreeType.FanPalm:\n textureImg = FanPalmImage;\n break;\n case TreeType.Linden:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? LindenWinterImage : LindenSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? LindenSpringImage : LindenFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? LindenSummerImage : LindenWinterImage;\n } else {\n textureImg = northernHemisphere ? LindenFallImage : LindenSpringImage;\n }\n break;\n case TreeType.Magnolia:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? MagnoliaWinterImage : MagnoliaSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? MagnoliaSpringImage : MagnoliaFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? MagnoliaSummerImage : MagnoliaWinterImage;\n } else {\n textureImg = northernHemisphere ? MagnoliaFallImage : MagnoliaSpringImage;\n }\n break;\n case TreeType.Maple:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? MapleWinterImage : MapleSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? MapleSpringImage : MapleFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? MapleSummerImage : MapleWinterImage;\n } else {\n textureImg = northernHemisphere ? MapleFallImage : MapleSpringImage;\n }\n break;\n case TreeType.Oak:\n if (dayOfYear >= leafOffDay || dayOfYear <= leafOutDay) {\n textureImg = northernHemisphere ? OakWinterImage : OakSummerImage;\n } else if (dayOfYear > leafOutDay && dayOfYear <= lastDayOfSpring) {\n textureImg = northernHemisphere ? OakSpringImage : OakFallImage;\n } else if (dayOfYear > lastDayOfSpring && dayOfYear <= lastDayOfSummer) {\n textureImg = northernHemisphere ? OakSummerImage : OakWinterImage;\n } else {\n textureImg = northernHemisphere ? OakFallImage : OakSpringImage;\n }\n break;\n case TreeType.Spruce:\n textureImg = SpruceImage;\n break;\n default:\n textureImg = PineImage;\n }\n return textureImg;\n }\n}\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport {\r\n DoubleSide,\r\n Group,\r\n Mesh,\r\n MeshDepthMaterial,\r\n RepeatWrapping,\r\n RGBADepthPacking,\r\n TextureLoader,\r\n Vector3,\r\n} from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\r\nimport { Billboard, Box, Cone, Line, Plane, Sphere } from '@react-three/drei';\r\nimport {\r\n DEFAULT_LEAF_OFF_DAY,\r\n DEFAULT_LEAF_OUT_DAY,\r\n GROUND_ID,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_COLOR_1,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n TWO_PI,\r\n} from '../constants';\r\nimport { TreeModel } from '../models/TreeModel';\r\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType, TreeType } from '../types';\r\nimport i18n from '../i18n/i18n';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { Util } from '../Util';\r\nimport { TreeData } from '../TreeData';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Tree = ({\r\n parentId,\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n lz,\r\n name = TreeType.Pine,\r\n flip = false,\r\n locked = false,\r\n showModel = false,\r\n showLabel = false,\r\n}: TreeModel) => {\r\n let isRender = false;\r\n useStore((state) => {\r\n if (parentId === GROUND_ID) {\r\n isRender = true;\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n isRender = true;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n const removeElementById = useStore(Selector.removeElementById);\r\n useEffect(() => {\r\n if (!isRender) {\r\n removeElementById(id, false);\r\n }\r\n }, [isRender]);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const leafDayOfYear1 = useStore(Selector.world.leafDayOfYear1) ?? DEFAULT_LEAF_OUT_DAY;\r\n const leafDayOfYear2 = useStore(Selector.world.leafDayOfYear2) ?? DEFAULT_LEAF_OFF_DAY;\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const selectMe = useStore(Selector.selectMe);\r\n const getElementById = useStore(Selector.getElementById);\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const selected = useSelected(id);\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const { gl } = useThree();\r\n\r\n const contentRef = useRefStore((state) => state.contentRef);\r\n const groupRef = useRef(null);\r\n const solidTreeRef = useRef(null);\r\n const shadowTreeRef = useRef(null);\r\n const trunkMeshRef = useRef(null);\r\n const interactionPlaneRef = useRef(null);\r\n const resizeHandleTopRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n const treeModel = useMemo(() => getElementById(id) as TreeModel, [id]);\r\n\r\n const dayOfYear = useMemo(() => {\r\n return Util.dayOfYear(new Date(date));\r\n }, [date]);\r\n\r\n const noLeaves = useMemo(() => {\r\n return (\r\n !TreeData.isEvergreen(treeModel ? treeModel.name : TreeType.Dogwood) &&\r\n (latitude > 0\r\n ? dayOfYear < leafDayOfYear1 || dayOfYear > leafDayOfYear2\r\n : dayOfYear >= leafDayOfYear1 && dayOfYear <= leafDayOfYear2)\r\n );\r\n }, [dayOfYear, leafDayOfYear1, leafDayOfYear2, latitude, treeModel?.name]);\r\n\r\n const fileChangedRef = useRef(false);\r\n const fileChangedState = useStore(Selector.fileChanged);\r\n\r\n if (fileChangedState !== fileChangedRef.current) {\r\n fileChangedRef.current = fileChangedState;\r\n if (contentRef?.current && groupRef.current) {\r\n contentRef.current.add(groupRef.current);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (parentId !== GROUND_ID) {\r\n const obj = getParentObject();\r\n if (obj && groupRef.current) {\r\n obj.add(groupRef.current);\r\n }\r\n }\r\n }, [fileChangedState]);\r\n\r\n // attach parent dom element if parent is not Ground\r\n useEffect(() => {\r\n const parentObject = getParentObject();\r\n if (parentObject && groupRef.current) {\r\n parentObject.add(groupRef.current);\r\n }\r\n }, [contentRef]);\r\n\r\n const textureLoader = useMemo(() => {\r\n return new TextureLoader().load(\r\n TreeData.fetchTextureImage(name, dayOfYear, latitude, leafDayOfYear1, leafDayOfYear2),\r\n (texture) => {\r\n if (flip) {\r\n texture.wrapS = RepeatWrapping;\r\n texture.repeat.x = -1;\r\n }\r\n setTexture(texture);\r\n setUpdateFlag(!updateFlag);\r\n },\r\n );\r\n }, [name, dayOfYear, latitude, flip, leafDayOfYear1, leafDayOfYear2]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (treeModel?.label ? treeModel.label : TreeData.fetchLabel(name, lang)) +\r\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (treeModel?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [treeModel?.label, name, cx, cy, locked, language]);\r\n\r\n const theta = useMemo(() => {\r\n return TreeData.fetchTheta(name);\r\n }, [name]);\r\n\r\n const customDepthMaterial = new MeshDepthMaterial({\r\n depthPacking: RGBADepthPacking,\r\n map: texture,\r\n alphaTest: 0.1,\r\n });\r\n\r\n const hx = lx / 2;\r\n const hz = lz / 2;\r\n const positionTop = useMemo(() => new Vector3(0, 0, hz), [hz]);\r\n const positionLeft = useMemo(() => new Vector3(-hx, 0, 0), [hx]);\r\n const positionRight = useMemo(() => new Vector3(hx, 0, 0), [hx]);\r\n const positionLower = useMemo(() => new Vector3(0, -hx, 0), [hx]);\r\n const positionUpper = useMemo(() => new Vector3(0, hx, 0), [hx]);\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n state.selectedElementHeight = treeModel.lz;\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n gl.domElement.style.cursor = 'move';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'default';\r\n }, []);\r\n\r\n // return null if parent is Ground\r\n const getParentObject = () => {\r\n if (parentId !== GROUND_ID && contentRef?.current) {\r\n return Util.getObjectChildById(contentRef.current, parentId);\r\n }\r\n return null;\r\n };\r\n\r\n useFrame(({ camera }) => {\r\n // rotation\r\n if (solidTreeRef.current && groupRef.current && shadowTreeRef.current && interactionPlaneRef.current) {\r\n const { rot: parentWorldRotation } = Util.getWorldDataById(parentId);\r\n const { x: cameraX, y: cameraY } = camera.position;\r\n const { x: currX, y: currY } = groupRef.current.position;\r\n const { x: sunlightX, y: sunlightY } = useStore.getState().sunlightDirection;\r\n const parentObject = getParentObject();\r\n if (parentObject) {\r\n const worldPosition = groupRef.current.localToWorld(new Vector3());\r\n const e = Math.atan2(cameraX - worldPosition.x, cameraY - worldPosition.y) + parentWorldRotation;\r\n solidTreeRef.current.rotation.set(HALF_PI, -e, 0);\r\n interactionPlaneRef.current.rotation.set(-HALF_PI, e, 0);\r\n shadowTreeRef.current.rotation.set(HALF_PI, -Math.atan2(sunlightX, sunlightY) - parentWorldRotation, 0);\r\n } else {\r\n const e = Math.atan2(cameraX - currX, cameraY - currY);\r\n solidTreeRef.current.rotation.set(HALF_PI, -e, 0);\r\n interactionPlaneRef.current.rotation.set(-HALF_PI, e, 0);\r\n shadowTreeRef.current.rotation.set(HALF_PI, -Math.atan2(sunlightX, sunlightY), 0);\r\n }\r\n }\r\n });\r\n\r\n const handleSize = MOVE_HANDLE_RADIUS * 3;\r\n\r\n return (\r\n <>\r\n {isRender ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* cast shadow */}\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* simulation model. use double side as some rays may intersect from backside */}\r\n {TreeData.isConic(name) ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n\r\n {/* billboard for interactions (don't use a plane as it may become unselected at some angle) */}\r\n \r\n {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === trunkMeshRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Tree;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.treeRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === trunkMeshRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n }}\r\n />\r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* draw handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* move handle */}\r\n {\r\n if (e.button !== 2 && e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.treeRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {!orthographic && (\r\n <>\r\n {/* handle for resizing height */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Top);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {/* left handle for resizing crown spread */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {/* right handle for resizing crown spread */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {/* lower handle for resizing crown spread */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n {/* upper handle for resizing crown spread */}\r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Tree);\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport * as React from 'react';\nimport { Mesh } from 'three';\nimport { ParabolicCylinderGeometry } from '../js/ParabolicCylinderGeometry';\nimport { ParaboloidGeometry } from '../js/ParaboloidGeometry';\n\nexport type Args = T extends new (...args: any) => any ? ConstructorParameters : T;\nexport type ShapeProps = Omit & {\n args?: Args;\n children?: React.ReactNode;\n};\n\nfunction create(type: string) {\n const El: any = type + 'Geometry';\n return React.forwardRef(({ args, children, ...props }: ShapeProps, ref) => (\n } {...props}>\n \n {children}\n \n ));\n}\n\nexport const ParabolicCylinder = create('ParabolicCylinder');\nexport const Paraboloid = create('Paraboloid');\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { DAILY_LAG_IN_MINUTES, MINUTES_OF_DAY, OMEGA_DAY, OMEGA_YEAR, YEARLY_LAG_IN_DAYS } from './analysisConstants';\r\nimport { Util } from '../Util';\r\nimport { SunMinutes } from './SunMinutes';\r\nimport { BuildingCompletionStatus, DiurnalTemperatureModel, ObjectType } from '../types';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\n\r\nexport enum CheckStatus {\r\n NO_BUILDING = 3,\r\n AT_LEAST_ONE_BAD_NO_GOOD = 2,\r\n AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD = 1,\r\n OK = 0,\r\n}\r\n\r\nexport interface CheckResult {\r\n status: CheckStatus;\r\n buildingCompletion?: BuildingCompletionStatus;\r\n}\r\n\r\nexport const U_VALUE_OPENING = 50;\r\n\r\nexport const checkBuilding = (\r\n elements: ElementModel[],\r\n countElementsByType: Function,\r\n getChildrenOfType: Function,\r\n): CheckResult => {\r\n const foundationCount = countElementsByType(ObjectType.Foundation);\r\n if (foundationCount === 0) return { status: CheckStatus.NO_BUILDING } as CheckResult;\r\n let atLeastOneGood = false;\r\n let atLeastOneBad = false;\r\n let errorType = undefined;\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n if (f.notBuilding) continue;\r\n const walls = getChildrenOfType(ObjectType.Wall, f.id);\r\n if (walls.length > 0) {\r\n const completionStatus = Util.getBuildingCompletionStatus(f, elements);\r\n if (completionStatus === BuildingCompletionStatus.COMPLETE) {\r\n atLeastOneGood = true;\r\n } else {\r\n atLeastOneBad = true;\r\n errorType = completionStatus;\r\n }\r\n } else {\r\n atLeastOneBad = true;\r\n }\r\n }\r\n }\r\n if (atLeastOneBad && !atLeastOneGood)\r\n return { status: CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD, buildingCompletion: errorType } as CheckResult;\r\n if (atLeastOneBad && atLeastOneGood) return { status: CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD } as CheckResult;\r\n return { status: CheckStatus.OK } as CheckResult;\r\n};\r\n\r\n// use the darkness of color to approximate light absorption\r\nexport const getLightAbsorption = (element: ElementModel) => {\r\n if (!element.color) return 0.5;\r\n // catch some common cases\r\n const lc = element.color.toLowerCase();\r\n if (lc === 'white') return 0.05;\r\n if (lc === 'black') return 0.95;\r\n const bigint = parseInt(element.color.substring(1), 16);\r\n const r = (bigint >> 16) & 255;\r\n const g = (bigint >> 8) & 255;\r\n const b = bigint & 255;\r\n let min = Math.min(r, g);\r\n min = Math.min(min, b);\r\n let max = Math.max(r, g);\r\n max = Math.max(max, b);\r\n return Math.min(0.95, Math.max(0.05, 1 - (min + max) / 510));\r\n};\r\n\r\n/*\r\n If the lowest outside temperature is higher than the threshold, don't turn on the heater.\r\n If the highest outside temperature is lower than the threshold, don't turn on the air conditioner.\r\n*/\r\nexport const adjustEnergyUsage = (\r\n outsideTemperatureRange: { high: number; low: number },\r\n heatExchange: number,\r\n setpoint: number,\r\n threshold: number,\r\n) => {\r\n if (\r\n (heatExchange < 0 && outsideTemperatureRange.low >= setpoint - threshold) ||\r\n (heatExchange > 0 && outsideTemperatureRange.high <= setpoint + threshold)\r\n ) {\r\n return 0;\r\n }\r\n // negative heat exchange goes to heater, positive heat exchange goes to air conditioner\r\n return heatExchange;\r\n};\r\n\r\n// interpolate between the lowest and highest temperatures of the day\r\n// to get the temperature of a given minute in the day\r\nexport const getOutsideTemperatureAtMinute = (\r\n hi: number,\r\n lo: number,\r\n model: DiurnalTemperatureModel,\r\n highestTemperatureTimeInMinutes: number,\r\n sunMinutes: SunMinutes,\r\n minute: number,\r\n) => {\r\n if (model === DiurnalTemperatureModel.Sinusoidal) {\r\n return 0.5 * (hi + lo) - 0.5 * (hi - lo) * Math.cos(OMEGA_DAY * (minute - (highestTemperatureTimeInMinutes - 720)));\r\n }\r\n const mean = 0.5 * (hi + lo);\r\n const ampl = 0.5 * (hi - lo);\r\n const day = sunMinutes.daylight();\r\n // day time\r\n if (minute > sunMinutes.sunrise && minute < sunMinutes.sunset) {\r\n return mean + ampl * Math.cos((Math.PI / day) * (minute - highestTemperatureTimeInMinutes));\r\n }\r\n const night = MINUTES_OF_DAY - day;\r\n const temperatureAtSunset =\r\n mean + ampl * Math.cos((Math.PI / day) * (sunMinutes.sunset - highestTemperatureTimeInMinutes));\r\n const b = 6;\r\n // after sunset\r\n if (minute > sunMinutes.sunset) {\r\n const minutesAfterSunset = minute - sunMinutes.sunset;\r\n return lo + (temperatureAtSunset - lo) * Math.exp((-b * minutesAfterSunset) / night);\r\n }\r\n // before sunrise\r\n const minutesAfterSunset = minute + 23 * 60 - sunMinutes.sunset;\r\n return lo + (temperatureAtSunset - lo) * Math.exp((-b * minutesAfterSunset) / night);\r\n};\r\n\r\n// we only know the average lowest and highest temperatures of the months. So we have to interpolate between these monthly data to get the daily data.\r\nexport const computeOutsideTemperature = (day: Date, los: number[], his: number[]) => {\r\n const currentYear = day.getFullYear();\r\n const currentMonth = day.getMonth();\r\n const dayInMonth = day.getDate();\r\n const daysOfCurrentMonth = Util.daysOfMonth(currentMonth, currentYear);\r\n const halfOfCurrentMonth = daysOfCurrentMonth / 2;\r\n\r\n // interpolate the temperatures\r\n let month1: number;\r\n let month2: number;\r\n let weight;\r\n if (dayInMonth < halfOfCurrentMonth) {\r\n // use previous month\r\n month1 = currentMonth - 1;\r\n if (month1 < 0) {\r\n month1 = 11;\r\n }\r\n month2 = currentMonth;\r\n const halfOfPreviousMonth = Util.daysOfMonth(month1, currentYear) / 2;\r\n const length = halfOfPreviousMonth + halfOfCurrentMonth;\r\n weight = (dayInMonth + halfOfPreviousMonth) / length;\r\n } else {\r\n // use next month\r\n month1 = currentMonth;\r\n month2 = currentMonth + 1;\r\n if (month2 > 11) {\r\n month2 = 0;\r\n }\r\n const halfOfNextMonth = Util.daysOfMonth(month2, currentYear) / 2;\r\n const length = halfOfCurrentMonth + halfOfNextMonth;\r\n weight = (dayInMonth - halfOfCurrentMonth) / length;\r\n }\r\n\r\n const min = los[month1] + (los[month2] - los[month1]) * weight;\r\n const max = his[month1] + (his[month2] - his[month1]) * weight;\r\n\r\n return { low: min, high: max };\r\n};\r\n\r\n// calculate the average ground temperature of a given day using the Kusuda formula:\r\n// http://soilphysics.okstate.edu/software/SoilTemperature/document.pdf\r\nexport const calculateTemperatureOnDay = (\r\n latitude: number,\r\n day: number,\r\n los: number[],\r\n his: number[],\r\n thermalDiffusivity: number,\r\n depth: number,\r\n): number => {\r\n const n = los.length;\r\n let average = 0;\r\n let hiMax = -1000,\r\n hiMin = 1000,\r\n loMax = -1000,\r\n loMin = 1000;\r\n for (let i = 0; i < n; i++) {\r\n average += his[i] + los[i];\r\n if (hiMax < his[i]) {\r\n hiMax = his[i];\r\n }\r\n if (loMax < los[i]) {\r\n loMax = los[i];\r\n }\r\n if (hiMin > his[i]) {\r\n hiMin = his[i];\r\n }\r\n if (loMin > los[i]) {\r\n loMin = los[i];\r\n }\r\n }\r\n average /= 2 * n;\r\n const amplitude = 0.25 * (hiMax - hiMin + loMax - loMin);\r\n const d2 = depth * Math.sqrt(OMEGA_YEAR / (2.0 * thermalDiffusivity));\r\n if (latitude > 0) {\r\n return average - amplitude * Math.exp(-d2) * Math.cos(OMEGA_YEAR * (day - YEARLY_LAG_IN_DAYS) - d2);\r\n }\r\n return average - amplitude * Math.exp(-d2) * Math.cos(Math.PI + OMEGA_YEAR * (day - YEARLY_LAG_IN_DAYS) - d2);\r\n};\r\n\r\nexport const getGroundTemperatureAtMinute = (\r\n latitude: number,\r\n day: number,\r\n minute: number,\r\n los: number[],\r\n his: number[],\r\n highestTemperatureTimeInMinutes: number,\r\n airTemperatureFluctuationAmplitudeOfDay: number,\r\n thermalDiffusivity: number,\r\n depth: number,\r\n): number => {\r\n return (\r\n calculateTemperatureOnDay(latitude, day, los, his, thermalDiffusivity, depth) -\r\n Math.exp(-depth * Math.sqrt(OMEGA_DAY / (2.0 * thermalDiffusivity))) *\r\n airTemperatureFluctuationAmplitudeOfDay *\r\n Math.cos(OMEGA_DAY * (minute - (highestTemperatureTimeInMinutes - 720) - DAILY_LAG_IN_MINUTES))\r\n );\r\n};\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\r\nimport { BackSide, CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from '../types';\r\nimport { Util } from '../Util';\r\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\r\nimport { getSunDirection } from '../analysis/sunTools';\r\nimport i18n from '../i18n/i18n';\r\nimport { LineData } from './LineData';\r\nimport { ParabolicCylinder } from './shapes';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useDataStore } from '../stores/commonData';\r\nimport { useSelected } from './hooks';\r\n\r\nconst ParabolicTrough = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz = 0.1,\r\n reflectance = 0.9,\r\n absorberTubeRadius = 0.05,\r\n latusRectum = 2,\r\n tiltAngle,\r\n relativeAzimuth,\r\n moduleLength,\r\n poleHeight,\r\n poleRadius,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.5,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n}: ParabolicTroughModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const sunlightDirection = useStore(Selector.sunlightDirection);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [numberOfModules, setNumberOfModules] = useState(1);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const frontSideRef = useRef();\r\n const backSideRef = useRef();\r\n const moveHandleRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const pointerDown = useRef(false);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const parabolaSegments = 16;\r\n const night = sunlightDirection.z <= 0;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = poleHeight + hx;\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = actualPoleHeight + hz + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const depth = (hx * hx) / latusRectum; // the distance from the bottom to the aperture plane\r\n const focalLength = 0.25 * latusRectum;\r\n const positionLL = new Vector3(-hx, -hy, hz + depth);\r\n const positionUL = new Vector3(-hx, hy, hz + depth);\r\n const positionLR = new Vector3(hx, -hy, hz + depth);\r\n const positionUR = new Vector3(hx, hy, hz + depth);\r\n const trough = useMemo(() => getElementById(id) as ParabolicTroughModel, [id]);\r\n\r\n useEffect(() => {\r\n if (trough && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(trough.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n setNumberOfModules(Math.max(1, Math.round(ly / moduleLength)));\r\n }, [ly, moduleLength]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (trough?.label ? trough.label : i18n.t('shared.ParabolicTroughElement', lang)) +\r\n (trough?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (trough?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [trough?.label, locked, language, cx, cy, cz]);\r\n\r\n // in model coordinate system\r\n const euler = useMemo(() => {\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = useMemo(() => getElementById(parentId)?.rotation[2], [parentId]);\r\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (sunDirection.z > 0) {\r\n return new Euler(0, Math.atan2(rotatedSunDirection.x, rotatedSunDirection.z), 0, 'ZXY');\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }, [rot, sunDirection, tiltAngle, relativeAzimuth]);\r\n\r\n // FIXME: This only works when the foundation has zero azimuth or the time is at noon\r\n const reflectedLightShift = useMemo(() => {\r\n if (sunDirection.z > 0) {\r\n const cosRot = rot ? Math.cos(rot) : 1;\r\n const sinRot = rot ? Math.sin(rot) : 0;\r\n // how much the reflected light should shift in the direction of the receiver tube?\r\n return (\r\n (-focalLength * (sunDirection.x * sinRot + sunDirection.y * cosRot)) /\r\n Math.hypot(sunDirection.x, sunDirection.z)\r\n );\r\n }\r\n return 0;\r\n }, [sunDirection, rot, focalLength]);\r\n\r\n const focusPoint = new Vector3(0, reflectedLightShift, focalLength).applyEuler(relativeEuler);\r\n const sunPoint = sunDirection.clone().multiplyScalar(sunBeamLength).applyEuler(new Euler(-euler.x, 0, -euler.z));\r\n\r\n const poleZ = -(actualPoleHeight + lz) / 2;\r\n\r\n const poles = useMemo(() => {\r\n const array: Vector3[] = [];\r\n const cosAz = Math.cos(relativeAzimuth) * moduleLength;\r\n const sinAz = Math.sin(relativeAzimuth) * moduleLength;\r\n const i2 = numberOfModules / 2 - 0.5;\r\n for (let i = 0; i < numberOfModules; i++) {\r\n array.push(new Vector3(-(i - i2) * sinAz, (i - i2) * cosAz, poleZ));\r\n }\r\n return array;\r\n }, [numberOfModules, moduleLength, poleZ, relativeAzimuth]);\r\n\r\n const moduleLines = useMemo(() => {\r\n const array: LineData[] = [];\r\n const dy = ly / numberOfModules;\r\n const t0 = -lx / latusRectum;\r\n const dt = (-2 * t0) / parabolaSegments;\r\n for (let i = 0; i <= numberOfModules; i++) {\r\n const line: Vector3[] = [];\r\n for (let j = 0; j <= parabolaSegments; j++) {\r\n const t = t0 + j * dt;\r\n line.push(new Vector3((latusRectum * t) / 2, -hy + i * dy, (latusRectum * t * t) / 4));\r\n }\r\n array.push({ points: line } as LineData);\r\n }\r\n return array;\r\n }, [lx, ly, numberOfModules, latusRectum]);\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const detailed = elements.length < 50 && moduleLines.length < 10;\r\n const radialSegmentsPole = detailed ? 4 : 2;\r\n\r\n return (\r\n \r\n \r\n {/* draw front side parabolic cylinder */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === frontSideRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.ParabolicTrough;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === frontSideRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {/* draw back side parabolic cylinder */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === backSideRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.ParabolicTrough;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === backSideRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n\r\n {moduleLines &&\r\n moduleLines.map((lineData, index) => {\r\n return (\r\n \r\n {detailed && (\r\n \r\n )}\r\n {(index === 0 || index === moduleLines.length - 1 || detailed) && (\r\n \r\n )}\r\n \r\n );\r\n })}\r\n {detailed && (\r\n \r\n )}\r\n {detailed && (\r\n \r\n )}\r\n\r\n {/* absorber tube along the focal line (focal length = latus rectum / 4) */}\r\n \r\n \r\n \r\n\r\n {/* simulation element */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* draw move handle */}\r\n {\r\n hoverHandle(e, MoveHandleType.Top);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n\r\n {/* draw resize handles */}\r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {/* draw poles */}\r\n {actualPoleHeight > 0 &&\r\n poles.map((p, i) => {\r\n if (i % 5 !== 0 && !detailed) return ;\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/* draw sun beam */}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n )}\r\n\r\n {/* draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(ParabolicTrough);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Circle, Cylinder, Line, Sphere, useTexture } from '@react-three/drei';\r\nimport { AdditiveBlending, BackSide, CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n TWO_PI,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../constants';\r\nimport {\r\n ActionType,\r\n MoveHandleType,\r\n ObjectType,\r\n ParabolicDishStructureType,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n} from '../types';\r\nimport { Util } from '../Util';\r\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\r\nimport { getSunDirection } from '../analysis/sunTools';\r\nimport i18n from '../i18n/i18n';\r\nimport { LineData } from './LineData';\r\nimport { Paraboloid } from './shapes';\r\nimport GlowImage from '../resources/glow.png';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useDataStore } from '../stores/commonData';\r\nimport { useSelected } from './hooks';\r\n\r\nconst ParabolicDish = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz = 0.1,\r\n reflectance = 0.9,\r\n structureType = ParabolicDishStructureType.CentralPole,\r\n receiverRadius = 0.25,\r\n receiverPoleRadius = 0.1,\r\n latusRectum = 2,\r\n tiltAngle,\r\n relativeAzimuth,\r\n poleHeight,\r\n poleRadius = 0.2,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.25,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n}: ParabolicDishModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const sunlightDirection = useStore(Selector.sunlightDirection);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const frontSideRef = useRef();\r\n const backSideRef = useRef();\r\n const moveHandleRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const pointerDown = useRef(false);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const radialSegments = 32;\r\n const depthSegments = 8;\r\n const night = sunlightDirection.z <= 0;\r\n\r\n const hx = lx / 2; // lx and ly both represent the diameter of the dish, so they are identical\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = poleHeight + hx;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = actualPoleHeight + hz + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const depth = (hx * hx) / latusRectum; // the distance from the bottom to the aperture plane\r\n const focalLength = 0.25 * latusRectum;\r\n const positionLL = new Vector3(-hx, -hy, hz + depth);\r\n const positionUL = new Vector3(-hx, hy, hz + depth);\r\n const positionLR = new Vector3(hx, -hy, hz + depth);\r\n const positionUR = new Vector3(hx, hy, hz + depth);\r\n const dish = useMemo(() => getElementById(id) as ParabolicDishModel, [id]);\r\n const glowTexture = useTexture(GlowImage);\r\n const haloRadius = receiverRadius + 1;\r\n\r\n useEffect(() => {\r\n if (dish && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(dish.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (dish?.label ? dish.label : i18n.t('shared.ParabolicDishElement', lang)) +\r\n (dish?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (dish?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [dish?.label, locked, language, cx, cy, cz]);\r\n\r\n // in model coordinate system\r\n const euler = useMemo(() => {\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = useMemo(() => getElementById(parentId)?.rotation[2], [parentId]);\r\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (sunDirection.z > 0) {\r\n const r = Math.hypot(rotatedSunDirection.x, rotatedSunDirection.y);\r\n return new Euler(\r\n Math.atan2(r, rotatedSunDirection.z),\r\n 0,\r\n Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI,\r\n 'ZXY',\r\n );\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }, [sunDirection, tiltAngle, relativeAzimuth]);\r\n\r\n const poleZ = -(actualPoleHeight + lz) / 2;\r\n const detailed = elements.length < 50;\r\n\r\n const wireframeLines = useMemo(() => {\r\n const array: LineData[] = [];\r\n if (detailed) {\r\n // draw rim lines\r\n const outer: Vector3[] = [];\r\n const inner: Vector3[] = [];\r\n let angle, cos, sin;\r\n const depth4 = 0.25 * depth;\r\n for (let i = 0; i <= radialSegments; i++) {\r\n angle = (TWO_PI * i) / radialSegments;\r\n cos = Math.cos(angle);\r\n sin = Math.sin(angle);\r\n outer.push(new Vector3(hx * cos, hx * sin, depth));\r\n inner.push(new Vector3((hx * cos) / 2, (hx * sin) / 2, depth4));\r\n }\r\n array.push({ points: outer } as LineData);\r\n array.push({ points: inner } as LineData);\r\n // draw radial lines\r\n for (let i = 0; i < 12; i++) {\r\n angle = (TWO_PI * i) / 12;\r\n cos = Math.cos(angle);\r\n sin = Math.sin(angle);\r\n const line: Vector3[] = [];\r\n for (let j = 0; j <= depthSegments; j++) {\r\n const dx = j === 0 ? 0 : (j / depthSegments) * hx;\r\n line.push(new Vector3(dx * cos, dx * sin, (dx * dx) / latusRectum + 0.01));\r\n }\r\n array.push({ points: line } as LineData);\r\n }\r\n }\r\n return array;\r\n }, [hx, latusRectum]);\r\n\r\n const tripodLines = useMemo(() => {\r\n if (structureType === ParabolicDishStructureType.CentralPoleWithTripod) {\r\n const array: LineData[] = [];\r\n let angle;\r\n for (let i = 0; i < 3; i++) {\r\n angle = (TWO_PI * i) / 3;\r\n const line: Vector3[] = [];\r\n line.push(new Vector3(hx * Math.cos(angle), hx * Math.sin(angle), depth));\r\n line.push(new Vector3(0, 0, focalLength));\r\n array.push({ points: line } as LineData);\r\n }\r\n return array;\r\n }\r\n return undefined;\r\n }, [hx, latusRectum, structureType]);\r\n\r\n const quadrupodLines = useMemo(() => {\r\n if (structureType === ParabolicDishStructureType.Quadrupod) {\r\n const array: LineData[] = [];\r\n let angle;\r\n for (let i = 0; i < 4; i++) {\r\n angle = (TWO_PI * i) / 4;\r\n const line: Vector3[] = [];\r\n line.push(new Vector3(hx * Math.cos(angle), hx * Math.sin(angle), depth));\r\n line.push(new Vector3(0, 0, focalLength));\r\n array.push({ points: line } as LineData);\r\n }\r\n return array;\r\n }\r\n return undefined;\r\n }, [hx, latusRectum, structureType]);\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 3;\r\n const sunPoint = sunDirection.clone().multiplyScalar(sunBeamLength);\r\n const focalPoint = new Vector3(0, 0, focalLength).applyEuler(relativeEuler);\r\n\r\n return (\r\n \r\n \r\n {/* draw front side parabolic dish */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === frontSideRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.ParabolicDish;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === frontSideRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n {/* draw back side parabolic dish */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === backSideRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.ParabolicDish;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === backSideRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n\r\n {wireframeLines &&\r\n wireframeLines.length > 0 &&\r\n wireframeLines.map((lineData, index) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/* receiver at the focus (focal length = latus rectum / 4) */}\r\n \r\n \r\n \r\n {/* simple glow effect to create a halo */}\r\n {sunDirection.z > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {(structureType === ParabolicDishStructureType.CentralPole ||\r\n structureType === ParabolicDishStructureType.CentralPoleWithTripod) && (\r\n \r\n \r\n \r\n )}\r\n {structureType === ParabolicDishStructureType.CentralPoleWithTripod &&\r\n tripodLines &&\r\n tripodLines.map((lineData, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {structureType === ParabolicDishStructureType.Quadrupod &&\r\n quadrupodLines &&\r\n quadrupodLines.map((lineData, index) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/* simulation element */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* draw move handle */}\r\n {\r\n hoverHandle(e, MoveHandleType.Top);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n\r\n {/* draw resize handles */}\r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {/* draw poles */}\r\n {actualPoleHeight > 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw sun beam */}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n )}\r\n\r\n {/* draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(ParabolicDish);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\r\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType, SolarStructure } from '../types';\r\nimport { Util } from '../Util';\r\nimport { getSunDirection } from '../analysis/sunTools';\r\nimport i18n from '../i18n/i18n';\r\nimport { LineData } from './LineData';\r\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useDataStore } from '../stores/commonData';\r\nimport { useSelected } from './hooks';\r\n\r\nconst FresnelReflector = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz = 0.1,\r\n reflectance = 0.9,\r\n tiltAngle,\r\n relativeAzimuth,\r\n moduleLength,\r\n poleHeight,\r\n poleRadius = 0.1,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.5,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n receiverId,\r\n}: FresnelReflectorModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [numberOfModules, setNumberOfModules] = useState(1);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const baseRef = useRef();\r\n const moveHandleRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const pointerDown = useRef(false);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = poleHeight + hx;\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = actualPoleHeight + hz + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n const positionLL = new Vector3(-hx, -hy, hz);\r\n const positionUL = new Vector3(-hx, hy, hz);\r\n const positionLR = new Vector3(hx, -hy, hz);\r\n const positionUR = new Vector3(hx, hy, hz);\r\n const fresnelReflector = useMemo(() => getElementById(id) as FresnelReflectorModel, [id]);\r\n\r\n useEffect(() => {\r\n if (fresnelReflector && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(fresnelReflector.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n setNumberOfModules(Math.max(1, Math.round(ly / moduleLength)));\r\n }, [ly, moduleLength]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (fresnelReflector?.label ? fresnelReflector.label : i18n.t('shared.FresnelReflectorElement', lang)) +\r\n (fresnelReflector?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (fresnelReflector?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [fresnelReflector?.label, locked, language, cx, cy, cz]);\r\n\r\n // in model coordinate system\r\n const euler = useMemo(() => {\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = parent?.rotation[2];\r\n\r\n // TODO: how to get an updated version of the memorized receiver\r\n const receiver = receiverId && receiverId !== parentId ? getElementById(receiverId) : null;\r\n\r\n const receiverCenter = useMemo(() => {\r\n if (receiver) {\r\n if (receiver.type === ObjectType.Foundation) {\r\n const foundation = receiver as FoundationModel;\r\n if (foundation.solarStructure === SolarStructure.FocusPipe && foundation.solarAbsorberPipe) {\r\n // convert the receiver's coordinates into those relative to the center of this reflector\r\n return new Vector3(\r\n (foundation.cx - cx) * (rot ? Math.cos(rot) : 1),\r\n (foundation.cy - cy) * (rot ? Math.sin(rot) : 0),\r\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarAbsorberPipe.absorberHeight ?? 10),\r\n );\r\n }\r\n }\r\n } else {\r\n if (parent) {\r\n if (parent.type === ObjectType.Foundation) {\r\n const foundation = parent as FoundationModel;\r\n if (foundation.solarStructure === SolarStructure.FocusPipe && foundation.solarAbsorberPipe) {\r\n // convert the receiver's coordinates into those relative to the center of this reflector\r\n return new Vector3(\r\n (foundation.cx - cx) * (rot ? Math.cos(rot) : 1),\r\n (foundation.cy - cy) * (rot ? Math.sin(rot) : 0),\r\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarAbsorberPipe.absorberHeight ?? 10),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n }, [parent, cx, cy, cz, receiverId, receiver?.cx, receiver?.cy, receiver?.cz]);\r\n\r\n const shiftedReceiverCenter = useRef(new Vector3());\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (receiverCenter && sunDirection.z > 0) {\r\n // the rotation axis is in the north-south direction, so the relative azimuth is zero, which maps to (0, 1, 0)\r\n const rotationAxis = rot ? new Vector3(Math.sin(rot), Math.cos(rot), 0) : new Vector3(0, 1, 0);\r\n shiftedReceiverCenter.current.set(receiverCenter.x, receiverCenter.y, receiverCenter.z);\r\n // how much the reflected light should shift in the direction of the receiver pipe?\r\n const shift =\r\n sunDirection.z < ZERO_TOLERANCE\r\n ? 0\r\n : (-receiverCenter.z * (sunDirection.y * rotationAxis.y + sunDirection.x * rotationAxis.x)) / sunDirection.z;\r\n shiftedReceiverCenter.current.x += shift * rotationAxis.x;\r\n shiftedReceiverCenter.current.y -= shift * rotationAxis.y;\r\n const reflectorToReceiver = shiftedReceiverCenter.current.clone().normalize();\r\n let normalVector = reflectorToReceiver.add(sunDirection).normalize();\r\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\r\n normalVector = new Vector3(-0.001, 0, 1).normalize();\r\n }\r\n const sunDirectionClone = sunDirection.clone();\r\n if (rot) {\r\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\r\n sunDirectionClone.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\r\n }\r\n const delta = (sunDirectionClone.y / sunDirectionClone.z) * receiverCenter.z;\r\n shiftedReceiverCenter.current.x -= (shift - delta) * rotationAxis.x;\r\n shiftedReceiverCenter.current.y += (shift - delta) * rotationAxis.y;\r\n return new Euler(0, Math.atan2(normalVector.x, normalVector.z), 0, 'ZXY');\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }, [receiverCenter, sunDirection, tiltAngle, relativeAzimuth, rot, receiver?.cx, receiver?.cy, receiver?.cz]);\r\n\r\n const poleZ = -(actualPoleHeight + lz) / 2;\r\n\r\n const poles = useMemo(() => {\r\n const array: Vector3[] = [];\r\n const cosAz = Math.cos(relativeAzimuth) * moduleLength;\r\n const sinAz = Math.sin(relativeAzimuth) * moduleLength;\r\n const i2 = numberOfModules / 2 - 0.5;\r\n for (let i = 0; i < numberOfModules; i++) {\r\n array.push(new Vector3(-(i - i2) * sinAz, (i - i2) * cosAz, poleZ));\r\n }\r\n return array;\r\n }, [numberOfModules, moduleLength, poleZ, relativeAzimuth]);\r\n\r\n const moduleLines = useMemo(() => {\r\n const array: LineData[] = [];\r\n const dy = ly / numberOfModules;\r\n for (let i = 0; i <= numberOfModules; i++) {\r\n const line: Vector3[] = [];\r\n line.push(new Vector3(-hx, -hy + i * dy, hz));\r\n line.push(new Vector3(hx, -hy + i * dy, hz));\r\n array.push({ points: line } as LineData);\r\n }\r\n return array;\r\n }, [lx, ly, numberOfModules]);\r\n\r\n const baseSize = Math.max(1, Math.min(lx * 5, ly * 5, (lx + ly) / 16));\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n\r\n return (\r\n \r\n \r\n {/* draw the upper side of the reflector */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.FresnelReflector;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n\r\n {moduleLines &&\r\n moduleLines.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n\r\n {/* simulation element */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* draw move handle */}\r\n {\r\n hoverHandle(e, MoveHandleType.Top);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n\r\n {/* draw resize handles */}\r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {/* draw poles */}\r\n {actualPoleHeight > 0 &&\r\n poles.map((p, i) => {\r\n const radialSegments = elements.length < 100 ? 4 : 2;\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/* draw sun beam */}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n )}\r\n\r\n {/* draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(FresnelReflector);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cylinder, Line, Plane, Sphere } from '@react-three/drei';\r\nimport { CanvasTexture, Color, DoubleSide, Euler, FrontSide, Mesh, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport { HALF_PI, LOCKED_ELEMENT_SELECTION_COLOR, MOVE_HANDLE_RADIUS, UNIT_VECTOR_POS_Z } from '../constants';\r\nimport { ActionType, MoveHandleType, ObjectType, SolarStructure } from '../types';\r\nimport { Util } from '../Util';\r\nimport { getSunDirection } from '../analysis/sunTools';\r\nimport i18n from '../i18n/i18n';\r\nimport { FoundationModel } from '../models/FoundationModel';\r\nimport { HeliostatModel } from '../models/HeliostatModel';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { useDataStore } from '../stores/commonData';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Heliostat = ({\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz = 0.1,\r\n reflectance = 0.9,\r\n tiltAngle,\r\n relativeAzimuth,\r\n poleHeight,\r\n poleRadius = Math.min(lx, ly) / 20,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.5,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n towerId,\r\n}: HeliostatModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const getHeatmap = useDataStore(Selector.getHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [heatmapTexture, setHeatmapTexture] = useState(null);\r\n const baseRef = useRef();\r\n const moveHandleRef = useRef();\r\n const pointerDown = useRef(false);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const actualPoleHeight = poleHeight + Math.max(hx, hy);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = actualPoleHeight + hz + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n const heliostat = useMemo(() => getElementById(id) as HeliostatModel, [id]);\r\n\r\n useEffect(() => {\r\n if (heliostat && showSolarRadiationHeatmap) {\r\n const heatmap = getHeatmap(heliostat.id);\r\n if (heatmap) {\r\n setHeatmapTexture(Util.fetchHeatmapTexture(heatmap, solarRadiationHeatmapMaxValue ?? 5));\r\n }\r\n }\r\n }, [showSolarRadiationHeatmap, solarRadiationHeatmapMaxValue]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (heliostat?.label ? heliostat.label : i18n.t('shared.HeliostatElement', lang)) +\r\n (heliostat?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (heliostat?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [heliostat?.label, locked, language, cx, cy, cz]);\r\n\r\n // in model coordinate system\r\n const euler = useMemo(() => {\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n domElement.style.cursor = handle === MoveHandleType.Default ? 'move' : 'pointer';\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = parent?.rotation[2];\r\n\r\n // TODO: how to get an updated version of the memorized tower\r\n const tower = towerId && towerId !== parentId ? getElementById(towerId) : null;\r\n\r\n const receiverCenter = useMemo(() => {\r\n if (tower) {\r\n if (tower.type === ObjectType.Foundation) {\r\n const foundation = tower as FoundationModel;\r\n if (foundation.solarStructure === SolarStructure.FocusTower && foundation.solarPowerTower) {\r\n // convert the receiver's coordinates into those relative to the center of this heliostat\r\n return new Vector3(\r\n foundation.cx - cx,\r\n foundation.cy - cy,\r\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarPowerTower.towerHeight ?? 20),\r\n );\r\n }\r\n }\r\n } else {\r\n if (parent) {\r\n if (parent.type === ObjectType.Foundation) {\r\n const foundation = parent as FoundationModel;\r\n if (foundation.solarStructure === SolarStructure.FocusTower && foundation.solarPowerTower) {\r\n // convert the receiver's coordinates into those relative to the center of this heliostat\r\n return new Vector3(\r\n foundation.cx - cx,\r\n foundation.cy - cy,\r\n foundation.cz - cz + foundation.lz / 2 + (foundation.solarPowerTower.towerHeight ?? 20),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n }, [parent, cx, cy, cz, towerId, tower?.cx, tower?.cy, tower?.cz]);\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (receiverCenter && sunDirection.z > 0) {\r\n const heliostatToReceiver = receiverCenter.clone().normalize();\r\n let normalVector = heliostatToReceiver.add(sunDirection).normalize();\r\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\r\n normalVector = new Vector3(-0.001, 0, 1).normalize();\r\n }\r\n if (rot) {\r\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\r\n }\r\n // convert the normal vector to euler\r\n const r = Math.hypot(normalVector.x, normalVector.y);\r\n return new Euler(Math.atan2(r, normalVector.z), 0, Math.atan2(normalVector.y, normalVector.x) + HALF_PI, 'ZXY');\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }, [receiverCenter, sunDirection, tiltAngle, relativeAzimuth, rot, tower?.cx, tower?.cy, tower?.cz]);\r\n\r\n const poleZ = -(actualPoleHeight + lz) / 2;\r\n const baseSize = Math.max(1, (lx + ly) / 8);\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 4;\r\n\r\n return (\r\n \r\n \r\n {/* draw the upper side of the heliostat */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Heliostat;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {showSolarRadiationHeatmap && heatmapTexture ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n\r\n {/* simulation element */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move handle */}\r\n {selected && !locked && (\r\n {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n\r\n {/* draw poles */}\r\n {actualPoleHeight > 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw sun beam */}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n )}\r\n\r\n {/* draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Heliostat);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Box, Cone, Cylinder, Line, Plane, Ring, Sphere } from '@react-three/drei';\r\nimport { Color, DoubleSide, Euler, FrontSide, Mesh, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { useStore } from '../../stores/common';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n DEFAULT_SOLAR_PANEL_SHININESS,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_RADIUS,\r\n RESIZE_HANDLE_COLOR,\r\n RESIZE_HANDLE_SIZE,\r\n SOLAR_PANEL_BLACK_SPECULAR,\r\n SOLAR_PANEL_BLUE_SPECULAR,\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n ZERO_TOLERANCE,\r\n} from '../../constants';\r\nimport {\r\n ActionType,\r\n MoveHandleType,\r\n ObjectType,\r\n Orientation,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n TrackerType,\r\n} from '../../types';\r\nimport { Util } from '../../Util';\r\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\r\nimport { getSunDirection } from '../../analysis/sunTools';\r\nimport RotateHandle from '../../components/rotateHandle';\r\nimport { UndoableChange } from '../../undo/UndoableChange';\r\nimport i18n from '../../i18n/i18n';\r\nimport { LineData } from '../LineData';\r\nimport { useSolarPanelHeatmapTexture, useSolarPanelTexture } from './hooks';\r\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\r\nimport { PvModel } from 'src/models/PvModel';\r\nimport { useSelected } from '../hooks';\r\n\r\nconst SolarPanel = ({\r\n id,\r\n pvModelName = 'SPR-X21-335-BLK',\r\n cx,\r\n cy,\r\n cz,\r\n lx,\r\n ly,\r\n lz,\r\n tiltAngle,\r\n relativeAzimuth,\r\n trackerType = TrackerType.NO_TRACKER,\r\n poleHeight,\r\n poleRadius,\r\n poleSpacing,\r\n drawSunBeam,\r\n rotation = [0, 0, 0],\r\n normal = [0, 0, 1],\r\n color = 'white',\r\n lineColor = 'black',\r\n lineWidth = 0.1,\r\n showLabel = false,\r\n locked = false,\r\n parentId,\r\n orientation = Orientation.landscape,\r\n}: SolarPanelModel) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const elements = useStore(Selector.elements);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const solarPanelShininess = useStore(Selector.viewState.solarPanelShininess);\r\n const getElementById = useStore(Selector.getElementById);\r\n const selectMe = useStore(Selector.selectMe);\r\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const rotateHandleType = useStore(Selector.rotateHandleType);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const pvModules = useStore(Selector.pvModules);\r\n\r\n const selected = useSelected(id);\r\n\r\n const {\r\n gl: { domElement },\r\n camera,\r\n } = useThree();\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [hoveredHandle, setHoveredHandle] = useState(null);\r\n const [faceUp, setFaceUp] = useState();\r\n const baseRef = useRef();\r\n const moveHandleRef = useRef();\r\n const resizeHandleLowerRef = useRef();\r\n const resizeHandleUpperRef = useRef();\r\n const resizeHandleLeftRef = useRef();\r\n const resizeHandleRightRef = useRef();\r\n const tiltHandleRef = useRef();\r\n const pointerDown = useRef(false);\r\n const oldTiltAngleRef = useRef(0);\r\n const newTiltAngleRef = useRef(0);\r\n const solarPanelLinesRef = useRef();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n\r\n const sunBeamLength = Math.max(100, 10 * sceneRadius);\r\n const panelNormal = new Vector3().fromArray(normal);\r\n const pvModel = pvModules[pvModelName] as PvModel;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n if (parentId) {\r\n if (parent) {\r\n switch (parent.type) {\r\n case ObjectType.Foundation:\r\n cz = poleHeight + lz / 2 + parent.lz;\r\n if (Util.isZero(rotation[2])) {\r\n cx = parent.cx + cx * parent.lx;\r\n cy = parent.cy + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, 0);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = parent.cx + v.x;\r\n cy = parent.cy + v.y;\r\n }\r\n break;\r\n case ObjectType.Cuboid:\r\n const { pos, rot } = Util.getWorldDataById(parent.id);\r\n if (Util.isZero(rotation[2])) {\r\n cx = pos.x + cx * parent.lx;\r\n cy = pos.y + cy * parent.ly;\r\n } else {\r\n // we must rotate the real length, not normalized length\r\n const v = new Vector3(cx * parent.lx, cy * parent.ly, cz * parent.lz);\r\n v.applyAxisAngle(UNIT_VECTOR_POS_Z, rotation[2]);\r\n cx = pos.x + v.x;\r\n cy = pos.y + v.y;\r\n }\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Z)) {\r\n cz = poleHeight + lz / 2 + parent.lz;\r\n } else {\r\n cz = pos.z + cz * parent.lz;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (pvModel) {\r\n lz = Math.max(pvModel.thickness, 0.02);\r\n }\r\n\r\n const hx = lx / 2;\r\n const hy = ly / 2;\r\n const hz = lz / 2;\r\n const positionLL = new Vector3(-hx, -hy, hz);\r\n const positionUL = new Vector3(-hx, hy, hz);\r\n const positionLR = new Vector3(hx, -hy, hz);\r\n const positionUR = new Vector3(hx, hy, hz);\r\n const radialSegmentsPole = elements.length < 100 ? 4 : 2;\r\n const solarPanel = getElementById(id) as SolarPanelModel;\r\n\r\n useEffect(() => {\r\n if (pvModel) {\r\n let mx, my;\r\n if (orientation === Orientation.portrait) {\r\n mx = Math.max(1, Math.round(lx / pvModel.width));\r\n my = Math.max(1, Math.round(ly / pvModel.length));\r\n } else {\r\n mx = Math.max(1, Math.round(lx / pvModel.length));\r\n my = Math.max(1, Math.round(ly / pvModel.width));\r\n }\r\n solarPanelLinesRef.current = [];\r\n const dx = lx / mx;\r\n const dy = ly / my;\r\n for (let i = 0; i <= mx; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx + i * dx, -hy, lz), new Vector3(-hx + i * dx, hy, lz)],\r\n } as LineData);\r\n }\r\n for (let i = 0; i <= my; i++) {\r\n solarPanelLinesRef.current.push({\r\n points: [new Vector3(-hx, -hy + i * dy, lz), new Vector3(hx, -hy + i * dy, lz)],\r\n } as LineData);\r\n }\r\n }\r\n }, [orientation, pvModelName, lx, ly, lz]);\r\n\r\n useEffect(() => {\r\n const handlePointerUp = () => {\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDown.current = false;\r\n setShowTiltAngle(false);\r\n };\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n setFaceUp(Util.isSame(panelNormal, UNIT_VECTOR_POS_Z));\r\n }, [normal]);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n (solarPanel?.label ? solarPanel.label : i18n.t('shared.SolarPanelElement', lang)) +\r\n (solarPanel?.locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n (solarPanel?.label\r\n ? ''\r\n : '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ', ' +\r\n cz.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang))\r\n );\r\n }, [solarPanel?.label, locked, language, cx, cy, cz]);\r\n\r\n const euler = useMemo(() => {\r\n // east face in model coordinate system\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_X)) {\r\n return new Euler(HALF_PI, 0, rotation[2] + HALF_PI, 'ZXY');\r\n }\r\n // west face in model coordinate system\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_NEG_X)) {\r\n return new Euler(HALF_PI, 0, rotation[2] - HALF_PI, 'ZXY');\r\n }\r\n // north face in the model coordinate system\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Y)) {\r\n return new Euler(HALF_PI, 0, rotation[2] + Math.PI, 'ZXY');\r\n }\r\n // south face in the model coordinate system\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_NEG_Y)) {\r\n return new Euler(HALF_PI, 0, rotation[2], 'ZXY');\r\n }\r\n // top face in model coordinate system\r\n return new Euler(0, 0, rotation[2], 'ZXY');\r\n }, [normal, rotation]);\r\n\r\n const hoverHandle = (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === e.eventObject;\r\n if (intersected) {\r\n setHoveredHandle(handle);\r\n if (handle === MoveHandleType.Top) {\r\n domElement.style.cursor = 'move';\r\n } else if (\r\n handle === RotateHandleType.Lower ||\r\n handle === RotateHandleType.Upper ||\r\n handle === RotateHandleType.Tilt\r\n ) {\r\n domElement.style.cursor = 'grab';\r\n } else {\r\n domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n };\r\n\r\n const noHoverHandle = () => {\r\n setHoveredHandle(null);\r\n domElement.style.cursor = 'default';\r\n };\r\n\r\n const sunDirection = useMemo(() => {\r\n return getSunDirection(new Date(date), latitude);\r\n }, [date, latitude]);\r\n const rot = getElementById(parentId)?.rotation[2];\r\n const rotatedSunDirection = rot ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot) : sunDirection;\r\n\r\n const relativeEuler = useMemo(() => {\r\n if (Util.isSame(panelNormal, UNIT_VECTOR_POS_Z)) {\r\n if (sunDirection.z > 0) {\r\n switch (trackerType) {\r\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\r\n const r = Math.hypot(rotatedSunDirection.x, rotatedSunDirection.y);\r\n return new Euler(\r\n Math.atan2(r, rotatedSunDirection.z),\r\n 0,\r\n Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI,\r\n 'ZXY',\r\n );\r\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\r\n return new Euler(0, Math.atan2(rotatedSunDirection.x, rotatedSunDirection.z), lx < ly ? 0 : HALF_PI, 'XYZ');\r\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\r\n return new Euler(tiltAngle, 0, Math.atan2(rotatedSunDirection.y, rotatedSunDirection.x) + HALF_PI, 'ZXY');\r\n }\r\n }\r\n return new Euler(tiltAngle, 0, relativeAzimuth, 'ZXY');\r\n }\r\n return new Euler();\r\n }, [trackerType, sunDirection, tiltAngle, relativeAzimuth, normal]);\r\n\r\n const normalVector = useMemo(() => {\r\n const v = new Vector3();\r\n return drawSunBeam\r\n ? v\r\n .fromArray(normal)\r\n .applyEuler(\r\n new Euler(\r\n relativeEuler.x,\r\n relativeEuler.y,\r\n relativeEuler.z + rotation[2] + (lx < ly ? 0 : HALF_PI),\r\n lx < ly ? 'ZXY' : 'XYZ',\r\n ),\r\n )\r\n : v;\r\n }, [drawSunBeam, normal, euler, relativeEuler]);\r\n\r\n const poleZ = -poleHeight / 2 - lz / 2;\r\n\r\n const poles = useMemo(() => {\r\n const poleArray: Vector3[] = [];\r\n const poleNx = Math.floor((0.5 * lx) / poleSpacing);\r\n const poleNy = Math.floor((0.5 * ly * Math.abs(Math.cos(tiltAngle))) / poleSpacing);\r\n const sinTilt = 0.5 * Math.sin(tiltAngle);\r\n const cosAz = Math.cos(relativeAzimuth) * poleSpacing;\r\n const sinAz = Math.sin(relativeAzimuth) * poleSpacing;\r\n for (let ix = -poleNx; ix <= poleNx; ix++) {\r\n for (let iy = -poleNy; iy <= poleNy; iy++) {\r\n const xi = ix * cosAz - iy * sinAz;\r\n const yi = ix * sinAz + iy * cosAz;\r\n poleArray.push(new Vector3(xi, yi, poleZ + sinTilt * poleSpacing * iy));\r\n }\r\n }\r\n return poleArray;\r\n }, [relativeAzimuth, tiltAngle, poleSpacing, lx, ly, poleZ]);\r\n\r\n const baseSize = Math.max(1, (lx + ly) / 16);\r\n const resizeHandleSize = RESIZE_HANDLE_SIZE * baseSize * 1.5;\r\n const moveHandleSize = MOVE_HANDLE_RADIUS * baseSize * 2;\r\n const rotateHandleSize = (baseSize * 2) / 3;\r\n const tiltHandleSize = rotateHandleSize;\r\n\r\n const degree = new Array(13).fill(0);\r\n const [showTiltAngle, setShowTiltAngle] = useState(false);\r\n\r\n const texture = useSolarPanelTexture(\r\n lx,\r\n ly,\r\n pvModel,\r\n orientation,\r\n solarPanel?.frameColor,\r\n solarPanel?.backsheetColor,\r\n );\r\n const heatmapTexture = useSolarPanelHeatmapTexture(id);\r\n\r\n const renderTopTextureMaterial = () => {\r\n if (showSolarRadiationHeatmap && heatmapTexture) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n if (orthographic || solarPanelShininess === 0) {\r\n return ;\r\n }\r\n return (\r\n \r\n );\r\n };\r\n\r\n const renderBotTextureMaterial = () => {\r\n if (pvModel?.bifacialityFactor === 0 || orthographic || (poleHeight === 0 && tiltAngle === 0)) {\r\n return ;\r\n }\r\n if (!texture) return null;\r\n return (\r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {/* draw panel */}\r\n {\r\n if (e.button === 2) return; // ignore right-click\r\n selectMe(id, e, ActionType.Select);\r\n }}\r\n onContextMenu={(e) => {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.SolarPanel;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === baseRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n domElement.style.cursor = 'move';\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n domElement.style.cursor = 'default';\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {renderTopTextureMaterial()}\r\n {renderBotTextureMaterial()}\r\n \r\n\r\n {showSolarRadiationHeatmap &&\r\n heatmapTexture &&\r\n solarPanelLinesRef.current &&\r\n solarPanelLinesRef.current.map((lineData, index) => {\r\n return (\r\n \r\n );\r\n })}\r\n\r\n {/* simulation panel */}\r\n \r\n \r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* move & resize handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* draw move handle */}\r\n {\r\n hoverHandle(e, MoveHandleType.Top);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n selectMe(id, e, ActionType.Move);\r\n }}\r\n >\r\n \r\n \r\n\r\n {/* draw resize handles */}\r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLowerRef.current!.localToWorld(new Vector3(0, ly, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Lower);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleUpperRef.current!.localToWorld(new Vector3(0, -ly, -positionUL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Upper);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleLeftRef.current!.localToWorld(new Vector3(lx, 0, -positionLL.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Left);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n {\r\n selectMe(id, e, ActionType.Resize);\r\n if (resizeHandleLeftRef.current) {\r\n setCommonStore((state) => {\r\n const anchor = resizeHandleRightRef.current!.localToWorld(new Vector3(-lx, 0, -positionLR.z));\r\n state.resizeAnchor.copy(anchor);\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n hoverHandle(e, ResizeHandleType.Right);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/*{!selected && }*/}\r\n \r\n\r\n {/* draw rotate handles */}\r\n {selected && !locked && trackerType === TrackerType.NO_TRACKER && faceUp && (\r\n \r\n {/* rotate handles */}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* draw tilt handles */}\r\n {selected && !locked && trackerType === TrackerType.NO_TRACKER && faceUp && Math.abs(poleHeight) > 0.1 && (\r\n <>\r\n {/* ring handles */}\r\n {\r\n hoverHandle(e, RotateHandleType.Tilt);\r\n }}\r\n onPointerOut={(e) => {\r\n noHoverHandle();\r\n }}\r\n onPointerDown={(e) => {\r\n setShowTiltAngle(true);\r\n if (hoveredHandle) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n pointerDown.current = true;\r\n const sp = getElementById(id) as SolarPanelModel;\r\n oldTiltAngleRef.current = sp.tiltAngle;\r\n }\r\n setCommonStore((state) => {\r\n state.rotateHandleType = RotateHandleType.Tilt;\r\n });\r\n }}\r\n >\r\n \r\n \r\n {showTiltAngle && (\r\n <>\r\n {/* intersection plane */}\r\n {}}\r\n onPointerUp={(e) => {\r\n if (Math.abs(newTiltAngleRef.current - oldTiltAngleRef.current) > ZERO_TOLERANCE) {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltAngleRef.current,\r\n newValue: newTiltAngleRef.current,\r\n changedElementId: id,\r\n changedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n updateSolarPanelTiltAngleById(\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as number,\r\n );\r\n },\r\n redo: () => {\r\n updateSolarPanelTiltAngleById(\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as number,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n }\r\n }}\r\n onPointerMove={(e) => {\r\n if (pointerDown.current) {\r\n const mouse = new Vector2();\r\n mouse.x = (e.offsetX / domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, camera);\r\n if (tiltHandleRef.current) {\r\n const intersects = ray.intersectObjects([tiltHandleRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point;\r\n const parent = tiltHandleRef.current.parent;\r\n if (parent) {\r\n const ov = parent.position; // rotate point in world coordinate\r\n const cv = new Vector3().subVectors(p, ov);\r\n let angle = cv.angleTo(UNIT_VECTOR_POS_Z);\r\n const touch = 0.5 * solarPanel.ly * Math.abs(Math.sin(angle)) > solarPanel.poleHeight;\r\n if (!touch) {\r\n const wr = relativeAzimuth + rotation[2];\r\n const sign =\r\n wr % Math.PI === 0\r\n ? Math.sign(-cv.y) * Math.sign(Math.cos(wr))\r\n : Math.sign(cv.x) * Math.sign(Math.sin(wr));\r\n angle *= sign;\r\n updateSolarPanelTiltAngleById(id, angle);\r\n newTiltAngleRef.current = angle;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }}\r\n >\r\n \r\n \r\n {/* pointer */}\r\n \r\n {/* scale */}\r\n {degree.map((e, i) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n {/* show current degree */}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* draw poles */}\r\n {poleHeight > 0 &&\r\n faceUp &&\r\n poles.map((p, i) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n\r\n {/*draw sun beam*/}\r\n {drawSunBeam && sunDirection.z > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/*draw label */}\r\n {(hovered || showLabel) && !selected && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(SolarPanel);\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { DoubleSide, Group, Mesh, RepeatWrapping, TextureLoader, Vector3 } from 'three';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ThreeEvent, useFrame, useThree } from '@react-three/fiber';\r\nimport { Billboard, Line, Plane, Sphere } from '@react-three/drei';\r\nimport {\r\n DEFAULT_LEAF_OFF_DAY,\r\n DEFAULT_LEAF_OUT_DAY,\r\n GROUND_ID,\r\n HALF_PI,\r\n HIGHLIGHT_HANDLE_COLOR,\r\n LOCKED_ELEMENT_SELECTION_COLOR,\r\n MOVE_HANDLE_COLOR_1,\r\n MOVE_HANDLE_RADIUS,\r\n} from '../constants';\r\nimport { ActionType, FlowerType, MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from '../types';\r\nimport i18n from '../i18n/i18n';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { Util } from '../Util';\r\nimport { FlowerModel } from '../models/FlowerModel';\r\nimport { FlowerData } from '../FlowerData';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\nimport { useSelected } from './hooks';\r\n\r\nconst Flower = ({\r\n parentId,\r\n id,\r\n cx,\r\n cy,\r\n cz,\r\n name = FlowerType.WhiteFlower,\r\n flip = false,\r\n locked = false,\r\n}: FlowerModel) => {\r\n let isRender = false;\r\n useStore((state) => {\r\n if (parentId === GROUND_ID) {\r\n isRender = true;\r\n } else {\r\n for (const e of state.elements) {\r\n if (e.id === parentId) {\r\n isRender = true;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n const removeElementById = useStore(Selector.removeElementById);\r\n useEffect(() => {\r\n if (!isRender) {\r\n removeElementById(id, false);\r\n }\r\n }, [isRender]);\r\n\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const date = useStore(Selector.world.date);\r\n const latitude = useStore(Selector.world.latitude);\r\n const leafDayOfYear1 = useStore(Selector.world.leafDayOfYear1) ?? DEFAULT_LEAF_OUT_DAY;\r\n const leafDayOfYear2 = useStore(Selector.world.leafDayOfYear2) ?? DEFAULT_LEAF_OFF_DAY;\r\n const selectMe = useStore(Selector.selectMe);\r\n const getElementById = useStore(Selector.getElementById);\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const [hovered, setHovered] = useState(false);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const { gl } = useThree();\r\n const selected = useSelected(id);\r\n\r\n const contentRef = useRefStore((state) => state.contentRef);\r\n const groupRef = useRef(null);\r\n const flowerRef = useRef(null);\r\n const interactionMeshRef = useRef(null);\r\n const interactionPlaneRef = useRef(null);\r\n\r\n const flowerModel = useMemo(() => getElementById(id) as FlowerModel, [id]);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const noLeaves = useMemo(() => {\r\n const dayOfYear = Util.dayOfYear(new Date(date));\r\n return latitude > 0\r\n ? dayOfYear < leafDayOfYear1 || dayOfYear > leafDayOfYear2\r\n : dayOfYear >= leafDayOfYear1 && dayOfYear <= leafDayOfYear2;\r\n }, [date, leafDayOfYear1, leafDayOfYear2, latitude]);\r\n\r\n const fileChangedRef = useRef(false);\r\n const fileChangedState = useStore(Selector.fileChanged);\r\n\r\n if (fileChangedState !== fileChangedRef.current) {\r\n fileChangedRef.current = fileChangedState;\r\n if (contentRef?.current && groupRef.current) {\r\n contentRef.current.add(groupRef.current);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (parentId !== GROUND_ID) {\r\n const obj = getParentObject();\r\n if (obj && groupRef.current) {\r\n obj.add(groupRef.current);\r\n }\r\n }\r\n }, [fileChangedState]);\r\n\r\n // attach parent dom element if parent is not Ground\r\n useEffect(() => {\r\n const parentObject = getParentObject();\r\n if (parentObject && groupRef.current) {\r\n parentObject.add(groupRef.current);\r\n }\r\n }, [contentRef]);\r\n\r\n const textureLoader = useMemo(() => {\r\n return new TextureLoader().load(FlowerData.fetchTextureImage(name, noLeaves), (texture) => {\r\n if (flip) {\r\n texture.wrapS = RepeatWrapping;\r\n texture.repeat.x = -1;\r\n }\r\n setTexture(texture);\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }, [name, noLeaves, flip]);\r\n const [texture, setTexture] = useState(textureLoader);\r\n\r\n const labelText = useMemo(() => {\r\n return (\r\n FlowerData.fetchLabel(name, lang) +\r\n (locked ? ' (' + i18n.t('shared.ElementLocked', lang) + ')' : '') +\r\n '\\n' +\r\n i18n.t('word.Coordinates', lang) +\r\n ': (' +\r\n cx.toFixed(1) +\r\n ', ' +\r\n cy.toFixed(1) +\r\n ') ' +\r\n i18n.t('word.MeterAbbreviation', lang)\r\n );\r\n }, [name, cx, cy, locked, language]);\r\n\r\n const hoverHandle = useCallback(\r\n (e: ThreeEvent, handle: MoveHandleType | ResizeHandleType | RotateHandleType) => {\r\n if (usePrimitiveStore.getState().duringCameraInteraction) return;\r\n if (e.intersections.length > 0) {\r\n // QUICK FIX: For some reason, the top one can sometimes be the ground, so we also go to the second one\r\n const intersected =\r\n e.intersections[0].object === e.eventObject ||\r\n (e.intersections.length > 1 && e.intersections[1].object === e.eventObject);\r\n if (intersected) {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = handle;\r\n state.selectedElementHeight = flowerModel.lz;\r\n });\r\n if (Util.isMoveHandle(handle)) {\r\n gl.domElement.style.cursor = 'move';\r\n } else {\r\n gl.domElement.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n },\r\n [],\r\n );\r\n\r\n const noHoverHandle = useCallback(() => {\r\n setCommonStore((state) => {\r\n state.hoveredHandle = null;\r\n });\r\n gl.domElement.style.cursor = useStore.getState().addedCuboidId ? 'crosshair' : 'default';\r\n }, []);\r\n\r\n // return null if parent is Ground\r\n const getParentObject = () => {\r\n if (parentId !== GROUND_ID && contentRef?.current) {\r\n return Util.getObjectChildById(contentRef.current, parentId);\r\n }\r\n return null;\r\n };\r\n\r\n const width = useMemo(() => {\r\n return FlowerData.fetchSpread(name);\r\n }, [name]);\r\n\r\n const height = useMemo(() => {\r\n return FlowerData.fetchHeight(name);\r\n }, [name]);\r\n\r\n useFrame(({ camera }) => {\r\n // rotation\r\n if (groupRef.current) {\r\n const { rot: parentWorldRotation } = Util.getWorldDataById(parentId);\r\n\r\n if (!orthographic) {\r\n if (flowerRef.current && interactionPlaneRef.current) {\r\n const { x: cameraX, y: cameraY } = camera.position;\r\n const { x: currX, y: currY } = groupRef.current.position;\r\n const parentObject = getParentObject();\r\n if (parentObject) {\r\n const worldPosition = groupRef.current.localToWorld(new Vector3());\r\n const e = Math.atan2(cameraX - worldPosition.x, cameraY - worldPosition.y) + parentWorldRotation;\r\n flowerRef.current.rotation.set(HALF_PI, -e, 0);\r\n interactionPlaneRef.current.rotation.set(-HALF_PI, e, 0);\r\n } else {\r\n const e = Math.atan2(cameraX - currX, cameraY - currY);\r\n flowerRef.current.rotation.set(HALF_PI, -e, 0);\r\n interactionPlaneRef.current.rotation.set(-HALF_PI, e, 0);\r\n }\r\n }\r\n groupRef.current.rotation.set(0, 0, 0);\r\n } else {\r\n if (flowerRef.current && interactionPlaneRef.current) {\r\n flowerRef.current.rotation.set(HALF_PI, 0, 0);\r\n interactionPlaneRef.current.rotation.set(0, 0, 0);\r\n }\r\n groupRef.current.rotation.set(-HALF_PI, 0, 0);\r\n }\r\n }\r\n });\r\n\r\n const handleSize = MOVE_HANDLE_RADIUS * 3;\r\n\r\n return (\r\n <>\r\n {isRender ? (\r\n // in orthographic mode, we need to lift it up a bit so that it can be more easily picked\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* billboard for interactions (don't use a plane as it may become unselected at some angle) */}\r\n \r\n {\r\n selectMe(id, e, ActionType.ContextMenu);\r\n setCommonStore((state) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === interactionMeshRef.current;\r\n if (intersected) {\r\n state.contextMenuObjectType = ObjectType.Flower;\r\n }\r\n }\r\n });\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.flowerRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerOver={(e) => {\r\n if (e.intersections.length > 0) {\r\n const intersected = e.intersections[0].object === interactionMeshRef.current;\r\n if (intersected) {\r\n setHovered(true);\r\n }\r\n }\r\n }}\r\n onPointerOut={(e) => {\r\n setHovered(false);\r\n }}\r\n />\r\n \r\n\r\n {/* highlight it when it is selected but locked */}\r\n {selected && locked && (\r\n \r\n )}\r\n\r\n {/* draw handles */}\r\n {selected && !locked && (\r\n <>\r\n {/* move handle */}\r\n {\r\n if (e.button !== 2 && e.eventObject === e.intersections[0].eventObject) {\r\n selectMe(id, e, ActionType.Move);\r\n useRefStore.setState((state) => {\r\n state.flowerRef = groupRef;\r\n });\r\n }\r\n }}\r\n onPointerEnter={(e) => {\r\n hoverHandle(e, MoveHandleType.Default);\r\n }}\r\n onPointerLeave={noHoverHandle}\r\n >\r\n \r\n \r\n \r\n )}\r\n {hovered && !selected && (\r\n \r\n )}\r\n \r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Flower);\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Button, Space } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst Container = styled.div`\n position: absolute;\n left: calc(100vw / 2 - 50px);\n width: 100px;\n bottom: 6px;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 10000; // must be larger than that of the spinner so that this can be clicked\n`;\n\nconst SimulationControlPanel = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const simulationPaused = usePrimitiveStore(Selector.simulationPaused);\n const showDesignInfoPanel = useStore(Selector.viewState.showDesignInfoPanel);\n\n const lang = { lng: language };\n\n const cancel = () => {\n usePrimitiveStore.setState((state) => {\n state.runDailyThermalSimulation = false;\n state.runYearlyThermalSimulation = false;\n state.pauseDailyThermalSimulation = false;\n state.pauseYearlyThermalSimulation = false;\n\n state.runStaticSimulation = false;\n state.runDynamicSimulation = false;\n state.pauseSimulation = false;\n\n state.runDailyLightSensor = false;\n state.runYearlyLightSensor = false;\n state.pauseDailyLightSensor = false;\n state.pauseYearlyLightSensor = false;\n\n state.runDailySimulationForSolarPanels = false;\n state.runYearlySimulationForSolarPanels = false;\n state.pauseDailySimulationForSolarPanels = false;\n state.pauseYearlySimulationForSolarPanels = false;\n\n state.runDailySimulationForParabolicTroughs = false;\n state.runYearlySimulationForParabolicTroughs = false;\n state.pauseDailySimulationForParabolicTroughs = false;\n state.pauseYearlySimulationForParabolicTroughs = false;\n\n state.runDailySimulationForParabolicDishes = false;\n state.runYearlySimulationForParabolicDishes = false;\n state.pauseDailySimulationForParabolicDishes = false;\n state.pauseYearlySimulationForParabolicDishes = false;\n\n state.runDailySimulationForFresnelReflectors = false;\n state.runYearlySimulationForFresnelReflectors = false;\n state.pauseDailySimulationForFresnelReflectors = false;\n state.pauseYearlySimulationForFresnelReflectors = false;\n\n state.runDailySimulationForHeliostats = false;\n state.runYearlySimulationForHeliostats = false;\n state.pauseDailySimulationForHeliostats = false;\n state.pauseYearlySimulationForHeliostats = false;\n });\n\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Cancel Simulation',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const pause = () => {\n usePrimitiveStore.setState((state) => {\n if (state.runDailyThermalSimulation) {\n state.pauseDailyThermalSimulation = true;\n }\n if (state.runYearlyThermalSimulation) {\n state.pauseYearlyThermalSimulation = true;\n }\n\n if (state.runDynamicSimulation) {\n state.pauseSimulation = true;\n }\n\n if (state.runDailyLightSensor) {\n state.pauseDailyLightSensor = true;\n }\n if (state.runYearlyLightSensor) {\n state.pauseYearlyLightSensor = true;\n }\n\n if (state.runDailySimulationForSolarPanels) {\n state.pauseDailySimulationForSolarPanels = true;\n }\n if (state.runYearlySimulationForSolarPanels) {\n state.pauseYearlySimulationForSolarPanels = true;\n }\n\n if (state.runDailySimulationForParabolicTroughs) {\n state.pauseDailySimulationForParabolicTroughs = true;\n }\n if (state.runYearlySimulationForParabolicTroughs) {\n state.pauseYearlySimulationForParabolicTroughs = true;\n }\n\n if (state.runDailySimulationForParabolicDishes) {\n state.pauseDailySimulationForParabolicDishes = true;\n }\n if (state.runYearlySimulationForParabolicDishes) {\n state.pauseYearlySimulationForParabolicDishes = true;\n }\n\n if (state.runDailySimulationForFresnelReflectors) {\n state.pauseDailySimulationForFresnelReflectors = true;\n }\n if (state.runYearlySimulationForFresnelReflectors) {\n state.pauseYearlySimulationForFresnelReflectors = true;\n }\n\n if (state.runDailySimulationForHeliostats) {\n state.pauseDailySimulationForHeliostats = true;\n }\n if (state.runYearlySimulationForHeliostats) {\n state.pauseYearlySimulationForHeliostats = true;\n }\n });\n\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Pause Simulation',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const resume = () => {\n usePrimitiveStore.setState((state) => {\n if (state.runDailyThermalSimulation) {\n state.pauseDailyThermalSimulation = false;\n }\n if (state.runYearlyThermalSimulation) {\n state.pauseYearlyThermalSimulation = false;\n }\n\n if (state.runDynamicSimulation) {\n state.pauseSimulation = false;\n }\n\n if (state.runDailyLightSensor) {\n state.pauseDailyLightSensor = false;\n }\n if (state.runYearlyLightSensor) {\n state.pauseYearlyLightSensor = false;\n }\n\n if (state.runDailySimulationForSolarPanels) {\n state.pauseDailySimulationForSolarPanels = false;\n }\n if (state.runYearlySimulationForSolarPanels) {\n state.pauseYearlySimulationForSolarPanels = false;\n }\n\n if (state.runDailySimulationForParabolicTroughs) {\n state.pauseDailySimulationForParabolicTroughs = false;\n }\n if (state.runYearlySimulationForParabolicTroughs) {\n state.pauseYearlySimulationForParabolicTroughs = false;\n }\n\n if (state.runDailySimulationForParabolicDishes) {\n state.pauseDailySimulationForParabolicDishes = false;\n }\n if (state.runYearlySimulationForParabolicDishes) {\n state.pauseYearlySimulationForParabolicDishes = false;\n }\n\n if (state.runDailySimulationForFresnelReflectors) {\n state.pauseDailySimulationForFresnelReflectors = false;\n }\n if (state.runYearlySimulationForFresnelReflectors) {\n state.pauseYearlySimulationForFresnelReflectors = false;\n }\n\n if (state.runDailySimulationForHeliostats) {\n state.pauseDailySimulationForHeliostats = false;\n }\n if (state.runYearlySimulationForHeliostats) {\n state.pauseYearlySimulationForHeliostats = false;\n }\n });\n\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Resume Simulation',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n return (\n \n \n \n {!simulationPaused && (\n \n )}\n {simulationPaused && (\n \n )}\n \n \n );\n};\n\nexport default React.memo(SimulationControlPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Button, Space } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst Container = styled.div`\n position: absolute;\n left: calc(100vw / 2 - 50px);\n width: 100px;\n bottom: 6px;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 10000; // must be larger than that of the spinner so that this can be clicked\n`;\n\nconst EvolutionControlPanel = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const evolutionPaused = usePrimitiveStore(Selector.evolutionPaused);\n const showDesignInfoPanel = useStore(Selector.viewState.showDesignInfoPanel);\n\n const lang = { lng: language };\n\n const cancel = () => {\n usePrimitiveStore.setState((state) => {\n state.runStaticSimulation = false;\n state.pauseSimulation = false;\n state.runEvolution = false;\n state.pauseEvolution = false;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Cancel Evolution',\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const pause = () => {\n usePrimitiveStore.setState((state) => {\n state.pauseSimulation = true;\n if (state.runEvolution) {\n state.pauseEvolution = true;\n }\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Pause Evolution',\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const resume = () => {\n usePrimitiveStore.setState((state) => {\n state.pauseSimulation = false;\n if (state.runEvolution) {\n state.pauseEvolution = false;\n }\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Resume Evolution',\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n return (\n \n \n \n {!evolutionPaused && (\n \n )}\n {evolutionPaused && (\n \n )}\n \n \n );\n};\n\nexport default React.memo(EvolutionControlPanel);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Spin } from 'antd';\nimport styled from 'styled-components';\n\nexport default styled(Spin)`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.5);\n z-index: 9999;\n`;\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n *\r\n */\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { Util } from './Util';\r\nimport SimulationControlPanel from './panels/simulationControlPanel';\r\nimport EvolutionControlPanel from './panels/evolutionControlPanel';\r\nimport Spinner from './components/spinner';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\n\r\nexport default React.memo(function Waiting({ initializing }: { initializing: boolean }) {\r\n const waiting = usePrimitiveStore(Selector.waiting);\r\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\r\n const evolutionInProgress = usePrimitiveStore(Selector.evolutionInProgress);\r\n const simulationPaused = usePrimitiveStore(Selector.simulationPaused);\r\n const evolutionPaused = usePrimitiveStore(Selector.evolutionPaused);\r\n const noAnimationForSensorDataCollection = useStore(Selector.world.noAnimationForSensorDataCollection);\r\n const noAnimationForSolarPanelSimulation = useStore(Selector.world.noAnimationForSolarPanelSimulation);\r\n const noAnimationForHeatmapSimulation = useStore(Selector.world.noAnimationForHeatmapSimulation);\r\n const noAnimationForSolarUpdraftTowerSimulation = useStore(Selector.world.noAnimationForSolarUpdraftTowerSimulation);\r\n const noAnimationForThermalSimulation = useStore(Selector.world.noAnimationForThermalSimulation);\r\n const runDailySimulationForSolarPanels = usePrimitiveStore(Selector.runDailySimulationForSolarPanels);\r\n const runYearlySimulationForSolarPanels = usePrimitiveStore(Selector.runYearlySimulationForSolarPanels);\r\n const runDailyLightSensor = usePrimitiveStore(Selector.runDailyLightSensor);\r\n const runYearlyLightSensor = usePrimitiveStore(Selector.runYearlyLightSensor);\r\n const runDailySimulationForUpdraftTower = usePrimitiveStore(Selector.runDailySimulationForUpdraftTower);\r\n const runYearlySimulationForUpdraftTower = usePrimitiveStore(Selector.runYearlySimulationForUpdraftTower);\r\n const runDynamicSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\r\n const runDailyThermalSimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\r\n const runYearlyThermalSimulation = usePrimitiveStore(Selector.runYearlyThermalSimulation);\r\n\r\n const elements = useStore.getState().elements;\r\n\r\n return (\r\n <>\r\n {(initializing || waiting || simulationInProgress || evolutionInProgress) && (\r\n <>\r\n {simulationInProgress &&\r\n ((!noAnimationForHeatmapSimulation && runDynamicSimulation) ||\r\n (!noAnimationForThermalSimulation && (runDailyThermalSimulation || runYearlyThermalSimulation)) ||\r\n (!noAnimationForSensorDataCollection && (runDailyLightSensor || runYearlyLightSensor)) ||\r\n (!noAnimationForSolarUpdraftTowerSimulation &&\r\n (runDailySimulationForUpdraftTower || runYearlySimulationForUpdraftTower)) ||\r\n (!noAnimationForSolarPanelSimulation &&\r\n (runDailySimulationForSolarPanels || runYearlySimulationForSolarPanels)) ||\r\n Util.hasMovingParts(elements)) && }\r\n {evolutionInProgress && }\r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n\r\nexport const EndWaiting = () => {\r\n const waiting = usePrimitiveStore.getState().waiting;\r\n if (!waiting) return null;\r\n\r\n const End = () => {\r\n useEffect(() => {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = false;\r\n });\r\n return () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = false;\r\n });\r\n };\r\n });\r\n return null;\r\n };\r\n\r\n return ;\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { ObjectType } from './types';\r\nimport { FoundationModel } from './models/FoundationModel';\r\nimport Foundation from './views/foundation/foundation';\r\nimport { SensorModel } from './models/SensorModel';\r\nimport Sensor from './views/sensor';\r\nimport { CuboidModel } from './models/CuboidModel';\r\nimport { HumanModel } from './models/HumanModel';\r\nimport Human from './views/human';\r\nimport { TreeModel } from './models/TreeModel';\r\nimport Tree from './views/tree';\r\nimport { SolarPanelModel } from './models/SolarPanelModel';\r\nimport Polygon from './views/polygon';\r\nimport { PolygonModel } from './models/PolygonModel';\r\nimport { Group } from 'three';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport ParabolicTrough from './views/parabolicTrough';\r\nimport { ParabolicTroughModel } from './models/ParabolicTroughModel';\r\nimport ParabolicDish from './views/parabolicDish';\r\nimport { ParabolicDishModel } from './models/ParabolicDishModel';\r\nimport FresnelReflector from './views/fresnelReflector';\r\nimport { FresnelReflectorModel } from './models/FresnelReflectorModel';\r\nimport Heliostat from './views/heliostat';\r\nimport { HeliostatModel } from './models/HeliostatModel';\r\nimport SolarPanel from './views/solarPanel/solarPanel';\r\nimport Flower from './views/flower';\r\nimport { FlowerModel } from './models/FlowerModel';\r\nimport Light from './views/light';\r\nimport { LightModel } from './models/LightModel';\r\nimport CuboidRenderer from './views/cuboid';\r\nimport { GROUND_ID } from './constants';\r\nimport { EndWaiting } from './waiting';\r\n\r\nconst ElementsRenderer: React.FC = () => {\r\n const elements = useStore(Selector.elements);\r\n\r\n const groupRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (groupRef) {\r\n useRefStore.setState((state) => {\r\n state.contentRef = groupRef;\r\n });\r\n }\r\n }, []);\r\n\r\n // console.log(groupRef);\r\n // console.log(elements);\r\n console.debug(elements);\r\n\r\n return (\r\n \r\n {elements.map((e) => {\r\n switch (e.type) {\r\n case ObjectType.Foundation:\r\n return ;\r\n case ObjectType.Sensor: {\r\n const sensor = e as SensorModel;\r\n if (sensor.parentType === ObjectType.Cuboid) {\r\n return null;\r\n }\r\n return ;\r\n }\r\n case ObjectType.Light: {\r\n const light = e as LightModel;\r\n if (light.parentType === ObjectType.Cuboid) {\r\n return null;\r\n }\r\n return ;\r\n }\r\n case ObjectType.Cuboid:\r\n // only base cuboid will be rendered here\r\n if (e.parentId !== GROUND_ID) return null;\r\n return ;\r\n case ObjectType.Human:\r\n return ;\r\n case ObjectType.Tree:\r\n return ;\r\n case ObjectType.Flower:\r\n return ;\r\n case ObjectType.SolarPanel:\r\n switch ((e as SolarPanelModel).parentType) {\r\n case ObjectType.Roof:\r\n case ObjectType.Wall:\r\n case ObjectType.Cuboid:\r\n return null;\r\n default:\r\n return ;\r\n }\r\n case ObjectType.ParabolicDish:\r\n return ;\r\n case ObjectType.ParabolicTrough:\r\n return ;\r\n case ObjectType.FresnelReflector:\r\n return ;\r\n case ObjectType.Heliostat:\r\n return ;\r\n case ObjectType.Polygon:\r\n switch ((e as PolygonModel).parentType) {\r\n case ObjectType.Wall:\r\n return null;\r\n default:\r\n return ;\r\n }\r\n default:\r\n if (e.id) return ;\r\n }\r\n return null;\r\n })}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Couldn't find a good way to clear this set to avoid memory leak.\r\n// This roof id set is used in all walls which shape needs to be changed by the deletion of the roof.\r\n// So fter all the walls have used it their useEffect hooks, then we can clear it.\r\n// And here is the last hook get called due to React hooks mechanism.\r\nconst ClearDeletedRoofIdSet = () => {\r\n const deletedRoofIdSet = useStore(Selector.deletedRoofIdSet);\r\n useEffect(() => {\r\n useStore.getState().set((state) => {\r\n state.deletedRoofIdSet.clear();\r\n });\r\n }, [deletedRoofIdSet]);\r\n return null;\r\n};\r\n\r\nexport default React.memo(ElementsRenderer);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { RefObject, useEffect, useMemo, useRef } from 'react';\r\nimport { CommonStoreState, useStore } from '../stores/common';\r\nimport { useRefStore } from '../stores/commonRef';\r\nimport * as Selector from '../stores/selector';\r\nimport { Plane } from '@react-three/drei';\r\nimport { DoubleSide, Euler, Group, Intersection, Mesh, Object3D, Raycaster, Vector2, Vector3 } from 'three';\r\nimport {\r\n IntersectionPlaneType,\r\n MoveHandleType,\r\n ObjectType,\r\n ResizeHandleType,\r\n RotateHandleType,\r\n WallAbsPos,\r\n} from '../types';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport {\r\n GROUND_ID,\r\n HALF_PI,\r\n MOVE_HANDLE_RADIUS,\r\n ORIGIN_VECTOR2,\r\n TWO_PI,\r\n UNIT_VECTOR_POS_Z,\r\n UNIT_VECTOR_POS_Z_ARRAY,\r\n ZERO_TOLERANCE,\r\n} from '../constants';\r\nimport { Util } from '../Util';\r\nimport { UndoableMove, UndoableMoveFoundationGroup } from '../undo/UndoableMove';\r\nimport { UndoableResize } from '../undo/UndoableResize';\r\nimport { UndoableRotate } from '../undo/UndoableRotate';\r\nimport { UndoableAdd } from '../undo/UndoableAdd';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { PolygonModel } from '../models/PolygonModel';\r\nimport { Point2 } from '../models/Point2';\r\nimport { TreeModel } from '../models/TreeModel';\r\nimport { UndoableChange } from '../undo/UndoableChange';\r\nimport { showError } from '../helpers';\r\nimport i18n from '../i18n/i18n';\r\nimport { SolarPanelModel } from 'src/models/SolarPanelModel';\r\nimport { InnerCommonStoreState } from 'src/stores/InnerCommonState';\r\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\r\nimport { GroupableModel, isGroupable } from 'src/models/Groupable';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\n\r\nconst Ground = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const getChildren = useStore(Selector.getChildren);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const setElementRotation = useStore(Selector.updateElementRotationById);\r\n const addElement = useStore(Selector.addElement);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLzById = useStore(Selector.updateElementLzById);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const getCameraDirection = useStore(Selector.getCameraDirection);\r\n const getResizeHandlePosition = useStore(Selector.getResizeHandlePosition);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const updateSceneRadius = useStore(Selector.updateSceneRadius);\r\n\r\n const language = useStore(Selector.language);\r\n const objectTypeToAdd = useStore(Selector.objectTypeToAdd);\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const rotateHandleType = useStore(Selector.rotateHandleType);\r\n const resizeAnchor = useStore(Selector.resizeAnchor);\r\n const shadowEnabled = useStore(Selector.viewState.shadowEnabled);\r\n const groundColor = useStore(Selector.viewState.groundColor);\r\n const waterSurface = useStore(Selector.viewState.waterSurface);\r\n const groundModel = useStore((state) => state.world.ground);\r\n const deletedFoundationId = useStore(Selector.deletedFoundationId);\r\n const deletedCuboidId = useStore(Selector.deletedCuboidId);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n\r\n const { get: getThree, scene, invalidate } = useThree();\r\n const groundPlaneRef = useRef();\r\n const intersectionPlaneRef = useRef();\r\n const grabRef = useRef(null);\r\n const oldPositionRef = useRef(new Vector3());\r\n const newPositionRef = useRef(new Vector3());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const oldPolygonVerticesMapRef = useRef>(new Map());\r\n const newPolygonVerticesMapRef = useRef>(new Map());\r\n const oldWallPointsMapRef = useRef>(new Map());\r\n const newWallPointsMapRef = useRef>(new Map());\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const newDimensionRef = useRef(new Vector3(1, 1, 1));\r\n const oldRotationRef = useRef([0, 0, 1]);\r\n const newRotationRef = useRef([0, 0, 1]);\r\n const oldHumanOrPlantParentIdRef = useRef(null);\r\n const oldCuboidParentIdRef = useRef(null);\r\n const absPosMapRef = useRef>(new Map());\r\n const polygonsAbsPosMapRef = useRef>(new Map());\r\n const wallsAbsPosMapRef = useRef>(new Map());\r\n const isSettingFoundationStartPointRef = useRef(false);\r\n const isSettingFoundationEndPointRef = useRef(false);\r\n const isSettingCuboidStartPointRef = useRef(false);\r\n const isSettingCuboidEndPointRef = useRef(false);\r\n const isHumanOrPlantMovedRef = useRef(false);\r\n const baseGroupRelPosMapRef = useRef>(new Map());\r\n const baseGroupOldPosMapRef = useRef>(new Map());\r\n const baseGroupNewPosMapRef = useRef>(new Map());\r\n const moveHandleWorldDiffV3Ref = useRef(new Vector3());\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // add pointer up event to window\r\n useEffect(() => {\r\n window.addEventListener('pointerup', handlePointerUp);\r\n return () => {\r\n window.removeEventListener('pointerup', handlePointerUp);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (deletedFoundationId) {\r\n setCommonStore((state) => {\r\n state.addedFoundationId = null;\r\n state.deletedFoundationId = null;\r\n });\r\n isSettingFoundationStartPointRef.current = false;\r\n isSettingFoundationEndPointRef.current = false;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [deletedFoundationId]);\r\n\r\n useEffect(() => {\r\n if (deletedCuboidId) {\r\n setCommonStore((state) => {\r\n state.addedCuboidId = null;\r\n state.deletedCuboidId = null;\r\n });\r\n isSettingCuboidStartPointRef.current = false;\r\n isSettingCuboidEndPointRef.current = false;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [deletedCuboidId]);\r\n\r\n const { camera } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n const cosAngle = grabRef.current ? Math.cos(grabRef.current.rotation[2]) : 1;\r\n const sinAngle = grabRef.current ? Math.sin(grabRef.current.rotation[2]) : 0;\r\n let intersectionPlaneType = IntersectionPlaneType.Ground;\r\n const intersectionPlanePosition = useMemo(() => new Vector3(), []);\r\n const intersectionPlaneAngle = useMemo(() => new Euler(), []);\r\n const elementParentRotation = useMemo(() => new Euler(), []);\r\n\r\n if (grabRef.current) {\r\n if (Util.isPlantOrHuman(grabRef.current)) {\r\n intersectionPlaneType = IntersectionPlaneType.Vertical;\r\n const a = useStore.getState().viewState.orthographic ? 0 : -HALF_PI;\r\n const { x: cameraX, y: cameraY } = camera.position;\r\n const rotation = -Math.atan2(cameraX, cameraY);\r\n intersectionPlaneAngle.set(a, 0, rotation, 'ZXY');\r\n intersectionPlanePosition.set(grabRef.current.cx, grabRef.current.cy, 0);\r\n } else if (moveHandleType === MoveHandleType.Top) {\r\n intersectionPlaneType = IntersectionPlaneType.Horizontal;\r\n intersectionPlanePosition.set(grabRef.current.cx, grabRef.current.cy, grabRef.current.lz);\r\n intersectionPlaneAngle.set(0, 0, 0);\r\n } else if (\r\n Util.isMoveHandle(moveHandleType) ||\r\n resizeHandleType === ResizeHandleType.Left ||\r\n resizeHandleType === ResizeHandleType.Right ||\r\n resizeHandleType === ResizeHandleType.Lower ||\r\n resizeHandleType === ResizeHandleType.Upper ||\r\n resizeHandleType === ResizeHandleType.LowerLeft ||\r\n (resizeHandleType === ResizeHandleType.UpperLeft && grabRef.current.type !== ObjectType.Wall) ||\r\n resizeHandleType === ResizeHandleType.LowerRight ||\r\n (resizeHandleType === ResizeHandleType.UpperRight && grabRef.current.type !== ObjectType.Wall) ||\r\n rotateHandleType === RotateHandleType.Lower ||\r\n rotateHandleType === RotateHandleType.Upper\r\n ) {\r\n intersectionPlaneType = IntersectionPlaneType.Horizontal;\r\n intersectionPlanePosition.set(grabRef.current.cx, grabRef.current.cy, MOVE_HANDLE_RADIUS);\r\n intersectionPlaneAngle.set(0, 0, 0);\r\n } else if (resizeHandleType) {\r\n intersectionPlaneType = IntersectionPlaneType.Vertical;\r\n const handlePosition = getResizeHandlePosition(grabRef.current, resizeHandleType);\r\n const cameraDir = getCameraDirection();\r\n const rotation = -Math.atan2(cameraDir.x, cameraDir.y);\r\n intersectionPlanePosition.set(handlePosition.x, handlePosition.y, 0);\r\n intersectionPlaneAngle.set(-HALF_PI, 0, rotation, 'ZXY');\r\n }\r\n }\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / getThree().gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / getThree().gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, getThree().camera);\r\n };\r\n\r\n const getIntersectionToStand = (intersections: Intersection[]) => {\r\n for (const intersection of intersections) {\r\n if (intersection.object.userData.stand) {\r\n return intersection;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n // don't set parentId for foundations or cuboids as their parents are allowed to be ground only (for now)\r\n if (e.id === elementId && e.type !== ObjectType.Foundation) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const getObjectId = (obj: Object3D | null): string => {\r\n if (!obj) return '';\r\n\r\n const nameArray = obj.name.split(' ');\r\n if (nameArray[2]) {\r\n return nameArray[2];\r\n }\r\n\r\n return getObjectId(obj.parent);\r\n };\r\n\r\n const attachToGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n if (contentRef?.current) {\r\n const currParentObj = Util.getObjectChildById(contentRef.current, currParentId);\r\n const currObj = Util.getObjectChildById(currParentId === GROUND_ID ? contentRef.current : currParentObj, currId);\r\n if (currObj) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = Util.getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n }\r\n };\r\n\r\n const handlePlantOrHumanRefMove = (elementRef: RefObject | null, e: ThreeEvent) => {\r\n if (elementRef && elementRef.current) {\r\n const intersection = getIntersectionToStand(e.intersections);\r\n if (intersection) {\r\n const intersectionObj = intersection.object; // Mesh\r\n const elementParentRef = elementRef.current.parent;\r\n\r\n // stand on ground\r\n if (intersectionObj.name === 'Ground') {\r\n // change parent: attach dom, set parentId?\r\n if (elementParentRef && elementParentRef.name !== 'Content') {\r\n const contentRef = useRefStore.getState().contentRef;\r\n if (contentRef && contentRef.current) {\r\n contentRef.current.add(elementRef.current);\r\n setParentIdById(GROUND_ID, getObjectId(elementRef.current));\r\n }\r\n }\r\n elementRef.current.position.copy(intersection.point); // world position\r\n invalidate();\r\n }\r\n // stand on standable elements\r\n else if (intersectionObj.userData.stand) {\r\n const intersectionObjGroup = intersectionObj.parent; // Group\r\n if (intersectionObjGroup) {\r\n // change parent: attach dom, set parentId?\r\n if (elementParentRef && elementParentRef.uuid !== intersectionObjGroup.uuid) {\r\n intersectionObjGroup.add(elementRef.current); // attach to Group\r\n setParentIdById(getObjectId(intersectionObjGroup), getObjectId(elementRef.current));\r\n }\r\n const { rot: intersectionObjGroupWorldRotation } = Util.getWorldDataById(getObjectId(intersectionObjGroup));\r\n elementParentRotation.set(0, 0, -intersectionObjGroupWorldRotation);\r\n const relPos = new Vector3()\r\n .subVectors(intersection.point, intersectionObjGroup.localToWorld(new Vector3()))\r\n .applyEuler(elementParentRotation);\r\n elementRef.current.position.copy(relPos); // relative abs position\r\n invalidate();\r\n }\r\n }\r\n\r\n if (!isHumanOrPlantMovedRef.current) {\r\n isHumanOrPlantMovedRef.current = true;\r\n }\r\n }\r\n }\r\n };\r\n\r\n // for tree, flower, and human for now\r\n const handleSetElementState = (elemId: string, standObjId: string, position: Vector3) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elemId) {\r\n // don't set parentId for foundations or cuboids as their parents are allowed to be ground only (for now)\r\n if (!Util.isFoundationOrCuboid(e)) e.parentId = standObjId;\r\n e.cx = position.x;\r\n e.cy = position.y;\r\n e.cz = position.z;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleUndoableResize = () => {\r\n if (!grabRef.current) return;\r\n const undoableResize = {\r\n name: 'Resize',\r\n timestamp: Date.now(),\r\n resizedElementId: grabRef.current.id,\r\n resizedElementType: grabRef.current.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n oldLx: oldDimensionRef.current.x,\r\n oldLy: oldDimensionRef.current.y,\r\n oldLz: oldDimensionRef.current.z,\r\n newLx: newDimensionRef.current.x,\r\n newLy: newDimensionRef.current.y,\r\n newLz: newDimensionRef.current.z,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldPolygonVerticesMap: new Map(oldPolygonVerticesMapRef.current),\r\n newPolygonVerticesMap: new Map(newPolygonVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n oldWallPointsMap: new Map(oldWallPointsMapRef.current),\r\n newWallPointsMap: new Map(newWallPointsMapRef.current),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.resizedElementId) {\r\n e.cx = undoableResize.oldCx;\r\n e.cy = undoableResize.oldCy;\r\n e.cz = undoableResize.oldCz;\r\n e.lx = undoableResize.oldLx;\r\n e.ly = undoableResize.oldLy;\r\n e.lz = undoableResize.oldLz;\r\n break;\r\n }\r\n }\r\n });\r\n if (undoableResize.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, p] of undoableResize.oldChildrenPositionsMap.entries()) {\r\n const elem = getElementById(id);\r\n if (elem?.type !== ObjectType.Polygon) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.cx = p.x;\r\n e.cy = p.y;\r\n if (!isRoofTopElement(e)) {\r\n e.cz = p.z;\r\n }\r\n if (e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n const oldPoints = undoableResize.oldWallPointsMap.get(w.id);\r\n if (oldPoints) {\r\n w.leftPoint = [oldPoints[0].x, oldPoints[0].y, 0];\r\n w.rightPoint = [oldPoints[1].x, oldPoints[1].y, 0];\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (undoableResize.oldWallPointsMap.size > 0) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n const oldParentId = undoableResize.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableResize.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n }\r\n if (undoableResize.oldPolygonVerticesMap.size > 0) {\r\n for (const [id, vertices] of undoableResize.oldPolygonVerticesMap.entries()) {\r\n const elem = getElementById(id);\r\n if (elem?.type === ObjectType.Polygon) {\r\n updatePolygonVerticesById(id, vertices);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === undoableResize.resizedElementId) {\r\n e.cx = undoableResize.newCx;\r\n e.cy = undoableResize.newCy;\r\n e.cz = undoableResize.newCz;\r\n e.lx = undoableResize.newLx;\r\n e.ly = undoableResize.newLy;\r\n e.lz = undoableResize.newLz;\r\n break;\r\n }\r\n }\r\n });\r\n if (undoableResize.newChildrenPositionsMap.size > 0) {\r\n for (const [id, p] of undoableResize.newChildrenPositionsMap.entries()) {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n e.cx = p.x;\r\n e.cy = p.y;\r\n if (e.type !== ObjectType.SolarPanel || (e as SolarPanelModel).parentType !== ObjectType.Roof) {\r\n e.cz = p.z;\r\n }\r\n if (e.type === ObjectType.Wall) {\r\n const w = e as WallModel;\r\n const oldPoints = undoableResize.newWallPointsMap.get(w.id);\r\n if (oldPoints) {\r\n w.leftPoint = [oldPoints[0].x, oldPoints[0].y, 0];\r\n w.rightPoint = [oldPoints[1].x, oldPoints[1].y, 0];\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (undoableResize.newWallPointsMap.size > 0) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n const oldParentId = undoableResize.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableResize.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableResize.newPolygonVerticesMap.size > 0) {\r\n for (const [id, vertices] of undoableResize.newPolygonVerticesMap.entries()) {\r\n const elem = getElementById(id);\r\n if (elem?.type === ObjectType.Polygon) {\r\n updatePolygonVerticesById(id, vertices);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableResize;\r\n return undoableResize;\r\n };\r\n\r\n const handleDetachParent = (elem: ElementModel, e: ElementModel) => {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = Util.getObjectChildById(contentRef?.current, elem.id);\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${e.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n }\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector3(e.cx, e.cy, e.cz)\r\n .applyEuler(new Euler(0, 0, elem.rotation[2]))\r\n .add(oldPositionRef.current);\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n };\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const groundClicked = e.intersections[0].object === groundPlaneRef.current;\r\n if (groundClicked) {\r\n setCommonStore((state) => {\r\n InnerCommonStoreState.selectNone(state);\r\n state.pastePoint.copy(e.intersections[0].point);\r\n state.clickObjectType = ObjectType.Ground;\r\n state.contextMenuObjectType = ObjectType.Ground;\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n });\r\n }\r\n }\r\n };\r\n\r\n const resizeElementOnPointerUp = (elem: ElementModel) => {\r\n const resizeHandleType = useStore.getState().resizeHandleType;\r\n // special cases\r\n switch (elem.type) {\r\n case ObjectType.Tree:\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Top:\r\n const undoableChangeHeight = {\r\n name: 'Change Tree Height',\r\n timestamp: Date.now(),\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n oldValue: oldDimensionRef.current.z,\r\n newValue: elem.lz,\r\n undo: () => {\r\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChangeHeight);\r\n setCommonStore((state) => {\r\n state.actionState.treeHeight = elem.lz;\r\n });\r\n return;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n const undoableChangeSpread = {\r\n name: 'Change Tree Spread',\r\n timestamp: Date.now(),\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n oldValue: oldDimensionRef.current.x,\r\n newValue: elem.lx,\r\n undo: () => {\r\n updateElementLxById(undoableChangeSpread.changedElementId, undoableChangeSpread.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLxById(undoableChangeSpread.changedElementId, undoableChangeSpread.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChangeSpread);\r\n setCommonStore((state) => {\r\n state.actionState.treeSpread = elem.lx;\r\n });\r\n return;\r\n }\r\n break;\r\n case ObjectType.Wall: {\r\n const undoableChangeHeight = {\r\n name: 'Change Wall Height',\r\n timestamp: Date.now(),\r\n changedElementId: elem.id,\r\n changedElementType: elem.type,\r\n oldValue: oldDimensionRef.current.z,\r\n newValue: elem.lz,\r\n undo: () => {\r\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLzById(undoableChangeHeight.changedElementId, undoableChangeHeight.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChangeHeight);\r\n setCommonStore((state) => {\r\n state.actionState.wallHeight = elem.lz;\r\n });\r\n return;\r\n }\r\n }\r\n\r\n // if the above condition is valid , it will return. So the following part will not run.\r\n newPositionRef.current.set(elem.cx, elem.cy, elem.cz);\r\n newDimensionRef.current.set(elem.lx, elem.ly, elem.lz);\r\n oldChildrenParentIdMapRef.current.clear();\r\n newChildrenParentIdMapRef.current.clear();\r\n newChildrenPositionsMapRef.current.clear();\r\n newPolygonVerticesMapRef.current.clear();\r\n newWallPointsMapRef.current.clear();\r\n setCommonStore((state) => {\r\n if (elem.type === ObjectType.Cuboid) {\r\n state.actionState.cuboidHeight = elem.lz;\r\n }\r\n state.updateSceneRadius();\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n // set ref children state\r\n if (elem.parentId === GROUND_ID) {\r\n for (const e of state.elements) {\r\n if (Util.isPlantOrHuman(e)) {\r\n if (e.parentId === elem.id) {\r\n oldChildrenParentIdMapRef.current.set(e.id, elem.id);\r\n if (!Util.isResizingVertical(useStore.getState().resizeHandleType)) {\r\n // top face\r\n if (Math.abs(oldDimensionRef.current.z / 2 - e.cz) < 0.01) {\r\n // fixed position\r\n const newRelativePos = new Vector3(e.cx, e.cy, e.cz)\r\n .applyEuler(new Euler(0, 0, elem.rotation[2]))\r\n .add(oldPositionRef.current)\r\n .sub(newPositionRef.current)\r\n .applyEuler(new Euler(0, 0, -elem.rotation[2]));\r\n // detach parent dom if falls on ground\r\n if (\r\n Math.abs(newRelativePos.x) > Math.abs(newDimensionRef.current.x / 2) + 0.01 ||\r\n Math.abs(newRelativePos.y) > Math.abs(newDimensionRef.current.y / 2) + 0.01\r\n ) {\r\n handleDetachParent(elem, e);\r\n } else {\r\n e.cx = newRelativePos.x;\r\n e.cy = newRelativePos.y;\r\n }\r\n }\r\n // side faces\r\n else {\r\n const oldRelativePos = new Vector3(e.cx, e.cy, e.cz);\r\n const d = new Vector3().subVectors(newPositionRef.current, oldPositionRef.current);\r\n const v = new Vector3().subVectors(oldRelativePos, d);\r\n // west and east face\r\n if (Math.abs(oldRelativePos.x / oldDimensionRef.current.x) > 0.49) {\r\n if (Math.abs(v.y) > elem.ly / 2 + 0.5) {\r\n handleDetachParent(elem, e);\r\n } else {\r\n e.cx = (oldRelativePos.x > 0 ? elem.lx : -elem.lx) / 2;\r\n e.cy = v.y;\r\n }\r\n }\r\n // north and south face\r\n else if (Math.abs(oldRelativePos.y / oldDimensionRef.current.y) > 0.49) {\r\n if (Math.abs(v.x) > elem.lx / 2 + 0.5) {\r\n handleDetachParent(elem, e);\r\n } else {\r\n e.cx = v.x;\r\n e.cy = (oldRelativePos.y > 0 ? elem.ly : -elem.ly) / 2;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n if (\r\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE &&\r\n newDimensionRef.current.distanceToSquared(oldDimensionRef.current) > ZERO_TOLERANCE\r\n ) {\r\n // store the new positions of the children if the selected element may be a parent\r\n if (elem.type === ObjectType.Foundation || elem.type === ObjectType.Cuboid) {\r\n const children = getChildren(elem.id);\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (c.type === ObjectType.Polygon) {\r\n newPolygonVerticesMapRef.current.set(\r\n c.id,\r\n (c as PolygonModel).vertices.map((v) => ({ ...v })),\r\n );\r\n } else {\r\n if (c.type === ObjectType.Wall) {\r\n const w = c as WallModel;\r\n const leftPoint = new Vector2(w.leftPoint[0], w.leftPoint[1]);\r\n const rightPoint = new Vector2(w.rightPoint[0], w.rightPoint[1]);\r\n newWallPointsMapRef.current.set(c.id, [leftPoint, rightPoint]);\r\n }\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n if (elem.type === ObjectType.Foundation) {\r\n const elementsOnRoof = getRooftopChildren(elem.id);\r\n if (elementsOnRoof.length > 0) {\r\n for (const e of elementsOnRoof) {\r\n const centerRelPos = new Vector3(e.cx, e.cy);\r\n newChildrenPositionsMapRef.current.set(e.id, centerRelPos);\r\n }\r\n }\r\n }\r\n }\r\n const undoableResize = handleUndoableResize();\r\n undoableResize && addUndoable(undoableResize);\r\n }\r\n };\r\n\r\n const isMoveToSky = () => {\r\n if (useStore.getState().viewState.orthographic) return false; // impossible to move to sky in 2D mode\r\n if (groundPlaneRef.current) {\r\n const intersections = ray.intersectObjects(getThree().scene.children, true);\r\n if (intersections.length > 0) {\r\n for (const intersection of intersections) {\r\n if (intersection.object.userData.stand) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n return ray.intersectObjects([groundPlaneRef.current!]).length === 0;\r\n };\r\n\r\n const updateBaseGroupPosition = (map: Map) => {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (map.has(elem.id)) {\r\n const pos = map.get(elem.id);\r\n if (pos) {\r\n elem.cx = pos[0];\r\n elem.cy = pos[1];\r\n elem.cz = pos[2];\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const moveElementOnPointerUp = (elem: ElementModel, e: PointerEvent) => {\r\n if (elem.locked) return;\r\n newPositionRef.current.set(elem.cx, elem.cy, elem.cz);\r\n let newHumanOrPlantParentId: string | null = oldHumanOrPlantParentIdRef.current;\r\n // elements modified by reference\r\n let elementRef: Group | null | undefined = null;\r\n setRayCast(e);\r\n switch (elem.type) {\r\n case ObjectType.Tree:\r\n elementRef = useRefStore.getState().treeRef?.current;\r\n break;\r\n case ObjectType.Flower:\r\n elementRef = useRefStore.getState().flowerRef?.current;\r\n break;\r\n case ObjectType.Human:\r\n elementRef = useRefStore.getState().humanRef?.current;\r\n break;\r\n }\r\n if (elementRef && isHumanOrPlantMovedRef.current) {\r\n const intersections = ray.intersectObjects(Util.fetchIntersectables(scene), false);\r\n const intersection = getIntersectionToStand(intersections); // could simplify???\r\n if (intersection) {\r\n const p = intersection.point;\r\n // on ground\r\n if (intersection.object.name === 'Ground') {\r\n handleSetElementState(elem.id, GROUND_ID, p);\r\n newPositionRef.current.set(p.x, p.y, p.z);\r\n newHumanOrPlantParentId = GROUND_ID;\r\n }\r\n // on other standable elements\r\n else if (intersection.object.userData.stand) {\r\n const intersectionObjId = getObjectId(intersection.object);\r\n const intersectionObjGroup = intersection.object.parent;\r\n if (intersectionObjGroup) {\r\n const relPos = new Vector3()\r\n .subVectors(p, intersectionObjGroup.localToWorld(new Vector3()))\r\n .applyEuler(elementParentRotation);\r\n handleSetElementState(elem.id, intersectionObjId, relPos);\r\n newPositionRef.current.set(relPos.x, relPos.y, relPos.z);\r\n newHumanOrPlantParentId = intersectionObjId;\r\n }\r\n }\r\n }\r\n isHumanOrPlantMovedRef.current = false;\r\n }\r\n if (\r\n newPositionRef.current.distanceToSquared(oldPositionRef.current) > ZERO_TOLERANCE ||\r\n ray.intersectObjects([groundPlaneRef.current!]).length === 0\r\n ) {\r\n let moveOk = true;\r\n if (!useStore.getState().viewState.orthographic) {\r\n // OK to move closer to the origin\r\n moveOk = newPositionRef.current.length() < oldPositionRef.current.length();\r\n if (!moveOk) {\r\n // in the case that it is moving away from the origin, check it will be too far\r\n const screenPosition = newPositionRef.current.clone().project(camera);\r\n const screenLx = newPositionRef.current\r\n .clone()\r\n .add(new Vector3(elem.lx, 0, 0))\r\n .project(camera)\r\n .distanceTo(screenPosition);\r\n const screenLy = newPositionRef.current\r\n .clone()\r\n .add(new Vector3(0, elem.ly ?? 1, 0))\r\n .project(camera)\r\n .distanceTo(screenPosition);\r\n const screenLz = newPositionRef.current\r\n .clone()\r\n .add(new Vector3(0, 0, elem.lz))\r\n .project(camera)\r\n .distanceTo(screenPosition);\r\n // OK if larger than 2% of screen dimension\r\n moveOk = Math.max(screenLx, screenLy, screenLz) > 0.02;\r\n }\r\n }\r\n if (!moveOk || isMoveToSky()) {\r\n setElementPosition(elem.id, oldPositionRef.current.x, oldPositionRef.current.y, oldPositionRef.current.z);\r\n if (elementRef) {\r\n if (Util.isPlantOrHuman(elem)) {\r\n elementRef.position.copy(oldPositionRef.current);\r\n }\r\n }\r\n if (Util.isPlantOrHuman(elem)) {\r\n setParentIdById(oldHumanOrPlantParentIdRef.current, elem.id);\r\n }\r\n const contentRef = useRefStore.getState().contentRef;\r\n if (contentRef?.current && oldHumanOrPlantParentIdRef.current && elementRef) {\r\n if (oldHumanOrPlantParentIdRef.current === GROUND_ID) {\r\n contentRef.current.add(elementRef);\r\n } else {\r\n const attachParentObj = Util.getObjectChildById(contentRef.current, oldHumanOrPlantParentIdRef.current);\r\n attachParentObj?.add(elementRef);\r\n }\r\n invalidate();\r\n }\r\n showError(i18n.t('message.CannotMoveObjectTooFar', lang));\r\n } else {\r\n if (baseGroupRelPosMapRef.current.size > 1) {\r\n baseGroupNewPosMapRef.current.clear();\r\n for (const elem of useStore.getState().elements) {\r\n if (baseGroupOldPosMapRef.current.has(elem.id)) {\r\n baseGroupNewPosMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz]);\r\n }\r\n }\r\n const undoableMove = {\r\n name: 'Move Foundation Group',\r\n timestamp: Date.now(),\r\n oldPositionMap: new Map(baseGroupOldPosMapRef.current),\r\n newPositionMap: new Map(baseGroupNewPosMapRef.current),\r\n undo: () => {\r\n updateBaseGroupPosition(undoableMove.oldPositionMap);\r\n },\r\n redo: () => {\r\n updateBaseGroupPosition(undoableMove.newPositionMap);\r\n },\r\n } as UndoableMoveFoundationGroup;\r\n addUndoable(undoableMove);\r\n } else {\r\n const isCuboid = elem.type === ObjectType.Cuboid;\r\n const oldParentId = isCuboid ? oldCuboidParentIdRef.current : oldHumanOrPlantParentIdRef.current;\r\n const newParentId = isCuboid ? elem.parentId : newHumanOrPlantParentId;\r\n const undoableMove = {\r\n name: 'Move',\r\n timestamp: Date.now(),\r\n movedElementId: elem.id,\r\n movedElementType: elem.type,\r\n oldCx: oldPositionRef.current.x,\r\n oldCy: oldPositionRef.current.y,\r\n oldCz: oldPositionRef.current.z,\r\n newCx: newPositionRef.current.x,\r\n newCy: newPositionRef.current.y,\r\n newCz: newPositionRef.current.z,\r\n oldRotation: [...oldRotationRef.current],\r\n newRotation: [...elem.rotation],\r\n oldParentId: oldParentId,\r\n newParentId: newParentId,\r\n undo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.oldCx,\r\n undoableMove.oldCy,\r\n undoableMove.oldCz,\r\n );\r\n setCommonStore((state) => {\r\n const e = state.elements.find((e) => e.id === undoableMove.movedElementId);\r\n if (e && undoableMove.oldRotation) e.rotation = [...undoableMove.oldRotation];\r\n });\r\n setParentIdById(undoableMove.oldParentId, undoableMove.movedElementId);\r\n if (undoableMove.movedElementType && isHumanOrPlant(undoableMove.movedElementType)) {\r\n attachToGroup(undoableMove.oldParentId, undoableMove.newParentId, undoableMove.movedElementId);\r\n }\r\n },\r\n redo: () => {\r\n setElementPosition(\r\n undoableMove.movedElementId,\r\n undoableMove.newCx,\r\n undoableMove.newCy,\r\n undoableMove.newCz,\r\n );\r\n setCommonStore((state) => {\r\n const e = state.elements.find((e) => e.id === undoableMove.movedElementId);\r\n if (e && undoableMove.newRotation) e.rotation = [...undoableMove.newRotation];\r\n });\r\n setParentIdById(undoableMove.newParentId, undoableMove.movedElementId);\r\n if (undoableMove.movedElementType && isHumanOrPlant(undoableMove.movedElementType)) {\r\n attachToGroup(undoableMove.newParentId, undoableMove.oldParentId, undoableMove.movedElementId);\r\n }\r\n },\r\n } as UndoableMove;\r\n addUndoable(undoableMove);\r\n }\r\n baseGroupRelPosMapRef.current.clear();\r\n updateSceneRadius();\r\n }\r\n }\r\n };\r\n\r\n const rotateElementOnPointerUp = (elem: ElementModel) => {\r\n newRotationRef.current = [...elem.rotation];\r\n const oldRotation = new Vector3().fromArray(oldRotationRef.current);\r\n const newRotation = new Vector3().fromArray(newRotationRef.current);\r\n if (newRotation.distanceToSquared(oldRotation) > ZERO_TOLERANCE) {\r\n const undoableRotate = {\r\n name: 'Rotate',\r\n timestamp: Date.now(),\r\n rotatedElementId: elem.id,\r\n rotatedElementType: elem.type,\r\n oldRotation: oldRotationRef.current,\r\n newRotation: newRotationRef.current,\r\n undo: () => {\r\n setElementRotation(\r\n undoableRotate.rotatedElementId,\r\n undoableRotate.oldRotation[0],\r\n undoableRotate.oldRotation[1],\r\n undoableRotate.oldRotation[2],\r\n );\r\n },\r\n redo: () => {\r\n setElementRotation(\r\n undoableRotate.rotatedElementId,\r\n undoableRotate.newRotation[0],\r\n undoableRotate.newRotation[1],\r\n undoableRotate.newRotation[2],\r\n );\r\n },\r\n } as UndoableRotate;\r\n addUndoable(undoableRotate);\r\n }\r\n };\r\n\r\n const handlePointerUp = (e: PointerEvent) => {\r\n if (e.button === 2) return;\r\n useRefStore.setState((state) => {\r\n state.setEnableOrbitController(true);\r\n });\r\n if (grabRef.current) {\r\n const elem = getElementById(grabRef.current.id);\r\n if (elem) {\r\n // adding foundation end point\r\n if (isSettingFoundationEndPointRef.current) {\r\n isSettingFoundationStartPointRef.current = false;\r\n isSettingFoundationEndPointRef.current = false;\r\n setCommonStore((state) => {\r\n state.addedFoundationId = null;\r\n state.updateSceneRadius();\r\n });\r\n if (elem.lx <= 0.1 || elem.ly <= 0.1) {\r\n removeElementById(elem.id, false);\r\n } else {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: elem,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n updateSceneRadius();\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n state.updateSceneRadius();\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n }\r\n }\r\n // adding cuboid end point\r\n else if (isSettingCuboidEndPointRef.current) {\r\n isSettingCuboidStartPointRef.current = false;\r\n isSettingCuboidEndPointRef.current = false;\r\n setCommonStore((state) => {\r\n state.addedCuboidId = null;\r\n state.updateSceneRadius();\r\n });\r\n if (elem.lx <= 0.1 || elem.ly <= 0.1) {\r\n removeElementById(elem.id, false);\r\n } else {\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: elem,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n updateSceneRadius();\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n state.updateSceneRadius();\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n }\r\n }\r\n // handling editing events\r\n else {\r\n if (useStore.getState().resizeHandleType) {\r\n resizeElementOnPointerUp(elem);\r\n } else if (useStore.getState().rotateHandleType) {\r\n rotateElementOnPointerUp(elem);\r\n } else if (useStore.getState().moveHandleType) {\r\n moveElementOnPointerUp(elem, e);\r\n }\r\n if (elem.type === ObjectType.Foundation) {\r\n usePrimitiveStore.getState().updateFoundationMovedFlag();\r\n }\r\n }\r\n }\r\n grabRef.current = null;\r\n }\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.rotateHandleType = null;\r\n });\r\n useRefStore.setState((state) => {\r\n state.humanRef = null;\r\n state.treeRef = null;\r\n state.flowerRef = null;\r\n });\r\n };\r\n\r\n const setBasePosMap = (element: ElementModel, pointer: Vector3) => {\r\n const { pos } = Util.getWorldDataById(element.id);\r\n const center = new Vector3(pos.x, pos.y);\r\n const diff = new Vector3().subVectors(center, pointer);\r\n baseGroupRelPosMapRef.current.set(element.id, diff);\r\n baseGroupOldPosMapRef.current.set(element.id, [element.cx, element.cy, element.cz]);\r\n };\r\n\r\n const checkOverlapWithAllBases = (event: ThreeEvent, currElem: GroupableModel) => {\r\n const pointer = event.intersections[0].point.clone().setZ(0);\r\n for (const element of useStore.getState().elements) {\r\n if (\r\n isGroupable(element) &&\r\n element.parentId === GROUND_ID &&\r\n !element.locked &&\r\n element.id !== currElem.id &&\r\n !baseGroupRelPosMapRef.current.has(element.id) &&\r\n !Util.isChild(currElem.id, element.id) &&\r\n !Util.isChild(element.id, currElem.id) &&\r\n Util.areTwoBasesOverlapped(element, currElem)\r\n ) {\r\n setBasePosMap(element, pointer);\r\n if ((element as GroupableModel).enableGroupMaster) {\r\n checkOverlapWithAllBases(event, element);\r\n }\r\n }\r\n if (element.id === currElem.id) {\r\n setBasePosMap(element, pointer);\r\n }\r\n }\r\n };\r\n\r\n const handleGroupMaster = (event: ThreeEvent, currElem: GroupableModel) => {\r\n baseGroupRelPosMapRef.current.clear();\r\n baseGroupOldPosMapRef.current.clear();\r\n if (!currElem.enableGroupMaster) return;\r\n if (useStore.getState().moveHandleType) {\r\n checkOverlapWithAllBases(event, currElem);\r\n }\r\n };\r\n\r\n // todo: should add sensor and light\r\n const isRoofTopElement = (e: ElementModel) => {\r\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) return true;\r\n if (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Roof) return true;\r\n };\r\n\r\n const getRooftopChildren = (fId: string) => {\r\n return useStore.getState().elements.filter((e) => {\r\n if (e.foundationId !== fId) return false;\r\n if (e.type === ObjectType.SolarPanel && (e as SolarPanelModel).parentType === ObjectType.Roof) return true;\r\n if (e.type === ObjectType.Window && (e as WindowModel).parentType === ObjectType.Roof) return true;\r\n if (e.type === ObjectType.Sensor || e.type === ObjectType.Light) return true;\r\n });\r\n };\r\n\r\n const handlePointerDown = (e: ThreeEvent) => {\r\n if (e.button === 2) return; // ignore right-click\r\n if (e.intersections.length === 0 || !groundPlaneRef.current) return;\r\n // adding foundation start point\r\n if (isSettingFoundationStartPointRef.current) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([groundPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = ResizeHandleType.LowerRight;\r\n state.resizeAnchor.copy(intersects[0].point);\r\n });\r\n isSettingFoundationStartPointRef.current = false;\r\n isSettingFoundationEndPointRef.current = true;\r\n }\r\n return;\r\n }\r\n // adding cuboid start point\r\n if (isSettingCuboidStartPointRef.current) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([groundPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n useRefStore.getState().setEnableOrbitController(false);\r\n setCommonStore((state) => {\r\n state.moveHandleType = null;\r\n state.resizeHandleType = ResizeHandleType.LowerRight;\r\n state.resizeAnchor.copy(intersects[0].point);\r\n if (grabRef.current) {\r\n const firstIntersectedCuboidObject = getFirstStackableCuboid(e, grabRef.current?.id);\r\n if (firstIntersectedCuboidObject) {\r\n const intersects = ray.intersectObjects([firstIntersectedCuboidObject.eventObject]);\r\n if (intersects.length > 0) {\r\n state.resizeAnchor.copy(intersects[0].point);\r\n }\r\n }\r\n }\r\n });\r\n isSettingCuboidStartPointRef.current = false;\r\n isSettingCuboidEndPointRef.current = true;\r\n }\r\n return;\r\n }\r\n\r\n const groundClicked = e.intersections[0].object === groundPlaneRef.current;\r\n if (groundClicked) {\r\n if (!useStore.getState().multiSelectionsMode) {\r\n setCommonStore((state) => {\r\n state.clickObjectType = ObjectType.Ground;\r\n state.selectedElement = null;\r\n InnerCommonStoreState.selectNone(state);\r\n state.contextMenuObjectType = null;\r\n });\r\n }\r\n if (legalOnGround(objectTypeToAdd)) {\r\n const position = e.intersections[0].point;\r\n const addedElement = addElement(groundModel, position);\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: addedElement,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n updateSceneRadius();\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n state.updateSceneRadius();\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n setCommonStore((state) => {\r\n if (!state.actionModeLock) state.objectTypeToAdd = ObjectType.None;\r\n state.updateSceneRadius();\r\n });\r\n }\r\n } else {\r\n const selectedElementIdSet = useStore.getState().selectedElementIdSet;\r\n if (selectedElementIdSet.size > 1) {\r\n const selectedElement = useStore.getState().selectedElement;\r\n if (selectedElement) {\r\n grabRef.current = selectedElement;\r\n baseGroupRelPosMapRef.current.clear();\r\n for (const elem of useStore.getState().elements) {\r\n if (Util.isElementAllowedMultipleMoveOnGround(elem) && selectedElementIdSet.has(elem.id)) {\r\n const base = elem as GroupableModel;\r\n if (base.enableGroupMaster) {\r\n checkOverlapWithAllBases(e, elem);\r\n } else {\r\n const pointer = e.intersections[0].point.clone().setZ(0);\r\n setBasePosMap(elem, pointer);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const selectedElement = getSelectedElement();\r\n if (selectedElement && legalOnGround(selectedElement.type)) {\r\n grabRef.current = selectedElement;\r\n // save info for undo\r\n oldPositionRef.current.set(selectedElement.cx, selectedElement.cy, selectedElement.cz);\r\n oldDimensionRef.current.set(selectedElement.lx, selectedElement.ly, selectedElement.lz);\r\n oldRotationRef.current = [...selectedElement.rotation];\r\n\r\n // store the positions of the children if the selected element may be a parent\r\n if (selectedElement.type === ObjectType.Foundation || selectedElement.type === ObjectType.Cuboid) {\r\n const children = getChildren(selectedElement.id);\r\n oldChildrenPositionsMapRef.current.clear();\r\n oldPolygonVerticesMapRef.current.clear();\r\n oldWallPointsMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (c.type === ObjectType.Polygon) {\r\n oldPolygonVerticesMapRef.current.set(\r\n c.id,\r\n (c as PolygonModel).vertices.map((v) => ({ ...v })),\r\n );\r\n } else {\r\n if (c.type === ObjectType.Wall) {\r\n const w = c as WallModel;\r\n const leftPoint = new Vector2(w.leftPoint[0], w.leftPoint[1]);\r\n const rightPoint = new Vector2(w.rightPoint[0], w.rightPoint[1]);\r\n oldWallPointsMapRef.current.set(c.id, [leftPoint, rightPoint]);\r\n }\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n if (selectedElement.type === ObjectType.Foundation) {\r\n const elementsOnRoof = getRooftopChildren(selectedElement.id);\r\n if (elementsOnRoof.length > 0) {\r\n for (const e of elementsOnRoof) {\r\n // skylight window position is absolute to foundation\r\n const centerRelPos = new Vector3(e.cx, e.cy);\r\n oldChildrenPositionsMapRef.current.set(e.id, centerRelPos);\r\n }\r\n }\r\n }\r\n }\r\n switch (selectedElement.type) {\r\n case ObjectType.Tree:\r\n oldHumanOrPlantParentIdRef.current = selectedElement.parentId;\r\n oldDimensionRef.current.set(selectedElement.lx, selectedElement.ly, selectedElement.lz);\r\n break;\r\n case ObjectType.Flower:\r\n oldHumanOrPlantParentIdRef.current = selectedElement.parentId;\r\n break;\r\n case ObjectType.Human:\r\n oldHumanOrPlantParentIdRef.current = selectedElement.parentId;\r\n break;\r\n case ObjectType.Cuboid:\r\n if (isGroupable(selectedElement) && selectedElement.parentId === GROUND_ID) {\r\n handleGroupMaster(e, selectedElement as GroupableModel);\r\n } else {\r\n baseGroupRelPosMapRef.current.clear();\r\n }\r\n oldCuboidParentIdRef.current = selectedElement.parentId;\r\n const moveHandleType = useStore.getState().moveHandleType;\r\n if (moveHandleType) {\r\n const { rot } = Util.getWorldDataById(selectedElement.id);\r\n const euler = new Euler(0, 0, rot);\r\n switch (useStore.getState().moveHandleType) {\r\n case MoveHandleType.Right: {\r\n moveHandleWorldDiffV3Ref.current.set(-selectedElement.lx / 2, 0, 0).applyEuler(euler);\r\n break;\r\n }\r\n case MoveHandleType.Left: {\r\n moveHandleWorldDiffV3Ref.current.set(selectedElement.lx / 2, 0, 0).applyEuler(euler);\r\n break;\r\n }\r\n case MoveHandleType.Lower: {\r\n moveHandleWorldDiffV3Ref.current.set(0, selectedElement.ly / 2, 0).applyEuler(euler);\r\n break;\r\n }\r\n case MoveHandleType.Upper: {\r\n moveHandleWorldDiffV3Ref.current.set(0, -selectedElement.ly / 2, 0).applyEuler(euler);\r\n break;\r\n }\r\n default: {\r\n moveHandleWorldDiffV3Ref.current.set(0, 0, 0);\r\n break;\r\n }\r\n }\r\n }\r\n // getting ready for resizing even though it may not happen\r\n absPosMapRef.current.clear();\r\n const { pos, rot } = Util.getWorldDataById(selectedElement.id);\r\n const cuboidCenter = new Vector3(pos.x, pos.y, pos.z);\r\n const cuboidChildren = getChildren(selectedElement.id);\r\n if (cuboidChildren.length > 0) {\r\n for (const e of cuboidChildren) {\r\n switch (e.type) {\r\n case ObjectType.Cuboid: {\r\n const centerAbsPos = new Vector3(e.cx, e.cy, e.cz).applyEuler(new Euler(0, 0, rot));\r\n centerAbsPos.add(cuboidCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n break;\r\n }\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n const centerAbsPos = new Vector3(e.cx, e.cy, e.cz).applyEuler(new Euler(0, 0, rot));\r\n centerAbsPos.add(cuboidCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Light:\r\n case ObjectType.Sensor:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n const centerAbsPos = new Vector3(\r\n e.cx * selectedElement.lx,\r\n e.cy * selectedElement.ly,\r\n e.cz * selectedElement.lz,\r\n ).applyEuler(new Euler(0, 0, rot));\r\n centerAbsPos.add(cuboidCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n const polygon = e as PolygonModel;\r\n const vertexAbsPosArray: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n const vertexAbsPos = new Vector2(\r\n v.x * selectedElement.lx,\r\n v.y * selectedElement.ly,\r\n ).rotateAround(ORIGIN_VECTOR2, rot);\r\n vertexAbsPos.add(new Vector2(cuboidCenter.x, cuboidCenter.y));\r\n vertexAbsPosArray.push(vertexAbsPos);\r\n }\r\n polygonsAbsPosMapRef.current.set(polygon.id, vertexAbsPosArray);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n case ObjectType.Foundation:\r\n if (isGroupable(selectedElement)) {\r\n handleGroupMaster(e, selectedElement as GroupableModel);\r\n }\r\n // getting ready for resizing even though it may not happen\r\n absPosMapRef.current.clear();\r\n polygonsAbsPosMapRef.current.clear();\r\n wallsAbsPosMapRef.current.clear();\r\n const foundationCenterV2 = new Vector2(selectedElement.cx, selectedElement.cy);\r\n const foundationCenter = new Vector3(selectedElement.cx, selectedElement.cy, selectedElement.cz);\r\n const foundationChildren = getChildren(selectedElement.id);\r\n if (foundationChildren.length > 0) {\r\n const a = selectedElement.rotation[2];\r\n for (const e of foundationChildren) {\r\n switch (e.type) {\r\n case ObjectType.Wall:\r\n const wall = e as WallModel;\r\n const centerPointAbsPos = new Vector2(wall.cx, wall.cy).rotateAround(ORIGIN_VECTOR2, a);\r\n centerPointAbsPos.add(foundationCenterV2);\r\n const leftPointAbsPos = new Vector2(wall.leftPoint[0], wall.leftPoint[1]).rotateAround(\r\n ORIGIN_VECTOR2,\r\n a,\r\n );\r\n leftPointAbsPos.add(foundationCenterV2);\r\n const rightPointAbsPos = new Vector2(wall.rightPoint[0], wall.rightPoint[1]).rotateAround(\r\n ORIGIN_VECTOR2,\r\n a,\r\n );\r\n rightPointAbsPos.add(foundationCenterV2);\r\n wallsAbsPosMapRef.current.set(wall.id, {\r\n centerPointAbsPos,\r\n leftPointAbsPos,\r\n rightPointAbsPos,\r\n });\r\n break;\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n const centerAbsPos = new Vector3(e.cx, e.cy, e.cz).applyEuler(new Euler(0, 0, a));\r\n centerAbsPos.add(foundationCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const centerAbsPos = new Vector3(\r\n e.cx * selectedElement.lx,\r\n e.cy * selectedElement.ly,\r\n e.cz * selectedElement.lz,\r\n ).applyEuler(new Euler(0, 0, a));\r\n centerAbsPos.add(foundationCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = e as PolygonModel;\r\n const vertexAbsPosArray: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n const vertexAbsPos = new Vector2(\r\n v.x * selectedElement.lx,\r\n v.y * selectedElement.ly,\r\n ).rotateAround(ORIGIN_VECTOR2, a);\r\n vertexAbsPos.add(foundationCenterV2);\r\n vertexAbsPosArray.push(vertexAbsPos);\r\n }\r\n polygonsAbsPosMapRef.current.set(polygon.id, vertexAbsPosArray);\r\n break;\r\n }\r\n }\r\n }\r\n const elementsOnRoof = getRooftopChildren(selectedElement.id);\r\n if (elementsOnRoof.length > 0) {\r\n const euler = new Euler(0, 0, selectedElement.rotation[2]);\r\n for (const e of elementsOnRoof) {\r\n // skylight window position is absolute to foundation\r\n if (e.type === ObjectType.Window) {\r\n const centerAbsPos = new Vector3(e.cx, e.cy).applyEuler(euler);\r\n centerAbsPos.add(foundationCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n } else {\r\n const centerAbsPos = new Vector3(e.cx * selectedElement.lx, e.cy * selectedElement.ly).applyEuler(\r\n euler,\r\n );\r\n centerAbsPos.add(foundationCenter);\r\n absPosMapRef.current.set(e.id, centerAbsPos);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const isHumanOrPlant = (type: ObjectType) => {\r\n return type === ObjectType.Human || type === ObjectType.Tree || type === ObjectType.Flower;\r\n };\r\n\r\n const handleTempHumanPlantChild = (state: CommonStoreState, parentId: string) => {\r\n if (state.tempHumanPlant.length === 0) {\r\n const temp = state.elements.filter((e) => {\r\n return isHumanOrPlant(e.type) && Util.isDescendantOf(e, parentId);\r\n });\r\n state.tempHumanPlant = temp;\r\n const set = new Set(temp.map((e) => e.id));\r\n state.elements = state.elements.filter((e) => !set.has(e.id));\r\n }\r\n };\r\n\r\n /** self, child and group Master group exclusive */\r\n const getFirstStackableCuboid = (e: ThreeEvent, currId: string) => {\r\n const firstIntersectedCuboidObject = e.intersections.find((intersect) => {\r\n const obj = intersect.eventObject;\r\n if (!obj.name.includes('Cuboid')) return false;\r\n const nameArray = obj.name.split(' ');\r\n if (nameArray.length !== 2) return false;\r\n return nameArray[1] !== currId && obj.userData.stackable;\r\n });\r\n\r\n if (!firstIntersectedCuboidObject) return undefined;\r\n\r\n const firstIntersectedCuboidObjectId = firstIntersectedCuboidObject.eventObject.name.split(' ')[1];\r\n\r\n if (baseGroupRelPosMapRef.current.has(firstIntersectedCuboidObjectId)) return undefined;\r\n\r\n return Util.isChild(currId, firstIntersectedCuboidObjectId) ? undefined : firstIntersectedCuboidObject;\r\n };\r\n\r\n const handleGroundPointerMove = (e: ThreeEvent) => {\r\n if (grabRef.current && grabRef.current.type && !grabRef.current.locked) {\r\n setRayCast(e);\r\n let intersects;\r\n switch (grabRef.current.type) {\r\n case ObjectType.Foundation:\r\n if (intersectionPlaneRef.current) {\r\n intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n if (moveHandleType) {\r\n handleMove(intersects[0].point);\r\n } else if (resizeHandleType) {\r\n handleResize(intersects[0].point);\r\n } else if (rotateHandleType) {\r\n handleRotate(intersects[0].point);\r\n }\r\n }\r\n }\r\n break;\r\n case ObjectType.Cuboid:\r\n if (intersectionPlaneRef.current) {\r\n if (intersectionPlaneType === IntersectionPlaneType.Horizontal) {\r\n intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point.clone();\r\n const firstIntersectedCuboidObject = getFirstStackableCuboid(e, grabRef.current.id);\r\n if (moveHandleType) {\r\n if (baseGroupRelPosMapRef.current.size > 1) {\r\n handleMove(p);\r\n } else if (firstIntersectedCuboidObject) {\r\n intersects = ray.intersectObjects([firstIntersectedCuboidObject.eventObject]);\r\n if (intersects.length === 0) return;\r\n p.copy(intersects[0].point).add(moveHandleWorldDiffV3Ref.current);\r\n const newParentId = firstIntersectedCuboidObject.eventObject.name.split(' ')[1];\r\n setCommonStore((state) => {\r\n // todo: move grouped cuboid\r\n const cuboid = state.elements.find((e) => e.id === state.selectedElement?.id);\r\n const selectedElement = state.selectedElement; // old cuboid\r\n if (cuboid && selectedElement) {\r\n const { pos: parentAbsPos, rot: parentAbsRot } = Util.getWorldDataById(newParentId);\r\n const diff = new Vector3().subVectors(p, parentAbsPos);\r\n diff.applyEuler(new Euler(0, 0, -parentAbsRot));\r\n cuboid.cx = diff.x;\r\n cuboid.cy = diff.y;\r\n if (selectedElement.parentId !== newParentId) {\r\n if (cuboid.parentId !== newParentId) {\r\n handleTempHumanPlantChild(state, cuboid.id);\r\n }\r\n const { rot: currAbsRot } = Util.getWorldDataById(selectedElement.id);\r\n cuboid.rotation[2] = currAbsRot - parentAbsRot;\r\n cuboid.parentId = newParentId;\r\n } else if (cuboid.parentId !== newParentId) {\r\n if (cuboid.parentId !== selectedElement.parentId) {\r\n handleTempHumanPlantChild(state, cuboid.id);\r\n }\r\n cuboid.parentId = selectedElement.parentId;\r\n cuboid.rotation[2] = selectedElement.rotation[2];\r\n }\r\n }\r\n });\r\n } else {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === grabRef.current!.id);\r\n if (cuboid && cuboid.parentId !== GROUND_ID) {\r\n if (cuboid.parentId !== GROUND_ID) {\r\n handleTempHumanPlantChild(state, cuboid.id);\r\n }\r\n const { rot: parentAbsRot } = Util.getWorldDataById(cuboid.parentId);\r\n cuboid.rotation[2] += parentAbsRot;\r\n cuboid.parentId = GROUND_ID;\r\n }\r\n });\r\n handleMove(p);\r\n }\r\n } else if (resizeHandleType) {\r\n const cuboid = getElementById(grabRef.current.id);\r\n if (cuboid && cuboid.parentId === GROUND_ID) {\r\n handleResize(p);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // add drag and draw element\r\n if (groundPlaneRef.current) {\r\n // add new element\r\n if (objectTypeToAdd !== ObjectType.None) {\r\n setRayCast(e);\r\n const intersects = ray.intersectObjects([groundPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point;\r\n switch (objectTypeToAdd) {\r\n case ObjectType.Foundation: {\r\n const foundation = addElement(groundModel, p);\r\n if (foundation) {\r\n setCommonStore((state) => {\r\n state.addedFoundationId = foundation.id;\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n grabRef.current = foundation;\r\n isSettingFoundationStartPointRef.current = true;\r\n }\r\n break;\r\n }\r\n case ObjectType.Cuboid: {\r\n const cuboid = addElement(groundModel, p);\r\n if (cuboid) {\r\n setCommonStore((state) => {\r\n state.addedCuboidId = cuboid.id;\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n grabRef.current = cuboid;\r\n isSettingCuboidStartPointRef.current = true;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // setting start point\r\n if (grabRef.current && (isSettingFoundationStartPointRef.current || isSettingCuboidStartPointRef.current)) {\r\n setRayCast(e);\r\n let intersects = ray.intersectObjects([groundPlaneRef.current]);\r\n if (intersects.length === 0) return;\r\n const p = intersects[0].point;\r\n if (grabRef.current.type === ObjectType.Foundation) {\r\n setElementPosition(grabRef.current.id, p.x, p.y);\r\n } else if (grabRef.current.type === ObjectType.Cuboid) {\r\n const firstIntersectedCuboidObject = getFirstStackableCuboid(e, grabRef.current.id);\r\n if (firstIntersectedCuboidObject) {\r\n intersects = ray.intersectObjects([firstIntersectedCuboidObject.eventObject]);\r\n if (intersects.length === 0) return;\r\n p.copy(intersects[0].point);\r\n const newParentId = firstIntersectedCuboidObject.eventObject.name.split(' ')[1];\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === grabRef.current?.id);\r\n if (cuboid) {\r\n const { pos: parentAbsPos, rot: parentAbsRot } = Util.getWorldDataById(newParentId);\r\n const diff = new Vector3().subVectors(p, parentAbsPos);\r\n diff.applyEuler(new Euler(0, 0, -parentAbsRot));\r\n cuboid.cx = diff.x;\r\n cuboid.cy = diff.y;\r\n cuboid.parentId = newParentId;\r\n cuboid.rotation[2] = -parentAbsRot;\r\n }\r\n });\r\n } else {\r\n setCommonStore((state) => {\r\n const cuboid = state.elements.find((e) => e.id === grabRef.current?.id);\r\n if (cuboid && cuboid.parentId !== GROUND_ID) {\r\n const { rot: parentAbsRot } = Util.getWorldDataById(cuboid.parentId);\r\n cuboid.rotation[2] += parentAbsRot;\r\n cuboid.parentId = GROUND_ID;\r\n }\r\n });\r\n setElementPosition(grabRef.current.id, p.x, p.y);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleIntersectionPointerMove = (e: ThreeEvent) => {\r\n if (grabRef.current && grabRef.current.type && !grabRef.current.locked) {\r\n setRayCast(e);\r\n let intersects;\r\n if (intersectionPlaneRef.current && intersectionPlaneType === IntersectionPlaneType.Vertical) {\r\n intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects && intersects.length > 0) {\r\n const p = intersects[0].point;\r\n switch (grabRef.current.type) {\r\n case ObjectType.Tree:\r\n const tree = grabRef.current as TreeModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Top:\r\n updateElementLzById(tree.id, p.z);\r\n setCommonStore((state) => {\r\n state.selectedElementHeight = Math.max(1, p.z);\r\n });\r\n break;\r\n // TODO: Need to move on a plane parallel to the direction from the handle to the tree center\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n case ResizeHandleType.Upper:\r\n case ResizeHandleType.Lower:\r\n updateElementLxById(tree.id, 2 * Math.hypot(p.x - tree.cx, p.y - tree.cy));\r\n break;\r\n }\r\n handlePlantOrHumanRefMove(useRefStore.getState().treeRef, e);\r\n break;\r\n case ObjectType.Flower: {\r\n handlePlantOrHumanRefMove(useRefStore.getState().flowerRef, e);\r\n break;\r\n }\r\n case ObjectType.Human: {\r\n handlePlantOrHumanRefMove(useRefStore.getState().humanRef, e);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n // only these elements are allowed to be on the ground\r\n const legalOnGround = (type: ObjectType) => {\r\n return (\r\n type === ObjectType.Foundation ||\r\n type === ObjectType.Cuboid ||\r\n type === ObjectType.Tree ||\r\n type === ObjectType.Flower ||\r\n type === ObjectType.Human\r\n );\r\n };\r\n\r\n // The snapping of foundations and cuboids are really unnecessary because they can have arbitrary azimuths.\r\n // So if we have one vertex snapping to the grid, the other three most likely will be knocked off if the azimuth\r\n // is not 0, 90, 180, or 270 degrees. Snapping is only useful in those special cases. I decided not to bother\r\n // to make it work for those cases because the gain is too small to complicate the code.\r\n //\r\n // const positionOnGrid = (p: Vector3) => {\r\n // return useStore.getState().enableFineGrid ? snapToFineGrid(p) : snapToNormalGrid(p);\r\n // };\r\n //\r\n // const snapToNormalGrid = (v: Vector3) => {\r\n // const scale = Math.floor(useStore.getState().sceneRadius / 50) + 1;\r\n // return new Vector3(Math.round(v.x / scale) * scale, Math.round(v.y / scale) * scale, v.z);\r\n // };\r\n //\r\n // const snapToFineGrid = (v: Vector3) => {\r\n // const scale = (Math.floor(useStore.getState().sceneRadius / 50) + 1) * FINE_GRID_SCALE;\r\n // const x = parseFloat((Math.round(v.x / scale) * scale).toFixed(1));\r\n // const y = parseFloat((Math.round(v.y / scale) * scale).toFixed(1));\r\n // return new Vector3(x, y, v.z);\r\n // };\r\n\r\n const handleHumanAndPlantPositionFixedOnParent = (\r\n object: Object3D | null | undefined,\r\n lx: number,\r\n ly: number,\r\n parentWorldPosition: Vector3,\r\n parentWorldRotation: number,\r\n ) => {\r\n if (!object) return;\r\n for (const child of object.children) {\r\n if (child.name.includes('Human') || child.name.includes('Tree') || child.name.includes('Flower')) {\r\n const childId = getObjectId(child);\r\n const worldPos = absPosMapRef.current.get(childId);\r\n if (worldPos) {\r\n // top face\r\n if (Math.abs(oldDimensionRef.current.z / 2 - child.position.z) < 0.01) {\r\n const relativePos = new Vector3()\r\n .subVectors(worldPos, parentWorldPosition)\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n child.position.setX(relativePos.x);\r\n child.position.setY(relativePos.y);\r\n }\r\n // side face\r\n else {\r\n const relativePos = new Vector3()\r\n .subVectors(worldPos, oldPositionRef.current)\r\n .applyEuler(new Euler(0, 0, -parentWorldRotation));\r\n const d = new Vector3().subVectors(parentWorldPosition, oldPositionRef.current);\r\n const v = new Vector3().subVectors(relativePos, d);\r\n // west and east face\r\n if (Math.abs(relativePos.x / oldDimensionRef.current.x) > 0.49) {\r\n child.position.setX((relativePos.x > 0 ? lx : -lx) / 2);\r\n child.position.setY(v.y);\r\n }\r\n // north and south face\r\n else if (Math.abs(relativePos.y / oldDimensionRef.current.y) > 0.49) {\r\n child.position.setX(v.x);\r\n child.position.setY((relativePos.y > 0 ? ly : -ly) / 2);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleResize = (p: Vector3) => {\r\n if (!grabRef.current) return;\r\n const point = new Vector2(p.x, p.y);\r\n const anchor = new Vector2(resizeAnchor.x, resizeAnchor.y);\r\n const distance = anchor.distanceTo(point);\r\n const angle = Math.atan2(point.x - resizeAnchor.x, point.y - resizeAnchor.y) + grabRef.current.rotation[2];\r\n const lx = Math.abs(distance * Math.sin(angle));\r\n const ly = Math.abs(distance * Math.cos(angle));\r\n const center = new Vector2().addVectors(point, anchor).multiplyScalar(0.5);\r\n setCommonStore((state) => {\r\n if (!grabRef.current) return;\r\n let sizeOk = false;\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current.id) {\r\n switch (e.type) {\r\n case ObjectType.Cuboid: // we can only deal with the top surface of a cuboid now\r\n case ObjectType.Foundation:\r\n const children = getChildren(e.id);\r\n if (children.length > 0) {\r\n // basically, we have to create a copy of parent and children, set them to the new values,\r\n // check if the new values are OK, proceed to change the original elements in\r\n // the common store only when they are OK.\r\n const childrenClone: ElementModel[] = [];\r\n for (const c of children) {\r\n if (Util.isPlantOrHuman(c)) continue;\r\n const childClone = JSON.parse(JSON.stringify(c));\r\n childrenClone.push(childClone);\r\n if (Util.isIdentical(childClone.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n if (c.type === ObjectType.Wall) {\r\n const wallAbsPos = wallsAbsPosMapRef.current.get(c.id);\r\n if (wallAbsPos) {\r\n const a = -e.rotation[2];\r\n const { centerPointAbsPos, leftPointAbsPos, rightPointAbsPos } = wallAbsPos;\r\n const centerPointRelativePos = new Vector2()\r\n .subVectors(centerPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n const leftPointRelativePos = new Vector2()\r\n .subVectors(leftPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n const rightPointRelativePos = new Vector2()\r\n .subVectors(rightPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n childClone.cy = centerPointRelativePos.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n childClone.cx = centerPointRelativePos.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n childClone.cx = centerPointRelativePos.x;\r\n childClone.cy = centerPointRelativePos.y;\r\n break;\r\n }\r\n childClone.leftPoint = [leftPointRelativePos.x, leftPointRelativePos.y, 0];\r\n childClone.rightPoint = [rightPointRelativePos.x, rightPointRelativePos.y, 0];\r\n }\r\n } else {\r\n const centerAbsPos = absPosMapRef.current.get(c.id);\r\n if (centerAbsPos) {\r\n const a = -e.rotation[2];\r\n const relativePos = new Vector2()\r\n .subVectors(new Vector2(centerAbsPos.x, centerAbsPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n childClone.cy = relativePos.y / ly;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n childClone.cx = relativePos.x / lx;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n childClone.cx = relativePos.x / lx;\r\n childClone.cy = relativePos.y / ly;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n const parentClone = JSON.parse(JSON.stringify(e)) as ElementModel;\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n parentClone.ly = ly;\r\n parentClone.cy = center.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n parentClone.lx = lx;\r\n parentClone.cx = center.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n parentClone.lx = lx;\r\n parentClone.ly = ly;\r\n parentClone.cx = center.x;\r\n parentClone.cy = center.y;\r\n break;\r\n }\r\n if (Util.doesParentContainAllChildren(parentClone, childrenClone)) {\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.ly = ly;\r\n e.cy = center.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.lx = lx;\r\n e.cx = center.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.lx = lx;\r\n e.ly = ly;\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n break;\r\n }\r\n sizeOk = true;\r\n }\r\n } else {\r\n // any size is okay for a childless parent\r\n if (lx > 0.49 && ly > 0.49) {\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.ly = ly;\r\n e.cy = center.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.lx = lx;\r\n e.cx = center.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.lx = lx;\r\n e.ly = ly;\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n break;\r\n }\r\n sizeOk = true;\r\n }\r\n }\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n // if the new size is okay, we can then change the relative positions of the children.\r\n if (sizeOk) {\r\n for (const e of state.elements) {\r\n if (e.parentId === grabRef.current!.id) {\r\n switch (e.type) {\r\n case ObjectType.Wall:\r\n const wall = e as WallModel;\r\n const wallAbsPos = wallsAbsPosMapRef.current.get(e.id);\r\n if (wallAbsPos) {\r\n const a = -grabRef.current!.rotation[2];\r\n const { centerPointAbsPos, leftPointAbsPos, rightPointAbsPos } = wallAbsPos;\r\n const centerPointRelativePos = new Vector2()\r\n .subVectors(centerPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n const leftPointRelativePos = new Vector2()\r\n .subVectors(leftPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n const rightPointRelativePos = new Vector2()\r\n .subVectors(rightPointAbsPos, center)\r\n .rotateAround(ORIGIN_VECTOR2, a);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.cy = centerPointRelativePos.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.cx = centerPointRelativePos.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.cx = centerPointRelativePos.x;\r\n e.cy = centerPointRelativePos.y;\r\n break;\r\n }\r\n wall.leftPoint = [leftPointRelativePos.x, leftPointRelativePos.y, 0];\r\n wall.rightPoint = [rightPointRelativePos.x, rightPointRelativePos.y, 0];\r\n }\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n const centerAbsPos = absPosMapRef.current.get(e.id);\r\n if (centerAbsPos) {\r\n const relativePos = new Vector2()\r\n .subVectors(new Vector2(centerAbsPos.x, centerAbsPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.cy = relativePos.y / ly;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.cx = relativePos.x / lx;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.cx = relativePos.x / lx;\r\n e.cy = relativePos.y / ly;\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n case ObjectType.Cuboid: {\r\n const centerAbsPos = absPosMapRef.current.get(e.id);\r\n if (centerAbsPos) {\r\n const relativePos = new Vector2()\r\n .subVectors(new Vector2(centerAbsPos.x, centerAbsPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.cy = relativePos.y;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.cx = relativePos.x;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.cx = relativePos.x;\r\n e.cy = relativePos.y;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case ObjectType.Polygon:\r\n if (Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n const polygon = e as PolygonModel;\r\n const verticesAbsPos = polygonsAbsPosMapRef.current.get(polygon.id);\r\n if (verticesAbsPos) {\r\n const newVertices: Point2[] = [];\r\n verticesAbsPos.forEach((v) => {\r\n const relativePos = new Vector2()\r\n .subVectors(v, center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n newVertices.push({ x: relativePos.x / lx, y: relativePos.y / ly } as Point2);\r\n });\r\n polygon.vertices = newVertices;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (\r\n e.foundationId === grabRef.current.id &&\r\n e.type === ObjectType.SolarPanel &&\r\n (e as SolarPanelModel).parentType === ObjectType.Roof\r\n ) {\r\n const centerAbsPos = absPosMapRef.current.get(e.id);\r\n if (centerAbsPos) {\r\n const relativePos = new Vector2()\r\n .subVectors(new Vector2(centerAbsPos.x, centerAbsPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n switch (resizeHandleType) {\r\n case ResizeHandleType.Lower:\r\n case ResizeHandleType.Upper:\r\n e.cy = relativePos.y / ly;\r\n break;\r\n case ResizeHandleType.Left:\r\n case ResizeHandleType.Right:\r\n e.cx = relativePos.x / lx;\r\n break;\r\n case ResizeHandleType.LowerLeft:\r\n case ResizeHandleType.LowerRight:\r\n case ResizeHandleType.UpperLeft:\r\n case ResizeHandleType.UpperRight:\r\n e.cx = relativePos.x / lx;\r\n e.cy = relativePos.y / ly;\r\n break;\r\n }\r\n }\r\n }\r\n if (\r\n e.foundationId === grabRef.current.id &&\r\n e.type === ObjectType.Window &&\r\n (e as WindowModel).parentType === ObjectType.Roof\r\n ) {\r\n const centerPos = absPosMapRef.current.get(e.id);\r\n if (centerPos) {\r\n const relPosToFoundation = new Vector2()\r\n .subVectors(new Vector2(centerPos.x, centerPos.y), center)\r\n .rotateAround(ORIGIN_VECTOR2, -grabRef.current!.rotation[2]);\r\n e.cx = relPosToFoundation.x;\r\n e.cy = relPosToFoundation.y;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n switch (grabRef.current.type) {\r\n case ObjectType.Foundation:\r\n const foundationRef = useRefStore.getState().foundationRef;\r\n if (foundationRef?.current) {\r\n handleHumanAndPlantPositionFixedOnParent(\r\n foundationRef?.current,\r\n lx,\r\n ly,\r\n foundationRef.current.position,\r\n grabRef.current.rotation[2],\r\n );\r\n }\r\n break;\r\n case ObjectType.Cuboid:\r\n const cuboidRef = useRefStore.getState().cuboidRef;\r\n if (cuboidRef?.current && cuboidRef.current.parent) {\r\n handleHumanAndPlantPositionFixedOnParent(\r\n cuboidRef?.current,\r\n lx,\r\n ly,\r\n cuboidRef.current.parent.position,\r\n grabRef.current.rotation[2],\r\n );\r\n }\r\n break;\r\n }\r\n };\r\n\r\n const handleRotate = (p: Vector3) => {\r\n const { cx, cy } = grabRef.current!;\r\n const rotation = Math.atan2(cx - p.x, p.y - cy) + (rotateHandleType === RotateHandleType.Upper ? 0 : Math.PI);\r\n const offset = Math.abs(rotation) > Math.PI ? -Math.sign(rotation) * TWO_PI : 0;\r\n setElementRotation(grabRef.current!.id, 0, 0, rotation + offset);\r\n };\r\n\r\n const handleMove = (p: Vector3) => {\r\n const isMultipleMove = baseGroupRelPosMapRef.current.size > 1;\r\n if (isMultipleMove) {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && baseGroupRelPosMapRef.current.has(elem.id)) {\r\n const v = baseGroupRelPosMapRef.current.get(elem.id);\r\n if (v) {\r\n elem.cx = p.x + v.x;\r\n elem.cy = p.y + v.y;\r\n }\r\n }\r\n }\r\n });\r\n return;\r\n }\r\n let x0, y0;\r\n const hx = grabRef.current!.lx / 2;\r\n const hy = grabRef.current!.ly / 2;\r\n switch (moveHandleType) {\r\n case MoveHandleType.Top: {\r\n if (isMultipleMove) {\r\n const center = new Vector3(p.x, p.y);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, p.x, p.y);\r\n }\r\n break;\r\n }\r\n case MoveHandleType.Upper:\r\n x0 = p.x + sinAngle * hy;\r\n y0 = p.y - cosAngle * hy;\r\n if (isMultipleMove) {\r\n const center = new Vector3(x0, y0);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n }\r\n break;\r\n case MoveHandleType.Lower:\r\n x0 = p.x - sinAngle * hy;\r\n y0 = p.y + cosAngle * hy;\r\n if (isMultipleMove) {\r\n const center = new Vector3(x0, y0);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n }\r\n break;\r\n case MoveHandleType.Left:\r\n x0 = p.x + cosAngle * hx;\r\n y0 = p.y + sinAngle * hx;\r\n if (isMultipleMove) {\r\n const center = new Vector3(x0, y0);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n }\r\n break;\r\n case MoveHandleType.Right:\r\n x0 = p.x - cosAngle * hx;\r\n y0 = p.y - sinAngle * hx;\r\n if (isMultipleMove) {\r\n const center = new Vector3(x0, y0);\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === grabRef.current!.id) {\r\n e.cx = center.x;\r\n e.cy = center.y;\r\n } else if (baseGroupRelPosMapRef.current.has(e.id)) {\r\n const offset = baseGroupRelPosMapRef.current.get(e.id);\r\n if (offset) {\r\n const c = new Vector3().addVectors(center, offset);\r\n e.cx = c.x;\r\n e.cy = c.y;\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n setElementPosition(grabRef.current!.id, x0, y0);\r\n }\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {grabRef.current && intersectionPlaneType !== IntersectionPlaneType.Ground && (\r\n \r\n \r\n \r\n )}\r\n \r\n {showSolarRadiationHeatmap && !waterSurface ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Ground);\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport GlowImage from '../resources/glow.png';\n\nimport { Util } from '../Util';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n AdditiveBlending,\n BufferAttribute,\n BufferGeometry,\n DoubleSide,\n EllipseCurve,\n Euler,\n FontLoader,\n Plane,\n TextGeometryParameters,\n Vector3,\n} from 'three';\nimport {\n computeDeclinationAngle,\n computeHourAngleAtMinute,\n computeSunLocation,\n computeSunriseAndSunsetInMinutes,\n TILT_ANGLE,\n} from '../analysis/sunTools';\nimport { Line, Plane as Drei_Plane, useTexture } from '@react-three/drei';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { useLoader } from '@react-three/fiber';\nimport helvetikerFont from '../fonts/helvetiker_regular.typeface.fnt';\nimport { HALF_PI, TWO_PI, UNIT_VECTOR_POS_Y, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\n\nconst HOUR_DIVISIONS = 48;\nconst BASE_DIVISIONS = 72;\nconst DECLINATION_DIVISIONS = 12;\n\ninterface HeliodonProps {\n date: Date;\n hourAngle: number;\n declinationAngle: number;\n worldLatitude: number;\n}\n\nconst Heliodon = ({ date, hourAngle, declinationAngle, worldLatitude }: HeliodonProps) => {\n const radius = useStore(Selector.sceneRadius);\n const showSunAngles = useStore(Selector.viewState.showSunAngles);\n const showAzimuthAngle = useStore(Selector.viewState.showAzimuthAngle) ?? true;\n const showElevationAngle = useStore(Selector.viewState.showElevationAngle) ?? true;\n const showZenithAngle = useStore(Selector.viewState.showZenithAngle) ?? true;\n\n const [latitude, setLatitude] = useState(Util.toRadians(42));\n const glowTexture = useTexture(GlowImage);\n\n const angleArcRadius = Math.max(2, radius * 0.2);\n const angleLabelHeight = Math.max(0.4, radius * 0.025);\n const font = useLoader(FontLoader, helvetikerFont);\n const fontSize = radius * 0.05;\n const textGeometryParams = {\n font: font,\n height: 0,\n size: fontSize,\n } as TextGeometryParameters;\n\n const nLabels = 6;\n const tickLabels = new Array(2 * nLabels + 1).fill(0);\n\n const getOffset = (i: number) => {\n if (i === 0) {\n return -fontSize * 0.3;\n } else if (i > 0 && i < 7) {\n return -fontSize * 0.8;\n } else {\n return -fontSize * 1.2;\n }\n };\n\n useEffect(() => {\n setLatitude(Util.toRadians(worldLatitude));\n }, [worldLatitude]);\n\n const nRibLines = 6;\n\n const [baseGeometry, lineGeometry] = useMemo(() => {\n const baseGeometry = new BufferGeometry();\n const lineGeometry = new BufferGeometry();\n const basePoints: Vector3[] = [];\n const tickPoints: Vector3[] = [];\n const step = TWO_PI / BASE_DIVISIONS;\n let counter = 0;\n for (let angle = 0; angle < TWO_PI + step / 2.0; angle += step) {\n const theta = Math.min(angle, TWO_PI);\n let width = 0.05 * radius;\n // TODO: This is inefficient. We should use indexed buffer to share vertices\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius, theta, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius + width, theta, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius, theta + step, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius + width, theta, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius + width, theta + step, 0)));\n basePoints.push(Util.sphericalToCartesianZ(new Vector3(radius, theta + step, 0)));\n let p;\n if (TWO_PI - theta > ZERO_TOLERANCE) {\n width = 0.05 * radius + (counter % 3 === 0 ? 0.2 : 0);\n p = new Vector3(radius, theta, 0);\n p.z = 0.002;\n tickPoints.push(Util.sphericalToCartesianZ(p));\n p = new Vector3(radius + width, theta, 0);\n p.z = 0.002;\n tickPoints.push(Util.sphericalToCartesianZ(p));\n }\n counter++;\n }\n\n // attributes\n const length = basePoints.length * 3;\n const basePositions = new Float32Array(length);\n const baseNormals = new Float32Array(length);\n const baseColors = new Float32Array(length);\n\n for (let i = 0; i < basePoints.length; i++) {\n const j = i * 3;\n basePositions[j] = basePoints[i].x;\n basePositions[j + 1] = basePoints[i].y;\n basePositions[j + 2] = basePoints[i].z;\n baseNormals[j] = 0;\n baseNormals[j + 1] = 1;\n baseNormals[j + 2] = 0;\n const c = Math.floor(i / 18) % 2 === 0 ? 0.2 : 1.0;\n baseColors[j] = c;\n baseColors[j + 1] = c;\n baseColors[j + 2] = c;\n }\n\n baseGeometry.setAttribute('position', new BufferAttribute(basePositions, 3));\n baseGeometry.setAttribute('normal', new BufferAttribute(baseNormals, 3));\n baseGeometry.setAttribute('color', new BufferAttribute(baseColors, 3));\n lineGeometry.setFromPoints(tickPoints);\n\n return [baseGeometry, lineGeometry];\n }, [radius]);\n\n const sunPathPoints = useMemo(() => {\n const points = [];\n const sunMinutes = computeSunriseAndSunsetInMinutes(date, Util.toDegrees(latitude));\n const min = computeHourAngleAtMinute(sunMinutes.sunrise);\n const max = computeHourAngleAtMinute(sunMinutes.sunset);\n const step = (max - min) / HOUR_DIVISIONS;\n for (let h = min; h < max + step / 2; h += step) {\n const v = computeSunLocation(radius, h, declinationAngle, latitude);\n if (v.z > -0.01) {\n points.push(v);\n }\n }\n return points;\n }, [latitude, radius, declinationAngle]);\n\n const getSunPathPointsByDate = (day: Date) => {\n const decline = computeDeclinationAngle(day);\n const points = [];\n const sunMinutes = computeSunriseAndSunsetInMinutes(day, Util.toDegrees(latitude));\n const min = computeHourAngleAtMinute(sunMinutes.sunrise);\n const max = computeHourAngleAtMinute(sunMinutes.sunset);\n const step = (max - min) / HOUR_DIVISIONS;\n for (let h = min; h < max + step / 2; h += step) {\n const v = computeSunLocation(radius, h, decline, latitude);\n if (v.z > -0.01) {\n points.push(v);\n }\n }\n return points;\n };\n\n const pointArraySunPaths = useMemo(() => {\n const arr = [];\n for (let i = 0; i <= nRibLines; i++) {\n const day = new Date(2021, i === 0 ? 11 : i - 1, 22);\n arr.push(getSunPathPointsByDate(day));\n }\n return arr;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [latitude, radius]);\n\n const sunPosition = useMemo(() => {\n return computeSunLocation(radius, hourAngle, declinationAngle, latitude);\n }, [latitude, declinationAngle, hourAngle, radius]);\n\n const sunDirection = useMemo(() => {\n return sunPosition.clone().normalize();\n }, [sunPosition]);\n\n const sunDirectionOnGround = useMemo(() => {\n return new Vector3(sunPosition.x, sunPosition.y, 0).normalize();\n }, [sunPosition]);\n\n const elevationAngle = useMemo(() => {\n return Math.asin(sunPosition.z / sunPosition.length());\n }, [sunPosition]);\n\n const elevationAngleArcPoints = useMemo(() => {\n const curve = new EllipseCurve(0, 0, angleArcRadius, angleArcRadius, 0, elevationAngle, false, 0);\n const points = curve.getPoints(25);\n const points3D = new Array();\n for (const p of points) {\n points3D.push(new Vector3(p.x, p.y, 0));\n }\n return points3D;\n }, [elevationAngle, sunPosition]);\n\n const zenithAngle = useMemo(() => {\n return Math.acos(sunPosition.z / sunPosition.length());\n }, [sunPosition]);\n\n const zenithAngleArcPoints = useMemo(() => {\n const curve = new EllipseCurve(0, 0, angleArcRadius * 0.8, angleArcRadius * 0.8, elevationAngle, HALF_PI, false, 0);\n const points = curve.getPoints(25);\n const points3D = new Array();\n for (const p of points) {\n points3D.push(new Vector3(p.x, p.y, 0));\n }\n return points3D;\n }, [zenithAngle, sunPosition]);\n\n const azimuthAngle = useMemo(() => {\n const a = Math.acos(sunPosition.y / Math.hypot(sunPosition.x, sunPosition.y));\n return sunPosition.x > 0 ? -a : a;\n }, [sunPosition]);\n\n const azimuthAngleArcPoints = useMemo(() => {\n const curve = new EllipseCurve(\n 0,\n 0,\n angleArcRadius * 1.2,\n angleArcRadius * 1.2,\n HALF_PI,\n HALF_PI + azimuthAngle,\n sunPosition.x > 0,\n 0,\n );\n const points = curve.getPoints(50);\n const points3D = new Array();\n for (const p of points) {\n points3D.push(new Vector3(p.x, p.y, 0));\n }\n return points3D;\n }, [azimuthAngle, sunPosition]);\n\n const sunbeltGeometry = useMemo(() => {\n const declinationStep = (2.0 * TILT_ANGLE) / DECLINATION_DIVISIONS;\n const hourStep = TWO_PI / HOUR_DIVISIONS;\n const geometry = new BufferGeometry();\n let verticesCount = 0;\n const vertices: Vector3[] = [];\n const indices = [];\n for (let d = -TILT_ANGLE; d < TILT_ANGLE - declinationStep / 2.0; d += declinationStep) {\n for (let h = -Math.PI; h < Math.PI - hourStep / 2.0; h += hourStep) {\n let h2 = h + hourStep;\n let d2 = d + declinationStep;\n if (h2 > Math.PI) {\n h2 = Math.PI;\n }\n if (d2 > TILT_ANGLE) {\n d2 = TILT_ANGLE;\n }\n const v1 = computeSunLocation(radius, h, d, latitude);\n const v2 = computeSunLocation(radius, h2, d, latitude);\n const v3 = computeSunLocation(radius, h2, d2, latitude);\n const v4 = computeSunLocation(radius, h, d2, latitude);\n if (v1.z >= 0 || v2.z >= 0 || v3.z >= 0 || v4.z >= 0) {\n vertices.push(v1, v2, v3, v4);\n indices.push(verticesCount);\n indices.push(verticesCount + 1);\n indices.push(verticesCount + 2);\n indices.push(verticesCount);\n indices.push(verticesCount + 2);\n indices.push(verticesCount + 3);\n verticesCount += 4;\n }\n }\n }\n geometry.setFromPoints(vertices);\n geometry.setIndex(new BufferAttribute(new Uint16Array(indices), 1));\n return geometry;\n }, [latitude, radius]);\n\n const sunRadius = 0.05 * radius;\n const haloRadius = 2 + 5 * sunRadius;\n\n return (\n \n {tickLabels.map((v, i) => {\n let times = Math.ceil(i / 2) * (i % 2 === 0 ? 1 : -1);\n if (times === -nLabels) times = nLabels;\n const offset = getOffset(Math.abs(times));\n return (\n \n \n \n \n \n \n );\n })}\n \n {/* draw base */}\n \n \n \n \n \n \n \n \n {/* draw sun path*/}\n \n {sunPathPoints.length > 3 && }\n {pointArraySunPaths\n .filter((a) => a.length > 3)\n .map((a, index) => {\n return (\n \n );\n })}\n \n \n \n {/* simple glow effect to create a halo */}\n \n \n \n \n \n \n \n \n \n \n \n {/* use this plane to hide the uneven edge */}\n \n \n \n {showSunAngles && sunPosition.z > 0 && (\n <>\n \n \n \n {showElevationAngle && (\n <>\n \n \n \n )}\n {showZenithAngle && (\n <>\n \n \n \n )}\n {showAzimuthAngle && (\n <>\n \n \n \n )}\n \n )}\n \n );\n};\n\nexport default React.memo(Heliodon);\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { Util } from '../Util';\r\nimport React, { useEffect, useMemo } from 'react';\r\nimport { computeDeclinationAngle, computeHourAngle, computeSunLocation } from '../analysis/sunTools';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport Heliodon from './heliodon';\r\n\r\nconst HeliodonWrapper = () => {\r\n const heliodon = useStore(Selector.viewState.heliodon);\r\n const heliodonRadius = useStore(Selector.sceneRadius);\r\n const worldLatitude = useStore(Selector.world.latitude);\r\n const dateString = useStore(Selector.world.date);\r\n const setSunlightDirection = useStore(Selector.setSunlightDirection);\r\n\r\n const date = useMemo(() => new Date(dateString), [dateString]);\r\n\r\n const [hourAngle, declinationAngle] = useMemo(() => [computeHourAngle(date), computeDeclinationAngle(date)], [date]);\r\n\r\n useEffect(() => {\r\n setSunlightDirection(\r\n computeSunLocation(heliodonRadius, hourAngle, declinationAngle, Util.toRadians(worldLatitude)),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [worldLatitude, hourAngle, declinationAngle, heliodonRadius]);\r\n\r\n return (\r\n <>\r\n {heliodon && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(HeliodonWrapper);\r\n","export default __webpack_public_path__ + \"static/media/ifi-logo.eb360016.png\";","export default __webpack_public_path__ + \"static/media/magic-lamp.b58f942d.png\";","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\nimport { Language } from './types';\n\nexport interface TeamProps {\n top: number;\n height?: number;\n color?: string;\n}\n\nconst Team = ({ top, height, color }: TeamProps) => {\n const language = useStore(Selector.language);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const linePos = top + 56 + 'px';\n const top100 = top + 100 + 'px';\n const top200 = top + 205 + 'px';\n\n return (\n
\n \n

{i18n.t('aboutUs.ProductBroughtToYouBy', lang)}

\n

\n \n {i18n.t('aboutUs.TermsOfService', lang)}\n \n    |   \n \n {i18n.t('aboutUs.PrivacyPolicy', lang)}\n \n

\n
\n
\n \n \n \n \n \n

{i18n.t('aboutUs.Software', lang)}

\n Xiaotong Ding\n
\n Charles Xie\n
\n \n \n

{i18n.t('aboutUs.Content', lang)}

\n Elena Sereiviene\n
\n Charles Xie\n
\n \n \n

{i18n.t('aboutUs.Support', lang)}

\n Elena Sereiviene\n
\n Charles Xie\n
\n \n \n \n \n
\n \n {i18n.t('aboutUs.Translators', lang)}: {Language.Ukrainian} (Andriy Kashyrskyy), {Language.Spanish} (Alex\n Barco), {Language.Turkish} (Hasan Bircan)\n
\n
\n {i18n.t('aboutUs.Acknowledgment', lang)}: {i18n.t('aboutUs.FundingInformation', lang)}{' '}\n {i18n.t('aboutUs.Contact', lang)}\n \n \n );\n};\n\nexport default React.memo(Team);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport styled from 'styled-components';\nimport Team from './team';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\n\nconst Container = styled.div`\n position: absolute;\n top: 80px;\n left: 10px;\n display: flex;\n width: 600px;\n height: 400px;\n flex-direction: column;\n align-items: center;\n z-index: 1001;\n border-radius: 10px;\n background: dimgray;\n box-shadow: 3px 3px 3px 3px black;\n`;\n\nconst About = ({ close }: { close: () => void }) => {\n const language = useStore(Selector.language);\n return (\n \n \n {\n close();\n }}\n >\n {i18n.t('word.Close', { lng: language })}\n \n \n );\n};\n\nexport default React.memo(About);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { InputNumber, Menu, Select, Space } from 'antd';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { useDataStore } from '../../../stores/commonData';\n\nconst CspSimulationSettings = ({ name }: { name: string }) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const cspTimesPerHour = useStore(Selector.world.cspTimesPerHour);\n const cspDaysPerYear = useStore(Selector.world.cspDaysPerYear);\n const cspGridCellSize = useStore(Selector.world.cspGridCellSize);\n\n const lang = { lng: language };\n const { SubMenu } = Menu;\n const { Option } = Select;\n\n return (\n \n \n \n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.cspTimesPerHour = value;\n });\n }}\n >\n {/* sampling interval must be a factor of 60 (e.g., 8 is not)*/}\n \n \n \n \n \n \n \n \n {i18n.t('menu.option.TimesPerHour', lang)}\n \n \n {\n setCommonStore((state) => {\n state.world.cspDaysPerYear = value;\n });\n // clear the results stored in the common store\n useDataStore.setState((state) => {\n state.yearlyParabolicTroughYield = [];\n state.yearlyParabolicDishYield = [];\n state.yearlyFresnelReflectorYield = [];\n state.yearlyHeliostatYield = [];\n });\n }}\n >\n \n \n \n \n {i18n.t('menu.option.DaysPerYear', lang)}\n \n \n {i18n.t('menu.option.GridCellSize', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.cspGridCellSize = value;\n });\n }}\n />\n {i18n.t('word.MeterAbbreviation', lang)}\n \n \n \n );\n};\n\nexport default CspSimulationSettings;\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { InputNumber, Menu, Select, Space, Switch } from 'antd';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { Discretization } from '../../../types';\nimport { Util } from '../../../Util';\nimport { useDataStore } from '../../../stores/commonData';\n\nconst PvSimulationSettings = () => {\n const setCommonStore = useStore(Selector.set);\n const elements = useStore.getState().elements;\n const language = useStore(Selector.language);\n const timesPerHour = useStore(Selector.world.timesPerHour);\n const daysPerYear = useStore(Selector.world.daysPerYear);\n const gridCellSize = useStore(Selector.world.pvGridCellSize);\n const discretization = useStore(Selector.world.discretization);\n const noAnimationForSolarPanelSimulation = useStore(Selector.world.noAnimationForSolarPanelSimulation);\n\n const lang = { lng: language };\n const { SubMenu } = Menu;\n const { Option } = Select;\n\n return (\n \n \n \n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.timesPerHour = value;\n });\n }}\n >\n {/* sampling interval must be a factor of 60 (e.g., 8 is not)*/}\n \n \n \n \n \n \n \n \n {i18n.t('menu.option.TimesPerHour', lang)}\n \n \n {\n setCommonStore((state) => {\n state.world.daysPerYear = value;\n });\n // clear the results stored in the common store\n useDataStore.setState((state) => {\n state.yearlyPvYield = [];\n });\n }}\n >\n \n \n \n \n {i18n.t('menu.option.DaysPerYear', lang)}\n \n \n {i18n.t('menu.solarPanel.PanelDiscretization', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.discretization = value;\n });\n }}\n >\n \n \n \n \n {(!discretization || discretization === Discretization.APPROXIMATE) && (\n \n {i18n.t('menu.solarPanel.EnergyGridCellSize', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.pvGridCellSize = value;\n });\n }}\n />\n {i18n.t('word.MeterAbbreviation', lang)}\n \n )}\n {!Util.hasMovingParts(elements) && (\n \n \n {i18n.t('menu.solarPanel.SolarPanelSimulationNoAnimation', lang) + ':'}\n \n {\n setCommonStore((state) => {\n state.world.noAnimationForSolarPanelSimulation = checked;\n });\n }}\n />\n \n )}\n \n \n );\n};\n\nexport default PvSimulationSettings;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { InputNumber, Menu, Select, Space, Switch } from 'antd';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { Util } from '../../../Util';\nimport { useDataStore } from '../../../stores/commonData';\n\nconst SutSimulationSettings = () => {\n const setCommonStore = useStore(Selector.set);\n const elements = useStore.getState().elements;\n const language = useStore(Selector.language);\n const sutTimesPerHour = useStore(Selector.world.sutTimesPerHour);\n const sutDaysPerYear = useStore(Selector.world.sutDaysPerYear);\n const sutGridCellSize = useStore(Selector.world.sutGridCellSize);\n const noAnimation = useStore(Selector.world.noAnimationForSolarUpdraftTowerSimulation);\n\n const lang = { lng: language };\n const { SubMenu } = Menu;\n const { Option } = Select;\n\n return (\n \n \n \n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.sutTimesPerHour = value;\n });\n }}\n >\n {/* sampling interval must be a factor of 60 (e.g., 8 is not)*/}\n \n \n \n \n \n \n \n \n {i18n.t('menu.option.TimesPerHour', lang)}\n \n \n {\n setCommonStore((state) => {\n state.world.sutDaysPerYear = value;\n });\n // clear the results stored in the common store\n useDataStore.setState((state) => {\n state.yearlyUpdraftTowerYield = [];\n });\n }}\n >\n \n \n \n \n {i18n.t('menu.option.DaysPerYear', lang)}\n \n \n {i18n.t('menu.option.GridCellSize', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.sutGridCellSize = value;\n });\n }}\n />\n {i18n.t('word.MeterAbbreviation', lang)}\n \n {!Util.hasMovingParts(elements) && (\n \n \n {i18n.t('menu.solarUpdraftTower.SolarUpdraftTowerSimulationNoAnimation', lang) + ':'}\n \n {\n setCommonStore((state) => {\n state.world.noAnimationForSolarUpdraftTowerSimulation = checked;\n });\n }}\n />\n \n )}\n \n \n );\n};\n\nexport default SutSimulationSettings;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { InputNumber, Menu, Select, Space } from 'antd';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\n\nconst BuildingEnergySimulationSettings = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const timesPerHour = useStore(Selector.world.timesPerHour);\n const daysPerYear = useStore(Selector.world.daysPerYear);\n const gridCellSize = useStore(Selector.world.solarRadiationHeatmapGridCellSize);\n\n const lang = { lng: language };\n const { SubMenu } = Menu;\n const { Option } = Select;\n\n return (\n \n \n \n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.timesPerHour = value;\n });\n }}\n >\n {/* sampling interval must be a factor of 60 (e.g., 8 is not)*/}\n \n \n \n \n \n \n \n \n {i18n.t('menu.option.TimesPerHour', lang)}\n \n \n {\n setCommonStore((state) => {\n state.world.daysPerYear = value;\n });\n }}\n >\n \n \n \n \n {i18n.t('menu.option.DaysPerYear', lang)}\n \n \n {i18n.t('menu.building.EnergyGridCellSize', lang) + ':'}\n {\n setCommonStore((state) => {\n state.world.solarRadiationHeatmapGridCellSize = value;\n });\n }}\n />\n {i18n.t('word.MeterAbbreviation', lang)}\n \n {/*{!Util.hasMovingParts(elements) && (*/}\n {/* */}\n {/* */}\n {/* {i18n.t('menu.building.BuildingEnergySimulationNoAnimation', lang) + ':'}*/}\n {/* */}\n {/* {*/}\n {/* setCommonStore((state) => {*/}\n {/* state.world.noAnimationForThermalSimulation = checked;*/}\n {/* });*/}\n {/* }}*/}\n {/* />*/}\n {/* */}\n {/*)}*/}\n \n \n );\n};\n\nexport default BuildingEnergySimulationSettings;\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMGFRYh70JghAAAA3pJREFUWIXtlz2MVFUUx39ndnf2g4fDwAIiEZBAWCRAKAADFmpiYaVSkPhKCqdQGhLCNyEWhIqK5gEhVK/hoyBWWAixMGrURGQtdo0JMRBhyLDLYyHD7hyKe9/M5e278LKJbMNJJjM5957//Z97/+fcO6KqzKaVZnX11wSA7jyniPQDqTgUaAJdQI/jn1TVSUQEkDQUUFRbRQmIK0IReQv4BFgEuCBSBRrQqtjFxqAPmLJJdDkEWsAtoA7Myfh/VtXRXAI26z3A+8A1J6gCfArcBH6xCyqwBPgM+AcYAVg2OKi36vVSZWBg09jExBOLU7Y4a4B7wGFVvZsScI9gIbAZOBPFySWXZS0MzkVxsgvYmfGfiuLka+ADMlYLg5NRnBzK+L4DhoA2gbYIqybTvuzi1rpyfADVWhjs8YzNyfH9C7wrIm28NoEGvBOUy+MesKkX+Od5xgZyfL8CW4AFzxEQke4KrE2azdGcIIAnHv8w8MAzNpF1RHFyqtJfDoDB1CeqmgrwLLAC+NGJaQEbgfnATy6RJZXK3DtjY+sxx3MTeAzcAR5ZnA9txjfoHGET+BI4oqqXoSPCfmAwipNtwDaX9e4wuNAEieLkK9dfC4NvgLXAU+C+Be+qQm8DxjGVshz4A+i1YT3A38BWEflWVZspgeU2g2nWhN9sBh+7/ihOju4PgwMN0ChOTmTjamFwHJiK4uRkdmx/GJQa8AZQT0W4DridRwB4E48GGqZXLPXE3Sa/EmgY8a6EThVsAH73APXhF1o3sNgzNo6j9oz9iWl4bQKbozg57ZlcxV8FI8BDz9h/GG1NsyhODmYJrPaApObb5rfL5izzbAhYVAuDvZ7xLdApwzpwEaNccSYpMInZ6tRfcn6nDSqvU6qDl8UE+FxVF2Ivo1En4FV9hlW13QduAJHNSOyEEqZ+3TeAYC6S+5iyTeemb4Ui1rK4x6BzBKuBHRYoZdiNuSHn8vxd8BjTdN7DiDPAXLN/OSTd76yl1/yIqp6Wmb6KReQgpu0uA66r6pWZ4OQ+yXIWWwp8hKn5ScxObQfOY3Znp4iswmRWwuzSdVUdfim4qr70A3wBXKG4wC4C+4pgF30V92DOuqgFdC6gF1qhIwB+wHS1q5jbL63tNAFXpCXMMX1fBLiwCMU8v3vJbypZxTdV1feKmhmB/8tm/Z/RawLPAA7AbYJpF785AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAAG9IFmxgAAA+9JREFUWIXFl21oW2UUx38nuWnasdJUmfRDTcOTK2WglSH2i3WjOD9MRdiGzreB4Ms2OlbBwiZMEVSaKqMTlllZrIIyQVY/iDoQHDLB6dDCcFCUm1vNhy2Kbfoia9pkPX5YO7I0L7epsAcuuc9zzvn//885z7k8EVXlZg7fTWUHrLUCiEg7sBFYBLKq+s2q4mstgYjcZ4x5JJ/Pi9/v/2V8fPwSsAMYU9WEV5xVZ0BENgCvA4uu68Zj8fRYoT0x2IWIjKrq6JoFiMgmoAsYUdVLItItInsikcjInr5znwH7S8X5fL7DXMtG7QJEpAM4YIw577pur4icBB7vP3Z5F7CrEqgxZruIBFV1vpqASl1wlzEmnUwm3wPWAzOxeHpvJbDjA50DBdOWauRQ4RCGQqHm6enp/cCGxsbG57LZ7I+5XO4sMAG4sXj6q+KYxGDX9feJiYm2ycnJVDUBZTMwNTWVAU4DR2ZnZz/3+XzNwChwEbi92P9QT8vRwnkmk/H0jSnrJCKbReTlWDz9B3B+fn7+DRF5GvgzFk8PFZE/YNv2S0UQf9csIBQKNft8vr7+Y5efWFr61xizoKqvWJY1VOxv2/a3hfNkMnlKVa/ULKCpqelgW1vbx8vzWDw9nM/n74zF024+nz9Q6FtY9+Whqp96IYcSh1BENvmtun1vvZt6oVrw4d7W05FIZFvxuuM4AVXNexFQKgM7PJJ/XYZ8m1fyFQJEJAKEqgUlBruIRCIPlTGPeyVfIQBoBy6Ucz7U0/JoqZovD8dx7gV61iKgFfirDPkJ27a/qEC+UVV/BhZEZEutAn4AugsXjg90DiQGu7Btu+S5SKVS3y29/rP0+0E0Gn3Kq4BSXbDTtu1TXoIdx3kRGA4EAmdyudyzqjq+hPE28KWqnq2GsaILVHXEcZxWx3H6KxC/6ThOg6qeUNWrItIAFO7kQ+AZL5tAVSs+wLrlx9yztQn4BAgW2K26urqfgEhR3DvAlqr41RyKQPuMMfuK1soJaAeGqmF6vhW3dXQ0BwKBB13X/chjZn8DZqt1hGcBqV8v9uZyuXOqOuc1BhgGnlyzABG5VYLrOtn62OAqyFHVMWPMoohsruTkpfavhcPhg2VsJc9Agf3uaDT6fjnsqtdyEWmpr2/oTqVSO1ez+4INXhCRGRG5X1W/L7Z7KcHz2excQlUnyxDkgavATAWMI8D2UoYbMiAiPuBhrvU9QKB+fWh3w223HBWRkldxY4zfsqw7FhYWdotIuoyAXDAY7BaRV4HfC9bP3PApFhE/sNcY0wjguq4Ac4BljClbLtd1r4TD4QbLsqSCzzxQb4y5TpjJZE7W/N/w/xr/AaOLRG68/t4OAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAITq2rgrwAABI5JREFUWIXFl21MU1cYx/+nSCiUVrhQKND2IiGuCfISmzgWhkAhEx04MqUIjBCXbczsA8v4QIjomA41bgRZt+w1cQpIvC5ghsZBwBFmEJ0yFzNfsuHKW6FAoYRutkB79mGylGKhBSZPcj+c+/zP8/vnPOfck0sopVjP4K0rHcCGtSxGCOGl794dq4jcnLpRtFHlxQ8KLit9S7nknNW2oKioSDEzR1V+fn4qgZhRCUX7/e3ztzs6fTgu+7Gz+W6vgLe3tywzMzPVV7RRJRAIVBGxR8KW0mcV+iQAaFuxAbVaLfb05CebzeZUX19BakWVNtIdw16W2dylDCxqASFEGBUTkyRmAlVCkVCVsOPLWHeAT4u05wdDU9JSXpo2Tt+klN53aiAhMemgr0DwAcMwHnEvVq2WCwDYxHSgurpKp9Pr6ZRxqsJoNH5jn1/QgrCQ4G3KZI3HWoBjwntQX3sGLcPDyMnZF/rzjRs/NDU3jzvqHPYAj1kLuPbOIVw69xvSVKmITqyBBUBMUn76LKXXAFxcQLQfePsInB4XV2Lyz4/QXJcFgY8PMvIawZe8syCvTNZ8WF5Rke7UAN/bS7sSsG3ia1w69yomDBPIfO0ixJvLnGqFQQeulB+uOEII8QIcWmCjpAvAm66Cfa0cmpoaESQWIyOvESnbBvHjzeXnCSUHDhW/Z4oBkLXgFKjVakaZrDEsVyBM2IrzDQ0AgH25eXguagvau0Nc9Y2+e8e4zz/75A1K6fSi70B1zadfzXhmP3UVFKHdON9Qj9GxMezZsxfxCYlo7Qp2Gax/VDU7Pjpacvbst5r5d4sMqC9ckCjHtg87Tu69XYb7Dx5i186d4DEud+m/GHhwfGB0RLeX47gFTVp0HXPZ2SMSYfvr8+Ox34+juS4LAUwAMvIbkZa+y234H7+8f2V0RBfnCAeWuA3z89W3+rSDyuioLQiPO4q0F0bQdl3iFrjvXqXNaJw43FBff4w6ATk1IJfLr+Xn5Hio8wvi3ekzAEwOaGAwGPRTRkMex3FXl9I6vQ2tNut4a0vL0fjElGIguMBVuP5RFcZGxzvrak/nUkp1y+l5AMCybBohROiY7Ll715r1ysuFEeLO8uUKjWtPYejhCWi12pN1tadTXYED8ytAcEYml80QQvZTSjvsBU96V6lWq2eUyZqTjgUM/TWwWCyYMEwaLWZTYeN33PeugOeDBwD9ff1xVqv1VzacvSoJkZwihHjPCwghW6UyaVvX9a4dJ0ojt+t7P64G/u2zvrcKf5lMGB429VjMpq0c5x4ccNiEIpGoQCwWa2bnZkcopZM2apv04HmE6oZ0pXNzcy3zuqKioujH5tlKPt8rUzc09MXly83vUkot7sIBAJTSBQ+AsDBpWAsbztqkUmk7AL6jxk4rdZZz9XFWmPj7+7/NhrMmmVx2B0DsakFuGbAzsikiIuInlmUtgYGBBwF4PFMDT0zw/AP8S+Ss3CyVSbsBKJ6pATsjCoVCcYsNZ/9mGKZ4rQy49WdECNkQGBRYJvIVlQBge3t7p1a08+1rumPg/4h1/zv+B255SgboD8yRAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAEbjpw7XgAAAlxJREFUWIXl18+LVWUcx/HX1wxdRVHhbWEgDEKSVtKAuGhhm8BFgX/A2ErkLmbR2FyGsIakjht3N8EgNFu1kAwECUpchD8KFJyhggxiRC5UFCFBi/q6uPcOp+HMnTv3XseoLzxwznOeh8/7+Xy/z3POicx0P2PdfVX/XwBExFhEfBQRp6uer7+XwnijaLYmSn3NzLx8TwGqhEtxPCJ2ZqnyY1S7ICJ2Ybpotl7pNa5Rr01k5ofd+6EdiIgnMVM0Wwf6nFJExJnMvMMQDgwgvBiNeu3dzJxhAAci4gltqydXO7cUz3Qv+gYYhXCjXvsJr2bmub4BRrRijXrtS3xRFqdHDUTEY5gqmq3pIYUP4zucxHxmjq8IEBGBH4tma/MQwu/hbbyIWZzH0cxcKI+rTEFmZkS8g+MDCH+CBh7Hp7iFlzLz+6rxvVLwAG4UzdZTfQpfwRRu4yi24LXMvNhr3rJFmJl/RcQl9ARo1Gs3tVf8OWawT9vy05n590rgK70NFxr12qVlhH9p1GuT2IFNuIY7eDozT/Uj3g8AfFwhXmAMN/EVnsfuzJzNzD/6EV6MzNSpg4e716W+t7Afh4pmK3EKm7Edn+ECnls6bzWtLPYzPsBDFQDr8Ii21SfwDV4eRrjbyinYjW2Yi4g9S4zagIO4innsyMyzq7J6mfjHNuxsvdfxJt7H73hU+zA5h9nM/HUUwotRmZd2jq/jN3yNraOwu2cNVEA8iCP4U/tg2bCmACWQcXyLOTy75gAdiI041nHjMNavKUAJ5AX8gL2jAhjZV/Gg8d//NfvXA9wFb2zsOT1cv34AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMHAAMxZxGQCgAABAFJREFUWIXVl11sU2Ucxp//e/bRdnaZ2dZslq7lrTdIjEODgRWjF0YMciNw4RJNVOiIEqMbJCbGj4QElbBNvTFju1GjxguDCSbGaPACtkEMEcSvgOvpFtM1dGUTqqltd97HC4EU2LoOOgnP5Xn+5/973jfvxzlCEjdT6qbSb8kAfr9/bTAY7BCR2koEkHLXgIh4tNYDAFYC+EtE6owxZ0ieyOVyh5LJ5EmSZkkCBAKB+10u1yfGmB+7do5uLvaG+iODADoAkORJkodzudzhRCJxpiIBtNavKKWei/aMLCun4f7etQdEJARgluRvjuN8m8/nh5PJ5MSiAtTV1bW0tLR8CkB17Rx9sBz4HGH2KqUiAHwAUsaYYySPpNPp0Uwmk543QCgU2mRZ1rskP9y+6+ir1wOfSwP71vQppe4WkTtE5PdsNrv3igAiYoXD4fcBrI/2jAQrBZ5Lg30dr5PsvLwN/X5/u9b6FMnGpYYDAMmnjDG7qwAgFAo97/F43tjWPewDcNdSwwFARN4ZHx//rEprvc+yrPsuwpdcQ/2RPwuFwgsTExMfA/+dhBtIDv8fcAAoFAqbL8EBQNra2nR1dfVuku0i8lO0Z+SJSkMH9q3Zo5R6NpvNbpycnPyh2Lu8C3w+351er/dpEXkcQCHaM3JPheB9SqknZ2ZmVk9PT/9xtX/NOSAiNcFgcGNVVdVWAMsAHIv2jHRdD3x/79oPRGRlKpV6LJPJTM1VU/Iobm1tXeHxeLaJyMMkJ7t2jj66CPgXAALxeDxCMj9fXVmXkYjUaK23iMhWACFjzMHtu46+VAJ+HIAdj8c7F7ohy76OL6m5ubm1vr5+h1IqSvJQtGeks9gf7Os4RfJX27Y75+tRrKpyikTE29bWtt6yrEhDQ4OfpNtxHFtEVgPAUH8k5TjOQaXUQyS/s227u9wBlZwBEblNa/2miKwDMGOM+dkYc2J2dvZsTU3NMwAskh+RvN2yrIiIrCKZI/mVbdt7biiAz+cLe73ebwB8nclk+lOpVKzYX758+ZdKqYZYLPZA8XO/37/K7Xa/ZozxxePx9ST/LhVg3m9Cr9f7HskDsVhsx9VwABARm+QvInJFj0QicWJsbGwTyZlgMPhyKThQYg0YY5pJfj6fb9v2i6Uak5wUkcaFAsw7A/l8vtuyrLe01tsWalIsEanXWu+1LOuR8+fPv71gfalFGAgEVtfW1vYCcJH83hhzpFAonM5ms+eUUg4AOI5T7Xa7G10u1woAG0TkXpLHp6amui9cuHDuhgJcUjgcXkdyi4i0k/SKSDXJhov22YsjT5I8msvlDiQSidMLNl1MgGteEqlvamqqA4B0Oj1D8p9FN7mRAJXUrfdvWGn9C2kU6SwCYsgLAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport ResidentialBuildingIcon from '../../../assets/map_residential_building.png';\nimport CommercialBuildingIcon from '../../../assets/map_commercial_building.png';\nimport SchoolBuildingIcon from '../../../assets/map_school_building.png';\nimport TouristAttractionIcon from '../../../assets/map_tourist_attraction.png';\nimport SolarPanelIcon from '../../../assets/map_solar_panel.png';\nimport ParabolicDishIcon from '../../../assets/map_parabolic_dish.png';\nimport ParabolicTroughIcon from '../../../assets/map_parabolic_trough.png';\nimport FresnelReflectorIcon from '../../../assets/map_fresnel_reflector.png';\nimport HeliostatIcon from '../../../assets/map_heliostat.png';\nimport UnderConstructionIcon from '../../../assets/map_under_construction.png';\nimport UnknownIcon from '../../../assets/map_marker.png';\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, Input, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\nimport { ModelType } from '../../../types';\nimport generateRandomAnimal from 'random-animal-name';\nimport { REGEX_ALLOWABLE_IN_NAME } from '../../../constants';\n\nconst { Option } = Select;\n\nconst ModelSiteDialog = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n\n const [modelType, setModelType] = useState(useStore.getState().modelType);\n const [modelAuthor, setModelAuthor] = useState(\n useStore.getState().modelAuthor ?? generateRandomAnimal(),\n );\n const [modelLabel, setModelLabel] = useState(\n useStore.getState().modelLabel ?? useStore.getState().cloudFile ?? null,\n );\n const [modelDescription, setModelDescription] = useState(useStore.getState().modelDescription);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const okButtonRef = useRef(null);\n\n const { TextArea } = Input;\n const lang = { lng: language };\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const onCancelClick = () => {\n setDialogVisible(false);\n };\n\n const onOkClick = () => {\n usePrimitiveStore.setState((state) => {\n state.publishOnModelsMapFlag = true;\n });\n setCommonStore((state) => {\n state.modelType = modelType;\n state.modelAuthor = modelAuthor;\n state.modelLabel = modelLabel;\n state.modelDescription = modelDescription;\n });\n usePrimitiveStore.getState().setChanged(true);\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Publish on Map of Models',\n timestamp: new Date().getTime(),\n };\n });\n }\n setDialogVisible(false);\n };\n\n return (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('menu.file.PublishOnModelsMap', lang)}\n \n }\n footer={[\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('shared.ModelType', lang) + ':'}\n \n \n {\n setModelType(value);\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n {i18n.t('word.Publisher', lang)}:\n \n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e) => {\n setModelAuthor(e.target.value);\n }}\n />\n \n \n\n \n \n {i18n.t('word.Label', lang)}:\n \n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e) => {\n setModelLabel(e.target.value);\n }}\n />\n \n \n\n \n \n {i18n.t('word.Description', lang)}:
\n ({i18n.t('word.MaximumCharacters', lang)}: 200)\n \n \n {\n setModelDescription(e.target.value);\n }}\n />\n \n
\n \n );\n};\n\nexport default React.memo(ModelSiteDialog);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useRef, useState } from 'react';\nimport { Button, Col, Input, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\nimport { DesignProblem } from '../../../types';\nimport { REGEX_ALLOWABLE_IN_NAME } from '../../../constants';\n\nconst { Option } = Select;\n\nconst CreateNewProjectDialog = ({\n saveAs,\n setDialogVisible,\n}: {\n saveAs: boolean;\n setDialogVisible: (b: boolean) => void;\n}) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n\n const [projectType, setProjectType] = useState(\n useStore.getState().projectInfo.type ?? DesignProblem.SOLAR_PANEL_ARRAY,\n );\n const [projectTitle, setProjectTitle] = useState(useStore.getState().projectInfo.title);\n const [projectDescription, setProjectDescription] = useState(\n useStore.getState().projectInfo.description,\n );\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n\n const { TextArea } = Input;\n const lang = { lng: language };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const onCancelClick = () => {\n setDialogVisible(false);\n };\n\n const onOkClick = () => {\n usePrimitiveStore.setState((state) => {\n if (saveAs) {\n state.saveProjectFlag = true;\n } else {\n state.createProjectFlag = true;\n }\n });\n usePrimitiveStore.setState((state) => {\n state.projectType = projectType;\n state.projectTitle = projectTitle;\n state.projectDescription = projectDescription;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: saveAs ? 'Save Project as' : 'Create New Project',\n timestamp: new Date().getTime(),\n };\n });\n }\n setDialogVisible(false);\n };\n\n return (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t(saveAs ? 'menu.project.SaveProjectAs' : 'menu.project.CreateNewProject', lang)}\n \n }\n footer={[\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('projectPanel.ProjectType', lang) + ':'}\n \n \n {\n setProjectType(value);\n }}\n >\n \n \n \n \n\n \n \n {i18n.t('word.Title', lang)}:\n \n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e) => {\n setProjectTitle(e.target.value);\n }}\n />\n \n \n\n \n \n {i18n.t('word.Description', lang)}:
\n ({i18n.t('word.MaximumCharacters', lang)}: 200)\n \n \n {\n setProjectDescription(e.target.value);\n }}\n />\n \n
\n \n );\n};\n\nexport default React.memo(CreateNewProjectDialog);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { useStore } from './stores/common';\nimport firebase from 'firebase/app';\nimport 'firebase/firestore';\nimport 'firebase/storage';\nimport { showError, showInfo } from './helpers';\nimport i18n from './i18n/i18n';\nimport { Design, DesignProblem, DataColoring, ProjectInfo, Range } from './types';\nimport { Util } from './Util';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\n\nexport const fetchProject = async (userid: string, project: string, setProjectState: Function) => {\n const lang = { lng: useStore.getState().language };\n await firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(project)\n .get()\n .then((doc) => {\n const data = doc.data();\n if (data) {\n setProjectState({\n owner: userid,\n title: doc.id,\n timestamp: data.timestamp,\n description: data.description,\n dataColoring: data.dataColoring ?? DataColoring.ALL,\n type: data.type,\n designs: data.designs,\n ranges: data.ranges,\n hiddenParameters: data.hiddenParameters,\n counter: data.counter ?? 0,\n selectedProperty: data.selectedProperty,\n sortDescending: data.sortDescending,\n xAxisNameScatteredPlot: data.xAxisNameScatteredPlot,\n yAxisNameScatteredPlot: data.yAxisNameScatteredPlot,\n dotSizeScatteredPlot: data.dotSizeScatteredPlot,\n thumbnailWidth: data.thumbnailWidth,\n } as ProjectInfo);\n } else {\n showError(i18n.t('message.CannotOpenProject', lang) + ': ' + project);\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotOpenProject', lang) + ': ' + error);\n });\n};\n\nexport const removeDesignFromProject = (userid: string, projectTitle: string, design: Design) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({\n designs: firebase.firestore.FieldValue.arrayRemove(design),\n })\n .then(() => {\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n });\n // also delete the design\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('designs')\n .doc(design.title)\n .delete()\n .then(() => {\n useStore.setState((state) => {\n if (design.title === state.cloudFile) {\n state.cloudFile = undefined;\n }\n });\n showInfo(i18n.t('message.DesignRemovedFromProject', lang) + '.');\n })\n .catch((error) => {\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\n });\n })\n .catch((error) => {\n showError(i18n.t('message.CannotRemoveDesignFromProject', lang) + ': ' + error);\n });\n};\n\nexport const updateHiddenParameters = (\n userid: string,\n projectTitle: string,\n hiddenParameter: string,\n add: boolean, // true is to add, false is to remove\n) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({\n hiddenParameters: add\n ? firebase.firestore.FieldValue.arrayUnion(hiddenParameter)\n : firebase.firestore.FieldValue.arrayRemove(hiddenParameter),\n })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const addRange = (userid: string, projectTitle: string, range: Range) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({\n ranges: firebase.firestore.FieldValue.arrayUnion(range),\n })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateRanges = (userid: string, projectTitle: string, ranges: Range[]) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ ranges })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateDescription = (userid: string, projectTitle: string, description: string | null) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ description })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateDataColoring = (userid: string, projectTitle: string, dataColoring: DataColoring) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ dataColoring })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateSelectedProperty = (userid: string, projectTitle: string, selectedProperty: string | null) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ selectedProperty })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateXAxisNameScatteredPlot = (\n userid: string,\n projectTitle: string,\n xAxisNameScatteredPlot: string | null,\n) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ xAxisNameScatteredPlot })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateYAxisNameScatteredPlot = (\n userid: string,\n projectTitle: string,\n yAxisNameScatteredPlot: string | null,\n) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ yAxisNameScatteredPlot })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateDotSizeScatteredPlot = (userid: string, projectTitle: string, dotSizeScatteredPlot: number) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ dotSizeScatteredPlot })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const updateThumbnailWidth = (userid: string, projectTitle: string, thumbnailWidth: number) => {\n const lang = { lng: useStore.getState().language };\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ thumbnailWidth })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n};\n\nexport const createDesign = (type: string, title: string, thumbnail: string): Design => {\n let design = { timestamp: Date.now(), title, thumbnail } as Design;\n switch (type) {\n case DesignProblem.SOLAR_PANEL_ARRAY:\n const latitude = useStore.getState().world.latitude;\n const panelCount = Util.countAllSolarPanels();\n const dailyYield = Util.countAllSolarPanelDailyYields();\n const yearlyYield = Util.countAllSolarPanelYearlyYields();\n const economicParams = useStore.getState().economicsParams;\n const unitCost = economicParams.operationalCostPerUnit;\n const sellingPrice = economicParams.electricitySellingPrice;\n design = {\n latitude,\n unitCost,\n sellingPrice,\n panelCount,\n dailyYield,\n yearlyYield,\n ...design,\n ...useStore.getState().solarPanelArrayLayoutParams,\n };\n break;\n case DesignProblem.SOLAR_PANEL_TILT_ANGLE:\n // TODO: Each row has a different tilt angle\n break;\n }\n return design;\n};\n\n// change the design titles of a project based on its current title (used when copying or renaming a project)\nexport const changeDesignTitles = (projectTitle: string, projectDesigns: Design[] | null): Design[] | null => {\n if (!projectDesigns) return null;\n const newDesigns: Design[] = [];\n // The order of for-of on arrays is guaranteed by the array iterator definition.\n // It will visit the entries in the array in numeric index order\n // So the returned array has the same order as the original array.\n for (const design of projectDesigns) {\n const copy = { ...design };\n copy.title = createDesignTitle(projectTitle, design.title);\n copy.timestamp = Date.now();\n newDesigns.push(copy);\n }\n return newDesigns;\n};\n\n// the design title is named after the project title plus the current counter of the project\n// for example, \"project title 0\", \"project title 1\", etc.\nexport const createDesignTitle = (projectTitle: string, designTitle: string) => {\n const index = designTitle.lastIndexOf(' ');\n return projectTitle + designTitle.substring(index);\n};\n\nexport const getImageData = (image: HTMLImageElement) => {\n const c = document.createElement('canvas');\n c.width = image.width;\n c.height = image.height;\n const ctx = c.getContext('2d');\n if (ctx) {\n ctx.drawImage(image, 1, 1); // 1 is for padding\n }\n return c.toDataURL();\n};\n\nexport const copyDesign = (original: string, copy: string, owner: string | null, userid: string) => {\n const lang = { lng: useStore.getState().language };\n firebase\n .firestore()\n .collection('users')\n .doc(owner ?? userid)\n .collection('designs')\n .doc(original)\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data) {\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('designs')\n .doc(copy)\n .set(data)\n .then(() => {\n showInfo(i18n.t('message.CloudFileCopied', lang) + ': ' + copy);\n })\n .catch((error) => {\n showError(i18n.t('message.CannotWriteCloudFile', lang) + ': ' + error);\n });\n }\n } else {\n showError(i18n.t('message.CannotReadCloudFile', lang));\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotReadCloudFile', lang) + ': ' + error);\n });\n};\n\nexport const updateDesignVisibility = (userid: string, projectTitle: string, design: Design) => {\n const lang = { lng: useStore.getState().language };\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data) {\n const updatedDesigns: Design[] = [];\n updatedDesigns.push(...data.designs);\n // Get the index of the design to be modified by the title\n let index = -1;\n for (const [i, d] of updatedDesigns.entries()) {\n if (d.title === design.title) {\n index = i;\n break;\n }\n }\n // If found, update the design in the array\n if (index >= 0) {\n updatedDesigns[index].invisible = !design.invisible;\n // Finally, upload the updated design array back to Firestore\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ designs: updatedDesigns })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n });\n }\n }\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotFetchProjectData', lang) + ': ' + error);\n })\n .finally(() => {\n // ignore\n });\n};\n\nexport const updateDesign = (\n userid: string,\n projectType: string,\n projectTitle: string,\n thumbnailWidth: number,\n designTitle: string,\n canvas: HTMLCanvasElement | null,\n) => {\n const lang = { lng: useStore.getState().language };\n usePrimitiveStore.setState((state) => {\n state.waiting = true;\n });\n\n // First we update the design file by overwriting it with the current content\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('designs')\n .doc(designTitle)\n .set(useStore.getState().exportContent())\n .then(() => {\n usePrimitiveStore.getState().setChanged(false);\n if (canvas) {\n // update the thumbnail image as well\n const thumbnail = Util.resizeCanvas(canvas, thumbnailWidth).toDataURL();\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .get()\n .then((doc) => {\n if (doc.exists) {\n const data = doc.data();\n if (data) {\n const updatedDesigns: Design[] = [];\n updatedDesigns.push(...data.designs);\n // Get the index of the design to be modified by the title\n let index = -1;\n for (const [i, d] of updatedDesigns.entries()) {\n if (d.title === designTitle) {\n index = i;\n break;\n }\n }\n // If found, update the design in the array\n if (index >= 0) {\n // Update design from the current parameters and results and the new thumbnail\n updatedDesigns[index] = createDesign(projectType, designTitle, thumbnail);\n // Finally, upload the updated design array back to Firestore\n firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection('projects')\n .doc(projectTitle)\n .update({ designs: updatedDesigns })\n .then(() => {\n // ignore\n })\n .catch((error) => {\n showError(i18n.t('message.CannotUpdateProject', lang) + ': ' + error);\n })\n .finally(() => {\n // Update the cached array in the local storage via the common store\n useStore.getState().set((state) => {\n state.projectInfo.designs = updatedDesigns;\n });\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n state.waiting = false;\n });\n });\n }\n }\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotFetchProjectData', lang) + ': ' + error);\n })\n .finally(() => {\n // ignore\n });\n }\n });\n};\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { useStore } from './stores/common';\nimport firebase from 'firebase/app';\nimport 'firebase/firestore';\nimport 'firebase/storage';\nimport { showError, showInfo } from './helpers';\nimport i18n from './i18n/i18n';\nimport { HOME_URL } from './constants';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\n\nexport const loadCloudFile = (\n userid: string,\n title: string,\n ofProject: boolean,\n popState?: boolean,\n viewOnly?: boolean,\n) => {\n const lang = { lng: useStore.getState().language };\n\n useStore.getState().undoManager.clear();\n usePrimitiveStore.setState((state) => {\n state.waiting = true;\n });\n\n return firebase\n .firestore()\n .collection('users')\n .doc(userid)\n .collection(ofProject ? 'designs' : 'files')\n .doc(title)\n .get()\n .then((doc) => {\n const data = doc.data();\n if (data) {\n useStore.getState().importContent(data, title);\n } else {\n showInfo(i18n.t('message.CloudFileNotFound', lang) + ': ' + title);\n useStore.getState().set((state) => {\n state.cloudFile = undefined;\n });\n usePrimitiveStore.setState((state) => {\n state.waiting = false;\n });\n }\n if (!popState && !viewOnly) {\n const newUrl = HOME_URL + '?client=web&userid=' + userid + '&title=' + encodeURIComponent(title);\n window.history.pushState({}, document.title, newUrl);\n }\n })\n .catch((error) => {\n showError(i18n.t('message.CannotOpenCloudFile', lang) + ': ' + error);\n usePrimitiveStore.setState((state) => {\n state.waiting = false;\n });\n });\n};\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport zhCN from 'antd/lib/locale/zh_CN';\r\nimport zhTW from 'antd/lib/locale/zh_TW';\r\nimport esES from 'antd/lib/locale/es_ES';\r\nimport trTR from 'antd/lib/locale/tr_TR';\r\nimport enUS from 'antd/lib/locale/en_US';\r\nimport ukUA from 'antd/lib/locale/uk_UA';\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport styled from 'styled-components';\r\nimport { Checkbox, Dropdown, InputNumber, Menu, Modal, Radio, Space, Switch } from 'antd';\r\nimport logo from './assets/magic-lamp.png';\r\nimport 'antd/dist/antd.css';\r\nimport About from './about';\r\nimport { saveImage, showError, showInfo, showWarning } from './helpers';\r\nimport { ActionInfo, BuildingCompletionStatus, Language, ObjectType, ProjectInfo, SolarStructure } from './types';\r\nimport * as Selector from './stores/selector';\r\nimport i18n from './i18n/i18n';\r\nimport { Util } from './Util';\r\nimport { UndoableCheck } from './undo/UndoableCheck';\r\nimport { CheckboxChangeEvent } from 'antd/lib/checkbox';\r\nimport { UndoableResetView } from './undo/UndoableResetView';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { Undoable } from './undo/Undoable';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { UndoableDelete } from './undo/UndoableDelete';\r\nimport { UndoablePaste } from './undo/UndoablePaste';\r\nimport CspSimulationSettings from './components/contextMenu/elementMenu/cspSimulationSettings';\r\nimport PvSimulationSettings from './components/contextMenu/elementMenu/pvSimulationSettings';\r\nimport SutSimulationSettings from './components/contextMenu/elementMenu/sutSimulationSettings';\r\nimport { UndoableChange } from './undo/UndoableChange';\r\nimport { DEFAULT_SOLAR_PANEL_SHININESS, FLOATING_WINDOW_OPACITY, HOME_URL, UNDO_SHOW_INFO_DURATION } from './constants';\r\nimport BuildingEnergySimulationSettings from './components/contextMenu/elementMenu/buildingEnergySimulationSettings';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { getExample } from './examples';\r\nimport { checkBuilding, CheckStatus } from './analysis/heatTools';\r\nimport ModelSiteDialog from './components/contextMenu/elementMenu/modelSiteDialog';\r\nimport CreateNewProjectDialog from './components/contextMenu/elementMenu/createNewProjectDialog';\r\nimport { fetchProject } from './cloudProjectUtil';\r\nimport { loadCloudFile } from './cloudFileUtil';\r\nimport { WallModel } from './models/WallModel';\r\nimport { ElementCounter } from './stores/ElementCounter';\r\n\r\nconst { SubMenu } = Menu;\r\n\r\nconst radioStyle = {\r\n display: 'block',\r\n height: '30px',\r\n paddingLeft: '10px',\r\n lineHeight: '30px',\r\n};\r\n\r\nconst MainMenuContainer = styled.div`\r\n width: 100px;\r\n`;\r\n\r\nconst StyledImage = styled.img`\r\n position: absolute;\r\n top: 10px;\r\n left: 10px;\r\n height: 40px;\r\n transition: 0.5s;\r\n opacity: 1;\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n &:hover {\r\n opacity: 0.5;\r\n }\r\n`;\r\n\r\nconst LabelContainer = styled.div`\r\n position: absolute;\r\n top: 54px;\r\n left: 0;\r\n width: 100px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n user-select: none;\r\n z-index: 9;\r\n`;\r\n\r\nexport interface MainMenuProps {\r\n viewOnly: boolean;\r\n setNavigationView: (selected: boolean) => void;\r\n set2DView: (selected: boolean) => void;\r\n resetView: () => void;\r\n zoomView: (scale: number) => void;\r\n canvas?: HTMLCanvasElement | null;\r\n}\r\n\r\nconst MainMenu = ({ viewOnly, set2DView, resetView, zoomView, setNavigationView, canvas }: MainMenuProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const pasteElements = useStore(Selector.pasteElementsByKey);\r\n const copyElementById = useStore(Selector.copyElementById);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const importContent = useStore(Selector.importContent);\r\n const countObservers = useStore(Selector.countObservers);\r\n const countElementsByType = useStore(Selector.countElementsByType);\r\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\r\n const countSolarStructuresByType = useStore(Selector.countSolarStructuresByType);\r\n const selectNone = useStore(Selector.selectNone);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\r\n\r\n const loggable = useStore.getState().loggable;\r\n const language = useStore.getState().language;\r\n const floatingWindowOpacity = useStore.getState().floatingWindowOpacity;\r\n const undoManager = useStore.getState().undoManager;\r\n const timesPerHour = useStore(Selector.world.timesPerHour);\r\n const solarPanelVisibilityGridCellSize = useStore(Selector.world.solarPanelVisibilityGridCellSize);\r\n const solarRadiationHeatmapGridCellSize = useStore(Selector.world.solarRadiationHeatmapGridCellSize);\r\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\r\n const navigationView = useStore.getState().viewState.navigationView;\r\n const orthographic = useStore.getState().viewState.orthographic;\r\n const autoRotate = useStore.getState().viewState.autoRotate;\r\n const showSiteInfoPanel = useStore.getState().viewState.showSiteInfoPanel;\r\n const showDesignInfoPanel = useStore.getState().viewState.showDesignInfoPanel;\r\n const showInstructionPanel = useStore.getState().viewState.showInstructionPanel;\r\n const showMapPanel = useStore.getState().viewState.showMapPanel;\r\n const showWeatherPanel = useStore.getState().viewState.showWeatherPanel;\r\n const showDiurnalTemperaturePanel = useStore.getState().viewState.showDiurnalTemperaturePanel;\r\n const showEconomicsPanel = usePrimitiveStore.getState().showEconomicsPanel;\r\n const showNavigationPanel = usePrimitiveStore.getState().showNavigationPanel;\r\n const showStickyNotePanel = useStore.getState().viewState.showStickyNotePanel;\r\n const showHeliodonPanel = useStore.getState().viewState.showHeliodonPanel;\r\n const shadowEnabled = useStore.getState().viewState.shadowEnabled;\r\n const solarPanelShininess = useStore.getState().viewState.solarPanelShininess;\r\n const changed = usePrimitiveStore.getState().changed;\r\n const cloudFile = useStore.getState().cloudFile;\r\n const user = useStore.getState().user;\r\n const axes = useStore.getState().viewState.axes;\r\n const elementsToPaste = useStore.getState().elementsToPaste;\r\n const runDynamicSimulation = usePrimitiveStore.getState().runDynamicSimulation;\r\n const runStaticSimulation = usePrimitiveStore.getState().runStaticSimulation;\r\n const noAnimationForHeatmapSimulation = useStore(Selector.world.noAnimationForHeatmapSimulation);\r\n const noAnimationForSensorDataCollection = useStore(Selector.world.noAnimationForSensorDataCollection);\r\n const solarRadiationHeatmapReflectionOnly = useStore(Selector.viewState.solarRadiationHeatmapReflectionOnly);\r\n const elements = useStore.getState().elements;\r\n const cameraPosition = useStore.getState().viewState.cameraPosition;\r\n const panCenter = useStore.getState().viewState.panCenter;\r\n const selectedElement = useStore.getState().selectedElement;\r\n const projectInfo = useStore.getState().projectInfo;\r\n const projectView = useStore.getState().projectView;\r\n\r\n const [aboutUs, setAboutUs] = useState(false);\r\n const [modelSiteDialogVisible, setModelSiteDialogVisible] = useState(false);\r\n const [createNewProjectDialogVisible, setCreateNewProjectDialogVisible] = useState(false);\r\n const [saveProjectAsDialogVisible, setSaveProjectAsDialogVisible] = useState(false);\r\n\r\n // Manually update menu when visible to avoid listen to common store change.\r\n const [updateMenuFlag, setUpdateMenuFlag] = useState(false);\r\n\r\n const handleVisibleChange = (visible: boolean) => {\r\n if (visible) {\r\n setUpdateMenuFlag(!updateMenuFlag);\r\n }\r\n };\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const isMac = useMemo(() => Util.isMac(), []);\r\n\r\n const keyHome = useMemo(() => {\r\n const os = Util.getOS();\r\n if (os) {\r\n if (os.includes('OS X')) {\r\n return 'Ctrl+Alt+H';\r\n }\r\n if (os.includes('Chrome')) {\r\n return 'Ctrl+Alt+H';\r\n }\r\n }\r\n return 'Ctrl+Home';\r\n }, []);\r\n\r\n const takeScreenshot = () => {\r\n if (canvas) {\r\n saveImage('screenshot.png', canvas.toDataURL('image/png'));\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Take Screenshot',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n }\r\n };\r\n\r\n const loadFile = (e: any) => {\r\n const input = getExample(e.key);\r\n if (input) {\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n if (!viewOnly && changed) {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n onOk: () => saveAndImport(input),\r\n onCancel: () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = true;\r\n });\r\n // give it a brief moment for this modal to close\r\n // this may also put the function call to the last in the event queue\r\n setTimeout(() => {\r\n importContent(input);\r\n }, 10);\r\n },\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = true;\r\n });\r\n // give it a brief moment for the loading spinner to show\r\n // this may also put the function call to the last in the event queue\r\n setTimeout(() => {\r\n importContent(input);\r\n }, 10);\r\n }\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Example: ' + e.key,\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n if (!viewOnly) {\r\n window.history.pushState({}, document.title, HOME_URL);\r\n }\r\n }\r\n };\r\n\r\n const setProjectState = (projectInfo: ProjectInfo) => {\r\n setCommonStore((state) => {\r\n state.projectInfo = { ...projectInfo };\r\n state.projectImages.clear();\r\n state.projectView = true;\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\r\n state.updateProjectsFlag = true;\r\n });\r\n };\r\n\r\n const loadProject = (title: string, designIndex: number) => {\r\n const owner = process.env.REACT_APP_EXAMPLE_PROJECT_OWNER;\r\n if (title && owner) {\r\n fetchProject(owner, title, setProjectState).then(() => {\r\n loadCloudFile(owner, title + ' ' + designIndex, true, true, viewOnly).then(() => {\r\n // ignore\r\n });\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Example: ' + title,\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n if (!viewOnly) {\r\n window.history.pushState({}, document.title, HOME_URL);\r\n }\r\n }\r\n };\r\n\r\n const saveAndImport = (input: any) => {\r\n if (cloudFile) {\r\n setCommonStore((state) => {\r\n state.localContentToImportAfterCloudFileUpdate = input;\r\n });\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n } else {\r\n if (user.uid) {\r\n // no cloud file has been created\r\n setCommonStore((state) => {\r\n state.localContentToImportAfterCloudFileUpdate = input;\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n } else {\r\n showInfo(i18n.t('menu.file.ToSaveYourWorkPleaseSignIn', lang));\r\n }\r\n }\r\n };\r\n\r\n const toggleTranslucency = (e: CheckboxChangeEvent) => {\r\n const oldOpacity = floatingWindowOpacity;\r\n const newOpacity = e.target.checked ? FLOATING_WINDOW_OPACITY : 1;\r\n const undoableChange = {\r\n name: 'Floating Window Opacity',\r\n timestamp: Date.now(),\r\n oldValue: oldOpacity,\r\n newValue: newOpacity,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.floatingWindowOpacity = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.floatingWindowOpacity = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.floatingWindowOpacity = newOpacity;\r\n });\r\n };\r\n\r\n const toggleShadow = () => {\r\n const undoableCheck = {\r\n name: 'Show Shadow',\r\n timestamp: Date.now(),\r\n checked: !shadowEnabled,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.shadowEnabled = !undoableCheck.checked;\r\n if (state.viewState.shadowEnabled) {\r\n state.updateSceneRadius();\r\n }\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.shadowEnabled = undoableCheck.checked;\r\n if (state.viewState.shadowEnabled) {\r\n state.updateSceneRadius();\r\n }\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.shadowEnabled = !state.viewState.shadowEnabled;\r\n if (state.viewState.shadowEnabled) {\r\n state.updateSceneRadius();\r\n }\r\n });\r\n };\r\n\r\n const setSurfaceShininess = (value: number) => {\r\n const undoableChange = {\r\n name: 'Set Surface Shininess',\r\n timestamp: Date.now(),\r\n oldValue: solarPanelShininess ?? DEFAULT_SOLAR_PANEL_SHININESS,\r\n newValue: value,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.solarPanelShininess = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.solarPanelShininess = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.viewState.solarPanelShininess = value;\r\n });\r\n };\r\n\r\n const toggleSiteInfoPanel = () => {\r\n const undoableCheck = {\r\n name: 'Show Site Information',\r\n timestamp: Date.now(),\r\n checked: !showSiteInfoPanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showSiteInfoPanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showSiteInfoPanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showSiteInfoPanel = !state.viewState.showSiteInfoPanel;\r\n });\r\n };\r\n\r\n const toggleDesignInfoPanel = () => {\r\n const undoableCheck = {\r\n name: 'Show Design Information',\r\n timestamp: Date.now(),\r\n checked: !showDesignInfoPanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showDesignInfoPanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showDesignInfoPanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showDesignInfoPanel = !state.viewState.showDesignInfoPanel;\r\n });\r\n };\r\n\r\n const toggleInstructionPanel = () => {\r\n const undoableCheck = {\r\n name: 'Show Instruction Panel',\r\n timestamp: Date.now(),\r\n checked: !showInstructionPanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showInstructionPanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showInstructionPanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showInstructionPanel = !state.viewState.showInstructionPanel;\r\n });\r\n };\r\n\r\n const toggleStickyNote = () => {\r\n const undoableCheck = {\r\n name: 'Show Sticky Note',\r\n timestamp: Date.now(),\r\n checked: !showStickyNotePanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showStickyNotePanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showStickyNotePanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showStickyNotePanel = !state.viewState.showStickyNotePanel;\r\n });\r\n };\r\n\r\n const openHeliodonPanel = () => {\r\n const undoable = {\r\n name: 'Open Sun and Time Settings Panel',\r\n timestamp: Date.now(),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = false;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = true;\r\n });\r\n },\r\n } as Undoable;\r\n addUndoable(undoable);\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = true;\r\n });\r\n };\r\n\r\n const openMapPanel = () => {\r\n const undoable = {\r\n name: 'Open Maps',\r\n timestamp: Date.now(),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showMapPanel = false;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showMapPanel = true;\r\n });\r\n },\r\n } as Undoable;\r\n addUndoable(undoable);\r\n setCommonStore((state) => {\r\n state.viewState.showMapPanel = true;\r\n });\r\n };\r\n\r\n const openWeatherPanel = () => {\r\n const undoable = {\r\n name: 'Open Weather Panel',\r\n timestamp: Date.now(),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showWeatherPanel = false;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showWeatherPanel = true;\r\n });\r\n },\r\n } as Undoable;\r\n addUndoable(undoable);\r\n setCommonStore((state) => {\r\n state.viewState.showWeatherPanel = true;\r\n });\r\n };\r\n\r\n const openDiurnalTemperaturePanel = () => {\r\n const undoable = {\r\n name: 'Open Diurnal Temperature Panel',\r\n timestamp: Date.now(),\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showDiurnalTemperaturePanel = false;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showDiurnalTemperaturePanel = true;\r\n });\r\n },\r\n } as Undoable;\r\n addUndoable(undoable);\r\n setCommonStore((state) => {\r\n state.viewState.showDiurnalTemperaturePanel = true;\r\n });\r\n };\r\n\r\n const toggleAxes = (e: CheckboxChangeEvent) => {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Show Axes',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.axes = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.axes = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.axes = checked;\r\n });\r\n };\r\n\r\n const toggleNavigationView = (e: CheckboxChangeEvent) => {\r\n const undoableCheck = {\r\n name: 'Toggle Navigation View',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n undo: () => {\r\n setNavigationView(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n setNavigationView(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setNavigationView(e.target.checked);\r\n setCommonStore((state) => {\r\n state.viewState.autoRotate = false;\r\n });\r\n };\r\n\r\n const toggle2DView = (e: CheckboxChangeEvent) => {\r\n const undoableCheck = {\r\n name: 'Toggle 2D View',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n undo: () => {\r\n set2DView(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n set2DView(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n set2DView(e.target.checked);\r\n setCommonStore((state) => {\r\n state.viewState.autoRotate = false;\r\n });\r\n };\r\n\r\n const toggleAutoRotate = () => {\r\n if (!orthographic) {\r\n const undoableCheck = {\r\n name: 'Auto Rotate',\r\n timestamp: Date.now(),\r\n checked: !autoRotate,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = !state.viewState.autoRotate;\r\n });\r\n }\r\n };\r\n\r\n const copySelectedElement = () => {\r\n if (selectedElement) {\r\n copyElementById(selectedElement.id);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Copy',\r\n timestamp: new Date().getTime(),\r\n elementId: selectedElement.id,\r\n elementType: selectedElement.type,\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n };\r\n\r\n const cutSelectedElement = () => {\r\n if (!selectedElement || selectedElement.type === ObjectType.Roof) return;\r\n if (selectedElement.locked) {\r\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\r\n } else {\r\n const cutElements = removeElementById(selectedElement.id, true);\r\n if (cutElements.length === 0) return;\r\n\r\n if (Util.isElementTriggerAutoDeletion(cutElements[0])) {\r\n useRefStore.getState().setListenToAutoDeletionByCut(true);\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\r\n } else {\r\n const undoableCut = {\r\n name: 'Cut',\r\n timestamp: Date.now(),\r\n deletedElements: cutElements,\r\n selectedElementId: selectedElement.id,\r\n undo: () => {\r\n const cutElements = undoableCut.deletedElements;\r\n if (cutElements.length === 0) return;\r\n\r\n const selectedElement = cutElements.find((e) => e.id === undoableCut.selectedElementId);\r\n if (!selectedElement) return;\r\n\r\n setCommonStore((state) => {\r\n for (const e of cutElements) {\r\n state.elements.push(e);\r\n }\r\n if (selectedElement.type === ObjectType.Wall) {\r\n const wall = selectedElement as WallModel;\r\n let leftWallId: string | null = null;\r\n let rightWallId: string | null = null;\r\n if (wall.leftJoints.length > 0) {\r\n leftWallId = wall.leftJoints[0];\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n rightWallId = wall.rightJoints[0];\r\n }\r\n if (leftWallId || rightWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).rightJoints[0] = wall.id;\r\n }\r\n if (e.id === rightWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).leftJoints[0] = wall.id;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n redo: () => {\r\n if (undoableCut.deletedElements && undoableCut.deletedElements.length > 0) {\r\n removeElementById(undoableCut.deletedElements[0].id, true);\r\n }\r\n },\r\n } as UndoableDelete;\r\n addUndoable(undoableCut);\r\n }\r\n }\r\n };\r\n\r\n const pasteSelectedElement = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const pastedElements = pasteElements();\r\n if (pastedElements.length > 0) {\r\n const undoablePaste = {\r\n name: 'Paste by Key',\r\n timestamp: Date.now(),\r\n pastedElements: JSON.parse(JSON.stringify(pastedElements)),\r\n undo: () => {\r\n for (const elem of undoablePaste.pastedElements) {\r\n removeElementById(elem.id, false);\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoablePaste.pastedElements);\r\n state.selectedElement = undoablePaste.pastedElements[0];\r\n });\r\n },\r\n } as UndoablePaste;\r\n addUndoable(undoablePaste);\r\n }\r\n }\r\n };\r\n\r\n const viewAlreadyReset =\r\n cameraPosition[0] === cameraPosition[1] &&\r\n cameraPosition[1] === cameraPosition[2] &&\r\n panCenter[0] === 0 &&\r\n panCenter[1] === 0 &&\r\n panCenter[2] === 0;\r\n\r\n const toggleStaticSolarRadiationHeatmap = () => {\r\n if (!runStaticSimulation) {\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n }\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n setPrimitiveStore('runStaticSimulation', !runStaticSimulation);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Generate Daily Solar Radiation Heatmap (Static)',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }, 100);\r\n };\r\n\r\n const toggleDynamicSolarRadiationHeatmap = () => {\r\n if (!runDynamicSimulation) {\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n }\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n setPrimitiveStore('runDynamicSimulation', !runDynamicSimulation);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Generate Daily Solar Radiation Heatmap (Dynamic)',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }, 100);\r\n };\r\n\r\n const readyToPaste = elementsToPaste && elementsToPaste.length > 0;\r\n\r\n const elementCounter: ElementCounter = useStore.getState().countAllElementsByType();\r\n\r\n const menu = (\r\n \r\n {/* file menu */}\r\n {!openModelsMap && (\r\n \r\n {!viewOnly && (\r\n {\r\n undoManager.clear();\r\n setCommonStore((state) => {\r\n state.createNewFileFlag = true;\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n window.history.pushState({}, document.title, HOME_URL);\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Create New File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n }}\r\n >\r\n {i18n.t('menu.file.CreateNewFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+F)\r\n \r\n )}\r\n\r\n {!viewOnly && (\r\n {\r\n undoManager.clear();\r\n setCommonStore((state) => {\r\n state.openLocalFileFlag = true;\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.cloudFile = undefined;\r\n window.history.pushState({}, document.title, HOME_URL);\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Open Local File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n }}\r\n >\r\n {i18n.t('menu.file.OpenLocalFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+O)...\r\n \r\n )}\r\n\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.saveLocalFileDialogVisible = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save as Local File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.file.SaveAsLocalFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+S)...\r\n \r\n\r\n {user.uid && !viewOnly && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.listCloudFilesFlag = true;\r\n state.openModelsMap = false;\r\n });\r\n setCommonStore((state) => {\r\n state.selectedFloatingWindow = 'cloudFilePanel';\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'List Cloud Files',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.file.OpenCloudFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+Shift+O)...\r\n \r\n )}\r\n\r\n {user.uid && cloudFile && !viewOnly && (\r\n {\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Cloud File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.file.SaveCloudFile', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+Shift+S)\r\n \r\n )}\r\n\r\n {user.uid && !viewOnly && (\r\n {\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Save as Cloud File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n }}\r\n >\r\n {i18n.t('menu.file.SaveAsCloudFile', lang)}...\r\n \r\n )}\r\n\r\n {!viewOnly && (\r\n {\r\n const urlId = new URLSearchParams(window.location.search).get('userid');\r\n const matched = urlId === user.uid;\r\n const allowed = user.uid && cloudFile && matched;\r\n if (allowed) {\r\n setModelSiteDialogVisible(true);\r\n } else {\r\n if (!user.uid) {\r\n showInfo(i18n.t('menu.file.YouMustLogInToPublishYourModel', lang) + '.');\r\n } else if (urlId && !matched) {\r\n showInfo(i18n.t('menu.file.YouCannotPublishAModelThatYouDoNotOwn', lang) + '.');\r\n } else {\r\n showInfo(i18n.t('menu.file.YouMustSaveModelOnCloudBeforePublishingIt', lang) + '.');\r\n }\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.file.PublishOnModelsMap', lang)}...\r\n \r\n )}\r\n\r\n \r\n {i18n.t('menu.file.TakeScreenshot', lang)}\r\n \r\n \r\n )}\r\n\r\n {/* project menu */}\r\n {!openModelsMap && !viewOnly && user.uid && (\r\n \r\n {\r\n if (!user.uid) {\r\n showInfo(i18n.t('menu.project.YouMustLogInToCreateProject', lang) + '.');\r\n return;\r\n }\r\n setCreateNewProjectDialogVisible(true);\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Create New Project',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.project.CreateNewProject', lang)}...\r\n \r\n {\r\n if (!user.uid) {\r\n showInfo(i18n.t('menu.project.YouMustLogInToOpenProject', lang) + '.');\r\n return;\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.showProjectsFlag = true;\r\n state.openModelsMap = false;\r\n });\r\n setCommonStore((state) => {\r\n state.selectedFloatingWindow = 'projectListPanel';\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Project',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.project.OpenProject', lang)}...\r\n \r\n {projectView && projectInfo.title && user.uid && (\r\n {\r\n setSaveProjectAsDialogVisible(true);\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Project As',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.project.SaveProjectAs', lang)}...\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* edit menu */}\r\n {(selectedElement || readyToPaste || undoManager.hasUndo() || undoManager.hasRedo()) && !openModelsMap && (\r\n \r\n {selectedElement && (\r\n \r\n {i18n.t('word.Copy', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+C)\r\n \r\n )}\r\n {selectedElement && (\r\n \r\n {i18n.t('word.Cut', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+X)\r\n \r\n )}\r\n {readyToPaste && (\r\n \r\n {i18n.t('word.Paste', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+V)\r\n \r\n )}\r\n {undoManager.hasUndo() && (\r\n {\r\n if (undoManager.hasUndo()) {\r\n const commandName = undoManager.undo();\r\n if (commandName)\r\n showInfo(i18n.t('menu.edit.Undo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Undo',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.edit.Undo', lang) + ': ' + undoManager.getLastUndoName()}\r\n ({isMac ? '⌘' : 'Ctrl'}+Z)\r\n \r\n )}\r\n {undoManager.hasRedo() && (\r\n {\r\n if (undoManager.hasRedo()) {\r\n const commandName = undoManager.redo();\r\n if (commandName)\r\n showInfo(i18n.t('menu.edit.Redo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Redo',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.edit.Redo', lang) + ': ' + undoManager.getLastRedoName()}\r\n ({isMac ? '⌘' : 'Ctrl'}+Y)\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* view menu */}\r\n {!openModelsMap && (\r\n \r\n {!orthographic && !viewAlreadyReset && (\r\n {\r\n const undoableResetView = {\r\n name: 'Reset View',\r\n timestamp: Date.now(),\r\n oldCameraPosition: [...cameraPosition],\r\n oldPanCenter: [...panCenter],\r\n undo: () => {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n orbitControlsRef.current.object.position.set(\r\n undoableResetView.oldCameraPosition[0],\r\n undoableResetView.oldCameraPosition[1],\r\n undoableResetView.oldCameraPosition[2],\r\n );\r\n orbitControlsRef.current.target.set(\r\n undoableResetView.oldPanCenter[0],\r\n undoableResetView.oldPanCenter[1],\r\n undoableResetView.oldPanCenter[2],\r\n );\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n const v = state.viewState;\r\n v.cameraPosition = [...undoableResetView.oldCameraPosition];\r\n v.panCenter = [...undoableResetView.oldPanCenter];\r\n });\r\n }\r\n },\r\n redo: () => {\r\n resetView();\r\n },\r\n } as UndoableResetView;\r\n addUndoable(undoableResetView);\r\n resetView();\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.orthographic = false;\r\n });\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('menu.view.ResetView', lang)}\r\n ({keyHome})\r\n \r\n )}\r\n {\r\n zoomView(1.1);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('menu.view.ZoomOut', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+])\r\n \r\n {\r\n zoomView(0.9);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('menu.view.ZoomIn', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+[)\r\n \r\n \r\n \r\n {i18n.t('menu.view.NavigationView', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+Q)\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.TwoDimensionalView', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+B)\r\n \r\n \r\n {!orthographic && (\r\n \r\n \r\n {i18n.t('menu.view.AutoRotate', lang)}\r\n ({isMac ? '⌘' : 'Ctrl'}+M)\r\n \r\n \r\n )}\r\n \r\n \r\n {i18n.t('skyMenu.Axes', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.ShowShadow', lang)}\r\n \r\n \r\n \r\n 0}\r\n onChange={(e) => {\r\n setSurfaceShininess(e.target.checked ? DEFAULT_SOLAR_PANEL_SHININESS : 0);\r\n }}\r\n >\r\n {i18n.t('menu.view.ShowSurfaceShininess', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.TranslucentFloatingWindows', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* settings menu */}\r\n {!openModelsMap && (\r\n \r\n {!showHeliodonPanel && (\r\n \r\n {i18n.t('menu.settings.SunAndTime', lang)}...\r\n \r\n )}\r\n {!showMapPanel && (\r\n \r\n {i18n.t('word.Location', lang)}...\r\n \r\n )}\r\n {!showWeatherPanel && (\r\n \r\n {i18n.t('menu.settings.WeatherData', lang)}...\r\n \r\n )}\r\n {!showDiurnalTemperaturePanel && (\r\n \r\n {i18n.t('menu.settings.DiurnalTemperature', lang)}...\r\n \r\n )}\r\n {!showEconomicsPanel && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.showEconomicsPanel = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Economics Panel',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('economicsPanel.EconomicsParameters', lang)}...\r\n \r\n )}\r\n {!showNavigationPanel && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.showNavigationPanel = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Navigation Panel',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('navigationPanel.NavigationParameters', lang)}...\r\n \r\n )}\r\n \r\n )}\r\n\r\n {!openModelsMap && (\r\n \r\n \r\n \r\n {i18n.t('menu.view.accessories.SiteInformation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.accessories.DesignInformation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.accessories.Instruction', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.view.accessories.StickyNote', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* analysis menu */}\r\n {!openModelsMap && elementCounter.gotSome() && (\r\n \r\n {/* physics */}\r\n \r\n \r\n {i18n.t('menu.physics.DailySolarRadiationHeatmap', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('menu.physics.SolarRadiationHeatmapGridCellSize', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.world.solarRadiationHeatmapGridCellSize = value;\r\n });\r\n }}\r\n />\r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n {i18n.t('menu.physics.SolarRadiationHeatmapMaxValue', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.viewState.solarRadiationHeatMapMaxValue = value;\r\n });\r\n }}\r\n />\r\n \r\n {Util.hasHeliostatOrFresnelReflectors(elements) && (\r\n \r\n {i18n.t('menu.physics.ReflectionHeatmap', lang) + ':'}\r\n {\r\n setCommonStore((state) => {\r\n state.viewState.solarRadiationHeatMapReflectionOnly = checked;\r\n });\r\n }}\r\n />\r\n \r\n )}\r\n {!Util.hasMovingParts(elements) && (\r\n \r\n \r\n {i18n.t('menu.physics.SolarRadiationHeatmapNoAnimation', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.world.noAnimationForHeatmapSimulation = checked;\r\n });\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n {/* sensors */}\r\n {elementCounter.sensorCount > 0 && (\r\n \r\n {\r\n const sensorCount = countElementsByType(ObjectType.Sensor);\r\n if (sensorCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSensorForCollectingData', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = { name: 'Collect Daily Data for Sensors', timestamp: new Date().getTime() };\r\n });\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailyLightSensor = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.sensor.CollectDailyData', lang)}\r\n \r\n {\r\n const sensorCount = countElementsByType(ObjectType.Sensor);\r\n if (sensorCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSensorForCollectingData', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = { name: 'Collect Yearly Data for Sensors', timestamp: new Date().getTime() };\r\n });\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlyLightSensor = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.sensor.CollectYearlyData', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.option.SamplingFrequency', lang) + ':'}\r\n Number(a).toFixed(0)}\r\n onChange={(value) => {\r\n setCommonStore((state) => {\r\n state.world.timesPerHour = value;\r\n });\r\n }}\r\n />\r\n {i18n.t('menu.option.TimesPerHour', lang)}\r\n \r\n {!Util.hasMovingParts(elements) && (\r\n \r\n \r\n {i18n.t('menu.sensor.SensorSimulationNoAnimation', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.world.noAnimationForSensorDataCollection = checked;\r\n });\r\n }}\r\n />\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* buildings */}\r\n {elementCounter.wallCount > 0 && (\r\n \r\n {\r\n const checkResult = checkBuilding(elements, countElementsByType, getChildrenOfType);\r\n if (checkResult.status === CheckStatus.NO_BUILDING) {\r\n showInfo(i18n.t('analysisManager.NoBuildingForAnalysis', lang));\r\n return;\r\n }\r\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD) {\r\n let errorType;\r\n switch (checkResult.buildingCompletion) {\r\n case BuildingCompletionStatus.WALL_DISJOINED:\r\n errorType = i18n.t('message.WallsAreNotConnected', lang);\r\n break;\r\n case BuildingCompletionStatus.WALL_EMPTY:\r\n errorType = i18n.t('message.BuildingContainsEmptyWall', lang);\r\n break;\r\n case BuildingCompletionStatus.ROOF_MISSING:\r\n errorType = i18n.t('message.BuildingRoofMissing', lang);\r\n break;\r\n default:\r\n errorType = i18n.t('message.UnknownErrors', lang);\r\n }\r\n showError(i18n.t('message.SimulationWillNotStartDueToErrors', lang) + ': ' + errorType);\r\n return;\r\n }\r\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD) {\r\n showWarning(i18n.t('message.SimulationWillStartDespiteWarnings', lang));\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = { name: 'Analyze Daily Building Energy', timestamp: new Date().getTime() };\r\n });\r\n }\r\n usePrimitiveStore.setState((state) => {\r\n state.runDailyThermalSimulation = true;\r\n state.simulationInProgress = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.building.AnalyzeDailyBuildingEnergy', lang)}\r\n \r\n {\r\n const checkResult = checkBuilding(elements, countElementsByType, getChildrenOfType);\r\n if (checkResult.status === CheckStatus.NO_BUILDING) {\r\n showInfo(i18n.t('analysisManager.NoBuildingForAnalysis', lang));\r\n return;\r\n }\r\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD) {\r\n let errorType;\r\n switch (checkResult.buildingCompletion) {\r\n case BuildingCompletionStatus.WALL_DISJOINED:\r\n errorType = i18n.t('message.WallsAreNotConnected', lang);\r\n break;\r\n case BuildingCompletionStatus.WALL_EMPTY:\r\n errorType = i18n.t('message.BuildingContainsEmptyWall', lang);\r\n break;\r\n case BuildingCompletionStatus.ROOF_MISSING:\r\n errorType = i18n.t('message.BuildingRoofMissing', lang);\r\n break;\r\n default:\r\n errorType = i18n.t('message.UnknownErrors', lang);\r\n }\r\n showError(i18n.t('message.SimulationWillNotStartDueToErrors', lang) + ': ' + errorType);\r\n return;\r\n }\r\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD) {\r\n showWarning(i18n.t('message.SimulationWillStartDespiteWarnings', lang));\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n usePrimitiveStore.setState((state) => {\r\n state.runYearlyThermalSimulation = true;\r\n state.simulationInProgress = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = { name: 'Analyze Yearly Building Energy', timestamp: new Date().getTime() };\r\n });\r\n }\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.building.AnalyzeYearlyBuildingEnergy', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* solar panels */}\r\n {elementCounter.solarPanelCount > 0 && (\r\n \r\n {\r\n const solarPanelCount = countElementsByType(ObjectType.SolarPanel);\r\n if (solarPanelCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation For Solar Panels',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForSolarPanels = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarPanel.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const solarPanelCount = countElementsByType(ObjectType.SolarPanel);\r\n if (solarPanelCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation For Solar Panels',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForSolarPanels = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarPanel.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n {\r\n const observerCount = countObservers();\r\n if (observerCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoObserverForVisibilityAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n usePrimitiveStore.setState((state) => {\r\n state.runSolarPanelVisibilityAnalysis = !state.runSolarPanelVisibilityAnalysis;\r\n state.simulationInProgress = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Run Visibility Analysis For Solar Panels',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarPanel.AnalyzeVisibility', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('menu.solarPanel.VisibilityGridCellSize', lang) + ':'}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.world.solarPanelVisibilityGridCellSize = value;\r\n });\r\n }}\r\n />\r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* parabolic troughs */}\r\n {elementCounter.parabolicTroughCount > 0 && (\r\n \r\n {\r\n const parabolicTroughCount = countElementsByType(ObjectType.ParabolicTrough);\r\n if (parabolicTroughCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyParabolicTroughIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Parabolic Troughs',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForParabolicTroughs = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.parabolicTrough.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const parabolicTroughCount = countElementsByType(ObjectType.ParabolicTrough);\r\n if (parabolicTroughCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyParabolicTroughIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Parabolic Troughs',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForParabolicTroughs = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.parabolicTrough.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* parabolic dishes */}\r\n {elementCounter.parabolicDishCount > 0 && (\r\n \r\n {\r\n const parabolicDishCount = countElementsByType(ObjectType.ParabolicDish);\r\n if (parabolicDishCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyParabolicDishIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Parabolic Dishes',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForParabolicDishes = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.parabolicDish.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const parabolicDishCount = countElementsByType(ObjectType.ParabolicDish);\r\n if (parabolicDishCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyParabolicDishIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Parabolic Dishes',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForParabolicDishes = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.parabolicDish.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* Fresnel reflector */}\r\n {elementCounter.fresnelReflectorCount > 0 && (\r\n \r\n {\r\n const fresnelReflectorCount = countElementsByType(ObjectType.FresnelReflector);\r\n if (fresnelReflectorCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyFresnelReflectorIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Fresnel Reflectors',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForFresnelReflectors = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.fresnelReflector.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const fresnelReflectorCount = countElementsByType(ObjectType.FresnelReflector);\r\n if (fresnelReflectorCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyFresnelReflectorIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Fresnel Reflectors',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForFresnelReflectors = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.fresnelReflector.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* heliostat */}\r\n {elementCounter.heliostatCount > 0 && (\r\n \r\n {\r\n const heliostatCount = countElementsByType(ObjectType.Heliostat);\r\n if (heliostatCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyHeliostatIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Heliostats',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForHeliostats = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.heliostat.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const heliostatCount = countElementsByType(ObjectType.Heliostat);\r\n if (heliostatCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyHeliostatIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Heliostats',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForHeliostats = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.heliostat.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {/* solar updraft tower */}\r\n {elementCounter.solarUpdraftTowerCount > 0 && (\r\n \r\n {\r\n const towerCount = countSolarStructuresByType(SolarStructure.UpdraftTower);\r\n if (towerCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSolarUpdraftTowerForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.dailyUpdraftTowerIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Daily Simulation for Solar Updraft Tower',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runDailySimulationForUpdraftTower = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarUpdraftTower.AnalyzeDailyYield', lang)}\r\n \r\n {\r\n const towerCount = countSolarStructuresByType(SolarStructure.UpdraftTower);\r\n if (towerCount === 0) {\r\n showInfo(i18n.t('analysisManager.NoSolarUpdraftTowerForAnalysis', lang));\r\n return;\r\n }\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n setCommonStore((state) => {\r\n if (state.graphState) state.graphState.yearlyUpdraftTowerIndividualOutputs = false;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Run Yearly Simulation for Solar Updraft Tower',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.simulationInProgress = true;\r\n state.runYearlySimulationForUpdraftTower = true;\r\n });\r\n }, 100);\r\n }}\r\n >\r\n {i18n.t('menu.solarUpdraftTower.AnalyzeYearlyYield', lang)}\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* tutorials menu */}\r\n \r\n {/* solar science */}\r\n \r\n \r\n {i18n.t('menu.solarEnergyScienceTutorials.SunAngles', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyScienceTutorials.InsolationAndClimate', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyScienceTutorials.SolarRadiationToBox', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SunBeamAndHeliodon', lang)}\r\n \r\n \r\n {/* building science */}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.ThermalEnvelopeVsBuildingEnvelope', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfSizeOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfOrientationOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfInsulationOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfRoofColorOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfEavesOverhangLengthOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfWindowSHGCOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfThermostatSetpointOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfSolarPanelsOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfGroundTemperatureOnBuildingEnergy', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingScienceTutorials.EffectOfTreesOnBuildingEnergy', lang)}\r\n \r\n \r\n {/* building design */}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.CapeCodStyleHouseWithShedDormer', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.MansardRoofWithDormers', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.GableRoofVsHipRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.ColonialVsSaltbox', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.GambrelRoofVsMansardRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.CombinationRoofVsBonnetRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.DutchGableRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.GableAndValleyRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.ClerestoryRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.MonitorRoof', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.AFrameHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.HalfTimberedHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingDesignTutorials.AllBasicRoofTypes', lang)}\r\n \r\n \r\n {/* photovoltaic solar power */}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.EffectOfTiltAngleOfSolarPanel', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.EffectOfAzimuthOfSolarPanel', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.SolarPanelTypes', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.VerticalBifacialSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.CompareMonofacialAndBifacialSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.SolarTrackers', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.CoveringGroundWithSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.InterRowSpacingOfSolarPanelArray', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.EffectOfOrientationOfSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.photovoltaicSolarPowerTutorials.SolarPanelArrayAutomaticLayout', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.RooftopSolarPanels', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarCanopyFormFactors', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.BuildingIntegratedPhotovoltaics', lang)}\r\n \r\n \r\n {/* concentrated solar power */}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.FocusSunlightWithParabolicDish', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfParabolicTrough', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectOfLatusRectumOfParabolicTrough', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.LinearFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectOfAbsorberPipeHeightForLinearFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectOfAzimuthOfLinearFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.LinearFresnelReflectorsWithTwoAbsorbers', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.SolarPowerTower', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.CosineEfficiencyOfHeliostats', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.ShadowingAndBlockingOfHeliostats', lang)}\r\n \r\n \r\n {i18n.t('menu.concentratedSolarPowerTutorials.EffectSolarPowerTowerHeight', lang)}\r\n \r\n \r\n {/* other types of solar power */}\r\n \r\n \r\n {i18n.t('menu.otherTypesOfSolarPowerTutorials.SolarUpdraftTower', lang)}\r\n \r\n \r\n {/* generative design */}\r\n \r\n loadProject(e.key, 48)}>\r\n {i18n.t('menu.generativeDesignTutorials.MonofacialSolarPanelArrayTiltAngle', lang)}\r\n \r\n loadProject(e.key, 50)}>\r\n {i18n.t('menu.generativeDesignTutorials.BifacialSolarPanelArrayTiltAngle', lang)}\r\n \r\n loadProject(e.key, 0)}>\r\n {i18n.t('menu.generativeDesignTutorials.OutputOfSolarPanelArrayInDifferentPlaces', lang)}\r\n \r\n loadProject(e.key, 0)}>\r\n {i18n.t('menu.generativeDesignTutorials.SimpleSolarFarmParetoFront', lang)}\r\n \r\n \r\n \r\n\r\n {/* example menu */}\r\n \r\n {/* solar energy */}\r\n \r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.VegetativeBuffer', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarCanopyOverBleachers', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarCanopyOverGarage', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarBusStop', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarFacadeTesla', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.Floatovoltaics', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.Agrivoltaics', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.RainbowSwashSolarFarmBostonMA', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.MickeyMouseSolarFarmOrlandoFL', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarPanelsOverCanalBakersfieldCA', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarNoiseBarrierLexingtonMA', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.HSATSolarTrackersRaleighNC', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.AADATSolarTrackersLancasterCA', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.NevadaSolarOneParabolicTroughArray', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.TooeleParabolicDishArray', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.TucsonLinearFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.PS10SolarPowerTower', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.solarEnergyExamples.SolarUpdraftTowerInCity', lang)}\r\n \r\n \r\n \r\n\r\n {/* built environments */}\r\n \r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.ColonialHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.DutchColonialHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.TShapedHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.CapeCodHouseWithGarage', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Solarium', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.ButterflyRoofHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.AdobeTaosHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.RanchHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.BonnetHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.BarnStyleHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.ModernHouse', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.WhiteHouse', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.BilimMersinTurkiye', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.SpanishStyleHotel', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.ApartmentBuilding', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.OfficeBuilding', lang)}\r\n \r\n \r\n {i18n.t('menu.commercialBuildingExamples.Hotel', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.Greenhouse', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Church1', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Cathedral1', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Cathedral2', lang)}\r\n \r\n \r\n {i18n.t('menu.residentialBuildingExamples.Mosque1', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.Pavilion', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.OctagonalPagoda', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.OceanFront', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.EgyptianPyramids', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.MayanPyramid', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.SiOSePol', lang)}\r\n \r\n \r\n {i18n.t('menu.otherBuildingExamples.StackedCuboids', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.buildingComplexExamples.SouthBurlingtonHighSchoolVermont', lang)}\r\n \r\n \r\n {i18n.t('menu.buildingComplexExamples.MescaleroApacheSchoolNewMexico', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('menu.urbanPlanningExamples.Heatmap1', lang)}\r\n \r\n \r\n \r\n\r\n {/* artificial intelligence */}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.OptimizingTiltAngleOfOneSolarPanelRow', lang)}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.OptimizingTiltAnglesOfMultipleSolarPanelRows', lang)}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.SolarFarmGenerativeDesign', lang)}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.SolarFarmGenerativeDesignWithBlock', lang)}\r\n \r\n \r\n {i18n.t('menu.artificialIntelligenceExamples.FitchburgSolarFarmGenerativeDesign', lang)}\r\n \r\n \r\n\r\n {/* benchmarks menu */}\r\n \r\n \r\n {i18n.t('menu.benchmarks.SolarRadiationPredictionVsMeasurement', lang)}\r\n \r\n \r\n {i18n.t('menu.benchmarks.BESTESTCase600', lang)}\r\n \r\n \r\n {i18n.t('menu.benchmarks.BESTESTCase610', lang)}\r\n \r\n \r\n {i18n.t('menu.benchmarks.BESTESTCase620', lang)}\r\n \r\n \r\n {i18n.t('menu.benchmarks.BESTESTCase630', lang)}\r\n \r\n \r\n \r\n\r\n \r\n {user.uid && !viewOnly && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.showModelsGallery = true;\r\n state.leaderboardFlag = true;\r\n state.openModelsMap = false;\r\n });\r\n }}\r\n >\r\n {i18n.t('menu.ModelsGallery', lang)}...\r\n \r\n )}\r\n\r\n {/* models map */}\r\n {!openModelsMap && (\r\n {\r\n usePrimitiveStore.setState((state) => {\r\n state.modelsMapFlag = true;\r\n state.modelsMapWeatherStations = false;\r\n state.openModelsMap = true;\r\n state.showModelsGallery = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Open Models Map',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('menu.ModelsMap', lang)}...\r\n \r\n )}\r\n \r\n\r\n {/*language menu*/}\r\n \r\n {\r\n setCommonStore((state) => {\r\n state.language = e.target.value;\r\n switch (state.language) {\r\n case 'zh_cn':\r\n state.locale = zhCN;\r\n break;\r\n case 'zh_tw':\r\n state.locale = zhTW;\r\n break;\r\n case 'es':\r\n state.locale = esES;\r\n break;\r\n case 'tr':\r\n state.locale = trTR;\r\n break;\r\n case 'ua':\r\n state.locale = ukUA;\r\n break;\r\n default:\r\n state.locale = enUS;\r\n }\r\n });\r\n }}\r\n >\r\n \r\n {Language.English}\r\n \r\n \r\n {Language.Spanish}\r\n \r\n \r\n {Language.ChineseSimplified}\r\n \r\n \r\n {Language.ChineseTraditional}\r\n \r\n \r\n {Language.Turkish}\r\n \r\n \r\n {Language.Ukrainian}\r\n \r\n \r\n \r\n\r\n {/* about window */}\r\n {\r\n setAboutUs(true);\r\n }}\r\n >\r\n {i18n.t('menu.AboutUs', lang)}...\r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('menu.mainMenu', lang)}\r\n \r\n \r\n \r\n \r\n {aboutUs && setAboutUs(false)} />}\r\n {modelSiteDialogVisible && }\r\n {createNewProjectDialogVisible && (\r\n \r\n )}\r\n {saveProjectAsDialogVisible && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(MainMenu);\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport sun_angles from './examples/sun_angles.json';\nimport insolation_and_climate from './examples/insolation_and_climate.json';\nimport solar_radiation_to_box from './examples/solar_radiation_to_box.json';\nimport sun_beam_at_center from './examples/sun_beam_at_center.json';\nimport solar_panel_types from './examples/solar_panel_types.json';\nimport vertical_bifacial_solar_panels from './examples/vertical_bifacial_solar_panels.json';\nimport compare_monofacial_bifacial_solar_panels from './examples/compare_monofacial_bifacial_solar_panels.json';\nimport rooftop_solar_panels from './examples/rooftop_solar_panels.json';\nimport rainbow_swash_solar_farm from './examples/rainbow_swash_solar_farm.json';\nimport mickey_mouse_solar_farm from './examples/mickey_mouse_solar_farm.json';\nimport solar_farm_hsat_array from './examples/solar_farm_hsat_array.json';\nimport solar_farm_aadat_array from './examples/solar_farm_aadat_array.json';\nimport solar_noise_barrier from './examples/solar_noise_barrier.json';\nimport solar_panels_over_canal from './examples/solar_panels_over_canal.json';\nimport solar_trackers from './examples/solar_trackers.json';\nimport all_roof_types from './examples/all_roof_types.json';\nimport cape_cod_with_shed_dormer from './examples/cape_cod_with_shed_dormer.json';\nimport mansard_roof_with_dormers from './examples/mansard_roof_with_dormers.json';\nimport t_shaped_house from './examples/t_shaped_house.json';\nimport cape_cod_with_garage from './examples/cape_cod_with_garage.json';\nimport adobe_taos_house from './examples/adobe_taos_house.json';\nimport ranch_house from './examples/ranch_house.json';\nimport bonnet_house from './examples/bonnet_house.json';\nimport barn_house from './examples/barn_house.json';\nimport modern_house_01 from './examples/modern_house_01.json';\nimport solarium from './examples/solarium.json';\nimport mosque_01 from './examples/mosque_01.json';\nimport church_01 from './examples/church_01.json';\nimport cathedral_01 from './examples/cathedral_01.json';\nimport cathedral_02 from './examples/cathedral_02.json';\nimport colonial_house from './examples/colonial_house.json';\nimport dutch_colonial_house from './examples/dutch_colonial_house.json';\nimport dutch_gable_roof from './examples/dutch_gable_roof.json';\nimport a_frame_house from './examples/a_frame_house.json';\nimport half_timbered_house from './examples/half_timbered_house.json';\nimport combination_roof_vs_bonnet_roof from './examples/combination_roof_vs_bonnet_roof.json';\nimport butterfly_roof_house from './examples/butterfly_roof_house.json';\nimport gable_roof_vs_hip_roof from './examples/gable_roof_vs_hip_roof.json';\nimport gable_and_valley_roof from './examples/gable_and_valley_roof.json';\nimport clerestory_roof from './examples/clerestory_roof.json';\nimport monitor_roof from './examples/monitor_roof.json';\nimport colonial_vs_saltbox from './examples/colonial_vs_saltbox.json';\nimport gambrel_roof_vs_mansard_roof from './examples/gambrel_roof_vs_mansard_roof.json';\nimport white_house from './examples/white_house.json';\nimport bilim_mersin_turkiye from './examples/bilim_mersin_turkiye.json';\nimport office_building_01 from './examples/office_building_01.json';\nimport hotel_01 from './examples/hotel_01.json';\nimport spanish_style_hotel from './examples/spanish_style_hotel.json';\nimport apartment_building_01 from './examples/apartment_building_01.json';\nimport south_burlington_high_school from './examples/south_burlington_high_school.json';\nimport mescalero_apache_school from './examples/mescalero_apache_school.json';\nimport heatmap_01 from './examples/heatmap_01.json';\nimport greenhouse from './examples/greenhouse.json';\nimport pavilion from './examples/pavilion.json';\nimport octagonal_pagoda from './examples/octagonal_pagoda.json';\nimport ocean_front from './examples/ocean_front.json';\nimport egyptian_pyramids from './examples/egyptian_pyramids.json';\nimport mayan_pyramid from './examples/mayan_pyramid.json';\nimport si_o_se_pol from './examples/si_o_se_pol.json';\nimport stacked_cuboids from './examples/stacked_cuboids.json';\nimport vegetative_buffer_01 from './examples/vegetative_buffer_01.json';\nimport effect_tilt_angle_solar_panel from './examples/effect_tilt_angle_solar_panel.json';\nimport effect_azimuth_solar_panel from './examples/effect_azimuth_solar_panel.json';\nimport effect_azimuth_parabolic_trough from './examples/effect_azimuth_parabolic_trough.json';\nimport effect_latus_rectum_parabolic_trough from './examples/effect_latus_rectum_parabolic_trough.json';\nimport effect_orientation_solar_panel from './examples/effect_orientation_solar_panel.json';\nimport why_solar_array from './examples/why_solar_array.json';\nimport solar_panel_array_auto_layout from './examples/solar_panel_array_auto_layout.json';\nimport solar_canopy_form_factors from './examples/solar_canopy_form_factors.json';\nimport solar_canopy_over_bleachers from './examples/solar_canopy_over_bleachers.json';\nimport solar_bus_stop from './examples/solar_bus_stop.json';\nimport bipv_01 from './examples/bipv_01.json';\nimport solar_canopy_over_garage from './examples/solar_canopy_over_garage.json';\nimport solar_facade_tesla from './examples/solar_facade_tesla.json';\nimport floatovoltaics from './examples/floatovoltaics.json';\nimport agrivoltaics from './examples/agrivoltaics.json';\nimport inter_row_spacing from './examples/inter_row_spacing.json';\nimport ps10_solar_power_tower from './examples/ps10_solar_power_tower.json';\nimport nevada_solar_one_parabolic_troughs from './examples/nevada_solar_one_parabolic_troughs.json';\nimport parabolic_dish_focus_sunlight from './examples/parabolic_dish_focus_sunlight.json';\nimport tooele_parabolic_dish_array from './examples/tooele_parabolic_dish_array.json';\nimport linear_fresnel_reflectors from './examples/linear_fresnel_reflectors.json';\nimport linear_fresnel_reflectors_two_absorbers from './examples/linear_fresnel_reflectors_two_absorbers.json';\nimport effect_absorber_pipe_height from './examples/effect_absorber_pipe_height.json';\nimport effect_azimuth_fresnel_reflector from './examples/effect_azimuth_fresnel_reflector.json';\nimport cosine_efficiency_heliostats from './examples/cosine_efficiency_heliostats.json';\nimport shadowing_blocking_heliostats from './examples/shadowing_blocking_heliostats.json';\nimport effect_solar_power_tower_height from './examples/effect_solar_power_tower_height.json';\nimport solar_power_tower from './examples/solar_power_tower.json';\nimport solar_radiation_predicted_vs_measured from './examples/solar_radiation_predicted_vs_measured.json';\nimport bestest_case_600 from './examples/bestest_case_600.json';\nimport bestest_case_610 from './examples/bestest_case_610.json';\nimport bestest_case_620 from './examples/bestest_case_620.json';\nimport bestest_case_630 from './examples/bestest_case_630.json';\nimport solar_updraft_tower from './examples/solar_updraft_tower.json';\nimport solar_updraft_tower_city from './examples/solar_updraft_tower_city.json';\nimport tucson_sundt_station from './examples/tucson_sundt_station.json';\nimport ai_tilt_angle_one_row from './examples/ai_tilt_angle_one_row.json';\nimport ai_tilt_angles_multiple_rows from './examples/ai_tilt_angles_multiple_rows.json';\nimport ai_solar_farm_design from './examples/ai_solar_farm_design.json';\nimport ai_solar_farm_design_block from './examples/ai_solar_farm_design_block.json';\nimport ai_fitchburg_solar_farm from './examples/ai_fitchburg_solar_farm.json';\nimport effect_house_size from './examples/effect_house_size.json';\nimport effect_house_orientation from './examples/effect_house_orientation.json';\nimport effect_wall_roof_insulation from './examples/effect_wall_roof_insulation.json';\nimport effect_roof_color from './examples/effect_roof_color.json';\nimport effect_eaves_overhang_length from './examples/effect_eaves_overhang_length.json';\nimport effect_window_shgc from './examples/effect_window_shgc.json';\nimport effect_thermostat_setpoint from './examples/effect_thermostat_setpoint.json';\nimport effect_solar_panels from './examples/effect_solar_panels.json';\nimport effect_ground_temperature from './examples/effect_ground_temperature.json';\nimport effect_trees from './examples/effect_trees.json';\nimport thermal_vs_building_envelope from './examples/thermal_vs_building_envelope.json';\n\nexport const getExample = (name: string) => {\n let input: any;\n switch (name) {\n case 'sun_angles':\n input = sun_angles;\n break;\n case 'insolation_and_climate':\n input = insolation_and_climate;\n break;\n case 'solar_radiation_to_box':\n input = solar_radiation_to_box;\n break;\n case 'sun_beam_at_center':\n input = sun_beam_at_center;\n break;\n case 'thermal_vs_building_envelope':\n input = thermal_vs_building_envelope;\n break;\n case 'effect_house_size':\n input = effect_house_size;\n break;\n case 'effect_house_orientation':\n input = effect_house_orientation;\n break;\n case 'effect_wall_roof_insulation':\n input = effect_wall_roof_insulation;\n break;\n case 'effect_roof_color':\n input = effect_roof_color;\n break;\n case 'effect_eaves_overhang_length':\n input = effect_eaves_overhang_length;\n break;\n case 'effect_window_shgc':\n input = effect_window_shgc;\n break;\n case 'effect_thermostat_setpoint':\n input = effect_thermostat_setpoint;\n break;\n case 'effect_solar_panels':\n input = effect_solar_panels;\n break;\n case 'effect_ground_temperature':\n input = effect_ground_temperature;\n break;\n case 'effect_trees':\n input = effect_trees;\n break;\n case 'office_building_01':\n input = office_building_01;\n break;\n case 'hotel_01':\n input = hotel_01;\n break;\n case 'spanish_style_hotel':\n input = spanish_style_hotel;\n break;\n case 'apartment_building_01':\n input = apartment_building_01;\n break;\n case 'white_house':\n input = white_house;\n break;\n case 'bilim_mersin_turkiye':\n input = bilim_mersin_turkiye;\n break;\n case 'south_burlington_high_school':\n input = south_burlington_high_school;\n break;\n case 'mescalero_apache_school':\n input = mescalero_apache_school;\n break;\n case 'heatmap_01':\n input = heatmap_01;\n break;\n case 'vegetative_buffer_01':\n input = vegetative_buffer_01;\n break;\n case 'solar_canopy_form_factors':\n input = solar_canopy_form_factors;\n break;\n case 'solar_canopy_over_bleachers':\n input = solar_canopy_over_bleachers;\n break;\n case 'solar_bus_stop':\n input = solar_bus_stop;\n break;\n case 'solar_facade_tesla':\n input = solar_facade_tesla;\n break;\n case 'solar_canopy_over_garage':\n input = solar_canopy_over_garage;\n break;\n case 'bipv_01':\n input = bipv_01;\n break;\n case 'floatovoltaics':\n input = floatovoltaics;\n break;\n case 'agrivoltaics':\n input = agrivoltaics;\n break;\n case 'effect_tilt_angle_solar_panel':\n input = effect_tilt_angle_solar_panel;\n break;\n case 'effect_azimuth_solar_panel':\n input = effect_azimuth_solar_panel;\n break;\n case 'effect_azimuth_parabolic_trough':\n input = effect_azimuth_parabolic_trough;\n break;\n case 'effect_latus_rectum_parabolic_trough':\n input = effect_latus_rectum_parabolic_trough;\n break;\n case 'parabolic_dish_focus_sunlight':\n input = parabolic_dish_focus_sunlight;\n break;\n case 'effect_orientation_solar_panel':\n input = effect_orientation_solar_panel;\n break;\n case 'solar_panel_types':\n input = solar_panel_types;\n break;\n case 'vertical_bifacial_solar_panels':\n input = vertical_bifacial_solar_panels;\n break;\n case 'compare_monofacial_bifacial_solar_panels':\n input = compare_monofacial_bifacial_solar_panels;\n break;\n case 'why_solar_array':\n input = why_solar_array;\n break;\n case 'solar_panel_array_auto_layout':\n input = solar_panel_array_auto_layout;\n break;\n case 'inter_row_spacing':\n input = inter_row_spacing;\n break;\n case 'rooftop_solar_panels':\n input = rooftop_solar_panels;\n break;\n case 'solar_panels_over_canal':\n input = solar_panels_over_canal;\n break;\n case 'solar_noise_barrier':\n input = solar_noise_barrier;\n break;\n case 'rainbow_swash_solar_farm':\n input = rainbow_swash_solar_farm;\n break;\n case 'mickey_mouse_solar_farm':\n input = mickey_mouse_solar_farm;\n break;\n case 'solar_farm_hsat_array':\n input = solar_farm_hsat_array;\n break;\n case 'solar_farm_aadat_array':\n input = solar_farm_aadat_array;\n break;\n case 'solar_trackers':\n input = solar_trackers;\n break;\n case 'nevada_solar_one_parabolic_troughs':\n input = nevada_solar_one_parabolic_troughs;\n break;\n case 'tooele_parabolic_dish_array':\n input = tooele_parabolic_dish_array;\n break;\n case 'ps10_solar_power_tower':\n input = ps10_solar_power_tower;\n break;\n case 'linear_fresnel_reflectors':\n input = linear_fresnel_reflectors;\n break;\n case 'linear_fresnel_reflectors_two_absorbers':\n input = linear_fresnel_reflectors_two_absorbers;\n break;\n case 'effect_absorber_pipe_height':\n input = effect_absorber_pipe_height;\n break;\n case 'effect_azimuth_fresnel_reflector':\n input = effect_azimuth_fresnel_reflector;\n break;\n case 'cosine_efficiency_heliostats':\n input = cosine_efficiency_heliostats;\n break;\n case 'shadowing_blocking_heliostats':\n input = shadowing_blocking_heliostats;\n break;\n case 'effect_solar_power_tower_height':\n input = effect_solar_power_tower_height;\n break;\n case 'solar_power_tower':\n input = solar_power_tower;\n break;\n case 'solar_updraft_tower':\n input = solar_updraft_tower;\n break;\n case 'solar_updraft_tower_city':\n input = solar_updraft_tower_city;\n break;\n case 'cape_cod_with_shed_dormer':\n input = cape_cod_with_shed_dormer;\n break;\n case 'mansard_roof_with_dormers':\n input = mansard_roof_with_dormers;\n break;\n case 't_shaped_house':\n input = t_shaped_house;\n break;\n case 'all_roof_types':\n input = all_roof_types;\n break;\n case 'a_frame_house':\n input = a_frame_house;\n break;\n case 'half_timbered_house':\n input = half_timbered_house;\n break;\n case 'dutch_gable_roof':\n input = dutch_gable_roof;\n break;\n case 'combination_roof_vs_bonnet_roof':\n input = combination_roof_vs_bonnet_roof;\n break;\n case 'butterfly_roof_house':\n input = butterfly_roof_house;\n break;\n case 'gable_roof_vs_hip_roof':\n input = gable_roof_vs_hip_roof;\n break;\n case 'gable_and_valley_roof':\n input = gable_and_valley_roof;\n break;\n case 'clerestory_roof':\n input = clerestory_roof;\n break;\n case 'monitor_roof':\n input = monitor_roof;\n break;\n case 'colonial_vs_saltbox':\n input = colonial_vs_saltbox;\n break;\n case 'gambrel_roof_vs_mansard_roof':\n input = gambrel_roof_vs_mansard_roof;\n break;\n case 'colonial_house':\n input = colonial_house;\n break;\n case 'dutch_colonial_house':\n input = dutch_colonial_house;\n break;\n case 'cape_cod_with_garage':\n input = cape_cod_with_garage;\n break;\n case 'greenhouse':\n input = greenhouse;\n break;\n case 'solarium':\n input = solarium;\n break;\n case 'pavilion':\n input = pavilion;\n break;\n case 'octagonal_pagoda':\n input = octagonal_pagoda;\n break;\n case 'ocean_front':\n input = ocean_front;\n break;\n case 'mosque_01':\n input = mosque_01;\n break;\n case 'church_01':\n input = church_01;\n break;\n case 'cathedral_01':\n input = cathedral_01;\n break;\n case 'cathedral_02':\n input = cathedral_02;\n break;\n case 'adobe_taos_house':\n input = adobe_taos_house;\n break;\n case 'egyptian_pyramids':\n input = egyptian_pyramids;\n break;\n case 'mayan_pyramid':\n input = mayan_pyramid;\n break;\n case 'si_o_se_pol':\n input = si_o_se_pol;\n break;\n case 'stacked_cuboids':\n input = stacked_cuboids;\n break;\n case 'barn_house':\n input = barn_house;\n break;\n case 'ranch_house':\n input = ranch_house;\n break;\n case 'bonnet_house':\n input = bonnet_house;\n break;\n case 'modern_house_01':\n input = modern_house_01;\n break;\n case 'solar_radiation_predicted_vs_measured':\n input = solar_radiation_predicted_vs_measured;\n break;\n case 'bestest_case_600':\n input = bestest_case_600;\n break;\n case 'bestest_case_610':\n input = bestest_case_610;\n break;\n case 'bestest_case_620':\n input = bestest_case_620;\n break;\n case 'bestest_case_630':\n input = bestest_case_630;\n break;\n case 'tucson_sundt_station':\n input = tucson_sundt_station;\n break;\n case 'ai_tilt_angle_one_row':\n input = ai_tilt_angle_one_row;\n break;\n case 'ai_tilt_angles_multiple_rows':\n input = ai_tilt_angles_multiple_rows;\n break;\n case 'ai_solar_farm_design':\n input = ai_solar_farm_design;\n break;\n case 'ai_solar_farm_design_block':\n input = ai_solar_farm_design_block;\n break;\n case 'ai_fitchburg_solar_farm':\n input = ai_fitchburg_solar_farm;\n break;\n }\n return input;\n};\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport CookieConsent from 'react-cookie-consent';\nimport i18n from './i18n/i18n';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\n\nconst AcceptCookie = () => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n return (\n \n {i18n.t('cookie.Statement', lang)}\n \n );\n};\n\nexport default AcceptCookie;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef } from 'react';\r\nimport { useTexture } from '@react-three/drei';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { DoubleSide, Mesh } from 'three';\r\nimport { getRoadMap, getSatelliteImage } from '../helpers';\r\nimport { Util } from '../Util';\r\nimport { ThreeEvent } from '@react-three/fiber';\r\nimport { InnerCommonStoreState } from '../stores/InnerCommonState';\r\nimport { ObjectType } from '../types';\r\nimport { UNIT_VECTOR_POS_Z } from '../constants';\r\n\r\n// The image that Google Maps API returns is 640x640. That image needs to be rescaled in such a way\r\n// that one meter in a Google Map is exactly same length as one meter in Aladdin.\r\n// I used the Morse Institute library in Natick as a reference to find the correct scale factor,\r\n// but this factor varies with latitude as Google Maps use the Mercator projection.\r\n\r\nconst NATICK_MAP_SCALE_FACTOR = 0.7;\r\nconst NATICK_LATITUDE = 42.2845513;\r\nconst MERCATOR_PROJECTION_SCALE_CONSTANT = NATICK_MAP_SCALE_FACTOR / Math.cos(Util.toRadians(NATICK_LATITUDE));\r\n\r\nconst GroundImage = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const latitude = useStore(Selector.world.latitude);\r\n const longitude = useStore(Selector.world.longitude);\r\n const mapZoom = useStore(Selector.viewState.mapZoom);\r\n const mapType = useStore(Selector.viewState.mapType);\r\n\r\n const groundImageRef = useRef();\r\n\r\n const texture = useTexture(\r\n mapType === 'satellite' || mapType === 'hybrid'\r\n ? getSatelliteImage(640, latitude, longitude, mapZoom)\r\n : getRoadMap(640, latitude, longitude, mapZoom),\r\n );\r\n\r\n let zoomScale;\r\n if (mapZoom === 21) {\r\n zoomScale = 0.5;\r\n } else if (mapZoom === 20) {\r\n zoomScale = 1;\r\n } else {\r\n zoomScale = Math.pow(2, 20 - mapZoom);\r\n }\r\n const scale = MERCATOR_PROJECTION_SCALE_CONSTANT * Math.cos(Util.toRadians(latitude)) * zoomScale;\r\n\r\n const handleContextMenu = (e: ThreeEvent) => {\r\n if (e.intersections.length > 0) {\r\n const groundImageClicked = e.intersections[0].object === groundImageRef.current;\r\n if (groundImageClicked) {\r\n setCommonStore((state) => {\r\n InnerCommonStoreState.selectNone(state);\r\n state.pastePoint.copy(e.intersections[0].point);\r\n state.clickObjectType = ObjectType.Ground;\r\n state.contextMenuObjectType = ObjectType.Ground;\r\n state.pasteNormal = UNIT_VECTOR_POS_Z;\r\n });\r\n }\r\n }\r\n };\r\n\r\n return texture ? (\r\n \r\n \r\n \r\n \r\n ) : (\r\n <>\r\n );\r\n};\r\n\r\nexport default React.memo(GroundImage);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { Checkbox, Menu } from 'antd';\r\nimport { useStore } from '../../stores/common';\r\nimport * as Selector from '../../stores/selector';\r\nimport i18n from '../../i18n/i18n';\r\nimport { Util } from '../../Util';\r\nimport { UndoableDelete } from '../../undo/UndoableDelete';\r\nimport { UndoablePaste } from '../../undo/UndoablePaste';\r\nimport { UndoableCheck } from '../../undo/UndoableCheck';\r\nimport { ActionInfo, ObjectType } from '../../types';\r\nimport { showInfo } from 'src/helpers';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\r\n\r\nexport const Paste = ({ paddingLeft = '36px', keyName }: { paddingLeft?: string; keyName: string }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const pasteElements = useStore(Selector.pasteElementsToPoint);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const isMac = Util.isMac();\r\n\r\n const paste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const pastedElements = pasteElements();\r\n if (pastedElements.length > 0) {\r\n const undoablePaste = {\r\n name: 'Paste to Point',\r\n timestamp: Date.now(),\r\n pastedElements: pastedElements.map((m) => ({ ...m })),\r\n undo: () => {\r\n for (const elem of undoablePaste.pastedElements) {\r\n removeElementById(elem.id, false);\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoablePaste.pastedElements);\r\n state.selectedElement = undoablePaste.pastedElements[0];\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n },\r\n } as UndoablePaste;\r\n addUndoable(undoablePaste);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n {i18n.t('word.Paste', { lng: language })}\r\n ({isMac ? '⌘' : 'Ctrl'}+V)\r\n \r\n );\r\n};\r\n\r\nexport const Copy = ({ paddingLeft = '36px', keyName }: { paddingLeft?: string; keyName: string }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const copyElementById = useStore(Selector.copyElementById);\r\n const selectedElement = useStore(Selector.selectedElement);\r\n const loggable = useStore(Selector.loggable);\r\n const isMac = Util.isMac();\r\n\r\n const copyElement = () => {\r\n if (selectedElement) {\r\n copyElementById(selectedElement.id);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Copy',\r\n timestamp: new Date().getTime(),\r\n elementId: selectedElement.id,\r\n elementType: selectedElement.type,\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n {i18n.t('word.Copy', { lng: language })}\r\n ({isMac ? '⌘' : 'Ctrl'}+C)\r\n \r\n );\r\n};\r\n\r\nexport const Cut = ({ paddingLeft = '36px', keyName }: { paddingLeft?: string; keyName: string }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const selectedElement = useStore(Selector.selectedElement);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const isMac = Util.isMac();\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const cut = () => {\r\n if (!selectedElement || selectedElement.type === ObjectType.Roof) return;\r\n if (selectedElement.locked) {\r\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\r\n } else {\r\n const cutElements = removeElementById(selectedElement.id, true);\r\n if (cutElements.length === 0) return;\r\n\r\n if (Util.isElementTriggerAutoDeletion(cutElements[0])) {\r\n useRefStore.getState().setListenToAutoDeletionByCut(true);\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\r\n } else {\r\n const undoableCut = {\r\n name: 'Cut',\r\n timestamp: Date.now(),\r\n deletedElements: cutElements,\r\n selectedElementId: selectedElement.id,\r\n undo: () => {\r\n const cutElements = undoableCut.deletedElements;\r\n if (cutElements.length === 0) return;\r\n\r\n const selectedElement = cutElements.find((e) => e.id === undoableCut.selectedElementId);\r\n if (!selectedElement) return;\r\n\r\n setCommonStore((state) => {\r\n for (const e of cutElements) {\r\n state.elements.push(e);\r\n }\r\n if (selectedElement.type === ObjectType.Wall) {\r\n const wall = selectedElement as WallModel;\r\n let leftWallId: string | null = null;\r\n let rightWallId: string | null = null;\r\n if (wall.leftJoints.length > 0) {\r\n leftWallId = wall.leftJoints[0];\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n rightWallId = wall.rightJoints[0];\r\n }\r\n if (leftWallId || rightWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).rightJoints[0] = wall.id;\r\n }\r\n if (e.id === rightWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).leftJoints[0] = wall.id;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n redo: () => {\r\n if (undoableCut.deletedElements && undoableCut.deletedElements.length > 0) {\r\n removeElementById(undoableCut.deletedElements[0].id, true);\r\n }\r\n },\r\n } as UndoableDelete;\r\n addUndoable(undoableCut);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n {i18n.t('word.Cut', { lng: language })}\r\n ({isMac ? '⌘' : 'Ctrl'}+X)\r\n \r\n );\r\n};\r\n\r\nexport const Lock = ({ keyName }: { keyName: string }) => {\r\n const language = useStore(Selector.language);\r\n const updateElementLockById = useStore(Selector.updateElementLockById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const selectedElement = useStore((state) => state.elements.find((e) => state.selectedElementIdSet.has(e.id)));\r\n\r\n const lockElement = (on: boolean) => {\r\n if (selectedElement) {\r\n updateElementLockById(selectedElement.id, on);\r\n }\r\n };\r\n\r\n return (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Lock',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: selectedElement?.id,\r\n selectedElementType: selectedElement?.type,\r\n undo: () => {\r\n lockElement(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n lockElement(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n lockElement(checked);\r\n }}\r\n >\r\n {i18n.t('word.Lock', { lng: language })}\r\n \r\n \r\n );\r\n};\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { ElementModel } from '../../../models/ElementModel';\r\nimport { useEffect, useState } from 'react';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { ObjectType } from 'src/types';\r\nimport { ColorResult } from 'react-color';\r\n\r\nexport const useLabel = (element: ElementModel | undefined) => {\r\n const [labelText, setLabelText] = useState(element?.label ?? '');\r\n useEffect(() => {\r\n if (element?.label) {\r\n setLabelText(element.label);\r\n }\r\n }, [element?.id]);\r\n return { labelText, setLabelText };\r\n};\r\n\r\nexport const useLabelShow = (element: ElementModel | undefined) => {\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const updateElementShowLabelById = useStore(Selector.updateElementShowLabelById);\r\n\r\n return () => {\r\n if (element) {\r\n const undoableCheck = {\r\n name: 'Show Label for ' + element.type,\r\n timestamp: Date.now(),\r\n checked: !element.showLabel,\r\n selectedElementId: element.id,\r\n selectedElementType: element.type,\r\n undo: () => {\r\n updateElementShowLabelById(element.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateElementShowLabelById(element.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateElementShowLabelById(element.id, !element.showLabel);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelText = (element: ElementModel | undefined, labelText: string) => {\r\n const updateElementLabelById = useStore(Selector.updateElementLabelById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n return () => {\r\n if (element) {\r\n const oldLabel = element.label;\r\n const undoableChange = {\r\n name: 'Set Label for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldLabel,\r\n newValue: labelText,\r\n changedElementId: element.id,\r\n changedElementType: element.type,\r\n undo: () => {\r\n updateElementLabelById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateElementLabelById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLabelById(element.id, labelText);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelFontSize = (element: ElementModel | undefined) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const updateFontSize = (value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === element?.id) {\r\n e.labelFontSize = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (value: number) => {\r\n if (element) {\r\n const oldSize = element.labelFontSize ?? 20;\r\n const newSize = value;\r\n const undoableChange = {\r\n name: 'Set Label Font Size for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldSize,\r\n newValue: newSize,\r\n undo: () => {\r\n updateFontSize(undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFontSize(undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontSize(newSize);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelSize = (element: ElementModel | undefined) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const updateLabelSize = (value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === element?.id) {\r\n e.labelSize = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (value: number) => {\r\n if (element) {\r\n const oldSize = element.labelSize ?? 0.2;\r\n const newSize = value;\r\n const undoableChange = {\r\n name: 'Set Label Size for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldSize,\r\n newValue: newSize,\r\n undo: () => {\r\n updateLabelSize(undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLabelSize(undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLabelSize(newSize);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelColor = (element: ElementModel | undefined) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const updateLabelColor = (value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === element?.id) {\r\n e.labelColor = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (value: string) => {\r\n if (element) {\r\n const oldColor = element.labelColor ?? 'white';\r\n const newColor = value;\r\n const undoableChange = {\r\n name: 'Set Label Color for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: newColor,\r\n undo: () => {\r\n updateLabelColor(undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateLabelColor(undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLabelColor(newColor as string);\r\n }\r\n };\r\n};\r\n\r\nexport const useLabelHeight = (element: ElementModel | undefined) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const updateLabelHeight = (value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === element?.id) {\r\n e.labelHeight = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (value: number) => {\r\n if (element) {\r\n const oldHeight = element.labelHeight ?? element.lz / 2 + 0.2;\r\n const newHeight = value;\r\n const undoableChange = {\r\n name: 'Set Label Height for ' + element.type,\r\n timestamp: Date.now(),\r\n oldValue: oldHeight,\r\n newValue: newHeight,\r\n undo: () => {\r\n updateLabelHeight(undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLabelHeight(undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLabelHeight(newHeight);\r\n }\r\n };\r\n};\r\n\r\nexport const useSelectedElement = (objectType: ObjectType) => {\r\n const element = useStore((state) => {\r\n if (!state.selectedElement) return;\r\n return state.elements.find((e) => e.id === state.selectedElement?.id && e.type === objectType);\r\n });\r\n return element;\r\n};\r\n\r\nexport const useColorPicker = (color: string) => {\r\n const [selectedColor, setSelectedColor] = useState(color);\r\n const onColorChange = (colorResult: ColorResult) => {\r\n setSelectedColor(colorResult.hex);\r\n };\r\n return [selectedColor, onColorChange] as [string, (colorResult: ColorResult) => void];\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { Button, Modal } from 'antd';\r\nimport { useRef, useState } from 'react';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from '../../stores/selector';\r\n\r\ninterface DialogProps {\r\n width: number;\r\n title: string;\r\n rejectedMessage?: string | null;\r\n onApply: () => void;\r\n onClose: () => void; // this must be specified for the x button in the upper-right corner to work\r\n onClickOk?: () => void;\r\n onClickCancel?: () => void;\r\n}\r\n\r\nconst Dialog: React.FC = ({\r\n width,\r\n title,\r\n rejectedMessage,\r\n onApply,\r\n onClose,\r\n onClickOk,\r\n onClickCancel,\r\n children,\r\n}) => {\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const lang = useLanguage();\r\n\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n\r\n const dragRef = useRef(null);\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const handleClickOk = () => {\r\n if (onClickOk) {\r\n onClickOk();\r\n } else {\r\n onApply();\r\n onClose();\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const handleClickCancel = () => {\r\n if (onClickCancel) {\r\n onClickCancel();\r\n } else {\r\n onClose();\r\n revertApply();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Enter') {\r\n handleClickOk();\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [handleClickOk]);\r\n\r\n const showRejectMessage = !!rejectedMessage && rejectedMessage.length > 0;\r\n\r\n return (\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {title}\r\n {showRejectMessage && {rejectedMessage}}\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={onClose}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default Dialog;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { CompactPicker } from 'react-color';\r\n\r\nconst FoundationColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const updateElementColorById = useStore(Selector.updateElementColorById);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementColorForAll = useStore(Selector.updateElementColorForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(foundation?.color ?? '#808080');\r\n\r\n const lang = useLanguage();\r\n\r\n const needChange = (color: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (color !== f.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of useStore.getState().elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (color !== f.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== foundation?.color) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value?: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.color = value;\r\n } else {\r\n const color = map.get(e.id);\r\n if (color !== undefined) {\r\n e.color = color;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColor = (value: string) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, elem.color ?? '#808080');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n updateInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(useStore.getState().applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n const oldColorsAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldColorsAll.set(elem.id, elem.color ?? '#808080');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAll.oldValues.entries()) {\r\n updateElementColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateElementColorForAll(ObjectType.Foundation, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementColorForAll(ObjectType.Foundation, value);\r\n setApplyCount(useStore.getState().applyCount + 1);\r\n break;\r\n default:\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldColor = f ? f.color : foundation.color;\r\n const undoableChange = {\r\n name: 'Set Color of Selected Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateElementColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateElementColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementColorById(foundation.id, value);\r\n setApplyCount(useStore.getState().applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.foundationColor = value;\r\n });\r\n };\r\n\r\n const apply = () => {\r\n updateColor(selectedColor);\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FoundationColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableSizeGroupChange } from 'src/undo/UndoableSizeGroupChange';\r\nimport { UndoableSizeChange } from 'src/undo/UndoableSizeChange';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { PolygonModel } from 'src/models/PolygonModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst FoundationLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementCxById = useStore(Selector.updateElementCxById);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLxForAll = useStore(Selector.updateElementLxForAll);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const getChildren = useStore(Selector.getChildren);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setCommonStore = useStore(Selector.set);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.lx ?? 0.1);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const denormalizedPosMapRef = useRef>(new Map()); // not absolute position, just denormalized\r\n const oldChildrenVerticesMapRef = useRef>(new Map()); // Point2 is used to store vertices\r\n const newChildrenVerticesMapRef = useRef>(new Map());\r\n const denormalizedVerticesMapRef = useRef>(new Map()); // use Vector2's rotation function\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = { lng: language };\r\n\r\n const containsAllChildren = (lx: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n const children = getChildren(f.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(f, children, lx, f.ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n const children = getChildren(f.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(f, children, lx, f.ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const children = getChildren(foundation.id);\r\n if (children.length > 0) {\r\n return Util.doesNewSizeContainAllChildren(foundation, children, lx, foundation.ly);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const rejectChange = (lx: number) => {\r\n // check if the new length will still contain all children of the foundations in the selected scope\r\n if (!containsAllChildren(lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(foundation?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === curr.id) {\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector2(e.cx, e.cy)\r\n .rotateAround(ORIGIN_VECTOR2, parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const updateLxWithChildren = (parent: FoundationModel, value: number) => {\r\n // store children's relative positions\r\n const children = getChildren(parent.id);\r\n const azimuth = parent.rotation[2];\r\n denormalizedPosMapRef.current.clear(); // this map is for one-time use with each foundation\r\n denormalizedVerticesMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const p = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth);\r\n denormalizedPosMapRef.current.set(c.id, p);\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy));\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = c as PolygonModel;\r\n const arr: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n arr.push(new Vector2(v.x * parent.lx, v.y * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth));\r\n }\r\n denormalizedVerticesMapRef.current.set(c.id, arr);\r\n oldChildrenVerticesMapRef.current.set(\r\n c.id,\r\n polygon.vertices.map((v) => ({ ...v })),\r\n );\r\n break;\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n break;\r\n }\r\n }\r\n }\r\n // update foundation's length\r\n updateElementLxById(parent.id, value);\r\n // update children's relative positions\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n // TODO\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const p = denormalizedPosMapRef.current.get(c.id);\r\n if (p) {\r\n const relativePos = new Vector2(p.x, p.y).rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newCx = relativePos.x / value;\r\n updateElementCxById(c.id, newCx);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(newCx, c.cy));\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const arr = denormalizedVerticesMapRef.current.get(c.id);\r\n if (arr) {\r\n const newVertices: Point2[] = [];\r\n for (const v of arr) {\r\n const relativePos = v.rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newX = relativePos.x / value;\r\n const newY = relativePos.y / parent.ly;\r\n newVertices.push({ x: newX, y: newY } as Point2);\r\n }\r\n updatePolygonVerticesById(c.id, newVertices);\r\n newChildrenVerticesMapRef.current.set(\r\n c.id,\r\n newVertices.map((v) => ({ ...v })),\r\n );\r\n }\r\n break;\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n oldChildrenParentIdMapRef.current.set(c.id, parent.id);\r\n // top, north, south face\r\n if (\r\n Math.abs(c.cz - parent.lz / 2) < ZERO_TOLERANCE ||\r\n Math.abs(Math.abs(c.cy) - parent.ly / 2) < ZERO_TOLERANCE\r\n ) {\r\n // check fall off\r\n if (Math.abs(c.cx) - value / 2 > 0) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, c);\r\n }\r\n }\r\n // west and east face\r\n else if (Math.abs(Math.abs(c.cx) - parent.lx / 2) < ZERO_TOLERANCE) {\r\n const newCx = (c.cx > 0 ? value : -value) / 2;\r\n updateElementCxById(c.id, newCx);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(newCx, c.cy, c.cz));\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLxInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.lx = value;\r\n } else {\r\n const lx = map.get(e.id);\r\n if (lx !== undefined) {\r\n e.lx = lx;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLx = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldLx = f ? f.lx : foundation.lx;\r\n rejectedValue.current = undefined;\r\n rejectRef.current = rejectChange(value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLx);\r\n } else {\r\n oldChildrenPositionsMapRef.current.clear();\r\n newChildrenPositionsMapRef.current.clear();\r\n oldChildrenVerticesMapRef.current.clear();\r\n newChildrenVerticesMapRef.current.clear();\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLxsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLxsSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n updateLxWithChildren(elem as FoundationModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsSelected,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateLxInMap(undoableChangeAll.oldSizes as Map);\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateLxInMap(undoableChangeAll.oldSizes as Map, undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n const oldLxsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldLxsAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n updateLxWithChildren(elem as FoundationModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Foundations',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLxById(id, lx as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLxForAll(ObjectType.Foundation, undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n default:\r\n updateLxWithChildren(foundation, value);\r\n const undoableChange = {\r\n name: 'Set Foundation Length',\r\n timestamp: Date.now(),\r\n oldSize: oldLx,\r\n newSize: value,\r\n resizedElementId: foundation.id,\r\n resizedElementType: foundation.type,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateElementLxById(foundation.id, undoableChange.oldSize as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.oldChildrenVerticesMap && undoableChange.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLxById(foundation.id, undoableChange.newSize as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, p] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, p.x, p.y, p.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.newChildrenVerticesMap && undoableChange.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLx(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLx(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FoundationLengthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { Util } from 'src/Util';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { UndoableSizeChange } from 'src/undo/UndoableSizeChange';\r\nimport { UndoableSizeGroupChange } from 'src/undo/UndoableSizeGroupChange';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { PolygonModel } from 'src/models/PolygonModel';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FoundationWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const updateElementCyById = useStore(Selector.updateElementCyById);\r\n const updateElementLyById = useStore(Selector.updateElementLyById);\r\n const updateElementLyForAll = useStore(Selector.updateElementLyForAll);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const getChildren = useStore(Selector.getChildren);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setCommonStore = useStore(Selector.set);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.ly ?? 0.1);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const denormalizedPositionMapRef = useRef>(new Map()); // not absolute position, just denormalized\r\n const oldChildrenVerticesMapRef = useRef>(new Map()); // Point2 is used to store vertices\r\n const newChildrenVerticesMapRef = useRef>(new Map());\r\n const denormalizedVerticesMapRef = useRef>(new Map()); // use Vector2's rotation function\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const containsAllChildren = (ly: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n const children = getChildren(f.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(f, children, f.lx, ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n const children = getChildren(f.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(f, children, f.lx, ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const children = getChildren(foundation.id);\r\n if (children.length > 0) {\r\n return Util.doesNewSizeContainAllChildren(foundation, children, foundation.lx, ly);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const rejectChange = (ly: number) => {\r\n // check if the new width will still contain all children of the foundations in the selected scope\r\n if (!containsAllChildren(ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!foundation) return;\r\n\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(foundation?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === curr.id) {\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector2(e.cx, e.cy)\r\n .rotateAround(ORIGIN_VECTOR2, parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const updateLyWithChildren = (parent: FoundationModel, value: number) => {\r\n // store children's relative positions\r\n const children = getChildren(parent.id);\r\n const azimuth = parent.rotation[2];\r\n denormalizedPositionMapRef.current.clear(); // this map is for one-time use with each foundation\r\n denormalizedVerticesMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n // TODO\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const p = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth);\r\n denormalizedPositionMapRef.current.set(c.id, p);\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy));\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = c as PolygonModel;\r\n const arr: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n arr.push(new Vector2(v.x * parent.lx, v.y * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth));\r\n }\r\n denormalizedVerticesMapRef.current.set(c.id, arr);\r\n oldChildrenVerticesMapRef.current.set(\r\n c.id,\r\n polygon.vertices.map((v) => ({ ...v })),\r\n );\r\n break;\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n break;\r\n }\r\n }\r\n }\r\n // update foundation's width\r\n updateElementLyById(parent.id, value);\r\n // update children's relative positions\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n switch (c.type) {\r\n case ObjectType.Wall:\r\n // TODO\r\n break;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.Sensor:\r\n const p = denormalizedPositionMapRef.current.get(c.id);\r\n if (p) {\r\n const relativePos = new Vector2(p.x, p.y).rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newCy = relativePos.y / value;\r\n updateElementCyById(c.id, newCy);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, newCy));\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const arr = denormalizedVerticesMapRef.current.get(c.id);\r\n if (arr) {\r\n const newVertices: Point2[] = [];\r\n for (const v of arr) {\r\n const relativePos = v.rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newX = relativePos.x / parent.lx;\r\n const newY = relativePos.y / value;\r\n newVertices.push({ x: newX, y: newY } as Point2);\r\n }\r\n updatePolygonVerticesById(c.id, newVertices);\r\n newChildrenVerticesMapRef.current.set(\r\n c.id,\r\n newVertices.map((v) => ({ ...v })),\r\n );\r\n }\r\n break;\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n oldChildrenParentIdMapRef.current.set(c.id, parent.id);\r\n // top, north, south face\r\n if (\r\n Math.abs(c.cz - parent.lz / 2) < ZERO_TOLERANCE ||\r\n Math.abs(Math.abs(c.cx) - parent.lx / 2) < ZERO_TOLERANCE\r\n ) {\r\n // check fall off\r\n if (Math.abs(c.cy) - value / 2 > 0) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, c);\r\n }\r\n }\r\n // north and south face\r\n else if (Math.abs(Math.abs(c.cy) - parent.ly / 2) < ZERO_TOLERANCE) {\r\n const newCy = (c.cy > 0 ? value : -value) / 2;\r\n updateElementCyById(c.id, newCy);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cz, newCy, c.cz));\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLy = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldLy = f ? f.ly : foundation.ly;\r\n rejectedValue.current = undefined;\r\n rejectRef.current = rejectChange(value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLy);\r\n } else {\r\n oldChildrenPositionsMapRef.current.clear();\r\n newChildrenPositionsMapRef.current.clear();\r\n oldChildrenVerticesMapRef.current.clear();\r\n newChildrenVerticesMapRef.current.clear();\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLysSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLysSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n updateLyWithChildren(elem as FoundationModel, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysSelected,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenVerticesMap &&\r\n undoableChangeSelected.oldChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLyById(id, undoableChangeSelected.newSize as number);\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenVerticesMap &&\r\n undoableChangeSelected.newChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLysAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldLysAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n updateLyWithChildren(elem as FoundationModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Foundations',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLyForAll(ObjectType.Foundation, undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n updateLyWithChildren(foundation, value);\r\n const undoableChange = {\r\n name: 'Set Foundation Width',\r\n timestamp: Date.now(),\r\n oldSize: oldLy,\r\n newSize: value,\r\n resizedElementId: foundation.id,\r\n resizedElementType: foundation.type,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateElementLyById(foundation.id, undoableChange.oldSize as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.oldChildrenVerticesMap && undoableChange.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLyById(foundation.id, undoableChange.newSize as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.newChildrenVerticesMap && undoableChange.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n updateLy(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n updateLy(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FoundationWidthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FoundationHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.lz ?? 0.1);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n\r\n const lang = useLanguage();\r\n\r\n const updateLzAndCzById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n const el = state.elements.find((e) => e.id === id);\r\n if (!el) return;\r\n el.lz = value;\r\n el.cz = value / 2;\r\n });\r\n };\r\n\r\n const updateLzAndCzForAll = (type: ObjectType, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === type && !e.locked) {\r\n e.lz = value;\r\n e.cz = value / 2;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (lz: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(f.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(foundation?.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n curr.parentId = GROUND_ID;\r\n const absPos = new Vector2(curr.cx, curr.cy)\r\n .rotateAround(ORIGIN_VECTOR2, -parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n curr.cx = absPos.x;\r\n curr.cy = absPos.y;\r\n curr.cz = 0;\r\n newChildrenPositionsMapRef.current.set(curr.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(curr.id, GROUND_ID);\r\n }\r\n };\r\n\r\n const updateCzOfChildren = (parent: ElementModel, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === parent.id) {\r\n oldChildrenParentIdMapRef.current.set(e.id, parent.id);\r\n oldChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, e.cz));\r\n if (Util.isPlantOrHuman(e)) {\r\n // top face\r\n if (Math.abs(e.cz - parent.lz / 2) < ZERO_TOLERANCE) {\r\n e.cz = value / 2;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, value / 2));\r\n }\r\n // side faces\r\n else {\r\n // check fall off\r\n const newRelZ = e.cz + parent.cz - value / 2;\r\n if (Math.abs(newRelZ) > value / 2) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, e);\r\n } else {\r\n e.cz = newRelZ;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, newRelZ));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLzAndCzInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.lz = value;\r\n e.cz = value / 2;\r\n } else {\r\n const lz = map.get(e.id);\r\n if (lz !== undefined) {\r\n e.lz = lz;\r\n e.cz = lz / 2;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLz = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLzsSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Foundation &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldLzsSelected.set(elem.id, elem.lz);\r\n }\r\n }\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Foundation &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsSelected,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateLzAndCzInMap(undoableChangeSelected.oldValues as Map);\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newLz = undoableChangeSelected.newValue as number;\r\n updateLzAndCzInMap(undoableChangeSelected.oldValues as Map, newLz);\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateLzAndCzInMap(oldLzsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n const oldLzsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldLzsAll.set(elem.id, elem.lz);\r\n }\r\n }\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsAll,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lz] of undoableChangeAll.oldValues.entries()) {\r\n updateLzAndCzById(id, lz as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newLz = undoableChangeAll.newValue as number;\r\n updateLzAndCzForAll(ObjectType.Foundation, newLz);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLzAndCzForAll(ObjectType.Foundation, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n default:\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldLz = f ? f.lz : foundation.lz;\r\n updateCzOfChildren(foundation, value);\r\n updateLzAndCzById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Foundation Height',\r\n timestamp: Date.now(),\r\n oldValue: oldLz,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateLzAndCzById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateLzAndCzById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.foundationHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setLz(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(value);\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default FoundationHeightInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FoundationAzimuthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementRotationById = useStore(Selector.updateElementRotationById);\r\n const updateElementRotationForAll = useStore(Selector.updateElementRotationForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n // reverse the sign because rotation angle is positive counterclockwise whereas azimuth is positive clockwise\r\n const [inputValue, setInputValue] = useState(foundation ? -foundation?.rotation[2] ?? 0 : 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const needChange = (azimuth: number) => {\r\n if (!foundation) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(-f.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (Math.abs(-f.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(-foundation?.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.rotation[2] = value;\r\n } else {\r\n const rot = map.get(e.id);\r\n if (rot !== undefined) {\r\n e.rotation[2] = -rot;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAzimuth = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldAzimuthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldAzimuthsSelected.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Azimuth for All Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, -undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateInMap(oldAzimuthsSelected, -value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType:\r\n const oldAzimuthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldAzimuthsAll.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Azimuth for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, az] of undoableChangeAll.oldValues.entries()) {\r\n updateElementRotationById(id, 0, 0, -(az as number));\r\n }\r\n },\r\n redo: () => {\r\n updateElementRotationForAll(ObjectType.Foundation, 0, 0, -(undoableChangeAll.newValue as number));\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementRotationForAll(ObjectType.Foundation, 0, 0, -value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n default:\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id);\r\n const oldAzimuth = f ? -f.rotation[2] : -foundation.rotation[2];\r\n const undoableChange = {\r\n name: 'Set Foundation Azimuth',\r\n timestamp: Date.now(),\r\n oldValue: oldAzimuth,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateElementRotationById(undoableChange.changedElementId, 0, 0, -(undoableChange.oldValue as number));\r\n },\r\n redo: () => {\r\n updateElementRotationById(undoableChange.changedElementId, 0, 0, -(undoableChange.newValue as number));\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementRotationById(foundation.id, 0, 0, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateAzimuth(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n `${value}°`}\r\n onChange={(value) => {\r\n setInputValue(Util.toRadians(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [-180°, 180°]\r\n
\r\n {i18n.t('message.AzimuthOfNorthIsZero', lang)}\r\n
\r\n {i18n.t('message.CounterclockwiseAzimuthIsPositive', lang)}\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default FoundationAzimuthInput;\r\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/foundation_03_menu.1a0820a4.png\";","export default __webpack_public_path__ + \"static/media/foundation_04_menu.cfdf351d.png\";","export default __webpack_public_path__ + \"static/media/foundation_05_menu.7f382511.png\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/foundation_07_menu.cf056d65.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport Foundation_Texture_01_Menu from '../../../resources/foundation_01_menu.png';\r\nimport Foundation_Texture_02_Menu from '../../../resources/foundation_02_menu.png';\r\nimport Foundation_Texture_03_Menu from '../../../resources/foundation_03_menu.png';\r\nimport Foundation_Texture_04_Menu from '../../../resources/foundation_04_menu.png';\r\nimport Foundation_Texture_05_Menu from '../../../resources/foundation_05_menu.png';\r\nimport Foundation_Texture_06_Menu from '../../../resources/foundation_06_menu.png';\r\nimport Foundation_Texture_07_Menu from '../../../resources/foundation_07_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FoundationTexture, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FoundationTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(foundation?.textureType ?? FoundationTexture.NoTexture);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateFoundationTextureById = (id: string, texture: FoundationTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n (e as FoundationModel).textureType = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFoundationTextureForAll = (texture: FoundationTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n (e as FoundationModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (texture: FoundationTexture) => {\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (texture !== f.textureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (texture !== f.textureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (texture !== foundation?.textureType) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateTextureInMap = (map: Map, value?: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && map.has(e.id)) {\r\n if (value !== undefined) {\r\n (e as FoundationModel).textureType = value as FoundationTexture;\r\n } else {\r\n const texture = map.get(e.id);\r\n if (texture !== undefined) {\r\n (e as FoundationModel).textureType = texture as FoundationTexture;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTexture = (value: FoundationTexture) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTexturesSelected.set(elem.id, (elem as FoundationModel).textureType ?? FoundationTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n updateTextureInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeAll.oldValues as Map,\r\n undoableChangeAll.newValue as FoundationTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateTextureInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n oldTexturesAll.set(elem.id, (elem as FoundationModel).textureType ?? FoundationTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeAll.oldValues.entries()) {\r\n updateFoundationTextureById(id, texture as FoundationTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateFoundationTextureForAll(undoableChangeAll.newValue as FoundationTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateFoundationTextureForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation via selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldTexture = f ? f.textureType : foundation.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateFoundationTextureById(undoableChange.changedElementId, undoableChange.oldValue as FoundationTexture);\r\n },\r\n redo: () => {\r\n updateFoundationTextureById(undoableChange.changedElementId, undoableChange.newValue as FoundationTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFoundationTextureById(foundation.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.foundationTexture = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FoundationTextureSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipeHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.absorberHeight ?? 10);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberHeight = height;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberHeight = height;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberHeight = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (absorberHeight: number) => {\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberHeight === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberHeight - absorberHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberHeight === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberHeight - absorberHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.absorberHeight === undefined ||\r\n Math.abs(absorberPipe?.absorberHeight - absorberHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setAbsorberHeight = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.absorberHeight ?? 10);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ah] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ah as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.absorberHeight ?? 10);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ah] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ah as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe ? f.solarAbsorberPipe.absorberHeight ?? 10 : absorberPipe.absorberHeight ?? 10;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Height on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAbsorberHeight(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 50] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipeAbsorptanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.absorberAbsorptance ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, absorptance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberAbsorptance = absorptance;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (absorptance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberAbsorptance = absorptance;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberAbsorptance = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (absorptance: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberAbsorptance === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberAbsorptance === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.absorberAbsorptance === undefined ||\r\n Math.abs(absorberPipe?.absorberAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateAbsorptance = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.absorberAbsorptance ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Pipe Absorptance for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.absorberAbsorptance ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Pipe Absorptance for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe\r\n ? f.solarAbsorberPipe.absorberAbsorptance ?? 0.95\r\n : absorberPipe.absorberAbsorptance ?? 0.95;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Pipe Absorptance on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateAbsorptance(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeAbsorptanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarAbsorberPipeOpticalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.absorberOpticalEfficiency ?? 0.7);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberOpticalEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberOpticalEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberOpticalEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberOpticalEfficiency === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberOpticalEfficiency === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.absorberOpticalEfficiency === undefined ||\r\n Math.abs(absorberPipe?.absorberOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setOpticalEfficiency = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.absorberOpticalEfficiency ?? 0.7);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Optical Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, oe] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, oe as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.absorberOpticalEfficiency ?? 0.7);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Optical Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, oe] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, oe as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe\r\n ? f.solarAbsorberPipe.absorberOpticalEfficiency ?? 0.7\r\n : absorberPipe.absorberOpticalEfficiency ?? 0.7;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Optical Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setOpticalEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeOpticalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipeThermalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.absorberThermalEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberThermalEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberThermalEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.absorberThermalEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberThermalEfficiency === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.absorberThermalEfficiency === undefined ||\r\n Math.abs(f.solarAbsorberPipe.absorberThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.absorberThermalEfficiency === undefined ||\r\n Math.abs(absorberPipe?.absorberThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setThermalEfficiency = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.absorberThermalEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Thermal Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, te] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, te as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.absorberThermalEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Thermal Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, te] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, te as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe\r\n ? f.solarAbsorberPipe.absorberThermalEfficiency ?? 0.3\r\n : absorberPipe.absorberThermalEfficiency ?? 0.3;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Thermal Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThermalEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeThermalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipeApertureWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.apertureWidth ?? 0.6);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, apertureWidth: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.apertureWidth = apertureWidth;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (apertureWidth: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.apertureWidth = apertureWidth;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.apertureWidth = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (apertureWidth: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.apertureWidth === undefined ||\r\n Math.abs(f.solarAbsorberPipe.apertureWidth - apertureWidth) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (\r\n f.solarAbsorberPipe.apertureWidth === undefined ||\r\n Math.abs(f.solarAbsorberPipe.apertureWidth - apertureWidth) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n absorberPipe?.apertureWidth === undefined ||\r\n Math.abs(absorberPipe?.apertureWidth - apertureWidth) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateApertureWidth = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValues = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValues.set(elem.id, f.solarAbsorberPipe.apertureWidth ?? 0.6);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Aperture Width for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, aw] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, aw as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValues, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValues = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValues.set(elem.id, f.solarAbsorberPipe.apertureWidth ?? 0.6);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Aperture Width for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, aw] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, aw as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarAbsorberPipe ? f.solarAbsorberPipe.apertureWidth ?? 0.6 : absorberPipe.apertureWidth ?? 0.6;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Aperture Width on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateApertureWidth(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 2] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipeApertureWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { SolarAbsorberPipeModel } from '../../../models/SolarAbsorberPipeModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarAbsorberPipePoleNumberInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const absorberPipe = foundation?.solarAbsorberPipe;\r\n\r\n const [inputValue, setInputValue] = useState(absorberPipe?.poleNumber ?? 5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, poleNumber: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.poleNumber = poleNumber;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (poleNumber: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.poleNumber = poleNumber;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n if (!f.solarAbsorberPipe) f.solarAbsorberPipe = {} as SolarAbsorberPipeModel;\r\n f.solarAbsorberPipe.poleNumber = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (f.solarAbsorberPipe.poleNumber === undefined || f.solarAbsorberPipe.poleNumber !== value) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe && f.solarAbsorberPipe) {\r\n if (f.solarAbsorberPipe.poleNumber === undefined || f.solarAbsorberPipe.poleNumber !== value) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (absorberPipe?.poleNumber === undefined || absorberPipe?.poleNumber !== value) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setPoleNumber = (value: number) => {\r\n if (!foundation || !absorberPipe) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesSelected.set(elem.id, f.solarAbsorberPipe.poleNumber ?? 5);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorber Pipe Pole Number for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, pn] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, pn as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarAbsorberPipe) {\r\n oldValuesAll.set(elem.id, f.solarAbsorberPipe.poleNumber ?? 5);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorber Pipe Pole Number for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, pn] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, pn as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue = f && f.solarAbsorberPipe ? f.solarAbsorberPipe.poleNumber ?? 5 : absorberPipe.poleNumber ?? 5;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Absorber Pipe Pole Number on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPoleNumber(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 100]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarAbsorberPipePoleNumberInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerChimneyHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const [inputValue, setInputValue] = useState(\r\n foundation?.solarUpdraftTower?.chimneyHeight ?? Math.max(foundation?.lx ?? 0, foundation?.ly ?? 0),\r\n );\r\n\r\n const lang = useLanguage();\r\n\r\n const updateChimneyHeightById = (id: string, height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyHeight = height;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateChimneyHeightForAll = (height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyHeight = height;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyHeight = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (chimneyHeight: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.chimneyHeight === undefined ||\r\n Math.abs(f.solarUpdraftTower.chimneyHeight - chimneyHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.chimneyHeight === undefined ||\r\n Math.abs(f.solarUpdraftTower.chimneyHeight - chimneyHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.chimneyHeight === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.chimneyHeight - chimneyHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setChimneyHeight = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower?.chimneyHeight ?? Math.max(f.lx, f.ly));\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Chimney Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ch] of undoableChangeSelected.oldValues.entries()) {\r\n updateChimneyHeightById(id, ch as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower?.chimneyHeight ?? Math.max(f.lx, f.ly));\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Chimney Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ch] of undoableChangeAll.oldValues.entries()) {\r\n updateChimneyHeightById(id, ch as number);\r\n }\r\n },\r\n redo: () => {\r\n updateChimneyHeightForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateChimneyHeightForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.chimneyHeight ?? Math.max(f.lx, f.ly)\r\n : foundation.solarUpdraftTower.chimneyHeight ?? Math.max(foundation.lx, foundation.ly);\r\n updateChimneyHeightById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Chimney Height on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateChimneyHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateChimneyHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setChimneyHeight(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerChimneyHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerChimneyRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(\r\n foundation?.solarUpdraftTower?.chimneyRadius ??\r\n Math.max(1, 0.025 * Math.min(foundation?.lx ?? 0, foundation?.ly ?? 0)),\r\n );\r\n\r\n const lang = useLanguage();\r\n\r\n const updateChimneyRadiusById = (id: string, radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyRadius = radius;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateChimneyRadiusForAll = (radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyRadius = radius;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.chimneyRadius = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (chimneyRadius: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.chimneyRadius === undefined ||\r\n Math.abs(f.solarUpdraftTower.chimneyRadius - chimneyRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.chimneyRadius === undefined ||\r\n Math.abs(f.solarUpdraftTower.chimneyRadius - chimneyRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.chimneyRadius === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.chimneyRadius - chimneyRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setChimneyRadius = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(\r\n elem.id,\r\n f.solarUpdraftTower?.chimneyRadius ?? Math.max(1, 0.025 * Math.min(f.lx, f.ly)),\r\n );\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Chimney Radius for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, cr] of undoableChangeSelected.oldValues.entries()) {\r\n updateChimneyRadiusById(id, cr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(\r\n elem.id,\r\n f.solarUpdraftTower?.chimneyRadius ?? Math.max(1, 0.025 * Math.min(f.lx, f.ly)),\r\n );\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Chimney Radius for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, cr] of undoableChangeAll.oldValues.entries()) {\r\n updateChimneyRadiusById(id, cr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateChimneyRadiusForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateChimneyRadiusForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.chimneyRadius ?? Math.max(1, 0.025 * Math.min(f.lx, f.ly))\r\n : foundation.solarUpdraftTower.chimneyRadius ??\r\n Math.max(1, 0.025 * Math.min(foundation.lx, foundation.ly));\r\n updateChimneyRadiusById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Chimney Radius on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateChimneyRadiusById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateChimneyRadiusById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setChimneyRadius(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerChimneyRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerCollectorRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(\r\n foundation?.solarUpdraftTower?.collectorRadius ??\r\n Math.max(10, 0.5 * Math.min(foundation?.lx ?? 0, foundation?.ly ?? 0)),\r\n );\r\n\r\n const lang = useLanguage();\r\n\r\n const updateCollectorRadiusById = (id: string, radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorRadius = radius;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCollectorRadiusForAll = (radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorRadius = radius;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorRadius = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (collectorRadius: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorRadius === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorRadius - collectorRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorRadius === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorRadius - collectorRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.collectorRadius === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.collectorRadius - collectorRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setCollectorRadius = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(\r\n elem.id,\r\n f.solarUpdraftTower.collectorRadius ?? Math.max(10, 0.5 * Math.min(f.lx, f.ly)),\r\n );\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Collector Radius for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, cr] of undoableChangeSelected.oldValues.entries()) {\r\n updateCollectorRadiusById(id, cr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(\r\n elem.id,\r\n f.solarUpdraftTower.collectorRadius ?? Math.max(10, 0.5 * Math.min(f.lx, f.ly)),\r\n );\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Collector Radius for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, cr] of undoableChangeAll.oldValues.entries()) {\r\n updateCollectorRadiusById(id, cr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateCollectorRadiusForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateCollectorRadiusForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.collectorRadius ?? Math.max(10, 0.5 * Math.min(f.lx, f.ly))\r\n : foundation.solarUpdraftTower.collectorRadius ??\r\n Math.max(10, 0.5 * Math.min(foundation.lx, foundation.ly));\r\n updateCollectorRadiusById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Collector Radius on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateCollectorRadiusById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateCollectorRadiusById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setCollectorRadius(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerCollectorRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerCollectorHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setActionScope = useStore(Selector.setFoundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(\r\n foundation?.solarUpdraftTower?.collectorHeight ?? Math.max(3, 10 * (foundation?.lz ?? 0)),\r\n );\r\n\r\n const lang = useLanguage();\r\n\r\n const updateCollectorHeightById = (id: string, height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorHeight = height;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCollectorHeightForAll = (height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorHeight = height;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorHeight = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (collectorHeight: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorHeight === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorHeight - collectorHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorHeight === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorHeight - collectorHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.collectorHeight === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.collectorHeight - collectorHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setCollectorHeight = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.collectorHeight ?? Math.max(3, 10 * f.lz));\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Collector Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ch] of undoableChangeSelected.oldValues.entries()) {\r\n updateCollectorHeightById(id, ch as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.collectorHeight ?? Math.max(3, 10 * f.lz));\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Collector Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ch] of undoableChangeAll.oldValues.entries()) {\r\n updateCollectorHeightById(id, ch as number);\r\n }\r\n },\r\n redo: () => {\r\n updateCollectorHeightForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateCollectorHeightForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.collectorHeight ?? Math.max(3, 10 * f.lz)\r\n : foundation.solarUpdraftTower.collectorHeight ?? Math.max(3, 10 * foundation.lz);\r\n updateCollectorHeightById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Collector Height on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateCollectorHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateCollectorHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setCollectorHeight(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 20] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerCollectorHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPowerTowerHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.towerHeight ?? 20);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerHeight = height;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (height: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerHeight = height;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerHeight = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (towerHeight: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.towerHeight === undefined ||\r\n Math.abs(f.solarPowerTower.towerHeight - towerHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.towerHeight === undefined ||\r\n Math.abs(f.solarPowerTower.towerHeight - towerHeight) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (powerTower?.towerHeight === undefined || Math.abs(powerTower?.towerHeight - towerHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTowerHeight = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.towerHeight ?? 20);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tower Height for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, th] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, th as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.towerHeight ?? 20);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tower Height for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, th] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, th as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue = f && f.solarPowerTower ? f.solarPowerTower.towerHeight ?? 20 : powerTower.towerHeight ?? 20;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Tower Height on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTowerHeight(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [10, 500] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPowerTowerHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPowerTowerRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.towerRadius ?? 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerRadius = radius;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (radius: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerRadius = radius;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.towerRadius = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (towerRadius: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.towerRadius === undefined ||\r\n Math.abs(f.solarPowerTower.towerRadius - towerRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.towerRadius === undefined ||\r\n Math.abs(f.solarPowerTower.towerRadius - towerRadius) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (powerTower?.towerRadius === undefined || Math.abs(powerTower?.towerRadius - towerRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTowerRadius = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.towerRadius ?? 1);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tower Radius for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, th] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, th as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.towerRadius ?? 1);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tower Radius for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, th] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, th as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue = f && f.solarPowerTower ? f.solarPowerTower.towerRadius ?? 1 : powerTower.towerRadius ?? 1;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Tower Radius on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTowerRadius(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.5, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPowerTowerRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nimport Dialog from '../dialog';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPowerTowerReceiverAbsorptanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.receiverAbsorptance ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, absorptance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverAbsorptance = absorptance;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (absorptance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverAbsorptance = absorptance;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverAbsorptance = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (absorptance: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverAbsorptance === undefined ||\r\n Math.abs(f.solarPowerTower.receiverAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverAbsorptance === undefined ||\r\n Math.abs(f.solarPowerTower.receiverAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n powerTower?.receiverAbsorptance === undefined ||\r\n Math.abs(powerTower?.receiverAbsorptance - absorptance) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setAbsorptance = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.receiverAbsorptance ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Receiver Absorptance for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.receiverAbsorptance ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Receiver Absorptance for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarPowerTower\r\n ? f.solarPowerTower.receiverAbsorptance ?? 0.95\r\n : powerTower.receiverAbsorptance ?? 0.95;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Receiver Absorptance on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAbsorptance(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPowerTowerReceiverAbsorptanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPowerTowerReceiverOpticalEfficiencyInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.receiverOpticalEfficiency ?? 0.7);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverOpticalEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverOpticalEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverOpticalEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverOpticalEfficiency === undefined ||\r\n Math.abs(f.solarPowerTower.receiverOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverOpticalEfficiency === undefined ||\r\n Math.abs(f.solarPowerTower.receiverOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n powerTower?.receiverOpticalEfficiency === undefined ||\r\n Math.abs(powerTower?.receiverOpticalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateOpticalEfficiency = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.receiverOpticalEfficiency ?? 0.7);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Receiver Optical Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, oe] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, oe as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.receiverOpticalEfficiency ?? 0.7);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Receiver Optical Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, oe] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, oe as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarPowerTower\r\n ? f.solarPowerTower.receiverOpticalEfficiency ?? 0.7\r\n : powerTower.receiverOpticalEfficiency ?? 0.7;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Receiver Optical Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateOpticalEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPowerTowerReceiverOpticalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarPowerTowerModel } from '../../../models/SolarPowerTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPowerTowerReceiverThermalEfficiencyInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n const powerTower = foundation?.solarPowerTower;\r\n\r\n const [inputValue, setInputValue] = useState(powerTower?.receiverThermalEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverThermalEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverThermalEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n if (!f.solarPowerTower) f.solarPowerTower = {} as SolarPowerTowerModel;\r\n f.solarPowerTower.receiverThermalEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverThermalEfficiency === undefined ||\r\n Math.abs(f.solarPowerTower.receiverThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower && f.solarPowerTower) {\r\n if (\r\n f.solarPowerTower.receiverThermalEfficiency === undefined ||\r\n Math.abs(f.solarPowerTower.receiverThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (\r\n powerTower?.receiverThermalEfficiency === undefined ||\r\n Math.abs(powerTower?.receiverThermalEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setThermalEfficiency = (value: number) => {\r\n if (!foundation || !powerTower) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesSelected.set(elem.id, f.solarPowerTower.receiverThermalEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Receiver Thermal Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, te] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, te as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarPowerTower) {\r\n oldValuesAll.set(elem.id, f.solarPowerTower.receiverThermalEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Receiver Thermal Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, te] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, te as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarPowerTower\r\n ? f.solarPowerTower.receiverThermalEfficiency ?? 0.3\r\n : powerTower.receiverThermalEfficiency ?? 0.3;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Receiver Thermal Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThermalEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPowerTowerReceiverThermalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerCollectorTransmissivityInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.solarUpdraftTower?.collectorTransmissivity ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, transmissivity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorTransmissivity = transmissivity;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (transmissivity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorTransmissivity = transmissivity;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorTransmissivity = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (transmissivity: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorTransmissivity === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorTransmissivity - transmissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorTransmissivity === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorTransmissivity - transmissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.collectorTransmissivity === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.collectorTransmissivity - transmissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTransmissivity = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.collectorTransmissivity ?? 0.9);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Collector Transmissivity for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ct] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ct as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.collectorTransmissivity ?? 0.9);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Collector Transmissivity for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ct] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ct as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.collectorTransmissivity ?? 0.9\r\n : foundation.solarUpdraftTower.collectorTransmissivity ?? 0.9;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Collector Transmissivity on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTransmissivity(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerCollectorTransmissivityInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerDischargeCoefficientInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.solarUpdraftTower?.dischargeCoefficient ?? 0.65);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, coefficient: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.dischargeCoefficient = coefficient;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (coefficient: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.dischargeCoefficient = coefficient;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.dischargeCoefficient = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (coefficient: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.dischargeCoefficient === undefined ||\r\n Math.abs(f.solarUpdraftTower.dischargeCoefficient - coefficient) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.dischargeCoefficient === undefined ||\r\n Math.abs(f.solarUpdraftTower.dischargeCoefficient - coefficient) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.dischargeCoefficient === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.dischargeCoefficient - coefficient) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setCoefficient = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.dischargeCoefficient ?? 0.65);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Chimney Discharge Coefficient for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, dc] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, dc as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.dischargeCoefficient ?? 0.65);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Chimney Discharge Coefficient for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, dc] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, dc as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.dischargeCoefficient ?? 0.65\r\n : foundation.solarUpdraftTower.dischargeCoefficient ?? 0.65;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Chimney Discharge Coefficient on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setCoefficient(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.65, 0.70]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerDischargeCoefficientInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerTurbineEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.solarUpdraftTower?.turbineEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.turbineEfficiency = efficiency;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.turbineEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.turbineEfficiency = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.turbineEfficiency === undefined ||\r\n Math.abs(f.solarUpdraftTower.turbineEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.turbineEfficiency === undefined ||\r\n Math.abs(f.solarUpdraftTower.turbineEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.turbineEfficiency === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.turbineEfficiency - efficiency) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setEfficiency = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.turbineEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Updraft Tower Turbine Efficiency for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, dc] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, dc as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.turbineEfficiency ?? 0.3);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Updraft Tower Turbine Efficiency for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, dc] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, dc as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.turbineEfficiency ?? 0.3\r\n : foundation.solarUpdraftTower.turbineEfficiency ?? 0.3;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Updraft Tower Turbine Efficiency on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.2, 1.0]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerTurbineEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, SolarStructure } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { FoundationModel } from 'src/models/FoundationModel';\r\nimport { ZERO_TOLERANCE } from 'src/constants';\r\nimport { SolarUpdraftTowerModel } from '../../../models/SolarUpdraftTowerModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarUpdraftTowerCollectorEmissivityInput = ({\r\n setDialogVisible,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(foundation?.solarUpdraftTower?.collectorEmissivity ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, emissivity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorEmissivity = emissivity;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (emissivity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorEmissivity = emissivity;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && map.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower) {\r\n if (!f.solarUpdraftTower) f.solarUpdraftTower = {} as SolarUpdraftTowerModel;\r\n f.solarUpdraftTower.collectorEmissivity = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (emissivity: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorEmissivity === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorEmissivity - emissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n if (\r\n f.solarUpdraftTower.collectorEmissivity === undefined ||\r\n Math.abs(f.solarUpdraftTower.collectorEmissivity - emissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundation && foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n if (\r\n foundation.solarUpdraftTower.collectorEmissivity === undefined ||\r\n Math.abs(foundation.solarUpdraftTower.collectorEmissivity - emissivity) > ZERO_TOLERANCE\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setEmissivity = (value: number) => {\r\n if (!foundation) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesSelected.set(elem.id, f.solarUpdraftTower.collectorEmissivity ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Solar Collector Emissivity for Selected Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ce] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ce as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Foundation) {\r\n const f = elem as FoundationModel;\r\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\r\n oldValuesAll.set(elem.id, f.solarUpdraftTower.collectorEmissivity ?? 0.95);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Solar Collector Emissivity for All Foundations',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ce] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ce as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\r\n // foundation selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(foundation.id) as FoundationModel;\r\n const oldValue =\r\n f && f.solarUpdraftTower\r\n ? f.solarUpdraftTower.collectorEmissivity ?? 0.95\r\n : foundation.solarUpdraftTower.collectorEmissivity ?? 0.95;\r\n updateById(foundation.id, value);\r\n const undoableChange = {\r\n name: 'Set Solar Collector Emissivity on Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setEmissivity(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setFoundationActionScope(e.target.value)}\r\n value={actionScope}\r\n >\r\n \r\n {i18n.t('foundationMenu.OnlyThisFoundation', lang)}\r\n \r\n {i18n.t('foundationMenu.AllSelectedFoundations', lang)}\r\n \r\n {i18n.t('foundationMenu.AllFoundations', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarUpdraftTowerCollectorEmissivityInput;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport {\n DesignProblem,\n EvolutionMethod,\n GeneticAlgorithmSelectionMethod,\n ObjectiveFunctionType,\n SearchMethod,\n} from '../../../types';\nimport { showInfo } from '../../../helpers';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\n\nconst { Option } = Select;\n\nconst SolarPanelTiltAngleGaWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const params = useStore(Selector.evolutionaryAlgorithmState).geneticAlgorithmParams;\n const selectionMethodRef = useRef(params.selectionMethod);\n const searchMethodRef = useRef(params.searchMethod);\n const objectiveFunctionTypeRef = useRef(\n Math.min(params.objectiveFunctionType, ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT),\n );\n const populationSizeRef = useRef(params.populationSize);\n const maximumGenerationsRef = useRef(params.maximumGenerations);\n const mutationRateRef = useRef(params.mutationRate);\n const selectionRateRef = useRef(params.selectionRate ?? 0.5);\n const crossoverRateRef = useRef(params.crossoverRate ?? 0.5);\n const convergenceThresholdRef = useRef(params.convergenceThreshold);\n const localSearchRadiusRef = useRef(params.localSearchRadius);\n const okButtonRef = useRef(null);\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const lang = { lng: language };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n // save the values in the common store to persist the user's last settings\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.problem = DesignProblem.SOLAR_PANEL_TILT_ANGLE;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType = objectiveFunctionTypeRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod = selectionMethodRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod = searchMethodRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize = populationSizeRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations = maximumGenerationsRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate = selectionRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate = crossoverRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate = mutationRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold = convergenceThresholdRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius = localSearchRadiusRef.current;\n });\n };\n\n const run = () => {\n if (!runEvolution) {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n }\n updateStoreParams();\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = !state.runEvolution;\n });\n setCommonStore((state) => {\n state.evolutionMethod = EvolutionMethod.GENETIC_ALGORITHM;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.problem = DesignProblem.SOLAR_PANEL_TILT_ANGLE;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Genetic Algorithm for Solar Panel Tilt Angle',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang) + ': '}\n {i18n.t('optimizationMenu.GeneticAlgorithmSettings', lang)}\n \n }\n footer={[\n {\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Cancel', lang)}\n ,\n {\n run();\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Run', lang)}\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('optimizationMenu.Objective', lang) + ':'}\n \n \n {\n objectiveFunctionTypeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.GeneticAlgorithmSelectionMethod', lang) + ':'}\n \n \n {\n selectionMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.RouletteWheel', lang)}\n \n \n {i18n.t('optimizationMenu.Tournament', lang)}\n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.PopulationSize', lang) + ':'}\n \n \n Number(a).toFixed(0)}\n value={populationSizeRef.current}\n step={1}\n onChange={(value) => {\n populationSizeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumGenerations', lang) + ':'}\n \n \n Number(a).toFixed(0)}\n value={maximumGenerationsRef.current}\n onChange={(value) => {\n maximumGenerationsRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SelectionRate', lang) + ' [0, 1]: '}\n \n \n {\n selectionRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.CrossoverRate', lang) + ' [0, 1]: '}\n \n \n {\n crossoverRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MutationRate', lang) + ' [0, 1]: '}\n \n \n {\n mutationRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.ConvergenceThreshold', lang) + ' [0, 0.1]: '}\n \n \n {\n convergenceThresholdRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SearchMethod', lang) + ':'}\n \n \n {\n searchMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.GlobalSearchUniformSelection', lang)}\n \n \n {i18n.t('optimizationMenu.LocalSearchRandomOptimization', lang)}\n \n \n \n \n\n {searchMethodRef.current === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION && (\n \n \n {i18n.t('optimizationMenu.LocalSearchRadius', lang) + ' ([0, 1]: '}\n \n \n {\n localSearchRadiusRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n )}\n \n \n );\n};\n\n// don't wrap this with React.memo as changedRef would be saved\nexport default SolarPanelTiltAngleGaWizard;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { DesignProblem, EvolutionMethod, ObjectiveFunctionType, SearchMethod } from '../../../types';\nimport { showInfo } from '../../../helpers';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\n\nconst { Option } = Select;\n\nconst SolarPanelTiltAnglePsoWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const params = useStore(Selector.evolutionaryAlgorithmState).particleSwarmOptimizationParams;\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const objectiveFunctionTypeRef = useRef(\n Math.min(params.objectiveFunctionType, ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT),\n );\n const searchMethodRef = useRef(params.searchMethod);\n const swarmSizeRef = useRef(params.swarmSize);\n const maximumStepsRef = useRef(params.maximumSteps);\n const vmaxRef = useRef(params.vmax ?? 0.01);\n const inertiaRef = useRef(params.inertia ?? 0.8);\n const cognitiveCoefficientRef = useRef(params.cognitiveCoefficient ?? 0.1);\n const socialCoefficientRef = useRef(params.socialCoefficient ?? 0.1);\n const convergenceThresholdRef = useRef(params.convergenceThreshold);\n const localSearchRadiusRef = useRef(params.localSearchRadius);\n const okButtonRef = useRef(null);\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const lang = { lng: language };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n // save the values in the common store to persist the user's last settings\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem = DesignProblem.SOLAR_PANEL_TILT_ANGLE;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType =\n objectiveFunctionTypeRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod = searchMethodRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize = swarmSizeRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps = maximumStepsRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient =\n cognitiveCoefficientRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient = socialCoefficientRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.vmax = vmaxRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.inertia = inertiaRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.convergenceThreshold =\n convergenceThresholdRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.localSearchRadius = localSearchRadiusRef.current;\n });\n };\n\n const run = () => {\n if (!runEvolution) {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n }\n updateStoreParams();\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = !state.runEvolution;\n });\n setCommonStore((state) => {\n state.evolutionMethod = EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem = DesignProblem.SOLAR_PANEL_TILT_ANGLE;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Particle Swarm Optimization for Solar Panel Tilt Angle',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang) + ': '}\n {i18n.t('optimizationMenu.ParticleSwarmOptimizationSettings', lang)}\n \n }\n footer={[\n {\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Cancel', lang)}\n ,\n {\n run();\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Run', lang)}\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('optimizationMenu.Objective', lang) + ':'}\n \n \n {\n objectiveFunctionTypeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.SwarmSize', lang) + ':'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n swarmSizeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumSteps', lang) + ':'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n maximumStepsRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.CognitiveCoefficient', lang) + ' [0, 1]: '}\n \n \n {\n cognitiveCoefficientRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SocialCoefficient', lang) + ' [0, 1]: '}\n \n \n {\n socialCoefficientRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.InertiaWeight', lang) + ' [0, 1]: '}\n \n \n {\n inertiaRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumVelocity', lang) + ' [0.001, 0.1]: '}\n \n \n {\n vmaxRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.ConvergenceThreshold', lang) + ' [0, 0.1]: '}\n \n \n {\n convergenceThresholdRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SearchMethod', lang) + ':'}\n \n \n {\n searchMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.GlobalSearchUniformSelection', lang)}\n \n \n {i18n.t('optimizationMenu.LocalSearchRandomOptimization', lang)}\n \n \n \n \n\n {searchMethodRef.current === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION && (\n \n \n {i18n.t('optimizationMenu.LocalSearchRadius', lang) + ' ([0, 1]: '}\n \n \n {\n localSearchRadiusRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n )}\n \n \n );\n};\n\n// don't wrap this with React.memo as changedRef would be saved\nexport default SolarPanelTiltAnglePsoWizard;\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Radio, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { DEFAULT_GROUND_FLOOR_R_VALUE, ZERO_TOLERANCE } from '../../../constants';\r\n\r\nconst GroundFloorRValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const selectedElement = useStore(Selector.selectedElement) as FoundationModel;\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.foundationActionScope);\r\n const setActionScope = useStore(Selector.setFoundationActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const foundationModel = useStore((state) => {\r\n if (selectedElement) {\r\n for (const e of state.elements) {\r\n if (e.id === selectedElement.id) {\r\n return e as FoundationModel;\r\n }\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n const [inputValue, setInputValue] = useState(foundationModel?.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toRValueInUS(inputValue));\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n if (foundationModel) {\r\n setInputValue(foundationModel?.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE);\r\n }\r\n }, [foundationModel?.rValue]);\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const f = e as FoundationModel;\r\n if (f.rValue === undefined || Math.abs(f.rValue - value) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (foundationModel?.rValue === undefined || Math.abs(foundationModel?.rValue - value) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as FoundationModel).rValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!foundationModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && !e.locked) {\r\n const foundation = e as FoundationModel;\r\n oldValuesAll.set(e.id, foundation.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE);\r\n foundation.rValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set R-Value for All Ground Floors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n default:\r\n if (foundationModel) {\r\n const updatedFoundation = getElementById(foundationModel.id) as FoundationModel;\r\n const oldValue = updatedFoundation.rValue ?? foundationModel.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE;\r\n const undoableChange = {\r\n name: 'Set Ground Floor R-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: foundationModel.id,\r\n changedElementType: foundationModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(foundationModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.groundFloorRValue = value;\r\n });\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const close = () => {\r\n setInputValue(foundationModel?.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE);\r\n setDialogVisible(false);\r\n };\r\n\r\n const handleCancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const handleOk = () => {\r\n setValue(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n const handleApply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('word.RValue', lang) + ' '}({i18n.t('word.ThermalResistance', lang)})\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={close}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toRValueInUS(value));\r\n }}\r\n onPressEnter={handleOk}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: m²·℃/W\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toRValueInSI(value));\r\n }}\r\n onPressEnter={handleOk}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toRValueInUS(0.01).toFixed(3)}, {Util.toRValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: h·ft²·℉/Btu\r\n
\r\n \r\n \r\n setActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('foundationMenu.OnlyThisGroundFloor', lang)}\r\n {i18n.t('foundationMenu.AllGroundFloors', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default GroundFloorRValueInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu, Modal, Radio, Space } from 'antd';\r\nimport { Copy, Cut, Lock, Paste } from '../menuItems';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { BuildingCompletionStatus, FoundationTexture, ObjectType, Scope, SolarStructure } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableRemoveAllChildren } from '../../../undo/UndoableRemoveAllChildren';\r\nimport FoundationColorSelection from './foundationColorSelection';\r\nimport FoundationLengthInput from './foundationLengthInput';\r\nimport FoundationWidthInput from './foundationWidthInput';\r\nimport FoundationHeightInput from './foundationHeightInput';\r\nimport FoundationAzimuthInput from './foundationAzimuthInput';\r\nimport FoundationTextureSelection from './foundationTextureSelection';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { UndoableAdd } from '../../../undo/UndoableAdd';\r\nimport { Vector3 } from 'three';\r\nimport { UNIT_VECTOR_POS_Z } from '../../../constants';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { ElementCounter } from '../../../stores/ElementCounter';\r\nimport SolarAbsorberPipeHeightInput from './solarAbsorberPipeHeightInput';\r\nimport SolarAbsorberPipeAbsorptanceInput from './solarAbsorberPipeAbsorptanceInput';\r\nimport SolarAbsorberPipeOpticalEfficiencyInput from './solarAbsorberPipeOpticalEfficiencyInput';\r\nimport SolarAbsorberPipeThermalEfficiencyInput from './solarAbsorberPipeThermalEfficiencyInput';\r\nimport SolarAbsorberPipeApertureWidthInput from './solarAbsorberPipeApertureWidthInput';\r\nimport SolarAbsorberPipePoleNumberInput from './solarAbsorberPipePoleNumberInput';\r\nimport SolarUpdraftTowerChimneyHeightInput from './solarUpdraftTowerChimneyHeightInput';\r\nimport SolarUpdraftTowerChimneyRadiusInput from './solarUpdraftTowerChimneyRadiusInput';\r\nimport SolarUpdraftTowerCollectorRadiusInput from './solarUpdraftTowerCollectorRadiusInput';\r\nimport SolarUpdraftTowerCollectorHeightInput from './solarUpdraftTowerCollectorHeightInput';\r\nimport SolarPowerTowerHeightInput from './solarPowerTowerHeightInput';\r\nimport SolarPowerTowerRadiusInput from './solarPowerTowerRadiusInput';\r\nimport SolarPowerTowerReceiverAbsorptanceInput from './solarPowerTowerReceiverAbsorptanceInput';\r\nimport SolarPowerTowerReceiverOpticalEfficiencyInput from './solarPowerTowerReceiverOpticalEfficiencyInput';\r\nimport SolarPowerTowerReceiverThermalEfficiencyInput from './solarPowerTowerReceiverThermalEfficiencyInput';\r\nimport SolarUpdraftTowerCollectorTransmissivityInput from './solarUpdraftTowerCollectorTransmissivityInput';\r\nimport SolarUpdraftTowerDischargeCoefficientInput from './solarUpdraftTowerDischargeCoefficientInput';\r\nimport SolarUpdraftTowerTurbineEfficiencyInput from './solarUpdraftTowerTurbineEfficiencyInput';\r\nimport SolarUpdraftTowerCollectorEmissivityInput from './solarUpdraftTowerCollectorEmissivityInput';\r\nimport SolarPanelTiltAngleGaWizard from './solarPanelTiltAngleGaWizard';\r\nimport SolarPanelTiltAnglePsoWizard from './solarPanelTiltAnglePsoWizard';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport GroundFloorRValueInput from './groundFloorRValueInput';\r\nimport { Util } from '../../../Util';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport { HvacSystem } from '../../../models/HvacSystem';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\n\r\nexport const FoundationMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const countAllOffspringsByType = useStore(Selector.countAllOffspringsByTypeAtOnce);\r\n const removeAllChildElementsByType = useStore(Selector.removeAllChildElementsByType);\r\n const removeAllElementsOnFoundationByType = useStore(Selector.removeAllElementsOnFoundationByType);\r\n const updateElementLockById = useStore(Selector.updateElementLockById);\r\n const updateElementLockByFoundationId = useStore(Selector.updateElementLockByFoundationId);\r\n const addElement = useStore(Selector.addElement);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const language = useStore(Selector.language);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n\r\n const foundation = useSelectedElement(ObjectType.Foundation) as FoundationModel | undefined;\r\n\r\n const [colorDialogVisible, setColorDialogVisible] = useState(false);\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [heightDialogVisible, setHeightDialogVisible] = useState(false);\r\n const [azimuthDialogVisible, setAzimuthDialogVisible] = useState(false);\r\n const [rValueDialogVisible, setRValueDialogVisible] = useState(false);\r\n\r\n const [solarAbsorberPipeHeightDialogVisible, setSolarAbsorberPipeHeightDialogVisible] = useState(false);\r\n const [solarAbsorberPipeApertureWidthDialogVisible, setSolarAbsorberPipeApertureWidthDialogVisible] = useState(false);\r\n const [solarAbsorberPipePoleNumberDialogVisible, setSolarAbsorberPipePoleNumberDialogVisible] = useState(false);\r\n const [solarAbsorberPipeAbsorptanceDialogVisible, setSolarAbsorberPipeAbsorptanceDialogVisible] = useState(false);\r\n const [solarAbsorberPipeOpticalEfficiencyDialogVisible, setSolarAbsorberPipeOpticalEfficiencyDialogVisible] =\r\n useState(false);\r\n const [solarAbsorberPipeThermalEfficiencyDialogVisible, setSolarAbsorberPipeThermalEfficiencyDialogVisible] =\r\n useState(false);\r\n\r\n const [solarPowerTowerHeightDialogVisible, setSolarPowerTowerHeightDialogVisible] = useState(false);\r\n const [solarPowerTowerRadiusDialogVisible, setSolarPowerTowerRadiusDialogVisible] = useState(false);\r\n const [solarPowerTowerReceiverAbsorptanceDialogVisible, setSolarPowerTowerReceiverAbsorptanceDialogVisible] =\r\n useState(false);\r\n const [\r\n solarPowerTowerReceiverOpticalEfficiencyDialogVisible,\r\n setSolarPowerTowerReceiverOpticalEfficiencyDialogVisible,\r\n ] = useState(false);\r\n const [\r\n solarPowerTowerReceiverThermalEfficiencyDialogVisible,\r\n setSolarPowerTowerReceiverThermalEfficiencyDialogVisible,\r\n ] = useState(false);\r\n\r\n const [chimneyHeightDialogVisible, setChimneyHeightDialogVisible] = useState(false);\r\n const [chimneyRadiusDialogVisible, setChimneyRadiusDialogVisible] = useState(false);\r\n const [collectorHeightDialogVisible, setCollectorHeightDialogVisible] = useState(false);\r\n const [collectorRadiusDialogVisible, setCollectorRadiusDialogVisible] = useState(false);\r\n const [collectorTransmissivityDialogVisible, setCollectorTransmissivityDialogVisible] = useState(false);\r\n const [collectorEmissivityDialogVisible, setCollectorEmissivityDialogVisible] = useState(false);\r\n const [dischargeCoefficientDialogVisible, setDischargeCoefficientDialogVisible] = useState(false);\r\n const [turbineEfficiencyDialogVisible, setTurbineEfficiencyDialogVisible] = useState(false);\r\n const [solarPanelTiltAngleGaWizardVisible, setSolarPanelTiltAngleGaWizardVisible] = useState(false);\r\n const [solarPanelTiltAnglePsoWizardVisible, setSolarPanelTiltAnglePsoWizardVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(foundation);\r\n const showLabel = useLabelShow(foundation);\r\n const updateLabelText = useLabelText(foundation, labelText);\r\n const setLabelSize = useLabelSize(foundation);\r\n const setLabelFontSize = useLabelFontSize(foundation);\r\n const setLabelColor = useLabelColor(foundation);\r\n const setLabelHeight = useLabelHeight(foundation);\r\n\r\n useEffect(() => {\r\n if (foundation) setHvacId(foundation.hvacSystem?.id);\r\n }, [foundation]);\r\n\r\n const [hvacId, setHvacId] = useState(foundation?.hvacSystem?.id);\r\n\r\n if (!foundation) return null;\r\n\r\n const selectedSolarStructure = foundation?.solarStructure ?? SolarStructure.None;\r\n const counterAll = foundation ? countAllOffspringsByType(foundation.id, true) : new ElementCounter();\r\n const counterUnlocked = foundation ? countAllOffspringsByType(foundation.id, false) : new ElementCounter();\r\n const lang = { lng: language };\r\n const editable = !foundation?.locked;\r\n\r\n const legalToPaste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n // when there are multiple elements to paste, the first element is the parent\r\n // we check the legality of the parent here\r\n const e = elementsToPaste[0];\r\n if (\r\n e.type === ObjectType.Human ||\r\n e.type === ObjectType.Tree ||\r\n e.type === ObjectType.Flower ||\r\n e.type === ObjectType.Polygon ||\r\n e.type === ObjectType.Sensor ||\r\n e.type === ObjectType.Light ||\r\n e.type === ObjectType.SolarPanel ||\r\n e.type === ObjectType.WaterHeater ||\r\n e.type === ObjectType.ParabolicDish ||\r\n e.type === ObjectType.Heliostat ||\r\n e.type === ObjectType.FresnelReflector ||\r\n e.type === ObjectType.ParabolicTrough ||\r\n e.type === ObjectType.WindTurbine ||\r\n e.type === ObjectType.Wall\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateFoundationSolarStructureById = (id: string, structure: SolarStructure) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id && !e.locked) {\r\n (e as FoundationModel).solarStructure = structure;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFoundationThermostatSetpointById = (id: string, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id) {\r\n const foundation = e as FoundationModel;\r\n if (foundation.hvacSystem) {\r\n foundation.hvacSystem.thermostatSetpoint = value;\r\n } else {\r\n foundation.hvacSystem = { thermostatSetpoint: value, temperatureThreshold: 3 } as HvacSystem;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFoundationTemperatureThresholdById = (id: string, value: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id) {\r\n const foundation = e as FoundationModel;\r\n if (foundation.hvacSystem) {\r\n foundation.hvacSystem.temperatureThreshold = value;\r\n } else {\r\n foundation.hvacSystem = { thermostatSetpoint: 20, temperatureThreshold: value } as HvacSystem;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateHvacIdByFoundationId = (id: string, value: string | undefined) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Foundation && e.id === id) {\r\n const foundation = e as FoundationModel;\r\n if (foundation.hvacSystem) {\r\n foundation.hvacSystem.id = value;\r\n } else {\r\n foundation.hvacSystem = { thermostatSetpoint: 20, temperatureThreshold: 3, id: value } as HvacSystem;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateHvacId = (value: string | undefined) => {\r\n const oldValue = foundation.hvacSystem?.id;\r\n const newValue = value && value.trim().length > 0 ? value : undefined;\r\n const undoableChange = {\r\n name: 'Change HVAC ID',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n undo: () => {\r\n updateHvacIdByFoundationId(foundation.id, undoableChange.oldValue as string | undefined);\r\n },\r\n redo: () => {\r\n updateHvacIdByFoundationId(foundation.id, undoableChange.newValue as string | undefined);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateHvacIdByFoundationId(foundation.id, newValue);\r\n };\r\n\r\n // Do NOT put this in useMemo. Otherwise, it will crash the app.\r\n const isBuilding =\r\n !foundation.notBuilding &&\r\n Util.getBuildingCompletionStatus(foundation, elements) === BuildingCompletionStatus.COMPLETE;\r\n\r\n const toggleGroupMaster = () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === foundation.id) {\r\n (e as FoundationModel).enableGroupMaster = !(e as FoundationModel).enableGroupMaster;\r\n break;\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n };\r\n\r\n const toggleBuilding = () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === foundation.id) {\r\n (e as FoundationModel).notBuilding = !(e as FoundationModel).notBuilding;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n \r\n {editable && }\r\n \r\n\r\n \r\n {\r\n const undoableCheck = {\r\n name: 'Group Master',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n selectedElementId: foundation.id,\r\n selectedElementType: foundation.type,\r\n undo: () => toggleGroupMaster(),\r\n redo: () => toggleGroupMaster(),\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n toggleGroupMaster();\r\n }}\r\n >\r\n {i18n.t('foundationMenu.GroupMaster', { lng: language })}\r\n \r\n \r\n\r\n \r\n {\r\n const undoableCheck = {\r\n name: 'Building',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n selectedElementId: foundation.id,\r\n selectedElementType: foundation.type,\r\n undo: () => toggleBuilding(),\r\n redo: () => toggleBuilding(),\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n toggleBuilding();\r\n }}\r\n >\r\n {i18n.t('word.Building', { lng: language })}\r\n \r\n \r\n\r\n {counterAll.gotSome() && (\r\n \r\n {counterUnlocked.gotSome() && (\r\n {\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.foundationId === foundation.id || elem.id === foundation.id) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n }\r\n updateElementLockByFoundationId(foundation.id, true);\r\n const undoableLockAllElements = {\r\n name: 'Lock All Offsprings',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElements.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateElementLockByFoundationId(foundation.id, true);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElements);\r\n }}\r\n >\r\n {i18n.t('foundationMenu.LockAllElementsOnThisFoundation', lang)}\r\n \r\n )}\r\n {\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.foundationId === foundation.id || elem.id === foundation.id) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n }\r\n updateElementLockByFoundationId(foundation.id, false);\r\n const undoableLockAllElements = {\r\n name: 'Unlock All Offsprings',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElements.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateElementLockByFoundationId(foundation.id, false);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElements);\r\n }}\r\n >\r\n {i18n.t('foundationMenu.UnlockAllElementsOnThisFoundation', lang)}\r\n \r\n {counterUnlocked.wallCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllWallsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.wallCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Walls', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const wallsIdSet = new Set();\r\n useStore.getState().elements.forEach((e) => {\r\n if (\r\n !e.locked &&\r\n e.type === ObjectType.Wall &&\r\n (e.parentId === foundation.id || e.foundationId === foundation.id)\r\n ) {\r\n wallsIdSet.add(e.id);\r\n }\r\n });\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => wallsIdSet.has(e.id) || wallsIdSet.has(e.parentId));\r\n setCommonStore((state) => {\r\n state.elements = state.elements.filter(\r\n (e) => !wallsIdSet.has(e.id) && !wallsIdSet.has(e.parentId),\r\n );\r\n });\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllWallChildren = {\r\n name: 'Remove All Walls on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllWallChildren.removedElements);\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n });\r\n },\r\n redo: () => {\r\n const wallsIdSet = new Set();\r\n useStore.getState().elements.forEach((e) => {\r\n if (\r\n !e.locked &&\r\n e.type === ObjectType.Wall &&\r\n e.parentId === undoableRemoveAllWallChildren.parentId\r\n ) {\r\n wallsIdSet.add(e.id);\r\n }\r\n });\r\n setCommonStore((state) => {\r\n state.elements = state.elements.filter(\r\n (e) => !wallsIdSet.has(e.id) && !wallsIdSet.has(e.parentId),\r\n );\r\n });\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllWallChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedWalls', lang)} ({counterUnlocked.wallCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.windowCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllWindowsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.windowCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Windows', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Window && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.Window);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllWindowGrandchildren = {\r\n name: 'Remove All Windows on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllWindowGrandchildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllWindowGrandchildren.parentId,\r\n ObjectType.Window,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllWindowGrandchildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedWindows', lang)} ({counterUnlocked.windowCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.doorCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllDoorsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.doorCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Doors', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Door && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.Door);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllDoorGrandchildren = {\r\n name: 'Remove All Doors on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllDoorGrandchildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllDoorGrandchildren.parentId,\r\n ObjectType.Door,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllDoorGrandchildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedDoors', lang)} ({counterUnlocked.doorCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.sensorCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllSensorsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.sensorCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Sensors', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Sensor && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.Sensor);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllSensorChildren = {\r\n name: 'Remove All Sensors on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllSensorChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllSensorChildren.parentId,\r\n ObjectType.Sensor,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllSensorChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedSensors', lang)} ({counterUnlocked.sensorCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllLightsOnFoundation', lang) +\r\n ' (' +\r\n (counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount) +\r\n ' ' +\r\n i18n.t('foundationMenu.Lights', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Light && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.Light);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllLightChildren = {\r\n name: 'Remove All Lights on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllLightChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllLightChildren.parentId,\r\n ObjectType.Light,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllLightChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedLights', lang)} (\r\n {counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.solarPanelCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllSolarPanelsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.solarPanelModuleCount +\r\n ' ' +\r\n i18n.t('foundationMenu.SolarPanels', lang) +\r\n ', ' +\r\n counterUnlocked.solarPanelCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Racks', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.SolarPanel && e.foundationId === foundation.id,\r\n );\r\n removeAllElementsOnFoundationByType(foundation.id, ObjectType.SolarPanel);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllSolarPanelChildren = {\r\n name: 'Remove All Solar Panels on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllSolarPanelChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllElementsOnFoundationByType(\r\n undoableRemoveAllSolarPanelChildren.parentId,\r\n ObjectType.SolarPanel,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllSolarPanelChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedSolarPanels', lang)}  (\r\n {counterUnlocked.solarPanelModuleCount} {i18n.t('foundationMenu.SolarPanels', lang)},{' '}\r\n {counterUnlocked.solarPanelCount} {i18n.t('foundationMenu.Racks', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.parabolicTroughCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllParabolicTroughsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.parabolicTroughCount +\r\n ' ' +\r\n i18n.t('foundationMenu.ParabolicTroughs', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.ParabolicTrough && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.ParabolicTrough);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllParabolicTroughChildren = {\r\n name: 'Remove All Parabolic Troughs on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllParabolicTroughChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllParabolicTroughChildren.parentId,\r\n ObjectType.ParabolicTrough,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllParabolicTroughChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedParabolicTroughs', lang)} ({counterUnlocked.parabolicTroughCount}\r\n )\r\n \r\n )}\r\n\r\n {counterUnlocked.parabolicDishCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllParabolicDishesOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.parabolicDishCount +\r\n ' ' +\r\n i18n.t('foundationMenu.ParabolicDishes', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.ParabolicDish && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.ParabolicDish);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllParabolicDishChildren = {\r\n name: 'Remove All Parabolic Dishes on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllParabolicDishChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllParabolicDishChildren.parentId,\r\n ObjectType.ParabolicDish,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllParabolicDishChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedParabolicDishes', lang)} ({counterUnlocked.parabolicDishCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.fresnelReflectorCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllFresnelReflectorsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.fresnelReflectorCount +\r\n ' ' +\r\n i18n.t('foundationMenu.FresnelReflectors', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) =>\r\n !e.locked && e.type === ObjectType.FresnelReflector && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.FresnelReflector);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllFresnelReflectorChildren = {\r\n name: 'Remove All Fresnel Reflectors on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllFresnelReflectorChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllFresnelReflectorChildren.parentId,\r\n ObjectType.FresnelReflector,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllFresnelReflectorChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedFresnelReflectors', lang)} (\r\n {counterUnlocked.fresnelReflectorCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.heliostatCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllHeliostatsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.heliostatCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Heliostats', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Heliostat && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Heliostat);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllHeliostatChildren = {\r\n name: 'Remove All Heliostats on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllHeliostatChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllHeliostatChildren.parentId,\r\n ObjectType.Heliostat,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllHeliostatChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedHeliostats', lang)} ({counterUnlocked.heliostatCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.polygonCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllPolygonsOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.polygonCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Polygons', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Polygon && e.foundationId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Polygon);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllPolygonChildren = {\r\n name: 'Remove All Polygons on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllPolygonChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllPolygonChildren.parentId, ObjectType.Polygon);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllPolygonChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedPolygons', lang)} ({counterUnlocked.polygonCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.humanCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllHumansOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.humanCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Humans', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Human && e.parentId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Human);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllHumanChildren = {\r\n name: 'Remove All Humans on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllHumanChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllHumanChildren.parentId, ObjectType.Human);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllHumanChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedHumans', lang)} ({counterUnlocked.humanCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.treeCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllTreesOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.treeCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Trees', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Tree && e.parentId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Tree);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllTreeChildren = {\r\n name: 'Remove All Trees on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllTreeChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllTreeChildren.parentId, ObjectType.Tree);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllTreeChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedTrees', lang)} ({counterUnlocked.treeCount})\r\n \r\n )}\r\n\r\n {counterUnlocked.flowerCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('foundationMenu.DoYouReallyWantToRemoveAllFlowersOnFoundation', lang) +\r\n ' (' +\r\n counterUnlocked.flowerCount +\r\n ' ' +\r\n i18n.t('foundationMenu.Flowers', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (foundation) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.Flower && e.parentId === foundation.id,\r\n );\r\n removeAllChildElementsByType(foundation.id, ObjectType.Flower);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllFlowerChildren = {\r\n name: 'Remove All Flowers on Foundation',\r\n timestamp: Date.now(),\r\n parentId: foundation.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllFlowerChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllFlowerChildren.parentId, ObjectType.Flower);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllFlowerChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('foundationMenu.RemoveAllUnlockedFlowers', lang)} ({counterUnlocked.flowerCount})\r\n \r\n )}\r\n \r\n )}\r\n\r\n {editable && (!foundation.textureType || foundation.textureType === FoundationTexture.NoTexture) && (\r\n <>\r\n {colorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Color', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n <>\r\n {textureDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Texture', lang)} ...\r\n \r\n\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {heightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Height', lang)} ...\r\n \r\n\r\n {azimuthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setAzimuthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Azimuth', lang)} ...\r\n \r\n\r\n {isBuilding && rValueDialogVisible && }\r\n {isBuilding && (\r\n {\r\n setApplyCount(0);\r\n setRValueDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('foundationMenu.GroundFloorRValue', lang)} ...\r\n \r\n )}\r\n \r\n )}\r\n\r\n {\r\n if (foundation) {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.Polygon;\r\n });\r\n const element = addElement(\r\n foundation,\r\n new Vector3(foundation.cx, foundation.cy, foundation.lz),\r\n UNIT_VECTOR_POS_Z,\r\n );\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: element,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('foundationMenu.AddPolygon', lang)}\r\n \r\n\r\n {!foundation.notBuilding && counterAll.wallCount > 0 && (\r\n \r\n \r\n \r\n {'ID:'}\r\n ) => {\r\n let s: string | undefined = e.target.value;\r\n if (s.trim().length === 0) s = undefined;\r\n setHvacId(s);\r\n }}\r\n onPressEnter={() => updateHvacId(hvacId)}\r\n onBlur={() => updateHvacId(hvacId)}\r\n />\r\n \r\n \r\n {i18n.t('word.ThermostatSetpoint', lang) + ':'}\r\n {\r\n const oldValue = foundation.hvacSystem?.thermostatSetpoint ?? 20;\r\n const newValue = value;\r\n const undoableChange = {\r\n name: 'Change Thermostat Setpoint',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n undo: () => {\r\n updateFoundationThermostatSetpointById(foundation.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFoundationThermostatSetpointById(foundation.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFoundationThermostatSetpointById(foundation.id, newValue);\r\n }}\r\n />\r\n °C\r\n \r\n\r\n \r\n \r\n {i18n.t('word.TemperatureToleranceThreshold', lang) + ':'}\r\n \r\n {\r\n const oldValue = foundation.hvacSystem?.temperatureThreshold ?? 3;\r\n const newValue = value;\r\n const undoableChange = {\r\n name: 'Change Temperature Tolerance Threshold',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n undo: () => {\r\n updateFoundationTemperatureThresholdById(foundation.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFoundationTemperatureThresholdById(foundation.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFoundationTemperatureThresholdById(foundation.id, newValue);\r\n }}\r\n />\r\n °C\r\n \r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n \r\n {\r\n if (foundation) {\r\n const oldValue = foundation.solarStructure;\r\n const newValue = e.target.value;\r\n const undoableChange = {\r\n name: 'Select Solar Structure for Selected Foundation',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n changedElementId: foundation.id,\r\n changedElementType: foundation.type,\r\n undo: () => {\r\n updateFoundationSolarStructureById(\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as SolarStructure,\r\n );\r\n },\r\n redo: () => {\r\n updateFoundationSolarStructureById(\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as SolarStructure,\r\n );\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFoundationSolarStructureById(foundation.id, newValue);\r\n }\r\n }}\r\n >\r\n \r\n {i18n.t('word.None', lang)}\r\n \r\n {i18n.t('solarAbsorberPipeMenu.AbsorberPipeForFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('solarPowerTowerMenu.ReceiverTowerForHeliostats', lang)}\r\n \r\n \r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTower', lang)}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {editable && foundation.solarStructure === SolarStructure.FocusPipe && (\r\n \r\n {solarAbsorberPipeHeightDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberHeight', lang)} ...\r\n \r\n\r\n {solarAbsorberPipeApertureWidthDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeApertureWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberApertureWidth', lang)} ...\r\n \r\n {solarAbsorberPipePoleNumberDialogVisible && (\r\n \r\n )}\r\n\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipePoleNumberDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberPipePoleNumber', lang)} ...\r\n \r\n\r\n {solarAbsorberPipeAbsorptanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeAbsorptanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberAbsorptance', lang)} ...\r\n \r\n\r\n {solarAbsorberPipeOpticalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeOpticalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberOpticalEfficiency', lang)} ...\r\n \r\n\r\n {solarAbsorberPipeThermalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarAbsorberPipeThermalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarAbsorberPipeMenu.AbsorberThermalEfficiency', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && foundation.solarStructure === SolarStructure.FocusTower && (\r\n \r\n {solarPowerTowerHeightDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverTowerHeight', lang)} ...\r\n \r\n\r\n {solarPowerTowerRadiusDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverTowerRadius', lang)} ...\r\n \r\n\r\n {solarPowerTowerReceiverAbsorptanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerReceiverAbsorptanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverAbsorptance', lang)} ...\r\n \r\n\r\n {solarPowerTowerReceiverOpticalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerReceiverOpticalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverOpticalEfficiency', lang)} ...\r\n \r\n\r\n {solarPowerTowerReceiverThermalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPowerTowerReceiverThermalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPowerTowerMenu.ReceiverThermalEfficiency', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && foundation.solarStructure === SolarStructure.UpdraftTower && (\r\n \r\n {chimneyHeightDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setChimneyHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerChimneyHeight', lang)} ...\r\n \r\n\r\n {chimneyRadiusDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setChimneyRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerChimneyRadius', lang)} ...\r\n \r\n\r\n {collectorHeightDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setCollectorHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerCollectorHeight', lang)} ...\r\n \r\n\r\n {collectorRadiusDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setCollectorRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerCollectorRadius', lang)} ...\r\n \r\n\r\n {collectorTransmissivityDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setCollectorTransmissivityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerCollectorTransmissivity', lang)} ...\r\n \r\n\r\n {collectorEmissivityDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setCollectorEmissivityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerCollectorEmissivity', lang)} ...\r\n \r\n\r\n {dischargeCoefficientDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setDischargeCoefficientDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerDischargeCoefficient', lang)} ...\r\n \r\n\r\n {turbineEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setTurbineEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarUpdraftTowerMenu.SolarUpdraftTowerTurbineEfficiency', lang)} ...\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {counterUnlocked.solarPanelCount > 0 && (\r\n <>\r\n {solarPanelTiltAngleGaWizardVisible && (\r\n \r\n )}\r\n {\r\n setSolarPanelTiltAngleGaWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '12px' }}\r\n >\r\n {i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang)}...\r\n \r\n \r\n )}\r\n \r\n \r\n {counterUnlocked.solarPanelCount > 0 && (\r\n <>\r\n {solarPanelTiltAnglePsoWizardVisible && (\r\n \r\n )}\r\n {\r\n setSolarPanelTiltAnglePsoWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '12px' }}\r\n >\r\n {i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang)}...\r\n \r\n \r\n )}\r\n \r\n \r\n\r\n {editable && (\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the foundation's top surface */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { CuboidModel } from '../../../models/CuboidModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst CuboidColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const selectedSideIndex = useStore(Selector.selectedSideIndex);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(cuboid?.color ?? '#808080');\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n\r\n const lang = useLanguage();\r\n\r\n useEffect(() => {\r\n updateSelectedColor();\r\n }, [cuboid, selectedSideIndex]);\r\n\r\n const updateCuboidColorBySide = (side: number, id: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && e.id === id && !e.locked) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.faceColors) {\r\n cuboid.faceColors = new Array(6);\r\n cuboid.faceColors.fill(cuboid.color ?? color);\r\n }\r\n cuboid.faceColors[side] = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidColorById = (id: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && e.id === id && !e.locked) {\r\n e.color = color;\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.faceColors) cuboid.faceColors = new Array(6);\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.faceColors[i] = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidColorForAll = (color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n e.color = color;\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.faceColors) cuboid.faceColors = new Array(6);\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.faceColors[i] = color;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n setUpdateFlag(!updateFlag);\r\n };\r\n\r\n const updateSelectedColor = () => {\r\n if (cuboid) {\r\n if (selectedSideIndex >= 0 && cuboid.faceColors) {\r\n setSelectedColor(cuboid.faceColors[selectedSideIndex]);\r\n } else {\r\n setSelectedColor(cuboid.color ?? '#808080');\r\n }\r\n }\r\n };\r\n\r\n const needChange = (color: string) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const cm = e as CuboidModel;\r\n if (cm.faceColors) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (color !== cm.faceColors[i]) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n if (color !== cm.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const cm = e as CuboidModel;\r\n if (cm.faceColors) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (color !== cm.faceColors[i]) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n if (color !== cm.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisObject:\r\n if (cuboid.faceColors) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (color !== cuboid.faceColors[i]) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n if (color !== cuboid?.color) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (selectedSideIndex >= 0) {\r\n const oldColor = cuboid?.faceColors ? cuboid?.faceColors[selectedSideIndex] : cuboid?.color;\r\n if (color !== oldColor) {\r\n return true;\r\n }\r\n } else {\r\n if (color !== cuboid?.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const cm = elem as CuboidModel;\r\n if (cm.faceColors) {\r\n oldColorsSelected.set(elem.id, [...cm.faceColors]);\r\n } else {\r\n const c = cm.color ?? '#808080';\r\n oldColorsSelected.set(elem.id, [c, c, c, c, c, c]);\r\n }\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, colors] of undoableChangeSelected.oldValues.entries()) {\r\n if (colors && Array.isArray(colors)) {\r\n for (let i = 0; i < colors.length; i++) {\r\n updateCuboidColorBySide(i, id, colors[i]);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, colors] of undoableChangeSelected.oldValues.entries()) {\r\n if (colors && Array.isArray(colors)) {\r\n for (let i = 0; i < colors.length; i++) {\r\n updateCuboidColorBySide(i, id, undoableChangeSelected.newValue as string);\r\n }\r\n }\r\n }\r\n // updateCuboidColorForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n for (const [id, colors] of oldColorsSelected.entries()) {\r\n if (colors && Array.isArray(colors)) {\r\n for (let i = 0; i < colors.length; i++) {\r\n updateCuboidColorBySide(i, id, value);\r\n }\r\n }\r\n }\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceColors)\r\n state.actionState.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceColors[i] = value;\r\n }\r\n });\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid) {\r\n const cm = elem as CuboidModel;\r\n if (cm.faceColors) {\r\n oldColorsAll.set(elem.id, [...cm.faceColors]);\r\n } else {\r\n const c = cm.color ?? '#808080';\r\n oldColorsAll.set(elem.id, [c, c, c, c, c, c]);\r\n }\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, colors] of undoableChangeAll.oldValues.entries()) {\r\n if (colors && Array.isArray(colors)) {\r\n for (let i = 0; i < colors.length; i++) {\r\n updateCuboidColorBySide(i, id, colors[i]);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidColorForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateCuboidColorForAll(value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceColors)\r\n state.actionState.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceColors[i] = value;\r\n }\r\n });\r\n break;\r\n }\r\n case Scope.OnlyThisObject:\r\n let oldColors;\r\n if (cuboid.faceColors) {\r\n oldColors = [...cuboid.faceColors];\r\n } else {\r\n const c = cuboid.color ?? '#808080';\r\n oldColors = [c, c, c, c, c, c];\r\n }\r\n const undoableChange = {\r\n name: 'Set Color for All Sides of Selected Cuboid',\r\n timestamp: Date.now(),\r\n oldValue: oldColors,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n undo: () => {\r\n if (undoableChange.oldValue && Array.isArray(undoableChange.oldValue)) {\r\n for (let i = 0; i < undoableChange.oldValue.length; i++) {\r\n updateCuboidColorBySide(i, undoableChange.changedElementId, undoableChange.oldValue[i] as string);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateCuboidColorById(cuboid.id, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceColors)\r\n state.actionState.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceColors[i] = value;\r\n }\r\n });\r\n break;\r\n default:\r\n if (selectedSideIndex >= 0) {\r\n const oldColor = cuboid.faceColors ? cuboid.faceColors[selectedSideIndex] : cuboid.color;\r\n const undoableChange = {\r\n name: 'Set Color for Selected Side of Cuboid',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n changedSideIndex: selectedSideIndex,\r\n undo: () => {\r\n if (undoableChange.changedSideIndex !== undefined) {\r\n updateCuboidColorBySide(\r\n undoableChange.changedSideIndex,\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as string,\r\n );\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChange.changedSideIndex !== undefined) {\r\n updateCuboidColorBySide(\r\n undoableChange.changedSideIndex,\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateCuboidColorBySide(selectedSideIndex, cuboid.id, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceColors)\r\n state.actionState.cuboidFaceColors = ['#808080', '#808080', '#808080', '#808080', '#808080', '#808080'];\r\n state.actionState.cuboidFaceColors[selectedSideIndex] = value;\r\n });\r\n }\r\n }\r\n setUpdateFlag(!updateFlag);\r\n };\r\n\r\n const close = () => {\r\n updateSelectedColor();\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n const currentColor =\r\n selectedSideIndex >= 0 && cuboid?.faceColors ? cuboid.faceColors[selectedSideIndex] : cuboid?.color ?? '#808080';\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisSide', lang)}\r\n {i18n.t('cuboidMenu.AllSidesOfThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSidesOfSelectedCuboids', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSidesOfAllCuboids', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CuboidColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { CuboidModel } from 'src/models/CuboidModel';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableSizeGroupChange } from 'src/undo/UndoableSizeGroupChange';\r\nimport { UndoableSizeChange } from 'src/undo/UndoableSizeChange';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { PolygonModel } from 'src/models/PolygonModel';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst CuboidLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getChildren = useStore(Selector.getChildren);\r\n const updateElementCxById = useStore(Selector.updateElementCxById);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const setCommonStore = useStore(Selector.set);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(cuboid?.lx ?? 0);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const denormalizedPosMapRef = useRef>(new Map()); // not absolute position, just denormalized\r\n const oldChildrenVerticesMapRef = useRef>(new Map()); // Point2 is used to store vertices\r\n const newChildrenVerticesMapRef = useRef>(new Map());\r\n const denormalizedVerticesMapRef = useRef>(new Map()); // use Vector2's rotation function\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const containsAllChildren = (lx: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n const children = getChildren(c.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(c, children, lx, c.ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid) {\r\n const c = e as CuboidModel;\r\n const children = getChildren(c.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(c, children, lx, c.ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const children = getChildren(cuboid.id);\r\n if (children.length > 0) {\r\n return Util.doesNewSizeContainAllChildren(cuboid, children, lx, cuboid.ly);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const rejectChange = (lx: number) => {\r\n // check if the new length will still contain all children of the cuboids in the selected scope\r\n if (!containsAllChildren(lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && e.parentId === cuboid?.parentId && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n if (Math.abs(cuboid?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === curr.id) {\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector2(e.cx, e.cy)\r\n .rotateAround(ORIGIN_VECTOR2, parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const updateOnSurface = (value: number) => {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === cuboid?.parentId) {\r\n updateLxWithChildren(e as CuboidModel, value);\r\n }\r\n }\r\n };\r\n\r\n const updateLxWithChildren = (parent: CuboidModel, value: number) => {\r\n // store children's relative positions\r\n const children = getChildren(parent.id);\r\n const azimuth = parent.rotation[2];\r\n denormalizedPosMapRef.current.clear(); // this map is for one-time use with each foundation\r\n denormalizedVerticesMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (Util.isIdentical(c.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // top face\r\n switch (c.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const p = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth);\r\n denormalizedPosMapRef.current.set(c.id, p);\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy));\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = c as PolygonModel;\r\n const arr: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n arr.push(new Vector2(v.x * parent.lx, v.y * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth));\r\n }\r\n denormalizedVerticesMapRef.current.set(c.id, arr);\r\n oldChildrenVerticesMapRef.current.set(\r\n c.id,\r\n polygon.vertices.map((v) => ({ ...v })),\r\n );\r\n break;\r\n }\r\n }\r\n if (Util.isPlantOrHuman(c)) {\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n // update cuboid length\r\n updateElementLxById(parent.id, value);\r\n // update children's relative positions\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (Util.isIdentical(c.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // top face\r\n switch (c.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const p = denormalizedPosMapRef.current.get(c.id);\r\n if (p) {\r\n const relativePos = new Vector2(p.x, p.y).rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newCx = relativePos.x / value;\r\n updateElementCxById(c.id, newCx);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(newCx, c.cy));\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const arr = denormalizedVerticesMapRef.current.get(c.id);\r\n if (arr) {\r\n const newVertices: Point2[] = [];\r\n for (const v of arr) {\r\n const relativePos = v.rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newX = relativePos.x / value;\r\n const newY = relativePos.y / parent.ly;\r\n newVertices.push({ x: newX, y: newY } as Point2);\r\n }\r\n updatePolygonVerticesById(c.id, newVertices);\r\n newChildrenVerticesMapRef.current.set(\r\n c.id,\r\n newVertices.map((v) => ({ ...v })),\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n if (Util.isPlantOrHuman(c)) {\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n oldChildrenParentIdMapRef.current.set(c.id, parent.id);\r\n // top, north, south face\r\n if (\r\n Math.abs(c.cz - parent.lz / 2) < ZERO_TOLERANCE ||\r\n Math.abs(Math.abs(c.cy) - parent.ly / 2) < ZERO_TOLERANCE\r\n ) {\r\n // check fall off\r\n if (Math.abs(c.cx) - value / 2 > 0) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, c);\r\n }\r\n }\r\n // west and east face\r\n else if (Math.abs(Math.abs(c.cx) - parent.lx / 2) < ZERO_TOLERANCE) {\r\n const newCx = (c.cx > 0 ? value : -value) / 2;\r\n updateElementCxById(c.id, newCx);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(newCx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLx = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n // cuboid via selected element may be outdated, make sure that we get the latest\r\n const c = getElementById(cuboid.id);\r\n const oldLx = c ? c.lx : cuboid.lx;\r\n rejectedValue.current = undefined;\r\n rejectRef.current = rejectChange(value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLx);\r\n } else {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLxsSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Cuboid &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldLxsSelected.set(elem.id, elem.lx);\r\n updateLxWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsSelected,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLxById(id, lx as number);\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenVerticesMap &&\r\n undoableChangeSelected.oldChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLxById(id, undoableChangeSelected.newSize as number);\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenVerticesMap &&\r\n undoableChangeSelected.newChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface: {\r\n const oldLxsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && elem.parentId === cuboid.parentId && !elem.locked) {\r\n oldLxsAll.set(elem.id, elem.lx);\r\n updateLxWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLxById(id, lx as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateOnSurface(undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLxsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && !elem.locked) {\r\n oldLxsAll.set(elem.id, elem.lx);\r\n updateLxWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Cuboids',\r\n timestamp: Date.now(),\r\n oldSizes: oldLxsAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLxById(id, lx as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLxById(id, undoableChangeAll.newSize as number);\r\n }\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n updateLxWithChildren(cuboid, value);\r\n const undoableChange = {\r\n name: 'Set Cuboid Length',\r\n timestamp: Date.now(),\r\n oldSize: oldLx,\r\n newSize: value,\r\n resizedElementId: cuboid.id,\r\n resizedElementType: cuboid.type,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateElementLxById(cuboid.id, undoableChange.oldSize as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.oldChildrenVerticesMap && undoableChange.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLxById(cuboid.id, undoableChange.newSize as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, p] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, p.x, p.y, p.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.newChildrenVerticesMap && undoableChange.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLx(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLx(inputValue);\r\n };\r\n\r\n const rejectMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 500] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsOnSameSurface', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSelectedCuboids', lang)}\r\n {i18n.t('cuboidMenu.AllCuboids', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default CuboidLengthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { CuboidModel } from 'src/models/CuboidModel';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from 'src/constants';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableSizeGroupChange } from 'src/undo/UndoableSizeGroupChange';\r\nimport { UndoableSizeChange } from 'src/undo/UndoableSizeChange';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { PolygonModel } from 'src/models/PolygonModel';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst CuboidWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getChildren = useStore(Selector.getChildren);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const updateElementCyById = useStore(Selector.updateElementCyById);\r\n const updateElementLyById = useStore(Selector.updateElementLyById);\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const setCommonStore = useStore(Selector.set);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(cuboid?.ly ?? 0);\r\n\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n const denormalizedPositionMapRef = useRef>(new Map()); // not absolute position, just denormalized\r\n const oldChildrenVerticesMapRef = useRef>(new Map()); // Point2 is used to store vertices\r\n const newChildrenVerticesMapRef = useRef>(new Map());\r\n const denormalizedVerticesMapRef = useRef>(new Map()); // use Vector2's rotation function\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const containsAllChildren = (ly: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n const children = getChildren(c.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(c, children, c.lx, ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid) {\r\n const c = e as CuboidModel;\r\n const children = getChildren(c.id);\r\n if (children.length > 0) {\r\n if (!Util.doesNewSizeContainAllChildren(c, children, c.lx, ly)) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const children = getChildren(cuboid.id);\r\n if (children.length > 0) {\r\n return Util.doesNewSizeContainAllChildren(cuboid, children, cuboid.lx, ly);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const rejectChange = (ly: number) => {\r\n // check if the new width will still contain all children of the cuboids in the selected scope\r\n if (!containsAllChildren(ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && e.parentId === cuboid?.parentId && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType: {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n if (Math.abs(cuboid?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === curr.id) {\r\n e.parentId = GROUND_ID;\r\n const absPos = new Vector2(e.cx, e.cy)\r\n .rotateAround(ORIGIN_VECTOR2, parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n e.cx = absPos.x;\r\n e.cy = absPos.y;\r\n e.cz = 0;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(e.id, GROUND_ID);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n const updateOnSurface = (value: number) => {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === cuboid?.parentId) {\r\n updateLyWithChildren(e as CuboidModel, value);\r\n }\r\n }\r\n };\r\n\r\n const updateLyWithChildren = (parent: CuboidModel, value: number) => {\r\n // store children's relative positions\r\n const children = getChildren(parent.id);\r\n const azimuth = parent.rotation[2];\r\n denormalizedPositionMapRef.current.clear(); // this map is for one-time use with each foundation\r\n denormalizedVerticesMapRef.current.clear();\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (Util.isIdentical(c.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // top face\r\n switch (c.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const p = new Vector2(c.cx * parent.lx, c.cy * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth);\r\n denormalizedPositionMapRef.current.set(c.id, p);\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy));\r\n break;\r\n case ObjectType.Polygon:\r\n const polygon = c as PolygonModel;\r\n const arr: Vector2[] = [];\r\n for (const v of polygon.vertices) {\r\n arr.push(new Vector2(v.x * parent.lx, v.y * parent.ly).rotateAround(ORIGIN_VECTOR2, azimuth));\r\n }\r\n denormalizedVerticesMapRef.current.set(c.id, arr);\r\n oldChildrenVerticesMapRef.current.set(\r\n c.id,\r\n polygon.vertices.map((v) => ({ ...v })),\r\n );\r\n break;\r\n }\r\n }\r\n if (Util.isPlantOrHuman(c)) {\r\n oldChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n }\r\n }\r\n }\r\n // update cuboid width\r\n updateElementLyById(parent.id, value);\r\n // update children's relative positions\r\n if (children.length > 0) {\r\n for (const c of children) {\r\n if (Util.isIdentical(c.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // top face\r\n switch (c.type) {\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n const p = denormalizedPositionMapRef.current.get(c.id);\r\n if (p) {\r\n const relativePos = new Vector2(p.x, p.y).rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newCy = relativePos.y / value;\r\n updateElementCyById(c.id, newCy);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, newCy));\r\n }\r\n break;\r\n case ObjectType.Polygon:\r\n const arr = denormalizedVerticesMapRef.current.get(c.id);\r\n if (arr) {\r\n const newVertices: Point2[] = [];\r\n for (const v of arr) {\r\n const relativePos = v.rotateAround(ORIGIN_VECTOR2, -azimuth);\r\n const newX = relativePos.x / parent.lx;\r\n const newY = relativePos.y / value;\r\n newVertices.push({ x: newX, y: newY } as Point2);\r\n }\r\n updatePolygonVerticesById(c.id, newVertices);\r\n newChildrenVerticesMapRef.current.set(\r\n c.id,\r\n newVertices.map((v) => ({ ...v })),\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n if (Util.isPlantOrHuman(c)) {\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cx, c.cy, c.cz));\r\n oldChildrenParentIdMapRef.current.set(c.id, parent.id);\r\n // top, north, south face\r\n if (\r\n Math.abs(c.cz - parent.lz / 2) < ZERO_TOLERANCE ||\r\n Math.abs(Math.abs(c.cx) - parent.lx / 2) < ZERO_TOLERANCE\r\n ) {\r\n // check fall off\r\n if (Math.abs(c.cy) - value / 2 > 0) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, c);\r\n }\r\n }\r\n // north and south face\r\n else if (Math.abs(Math.abs(c.cy) - parent.ly / 2) < ZERO_TOLERANCE) {\r\n const newCy = (c.cy > 0 ? value : -value) / 2;\r\n updateElementCyById(c.id, newCy);\r\n newChildrenPositionsMapRef.current.set(c.id, new Vector3(c.cz, newCy, c.cz));\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLy = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n // cuboid via selected element may be outdated, make sure that we get the latest\r\n const c = getElementById(cuboid.id);\r\n const oldLy = c ? c.ly : cuboid.ly;\r\n rejectedValue.current = undefined;\r\n rejectRef.current = rejectChange(value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLy);\r\n } else {\r\n oldChildrenPositionsMapRef.current.clear();\r\n newChildrenPositionsMapRef.current.clear();\r\n oldChildrenVerticesMapRef.current.clear();\r\n newChildrenVerticesMapRef.current.clear();\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLysSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Cuboid &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldLysSelected.set(elem.id, elem.ly);\r\n updateLyWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysSelected,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.oldChildrenVerticesMap &&\r\n undoableChangeSelected.oldChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldSizes.entries()) {\r\n updateElementLyById(id, undoableChangeSelected.newSize as number);\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (\r\n undoableChangeSelected.newChildrenVerticesMap &&\r\n undoableChangeSelected.newChildrenVerticesMap.size > 0\r\n ) {\r\n for (const [id, vs] of undoableChangeSelected.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface: {\r\n const oldLysAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && elem.parentId === cuboid.parentId && !elem.locked) {\r\n oldLysAll.set(elem.id, elem.ly);\r\n updateLyWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateOnSurface(undoableChangeAll.newSize as number);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLysAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && !elem.locked) {\r\n oldLysAll.set(elem.id, elem.ly);\r\n updateLyWithChildren(elem as CuboidModel, value);\r\n }\r\n }\r\n // the following also populates the above two maps in ref\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldSizes: oldLysAll,\r\n newSize: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLyById(id, ly as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.oldChildrenVerticesMap && undoableChangeAll.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldSizes.entries()) {\r\n updateElementLyById(id, undoableChangeAll.newSize as number);\r\n }\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChangeAll.newChildrenVerticesMap && undoableChangeAll.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChangeAll.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeGroupChange;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n updateLyWithChildren(cuboid, value);\r\n const undoableChange = {\r\n name: 'Set Cuboid Width',\r\n timestamp: Date.now(),\r\n oldSize: oldLy,\r\n newSize: value,\r\n resizedElementId: cuboid.id,\r\n resizedElementType: cuboid.type,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenVerticesMap: new Map(oldChildrenVerticesMapRef.current),\r\n newChildrenVerticesMap: new Map(newChildrenVerticesMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateElementLyById(cuboid.id, undoableChange.oldSize as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.oldChildrenVerticesMap && undoableChange.oldChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.oldChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateElementLyById(cuboid.id, undoableChange.newSize as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n if (undoableChange.newChildrenVerticesMap && undoableChange.newChildrenVerticesMap.size > 0) {\r\n for (const [id, vs] of undoableChange.newChildrenVerticesMap.entries()) {\r\n updatePolygonVerticesById(id, vs);\r\n }\r\n }\r\n },\r\n } as UndoableSizeChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLy(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLy(inputValue);\r\n };\r\n\r\n const rejectMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 500] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsOnSameSurface', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSelectedCuboids', lang)}\r\n {i18n.t('cuboidMenu.AllCuboids', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default CuboidWidthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CuboidModel } from 'src/models/CuboidModel';\r\nimport { GROUND_ID, ORIGIN_VECTOR2, ZERO_TOLERANCE } from 'src/constants';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { Object3D, Vector2, Vector3 } from 'three';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { invalidate } from '@react-three/fiber';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst CuboidHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getParent = useStore(Selector.getParent);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementLzById = useStore(Selector.updateElementLzById);\r\n const updateElementCzById = useStore(Selector.updateElementCzById);\r\n const updateElementLzForAll = useStore(Selector.updateElementLzForAll);\r\n const updateElementCzForAll = useStore(Selector.updateElementCzForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const setElementPosition = useStore(Selector.setElementPosition);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(cuboid?.lz ?? 0);\r\n const oldChildrenParentIdMapRef = useRef>(new Map());\r\n const newChildrenParentIdMapRef = useRef>(new Map());\r\n const oldChildrenPositionsMapRef = useRef>(new Map());\r\n const newChildrenPositionsMapRef = useRef>(new Map());\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const updateLzAndCz = (id: string, value: number) => {\r\n updateElementLzById(id, value);\r\n updateElementCzById(id, value / 2);\r\n };\r\n\r\n const updateLzAndCzOnSurface = (value: number) => {\r\n if (!cuboid) return;\r\n const parent = getParent(cuboid);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === parent.id) {\r\n updateElementLzById(e.id, value);\r\n updateElementCzById(e.id, value / 2);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const updateLzAndCzAboveBase = (value: number) => {\r\n if (!cuboid) return;\r\n const baseId = Util.getBaseId(cuboid.id);\r\n if (baseId) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && Util.getBaseId(e.id) === baseId) {\r\n updateElementLzById(e.id, value);\r\n updateElementCzById(e.id, value / 2);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const needChange = (lz: number) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n const baseId = Util.getBaseId(cuboid?.id);\r\n if (baseId && baseId !== GROUND_ID) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && e.parentId && e.parentId !== GROUND_ID && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (baseId === Util.getBaseId(c.id)) {\r\n if (Math.abs(c.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Cuboid &&\r\n e.parentId !== GROUND_ID &&\r\n e.parentId === cuboid?.parentId &&\r\n !e.locked\r\n ) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(c.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(cuboid?.lz - lz) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getObjectChildById = (object: Object3D | null | undefined, id: string) => {\r\n if (object === null || object === undefined) return null;\r\n for (const obj of object.children) {\r\n if (obj.name.includes(`${id}`)) {\r\n return obj;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const handleDetachParent = (parentObject: Object3D | null, parent: ElementModel, curr: ElementModel) => {\r\n if (parentObject) {\r\n for (const obj of parentObject.children) {\r\n if (obj.name.includes(`${curr.id}`)) {\r\n useRefStore.getState().contentRef?.current?.add(obj);\r\n break;\r\n }\r\n }\r\n curr.parentId = GROUND_ID;\r\n const absPos = new Vector2(curr.cx, curr.cy)\r\n .rotateAround(ORIGIN_VECTOR2, -parent.rotation[2])\r\n .add(new Vector2(parent.cx, parent.cy));\r\n curr.cx = absPos.x;\r\n curr.cy = absPos.y;\r\n curr.cz = 0;\r\n newChildrenPositionsMapRef.current.set(curr.id, new Vector3(absPos.x, absPos.y, 0));\r\n newChildrenParentIdMapRef.current.set(curr.id, GROUND_ID);\r\n }\r\n };\r\n\r\n const updateCzOfChildren = (parent: ElementModel, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === parent.id) {\r\n oldChildrenParentIdMapRef.current.set(e.id, parent.id);\r\n oldChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, e.cz));\r\n if (Util.isPlantOrHuman(e)) {\r\n // top face\r\n if (Math.abs(e.cz - parent.lz / 2) < ZERO_TOLERANCE) {\r\n e.cz = value / 2;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, value / 2));\r\n }\r\n // side faces\r\n else {\r\n // check fall off\r\n const newRelZ = e.cz + parent.cz - value / 2;\r\n if (Math.abs(newRelZ) > value / 2) {\r\n const contentRef = useRefStore.getState().contentRef;\r\n const parentObject = getObjectChildById(contentRef?.current, parent.id);\r\n handleDetachParent(parentObject, parent, e);\r\n } else {\r\n e.cz = newRelZ;\r\n newChildrenPositionsMapRef.current.set(e.id, new Vector3(e.cx, e.cy, newRelZ));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const attachToObjectGroup = (\r\n attachParentId: string | null | undefined,\r\n currParentId: string | null | undefined,\r\n currId: string,\r\n ) => {\r\n if (!attachParentId || !currParentId) return;\r\n const contentRef = useRefStore.getState().contentRef;\r\n const currParentObj = getObjectChildById(contentRef?.current, currParentId);\r\n const currObj = getObjectChildById(currParentId === GROUND_ID ? contentRef?.current : currParentObj, currId);\r\n if (currObj && contentRef?.current) {\r\n if (attachParentId === GROUND_ID) {\r\n contentRef.current.add(currObj);\r\n } else {\r\n const attachParentObj = getObjectChildById(contentRef.current, attachParentId);\r\n attachParentObj?.add(currObj);\r\n }\r\n invalidate();\r\n }\r\n };\r\n\r\n const setParentIdById = (parentId: string | null | undefined, elementId: string) => {\r\n if (!parentId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === elementId) {\r\n e.parentId = parentId;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLzAndCzInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.lz = value;\r\n e.cz = value / 2;\r\n } else {\r\n const lz = map.get(e.id);\r\n if (lz !== undefined) {\r\n e.lz = lz;\r\n e.cz = lz / 2;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLz = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLzsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLzsSelected.set(elem.id, elem.lz);\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Height for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsSelected,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n updateLzAndCzInMap(undoableChangeSelected.oldValues as Map);\r\n if (\r\n undoableChangeSelected.oldChildrenPositionsMap &&\r\n undoableChangeSelected.oldChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newCz = undoableChangeSelected.newValue as number;\r\n updateLzAndCzInMap(undoableChangeSelected.oldValues as Map, newCz);\r\n if (\r\n undoableChangeSelected.newChildrenPositionsMap &&\r\n undoableChangeSelected.newChildrenPositionsMap.size > 0\r\n ) {\r\n for (const [id, ps] of undoableChangeSelected.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeSelected.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeSelected.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateLzAndCzInMap(oldLzsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLzsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid) {\r\n oldLzsAll.set(elem.id, elem.lz);\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsAll,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lz] of undoableChangeAll.oldValues.entries()) {\r\n updateLzAndCz(id, lz as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newCz = undoableChangeAll.newValue as number;\r\n updateElementLzForAll(ObjectType.Cuboid, newCz);\r\n updateElementCzForAll(ObjectType.Cuboid, newCz / 2);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementLzForAll(ObjectType.Cuboid, value);\r\n updateElementCzForAll(ObjectType.Cuboid, value / 2);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation: {\r\n const oldLzsAll = new Map();\r\n const baseId = Util.getBaseId(cuboid.id);\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && Util.getBaseId(elem.id) === baseId) {\r\n oldLzsAll.set(elem.id, elem.lz);\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Cuboids Above Same Base',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsAll,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lz] of undoableChangeAll.oldValues.entries()) {\r\n updateLzAndCz(id, lz as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newCz = undoableChangeAll.newValue as number;\r\n updateLzAndCzAboveBase(newCz);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLzAndCzAboveBase(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface: {\r\n const oldLzsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && elem.parentId === cuboid.parentId) {\r\n oldLzsAll.set(elem.id, elem.lz);\r\n updateCzOfChildren(elem, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Cuboids on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLzsAll,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n undo: () => {\r\n for (const [id, lz] of undoableChangeAll.oldValues.entries()) {\r\n updateLzAndCz(id, lz as number);\r\n }\r\n if (undoableChangeAll.oldChildrenPositionsMap && undoableChangeAll.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const newCz = undoableChangeAll.newValue as number;\r\n updateLzAndCzOnSurface(newCz);\r\n if (undoableChangeAll.newChildrenPositionsMap && undoableChangeAll.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChangeAll.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChangeAll.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChangeAll.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLzAndCzOnSurface(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n default:\r\n // cuboid via selected element may be outdated, make sure that we get the latest\r\n const c = getElementById(cuboid.id);\r\n const oldLz = c ? c.lz : cuboid.lz;\r\n updateCzOfChildren(cuboid, value);\r\n updateLzAndCz(cuboid.id, value);\r\n const undoableChange = {\r\n name: 'Set Cuboid Width',\r\n timestamp: Date.now(),\r\n oldValue: oldLz,\r\n newValue: value,\r\n oldChildrenPositionsMap: new Map(oldChildrenPositionsMapRef.current),\r\n newChildrenPositionsMap: new Map(newChildrenPositionsMapRef.current),\r\n oldChildrenParentIdMap: new Map(oldChildrenParentIdMapRef.current),\r\n newChildrenParentIdMap: new Map(newChildrenParentIdMapRef.current),\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n undo: () => {\r\n updateLzAndCz(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n if (undoableChange.oldChildrenPositionsMap && undoableChange.oldChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.oldChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(oldParentId, newParentId, id);\r\n setParentIdById(oldParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateLzAndCz(undoableChange.changedElementId, undoableChange.newValue as number);\r\n if (undoableChange.newChildrenPositionsMap && undoableChange.newChildrenPositionsMap.size > 0) {\r\n for (const [id, ps] of undoableChange.newChildrenPositionsMap.entries()) {\r\n setElementPosition(id, ps.x, ps.y, ps.z);\r\n const oldParentId = undoableChange.oldChildrenParentIdMap?.get(id);\r\n const newParentId = undoableChange.newChildrenParentIdMap?.get(id);\r\n if (oldParentId && newParentId && oldParentId !== newParentId) {\r\n attachToObjectGroup(newParentId, oldParentId, id);\r\n setParentIdById(newParentId, id);\r\n }\r\n }\r\n }\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.cuboidHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setLz(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 1000] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisCuboid', lang)}\r\n {cuboid?.parentId !== GROUND_ID && (\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsOnSameSurface', lang)}\r\n \r\n )}\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsAboveSameBase', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSelectedCuboids', lang)}\r\n {i18n.t('cuboidMenu.AllCuboids', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CuboidHeightInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { CuboidModel } from '../../../models/CuboidModel';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst CuboidAzimuthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateElementRotationById = useStore(Selector.updateElementRotationById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n // reverse the sign because rotation angle is positive counterclockwise whereas azimuth is positive clockwise\r\n const [inputValue, setInputValue] = useState(cuboid ? -cuboid.rotation[2] ?? 0 : 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const updateOnSurface = (value: number) => {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && e.parentId === cuboid?.parentId) {\r\n updateElementRotationById(e.id, 0, 0, -value);\r\n }\r\n }\r\n };\r\n\r\n const needChange = (azimuth: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(-c.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && e.parentId === cuboid?.parentId && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(-c.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType: {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const c = e as CuboidModel;\r\n if (Math.abs(-c.rotation[2] - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n if (Math.abs((cuboid ? -cuboid.rotation[2] ?? 0 : 0) - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value?: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (map.has(e.id)) {\r\n if (value !== undefined) {\r\n e.rotation[2] = value;\r\n } else {\r\n const rot = map.get(e.id);\r\n if (rot !== undefined) {\r\n e.rotation[2] = -rot;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setAzimuth = (value: number) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldAzimuthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Cuboid &&\r\n !elem.locked &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldAzimuthsSelected.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Azimuth for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n updateInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n -undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldAzimuthsSelected, -value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface: {\r\n const oldAzimuthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && elem.parentId === cuboid.parentId && !elem.locked) {\r\n oldAzimuthsAll.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Azimuth for All Cuboids on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, az] of undoableChangeAll.oldValues.entries()) {\r\n updateElementRotationById(id, 0, 0, -(az as number));\r\n }\r\n },\r\n redo: () => {\r\n updateOnSurface(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateOnSurface(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldAzimuthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && !elem.locked) {\r\n oldAzimuthsAll.set(elem.id, -elem.rotation[2]);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Azimuth for All Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldAzimuthsAll,\r\n newValue: value,\r\n undo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, -undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateInMap(oldAzimuthsAll, -value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n // should list here, so it doesn't go to default, but ignore\r\n break;\r\n default:\r\n // cuboid via selected element may be outdated, make sure that we get the latest\r\n const c = getElementById(cuboid.id);\r\n const oldAzimuth = c ? -c.rotation[2] : -cuboid.rotation[2];\r\n const undoableChange = {\r\n name: 'Set Cuboid Azimuth',\r\n timestamp: Date.now(),\r\n oldValue: oldAzimuth,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n undo: () => {\r\n updateElementRotationById(undoableChange.changedElementId, 0, 0, -(undoableChange.oldValue as number));\r\n },\r\n redo: () => {\r\n updateElementRotationById(undoableChange.changedElementId, 0, 0, -(undoableChange.newValue as number));\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementRotationById(cuboid.id, 0, 0, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAzimuth(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n `${value}°`}\r\n onChange={(value) => {\r\n setInputValue(Util.toRadians(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [-180°, 180°]\r\n
\r\n {i18n.t('message.AzimuthOfNorthIsZero', lang)}\r\n
\r\n {i18n.t('message.CounterclockwiseAzimuthIsPositive', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllCuboidsOnSameSurface', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSelectedCuboids', lang)}\r\n {i18n.t('cuboidMenu.AllCuboids', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CuboidAzimuthInput;\r\n","export default __webpack_public_path__ + \"static/media/building_facade_05_menu.8fe3496b.png\";","export default __webpack_public_path__ + \"static/media/building_facade_06_menu.4342d26b.png\";","export default __webpack_public_path__ + \"static/media/building_facade_10_menu.de5158c9.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport CuboidTexture01Icon from '../../../resources/building_facade_01_menu.png';\r\nimport CuboidTexture02Icon from '../../../resources/building_facade_02_menu.png';\r\nimport CuboidTexture03Icon from '../../../resources/building_facade_03_menu.png';\r\nimport CuboidTexture04Icon from '../../../resources/building_facade_04_menu.png';\r\nimport CuboidTexture05Icon from '../../../resources/building_facade_05_menu.png';\r\nimport CuboidTexture06Icon from '../../../resources/building_facade_06_menu.png';\r\nimport CuboidTexture07Icon from '../../../resources/building_facade_07_menu.png';\r\nimport CuboidTexture08Icon from '../../../resources/building_facade_08_menu.png';\r\nimport CuboidTexture09Icon from '../../../resources/building_facade_09_menu.png';\r\nimport CuboidTexture10Icon from '../../../resources/building_facade_10_menu.png';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { CuboidTexture, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { CuboidModel } from '../../../models/CuboidModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst CuboidTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.cuboidActionScope);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const selectedSideIndex = useStore(Selector.selectedSideIndex);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(\r\n cuboid && cuboid.textureTypes && selectedSideIndex >= 0\r\n ? cuboid.textureTypes[selectedSideIndex]\r\n : CuboidTexture.NoTexture,\r\n );\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n useEffect(() => {\r\n if (cuboid) {\r\n setSelectedTexture(\r\n cuboid.textureTypes && selectedSideIndex >= 0\r\n ? cuboid.textureTypes[selectedSideIndex]\r\n : CuboidTexture.NoTexture,\r\n );\r\n }\r\n }, [cuboid, selectedSideIndex]);\r\n\r\n const updateCuboidTextureBySide = (side: number, id: string, texture: CuboidTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && e.id === id && !e.locked) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.textureTypes) {\r\n cuboid.textureTypes = new Array(6);\r\n cuboid.textureTypes.fill(CuboidTexture.NoTexture);\r\n }\r\n cuboid.textureTypes[side] = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidTextureById = (id: string, texture: CuboidTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && e.id === id && !e.locked) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.textureTypes) {\r\n cuboid.textureTypes = new Array(6);\r\n cuboid.textureTypes.fill(CuboidTexture.NoTexture);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.textureTypes[i] = texture;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidTextureInMap = (map: Map, texture?: CuboidTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && map.has(e.id)) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.textureTypes) {\r\n cuboid.textureTypes = new Array(6);\r\n cuboid.textureTypes.fill(CuboidTexture.NoTexture);\r\n }\r\n if (texture !== undefined) {\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.textureTypes[i] = texture;\r\n }\r\n } else {\r\n const textures = map.get(e.id);\r\n if (textures && textures.length >= 4) {\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.textureTypes[i] = textures[i];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateCuboidTextureForAll = (texture: CuboidTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const cuboid = e as CuboidModel;\r\n if (!cuboid.textureTypes) {\r\n cuboid.textureTypes = new Array(6);\r\n cuboid.textureTypes.fill(CuboidTexture.NoTexture);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n cuboid.textureTypes[i] = texture;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (texture: CuboidTexture) => {\r\n if (!cuboid) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const cm = e as CuboidModel;\r\n if (cm.textureTypes) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (texture !== cm.textureTypes[i]) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Cuboid && !e.locked) {\r\n const cm = e as CuboidModel;\r\n if (cm.textureTypes) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (texture !== cm.textureTypes[i]) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisObject:\r\n if (cuboid.textureTypes) {\r\n // do not check the top and bottom sides, check only the vertical sides (the first four)\r\n for (let i = 0; i < 4; i++) {\r\n if (texture !== cuboid.textureTypes[i]) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (selectedSideIndex >= 0 && cuboid.textureTypes) {\r\n if (texture !== cuboid.textureTypes[selectedSideIndex]) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTexture = (value: CuboidTexture) => {\r\n if (!cuboid) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n const cm = elem as CuboidModel;\r\n oldTexturesSelected.set(elem.id, cm.textureTypes ? [...cm.textureTypes] : undefined);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, tx] of undoableChangeSelected.oldValues.entries()) {\r\n if (tx && Array.isArray(tx)) {\r\n for (let i = 0; i < tx.length; i++) {\r\n updateCuboidTextureBySide(i, id, tx[i] as CuboidTexture);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidTextureInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as CuboidTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateCuboidTextureInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceTextures)\r\n state.actionState.cuboidFaceTextures = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceTextures[i] = value;\r\n }\r\n });\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Cuboid) {\r\n const cm = elem as CuboidModel;\r\n oldTexturesAll.set(elem.id, cm.textureTypes ? [...cm.textureTypes] : undefined);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Cuboids',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, tx] of undoableChangeAll.oldValues.entries()) {\r\n if (tx && Array.isArray(tx)) {\r\n for (let i = 0; i < tx.length; i++) {\r\n updateCuboidTextureBySide(i, id, tx[i] as CuboidTexture);\r\n }\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidTextureForAll(undoableChangeAll.newValue as CuboidTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateCuboidTextureForAll(value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceTextures)\r\n state.actionState.cuboidFaceTextures = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceTextures[i] = value;\r\n }\r\n });\r\n break;\r\n }\r\n case Scope.OnlyThisObject:\r\n const oldTextures = cuboid.textureTypes ? [...cuboid.textureTypes] : undefined;\r\n const undoableChange = {\r\n name: 'Set Texture for All Sides of Selected Cuboid',\r\n timestamp: Date.now(),\r\n oldValue: oldTextures,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n undo: () => {\r\n if (undoableChange.oldValue && Array.isArray(undoableChange.oldValue)) {\r\n for (let i = 0; i < undoableChange.oldValue.length; i++) {\r\n updateCuboidTextureBySide(\r\n i,\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue[i] as CuboidTexture,\r\n );\r\n }\r\n }\r\n },\r\n redo: () => {\r\n updateCuboidTextureById(undoableChange.changedElementId, undoableChange.newValue as CuboidTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateCuboidTextureById(cuboid.id, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceTextures)\r\n state.actionState.cuboidFaceTextures = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ];\r\n for (let i = 0; i < 4; i++) {\r\n state.actionState.cuboidFaceTextures[i] = value;\r\n }\r\n });\r\n break;\r\n default:\r\n if (selectedSideIndex >= 0) {\r\n const oldTexture = cuboid.textureTypes ? cuboid.textureTypes[selectedSideIndex] : CuboidTexture.NoTexture;\r\n const undoableChange = {\r\n name: 'Set Texture for Selected Side of Cuboid',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: cuboid.id,\r\n changedElementType: cuboid.type,\r\n changedSideIndex: selectedSideIndex,\r\n undo: () => {\r\n if (undoableChange.changedSideIndex !== undefined) {\r\n updateCuboidTextureBySide(\r\n undoableChange.changedSideIndex,\r\n undoableChange.changedElementId,\r\n undoableChange.oldValue as CuboidTexture,\r\n );\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChange.changedSideIndex !== undefined) {\r\n updateCuboidTextureBySide(\r\n undoableChange.changedSideIndex,\r\n undoableChange.changedElementId,\r\n undoableChange.newValue as CuboidTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateCuboidTextureBySide(selectedSideIndex, cuboid.id, value);\r\n setApplyCount(applyCount + 1);\r\n setCommonStore((state) => {\r\n if (!state.actionState.cuboidFaceTextures)\r\n state.actionState.cuboidFaceTextures = [\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n CuboidTexture.NoTexture,\r\n ];\r\n state.actionState.cuboidFaceTextures[selectedSideIndex] = value;\r\n });\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n if (cuboid?.textureTypes && selectedSideIndex >= 0) {\r\n setSelectedTexture(cuboid.textureTypes[selectedSideIndex]);\r\n }\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('cuboidMenu.OnlyThisSide', lang)}\r\n {i18n.t('cuboidMenu.AllSidesOfThisCuboid', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSidesOfSelectedCuboids', lang)}\r\n \r\n {i18n.t('cuboidMenu.AllSidesOfAllCuboids', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CuboidTextureSelection;\r\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QsaFQUnALmGzgAAGb9JREFUeJx1nF2PpUly138RmedUdU13T+8uq7Vh0ZgFBOYKrBHSyogbuEKWuONTwRfgGyAkLiwsmQsuLPDFSggbjI0xy2Bm7WHGO9PTvTNTXS9PRnAREZl5apejmT5V5zzPk5nx8o9/RGSW/PN//VvOcEC4eIkgOAI4wtX1mY/+y+/xH998wLf//j/B7r/G3dddPm/L35V2dcOXP/o3nL/zV7j+lQ/xcZfjyHadz/tdBMz46j/8S158+E+Rl38JTEFARBAkp+mAY+Y4ir/5Ux4++gOeffgb2DEARQRUlMsJGsMMPT3j89/7LX549af83Q8/5P7hcc0nV3whB3e6dj797FOev3jOs5sbzD3nHt8Ts5t3qio/e/2aT/7sY371136Nh4dHtC54ImpEwOGkjU4KnHqkgOOIey5b0ZytisDxgByPcAzEDRBUFXNLoWmJHHXH3fB6txrJY0zZl+/5n8W1IxYsDFRCwO4DfC1ccoaMgVuMA4ZqKgPDp4hiVprzmgbwxC5ENmVssxPJNYmAh+EgIA4iumZkIQdEUG24CO75JA/DWgayjZTfdXXB5pcxURFBRMIDpJYkiDiqIKq0FgPFKI6Koqo5uTQCicm62Vy1l6UvNeQ/MmctbukEgqrkfAA0vleJZ6WnGY7ZgbiAKKptE+ku9JCMSxihu+PpcVNQks92EAVxQTyvL/m4L7MTT4OL6e0CF5WSBI6nYTs56VChhjIAzKFL3ZPXxQxjUvVsxwBLhSgGuPmFkkNGTqi3LARUwsJDGJt1bO4rIpg74hoCtIG5cVINhZRwRfDNglVgSD3DcZc0iqeYsF7uZdYe/lLGENAQwq9n+rRR3B1zxzefS7HHJ2VMIin8WItIQ9yXYcwx5GKMtB46IhgWGncprWz2demyTZWmDWsd3MJDVDn3E8MsoAtBRBFV8IFKCMpNlgdq3F6upGlFlO010KYx/uZBtTCBGMsbKkITQbugef/6Z4tRhJGJaBiQGWK7aPPpqTSZEgvtz/BVAtkM5VJFCfExyIKB9DZJ41W2MJHG2X1aSFlQwNSciCTAeIR4caP3ho2Go9hwVAXtDUxgQGthpd40BzVEW4yjCxJFfcY4z8BmaU0FCWvBZfmecSbEJ6rpNTYpCAlvksEdDBdQC+MLOD4wtxD0Js8p71TK7tguoM6EtSWvXYb5PFlGgAqSxsh8S9iaSBly7mChtZjFim6bgtIeI9C71bBhDQk5KpIOVrORCKy+8HmfuOfny+qe4Djb98t242eX6QERQAuCLIO5ZyyT9PHyckFdIxQxGHg5wxbRduNkjYkwzBhS3ulPrltjeAb/uA68Yv4Fv9iRiNIeivnUpLuFVTyhfYvTWMQTkX3e26V6IfzJjFYQSOVd4nwFyxnHnsy1LN01LUo1gmESBMkvhPSWeog4pkZ4S5GDgA51Teu9kMe2li0gJ8UV9/CqEsu8Lt9niNxgVpcOLn7YDZKlfK18ozCaJ8rQYhQOhuI2UAmeTTGVdNt6eDAjLdgEH7t011A1se3z+NGnQlWCMbkCElST5rh6fFZTtmWhQgs1J7K4gjfLe6RUTM91FerLBHO2B++/+nwz2yErPTrXIQmDKspZGhTc1+p277ocAfUKXOKIy8TmykUUQQUageMBqnYZYGXheykyoFxQb+CWk1wWt9AgNeHJgFQwMxijVJM0NRaTKDiD4AyBFnyntFSCR7YYUBenBaukd7EF5m2OFy9JkRuILKiW/YKEtjJxk5RNfbt7E76N4fMJOpEjKZ0+GYJtnu4VOPOzLUeovF504b0IuA3M94lva8x7YzoNp02BeQJ7eUIxNWrZGSPQUJsqOBZopyyOrxWidFtMKCzGt1znLqypvbmOgMalz4mrv4BiRxyBCs4yvWdFRJDNOyoWCnrhoikcd1APt94Hj2xc0fIUJmcMwqobtqqAGIJB5iHFrtak1poK30WEpo0mCsnMdHpRlU+W5YexWahSdApCNaHEc+kZSONREQutrDqhWnY4+UX4PnUg6/MtWK+E2oBIBCvI72yq8EE3Zda4/cIMUm9rnGJB6T2an0pSY1cilNTkE0ukRO5ZT4pAvij8lqvXveI0VxyhFYqKX2SyRX8raXXqOslYJNObapERg9a8vUov5pmwlTvJFtt+MWyFFMYFIVklo6ps1MXxWS/ikd/rtKIl9/icVEjiuWyFQpuaChCYic4E7VScGJMUFMSUNsVw6RSuPnXtqWxhKtHFAqMtmZdsFMVjBmkhGy4thliwcIHs9Qy3OXIwMb3wypURFb7vMkuIqXnuXnRJzaYyy33L+Ir0rKjhmyxXFOneGzosBV5fK5IOrRUdRGkormDaoZ/xkTRYFVpPGJEUrtBag9Zx6VniaJc4WkqsIAd4E6T1mIyC0JDIxjbULSE7iuKmuHY4X4H2KdcdFkt7BV8VbFtr9NZQjzKMJxpIGZ8UHCuiDdVG07a4SDKqls+zFHxvykMTtHd677QkSAdP2Fl6lTm0rvSvv/jpLB8DNBFsRlqPgVQ43595vH/H1XgNb/8IHt6h5sg4UHeGGGM42APDDTdjuHB9/3/h4Tn65k+iUqwg3jLJjARLcdyPWJAfPLz7Kf0nP0Lf/klgdlOGhOdG/u24j/TShr/9guO45/j8fwVT1JZKWQDvLlTMU2nw5i+4ffaWL998wXF3IGQV7oLchOd7zuHrL1+j4xE9DobZhM0hhGG4g5KUGt7d3vHmy9d88snHyIgcwCv5zthW8cvdoTX6N7ePnMYjJi1t1DIoSeJb2NUV8M2br7n78cd89vorfBgUK8rAhbbwgoxE0q/Rz/6M8d9+h6vnr1AMMwshDsPMObJsXrHquL/n6Ndc/7V/wMO7IiqKiyLSMhgb5hGTlIYfL3j48b/n7vd/kyP7IQiYj/TAtPICCxe+fnfH+Mf/iLev3/D4OMAi7a3KhBTEOWBOb41337wDh4f7KOvLTEJrvKgJNo3K9+3XX3N/d4e6cIwB7gyYY1SyCTmGCv2vfv/7DB8TJ8ERy0Jb0TeH65Py8NWXnK5/yLO/8w+x+7sI2Fr/Z/kERVtMUm9e8LN/9y9497u/S+cRcxgWFWN3Y9RkimEo2P039Od/i6u/9xsYWVKvl8tkgcX2tXf8q59y/u+/DXbN4/0DdoyoceX1w5enaN3vzsv3X/HBBz/g9u7+gsxULPJjzKDYHJo23v/OK67ee47byOryZpBEwVBVOffOl2/f8jAOvve9X+bh8bF0wIwMCD4GFXx1QLfjkZEeEV6+ckp30Oa4OUe/YqjSrs/0986YHjOgig8SeJgNJAcfV2h3rl6+5OrmJaLKiOJ9BFkj+g1UGUG5bie+6afoSKpH8wlfxclJYyt4d/y4RfqZ/uw5vcd6vPzUZkkZxyMOmnH/EN3DYauJVcHaIRpes8inqA1Gzp6S1saL6xmWccFsBAK4rzaZb4TAibwuSzkiAs3oqCFZ2RBbZQCIJM9xpHnEYxX8eMQt616TYWw8oQJj1i1UOqdv/QB79UuoOycZ01LEolBYUDF4ALvF7q9CkEn8RbZAm8HawsyziOfIs2+jR8dOj5zwYHnuYKy6FZkjyOD8cERhselUl0h0/IIFC1n3iaS099lhbMBg2kepc1p/YU3lIaKLhCwF1hjr2qadHlROp3Dnr+U1MpJiLuvZqbLnDEJ1FQ4rFzVcrjh98EPad7+PmEWpXoL2ZrEDsQE2UH/A7MA/+mPEHsHPWe+OZ7FC7eT+0ZEc8P4H+KvvIo9BHCqZdIqyGmYD9wekC48//oO4b6OwwUR3ylw9C6dpR9vpSc0sFVM+k+zeRSbbuqiPadDkvVJcVWFxR1ujm+sTLs1MakIDinv2OnCkZwnC18SmoiY1TUaTTIrrG07PnofVi+YyAqLEdfXe7cDHgfZTPFHLBEtIA2jLi2uebng/0V/9EowjGltSRtVxV9QtrhsH9DPt+pNQSEWjuZ7ycGgS9jC7e0K2u8v4ovhqVQFA5neHV6yqz1NIF2X79L5aoghdkGjYT30Y7pEeiwt4Q7TylOo1FH5WqWCPVPs10byinTn0BmRkgpQZz6zAJGS5Iydj9MiuYy7MHvqCRZmeHH0QUD3hegNycFQOkkKcBuRg6kg/066uEb8FojUrqykyfcS8WrExtBEbdCyfZ1L+V3LejHR71iylZmI5s3qCcGjFQ3e6+nI7EQc1JLfeIAZW5eMUkB0VYdLFl8azxrktKUrxQzujRWVVM3NuIrFRwmC4ZW+sihMO7MxvGZhuRjDrZjjeOkdvYE7T7I9IJGjg2MgGsRl+vmL0E7N6PaPAYliRE8n2Tb0tT9q+uXh5PVOCmRVS7PMuDFoBP9bejXVhsi9iQ0NJ9MC9BWyRgb80XwJZwH4xsdhSo5GtXp1RLLzMoi8xJh0Thjtm4NmDn7oQmZa1jzGVVW+t084nxAWVjrgFlicx8GaYOzYEuhbXW4LdZR6qouX83B1vgRgNjUZVEaAp5Mu1W8WKHcr8ciyl2hpLrd0FxJIxqSDeEupSKe4EDUvmtAnqYgrl11LpV3yravjpjJxuEMt6U8/WJhb1Kw+erwjY4NRatmlXfAomstdCZ5EfIfr8cnpG84OsU0+hQzSnInAKerpGtVN9+Cph+Ca0kfFDcqxIfMvIcg7ukwbvSqk8p6nMQmcZ/V6wPAjGVh1eQ+gXmjMPQYtnNMt6usbv4VrGE1VsOnkyeDKSk14heo3KmHirEhm3+6roSgXy8oq0MK1Uu2jkbo0J/VFjeoZkCQZAcUZtvAt7Q3FaP6E9euTbYy4KisP8omoc7zanNQ2lQs+OFnjKLUolP9fsmmOGqRVNaECvFvmFO6kH2/T80iRrT/7EEi77wpWs7d03w7EmtN4wGyvY0lFzsBFuPxe+lSyKOEpB5NZTmVweEGWI0k4NG0Uc4jo1j+2jiemx06TlLhebc79I9Ih2mWzTEBx1YRAb4Hys/ohJ/pzX1I0+yBLManNv2Dsr7Cs0ebaVN0BdvQ6ZgXaGVrFpFrMZM9V9SVEqODrC4dBo4A2rhI1M9KrVWibsJ0RO2eDaMbjgIh1bZbHDZGguDaGF4aRlhr52ciAgp03kaQiVh2QsbSngIvJlxfLURYhcBV87TdyzWZewOaF3M3p3o2/xx/MZPWCCObHCdMwRaTEhyWLapI9VXtlccfMUT7NSJyi0Z2FQCjGD10XylCxEir3oLMeH0ivLfqJtJ+pVgLtgpvEsGrFzJi2zKHMKr7aRoi2z8oQjW96yx5I5jwJk29e8sL82HS2KW9C9aeLJqwzGy9XF6SIj+fTCLbF69NpAjTN72rNRlNRy1YA2+PIoNJpFKXqyobwPmBuXjZHw2CBbq+ZOS7jSUsruhJIWmwKcTEwzBm4hn9we5B6JIK3KGTb7Vns+VYFc3CMfpmw0R9yKrpayVLbu4aKIwfQ2fewbPGa+IhWjhF7NlrmVxXJBsm4SlFM/RXn91HFt0Q1sunnLSqwl2YVcnRB1RDt+6iAWvFuYZZeGot6iwOnp5BJlCulnSCuWhLSAjtW8l9ZANVjT+Qo/IHrmi6FVD2V4bB31do17pzucrjqHjUX7U5S1XbsBboN+ajTVyGta8SI4FTLIMrKASYUGJ1VOPVAi9i+HQsUjiAfLjUqFKvRPP/4JQ1crUivoTk+P2tOpd15//gV6+4j979/BHu8RshyRPY3Dg9FoDtB8oJ/+IecXL5GfnaOskdxdBDDJMpnNDRXmzunhNe31HyPH87T8oOOisV84tn4TtLmdOL37FN7+T/wnZ9x/PqEcbI0hgHamffPn3OodH3/0EQ8PxzSI8MW1Kc6zm9pa47NPPuHl+y+5efsaGwllHh3TqvdO48F5d3vLTz/9nOubG47jmHu5Qqp5TMNsng5QbfTzzUvMRyTlTkCGWGTVxhL6w0AO5/H/fIz7i4W5DZyGiIK0DMY9fm7X9HbD2z/6z/DxT6icYRbXJnPLcZIdjS/+nM/+4jfx6/eYrWTVOJLRhCGSQTyo9fnhjtOz72D2WS42M2CLwCoW9aY4uxGx8eHzr5EPrrl5/op+e4uPEYkjHvLwEIi3Kpk2rq6fcf3shut+BT0pqwX7m3E4jaGpoCbcvv/Id3/5LzPe3eFjRAJMHp+wpAse5ZsmSn/x/vvTkhaF9bmw8sYuytsvP4O//at869f/GcfDV6i2xWDKktPVDGinM48/Ori/+Zvo934AY0Q8EiAtOaqfia0uaFfe/qd/hb33N/CbbxG75wt311ZFx2BE7s+7T3n27ffQv/7r8HgHEjviI7mt7T0SlNcFvXrGN7//bzkdP+Jb337F3fVVMCIzDnOGxQEgdY8C5HBUG7fvbnn23nu8ePkiA3GEclVhWBy7qMNFqPB177y5veXq6iorBmBmjGEcHjAp5jAOsKib9TrZVCwphDQmtR0Zqk/SIojZHWbvwO+jDHH4tOzJv4s+jkfc7tAe+AhpsZMIOIgibgh5Oqp1vHfk5OjJk61EST82SiThmDuYhTYEHfehjOMRkceELCsAiufUFoPDwY7o61jVb8FEEY0GgomFkg5wO2KfF8mMpKNNE9qDmKjGBo5KJltvUbX2EksmyxKbvTsZU9QDUv0RaYJKBcgNPlZKobFbPFoR9N5XkGVTILGrsAqH4bWetSPPfCG9b8vAE+9iuvUOeY7E04uqc2JRXkkS0VRW58UcG2tT92S5lfUikUNttNnNGUckpebOsJVRi0DL02Ct9aTOKRFtQSTSCGOsMN5Ztc1Xa52WDNESltyLQK0GVu9t5kEa+5kWq4JKpGBkkVE0coauLQ6U/FwRcSWJE+Y8KN9RC908MWhqZqMys1JmSl50cEkWkR6HhYhsQ3Neq8qSY2z7r+KtYLQgtTY2+aSp/7+XEIrRFps3BI1zMDW/bb013dodj8fWIFW9UNK8cRtEVWmniLsdkVlzqhuKY8/UL/l36CKKZla0c06mLD8o3ao77TN3ZpOJlvQ02cpkesnjRUDXTuPYxSj77tW8VtOLmPeJjITCU3B8qe7numfmH1yWgvZ1JDBw7mcYYThR760mQ7UllsAKLTatrGsuCoxJCtLmej+BWOxcXJJfz1majxvFnQOLRElkJmtLYKtP4SQRIPZTPVRCWOfHpJi+XypdgmKjgrQMkEUwCm0qOCrJUliKF0IZnmPN0kR5y7ZMWdXgBVUy51FG5E5UiXsd9Mm+Snp6AUYC+GYri96X+GuMMvgcIqbroK3NrUrrbd7J5SsFFXtia3d3KmdaxFJMCG/h7IWWMZxH5uGfXSnuiBjb47Mlm7Eqtx4Jq+goWCYm+yqj1SWyzo2lTQK5GRufedeFIAnPqG1XIoLOQvlaQVl6KXX3AvKzMYw+vfNStJoGWf0fFc0tBLPYB3vSUtoRc3Tv6ExB1B0bZNR7unxh+oWytxLFpWeme8cWly2sRIAVFWw7VQCCtjipW7+7r5837SxYIhtHfklKtklQQ6hkFyI1pE1XKeXJZoe1W2djRc486gdrfIdZ+1IJI6lgr0XdJBExiG4G2WQQVrmFJ4kU5tmQBQGXTluQZvY0cG6FutTsElZ4Xx1R0wyoddR53zMnUrW1zC9m0ObCaPbn7++SUDR240i2N2HjSfxFZBYkC96mIVAFyYh9VW5XWbUsSWXFqbRtjBk1nI4liZ1gVgP5/HnWuShKurRcWDqltCnFBVzqUKkwjxbP69a9F7vEJ5+XScA851MHSSebIZKt8KPYqLY5EBdV6aTMtUlDJXb5u2c3kXnZUuBG080sCp7Ead55cZ1535U0Y4jQcR7z8/YLxvCCP6ntSxhRldsojCyLXVVQweyYTyv70NL3DnM7NdSlhMVTmc+ERR7W9SxhEIF2cn3PtkCe8N83FTx9lSIXoAhzp2CAc3YSL+8CLhS7gsBym+mNicfrmAIpXKWJZuU6qy1PxtiPNhAQFlnyFMzMM9ITJkOR3Ez8BDfz0gVLxfFBxRE/5qdzM3red1GK9vLB3EDnpa5Igrys0KJ2q3RadKBTieXFT5RTCe+SExFO47I89TDlOMMc+19KEbRaDQk7VXjd49C82nwZk9c2n+nsK+inLksn8XdYQurxQcUS2ayjjralJYXc5z7yeX0cDtW04joMU8i43H578IK6tJBqSCHCKetkphJnRjx6GOfrM/3cMIwhURtrkp5bkryIWRsBESG2n8aSzQN4RgbUFZgX4fAUVMSW9O4t5q29utm+tZCnzoAX+3sHZcDyZF5xjSZL7NVnmKvJOU1UETgwemq6x+HoC6z29CRJOICqV8Xv83jDFFYuUyqOPLFJVaQTO0T6KcruwPl84tn1NQ8PRxTrRpzwOloJJnG74EwS/mqm0zKjVgdrF5nn98L8ay2pP0nvtUWgKt448yDoJAz5z+yR1UHVGY585ms7bJcse3Xi4kG5fcZjk0P21FLQ+XwRRHoWzqpvnZOZLCaGURzJIpzXX+jZaOaEOS+GYrGxW4PzuyhWOYAozolB49EfcrdhCO/wwTUGLQuG1OaV6vD5FCR5Xf35D9xnRj7p+GaUuOGZMVhuipA0NKM2vZWgme1nq30JGeOGC+0CTgs9oIiVA731nkcC8hJZ26UjlzYGUWvp2hnHO8bdF8jxbm6CwPPPbmC4H9F38OirHN+8ReR/wPkx9tUKi8aWgjLeWCZXp/svcL3Gj9ccAuSOx8cmPJwaxxGNIxXBVeHuLQ+f/Ff46tMEwgGqdG0JtXl+JYuIpop99Idc/corTqcTvR8hDsu/+5XeNgWN03qbjtaackidSJZlsFIGV4AQCmxSyUQY/4gdgTMWu8cxJHXl/wF7wyDkiccElwAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu, Modal } from 'antd';\r\nimport { Copy, Cut, Lock, Paste } from '../menuItems';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { CuboidTexture, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableRemoveAllChildren } from '../../../undo/UndoableRemoveAllChildren';\r\nimport CuboidColorSelection from './cuboidColorSelection';\r\nimport CuboidLengthInput from './cuboidLengthInput';\r\nimport CuboidWidthInput from './cuboidWidthInput';\r\nimport CuboidHeightInput from './cuboidHeightInput';\r\nimport CuboidAzimuthInput from './cuboidAzimuthInput';\r\nimport CuboidTextureSelection from './cuboidTextureSelection';\r\nimport { CuboidModel } from '../../../models/CuboidModel';\r\nimport { UndoableAdd } from '../../../undo/UndoableAdd';\r\nimport {\r\n UNIT_VECTOR_NEG_X,\r\n UNIT_VECTOR_NEG_Y,\r\n UNIT_VECTOR_POS_X,\r\n UNIT_VECTOR_POS_Y,\r\n UNIT_VECTOR_POS_Z,\r\n} from '../../../constants';\r\nimport { ElementCounter } from '../../../stores/ElementCounter';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport { Util } from 'src/Util';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\n\r\nexport const CuboidMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const countAllOffspringsByType = useStore(Selector.countAllOffspringsByTypeAtOnce);\r\n const removeAllChildElementsByType = useStore(Selector.removeAllChildElementsByType);\r\n const setActionScope = useStore(Selector.setCuboidActionScope);\r\n const addElement = useStore(Selector.addElement);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const selectedSideIndex = useStore(Selector.selectedSideIndex);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n\r\n const cuboid = useSelectedElement(ObjectType.Cuboid) as CuboidModel;\r\n\r\n const [colorDialogVisible, setColorDialogVisible] = useState(false);\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [heightDialogVisible, setHeightDialogVisible] = useState(false);\r\n const [azimuthDialogVisible, setAzimuthDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(cuboid);\r\n const showLabel = useLabelShow(cuboid);\r\n const updateLabelText = useLabelText(cuboid, labelText);\r\n const setLabelFontSize = useLabelFontSize(cuboid);\r\n const setLabelSize = useLabelSize(cuboid);\r\n const setLabelColor = useLabelColor(cuboid);\r\n const setLabelHeight = useLabelHeight(cuboid);\r\n\r\n if (!cuboid) return null;\r\n\r\n const counterUnlocked = cuboid ? countAllOffspringsByType(cuboid.id, false) : new ElementCounter();\r\n const editable = !cuboid?.locked;\r\n const lang = { lng: language };\r\n\r\n const legalToPaste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const e = elementsToPaste[0];\r\n if (\r\n e.type === ObjectType.Human ||\r\n e.type === ObjectType.Tree ||\r\n e.type === ObjectType.Flower ||\r\n e.type === ObjectType.Polygon ||\r\n e.type === ObjectType.Sensor ||\r\n e.type === ObjectType.SolarPanel ||\r\n e.type === ObjectType.Cuboid\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const toggleGroupMaster = () => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === cuboid.id) {\r\n (e as CuboidModel).enableGroupMaster = !(e as CuboidModel).enableGroupMaster;\r\n break;\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n };\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n \r\n {editable && }\r\n \r\n\r\n \r\n {\r\n const undoableCheck = {\r\n name: 'Group Master',\r\n timestamp: Date.now(),\r\n checked: e.target.checked,\r\n selectedElementId: cuboid.id,\r\n selectedElementType: cuboid.type,\r\n undo: () => toggleGroupMaster(),\r\n redo: () => toggleGroupMaster(),\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n toggleGroupMaster();\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.GroupMaster', { lng: language })}\r\n \r\n \r\n\r\n \r\n {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === cuboid.id) {\r\n const stackable = !(e as CuboidModel).stackable;\r\n (e as CuboidModel).stackable = stackable;\r\n state.actionState.cuboidStackable = stackable;\r\n break;\r\n }\r\n }\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.Stackable', { lng: language })}\r\n \r\n \r\n\r\n {counterUnlocked.gotSome() && (\r\n \r\n {counterUnlocked.sensorCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllSensorsOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.sensorCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Sensors', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Sensor && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Sensor);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllSensorChildren = {\r\n name: 'Remove All Sensors on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllSensorChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllSensorChildren.parentId, ObjectType.Sensor);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllSensorChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedSensors', lang)} ({counterUnlocked.sensorCount}{' '}\r\n {i18n.t('cuboidMenu.Sensors', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.solarPanelCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllSolarPanelsOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.solarPanelModuleCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.SolarPanels', lang) +\r\n ', ' +\r\n counterUnlocked.solarPanelCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Racks', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) => !e.locked && e.type === ObjectType.SolarPanel && e.parentId === cuboid.id,\r\n );\r\n removeAllChildElementsByType(cuboid.id, ObjectType.SolarPanel);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllSolarPanelChildren = {\r\n name: 'Remove All Solar Panels on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllSolarPanelChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(\r\n undoableRemoveAllSolarPanelChildren.parentId,\r\n ObjectType.SolarPanel,\r\n );\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllSolarPanelChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedSolarPanels', lang)}  ({counterUnlocked.solarPanelModuleCount}{' '}\r\n {i18n.t('cuboidMenu.SolarPanels', lang)},{counterUnlocked.solarPanelCount}{' '}\r\n {i18n.t('cuboidMenu.Racks', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.polygonCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllPolygonsOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.polygonCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Polygons', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Polygon && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Polygon);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllPolygonChildren = {\r\n name: 'Remove All Polygons on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllPolygonChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllPolygonChildren.parentId, ObjectType.Polygon);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllPolygonChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedPolygons', lang)} ({counterUnlocked.polygonCount}{' '}\r\n {i18n.t('cuboidMenu.Polygons', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.humanCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllHumansOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.humanCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Humans', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Human && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Human);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllHumanChildren = {\r\n name: 'Remove All Humans on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllHumanChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllHumanChildren.parentId, ObjectType.Human);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllHumanChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedHumans', lang)} ({counterUnlocked.humanCount}{' '}\r\n {i18n.t('cuboidMenu.Humans', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.treeCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllTreesOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.treeCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Trees', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Tree && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Tree);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllTreeChildren = {\r\n name: 'Remove All Trees on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllTreeChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllTreeChildren.parentId, ObjectType.Tree);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllTreeChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedTrees', lang)} ({counterUnlocked.treeCount}{' '}\r\n {i18n.t('cuboidMenu.Trees', lang)})\r\n \r\n )}\r\n\r\n {counterUnlocked.flowerCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title:\r\n i18n.t('cuboidMenu.DoYouReallyWantToRemoveAllFlowersOnCuboid', lang) +\r\n ' (' +\r\n counterUnlocked.flowerCount +\r\n ' ' +\r\n i18n.t('cuboidMenu.Flowers', lang) +\r\n ')?',\r\n icon: ,\r\n onOk: () => {\r\n if (cuboid) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Flower && e.parentId === cuboid.id);\r\n removeAllChildElementsByType(cuboid.id, ObjectType.Flower);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllFlowerChildren = {\r\n name: 'Remove All Flowers on Cuboid',\r\n timestamp: Date.now(),\r\n parentId: cuboid.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllFlowerChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllFlowerChildren.parentId, ObjectType.Flower);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllFlowerChildren);\r\n }\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.RemoveAllUnlockedFlowers', lang)} ({counterUnlocked.flowerCount}{' '}\r\n {i18n.t('cuboidMenu.Flowers', lang)})\r\n \r\n )}\r\n \r\n )}\r\n\r\n {editable &&\r\n (!cuboid.textureTypes ||\r\n (selectedSideIndex >= 0 && cuboid.textureTypes[selectedSideIndex] === CuboidTexture.NoTexture)) && (\r\n <>\r\n {colorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Color', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n <>\r\n {textureDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Texture', lang)} ...\r\n \r\n\r\n {lengthDialogVisible && }\r\n {\r\n // no side selection for length\r\n if (useStore.getState().cuboidActionScope === Scope.OnlyThisSide) {\r\n setActionScope(Scope.OnlyThisObject);\r\n }\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {widthDialogVisible && }\r\n {\r\n // no side selection for width\r\n if (useStore.getState().cuboidActionScope === Scope.OnlyThisSide) {\r\n setActionScope(Scope.OnlyThisObject);\r\n }\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {heightDialogVisible && }\r\n {\r\n // no side selection for height\r\n if (useStore.getState().cuboidActionScope === Scope.OnlyThisSide) {\r\n setActionScope(Scope.OnlyThisObject);\r\n }\r\n setApplyCount(0);\r\n setHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Height', lang)} ...\r\n \r\n\r\n {azimuthDialogVisible && }\r\n {\r\n // no side selection for azimuth\r\n if (useStore.getState().cuboidActionScope === Scope.OnlyThisSide) {\r\n setActionScope(Scope.OnlyThisObject);\r\n }\r\n setApplyCount(0);\r\n setAzimuthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Azimuth', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {\r\n if (cuboid) {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.Polygon;\r\n });\r\n const { pos: position } = Util.getWorldDataById(cuboid.id);\r\n let normal;\r\n switch (selectedSideIndex) {\r\n case 0:\r\n normal = UNIT_VECTOR_POS_X;\r\n break;\r\n case 1:\r\n normal = UNIT_VECTOR_NEG_X;\r\n break;\r\n case 2:\r\n normal = UNIT_VECTOR_POS_Y;\r\n break;\r\n case 3:\r\n normal = UNIT_VECTOR_NEG_Y;\r\n break;\r\n default:\r\n normal = UNIT_VECTOR_POS_Z;\r\n position.z = cuboid.lz;\r\n }\r\n const element = addElement(cuboid, position, normal);\r\n const undoableAdd = {\r\n name: 'Add',\r\n timestamp: Date.now(),\r\n addedElement: element,\r\n undo: () => {\r\n removeElementById(undoableAdd.addedElement.id, false);\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(undoableAdd.addedElement);\r\n state.selectedElement = undoableAdd.addedElement;\r\n });\r\n },\r\n } as UndoableAdd;\r\n addUndoable(undoableAdd);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('cuboidMenu.AddPolygon', lang)}\r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the cuboid's top surface */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Checkbox, InputNumber, Menu, Modal, Space } from 'antd';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { CompactPicker } from 'react-color';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType } from '../../../types';\r\nimport { Paste } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableRemoveAll } from '../../../undo/UndoableRemoveAll';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { DEFAULT_LEAF_OFF_DAY, DEFAULT_LEAF_OUT_DAY, MONTHS } from '../../../constants';\r\nimport { ElementCounter } from '../../../stores/ElementCounter';\r\n\r\nexport const GroundMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const removeElementsByType = useStore(Selector.removeElementsByType);\r\n const updateElementLockById = useStore(Selector.updateElementLockById);\r\n const updateAllElementLocks = useStore(Selector.updateAllElementLocks);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const latitude = useStore(Selector.world.latitude);\r\n const leafDayOfYear1 = useStore(Selector.world.leafDayOfYear1) ?? DEFAULT_LEAF_OUT_DAY;\r\n const leafDayOfYear2 = useStore(Selector.world.leafDayOfYear2) ?? DEFAULT_LEAF_OFF_DAY;\r\n const monthlyIrradianceLosses = useStore(Selector.world.monthlyIrradianceLosses) ?? new Array(12).fill(0.05);\r\n const albedo = useStore((state) => state.world.ground.albedo);\r\n const groundColor = useStore(Selector.viewState.groundColor);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const waterSurface = useStore(Selector.viewState.waterSurface);\r\n const language = useStore(Selector.language);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n\r\n const lang = { lng: language };\r\n const elementCounter: ElementCounter = useStore.getState().countAllElementsByType(true);\r\n const treeCount = elementCounter.treeCount;\r\n const flowerCount = elementCounter.flowerCount;\r\n const humanCount = elementCounter.humanCount;\r\n const foundationCount = elementCounter.foundationCount;\r\n const cuboidCount = elementCounter.cuboidCount;\r\n const solarPanelCount = elementCounter.solarPanelCount;\r\n const gotSome = elementCounter.gotSome();\r\n\r\n const setWaterSurface = (checked: boolean) => {\r\n setCommonStore((state) => {\r\n state.viewState.waterSurface = checked;\r\n });\r\n };\r\n\r\n const setGroundImage = (checked: boolean) => {\r\n setCommonStore((state) => {\r\n state.viewState.groundImage = checked;\r\n state.viewState.groundImageType = state.viewState.mapType;\r\n });\r\n };\r\n\r\n const setGroundColor = (color: string) => {\r\n setCommonStore((state) => {\r\n state.viewState.groundColor = color;\r\n });\r\n };\r\n\r\n const setAlbedo = (value: number) => {\r\n setCommonStore((state) => {\r\n state.world.ground.albedo = value;\r\n });\r\n };\r\n\r\n const setMonthlyIrradianceLoss = (month: number, value: number) => {\r\n const oldValue = monthlyIrradianceLosses[month];\r\n const newValue = value;\r\n const undoableChange = {\r\n name: 'Set Irradiance Loss in ' + MONTHS[month],\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: newValue,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.world.monthlyIrradianceLosses[month] = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.world.monthlyIrradianceLosses[month] = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n if (!state.world.monthlyIrradianceLosses) state.world.monthlyIrradianceLosses = new Array(12).fill(0.05);\r\n state.world.monthlyIrradianceLosses[month] = newValue as number;\r\n });\r\n };\r\n\r\n const legalToPaste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const e = elementsToPaste[0];\r\n if (\r\n e.type === ObjectType.Human ||\r\n e.type === ObjectType.Tree ||\r\n e.type === ObjectType.Flower ||\r\n e.type === ObjectType.Cuboid ||\r\n e.type === ObjectType.Foundation\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const northHemisphere = latitude > 0;\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n {humanCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllPeople', lang) + ' (' + humanCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore.getState().elements.filter((e) => !e.locked && e.type === ObjectType.Human);\r\n removeElementsByType(ObjectType.Human);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Humans',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Human);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedPeople', lang)} ({humanCount})\r\n \r\n )}\r\n\r\n {treeCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllTrees', lang) + ' (' + treeCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore.getState().elements.filter((e) => !e.locked && e.type === ObjectType.Tree);\r\n removeElementsByType(ObjectType.Tree);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Trees',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Tree);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedTrees', lang)} ({treeCount})\r\n \r\n )}\r\n\r\n {flowerCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllFlowers', lang) + ' (' + flowerCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore.getState().elements.filter((e) => !e.locked && e.type === ObjectType.Flower);\r\n removeElementsByType(ObjectType.Flower);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Flowers',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Flower);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedFlowers', lang)} ({flowerCount})\r\n \r\n )}\r\n\r\n {solarPanelCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllSolarPanels', lang) + ' (' + solarPanelCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.SolarPanel);\r\n removeElementsByType(ObjectType.SolarPanel);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Solar Panels',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.SolarPanel);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedSolarPanels', lang)} ({solarPanelCount})\r\n \r\n )}\r\n\r\n {foundationCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllFoundations', lang) + ' (' + foundationCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === ObjectType.Foundation);\r\n removeElementsByType(ObjectType.Foundation);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Foundations',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Foundation);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedFoundations', lang)} ({foundationCount})\r\n \r\n )}\r\n\r\n {cuboidCount > 0 && (\r\n {\r\n Modal.confirm({\r\n title: i18n.t('groundMenu.DoYouReallyWantToRemoveAllCuboids', lang) + ' (' + cuboidCount + ')?',\r\n icon: ,\r\n onOk: () => {\r\n const removed = useStore.getState().elements.filter((e) => !e.locked && e.type === ObjectType.Cuboid);\r\n removeElementsByType(ObjectType.Cuboid);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAll = {\r\n name: 'Remove All Cuboids',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAll.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeElementsByType(ObjectType.Cuboid);\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableRemoveAll);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t('groundMenu.RemoveAllUnlockedCuboids', lang)} ({cuboidCount})\r\n \r\n )}\r\n\r\n {gotSome && (\r\n {\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n updateAllElementLocks(true);\r\n const undoableLockAllElements = {\r\n name: 'Lock All Elements',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElements.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateAllElementLocks(true);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElements);\r\n }}\r\n >\r\n {i18n.t('groundMenu.LockAllElements', lang)} ({elements.length})\r\n \r\n )}\r\n {!gotSome && elements.length > 0 && (\r\n {\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n updateAllElementLocks(false);\r\n const undoableLockAllElements = {\r\n name: 'Lock All Elements',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: false,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElements.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateAllElementLocks(false);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElements);\r\n }}\r\n >\r\n {i18n.t('groundMenu.UnlockAllElements', lang)} ({elements.length})\r\n \r\n )}\r\n\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Show Ground Image',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n undo: () => {\r\n setGroundImage(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n setGroundImage(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setGroundImage(checked);\r\n }}\r\n >\r\n {i18n.t('groundMenu.ImageOnGround', lang)}\r\n \r\n \r\n\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Water Surface',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n undo: () => {\r\n setWaterSurface(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n setWaterSurface(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setWaterSurface(checked);\r\n }}\r\n >\r\n {i18n.t('groundMenu.WaterSurface', lang)}\r\n \r\n \r\n\r\n {!waterSurface && (\r\n \r\n {\r\n const oldColor = groundColor;\r\n const newColor = colorResult.hex;\r\n const undoableChange = {\r\n name: 'Set Ground Color',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: newColor,\r\n undo: () => {\r\n setGroundColor(undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n setGroundColor(undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setGroundColor(newColor);\r\n }}\r\n />\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {\r\n const oldDay = leafDayOfYear1;\r\n const newDay = value;\r\n const undoableChange = {\r\n name: 'Set Leaf Day 1',\r\n timestamp: Date.now(),\r\n oldValue: oldDay,\r\n newValue: newDay,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear1 = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear1 = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear1 = newDay as number;\r\n });\r\n }}\r\n />\r\n \r\n \r\n {\r\n const oldDay = leafDayOfYear2;\r\n const newDay = value;\r\n const undoableChange = {\r\n name: 'Set Leaf Day 2',\r\n timestamp: Date.now(),\r\n oldValue: oldDay,\r\n newValue: newDay,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear2 = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear2 = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.world.leafDayOfYear2 = newDay as number;\r\n });\r\n }}\r\n />\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {i18n.t('month.January', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[0]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(0, value);\r\n }}\r\n />\r\n {i18n.t('month.February', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[1]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(1, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.March', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[2]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(2, value);\r\n }}\r\n />\r\n {i18n.t('month.April', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[3]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(3, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.May', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[4]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(4, value);\r\n }}\r\n />\r\n {i18n.t('month.June', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[5]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(5, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.July', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[6]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(6, value);\r\n }}\r\n />\r\n {i18n.t('month.August', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[7]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(7, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.September', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[8]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(8, value);\r\n }}\r\n />\r\n {i18n.t('month.October', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[9]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(9, value);\r\n }}\r\n />\r\n \r\n \r\n {i18n.t('month.November', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[10]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(10, value);\r\n }}\r\n />\r\n {i18n.t('month.December', lang)}}\r\n style={{ width: '120px' }}\r\n min={0}\r\n max={1}\r\n step={0.01}\r\n precision={2}\r\n value={monthlyIrradianceLosses[11]}\r\n onChange={(value) => {\r\n setMonthlyIrradianceLoss(11, value);\r\n }}\r\n />\r\n \r\n \r\n \r\n\r\n \r\n \r\n {i18n.t('groundMenu.Albedo', lang)}:\r\n {\r\n if (value) {\r\n const oldAlbedo = albedo;\r\n const newAlbedo = value;\r\n const undoableChange = {\r\n name: 'Set Ground Albedo',\r\n timestamp: Date.now(),\r\n oldValue: oldAlbedo,\r\n newValue: newAlbedo,\r\n undo: () => {\r\n setAlbedo(undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n setAlbedo(undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setAlbedo(newAlbedo);\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n});\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport JaahImage from '../../../resources/jaah.png';\nimport JackImage from '../../../resources/jack.png';\nimport JacobImage from '../../../resources/jacob.png';\nimport JacquelineImage from '../../../resources/jacqueline.png';\nimport JadeImage from '../../../resources/jade.png';\nimport JameliaImage from '../../../resources/jamelia.png';\nimport JamesImage from '../../../resources/james.png';\nimport JaneImage from '../../../resources/jane.png';\nimport JayaImage from '../../../resources/jaya.png';\nimport JayeImage from '../../../resources/jaye.png';\nimport JeanetteImage from '../../../resources/jeanette.png';\nimport JediImage from '../../../resources/jedi.png';\nimport JeffImage from '../../../resources/jeff.png';\nimport JenaImage from '../../../resources/jena.png';\nimport JenniferImage from '../../../resources/jennifer.png';\nimport JessImage from '../../../resources/jess.png';\nimport JettImage from '../../../resources/jett.png';\nimport JillImage from '../../../resources/jill.png';\nimport JiyaImage from '../../../resources/jiya.png';\nimport JoanImage from '../../../resources/joan.png';\nimport JocelynImage from '../../../resources/jocelyn.png';\nimport JoelImage from '../../../resources/joel.png';\nimport JoeyImage from '../../../resources/joey.png';\nimport JohnImage from '../../../resources/john.png';\nimport JonathonImage from '../../../resources/jonathon.png';\nimport JoseImage from '../../../resources/jose.png';\nimport JosephImage from '../../../resources/joseph.png';\nimport JoshuaImage from '../../../resources/joshua.png';\nimport JuddImage from '../../../resources/judd.png';\nimport JudyImage from '../../../resources/judy.png';\nimport JuliaImage from '../../../resources/julia.png';\nimport JulioImage from '../../../resources/julio.png';\nimport JumapiliImage from '../../../resources/jumapili.png';\nimport JuneImage from '../../../resources/june.png';\nimport JuroImage from '../../../resources/juro.png';\nimport JustinImage from '../../../resources/justin.png';\n\nimport React, { useState } from 'react';\nimport { Select } from 'antd';\nimport { HumanName, ObjectType } from '../../../types';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { HumanModel } from '../../../models/HumanModel';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport i18n from '../../../i18n/i18n';\nimport { HumanData } from '../../../HumanData';\n\nconst { Option } = Select;\n\nconst HumanSelection = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const human = useStore.getState().getSelectedElement() as HumanModel;\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const lang = { lng: language };\n\n const updateHumanNameById = (id: string, name: HumanName) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Human && e.id === id) {\n const human = e as HumanModel;\n human.name = name;\n human.lx = HumanData.fetchWidth(name);\n human.lz = HumanData.fetchHeight(name);\n break;\n }\n }\n });\n };\n\n return (\n {\n if (human) {\n const oldPerson = human.name;\n if (oldPerson !== value) {\n const undoableChange = {\n name: 'Change People',\n timestamp: Date.now(),\n oldValue: oldPerson,\n newValue: value,\n changedElementId: human.id,\n changedElementType: human.type,\n undo: () => {\n updateHumanNameById(undoableChange.changedElementId, undoableChange.oldValue as HumanName);\n },\n redo: () => {\n updateHumanNameById(undoableChange.changedElementId, undoableChange.newValue as HumanName);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateHumanNameById(human.id, value);\n setCommonStore((state) => {\n state.actionState.humanName = value;\n });\n setUpdateFlag(!updateFlag);\n }\n }\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default HumanSelection;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Checkbox, Menu, Space } from 'antd';\r\nimport HumanSelection from './humanSelection';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HumanModel } from '../../../models/HumanModel';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { useRefStore } from '../../../stores/commonRef';\r\nimport { Easing, Tween, update } from '@tweenjs/tween.js';\r\nimport { Util } from '../../../Util';\r\nimport { ObjectType } from '../../../types';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const HumanMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const getParent = useStore(Selector.getParent);\r\n const selectNone = useStore(Selector.selectNone);\r\n const language = useStore(Selector.language);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const human = useSelectedElement(ObjectType.Human) as HumanModel | undefined;\r\n\r\n const [animationFlag, setAnimationFlag] = useState(false);\r\n\r\n const editable = !human?.locked;\r\n const requestRef = useRef(0);\r\n const previousFrameTime = useRef(-1);\r\n const firstCall = useRef(true);\r\n const animateMove = useRef(false);\r\n\r\n useEffect(() => {\r\n if (animateMove.current) {\r\n if (firstCall.current) {\r\n requestRef.current = requestAnimationFrame(animate);\r\n tween();\r\n return () => {\r\n cancelAnimationFrame(requestRef.current);\r\n };\r\n } else {\r\n firstCall.current = true;\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [animationFlag]);\r\n\r\n const updateHumanFlipById = (id: string, yes: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Human && e.id === id) {\r\n const human = e as HumanModel;\r\n human.flip = yes;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateHumanObserverById = (id: string, yes: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Human && e.id === id) {\r\n (e as HumanModel).observer = yes;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const moveCamera = (x: number, y: number, z: number) => {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n orbitControlsRef.current.object.position.set(x, y, z);\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n const v = state.viewState;\r\n v.cameraPosition = [x, y, z];\r\n });\r\n }\r\n };\r\n\r\n const animate = () => {\r\n requestAnimationFrame(animate);\r\n const currentFrameTime = Date.now();\r\n if (currentFrameTime - previousFrameTime.current > 100) {\r\n update();\r\n previousFrameTime.current = currentFrameTime;\r\n }\r\n };\r\n\r\n const tween = () => {\r\n if (!human) return;\r\n let x = human.cx;\r\n let y = human.cy;\r\n let z = human.cz + human.lz;\r\n const parent = getParent(human);\r\n if (parent) {\r\n const v = Util.absoluteHumanOrTreeCoordinates(x, y, z, parent);\r\n x = v.x;\r\n y = v.y;\r\n z = v.z;\r\n }\r\n const cam = useStore.getState().cameraDirection.clone().normalize().multiplyScalar(0.5);\r\n x += cam.x;\r\n y += cam.y;\r\n const originalPosition = [...useStore.getState().viewState.cameraPosition];\r\n new Tween(originalPosition)\r\n .to([x, y, z], 1000)\r\n .easing(Easing.Quadratic.In)\r\n .onUpdate((d) => {\r\n moveCamera(d[0], d[1], d[2]);\r\n })\r\n .onComplete(() => {\r\n selectNone();\r\n })\r\n .start();\r\n };\r\n\r\n if (!human) return null;\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {editable && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Set Observer',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: human.id,\r\n selectedElementType: ObjectType.Human,\r\n undo: () => {\r\n updateHumanObserverById(human.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateHumanObserverById(human.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateHumanObserverById(human.id, checked);\r\n }}\r\n >\r\n {i18n.t('peopleMenu.Observer', { lng: language })}\r\n \r\n \r\n )}\r\n {!orthographic && (\r\n {\r\n setAnimationFlag(!animationFlag);\r\n animateMove.current = true;\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('peopleMenu.ViewFromThisPerson', { lng: language })}\r\n \r\n )}\r\n {editable && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Flip Human',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: human.id,\r\n selectedElementType: ObjectType.Human,\r\n undo: () => {\r\n updateHumanFlipById(human.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateHumanFlipById(human.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateHumanFlipById(human.id, checked);\r\n }}\r\n >\r\n {i18n.t('peopleMenu.Flip', { lng: language })}\r\n \r\n \r\n )}\r\n {editable && (\r\n \r\n \r\n {i18n.t('peopleMenu.ChangePerson', { lng: language })}: \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport { Select } from 'antd';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { FlowerType, ObjectType } from '../../../types';\nimport BellflowerImage from '../../../resources/bellflower.png';\nimport BoxwoodImage from '../../../resources/boxwood.png';\nimport CactusCombo1Image from '../../../resources/cactus_combo_1.png';\nimport CactusCombo2Image from '../../../resources/cactus_combo_2.png';\nimport CactusCombo3Image from '../../../resources/cactus_combo_3.png';\nimport CactusCombo4Image from '../../../resources/cactus_combo_4.png';\nimport HibiscusImage from '../../../resources/hibiscus.png';\nimport HydrangeaImage from '../../../resources/hydrangea.png';\nimport HostaImage from '../../../resources/hosta.png';\nimport PeonyImage from '../../../resources/peony.png';\nimport RedRoseImage from '../../../resources/red_rose.png';\nimport SpireaImage from '../../../resources/spirea.png';\nimport SunflowerImage from '../../../resources/sunflower.png';\nimport TallBushImage from '../../../resources/tall_bush.png';\nimport TulipImage from '../../../resources/tulip.png';\nimport WhiteFlowerImage from '../../../resources/white_flower.png';\nimport YellowFlowerImage from '../../../resources/yellow_flower.png';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport i18n from '../../../i18n/i18n';\nimport { FlowerModel } from '../../../models/FlowerModel';\nimport { FlowerData } from '../../../FlowerData';\n\nconst { Option } = Select;\n\nconst FlowerSelection = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const flower = useStore.getState().getSelectedElement() as FlowerModel;\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const lang = { lng: language };\n\n const updateFlowerTypeById = (id: string, type: FlowerType) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Flower && e.id === id) {\n const flower = e as FlowerModel;\n flower.name = type;\n flower.lx = FlowerData.fetchSpread(type);\n flower.lz = FlowerData.fetchHeight(type);\n break;\n }\n }\n });\n };\n\n return (\n {\n if (flower) {\n const oldFlower = flower.name;\n if (oldFlower !== value) {\n const undoableChange = {\n name: 'Change Flower',\n timestamp: Date.now(),\n oldValue: oldFlower,\n newValue: value,\n changedElementId: flower.id,\n changedElementType: flower.type,\n undo: () => {\n updateFlowerTypeById(undoableChange.changedElementId, undoableChange.oldValue as FlowerType);\n },\n redo: () => {\n updateFlowerTypeById(undoableChange.changedElementId, undoableChange.newValue as FlowerType);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateFlowerTypeById(flower.id, value);\n setCommonStore((state) => {\n state.actionState.flowerType = value;\n });\n setUpdateFlag(!updateFlag);\n }\n }\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default FlowerSelection;\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Checkbox, Menu, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { FlowerModel } from '../../../models/FlowerModel';\r\nimport FlowerSelection from './flowerSelection';\r\nimport { ObjectType } from '../../../types';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const FlowerMenu = () => {\r\n const flower = useSelectedElement(ObjectType.Flower) as FlowerModel | undefined;\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n if (!flower) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !flower?.locked;\r\n\r\n const updateFlowerFlipById = (id: string, flip: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Flower && e.id === id) {\r\n (e as FlowerModel).flip = flip;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n\r\n {editable && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Flip Flower',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: flower.id,\r\n selectedElementType: ObjectType.Flower,\r\n undo: () => {\r\n updateFlowerFlipById(flower.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateFlowerFlipById(flower.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateFlowerFlipById(flower.id, checked);\r\n }}\r\n >\r\n {i18n.t('flowerMenu.Flip', { lng: language })}\r\n \r\n \r\n )}\r\n\r\n {/* have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n {editable && (\r\n \r\n \r\n {i18n.t('flowerMenu.Type', lang)}: \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonLineColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const updateElementLineColorById = useStore(Selector.updateElementLineColorById);\r\n const updateElementLineColorOnSurface = useStore(Selector.updateElementLineColorOnSurface);\r\n const updateElementLineColorAboveFoundation = useStore(Selector.updateElementLineColorAboveFoundation);\r\n const updateElementLineColorForAll = useStore(Selector.updateElementLineColorForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(polygon?.lineColor ?? 'black');\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (color: string) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (color !== e.lineColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n if (color !== e.lineColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if (e.lineColor !== color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon?.foundationId && !e.locked) {\r\n if (e.lineColor !== color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== polygon?.lineColor) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).lineColor = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, elem.lineColor ?? 'black');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Line Color for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeSelected.oldValues.entries()) {\r\n updateElementLineColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldColorsAll.set(elem.id, elem.lineColor ?? 'black');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Line Color for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAll.oldValues.entries()) {\r\n updateElementLineColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateElementLineColorForAll(ObjectType.Polygon, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementLineColorForAll(ObjectType.Polygon, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldLineColorsOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldLineColorsOnSurface.set(elem.id, elem.lineColor ?? 'gray');\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Line Color for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLineColorsOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, lc] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateElementLineColorById(id, lc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateElementLineColorOnSurface(\r\n ObjectType.Polygon,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateElementLineColorOnSurface(ObjectType.Polygon, polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldLineColorsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldLineColorsAboveFoundation.set(elem.id, elem.lineColor ?? 'black');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Line Color for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLineColorsAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, lc] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateElementLineColorById(id, lc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateElementLineColorAboveFoundation(\r\n ObjectType.Polygon,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateElementLineColorAboveFoundation(ObjectType.Polygon, polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldColor = p ? p.lineColor : polygon.lineColor;\r\n const undoableChange = {\r\n name: 'Set Line Color of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updateElementLineColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateElementLineColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLineColorById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonLineColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonFillColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const updateElementFillColorById = useStore(Selector.updateElementColorById);\r\n const updateElementFillColorOnSurface = useStore(Selector.updateElementColorOnSurface);\r\n const updateElementFillColorAboveFoundation = useStore(Selector.updateElementColorAboveFoundation);\r\n const updateElementFillColorForAll = useStore(Selector.updateElementColorForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(polygon?.color ?? 'gray');\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (color: string) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (color !== e.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n if (color !== e.color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon.foundationId && !e.locked) {\r\n if (e.color !== color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if (e.color !== color) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== polygon.color) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).color = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, elem.color ?? 'gray');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Fill Color for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeSelected.oldValues.entries()) {\r\n updateElementFillColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldColorsAll.set(elem.id, elem.color ?? 'gray');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Fill Color for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAll.oldValues.entries()) {\r\n updateElementFillColorById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateElementFillColorForAll(ObjectType.Polygon, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementFillColorForAll(ObjectType.Polygon, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldFillColorsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldFillColorsAboveFoundation.set(elem.id, elem.color ?? 'gray');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Fill Color for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldFillColorsAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, lc] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateElementFillColorById(id, lc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateElementFillColorAboveFoundation(\r\n ObjectType.Polygon,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateElementFillColorAboveFoundation(ObjectType.Polygon, polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldFillColorsOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldFillColorsOnSurface.set(elem.id, elem.color ?? 'gray');\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Fill Color for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldFillColorsOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, lc] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateElementFillColorById(id, lc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateElementFillColorOnSurface(\r\n ObjectType.Polygon,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateElementFillColorOnSurface(ObjectType.Polygon, polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldColor = p ? p.color : polygon.color;\r\n const undoableChange = {\r\n name: 'Set Fill Color of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updateElementFillColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateElementFillColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementFillColorById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonFillColorSelection;\r\n","export default __webpack_public_path__ + \"static/media/polygon_08_menu.e9d3ae98.png\";","export default __webpack_public_path__ + \"static/media/polygon_10_menu.e1254bdd.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport Polygon_Texture_01_Menu from '../../../resources/foundation_01_menu.png';\r\nimport Polygon_Texture_02_Menu from '../../../resources/foundation_02_menu.png';\r\nimport Polygon_Texture_03_Menu from '../../../resources/foundation_03_menu.png';\r\nimport Polygon_Texture_04_Menu from '../../../resources/foundation_04_menu.png';\r\nimport Polygon_Texture_05_Menu from '../../../resources/foundation_05_menu.png';\r\nimport Polygon_Texture_06_Menu from '../../../resources/foundation_06_menu.png';\r\nimport Polygon_Texture_07_Menu from '../../../resources/foundation_07_menu.png';\r\nimport Polygon_Texture_08_Menu from '../../../resources/polygon_08_menu.png';\r\nimport Polygon_Texture_09_Menu from '../../../resources/polygon_09_menu.png';\r\nimport Polygon_Texture_10_Menu from '../../../resources/polygon_10_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, PolygonTexture, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(\r\n polygon?.textureType ?? PolygonTexture.NoTexture,\r\n );\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updatePolygonTextureById = (id: string, texture: PolygonTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Polygon && !e.locked) {\r\n (e as PolygonModel).textureType = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonTextureOnSurface = (parentId: string, normal: number[] | undefined, texture: PolygonTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === parentId &&\r\n Util.isIdentical(e.normal, normal) &&\r\n !e.locked\r\n ) {\r\n (e as PolygonModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonTextureAboveFoundation = (foundationId: string, texture: PolygonTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === foundationId && !e.locked) {\r\n (e as PolygonModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonTextureForAll = (texture: PolygonTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n (e as PolygonModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (texture: PolygonTexture) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const polygon = e as PolygonModel;\r\n if (texture !== polygon.textureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n const polygon = e as PolygonModel;\r\n if (texture !== polygon.textureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if ((e as PolygonModel).textureType !== texture) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon.foundationId && !e.locked) {\r\n if ((e as PolygonModel).textureType !== texture) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (texture !== polygon?.textureType) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: PolygonTexture) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).textureType = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setTexture = (value: PolygonTexture) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTexturesSelected.set(elem.id, (elem as PolygonModel).textureType ?? PolygonTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeSelected.oldValues.entries()) {\r\n updatePolygonTextureById(id, texture as PolygonTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as PolygonTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldTexturesAll.set(elem.id, (elem as PolygonModel).textureType ?? PolygonTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeAll.oldValues.entries()) {\r\n updatePolygonTextureById(id, texture as PolygonTexture);\r\n }\r\n },\r\n redo: () => {\r\n updatePolygonTextureForAll(undoableChangeAll.newValue as PolygonTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePolygonTextureForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldTexturesOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldTexturesOnSurface.set(elem.id, (elem as PolygonModel).textureType ?? PolygonTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Texture for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, tx] of undoableChangeOnSurface.oldValues.entries()) {\r\n updatePolygonTextureById(id, tx as PolygonTexture);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updatePolygonTextureOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as PolygonTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updatePolygonTextureOnSurface(polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldTexturesAboveFoundation.set(elem.id, (elem as PolygonModel).textureType ?? PolygonTexture.NoTexture);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Texture for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, tx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePolygonTextureById(id, tx as PolygonTexture);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePolygonTextureAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as PolygonTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePolygonTextureAboveFoundation(polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldTexture = p ? p.textureType : polygon.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updatePolygonTextureById(undoableChange.changedElementId, undoableChange.oldValue as PolygonTexture);\r\n },\r\n redo: () => {\r\n updatePolygonTextureById(undoableChange.changedElementId, undoableChange.newValue as PolygonTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePolygonTextureById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonTextureSelection;\r\n","export default \"data:image/png;base64,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\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { PolygonModel } from '../models/PolygonModel';\nimport { Util } from '../Util';\nimport { ObjectType, Orientation, RowAxis } from '../types';\nimport { ElementModel } from '../models/ElementModel';\nimport { Point2 } from '../models/Point2';\nimport { ElementModelFactory } from '../models/ElementModelFactory';\nimport { HALF_PI, UNIT_VECTOR_POS_Z } from '../constants';\nimport { PvModel } from '../models/PvModel';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\n\nexport class SolarPanelLayoutRelative {\n static create(\n area: PolygonModel,\n base: ElementModel,\n pvModel: PvModel,\n orientation: Orientation,\n tiltAngle: number,\n rowsPerRack: number,\n interRowSpacing: number,\n rowAxis: RowAxis,\n poleHeight: number,\n poleSpacing: number,\n margin: number,\n ): SolarPanelModel[] {\n if (base.type !== ObjectType.Foundation && base.type !== ObjectType.Cuboid)\n throw new Error('base must be a foundation or cuboid');\n const solarPanels: SolarPanelModel[] = [];\n const bounds = Util.calculatePolygonBounds(area.vertices);\n const ly = (orientation === Orientation.portrait ? pvModel.length : pvModel.width) * rowsPerRack;\n if (rowAxis === RowAxis.upDown) {\n // north-south axis, so the array is laid in x direction\n const n = Math.floor(((bounds.maxX() - bounds.minX()) * base.lx - ly) / interRowSpacing);\n const start = bounds.minX() + ly / (2 * base.lx) + margin / base.lx;\n const delta = interRowSpacing / base.lx;\n const h = (0.5 * Math.abs(Math.cos(tiltAngle)) * ly) / base.lx;\n const a: Point2 = { x: 0, y: -0.5 } as Point2;\n const b: Point2 = { x: 0, y: 0.5 } as Point2;\n const rotation = 'rotation' in base ? base.rotation : undefined;\n for (let i = 0; i <= n; i++) {\n const cx = start + i * delta;\n a.x = b.x = cx - h;\n const p1 = Util.polygonIntersections(a, b, area.vertices).sort((v1, v2) => v1.y - v2.y);\n a.x = b.x = cx + h;\n const p2 = Util.polygonIntersections(a, b, area.vertices).sort((v1, v2) => v1.y - v2.y);\n const numberOfSegments = Math.max(p1.length, p2.length) / 2;\n if (numberOfSegments > 0) {\n for (let s = 0; s < numberOfSegments; s++) {\n const t = s * 2;\n const panel = SolarPanelLayoutRelative.makeUpDownSegment(\n p1[t] ?? p2[t],\n p1[t + 1] ?? p2[t + 1],\n p2[t] ?? p1[t],\n p2[t + 1] ?? p1[t + 1],\n rotation,\n cx,\n ly,\n base,\n pvModel,\n tiltAngle,\n poleHeight,\n poleSpacing,\n margin,\n );\n if (panel) {\n panel.referenceId = area.id;\n Util.changeOrientation(panel, pvModel, orientation);\n solarPanels.push(panel);\n }\n }\n }\n }\n } else {\n // east-west axis, so the array is laid in y direction\n const n = Math.floor(((bounds.maxY() - bounds.minY()) * base.ly - 2 * margin - ly) / interRowSpacing);\n const start = bounds.minY() + ly / (2 * base.ly) + margin / base.ly;\n const delta = interRowSpacing / base.ly;\n const h = (0.5 * Math.abs(Math.cos(tiltAngle)) * ly) / base.ly;\n const a: Point2 = { x: -0.5, y: 0 } as Point2;\n const b: Point2 = { x: 0.5, y: 0 } as Point2;\n const rotation = 'rotation' in base ? base.rotation : undefined;\n for (let i = 0; i <= n; i++) {\n const cy = start + i * delta;\n a.y = b.y = cy - h;\n const p1 = Util.polygonIntersections(a, b, area.vertices).sort((v1, v2) => v1.x - v2.x);\n a.y = b.y = cy + h;\n const p2 = Util.polygonIntersections(a, b, area.vertices).sort((v1, v2) => v1.x - v2.x);\n const numberOfSegments = Math.max(p1.length, p2.length) / 2;\n if (numberOfSegments > 0) {\n for (let s = 0; s < numberOfSegments; s++) {\n const t = s * 2;\n const panel = SolarPanelLayoutRelative.makeLeftRightSegment(\n p1[t] ?? p2[t],\n p1[t + 1] ?? p2[t + 1],\n p2[t] ?? p1[t],\n p2[t + 1] ?? p1[t + 1],\n rotation,\n cy,\n ly,\n base,\n pvModel,\n tiltAngle,\n poleHeight,\n poleSpacing,\n margin,\n );\n if (panel) {\n panel.referenceId = area.id;\n Util.changeOrientation(panel, pvModel, orientation);\n solarPanels.push(panel);\n }\n }\n }\n }\n }\n return solarPanels;\n }\n\n // solar panel rows in up-down direction (north-south if the base's azimuth is zero)\n // p1 and q1 are the end points of the left line of this segment\n // p2 and q2 are the end points of the right line of this segment\n static makeUpDownSegment(\n p1: Point2,\n q1: Point2,\n p2: Point2,\n q2: Point2,\n rotation: number[] | undefined,\n cx: number,\n ly: number,\n base: ElementModel,\n pvModel: PvModel,\n tiltAngle: number,\n poleHeight: number,\n poleSpacing: number,\n margin: number,\n ) {\n const shorter = Math.abs(p1.y - q1.y) < Math.abs(p2.y - q2.y);\n let y1 = shorter ? p1.y : p2.y;\n let y2 = shorter ? q1.y : q2.y;\n const lx = Math.abs(y1 - y2) - (2 * margin) / base.ly;\n if (lx > 0) {\n return ElementModelFactory.makeSolarPanel(\n base,\n pvModel,\n cx,\n (y1 + y2) / 2,\n base.type === ObjectType.Cuboid ? 0.5 : base.lz,\n Orientation.portrait,\n poleHeight,\n poleSpacing,\n tiltAngle,\n HALF_PI,\n UNIT_VECTOR_POS_Z,\n rotation,\n undefined,\n lx * base.ly,\n ly,\n );\n }\n return undefined;\n }\n\n // solar panel rows in left-right direction (west-east if the base's azimuth is zero)\n // p1 and q1 are the end points of the lower line of this segment\n // p2 and q2 are the end points of the upper line of this segment\n static makeLeftRightSegment(\n p1: Point2,\n q1: Point2,\n p2: Point2,\n q2: Point2,\n rotation: number[] | undefined,\n cy: number,\n ly: number,\n base: ElementModel,\n pvModel: PvModel,\n tiltAngle: number,\n poleHeight: number,\n poleSpacing: number,\n margin: number,\n ) {\n const shorter = Math.abs(p1.x - q1.x) < Math.abs(p2.x - q2.x);\n const x1 = shorter ? p1.x : p2.x;\n const x2 = shorter ? q1.x : q2.x;\n const lx = Math.abs(x1 - x2) - (2 * margin) / base.lx;\n if (lx > 0) {\n return ElementModelFactory.makeSolarPanel(\n base,\n pvModel,\n (x1 + x2) / 2,\n cy,\n base.type === ObjectType.Cuboid ? 0.5 : base.lz,\n Orientation.portrait,\n poleHeight,\n poleSpacing,\n tiltAngle,\n 0,\n UNIT_VECTOR_POS_Z,\n rotation,\n undefined,\n lx * base.lx,\n ly,\n );\n }\n return undefined;\n }\n}\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport { PolygonModel } from '../models/PolygonModel';\nimport { Util } from '../Util';\nimport { ObjectType, Orientation, RowAxis } from '../types';\nimport { ElementModel } from '../models/ElementModel';\nimport { Point2 } from '../models/Point2';\nimport { ElementModelFactory } from '../models/ElementModelFactory';\nimport { HALF_PI, UNIT_VECTOR_POS_Z } from '../constants';\nimport { PvModel } from '../models/PvModel';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\n\nexport class SolarPanelLayoutAbsolute {\n static create(\n area: PolygonModel,\n base: ElementModel,\n pvModel: PvModel,\n orientation: Orientation,\n tiltAngle: number,\n rowsPerRack: number,\n interRowSpacing: number,\n rowAxis: RowAxis,\n poleHeight: number,\n poleSpacing: number,\n margin: number,\n ): SolarPanelModel[] {\n if (base.type !== ObjectType.Foundation && base.type !== ObjectType.Cuboid)\n throw new Error('base must be a foundation or cuboid');\n const solarPanels: SolarPanelModel[] = [];\n const rotated = !Util.isZero(base.rotation[2]);\n const vertices: Point2[] = [];\n for (const v of area.vertices) {\n vertices.push({ x: v.x * base.lx + base.cx, y: v.y * base.ly + base.cy } as Point2);\n }\n const verticesRotated = rotated ? Util.rotatePolygon(vertices, base.cx, base.cy, base.rotation[2]) : vertices;\n const bounds = Util.calculatePolygonBounds(verticesRotated);\n const ly = (orientation === Orientation.portrait ? pvModel.length : pvModel.width) * rowsPerRack;\n const h = 0.5 * Math.abs(Math.cos(tiltAngle)) * ly;\n if (rowAxis === RowAxis.eastWest) {\n const maxLength = bounds.maxY() - bounds.minY();\n const n = Math.floor((maxLength - 2 * margin - ly) / interRowSpacing);\n const start = bounds.minY() + ly / 2 + margin;\n const a: Point2 = { x: bounds.minX(), y: 0 } as Point2;\n const b: Point2 = { x: bounds.maxX(), y: 0 } as Point2;\n for (let i = 0; i <= n; i++) {\n const cy = start + i * interRowSpacing;\n a.y = b.y = cy - h;\n const p1 = Util.polygonIntersections(a, b, verticesRotated).sort((v1, v2) => v1.x - v2.x);\n a.y = b.y = cy + h;\n const p2 = Util.polygonIntersections(a, b, verticesRotated).sort((v1, v2) => v1.x - v2.x);\n const numberOfSegments = Math.max(p1.length, p2.length) / 2;\n if (numberOfSegments > 0) {\n for (let s = 0; s < numberOfSegments; s++) {\n const t = s * 2;\n const f1 = p1[t] ?? p2[t];\n const g1 = p1[t + 1] ?? p2[t + 1];\n const f2 = p2[t] ?? p1[t];\n const g2 = p2[t + 1] ?? p1[t + 1];\n const shorter = Math.hypot(f1.x - g1.x, f1.y - g1.y) <= Math.hypot(f2.x - g2.x, f2.y - g2.y);\n const x1 = shorter ? f1.x : f2.x;\n const x2 = shorter ? g1.x : g2.x;\n const y1 = shorter ? f1.y : f2.y;\n const y2 = shorter ? g1.y : g2.y;\n const lx = Math.hypot(x1 - x2, y1 - y2) - 2 * margin;\n if (lx > 0) {\n let cp = Util.relativeCoordinates((x1 + x2) / 2, cy, 0, base);\n const panel = ElementModelFactory.makeSolarPanel(\n base,\n pvModel,\n cp.x,\n cp.y,\n base.type === ObjectType.Cuboid ? 0.5 : base.lz,\n Orientation.portrait,\n poleHeight,\n poleSpacing,\n tiltAngle,\n -base.rotation[2],\n UNIT_VECTOR_POS_Z,\n base.rotation,\n undefined,\n lx,\n ly,\n );\n panel.referenceId = area.id;\n Util.changeOrientation(panel, pvModel, orientation);\n solarPanels.push(panel);\n }\n }\n }\n }\n } else if (rowAxis === RowAxis.northSouth) {\n const maxLength = bounds.maxX() - bounds.minX();\n const n = Math.floor((maxLength - 2 * margin - ly) / interRowSpacing);\n const start = bounds.minX() + ly / 2 + margin;\n const a: Point2 = { x: 0, y: bounds.minY() } as Point2;\n const b: Point2 = { x: 0, y: bounds.maxY() } as Point2;\n for (let i = 0; i <= n; i++) {\n const cx = start + i * interRowSpacing;\n a.x = b.x = cx - h;\n const p1 = Util.polygonIntersections(a, b, verticesRotated).sort((v1, v2) => v1.y - v2.y);\n a.x = b.x = cx + h;\n const p2 = Util.polygonIntersections(a, b, verticesRotated).sort((v1, v2) => v1.y - v2.y);\n const numberOfSegments = Math.max(p1.length, p2.length) / 2;\n if (numberOfSegments > 0) {\n for (let s = 0; s < numberOfSegments; s++) {\n const t = s * 2;\n const f1 = p1[t] ?? p2[t];\n const g1 = p1[t + 1] ?? p2[t + 1];\n const f2 = p2[t] ?? p1[t];\n const g2 = p2[t + 1] ?? p1[t + 1];\n const shorter = Math.hypot(f1.x - g1.x, f1.y - g1.y) <= Math.hypot(f2.x - g2.x, f2.y - g2.y);\n const x1 = shorter ? f1.x : f2.x;\n const x2 = shorter ? g1.x : g2.x;\n const y1 = shorter ? f1.y : f2.y;\n const y2 = shorter ? g1.y : g2.y;\n const lx = Math.hypot(x1 - x2, y1 - y2) - 2 * margin;\n if (lx > 0) {\n let cp = Util.relativeCoordinates(cx, (y1 + y2) / 2, 0, base);\n const panel = ElementModelFactory.makeSolarPanel(\n base,\n pvModel,\n cp.x,\n cp.y,\n base.type === ObjectType.Cuboid ? 0.5 : base.lz,\n Orientation.portrait,\n poleHeight,\n poleSpacing,\n tiltAngle,\n -base.rotation[2] + HALF_PI,\n UNIT_VECTOR_POS_Z,\n base.rotation,\n undefined,\n lx,\n ly,\n );\n panel.referenceId = area.id;\n Util.changeOrientation(panel, pvModel, orientation);\n solarPanels.push(panel);\n }\n }\n }\n }\n }\n return solarPanels;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport { ObjectType, Orientation, RowAxis } from '../../../types';\nimport { Util } from '../../../Util';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { UndoableLayout } from '../../../undo/UndoableLayout';\nimport { ElementModel } from '../../../models/ElementModel';\nimport { showError } from '../../../helpers';\nimport { SolarPanelArrayLayoutParams } from '../../../stores/SolarPanelArrayLayoutParams';\nimport { SolarPanelLayoutRelative } from '../../../pd/SolarPanelLayoutRelative';\nimport { SolarPanelLayoutAbsolute } from '../../../pd/SolarPanelLayoutAbsolute';\n\nconst { Option } = Select;\n\nconst SolarPanelLayoutWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const elements = useStore(Selector.elements);\n const solarPanelArrayLayoutParams = useStore.getState().solarPanelArrayLayoutParams;\n const getSelectedElement = useStore(Selector.getSelectedElement);\n const getParent = useStore(Selector.getParent);\n const pvModules = useStore(Selector.pvModules);\n const getPvModule = useStore(Selector.getPvModule);\n const updateElementReferenceById = useStore(Selector.updateElementReferenceById);\n const countElementsByReferenceId = useStore(Selector.countElementsByReferenceId);\n const removeElementsByReferenceId = useStore(Selector.removeElementsByReferenceId);\n const clearDeletedElements = useStore(Selector.clearDeletedElements);\n const addUndoable = useStore(Selector.addUndoable);\n const applyCount = useStore(Selector.applyCount);\n const setApplyCount = useStore(Selector.setApplyCount);\n const revertApply = useStore(Selector.revertApply);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [warningDialogVisible, setWarningDialogVisible] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const changedRef = useRef(true);\n const okButtonRef = useRef(null);\n const warningOkButtonRef = useRef(null);\n const okButtonClickedRef = useRef(false);\n const pvModelNameRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.pvModelName));\n const rowAxisRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.rowAxis));\n const orientationRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.orientation));\n const tiltAngleRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.tiltAngle));\n const rowsPerRackRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.rowWidth));\n const interRowSpacingRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.interRowSpacing));\n const marginRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.margin) ?? 0);\n const poleHeightRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.poleHeight));\n const poleSpacingRef = useRef(useStore(Selector.solarPanelArrayLayoutParams.poleSpacing));\n\n const lang = { lng: language };\n const pvModel = getPvModule(pvModelNameRef.current);\n const reference = getSelectedElement();\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (warningDialogVisible) {\n warningOkButtonRef.current?.focus();\n }\n }, [warningDialogVisible]);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const isLayoutOk = () => {\n const ly =\n (orientationRef.current === Orientation.portrait ? pvModel.length : pvModel.width) * rowsPerRackRef.current;\n const projectedWidth = ly * Math.abs(Math.sin(tiltAngleRef.current));\n // The solar panel intersects with the ground?\n if (0.5 * projectedWidth > poleHeightRef.current) {\n showError(i18n.t('message.SolarPanelsCannotIntersectWithGround', lang));\n return false;\n }\n // The inter-row spacing is too small?\n if (ly > interRowSpacingRef.current) {\n showError(i18n.t('message.SolarPanelsCannotOverlapWithOneAnother', lang));\n return false;\n }\n // others?\n return true;\n };\n\n const referenceExistingSolarPanels = (area: PolygonModel) => {\n const existingSolarPanels = elements.filter(\n (e) => e.type === ObjectType.SolarPanel && e.parentId === area.parentId,\n );\n if (existingSolarPanels.length > 0) {\n for (const sp of existingSolarPanels) {\n if (sp.referenceId !== area.id) {\n if (Util.isPointInside(sp.cx, sp.cy, area.vertices)) {\n updateElementReferenceById(sp.id, area.id);\n }\n }\n }\n }\n };\n\n const layout = () => {\n if (reference?.type === ObjectType.Polygon) {\n const base = getParent(reference);\n if (base) {\n const newElements: ElementModel[] = [];\n const abs = rowAxisRef.current === RowAxis.eastWest || rowAxisRef.current === RowAxis.northSouth;\n const solarPanels = abs\n ? SolarPanelLayoutAbsolute.create(\n reference as PolygonModel,\n base,\n pvModel,\n orientationRef.current,\n tiltAngleRef.current,\n rowsPerRackRef.current,\n interRowSpacingRef.current,\n rowAxisRef.current,\n poleHeightRef.current,\n poleSpacingRef.current,\n marginRef.current,\n )\n : SolarPanelLayoutRelative.create(\n reference as PolygonModel,\n base,\n pvModel,\n orientationRef.current,\n tiltAngleRef.current,\n rowsPerRackRef.current,\n interRowSpacingRef.current,\n rowAxisRef.current,\n poleHeightRef.current,\n poleSpacingRef.current,\n marginRef.current,\n );\n if (solarPanels.length > 0) {\n for (const panel of solarPanels) {\n newElements.push(JSON.parse(JSON.stringify(panel)));\n setCommonStore((state) => {\n state.elements.push(panel);\n });\n }\n const undoableLayout = {\n name: 'Solar Panel Array Layout',\n timestamp: Date.now(),\n oldElements: useStore.getState().deletedElements,\n newElements: newElements,\n oldParams: {\n pvModelName: solarPanelArrayLayoutParams.pvModelName,\n rowAxis: solarPanelArrayLayoutParams.rowAxis,\n orientation: solarPanelArrayLayoutParams.orientation,\n tiltAngle: solarPanelArrayLayoutParams.tiltAngle,\n rowsPerRack: solarPanelArrayLayoutParams.rowsPerRack,\n interRowSpacing: solarPanelArrayLayoutParams.interRowSpacing,\n poleHeight: solarPanelArrayLayoutParams.poleHeight,\n poleSpacing: solarPanelArrayLayoutParams.poleSpacing,\n margin: solarPanelArrayLayoutParams.margin,\n } as SolarPanelArrayLayoutParams,\n newParams: {\n pvModelName: pvModelNameRef.current,\n rowAxis: rowAxisRef.current,\n orientation: orientationRef.current,\n tiltAngle: tiltAngleRef.current,\n rowsPerRack: rowsPerRackRef.current,\n interRowSpacing: interRowSpacingRef.current,\n poleHeight: poleHeightRef.current,\n poleSpacing: poleSpacingRef.current,\n margin: marginRef.current,\n } as SolarPanelArrayLayoutParams,\n referenceId: reference.id,\n undo: () => {\n removeElementsByReferenceId(undoableLayout.referenceId, false);\n if (undoableLayout.oldElements.length > 0) {\n setCommonStore((state) => {\n for (const e of undoableLayout.oldElements) {\n state.elements.push(e);\n }\n });\n }\n setParams(undoableLayout.oldParams);\n updateStoreParams();\n },\n redo: () => {\n removeElementsByReferenceId(undoableLayout.referenceId, false);\n if (undoableLayout.newElements.length > 0) {\n setCommonStore((state) => {\n for (const e of undoableLayout.newElements) {\n state.elements.push(e);\n }\n });\n }\n setParams(undoableLayout.newParams);\n updateStoreParams();\n },\n } as UndoableLayout;\n addUndoable(undoableLayout);\n setApplyCount(applyCount + 1);\n }\n }\n changedRef.current = false;\n updateStoreParams();\n }\n };\n\n const setParams = (params: SolarPanelArrayLayoutParams) => {\n pvModelNameRef.current = params.pvModelName;\n rowAxisRef.current = params.rowAxis;\n orientationRef.current = params.orientation;\n tiltAngleRef.current = params.tiltAngle;\n rowsPerRackRef.current = params.rowsPerRack;\n interRowSpacingRef.current = params.interRowSpacing;\n poleHeightRef.current = params.poleHeight;\n poleSpacingRef.current = params.poleSpacing;\n marginRef.current = params.margin ?? 0;\n };\n\n // save the values in the common store so that they can be retrieved\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.solarPanelArrayLayoutParams.pvModelName = pvModelNameRef.current;\n state.solarPanelArrayLayoutParams.rowAxis = rowAxisRef.current;\n state.solarPanelArrayLayoutParams.orientation = orientationRef.current;\n state.solarPanelArrayLayoutParams.tiltAngle = tiltAngleRef.current;\n state.solarPanelArrayLayoutParams.rowsPerRack = rowsPerRackRef.current;\n state.solarPanelArrayLayoutParams.interRowSpacing = interRowSpacingRef.current;\n state.solarPanelArrayLayoutParams.poleHeight = poleHeightRef.current;\n state.solarPanelArrayLayoutParams.poleSpacing = poleSpacingRef.current;\n state.solarPanelArrayLayoutParams.margin = marginRef.current;\n });\n };\n\n const apply = () => {\n if (!changedRef.current) return;\n if (isLayoutOk()) {\n if (reference) {\n referenceExistingSolarPanels(reference as PolygonModel);\n if (countElementsByReferenceId(reference.id) > 0) {\n setWarningDialogVisible(true);\n } else {\n clearDeletedElements();\n layout();\n }\n }\n } else {\n showError(i18n.t('polygonMenu.LayoutNotAcceptedCheckYourParameters', lang));\n }\n };\n\n const onApplyClick = () => {\n apply();\n okButtonClickedRef.current = false;\n };\n\n const onCancelClick = () => {\n setDialogVisible(false);\n revertApply();\n changedRef.current = true;\n okButtonClickedRef.current = false;\n };\n\n const onOkClick = () => {\n if (changedRef.current) {\n apply();\n okButtonClickedRef.current = true;\n } else {\n setDialogVisible(false);\n }\n };\n\n const onWarningCancelClick = () => {\n setWarningDialogVisible(false);\n };\n\n const onWarningOkClick = () => {\n if (reference) {\n removeElementsByReferenceId(reference.id, true);\n layout();\n if (okButtonClickedRef.current) {\n setDialogVisible(false);\n setApplyCount(0);\n }\n }\n setWarningDialogVisible(false);\n };\n\n return (\n <>\n {warningDialogVisible && (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('word.Reminder', lang)}\n \n }\n footer={[\n ,\n ,\n ]}\n >\n {i18n.t('message.ExistingSolarPanelsWillBeRemovedBeforeApplyingNewLayout', lang) +\n ' ' +\n i18n.t('message.DoYouWantToContinue', lang)}\n \n )}\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('polygonMenu.SolarPanelArrayLayoutParametricDesign', lang)}\n \n }\n footer={[\n ,\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n changedRef.current = true;\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('polygonMenu.SolarPanelArrayModel', lang) +\n ' (' +\n Object.keys(pvModules).length +\n ' ' +\n i18n.t('word.Options', lang) +\n '):'}\n \n \n {\n pvModelNameRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n >\n {Object.keys(pvModules).map((key) => (\n \n ))}\n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayRowAxis', lang) + ':'}\n \n \n {\n rowAxisRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayOrientation', lang) + ':'}\n \n \n {\n orientationRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayTiltAngle', lang) + ' ([-90°, 90°]): '}\n \n \n `${value}°`}\n onChange={(value) => {\n tiltAngleRef.current = Util.toRadians(value);\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayRowWidth', lang) +\n ' ([1-100] ' +\n i18n.t('solarPanelMenu.Panels', lang) +\n '): '}\n \n \n Number(a).toFixed(0)}\n value={rowsPerRackRef.current}\n onChange={(value) => {\n rowsPerRackRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayInterRowSpacing', lang) +\n ' ([1, 20] ' +\n i18n.t('word.MeterAbbreviation', lang) +\n '): '}\n \n \n {\n interRowSpacingRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayMargin', lang) +\n ' ([0, 5] ' +\n i18n.t('word.MeterAbbreviation', lang) +\n '): '}\n \n \n {\n marginRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayPoleHeight', lang) +\n ' ([0, 10] ' +\n i18n.t('word.MeterAbbreviation', lang) +\n '): '}\n \n \n {\n poleHeightRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayPoleSpacing', lang) +\n ' ([2, 50] ' +\n i18n.t('word.MeterAbbreviation', lang) +\n '): '}\n \n \n {\n poleSpacingRef.current = value;\n changedRef.current = true;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n \n \n );\n};\n\n// don't wrap this with React.memo as changedRef would be saved\nexport default SolarPanelLayoutWizard;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { LineStyle, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonLineStyleSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedLineStyle, setSelectedLineStyle] = useState(polygon?.lineStyle ?? LineStyle.Solid);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updatePolygonLineStyleById = (id: string, style: LineStyle) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).lineStyle = style;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonLineStyleOnSurface = (parentId: string, normal: number[] | undefined, style: LineStyle) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === parentId &&\r\n Util.isIdentical(e.normal, normal) &&\r\n !e.locked\r\n ) {\r\n (e as PolygonModel).lineStyle = style;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonLineStyleAboveFoundation = (foundationId: string, style: LineStyle) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === foundationId && !e.locked) {\r\n (e as PolygonModel).lineStyle = style;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updatePolygonLineStyleForAll = (style: LineStyle) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n (e as PolygonModel).lineStyle = style;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (style: LineStyle) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (style !== (e as PolygonModel).lineStyle) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n if (style !== (e as PolygonModel).lineStyle) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if (style !== (e as PolygonModel).lineStyle) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon?.foundationId && !e.locked) {\r\n if (style !== (e as PolygonModel).lineStyle) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (style !== polygon?.lineStyle) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: LineStyle) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).lineStyle = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLineStyle = (value: LineStyle) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLineStylesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLineStylesSelected.set(elem.id, (elem as PolygonModel).lineStyle ?? LineStyle.Solid);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Line Style for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldLineStylesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, style] of undoableChangeSelected.oldValues.entries()) {\r\n updatePolygonLineStyleById(id, style as LineStyle);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as LineStyle,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLineStylesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLineStylesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldLineStylesAll.set(elem.id, (elem as PolygonModel).lineStyle ?? LineStyle.Solid);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Line Style for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldLineStylesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, style] of undoableChangeAll.oldValues.entries()) {\r\n updatePolygonLineStyleById(id, style as LineStyle);\r\n }\r\n },\r\n redo: () => {\r\n updatePolygonLineStyleForAll(undoableChangeAll.newValue as LineStyle);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePolygonLineStyleForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldLineStylesOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldLineStylesOnSurface.set(elem.id, (elem as PolygonModel).lineStyle ?? LineStyle.Solid);\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Line Style for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLineStylesOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, style] of undoableChangeOnSurface.oldValues.entries()) {\r\n updatePolygonLineStyleById(id, style as LineStyle);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updatePolygonLineStyleOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as LineStyle,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updatePolygonLineStyleOnSurface(polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldLineStylesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldLineStylesAboveFoundation.set(elem.id, (elem as PolygonModel).lineStyle ?? LineStyle.Solid);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Line Style for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLineStylesAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, style] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePolygonLineStyleById(id, style as LineStyle);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePolygonLineStyleAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as LineStyle,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePolygonLineStyleAboveFoundation(polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldStyle = p ? p.lineStyle : polygon.lineStyle;\r\n const undoableChange = {\r\n name: 'Set Line Style of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldStyle,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updatePolygonLineStyleById(undoableChange.changedElementId, undoableChange.oldValue as LineStyle);\r\n },\r\n redo: () => {\r\n updatePolygonLineStyleById(undoableChange.changedElementId, undoableChange.newValue as LineStyle);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePolygonLineStyleById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setLineStyle(selectedLineStyle);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n setSelectedLineStyle(value)}\r\n >\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonLineStyleSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { LineStyle, LineWidth, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonLineWidthSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const updateElementLineWidthById = useStore(Selector.updateElementLineWidthById);\r\n const updateElementLineWidthOnSurface = useStore(Selector.updateElementLineWidthOnSurface);\r\n const updateElementLineWidthAboveFoundation = useStore(Selector.updateElementLineWidthAboveFoundation);\r\n const updateElementLineWidthForAll = useStore(Selector.updateElementLineWidthForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [selectedLineWidth, setSelectedLineWidth] = useState(polygon?.lineWidth ?? 1);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (width: number) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (width !== e.lineWidth) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n if (width !== e.lineWidth) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n if (e.lineWidth !== width) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon?.foundationId && !e.locked) {\r\n if (e.lineWidth !== width) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (width !== polygon?.lineWidth) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && map.has(e.id)) {\r\n (e as PolygonModel).lineWidth = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLineWidth = (value: number) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldLineWidthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLineWidthsSelected.set(elem.id, elem.lineWidth ?? 1);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Line Width for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldLineWidthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, width] of undoableChangeSelected.oldValues.entries()) {\r\n updateElementLineWidthById(id, width as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLineWidthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldLineWidthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon) {\r\n oldLineWidthsAll.set(elem.id, elem.lineWidth ?? 1);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Line Width for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldLineWidthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, width] of undoableChangeAll.oldValues.entries()) {\r\n updateElementLineWidthById(id, width as number);\r\n }\r\n },\r\n redo: () => {\r\n updateElementLineWidthForAll(ObjectType.Polygon, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateElementLineWidthForAll(ObjectType.Polygon, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(polygon);\r\n if (parent) {\r\n const oldLineWidthsOnSurface = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.Polygon &&\r\n elem.parentId === polygon.parentId &&\r\n Util.isIdentical(elem.normal, polygon.normal)\r\n ) {\r\n oldLineWidthsOnSurface.set(elem.id, elem.lineWidth ?? 1);\r\n }\r\n }\r\n const undoableChangeOnSurface = {\r\n name: 'Set Line Width for All Polygons on Same Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLineWidthsOnSurface,\r\n newValue: value,\r\n groupId: polygon.parentId,\r\n normal: polygon.normal,\r\n undo: () => {\r\n for (const [id, width] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateElementLineWidthById(id, width as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateElementLineWidthOnSurface(\r\n ObjectType.Polygon,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateElementLineWidthOnSurface(ObjectType.Polygon, polygon.parentId, polygon.normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldLineWidthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Polygon && elem.foundationId === polygon.foundationId) {\r\n oldLineWidthsAboveFoundation.set(elem.id, elem.lineWidth ?? 1);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Line Width for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLineWidthsAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n for (const [id, width] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateElementLineWidthById(id, width as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateElementLineWidthAboveFoundation(\r\n ObjectType.Polygon,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateElementLineWidthAboveFoundation(ObjectType.Polygon, polygon.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(polygon.id) as PolygonModel;\r\n const oldWidth = p ? p.lineWidth : polygon.lineWidth;\r\n const undoableChange = {\r\n name: 'Set Line Width of Selected Polygon',\r\n timestamp: Date.now(),\r\n oldValue: oldWidth,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updateElementLineWidthById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLineWidthById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLineWidthById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setLineWidth(selectedLineWidth);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n setSelectedLineWidth(value)}\r\n >\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PolygonLineWidthSelection;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select, Slider, Tabs } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport {\n DesignProblem,\n EvolutionMethod,\n GeneticAlgorithmSelectionMethod,\n ObjectiveFunctionType,\n ObjectType,\n Orientation,\n RowAxis,\n SearchMethod,\n} from '../../../types';\nimport { showInfo } from '../../../helpers';\nimport { DefaultSolarPanelArrayLayoutConstraints } from '../../../stores/DefaultSolarPanelArrayLayoutConstraints';\nimport { Util } from '../../../Util';\nimport { HALF_PI } from '../../../constants';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\n\nconst { Option } = Select;\nconst { TabPane } = Tabs;\n\nconst SolarPanelArrayGaWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pvModules = useStore(Selector.pvModules);\n const polygon = useStore(Selector.selectedElement) as PolygonModel;\n const getParent = useStore(Selector.getParent);\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const params = useStore(Selector.evolutionaryAlgorithmState).geneticAlgorithmParams;\n const constraints = useStore(Selector.solarPanelArrayLayoutConstraints);\n const geneticAlgorithmWizardSelectedTab = useStore(Selector.geneticAlgorithmWizardSelectedTab);\n const economicsParams = useStore(Selector.economicsParams);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n\n const dragRef = useRef(null);\n const objectiveFunctionTypeRef = useRef(params.objectiveFunctionType);\n const selectionMethodRef = useRef(params.selectionMethod);\n const searchMethodRef = useRef(params.searchMethod);\n const populationSizeRef = useRef(params.populationSize);\n const maximumGenerationsRef = useRef(params.maximumGenerations);\n const mutationRateRef = useRef(params.mutationRate);\n const selectionRateRef = useRef(params.selectionRate ?? 0.5);\n const crossoverRateRef = useRef(params.crossoverRate ?? 0.5);\n const convergenceThresholdRef = useRef(params.convergenceThreshold);\n const localSearchRadiusRef = useRef(params.localSearchRadius);\n const minimumTiltAngleRef = useRef(constraints.minimumTiltAngle ?? -HALF_PI);\n const maximumTiltAngleRef = useRef(constraints.maximumTiltAngle ?? HALF_PI);\n const minimumRowsPerRackRef = useRef(constraints.minimumRowsPerRack);\n const maximumRowsPerRackRef = useRef(constraints.maximumRowsPerRack);\n const minimumInterRowSpacingRef = useRef(constraints.minimumInterRowSpacing);\n const maximumInterRowSpacingRef = useRef(constraints.maximumInterRowSpacing);\n const okButtonRef = useRef(null);\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const lang = { lng: language };\n const rowAxisRef = useRef(constraints.rowAxis ?? RowAxis.leftRight);\n const foundation = polygon ? (getParent(polygon) as FoundationModel) : undefined;\n const originalSolarPanels = foundation\n ? (getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[])\n : undefined;\n const pvModelNameRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].pvModelName\n : constraints.pvModelName ?? 'CS6X-355P-FG',\n );\n const orientationRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].orientation\n : constraints.orientation ?? Orientation.landscape,\n );\n const poleHeightRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].poleHeight\n : constraints.poleHeight ?? 1,\n );\n const poleSpacingRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].poleSpacing\n : constraints.poleSpacing ?? 3,\n );\n const marginRef = useRef(constraints.margin ?? 0);\n const electricitySellingPriceRef = useRef(economicsParams.electricitySellingPrice);\n const operationalCostPerUnitRef = useRef(economicsParams.operationalCostPerUnit);\n\n // make sure these ref values are updated\n useEffect(() => {\n electricitySellingPriceRef.current = economicsParams.electricitySellingPrice;\n }, [economicsParams.electricitySellingPrice]);\n\n useEffect(() => {\n operationalCostPerUnitRef.current = economicsParams.operationalCostPerUnit;\n }, [economicsParams.operationalCostPerUnit]);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n // save the values in the common store to persist the user's last settings\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.problem = DesignProblem.SOLAR_PANEL_ARRAY;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.objectiveFunctionType = objectiveFunctionTypeRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionMethod = selectionMethodRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.searchMethod = searchMethodRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.populationSize = populationSizeRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.maximumGenerations = maximumGenerationsRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.selectionRate = selectionRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.crossoverRate = crossoverRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.mutationRate = mutationRateRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.convergenceThreshold = convergenceThresholdRef.current;\n state.evolutionaryAlgorithmState.geneticAlgorithmParams.localSearchRadius = localSearchRadiusRef.current;\n if (!state.solarPanelArrayLayoutConstraints)\n state.solarPanelArrayLayoutConstraints = new DefaultSolarPanelArrayLayoutConstraints();\n state.solarPanelArrayLayoutConstraints.minimumRowsPerRack = minimumRowsPerRackRef.current;\n state.solarPanelArrayLayoutConstraints.maximumRowsPerRack = maximumRowsPerRackRef.current;\n state.solarPanelArrayLayoutConstraints.minimumTiltAngle = minimumTiltAngleRef.current;\n state.solarPanelArrayLayoutConstraints.maximumTiltAngle = maximumTiltAngleRef.current;\n state.solarPanelArrayLayoutConstraints.minimumInterRowSpacing = minimumInterRowSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.maximumInterRowSpacing = maximumInterRowSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.poleHeight = poleHeightRef.current;\n state.solarPanelArrayLayoutConstraints.poleSpacing = poleSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.pvModelName = pvModelNameRef.current;\n state.solarPanelArrayLayoutConstraints.rowAxis = rowAxisRef.current;\n state.solarPanelArrayLayoutConstraints.orientation = orientationRef.current;\n state.solarPanelArrayLayoutConstraints.margin = marginRef.current;\n state.economicsParams.operationalCostPerUnit = operationalCostPerUnitRef.current;\n state.economicsParams.electricitySellingPrice = electricitySellingPriceRef.current;\n });\n };\n\n const run = () => {\n if (!runEvolution) {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n }\n updateStoreParams();\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = !state.runEvolution;\n });\n setCommonStore((state) => {\n state.evolutionMethod = EvolutionMethod.GENETIC_ALGORITHM;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Genetic Algorithm for Solar Panel Array Layout',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('optimizationMenu.SolarPanelArrayLayout', lang) +\n ': ' +\n i18n.t('optimizationMenu.GeneticAlgorithmSettings', lang)}\n \n }\n footer={[\n {\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Cancel', lang)}\n ,\n {\n run();\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Run', lang)}\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n {\n setCommonStore((state) => {\n state.geneticAlgorithmWizardSelectedTab = key;\n });\n }}\n >\n \n \n \n {i18n.t('optimizationMenu.Objective', lang) + ':'}\n \n \n {\n objectiveFunctionTypeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.ObjectiveFunctionDailyTotalYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionYearlyTotalYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionDailyMeanYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionYearlyMeanYield', lang)}\n \n \n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.GeneticAlgorithmSelectionMethod', lang) + ':'}\n \n \n {\n selectionMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.RouletteWheel', lang)}\n \n \n {i18n.t('optimizationMenu.Tournament', lang)}\n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.PopulationSize', lang) + ' [10, 100]:'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n populationSizeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumGenerations', lang) + ' [5, 100]:'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n maximumGenerationsRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SelectionRate', lang) + ' [0, 1]: '}\n \n \n {\n selectionRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.CrossoverRate', lang) + ' [0, 1]: '}\n \n \n {\n crossoverRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MutationRate', lang) + ' [0, 1]: '}\n \n \n {\n mutationRateRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.ConvergenceThreshold', lang) + ' (0, 0.1]: '}\n \n \n {\n convergenceThresholdRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SearchMethod', lang) + ':'}\n \n \n {\n searchMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.GlobalSearchUniformSelection', lang)}\n \n \n {i18n.t('optimizationMenu.LocalSearchRandomOptimization', lang)}\n \n \n \n \n\n {searchMethodRef.current === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION && (\n \n \n {i18n.t('optimizationMenu.LocalSearchRadius', lang) + ' ([0, 1]: '}\n \n \n {\n localSearchRadiusRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n )}\n \n\n \n \n \n {i18n.t('optimizationMenu.TiltAngleRange', lang) + ':'}\n \n \n {\n minimumTiltAngleRef.current = Util.toRadians(value[0]);\n maximumTiltAngleRef.current = Util.toRadians(value[1]);\n setUpdateFlag(!updateFlag);\n }}\n min={-90}\n max={90}\n defaultValue={[\n Util.toDegrees(minimumTiltAngleRef.current),\n Util.toDegrees(maximumTiltAngleRef.current),\n ]}\n marks={{\n '-90': {\n style: {\n fontSize: '10px',\n },\n label: '-90°',\n },\n '-45': {\n style: {\n fontSize: '10px',\n },\n label: '-45°',\n },\n '0': {\n style: {\n fontSize: '10px',\n },\n label: '0°',\n },\n '45': {\n style: {\n fontSize: '10px',\n },\n label: '45°',\n },\n '90': {\n style: {\n fontSize: '10px',\n },\n label: '90°',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.RowsPerRackRange', lang) + ':'}\n \n \n {\n minimumRowsPerRackRef.current = value[0];\n maximumRowsPerRackRef.current = value[1];\n setUpdateFlag(!updateFlag);\n }}\n min={1}\n max={9}\n defaultValue={[minimumRowsPerRackRef.current, maximumRowsPerRackRef.current]}\n marks={{\n 1: {\n style: {\n fontSize: '10px',\n },\n label: 1,\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: 2,\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: 3,\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: 4,\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: 5,\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: 6,\n },\n 7: {\n style: {\n fontSize: '10px',\n },\n label: 7,\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: 8,\n },\n 9: {\n style: {\n fontSize: '10px',\n },\n label: 9,\n },\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.InterRowSpacingRange', lang) + ':'}\n \n \n {\n minimumInterRowSpacingRef.current = value[0];\n maximumInterRowSpacingRef.current = value[1];\n setUpdateFlag(!updateFlag);\n }}\n min={1}\n max={10}\n defaultValue={[minimumInterRowSpacingRef.current, maximumInterRowSpacingRef.current]}\n marks={{\n 1: {\n style: {\n fontSize: '10px',\n },\n label: '1m',\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: '3m',\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: '5m',\n },\n 7: {\n style: {\n fontSize: '10px',\n },\n label: '7m',\n },\n 9: {\n style: {\n fontSize: '10px',\n },\n label: '9m',\n },\n }}\n />\n \n \n \n\n \n \n \n {i18n.t('polygonMenu.SolarPanelArrayModel', lang) +\n ' (' +\n Object.keys(pvModules).length +\n ' ' +\n i18n.t('word.Options', lang) +\n '):'}\n \n \n {\n pvModelNameRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n {Object.keys(pvModules).map((key) => (\n \n ))}\n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayRowAxis', lang) + ':'}\n \n \n {\n rowAxisRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayOrientation', lang) + ':'}\n \n \n {\n orientationRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayMargin', lang) + ':'}\n \n \n {\n marginRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0}\n max={5}\n step={0.1}\n defaultValue={marginRef.current}\n marks={{\n 0: {\n style: {\n fontSize: '10px',\n },\n label: '0m',\n },\n 1: {\n style: {\n fontSize: '10px',\n },\n label: '1m',\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: '3m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: '5m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('solarCollectorMenu.PoleHeight', lang) + ':'}\n \n \n {\n poleHeightRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0}\n max={10}\n step={0.1}\n defaultValue={poleHeightRef.current}\n marks={{\n 0: {\n style: {\n fontSize: '10px',\n },\n label: '0m',\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('solarPanelMenu.PoleSpacing', lang) + ':'}\n \n \n {\n poleSpacingRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={2}\n max={10}\n step={0.1}\n defaultValue={poleSpacingRef.current}\n marks={{\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('economicsPanel.OperationalCostPerUnit', lang) + ':'}\n \n \n {\n operationalCostPerUnitRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0.1}\n max={1}\n step={0.01}\n defaultValue={operationalCostPerUnitRef.current}\n marks={{\n 0.1: {\n style: {\n fontSize: '10px',\n },\n label: '10¢',\n },\n 0.3: {\n style: {\n fontSize: '10px',\n },\n label: '30¢',\n },\n 0.5: {\n style: {\n fontSize: '10px',\n },\n label: '50¢',\n },\n 0.7: {\n style: {\n fontSize: '10px',\n },\n label: '70¢',\n },\n 0.9: {\n style: {\n fontSize: '10px',\n },\n label: '90¢',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('economicsPanel.ElectricitySellingPrice', lang) + ':'}\n \n \n {\n electricitySellingPriceRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0.1}\n max={1}\n step={0.01}\n defaultValue={electricitySellingPriceRef.current}\n marks={{\n 0.1: {\n style: {\n fontSize: '10px',\n },\n label: '10¢',\n },\n 0.3: {\n style: {\n fontSize: '10px',\n },\n label: '30¢',\n },\n 0.5: {\n style: {\n fontSize: '10px',\n },\n label: '50¢',\n },\n 0.7: {\n style: {\n fontSize: '10px',\n },\n label: '70¢',\n },\n 0.9: {\n style: {\n fontSize: '10px',\n },\n label: '90¢',\n },\n }}\n />\n \n \n \n \n \n \n );\n};\n\nexport default React.memo(SolarPanelArrayGaWizard);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row, Select, Slider, Tabs } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport i18n from '../../../i18n/i18n';\nimport {\n DesignProblem,\n EvolutionMethod,\n ObjectiveFunctionType,\n ObjectType,\n Orientation,\n RowAxis,\n SearchMethod,\n} from '../../../types';\nimport { showInfo } from '../../../helpers';\nimport { DefaultSolarPanelArrayLayoutConstraints } from '../../../stores/DefaultSolarPanelArrayLayoutConstraints';\nimport { Util } from '../../../Util';\nimport { HALF_PI } from '../../../constants';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { usePrimitiveStore } from '../../../stores/commonPrimitive';\n\nconst { Option } = Select;\nconst { TabPane } = Tabs;\n\nconst SolarPanelArrayPsoWizard = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pvModules = useStore(Selector.pvModules);\n const polygon = useStore(Selector.selectedElement) as PolygonModel;\n const getParent = useStore(Selector.getParent);\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const params = useStore(Selector.evolutionaryAlgorithmState).particleSwarmOptimizationParams;\n const constraints = useStore(Selector.solarPanelArrayLayoutConstraints);\n const particleSwarmOptimizationWizardSelectedTab = useStore(Selector.particleSwarmOptimizationWizardSelectedTab);\n const economicsParams = useStore(Selector.economicsParams);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n\n const dragRef = useRef(null);\n const objectiveFunctionTypeRef = useRef(params.objectiveFunctionType);\n const searchMethodRef = useRef(params.searchMethod);\n const swarmSizeRef = useRef(params.swarmSize);\n const maximumStepsRef = useRef(params.maximumSteps);\n const vmaxRef = useRef(params.vmax ?? 0.01);\n const inertiaRef = useRef(params.inertia ?? 0.8);\n const cognitiveCoefficientRef = useRef(params.cognitiveCoefficient ?? 0.1);\n const socialCoefficientRef = useRef(params.socialCoefficient ?? 0.1);\n const convergenceThresholdRef = useRef(params.convergenceThreshold);\n const localSearchRadiusRef = useRef(params.localSearchRadius);\n const minimumTiltAngleRef = useRef(constraints.minimumTiltAngle ?? -HALF_PI);\n const maximumTiltAngleRef = useRef(constraints.maximumTiltAngle ?? HALF_PI);\n const minimumRowsPerRackRef = useRef(constraints.minimumRowsPerRack);\n const maximumRowsPerRackRef = useRef(constraints.maximumRowsPerRack);\n const minimumInterRowSpacingRef = useRef(constraints.minimumInterRowSpacing);\n const maximumInterRowSpacingRef = useRef(constraints.maximumInterRowSpacing);\n const okButtonRef = useRef(null);\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const lang = { lng: language };\n const rowAxisRef = useRef(constraints.rowAxis ?? RowAxis.leftRight);\n const foundation = polygon ? (getParent(polygon) as FoundationModel) : undefined;\n const originalSolarPanels = foundation\n ? (getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[])\n : undefined;\n const pvModelNameRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].pvModelName\n : constraints.pvModelName ?? 'CS6X-355P-FG',\n );\n const orientationRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].orientation\n : constraints.orientation ?? Orientation.landscape,\n );\n const poleHeightRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].poleHeight\n : constraints.poleHeight ?? 1,\n );\n const poleSpacingRef = useRef(\n originalSolarPanels && originalSolarPanels.length > 0\n ? originalSolarPanels[0].poleSpacing\n : constraints.poleSpacing ?? 3,\n );\n const marginRef = useRef(constraints.margin ?? 0);\n const electricitySellingPriceRef = useRef(economicsParams.electricitySellingPrice);\n const operationalCostPerUnitRef = useRef(economicsParams.operationalCostPerUnit);\n\n // make sure these ref values are updated\n useEffect(() => {\n electricitySellingPriceRef.current = economicsParams.electricitySellingPrice;\n }, [economicsParams.electricitySellingPrice]);\n\n useEffect(() => {\n operationalCostPerUnitRef.current = economicsParams.operationalCostPerUnit;\n }, [economicsParams.operationalCostPerUnit]);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n // save the values in the common store to persist the user's last settings\n const updateStoreParams = () => {\n setCommonStore((state) => {\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem = DesignProblem.SOLAR_PANEL_ARRAY;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.objectiveFunctionType =\n objectiveFunctionTypeRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.searchMethod = searchMethodRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.swarmSize = swarmSizeRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.maximumSteps = maximumStepsRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.cognitiveCoefficient =\n cognitiveCoefficientRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.socialCoefficient = socialCoefficientRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.vmax = vmaxRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.inertia = inertiaRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.convergenceThreshold =\n convergenceThresholdRef.current;\n state.evolutionaryAlgorithmState.particleSwarmOptimizationParams.localSearchRadius = localSearchRadiusRef.current;\n if (!state.solarPanelArrayLayoutConstraints)\n state.solarPanelArrayLayoutConstraints = new DefaultSolarPanelArrayLayoutConstraints();\n state.solarPanelArrayLayoutConstraints.minimumRowsPerRack = minimumRowsPerRackRef.current;\n state.solarPanelArrayLayoutConstraints.maximumRowsPerRack = maximumRowsPerRackRef.current;\n state.solarPanelArrayLayoutConstraints.minimumTiltAngle = minimumTiltAngleRef.current;\n state.solarPanelArrayLayoutConstraints.maximumTiltAngle = maximumTiltAngleRef.current;\n state.solarPanelArrayLayoutConstraints.minimumInterRowSpacing = minimumInterRowSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.maximumInterRowSpacing = maximumInterRowSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.poleHeight = poleHeightRef.current;\n state.solarPanelArrayLayoutConstraints.poleSpacing = poleSpacingRef.current;\n state.solarPanelArrayLayoutConstraints.pvModelName = pvModelNameRef.current;\n state.solarPanelArrayLayoutConstraints.rowAxis = rowAxisRef.current;\n state.solarPanelArrayLayoutConstraints.orientation = orientationRef.current;\n state.solarPanelArrayLayoutConstraints.margin = marginRef.current;\n state.economicsParams.operationalCostPerUnit = operationalCostPerUnitRef.current;\n state.economicsParams.electricitySellingPrice = electricitySellingPriceRef.current;\n });\n };\n\n const run = () => {\n if (!runEvolution) {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n }\n updateStoreParams();\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = !state.runEvolution;\n });\n setCommonStore((state) => {\n state.evolutionMethod = EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Particle Swarm Optimization for Solar Panel Array Layout',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('optimizationMenu.SolarPanelArrayLayout', lang) +\n ': ' +\n i18n.t('optimizationMenu.ParticleSwarmOptimizationSettings', lang)}\n \n }\n footer={[\n {\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Cancel', lang)}\n ,\n {\n run();\n setDialogVisible(false);\n }}\n >\n {i18n.t('word.Run', lang)}\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n {\n setCommonStore((state) => {\n state.particleSwarmOptimizationWizardSelectedTab = key;\n });\n }}\n >\n \n \n \n {i18n.t('optimizationMenu.Objective', lang) + ':'}\n \n \n {\n objectiveFunctionTypeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.ObjectiveFunctionDailyTotalYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionYearlyTotalYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionDailyMeanYield', lang)}\n \n \n {i18n.t('optimizationMenu.ObjectiveFunctionYearlyMeanYield', lang)}\n \n \n \n \n \n \n\n \n \n {i18n.t('optimizationMenu.SwarmSize', lang) + ' [10, 100]:'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n swarmSizeRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumSteps', lang) + ' [5, 100]:'}\n \n \n Number(a).toFixed(0)}\n onChange={(value) => {\n maximumStepsRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.CognitiveCoefficient', lang) + ' [0, 1]: '}\n \n \n {\n cognitiveCoefficientRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SocialCoefficient', lang) + ' [0, 1]: '}\n \n \n {\n socialCoefficientRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.InertiaWeight', lang) + ' [0, 1]: '}\n \n \n {\n inertiaRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.MaximumVelocity', lang) + ' [0.001, 0.1]: '}\n \n \n {\n vmaxRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.ConvergenceThreshold', lang) + ' (0, 0.1]: '}\n \n \n {\n convergenceThresholdRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.SearchMethod', lang) + ':'}\n \n \n {\n searchMethodRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n {i18n.t('optimizationMenu.GlobalSearchUniformSelection', lang)}\n \n \n {i18n.t('optimizationMenu.LocalSearchRandomOptimization', lang)}\n \n \n \n \n\n {searchMethodRef.current === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION && (\n \n \n {i18n.t('optimizationMenu.LocalSearchRadius', lang) + ' ([0, 1]: '}\n \n \n {\n localSearchRadiusRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n )}\n \n\n \n \n \n {i18n.t('optimizationMenu.TiltAngleRange', lang) + ':'}\n \n \n {\n minimumTiltAngleRef.current = Util.toRadians(value[0]);\n maximumTiltAngleRef.current = Util.toRadians(value[1]);\n setUpdateFlag(!updateFlag);\n }}\n min={-90}\n max={90}\n defaultValue={[\n Util.toDegrees(minimumTiltAngleRef.current),\n Util.toDegrees(maximumTiltAngleRef.current),\n ]}\n marks={{\n '-90': {\n style: {\n fontSize: '10px',\n },\n label: '-90°',\n },\n '-45': {\n style: {\n fontSize: '10px',\n },\n label: '-45°',\n },\n '0': {\n style: {\n fontSize: '10px',\n },\n label: '0°',\n },\n '45': {\n style: {\n fontSize: '10px',\n },\n label: '45°',\n },\n '90': {\n style: {\n fontSize: '10px',\n },\n label: '90°',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.RowsPerRackRange', lang) + ':'}\n \n \n {\n minimumRowsPerRackRef.current = value[0];\n maximumRowsPerRackRef.current = value[1];\n setUpdateFlag(!updateFlag);\n }}\n min={1}\n max={9}\n defaultValue={[minimumRowsPerRackRef.current, maximumRowsPerRackRef.current]}\n marks={{\n 1: {\n style: {\n fontSize: '10px',\n },\n label: 1,\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: 2,\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: 3,\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: 4,\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: 5,\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: 6,\n },\n 7: {\n style: {\n fontSize: '10px',\n },\n label: 7,\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: 8,\n },\n 9: {\n style: {\n fontSize: '10px',\n },\n label: 9,\n },\n }}\n />\n \n \n\n \n \n {i18n.t('optimizationMenu.InterRowSpacingRange', lang) + ':'}\n \n \n {\n minimumInterRowSpacingRef.current = value[0];\n maximumInterRowSpacingRef.current = value[1];\n setUpdateFlag(!updateFlag);\n }}\n min={2}\n max={10}\n defaultValue={[minimumInterRowSpacingRef.current, maximumInterRowSpacingRef.current]}\n marks={{\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n \n\n \n \n \n {i18n.t('polygonMenu.SolarPanelArrayModel', lang) +\n ' (' +\n Object.keys(pvModules).length +\n ' ' +\n i18n.t('word.Options', lang) +\n '):'}\n \n \n {\n pvModelNameRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n {Object.keys(pvModules).map((key) => (\n \n ))}\n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayRowAxis', lang) + ':'}\n \n \n {\n rowAxisRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayOrientation', lang) + ':'}\n \n \n {\n orientationRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n\n \n \n {i18n.t('polygonMenu.SolarPanelArrayMargin', lang) + ':'}\n \n \n {\n marginRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0}\n max={5}\n step={0.1}\n defaultValue={marginRef.current}\n marks={{\n 0: {\n style: {\n fontSize: '10px',\n },\n label: '0m',\n },\n 1: {\n style: {\n fontSize: '10px',\n },\n label: '1m',\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 3: {\n style: {\n fontSize: '10px',\n },\n label: '3m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 5: {\n style: {\n fontSize: '10px',\n },\n label: '5m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('solarCollectorMenu.PoleHeight', lang) + ':'}\n \n \n {\n poleHeightRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0}\n max={10}\n step={0.1}\n defaultValue={poleHeightRef.current}\n marks={{\n 0: {\n style: {\n fontSize: '10px',\n },\n label: '0m',\n },\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('solarPanelMenu.PoleSpacing', lang) + ':'}\n \n \n {\n poleSpacingRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={2}\n max={10}\n step={0.1}\n defaultValue={poleSpacingRef.current}\n marks={{\n 2: {\n style: {\n fontSize: '10px',\n },\n label: '2m',\n },\n 4: {\n style: {\n fontSize: '10px',\n },\n label: '4m',\n },\n 6: {\n style: {\n fontSize: '10px',\n },\n label: '6m',\n },\n 8: {\n style: {\n fontSize: '10px',\n },\n label: '8m',\n },\n 10: {\n style: {\n fontSize: '10px',\n },\n label: '10m',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('economicsPanel.OperationalCostPerUnit', lang) + ':'}\n \n \n {\n operationalCostPerUnitRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0.1}\n max={1}\n step={0.01}\n defaultValue={operationalCostPerUnitRef.current}\n marks={{\n 0.1: {\n style: {\n fontSize: '10px',\n },\n label: '10¢',\n },\n 0.3: {\n style: {\n fontSize: '10px',\n },\n label: '30¢',\n },\n 0.5: {\n style: {\n fontSize: '10px',\n },\n label: '50¢',\n },\n 0.7: {\n style: {\n fontSize: '10px',\n },\n label: '70¢',\n },\n 0.9: {\n style: {\n fontSize: '10px',\n },\n label: '90¢',\n },\n }}\n />\n \n \n\n \n \n {i18n.t('economicsPanel.ElectricitySellingPrice', lang) + ':'}\n \n \n {\n electricitySellingPriceRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n min={0.1}\n max={1}\n step={0.01}\n defaultValue={electricitySellingPriceRef.current}\n marks={{\n 0.1: {\n style: {\n fontSize: '10px',\n },\n label: '10¢',\n },\n 0.3: {\n style: {\n fontSize: '10px',\n },\n label: '30¢',\n },\n 0.5: {\n style: {\n fontSize: '10px',\n },\n label: '50¢',\n },\n 0.7: {\n style: {\n fontSize: '10px',\n },\n label: '70¢',\n },\n 0.9: {\n style: {\n fontSize: '10px',\n },\n label: '90¢',\n },\n }}\n />\n \n \n \n \n \n \n );\n};\n\nexport default React.memo(SolarPanelArrayPsoWizard);\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst PolygonOpacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.polygonActionScope);\r\n const setActionScope = useStore(Selector.setPolygonActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [input, setInput] = useState(polygon?.opacity !== undefined ? polygon.opacity : 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateOpacityById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as PolygonModel).opacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateOpacityById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateOpacityById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!polygon) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n value !== (e as PolygonModel).opacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && value !== (e as PolygonModel).opacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.foundationId === polygon.foundationId &&\r\n value !== (e as PolygonModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n value !== (e as PolygonModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== polygon?.opacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!polygon) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const polygon = e as PolygonModel;\r\n oldValuesSelected.set(e.id, polygon.opacity);\r\n updateOpacityById(polygon.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Opacity for Selected Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && !e.locked) {\r\n const polygon = e as PolygonModel;\r\n oldValuesAll.set(e.id, polygon.opacity);\r\n updateOpacityById(polygon.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Opacity for All Polygons',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (polygon.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Polygon && e.foundationId === polygon.foundationId && !e.locked) {\r\n const polygon = e as PolygonModel;\r\n oldValuesAboveFoundation.set(e.id, polygon.opacity);\r\n updateOpacityById(polygon.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Opacity for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n if (polygon.parentId) {\r\n const oldValuesOnSurface = new Map();\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Polygon &&\r\n e.parentId === polygon.parentId &&\r\n Util.isIdentical(e.normal, polygon.normal) &&\r\n !e.locked\r\n ) {\r\n const polygon = e as PolygonModel;\r\n oldValuesOnSurface.set(e.id, polygon.opacity);\r\n updateOpacityById(polygon.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Opacity for All Polygons Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesOnSurface,\r\n newValue: value,\r\n groupId: polygon.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (polygon) {\r\n const updatedPolygon = getElementById(polygon.id) as PolygonModel;\r\n const oldOpacity =\r\n updatedPolygon.opacity !== undefined\r\n ? updatedPolygon.opacity\r\n : polygon.opacity !== undefined\r\n ? polygon.opacity\r\n : 1;\r\n const undoableChange = {\r\n name: 'Set Polygon Opacity',\r\n timestamp: Date.now(),\r\n oldValue: oldOpacity,\r\n newValue: value,\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n undo: () => {\r\n updateOpacityById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateOpacityById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateOpacityById(polygon.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(input);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(1)}\r\n onChange={(value) => setInput(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n setActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('polygonMenu.OnlyThisPolygon', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygonsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllPolygonsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.AllSelectedPolygons', lang)}\r\n \r\n {i18n.t('polygonMenu.AllPolygons', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default PolygonOpacityInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { CheckboxChangeEvent } from 'antd/lib/checkbox';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { Copy, Cut, Lock, Paste } from '../menuItems';\r\nimport { ObjectType, PolygonTexture } from '../../../types';\r\nimport PolygonLineColorSelection from './polygonLineColorSelection';\r\nimport PolygonFillColorSelection from './polygonFillColorSelection';\r\nimport PolygonTextureSelection from './polygonTextureSelection';\r\nimport SolarPanelLayoutWizard from './solarPanelLayoutWizard';\r\nimport PolygonLineStyleSelection from './polygonLineStyleSelection';\r\nimport PolygonLineWidthSelection from './polygonLineWidthSelection';\r\nimport SolarPanelArrayGaWizard from './solarPanelArrayGaWizard';\r\nimport SolarPanelArrayPsoWizard from './solarPanelArrayPsoWizard';\r\nimport PolygonOpacityInput from './polygonOpacityInput';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const PolygonMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const elementsToPaste = useStore(Selector.elementsToPaste);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n\r\n const [textContent, setTextContent] = useState(polygon?.text ?? '');\r\n const [textSize, setTextSize] = useState(polygon?.fontSize ?? 1);\r\n const [textColor, setTextColor] = useState(polygon?.fontColor ?? 'black');\r\n const [textOutlineColor, setTextOutlineColor] = useState(polygon?.fontOutlineColor ?? 'white');\r\n const [textOutlineWidth, setTextOutlineWidth] = useState(polygon?.fontOutlineWidth ?? 0);\r\n const [textStrokeColor, setTextStrokeColor] = useState(polygon?.fontStrokeColor ?? 'black');\r\n const [textStrokeWidth, setTextStrokeWidth] = useState(polygon?.fontStrokeWidth ?? 0);\r\n const [lineColorDialogVisible, setLineColorDialogVisible] = useState(false);\r\n const [lineStyleDialogVisible, setLineStyleDialogVisible] = useState(false);\r\n const [lineWidthDialogVisible, setLineWidthDialogVisible] = useState(false);\r\n const [fillColorDialogVisible, setFillColorDialogVisible] = useState(false);\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [opacityDialogVisible, setOpacityDialogVisible] = useState(false);\r\n const [solarPanelLayoutWizardVisible, setSolarPanelLayoutWizardVisible] = useState(false);\r\n const [solarPanelLayoutGaWizardVisible, setSolarPanelLayoutGaWizardVisible] = useState(false);\r\n const [solarPanelLayoutPsoWizardVisible, setSolarPanelLayoutPsoWizardVisible] = useState(false);\r\n const lang = { lng: language };\r\n\r\n // be sure to get the updated parent so that this memorized element can move with it\r\n const parent = useStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === polygon?.parentId) {\r\n return e;\r\n }\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n if (polygon) {\r\n setTextContent(polygon.text ?? '');\r\n setTextSize(polygon.fontSize ?? 1);\r\n setTextColor(polygon.fontColor ?? 'black');\r\n setTextOutlineColor(polygon.fontOutlineColor ?? 'white');\r\n setTextOutlineWidth(polygon.fontOutlineWidth ?? 0);\r\n setTextStrokeColor(polygon.fontStrokeColor ?? 'black');\r\n setTextStrokeWidth(polygon.fontStrokeWidth ?? 0);\r\n }\r\n }, [polygon]);\r\n\r\n if (!polygon || !parent) return null;\r\n\r\n const editable = !polygon?.locked;\r\n\r\n const updateFilledById = (id: string, filled: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).filled = filled;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateNoOutlineById = (id: string, noOutline: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).noOutline = noOutline;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateShininessById = (id: string, shininess: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n (e as PolygonModel).shininess = shininess;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTextById = (id: string, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).text = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontSizeById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontSize = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontColorById = (id: string, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontColor = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontOutlineWidthById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontOutlineWidth = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontOutlineColorById = (id: string, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontOutlineColor = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontStrokeWidthById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontStrokeWidth = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateFontStrokeColorById = (id: string, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Polygon) {\r\n (e as PolygonModel).fontStrokeColor = value;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const toggleFilled = (e: CheckboxChangeEvent) => {\r\n if (polygon) {\r\n const undoableCheck = {\r\n name: 'Fill Polygon',\r\n timestamp: Date.now(),\r\n checked: !polygon.filled,\r\n selectedElementId: polygon.id,\r\n selectedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFilledById(polygon.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateFilledById(polygon.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateFilledById(polygon.id, e.target.checked);\r\n }\r\n };\r\n\r\n const toggleNoOutline = (e: CheckboxChangeEvent) => {\r\n if (polygon) {\r\n const undoableCheck = {\r\n name: 'No Outline for Polygon',\r\n timestamp: Date.now(),\r\n checked: !polygon.noOutline,\r\n selectedElementId: polygon.id,\r\n selectedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateNoOutlineById(polygon.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateNoOutlineById(polygon.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateNoOutlineById(polygon.id, e.target.checked);\r\n }\r\n };\r\n\r\n const toggleShiny = (e: CheckboxChangeEvent) => {\r\n if (polygon) {\r\n const shininess = 100;\r\n const undoableCheck = {\r\n name: 'Shiny Polygon',\r\n timestamp: Date.now(),\r\n checked: (polygon?.shininess ?? 0) > 0,\r\n selectedElementId: polygon.id,\r\n selectedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateShininessById(polygon.id, undoableCheck.checked ? 0 : shininess);\r\n },\r\n redo: () => {\r\n updateShininessById(polygon.id, undoableCheck.checked ? shininess : 0);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateShininessById(polygon.id, e.target.checked ? shininess : 0);\r\n }\r\n };\r\n\r\n const changeText = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Text for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.text ?? '',\r\n newValue: textContent,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateTextById(polygon.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateTextById(polygon.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateTextById(polygon.id, textContent);\r\n }\r\n };\r\n\r\n const changeFontSize = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Size for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontSize ?? 1,\r\n newValue: textSize,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontSizeById(polygon.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFontSizeById(polygon.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontSizeById(polygon.id, textSize);\r\n }\r\n };\r\n\r\n const changeFontColor = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Color for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontColor ?? 'black',\r\n newValue: textColor,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontColorById(polygon.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateFontColorById(polygon.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontColorById(polygon.id, textColor);\r\n }\r\n };\r\n\r\n const changeFontOutlineWidth = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Outline Width for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontOutlineWidth ?? 0,\r\n newValue: textOutlineWidth,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontOutlineWidthById(polygon.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFontOutlineWidthById(polygon.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontOutlineWidthById(polygon.id, textOutlineWidth);\r\n }\r\n };\r\n\r\n const changeFontOutlineColor = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Outline Color for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontOutlineColor ?? 'white',\r\n newValue: textOutlineColor,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontOutlineColorById(polygon.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateFontOutlineColorById(polygon.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontOutlineColorById(polygon.id, textOutlineColor);\r\n }\r\n };\r\n\r\n const changeFontStrokeWidth = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Stroke Width for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontStrokeWidth ?? 0,\r\n newValue: textStrokeWidth,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontStrokeWidthById(polygon.id, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateFontStrokeWidthById(polygon.id, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontStrokeWidthById(polygon.id, textStrokeWidth);\r\n }\r\n };\r\n\r\n const changeFontStrokeColor = () => {\r\n if (polygon) {\r\n const undoableChange = {\r\n name: 'Set Font Stroke Color for Polygon',\r\n timestamp: Date.now(),\r\n oldValue: polygon.fontStrokeColor ?? 'black',\r\n newValue: textStrokeColor,\r\n changedElementId: polygon.id,\r\n changedElementType: ObjectType.Polygon,\r\n undo: () => {\r\n updateFontStrokeColorById(polygon.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateFontStrokeColorById(polygon.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateFontStrokeColorById(polygon.id, textStrokeColor);\r\n }\r\n };\r\n\r\n const legalToPaste = () => {\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const e = elementsToPaste[0];\r\n if (\r\n e.type === ObjectType.Human ||\r\n e.type === ObjectType.Tree ||\r\n e.type === ObjectType.Polygon ||\r\n e.type === ObjectType.Sensor ||\r\n e.type === ObjectType.SolarPanel\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n \r\n {editable && }\r\n {(parent?.type === ObjectType.Foundation || parent?.type === ObjectType.Cuboid) && (\r\n \r\n {solarPanelLayoutWizardVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPanelLayoutWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('polygonMenu.SolarPanelArrayLayoutParametricDesign', lang)} ...\r\n \r\n \r\n {solarPanelLayoutGaWizardVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPanelLayoutGaWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('optimizationMenu.GeneticAlgorithm', lang)} ...\r\n \r\n {solarPanelLayoutPsoWizardVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setSolarPanelLayoutPsoWizardVisible(true);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('optimizationMenu.ParticleSwarmOptimization', lang)} ...\r\n \r\n \r\n \r\n )}\r\n \r\n {editable && (\r\n \r\n \r\n {i18n.t('polygonMenu.Filled', lang)}\r\n \r\n \r\n )}\r\n {editable && polygon.filled && (\r\n \r\n 0} onChange={toggleShiny}>\r\n {i18n.t('polygonMenu.Shiny', lang)}\r\n \r\n \r\n )}\r\n {editable && (\r\n \r\n \r\n {i18n.t('polygonMenu.NoOutline', lang)}\r\n \r\n \r\n )}\r\n {editable && (\r\n <>\r\n {lineColorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLineColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.LineColor', lang)} ...\r\n \r\n {lineStyleDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLineStyleDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.LineStyle', lang)} ...\r\n \r\n {lineWidthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLineWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.LineWidth', lang)} ...\r\n \r\n \r\n )}\r\n {editable && polygon.filled && (!polygon.textureType || polygon.textureType === PolygonTexture.NoTexture) && (\r\n <>\r\n {fillColorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setFillColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.FillColor', lang)} ...\r\n \r\n \r\n )}\r\n {editable && polygon.filled && (\r\n <>\r\n {textureDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.FillTexture', lang)} ...\r\n \r\n \r\n )}\r\n {editable && polygon.filled && (\r\n <>\r\n {opacityDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setOpacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('polygonMenu.Opacity', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n \r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* text */}\r\n \r\n ) => setTextContent(e.target.value)}\r\n onPressEnter={changeText}\r\n onBlur={changeText}\r\n />\r\n \r\n {/* font size */}\r\n \r\n setTextSize(value)}\r\n onPressEnter={changeFontSize}\r\n onBlur={changeFontSize}\r\n />\r\n \r\n {/* font color */}\r\n \r\n setTextColor(e.target.value)}\r\n onPressEnter={changeFontColor}\r\n onBlur={changeFontColor}\r\n />\r\n \r\n {/* font outline color */}\r\n \r\n setTextOutlineColor(e.target.value)}\r\n onPressEnter={changeFontOutlineColor}\r\n onBlur={changeFontOutlineColor}\r\n />\r\n \r\n {/* font outline width */}\r\n \r\n setTextOutlineWidth(value)}\r\n onPressEnter={changeFontOutlineWidth}\r\n onBlur={changeFontOutlineWidth}\r\n />\r\n \r\n {/* font stroke color */}\r\n \r\n setTextStrokeColor(e.target.value)}\r\n onPressEnter={changeFontStrokeColor}\r\n onBlur={changeFontStrokeColor}\r\n />\r\n \r\n {/* font stroke width */}\r\n \r\n setTextStrokeWidth(value)}\r\n onPressEnter={changeFontStrokeWidth}\r\n onBlur={changeFontStrokeWidth}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Menu } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { PolygonModel } from '../../../models/PolygonModel';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { Point2 } from '../../../models/Point2';\r\nimport { ObjectType, PolygonVertexAction } from '../../../types';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const PolygonVertexMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const polygon = useSelectedElement(ObjectType.Polygon) as PolygonModel | undefined;\r\n const updatePolygonVerticesById = useStore(Selector.updatePolygonVerticesById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n if (!polygon || polygon.selectedIndex < 0) return null;\r\n\r\n const lang = { lng: language };\r\n\r\n const deletePolygonVertexByIndex = (id: string, index: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n p.vertices.splice(index, 1);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const insertPolygonVertexBeforeIndex = (id: string, index: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n const n = p.vertices.length;\r\n if (index > 0 && index < n) {\r\n const newX = 0.5 * (p.vertices[index].x + p.vertices[index - 1].x);\r\n const newY = 0.5 * (p.vertices[index].y + p.vertices[index - 1].y);\r\n p.vertices.splice(index, 0, { x: newX, y: newY } as Point2);\r\n } else if (index === 0) {\r\n const newX = 0.5 * (p.vertices[index].x + p.vertices[n - 1].x);\r\n const newY = 0.5 * (p.vertices[index].y + p.vertices[n - 1].y);\r\n p.vertices.splice(n, 0, { x: newX, y: newY } as Point2);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const insertPolygonVertexAfterIndex = (id: string, index: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Polygon && e.id === id) {\r\n const p = e as PolygonModel;\r\n const n = p.vertices.length;\r\n if (index >= 0 && index < n - 1) {\r\n const newX = 0.5 * (p.vertices[index].x + p.vertices[index + 1].x);\r\n const newY = 0.5 * (p.vertices[index].y + p.vertices[index + 1].y);\r\n p.vertices.splice(index + 1, 0, { x: newX, y: newY } as Point2);\r\n } else if (index === n - 1) {\r\n const newX = 0.5 * (p.vertices[index].x + p.vertices[0].x);\r\n const newY = 0.5 * (p.vertices[index].y + p.vertices[0].y);\r\n p.vertices.splice(n, 0, { x: newX, y: newY } as Point2);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const insertVertexBeforeIndex = () => {\r\n changeVertex(PolygonVertexAction.InsertBeforeIndex);\r\n };\r\n\r\n const insertVertexAfterIndex = () => {\r\n changeVertex(PolygonVertexAction.InsertAfterIndex);\r\n };\r\n\r\n const deleteVertex = () => {\r\n changeVertex(PolygonVertexAction.Delete);\r\n };\r\n\r\n const changeVertex = (action: PolygonVertexAction) => {\r\n if (polygon && polygon.selectedIndex >= 0) {\r\n const oldVertices = polygon.vertices.map((v) => ({ ...v })); // deep copy\r\n switch (action) {\r\n case PolygonVertexAction.Delete:\r\n deletePolygonVertexByIndex(polygon.id, polygon.selectedIndex);\r\n break;\r\n case PolygonVertexAction.InsertBeforeIndex:\r\n insertPolygonVertexBeforeIndex(polygon.id, polygon.selectedIndex);\r\n break;\r\n case PolygonVertexAction.InsertAfterIndex:\r\n insertPolygonVertexAfterIndex(polygon.id, polygon.selectedIndex);\r\n break;\r\n }\r\n const newVertices = (useStore.getState().getElementById(polygon.id) as PolygonModel).vertices.map((v) => ({\r\n ...v,\r\n }));\r\n const undoableChange = {\r\n name: action,\r\n timestamp: Date.now(),\r\n changedElementId: polygon.id,\r\n changedElementType: polygon.type,\r\n oldValue: oldVertices,\r\n newValue: newVertices,\r\n undo: () => {\r\n if (undoableChange.oldValue && Array.isArray(undoableChange.oldValue)) {\r\n updatePolygonVerticesById(undoableChange.changedElementId, oldVertices as Point2[]);\r\n }\r\n },\r\n redo: () => {\r\n updatePolygonVerticesById(undoableChange.changedElementId, newVertices as Point2[]);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {i18n.t('polygonMenu.InsertVertexBeforeIndex', lang)}\r\n \r\n \r\n {i18n.t('polygonMenu.InsertVertexAfterIndex', lang)}\r\n \r\n {polygon && polygon.vertices.length > 3 && (\r\n \r\n {i18n.t('polygonMenu.DeleteVertex', lang)}\r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Checkbox, Input, Menu } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { SensorModel } from '../../../models/SensorModel';\r\nimport { ObjectType } from '../../../types';\r\nimport { useLabel, useLabelShow, useLabelText, useSelectedElement } from './menuHooks';\r\n\r\nexport const SensorMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const sensor = useSelectedElement(ObjectType.Sensor) as SensorModel | undefined;\r\n\r\n const { labelText, setLabelText } = useLabel(sensor);\r\n const showLabel = useLabelShow(sensor);\r\n const updateLabelText = useLabelText(sensor, labelText);\r\n\r\n if (!sensor) return null;\r\n\r\n const lang = { lng: language };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n \r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n \r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, InputNumber, Menu, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { LightModel } from '../../../models/LightModel';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { CompactPicker } from 'react-color';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { ObjectType } from '../../../types';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const LightMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const getParent = useStore(Selector.getParent);\r\n const updateLightInsideById = useStore(Selector.updateInsideLightById);\r\n const light = useSelectedElement(ObjectType.Light) as LightModel | undefined;\r\n\r\n const [inputIntensity, setInputIntensity] = useState(light?.intensity ?? 3);\r\n const [inputDistance, setInputDistance] = useState(light?.distance ?? 5);\r\n const [inputColor, setInputColor] = useState(light?.color ?? '#ffff99');\r\n const [inputInside, setInputInside] = useState(!!light?.inside);\r\n\r\n if (!light) return null;\r\n\r\n const lang = { lng: language };\r\n const parent = light.parentId ? getParent(light) : undefined;\r\n\r\n const updateLightColorById = (id: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Light && e.id === id) {\r\n (e as LightModel).color = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLightIntensityById = (id: string, intensity: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Light && e.id === id) {\r\n (e as LightModel).intensity = intensity;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateLightDistanceById = (id: string, distance: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Light && e.id === id) {\r\n (e as LightModel).distance = distance;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setIntensity = (value: number) => {\r\n if (!light) return;\r\n if (!value || value === inputIntensity) return;\r\n const undoableChange = {\r\n name: 'Set Light Intensity',\r\n timestamp: Date.now(),\r\n oldValue: inputIntensity,\r\n newValue: value,\r\n changedElementId: light.id,\r\n undo: () => {\r\n updateLightIntensityById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLightIntensityById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLightIntensityById(light.id, value);\r\n setInputIntensity(value);\r\n setCommonStore((state) => {\r\n state.actionState.lightIntensity = value;\r\n });\r\n };\r\n\r\n const setDistance = (value: number) => {\r\n if (!light) return;\r\n if (!value || value === inputDistance) return;\r\n const undoableChange = {\r\n name: 'Set Light Distance',\r\n timestamp: Date.now(),\r\n oldValue: inputDistance,\r\n newValue: value,\r\n changedElementId: light.id,\r\n undo: () => {\r\n updateLightDistanceById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLightDistanceById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLightDistanceById(light.id, value);\r\n setInputDistance(value);\r\n setCommonStore((state) => {\r\n state.actionState.lightDistance = value;\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n {parent && (parent.type === ObjectType.Roof || parent.type === ObjectType.Wall) && (\r\n \r\n {\r\n if (!light) return;\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Inside Light',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n undo: () => {\r\n updateLightInsideById(light.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateLightInsideById(light.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateLightInsideById(light.id, checked);\r\n setInputInside(checked);\r\n }}\r\n >\r\n {i18n.t('lightMenu.Inside', lang)}\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {i18n.t('lightMenu.Intensity', lang)}:\r\n setIntensity(value)}\r\n />\r\n \r\n \r\n {i18n.t('lightMenu.MaximumDistance', lang)}:\r\n setDistance(value)}\r\n />\r\n \r\n \r\n\r\n \r\n {\r\n if (!light) return;\r\n const oldColor = light.color;\r\n const newColor = colorResult.hex;\r\n const undoableChange = {\r\n name: 'Set Light Color',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: newColor,\r\n undo: () => {\r\n updateLightColorById(light.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateLightColorById(light.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLightColorById(light.id, newColor);\r\n setInputColor(newColor);\r\n setCommonStore((state) => {\r\n state.actionState.lightColor = newColor;\r\n });\r\n }}\r\n />\r\n \r\n \r\n );\r\n});\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useMemo } from 'react';\nimport { Checkbox, InputNumber, Menu, Radio, Space } from 'antd';\nimport SubMenu from 'antd/lib/menu/SubMenu';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { Theme } from '../../../types';\nimport i18n from '../../../i18n/i18n';\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport { computeSunriseAndSunsetInMinutes } from '../../../analysis/sunTools';\n\nexport const SkyMenu = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const world = useStore.getState().world;\n const axes = useStore(Selector.viewState.axes);\n const theme = useStore(Selector.viewState.theme);\n const showAzimuthAngle = useStore(Selector.viewState.showAzimuthAngle) ?? true;\n const showElevationAngle = useStore(Selector.viewState.showElevationAngle) ?? true;\n const showZenithAngle = useStore(Selector.viewState.showZenithAngle) ?? true;\n const directLightIntensity = useStore(Selector.viewState.directLightIntensity) ?? 1;\n const ambientLightIntensity = useStore(Selector.viewState.ambientLightIntensity) ?? 0.1;\n const airAttenuationCoefficient = useStore(Selector.world.airAttenuationCoefficient) ?? 0.01;\n const airConvectiveCoefficient = useStore(Selector.world.airConvectiveCoefficient) ?? 5;\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n\n const lang = { lng: language };\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(new Date(world.date), world.latitude);\n }, [world.date, world.latitude]);\n\n const radioStyle = {\n display: 'block',\n height: '30px',\n paddingLeft: '10px',\n lineHeight: '30px',\n };\n\n const setAxes = (checked: boolean) => {\n setCommonStore((state) => {\n state.viewState.axes = checked;\n });\n };\n\n const setTheme = (theme: string) => {\n setCommonStore((state) => {\n state.viewState.theme = theme;\n });\n };\n\n const setShowAzimuthAngle = (value: boolean) => {\n setCommonStore((state) => {\n state.viewState.showAzimuthAngle = value;\n });\n };\n\n const setShowElevationAngle = (value: boolean) => {\n setCommonStore((state) => {\n state.viewState.showElevationAngle = value;\n });\n };\n\n const setShowZenithAngle = (value: boolean) => {\n setCommonStore((state) => {\n state.viewState.showZenithAngle = value;\n });\n };\n\n const setDirectLightIntensity = (value: number) => {\n setCommonStore((state) => {\n state.viewState.directLightIntensity = value;\n });\n };\n\n const setAmbientLightIntensity = (value: number) => {\n setCommonStore((state) => {\n state.viewState.ambientLightIntensity = value;\n });\n };\n\n const setAirAttenuationCoefficient = (value: number) => {\n setCommonStore((state) => {\n state.world.airAttenuationCoefficient = value;\n });\n };\n\n const setAirConvectiveCoefficient = (value: number) => {\n setCommonStore((state) => {\n state.world.airConvectiveCoefficient = value;\n });\n };\n\n const setHighestTemperatureTimeInMinutes = (value: number) => {\n setCommonStore((state) => {\n state.world.highestTemperatureTimeInMinutes = value;\n });\n };\n\n return (\n \n \n {\n const checked = e.target.checked;\n const undoableCheck = {\n name: 'Show Axes',\n timestamp: Date.now(),\n checked: checked,\n undo: () => {\n setAxes(!undoableCheck.checked);\n },\n redo: () => {\n setAxes(undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setAxes(checked);\n }}\n >\n {i18n.t('skyMenu.Axes', lang)}\n \n \n\n \n {\n const oldTheme = theme;\n const newTheme = e.target.value;\n const undoableChange = {\n name: 'Select Theme',\n timestamp: Date.now(),\n oldValue: oldTheme,\n newValue: newTheme,\n undo: () => {\n setTheme(undoableChange.oldValue as string);\n },\n redo: () => {\n setTheme(undoableChange.newValue as string);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setTheme(newTheme);\n }}\n >\n \n {i18n.t('skyMenu.ThemeDefault', lang)}\n \n \n {i18n.t('skyMenu.ThemeDesert', lang)}\n \n \n {i18n.t('skyMenu.ThemeDune', lang)}\n \n \n {i18n.t('skyMenu.ThemeForest', lang)}\n \n \n {i18n.t('skyMenu.ThemeGrassland', lang)}\n \n \n {i18n.t('skyMenu.ThemeHill', lang)}\n \n \n {i18n.t('skyMenu.ThemeLake', lang)}\n \n \n {i18n.t('skyMenu.ThemeMountain', lang)}\n \n \n {i18n.t('skyMenu.ThemeRural', lang)}\n \n \n \n\n \n \n \n {\n const oldValue = showAzimuthAngle;\n const newValue = e.target.checked;\n const undoableChange = {\n name: 'Show Azimuth Angle ' + newValue,\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setShowAzimuthAngle(undoableChange.oldValue as boolean);\n },\n redo: () => {\n setShowAzimuthAngle(undoableChange.newValue as boolean);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setShowAzimuthAngle(newValue);\n }}\n >\n {i18n.t('skyMenu.ShowAzimuthAngle', lang)}\n \n \n \n {\n const oldValue = showElevationAngle;\n const newValue = e.target.checked;\n const undoableChange = {\n name: 'Show Elevation Angle ' + newValue,\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setShowElevationAngle(undoableChange.oldValue as boolean);\n },\n redo: () => {\n setShowElevationAngle(undoableChange.newValue as boolean);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setShowElevationAngle(newValue);\n }}\n >\n {i18n.t('skyMenu.ShowElevationAngle', lang)}\n \n \n \n {\n const oldValue = showZenithAngle;\n const newValue = e.target.checked;\n const undoableChange = {\n name: 'Show Zenith Angle ' + newValue,\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setShowZenithAngle(undoableChange.oldValue as boolean);\n },\n redo: () => {\n setShowZenithAngle(undoableChange.newValue as boolean);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setShowZenithAngle(newValue);\n }}\n >\n {i18n.t('skyMenu.ShowZenithAngle', lang)}\n \n \n \n \n\n \n \n {i18n.t('skyMenu.DirectLightBrightnessAtNoon', lang) + ' [0.1-5]:'}\n {\n if (value) {\n const oldValue = directLightIntensity;\n const newValue = value;\n const undoableChange = {\n name: 'Set Direct Light Intensity',\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setDirectLightIntensity(undoableChange.oldValue as number);\n },\n redo: () => {\n setDirectLightIntensity(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setDirectLightIntensity(newValue);\n }\n }}\n />\n \n\n \n \n {i18n.t('skyMenu.AmbientLightBrightnessAtNoon', lang) + ' [0.01-1]:'}\n \n {\n if (value) {\n const oldValue = ambientLightIntensity;\n const newValue = value;\n const undoableChange = {\n name: 'Set Ambient Light Intensity',\n timestamp: Date.now(),\n oldValue: oldValue,\n newValue: newValue,\n undo: () => {\n setAmbientLightIntensity(undoableChange.oldValue as number);\n },\n redo: () => {\n setAmbientLightIntensity(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setAmbientLightIntensity(newValue);\n }\n }}\n />\n \n\n \n {i18n.t('skyMenu.SunlightAttenuationCoefficientInAir', lang) + ':'}\n {\n if (value) {\n const oldAttenuationCoefficient = airAttenuationCoefficient;\n const newAttenuationCoefficient = value;\n const undoableChange = {\n name: 'Set Sunlight Attenuation Coefficient of Air',\n timestamp: Date.now(),\n oldValue: oldAttenuationCoefficient,\n newValue: newAttenuationCoefficient,\n undo: () => {\n setAirAttenuationCoefficient(undoableChange.oldValue as number);\n },\n redo: () => {\n setAirAttenuationCoefficient(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setAirAttenuationCoefficient(newAttenuationCoefficient);\n }\n }}\n />\n \n\n \n \n {i18n.t('skyMenu.ConvectiveCoefficientOfAir', lang) + ' [W/(m²×K)]:'}\n \n {\n if (value) {\n const oldConvectiveCoefficient = airConvectiveCoefficient;\n const newConvectiveCoefficient = value;\n const undoableChange = {\n name: 'Set Convective Coefficient of Air',\n timestamp: Date.now(),\n oldValue: oldConvectiveCoefficient,\n newValue: newConvectiveCoefficient,\n undo: () => {\n setAirConvectiveCoefficient(undoableChange.oldValue as number);\n },\n redo: () => {\n setAirConvectiveCoefficient(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setAirConvectiveCoefficient(newConvectiveCoefficient);\n }\n }}\n />\n \n\n \n {i18n.t('skyMenu.HighestTemperatureTimeInMinutes', lang) + ':'}\n {\n if (value) {\n const oldMinutes = highestTemperatureTimeInMinutes;\n const newMinutes = value;\n const undoableChange = {\n name: 'Set Time of Highest Temperature in Minutes',\n timestamp: Date.now(),\n oldValue: oldMinutes,\n newValue: newMinutes,\n undo: () => {\n setHighestTemperatureTimeInMinutes(undoableChange.oldValue as number);\n },\n redo: () => {\n setHighestTemperatureTimeInMinutes(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setHighestTemperatureTimeInMinutes(newMinutes);\n }\n }}\n />\n \n \n \n );\n};\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nexport class SolarPanelNominalSize {\n static instance = new SolarPanelNominalSize();\n\n private readonly n = 14;\n readonly nominalStrings = new Array(this.n);\n readonly nominalWidths = new Array(this.n);\n readonly nominalHeights = new Array(this.n);\n readonly cellNx = new Array(this.n);\n readonly cellNy = new Array(this.n);\n\n private constructor() {\n // common residential size\n this.nominalWidths[0] = 0.99;\n this.nominalHeights[0] = 1.65;\n this.cellNx[0] = 6;\n this.cellNy[0] = 10;\n\n // common commercial size\n this.nominalWidths[1] = 0.99;\n this.nominalHeights[1] = 1.96;\n this.cellNx[1] = 6;\n this.cellNy[1] = 12;\n\n // SunPower E and X Series\n this.nominalWidths[2] = 1.05;\n this.nominalHeights[2] = 1.56;\n this.cellNx[2] = 8;\n this.cellNy[2] = 12;\n\n // ASP\n this.nominalWidths[3] = 1.31;\n this.nominalHeights[3] = 1.96;\n this.cellNx[3] = 8;\n this.cellNy[3] = 12;\n\n // SunPower E20 COM Series\n this.nominalWidths[4] = 1.07;\n this.nominalHeights[4] = 2.07;\n this.cellNx[4] = 8;\n this.cellNy[4] = 16;\n\n // First Solar Series 2, 4\n this.nominalWidths[5] = 0.6;\n this.nominalHeights[5] = 1.2;\n this.cellNx[5] = 10;\n this.cellNy[5] = 20;\n\n // First Solar Series 6\n this.nominalWidths[6] = 1.2;\n this.nominalHeights[6] = 2.0;\n this.cellNx[6] = 10;\n this.cellNy[6] = 20;\n\n // SunPower P17 Series\n this.nominalWidths[7] = 1.0;\n this.nominalHeights[7] = 2.07;\n this.cellNx[7] = 6;\n this.cellNy[7] = 12;\n\n // SunPower E20-245, E19-235, X20-250-BLK\n this.nominalWidths[8] = 0.8;\n this.nominalHeights[8] = 1.56;\n this.cellNx[8] = 6;\n this.cellNy[8] = 12;\n\n // Sharp NT-175UC1\n this.nominalWidths[9] = 0.83;\n this.nominalHeights[9] = 1.58;\n this.cellNx[9] = 6;\n this.cellNy[9] = 12;\n\n // YL165P-23b\n this.nominalWidths[10] = 0.99;\n this.nominalHeights[10] = 1.31;\n this.cellNx[10] = 6;\n this.cellNy[10] = 8;\n\n // YL205P-26b\n this.nominalWidths[11] = 0.99;\n this.nominalHeights[11] = 1.5;\n this.cellNx[11] = 6;\n this.cellNy[11] = 9;\n\n // SunPower Maxeon 3 Series\n this.nominalWidths[12] = 1.05;\n this.nominalHeights[12] = 1.81;\n this.cellNx[12] = 8;\n this.cellNy[12] = 14;\n\n // SunPower Maxeon 2 Series\n this.nominalWidths[13] = 1.05;\n this.nominalHeights[13] = 1.69;\n this.cellNx[13] = 8;\n this.cellNy[13] = 13;\n\n for (let i = 0; i < this.n; i++) {\n this.nominalStrings[i] =\n this.nominalWidths[i].toFixed(2) +\n 'm × ' +\n this.nominalHeights[i].toFixed(2) +\n 'm (' +\n this.cellNx[i] +\n ' × ' +\n this.cellNy[i] +\n ' cells)';\n }\n }\n}\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Col, Input, InputNumber, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { SolarPanelNominalSize } from '../../../models/SolarPanelNominalSize';\r\nimport { ObjectType, Orientation, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst { Option } = Select;\r\n\r\nconst SolarPanelModelSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const pvModules = useStore(Selector.pvModules);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [selectedPvModel, setSelectedPvModel] = useState(solarPanel?.pvModelName ?? 'SPR-X21-335-BLK');\r\n const [panelSizeString, setPanelSizeString] = useState();\r\n\r\n const lang = useLanguage();\r\n const pvModel = getPvModule(selectedPvModel ?? 'SPR-X21-335-BLK');\r\n\r\n useEffect(() => {\r\n setPanelSizeString(\r\n pvModel.nominalWidth.toFixed(2) +\r\n 'm×' +\r\n pvModel.nominalLength.toFixed(2) +\r\n 'm (' +\r\n pvModel.n +\r\n '×' +\r\n pvModel.m +\r\n ' ' +\r\n i18n.t('pvModelPanel.Cells', lang) +\r\n ')',\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [pvModel]);\r\n\r\n const updateSolarPanelModelById = (id: string, pvModelName: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = pvModelName;\r\n const pvModel = state.pvModules[pvModelName];\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelModelAboveFoundation = (foundationId: string, pvModelName: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n const pvModel = state.pvModules[pvModelName];\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = pvModelName;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelModelOnSurface = (parentId: string, normal: number[] | undefined, pvModelName: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n const pvModel = state.pvModules[pvModelName];\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = pvModelName;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelModelForAll = (pvModelName: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n const pvModel = state.pvModules[pvModelName];\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = pvModelName;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n const pvModel = state.pvModules[value];\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n sp.pvModelName = value;\r\n if (sp.orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.length));\r\n sp.lx = nx * pvModel.width;\r\n sp.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(sp.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(sp.ly / pvModel.width));\r\n sp.lx = nx * pvModel.length;\r\n sp.ly = ny * pvModel.width;\r\n }\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (pvModelName: string) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (solarPanel?.pvModelName !== pvModelName) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setPvModel = (value: string) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldModelsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldModelsSelected.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Model for Selected Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldModelsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, model] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelModelById(id, model as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldModelsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldModelsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldModelsAll.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Model for All Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldModelsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, model] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelModelById(id, model as string);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelModelForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelModelForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldModelsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldModelsAboveFoundation.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Model for All Solar Panels Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldModelsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, model] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelModelById(id, model as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelModelAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelModelAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldModelsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldModelsOnSurface.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldModelsOnSurface.set(elem.id, (elem as SolarPanelModel).pvModelName);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Model for All Solar Panels on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldModelsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, model] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelModelById(id, model as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelModelOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelModelOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldModel = sp ? sp.pvModelName : solarPanel.pvModelName;\r\n const undoableChange = {\r\n name: 'Set Model for Selected Solar Panel',\r\n timestamp: Date.now(),\r\n oldValue: oldModel,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelModelById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateSolarPanelModelById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelModelById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelModelName = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPvModel(selectedPvModel);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.Model', lang) +\r\n ' (' +\r\n Object.keys(pvModules).length +\r\n ' ' +\r\n i18n.t('word.Options', lang) +\r\n '):'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.PanelSize', lang) + ':'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n >\r\n {SolarPanelNominalSize.instance.nominalStrings.map((key) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.CellType', lang) + ':'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.BifacialityFactor', lang) + ':'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('word.Color', lang) + ':'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.SolarCellEfficiency', lang) + ' (%):'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.NominalOperatingCellTemperature', lang) + ' (°C):'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('pvModelPanel.TemperatureCoefficientOfPmax', lang) + ' (%/°C):'}\r\n \r\n \r\n {\r\n if (solarPanel) {\r\n // TODO for custom solar panel\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('word.ApplyTo', lang) + ':'}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelModelSelection;\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport { Checkbox, Divider, Menu, Modal, Radio } from 'antd';\nimport SubMenu from 'antd/lib/menu/SubMenu';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { Copy, Cut, Lock, Paste } from '../menuItems';\nimport i18n from '../../../i18n/i18n';\nimport WallTextureSelection from './wallTextureSelection';\nimport WallColorSelection from './wallColorSelection';\nimport { ParapetArgs, WallFill, WallModel, WallStructure } from 'src/models/WallModel';\nimport { ObjectType, WallTexture } from 'src/types';\nimport { ElementCounter } from '../../../stores/ElementCounter';\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\nimport { UndoableRemoveAllChildren } from '../../../undo/UndoableRemoveAllChildren';\nimport { Util } from 'src/Util';\nimport { UndoableChange } from 'src/undo/UndoableChange';\nimport WallStructureColorSelection from './wallStructureColorSelection';\nimport WallNumberInput from './wallNumberInput';\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\nimport { LightModel } from '../../../models/LightModel';\nimport WallRValueInput from './wallRValueInput';\nimport WallHeatCapacityInput from './wallHeatCapacityInput';\nimport { Euler, Vector3 } from 'three';\nimport { UndoableAdd } from '../../../undo/UndoableAdd';\nimport { ElementModelFactory } from '../../../models/ElementModelFactory';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { UndoableCheck } from 'src/undo/UndoableCheck';\nimport WallParapetNumberInput from './wallParapetNumberInput';\nimport WallParapetColorSelection from './wallParapetColorSelection';\nimport WallParapetTextureSelection from './wallParapetTextureSelection';\nimport { useSelectedElement } from './menuHooks';\n\nenum DataType {\n Height = 'Height',\n Opacity = 'Opacity',\n StructureSpacing = 'StructureSpacing',\n StructureWidth = 'StructureWidth',\n Thickness = 'Thickness',\n StructureColor = 'StructureColor',\n Color = 'Color',\n Texture = 'Texture',\n EavesLength = 'EavesLength',\n ParapetColor = 'ParapetColor',\n ParapetTexture = 'ParapetTexture',\n ParapetHeight = 'ParapetHeight',\n CopingsHeight = 'CopingsHeight',\n CopingsWidth = 'CopingsWidth',\n}\n\ntype NumberDialogSettingType = {\n attributeKey: keyof WallModel;\n range: [min: number, max: number];\n step: number;\n unit?: string;\n};\n\ntype ParapetNumberDialogSettingType = {\n attributeKey: keyof ParapetArgs;\n range: [min: number, max: number];\n step: number;\n unit?: string;\n};\n\nconst DialogSetting = {\n Height: { attributeKey: 'lz', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation' },\n Opacity: { attributeKey: 'opacity', range: [0, 1], step: 0.01 },\n StructureSpacing: { attributeKey: 'structureSpacing', range: [0.1, 1000], step: 0.1, unit: 'word.MeterAbbreviation' },\n StructureWidth: { attributeKey: 'structureWidth', range: [0.01, 1], step: 0.1, unit: 'word.MeterAbbreviation' },\n Thickness: { attributeKey: 'ly', range: [0.1, 1], step: 0.01, unit: 'word.MeterAbbreviation' },\n EavesLength: { attributeKey: 'eavesLength', range: [-0.1, 5], step: 0.01, unit: 'word.MeterAbbreviation' },\n ParapetHeight: { attributeKey: 'parapetHeight', range: [0, 5], step: 0.01, unit: 'word.MeterAbbreviation' },\n CopingsHeight: { attributeKey: 'copingsHeight', range: [0, 1], step: 0.01, unit: 'word.MeterAbbreviation' },\n CopingsWidth: { attributeKey: 'copingsWidth', range: [0, 3], step: 0.01, unit: 'word.MeterAbbreviation' },\n};\n\nconst ParapetDialogSetting = {\n ParapetHeight: { attributeKey: 'parapetHeight', range: [0, 5], step: 0.01, unit: 'word.MeterAbbreviation' },\n CopingsHeight: { attributeKey: 'copingsHeight', range: [0, 1], step: 0.01, unit: 'word.MeterAbbreviation' },\n CopingsWidth: { attributeKey: 'copingsWidth', range: [0, 3], step: 0.01, unit: 'word.MeterAbbreviation' },\n};\n\nexport const radioStyle = {\n display: 'block',\n height: '30px',\n paddingLeft: '10px',\n lineHeight: '30px',\n};\n\nexport const WallMenu = React.memo(() => {\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const setApplyCount = useStore(Selector.setApplyCount);\n const countAllOffspringsByType = useStore(Selector.countAllOffspringsByTypeAtOnce);\n const removeAllChildElementsByType = useStore(Selector.removeAllChildElementsByType);\n const addUndoable = useStore(Selector.addUndoable);\n const updateElementLockById = useStore(Selector.updateElementLockById);\n const updateElementUnlockByParentId = useStore(Selector.updateElementLockByParentId);\n const updateInsideLightsByParentId = useStore(Selector.updateInsideLightsByParentId);\n const updateInsideLightById = useStore(Selector.updateInsideLightById);\n const removeElementById = useStore(Selector.removeElementById);\n const getFoundation = useStore(Selector.getFoundation);\n\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\n\n const [dataType, setDataType] = useState(null);\n const [rValueDialogVisible, setRValueDialogVisible] = useState(false);\n const [heatCapacityDialogVisible, setHeatCapacityDialogVisible] = useState(false);\n\n if (!wall) return null;\n\n const lang = { lng: language };\n const paddingLeft = '36px';\n\n const updateParapetDisplayById = (id: string, display: boolean) => {\n setCommonStore((state) => {\n const wall = state.elements.find((e) => e.id === id && e.type === ObjectType.Wall) as WallModel;\n if (!wall) return;\n wall.parapet.display = display;\n });\n };\n\n const updateWallStructureById = (id: string, structure: WallStructure) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Wall) {\n const wallModel = e as WallModel;\n wallModel.wallStructure = structure;\n if (structure === WallStructure.Stud || structure === WallStructure.Pillar) {\n wallModel.opacity = 0;\n }\n break;\n }\n }\n });\n };\n\n const legalToPaste = () => {\n const elementsToPaste = useStore.getState().elementsToPaste;\n if (elementsToPaste && elementsToPaste.length > 0) {\n const e = elementsToPaste[0];\n if (Util.isLegalOnWall(e.type)) {\n return true;\n }\n }\n return false;\n };\n\n const handleClearOk = (objectType: ObjectType) => {\n if (wall) {\n const removed = useStore\n .getState()\n .elements.filter((e) => !e.locked && e.type === objectType && e.parentId === wall.id);\n removeAllChildElementsByType(wall.id, objectType);\n const removedElements = JSON.parse(JSON.stringify(removed));\n const undoableRemoveAllChildren = {\n name: `Remove All ${objectType}s on Wall`,\n timestamp: Date.now(),\n parentId: wall.id,\n removedElements: removedElements,\n undo: () => {\n setCommonStore((state) => {\n state.elements.push(...undoableRemoveAllChildren.removedElements);\n });\n },\n redo: () => {\n removeAllChildElementsByType(undoableRemoveAllChildren.parentId, objectType);\n },\n } as UndoableRemoveAllChildren;\n addUndoable(undoableRemoveAllChildren);\n }\n };\n\n const updateWallFillById = (id: string, fill: WallFill) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Wall) {\n (e as WallModel).fill = fill;\n break;\n }\n }\n });\n };\n\n const updateOpenToOutsideById = (id: string, open: boolean) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Wall) {\n (e as WallModel).openToOutside = open;\n break;\n }\n }\n });\n };\n\n const renderCopy = () => ;\n\n const renderLock = () => ;\n\n const renderCut = () => {\n if (!wall || wall.locked) {\n return null;\n }\n return ;\n };\n\n const renderPaste = () => {\n if (!legalToPaste()) {\n return null;\n }\n return ;\n };\n\n const renderParapetSubMenu = () => {\n if (!wall) return null;\n\n return (\n \n \n {\n const checked = e.target.checked;\n const undoableCheck = {\n name: 'Parapet',\n timestamp: Date.now(),\n checked: checked,\n selectedElementId: wall.id,\n selectedElementType: wall.type,\n undo: () => {\n updateParapetDisplayById(wall.id, !undoableCheck.checked);\n },\n redo: () => {\n updateParapetDisplayById(wall.id, undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n updateParapetDisplayById(wall.id, checked);\n setCommonStore((state) => {\n state.actionState.wallParapet.display = checked;\n });\n }}\n >\n {i18n.t('wallMenu.Parapet', { lng: language })}\n \n \n\n \n\n {renderMenuItem(DataType.ParapetColor)}\n {renderMenuItem(DataType.ParapetTexture)}\n {renderMenuItem(DataType.ParapetHeight)}\n {renderMenuItem(DataType.CopingsHeight)}\n {renderMenuItem(DataType.CopingsWidth)}\n \n );\n };\n\n const renderFillSubMenu = () => {\n if (!wall) {\n return null;\n }\n return (\n \n {\n const undoableChange = {\n name: 'Select Wall Fill',\n timestamp: Date.now(),\n oldValue: wall.fill,\n newValue: e.target.value,\n changedElementId: wall.id,\n changedElementType: wall.type,\n undo: () => {\n updateWallFillById(undoableChange.changedElementId, undoableChange.oldValue as WallFill);\n },\n redo: () => {\n updateWallFillById(undoableChange.changedElementId, undoableChange.newValue as WallFill);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateWallFillById(wall.id, e.target.value);\n }}\n >\n \n {i18n.t('wallMenu.Full', lang)}\n \n \n {i18n.t('wallMenu.Partial', lang)}\n \n \n {i18n.t('wallMenu.Empty', lang)}\n \n \n {wall.fill !== WallFill.Full && (\n
\n {\n const undoableChange = {\n name: 'Set Open to Outside',\n timestamp: Date.now(),\n oldValue: !!wall.openToOutside,\n newValue: e.target.checked,\n changedElementId: wall.id,\n changedElementType: wall.type,\n undo: () => {\n updateOpenToOutsideById(undoableChange.changedElementId, undoableChange.oldValue as boolean);\n },\n redo: () => {\n updateOpenToOutsideById(undoableChange.changedElementId, undoableChange.newValue as boolean);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateOpenToOutsideById(wall.id, e.target.checked);\n }}\n >\n {i18n.t('wallMenu.OpenToOutside', lang)}\n \n
\n )}\n
\n );\n };\n\n const renderStructureSubMenu = () => {\n if (!wall) {\n return null;\n }\n return (\n \n {\n const undoableChange = {\n name: 'Select Wall Structure',\n timestamp: Date.now(),\n oldValue: wall.wallStructure,\n newValue: e.target.value,\n changedElementId: wall.id,\n changedElementType: wall.type,\n undo: () => {\n updateWallStructureById(undoableChange.changedElementId, undoableChange.oldValue as WallStructure);\n },\n redo: () => {\n updateWallStructureById(undoableChange.changedElementId, undoableChange.newValue as WallStructure);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateWallStructureById(wall.id, e.target.value);\n setCommonStore((state) => {\n state.actionState.wallStructure = e.target.value;\n if (\n state.actionState.wallStructure === WallStructure.Stud ||\n state.actionState.wallStructure === WallStructure.Pillar\n ) {\n state.actionState.wallOpacity = 0;\n }\n });\n }}\n >\n \n {i18n.t('wallMenu.DefaultStructure', lang)}\n \n \n {i18n.t('wallMenu.StudStructure', lang)}\n \n \n {i18n.t('wallMenu.PillarStructure', lang)}\n \n \n \n );\n };\n\n const renderStructureItems = () => {\n if (wall?.wallStructure === WallStructure.Stud || wall?.wallStructure === WallStructure.Pillar) {\n return (\n <>\n {renderMenuItem(DataType.StructureSpacing)}\n\n {renderMenuItem(DataType.StructureWidth)}\n\n {renderMenuItem(DataType.StructureColor)}\n\n {renderMenuItem(DataType.Opacity)}\n \n );\n }\n return null;\n };\n\n const renderMenuItem = (dataType: DataType) => {\n return (\n {\n setApplyCount(0);\n setDataType(dataType);\n }}\n >\n {i18n.t(`wallMenu.${dataType}`, lang)} ...\n \n );\n };\n\n const renderTexture = () => {\n if (wall?.wallStructure === WallStructure.Default) {\n return renderMenuItem(DataType.Texture);\n }\n return null;\n };\n\n const renderWallColor = () => {\n if (\n (wall?.wallStructure === WallStructure.Default || wall?.opacity === undefined || wall?.opacity > 0) &&\n (wall?.textureType === WallTexture.NoTexture || wall?.textureType === WallTexture.Default)\n ) {\n return renderMenuItem(DataType.Color);\n }\n return null;\n };\n\n const renderClearItem = (objectType: ObjectType, count: number) => {\n if (count === 0) return null;\n\n const titleText = (type: string, count: number) =>\n `${i18n.t(`wallMenu.DoYouReallyWantToRemoveAll${type}sOnThisWall`, lang)} (${count} ${i18n.t(\n `wallMenu.${type}s`,\n lang,\n )})?`;\n\n const objectTypeText = objectType.replaceAll(' ', '');\n\n return (\n {\n Modal.confirm({\n title: titleText(objectTypeText, count),\n icon: ,\n onOk: () => {\n handleClearOk(objectType);\n },\n });\n }}\n >\n {i18n.t(`wallMenu.RemoveAllUnlocked${objectTypeText}s`, lang)} ({count})\n \n );\n };\n\n const renderLockItem = (objectType: ObjectType, count: number) => {\n if (count === 0) return null;\n const objectTypeText = objectType.replaceAll(' ', '');\n return (\n {\n if (!wall) return;\n const oldLocks = new Map();\n for (const elem of useStore.getState().elements) {\n if (elem.parentId === wall.id && elem.type === objectType) {\n oldLocks.set(elem.id, !!elem.locked);\n }\n }\n updateElementUnlockByParentId(wall.id, objectType, true);\n const undoableLockAllElementsOfType = {\n name: 'Lock All ' + objectTypeText + ' on Wall',\n timestamp: Date.now(),\n oldValues: oldLocks,\n newValue: true,\n undo: () => {\n for (const [id, locked] of undoableLockAllElementsOfType.oldValues.entries()) {\n updateElementLockById(id, locked as boolean);\n }\n },\n redo: () => {\n updateElementUnlockByParentId(wall.id, objectType, true);\n },\n } as UndoableChangeGroup;\n addUndoable(undoableLockAllElementsOfType);\n }}\n >\n {i18n.t(`wallMenu.LockAll${objectTypeText}s`, lang)} ({count})\n \n );\n };\n\n const renderUnlockItem = (objectType: ObjectType, count: number) => {\n if (count === 0) return null;\n const objectTypeText = objectType.replaceAll(' ', '');\n return (\n {\n if (!wall) return;\n const oldLocks = new Map();\n for (const elem of useStore.getState().elements) {\n if (elem.parentId === wall.id && elem.type === objectType) {\n oldLocks.set(elem.id, !!elem.locked);\n }\n }\n updateElementUnlockByParentId(wall.id, objectType, false);\n const undoableUnlockAllElementsOfType = {\n name: 'Unlock All ' + objectTypeText + ' on Wall',\n timestamp: Date.now(),\n oldValues: oldLocks,\n newValue: true,\n undo: () => {\n for (const [id, locked] of undoableUnlockAllElementsOfType.oldValues.entries()) {\n updateElementLockById(id, locked as boolean);\n }\n },\n redo: () => {\n updateElementUnlockByParentId(wall.id, objectType, false);\n },\n } as UndoableChangeGroup;\n addUndoable(undoableUnlockAllElementsOfType);\n }}\n >\n {i18n.t(`wallMenu.UnlockAll${objectTypeText}s`, lang)}\n \n );\n };\n\n const renderInsideLightItem = (count: number, inside: boolean) => {\n if (count === 0) return null;\n return (\n {\n if (!wall) return;\n const oldValues = new Map();\n for (const elem of useStore.getState().elements) {\n if (elem.parentId === wall.id && elem.type === ObjectType.Light) {\n oldValues.set(elem.id, (elem as LightModel).inside);\n }\n }\n updateInsideLightsByParentId(wall.id, inside);\n const undoableInsideLightsOnWall = {\n name: inside ? 'Set All Lights on Wall Inside' : 'Set All Lights on Wall Outside',\n timestamp: Date.now(),\n oldValues: oldValues,\n newValue: true,\n undo: () => {\n for (const [id, inside] of undoableInsideLightsOnWall.oldValues.entries()) {\n updateInsideLightById(id, inside as boolean);\n }\n },\n redo: () => {\n updateInsideLightsByParentId(wall.id, inside);\n },\n } as UndoableChangeGroup;\n addUndoable(undoableInsideLightsOnWall);\n }}\n >\n {i18n.t(inside ? `wallMenu.AllLightsOnWallInside` : `wallMenu.AllLightsOnWallOutside`, lang)} ({count})\n \n );\n };\n\n const renderElementsSubMenu = () => {\n const counterAll = wall ? countAllOffspringsByType(wall.id, true) : new ElementCounter();\n if (counterAll.gotSome() && useStore.getState().contextMenuObjectType) {\n const counterUnlocked = wall ? countAllOffspringsByType(wall.id, false) : new ElementCounter();\n return (\n \n {renderClearItem(ObjectType.Window, counterUnlocked.windowCount)}\n {renderClearItem(ObjectType.Door, counterUnlocked.doorCount)}\n {renderClearItem(ObjectType.SolarPanel, counterUnlocked.solarPanelCount)}\n {renderClearItem(ObjectType.Sensor, counterUnlocked.sensorCount)}\n {renderClearItem(ObjectType.Light, counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount)}\n {renderClearItem(ObjectType.Polygon, counterUnlocked.polygonCount)}\n {renderLockItem(ObjectType.Window, counterUnlocked.windowCount)}\n {renderUnlockItem(ObjectType.Window, counterAll.windowCount)}\n {renderLockItem(ObjectType.SolarPanel, counterUnlocked.solarPanelCount)}\n {renderUnlockItem(ObjectType.SolarPanel, counterAll.solarPanelCount)}\n {renderLockItem(ObjectType.Sensor, counterUnlocked.sensorCount)}\n {renderUnlockItem(ObjectType.Sensor, counterAll.sensorCount)}\n {renderInsideLightItem(counterAll.outsideLightCount, true)}\n {renderInsideLightItem(counterAll.insideLightCount, false)}\n {renderLockItem(ObjectType.Polygon, counterUnlocked.polygonCount)}\n {renderUnlockItem(ObjectType.Polygon, counterAll.polygonCount)}\n \n );\n }\n return null;\n };\n\n const renderDialogs = () => {\n switch (dataType) {\n case DataType.Height:\n case DataType.Opacity:\n case DataType.Thickness:\n case DataType.StructureSpacing:\n case DataType.StructureWidth:\n case DataType.EavesLength: {\n const setting = DialogSetting[dataType] as NumberDialogSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n unit={setting.unit ? i18n.t(setting.unit, lang) : undefined}\n />\n );\n }\n case DataType.ParapetHeight:\n case DataType.CopingsHeight:\n case DataType.CopingsWidth: {\n const setting = ParapetDialogSetting[dataType] as ParapetNumberDialogSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n unit={setting.unit ? i18n.t(setting.unit, lang) : undefined}\n />\n );\n }\n case DataType.Color:\n return setDataType(null)} />;\n case DataType.StructureColor:\n return setDataType(null)} />;\n case DataType.ParapetColor:\n return setDataType(null)} />;\n case DataType.Texture:\n return setDataType(null)} />;\n case DataType.ParapetTexture:\n return setDataType(null)} />;\n }\n };\n\n const getRelativePosOnWall = (p: Vector3, wall: WallModel, foundation: FoundationModel) => {\n const { cx, cy, cz } = wall;\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n if (foundation && wallAbsAngle !== undefined) {\n const wallAbsPos = Util.wallAbsolutePosition(new Vector3(cx, cy, cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n return new Vector3().subVectors(p, wallAbsPos).applyEuler(new Euler(0, 0, -wallAbsAngle));\n }\n return new Vector3();\n };\n\n return (\n \n {renderPaste()}\n\n {renderCopy()}\n\n {renderCut()}\n\n {renderLock()}\n\n {!wall.locked && (\n <>\n {renderDialogs()}\n\n {renderElementsSubMenu()}\n\n {renderParapetSubMenu()}\n\n {renderStructureSubMenu()}\n\n {renderStructureItems()}\n\n {\n if (wall) {\n const foundation = getFoundation(wall);\n if (foundation) {\n const p = getRelativePosOnWall(useStore.getState().pastePoint, wall, foundation);\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.Polygon;\n });\n const polygon = ElementModelFactory.makePolygon(\n wall,\n -p.x / wall.lx,\n 0,\n -p.z / wall.lz,\n new Vector3(0, 0, 1),\n [0, 0, 0],\n ObjectType.Wall,\n );\n setCommonStore((state) => {\n state.elements.push(polygon);\n state.objectTypeToAdd = ObjectType.None;\n });\n const undoableAdd = {\n name: 'Add',\n timestamp: Date.now(),\n addedElement: polygon,\n undo: () => {\n removeElementById(undoableAdd.addedElement.id, false);\n },\n redo: () => {\n setCommonStore((state) => {\n state.elements.push(undoableAdd.addedElement);\n state.selectedElement = undoableAdd.addedElement;\n });\n },\n } as UndoableAdd;\n addUndoable(undoableAdd);\n setCommonStore((state) => {\n state.objectTypeToAdd = ObjectType.None;\n });\n }\n }\n }}\n >\n {i18n.t('foundationMenu.AddPolygon', lang)}\n \n\n {renderFillSubMenu()}\n\n {renderMenuItem(DataType.Thickness)}\n\n {renderMenuItem(DataType.Height)}\n\n {renderMenuItem(DataType.EavesLength)}\n\n {/* r-value has its special UI */}\n {rValueDialogVisible && }\n {\n setApplyCount(0);\n setRValueDialogVisible(true);\n }}\n >\n {i18n.t('word.RValue', lang)} ...\n \n {heatCapacityDialogVisible && }\n {\n setApplyCount(0);\n setHeatCapacityDialogVisible(true);\n }}\n >\n {i18n.t('word.VolumetricHeatCapacity', lang)} ...\n \n\n {renderTexture()}\n\n {renderWallColor()}\n \n )}\n \n );\n});\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ElementState, ObjectType, Orientation, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { UNIT_VECTOR_POS_Z_ARRAY } from '../../../constants';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst { Option } = Select;\r\n\r\nconst SolarPanelOrientationSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const getParent = useStore(Selector.getParent);\r\n const setElementSize = useStore(Selector.setElementSize);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [selectedOrientation, setSelectedOrientation] = useState(\r\n solarPanel?.orientation ?? Orientation.portrait,\r\n );\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSolarPanelOrientationById = (id: string, orientation: Orientation) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, orientation);\r\n if (sp.parentType === ObjectType.Wall) {\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelOrientationAboveFoundation = (foundationId: string, orientation: Orientation) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, orientation);\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelOrientationOnSurface = (\r\n parentId: string,\r\n normal: number[] | undefined,\r\n orientation: Orientation,\r\n ) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n let updateWall = false;\r\n\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, orientation);\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelOrientationForAll = (orientation: Orientation) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n let updateWall = false;\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, orientation);\r\n if (sp.parentType === ObjectType.Wall) {\r\n updateWall = true;\r\n }\r\n }\r\n }\r\n if (updateWall) {\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: Orientation) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n const pvModel = state.pvModules[sp.pvModelName];\r\n state.setSolarPanelOrientation(sp, pvModel, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n // cannot use the stored dx, dy in the following calculation\r\n // as changing orientation does not cause it to update\r\n const changeOrientation = (value: Orientation) => {\r\n if (solarPanel) {\r\n const pvModel = getPvModule(solarPanel.pvModelName);\r\n if (value === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(solarPanel.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(solarPanel.ly / pvModel.length));\r\n setElementSize(solarPanel.id, nx * pvModel.width, ny * pvModel.length);\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(solarPanel.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(solarPanel.ly / pvModel.width));\r\n setElementSize(solarPanel.id, nx * pvModel.length, ny * pvModel.width);\r\n }\r\n updateSolarPanelOrientationById(solarPanel.id, value);\r\n }\r\n };\r\n\r\n const withinParent = (sp: SolarPanelModel, orientation: Orientation) => {\r\n const parent = getParent(sp);\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid && !Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // TODO: cuboid vertical sides\r\n return true;\r\n }\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.orientation = orientation;\r\n const pvModel = getPvModule(clone.pvModelName);\r\n if (orientation === Orientation.portrait) {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(clone.lx / pvModel.width));\r\n const ny = Math.max(1, Math.round(clone.ly / pvModel.length));\r\n clone.lx = nx * pvModel.width;\r\n clone.ly = ny * pvModel.length;\r\n } else {\r\n // calculate the current x-y layout\r\n const nx = Math.max(1, Math.round(clone.lx / pvModel.length));\r\n const ny = Math.max(1, Math.round(clone.ly / pvModel.width));\r\n clone.lx = nx * pvModel.length;\r\n clone.ly = ny * pvModel.width;\r\n }\r\n if (parent.type === ObjectType.Wall) {\r\n // maybe outside bound or overlap with others\r\n return Util.checkElementOnWallState(clone, parent) === ElementState.Valid;\r\n }\r\n if (parent.type === ObjectType.Roof) {\r\n return Util.checkElementOnRoofState(clone, parent as RoofModel) === ElementState.Valid;\r\n }\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (sp: SolarPanelModel, orientation: Orientation) => {\r\n // check if the new orientation will cause the solar panel to be out of the bound\r\n if (!withinParent(sp, orientation)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (orientation: Orientation) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (solarPanel?.orientation !== orientation) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setOrientation = (value: Orientation) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(solarPanel.orientation);\r\n } else {\r\n const oldOrientationsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldOrientationsSelected.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Orientation for Selected Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldOrientationsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, orientation] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelOrientationById(id, orientation as Orientation);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as Orientation,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldOrientationsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(solarPanel.orientation);\r\n } else {\r\n const oldOrientationsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldOrientationsAll.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Orientation for All Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldOrientationsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, orientation] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelOrientationById(id, orientation as Orientation);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelOrientationForAll(undoableChangeAll.newValue as Orientation);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelOrientationForAll(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(solarPanel.orientation);\r\n } else {\r\n const oldOrientationsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldOrientationsAboveFoundation.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Orientation for All Solar Panels Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldOrientationsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, orientation] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelOrientationById(id, orientation as Orientation);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelOrientationAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as Orientation,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelOrientationAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(solarPanel.orientation);\r\n } else {\r\n const oldOrientationsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldOrientationsOnSurface.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldOrientationsOnSurface.set(elem.id, (elem as SolarPanelModel).orientation);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Orientation for All Solar Panels on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldOrientationsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, orientation] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelOrientationById(id, orientation as Orientation);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelOrientationOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as Orientation,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelOrientationOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldOrientation = sp ? sp.orientation : solarPanel.orientation;\r\n rejectRef.current = rejectChange(solarPanel, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setSelectedOrientation(oldOrientation);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Orientation of Selected Solar Panel',\r\n timestamp: Date.now(),\r\n oldValue: oldOrientation,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n changeOrientation(undoableChange.oldValue as Orientation);\r\n },\r\n redo: () => {\r\n changeOrientation(undoableChange.newValue as Orientation);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n changeOrientation(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelOrientation = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n if (!solarPanel) return;\r\n setSelectedOrientation(solarPanel.orientation);\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setOrientation(selectedOrientation);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setOrientation(selectedOrientation);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current\r\n ? ' (' +\r\n (rejectedValue.current === Orientation.portrait\r\n ? i18n.t('solarPanelMenu.Portrait', lang)\r\n : i18n.t('solarPanelMenu.Landscape', lang)) +\r\n ')'\r\n : '')\r\n : '';\r\n\r\n return (\r\n \r\n \r\n \r\n setSelectedOrientation(value)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelOrientationSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ElementState, ObjectType, Orientation, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from '../../../constants';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(\r\n solarPanel?.orientation === Orientation.portrait ? solarPanel?.lx ?? 1 : solarPanel?.ly ?? 2,\r\n );\r\n\r\n const [dx, setDx] = useState(0);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n useEffect(() => {\r\n if (solarPanel) {\r\n const pvModel = getPvModule(solarPanel.pvModelName) ?? getPvModule('SPR-X21-335-BLK');\r\n setDx(solarPanel.orientation === Orientation.portrait ? pvModel.width : pvModel.length);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [solarPanel]);\r\n\r\n const updateSolarPanelLxById = (id: string, lx: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, lx);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLxAboveFoundation = (foundationId: string, lx: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, lx);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLxOnSurface = (parentId: string, normal: number[] | undefined, lx: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, lx);\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLxForAll = (lx: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, lx);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.lx = Util.panelizeLx(sp, pv, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (sp: SolarPanelModel, lx: number) => {\r\n const parent = getParent(sp);\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid && !Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // TODO: cuboid vertical sides\r\n return true;\r\n }\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.lx = lx;\r\n if (parent.type === ObjectType.Wall) {\r\n // maybe outside bound or overlap with others\r\n return Util.checkElementOnWallState(clone, parent) === ElementState.Valid;\r\n }\r\n if (parent.type === ObjectType.Roof) {\r\n return Util.checkElementOnRoofState(clone, parent as RoofModel) === ElementState.Valid;\r\n }\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (sp: SolarPanelModel, lx: number) => {\r\n // check if the new length will cause the solar panel to be out of the bound\r\n if (!withinParent(sp, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n // FIXME: When there are multiple types of solar panels that have different dimensions,\r\n // this will not work properly.\r\n const needChange = (lx: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setLength = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.lx);\r\n } else {\r\n const oldLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLengthsSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.lx);\r\n } else {\r\n const oldLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLengthsAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelLxForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelLxForAll(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.lx);\r\n } else {\r\n const oldLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldLengthsAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Length for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelLxAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelLxAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.lx);\r\n } else {\r\n const oldLengthsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldLengthsOnSurface.set(elem.id, elem.lx);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldLengthsOnSurface.set(elem.id, elem.lx);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Length for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelLxOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelLxOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id);\r\n const oldLength = sp ? sp.lx : solarPanel.lx;\r\n rejectRef.current = rejectChange(solarPanel, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Length',\r\n timestamp: Date.now(),\r\n oldValue: oldLength,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateSolarPanelLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelLxById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const panelize = (value: number) => {\r\n let w = value ?? 1;\r\n const n = Math.max(1, Math.ceil((w - dx / 2) / dx));\r\n w = n * dx;\r\n return w;\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLength(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(panelize(value));\r\n }}\r\n />\r\n
\r\n {Math.round(inputValue / dx) + ' ' + i18n.t('solarPanelMenu.PanelsWide', lang)}\r\n
\r\n {i18n.t('word.MaximumNumber', lang)}: 100 {i18n.t('solarPanelMenu.Panels', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelLengthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ElementState, ObjectType, Orientation, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from '../../../constants';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPanelWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getPvModule = useStore(Selector.getPvModule);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n const [inputValue, setInputValue] = useState(\r\n solarPanel?.orientation === Orientation.portrait ? solarPanel?.ly ?? 2 : solarPanel?.lx ?? 1,\r\n );\r\n\r\n const [dy, setDy] = useState(0);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n useEffect(() => {\r\n if (solarPanel) {\r\n const pvModel = getPvModule(solarPanel.pvModelName) ?? getPvModule('SPR-X21-335-BLK');\r\n setDy(solarPanel.orientation === Orientation.portrait ? pvModel.length : pvModel.width);\r\n setInputValue(solarPanel.ly);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [solarPanel]);\r\n\r\n const updateSolarPanelLyById = (id: string, ly: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, ly);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLyAboveFoundation = (foundationId: string, ly: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, ly);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLyOnSurface = (parentId: string, normal: number[] | undefined, ly: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, ly);\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelLyForAll = (ly: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, ly);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n const pv = state.getPvModule(sp.pvModelName);\r\n e.ly = Util.panelizeLy(sp, pv, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (sp: SolarPanelModel, ly: number) => {\r\n const parent = getParent(sp);\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid && !Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // TODO: cuboid vertical sides\r\n return true;\r\n }\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.ly = ly;\r\n if (parent.type === ObjectType.Wall) {\r\n // maybe outside bound or overlap with others\r\n return Util.checkElementOnWallState(clone, parent) === ElementState.Valid;\r\n }\r\n if (parent.type === ObjectType.Roof) {\r\n return Util.checkElementOnRoofState(clone, parent as RoofModel) === ElementState.Valid;\r\n }\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (sp: SolarPanelModel, ly: number) => {\r\n if (sp.tiltAngle !== 0 && 0.5 * ly * Math.abs(Math.sin(sp.tiltAngle)) > sp.poleHeight) {\r\n // check if the new width will cause the solar panel to intersect with the base surface\r\n return true;\r\n }\r\n // check if the new width will cause the solar panel to be out of the bound\r\n if (!withinParent(sp, ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n // FIXME: When there are multiple types of solar panels that have different dimensions,\r\n // this will not work properly.\r\n const needChange = (ly: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setWidth = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.ly);\r\n } else {\r\n const oldWidthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldWidthsSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldWidthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.ly);\r\n } else {\r\n const oldWidthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldWidthsAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelLyForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelLyForAll(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.ly);\r\n } else {\r\n const oldWidthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldWidthsAboveFoundation.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelLyAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelLyAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.ly);\r\n } else {\r\n const oldWidthsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldWidthsOnSurface.set(elem.id, elem.ly);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldWidthsOnSurface.set(elem.id, elem.ly);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Width for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelLyOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelLyOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id);\r\n const oldWidth = sp ? sp.ly : solarPanel.ly;\r\n rejectRef.current = rejectChange(solarPanel, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldWidth);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Width',\r\n timestamp: Date.now(),\r\n oldValue: oldWidth,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateSolarPanelLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelLyById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setWidth(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const panelize = (value: number) => {\r\n let l = value ?? 1;\r\n const n = Math.max(1, Math.ceil((l - dy / 2) / dy));\r\n l = n * dy;\r\n return l;\r\n };\r\n\r\n const apply = () => {\r\n setWidth(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(panelize(value));\r\n }}\r\n />\r\n
\r\n {Math.round(inputValue / dy) + ' ' + i18n.t('solarPanelMenu.PanelsLong', lang)}\r\n
\r\n {i18n.t('word.MaximumNumber', lang)}: 100 {i18n.t('solarPanelMenu.Panels', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelWidthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelTiltAngleInput = ({\r\n setDialogVisible,\r\n isOnWall,\r\n}: {\r\n setDialogVisible: (b: boolean) => void;\r\n isOnWall?: boolean;\r\n}) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateSolarPanelTiltAngleById = useStore(Selector.updateSolarPanelTiltAngleById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n const tiltAngle = solarPanel?.tiltAngle ?? 0;\r\n\r\n const [inputValue, setInputValue] = useState(isOnWall ? -tiltAngle : tiltAngle);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSolarPanelTiltAngleAboveFoundation = (foundationId: string, tiltAngle: number, isReverse: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.parentType === ObjectType.Wall) {\r\n sp.tiltAngle = Math.min(0, isReverse ? -tiltAngle : tiltAngle);\r\n } else {\r\n sp.tiltAngle = tiltAngle;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTiltAngleOnSurface = (parentId: string, normal: number[] | undefined, tiltAngle: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n sp.tiltAngle = tiltAngle;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTiltAngleForAll = (tiltAngle: number, isReverse: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.parentType === ObjectType.Wall) {\r\n sp.tiltAngle = Math.min(0, isReverse ? -tiltAngle : tiltAngle);\r\n } else {\r\n sp.tiltAngle = tiltAngle;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number, isReverse: boolean) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.parentType === ObjectType.Wall) {\r\n sp.tiltAngle = Math.min(0, isReverse ? -value : value);\r\n } else {\r\n sp.tiltAngle = value;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (tiltAngle: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n // tilt is only allowed for the top surface of a cuboid\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.tiltAngle - tiltAngle) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTiltAngle = (value: number) => {\r\n if (isOnWall) {\r\n value = -value;\r\n }\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.tiltAngle);\r\n } else {\r\n const oldTiltAnglesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTiltAnglesSelected.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tilt Angle for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldTiltAnglesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ta] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelTiltAngleById(id, ta as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n !isOnWall,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTiltAnglesSelected, value, !isOnWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.tiltAngle);\r\n } else {\r\n const oldTiltAnglesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldTiltAnglesAll.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tilt Angle for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldTiltAnglesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ta] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelTiltAngleById(id, ta as number);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelTiltAngleForAll(undoableChangeAll.newValue as number, !isOnWall);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelTiltAngleForAll(value, !isOnWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.foundationId === solarPanel.foundationId &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.tiltAngle);\r\n } else {\r\n const oldTiltAnglesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldTiltAnglesAboveFoundation.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Tilt Angle for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTiltAnglesAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ta] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelTiltAngleById(id, ta as number);\r\n }\r\n if (undoableChangeAboveFoundation.oldValues.size % 2 === 0) {\r\n useStore.getState().set((state) => {});\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelTiltAngleAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n !isOnWall,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelTiltAngleAboveFoundation(solarPanel.foundationId, value, !isOnWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n // tilt is only allowed for the top surface of a cuboid\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else if (solarPanel.parentType === ObjectType.Wall) {\r\n rejectRef.current = false;\r\n } else {\r\n // tilt is only allowed on top of a foundation or a roof\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin(value)) > (elem as SolarPanelModel).poleHeight) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.tiltAngle);\r\n } else {\r\n const oldTiltAnglesOnSurface = new Map();\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldTiltAnglesOnSurface.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldTiltAnglesOnSurface.set(elem.id, (elem as SolarPanelModel).tiltAngle);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Tilt Angle for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldTiltAnglesOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ta] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelTiltAngleById(id, ta as number);\r\n }\r\n if (undoableChangeOnSurface.oldValues.size % 2 === 0) {\r\n useStore.getState().set((state) => {});\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelTiltAngleOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelTiltAngleOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldTiltAngle = sp ? sp.tiltAngle : solarPanel.tiltAngle;\r\n rejectRef.current = 0.5 * solarPanel.ly * Math.abs(Math.sin(value)) > solarPanel.poleHeight;\r\n if (solarPanel.parentType === ObjectType.Wall) {\r\n rejectRef.current = false;\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldTiltAngle);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Tilt Angle',\r\n timestamp: Date.now(),\r\n oldValue: oldTiltAngle,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateSolarPanelTiltAngleById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelTiltAngleById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelTiltAngle = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setTiltAngle(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setTiltAngle(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + Util.toDegrees(rejectedValue.current).toFixed(1) + '°)' : null)\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n `${value}°`}\r\n onChange={(value) => {\r\n setInputValue(Util.toRadians(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{isOnWall ? '0°' : '-90°'}, 90°]\r\n
\r\n {i18n.t('solarPanelMenu.SouthFacingIsPositive', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelTiltAngleInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ElementState, ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { UNIT_VECTOR_POS_Z_ARRAY, ZERO_TOLERANCE } from '../../../constants';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPanelRelativeAzimuthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateRelativeAzimuthById = useStore(Selector.updateSolarCollectorRelativeAzimuthById);\r\n const updateRelativeAzimuthOnSurface = useStore(Selector.updateSolarCollectorRelativeAzimuthOnSurface);\r\n const updateRelativeAzimuthAboveFoundation = useStore(Selector.updateSolarCollectorRelativeAzimuthAboveFoundation);\r\n const updateRelativeAzimuthForAll = useStore(Selector.updateSolarCollectorRelativeAzimuthForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n // reverse the sign because rotation angle is positive counterclockwise whereas azimuth is positive clockwise\r\n // unfortunately, the variable should not be named as relativeAzimuth. Instead, it should have been named as\r\n // relativeRotationAngle. Keep this in mind that relativeAzimuth is NOT really azimuth.\r\n const [inputValue, setInputValue] = useState(solarPanel ? -solarPanel.relativeAzimuth ?? 0 : 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (sp: SolarPanelModel, azimuth: number) => {\r\n const parent = getParent(sp);\r\n if (parent) {\r\n if (parent.type === ObjectType.Cuboid && !Util.isIdentical(sp.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\r\n // azimuth should not be changed for solar panels on a vertical side of a cuboid\r\n return true;\r\n }\r\n const clone = JSON.parse(JSON.stringify(sp)) as SolarPanelModel;\r\n clone.relativeAzimuth = -azimuth;\r\n if (parent.type === ObjectType.Roof) {\r\n return Util.checkElementOnRoofState(clone, parent as RoofModel) === ElementState.Valid;\r\n }\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (sp: SolarPanelModel, azimuth: number) => {\r\n // check if the new relative azimuth will cause the solar panel to be out of the bound\r\n if (!withinParent(sp, azimuth)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (azimuth: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n !e.locked &&\r\n (e as SolarPanelModel).parentType !== ObjectType.Wall &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && (e as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.foundationId === solarPanel?.foundationId &&\r\n !e.locked &&\r\n (e as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n if (solarPanel?.parentId) {\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n // azimuth change is only allowed for the top surface of a cuboid\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n // azimuth change is only allowed on top of a foundation or a roof\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(-sp.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(-solarPanel?.relativeAzimuth - azimuth) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n sp.relativeAzimuth = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setRelativeAzimuth = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(-solarPanel.relativeAzimuth);\r\n } else {\r\n const oldRelativeAzimuthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall &&\r\n useStore.getState().selectedElementIdSet.has(elem.id)\r\n ) {\r\n oldRelativeAzimuthsSelected.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Relative Azimuth for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldRelativeAzimuthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ra] of undoableChangeSelected.oldValues.entries()) {\r\n updateRelativeAzimuthById(id, -(ra as number));\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldRelativeAzimuthsSelected, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(-solarPanel.relativeAzimuth);\r\n } else {\r\n const oldRelativeAzimuthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType !== ObjectType.Wall) {\r\n oldRelativeAzimuthsAll.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Relative Azimuth for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldRelativeAzimuthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ra] of undoableChangeAll.oldValues.entries()) {\r\n updateRelativeAzimuthById(id, -(ra as number));\r\n }\r\n },\r\n redo: () => {\r\n updateRelativeAzimuthForAll(ObjectType.SolarPanel, -(undoableChangeAll.newValue as number));\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateRelativeAzimuthForAll(ObjectType.SolarPanel, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.foundationId === solarPanel.foundationId &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(-solarPanel.relativeAzimuth);\r\n } else {\r\n const oldRelativeAzimuthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.foundationId === solarPanel.foundationId &&\r\n (elem as SolarPanelModel).parentType !== ObjectType.Wall\r\n ) {\r\n oldRelativeAzimuthsAboveFoundation.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Relative Azimuth for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldRelativeAzimuthsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ra] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateRelativeAzimuthById(id, -(ra as number));\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateRelativeAzimuthAboveFoundation(\r\n ObjectType.SolarPanel,\r\n undoableChangeAboveFoundation.groupId,\r\n -(undoableChangeAboveFoundation.newValue as number),\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateRelativeAzimuthAboveFoundation(ObjectType.SolarPanel, solarPanel.foundationId, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n if (solarPanel.parentId) {\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (rejectChange(elem as SolarPanelModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(-solarPanel.relativeAzimuth);\r\n } else {\r\n const oldRelativeAzimuthsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldRelativeAzimuthsOnSurface.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldRelativeAzimuthsOnSurface.set(elem.id, -(elem as SolarPanelModel).relativeAzimuth);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Relative Azimuth for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldRelativeAzimuthsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ra] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateRelativeAzimuthById(id, -(ra as number));\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateRelativeAzimuthOnSurface(\r\n ObjectType.SolarPanel,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n -(undoableChangeOnSurface.newValue as number),\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateRelativeAzimuthOnSurface(ObjectType.SolarPanel, solarPanel.parentId, normal, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldRelativeAzimuth = sp ? -sp.relativeAzimuth : -solarPanel.relativeAzimuth;\r\n rejectRef.current = rejectChange(solarPanel, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldRelativeAzimuth);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Relative Azimuth',\r\n timestamp: Date.now(),\r\n oldValue: oldRelativeAzimuth,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateRelativeAzimuthById(undoableChange.changedElementId, -(undoableChange.oldValue as number));\r\n },\r\n redo: () => {\r\n updateRelativeAzimuthById(undoableChange.changedElementId, -(undoableChange.newValue as number));\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateRelativeAzimuthById(solarPanel.id, -value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelRelativeAzimuth = -value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setRelativeAzimuth(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setRelativeAzimuth(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + Util.toDegrees(rejectedValue.current).toFixed(1) + '°)' : null)\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n `${value}°`}\r\n onChange={(value) => {\r\n setInputValue(Util.toRadians(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [-180°, 180°]\r\n
\r\n {i18n.t('message.AzimuthOfNorthIsZero', lang)}\r\n
\r\n {i18n.t('message.CounterclockwiseAzimuthIsPositive', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelRelativeAzimuthInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope, TrackerType } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPanelTrackerSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [selectedTrackerType, setSelectedTrackerType] = useState(\r\n solarPanel?.trackerType ?? TrackerType.NO_TRACKER,\r\n );\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateSolarPanelTrackerTypeById = (id: string, trackerType: TrackerType) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n (e as SolarPanelModel).trackerType = trackerType;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTrackerTypeAboveFoundation = (foundationId: string, trackerType: TrackerType) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n (e as SolarPanelModel).trackerType = trackerType;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTrackerTypeOnSurface = (\r\n parentId: string,\r\n normal: number[] | undefined,\r\n trackerType: TrackerType,\r\n ) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarPanelModel).trackerType = trackerType;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelTrackerTypeForAll = (trackerType: TrackerType) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n (e as SolarPanelModel).trackerType = trackerType;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: TrackerType) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n (e as SolarPanelModel).trackerType = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (tracker: TrackerType) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (solarPanel?.trackerType !== tracker) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setTrackerType = (value: TrackerType) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTrackerTypesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTrackerTypesSelected.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tracker Type for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldTrackerTypesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, tt] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelTrackerTypeById(id, tt as TrackerType);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as TrackerType,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTrackerTypesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTrackerTypesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldTrackerTypesAll.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tracker Type for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldTrackerTypesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, tt] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelTrackerTypeById(id, tt as TrackerType);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelTrackerTypeForAll(undoableChangeAll.newValue as TrackerType);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelTrackerTypeForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldTrackerTypesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldTrackerTypesAboveFoundation.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Tracker Type for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTrackerTypesAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, tt] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelTrackerTypeById(id, tt as TrackerType);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelTrackerTypeAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as TrackerType,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelTrackerTypeAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldTrackerTypesOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldTrackerTypesOnSurface.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldTrackerTypesOnSurface.set(elem.id, (elem as SolarPanelModel).trackerType);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Tracker Type for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldTrackerTypesOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, tt] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelTrackerTypeById(id, tt as TrackerType);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelTrackerTypeOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as TrackerType,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelTrackerTypeOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldTrackerType = sp ? sp.trackerType : solarPanel.trackerType;\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Tracker Type',\r\n timestamp: Date.now(),\r\n oldValue: oldTrackerType,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelTrackerTypeById(undoableChange.changedElementId, undoableChange.oldValue as TrackerType);\r\n },\r\n redo: () => {\r\n updateSolarPanelTrackerTypeById(undoableChange.changedElementId, undoableChange.newValue as TrackerType);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelTrackerTypeById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTrackerType(selectedTrackerType);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n setSelectedTrackerType(value)}\r\n >\r\n \r\n \r\n HSAT\r\n \r\n \r\n VSAT\r\n \r\n \r\n AADAT\r\n \r\n \r\n
\r\n {i18n.t('solarPanelMenu.SolarTrackerFollowsSun', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPanelTrackerSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightOnSurface = useStore(Selector.updateSolarCollectorPoleHeightOnSurface);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n const [inputValue, setInputValue] = useState(solarPanel?.poleHeight ?? 0);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleHeight = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.poleHeight);\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.poleHeight);\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldPoleHeightsAll.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.SolarPanel, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.SolarPanel, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.poleHeight);\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.SolarPanel,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.SolarPanel, solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n rejectRef.current = false;\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n // tilt is only allowed for the top surface of a cuboid\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n // tilt is only allowed on top of a foundation or a roof\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as SolarPanelModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(solarPanel.poleHeight);\r\n } else {\r\n const oldPoleHeightsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldPoleHeightsOnSurface.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldPoleHeightsOnSurface.set(elem.id, (elem as SolarPanelModel).poleHeight);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Pole Height for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeOnSurface.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updatePoleHeightOnSurface(\r\n ObjectType.SolarPanel,\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updatePoleHeightOnSurface(ObjectType.SolarPanel, solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldPoleHeight = sp ? sp.poleHeight : solarPanel.poleHeight;\r\n rejectRef.current = 0.5 * solarPanel.ly * Math.abs(Math.sin(solarPanel.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldPoleHeight);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n `${value} ` + i18n.t('word.MeterAbbreviation', lang)}\r\n // parser={value => Number(value?.replace(i18n.t('word.MeterAbbreviation', lang), ''))}\r\n value={inputValue}\r\n onChange={setInputValue}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelPoleHeightInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst SolarPanelPoleSpacingInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n const [inputValue, setInputValue] = useState(solarPanel?.poleSpacing ?? 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSolarPanelPoleSpacingById = (id: string, poleSpacing: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = poleSpacing;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelPoleSpacingAboveFoundation = (foundationId: string, poleSpacing: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = poleSpacing;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelPoleSpacingOnSurface = (\r\n parentId: string,\r\n normal: number[] | undefined,\r\n poleSpacing: number,\r\n ) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = poleSpacing;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelPoleSpacingForAll = (poleSpacing: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = poleSpacing;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n sp.poleSpacing = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleSpacing: number) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs(sp.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(solarPanel?.poleSpacing - poleSpacing) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setPoleSpacing = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldPoleSpacingsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleSpacingsSelected.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Spacing for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleSpacingsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ps] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelPoleSpacingById(id, ps as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleSpacingsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldPoleSpacingsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldPoleSpacingsAll.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Spacing for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleSpacingsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ps] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelPoleSpacingById(id, ps as number);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelPoleSpacingForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelPoleSpacingForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldPoleSpacingsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldPoleSpacingsAboveFoundation.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Spacing for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleSpacingsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ps] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelPoleSpacingById(id, ps as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelPoleSpacingAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelPoleSpacingAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldPoleSpacingsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldPoleSpacingsOnSurface.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldPoleSpacingsOnSurface.set(elem.id, (elem as SolarPanelModel).poleSpacing);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Pole Spacing for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleSpacingsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ps] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelPoleSpacingById(id, ps as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelPoleSpacingOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelPoleSpacingOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldPoleSpacing = sp ? sp.poleSpacing : solarPanel.poleSpacing;\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Pole Spacing',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleSpacing,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelPoleSpacingById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateSolarPanelPoleSpacingById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelPoleSpacingById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelPoleSpacing = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPoleSpacing(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [1, 10] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPanelPoleSpacingInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { CompactPicker } from 'react-color';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelFrameColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(solarPanel?.frameColor ?? 'white');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSolarPanelFrameColorById = (id: string, frameColor: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n (e as SolarPanelModel).frameColor = frameColor;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelFrameColorAboveFoundation = (foundationId: string, frameColor: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n (e as SolarPanelModel).frameColor = frameColor;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelFrameColorOnSurface = (parentId: string, normal: number[] | undefined, frameColor: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarPanelModel).frameColor = frameColor;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSolarPanelFrameColorForAll = (frameColor: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n (e as SolarPanelModel).frameColor = frameColor;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n (e as SolarPanelModel).frameColor = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (frameColor: string) => {\r\n if (!solarPanel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (sp.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (solarPanel?.frameColor !== frameColor) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setFrameColor = (value: string) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldFrameColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldFrameColorsSelected.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Frame Color for Selected Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldFrameColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, fc] of undoableChangeSelected.oldValues.entries()) {\r\n updateSolarPanelFrameColorById(id, fc as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldFrameColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldFrameColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldFrameColorsAll.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Frame Color for All Solar Panels',\r\n timestamp: Date.now(),\r\n oldValues: oldFrameColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, fc] of undoableChangeAll.oldValues.entries()) {\r\n updateSolarPanelFrameColorById(id, fc as string);\r\n }\r\n },\r\n redo: () => {\r\n updateSolarPanelFrameColorForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSolarPanelFrameColorForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldFrameColorsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldFrameColorsAboveFoundation.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Frame Color for All Solar Panels Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldFrameColorsAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, fc] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateSolarPanelFrameColorById(id, fc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSolarPanelFrameColorAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSolarPanelFrameColorAboveFoundation(solarPanel.foundationId, value as string);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldFrameColorsOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldFrameColorsOnSurface.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldFrameColorsOnSurface.set(elem.id, (elem as SolarPanelModel).frameColor ?? 'white');\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Frame Color for All Solar Panels on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldFrameColorsOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, fc] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateSolarPanelFrameColorById(id, fc as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateSolarPanelFrameColorOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateSolarPanelFrameColorOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id) as SolarPanelModel;\r\n const oldFrameColor = sp ? sp.frameColor : solarPanel.frameColor;\r\n const undoableChange = {\r\n name: 'Set Frame Color of Selected Solar Panel',\r\n timestamp: Date.now(),\r\n oldValue: oldFrameColor,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateSolarPanelFrameColorById(solarPanel.id, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateSolarPanelFrameColorById(solarPanel.id, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSolarPanelFrameColorById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.solarPanelFrameColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setFrameColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelFrameColorSelection;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst SolarPanelInverterEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const solarPanel = useStore((state) =>\r\n state.elements.find((e) => e.selected && e.type === ObjectType.SolarPanel),\r\n ) as SolarPanelModel;\r\n\r\n const [inputValue, setInputValue] = useState(solarPanel?.inverterEfficiency ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateInverterEfficiencyById = (id: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n (e as SolarPanelModel).inverterEfficiency = efficiency;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInverterEfficiencyAboveFoundation = (foundationId: string, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n (e as SolarPanelModel).inverterEfficiency = efficiency;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInverterEfficiencyOnSurface = (parentId: string, normal: number[] | undefined, efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarPanelModel).inverterEfficiency = efficiency;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInverterEfficiencyForAll = (efficiency: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n (e as SolarPanelModel).inverterEfficiency = efficiency;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n (e as SolarPanelModel).inverterEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (efficiency: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs((solarPanel?.inverterEfficiency ?? 0.95) - efficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setInverterEfficiency = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Inverter Efficiency for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, efficiency] of undoableChangeSelected.oldValues.entries()) {\r\n updateInverterEfficiencyById(id, efficiency as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldValuesAll.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Inverter Efficiency for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, efficiency] of undoableChangeAll.oldValues.entries()) {\r\n updateInverterEfficiencyById(id, efficiency as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInverterEfficiencyForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateInverterEfficiencyForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Inverter Efficiency for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, efficiency] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateInverterEfficiencyById(id, efficiency as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateInverterEfficiencyAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateInverterEfficiencyAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldValuesOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).inverterEfficiency ?? 0.95);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set Inverter Efficiency for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, efficiency] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateInverterEfficiencyById(id, efficiency as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateInverterEfficiencyOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateInverterEfficiencyOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id);\r\n const oldValue = sp\r\n ? (sp as SolarPanelModel).inverterEfficiency ?? 0.95\r\n : solarPanel.inverterEfficiency ?? 0.95;\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array Inverter Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateInverterEfficiencyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateInverterEfficiencyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateInverterEfficiencyById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setInverterEfficiency(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n [0.5, 1.0]\r\n
\r\n {i18n.t('solarPanelMenu.InverterEfficiencyExplained', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SolarPanelInverterEfficiencyInput;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { Util } from '../../../Util';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\n\r\nconst SolarPanelDcToAcRatioInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.solarPanelActionScope);\r\n const setActionScope = useStore(Selector.setSolarPanelActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const solarPanel = useStore((state) =>\r\n state.elements.find((e) => e.selected && e.type === ObjectType.SolarPanel),\r\n ) as SolarPanelModel;\r\n\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n const inputDcToAcRatioRef = useRef(solarPanel?.dcToAcRatio ?? 1);\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n if (solarPanel) {\r\n inputDcToAcRatioRef.current = solarPanel.dcToAcRatio ?? 1;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [solarPanel.dcToAcRatio]);\r\n\r\n const updateDcToAcRatioById = (id: string, ratio: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.id === id && !e.locked) {\r\n (e as SolarPanelModel).dcToAcRatio = ratio;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateDcToAcRatioAboveFoundation = (foundationId: string, ratio: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === foundationId && !e.locked) {\r\n (e as SolarPanelModel).dcToAcRatio = ratio;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateDcToAcRatioOnSurface = (parentId: string, normal: number[] | undefined, ratio: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n let found;\r\n if (normal) {\r\n found = e.parentId === parentId && Util.isIdentical(e.normal, normal);\r\n } else {\r\n found = e.parentId === parentId;\r\n }\r\n if (found) {\r\n (e as SolarPanelModel).dcToAcRatio = ratio;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateDcToAcRatioForAll = (ratio: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n (e as SolarPanelModel).dcToAcRatio = ratio;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && map.has(e.id)) {\r\n (e as SolarPanelModel).dcToAcRatio = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n setUpdateFlag(!updateFlag);\r\n };\r\n\r\n const needChange = (ratio: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.foundationId === solarPanel?.foundationId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.SolarPanel &&\r\n e.parentId === solarPanel.parentId &&\r\n Util.isIdentical(e.normal, solarPanel.normal) &&\r\n !e.locked\r\n ) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.SolarPanel && e.parentId === solarPanel.parentId && !e.locked) {\r\n const sp = e as SolarPanelModel;\r\n if (Math.abs((sp.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs((solarPanel?.dcToAcRatio ?? 1) - ratio) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const setDcToAcRatio = (value: number) => {\r\n if (!solarPanel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set DC-AC Ratio for Selected Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ratio] of undoableChangeSelected.oldValues.entries()) {\r\n updateDcToAcRatioById(id, ratio as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel) {\r\n oldValuesAll.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set DC-AC Ratio for All Solar Panel Arrays',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ratio] of undoableChangeAll.oldValues.entries()) {\r\n updateDcToAcRatioById(id, ratio as number);\r\n }\r\n },\r\n redo: () => {\r\n updateDcToAcRatioForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateDcToAcRatioForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (solarPanel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.foundationId === solarPanel.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set DC-AC Ratio for All Solar Panel Arrays Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: solarPanel.foundationId,\r\n undo: () => {\r\n for (const [id, ratio] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateDcToAcRatioById(id, ratio as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateDcToAcRatioAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateDcToAcRatioAboveFoundation(solarPanel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(solarPanel);\r\n if (parent) {\r\n const oldValuesOnSurface = new Map();\r\n const isParentCuboid = parent.type === ObjectType.Cuboid;\r\n if (isParentCuboid) {\r\n for (const elem of elements) {\r\n if (\r\n elem.type === ObjectType.SolarPanel &&\r\n elem.parentId === solarPanel.parentId &&\r\n Util.isIdentical(elem.normal, solarPanel.normal)\r\n ) {\r\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n } else {\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.SolarPanel && elem.parentId === solarPanel.parentId) {\r\n oldValuesOnSurface.set(elem.id, (elem as SolarPanelModel).dcToAcRatio ?? 1);\r\n }\r\n }\r\n }\r\n const normal = isParentCuboid ? solarPanel.normal : undefined;\r\n const undoableChangeOnSurface = {\r\n name: 'Set DC-AC Ratio for All Solar Panel Arrays on Surface',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesOnSurface,\r\n newValue: value,\r\n groupId: solarPanel.parentId,\r\n normal: normal,\r\n undo: () => {\r\n for (const [id, ratio] of undoableChangeOnSurface.oldValues.entries()) {\r\n updateDcToAcRatioById(id, ratio as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSurface.groupId) {\r\n updateDcToAcRatioOnSurface(\r\n undoableChangeOnSurface.groupId,\r\n undoableChangeOnSurface.normal,\r\n undoableChangeOnSurface.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSurface);\r\n updateDcToAcRatioOnSurface(solarPanel.parentId, normal, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // solar panel selected element may be outdated, make sure that we get the latest\r\n const sp = getElementById(solarPanel.id);\r\n const oldValue = sp ? (sp as SolarPanelModel).dcToAcRatio ?? 1 : solarPanel.dcToAcRatio ?? 1;\r\n const undoableChange = {\r\n name: 'Set Solar Panel Array DC-AC Ratio',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: solarPanel.id,\r\n changedElementType: solarPanel.type,\r\n undo: () => {\r\n updateDcToAcRatioById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateDcToAcRatioById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateDcToAcRatioById(solarPanel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setUpdateFlag(!updateFlag);\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const close = () => {\r\n inputDcToAcRatioRef.current = solarPanel.dcToAcRatio ?? 1;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setDcToAcRatio(inputDcToAcRatioRef.current);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('solarPanelMenu.DcToAcSizeRatio', lang)}\r\n \r\n }\r\n footer={[\r\n {\r\n setDcToAcRatio(inputDcToAcRatioRef.current);\r\n }}\r\n >\r\n {i18n.t('word.Apply', lang)}\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={close}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n {\r\n inputDcToAcRatioRef.current = value;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onPressEnter={ok}\r\n />\r\n
\r\n [1.0, 2.0]\r\n
\r\n {i18n.t('solarPanelMenu.DcToAcSizeRatioExplained', lang)}\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('solarPanelMenu.OnlyThisSolarPanel', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsOnSurface', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanelsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('solarPanelMenu.AllSelectedSolarPanels', lang)}\r\n \r\n {i18n.t('solarPanelMenu.AllSolarPanels', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default SolarPanelDcToAcRatioInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { Vector3 } from 'three';\r\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Util } from '../../../Util';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport SolarPanelModelSelection from './solarPanelModelSelection';\r\nimport SolarPanelOrientationSelection from './solarPanelOrientationSelection';\r\nimport SolarPanelLengthInput from './solarPanelLengthInput';\r\nimport SolarPanelWidthInput from './solarPanelWidthInput';\r\nimport SolarPanelTiltAngleInput from './solarPanelTiltAngleInput';\r\nimport SolarPanelRelativeAzimuthInput from './solarPanelRelativeAzimuthInput';\r\nimport SolarPanelTrackerSelection from './solarPanelTrackerSelection';\r\nimport SolarPanelPoleHeightInput from './solarPanelPoleHeightInput';\r\nimport SolarPanelPoleSpacingInput from './solarPanelPoleSpacingInput';\r\nimport SolarPanelFrameColorSelection from './solarPanelFrameColorSelection';\r\nimport { UNIT_VECTOR_POS_Z } from '../../../constants';\r\nimport { ObjectType, TrackerType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SolarPanelInverterEfficiencyInput from './solarPanelInverterEfficiencyInput';\r\nimport SolarPanelDcToAcRatioInput from './solarPanelDcToAcRatioInput';\r\n\r\nexport const SolarPanelMenu = React.memo(() => {\r\n const updateSolarCollectorDrawSunBeamById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const language = useStore(Selector.language);\r\n\r\n const solarPanel = useSelectedElement(ObjectType.SolarPanel) as SolarPanelModel | undefined;\r\n\r\n const [pvModelDialogVisible, setPvModelDialogVisible] = useState(false);\r\n const [orientationDialogVisible, setOrientationDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [inverterEfficiencyDialogVisible, setInverterEfficiencyDialogVisible] = useState(false);\r\n const [dcAcRatioDialogVisible, setDcAcRatioDialogVisible] = useState(false);\r\n const [tiltDialogVisible, setTiltDialogVisible] = useState(false);\r\n const [azimuthDialogVisible, setAzimuthDialogVisible] = useState(false);\r\n const [trackerDialogVisible, setTrackerDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [poleSpacingDialogVisible, setPoleSpacingDialogVisible] = useState(false);\r\n const [frameColorDialogVisible, setFrameColorDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(solarPanel);\r\n const showLabel = useLabelShow(solarPanel);\r\n const updateLabelText = useLabelText(solarPanel, labelText);\r\n const setLabelColor = useLabelColor(solarPanel);\r\n const setLabelSize = useLabelSize(solarPanel);\r\n const setLabelFontSize = useLabelFontSize(solarPanel);\r\n const setLabelHeight = useLabelHeight(solarPanel);\r\n\r\n if (!solarPanel) return null;\r\n\r\n const lang = { lng: language };\r\n const panelNormal = new Vector3().fromArray(solarPanel.normal);\r\n const editable = !solarPanel?.locked;\r\n\r\n const drawSunBeam = (checked: boolean) => {\r\n if (solarPanel) {\r\n const undoableCheck = {\r\n name: 'Show Sun Beam',\r\n timestamp: Date.now(),\r\n checked: !solarPanel.drawSunBeam,\r\n selectedElementId: solarPanel.id,\r\n selectedElementType: ObjectType.SolarPanel,\r\n undo: () => {\r\n updateSolarCollectorDrawSunBeamById(solarPanel.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateSolarCollectorDrawSunBeamById(solarPanel.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateSolarCollectorDrawSunBeamById(solarPanel.id, checked);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {solarPanel && editable && (\r\n <>\r\n {/* pv model */}\r\n {pvModelDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPvModelDialogVisible(true);\r\n }}\r\n style={{ paddingLeft: '36px' }}\r\n >\r\n {i18n.t('solarPanelMenu.ChangePvModel', lang)} ({solarPanel.pvModelName}) ...\r\n \r\n\r\n {/* orientation: landscape or portrait */}\r\n {orientationDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setOrientationDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.Orientation', lang)} ...\r\n \r\n\r\n {/* array length */}\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {/* array width */}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {/* inverter efficiency */}\r\n {inverterEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setInverterEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.InverterEfficiency', lang)} ...\r\n \r\n\r\n {/* DC-AC ratio */}\r\n {dcAcRatioDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setDcAcRatioDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.DcToAcSizeRatio', lang)} ...\r\n \r\n\r\n {solarPanel.parentType === ObjectType.Wall && (\r\n <>\r\n {\r\n setApplyCount(0);\r\n setTiltDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.TiltAngle', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {tiltDialogVisible && (\r\n \r\n )}\r\n\r\n {panelNormal && Util.isSame(panelNormal, UNIT_VECTOR_POS_Z) && (\r\n <>\r\n {/* tilt angle */}\r\n {solarPanel.trackerType === TrackerType.NO_TRACKER && (\r\n {\r\n setApplyCount(0);\r\n setTiltDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.TiltAngle', lang)} ...\r\n \r\n )}\r\n\r\n {/* relative azimuth to the parent element */}\r\n {azimuthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setAzimuthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.RelativeAzimuth', lang)} ...\r\n \r\n\r\n {/* solar tracker type */}\r\n {solarPanel.parentType !== ObjectType.Roof && (\r\n <>\r\n {trackerDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTrackerDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.Tracker', lang)} ...\r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {editable && (\r\n <>\r\n {frameColorDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setFrameColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.FrameColor', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {/* draw sun beam or not */}\r\n \r\n drawSunBeam(e.target.checked)}>\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)}\r\n \r\n \r\n\r\n \r\n {/* pole height */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.PoleHeight', lang)} ...\r\n \r\n\r\n {/* pole spacing */}\r\n {poleSpacingDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleSpacingDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarPanelMenu.PoleSpacing', lang)} ...\r\n \r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the solar panel's top surface */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\n// for parabolic troughs, since the default alignment is north-south, ly is always much larger than lx.\r\n// to agree with the convention, we call ly length and lx width, reversed from most other elements in Aladdin.\r\n\r\nconst ParabolicTroughLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLyById = useStore(Selector.updateElementLyById);\r\n const updateLyAboveFoundation = useStore(Selector.updateElementLyAboveFoundation);\r\n const updateLyForAll = useStore(Selector.updateElementLyForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.ly ?? 9);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (trough: ParabolicTroughModel, ly: number) => {\r\n const parent = getParent(trough);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(trough)) as ParabolicTroughModel;\r\n clone.ly = ly;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (trough: ParabolicTroughModel, ly: number) => {\r\n // check if the new length will cause the parabolic trough to be out of the bound\r\n if (!withinParent(trough, ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLength = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.ly);\r\n } else {\r\n const oldLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLengthsSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.ly);\r\n } else {\r\n const oldLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldLengthsAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLyForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLyForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.ly);\r\n } else {\r\n const oldLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldLengthsAboveFoundation.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Length for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLyAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLyAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldLength = p ? p.ly : parabolicTrough.ly;\r\n rejectRef.current = rejectChange(parabolicTrough, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Length',\r\n timestamp: Date.now(),\r\n oldValue: oldLength,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLyById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const modularize = (value: number) => {\r\n if (!parabolicTrough) return 1;\r\n let length = value ?? 1;\r\n const n = Math.max(1, Math.ceil((length - parabolicTrough.moduleLength / 2) / parabolicTrough.moduleLength));\r\n length = n * parabolicTrough.moduleLength;\r\n return length;\r\n };\r\n\r\n const apply = () => {\r\n setLength(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(modularize(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('parabolicTroughMenu.ModuleLength', lang) +\r\n ': ' +\r\n parabolicTrough.moduleLength.toFixed(1) +\r\n ' ' +\r\n i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {Math.round(inputValue / parabolicTrough.moduleLength) +\r\n ' ' +\r\n i18n.t('parabolicTroughMenu.ModulesLong', lang)}\r\n
\r\n {i18n.t('word.Maximum', lang)}: 100 {i18n.t('parabolicTroughMenu.Modules', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\n// for parabolic troughs, since the default alignment is north-south, ly is always much larger than lx.\r\n// to agree with the convention, we call ly length and lx width, reversed from most other elements in Aladdin.\r\n\r\nconst ParabolicTroughWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLxById = useStore(Selector.updateElementLxById);\r\n const updateLxAboveFoundation = useStore(Selector.updateElementLxAboveFoundation);\r\n const updateLxForAll = useStore(Selector.updateElementLxForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.lx ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (trough: ParabolicTroughModel, lx: number) => {\r\n const parent = getParent(trough);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(trough)) as ParabolicTroughModel;\r\n clone.lx = lx;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (trough: ParabolicTroughModel, lx: number) => {\r\n // check if the new width will cause the parabolic trough to be out of the bound\r\n if (!withinParent(trough, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).lx = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setWidth = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.lx);\r\n } else {\r\n const oldWidthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldWidthsSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldWidthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.lx);\r\n } else {\r\n const oldWidthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldWidthsAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLxForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLxForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.lx);\r\n } else {\r\n const oldWidthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldWidthsAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLxAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLxAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldWidth = p ? p.lx : parabolicTrough.lx;\r\n rejectRef.current = rejectChange(parabolicTrough, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldWidth);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Width',\r\n timestamp: Date.now(),\r\n oldValue: oldWidth,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLxById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughWidth = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setWidth(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n // for some reason, we have to confirm the type first. otherwise, other popup menus may invoke this\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.poleHeight ?? 1);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(parabolicTrough);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.parentId === parabolicTrough.parentId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).tiltAngle = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicTroughModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.poleHeight);\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as ParabolicTroughModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicTroughModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.poleHeight);\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldPoleHeightsAll.set(elem.id, (elem as ParabolicTroughModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicTroughModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.poleHeight);\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldPoleHeight = p ? p.poleHeight : parabolicTrough.poleHeight;\r\n rejectRef.current = 0.5 * parabolicTrough.lx * Math.abs(Math.sin(parabolicTrough.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldPoleHeight);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughPoleHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughLatusRectumInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLatusRectumById = useStore(Selector.updateParabolaLatusRectumById);\r\n const updateLatusRectumAboveFoundation = useStore(Selector.updateParabolaLatusRectumAboveFoundation);\r\n const updateLatusRectumForAll = useStore(Selector.updateParabolaLatusRectumForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.latusRectum ?? 2);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (trough: ParabolicTroughModel, latusRectum: number) => {\r\n const parent = getParent(trough);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(trough)) as ParabolicTroughModel;\r\n clone.latusRectum = latusRectum;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (trough: ParabolicTroughModel, latusRectum: number) => {\r\n // check if the new latus rectum will cause the parabolic trough to be out of the bound\r\n if (!withinParent(trough, latusRectum)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (latusRectum: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).latusRectum = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLatusRectum = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.latusRectum);\r\n } else {\r\n const oldLatusRectumsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLatusRectumsSelected.set(elem.id, (elem as ParabolicTroughModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Latus Rectum for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeSelected.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLatusRectumsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.latusRectum);\r\n } else {\r\n const oldLatusRectumsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldLatusRectumsAll.set(elem.id, (elem as ParabolicTroughModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Latus Rectum for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeAll.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLatusRectumForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLatusRectumForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.latusRectum);\r\n } else {\r\n const oldLatusRectumsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldLatusRectumsAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Latus Rectum for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLatusRectumAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLatusRectumAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldLatusRectum = p ? p.latusRectum : parabolicTrough.latusRectum;\r\n rejectRef.current = rejectChange(parabolicTrough, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLatusRectum);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Latus Rectum',\r\n timestamp: Date.now(),\r\n oldValue: oldLatusRectum,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateLatusRectumById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLatusRectumById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLatusRectumById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughLatusRectum = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLatusRectum(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLatusRectum(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 20 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughLatusRectumInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughModuleLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateModuleLengthById = useStore(Selector.updateModuleLengthById);\r\n const updateModuleLengthAboveFoundation = useStore(Selector.updateModuleLengthAboveFoundation);\r\n const updateModuleLengthForAll = useStore(Selector.updateModuleLengthForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.moduleLength ?? 3);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (trough: ParabolicTroughModel, moduleLength: number) => {\r\n const parent = getParent(trough);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(trough)) as ParabolicTroughModel;\r\n clone.moduleLength = moduleLength;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (trough: ParabolicTroughModel, moduleLength: number) => {\r\n // check if the new module length will cause the parabolic trough to be out of the bound\r\n if (!withinParent(trough, moduleLength)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (moduleLength: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const trough = e as ParabolicTroughModel;\r\n if (Math.abs(trough.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).moduleLength = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setModuleLength = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.moduleLength);\r\n } else {\r\n const oldModuleLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldModuleLengthsSelected.set(elem.id, (elem as ParabolicTroughModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Module Length for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeSelected.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldModuleLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.moduleLength);\r\n } else {\r\n const oldModuleLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldModuleLengthsAll.set(elem.id, (elem as ParabolicTroughModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Module Length for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeAll.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n updateModuleLengthForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateModuleLengthForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n if (rejectChange(elem as ParabolicTroughModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicTrough.moduleLength);\r\n } else {\r\n const oldModuleLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldModuleLengthsAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Module Length for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateModuleLengthAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateModuleLengthAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldModuleLength = p ? p.moduleLength : parabolicTrough.moduleLength;\r\n rejectRef.current = rejectChange(parabolicTrough, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldModuleLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Module Length',\r\n timestamp: Date.now(),\r\n oldValue: oldModuleLength,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateModuleLengthById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateModuleLengthById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateModuleLengthById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughModuleLength = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setModuleLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setModuleLength(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughModuleLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughReflectanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateCspReflectanceById);\r\n const updateAboveFoundation = useStore(Selector.updateCspReflectanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateCspReflectanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.reflectance ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (reflectance: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).reflectance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReflectance = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldReflectancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldReflectancesSelected.set(elem.id, (elem as ParabolicTroughModel).reflectance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Reflectance for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldReflectancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldReflectancesAll.set(elem.id, (elem as ParabolicTroughModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Reflectance for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n const oldReflectancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldReflectancesAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Reflectance for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldReflectance = p ? p.reflectance : parabolicTrough.reflectance;\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Reflectance',\r\n timestamp: Date.now(),\r\n oldValue: oldReflectance,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughReflectance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setReflectance(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughReflectanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicTroughAbsorptanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorAbsorptanceById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorAbsorptanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorAbsorptanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.absorptance ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (absorptance: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).absorptance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setAbsorptance = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldAbsorptancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldAbsorptancesSelected.set(elem.id, (elem as ParabolicTroughModel).absorptance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorptance for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldAbsorptancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldAbsorptancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldAbsorptancesAll.set(elem.id, (elem as ParabolicTroughModel).absorptance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorptance for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n const oldAbsorptancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldAbsorptancesAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).absorptance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Absorptance for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldAbsorptance = p ? p.absorptance : parabolicTrough.absorptance;\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Absorptance',\r\n timestamp: Date.now(),\r\n oldValue: oldAbsorptance,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughAbsorptance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAbsorptance(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughAbsorptanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicTroughOpticalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorOpticalEfficiencyById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorOpticalEfficiencyAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorOpticalEfficiencyForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.opticalEfficiency ?? 0.7);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (opticalEfficiency: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).opticalEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setOpticalEfficiency = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldOpticalEfficienciesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldOpticalEfficienciesSelected.set(elem.id, (elem as ParabolicTroughModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Optical Efficiency for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldOpticalEfficienciesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldOpticalEfficienciesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldOpticalEfficienciesAll.set(elem.id, (elem as ParabolicTroughModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Optical Efficiency for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n const oldOpticalEfficienciesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldOpticalEfficienciesAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Optical Efficiency for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldOpticalEfficiency = p ? p.opticalEfficiency : parabolicTrough.opticalEfficiency;\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Optical Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldOpticalEfficiency,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughOpticalEfficiency = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setOpticalEfficiency(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughOpticalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicTroughThermalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorThermalEfficiencyById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorThermalEfficiencyAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorThermalEfficiencyForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicTroughActionScope);\r\n const setActionScope = useStore(Selector.setParabolicTroughActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n const [inputValue, setInputValue] = useState(parabolicTrough?.thermalEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (thermalEfficiency: number) => {\r\n if (!parabolicTrough) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.ParabolicTrough &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicTrough && e.foundationId === parabolicTrough?.foundationId && !e.locked) {\r\n const pt = e as ParabolicTroughModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicTrough?.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicTrough && !e.locked && map.has(e.id)) {\r\n (e as ParabolicTroughModel).thermalEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setThermalEfficiency = (value: number) => {\r\n if (!parabolicTrough) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldThermalEfficienciesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldThermalEfficienciesSelected.set(elem.id, (elem as ParabolicTroughModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Thermal Efficiency for Selected Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldThermalEfficienciesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldThermalEfficienciesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough) {\r\n oldThermalEfficienciesAll.set(elem.id, (elem as ParabolicTroughModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Thermal Efficiency for All Parabolic Troughs',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicTrough, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicTrough, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicTrough.foundationId) {\r\n const oldThermalEfficienciesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicTrough && elem.foundationId === parabolicTrough.foundationId) {\r\n oldThermalEfficienciesAboveFoundation.set(elem.id, (elem as ParabolicTroughModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Thermal Efficiency for All Parabolic Troughs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicTrough.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicTrough,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicTrough, parabolicTrough.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicTrough.id) as ParabolicTroughModel;\r\n const oldThermalEfficiency = p ? p.thermalEfficiency : parabolicTrough.thermalEfficiency;\r\n const undoableChange = {\r\n name: 'Set Parabolic Trough Thermal Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldThermalEfficiency,\r\n newValue: value,\r\n changedElementId: parabolicTrough.id,\r\n changedElementType: parabolicTrough.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicTrough.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicTroughThermalEfficiency = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThermalEfficiency(inputValue);\r\n };\r\n\r\n if (parabolicTrough?.type !== ObjectType.ParabolicTrough) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicTroughMenu.OnlyThisParabolicTrough', lang)}\r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllSelectedParabolicTroughs', lang)}\r\n \r\n \r\n {i18n.t('parabolicTroughMenu.AllParabolicTroughs', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicTroughThermalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { ParabolicTroughModel } from '../../../models/ParabolicTroughModel';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport ParabolicTroughLengthInput from './parabolicTroughLengthInput';\r\nimport ParabolicTroughWidthInput from './parabolicTroughWidthInput';\r\nimport ParabolicTroughPoleHeightInput from './parabolicTroughPoleHeightInput';\r\nimport ParabolicTroughLatusRectumInput from './parabolicTroughLatusRectumInput';\r\nimport ParabolicTroughModuleLengthInput from './parabolicTroughModuleLengthInput';\r\nimport ParabolicTroughReflectanceInput from './parabolicTroughReflectanceInput';\r\nimport ParabolicTroughAbsorptanceInput from './parabolicTroughAbsorptanceInput';\r\nimport ParabolicTroughOpticalEfficiencyInput from './parabolicTroughOpticalEfficiencyInput';\r\nimport ParabolicTroughThermalEfficiencyInput from './parabolicTroughThermalEfficiencyInput';\r\nimport { ObjectType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\n\r\nexport const ParabolicTroughMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const updateSolarCollectorDrawSunBeamById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicTrough = useSelectedElement(ObjectType.ParabolicTrough) as ParabolicTroughModel | undefined;\r\n\r\n const [moduleLengthDialogVisible, setModuleLengthDialogVisible] = useState(false);\r\n const [latusRectumDialogVisible, setLatusRectumDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [reflectanceDialogVisible, setReflectanceDialogVisible] = useState(false);\r\n const [absorptanceDialogVisible, setAbsorptanceDialogVisible] = useState(false);\r\n const [opticalEfficiencyDialogVisible, setOpticalEfficiencyDialogVisible] = useState(false);\r\n const [thermalEfficiencyDialogVisible, setThermalEfficiencyDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(parabolicTrough);\r\n const showLabel = useLabelShow(parabolicTrough);\r\n const updateLabelText = useLabelText(parabolicTrough, labelText);\r\n const setLabelSize = useLabelSize(parabolicTrough);\r\n const setLabelFontSize = useLabelFontSize(parabolicTrough);\r\n const setLabelColor = useLabelColor(parabolicTrough);\r\n const setLabelHeight = useLabelHeight(parabolicTrough);\r\n\r\n if (!parabolicTrough) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !parabolicTrough?.locked;\r\n\r\n const drawSunBeam = (checked: boolean) => {\r\n if (parabolicTrough) {\r\n const undoableCheck = {\r\n name: 'Show Sun Beam',\r\n timestamp: Date.now(),\r\n checked: !parabolicTrough.drawSunBeam,\r\n selectedElementId: parabolicTrough.id,\r\n selectedElementType: ObjectType.ParabolicTrough,\r\n undo: () => {\r\n updateSolarCollectorDrawSunBeamById(parabolicTrough.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateSolarCollectorDrawSunBeamById(parabolicTrough.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateSolarCollectorDrawSunBeamById(parabolicTrough.id, checked);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {parabolicTrough && editable && (\r\n <>\r\n {/* trough length */}\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {/* trough width */}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {/* module length */}\r\n {moduleLengthDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setModuleLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicTroughMenu.ModuleLength', lang)} ...\r\n \r\n\r\n {/* latus rectum */}\r\n {latusRectumDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setLatusRectumDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicTroughMenu.LatusRectum', lang)} ...\r\n \r\n\r\n {/* extra pole height in addition to the half of the aperture width */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.ExtraPoleHeight', lang)} ...\r\n \r\n\r\n {/* reflectance */}\r\n {reflectanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setReflectanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorReflectance', lang)} ...\r\n \r\n\r\n {/* absorptance */}\r\n {absorptanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setAbsorptanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReceiverAbsorptance', lang)} ...\r\n \r\n\r\n {/* optical efficiency */}\r\n {opticalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setOpticalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency', lang)} ...\r\n \r\n\r\n {/* thermal efficiency */}\r\n {thermalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setThermalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency', lang)} ...\r\n \r\n\r\n {/* draw sun beam or not */}\r\n \r\n drawSunBeam(e.target.checked)}>\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)}\r\n \r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the center */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishDiameterInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLxById = useStore(Selector.updateElementLxById);\r\n const updateLyById = useStore(Selector.updateElementLyById);\r\n const updateLxAboveFoundation = useStore(Selector.updateElementLxAboveFoundation);\r\n const updateLyAboveFoundation = useStore(Selector.updateElementLyAboveFoundation);\r\n const updateLxForAll = useStore(Selector.updateElementLxForAll);\r\n const updateLyForAll = useStore(Selector.updateElementLyForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.lx ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (dish: ParabolicDishModel, lx: number) => {\r\n const parent = getParent(dish);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(dish)) as ParabolicDishModel;\r\n clone.lx = lx;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (dish: ParabolicDishModel, lx: number) => {\r\n // check if the new diameter will cause the parabolic dish to be out of the bound\r\n if (!withinParent(dish, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).lx = value;\r\n (e as ParabolicDishModel).ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setDiameter = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.lx);\r\n } else {\r\n const oldDiametersSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldDiametersSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Diameter for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldDiametersSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, di] of undoableChangeSelected.oldValues.entries()) {\r\n // both lx and ly can represent the diameter\r\n updateLxById(id, di as number);\r\n updateLyById(id, di as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldDiametersSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.lx);\r\n } else {\r\n const oldDiametersAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldDiametersAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Diameter for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldDiametersAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, di] of undoableChangeAll.oldValues.entries()) {\r\n // both lx and ly can represent the diameter\r\n updateLxById(id, di as number);\r\n updateLyById(id, di as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLxForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n updateLyForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLxForAll(ObjectType.ParabolicDish, value);\r\n updateLyForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.lx);\r\n } else {\r\n const oldDiametersAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldDiametersAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Diameter for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldDiametersAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, di] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLxById(id, di as number);\r\n updateLyById(id, di as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLxAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n updateLyAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLxAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n updateLyAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldDiameter = p ? p.lx : parabolicDish.lx;\r\n rejectRef.current = rejectChange(parabolicDish, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldDiameter);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Diameter',\r\n timestamp: Date.now(),\r\n oldValue: oldDiameter,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n updateLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n updateLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLxById(parabolicDish.id, value);\r\n updateLyById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishRimDiameter = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setDiameter(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setDiameter(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n // for some reason, we have to confirm the type first. otherwise, other popup menus may invoke this\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishDiameterInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicDishPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.poleHeight ?? 1);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(parabolicDish);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.parentId === parabolicDish.parentId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).tiltAngle = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicDishModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.poleHeight);\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as ParabolicDishModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicDishModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.poleHeight);\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldPoleHeightsAll.set(elem.id, (elem as ParabolicDishModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as ParabolicDishModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.poleHeight);\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as ParabolicDishModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldPoleHeight = p ? p.poleHeight : parabolicDish.poleHeight;\r\n rejectRef.current = 0.5 * parabolicDish.lx * Math.abs(Math.sin(parabolicDish.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldPoleHeight);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishPoleHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishLatusRectumInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLatusRectumById = useStore(Selector.updateParabolaLatusRectumById);\r\n const updateLatusRectumAboveFoundation = useStore(Selector.updateParabolaLatusRectumAboveFoundation);\r\n const updateLatusRectumForAll = useStore(Selector.updateParabolaLatusRectumForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.latusRectum ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (dish: ParabolicDishModel, latusRectum: number) => {\r\n const parent = getParent(dish);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(dish)) as ParabolicDishModel;\r\n clone.latusRectum = latusRectum;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (dish: ParabolicDishModel, latusRectum: number) => {\r\n // check if the new latus rectum will cause the parabolic dish to be out of the bound\r\n if (!withinParent(dish, latusRectum)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (latusRectum: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const dish = e as ParabolicDishModel;\r\n if (Math.abs(dish.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.latusRectum - latusRectum) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).latusRectum = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLatusRectum = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.latusRectum);\r\n } else {\r\n const oldLatusRectumsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLatusRectumsSelected.set(elem.id, (elem as ParabolicDishModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Latus Rectum for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeSelected.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLatusRectumsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.latusRectum);\r\n } else {\r\n const oldLatusRectumsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldLatusRectumsAll.set(elem.id, (elem as ParabolicDishModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Latus Rectum for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeAll.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLatusRectumForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLatusRectumForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n if (rejectChange(elem as ParabolicDishModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(parabolicDish.latusRectum);\r\n } else {\r\n const oldLatusRectumsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldLatusRectumsAboveFoundation.set(elem.id, (elem as ParabolicDishModel).latusRectum);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Latus Rectum for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLatusRectumsAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, lr] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLatusRectumById(id, lr as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLatusRectumAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLatusRectumAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldLatusRectum = p ? p.latusRectum : parabolicDish.latusRectum;\r\n rejectRef.current = rejectChange(parabolicDish, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLatusRectum);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Latus Rectum',\r\n timestamp: Date.now(),\r\n oldValue: oldLatusRectum,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateLatusRectumById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLatusRectumById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLatusRectumById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishLatusRectum = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLatusRectum(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLatusRectum(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 20 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishLatusRectumInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishReflectanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateCspReflectanceById);\r\n const updateAboveFoundation = useStore(Selector.updateCspReflectanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateCspReflectanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n const [inputValue, setInputValue] = useState(parabolicDish?.reflectance ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (reflectance: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).reflectance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReflectance = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldReflectancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldReflectancesSelected.set(elem.id, (elem as ParabolicDishModel).reflectance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Reflectance for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldReflectancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldReflectancesAll.set(elem.id, (elem as ParabolicDishModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Reflectance for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldReflectancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldReflectancesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Reflectance for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldReflectance = p ? p.reflectance : parabolicDish.reflectance;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Reflectance',\r\n timestamp: Date.now(),\r\n oldValue: oldReflectance,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishReflectance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setReflectance(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishReflectanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicDishAbsorptanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorAbsorptanceById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorAbsorptanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorAbsorptanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.absorptance ?? 0.95);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (absorptance: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pd = e as ParabolicDishModel;\r\n if (Math.abs(pd.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pd = e as ParabolicDishModel;\r\n if (Math.abs(pd.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pd = e as ParabolicDishModel;\r\n if (Math.abs(pd.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.absorptance - absorptance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).absorptance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setAbsorptance = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldAbsorptancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldAbsorptancesSelected.set(elem.id, (elem as ParabolicDishModel).absorptance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Absorptance for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldAbsorptancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldAbsorptancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldAbsorptancesAll.set(elem.id, (elem as ParabolicDishModel).absorptance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Absorptance for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldAbsorptancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldAbsorptancesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).absorptance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Absorptance for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldAbsorptancesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldAbsorptance = p ? p.absorptance : parabolicDish.absorptance;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Absorptance',\r\n timestamp: Date.now(),\r\n oldValue: oldAbsorptance,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishAbsorptance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setAbsorptance(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishAbsorptanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicDishOpticalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorOpticalEfficiencyById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorOpticalEfficiencyAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorOpticalEfficiencyForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.opticalEfficiency ?? 0.7);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (opticalEfficiency: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.opticalEfficiency - opticalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).opticalEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setOpticalEfficiency = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldOpticalEfficienciesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldOpticalEfficienciesSelected.set(elem.id, (elem as ParabolicDishModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Optical Efficiency for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldOpticalEfficienciesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldOpticalEfficienciesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldOpticalEfficienciesAll.set(elem.id, (elem as ParabolicDishModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Optical Efficiency for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldOpticalEfficienciesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldOpticalEfficienciesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).opticalEfficiency);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Optical Efficiency for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldOpticalEfficienciesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldOpticalEfficiency = p ? p.opticalEfficiency : parabolicDish.opticalEfficiency;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Optical Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldOpticalEfficiency,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishOpticalEfficiency = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setOpticalEfficiency(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishOpticalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishThermalEfficiencyInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateParabolicCollectorThermalEfficiencyById);\r\n const updateAboveFoundation = useStore(Selector.updateParabolicCollectorThermalEfficiencyAboveFoundation);\r\n const updateForAll = useStore(Selector.updateParabolicCollectorThermalEfficiencyForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.thermalEfficiency ?? 0.3);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (thermalEfficiency: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.thermalEfficiency - thermalEfficiency) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).thermalEfficiency = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setThermalEfficiency = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldThermalEfficienciesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldThermalEfficienciesSelected.set(elem.id, (elem as ParabolicDishModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Thermal Efficiency for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldThermalEfficienciesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldThermalEfficienciesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldThermalEfficienciesAll.set(elem.id, (elem as ParabolicDishModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Thermal Efficiency for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldThermalEfficienciesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldThermalEfficienciesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).thermalEfficiency);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Thermal Efficiency for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldThermalEfficienciesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ab] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ab as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldThermalEfficiency = p ? p.thermalEfficiency : parabolicDish.thermalEfficiency;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Thermal Efficiency',\r\n timestamp: Date.now(),\r\n oldValue: oldThermalEfficiency,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishThermalEfficiency = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThermalEfficiency(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishThermalEfficiencyInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, ParabolicDishStructureType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst ParabolicDishStructureTypeInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputStructureType, setInputStructureType] = useState(\r\n parabolicDish?.structureType ?? ParabolicDishStructureType.CentralPole,\r\n );\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateById = (id: string, structureType: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked) {\r\n if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).structureType = structureType;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, structureType: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.foundationId === foundationId && !e.locked) {\r\n if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).structureType = structureType;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (structureType: number) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (!e.locked) {\r\n if (e.type === ObjectType.ParabolicDish) {\r\n (e as ParabolicDishModel).structureType = structureType;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (structureType: ParabolicDishStructureType) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pd = e as ParabolicDishModel;\r\n if (pd.structureType !== structureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pd = e as ParabolicDishModel;\r\n if (pd.structureType !== structureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pd = e as ParabolicDishModel;\r\n if (pd.structureType !== structureType) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (parabolicDish?.structureType !== structureType) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).structureType = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setStructureType = (type: ParabolicDishStructureType) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(type)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldStructureTypesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldStructureTypesSelected.set(elem.id, (elem as ParabolicDishModel).structureType);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Structure Type for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldStructureTypesSelected,\r\n newValue: type,\r\n undo: () => {\r\n for (const [id, st] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, st as ParabolicDishStructureType);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldStructureTypesSelected, type);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldStructureTypesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldStructureTypesAll.set(elem.id, (elem as ParabolicDishModel).structureType);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Structure Type for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldStructureTypesAll,\r\n newValue: type,\r\n undo: () => {\r\n for (const [id, st] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, st as ParabolicDishStructureType);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as ParabolicDishStructureType);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(type);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldStructureTypesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldStructureTypesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).structureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Structure Type for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldStructureTypesAboveFoundation,\r\n newValue: type,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, st] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, st as ParabolicDishStructureType);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as ParabolicDishStructureType,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(parabolicDish.foundationId, type);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldStructureType = p ? p.structureType : parabolicDish.structureType;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Structure Type',\r\n timestamp: Date.now(),\r\n oldValue: oldStructureType,\r\n newValue: type,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as ParabolicDishStructureType);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as ParabolicDishStructureType);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(parabolicDish.id, type);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishReceiverStructure = type;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setStructureType(inputStructureType);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ParabolicDishStructureTypeInput;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst ParabolicDishPoleRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleRadiusById = useStore(Selector.updateSolarCollectorPoleRadiusById);\r\n const updatePoleRadiusAboveFoundation = useStore(Selector.updateSolarCollectorPoleRadiusAboveFoundation);\r\n const updatePoleRadiusForAll = useStore(Selector.updateSolarCollectorPoleRadiusForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.parabolicDishActionScope);\r\n const setActionScope = useStore(Selector.setParabolicDishActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(parabolicDish?.poleRadius ?? 0.1);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleRadius: number) => {\r\n if (!parabolicDish) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.foundationId === parabolicDish?.foundationId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(parabolicDish);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.ParabolicDish && e.parentId === parabolicDish.parentId && !e.locked) {\r\n const pt = e as ParabolicDishModel;\r\n if (Math.abs(pt.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(parabolicDish?.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.ParabolicDish && !e.locked && map.has(e.id)) {\r\n (e as ParabolicDishModel).poleRadius = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleRadius = (value: number) => {\r\n if (!parabolicDish) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as ParabolicDishModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Radius for Selected Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish) {\r\n oldValuesAll.set(elem.id, (elem as ParabolicDishModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Radius for All Parabolic Dishes',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleRadiusForAll(ObjectType.ParabolicDish, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleRadiusForAll(ObjectType.ParabolicDish, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (parabolicDish.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.ParabolicDish && elem.foundationId === parabolicDish.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as ParabolicDishModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Radius for All Parabolic Dishes Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: parabolicDish.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleRadiusAboveFoundation(\r\n ObjectType.ParabolicDish,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleRadiusAboveFoundation(ObjectType.ParabolicDish, parabolicDish.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n const p = getElementById(parabolicDish.id) as ParabolicDishModel;\r\n const oldValue = p ? p.poleRadius : parabolicDish.poleRadius;\r\n const undoableChange = {\r\n name: 'Set Parabolic Dish Pole Radius',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: parabolicDish.id,\r\n changedElementType: parabolicDish.type,\r\n undo: () => {\r\n updatePoleRadiusById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleRadiusById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleRadiusById(parabolicDish.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.parabolicDishPoleRadius = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPoleRadius(inputValue);\r\n };\r\n\r\n if (parabolicDish?.type !== ObjectType.ParabolicDish) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 0.5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('parabolicDishMenu.OnlyThisParabolicDish', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishesAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('parabolicDishMenu.AllSelectedParabolicDishes', lang)}\r\n \r\n {i18n.t('parabolicDishMenu.AllParabolicDishes', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ParabolicDishPoleRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { ParabolicDishModel } from '../../../models/ParabolicDishModel';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport ParabolicDishDiameterInput from './parabolicDishDiameterInput';\r\nimport ParabolicDishPoleHeightInput from './parabolicDishPoleHeightInput';\r\nimport ParabolicDishLatusRectumInput from './parabolicDishLatusRectumInput';\r\nimport ParabolicDishReflectanceInput from './parabolicDishReflectanceInput';\r\nimport ParabolicDishAbsorptanceInput from './parabolicDishAbsorptanceInput';\r\nimport ParabolicDishOpticalEfficiencyInput from './parabolicDishOpticalEfficiencyInput';\r\nimport ParabolicDishThermalEfficiencyInput from './parabolicDishThermalEfficiencyInput';\r\nimport ParabolicDishStructureTypeInput from './parabolicDishStructureTypeInput';\r\nimport { ObjectType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport ParabolicDishPoleRadiusInput from './parabolicDishPoleRadiusInput';\r\n\r\nexport const ParabolicDishMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const updateSolarCollectorDrawSunBeamById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const parabolicDish = useSelectedElement(ObjectType.ParabolicDish) as ParabolicDishModel | undefined;\r\n\r\n const [structureTypeDialogVisible, setStructureTypeDialogVisible] = useState(false);\r\n const [latusRectumDialogVisible, setLatusRectumDialogVisible] = useState(false);\r\n const [diameterDialogVisible, setDiameterDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [poleRadiusDialogVisible, setPoleRadiusDialogVisible] = useState(false);\r\n const [reflectanceDialogVisible, setReflectanceDialogVisible] = useState(false);\r\n const [absorptanceDialogVisible, setAbsorptanceDialogVisible] = useState(false);\r\n const [opticalEfficiencyDialogVisible, setOpticalEfficiencyDialogVisible] = useState(false);\r\n const [thermalEfficiencyDialogVisible, setThermalEfficiencyDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(parabolicDish);\r\n const showLabel = useLabelShow(parabolicDish);\r\n const updateLabelText = useLabelText(parabolicDish, labelText);\r\n const setLabelSize = useLabelSize(parabolicDish);\r\n const setLabelFontSize = useLabelFontSize(parabolicDish);\r\n const setLabelColor = useLabelColor(parabolicDish);\r\n const setLabelHeight = useLabelHeight(parabolicDish);\r\n\r\n if (!parabolicDish) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !parabolicDish?.locked;\r\n\r\n const drawSunBeam = (checked: boolean) => {\r\n if (parabolicDish) {\r\n const undoableCheck = {\r\n name: 'Show Sun Beam',\r\n timestamp: Date.now(),\r\n checked: !parabolicDish.drawSunBeam,\r\n selectedElementId: parabolicDish.id,\r\n selectedElementType: ObjectType.ParabolicDish,\r\n undo: () => {\r\n updateSolarCollectorDrawSunBeamById(parabolicDish.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateSolarCollectorDrawSunBeamById(parabolicDish.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateSolarCollectorDrawSunBeamById(parabolicDish.id, checked);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {parabolicDish && editable && (\r\n <>\r\n {/* dish rim diameter */}\r\n {diameterDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setDiameterDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicDishMenu.RimDiameter', lang)} ...\r\n \r\n\r\n {/* latus rectum */}\r\n {latusRectumDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLatusRectumDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicDishMenu.LatusRectum', lang)} ...\r\n \r\n\r\n {/* structure type */}\r\n {structureTypeDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setStructureTypeDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('parabolicDishMenu.ReceiverStructure', lang)} ...\r\n \r\n\r\n {/* extra pole height in addition to the aperture radius */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.ExtraPoleHeight', lang)} ...\r\n \r\n\r\n {poleRadiusDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.PoleRadius', lang)} ...\r\n \r\n\r\n {/* reflectance */}\r\n {reflectanceDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setReflectanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorReflectance', lang)} ...\r\n \r\n\r\n {/* absorptance */}\r\n {absorptanceDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setAbsorptanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReceiverAbsorptance', lang)} ...\r\n \r\n\r\n {/* optical efficiency */}\r\n {opticalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setOpticalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorOpticalEfficiency', lang)} ...\r\n \r\n\r\n {/* thermal efficiency */}\r\n {thermalEfficiencyDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setThermalEfficiencyDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReceiverThermalEfficiency', lang)} ...\r\n \r\n\r\n {/* draw sun beam or not */}\r\n \r\n drawSunBeam(e.target.checked)}>\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)}\r\n \r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the dish center */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\n// for Fresnel reflectors, since the default alignment is north-south, ly is always much larger than lx.\r\n// to agree with the convention, we call ly length and lx width, reversed from most other elements in Aladdin.\r\n\r\nconst FresnelReflectorLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLyById = useStore(Selector.updateElementLyById);\r\n const updateLyAboveFoundation = useStore(Selector.updateElementLyAboveFoundation);\r\n const updateLyForAll = useStore(Selector.updateElementLyForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.ly ?? 9);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (reflector: FresnelReflectorModel, ly: number) => {\r\n const parent = getParent(reflector);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(reflector)) as FresnelReflectorModel;\r\n clone.ly = ly;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (reflector: FresnelReflectorModel, ly: number) => {\r\n // check if the new length will cause the Fresnel reflector to be out of the bound\r\n if (!withinParent(reflector, ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n e.ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLength = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.ly);\r\n } else {\r\n const oldLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldLengthsSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.ly);\r\n } else {\r\n const oldLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldLengthsAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLyForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLyForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.ly);\r\n } else {\r\n const oldLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldLengthsAboveFoundation.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Length for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLyAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLyAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldLength = f ? f.ly : fresnelReflector.ly;\r\n rejectRef.current = rejectChange(fresnelReflector, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Length',\r\n timestamp: Date.now(),\r\n oldValue: oldLength,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLyById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const modularize = (value: number) => {\r\n if (!fresnelReflector) return 1;\r\n let length = value ?? 1;\r\n const n = Math.max(1, Math.ceil((length - fresnelReflector.moduleLength / 2) / fresnelReflector.moduleLength));\r\n length = n * fresnelReflector.moduleLength;\r\n return length;\r\n };\r\n\r\n const apply = () => {\r\n setLength(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setInputValue(modularize(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('fresnelReflectorMenu.ModuleLength', lang) +\r\n ': ' +\r\n fresnelReflector.moduleLength.toFixed(1) +\r\n ' ' +\r\n i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {Math.round(inputValue / fresnelReflector.moduleLength) +\r\n ' ' +\r\n i18n.t('fresnelReflectorMenu.ModulesLong', lang)}\r\n
\r\n {i18n.t('word.Maximum', lang)}: 200 {i18n.t('fresnelReflectorMenu.Modules', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\n// for Fresnel reflectors, since the default alignment is north-south, ly is always much larger than lx.\r\n// to agree with the convention, we call ly length and lx width, reversed from most other elements in Aladdin.\r\n\r\nconst FresnelReflectorWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLxById = useStore(Selector.updateElementLxById);\r\n const updateLxAboveFoundation = useStore(Selector.updateElementLxAboveFoundation);\r\n const updateLxForAll = useStore(Selector.updateElementLxForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.lx ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (reflector: FresnelReflectorModel, lx: number) => {\r\n const parent = getParent(reflector);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(reflector)) as FresnelReflectorModel;\r\n clone.lx = lx;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (reflector: FresnelReflectorModel, lx: number) => {\r\n // check if the new width will cause the Fresnel reflector to be out of the bound\r\n if (!withinParent(reflector, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n (e as FresnelReflectorModel).lx = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setWidth = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.lx);\r\n } else {\r\n const oldWidthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldWidthsSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldWidthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.lx);\r\n } else {\r\n const oldWidthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldWidthsAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLxForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLxForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.lx);\r\n } else {\r\n const oldWidthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldWidthsAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldWidthsAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLxAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLxAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldWidth = f ? f.lx : fresnelReflector.lx;\r\n rejectRef.current = rejectChange(fresnelReflector, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldWidth);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Width',\r\n timestamp: Date.now(),\r\n oldValue: oldWidth,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLxById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorWidth = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setWidth(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setWidth(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n // for some reason, we have to confirm the type first. otherwise, other popup menus may invoke this\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FresnelReflectorPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.poleHeight ?? 1);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n const inputPoleHeightRef = useRef(fresnelReflector?.poleHeight ?? 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(fresnelReflector);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && e.parentId === fresnelReflector.parentId && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n (e as FresnelReflectorModel).poleHeight = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as FresnelReflectorModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n inputPoleHeightRef.current = fresnelReflector.poleHeight;\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as FresnelReflectorModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as FresnelReflectorModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n inputPoleHeightRef.current = fresnelReflector.poleHeight;\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldPoleHeightsAll.set(elem.id, (elem as FresnelReflectorModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n if (0.5 * elem.ly * Math.abs(Math.sin((elem as FresnelReflectorModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n inputPoleHeightRef.current = fresnelReflector.poleHeight;\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldPoleHeight = f ? f.poleHeight : fresnelReflector.poleHeight;\r\n rejectRef.current = 0.5 * fresnelReflector.lx * Math.abs(Math.sin(fresnelReflector.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n inputPoleHeightRef.current = oldPoleHeight;\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorPoleHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FresnelReflectorModuleLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateModuleLengthById = useStore(Selector.updateModuleLengthById);\r\n const updateModuleLengthAboveFoundation = useStore(Selector.updateModuleLengthAboveFoundation);\r\n const updateModuleLengthForAll = useStore(Selector.updateModuleLengthForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.moduleLength ?? 3);\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (reflector: FresnelReflectorModel, moduleLength: number) => {\r\n const parent = getParent(reflector);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(reflector)) as FresnelReflectorModel;\r\n clone.moduleLength = moduleLength;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (reflector: FresnelReflectorModel, moduleLength: number) => {\r\n // check if the new module length will cause the Fresnel reflector to be out of the bound\r\n if (!withinParent(reflector, moduleLength)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (moduleLength: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const reflector = e as FresnelReflectorModel;\r\n if (Math.abs(reflector.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.moduleLength - moduleLength) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n (e as FresnelReflectorModel).moduleLength = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setModuleLength = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.moduleLength);\r\n } else {\r\n const oldModuleLengthsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldModuleLengthsSelected.set(elem.id, (elem as FresnelReflectorModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Module Length for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeSelected.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldModuleLengthsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.moduleLength);\r\n } else {\r\n const oldModuleLengthsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldModuleLengthsAll.set(elem.id, (elem as FresnelReflectorModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Module Length for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeAll.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n updateModuleLengthForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateModuleLengthForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n if (rejectChange(elem as FresnelReflectorModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(fresnelReflector.moduleLength);\r\n } else {\r\n const oldModuleLengthsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldModuleLengthsAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).moduleLength);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Module Length for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldModuleLengthsAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, ml] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateModuleLengthById(id, ml as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateModuleLengthAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateModuleLengthAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldModuleLength = f ? f.moduleLength : fresnelReflector.moduleLength;\r\n rejectRef.current = rejectChange(fresnelReflector, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldModuleLength);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Module Length',\r\n timestamp: Date.now(),\r\n oldValue: oldModuleLength,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateModuleLengthById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateModuleLengthById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateModuleLengthById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorModuleLength = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setModuleLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setModuleLength(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 10 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorModuleLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst FresnelReflectorReflectanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateCspReflectanceById);\r\n const updateAboveFoundation = useStore(Selector.updateCspReflectanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateCspReflectanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(fresnelReflector?.reflectance ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (reflectance: number) => {\r\n if (!fresnelReflector) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (Math.abs(fr.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(fresnelReflector?.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked && map.has(e.id)) {\r\n (e as FresnelReflectorModel).reflectance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReflectance = (value: number) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldReflectancesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldReflectancesSelected.set(elem.id, (elem as FresnelReflectorModel).reflectance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Reflectance for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldReflectancesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldReflectancesAll.set(elem.id, (elem as FresnelReflectorModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Reflectance for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n const oldReflectancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldReflectancesAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Reflectance for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldReflectance = f ? f.reflectance : fresnelReflector.reflectance;\r\n const undoableChange = {\r\n name: 'Set Fresnel Reflector Reflectance',\r\n timestamp: Date.now(),\r\n oldValue: oldReflectance,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorReflectance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setReflectance(inputValue);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorReflectanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope, SolarStructure } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { Util } from 'src/Util';\r\nimport { HeliostatModel } from 'src/models/HeliostatModel';\r\n\r\nconst { Option } = Select;\r\n\r\nconst FresnelReflectorAbsorberSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateSolarReceiverById);\r\n const updateAboveFoundation = useStore(Selector.updateSolarReceiverAboveFoundation);\r\n const updateForAll = useStore(Selector.updateSolarReceiverForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [selectedReceiverId, setSelectedReceiverId] = useState(fresnelReflector?.receiverId ?? 'None');\r\n\r\n const lang = useLanguage();\r\n\r\n const pipes = useMemo(() => {\r\n const pipeIds: string[] = [];\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusPipe) {\r\n pipeIds.push(f.id);\r\n }\r\n }\r\n }\r\n return pipeIds;\r\n }, [elements]);\r\n\r\n useEffect(() => {\r\n setSelectedReceiverId('None');\r\n if (fresnelReflector) {\r\n if (fresnelReflector.receiverId) {\r\n setSelectedReceiverId(fresnelReflector.receiverId);\r\n } else {\r\n const parent = getElementById(fresnelReflector.parentId);\r\n if (parent) {\r\n if (\r\n parent.type === ObjectType.Foundation &&\r\n (parent as FoundationModel).solarStructure === SolarStructure.FocusPipe\r\n ) {\r\n setSelectedReceiverId(parent.id);\r\n }\r\n }\r\n }\r\n }\r\n }, [fresnelReflector]);\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (receiverId: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.receiverId !== receiverId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.receiverId !== receiverId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.receiverId !== receiverId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (fresnelReflector?.receiverId !== receiverId) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, receiverId: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!Util.isHeliostatOrFresnelReflector(e.type)) continue;\r\n if (!e.locked && map.has(e.id)) {\r\n if (e.type === ObjectType.Heliostat) {\r\n (e as HeliostatModel).towerId = receiverId;\r\n } else if (e.type === ObjectType.FresnelReflector) {\r\n (e as FresnelReflectorModel).receiverId = receiverId;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReceiverId = (value: string) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as FresnelReflectorModel).receiverId);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Receiver for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldValuesAll.set(elem.id, (elem as FresnelReflectorModel).receiverId);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Receiver for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).receiverId);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Receiver for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldValue = f ? f.receiverId : fresnelReflector.receiverId;\r\n const undoableChange = {\r\n name: 'Set Receiver for Fresnel Reflector',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.fresnelReflectorReceiver = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n if (selectedReceiverId) {\r\n setReceiverId(selectedReceiverId);\r\n }\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedReceiverId(value);\r\n }}\r\n >\r\n {pipes.map((s, i) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorAbsorberSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space, Switch } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { Util } from 'src/Util';\r\nimport { SolarCollector } from 'src/models/SolarCollector';\r\n\r\nconst FresnelReflectorDrawSunBeamSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const updateAboveFoundation = useStore(Selector.updateSolarCollectorDrawSunBeamAboveFoundation);\r\n const updateForAll = useStore(Selector.updateSolarCollectorDrawSunBeamForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.fresnelReflectorActionScope);\r\n const setActionScope = useStore(Selector.setFresnelReflectorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [sunBeam, setSunBeam] = useState(!!fresnelReflector?.drawSunBeam);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (drawSunBeam: boolean) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.FresnelReflector && !e.locked) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.FresnelReflector &&\r\n e.foundationId === fresnelReflector?.foundationId &&\r\n !e.locked\r\n ) {\r\n const fr = e as FresnelReflectorModel;\r\n if (fr.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (fresnelReflector?.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: boolean) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (!Util.isSolarCollectorType(e.type)) continue;\r\n if (!e.locked && e.type === ObjectType.FresnelReflector && map.has(e.id)) {\r\n (e as SolarCollector).drawSunBeam = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setDrawSunBeam = (value: boolean) => {\r\n if (!fresnelReflector) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as FresnelReflectorModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Draw Sun Beam for Selected Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as boolean,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector) {\r\n oldValuesAll.set(elem.id, (elem as FresnelReflectorModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Draw Sun Beam for All Fresnel Reflectors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.FresnelReflector, undoableChangeAll.newValue as boolean);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.FresnelReflector, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (fresnelReflector.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.FresnelReflector && elem.foundationId === fresnelReflector.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as FresnelReflectorModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Draw Sun Beam for All Fresnel Reflectors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: fresnelReflector.foundationId,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.FresnelReflector,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as boolean,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.FresnelReflector, fresnelReflector.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const f = getElementById(fresnelReflector.id) as FresnelReflectorModel;\r\n const oldValue = f ? f.drawSunBeam : fresnelReflector.drawSunBeam;\r\n const undoableChange = {\r\n name: 'Draw Sun Beam for Fresnel Reflector',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: fresnelReflector.id,\r\n changedElementType: fresnelReflector.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as boolean);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as boolean);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(fresnelReflector.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setDrawSunBeam(sunBeam);\r\n };\r\n\r\n if (fresnelReflector?.type !== ObjectType.FresnelReflector) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSunBeam(checked);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.OnlyThisFresnelReflector', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectorsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllSelectedFresnelReflectors', lang)}\r\n \r\n \r\n {i18n.t('fresnelReflectorMenu.AllFresnelReflectors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FresnelReflectorDrawSunBeamSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { FresnelReflectorModel } from '../../../models/FresnelReflectorModel';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport FresnelReflectorLengthInput from './fresnelReflectorLengthInput';\r\nimport FresnelReflectorWidthInput from './fresnelReflectorWidthInput';\r\nimport FresnelReflectorPoleHeightInput from './fresnelReflectorPoleHeightInput';\r\nimport FresnelReflectorModuleLengthInput from './fresnelReflectorModuleLengthInput';\r\nimport FresnelReflectorReflectanceInput from './fresnelReflectorReflectanceInput';\r\nimport FresnelReflectorAbsorberSelection from './fresnelReflectorAbsorberSelection';\r\nimport FresnelReflectorDrawSunBeamSelection from './fresnelReflectorDrawSunBeamSelection';\r\nimport { ObjectType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\n\r\nexport const FresnelReflectorMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const fresnelReflector = useSelectedElement(ObjectType.FresnelReflector) as FresnelReflectorModel | undefined;\r\n\r\n const [moduleLengthDialogVisible, setModuleLengthDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [reflectanceDialogVisible, setReflectanceDialogVisible] = useState(false);\r\n const [receiverDialogVisible, setReceiverDialogVisible] = useState(false);\r\n const [sunBeamDialogVisible, setSunBeamDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(fresnelReflector);\r\n const showLabel = useLabelShow(fresnelReflector);\r\n const updateLabelText = useLabelText(fresnelReflector, labelText);\r\n const setLabelSize = useLabelSize(fresnelReflector);\r\n const setLabelFontSize = useLabelFontSize(fresnelReflector);\r\n const setLabelColor = useLabelColor(fresnelReflector);\r\n const setLabelHeight = useLabelHeight(fresnelReflector);\r\n\r\n if (!fresnelReflector) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !fresnelReflector?.locked;\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {fresnelReflector && editable && (\r\n <>\r\n {/* receiver */}\r\n {receiverDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setReceiverDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('fresnelReflectorMenu.SelectAbsorberToReflectSunlightTo', lang)} ...\r\n \r\n\r\n {/* reflector length */}\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {/* reflector width */}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {/* module length */}\r\n {moduleLengthDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setModuleLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('fresnelReflectorMenu.ModuleLength', lang)} ...\r\n \r\n\r\n {/* extra pole height in addition to the half of the aperture width */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.ExtraPoleHeight', lang)} ...\r\n \r\n\r\n {/* reflectance */}\r\n {reflectanceDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setReflectanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorReflectance', lang)} ...\r\n \r\n\r\n {/* draw sun beam or not */}\r\n {sunBeamDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setSunBeamDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)} ...\r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the dish center */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst HeliostatWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLyById = useStore(Selector.updateElementLyById);\r\n const updateLyAboveFoundation = useStore(Selector.updateElementLyAboveFoundation);\r\n const updateLyForAll = useStore(Selector.updateElementLyForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.ly ?? 4);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (heliostat: HeliostatModel, ly: number) => {\r\n const parent = getParent(heliostat);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(heliostat)) as HeliostatModel;\r\n clone.ly = ly;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (heliostat: HeliostatModel, ly: number) => {\r\n // check if the new width will cause the heliostat to be out of the bound\r\n if (!withinParent(heliostat, ly)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (ly: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.ly - ly) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setWidth = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.ly);\r\n } else {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeSelected.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.ly);\r\n } else {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAll.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLyForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLyForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.ly);\r\n } else {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, elem.ly);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, ly] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLyById(id, ly as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLyAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLyAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldValue = h ? h.ly : heliostat.ly;\r\n rejectRef.current = rejectChange(heliostat, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldValue);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Heliostat Width',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLyById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLyById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatWidth = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setWidth(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setWidth(inputValue);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 20 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HeliostatWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst HeliostatLengthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateLxById = useStore(Selector.updateElementLxById);\r\n const updateLxAboveFoundation = useStore(Selector.updateElementLxAboveFoundation);\r\n const updateLxForAll = useStore(Selector.updateElementLxForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.lx ?? 2);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const withinParent = (heliostat: HeliostatModel, lx: number) => {\r\n const parent = getParent(heliostat);\r\n if (parent) {\r\n const clone = JSON.parse(JSON.stringify(heliostat)) as HeliostatModel;\r\n clone.lx = lx;\r\n return Util.isSolarCollectorWithinHorizontalSurface(clone, parent);\r\n }\r\n return false;\r\n };\r\n\r\n const rejectChange = (heliostat: HeliostatModel, lx: number) => {\r\n // check if the new length will cause the heliostat to be out of the bound\r\n if (!withinParent(heliostat, lx)) {\r\n return true;\r\n }\r\n // other check?\r\n return false;\r\n };\r\n\r\n const needChange = (lx: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const heliostat = e as HeliostatModel;\r\n if (Math.abs(heliostat.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.lx - lx) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).lx = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setLength = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.lx);\r\n } else {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Length for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeSelected.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.lx);\r\n } else {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Length for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAll.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n updateLxForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateLxForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n if (rejectChange(elem as HeliostatModel, value)) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.lx);\r\n } else {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, elem.lx);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Length for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, lx] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateLxById(id, lx as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateLxAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateLxAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldValue = h ? h.lx : heliostat.lx;\r\n rejectRef.current = rejectChange(heliostat, value);\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldValue);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Heliostat Length',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateLxById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatLength = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setLength(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setLength(inputValue);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.MinimumValue', lang)}: 1 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n {i18n.t('word.MaximumValue', lang)}: 20 {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HeliostatLengthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst HeliostatPoleHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleHeightById = useStore(Selector.updateSolarCollectorPoleHeightById);\r\n const updatePoleHeightAboveFoundation = useStore(Selector.updateSolarCollectorPoleHeightAboveFoundation);\r\n const updatePoleHeightForAll = useStore(Selector.updateSolarCollectorPoleHeightForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.poleHeight ?? 1);\r\n\r\n const rejectRef = useRef(false);\r\n const rejectedValue = useRef();\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleHeight: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(heliostat);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.parentId === heliostat.parentId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.poleHeight - poleHeight) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).poleHeight = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleHeight = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n rejectedValue.current = undefined;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n if (0.5 * Math.max(elem.lx, elem.ly) * Math.abs(Math.sin((elem as HeliostatModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.poleHeight);\r\n } else {\r\n const oldPoleHeightsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldPoleHeightsSelected.set(elem.id, (elem as HeliostatModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Height for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldPoleHeightsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n if (0.5 * Math.max(elem.lx, elem.ly) * Math.abs(Math.sin((elem as HeliostatModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.poleHeight);\r\n } else {\r\n const oldPoleHeightsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldPoleHeightsAll.set(elem.id, (elem as HeliostatModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Height for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleHeightForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleHeightForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n rejectRef.current = false;\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n if (0.5 * Math.max(elem.lx, elem.ly) * Math.abs(Math.sin((elem as HeliostatModel).tiltAngle)) > value) {\r\n rejectRef.current = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(heliostat.poleHeight);\r\n } else {\r\n const oldPoleHeightsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldPoleHeightsAboveFoundation.set(elem.id, (elem as HeliostatModel).poleHeight);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Height for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldPoleHeightsAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleHeightById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleHeightAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleHeightAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldPoleHeight = h ? h.poleHeight : heliostat.poleHeight;\r\n rejectRef.current =\r\n 0.5 * Math.max(heliostat.lx, heliostat.ly) * Math.abs(Math.sin(heliostat.tiltAngle)) > value;\r\n if (rejectRef.current) {\r\n rejectedValue.current = value;\r\n setInputValue(oldPoleHeight);\r\n } else {\r\n const undoableChange = {\r\n name: 'Set Heliostat Pole Height',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleHeight,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleHeightById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleHeightById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatPoleHeight = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n rejectRef.current = false;\r\n setDialogVisible(false);\r\n };\r\n\r\n const cancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const ok = () => {\r\n setPoleHeight(inputValue);\r\n if (!rejectRef.current) {\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n }\r\n };\r\n\r\n const apply = () => {\r\n setPoleHeight(inputValue);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n const rejectedMessage = rejectRef.current\r\n ? ': ' +\r\n i18n.t('message.NotApplicableToSelectedAction', lang) +\r\n (rejectedValue.current !== undefined ? ' (' + rejectedValue.current.toFixed(2) + ')' : '')\r\n : null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HeliostatPoleHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst HeliostatReflectanceInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateCspReflectanceById);\r\n const updateAboveFoundation = useStore(Selector.updateCspReflectanceAboveFoundation);\r\n const updateForAll = useStore(Selector.updateCspReflectanceForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.reflectance ?? 0.9);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (reflectance: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.reflectance - reflectance) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).reflectance = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setReflectance = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldReflectancesAll.set(elem.id, (elem as HeliostatModel).reflectance);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Reflectance for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldReflectancesAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldReflectancesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldReflectancesAll.set(elem.id, (elem as HeliostatModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Reflectance for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n const oldReflectancesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldReflectancesAboveFoundation.set(elem.id, (elem as HeliostatModel).reflectance);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Reflectance for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldReflectancesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, rf] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, rf as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldReflectance = h ? h.reflectance : heliostat.reflectance;\r\n const undoableChange = {\r\n name: 'Set Heliostat Reflectance',\r\n timestamp: Date.now(),\r\n oldValue: oldReflectance,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatReflectance = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setReflectance(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HeliostatReflectanceInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Space, Switch } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst HeliostatDrawSunBeamSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateSolarCollectorDrawSunBeamById);\r\n const updateAboveFoundation = useStore(Selector.updateSolarCollectorDrawSunBeamAboveFoundation);\r\n const updateForAll = useStore(Selector.updateSolarCollectorDrawSunBeamForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [sunBeam, setSunBeam] = useState(!!heliostat?.drawSunBeam);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (drawSunBeam: boolean) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (hs.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (hs.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (hs.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (heliostat?.drawSunBeam !== drawSunBeam) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: boolean) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).drawSunBeam = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setDrawSunBeam = (value: boolean) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as HeliostatModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Draw Sun Beam for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as boolean,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, (elem as HeliostatModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Draw Sun Beam for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.Heliostat, undoableChangeAll.newValue as boolean);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as HeliostatModel).drawSunBeam);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Draw Sun Beam for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, sb] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, sb as boolean);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as boolean,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldValue = h ? h.drawSunBeam : heliostat.drawSunBeam;\r\n const undoableChange = {\r\n name: 'Draw Sun Beam for Heliostat',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as boolean);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as boolean);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setDrawSunBeam(sunBeam);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HeliostatDrawSunBeamSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport { Col, Radio, RadioChangeEvent, Row, Select, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { ObjectType, Scope, SolarStructure } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { FoundationModel } from '../../../models/FoundationModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst { Option } = Select;\r\n\r\nconst HeliostatTowerSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updateById = useStore(Selector.updateSolarReceiverById);\r\n const updateAboveFoundation = useStore(Selector.updateSolarReceiverAboveFoundation);\r\n const updateForAll = useStore(Selector.updateSolarReceiverForAll);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [selectedTowerId, setSelectedTowerId] = useState(heliostat?.towerId ?? 'None');\r\n\r\n const lang = useLanguage();\r\n\r\n const towers = useMemo(() => {\r\n const towerIds: string[] = [];\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Foundation) {\r\n const f = e as FoundationModel;\r\n if (f.solarStructure === SolarStructure.FocusTower) {\r\n towerIds.push(f.id);\r\n }\r\n }\r\n }\r\n return towerIds;\r\n }, [elements]);\r\n\r\n useEffect(() => {\r\n setSelectedTowerId('None');\r\n if (heliostat) {\r\n if (heliostat.towerId) {\r\n setSelectedTowerId(heliostat.towerId);\r\n } else {\r\n const parent = getElementById(heliostat.parentId);\r\n if (parent) {\r\n if (\r\n parent.type === ObjectType.Foundation &&\r\n (parent as FoundationModel).solarStructure === SolarStructure.FocusTower\r\n ) {\r\n setSelectedTowerId(parent.id);\r\n }\r\n }\r\n }\r\n }\r\n }, [heliostat]);\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (towerId: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (hs.towerId !== towerId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (hs.towerId !== towerId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (hs.towerId !== towerId) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (heliostat?.towerId !== towerId) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).towerId = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setTowerId = (value: string) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as HeliostatModel).towerId);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Tower for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, (elem as HeliostatModel).towerId);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Tower for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(ObjectType.Heliostat, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as HeliostatModel).towerId);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Tower for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, ti] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, ti as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldValue = h ? h.towerId : heliostat.towerId;\r\n const undoableChange = {\r\n name: 'Set Tower for Heliostat',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatTower = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n if (selectedTowerId) {\r\n setTowerId(selectedTowerId);\r\n }\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HeliostatTowerSelection;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, RadioChangeEvent, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ZERO_TOLERANCE } from '../../../constants';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst HeliostatPoleRadiusInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const getElementById = useStore(Selector.getElementById);\r\n const updatePoleRadiusById = useStore(Selector.updateSolarCollectorPoleRadiusById);\r\n const updatePoleRadiusAboveFoundation = useStore(Selector.updateSolarCollectorPoleRadiusAboveFoundation);\r\n const updatePoleRadiusForAll = useStore(Selector.updateSolarCollectorPoleRadiusForAll);\r\n const getParent = useStore(Selector.getParent);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.heliostatActionScope);\r\n const setActionScope = useStore(Selector.setHeliostatActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(heliostat?.poleRadius ?? 0.1);\r\n\r\n const lang = useLanguage();\r\n\r\n const onScopeChange = (e: RadioChangeEvent) => {\r\n setActionScope(e.target.value);\r\n };\r\n\r\n const needChange = (poleRadius: number) => {\r\n if (!heliostat) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.foundationId === heliostat?.foundationId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeOnSurface:\r\n const parent = getParent(heliostat);\r\n if (parent) {\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Heliostat && e.parentId === heliostat.parentId && !e.locked) {\r\n const hs = e as HeliostatModel;\r\n if (Math.abs(hs.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (Math.abs(heliostat?.poleRadius - poleRadius) > ZERO_TOLERANCE) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n useStore.getState().set((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Heliostat && !e.locked && map.has(e.id)) {\r\n (e as HeliostatModel).poleRadius = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const setPoleRadius = (value: number) => {\r\n if (!heliostat) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldValuesSelected.set(elem.id, (elem as HeliostatModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Pole Radius for Selected Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeSelected.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat) {\r\n oldValuesAll.set(elem.id, (elem as HeliostatModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Pole Radius for All Heliostats',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAll.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n updatePoleRadiusForAll(ObjectType.Heliostat, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updatePoleRadiusForAll(ObjectType.Heliostat, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (heliostat.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Heliostat && elem.foundationId === heliostat.foundationId) {\r\n oldValuesAboveFoundation.set(elem.id, (elem as HeliostatModel).poleRadius);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Pole Radius for All Heliostats Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: heliostat.foundationId,\r\n undo: () => {\r\n for (const [id, ph] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updatePoleRadiusById(id, ph as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updatePoleRadiusAboveFoundation(\r\n ObjectType.Heliostat,\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updatePoleRadiusAboveFoundation(ObjectType.Heliostat, heliostat.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n // selected element may be outdated, make sure that we get the latest\r\n const h = getElementById(heliostat.id) as HeliostatModel;\r\n const oldPoleRadius = h ? h.poleRadius : heliostat.poleRadius;\r\n const undoableChange = {\r\n name: 'Set Heliostat Pole Radius',\r\n timestamp: Date.now(),\r\n oldValue: oldPoleRadius,\r\n newValue: value,\r\n changedElementId: heliostat.id,\r\n changedElementType: heliostat.type,\r\n undo: () => {\r\n updatePoleRadiusById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updatePoleRadiusById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updatePoleRadiusById(heliostat.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.heliostatPoleRadius = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setPoleRadius(inputValue);\r\n };\r\n\r\n if (heliostat?.type !== ObjectType.Heliostat) return null;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 0.5] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n \r\n \r\n {i18n.t('heliostatMenu.OnlyThisHeliostat', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostatsAboveFoundation', lang)}\r\n \r\n \r\n {i18n.t('heliostatMenu.AllSelectedHeliostats', lang)}\r\n \r\n {i18n.t('heliostatMenu.AllHeliostats', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default HeliostatPoleRadiusInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { HeliostatModel } from '../../../models/HeliostatModel';\r\nimport HeliostatWidthInput from './heliostatWidthInput';\r\nimport HeliostatLengthInput from './heliostatLengthInput';\r\nimport HeliostatPoleHeightInput from './heliostatPoleHeightInput';\r\nimport HeliostatReflectanceInput from './heliostatReflectorReflectanceInput';\r\nimport HeliostatDrawSunBeamSelection from './heliostatDrawSunBeamSelection';\r\nimport HeliostatTowerSelection from './heliostatTowerSelection';\r\nimport { ObjectType } from '../../../types';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport HeliostatPoleRadiusInput from './heliostatPoleRadiusInput';\r\n\r\nexport const HeliostatMenu = React.memo(() => {\r\n const language = useStore(Selector.language);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const heliostat = useSelectedElement(ObjectType.Heliostat) as HeliostatModel | undefined;\r\n\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [lengthDialogVisible, setLengthDialogVisible] = useState(false);\r\n const [poleHeightDialogVisible, setPoleHeightDialogVisible] = useState(false);\r\n const [poleRadiusDialogVisible, setPoleRadiusDialogVisible] = useState(false);\r\n const [reflectanceDialogVisible, setReflectanceDialogVisible] = useState(false);\r\n const [sunBeamDialogVisible, setSunBeamDialogVisible] = useState(false);\r\n const [towerDialogVisible, setTowerDialogVisible] = useState(false);\r\n\r\n const { labelText, setLabelText } = useLabel(heliostat);\r\n const showLabel = useLabelShow(heliostat);\r\n const updateLabelText = useLabelText(heliostat, labelText);\r\n const setLabelSize = useLabelSize(heliostat);\r\n const setLabelFontSize = useLabelFontSize(heliostat);\r\n const setLabelColor = useLabelColor(heliostat);\r\n const setLabelHeight = useLabelHeight(heliostat);\r\n\r\n if (!heliostat) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !heliostat?.locked;\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n {heliostat && editable && (\r\n <>\r\n {/* select tower */}\r\n {towerDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTowerDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('heliostatMenu.SelectTowerToReflectSunlightTo', lang)} ...\r\n \r\n\r\n {/* heliostat length */}\r\n {lengthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setLengthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Length', lang)} ...\r\n \r\n\r\n {/* heliostat width */}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n\r\n {/* extra pole height in addition to the half of the aperture size */}\r\n {poleHeightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.ExtraPoleHeight', lang)} ...\r\n \r\n\r\n {poleRadiusDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setPoleRadiusDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.PoleRadius', lang)} ...\r\n \r\n\r\n {/* reflectance */}\r\n {reflectanceDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setReflectanceDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('concentratedSolarPowerCollectorMenu.ReflectorReflectance', lang)} ...\r\n \r\n\r\n {/* draw sun beam or not */}\r\n {sunBeamDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setSunBeamDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('solarCollectorMenu.DrawSunBeam', lang)} ...\r\n \r\n\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the center */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport { Select } from 'antd';\nimport { CommonStoreState, useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { ObjectType, TreeType } from '../../../types';\nimport AppleImage from '../../../resources/apple_summer.png';\nimport BirchImage from '../../../resources/birch_summer.png';\nimport CoconutImage from '../../../resources/coconut.png';\nimport DogwoodImage from '../../../resources/dogwood_summer.png';\nimport ElmImage from '../../../resources/elm_summer.png';\nimport LindenImage from '../../../resources/linden_summer.png';\nimport MagnoliaImage from '../../../resources/magnolia_summer.png';\nimport MapleImage from '../../../resources/maple_summer.png';\nimport OakImage from '../../../resources/oak_summer.png';\nimport FanPalmImage from '../../../resources/fan_palm.png';\nimport PineImage from '../../../resources/pine.png';\nimport SpruceImage from '../../../resources/spruce.png';\nimport { UndoableChange } from '../../../undo/UndoableChange';\nimport i18n from '../../../i18n/i18n';\nimport { TreeModel } from '../../../models/TreeModel';\n\nconst { Option } = Select;\n\nconst TreeSelection = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const tree = useStore.getState().getSelectedElement() as TreeModel;\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const lang = { lng: language };\n\n const updateTreeTypeById = (id: string, type: TreeType) => {\n setCommonStore((state: CommonStoreState) => {\n for (const e of state.elements) {\n if (e.type === ObjectType.Tree && e.id === id) {\n (e as TreeModel).name = type;\n break;\n }\n }\n });\n };\n\n return (\n {\n if (tree) {\n const oldTree = tree.name;\n if (oldTree !== value) {\n const undoableChange = {\n name: 'Change Tree',\n timestamp: Date.now(),\n oldValue: oldTree,\n newValue: value,\n changedElementId: tree.id,\n changedElementType: tree.type,\n undo: () => {\n updateTreeTypeById(undoableChange.changedElementId, undoableChange.oldValue as TreeType);\n },\n redo: () => {\n updateTreeTypeById(undoableChange.changedElementId, undoableChange.newValue as TreeType);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n updateTreeTypeById(tree.id, value);\n setCommonStore((state) => {\n state.actionState.treeType = value;\n });\n setUpdateFlag(!updateFlag);\n }\n }\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default TreeSelection;\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Input, InputNumber, Menu, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType } from '../../../types';\r\nimport TreeSelection from './treeSelection';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { TreeModel } from '../../../models/TreeModel';\r\nimport {\r\n useLabel,\r\n useLabelColor,\r\n useLabelFontSize,\r\n useLabelHeight,\r\n useLabelShow,\r\n useLabelSize,\r\n useLabelText,\r\n useSelectedElement,\r\n} from './menuHooks';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\n\r\nexport const TreeMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const updateElementLxById = useStore(Selector.updateElementLxById);\r\n const updateElementLzById = useStore(Selector.updateElementLzById);\r\n const tree = useSelectedElement(ObjectType.Tree) as TreeModel | undefined;\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const [inputSpread, setInputSpread] = useState(tree?.lx ?? 1);\r\n const [inputHeight, setInputHeight] = useState(tree?.lz ?? 1);\r\n\r\n const { labelText, setLabelText } = useLabel(tree);\r\n const showLabel = useLabelShow(tree);\r\n const updateLabelText = useLabelText(tree, labelText);\r\n const setLabelSize = useLabelSize(tree);\r\n const setLabelFontSize = useLabelFontSize(tree);\r\n const setLabelColor = useLabelColor(tree);\r\n const setLabelHeight = useLabelHeight(tree);\r\n\r\n if (!tree) return null;\r\n\r\n const lang = { lng: language };\r\n const editable = !tree?.locked;\r\n\r\n const updateTreeShowModelById = (id: string, showModel: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Tree && e.id === id) {\r\n (e as TreeModel).showModel = showModel;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTreeFlipById = (id: string, flip: boolean) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Tree && e.id === id) {\r\n (e as TreeModel).flip = flip;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const showTreeModel = (on: boolean) => {\r\n if (!tree) return;\r\n const undoableCheck = {\r\n name: 'Show Tree Model',\r\n timestamp: Date.now(),\r\n checked: on,\r\n selectedElementId: tree.id,\r\n selectedElementType: ObjectType.Tree,\r\n undo: () => {\r\n updateTreeShowModelById(tree.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateTreeShowModelById(tree.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateTreeShowModelById(tree.id, on);\r\n };\r\n\r\n const setSpread = (value: number) => {\r\n if (!tree) return;\r\n if (!value || value === inputSpread) return;\r\n const undoableChange = {\r\n name: 'Set Tree Spread',\r\n timestamp: Date.now(),\r\n oldValue: inputSpread,\r\n newValue: value,\r\n changedElementId: tree.id,\r\n changedElementType: tree.type,\r\n undo: () => {\r\n updateElementLxById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLxById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLxById(tree.id, value);\r\n setInputSpread(value);\r\n setCommonStore((state) => {\r\n state.actionState.treeSpread = value;\r\n });\r\n };\r\n\r\n const setHeight = (value: number) => {\r\n if (!tree) return;\r\n if (!value || value === inputHeight) return;\r\n const undoableChange = {\r\n name: 'Set Tree Height',\r\n timestamp: Date.now(),\r\n oldValue: inputHeight,\r\n newValue: value,\r\n changedElementId: tree.id,\r\n changedElementType: tree.type,\r\n undo: () => {\r\n updateElementLzById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateElementLzById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateElementLzById(tree.id, value);\r\n setInputHeight(value);\r\n setCommonStore((state) => {\r\n state.actionState.treeHeight = value;\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n {editable && }\r\n \r\n \r\n showTreeModel(e.target.checked)}\r\n >\r\n {i18n.t('treeMenu.ShowModel', lang)}\r\n \r\n \r\n\r\n {editable && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Flip Tree',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: tree.id,\r\n selectedElementType: ObjectType.Tree,\r\n undo: () => {\r\n updateTreeFlipById(tree.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateTreeFlipById(tree.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateTreeFlipById(tree.id, checked);\r\n }}\r\n >\r\n {i18n.t('treeMenu.Flip', { lng: language })}\r\n \r\n \r\n )}\r\n\r\n {/* have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n {editable && (\r\n \r\n \r\n {i18n.t('treeMenu.Type', lang)}: \r\n \r\n \r\n\r\n \r\n \r\n {i18n.t('treeMenu.Spread', lang) + ' (' + i18n.t('word.MeterAbbreviation', lang) + ')'}:\r\n \r\n setSpread(value)}\r\n />\r\n \r\n\r\n \r\n \r\n {i18n.t('word.Height', lang) + ' (' + i18n.t('word.MeterAbbreviation', lang) + ')'}:\r\n \r\n setHeight(value)}\r\n />\r\n \r\n \r\n )}\r\n\r\n {editable && (\r\n \r\n {/* show label or not */}\r\n \r\n \r\n {i18n.t('labelSubMenu.KeepShowingLabel', lang)}\r\n \r\n \r\n\r\n {/*have to wrap the text field with a Menu so that it can stay open when the user types in it */}\r\n \r\n {/* label text */}\r\n \r\n ) => setLabelText(e.target.value)}\r\n onPressEnter={updateLabelText}\r\n onBlur={updateLabelText}\r\n />\r\n \r\n {/* the label's height relative to the tree top */}\r\n \r\n setLabelHeight(value)}\r\n />\r\n \r\n {/* the label's font size */}\r\n \r\n setLabelFontSize(value)}\r\n />\r\n \r\n {/* the label's size */}\r\n \r\n setLabelSize(value)}\r\n />\r\n \r\n {/* the label's color */}\r\n \r\n setLabelColor(e.target.value)}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n});\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH5QsaESMnxG6tNgAAARJJREFUeJzt2kFqQkEQhOHpoeahXtN4rEDwCgm4EBEMARMI2YXkDAbeCaJu+wZdi/87QUHT46sZ4/Pr/dZgQ7336gxI1IKBOFHvUZ0BCUeWGQZihiPLjMaYqjMg0TzP1RmQxMNmTTE0EofjnoEY0Wq1rM6ARO3GgjhR0EOsKIIe4oSmboamboYNMaPGQKyo86NuhSPLDAMxw1eWGU0T7yFOdLn8VWdAoqfHbXUGJHF6PXLda0RjjOoMSNQaC+KEHmJGjasTK2yIGZq6GTbEDO8hZngPMcORZYaBmOEry4wWS/7b60S/3z/VGZDo5XlXnQFJnD/euO41ouv/tToDEtELvdBDzPAeYoYNMcNAzHB1YuYO6bYjJ2+wRTUAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAIAAAAlV+npAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QsaESMX4redmgAAARNJREFUaIHt2sGtwjAQBFB2PY6ggbSc+//0AI2AOCMOiIgOkgKQENDC7mk10rwKRqvYsie2ZVk3EgNvVp2BBtxadQYacNewomCmZRjl1QGYaFgJ9nq9qzPQwDzfqzPQwPF4qM5Awx7zszoDDXy/1RF4oHdUZ6CBoffqDDQA6MuKgrnOpVForrthlPqsBLhpGUap/EvQBp+gSSVoWAk6lCZgXZfqDDSw//+rzkDDrtdbdQYa2O521RlooDUdSqMwDOqzogBoWFFwXXfC1GclwDWsMLUOCeqzErTBJ2hSCRpWAkw/LMLw+egxWxSmaarOQMNO50t1BhoYx7E6Aw29g09Qn5WArj4rDKZaOQxQRROmPivhByjbHph8EXN9AAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/wall_03_menu.39f5c56a.png\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/wall_05_menu.c887c64e.png\";","export default __webpack_public_path__ + \"static/media/wall_06_menu.3dc4a0c2.png\";","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/wall_09_menu.5124ae81.png\";","export default __webpack_public_path__ + \"static/media/wall_10_menu.a934991d.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport WallTextureDefaultIcon from 'src/resources/wall_edge.png';\r\nimport WallTexture01Icon from 'src/resources/wall_01_menu.png';\r\nimport WallTexture02Icon from 'src/resources/wall_02_menu.png';\r\nimport WallTexture03Icon from 'src/resources/wall_03_menu.png';\r\nimport WallTexture04Icon from 'src/resources/wall_04_menu.png';\r\nimport WallTexture05Icon from 'src/resources/wall_05_menu.png';\r\nimport WallTexture06Icon from 'src/resources/wall_06_menu.png';\r\nimport WallTexture07Icon from 'src/resources/wall_07_menu.png';\r\nimport WallTexture08Icon from 'src/resources/wall_08_menu.png';\r\nimport WallTexture09Icon from 'src/resources/wall_09_menu.png';\r\nimport WallTexture10Icon from 'src/resources/wall_10_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, WallTexture } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallTextureSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const lang = useLanguage();\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(wall?.textureType ?? WallTexture.Default);\r\n\r\n const { Option } = Select;\r\n\r\n const updateById = (id: string, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).textureType = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (texture: WallTexture) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n (e as WallModel).textureType = texture;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundationId && !e.locked) {\r\n (e as WallModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n (e as WallModel).textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: WallTexture) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).textureType &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.textureType) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setTexture = (value: WallTexture) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldTexturesSelected.set(e.id, (e as WallModel).textureType ?? WallTexture.Default);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, texture as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as WallTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n oldTexturesAll.set(e.id, (e as WallModel).textureType ?? WallTexture.Default);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, texture as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as WallTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && !e.locked) {\r\n oldTexturesAboveFoundation.set(e.id, (e as WallModel).textureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Texture for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, wt] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, wt as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as WallTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.textureType);\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Texture for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as WallTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldTexture = updatedWall?.textureType ?? wall.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as WallTexture);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as WallTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallTexture = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallTextureSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { useColorPicker, useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport { CompactPicker } from 'react-color';\r\n\r\nconst WallColorSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const lang = useLanguage();\r\n\r\n const [selectedColor, onColorChange] = useColorPicker(wall?.color ?? '#ffffff');\r\n\r\n const updateById = (id: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n e.color = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (color: string) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n e.color = color;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundationId && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (color: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n e.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n e.color = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== e.color &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.color) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateColor = (value: string) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldColorsSelected.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldColorsAll.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldColorsAboveFoundation.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Color for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, color] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, color as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.color ?? '#ffffff');\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Color for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as string);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldColor = updatedWall?.color ?? wall.color ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Color of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n updateColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Util } from '../../../Util';\r\nimport { useColorPicker, useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallStructureColorSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [selectedColor, onColorChange] = useColorPicker(wall?.structureColor ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).structureColor = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (color: string) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n (e as WallModel).structureColor = color;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (fId: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === fId && e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).structureColor = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).structureColor = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n e.color = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).structureColor &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).structureColor && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).structureColor &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.structureColor && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.structureColor) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldColorsSelected.set(e.id, (e as WallModel).structureColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Structure Color for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldColorsAll.set(e.id, (e as WallModel).structureColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Structure Color for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldColorsAboveFoundation.set(e.id, (e as WallModel).structureColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Structure Color for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.color ?? '#ffffff');\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Structure Color for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as string);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldColor = updatedWall?.structureColor ?? wall.structureColor ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Structure Color of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallStructureColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallStructureColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\ninterface WallNumberInputProps {\r\n wall: WallModel;\r\n dataType: string;\r\n attributeKey: keyof WallModel;\r\n range: [min: number, max: number];\r\n step: number;\r\n setDialogVisible: () => void;\r\n unit?: string;\r\n}\r\n\r\nconst WallNumberInput = ({\r\n wall,\r\n dataType,\r\n attributeKey,\r\n range,\r\n step,\r\n unit,\r\n setDialogVisible,\r\n}: WallNumberInputProps) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const inputRef = useRef(wall[attributeKey] as number);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateActionState = (value: number) => {\r\n setCommonStore((state) => {\r\n switch (attributeKey) {\r\n case 'ly':\r\n state.actionState.wallThickness = value;\r\n break;\r\n case 'lz':\r\n state.actionState.wallHeight = value;\r\n break;\r\n case 'opacity':\r\n state.actionState.wallOpacity = value;\r\n break;\r\n case 'structureSpacing':\r\n state.actionState.wallStructureSpacing = value;\r\n break;\r\n case 'structureWidth':\r\n state.actionState.wallStructureWidth = value;\r\n break;\r\n case 'eavesLength':\r\n state.actionState.wallEavesLength = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const updateById = (id: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel)[attributeKey] as number) = val;\r\n break;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateConnectedWalls = (val: number) => {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n ((e as WallModel)[attributeKey] as number) = val;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateAboveFoundation = (fId: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === fId && e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel)[attributeKey] as number) = val;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateForAll = (val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel)[attributeKey] as number) = val;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n ((e as WallModel)[attributeKey] as number) = value;\r\n }\r\n }\r\n });\r\n updateActionState(value);\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel)[attributeKey] &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel)[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall[attributeKey]) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WallModel)[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldValuesAll.set(e.id, (e as WallModel)[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldValuesAboveFoundation.set(e.id, (e as WallModel)[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Walls Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e[attributeKey] as number);\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set ${dataType} for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const oldValue = wall[attributeKey] as number;\r\n const undoableChange = {\r\n name: `Set Wall ${dataType}`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n inputRef.current = wall[attributeKey] as number;\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputRef.current);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n (inputRef.current = val)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{range.toString()}] {unit}\r\n
\r\n \r\n \r\n {unit ?? ' '}\r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WallNumberInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_WALL_R_VALUE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallRValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(wall?.rValue ?? DEFAULT_WALL_R_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toRValueInUS(inputValue));\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as WallModel).rValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).rValue &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).rValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).rValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.rValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.rValue) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n oldValuesSelected.set(e.id, w.rValue ?? DEFAULT_WALL_R_VALUE);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set R-Value for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n const w = e as WallModel;\r\n oldValuesAll.set(e.id, w.rValue ?? DEFAULT_WALL_R_VALUE);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set R-Value for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall?.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && !e.locked) {\r\n const w = e as WallModel;\r\n oldValuesAboveFoundation.set(e.id, w.rValue ?? DEFAULT_WALL_R_VALUE);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set R-Value for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n if (!e.locked) {\r\n const w = e as WallModel;\r\n oldValuesConnectedWalls.set(e.id, w.rValue ?? DEFAULT_WALL_R_VALUE);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: 'Set R-Value for All Connected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeConnectedWalls.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeConnectedWalls.oldValues as Map,\r\n undoableChangeConnectedWalls.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldValue = updatedWall.rValue ?? wall.rValue ?? DEFAULT_WALL_R_VALUE;\r\n const undoableChange = {\r\n name: 'Set Wall R-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallRValue = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setInputValue(wall?.rValue ?? DEFAULT_WALL_R_VALUE);\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toRValueInUS(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: m²·℃/W\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toRValueInSI(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toRValueInUS(0.01).toFixed(3)}, {Util.toRValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: h·ft²·℉/Btu\r\n
\r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default WallRValueInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallHeatCapacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(wall?.volumetricHeatCapacity ?? 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as WallModel).volumetricHeatCapacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).volumetricHeatCapacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).volumetricHeatCapacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).volumetricHeatCapacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.volumetricHeatCapacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.volumetricHeatCapacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const w = e as WallModel;\r\n oldValuesSelected.set(e.id, w.volumetricHeatCapacity ?? 0.5);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Volumetric Heat Capacity for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n const w = e as WallModel;\r\n oldValuesAll.set(e.id, w.volumetricHeatCapacity ?? 0.5);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Volumetric Heat Capacity for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall?.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && !e.locked) {\r\n const w = e as WallModel;\r\n oldValuesAboveFoundation.set(e.id, w.volumetricHeatCapacity ?? 0.5);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Volumetric Heat Capacity for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n if (!e.locked) {\r\n const w = e as WallModel;\r\n oldValuesConnectedWalls.set(e.id, w.volumetricHeatCapacity ?? 0.5);\r\n updateById(w.id, value);\r\n }\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: 'Set Volumetric Heat Capacity for All Connected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeConnectedWalls.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeConnectedWalls.oldValues as Map,\r\n undoableChangeConnectedWalls.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldValue = updatedWall.volumetricHeatCapacity ?? wall.volumetricHeatCapacity ?? 0.5;\r\n const undoableChange = {\r\n name: 'Set Volumetric Heat Capacity of Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallVolumetricHeatCapacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={setInputValue}\r\n />\r\n
\r\n kWh/(m³·℃)\r\n
\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WallHeatCapacityInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useRef } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { ParapetArgs, WallModel } from '../../../models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\ninterface WallNumberInputProps {\r\n wall: WallModel;\r\n dataType: string;\r\n attributeKey: keyof ParapetArgs;\r\n range: [min: number, max: number];\r\n step: number;\r\n setDialogVisible: () => void;\r\n unit?: string;\r\n}\r\n\r\nconst WallParapetNumberInput = ({\r\n wall,\r\n dataType,\r\n attributeKey,\r\n range,\r\n step,\r\n unit,\r\n setDialogVisible,\r\n}: WallNumberInputProps) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const inputRef = useRef(wall.parapet[attributeKey] as number);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateActionState = (value: number) => {\r\n setCommonStore((state) => {\r\n switch (attributeKey) {\r\n case 'copingsHeight':\r\n state.actionState.wallParapet.copingsHeight = value;\r\n break;\r\n case 'copingsWidth':\r\n state.actionState.wallParapet.copingsWidth = value;\r\n break;\r\n case 'parapetHeight':\r\n state.actionState.wallParapet.parapetHeight = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const updateById = (id: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel).parapet[attributeKey] as number) = val;\r\n break;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateConnectedWalls = (val: number) => {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n ((e as WallModel).parapet[attributeKey] as number) = val;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateAboveFoundation = (fId: string, val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === fId && e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel).parapet[attributeKey] as number) = val;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateForAll = (val: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n ((e as WallModel).parapet[attributeKey] as number) = val;\r\n }\r\n }\r\n });\r\n updateActionState(val);\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n ((e as WallModel).parapet[attributeKey] as number) = value;\r\n }\r\n }\r\n });\r\n updateActionState(value);\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).parapet[attributeKey] &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).parapet[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).parapet[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.parapet[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall.parapet[attributeKey]) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WallModel).parapet[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldValuesAll.set(e.id, (e as WallModel).parapet[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldValuesAboveFoundation.set(e.id, (e as WallModel).parapet[attributeKey] as number);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Walls Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.parapet[attributeKey] as number);\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set ${dataType} for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as number);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const oldValue = wall.parapet[attributeKey] as number;\r\n const undoableChange = {\r\n name: `Set Wall ${dataType}`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputRef.current);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n (inputRef.current = val)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{range.toString()}] {unit}\r\n
\r\n \r\n \r\n {unit ?? ' '}\r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WallParapetNumberInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from '../../../stores/common';\r\nimport * as Selector from '../../../stores/selector';\r\nimport { ObjectType, Scope } from '../../../types';\r\nimport i18n from '../../../i18n/i18n';\r\nimport { UndoableChange } from '../../../undo/UndoableChange';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { WallModel } from '../../../models/WallModel';\r\nimport { CompactPicker } from 'react-color';\r\nimport { Util } from '../../../Util';\r\nimport { useColorPicker, useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst WallParapetColorSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const lang = useLanguage();\r\n const [selectedColor, onColorChange] = useColorPicker(wall?.parapet.color ?? '#ffffff');\r\n\r\n const updateById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).parapet.color = color;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (color: string) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n (e as WallModel).parapet.color = color;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (fId: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.parentId === fId && e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).parapet.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).parapet.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n (e as WallModel).parapet.color = color;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).parapet.color &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).parapet.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).parapet.color &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.parapet.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.parapet.color) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateColor = (value: string) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldColorsSelected.set(e.id, (e as WallModel).parapet.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Parapet Color for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall) {\r\n oldColorsAll.set(e.id, (e as WallModel).parapet.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Parapet Color for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId) {\r\n oldColorsAboveFoundation.set(e.id, (e as WallModel).parapet.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Parapet Color for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, studColor] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, studColor as string);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.color ?? '#ffffff');\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Parapet Color for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as string);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldColor = updatedWall?.parapet.color ?? wall.parapet.color ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Parapet Color of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallParapet.color = value;\r\n });\r\n };\r\n\r\n const apply = () => {\r\n updateColor(selectedColor);\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallParapetColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport WallTextureDefaultIcon from 'src/resources/wall_edge.png';\r\nimport WallTexture01Icon from 'src/resources/wall_01_menu.png';\r\nimport WallTexture02Icon from 'src/resources/wall_02_menu.png';\r\nimport WallTexture03Icon from 'src/resources/wall_03_menu.png';\r\nimport WallTexture04Icon from 'src/resources/wall_04_menu.png';\r\nimport WallTexture05Icon from 'src/resources/wall_05_menu.png';\r\nimport WallTexture06Icon from 'src/resources/wall_06_menu.png';\r\nimport WallTexture07Icon from 'src/resources/wall_07_menu.png';\r\nimport WallTexture08Icon from 'src/resources/wall_08_menu.png';\r\nimport WallTexture09Icon from 'src/resources/wall_09_menu.png';\r\nimport WallTexture10Icon from 'src/resources/wall_10_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { CommonStoreState, useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, WallTexture } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { Util } from '../../../Util';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WallParapetTextureSelection = ({ setDialogVisible }: { setDialogVisible: () => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const wall = useSelectedElement(ObjectType.Wall) as WallModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(wall?.parapet.textureType ?? WallTexture.Default);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateById = (id: string, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.id === id && !e.locked) {\r\n (e as WallModel).parapet.textureType = texture;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateConnectedWalls = (texture: WallTexture) => {\r\n if (!wall) return;\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n if (connectedWalls.length === 0) return;\r\n setCommonStore((state) => {\r\n for (const w of connectedWalls) {\r\n if (!w.locked) {\r\n for (const e of state.elements) {\r\n if (e.id === w.id && e.type === ObjectType.Wall) {\r\n (e as WallModel).parapet.textureType = texture;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === foundationId && !e.locked) {\r\n (e as WallModel).parapet.textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (texture: WallTexture) => {\r\n setCommonStore((state: CommonStoreState) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n (e as WallModel).parapet.textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, texture: WallTexture) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && map.has(e.id)) {\r\n (e as WallModel).parapet.textureType = texture;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const needChange = (value: WallTexture) => {\r\n if (!wall) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n value !== (e as WallModel).parapet.textureType &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && value !== (e as WallModel).parapet.textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Wall &&\r\n e.foundationId === wall.foundationId &&\r\n value !== (e as WallModel).parapet.textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n for (const e of connectedWalls) {\r\n if (value !== e.parapet.textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== wall?.parapet.textureType) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateTexture = (value: WallTexture) => {\r\n if (!wall) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldTexturesSelected.set(e.id, (e as WallModel).parapet.textureType ?? WallTexture.Default);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Parapet Texture for Selected Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeSelected.oldValues.entries()) {\r\n updateById(id, texture as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as WallTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && !e.locked) {\r\n oldTexturesAll.set(e.id, (e as WallModel).parapet.textureType ?? WallTexture.Default);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Parapet Texture for All Walls',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, texture] of undoableChangeAll.oldValues.entries()) {\r\n updateById(id, texture as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as WallTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (wall.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Wall && e.foundationId === wall.foundationId && !e.locked) {\r\n oldTexturesAboveFoundation.set(e.id, (e as WallModel).parapet.textureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Parapet Texture for All Walls Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: wall.foundationId,\r\n undo: () => {\r\n for (const [id, wt] of undoableChangeAboveFoundation.oldValues.entries()) {\r\n updateById(id, wt as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as WallTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(wall.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.AllConnectedObjects:\r\n if (wall) {\r\n const connectedWalls = Util.getAllConnectedWalls(wall);\r\n const oldValuesConnectedWalls = new Map();\r\n for (const e of connectedWalls) {\r\n oldValuesConnectedWalls.set(e.id, e.parapet.textureType);\r\n }\r\n const undoableChangeConnectedWalls = {\r\n name: `Set Parapet Texture for All Connected Walls`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesConnectedWalls,\r\n newValue: value,\r\n undo: () => {\r\n for (const [id, wh] of undoableChangeConnectedWalls.oldValues.entries()) {\r\n updateById(id, wh as WallTexture);\r\n }\r\n },\r\n redo: () => {\r\n updateConnectedWalls(undoableChangeConnectedWalls.newValue as WallTexture);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeConnectedWalls);\r\n updateConnectedWalls(value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (wall) {\r\n const updatedWall = getElementById(wall.id) as WallModel;\r\n const oldTexture = updatedWall?.parapet.textureType ?? wall.parapet.textureType;\r\n const undoableChange = {\r\n name: 'Set Parapet Texture of Selected Wall',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: wall.id,\r\n changedElementType: wall.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as WallTexture);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as WallTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(wall.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.wallParapet.textureType = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n updateTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWallActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('wallMenu.OnlyThisWall', lang)}\r\n {i18n.t('wallMenu.AllConnectedWalls', lang)}\r\n \r\n {i18n.t('wallMenu.AllWallsAboveFoundation', lang)}\r\n \r\n {i18n.t('wallMenu.AllSelectedWalls', lang)}\r\n {i18n.t('wallMenu.AllWalls', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WallParapetTextureSelection;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport { useStore } from '../../../stores/common';\nimport * as Selector from '../../../stores/selector';\nimport { Copy, Cut, Lock } from '../menuItems';\nimport { WindowModel, WindowType } from '../../../models/WindowModel';\nimport { Checkbox, Divider, Menu } from 'antd';\nimport i18n from 'src/i18n/i18n';\nimport SubMenu from 'antd/lib/menu/SubMenu';\nimport { UndoableCheck } from '../../../undo/UndoableCheck';\nimport { ObjectType } from 'src/types';\nimport WindowColorSelection from './windowColorSelection';\nimport WindowNumberInput from './windowNumberInput';\nimport WindowUValueInput from './windowUValueInput';\nimport { useSelectedElement } from './menuHooks';\nimport WindowOptionSelection from './windowOptionSelection';\nimport WindowBooleanSelection from './windowBooleanSelection';\n\nexport enum WindowDataType {\n Color = 'Color',\n Tint = 'Tint',\n Opacity = 'Opacity',\n WindowType = 'WindowType',\n HorizontalMullion = 'HorizontalMullion',\n VerticalMullion = 'VerticalMullion',\n MullionWidth = 'MullionWidth',\n HorizontalMullionSpacing = 'HorizontalMullionSpacing',\n VerticalMullionSpacing = 'VerticalMullionSpacing',\n MullionColor = 'MullionColor',\n Frame = 'Frame',\n FrameWidth = 'FrameWidth',\n SillWidth = 'SillWidth',\n Width = 'Width',\n Height = 'Height',\n Setback = 'Setback',\n LeftShutter = 'LeftShutter',\n RightShutter = 'RightShutter',\n ShutterColor = 'ShutterColor',\n ShutterWidth = 'ShutterWidth',\n}\n\ntype ColorSelectionSettingType = {\n attributeKey: keyof WindowModel;\n};\n\ntype BooleanSelectionSettingType = {\n attributeKey: keyof WindowModel;\n};\n\ntype OptionSelectionSettingType = {\n attributeKey: keyof WindowModel;\n options: string[];\n};\n\ntype NumberDialogSettingType = {\n attributeKey: keyof WindowModel;\n range: [min: number, max: number];\n step: number;\n unit?: string;\n note?: string;\n digit?: number;\n};\n\nconst ColorDialogSettings = {\n Tint: { attributeKey: 'tint' },\n Color: { attributeKey: 'color' },\n MullionColor: { attributeKey: 'mullionColor' },\n ShutterColor: { attributeKey: 'shutterColor' },\n};\n\nconst BooleanDialogSettings = {\n HorizontalMullion: { attributeKey: 'horizontalMullion' },\n VerticalMullion: { attributeKey: 'verticalMullion' },\n Frame: { attributeKey: 'frame' },\n LeftShutter: { attributeKey: 'leftShutter' },\n RightShutter: { attributeKey: 'rightShutter' },\n};\n\nconst OptionDialogSettings = {\n WindowType: {\n attributeKey: 'windowType',\n options: [WindowType.Default, WindowType.Arched, WindowType.Polygonal],\n },\n};\n\nconst NumberDialogSettings = {\n Opacity: {\n attributeKey: 'opacity',\n range: [0, 0.9],\n step: 0.1,\n note: 'windowMenu.SolarHeatGainCoefficient',\n digit: 1,\n },\n Width: { attributeKey: 'lx', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\n Height: { attributeKey: 'lz', range: [0.1, 100], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\n Setback: {\n attributeKey: 'cy',\n range: [0, 1],\n step: 0.01,\n unit: '',\n digit: 0,\n note: 'windowMenu.RelativeToWallThickness',\n },\n MullionWidth: { attributeKey: 'mullionWidth', range: [0, 0.2], step: 0.1, unit: 'word.MeterAbbreviation', digit: 1 },\n ShutterWidth: { attributeKey: 'shutterWidth', range: [0, 0.5], step: 0.01, unit: '', digit: 1 },\n HorizontalMullionSpacing: {\n attributeKey: 'horizontalMullionSpacing',\n range: [0.1, 5],\n step: 0.01,\n unit: 'word.MeterAbbreviation',\n digit: 1,\n },\n VerticalMullionSpacing: {\n attributeKey: 'verticalMullionSpacing',\n range: [0.1, 5],\n step: 0.01,\n unit: 'word.MeterAbbreviation',\n digit: 1,\n },\n FrameWidth: { attributeKey: 'frameWidth', range: [0.05, 0.2], step: 0.01, unit: 'word.MeterAbbreviation', digit: 2 },\n SillWidth: { attributeKey: 'sillWidth', range: [0, 0.5], step: 0.01, unit: 'word.MeterAbbreviation', digit: 2 },\n};\n\nexport const WindowMenu = React.memo(() => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const setApplyCount = useStore(Selector.setApplyCount);\n const getParent = useStore(Selector.getParent);\n\n const [dataType, setDataType] = useState(null);\n const [uValueDialogVisible, setUValueDialogVisible] = useState(false);\n\n const window = useSelectedElement(ObjectType.Window) as WindowModel | undefined;\n\n if (!window) return null;\n\n const lang = { lng: language };\n const parent = window ? getParent(window) : null;\n\n const updateEmptyWindowById = (id: string, empty: boolean) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Window) {\n (e as WindowModel).empty = empty;\n break;\n }\n }\n });\n };\n\n const updateInteriorById = (id: string, interior: boolean) => {\n setCommonStore((state) => {\n for (const e of state.elements) {\n if (e.id === id && e.type === ObjectType.Window) {\n (e as WindowModel).interior = interior;\n break;\n }\n }\n });\n };\n\n const renderCut = () => {\n if (!window || window.locked) {\n return null;\n }\n return ;\n };\n\n const renderMenuItem = (dataType: WindowDataType) => {\n return (\n {\n setApplyCount(0);\n setDataType(dataType);\n }}\n >\n {i18n.t(`windowMenu.${dataType}`, lang)} ...\n \n );\n };\n\n const renderMullionSubMenu = () => {\n if (!window) return null;\n return (\n \n {renderMenuItem(WindowDataType.HorizontalMullion)}\n {renderMenuItem(WindowDataType.VerticalMullion)}\n \n {renderMenuItem(WindowDataType.HorizontalMullionSpacing)}\n {renderMenuItem(WindowDataType.VerticalMullionSpacing)}\n {renderMenuItem(WindowDataType.MullionWidth)}\n {renderMenuItem(WindowDataType.MullionColor)}\n \n );\n };\n\n const renderFrameSubMenu = () => {\n if (!window) return null;\n return (\n \n {renderMenuItem(WindowDataType.Frame)}\n \n {renderMenuItem(WindowDataType.FrameWidth)}\n {renderMenuItem(WindowDataType.SillWidth)}\n {renderMenuItem(WindowDataType.Color)}\n \n );\n };\n\n const renderShutterSubMenu = () => {\n if (!window) return null;\n return (\n \n {renderMenuItem(WindowDataType.LeftShutter)}\n {renderMenuItem(WindowDataType.RightShutter)}\n {renderMenuItem(WindowDataType.ShutterColor)}\n {renderMenuItem(WindowDataType.ShutterWidth)}\n \n );\n };\n\n const renderDialogs = () => {\n switch (dataType) {\n case WindowDataType.Frame:\n case WindowDataType.LeftShutter:\n case WindowDataType.RightShutter:\n case WindowDataType.HorizontalMullion:\n case WindowDataType.VerticalMullion: {\n const setting = BooleanDialogSettings[dataType] as BooleanSelectionSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n />\n );\n }\n case WindowDataType.Tint:\n case WindowDataType.MullionColor:\n case WindowDataType.ShutterColor:\n case WindowDataType.Color: {\n const setting = ColorDialogSettings[dataType] as ColorSelectionSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n />\n );\n }\n case WindowDataType.WindowType: {\n const setting = OptionDialogSettings[dataType] as OptionSelectionSettingType;\n if (!setting) return null;\n return (\n setDataType(null)}\n />\n );\n }\n case WindowDataType.Opacity:\n case WindowDataType.Width:\n case WindowDataType.Height:\n case WindowDataType.Setback:\n case WindowDataType.HorizontalMullionSpacing:\n case WindowDataType.VerticalMullionSpacing:\n case WindowDataType.MullionWidth:\n case WindowDataType.SillWidth:\n case WindowDataType.ShutterWidth:\n case WindowDataType.FrameWidth: {\n const setting = NumberDialogSettings[dataType] as NumberDialogSettingType;\n if (dataType === WindowDataType.Width) {\n setting.range[1] =\n parent && window && window.parentType !== ObjectType.Roof\n ? 2 * parent.lx * Math.min(Math.abs(0.5 - window.cx), Math.abs(-0.5 - window.cx))\n : 100;\n } else if (dataType === WindowDataType.Height) {\n setting.range[1] =\n parent && window && window.parentType !== ObjectType.Roof\n ? 2 * parent.lz * Math.min(Math.abs(0.5 - window.cz), Math.abs(-0.5 - window.cz))\n : 100;\n }\n if (!setting) return null;\n return (\n setDataType(null)}\n unit={setting.unit ? i18n.t(setting.unit, lang) : undefined}\n note={setting.note ? i18n.t(setting.note, lang) : undefined}\n digit={setting.digit ?? 0}\n />\n );\n }\n }\n };\n\n return (\n \n \n {renderCut()}\n \n\n {!window.locked && (\n <>\n \n {\n const checked = e.target.checked;\n const undoableCheck = {\n name: 'Empty Window',\n timestamp: Date.now(),\n checked: checked,\n selectedElementId: window.id,\n selectedElementType: window.type,\n undo: () => {\n updateEmptyWindowById(window.id, !undoableCheck.checked);\n },\n redo: () => {\n updateEmptyWindowById(window.id, undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n updateEmptyWindowById(window.id, checked);\n setCommonStore((state) => {\n state.actionState.windowEmpty = checked;\n });\n }}\n >\n {i18n.t('windowMenu.Empty', lang)}\n \n \n \n {\n const checked = e.target.checked;\n const undoableCheck = {\n name: 'Interior Window',\n timestamp: Date.now(),\n checked: checked,\n selectedElementId: window.id,\n selectedElementType: window.type,\n undo: () => {\n updateInteriorById(window.id, !undoableCheck.checked);\n },\n redo: () => {\n updateInteriorById(window.id, undoableCheck.checked);\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n updateInteriorById(window.id, checked);\n setCommonStore((state) => {\n state.actionState.windowInterior = checked;\n });\n }}\n >\n {i18n.t('windowMenu.Interior', lang)}\n \n \n {renderMenuItem(WindowDataType.WindowType)}\n {renderMenuItem(WindowDataType.Width)}\n {renderMenuItem(WindowDataType.Height)}\n {renderMenuItem(WindowDataType.Setback)}\n {renderMenuItem(WindowDataType.Opacity)}\n {renderMenuItem(WindowDataType.Tint)}\n {/* u-value has its special UI */}\n {uValueDialogVisible && }\n {\n setApplyCount(0);\n setUValueDialogVisible(true);\n }}\n >\n {i18n.t('word.UValue', lang)} ...\n \n {renderMullionSubMenu()}\n {renderFrameSubMenu()}\n {renderShutterSubMenu()}\n {renderDialogs()}\n \n )}\n \n );\n});\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport DoorTextureDefaultIcon from 'src/resources/door_edge.png';\r\nimport DoorTexture01Icon from 'src/resources/door_01.png';\r\nimport DoorTexture02Icon from 'src/resources/door_02.png';\r\nimport DoorTexture03Icon from 'src/resources/door_03.png';\r\nimport DoorTexture04Icon from 'src/resources/door_04.png';\r\nimport DoorTexture05Icon from 'src/resources/door_05.png';\r\nimport DoorTexture06Icon from 'src/resources/door_06.png';\r\nimport DoorTexture07Icon from 'src/resources/door_07.png';\r\nimport DoorTexture08Icon from 'src/resources/door_08.png';\r\nimport DoorTexture09Icon from 'src/resources/door_09.png';\r\nimport DoorTexture10Icon from 'src/resources/door_10.png';\r\nimport DoorTexture11Icon from 'src/resources/door_11.png';\r\nimport DoorTexture12Icon from 'src/resources/door_12.png';\r\nimport DoorTexture13Icon from 'src/resources/door_13.png';\r\nimport DoorTexture14Icon from 'src/resources/door_14.png';\r\nimport DoorTexture15Icon from 'src/resources/door_15.png';\r\nimport DoorTexture16Icon from 'src/resources/door_16.png';\r\nimport DoorTexture17Icon from 'src/resources/door_17.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, DoorTexture } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from 'src/models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(door?.textureType ?? DoorTexture.Default);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateTextureById = (id: string, textureType: DoorTexture) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as DoorModel).textureType = textureType;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTextureInMap = (map: Map, textureType: DoorTexture) => {\r\n for (const id of map.keys()) {\r\n updateTextureById(id, textureType);\r\n }\r\n };\r\n\r\n const undoTextureInMap = (map: Map) => {\r\n for (const [id, texture] of map.entries()) {\r\n updateTextureById(id, texture);\r\n }\r\n };\r\n\r\n const needChange = (value: DoorTexture) => {\r\n if (!door) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n value !== (e as DoorModel).textureType &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && value !== (e as DoorModel).textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.foundationId === door.foundationId &&\r\n value !== (e as DoorModel).textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.parentId === door.parentId &&\r\n value !== (e as DoorModel).textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== door?.textureType) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setTexture = (value: DoorTexture) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTexturesSelected.set(elem.id, (elem as DoorModel).textureType ?? DoorTexture.Default);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as DoorTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateTextureInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked) {\r\n oldTexturesAll.set(elem.id, (elem as DoorModel).textureType ?? DoorTexture.Default);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeAll.oldValues as Map,\r\n undoableChangeAll.newValue as DoorTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateTextureInMap(oldTexturesAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.foundationId === door.foundationId && !elem.locked) {\r\n oldTexturesAboveFoundation.set(elem.id, (elem as DoorModel).textureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Texture for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateTextureInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as DoorTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateTextureInMap(oldTexturesAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldTexturesOnSameWall = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.parentId === door.parentId && !elem.locked) {\r\n oldTexturesOnSameWall.set(elem.id, (elem as DoorModel).textureType);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Texture for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesOnSameWall,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSameWall.groupId) {\r\n updateTextureInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as DoorTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateTextureInMap(oldTexturesOnSameWall, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldTexture = updatedDoor ? updatedDoor.textureType : door.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Door',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateTextureById(undoableChange.changedElementId, undoableChange.oldValue as DoorTexture);\r\n },\r\n redo: () => {\r\n updateTextureById(undoableChange.changedElementId, undoableChange.newValue as DoorTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateTextureById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorTexture = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DoorTextureSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { DoorModel } from 'src/models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst DoorColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(door?.color ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateColorById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n e.color = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const undoColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (color: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n color !== e.color &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && color !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door?.foundationId && color !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door?.parentId && color !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== door?.color) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateColor = (value: string) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, elem.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked) {\r\n oldColorsAll.set(elem.id, elem.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.foundationId === door.foundationId && !door.locked) {\r\n oldColorsAboveFoundation.set(elem.id, elem.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Color for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldColorsOnSameWall = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.parentId === door.parentId && !door.locked) {\r\n oldColorsOnSameWall.set(elem.id, elem.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Color for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsOnSameWall,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSameWall.groupId) {\r\n updateColorInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateColorInMap(oldColorsOnSameWall, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldColor = (updatedDoor ? updatedDoor.color : door.color) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Color of Selected Door',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateColorById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DoorColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_DOOR_U_VALUE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorUValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(door?.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toUValueInUS(inputValue));\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as DoorModel).uValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!door) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n value !== (e as DoorModel).uValue &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && value !== (e as DoorModel).uValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.foundationId === door.foundationId &&\r\n value !== (e as DoorModel).uValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.parentId === door.parentId &&\r\n value !== (e as DoorModel).uValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== door?.uValue) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesSelected.set(e.id, door.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n door.uValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set U-Value for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAll.set(e.id, door.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n door.uValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set U-Value for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAboveFoundation.set(e.id, door.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n door.uValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set U-Value for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValues.set(e.id, door.uValue ?? DEFAULT_DOOR_U_VALUE);\r\n door.uValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set U-Value for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldValue = updatedDoor.uValue ?? door.uValue ?? DEFAULT_DOOR_U_VALUE;\r\n const undoableChange = {\r\n name: 'Set Door U-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorUValue = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toUValueInUS(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: W/(m²·℃)\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toUValueInSI(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toUValueInUS(0.01).toFixed(3)}, {Util.toUValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: Btu/(h·ft²·℉)\r\n
\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default DoorUValueInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n const getParent = useStore(Selector.getParent);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const currentValue = useMemo(() => {\r\n const v = door ? door.lx : 1;\r\n const parent = door ? getParent(door) : null;\r\n if (parent) return v * parent.lx;\r\n return v;\r\n }, [door?.lx]);\r\n\r\n const [inputValue, setInputValue] = useState(currentValue);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n const d = e as DoorModel;\r\n const parent = getParent(d);\r\n d.lx = parent ? value / parent.lx : value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!door) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lx * parent.lx) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lx * parent.lx) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lx * parent.lx) return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lx * parent.lx) return true;\r\n }\r\n }\r\n break;\r\n default:\r\n const parent = getParent(door);\r\n if (parent && value !== door.lx * parent.lx) return true;\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesSelected.set(e.id, d.lx * (parent ? parent.lx : 1));\r\n d.lx = parent ? value / parent.lx : value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Width for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesAll.set(e.id, d.lx * (parent ? parent.lx : 1));\r\n d.lx = parent ? value / parent.lx : value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Width for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesAboveFoundation.set(e.id, d.lx * (parent ? parent.lx : 1));\r\n d.lx = parent ? value / parent.lx : value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Width for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValues.set(e.id, d.lx * (parent ? parent.lx : 1));\r\n d.lx = parent ? value / parent.lx : value;\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Width for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const parent = door ? getParent(updatedDoor) : null;\r\n const oldValue = (updatedDoor.lx ?? door.lx ?? 0.1) * (parent ? parent.lx : 1);\r\n const undoableChange = {\r\n name: 'Set Door Width',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n const parent = door ? getParent(door) : null;\r\n const max = parent && door ? 2 * parent.lx * Math.min(Math.abs(0.5 - door.cx), Math.abs(-0.5 - door.cx)) : 100;\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputValue(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, {max.toFixed(1)}]{i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DoorWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorHeightInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n const getParent = useStore(Selector.getParent);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const currentValue = useMemo(() => {\r\n const v = door ? door.lz : 1;\r\n const parent = door ? getParent(door) : null;\r\n if (parent) return v * parent.lz;\r\n return v;\r\n }, [door?.lz]);\r\n\r\n const [inputValue, setInputValue] = useState(currentValue);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n const d = e as DoorModel;\r\n const parent = getParent(d);\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!door) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lz * parent.lz) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lz * parent.lz) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lz * parent.lz) return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const parent = getParent(e);\r\n if (parent && value !== e.lz * parent.lz) return true;\r\n }\r\n }\r\n break;\r\n default:\r\n const parent = getParent(door);\r\n if (parent && value !== door.lz * parent.lz) return true;\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesSelected.set(e.id, d.lz * (parent ? parent.lz : 1));\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Height for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesAll.set(e.id, d.lz * (parent ? parent.lz : 1));\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Height for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValuesAboveFoundation.set(e.id, d.lz * (parent ? parent.lz : 1));\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Height for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const d = e as DoorModel;\r\n const parent = d ? getParent(d) : null;\r\n oldValues.set(e.id, d.lz * (parent ? parent.lz : 1));\r\n d.lz = parent ? value / parent.lz : value;\r\n if (parent) d.cz = -(parent.lz - value) / (2 * parent.lz);\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Height for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const parent = door ? getParent(updatedDoor) : null;\r\n const oldValue = (updatedDoor.lz ?? door.lz ?? 0.2) * (parent ? parent.lz : 1);\r\n const undoableChange = {\r\n name: 'Set Door Height',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setInputValue(currentValue);\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n const parent = door ? getParent(door) : null;\r\n const max = parent?.lz ?? 20;\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={setInputValue}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, {max.toFixed(1)}]{i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DoorHeightInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorHeatCapacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(door?.volumetricHeatCapacity ?? 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as DoorModel).volumetricHeatCapacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n value !== (e as DoorModel).volumetricHeatCapacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && value !== (e as DoorModel).volumetricHeatCapacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.foundationId === door?.foundationId &&\r\n value !== (e as DoorModel).volumetricHeatCapacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.parentId === door?.parentId &&\r\n value !== (e as DoorModel).volumetricHeatCapacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== door?.volumetricHeatCapacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const door = e as DoorModel;\r\n oldValuesSelected.set(e.id, door.volumetricHeatCapacity ?? 0.5);\r\n door.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Volumetric Heat Capacity for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAll.set(e.id, door.volumetricHeatCapacity ?? 0.5);\r\n door.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Volumetric Heat Capacity for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAboveFoundation.set(e.id, door.volumetricHeatCapacity ?? 0.5);\r\n door.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Volumetric Heat Capacity for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValues.set(e.id, door.volumetricHeatCapacity ?? 0.5);\r\n door.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Volumetric Heat Capacity for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldValue = updatedDoor.volumetricHeatCapacity ?? door.volumetricHeatCapacity ?? 0.5;\r\n const undoableChange = {\r\n name: 'Set Volumetric Heat Capacity of Door',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorVolumetricHeatCapacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={setInputValue}\r\n />\r\n
\r\n kWh/(m³·℃)\r\n
\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DoorHeatCapacityInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { DoorModel } from '../../../models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorOpacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(door?.opacity ?? 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as DoorModel).opacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!door) return;\r\n\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n value !== (e as DoorModel).opacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && value !== (e as DoorModel).opacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.foundationId === door.foundationId &&\r\n value !== (e as DoorModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Door &&\r\n e.parentId === door.parentId &&\r\n value !== (e as DoorModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== door?.opacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const door = e as DoorModel;\r\n oldValuesSelected.set(e.id, door.opacity ?? 1);\r\n door.opacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Opacity for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAll.set(e.id, door.opacity ?? 1);\r\n door.opacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Opacity for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door.foundationId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValuesAboveFoundation.set(e.id, door.opacity ?? 1);\r\n door.opacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Opacity for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldValues = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door.parentId && !e.locked) {\r\n const door = e as DoorModel;\r\n oldValues.set(e.id, door.opacity ?? 1);\r\n door.opacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Opacity for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldValue = updatedDoor.opacity ?? door.opacity ?? 1;\r\n const undoableChange = {\r\n name: 'Set Opacity of Door',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorOpacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputValue(value)}\r\n />\r\n
\r\n kWh/(m³·℃)\r\n
\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DoorOpacityInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { DoorModel } from 'src/models/DoorModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst DoorFrameColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.doorActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(door?.frameColor ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateColorById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Door) {\r\n (e as DoorModel).frameColor = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const undoColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (color: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if (color !== (e as DoorModel).frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && !e.locked) {\r\n if (color !== (e as DoorModel).frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.foundationId === door?.foundationId && !e.locked) {\r\n if (color !== (e as DoorModel).frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Door && e.parentId === door?.parentId && !e.locked) {\r\n if (color !== (e as DoorModel).frameColor) {\r\n return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (color !== door?.frameColor) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!door) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, (elem as DoorModel).frameColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && !elem.locked) {\r\n oldColorsAll.set(elem.id, (elem as DoorModel).frameColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Doors',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (door.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.foundationId === door.foundationId && !door.locked) {\r\n oldColorsAboveFoundation.set(elem.id, (elem as DoorModel).frameColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Color for All Doors Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: door.foundationId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (door.parentId) {\r\n const oldColorsOnSameWall = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Door && elem.parentId === door.parentId && !door.locked) {\r\n oldColorsOnSameWall.set(elem.id, (elem as DoorModel).frameColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set Color for All Doors On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsOnSameWall,\r\n newValue: value,\r\n groupId: door.parentId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeOnSameWall.groupId) {\r\n updateColorInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateColorInMap(oldColorsOnSameWall, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (door) {\r\n const updatedDoor = getElementById(door.id) as DoorModel;\r\n const oldColor = (updatedDoor ? updatedDoor.frameColor : door.frameColor) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Color of Selected Door',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateColorById(door.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.doorColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setDoorActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('doorMenu.OnlyThisDoor', lang)}\r\n {i18n.t('doorMenu.AllDoorsOnWall', lang)}\r\n \r\n {i18n.t('doorMenu.AllDoorsAboveFoundation', lang)}\r\n \r\n {i18n.t('doorMenu.AllSelectedDoors', lang)}\r\n {i18n.t('doorMenu.AllDoors', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DoorFrameColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Menu, Radio } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { Copy, Cut, Lock } from '../menuItems';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { DoorModel, DoorType } from 'src/models/DoorModel';\r\nimport DoorTextureSelection from './doorTextureSelection';\r\nimport DoorColorSelection from './doorColorSelection';\r\nimport { DoorTexture, ObjectType, Scope } from 'src/types';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport { radioStyle } from './wallMenu';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableCheck } from 'src/undo/UndoableCheck';\r\nimport DoorUValueInput from './doorUValueInput';\r\nimport DoorWidthInput from './doorWidthInput';\r\nimport DoorHeightInput from './doorHeightInput';\r\nimport DoorHeatCapacityInput from './doorHeatCapacityInput';\r\nimport DoorOpacityInput from './doorOpacityInput';\r\nimport DoorFrameColorSelection from './doorFrameColorSelection';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const DoorMenu = React.memo(() => {\r\n const door = useSelectedElement(ObjectType.Door) as DoorModel | undefined;\r\n const language = useStore(Selector.language);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [colorDialogVisible, setColorDialogVisible] = useState(false);\r\n const [frameColorDialogVisible, setFrameColorDialogVisible] = useState(false);\r\n const [widthDialogVisible, setWidthDialogVisible] = useState(false);\r\n const [heightDialogVisible, setHeightDialogVisible] = useState(false);\r\n const [uValueDialogVisible, setUValueDialogVisible] = useState(false);\r\n const [opacityDialogVisible, setOpacityDialogVisible] = useState(false);\r\n const [heatCapacityDialogVisible, setHeatCapacityDialogVisible] = useState(false);\r\n\r\n if (!door) return null;\r\n\r\n const lang = { lng: language };\r\n const paddingLeft = '36px';\r\n\r\n const updateDoorTypeById = (id: string, type: DoorType) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n (e as DoorModel).doorType = type;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateDoorFilledById = (id: string, checked: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n (e as DoorModel).filled = checked;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInteriorById = (id: string, interior: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && e.type === ObjectType.Door) {\r\n (e as DoorModel).interior = interior;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const renderTypeSubMenu = () => {\r\n if (!door) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\r\n const undoableChange = {\r\n name: 'Select Door Type',\r\n timestamp: Date.now(),\r\n oldValue: door.doorType,\r\n newValue: e.target.value,\r\n changedElementId: door.id,\r\n changedElementType: door.type,\r\n undo: () => {\r\n updateDoorTypeById(undoableChange.changedElementId, undoableChange.oldValue as DoorType);\r\n },\r\n redo: () => {\r\n updateDoorTypeById(undoableChange.changedElementId, undoableChange.newValue as DoorType);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateDoorTypeById(door.id, e.target.value);\r\n setCommonStore((state) => {\r\n state.actionState.doorType = e.target.value;\r\n });\r\n }}\r\n >\r\n \r\n {i18n.t('doorMenu.Default', lang)}\r\n \r\n \r\n {i18n.t('doorMenu.Arched', lang)}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {!door.locked && }\r\n \r\n\r\n {!door.locked && (\r\n <>\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Filled Door',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: door.id,\r\n selectedElementType: door.type,\r\n undo: () => {\r\n updateDoorFilledById(door.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateDoorFilledById(door.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateDoorFilledById(door.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.doorFilled = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('doorMenu.Filled', lang)}\r\n \r\n \r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Interior Door',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: door.id,\r\n selectedElementType: door.type,\r\n undo: () => {\r\n updateInteriorById(door.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateInteriorById(door.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateInteriorById(door.id, checked);\r\n setCommonStore((state) => {\r\n state.actionState.doorInterior = checked;\r\n });\r\n }}\r\n >\r\n {i18n.t('doorMenu.Interior', lang)}\r\n \r\n \r\n {renderTypeSubMenu()}\r\n {widthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Width', lang)} ...\r\n \r\n {heightDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setHeightDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Height', lang)} ...\r\n \r\n {door.filled && (\r\n <>\r\n {uValueDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setUValueDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.UValue', lang)} ...\r\n \r\n {heatCapacityDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setHeatCapacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.VolumetricHeatCapacity', lang)} ...\r\n \r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Texture', lang)} ...\r\n \r\n {\r\n setApplyCount(0);\r\n setColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Color', lang)} ...\r\n \r\n {\r\n setApplyCount(0);\r\n setFrameColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('doorMenu.FrameColor', lang)} ...\r\n \r\n {(door.textureType === DoorTexture.Default || door.textureType === DoorTexture.NoTexture) && (\r\n {\r\n setApplyCount(0);\r\n setOpacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('wallMenu.Opacity', lang)} ...\r\n \r\n )}\r\n \r\n )}\r\n \r\n )}\r\n\r\n {textureDialogVisible && }\r\n {colorDialogVisible && }\r\n {frameColorDialogVisible && }\r\n {opacityDialogVisible && }\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { WindowDataType } from './windowMenu';\r\n\r\nimport { useColorPicker } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\ninterface WindowColorSelectionProps {\r\n window: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n setDialogVisible: () => void;\r\n}\r\n\r\nconst WindowColorSelection = ({\r\n window: windowModel,\r\n dataType,\r\n attributeKey,\r\n setDialogVisible,\r\n}: WindowColorSelectionProps) => {\r\n const elements = useStore(Selector.elements);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const [selectedItem, onItemChange] = useColorPicker((windowModel[attributeKey] as string) ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateOnSameWall = (wallId: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.parentId === wallId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.foundationId === foundationId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && map.has(e.id)) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel)[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.foundationId === windowModel.foundationId &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.parentId === windowModel.parentId &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== windowModel[attributeKey]) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: string) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n oldValuesAll.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !windowModel.locked) {\r\n oldValuesAboveFoundation.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Windows Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(windowModel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValues = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n oldValues.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: `Set ${dataType} for All Windows On the Same Wall`,\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateOnSameWall(windowModel.parentId, undoableChangeOnSameWall.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateOnSameWall(windowModel.parentId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n const oldValue = windowModel[attributeKey] as string;\r\n const undoableChange = {\r\n name: `Set ${dataType} of Selected window`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n switch (dataType) {\r\n case WindowDataType.Tint:\r\n state.actionState.windowTint = value;\r\n break;\r\n case WindowDataType.MullionColor:\r\n state.actionState.windowMullionColor = value;\r\n break;\r\n case WindowDataType.Color:\r\n state.actionState.windowColor = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n if (windowModel[attributeKey] !== selectedItem) {\r\n updateValue(selectedItem);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { WindowDataType } from './windowMenu';\r\nimport Dialog from '../dialog';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\ninterface WindowNumberInputProps {\r\n windowModel: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n range: [min: number, max: number];\r\n step: number;\r\n setDialogVisible: () => void;\r\n unit?: string;\r\n note?: string;\r\n digit?: number;\r\n}\r\n\r\nconst WindowNumberInput = ({\r\n windowModel,\r\n dataType,\r\n attributeKey,\r\n range,\r\n step,\r\n unit,\r\n note,\r\n digit,\r\n setDialogVisible,\r\n}: WindowNumberInputProps) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n const getParent = useStore(Selector.getParent);\r\n\r\n const currentValue = useMemo(() => {\r\n const v = windowModel[attributeKey] as number;\r\n const parent = getParent(windowModel);\r\n if (parent) {\r\n // roof windows have absolute size\r\n if (windowModel.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') return v * parent.lx;\r\n if (attributeKey === 'lz') return v * parent.lz;\r\n }\r\n }\r\n if (attributeKey === 'sillWidth' && v === undefined) return 0.2;\r\n return v;\r\n }, [attributeKey, windowModel]);\r\n\r\n const [inputValue, setInputValue] = useState(currentValue);\r\n\r\n const lang = useLanguage();\r\n\r\n const setAttribute = (window: WindowModel, attributeKey: keyof WindowModel, value: number) => {\r\n const parent = getParent(window);\r\n if (parent && (attributeKey === 'lx' || attributeKey === 'lz')) {\r\n if (window.parentType === ObjectType.Roof) {\r\n // width and height are absolute when the parent is a roof\r\n (window[attributeKey] as number) = value;\r\n } else {\r\n // width and height are relative to the parent when it is not a roof\r\n (window[attributeKey] as number) = value / parent[attributeKey];\r\n }\r\n } else {\r\n (window[attributeKey] as number) = value;\r\n }\r\n };\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateOnSameWall = (wallId: string | undefined, value: number) => {\r\n if (!wallId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.parentId === wallId) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string | undefined, value: number) => {\r\n if (!foundationId) return;\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.foundationId === foundationId) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && map.has(e.id)) {\r\n setAttribute(e as WindowModel, attributeKey, value);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const w = e as WindowModel;\r\n const parent = getParent(w);\r\n if (parent && w.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== w[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== w[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n const w = e as WindowModel;\r\n const parent = getParent(w);\r\n if (parent && w.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== w[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== w[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !e.locked) {\r\n const w = e as WindowModel;\r\n const parent = getParent(w);\r\n if (parent && w.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== w[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== w[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n const w = e as WindowModel;\r\n const parent = getParent(w);\r\n if (parent && w.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== w[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== w[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== w[attributeKey]) return true;\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n const parent = getParent(windowModel);\r\n if (parent && windowModel.parentType !== ObjectType.Roof) {\r\n // on a wall\r\n if (attributeKey === 'lx') {\r\n if (value !== windowModel[attributeKey] * parent.lx) return true;\r\n } else if (attributeKey === 'lz') {\r\n if (value !== windowModel[attributeKey] * parent.lz) return true;\r\n } else {\r\n if (value !== windowModel[attributeKey]) return true;\r\n }\r\n } else {\r\n if (value !== windowModel[attributeKey]) return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const window = e as WindowModel;\r\n const parent = getParent(window);\r\n let oldValue = window[attributeKey] as number;\r\n if (parent && window.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n oldValuesSelected.set(e.id, oldValue);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n const window = e as WindowModel;\r\n const parent = getParent(window);\r\n let oldValue = window[attributeKey] as number;\r\n if (parent && window.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n oldValuesAll.set(e.id, oldValue);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !e.locked) {\r\n const window = e as WindowModel;\r\n const parent = getParent(window);\r\n let oldValue = window[attributeKey] as number;\r\n if (parent && window.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n oldValuesAboveFoundation.set(e.id, oldValue);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Windows Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateAboveFoundation(windowModel.foundationId, undoableChangeAboveFoundation.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(windowModel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValuesOnSameWall = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n const window = e as WindowModel;\r\n const parent = getParent(window);\r\n let oldValue = window[attributeKey] as number;\r\n if (parent && window.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n oldValuesOnSameWall.set(e.id, oldValue);\r\n }\r\n }\r\n const undoableChangeOnSameParent = {\r\n name: `Set ${dataType} for All Windows On the Same Parent`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesOnSameWall,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameParent.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateOnSameWall(windowModel.parentId, undoableChangeOnSameParent.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameParent);\r\n updateOnSameWall(windowModel.parentId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n let oldValue = windowModel[attributeKey] as number;\r\n const parent = getParent(windowModel);\r\n if (parent && windowModel.parentType !== ObjectType.Roof) {\r\n if (attributeKey === 'lx') {\r\n oldValue *= parent.lx;\r\n } else if (attributeKey === 'lz') {\r\n oldValue *= parent.lz;\r\n }\r\n }\r\n const undoableChange = {\r\n name: `Set Window ${dataType}`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n switch (dataType) {\r\n case WindowDataType.Width:\r\n state.actionState.windowWidth = value;\r\n break;\r\n case WindowDataType.Height:\r\n state.actionState.windowHeight = value;\r\n break;\r\n case WindowDataType.Opacity:\r\n state.actionState.windowOpacity = value;\r\n break;\r\n case WindowDataType.FrameWidth:\r\n state.actionState.windowFrameWidth = value;\r\n break;\r\n case WindowDataType.SillWidth:\r\n state.actionState.windowSillWidth = value;\r\n break;\r\n case WindowDataType.HorizontalMullionSpacing:\r\n state.actionState.windowHorizontalMullionSpacing = value;\r\n break;\r\n case WindowDataType.VerticalMullionSpacing:\r\n state.actionState.windowVerticalMullionSpacing = value;\r\n break;\r\n case WindowDataType.MullionWidth:\r\n state.actionState.windowMullionWidth = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={setInputValue}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{range[0].toFixed(range[0] === 0 ? 0 : digit ?? 0)},{' '}\r\n {range[1].toFixed(digit ?? 0)}] {unit}
\r\n
{note}\r\n
\r\n \r\n \r\n {unit}\r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WindowNumberInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_WINDOW_U_VALUE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport Dialog from '../dialog';\r\nimport { useLanguage } from 'src/views/hooks';\r\n\r\nconst WindowUValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const windowModel = useSelectedElement(ObjectType.Window) as WindowModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(windowModel?.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toUValueInUS(inputValue));\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as WindowModel).uValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!windowModel) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n value !== (e as WindowModel).uValue &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel).uValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.foundationId === windowModel.foundationId &&\r\n value !== (e as WindowModel).uValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.parentId === windowModel.parentId &&\r\n value !== (e as WindowModel).uValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== windowModel?.uValue) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: number) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const window = e as WindowModel;\r\n oldValuesSelected.set(e.id, window.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n updateById(window.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set U-Value for Selected Windows',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n const window = e as WindowModel;\r\n oldValuesAll.set(e.id, window.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n updateById(window.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set U-Value for All Windows',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !e.locked) {\r\n const window = e as WindowModel;\r\n oldValuesAboveFoundation.set(e.id, window.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n updateById(window.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set U-Value for All Windows Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValues = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n const window = e as WindowModel;\r\n oldValues.set(e.id, window.uValue ?? DEFAULT_WINDOW_U_VALUE);\r\n updateById(window.id, value);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: 'Set U-Value for All Windows On the Same Wall',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeOnSameWall.oldValues as Map,\r\n undoableChangeOnSameWall.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n const updatedWindow = getElementById(windowModel.id) as WindowModel;\r\n const oldValue = updatedWindow.uValue ?? windowModel.uValue ?? DEFAULT_WINDOW_U_VALUE;\r\n const undoableChange = {\r\n name: 'Set Window U-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.windowUValue = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n updateValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toUValueInUS(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: W/(m²·℃)\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toUValueInSI(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toUValueInUS(0.01).toFixed(3)}, {Util.toUValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: Btu/(h·ft²·℉)\r\n
\r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default WindowUValueInput;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\nimport { WindowDataType } from './windowMenu';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\ninterface WindowOptionSelectionProps {\r\n window: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n options: string[];\r\n optionsText: string[];\r\n setDialogVisible: () => void;\r\n}\r\n\r\nconst { Option } = Select;\r\n\r\nconst WindowOptionSelection = ({\r\n window: windowModel,\r\n dataType,\r\n attributeKey,\r\n options,\r\n optionsText,\r\n setDialogVisible,\r\n}: WindowOptionSelectionProps) => {\r\n const elements = useStore(Selector.elements);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const [selectedOption, setSelectedOption] = useState(windowModel[attributeKey] as string);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateOnSameWall = (wallId: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.parentId === wallId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.foundationId === foundationId) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, val: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && map.has(e.id)) {\r\n ((e as WindowModel)[attributeKey] as string) = val;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && value !== (e as WindowModel)[attributeKey] && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.foundationId === windowModel.foundationId &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Window &&\r\n e.parentId === windowModel.parentId &&\r\n value !== (e as WindowModel)[attributeKey] &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== windowModel[attributeKey]) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: string) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n oldValuesAll.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !windowModel.locked) {\r\n oldValuesAboveFoundation.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Windows Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(windowModel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValues = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n oldValues.set(e.id, (e as WindowModel)[attributeKey] as string);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: `Set ${dataType} for All Windows On the Same Wall`,\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateOnSameWall(windowModel.parentId, undoableChangeOnSameWall.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateOnSameWall(windowModel.parentId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n const oldValue = windowModel[attributeKey] as string;\r\n const undoableChange = {\r\n name: `Set ${dataType} of Selected window`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n switch (dataType) {\r\n case WindowDataType.Tint:\r\n state.actionState.windowTint = value;\r\n break;\r\n case WindowDataType.MullionColor:\r\n state.actionState.windowMullionColor = value;\r\n break;\r\n case WindowDataType.Color:\r\n state.actionState.windowColor = value;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n if (windowModel[attributeKey] !== selectedOption) {\r\n updateValue(selectedOption);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowOptionSelection;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space, Switch } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\ninterface WindowBooleanSelectionProps {\r\n window: WindowModel;\r\n dataType: string;\r\n attributeKey: keyof WindowModel;\r\n setDialogVisible: () => void;\r\n}\r\n\r\nconst WindowBooleanSelection = ({\r\n window: windowModel,\r\n dataType,\r\n attributeKey,\r\n setDialogVisible,\r\n}: WindowBooleanSelectionProps) => {\r\n const elements = useStore(Selector.elements);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.windowActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n\r\n const [selected, setSelected] = useState(windowModel[attributeKey] as boolean);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id && !e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateOnSameWall = (wallId: string, value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.parentId === wallId) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateAboveFoundation = (foundationId: string, value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && e.foundationId === foundationId) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateForAll = (value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateInMap = (map: Map, value: boolean) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (!e.locked && e.type === ObjectType.Window && map.has(e.id)) {\r\n ((e as WindowModel)[attributeKey] as boolean) = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, v] of map.entries()) {\r\n updateById(id, v);\r\n }\r\n };\r\n\r\n const needChange = (value: boolean) => {\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n if ((e as WindowModel)[attributeKey] !== value) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n if ((e as WindowModel)[attributeKey] !== value) return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !e.locked) {\r\n if ((e as WindowModel)[attributeKey] !== value) return true;\r\n }\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n if ((e as WindowModel)[attributeKey] !== value) return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (windowModel[attributeKey] !== value) return true;\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const updateValue = (value: boolean) => {\r\n if (!windowModel) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValuesSelected.set(e.id, (e as WindowModel)[attributeKey] as boolean);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: `Set ${dataType} for Selected Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as boolean,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateInMap(oldValuesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && !e.locked) {\r\n oldValuesAll.set(e.id, (e as WindowModel)[attributeKey] as boolean);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: `Set ${dataType} for All Windows`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateForAll(undoableChangeAll.newValue as boolean);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateForAll(value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (windowModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.foundationId === windowModel.foundationId && !windowModel.locked) {\r\n oldValuesAboveFoundation.set(e.id, (e as WindowModel)[attributeKey] as boolean);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: `Set ${dataType} for All Windows Above Foundation`,\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: windowModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateAboveFoundation(\r\n undoableChangeAboveFoundation.groupId,\r\n undoableChangeAboveFoundation.newValue as boolean,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateAboveFoundation(windowModel.foundationId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n case Scope.OnlyThisSide:\r\n if (windowModel.parentId) {\r\n const oldValues = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Window && e.parentId === windowModel.parentId && !e.locked) {\r\n oldValues.set(e.id, (e as WindowModel)[attributeKey] as boolean);\r\n }\r\n }\r\n const undoableChangeOnSameWall = {\r\n name: `Set ${dataType} for All Windows On the Same Wall`,\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: value,\r\n groupId: windowModel.parentId,\r\n undo: () => {\r\n undoInMap(undoableChangeOnSameWall.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateOnSameWall(windowModel.parentId, undoableChangeOnSameWall.newValue as boolean);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeOnSameWall);\r\n updateOnSameWall(windowModel.parentId, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (windowModel) {\r\n const oldValue = windowModel[attributeKey] as boolean;\r\n const undoableChange = {\r\n name: `Set ${dataType} of Selected window`,\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: windowModel.id,\r\n changedElementType: windowModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as boolean);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as boolean);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(windowModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible();\r\n };\r\n\r\n const apply = () => {\r\n if (windowModel[attributeKey] !== selected) {\r\n updateValue(selected);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelected(checked);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setWindowActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('windowMenu.OnlyThisWindow', lang)}\r\n {i18n.t('windowMenu.AllWindowsOnSurface', lang)}\r\n \r\n {i18n.t('windowMenu.AllWindowsAboveFoundation', lang)}\r\n \r\n {i18n.t('windowMenu.AllSelectedWindows', lang)}\r\n {i18n.t('windowMenu.AllWindows', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default WindowBooleanSelection;\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { Euler, Mesh, Raycaster, Vector2, Vector3 } from 'three';\r\nimport { ThreeEvent, useThree } from '@react-three/fiber';\r\nimport { Box, Circle, Cone, Plane, Sphere, Torus } from '@react-three/drei';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType, RotateHandleType } from 'src/types';\r\nimport { useRefStore } from 'src/stores/commonRef';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from '../../stores/selector';\r\nimport { GROUND_ID, HALF_PI, HIGHLIGHT_HANDLE_COLOR, RESIZE_HANDLE_COLOR, TWO_PI } from 'src/constants';\r\nimport { WallFill, WallModel } from 'src/models/WallModel';\r\nimport Wireframe from '../wireframe';\r\nimport { UndoableMoveFoundationGroup } from 'src/undo/UndoableMove';\r\nimport { UndoableResizeBuildingXY, UndoableResizeBuildingZ } from 'src/undo/UndoableResizeBuilding';\r\nimport { useHandleSize } from 'src/views/wall/hooks';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { isGroupable } from 'src/models/Groupable';\r\nimport { Util } from 'src/Util';\r\nimport { WindowModel } from 'src/models/WindowModel';\r\n\r\ninterface GroupMasterProps {\r\n groupedElementsIdSet: Set;\r\n childCuboidSet: Set;\r\n initalPosition: number[];\r\n initalDimension: number[];\r\n initalRotation: number;\r\n}\r\n\r\ninterface HandleProps {\r\n args: number[]; // [cx, cy, cz, handleSize];\r\n handleType: MoveHandleType | ResizeHandleType | RotateHandleType;\r\n}\r\n\r\nenum Operation {\r\n Move = 'Move',\r\n ResizeXY = 'Resize XY',\r\n ResizeZ = 'Resize Z',\r\n RotateUpper = 'Rotate Upper',\r\n RotateLower = 'Rotate Lower',\r\n Null = 'Null',\r\n}\r\n\r\nexport type PartialWallHeight = {\r\n upperLeft: number;\r\n upperRight: number;\r\n lowerLeft: number;\r\n lowerRight: number;\r\n};\r\n\r\nconst zeroVector2 = new Vector2();\r\n\r\nconst ResizeHandle = ({ args, handleType }: HandleProps) => {\r\n const [cx, cy, cz, handleSize] = args;\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n return (\r\n setColor(HIGHLIGHT_HANDLE_COLOR)}\r\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst MoveHandle = ({ args, handleType }: HandleProps) => {\r\n const [cx, cy, cz, handleSize] = args;\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n return (\r\n setColor(HIGHLIGHT_HANDLE_COLOR)}\r\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nconst RotateHandle = ({ args, handleType }: HandleProps) => {\r\n const [cx, cy, cz, handleSize] = args;\r\n const [color, setColor] = useState(RESIZE_HANDLE_COLOR);\r\n const mesh = useMemo(() => , [color]);\r\n return (\r\n setColor(HIGHLIGHT_HANDLE_COLOR)}\r\n onPointerOut={() => setColor(RESIZE_HANDLE_COLOR)}\r\n scale={handleSize * 4}\r\n >\r\n \r\n \r\n {mesh}\r\n \r\n \r\n {mesh}\r\n \r\n \r\n {mesh}\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nconst GroupMaster = ({\r\n groupedElementsIdSet,\r\n childCuboidSet,\r\n initalPosition,\r\n initalDimension,\r\n initalRotation,\r\n}: GroupMasterProps) => {\r\n const [cx, cy, cz] = initalPosition;\r\n const [lx, ly, lz] = initalDimension;\r\n const aspectRatio = lx === 0 ? 1 : ly / lx;\r\n const lockAspectRatio = groupedElementsIdSet.size > 1 || childCuboidSet.size > 0;\r\n\r\n const intersectionPlaneRef = useRef(null);\r\n const intersectionPlanePositionRef = useRef(new Vector3());\r\n const intersectionPlaneRotationRef = useRef(new Euler());\r\n const resizeAnchorRef = useRef(new Vector2());\r\n const elementHeightMapRef = useRef>(new Map());\r\n const wallRelPointsMapRef = useRef>(new Map());\r\n const partialWallHeightMapRef = useRef>(new Map());\r\n const skylightRelPosMapRef = useRef>(new Map());\r\n const baseRelPosMapRef = useRef>(new Map());\r\n const baseRotationMapRef = useRef>(new Map());\r\n const basePosRatioMapRef = useRef>(new Map()); // 2d\r\n const baseDmsRatioMapRef = useRef>(new Map()); // 2d\r\n const resizerCenterRelPosRef = useRef(new Vector3());\r\n const pointerDownRef = useRef(false); // for performance reason\r\n\r\n // undo\r\n const foundatonOldDataMapRef = useRef>(new Map());\r\n const wallOldPointsMapRef = useRef>(new Map());\r\n const elementOldHeightMapRef = useRef>(new Map());\r\n const oldPartialWallHeightMapRef = useRef>(new Map());\r\n const oldSkyligthPosMapRef = useRef>(new Map());\r\n\r\n const [position, setPosition] = useState(new Vector3(cx, cy, cz));\r\n const [rotation, setRotation] = useState(initalRotation);\r\n const [hx, setHx] = useState(lx / 2);\r\n const [hy, setHy] = useState(ly / 2);\r\n const [height, setHeight] = useState(lz);\r\n const [showIntersectionPlane, setShowIntersectionPlane] = useState(false);\r\n const [operation, setOperation] = useState(Operation.Null);\r\n\r\n const { get: getThree } = useThree();\r\n const ray = useMemo(() => new Raycaster(), []);\r\n const mouse = useMemo(() => new Vector2(), []);\r\n\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n\r\n const getElementById = useStore(Selector.getElementById);\r\n const getCameraDirection = useStore(Selector.getCameraDirection);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n useEffect(() => {\r\n setHeight(lz);\r\n }, [lz]);\r\n\r\n useEffect(() => {\r\n setPosition(new Vector3(cx, cy, cz));\r\n setDimension(lx, ly);\r\n setRotation(initalRotation);\r\n }, [initalPosition, initalDimension, initalRotation]);\r\n\r\n const setRayCast = (e: PointerEvent) => {\r\n mouse.x = (e.offsetX / getThree().gl.domElement.clientWidth) * 2 - 1;\r\n mouse.y = -(e.offsetY / getThree().gl.domElement.clientHeight) * 2 + 1;\r\n ray.setFromCamera(mouse, getThree().camera);\r\n };\r\n\r\n const setDimension = (lx: number, ly: number) => {\r\n setHx(lx / 2);\r\n setHy(ly / 2);\r\n };\r\n\r\n const initPointerDown = (event: ThreeEvent) => {\r\n setShowIntersectionPlane(true);\r\n useRefStore.getState().setEnableOrbitController(false);\r\n pointerDownRef.current = true;\r\n intersectionPlanePositionRef.current.set(0, 0, 0);\r\n intersectionPlaneRotationRef.current.set(0, 0, 0);\r\n setCommonStoreHandleType(MoveHandleType.Default);\r\n event.stopPropagation();\r\n };\r\n\r\n const updateUndoableResizeXY = (\r\n foundationDataMap: Map,\r\n wallPointsMap: Map,\r\n skyligthPosMap: Map,\r\n ) => {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && foundationDataMap.has(elem.id)) {\r\n [elem.cx, elem.cy, elem.lx, elem.ly] = foundationDataMap.get(elem.id)!;\r\n } else if (foundationDataMap.has(elem.parentId)) {\r\n switch (elem.type) {\r\n case ObjectType.Wall: {\r\n const points = wallPointsMap.get(elem.id);\r\n if (!points) continue;\r\n const w = elem as WallModel;\r\n const leftPoint = points.slice(0, 3);\r\n const rightPoint = points.slice(3);\r\n w.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n w.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n w.lx = Math.hypot(leftPoint[0] - rightPoint[0] + (leftPoint[1] - rightPoint[1]));\r\n w.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\r\n w.leftPoint = [...leftPoint];\r\n w.rightPoint = [...rightPoint];\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = elem as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n const position = skyligthPosMap.get(elem.id);\r\n if (!position) continue;\r\n [window.cx, window.cy] = position;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const updateUndoableResizeZ = (\r\n heightMap: Map,\r\n partialWallHeightMap: Map,\r\n ) => {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (heightMap.has(elem.id)) {\r\n const height = heightMap.get(elem.id);\r\n if (height !== undefined) {\r\n if (elem.type === ObjectType.Roof) {\r\n (elem as RoofModel).rise = height;\r\n } else {\r\n elem.lz = height;\r\n }\r\n }\r\n }\r\n if (elem.type === ObjectType.Wall && partialWallHeightMap.has(elem.id)) {\r\n const w = elem as WallModel;\r\n const partialWallHeight = partialWallHeightMap.get(w.id);\r\n if (partialWallHeight) {\r\n w.leftTopPartialHeight = partialWallHeight.upperLeft;\r\n w.rightTopPartialHeight = partialWallHeight.upperRight;\r\n w.leftUnfilledHeight = partialWallHeight.lowerLeft;\r\n w.rightUnfilledHeight = partialWallHeight.lowerRight;\r\n }\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const updateFoundationGroupPosition = (map: Map) => {\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (map.has(elem.id)) {\r\n const pos = map.get(elem.id);\r\n if (pos) {\r\n elem.cx = pos[0];\r\n elem.cy = pos[1];\r\n elem.cz = pos[2];\r\n elem.rotation[2] = pos[3];\r\n }\r\n }\r\n }\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n };\r\n\r\n const addUndoableMove = () => {\r\n const map = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if ((isGroupable(elem) && groupedElementsIdSet.has(elem.id)) || groupedElementsIdSet.has(elem.parentId)) {\r\n map.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\r\n }\r\n }\r\n const name = operation === Operation.Move ? 'Move' : 'Rotate';\r\n const undoableMove = {\r\n name: `${name} Foundation Group`,\r\n timestamp: Date.now(),\r\n oldPositionMap: new Map(foundatonOldDataMapRef.current),\r\n newPositionMap: new Map(map),\r\n undo: () => {\r\n updateFoundationGroupPosition(undoableMove.oldPositionMap);\r\n },\r\n redo: () => {\r\n updateFoundationGroupPosition(undoableMove.newPositionMap);\r\n },\r\n } as UndoableMoveFoundationGroup;\r\n addUndoable(undoableMove);\r\n };\r\n\r\n const addUndoableResizeXY = () => {\r\n const foundationNewDataMap = new Map();\r\n const wallNewPointsMap = new Map();\r\n const newSkylightPosMap = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (isGroupable(elem) && foundatonOldDataMapRef.current.has(elem.id)) {\r\n foundationNewDataMap.set(elem.id, [elem.cx, elem.cy, elem.lx, elem.ly]);\r\n } else if (wallOldPointsMapRef.current.has(elem.id)) {\r\n const w = elem as WallModel;\r\n wallNewPointsMap.set(elem.id, [...w.leftPoint, ...w.rightPoint]);\r\n } else if (oldSkyligthPosMapRef.current.has(elem.id)) {\r\n const window = elem as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n newSkylightPosMap.set(window.id, [window.cx, window.cy]);\r\n }\r\n }\r\n const undoableReizeXY = {\r\n name: 'Resize Building XY',\r\n timestamp: Date.now(),\r\n oldFoundationDataMap: new Map(foundatonOldDataMapRef.current),\r\n newFoundationDataMap: new Map(foundationNewDataMap),\r\n oldWallPointsMap: new Map(wallOldPointsMapRef.current),\r\n newWallPointsMap: new Map(wallNewPointsMap),\r\n oldSkylightPosMap: new Map(oldSkyligthPosMapRef.current),\r\n newSkylightPosMap: new Map(newSkylightPosMap),\r\n undo: () => {\r\n updateUndoableResizeXY(\r\n undoableReizeXY.oldFoundationDataMap,\r\n undoableReizeXY.oldWallPointsMap,\r\n undoableReizeXY.oldSkylightPosMap,\r\n );\r\n },\r\n redo: () => {\r\n updateUndoableResizeXY(\r\n undoableReizeXY.newFoundationDataMap,\r\n undoableReizeXY.newWallPointsMap,\r\n undoableReizeXY.newSkylightPosMap,\r\n );\r\n },\r\n } as UndoableResizeBuildingXY;\r\n addUndoable(undoableReizeXY);\r\n };\r\n\r\n const addUndoableReseizeZ = () => {\r\n const newHeightMap = new Map();\r\n const newPartialWallHeightMap = new Map();\r\n\r\n for (const elem of useStore.getState().elements) {\r\n if (elementOldHeightMapRef.current.has(elem.id)) {\r\n if (elem.type === ObjectType.Roof) {\r\n newHeightMap.set(elem.id, (elem as RoofModel).rise);\r\n } else {\r\n newHeightMap.set(elem.id, elem.lz);\r\n }\r\n }\r\n if (elem.type === ObjectType.Wall && oldPartialWallHeightMapRef.current.has(elem.id)) {\r\n const w = elem as WallModel;\r\n newPartialWallHeightMap.set(w.id, {\r\n lowerLeft: w.leftUnfilledHeight,\r\n lowerRight: w.rightUnfilledHeight,\r\n upperLeft: w.leftTopPartialHeight,\r\n upperRight: w.rightTopPartialHeight,\r\n });\r\n }\r\n }\r\n const undoableResizeZ = {\r\n name: 'Resize Building Z',\r\n timestamp: Date.now(),\r\n oldElementHeightMap: new Map(elementOldHeightMapRef.current),\r\n newElementHeightMap: new Map(newHeightMap),\r\n oldPartialWallHeightMap: new Map(oldPartialWallHeightMapRef.current),\r\n newPartialWallHeightMap: new Map(newPartialWallHeightMap),\r\n undo: () => {\r\n updateUndoableResizeZ(undoableResizeZ.oldElementHeightMap, undoableResizeZ.oldPartialWallHeightMap);\r\n },\r\n redo: () => {\r\n updateUndoableResizeZ(undoableResizeZ.newElementHeightMap, undoableResizeZ.newPartialWallHeightMap);\r\n },\r\n } as UndoableResizeBuildingZ;\r\n addUndoable(undoableResizeZ);\r\n };\r\n\r\n const setCommonStoreHandleType = (handleType: MoveHandleType | null) => {\r\n setCommonStore((state) => {\r\n state.moveHandleType = handleType;\r\n });\r\n };\r\n\r\n const resizeXY = (p: Vector3) => {\r\n const pointer2D = new Vector2(p.x, p.y);\r\n const anchor = resizeAnchorRef.current.clone();\r\n\r\n if (lockAspectRatio) {\r\n const diagonalVector = new Vector2().subVectors(pointer2D, anchor);\r\n const diagonalDistance = Math.max(1, diagonalVector.length());\r\n\r\n const lx = Math.sqrt(Math.pow(diagonalDistance, 2) / (Math.pow(aspectRatio, 2) + 1));\r\n const ly = lx * aspectRatio;\r\n\r\n const center = new Vector2(lx * Math.sign(diagonalVector.x), ly * Math.sign(diagonalVector.y))\r\n .normalize()\r\n .multiplyScalar(diagonalDistance / 2)\r\n .add(anchor);\r\n\r\n setPosition(new Vector3(center.x, center.y));\r\n setDimension(lx, ly);\r\n\r\n setCommonStore((state) => {\r\n const tempWorldDataMap = new Map();\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && (groupedElementsIdSet.has(elem.id) || childCuboidSet.has(elem.id))) {\r\n const posRatio = basePosRatioMapRef.current.get(elem.id);\r\n const dmsRatio = baseDmsRatioMapRef.current.get(elem.id);\r\n if (posRatio && dmsRatio) {\r\n const newLx = dmsRatio[0] * lx;\r\n const newLy = dmsRatio[1] * ly;\r\n\r\n elem.lx = newLx;\r\n elem.ly = newLy;\r\n\r\n if (elem.parentId !== GROUND_ID) {\r\n const parentWorldData = tempWorldDataMap.get(elem.parentId);\r\n if (parentWorldData) {\r\n const { pos, rot } = parentWorldData;\r\n const worldCenter = new Vector3(posRatio[0] * lx + center.x, posRatio[1] * ly + center.y);\r\n const relativeCenter = worldCenter.clone().sub(pos).applyEuler(new Euler(0, 0, -rot));\r\n elem.cx = relativeCenter.x;\r\n elem.cy = relativeCenter.y;\r\n tempWorldDataMap.set(elem.id, { pos: worldCenter.clone(), rot: elem.rotation[2] + rot });\r\n }\r\n } else {\r\n const newCx = posRatio[0] * lx + center.x;\r\n const newCy = posRatio[1] * ly + center.y;\r\n elem.cx = newCx;\r\n elem.cy = newCy;\r\n tempWorldDataMap.set(elem.id, { pos: new Vector3(newCx, newCy), rot: elem.rotation[2] });\r\n }\r\n\r\n for (const e of state.elements) {\r\n if (e.foundationId === elem.id) {\r\n switch (e.type) {\r\n case ObjectType.Wall: {\r\n const wall = e as WallModel;\r\n const relativePosition = wallRelPointsMapRef.current.get(wall.id);\r\n if (!relativePosition) continue;\r\n const [leftRelPoint, rightRelPoint] = relativePosition;\r\n const leftPoint = [leftRelPoint.x * newLx, leftRelPoint.y * newLy, elem.lz];\r\n const rightPoint = [rightRelPoint.x * newLx, rightRelPoint.y * newLy, elem.lz];\r\n wall.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n wall.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n wall.lx = Math.hypot(leftPoint[0] - rightPoint[0] + (leftPoint[1] - rightPoint[1]));\r\n wall.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\r\n wall.leftPoint = [...leftPoint];\r\n wall.rightPoint = [...rightPoint];\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = e as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n const relativePosition = skylightRelPosMapRef.current.get(window.id);\r\n if (!relativePosition) continue;\r\n window.cx = relativePosition[0] * newLx;\r\n window.cy = relativePosition[1] * newLy;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n } else {\r\n const diagonal = anchor.distanceTo(pointer2D);\r\n const angle = Math.atan2(pointer2D.x - anchor.x, pointer2D.y - anchor.y) + rotation;\r\n const lx = Math.abs(diagonal * Math.sin(angle));\r\n const ly = Math.abs(diagonal * Math.cos(angle));\r\n const center = new Vector2().addVectors(pointer2D, anchor).multiplyScalar(0.5);\r\n setPosition(new Vector3(center.x, center.y));\r\n setDimension(lx, ly);\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n // foundationGroupSet only has one element here\r\n if (groupedElementsIdSet.has(elem.id)) {\r\n elem.lx = lx;\r\n elem.ly = ly;\r\n elem.cx = center.x;\r\n elem.cy = center.y;\r\n }\r\n // child elements\r\n else if (elem.foundationId && groupedElementsIdSet.has(elem.foundationId)) {\r\n switch (elem.type) {\r\n case ObjectType.Wall: {\r\n const wall = elem as WallModel;\r\n const relativePosition = wallRelPointsMapRef.current.get(wall.id);\r\n if (!relativePosition) continue;\r\n const [leftRelPoint, rightRelPoint] = relativePosition;\r\n const leftPoint = [leftRelPoint.x * lx, leftRelPoint.y * ly, 0];\r\n const rightPoint = [rightRelPoint.x * lx, rightRelPoint.y * ly, 0];\r\n wall.cx = (leftPoint[0] + rightPoint[0]) / 2;\r\n wall.cy = (leftPoint[1] + rightPoint[1]) / 2;\r\n wall.lx = Math.hypot(leftPoint[0] - rightPoint[0], leftPoint[1] - rightPoint[1]);\r\n wall.relativeAngle = Math.atan2(rightPoint[1] - leftPoint[1], rightPoint[0] - leftPoint[0]);\r\n wall.leftPoint = [...leftPoint];\r\n wall.rightPoint = [...rightPoint];\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = elem as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n const relativePosition = skylightRelPosMapRef.current.get(window.id);\r\n if (!relativePosition) continue;\r\n window.cx = relativePosition[0] * lx;\r\n window.cy = relativePosition[1] * ly;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n useStore.getState().updateElementOnRoofFn();\r\n };\r\n\r\n const resizeZ = (p: Vector3) => {\r\n if (p.z < 0.1) return;\r\n const height = p.z;\r\n setHeight(height);\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (elementHeightMapRef.current.has(elem.id)) {\r\n if (elem.type === ObjectType.Wall) {\r\n elem.lz = height * elementHeightMapRef.current.get(elem.id)!;\r\n const w = elem as WallModel;\r\n if (w.fill === WallFill.Partial) {\r\n const partialWallHeight = partialWallHeightMapRef.current.get(w.id);\r\n if (partialWallHeight) {\r\n w.leftTopPartialHeight = height * partialWallHeight.upperLeft;\r\n w.rightTopPartialHeight = height * partialWallHeight.upperRight;\r\n w.leftUnfilledHeight = height * partialWallHeight.lowerLeft;\r\n w.rightUnfilledHeight = height * partialWallHeight.lowerRight;\r\n }\r\n }\r\n } else if (elem.type === ObjectType.Roof) {\r\n (elem as RoofModel).rise = height * elementHeightMapRef.current.get(elem.id)!;\r\n } else if (elem.type === ObjectType.Cuboid) {\r\n const heightRatio = elementHeightMapRef.current.get(elem.id);\r\n if (heightRatio) {\r\n const newHeight = heightRatio * height;\r\n elem.lz = newHeight;\r\n elem.cz = newHeight / 2;\r\n }\r\n }\r\n }\r\n }\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const rotate = (p: Vector3) => {\r\n const resizerCenter = new Vector3(position.x, position.y);\r\n const r =\r\n Math.atan2(resizerCenter.x - p.x, p.y - resizerCenter.y) + (operation === Operation.RotateUpper ? 0 : Math.PI);\r\n const offset = Math.abs(r) > Math.PI ? -TWO_PI : 0;\r\n const rotateAngle = r + offset;\r\n const euler = new Euler(0, 0, rotateAngle);\r\n const groupSize = baseRotationMapRef.current.size;\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && groupedElementsIdSet.has(elem.id) && !childCuboidSet.has(elem.id)) {\r\n const oldCenter = baseRelPosMapRef.current.get(elem.id);\r\n const oldRotation = groupSize !== 1 ? baseRotationMapRef.current.get(elem.id) : 0;\r\n if (oldCenter && oldRotation !== undefined) {\r\n const newCenter = oldCenter.clone().applyEuler(euler);\r\n elem.cx = resizerCenter.x + newCenter.x;\r\n elem.cy = resizerCenter.y + newCenter.y;\r\n elem.rotation = [0, 0, oldRotation + rotateAngle];\r\n }\r\n }\r\n if (elem.type !== ObjectType.Cuboid && groupedElementsIdSet.has(elem.parentId)) {\r\n const oldRotation = groupSize !== 1 ? baseRotationMapRef.current.get(elem.parentId) : 0;\r\n if (oldRotation !== undefined) {\r\n elem.rotation = [0, 0, oldRotation + rotateAngle];\r\n }\r\n }\r\n }\r\n });\r\n setRotation(rotateAngle);\r\n };\r\n\r\n const pointerDownBottomResizeHandle = (x: number, y: number) => {\r\n const positionV2 = new Vector2(position.x, position.y);\r\n resizeAnchorRef.current.set(x, y).rotateAround(zeroVector2, rotation).add(positionV2);\r\n setOperation(Operation.ResizeXY);\r\n\r\n basePosRatioMapRef.current.clear();\r\n baseDmsRatioMapRef.current.clear();\r\n wallRelPointsMapRef.current.clear();\r\n foundatonOldDataMapRef.current.clear();\r\n wallOldPointsMapRef.current.clear();\r\n skylightRelPosMapRef.current.clear();\r\n oldSkyligthPosMapRef.current.clear();\r\n\r\n const [currLx, currLy] = [hx * 2, hy * 2];\r\n for (const elem of useStore.getState().elements) {\r\n // base elements\r\n if (isGroupable(elem) && (groupedElementsIdSet.has(elem.id) || childCuboidSet.has(elem.id))) {\r\n const { pos } = Util.getWorldDataById(elem.id);\r\n basePosRatioMapRef.current.set(elem.id, [(pos.x - position.x) / currLx, (pos.y - position.y) / currLy]);\r\n baseDmsRatioMapRef.current.set(elem.id, [elem.lx / currLx, elem.ly / currLy]);\r\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.lx, elem.ly]);\r\n }\r\n // child elements\r\n else if (elem.foundationId && groupedElementsIdSet.has(elem.foundationId)) {\r\n const foundation = getElementById(elem.foundationId);\r\n if (!foundation) continue;\r\n switch (elem.type) {\r\n case ObjectType.Wall: {\r\n const wall = elem as WallModel;\r\n const leftPointRelative = new Vector2(wall.leftPoint[0] / foundation.lx, wall.leftPoint[1] / foundation.ly);\r\n const rightPointRelative = new Vector2(\r\n wall.rightPoint[0] / foundation.lx,\r\n wall.rightPoint[1] / foundation.ly,\r\n );\r\n wallRelPointsMapRef.current.set(wall.id, [leftPointRelative, rightPointRelative]);\r\n wallOldPointsMapRef.current.set(wall.id, [...wall.leftPoint, ...wall.rightPoint]);\r\n break;\r\n }\r\n case ObjectType.Window: {\r\n const window = elem as WindowModel;\r\n if (window.parentType !== ObjectType.Roof) continue;\r\n skylightRelPosMapRef.current.set(window.id, [window.cx / foundation.lx, window.cy / foundation.ly]);\r\n oldSkyligthPosMapRef.current.set(window.id, [window.cx, window.cy]);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const pointerDonwTopResizeHandle = (x: number, y: number, z: number) => {\r\n const { x: cameraX, y: cameraY } = getCameraDirection();\r\n intersectionPlanePositionRef.current.set(x, y, z);\r\n intersectionPlaneRotationRef.current.set(-HALF_PI, 0, -Math.atan2(cameraX, cameraY) - rotation, 'ZXY');\r\n setOperation(Operation.ResizeZ);\r\n\r\n elementHeightMapRef.current.clear();\r\n elementOldHeightMapRef.current.clear();\r\n partialWallHeightMapRef.current.clear();\r\n oldPartialWallHeightMapRef.current.clear();\r\n\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.foundationId && groupedElementsIdSet.has(elem.foundationId)) {\r\n if (elem.type === ObjectType.Wall) {\r\n elementHeightMapRef.current.set(elem.id, elem.lz / height);\r\n elementOldHeightMapRef.current.set(elem.id, elem.lz);\r\n const w = elem as WallModel;\r\n if (w.fill === WallFill.Partial) {\r\n oldPartialWallHeightMapRef.current.set(w.id, {\r\n upperLeft: w.leftTopPartialHeight,\r\n upperRight: w.rightTopPartialHeight,\r\n lowerLeft: w.leftUnfilledHeight,\r\n lowerRight: w.rightUnfilledHeight,\r\n });\r\n partialWallHeightMapRef.current.set(w.id, {\r\n upperLeft: w.leftTopPartialHeight / height,\r\n upperRight: w.rightTopPartialHeight / height,\r\n lowerLeft: w.leftUnfilledHeight / height,\r\n lowerRight: w.rightUnfilledHeight / height,\r\n });\r\n }\r\n } else if (elem.type === ObjectType.Roof) {\r\n elementHeightMapRef.current.set(elem.id, (elem as RoofModel).rise / height);\r\n elementOldHeightMapRef.current.set(elem.id, (elem as RoofModel).rise);\r\n }\r\n } else if (groupedElementsIdSet.has(elem.id) || childCuboidSet.has(elem.id)) {\r\n elementHeightMapRef.current.set(elem.id, elem.lz / height);\r\n elementOldHeightMapRef.current.set(elem.id, elem.lz);\r\n }\r\n }\r\n };\r\n\r\n const handleResizeHandlesPointerDown = (event: ThreeEvent) => {\r\n initPointerDown(event);\r\n switch (event.object.name) {\r\n case ResizeHandleType.UpperLeft: {\r\n pointerDownBottomResizeHandle(hx, -hy);\r\n break;\r\n }\r\n case ResizeHandleType.UpperRight: {\r\n pointerDownBottomResizeHandle(-hx, -hy);\r\n break;\r\n }\r\n case ResizeHandleType.LowerLeft: {\r\n pointerDownBottomResizeHandle(hx, hy);\r\n break;\r\n }\r\n case ResizeHandleType.LowerRight: {\r\n pointerDownBottomResizeHandle(-hx, hy);\r\n break;\r\n }\r\n case ResizeHandleType.UpperLeftTop: {\r\n pointerDonwTopResizeHandle(-hx, hy, height);\r\n break;\r\n }\r\n case ResizeHandleType.UpperRightTop: {\r\n pointerDonwTopResizeHandle(hx, hy, height);\r\n break;\r\n }\r\n case ResizeHandleType.LowerLeftTop: {\r\n pointerDonwTopResizeHandle(-hx, -hy, height);\r\n break;\r\n }\r\n case ResizeHandleType.LowerRightTop: {\r\n pointerDonwTopResizeHandle(hx, -hy, height);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleMoveHanldesPointerDown = (event: ThreeEvent) => {\r\n initPointerDown(event);\r\n setOperation(Operation.Move);\r\n if (event.intersections.length > 0) {\r\n const p = event.intersections[0].point.clone().setZ(0);\r\n resizerCenterRelPosRef.current.subVectors(position, p);\r\n for (const elem of useStore.getState().elements) {\r\n if (isGroupable(elem) && groupedElementsIdSet.has(elem.id)) {\r\n const c = new Vector3(elem.cx, elem.cy);\r\n const v = new Vector3().subVectors(c, p);\r\n baseRelPosMapRef.current.set(elem.id, v);\r\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleRotateHandlesPointerDown = (event: ThreeEvent) => {\r\n initPointerDown(event);\r\n if (event.object.name === RotateHandleType.Lower) {\r\n setOperation(Operation.RotateLower);\r\n } else if (event.object.name === RotateHandleType.Upper) {\r\n setOperation(Operation.RotateUpper);\r\n }\r\n if (event.intersections.length > 0) {\r\n const resizerCenter = new Vector3(position.x, position.y);\r\n for (const elem of useStore.getState().elements) {\r\n if (isGroupable(elem) && groupedElementsIdSet.has(elem.id)) {\r\n const elemCenter = new Vector3(elem.cx, elem.cy);\r\n const v = new Vector3().subVectors(elemCenter, resizerCenter);\r\n baseRelPosMapRef.current.set(elem.id, v);\r\n baseRotationMapRef.current.set(elem.id, elem.rotation[2]);\r\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\r\n }\r\n if (groupedElementsIdSet.has(elem.parentId)) {\r\n foundatonOldDataMapRef.current.set(elem.id, [elem.cx, elem.cy, elem.cz, elem.rotation[2]]);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleIntersectionPlanePointerUp = (event: ThreeEvent) => {\r\n switch (operation) {\r\n case Operation.Move:\r\n case Operation.RotateLower:\r\n case Operation.RotateUpper:\r\n addUndoableMove();\r\n break;\r\n case Operation.ResizeXY:\r\n addUndoableResizeXY();\r\n break;\r\n case Operation.ResizeZ:\r\n addUndoableReseizeZ();\r\n break;\r\n }\r\n setShowIntersectionPlane(false);\r\n useRefStore.getState().setEnableOrbitController(true);\r\n pointerDownRef.current = false;\r\n setOperation(Operation.Null);\r\n setCommonStoreHandleType(null);\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const handleIntersectionPlanePointerMove = (event: ThreeEvent) => {\r\n if (!intersectionPlaneRef.current || !pointerDownRef.current) return;\r\n setRayCast(event);\r\n const intersects = ray.intersectObjects([intersectionPlaneRef.current]);\r\n if (intersects.length > 0) {\r\n const p = intersects[0].point;\r\n switch (operation) {\r\n case Operation.ResizeXY:\r\n resizeXY(p);\r\n break;\r\n case Operation.ResizeZ:\r\n resizeZ(p);\r\n break;\r\n case Operation.RotateLower:\r\n case Operation.RotateUpper:\r\n rotate(p);\r\n break;\r\n case Operation.Move:\r\n setPosition(new Vector3().addVectors(p.clone().setZ(0), resizerCenterRelPosRef.current));\r\n setCommonStore((state) => {\r\n for (const elem of state.elements) {\r\n if (isGroupable(elem) && groupedElementsIdSet.has(elem.id) && !childCuboidSet.has(elem.id)) {\r\n const v = baseRelPosMapRef.current.get(elem.id);\r\n if (v) {\r\n elem.cx = p.x + v.x;\r\n elem.cy = p.y + v.y;\r\n }\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleSize = useHandleSize();\r\n const bottomHanldeZ = handleSize / 2;\r\n const topHanldeZ = height + bottomHanldeZ - handleSize / 2;\r\n const moveHanldeX = hx + handleSize;\r\n const moveHnadleY = hy + handleSize;\r\n const resizeHandleY = hy + handleSize * 4;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {!orthographic && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {showIntersectionPlane && (\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(GroupMaster);\r\n","export default __webpack_public_path__ + \"static/media/roof_01_menu.1418beb1.png\";","export default __webpack_public_path__ + \"static/media/roof_02_menu.055d6e06.png\";","export default __webpack_public_path__ + \"static/media/roof_03_menu.1d45e089.png\";","export default __webpack_public_path__ + \"static/media/roof_04_menu.20dee2dd.png\";","export default __webpack_public_path__ + \"static/media/roof_05_menu.34757ec1.png\";","export default __webpack_public_path__ + \"static/media/roof_06_menu.0fce42da.png\";","export default __webpack_public_path__ + \"static/media/roof_07_menu.d0b809f8.png\";","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport RoofTextureDefaultIcon from 'src/resources/roof_edge_menu.png';\r\nimport RoofTexture01Icon from 'src/resources/roof_01_menu.png';\r\nimport RoofTexture02Icon from 'src/resources/roof_02_menu.png';\r\nimport RoofTexture03Icon from 'src/resources/roof_03_menu.png';\r\nimport RoofTexture04Icon from 'src/resources/roof_04_menu.png';\r\nimport RoofTexture05Icon from 'src/resources/roof_05_menu.png';\r\nimport RoofTexture06Icon from 'src/resources/roof_06_menu.png';\r\nimport RoofTexture07Icon from 'src/resources/roof_07_menu.png';\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Select, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope, RoofTexture } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofTextureSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const setCommonStore = useStore(Selector.set);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [selectedTexture, setSelectedTexture] = useState(roof?.textureType ?? RoofTexture.Default);\r\n\r\n const lang = useLanguage();\r\n const { Option } = Select;\r\n\r\n const updateTextureById = (id: string, textureType: RoofTexture) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as RoofModel).textureType = textureType;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateTextureInMap = (map: Map, textureType: RoofTexture) => {\r\n for (const id of map.keys()) {\r\n updateTextureById(id, textureType);\r\n }\r\n };\r\n\r\n const undoTextureInMap = (map: Map) => {\r\n for (const [id, texture] of map.entries()) {\r\n updateTextureById(id, texture);\r\n }\r\n };\r\n\r\n const needChange = (value: RoofTexture) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).textureType &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).textureType && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).textureType &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.textureType) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setTexture = (value: RoofTexture) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldTexturesSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldTexturesSelected.set(elem.id, (elem as RoofModel).textureType ?? RoofTexture.Default);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Texture for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as RoofTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateTextureInMap(oldTexturesSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldTexturesAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked) {\r\n oldTexturesAll.set(elem.id, (elem as RoofModel).textureType ?? RoofTexture.Default);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Texture for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateTextureInMap(\r\n undoableChangeAll.oldValues as Map,\r\n undoableChangeAll.newValue as RoofTexture,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateTextureInMap(oldTexturesAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldTexturesAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && elem.foundationId === roof.foundationId && !elem.locked) {\r\n oldTexturesAboveFoundation.set(elem.id, (elem as RoofModel).textureType);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Texture for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTexturesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoTextureInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateTextureInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as RoofTexture,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateTextureInMap(oldTexturesAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldTexture = updatedRoof ? updatedRoof.textureType : roof.textureType;\r\n const undoableChange = {\r\n name: 'Set Texture of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldTexture,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateTextureById(undoableChange.changedElementId, undoableChange.oldValue as RoofTexture);\r\n },\r\n redo: () => {\r\n updateTextureById(undoableChange.changedElementId, undoableChange.newValue as RoofTexture);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateTextureById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofTexture = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setTexture(selectedTexture);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default RoofTextureSelection;\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QwEFS02NbL0KgAAAIlJREFUaIHt2jEKwCAQBdHd4P2vbIo0IdgFlPnMu4AOaqN2Vc05Z6Xo7nr3XAfnsoWBdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSGUg3qp67xFQj6dJ3JX6LGvjX93zvPu+uIJ2BdAbSGUhnIJ2BdAbSGUhnIJ2BdAbSxQeOE+8SO8fsqB/pC/FbND7wBoPhDnmLfkfmAAAAAElFTkSuQmCC\"","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(roof?.color ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateColorById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n e.color = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const undoColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== e.color &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && value !== e.color && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.color) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldColorsSelected.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Color for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldColorsAll.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Color for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !roof.locked) {\r\n oldColorsAboveFoundation.set(e.id, e.color ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Color for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldColor = (updatedRoof ? updatedRoof.color : roof.color) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Color of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateColorById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default RoofColorSelection;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofThicknessInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [inputLength, setInputLength] = useState(roof?.thickness ?? 0.4);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).thickness = value;\r\n state.updateElementOnRoofFlag = true;\r\n }\r\n if (e.parentId === id && e.type === ObjectType.Window) {\r\n e.ly = value;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).thickness &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).thickness && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).thickness &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.thickness) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setThickness = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldThicknessSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const roof = e as RoofModel;\r\n oldThicknessSelected.set(e.id, roof.thickness);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Thickness for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldThicknessSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldThicknessAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldThicknessAll.set(e.id, roof.thickness);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Thickness for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldThicknessAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldThicknessAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && elem.foundationId === roof.foundationId && !elem.locked) {\r\n const roof = elem as RoofModel;\r\n oldThicknessAboveFoundation.set(elem.id, roof.thickness);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Thickness for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldThicknessAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldThickness = updatedRoof.thickness ?? roof.thickness ?? 0.4;\r\n const undoableChange = {\r\n name: 'Set Roof Thickness',\r\n timestamp: Date.now(),\r\n oldValue: oldThickness,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofThickness = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setThickness(inputLength);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputLength(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.05, 1] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofThicknessInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofRafterSpacingInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n const [input, setInput] = useState(roof?.rafterSpacing ?? 1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateRoofRafterSpacingById = (id: string, length: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).rafterSpacing = length;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateRoofRafterSpacingById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateRoofRafterSpacingById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rafterSpacing &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rafterSpacing && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rafterSpacing &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rafterSpacing) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setRafterSpacing = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldSpacingSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldSpacingSelected.set(e.id, (e as RoofModel).rafterSpacing ?? 1);\r\n updateRoofRafterSpacingById(e.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Rafter Spacing for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldSpacingSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldSpacingAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldSpacingAll.set(e.id, (e as RoofModel).rafterSpacing ?? 1);\r\n updateRoofRafterSpacingById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Rafter Spacing for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldSpacingAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldSpacingAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n oldSpacingAboveFoundation.set(e.id, (e as RoofModel).rafterSpacing ?? 1);\r\n updateRoofRafterSpacingById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Rafter Spacing for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldSpacingAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldSpacing = updatedRoof.rafterSpacing ?? roof.rafterSpacing ?? 1;\r\n const undoableChange = {\r\n name: 'Set Roof Rafter Spacing',\r\n timestamp: Date.now(),\r\n oldValue: oldSpacing,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateRoofRafterSpacingById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateRoofRafterSpacingById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateRoofRafterSpacingById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setRafterSpacing(input);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInput(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.1, 100] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofRafterSpacingInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofOpacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [input, setInput] = useState(roof?.opacity !== undefined ? roof.opacity : 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateOpacityById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).opacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateOpacityById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateOpacityById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).opacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).opacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).opacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.opacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesSelected.set(e.id, roof.opacity);\r\n updateOpacityById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Opacity for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAll.set(e.id, roof.opacity);\r\n updateOpacityById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Opacity for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAboveFoundation.set(e.id, roof.opacity);\r\n updateOpacityById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Opacity for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldOpacity =\r\n updatedRoof.opacity !== undefined ? updatedRoof.opacity : roof.opacity !== undefined ? roof.opacity : 0.5;\r\n const undoableChange = {\r\n name: 'Set Roof Opacity',\r\n timestamp: Date.now(),\r\n oldValue: oldOpacity,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateOpacityById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateOpacityById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateOpacityById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofGlassOpacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(input);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInput(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0, 1]\r\n
\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofOpacityInput;\r\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, Modal, Radio, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\n\r\nconst GlassTintSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const roof = useStore(Selector.selectedElement) as RoofModel;\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const roofActionScope = useStore(Selector.roofActionScope);\r\n const setRoofActionScope = useStore(Selector.setRoofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const [selectedTint, setSelectedTint] = useState(roof?.glassTint ?? '#73D8FF');\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n const okButtonRef = useRef(null);\r\n\r\n useEffect(() => {\r\n okButtonRef.current?.focus();\r\n });\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n if (roof) {\r\n setSelectedTint(roof?.glassTint ?? '#73D8FF');\r\n }\r\n }, [roof]);\r\n\r\n const updateTintById = (id: string, glassTint: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as RoofModel).glassTint = glassTint;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, tint: string) => {\r\n for (const id of map.keys()) {\r\n updateTintById(id, tint as string);\r\n }\r\n };\r\n\r\n const undoTintInMap = (map: Map) => {\r\n for (const [id, tint] of map.entries()) {\r\n updateTintById(id, tint as string);\r\n }\r\n };\r\n\r\n const setTint = (value: string) => {\r\n if (!roof) return;\r\n switch (roofActionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n const oldTintsAll = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked) {\r\n oldTintsAll.set(elem.id, (elem as RoofModel).glassTint ?? '#73D8FF');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Glass Tint for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldTintsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoTintInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldTintsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldTintsAboveFoundation = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.type === ObjectType.Roof && elem.foundationId === roof.foundationId && !roof.locked) {\r\n oldTintsAboveFoundation.set(elem.id, (elem as RoofModel).glassTint ?? '#73D8FF');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Glass Tint for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldTintsAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoTintInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldTintsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldTint = (updatedRoof ? updatedRoof.glassTint : roof.glassTint) ?? '#73D8FF';\r\n const undoableChange = {\r\n name: 'Set Glass Tint of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldTint,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateTintById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateTintById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateTintById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const close = () => {\r\n if (roof?.glassTint) {\r\n setSelectedTint(roof.glassTint);\r\n }\r\n setDialogVisible(false);\r\n };\r\n\r\n const handleCancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const handleOk = () => {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n if (updatedRoof && updatedRoof.glassTint !== selectedTint) {\r\n setTint(selectedTint);\r\n }\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n const handleApply = () => {\r\n setTint(selectedTint);\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('roofMenu.GlassTint', lang)}\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={close}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n {\r\n setSelectedTint(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n setRoofActionScope(e.target.value)} value={roofActionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default GlassTintSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [selectedColor, setSelectedColor] = useState(roof?.rafterColor ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateColorById = (id: string, color: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as RoofModel).rafterColor = color;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateColorInMap = (map: Map, color: string) => {\r\n for (const id of map.keys()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const undoColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rafterColor &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rafterColor && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rafterColor &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rafterColor) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setColor = (value: string) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked && useStore.getState().selectedElementIdSet.has(elem.id)) {\r\n oldColorsSelected.set(elem.id, (elem as RoofModel).rafterColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Rafter Color for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && !elem.locked) {\r\n oldColorsAll.set(elem.id, (elem as RoofModel).rafterColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Rafter Color for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateColorInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as string);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const elem of elements) {\r\n if (elem.type === ObjectType.Roof && elem.foundationId === roof.foundationId && !roof.locked) {\r\n oldColorsAboveFoundation.set(elem.id, (elem as RoofModel).rafterColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Rafter Color for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldColor = (updatedRoof ? updatedRoof.rafterColor : roof.rafterColor) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Rafter Color of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateColorById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setColor(selectedColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default RoofColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofRafterWidthInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [input, setInput] = useState(roof?.rafterWidth ?? 0.1);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, length: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).rafterWidth = length;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rafterWidth &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rafterWidth && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rafterWidth &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rafterWidth) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldValSelected.set(e.id, (e as RoofModel).rafterWidth ?? 0.1);\r\n updateById(e.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Rafter Width for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldValAll.set(e.id, (e as RoofModel).rafterWidth ?? 0.1);\r\n updateById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Rafter Width for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n oldValAboveFoundation.set(e.id, (e as RoofModel).rafterWidth ?? 0.1);\r\n updateById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Rafter Width for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldVal = updatedRoof.rafterWidth ?? roof.rafterWidth ?? 0.1;\r\n const undoableChange = {\r\n name: 'Set Roof Rafter Width',\r\n timestamp: Date.now(),\r\n oldValue: oldVal,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(input);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInput(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 1] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofRafterWidthInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { CompactPicker } from 'react-color';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofSideColorSelection = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const setCommonStore = useStore(Selector.set);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [selectedSideColor, setSelectedSideColor] = useState(roof?.sideColor ?? '#ffffff');\r\n\r\n const lang = useLanguage();\r\n\r\n const updateSideColorById = (id: string, sideColor: string) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n if (!e.locked) {\r\n (e as RoofModel).sideColor = sideColor;\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const updateSideColorInMap = (map: Map, sideColor: string) => {\r\n for (const id of map.keys()) {\r\n updateSideColorById(id, sideColor as string);\r\n }\r\n };\r\n\r\n const undoSideColorInMap = (map: Map) => {\r\n for (const [id, color] of map.entries()) {\r\n updateSideColorById(id, color as string);\r\n }\r\n };\r\n\r\n const needChange = (value: string) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).sideColor &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).sideColor && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).sideColor &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.sideColor) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setSideColor = (value: string) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldColorsSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n oldColorsSelected.set(e.id, (e as RoofModel).sideColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Side Color for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoSideColorInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateSideColorInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n updateSideColorInMap(oldColorsSelected, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldColorsAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldColorsAll.set(e.id, (e as RoofModel).sideColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Side Color for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAll,\r\n newValue: value,\r\n undo: () => {\r\n undoSideColorInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateSideColorInMap(\r\n undoableChangeAll.oldValues as Map,\r\n undoableChangeAll.newValue as string,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n updateSideColorInMap(oldColorsAll, value);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldColorsAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !roof.locked) {\r\n oldColorsAboveFoundation.set(e.id, (e as RoofModel).sideColor ?? '#ffffff');\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Side Color for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldColorsAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoSideColorInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n if (undoableChangeAboveFoundation.groupId) {\r\n updateSideColorInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as string,\r\n );\r\n }\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n updateSideColorInMap(oldColorsAboveFoundation, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldColor = (updatedRoof ? updatedRoof.sideColor : roof.sideColor) ?? '#ffffff';\r\n const undoableChange = {\r\n name: 'Set Side Color of Selected Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldColor,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateSideColorById(undoableChange.changedElementId, undoableChange.oldValue as string);\r\n },\r\n redo: () => {\r\n updateSideColorById(undoableChange.changedElementId, undoableChange.newValue as string);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateSideColorById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofSideColor = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setSideColor(selectedSideColor);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setSelectedSideColor(colorResult.hex);\r\n }}\r\n />\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default RoofSideColorSelection;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from '../../../models/RoofModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_ROOF_R_VALUE } from '../../../constants';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofRValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(roof?.rValue ?? DEFAULT_ROOF_R_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toRValueInUS(inputValue));\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).rValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rValue &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rValue && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rValue &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rValue) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const roof = e as RoofModel;\r\n oldValuesSelected.set(e.id, roof.rValue ?? DEFAULT_ROOF_R_VALUE);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set R-Value for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAll.set(e.id, roof.rValue ?? DEFAULT_ROOF_R_VALUE);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set R-Value for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAboveFoundation.set(e.id, roof.rValue ?? DEFAULT_ROOF_R_VALUE);\r\n updateById(roof.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set R-Value for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldValue = updatedRoof.rValue ?? roof.rValue ?? DEFAULT_ROOF_R_VALUE;\r\n const undoableChange = {\r\n name: 'Set Roof R-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofRValue = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toRValueInUS(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: m²·℃/W\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toRValueInSI(value));\r\n }}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toRValueInUS(0.01).toFixed(3)}, {Util.toRValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: h·ft²·℉/Btu\r\n
\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default RoofRValueInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, Row, InputNumber, Radio, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofRiseInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(roof?.rise ?? 0);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateRoofRiseById = (id: string, val: number) => {\r\n useStore.getState().updateRoofRiseById(id, val);\r\n useStore.getState().set((state) => {\r\n state.updateElementOnRoofFlag = true;\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateRoofRiseById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateRoofRiseById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).rise &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).rise && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).rise &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.rise) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setRise = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (useStore.getState().roofActionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldValuesSelected.set(e.id, (e as RoofModel).rise);\r\n updateRoofRiseById(e.id, value);\r\n }\r\n }\r\n const undoableChangeSelected = {\r\n name: 'Set Rise for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n oldValuesAll.set(e.id, (e as RoofModel).rise);\r\n updateRoofRiseById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAll = {\r\n name: 'Set Rise for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n oldValuesAboveFoundation.set(e.id, (e as RoofModel).rise);\r\n updateRoofRiseById(e.id, value);\r\n }\r\n }\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Rise for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldRise = updatedRoof?.rise ?? roof?.rise ?? 0;\r\n const undoableChange = {\r\n name: 'Set Roof Rise',\r\n timestamp: Date.now(),\r\n oldValue: oldRise,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateRoofRiseById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateRoofRiseById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateRoofRiseById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setRise(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputValue(value)}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0, 200] {i18n.t('word.MeterAbbreviation', lang)}\r\n
\r\n \r\n \r\n {i18n.t('word.MeterAbbreviation', lang)}\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofRiseInput;\r\n","/*\r\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Col, InputNumber, Radio, Row, Space } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from '../../../models/RoofModel';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nimport { useLanguage } from 'src/views/hooks';\r\nimport Dialog from '../dialog';\r\n\r\nconst RoofHeatCapacityInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const elements = useStore(Selector.elements);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.wallActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [inputValue, setInputValue] = useState(roof?.volumetricHeatCapacity ?? 0.5);\r\n\r\n const lang = useLanguage();\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).volumetricHeatCapacity = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const needChange = (value: number) => {\r\n if (!roof) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n value !== (e as RoofModel).volumetricHeatCapacity &&\r\n !e.locked &&\r\n useStore.getState().selectedElementIdSet.has(e.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisType:\r\n for (const e of elements) {\r\n if (e.type === ObjectType.Roof && value !== (e as RoofModel).volumetricHeatCapacity && !e.locked) {\r\n return true;\r\n }\r\n }\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n for (const e of elements) {\r\n if (\r\n e.type === ObjectType.Roof &&\r\n e.foundationId === roof.foundationId &&\r\n value !== (e as RoofModel).volumetricHeatCapacity &&\r\n !e.locked\r\n ) {\r\n return true;\r\n }\r\n }\r\n break;\r\n default:\r\n if (value !== roof?.volumetricHeatCapacity) {\r\n return true;\r\n }\r\n break;\r\n }\r\n return false;\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roof) return;\r\n if (!needChange(value)) return;\r\n switch (actionScope) {\r\n case Scope.AllSelectedObjectsOfThisType: {\r\n const oldValuesSelected = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && !e.locked && useStore.getState().selectedElementIdSet.has(e.id)) {\r\n const roof = e as RoofModel;\r\n oldValuesSelected.set(e.id, roof.volumetricHeatCapacity ?? 0.5);\r\n roof.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeSelected = {\r\n name: 'Set Volumetric Heat Capacity for Selected Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesSelected,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeSelected.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeSelected.oldValues as Map,\r\n undoableChangeSelected.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeSelected);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisType: {\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAll.set(e.id, roof.volumetricHeatCapacity ?? 0.5);\r\n roof.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set Volumetric Heat Capacity for All Roofs',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n }\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roof.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roof.foundationId && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAboveFoundation.set(e.id, roof.volumetricHeatCapacity ?? 0.5);\r\n roof.volumetricHeatCapacity = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set Volumetric Heat Capacity for All Roofs Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roof.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roof) {\r\n const updatedRoof = getElementById(roof.id) as RoofModel;\r\n const oldValue = updatedRoof.volumetricHeatCapacity ?? roof.volumetricHeatCapacity ?? 0.5;\r\n const undoableChange = {\r\n name: 'Set Volumetric Heat Capacity of Roof',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roof.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofVolumetricHeatCapacity = value;\r\n });\r\n };\r\n\r\n const close = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const apply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => setInputValue(value)}\r\n />\r\n
\r\n kWh/(m³·℃)\r\n
\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n \r\n \r\n useStore.getState().setRoofActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisRoof', lang)}\r\n \r\n {i18n.t('roofMenu.AllRoofsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllSelectedRoofs', lang)}\r\n {i18n.t('roofMenu.AllRoofs', lang)}\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoofHeatCapacityInput;\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Radio, Row, Space } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType, Scope } from 'src/types';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport { UndoableChangeGroup } from 'src/undo/UndoableChangeGroup';\r\nimport { RoofModel } from '../../../models/RoofModel';\r\nimport { Util } from '../../../Util';\r\nimport { DEFAULT_CEILING_R_VALUE } from '../../../constants';\r\n\r\nconst CeilingRValueInput = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const language = useStore(Selector.language);\r\n const selectedElement = useStore(Selector.selectedElement) as RoofModel;\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const actionScope = useStore(Selector.roofActionScope);\r\n const setActionScope = useStore(Selector.setRoofActionScope);\r\n const applyCount = useStore(Selector.applyCount);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const revertApply = useStore(Selector.revertApply);\r\n const getElementById = useStore(Selector.getElementById);\r\n const setCommonStore = useStore(Selector.set);\r\n\r\n const roofModel = useStore((state) => {\r\n if (selectedElement) {\r\n for (const e of state.elements) {\r\n if (e.id === selectedElement.id) {\r\n return e as RoofModel;\r\n }\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n const [inputValue, setInputValue] = useState(roofModel?.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n const [inputValueUS, setInputValueUS] = useState(Util.toRValueInUS(inputValue));\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n if (roofModel) {\r\n setInputValue(roofModel?.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n }\r\n }, [roofModel?.ceilingRValue]);\r\n\r\n const updateById = (id: string, value: number) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.id === id) {\r\n (e as RoofModel).ceilingRValue = value;\r\n break;\r\n }\r\n }\r\n });\r\n };\r\n\r\n const undoInMap = (map: Map) => {\r\n for (const [id, val] of map.entries()) {\r\n updateById(id, val);\r\n }\r\n };\r\n\r\n const updateInMap = (map: Map, value: number) => {\r\n for (const id of map.keys()) {\r\n updateById(id, value);\r\n }\r\n };\r\n\r\n const setValue = (value: number) => {\r\n if (!roofModel) return;\r\n switch (actionScope) {\r\n case Scope.AllObjectsOfThisType:\r\n const oldValuesAll = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAll.set(e.id, roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n roof.ceilingRValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAll = {\r\n name: 'Set R-Value for All Ceilings',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAll,\r\n newValue: value,\r\n undo: () => {\r\n undoInMap(undoableChangeAll.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(undoableChangeAll.oldValues as Map, undoableChangeAll.newValue as number);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAll);\r\n setApplyCount(applyCount + 1);\r\n break;\r\n case Scope.AllObjectsOfThisTypeAboveFoundation:\r\n if (roofModel.foundationId) {\r\n const oldValuesAboveFoundation = new Map();\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (e.type === ObjectType.Roof && e.foundationId === roofModel.foundationId && !e.locked) {\r\n const roof = e as RoofModel;\r\n oldValuesAboveFoundation.set(e.id, roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n roof.ceilingRValue = value;\r\n }\r\n }\r\n });\r\n const undoableChangeAboveFoundation = {\r\n name: 'Set R-Value for All Ceilings Above Foundation',\r\n timestamp: Date.now(),\r\n oldValues: oldValuesAboveFoundation,\r\n newValue: value,\r\n groupId: roofModel.foundationId,\r\n undo: () => {\r\n undoInMap(undoableChangeAboveFoundation.oldValues as Map);\r\n },\r\n redo: () => {\r\n updateInMap(\r\n undoableChangeAboveFoundation.oldValues as Map,\r\n undoableChangeAboveFoundation.newValue as number,\r\n );\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableChangeAboveFoundation);\r\n setApplyCount(applyCount + 1);\r\n }\r\n break;\r\n default:\r\n if (roofModel) {\r\n const updatedRoof = getElementById(roofModel.id) as RoofModel;\r\n const oldValue = updatedRoof.ceilingRValue ?? roofModel.ceilingRValue ?? DEFAULT_CEILING_R_VALUE;\r\n const undoableChange = {\r\n name: 'Set Ceiling R-Value',\r\n timestamp: Date.now(),\r\n oldValue: oldValue,\r\n newValue: value,\r\n changedElementId: roofModel.id,\r\n changedElementType: roofModel.type,\r\n undo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.oldValue as number);\r\n },\r\n redo: () => {\r\n updateById(undoableChange.changedElementId, undoableChange.newValue as number);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateById(roofModel.id, value);\r\n setApplyCount(applyCount + 1);\r\n }\r\n }\r\n setCommonStore((state) => {\r\n state.actionState.roofRValue = value;\r\n });\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const close = () => {\r\n setInputValue(roofModel?.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\r\n setDialogVisible(false);\r\n };\r\n\r\n const handleCancel = () => {\r\n close();\r\n revertApply();\r\n };\r\n\r\n const handleOk = () => {\r\n setValue(inputValue);\r\n setDialogVisible(false);\r\n setApplyCount(0);\r\n };\r\n\r\n const handleApply = () => {\r\n setValue(inputValue);\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('roofMenu.CeilingRValue', lang) + ' '}({i18n.t('word.ThermalResistance', lang)})\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={close}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValue(value);\r\n setInputValueUS(Util.toRValueInUS(value));\r\n }}\r\n onPressEnter={handleOk}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [0.01, 100]\r\n
\r\n {i18n.t('word.SIUnit', lang)}: m²·℃/W\r\n
\r\n
\r\n Number(a).toFixed(2)}\r\n onChange={(value) => {\r\n setInputValueUS(value);\r\n setInputValue(Util.toRValueInSI(value));\r\n }}\r\n onPressEnter={handleOk}\r\n />\r\n
\r\n {i18n.t('word.Range', lang)}: [{Util.toRValueInUS(0.01).toFixed(3)}, {Util.toRValueInUS(100).toFixed(1)}]\r\n
\r\n {i18n.t('word.USUnit', lang)}: h·ft²·℉/Btu\r\n
\r\n \r\n \r\n setActionScope(e.target.value)} value={actionScope}>\r\n \r\n {i18n.t('roofMenu.OnlyThisCeiling', lang)}\r\n \r\n {i18n.t('roofMenu.AllCeilingsAboveFoundation', lang)}\r\n \r\n {i18n.t('roofMenu.AllCeilings', lang)}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CeilingRValueInput;\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useState } from 'react';\r\nimport { Checkbox, Menu, Modal, Radio } from 'antd';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { Lock, Paste } from '../menuItems';\r\nimport i18n from 'src/i18n/i18n';\r\nimport { ObjectType, RoofTexture, Scope } from 'src/types';\r\nimport RoofTextureSelection from './roofTextureSelection';\r\nimport RoofColorSelection from './roofColorSelection';\r\nimport { RoofModel, RoofStructure, RoofType } from 'src/models/RoofModel';\r\nimport RoofThicknessInput from './roofThicknessInput';\r\nimport RoofRafterSpacingInput from './roofRafterSpacingInput';\r\nimport RoofOpacityInput from './roofOpacityInput';\r\nimport SubMenu from 'antd/lib/menu/SubMenu';\r\nimport GlassTintSelection from './glassTintSelection';\r\nimport { UndoableChange } from 'src/undo/UndoableChange';\r\nimport RoofRafterColorSelection from './roofRafterColorSelection';\r\nimport RoofRafterWidthInput from './roofRafterWidthInput';\r\nimport { ElementCounter } from '../../../stores/ElementCounter';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { UndoableChangeGroup } from '../../../undo/UndoableChangeGroup';\r\nimport { UndoableRemoveAllChildren } from '../../../undo/UndoableRemoveAllChildren';\r\nimport { LightModel } from '../../../models/LightModel';\r\nimport RoofSideColorSelection from './roofSideColorSelection';\r\nimport RoofRValueInput from './roofRValueInput';\r\nimport RoofRiseInput from './roofRiseInput';\r\nimport RoofHeatCapacityInput from './roofHeatCapacityInput';\r\nimport { UndoableCheck } from 'src/undo/UndoableCheck';\r\nimport CeilingRValueInput from './ceilingRValueInput';\r\nimport { useSelectedElement } from './menuHooks';\r\n\r\nexport const RoofMenu = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const updateRoofStructureById = useStore(Selector.updateRoofStructureById);\r\n const countAllOffspringsByType = useStore(Selector.countAllOffspringsByTypeAtOnce);\r\n const removeAllChildElementsByType = useStore(Selector.removeAllChildElementsByType);\r\n const updateElementLockById = useStore(Selector.updateElementLockById);\r\n const updateElementUnlockByParentId = useStore(Selector.updateElementLockByParentId);\r\n const updateInsideLightsByParentId = useStore(Selector.updateInsideLightsByParentId);\r\n const updateInsideLightById = useStore(Selector.updateInsideLightById);\r\n const setApplyCount = useStore(Selector.setApplyCount);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const roof = useSelectedElement(ObjectType.Roof) as RoofModel | undefined;\r\n\r\n const [rafterSpacingDialogVisible, setRafterSpacingDialogVisible] = useState(false);\r\n const [rafterWidthDialogVisible, setRafterWidthDialogVisible] = useState(false);\r\n const [rafterColorDialogVisible, setRafterColorDialogVisible] = useState(false);\r\n const [riseDialogVisible, setRiseDialogVisible] = useState(false);\r\n const [thicknessDialogVisible, setThicknessDialogVisible] = useState(false);\r\n const [textureDialogVisible, setTextureDialogVisible] = useState(false);\r\n const [roofColorDialogVisible, setRoofColorDialogVisible] = useState(false);\r\n const [roofSideColorDialogVisible, setRoofSideColorDialogVisible] = useState(false);\r\n const [glassTintDialogVisible, setGlassTintDialogVisible] = useState(false);\r\n const [opacityDialogVisible, setOpacityDialogVisible] = useState(false);\r\n const [roofRValueDialogVisible, setRoofRValueDialogVisible] = useState(false);\r\n const [ceilingRValueDialogVisible, setCeilingRValueDialogVisible] = useState(false);\r\n const [heatCapacityDialogVisible, setHeatCapacityDialogVisible] = useState(false);\r\n\r\n if (!roof) return null;\r\n\r\n const lang = { lng: language };\r\n const paddingLeft = '36px';\r\n const radioStyle = {\r\n display: 'block',\r\n height: '30px',\r\n paddingLeft: '10px',\r\n lineHeight: '30px',\r\n };\r\n\r\n const legalToPaste = () => {\r\n const elementsToPaste = useStore.getState().elementsToPaste;\r\n if (elementsToPaste && elementsToPaste.length > 0) {\r\n const e = elementsToPaste[0];\r\n switch (e.type) {\r\n case ObjectType.Window:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light:\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const handleClearOk = (objectType: ObjectType) => {\r\n if (roof) {\r\n const removed = useStore\r\n .getState()\r\n .elements.filter((e) => !e.locked && e.type === objectType && e.parentId === roof.id);\r\n removeAllChildElementsByType(roof.id, objectType);\r\n const removedElements = JSON.parse(JSON.stringify(removed));\r\n const undoableRemoveAllChildren = {\r\n name: `Remove All ${objectType}s on Roof`,\r\n timestamp: Date.now(),\r\n parentId: roof.id,\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableRemoveAllChildren.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n removeAllChildElementsByType(undoableRemoveAllChildren.parentId, objectType);\r\n },\r\n } as UndoableRemoveAllChildren;\r\n addUndoable(undoableRemoveAllChildren);\r\n }\r\n };\r\n\r\n const renderClearItem = (objectType: ObjectType, count: number) => {\r\n if (count === 0) return null;\r\n const titleText = (type: string, count: number) =>\r\n `${i18n.t(`roofMenu.DoYouReallyWantToRemoveAll${type}sOnThisRoof`, lang)} (${count} ${i18n.t(\r\n `roofMenu.${type}s`,\r\n lang,\r\n )})?`;\r\n const objectTypeText = objectType.replaceAll(' ', '');\r\n return (\r\n {\r\n Modal.confirm({\r\n title: titleText(objectTypeText, count),\r\n icon: ,\r\n onOk: () => {\r\n handleClearOk(objectType);\r\n },\r\n });\r\n }}\r\n >\r\n {i18n.t(`roofMenu.RemoveAllUnlocked${objectTypeText}s`, lang)} ({count})\r\n \r\n );\r\n };\r\n\r\n const renderLockItem = (objectType: ObjectType, count: number) => {\r\n if (count === 0) return null;\r\n const objectTypeText = objectType.replaceAll(' ', '');\r\n return (\r\n {\r\n if (!roof) return;\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.parentId === roof.id && elem.type === objectType) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n }\r\n updateElementUnlockByParentId(roof.id, objectType, true);\r\n const undoableLockAllElementsOfType = {\r\n name: 'Lock All ' + objectTypeText + ' on Roof',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableLockAllElementsOfType.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateElementUnlockByParentId(roof.id, objectType, true);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableLockAllElementsOfType);\r\n }}\r\n >\r\n {i18n.t(`roofMenu.LockAll${objectTypeText}s`, lang)} ({count})\r\n \r\n );\r\n };\r\n\r\n const renderUnlockItem = (objectType: ObjectType, count: number) => {\r\n if (count === 0) return null;\r\n const objectTypeText = objectType.replaceAll(' ', '');\r\n return (\r\n {\r\n if (!roof) return;\r\n const oldLocks = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.parentId === roof.id && elem.type === objectType) {\r\n oldLocks.set(elem.id, !!elem.locked);\r\n }\r\n }\r\n updateElementUnlockByParentId(roof.id, objectType, false);\r\n const undoableUnlockAllElementsOfType = {\r\n name: 'Unlock All ' + objectTypeText + ' on Roof',\r\n timestamp: Date.now(),\r\n oldValues: oldLocks,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, locked] of undoableUnlockAllElementsOfType.oldValues.entries()) {\r\n updateElementLockById(id, locked as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateElementUnlockByParentId(roof.id, objectType, false);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableUnlockAllElementsOfType);\r\n }}\r\n >\r\n {i18n.t(`roofMenu.UnlockAll${objectTypeText}s`, lang)}\r\n \r\n );\r\n };\r\n\r\n const renderInsideLightItem = (count: number, inside: boolean) => {\r\n if (count === 0) return null;\r\n return (\r\n {\r\n if (!roof) return;\r\n const oldValues = new Map();\r\n for (const elem of useStore.getState().elements) {\r\n if (elem.parentId === roof.id && elem.type === ObjectType.Light) {\r\n oldValues.set(elem.id, (elem as LightModel).inside);\r\n }\r\n }\r\n updateInsideLightsByParentId(roof.id, inside);\r\n const undoableInsideLightsOnRoof = {\r\n name: inside ? 'Set All Lights on Roof Inside' : 'Set All Lights on Roof Outside',\r\n timestamp: Date.now(),\r\n oldValues: oldValues,\r\n newValue: true,\r\n undo: () => {\r\n for (const [id, inside] of undoableInsideLightsOnRoof.oldValues.entries()) {\r\n updateInsideLightById(id, inside as boolean);\r\n }\r\n },\r\n redo: () => {\r\n updateInsideLightsByParentId(roof.id, inside);\r\n },\r\n } as UndoableChangeGroup;\r\n addUndoable(undoableInsideLightsOnRoof);\r\n }}\r\n >\r\n {i18n.t(inside ? `roofMenu.AllLightsOnRoofInside` : `roofMenu.AllLightsOnRoofOutside`, lang)} ({count})\r\n \r\n );\r\n };\r\n\r\n const renderElementsSubMenu = () => {\r\n const counterAll = roof ? countAllOffspringsByType(roof.id, true) : new ElementCounter();\r\n if (counterAll.gotSome() && useStore.getState().contextMenuObjectType) {\r\n const counterUnlocked = roof ? countAllOffspringsByType(roof.id, false) : new ElementCounter();\r\n return (\r\n \r\n {renderClearItem(ObjectType.SolarPanel, counterUnlocked.solarPanelCount)}\r\n {renderClearItem(ObjectType.Window, counterUnlocked.windowCount)}\r\n {renderClearItem(ObjectType.Sensor, counterUnlocked.sensorCount)}\r\n {renderClearItem(ObjectType.Light, counterUnlocked.insideLightCount + counterUnlocked.outsideLightCount)}\r\n {renderLockItem(ObjectType.SolarPanel, counterUnlocked.solarPanelCount)}\r\n {renderUnlockItem(ObjectType.SolarPanel, counterAll.solarPanelCount)}\r\n {renderLockItem(ObjectType.Window, counterUnlocked.windowCount)}\r\n {renderUnlockItem(ObjectType.Window, counterAll.windowCount)}\r\n {renderLockItem(ObjectType.Sensor, counterUnlocked.sensorCount)}\r\n {renderUnlockItem(ObjectType.Sensor, counterAll.sensorCount)}\r\n {renderInsideLightItem(counterAll.outsideLightCount, true)}\r\n {renderInsideLightItem(counterAll.insideLightCount, false)}\r\n \r\n );\r\n }\r\n return null;\r\n };\r\n\r\n const updateRoofCeiling = (roofId: string, b: boolean) => {\r\n useStore.getState().set((state) => {\r\n const roof = state.elements.find((e) => e.id === roofId && e.type === ObjectType.Roof) as RoofModel;\r\n if (roof) {\r\n roof.ceiling = b;\r\n state.actionState.roofCeiling = b;\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n {legalToPaste() && }\r\n \r\n\r\n {roof.rise > 0 && (\r\n \r\n {\r\n const checked = e.target.checked;\r\n const undoableCheck = {\r\n name: 'Roof Ceiling',\r\n timestamp: Date.now(),\r\n checked: checked,\r\n selectedElementId: roof.id,\r\n selectedElementType: roof.type,\r\n undo: () => {\r\n updateRoofCeiling(roof.id, !undoableCheck.checked);\r\n },\r\n redo: () => {\r\n updateRoofCeiling(roof.id, undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n updateRoofCeiling(roof.id, checked);\r\n }}\r\n >\r\n {i18n.t('roofMenu.Ceiling', { lng: language })}\r\n \r\n \r\n )}\r\n\r\n {renderElementsSubMenu()}\r\n\r\n {!roof.locked && roof.roofType === RoofType.Gable && (\r\n \r\n {\r\n const undoableChange = {\r\n name: 'Select Roof Structure',\r\n timestamp: Date.now(),\r\n oldValue: roof.roofStructure ?? RoofStructure.Default,\r\n newValue: e.target.value,\r\n changedElementId: roof.id,\r\n changedElementType: roof.type,\r\n undo: () => {\r\n updateRoofStructureById(undoableChange.changedElementId, undoableChange.oldValue as RoofStructure);\r\n },\r\n redo: () => {\r\n updateRoofStructureById(undoableChange.changedElementId, undoableChange.newValue as RoofStructure);\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n updateRoofStructureById(roof.id, e.target.value);\r\n setCommonStore((state) => {\r\n state.actionState.roofStructure = e.target.value;\r\n });\r\n }}\r\n >\r\n \r\n {i18n.t('roofMenu.DefaultStructure', lang)}\r\n \r\n \r\n {i18n.t('roofMenu.RafterStructure', lang)}\r\n \r\n \r\n {i18n.t('roofMenu.GlassStructure', lang)}\r\n \r\n \r\n \r\n )}\r\n\r\n {!roof.locked && (\r\n <>\r\n {(roof.roofStructure === RoofStructure.Rafter || roof.roofStructure === RoofStructure.Glass) && (\r\n <>\r\n {opacityDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setOpacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.Opacity', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {roof.roofStructure === RoofStructure.Rafter && roof.roofType === RoofType.Gable && (\r\n <>\r\n {rafterColorDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setRafterColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RafterColor', lang)} ...\r\n \r\n\r\n {rafterSpacingDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setRafterSpacingDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RafterSpacing', lang)} ...\r\n \r\n\r\n {rafterWidthDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setRafterWidthDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RafterWidth', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {thicknessDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setThicknessDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t(roof.roofStructure === RoofStructure.Rafter ? 'roofMenu.RafterThickness' : 'word.Thickness', lang)}{' '}\r\n ...\r\n \r\n\r\n {roof.roofStructure === RoofStructure.Glass && roof.roofType === RoofType.Gable && (\r\n <>\r\n {glassTintDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setGlassTintDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.GlassTint', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {riseDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setRiseDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.Rise', lang)} ...\r\n \r\n\r\n {(roof.roofStructure !== RoofStructure.Rafter || roof.opacity === undefined || roof.opacity > 0) && (\r\n <>\r\n {roofRValueDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setRoofRValueDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RoofRValue', lang)} ...\r\n \r\n {roof.ceiling && ceilingRValueDialogVisible && (\r\n \r\n )}\r\n {roof.ceiling && (\r\n {\r\n setApplyCount(0);\r\n setCeilingRValueDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.CeilingRValue', lang)} ...\r\n \r\n )}\r\n {heatCapacityDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setHeatCapacityDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.VolumetricHeatCapacity', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {roof.roofStructure !== RoofStructure.Rafter && (\r\n <>\r\n {textureDialogVisible && }\r\n {\r\n setApplyCount(0);\r\n setTextureDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('word.Texture', lang)} ...\r\n \r\n \r\n )}\r\n\r\n {(roof.roofStructure !== RoofStructure.Rafter || roof.opacity === undefined || roof.opacity > 0) && (\r\n <>\r\n {roofColorDialogVisible && }\r\n {(roof.textureType === RoofTexture.NoTexture || roof.textureType === RoofTexture.Default) && (\r\n {\r\n setApplyCount(0);\r\n setRoofColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RoofColor', lang)} ...\r\n \r\n )}\r\n {roofSideColorDialogVisible && (\r\n \r\n )}\r\n {\r\n setApplyCount(0);\r\n setRoofSideColorDialogVisible(true);\r\n }}\r\n >\r\n {i18n.t('roofMenu.RoofSideColor', lang)} ...\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n});\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport { Dropdown, Menu } from 'antd';\r\nimport { useStore } from '../../stores/common';\r\nimport * as Selector from '../../stores/selector';\r\nimport { ObjectType } from '../../types';\r\nimport {\r\n CuboidMenu,\r\n FoundationMenu,\r\n GroundMenu,\r\n HumanMenu,\r\n FlowerMenu,\r\n PolygonMenu,\r\n PolygonVertexMenu,\r\n SensorMenu,\r\n LightMenu,\r\n SkyMenu,\r\n SolarPanelMenu,\r\n ParabolicTroughMenu,\r\n ParabolicDishMenu,\r\n TreeMenu,\r\n WallMenu,\r\n WindowMenu,\r\n DoorMenu,\r\n FresnelReflectorMenu,\r\n HeliostatMenu,\r\n RoofMenu,\r\n} from './elementMenu';\r\n\r\nexport interface ContextMenuProps {\r\n [key: string]: any;\r\n}\r\n\r\nconst DropdownContextMenu: React.FC = ({ children }) => {\r\n const contextMenuObjectType = useStore(Selector.contextMenuObjectType);\r\n\r\n const contextMenu = () => {\r\n switch (contextMenuObjectType) {\r\n case ObjectType.Ground:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Sky:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Foundation:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Cuboid:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Polygon:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.PolygonVertex:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.SolarPanel:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.ParabolicTrough:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.ParabolicDish:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.FresnelReflector:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Heliostat:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Sensor:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Light:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Human:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Tree:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Flower:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Wall:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Window:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Roof:\r\n return (\r\n \r\n \r\n \r\n );\r\n case ObjectType.Door:\r\n return (\r\n \r\n \r\n \r\n );\r\n default:\r\n return <>;\r\n }\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(DropdownContextMenu);\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEQgBg4Se6gAABJlJREFUWIXtV11IXEcUPjNzZ3bXHzauvzVSAqlvrWx9KX0paEoRMcoKQmwFDSK+2NInqWVJNIi0pZCXUiiIqC8hJRCphIJaodJC+lTY0j9jmrS11tb1L3bv79w5feje7apX3W3MWw9cuHO+M+d8M3PmzAyBPKW5ublDStmMiE8jIgAAICIIISAcDn9rmuaHMzMzP+Tqj+QTvL29/WPHcTr8MEQEpRQopfSSkpLYjRs35nLxqeUaPBaLvazregciguu6twHg+2ycMSYopV2U0qqdnZ33AOB0Cei6HhVCgG3b9xYWFtr9bPr6+pbW1tY+QcRnlFKCUmqf5PfQEnR2dpYqpV5JJpP8ANQSCAQ6LMv6CRGvEELYwb5FRUXPm6b5JucchBBv7e7u/u5hxcXFEA6Hf5yamvrqSAKxWOxVwzDe55w/pZTa51wpBa7rAiEENO3wxCEipJcHAAA0TQNCCHh+KKWglAIhxKfRaLR7ZGRkYx+Brq6uc8lkcgUAmJTSQMQt/0nzl6KiIjBNE6SUGUKccyguLs6QT6VSZ0OhEFiW9cHc3NzrAFk5oOt6O2OMKaV2qqurX3rw4MF3+RCYmZmB4eFhWFxczOji8Tg0NDRk2pcuXbqm6/rbruu2xOPxN0ZHR5F64Pb2dohSCo7jPJyenv4mn+AAAISQfcEBAK5evQqEkMxXVVX1q6ZpgIj26OgoAmQtQWNj45VgMDhiWZaNiBuE/JseXsE5gQBN26oD+sw/pbQQAM5wznfb2trO9/f3b2aWoLCw8H46e4VS6qxpmpkKJ4Q4cfS2bYNSCoLB4D7ChmGA67oghADO/9lYtm3/sbe3l9o3A4hIBgcHm0OhUOmjR48ql5eX33Fdl9bU1EyXl5d/dnBXZAvnHNbW1n4zTdOpra09Z5pmJusTiUQcEWsDgcBsNBq9ZRiG2t7e/mJ8fPzhkQ7n5+cjra2t8uLFizgwMNB97PBPkAsXLnze2tqKDQ0NcT+c+ikTiUSJt6+llIWPQ4AQoiEiMMZCfnjOpdizb2lpGUDE+3fu3JnNBnp7e0u2tra6Nzc37y4tLd3N1aHvDBwlPT09TZqmXVdK3R4aGqrIxtbX1y8zxq5zzj/Kx2deBMrKys4rpYAxxqSUZ7IxXddDlmUByd53p00AABwAAER0GWPuPkeUem33UK9TJHDqkhcBrxbkUhmfCIEnIf8TOJEAIua1rU6VQDrZnCyVBgCQvg/SA7Ze+3TqgHeJME1TejrDMDY1TQOlFFBK97LtGWOOEAIYY3mdHb5ngW3bCgCUpmmsoKCgwNPPzs7eqqurO2+a5vLY2Nh6dp9IJDKl63phOBxOPDaBSCQiEVFKKbnrupmLwOrqqrW6unrNr8/Nmzf/BIBhH+jYouG7BI7jCEppKJ0D+nEOTpKss8F3sP5KTfs5lUo9FEKcSyaTnW1tbV8bhvFXvsErKipe2NjYeC6dM7u+BI/q3NTUNMg5f9e2be/BkdchAwAQCAQYIgKldK+ysvLZiYmJXw7aHHpeebKysvJlfX39ruu6L0opg4QQ+h8+YIzNlpaWvjY5OXnPL87fPnkgI7SmjToAAAAASUVORK5CYII=\"","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableBounds, DraggableData, DraggableEvent, DraggableEventHandler } from 'react-draggable';\nimport { Input, Modal, Space, Table, Typography } from 'antd';\nimport { CopyOutlined, QuestionCircleOutlined, WarningOutlined } from '@ant-design/icons';\nimport { HOME_URL, REGEX_ALLOWABLE_IN_NAME, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { copyTextToClipboard, showSuccess } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport Draggable from 'react-draggable';\nimport RenameImage from '../assets/rename.png';\nimport DeleteImage from '../assets/delete.png';\nimport LinkImage from '../assets/create_link.png';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 14;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 680px;\n height: 520px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface CloudFilePanelProps {\n cloudFileArray: object[];\n openCloudFile: (userid: string, title: string) => void;\n deleteCloudFile: (userid: string, title: string) => void;\n renameCloudFile: (userid: string, oldTitle: string, newTitle: string) => void;\n}\n\nconst CloudFilePanel = ({ cloudFileArray, openCloudFile, deleteCloudFile, renameCloudFile }: CloudFilePanelProps) => {\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const [renameDialogVisible, setRenameDialogVisible] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const [oldTitle, setOldTitle] = useState();\n const [newTitle, setNewTitle] = useState();\n const [userid, setUserid] = useState();\n const dragRef = useRef(null);\n // make an editable copy because the file array is not mutable\n const filesRef = useRef([...cloudFileArray]);\n // set a flag so that we can update when filesRef changes\n const [recountFlag, setRecountFlag] = useState(false);\n\n const { Search } = Input;\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (cloudFileArray) {\n filesRef.current = [...cloudFileArray];\n setRecountFlag(!recountFlag);\n }\n }, [cloudFileArray]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showCloudFilePanel = false;\n });\n };\n\n const deleteFile = (userid: string, title: string) => {\n Modal.confirm({\n title: i18n.t('cloudFilePanel.DoYouReallyWantToDelete', lang) + ' \"' + title + '\"?',\n content: (\n \n \n {i18n.t('word.Warning', lang) + ': ' + i18n.t('message.ThisCannotBeUndone', lang)}\n \n ),\n icon: ,\n onOk: () => {\n deleteCloudFile(userid, title);\n // change the address field of the browser when the cloud file is currently open\n const params = new URLSearchParams(window.location.search);\n if (params.get('title') === title && params.get('userid') === userid) {\n window.history.pushState({}, document.title, HOME_URL);\n }\n },\n });\n };\n\n const renameFile = () => {\n if (userid && oldTitle && newTitle) {\n renameCloudFile(userid, oldTitle, newTitle);\n setNewTitle(undefined);\n }\n setRenameDialogVisible(false);\n };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('word.Rename', lang)}\n \n }\n visible={renameDialogVisible}\n onOk={renameFile}\n onCancel={() => {\n setRenameDialogVisible(false);\n setNewTitle(undefined);\n }}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e: React.ChangeEvent) => {\n setNewTitle(e.target.value);\n }}\n />\n \n \n {i18n.t('word.Caution', lang) +\n ': ' +\n i18n.t('cloudFilePanel.IfSharedOrPublishedRenamingFileBreaksExistingLinks', lang)}\n .\n \n \n \n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'cloudFilePanel';\n });\n }}\n >\n \n \n
\n {i18n.t('cloudFilePanel.MyCloudFiles', lang) + ' (' + filesRef.current.length + ')'}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {\n if (!cloudFileArray) return;\n // must create a new array for ant table to update (don't just set length to 0)\n filesRef.current = [];\n for (const f of cloudFileArray) {\n // @ts-ignore\n if (f['title']?.toLowerCase().includes(s.toLowerCase())) {\n filesRef.current.push(f);\n }\n }\n setRecountFlag(!recountFlag);\n }}\n />\n \n \n {\n // @ts-ignore\n return a['title'].localeCompare(b['title']);\n }}\n render={(title, record) => {\n return (\n \n {title}\n \n );\n }}\n onCell={(data, index) => {\n return {\n onClick: () => {\n const selection = window.getSelection();\n if (selection && selection.toString().length > 0) return;\n // only proceed when no text is selected\n // @ts-ignore\n openCloudFile(data.userid, data.title);\n },\n };\n }}\n />\n {\n // @ts-ignore\n return a['timestamp'] - b['timestamp'];\n }}\n render={(time, record) => {\n return {time};\n }}\n />\n (\n \n {\n deleteFile(record.userid, record.title);\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n {\n setOldTitle(record.title);\n setUserid(record.userid);\n setRenameDialogVisible(true);\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n {\n copyTextToClipboard(record.title);\n showSuccess(i18n.t('cloudFilePanel.TitleCopiedToClipBoard', lang) + '.');\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n {\n const url =\n HOME_URL +\n '?client=web&userid=' +\n record.userid +\n '&title=' +\n encodeURIComponent(record.title);\n copyTextToClipboard(url);\n showSuccess(i18n.t('cloudFilePanel.LinkGeneratedInClipBoard', lang) + '.');\n }}\n height={16}\n width={16}\n style={{\n cursor: 'pointer',\n verticalAlign: 'middle',\n }}\n />\n \n )}\n />\n \n
\n \n \n \n );\n};\n\nexport default React.memo(CloudFilePanel);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEQMtUqgrwgAAA2hJREFUWIXtVktrJFUU/k7dW1WpVHfT62RAMAsRcakmMJkwdjXTREIImcVswuAwzi4rXaq/wIUgxKWPIEzDkIDEiOkOJKsIs2jEx0IQGWbjYlqhq7sr1XXvPS5SFfOaTE/b6Ka/VdW5j+/jvO4BRhjhfwZdZFxeXn6r3W6/kCTJMy9wXReFQuGbarX6aBAB8qxhbm7OD8NwK5fLQWt9bFdKwRgDKSUsyzolIAzDFwG8NxQB+/v7nUqlcqvb7b6ilDq59LaU8kqSJFtKqUZm7PV6yOfz1UHIgaeE4CIEQbDved61KIpu1Ov1nUEJz8J69pYjMLPNzNBa87DIgTQEs7Oz7vj4+BIzF7O4CyHAzE9yudzG5uamISJmZjiOs1IqlaYGIRNCwPf9PzY2Nr4mIgMAcmlpyQrD8FvHca6fTC4igtYarVbrVQA/AUeJKKVcGRsbW9FaZ/8QQvQtIkkSLC4ufgegAgCy1Wrd8zzvehRFfzLzl0QUAoBlWVBKPbFt+9djd0kJrfVWHMcNZi47jjMdRdH3RFTrh5yZ85Zl3XEc58b8/Pyt7e3t+xLAS6m7P93d3X3/ksNERFBKfVKv13fK5bLluu60Umq3Vqt92K8HKpWKllK+2+123wBw3wIQp2uH/VxgjMmngjxmBjN7/ZIDQBzHf6X3xMDpKug/kP8ClmWd6j3HAohoqOX1NBhjTnU3C4CTfqvz28+DmVsAQEQREYGIoucRkM/ni8wMIrIBQDLzb2ksbwdBMAaAgaOMV0o9bjabnzcaDUVEbIyBEOJeEARXjTGlOI5hjCkFQaAvZf1HvJskyTtSSvi+/zMASCHEZ51O57bv+68R0QfZZiICM8MY8wOAhwCgtYbrujfTcoRSCp7nTQshpvv1gNYavV7v4dTUVBUAZK1W687MzLxp2/ZdrfXLxhhkHtBaP+p0Oj9mh4UQiOO4dnh4+Htm6+fJziClhOu6BxMTEw/W1tY6QNqKDw4O2gA+vuwwM1PanD7a29v77x8jIkrSpBtqtZx7jpkZCwsLZWPM1V6vd3LpjpTyilLqAYBfMqPv+0mhUPhifX398SACzg0kq6ureaXUjud5sG372J5NRJ7n3Tw7ETWbzSKGNREVi8W2lPJuFEWvX5RgZ7wCY0wyOTn51SDkI4wwAgD8DRixkgDRtVchAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVERwXWf787gAABKdJREFUWIXdV09o21Yc/p5kabJkpx2keMsOppd1o7A/LWyUEMe2ItvB3WguaUsp63WjUHobbMcNethhZYdeBz40sNJtrF6apB62sbOQdSVdoCWwUNzQtN5onKBYif48vR0aF8eO48TZKOy76f0+ve97T59+0iOqqh7zeDwRy7Jc1IHneQAApRStIIoiMQzj23w+/7gVhxDiicViRziO66aUPl1aWrpz+/Ztu1b3MMY+DAaDn7ZUaYP5+fksgC0NqKp6IhaLXZEk6RXGGERRRHd3d1lV1fOZTOYaAHCMMaNTcQBgjG25ReFw+JQsy98DgGEYn9i2HTYM42PGGPN6vd/F4/HjAODZizgAEELsxrFIJHKyq6vrqmmas7quD0xOTv61Ucolk8kfHMeZdV33CiHk5yYDc3NzBymlKzsRdxyHTE1NbeJGIpGTfr9/xDTN2UqlEpmenn5aX0+n0080TfvK6/VeisVirzcZmJ+fLy8sLKztxEAj2onXIAjCHCEElNKXucZiIBAQ/0txADBNM0QpBSHk0Z4zAAD9/f3DXV1dI6ZpzpbL5dDMzMxyK66qqu9JknTRNM3fJiYmHjbtwG4Rj8ffkGX5qmVZ9yuVSsS2bSeRSHyhadqbjdxQKHREEIQMpXQZwEcAsGcDlNILgiBwAE5PT08/3b9//2uCIHzG83wuGo0G68UVRckBcHVdj0xMTNz/VwzwPB+pVqsLY2NjdwGgWCzO2batCYJwgOO4bwAgGo0elWV5kjHmrq6uhorF4kzt/o4MqKo6pKrqCeBZHyCEbMrSzZs3b62trV0TRfGD4eFhH6W0hxBS0nW9v1Ao3K3n7trARtqvA7gAAJZlpRVFeTWRSAzU81zXvSOKIgAcyuVyP42Ojh6qX3lHBsLh8Cm/3z9iGMYflNLTAOA4zuX19fUVjuOuDw4O9te4PM+/bZomqtXqo+3m3LGBjZVfNU1zdnl5OZrNZp8AQD6ff2ya5nGe59cJIYkN7vuSJJ20bXssnU4/2W7eHfWBeDx+VFGUEcuy7m3VZLLZbOHs2bMHU6lUdSPtt2zbXnIc53w9jxBCzp07967ruh6e54lhGIs7MuC67ueUUpcxdrxVh0ulUtXe3t53/H5/njFGdV1Xi8Xin/WcYDD4kiiKv9euK5XKZc513ebZNrvmAUQcxymOj48/aMULhUJH/H5/Ac/e8/6tAtcIx3GoR5KkdjzCGOMBWNuJy7KcA0B3Kg4AhBDWdgcYYw4h5FdBEHoHBwcPNNb7+vqOyrKcxy5WXg/O42kfA0LIJVEUJQA/JpPJ5z1e07Skoih57HLlmwxYVsudfY7x8fFfVldXLwqCcAzAvYGBgXuapj30er03ABidigNA20dQQyaT+dq27T7btlMAQAj527KsLw3DeKtTcWCX/4Sjo6MFAIVOxbbCnr+G/z8D5XK5fSo7RKlUMhvHmjJw+PDhwJkzZ1b27du3a4HFxUXW09NDtqqtrKxgaGioqes1GQgGgw+A7c+ErRAIBFre5/P54PP5msZffAYIIfIL1Fc8PM/fKJVKOqX0eUeilEIURQ9jjNm2TWtH9X8TPM9zrutO/QMUu0XyKmJPLwAAAABJRU5ErkJggg==\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Table } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1001;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 400px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface LikesPanelProps {\n likesArray: any[];\n openCloudFile: (userid: string, title: string) => void;\n}\n\nconst LikesPanel = ({ likesArray, openCloudFile }: LikesPanelProps) => {\n const language = useStore(Selector.language);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showLikesPanel = false;\n });\n };\n\n return (\n <>\n \n \n \n
\n {i18n.t('cloudFilePanel.MyLikes', lang)}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n record}\n size={'small'}\n style={{ width: '100%', direction: 'ltr' }}\n dataSource={likesArray}\n scroll={{ y: 300 }}\n pagination={{\n defaultPageSize: 10,\n showSizeChanger: true,\n position: ['bottomCenter'],\n pageSizeOptions: ['10', '20', '50'],\n }}\n >\n (\n {\n const s = record as string;\n const i = s.lastIndexOf(', ');\n if (i >= 0) {\n usePrimitiveStore.setState((state) => {\n state.openModelsMap = false;\n });\n openCloudFile(s.substring(i + 2), s.substring(0, i));\n }\n }}\n >\n {(record as string).substring(0, (record as string).lastIndexOf(', '))}\n \n )}\n />\n \n
\n
\n \n \n );\n};\n\nexport default React.memo(LikesPanel);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Table } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1001;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 420px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface PublishedModelsPanelProps {\n publishedModels: any[];\n openCloudFile: (userid: string, title: string) => void;\n}\n\nconst PublishedModelsPanel = ({ publishedModels, openCloudFile }: PublishedModelsPanelProps) => {\n const language = useStore(Selector.language);\n const user = useStore(Selector.user);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showPublishedModelsPanel = false;\n });\n };\n\n return (\n <>\n \n \n \n
\n {i18n.t('modelsMap.MyPublishedModels', lang)}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n record}\n size={'small'}\n style={{ width: '100%', direction: 'ltr' }}\n dataSource={publishedModels}\n scroll={{ y: 300 }}\n pagination={{\n defaultPageSize: 10,\n showSizeChanger: true,\n position: ['bottomCenter'],\n pageSizeOptions: ['10', '20', '50'],\n }}\n >\n (\n {\n if (user.uid) {\n usePrimitiveStore.setState((state) => {\n state.openModelsMap = false;\n });\n openCloudFile(user.uid, record);\n }\n }}\n >\n {record}\n \n )}\n />\n \n
\n
\n \n \n );\n};\n\nexport default React.memo(PublishedModelsPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport i18n from '../i18n/i18n';\nimport { Button, Col, Modal, Row, Select, Switch } from 'antd';\nimport { copyTextToClipboard, showSuccess } from '../helpers';\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\nimport { SchoolID } from '../types';\nimport { ClassID } from '../types';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport LikesPanel from './likesPanel';\nimport PublishedModelsPanel from './publishedModelsPanel';\n\nconst { confirm } = Modal;\nconst { Option } = Select;\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 1000;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 450px;\n height: 380px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n text-align: left;\n overflow-x: hidden;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst AccountSettingsPanel = ({ openCloudFile }: { openCloudFile: (userid: string, title: string) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const language = useStore(Selector.language);\n const user = useStore(Selector.user);\n const userCount = usePrimitiveStore(Selector.userCount);\n const showLikesPanel = usePrimitiveStore(Selector.showLikesPanel);\n const showPublishedModelsPanel = usePrimitiveStore(Selector.showPublishedModelsPanel);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const schoolIdRef = useRef(user.schoolID ?? SchoolID.UNKNOWN);\n const classIdRef = useRef(user.classID ?? ClassID.UNKNOWN);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showAccountSettingsPanel = false;\n });\n };\n\n const superuser = user && user.email && user.email.endsWith('intofuture.org');\n const signFile = false;\n\n return (\n <>\n {showLikesPanel && }\n {showPublishedModelsPanel && (\n \n )}\n \n \n \n
\n {i18n.t('accountSettingsPanel.MyAccountSettings', lang)}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n\n \n {\n if (user.uid) {\n copyTextToClipboard(user.uid);\n showSuccess(i18n.t('accountSettingsPanel.IDInClipBoard', lang));\n }\n }}\n >\n \n {i18n.t('accountSettingsPanel.MyID', lang)}\n \n \n \n {user.uid}\n \n \n\n {signFile && (\n \n \n {\n if (checked) {\n confirm({\n title: i18n.t('accountSettingsPanel.DoYouReallyWantToShowYourNameInYourFiles', lang),\n icon: ,\n content: i18n.t('accountSettingsPanel.SignFileDisclaimer', lang),\n onOk() {\n setCommonStore((state) => {\n state.user.signFile = true;\n });\n },\n onCancel() {\n setCommonStore((state) => {\n state.user.signFile = false;\n });\n },\n });\n } else {\n setCommonStore((state) => {\n state.user.signFile = false;\n });\n }\n }}\n />\n \n \n {i18n.t('accountSettingsPanel.StoreMyNameInMyFilesWhenSaving', lang)}\n \n \n )}\n\n \n \n {i18n.t('accountSettingsPanel.SchoolID', lang)}\n \n \n {\n schoolIdRef.current = value;\n setCommonStore((state) => {\n state.user.schoolID = value;\n });\n }}\n >\n \n \n \n \n \n \n \n \n \n\n \n \n {i18n.t('accountSettingsPanel.ClassID', lang)}\n \n \n {\n classIdRef.current = value;\n setCommonStore((state) => {\n state.user.classID = value;\n });\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n {i18n.t('accountSettingsPanel.AllPublished', lang)}\n \n \n {\n setPrimitiveStore('showPublishedModelsPanel', true);\n }}\n >\n {user.published?.length ?? 0}\n \n \n \n\n \n \n {i18n.t('accountSettingsPanel.PublishedUnderAliases', lang)}\n \n \n \n {user.aliases?.map((value, index) => {\n if (!user.aliases) return null;\n return value + (index < user.aliases.length - 1 ? ', ' : '');\n })}\n \n \n \n\n \n \n {i18n.t('accountSettingsPanel.Likes', lang)}\n \n \n {\n setPrimitiveStore('showLikesPanel', true);\n }}\n >\n {user.likes?.length ?? 0}\n \n \n \n\n {superuser && (\n \n \n {i18n.t('accountSettingsPanel.UserCount', lang)}\n \n \n {userCount}\n \n \n )}\n
\n
\n \n \n );\n};\n\nexport default React.memo(AccountSettingsPanel);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDjACEy7XXwAAA5xJREFUWIXll09II1ccx9+8mcnE2aUxE6KO5L2ZN3+cJDOrBiNUWKHQaiFEClso9CIlpx62SOmhS1fIlm270N5K/wg9LKXsdi1dl5aC3RaFRdaCbNHaLtX2oDQXDRGTBo0zSZyeLEqz1uxq9rCf4/ze9/f58k5vAHjSoWp9tCzLomn6hXw+38JxHIEQVra2tv70+/2/Oo5za2lpaatWLhaLPUVR1Evr6+uax+PpYFmWcV33LwDAMsb4u6mpqZVDCwwODqorKytXyuUyZBhmIZfL3QkGgzvb29sUwzASx3FnS6VSpFwuf7O2tvbx/qxpmhdd1x2sVCoLuVzuR0EQsh6Pxy0Wi80cx/W5rnu2Wq3+5vf7L87Pz5f+0z4SiTxLCJknhKQOu7L+/v4QIeQaQui667pwenqaM03ztiRJnyUSifYH5cLhMIsxvowQmtV1XT4w7OzsNBFCCzzP64fJ9xOPx6/IsvyFoijj0Wj0zaPmWltbE6IozvX09AQAAACMjo5SoVDoe9M0B466ZI9QKPQpxvijenOapr1qGMYEAACAaDT6PCHkWr1LHhVCyGR3d3ccOo6T5DjuaqMLsCx7tVAonIM7OzsiwzCzjS4QDAZ/AABEgKqq9xst30PTtPvQdV3v4yoAADgFIYTO47JXq9UMtG3794GBAb7R8o6ODsG27VUoCEJpY2PjTKMLsCzbw/P8Bk3T9Gnbts8UCoW7jSzQ1NSUKhaLP0Gv1ztNUdRzjZSPjY0xAIC4IAh36M3Nzb/9fn+yubnZzufzfzSiwPLycspxHO/q6urXEAAAAoHABwzDpNPpNH3S8nA4fKpSqbzG8/z7BwaEkEuEkLGTLoAxvq6q6us1h6IoftXV1XXppORtbW3vEEI+P+wMJcvy7Vgslj5uuSiKbyOEJsbHx+H/naXa29tvybL87nHJFUX5ECF0E9R4g9Zq46ZSqXMQQkwI+TKdTjc9rHhkZMSn6/q3u7u7MJPJvAgAcOtaEA6HLyuKctcwDKteeV9fX1xV1Z8Nw3ir3uwBWlpaniGEzGGMzx81o6rqeVmW71mWlXgk+R7JZDKgKMoNjPFEb29v9EHnLMsiCKGbkiTd+PfReZwYhvGyoiizpmm+NzQ0dHr/DCF0QdO0OUmSXqlnZ80/o8MYHh72zczMXAAAPO3z+Say2WyWpulhjuMyuq6nJycn10+0wB6xWEx1HOcN27Zpnuc/WVxc/OVhdz3Z/AOzXBiEX6oZVwAAAABJRU5ErkJggg==\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport ResidentialBuildingIcon from '../assets/map_residential_building.png';\nimport CommercialBuildingIcon from '../assets/map_commercial_building.png';\nimport SchoolBuildingIcon from '../assets/map_school_building.png';\nimport TouristAttractionIcon from '../assets/map_tourist_attraction.png';\nimport SolarPanelIcon from '../assets/map_solar_panel.png';\nimport ParabolicDishIcon from '../assets/map_parabolic_dish.png';\nimport ParabolicTroughIcon from '../assets/map_parabolic_trough.png';\nimport FresnelReflectorIcon from '../assets/map_fresnel_reflector.png';\nimport HeliostatIcon from '../assets/map_heliostat.png';\nimport UnderConstructionIcon from '../assets/map_under_construction.png';\nimport UnknownIcon from '../assets/map_marker.png';\nimport EmptyHeartIcon from '../assets/empty_heart.png';\nimport RedHeartIcon from '../assets/red_heart.png';\nimport OpenFileIcon from '../assets/open_file.png';\nimport DeleteIcon from '../assets/delete.png';\nimport ExportLinkIcon from '../assets/export_link.png';\nimport ClickCountIcon from '../assets/click_count.png';\n\nimport React, { useCallback, useRef, useState } from 'react';\nimport { GoogleMap, Marker, GoogleMapProps, InfoWindow, MarkerClusterer } from '@react-google-maps/api';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { UndoableChangeLocation } from '../undo/UndoableChangeLocation';\nimport { DEFAULT_MODEL_MAP_ZOOM, HOME_URL, LAT_LNG_FRACTION_DIGITS } from '../constants';\nimport { copyTextToClipboard, showError, showSuccess } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { ModelSite, ModelType } from '../types';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { Modal, Collapse, Space } from 'antd';\nimport {\n ExclamationCircleOutlined,\n UpCircleOutlined,\n DownCircleOutlined,\n PushpinOutlined,\n PushpinFilled,\n} from '@ant-design/icons';\nimport ReactTimeago from 'react-timeago';\nimport ReactCountryFlag from 'react-country-flag';\nimport { Util } from '../Util';\n\nconst { Panel } = Collapse;\n\nexport const getIconUrl = (site: ModelSite) => {\n switch (site.type) {\n case ModelType.PHOTOVOLTAIC:\n return SolarPanelIcon;\n case ModelType.PARABOLIC_DISH:\n return ParabolicDishIcon;\n case ModelType.PARABOLIC_TROUGH:\n return ParabolicTroughIcon;\n case ModelType.FRESNEL_REFLECTOR:\n return FresnelReflectorIcon;\n case ModelType.SOLAR_POWER_TOWER:\n return HeliostatIcon;\n case ModelType.RESIDENTIAL_BUILDING:\n return ResidentialBuildingIcon;\n case ModelType.COMMERCIAL_BUILDING:\n return CommercialBuildingIcon;\n case ModelType.SCHOOL_BUILDING:\n return SchoolBuildingIcon;\n case ModelType.TOURIST_ATTRACTION:\n return TouristAttractionIcon;\n case ModelType.UNDER_CONSTRUCTION:\n return UnderConstructionIcon;\n }\n return UnknownIcon;\n};\n\nexport interface ModelsMapProps {\n selectAuthor: (author: string | undefined) => void;\n closeMap: () => void;\n openModel: (model: ModelSite) => void;\n deleteModel: (model: ModelSite, successCallback?: Function) => void;\n likeModel: (model: ModelSite, like: boolean, successCallback?: Function) => void;\n pinModel: (model: ModelSite, pinned: boolean, successCallback?: Function) => void;\n}\n\nconst ModelsMap = ({ selectAuthor, closeMap, openModel, deleteModel, likeModel, pinModel }: ModelsMapProps) => {\n const language = useStore(Selector.language);\n const user = useStore.getState().user;\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const modelsMapLatitude = useStore(Selector.modelsMapLatitude);\n const latitude = modelsMapLatitude !== undefined ? modelsMapLatitude : 42.2844063;\n const modelsMapLongitude = useStore(Selector.modelsMapLongitude);\n const longitude = modelsMapLongitude !== undefined ? modelsMapLongitude : -71.3488548;\n const mapZoom = useStore(Selector.modelsMapZoom) ?? DEFAULT_MODEL_MAP_ZOOM;\n const mapTilt = useStore(Selector.modelsMapTilt) ?? 0;\n const mapType = useStore(Selector.modelsMapType) ?? 'roadmap';\n const weatherData = useStore(Selector.weatherData);\n const mapWeatherStations = usePrimitiveStore(Selector.modelsMapWeatherStations);\n const modelSites = useStore(Selector.modelSites);\n\n const [map, setMap] = useState(null);\n const [selectedSite, setSelectedSite] = useState | null>(null);\n const [selectedLocation, setSelectedLocation] = useState(null);\n const [ascendingOrder, setAscendingOrder] = useState(true);\n const [updateFlag, setUpdateFlag] = useState(false);\n const previousSiteRef = useRef | null>(null);\n const markersRef = useRef>([]);\n const selectedMarkerIndexRef = useRef(-1);\n const cities = useRef([]);\n\n const lang = { lng: language };\n const imageSize = 14;\n const ifiUser = user.email?.endsWith('@intofuture.org');\n\n const loadCities = () => {\n cities.current.length = 0;\n for (const x in weatherData) {\n if (weatherData.hasOwnProperty(x)) {\n const w = weatherData[x];\n const pos = new google.maps.LatLng(w.latitude, w.longitude);\n cities.current.push(pos);\n }\n }\n };\n\n const onLoad = useCallback((map: google.maps.Map) => {\n setMap(map);\n loadCities();\n map.setMapTypeId(mapType); // for some reason, we have to do this again\n }, []);\n\n const onUnmount = useCallback(function callback() {\n setMap(null);\n }, []);\n\n // FIXME: Undo doesn't work unless the focus is returned to the main window\n const onCenterChanged = () => {\n if (map) {\n const center = map.getCenter();\n if (center) {\n const lat = center.lat();\n const lng = center.lng();\n if (lat !== latitude || lng !== longitude) {\n const undoableChangeLocation = {\n name: 'Set Model Map Location',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: lat,\n oldLongitude: longitude,\n newLongitude: lng,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapLatitude = undoableChangeLocation.oldLatitude;\n state.modelsMapLongitude = undoableChangeLocation.oldLongitude;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapLatitude = undoableChangeLocation.newLatitude;\n state.modelsMapLongitude = undoableChangeLocation.newLongitude;\n });\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n state.modelsMapLatitude = lat;\n state.modelsMapLongitude = lng;\n });\n }\n }\n }\n };\n\n const onZoomChanged = () => {\n if (map) {\n const z = map.getZoom();\n if (z !== undefined && z !== mapZoom) {\n const undoableChange = {\n name: 'Zoom Model Map',\n timestamp: Date.now(),\n oldValue: mapZoom,\n newValue: z,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapZoom = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapZoom = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.modelsMapZoom = z;\n });\n }\n }\n };\n\n const onTiltChanged = () => {\n if (map) {\n const t = map.getTilt();\n if (t !== undefined && t !== mapTilt) {\n const undoableChange = {\n name: 'Tilt Model Map',\n timestamp: Date.now(),\n oldValue: mapTilt,\n newValue: t,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapTilt = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapTilt = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.modelsMapTilt = t;\n });\n }\n }\n };\n\n const onMapTypeIdChanged = () => {\n if (map) {\n const typeId = map.getMapTypeId();\n if (typeId !== undefined && typeId !== mapType) {\n const undoableChange = {\n name: 'Change Model Map Type',\n timestamp: Date.now(),\n oldValue: mapType,\n newValue: typeId,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapType = undoableChange.oldValue as string;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapType = undoableChange.newValue as string;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.modelsMapType = typeId;\n });\n }\n }\n };\n\n const options = {\n styles: [\n {\n featureType: 'poi',\n elementType: 'labels',\n stylers: [{ visibility: 'off' }],\n },\n {\n featureType: 'transit',\n elementType: 'labels',\n stylers: [{ visibility: 'off' }],\n },\n ],\n } as GoogleMapProps;\n\n const openModelSite = (model: ModelSite) => {\n if (model.userid && model.title) {\n openModel(model);\n closeMap();\n } else {\n showError(i18n.t('message.ModelNotFound', lang));\n }\n };\n\n const shareModelSite = (model: ModelSite) => {\n if (model.userid && model.title) {\n const url = HOME_URL + '?client=web&userid=' + model.userid + '&title=' + encodeURIComponent(model.title);\n copyTextToClipboard(url);\n showSuccess(i18n.t('cloudFilePanel.LinkGeneratedInClipBoard', lang) + '.');\n } else {\n showError(i18n.t('message.ModelNotFound', lang));\n }\n };\n\n const deleteModelSite = (model: ModelSite) => {\n Modal.confirm({\n title: i18n.t('message.DoYouWantToDeleteModelFromMap', lang),\n icon: ,\n onOk: () => {\n deleteModel(model, () => {\n // also remove from the cached records\n setCommonStore((state) => {\n if (state.modelSites) {\n const modelsOfSite = state.modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n let key = undefined;\n for (const [k, v] of modelsOfSite) {\n if (v.userid === model.userid && v.title === model.title) {\n key = k;\n break;\n }\n }\n if (key) {\n modelsOfSite.delete(key);\n // if there is no more model, remove the marker from the map\n if (modelsOfSite.size === 0) {\n markersRef.current[selectedMarkerIndexRef.current]?.marker?.setMap(null);\n }\n }\n }\n }\n });\n setSelectedSite(null);\n setSelectedLocation(null);\n });\n },\n onCancel: () => {},\n okText: i18n.t('word.Yes', lang),\n cancelText: i18n.t('word.No', lang),\n });\n };\n\n const likeModelSite = (model: ModelSite) => {\n if (model.userid && model.title) {\n const modelKey = Util.getModelKey(model);\n const liked = !!user.likes?.includes(modelKey);\n likeModel(model, !liked, () => {\n // update the cached record\n setCommonStore((state) => {\n if (state.user) {\n if (!state.user.likes) state.user.likes = [];\n if (state.user.likes.includes(modelKey)) {\n const index = state.user.likes.indexOf(modelKey);\n if (index >= 0) {\n state.user.likes.splice(index, 1);\n }\n } else {\n state.user.likes.push(modelKey);\n }\n }\n if (state.modelSites) {\n const modelsOfSite = state.modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n if (v.likeCount === undefined) v.likeCount = 0;\n v.likeCount += liked ? -1 : 1;\n break;\n }\n }\n }\n }\n });\n setUpdateFlag(!updateFlag);\n });\n }\n };\n\n const getLikeCount = (model: ModelSite) => {\n const modelsOfSite = useStore.getState().modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n return v.likeCount ?? 0;\n }\n }\n }\n return 0;\n };\n\n const getClickCount = (model: ModelSite) => {\n const modelsOfSite = useStore.getState().modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n return v.clickCount ?? 0;\n }\n }\n }\n return 0;\n };\n\n const isPinned = (model: ModelSite) => {\n const modelsOfSite = useStore.getState().modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n return v.pinned;\n }\n }\n }\n return false;\n };\n\n const pinModelSite = (model: ModelSite, pinned: boolean) => {\n if (model.userid && model.title) {\n pinModel(model, pinned, () => {\n // update the cached record\n setCommonStore((state) => {\n if (state.modelSites) {\n const modelsOfSite = state.modelSites.get(Util.getLatLngKey(model.latitude, model.longitude));\n if (modelsOfSite) {\n for (const v of modelsOfSite.values()) {\n if (v.userid === model.userid && v.title === model.title) {\n v.pinned = pinned;\n setUpdateFlag(!updateFlag);\n break;\n }\n }\n }\n }\n });\n });\n }\n };\n\n return (\n \n {/* Child components, such as markers, info windows, etc. */}\n <>\n {mapWeatherStations &&\n cities.current.map((c, index) => {\n const scale = 0.2 * mapZoom;\n return (\n \n );\n })}\n {selectedSite && selectedSite.size && selectedLocation && (\n \n {\n setSelectedSite(null);\n setSelectedLocation(null);\n }}\n >\n {selectedSite.size > 1 ? (\n \n {ascendingOrder ? (\n {\n setAscendingOrder(false);\n }}\n />\n ) : (\n {\n setAscendingOrder(true);\n }}\n />\n )}\n \n {selectedSite.size} {i18n.t('modelsMap.ModelsFoundOnThisSite', lang)}\n \n {selectedLocation && (\n \n  —{' '}\n {i18n.t('word.Coordinates', lang) +\n ': (' +\n selectedLocation.lat().toFixed(LAT_LNG_FRACTION_DIGITS) +\n '°, ' +\n selectedLocation.lng().toFixed(LAT_LNG_FRACTION_DIGITS) +\n '°)'}\n \n )}\n \n ) : (\n ''\n )}\n {[...selectedSite.keys()]\n .sort((a, b) => {\n const modelA = selectedSite.get(a);\n const modelB = selectedSite.get(b);\n if (modelA?.pinned && !modelB?.pinned) return -1;\n if (modelB?.pinned && !modelA?.pinned) return 1;\n return (ascendingOrder ? 1 : -1) * ((modelA?.timeCreated ?? 0) - (modelB?.timeCreated ?? 0));\n })\n .map((key: string, index: number) => {\n const m = selectedSite.get(key);\n if (!m) return null;\n return (\n 1 ? '5px 5px 20px 5px' : '5px',\n background: index % 2 === 0 ? 'white' : '#eeeeee',\n }}\n >\n {index === 0 && (\n
\n {m.countryCode && (\n \n )}\n {m.address ?? 'Unknown'}\n {selectedSite.size === 1 && (\n \n {i18n.t('word.Coordinates', lang) +\n ': (' +\n selectedLocation.lat().toFixed(LAT_LNG_FRACTION_DIGITS) +\n '°, ' +\n selectedLocation.lng().toFixed(LAT_LNG_FRACTION_DIGITS) +\n '°)'}\n \n )}\n
\n )}\n \n \n {m.label}\n {isPinned(m) && }\n \n }\n key={index}\n style={{ fontSize: '12px' }}\n >\n
\n \n {m.thumbnailUrl && (\n openModelSite(m)}\n />\n )}\n
\n {m.description && m.description.trim() !== '' ? m.description : ''}\n  —  By{' '}\n {\n selectAuthor(m.author);\n }}\n >\n {!m.author || m.author === '' ? i18n.t('word.Anonymous', lang) : m.author}\n \n , \n {m.timeCreated && }\n
\n
\n
\n \n \n
\n {ifiUser && (\n <>\n {isPinned(m) ? (\n pinModelSite(m, false)}\n />\n ) : (\n pinModelSite(m, true)}\n />\n )}\n \n )}\n openModelSite(m)}\n style={{ marginLeft: '10px', cursor: 'pointer' }}\n title={i18n.t('word.Open', lang)}\n src={OpenFileIcon}\n height={imageSize}\n width={imageSize}\n />\n shareModelSite(m)}\n style={{ marginLeft: '5px', cursor: 'pointer' }}\n title={i18n.t('word.Share', lang)}\n src={ExportLinkIcon}\n height={imageSize}\n width={imageSize}\n />\n {m.userid === user.uid && (\n deleteModelSite(m)}\n style={{ marginLeft: '5px', cursor: 'pointer' }}\n title={i18n.t('word.Delete', lang)}\n src={DeleteIcon}\n height={imageSize}\n width={imageSize}\n />\n )}\n {user.uid ? (\n <>\n {user.likes && user.likes.includes(Util.getModelKey(m)) ? (\n likeModelSite(m)}\n style={{ marginLeft: '10px', cursor: 'pointer' }}\n title={i18n.t('word.AlreadyLike', lang)}\n src={RedHeartIcon}\n height={imageSize}\n width={imageSize}\n />\n ) : (\n likeModelSite(m)}\n style={{ marginLeft: '10px', cursor: 'pointer' }}\n title={i18n.t('word.Like', lang)}\n src={EmptyHeartIcon}\n height={imageSize}\n width={imageSize}\n />\n )}\n \n ) : (\n <>\n \n \n )}\n    {getLikeCount(m)}\n \n    {getClickCount(m)}\n
\n \n );\n })}\n \n
\n )}\n {!!modelSites && !!modelSites.size && (\n \n {(clusterer) => (\n
\n {[...modelSites.keys()].map((key: string, index: number) => {\n const m = modelSites.get(key);\n if (!m || !m.size) return null;\n const keys = [...m.keys()].sort((a, b) => {\n const modelA = m.get(a);\n const modelB = m.get(b);\n if (modelA?.pinned && !modelB?.pinned) return -1;\n if (modelB?.pinned && !modelA?.pinned) return 1;\n return (ascendingOrder ? 1 : -1) * ((modelA?.timeCreated ?? 0) - (modelB?.timeCreated ?? 0));\n });\n const model = m.get(keys[0]);\n if (!model) return null;\n const iconUrl = getIconUrl(model);\n return (\n (markersRef.current[index] = e)}\n clusterer={clusterer}\n icon={iconUrl ? { url: iconUrl } : undefined}\n position={{ lat: model.latitude, lng: model.longitude }}\n onClick={() => openModelSite(model)}\n onMouseOver={(e) => {\n previousSiteRef.current = selectedSite;\n selectedMarkerIndexRef.current = index;\n setSelectedSite(m);\n const c = key.split(', ');\n setSelectedLocation(new google.maps.LatLng(Number.parseFloat(c[0]), Number.parseFloat(c[1])));\n }}\n onMouseOut={(e) => {\n if (selectedSite === previousSiteRef.current) {\n setSelectedSite(null);\n setSelectedLocation(null);\n }\n }}\n />\n );\n })}\n
\n )}\n
\n )}\n \n \n );\n};\n\nexport default React.memo(ModelsMap);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVERweICJESgAAAktJREFUWIXtV02rElEYfo+pdEXq0iKNksQvdBARRjAcPxZ+3EXrFrfWzfkDUb+h/sGcVUS0aN0iFDQ3ttFwKWPIEAVtYtJwiCszp4V4mSvqeEbLxe1dnfOc532fhzPvmZmDKKVwyHAcVP1fGMAY01Kp9PRgBgAA4vH4c4zxymf91wwghLyxWOy2GcMYU4TQ1Qu8fTUhQshbq9UeBoNByYrbarXuyLL8DQAAAcCx3+93bSMynU6NyWTyYxmvVqv3Q6HQOxbDw+Ew02w2e05RFFWWRITQNUrpr8VcEITHyWSSsNQAAIhGo91cLldm7gGe589zyuXyAzvi5mA20Ov1zgAAMplMOBKJvLUrrChKptPpNJ1mUJIkZJUoSfMe43n+s11xcxM6rcirolAonHIct3ZdluUnuq5/nc1m31Op1AfzGiHkiFL6ezFnNoAQcoqi+GYZVxQF1+v1l5TSMzOOMT4fS5KEFjto20A+nz9dxkaj0d1Go/FlXc5gMHjWbrdfrFpjNsBx3CvznBByhVJqrONb9RXTKchms/eWi28S3yaYDKTT6Y9m8V2EmQ0ghI72Lc5koFKp8AAAhJDrm3iBQOAGxphijGmxWDyxqrt1E6qq+okQ4qWUTjfxfD7fzcU4kUi8h/kHb3cD3W5X24anaZq+bU2Ay/BP+N/A5TOgqupPFv6FYygIwiOPx0M1TbN80xmGQR0OB1rGwuHwLdsGksnka5bkfcTBe8DZ7/dPXC7Xsa7PX2CLbTUMY6cbi9vthvF4LFvx9nYzsht/AFhGzatwKRNAAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDzUx0EsoOwAAAotJREFUWIXtl7FP20AUxr9LXhLrFKXHwNB4oiAStXFlC4kFAVmtWAJPUYfOoCydOiA2hMTAH8Cf0JU1AysSohLq0LAVPHRDSmshyHCX65A4SRGFKIkpA59k6WQ/v+93d7p3d8CIWllZMYUQ50KI88XFRXPUPCPJtu05znkAQAPQnPPAtu25JzF3HGd20HwQwnGc2VjN7/b8PojYRuKueT6fPyIilU6nVT6fP4oVYmFhYZ5zfol+bzdqtdqSYRjaMAxdq9WWAGwwxiKIy1KpND8Rc9/3E5zzRmSeSCS2AMDzPC8C8DzPA4BkMrmF/kg0fN9PTIKBZTKZUyLSXQMAgOu6axGA67pr0ftkMrlFRDqTyZwCYI8lH4ZQl8tl1zRNWym191iwUmrPNE27XC676IzGg6IhAFCv168AXA0TCwBBEHwLgmCo2InM0Th6AXgBeDYAaSHErhBiM25DIcSmEGIXQLoHUCwW/TAMt1ut1kGlUoltX69UKnOtVusgDMPtYrHo9wCEEK8BIJVKIZvNTscFkM1mp1OpFAY9EwCglJIAoLUGY0zFBcAYU1p3qnPkOVQpvk9SSmq32732qHlG/jEMw69E9CtqPznAyclJsL6+XgKAw8PDn08OMK5xpGdTiP47AAMAxhiIxpqVB0VEYKx3SmM9gHZ3PSmlIKW8jQtASnmrVKfMRJ4AgEKhsEpEGoCempr6FBdAN7cmIl0oFFaB7iqwLOs4CIKGlPJts9ncz+Vy78Mw/D5J81wu967ZbH4EACJqVKvV452dnX6AZVnLnPNr/OPaNanHMIxry7KWI9+/zu2O47y5uLj4zBj7cHNz86q7N4zV8ygH5/y31vrLzMzM/tnZ2Y/o+x/AkgU3TshK/QAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYDi8RWsqYHwAABAtJREFUWIXlls1rXFUYxp9z7ufcyXykM8lkJiRpvtpUNFFrSEVcTE2htCpk48aCoAuz6UoQdF0VceVGEFfWP0AXIlIkLqTQIhQRXNkP1FBJMkmTzGRm7ufj4nYmmY9MkyZxoQ+8XLj3nPN7n/fce+4L/N8l2t3cmJwe91YWXzKBM35hVYskuuGk4n8Wo7Fv+m7dutlpwcLEUzPq5so5w3ZPBcUtyL606+rmjcrYwLXM9z/e7ZjNbxdnx0q5vq9d03SoqCQECYShKKRp0s9kf15+/sULzXP/OpfPV3v7b7A7TWp6OEeAlILUNTqWtVXK9n92e/6dnrbw5adfOF9OJgoU29BgR3BndMVYyPZfrrs+OX056MuEc3SddjxGR1PpNc9XJMup1J2NV16baYAvnnpuqhpLlNkECtpc64upGldGRy8t5WcvMdHd8NzRNdqJOB1N0m8zt5pOra3lLwyGdFJUksd+pRAtoE5BgKVU0iv29njNFfMBug8rYauy0YgIYzObWwjdT06+TE1rAfsd4D5AO2rRjUfabldtjKPrrMZjtBVRh9craOr8e2pqWnYvr74OzwObvoe2nwcAAvAsA74ElJJdv9csAUBxHChVG4xY8FSlYQ3YLsyllbckPDsf5vQo9EN41AQ1FXqpDBEQ7DBeAJCOA9V24Ma74EsBAUAIACQMz5kTZdNkpFrd1UmjcxOBqkErlqCQHcc3yzV0CE0HKmVoQRCuaRqQnuftDR41QVWBvrkFhftBh9JsB9J24CVi8BUJCAm6LmREj3RMgAB8y0SgqFCLZUgE4CMS3k3SdaBsVRBEonBJyGQK0o3od8PFWveSAFzLQKAq0IvlfZe9ncJKVCGiBkqGeU+6gbcg6rhGuGeZgKqFzhkcEL0t6bhQHR9uxLomvXT2B6hKi38KARkE0IpbdecHdV+TAICA8BV8K38fjX3nqFqpOQFBQq06kDh42dupYuml0vmZnwAA67n+Lyjlno/hgwYBFoeHPgcACQAbz8x8aHdZlSMw2iIBoBJLPtgcGHq/4UFhcPhNGuaRVoEAaURYeHbmjbbZrY+MfEm19cd0eHCND3LHP+hYovVc9ipV5VCTqP39SifHr2Ivp+jy6PGvaB7OdoSdkODG8NCne31PwnfixMTHNIx6b/fYcCvC1Wzu3X3Ba1oayc3ZyUSFcu+dUh0MsHosWbk/MTL3WPCa7s/OnraTqetU9nZO1DrocrL35h+zr54+ELwuUqwNDX7kW9auLVgN7psm1wcGPllYuGccDnyHVp+cOFNJp6/T3H43KLa7ZCeT+WVlcjJ/6OCdmiPl6tjI2253cpGqTiqCbtxa3hwff+9IXO+m2/PzPcUTT1zZyGWu3Dl7tvdfA//n9A8HQo97kdEpRwAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wIYEwsXVr/srwAAAYVJREFUWIXt1D8vQ1EYBvDnvOf0372twTdoYuJLEIPBZLFIDFaNCZMBaSwkhg6d7VJrox/ApiEhKW1ViQhXRWh7b3vvey3CJLmC0+U+y1nOe55fTk6OQMCsbO7mjKSR8TxGRIrs/MxUNp1OO0HnvwsF3XjZaKBSvUL59Aymaax1u97Ib8t/BCBBICJISXD7fTAzawX8V0JACBg4QOkq2srlhiMqNRFNJNCyrLuN5cUjQOMN1Jut0bvH5/1a43a/1+NioVia1gq4v39wm80bVKs1+IKGSKhxrQAVUZBSQikFZg/w/Y5WwLcwACiUSsPH5UoeoDFmDz23O7eztnqiDSBZLTHk7EWtjngshrfXTlJH+SeAmaXb78OxbQjfB4Tn6QIQAAgh+GOFEEJX9xdgkPmTn9D3faxv5yejZmKBALTb7cPsamZPG6BcPh+Jx6MHldp1yjBNvLSeHAD6AEQipqKRlGVZSNoObLvbDjz7FwClFHuuCyICkQCJ4McO/BGGgBAQAkLAO6uZiizcGAzsAAAAAElFTkSuQmCC\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\nimport { Drawer, Empty, Input, Space } from 'antd';\nimport { ModelSite } from './types';\nimport { LeftCircleOutlined, RightCircleOutlined } from '@ant-design/icons';\nimport { getIconUrl } from './components/modelsMap';\nimport ImageLoadFailureIcon from './assets/image_load_failure.png';\n\nexport interface ModelsGalleryProps {\n author: string | undefined; // if undefined, the user is the owner of models\n models: Map | undefined;\n closeCallback: () => void;\n openCloudFile?: (userid: string, title: string) => void;\n}\n\nconst ModelsGallery = ({ author, models, closeCallback, openCloudFile }: ModelsGalleryProps) => {\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const modelsMapType = useStore(Selector.modelsMapType);\n\n // make an editable copy because models is not mutable\n const modelsRef = useRef>(models ? new Map(models) : new Map());\n // set a flag so that we can update when modelsRef changes\n const [recountFlag, setRecountFlag] = useState(false);\n const [selectedModel, setSelectedModel] = useState();\n const [ascendingOrder, setAscendingOrder] = useState(false);\n\n const { Search } = Input;\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n useEffect(() => {\n if (models) {\n modelsRef.current = new Map(models);\n setRecountFlag(!recountFlag);\n }\n }, [models]);\n\n const countModels = useMemo(() => {\n let count = 0;\n for (const v of modelsRef.current.values()) {\n // when author is defined, all the models belong to him/her\n // when user is undefined, we only count those that belong to the current user\n if (author || v.userid === user.uid) count++;\n }\n return count;\n }, [modelsRef.current, author, user.uid, recountFlag]);\n\n // use a dark theme when the map is in the satellite mode to match the color\n const dark = author && modelsMapType !== 'roadmap';\n\n return modelsRef.current.size === 0 ? (\n {\n closeCallback();\n }}\n >\n \n \n ) : (\n \n {ascendingOrder ? (\n {\n setAscendingOrder(false);\n }}\n />\n ) : (\n {\n setAscendingOrder(true);\n }}\n />\n )}\n {\n if (!models) return;\n modelsRef.current.clear();\n for (const [k, v] of models) {\n if (v.label?.toLowerCase().includes(s.toLowerCase())) {\n modelsRef.current.set(k, v);\n }\n }\n setRecountFlag(!recountFlag);\n }}\n />\n \n }\n mask={false}\n headerStyle={{\n height: '40px',\n color: dark ? 'white' : 'black', // doesn't work\n background: dark ? '#6A6B6E' : 'whitesmoke',\n paddingLeft: '1px',\n paddingRight: '1px',\n paddingTop: '16px',\n paddingBottom: '12px',\n border: 'none',\n }}\n bodyStyle={{ padding: '0px 4px 0px 4px', overflowY: 'hidden', background: dark ? '#2A2B2E' : 'white' }}\n title={(author ?? i18n.t('modelsMap.MyPublishedModels', lang)) + ' (' + countModels + ')'}\n placement=\"bottom\"\n visible={true}\n height={'164px'}\n onClose={() => {\n setSelectedModel(undefined);\n closeCallback();\n }}\n >\n \n \n \n {[...modelsRef.current.keys()]\n .sort((a, b) => {\n const modelA = modelsRef.current.get(a);\n const modelB = modelsRef.current.get(b);\n if (!modelA || !modelB) return 0;\n return (ascendingOrder ? -1 : 1) * ((modelB.timeCreated ?? 0) - (modelA.timeCreated ?? 0));\n })\n .map((key: string, index: number) => {\n const m = modelsRef.current.get(key);\n if (!m) return null;\n // only show the models that belong to the current user when author is undefined\n if (!author && m.userid !== user.uid) return null;\n return (\n \n );\n })}\n \n \n
\n
\n {\n (event.target as HTMLImageElement).src = ImageLoadFailureIcon;\n }}\n alt={m.label}\n title={m.label}\n src={m.thumbnailUrl}\n style={{\n cursor: 'pointer',\n borderRadius: selectedModel === m ? '0' : '10px',\n border: selectedModel === m ? '2px solid ' + (dark ? 'goldenrod' : 'red') : 'none',\n marginRight: '4px',\n }}\n onClick={() => {\n setSelectedModel(m);\n if (openCloudFile) {\n // provided when displaying current user's models\n openCloudFile(m.userid, m.title);\n } else {\n // go to the location on the map when the map is open\n setCommonStore((state) => {\n if (m) {\n state.modelsMapLatitude = m.latitude;\n state.modelsMapLongitude = m.longitude;\n state.modelsMapZoom = 17;\n }\n });\n }\n }}\n />\n {/* the following div is needed to wrap the image and text */}\n
\n \n \n {m.label ? (m.label.length > 30 ? m.label.substring(0, 30) + '...' : m.label) : 'Unknown'}\n \n
\n
\n
\n \n );\n};\n\nexport default React.memo(ModelsGallery);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wMLDhEG5xDXZAAAAwVJREFUeJzt3aFy6kAAheHTO53ZqqDWEUVV4uLiFpVVwcXxKhV9JByqdTieABQ8QVxUryozDFCgDbun9HwuzUB28pNkE9rpw8fHB4THv9gDkH0KQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUhoyBkFISMgpBREDIKQkZByCgIGQUh83jrDby+vt7Nr9e/vLw83HobOkKuEOLDpSBkFISMgpBREDIKQoY6iLUWxpjYwwjq5vch3+GcQ1EUu+W2bfH29ob1eh1xVGHQHSFlWe7FAIAkSeC9R5IkkUYVDl2Q4XB49OfGGDw/PwceTXh0QdI0PbnuL1xP6IJsNpuT67quCziSOOiCbLfbk+tWq1XAkcRBF2S5XB7s+K7rMJ/P0bZtpFGFQzft7boOs9kMSZJgMBgA+Po0dm/ognxq2/bHR4QxBsaYX3Vk0Z2y+lTXNabTKay1sYdysbsNUlUV0jSFMQbe+18zZb7LIFmWIc/z3bK1Fk3TRBzR5eiDXHu6GQ6H8N4ffZ+qqvoa1s1QBynL8qprgLUWk8nk5Po8zw+ek7GhDZJlGcqyBAA0TXP2waIxBpPJ5Oy1wjmH0WjU2zj7RhnEWovxeLxbvmRnXxLtk/eeduZFF8QYg6ZpDna+tRZ1XR99TVVVV+3gU9tgQBXk3I5K0/TgwlyW5d6Mqq9txUIV5JJPep7nyLIMwP515justXDOffv1t0Dz6MQ5d/EXUN57PD09/SjGpzzP0XUd3t/ff/xefaA4QrIsu3o66pzr7XRTFMXuqIstepBTN3Khscy8ogY5dyMXWtM00aNEC8L40I9hTNGC1HUd/dN4zFf3OyFEm2Vtt9svvz//q6IFWSwWsTZNLfosS/YpCBkFIaMgZBTkCiH+LPpB/6WNi44QMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSGjIGQUhIyCkFEQMgpCRkHIKAgZBSHzH/ERhEFb2CeRAAAAAElFTkSuQmCC\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\nimport { Libraries } from '@react-google-maps/api/dist/utils/make-load-script-url';\nimport { StandaloneSearchBox, useJsApiLoader } from '@react-google-maps/api';\nimport Spinner from './components/spinner';\nimport { Checkbox, Empty, Input, Space, Tag } from 'antd';\nimport ModelsMap from './components/modelsMap';\nimport { UndoableChangeLocation } from './undo/UndoableChangeLocation';\nimport { DEFAULT_ADDRESS } from './constants';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\nimport { ModelSite } from './types';\nimport ReactCountryFlag from 'react-country-flag';\nimport { VerticalAlignBottomOutlined, VerticalAlignTopOutlined, UserOutlined } from '@ant-design/icons';\nimport ModelsGallery from './modelsGallery';\n\nconst libraries = ['places'] as Libraries;\n\nconst Container = styled.div`\n position: absolute;\n top: 70px;\n left: 0;\n display: flex;\n width: 100%;\n height: calc(100% - 70px);\n flex-direction: column;\n align-items: center;\n z-index: 999;\n tab-index: 0;\n background: white;\n`;\n\nexport interface ModelsMapWrapperProps {\n openCloudFile: (model: ModelSite) => void;\n deleteModelFromMap: (model: ModelSite, successCallback?: Function) => void;\n likeModelFromMap: (model: ModelSite, like: boolean, successCallback?: Function) => void;\n pinModelFromMap: (model: ModelSite, pinned: boolean, successCallback?: Function) => void;\n}\n\nconst ModelsMapWrapper = ({\n openCloudFile,\n deleteModelFromMap,\n likeModelFromMap,\n pinModelFromMap,\n}: ModelsMapWrapperProps) => {\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const modelsMapType = useStore(Selector.modelsMapType);\n const modelsMapLatitude = useStore(Selector.modelsMapLatitude);\n const latitude = modelsMapLatitude !== undefined ? modelsMapLatitude : 42.2844063;\n const modelsMapLongitude = useStore(Selector.modelsMapLongitude);\n const longitude = modelsMapLongitude !== undefined ? modelsMapLongitude : -71.3488548;\n const address = useStore.getState().modelsMapAddress ?? DEFAULT_ADDRESS;\n const mapWeatherStations = usePrimitiveStore(Selector.modelsMapWeatherStations);\n const showLeaderboard = usePrimitiveStore(Selector.showLeaderboard);\n const latestModelSite = useStore(Selector.latestModelSite);\n const modelSites = useStore(Selector.modelSites);\n const peopleModels = useStore(Selector.peopleModels);\n\n // make an editable copy because models is not mutable\n const peopleModelsRef = useRef>>(peopleModels ? new Map(peopleModels) : new Map());\n const [selectedAuthor, setSelectedAuthor] = useState();\n const [updateFlag, setUpdateFlag] = useState(false);\n const authorModelsRef = useRef>();\n const searchBox = useRef();\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const { Search } = Input;\n\n useEffect(() => {\n peopleModelsRef.current = peopleModels ? new Map(peopleModels) : new Map();\n if (selectedAuthor) {\n authorModelsRef.current = peopleModels.get(selectedAuthor);\n }\n setUpdateFlag(!updateFlag);\n }, [peopleModels, selectedAuthor]);\n\n const selectAuthor = (author: string | undefined) => {\n setSelectedAuthor(author);\n usePrimitiveStore.setState((state) => {\n if (!state.showLeaderboard) state.leaderboardFlag = true;\n if (author) authorModelsRef.current = peopleModelsRef.current.get(author);\n });\n };\n\n const { isLoaded, loadError } = useJsApiLoader({\n id: 'google-map-script',\n googleMapsApiKey: process.env.REACT_APP_MAPS_API_KEY as string,\n libraries: libraries,\n });\n\n const close = () => {\n usePrimitiveStore.setState((state) => {\n state.openModelsMap = false;\n });\n };\n\n const onLoad = (s: google.maps.places.SearchBox) => {\n searchBox.current = s;\n };\n\n // FIXME: Undo doesn't change the value of the input field\n const onPlacesChanged = () => {\n const places = searchBox.current?.getPlaces();\n if (places && places.length > 0) {\n const geometry = places[0].geometry;\n if (geometry && geometry.location) {\n const undoableChangeLocation = {\n name: 'Set Model Map Location',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: geometry.location.lat(),\n oldLongitude: longitude,\n newLongitude: geometry.location.lng(),\n oldAddress: address,\n newAddress: places[0].formatted_address as string,\n undo: () => {\n setCommonStore((state) => {\n state.modelsMapLatitude = undoableChangeLocation.oldLatitude;\n state.modelsMapLongitude = undoableChangeLocation.oldLongitude;\n state.modelsMapAddress = undoableChangeLocation.oldAddress;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.modelsMapLatitude = undoableChangeLocation.newLatitude;\n state.modelsMapLongitude = undoableChangeLocation.newLongitude;\n state.modelsMapAddress = undoableChangeLocation.newAddress;\n });\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n if (geometry.location) {\n state.modelsMapLatitude = geometry.location.lat();\n state.modelsMapLongitude = geometry.location.lng();\n }\n state.modelsMapAddress = places[0].formatted_address as string;\n });\n }\n }\n };\n\n const ifiUser = user.email?.endsWith('@intofuture.org');\n\n const modelSitesCount = useMemo(() => {\n if (!modelSites || !modelSites.size) return 0;\n let count = 0;\n for (const value of modelSites.values()) {\n count += value.size ?? 0;\n }\n return count;\n }, [modelSites]);\n\n return (\n {\n if (e.key === 'Escape') {\n close();\n }\n }}\n >\n {isLoaded && (\n \n \n \n \n \n \n \n )}\n {isLoaded ? (\n \n ) : (\n \n )}\n {loadError && (\n \n
Map cannot be loaded right now, sorry.
\n
\n )}\n <>\n {selectedAuthor && (\n {\n setSelectedAuthor(undefined);\n authorModelsRef.current = undefined;\n }}\n />\n )}\n {showLeaderboard && !selectedAuthor && (\n \n \n {\n if (!peopleModels) return;\n peopleModelsRef.current.clear();\n for (const [k, v] of peopleModels) {\n if (k.toLowerCase().includes(s.toLowerCase())) {\n peopleModelsRef.current.set(k, v);\n }\n }\n setUpdateFlag(!updateFlag);\n }}\n />\n {peopleModelsRef.current.size === 0 ? (\n \n ) : (\n \n \n {[...peopleModelsRef.current.keys()]\n .sort((a, b) => {\n const countA = peopleModelsRef.current.get(a);\n const countB = peopleModelsRef.current.get(b);\n return (countB ? countB.size : 0) - (countA ? countA.size : 0);\n })\n .map((key: string, index: number) => {\n if (index > 50) return null;\n const a = peopleModelsRef.current.get(key);\n if (a?.size === undefined || a?.size === 0) return null;\n return (\n \n \n \n \n );\n })}\n \n
\n }\n color={a?.size > 10 ? 'gold' : a?.size > 5 ? 'lime' : a?.size > 1 ? 'blue' : 'magenta'}\n style={{ cursor: 'pointer', fontSize: '10px', fontWeight: 'bold', width: '130px' }}\n onClick={() => setSelectedAuthor(key)}\n title={key}\n >\n {key.length > 16 ? key.substring(0, 15) + '...' : key}\n \n {a?.size}
\n )}\n
\n \n )}\n \n {\n usePrimitiveStore.setState((state) => {\n if (!state.showLeaderboard) state.leaderboardFlag = true;\n state.showLeaderboard = !state.showLeaderboard;\n });\n }}\n >\n {showLeaderboard ? (\n \n ) : (\n \n )}\n {i18n.t('word.Leaderboard', lang)}\n \n \n {latestModelSite && (\n \n {\n setCommonStore((state) => {\n if (latestModelSite) {\n state.modelsMapLatitude = latestModelSite.latitude;\n state.modelsMapLongitude = latestModelSite.longitude;\n state.modelsMapZoom = 20;\n }\n });\n }}\n >\n {i18n.t('word.Latest', lang) + ': '}\n {latestModelSite.countryCode && (\n \n )}\n {latestModelSite.title + ', by ' + latestModelSite.author}\n \n \n )}\n \n {\n close();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n \n {ifiUser && (\n \n {\n usePrimitiveStore.setState((state) => {\n state.modelsMapWeatherStations = !state.modelsMapWeatherStations;\n });\n }}\n >\n {mapWeatherStations ? (\n \n {i18n.t('mapPanel.WeatherStations', lang)}\n \n ) : (\n {i18n.t('mapPanel.WeatherStations', lang)}\n )}\n \n \n )}\n \n \n );\n};\n\nexport default React.memo(ModelsMapWrapper);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWADQTDJ/w9AAAAltJREFUWIXt1ktoVFccx/HP30xIZoJGgiDJorRZZtPFxWSrK3HhA0vA0oXLUPex62IXQqEWu1FBUSylVRe+qjvRRfFRke581hTbqqkIVq2gm+NiTmGYxJk78YWSA//NPef+v7/7f50bKSVvcy14q/R5AfMCXkZARIxGxJGI2BsRo29EQERUI2Kir6/vIg5juqurq4bDEXEsItZ0rCCl1NYwhC9xE39gsiiKwYb9QXyL+/gNk1hUyncb8Bh+wj1cwFp0tTi/GBtxFnfxHT7oSMD4+HgVG3Aat3EIY2W+pknMapzANI5heUsBRVEM5tBN4Xp/f/9WDHYKnkXIxzk993AJn2Jhw74RbM3gs/gMlZcFzyJkKTbnGrkSEVuwCJ7WarWEyVcNbSHmx0qlknANnlQqlX24il9ziHpfA3QhNuVivtLT0/NDb29vgkdIDXYNf+ELDL0C8IfYkQv6fBPrCfzX9PB/O4M/sQujcwAvz11wBydfwHgsq5htMyFVq9UD+BensKoNtIaJXO13sa2VbzzT5kCzTeFGTk9jK32UW+0GLpf0tR9PYWUuvtsDAwMHSr58AX/j61qttjOH+ZeS7x7MdXYUY43hG1OfWA9b5KzZHnZ3d18sefZcFr0dwzMmYYOQEXyFmxEx1WGKmu0b3MLv2FwUxZIZvBcVVL4TJtRbZxp7OgAfwgP1+2R9y8It2VIrcDyn5+c2Yf5HvXWXlfEdGVBqRcQIPse6DBpSnxXdqGI3vk8p3SntdC7TbXh4uF/95ryk3kGfpJRiLr46isDrWO/uX/G8gPdGwHPDy+8U7lOg5AAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER0qAOBQywAAAilJREFUWIXt1s+LT2EUx/HXM77mh4YZopD8ygJTRlJWioXCiGTBko1YKFbsULJgYafxD1hYYWFhQ0SDRDZKVvwDQvk1HIv7TL70veZ+ry82c+punvuc83nf85x7nsOU/W+LiLYfdOMInmEM+9A1iU9L62oHNqXUSCkdyKINbMBWrMRYSml/SqnR8Qxk0H14iJPob7FnEKfwBIfQXSUDVcR34j7OY26F/f04oTieo+irBYBNuItRLKhRJxMgzzNIdQCsQOAMGnUKNcdZhZt40y7A2gwQeIn97YBgHi7iBtbg6p8AVAZBL47jHrY3rXcEoBQESfGXPFD8AY1f4nUU4FeQzbiFs5hVEu+vAEw8T7F4kpooBWirE5bY04h4Vde5DOBt3YCdAvj2vwH+mU0BlAEM4EMnBFJKhzFc9v6n4SGlNISFWIJj2IFtmFZDeASX8A67fwuQUlqvuEDmKMataYr2eg23Fd1upKLwOlxWXMcHI+JGXm8NkFIaxqIM8C1Dfc0gX/Ee1/EYGzNMK+FBxf2/BRci4lIl4IiQ57g9mIE+xfn3ZoDIUJ/y2gzsxfoc44piVNuDcxHRsu2WZSA1j0sppeU58KDiCALjWfgjevBFUbyLsQvzcRqjETFe+qVVAJo2b1IUYm8W7PEjG9MzwEw8wp2I+FwmXAsgO8xWZGNZXpr4+gG8wLWIqNyy2wZochzCaizF6yzcdo+oDZCd+9ATEeXDZU2AKfsOfE5h6rHXy3UAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUASkVsVubYQAACG5JREFUWIXFV2tsHNUZPffOzuzsw6/Y+/b7sd5l11mv7WBjsA2lgNoS0RqkNA/cuigIBQJqKypQJUutKqqWtkIIhaJQFUwLInWSBlAJqFFiRySNm9itE4GTBcdQ23Fi4l3vw7uze+/c/kjigpOY8JB6fs3cOec7537zuHOB/zPI5yG3t7d7M9nM15PxZCjHWG0ikQAlBGarlRGIcbM176i9uPid/fv3T3ylAarqqr4pGH6kZbVOIYTMOf+fWlw8JASEUBCCtGpS99nttmeHDw//7UsFCIVC183HYk9lc9nbOGOQJAkEBLJimJAMhomCvHymCyC2EDMIrntzLFcuhICAgGyQYVSNf7W5PD8cPnhw8nMHCAQC987HotsYY1ZCKUyqOq2qpu0FeXm7h4eHx5bzhRDw+0ONuVxq3WJ68V6u6x4hBBRFmbeYzBtPnTq195oDuMrKHgBnzzLOIcsGXlhY+MueTT1PPvbYY3EAuOmmm6riqXiAaSyfUgpVVeNms3l0aGhoGgA6OzsLZs/N/iyZTD2iZTUYFRV1NTWbBwcHn//MAO3trRsnJj/6E2MMiixPlXpKe4aHh/cDQHNz83fT6fQ6EGLWBf8gk9YazFazKrgYZZx7FEXJZFlmW+S9yD4ACIaCd308d/4lznmewSBxW7HttrGxsf1XDdDc3OyNJxL/ynFm4rncedWotkQikcm6uroqxtkfdCLcBQWresZGRoYBwFVaur6kqAjHjx9/RQiBNWvW3LqQiL+qc35E5/r3T58+PXfd6tU3Rs9/vDfHclbVqM5VV1b5h4aGzl/ypJ8McHZu7uloLGqiILymuqY7EolMBhobb9CF2EMk8pzFZHlPoXTuEl8CdkWj0V3AhbcgFovNybJhv9FkfslkMj3R1tYWfHds7B2n3XGfIivQNM02Mzvz9Cc9lwKsWbPmDs7ZHZRS6Jz/6sCBA0Otra01mVRqu9Pj2ToRmXjV7XQ9DGDhkmZqakqbmprSLp1bLJaZlqaWTefOneNEIgvz8/Nb/X5/0ejo6A5VNfUTQpBOZzZ0dXU1X/bgVddUv21z2IXL4z5zzz33WAAgEAwOtXe0d19GXgEuj2trZU31awBQX1+/tbKqcgAAOjrCTpfbFbc7HaLWW/vCpzqwbt266mw2dzMAWK15LwwMDKTC4fDaZCrpOn/u/Lf9fr/jWswbGkK/MSrqww3XBTZUeL0VXIibudCbfD5f08GDo7MGg7xDAEgvZtb29vZalwKcOHHiRsaZLMuyXup2/wUAkqnk5qKCwvUWi+UpANnPMq+sqnwilU7+uHjVqltef/31JM3l0hIhj1ss5q05ltsKAOa8vB2UUjDOVh0+fLhpSVxWUfFrm9MhyirK/yOEgM/nc3p93jeFECuabt682dDX12fxlHl+7va4RdP1Ta3LOXfeeaep3l//Vmtrq3rXXT0FLo877nA5hdfn/clSBxRFDkAIEEreJ4TAaDS2yUbjaUKu/qWu9/t739z75vSL/S/Ocq7/ND8vv3tkeOTIct4bb7yR5kJMnzlzxrdnT/+CohinhRDIZDLlSwEWUykLIQRWs2URADTG8iRCA01NTZs7OjqMy4tu2rTJlkwmnjeZTb8oKCzYLhvk6Pj4+O7lvN7e3pK29raHhC6qCktK7ACQTi9+SCnFwsICWwrAhdAFBMjFKUsSkEwmtdnZ2SvO3maz6aqqIhlPnkyn0qd1IUw9PT2XBZ2JxzEzM4tsVhMG6cIY03UOAKqiGgHAAAD5+fksvrCARDxxkSal8vPzxife/2D7zMzMp4oeOnRI7b67+0nVZKImi/mtTFZLWa3mh/r7+zUsw1s7d34M4JlarzcYjSWiAGAxmUo1TYOqqljqgM7ZSQAQQL0QAgaT6VgqlSpdXnD9+vWFvffdt08Q9GpZ7VSZpzR44w3tdSffO/nHK7YKgM/nkw0GWt0cCp3csmWLhTFWBgKYLaYzSx2goMdAAMZZWVdXV/DfR46cqK6ulsLhsK+wsHCRUhrbt29fnEQJz2Yyi4qsaPYS29rBwcFTVzMOBoOFVqtV1jhvyKYXFwcGBuKhUKgLQBGlFAZq+OdSB5xO56BEJcY5p3Nzc3cDgMFg+HM8mdh19uzZbaqqFgPAy3tfTjz44INr/fW+648dO3ZVcwCYjcVWRWPRl1Pxhd/rRH8aABYSibs554DAfE1NzaFPCcrKyw+UOOyitLxsYkdfnwwA4XC4u6ury7KS0UoIhUIlgUDgdgBYf//9xZ6y0pjNaRcVVRWvXEZeHV79HXeZRzhcThFoCDz+RU2vhpra2qfsLoewOx3C6/W2XEYQQshV1dUjJfYS4S71LHZ2djZ+VeYtLS23ujwuZnM6REVlxWufvLa0HBNCcnmK8gNZVvRsNms6/dGHOzds2FD+Zc2dTmf51PT0SznGJaOipBuCDY+uKKirr3vI5XELm8MuyisrIp2dncEvat7c1tbucrsnLi7zIhwOb7wmYSAY+K271COKbSWitLws3hAKbfk8xjv6dsher/dRl8edsTsv3HeHw/HAlbjSlQbnzs29XVFZoWuadks2lzNm0ulvFRQVfaOispy2dLScibwbSVxJ193dXUsp3bTnH3u2p9OZjUxnBkVRWFFB4ZbJycnnrqRZcWPi9/u/tpBM/I4zFtJ1HZIkgVIal2X5OAU5RSmNcsHBmF4kSbSBMbaac65wziFJEmSDfMRWUvLIyMjlq+Q1BQCAvr4+effu3Y/MR+e/x3U9KISALgSEroNKEgABoV/4byCEQJIkSJQeU82WZyLj4/2EEH2l+te8ORVC0MbGxo5MNnN7OqM1SpJUm9U0lRACgyTFdSCiyMpoYX7+348ePXr4Wut+KQghqBCCfjbz6vgv/wKSLAsl8m8AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWADcvCN3fsAAABFJJREFUWIXtl8uLHFUUxn/n1qufM2nHSTIZMhlHYxJDFAk+iEFQV7pRsxD8L8SNIi7Eta6CC4WASxdBJLiajUZX0UjA6LiY0UDUiTOZOGO/u7qqjouq6q4uG9IqOpscKGhO3fud757z3VOnRVXZTTO7Gv0OAcAe5xSRIpCKQwEfsAAn4w9UNUBEAEm3AopqNCkByYpQRA4AzwJ7gSyI1IAWRMUkmAMFbBM6lmUbjGUbcIwt/SCIfuv1rvdgCyhniEXAV6q6NpaAiBRL8GoHTit8ntk0DTwv8L3C10nWdMpx5npB8IJly7VyobwKUPQ8bTabJjTm4Xq73U1w3ATniMBNhTdVdXPAQFVJSCyU4BPgTOpL/AcrIudseDLrT96dBZ7L+6vwSlF4N7d2zoFlcjgDEdZgWqEAfJsr01JT1QqgN5I6EXfWdWvTrnskX9cGbPhKWUQKmYPeiOAXDx4QESv1Dwi04B7LdevAtRxe2YawBu2cXx3LCm1L94hI/jbVgRJwIOsM4RsDjwIzIwRExC7Csabvr6lqmAOrukJ3G34dia7aX+90VrY7/R39q+p/NjHhmZz/I7foVoC7U0d6DZ0WPAgsisg7mQ0R8FBbucuCt22RrgE8y6JaqVSBExZYc9XKiSjSzla7fSOCFrAYwinAE5GrxFcYwP+j4x+vwFFgJUugmLD6GNhgWJqmC4t9kBCuAL0QpB+G4vndex3hWKD0I7gVqvol27acIPDqUHdAAzgUxJry0oMCP4bwmIh8qqp+SuBQCB3grKr62ZyJyP0GrEj1XM5fqkFnG3Sz2XoPCJIDCYALJoQQeD+TAYAvCvB6B6aALZPQOq6wPia4KcB+F7q5WqKqbQWpOs480FLVrqo2VbWhqo0erANlVW2nPlVtcPLkpWZMbIk01Sau/5V8kCWo9qHQhZ38O4Ap29iOMfuS1Oat7sCMiOwfIX75cr8P35Xh9IBAUXgEuJRH+AlqVVtqZkwGAK4H0ervvV6D4fdhYBFsWFAsxRnK27ImBGyArnIYWBCRPQyF6QOLO4ECzIvIKeJGRRJQgIMuTPnwjIh0GNa6a+CoA3vr/f5TIuISCx1irdTCuB/E3wIR2QLOZ4DJBBoRV5K19HfaM7Iiy+5N8fKYAC+q6mzap9cyG/6vZ0VVB+m+SnxdwoSt2rZtXIPnWOJYnqcGg6hKp9HYbEfciuJrKwlYOitMYhFxX3gLhiU4DJxJgFKGds1htuIVqpFIGEaKRhFhEHYkCP0t5XEV0y05dkV9/2YEP0SAAQnik8j4+IPP/KqqfjAykPwdE5E3iNvuAnBRVS/8E5yxI9mYYPPA08A+YlFawBPAh8Rle0lE7iM+mSEuz0VVXbkteH6YGPcALwMXmFxg54HXJsGedCp2gMqEa0nWerddxYQlAL4kbiTLQJ/h3U4PkJ0hDHGZPpsEeGIRSjx+e4xvKnnF+2MGm39H4L+yXf9ndIfAn9qmRhuMvarQAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobEDoWDDpSWAAAASVJREFUWIXtV9FOxCAQnIF+gIn+/xdq4ruW8UGIW1woePHQpJM0Rxd6M9ll6JaSsBJhKftfEEAAQVICAJJ3qYckZr6wPANbI/6AnJ18/wLgafK/nwE85nECIACvowLeM3mqYrMozyhf37A1JvZMThN7+wUBamVgz79WwK0ZcLHJP4n2ityKmsHeI5ckWv572xBobEK7oAeSGl1b1tex5efAJWC5AHcTzrjhVucMuWB2t7eeuVxwCfDwP98FJMt8AhBL+IwXzhu11Q+ckVuyUN3bcTejJDklwJBbEdGJ1ei2ZD+BbVhjHgcz55F7AuYyYAjqDAQnPiJgrQtIxuXnwKEEg/Yr9a+vOv3EV9pLCSKO3fWxKT2D44K69j0XAJ/nRvlKSgD0AUTKeVB6tWYNAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQoxmfjAWgAAAT5JREFUWIXllzFLxEAQhb8nB8KJ2ggqNic2V1tZWIggCFr4E/0JltdobaPVCf4Caz1zhVg8mwTES9g9dkly+KqQzMx7mZnd2ZVtusRap+zAoHqQ1GoqbAt6kIHOBQwa3m/bnoWcJd0A2L6LIasrc20GYshLnADXkba1aMpALCbAKCVAb3tgAZJ2gUPg0/ZLqwIkjUvyb6DIRQ7LlWADeLU9zSkgtgQHwMR21r+PFmD7PjdxhX6ugnKHOweeA/5jYEdSiOcYeIgWUGIOvAcCF8Awwm7e9EHVgeT3Pl2NyhAknQEj27eR9gscnfdAdgGShpIuJB1JWm9VgKQ94AqYAfu2v0I+qdPwLzaBD6CInRe5BWwBU9tvsQ5ZBdh+WtZn5VfBJXCaEiC1BI+J/o2zYKlLSsQsaMTK90Ay9O9vxz/oeVnzXXquagAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQkWF98m8gAAARlJREFUWIXtl80SwiAMhDeVq+PFF+c9PTjjtTVeQNOUlgT7c+nOdDJFQj63QCkxM7KIiAC8sZGYmXRbp4pPOmytThXfHSCoew1wxc8lDxyL62UFKDlwAfB0FNa61TqEZP+c8m93+B14QMyxWQDDQDJ6AEx5gZk5ucCFhCHFXrRZnMjj9Iu9MHVAA/QqejXUOgQASC6UAEoOrA8gILS9g4rbAQiIUVOKrdtzfRIuZicgli8Mo3Le8io3rNOtVdsHXCIit1OrOxBjRIzxOACvSM8vaWNamVw6SBQHU48g58t7nbPqHJAFrPPh8EdwApwAJ8DhAKaNqOUlsxpA3t0qx3fZ3wU7AtBFWv65kfOr0cdpy8nnX+mP0931AThFaqpKQ14AAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQYhKPqfMgAAAytJREFUWIXd112IVVUUB/DfHitkkm57PDOOWdP0oBmFD41QCUkEvQSVaQVBzEP50JP10AcaQVlBiTBQ+FJQvQgZaNGHUlbTx6SNZn70pRZ9EPQ0zBRhNCDsHs65w+1253TuTCK4YcPl7rXW/7/X+a+1zgkpJadzdZxW9DOKQAhhTQhhSduOKaVZbVyHj3ACX+NJzK3sPwvgxb3d3a/ieE/3/ISVWIht+AqDp4QAOrEpxngEa/ESHm+yuR578CGu+d8I4G6M4lmswP3dWVfCfViGs5rs1+JbvIwLWsUMVfpACGEFHpaL9n30Yzkux9uYLH7PwS/YH2P8ZHx8fKTw35Bl2eqxsbFtKaXNmAItJRBC6MEjuAE/4y+ch/ewBVtjjM80AC3F1UV2lmJejPFXjExMTJzE7ThZPLJ30foRFDddF2P87cJFC5Nc3a/gDnQUNnNwaLrUFjaLcAs2YQeGF/RkaX7X+amId1krpxtxNMuNfscQrmxhtwz7ZiDgS7Cx0M5rjYdX1Gq13cXBD3JhZSXBBvF6mwQ68BCOYT3mQlar1Z7GBD7FqpRSqBBsCE+1AX4XDmN7jI6gs66/zb0LsoQ1bd5mF26rYHcVhrG3UH+Sd87+OoFOPIDvsFGFNloI8AAWl9j04kUcbQCu7z24OKWkI6X0Z1Gbk0UJjYYQBpWvfgT82OIshBDW42P8gUtb2HSoD8IGdR5oYjhsmjaKW/FOi/9X4yDebHHr+n60IN6VUvoHgUNNhveapo3iCTzXVJI7syz7vAQ44YsY41tYMuVbQqC+h+T62FCvDmzHTZgn74jH8WAJ8M4iwzf/K2sVCNT3G9iHVfIpt6WYiM+X+EyRm1asBYFzKxBI+KkIOCkvwzLbY3gBPaUVVRA4Rz7F/ovA/go2o/JhtbxSP2kQ0rX4rFar7S4JfrjkbAe+xJ1tNbQWpbSuIX3NINM9pu/x2MDAwNntgLckkFLS19cXGwRUloFvYoxbcVG7wKUEmup7V6H+JB9WCR9gBCtnClyJQFPnO9jT3ZWKrNwzW+D6rvROCCGEDvmr2UhK6UQlpypxqxI4VevM+Tac6fobdX01Hh9CX7YAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQMlUuCvbgAAAxBJREFUWIXN10tonFUUB/DfF6KmPjredCIm6hSnRUix+MhOxI0oqMXGlbrwgdD4oOCrGx8gIi4EoVSFooggSsGiTUHFUBFtm7a0xRYtmtZWFxFEFBx0Ud3IdfHdiR/TmclkJhgvnMXcuef8//c875fFGC3l6ltS9P8Dgf7FMpRl2d0YxB+IOB1j3DGvYoyxJ8HtOIRJvIa/yitCxCm8h/62+j0ArwkhfISDuBFX4wPsxDXy8L6LY7h00QhgObZgBg9Vq9VKuvk32NDk/NP4GTf0TACPJOAtuAwbcRwv4/w2euvxKx7sikBy8QF8XK2GtbgpxX0nrujQxih+wKsdE6hUStWLh4a24wjWJSM7EvgtXYTvAuzGLixrSQADeB6HsQmX4IXk/se6TdyC/VewH6uytFGs53E8jtMhhN21Wm0lxrEHD8cYf5uvtOdbWZYtw0/4pK+weVWWZVMjwxdNlkqltTi7VquNyctsO2Z7Bc+yrD/LsmfxvTyRN0AZm1Pz+Ftey/dgpOCyy+XuP6cHt9+Jo6VS6VOcKOzbN1QejLh/YmLirDYGpkMIt3UBfG0CPSxv0RFfYjDGSKVSquItfIH1bQw9hW0LAC6Xy+XX8V0BuC5fzRGoH8ZsiveuyvDwWBODK1MYBjoAfzIBb20CHuXteUWRwJrkpvqBE3gDQw2G92C8DfC65N6pFsB1mcV5RQKjmG44tDXdYlMB4Am83wR4FB8m17YDPiRvQlfO6dYNhGBvC6WpdKtb5Q3qKM5NesuxGSfxTBvgyRDC17jrDPIdEKjLEbwpn3p34F75IHp7Hr2TeG5sbKxphc3lAD6fx1DE7/gFfzbkTDOZkb8HWr4FigRWy2f2fAQ+6+DMdAhhbwjh+o7KNRHow6PyZ1Q74/vb/LcN3+KBBTWqhmweSTGdaQGyr8X+KbxUT86uCRSIXCef2403PtDw+5h8dqxeKHBbAgUi96Wsf8e/JRlTAh7Ezd0Cd0QgkRjAi/hRPi2PY2OvwB0TKBBZVRkensCFiwUeY3TGi+i/Xkv+bbjkBP4BGjWpnBddssUAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQMUAz6vVAAAA6FJREFUWIXF11uIlVUUB/DfV2ppytcevxm1wQknshyYhzzRS0USmCEVXZiSii5QUT4kpBQE2kWCQKGwfMikAiWxh0KsNDLSbiaZZqFpoz0MSQ8ph+ohssvu4ewjx/GcOWfGgRZ8D3ux1/r/93+tffmyGKP/08aMdsIsy87HWPwaYzzRdP5oKZBl2Xgsxa34A7/jL5yLHTHGJ+vFnTVK4PdhD2ZiHkp4DVeEEP7FvCzLVtcNjjGO+MOV+AS7MCf5JuN17MO9yXcO+vM8f/60HCME7sQ69IcQHqnxL8OPeBGTBsW04Wie50+MmIBK01ZBVmFMjFFn59Q+fIfNmDVE/HQcrSozLAK4I4G8h4tjjEIIvfgo1f+GFvNc19E+OeKylghgNrZhL+Yn33l4FYexeBjqPVUUxW58jZVDEkA71iS5l9T4FyfgNSiGqd5mzMDlRVHsbkgAS/I8P4K1mJh887E3z/MPMbsV4K6uaaWk3iklwgQcQMdg4GuxIzHtSb6LQgjvphXc3uKK25uVCFtxY3UwERumdBQx7eFLcQGeTUmWVTu+BfAlOFwUxStDlQiPY2V18LTK0bkO72AnBnC8VOrOWwS+KTXqtlZKhGswUB38jLcRB33fNOty9IygRA+EEL7FcuhJ0m+oQyDiFywcnKS7uzvHqtSsS/v6+s5uAXg+vmwv2iIeTj4vpYNhfQMCEb+FEO6sSbQQP6SSdbYAfAk2YX/Ktx4LYozGYPqfJ/7e1tXVOW5g4KgGNqlcLr+Q7voFIYSsXC7fH2P8vFEAZFk2UaWRb1bZ/1X7B+OhyvA2bBlCgYg4dUoR8WArdZ42rXgIh/BmnVwHcPfJgwj34P1mBFQeGjOayD1HZRd90SDHIazp7g75sAl0tLdFLGoAfCE2JoB68TvxGa6ujRveiygSQphb68qybFyWZcvxMX5SeRXV2luJ1NoY41Uxxk9PzZkUSHu5WQmO43DNqu9S6exNdeY+p3KRrSiVShMalaz6Kh5bLpdDCxocRMyy7DHMLYqi/dixYz3oGTTve8zCvBhj/5AZ00pmpZNp41AKpJvwGZXDqd6c7fgqATfdKSebMMaoVDIBK5JsjUjsaeB/A/14tFXg0wjU1HWmyoW0vw7QvjqqHMHLXV1dYbjgdQnUELk+ybm9BnDXIDJbQwi9IwFuSqCGyKLUVFtSeT5QuXZvORPglgnEGPX29gasxsH0rs9GAzzGOHr/hiO1Ufk3PBP7DxjivGJEQcD3AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAQQBIaLdeAAAAwhJREFUWIXF10tonFUUB/DfrdQXhI8bJ9pRHHTQGhQpcUCjhIKVCMWFC1sURMG6sAtdVJeCioiUIq1SF9qNzyKKtaK1vqoWQ7UVFUOVam3ioiLYgqGCSN1cF3NHQjLJPCUXDgxn7rn//znnnnPPF1JKlnItW1L0/5tACGEghLAmhHDZgnv6mYIQwkpciytxHcZwGidwTUrpz3lGKaWeBevwJfbjNRy/4PxSwg4M4Sl82NS2R+ARfIQDWI3xGOMe7K5UyrU5ew9jU18I4Dw8hyO4p1qtVkql0vMZZEMzm0qlUsWpGOPVPRHAg/gJW3AhNuEottRqtXNb2G7AsfXr15/RMYEY4y2lUulr7MYw1uIbvIXLO3BgF15om0AGeyeDj+OqnOevcHMXETwHv2LdogQwgG053PfjImzFj3igx8s7ipMxxqJpIwohbMweLsdN5XLpH3yCMzGaUtrezK7dlVI6iB0zMzMfzGV2Pd7PeR3BDTiIvXNvb48RuDM7uL2hKKs3jb9ijHuKoticPf4Fa/sIvAYHhkqDCbdmnUdwejAWCd/jlay7Fz9jsA/Al64YGnoDP+Au9Y55RYPAM3ganyHNkYcw2QPw2XiyKIqpHNXGuZ9j5L8qwKqiKD5uQiBhH7Z2AX539vjNJmfOI7A657wZgYSTGO+gxPbj0CLnHS6X629FuwQSTlSr1WIR4DJeUu8bi52zV/3xGkwpdTSQ7Jyenn55rjKEsCyE8DAmcAorF7B/FlOYSCmNpZT+QEcRSLl8Ns7y+jZM4r0WtkfxIlbMi1wnBPAbfsfteBfftth/SP0+jC6YulkN4tM2CDT2HG+xb5dc8y0vbSYwnL1rRWBysf+LothcFMUUnsBZbVXNrHyuwr787HZD4AhexyUd9Ysm5XSH+mj1djsEYowT6gPpjV11y2bKWq22HI/hmPpE2wD8btbvV9Vr/r5uW/WCBGZF4+IY484ckUfVR7DHc1ltw0Av4C0JNCTGOIYv8HdOzXCvwB0RaEilUqn2C7ghff0062Yt+dfxv1vGFje17OpaAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFBk6Z52WNQAABWNJREFUWIW1l31IG2ccx5+c5/WSe/Jc7vLSnNE79WxMGguCUep0otGM+dZNFKa0oER0TWVQxt4obAtjwkq6QVs2EGX/DWbf1iFrOzoQBvpXRwtrKayKTNFtrHS+JBiN3m//zOI0iYltf/D883x/v+f7eZ57nnvustA+oqWlJY/juGMrKys98Xi8KTc391VVVaXu7u5/JiYmlvYzZloRDAYLZFm+xnEcCIIAoiiuqqq6LAhCzGw2gyAIkJ+f//358+fdz928paWlhhCy8p/J552dnWUAoAcAWtM0QzAY9Lrd7gs8z4PFYolVVlb6npt5e3t7GSFkjWXZ33p6erypcjs7O4+IojjDcRzslZtWAABlt9sfmkymWENDQ146NeFwWOZ5fkmW5UeaprHPBFBRUdHJMAxUVVX1Z1JXW1sbIIRATU1N1zMBWK3WnwRBWAQAOpM6TdNYQRAeOxyO8VR5VCqxr6+PXlpa8hqNxh91Ot1GJgAURcV4nh+PRCIVo6OjSR9DSgCWZU0URRlVVX2SiflWLC4u3tHr9QaMcdK9kxLg4sWLjxFCm9FoVLcfALPZLK6trWnLy8urGRe3t7dXezyeqzRNQ3Fx8c/7AZBleVwQhPmMigCAUlX1S4wxWCwWUBTlu9bW1r5k+fX19V1dXV1VO/sHBwdtHMcBxni1vLz8/cnJSSEtgKKioisMw8Dhw4dHRkZG5GR5Q0NDeQ6H49tkR21gYEDKz8+/YLFYHvA8Dzab7c/GxsaXUpofPXr0HY7jwOPxhFLldXR01DkcjoXs7GxwOp3fAEDSPQIAqLW19RjGeA5jvHr8+PHEb8fR0VFBFMWoJEmTqcyHhobMdrv9CUIIbDbbdLrvh0AgIBkMhseSJE0BwO7NX11d3aHX68HlcjWkGigYDB7BGANCCIqKiq6lY74VpaWlXXq9Hjwezyu7REVRPjOZTBAOh617DYQxfogQApPJ9Pv22bS1tb1eUlJyye/3f5Co7u7duzzP82uKogwn0sOSJIGmaf/brc3NzeV2u/0Lr9cbdrlc/lOnTlWYzeZphBBQFAWqqt4qLi7+2Gq13mFZFjiOg4aGhreTwVMUNe3xeCZ2CYWFhR+xLAter/fg9n6fz/eJXq8HhBDQNA2EEKAoChBCT5tOpwOEEBiNRvD5fG8mM0cIIYZh/sjLy7u6S/D7/S8bDAZwuVy92/vHx8e5ysrKECHkr+2mOxshJN7R0fFGKvPTp0+XEULA4XC8tUsEANpkMj0SRXE+0R3e29trU1X1q63V2Nlyc3NvpTJHCCFVVccNBsNaW1ubPWFCU1PTMYwxyLJ8JdnxcjqdJ7OysnYBsCx74dy5c7nXr1/HiSYniuKnDMOA2+1+NyVlWVnZexhjyMnJ+bWxsbF5cnLy6WoMDw/bzpw5k0PT9NJOALPZPBYIBF6z2WzzpaWlH544caKutra2oqSkZEBRlCmDwQAFBQVf7bVKCCGE/H5/gBDyN8/zwLLsiqIojwghU7Isz/b397cxDLOWAGD65s2bTlmW7xmNxq2vZjAajZCTk7NQV1d3MpFXwmW+ffv212fPnr1048aN7rm5uZqFhQU7IQQxDPPD/Pw8RggxO2vi8bgyNjYWm52dLfX5fO6ZmRm3JEm0JElzly9f/oWiqPW0Zr9XFBYWDm4du+0tOzsbvF5vfabjpfwgSRTRaPQQAOzq39zcRLFYLOMfkowAAABFo9HiRJqmaWhjY8PzQgFCodBBnU53KJm+urpa9EIB7t+/X6hpmj6ZHolE8hJetc8LIBKJOOPxeFJ9fX1dCYVCe96m2yMrQ4Dg8vJyqv89+sCBAw+mpqbupTvmv5uD6p7Um9wSAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFCUJq76O3AAAA0VJREFUWIWt1ltoHVUUBuBvmtZgqx4iREyNaZmgIkUtjjcERTHqQxBESaHpgyg6SoWCvotiwRdBQauoVaRCEY76YMEb1qg0Fqs51lhbW6UFLyB9KCoU8cG6fZiJDumZS05zYHFm9l7rX//MXutfE4UQ9PqLomgjToQQXuwZo0cCK6Ioegt/YTmOhRAmsWCwJb1kj6LoNdmT3x5CuAWrR0dHn+gFSwhhQYYrsa+41m63z8VRXLhgvIaOEVbiPHyE+7oQexzbcp+hEMKSRSHQbrdPj+N4Fz7BThzHDlxbSL4+3zua/0/jlUUhgHXYPTExcZqsZoZHR0dTfIGX8AZ2J0ly7+Tk5EDucxa+KpI8FQKv4+4u66viOA5JkmwviXsKj9ThN+mCfhzpsr55YGBg28zMzIaSuEO4rA58aQMCJxAVF6IoWovLO53OpRVxfydJcmYdeJM3sALnz1t7GDtCCP9UxF3c6XQOLAaB93BH4X4pLsE7NXFr8X4tel2RxHHcwqEkSUZCCJIkaeFTLK8o3JtkYrVsUYQIG/F9Lkh9cRx/g+ES37PxK+5cFB2Ys8HBwTZ2TkxMnCFTw1u7tSaOJEnyfFPcxgTyBC8MDQ3N4Gs8jShN02W4Ir//DpsWghmFEERR9GjO/hh2YSqEcLxbzURRdDUeyJP+6f9W/gGPhRAOlsQN40ZcL2vr2RDCs3KA/bJZHmQ6/6VMyVaXMU/TdHkhpnTw4AJsxZ6Cf+jv7/8t39eHTnEzt1dHRkYO48EK8JA1Uun+5rwg52MHvP1fDeCDEqeQM38zTdOTWqqMQJqmQ5hqtVofVuA+WSRwDz6rcN6Sn/E5dQRwDQ5WYM3ZzUUCK/BtTcAz+KVIYj4BrJF9E9Qlnz6pDfGQTOGqAp/Dx90IYGWr1TrcIHnAbd10oE/W33XBU9jahcDnDZPvLRUi3ICfG4Ds70JgT4O4P8bHx+NKJZSJzE8NwNaUXJfZEaxrJMXYEsfxjzWAsyXX3Wwf1i9oFmBLLkRNzrXKDmBDaZ6qQYG74jj+vdfk+QNUjuUmE/Aq7JV9ATVNPot3saoWv86h+Dbkk7Ii8bRskHU971MiUCByHTbh5bnEY2Nj23E/Lloo3r/a0/48nkGnegAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goTEAwh+C9OzQAAAjFJREFUWIW917uLVUkQwOGvro+Z8YWMiijoKOwuDBqqmBkIJiKmCj4wMjA10P/ARFhkg40WMzERRNhkzYwUBRF2BVF2faGOjI9h3BVfZdBH5qpzZ+2Ddwqae7qqT51fd1dX143M1EYiYhRHsBQ/Z+bVVo4ys7phAGeRTTuP4Ta+Oq2o2YBbXf2L2NXGUVuANXjc1T+FH2cTYBS/fKGbOysAEdHBT9OY1kRENUSbFdiBh9Pof8eZiBiu8tbiBJwwFf1ftsM42u9TMDiD7VesrnFWBRARQ4j/GVYVB7VBsxKve9iO4TnWRsRQZv7XD4Al6OV4M/7FGBbPMO4zqY2BzgzvDGK8+fhkjcMaWajMcjrZqVxMlzOz15ivpHYLVuB+D9txDGbmbzUOawGGsL2HbWNm7qv0V70Fz3Coh+1B7cfbAIxE9EwDA7MBcCkzP+BA0z/dZYuYge67AGTmTezFD41qN/Z/AsC8vgI0cgGLmufrpgqRD1psQzVAk2I/zfRGF8A7JQn1F6CRf5rf27jXPD9ReRPSsoxSjuNejOAcXuEvbEVVed52BcaUwnR+Zl5RZv7SVHD2HeAuFqATEXOUsnwTXtSWZG0BniiBOEe5H/5QaoX3WDcbAOPNu8PoZOYE3iqnYFXfAbJUpwPKrCca9Z/YoqxKfwEiYo9Smk1iWaO+gTem/8/w/QAiYhtOKkv9FC8a04SSE9ZHxDdnxDZ54BoO4u/MvNOlf6TUgcuVtPxN8hEQKBHAR+nvnAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gIBAAwD+wl4jAAAAs9JREFUWIXFlz1oFFEQx39vd8/Lqudyhoty8QgshOSuyHqaGMNCDmMaQcTGUoiFhY02dn4U2lloJQTBRrCwMyIoghaKkELwAwmChYUKFoIBJfErGYt9F4/19nY3F3MDU+27+f1n5r1575SI0EkzOkoHrLUMppQyAA/YD0wA20Rk938VoJQa1LC65xs+LymlbBFZjAwgIqkcKAFTwA3gAyAxPtkyXgJgATgCTANvEwDDfj2VACAHHAQuAy9WAQz7IlDUVSu3FACcAX6vAXTFe3t7pVqtLup2HQdUIzO8CfcAZuSGSWG2bVOpVDAMg7m5uS7gNfD5n4WhCjxpN2OllPT19UmtVpNSqSRKqfq3X8A5gtmjolrwoB14LpeTkZERqVarYtt2szXfgQOtBFxbDdgwDHFdV2q1mhSLxbj1S8AFoKuZgKm0cMdxZGxsTIaGhiSTyaT57e1mArYCC0kCmKYpAwMD4vu+FAqFtFW7BeSi5kBsG7q7u8X3fSmXy2JZVhrwT+Bk5B7QArYDX5sFsCxLKpWK+L4v+Xw+bdbvgb2E5kDU+D0WDtDT0yPj4+PS398vhmGkhd8jGOkqqQAFPAMkm82K53kyOjoqjuOkBS8RnH2T0Plv1QKl/Skw63meuK7bOFCS+idgMgocJ8AAZnTPbqYEC/CY4NpuCV8RoJXmGrI3gTsEd8Nm4KIuZxL4JWBDHDgs4CPwDtgXIWALcJ7gGEWBvwCH61knFVB/lO4EXgIPgSuAzV/zdDsmgEPAVV2NRnsODAMzIrIs2khiof4fBeaBN8AscB94pcGbgI1a3DBwV2c+DXQlzTjJJtxBcCsuA490+bPaNwAZgsesQbDRVgVOcgpOAN90a3ZpqEXDmW4XHjeIFOASPFJ+AGe1gLahsQJCQkzgNMFjYhYYXDcBITGDBON5ATi17gK0CItgts8DzloIUDpwx6zj/47/AFtaIekeNV/aAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUARIGCVc1hwAABJBJREFUWIXFl12IG1UUx//n3kzcTbe72Q2FDVZyJ8lSilosUn1QKxV9KOqDfRE/wAe1H1SUQqVULCgU9UVUUPxo/QCxglpRXwRFsYXWIlppEdt1JzNJdjfWqrXbmm2SmXuPDzZLus0k01TphUDm3v85/1/ux5kbYmZcyiYuqTuA2MUmsG17iZRyKQCjta55nvfFhcRTr0uQy+VuAHAHEZEx5gciqgBYw8xHXNfd+b8BpNPpRYlE4in8+4tfKRaLR1vHx8bGuNFoXFsqlQ5GyddxCZRSy+Px+I21Wm13uVyuKKVWJRKJdcy823XdD8PiLMt6EsCaKAChM5DNZpcJITZJKb/TWiut9S4iWl+v15+Znp6eDAFWlmV5AOA4Th8z17sBdDoFVzPzsfHx8VcBDBhjTrmuuyHMHACEEOub30dHR0e7mQMdZiCZTA6nUqlHhBCLADzIzAeYeS8R/cnMbhAEP5ZKpV+b+lQqNTgyMjLTfK5Wq5lKpVLuBhC6B06ePPlXLpf7PAiC34UQwwCuZOaDWuvT8Xh8ie/7xwHMAQwNDT3dGm+MiVRjQmfAtu2VUsoNhULhAaXUOiHEFIC7gyDYWiqVvFZtJpO5JR6Pf9Xa5zjOAmae7QbQljKZTA4LITbXarXHmbkhhPgbQCMIgq2xWOy1bDa7oqlVSqn55saYj6KYhwKMjIxsYeZ3p6ampgAgCILDxpirSqWSZ4x5FEAfABCR1dz189r7UcyBNkuglFrelxjYcPTnn9bOiYj6lFIZz/PGW/qsXC73KRGtnp/UcRyLmYMoAOdtwlgstqZR819u7WPmGoD55p+0M/d9f3VU8/MAlFJKSpl03fHDYQFKKZXP59tNexMudKxdO2cPENESZj4UJs5ms3eGrDkAoF6vrxBCbLwYgMUAfpsvymQy6Vwu94aU8rOwRL7vLy2Xy98DaNi2fXNPAMaY/US0Kp1OLyKiftu2r8/n88/F4/GKEOLhkBzfAECj0fgDALTWb0op7+0JoFgsHmHmfQMDA8fz+fxsLBY7QERbwoKZea3jOLcaY/ZalrWwmcMYM2Pb9soLBgAA13V312q1xQCe7WC83XGcfsdxdjCzBtBPRHPn2RjzthDi/p4AAGBycnJ6YmLiiYmJCapWqwuaHzOkksaY9wqFwvazRxNEFANwTjEpFotHAMxE2Qtd74SVSmWupNq2vVkIsS/Ke94Ys5OINgHY00kX+VacWbZsWEp5m+u670TRe543TkSnu81CZIDLAjwGiG+Z+UzUGK31W1LKey4aYHBwMOUH+rqCfc0LUc2BuVNlOp2ISADpy6/YCH92D3/5wUx39bnNGPO6lPK+ngGUUqOsg1XBiRM7LtQcADzPO8TMp7LZ7E09AZCUDwWBv3NyZuZEu/Gzbz6ttT4VlkNr/TwR3dU2f+t9gIiEbdu3CyESWmsQkUVW/zYNepEa1bYAQggJ4CUA240xx0I0PoBtAD42xvwCAFJKVKvVr+cDSNu210spFxpjwMxERGeMMTEhRKeaMQugHwCFCc7Wjr5mxRRCoFqt7ur5v+F/1f4BnoQqMI+v2mkAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gEfER8TbdO6QQAAAfZJREFUWIXt1k+ITWEYx/HPmaGxkIgaFmOhGyUmipomUSxnYSMb+bNkZcUOM5JITRaUiMyWMlnY2NgoMorF+LMYFpSFiJjGn6Z5LM69da5778y5f2YszK+eOp33Oe/313Pe531f5vWPlZQeImJ2AElSQH+KiP2Z9+WJEdHSQAE3MYkoRk9mfHYM1ACX4hmSWTGAHgzXAGfjQEsNYDWu5ACX4gMWN20gA/6dE5yNsw0bwCpcxK8GwKW4V7eBDPhHE+CP6KtrDbQIPIWHOJ27DbEC5zDeBPg7TmAvJjCSy4B0h3zXBHgSl7ES+zCGS+iqpwKHG4QPYx224QnuoFBl/hkNtONlHeDHRega3MZT7JhmbU1voJh0PQd4DHuwDBfwFgfRNkNXgbZKK2V6j0c1xj7jKLrRKd3nx7EhIoYiYmqGuXMZgFvS1VzST2l3FPAGI9iC3ogYiIiJPOBqWlqlTP04hGPSXh5CFzbiPh5gc4NnSIU+4QaWVDHQJv3HnbiKV9jd6AFWaw30Yj1GkyTZ+Ze5DhyRttULdEfE3fqLXKmyK1mSJO04jlO4hm9Yjl3SA2QgIr60BDzdlUz6j5/jq7Sf1zZT7ob2ASzEGemxex4dc2ogk7gVrzGKTXNuoJi8CIPFapzEgjk1kPlou3Sr7Wu5gXn9t/oDDAKDtnkUp4wAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUASQD8CFQfQAAA7ZJREFUWIXVl01oHGUcxp/nnZ01pmm2YePiR5MMM3MpRWyVCjZVexAjVQ+2vQQ8KH6AFtHgQfCjnioUrehFRTyoWPGgEaqIKPXQFi2lkCrW0mZ2N67ko9USwSSrOzvv48GkpDHZbL5a+hzn/+f/+83Ly/vOUBIuZ8xlpV+RAp7n3RaG4WaSVy2HAOvdAyQbwzB8B8B6SWMkV0k6I6mvWq0eLJVKJyTZFRHwff/WVCq131r7I8kd02uS3iW5GYAAnJB0yFp7qFAonFkWgTAMnzfGPCFpbT0DJfWS9CRVAZyy1n4r6UixWPx1QQK5XO7aTCbzsSRD8s564LPI7CXZCSAH4Jy19ijJwxMTE98PDQ39MadAEATbjTFvSPqA5IuLgc8Wa+0+kjeSvN4Y01+pVPZeJEDSCcPwLQBdADqWCzxHdltruy8IeJ63IZVK7QdwauZGW4lI6pe0m5Lg+/6TqVTqZUm5lQZPpmytfTafz7+dCoLgVcdxbrmE8D+TJHmqUCh8BPx3Em6TdORSkCX9Za3dMQUHAFOtVu83xvgATgL4ZCXA1to9kobjON6az+e/m167sAnb2trChoaGh0g+ICkGcNMywfeRfLBcLm8aHBz8bWb9f+cAybTv+/cZYx4BsBbAUQCPLwYu6X0A68fHx+8dHh7+fbaemkex53nrXNd9FMBdAIYA3LMA+OcA2vL5fKekylx9dV1Gk6uyc3JVPEkHSD5TA35cUqFQKHTPd0PWfR1PpaOj47p0Or2L5GOSDgLongH/CcAvURR1zz5hEQKtra2rm5ubu4wxnSRvIHl1kiStxphW13XDOI7PWWsPGGO2SvoyiqKeel+opkAul2vKZDKvkNwiaVTSz5L6kiQ56zjOwyQdAB9KajHGdALYCOAfSV9FUbRnSQLt7e1BOp3+BsDXlUrl9VKplJ9eD4LgC5Jroii6ffpzz/M2uq77kqTc2NhY18jIyHgtgTm/CV3XfVNSbxRFu2bCAYBkAcBJkhfNGBgY6Ovv798uabSxsfG5WnAASNWoXQPg07mKURQ9XWuwpCGS2UULVKvVHtd1PwvDMBVF0XvzDZpKNpttbmlpecEYc3e5XL5jvv6am9D3/U2O47wGoAHAMUmHkyQ5HcfxecdxEgCI49hNp9NZx3HWkdxG8mYAxycmJnoGBwfPL0lgKkEQbCG5E8AGSatJupLWAADJs5NtwwB+SJKkt1gsnp536EIEZiabzTY3NTWtAoBSqTQq6e8FD1mKwHLmyvs3XO78C2h74kwpj5OrAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gsBFjkGPOnzBgAAA+hJREFUWIWtll1oHFUYhp/VzZrsJhs3ZDc/m2yWyQ8lP93Ek5BWNz9oWmJKvDBMBEHTi7oSRVsRQi4KXgm5qESwCImBgqjIBEFQkYJpQRRFF4R64UVxFO1VbhYiCRIpnxc5W4ZNdnamzYEDs+d8837PvOc7Zw8igteulBoFLgNSpl9eXFxUfjS9BcGIUup6MZFS6k2gCYiICD09PSPxePw1J0xVVdXQcQAEgCcdwu0l88Hx8fGrwBzwqIYdc8SPVAJ4CJcWDAafBbaARREJiMjfzvnl5eVIU1PTTHNz85VUKnWno6PjZ9M0q0UkpkN+Gh4eHnXLUZbMNM3TkUhkG3jFg5UB4FR/f//nk5OTkslkPtFuCCCmaSZ9LQFQDUg0Gv3GT0Fp8HPT09OilPqgqFNfX3/VL8AQIAsLC74q2gHxTCKR+Bc4kcvlLmgnjnThSIG6urr3lFJf3k9yx0cMA00iEtQ7Z8ETgGVZtZp45kEASmAu1dbWXj9qLlhalEtLS50A6XQ6u76+HnKtYI8tkUi07u3txQOBQJ2I/OO6C4B+yp90D9Tz+fxjpfkCOum9Nj8/P7i5ufmLUupioVC4WRy3bfuWYRgnnbG2bd8CcI7bti3Ar4ZhnCwUCsRiMWzbPgtc4eAgu+PqgGVZSU085XDlzEHoIbek3Hgqlbr3vmEYzwNf+dkFW9Fo9F2H4AWvAGtra516/AVnXF9fn3eA3t7etwCxLCuuBWa1aEclAOBxDk6/Xv07AUg2m53yDDA1NVWvRd7RX1UFSEtLy6VKAG1tbdecY/pEPOSeK4CIUFNT8wYHB8gJEaGhoeGjSCTyrRsAUJ1MJm3goohgmuYZrZH1DeBMAKSDweBYd3f3XWCoHEAmk3l1YmJCgDTQBcjAwMCKa44KAG3OJEqp39rb2zfKADyslLphGMb7JXPR+wbQQq1a7BTwoi7OhlKAlZWV1OzsrAAzSqnXAcnlci0V9SsFFBMppT6Ox+NPOHeDEwBIx2KxP0OhUDcgkUjkbS/arjeiYlNKnb99+3bn9vb293qoszQmFArNNzY2/re1tXUXYHd39wcv2p4AYrHY7zs7O6Mvr6+fBchms8+Vxuzv7/cNDg7+NTY21g1gmmbei7anJXAsw48c2P4FMKmfPwSe0s8bgCSTyU8963pMHsfHv14ikfgaaD1OgDlANjY2pFLs6upq8SJ6+tgAcrlcfTgc/syrA9Fo9NqxLoF24RwuZ7qzVoA5r7qHrmQu7RGAQCAglQKVUn94VvVKms/nw+Fw+GngZjnru7q6vgMmvWr6WoLSgixjfb9vPb8vWJYVAl46woHzfrVEhP8BzTbP9sQqXZUAAAAASUVORK5CYII=\"","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport TinyLockImage from './assets/tiny_lock.png';\r\nimport SelectImage from './assets/select.png';\r\nimport FoundationImage from './assets/foundation.png';\r\nimport CuboidImage from './assets/cuboid.png';\r\nimport SensorImage from './assets/sensor.png';\r\nimport SolarPanelImage from './assets/solar-panel.png';\r\nimport WallImage from './assets/wall.png';\r\nimport WindowImage from './assets/window.png';\r\nimport DoorImage from './assets/door.png';\r\nimport PyramidRoofImage from './assets/pyramid_roof.png';\r\nimport HipRoofImage from './assets/hip_roof.png';\r\nimport GambrelRoofImage from './assets/gambrel_roof.png';\r\nimport MansardRoofImage from './assets/mansard_roof.png';\r\nimport GableRoofImage from './assets/gable_roof.png';\r\nimport TreeImage from './assets/tree.png';\r\nimport FlowerImage from './assets/flower.png';\r\nimport HumanImage from './assets/human.png';\r\nimport ParabolicTroughImage from './assets/parabolic_trough.png';\r\nimport ParabolicDishImage from './assets/parabolic_dish.png';\r\nimport FresnelReflectorImage from './assets/fresnel_reflector.png';\r\nimport HeliostatImage from './assets/heliostat.png';\r\nimport WindTurbineImage from './assets/wind_turbine.png';\r\nimport LightImage from './assets/led_light.png';\r\nimport GroupImage from './assets/group.png';\r\nimport ClearImage from './assets/clear.png';\r\nimport HeliodonImage from './assets/heliodon.png';\r\nimport AnalyzeImage from './assets/analyze.png';\r\n\r\nimport React, { useMemo, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { Dropdown, Menu, Modal } from 'antd';\r\nimport 'antd/dist/antd.css';\r\nimport { ObjectType } from './types';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport i18n from './i18n/i18n';\r\nimport { UndoableRemoveAll } from './undo/UndoableRemoveAll';\r\nimport { UndoableCheck } from './undo/UndoableCheck';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { showInfo } from './helpers';\r\nimport { Util } from './Util';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { isGroupable } from './models/Groupable';\r\n\r\nconst ToolBarButton = ({ ...props }) => {\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nconst MainToolBarButtons = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const loggable = useStore(Selector.loggable);\r\n const elements = useStore.getState().elements;\r\n const language = useStore(Selector.language);\r\n const selectNone = useStore(Selector.selectNone);\r\n const actionModeLock = useStore(Selector.actionModeLock);\r\n const showHeliodonPanel = useStore(Selector.viewState.showHeliodonPanel);\r\n const noAnimationForHeatmapSimulation = useStore(Selector.world.noAnimationForHeatmapSimulation);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const clearContent = useStore(Selector.clearContent);\r\n const objectTypeToAdd = useStore(Selector.objectTypeToAdd);\r\n const addedFoundationId = useStore(Selector.addedFoundationId);\r\n const addedCuboidId = useStore(Selector.addedCuboidId);\r\n const addedWallId = useStore(Selector.addedWallId);\r\n const addedWindowId = useStore(Selector.addedWindowId);\r\n const addedDoorId = useStore(Selector.addedDoorId);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const runDynamicSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\r\n const runStaticSimulation = usePrimitiveStore(Selector.runStaticSimulation);\r\n const groupAction = useStore(Selector.groupActionMode);\r\n\r\n const [category1Flag, setCategory1Flag] = useState(ObjectType.Foundation);\r\n const [category2Flag, setCategory2Flag] = useState(ObjectType.Wall);\r\n const [category3Flag, setCategory3Flag] = useState(ObjectType.SolarPanel);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n // CSS filter generator of color: https://codepen.io/sosuke/pen/Pjoqqp\r\n const defaultFilter = 'invert(41%) sepia(0%) saturate(0%) hue-rotate(224deg) brightness(93%) contrast(81%)';\r\n const selectFilter = 'invert(93%) sepia(3%) saturate(1955%) hue-rotate(26deg) brightness(113%) contrast(96%)';\r\n\r\n const resetToSelectMode = () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.actionModeLock = false;\r\n });\r\n };\r\n\r\n const handleGroupActionMode = () => {\r\n setCommonStore((state) => {\r\n if (!state.groupActionMode) {\r\n state.objectTypeToAdd = ObjectType.None;\r\n }\r\n state.groupActionMode = !state.groupActionMode;\r\n });\r\n };\r\n\r\n const removeAllContent = () => {\r\n Modal.confirm({\r\n title: i18n.t('toolbar.DoYouReallyWantToClearContent', lang) + '?',\r\n icon: ,\r\n onOk: () => {\r\n const removedElements = JSON.parse(JSON.stringify(useStore.getState().elements));\r\n clearContent();\r\n const undoableClearContent = {\r\n name: 'Clear Scene',\r\n timestamp: Date.now(),\r\n removedElements: removedElements,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoableClearContent.removedElements);\r\n });\r\n },\r\n redo: () => {\r\n clearContent();\r\n },\r\n } as UndoableRemoveAll;\r\n addUndoable(undoableClearContent);\r\n },\r\n });\r\n resetToSelectMode();\r\n };\r\n\r\n const toggleSunAndTimeSettingsPanel = () => {\r\n const undoableCheck = {\r\n name: 'Show Sun and Time Settings Panel',\r\n timestamp: Date.now(),\r\n checked: !showHeliodonPanel,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.viewState.showHeliodonPanel = !state.viewState.showHeliodonPanel;\r\n });\r\n };\r\n\r\n const toggleStaticSolarRadiationHeatmap = () => {\r\n if (!runStaticSimulation) {\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n }\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n setPrimitiveStore('runStaticSimulation', !runStaticSimulation);\r\n setCommonStore((state) => {\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Generate Daily Solar Radiation Heatmap (Static)',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n }, 100);\r\n };\r\n\r\n const toggleDynamicSolarRadiationHeatmap = () => {\r\n if (!runDynamicSimulation) {\r\n showInfo(i18n.t('message.SimulationStarted', lang));\r\n }\r\n // give it 0.1 second for the info to show up\r\n setTimeout(() => {\r\n selectNone();\r\n setPrimitiveStore('runDynamicSimulation', !runDynamicSimulation);\r\n setCommonStore((state) => {\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Generate Daily Solar Radiation Heatmap (Dynamic)',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n }, 100);\r\n };\r\n\r\n const setMode = (type: ObjectType) => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = type;\r\n state.groupActionMode = false;\r\n state.actionModeLock = false;\r\n });\r\n useRefStore.getState().setEnableOrbitController(false);\r\n selectNone();\r\n };\r\n\r\n const menuItem = (\r\n objectType: ObjectType,\r\n srcImg: string,\r\n setFlag: (val: React.SetStateAction) => void,\r\n replacingText?: string, // sometimes we don't want to use the type name as the name in the menu\r\n ) => {\r\n const key = objectType.charAt(0).toLowerCase() + objectType.slice(1).replace(/\\s+/g, '');\r\n return (\r\n {\r\n setFlag(objectType);\r\n setMode(objectType);\r\n }}\r\n >\r\n \r\n {i18n.t(`toolbar.SwitchToAdding${replacingText ?? objectType.replaceAll(' ', '')}`, lang)}\r\n \r\n );\r\n };\r\n\r\n // only the following types of elements need to be added in a large quantity\r\n const needToLock = (type: ObjectType) => {\r\n switch (type) {\r\n case ObjectType.Human:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Sensor:\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat:\r\n case ObjectType.WindTurbine:\r\n case ObjectType.Light:\r\n case ObjectType.Wall:\r\n case ObjectType.Window:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n const buttonImg = (objectType: ObjectType, srcImg: string, addedElemId?: string | null, text?: string) => {\r\n const needLock = needToLock(objectType);\r\n return (\r\n <>\r\n {\r\n setMode(objectType);\r\n }}\r\n onDoubleClick={() => {\r\n if (needLock) {\r\n setCommonStore((state) => {\r\n state.actionModeLock = true;\r\n });\r\n }\r\n }}\r\n />\r\n {(objectTypeToAdd === objectType || addedElemId) && needLock && actionModeLock && (\r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n const dropdownButton = (overlay: JSX.Element) => {\r\n return (\r\n \r\n \r\n ▼\r\n \r\n \r\n );\r\n };\r\n\r\n const category1Menu = (\r\n \r\n {menuItem(ObjectType.Foundation, FoundationImage, setCategory1Flag)}\r\n {menuItem(ObjectType.Cuboid, CuboidImage, setCategory1Flag)}\r\n {menuItem(ObjectType.Tree, TreeImage, setCategory1Flag)}\r\n {menuItem(ObjectType.Flower, FlowerImage, setCategory1Flag)}\r\n {menuItem(ObjectType.Human, HumanImage, setCategory1Flag, 'People')}\r\n \r\n );\r\n\r\n const category2Menu = (\r\n \r\n {menuItem(ObjectType.Wall, WallImage, setCategory2Flag)}\r\n {menuItem(ObjectType.Window, WindowImage, setCategory2Flag)}\r\n {menuItem(ObjectType.Door, DoorImage, setCategory2Flag)}\r\n {menuItem(ObjectType.PyramidRoof, PyramidRoofImage, setCategory2Flag)}\r\n {menuItem(ObjectType.HipRoof, HipRoofImage, setCategory2Flag)}\r\n {menuItem(ObjectType.GableRoof, GableRoofImage, setCategory2Flag)}\r\n {menuItem(ObjectType.GambrelRoof, GambrelRoofImage, setCategory2Flag)}\r\n {menuItem(ObjectType.MansardRoof, MansardRoofImage, setCategory2Flag)}\r\n \r\n );\r\n\r\n const category3Menu = (\r\n \r\n {menuItem(ObjectType.SolarPanel, SolarPanelImage, setCategory3Flag)}\r\n {menuItem(ObjectType.ParabolicTrough, ParabolicTroughImage, setCategory3Flag)}\r\n {menuItem(ObjectType.ParabolicDish, ParabolicDishImage, setCategory3Flag)}\r\n {menuItem(ObjectType.FresnelReflector, FresnelReflectorImage, setCategory3Flag)}\r\n {menuItem(ObjectType.Heliostat, HeliostatImage, setCategory3Flag)}\r\n {menuItem(ObjectType.Sensor, SensorImage, setCategory3Flag)}\r\n {menuItem(ObjectType.Light, LightImage, setCategory3Flag)}\r\n {/*{menuItem(ObjectType.WindTurbine, WaterHeaterImage, setCategory3Flag)}*/}\r\n {/*{menuItem(ObjectType.WindTurbine, WindTurbineImage, setCategory3Flag)}*/}\r\n \r\n );\r\n\r\n const category1Button = (objectType: ObjectType) => {\r\n switch (objectType) {\r\n case ObjectType.Foundation:\r\n return buttonImg(objectType, FoundationImage, useStore.getState().addedFoundationId);\r\n case ObjectType.Cuboid:\r\n return buttonImg(objectType, CuboidImage, useStore.getState().addedCuboidId);\r\n case ObjectType.Tree:\r\n return buttonImg(objectType, TreeImage);\r\n case ObjectType.Flower:\r\n return buttonImg(objectType, FlowerImage);\r\n case ObjectType.Human:\r\n return buttonImg(objectType, HumanImage, undefined, 'People');\r\n }\r\n };\r\n\r\n const category2Button = (objectType: ObjectType) => {\r\n switch (objectType) {\r\n case ObjectType.Wall:\r\n return buttonImg(objectType, WallImage, useStore.getState().addedWallId);\r\n case ObjectType.Window:\r\n return buttonImg(objectType, WindowImage, useStore.getState().addedWindowId);\r\n case ObjectType.Door:\r\n return buttonImg(objectType, DoorImage, useStore.getState().addedDoorId);\r\n case ObjectType.PyramidRoof:\r\n return buttonImg(ObjectType.PyramidRoof, PyramidRoofImage);\r\n case ObjectType.HipRoof:\r\n return buttonImg(ObjectType.HipRoof, HipRoofImage);\r\n case ObjectType.GableRoof:\r\n return buttonImg(ObjectType.GableRoof, GableRoofImage);\r\n case ObjectType.GambrelRoof:\r\n return buttonImg(ObjectType.GambrelRoof, GambrelRoofImage);\r\n case ObjectType.MansardRoof:\r\n return buttonImg(ObjectType.MansardRoof, MansardRoofImage);\r\n }\r\n };\r\n\r\n const category3Button = (objectType: ObjectType) => {\r\n switch (objectType) {\r\n case ObjectType.SolarPanel:\r\n return buttonImg(objectType, SolarPanelImage);\r\n case ObjectType.ParabolicTrough:\r\n return buttonImg(objectType, ParabolicTroughImage);\r\n case ObjectType.ParabolicDish:\r\n return buttonImg(objectType, ParabolicDishImage);\r\n case ObjectType.FresnelReflector:\r\n return buttonImg(objectType, FresnelReflectorImage);\r\n case ObjectType.Heliostat:\r\n return buttonImg(objectType, HeliostatImage);\r\n case ObjectType.Sensor:\r\n return buttonImg(objectType, SensorImage);\r\n case ObjectType.WindTurbine:\r\n return buttonImg(objectType, WindTurbineImage);\r\n case ObjectType.Light:\r\n return buttonImg(objectType, LightImage);\r\n }\r\n };\r\n\r\n const inSelectionMode = () => {\r\n return (\r\n objectTypeToAdd === ObjectType.None &&\r\n !addedFoundationId &&\r\n !addedCuboidId &&\r\n !addedWallId &&\r\n !addedWindowId &&\r\n !addedDoorId &&\r\n !groupAction\r\n );\r\n };\r\n\r\n return (\r\n
\r\n {/* default to select */}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n {/* add buttons in category 1 */}\r\n \r\n {category1Button(category1Flag)}\r\n {dropdownButton(category1Menu)}\r\n \r\n\r\n {/* add buttons in category 2 */}\r\n \r\n {category2Button(category2Flag)}\r\n {dropdownButton(category2Menu)}\r\n \r\n\r\n {/* add buttons in category 3 */}\r\n \r\n {category3Button(category3Flag)}\r\n {dropdownButton(category3Menu)}\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n {\r\n if (showSolarRadiationHeatmap) {\r\n usePrimitiveStore.setState((state) => {\r\n state.showSolarRadiationHeatmap = false;\r\n state.showHeatFluxes = false;\r\n });\r\n } else {\r\n if (!noAnimationForHeatmapSimulation || Util.hasMovingParts(elements)) {\r\n toggleDynamicSolarRadiationHeatmap();\r\n } else {\r\n toggleStaticSolarRadiationHeatmap();\r\n }\r\n }\r\n }}\r\n />\r\n \r\n\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default React.memo(MainToolBarButtons);\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAJCAYAAAARml2dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5gobECQ3lBJ92QAAANlJREFUCJkFwT1OhEAUAOA3M28SgQIJyQYC2dYrUHgJCzuzhZ2VHmNba63MVpQbb0DlBbCwoTIUkBAdTJif9/w+xczQdd1tXddvWZY9lWV5MY7jh+r7Xg3DcJzn+WStfRdCHLTWZ9m2LRHRFkL4TJKkB4A/RCRsmuZmXddr59x+miYnpbwqiuIejTF33vsdIu6EEGCtBWPMgwwhSET8yfP8saqqQxRF3957QmYGAKBt21Zm/gUAYmaBSilyzl0uy/IKAEBEkKbpF8Zx/MLMeyFEAgDMzE5r/fwPyUVuAeqNzhQAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVFBYXpdrWjwAAA4VJREFUWIXl10uIHEUYB/B//fvr6up5d+9unNnHsOO6sw2+8MViYCMeDCKK5BajN+8ievDgwHh0wVMOihAwIoqCsEpAl8RLPBhFZUk8uB4ECRpXMOBm3MzKdLo8pEd87OzMYWZysI71+n5V3dRXpay1uJGFNzQ6AFhr0WsXCoXCYWPMOWPM6/V6PdftP9S4+wEAnAJgAVgROWWMuQkAVlZWnIEmHwJgHcA1kj8opayIfOx53ty+Mw9YBgWcFpHdcrl8hOQHKeJMLpe7eVyAMyISLy0tLYZhWBaRj5RSluTZMAyXxgE4LSJ2bm7uIAAEQTAjIh+miM8ymUw0coDnebZard7frQjDsEzy/RTxxdTU1O0jBywuLh78e2WtVjvguu57JK3W+utyuXzXyAAi8o8d6JZKpRIaY952HMdqrc8HQXDfWAEAsLy8HGit30w/x4VSqbRnv5EBAKBarZa01idIWhH5dnJy8tBYAQAwPz9f8DzvtfSc+D4MwwfHCgCAer2eM8YcT3fip1KpdHisAACIosjVWq+mO/FzsVh8dJyAbmp3Pc97EddzyKV8Pv/YfgDpOysJEekpnJ2d9Vqt1sOtVuveJEkcAO1Op5MB8GuSJJWdnZ2Xoiha39zc7Ow1vi8AAOI4Vr3atre372y32+9YazMkQfL6ykSQJElbRL7xfb/nAvoCkiSBtVYBQKPRUKurq49YayfjOF4DcAWAjeNYk/zF9/1XAVxKkkQ5jqPiOP49CIJPNzY24p4BBkxG9wCAMeZZkpcBxCLyjLUW09PTRkTWSF4xxhzpt6D/xB0gHf8RRdGtWuunSe6QvJaefN91b0jZbPZxkpbkWi6XKw0TsE6yY4x5C8BVklv5fP6o67rvKqVsJpN5CvgrQ54juau1fmiYgE8A2HTFl40xTwCAMeYYyV2SZwF4AOC67nMkreu6x5vN5r53xoEBWutXSP5G8mI+nz/ara9UKqFS6kuSNpvNHgKAYrF4h+M4F0n+6Pv+bUMB1Gq1KWPMk77vP/DvNmNMMz12TwJAs9l0tNYvK6Ws67rPAxjs5jzIFXqvMjMzs0Byi+TWwsLCTIo6RrJD8oIxpjxSAABorU+SjI0xJ0g2SZ5P/5evfN8/MHLAxMTEioi0SMZp4Kta6zcKhcLd6PPsGwqg0Wgo3/dfEJHPPc9rZLPZW6IocgcZ242r/vev4z8B5TAn+0kvIhQAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWAR4FluLjugAAAKtJREFUWIXtl0sOgCAMRDuG+1+5riAVASkfq0lnZ9I4z0lbBMxMlgpERAAuFMyMXYa51yFNdxpLSa9QK8pJR0x66hLArKFG0gurmzC+vDeBQz4A4DeTuAFYyAGqY5hL2xutetmg/0kg6mm8WmNYSsU8AQdwAAco7oHWFlt9Wn4rgdaW0/5o9Mo8AQdQn4YzKvWPGmB0DGvNa341SwlE09oXroSSXt9pQqur2QnRTVJZNG/P0wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goUAggr/uMtcAAAAzxJREFUWIXFVk1II2cYfr7vy/zEnd/EbIs6aqMxCTaKRWpNBdfG4mWPrbfem70ve9oilL0uLaUHD4XS24KXUjxUC21pj5UiFEqLDEI0WA9CYiTuMJO3hzXbVuyaySbxgYGZ7+edZ56H550PRIRWrkKhcH96enqy1fWtXhwt4uDgwD06OnrU6vpW0TKBqampb4QQ71qWVegogzByZTKZJ6Zp/nEjFgBALpf7RJKkibGxseKNKEBEEdu2S7qu1/L5vN5zBQD4six/4XnerXK5vHYTCmB2djYdjUZ9TdNoYmLitZdVoK1Nuq7/BIBkWf7OcZyxXloAAPA875dkMom5ubnC6enp7sDAwNsIEemXsmB9fd20bbsEgADQysoKATiLxWK/G4bx5cjIyL1MJjNfLBaTRMSuq8eIKCzniGmav1Wr1TQATE5OwnVdEBGEEJAkCZxzKIqCRqNxIoTYicfjPzqOs7O5ufntBfF/ioV9ezabTdbr9TgAaJoG13X/XFhY+NSyLO77Pg+CAIwxfn5+zhljchAEqqZpkqqqt68sGNaCwcHBnyORCCmKUsvlcu8RkehZCubn59/XNI00TSMAd4hIAFgeGhr6fnl5ebirKVhbW1P39vY+8zwPjuM8IKIfVFX9QJbl7Vqtdsc0zXhYO0NZYFnWPV3XyTCMh82xbDb7mHNOiqJ4qVTqza4pkM/nb3POP7dt++tKpfLxv6aGGWPgnEsnJyd9XVMgFos9icfjO5dzzRj7inNOQggSQhS6okAikVhUFGVhZmbmHfw3w9y27eFm/peWlt5qR4AXElhdXY2Oj48/SCQSd7e3tyuXpkVfX1+KiNBoNFAul9WOEwDgLS4ufri7u/vr5QnGWHB4ePgUeGZjqVRqtEOg7QZSLBZtSZKOABBjjAB81NU+cBlnZ2cpy7JeaX5EOp1+o506of8FTWxsbDz1ff/5cxAEV/f6a9C2AqOjo68TPQsFYwzHx8f+NVs6S8B13VcvegEYY6hWq70l0N/fn2tacNGqh7a2tm71jIDjOH8ZhoFIJAIigiRJzv7+vhG2zrUnItM0X7igXq9fOR6NRp/fVyoV9n/721agU2jnTNhR/A2OInIG7r+B4wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goWASEWSoKIWAAAAZdJREFUWIXllrEuBFEUhv9fJIR3UGokCiSeQMsbkBD/NoREvIFKQ6jmUqxWqfYAEgmReAFPgYJf4c7m7q5lcNcIJ5ns3jNn5vvmzpnk0DbqjIFa6b9BYLAzQXJN0mE/YCGEOdvnbby0B/oJTySmbF+3ErZbhyRLcprLeUgygJ00V0cPMF3UIfBct0Bb/MtX0Pbp/8tX8DMCJCdIzr5x6rTvAiQ3JN1KuiB5XOaLoqDtq74KRPh+uZa0QrLZqz6rAMn1FJ5ILPWSyCZAclPSQa/zpQTJNmYWgQjf+6hO0hKArawCVeGJxG42gdhwleEAEEJYyCKQNlwIYbwiXLbP0lzXSFYRPlk2XAhhxPY9yWFJDx/AjzrzX92BkfKP7fv4+xhCGPoMHOieCWckXb5HLoqCJAngWNJyBAzafiprGo1G66bvwbsEosQkgEUAox21BlDYvklqm/HTakmQHJN0VwX+etdvDpoAmnHYPAUwXQ62AFarXN+1A18JkieSFst1pSfPtQPJTmzHJ5//zHVZduA78XcnoqrxAhsxq5juT7lFAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wEHEBw2Usn7JwAAA7JJREFUWIXF11uIlVUUB/DfOKnZpBnmQGGplWM25VhGSlkWSZeHsoeiu0WkNoEFFj1IQkVhPfWQXamwosiyCLqMdCG6kJI0RZFd6G6oNFGNXRwbh+lh7Y+zz5lznDMh04LNOd/a6/bt9d//vT/+Z2kYgu1+mJ5+K6UfW9LY6zIZF+JBdKdk1cZ7uB4n7a3EI3E23tpD0mpjG27BlHqS1GrBKKxAO5oz/S/iTf9AY0rYIFozuyLGO1iGT+oppDL5behReqstuBNnYSL2xziMTb8zsATrla/GBswcSvJG3IqdWZDncCpG1OF/MG4SbSj8N6Kt3gLOxW/JsQ9P4KB6nZM04PKKIt7AhMEcp4q+FU4v1Eh+CBbiCpyBAzG6it1VAiv9YkWvHayA87PkP2BuNrcPjsNyPInN+BGfYh3uwQ1ozXwasCaLuR5jaiVvwn2Z8V1KPZ+M2/GFwbfg12LnHJB8Z6IrzX2PebUKmK1EMttxZtK3Gojsb9CBOwRgO5JPMb8Tj4v2jcGbSd+LlbUKOEU56pswHq9n+h1YheOxAJfhYsxP/o9iV2a/OsVenOmeVoN7Ts6MHhF8vyrTdYkeN6aEG9KK7cBrOErwwd3YnXx24epUbG/SfaQcJ1ULuB8nin72p4D3ZraPGdj7dWluNJ5X3q6V+Ds9/4TT8sTVyKURW5MxJao9Jj1vEixZyF/oTP9n4LBs7kMBvsb0XBQ2QOZlk2uSw0IlBPfhXXHSjRdI/zjpFgt6Ph1vZ3G2poIWJP/+VPy0agXkLdiElqS/ThxAORAfwnlYiitxkQBuflRvw6XiRH1YeXuryqF4PzNsz+YuSUVV9v1X/F6h253inJN8m/FlmutOsWrKkixQh1jWQlrECbkRXykhvV8AbLNY/psFVecx/0l2nelFa8pcJULpxY1VbKZhDhal+eW4QHBDZfAjldizT/lOqir7CnYr3my7IJv/IlPwShbrO5xQj+Mkgey8iEUCTPXKdLysvEUrhuBvlnJAdgtubxNsV01GCcy043MDgfmseLkBUutOOAsPKD+Su/AZXhLIHil62ySuanNwRCqGwFGxcn2CLa/BnzVyDpA2wfPFpWIo41txM34x0/WJu8TUegsgrlFLUyHF2VBr9Ai+WK0EuElYq7QV+/GMrJX1fhmNxbHiIGkVFDtR9Pdnsd0+wKsC8bmMEx81BQn1iDvGMqXzZkgyIhUxX5whLXs2B4eLlSiu+p2CJ4ZVJuApscOOHu7khTSr85Nt2ORfxq1ZEqNjj0MAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVDjcggElAxQAAAy1JREFUWIXFl09oVHcQxz+zya67MYk+3IQoddfdjf9SpXhoK1RRVEovght8mBz0FB569ZSDFxX00INgQ+GVHAqFFndJPFcE6cEee1MUYZVkNf6DWCsWmt1OD/u2Pp/vJb/dRTIw8Hhv5jsz35nf7G9FVVlNia1q9E4TKBQK+4LvRCQpImeNQVS1bQUU2BZ4d7UBa4bRcQti3bErvuq7gVet+He3G1hEuoCN9aX602w2a83NzR0GBoHfgaQxUIuUF4EfgCvAkKqSz+fP0GhFUA96PuPAFHAhFLPFBLry+fz3eD0GTkUEb+ou4Jz3nA7DlHb2gIhsBJ4BdQPzPuATVb0X+rWTU+DXTCZjAUeBH/0srOTXFgMricfQE69AEREFelT176Bty6dARPpd1x22LGsQSP18bebfhafVPzObNlXL5fIjVa2p6kLDVA4BTExMMD09/VZEUFV5D9CU4lKp9A3LD5wCWhwtKrDZeLANJn/QJHBYIh0nkEgkdrYT3K+2bXctFyNyBkQkC9xtdUaCUqvXaoBEfQ89Bd5OXwpzKI4WGR8bHwMeLy4uvjx/6VLqqy++Tdfqv9y4Pns9NEhxtMjszGx4EmG0eIP0Xj9d191h0lPHceO2bR8n0ArHcUI3YdjQrfE7ZoeH97SzmGzb7vIXEjWUYcft/+xLpdK6djdjUycnJ4/4CoqZMNA07ve9ywIng7QuoyeB1Lu2OMe8NhSMEnBd90sgNjU15QfdC6wx2BtDnm3Tb6Q5V47jfG3KwEgToBP6gfVNHNu2h23bPhG0ibqS3QEsDe7tFkVVX3kYY+Vy+YFlWc/DjMIYON/p8EXgfmbCwMV4In5ARDqq3i+FQmG39/jChIEtgEpMZoCBTivPZDJHent7FxCuhTITQdfnPWt7Hvb1970BvgP2A8v+qAT8NwCn4on4byOfjijwE40LyQe2kTciEUkBp1M9qTO5XG7r/Pz824H0wB+VSuU+MAe8Bv6isTmTwJCI5JKp5O5cLre9Wq3W0hvSv1YqlcuqejuqPUZXMhHZAxxA2ItyIsounojfWvpn6Q5wG7ipqi9XxDZJ4GPKqv87/g99LxWbCpiI3gAAAABJRU5ErkJggg==\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport styled from 'styled-components';\nimport { Avatar, Button, Dropdown, Menu, Popover, Space } from 'antd';\nimport MainToolBarButtons from './mainToolBarButtons';\nimport i18n from './i18n/i18n';\nimport React, { useMemo } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\n\nconst ButtonsContainer = styled.div`\n position: absolute;\n top: 0;\n right: 10px;\n margin: 0;\n padding-bottom: 0;\n padding-top: 16px;\n display: flex;\n justify-content: center;\n align-items: center;\n user-select: none;\n z-index: 9;\n`;\n\nexport interface MainToolBarProps {\n signIn: () => void;\n signOut: () => void;\n}\n\nconst MainToolBar = ({ signIn, signOut }: MainToolBarProps) => {\n const language = useStore(Selector.language);\n const user = useStore(Selector.user);\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const avatarMenu = (\n \n {\n usePrimitiveStore.setState((state) => {\n state.showAccountSettingsPanel = true;\n });\n }}\n >\n {i18n.t('avatarMenu.AccountSettings', lang)}\n \n \n {i18n.t('avatarMenu.SignOut', lang)}\n \n \n );\n\n return (\n \n \n {!openModelsMap && }\n
\n {user.displayName ? (\n \n e.preventDefault()}\n title={i18n.t('tooltip.clickToAccessAccountSettings', lang)}\n >\n \n \n \n ) : (\n e.stopPropagation()}>{i18n.t('avatarMenu.PrivacyStatementTitle', lang)}
}\n content={\n
\n {i18n.t('avatarMenu.PrivacyStatement', lang)}\n \n {i18n.t('aboutUs.PrivacyPolicy', lang)}\n \n .\n
\n }\n >\n \n \n )}\n \n
\n
\n );\n};\n\nexport default React.memo(MainToolBar);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useRef, useState } from 'react';\nimport { Button, Input, Modal, Space } from 'antd';\nimport i18n from './i18n/i18n';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport { REGEX_ALLOWABLE_IN_NAME } from './constants';\n\nexport interface CloudFileSaveModalProps {\n saveToCloud: (title: string, silent: boolean, checkExistence: boolean) => void;\n isLoading: () => boolean;\n setTitle: (title: string) => void;\n getTitle: () => string;\n setTitleDialogVisible: (visible: boolean) => void;\n isTitleDialogVisible: () => boolean;\n}\n\nconst SaveCloudFileModal = ({\n saveToCloud,\n isLoading,\n setTitle,\n getTitle,\n setTitleDialogVisible,\n isTitleDialogVisible,\n}: CloudFileSaveModalProps) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n\n const lang = { lng: language };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const onOk = () => {\n saveToCloud(getTitle(), false, true);\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = false;\n });\n };\n\n const onCancel = () => {\n setTitleDialogVisible(false);\n setCommonStore((state) => {\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\n state.showCloudFileTitleDialog = false;\n });\n };\n\n return (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('menu.file.SaveAsCloudFile', lang)}\n \n }\n visible={isTitleDialogVisible()}\n footer={[\n ,\n ,\n ]}\n confirmLoading={isLoading()}\n onCancel={onCancel}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n {i18n.t('word.Title', lang)}:\n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e: React.ChangeEvent) => {\n setTitle(e.target.value);\n }}\n />\n \n \n );\n};\n\nexport default React.memo(SaveCloudFileModal);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableBounds, DraggableData, DraggableEvent, DraggableEventHandler } from 'react-draggable';\nimport { Dropdown, Input, Menu, Modal, Space, Table, Typography } from 'antd';\nimport { CaretDownOutlined, QuestionCircleOutlined, WarningOutlined } from '@ant-design/icons';\nimport { HOME_URL, REGEX_ALLOWABLE_IN_NAME, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { copyTextToClipboard, showSuccess } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport Draggable from 'react-draggable';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { ProjectInfo } from '../types';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 90px;\n right: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 14;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 640px;\n height: 520px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: hidden;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface ProjectListPanelProps {\n projects: object[];\n setProjectState: (projectInfo: ProjectInfo) => void;\n deleteProject: (title: string) => void;\n renameProject: (oldTitle: string, newTitle: string) => void;\n}\n\nconst ProjectListPanel = ({ projects, setProjectState, deleteProject, renameProject }: ProjectListPanelProps) => {\n const language = useStore(Selector.language);\n const user = useStore(Selector.user);\n const setCommonStore = useStore(Selector.set);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 600;\n const [curPosition, setCurPosition] = useState({ x: 0, y: 0 });\n const [renameDialogVisible, setRenameDialogVisible] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const [oldTitle, setOldTitle] = useState();\n const [newTitle, setNewTitle] = useState();\n const dragRef = useRef(null);\n // make an editable copy because the project array is not mutable\n const projectsRef = useRef([...projects]);\n // set a flag so that we can update when projectsRef changes\n const [recountFlag, setRecountFlag] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n\n const { Search } = Input;\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(0, wOffset - window.innerWidth),\n y: Math.min(0, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (projects) {\n projectsRef.current = [...projects];\n setRecountFlag(!recountFlag);\n }\n }, [projects]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n // TODO: Should we save the position?\n };\n\n const closePanel = () => {\n usePrimitiveStore.setState((state) => {\n state.showProjectListPanel = false;\n });\n };\n\n const confirmDeleteProject = (title: string) => {\n Modal.confirm({\n title: i18n.t('projectListPanel.DoYouReallyWantToDeleteProject', lang) + ' \"' + title + '\"?',\n content: (\n \n \n {i18n.t('word.Warning', lang) + ': ' + i18n.t('message.ThisCannotBeUndone', lang)}\n \n ),\n icon: ,\n onOk: () => {\n deleteProject(title);\n },\n });\n };\n\n const changeProjectTitle = () => {\n if (oldTitle && newTitle) {\n renameProject(oldTitle, newTitle);\n setNewTitle(undefined);\n setRecountFlag(!recountFlag);\n }\n setRenameDialogVisible(false);\n };\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n return (\n <>\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('word.Rename', lang)}\n \n }\n visible={renameDialogVisible}\n onOk={changeProjectTitle}\n onCancel={() => {\n setRenameDialogVisible(false);\n setNewTitle(undefined);\n }}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n {\n if (!REGEX_ALLOWABLE_IN_NAME.test(e.key)) {\n e.preventDefault();\n return false;\n }\n }}\n onChange={(e: React.ChangeEvent) => {\n setNewTitle(e.target.value);\n }}\n />\n \n \n {i18n.t('word.Caution', lang) +\n ': ' +\n i18n.t('projectListPanel.IfSharedOrPublishedRenamingProjectBreaksExistingLinks', lang)}\n .\n \n \n \n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'projectListPanel';\n });\n }}\n >\n \n \n
\n {i18n.t('projectListPanel.MyProjects', lang) + ' (' + projectsRef.current.length + ')'}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {\n if (!projects) return;\n // must create a new array for ant table to update (don't just set length to 0)\n projectsRef.current = [];\n for (const f of projects) {\n // @ts-ignore\n if (f['title']?.toLowerCase().includes(s.toLowerCase())) {\n projectsRef.current.push(f);\n }\n }\n setRecountFlag(!recountFlag);\n }}\n />\n \n \n {\n return {type};\n }}\n onCell={(data, index) => {\n return {\n style: {\n background:\n selectedIndex === index\n ? 'lightskyblue'\n : index !== undefined && index % 2 === 0\n ? 'beige'\n : 'gainsboro',\n },\n };\n }}\n />\n {\n return (a as any)['title'].localeCompare((b as any)['title']);\n }}\n render={(title, record, index) => {\n let selection: string | undefined = undefined;\n return (\n \n {\n selection = window.getSelection()?.toString();\n }}\n >\n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n setProjectState(record as ProjectInfo);\n }}\n >\n {i18n.t('word.Open', lang)}\n \n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n if (selection && selection.length > 0) {\n copyTextToClipboard(selection);\n } else {\n copyTextToClipboard(title);\n }\n showSuccess(i18n.t('projectListPanel.TitleCopiedToClipBoard', lang) + '.');\n }}\n >\n {i18n.t('projectListPanel.CopyTitle', lang)}\n \n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n setOldTitle(title);\n setRenameDialogVisible(true);\n }}\n >\n {i18n.t('word.Rename', lang)}\n \n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n confirmDeleteProject(title);\n }}\n >\n {i18n.t('word.Delete', lang)}\n \n {\n menuInfo.domEvent.preventDefault();\n menuInfo.domEvent.stopPropagation();\n const url =\n HOME_URL + '?client=web&userid=' + user.uid + '&project=' + encodeURIComponent(title);\n copyTextToClipboard(url);\n showSuccess(i18n.t('projectListPanel.ProjectLinkGeneratedInClipBoard', lang) + '.');\n }}\n >\n {i18n.t('projectListPanel.GenerateProjectLink', lang)}\n \n \n }\n trigger={['hover']}\n >\n {\n if (index !== undefined) setSelectedIndex(index);\n }}\n onMouseLeave={() => {\n setSelectedIndex(-1);\n }}\n />\n \n \n {title}\n \n \n );\n }}\n onCell={(data, index) => {\n return {\n style: {\n background:\n selectedIndex === index\n ? 'lightskyblue'\n : index !== undefined && index % 2 === 0\n ? 'beige'\n : 'gainsboro',\n },\n // onClick: () => {\n // const selection = window.getSelection();\n // if (selection && selection.toString().length > 0) return;\n // // only proceed when no text is selected\n // setProjectState(data as ProjectInfo);\n // },\n };\n }}\n />\n {\n // @ts-ignore\n return a['timestamp'] - b['timestamp'];\n }}\n render={(time) => {\n return {time};\n }}\n onCell={(data, index) => {\n return {\n style: {\n background:\n selectedIndex === index\n ? 'lightskyblue'\n : index !== undefined && index % 2 === 0\n ? 'beige'\n : 'gainsboro',\n },\n };\n }}\n />\n \n
\n \n \n \n );\n};\n\nexport default React.memo(ProjectListPanel);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport * as Selector from './stores/selector';\r\nimport { Modal } from 'antd';\r\nimport dayjs from 'dayjs';\r\nimport 'antd/dist/antd.css';\r\nimport firebase from 'firebase/app';\r\nimport 'firebase/auth';\r\nimport 'firebase/firestore';\r\nimport 'firebase/storage';\r\nimport { showError, showInfo, showSuccess } from './helpers';\r\nimport {\r\n ClassID,\r\n CloudFileInfo,\r\n DataColoring,\r\n Design,\r\n DesignProblem,\r\n FirebaseName,\r\n ModelSite,\r\n ObjectType,\r\n ProjectInfo,\r\n SchoolID,\r\n User,\r\n} from './types';\r\nimport CloudFilePanel from './panels/cloudFilePanel';\r\nimport Spinner from './components/spinner';\r\nimport AccountSettingsPanel from './panels/accountSettingsPanel';\r\nimport i18n from './i18n/i18n';\r\nimport { ExclamationCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';\r\nimport { Util } from './Util';\r\nimport { HOME_URL } from './constants';\r\nimport ModelsMapWrapper from './modelsMapWrapper';\r\nimport MainToolBar from './mainToolBar';\r\nimport SaveCloudFileModal from './saveCloudFileModal';\r\nimport ModelsGallery from './modelsGallery';\r\nimport ProjectListPanel from './panels/projectListPanel';\r\nimport { loadCloudFile } from './cloudFileUtil';\r\nimport { changeDesignTitles, copyDesign, createDesign, fetchProject, getImageData } from './cloudProjectUtil';\r\nimport { ProjectUtil } from './panels/ProjectUtil';\r\n\r\nexport interface CloudManagerProps {\r\n viewOnly: boolean;\r\n canvas?: HTMLCanvasElement | null;\r\n}\r\n\r\nconst useFlag = (flag: boolean, fn: Function, setFlag: () => void) => {\r\n useEffect(() => {\r\n if (flag) {\r\n fn();\r\n setFlag();\r\n }\r\n }, [flag]);\r\n};\r\n\r\nconst CloudManager = ({ viewOnly = false, canvas }: CloudManagerProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\r\n const language = useStore(Selector.language);\r\n const user = useStore(Selector.user);\r\n const latitude = useStore(Selector.world.latitude);\r\n const longitude = useStore(Selector.world.longitude);\r\n const address = useStore(Selector.world.address);\r\n const countryCode = useStore(Selector.world.countryCode);\r\n const exportContent = useStore(Selector.exportContent);\r\n const showCloudFilePanel = usePrimitiveStore(Selector.showCloudFilePanel);\r\n const showProjectListPanel = usePrimitiveStore(Selector.showProjectListPanel);\r\n const showModelsGallery = usePrimitiveStore(Selector.showModelsGallery);\r\n const showAccountSettingsPanel = usePrimitiveStore(Selector.showAccountSettingsPanel);\r\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\r\n const cloudFile = useStore(Selector.cloudFile);\r\n const saveCloudFileFlag = usePrimitiveStore(Selector.saveCloudFileFlag);\r\n const modelsMapFlag = usePrimitiveStore(Selector.modelsMapFlag);\r\n const leaderboardFlag = usePrimitiveStore(Selector.leaderboardFlag);\r\n const publishOnMapFlag = usePrimitiveStore(Selector.publishOnModelsMapFlag);\r\n const listCloudFilesFlag = usePrimitiveStore(Selector.listCloudFilesFlag);\r\n const showCloudFileTitleDialog = useStore(Selector.showCloudFileTitleDialog);\r\n const showCloudFileTitleDialogFlag = useStore(Selector.showCloudFileTitleDialogFlag);\r\n const importContent = useStore(Selector.importContent);\r\n const createEmptyFile = useStore(Selector.createEmptyFile);\r\n const changed = usePrimitiveStore(Selector.changed);\r\n const localContentToImportAfterCloudFileUpdate = useStore(Selector.localContentToImportAfterCloudFileUpdate);\r\n const peopleModels = useStore(Selector.peopleModels);\r\n const createProjectFlag = usePrimitiveStore(Selector.createProjectFlag);\r\n const saveProjectFlag = usePrimitiveStore(Selector.saveProjectFlag);\r\n const curateDesignToProjectFlag = usePrimitiveStore(Selector.curateDesignToProjectFlag);\r\n const showProjectsFlag = usePrimitiveStore(Selector.showProjectsFlag);\r\n const updateProjectsFlag = usePrimitiveStore(Selector.updateProjectsFlag);\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const [cloudFileArray, setCloudFileArray] = useState([]);\r\n const [projectArray, setProjectArray] = useState([]);\r\n const [updateProjectArrayFlag, setUpdateProjectArrayFlag] = useState(false);\r\n const [title, setTitle] = useState(cloudFile ?? 'My Aladdin File');\r\n const [titleDialogVisible, setTitleDialogVisible] = useState(false);\r\n const cloudFiles = useRef();\r\n const myProjects = useRef(); // Not sure why I need to use ref to store this\r\n const authorModelsRef = useRef>();\r\n const firstAccountSettings = useRef(true);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n useEffect(() => {\r\n const config = {\r\n apiKey: process.env.REACT_APP_FIREBASE_API_KEY,\r\n authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,\r\n projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,\r\n storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,\r\n databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL,\r\n messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,\r\n appId: process.env.REACT_APP_FIREBASE_APP_ID,\r\n };\r\n let initialize = firebase.apps.length === 0; // no app, should initialize\r\n if (firebase.apps.length === 1 && firebase.apps[0].name === FirebaseName.LOG_DATA) {\r\n initialize = true; // if there is only the logger app, should initialize\r\n }\r\n if (initialize) {\r\n firebase.initializeApp(config);\r\n } else {\r\n firebase.app(); // if already initialized, use the default one\r\n }\r\n\r\n // don't enable persistence as we often need to open multiple tabs\r\n // firebase.firestore().enablePersistence()\r\n // .catch((err) => {\r\n // if (err.code === 'failed-precondition') {\r\n // showWarning('Firestore: Multiple tabs open, persistence can only be enabled in one tab at a time.', 10);\r\n // } else if (err.code === 'unimplemented') {\r\n // showWarning('Firestore: The current browser does not support offline persistence, 10');\r\n // }\r\n // });\r\n\r\n // do not use firebase.auth().currentUser - currentUser might be null because the auth object has not finished initializing.\r\n // If you use an observer to keep track of the user's sign-in status, you don't need to handle this case.\r\n firebase.auth().onAuthStateChanged((u) => {\r\n const params = new URLSearchParams(window.location.search);\r\n const title = params.get('title');\r\n if (u) {\r\n setCommonStore((state) => {\r\n if (state.user) {\r\n state.user.uid = u.uid;\r\n state.user.displayName = u.displayName;\r\n state.user.email = u.email;\r\n state.user.photoURL = u.photoURL;\r\n }\r\n state.cloudFile = title ?? undefined;\r\n });\r\n } else {\r\n setCommonStore((state) => {\r\n state.cloudFile = title ?? undefined;\r\n });\r\n }\r\n });\r\n init();\r\n window.addEventListener('popstate', handlePopStateEvent);\r\n return () => {\r\n window.removeEventListener('popstate', handlePopStateEvent);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const handlePopStateEvent = () => {\r\n if (viewOnly) return;\r\n const p = new URLSearchParams(window.location.search);\r\n const userid = p.get('userid');\r\n const title = p.get('title');\r\n if (userid && title) {\r\n openCloudFile(userid, title, true);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (cloudFiles.current) {\r\n const arr: any[] = [];\r\n cloudFiles.current.forEach((f, i) => {\r\n arr.push({\r\n key: i.toString(),\r\n title: f.fileName,\r\n time: dayjs(new Date(f.timestamp)).format('MM/DD/YYYY hh:mm A'),\r\n timestamp: f.timestamp,\r\n userid: f.userid,\r\n action: '',\r\n });\r\n });\r\n arr.sort((a, b) => b.timestamp - a.timestamp);\r\n setCloudFileArray(arr);\r\n }\r\n // FIXME: React says that the dependency of the mutable cloudFiles.current is unnecessary,\r\n // but we need this for the code to work.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [cloudFiles.current]);\r\n\r\n useEffect(() => {\r\n if (myProjects.current) {\r\n const arr: any[] = [];\r\n myProjects.current.forEach((f, i) => {\r\n arr.push({\r\n key: i.toString(),\r\n owner: f.owner,\r\n title: f.title,\r\n time: dayjs(new Date(f.timestamp)).format('MM/DD/YYYY hh:mm A'),\r\n timestamp: f.timestamp,\r\n description: f.description,\r\n dataColoring: f.dataColoring,\r\n selectedProperty: f.selectedProperty,\r\n sortDescending: f.sortDescending,\r\n xAxisNameScatteredPlot: f.xAxisNameScatteredPlot,\r\n yAxisNameScatteredPlot: f.yAxisNameScatteredPlot,\r\n dotSizeScatteredPlot: f.dotSizeScatteredPlot,\r\n thumbnailWidth: f.thumbnailWidth,\r\n type: f.type,\r\n designs: f.designs,\r\n ranges: f.ranges ?? [],\r\n hiddenParameters: f.hiddenParameters ?? ProjectUtil.getDefaultHiddenParameters(f.type),\r\n counter: f.counter,\r\n action: '',\r\n });\r\n });\r\n arr.sort((a, b) => b.timestamp - a.timestamp);\r\n setProjectArray(arr);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [myProjects.current, updateProjectArrayFlag]);\r\n\r\n // fetch all the models that belong to the current user, including those published under all aliases\r\n useEffect(() => {\r\n authorModelsRef.current = new Map();\r\n if (user.aliases && user.aliases.length > 0) {\r\n for (const a of user.aliases) {\r\n if (a !== user.displayName) {\r\n const m = peopleModels.get(a);\r\n if (m) authorModelsRef.current = new Map([...authorModelsRef.current, ...m]);\r\n }\r\n }\r\n }\r\n if (user.displayName) {\r\n const m = peopleModels.get(user.displayName);\r\n if (m) authorModelsRef.current = new Map([...authorModelsRef.current, ...m]);\r\n }\r\n }, [peopleModels, user.displayName, user.aliases]);\r\n\r\n useFlag(saveCloudFileFlag, updateCloudFile, () => setPrimitiveStore('saveCloudFileFlag', false));\r\n\r\n useFlag(modelsMapFlag, fetchModelSitesFn, () => setPrimitiveStore('modelsMapFlag', false));\r\n\r\n useFlag(leaderboardFlag, fetchPeopleModelsFn, () => setPrimitiveStore('leaderboardFlag', false));\r\n\r\n useFlag(publishOnMapFlag, publishOnModelsMap, () => setPrimitiveStore('publishOnModelsMapFlag', false));\r\n\r\n useFlag(createProjectFlag, createNewProject, () => setPrimitiveStore('createProjectFlag', false));\r\n\r\n useFlag(saveProjectFlag, saveProjectAs, () => setPrimitiveStore('saveProjectFlag', false));\r\n\r\n useFlag(showProjectsFlag, showMyProjectsList, () => setPrimitiveStore('showProjectsFlag', false));\r\n\r\n useFlag(updateProjectsFlag, hideMyProjectsList, () => setPrimitiveStore('updateProjectsFlag', false));\r\n\r\n useFlag(listCloudFilesFlag, listMyCloudFiles, () => setPrimitiveStore('listCloudFilesFlag', false));\r\n\r\n useFlag(curateDesignToProjectFlag, curateDesignToProject, () =>\r\n setPrimitiveStore('curateDesignToProjectFlag', false),\r\n );\r\n\r\n useEffect(() => {\r\n setTitleDialogVisible(showCloudFileTitleDialog);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [showCloudFileTitleDialogFlag]);\r\n\r\n useEffect(() => {\r\n setTitle(cloudFile ?? 'My Aladdin File');\r\n }, [cloudFile]);\r\n\r\n useEffect(() => {\r\n if (firstAccountSettings.current) {\r\n firstAccountSettings.current = false;\r\n } else {\r\n saveAccountSettings(user);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [user.signFile, user.schoolID, user.classID]);\r\n\r\n const init = () => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userid = params.get('userid');\r\n if (userid) {\r\n const title = params.get('title');\r\n const project = params.get('project');\r\n if (project) {\r\n setLoading(true);\r\n fetchProject(userid, project, setProjectState).finally(() => {\r\n setLoading(false);\r\n });\r\n if (title) {\r\n openDesignFile(userid, title);\r\n }\r\n } else {\r\n if (title) {\r\n openCloudFile(userid, title);\r\n }\r\n }\r\n } else {\r\n setCommonStore((state) => {\r\n // make sure that the cloud file state is consistent with the URL\r\n state.cloudFile = undefined;\r\n });\r\n }\r\n };\r\n\r\n const resetToSelectMode = () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n });\r\n };\r\n\r\n const signIn = () => {\r\n const provider = new firebase.auth.GoogleAuthProvider();\r\n firebase\r\n .auth()\r\n .signInWithPopup(provider)\r\n .then((result) => {\r\n setCommonStore((state) => {\r\n if (result.user) {\r\n state.user.uid = result.user.uid;\r\n state.user.email = result.user.email;\r\n state.user.displayName = result.user.displayName;\r\n state.user.photoURL = result.user.photoURL;\r\n registerUser({ ...state.user }).then(() => {\r\n // ignore\r\n });\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n if (error.code !== 'auth/popup-closed-by-user' && error.code !== 'auth/cancelled-popup-request') {\r\n showError(i18n.t('message.CannotSignIn', lang) + ': ' + error);\r\n }\r\n });\r\n resetToSelectMode();\r\n };\r\n\r\n const registerUser = async (user: User): Promise => {\r\n const firestore = firebase.firestore();\r\n let signFile = false;\r\n let noLogging = false;\r\n let userCount = 0;\r\n let schoolID = SchoolID.UNKNOWN;\r\n let classID = ClassID.UNKNOWN;\r\n let likes: string[] = [];\r\n let published: string[] = [];\r\n let aliases: string[] = [];\r\n const found = await firestore\r\n .collection('users')\r\n .get()\r\n .then((querySnapshot) => {\r\n userCount = querySnapshot.size;\r\n for (const doc of querySnapshot.docs) {\r\n if (doc.id === user.uid) {\r\n const docData = doc.data();\r\n signFile = !!docData.signFile;\r\n noLogging = !!docData.noLogging;\r\n schoolID = docData.schoolID ? (docData.schoolID as SchoolID) : SchoolID.UNKNOWN;\r\n classID = docData.classID ? (docData.classID as ClassID) : ClassID.UNKNOWN;\r\n if (docData.likes) likes = docData.likes;\r\n if (docData.published) published = docData.published;\r\n if (docData.aliases) aliases = docData.aliases;\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n if (found) {\r\n setCommonStore((state) => {\r\n state.user.signFile = signFile;\r\n state.user.noLogging = noLogging;\r\n state.user.schoolID = schoolID;\r\n state.user.classID = classID;\r\n state.user.likes = likes;\r\n state.user.published = published;\r\n state.user.aliases = aliases;\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.userCount = userCount;\r\n });\r\n user.signFile = signFile;\r\n user.noLogging = noLogging;\r\n user.schoolID = schoolID;\r\n user.classID = classID;\r\n user.likes = likes;\r\n user.published = published;\r\n user.aliases = aliases;\r\n } else {\r\n if (user.uid) {\r\n firestore\r\n .collection('users')\r\n .doc(user.uid)\r\n .set({\r\n uid: user.uid,\r\n signFile: !!user.signFile, // don't listen to WebStorm's suggestion to simplify it\r\n noLogging: !!user.noLogging,\r\n schoolID: user.schoolID ?? SchoolID.UNKNOWN,\r\n classID: user.classID ?? ClassID.UNKNOWN,\r\n since: dayjs(new Date()).format('MM/DD/YYYY hh:mm A'),\r\n os: Util.getOS(),\r\n })\r\n .then(() => {\r\n showInfo(i18n.t('message.YourAccountWasCreated', lang));\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotCreateAccount', lang) + ': ' + error);\r\n });\r\n }\r\n }\r\n };\r\n\r\n const signOut = () => {\r\n firebase\r\n .auth()\r\n .signOut()\r\n .then(() => {\r\n setCommonStore((state) => {\r\n state.user.uid = null;\r\n state.user.email = null;\r\n state.user.displayName = null;\r\n state.user.photoURL = null;\r\n state.user.signFile = false;\r\n state.user.likes = [];\r\n state.user.published = [];\r\n state.user.aliases = [];\r\n state.cloudFile = undefined; // if there is a current cloud file\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.showCloudFilePanel = false;\r\n state.showAccountSettingsPanel = false;\r\n state.showModelsGallery = false;\r\n state.showProjectListPanel = false;\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotSignOut', lang) + ': ' + error);\r\n });\r\n };\r\n\r\n const saveAccountSettings = (user: User) => {\r\n if (user.uid) {\r\n const firestore = firebase.firestore();\r\n firestore\r\n .collection('users')\r\n .doc(user.uid)\r\n .update({\r\n signFile: !!user.signFile,\r\n schoolID: user.schoolID ?? SchoolID.UNKNOWN,\r\n classID: user.classID ?? ClassID.UNKNOWN,\r\n })\r\n .then(() => {\r\n showInfo(i18n.t('message.YourAccountSettingsWereSaved', lang));\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotSaveYourAccountSettings', lang) + ': ' + error);\r\n });\r\n }\r\n };\r\n\r\n const fetchModelSites = async () => {\r\n setLoading(true);\r\n await firebase\r\n .firestore()\r\n .collection('models')\r\n .get()\r\n .then((querySnapshot) => {\r\n const models = new Map>();\r\n querySnapshot.forEach((doc) => {\r\n const data = doc.data();\r\n if (data) {\r\n const m = new Map();\r\n for (const k in data) {\r\n if (!data[k].countryCode) {\r\n if (data[k].address?.endsWith('USA')) data[k]['countryCode'] = 'US';\r\n }\r\n m.set(k, data[k]);\r\n }\r\n models.set(doc.id, m);\r\n }\r\n });\r\n setCommonStore((state) => {\r\n state.modelSites = models;\r\n });\r\n return models;\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotLoadModelsOnMap', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n // get latest submission\r\n const fetchLatest = async () => {\r\n await firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('info')\r\n .get()\r\n .then((doc) => {\r\n if (doc.exists) {\r\n const data = doc.data();\r\n if (data && data.latestModel) {\r\n setCommonStore((state) => {\r\n // if it has been deleted, don't show\r\n let existing = false;\r\n const m = data.latestModel as ModelSite;\r\n if (m.author) {\r\n existing = !!state.peopleModels.get(m.author)?.get(Util.getModelKey(m));\r\n }\r\n state.latestModelSite = existing ? m : undefined;\r\n });\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n };\r\n\r\n const fetchPeopleModels = async () => {\r\n setLoading(true);\r\n await firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('people')\r\n .get()\r\n .then((doc) => {\r\n const data = doc.data();\r\n if (data) {\r\n const peopleModels = new Map>();\r\n for (const k in data) {\r\n peopleModels.set(k, new Map(Object.entries(data[k])));\r\n }\r\n setCommonStore((state) => {\r\n state.peopleModels = peopleModels;\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotLoadLeaderboard', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const deleteFromModelsMap = (model: ModelSite, successCallback?: Function) => {\r\n // pass if there is no user currently logged in\r\n if (user && user.uid) {\r\n firebase\r\n .firestore()\r\n .collection('models')\r\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\r\n .update({ [Util.getModelKey(model)]: firebase.firestore.FieldValue.delete() })\r\n .then(() => {\r\n showSuccess(i18n.t('message.ModelDeletedFromMap', lang));\r\n if (successCallback) successCallback();\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotDeleteModelFromMap', lang) + ': ' + error);\r\n });\r\n // remove the record from the leaderboard\r\n firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('people')\r\n .update({\r\n [(model.author ?? 'Anonymous') + '.' + Util.getModelKey(model)]: firebase.firestore.FieldValue.delete(),\r\n })\r\n .then(() => {\r\n // also remove the cached record\r\n setCommonStore((state) => {\r\n if (state.peopleModels) {\r\n state.peopleModels.delete(Util.getModelKey(model));\r\n usePrimitiveStore.setState((state) => {\r\n state.leaderboardFlag = true;\r\n });\r\n }\r\n });\r\n });\r\n // remove the record in the user's account\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .update({\r\n published: firebase.firestore.FieldValue.arrayRemove(model.title),\r\n })\r\n .then(() => {\r\n // also remove the cached record\r\n setCommonStore((state) => {\r\n if (state.user && state.user.published) {\r\n if (state.user.published.includes(model.title)) {\r\n const index = state.user.published.indexOf(model.title);\r\n if (index >= 0) {\r\n state.user.published.splice(index, 1);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n const likeModelsMap = (model: ModelSite, like: boolean, successCallback?: Function) => {\r\n // pass if there is no user currently logged in\r\n if (user && user.uid) {\r\n const modelKey = Util.getModelKey(model);\r\n // keep or remove a record of like in the user's account\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .update(\r\n like\r\n ? {\r\n likes: firebase.firestore.FieldValue.arrayUnion(modelKey),\r\n }\r\n : {\r\n likes: firebase.firestore.FieldValue.arrayRemove(modelKey),\r\n },\r\n )\r\n .then(() => {\r\n // ignore\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotLikeModelFromMap', lang) + ': ' + error);\r\n });\r\n // increment or decrement the likes counter\r\n const likeCountPath = modelKey + '.likeCount';\r\n firebase\r\n .firestore()\r\n .collection('models')\r\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\r\n .update(\r\n like\r\n ? {\r\n [likeCountPath]: firebase.firestore.FieldValue.increment(1),\r\n }\r\n : {\r\n [likeCountPath]: firebase.firestore.FieldValue.increment(-1),\r\n },\r\n )\r\n .then(() => {\r\n if (successCallback) successCallback();\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotLikeModelFromMap', lang) + ': ' + error);\r\n });\r\n }\r\n };\r\n\r\n const pinModelsMap = (model: ModelSite, pinned: boolean, successCallback?: Function) => {\r\n // pass if there is no user currently logged in\r\n if (user && user.uid) {\r\n firebase\r\n .firestore()\r\n .collection('models')\r\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\r\n .update({\r\n [Util.getModelKey(model) + '.pinned']: pinned,\r\n })\r\n .then(() => {\r\n if (successCallback) successCallback();\r\n })\r\n .catch((error) => {\r\n // ignore\r\n });\r\n }\r\n };\r\n\r\n // TODO:\r\n // unfortunately, this throws an error for users who do not log in\r\n // because of write access is only granted to registered users who log in.\r\n const countClicksModelsMap = (model: ModelSite) => {\r\n // pass if there is no user currently logged in\r\n if (user && user.uid) {\r\n firebase\r\n .firestore()\r\n .collection('models')\r\n .doc(Util.getLatLngKey(model.latitude, model.longitude))\r\n .update({\r\n [Util.getModelKey(model) + '.clickCount']: firebase.firestore.FieldValue.increment(1),\r\n })\r\n .then(() => {\r\n // ignore\r\n })\r\n .catch((error) => {\r\n // ignore\r\n });\r\n }\r\n };\r\n\r\n // fetch owner's projects from the cloud\r\n const fetchMyProjects = async (silent: boolean) => {\r\n if (!user.uid) return;\r\n if (!silent) setLoading(true);\r\n myProjects.current = await firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .get()\r\n .then((querySnapshot) => {\r\n const a: ProjectInfo[] = [];\r\n querySnapshot.forEach((doc) => {\r\n const data = doc.data();\r\n a.push({\r\n owner: user.uid,\r\n title: doc.id,\r\n timestamp: data.timestamp,\r\n description: data.description,\r\n dataColoring: data.dataColoring,\r\n selectedProperty: data.selectedProperty,\r\n sortDescending: data.sortDescending,\r\n xAxisNameScatteredPlot: data.xAxisNameScatteredPlot,\r\n yAxisNameScatteredPlot: data.yAxisNameScatteredPlot,\r\n dotSizeScatteredPlot: data.dotSizeScatteredPlot,\r\n thumbnailWidth: data.thumbnailWidth,\r\n type: data.type,\r\n designs: data.designs ?? [],\r\n ranges: data.ranges ?? [],\r\n hiddenParameters: data.hiddenParameters ?? ProjectUtil.getDefaultHiddenParameters(data.type),\r\n counter: data.counter ?? 0,\r\n } as ProjectInfo);\r\n });\r\n return a;\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotOpenYourProjects', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n if (!silent) setLoading(false);\r\n });\r\n };\r\n\r\n const listMyProjects = (show: boolean) => {\r\n if (user.uid) {\r\n fetchMyProjects(!show).then(() => {\r\n if (show) {\r\n usePrimitiveStore.setState((state) => {\r\n state.showProjectListPanel = true;\r\n });\r\n }\r\n setUpdateProjectArrayFlag(!updateProjectArrayFlag);\r\n });\r\n }\r\n };\r\n\r\n const deleteProject = (title: string) => {\r\n if (!user.uid) return;\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .doc(title)\r\n .delete()\r\n .then(() => {\r\n if (myProjects.current && user.uid) {\r\n // also delete the designs of the deleted project\r\n for (const p of myProjects.current) {\r\n if (p.title === title && p.designs) {\r\n for (const d of p.designs) {\r\n setCommonStore((state) => {\r\n if (d.title === state.cloudFile) {\r\n state.cloudFile = undefined;\r\n }\r\n });\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('designs')\r\n .doc(d.title)\r\n .delete()\r\n .then(() => {\r\n // ignore\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n myProjects.current = myProjects.current.filter((e) => {\r\n return e.title !== title;\r\n });\r\n setUpdateFlag(!updateFlag);\r\n }\r\n setCommonStore((state) => {\r\n if (title === state.projectInfo.title) {\r\n state.projectInfo.title = null;\r\n state.projectInfo.description = null;\r\n state.projectInfo.dataColoring = DataColoring.ALL;\r\n state.projectInfo.selectedProperty = null;\r\n state.projectInfo.sortDescending = false;\r\n state.projectInfo.xAxisNameScatteredPlot = null;\r\n state.projectInfo.yAxisNameScatteredPlot = null;\r\n state.projectInfo.dotSizeScatteredPlot = 5;\r\n state.projectInfo.thumbnailWidth = 200;\r\n state.projectInfo.counter = 0;\r\n state.projectInfo.designs = [];\r\n state.projectInfo.ranges = [];\r\n state.projectInfo.hiddenParameters = ProjectUtil.getDefaultHiddenParameters(state.projectInfo.type);\r\n state.designProjectType = null;\r\n state.projectView = false;\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotDeleteProject', lang) + ': ' + error);\r\n });\r\n };\r\n\r\n const renameProject = (oldTitle: string, newTitle: string) => {\r\n // check if the new project title is already taken\r\n fetchMyProjects(false).then(() => {\r\n let exist = false;\r\n if (myProjects.current) {\r\n for (const p of myProjects.current) {\r\n if (p.title === newTitle) {\r\n exist = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (exist) {\r\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + newTitle);\r\n } else {\r\n if (!user.uid) return;\r\n const files = firebase.firestore().collection('users').doc(user.uid).collection('projects');\r\n files\r\n .doc(oldTitle)\r\n .get()\r\n .then((doc) => {\r\n if (doc && doc.exists) {\r\n const data = doc.data();\r\n if (data && user.uid) {\r\n const newData = { ...data };\r\n if (data.designs && data.designs.length > 0) {\r\n const newDesigns: Design[] = changeDesignTitles(newTitle, data.designs) ?? [];\r\n for (const [i, d] of data.designs.entries()) {\r\n copyDesign(d.title, newDesigns[i].title, data.owner, user.uid);\r\n }\r\n newData.designs = newDesigns;\r\n setCommonStore((state) => {\r\n state.projectInfo.designs = newDesigns;\r\n });\r\n }\r\n files\r\n .doc(newTitle)\r\n .set(newData)\r\n .then(() => {\r\n files\r\n .doc(oldTitle)\r\n .delete()\r\n .then(() => {\r\n // TODO\r\n });\r\n if (myProjects.current) {\r\n const newArray: ProjectInfo[] = [];\r\n for (const p of myProjects.current) {\r\n if (p.title === oldTitle) {\r\n newArray.push({\r\n owner: p.owner,\r\n timestamp: p.timestamp,\r\n title: newTitle,\r\n description: p.description,\r\n type: p.type,\r\n designs: p.designs,\r\n ranges: p.ranges ?? null,\r\n hiddenParameters: p.hiddenParameters,\r\n counter: p.counter,\r\n } as ProjectInfo);\r\n } else {\r\n newArray.push(p);\r\n }\r\n }\r\n myProjects.current = newArray;\r\n setUpdateFlag(!updateFlag);\r\n }\r\n setCommonStore((state) => {\r\n if (state.projectInfo.title === oldTitle) {\r\n state.projectInfo.title = newTitle;\r\n }\r\n });\r\n // TODO\r\n // change the address field of the browser when the project is currently open\r\n // const params = new URLSearchParams(window.location.search);\r\n // if (params.get('title') === oldTitle && params.get('userid') === user.uid) {\r\n // const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(newTitle);\r\n // window.history.pushState({}, document.title, newUrl);\r\n // }\r\n });\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotRenameProject', lang) + ': ' + error);\r\n });\r\n }\r\n });\r\n };\r\n\r\n const setProjectState = (projectInfo: ProjectInfo) => {\r\n setCommonStore((state) => {\r\n state.projectInfo = { ...projectInfo };\r\n state.projectImages.clear();\r\n state.projectView = true;\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\r\n state.updateProjectsFlag = true;\r\n });\r\n };\r\n\r\n const openDesignFile = (userid: string, title: string) => {\r\n if (userid && title) {\r\n setLoading(true);\r\n loadCloudFile(userid, title, true, true, viewOnly).finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n };\r\n\r\n const addDesignToProject = (\r\n projectType: string,\r\n projectTitle: string,\r\n designTitle: string,\r\n thumbnailWidth: number,\r\n ) => {\r\n if (!user.uid || !canvas) return;\r\n // create a thumbnail image of the design in Base64 format\r\n // (don't create a PNG and then store in Firebase storage as I can't get the blob data correctly)\r\n const thumbnail = Util.resizeCanvas(canvas, thumbnailWidth).toDataURL();\r\n const design = createDesign(projectType, designTitle, thumbnail);\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .doc(projectTitle)\r\n .update({\r\n designs: firebase.firestore.FieldValue.arrayUnion(design),\r\n counter: firebase.firestore.FieldValue.increment(1),\r\n })\r\n .then(() => {\r\n setCommonStore((state) => {\r\n state.projectInfo.designs?.push(design);\r\n // increment the local counter to be consistent with the database counter\r\n state.projectInfo.counter++;\r\n // store the project type in the design for linking it with the right type of project later\r\n state.designProjectType = state.projectInfo.type;\r\n state.cloudFile = design.title;\r\n });\r\n // regardless of where the design is, make a copy on the cloud\r\n saveToCloudWithoutCheckingExistence(designTitle, true, true);\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotAddDesignToProject', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const saveToCloud = (title: string, silent: boolean, checkExistence: boolean) => {\r\n if (!user.uid) return;\r\n const t = title.trim();\r\n if (t.length === 0) {\r\n showError(i18n.t('menu.file.SavingAbortedMustHaveValidTitle', lang) + '.');\r\n return;\r\n }\r\n setLoading(true);\r\n if (checkExistence) {\r\n fetchMyCloudFiles().then(() => {\r\n let exist = false;\r\n if (cloudFiles.current) {\r\n for (const p of cloudFiles.current) {\r\n if (p.fileName === t) {\r\n exist = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (exist) {\r\n Modal.confirm({\r\n title: i18n.t('message.CloudFileWithTitleExistsDoYouWantToOverwrite', lang),\r\n icon: ,\r\n onOk: () => {\r\n saveToCloudWithoutCheckingExistence(t, silent);\r\n },\r\n onCancel: () => {\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n },\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n saveToCloudWithoutCheckingExistence(t, silent);\r\n }\r\n });\r\n } else {\r\n saveToCloudWithoutCheckingExistence(t, silent);\r\n }\r\n setTitleDialogVisible(false);\r\n };\r\n\r\n const saveToCloudWithoutCheckingExistence = (title: string, silent: boolean, ofProject?: boolean) => {\r\n if (!user.uid) return;\r\n try {\r\n const doc = firebase.firestore().collection('users').doc(user.uid);\r\n if (doc) {\r\n if (localContentToImportAfterCloudFileUpdate) {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = true;\r\n });\r\n }\r\n doc\r\n .collection(ofProject ? 'designs' : 'files')\r\n .doc(title)\r\n .set(exportContent())\r\n .then(() => {\r\n if (!silent) {\r\n setCommonStore((state) => {\r\n state.cloudFile = title;\r\n });\r\n usePrimitiveStore.getState().setChanged(false);\r\n }\r\n if (localContentToImportAfterCloudFileUpdate) {\r\n if (localContentToImportAfterCloudFileUpdate === 'CREATE_NEW_FILE') {\r\n createEmptyFile();\r\n } else {\r\n importContent(localContentToImportAfterCloudFileUpdate);\r\n }\r\n } else {\r\n if (!ofProject) {\r\n const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(title);\r\n window.history.pushState({}, document.title, newUrl);\r\n }\r\n }\r\n if (showCloudFilePanel) {\r\n fetchMyCloudFiles().then(() => {\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotSaveYourFileToCloud', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n } catch (error) {\r\n showError(i18n.t('message.CannotSaveYourFileToCloud', lang) + ': ' + error);\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const openCloudFileWithSaveReminder = (userid: string, title: string) => {\r\n if (changed) {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n onOk: () => {\r\n if (cloudFile) {\r\n saveToCloud(cloudFile, true, false);\r\n openCloudFile(userid, title);\r\n } else {\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n }\r\n },\r\n onCancel: () => {\r\n openCloudFile(userid, title);\r\n },\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n openCloudFile(userid, title);\r\n }\r\n };\r\n\r\n const openCloudFileWithSaveReminderFromMap = (model: ModelSite) => {\r\n if (changed) {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n onOk: () => {\r\n if (cloudFile) {\r\n saveToCloud(cloudFile, true, false);\r\n openCloudFile(model.userid, model.title);\r\n countClicksModelsMap(model);\r\n } else {\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n }\r\n },\r\n onCancel: () => {\r\n openCloudFile(model.userid, model.title);\r\n countClicksModelsMap(model);\r\n },\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n openCloudFile(model.userid, model.title);\r\n countClicksModelsMap(model);\r\n }\r\n };\r\n\r\n const openCloudFile = (userid: string, title: string, popState?: boolean) => {\r\n if (userid && title) {\r\n setLoading(true);\r\n loadCloudFile(userid, title, false, popState, viewOnly).finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n };\r\n\r\n const fetchMyCloudFiles = async () => {\r\n if (!user.uid) return;\r\n setLoading(true);\r\n // fetch owner's file information from the cloud\r\n cloudFiles.current = await firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('files')\r\n .get()\r\n .then((querySnapshot) => {\r\n const a: CloudFileInfo[] = [];\r\n querySnapshot.forEach((doc) => {\r\n const data = doc.data();\r\n a.push({\r\n timestamp: data.timestamp,\r\n fileName: doc.id,\r\n userid: user.uid,\r\n uuid: data.docid,\r\n } as CloudFileInfo);\r\n });\r\n return a;\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotOpenCloudFolder', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n const deleteCloudFile = (userid: string, title: string) => {\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(userid)\r\n .collection('files')\r\n .doc(title)\r\n .delete()\r\n .then(() => {\r\n setCloudFileArray(\r\n cloudFileArray.filter((e) => {\r\n return e.userid !== userid || e.title !== title;\r\n }),\r\n );\r\n setCommonStore((state) => {\r\n if (title === state.cloudFile) {\r\n state.cloudFile = undefined;\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotDeleteCloudFile', lang) + ': ' + error);\r\n });\r\n };\r\n\r\n const renameCloudFile = (userid: string, oldTitle: string, newTitle: string) => {\r\n const files = firebase.firestore().collection('users').doc(userid).collection('files');\r\n files\r\n .doc(oldTitle)\r\n .get()\r\n .then((doc) => {\r\n if (doc && doc.exists) {\r\n const data = doc.data();\r\n if (data) {\r\n files\r\n .doc(newTitle)\r\n .set(data)\r\n .then(() => {\r\n files\r\n .doc(oldTitle)\r\n .delete()\r\n .then(() => {\r\n // TODO\r\n });\r\n for (const f of cloudFileArray) {\r\n if (f.userid === userid && f.title === oldTitle) {\r\n f.title = newTitle;\r\n break;\r\n }\r\n }\r\n setCloudFileArray([...cloudFileArray]);\r\n setCommonStore((state) => {\r\n if (state.cloudFile === oldTitle) {\r\n state.cloudFile = newTitle;\r\n }\r\n });\r\n // change the address field of the browser when the cloud file is currently open\r\n const params = new URLSearchParams(window.location.search);\r\n if (params.get('title') === oldTitle && params.get('userid') === user.uid) {\r\n const newUrl = HOME_URL + '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(newTitle);\r\n window.history.pushState({}, document.title, newUrl);\r\n }\r\n });\r\n }\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotRenameCloudFile', lang) + ': ' + error);\r\n });\r\n };\r\n\r\n function updateCloudFile() {\r\n if (cloudFile) {\r\n saveToCloud(cloudFile, false, false);\r\n setTitle(cloudFile);\r\n }\r\n }\r\n\r\n function fetchModelSitesFn() {\r\n fetchModelSites().then(() => {\r\n fetchLatest().then(() => {\r\n // ignore for now\r\n });\r\n });\r\n }\r\n\r\n function fetchPeopleModelsFn() {\r\n fetchPeopleModels().then(() => {\r\n fetchLatest().then(() => {\r\n // ignore for now\r\n });\r\n });\r\n }\r\n\r\n function publishOnModelsMap() {\r\n if (user && user.uid && title) {\r\n // check if the user is the owner of the current model\r\n const params = new URLSearchParams(window.location.search);\r\n if (params.get('userid') === user.uid && params.get('title') === title) {\r\n const m = {\r\n latitude,\r\n longitude,\r\n address: address ?? null,\r\n countryCode: countryCode ?? null,\r\n type: useStore.getState().modelType,\r\n author: useStore.getState().modelAuthor ?? user.displayName,\r\n userid: user.uid,\r\n title,\r\n label: useStore.getState().modelLabel,\r\n description: useStore.getState().modelDescription,\r\n timeCreated: Date.now(),\r\n } as ModelSite;\r\n const modelKey = Util.getModelKey(m);\r\n const collection = firebase.firestore().collection('models');\r\n if (collection) {\r\n // first we upload a thumbnail of the model to Firestore Cloud Storage\r\n const storageRef = firebase.storage().ref();\r\n if (canvas) {\r\n const thumbnail = Util.resizeCanvas(canvas, 200);\r\n thumbnail.toBlob((blob) => {\r\n if (blob) {\r\n const metadata = { contentType: 'image/png' };\r\n const uploadTask = storageRef.child('images/' + modelKey + '.png').put(blob, metadata);\r\n // Listen for state changes, errors, and completion of the upload.\r\n uploadTask.on(\r\n firebase.storage.TaskEvent.STATE_CHANGED,\r\n (snapshot) => {\r\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\r\n if (progress > 0) {\r\n showInfo(i18n.t('word.Upload', lang) + ': ' + progress + '%');\r\n }\r\n },\r\n (error) => {\r\n showError('Storage: ' + error);\r\n },\r\n () => {\r\n uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {\r\n const m2 = { ...m, thumbnailUrl: downloadURL } as ModelSite;\r\n // after we get a download URL for the thumbnail image, we then go on to upload other data\r\n const document = collection.doc(Util.getLatLngKey(latitude, longitude));\r\n document\r\n .get()\r\n .then((doc) => {\r\n if (doc.exists) {\r\n const data = doc.data();\r\n if (data && data[modelKey]) {\r\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\r\n showSuccess(i18n.t('menu.file.UpdatedOnModelsMap', lang) + '.');\r\n });\r\n } else {\r\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\r\n showSuccess(i18n.t('menu.file.PublishedOnModelsMap', lang) + '.');\r\n });\r\n }\r\n } else {\r\n document.set({ [modelKey]: m2 }, { merge: true }).then(() => {\r\n showSuccess(i18n.t('menu.file.PublishedOnModelsMap', lang) + '.');\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotPublishModelOnMap', lang) + ': ' + error);\r\n });\r\n // add to the leaderboard\r\n firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('people')\r\n .update({\r\n [(m2.author ?? 'Anonymous') + '.' + Util.getModelKey(m2)]: m2,\r\n })\r\n .then(() => {\r\n // update the cache\r\n setCommonStore((state) => {\r\n if (state.peopleModels) {\r\n const models = state.peopleModels.get(m2.author ?? 'Anonymous');\r\n if (models) {\r\n models.set(Util.getModelKey(m2), m2);\r\n }\r\n }\r\n });\r\n });\r\n // notify info\r\n firebase\r\n .firestore()\r\n .collection('board')\r\n .doc('info')\r\n .set({ latestModel: m2 }, { merge: true })\r\n .then(() => {\r\n // TODO\r\n });\r\n });\r\n },\r\n );\r\n }\r\n });\r\n }\r\n }\r\n // keep a record of the published model in the user's account\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .update(\r\n useStore.getState().modelAuthor === user.displayName\r\n ? {\r\n published: firebase.firestore.FieldValue.arrayUnion(title),\r\n }\r\n : {\r\n published: firebase.firestore.FieldValue.arrayUnion(title),\r\n aliases: firebase.firestore.FieldValue.arrayUnion(useStore.getState().modelAuthor),\r\n },\r\n )\r\n .then(() => {\r\n // update the cache\r\n setCommonStore((state) => {\r\n if (state.user) {\r\n if (!state.user.published) state.user.published = [];\r\n if (!state.user.published.includes(title)) {\r\n state.user.published.push(title);\r\n }\r\n if (!state.user.aliases) state.user.aliases = [];\r\n if (\r\n state.modelAuthor &&\r\n !state.user.aliases.includes(state.modelAuthor) &&\r\n state.modelAuthor !== user.displayName\r\n ) {\r\n state.user.aliases.push(state.modelAuthor);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n function createNewProject() {\r\n if (!user || !user.uid) return;\r\n const title = usePrimitiveStore.getState().projectTitle;\r\n if (!title) {\r\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\r\n return;\r\n }\r\n const t = title.trim();\r\n if (t.length === 0) {\r\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\r\n return;\r\n }\r\n // check if the project title is already used\r\n fetchMyProjects(false).then(() => {\r\n let exist = false;\r\n if (myProjects.current) {\r\n for (const p of myProjects.current) {\r\n if (p.title === t) {\r\n exist = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (exist) {\r\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + t);\r\n } else {\r\n if (user && user.uid) {\r\n const type = usePrimitiveStore.getState().projectType ?? DesignProblem.SOLAR_PANEL_ARRAY;\r\n const description = usePrimitiveStore.getState().projectDescription ?? null;\r\n const timestamp = new Date().getTime();\r\n const counter = 0;\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .doc(t)\r\n .set({\r\n owner: user.uid,\r\n timestamp,\r\n type,\r\n description,\r\n counter,\r\n designs: [],\r\n hiddenParameters: ProjectUtil.getDefaultHiddenParameters(type),\r\n })\r\n .then(() => {\r\n setCommonStore((state) => {\r\n state.projectView = true;\r\n // update the local copy as well\r\n state.projectInfo.owner = user.uid;\r\n state.projectInfo.type = type;\r\n state.projectInfo.title = title;\r\n state.projectInfo.description = description;\r\n state.projectInfo.counter = 0;\r\n state.projectInfo.dataColoring = DataColoring.ALL;\r\n state.projectInfo.selectedProperty = null;\r\n state.projectInfo.sortDescending = false;\r\n state.projectInfo.xAxisNameScatteredPlot = null;\r\n state.projectInfo.yAxisNameScatteredPlot = null;\r\n state.projectInfo.dotSizeScatteredPlot = 5;\r\n state.projectInfo.thumbnailWidth = 200;\r\n state.projectInfo.designs = [];\r\n state.projectInfo.ranges = [];\r\n state.projectInfo.hiddenParameters = ProjectUtil.getDefaultHiddenParameters(state.projectInfo.type);\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotCreateNewProject', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n // if the project list panel is open, update it\r\n if (showProjectListPanel) {\r\n fetchMyProjects(false).then(() => {\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n function saveProjectAs() {\r\n if (!user || !user.uid) return;\r\n const title = usePrimitiveStore.getState().projectTitle;\r\n if (!title) {\r\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\r\n return;\r\n }\r\n const t = title.trim();\r\n if (t.length === 0) {\r\n showError(i18n.t('message.CannotCreateNewProjectWithoutTitle', lang) + '.');\r\n return;\r\n }\r\n // check if the project title is already taken\r\n fetchMyProjects(false).then(() => {\r\n let exist = false;\r\n if (myProjects.current) {\r\n for (const p of myProjects.current) {\r\n if (p.title === t) {\r\n exist = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (exist) {\r\n showInfo(i18n.t('message.TitleUsedChooseDifferentOne', lang) + ': ' + t);\r\n } else {\r\n if (user && user.uid) {\r\n const designs = useStore.getState().projectInfo.designs;\r\n if (designs) {\r\n const type = usePrimitiveStore.getState().projectType;\r\n const description = usePrimitiveStore.getState().projectDescription;\r\n const owner = useStore.getState().projectInfo.owner;\r\n const timestamp = new Date().getTime();\r\n const counter = useStore.getState().projectInfo.counter;\r\n const dataColoring = useStore.getState().projectInfo.dataColoring ?? null;\r\n const selectedProperty = useStore.getState().projectInfo.selectedProperty ?? null;\r\n const sortDescending = !!useStore.getState().projectInfo.sortDescending;\r\n const xAxisNameScatteredPlot = useStore.getState().projectInfo.xAxisNameScatteredPlot ?? 'rowWidth';\r\n const yAxisNameScatteredPlot = useStore.getState().projectInfo.yAxisNameScatteredPlot ?? 'rowWidth';\r\n const dotSizeScatteredPlot = useStore.getState().projectInfo.dotSizeScatteredPlot ?? 5;\r\n const thumbnailWidth = useStore.getState().projectInfo.thumbnailWidth ?? 200;\r\n const newDesigns: Design[] = changeDesignTitles(t, designs) ?? [];\r\n for (const [i, d] of designs.entries()) {\r\n copyDesign(d.title, newDesigns[i].title, owner, user.uid);\r\n }\r\n const projectImages = useStore.getState().projectImages;\r\n if (projectImages && projectImages.size > 0) {\r\n for (const [i, d] of designs.entries()) {\r\n const image = projectImages.get(d.title);\r\n if (image) {\r\n newDesigns[i].thumbnail = getImageData(image);\r\n }\r\n }\r\n firebase\r\n .firestore()\r\n .collection('users')\r\n .doc(user.uid)\r\n .collection('projects')\r\n .doc(t)\r\n .set({\r\n owner: user.uid,\r\n timestamp,\r\n type,\r\n description,\r\n counter,\r\n dataColoring,\r\n selectedProperty,\r\n sortDescending,\r\n xAxisNameScatteredPlot,\r\n yAxisNameScatteredPlot,\r\n dotSizeScatteredPlot,\r\n thumbnailWidth,\r\n designs: newDesigns,\r\n ranges: useStore.getState().projectInfo.ranges ?? null,\r\n hiddenParameters: useStore.getState().projectInfo.hiddenParameters,\r\n })\r\n .then(() => {\r\n setCommonStore((state) => {\r\n state.projectView = true;\r\n state.projectInfo.owner = user.uid;\r\n state.projectInfo.type = type;\r\n state.projectInfo.title = title;\r\n state.projectInfo.description = description;\r\n state.projectInfo.designs = newDesigns;\r\n });\r\n })\r\n .catch((error) => {\r\n showError(i18n.t('message.CannotCreateNewProject', lang) + ': ' + error);\r\n })\r\n .finally(() => {\r\n if (showProjectListPanel) {\r\n fetchMyProjects(false).then(() => {\r\n setUpdateFlag(!updateFlag);\r\n });\r\n }\r\n setLoading(false);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function curateDesignToProject() {\r\n const projectOwner = useStore.getState().projectInfo.owner;\r\n if (user.uid !== projectOwner) {\r\n showInfo(i18n.t('message.CannotAddDesignToProjectOwnedByOthers', lang));\r\n } else {\r\n const projectTitle = useStore.getState().projectInfo.title;\r\n if (projectTitle) {\r\n setLoading(true);\r\n const projectType = useStore.getState().projectInfo.type ?? DesignProblem.SOLAR_PANEL_ARRAY;\r\n const thumbnailWidth = useStore.getState().projectInfo.thumbnailWidth ?? 200;\r\n const counter = useStore.getState().projectInfo.counter ?? 0;\r\n addDesignToProject(projectType, projectTitle, projectTitle + ' ' + counter, thumbnailWidth);\r\n }\r\n }\r\n }\r\n\r\n function listMyCloudFiles() {\r\n if (!user.uid) return;\r\n fetchMyCloudFiles().then(() => {\r\n usePrimitiveStore.setState((state) => {\r\n state.showCloudFilePanel = true;\r\n });\r\n });\r\n }\r\n\r\n function showMyProjectsList() {\r\n listMyProjects(true);\r\n }\r\n\r\n function hideMyProjectsList() {\r\n listMyProjects(false);\r\n setUpdateFlag(!updateFlag);\r\n }\r\n\r\n return viewOnly ? (\r\n <>\r\n {openModelsMap && (\r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n {loading && }\r\n loading}\r\n setTitle={setTitle}\r\n getTitle={() => title}\r\n setTitleDialogVisible={setTitleDialogVisible}\r\n isTitleDialogVisible={() => titleDialogVisible}\r\n />\r\n \r\n {showCloudFilePanel && cloudFiles.current && (\r\n \r\n )}\r\n {showProjectListPanel && myProjects.current && (\r\n \r\n )}\r\n {showModelsGallery && (\r\n {\r\n setPrimitiveStore('showModelsGallery', false);\r\n authorModelsRef.current = undefined;\r\n }}\r\n />\r\n )}\r\n {showAccountSettingsPanel && }\r\n {openModelsMap && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(CloudManager);\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport firebase from 'firebase/app';\nimport 'firebase/database';\nimport dayjs from 'dayjs';\nimport { ClassID, FirebaseName, SchoolID } from './types';\n\nconst ActionLogger = () => {\n const actionInfo = useStore(Selector.actionInfo);\n const currentUndoable = useStore(Selector.currentUndoable);\n const user = useStore(Selector.user);\n const cloudFile = useStore(Selector.cloudFile);\n\n const firstCallUndo = useRef(true);\n const firstCallAction = useRef(true);\n const databaseRef = useRef();\n const schoolID = user.schoolID ?? SchoolID.UNKNOWN;\n const classID = user.classID ?? ClassID.UNKNOWN;\n\n useEffect(() => {\n const config = {\n apiKey: process.env.REACT_APP_FIREBASE_API_KEY,\n authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,\n projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,\n storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,\n databaseURL: process.env.REACT_APP_FIREBASE_LOGGER_DATABASE_URL,\n messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,\n appId: process.env.REACT_APP_FIREBASE_APP_ID,\n };\n let app = undefined;\n for (const a of firebase.apps) {\n if (a.name === FirebaseName.LOG_DATA) {\n app = a;\n break;\n }\n }\n if (!app) {\n app = firebase.initializeApp(config, FirebaseName.LOG_DATA);\n }\n if (app) {\n databaseRef.current = firebase.database(app);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (firstCallUndo.current) {\n firstCallUndo.current = false;\n } else {\n if (currentUndoable) {\n // we cannot use hh:mm:SSS as suggested by dayjs's format documentation\n // because SSS only takes the last three digits of the millisecond string,\n // resulting in incorrect ordering of the log. so we use the millisecond string\n // to ensure the order and use the formatted string to provide readability.\n const timestamp =\n currentUndoable.timestamp +\n ' (' +\n dayjs(new Date(currentUndoable.timestamp)).format('MM-DD-YYYY hh:mm A') +\n ')';\n databaseRef.current.ref(schoolID + '/' + classID + '/' + user.uid + '/' + timestamp).set({\n file: cloudFile ?? 'Untitled',\n action: JSON.stringify(currentUndoable),\n });\n }\n }\n }, [currentUndoable, user.uid, classID, schoolID, cloudFile]);\n\n useEffect(() => {\n if (firstCallAction.current) {\n firstCallAction.current = false;\n } else {\n if (actionInfo) {\n const timestamp =\n actionInfo.timestamp + ' (' + dayjs(new Date(actionInfo.timestamp)).format('MM-DD-YYYY hh:mm A') + ')';\n databaseRef.current.ref(schoolID + '/' + classID + '/' + user.uid + '/' + timestamp).set({\n file: cloudFile ?? 'Untitled',\n action: JSON.stringify(actionInfo),\n });\n }\n }\n }, [actionInfo, user.uid, classID, schoolID, cloudFile]);\n\n return <>;\n};\n\nexport default React.memo(ActionLogger);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useRef } from 'react';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport { DirectionalLight } from 'three';\nimport { DEFAULT_FAR, STARLIGHT_INTENSITY, UNIT_VECTOR_POS_Z } from './constants';\n\nconst Lights = () => {\n const directLightIntensity = useStore(Selector.viewState.directLightIntensity);\n const ambientLightIntensity = useStore(Selector.viewState.ambientLightIntensity);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const sceneRadius = useStore(Selector.sceneRadius);\n const positionExtent = 2 * sceneRadius;\n const cameraExtent = sceneRadius + 100;\n\n const ref = useRef();\n\n if (ref.current) {\n ref.current.shadow.camera.left = -cameraExtent;\n ref.current.shadow.camera.bottom = -cameraExtent;\n ref.current.shadow.camera.right = cameraExtent;\n ref.current.shadow.camera.top = cameraExtent;\n ref.current.shadow.camera.updateProjectionMatrix();\n }\n\n const day = sunlightDirection.z > 0;\n const dot = day ? sunlightDirection.normalize().dot(UNIT_VECTOR_POS_Z) : 0;\n\n return (\n <>\n \n \n \n );\n};\n\nexport default React.memo(Lights);\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo } from 'react';\r\nimport { Euler, FontLoader, TextGeometryParameters } from 'three';\r\nimport { useLoader } from '@react-three/fiber';\r\nimport { Line } from '@react-three/drei';\r\nimport helvetikerFont from '../fonts/helvetiker_regular.typeface.fnt';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport { ElementModel } from '../models/ElementModel';\r\nimport { HALF_PI } from '../constants';\r\nimport { ObjectType, ResizeHandleType } from '../types';\r\nimport { RoofModel } from '../models/RoofModel';\r\n\r\nexport const VerticalRuler = ({ element }: { element: ElementModel }) => {\r\n const cameraDirection = useStore(Selector.cameraDirection);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n\r\n const getResizeHandlePosition = useStore(Selector.getResizeHandlePosition);\r\n\r\n const isRoof = element.type === ObjectType.Roof;\r\n const color = 'lightGray';\r\n const font = useLoader(FontLoader, helvetikerFont);\r\n const textGeometryParamsTickLabel = {\r\n font: font,\r\n height: 0,\r\n size: 0.2,\r\n } as TextGeometryParameters;\r\n const textGeometryParams = {\r\n font: font,\r\n height: 0,\r\n size: 0.35,\r\n } as TextGeometryParameters;\r\n\r\n const position = useMemo(() => {\r\n const handle = resizeHandleType ?? hoveredHandle;\r\n return getResizeHandlePosition(element, handle as ResizeHandleType);\r\n }, [resizeHandleType, hoveredHandle]);\r\n\r\n const rotation = useMemo(() => {\r\n const rotation = -Math.atan2(cameraDirection.x, cameraDirection.y) + Math.PI;\r\n return new Euler(HALF_PI, 0, rotation, 'ZXY');\r\n }, [cameraDirection.x, cameraDirection.y]);\r\n\r\n const getRulerLength = () => {\r\n let height = element.lz;\r\n if (isRoof) {\r\n height = useStore.getState().selectedElementHeight;\r\n }\r\n return Math.ceil(height) + 1;\r\n };\r\n\r\n const getHeightText = () => {\r\n let height = element.lz;\r\n if (isRoof) {\r\n height = (element as RoofModel).rise;\r\n }\r\n return height.toFixed(1) + ' m';\r\n };\r\n\r\n const getTextPositionZ = () => {\r\n if (isRoof) {\r\n return useStore.getState().selectedElementHeight + 1;\r\n }\r\n return element.lz - 0.175;\r\n };\r\n\r\n if (!resizeHandleType && !hoveredHandle) return null;\r\n\r\n const rulerLength = getRulerLength();\r\n const heightText = getHeightText();\r\n const textPositionZ = getTextPositionZ();\r\n const tickLabels = new Array(rulerLength + 1).fill(0);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {tickLabels.map((e, i) => {\r\n const len = 0.2 + (i % 5 === 0 ? 0.05 : 0);\r\n const textGeometry = ;\r\n return (\r\n \r\n \r\n {!isRoof && (\r\n \r\n {textGeometry}\r\n \r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(VerticalRuler);\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { HALF_PI } from './constants';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { MoveHandleType, ObjectType, ResizeHandleType, RoofHandleType, RotateHandleType } from './types';\r\nimport { PolarGrid } from './views/polarGrid';\r\nimport { VerticalRuler } from './views/verticalRuler';\r\nimport { Util } from './Util';\r\n\r\nexport const Auxiliary = () => {\r\n const moveHandleType = useStore(Selector.moveHandleType);\r\n const rotateHandleType = useStore(Selector.rotateHandleType);\r\n const resizeHandleType = useStore(Selector.resizeHandleType);\r\n const hoveredHandle = useStore(Selector.hoveredHandle);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const addedCuboidId = useStore(Selector.addedCuboidId);\r\n const addedFoundationId = useStore(Selector.addedFoundationId);\r\n\r\n const element = useStore((state) => {\r\n if (state.selectedElement) {\r\n const selectedElementId = state.selectedElement.id;\r\n return state.elements.find((e) => e.id === selectedElementId);\r\n }\r\n });\r\n\r\n const [showGrid, setShowGrid] = useState(false);\r\n const [gridSize, setGridSize] = useState(2 * sceneRadius);\r\n const [gridDivisions, setDivisions] = useState(2 * sceneRadius);\r\n\r\n useEffect(() => {\r\n const unit = Math.floor(sceneRadius / 50) + 1;\r\n const divisions = Math.round(sceneRadius / unit) * 2;\r\n setGridSize(divisions * unit);\r\n setDivisions(divisions);\r\n }, [sceneRadius]);\r\n\r\n useEffect(() => {\r\n if (resizeHandleType) {\r\n const changeHeight =\r\n Util.isTopResizeHandle(resizeHandleType) ||\r\n (resizeHandleType === ResizeHandleType.UpperLeft && element?.type === ObjectType.Wall) ||\r\n (resizeHandleType === ResizeHandleType.UpperRight && element?.type === ObjectType.Wall);\r\n setShowGrid(!changeHeight);\r\n } else {\r\n setShowGrid(false);\r\n }\r\n }, [resizeHandleType]);\r\n\r\n // only these elements are allowed to be on the ground\r\n const legalOnGround = () => {\r\n if (!element) return false;\r\n const type = element.type;\r\n return (\r\n type === ObjectType.Foundation ||\r\n type === ObjectType.Cuboid ||\r\n (type === ObjectType.Tree && element.parentId === ObjectType.Ground) ||\r\n (type === ObjectType.Human && element.parentId === ObjectType.Ground)\r\n );\r\n };\r\n\r\n const showPolarGridByHover = hoveredHandle === RotateHandleType.Lower || hoveredHandle === RotateHandleType.Upper;\r\n\r\n const showVerticalRulerHelper = (\r\n handle: MoveHandleType | ResizeHandleType | RotateHandleType | RoofHandleType | null,\r\n ) => {\r\n return (\r\n Util.isTopResizeHandle(handle) ||\r\n (element?.type === ObjectType.Wall && Util.isTopResizeHandleOfWall(handle)) ||\r\n (element?.type === ObjectType.Roof && Util.isRiseHandleOfRoof(handle))\r\n );\r\n };\r\n\r\n const handle = resizeHandleType ?? hoveredHandle;\r\n\r\n const showVerticalRuler = showVerticalRulerHelper(handle);\r\n\r\n if (!element) return null;\r\n\r\n return (\r\n <>\r\n {(((showGrid || moveHandleType || Util.isMoveHandle(hoveredHandle)) && !groundImage && legalOnGround()) ||\r\n addedCuboidId ||\r\n addedFoundationId) && (\r\n \r\n )}\r\n {(rotateHandleType || showPolarGridByHover) && element && legalOnGround() && }\r\n {showVerticalRuler && }\r\n \r\n );\r\n};\r\n","/*\r\n * @Copyright 2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef } from 'react';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { useLanguage } from './views/hooks';\r\nimport i18n from './i18n/i18n';\r\n\r\nconst STYLE_SIZE = 120;\r\nconst BLACK = 'black';\r\nconst WHITE = 'white';\r\n\r\nconst Compass = ({ visible = true }: { visible: boolean }) => {\r\n const canvasRef = useRef(null);\r\n\r\n const lang = useLanguage();\r\n\r\n const PIXEL_RATIO = window.devicePixelRatio;\r\n const CANVAS_SIZE = STYLE_SIZE * PIXEL_RATIO;\r\n const scale = CANVAS_SIZE / 150;\r\n\r\n const fontSize = 20 * scale;\r\n const FONT = fontSize + 'px serif';\r\n\r\n useEffect(() => {\r\n if (canvasRef.current) {\r\n useRefStore.setState((state) => {\r\n state.compassRef = canvasRef;\r\n });\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!canvasRef.current) return;\r\n const ctx = canvasRef.current.getContext('2d') as CanvasRenderingContext2D;\r\n if (!ctx) return;\r\n\r\n // all these numbers are based on 150px\r\n const pointerLength = 55 * scale;\r\n const pointerHalfWidth = 10 * scale;\r\n\r\n const outerRingRadius = 40 * scale;\r\n const outerRingWidth = 5 * scale;\r\n const innerRingRadius = 30 * scale;\r\n const innerRingWidth = 1 * scale;\r\n const outlineWidth = 1 * scale;\r\n\r\n const fontToEdge = 15 * scale;\r\n\r\n const center = CANVAS_SIZE / 2;\r\n\r\n ctx.clearRect(0, 0, CANVAS_SIZE, CANVAS_SIZE);\r\n\r\n // outer ring\r\n ctx.beginPath();\r\n ctx.arc(center, center, outerRingRadius, 0, Math.PI * 2);\r\n ctx.lineWidth = outerRingWidth;\r\n ctx.strokeStyle = BLACK;\r\n ctx.stroke();\r\n\r\n // inner ring\r\n ctx.beginPath();\r\n ctx.arc(center, center, innerRingRadius, 0, Math.PI * 2);\r\n ctx.lineWidth = innerRingWidth;\r\n ctx.strokeStyle = BLACK;\r\n ctx.stroke();\r\n\r\n ctx.lineWidth = outlineWidth;\r\n\r\n // pointer - N\r\n ctx.beginPath();\r\n ctx.moveTo(center, center - pointerLength);\r\n ctx.lineTo(center - pointerHalfWidth, center - pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = WHITE;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(center, center - pointerLength);\r\n ctx.lineTo(center + pointerHalfWidth, center - pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = BLACK;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n // pointer - S\r\n ctx.beginPath();\r\n ctx.moveTo(center, center + pointerLength);\r\n ctx.lineTo(center - pointerHalfWidth, center + pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = BLACK;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(center, center + pointerLength);\r\n ctx.lineTo(center + pointerHalfWidth, center + pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = WHITE;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n // pointer - W\r\n ctx.beginPath();\r\n ctx.moveTo(center - pointerLength, center);\r\n ctx.lineTo(center - pointerHalfWidth, center - pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = BLACK;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(center - pointerLength, center);\r\n ctx.lineTo(center - pointerHalfWidth, center + pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = WHITE;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n // pointer - E\r\n ctx.beginPath();\r\n ctx.moveTo(center + pointerLength, center);\r\n ctx.lineTo(center + pointerHalfWidth, center - pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = WHITE;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(center + pointerLength, center);\r\n ctx.lineTo(center + pointerHalfWidth, center + pointerHalfWidth);\r\n ctx.lineTo(center, center);\r\n ctx.fillStyle = BLACK;\r\n ctx.stroke();\r\n ctx.fill();\r\n\r\n // text\r\n ctx.font = FONT;\r\n ctx.fillStyle = WHITE;\r\n ctx.textAlign = 'center';\r\n\r\n ctx.fillText(`${i18n.t('compass.N', lang)}`, center, fontToEdge);\r\n\r\n ctx.save();\r\n ctx.translate(CANVAS_SIZE, CANVAS_SIZE);\r\n ctx.rotate(Math.PI);\r\n ctx.fillText(`${i18n.t('compass.S', lang)}`, center, fontToEdge);\r\n ctx.restore();\r\n\r\n ctx.fillStyle = BLACK;\r\n\r\n ctx.save();\r\n ctx.translate(0, CANVAS_SIZE);\r\n ctx.rotate(-Math.PI / 2);\r\n ctx.fillText(`${i18n.t('compass.W', lang)}`, center, fontToEdge);\r\n ctx.restore();\r\n\r\n ctx.save();\r\n ctx.translate(CANVAS_SIZE, 0);\r\n ctx.rotate(Math.PI / 2);\r\n ctx.fillText(`${i18n.t('compass.E', lang)}`, center, fontToEdge);\r\n ctx.restore();\r\n }, [lang]);\r\n\r\n if (!visible) return null;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Compass);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport { ActionInfo, ObjectType } from './types';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { UndoableDelete, UndoableDeleteMultiple } from './undo/UndoableDelete';\r\nimport { UndoablePaste } from './undo/UndoablePaste';\r\nimport { UndoableCheck } from './undo/UndoableCheck';\r\nimport { UndoableResetView } from './undo/UndoableResetView';\r\nimport { showError, showInfo } from './helpers';\r\nimport i18n from './i18n/i18n';\r\nimport KeyboardEventHandler from 'react-keyboard-event-handler';\r\nimport { WallModel } from './models/WallModel';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { SolarPanelModel } from './models/SolarPanelModel';\r\nimport { Util } from './Util';\r\nimport { ElementModel } from './models/ElementModel';\r\nimport { GRID_RATIO, GROUND_ID, HOME_URL, UNDO_SHOW_INFO_DURATION } from './constants';\r\nimport { RoofUtil } from './views/roof/RoofUtil';\r\nimport { RoofModel } from './models/RoofModel';\r\nimport { spBoundaryCheck, spCollisionCheck } from './views/roof/roofRenderer';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { debounce } from 'lodash';\r\nimport { SensorModel } from './models/SensorModel';\r\nimport { LightModel } from './models/LightModel';\r\nimport { Vector3 } from 'three';\r\nimport { UndoableMoveAllByKey, UndoableMoveSelectedByKey } from './undo/UndoableMove';\r\nimport { GroupableModel, isGroupable } from './models/Groupable';\r\nimport { Point2 } from './models/Point2';\r\nimport { areTwoBasesOverlapped } from './components/groupMaster';\r\n\r\nexport interface KeyboardListenerProps {\r\n canvas?: HTMLCanvasElement | null;\r\n set2DView: (selected: boolean) => void;\r\n setNavigationView: (selected: boolean) => void;\r\n resetView: () => void;\r\n zoomView: (scale: number) => void;\r\n}\r\n\r\nexport enum MoveDirection {\r\n Left = 'Left',\r\n Right = 'Right',\r\n Up = 'Up',\r\n Down = 'Down',\r\n}\r\n\r\nconst AutoDeletionListener = React.memo(() => {\r\n const setCommonStore = useStore(Selector.set);\r\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\r\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const listenToAutoDeletionByDeleteRef = useRef(false);\r\n const listenToAutoDeletionByCutRef = useRef(false);\r\n\r\n useStore(Selector.autoDeletedRoofIdSet);\r\n useStore(Selector.autoDeletedChild);\r\n usePrimitiveStore((state) => state.selectedElementId);\r\n\r\n useEffect(() => {\r\n useRefStore.setState((state) => {\r\n state.listenToAutoDeletionByDeleteRef = listenToAutoDeletionByDeleteRef;\r\n state.listenToAutoDeletionByCutRef = listenToAutoDeletionByCutRef;\r\n });\r\n }, []);\r\n\r\n const handleUndoAutoDeletion = debounce(() => {\r\n const selectedElementId = usePrimitiveStore.getState().selectedElementId;\r\n const selectedElementIdSet = useStore.getState().selectedElementIdSet;\r\n if (!selectedElementId || selectedElementIdSet.size === 0) return;\r\n\r\n const autoDeletedElements = useStore.getState().getAutoDeletedElements();\r\n if (!autoDeletedElements) return;\r\n\r\n const manualDeletedElements = useStore.getState().deletedElements;\r\n const manualCutElements = useStore.getState().elementsToPaste;\r\n\r\n const listenToAutoDeletionByCut = useRefStore.getState().listenToAutoDeletionByCutRef?.current;\r\n const listenToAutoDeletionByDelete = useRefStore.getState().listenToAutoDeletionByDeleteRef?.current;\r\n\r\n let combined: ElementModel[] = [];\r\n let undoName: string = '';\r\n if (listenToAutoDeletionByCut) {\r\n useRefStore.getState().setListenToAutoDeletionByCut(false);\r\n combined = [...manualCutElements, ...autoDeletedElements];\r\n undoName = 'Cut';\r\n } else if (listenToAutoDeletionByDelete) {\r\n useRefStore.getState().setListenToAutoDeletionByDelete(false);\r\n combined = [...manualDeletedElements, ...autoDeletedElements];\r\n undoName = 'Delete';\r\n }\r\n\r\n const undoableDeleteMultiple = {\r\n name: undoName,\r\n timestamp: Date.now(),\r\n deletedElements: [...combined],\r\n selectedElementId: selectedElementId,\r\n selectedElementIdSet: new Set(selectedElementIdSet),\r\n undo() {\r\n const deletedElements = undoableDeleteMultiple.deletedElements;\r\n if (!deletedElements || deletedElements.length === 0) return;\r\n\r\n for (const e of this.deletedElements) {\r\n if (e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n if (wall.leftJoints.length > 0) {\r\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\r\n }\r\n } else if (e.type === ObjectType.Roof) {\r\n setCommonStore((state) => {\r\n state.addedRoofIdSet.add(e.id);\r\n });\r\n }\r\n }\r\n\r\n const selectedElement = deletedElements.find((e) => e.id === this.selectedElementId) ?? null;\r\n\r\n setCommonStore((state) => {\r\n state.elements.push(...deletedElements);\r\n state.selectedElement = selectedElement;\r\n state.selectedElementIdSet = new Set(this.selectedElementIdSet);\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.deletedRoofId = null;\r\n state.autoDeletedRoofs = null;\r\n state.deletedRoofIdSet.clear();\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n });\r\n },\r\n redo() {\r\n if (undoableDeleteMultiple.deletedElements.length === 0) return;\r\n setCommonStore((state) => {\r\n state.selectedElement = state.elements.find((e) => e.id === this.selectedElementId) ?? null;\r\n state.selectedElementIdSet = new Set(this.selectedElementIdSet);\r\n });\r\n useStore.getState().removeSelectedElements();\r\n },\r\n } as UndoableDeleteMultiple;\r\n addUndoable(undoableDeleteMultiple);\r\n\r\n setCommonStore((state) => {\r\n state.selectedElement = null;\r\n state.selectedElementIdSet.clear();\r\n state.deletedRoofId = null;\r\n state.deletedRoofIdSet.clear();\r\n state.autoDeletedRoofs = null;\r\n state.autoDeletedRoofIdSet.clear();\r\n state.autoDeletedChild = null;\r\n });\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', null);\r\n }, 50);\r\n\r\n const listenToAutoDeletion =\r\n useRefStore.getState().listenToAutoDeletionByCutRef?.current ||\r\n useRefStore.getState().listenToAutoDeletionByDeleteRef?.current;\r\n\r\n if (listenToAutoDeletion && useStore.getState().getAutoDeletedElements()) {\r\n handleUndoAutoDeletion();\r\n }\r\n\r\n return null;\r\n});\r\n\r\nconst handleKeys = [\r\n 'left',\r\n 'up',\r\n 'right',\r\n 'down',\r\n 'shift+left',\r\n 'shift+up',\r\n 'shift+right',\r\n 'shift+down',\r\n 'ctrl+shift+left',\r\n 'ctrl+shift+up',\r\n 'ctrl+shift+right',\r\n 'ctrl+shift+down',\r\n 'meta+shift+left',\r\n 'meta+shift+up',\r\n 'meta+shift+right',\r\n 'meta+shift+down',\r\n 'ctrl+f',\r\n 'meta+f',\r\n 'ctrl+o',\r\n 'meta+o',\r\n 'ctrl+s',\r\n 'meta+s',\r\n 'ctrl+c',\r\n 'meta+c',\r\n 'ctrl+x',\r\n 'meta+x',\r\n 'ctrl+v',\r\n 'meta+v',\r\n 'ctrl+[',\r\n 'meta+[',\r\n 'ctrl+]',\r\n 'meta+]',\r\n 'ctrl+z',\r\n 'meta+z',\r\n 'ctrl+y',\r\n 'meta+y',\r\n 'ctrl+m',\r\n 'meta+m',\r\n 'ctrl+u', // navigation controls\r\n 'meta+u',\r\n 'ctrl+b',\r\n 'meta+b',\r\n 'shift',\r\n 'esc',\r\n 'ctrl+home',\r\n 'ctrl+alt+h',\r\n 'ctrl+shift+o',\r\n 'meta+shift+o',\r\n 'ctrl+shift+s',\r\n 'meta+shift+s',\r\n 'delete',\r\n 'backspace',\r\n 'alt+backspace',\r\n 'f2',\r\n 'f4',\r\n 'ctrl',\r\n];\r\n\r\nconst KeyboardListener = ({ canvas, set2DView, setNavigationView, resetView, zoomView }: KeyboardListenerProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const loggable = useStore(Selector.loggable);\r\n const selectNone = useStore(Selector.selectNone);\r\n const language = useStore(Selector.language);\r\n const undoManager = useStore(Selector.undoManager);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const getSelectedElement = useStore(Selector.getSelectedElement);\r\n const getElementById = useStore(Selector.getElementById);\r\n const copyElementById = useStore(Selector.copyElementById);\r\n const removeElementById = useStore(Selector.removeElementById);\r\n const pasteElements = useStore(Selector.pasteElementsByKey);\r\n const getParent = useStore(Selector.getParent);\r\n const updateElementCxById = useStore(Selector.updateElementCxById);\r\n const updateElementCyById = useStore(Selector.updateElementCyById);\r\n const updateWallLeftJointsById = useStore(Selector.updateWallLeftJointsById);\r\n const updateWallRightJointsById = useStore(Selector.updateWallRightJointsById);\r\n const setEnableFineGrid = useStore(Selector.setEnableFineGrid);\r\n const overlapWithSibling = useStore(Selector.overlapWithSibling);\r\n\r\n const moveStepAbsolute = 0.1;\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n const removeElement = (elemId: string, cut: boolean) => {\r\n if (canvas) {\r\n canvas.style.cursor = 'default'; // if an element is deleted but the cursor is not default\r\n }\r\n return removeElementById(elemId, cut);\r\n };\r\n\r\n const toggle2DView = () => {\r\n if (useStore.getState().viewState.navigationView) return;\r\n const undoableCheck = {\r\n name: 'Set 2D View',\r\n timestamp: Date.now(),\r\n checked: !orthographic,\r\n undo: () => {\r\n set2DView(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n set2DView(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n set2DView(!orthographic);\r\n setCommonStore((state) => {\r\n state.viewState.autoRotate = false;\r\n });\r\n };\r\n\r\n const toggleNatigationView = () => {\r\n if (orthographic) return;\r\n const undoableCheck = {\r\n name: 'Set Navigation View',\r\n timestamp: Date.now(),\r\n checked: !useStore.getState().viewState.navigationView,\r\n undo: () => {\r\n setNavigationView(!undoableCheck.checked);\r\n },\r\n redo: () => {\r\n setNavigationView(undoableCheck.checked);\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setNavigationView(!useStore.getState().viewState.navigationView);\r\n setCommonStore((state) => {\r\n state.viewState.autoRotate = false;\r\n });\r\n };\r\n\r\n const toggleAutoRotate = () => {\r\n if (orthographic) return;\r\n const undoableCheck = {\r\n name: 'Auto Rotate',\r\n timestamp: Date.now(),\r\n checked: !useStore.getState().viewState.autoRotate,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = !undoableCheck.checked;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = undoableCheck.checked;\r\n });\r\n },\r\n } as UndoableCheck;\r\n addUndoable(undoableCheck);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.autoRotate = !state.viewState.autoRotate;\r\n });\r\n };\r\n\r\n const isNewPositionOk = (elem: ElementModel, cx: number, cy: number) => {\r\n const clone = JSON.parse(JSON.stringify(elem)) as ElementModel;\r\n clone.cx = cx;\r\n clone.cy = cy;\r\n if (elem.type === ObjectType.SolarPanel && (elem as SolarPanelModel).parentType === ObjectType.Roof) {\r\n if (elem.parentId && elem.foundationId) {\r\n const roof = getElementById(elem.parentId) as RoofModel;\r\n const foundation = getElementById(elem.foundationId);\r\n if (roof && foundation) {\r\n const boundaryVertices = RoofUtil.getRoofBoundaryVertices(roof);\r\n const solarPanelVertices = RoofUtil.getSolarPanelVerticesOnRoof(clone as SolarPanelModel, foundation);\r\n if (\r\n !spBoundaryCheck(solarPanelVertices, boundaryVertices) ||\r\n !spCollisionCheck(clone as SolarPanelModel, foundation, solarPanelVertices)\r\n ) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n if (overlapWithSibling(clone)) {\r\n showError(i18n.t('message.MoveCancelledBecauseOfOverlap', lang));\r\n return false;\r\n }\r\n if (clone.type === ObjectType.SolarPanel) {\r\n const parent = getParent(elem);\r\n if (parent && !Util.isSolarCollectorWithinHorizontalSurface(clone as SolarPanelModel, parent)) {\r\n showError(i18n.t('message.MoveOutsideBoundaryCancelled', lang));\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const canBeMovedIn2DMode = (e: ElementModel) => {\r\n switch (e.type) {\r\n case ObjectType.Roof:\r\n case ObjectType.Door:\r\n case ObjectType.Window:\r\n return false;\r\n case ObjectType.SolarPanel:\r\n case ObjectType.Sensor:\r\n case ObjectType.Light: {\r\n const el = e as SensorModel | LightModel | SolarPanelModel;\r\n if (el.parentType === ObjectType.Wall || el.parentType === ObjectType.Roof) {\r\n return false;\r\n }\r\n if (el.parentType === ObjectType.Cuboid) {\r\n return el.rotation[2] === 1;\r\n }\r\n return true;\r\n }\r\n case ObjectType.Wall: {\r\n const wall = e as WallModel;\r\n if (wall.leftJoints.length !== 0 || wall.rightJoints.length !== 0) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n const isSameTypeGroup = (selectedType: ObjectType, currType: ObjectType) => {\r\n switch (selectedType) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n return currType === ObjectType.Foundation || currType === ObjectType.Cuboid;\r\n default:\r\n return currType !== ObjectType.Foundation && currType !== ObjectType.Cuboid;\r\n }\r\n };\r\n\r\n const handleGroupMaster = (arr: GroupableModel[]) => {\r\n const allBases = useStore\r\n .getState()\r\n .elements.filter((e) => isGroupable(e) && e.parentId === GROUND_ID) as GroupableModel[];\r\n\r\n const idSet = new Set(arr.map((e) => e.id));\r\n const verticesMap = new Map();\r\n\r\n for (const base of allBases) {\r\n const vertices = Util.fetchFoundationVertexCoordinates(base);\r\n verticesMap.set(base.id, vertices);\r\n }\r\n\r\n const checkBaseOverlap = (curr: GroupableModel) => {\r\n for (const base of allBases) {\r\n if (!idSet.has(base.id) && areTwoBasesOverlapped(curr.id, base.id, verticesMap)) {\r\n idSet.add(base.id);\r\n arr.push(base);\r\n if (base.enableGroupMaster) {\r\n checkBaseOverlap(base);\r\n }\r\n }\r\n }\r\n };\r\n\r\n for (const curr of arr) {\r\n if (curr.enableGroupMaster) {\r\n checkBaseOverlap(curr);\r\n }\r\n }\r\n };\r\n\r\n const getElementsToBeMoved = () => {\r\n const elementsToBeMoved = [] as ElementModel[];\r\n\r\n const selectedElementIdSet = useStore.getState().selectedElementIdSet;\r\n const selectedElement = getSelectedElement();\r\n\r\n if (!selectedElement || selectedElementIdSet.size === 0) return elementsToBeMoved;\r\n\r\n if (selectedElement) {\r\n const lastSelectedType = selectedElement.type;\r\n const parentId = selectedElement.parentId;\r\n const filtered = useStore\r\n .getState()\r\n .elements.filter(\r\n (e) =>\r\n isSameTypeGroup(lastSelectedType, e.type) &&\r\n canBeMovedIn2DMode(e) &&\r\n e.parentId === parentId &&\r\n selectedElementIdSet.has(e.id),\r\n );\r\n elementsToBeMoved.push(...filtered);\r\n\r\n if (isGroupable(selectedElement) && elementsToBeMoved.length > 0 && parentId === GROUND_ID) {\r\n handleGroupMaster(elementsToBeMoved as GroupableModel[]);\r\n }\r\n }\r\n\r\n return elementsToBeMoved;\r\n };\r\n\r\n const getElementNewPosition = (oldCx: number, oldCy: number, displacement: number, direction: MoveDirection) => {\r\n switch (direction) {\r\n case MoveDirection.Left:\r\n return [oldCx - displacement, oldCy];\r\n case MoveDirection.Right:\r\n return [oldCx + displacement, oldCy];\r\n case MoveDirection.Up:\r\n return [oldCx, oldCy + displacement];\r\n case MoveDirection.Down:\r\n return [oldCx, oldCy - displacement];\r\n }\r\n };\r\n\r\n const updateMoveInMap = (elementDisplacementMap: Map, direction: MoveDirection) => {\r\n setCommonStore((state) => {\r\n let updateWallMapOnFoundationFlag = false;\r\n\r\n for (const e of state.elements) {\r\n if (elementDisplacementMap.has(e.id)) {\r\n const dist = elementDisplacementMap.get(e.id);\r\n if (dist !== undefined) {\r\n const [newCx, newCy] = getElementNewPosition(e.cx, e.cy, dist, direction);\r\n if (e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n const dist = new Vector3(newCx - wall.cx, newCy - wall.cy);\r\n const newLeftPoint = new Vector3().fromArray(wall.leftPoint).setZ(0).add(dist);\r\n const newRightPoint = new Vector3().fromArray(wall.rightPoint).setZ(0).add(dist);\r\n wall.leftPoint = newLeftPoint.toArray();\r\n wall.rightPoint = newRightPoint.toArray();\r\n updateWallMapOnFoundationFlag = true;\r\n }\r\n e.cx = newCx;\r\n e.cy = newCy;\r\n }\r\n } else if (state.selectedElementIdSet.has(e.id)) {\r\n state.selectedElementIdSet.delete(e.id);\r\n }\r\n }\r\n\r\n if (state.selectedElement?.type === ObjectType.Cuboid || state.selectedElement?.type === ObjectType.Foundation) {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n } else if (updateWallMapOnFoundationFlag) {\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n }\r\n });\r\n };\r\n\r\n const updateMovementForAll = (displacement: number, direction: MoveDirection) => {\r\n setCommonStore((state) => {\r\n for (const e of state.elements) {\r\n if (Util.isFoundationOrCuboid(e) || (Util.isPlantOrHuman(e) && e.parentId === GROUND_ID)) {\r\n [e.cx, e.cy] = getElementNewPosition(e.cx, e.cy, displacement, direction);\r\n }\r\n }\r\n });\r\n };\r\n\r\n const getOppositeDirection = (dir: MoveDirection) => {\r\n if (dir === MoveDirection.Left) return MoveDirection.Right;\r\n if (dir === MoveDirection.Right) return MoveDirection.Left;\r\n if (dir === MoveDirection.Up) return MoveDirection.Down;\r\n if (dir === MoveDirection.Down) return MoveDirection.Up;\r\n console.error('Undo direction is possibly incorrect:', dir);\r\n return dir;\r\n };\r\n\r\n const moveByKey = (direction: MoveDirection, scale: number) => {\r\n if (!orthographic) return;\r\n\r\n // foundation and cuboid can be moved together, child elements on same parent can be moved together.\r\n const elementsToBeMoved = getElementsToBeMoved();\r\n const selectedElement = getSelectedElement();\r\n const displacement = scale * moveStepAbsolute;\r\n\r\n if (selectedElement && elementsToBeMoved.length > 0) {\r\n const elementDisplacementMap = new Map();\r\n\r\n for (const e of elementsToBeMoved) {\r\n switch (e.type) {\r\n case ObjectType.Foundation:\r\n case ObjectType.Cuboid:\r\n case ObjectType.Wall:\r\n case ObjectType.Tree:\r\n case ObjectType.Flower:\r\n case ObjectType.Human: {\r\n elementDisplacementMap.set(e.id, displacement);\r\n break;\r\n }\r\n case ObjectType.Light:\r\n case ObjectType.Sensor: {\r\n const parent = getParent(selectedElement);\r\n if (parent) {\r\n let displacementRel = displacement / parent.lx;\r\n const [newCx, newCy] = getElementNewPosition(e.cx, e.cy, displacementRel, direction);\r\n const halfLx = e.lx / (2 * parent.lx);\r\n const halfLy = e.lx / (2 * parent.ly);\r\n switch (direction) {\r\n case MoveDirection.Left:\r\n case MoveDirection.Right: {\r\n const x = Util.clamp(newCx, -0.5 + halfLx, 0.5 - halfLx);\r\n displacementRel = Math.abs(x - selectedElement.cx);\r\n break;\r\n }\r\n case MoveDirection.Up:\r\n case MoveDirection.Down: {\r\n const y = Util.clamp(newCy, -0.5 + halfLy, 0.5 - halfLy);\r\n displacementRel = Math.abs(y - selectedElement.cy);\r\n break;\r\n }\r\n }\r\n elementDisplacementMap.set(e.id, displacementRel);\r\n }\r\n break;\r\n }\r\n case ObjectType.SolarPanel:\r\n case ObjectType.ParabolicDish:\r\n case ObjectType.ParabolicTrough:\r\n case ObjectType.FresnelReflector:\r\n case ObjectType.Heliostat: {\r\n const parent = getParent(e);\r\n if (parent) {\r\n let accept = true;\r\n let displacementRel = displacement;\r\n switch (direction) {\r\n case MoveDirection.Left:\r\n case MoveDirection.Right: {\r\n displacementRel = displacement / parent.lx;\r\n break;\r\n }\r\n case MoveDirection.Up:\r\n case MoveDirection.Down: {\r\n displacementRel = displacement / parent.ly;\r\n break;\r\n }\r\n }\r\n if (e.type === ObjectType.SolarPanel) {\r\n const [newCx, newCy] = getElementNewPosition(e.cx, e.cy, displacementRel, direction);\r\n accept = isNewPositionOk(e, newCx, newCy);\r\n }\r\n if (accept) {\r\n elementDisplacementMap.set(e.id, displacementRel);\r\n } else {\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n updateMoveInMap(elementDisplacementMap, direction);\r\n\r\n const undoableMoveSelected = {\r\n name: `Move Selected Elements ${direction} By Key`,\r\n timestamp: Date.now(),\r\n direction: direction,\r\n movedElementsDisplacementMap: new Map(elementDisplacementMap),\r\n undo: () => {\r\n const dir = getOppositeDirection(undoableMoveSelected.direction);\r\n updateMoveInMap(undoableMoveSelected.movedElementsDisplacementMap, dir);\r\n },\r\n redo: () => {\r\n updateMoveInMap(undoableMoveSelected.movedElementsDisplacementMap, undoableMoveSelected.direction);\r\n },\r\n } as UndoableMoveSelectedByKey;\r\n addUndoable(undoableMoveSelected);\r\n } else {\r\n updateMovementForAll(displacement, direction);\r\n const undoableMoveAll = {\r\n name: `Move All ${direction} By Key`,\r\n timestamp: Date.now(),\r\n direction: direction,\r\n displacement: displacement,\r\n undo: () => {\r\n const dir = getOppositeDirection(undoableMoveAll.direction);\r\n updateMovementForAll(undoableMoveAll.displacement, dir);\r\n },\r\n redo: () => {\r\n updateMovementForAll(undoableMoveAll.displacement, undoableMoveAll.direction);\r\n },\r\n } as UndoableMoveAllByKey;\r\n addUndoable(undoableMoveAll);\r\n }\r\n };\r\n\r\n const setMultiSelectionMode = (b: boolean) => {\r\n useStore.getState().set((state) => {\r\n state.multiSelectionsMode = b;\r\n });\r\n };\r\n\r\n const handleKeyDown = (key: string) => {\r\n const selectedElement = getSelectedElement();\r\n const step = 1;\r\n switch (key) {\r\n case 'left':\r\n moveByKey(MoveDirection.Left, step);\r\n break;\r\n case 'shift+left':\r\n moveByKey(MoveDirection.Left, step / GRID_RATIO);\r\n break;\r\n case 'ctrl+shift+left':\r\n case 'meta+shift+left':\r\n moveByKey(MoveDirection.Left, step * GRID_RATIO);\r\n break;\r\n case 'right':\r\n moveByKey(MoveDirection.Right, step);\r\n break;\r\n case 'shift+right':\r\n moveByKey(MoveDirection.Right, step / GRID_RATIO);\r\n break;\r\n case 'ctrl+shift+right':\r\n case 'meta+shift+right':\r\n moveByKey(MoveDirection.Right, step * GRID_RATIO);\r\n break;\r\n case 'down':\r\n moveByKey(MoveDirection.Down, step);\r\n break;\r\n case 'shift+down':\r\n moveByKey(MoveDirection.Down, step / GRID_RATIO);\r\n break;\r\n case 'ctrl+shift+down':\r\n case 'meta+shift+down':\r\n moveByKey(MoveDirection.Down, step * GRID_RATIO);\r\n break;\r\n case 'up':\r\n moveByKey(MoveDirection.Up, step);\r\n break;\r\n case 'shift+up':\r\n moveByKey(MoveDirection.Up, step / GRID_RATIO);\r\n break;\r\n case 'ctrl+shift+up':\r\n case 'meta+shift+up':\r\n moveByKey(MoveDirection.Up, step * GRID_RATIO);\r\n break;\r\n case 'ctrl+[':\r\n case 'meta+[': // for Mac\r\n zoomView(0.9);\r\n break;\r\n case 'ctrl+]':\r\n case 'meta+]': // for Mac\r\n zoomView(1.1);\r\n break;\r\n case 'ctrl+c':\r\n case 'meta+c': // for Mac\r\n if (selectedElement && selectedElement.type !== ObjectType.Roof) {\r\n copyElementById(selectedElement.id);\r\n setCommonStore((state) => {\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(selectedElement.id);\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Copy',\r\n timestamp: new Date().getTime(),\r\n elementId: selectedElement.id,\r\n elementType: selectedElement.type,\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n break;\r\n case 'ctrl+x':\r\n case 'meta+x': // for Mac\r\n if (!selectedElement || selectedElement.type === ObjectType.Roof) break;\r\n if (selectedElement.locked) {\r\n showInfo(i18n.t('message.ThisElementIsLocked', lang));\r\n } else {\r\n const cutElements = removeElement(selectedElement.id, true);\r\n if (cutElements.length === 0) break;\r\n\r\n if (Util.isElementTriggerAutoDeletion(selectedElement)) {\r\n useRefStore.getState().setListenToAutoDeletionByCut(true);\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\r\n } else {\r\n const undoableCut = {\r\n name: 'Cut',\r\n timestamp: Date.now(),\r\n deletedElements: cutElements,\r\n selectedElementId: selectedElement.id,\r\n undo: () => {\r\n const cutElements = undoableCut.deletedElements;\r\n if (cutElements.length === 0) return;\r\n\r\n const selectedElement = cutElements.find((e) => e.id === undoableCut.selectedElementId);\r\n if (!selectedElement) return;\r\n\r\n setCommonStore((state) => {\r\n state.elements.push(...cutElements);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(selectedElement.id);\r\n state.selectedElement = selectedElement;\r\n if (selectedElement.type === ObjectType.Wall) {\r\n const wall = selectedElement as WallModel;\r\n let leftWallId: string | null = null;\r\n let rightWallId: string | null = null;\r\n if (wall.leftJoints.length > 0) {\r\n leftWallId = wall.leftJoints[0];\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n rightWallId = wall.rightJoints[0];\r\n }\r\n if (leftWallId || rightWallId) {\r\n for (const e of state.elements) {\r\n if (e.id === leftWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).rightJoints[0] = wall.id;\r\n }\r\n if (e.id === rightWallId && e.type === ObjectType.Wall) {\r\n (e as WallModel).leftJoints[0] = wall.id;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n redo: () => {\r\n if (undoableCut.deletedElements && undoableCut.deletedElements.length > 0) {\r\n removeElement(undoableCut.deletedElements[0].id, true);\r\n }\r\n },\r\n } as UndoableDelete;\r\n addUndoable(undoableCut);\r\n }\r\n }\r\n break;\r\n case 'ctrl+v':\r\n case 'meta+v': // for Mac\r\n const pastedElements = pasteElements();\r\n if (pastedElements.length > 0) {\r\n const undoablePaste = {\r\n name: 'Paste by Key',\r\n timestamp: Date.now(),\r\n pastedElements: JSON.parse(JSON.stringify(pastedElements)),\r\n undo: () => {\r\n for (const elem of undoablePaste.pastedElements) {\r\n removeElementById(elem.id, false);\r\n }\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.elements.push(...undoablePaste.pastedElements);\r\n state.selectedElement = undoablePaste.pastedElements[0];\r\n });\r\n },\r\n } as UndoablePaste;\r\n addUndoable(undoablePaste);\r\n }\r\n break;\r\n case 'ctrl+alt+h': // for Mac and Chrome OS\r\n case 'ctrl+home':\r\n if (!orthographic) {\r\n const cameraPosition = useStore.getState().viewState.cameraPosition;\r\n const panCenter = useStore.getState().viewState.panCenter;\r\n\r\n // if not already reset\r\n if (\r\n cameraPosition[0] !== cameraPosition[1] ||\r\n cameraPosition[1] !== cameraPosition[2] ||\r\n cameraPosition[0] !== cameraPosition[2] ||\r\n panCenter[0] !== 0 ||\r\n panCenter[1] !== 0 ||\r\n panCenter[2] !== 0\r\n ) {\r\n const undoableResetView = {\r\n name: 'Reset View',\r\n timestamp: Date.now(),\r\n oldCameraPosition: [...cameraPosition],\r\n oldPanCenter: [...panCenter],\r\n undo: () => {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n orbitControlsRef.current.object.position.set(\r\n undoableResetView.oldCameraPosition[0],\r\n undoableResetView.oldCameraPosition[1],\r\n undoableResetView.oldCameraPosition[2],\r\n );\r\n orbitControlsRef.current.target.set(\r\n undoableResetView.oldPanCenter[0],\r\n undoableResetView.oldPanCenter[1],\r\n undoableResetView.oldPanCenter[2],\r\n );\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n const v = state.viewState;\r\n v.cameraPosition = [...undoableResetView.oldCameraPosition];\r\n v.panCenter = [...undoableResetView.oldPanCenter];\r\n });\r\n }\r\n },\r\n redo: () => {\r\n resetView();\r\n },\r\n } as UndoableResetView;\r\n addUndoable(undoableResetView);\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n state.viewState.orthographic = false;\r\n });\r\n resetView();\r\n }\r\n }\r\n break;\r\n case 'f2':\r\n case 'ctrl+b':\r\n case 'meta+b':\r\n toggle2DView();\r\n break;\r\n case 'ctrl+u':\r\n case 'meta+u':\r\n toggleNatigationView();\r\n break;\r\n case 'f4':\r\n case 'ctrl+m':\r\n case 'meta+m':\r\n toggleAutoRotate();\r\n break;\r\n case 'ctrl+f':\r\n case 'meta+f': // for Mac\r\n setCommonStore((state) => {\r\n state.createNewFileFlag = true;\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.groupActionMode = false;\r\n window.history.pushState({}, document.title, HOME_URL);\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Create New File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = false;\r\n });\r\n break;\r\n case 'ctrl+s':\r\n case 'meta+s': // for Mac\r\n usePrimitiveStore.setState((state) => {\r\n state.saveLocalFileDialogVisible = true;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Local File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n break;\r\n case 'ctrl+shift+o':\r\n case 'meta+shift+o': // for Mac\r\n usePrimitiveStore.setState((state) => {\r\n state.listCloudFilesFlag = true;\r\n state.openModelsMap = false;\r\n });\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'List Cloud Files',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n break;\r\n case 'ctrl+shift+s':\r\n case 'meta+shift+s': // for Mac\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Cloud File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n break;\r\n case 'alt+backspace':\r\n case 'backspace':\r\n case 'delete': {\r\n const selectedElementIdSet = useStore.getState().selectedElementIdSet;\r\n if (!selectedElement || selectedElementIdSet.size === 0) break;\r\n\r\n const deletedElements = useStore.getState().removeSelectedElements();\r\n if (deletedElements.length === 0) break;\r\n\r\n const ifNeedTriggerAutoDeletion = () => {\r\n const foundations = deletedElements.filter((e) => e.type === ObjectType.Foundation);\r\n const foundationsIdSet = new Set(foundations.map((e) => e.id));\r\n const trigger = deletedElements.find(\r\n (e) => !foundationsIdSet.has(e.parentId) && Util.isElementTriggerAutoDeletion(e),\r\n );\r\n return !!trigger;\r\n };\r\n\r\n if (ifNeedTriggerAutoDeletion()) {\r\n // handle undo in AutoDeletionListener\r\n useRefStore.getState().setListenToAutoDeletionByDelete(true);\r\n usePrimitiveStore.getState().setPrimitiveStore('selectedElementId', selectedElement.id);\r\n } else {\r\n if (deletedElements.length === 1) {\r\n const undoableDelete = {\r\n name: 'Delete',\r\n timestamp: Date.now(),\r\n deletedElements: [...deletedElements],\r\n selectedElementId: selectedElement.id,\r\n undo: () => {\r\n const deletedElements = undoableDelete.deletedElements;\r\n if (!deletedElements || deletedElements.length === 0) return;\r\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\r\n if (!selectedElement) return;\r\n setCommonStore((state) => {\r\n state.elements.push(...deletedElements);\r\n state.selectedElementIdSet.clear();\r\n state.selectedElementIdSet.add(selectedElement.id);\r\n state.selectedElement = selectedElement;\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.deletedRoofId = null;\r\n state.deletedRoofIdSet.clear();\r\n });\r\n if (selectedElement.type === ObjectType.Wall) {\r\n const wall = selectedElement as WallModel;\r\n if (wall.leftJoints.length > 0) {\r\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\r\n }\r\n }\r\n },\r\n redo: () => {\r\n const deletedElements = undoableDelete.deletedElements;\r\n if (!deletedElements || deletedElements.length === 0) return;\r\n const selectedElement = deletedElements.find((e) => e.id === undoableDelete.selectedElementId);\r\n if (!selectedElement) return;\r\n removeElement(selectedElement.id, false);\r\n },\r\n } as UndoableDelete;\r\n addUndoable(undoableDelete);\r\n } else {\r\n const undoableDeleteMultiple = {\r\n name: 'Delete Multiple',\r\n timestamp: Date.now(),\r\n deletedElements: [...deletedElements],\r\n selectedElementId: selectedElement.id,\r\n selectedElementIdSet: new Set(selectedElementIdSet),\r\n undo() {\r\n const deletedElements = this.deletedElements;\r\n if (!deletedElements || deletedElements.length === 0) return;\r\n const selectedElement = deletedElements.find((e) => e.id === this.selectedElementId);\r\n if (!selectedElement) return;\r\n setCommonStore((state) => {\r\n state.elements.push(...deletedElements);\r\n state.selectedElement = selectedElement;\r\n state.selectedElementIdSet = new Set(this.selectedElementIdSet);\r\n state.updateWallMapOnFoundationFlag = !state.updateWallMapOnFoundationFlag;\r\n state.deletedRoofId = null;\r\n state.deletedRoofIdSet.clear();\r\n });\r\n for (const e of this.deletedElements) {\r\n if (e.type === ObjectType.Wall) {\r\n const wall = e as WallModel;\r\n if (wall.leftJoints.length > 0) {\r\n updateWallRightJointsById(wall.leftJoints[0], [wall.id]);\r\n }\r\n if (wall.rightJoints.length > 0) {\r\n updateWallLeftJointsById(wall.rightJoints[0], [wall.id]);\r\n }\r\n }\r\n }\r\n },\r\n redo() {\r\n setCommonStore((state) => {\r\n state.selectedElement = state.elements.find((e) => e.id === this.selectedElementId) ?? null;\r\n state.selectedElementIdSet = new Set(this.selectedElementIdSet);\r\n });\r\n useStore.getState().removeSelectedElements();\r\n },\r\n } as UndoableDeleteMultiple;\r\n addUndoable(undoableDeleteMultiple);\r\n }\r\n setCommonStore((state) => {\r\n state.selectedElement = null;\r\n state.selectedElementIdSet.clear();\r\n });\r\n }\r\n break;\r\n }\r\n case 'ctrl+z':\r\n case 'meta+z': // for Mac\r\n if (undoManager.hasUndo()) {\r\n const commandName = undoManager.undo();\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n }\r\n if (commandName) showInfo(i18n.t('menu.edit.Undo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Undo',\r\n timestamp: new Date().getTime(),\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n break;\r\n case 'ctrl+y':\r\n case 'meta+y': // for Mac\r\n if (undoManager.hasRedo()) {\r\n const commandName = undoManager.redo();\r\n if (commandName) showInfo(i18n.t('menu.edit.Redo', lang) + ': ' + commandName, UNDO_SHOW_INFO_DURATION);\r\n if (useStore.getState().groupActionMode) {\r\n setCommonStore((state) => {\r\n state.groupActionUpdateFlag = !state.groupActionUpdateFlag;\r\n });\r\n }\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Redo',\r\n timestamp: new Date().getTime(),\r\n } as ActionInfo;\r\n });\r\n }\r\n }\r\n break;\r\n case 'shift':\r\n if (useStore.getState().viewState.navigationView) {\r\n usePrimitiveStore.setState((state) => {\r\n state.navigationMoveSpeed = 5 * useStore.getState().minimumNavigationMoveSpeed;\r\n state.navigationTurnSpeed = 5 * useStore.getState().minimumNavigationTurnSpeed;\r\n });\r\n }\r\n setEnableFineGrid(true);\r\n break;\r\n case 'esc': {\r\n const addedFoundationID = useStore.getState().addedFoundationId;\r\n const addedCuboidId = useStore.getState().addedCuboidId;\r\n const addedWallId = useStore.getState().addedWallId;\r\n const addedWindowId = useStore.getState().addedWindowId;\r\n const addedDoorId = useStore.getState().addedDoorId;\r\n if (addedFoundationID) {\r\n removeElementById(addedFoundationID, false);\r\n } else if (addedCuboidId) {\r\n removeElementById(addedCuboidId, false);\r\n } else if (addedWallId) {\r\n removeElementById(addedWallId, false);\r\n } else if (addedWindowId) {\r\n removeElementById(addedWindowId, false);\r\n usePrimitiveStore.getState().setPrimitiveStore('elementBeingCanceledId', addedWindowId);\r\n } else if (addedDoorId) {\r\n removeElementById(addedDoorId, false);\r\n usePrimitiveStore.getState().setPrimitiveStore('elementBeingCanceledId', addedDoorId);\r\n }\r\n setCommonStore((state) => {\r\n state.objectTypeToAdd = ObjectType.None;\r\n state.actionModeLock = false;\r\n state.moveHandleType = null;\r\n state.resizeHandleType = null;\r\n state.groupActionMode = false;\r\n });\r\n useRefStore.getState().setEnableOrbitController(true);\r\n selectNone();\r\n break;\r\n }\r\n case 'ctrl': {\r\n setMultiSelectionMode(true);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleKeyUp = (key: string) => {\r\n switch (key) {\r\n case 'shift':\r\n if (useStore.getState().viewState.navigationView) {\r\n usePrimitiveStore.setState((state) => {\r\n state.navigationMoveSpeed = useStore.getState().minimumNavigationMoveSpeed;\r\n state.navigationTurnSpeed = useStore.getState().minimumNavigationTurnSpeed;\r\n });\r\n }\r\n setEnableFineGrid(false);\r\n break;\r\n case 'ctrl+o':\r\n case 'meta+o': // for Mac\r\n // this must be handled as a key-up event because it brings up a native file dialog\r\n // when the key is down and the corresponding key-up event would never be processed as the focus is lost\r\n if (!useStore.getState().localFileDialogRequested) {\r\n setCommonStore((state) => {\r\n state.localFileDialogRequested = true;\r\n state.openLocalFileFlag = true;\r\n if (loggable) {\r\n state.actionInfo = {\r\n name: 'Open Local File',\r\n timestamp: new Date().getTime(),\r\n };\r\n }\r\n });\r\n }\r\n break;\r\n case 'ctrl': {\r\n setMultiSelectionMode(false);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n useEffect(\r\n () => () => {\r\n keyNameRef.current = null;\r\n },\r\n [],\r\n );\r\n\r\n const keyNameRef = useRef(null);\r\n\r\n return (\r\n <>\r\n {\r\n e.preventDefault();\r\n if (keyNameRef.current === key) return;\r\n keyNameRef.current = key;\r\n handleKeyDown(key);\r\n }}\r\n />\r\n {\r\n e.preventDefault();\r\n keyNameRef.current = null;\r\n handleKeyUp(key);\r\n }}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(KeyboardListener);\r\n","import React from 'react';\r\nimport { GROUND_ID } from 'src/constants';\r\nimport { ElementModel } from 'src/models/ElementModel';\r\nimport { useStore } from 'src/stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { ObjectType } from 'src/types';\r\nimport GroupMaster from './groupMaster';\r\nimport { Point2 } from 'src/models/Point2';\r\nimport { Util } from 'src/Util';\r\nimport { WallModel } from 'src/models/WallModel';\r\nimport { RoofModel } from 'src/models/RoofModel';\r\nimport { Vector3 } from 'three';\r\nimport { GroupableModel, isGroupable } from 'src/models/Groupable';\r\n\r\nconst isBaseElement = (e: ElementModel) => {\r\n return e.parentId === GROUND_ID && (e.type === ObjectType.Foundation || e.type === ObjectType.Cuboid);\r\n};\r\n\r\nexport const areTwoBasesOverlapped = (bId1: string, bId2: string, verticesMap: Map) => {\r\n const v1 = verticesMap.get(bId1);\r\n const v2 = verticesMap.get(bId2);\r\n if (!v1 || !v2) return false;\r\n for (const v of v1) {\r\n if (Util.isPointInside(v.x, v.y, v2)) {\r\n return true;\r\n }\r\n }\r\n for (const v of v2) {\r\n if (Util.isPointInside(v.x, v.y, v1)) {\r\n return true;\r\n }\r\n }\r\n v1.push(v1[0]);\r\n v2.push(v2[0]);\r\n for (let i1 = 0; i1 < v1.length - 1; i1++) {\r\n const from1 = v1[i1];\r\n const to1 = v1[i1 + 1];\r\n for (let i2 = 0; i2 < v2.length - 1; i2++) {\r\n const from2 = v2[i2];\r\n const to2 = v2[i2 + 1];\r\n if (Util.lineIntersection(from1, to1, from2, to2)) return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nconst GroupMasterController = React.memo(() => {\r\n useStore(Selector.groupActionUpdateFlag);\r\n const selectedElementIdSet = useStore(Selector.selectedElementIdSet);\r\n const selectedBaseElements = getSelectedBaseElements();\r\n\r\n if (selectedBaseElements.length === 0) return null;\r\n\r\n const { allBaseElements, allBaseElementsVerticesMap, cuboidParentIdMap } = getElementsData();\r\n\r\n const groupIdSet = new Set(selectedBaseElements.map((e) => e.id));\r\n const groupElements = [...selectedBaseElements];\r\n\r\n for (const selectedBase of selectedBaseElements) {\r\n if (selectedBase.enableGroupMaster) {\r\n checkOverlapWithOtherBases(selectedBase);\r\n }\r\n }\r\n\r\n const { position, dimension, rotation, childCuboidIdSet } = getGroupedBasesData();\r\n\r\n function getSelectedBaseElements() {\r\n const baseIdSet = new Set();\r\n for (const e of useStore.getState().elements) {\r\n if (selectedElementIdSet.has(e.id)) {\r\n if (e.parentId === GROUND_ID && isGroupable(e)) {\r\n baseIdSet.add(e.id);\r\n } else if (e.foundationId) {\r\n baseIdSet.add(e.foundationId);\r\n }\r\n }\r\n }\r\n if (baseIdSet.size === 0) return [] as GroupableModel[];\r\n return useStore.getState().elements.filter((e) => baseIdSet.has(e.id)) as GroupableModel[];\r\n }\r\n\r\n function getElementsData() {\r\n const allBaseElements: ElementModel[] = [];\r\n const allBaseElementsVerticesMap = new Map();\r\n const cuboidParentIdMap = new Map();\r\n\r\n for (const e of useStore.getState().elements) {\r\n if (isBaseElement(e)) {\r\n const vertices = Util.fetchFoundationVertexCoordinates(e);\r\n allBaseElements.push(e);\r\n allBaseElementsVerticesMap.set(e.id, vertices);\r\n }\r\n if (e.type === ObjectType.Cuboid && e.parentId !== GROUND_ID) {\r\n cuboidParentIdMap.set(e.id, e.parentId);\r\n }\r\n }\r\n return { allBaseElements, allBaseElementsVerticesMap, cuboidParentIdMap };\r\n }\r\n\r\n function checkOverlapWithOtherBases(curr: GroupableModel) {\r\n for (const baseElement of allBaseElements) {\r\n if (\r\n !groupIdSet.has(baseElement.id) &&\r\n areTwoBasesOverlapped(curr.id, baseElement.id, allBaseElementsVerticesMap)\r\n ) {\r\n groupIdSet.add(baseElement.id);\r\n groupElements.push(baseElement);\r\n if ((baseElement as GroupableModel).enableGroupMaster) {\r\n checkOverlapWithOtherBases(baseElement);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function getGroupedBasesData() {\r\n const groupElementsVertices = groupElements.map((e) => Util.fetchFoundationVertexCoordinates(e)).flat();\r\n const childCuboidIdSet = new Set();\r\n\r\n const bound = Util.calculatePolygonBounds(groupElementsVertices);\r\n let maxChildHeight = 1;\r\n let maxBaseZ = 1;\r\n const map = new Map(); // roofId -> maxWallHeight\r\n for (const elem of useStore.getState().elements) {\r\n // children\r\n if (elem.foundationId && groupIdSet.has(elem.foundationId)) {\r\n if (elem.type === ObjectType.Wall) {\r\n const wall = elem as WallModel;\r\n maxChildHeight = Math.max(maxChildHeight, wall.lz);\r\n if (wall.roofId) {\r\n const maxWallHeight = map.get(wall.roofId) ?? 0;\r\n if (maxWallHeight < wall.lz) {\r\n map.set(wall.roofId, wall.lz);\r\n }\r\n }\r\n } else if (elem.type === ObjectType.Roof) {\r\n maxChildHeight = Math.max(maxChildHeight, (elem as RoofModel).rise + (map.get(elem.id) ?? 0));\r\n }\r\n }\r\n // cuboids\r\n else if (elem.type === ObjectType.Cuboid && groupIdSet.has(getCuboidParentId(elem.id))) {\r\n const { topZ } = Util.getWorldDataById(elem.id);\r\n maxBaseZ = Math.max(maxBaseZ, topZ);\r\n if (elem.parentId !== GROUND_ID) {\r\n childCuboidIdSet.add(elem.id);\r\n }\r\n }\r\n }\r\n const position = new Vector3(bound.x + bound.width / 2, bound.y + bound.height / 2);\r\n let dimension = [bound.width, bound.height, Math.max(maxChildHeight, maxBaseZ)];\r\n let rotation = 0;\r\n if (groupElements.length === 1 && childCuboidIdSet.size === 0) {\r\n const e = groupElements[0];\r\n rotation = e.rotation[2];\r\n dimension = [e.lx, e.ly, Math.max(maxChildHeight, maxBaseZ)];\r\n }\r\n return { position, dimension, rotation, childCuboidIdSet };\r\n }\r\n\r\n function getCuboidParentId(id: string): string {\r\n const pId = cuboidParentIdMap.get(id);\r\n if (!pId) return id;\r\n return getCuboidParentId(pId);\r\n }\r\n\r\n return (\r\n \r\n );\r\n});\r\n\r\nconst GroupMasterWrapper = React.memo(() => {\r\n const enableGroupAction = useStore(Selector.groupActionMode);\r\n\r\n if (!enableGroupAction) return null;\r\n return ;\r\n});\r\n\r\nexport default GroupMasterWrapper;\r\n","var _defs, _path, _path2, _path3, _path4, _path5, _path6;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgMenu(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n t: 1613755944969,\n className: \"icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"p-id\": 5967,\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n width: 200,\n height: 200,\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"style\", {\n type: \"text/css\"\n }))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M194.187431 235.50871m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z\",\n \"p-id\": 5968\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M347.505182 165.510915h552.305182v139.99559H347.505182z\",\n \"p-id\": 5969\n })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M194.187431 512.1129m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z\",\n \"p-id\": 5970\n })), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M347.505182 442.115105h552.305182v139.99559H347.505182z\",\n \"p-id\": 5971\n })), _path5 || (_path5 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M194.187431 788.49129m-69.997795 0a69.997795 69.997795 0 1 0 139.99559 0 69.997795 69.997795 0 1 0-139.99559 0Z\",\n \"p-id\": 5972\n })), _path6 || (_path6 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M347.505182 718.719294h552.305182v139.99559H347.505182z\",\n \"p-id\": 5973\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgMenu);\nexport default __webpack_public_path__ + \"static/media/menu.c2982aed.svg\";\nexport { ForwardRef as ReactComponent };","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { Box3, Object3D, Vector3 } from 'three';\r\nimport { useThree } from '@react-three/fiber';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\n\r\nconst SceneRadiusCalculator = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const updateSceneRadiusFlag = useStore(Selector.updateSceneRadiusFlag);\r\n\r\n const { scene } = useThree();\r\n\r\n useEffect(() => {\r\n const content = scene.children.filter((c) => c.name === 'Content');\r\n const objects: Object3D[] = [];\r\n if (content.length > 0) {\r\n const components = content[0].children;\r\n for (const c of components) {\r\n fetchAabbElements(c, objects);\r\n }\r\n }\r\n const boxes = [];\r\n for (const c of objects) {\r\n boxes.push(new Box3().setFromObject(c));\r\n }\r\n if (boxes.length > 0) {\r\n const min = new Vector3();\r\n const max = new Vector3();\r\n for (const box of boxes) {\r\n min.min(box.min);\r\n max.max(box.max);\r\n }\r\n let r = Math.abs(min.x);\r\n if (r < Math.abs(min.y)) r = Math.abs(min.y);\r\n if (r < Math.abs(min.z)) r = Math.abs(min.z);\r\n if (r < Math.abs(max.x)) r = Math.abs(max.x);\r\n if (r < Math.abs(max.y)) r = Math.abs(max.y);\r\n if (r < Math.abs(max.z)) r = Math.abs(max.z);\r\n setCommonStore((state) => {\r\n state.aabb = new Box3(min, max);\r\n if (!isNaN(r) && isFinite(r)) {\r\n // have to round this, otherwise the result is different even if nothing moved.\r\n state.sceneRadius = Math.round(Math.max(10, r * 1.25)); // make it 25% larger than the bounding box\r\n }\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [updateSceneRadiusFlag]);\r\n\r\n const fetchAabbElements = (obj: Object3D, arr: Object3D[]) => {\r\n if (obj.userData['aabb']) {\r\n arr.push(obj);\r\n }\r\n if (obj.children.length > 0) {\r\n for (const c of obj.children) {\r\n fetchAabbElements(c, arr);\r\n }\r\n }\r\n };\r\n\r\n return <>;\r\n};\r\n\r\nexport default React.memo(SceneRadiusCalculator);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport { OrthographicCamera, PerspectiveCamera } from '@react-three/drei';\r\nimport { Camera, useFrame, useThree } from '@react-three/fiber';\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport { Vector3 } from 'three';\r\nimport { DEFAULT_FAR, DEFAULT_FOV, HALF_PI } from './constants';\r\nimport { MyOrbitControls } from './js/MyOrbitControls';\r\nimport { useStore } from './stores/common';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport * as Selector from './stores/selector';\r\n\r\nconst getCameraDirection = (cam: Camera) => {\r\n const dir = new Vector3().subVectors(cam.localToWorld(new Vector3(0, 0, 1000)), cam.position);\r\n if (dir.x === 0 && dir.y === 0) {\r\n cam.getWorldDirection(dir);\r\n }\r\n return dir;\r\n};\r\n\r\nexport const setCompassRotation = (camera: Camera) => {\r\n const compass = document.getElementById('compassCanvas');\r\n if (compass) {\r\n const dircXY = getCameraDirection(camera).normalize();\r\n const rotationZ = Math.atan2(dircXY.y, dircXY.x) + Math.PI / 2;\r\n const deg = (rotationZ / Math.PI) * 180;\r\n\r\n compass.style.transform = `rotate(${deg}deg)`;\r\n\r\n const isCameraUnderGround = camera.position.z < 0.001;\r\n\r\n if (isCameraUnderGround && !usePrimitiveStore.getState().isCameraUnderGround) {\r\n usePrimitiveStore.getState().setPrimitiveStore('isCameraUnderGround', true);\r\n } else if (!isCameraUnderGround && usePrimitiveStore.getState().isCameraUnderGround) {\r\n usePrimitiveStore.getState().setPrimitiveStore('isCameraUnderGround', false);\r\n }\r\n }\r\n};\r\n\r\nconst CameraController = () => {\r\n const setCommonStore = useStore(Selector.set);\r\n const orthographic = useStore(Selector.viewState.orthographic);\r\n const enableRotate = useStore(Selector.viewState.enableRotate);\r\n const autoRotate = useStore(Selector.viewState.autoRotate);\r\n const fileChanged = useStore(Selector.fileChanged);\r\n const sceneRadius = useStore(Selector.sceneRadius);\r\n const cameraPosition = useStore(Selector.viewState.cameraPosition);\r\n const cameraZoom = useStore(Selector.viewState.cameraZoom);\r\n const navigationView = useStore(Selector.viewState.navigationView);\r\n const navigationMoveSpeed = usePrimitiveStore(Selector.navigationMoveSpeed);\r\n const navigationTurnSpeed = usePrimitiveStore(Selector.navigationTurnSpeed);\r\n const showCloudFileTitleDialogFlag = useStore(Selector.showCloudFileTitleDialogFlag);\r\n const saveLocalFileDialogVisible = usePrimitiveStore(Selector.saveLocalFileDialogVisible);\r\n\r\n const enabledNavigationControls = navigationView && !orthographic;\r\n const cameraPositionLength = Math.hypot(cameraPosition[0], cameraPosition[1], cameraPosition[2]);\r\n const panRadius = (orthographic ? cameraZoom * 50 : cameraPositionLength * 10) * sceneRadius;\r\n const minPan = useMemo(() => new Vector3(-panRadius, -panRadius, 0), [panRadius]);\r\n const maxPan = useMemo(() => new Vector3(panRadius, panRadius, panRadius / 2), [panRadius]);\r\n\r\n const { gl, invalidate, get, set, camera } = useThree();\r\n\r\n const initialOrbitCamera = useMemo(() => {\r\n const camera = get().camera;\r\n camera.up.set(0, 0, 1);\r\n return camera;\r\n }, []);\r\n\r\n const initialOrbitDomElement = useMemo(() => {\r\n return gl.domElement;\r\n }, []);\r\n\r\n const orbitControlRef = useRef(null);\r\n const persCameraRef = useRef(null);\r\n const orthCameraRef = useRef(null);\r\n\r\n //\r\n useEffect(() => {\r\n if (useStore.getState().viewState.cameraPosition2D[2] < 100) {\r\n setCommonStore((state) => {\r\n state.viewState.cameraPosition2D[2] = 150;\r\n });\r\n }\r\n }, []);\r\n\r\n // save orbitControlRef to common store\r\n useEffect(() => {\r\n if (orbitControlRef && orbitControlRef.current) {\r\n useRefStore.setState((state) => {\r\n state.orbitControlsRef = orbitControlRef;\r\n });\r\n }\r\n }, []);\r\n\r\n // add orbit control event listener\r\n useEffect(() => {\r\n if (orbitControlRef.current) {\r\n orbitControlRef.current.addEventListener('change', render);\r\n orbitControlRef.current.addEventListener('start', onInteractionStart);\r\n orbitControlRef.current.addEventListener('end', onInteractionEnd);\r\n }\r\n // copy a reference before the cleanup call\r\n const oc = orbitControlRef.current;\r\n return () => {\r\n if (oc) {\r\n oc.removeEventListener('change', render);\r\n oc.removeEventListener('start', onInteractionStart);\r\n oc.removeEventListener('end', onInteractionEnd);\r\n }\r\n };\r\n }, [enabledNavigationControls]);\r\n\r\n // open new/other file\r\n useEffect(() => {\r\n const viewState = useStore.getState().viewState;\r\n if (orbitControlRef.current) {\r\n if (persCameraRef.current) {\r\n if (enabledNavigationControls) {\r\n const camera = get().camera;\r\n const positionNav = viewState.cameraPositionNav ?? [5, -30, 1];\r\n const rotationNav = viewState.cameraRotationNav ?? [\r\n 1.5374753309166491, 0.16505866097993566, 0.005476951734475092,\r\n ];\r\n camera.position.fromArray(positionNav);\r\n camera.rotation.fromArray([...rotationNav, 'XYZ']);\r\n } else {\r\n const cameraPosition = getVector(viewState.cameraPosition ?? [0, 0, 20]);\r\n const panCenter = getVector(viewState.panCenter ?? [0, 0, 0]);\r\n persCameraRef.current.position.copy(cameraPosition);\r\n persCameraRef.current.lookAt(panCenter);\r\n persCameraRef.current.zoom = 1;\r\n if (!orthographic) {\r\n orbitControlRef.current.object = persCameraRef.current;\r\n orbitControlRef.current.target.copy(panCenter);\r\n }\r\n }\r\n camera.updateMatrixWorld();\r\n setCompassRotation(get().camera);\r\n }\r\n if (orthCameraRef.current) {\r\n // old files have no cameraPosition2D and panCenter2D: 12/19/2021\r\n const cameraPosition2D = getVector(viewState.cameraPosition2D ?? [0, 0, 1000]).setZ(1000);\r\n const panCenter2D = getVector(viewState.panCenter2D ?? [0, 0, 0]);\r\n orthCameraRef.current.position.copy(cameraPosition2D);\r\n orthCameraRef.current.rotation.set(0, 0, 0);\r\n orthCameraRef.current.lookAt(panCenter2D);\r\n orthCameraRef.current.zoom = viewState.cameraZoom;\r\n if (orthographic) {\r\n orbitControlRef.current.object = orthCameraRef.current;\r\n orbitControlRef.current.target.copy(panCenter2D);\r\n }\r\n }\r\n }\r\n }, [fileChanged]);\r\n\r\n // switch camera\r\n useEffect(() => {\r\n if (!orthCameraRef.current || !persCameraRef.current || !orbitControlRef.current) return;\r\n\r\n const viewState = useStore.getState().viewState;\r\n const orbitControl = orbitControlRef.current;\r\n const orthCam = orthCameraRef.current;\r\n const persCam = persCameraRef.current;\r\n if (orthographic) {\r\n orthCam.rotation.set(0, 0, 0);\r\n orbitControl.object = orthCam;\r\n orbitControl.target.copy(getVector(viewState.panCenter2D ?? [0, 0, 0]));\r\n set({ camera: orthCam });\r\n } else {\r\n orbitControl.object = persCam;\r\n orbitControl.target.copy(getVector(viewState.panCenter ?? [0, 0, 0]));\r\n set({ camera: persCam });\r\n setCompassRotation(get().camera);\r\n }\r\n }, [orthographic]);\r\n\r\n // camera zoom in 2D view (no need to do this in 3D view)\r\n useEffect(() => {\r\n if (orthographic) {\r\n if (orbitControlRef.current) {\r\n if (orthCameraRef.current) {\r\n orthCameraRef.current.zoom = cameraZoom;\r\n orbitControlRef.current.object = orthCameraRef.current;\r\n }\r\n render();\r\n orbitControlRef.current.update();\r\n }\r\n }\r\n }, [cameraZoom]);\r\n\r\n const render = () => {\r\n invalidate();\r\n if (!useStore.getState().viewState.orthographic) {\r\n setCompassRotation(get().camera);\r\n if (orbitControlRef.current) {\r\n orbitControlRef.current.target.clamp(minPan, maxPan);\r\n }\r\n }\r\n };\r\n\r\n const onInteractionStart = () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.duringCameraInteraction = true;\r\n });\r\n };\r\n\r\n const onInteractionEnd = () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.duringCameraInteraction = false;\r\n });\r\n setCommonStore((state) => {\r\n if (!orbitControlRef.current) return;\r\n const v = state.viewState;\r\n const cam = get().camera;\r\n const cameraPosition = cam.position;\r\n const targetPosition = orbitControlRef.current.target;\r\n if (v.orthographic) {\r\n if (cam.zoom && !isNaN(cam.zoom)) {\r\n v.cameraZoom = cam.zoom;\r\n } else {\r\n v.cameraZoom = 20;\r\n }\r\n v.cameraPosition2D = [cameraPosition.x, cameraPosition.y, 150];\r\n v.panCenter2D = [targetPosition.x, targetPosition.y, targetPosition.z];\r\n } else if (enabledNavigationControls) {\r\n // Do not save the pan center in the navigation mode as the camera position in this mode\r\n // may be way off, which can surprise the user when they exit the navigation mode and try\r\n // to rotate the view. It is difficult to get the pan center back unless they reset the view.\r\n // const panCenter = cam.localToWorld(new Vector3(0, 0, -50));\r\n // v.panCenter = [panCenter.x, panCenter.y, 0];\r\n v.cameraPositionNav = [cameraPosition.x, cameraPosition.y, cameraPosition.z];\r\n v.cameraRotationNav = [cam.rotation.x, cam.rotation.y, cam.rotation.z];\r\n state.cameraDirection = getCameraDirection(cam);\r\n } else {\r\n v.cameraPosition = [cameraPosition.x, cameraPosition.y, cameraPosition.z];\r\n v.panCenter = [targetPosition.x, targetPosition.y, targetPosition.z];\r\n state.cameraDirection = getCameraDirection(cam);\r\n }\r\n });\r\n };\r\n\r\n const getVector = (n: number[] | Vector3) => {\r\n if (n && Array.isArray(n)) {\r\n return new Vector3(n[0], n[1], n[2]);\r\n }\r\n // some of our old files are saved as serialized vector\r\n if (n && n.x !== null) {\r\n return new Vector3(n.x, n.y, n.z);\r\n }\r\n return new Vector3(0, 0, 5);\r\n };\r\n\r\n // animation\r\n useFrame((state) => {\r\n if (autoRotate && orbitControlRef.current) {\r\n orbitControlRef.current.update();\r\n }\r\n });\r\n\r\n // other components ref\r\n const compassMounted = useRefStore((state) => state.compassRef);\r\n\r\n // on mount\r\n useEffect(() => {\r\n setCompassRotation(get().camera);\r\n }, [compassMounted]);\r\n\r\n // key event\r\n useEffect(() => {\r\n if (!orbitControlRef.current) return;\r\n\r\n if (enabledNavigationControls && !saveLocalFileDialogVisible && !showCloudFileTitleDialogFlag) {\r\n orbitControlRef.current.listenToKeyEvents(window);\r\n } else {\r\n orbitControlRef.current.removeKeyEvents();\r\n }\r\n }, [enabledNavigationControls, saveLocalFileDialogVisible, showCloudFileTitleDialogFlag]);\r\n\r\n // switch to navigation controls\r\n useEffect(() => {\r\n if (!orbitControlRef.current) return;\r\n\r\n const viewState = useStore.getState().viewState;\r\n\r\n if (enabledNavigationControls) {\r\n const camera = get().camera;\r\n const positionNav = viewState.cameraPositionNav ?? [5, -30, 1];\r\n const rotationNav = viewState.cameraRotationNav ?? [\r\n 1.5374753309166491, 0.16505866097993566, 0.005476951734475092,\r\n ];\r\n camera.position.fromArray(positionNav);\r\n camera.rotation.fromArray([...rotationNav, 'XYZ']);\r\n camera.updateMatrixWorld();\r\n setCompassRotation(get().camera);\r\n } else {\r\n if (orbitControlRef.current && persCameraRef.current) {\r\n const cameraPosition = getVector(viewState.cameraPosition ?? [0, 0, 20]);\r\n const panCenter = getVector(viewState.panCenter ?? [0, 0, 0]);\r\n persCameraRef.current.position.copy(cameraPosition);\r\n persCameraRef.current.lookAt(panCenter);\r\n persCameraRef.current.zoom = 1;\r\n if (!orthographic) {\r\n orbitControlRef.current.object = persCameraRef.current;\r\n orbitControlRef.current.target.copy(panCenter);\r\n }\r\n persCameraRef.current.updateMatrixWorld();\r\n setCompassRotation(persCameraRef.current);\r\n }\r\n }\r\n invalidate();\r\n }, [enabledNavigationControls]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(CameraController);\r\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport styled from 'styled-components';\nimport {\n FacebookIcon,\n FacebookShareButton,\n LineIcon,\n LineShareButton,\n LinkedinIcon,\n LinkedinShareButton,\n RedditIcon,\n RedditShareButton,\n TwitterIcon,\n TwitterShareButton,\n WhatsappIcon,\n WhatsappShareButton,\n} from 'react-share';\nimport { HOME_URL } from './constants';\nimport { useStore } from './stores/common';\nimport * as Selector from './stores/selector';\nimport i18n from './i18n/i18n';\n\nconst ShareLinkContainer = styled.div`\n display: flex;\n flex-direction: column;\n z-index: 999;\n`;\n\nexport interface ShareLinkProps {\n style?: object;\n size: number;\n margin: string;\n round?: boolean;\n handleShareWindowClose?: () => void;\n}\n\nconst ShareLinks = ({ style, size, margin, round, handleShareWindowClose }: ShareLinkProps) => {\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const cloudFile = useStore(Selector.cloudFile);\n\n const params = new URLSearchParams(window.location.search);\n const userid = params.get('userid');\n const lang = { lng: language };\n const title = cloudFile ?? i18n.t('name.Tagline', lang);\n const via = 'aladdinIFI ' + (cloudFile ? i18n.t('name.Tagline', lang) : '');\n let url = HOME_URL;\n if (cloudFile) {\n // only a cloud file is sharable\n if (userid) {\n // since this may be other people's document, keep its original user id\n url += '?client=web&userid=' + userid + '&title=' + encodeURIComponent(cloudFile);\n } else if (user.uid) {\n // otherwise, this is the current user's document\n url += '?client=web&userid=' + user.uid + '&title=' + encodeURIComponent(cloudFile);\n }\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default React.memo(ShareLinks);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nexport class Individual {\n chromosome: number[];\n\n // store the fitness value evaluated by the objective function (NaN means not evaluated yet)\n fitness: number = Number.NaN;\n discretizationSteps: number | undefined;\n\n constructor(length: number, randomize: boolean, discretizationSteps?: number) {\n this.chromosome = new Array(length);\n this.discretizationSteps = discretizationSteps;\n if (randomize) {\n if (discretizationSteps) {\n for (let i = 0; i < length; i++) {\n const n = Math.floor(Math.random() * discretizationSteps);\n this.chromosome[i] = n / discretizationSteps;\n }\n } else {\n for (let i = 0; i < length; i++) {\n this.chromosome[i] = Math.random();\n }\n }\n }\n }\n\n getCopy(): Individual {\n const c = new Individual(this.chromosome.length, false, this.discretizationSteps);\n for (let i = 0; i < c.chromosome.length; i++) {\n c.chromosome[i] = this.chromosome[i];\n }\n c.fitness = this.fitness;\n return c;\n }\n\n compare(i: Individual): number {\n if (isNaN(this.fitness) || isNaN(i.fitness)) throw new Error('Fitness cannot be NaN');\n if (this.fitness > i.fitness) return 1;\n if (this.fitness < i.fitness) return -1;\n return 0;\n }\n\n setGene(i: number, g: number) {\n if (i < 0 || i >= this.chromosome.length) throw new Error('Gene index out of bound: ' + i);\n this.chromosome[i] = g;\n }\n\n getGene(i: number) {\n if (i < 0 || i >= this.chromosome.length) throw new Error('Gene index out of bound: ' + i);\n return this.chromosome[i];\n }\n\n copyGenes(original: Individual) {\n const n = Math.min(this.chromosome.length, original.chromosome.length);\n for (let i = 0; i < n; i++) {\n this.chromosome[i] = original.chromosome[i];\n }\n }\n /*\n * return the Euclidean distance between the chromosomes\n * phenotypic only as we don't use genotypic (bit) coding\n */\n distance(individual: Individual) {\n if (this.chromosome.length === 1) {\n return Math.abs(this.chromosome[0] - individual.chromosome[0]);\n }\n let sum = 0;\n for (let i = 0; i < this.chromosome.length; i++) {\n const d = this.chromosome[i] - individual.chromosome[i];\n sum += d * d;\n }\n return Math.sqrt(sum);\n }\n\n toString(): string {\n let s: string = '';\n for (const x of this.chromosome) {\n s += x + ', ';\n }\n return '(' + s.substring(0, s.length - 2) + ') : ' + this.fitness;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Individual } from './Individual';\n\nexport class Parents {\n dad: Individual;\n mom: Individual;\n\n constructor(dad: Individual, mom: Individual) {\n this.dad = dad;\n this.mom = mom;\n }\n\n equals(p: Parents): boolean {\n return (p.dad === this.dad && p.mom === this.mom) || (p.dad === this.mom && p.mom === this.dad);\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n * This class implements simple genetic algorithm (SGA).\n */\n\nimport { Individual } from './Individual';\nimport { GeneticAlgorithmSelectionMethod } from '../../../types';\nimport { Parents } from './Parents';\nimport { Util } from '../../../Util';\n\nexport class Population {\n individuals: Individual[];\n savedGeneration: Individual[];\n violations: boolean[];\n beta: number; // blending parameter for genetic mixing\n survivors: Individual[];\n mutants: Individual[];\n selectionMethod: GeneticAlgorithmSelectionMethod = GeneticAlgorithmSelectionMethod.ROULETTE_WHEEL;\n discretizationSteps: number | undefined;\n\n constructor(\n populationSize: number,\n chromosomeLength: number,\n selectionMethod: GeneticAlgorithmSelectionMethod,\n discretizationSteps?: number,\n ) {\n this.beta = 0.5;\n this.selectionMethod = selectionMethod;\n this.individuals = new Array(populationSize);\n this.savedGeneration = new Array(populationSize);\n this.violations = new Array(populationSize);\n this.survivors = [];\n this.mutants = [];\n this.discretizationSteps = discretizationSteps;\n for (let i = 0; i < this.individuals.length; i++) {\n this.individuals[i] = new Individual(chromosomeLength, true, discretizationSteps);\n this.savedGeneration[i] = new Individual(chromosomeLength, true, discretizationSteps);\n this.violations[i] = false;\n }\n }\n\n // sort the fitness in the descending order (sort b before a if b's fitness is higher than a's)\n sort(): void {\n this.individuals.sort((a, b) => b.compare(a));\n }\n\n getNicheCount(selected: Individual, sigma: number): number {\n let nicheCount = 0;\n for (const i of this.individuals) {\n const r = selected.distance(i);\n let share = 0;\n if (r < sigma) {\n share = 1.0 - r / sigma;\n }\n nicheCount += share;\n }\n return nicheCount;\n }\n\n saveGenes(): void {\n for (let i = 0; i < this.individuals.length; i++) {\n this.savedGeneration[i].copyGenes(this.individuals[i]);\n this.violations[i] = false;\n }\n }\n\n restoreGenes(): void {\n for (let i = 0; i < this.individuals.length; i++) {\n if (this.violations[i]) {\n this.individuals[i].copyGenes(this.savedGeneration[i]);\n }\n }\n }\n\n getFittest(): Individual | undefined {\n let max = -Number.MAX_VALUE;\n let best: Individual | undefined;\n for (const i of this.individuals) {\n if (isNaN(i.fitness)) {\n // fitness not computed yet, skip\n continue;\n }\n if (i.fitness > max) {\n max = i.fitness;\n best = i;\n }\n }\n return best;\n }\n\n /* Implement simple genetic algorithm (SGA) */\n\n evolve(selectionRate: number, crossoverRate: number): void {\n this.selectSurvivors(selectionRate);\n this.crossover(crossoverRate);\n }\n\n // select the survivors based on elitism specified by the rate of selection\n selectSurvivors(selectionRate: number): void {\n this.survivors = [];\n this.sort();\n const imax = Math.floor(selectionRate * this.individuals.length);\n for (let i = 0; i < imax; i++) {\n this.survivors.push(this.individuals[i]);\n }\n }\n\n // uniform crossover\n crossover(crossoverRate: number): void {\n const numberOfSurvivers = this.survivors.length;\n if (numberOfSurvivers <= 1) {\n return;\n }\n\n const lowestFitness = this.individuals[numberOfSurvivers].fitness;\n let sumOfFitness = 0;\n for (let i = 0; i < numberOfSurvivers; i++) {\n sumOfFitness += this.individuals[i].fitness - lowestFitness;\n }\n\n const newBorn = this.individuals.length - numberOfSurvivers;\n const oldFolks = new Array();\n while (oldFolks.length * 2 < newBorn) {\n // multiplying 2 above because each couple produces two children as shown in the mating algorithm below\n let p: Parents | null = null;\n switch (this.selectionMethod) {\n case GeneticAlgorithmSelectionMethod.TOURNAMENT:\n p = this.selectParentsByTournament();\n break;\n default:\n p = this.selectParentsByRouletteWheel(lowestFitness, sumOfFitness);\n }\n if (p && !oldFolks.includes(p)) {\n oldFolks.push(p);\n }\n }\n\n // mating of dad and mom produces two children\n let childIndex = numberOfSurvivers;\n for (const p of oldFolks) {\n const n = p.dad.chromosome.length;\n const child1 = new Individual(n, true, this.discretizationSteps);\n const child2 = new Individual(n, true, this.discretizationSteps);\n this.beta = Math.random();\n for (let i = 0; i < n; i++) {\n const di = p.dad.getGene(i);\n const mi = p.mom.getGene(i);\n // if the crossover rate equals to 1, then it is uniform crossover when beta is 0 or 1,\n // which means the children take a gene from either parent completely randomly\n // if the crossover rate equals to 0, then it is reduced to only blending,\n // which may work as well (but crossover can increase higher genetic diversity)\n if (Math.random() < crossoverRate) {\n child1.setGene(i, this.beta * di + (1 - this.beta) * mi);\n child2.setGene(i, this.beta * mi + (1 - this.beta) * di);\n } else {\n child1.setGene(i, this.beta * mi + (1 - this.beta) * di);\n child2.setGene(i, this.beta * di + (1 - this.beta) * mi);\n }\n }\n if (childIndex < this.individuals.length) {\n this.individuals[childIndex] = child1;\n }\n if (childIndex + 1 < this.individuals.length) {\n this.individuals[childIndex + 1] = child2;\n }\n childIndex += 2;\n }\n }\n\n // select a parent by the roulette wheel rule (fitness proportionate selection)\n selectParentsByRouletteWheel(lowestFitness: number, sumOfFitness: number): Parents | null {\n // spin the wheel to find dad\n let dad = null;\n let roulettWheelPosition = Math.random() * sumOfFitness;\n let spinWheel = 0;\n for (const s of this.survivors) {\n spinWheel += s.fitness - lowestFitness;\n if (spinWheel >= roulettWheelPosition) {\n dad = s;\n break;\n }\n }\n // spin the wheel to find mom\n let mom = null;\n do {\n roulettWheelPosition = Math.random() * sumOfFitness;\n spinWheel = 0;\n for (const s of this.survivors) {\n spinWheel += s.fitness - lowestFitness;\n if (spinWheel >= roulettWheelPosition) {\n if (s !== dad) {\n mom = s;\n }\n break;\n }\n }\n } while (mom === null);\n if (dad && mom) return new Parents(dad, mom);\n return null;\n }\n\n // select a parent by tournament\n selectParentsByTournament(): Parents | null {\n const numberOfSurvivers = this.survivors.length;\n if (numberOfSurvivers <= 1) {\n throw new Error('Must have at least two survivors to be used as parents');\n }\n const n1 = numberOfSurvivers - 1;\n\n // find dad first\n let i = Math.floor(Math.random() * n1);\n let j;\n do {\n j = Math.floor(Math.random() * n1);\n } while (j === i);\n const d = this.survivors[i].fitness > this.survivors[j].fitness ? i : j;\n\n // now find mom\n i = Math.floor(Math.random() * n1);\n do {\n j = Math.floor(Math.random() * n1);\n } while (j === i);\n let m = this.survivors[i].fitness > this.survivors[j].fitness ? i : j;\n\n // if mom is the same with dad, try again until otherwise\n while (m === d) {\n i = Math.floor(Math.random() * n1);\n do {\n j = Math.floor(Math.random() * n1);\n } while (j === i);\n m = this.survivors[i].fitness > this.survivors[j].fitness ? i : j;\n }\n\n return new Parents(this.survivors[d], this.survivors[m]);\n }\n\n mutate(mutationRate: number): void {\n if (Util.isZero(mutationRate)) {\n return;\n }\n // randomly select a number of individual to mutate based on the mutation rate\n let m = Math.floor(mutationRate * (this.individuals.length - 1));\n if (m === 0) {\n // ensure at least one mutant?\n m = 1;\n } else if (m === this.individuals.length - 1) {\n // we will have a deadlock in the while loop below if we don't do this\n // because the length of mutants will always be less than the full individual length in elitism\n m = this.individuals.length - 2;\n }\n this.mutants = [];\n while (this.mutants.length < m) {\n // elitism: don't mutate the top one\n const k = Math.floor(1 + Math.random() * (this.individuals.length - 2));\n if (!this.mutants.includes(this.individuals[k])) {\n this.mutants.push(this.individuals[k]);\n }\n }\n // randomly select a gene of a picked individual to mutate (only one gene to mutate at a time)\n for (const i of this.mutants) {\n const n = Math.floor(Math.random() * (i.chromosome.length - 1));\n i.setGene(n, Math.random());\n }\n }\n\n // check convergence bitwise (the so-called nominal convergence)\n isNominallyConverged(convergenceThreshold: number): boolean {\n if (this.survivors.length < 2) {\n return true;\n }\n const n = this.individuals[0].chromosome.length;\n const m = Math.max(2, Math.floor(this.survivors.length / 2));\n for (let i = 0; i < n; i++) {\n let average = 0;\n for (let j = 0; j < m; j++) {\n average += this.survivors[j].getGene(i);\n }\n average /= m;\n for (let j = 0; j < m; j++) {\n if (Math.abs(this.survivors[j].getGene(i) / average - 1.0) > convergenceThreshold) {\n return false;\n }\n }\n }\n return true;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { SearchMethod, GeneticAlgorithmSelectionMethod, ObjectiveFunctionType } from '../../../types';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { Population } from './Population';\nimport { Individual } from './Individual';\nimport { Constraint } from './Constraint';\n\nexport abstract class OptimizerGa {\n population: Population;\n objectiveFunctionType: ObjectiveFunctionType;\n convergenceThreshold: number;\n minima: number[];\n maxima: number[];\n foundation: FoundationModel;\n fitnessSharingRadius: number = 0.1;\n searchMethod: SearchMethod = SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION;\n localSearchRadius: number = 0.1;\n\n constraints: Constraint[] = [];\n stopped: boolean = true;\n mutationRate: number = 0.1;\n crossoverRate: number = 0.5;\n selectionRate: number = 0.5;\n maximumGenerations: number = 5;\n\n fittestOfGenerations: (Individual | null)[] = [];\n populationOfGenerations: (Population | null)[] = [];\n outsideGenerationCounter: number = 0;\n computeCounter: number = 0;\n converged: boolean = false;\n geneNames: string[];\n\n protected constructor(\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n populationSize: number,\n maximumGenerations: number,\n chromosomeLength: number,\n selectionMethod: GeneticAlgorithmSelectionMethod,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n discretizationSteps?: number,\n ) {\n this.population = new Population(populationSize, chromosomeLength, selectionMethod, discretizationSteps);\n this.objectiveFunctionType = objectiveFunctionType;\n this.convergenceThreshold = convergenceThreshold;\n this.maximumGenerations = maximumGenerations;\n this.searchMethod = searchMethod;\n this.localSearchRadius = localSearchRadius;\n this.geneNames = new Array(chromosomeLength);\n this.foundation = foundation;\n const cx = foundation.cx;\n const cy = foundation.cy;\n const lx = foundation.lx;\n const ly = foundation.ly;\n this.minima = new Array(chromosomeLength);\n this.maxima = new Array(chromosomeLength);\n for (let i = 0; i < chromosomeLength; i += 2) {\n this.setMinMax(i, cx - lx * 0.5, cx + lx * 0.5);\n this.setMinMax(i + 1, cy - ly * 0.5, cy + ly * 0.5);\n }\n this.fittestOfGenerations = new Array(this.maximumGenerations + 1);\n this.fittestOfGenerations.fill(null);\n this.populationOfGenerations = new Array(this.maximumGenerations);\n for (let i = 0; i < this.maximumGenerations; i++) {\n this.populationOfGenerations[i] = new Population(\n populationSize,\n chromosomeLength,\n selectionMethod,\n convergenceThreshold,\n );\n }\n }\n\n setMinMax(i: number, min: number, max: number): void {\n this.minima[i] = min;\n this.maxima[i] = max;\n }\n\n abstract applyFittest(): void;\n\n stop(): void {\n this.stopped = true;\n }\n\n shouldTerminate(): boolean {\n return this.outsideGenerationCounter >= this.maximumGenerations;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nexport class Random {\n // return a random number in a normal distribution with mean = 0 and variance = 1 using the Box-Muller transform.\n public static gaussian(): number {\n let u = 0,\n v = 0;\n while (u === 0) u = Math.random(); //Converting [0,1) to (0,1)\n while (v === 0) v = Math.random();\n return Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n }\n\n // return two random numbers in a normal distribution with mean = 0 and variance = 1 using the Box-Muller transform.\n public static twoGaussians(): number[] {\n let u = 0,\n v = 0;\n while (u === 0) u = Math.random(); //Converting [0,1) to (0,1)\n while (v === 0) v = Math.random();\n let r: number[] = new Array(2);\n let a = Math.sqrt(-2.0 * Math.log(u));\n let b = 2.0 * Math.PI * v;\n r[0] = a * Math.cos(b);\n r[1] = a * Math.sin(b);\n return r;\n }\n\n // return a random number in a poisson distribution with the specified lambda.\n public static poisson(lambda: number): number {\n let x = 0,\n p = Math.exp(-lambda),\n s = p;\n let u = Math.random();\n while (u > s) {\n x++;\n p *= lambda / x;\n s += p;\n }\n return x;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n *\n * The chromosome of an individual is encoded as follows:\n *\n * solarPanel[0].tiltAngle, solarPanel[1].tiltAngle, ..., solarPanel[n].tiltAngle\n *\n */\n\nimport { OptimizerGa } from './OptimizerGa';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { Individual } from './Individual';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { SearchMethod, GeneticAlgorithmSelectionMethod, ObjectiveFunctionType } from '../../../types';\nimport { HALF_PI } from '../../../constants';\nimport { Util } from '../../../Util';\nimport { Random } from '../../../Random';\n\nexport class SolarPanelTiltAngleOptimizerGa extends OptimizerGa {\n solarPanels: SolarPanelModel[];\n\n constructor(\n solarPanels: SolarPanelModel[],\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n populationSize: number,\n maximumGenerations: number,\n selectionMethod: GeneticAlgorithmSelectionMethod,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n ) {\n super(\n foundation,\n objectiveFunctionType,\n populationSize,\n maximumGenerations,\n solarPanels.length,\n selectionMethod,\n convergenceThreshold,\n searchMethod,\n localSearchRadius,\n );\n this.solarPanels = solarPanels;\n // set the firstborn to be the current design\n const firstBorn: Individual = this.population.individuals[0];\n for (const [i, panel] of solarPanels.entries()) {\n const normalizedValue = 0.5 * (1.0 + panel.tiltAngle / HALF_PI);\n firstBorn.setGene(i, normalizedValue);\n if (this.searchMethod === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION) {\n for (let k = 1; k < this.population.individuals.length; k++) {\n const individual: Individual = this.population.individuals[k];\n let v = Random.gaussian() * this.localSearchRadius + normalizedValue;\n while (v < 0 || v > 1) {\n v = Random.gaussian() * this.localSearchRadius + normalizedValue;\n }\n individual.setGene(i, v);\n }\n }\n this.geneNames[i] = 'Tilt Angle (' + panel.id + ')';\n }\n }\n\n applyFittest(): void {\n const best: Individual | undefined = this.population.getFittest();\n if (best) {\n for (let i = 0; i < best.chromosome.length; i++) {\n const gene = best.getGene(i);\n this.solarPanels[i].tiltAngle = (2 * gene - 1) * HALF_PI;\n }\n console.log('Fittest: ' + SolarPanelTiltAngleOptimizerGa.individualToString(best));\n }\n }\n\n static individualToString(individual: Individual): string {\n let s = 'F(';\n for (let i = 0; i < individual.chromosome.length; i++) {\n const gene = individual.getGene(i);\n s += Util.toDegrees((2 * gene - 1) * HALF_PI).toFixed(3) + '°, ';\n }\n return s.substring(0, s.length - 2) + ') = ' + individual.fitness.toFixed(5) + ' kWh';\n }\n\n startEvolving(): void {\n this.outsideGenerationCounter = 0;\n this.computeCounter = 0;\n this.fittestOfGenerations.fill(null);\n }\n\n // translate gene to structure for the specified individual\n translateIndividual(indexOfIndividual: number): void {\n const individual: Individual = this.population.individuals[indexOfIndividual];\n for (let i = 0; i < individual.chromosome.length; i++) {\n const gene = individual.getGene(i);\n this.solarPanels[i].tiltAngle = (2 * gene - 1) * HALF_PI;\n }\n }\n\n evolveIndividual(indexOfIndividual: number, fitness: number): boolean {\n const populationSize = this.population.individuals.length;\n if (!this.converged) {\n const individual: Individual = this.population.individuals[indexOfIndividual];\n individual.fitness = fitness;\n // the first individual of the first generation is used as a baseline\n // (imagine it as the fittest of the zeroth generation)\n if (this.computeCounter === 0 && indexOfIndividual === 0) {\n this.fittestOfGenerations[0] = individual.getCopy();\n }\n const generation = Math.floor(this.computeCounter / populationSize);\n console.log(\n 'Generation ' +\n (generation + 1) +\n ', individual ' +\n indexOfIndividual +\n ' : ' +\n SolarPanelTiltAngleOptimizerGa.individualToString(individual),\n );\n const savedIndividual = this.populationOfGenerations[generation]?.individuals[indexOfIndividual];\n if (savedIndividual) {\n for (let k = 0; k < individual.chromosome.length; k++) {\n savedIndividual.chromosome[k] = individual.chromosome[k];\n }\n savedIndividual.fitness = individual.fitness;\n }\n const isAtTheEndOfGeneration = this.computeCounter % populationSize === populationSize - 1;\n if (isAtTheEndOfGeneration) {\n this.population.saveGenes();\n this.population.evolve(this.selectionRate, this.crossoverRate);\n const best = this.population.getFittest();\n if (best) {\n this.fittestOfGenerations[generation + 1] = best.getCopy();\n }\n if (this.detectViolations()) {\n this.population.restoreGenes();\n } else {\n this.converged = this.population.isNominallyConverged(this.convergenceThreshold);\n if (!this.converged && this.searchMethod === SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION) {\n this.population.mutate(this.mutationRate);\n }\n }\n }\n this.computeCounter++;\n }\n return this.converged;\n }\n\n // if anyone in the current population doesn't meet the constraints, the entire population dies\n // and the algorithm reverts to the previous generation -- not efficient\n detectViolations(): boolean {\n return false; // TODO\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from '../../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { showError, showInfo } from '../../helpers';\nimport i18n from '../../i18n/i18n';\nimport { DatumEntry, DesignProblem, EvolutionMethod, ObjectiveFunctionType, ObjectType } from '../../types';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { SolarPanelTiltAngleOptimizerGa } from './algorithm/SolarPanelTiltAngleOptimizerGa';\nimport { FoundationModel } from '../../models/FoundationModel';\nimport { HALF_PI } from '../../constants';\nimport { Util } from '../../Util';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nconst SolarPanelTiltAngleGa = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pauseEvolution = usePrimitiveStore(Selector.pauseEvolution);\n const foundation = useStore(Selector.selectedElement) as FoundationModel;\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const setFittestIndividualResults = useStore(Selector.setFittestIndividualResults);\n const objectiveEvaluationIndex = usePrimitiveStore(Selector.objectiveEvaluationIndex);\n const geneLabels = useStore(Selector.variableLabels);\n const setGeneLabels = useStore(Selector.setVariableLabels);\n const params = useStore(Selector.evolutionaryAlgorithmState).geneticAlgorithmParams;\n\n const lang = { lng: language };\n const requestRef = useRef(0);\n const evolutionCompletedRef = useRef(false);\n const pauseRef = useRef(false);\n const solarPanelsRef = useRef();\n const optimizerRef = useRef();\n const individualIndexRef = useRef(0);\n const convergedRef = useRef(false);\n const initialSolarPanelsRef = useRef([]);\n\n useEffect(() => {\n if (params.problem !== DesignProblem.SOLAR_PANEL_TILT_ANGLE) return;\n if (evolutionMethod !== EvolutionMethod.GENETIC_ALGORITHM) return;\n if (runEvolution) {\n init();\n requestRef.current = requestAnimationFrame(evolve);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!evolutionCompletedRef.current) {\n showInfo(i18n.t('message.EvolutionAborted', lang));\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = false;\n });\n // revert to the initial solar panels\n if (initialSolarPanelsRef.current.length > 0) {\n solarPanelsRef.current = [...initialSolarPanelsRef.current];\n runCallback(true);\n }\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runEvolution]);\n\n useEffect(() => {\n pauseRef.current = pauseEvolution;\n if (pauseEvolution) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = true;\n });\n showInfo(i18n.t('message.EvolutionPaused', lang));\n } else {\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = false;\n });\n // continue the evolution\n evolve();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pauseEvolution]);\n\n // getting ready for the evolution\n const init = () => {\n if (!foundation) return;\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = true;\n state.objectiveEvaluationIndex = 0;\n });\n evolutionCompletedRef.current = false;\n const originalSolarPanels = getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[];\n // store a copy of the initial solar panels for possible reversion\n initialSolarPanelsRef.current.length = 0;\n for (const osp of originalSolarPanels) {\n initialSolarPanelsRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n }\n solarPanelsRef.current = [];\n const labels: (string | undefined)[] = [];\n for (const osp of originalSolarPanels) {\n solarPanelsRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n labels.push(osp.label);\n }\n if (solarPanelsRef.current.length > 0) {\n optimizerRef.current = new SolarPanelTiltAngleOptimizerGa(\n solarPanelsRef.current,\n foundation,\n params.objectiveFunctionType,\n params.populationSize,\n params.maximumGenerations,\n params.selectionMethod,\n params.convergenceThreshold,\n params.searchMethod,\n params.localSearchRadius,\n );\n optimizerRef.current.selectionRate = params.selectionRate;\n optimizerRef.current.crossoverRate = params.crossoverRate;\n optimizerRef.current.mutationRate = params.mutationRate;\n individualIndexRef.current = 0;\n convergedRef.current = false;\n setGeneLabels(labels);\n optimizerRef.current.startEvolving();\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = true;\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n } else {\n showError(i18n.t('message.EncounterEvolutionError', lang));\n }\n };\n\n const getTotal = (): number => {\n let total = 0;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n const dailyPvYield = useDataStore.getState().dailyPvYield;\n for (const datum of dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n const yearlyPvYield = useDataStore.getState().yearlyPvYield;\n for (const datum of yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n total *= 12 / daysPerYear;\n break;\n }\n return total;\n };\n\n // the increment of objectiveEvaluationIndex is used as a trigger to request the next animation frame\n useEffect(() => {\n if (!optimizerRef.current || !objectiveEvaluationIndex) return;\n // the number of individuals to evaluate is less than or equal to maximumGenerations * populationSize,\n // subject to the convergence criterion\n convergedRef.current = optimizerRef.current.evolveIndividual(\n individualIndexRef.current % params.populationSize,\n getTotal(),\n );\n updateResults();\n individualIndexRef.current++;\n optimizerRef.current.outsideGenerationCounter = Math.floor(individualIndexRef.current / params.populationSize);\n // recursive call to the next step of the evolution, which is to evaluate the next individual\n requestRef.current = requestAnimationFrame(evolve);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objectiveEvaluationIndex]);\n\n const evolve = () => {\n if (!optimizerRef.current) return;\n if (evolutionMethod !== EvolutionMethod.GENETIC_ALGORITHM) return;\n if (runEvolution && !pauseRef.current) {\n if (convergedRef.current || optimizerRef.current.outsideGenerationCounter >= params.maximumGenerations) {\n cancelAnimationFrame(requestRef.current);\n evolutionCompletedRef.current = true;\n optimizerRef.current.applyFittest();\n updateResults();\n runCallback(true);\n showInfo(\n i18n.t('message.EvolutionCompleted', lang) +\n '\\n' +\n (convergedRef.current\n ? i18n.t('message.ConvergenceThresholdHasBeenReached', lang)\n : i18n.t('message.MaximumNumberOfGenerationsHasBeenReached', lang)),\n );\n if (loggable && optimizerRef.current) {\n const best = optimizerRef.current.population.getFittest();\n if (best) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Genetic Algorithm for Solar Panel Tilt Angle Completed',\n result: SolarPanelTiltAngleOptimizerGa.individualToString(best),\n steps: optimizerRef.current?.outsideGenerationCounter,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n return;\n }\n optimizerRef.current.translateIndividual(individualIndexRef.current % params.populationSize);\n runCallback(false);\n }\n };\n\n const runCallback = (lastStep: boolean) => {\n usePrimitiveStore.setState((state) => {\n if (solarPanelsRef.current) {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = true;\n } else {\n state.runDailySimulationForSolarPanels = true;\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = true;\n } else {\n state.runYearlySimulationForSolarPanels = true;\n }\n break;\n default:\n showError(i18n.t('message.ObjectiveFunctionTypeError', lang), 60);\n }\n }\n });\n setCommonStore((state) => {\n if (solarPanelsRef.current) {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n break;\n default:\n showError(i18n.t('message.ObjectiveFunctionTypeError', lang), 60);\n }\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel) {\n const panel = e as SolarPanelModel;\n for (const sp of solarPanelsRef.current) {\n if (panel.id === sp.id) {\n panel.tiltAngle = sp.tiltAngle;\n break;\n }\n }\n }\n }\n }\n });\n if (lastStep) {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = false;\n state.evolutionInProgress = false;\n state.objectiveEvaluationIndex = 0;\n });\n }\n };\n\n const updateResults = () => {\n if (!optimizerRef.current) return;\n const results: DatumEntry[] = [];\n for (let index = 0; index < optimizerRef.current.fittestOfGenerations.length; index++) {\n const datum: DatumEntry = {};\n // the first fittest starts from index 1 because index 0 is used for the initial state\n const fg = optimizerRef.current.fittestOfGenerations[index];\n if (fg) {\n const n = fg.chromosome.length;\n datum['Step'] = index;\n for (let k = 0; k < n; k++) {\n let key = 'Var' + (k + 1);\n if (geneLabels[k]) {\n const trimmed = geneLabels[k]?.trim();\n if (trimmed && trimmed !== '') key = trimmed;\n }\n datum[key] = Util.toDegrees((2 * fg.chromosome[k] - 1) * HALF_PI);\n }\n datum['Objective'] = fg.fitness;\n // the first generation of population starts from index 0\n if (index > 0) {\n const pg = optimizerRef.current.populationOfGenerations[index - 1];\n if (pg) {\n let counter = 0;\n for (let i = 0; i < pg.individuals.length; i++) {\n const n = pg.individuals[i].chromosome.length;\n for (let k = 0; k < n; k++) {\n const key = 'Individual' + ++counter;\n datum[key] = Util.toDegrees((2 * pg.individuals[i].chromosome[k] - 1) * HALF_PI);\n }\n }\n }\n }\n }\n if (Object.keys(datum).length > 0) {\n results.push(datum);\n }\n }\n setFittestIndividualResults(results);\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelTiltAngleGa);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n *\n * The chromosome of an individual solar panel array has three genes:\n * tilt angle (a), inter-row spacing (d), panel row number on rack (r)\n *\n */\n\nimport { OptimizerGa } from './OptimizerGa';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { Individual } from './Individual';\nimport {\n GeneticAlgorithmSelectionMethod,\n ObjectiveFunctionType,\n Orientation,\n RowAxis,\n SearchMethod,\n} from '../../../types';\nimport { HALF_PI } from '../../../constants';\nimport { Util } from '../../../Util';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { PvModel } from '../../../models/PvModel';\nimport { Rectangle } from '../../../models/Rectangle';\nimport { SolarPanelLayoutRelative } from '../../../pd/SolarPanelLayoutRelative';\nimport { SolarPanelArrayLayoutParams } from '../../../stores/SolarPanelArrayLayoutParams';\n\nexport class SolarPanelArrayOptimizerGa extends OptimizerGa {\n polygon: PolygonModel;\n pvModel: PvModel;\n orientation: Orientation = Orientation.landscape;\n rowAxis: RowAxis = RowAxis.leftRight;\n poleHeight: number = 2;\n poleSpacing: number = 5;\n bounds?: Rectangle;\n solarPanelCount: number = 0;\n solarRackCount: number = 0;\n\n // allowable ranges for genes (tilt angle from -90° to 90°)\n minimumInterRowSpacing: number = 2; // in meters\n maximumInterRowSpacing: number = 10; // in meters\n minimumRowsPerRack: number = 1;\n maximumRowsPerRack: number = 6;\n minimumTiltAngle: number = -HALF_PI;\n maximumTiltAngle: number = HALF_PI;\n margin: number = 0;\n\n constructor(\n pvModel: PvModel,\n rowAxis: RowAxis,\n orientation: Orientation,\n poleHeight: number,\n poleSpacing: number,\n initialSolarPanels: SolarPanelModel[],\n initialLayoutParams: SolarPanelArrayLayoutParams,\n polygon: PolygonModel,\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n populationSize: number,\n maximumGenerations: number,\n selectionMethod: GeneticAlgorithmSelectionMethod,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n minimumInterRowSpacing: number,\n maximumInterRowSpacing: number,\n minimumRowsPerRack: number,\n maximumRowsPerRack: number,\n minimumTiltAngle: number,\n maximumTiltAngle: number,\n margin: number,\n ) {\n super(\n foundation,\n objectiveFunctionType,\n populationSize,\n maximumGenerations,\n 3,\n selectionMethod,\n convergenceThreshold,\n searchMethod,\n localSearchRadius,\n );\n this.polygon = polygon;\n this.pvModel = pvModel;\n this.rowAxis = rowAxis;\n this.orientation = orientation;\n this.poleHeight = poleHeight;\n this.poleSpacing = poleSpacing;\n this.minimumInterRowSpacing = minimumInterRowSpacing;\n this.maximumInterRowSpacing = maximumInterRowSpacing;\n this.minimumRowsPerRack = minimumRowsPerRack;\n this.maximumRowsPerRack = maximumRowsPerRack;\n this.minimumTiltAngle = minimumTiltAngle;\n this.maximumTiltAngle = maximumTiltAngle;\n this.margin = margin;\n this.setInterRowSpacingBounds();\n this.geneNames[0] = 'Tilt Angle';\n this.geneNames[1] = 'Inter-Row Spacing';\n this.geneNames[2] = 'Rack Width';\n // set the firstborn to be the current design, if any\n if (initialSolarPanels && initialSolarPanels.length > 0) {\n const sp1 = initialSolarPanels[0];\n\n if (initialSolarPanels.length > 1) {\n const firstBorn: Individual = this.population.individuals[0];\n // calculate the genes of the initial solar panels\n let gene1 =\n this.maximumTiltAngle === this.minimumTiltAngle\n ? 0\n : (sp1.tiltAngle - this.minimumTiltAngle) / (this.maximumTiltAngle - this.minimumTiltAngle);\n firstBorn.setGene(0, gene1);\n\n const sp2 = initialSolarPanels[1];\n const interRowSpacing = initialLayoutParams\n ? initialLayoutParams.interRowSpacing\n : this.rowAxis === RowAxis.upDown\n ? Math.abs(sp1.cx - sp2.cx) * this.foundation.lx\n : Math.abs(sp1.cy - sp2.cy) * this.foundation.ly;\n let gene2 =\n this.maximumInterRowSpacing === this.minimumInterRowSpacing\n ? 0\n : (interRowSpacing - this.minimumInterRowSpacing) /\n (this.maximumInterRowSpacing - this.minimumInterRowSpacing);\n if (gene2 < 0) gene2 = 0;\n else if (gene2 > 1) gene2 = 1;\n firstBorn.setGene(1, gene2);\n\n const rowsPerRack = initialLayoutParams\n ? initialLayoutParams.rowsPerRack\n : Math.max(\n 1,\n Math.round(sp1.ly / (sp1.orientation === Orientation.portrait ? pvModel.length : pvModel.width)),\n );\n let gene3 =\n this.maximumRowsPerRack === this.minimumRowsPerRack\n ? 0\n : (rowsPerRack - this.minimumRowsPerRack) / (this.maximumRowsPerRack - this.minimumRowsPerRack);\n if (gene3 < 0) gene3 = 0;\n else if (gene3 > 1) gene3 = 1;\n firstBorn.setGene(2, gene3);\n }\n }\n }\n\n private setInterRowSpacingBounds() {\n this.bounds = Util.calculatePolygonBounds(this.polygon.vertices);\n }\n\n applyFittest(): void {\n const best: Individual | undefined = this.population.getFittest();\n if (best) {\n console.log(\n 'Fittest: ' +\n this.individualToString(best) +\n ', rack count: ' +\n this.solarRackCount +\n ', panel count: ' +\n this.solarPanelCount,\n );\n }\n }\n\n private getObjectiveUnit(): string | null {\n switch (this.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n return 'kWh';\n case ObjectiveFunctionType.YEARLY_PROFIT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n return 'dollars';\n }\n return null;\n }\n\n individualToString(individual: Individual): string {\n let s =\n 'F(' +\n Util.toDegrees(\n individual.getGene(0) * (this.maximumTiltAngle - this.minimumTiltAngle) + this.minimumTiltAngle,\n ).toFixed(3) +\n '°, ';\n s +=\n (\n individual.getGene(1) * (this.maximumInterRowSpacing - this.minimumInterRowSpacing) +\n this.minimumInterRowSpacing\n ).toFixed(3) + 'm, ';\n s +=\n Math.floor(\n individual.getGene(2) * (this.maximumRowsPerRack - this.minimumRowsPerRack) + this.minimumRowsPerRack,\n ) + ')';\n return s + ' = ' + individual.fitness.toFixed(5) + ' ' + this.getObjectiveUnit();\n }\n\n startEvolving(): void {\n this.outsideGenerationCounter = 0;\n this.computeCounter = 0;\n this.fittestOfGenerations.fill(null);\n this.setInterRowSpacingBounds();\n }\n\n translateIndividualByIndex(indexOfIndividual: number): SolarPanelModel[] {\n return this.translateIndividual(this.population.individuals[indexOfIndividual]);\n }\n\n translateBest(): SolarPanelModel[] {\n const best: Individual | undefined = this.population.getFittest();\n if (best) {\n return this.translateIndividual(best);\n }\n return [];\n }\n\n // translate gene to structure for the specified individual\n private translateIndividual(individual: Individual): SolarPanelModel[] {\n if (!this.bounds) return [];\n const tiltAngle = individual.getGene(0) * (this.maximumTiltAngle - this.minimumTiltAngle) + this.minimumTiltAngle;\n const interRowSpacing =\n individual.getGene(1) * (this.maximumInterRowSpacing - this.minimumInterRowSpacing) + this.minimumInterRowSpacing;\n const rowsPerRack = Math.floor(\n individual.getGene(2) * (this.maximumRowsPerRack - this.minimumRowsPerRack) + this.minimumRowsPerRack,\n );\n const solarPanels = SolarPanelLayoutRelative.create(\n this.polygon,\n this.foundation,\n this.pvModel,\n this.orientation,\n tiltAngle,\n rowsPerRack,\n interRowSpacing,\n this.rowAxis,\n this.poleHeight,\n this.poleSpacing,\n this.margin,\n );\n this.solarPanelCount = 0;\n this.solarRackCount = solarPanels.length;\n if (solarPanels.length > 0) {\n for (const sp of solarPanels) {\n this.solarPanelCount += Util.countSolarPanelsOnRack(sp, this.pvModel);\n }\n }\n return solarPanels;\n }\n\n evolveIndividual(indexOfIndividual: number, fitness: number): boolean {\n const populationSize = this.population.individuals.length;\n if (!this.converged) {\n const individual: Individual = this.population.individuals[indexOfIndividual];\n individual.fitness = fitness;\n // the first individual of the first generation is used as a baseline\n // (imagine it as the fittest of the zeroth generation)\n if (this.computeCounter === 0 && indexOfIndividual === 0) {\n this.fittestOfGenerations[0] = individual.getCopy();\n }\n const generation = Math.floor(this.computeCounter / populationSize);\n console.log(\n 'Generation ' +\n (generation + 1) +\n ', individual ' +\n indexOfIndividual +\n ' : ' +\n this.individualToString(individual) +\n ', rack count: ' +\n this.solarRackCount +\n ', panel count: ' +\n this.solarPanelCount,\n );\n const savedIndividual = this.populationOfGenerations[generation]?.individuals[indexOfIndividual];\n if (savedIndividual) {\n for (let k = 0; k < individual.chromosome.length; k++) {\n savedIndividual.chromosome[k] = individual.chromosome[k];\n }\n savedIndividual.fitness = individual.fitness;\n }\n const isAtTheEndOfGeneration = this.computeCounter % populationSize === populationSize - 1;\n if (isAtTheEndOfGeneration) {\n this.population.saveGenes();\n this.population.evolve(this.selectionRate, this.crossoverRate);\n const best = this.population.getFittest();\n if (best) {\n this.fittestOfGenerations[generation + 1] = best.getCopy();\n }\n if (this.detectViolations()) {\n this.population.restoreGenes();\n } else {\n this.converged = this.population.isNominallyConverged(this.convergenceThreshold);\n if (!this.converged && this.searchMethod === SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION) {\n this.population.mutate(this.mutationRate);\n }\n }\n }\n this.computeCounter++;\n }\n return this.converged;\n }\n\n // if anyone in the current population doesn't meet the constraints, the entire population dies\n // and the algorithm reverts to the previous generation -- not efficient\n detectViolations(): boolean {\n return false; // TODO\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from '../../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { showInfo } from '../../helpers';\nimport i18n from '../../i18n/i18n';\nimport {\n DatumEntry,\n DesignProblem,\n EvolutionMethod,\n ObjectiveFunctionType,\n ObjectType,\n Orientation,\n RowAxis,\n} from '../../types';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { FoundationModel } from '../../models/FoundationModel';\nimport { PolygonModel } from '../../models/PolygonModel';\nimport { SolarPanelArrayOptimizerGa } from './algorithm/SolarPanelArrayOptimizerGa';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nconst SolarPanelArrayGa = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pauseEvolution = usePrimitiveStore(Selector.pauseEvolution);\n const getParent = useStore(Selector.getParent);\n const polygon = useStore(Selector.selectedElement) as PolygonModel;\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const setFittestIndividualResults = useStore(Selector.setFittestIndividualResults);\n const objectiveEvaluationIndex = usePrimitiveStore(Selector.objectiveEvaluationIndex);\n const geneLabels = useStore(Selector.variableLabels);\n const setGeneLabels = useStore(Selector.setVariableLabels);\n const getPvModule = useStore(Selector.getPvModule);\n const removeElementsByReferenceId = useStore(Selector.removeElementsByReferenceId);\n const params = useStore(Selector.evolutionaryAlgorithmState).geneticAlgorithmParams;\n const constraints = useStore.getState().solarPanelArrayLayoutConstraints;\n const economics = useStore.getState().economicsParams;\n const currentLayoutParams = useStore.getState().solarPanelArrayLayoutParams;\n\n const requestRef = useRef(0);\n const evolutionCompletedRef = useRef(false);\n const pauseRef = useRef(false);\n const optimizerRef = useRef();\n const individualIndexRef = useRef(0);\n const convergedRef = useRef(false);\n const solarPanelArrayRef = useRef([]);\n const initialSolarPanelArrayRef = useRef([]);\n\n const lang = { lng: language };\n const foundation = polygon ? (getParent(polygon) as FoundationModel) : undefined;\n\n useEffect(() => {\n if (evolutionMethod !== EvolutionMethod.GENETIC_ALGORITHM) return;\n if (params.problem !== DesignProblem.SOLAR_PANEL_ARRAY) return;\n if (runEvolution) {\n init();\n requestRef.current = requestAnimationFrame(evolve);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!evolutionCompletedRef.current) {\n showInfo(i18n.t('message.EvolutionAborted', lang));\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = false;\n state.runDailySimulationForSolarPanels = false;\n state.runYearlySimulationForSolarPanels = false;\n });\n // this may put the function call to the last in the event queue to avoid crash in ray cast\n setTimeout(() => {\n // revert to the initial solar panel array\n if (solarPanelArrayRef.current.length > 0) {\n removeElementsByReferenceId(polygon.id, false);\n }\n if (initialSolarPanelArrayRef.current.length > 0) {\n solarPanelArrayRef.current = [...initialSolarPanelArrayRef.current];\n runCallback(true);\n }\n }, 100);\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runEvolution]);\n\n useEffect(() => {\n pauseRef.current = pauseEvolution;\n if (pauseEvolution) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = true;\n });\n showInfo(i18n.t('message.EvolutionPaused', lang));\n } else {\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = false;\n });\n // continue the evolution\n evolve();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pauseEvolution]);\n\n // getting ready for the evolution\n const init = () => {\n if (!polygon || !foundation) return;\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = true;\n state.objectiveEvaluationIndex = 0;\n });\n evolutionCompletedRef.current = false;\n const originalSolarPanels = getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[];\n // store a copy of the initial solar panels for possible reversion\n initialSolarPanelArrayRef.current.length = 0;\n for (const osp of originalSolarPanels) {\n initialSolarPanelArrayRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n }\n optimizerRef.current = new SolarPanelArrayOptimizerGa(\n getPvModule(constraints.pvModelName ?? 'CS6X-355P-FG'),\n constraints.rowAxis ?? RowAxis.leftRight,\n constraints.orientation ?? Orientation.landscape,\n constraints.poleHeight ?? 1,\n constraints.poleSpacing ?? 3,\n initialSolarPanelArrayRef.current,\n currentLayoutParams,\n polygon,\n foundation,\n params.objectiveFunctionType,\n params.populationSize,\n params.maximumGenerations,\n params.selectionMethod,\n params.convergenceThreshold,\n params.searchMethod,\n params.localSearchRadius,\n constraints.minimumInterRowSpacing,\n constraints.maximumInterRowSpacing,\n constraints.minimumRowsPerRack,\n constraints.maximumRowsPerRack,\n constraints.minimumTiltAngle,\n constraints.maximumTiltAngle,\n constraints.margin ?? 0,\n );\n optimizerRef.current.selectionRate = params.selectionRate;\n optimizerRef.current.crossoverRate = params.crossoverRate;\n optimizerRef.current.mutationRate = params.mutationRate;\n individualIndexRef.current = 0;\n convergedRef.current = false;\n setGeneLabels([...optimizerRef.current.geneNames]);\n optimizerRef.current.startEvolving();\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = true;\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n };\n\n const getTotal = (): number => {\n let total = 0;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n const dailyPvYield = useDataStore.getState().dailyPvYield;\n for (const datum of dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n const yearlyPvYield = useDataStore.getState().yearlyPvYield;\n for (const datum of yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n total *= 12 / daysPerYear;\n break;\n }\n const count = optimizerRef.current?.solarPanelCount;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n if (count) total /= count;\n break;\n case ObjectiveFunctionType.DAILY_PROFIT:\n total = total * economics.electricitySellingPrice;\n if (count) total -= count * economics.operationalCostPerUnit;\n break;\n case ObjectiveFunctionType.YEARLY_PROFIT:\n total = total * economics.electricitySellingPrice;\n if (count) total -= count * economics.operationalCostPerUnit * 365;\n break;\n }\n return total;\n };\n\n // the increment of objectiveEvaluationIndex is used as a trigger to request the next animation frame\n useEffect(() => {\n if (!optimizerRef.current || !objectiveEvaluationIndex) return;\n // the number of individuals to evaluate is less than or equal to maximumGenerations * populationSize,\n // subject to the convergence criterion\n convergedRef.current = optimizerRef.current.evolveIndividual(\n individualIndexRef.current % params.populationSize,\n getTotal(),\n );\n updateResults();\n individualIndexRef.current++;\n optimizerRef.current.outsideGenerationCounter = Math.floor(individualIndexRef.current / params.populationSize);\n // recursive call to the next step of the evolution, which is to evaluate the next individual\n requestRef.current = requestAnimationFrame(evolve);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objectiveEvaluationIndex]);\n\n const evolve = () => {\n if (!optimizerRef.current) return;\n if (evolutionMethod !== EvolutionMethod.GENETIC_ALGORITHM) return;\n if (runEvolution && !pauseRef.current) {\n if (convergedRef.current || optimizerRef.current.outsideGenerationCounter >= params.maximumGenerations) {\n cancelAnimationFrame(requestRef.current);\n evolutionCompletedRef.current = true;\n if (solarPanelArrayRef.current.length > 0) {\n removeElementsByReferenceId(polygon.id, false);\n }\n solarPanelArrayRef.current = optimizerRef.current.translateBest();\n optimizerRef.current.applyFittest();\n updateResults();\n runCallback(true);\n showInfo(\n i18n.t('message.EvolutionCompleted', lang) +\n '\\n' +\n (convergedRef.current\n ? i18n.t('message.ConvergenceThresholdHasBeenReached', lang)\n : i18n.t('message.MaximumNumberOfGenerationsHasBeenReached', lang)),\n );\n if (optimizerRef.current) {\n const best = optimizerRef.current.population.getFittest();\n if (best) {\n const tiltAngle =\n best.getGene(0) * (constraints.maximumTiltAngle - constraints.minimumTiltAngle) +\n constraints.minimumTiltAngle;\n const interRowSpacing =\n best.getGene(1) * (constraints.maximumInterRowSpacing - constraints.minimumInterRowSpacing) +\n constraints.minimumInterRowSpacing;\n const rowsPerRack = Math.floor(\n best.getGene(2) * (constraints.maximumRowsPerRack - constraints.minimumRowsPerRack) +\n constraints.minimumRowsPerRack,\n );\n setCommonStore((state) => {\n state.solarPanelArrayLayoutParams.tiltAngle = tiltAngle;\n state.solarPanelArrayLayoutParams.interRowSpacing = interRowSpacing;\n state.solarPanelArrayLayoutParams.rowsPerRack = rowsPerRack;\n state.solarPanelArrayLayoutParams.orientation = constraints.orientation;\n state.solarPanelArrayLayoutParams.poleHeight = constraints.poleHeight;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Genetic Algorithm for Solar Panel Array Layout Completed',\n result: optimizerRef.current?.individualToString(best),\n steps: optimizerRef.current?.outsideGenerationCounter,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n }\n return;\n }\n removeElementsByReferenceId(polygon.id, false);\n // this may put the function call to the last in the event queue to avoid crash in ray cast\n // when switching the optimization method\n setTimeout(() => {\n if (optimizerRef.current) {\n solarPanelArrayRef.current = optimizerRef.current.translateIndividualByIndex(\n individualIndexRef.current % params.populationSize,\n );\n }\n runCallback(false);\n }, 100);\n }\n };\n\n const runCallback = (lastStep: boolean) => {\n usePrimitiveStore.setState((state) => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = true;\n } else {\n state.runDailySimulationForSolarPanels = true;\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = true;\n } else {\n state.runYearlySimulationForSolarPanels = true;\n }\n break;\n }\n });\n setCommonStore((state) => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n break;\n }\n state.elements.push(...solarPanelArrayRef.current);\n });\n if (lastStep) {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = false;\n state.evolutionInProgress = false;\n state.objectiveEvaluationIndex = 0;\n });\n }\n };\n\n const updateResults = () => {\n if (!optimizerRef.current) return;\n const results: DatumEntry[] = [];\n for (let index = 0; index < optimizerRef.current.fittestOfGenerations.length; index++) {\n const datum: DatumEntry = {};\n // the first fittest starts from index 1 because index 0 is used for the initial state\n const fg = optimizerRef.current.fittestOfGenerations[index];\n if (fg) {\n const n = fg.chromosome.length;\n datum['Step'] = index;\n for (let k = 0; k < n; k++) {\n datum[geneLabels[k] ?? 'Var' + (k + 1)] = fg.chromosome[k];\n }\n datum['Objective'] = fg.fitness;\n // the first generation of population starts from index 0\n if (index > 0) {\n const pg = optimizerRef.current.populationOfGenerations[index - 1];\n if (pg) {\n let counter = 0;\n for (let i = 0; i < pg.individuals.length; i++) {\n const n = pg.individuals[i].chromosome.length;\n for (let k = 0; k < n; k++) {\n datum['Individual' + ++counter] = pg.individuals[i].chromosome[k];\n }\n }\n }\n }\n }\n if (Object.keys(datum).length > 0) {\n results.push(datum);\n }\n }\n setFittestIndividualResults(results);\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelArrayGa);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Random } from '../../../Random';\n\nexport class Particle {\n position: number[]; // normalized to [0, 1)\n velocity: number[];\n\n // store the fitness value evaluated by the objective function (NaN means not evaluated yet)\n fitness: number = Number.NaN;\n\n // the position that results in the best ever fitness of this particle\n bestPositionOfParticle: number[];\n\n // construct a particle with a random position within [0, 1) and\n // a random velocity within vmax as the variance of the normal distribution and zero as the average\n constructor(dimension: number, vmax?: number) {\n this.position = new Array();\n this.velocity = new Array();\n this.bestPositionOfParticle = new Array();\n for (let i = 0; i < dimension; i++) {\n const r = Math.random();\n this.position.push(r);\n this.bestPositionOfParticle.push(r);\n if (vmax) {\n this.velocity.push(Random.gaussian() * vmax);\n } else {\n this.velocity.push(0);\n }\n }\n }\n\n updateBestPosition() {\n for (let i = 0; i < this.bestPositionOfParticle.length; i++) {\n this.bestPositionOfParticle[i] = this.position[i];\n }\n }\n\n compare(p: Particle): number {\n if (isNaN(this.fitness) || isNaN(p.fitness)) throw new Error('Fitness cannot be NaN');\n if (this.fitness > p.fitness) return 1;\n if (this.fitness < p.fitness) return -1;\n return 0;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Particle } from './Particle';\n\nexport class Swarm {\n particles: Particle[];\n\n // the normalized position that results in the best ever fitness of this swarm\n bestPositionOfSwarm: number[];\n bestFitness: number = Number.NaN;\n\n constructor(size: number, dimension: number, vmax?: number) {\n this.particles = new Array();\n for (let i = 0; i < size; i++) {\n this.particles.push(new Particle(dimension, vmax));\n }\n this.bestPositionOfSwarm = new Array(dimension);\n }\n\n // sort the fitness in the descending order (sort b before a if b's fitness is higher than a's)\n sort(): void {\n this.particles.sort((a, b) => b.compare(a));\n if (Number.isNaN(this.bestFitness) || this.bestFitness < this.particles[0].fitness) {\n for (let i = 0; i < this.bestPositionOfSwarm.length; i++) {\n this.bestPositionOfSwarm[i] = this.particles[0].position[i];\n }\n this.bestFitness = this.particles[0].fitness;\n }\n }\n\n // check convergence bitwise (the so-called nominal convergence)\n isNominallyConverged(convergenceThreshold: number, top: number): boolean {\n if (top <= 0) throw new Error('top must be greater than 0');\n const n = this.particles[0].position.length;\n for (let i = 0; i < n; i++) {\n let average = 0;\n for (let j = 0; j < top; j++) {\n average += this.particles[j].position[i];\n }\n average /= top;\n for (let j = 0; j < top; j++) {\n if (Math.abs(this.particles[j].position[i] / average - 1.0) > convergenceThreshold) {\n return false;\n }\n }\n }\n return true;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { Swarm } from './Swarm';\nimport { ObjectiveFunctionType, SearchMethod } from '../../../types';\n\nexport abstract class OptimizerPso {\n swarm: Swarm;\n objectiveFunctionType: ObjectiveFunctionType;\n foundation: FoundationModel;\n stopped: boolean = true;\n inertia: number = 0.8;\n cognitiveCoefficient: number = 0.1;\n socialCoefficient: number = 0.1;\n maximumSteps: number = 5;\n bestPositionOfSteps: (number[] | null)[] = [];\n bestFitnessOfSteps: number[] = [];\n swarmOfSteps: (Swarm | null)[] = [];\n outsideStepCounter: number = 0;\n computeCounter: number = 0;\n convergenceThreshold: number = 0.1;\n converged: boolean = false;\n searchMethod: SearchMethod = SearchMethod.GLOBAL_SEARCH_UNIFORM_SELECTION;\n localSearchRadius: number = 0.1;\n\n protected constructor(\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n swarmSize: number,\n vmax: number,\n maximumSteps: number,\n particleDimension: number,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n ) {\n this.swarm = new Swarm(swarmSize, particleDimension, vmax);\n this.objectiveFunctionType = objectiveFunctionType;\n this.convergenceThreshold = convergenceThreshold;\n this.searchMethod = searchMethod;\n this.localSearchRadius = localSearchRadius;\n this.maximumSteps = maximumSteps;\n this.foundation = foundation;\n this.bestPositionOfSteps = new Array(this.maximumSteps + 1);\n this.bestPositionOfSteps.fill(null);\n this.bestFitnessOfSteps = new Array(this.maximumSteps + 1);\n this.bestFitnessOfSteps.fill(0);\n this.swarmOfSteps = new Array(this.maximumSteps);\n for (let i = 0; i < this.maximumSteps; i++) {\n this.swarmOfSteps[i] = new Swarm(swarmSize, particleDimension);\n }\n }\n\n moveSwarm() {\n for (const p of this.swarm.particles) {\n const n = p.position.length;\n for (let i = 0; i < n; i++) {\n p.velocity[i] =\n this.inertia * p.velocity[i] +\n this.cognitiveCoefficient * Math.random() * (p.bestPositionOfParticle[i] - p.position[i]) +\n this.socialCoefficient * Math.random() * (this.swarm.bestPositionOfSwarm[i] - p.position[i]);\n p.position[i] += p.velocity[i];\n }\n }\n }\n\n abstract applyFittest(): void;\n\n stop(): void {\n this.stopped = true;\n }\n\n shouldTerminate(): boolean {\n return this.outsideStepCounter >= this.maximumSteps;\n }\n}\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n *\n * A particle has the following properties\n *\n * solarPanel[0].tiltAngle, solarPanel[1].tiltAngle, ..., solarPanel[n].tiltAngle\n *\n */\n\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { HALF_PI } from '../../../constants';\nimport { Util } from '../../../Util';\nimport { Random } from '../../../Random';\nimport { OptimizerPso } from './OptimizerPso';\nimport { Particle } from './Particle';\nimport { ObjectiveFunctionType, SearchMethod } from '../../../types';\n\nexport class SolarPanelTiltAngleOptimizerPso extends OptimizerPso {\n solarPanels: SolarPanelModel[];\n\n constructor(\n solarPanels: SolarPanelModel[],\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n swarmSize: number,\n vmax: number,\n maximumSteps: number,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n ) {\n super(\n foundation,\n objectiveFunctionType,\n swarmSize,\n vmax,\n maximumSteps,\n solarPanels.length,\n convergenceThreshold,\n searchMethod,\n localSearchRadius,\n );\n this.solarPanels = solarPanels;\n // set the first particle to be the current design\n const firstParticle: Particle = this.swarm.particles[0];\n for (const [i, panel] of solarPanels.entries()) {\n const normalizedValue = 0.5 * (1.0 + panel.tiltAngle / HALF_PI);\n firstParticle.position[i] = normalizedValue;\n if (this.searchMethod === SearchMethod.LOCAL_SEARCH_RANDOM_OPTIMIZATION) {\n for (let k = 1; k < this.swarm.particles.length; k++) {\n const particle: Particle = this.swarm.particles[k];\n let v = Random.gaussian() * this.localSearchRadius + normalizedValue;\n while (v < 0 || v > 1) {\n v = Random.gaussian() * this.localSearchRadius + normalizedValue;\n }\n particle.position[i] = v;\n }\n }\n }\n }\n\n applyFittest(): void {\n const best = this.swarm.bestPositionOfSwarm;\n if (best) {\n for (let i = 0; i < best.length; i++) {\n this.solarPanels[i].tiltAngle = (2 * best[i] - 1) * HALF_PI;\n }\n console.log('Best: ' + SolarPanelTiltAngleOptimizerPso.particleToString(best, this.swarm.bestFitness));\n }\n }\n\n static particleToString(position: number[], bestFitness: number): string {\n let s = 'F(';\n for (let i = 0; i < position.length; i++) {\n s += Util.toDegrees((2 * position[i] - 1) * HALF_PI).toFixed(3) + '°, ';\n }\n return s.substring(0, s.length - 2) + ') = ' + bestFitness.toFixed(5) + ' kWh';\n }\n\n startEvolving(): void {\n this.outsideStepCounter = 0;\n this.computeCounter = 0;\n this.bestPositionOfSteps.fill(null);\n this.bestFitnessOfSteps.fill(0);\n }\n\n // translate position to structure for the specified particle\n translateParticle(indexOfParticle: number): void {\n const particle: Particle = this.swarm.particles[indexOfParticle];\n for (let i = 0; i < particle.position.length; i++) {\n const p = particle.position[i];\n this.solarPanels[i].tiltAngle = (2 * p - 1) * HALF_PI;\n }\n }\n\n updateParticle(indexOfParticle: number, fitness: number): boolean {\n const swarmSize = this.swarm.particles.length;\n if (!this.converged) {\n const particle: Particle = this.swarm.particles[indexOfParticle];\n if (fitness > particle.fitness) {\n particle.updateBestPosition();\n }\n particle.fitness = fitness;\n // the first particle at the first step is used as a baseline\n if (this.computeCounter === 0 && indexOfParticle === 0) {\n this.bestPositionOfSteps[0] = [...particle.position];\n this.bestFitnessOfSteps[0] = fitness;\n }\n const step = Math.floor(this.computeCounter / swarmSize);\n console.log(\n 'Step ' +\n (step + 1) +\n ', particle ' +\n indexOfParticle +\n ' : ' +\n SolarPanelTiltAngleOptimizerPso.particleToString(particle.position, fitness),\n );\n const savedParticle = this.swarmOfSteps[step]?.particles[indexOfParticle];\n if (savedParticle) {\n for (let k = 0; k < particle.position.length; k++) {\n savedParticle.position[k] = particle.position[k];\n }\n savedParticle.fitness = particle.fitness;\n }\n const isAtTheEndOfStep = this.computeCounter % swarmSize === swarmSize - 1;\n if (isAtTheEndOfStep) {\n this.swarm.sort();\n const best = this.swarm.bestPositionOfSwarm;\n if (best) {\n this.bestPositionOfSteps[step + 1] = [...best];\n this.bestFitnessOfSteps[step + 1] = this.swarm.bestFitness;\n }\n this.converged = this.swarm.isNominallyConverged(\n this.convergenceThreshold,\n Math.max(2, this.swarm.particles.length / 4),\n );\n this.moveSwarm();\n }\n this.computeCounter++;\n }\n return this.converged;\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from '../../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { showError, showInfo } from '../../helpers';\nimport i18n from '../../i18n/i18n';\nimport { DatumEntry, DesignProblem, EvolutionMethod, ObjectiveFunctionType, ObjectType } from '../../types';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { FoundationModel } from '../../models/FoundationModel';\nimport { HALF_PI } from '../../constants';\nimport { Util } from '../../Util';\nimport { SolarPanelTiltAngleOptimizerPso } from './algorithm/SolarPanelTiltAngleOptimizerPso';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nconst SolarPanelTiltAnglePso = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pauseEvolution = usePrimitiveStore(Selector.pauseEvolution);\n const foundation = useStore(Selector.selectedElement) as FoundationModel;\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const setFittestParticleResults = useStore(Selector.setFittestIndividualResults);\n const objectiveEvaluationIndex = usePrimitiveStore(Selector.objectiveEvaluationIndex);\n const particleLabels = useStore(Selector.variableLabels);\n const setParticleLabels = useStore(Selector.setVariableLabels);\n const params = useStore(Selector.evolutionaryAlgorithmState).particleSwarmOptimizationParams;\n\n const lang = { lng: language };\n const requestRef = useRef(0);\n const evolutionCompletedRef = useRef(false);\n const pauseRef = useRef(false);\n const solarPanelsRef = useRef();\n const optimizerRef = useRef();\n const particleIndexRef = useRef(0);\n const convergedRef = useRef(false);\n const initialSolarPanelsRef = useRef([]);\n\n useEffect(() => {\n if (params.problem !== DesignProblem.SOLAR_PANEL_TILT_ANGLE) return;\n if (evolutionMethod !== EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) return;\n if (runEvolution) {\n init();\n requestRef.current = requestAnimationFrame(evolve);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!evolutionCompletedRef.current) {\n showInfo(i18n.t('message.EvolutionAborted', lang));\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = false;\n });\n // revert to the initial solar panels\n if (initialSolarPanelsRef.current.length > 0) {\n solarPanelsRef.current = [...initialSolarPanelsRef.current];\n runCallback(true);\n }\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runEvolution]);\n\n useEffect(() => {\n pauseRef.current = pauseEvolution;\n if (pauseEvolution) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = true;\n });\n showInfo(i18n.t('message.EvolutionPaused', lang));\n } else {\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = false;\n });\n // continue the evolution\n evolve();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pauseEvolution]);\n\n // getting ready for the evolution\n const init = () => {\n if (!foundation) return;\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = true;\n state.objectiveEvaluationIndex = 0;\n });\n evolutionCompletedRef.current = false;\n const originalSolarPanels = getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[];\n // store a copy of the initial solar panels for possible reversion\n initialSolarPanelsRef.current.length = 0;\n for (const osp of originalSolarPanels) {\n initialSolarPanelsRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n }\n solarPanelsRef.current = [];\n const labels: (string | undefined)[] = [];\n for (const osp of originalSolarPanels) {\n solarPanelsRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n labels.push(osp.label);\n }\n if (solarPanelsRef.current.length > 0) {\n optimizerRef.current = new SolarPanelTiltAngleOptimizerPso(\n solarPanelsRef.current,\n foundation,\n params.objectiveFunctionType,\n params.swarmSize,\n params.vmax,\n params.maximumSteps,\n params.convergenceThreshold,\n params.searchMethod,\n params.localSearchRadius,\n );\n optimizerRef.current.inertia = params.inertia;\n optimizerRef.current.cognitiveCoefficient = params.cognitiveCoefficient;\n optimizerRef.current.socialCoefficient = params.socialCoefficient;\n particleIndexRef.current = 0;\n convergedRef.current = false;\n setParticleLabels(labels);\n optimizerRef.current.startEvolving();\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = true;\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n } else {\n showError(i18n.t('message.EncounterEvolutionError', lang));\n }\n };\n\n const getTotal = (): number => {\n let total = 0;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n const dailyPvYield = useDataStore.getState().dailyPvYield;\n for (const datum of dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n const yearlyPvYield = useDataStore.getState().yearlyPvYield;\n for (const datum of yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n total *= 12 / daysPerYear;\n break;\n }\n return total;\n };\n\n // the increment of objectiveEvaluationIndex is used as a trigger to request the next animation frame\n useEffect(() => {\n if (!optimizerRef.current || !objectiveEvaluationIndex) return;\n // the number of particles to evaluate is less than or equal to maximumSteps * swarmSize,\n // subject to the convergence criterion\n convergedRef.current = optimizerRef.current.updateParticle(particleIndexRef.current % params.swarmSize, getTotal());\n updateResults();\n particleIndexRef.current++;\n optimizerRef.current.outsideStepCounter = Math.floor(particleIndexRef.current / params.swarmSize);\n // recursive call to the next step of the evolution, which is to evaluate the next particle\n requestRef.current = requestAnimationFrame(evolve);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objectiveEvaluationIndex]);\n\n const evolve = () => {\n if (!optimizerRef.current) return;\n if (evolutionMethod !== EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) return;\n if (runEvolution && !pauseRef.current) {\n if (convergedRef.current || optimizerRef.current.outsideStepCounter >= params.maximumSteps) {\n cancelAnimationFrame(requestRef.current);\n evolutionCompletedRef.current = true;\n optimizerRef.current.applyFittest();\n updateResults();\n runCallback(true);\n showInfo(\n i18n.t('message.EvolutionCompleted', lang) +\n '\\n' +\n (convergedRef.current\n ? i18n.t('message.ConvergenceThresholdHasBeenReached', lang)\n : i18n.t('message.MaximumNumberOfStepsHasBeenReached', lang)),\n );\n if (loggable && optimizerRef.current) {\n const bestPosition = optimizerRef.current.swarm.bestPositionOfSwarm;\n const fitness = optimizerRef.current.swarm.bestFitness;\n if (bestPosition && fitness) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Particle Swarm Optimization for Solar Panel Tilt Angle Completed',\n result: SolarPanelTiltAngleOptimizerPso.particleToString(bestPosition, fitness),\n steps: optimizerRef.current?.outsideStepCounter,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n return;\n }\n optimizerRef.current.translateParticle(particleIndexRef.current % params.swarmSize);\n runCallback(false);\n }\n };\n\n const runCallback = (lastStep: boolean) => {\n usePrimitiveStore.setState((state) => {\n if (solarPanelsRef.current) {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = true;\n } else {\n state.runDailySimulationForSolarPanels = true;\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = true;\n } else {\n state.runYearlySimulationForSolarPanels = true;\n }\n break;\n }\n }\n });\n setCommonStore((state) => {\n if (solarPanelsRef.current) {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n break;\n }\n for (const e of state.elements) {\n if (e.type === ObjectType.SolarPanel) {\n const panel = e as SolarPanelModel;\n for (const sp of solarPanelsRef.current) {\n if (panel.id === sp.id) {\n panel.tiltAngle = sp.tiltAngle;\n break;\n }\n }\n }\n }\n }\n });\n if (lastStep) {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = false;\n state.evolutionInProgress = false;\n state.objectiveEvaluationIndex = 0;\n });\n }\n };\n\n const updateResults = () => {\n if (!optimizerRef.current) return;\n const results: DatumEntry[] = [];\n for (let index = 0; index < optimizerRef.current.bestPositionOfSteps.length; index++) {\n const datum: DatumEntry = {};\n // the first fittest starts from index 1 because index 0 is used for the initial state\n const ps = optimizerRef.current.bestPositionOfSteps[index];\n if (ps) {\n const n = ps.length;\n datum['Step'] = index;\n for (let k = 0; k < n; k++) {\n let key = 'Var' + (k + 1);\n if (particleLabels[k]) {\n const trimmed = particleLabels[k]?.trim();\n if (trimmed && trimmed !== '') key = trimmed;\n }\n datum[key] = Util.toDegrees((2 * ps[k] - 1) * HALF_PI);\n }\n datum['Objective'] = optimizerRef.current.bestFitnessOfSteps[index];\n // the first step of the swarm starts from index 0\n if (index > 0) {\n const ss = optimizerRef.current.swarmOfSteps[index - 1];\n if (ss) {\n let counter = 0;\n for (let i = 0; i < ss.particles.length; i++) {\n const n = ss.particles[i].position.length;\n for (let k = 0; k < n; k++) {\n const key = 'Individual' + ++counter;\n datum[key] = Util.toDegrees((2 * ss.particles[i].position[k] - 1) * HALF_PI);\n }\n }\n }\n }\n }\n if (Object.keys(datum).length > 0) {\n results.push(datum);\n }\n }\n setFittestParticleResults(results);\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelTiltAnglePso);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n *\n * The chromosome of an individual solar panel array has three genes:\n * tilt angle (a), inter-row spacing (d), panel row number on rack (r)\n *\n */\n\nimport { OptimizerPso } from './OptimizerPso';\nimport { FoundationModel } from '../../../models/FoundationModel';\nimport { ObjectiveFunctionType, Orientation, RowAxis, SearchMethod } from '../../../types';\nimport { HALF_PI } from '../../../constants';\nimport { Util } from '../../../Util';\nimport { PolygonModel } from '../../../models/PolygonModel';\nimport { SolarPanelModel } from '../../../models/SolarPanelModel';\nimport { PvModel } from '../../../models/PvModel';\nimport { Rectangle } from '../../../models/Rectangle';\nimport { Particle } from './Particle';\nimport { SolarPanelLayoutRelative } from '../../../pd/SolarPanelLayoutRelative';\nimport { SolarPanelArrayLayoutParams } from '../../../stores/SolarPanelArrayLayoutParams';\n\nexport class SolarPanelArrayOptimizerPso extends OptimizerPso {\n polygon: PolygonModel;\n pvModel: PvModel;\n orientation: Orientation = Orientation.landscape;\n rowAxis: RowAxis = RowAxis.leftRight;\n relativeMargin: number = 0.01;\n poleHeight: number = 2;\n poleSpacing: number = 5;\n bounds?: Rectangle;\n solarPanelCount: number = 0;\n solarRackCount: number = 0;\n\n // allowable ranges for genes (tilt angle from -90° to 90°)\n minimumInterRowSpacing: number = 2; // in meters\n maximumInterRowSpacing: number = 10; // in meters\n minimumRowsPerRack: number = 1;\n maximumRowsPerRack: number = 6;\n minimumTiltAngle: number = -HALF_PI;\n maximumTiltAngle: number = HALF_PI;\n margin: number = 0;\n\n constructor(\n pvModel: PvModel,\n rowAxis: RowAxis,\n orientation: Orientation,\n poleHeight: number,\n poleSpacing: number,\n initialSolarPanels: SolarPanelModel[],\n initialLayoutParams: SolarPanelArrayLayoutParams,\n polygon: PolygonModel,\n foundation: FoundationModel,\n objectiveFunctionType: ObjectiveFunctionType,\n swarmSize: number,\n vmax: number,\n maximumSteps: number,\n convergenceThreshold: number,\n searchMethod: SearchMethod,\n localSearchRadius: number,\n minimumInterRowSpacing: number,\n maximumInterRowSpacing: number,\n minimumRowsPerRack: number,\n maximumRowsPerRack: number,\n minimumTiltAngle: number,\n maximumTiltAngle: number,\n margin: number,\n ) {\n super(\n foundation,\n objectiveFunctionType,\n swarmSize,\n vmax,\n maximumSteps,\n 3,\n convergenceThreshold,\n searchMethod,\n localSearchRadius,\n );\n this.polygon = polygon;\n this.pvModel = pvModel;\n this.rowAxis = rowAxis;\n this.orientation = orientation;\n this.poleHeight = poleHeight;\n this.poleSpacing = poleSpacing;\n this.minimumInterRowSpacing = minimumInterRowSpacing;\n this.maximumInterRowSpacing = maximumInterRowSpacing;\n this.minimumRowsPerRack = minimumRowsPerRack;\n this.maximumRowsPerRack = maximumRowsPerRack;\n this.minimumTiltAngle = minimumTiltAngle;\n this.maximumTiltAngle = maximumTiltAngle;\n this.margin = margin;\n this.setInterRowSpacingBounds();\n // set the first particle to be the current design, if any\n if (initialSolarPanels && initialSolarPanels.length > 0) {\n const sp1 = initialSolarPanels[0];\n\n if (initialSolarPanels.length > 1) {\n const firstParticle: Particle = this.swarm.particles[0];\n // calculate the particle positions of the initial solar panels\n firstParticle.position[0] =\n this.maximumTiltAngle === this.minimumTiltAngle\n ? 0\n : (sp1.tiltAngle - this.minimumTiltAngle) / (this.maximumTiltAngle - this.minimumTiltAngle);\n\n const sp2 = initialSolarPanels[1];\n const interRowSpacing = initialLayoutParams\n ? initialLayoutParams.interRowSpacing\n : this.rowAxis === RowAxis.upDown\n ? Math.abs(sp1.cx - sp2.cx) * this.foundation.lx\n : Math.abs(sp1.cy - sp2.cy) * this.foundation.ly;\n let normalizedInterRowSpacing =\n this.maximumInterRowSpacing === this.minimumInterRowSpacing\n ? 0\n : (interRowSpacing - this.minimumInterRowSpacing) /\n (this.maximumInterRowSpacing - this.minimumInterRowSpacing);\n if (normalizedInterRowSpacing < 0) normalizedInterRowSpacing = 0;\n else if (normalizedInterRowSpacing > 1) normalizedInterRowSpacing = 1;\n firstParticle.position[1] = normalizedInterRowSpacing;\n\n const rowsPerRack = initialLayoutParams\n ? initialLayoutParams.rowsPerRack\n : Math.max(\n 1,\n Math.round(sp1.ly / (sp1.orientation === Orientation.portrait ? pvModel.length : pvModel.width)),\n );\n let normalizedRowsPerRack =\n this.maximumRowsPerRack === this.minimumRowsPerRack\n ? 0\n : (rowsPerRack - this.minimumRowsPerRack) / (this.maximumRowsPerRack - this.minimumRowsPerRack);\n if (normalizedRowsPerRack < 0) normalizedRowsPerRack = 0;\n else if (normalizedRowsPerRack > 1) normalizedRowsPerRack = 1;\n firstParticle.position[2] = normalizedRowsPerRack;\n }\n }\n }\n\n private setInterRowSpacingBounds() {\n this.bounds = Util.calculatePolygonBounds(this.polygon.vertices);\n }\n\n applyFittest(): void {\n if (this.swarm.bestPositionOfSwarm) {\n console.log(\n 'Best: ' +\n this.particleToString(this.swarm.bestPositionOfSwarm, this.swarm.bestFitness) +\n ', rack count: ' +\n this.solarRackCount +\n ', panel count: ' +\n this.solarPanelCount,\n );\n }\n }\n\n private getObjectiveUnit(): string | null {\n switch (this.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n return 'kWh';\n case ObjectiveFunctionType.YEARLY_PROFIT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n return 'dollars';\n }\n return null;\n }\n\n particleToString(position: number[], fitness: number): string {\n let s =\n 'F(' +\n Util.toDegrees(position[0] * (this.maximumTiltAngle - this.minimumTiltAngle) + this.minimumTiltAngle).toFixed(3) +\n '°, ';\n s +=\n (position[1] * (this.maximumInterRowSpacing - this.minimumInterRowSpacing) + this.minimumInterRowSpacing).toFixed(\n 3,\n ) + 'm, ';\n s += Math.floor(position[2] * (this.maximumRowsPerRack - this.minimumRowsPerRack) + this.minimumRowsPerRack) + ')';\n return s + ' = ' + fitness.toFixed(5) + ' ' + this.getObjectiveUnit();\n }\n\n startEvolving(): void {\n this.outsideStepCounter = 0;\n this.computeCounter = 0;\n this.bestPositionOfSteps.fill(null);\n this.bestFitnessOfSteps.fill(0);\n this.setInterRowSpacingBounds();\n }\n\n translateParticleByIndex(indexOfParticle: number): SolarPanelModel[] {\n return this.translatePosition(this.swarm.particles[indexOfParticle].position);\n }\n\n translateBest(): SolarPanelModel[] {\n if (this.swarm.bestPositionOfSwarm) {\n return this.translatePosition(this.swarm.bestPositionOfSwarm);\n }\n return [];\n }\n\n // translate position to structure for the specified position\n private translatePosition(position: number[]): SolarPanelModel[] {\n if (!this.bounds) return [];\n const tiltAngle = position[0] * (this.maximumTiltAngle - this.minimumTiltAngle) + this.minimumTiltAngle;\n const interRowSpacing =\n position[1] * (this.maximumInterRowSpacing - this.minimumInterRowSpacing) + this.minimumInterRowSpacing;\n const rowsPerRack = Math.floor(\n position[2] * (this.maximumRowsPerRack - this.minimumRowsPerRack) + this.minimumRowsPerRack,\n );\n const solarPanels = SolarPanelLayoutRelative.create(\n this.polygon,\n this.foundation,\n this.pvModel,\n this.orientation,\n tiltAngle,\n rowsPerRack,\n interRowSpacing,\n this.rowAxis,\n this.poleHeight,\n this.poleSpacing,\n this.margin,\n );\n this.solarPanelCount = 0;\n this.solarRackCount = solarPanels.length;\n if (solarPanels.length > 0) {\n for (const sp of solarPanels) {\n this.solarPanelCount += Util.countSolarPanelsOnRack(sp, this.pvModel);\n }\n }\n return solarPanels;\n }\n\n updateParticle(indexOfParticle: number, fitness: number): boolean {\n const swarmSize = this.swarm.particles.length;\n if (!this.converged) {\n const particle: Particle = this.swarm.particles[indexOfParticle];\n particle.fitness = fitness;\n // the first particle of the first generation is used as a baseline\n // (imagine it as the fittest of the zeroth swarm)\n if (this.computeCounter === 0 && indexOfParticle === 0) {\n this.bestPositionOfSteps[0] = [...particle.position];\n this.bestFitnessOfSteps[0] = fitness;\n }\n const step = Math.floor(this.computeCounter / swarmSize);\n console.log(\n 'Step ' +\n (step + 1) +\n ', particle ' +\n indexOfParticle +\n ' : ' +\n this.particleToString(particle.position, fitness) +\n ', rack count: ' +\n this.solarRackCount +\n ', panel count: ' +\n this.solarPanelCount,\n );\n const savedParticle = this.swarmOfSteps[step]?.particles[indexOfParticle];\n if (savedParticle) {\n for (let k = 0; k < particle.position.length; k++) {\n savedParticle.position[k] = particle.position[k];\n }\n savedParticle.fitness = particle.fitness;\n }\n const isAtTheEndOfStep = this.computeCounter % swarmSize === swarmSize - 1;\n if (isAtTheEndOfStep) {\n this.swarm.sort();\n const best = this.swarm.bestPositionOfSwarm;\n if (best) {\n this.bestPositionOfSteps[step + 1] = [...best];\n this.bestFitnessOfSteps[step + 1] = this.swarm.bestFitness;\n }\n this.converged = this.swarm.isNominallyConverged(\n this.convergenceThreshold,\n Math.max(2, this.swarm.particles.length / 4),\n );\n this.moveSwarm();\n }\n this.computeCounter++;\n }\n return this.converged;\n }\n\n // if anyone in the current population doesn't meet the constraints, the entire population dies\n // and the algorithm reverts to the previous generation -- not efficient\n detectViolations(): boolean {\n return false; // TODO\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { useStore } from '../../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { showInfo } from '../../helpers';\nimport i18n from '../../i18n/i18n';\nimport {\n DatumEntry,\n DesignProblem,\n EvolutionMethod,\n ObjectiveFunctionType,\n ObjectType,\n Orientation,\n RowAxis,\n} from '../../types';\nimport { SolarPanelModel } from '../../models/SolarPanelModel';\nimport { FoundationModel } from '../../models/FoundationModel';\nimport { SolarPanelArrayOptimizerPso } from './algorithm/SolarPanelArrayOptimizerPso';\nimport { PolygonModel } from '../../models/PolygonModel';\nimport { usePrimitiveStore } from '../../stores/commonPrimitive';\nimport { useDataStore } from '../../stores/commonData';\n\nconst SolarPanelArrayPso = () => {\n const setCommonStore = useStore(Selector.set);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const pauseEvolution = usePrimitiveStore(Selector.pauseEvolution);\n const getParent = useStore(Selector.getParent);\n const polygon = useStore(Selector.selectedElement) as PolygonModel;\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const getPvModule = useStore(Selector.getPvModule);\n const removeElementsByReferenceId = useStore(Selector.removeElementsByReferenceId);\n const setFittestParticleResults = useStore(Selector.setFittestIndividualResults);\n const objectiveEvaluationIndex = usePrimitiveStore(Selector.objectiveEvaluationIndex);\n const particleLabels = useStore(Selector.variableLabels);\n const setParticleLabels = useStore(Selector.setVariableLabels);\n const params = useStore(Selector.evolutionaryAlgorithmState).particleSwarmOptimizationParams;\n const constraints = useStore.getState().solarPanelArrayLayoutConstraints;\n const economics = useStore.getState().economicsParams;\n const currentLayoutParams = useStore.getState().solarPanelArrayLayoutParams;\n\n const requestRef = useRef(0);\n const evolutionCompletedRef = useRef(false);\n const pauseRef = useRef(false);\n const optimizerRef = useRef();\n const particleIndexRef = useRef(0);\n const convergedRef = useRef(false);\n const solarPanelArrayRef = useRef([]);\n const initialSolarPanelArrayRef = useRef([]);\n\n const lang = { lng: language };\n const foundation = polygon ? (getParent(polygon) as FoundationModel) : undefined;\n\n useEffect(() => {\n if (evolutionMethod !== EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) return;\n if (params.problem !== DesignProblem.SOLAR_PANEL_ARRAY) return;\n if (runEvolution) {\n init();\n requestRef.current = requestAnimationFrame(evolve);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!evolutionCompletedRef.current) {\n showInfo(i18n.t('message.EvolutionAborted', lang));\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = false;\n state.runDailySimulationForSolarPanels = false;\n state.runYearlySimulationForSolarPanels = false;\n });\n // this may put the function call to the last in the event queue to avoid crash in ray cast\n setTimeout(() => {\n // revert to the initial solar panel array\n if (solarPanelArrayRef.current.length > 0) {\n removeElementsByReferenceId(polygon.id, false);\n }\n if (initialSolarPanelArrayRef.current.length > 0) {\n solarPanelArrayRef.current = [...initialSolarPanelArrayRef.current];\n runCallback(true);\n }\n }, 100);\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runEvolution]);\n\n useEffect(() => {\n pauseRef.current = pauseEvolution;\n if (pauseEvolution) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = true;\n });\n showInfo(i18n.t('message.EvolutionPaused', lang));\n } else {\n usePrimitiveStore.setState((state) => {\n state.evolutionPaused = false;\n });\n // continue the evolution\n evolve();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pauseEvolution]);\n\n // getting ready for the evolution\n const init = () => {\n if (!polygon || !foundation) return;\n usePrimitiveStore.setState((state) => {\n state.evolutionInProgress = true;\n state.objectiveEvaluationIndex = 0;\n });\n evolutionCompletedRef.current = false;\n const originalSolarPanels = getChildrenOfType(ObjectType.SolarPanel, foundation.id) as SolarPanelModel[];\n // store a copy of the initial solar panels for possible reversion\n initialSolarPanelArrayRef.current.length = 0;\n for (const osp of originalSolarPanels) {\n initialSolarPanelArrayRef.current.push(JSON.parse(JSON.stringify(osp)) as SolarPanelModel);\n }\n optimizerRef.current = new SolarPanelArrayOptimizerPso(\n getPvModule(constraints.pvModelName ?? 'CS6X-355P-FG'),\n constraints.rowAxis ?? RowAxis.leftRight,\n constraints.orientation ?? Orientation.landscape,\n constraints.poleHeight ?? 1,\n constraints.poleSpacing ?? 3,\n initialSolarPanelArrayRef.current,\n currentLayoutParams,\n polygon,\n foundation,\n params.objectiveFunctionType,\n params.swarmSize,\n params.vmax,\n params.maximumSteps,\n params.convergenceThreshold,\n params.searchMethod,\n params.localSearchRadius,\n constraints.minimumInterRowSpacing,\n constraints.maximumInterRowSpacing,\n constraints.minimumRowsPerRack,\n constraints.maximumRowsPerRack,\n constraints.minimumTiltAngle,\n constraints.maximumTiltAngle,\n constraints.margin ?? 0,\n );\n optimizerRef.current.inertia = params.inertia;\n optimizerRef.current.cognitiveCoefficient = params.cognitiveCoefficient;\n optimizerRef.current.socialCoefficient = params.socialCoefficient;\n particleIndexRef.current = 0;\n convergedRef.current = false;\n setParticleLabels(['Tilt Angle', 'Inter-Row Spacing', 'Rack Width']);\n optimizerRef.current.startEvolving();\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = true;\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n };\n\n const getTotal = (): number => {\n let total = 0;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n const dailyPvYield = useDataStore.getState().dailyPvYield;\n for (const datum of dailyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n const yearlyPvYield = useDataStore.getState().yearlyPvYield;\n for (const datum of yearlyPvYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop === 'Total') {\n total += datum[prop] as number;\n }\n }\n }\n }\n total *= 12 / daysPerYear;\n break;\n }\n const count = optimizerRef.current?.solarPanelCount;\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n if (count) total /= count;\n break;\n case ObjectiveFunctionType.DAILY_PROFIT:\n total = total * economics.electricitySellingPrice;\n if (count) total -= count * economics.operationalCostPerUnit;\n break;\n case ObjectiveFunctionType.YEARLY_PROFIT:\n total = total * economics.electricitySellingPrice;\n if (count) total -= count * economics.operationalCostPerUnit * 365;\n break;\n }\n return total;\n };\n\n // the increment of objectiveEvaluationIndex is used as a trigger to request the next animation frame\n useEffect(() => {\n if (!optimizerRef.current || !objectiveEvaluationIndex) return;\n // the number of particles to evaluate is less than or equal to maximumSteps * swarmSize,\n // subject to the convergence criterion\n convergedRef.current = optimizerRef.current.updateParticle(particleIndexRef.current % params.swarmSize, getTotal());\n updateResults();\n particleIndexRef.current++;\n optimizerRef.current.outsideStepCounter = Math.floor(particleIndexRef.current / params.swarmSize);\n // recursive call to the next step of the evolution, which is to evaluate the next particle\n requestRef.current = requestAnimationFrame(evolve);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [objectiveEvaluationIndex]);\n\n const evolve = () => {\n if (!optimizerRef.current) return;\n if (evolutionMethod !== EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) return;\n if (runEvolution && !pauseRef.current) {\n if (convergedRef.current || optimizerRef.current.outsideStepCounter >= params.maximumSteps) {\n cancelAnimationFrame(requestRef.current);\n evolutionCompletedRef.current = true;\n if (solarPanelArrayRef.current.length > 0) {\n removeElementsByReferenceId(polygon.id, false);\n }\n solarPanelArrayRef.current = optimizerRef.current.translateBest();\n optimizerRef.current.applyFittest();\n updateResults();\n runCallback(true);\n showInfo(\n i18n.t('message.EvolutionCompleted', lang) +\n '\\n' +\n (convergedRef.current\n ? i18n.t('message.ConvergenceThresholdHasBeenReached', lang)\n : i18n.t('message.MaximumNumberOfStepsHasBeenReached', lang)),\n );\n if (optimizerRef.current) {\n const bestPosition = optimizerRef.current.swarm.bestPositionOfSwarm;\n const fitness = optimizerRef.current.swarm.bestFitness;\n if (bestPosition && fitness) {\n const tiltAngle =\n bestPosition[0] * (constraints.maximumTiltAngle - constraints.minimumTiltAngle) +\n constraints.minimumTiltAngle;\n const interRowSpacing =\n bestPosition[1] * (constraints.maximumInterRowSpacing - constraints.minimumInterRowSpacing) +\n constraints.minimumInterRowSpacing;\n const rowsPerRack = Math.floor(\n bestPosition[2] * (constraints.maximumRowsPerRack - constraints.minimumRowsPerRack) +\n constraints.minimumRowsPerRack,\n );\n setCommonStore((state) => {\n state.solarPanelArrayLayoutParams.tiltAngle = tiltAngle;\n state.solarPanelArrayLayoutParams.interRowSpacing = interRowSpacing;\n state.solarPanelArrayLayoutParams.rowsPerRack = rowsPerRack;\n state.solarPanelArrayLayoutParams.orientation = constraints.orientation;\n state.solarPanelArrayLayoutParams.poleHeight = constraints.poleHeight;\n });\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Particle Swarm Optimization for Solar Panel Array Layout Completed',\n result: optimizerRef.current?.particleToString(bestPosition, fitness),\n steps: optimizerRef.current?.outsideStepCounter,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n }\n return;\n }\n removeElementsByReferenceId(polygon.id, false);\n // this may put the function call to the last in the event queue to avoid crash in ray cast\n // when switching the optimization method\n setTimeout(() => {\n if (optimizerRef.current) {\n solarPanelArrayRef.current = optimizerRef.current.translateParticleByIndex(\n particleIndexRef.current % params.swarmSize,\n );\n }\n runCallback(false);\n }, 100);\n }\n };\n\n const runCallback = (lastStep: boolean) => {\n usePrimitiveStore.setState((state) => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = true;\n } else {\n state.runDailySimulationForSolarPanels = true;\n }\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = true;\n } else {\n state.runYearlySimulationForSolarPanels = true;\n }\n break;\n }\n });\n setCommonStore((state) => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.DAILY_PROFIT:\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n break;\n case ObjectiveFunctionType.YEARLY_TOTAL_OUTPUT:\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n case ObjectiveFunctionType.YEARLY_PROFIT:\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n break;\n }\n state.elements.push(...solarPanelArrayRef.current);\n });\n if (lastStep) {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = false;\n state.evolutionInProgress = false;\n state.objectiveEvaluationIndex = 0;\n });\n }\n };\n\n const updateResults = () => {\n if (!optimizerRef.current) return;\n const results: DatumEntry[] = [];\n for (let index = 0; index < optimizerRef.current.bestPositionOfSteps.length; index++) {\n const datum: DatumEntry = {};\n // the first fittest starts from index 1 because index 0 is used for the initial state\n const ps = optimizerRef.current.bestPositionOfSteps[index];\n if (ps) {\n const n = ps.length;\n datum['Step'] = index;\n for (let k = 0; k < n; k++) {\n datum[particleLabels[k] ?? 'Var' + (k + 1)] = ps[k];\n }\n datum['Objective'] = optimizerRef.current.bestFitnessOfSteps[index];\n // the first step of the swarm starts from index 0\n if (index > 0) {\n const ss = optimizerRef.current.swarmOfSteps[index - 1];\n if (ss) {\n let counter = 0;\n for (let i = 0; i < ss.particles.length; i++) {\n const n = ss.particles[i].position.length;\n for (let k = 0; k < n; k++) {\n datum['Individual' + ++counter] = ss.particles[i].position[k];\n }\n }\n }\n }\n }\n if (Object.keys(datum).length > 0) {\n results.push(datum);\n }\n }\n setFittestParticleResults(results);\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelArrayPso);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n *\n */\n\nimport React from 'react';\nimport { useStore } from './stores/common';\nimport { ObjectType } from './types';\nimport * as Selector from 'src/stores/selector';\nimport { useThree } from '@react-three/fiber';\n\nexport const NavigationController = () => {\n const objectTypeToAdd = useStore(Selector.objectTypeToAdd);\n const addedFoundationId = useStore(Selector.addedFoundationId);\n const addedCuboidId = useStore(Selector.addedCuboidId);\n const { gl } = useThree();\n\n gl.domElement.style.cursor =\n objectTypeToAdd !== ObjectType.None || addedCuboidId || addedFoundationId ? 'crosshair' : 'default';\n\n return null;\n};\n\nexport default React.memo(NavigationController);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useCallback, useState } from 'react';\nimport { GoogleMap } from '@react-google-maps/api';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { UndoableChangeLocation } from '../undo/UndoableChangeLocation';\nimport { throttle } from 'lodash';\n\nconst GroundMap = ({ width = 400, height = 400 }: { width: number; height: number }) => {\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const latitude = useStore(Selector.world.latitude);\n const longitude = useStore(Selector.world.longitude);\n const mapZoom = useStore(Selector.viewState.mapZoom);\n const mapTilt = useStore(Selector.viewState.mapTilt);\n const mapType = useStore(Selector.viewState.mapType);\n\n const [map, setMap] = useState(null);\n\n const waitTime = 200;\n\n const onLoad = useCallback((map: google.maps.Map) => {\n setMap(map);\n }, []);\n\n const onUnmount = useCallback(function callback() {\n setMap(null);\n }, []);\n\n const updateAddress = () => {\n const latlng = new google.maps.LatLng(latitude, longitude);\n new google.maps.Geocoder()\n .geocode({ location: latlng }, function (results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n if (results && results[0].address_components) {\n setCommonStore((state) => {\n state.world.address = results[0].formatted_address;\n });\n for (const a of results[0].address_components) {\n if (a.types[0] === 'country') {\n setCommonStore((state) => {\n state.world.countryCode = a.short_name;\n });\n break;\n }\n }\n }\n }\n })\n .then(() => {\n // ignore\n });\n };\n\n // FIXME: Undo doesn't work unless the focus is returned to the main window\n const onCenterChanged = throttle(\n () => {\n if (map) {\n const center = map.getCenter();\n if (center) {\n const lat = center.lat();\n const lng = center.lng();\n if (lat !== latitude || lng !== longitude) {\n updateAddress();\n const undoableChangeLocation = {\n name: 'Set Location',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: lat,\n oldLongitude: longitude,\n newLongitude: lng,\n undo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.oldLatitude;\n state.world.longitude = undoableChangeLocation.oldLongitude;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.newLatitude;\n state.world.longitude = undoableChangeLocation.newLongitude;\n });\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n state.world.latitude = lat;\n state.world.longitude = lng;\n });\n }\n }\n }\n },\n waitTime,\n { leading: false, trailing: true },\n );\n\n const onZoomChanged = throttle(\n () => {\n if (map) {\n const z = map.getZoom();\n if (z !== undefined && z !== mapZoom) {\n updateAddress();\n const undoableChange = {\n name: 'Zoom Map',\n timestamp: Date.now(),\n oldValue: mapZoom,\n newValue: z,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.mapZoom = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.mapZoom = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.viewState.mapZoom = z;\n });\n }\n }\n },\n waitTime,\n { leading: false, trailing: true },\n );\n\n const onTiltChanged = () => {\n if (map) {\n const t = map.getTilt();\n if (t !== undefined && t !== mapTilt) {\n const undoableChange = {\n name: 'Tilt Map',\n timestamp: Date.now(),\n oldValue: mapTilt,\n newValue: t,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.mapTilt = undoableChange.oldValue as number;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.mapTilt = undoableChange.newValue as number;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.viewState.mapTilt = t;\n });\n }\n }\n };\n\n const onMapTypeIdChanged = () => {\n if (map) {\n const typeId = map.getMapTypeId();\n if (typeId !== undefined && typeId !== mapType) {\n const undoableChange = {\n name: 'Change Map Type',\n timestamp: Date.now(),\n oldValue: mapType,\n newValue: typeId,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.mapType = undoableChange.oldValue as string;\n state.viewState.groundImageType = state.viewState.mapType;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.mapType = undoableChange.newValue as string;\n state.viewState.groundImageType = state.viewState.mapType;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.viewState.mapType = typeId;\n state.viewState.groundImageType = typeId;\n });\n }\n }\n };\n\n return (\n \n );\n};\n\nexport default React.memo(GroundMap);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Space, Switch } from 'antd';\nimport GroundMap from '../components/groundMap';\nimport { StandaloneSearchBox, useJsApiLoader } from '@react-google-maps/api';\nimport { Libraries } from '@react-google-maps/api/dist/utils/make-load-script-url';\nimport Spinner from '../components/spinner';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport 'antd/dist/antd.css';\nimport i18n from '../i18n/i18n';\nimport { UndoableChangeLocation } from '../undo/UndoableChangeLocation';\nimport { UndoableCheck } from '../undo/UndoableCheck';\nimport { Undoable } from '../undo/Undoable';\nimport { LAT_LNG_FRACTION_DIGITS, Z_INDEX_FRONT_PANEL } from '../constants';\n\nconst libraries = ['places'] as Libraries;\n\nconst Container = styled.div`\n position: fixed;\n top: 40px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n width: 410px;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst MapPanel = () => {\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const address = useStore(Selector.world.address);\n const latitude = useStore(Selector.world.latitude);\n const longitude = useStore(Selector.world.longitude);\n const mapPanelX = useStore(Selector.viewState.mapPanelX);\n const mapPanelY = useStore(Selector.viewState.mapPanelY);\n const groundImage = useStore(Selector.viewState.groundImage);\n const mapZoom = useStore(Selector.viewState.mapZoom);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const searchBox = useRef();\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 460;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 40 : 600;\n const [curPosition, setCurPosition] = useState({\n x: isNaN(mapPanelX) ? 0 : Math.min(mapPanelX, window.innerWidth - wOffset),\n y: isNaN(mapPanelY) ? 0 : Math.min(mapPanelY, window.innerHeight - hOffset),\n });\n const [updateFlag, setUpdateFlag] = useState(false);\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.min(mapPanelX, window.innerWidth - wOffset),\n y: Math.min(mapPanelY, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const { isLoaded, loadError } = useJsApiLoader({\n id: 'google-map-script',\n googleMapsApiKey: process.env.REACT_APP_MAPS_API_KEY as string,\n libraries: libraries,\n });\n\n const onPlacesChanged = () => {\n const places = searchBox.current?.getPlaces();\n if (places && places.length > 0) {\n const geometry = places[0].geometry;\n if (geometry && geometry.location) {\n const undoableChangeLocation = {\n name: 'Set Location',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: geometry.location.lat(),\n oldLongitude: longitude,\n newLongitude: geometry.location.lng(),\n oldAddress: address,\n newAddress: places[0].formatted_address as string,\n undo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.oldLatitude;\n state.world.longitude = undoableChangeLocation.oldLongitude;\n state.world.address = undoableChangeLocation.oldAddress;\n });\n setUpdateFlag(!updateFlag);\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.newLatitude;\n state.world.longitude = undoableChangeLocation.newLongitude;\n state.world.address = undoableChangeLocation.newAddress;\n });\n setUpdateFlag(!updateFlag);\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n if (geometry.location) {\n state.world.latitude = geometry.location.lat();\n state.world.longitude = geometry.location.lng();\n }\n if (places[0]) {\n state.world.address = places[0].formatted_address as string;\n if (places[0].address_components) {\n for (const a of places[0].address_components) {\n if (a.types[0] === 'country') {\n state.world.countryCode = a.short_name;\n break;\n }\n }\n }\n }\n });\n }\n }\n };\n\n const onLoad = (s: google.maps.places.SearchBox) => {\n searchBox.current = s;\n };\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.min(ui.x, window.innerWidth - wOffset),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n state.viewState.mapPanelX = Math.min(ui.x, window.innerWidth - wOffset);\n state.viewState.mapPanelY = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Maps',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showMapPanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showMapPanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showMapPanel = false;\n });\n };\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'mapPanel';\n });\n }}\n >\n \n \n
\n {i18n.t('word.Location', lang)}\n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n \n {i18n.t('mapPanel.ImageOnGround', lang) + ':'}\n {\n const undoableCheck = {\n name: 'Show Ground Image',\n timestamp: Date.now(),\n checked: checked,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.groundImage = !undoableCheck.checked;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.groundImage = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.viewState.groundImage = checked;\n });\n }}\n />\n \n \n {isLoaded && (\n \n
\n \n \n \n
\n
\n )}\n {isLoaded ? (\n \n
\n \n

\n {i18n.t('mapPanel.Coordinates', lang) + ':'} ({latitude.toFixed(LAT_LNG_FRACTION_DIGITS)}°,{' '}\n {longitude.toFixed(LAT_LNG_FRACTION_DIGITS)}°),  \n {i18n.t('mapPanel.Zoom', lang) + ':'} {mapZoom}\n

\n
\n
\n ) : (\n \n )}\n {loadError && (\n \n
Map cannot be loaded right now, sorry.
\n
\n )}\n
\n
\n
\n \n );\n};\n\nexport default React.memo(MapPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { DatePicker, Slider, Space, Switch, TimePicker } from 'antd';\nimport moment from 'moment';\nimport 'antd/dist/antd.css';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport i18n from '../i18n/i18n';\nimport { UndoableCheck } from '../undo/UndoableCheck';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { UndoableChangeLocation } from '../undo/UndoableChangeLocation';\nimport { computeSunriseAndSunsetInMinutes } from '../analysis/sunTools';\nimport { throttle } from 'lodash';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { Undoable } from '../undo/Undoable';\nimport { Z_INDEX_FRONT_PANEL } from '../constants';\n\nconst Container = styled.div`\n position: absolute;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 11;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n width: 680px;\n padding: 0;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst HeliodonPanel = () => {\n const language = useStore(Selector.language);\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const dateString = useStore(Selector.world.date);\n const latitude = useStore(Selector.world.latitude);\n const address = useStore(Selector.world.address);\n const animateSun = usePrimitiveStore(Selector.animateSun);\n const animate24Hours = useStore(Selector.animate24Hours);\n const runSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\n const showSunAngles = useStore(Selector.viewState.showSunAngles);\n const heliodon = useStore(Selector.viewState.heliodon);\n const heliodonPanelX = useStore(Selector.viewState.heliodonPanelX);\n const heliodonPanelY = useStore(Selector.viewState.heliodonPanelY);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const requestRef = useRef(0);\n const previousFrameTime = useRef(-1);\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 250;\n const [curPosition, setCurPosition] = useState({\n x: isNaN(heliodonPanelX) ? 0 : Math.max(heliodonPanelX, wOffset - window.innerWidth),\n y: isNaN(heliodonPanelY) ? 0 : Math.min(heliodonPanelY, window.innerHeight - hOffset),\n });\n const [updateFlag, setUpdateFlag] = useState(false);\n\n const date = useMemo(() => new Date(dateString), [dateString]);\n const sunriseAndSunsetInMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(date, latitude);\n }, [date, latitude]);\n\n const lang = { lng: language };\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleResize = () => {\n setCurPosition({\n x: Math.max(heliodonPanelX, wOffset - window.innerWidth),\n y: Math.min(heliodonPanelY, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n requestRef.current = requestAnimationFrame(animate);\n return () => {\n cancelAnimationFrame(requestRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [animateSun]);\n\n useEffect(() => {\n if (animateSun) {\n if (sunriseAndSunsetInMinutes.sunset === 0) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.animateSun = false;\n });\n }\n }\n }, [sunriseAndSunsetInMinutes.sunset]);\n\n const animate = () => {\n const continuous = useStore.getState().animate24Hours;\n if (animateSun) {\n requestRef.current = requestAnimationFrame(animate);\n const currentFrameTime = Date.now();\n if (currentFrameTime - previousFrameTime.current > 100) {\n const day = date.getDate();\n const totalMinutes = date.getMinutes() + date.getHours() * 60;\n // unfortunately, we have to get the latest latitude (which may be changed while the animation is running)\n // and then recalculate the sunrise and sunset time in the animation loop\n const sunMinutes = computeSunriseAndSunsetInMinutes(date, useStore.getState().world.latitude);\n if (!continuous && totalMinutes > sunMinutes.sunset) {\n date.setHours(sunMinutes.sunrise / 60, date.getMinutes() + 15);\n }\n date.setHours(date.getHours(), date.getMinutes() + 15);\n date.setDate(day);\n changeTime(date, false);\n previousFrameTime.current = currentFrameTime;\n }\n } else {\n cancelAnimationFrame(requestRef.current);\n }\n };\n\n const changeTime = (time: Date, undoable: boolean) => {\n const d = new Date(date);\n d.setHours(time.getHours(), time.getMinutes());\n if (undoable) {\n const undoableChange = {\n name: 'Set Time',\n timestamp: Date.now(),\n oldValue: dateString,\n newValue: d.toLocaleString(),\n undo: () => {\n setCommonStore((state) => {\n state.world.date = undoableChange.oldValue as string;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.date = undoableChange.newValue as string;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n }\n setCommonStore((state) => {\n state.world.date = d.toLocaleString('en-US');\n });\n };\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n state.viewState.heliodonPanelX = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.heliodonPanelY = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Sun and Time Settings Panel',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showHeliodonPanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showHeliodonPanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showHeliodonPanel = false;\n });\n };\n\n // throttled functions must be wrapped in useRef so that they don't get created every time\n const onLatitudeChangeRef = useRef(\n throttle(\n (value: number) => {\n const undoableChangeLocation = {\n name: 'Set Latitude',\n timestamp: Date.now(),\n oldLatitude: latitude,\n newLatitude: value,\n oldAddress: address,\n newAddress: '',\n undo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.oldLatitude;\n state.world.address = undoableChangeLocation.oldAddress;\n });\n setUpdateFlag(!updateFlag);\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.latitude = undoableChangeLocation.newLatitude;\n state.world.address = undoableChangeLocation.newAddress;\n });\n setUpdateFlag(!updateFlag);\n },\n } as UndoableChangeLocation;\n addUndoable(undoableChangeLocation);\n setCommonStore((state) => {\n state.world.latitude = value;\n state.world.address = '';\n });\n },\n 500,\n { leading: false, trailing: true },\n ),\n );\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'heliodonPanel';\n });\n }}\n >\n \n \n
\n {i18n.t('heliodonPanel.SunAndTimeSettings', lang)}\n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n
\n {i18n.t('menu.settings.Heliodon', lang)}\n
\n {\n const undoableCheck = {\n name: 'Show Heliodon',\n timestamp: Date.now(),\n checked: !heliodon,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.heliodon = !undoableCheck.checked;\n if (state.viewState.heliodon) {\n state.updateSceneRadius();\n }\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.heliodon = undoableCheck.checked;\n if (state.viewState.heliodon) {\n state.updateSceneRadius();\n }\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.viewState.heliodon = checked;\n if (state.viewState.heliodon) {\n state.updateSceneRadius();\n }\n });\n }}\n />\n
\n {heliodon && (\n
\n {i18n.t('heliodonPanel.SunAngles', lang)}\n
\n {\n const undoableCheck = {\n name: 'Show Sun Angles',\n timestamp: Date.now(),\n checked: !showSunAngles,\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showSunAngles = !undoableCheck.checked;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showSunAngles = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.viewState.showSunAngles = checked;\n });\n }}\n />\n
\n )}\n {sunriseAndSunsetInMinutes.sunset > 0 && !runSimulation && (\n <>\n
\n {i18n.t('word.Animate', lang)}\n
\n {\n const undoableCheck = {\n name: 'Animate Heliodon',\n timestamp: Date.now(),\n checked: !animateSun,\n undo: () => {\n usePrimitiveStore.setState((state) => {\n state.animateSun = !undoableCheck.checked;\n });\n },\n redo: () => {\n usePrimitiveStore.setState((state) => {\n state.animateSun = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n usePrimitiveStore.setState((state) => {\n state.animateSun = checked;\n });\n }}\n />\n
\n {animateSun && (\n
\n {i18n.t('heliodonPanel.TwentyFourHours', lang)}\n
\n {\n const undoableCheck = {\n name: 'Animate 24 Hours',\n timestamp: Date.now(),\n checked: !animate24Hours,\n undo: () => {\n setCommonStore((state) => {\n state.animate24Hours = !undoableCheck.checked;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.animate24Hours = undoableCheck.checked;\n });\n },\n } as UndoableCheck;\n addUndoable(undoableCheck);\n setCommonStore((state) => {\n state.animate24Hours = checked;\n });\n }}\n />\n
\n )}\n \n )}\n
\n {i18n.t('word.Date', lang)}\n
\n {\n if (d) {\n const day = new Date(date);\n const m = d.toDate();\n day.setFullYear(m.getFullYear());\n day.setMonth(m.getMonth());\n day.setDate(m.getDate());\n const undoableChange = {\n name: 'Set Date',\n timestamp: Date.now(),\n oldValue: dateString,\n newValue: day.toString(),\n undo: () => {\n setCommonStore((state) => {\n state.world.date = undoableChange.oldValue as string;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.world.date = undoableChange.newValue as string;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setCommonStore((state) => {\n state.world.date = day.toLocaleString('en-US');\n });\n }\n }}\n />\n
\n
\n {i18n.t('word.Time', lang)}\n
\n {\n if (t) changeTime?.(t.toDate(), true);\n }}\n />\n
\n {!runSimulation && (\n
\n {i18n.t('word.Latitude', lang)}: {latitude.toFixed(2)}°\n \n
\n )}\n
\n
\n \n \n );\n};\n\nexport default React.memo(HeliodonPanel);\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\n\nexport const SYMBOLS = [\n 'circle',\n 'square',\n 'triangle up',\n 'triangle down',\n 'triangle right',\n 'triangle left',\n 'star',\n 'diamond',\n 'hexagon',\n];\n\nexport enum Direction {\n DOWN,\n UP,\n LEFT,\n RIGHT,\n}\n\nconst strokeWidth = 1;\n\nexport const CircleSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const SquareSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const TriangleSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, direction, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n let pointsString;\n switch (direction) {\n case Direction.UP:\n pointsString = '-4,2.5,4,2.5,0,-3.5';\n break;\n case Direction.LEFT:\n pointsString = '2.5,4,2.5,-4,-3.5,0';\n break;\n case Direction.RIGHT:\n pointsString = '-2.5,4,-2.5,-4,3.5,0';\n break;\n default:\n pointsString = '-4,-2.5,4,-2.5,0,3.5';\n }\n // strokeWidth needs to be halved as the view box is too small\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const DiamondSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n // strokeWidth needs to be halved as the view box is too small\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const StarSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n // we need to scale down by 50% first before applying the scale factor as the original svg is too large\n const s = 0.05 * scale;\n return (\n // strokeWidth needs to be doubled as the view box is too large\n \n \n \n );\n }\n return null;\n};\n\nexport const HexagonSymbol = (props: any) => {\n const { cx, cy, opacity, stroke, index, points, scale, numberOfSymbols, fillColor } = props;\n const interval = Math.round(points.length / numberOfSymbols);\n if (cx && cy && index > 0 && index % interval === 0) {\n const s = 0.02 * scale;\n return (\n \n \n \n );\n }\n return null;\n};\n\nexport const createSymbol = (type: string, size: number, count: number, opacity: number, fillColor?: string) => {\n switch (type) {\n case 'circle':\n return ;\n case 'square':\n return ;\n case 'triangle up':\n return (\n \n );\n case 'triangle down':\n return (\n \n );\n case 'triangle right':\n return (\n \n );\n case 'triangle left':\n return (\n \n );\n case 'star':\n return ;\n case 'diamond':\n return ;\n case 'hexagon':\n return ;\n }\n};\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Menu, Dropdown, Checkbox } from 'antd';\nimport { ReactComponent as MenuSVG } from '../assets/menu.svg';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\n\nconst StyledMenuSVG = styled(MenuSVG)`\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n`;\n\nexport interface BarGraphMenuProps {\n horizontalGrid: boolean;\n verticalGrid: boolean;\n changeHorizontalGrid?: (visible: boolean) => void;\n changeVerticalGrid?: (visible: boolean) => void;\n}\n\nconst BarGraphMenu = ({\n horizontalGrid,\n verticalGrid,\n changeHorizontalGrid,\n changeVerticalGrid,\n}: BarGraphMenuProps) => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n\n const [visible, setVisible] = useState(false);\n\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n };\n\n const onShowHorizontalGridLines = () => {\n changeHorizontalGrid?.(!horizontalGrid);\n };\n\n const onShowVerticalGridLines = () => {\n changeVerticalGrid?.(!verticalGrid);\n };\n\n const menu = (\n \n \n \n {i18n.t('menu.graph.ShowHorizontalGridLines', lang)}\n \n \n \n \n {i18n.t('menu.graph.ShowVerticalGridLines', lang)}\n \n \n \n );\n\n return (\n <>\n \n {\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n\nexport default BarGraphMenu;\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Label,\n Legend,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { PRESET_COLORS } from '../constants';\nimport { GraphDataType, DatumEntry } from '../types';\nimport BarGraphMenu from './barGraphMenu';\n\nexport interface BarGraphProps {\n type: GraphDataType;\n dataSource: DatumEntry[];\n height: number;\n dataKeyAxisX?: string;\n labelX?: string;\n labelY?: string;\n unitX?: string;\n unitY?: string;\n yMin?: string | number;\n yMax?: string | number;\n fractionDigits?: number;\n referenceX?: number | string;\n color?: string;\n}\n\nconst BarGraph = ({\n type,\n dataSource,\n height,\n dataKeyAxisX,\n labelX,\n labelY,\n unitX,\n unitY,\n yMin = 'auto',\n yMax = 'auto',\n fractionDigits = 2,\n referenceX,\n color,\n}: BarGraphProps) => {\n const [dataSetCount, setDataSetCount] = useState(0);\n const [horizontalGridLines, setHorizontalGridLines] = useState(true);\n const [verticalGridLines, setVerticalGridLines] = useState(true);\n const [legendDataKey, setLegendDataKey] = useState(null);\n\n //init\n useEffect(() => {\n if (!dataSource || dataSource.length === 0) {\n return;\n }\n const len = Array.isArray(dataSource) ? Object.keys(dataSource[0]).length - 1 : Object.keys(dataSource).length - 1;\n if (dataSetCount !== len) {\n setDataSetCount(len);\n }\n }, [dataSource]);\n\n const getBars = useMemo(() => {\n const bars = [];\n for (let i = 0; i < dataSetCount; i++) {\n let name = '';\n switch (type) {\n case GraphDataType.MonthlyTemperatures:\n name = i === 0 ? `Low` : 'High';\n break;\n case GraphDataType.SunshineHours:\n name = 'Sunshine';\n break;\n case GraphDataType.HourlyTemperatures:\n name = 'Temperature';\n break;\n case GraphDataType.DaylightData:\n name = 'Daylight';\n break;\n case GraphDataType.ClearnessData:\n name = 'Clearness';\n break;\n case GraphDataType.DailyRadiationSensorData:\n case GraphDataType.YearlyRadiationSensorData:\n name = 'Radiation';\n break;\n }\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n bars.push(\n ,\n );\n }\n return bars;\n }, [dataSetCount, legendDataKey]);\n\n // @ts-ignore\n const onMouseDown = (e) => {};\n\n // @ts-ignore\n const onMouseEnterLegend = (o) => {\n setLegendDataKey(o.dataKey);\n };\n\n // @ts-ignore\n const onMouseLeaveLegend = (o) => {\n setLegendDataKey(null);\n };\n\n return (\n <>\n {dataSource && (\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\n \n \n \n \n value.toFixed(fractionDigits) + ' ' + unitY} />\n \n \n \n \n \n \n \n {getBars}\n {dataSetCount > 1 && (\n \n )}\n \n \n {\n setHorizontalGridLines(checked);\n }}\n changeVerticalGrid={(checked) => {\n setVerticalGridLines(checked);\n }}\n />\n \n \n )}\n \n );\n};\n\nexport default BarGraph;\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Menu, Dropdown, Checkbox, Slider } from 'antd';\nimport { ReactComponent as MenuSVG } from '../assets/menu.svg';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\n\nconst StyledMenuSVG = styled(MenuSVG)`\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n`;\n\nexport interface LineGraphMenuProps {\n horizontalGrid: boolean;\n verticalGrid: boolean;\n lineCount: number;\n lineWidth: number;\n symbolSize: number;\n changeHorizontalGrid?: (visible: boolean) => void;\n changeVerticalGrid?: (visible: boolean) => void;\n changeLineWidth?: (width: number) => void;\n changeSymbolSize?: (count: number) => void;\n}\n\nconst LineGraphMenu = ({\n horizontalGrid,\n verticalGrid,\n lineCount,\n lineWidth,\n symbolSize,\n changeHorizontalGrid,\n changeVerticalGrid,\n changeLineWidth,\n changeSymbolSize,\n}: LineGraphMenuProps) => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n\n const [visible, setVisible] = useState(false);\n\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n };\n\n const onShowHorizontalGridLines = () => {\n changeHorizontalGrid?.(!horizontalGrid);\n };\n\n const onShowVerticalGridLines = () => {\n changeVerticalGrid?.(!verticalGrid);\n };\n\n const onChangeLineWidth = (value: number) => {\n changeLineWidth?.(value / 2);\n };\n\n const onChangeSymbolSize = (size: number) => {\n changeSymbolSize?.(size / 5);\n };\n\n const menu = (\n \n \n {i18n.t('menu.graph.LineWidth', lang) + ':'}\n \n \n \n {i18n.t('menu.graph.SymbolSize', lang) + ':'}\n \n \n \n \n {i18n.t('menu.graph.ShowHorizontalGridLines', lang)}\n \n \n \n \n {i18n.t('menu.graph.ShowVerticalGridLines', lang)}\n \n \n \n );\n\n return (\n <>\n \n 1 ? '25px' : '32px' }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n\nexport default LineGraphMenu;\n","/*\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n Label,\n Legend,\n Line,\n LineChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { createSymbol, SYMBOLS } from './symbols';\nimport { PRESET_COLORS } from '../constants';\nimport { ChartType, DatumEntry, GraphDataType } from '../types';\nimport { CurveType } from 'recharts/types/shape/Curve';\nimport LineGraphMenu from './lineGraphMenu';\n\nexport interface LineGraphProps {\n type: GraphDataType;\n chartType: ChartType;\n selectedIndex?: number;\n dataSource: DatumEntry[];\n labels?: string[];\n height: number;\n dataKeyAxisX?: string;\n labelX?: string;\n labelY?: string;\n unitX?: string;\n unitY?: string;\n yMin?: string | number;\n yMax?: string | number;\n curveType?: CurveType;\n referenceX?: number | string;\n fractionDigits?: number;\n symbolCount?: number;\n}\n\nconst LineGraph = ({\n type,\n chartType = ChartType.Line,\n selectedIndex,\n dataSource,\n labels,\n height,\n dataKeyAxisX,\n labelX,\n labelY,\n unitX,\n unitY,\n yMin = 'auto',\n yMax = 'auto',\n curveType = 'linear',\n referenceX,\n fractionDigits = 2,\n symbolCount = 12,\n}: LineGraphProps) => {\n const [lineCount, setLineCount] = useState(0);\n const [horizontalGridLines, setHorizontalGridLines] = useState(true);\n const [verticalGridLines, setVerticalGridLines] = useState(true);\n const [legendDataKey, setLegendDataKey] = useState(null);\n const [lineWidth, setLineWidth] = useState(2);\n const [symbolSize, setSymbolSize] = useState(1);\n\n //init\n useEffect(() => {\n if (!dataSource || dataSource.length === 0) {\n setLineCount(0);\n return;\n }\n const len = Array.isArray(dataSource) ? Object.keys(dataSource[0]).length - 1 : Object.keys(dataSource).length - 1;\n if (lineCount !== len) {\n setLineCount(len);\n }\n }, [lineCount, dataSource]);\n\n const getRepresentations = useMemo(() => {\n const representations = [];\n let defaultSymbol;\n for (let i = 0; i < lineCount; i++) {\n let name = '';\n switch (type) {\n case GraphDataType.MonthlyTemperatures:\n name = i === 0 ? `Low` : 'High';\n break;\n case GraphDataType.SunshineHours:\n name = 'Sunshine';\n break;\n case GraphDataType.HourlyTemperatures:\n if (lineCount === 1) {\n name = 'Temperature';\n } else {\n if (i === 1) {\n name = 'PartonLogan';\n } else if (i === 2) {\n name = 'Ground';\n } else {\n name = 'Sinusoidal';\n }\n }\n break;\n case GraphDataType.DaylightData:\n name = 'Daylight';\n break;\n case GraphDataType.ClearnessData:\n name = 'Clearness';\n break;\n case GraphDataType.DailyRadiationSensorData:\n case GraphDataType.YearlyRadiationSensorData:\n name = labels && labels[i] ? labels[i] : 'Radiation' + (i + 1);\n break;\n case GraphDataType.DailyPvYield:\n case GraphDataType.YearlyPvYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Panel' + (i + 1);\n }\n break;\n case GraphDataType.DailyParabolicTroughYield:\n case GraphDataType.YearlyParabolicTroughYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Trough' + (i + 1);\n }\n break;\n case GraphDataType.DailyParabolicDishYield:\n case GraphDataType.YearlyParabolicDishYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Dish' + (i + 1);\n }\n break;\n case GraphDataType.DailyFresnelReflectorYield:\n case GraphDataType.YearlyFresnelReflectorYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Reflector' + (i + 1);\n }\n break;\n case GraphDataType.DailyHeliostatYield:\n case GraphDataType.YearlyHeliostatYield:\n if (lineCount === 1) {\n name = 'Total';\n } else {\n name = labels && labels[i] ? labels[i] : 'Heliostat' + (i + 1);\n }\n break;\n case GraphDataType.DailyUpdraftTowerYield:\n case GraphDataType.YearlyUpdraftTowerYield:\n name = labels && labels[i] ? labels[i] : 'Tower' + (i + 1);\n break;\n case GraphDataType.DailyBuildingEnergy:\n case GraphDataType.YearlyBuildingEnergy:\n name = labels && labels[i] ? labels[i] : 'Energy' + (i + 1);\n break;\n }\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n const symbol = createSymbol(SYMBOLS[i], symbolSize, symbolCount, opacity);\n if (i === 0) defaultSymbol = symbol;\n const isMeasured = name.startsWith('Measured');\n representations.push(\n chartType === ChartType.Area ? (\n \n ) : (\n 0 ? (symbol ? symbol : defaultSymbol) : false}\n isAnimationActive={false}\n />\n ),\n );\n }\n return representations;\n }, [type, chartType, selectedIndex, curveType, labels, lineCount, lineWidth, symbolCount, symbolSize, legendDataKey]);\n\n // @ts-ignore\n const onMouseDown = (e) => {};\n\n // @ts-ignore\n const onMouseEnterLegend = (o) => {\n setLegendDataKey(o.dataKey);\n };\n\n // @ts-ignore\n const onMouseLeaveLegend = (o) => {\n setLegendDataKey(null);\n };\n\n return (\n <>\n {dataSource && (\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\n \n \n \n {chartType === ChartType.Area ? (\n \n value.toFixed(fractionDigits) + ' ' + unitY} />\n \n \n \n \n \n \n \n {getRepresentations}\n {lineCount > 1 && (\n \n )}\n \n ) : (\n \n value.toFixed(fractionDigits) + ' ' + unitY} />\n \n \n \n \n \n \n \n {getRepresentations}\n {lineCount > 1 && (\n \n )}\n \n )}\n \n {\n setHorizontalGridLines(checked);\n }}\n changeVerticalGrid={(checked) => {\n setVerticalGridLines(checked);\n }}\n changeLineWidth={(value) => {\n setLineWidth(value);\n }}\n changeSymbolSize={(value) => {\n setSymbolSize(value);\n }}\n />\n \n \n )}\n \n );\n};\n\nexport default LineGraph;\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport BarGraph from '../components/barGraph';\nimport LineGraph from '../components/lineGraph';\nimport { ChartType, GraphDataType } from '../types';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { Undoable } from '../undo/Undoable';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n left: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 300px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface WeatherPanelProps {\n city: string | null;\n graphs: GraphDataType[];\n}\n\nconst WeatherPanel = ({ city, graphs }: WeatherPanelProps) => {\n const language = useStore(Selector.language);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const now = new Date(useStore(Selector.world.date));\n const getWeather = useStore(Selector.getWeather);\n const panelRect = useStore(Selector.viewState.weatherPanelRect);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 540;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 600;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.min(panelRect.x, window.innerWidth - wOffset) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.weatherPanelRect) {\n state.viewState.weatherPanelRect = new Rectangle(0, 0, 500, 500);\n }\n state.viewState.weatherPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.weatherPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const responsiveHeight = useMemo(() => {\n return graphs ? Math.floor(100 / graphs.length) : 100;\n }, [graphs]);\n\n const getData = useMemo(() => {\n if (!graphs) {\n return;\n }\n const result: any = {};\n if (city) {\n const weather = getWeather(city);\n if (weather) {\n graphs.forEach((g) => {\n result[g] = [];\n switch (g) {\n case GraphDataType.MonthlyTemperatures:\n for (let i = 0; i < 12; i++) {\n result[g].push({\n Month: MONTHS[i],\n Low: weather.lowestTemperatures[i],\n High: weather.highestTemperatures[i],\n });\n }\n break;\n case GraphDataType.SunshineHours:\n for (let i = 0; i < 12; i++) {\n result[g].push({\n Month: MONTHS[i],\n Sunshine: weather.sunshineHours[i],\n });\n }\n break;\n }\n });\n }\n }\n return result;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [graphs, city]);\n\n const yNames = [\n 'NA',\n i18n.t('word.Temperature', lang),\n i18n.t('word.Temperature', lang),\n i18n.t('weatherPanel.SunshineHours', lang),\n ];\n const yUnits = ['NA', '°C', '°C', i18n.t('word.Hour', lang)];\n const referenceX = MONTHS[now.getMonth()];\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.min(ui.x, window.innerWidth - wOffset),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.weatherPanelRect) {\n state.viewState.weatherPanelRect = new Rectangle(0, 0, 500, 500);\n }\n state.viewState.weatherPanelRect.x = Math.min(ui.x, window.innerWidth - wOffset);\n state.viewState.weatherPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Weather Panel',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showWeatherPanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showWeatherPanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showWeatherPanel = false;\n });\n };\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'weatherPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('word.Weather', lang) +\n ': ' +\n (city?.trim().endsWith(',') ? city?.trim().substring(0, city?.length - 2) : city)}\n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n <>\n {graphs.map((g) => {\n if (g === GraphDataType.SunshineHours) {\n return (\n \n );\n }\n return (\n \n );\n })}\n \n \n
\n \n );\n};\n\nexport default React.memo(WeatherPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport BarGraph from '../components/barGraph';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space, Switch } from 'antd';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyLightSensorPanelProps {\n city: string | null;\n}\n\nconst YearlyLightSensorPanel = ({ city }: YearlyLightSensorPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const sensorData = useDataStore(Selector.yearlyLightSensorData);\n const sensorLabels = useDataStore(Selector.sensorLabels);\n const panelRect = useStore(Selector.viewState.yearlyLightSensorPanelRect);\n const countElementsByType = useStore(Selector.countElementsByType);\n const daylightGraph = useStore(Selector.viewState.yearlyLightSensorPanelShowDaylight);\n const clearnessGraph = useStore(Selector.viewState.yearlyLightSensorPanelShowClearness);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n const [radiationGraph, setRadiationGraph] = useState(true);\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 600;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const lang = { lng: language };\n const referenceX = MONTHS[now.getMonth()];\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyLightSensorPanelRect) {\n state.viewState.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\n }\n state.viewState.yearlyLightSensorPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyLightSensorPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyLightSensorPanelRect) {\n state.viewState.yearlyLightSensorPanelRect = new Rectangle(0, 0, 600, 500);\n }\n state.viewState.yearlyLightSensorPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyLightSensorPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyLightSensorPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Yearly Light Sensor Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('word.Radiation', lang);\n const emptyGraph = sensorData && sensorData[0] ? Object.keys(sensorData[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyLightSensorPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('sensorPanel.LightSensor', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n {daylightGraph && (\n ({ Month: e.Month, Daylight: e.Daylight }))}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={i18n.t('word.Daylight', lang)}\n unitY={i18n.t('word.Hour', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={1}\n referenceX={referenceX}\n />\n )}\n {clearnessGraph && (\n ({ Month: e.Month, Clearness: e.Clearness }))}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={i18n.t('yearlyLightSensorPanel.SkyClearness', lang)}\n unitY={'%'}\n yMin={0}\n yMax={100}\n fractionDigits={1}\n referenceX={referenceX}\n color={'#66CDAA'}\n />\n )}\n {radiationGraph && (\n item)}\n labels={sensorLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={'kWh/m²/' + i18n.t('word.Day', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n )}\n \n \n {\n setCommonStore((state) => {\n state.viewState.yearlyLightSensorPanelShowDaylight = checked;\n });\n }}\n />\n {i18n.t('word.Daylight', lang)}\n \n \n {\n setCommonStore((state) => {\n state.viewState.yearlyLightSensorPanelShowClearness = checked;\n });\n }}\n />\n {i18n.t('yearlyLightSensorPanel.SkyClearness', lang)}\n \n \n {\n setRadiationGraph(checked);\n }}\n />\n {i18n.t('word.Radiation', lang)}\n \n \n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n const sensorCount = countElementsByType(ObjectType.Sensor);\n if (sensorCount === 0) {\n showInfo(i18n.t('analysisManager.NoSensorForCollectingData', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = { name: 'Collect Yearly Data for Sensors', timestamp: new Date().getTime() };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlyLightSensor = true;\n state.pauseYearlyLightSensor = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-light-sensor', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Light Sensor Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {sensorData && sensorData.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(sensorData, 'yearly-light-sensor.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Light Sensor Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n \n \n \n \n \n );\n};\n\nexport default React.memo(YearlyLightSensorPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space } from 'antd';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyLightSensorPanelProps {\n city: string | null;\n}\n\nconst DailyLightSensorPanel = ({ city }: DailyLightSensorPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const sensorLabels = useDataStore(Selector.sensorLabels);\n const sensorData = useDataStore(Selector.dailyLightSensorData);\n const panelRect = useStore(Selector.viewState.dailyLightSensorPanelRect);\n const countElementsByType = useStore(Selector.countElementsByType);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 460;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyLightSensorPanelRect) {\n state.viewState.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.dailyLightSensorPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyLightSensorPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyLightSensorPanelRect) {\n state.viewState.dailyLightSensorPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.dailyLightSensorPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyLightSensorPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyLightSensorPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Daily Light Sensor Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('word.Radiation', lang);\n const emptyGraph = sensorData && sensorData[0] ? Object.keys(sensorData[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyLightSensorPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('sensorPanel.LightSensor', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n const sensorCount = countElementsByType(ObjectType.Sensor);\n if (sensorCount === 0) {\n showInfo(i18n.t('analysisManager.NoSensorForCollectingData', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = { name: 'Collect Daily Data for Sensors', timestamp: new Date().getTime() };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailyLightSensor = true;\n state.pauseDailyLightSensor = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-light-sensor', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Light Sensor Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {sensorData && sensorData.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(sensorData, 'daily-light-sensor.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Light Sensor Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n \n \n \n \n );\n};\n\nexport default React.memo(DailyLightSensorPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Input } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { Undoable } from '../undo/Undoable';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 12;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 200px;\n max-width: 800px;\n min-height: 60px;\n max-height: 600px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst { TextArea } = Input;\n\nconst StickyNotePanel = () => {\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const notes = useStore(Selector.notes);\n const panelRect = useStore(Selector.viewState.stickyNotePanelRect);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 440;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 400;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.min(panelRect.x, window.innerWidth - wOffset) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [text, setText] = useState(notes.length > 0 ? notes[0] : '');\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.stickyNotePanelRect) {\n state.viewState.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\n }\n state.viewState.stickyNotePanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.stickyNotePanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n useEffect(() => {\n setText(notes.length > 0 ? notes[0] : '');\n }, [notes]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.min(ui.x, window.innerWidth - wOffset),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.stickyNotePanelRect) {\n state.viewState.stickyNotePanelRect = new Rectangle(0, 0, 400, 300);\n }\n state.viewState.stickyNotePanelRect.x = Math.min(ui.x, window.innerWidth - wOffset);\n state.viewState.stickyNotePanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Sticky Note',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showStickyNotePanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showStickyNotePanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showStickyNotePanel = false;\n state.notes[0] = text;\n });\n };\n\n return (\n <>\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'stickyNotePanel';\n });\n }}\n >\n \n \n
\n {i18n.t('menu.view.accessories.Note', lang)}\n {\n closePanel();\n }}\n onTouchStart={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n {\n setText(e.target.value);\n }}\n onBlur={() => {\n setCommonStore((state) => {\n state.notes[0] = text;\n });\n }}\n onPointerOut={() => {\n setCommonStore((state) => {\n state.notes[0] = text;\n });\n }}\n />\n \n \n \n \n );\n};\n\nexport default React.memo(StickyNotePanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport styled from 'styled-components';\nimport i18n from '../i18n/i18n';\nimport * as Selector from '../stores/selector';\nimport { Util } from '../Util';\nimport { CloseOutlined } from '@ant-design/icons';\nimport { Undoable } from '../undo/Undoable';\n\nconst Container = styled.div`\n position: absolute;\n top: 80px;\n left: 10px;\n margin: auto;\n display: flex;\n justify-content: left;\n align-self: flex-start;\n align-content: flex-start;\n align-items: start;\n padding: 16px;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n`;\n\nconst ColumnWrapper = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n align-self: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n margin: auto;\n width: 310px;\n padding-bottom: 10px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n`;\n\nconst InstructionPanel = () => {\n const setCommonStore = useStore(Selector.set);\n const addUndoable = useStore(Selector.addUndoable);\n const language = useStore(Selector.language);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\n const navigation = useStore(Selector.viewState.navigationView) ?? false;\n const lang = { lng: language };\n const color = sunlightDirection.y > 0 ? 'navajowhite' : 'antiquewhite';\n\n const isMac = Util.isMac();\n\n const setNavigationView = (selected: boolean) => {\n setCommonStore((state) => {\n state.viewState.navigationView = selected;\n state.viewState.enableRotate = !selected;\n });\n };\n\n return (\n \n \n {navigation && (\n \n {i18n.t('instructionPanel.NavigationMode', lang)}\n {\n const undoableAction = {\n name: 'Close Navigation Mode',\n timestamp: Date.now(),\n undo: () => {\n setNavigationView(true);\n },\n redo: () => {\n setNavigationView(false);\n },\n } as Undoable;\n addUndoable(undoableAction);\n setNavigationView(false);\n }}\n />\n \n )}\n \n {i18n.t(navigation ? 'instructionPanel.DisableNavigation' : 'instructionPanel.EnableNavigation', lang)}\n : {i18n.t('word.Press', lang)} {isMac ? '⌘' : 'Ctrl'}+U\n \n {navigation && (\n <>\n \n {i18n.t('instructionPanel.MoveForwardBack', lang)}:{' '}\n {i18n.t('instructionPanel.MoveForwardBackInstruction', lang)}\n \n \n {i18n.t('instructionPanel.MoveLeftRight', lang)}:{' '}\n {i18n.t('instructionPanel.MoveLeftRightInstruction', lang)}\n \n \n {i18n.t('instructionPanel.MoveUpDown', lang)}:{' '}\n {i18n.t('instructionPanel.MoveUpDownInstruction', lang)}\n \n \n {i18n.t('instructionPanel.Turn', lang)}: {i18n.t('instructionPanel.TurnInstruction', lang)}\n \n \n )}\n {!orthographic && !navigation && (\n \n {i18n.t('instructionPanel.Rotate', lang)}: {i18n.t('instructionPanel.DragMouse', lang)}\n \n )}\n {!navigation && (\n <>\n \n {i18n.t('instructionPanel.Zoom', lang)}:{' '}\n {i18n.t(isMac ? 'instructionPanel.MouseWheelOrKeysMac' : 'instructionPanel.MouseWheelOrKeys', lang)}\n \n \n {i18n.t('instructionPanel.Pan', lang)}:{' '}\n {i18n.t(isMac ? 'instructionPanel.HoldMetaDragMouse' : 'instructionPanel.HoldCtrlDragMouse', lang)}\n \n \n {i18n.t(orthographic ? 'instructionPanel.Exit2DMode' : 'instructionPanel.Enter2DMode', lang)}:{' '}\n {i18n.t('word.Press', lang)} {isMac ? '⌘' : 'Ctrl'}+B\n \n \n )}\n \n \n );\n};\n\nexport default React.memo(InstructionPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space, Switch, Popover, Row, Col } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { Util } from 'src/Util';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyPvYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyPvYieldPanel = ({ city }: YearlyPvYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.daysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyPvYield);\n const individualOutputs = useStore(Selector.yearlyPvIndividualOutputs);\n const solarPanelLabels = useDataStore(Selector.solarPanelLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyPvYieldPanelRect);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const economics = useStore.getState().economicsParams;\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const panelSumRef = useRef(new Map());\n const resizeObserverRef = useRef();\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n const solarPanelCount = countElementsByType(ObjectType.SolarPanel);\n\n useEffect(() => {\n let s = 0;\n panelSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n panelSumRef.current.set(prop, (panelSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyPvYieldPanelRect) {\n state.viewState.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyPvYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyPvYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyPvYieldPanelRect) {\n state.viewState.yearlyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyPvYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyPvYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyPvYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Panel Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n useEffect(() => {\n if (solarPanelCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [solarPanelCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('solarPanelYieldPanel.Yield', lang);\n\n const solarPanelNumber = Util.countAllSolarPanels();\n const yearScaleFactor = 12 / daysPerYear;\n const totalYield = sum * yearScaleFactor;\n const totalCost = solarPanelNumber * economics.operationalCostPerUnit * 365;\n const totalRevenue = totalYield * economics.electricitySellingPrice;\n const totalProfit = totalRevenue - totalCost;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyPvYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('solarPanelYieldPanel.SolarPanelYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={solarPanelLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && solarPanelCount > 1 && panelSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === panelSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + totalYield.toFixed(2) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n <>\n {totalYield > 0 && (\n \n {i18n.t('solarPanelYieldPanel.YearlyTotal', lang) +\n ': ' +\n totalYield.toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n \n )}\n {totalYield > 0 && (\n \n \n {i18n.t('solarPanelYieldPanel.ModuleCount', lang) + ': '}\n {solarPanelNumber}\n \n \n {i18n.t('solarPanelYieldPanel.MeanYield', lang) + ': '}\n {(totalYield / solarPanelNumber).toFixed(2)} kWh\n \n \n {i18n.t('solarPanelYieldPanel.TotalCost', lang) + ': '}\n ${totalCost.toFixed(2)}\n \n \n {i18n.t('solarPanelYieldPanel.TotalRevenue', lang) + ': '}\n ${totalRevenue.toFixed(2)}\n \n \n {i18n.t('solarPanelYieldPanel.Profit', lang) + ': '}\n {(totalProfit > 0 ? '$' : '-$') + Math.abs(totalProfit).toFixed(2)}\n \n \n }\n >\n \n \n )}\n \n )}\n {!runEvolution && (\n <>\n {solarPanelCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (solarPanelCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyPvIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Solar Panels: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runYearlySimulationForSolarPanels = true;\n state.pauseYearlySimulationForSolarPanels = false;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (solarPanelCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Solar Panels',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runYearlySimulationForSolarPanels = true;\n state.pauseYearlySimulationForSolarPanels = false;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-pv-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Solar Panel Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-pv-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Solar Panel Yearly Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n \n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyPvYieldPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space, Switch, Popover, Row, Col } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { Util } from 'src/Util';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyPvYieldPanelProps {\n city: string | null;\n}\n\nconst DailyPvYieldPanel = ({ city }: DailyPvYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyPvYield);\n const individualOutputs = useStore(Selector.dailyPvIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyPvYieldPanelRect);\n const solarPanelLabels = useDataStore(Selector.solarPanelLabels);\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n const economics = useStore.getState().economicsParams;\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const wOffset = wrapperRef.current ? wrapperRef.current.offsetWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.offsetHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const panelSumRef = useRef(new Map());\n const resizeObserverRef = useRef();\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n panelSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n panelSumRef.current.set(prop, (panelSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyPvYieldPanelRect) {\n state.viewState.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyPvYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyPvYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyPvYieldPanelRect) {\n state.viewState.dailyPvYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyPvYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyPvYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyPvYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Panel Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const solarPanelCount = countElementsByType(ObjectType.SolarPanel);\n useEffect(() => {\n if (solarPanelCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = false;\n });\n }\n }, [solarPanelCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('solarPanelYieldPanel.YieldPerHour', lang);\n const solarPanelNumber = Util.countAllSolarPanels();\n const totalCost = solarPanelNumber * economics.operationalCostPerUnit;\n const totalRevenue = sum * economics.electricitySellingPrice;\n const totalProfit = totalRevenue - totalCost;\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyPvYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('solarPanelYieldPanel.SolarPanelDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && solarPanelCount > 1 && panelSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === panelSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n <>\n {sum > 0 && (\n \n {i18n.t('solarPanelYieldPanel.DailyTotal', lang) +\n ': ' +\n sum.toFixed(3) +\n ' ' +\n i18n.t('word.kWh', lang)}\n \n )}\n {sum > 0 && (\n \n \n {i18n.t('solarPanelYieldPanel.ModuleCount', lang) + ': '}\n {solarPanelNumber}\n \n \n {i18n.t('solarPanelYieldPanel.MeanYield', lang) + ': '}\n {(sum / solarPanelNumber).toFixed(2)} kWh\n \n \n {i18n.t('solarPanelYieldPanel.TotalCost', lang) + ': '}\n ${totalCost.toFixed(2)}\n \n \n {i18n.t('solarPanelYieldPanel.TotalRevenue', lang) + ': '}\n ${totalRevenue.toFixed(2)}\n \n \n {i18n.t('solarPanelYieldPanel.Profit', lang) + ': '}\n {(totalProfit > 0 ? '$' : '-$') + Math.abs(totalProfit).toFixed(2)}\n \n \n }\n >\n \n \n )}\n \n )}\n {!runEvolution && (\n <>\n {solarPanelCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (solarPanelCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyPvIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Solar Panels: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runDailySimulationForSolarPanels = true;\n state.pauseDailySimulationForSolarPanels = false;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (solarPanelCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarPanelForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Solar Panels',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runDailySimulationForSolarPanels = true;\n state.pauseDailySimulationForSolarPanels = false;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-pv-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Solar Panel Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-pv-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Solar Panel Daily Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n \n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyPvYieldPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport SolarPanelImage from '../assets/solar-panel.png';\nimport HeliostatImage from '../assets/heliostat.png';\nimport LightBulbImage from '../assets/light_bulb.png';\nimport DiameterImage from '../assets/diameter.png';\nimport AreaImage from '../assets/area.png';\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Space } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { BuildingCompletionStatus, ObjectType } from '../types';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { Util } from 'src/Util';\nimport { FoundationModel } from '../models/FoundationModel';\n\nconst Container = styled.div`\n position: absolute;\n bottom: 40px;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n`;\n\ninterface ColumnWrapperProps {\n projectView: boolean;\n}\n\nconst ColumnWrapper = styled.div`\n background: #282c34;\n position: absolute;\n top: 0;\n left: ${(p) => (p.projectView ? 'calc(3 * 100vw / 4 - 120px)' : 'calc(100vw / 2 - 120px)')};\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: 240px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n`;\n\nconst DesignInfoPanel = () => {\n const elements = useStore(Selector.elements);\n const countElementsByType = useStore(Selector.countElementsByType);\n const countSolarPanelsOnRack = useStore(Selector.countSolarPanelsOnRack);\n const getParent = useStore(Selector.getParent);\n const language = useStore(Selector.language);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const sceneRadius = useStore(Selector.sceneRadius);\n const projectView = useStore(Selector.projectView);\n\n const selectedElement = useStore((state) => {\n if (state.selectedElement === null) return null;\n return state.elements.find((e) => e.id === state.selectedElement?.id);\n });\n\n let solarPanelCount = 0;\n let solarPanelDailyYield = 0;\n let heliostatCount = 0;\n\n if (selectedElement) {\n if (selectedElement.type === ObjectType.SolarPanel) {\n solarPanelCount = countSolarPanelsOnRack(selectedElement.id);\n solarPanelDailyYield = (selectedElement as SolarPanelModel).dailyYield ?? 0;\n } else if (selectedElement.type === ObjectType.Polygon) {\n const parent = getParent(selectedElement);\n if (parent) {\n solarPanelCount = Util.countAllChildSolarPanels(parent.id);\n solarPanelDailyYield = Util.countAllChildSolarPanelDailyYields(parent.id);\n }\n } else {\n solarPanelCount = Util.countAllChildSolarPanels(selectedElement.id);\n solarPanelDailyYield = Util.countAllChildSolarPanelDailyYields(selectedElement.id);\n heliostatCount = Util.countAllChildElementsByType(selectedElement.id, ObjectType.Heliostat);\n }\n } else {\n solarPanelCount = Util.countAllSolarPanels();\n solarPanelDailyYield = Util.countAllSolarPanelDailyYields();\n heliostatCount = countElementsByType(ObjectType.Heliostat);\n }\n\n const lang = { lng: language };\n const daytime = sunlightDirection.y > 0;\n const color = daytime ? 'navajowhite' : 'antiquewhite';\n const filter = daytime\n ? 'invert(85%) sepia(45%) saturate(335%) hue-rotate(329deg) brightness(100%) contrast(101%)'\n : 'invert(95%) sepia(7%) saturate(1598%) hue-rotate(312deg) brightness(106%) contrast(96%)';\n\n // Do NOT put this in useMemo. Otherwise, it will crash the app.\n const isBuilding =\n selectedElement &&\n selectedElement.type === ObjectType.Foundation &&\n !(selectedElement as FoundationModel).notBuilding &&\n Util.getBuildingCompletionStatus(selectedElement as FoundationModel, elements) ===\n BuildingCompletionStatus.COMPLETE;\n\n return (\n \n \n \n {solarPanelCount > 0 && (\n <>\n \n {solarPanelCount}\n \n )}\n {heliostatCount > 0 && (\n <>\n \n {heliostatCount}\n \n )}\n {solarPanelDailyYield > 0 && (\n <>\n \n {solarPanelDailyYield.toFixed(1) + ' ' + i18n.t('word.kWh', lang)}\n \n )}\n {!selectedElement && (\n <>\n \n {sceneRadius * 2 + ' ' + i18n.t('word.MeterAbbreviation', lang)}\n \n )}\n {isBuilding && (\n <>\n \n \n {Util.getBuildingArea(selectedElement as FoundationModel, elements).toFixed(2) +\n ' ' +\n i18n.t('word.MeterAbbreviation', lang)}\n 2\n \n \n )}\n \n \n \n );\n};\n\nexport default React.memo(DesignInfoPanel);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEB8ttR0cqAAAA4lJREFUWIXNl0+IHEUUxn/vdfX0jOAoSQgGIoaQRRFdEwxe1j8BD5qDNxEiJje9+CcXUUTEm6gnBVFvehA9RIISIYgJGHMyugH/rGzwoiIku1Ek4mZnprrreeje3ZlJ98x0xoMfFDRV9b7vq5pXr2rg6nGDqr4OyBQc6BSx7RDC/VNyjA4WkQeAtyqGA3C5klj1o0ajsXMqA2Z2BtgvIvuqPFaIHw4hbO/1er+NMzAWIvIIMF8yNCMi3wDRUP/1qvoLcOvU4n04parPDfU1nXN7S+Z+CLzzX4oD7FHVFyeYp8CrwOZJidd/QxE5KCKrIYSPx8Rcp6r7Qgi7gbaqLpvZvJmdAvxId6pPmtmimZ0sG9wPnAWOxnF8SwXB88AlwEraTyJysHSVeRKfBr50zt0xxqS+oKrnyLdy7ZRcAxwvhE4ARypMGIPHtg18APwgIodGCQ/jRlV9iiLDVfUYYKp6WETuK0xUGbDCPMAmVX0aaNURH8bjhfizzrkDY4T729w0omtIgAvAfBRF9wAmIqWCJf3Hp1aPouhe8tU/QX6+rxATkSpTl5vN5rZxGi6O45vjOL4rhBBUFUB7vd7ZNE0XzOy2Yt554O61IDNDZKMKm1kZd8t7vws4nyTJXBRFO8nvDwAJIXzR6XSWnPd+l/f+ISArVh2p6gqwICJryZORn4QB0SiKyLKscnVZliUA3vu93vu5EEJGXnsE+B5YGrdDhwBzzj0KLFKy7VU5UcTdOU5gJJxztxdkfwKrw+JUJ6ABF4FrpzJQ4NsJxMra+1OpNhqNHcXngxMK9rfVOI5ngCRJku11tWeAT1X1MzYq4St1DDjnHiu4torIGeBtYNM44S3Aa8Ciqr7EleXz80nEVfWN/qBWq7W1MPCjqj5TwpujED0ClG6Zc26W/LodZWCp3W6XJp5zbg9wonhhlWL4aVWGc2NK8dEJOAZ0+h+l1RVlA1+ZWaqq65VQRBARzKynqqcn4BjQcRMErCNJkpe73e4SsKXVakVAGkKIO52OV9VfQwjv1uGrDRE5APxNXmQuqupy8f0HcMk5t7suZ60dMLNjwGZVvQnohRBS51wcQojN7Ls0TRfqGqgNVT0JdMkvkgvAsqqmwJtXw1f7j2Wz2dzW7XZnkyR5GAhZlgUzey9Jkp9XVlb+qss3ydEbQJqm/wC/hxBmsyzbISJfp2n6ife+U5frf4F/AW7wkmmQi1CEAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEDUIkXIExwAABSFJREFUWIWlV1tsFFUY/s6//5yZOUtnl13abrMb3KYSioCxNviAWblGMVFAwMQXeDJRX7xgxEQaecAHqJgYiI0PxhAviZoA8UWjxCgQEhrR+ECCWoVowwLa9EJwLdvZOT7MTLvby978k5PNzvn///v+y7kJNCDxeDwzOTnZC6DX87zlxWKxDQAsyyqUSqXftNYXHce5ODo6erkRv1XlwIEDkZaWlj1EdEYIoQFUHUIITUSXpJSvAUjW8i+qTVqW9XCxWDykte7RWkMIAa31VSL6EcCvAPKe50FKmQDQBeA+rfW9rutCaw0AN5j5Ddd132k4cinlYSIKIysB+NC27Q25XM6sZheLxVZLKfuJ6K/AVluW9WVnZ2dbvdgciUQ+D42J6DQz9zQaQDKZbCeigbBsRHTZNM1MbXTmk5ip5cFGgWeLbdsbAIzDD+hn27YrMlHRA1LKw8VicZ8QAvF4/JWxsbEj9YBEIpFcqVR6bJ4pLaUcZuYrhULhIwAJIcSZ7du3bzx16pRXoRmNRh8Kay6lPFRvhLlcLlJe79lDCKENw9iplFpLRFoIoU3T7KukqbWQUv4EQBuGMVgveCiLFi06thCBYOwFANu234TfD5NSyrumHTiO8wQRaSIqJRKJ3kYJAIBhGEerEHgRADKZjBmJRP4MAh2YNiai0wB00P1Ni2VZX1cjEOg8Dz8Lo6lUykZHR0cCwL9CCB2Pxx9tFpyIHieikVoEAMQBjAshdCwW20gTExM9QghLCDGSyWTONIm/1fO8k57nJQHcJKJPhZhZYIZhGGW64wDOaq1x586dTTAMYy8AzcynmwUHMAU/rf+YprkWAJRSA5jZzPaVG5imuR/+avsOSqn3AgLH/g84M0/GYrEN5ZOWZR0hovPMvLL8u1LqqYDAdQD4IGDa6K43DS6lLKbT6UfqNZRSrgtIawrA55XW1tZOpdTyBcBPAGAp5VQ6nd5x7dq1r+olUCqV3OAXsCzrffh1ertcKZlMtjPzKIAigG3h93g8vhWACz/yqa6urq31AodiWdYO+Bm4Ccuy9gV/vpiltwozy8gVQmxeunTpJmYOaz6VzWYbBgeASCTycuDjLJRSW4KTLz/rrF+ByrVcZOZiCJ5KpZoCDwicgJ/BfiSTyXYAU0II7TjOuioEwiV1q62tbWOz4Nls1iGiUQBaKbUFAEBE5+Hvzx/XIgDgFoBNzRKIRqNPBxm/nc1mHQCAaZq7g5tL0TCMZYHuPQsQ0PCbcNsc7zWkr69PMPMv8Mt4fHqiu7vbIKIh+CkOm7G7CgEthNC2ba9qhICUcn+AUVJKdVdMKqUeDS8kwYkFIvpDSqlN06wYUkrNzBML7BHzimmaDyLYuCzLeiv8XnElU0q9WygUnhFCIJlM7lm/fv0nw8PDDzAzu64LAGBmeJ7njYyM/D40NJSvE38lEX3reV4rM1/q7e1dMzg4ODlHq6enh4noHIJtMhqNPldvhAtJIpHYTER/w0/9jY6OjmW1bBxmPoegzlLKz9rb27ONAqdSKRvA6/DfFJqIrqdSqfvrMs7lciYzHy97io0D6I/FYqtr2S5evDitlHopbGoE98x6Ip8jpmnuBnAldEREmpl/YOYBwzBeYOYnAeyUUj4rpexn5m+I6HaZfoGZD+7atcuohlNVHMdpsW37VWa+XM/jNADOM/NRwzDuruW/6uN0tti2vVprnfM8bw2AFa7rtnueB2YeI6KrWusLQogLS5Ys+T6fz8/t8nnkP/P60xxqBkq1AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Space } from 'antd';\nimport { computeOutsideTemperature, getOutsideTemperatureAtMinute } from '../analysis/heatTools';\nimport dayjs from 'dayjs';\nimport { Util } from '../Util';\nimport i18n from '../i18n/i18n';\nimport { computeSunriseAndSunsetInMinutes } from '../analysis/sunTools';\nimport LocationImage from '../assets/location.png';\nimport DateImage from '../assets/date.png';\nimport ThermometerImage from '../assets/thermometer.png';\n\nconst Container = styled.div`\n position: absolute;\n top: 75px;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n`;\n\ninterface ColumnWrapperProps {\n projectView: boolean;\n}\n\nconst ColumnWrapper = styled.div`\n position: absolute;\n top: 0;\n left: ${(p) => (p.projectView ? 'calc(100vw / 2)' : 'calc(100vw / 4)')};\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: calc(100vw / 2);\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n`;\n\nexport interface SiteInfoPanelProps {\n city: string | null;\n}\n\nconst SiteInfoPanel = ({ city }: SiteInfoPanelProps) => {\n const language = useStore(Selector.language);\n const dateString = useStore(Selector.world.date);\n const address = useStore(Selector.world.address);\n const latitude = useStore(Selector.world.latitude);\n const longitude = useStore(Selector.world.longitude);\n const diurnalTemperatureModel = useStore(Selector.world.diurnalTemperatureModel);\n const weatherData = useStore(Selector.weatherData);\n const sunlightDirection = useStore(Selector.sunlightDirection);\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n const projectView = useStore(Selector.projectView);\n\n const [dailyTemperatures, setDailyTemperatures] = useState({ low: 0, high: 20 });\n const [currentTemperature, setCurrentTemperature] = useState(10);\n const now = new Date(dateString);\n const daytime = sunlightDirection.y > 0;\n const lang = { lng: language };\n\n useEffect(() => {\n if (city) {\n const weather = weatherData[city];\n if (weather) {\n const t = computeOutsideTemperature(now, weather.lowestTemperatures, weather.highestTemperatures);\n setDailyTemperatures(t);\n const c = getOutsideTemperatureAtMinute(\n t.high,\n t.low,\n diurnalTemperatureModel,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n Util.minutesIntoDay(now),\n );\n setCurrentTemperature(c);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [city, dateString]);\n\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, latitude);\n }, [dateString, latitude]);\n\n const color = daytime ? 'navajowhite' : 'antiquewhite';\n const filter = daytime\n ? 'invert(85%) sepia(45%) saturate(335%) hue-rotate(329deg) brightness(100%) contrast(101%)'\n : 'invert(95%) sepia(7%) saturate(1598%) hue-rotate(312deg) brightness(106%) contrast(96%)';\n\n return (\n \n \n \n \n {(address ?? '') +\n ' (' +\n Math.abs(latitude).toFixed(2) +\n '° ' +\n (latitude > 0 ? 'N' : 'S') +\n ', ' +\n Math.abs(longitude).toFixed(2) +\n '° ' +\n (longitude > 0 ? 'E' : 'W') +\n ')'}\n \n {dayjs(now).format('MM/DD hh:mm A')}\n \n {dailyTemperatures\n ? currentTemperature.toFixed(1) +\n '°C (' +\n i18n.t('siteInfoPanel.Low', lang) +\n ':' +\n dailyTemperatures.low.toFixed(1) +\n '°C, ' +\n i18n.t('siteInfoPanel.High', lang) +\n ': ' +\n dailyTemperatures.high.toFixed(1) +\n '°C)'\n : ''}\n \n \n \n );\n};\n\nexport default React.memo(SiteInfoPanel);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEAIi2s5tJQAAAvdJREFUWIW1l12IDWEYx3/PM+/MJLuSXfle2tCmxRVhw40oSW5FuXGhtCVX7smNwp0ouVBC8lFc+siFkojaXeurpLBaIp0255h9x8UMOzvmnJkznf3Xc/Ge93me//+8X88zQgl4nrc4CIIVQLe1tl1Vh6y174DBMvkKQ1W3A3eBAAgz7LmI7J8KbgNcqEOaZQ9835/fSvJbdYiqsWXNvQTmtELAqYzkl0VkG9AFdDmOsw44mSHmLiClmY0xvamENRHZ3cB/LfAxGSMie0sLILXvqnooL8BxnI3A70TcC0DLkE8DPiUSDVN8Oa8yeeVW1nNspKwbmJcY346TFcH11HhV0wIcx5mRHHueN1SQHN/334lMLJYxZmbTAkTEJsdBEHQWFRCGYVtybK0db1pAEATfgH+B1toNRQXUarX1YTixW9ba0aKxSbjAeyYO0pjrussLxr1l8iHsKSMA4GIq0TNgVk7MpVTMACWvIaq6I5Xsb8HZnOG+AriZ4X+sEUfevXaB18CSjLknwFPgF7Aa6AO8lM840RvwMoenPlT1MMWrYNqulSZOYDqp972oGWPqvoBNQUT2lRBwviXkCTxsgvwbMLvVAnqp33xMMhHZ02pyAIwxBwsIuDgl5AlcaUA+DPhTwur7/kKibZgGDGWQV+IOqtN13WUtIXVdtwc4Crwh6nJGgCWe53UD31MCdsVh90QkJGpmzjqOU7iI/UNbW9tM4BzRSzYOnBGRLcACohXAcZxN8Vyoqv1xqABzgU2x8M+xuDvxnymEdhF5HAd+Ajoa+B4ATufkexDnGgHyq6mq7mRiWb+q6i7AyQ3MgDFmDVE1/Jvv+H8+6R+sta+I7rsPdFhrbxAduvvAgIi8DsOw4nnel1qtVgVC3/dNtVqdTbR6S8Mw7AH6giDoS6V/VFT8VuADje/7GPAztkqObwXop0l0quoRorJb72M0z4aBEzTY+6J9/iJV7bXWriZqr7qAGcQ3QlV/W2t/AKPAgKoOWmsHYgEN8QfFcGW2NEnqrQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEBEGhyLIZgAAAzBJREFUWIXN1luIVWUUB/CfepzGSZ1M50Xpihk4EQRRD01B4JRFRS9B9RCGYg9Jl4cis0iGsHmIovTJF7OHbi/ShR6CLIrASzHeRgeiCwaVQmWheTlNp4f17WZ73NtzmSP1h81Ze529vvX/1re+tRb/MaaV6OfgNvyMEy2udzdO4kgzBlPS71xcmOS/sBAfYQm+RaVJAlV8hzV4M2d3DD+WGV2NX1DLPUP4A+vq9I2e+3EY6/FnTn8Sy4qcV0TIjuDhXAT+xiyMpkVrTUZgFH34Ldl1J/1qrMRrRUZD2Fqn68fnuLJJxxlm4jMM1unfxxdFBhWx2/ozHsWNLTqHo7ipQH+RONIzMFUkYrUNZ63gcPJ1BiqCdT82nSPnU3AV9pQRqIp7f/s5InAKszFeRuACbFd8dp3CtkSikABnv2aXYT5+wE+4Tuxqp6ghs7ALPVgkaspY3RpTz+Zjrbg6ZXhJVLIhXJ7kb9Alruox3IAHk/xWwRoHMNIugW704jyRUL1i18S97xU9oEvk0oyCNdbgmaLFm6nxJ5zekH7PyUdz8rg4GrgG1+J6Efq9+KTMwVqnR6AbX+GgOP8nk/wULknyl5iOD9L70mQ7gN3J6XF8j0OJaA37cGfeeVEEqnhFJNWv+FRUsRFR49eJRjMuakdf2uEjyW4/7sOHJqpfD27Gs3gPD2FjWQTawQNihy+aaPFleC59e28ZgYpImmExJ9ya5KViZhgWCTU9fd8ncmRLA8dzRc2BzclmZlF9niaK0iDOF8PJIK4QoRxM/2fT1GNJXt6AwFa8nuTHxa1axeSPYAzv1OkuNTELwBsi7AM53UYxPRnCx206nyGKT373XaKdj4joPZGc31Vnew9qWTPqx6MtOh8X1yq7LRlOJUJb8HXSrRbZn8cYkXBv45Y2CFTFmHVc7DqPbViMDYnccIH9ghb9leKgyOpWsV4MKpPGC+I45rVg0y1K+vOdIDBPnHtRFyzDZpGYczpBgKhqNbyqcSV8OX27rFPOMzydFj6AO0ShydAjmtCO9M2KTjvPMCCmo5poRNvTe9YN9yZy/6JRuCZDZAkuTo4P4d1E6P+FfwC6bc62I7I0pgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVEBsiQc7EPQAAA4ZJREFUWIXV13+o32MUB/DXve4Wd4ZizFiMDRm7iYVhsj9QQstiasuv/Ejijxkp1krRyG1Lm0z5hygpTJrZsC0rsebXwmzpdpOw6zczM/frj3M+vs/99mXbvd+tdurb85znOZ9z3s855znP+bKf0uF4CB9gIxbjhH1l/Hj0oIaP8X7Ot2HKvgCwDn9jWrF2Gr7O34i9aXyiOO2dTfYuyr3pe6KwfQ8BjM3xHAxr2Ks8Mn6wAI7AuIb94Til4Gs5/lHMK/ozx7Ymdk7EMhz0fwBOx7tYhalYgrV4tAmAo0QeTMcNaXRUg8x5Ijdgh8iNHclPEeEcQIvz41oqeybn36p74ZJcuy9BVvI34eqcz03Zx7Al5xNxKY5DB37DLMnASKzEwbg20Q7DZwnkr5Trz/FMbC/AdxWnq2iO8OJC3JVr23B/eqanBPCCuNPXJf8ODsSklFmFy/BL7q/DD4Wx7bk2x8DcOKkwDp3oFvmgAvAsLhAump0ojxFuejuVwGvpDeIWrCkUt+PcnB+KDal3lOY0FfdgQjsW4VdsTgDvpdDORP9A8gvxYc43GhiCfnyS899xL14R+dOMvsJSzO8QpfRGfCPcfj5uxc15qqdELizLkxMeKpW3qdeInSKf4EnchpML2RXF/r85sFy4d1aeZqlw/bz0wlkiETsLI41UrVV1YCauyQPdjtHYhOdFaOdifVkHXsyxX1S1rpxvQG/uVQnW1wCihq0NgMaJxO7DgyK0i1Jui3w9O4oPekWNf0s8KndgjChQ1RWr4j6pwWCbetGpKuLDxf4ZeAIv4WcR3kHRLeK014uErQrRI8LVNTze5LsD1HNk0HRFGvhcXLsZBYAFKfNm8ncP1VgjjRUP0KeiahKJWgFYKe4/cVtq4i1oGT2dSseLvFlbGK9+m8X17MRPWN8q4yNE8r2c/JImxqvf6pSZl/yEVgDoSmWzRex/TP57XIzJ4vQViDHFNzN2pbxjVwLqsd0qGopDkv8Ib+R8hXondLSoquW3QwLQl+Oxos734UicLe5zH64q5HsKMH1aQMNF8Vid/Hz/nQNVNe1Ofsh3v6IFqbB6jJ5rYnyNuAGjReV8vVXG4TAR1+/U3XuhKLfduDLXRoq3o2ZgM9sSmiyalapPaOxwZybImugP9wqdKtq1yu29+LLgN4k/KLtNzXr43aFpuFx0ux34QsT8VdGu7z/0Dzx9+SSHmHZ4AAAAAElFTkSuQmCC\"","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { InputNumber, Space } from 'antd';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst Container = styled.div`\n position: absolute;\n left: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding: 0;\n opacity: 100%;\n user-select: none;\n z-index: 7; // must be less than other panels\n`;\n\nconst ColumnWrapper = styled.div`\n background: #282c34;\n position: absolute;\n top: 0;\n left: calc(100vw / 2 - 100px);\n align-self: center;\n align-content: center;\n align-items: center;\n margin: 0;\n width: 200px;\n display: flex;\n font-size: 12px;\n flex-direction: column;\n opacity: 100%;\n`;\n\nconst VisualizationControlPanel = () => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const solarRadiationHeatmapMaxValue = useStore(Selector.viewState.solarRadiationHeatmapMaxValue);\n const showSiteInfoPanel = useStore(Selector.viewState.showSiteInfoPanel);\n const heatFluxScaleFactor = useStore(Selector.viewState.heatFluxScaleFactor);\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\n\n const lang = { lng: language };\n\n return (\n \n \n \n {i18n.t('visualizationControlPanel.ColorContrast', lang) + ':'}\n {\n setCommonStore((state) => {\n state.viewState.solarRadiationHeatMapMaxValue = value;\n });\n }}\n />\n {showHeatFluxes && (\n <>\n {i18n.t('visualizationControlPanel.FluxScale', lang) + ':'}\n {\n setCommonStore((state) => {\n state.viewState.heatFluxScaleFactor = value;\n });\n }}\n />\n \n )}\n \n \n \n );\n};\n\nexport default React.memo(VisualizationControlPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space, Table } from 'antd';\nimport { ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport { screenshot, showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { HumanData } from '../HumanData';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\nimport { Z_INDEX_FRONT_PANEL } from '../constants';\n\nconst { Column } = Table;\n\nconst Container = styled.div`\n position: fixed;\n top: 90px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 8;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst VisibilityResultsPanel = () => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const panelRect = useStore(Selector.viewState.visibilityResultsPanelRect);\n const solarPanelVisibilityResults = useDataStore(Selector.solarPanelVisibilityResults);\n const countObservers = useStore(Selector.countObservers);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 570;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [resultArray, setResultArray] = useState([]);\n\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.visibilityResultsPanelRect) {\n state.viewState.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\n }\n state.viewState.visibilityResultsPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.visibilityResultsPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (solarPanelVisibilityResults) {\n const arr: any[] = [];\n solarPanelVisibilityResults.forEach((result, vantage) => {\n let total = 0;\n let fieldString = '';\n let count = 0;\n result.forEach((visibility, field) => {\n count++;\n total += visibility;\n fieldString += visibility.toFixed(2) + ', ';\n });\n arr.push({\n key: vantage.observer.id,\n observer: HumanData.fetchLabel(vantage.observer.name, lang),\n vantage:\n '(' +\n vantage.position.x.toFixed(1) +\n ', ' +\n vantage.position.y.toFixed(1) +\n ', ' +\n vantage.position.z.toFixed(1) +\n ') ' +\n i18n.t('word.MeterAbbreviation', lang),\n total: total.toFixed(2),\n itemized: count > 1 ? fieldString.substring(0, fieldString.length - 2) : '---',\n });\n });\n setResultArray(arr);\n }\n }, [solarPanelVisibilityResults, language]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.visibilityResultsPanelRect) {\n state.viewState.visibilityResultsPanelRect = new Rectangle(0, 0, 600, 470);\n }\n state.viewState.visibilityResultsPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.visibilityResultsPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showSolarPanelVisibilityResultsPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Visibility Results Panel',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'visibilityResultsPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('visibilityPanel.SolarPanelVisibility', lang) + ' — ' + moment(now).format('h:mm A MM/DD')}\n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n \n \n \n \n\n \n }\n title={i18n.t('word.Update', lang)}\n onClick={() => {\n const observerCount = countObservers();\n if (observerCount === 0) {\n showInfo(i18n.t('analysisManager.NoObserverForVisibilityAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runSolarPanelVisibilityAnalysis = true;\n });\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Visibility Analysis For Solar Panels',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('visibility-results-table', 'visibility-results', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n });\n }}\n />\n \n \n \n \n );\n};\n\nexport default React.memo(VisibilityResultsPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyParabolicTroughYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyParabolicTroughYieldPanel = ({ city }: YearlyParabolicTroughYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.cspDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyParabolicTroughYield);\n const individualOutputs = useStore(Selector.yearlyParabolicTroughIndividualOutputs);\n const parabolicTroughLabels = useDataStore(Selector.parabolicTroughLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyParabolicTroughYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const troughSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n troughSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n troughSumRef.current.set(prop, (troughSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyParabolicTroughYieldPanelRect) {\n state.viewState.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyParabolicTroughYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyParabolicTroughYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyParabolicTroughYieldPanelRect) {\n state.viewState.yearlyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyParabolicTroughYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyParabolicTroughYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyParabolicTroughYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Parabolic Trough Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const parabolicTroughCount = countElementsByType(ObjectType.ParabolicTrough);\n useEffect(() => {\n if (parabolicTroughCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyParabolicTroughIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parabolicTroughCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('parabolicTroughYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyParabolicTroughYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('parabolicTroughYieldPanel.ParabolicTroughYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={parabolicTroughLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && parabolicTroughCount > 1 && troughSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === troughSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('parabolicTroughYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n {parabolicTroughCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (parabolicTroughCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyParabolicTroughIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Parabolic Troughs: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicTroughs = true;\n state.pauseYearlySimulationForParabolicTroughs = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (parabolicTroughCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Parabolic Troughs',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicTroughs = true;\n state.pauseYearlySimulationForParabolicTroughs = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-parabolic-trough-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Parabolic Trough Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-parabolic-trough-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Parabolic Trough Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyParabolicTroughYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyParabolicTroughYieldPanelProps {\n city: string | null;\n}\n\nconst DailyParabolicTroughYieldPanel = ({ city }: DailyParabolicTroughYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyParabolicTroughYield);\n const individualOutputs = useStore(Selector.dailyParabolicTroughIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyParabolicTroughYieldPanelRect);\n const parabolicTroughLabels = useDataStore(Selector.parabolicTroughLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const troughSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n troughSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n troughSumRef.current.set(prop, (troughSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyParabolicTroughYieldPanelRect) {\n state.viewState.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyParabolicTroughYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyParabolicTroughYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyParabolicTroughYieldPanelRect) {\n state.viewState.dailyParabolicTroughYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyParabolicTroughYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyParabolicTroughYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyParabolicTroughYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Parabolic Trough Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const parabolicTroughCount = countElementsByType(ObjectType.ParabolicTrough);\n useEffect(() => {\n if (parabolicTroughCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyParabolicTroughIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parabolicTroughCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('parabolicTroughYieldPanel.YieldPerHour', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyParabolicTroughYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('parabolicTroughYieldPanel.ParabolicTroughDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && parabolicTroughCount > 1 && troughSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === troughSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('parabolicTroughYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n {parabolicTroughCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (parabolicTroughCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyParabolicTroughIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Parabolic Troughs: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicTroughs = true;\n state.pauseDailySimulationForParabolicTroughs = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (parabolicTroughCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicTroughForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Parabolic Troughs',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicTroughs = true;\n state.pauseDailySimulationForParabolicTroughs = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-parabolic-trough-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Parabolic Trough Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-parabolic-trough-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Parabolic Trough Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyParabolicTroughYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyParabolicDishYieldPanelProps {\n city: string | null;\n}\n\nconst DailyParabolicDishYieldPanel = ({ city }: DailyParabolicDishYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyParabolicDishYield);\n const individualOutputs = useStore(Selector.dailyParabolicDishIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyParabolicDishYieldPanelRect);\n const parabolicDishLabels = useDataStore(Selector.parabolicDishLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const dishSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n dishSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n dishSumRef.current.set(prop, (dishSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyParabolicDishYieldPanelRect) {\n state.viewState.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyParabolicDishYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyParabolicDishYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyParabolicDishYieldPanelRect) {\n state.viewState.dailyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyParabolicDishYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyParabolicDishYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyParabolicDishYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Parabolic Dish Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const parabolicDishCount = countElementsByType(ObjectType.ParabolicDish);\n useEffect(() => {\n if (parabolicDishCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyParabolicDishIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parabolicDishCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('parabolicDishYieldPanel.YieldPerHour', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyParabolicDishYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('parabolicDishYieldPanel.ParabolicDishDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && parabolicDishCount > 1 && dishSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === dishSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('parabolicDishYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n {parabolicDishCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (parabolicDishCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyParabolicDishIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Parabolic Dishes: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicDishes = true;\n state.pauseDailySimulationForParabolicDishes = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (parabolicDishCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Parabolic Dishes',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicDishes = true;\n state.pauseDailySimulationForParabolicDishes = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-parabolic-dish-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Parabolic Dish Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-parabolic-dish-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Parabolic Dish Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyParabolicDishYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyParabolicDishYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyParabolicDishYieldPanel = ({ city }: YearlyParabolicDishYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.cspDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyParabolicDishYield);\n const individualOutputs = useStore(Selector.yearlyParabolicDishIndividualOutputs);\n const parabolicDishLabels = useDataStore(Selector.parabolicDishLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyParabolicDishYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const dishSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n dishSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n dishSumRef.current.set(prop, (dishSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyParabolicDishYieldPanelRect) {\n state.viewState.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyParabolicDishYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyParabolicDishYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyParabolicDishYieldPanelRect) {\n state.viewState.yearlyParabolicDishYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyParabolicDishYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyParabolicDishYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyParabolicDishYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Parabolic Dish Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const parabolicDishCount = countElementsByType(ObjectType.ParabolicDish);\n useEffect(() => {\n if (parabolicDishCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyParabolicDishIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parabolicDishCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('parabolicDishYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyParabolicDishYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('parabolicDishYieldPanel.ParabolicDishYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={parabolicDishLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && parabolicDishCount > 1 && dishSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === dishSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('parabolicDishYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n {parabolicDishCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (parabolicDishCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyParabolicDishIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Parabolic Dishes: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicDishes = true;\n state.pauseYearlySimulationForParabolicDishes = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (parabolicDishCount === 0) {\n showInfo(i18n.t('analysisManager.NoParabolicDishForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Parabolic Dishes',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicDishes = true;\n state.pauseYearlySimulationForParabolicDishes = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-parabolic-dish-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Parabolic Dish Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-parabolic-dish-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Parabolic Dish Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyParabolicDishYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyFresnelReflectorYieldPanelProps {\n city: string | null;\n}\n\nconst DailyFresnelReflectorYieldPanel = ({ city }: DailyFresnelReflectorYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyFresnelReflectorYield);\n const individualOutputs = useStore(Selector.dailyFresnelReflectorIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyFresnelReflectorYieldPanelRect);\n const fresnelReflectorLabels = useDataStore(Selector.fresnelReflectorLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const reflectorSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n reflectorSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n reflectorSumRef.current.set(prop, (reflectorSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyFresnelReflectorYieldPanelRect) {\n state.viewState.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyFresnelReflectorYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyFresnelReflectorYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyFresnelReflectorYieldPanelRect) {\n state.viewState.dailyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyFresnelReflectorYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyFresnelReflectorYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyFresnelReflectorYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Fresnel Reflector Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const fresnelReflectorCount = countElementsByType(ObjectType.FresnelReflector);\n useEffect(() => {\n if (fresnelReflectorCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyFresnelReflectorIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fresnelReflectorCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('fresnelReflectorYieldPanel.YieldPerHour', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyFresnelReflectorYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('fresnelReflectorYieldPanel.FresnelReflectorDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && fresnelReflectorCount > 1 && reflectorSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === reflectorSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('fresnelReflectorYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n {fresnelReflectorCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (fresnelReflectorCount === 0) {\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyFresnelReflectorIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Fresnel Reflectors: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForFresnelReflectors = true;\n state.pauseDailySimulationForFresnelReflectors = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (fresnelReflectorCount === 0) {\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Fresnel Reflectors',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForFresnelReflectors = true;\n state.pauseDailySimulationForFresnelReflectors = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-fresnel-reflector-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Fresnel Reflector Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-fresnel-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Fresnel Reflector Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyFresnelReflectorYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyFresnelReflectorYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyFresnelReflectorYieldPanel = ({ city }: YearlyFresnelReflectorYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.cspDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyFresnelReflectorYield);\n const individualOutputs = useStore(Selector.yearlyFresnelReflectorIndividualOutputs);\n const fresnelReflectorLabels = useDataStore(Selector.fresnelReflectorLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyFresnelReflectorYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const reflectorSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n reflectorSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n reflectorSumRef.current.set(prop, (reflectorSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyFresnelReflectorYieldPanelRect) {\n state.viewState.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyFresnelReflectorYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyFresnelReflectorYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyFresnelReflectorYieldPanelRect) {\n state.viewState.yearlyFresnelReflectorYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyFresnelReflectorYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyFresnelReflectorYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyFresnelReflectorYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Fresnel Reflector Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const fresnelReflectorCount = countElementsByType(ObjectType.FresnelReflector);\n useEffect(() => {\n if (fresnelReflectorCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyFresnelReflectorIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fresnelReflectorCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('fresnelReflectorYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyFresnelReflectorYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('fresnelReflectorYieldPanel.FresnelReflectorYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={fresnelReflectorLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && fresnelReflectorCount > 1 && reflectorSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === reflectorSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('fresnelReflectorYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n {fresnelReflectorCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (fresnelReflectorCount === 0) {\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyFresnelReflectorIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Fresnel Reflectors: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForFresnelReflectors = true;\n state.pauseYearlySimulationForFresnelReflectors = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (fresnelReflectorCount === 0) {\n showInfo(i18n.t('analysisManager.NoFresnelReflectorForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Fresnel Reflectors',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForFresnelReflectors = true;\n state.pauseYearlySimulationForFresnelReflectors = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-fresnel-reflector-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Fresnel Reflector Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-fresnel-reflector-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Fresnel Reflector Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyFresnelReflectorYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyHeliostatYieldPanelProps {\n city: string | null;\n}\n\nconst DailyHeliostatYieldPanel = ({ city }: DailyHeliostatYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countElementsByType = useStore(Selector.countElementsByType);\n const dailyYield = useDataStore(Selector.dailyHeliostatYield);\n const individualOutputs = useStore(Selector.dailyHeliostatIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyHeliostatYieldPanelRect);\n const heliostatLabels = useDataStore(Selector.heliostatLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const heliostatSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n heliostatSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n heliostatSumRef.current.set(prop, (heliostatSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyHeliostatYieldPanelRect) {\n state.viewState.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyHeliostatYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyHeliostatYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyHeliostatYieldPanelRect) {\n state.viewState.dailyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.dailyHeliostatYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyHeliostatYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyHeliostatYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Heliostat Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const heliostatCount = countElementsByType(ObjectType.Heliostat);\n useEffect(() => {\n if (heliostatCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyHeliostatIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [heliostatCount, individualOutputs]);\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('heliostatYieldPanel.YieldPerHour', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyHeliostatYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('heliostatYieldPanel.HeliostatDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {individualOutputs && heliostatCount > 1 && heliostatSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === heliostatSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('heliostatYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n {heliostatCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (heliostatCount === 0) {\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyHeliostatIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Heliostats: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForHeliostats = true;\n state.pauseDailySimulationForHeliostats = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (heliostatCount === 0) {\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Heliostats',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForHeliostats = true;\n state.pauseDailySimulationForHeliostats = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-heliostat-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Heliostat Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-heliostat-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Heliostat Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyHeliostatYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, ObjectType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Switch, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport {\n CameraOutlined,\n CaretRightOutlined,\n ReloadOutlined,\n SaveOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyHeliostatYieldPanelProps {\n city: string | null;\n}\n\nconst YearlyHeliostatYieldPanel = ({ city }: YearlyHeliostatYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.cspDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyHeliostatYield);\n const individualOutputs = useStore(Selector.yearlyHeliostatIndividualOutputs);\n const heliostatLabels = useDataStore(Selector.heliostatLabels);\n const countElementsByType = useStore(Selector.countElementsByType);\n const panelRect = useStore(Selector.viewState.yearlyHeliostatYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const heliostatSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n heliostatSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n heliostatSumRef.current.set(prop, (heliostatSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyHeliostatYieldPanelRect) {\n state.viewState.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyHeliostatYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyHeliostatYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyHeliostatYieldPanelRect) {\n state.viewState.yearlyHeliostatYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyHeliostatYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyHeliostatYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyHeliostatYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Heliostat Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const heliostatCount = countElementsByType(ObjectType.Heliostat);\n useEffect(() => {\n if (heliostatCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyHeliostatIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [heliostatCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('heliostatYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyHeliostatYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('heliostatYieldPanel.HeliostatYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={heliostatLabels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {individualOutputs && heliostatCount > 1 && heliostatSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === heliostatSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('heliostatYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n {heliostatCount > 1 && (\n }\n unCheckedChildren={}\n checked={individualOutputs}\n onChange={(checked) => {\n if (heliostatCount === 0) {\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyHeliostatIndividualOutputs = checked;\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Heliostats: ' + (checked ? 'Individual' : 'Total'),\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForHeliostats = true;\n state.pauseYearlySimulationForHeliostats = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (heliostatCount === 0) {\n showInfo(i18n.t('analysisManager.NoHeliostatForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Heliostats',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForHeliostats = true;\n state.pauseYearlySimulationForHeliostats = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-heliostat-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Heliostat Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-heliostat-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Heliostat Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyHeliostatYieldPanel);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n CartesianGrid,\n Label,\n Legend,\n Line,\n LineChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { createSymbol, SYMBOLS } from './symbols';\nimport { PRESET_COLORS } from '../constants';\nimport { DatumEntry } from '../types';\nimport { CurveType } from 'recharts/types/shape/Curve';\n\nexport interface SutBiaxialLineGraphProps {\n dataSource: DatumEntry[];\n height: number;\n dataKeyAxisX?: string;\n labelX?: string;\n labelY1?: string;\n labelY2?: string;\n unitX?: string;\n unitY1?: string;\n unitY2?: string;\n yMin1?: string | number;\n yMax1?: string | number;\n yMin2?: string | number;\n yMax2?: string | number;\n curveType?: CurveType;\n referenceX?: number | string;\n fractionDigits?: number;\n symbolCount?: number;\n}\n\nconst SutBiaxialLineGraph = ({\n dataSource,\n height,\n dataKeyAxisX,\n labelX,\n labelY1,\n labelY2,\n unitX,\n unitY1,\n unitY2,\n yMin1 = 'auto',\n yMax1 = 'auto',\n yMin2 = 'auto',\n yMax2 = 'auto',\n curveType = 'linear',\n referenceX,\n fractionDigits = 2,\n symbolCount = 12,\n}: SutBiaxialLineGraphProps) => {\n const [lineCount, setLineCount] = useState(0);\n const [legendDataKey, setLegendDataKey] = useState(null);\n const horizontalGridLines = true;\n const verticalGridLines = true;\n const lineWidth = 2;\n const symbolSize = 1;\n\n //init\n useEffect(() => {\n if (!dataSource || dataSource.length === 0) {\n return;\n }\n let len = Array.isArray(dataSource) ? Object.keys(dataSource[0]).length - 1 : Object.keys(dataSource).length - 1;\n len--; // subtract one because the first one is the ambient temperature, which is shared among SUTs\n if (lineCount !== len / 2) {\n setLineCount(len / 2);\n }\n }, [dataSource]);\n\n const getLines = useMemo(() => {\n const lines = [];\n let defaultSymbol;\n lines.push(\n ,\n );\n for (let i = 0; i < lineCount; i++) {\n let name = 'T_Tower' + (i + 1);\n let opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n let symbol = createSymbol(SYMBOLS[2 * i], symbolSize, symbolCount, opacity);\n if (i === 0) defaultSymbol = symbol;\n const isMeasured = name.startsWith('Measured');\n lines.push(\n 0 ? (symbol ? symbol : defaultSymbol) : false}\n isAnimationActive={false}\n />,\n );\n name = 'V_Tower' + (i + 1);\n opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n symbol = createSymbol(SYMBOLS[2 * i + 1], symbolSize, symbolCount, opacity);\n lines.push(\n 0 ? (symbol ? symbol : defaultSymbol) : false}\n isAnimationActive={false}\n />,\n );\n }\n return lines;\n }, [curveType, lineCount, lineWidth, symbolCount, symbolSize, legendDataKey]);\n\n // @ts-ignore\n const onMouseDown = () => {};\n\n // @ts-ignore\n const onMouseEnterLegend = (o) => {\n setLegendDataKey(o.dataKey);\n };\n\n // @ts-ignore\n const onMouseLeaveLegend = () => {\n setLegendDataKey(null);\n };\n\n return (\n <>\n {dataSource && (\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\n \n \n \n \n value.toFixed(fractionDigits)} />\n \n \n \n \n \n \n \n \n \n \n {getLines}\n {lineCount > 1 && (\n \n )}\n \n \n \n \n )}\n \n );\n};\n\nexport default SutBiaxialLineGraph;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, SolarStructure } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport SutBiaxialLineGraph from '../components/sutBiaxialLineGraph';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailySolarUpdraftTowerYieldPanelProps {\n city: string | null;\n}\n\nconst DailySolarUpdraftTowerYieldPanel = ({ city }: DailySolarUpdraftTowerYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const countSolarStructuresByType = useStore(Selector.countSolarStructuresByType);\n const dailyYield = useDataStore(Selector.dailyUpdraftTowerYield);\n const dailyResults = useDataStore(Selector.dailyUpdraftTowerResults);\n const individualOutputs = useStore(Selector.dailyUpdraftTowerIndividualOutputs);\n const panelRect = useStore(Selector.viewState.dailyUpdraftTowerYieldPanelRect);\n const updraftTowerLabels = useDataStore(Selector.updraftTowerLabels);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 650;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const towerSumRef = useRef(new Map());\n\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n towerSumRef.current.clear();\n for (const datum of dailyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Hour') {\n s += datum[prop] as number;\n towerSumRef.current.set(prop, (towerSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dailyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyUpdraftTowerYieldPanelRect) {\n state.viewState.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\n }\n state.viewState.dailyUpdraftTowerYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyUpdraftTowerYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyUpdraftTowerYieldPanelRect) {\n state.viewState.dailyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 640, 550);\n }\n state.viewState.dailyUpdraftTowerYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyUpdraftTowerYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyUpdraftTowerYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Updraft Tower Daily Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const towerCount = countSolarStructuresByType(SolarStructure.UpdraftTower);\n useEffect(() => {\n if (towerCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.dailyUpdraftTowerIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [towerCount, individualOutputs]);\n\n const labelHour = i18n.t('word.Hour', lang);\n const labelYield = i18n.t('updraftTowerYieldPanel.YieldPerHour', lang);\n const labelTemperature = i18n.t('updraftTowerYieldPanel.ChimneyAirTemperature', lang);\n const labelSpeed = i18n.t('updraftTowerYieldPanel.ChimneyWindSpeed', lang);\n const emptyGraph = dailyYield && dailyYield[0] ? Object.keys(dailyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailySolarUpdraftTowerYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('updraftTowerYieldPanel.UpdraftTowerDailyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n {!simulationInProgress && (\n \n {towerCount > 1 && towerSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {e[1].toFixed(3)}\n \n {i === towerSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) + ': ' + sum.toFixed(3) + ' ' + i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('updraftTowerYieldPanel.DailyTotal', lang)}:{sum.toFixed(2)} {i18n.t('word.kWh', lang)}\n \n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (towerCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarUpdraftTowerForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Simulation For Solar Updraft Tower',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForUpdraftTower = true;\n state.pauseDailySimulationForUpdraftTower = false;\n state.simulationInProgress = true;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelHour + '-' + labelYield, 'daily-updraft-tower-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Updraft Tower Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {dailyYield && dailyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(dailyYield, 'daily-updraft-tower-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Updraft Tower Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailySolarUpdraftTowerYieldPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport { ChartType, DiurnalTemperatureModel, GraphDataType } from '../types';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { Util } from '../Util';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport i18n from '../i18n/i18n';\nimport {\n getGroundTemperatureAtMinute,\n computeOutsideTemperature,\n getOutsideTemperatureAtMinute,\n} from '../analysis/heatTools';\nimport { computeSunriseAndSunsetInMinutes } from '../analysis/sunTools';\nimport dayjs from 'dayjs';\nimport { Radio, Space } from 'antd';\nimport { Rectangle } from '../models/Rectangle';\nimport { DEFAULT_FOUNDATION_SLAB_DEPTH, FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { Undoable } from '../undo/Undoable';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n left: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 10;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DiurnalTemperaturePanelProps {\n city: string | null;\n}\n\nconst DiurnalTemperaturePanel = ({ city }: DiurnalTemperaturePanelProps) => {\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const now = new Date(useStore(Selector.world.date));\n const latitude = useStore(Selector.world.latitude);\n const ground = useStore(Selector.world.ground);\n const diurnalTemperatureModel =\n useStore(Selector.world.diurnalTemperatureModel) ?? DiurnalTemperatureModel.Sinusoidal;\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n const getWeather = useStore(Selector.getWeather);\n const panelRect = useStore(Selector.viewState.diurnalTemperaturePanelRect);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.min(panelRect.x, window.innerWidth - wOffset) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [selectedModel, setSelectedModel] = useState(diurnalTemperatureModel);\n const lang = { lng: language };\n\n useEffect(() => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.min(panelRect?.x, window.innerWidth - wOffset),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.diurnalTemperaturePanelRect) {\n state.viewState.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.diurnalTemperaturePanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.diurnalTemperaturePanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const getData = useMemo(() => {\n const result = [];\n if (city) {\n const weather = getWeather(city);\n if (weather) {\n const sunMinutes = computeSunriseAndSunsetInMinutes(now, latitude);\n for (let i = 0; i < 24; i++) {\n now.setHours(i);\n const t = computeOutsideTemperature(now, weather.lowestTemperatures, weather.highestTemperatures);\n const m = Util.minutesIntoDay(now);\n result.push({\n Hour: i,\n Sinusoidal: getOutsideTemperatureAtMinute(\n t.high,\n t.low,\n DiurnalTemperatureModel.Sinusoidal,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n m,\n ),\n PartonLogan: getOutsideTemperatureAtMinute(\n t.high,\n t.low,\n DiurnalTemperatureModel.PartonLogan,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n m,\n ),\n Ground: getGroundTemperatureAtMinute(\n latitude,\n Util.dayOfYear(now),\n m,\n weather.lowestTemperatures,\n weather.highestTemperatures,\n highestTemperatureTimeInMinutes,\n 0.5 * (t.high - t.low),\n ground.thermalDiffusivity ?? 0.05,\n DEFAULT_FOUNDATION_SLAB_DEPTH,\n ),\n });\n }\n }\n }\n return result;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [city, highestTemperatureTimeInMinutes, diurnalTemperatureModel, now.getMonth(), now.getDate()]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.min(ui.x, window.innerWidth - wOffset),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.diurnalTemperaturePanelRect) {\n state.viewState.diurnalTemperaturePanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.diurnalTemperaturePanelRect.x = Math.min(ui.x, window.innerWidth - wOffset);\n state.viewState.diurnalTemperaturePanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n const undoable = {\n name: 'Close Diurnal Temperature Panel',\n timestamp: Date.now(),\n undo: () => {\n setCommonStore((state) => {\n state.viewState.showDiurnalTemperaturePanel = true;\n });\n },\n redo: () => {\n setCommonStore((state) => {\n state.viewState.showDiurnalTemperaturePanel = false;\n });\n },\n } as Undoable;\n addUndoable(undoable);\n setCommonStore((state) => {\n state.viewState.showDiurnalTemperaturePanel = false;\n });\n };\n\n const onChangeModel = (e: any) => {\n const oldModel = selectedModel;\n const newModel = e.target.value;\n const undoableChange = {\n name: 'Change Diurnal Temperature Model',\n timestamp: Date.now(),\n oldValue: oldModel,\n newValue: newModel,\n undo: () => {\n setSelectedModel(undoableChange.oldValue as DiurnalTemperatureModel);\n setCommonStore((state) => {\n state.world.diurnalTemperatureModel = undoableChange.oldValue as DiurnalTemperatureModel;\n });\n },\n redo: () => {\n setSelectedModel(undoableChange.newValue as DiurnalTemperatureModel);\n setCommonStore((state) => {\n state.world.diurnalTemperatureModel = undoableChange.newValue as DiurnalTemperatureModel;\n });\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setSelectedModel(newModel);\n setCommonStore((state) => {\n state.world.diurnalTemperatureModel = newModel;\n });\n };\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'diurnalTemperaturePanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('menu.settings.DiurnalTemperature', lang) + ': ' + city + ' | ' + dayjs(now).format('MM/DD')}\n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n \n {i18n.t('diurnalTemperaturePanel.SelectAirTemperatureModel', lang)}\n \n \n {i18n.t('diurnalTemperaturePanel.Sinusoidal', lang)}\n \n Parton-Logan\n \n \n \n \n \n );\n};\n\nexport default React.memo(DiurnalTemperaturePanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport LineGraph from '../components/lineGraph';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { ChartType, GraphDataType, SolarStructure } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Col, Row, Space, Popover } from 'antd';\nimport { saveCsv, screenshot, showInfo } from '../helpers';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 85px;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlySolarUpdraftTowerYieldPanelProps {\n city: string | null;\n}\n\nconst YearlySolarUpdraftTowerYieldPanel = ({ city }: YearlySolarUpdraftTowerYieldPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const daysPerYear = useStore(Selector.world.sutDaysPerYear) ?? 6;\n const now = new Date(useStore(Selector.world.date));\n const yearlyYield = useDataStore(Selector.yearlyUpdraftTowerYield);\n const individualOutputs = useStore(Selector.yearlyUpdraftTowerIndividualOutputs);\n const labels = useDataStore(Selector.updraftTowerLabels);\n const countSolarStructuresByType = useStore(Selector.countSolarStructuresByType);\n const panelRect = useStore(Selector.viewState.yearlyUpdraftTowerYieldPanelRect);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [sum, setSum] = useState(0);\n const towerSumRef = useRef(new Map());\n\n const referenceX = MONTHS[now.getMonth()];\n const lang = { lng: language };\n\n useEffect(() => {\n let s = 0;\n towerSumRef.current.clear();\n for (const datum of yearlyYield) {\n for (const prop in datum) {\n if (datum.hasOwnProperty(prop)) {\n if (prop !== 'Month') {\n s += datum[prop] as number;\n towerSumRef.current.set(prop, (towerSumRef.current.get(prop) ?? 0) + (datum[prop] as number));\n }\n }\n }\n }\n setSum(s);\n }, [yearlyYield]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyUpdraftTowerYieldPanelRect) {\n state.viewState.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyUpdraftTowerYieldPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyUpdraftTowerYieldPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyUpdraftTowerYieldPanelRect) {\n state.viewState.yearlyUpdraftTowerYieldPanelRect = new Rectangle(0, 0, 600, 400);\n }\n state.viewState.yearlyUpdraftTowerYieldPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyUpdraftTowerYieldPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyUpdraftTowerYieldPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Updraft Tower Yearly Yield Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const towerCount = countSolarStructuresByType(SolarStructure.UpdraftTower);\n useEffect(() => {\n if (towerCount < 2 && individualOutputs) {\n setCommonStore((state) => {\n if (state.graphState) state.graphState.yearlyUpdraftTowerIndividualOutputs = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [towerCount, individualOutputs]);\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('updraftTowerYieldPanel.Yield', lang);\n const yearScaleFactor = 12 / daysPerYear;\n const emptyGraph = yearlyYield && yearlyYield[0] ? Object.keys(yearlyYield[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlySolarUpdraftTowerYieldPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('updraftTowerYieldPanel.UpdraftTowerYearlyYield', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n item)}\n labels={labels}\n height={100}\n dataKeyAxisX={'Month'}\n labelX={labelX}\n labelY={labelY}\n unitY={i18n.t('word.kWh', lang)}\n yMin={0}\n curveType={'linear'}\n fractionDigits={2}\n referenceX={referenceX}\n />\n {!simulationInProgress && (\n \n {towerCount > 1 && towerSumRef.current.size > 0 ? (\n (\n \n \n \n {e[0] + ': '}\n \n {(e[1] * yearScaleFactor).toFixed(2)}\n \n {i === towerSumRef.current.size - 1 && (\n <>\n
\n
\n {i18n.t('word.Total', lang) +\n ': ' +\n (sum * yearScaleFactor).toFixed(2) +\n ' ' +\n i18n.t('word.kWh', lang)}\n
\n \n )}\n
\n ))}\n >\n \n {i18n.t('shared.OutputBreakdown', lang)}\n \n \n ) : (\n \n {i18n.t('updraftTowerYieldPanel.YearlyTotal', lang)}:{(sum * yearScaleFactor).toFixed(2)}{' '}\n {i18n.t('word.kWh', lang)}\n \n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n if (towerCount === 0) {\n showInfo(i18n.t('analysisManager.NoSolarUpdraftTowerForAnalysis', lang));\n return;\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Simulation For Solar Updraft Tower',\n timestamp: new Date().getTime(),\n };\n }\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = true;\n state.runYearlySimulationForUpdraftTower = true;\n state.pauseYearlySimulationForUpdraftTower = false;\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-updraft-tower-yield', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Updraft Tower Yield Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {yearlyYield && yearlyYield.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(yearlyYield, 'yearly-updraft-tower-yield.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Updraft Tower Yield Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlySolarUpdraftTowerYieldPanel);\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useMemo, useRef, useState } from 'react';\r\nimport {\r\n CartesianGrid,\r\n Label,\r\n Legend,\r\n Line,\r\n LineChart,\r\n ReferenceLine,\r\n ResponsiveContainer,\r\n Tooltip,\r\n XAxis,\r\n YAxis,\r\n} from 'recharts';\r\nimport { createSymbol, SYMBOLS } from './symbols';\r\nimport { PRESET_COLORS } from '../constants';\r\nimport { DatumEntry } from '../types';\r\nimport { CurveType } from 'recharts/types/shape/Curve';\r\nimport { Util } from '../Util';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\n\r\nexport interface GaBiaxialLineGraphProps {\r\n dataSource: DatumEntry[];\r\n labels?: (string | undefined)[];\r\n height: number;\r\n dataKeyAxisX?: string;\r\n labelX?: string;\r\n labelY1?: string;\r\n labelY2?: string;\r\n unitX?: string;\r\n unitY1?: string;\r\n unitY2?: string;\r\n yMin1?: string | number;\r\n yMax1?: string | number;\r\n yMin2?: string | number;\r\n yMax2?: string | number;\r\n curveType?: CurveType;\r\n referenceX?: number | string;\r\n fractionDigits?: number;\r\n}\r\n\r\nconst EvolutionBiaxialLineGraph = ({\r\n dataSource,\r\n labels,\r\n height,\r\n dataKeyAxisX,\r\n labelX,\r\n labelY1,\r\n labelY2,\r\n unitX,\r\n unitY1,\r\n unitY2,\r\n yMin1 = 'auto',\r\n yMax1 = 'auto',\r\n yMin2 = 'auto',\r\n yMax2 = 'auto',\r\n curveType = 'linear',\r\n referenceX,\r\n fractionDigits = 2,\r\n}: GaBiaxialLineGraphProps) => {\r\n const constraints = useStore(Selector.solarPanelArrayLayoutConstraints);\r\n const [legendDataKey, setLegendDataKey] = useState(null);\r\n const horizontalGridLines = true;\r\n const verticalGridLines = true;\r\n const lineWidth = 2;\r\n const symbolSize = 1;\r\n const payloadRef = useRef([]);\r\n\r\n // data source format starts from the variables (individual genes or particle positions) of the fittest of\r\n // each generation or step, followed by the best objective and then the variables of all the individuals\r\n // or particles from each generation or step, such as:\r\n // Generation, Gene1, Gene2, ..., Objective, I1, I2, I3, ...\r\n // or\r\n // Step, Position1, Position2, ..., Objective, I1, I2, I3, ...\r\n const getLines = useMemo(() => {\r\n if (!dataSource || dataSource.length === 0) return [];\r\n // the first column is for the x-axis, the last is for the objective\r\n const fittestLineCount = Object.keys(dataSource[0]).length - 1;\r\n const totalLineCount = dataSource[1] ? Object.keys(dataSource[1]).length - 1 : fittestLineCount;\r\n const symbolCount = dataSource.length;\r\n const lines = [];\r\n const lastFittestLineIndex = fittestLineCount - 1;\r\n const individualCount = (totalLineCount - fittestLineCount) / lastFittestLineIndex;\r\n let defaultSymbol;\r\n payloadRef.current.length = 0;\r\n for (let i = 0; i < totalLineCount; i++) {\r\n if (i < lastFittestLineIndex) {\r\n const name = labels && labels[i] && labels[i] !== '' ? labels[i] : 'Var' + (i + 1);\r\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\r\n const symbol = createSymbol(SYMBOLS[i], symbolSize, symbolCount, opacity);\r\n if (i === 0) defaultSymbol = symbol;\r\n lines.push(\r\n 0 ? (symbol ? symbol : defaultSymbol) : false}\r\n isAnimationActive={false}\r\n />,\r\n );\r\n payloadRef.current.push({ id: name, type: 'line', value: name, color: PRESET_COLORS[i] });\r\n } else if (i === lastFittestLineIndex) {\r\n const name = 'Objective';\r\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\r\n const symbol = createSymbol(SYMBOLS[i], symbolSize, symbolCount, opacity);\r\n lines.push(\r\n 0 ? (symbol ? symbol : defaultSymbol) : false}\r\n isAnimationActive={false}\r\n />,\r\n );\r\n payloadRef.current.push({ id: name, type: 'line', value: name, color: PRESET_COLORS[lastFittestLineIndex] });\r\n } else {\r\n const varIndex = Math.floor((i - fittestLineCount) / individualCount);\r\n const name = 'Individual' + (i + 1);\r\n const opacity = 0.5;\r\n const symbol = createSymbol(SYMBOLS[varIndex], symbolSize * 0.5, symbolCount, opacity, PRESET_COLORS[varIndex]);\r\n lines.push(\r\n ,\r\n );\r\n }\r\n }\r\n return lines;\r\n }, [dataSource, curveType, lineWidth, symbolSize, legendDataKey]);\r\n\r\n // @ts-ignore\r\n const onMouseDown = () => {};\r\n\r\n // @ts-ignore\r\n const onMouseEnterLegend = (o) => {\r\n setLegendDataKey(o.id);\r\n };\r\n\r\n // @ts-ignore\r\n const onMouseLeaveLegend = () => {\r\n setLegendDataKey(null);\r\n };\r\n\r\n return (\r\n <>\r\n {dataSource && (\r\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\r\n \r\n \r\n \r\n \r\n value.toFixed(fractionDigits)}\r\n content={({ active, payload }) => {\r\n if (!active || !payload) return null;\r\n return payload.map((p) => {\r\n if (!p.name?.toString().startsWith('Individual')) {\r\n let label: string;\r\n if (p.name === 'Tilt Angle') {\r\n label =\r\n Util.toDegrees(\r\n (p.value as number) * (constraints.maximumTiltAngle - constraints.minimumTiltAngle) +\r\n constraints.minimumTiltAngle,\r\n ).toFixed(fractionDigits) + '°';\r\n } else if (p.name === 'Inter-Row Spacing') {\r\n label =\r\n (\r\n (p.value as number) *\r\n (constraints.maximumInterRowSpacing - constraints.minimumInterRowSpacing) +\r\n constraints.minimumInterRowSpacing\r\n ).toFixed(fractionDigits) + 'm';\r\n } else if (p.name === 'Rack Width') {\r\n label =\r\n Math.floor(\r\n (p.value as number) * (constraints.maximumRowsPerRack - constraints.minimumRowsPerRack) +\r\n constraints.minimumRowsPerRack,\r\n ) + ' panels';\r\n } else if (p.name === 'Objective') {\r\n label = (p.value as number).toFixed(fractionDigits) + ' ' + unitY2;\r\n } else {\r\n label = (p.value as number).toFixed(fractionDigits);\r\n }\r\n return (\r\n
\r\n {p.name}: {label}\r\n
\r\n );\r\n }\r\n return null;\r\n });\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {getLines}\r\n \r\n \r\n
\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default EvolutionBiaxialLineGraph;\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Space } from 'antd';\nimport { screenshot, showInfo } from '../helpers';\nimport { CameraOutlined, RightCircleOutlined } from '@ant-design/icons';\nimport i18n from '../i18n/i18n';\nimport EvolutionBiaxialLineGraph from '../components/evolutionBiaxialLineGraph';\nimport { DesignProblem, EvolutionMethod, ObjectiveFunctionType, ObjectType } from '../types';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 8;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nconst SolarPanelOptimizationResult = () => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const fittestIndividualResults = useStore(Selector.fittestIndividualResults);\n const variableLabels = useStore(Selector.variableLabels);\n const panelRect = useStore(Selector.viewState.evolutionPanelRect);\n const selectedElement = useStore(Selector.selectedElement);\n const evolutionMethod = useStore(Selector.evolutionMethod);\n const evolutionaryAlgorithmState = useStore.getState().evolutionaryAlgorithmState;\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const evolutionInProgress = usePrimitiveStore(Selector.evolutionInProgress);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 680;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 500;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the browser window (not this div window) is resized\n // (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.evolutionPanelRect) {\n state.viewState.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\n }\n state.viewState.evolutionPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.evolutionPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.evolutionPanelRect) {\n state.viewState.evolutionPanelRect = new Rectangle(0, 0, 640, 400);\n }\n state.viewState.evolutionPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.evolutionPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showEvolutionPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Solar Panel Optimization Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const params = useMemo(() => {\n return !evolutionMethod || evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM\n ? evolutionaryAlgorithmState.geneticAlgorithmParams\n : evolutionaryAlgorithmState.particleSwarmOptimizationParams;\n }, [evolutionMethod, evolutionaryAlgorithmState]);\n\n const labelAxisX = useMemo(() => {\n return i18n.t(\n evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM ? 'optimizationMenu.Generation' : 'optimizationMenu.Step',\n lang,\n );\n }, [evolutionMethod, lang]);\n\n const labelVariable = useMemo(() => {\n if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE) return i18n.t('solarPanelMenu.TiltAngle', lang);\n return i18n.t('optimizationMenu.NormalizedVariables', lang);\n }, [params.problem, lang]);\n\n const unitY1 = useMemo(() => {\n if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE) return '°';\n return '';\n }, [params.problem]);\n\n const unitY2 = useMemo(() => {\n if (\n params.problem === DesignProblem.SOLAR_PANEL_ARRAY &&\n (params.objectiveFunctionType === ObjectiveFunctionType.DAILY_PROFIT ||\n params.objectiveFunctionType === ObjectiveFunctionType.YEARLY_PROFIT)\n ) {\n return i18n.t('word.dollar', lang);\n }\n return i18n.t('word.kWh', lang);\n }, [params.problem, params.objectiveFunctionType, lang]);\n\n const labelObjective = useMemo(() => {\n switch (params.objectiveFunctionType) {\n case ObjectiveFunctionType.DAILY_PROFIT:\n return i18n.t('optimizationMenu.ObjectiveFunctionDailyProfit', lang);\n case ObjectiveFunctionType.YEARLY_PROFIT:\n return i18n.t('optimizationMenu.ObjectiveFunctionYearlyProfit', lang);\n case ObjectiveFunctionType.DAILY_AVERAGE_OUTPUT:\n return i18n.t('optimizationMenu.ObjectiveFunctionDailyMeanYield', lang);\n case ObjectiveFunctionType.YEARLY_AVERAGE_OUTPUT:\n return i18n.t('optimizationMenu.ObjectiveFunctionYearlyMeanYield', lang);\n case ObjectiveFunctionType.DAILY_TOTAL_OUTPUT:\n return i18n.t('optimizationMenu.ObjectiveFunctionDailyTotalYield', lang);\n }\n return i18n.t('optimizationMenu.ObjectiveFunctionYearlyTotalYield', lang);\n }, [params.objectiveFunctionType, lang]);\n\n const buttonEnabled = useMemo(() => {\n if (!selectedElement) return false;\n if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE) return selectedElement.type === ObjectType.Foundation;\n if (params.problem === DesignProblem.SOLAR_PANEL_ARRAY) return selectedElement.type === ObjectType.Polygon;\n return false;\n }, [params.problem, selectedElement]);\n\n const hint = useMemo(() => {\n if (params.problem === DesignProblem.SOLAR_PANEL_ARRAY)\n return i18n.t('optimizationMenu.ClickTargetPolygonToActivate', lang);\n return i18n.t('optimizationMenu.ClickTargetFoundationToActivate', lang);\n }, [params.problem, lang]);\n\n const title = useMemo(() => {\n let s = '';\n if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE)\n s += i18n.t('optimizationMenu.SolarPanelTiltAngleOptimization', lang);\n if (params.problem === DesignProblem.SOLAR_PANEL_ARRAY) s += i18n.t('optimizationMenu.SolarPanelArrayLayout', lang);\n s += ': ';\n s +=\n evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM\n ? i18n.t('optimizationMenu.GeneticAlgorithm', lang)\n : i18n.t('optimizationMenu.ParticleSwarmOptimization', lang);\n return s;\n }, [params.problem, evolutionMethod, lang]);\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'solarPanelOptimizationResult';\n });\n }}\n >\n \n \n
\n {title}\n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && !evolutionInProgress && (\n \n {buttonEnabled && (\n }\n title={i18n.t('word.Run', lang)}\n onClick={() => {\n showInfo(i18n.t('message.EvolutionStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n usePrimitiveStore.setState((state) => {\n state.runEvolution = true;\n state.pauseEvolution = false;\n state.evolutionInProgress = true;\n });\n if (loggable) {\n setCommonStore((state) => {\n let representationName;\n if (params.problem === DesignProblem.SOLAR_PANEL_ARRAY) {\n if (evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM) {\n representationName = 'Run Genetic Algorithm for Solar Panel Array Layout';\n } else if (evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) {\n representationName = 'Run Particle Swarm Optimization for Solar Panel Array Layout';\n }\n } else if (params.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE) {\n if (evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM) {\n representationName = 'Run Genetic Algorithm for Solar Panel Tilt Angle';\n } else if (evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION) {\n representationName = 'Run Particle Swarm Optimization for Solar Panel Tilt Angle';\n }\n }\n if (representationName) {\n state.actionInfo = { name: representationName, timestamp: new Date().getTime() };\n }\n });\n }\n }, 100);\n }}\n />\n )}\n {!buttonEnabled && {hint}}\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot(\n 'biaxial-line-graph-' + labelAxisX + '-' + labelVariable + '-' + labelObjective,\n 'solar-panel-tilt-angle-evolution',\n {},\n ).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n });\n }}\n />\n \n )}\n \n \n \n );\n};\n\nexport default React.memo(SolarPanelOptimizationResult);\n","/*\r\n * @Copyright 2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, InputNumber, Modal, Row } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { useStore } from '../stores/common';\r\nimport * as Selector from '../stores/selector';\r\nimport i18n from '../i18n/i18n';\r\nimport { UndoableChange } from '../undo/UndoableChange';\r\n\r\nconst EconomicsPanel = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const economicsParams = useStore(Selector.economicsParams);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n\r\n const [updateFlag, setUpdateFlag] = useState(false);\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n const okButtonRef = useRef(null);\r\n const electricitySellingPriceRef = useRef(economicsParams.electricitySellingPrice);\r\n const operationalCostPerUnitRef = useRef(economicsParams.operationalCostPerUnit);\r\n\r\n const lang = { lng: language };\r\n\r\n useEffect(() => {\r\n okButtonRef.current?.focus();\r\n }, []);\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const apply = () => {\r\n const oldPrice = economicsParams.electricitySellingPrice;\r\n const newPrice = electricitySellingPriceRef.current;\r\n if (oldPrice !== newPrice) {\r\n const undoableChange = {\r\n name: 'Electricity Selling Price',\r\n timestamp: Date.now(),\r\n oldValue: oldPrice,\r\n newValue: newPrice,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.economicsParams.electricitySellingPrice = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.economicsParams.electricitySellingPrice = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.economicsParams.electricitySellingPrice = newPrice;\r\n });\r\n }\r\n\r\n const oldCost = economicsParams.operationalCostPerUnit;\r\n const newCost = operationalCostPerUnitRef.current;\r\n if (oldCost !== newCost) {\r\n const undoableChange = {\r\n name: 'Operational Cost per Unit',\r\n timestamp: Date.now(),\r\n oldValue: oldCost,\r\n newValue: newCost,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.economicsParams.operationalCostPerUnit = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.economicsParams.operationalCostPerUnit = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.economicsParams.operationalCostPerUnit = newCost;\r\n });\r\n }\r\n };\r\n\r\n const onCancelClick = () => {\r\n setDialogVisible(false);\r\n };\r\n\r\n const onOkClick = () => {\r\n apply();\r\n setDialogVisible(false);\r\n };\r\n\r\n return (\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('economicsPanel.EconomicsParameters', lang)}\r\n \r\n }\r\n footer={[\r\n ,\r\n ,\r\n ]}\r\n // this must be specified for the x button in the upper-right corner to work\r\n onCancel={() => {\r\n setDialogVisible(false);\r\n }}\r\n maskClosable={false}\r\n destroyOnClose={false}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n \r\n \r\n {i18n.t('economicsPanel.ElectricitySellingPrice', lang) + ' ([0.1, 1]): '}\r\n \r\n \r\n `$${value}/kWh`}\r\n onChange={(value) => {\r\n electricitySellingPriceRef.current = value;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onBlur={(e) => {\r\n const value = (e.target as HTMLInputElement).value.replace('$', '').replace('/kWh', '');\r\n const v = parseFloat(value);\r\n electricitySellingPriceRef.current = Number.isNaN(v) ? 0.1 : v;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onPressEnter={(e) => {\r\n const value = (e.target as HTMLInputElement).value.replace('$', '').replace('/kWh', '');\r\n const v = parseFloat(value);\r\n electricitySellingPriceRef.current = Number.isNaN(v) ? 0.1 : v;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n />\r\n \r\n \r\n\r\n \r\n \r\n {i18n.t('economicsPanel.OperationalCostPerUnit', lang) + ' ([0.1, 1]): '}\r\n \r\n \r\n `$${value}/day`}\r\n onChange={(value) => {\r\n operationalCostPerUnitRef.current = value;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onBlur={(e) => {\r\n const value = (e.target as HTMLInputElement).value.replace('$', '').replace('/day', '');\r\n const v = parseFloat(value);\r\n operationalCostPerUnitRef.current = Number.isNaN(v) ? 0.1 : v;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n onPressEnter={(e) => {\r\n const value = (e.target as HTMLInputElement).value.replace('$', '').replace('/day', '');\r\n const v = parseFloat(value);\r\n operationalCostPerUnitRef.current = Number.isNaN(v) ? 0.1 : v;\r\n setUpdateFlag(!updateFlag);\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(EconomicsPanel);\r\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { adjustEnergyUsage, computeOutsideTemperature } from './heatTools';\nimport { BuildingCompletionStatus, DatumEntry, EnergyUsage, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { WeatherModel } from '../models/WeatherModel';\nimport { useEffect, useRef } from 'react';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport const useDailyEnergySorter = (now: Date, weather: WeatherModel, hasSolarPanels: boolean) => {\n const elements = useStore.getState().elements;\n const getFoundation = useStore(Selector.getFoundation);\n const getElementById = useStore(Selector.getElementById);\n const flagOfDailySimulation = usePrimitiveStore(Selector.flagOfDailySimulation);\n const hourlyHeatExchangeArrayMap = useDataStore(Selector.hourlyHeatExchangeArrayMap);\n const hourlySolarHeatGainArrayMap = useDataStore(Selector.hourlySolarHeatGainArrayMap);\n const hourlySolarPanelOutputArrayMap = useDataStore(Selector.hourlySolarPanelOutputArrayMap);\n\n const sum: DatumEntry[] = [];\n const dataLabels: string[] = [];\n const sumHeaterMapRef = useRef>(new Map());\n const sumAcMapRef = useRef>(new Map());\n const sumSolarPanelMapRef = useRef>(new Map());\n\n useEffect(() => {\n // get the highest and lowest temperatures of the day from the weather data\n const outsideTemperatureRange = computeOutsideTemperature(\n now,\n weather.lowestTemperatures,\n weather.highestTemperatures,\n );\n sumHeaterMapRef.current.clear();\n sumAcMapRef.current.clear();\n sumSolarPanelMapRef.current.clear();\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n const energy = new Map();\n for (const e of elements) {\n if (Util.onBuildingEnvelope(e)) {\n const exchange = hourlyHeatExchangeArrayMap.get(e.id);\n if (exchange) {\n const f = e.type === ObjectType.Foundation ? (e as FoundationModel) : getFoundation(e);\n if (\n f &&\n !f.notBuilding &&\n Util.getBuildingCompletionStatus(f, elements) === BuildingCompletionStatus.COMPLETE\n ) {\n let energyUsage = energy.get(f.id);\n if (!energyUsage) {\n energyUsage = hasSolarPanels\n ? ({ heater: 0, ac: 0, geothermal: 0, solarPanel: 0, label: f.label?.trim() } as EnergyUsage)\n : ({ heater: 0, ac: 0, geothermal: 0, label: f.label?.trim() } as EnergyUsage);\n energy.set(f.id, energyUsage);\n if (f.hvacSystem?.id) {\n if (f.hvacSystem.id && f.hvacSystem.id.length > 0 && !dataLabels.includes(f.hvacSystem.id)) {\n dataLabels.push(f.hvacSystem.id);\n }\n } else {\n if (f.label && f.label.length > 0 && !dataLabels.includes(f.label)) {\n dataLabels.push(f.label);\n }\n }\n }\n if (e.type === ObjectType.Foundation) {\n energyUsage.geothermal += exchange[i];\n } else {\n if (exchange[i] < 0) {\n energyUsage.heater += exchange[i];\n } else {\n energyUsage.ac += exchange[i];\n }\n }\n }\n }\n }\n }\n // deal with the solar heat gain through windows and electricity generation through solar panels\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (!f.notBuilding && Util.getBuildingCompletionStatus(f, elements) !== BuildingCompletionStatus.COMPLETE)\n continue;\n const energyUsage = energy.get(e.id);\n if (energyUsage) {\n const h = hourlySolarHeatGainArrayMap.get(e.id);\n if (h) {\n if (energyUsage.heater < 0) {\n // It must be cold outside. Solar heat gain decreases heating burden in this case.\n energyUsage.heater += h[i];\n // solar heating cannot turn heater value into positive\n if (energyUsage.heater > 0) energyUsage.heater = 0;\n } else if (energyUsage.ac > 0) {\n // It must be hot outside. Solar heat gain increases cooling burden in this case.\n energyUsage.ac += h[i];\n }\n }\n if (energyUsage.solarPanel !== undefined) {\n const s = hourlySolarPanelOutputArrayMap.get(e.id);\n if (s) {\n energyUsage.solarPanel += s[i];\n }\n }\n }\n }\n }\n if (energy.size > 1) {\n let index = 1;\n for (const key of energy.keys()) {\n datum['Hour'] = i;\n const value = energy.get(key);\n if (value) {\n const elem = getElementById(key);\n if (elem && elem.type === ObjectType.Foundation) {\n const f = elem as FoundationModel;\n if (\n !f.notBuilding &&\n Util.getBuildingCompletionStatus(f, elements) === BuildingCompletionStatus.COMPLETE\n ) {\n const setpoint = f.hvacSystem?.thermostatSetpoint ?? 20;\n const threshold = f.hvacSystem?.temperatureThreshold ?? 3;\n const id = f.hvacSystem?.id ?? (value.label && value.label !== '' ? value.label : index.toString());\n if (id === index.toString()) index++;\n let adjustedHeat = Math.abs(\n adjustEnergyUsage(outsideTemperatureRange, value.heater, setpoint, threshold),\n );\n let adjustedAc = adjustEnergyUsage(outsideTemperatureRange, value.ac, setpoint, threshold);\n if (adjustedHeat > 0) {\n adjustedHeat -= value.geothermal;\n if (adjustedHeat < 0) adjustedHeat = 0;\n } else if (adjustedAc > 0) {\n adjustedAc += value.geothermal;\n if (adjustedAc < 0) adjustedAc = 0;\n }\n const heaterId = 'Heater ' + id;\n if (datum[heaterId]) {\n datum[heaterId] = (datum[heaterId] as number) + adjustedHeat;\n } else {\n datum[heaterId] = adjustedHeat;\n }\n const acId = 'AC ' + id;\n if (datum[acId]) {\n datum[acId] = (datum[acId] as number) + adjustedAc;\n } else {\n datum[acId] = adjustedAc;\n }\n if (value.solarPanel !== undefined) {\n const solarId = 'Solar ' + id;\n if (datum[solarId]) {\n datum[solarId] = (datum[solarId] as number) - value.solarPanel;\n } else {\n datum[solarId] = -value.solarPanel;\n }\n }\n const netId = 'Net ' + id;\n if (datum[netId]) {\n datum[netId] = (datum[netId] as number) + adjustedHeat + adjustedAc - (value.solarPanel ?? 0);\n } else {\n datum[netId] = adjustedHeat + adjustedAc - (value.solarPanel ?? 0);\n }\n let x = sumHeaterMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += adjustedHeat;\n sumHeaterMapRef.current.set(id, x);\n x = sumAcMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += adjustedAc;\n sumAcMapRef.current.set(id, x);\n if (hasSolarPanels) {\n x = sumSolarPanelMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += value.solarPanel;\n sumSolarPanelMapRef.current.set(id, x);\n }\n }\n }\n }\n }\n } else {\n for (const key of energy.keys()) {\n datum['Hour'] = i;\n const value = energy.get(key);\n if (value) {\n const elem = getElementById(key);\n if (elem && elem.type === ObjectType.Foundation) {\n const f = elem as FoundationModel;\n if (\n !f.notBuilding &&\n Util.getBuildingCompletionStatus(f, elements) === BuildingCompletionStatus.COMPLETE\n ) {\n const setpoint = f.hvacSystem?.thermostatSetpoint ?? 20;\n const threshold = f.hvacSystem?.temperatureThreshold ?? 3;\n let adjustedHeat = Math.abs(\n adjustEnergyUsage(outsideTemperatureRange, value.heater, setpoint, threshold),\n );\n let adjustedAc = adjustEnergyUsage(outsideTemperatureRange, value.ac, setpoint, threshold);\n if (adjustedHeat > 0) {\n adjustedHeat -= value.geothermal;\n if (adjustedHeat < 0) adjustedHeat = 0;\n } else if (adjustedAc > 0) {\n adjustedAc += value.geothermal;\n if (adjustedAc < 0) adjustedAc = 0;\n }\n datum['Heater'] = adjustedHeat;\n datum['AC'] = adjustedAc;\n if (value.solarPanel !== undefined) {\n datum['Solar'] = -value.solarPanel;\n }\n datum['Net'] = adjustedHeat + adjustedAc - (value.solarPanel ?? 0);\n const id = 'default';\n let x = sumHeaterMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += adjustedHeat;\n sumHeaterMapRef.current.set(id, x);\n x = sumAcMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += adjustedAc;\n sumAcMapRef.current.set(id, x);\n if (hasSolarPanels) {\n x = sumSolarPanelMapRef.current.get(id);\n if (x === undefined) x = 0;\n x += value.solarPanel;\n sumSolarPanelMapRef.current.set(id, x);\n }\n }\n }\n }\n }\n }\n sum.push(datum);\n }\n }, [flagOfDailySimulation]);\n\n return {\n sum,\n sumHeaterMap: sumHeaterMapRef.current,\n sumAcMap: sumAcMapRef.current,\n sumSolarPanelMap: sumSolarPanelMapRef.current,\n dataLabels,\n };\n};\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Menu, Dropdown, Checkbox, Slider } from 'antd';\nimport { ReactComponent as MenuSVG } from '../assets/menu.svg';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\n\nconst StyledMenuSVG = styled(MenuSVG)`\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n`;\n\nexport interface BuildingEnergyGraphMenuProps {\n horizontalGrid: boolean;\n verticalGrid: boolean;\n lineWidth: number;\n symbolSize: number;\n barCategoryGap: number;\n changeHorizontalGrid?: (visible: boolean) => void;\n changeVerticalGrid?: (visible: boolean) => void;\n changeLineWidth?: (width: number) => void;\n changeSymbolSize?: (count: number) => void;\n changeBarCategoryGap?: (gap: number) => void;\n}\n\nconst BuildingEnergyGraphMenu = ({\n horizontalGrid,\n verticalGrid,\n lineWidth,\n symbolSize,\n barCategoryGap,\n changeHorizontalGrid,\n changeVerticalGrid,\n changeLineWidth,\n changeSymbolSize,\n changeBarCategoryGap,\n}: BuildingEnergyGraphMenuProps) => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n\n const [visible, setVisible] = useState(false);\n\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n };\n\n const onShowHorizontalGridLines = () => {\n changeHorizontalGrid?.(!horizontalGrid);\n };\n\n const onShowVerticalGridLines = () => {\n changeVerticalGrid?.(!verticalGrid);\n };\n\n const onChangeLineWidth = (value: number) => {\n changeLineWidth?.(value / 2);\n };\n\n const onChangeSymbolSize = (size: number) => {\n changeSymbolSize?.(size / 5);\n };\n\n const onChangeBarCategoryGap = (gap: number) => {\n changeBarCategoryGap?.(gap);\n };\n\n const menu = (\n \n \n {i18n.t('menu.graph.LineWidth', lang) + ':'}\n \n \n \n {i18n.t('menu.graph.SymbolSize', lang) + ':'}\n \n \n \n {i18n.t('menu.graph.BarCategoryGap', lang) + ':'}\n \n \n \n \n {i18n.t('menu.graph.ShowHorizontalGridLines', lang)}\n \n \n \n \n {i18n.t('menu.graph.ShowVerticalGridLines', lang)}\n \n \n \n );\n\n return (\n <>\n \n {\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n\nexport default BuildingEnergyGraphMenu;\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n Bar,\n CartesianGrid,\n ComposedChart,\n Label,\n Legend,\n Line,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { createSymbol, SYMBOLS } from './symbols';\nimport { DatumEntry, GraphDataType } from '../types';\nimport { CurveType } from 'recharts/types/shape/Curve';\nimport BuildingEnergyGraphMenu from './buildingEnergyGraphMenu';\nimport { PRESET_COLORS } from '../constants';\n\nexport interface BuildingEnergyGraphProps {\n type: GraphDataType;\n hasSolarPanels: boolean;\n dataSource: DatumEntry[];\n labels: string[];\n height: number;\n dataKeyAxisX?: string;\n labelX?: string;\n labelY?: string;\n unitX?: string;\n unitY?: string;\n yMin?: string | number;\n yMax?: string | number;\n curveType?: CurveType;\n referenceX?: number | string;\n fractionDigits?: number;\n symbolCount?: number;\n}\n\nconst BuildingEnergyGraph = ({\n type,\n dataSource,\n hasSolarPanels,\n labels,\n height,\n dataKeyAxisX,\n labelX,\n labelY,\n unitX,\n unitY,\n yMin = 'auto',\n yMax = 'auto',\n curveType = 'linear',\n referenceX,\n fractionDigits = 2,\n symbolCount = 12,\n}: BuildingEnergyGraphProps) => {\n const [buildingCount, setBuildingCount] = useState(0);\n const [buildingId, setBuildingId] = useState();\n const [horizontalGridLines, setHorizontalGridLines] = useState(true);\n const [verticalGridLines, setVerticalGridLines] = useState(true);\n const [legendDataKey, setLegendDataKey] = useState(null);\n const [lineWidth, setLineWidth] = useState(2);\n const [symbolSize, setSymbolSize] = useState(1);\n const [barCategoryGap, setBarCategoryGap] = useState(2);\n\n //init\n useEffect(() => {\n if (!dataSource || dataSource.length === 0) {\n return;\n }\n // there are four lines for each dataset [Heater, AC, Solar, Net] when there are solar panels\n const n = hasSolarPanels ? 4 : 3;\n const len =\n (Array.isArray(dataSource) ? Object.keys(dataSource[0]).length - 1 : Object.keys(dataSource).length - 1) / n;\n if (buildingCount !== len) {\n setBuildingCount(len);\n }\n if (len === 1) {\n if (dataSource[0]) {\n for (const k in dataSource[0]) {\n if (k.startsWith('Heater')) {\n setBuildingId(k.length > 6 ? k.substring(6).trim() : undefined);\n break;\n }\n }\n }\n }\n }, [dataSource]);\n\n const getRepresentations = useMemo(() => {\n const representations = [];\n const n = hasSolarPanels ? 4 : 3;\n let defaultSymbol;\n const barStrokeColor = 'gray';\n const barStrokeWidth = 1;\n for (let i = 0; i < buildingCount; i++) {\n let name = buildingCount > 1 ? labels[i * n] : buildingId ? 'Heater ' + buildingId : 'Heater';\n representations.push(\n ,\n );\n name = buildingCount > 1 ? labels[i * n + 1] : buildingId ? 'AC ' + buildingId : 'AC';\n representations.push(\n ,\n );\n if (hasSolarPanels) {\n name = buildingCount > 1 ? labels[i * n + 2] : buildingId ? 'Solar ' + buildingId : 'Solar';\n representations.push(\n ,\n );\n }\n }\n const m = n - 1;\n for (let i = 0; i < buildingCount; i++) {\n let name = buildingCount > 1 ? labels[i * n + m] : buildingId ? 'Net ' + buildingId : 'Net';\n const opacity = legendDataKey === null ? 1 : legendDataKey === name ? 1 : 0.25;\n const symbol = createSymbol(SYMBOLS[i], symbolSize, symbolCount, opacity);\n if (i === 0) defaultSymbol = symbol;\n representations.push(\n 0 ? (symbol ? symbol : defaultSymbol) : false}\n isAnimationActive={false}\n />,\n );\n }\n return representations;\n }, [type, curveType, labels, buildingCount, buildingId, lineWidth, symbolCount, symbolSize, legendDataKey]);\n\n // @ts-ignore\n const onMouseDown = (e) => {};\n\n // @ts-ignore\n const onMouseEnterLegend = (o) => {\n setLegendDataKey(o.dataKey);\n };\n\n // @ts-ignore\n const onMouseLeaveLegend = (o) => {\n setLegendDataKey(null);\n };\n\n return (\n <>\n {dataSource && (\n // need two div wrappers to disable the responsiveness of ResponsiveContainer\n \n \n \n \n value.toFixed(fractionDigits) + ' ' + unitY} />\n \n \n \n \n \n \n \n {getRepresentations}\n \n {buildingCount > 0 && (\n \n )}\n \n \n {\n setHorizontalGridLines(checked);\n }}\n changeVerticalGrid={(checked) => {\n setVerticalGridLines(checked);\n }}\n changeLineWidth={(value) => {\n setLineWidth(value);\n }}\n changeSymbolSize={(value) => {\n setSymbolSize(value);\n }}\n changeBarCategoryGap={(value) => {\n setBarCategoryGap(value);\n }}\n />\n \n \n )}\n \n );\n};\n\nexport default BuildingEnergyGraph;\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { BuildingCompletionStatus, DatumEntry, GraphDataType } from '../types';\nimport moment from 'moment';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Popover, Space } from 'antd';\nimport { ReloadOutlined, CaretRightOutlined, SaveOutlined, CameraOutlined } from '@ant-design/icons';\nimport { saveCsv, screenshot, showError, showInfo, showWarning } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { FLOATING_WINDOW_OPACITY, Z_INDEX_FRONT_PANEL } from '../constants';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDailyEnergySorter } from '../analysis/energyHooks';\nimport BuildingEnergyGraph from '../components/buildingEnergyGraph';\nimport { Util } from '../Util';\nimport { checkBuilding, CheckStatus } from '../analysis/heatTools';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface DailyBuildingEnergyPanelProps {\n city: string | null;\n}\n\nconst DailyBuildingEnergyPanel = ({ city }: DailyBuildingEnergyPanelProps) => {\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const selectNone = useStore(Selector.selectNone);\n const getWeather = useStore(Selector.getWeather);\n const now = new Date(useStore(Selector.world.date));\n const panelRect = useStore(Selector.viewState.dailyBuildingEnergyPanelRect);\n const flagOfDailySimulation = usePrimitiveStore(Selector.flagOfDailySimulation);\n const runDailySimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\n const clearDailySimulationResultsFlag = usePrimitiveStore(Selector.clearDailySimulationResultsFlag);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const hasSolarPanels = Util.hasSolarPanels(useStore.getState().elements);\n const setTotalBuildingHeater = useDataStore(Selector.setTotalBuildingHeater);\n const setTotalBuildingAc = useDataStore(Selector.setTotalBuildingAc);\n const setTotalBuildingSolarPanel = useDataStore(Selector.setTotalBuildingSolarPanel);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 460;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n const [data, setData] = useState([]);\n const [heaterSum, setHeaterSum] = useState(0);\n const [acSum, setAcSum] = useState(0);\n const [solarPanelSum, setSolarPanelSum] = useState(0);\n const [netSum, setNetSum] = useState(0);\n const [labels, setLabels] = useState(['Heater', 'AC', 'Net']);\n\n const lang = { lng: language };\n const weather = getWeather(city ?? 'Boston MA, USA');\n const tooltipHeaterBreakdown = useRef([]);\n const tooltipAcBreakdown = useRef([]);\n const tooltipSolarPanelBreakdown = useRef([]);\n const tooltipNetBreakdown = useRef([]);\n\n useEffect(() => {\n if (runDailySimulation) {\n clearResults();\n }\n }, [runDailySimulation]);\n\n useEffect(() => {\n clearResults();\n }, [clearDailySimulationResultsFlag]);\n\n const clearResults = () => {\n setData([]);\n setHeaterSum(0);\n setAcSum(0);\n setSolarPanelSum(0);\n setNetSum(0);\n setLabels([]);\n };\n\n const { sum, sumHeaterMap, sumAcMap, sumSolarPanelMap, dataLabels } = useDailyEnergySorter(\n now,\n weather,\n hasSolarPanels,\n );\n\n useEffect(() => {\n setData(sum);\n let sumHeater = 0;\n let sumAc = 0;\n let sumSolarPanel = 0;\n const multiple = sumHeaterMap.size > 1;\n if (sumHeaterMap) {\n tooltipHeaterBreakdown.current = [];\n for (const key of sumHeaterMap.keys()) {\n const val = sumHeaterMap.get(key);\n if (val) {\n sumHeater += val;\n if (multiple) {\n tooltipHeaterBreakdown.current.push(key + ': ' + val.toFixed(2) + ' ' + i18n.t('word.kWh', lang));\n }\n }\n }\n }\n if (sumAcMap) {\n tooltipAcBreakdown.current = [];\n for (const key of sumAcMap.keys()) {\n const val = sumAcMap.get(key);\n if (val) {\n sumAc += val;\n if (multiple) {\n tooltipAcBreakdown.current.push(key + ': ' + val.toFixed(2) + ' ' + i18n.t('word.kWh', lang));\n }\n }\n }\n }\n if (sumSolarPanelMap && sumSolarPanelMap.size > 0) {\n tooltipSolarPanelBreakdown.current = [];\n for (const key of sumSolarPanelMap.keys()) {\n const val = sumSolarPanelMap.get(key);\n if (val) {\n sumSolarPanel += val;\n if (multiple) {\n tooltipSolarPanelBreakdown.current.push(key + ': ' + val.toFixed(2) + ' ' + i18n.t('word.kWh', lang));\n }\n }\n }\n }\n if (sumHeaterMap && sumAcMap && sumSolarPanelMap) {\n tooltipNetBreakdown.current = [];\n for (const key of sumHeaterMap.keys()) {\n let net = 0;\n const heater = sumHeaterMap.get(key);\n const ac = sumAcMap.get(key);\n const solarPanel = sumSolarPanelMap.get(key);\n if (heater) net += heater;\n if (ac) net += ac;\n if (solarPanel) net -= solarPanel;\n if (multiple) {\n tooltipNetBreakdown.current.push(key + ': ' + net.toFixed(2) + ' ' + i18n.t('word.kWh', lang));\n }\n }\n }\n setHeaterSum(sumHeater);\n setAcSum(sumAc);\n setSolarPanelSum(sumSolarPanel);\n setNetSum(sumHeater + sumAc - sumSolarPanel);\n // for logger\n setTotalBuildingHeater(sumHeater);\n setTotalBuildingAc(sumAc);\n setTotalBuildingSolarPanel(sumSolarPanel);\n const countBuildings = (Object.keys(sum[0]).length - 1) / (hasSolarPanels ? 4 : 3);\n if (countBuildings > 1) {\n const l = [];\n let i = 0;\n for (let index = 0; index < countBuildings; index++) {\n // If the data label is not set, we will give it a default label by its index,\n // but some labels may be set, so we have to use an incrementer here.\n if (!dataLabels[index]) i++;\n const id = dataLabels[index] ?? i;\n if (hasSolarPanels) {\n l.push('Heater ' + id, 'AC ' + id, 'Solar ' + id, 'Net ' + id);\n } else {\n l.push('Heater ' + id, 'AC ' + id, 'Net ' + id);\n }\n }\n setLabels(l);\n } else {\n if (hasSolarPanels) {\n setLabels(['Heater', 'AC', 'Solar', 'Net']);\n } else {\n setLabels(['Heater', 'AC', 'Net']);\n }\n }\n }, [flagOfDailySimulation]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.dailyBuildingEnergyPanelRect) {\n state.viewState.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.dailyBuildingEnergyPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.dailyBuildingEnergyPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.dailyBuildingEnergyPanelRect) {\n state.viewState.dailyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.dailyBuildingEnergyPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.dailyBuildingEnergyPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showDailyBuildingEnergyPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Daily Building Energy Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const labelX = i18n.t('word.Hour', lang);\n const labelY = i18n.t('word.Energy', lang);\n const emptyGraph = data && data[0] ? Object.keys(data[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'dailyBuildingEnergyPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('buildingEnergyPanel.DailyBuildingEnergy', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + moment(now).format('MM/DD')}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {tooltipHeaterBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.Heater', lang) + ': ' + heaterSum.toFixed(1)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.Heater', lang) + ': ' + heaterSum.toFixed(1)}\n \n \n )}\n {tooltipAcBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.AC', lang) + ': ' + acSum.toFixed(1)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.AC', lang) + ': ' + acSum.toFixed(1)}\n \n \n )}\n {solarPanelSum !== 0 && (\n <>\n {tooltipSolarPanelBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.SolarPanel', lang) + ': ' + solarPanelSum.toFixed(1)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.SolarPanel', lang) + ': ' + solarPanelSum.toFixed(1)}\n \n \n )}\n \n )}\n {tooltipNetBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.Net', lang) + ': ' + netSum.toFixed(1)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.Net', lang) + ': ' + netSum.toFixed(1)}\n \n \n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n const elements = useStore.getState().elements;\n const countElementsByType = useStore.getState().countElementsByType;\n const getChildrenOfType = useStore.getState().getChildrenOfType;\n const checkResult = checkBuilding(elements, countElementsByType, getChildrenOfType);\n if (checkResult.status === CheckStatus.NO_BUILDING) {\n showInfo(i18n.t('analysisManager.NoBuildingForAnalysis', lang));\n return;\n }\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD) {\n let errorType;\n switch (checkResult.buildingCompletion) {\n case BuildingCompletionStatus.WALL_DISJOINED:\n errorType = i18n.t('message.WallsAreNotConnected', lang);\n break;\n case BuildingCompletionStatus.WALL_EMPTY:\n errorType = i18n.t('message.BuildingContainsEmptyWall', lang);\n break;\n case BuildingCompletionStatus.ROOF_MISSING:\n errorType = i18n.t('message.BuildingRoofMissing', lang);\n break;\n default:\n errorType = i18n.t('message.UnknownErrors', lang);\n }\n showError(i18n.t('message.SimulationWillNotStartDueToErrors', lang) + ': ' + errorType);\n return;\n }\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD) {\n showWarning(i18n.t('message.SimulationWillStartDespiteWarnings', lang));\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n selectNone();\n usePrimitiveStore.setState((state) => {\n state.runDailyThermalSimulation = true;\n state.pauseDailyThermalSimulation = false;\n state.simulationInProgress = true;\n });\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Daily Building Energy Analysis',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'daily-building-energy', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Daily Building Energy Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {data && data.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(data, 'daily-building-energy.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Daily Building Energy Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(DailyBuildingEnergyPanel);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { BuildingCompletionStatus, DatumEntry, GraphDataType } from '../types';\nimport { FLOATING_WINDOW_OPACITY, MONTHS, Z_INDEX_FRONT_PANEL } from '../constants';\nimport ReactDraggable, { DraggableEventHandler } from 'react-draggable';\nimport { Button, Popover, Space } from 'antd';\nimport { CameraOutlined, CaretRightOutlined, ReloadOutlined, SaveOutlined } from '@ant-design/icons';\nimport { saveCsv, screenshot, showError, showInfo, showWarning } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { Rectangle } from '../models/Rectangle';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDailyEnergySorter } from '../analysis/energyHooks';\nimport BuildingEnergyGraph from '../components/buildingEnergyGraph';\nimport { Util } from '../Util';\nimport { checkBuilding, CheckStatus } from '../analysis/heatTools';\nimport { useDataStore } from '../stores/commonData';\n\nconst Container = styled.div`\n position: fixed;\n top: 80px;\n right: 24px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 16px;\n z-index: 9;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n right: 0;\n top: 0;\n min-width: 400px;\n max-width: 800px;\n min-height: 200px;\n max-height: 600px;\n padding-bottom: 10px;\n border: 2px solid gainsboro;\n border-radius: 10px 10px 10px 10px;\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n overflow-y: auto;\n resize: both;\n direction: rtl;\n`;\n\nconst Header = styled.div`\n border-radius: 10px 10px 0 0;\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: move;\n\n svg.icon {\n height: 16px;\n width: 16px;\n padding: 8px;\n fill: #666;\n }\n`;\n\nexport interface YearlyBuildingEnergyPanelProps {\n city: string | null;\n}\n\nconst YearlyBuildingEnergyPanel = ({ city }: YearlyBuildingEnergyPanelProps) => {\n const world = useStore.getState().world;\n const getWeather = useStore(Selector.getWeather);\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const opacity = useStore(Selector.floatingWindowOpacity) ?? FLOATING_WINDOW_OPACITY;\n const setCommonStore = useStore(Selector.set);\n const selectNone = useStore(Selector.selectNone);\n const now = new Date(useStore(Selector.world.date));\n const panelRect = useStore(Selector.viewState.yearlyBuildingEnergyPanelRect);\n const flagOfDailySimulation = usePrimitiveStore(Selector.flagOfDailySimulation);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlyThermalSimulation);\n const clearYearlySimulationResultsFlag = usePrimitiveStore(Selector.clearYearlySimulationResultsFlag);\n const simulationInProgress = usePrimitiveStore(Selector.simulationInProgress);\n const hasSolarPanels = Util.hasSolarPanels(useStore.getState().elements);\n const setTotalBuildingHeater = useDataStore(Selector.setTotalBuildingHeater);\n const setTotalBuildingAc = useDataStore(Selector.setTotalBuildingAc);\n const setTotalBuildingSolarPanel = useDataStore(Selector.setTotalBuildingSolarPanel);\n const selectedFloatingWindow = useStore(Selector.selectedFloatingWindow);\n\n const wrapperRef = useRef(null);\n const resizeObserverRef = useRef();\n const wOffset = wrapperRef.current ? wrapperRef.current.clientWidth + 40 : panelRect ? panelRect.width + 40 : 640;\n const hOffset = wrapperRef.current ? wrapperRef.current.clientHeight + 100 : panelRect ? panelRect.height + 100 : 600;\n const [curPosition, setCurPosition] = useState({\n x: panelRect ? Math.max(panelRect.x, wOffset - window.innerWidth) : 0,\n y: panelRect ? Math.min(panelRect.y, window.innerHeight - hOffset) : 0,\n });\n\n // nodeRef is to suppress ReactDOM.findDOMNode() deprecation warning. See:\n // https://github.com/react-grid-layout/react-draggable/blob/v4.4.2/lib/DraggableCore.js#L159-L171\n const nodeRef = React.useRef(null);\n\n const lang = { lng: language };\n const weather = getWeather(city ?? 'Boston MA, USA');\n const referenceX = MONTHS[now.getMonth()];\n const daysPerYear = world.daysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n\n const [heaterSum, setHeaterSum] = useState(0);\n const [acSum, setAcSum] = useState(0);\n const [solarPanelSum, setSolarPanelSum] = useState(0);\n const [netSum, setNetSum] = useState(0);\n const [labels, setLabels] = useState(['Heater', 'AC', 'Solar', 'Net']);\n const [data, setData] = useState([]);\n\n const { sum, sumHeaterMap, sumAcMap, sumSolarPanelMap, dataLabels } = useDailyEnergySorter(\n now,\n weather,\n hasSolarPanels,\n );\n\n const resultRef = useRef(new Array(daysPerYear).fill({}));\n const heaterSumRef = useRef(new Array(daysPerYear).fill(0));\n const acSumRef = useRef(new Array(daysPerYear).fill(0));\n const solarPanelSumRef = useRef(new Array(daysPerYear).fill(0));\n const netSumRef = useRef(new Array(daysPerYear).fill(0));\n const tooltipHeaterBreakdown = useRef([]);\n const tooltipAcBreakdown = useRef([]);\n const tooltipSolarPanelBreakdown = useRef([]);\n const tooltipNetBreakdown = useRef([]);\n\n useEffect(() => {\n clearResults();\n }, [daysPerYear, clearYearlySimulationResultsFlag]);\n\n useEffect(() => {\n if (runYearlySimulation) {\n clearResults();\n }\n }, [runYearlySimulation]);\n\n const clearResults = () => {\n resultRef.current = new Array(daysPerYear).fill({});\n heaterSumRef.current = new Array(daysPerYear).fill(0);\n acSumRef.current = new Array(daysPerYear).fill(0);\n solarPanelSumRef.current = new Array(daysPerYear).fill(0);\n netSumRef.current = new Array(daysPerYear).fill(0);\n setData([]);\n setHeaterSum(0);\n setAcSum(0);\n setSolarPanelSum(0);\n setNetSum(0);\n setLabels([]);\n };\n\n useEffect(() => {\n const indexOfMonth = now.getMonth() / monthInterval;\n const countBuildings = (Object.keys(sum[0]).length - 1) / (hasSolarPanels ? 4 : 3);\n tooltipHeaterBreakdown.current = [];\n tooltipAcBreakdown.current = [];\n tooltipNetBreakdown.current = [];\n tooltipSolarPanelBreakdown.current = [];\n if (countBuildings > 1) {\n const heaterMap = new Map();\n const acMap = new Map();\n const solarPanelMap = new Map();\n const netMap = new Map();\n for (const h of sum) {\n let i = 0;\n for (let j = 0; j < countBuildings; j++) {\n // If the data label is not set, we will give it a default label by its index,\n // but some labels may be set, so we have to use an incrementer here.\n if (!dataLabels[j]) i++;\n const id = dataLabels[j] ?? i;\n let heater = heaterMap.get(id);\n if (heater === undefined) heater = 0;\n heater += h['Heater ' + id] as number;\n heaterMap.set(id, heater);\n let ac = acMap.get(id);\n if (ac === undefined) ac = 0;\n ac += h['AC ' + id] as number;\n acMap.set(id, ac);\n let net = netMap.get(id);\n if (net === undefined) net = 0;\n net += h['Net ' + id] as number;\n netMap.set(id, net);\n if (hasSolarPanels) {\n let solarPanel = solarPanelMap.get(id);\n if (solarPanel === undefined) solarPanel = 0;\n solarPanel += h['Solar ' + id] as number;\n solarPanelMap.set(id, solarPanel);\n }\n }\n }\n const datum: DatumEntry = {};\n datum['Month'] = MONTHS[now.getMonth()];\n const l = [];\n let i = 0;\n for (let index = 0; index < countBuildings; index++) {\n // If the data label is not set, we will give it a default label by its index,\n // but some labels may be set, so we have to use an incrementer here.\n if (!dataLabels[index]) i++;\n const id = dataLabels[index] ?? i;\n if (hasSolarPanels) {\n l.push('Heater ' + id, 'AC ' + id, 'Solar ' + id, 'Net ' + id);\n datum['Solar ' + id] = (solarPanelMap.get(id) ?? 0) * 30;\n } else {\n l.push('Heater ' + id, 'AC ' + id, 'Net ' + id);\n }\n datum['Heater ' + id] = (heaterMap.get(id) ?? 0) * 30;\n datum['AC ' + id] = (acMap.get(id) ?? 0) * 30;\n datum['Net ' + id] = (netMap.get(id) ?? 0) * 30;\n }\n setLabels(l);\n resultRef.current[indexOfMonth] = datum;\n i = 0;\n for (let index = 0; index < countBuildings; index++) {\n // If the data label is not set, we will give it a default label by its index,\n // but some labels may be set, so we have to use an incrementer here.\n if (!dataLabels[index]) i++;\n let totalHeater = 0;\n let totalAc = 0;\n let totalSolarPanel = 0;\n let totalNet = 0;\n const id = dataLabels[index] ?? i;\n for (const res of resultRef.current) {\n totalHeater += res['Heater ' + id] as number;\n totalAc += res['AC ' + id] as number;\n totalNet += res['Net ' + id] as number;\n if (hasSolarPanels) totalSolarPanel += res['Solar ' + id] as number;\n }\n totalHeater *= monthInterval;\n totalAc *= monthInterval;\n totalNet *= monthInterval;\n tooltipHeaterBreakdown.current.push(id + ': ' + totalHeater.toFixed(1) + ' ' + i18n.t('word.kWh', lang));\n tooltipAcBreakdown.current.push(id + ': ' + totalAc.toFixed(1) + ' ' + i18n.t('word.kWh', lang));\n tooltipNetBreakdown.current.push(id + ': ' + totalNet.toFixed(1) + ' ' + i18n.t('word.kWh', lang));\n if (totalSolarPanel !== 0) {\n totalSolarPanel *= -monthInterval;\n tooltipSolarPanelBreakdown.current.push(\n id + ': ' + totalSolarPanel.toFixed(1) + ' ' + i18n.t('word.kWh', lang),\n );\n }\n }\n } else {\n // only one building\n let heater = 0;\n let ac = 0;\n let net = 0;\n let bid = '';\n for (const k in sum[0]) {\n if (k.startsWith('Heater')) {\n if (k.length > 6) bid = ' ' + k.substring(6).trim();\n break;\n }\n }\n const heaterId = 'Heater' + bid;\n const acId = 'AC' + bid;\n const netId = 'Net' + bid;\n if (hasSolarPanels) {\n const solarId = 'Solar' + bid;\n let solarPanel = 0;\n setLabels([heaterId, acId, solarId, netId]);\n for (const h of sum) {\n heater += h[heaterId] as number;\n ac += h[acId] as number;\n solarPanel += h[solarId] as number;\n net += h[netId] as number;\n }\n const datum: DatumEntry = {};\n datum['Month'] = MONTHS[now.getMonth()];\n datum[heaterId] = 30 * heater;\n datum[acId] = 30 * ac;\n datum[solarId] = 30 * solarPanel;\n datum[netId] = 30 * net;\n resultRef.current[indexOfMonth] = datum;\n } else {\n setLabels([heaterId, acId, netId]);\n for (const h of sum) {\n heater += h[heaterId] as number;\n ac += h[acId] as number;\n net += h[netId] as number;\n }\n const datum: DatumEntry = {};\n datum['Month'] = MONTHS[now.getMonth()];\n datum[heaterId] = 30 * heater;\n datum[acId] = 30 * ac;\n datum[netId] = 30 * net;\n resultRef.current[indexOfMonth] = datum;\n }\n }\n setData([...resultRef.current]);\n let sumHeater = 0;\n if (sumHeaterMap) {\n for (const key of sumHeaterMap.keys()) {\n sumHeater += sumHeaterMap.get(key) ?? 0;\n }\n }\n let sumAc = 0;\n if (sumAcMap) {\n for (const key of sumAcMap.keys()) {\n sumAc += sumAcMap.get(key) ?? 0;\n }\n }\n let sumSolarPanel = 0;\n if (sumSolarPanelMap && hasSolarPanels) {\n for (const key of sumSolarPanelMap.keys()) {\n sumSolarPanel += sumSolarPanelMap.get(key) ?? 0;\n }\n }\n heaterSumRef.current[indexOfMonth] = sumHeater * monthInterval * 30;\n acSumRef.current[indexOfMonth] = sumAc * monthInterval * 30;\n solarPanelSumRef.current[indexOfMonth] = sumSolarPanel * monthInterval * 30;\n netSumRef.current[indexOfMonth] =\n heaterSumRef.current[indexOfMonth] + acSumRef.current[indexOfMonth] - solarPanelSumRef.current[indexOfMonth];\n const totalHeater = heaterSumRef.current.slice(0, indexOfMonth + 1).reduce((pv, cv) => pv + cv, 0);\n setHeaterSum(totalHeater);\n const totalAc = acSumRef.current.slice(0, indexOfMonth + 1).reduce((pv, cv) => pv + cv, 0);\n setAcSum(totalAc);\n const totalSolarPanel = solarPanelSumRef.current.slice(0, indexOfMonth + 1).reduce((pv, cv) => pv + cv, 0);\n setSolarPanelSum(totalSolarPanel);\n setNetSum(netSumRef.current.slice(0, indexOfMonth + 1).reduce((pv, cv) => pv + cv, 0));\n // for logger\n setTotalBuildingHeater(totalHeater);\n setTotalBuildingAc(totalAc);\n setTotalBuildingSolarPanel(totalSolarPanel);\n if (!usePrimitiveStore.getState().showSolarRadiationHeatmap) {\n useDataStore.getState().clearDataStore();\n }\n }, [flagOfDailySimulation]);\n\n useEffect(() => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n }, [panelRect, wOffset, hOffset]);\n\n // when the window is resized (the code depends on where the panel is originally anchored in the CSS)\n useEffect(() => {\n const handleWindowResize = () => {\n setCurPosition({\n x: Math.max(panelRect?.x, wOffset - window.innerWidth),\n y: Math.min(panelRect?.y, window.innerHeight - hOffset),\n });\n };\n window.addEventListener('resize', handleWindowResize);\n if (wrapperRef.current) {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n setCommonStore((state) => {\n if (wrapperRef.current) {\n if (!state.viewState.yearlyBuildingEnergyPanelRect) {\n state.viewState.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 500);\n }\n state.viewState.yearlyBuildingEnergyPanelRect.width = wrapperRef.current.offsetWidth;\n state.viewState.yearlyBuildingEnergyPanelRect.height = wrapperRef.current.offsetHeight;\n }\n });\n });\n }\n resizeObserverRef.current.observe(wrapperRef.current);\n }\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n resizeObserverRef.current?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [panelRect, wOffset, hOffset]);\n\n const onDrag: DraggableEventHandler = (e, ui) => {\n setCurPosition({\n x: Math.max(ui.x, wOffset - window.innerWidth),\n y: Math.min(ui.y, window.innerHeight - hOffset),\n });\n };\n\n const onDragEnd: DraggableEventHandler = (e, ui) => {\n setCommonStore((state) => {\n if (!state.viewState.yearlyBuildingEnergyPanelRect) {\n state.viewState.yearlyBuildingEnergyPanelRect = new Rectangle(0, 0, 600, 360);\n }\n state.viewState.yearlyBuildingEnergyPanelRect.x = Math.max(ui.x, wOffset - window.innerWidth);\n state.viewState.yearlyBuildingEnergyPanelRect.y = Math.min(ui.y, window.innerHeight - hOffset);\n });\n };\n\n const closePanel = () => {\n setCommonStore((state) => {\n state.viewState.showYearlyBuildingEnergyPanel = false;\n if (loggable) {\n state.actionInfo = {\n name: 'Close Yearly Building Energy Graph',\n timestamp: new Date().getTime(),\n };\n }\n });\n };\n\n const labelX = i18n.t('word.Month', lang);\n const labelY = i18n.t('word.Energy', lang);\n const emptyGraph = data && data[0] ? Object.keys(data[0]).length === 0 : true;\n\n return (\n {\n setCommonStore((state) => {\n state.selectedFloatingWindow = 'yearlyBuildingEnergyPanel';\n });\n }}\n >\n \n \n
\n \n {i18n.t('buildingEnergyPanel.YearlyBuildingEnergy', lang) + ': '}\n \n {i18n.t('sensorPanel.WeatherDataFrom', lang) + ' ' + city + ' | ' + now.getFullYear()}\n \n \n {\n closePanel();\n }}\n onMouseDown={() => {\n closePanel();\n }}\n >\n {i18n.t('word.Close', lang)}\n \n
\n \n {!simulationInProgress && (\n \n {tooltipHeaterBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.Heater', lang) + ': ' + heaterSum.toFixed(0)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.Heater', lang) + ': ' + heaterSum.toFixed(0)}\n \n \n )}\n {tooltipAcBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.AC', lang) + ': ' + acSum.toFixed(0)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.AC', lang) + ': ' + acSum.toFixed(0)}\n \n \n )}\n {solarPanelSum !== 0 && (\n <>\n {tooltipSolarPanelBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.SolarPanel', lang) + ': ' + solarPanelSum.toFixed(0)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.SolarPanel', lang) + ': ' + solarPanelSum.toFixed(0)}\n \n \n )}\n \n )}\n {tooltipNetBreakdown.current.length === 0 ? (\n \n {i18n.t('buildingEnergyPanel.Net', lang) + ': ' + netSum.toFixed(0)}\n \n ) : (\n (\n
{e}
\n ))}\n >\n \n {i18n.t('buildingEnergyPanel.Net', lang) + ': ' + netSum.toFixed(0)}\n \n \n )}\n : }\n title={i18n.t(emptyGraph ? 'word.Run' : 'word.Update', lang)}\n onClick={() => {\n const elements = useStore.getState().elements;\n const countElementsByType = useStore.getState().countElementsByType;\n const getChildrenOfType = useStore.getState().getChildrenOfType;\n const checkResult = checkBuilding(elements, countElementsByType, getChildrenOfType);\n if (checkResult.status === CheckStatus.NO_BUILDING) {\n showInfo(i18n.t('analysisManager.NoBuildingForAnalysis', lang));\n return;\n }\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_NO_GOOD) {\n let errorType = '';\n switch (checkResult.buildingCompletion) {\n case BuildingCompletionStatus.WALL_DISJOINED:\n errorType = i18n.t('message.WallsAreNotConnected', lang);\n break;\n case BuildingCompletionStatus.WALL_EMPTY:\n errorType = i18n.t('message.BuildingContainsEmptyWall', lang);\n break;\n case BuildingCompletionStatus.ROOF_MISSING:\n errorType = i18n.t('message.BuildingRoofMissing', lang);\n break;\n default:\n errorType = i18n.t('message.UnknownErrors', lang);\n }\n showError(i18n.t('message.SimulationWillNotStartDueToErrors', lang) + ': ' + errorType);\n return;\n }\n if (checkResult.status === CheckStatus.AT_LEAST_ONE_BAD_AT_LEAST_ONE_GOOD) {\n showWarning(i18n.t('message.SimulationWillStartDespiteWarnings', lang));\n }\n showInfo(i18n.t('message.SimulationStarted', lang));\n // give it 0.1 second for the info to show up\n setTimeout(() => {\n selectNone();\n usePrimitiveStore.setState((state) => {\n state.runYearlyThermalSimulation = true;\n state.pauseYearlyThermalSimulation = false;\n state.simulationInProgress = true;\n });\n setCommonStore((state) => {\n if (loggable) {\n state.actionInfo = {\n name: 'Run Yearly Building Energy Analysis',\n timestamp: new Date().getTime(),\n };\n }\n });\n }, 100);\n }}\n />\n }\n title={i18n.t('word.SaveAsImage', lang)}\n onClick={() => {\n screenshot('line-graph-' + labelX + '-' + labelY, 'yearly-building-energy', {}).then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Take Screenshot of Yearly Building Energy Graph',\n timestamp: new Date().getTime(),\n };\n });\n }\n });\n }}\n />\n {resultRef.current && resultRef.current.length > 0 && (\n }\n title={i18n.t('word.SaveAsCsv', lang)}\n onClick={() => {\n saveCsv(resultRef.current, 'yearly-building-energy.csv');\n showInfo(i18n.t('message.CsvFileSaved', lang));\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Export Yearly Building Energy Result as CSV',\n timestamp: new Date().getTime(),\n };\n });\n }\n }}\n />\n )}\n
\n )}\n \n \n \n );\n};\n\nexport default React.memo(YearlyBuildingEnergyPanel);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button, Col, InputNumber, Modal, Row } from 'antd';\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\nimport { UndoableChange } from '../undo/UndoableChange';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\n\nconst NavigationPanel = ({ setDialogVisible }: { setDialogVisible: (b: boolean) => void }) => {\n const setCommonStore = useStore(Selector.set);\n const language = useStore(Selector.language);\n const addUndoable = useStore(Selector.addUndoable);\n const minimumMoveSpeed = useStore(Selector.minimumNavigationMoveSpeed);\n const minimumTurnSpeed = useStore(Selector.minimumNavigationTurnSpeed);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const [dragEnabled, setDragEnabled] = useState(false);\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\n const dragRef = useRef(null);\n const okButtonRef = useRef(null);\n const minimumMoveSpeedRef = useRef(minimumMoveSpeed);\n const minimumTurnSpeedRef = useRef(minimumTurnSpeed);\n\n const lang = { lng: language };\n\n useEffect(() => {\n okButtonRef.current?.focus();\n }, []);\n\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\n if (dragRef.current) {\n const { clientWidth, clientHeight } = window.document.documentElement;\n const targetRect = dragRef.current.getBoundingClientRect();\n setBounds({\n left: -targetRect.left + uiData.x,\n right: clientWidth - (targetRect.right - uiData.x),\n top: -targetRect.top + uiData.y,\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\n });\n }\n };\n\n const setMinimumMoveSpeed = (value: number) => {\n setCommonStore((state) => {\n state.minimumNavigationMoveSpeed = value;\n });\n usePrimitiveStore.setState((state) => {\n state.navigationMoveSpeed = value;\n });\n };\n\n const setMinimumTurnSpeed = (value: number) => {\n setCommonStore((state) => {\n state.minimumNavigationTurnSpeed = value;\n });\n usePrimitiveStore.setState((state) => {\n state.navigationTurnSpeed = value;\n });\n };\n\n const apply = () => {\n const oldMoveSpeed = minimumMoveSpeed;\n const newMoveSpeed = minimumMoveSpeedRef.current;\n if (oldMoveSpeed !== newMoveSpeed) {\n const undoableChange = {\n name: 'Minimum Navigation Move Speed',\n timestamp: Date.now(),\n oldValue: oldMoveSpeed,\n newValue: newMoveSpeed,\n undo: () => {\n setMinimumMoveSpeed(undoableChange.oldValue as number);\n },\n redo: () => {\n setMinimumMoveSpeed(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setMinimumMoveSpeed(newMoveSpeed);\n }\n\n const oldTurnSpeed = minimumTurnSpeed;\n const newTurnSpeed = minimumTurnSpeedRef.current;\n if (oldTurnSpeed !== newTurnSpeed) {\n const undoableChange = {\n name: 'Minimum Navigation Turn Speed',\n timestamp: Date.now(),\n oldValue: oldTurnSpeed,\n newValue: newTurnSpeed,\n undo: () => {\n setMinimumTurnSpeed(undoableChange.oldValue as number);\n },\n redo: () => {\n setMinimumTurnSpeed(undoableChange.newValue as number);\n },\n } as UndoableChange;\n addUndoable(undoableChange);\n setMinimumTurnSpeed(newTurnSpeed);\n }\n };\n\n const onCancelClick = () => {\n setDialogVisible(false);\n };\n\n const onOkClick = () => {\n apply();\n setDialogVisible(false);\n };\n\n return (\n setDragEnabled(true)}\n onMouseOut={() => setDragEnabled(false)}\n >\n {i18n.t('navigationPanel.NavigationParameters', lang)}\n \n }\n footer={[\n ,\n ,\n ]}\n // this must be specified for the x button in the upper-right corner to work\n onCancel={() => {\n setDialogVisible(false);\n }}\n maskClosable={false}\n destroyOnClose={false}\n modalRender={(modal) => (\n onStart(event, uiData)}>\n
{modal}
\n
\n )}\n >\n \n \n {i18n.t('navigationPanel.MinimumMoveSpeed', lang) + ' ([1, 10]): '}\n \n \n {\n minimumMoveSpeedRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n onBlur={(e) => {\n const value = (e.target as HTMLInputElement).value;\n const v = parseFloat(value);\n minimumMoveSpeedRef.current = Number.isNaN(v) ? 3 : v;\n setUpdateFlag(!updateFlag);\n }}\n onPressEnter={(e) => {\n const value = (e.target as HTMLInputElement).value;\n const v = parseFloat(value);\n minimumMoveSpeedRef.current = Number.isNaN(v) ? 3 : v;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n \n \n {i18n.t('navigationPanel.MinimumTurnSpeed', lang) + ' ([1, 5]): '}\n \n \n {\n minimumTurnSpeedRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n onBlur={(e) => {\n const value = (e.target as HTMLInputElement).value;\n const v = parseFloat(value);\n minimumTurnSpeedRef.current = Number.isNaN(v) ? 3 : v;\n setUpdateFlag(!updateFlag);\n }}\n onPressEnter={(e) => {\n const value = (e.target as HTMLInputElement).value;\n const v = parseFloat(value);\n minimumTurnSpeedRef.current = Number.isNaN(v) ? 3 : v;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n \n \n );\n};\n\nexport default React.memo(NavigationPanel);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n *\n */\n\nimport React, { useEffect, useState } from 'react';\nimport MapPanel from './panels/mapPanel';\nimport HeliodonPanel from './panels/heliodonPanel';\nimport WeatherPanel from './panels/weatherPanel';\nimport YearlyLightSensorPanel from './panels/yearlyLightSensorPanel';\nimport DailyLightSensorPanel from './panels/dailyLightSensorPanel';\nimport StickyNotePanel from './panels/stickyNotePanel';\nimport InstructionPanel from './panels/instructionPanel';\nimport YearlyPvYieldPanel from './panels/yearlyPvYieldPanel';\nimport DailyPvYieldPanel from './panels/dailyPvYieldPanel';\nimport DesignInfoPanel from './panels/designInfoPanel';\nimport SiteInfoPanel from './panels/siteInfoPanel';\nimport VisualizationControlPanel from './panels/visualizationControlPanel';\nimport VisibilityResultsPanel from './panels/visibilityResultsPanel';\nimport YearlyParabolicTroughYieldPanel from './panels/yearlyParabolicTroughYieldPanel';\nimport DailyParabolicTroughYieldPanel from './panels/dailyParabolicTroughYieldPanel';\nimport DailyParabolicDishYieldPanel from './panels/dailyParabolicDishYieldPanel';\nimport YearlyParabolicDishYieldPanel from './panels/yearlyParabolicDishYieldPanel';\nimport DailyFresnelReflectorYieldPanel from './panels/dailyFresnelReflectorYieldPanel';\nimport YearlyFresnelReflectorYieldPanel from './panels/yearlyFresnelReflectorYieldPanel';\nimport DailyHeliostatYieldPanel from './panels/dailyHeliostatYieldPanel';\nimport YearlyHeliostatYieldPanel from './panels/yearlyHeliostatYieldPanel';\nimport DailySolarUpdraftTowerYieldPanel from './panels/dailySolarUpdraftTowerYieldPanel';\nimport DiurnalTemperaturePanel from './panels/diurnalTemperaturePanel';\nimport YearlySolarUpdraftTowerYieldPanel from './panels/yearlySolarUpdraftTowerYieldPanel';\nimport SolarPanelOptimizationResult from './panels/solarPanelOptimizationResult';\nimport EconomicsPanel from './panels/economicsPanel';\nimport DailyBuildingEnergyPanel from './panels/dailyBuildingEnergyPanel';\nimport YearlyBuildingEnergyPanel from './panels/yearlyBuildingEnergyPanel';\nimport { usePrimitiveStore } from './stores/commonPrimitive';\nimport { useStore } from './stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { GraphDataType } from './types';\nimport NavigationPanel from './panels/navigationPanel';\n\nconst Panels = () => {\n const showSiteInfoPanel = useStore(Selector.viewState.showSiteInfoPanel);\n const showDesignInfoPanel = useStore(Selector.viewState.showDesignInfoPanel);\n const showInstructionPanel = useStore(Selector.viewState.showInstructionPanel);\n const showMapPanel = useStore(Selector.viewState.showMapPanel);\n const showHeliodonPanel = useStore(Selector.viewState.showHeliodonPanel);\n const showStickyNotePanel = useStore(Selector.viewState.showStickyNotePanel);\n const showWeatherPanel = useStore(Selector.viewState.showWeatherPanel);\n const showDiurnalTemperaturePanel = useStore(Selector.viewState.showDiurnalTemperaturePanel);\n const showEconomicsPanel = usePrimitiveStore(Selector.showEconomicsPanel);\n const showNavigationPanel = usePrimitiveStore(Selector.showNavigationPanel);\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\n const showDailyLightSensorPanel = useStore(Selector.viewState.showDailyLightSensorPanel);\n const showYearlyLightSensorPanel = useStore(Selector.viewState.showYearlyLightSensorPanel);\n const showDailyPvYieldPanel = useStore(Selector.viewState.showDailyPvYieldPanel);\n const showYearlyPvYieldPanel = useStore(Selector.viewState.showYearlyPvYieldPanel);\n const showVisibilityResultsPanel = useStore(Selector.viewState.showVisibilityResultsPanel);\n const showDailyParabolicTroughYieldPanel = useStore(Selector.viewState.showDailyParabolicTroughYieldPanel);\n const showYearlyParabolicTroughYieldPanel = useStore(Selector.viewState.showYearlyParabolicTroughYieldPanel);\n const showDailyParabolicDishYieldPanel = useStore(Selector.viewState.showDailyParabolicDishYieldPanel);\n const showYearlyParabolicDishYieldPanel = useStore(Selector.viewState.showYearlyParabolicDishYieldPanel);\n const showDailyFresnelReflectorYieldPanel = useStore(Selector.viewState.showDailyFresnelReflectorYieldPanel);\n const showYearlyFresnelReflectorYieldPanel = useStore(Selector.viewState.showYearlyFresnelReflectorYieldPanel);\n const showDailyHeliostatYieldPanel = useStore(Selector.viewState.showDailyHeliostatYieldPanel);\n const showYearlyHeliostatYieldPanel = useStore(Selector.viewState.showYearlyHeliostatYieldPanel);\n const showDailyUpdraftTowerYieldPanel = useStore(Selector.viewState.showDailyUpdraftTowerYieldPanel);\n const showYearlyUpdraftTowerYieldPanel = useStore(Selector.viewState.showYearlyUpdraftTowerYieldPanel);\n const showDailyBuildingEnergyPanel = useStore(Selector.viewState.showDailyBuildingEnergyPanel);\n const showYearlyBuildingEnergyPanel = useStore(Selector.viewState.showYearlyBuildingEnergyPanel);\n const showEvolutionPanel = useStore(Selector.viewState.showEvolutionPanel);\n const projectView = useStore(Selector.projectView);\n const worldLatitude = useStore(Selector.world.latitude);\n const worldLongitude = useStore(Selector.world.longitude);\n const getClosestCity = useStore(Selector.getClosestCity);\n const navigation = useStore(Selector.viewState.navigationView) ?? false;\n\n const [city, setCity] = useState('Boston MA, USA');\n\n useEffect(() => {\n setCity(getClosestCity(worldLatitude, worldLongitude) ?? 'Boston MA, USA');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [worldLatitude, worldLongitude]);\n\n return (\n <>\n {showMapPanel && }\n {showHeliodonPanel && }\n {showStickyNotePanel && }\n {showSiteInfoPanel && }\n {showDesignInfoPanel && }\n {(showInstructionPanel || navigation) && !projectView && }\n {showWeatherPanel && (\n \n )}\n {showDiurnalTemperaturePanel && }\n {showEconomicsPanel && (\n {\n usePrimitiveStore.setState((state) => {\n state.showEconomicsPanel = visible;\n });\n }}\n />\n )}\n {showNavigationPanel && (\n {\n usePrimitiveStore.setState((state) => {\n state.showNavigationPanel = visible;\n });\n }}\n />\n )}\n {showYearlyLightSensorPanel && }\n {showDailyLightSensorPanel && }\n {showYearlyPvYieldPanel && }\n {showDailyPvYieldPanel && }\n {showVisibilityResultsPanel && }\n {showYearlyParabolicTroughYieldPanel && }\n {showDailyParabolicTroughYieldPanel && }\n {showYearlyParabolicDishYieldPanel && }\n {showDailyParabolicDishYieldPanel && }\n {showDailyFresnelReflectorYieldPanel && }\n {showYearlyFresnelReflectorYieldPanel && }\n {showDailyHeliostatYieldPanel && }\n {showYearlyHeliostatYieldPanel && }\n {showDailyUpdraftTowerYieldPanel && }\n {showYearlyUpdraftTowerYieldPanel && }\n {showDailyBuildingEnergyPanel && }\n {showYearlyBuildingEnergyPanel && }\n {showSolarRadiationHeatmap && }\n {showEvolutionPanel && }\n \n );\n};\n\nexport default React.memo(Panels);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport { WallModel } from '../models/WallModel';\nimport { Util } from '../Util';\nimport {\n AMBIENT_LIGHT_THRESHOLD,\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n ROOFTOP_SOLAR_PANEL_OFFSET,\n} from './sunTools';\nimport { Euler, Quaternion, Vector2, Vector3 } from 'three';\nimport { HALF_PI, UNIT_VECTOR_POS_Y, UNIT_VECTOR_POS_Z } from '../constants';\nimport { AirMass } from './analysisConstants';\nimport { Point2 } from '../models/Point2';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { WorldModel } from '../models/WorldModel';\nimport { ElementModel } from '../models/ElementModel';\nimport { DoorModel, DoorType } from '../models/DoorModel';\nimport { RoofModel } from '../models/RoofModel';\nimport { WindowModel, WindowType } from '../models/WindowModel';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { Discretization, ObjectType, Orientation, ShadeTolerance, TrackerType } from '../types';\nimport { PvModel } from '../models/PvModel';\nimport { RoofUtil } from '../views/roof/RoofUtil';\n\nexport class SolarRadiation {\n // return the output energy density of a solar panel (need to be multiplied by area, weather factor, etc.)\n static computeSolarPanelOutput(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n pvModel: PvModel,\n panel: SolarPanelModel,\n parent: ElementModel,\n foundation: FoundationModel,\n elevation: number,\n distanceToClosestObject: Function,\n ): { heatmap: number[][]; average: number } {\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = foundation;\n }\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, foundation, panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const rot = parent.rotation[2];\n let angle = panel.tiltAngle;\n let zRot = rot + panel.relativeAzimuth;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n const normal = new Vector3().fromArray(panel.normal);\n const month = now.getMonth();\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n let lx: number, ly: number, nx: number, ny: number;\n let dCell: number;\n if (world.discretization === Discretization.EXACT) {\n lx = panel.lx;\n ly = panel.ly;\n if (panel.orientation === Orientation.portrait) {\n nx = Math.max(1, Math.round(panel.lx / pvModel.width));\n ny = Math.max(1, Math.round(panel.ly / pvModel.length));\n nx *= pvModel.n;\n ny *= pvModel.m;\n } else {\n nx = Math.max(1, Math.round(panel.lx / pvModel.length));\n ny = Math.max(1, Math.round(panel.ly / pvModel.width));\n nx *= pvModel.m;\n ny *= pvModel.n;\n }\n dCell = panel.lx / nx;\n } else {\n lx = panel.lx;\n ly = panel.ly;\n nx = Math.max(2, Math.round(panel.lx / cellSize));\n ny = Math.max(2, Math.round(panel.ly / cellSize));\n // nx and ny must be even (for circuit simulation)\n if (nx % 2 !== 0) nx += 1;\n if (ny % 2 !== 0) ny += 1;\n dCell = cellSize;\n }\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - dCell) / 2;\n const y0 = center.y - (ly - dCell) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const cellOutputs = Array.from(Array(nx), () => new Array(ny));\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof.\n // so we only need to tilt the normal for a solar panel on a foundation or flat roof\n let normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n if (panel.trackerType !== TrackerType.NO_TRACKER) {\n // dynamic angles\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n switch (panel.trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const qRotAADAT = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n normalEuler = new Euler().setFromQuaternion(qRotAADAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n const qRotHSAT = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x, 0, rotatedSunDirection.z).normalize(),\n );\n normalEuler = new Euler().setFromQuaternion(qRotHSAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n const v2 = new Vector3(rotatedSunDirection.x, -rotatedSunDirection.y, 0).normalize();\n const az = Math.acos(UNIT_VECTOR_POS_Y.dot(v2)) * Math.sign(v2.x);\n normalEuler = new Euler(panel.tiltAngle, 0, az + rot, 'ZYX');\n break;\n case TrackerType.TILTED_SINGLE_AXIS_TRACKER:\n // TODO\n break;\n }\n }\n normal.applyEuler(normalEuler);\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = indirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (distanceToClosestObject(panel.id, v, sunDirection) < 0) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n // we must consider cell wiring and distributed efficiency\n // Nice demo at: https://www.youtube.com/watch?v=UNPJapaZlCU\n let sum = 0;\n switch (pvModel.shadeTolerance) {\n case ShadeTolerance.NONE:\n // all the cells are connected in a single series,\n // so the total output is determined by the minimum\n let min1 = Number.MAX_VALUE;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min1) {\n min1 = c;\n }\n }\n }\n sum = min1 * nx * ny;\n break;\n case ShadeTolerance.PARTIAL:\n // assuming each panel uses a diode bypass to connect two columns of cells\n let min2 = Number.MAX_VALUE;\n if (panel.orientation === Orientation.portrait) {\n // e.g., nx = 6, ny = 10\n for (let kx = 0; kx < nx; kx++) {\n if (kx % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (kx % 2 === 1) {\n sum += min2 * ny * 2;\n }\n }\n } else {\n // landscape, e.g., nx = 10, ny = 6\n for (let ky = 0; ky < ny; ky++) {\n if (ky % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let kx = 0; kx < nx; kx++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (ky % 2 === 1) {\n sum += min2 * nx * 2;\n }\n }\n }\n break;\n default:\n // this probably is too idealized\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n sum += cellOutputs[kx][ky];\n }\n }\n break;\n }\n return { heatmap: cellOutputs, average: sum / (nx * ny) };\n }\n\n // Return an array that represents solar energy intensity radiated onto the discretized cells of a wall,\n // along with the unit area. Also return an array with the specific margin for generating a better looking heatmap.\n static computeWallSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n wall: WallModel,\n foundation: FoundationModel,\n windows: ElementModel[],\n doors: ElementModel[],\n solarPanels: ElementModel[],\n margin: number,\n elevation: number,\n distanceToClosestObject: Function,\n ): { intensity: number[][]; unitArea: number; heatmap: number[][] } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const lx = wall.lx;\n const lz = Util.getHighestPointOfWall(wall); // height\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n lz / 2 + foundation.lz,\n );\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const v = new Vector3();\n const polygonWithMargin = Util.getWallVertices(wall, margin);\n // if margin is zero, skip the calculation to save time\n const polygon = margin === 0 ? null : Util.getWallVertices(wall, 0);\n const halfDif = (lz - wall.lz) / 2;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n const heatmap: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let isWall;\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n const p = { x: kx2 * dx, y: kz2 * dz + halfDif } as Point2;\n const insidePolygonWithMargin = Util.isPointInside(p.x, p.y, polygonWithMargin);\n if (insidePolygonWithMargin) {\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n isWall = true;\n if (windows && windows.length > 0) {\n for (const w of windows) {\n if (w.type !== ObjectType.Window) continue;\n const cx = w.cx * wall.lx;\n const cz = w.cz * wall.lz;\n const hx = (w.lx * wall.lx) / 2;\n const hz = (w.lz * wall.lz) / 2;\n const window = w as WindowModel;\n if (window.windowType === WindowType.Arched) {\n const absWindowPos = absPos.clone().add(new Vector3(window.cx * wall.lx, 0, window.cz * wall.lz));\n if (SolarRadiation.pointWithinArch(v, window.lx, window.lz, window.archHeight, absWindowPos)) {\n isWall = false;\n }\n } else {\n if (p.x >= cx - hx && p.x < cx + hx && p.y >= cz - hz && p.y < cz + hz) {\n isWall = false;\n break;\n }\n }\n }\n }\n if (doors && doors.length > 0) {\n for (const d of doors) {\n if (d.type !== ObjectType.Door) continue;\n const cx = d.cx * wall.lx;\n const cz = d.cz * wall.lz;\n const hx = (d.lx * wall.lx) / 2;\n const hz = (d.lz * wall.lz) / 2;\n const door = d as DoorModel;\n if (door.doorType === DoorType.Arched) {\n const absDoorPos = absPos.clone().add(new Vector3(door.cx * wall.lx, 0, door.cz * wall.lz));\n if (SolarRadiation.pointWithinArch(v, door.lx, door.lz, door.archHeight, absDoorPos)) {\n isWall = false;\n }\n } else {\n if (p.x >= cx - hx && p.x < cx + hx && p.y >= cz - hz && p.y < cz + hz) {\n isWall = false;\n break;\n }\n }\n }\n }\n if (solarPanels && solarPanels.length > 0) {\n for (const s of solarPanels) {\n const cx = s.cx * wall.lx;\n const cz = s.cz * wall.lz;\n const hx = s.lx / 2;\n const hz = s.ly / 2;\n if (p.x >= cx - hx && p.x < cx + hx && p.y >= cz - hz && p.y < cz + hz) {\n isWall = false;\n break;\n }\n }\n }\n if (isWall) {\n const insidePolygon = polygon === null ? true : Util.isPointInside(p.x, p.y, polygon);\n const distance = distanceToClosestObject(wall.id, v, sunDirection);\n heatmap[kx][kz] += indirectRadiation;\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n if (insidePolygon) {\n intensity[kx][kz] += indirectRadiation;\n }\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n heatmap[kx][kz] += dot * peakRadiation;\n if (insidePolygon) {\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n return { intensity: intensity, unitArea: dx * dz, heatmap: heatmap };\n }\n\n // return an array that represents solar energy radiated onto the discretized cells of a door,\n // along with the unit area\n static computeDoorSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n door: DoorModel,\n wall: WallModel,\n foundation: FoundationModel,\n elevation: number,\n distanceToClosestObject: Function,\n ): { intensity: number[][]; unitArea: number } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const lx = door.lx * wall.lx;\n const lz = door.lz * wall.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absWallPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n const absDoorPos = absWallPos.clone().add(new Vector3(door.cx * wall.lx, 0, door.cz * wall.lz));\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const v = new Vector3();\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n if (door.doorType === DoorType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absDoorPos.x + kx2 * dxcos, absDoorPos.y + kx2 * dxsin, absDoorPos.z + kz2 * dz);\n if (SolarRadiation.pointWithinArch(v, lx, lz, door.archHeight, absDoorPos)) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (distanceToClosestObject(door.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absDoorPos.x + kx2 * dxcos, absDoorPos.y + kx2 * dxsin, absDoorPos.z + kz2 * dz);\n if (distanceToClosestObject(door.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { intensity: intensity, unitArea: dx * dz };\n }\n\n static pointWithinArch(point: Vector3, lx: number, lz: number, archHeight: number, center: Vector3): boolean {\n if (archHeight > 0) {\n const hx = 0.5 * lx;\n const ah = Math.min(archHeight, lz, hx); // actual arch height\n const r = 0.5 * (ah + (hx * hx) / ah); // arc radius\n // check if the point is within the rectangular part\n const dx = point.x - center.x;\n const dy = point.y - center.y;\n const dr = dx * dx + dy * dy;\n let dz = point.z - center.z;\n if (dr < hx * hx && dz < lz / 2 - ah && dz > -lz / 2) {\n return true;\n }\n // check if the point is within the arch part\n dz = point.z - (lz - r);\n return dr + dz * dz < r * r;\n }\n return true;\n }\n\n // return an array that represents solar energy radiated onto the discretized cells of a window on a wall,\n // along with the unit area\n static computeWallWindowSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n window: WindowModel,\n wall: WallModel,\n foundation: FoundationModel,\n elevation: number,\n distanceToClosestObject: Function,\n ): { intensity: number[][]; unitArea: number } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const lx = window.lx * wall.lx;\n const lz = window.lz * wall.lz;\n // FIXME: when lx / cellSize is small, this discretization gives inaccurate results\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absWallAngle = foundation.rotation[2] + wall.relativeAngle;\n const absWallPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n const absWindowPos = absWallPos.clone().add(new Vector3(window.cx * wall.lx, 0, window.cz * wall.lz));\n const normal = new Vector3(Math.cos(absWallAngle - HALF_PI), Math.sin(absWallAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absWallAngle);\n const dxsin = dx * Math.sin(absWallAngle);\n const v = new Vector3();\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n if (window.windowType === WindowType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absWindowPos.x + kx2 * dxcos, absWindowPos.y + kx2 * dxsin, absWindowPos.z + kz2 * dz);\n if (SolarRadiation.pointWithinArch(v, lx, lz, window.archHeight, absWindowPos)) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (distanceToClosestObject(window.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absWindowPos.x + kx2 * dxcos, absWindowPos.y + kx2 * dxsin, absWindowPos.z + kz2 * dz);\n if (distanceToClosestObject(window.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { intensity: intensity, unitArea: dx * dz };\n }\n\n // return an array that represents solar energy radiated onto the discretized cells of a window on a roof,\n // along with the unit area\n static computeRoofWindowSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n window: WindowModel,\n roof: RoofModel,\n foundation: FoundationModel,\n elevation: number,\n distanceToClosestObject: Function,\n ): { intensity: number[][]; unitArea: number } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const lx = window.lx;\n const lz = window.lz;\n // FIXME: when lx / cellSize is small, this discretization gives inaccurate results\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const position = new Vector3(window.cx, window.cy, window.cz).applyEuler(new Euler(0, 0, foundation.rotation[2]));\n position.x += foundation.cx;\n position.y += foundation.cy;\n position.z += foundation.lz;\n const euler = new Euler(window.rotation[0], window.rotation[1], window.rotation[2] + foundation.rotation[2], 'ZXY');\n const normal = new Vector3(0, 0, 1).applyEuler(euler);\n const v = new Vector3();\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n if (window.windowType === WindowType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n const dis = new Vector3(kx2, kz2, 0);\n dis.applyEuler(euler);\n v.set(position.x + dis.x, position.y + dis.y, position.z + dis.z);\n if (SolarRadiation.pointWithinArch(v, lx, lz, window.archHeight, position)) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (distanceToClosestObject(window.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n intensity[kx][kz] += indirectRadiation;\n if (dot > 0) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n const dis = new Vector3(kx2, kz2, 0);\n dis.applyEuler(euler);\n v.set(position.x + dis.x, position.y + dis.y, position.z + dis.z);\n if (distanceToClosestObject(window.id, v, sunDirection) < 0) {\n // direct radiation\n intensity[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { intensity: intensity, unitArea: dx * dz };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a pyramid roof,\n // along with the unit areas on the segments (which may differ)\n static computePyramidRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n flat: boolean,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n if (flat) {\n return SolarRadiation.computeFlatRoofSolarRadiationEnergy(\n now,\n world,\n sunDirection,\n roof,\n withoutOverhang,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n }\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n // find the position of the top point relative to the first edge point\n const m2 = (m * v20.dot(v10)) / length10;\n v20.normalize();\n v21.normalize();\n // find the normal vector of the plane (must normalize the cross product as it is not normalized!)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const v = new Vector3();\n const relativePolygon: Point2[] = [];\n const margin = 0.01;\n relativePolygon.push({ x: -margin, y: -margin } as Point2);\n relativePolygon.push({ x: m + margin, y: -margin } as Point2);\n relativePolygon.push({ x: m2, y: n + margin } as Point2);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n let within = true;\n if (withoutOverhang) {\n within = Util.isPointInside(p, q, relativePolygon);\n }\n if (within) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a hip roof,\n // along with the unit areas on the segments (which may differ)\n static computeHipRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n flat: boolean,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n if (flat) {\n return SolarRadiation.computeFlatRoofSolarRadiationEnergy(\n now,\n world,\n sunDirection,\n roof,\n withoutOverhang,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n }\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n // find the position of the top point relative to the first edge point\n const m2 = (m * v20.dot(v10)) / length10;\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n // (must normalize the cross product of two normalized vectors as it is not automatically normalized)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n const v = new Vector3();\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const projectedVertices: Point2[] = [];\n for (const t of s) {\n projectedVertices.push({ x: t.x, y: t.y } as Point2);\n }\n if (index % 2 === 0) {\n // even number (0, 2) are quads, odd number (1, 3) are triangles\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n let within = true;\n if (withoutOverhang) {\n within = Util.isPointInside(v.x, v.y, projectedVertices);\n }\n if (within) {\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n const relativePolygon: Point2[] = [];\n const margin = 0.01;\n relativePolygon.push({ x: -margin, y: -margin } as Point2);\n relativePolygon.push({ x: m + margin, y: -margin } as Point2);\n relativePolygon.push({ x: m2, y: n + margin } as Point2);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n let within = true;\n if (withoutOverhang) {\n within = Util.isPointInside(p, q, relativePolygon);\n }\n if (within) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a gambrel roof,\n // along with the unit areas on the segments (which may differ)\n static computeGambrelRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n flat: boolean,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n if (flat) {\n return SolarRadiation.computeFlatRoofSolarRadiationEnergy(\n now,\n world,\n sunDirection,\n roof,\n withoutOverhang,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n }\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a mansard roof,\n // along with the unit areas on the segments (which may differ)\n static computeMansardRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n flat: boolean,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n if (flat) {\n return SolarRadiation.computeFlatRoofSolarRadiationEnergy(\n now,\n world,\n sunDirection,\n roof,\n withoutOverhang,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n }\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n // start with the top surface\n if (index === segments.length - 1) {\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const h0 = s[0].z;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n segmentUnitAreas.push(dx * dy);\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n segmentIntensities.push(intensity);\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n minX + cellSize / 2,\n minY + cellSize / 2,\n foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n const v = new Vector3(0, 0, v0.z);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n v.y = v0.y + q * dy;\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n } else {\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n static computeFlatRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const s of segments) {\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n const intensity: number[][] = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n segmentIntensities.push(intensity);\n segmentUnitAreas.push(dx * dy);\n const h0 = segments[0][0].z;\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n minX + cellSize / 2,\n minY + cellSize / 2,\n foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n const v = new Vector3(0, 0, v0.z);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n v.y = v0.y + q * dy;\n // TODO: Check if this works when windows on flat roofs are implemented\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(roof.id, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n // return arrays of solar energy radiated onto the discretized cells of the segments of a gable roof,\n // along with the unit areas on the segments (which may differ)\n static computeGableRoofSolarRadiationEnergy(\n now: Date,\n world: WorldModel,\n sunDirection: Vector3,\n roof: RoofModel,\n withoutOverhang: boolean,\n segments: Vector3[][],\n foundation: FoundationModel,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n elevation: number,\n distanceToClosestObject: Function,\n ): { segmentIntensities: number[][][]; segmentUnitArea: number[] } {\n const dayOfYear = Util.dayOfYear(now);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const segmentIntensities: number[][][] = [];\n const segmentUnitAreas: number[] = [];\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const intensity: number[][] = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n segmentIntensities.push(intensity);\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n // we have to add roof thickness since the segment vertices without overhang are from the inside surface\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET + (withoutOverhang ? roof.thickness : 0),\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n segmentUnitAreas.push(dm.length() * dn.length());\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (SolarRadiation.isPointRoof(v, windows, solarPanels, foundation)) {\n const distance = distanceToClosestObject(uuid, v, sunDirection);\n if (distance > AMBIENT_LIGHT_THRESHOLD || distance < 0) {\n intensity[p][q] += indirectRadiation;\n }\n if (dot > 0 && distance < 0) {\n // direct radiation\n intensity[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n return { segmentIntensities: segmentIntensities, segmentUnitArea: segmentUnitAreas };\n }\n\n static isPointRoof(\n v: Vector3,\n windows: ElementModel[],\n solarPanels: ElementModel[],\n foundation: FoundationModel,\n ): boolean {\n if (windows && windows.length > 0) {\n for (const w of windows) {\n const vertices = RoofUtil.getAbsoluteWindowVerticesOnRoof(w as WindowModel, foundation);\n const points = Util.getPoints(vertices);\n if (Util.isPointInside(v.x, v.y, points)) {\n return false;\n }\n }\n }\n if (solarPanels && solarPanels.length > 0) {\n for (const sp of solarPanels) {\n const vertices = RoofUtil.getAbsoluteSolarPanelVerticesOnRoof(sp as SolarPanelModel, foundation);\n const points = Util.getPoints(vertices);\n if (Util.isPointInside(v.x, v.y, points)) {\n return false;\n }\n }\n }\n return true;\n }\n}\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport { usePrimitiveStore } from 'src/stores/commonPrimitive';\nimport * as Selector from '../stores/selector';\nimport { RoofModel, RoofType } from '../models/RoofModel';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { DiurnalTemperatureModel, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { MINUTES_OF_DAY } from './analysisConstants';\nimport { WallFill, WallModel, WallStructure } from '../models/WallModel';\nimport {\n computeOutsideTemperature,\n getGroundTemperatureAtMinute,\n getLightAbsorption,\n getOutsideTemperatureAtMinute,\n U_VALUE_OPENING,\n} from './heatTools';\nimport {\n computeDeclinationAngle,\n computeHourAngle,\n computeSunLocation,\n computeSunriseAndSunsetInMinutes,\n} from './sunTools';\nimport { WindowModel } from '../models/WindowModel';\nimport { DoorModel } from '../models/DoorModel';\nimport { Point2 } from '../models/Point2';\nimport { useThree } from '@react-three/fiber';\nimport { Intersection, Object3D, Raycaster, Vector3 } from 'three';\nimport { SolarRadiation } from './SolarRadiation';\nimport {\n DEFAULT_CEILING_R_VALUE,\n DEFAULT_DOOR_U_VALUE,\n DEFAULT_FOUNDATION_SLAB_DEPTH,\n DEFAULT_GROUND_FLOOR_R_VALUE,\n DEFAULT_ROOF_R_VALUE,\n DEFAULT_WALL_R_VALUE,\n DEFAULT_WINDOW_U_VALUE,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { PvModel } from '../models/PvModel';\nimport { SunMinutes } from './SunMinutes';\nimport { useDataStore } from '../stores/commonData';\nimport { RoofUtil } from '../views/roof/RoofUtil';\n\ninterface ThermalSimulationProps {\n city: string | null;\n}\n\ninterface RoofSegmentResult {\n surfaceTemperature: number;\n totalArea: number;\n}\n\nconst ThermalSimulation = ({ city }: ThermalSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const getWeather = useStore(Selector.getWeather);\n const getFoundation = useStore(Selector.getFoundation);\n const getParent = useStore(Selector.getParent);\n const getChildrenOfType = useStore(Selector.getChildrenOfType);\n const getPvModule = useStore(Selector.getPvModule);\n const setHeatmap = useDataStore(Selector.setHeatmap);\n const getRoofSegmentVerticesWithoutOverhang = useDataStore(Selector.getRoofSegmentVerticesWithoutOverhang);\n const getRoofSegmentVertices = useDataStore(Selector.getRoofSegmentVertices);\n const setHourlyHeatExchangeArray = useDataStore(Selector.setHourlyHeatExchangeArray);\n const setHourlySolarHeatGainArray = useDataStore(Selector.setHourlySolarHeatGainArray);\n const setHourlySolarPanelOutputArray = useDataStore(Selector.setHourlySolarPanelOutputArray);\n\n const language = useStore(Selector.language);\n const loggable = useStore(Selector.loggable);\n const runDailySimulation = usePrimitiveStore(Selector.runDailyThermalSimulation);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailyThermalSimulation);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlyThermalSimulation);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlyThermalSimulation);\n\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const noAnimation = !!world.noAnimationForThermalSimulation;\n const highestTemperatureTimeInMinutes = world.highestTemperatureTimeInMinutes ?? 900;\n\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n const dayRef = useRef(0);\n const outsideTemperatureRangeRef = useRef<{ high: number; low: number }>({ high: 20, low: 0 });\n const currentOutsideTemperatureRef = useRef(20);\n const currentGroundTemperatureRef = useRef(20);\n const hourlyHeatExchangeArrayMapRef = useRef>(new Map());\n const hourlySolarHeatGainArrayMapRef = useRef>(new Map());\n const hourlySolarPanelOutputArrayMapRef = useRef>(new Map());\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const sunDirectionRef = useRef();\n const sunMinutesRef = useRef();\n const scaleFactorRef = useRef(0);\n const solarHeatmapRef = useRef>(new Map());\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const timesPerHour = world.timesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.daysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const { scene } = useThree();\n const ray = useMemo(() => new Raycaster(), []);\n\n const calculateSunDirection = () => {\n return computeSunLocation(\n 1,\n computeHourAngle(now),\n computeDeclinationAngle(now),\n Util.toRadians(world.latitude),\n ).normalize();\n };\n\n // return -1 if exposed to sunlight, otherwise return the distance of the closest object\n const distanceToClosestObject = (elementId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== elementId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n if (intersectionsRef.current.length > 0) {\n return intersectionsRef.current[0].distance;\n }\n }\n return -1;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const updateTemperature = (currentTime: Date) => {\n if (weather) {\n // get the highest and lowest temperatures of the day from the weather data\n outsideTemperatureRangeRef.current = computeOutsideTemperature(\n now,\n weather.lowestTemperatures,\n weather.highestTemperatures,\n );\n // get the air temperature at the current time\n const minutes = Util.minutesIntoDay(currentTime);\n currentOutsideTemperatureRef.current = getOutsideTemperatureAtMinute(\n outsideTemperatureRangeRef.current.high,\n outsideTemperatureRangeRef.current.low,\n world.diurnalTemperatureModel ?? DiurnalTemperatureModel.Sinusoidal,\n highestTemperatureTimeInMinutes,\n computeSunriseAndSunsetInMinutes(currentTime, world.latitude),\n minutes,\n );\n currentGroundTemperatureRef.current = getGroundTemperatureAtMinute(\n world.latitude,\n Util.dayOfYear(now),\n minutes,\n weather.lowestTemperatures,\n weather.highestTemperatures,\n highestTemperatureTimeInMinutes,\n 0.5 * (outsideTemperatureRangeRef.current.high - outsideTemperatureRangeRef.current.low),\n world.ground.thermalDiffusivity ?? 0.05,\n DEFAULT_FOUNDATION_SLAB_DEPTH,\n );\n }\n };\n\n // update the heat exchange through an element that is part of a building envelope\n const updateHeatExchangeNow = (id: string, heatExchange: number) => {\n let a = hourlyHeatExchangeArrayMapRef.current.get(id);\n if (!a) {\n // initialize\n a = new Array(24).fill(0);\n hourlyHeatExchangeArrayMapRef.current.set(id, a);\n }\n // sum the results sampled over an hour\n a[now.getHours()] += heatExchange;\n };\n\n // update solar heat gain for a building represented by the foundation's ID\n const updateSolarHeatGainNow = (id: string, gain: number) => {\n let a = hourlySolarHeatGainArrayMapRef.current.get(id);\n if (!a) {\n // initialize (polar areas may have 24 sunlight in the summer)\n a = new Array(24).fill(0);\n hourlySolarHeatGainArrayMapRef.current.set(id, a);\n }\n // sum the results sampled over an hour\n a[now.getHours()] += gain;\n };\n\n // update solar panel output for a building represented by the foundation's ID\n const updateSolarPanelOutputNow = (id: string, output: number) => {\n let a = hourlySolarPanelOutputArrayMapRef.current.get(id);\n if (!a) {\n // initialize (polar areas may have 24 sunlight in the summer)\n a = new Array(24).fill(0);\n hourlySolarPanelOutputArrayMapRef.current.set(id, a);\n }\n // sum the results sampled over an hour\n a[now.getHours()] += output;\n };\n\n const resetHourlyMaps = () => {\n for (const e of elements) {\n if (Util.onBuildingEnvelope(e)) {\n hourlyHeatExchangeArrayMapRef.current.get(e.id)?.fill(0);\n }\n if (e.type === ObjectType.Roof) {\n for (const key of hourlyHeatExchangeArrayMapRef.current.keys()) {\n if (key !== e.id && key.startsWith(e.id)) {\n hourlyHeatExchangeArrayMapRef.current.get(key)?.fill(0);\n }\n }\n }\n if (e.type === ObjectType.Foundation) {\n hourlySolarHeatGainArrayMapRef.current.get(e.id)?.fill(0);\n hourlySolarPanelOutputArrayMapRef.current.get(e.id)?.fill(0);\n }\n }\n };\n\n const resetSolarHeatMaps = () => {\n // must clear the map to allow the array to be recreated in case the dimensions will change\n solarHeatmapRef.current.clear();\n };\n\n /* do the daily simulation to generate hourly data and daily total */\n\n useEffect(() => {\n if (runDailySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticCalculateDaily();\n } else {\n fetchObjects();\n initDaily();\n requestRef.current = requestAnimationFrame(calculateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // continue the simulation\n calculateDaily();\n }\n }, [pauseDailySimulation]);\n\n // TODO\n const staticCalculateDaily = () => {\n computeNow();\n };\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n dayRef.current = Util.dayOfYear(now);\n // start from minuteInterval/2 so that the sampling points are evenly distributed within an hour\n now.setHours(0, minuteInterval / 2);\n }\n simulationCompletedRef.current = false;\n resetHourlyMaps();\n resetSolarHeatMaps();\n };\n\n const finishDaily = () => {\n // store the results in the common store for other components to use\n for (const e of elements) {\n // heat exchanges through individual elements on a building envelope\n if (Util.onBuildingEnvelope(e) || e.type === ObjectType.SolarPanel) {\n const arr = hourlyHeatExchangeArrayMapRef.current.get(e.id);\n if (arr) {\n setHourlyHeatExchangeArray(e.id, [...arr]);\n }\n // send a copy of the solar heatmap data to common store for visualization\n const heatmap = solarHeatmapRef.current.get(e.id);\n if (heatmap) {\n setHeatmap(\n e.id,\n heatmap.map((a) => [...a]),\n );\n }\n }\n // heat exchange for each roof segment\n if (e.type === ObjectType.Roof) {\n for (const key of hourlyHeatExchangeArrayMapRef.current.keys()) {\n if (key !== e.id && key.startsWith(e.id)) {\n const arr = hourlyHeatExchangeArrayMapRef.current.get(key);\n if (arr) {\n setHourlyHeatExchangeArray(key, [...arr]);\n }\n // send the solar heatmap data to common store for visualization\n const heatmap = solarHeatmapRef.current.get(key);\n if (heatmap) {\n setHeatmap(\n key,\n heatmap.map((a) => [...a]),\n );\n }\n }\n }\n }\n // the total solar heat gain through all the windows on a foundation\n // the total solar panel output through all the solar panels on a foundation\n if (e.type === ObjectType.Foundation) {\n let arr = hourlySolarHeatGainArrayMapRef.current.get(e.id);\n if (arr) {\n setHourlySolarHeatGainArray(e.id, [...arr]);\n }\n arr = hourlySolarPanelOutputArrayMapRef.current.get(e.id);\n if (arr) {\n setHourlySolarPanelOutputArray(e.id, [...arr]);\n }\n }\n }\n usePrimitiveStore.setState((state) => {\n state.flagOfDailySimulation = !state.flagOfDailySimulation;\n if (!state.runYearlyThermalSimulation) {\n state.showSolarRadiationHeatmap = true;\n state.showHeatFluxes = true;\n }\n });\n if (loggable && !runYearlySimulation) {\n // setTimeout callback will run asynchronously after finishing current execution stack,\n // which is equivalent to waiting for the results to show up in the data store.\n setTimeout(() => {\n setCommonStore((state) => {\n const heater = useDataStore.getState().totalBuildingHeater;\n const ac = useDataStore.getState().totalBuildingAc;\n const solarPanel = useDataStore.getState().totalBuildingSolarPanel;\n state.actionInfo = {\n name: 'Daily Building Energy Analysis Completed',\n result: {\n Heater: heater.toFixed(2),\n AC: ac.toFixed(2),\n SolarPanel: solarPanel.toFixed(2),\n Net: (heater + ac - solarPanel).toFixed(2),\n },\n timestamp: new Date().getTime(),\n };\n });\n }, 10);\n }\n };\n\n const calculateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes =\n now.getMinutes() + now.getHours() * 60 + (Util.dayOfYear(now) - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval > MINUTES_OF_DAY) {\n computeNow();\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyBuildingEnergyPanel = true;\n state.selectedFloatingWindow = 'dailyBuildingEnergyPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailyThermalSimulation = false;\n state.simulationPaused = false;\n state.simulationInProgress = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n return;\n }\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n computeNow();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(calculateDaily);\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n }\n };\n\n // yearly simulation\n\n const [monthIndex, setMonthIndex] = useState(now.getMonth());\n\n useEffect(() => {\n // give it some time for the scene to update as a result of month change\n setTimeout(() => {\n fetchObjects();\n }, 200);\n }, [monthIndex]);\n\n useEffect(() => {\n if (runYearlySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n //staticSimulateYearly(false);\n }, 50);\n } else {\n initYearly();\n setMonthIndex(now.getMonth());\n fetchObjects(); // ensure that the objects are fetched if the initial date happens to be in January\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n dayRef.current = Util.dayOfYear(now);\n now.setHours(0, minuteInterval / 2);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.viewState.showYearlyBuildingEnergyPanel = true;\n state.selectedFloatingWindow = 'yearlyBuildingEnergyPanel';\n state.world.date = now.toLocaleString('en-US');\n });\n }\n resetHourlyMaps();\n resetSolarHeatMaps();\n simulationCompletedRef.current = false;\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes =\n now.getMinutes() + now.getHours() * 60 + (Util.dayOfYear(now) - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes < MINUTES_OF_DAY + minuteInterval / 2) {\n // this is where time advances (by incrementing the minutes with the given interval)\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n computeNow();\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishDaily();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlyThermalSimulation = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n if (loggable) {\n setTimeout(() => {\n setCommonStore((state) => {\n const heater = useDataStore.getState().totalBuildingHeater;\n const ac = useDataStore.getState().totalBuildingAc;\n const solarPanel = useDataStore.getState().totalBuildingSolarPanel;\n state.actionInfo = {\n name: 'Yearly Building Energy Analysis Completed',\n result: {\n Heater: heater.toFixed(2),\n AC: ac.toFixed(2),\n SolarPanel: solarPanel.toFixed(2),\n Net: (heater + ac - solarPanel).toFixed(2),\n },\n timestamp: new Date().getTime(),\n };\n });\n }, 10);\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n now.setHours(0, minuteInterval / 2);\n setMonthIndex(now.getMonth());\n dayRef.current = Util.dayOfYear(now);\n resetHourlyMaps();\n resetSolarHeatMaps();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n // functions shared by daily and yearly simulations\n\n const computeNow = () => {\n updateTemperature(now);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n const daylight = sunMinutesRef.current.daylight() / 60;\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divide by times per hour as the radiation is added up that many times)\n scaleFactorRef.current =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n sunDirectionRef.current = calculateSunDirection();\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Door:\n calculateDoor(e as DoorModel);\n break;\n case ObjectType.Window:\n calculateWindow(e as WindowModel);\n calculateSolarHeatGain(e as WindowModel);\n break;\n case ObjectType.Wall:\n calculateWall(e as WallModel);\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n calculateRoof(roof);\n calculateFloor(roof);\n break;\n case ObjectType.SolarPanel:\n calculateSolarPanel(e as SolarPanelModel);\n break;\n }\n }\n };\n\n const getPanelEfficiency = (temperature: number, pvModel: PvModel) => {\n let e = pvModel.efficiency;\n if (pvModel.cellType === 'Monocrystalline') {\n e *= 0.95; // assuming that the packing density factor of semi-round cells is 0.95\n }\n return e * (1 + pvModel.pmaxTC * (temperature - 25));\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n if (!sunMinutesRef.current) throw new Error('sun minutes not set');\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (panel: SolarPanelModel) => {\n const pvModel = getPvModule(panel.pvModelName);\n if (!pvModel) throw new Error('PV model not found');\n return panel.lx * panel.ly * (panel.inverterEfficiency ?? 0.95) * (1 - monthlyIrradianceLosses[now.getMonth()]);\n };\n\n const calculateSolarPanel = (panel: SolarPanelModel) => {\n const foundation = getFoundation(panel);\n if (foundation) {\n const parent = getParent(panel);\n if (parent) {\n const pvModel = getPvModule(panel.pvModelName);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const results = SolarRadiation.computeSolarPanelOutput(\n now,\n world,\n sunDirectionRef.current,\n pvModel,\n panel,\n parent,\n foundation,\n elevation,\n distanceToClosestObject,\n );\n const factor =\n getPanelEfficiency(currentOutsideTemperatureRef.current, pvModel) *\n getTimeFactor() *\n getElementFactor(panel);\n updateSolarPanelOutputNow(foundation.id, results.average * factor);\n // sum up the solar radiation intensity for generating the solar heatmap\n if (runDailySimulation) {\n for (let i = 0; i < results.heatmap.length; i++) {\n for (let j = 0; j < results.heatmap[i].length; j++) {\n results.heatmap[i][j] *= scaleFactorRef.current;\n }\n }\n const solarHeatmap = solarHeatmapRef.current.get(panel.id);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(panel.id, [...results.heatmap]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += results.heatmap[i][j];\n }\n }\n }\n }\n }\n }\n }\n };\n\n const calculateWindow = (window: WindowModel) => {\n if (window.interior) return;\n const foundation = getFoundation(window);\n if (foundation) {\n const parent = getParent(window);\n if (parent) {\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n const area = Util.getWindowArea(window, window.parentType === ObjectType.Roof ? undefined : parent);\n const deltaT = currentOutsideTemperatureRef.current - setpoint;\n // convert heat exchange to kWh\n if (window.empty) {\n // use a large U-value for an open door (not meant to be accurate, but as an indicator of something wrong)\n updateHeatExchangeNow(window.id, (deltaT * area * U_VALUE_OPENING * 0.001) / timesPerHour);\n } else {\n updateHeatExchangeNow(\n window.id,\n (deltaT * area * (window.uValue ?? DEFAULT_WINDOW_U_VALUE) * 0.001) / timesPerHour,\n );\n }\n }\n }\n };\n\n const calculateSolarHeatGain = (window: WindowModel) => {\n if (window.interior) return;\n const foundation = getFoundation(window);\n if (foundation) {\n const parent = getParent(window);\n if (parent) {\n let totalSolarHeat = 0;\n if (window.parentType === ObjectType.Roof) {\n const segmentsWithoutOverhang = getRoofSegmentVerticesWithoutOverhang(parent.id);\n if (!segmentsWithoutOverhang) return;\n // go over roof segments\n for (let i = 0; i < segmentsWithoutOverhang.length; i++) {\n if (RoofUtil.onSegment(segmentsWithoutOverhang[i], window.cx, window.cy)) {\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n // compute solar radiation through skylight windows\n const results = SolarRadiation.computeRoofWindowSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n window,\n parent as RoofModel,\n foundation,\n elevation,\n distanceToClosestObject,\n );\n for (let i = 0; i < results.intensity.length; i++) {\n for (let j = 0; j < results.intensity[i].length; j++) {\n results.intensity[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeat += results.intensity[i][j] * results.unitArea; // for energy calculation\n }\n }\n // how much solar energy can go through the window (SHGC)\n totalSolarHeat *= window.empty ? 1 : 1 - window.opacity;\n }\n break;\n }\n }\n } else {\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const results = SolarRadiation.computeWallWindowSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n window,\n parent as WallModel,\n foundation,\n elevation,\n distanceToClosestObject,\n );\n for (let i = 0; i < results.intensity.length; i++) {\n for (let j = 0; j < results.intensity[i].length; j++) {\n results.intensity[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeat += results.intensity[i][j] * results.unitArea; // for energy calculation\n }\n }\n // how much solar energy can go through the window (SHGC)\n totalSolarHeat *= window.empty ? 1 : 1 - window.opacity;\n }\n }\n updateSolarHeatGainNow(foundation.id, totalSolarHeat / timesPerHour);\n }\n }\n };\n\n const calculateDoor = (door: DoorModel) => {\n if (door.interior) return;\n const foundation = getFoundation(door);\n if (foundation) {\n const parent = getParent(door);\n if (parent) {\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n const area = Util.getDoorArea(door, parent);\n if (door.filled) {\n const absorption = getLightAbsorption(door);\n let totalSolarHeat = 0;\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const results = SolarRadiation.computeDoorSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n door,\n parent as WallModel,\n foundation,\n elevation,\n distanceToClosestObject,\n );\n for (let i = 0; i < results.intensity.length; i++) {\n for (let j = 0; j < results.intensity[i].length; j++) {\n results.intensity[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeat += results.intensity[i][j] * results.unitArea; // for energy calculation\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap\n if (runDailySimulation) {\n const solarHeatmap = solarHeatmapRef.current.get(door.id);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(door.id, [...results.intensity]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += results.intensity[i][j];\n }\n }\n }\n }\n }\n const extraT =\n Util.isZero(totalSolarHeat) || Util.isZero(absorption)\n ? 0\n : (totalSolarHeat * absorption) / ((door.volumetricHeatCapacity ?? 0.5) * area * Math.max(door.ly, 0.1));\n const deltaT = currentOutsideTemperatureRef.current + extraT - setpoint;\n // convert heat exchange to kWh\n updateHeatExchangeNow(\n door.id,\n (deltaT * area * (door.uValue ?? DEFAULT_DOOR_U_VALUE) * 0.001) / timesPerHour,\n );\n } else {\n const deltaT = currentOutsideTemperatureRef.current - setpoint;\n // use a large U-value for an open door (not meant to be accurate, but as an indicator of something wrong)\n updateHeatExchangeNow(door.id, (deltaT * area * U_VALUE_OPENING * 0.001) / timesPerHour);\n }\n }\n }\n };\n\n const calculateWall = (wall: WallModel) => {\n const foundation = getFoundation(wall);\n if (foundation) {\n const filled = wall.fill !== WallFill.Empty && wall.wallStructure === WallStructure.Default;\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n if (filled) {\n const partial = wall.fill === WallFill.Partial && !Util.isPartialWallFull(wall);\n const frameVertices = Util.getWallVertices(wall, 0);\n const partialWallVertices = partial ? Util.getPartialWallVertices(wall, 0) : frameVertices;\n const frameArea = Util.getPolygonArea(frameVertices);\n let filledArea = partial ? Util.getPolygonArea(partialWallVertices) : frameArea;\n const windows = getChildrenOfType(ObjectType.Window, wall.id);\n const doors = getChildrenOfType(ObjectType.Door, wall.id);\n const absorption = getLightAbsorption(wall);\n let totalSolarHeat = 0;\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const rectangular = (partial ? partialWallVertices.length : frameVertices.length) === 4;\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, wall.id);\n const results = SolarRadiation.computeWallSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n wall,\n foundation,\n windows,\n doors,\n solarPanels,\n rectangular ? 0 : 1,\n elevation,\n distanceToClosestObject,\n );\n for (let i = 0; i < results.intensity.length; i++) {\n for (let j = 0; j < results.intensity[i].length; j++) {\n results.intensity[i][j] *= scaleFactorRef.current;\n totalSolarHeat += results.intensity[i][j] * results.unitArea;\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap\n if (runDailySimulation) {\n for (let i = 0; i < results.heatmap.length; i++) {\n for (let j = 0; j < results.heatmap[i].length; j++) {\n results.heatmap[i][j] *= scaleFactorRef.current;\n }\n }\n const solarHeatmap = solarHeatmapRef.current.get(wall.id);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(wall.id, [...results.heatmap]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += results.heatmap[i][j];\n }\n }\n }\n }\n }\n if (windows && windows.length > 0) {\n for (const w of windows) {\n filledArea -= Util.getWindowArea(w as WindowModel, wall);\n }\n }\n if (doors && doors.length > 0) {\n for (const d of doors) {\n filledArea -= d.lx * d.lz * wall.lx * wall.lz;\n }\n }\n const extraT =\n Util.isZero(totalSolarHeat) || Util.isZero(absorption)\n ? 0\n : (totalSolarHeat * absorption) / ((wall.volumetricHeatCapacity ?? 0.5) * filledArea * wall.ly);\n const deltaT = currentOutsideTemperatureRef.current + extraT - setpoint;\n // U is the inverse of R with SI units of W/(m^2⋅K), we convert the energy unit to kWh here\n let heatExchange = (((deltaT * filledArea) / (wall.rValue ?? DEFAULT_WALL_R_VALUE)) * 0.001) / timesPerHour;\n if (partial && wall.openToOutside) {\n // use a large U-value for the open area (not meant to be accurate, but as an indicator of something wrong)\n heatExchange +=\n ((currentOutsideTemperatureRef.current - setpoint) * (frameArea - filledArea) * U_VALUE_OPENING * 0.001) /\n timesPerHour;\n }\n updateHeatExchangeNow(wall.id, heatExchange);\n } else {\n if (wall.openToOutside) {\n const wallVertices = Util.getWallVertices(wall, 0);\n const area = Util.getPolygonArea(wallVertices);\n const deltaT = currentOutsideTemperatureRef.current - setpoint;\n // use a large U-value for an open wall (not meant to be accurate, but as an indicator of something wrong)\n updateHeatExchangeNow(wall.id, (deltaT * area * U_VALUE_OPENING * 0.001) / timesPerHour);\n }\n }\n }\n };\n\n const calculateFloor = (roof: RoofModel) => {\n const foundation = getFoundation(roof);\n if (!foundation) return;\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n const floorArea = Util.calculateBuildingArea(roof);\n const deltaT = currentGroundTemperatureRef.current - setpoint;\n updateHeatExchangeNow(\n foundation.id,\n (((deltaT * floorArea) / (foundation.rValue ?? DEFAULT_GROUND_FLOOR_R_VALUE)) * 0.001) / timesPerHour,\n );\n };\n\n /* Approximate the attic temperature based on the insulation values of the roof and the ceiling.\n 1) if the R-values are the same, the attic temperature is the mean temperature between inside and outside\n 2) if the R-value of the roof is higher, the attic temperature is closer to the inside temperature\n 3) if the R-value of the roof is lower, the attic temperature is closer to the outside temperature\n */\n const calculateAtticTemperature = (roof: RoofModel, outsideTemperature: number, setpoint: number) => {\n const roofU = 1 / (roof.rValue ?? DEFAULT_ROOF_R_VALUE);\n const ceilingU = 1 / (roof.ceilingRValue ?? DEFAULT_CEILING_R_VALUE);\n return (roofU * outsideTemperature + ceilingU * setpoint) / (roofU + ceilingU);\n };\n\n const calculateRoof = (roof: RoofModel) => {\n const foundation = getFoundation(roof);\n if (!foundation) return;\n const segmentsWithoutOverhang = getRoofSegmentVerticesWithoutOverhang(roof.id);\n if (!segmentsWithoutOverhang) return;\n let roofSegmentResults = undefined;\n switch (roof.roofType) {\n case RoofType.Pyramid:\n roofSegmentResults = calculatePyramidRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n case RoofType.Hip:\n roofSegmentResults = calculateHipRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n case RoofType.Gable:\n roofSegmentResults = calculateGableRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n case RoofType.Gambrel:\n roofSegmentResults = calculateGambrelRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n case RoofType.Mansard:\n roofSegmentResults = calculateMansardRoof(roof, segmentsWithoutOverhang, foundation);\n break;\n }\n if (roofSegmentResults) {\n const setpoint = foundation.hvacSystem?.thermostatSetpoint ?? 20;\n let heatExchange = 0;\n for (const [i, segmentResult] of roofSegmentResults.entries()) {\n const deltaT =\n segmentResult.surfaceTemperature -\n (roof.ceiling ? calculateAtticTemperature(roof, segmentResult.surfaceTemperature, setpoint) : setpoint);\n // convert heat exchange to kWh\n const segmentHeatExchange =\n (((deltaT * segmentResult.totalArea) / (roof.rValue ?? DEFAULT_ROOF_R_VALUE)) * 0.001) / timesPerHour;\n updateHeatExchangeNow(roof.id + '-' + i, segmentHeatExchange);\n heatExchange += segmentHeatExchange;\n }\n updateHeatExchangeNow(roof.id, heatExchange);\n }\n };\n\n const calculatePyramidRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Pyramid) throw new Error('roof is not pyramid');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segmentsWithoutOverhang[0][0].z;\n for (const s of segmentsWithoutOverhang) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n const m = flat ? 1 : n;\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n const totalAreas: number[] = [];\n if (flat) {\n let a = 0;\n for (const s of segmentsWithoutOverhang) {\n const points: Point2[] = [];\n for (const v of s) {\n points.push(Util.mapVector3ToPoint2(v));\n }\n a += Util.getPolygonArea(points);\n }\n if (windows.length > 0) {\n for (const w of windows) {\n a -= w.lx * w.lz;\n }\n if (a < 0) a = 0; // just in case\n }\n totalAreas.push(a);\n } else {\n for (const s of segmentsWithoutOverhang) {\n let a = Util.getTriangleArea(s[0], s[1], s[2]);\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n totalAreas.push(a);\n }\n }\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(m).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computePyramidRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const heatmapResults = SolarRadiation.computePyramidRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n const uid = m === 1 ? roof.id : roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(m).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < m; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n const calculateHipRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Hip) throw new Error('roof is not hip');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segmentsWithoutOverhang[0][0].z;\n for (const s of segmentsWithoutOverhang) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n const m = flat ? 1 : n;\n const areas: number[] = [];\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n for (const s of segmentsWithoutOverhang) {\n let a = 0;\n if (s.length === 3) {\n a = Util.getTriangleArea(s[0], s[1], s[2]);\n } else if (s.length === 4) {\n a = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\n }\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n areas.push(a);\n }\n const totalAreas: number[] = flat ? [areas.reduce((x, y) => x + y, 0)] : areas;\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(m).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computeHipRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const heatmapResults = SolarRadiation.computeHipRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n const uid = m === 1 ? roof.id : roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(m).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < m; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n const calculateGambrelRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Gambrel) throw new Error('roof is not gambrel');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segmentsWithoutOverhang[0][0].z;\n for (const s of segmentsWithoutOverhang) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n const m = flat ? 1 : n;\n const areas: number[] = [];\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n for (const s of segmentsWithoutOverhang) {\n let a = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n areas.push(a);\n }\n const totalAreas: number[] = flat ? [areas.reduce((x, y) => x + y, 0)] : areas;\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(m).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computeGambrelRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const heatmapResults = SolarRadiation.computeGambrelRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n // if the length is one, it is a flat roof\n const uid = m === 1 ? roof.id : roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(m).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < m; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n const calculateMansardRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Mansard) throw new Error('roof is not mansard');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segmentsWithoutOverhang[0][0].z;\n for (const s of segmentsWithoutOverhang) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n const m = flat ? 1 : n;\n const areas: number[] = [];\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n for (let i = 0; i < n - 1; i++) {\n const s = segmentsWithoutOverhang[i];\n let a = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n areas.push(a);\n }\n // the last segment may not be a quad\n const s = segmentsWithoutOverhang[n - 1];\n const points = new Array();\n for (const p of s) {\n points.push({ x: p.x, y: p.y } as Point2);\n }\n let a = Util.getPolygonArea(points);\n if (windows.length > 0) {\n for (let iw = windows.length - 1; iw >= 0; iw--) {\n const w = windows[iw];\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n windows.splice(iw, 1);\n }\n }\n if (a < 0) a = 0; // just in case\n }\n areas.push(a);\n const totalAreas: number[] = flat ? [areas.reduce((x, y) => x + y, 0)] : areas;\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(m).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computeMansardRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current; // for solar heatmap generation\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const heatmapResults = SolarRadiation.computeMansardRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n flat,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < m; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n // if the length is one, it is a flat roof\n const uid = m === 1 ? roof.id : roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(m).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < m; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n // gable roofs are treated as a special case\n const calculateGableRoof = (roof: RoofModel, segmentsWithoutOverhang: Vector3[][], foundation: FoundationModel) => {\n if (roof.roofType !== RoofType.Gable) throw new Error('roof is not gable');\n const n = segmentsWithoutOverhang.length;\n if (n === 0) return;\n const windows = getChildrenOfType(ObjectType.Window, roof.id);\n const totalAreas: number[] = [];\n for (const s of segmentsWithoutOverhang) {\n let a = Util.getTriangleArea(s[0], s[1], s[2]) + Util.getTriangleArea(s[2], s[3], s[0]);\n if (windows.length > 0) {\n for (const w of windows) {\n if (RoofUtil.onSegment(s, w.cx, w.cy)) {\n a -= w.lx * w.lz;\n }\n }\n if (a < 0) a = 0; // just in case\n }\n totalAreas.push(a);\n }\n const absorption = getLightAbsorption(roof);\n const totalSolarHeats: number[] = Array(n).fill(0);\n // when the sun is out\n if (sunDirectionRef.current && sunDirectionRef.current.z > 0) {\n const solarPanels = getChildrenOfType(ObjectType.SolarPanel, roof.id);\n const results = SolarRadiation.computeGableRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n true,\n segmentsWithoutOverhang,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < n; k++) {\n const seg = results.segmentIntensities[k];\n const unitArea = results.segmentUnitArea[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n totalSolarHeats[k] += seg[i][j] * unitArea; // for energy calculation\n }\n }\n }\n // sum up the solar radiation intensity for generating the solar heatmap for the entire roof (with overhang)\n if (runDailySimulation) {\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const heatmapResults = SolarRadiation.computeGableRoofSolarRadiationEnergy(\n now,\n world,\n sunDirectionRef.current,\n roof,\n false,\n segments,\n foundation,\n windows,\n solarPanels,\n elevation,\n distanceToClosestObject,\n );\n for (let k = 0; k < n; k++) {\n const seg = heatmapResults.segmentIntensities[k];\n for (let i = 0; i < seg.length; i++) {\n for (let j = 0; j < seg[i].length; j++) {\n seg[i][j] *= scaleFactorRef.current;\n }\n }\n const uid = roof.id + '-' + k;\n const solarHeatmap = solarHeatmapRef.current.get(uid);\n if (!solarHeatmap) {\n solarHeatmapRef.current.set(uid, [...seg]);\n } else {\n for (let i = 0; i < solarHeatmap.length; i++) {\n for (let j = 0; j < solarHeatmap[i].length; j++) {\n solarHeatmap[i][j] += seg[i][j];\n }\n }\n }\n }\n }\n }\n }\n const extraT: number[] = Array(n).fill(0);\n const results: RoofSegmentResult[] = [];\n for (let k = 0; k < n; k++) {\n if (totalSolarHeats[k] !== 0) {\n extraT[k] =\n (totalSolarHeats[k] * absorption) / ((roof.volumetricHeatCapacity ?? 0.5) * totalAreas[k] * roof.thickness);\n }\n results.push({\n surfaceTemperature: currentOutsideTemperatureRef.current + extraT[k],\n totalArea: totalAreas[k],\n } as RoofSegmentResult);\n }\n return results;\n };\n\n return <>;\n};\n\nexport default React.memo(ThermalSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n getSunDirection,\n ROOFTOP_SOLAR_PANEL_OFFSET,\n} from './sunTools';\nimport { Euler, Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { ObjectType, SolarStructure, TrackerType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport {\n HALF_PI,\n UNIT_VECTOR_NEG_X,\n UNIT_VECTOR_NEG_Y,\n UNIT_VECTOR_POS_X,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { CuboidModel } from '../models/CuboidModel';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { WallModel } from '../models/WallModel';\nimport { RoofModel, RoofType } from '../models/RoofModel';\nimport { DoorModel, DoorType } from '../models/DoorModel';\nimport { SolarRadiation } from './SolarRadiation';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface StaticSolarRadiationSimulationProps {\n city: string | null;\n}\n\n// note that this cannot be used for anything related to CSP as CPS must move to track or reflect the sun\n// for the same reason, this cannot be used for PV with trackers.\n\nconst StaticSolarRadiationSimulation = ({ city }: StaticSolarRadiationSimulationProps) => {\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const setHeatmap = useDataStore(Selector.setHeatmap);\n const clearHeatmaps = useDataStore(Selector.clearHeatmaps);\n const runSimulation = usePrimitiveStore(Selector.runStaticSimulation);\n const getRoofSegmentVertices = useDataStore(Selector.getRoofSegmentVertices);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const interval = 60 / world.timesPerHour;\n const ray = useMemo(() => new Raycaster(), []);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n\n useEffect(() => {\n if (runSimulation) {\n if (elements && elements.length > 0) {\n clearHeatmaps();\n generateHeatmaps();\n usePrimitiveStore.setState((state) => {\n state.runStaticSimulation = false;\n state.simulationInProgress = false;\n state.showSolarRadiationHeatmap = true;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runSimulation]);\n\n const inShadow = (elementId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== elementId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n // console.log(objectsRef.current)\n }\n };\n\n const generateHeatmaps = () => {\n fetchObjects();\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Foundation:\n const f = e as FoundationModel;\n generateHeatmapForFoundation(f);\n if (f.solarStructure === SolarStructure.UpdraftTower) {\n generateHeatmapForSolarUpdraftTower(f);\n }\n break;\n case ObjectType.Cuboid:\n generateHeatmapForCuboid(e as CuboidModel);\n break;\n case ObjectType.SolarPanel:\n generateHeatmapForSolarPanel(e as SolarPanelModel);\n break;\n case ObjectType.Wall:\n generateHeatmapForWall(e as WallModel);\n break;\n case ObjectType.Door:\n generateHeatmapForDoor(e as DoorModel);\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n switch (roof.roofType) {\n case RoofType.Pyramid:\n generateHeatmapForPyramidRoof(roof);\n break;\n case RoofType.Gable:\n generateHeatmapForGableRoof(roof);\n break;\n case RoofType.Gambrel:\n generateHeatmapForGambrelRoof(roof);\n break;\n case RoofType.Mansard:\n generateHeatmapForMansardRoof(roof);\n break;\n case RoofType.Hip:\n generateHeatmapForHipRoof(roof);\n break;\n }\n break;\n }\n }\n };\n\n const generateHeatmapForCuboid = (cuboid: CuboidModel) => {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = cuboid.lx;\n const ly = cuboid.ly;\n const lz = cuboid.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const ny = Math.max(2, Math.round(ly / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const dz = lz / nz;\n const parent = getParent(cuboid);\n let cx = cuboid.cx;\n let cy = cuboid.cy;\n let cz = cuboid.cz;\n if (parent && parent.type === ObjectType.Cuboid) {\n const worldData = Util.getWorldDataById(cuboid.id);\n cx = worldData.pos.x;\n cy = worldData.pos.y;\n cz = worldData.pos.z;\n }\n const topCellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n const southCellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n const northCellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let westCellOutputTotals = Array(ny)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let eastCellOutputTotals = Array(ny)\n .fill(0)\n .map(() => Array(nz).fill(0));\n\n const normalTop = UNIT_VECTOR_POS_Z;\n const normalSouth = UNIT_VECTOR_NEG_Y.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalNorth = UNIT_VECTOR_POS_Y.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalWest = UNIT_VECTOR_NEG_X.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalEast = UNIT_VECTOR_POS_X.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n\n const vec = new Vector3();\n let count = 0;\n const center2d = new Vector2(cx, cy);\n const v2 = new Vector2();\n const southY = cy - ly / 2;\n const northY = cy + ly / 2;\n const westX = cx - lx / 2;\n const eastX = cx + lx / 2;\n\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n\n // top face\n let indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalTop, peakRadiation);\n let dot = normalTop.dot(sunDirection);\n let uc = cx - lx / 2;\n let vc = cy - ly / 2;\n const topZ = cz + lz / 2;\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < ny; v++) {\n topCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, vc + (v + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, topZ);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n topCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // south face\n uc = cx - lx / 2;\n vc = cz - lz / 2;\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalSouth, peakRadiation);\n dot = normalSouth.dot(sunDirection);\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < nz; v++) {\n southCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, southY);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n southCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // north face\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalNorth, peakRadiation);\n dot = normalNorth.dot(sunDirection);\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < nz; v++) {\n northCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, northY);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (nz - (v + 0.5)) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n northCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // west face\n uc = cy - ly / 2;\n vc = cz - lz / 2;\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalWest, peakRadiation);\n dot = normalWest.dot(sunDirection);\n for (let u = 0; u < ny; u++) {\n for (let v = 0; v < nz; v++) {\n westCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(westX, uc + (u + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n westCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // east face\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normalEast, peakRadiation);\n dot = normalEast.dot(sunDirection);\n for (let u = 0; u < ny; u++) {\n for (let v = 0; v < nz; v++) {\n eastCellOutputTotals[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(eastX, uc + (u + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n eastCellOutputTotals[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n\n westCellOutputTotals = Util.transpose(westCellOutputTotals);\n eastCellOutputTotals = Util.transpose(eastCellOutputTotals);\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(topCellOutputTotals, scaleFactor);\n applyScaleFactor(southCellOutputTotals, scaleFactor);\n applyScaleFactor(northCellOutputTotals, scaleFactor);\n applyScaleFactor(westCellOutputTotals, scaleFactor);\n applyScaleFactor(eastCellOutputTotals, scaleFactor);\n\n // send heat map data to common store for visualization\n setHeatmap(cuboid.id + '-top', topCellOutputTotals);\n setHeatmap(cuboid.id + '-south', southCellOutputTotals);\n setHeatmap(cuboid.id + '-north', northCellOutputTotals);\n setHeatmap(cuboid.id + '-west', westCellOutputTotals);\n setHeatmap(cuboid.id + '-east', eastCellOutputTotals);\n };\n\n const generateHeatmapForFoundation = (foundation: FoundationModel) => {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = foundation.lx;\n const ly = foundation.ly;\n const lz = foundation.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const ny = Math.max(2, Math.round(ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const x0 = foundation.cx - lx / 2;\n const y0 = foundation.cy - ly / 2;\n const center2d = new Vector2(foundation.cx, foundation.cy);\n const v = new Vector3();\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n let count = 0;\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n const v2 = new Vector2();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputTotals[kx][ky] += indirectRadiation;\n if (dot > 0) {\n v2.set(x0 + (kx + 0.5) * dx, y0 + (ky + 0.5) * dy);\n v2.rotateAround(center2d, foundation.rotation[2]);\n v.set(v2.x, v2.y, lz);\n if (!inShadow(foundation.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(foundation.id, cellOutputTotals);\n };\n\n const generateHeatmapForSolarUpdraftTower = (foundation: FoundationModel) => {\n const solarUpdraftTower = foundation.solarUpdraftTower;\n if (!solarUpdraftTower) return;\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const radius = solarUpdraftTower.collectorRadius;\n const max = Math.max(2, Math.round((radius * 2) / cellSize));\n // shift half cell size to the center of each grid cell\n const x0 = foundation.cx - radius + cellSize / 2;\n const y0 = foundation.cy - radius + cellSize / 2;\n const z0 = foundation.lz + solarUpdraftTower.collectorHeight;\n const cellOutputTotals = Array(max)\n .fill(0)\n .map(() => Array(max).fill(0));\n const v = new Vector3(0, 0, z0);\n const rsq = radius * radius;\n let count = 0;\n let dx, dy;\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let kx = 0; kx < max; kx++) {\n v.x = x0 + (kx + 0.5) * cellSize;\n dx = v.x - foundation.cx;\n for (let ky = 0; ky < max; ky++) {\n v.y = y0 + (ky + 0.5) * cellSize;\n dy = v.y - foundation.cy;\n if (dx * dx + dy * dy > rsq) continue;\n cellOutputTotals[kx][ky] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(foundation.id + '-sut', v, sunDirection)) {\n cellOutputTotals[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(foundation.id + '-sut', cellOutputTotals);\n };\n\n const generateHeatmapForSolarPanel = (panel: SolarPanelModel) => {\n if (panel.trackerType !== TrackerType.NO_TRACKER) throw new Error('trackers cannot use static simulation');\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n }\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, getFoundation(panel), panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const normal = new Vector3().fromArray(panel.normal);\n const rot = parent.rotation[2];\n let zRot = rot + panel.relativeAzimuth;\n let angle = panel.tiltAngle;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle and relative azimuth\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const foundation = getFoundation(parent);\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n // TODO: right now we assume a parent rotation is always around the z-axis\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof.\n // so we only need to tilt the normal for a solar panel on a foundation or flat roof\n const normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n normal.applyEuler(normalEuler);\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = panel.lx;\n const ly = panel.ly;\n const nx = Math.max(2, Math.round(panel.lx / cellSize));\n const ny = Math.max(2, Math.round(panel.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n let count = 0;\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputTotals[kx][ky] += indirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(panel.id, cellOutputTotals);\n };\n\n const generateHeatmapForWall = (wall: WallModel) => {\n const foundation = getFoundation(wall);\n if (!foundation) throw new Error('foundation of wall not found');\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = wall.lx; // width\n const lz = Util.getHighestPointOfWall(wall); // height\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, lz / 2), foundation).setZ(\n lz / 2 + foundation.lz,\n );\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const v = new Vector3();\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let count = 0;\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const polygon = Util.getWallVertices(wall, 2);\n const halfDif = (lz - wall.lz) / 2;\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n if (Util.isPointInside(kx2 * dx, kz2 * dz + halfDif, polygon)) {\n cellOutputTotals[kx][kz] += indirectRadiation;\n if (dot > 0) {\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (!inShadow(wall.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(wall.id, cellOutputTotals);\n };\n\n const generateHeatmapForDoor = (door: DoorModel) => {\n const foundation = getFoundation(door);\n if (!foundation) throw new Error('foundation of door not found');\n const parent = getParent(door);\n if (!parent) throw new Error('parent of door not found');\n const wall = parent as WallModel;\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const lx = door.lx * wall.lx; // width\n const lz = door.lz * wall.lz; // height\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absWallPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n const absPos = absWallPos.clone().add(new Vector3(door.cx * wall.lx, 0, door.cz * wall.lz));\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const v = new Vector3();\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n let count = 0;\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n if (door.doorType === DoorType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (SolarRadiation.pointWithinArch(v, lx, lz, door.archHeight, absPos)) {\n cellOutputTotals[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(door.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n cellOutputTotals[kx][kz] += indirectRadiation;\n if (dot > 0) {\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (!inShadow(door.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(door.id, cellOutputTotals);\n };\n\n const generateHeatmapForPyramidRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Pyramid) throw new Error('roof is not pyramid');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n generateHeatmapForFlatRoof(roof, foundation, segments);\n } else {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the plane (must normalize the cross product as it is not normalized!)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n let count = 0;\n const v = new Vector3();\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n }\n };\n\n const generateHeatmapForMansardRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Mansard) throw new Error('roof is not mansard');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n generateHeatmapForFlatRoof(roof, foundation, segments);\n } else {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n if (index === segments.length - 1) {\n // top surface\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const h0 = s[0].z;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n const v0 = new Vector3(\n minX + cellSize / 2,\n minY + cellSize / 2,\n foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n let count = 0;\n const v = new Vector3(0, 0, v0.z);\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.y = v0.y + q * dy;\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n } else {\n // side surfaces\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n let count = 0;\n const v = new Vector3();\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n }\n }\n };\n\n const generateHeatmapForGambrelRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Gambrel) throw new Error('roof is not gambrel');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n generateHeatmapForFlatRoof(roof, foundation, segments);\n } else {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n let count = 0;\n const v = new Vector3();\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n }\n };\n\n const generateHeatmapForHipRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Hip) throw new Error('roof is not hip');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n generateHeatmapForFlatRoof(roof, foundation, segments);\n } else {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n // (must normalize the cross product of two normalized vectors as it is not automatically normalized)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n let count = 0;\n const v = new Vector3();\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n if (index % 2 === 0) {\n // even number (0, 2) are quads, odd number (1, 3) are triangles\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n } else {\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n }\n };\n\n const generateHeatmapForFlatRoof = (roof: RoofModel, foundation: FoundationModel, segments: Vector3[][]) => {\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const h0 = segments[0][0].z;\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const s of segments) {\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n const cellOutputTotals = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n const v0 = new Vector3(minX + cellSize / 2, minY + cellSize / 2, foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET);\n let count = 0;\n const v = new Vector3(0, 0, v0.z);\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.y = v0.y + q * dy;\n if (!inShadow(roof.id, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(roof.id, cellOutputTotals);\n };\n\n // gable roofs are treated as a special case\n const generateHeatmapForGableRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Gable) throw new Error('roof is not gable');\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n const cellOutputTotals = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n let count = 0;\n const v = new Vector3();\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < world.timesPerHour; j++) {\n const currentTime = new Date(year, month, date, i, j * interval);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n count++;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputTotals[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputTotals[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n const daylight = (count * interval) / 60;\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * world.timesPerHour) : 0;\n applyScaleFactor(cellOutputTotals, scaleFactor);\n // send heat map data to common store for visualization\n setHeatmap(uuid, cellOutputTotals);\n }\n };\n\n const applyScaleFactor = (output: number[][], scaleFactor: number) => {\n for (let i = 0; i < output.length; i++) {\n for (let j = 0; j < output[i].length; j++) {\n output[i][j] *= scaleFactor;\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(StaticSolarRadiationSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n computeSunriseAndSunsetInMinutes,\n getSunDirection,\n ROOFTOP_SOLAR_PANEL_OFFSET,\n} from './sunTools';\nimport { Euler, Intersection, Object3D, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { ObjectType, SolarStructure, TrackerType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport {\n HALF_PI,\n UNIT_VECTOR_NEG_X,\n UNIT_VECTOR_NEG_Y,\n UNIT_VECTOR_POS_X,\n UNIT_VECTOR_POS_Y,\n UNIT_VECTOR_POS_Z,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { CuboidModel } from '../models/CuboidModel';\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\nimport { HeliostatModel } from '../models/HeliostatModel';\nimport { WallModel } from '../models/WallModel';\nimport { RoofModel, RoofType } from '../models/RoofModel';\nimport { DoorModel, DoorType } from '../models/DoorModel';\nimport { SolarRadiation } from './SolarRadiation';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface DynamicSolarRadiationSimulationProps {\n city: string | null;\n}\n\nconst DynamicSolarRadiationSimulation = ({ city }: DynamicSolarRadiationSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const setHeatmap = useDataStore(Selector.setHeatmap);\n const clearHeatmaps = useDataStore(Selector.clearHeatmaps);\n const runSimulation = usePrimitiveStore(Selector.runDynamicSimulation);\n const pauseSimulation = usePrimitiveStore(Selector.pauseSimulation);\n const solarRadiationHeatmapReflectionOnly = useStore(Selector.viewState.solarRadiationHeatmapReflectionOnly);\n const getRoofSegmentVertices = useDataStore(Selector.getRoofSegmentVertices);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const interval = 60 / world.timesPerHour;\n const ray = useMemo(() => new Raycaster(), []);\n const cellSize = world.solarRadiationHeatmapGridCellSize ?? 0.5;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const cellOutputsMapRef = useRef>(new Map());\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n useEffect(() => {\n if (runSimulation) {\n init();\n requestRef.current = requestAnimationFrame(simulate);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n setPrimitiveStore('simulationInProgress', false);\n }\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runSimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseSimulation;\n if (pauseSimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulate();\n }\n }, [pauseSimulation]);\n\n // getting ready for the simulation\n const init = () => {\n setPrimitiveStore('simulationInProgress', true);\n // beginning from sunrise\n now.setHours(Math.floor(sunMinutes.sunrise / 60), sunMinutes.sunrise % 60);\n originalDateRef.current = new Date(world.date);\n simulationCompletedRef.current = false;\n fetchObjects();\n // clear the buffer arrays if any\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Wall:\n case ObjectType.Door:\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicTrough:\n case ObjectType.ParabolicDish:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat:\n cellOutputsMapRef.current.delete(e.id);\n break;\n case ObjectType.Cuboid:\n cellOutputsMapRef.current.delete(e.id + '-top');\n cellOutputsMapRef.current.delete(e.id + '-north');\n cellOutputsMapRef.current.delete(e.id + '-south');\n cellOutputsMapRef.current.delete(e.id + '-west');\n cellOutputsMapRef.current.delete(e.id + '-east');\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n const segments = getRoofSegmentVertices(roof.id);\n if (segments) {\n const n = segments.length;\n for (let i = 0; i < n; i++) {\n cellOutputsMapRef.current.delete(roof.id + '-' + i);\n }\n }\n cellOutputsMapRef.current.delete(roof.id); // in case it is a flat roof\n break;\n case ObjectType.Foundation:\n cellOutputsMapRef.current.delete(e.id);\n cellOutputsMapRef.current.delete(e.id + '-sut');\n break;\n }\n }\n };\n\n const updateHeatmaps = () => {\n clearHeatmaps();\n const daylight = sunMinutes.daylight() / 60;\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divide by times per hour as the radiation is added up that many times)\n const scaleFactor =\n daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * world.timesPerHour) : 0;\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Foundation:\n case ObjectType.Wall:\n case ObjectType.Door:\n case ObjectType.SolarPanel:\n case ObjectType.ParabolicTrough:\n case ObjectType.ParabolicDish:\n case ObjectType.FresnelReflector:\n case ObjectType.Heliostat:\n const data = cellOutputsMapRef.current.get(e.id);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heat map data to common store for visualization\n setHeatmap(\n e.id,\n data.map((a) => [...a]),\n );\n }\n break;\n case ObjectType.Cuboid:\n setCuboidHeatmap(e.id, 'top', scaleFactor);\n setCuboidHeatmap(e.id, 'south', scaleFactor);\n setCuboidHeatmap(e.id, 'north', scaleFactor);\n setCuboidHeatmap(e.id, 'west', scaleFactor);\n setCuboidHeatmap(e.id, 'east', scaleFactor);\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n const segments = getRoofSegmentVertices(roof.id);\n if (segments && segments.length > 0) {\n if (\n roof.roofType === RoofType.Pyramid ||\n roof.roofType === RoofType.Mansard ||\n roof.roofType === RoofType.Gambrel ||\n roof.roofType === RoofType.Hip\n ) {\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n const data = cellOutputsMapRef.current.get(roof.id);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heatmap data to common store for visualization\n setHeatmap(\n roof.id,\n data.map((a) => [...a]),\n );\n }\n break;\n }\n }\n for (let i = 0; i < segments.length; i++) {\n const uuid = roof.id + '-' + i;\n const data = cellOutputsMapRef.current.get(uuid);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heat map data to common store for visualization\n setHeatmap(\n uuid,\n data.map((a) => [...a]),\n );\n }\n }\n }\n break;\n }\n if (e.type === ObjectType.Foundation) {\n const foundation = e as FoundationModel;\n if (foundation.solarStructure === SolarStructure.UpdraftTower && foundation.solarUpdraftTower) {\n const uuid = e.id + '-sut';\n const data = cellOutputsMapRef.current.get(uuid);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heat map data to common store for visualization\n setHeatmap(\n uuid,\n data.map((a) => [...a]),\n );\n }\n }\n }\n }\n };\n\n const setCuboidHeatmap = (id: string, side: string, scaleFactor: number) => {\n const data = cellOutputsMapRef.current.get(id + '-' + side);\n if (data) {\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n data[i][j] *= scaleFactor;\n }\n }\n // send a copy of the heat map data to common store for visualization\n if (side === 'east' || side === 'west') {\n setHeatmap(id + '-' + side, Util.transpose(Util.clone2DArray(data)));\n } else {\n setHeatmap(id + '-' + side, Util.clone2DArray(data));\n }\n }\n };\n\n const simulate = () => {\n if (runSimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n usePrimitiveStore.setState((state) => {\n state.runDynamicSimulation = false;\n });\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n updateHeatmaps();\n // the following must be set with a different store callback so that the useEffect hook of app.ts\n // is not triggered to cancel the solar radiation heat map\n setPrimitiveStore('simulationInProgress', false);\n setPrimitiveStore('showSolarRadiationHeatmap', true);\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + interval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n if (solarRadiationHeatmapReflectionOnly) {\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.FresnelReflector:\n calculateFresnelReflector(e as FresnelReflectorModel);\n break;\n case ObjectType.Heliostat:\n calculateHeliostat(e as HeliostatModel);\n break;\n }\n }\n } else {\n for (const e of elements) {\n switch (e.type) {\n case ObjectType.Foundation:\n const foundation = e as FoundationModel;\n calculateFoundation(foundation);\n if (foundation.solarStructure === SolarStructure.UpdraftTower) {\n calculateSolarUpdraftTower(foundation);\n }\n break;\n case ObjectType.Cuboid:\n calculateCuboid(e as CuboidModel);\n break;\n case ObjectType.SolarPanel:\n calculateSolarPanel(e as SolarPanelModel);\n break;\n case ObjectType.ParabolicTrough:\n calculateParabolicTrough(e as ParabolicTroughModel);\n break;\n case ObjectType.ParabolicDish:\n calculateParabolicDish(e as ParabolicDishModel);\n break;\n case ObjectType.FresnelReflector:\n calculateFresnelReflector(e as FresnelReflectorModel);\n break;\n case ObjectType.Heliostat:\n calculateHeliostat(e as HeliostatModel);\n break;\n case ObjectType.Wall:\n calculateWall(e as WallModel);\n break;\n case ObjectType.Door:\n calculateDoor(e as DoorModel);\n break;\n case ObjectType.Roof:\n const roof = e as RoofModel;\n switch (roof.roofType) {\n case RoofType.Pyramid:\n calculatePyramidRoof(roof);\n break;\n case RoofType.Gable:\n calculateGableRoof(roof);\n break;\n case RoofType.Gambrel:\n calculateGambrelRoof(roof);\n break;\n case RoofType.Mansard:\n calculateMansardRoof(roof);\n break;\n case RoofType.Hip:\n calculateHipRoof(roof);\n break;\n }\n break;\n }\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulate);\n }\n };\n\n const inShadow = (elementId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== elementId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const calculateCuboid = (cuboid: CuboidModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const dayOfYear = Util.dayOfYear(now);\n const lx = cuboid.lx;\n const ly = cuboid.ly;\n const lz = cuboid.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const ny = Math.max(2, Math.round(ly / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const dz = lz / nz;\n\n // initialize the arrays\n let cellOutputsTop = cellOutputsMapRef.current.get(cuboid.id + '-top');\n if (!cellOutputsTop || cellOutputsTop.length !== nx || cellOutputsTop[0].length !== ny) {\n cellOutputsTop = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-top', cellOutputsTop);\n }\n let cellOutputsSouth = cellOutputsMapRef.current.get(cuboid.id + '-south');\n if (!cellOutputsSouth || cellOutputsSouth.length !== nx || cellOutputsSouth[0].length !== nz) {\n cellOutputsSouth = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-south', cellOutputsSouth);\n }\n let cellOutputsNorth = cellOutputsMapRef.current.get(cuboid.id + '-north');\n if (!cellOutputsNorth || cellOutputsNorth.length !== nx || cellOutputsNorth[0].length !== nz) {\n cellOutputsNorth = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-north', cellOutputsNorth);\n }\n let cellOutputsWest = cellOutputsMapRef.current.get(cuboid.id + '-west');\n if (!cellOutputsWest || cellOutputsWest.length !== ny || cellOutputsWest[0].length !== nz) {\n cellOutputsWest = Array(ny)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-west', cellOutputsWest);\n }\n let cellOutputsEast = cellOutputsMapRef.current.get(cuboid.id + '-east');\n if (!cellOutputsEast || cellOutputsEast.length !== ny || cellOutputsEast[0].length !== nz) {\n cellOutputsEast = Array(ny)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(cuboid.id + '-east', cellOutputsEast);\n }\n\n const normalTop = UNIT_VECTOR_POS_Z;\n const normalSouth = UNIT_VECTOR_NEG_Y.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalNorth = UNIT_VECTOR_POS_Y.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalWest = UNIT_VECTOR_NEG_X.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n const normalEast = UNIT_VECTOR_POS_X.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, cuboid.rotation[2]);\n\n const parent = getParent(cuboid);\n let cx = cuboid.cx;\n let cy = cuboid.cy;\n let cz = cuboid.cz;\n if (parent && parent.type === ObjectType.Cuboid) {\n const worldData = Util.getWorldDataById(cuboid.id);\n cx = worldData.pos.x;\n cy = worldData.pos.y;\n cz = worldData.pos.z;\n }\n const vec = new Vector3();\n const center2d = new Vector2(cx, cy);\n const v2 = new Vector2();\n const southY = cy - ly / 2;\n const northY = cy + ly / 2;\n const westX = cx - lx / 2;\n const eastX = cx + lx / 2;\n\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n\n // top face\n let indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normalTop,\n peakRadiation,\n );\n let dot = normalTop.dot(sunDirection);\n let uc = cx - lx / 2;\n let vc = cy - ly / 2;\n const topZ = cz + lz / 2;\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < ny; v++) {\n cellOutputsTop[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, vc + (v + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, topZ);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsTop[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // south face\n uc = cx - lx / 2;\n vc = cz - lz / 2;\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normalSouth, peakRadiation);\n dot = normalSouth.dot(sunDirection);\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < nz; v++) {\n cellOutputsSouth[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, southY);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsSouth[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // north face\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normalNorth, peakRadiation);\n dot = normalNorth.dot(sunDirection);\n for (let u = 0; u < nx; u++) {\n for (let v = 0; v < nz; v++) {\n cellOutputsNorth[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(uc + (u + 0.5) * dx, northY);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (nz - (v + 0.5)) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsNorth[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // west face\n uc = cy - ly / 2;\n vc = cz - lz / 2;\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normalWest, peakRadiation);\n dot = normalWest.dot(sunDirection);\n for (let u = 0; u < ny; u++) {\n for (let v = 0; v < nz; v++) {\n cellOutputsWest[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(westX, uc + (u + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsWest[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n\n // east face\n indirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normalEast, peakRadiation);\n dot = normalEast.dot(sunDirection);\n for (let u = 0; u < ny; u++) {\n for (let v = 0; v < nz; v++) {\n cellOutputsEast[u][v] += indirectRadiation;\n if (dot > 0) {\n v2.set(eastX, uc + (u + 0.5) * dy);\n v2.rotateAround(center2d, cuboid.rotation[2]);\n vec.set(v2.x, v2.y, vc + (v + 0.5) * dz);\n if (!inShadow(cuboid.id, vec, sunDirection)) {\n // direct radiation\n cellOutputsEast[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n const calculateFoundation = (foundation: FoundationModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const dayOfYear = Util.dayOfYear(now);\n const lx = foundation.lx;\n const ly = foundation.ly;\n const lz = foundation.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const ny = Math.max(2, Math.round(ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const x0 = foundation.cx - lx / 2;\n const y0 = foundation.cy - ly / 2;\n const center2d = new Vector2(foundation.cx, foundation.cy);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(foundation.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(foundation.id, cellOutputs);\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n const v2 = new Vector2();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] += indirectRadiation;\n if (dot > 0) {\n v2.set(x0 + (kx + 0.5) * dx, y0 + (ky + 0.5) * dy);\n v2.rotateAround(center2d, foundation.rotation[2]);\n v.set(v2.x, v2.y, lz);\n if (!inShadow(foundation.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n const calculateWall = (wall: WallModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(wall);\n if (!foundation) throw new Error('foundation of wall not found');\n const dayOfYear = Util.dayOfYear(now);\n const lx = wall.lx;\n const lz = Util.getHighestPointOfWall(wall); // height\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n lz / 2 + foundation.lz,\n );\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(wall.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== nz) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(wall.id, cellOutputs);\n }\n const polygon = Util.getWallVertices(wall, 1);\n const halfDif = (lz - wall.lz) / 2;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n if (Util.isPointInside(kx2 * dx, kz2 * dz + halfDif, polygon)) {\n cellOutputs[kx][kz] += indirectRadiation;\n if (dot > 0) {\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (!inShadow(wall.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateDoor = (door: DoorModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(door);\n if (!foundation) throw new Error('foundation of door not found');\n const parent = getParent(door);\n if (!parent) throw new Error('parent of door not found');\n const dayOfYear = Util.dayOfYear(now);\n const wall = parent as WallModel;\n const lx = door.lx * wall.lx;\n const lz = door.lz * wall.lz;\n const nx = Math.max(2, Math.round(lx / cellSize));\n const nz = Math.max(2, Math.round(lz / cellSize));\n const dx = lx / nx;\n const dz = lz / nz;\n const absAngle = foundation.rotation[2] + wall.relativeAngle;\n const absWallPos = Util.wallAbsolutePosition(new Vector3(wall.cx, wall.cy, wall.cz), foundation).setZ(\n wall.lz / 2 + foundation.lz,\n );\n const absPos = absWallPos.clone().add(new Vector3(door.cx * wall.lx, 0, door.cz * wall.lz));\n const normal = new Vector3(Math.cos(absAngle - HALF_PI), Math.sin(absAngle - HALF_PI), 0);\n const dxcos = dx * Math.cos(absAngle);\n const dxsin = dx * Math.sin(absAngle);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(door.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== nz) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(nz).fill(0));\n cellOutputsMapRef.current.set(door.id, cellOutputs);\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n if (door.doorType === DoorType.Arched) {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (SolarRadiation.pointWithinArch(v, lx, lz, door.archHeight, absPos)) {\n cellOutputs[kx][kz] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(door.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let kz = 0; kz < nz; kz++) {\n cellOutputs[kx][kz] += indirectRadiation;\n if (dot > 0) {\n const kx2 = kx - nx / 2 + 0.5;\n const kz2 = kz - nz / 2 + 0.5;\n v.set(absPos.x + kx2 * dxcos, absPos.y + kx2 * dxsin, absPos.z + kz2 * dz);\n if (!inShadow(door.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][kz] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateFlatRoof = (\n sunDirection: Vector3,\n roof: RoofModel,\n foundation: FoundationModel,\n segments: Vector3[][],\n ) => {\n const h0 = segments[0][0].z;\n const dayOfYear = Util.dayOfYear(now);\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const s of segments) {\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y; // don't use else if!!!\n }\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n let cellOutputs = cellOutputsMapRef.current.get(roof.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(roof.id, cellOutputs);\n }\n const v0 = new Vector3(minX + cellSize / 2, minY + cellSize / 2, foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET);\n const v = new Vector3(0, 0, v0.z);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.y = v0.y + q * dy;\n if (!inShadow(roof.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n const calculatePyramidRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Pyramid) throw new Error('roof is not pyramid');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n // send heat map data to common store for visualization\n if (flat) {\n calculateFlatRoof(sunDirection, roof, foundation, segments);\n } else {\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the plane (must normalize the cross product as it is not normalized!)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n };\n\n const calculateMansardRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Mansard) throw new Error('roof is not mansard');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n // send heat map data to common store for visualization\n if (flat) {\n calculateFlatRoof(sunDirection, roof, foundation, segments);\n } else {\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n if (index === segments.length - 1) {\n // top surface\n // obtain the bounding rectangle\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const v of s) {\n const v2 = v.clone().applyEuler(euler);\n if (v2.x > maxX) maxX = v2.x;\n if (v2.x < minX) minX = v2.x;\n if (v2.y > maxY) maxY = v2.y;\n if (v2.y < minY) minY = v2.y;\n }\n minX += foundation.cx;\n minY += foundation.cy;\n maxX += foundation.cx;\n maxY += foundation.cy;\n const h0 = s[0].z;\n const nx = Math.max(2, Math.round((maxX - minX) / cellSize));\n const ny = Math.max(2, Math.round((maxY - minY) / cellSize));\n const dx = (maxX - minX) / nx;\n const dy = (maxY - minY) / ny;\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n const v0 = new Vector3(\n minX + cellSize / 2,\n minY + cellSize / 2,\n foundation.lz + h0 + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n const v = new Vector3(0, 0, v0.z);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = UNIT_VECTOR_POS_Z.dot(sunDirection);\n for (let p = 0; p < nx; p++) {\n v.x = v0.x + p * dx;\n for (let q = 0; q < ny; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.y = v0.y + q * dy;\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n } else {\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n }\n };\n\n const calculateGambrelRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Gambrel) throw new Error('roof is not gambrel');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n // send heat map data to common store for visualization\n if (flat) {\n calculateFlatRoof(sunDirection, roof, foundation, segments);\n } else {\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n };\n\n const calculateHipRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Hip) throw new Error('roof is not hip');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n // check if the roof is flat or not\n let flat = true;\n const h0 = segments[0][0].z;\n for (const s of segments) {\n for (const v of s) {\n if (Math.abs(v.z - h0) > 0.01) {\n flat = false;\n break;\n }\n }\n }\n if (flat) {\n calculateFlatRoof(sunDirection, roof, foundation, segments);\n } else {\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n for (const [index, s] of segments.entries()) {\n // even number (0, 2) are quads, odd number (1, 3) are triangles\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n // in case we need it: the position of the top point relative to the first edge point is\n // (m * v20.dot(v10.normalize())) / length10;\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n // (must normalize the cross product of two normalized vectors as it is not automatically normalized)\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half-length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half-length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n const v = new Vector3();\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n };\n\n // gable roofs are treated as a special case\n const calculateGableRoof = (roof: RoofModel) => {\n if (roof.roofType !== RoofType.Gable) throw new Error('roof is not gable');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const foundation = getFoundation(roof);\n if (!foundation) throw new Error('foundation of wall not found');\n const segments = getRoofSegmentVertices(roof.id);\n if (!segments || segments.length === 0) return;\n const dayOfYear = Util.dayOfYear(now);\n const euler = new Euler(0, 0, foundation.rotation[2], 'ZYX');\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n // send heat map data to common store for visualization\n for (const [index, s] of segments.entries()) {\n const uuid = roof.id + '-' + index;\n const s0 = s[0].clone().applyEuler(euler);\n const s1 = s[1].clone().applyEuler(euler);\n const s2 = s[2].clone().applyEuler(euler);\n const v10 = new Vector3().subVectors(s1, s0);\n const v20 = new Vector3().subVectors(s2, s0);\n const v21 = new Vector3().subVectors(s2, s1);\n const length10 = v10.length();\n // find the distance from top to the edge: https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n const distance = new Vector3().crossVectors(v20, v21).length() / length10;\n const m = Math.max(2, Math.round(length10 / cellSize));\n const n = Math.max(2, Math.round(distance / cellSize));\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== m || cellOutputs[0].length !== n) {\n cellOutputs = Array(m)\n .fill(0)\n .map(() => Array(n).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n v10.normalize();\n v20.normalize();\n v21.normalize();\n // find the normal vector of the quad\n const normal = new Vector3().crossVectors(v20, v21).normalize();\n // find the incremental vector going along the bottom edge (half of length)\n const dm = v10.multiplyScalar((0.5 * length10) / m);\n // find the incremental vector going from bottom to top (half of length)\n const dn = new Vector3()\n .crossVectors(normal, v10)\n .normalize()\n .multiplyScalar((0.5 * distance) / n);\n // find the starting point of the grid (shift half of length in both directions)\n const v0 = new Vector3(\n foundation.cx + s0.x,\n foundation.cy + s0.y,\n foundation.lz + s0.z + ROOFTOP_SOLAR_PANEL_OFFSET,\n );\n v0.add(dm).add(dn);\n // double half-length to full-length for the increment vectors in both directions\n dm.multiplyScalar(2);\n dn.multiplyScalar(2);\n const v = new Vector3();\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n for (let p = 0; p < m; p++) {\n const dmp = dm.clone().multiplyScalar(p);\n for (let q = 0; q < n; q++) {\n cellOutputs[p][q] += indirectRadiation;\n if (dot > 0) {\n v.copy(v0).add(dmp).add(dn.clone().multiplyScalar(q));\n if (!inShadow(uuid, v, sunDirection)) {\n // direct radiation\n cellOutputs[p][q] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateSolarPanel = (panel: SolarPanelModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n }\n const dayOfYear = Util.dayOfYear(now);\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, getFoundation(panel), panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const rot = parent.rotation[2];\n let zRot = rot + panel.relativeAzimuth;\n let angle = panel.tiltAngle;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const foundation = getFoundation(parent);\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n const normal = new Vector3().fromArray(panel.normal);\n const lx = panel.lx;\n const ly = panel.ly;\n const nx = Math.max(2, Math.round(panel.lx / cellSize));\n const ny = Math.max(2, Math.round(panel.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(panel.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(panel.id, cellOutputs);\n }\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof.\n // so we only need to tilt the normal for a solar panel on a foundation or flat roof\n let normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n if (panel.trackerType !== TrackerType.NO_TRACKER) {\n // dynamic angles\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n switch (panel.trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const qRotAADAT = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n normalEuler = new Euler().setFromQuaternion(qRotAADAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n const qRotHSAT = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x, 0, rotatedSunDirection.z).normalize(),\n );\n normalEuler = new Euler().setFromQuaternion(qRotHSAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n if (Math.abs(panel.tiltAngle) > 0.001) {\n const v2 = new Vector3(rotatedSunDirection.x, -rotatedSunDirection.y, 0).normalize();\n const az = Math.acos(UNIT_VECTOR_POS_Y.dot(v2)) * Math.sign(v2.x);\n normalEuler = new Euler(panel.tiltAngle, 0, az + rot, 'ZYX');\n }\n break;\n case TrackerType.TILTED_SINGLE_AXIS_TRACKER:\n // TODO\n break;\n }\n }\n normal.applyEuler(normalEuler);\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] += indirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n const calculateParabolicTrough = (trough: ParabolicTroughModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const parent = getParent(trough);\n if (!parent) throw new Error('parent of parabolic trough does not exist');\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(trough.cx, trough.cy, trough.cz, parent);\n const normal = new Vector3().fromArray(trough.normal);\n const originalNormal = normal.clone();\n const lx = trough.lx;\n const ly = trough.ly;\n const depth = (lx * lx) / (4 * trough.latusRectum); // the distance from the bottom to the aperture plane\n const actualPoleHeight = trough.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(trough.lx / cellSize));\n const ny = Math.max(2, Math.round(trough.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = parent.lz + actualPoleHeight + trough.lz + depth;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(trough.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(trough.id, cellOutputs);\n }\n const rot = parent.rotation[2];\n const zRot = rot + trough.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const cosRot = zRotZero ? 1 : Math.cos(zRot);\n const sinRot = zRotZero ? 0 : Math.sin(zRot);\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n const qRot = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x * cosRot, rotatedSunDirection.x * sinRot, rotatedSunDirection.z).normalize(),\n );\n const normalEuler = new Euler().setFromQuaternion(qRot);\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let tmpX = 0;\n let disX = 0;\n let areaRatio = 1;\n const lr2 = 4 / (trough.latusRectum * trough.latusRectum);\n // we have to calculate the irradiance on the parabolic surface, not the aperture surface.\n // the irradiance on the former is less than that on the latter because of the area difference.\n // the relationship between a unit area on the parabolic surface and that on the aperture surface\n // is S = A * sqrt(1 + 4 * x^2 / p^2), where p is the latus rectum, x is the distance from the center\n // of the parabola, and A is the unit area on the aperture area. Note that this modification only\n // applies to direct radiation. Indirect radiation can come from any direction.\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n disX = tmpX - center.x;\n areaRatio = 1 / Math.sqrt(1 + disX * disX * lr2);\n for (let kv = 0; kv < ny; kv++) {\n cellOutputs[ku][kv] += indirectRadiation;\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n // TODO: this implementation differs from that for Fresnel reflectors\n // so we must rotate here. this can be avoided.\n if (!zRotZero) v2d.rotateAround(center2d, zRot);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(trough.id, v, sunDirection)) {\n cellOutputs[ku][kv] += dot * peakRadiation * areaRatio;\n }\n }\n }\n }\n };\n\n const calculateParabolicDish = (dish: ParabolicDishModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const parent = getParent(dish);\n if (!parent) throw new Error('parent of parabolic dish does not exist');\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(dish.cx, dish.cy, dish.cz, parent);\n const normal = new Vector3().fromArray(dish.normal);\n const originalNormal = normal.clone();\n const lx = dish.lx;\n const ly = dish.ly;\n const depth = (lx * lx) / (4 * dish.latusRectum); // the distance from the bottom to the aperture circle\n const actualPoleHeight = dish.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(dish.lx / cellSize));\n const ny = Math.max(2, Math.round(dish.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = parent.lz + actualPoleHeight + dish.lz + depth;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(dish.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(dish.id, cellOutputs);\n }\n const rot = parent.rotation[2];\n const zRot = rot + dish.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n const qRot = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n const normalEuler = new Euler().setFromQuaternion(qRot);\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let tmpX = 0;\n let tmpY = 0;\n let disX = 0;\n let disY = 0;\n let areaRatio = 1;\n const lr2 = 4 / (dish.latusRectum * dish.latusRectum);\n // we have to calculate the irradiance on the parabolic surface, not the aperture surface.\n // the irradiance on the former is less than that on the latter because of the area difference.\n // the relationship between a unit area on the parabolic surface and that on the aperture surface\n // is S = A * sqrt(1 + 4 * (x^2 + y^2) / p^2), where p is the latus rectum, x is the x distance\n // from the center of the paraboloid, y is the y distance from the center of the paraboloid,\n // and A is the unit area on the aperture area. Note that this modification only\n // applies to direct radiation. Indirect radiation can come from any direction.\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n disX = tmpX - center.x;\n if (Math.abs(disX) > lx / 2) continue;\n for (let kv = 0; kv < ny; kv++) {\n tmpY = y0 + kv * dy;\n disY = tmpY - center.y;\n if (Math.abs(disY) > ly / 2) continue;\n cellOutputs[ku][kv] += indirectRadiation;\n if (dot > 0) {\n v2d.set(tmpX, tmpY);\n if (!zRotZero) v2d.rotateAround(center2d, zRot);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(dish.id, v, sunDirection)) {\n areaRatio = 1 / Math.sqrt(1 + (disX * disX + disY * disY) * lr2);\n cellOutputs[ku][kv] += dot * peakRadiation * areaRatio;\n }\n }\n }\n }\n };\n\n const calculateFresnelReflector = (reflector: FresnelReflectorModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(reflector);\n if (!parent) throw new Error('parent of Fresnel reflector does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const foundation = parent as FoundationModel;\n const absorberPipe = foundation.solarAbsorberPipe;\n if (!absorberPipe) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(reflector.cx, reflector.cy, reflector.cz, parent);\n const normal = new Vector3().fromArray(reflector.normal);\n const originalNormal = normal.clone();\n const lx = reflector.lx;\n const ly = reflector.ly;\n const actualPoleHeight = reflector.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(reflector.lx / cellSize));\n const ny = Math.max(2, Math.round(reflector.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = foundation.lz + actualPoleHeight + reflector.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(reflector.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(reflector.id, cellOutputs);\n }\n const rot = parent.rotation[2];\n const zRot = rot + reflector.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const cosRot = zRotZero ? 1 : Math.cos(zRot);\n const sinRot = zRotZero ? 0 : Math.sin(zRot);\n // convert the receiver's coordinates into those relative to the center of this reflector\n const receiverCenter =\n foundation.solarStructure === SolarStructure.FocusPipe\n ? new Vector3(\n (foundation.cx - center.x) * cosRot,\n (foundation.cy - center.y) * sinRot,\n foundation.cz - center.z + foundation.lz / 2 + (absorberPipe.absorberHeight ?? 10),\n )\n : undefined;\n // the rotation axis is in the north-south direction, so the relative azimuth is zero, which maps to (0, 1, 0)\n const rotationAxis = new Vector3(sinRot, cosRot, 0);\n const shiftedReceiverCenter = new Vector3();\n let normalEuler;\n let reflectorToReceiver;\n if (receiverCenter) {\n // the reflector moves only when there is a receiver\n shiftedReceiverCenter.set(receiverCenter.x, receiverCenter.y, receiverCenter.z);\n // how much the reflected light should shift in the direction of the receiver pipe?\n const shift =\n (-receiverCenter.z * (sunDirection.y * rotationAxis.y + sunDirection.x * rotationAxis.x)) / sunDirection.z;\n shiftedReceiverCenter.x += shift * rotationAxis.x;\n shiftedReceiverCenter.y -= shift * rotationAxis.y;\n reflectorToReceiver = shiftedReceiverCenter.clone().normalize();\n let normalVector = reflectorToReceiver.add(sunDirection).normalize();\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\n normalVector = new Vector3(-0.001, 0, 1).normalize();\n }\n if (!zRotZero) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -zRot);\n }\n normalEuler = new Euler(0, Math.atan2(normalVector.x, normalVector.z), zRot, 'ZXY');\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n } else {\n reflectorToReceiver = new Vector3(0, 0, 1);\n normalEuler = new Euler();\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let tmpX = 0;\n if (solarRadiationHeatmapReflectionOnly) {\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(reflector.id, v, sunDirection) && !inShadow(reflector.id, v, reflectorToReceiver)) {\n cellOutputs[ku][kv] += dot * peakRadiation;\n }\n }\n }\n }\n } else {\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n cellOutputs[ku][kv] += indirectRadiation;\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(reflector.id, v, sunDirection)) {\n cellOutputs[ku][kv] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateHeliostat = (heliostat: HeliostatModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(heliostat);\n if (!parent) throw new Error('parent of Fresnel reflector does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const foundation = parent as FoundationModel;\n const powerTower = foundation.solarPowerTower;\n if (!powerTower) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(heliostat.cx, heliostat.cy, heliostat.cz, parent);\n const normal = new Vector3().fromArray(heliostat.normal);\n const originalNormal = normal.clone();\n const lx = heliostat.lx;\n const ly = heliostat.ly;\n const actualPoleHeight = heliostat.poleHeight + Math.max(lx, ly) / 2;\n const nx = Math.max(2, Math.round(heliostat.lx / cellSize));\n const ny = Math.max(2, Math.round(heliostat.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = foundation.lz + actualPoleHeight + heliostat.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n let cellOutputs = cellOutputsMapRef.current.get(heliostat.id);\n if (!cellOutputs || cellOutputs.length !== nx || cellOutputs[0].length !== ny) {\n cellOutputs = Array(nx)\n .fill(0)\n .map(() => Array(ny).fill(0));\n cellOutputsMapRef.current.set(heliostat.id, cellOutputs);\n }\n const rot = parent.rotation[2];\n // convert the receiver's coordinates into those relative to the center of this reflector\n const receiverCenter =\n foundation.solarStructure === SolarStructure.FocusTower\n ? new Vector3(\n foundation.cx - center.x,\n foundation.cy - center.y,\n foundation.cz - center.z + (powerTower.towerHeight ?? 20),\n )\n : undefined;\n let heliostatToReceiver;\n let normalEuler;\n if (receiverCenter) {\n heliostatToReceiver = receiverCenter.clone().normalize();\n let normalVector = heliostatToReceiver.clone().add(sunDirection).normalize();\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\n normalVector = new Vector3(-0.001, 0, 1).normalize();\n }\n if (rot) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\n }\n // convert the normal vector to euler\n const r = Math.hypot(normalVector.x, normalVector.y);\n normalEuler = new Euler(\n Math.atan2(r, normalVector.z),\n 0,\n Math.atan2(normalVector.y, normalVector.x) + HALF_PI,\n 'ZXY',\n );\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n } else {\n heliostatToReceiver = new Vector3(0, 0, 1);\n normalEuler = new Euler();\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let tmpX = 0;\n if (solarRadiationHeatmapReflectionOnly) {\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(heliostat.id, v, sunDirection) && !inShadow(heliostat.id, v, heliostatToReceiver)) {\n cellOutputs[ku][kv] += dot * peakRadiation;\n }\n }\n }\n }\n } else {\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n cellOutputs[ku][kv] += indirectRadiation;\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(heliostat.id, v, sunDirection)) {\n cellOutputs[ku][kv] += dot * peakRadiation;\n }\n }\n }\n }\n }\n };\n\n const calculateSolarUpdraftTower = (foundation: FoundationModel) => {\n const solarUpdraftTower = foundation.solarUpdraftTower;\n if (!solarUpdraftTower) return;\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const dayOfYear = Util.dayOfYear(now);\n const normal = new Vector3().fromArray(foundation.normal);\n const radius = solarUpdraftTower.collectorRadius;\n const max = Math.max(2, Math.round((radius * 2) / cellSize));\n // shift half cell size to the center of each grid cell\n const x0 = foundation.cx - radius + cellSize / 2;\n const y0 = foundation.cy - radius + cellSize / 2;\n const z0 = foundation.lz + solarUpdraftTower.collectorHeight;\n const uuid = foundation.id + '-sut';\n let cellOutputs = cellOutputsMapRef.current.get(uuid);\n if (!cellOutputs || cellOutputs.length !== max || cellOutputs[0].length !== max) {\n cellOutputs = Array(max)\n .fill(0)\n .map(() => Array(max).fill(0));\n cellOutputsMapRef.current.set(uuid, cellOutputs);\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const vec = new Vector3(0, 0, z0);\n const dot = normal.dot(sunDirection);\n const rsq = radius * radius;\n let dx, dy;\n for (let u = 0; u < max; u++) {\n vec.x = x0 + u * cellSize;\n dx = vec.x - foundation.cx;\n for (let v = 0; v < max; v++) {\n vec.y = y0 + v * cellSize;\n dy = vec.y - foundation.cy;\n if (dx * dx + dy * dy > rsq) continue;\n cellOutputs[u][v] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(uuid, vec, sunDirection)) {\n cellOutputs[u][v] += dot * peakRadiation;\n }\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(DynamicSolarRadiationSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { calculatePeakRadiation, computeSunriseAndSunsetInMinutes, getSunDirection } from './sunTools';\nimport { Euler, Intersection, Object3D, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport { MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { ParabolicTroughModel } from '../models/ParabolicTroughModel';\nimport { SunMinutes } from './SunMinutes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface ParabolicTroughSimulationProps {\n city: string | null;\n}\n\nconst ParabolicTroughSimulation = ({ city }: ParabolicTroughSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const setDailyYield = useDataStore(Selector.setDailyParabolicTroughYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const setYearlyYield = useDataStore(Selector.setYearlyParabolicTroughYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyParabolicTroughIndividualOutputs);\n const yearlyIndividualOutputs = useStore(Selector.yearlyParabolicTroughIndividualOutputs);\n const setParabolicTroughLabels = useDataStore(Selector.setParabolicTroughLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForParabolicTroughs);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForParabolicTroughs);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForParabolicTroughs);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForParabolicTroughs);\n const showDailyParabolicTroughYieldPanel = useStore(Selector.viewState.showDailyParabolicTroughYieldPanel);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.cspTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.cspDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.cspGridCellSize ?? 0.5;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation */\n\n useEffect(() => {\n if (runDailySimulation) {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), minuteInterval / 2 - 30);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyParabolicTroughYieldPanel = true;\n state.selectedFloatingWindow = 'dailyParabolicTroughYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicTroughs = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyParabolicTroughYield();\n state.actionInfo = {\n name: 'Daily Simulation for Parabolic Troughs Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyParabolicTroughYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n calculateYield(e as ParabolicTroughModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const trough = e as ParabolicTroughModel;\n const result = dailyOutputsMapRef.current.get(trough.id);\n if (result) {\n const factor = getElementFactor(trough) * timeFactor;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= factor;\n }\n }\n }\n }\n generateDailyYieldData();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateDailyYieldData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Trough' + index, output);\n labels.push(e.label ?? 'Trough' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Trough' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setParabolicTroughLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation */\n\n useEffect(() => {\n if (runYearlySimulation) {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n calculateYield(e as ParabolicTroughModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyParabolicTroughYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyParabolicTroughYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicTroughs = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyYieldData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyParabolicTroughYield();\n state.actionInfo = {\n name: 'Yearly Simulation for Parabolic Troughs Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyParabolicTroughYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const trough = e as ParabolicTroughModel;\n const result = dailyOutputsMapRef.current.get(trough.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(trough.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(trough);\n }\n }\n }\n }\n if (showDailyParabolicTroughYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyYieldData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Trough' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setParabolicTroughLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions between daily and yearly simulation */\n\n // there is room for performance improvement if we figure out a way to cache a lot of things used below\n const calculateYield = (trough: ParabolicTroughModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(trough);\n if (!parent) throw new Error('parent of parabolic trough does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(trough.cx, trough.cy, trough.cz, parent);\n const normal = new Vector3().fromArray(trough.normal);\n const originalNormal = normal.clone();\n const zRot = parent.rotation[2] + trough.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const lx = trough.lx;\n const ly = trough.ly;\n let nx = Math.max(2, Math.round(trough.lx / cellSize));\n let ny = Math.max(2, Math.round(trough.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const depth = (lx * lx) / (4 * trough.latusRectum); // the distance from the bottom to the aperture plane\n // const focalLength = 0.25*trough.latusRectum; // equal to the distance from the directrix to the horizontal axis\n const actualPoleHeight = trough.poleHeight + lx / 2;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = parent.lz + actualPoleHeight + trough.lz + depth;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const rot = parent.rotation[2];\n const cosRot = zRotZero ? 1 : Math.cos(zRot);\n const sinRot = zRotZero ? 0 : Math.sin(zRot);\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n const qRot = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x * cosRot, rotatedSunDirection.x * sinRot, rotatedSunDirection.z).normalize(),\n );\n const normalEuler = new Euler().setFromQuaternion(qRot);\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let sum = 0;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n if (dot > 0) {\n // simplify the simulation by using the aperture surface instead of the parabolic surface\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n if (!zRotZero) v2d.rotateAround(center2d, zRot);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(trough.id, v, sunDirection)) {\n // direct radiation\n sum += dot * peakRadiation;\n }\n }\n }\n }\n const output = dailyOutputsMapRef.current.get(trough.id);\n if (output) {\n // the output is the average radiation density, hence we have to divide it by nx * ny\n // if the minutes are greater than 30 or 30, it is counted as the output of the next hour\n // to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += sum / (nx * ny);\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (trough: ParabolicTroughModel) => {\n return (\n trough.lx *\n trough.ly *\n trough.opticalEfficiency *\n trough.thermalEfficiency *\n trough.absorptance *\n trough.reflectance *\n (1 - monthlyIrradianceLosses[now.getMonth()])\n );\n };\n\n const inShadow = (troughId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== troughId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicTrough) {\n const yearlyResult = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyResult && yearlyResult.length === daysPerYear) {\n yearlyResult.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(ParabolicTroughSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { calculatePeakRadiation, computeSunriseAndSunsetInMinutes, getSunDirection } from './sunTools';\nimport { Euler, Intersection, Object3D, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport { MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { ParabolicDishModel } from '../models/ParabolicDishModel';\nimport { SunMinutes } from './SunMinutes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface ParabolicDishSimulationProps {\n city: string | null;\n}\n\nconst ParabolicDishSimulation = ({ city }: ParabolicDishSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const setDailyYield = useDataStore(Selector.setDailyParabolicDishYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const setYearlyYield = useDataStore(Selector.setYearlyParabolicDishYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyParabolicDishIndividualOutputs);\n const yearlyIndividualOutputs = useStore(Selector.yearlyParabolicDishIndividualOutputs);\n const setParabolicDishLabels = useDataStore(Selector.setParabolicDishLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForParabolicDishes);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForParabolicDishes);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForParabolicDishes);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForParabolicDishes);\n const showDailyParabolicDishYieldPanel = useStore(Selector.viewState.showDailyParabolicDishYieldPanel);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.cspTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.cspDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.cspGridCellSize ?? 0.5;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation */\n\n useEffect(() => {\n if (runDailySimulation) {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), minuteInterval / 2 - 30);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyParabolicDishYieldPanel = true;\n state.selectedFloatingWindow = 'dailyParabolicDishYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForParabolicDishes = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyParabolicDishYield();\n state.actionInfo = {\n name: 'Daily Simulation for Parabolic Dishes Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyParabolicDishYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n calculateYield(e as ParabolicDishModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const dish = e as ParabolicDishModel;\n const result = dailyOutputsMapRef.current.get(dish.id);\n if (result) {\n const factor = getElementFactor(dish) * timeFactor;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= factor;\n }\n }\n }\n }\n generateDailyYieldData();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateDailyYieldData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Dish' + index, output);\n labels.push(e.label ?? 'Dish' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Dish' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setParabolicDishLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation */\n\n useEffect(() => {\n if (runYearlySimulation) {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n calculateYield(e as ParabolicDishModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyParabolicDishYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyParabolicDishYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForParabolicDishes = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyYieldData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyParabolicDishYield();\n state.actionInfo = {\n name: 'Yearly Simulation for Parabolic Dishes Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyParabolicDishYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const dish = e as ParabolicDishModel;\n const result = dailyOutputsMapRef.current.get(dish.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(dish.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(dish);\n }\n }\n }\n }\n if (showDailyParabolicDishYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyYieldData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Dish' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setParabolicDishLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions */\n\n // there is room for performance improvement if we figure out a way to cache a lot of things used below\n const calculateYield = (dish: ParabolicDishModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(dish);\n if (!parent) throw new Error('parent of parabolic dish does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(dish.cx, dish.cy, dish.cz, parent);\n const normal = new Vector3().fromArray(dish.normal);\n const originalNormal = normal.clone();\n const lx = dish.lx;\n const ly = dish.ly;\n let nx = Math.max(2, Math.round(dish.lx / cellSize));\n let ny = Math.max(2, Math.round(dish.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const depth = (lx * lx) / (4 * dish.latusRectum); // the distance from the bottom to the aperture plane\n // const focalLength = 0.25*dish.latusRectum; // equal to the distance from the directrix to the horizontal axis\n const actualPoleHeight = dish.poleHeight + lx / 2;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = parent.lz + actualPoleHeight + dish.lz + depth;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const rot = parent.rotation[2];\n const zRot = rot + dish.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n const qRot = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n const normalEuler = new Euler().setFromQuaternion(qRot);\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let sum = 0;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n if (dot > 0) {\n // simplify the simulation by using the aperture surface instead of the parabolic surface\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n if (!zRotZero) v2d.rotateAround(center2d, zRot);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(dish.id, v, sunDirection)) {\n // direct radiation\n sum += dot * peakRadiation;\n }\n }\n }\n }\n const output = dailyOutputsMapRef.current.get(dish.id);\n if (output) {\n // the output is the average radiation density, hence we have to divide it by nx * ny\n // if the minutes are greater than 30 or 30, it is counted as the output of the next hour\n // to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += sum / (nx * ny);\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (dish: ParabolicDishModel) => {\n return (\n dish.lx *\n dish.ly *\n dish.opticalEfficiency *\n dish.thermalEfficiency *\n dish.absorptance *\n dish.reflectance *\n (1 - monthlyIrradianceLosses[now.getMonth()])\n );\n };\n\n const inShadow = (dishId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== dishId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.ParabolicDish) {\n const yearlyResult = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyResult && yearlyResult.length === daysPerYear) {\n yearlyResult.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(ParabolicDishSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { calculatePeakRadiation, computeSunriseAndSunsetInMinutes, getSunDirection } from './sunTools';\nimport { Euler, Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, ObjectType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport { MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { FresnelReflectorModel } from '../models/FresnelReflectorModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { SunMinutes } from './SunMinutes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface FresnelReflectorSimulationProps {\n city: string | null;\n}\n\nconst FresnelReflectorSimulation = ({ city }: FresnelReflectorSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const setDailyYield = useDataStore(Selector.setDailyFresnelReflectorYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyFresnelReflectorIndividualOutputs);\n const setYearlyYield = useDataStore(Selector.setYearlyFresnelReflectorYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const yearlyIndividualOutputs = useStore(Selector.yearlyFresnelReflectorIndividualOutputs);\n const setFresnelReflectorLabels = useDataStore(Selector.setFresnelReflectorLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForFresnelReflectors);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForFresnelReflectors);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForFresnelReflectors);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForFresnelReflectors);\n const showDailyFresnelReflectorYieldPanel = useStore(Selector.viewState.showDailyFresnelReflectorYieldPanel);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.cspTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.cspDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.cspGridCellSize ?? 0.5;\n const objectsRef = useRef([]);\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation */\n\n useEffect(() => {\n if (runDailySimulation) {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), minuteInterval / 2 - 30);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyFresnelReflectorYieldPanel = true;\n state.selectedFloatingWindow = 'dailyFresnelReflectorYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForFresnelReflectors = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyFresnelReflectorYield();\n state.actionInfo = {\n name: 'Daily Simulation for Fresnel Reflectors Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyFresnelReflectorYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n calculateYield(e as FresnelReflectorModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const reflector = e as FresnelReflectorModel;\n const result = dailyOutputsMapRef.current.get(reflector.id);\n if (result) {\n const factor = getElementFactor(reflector) * timeFactor;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= factor;\n }\n }\n }\n }\n generateDailyYieldData();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateDailyYieldData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Reflector' + index, output);\n labels.push(e.label ?? 'Reflector' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Reflector' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setFresnelReflectorLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation */\n\n useEffect(() => {\n if (runYearlySimulation) {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n calculateYield(e as FresnelReflectorModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyFresnelReflectorYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyFresnelReflectorYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForFresnelReflectors = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyYieldData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyFresnelReflectorYield();\n state.actionInfo = {\n name: 'Yearly Simulation for Fresnel Reflectors Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyFresnelReflectorYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const reflector = e as FresnelReflectorModel;\n const result = dailyOutputsMapRef.current.get(reflector.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(reflector.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(reflector);\n }\n }\n }\n }\n if (showDailyFresnelReflectorYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyYieldData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Reflector' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setFresnelReflectorLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions */\n\n // there is room for performance improvement if we figure out a way to cache a lot of things used below\n const calculateYield = (reflector: FresnelReflectorModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(reflector);\n if (!parent) throw new Error('parent of Fresnel reflector does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const foundation = parent as FoundationModel;\n const absorberPipe = foundation.solarAbsorberPipe;\n if (!absorberPipe) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(reflector.cx, reflector.cy, reflector.cz, parent);\n const normal = new Vector3().fromArray(reflector.normal);\n const originalNormal = normal.clone();\n const lx = reflector.lx;\n const ly = reflector.ly;\n const actualPoleHeight = reflector.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(reflector.lx / cellSize));\n const ny = Math.max(2, Math.round(reflector.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = foundation.lz + actualPoleHeight + reflector.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const rot = parent.rotation[2];\n // we do not handle relative azimuth yet, so this is just a placeholder\n const zRot = rot + reflector.relativeAzimuth;\n const zRotZero = Util.isZero(zRot);\n const cosRot = zRotZero ? 1 : Math.cos(zRot);\n const sinRot = zRotZero ? 0 : Math.sin(zRot);\n // convert the receiver's coordinates into those relative to the center of this reflector\n const receiverCenter =\n foundation.solarStructure === SolarStructure.FocusPipe\n ? new Vector3(\n (foundation.cx - center.x) * cosRot,\n (foundation.cy - center.y) * sinRot,\n foundation.cz - center.z + foundation.lz / 2 + (absorberPipe.absorberHeight ?? 10),\n )\n : undefined;\n // the rotation axis is in the north-south direction, so the relative azimuth is zero, which maps to (0, 1, 0)\n const rotationAxis = new Vector3(sinRot, cosRot, 0);\n const shiftedReceiverCenter = new Vector3();\n let normalEuler;\n let reflectorToReceiver;\n if (receiverCenter) {\n // the reflector moves only when there is a receiver\n shiftedReceiverCenter.set(receiverCenter.x, receiverCenter.y, receiverCenter.z);\n // how much the reflected light should shift in the direction of the receiver pipe?\n const shift =\n (-receiverCenter.z * (sunDirection.y * rotationAxis.y + sunDirection.x * rotationAxis.x)) / sunDirection.z;\n shiftedReceiverCenter.x += shift * rotationAxis.x;\n shiftedReceiverCenter.y -= shift * rotationAxis.y;\n reflectorToReceiver = shiftedReceiverCenter.clone().normalize();\n let normalVector = reflectorToReceiver.add(sunDirection).normalize();\n // avoid singularity: atan(x, y) = infinity if x = 0\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\n normalVector = new Vector3(-0.001, 0, 1).normalize();\n }\n if (!zRotZero) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -zRot);\n }\n normalEuler = new Euler(0, Math.atan2(normalVector.x, normalVector.z), zRot, 'ZXY');\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n } else {\n reflectorToReceiver = new Vector3(0, 0, 1);\n normalEuler = new Euler();\n }\n // the unit of radiation is kW/m^2\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let sum = 0;\n let tmpX = 0;\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(reflector.id, v, sunDirection) && !inShadow(reflector.id, v, reflectorToReceiver)) {\n sum += dot * peakRadiation;\n }\n }\n }\n }\n const output = dailyOutputsMapRef.current.get(reflector.id);\n if (output) {\n // the output is the average radiation density, hence we have to divide it by nx * ny\n // if the minutes are greater than 30 or 30, it is counted as the output of the next hour\n // to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += sum / (nx * ny);\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (reflector: FresnelReflectorModel) => {\n const parent = getParent(reflector);\n if (!parent) throw new Error('parent of Fresnel reflector does not exist');\n let systemEfficiency = 1;\n if (parent.type === ObjectType.Foundation) {\n const foundation = parent as FoundationModel;\n const absorberPipe = foundation.solarAbsorberPipe;\n systemEfficiency *=\n (absorberPipe?.absorberOpticalEfficiency ?? 0.7) *\n (absorberPipe?.absorberThermalEfficiency ?? 0.3) *\n (absorberPipe?.absorberAbsorptance ?? 0.95);\n }\n return (\n reflector.lx *\n reflector.ly *\n reflector.reflectance *\n systemEfficiency *\n (1 - monthlyIrradianceLosses[now.getMonth()])\n );\n };\n\n const inShadow = (reflectorId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== reflectorId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.FresnelReflector) {\n const yearlyResult = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyResult && yearlyResult.length === daysPerYear) {\n yearlyResult.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(FresnelReflectorSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { calculatePeakRadiation, computeSunriseAndSunsetInMinutes, getSunDirection } from './sunTools';\nimport { Euler, Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, ObjectType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport { AirMass } from './analysisConstants';\nimport { HALF_PI, MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { HeliostatModel } from '../models/HeliostatModel';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { SunMinutes } from './SunMinutes';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface HeliostatSimulationProps {\n city: string | null;\n}\n\nconst HeliostatSimulation = ({ city }: HeliostatSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const setDailyYield = useDataStore(Selector.setDailyHeliostatYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyHeliostatIndividualOutputs);\n const setYearlyYield = useDataStore(Selector.setYearlyHeliostatYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const yearlyIndividualOutputs = useStore(Selector.yearlyHeliostatIndividualOutputs);\n const setHeliostatLabels = useDataStore(Selector.setHeliostatLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForHeliostats);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForHeliostats);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForHeliostats);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForHeliostats);\n const showDailyHeliostatYieldPanel = useStore(Selector.viewState.showDailyHeliostatYieldPanel);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.cspTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.cspDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.cspGridCellSize ?? 0.5;\n const objectsRef = useRef([]);\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation */\n\n useEffect(() => {\n if (runDailySimulation) {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), minuteInterval / 2 - 30);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyHeliostatYieldPanel = true;\n state.selectedFloatingWindow = 'dailyHeliostatYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForHeliostats = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyHeliostatYield();\n state.actionInfo = {\n name: 'Daily Simulation for Heliostats Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyHeliostatYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n calculateYield(e as HeliostatModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const heliostat = e as HeliostatModel;\n const result = dailyOutputsMapRef.current.get(heliostat.id);\n if (result) {\n const factor = getElementFactor(heliostat) * timeFactor;\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= factor;\n }\n }\n }\n }\n generateDailyYieldData();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateDailyYieldData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Heliostat' + index, output);\n labels.push(e.label ?? 'Heliostat' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Heliostat' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setHeliostatLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation */\n\n useEffect(() => {\n if (runYearlySimulation) {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60;\n if (totalMinutes < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n calculateYield(e as HeliostatModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyHeliostatYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyHeliostatYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForHeliostats = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyYieldData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyHeliostatYield();\n state.actionInfo = {\n name: 'Yearly Simulation for Heliostats Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyHeliostatYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), minuteInterval / 2 - 30);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const heliostat = e as HeliostatModel;\n const result = dailyOutputsMapRef.current.get(heliostat.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(heliostat.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(heliostat);\n }\n }\n }\n }\n if (showDailyHeliostatYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyYieldData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Heliostat' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setHeliostatLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions */\n\n // there is room for performance improvement if we figure out a way to cache a lot of things used below\n const calculateYield = (heliostat: HeliostatModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(heliostat);\n if (!parent) throw new Error('parent of heliostat does not exist');\n if (parent.type !== ObjectType.Foundation) return;\n const foundation = parent as FoundationModel;\n const powerTower = foundation.solarPowerTower;\n if (!powerTower) return;\n const dayOfYear = Util.dayOfYear(now);\n const center = Util.absoluteCoordinates(heliostat.cx, heliostat.cy, heliostat.cz, parent);\n const normal = new Vector3().fromArray(heliostat.normal);\n const originalNormal = normal.clone();\n const lx = heliostat.lx;\n const ly = heliostat.ly;\n const actualPoleHeight = heliostat.poleHeight + lx / 2;\n const nx = Math.max(2, Math.round(heliostat.lx / cellSize));\n const ny = Math.max(2, Math.round(heliostat.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - cellSize) / 2;\n const y0 = center.y - (ly - cellSize) / 2;\n const z0 = foundation.lz + actualPoleHeight + heliostat.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const rot = parent.rotation[2];\n // convert the receiver's coordinates into those relative to the center of this heliostat\n const receiverCenter =\n foundation.solarStructure === SolarStructure.FocusTower\n ? new Vector3(\n foundation.cx - center.x,\n foundation.cy - center.y,\n foundation.cz - center.z + (powerTower.towerHeight ?? 10),\n )\n : undefined;\n let heliostatToReceiver;\n let normalEuler;\n if (receiverCenter) {\n heliostatToReceiver = receiverCenter.clone().normalize();\n let normalVector = heliostatToReceiver.clone().add(sunDirection).normalize();\n if (Util.isSame(normalVector, UNIT_VECTOR_POS_Z)) {\n normalVector = new Vector3(-0.001, 0, 1).normalize();\n }\n if (rot) {\n normalVector.applyAxisAngle(UNIT_VECTOR_POS_Z, -rot);\n }\n // convert the normal vector to euler\n const r = Math.hypot(normalVector.x, normalVector.y);\n normalEuler = new Euler(\n Math.atan2(r, normalVector.z),\n 0,\n Math.atan2(normalVector.y, normalVector.x) + HALF_PI,\n 'ZXY',\n );\n normal.copy(originalNormal.clone().applyEuler(normalEuler));\n } else {\n heliostatToReceiver = new Vector3(0, 0, 1);\n normalEuler = new Euler();\n }\n // the unit of radiation is kW/m^2\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n let sum = 0;\n let tmpX = 0;\n for (let ku = 0; ku < nx; ku++) {\n tmpX = x0 + ku * dx;\n for (let kv = 0; kv < ny; kv++) {\n if (dot > 0) {\n v2d.set(tmpX, y0 + kv * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(heliostat.id, v, sunDirection) && !inShadow(heliostat.id, v, heliostatToReceiver)) {\n sum += dot * peakRadiation;\n }\n }\n }\n }\n const output = dailyOutputsMapRef.current.get(heliostat.id);\n if (output) {\n // the output is the average radiation density, hence we have to divide it by nx * ny\n // if the minutes are greater than 30 or 30, it is counted as the output of the next hour\n // to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += sum / (nx * ny);\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (heliostat: HeliostatModel) => {\n const parent = getParent(heliostat);\n if (!parent) throw new Error('parent of heliostat does not exist');\n let systemEfficiency = 1;\n if (parent.type === ObjectType.Foundation) {\n const foundation = parent as FoundationModel;\n const powerTower = foundation.solarPowerTower;\n systemEfficiency *=\n (powerTower?.receiverOpticalEfficiency ?? 0.7) *\n (powerTower?.receiverThermalEfficiency ?? 0.3) *\n (powerTower?.receiverAbsorptance ?? 0.95);\n }\n return (\n heliostat.lx *\n heliostat.ly *\n heliostat.reflectance *\n systemEfficiency *\n (1 - monthlyIrradianceLosses[now.getMonth()])\n );\n };\n\n const inShadow = (heliostatId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== heliostatId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Heliostat) {\n const yearlyResult = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyResult && yearlyResult.length === daysPerYear) {\n yearlyResult.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(HeliostatSimulation);\n","/*\n * @Copyright 2022-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n computeSunriseAndSunsetInMinutes,\n getSunDirection,\n} from './sunTools';\nimport { Intersection, Object3D, Raycaster, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport { DatumEntry, ObjectType, SolarStructure } from '../types';\nimport { Util } from '../Util';\nimport {\n AIR_DENSITY,\n AIR_ISOBARIC_SPECIFIC_HEAT,\n AirMass,\n GRAVITATIONAL_ACCELERATION,\n KELVIN_AT_ZERO_CELSIUS,\n MINUTES_OF_DAY,\n STEFAN_BOLTZMANN_CONSTANT,\n} from './analysisConstants';\nimport { MONTHS, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport * as Selector from '../stores/selector';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { SunMinutes } from './SunMinutes';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { computeOutsideTemperature, getOutsideTemperatureAtMinute } from './heatTools';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface SolarUpdraftTowerSimulationProps {\n city: string | null;\n}\n\nconst SolarUpdraftTowerSimulation = ({ city }: SolarUpdraftTowerSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getWeather = useStore(Selector.getWeather);\n const setLabels = useDataStore(Selector.setUpdraftTowerLabels);\n const setDailyResults = useDataStore(Selector.setDailyUpdraftTowerResults);\n const setDailyYield = useDataStore(Selector.setDailyUpdraftTowerYield);\n const setYearlyYield = useDataStore(Selector.setYearlyUpdraftTowerYield);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForUpdraftTower);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForUpdraftTower);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForUpdraftTower);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForUpdraftTower);\n const showDailyUpdraftTowerPanel = useStore(Selector.viewState.showDailyUpdraftTowerYieldPanel);\n const noAnimation = useStore(Selector.world.noAnimationForSolarUpdraftTowerSimulation);\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n const cellSize = world.sutGridCellSize ?? 1;\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? getWeather(city)?.elevation : 0;\n const timesPerHour = world.sutTimesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.sutDaysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const objectsRef = useRef([]);\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyAmbientTemperaturesRef = useRef(new Array(24).fill(0));\n const dailyChimneyInletAirTemperaturesMapRef = useRef>(new Map());\n const dailyWindSpeedsMapRef = useRef>(new Map());\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n const dayRef = useRef(0);\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation to generate daily yield */\n\n useEffect(() => {\n if (runDailySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticSimulateDaily();\n } else {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const staticSimulateDaily = () => {\n fetchObjects();\n resetDailyMaps();\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n calculateYieldWithoutAnimation(f);\n }\n }\n }\n setCommonStore((state) => {\n state.viewState.showDailyUpdraftTowerYieldPanel = true;\n state.selectedFloatingWindow = 'dailySolarUpdraftTowerYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForUpdraftTower = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyUpdraftTowerYield();\n state.actionInfo = {\n name: 'Static Daily Simulation for Updraft Tower Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyUpdraftTowerYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n dayRef.current = now.getDay();\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), -minuteInterval / 2);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyMaps();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyUpdraftTowerYieldPanel = true;\n state.selectedFloatingWindow = 'dailySolarUpdraftTowerYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForUpdraftTower = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumDailyUpdraftTowerYield();\n state.actionInfo = {\n name: 'Dynamic Daily Simulation for Updraft Tower Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().dailyUpdraftTowerYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n calculateYield(f);\n }\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const transmissivity = f.solarUpdraftTower.collectorTransmissivity ?? 0.9;\n const turbineEfficiency = f.solarUpdraftTower.turbineEfficiency ?? 0.3;\n const dischargeCoefficient = f.solarUpdraftTower.dischargeCoefficient ?? 0.65;\n const chimneyArea = Math.PI * f.solarUpdraftTower.chimneyRadius * f.solarUpdraftTower.chimneyRadius;\n const collectorArea = Math.PI * f.solarUpdraftTower.collectorRadius * f.solarUpdraftTower.collectorRadius;\n const dca = AIR_DENSITY * AIR_ISOBARIC_SPECIFIC_HEAT * chimneyArea;\n const speedFactor = 2 * GRAVITATIONAL_ACCELERATION * f.solarUpdraftTower.chimneyHeight;\n const chimneyInletTemperatures = dailyChimneyInletAirTemperaturesMapRef.current.get(e.id + '-sut');\n const windSpeeds = dailyWindSpeedsMapRef.current.get(e.id + '-sut');\n const outputs = dailyOutputsMapRef.current.get(e.id + '-sut');\n if (outputs && chimneyInletTemperatures && windSpeeds) {\n const powerFactor = 0.5 * dischargeCoefficient * turbineEfficiency * AIR_DENSITY * chimneyArea;\n const date = new Date(world.date);\n let weather, temp;\n if (city) {\n weather = getWeather(city);\n temp = computeOutsideTemperature(date, weather.lowestTemperatures, weather.highestTemperatures);\n }\n for (let i = 0; i < outputs.length; i++) {\n let ambientTemperature = 20;\n if (weather && temp) {\n date.setHours(i);\n ambientTemperature = getOutsideTemperatureAtMinute(\n temp.high,\n temp.low,\n world.diurnalTemperatureModel,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n Util.minutesIntoDay(date),\n );\n dailyAmbientTemperaturesRef.current[i] = ambientTemperature;\n }\n outputs[i] *= timeFactor * transmissivity * 1000; // from kW to W\n const tAmbientK = ambientTemperature + KELVIN_AT_ZERO_CELSIUS;\n if (outputs[i] > 0 && i > 0 && chimneyInletTemperatures[i - 1] > ambientTemperature) {\n // assume that the average temperature of the collector is the mean between ambient and inlet\n const tCollector = (chimneyInletTemperatures[i - 1] + ambientTemperature) / 2;\n const convectiveLoss =\n (world.airConvectiveCoefficient ?? 5) * collectorArea * (tCollector - ambientTemperature);\n const tCollectorK = tCollector + KELVIN_AT_ZERO_CELSIUS;\n const tCollector4 = tCollectorK * tCollectorK * tCollectorK * tCollectorK;\n const tAmbient4 = tAmbientK * tAmbientK * tAmbientK * tAmbientK;\n const radiationLoss =\n (f.solarUpdraftTower.collectorEmissivity ?? 0.95) *\n STEFAN_BOLTZMANN_CONSTANT *\n collectorArea *\n (tCollector4 - tAmbient4);\n outputs[i] -= convectiveLoss + radiationLoss;\n if (outputs[i] < 0) outputs[i] = 0;\n }\n const a = outputs[i] / (dca * tAmbientK);\n const temperature = tAmbientK * (1 + Math.cbrt((a * a) / speedFactor)) - KELVIN_AT_ZERO_CELSIUS;\n const speed =\n temperature > ambientTemperature\n ? Math.sqrt(speedFactor * ((temperature + KELVIN_AT_ZERO_CELSIUS) / tAmbientK - 1))\n : 0;\n outputs[i] = powerFactor * speed * speed * speed * 0.001; // from W to kW\n chimneyInletTemperatures[i] = temperature;\n windSpeeds[i] = speed;\n }\n }\n }\n }\n }\n generateDailyData();\n };\n\n const generateDailyData = () => {\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n index++;\n const temperature = dailyChimneyInletAirTemperaturesMapRef.current.get(e.id + '-sut');\n if (temperature) {\n map.set('Temperature Tower' + index, temperature);\n }\n const speed = dailyWindSpeedsMapRef.current.get(e.id + '-sut');\n if (speed) {\n map.set('Wind Speed Tower' + index, speed);\n }\n const output = dailyOutputsMapRef.current.get(e.id + '-sut');\n if (output) {\n map.set('Tower' + index, output);\n labels.push(e.label ? e.label : 'Tower' + index);\n }\n }\n }\n }\n const outputs = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Tower' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n outputs.push(datum);\n }\n setDailyYield(outputs);\n const results = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n datum['T_Ambient'] = dailyAmbientTemperaturesRef.current[i];\n for (let k = 1; k <= index; k++) {\n let key = 'Temperature Tower' + k;\n datum['T_' + labels[k - 1]] = map.get(key)?.[i];\n key = 'Wind Speed Tower' + k;\n datum['V_' + labels[k - 1]] = map.get(key)?.[i];\n }\n results.push(datum);\n }\n setDailyResults(results);\n setLabels(labels);\n };\n\n /* do the yearly simulation to generate the yearly yield */\n\n useEffect(() => {\n if (runYearlySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticSimulateYearly();\n } else {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyMaps();\n resetYearlyMap();\n };\n\n const staticSimulateYearly = () => {\n fetchObjects();\n resetDailyMaps();\n resetYearlyMap();\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n for (let month = 0; month < 12; month += monthInterval) {\n now.setMonth(month, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n resetDailyMaps();\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n calculateYieldWithoutAnimation(f);\n }\n }\n }\n finishMonthly();\n sampledDayRef.current++;\n }\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyUpdraftTowerYieldPanel = true;\n state.selectedFloatingWindow = 'yearlySolarUpdraftTowerYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForUpdraftTower = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyUpdraftTowerYield();\n state.actionInfo = {\n name: 'Static Yearly Simulation for Updraft Tower Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyUpdraftTowerYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n calculateYield(f);\n }\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyUpdraftTowerYieldPanel = true;\n state.selectedFloatingWindow = 'yearlySolarUpdraftTowerYieldPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForUpdraftTower = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (loggable) {\n setCommonStore((state) => {\n const totalYield = useDataStore.getState().sumYearlyUpdraftTowerYield();\n state.actionInfo = {\n name: 'Dynamic Yearly Simulation for Updraft Tower Completed',\n result: { totalYield: totalYield },\n details: useDataStore.getState().yearlyUpdraftTowerYield,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n resetDailyMaps();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const outputs = dailyOutputsMapRef.current.get(f.id + '-sut');\n const chimneyInletTemperatures = dailyChimneyInletAirTemperaturesMapRef.current.get(e.id + '-sut');\n const windSpeeds = dailyWindSpeedsMapRef.current.get(e.id + '-sut');\n if (outputs && chimneyInletTemperatures && windSpeeds) {\n const transmissivity = f.solarUpdraftTower.collectorTransmissivity ?? 0.9;\n const turbineEfficiency = f.solarUpdraftTower.turbineEfficiency ?? 0.3;\n const dischargeCoefficient = f.solarUpdraftTower.dischargeCoefficient ?? 0.65;\n const chimneyArea = Math.PI * f.solarUpdraftTower.chimneyRadius * f.solarUpdraftTower.chimneyRadius;\n const collectorArea = Math.PI * f.solarUpdraftTower.collectorRadius * f.solarUpdraftTower.collectorRadius;\n const dca = AIR_DENSITY * AIR_ISOBARIC_SPECIFIC_HEAT * chimneyArea;\n const speedFactor = 2 * GRAVITATIONAL_ACCELERATION * f.solarUpdraftTower.chimneyHeight;\n const powerFactor = 0.5 * dischargeCoefficient * turbineEfficiency * AIR_DENSITY * chimneyArea;\n let weather, temp;\n if (city) {\n weather = getWeather(city);\n temp = computeOutsideTemperature(now, weather.lowestTemperatures, weather.highestTemperatures);\n }\n for (let i = 0; i < outputs.length; i++) {\n let ambientTemperature = 20;\n if (weather && temp) {\n now.setHours(i);\n ambientTemperature = getOutsideTemperatureAtMinute(\n temp.high,\n temp.low,\n world.diurnalTemperatureModel,\n highestTemperatureTimeInMinutes,\n sunMinutes,\n Util.minutesIntoDay(now),\n );\n dailyAmbientTemperaturesRef.current[i] = ambientTemperature;\n }\n outputs[i] *= timeFactor * transmissivity * 1000; // from kW to W\n const tAmbientK = ambientTemperature + KELVIN_AT_ZERO_CELSIUS;\n if (outputs[i] > 0 && i > 0 && chimneyInletTemperatures[i - 1] > ambientTemperature) {\n // assume that the average temperature of the collector is the mean between ambient and inlet\n const tCollector = (chimneyInletTemperatures[i - 1] + ambientTemperature) / 2;\n const convectiveLoss =\n (world.airConvectiveCoefficient ?? 5) * collectorArea * (tCollector - ambientTemperature);\n const tCollectorK = tCollector + KELVIN_AT_ZERO_CELSIUS;\n const tCollector4 = tCollectorK * tCollectorK * tCollectorK * tCollectorK;\n const tAmbient4 = tAmbientK * tAmbientK * tAmbientK * tAmbientK;\n const radiationLoss =\n (f.solarUpdraftTower.collectorEmissivity ?? 0.95) *\n STEFAN_BOLTZMANN_CONSTANT *\n collectorArea *\n (tCollector4 - tAmbient4);\n outputs[i] -= convectiveLoss + radiationLoss;\n if (outputs[i] < 0) outputs[i] = 0;\n }\n const a = outputs[i] / (dca * tAmbientK);\n const temperature = tAmbientK * (1 + Math.cbrt((a * a) / speedFactor)) - KELVIN_AT_ZERO_CELSIUS;\n const speed =\n temperature > ambientTemperature\n ? Math.sqrt(speedFactor * ((temperature + KELVIN_AT_ZERO_CELSIUS) / tAmbientK - 1))\n : 0;\n outputs[i] = powerFactor * speed * speed * speed * 0.001; // from W to kW\n chimneyInletTemperatures[i] = temperature;\n windSpeeds[i] = speed;\n }\n const total = yearlyOutputsMapRef.current.get(f.id + '-sut');\n if (total) {\n const sumDaily = outputs.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily;\n }\n }\n }\n }\n }\n if (showDailyUpdraftTowerPanel) {\n generateDailyData();\n }\n };\n\n const generateYearlyData = () => {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const result = yearlyOutputsMapRef.current.get(e.id + '-sut');\n if (result) {\n resultArr.push(result);\n labels.push(e.label ? e.label : 'Tower' + ++index);\n }\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setLabels(labels);\n };\n\n /* shared functions between daily and yearly simulation */\n\n const resetDailyMaps = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const airTemperatures = dailyChimneyInletAirTemperaturesMapRef.current.get(e.id + '-sut');\n if (airTemperatures) {\n airTemperatures.fill(0);\n } else {\n dailyChimneyInletAirTemperaturesMapRef.current.set(e.id + '-sut', new Array(24).fill(0));\n }\n const windSpeeds = dailyWindSpeedsMapRef.current.get(e.id + '-sut');\n if (windSpeeds) {\n windSpeeds.fill(0);\n } else {\n dailyWindSpeedsMapRef.current.set(e.id + '-sut', new Array(24).fill(0));\n }\n const yields = dailyOutputsMapRef.current.get(e.id + '-sut');\n if (yields) {\n yields.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id + '-sut', new Array(24).fill(0));\n }\n }\n }\n }\n };\n\n const resetYearlyMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Foundation) {\n const f = e as FoundationModel;\n if (f.solarStructure === SolarStructure.UpdraftTower && f.solarUpdraftTower) {\n const yearlyOutput = yearlyOutputsMapRef.current.get(e.id + '-sut');\n if (yearlyOutput && yearlyOutput.length === daysPerYear) {\n yearlyOutput.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id + '-sut', new Array(daysPerYear).fill(0));\n }\n }\n }\n }\n };\n\n const calculateYield = (foundation: FoundationModel) => {\n const solarUpdraftTower = foundation.solarUpdraftTower;\n if (!solarUpdraftTower) return;\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const output = dailyOutputsMapRef.current.get(foundation.id + '-sut');\n if (output) {\n const dayOfYear = Util.dayOfYear(now);\n const normal = new Vector3().fromArray(foundation.normal);\n const radius = solarUpdraftTower.collectorRadius;\n const max = Math.max(2, Math.round((radius * 2) / cellSize));\n // shift half cell size to the center of each grid cell\n const x0 = foundation.cx - radius + cellSize / 2;\n const y0 = foundation.cy - radius + cellSize / 2;\n const z0 = foundation.lz + solarUpdraftTower.collectorHeight;\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n now.getMonth(),\n normal,\n peakRadiation,\n );\n const vec = new Vector3(0, 0, z0);\n const dot = normal.dot(sunDirection);\n const rsq = radius * radius;\n let result = 0;\n let countPoints = 0;\n let dx, dy;\n for (let u = 0; u < max; u++) {\n vec.x = x0 + u * cellSize;\n dx = vec.x - foundation.cx;\n for (let v = 0; v < max; v++) {\n vec.y = y0 + v * cellSize;\n dy = vec.y - foundation.cy;\n if (dx * dx + dy * dy > rsq) continue;\n countPoints++;\n result += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(foundation.id + '-sut', vec, sunDirection)) {\n result += dot * peakRadiation;\n }\n }\n }\n }\n if (countPoints) result /= countPoints;\n // the output is the average radiation intensity. if the minutes are greater than 30 or 30, it is counted\n // as the measurement of the next hour to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n const area = Math.PI * solarUpdraftTower.collectorRadius * solarUpdraftTower.collectorRadius;\n output[index] += result * area;\n }\n };\n\n // if there are no moving parts, this is way faster\n const calculateYieldWithoutAnimation = (foundation: FoundationModel) => {\n const solarUpdraftTower = foundation.solarUpdraftTower;\n if (!solarUpdraftTower) return;\n const result = dailyOutputsMapRef.current.get(foundation.id + '-sut');\n if (!result) return;\n const normal = new Vector3().fromArray(foundation.normal);\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n const radius = solarUpdraftTower.collectorRadius;\n const max = Math.max(2, Math.round((radius * 2) / cellSize));\n // shift half cell size to the center of each grid cell\n const x0 = foundation.cx - radius + cellSize / 2;\n const y0 = foundation.cy - radius + cellSize / 2;\n const z0 = foundation.lz + solarUpdraftTower.collectorHeight;\n const v = new Vector3(0, 0, z0);\n const rsq = radius * radius;\n let countPoints = 0;\n let dx, dy;\n const area = Math.PI * solarUpdraftTower.collectorRadius * solarUpdraftTower.collectorRadius;\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < timesPerHour; j++) {\n // a shift of 30 minutes minute half of the interval ensures the symmetry of the result around noon\n const cur = new Date(year, month, date, i, (j + 0.5) * minuteInterval - 30);\n const sunDirection = getSunDirection(cur, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const indirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n UNIT_VECTOR_POS_Z,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n countPoints = 0;\n for (let kx = 0; kx < max; kx++) {\n v.x = x0 + kx * cellSize;\n dx = v.x - foundation.cx;\n for (let ky = 0; ky < max; ky++) {\n v.y = y0 + ky * cellSize;\n dy = v.y - foundation.cy;\n if (dx * dx + dy * dy > rsq) continue;\n countPoints++;\n result[i] += indirectRadiation;\n if (dot > 0) {\n if (!inShadow(foundation.id + '-sut', v, sunDirection)) {\n result[i] += dot * peakRadiation;\n }\n }\n }\n }\n }\n }\n if (countPoints) result[i] /= countPoints;\n result[i] *= area;\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60; // in hours\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const month = now.getMonth();\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[month] / (30 * daylight * timesPerHour) : 0;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const inShadow = (foundationId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== foundationId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n return <>;\n};\n\nexport default React.memo(SolarUpdraftTowerSimulation);\n","/*\n * @Copyright 2022. Institute for Future Intelligence, Inc.\n */\n\nimport { Vector3 } from 'three';\nimport { HumanModel } from '../models/HumanModel';\n\nexport class Vantage {\n position: Vector3;\n observer: HumanModel;\n\n constructor(position: Vector3, observer: HumanModel) {\n this.position = position;\n this.observer = observer;\n }\n}\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { Euler, Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { HumanModel } from '../models/HumanModel';\nimport { Vantage } from './Vantage';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nconst SolarPanelVisibility = () => {\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const runAnalysis = usePrimitiveStore(Selector.runSolarPanelVisibilityAnalysis);\n\n const { scene } = useThree();\n const lang = { lng: language };\n const ray = useMemo(() => new Raycaster(), []);\n const cellSize = world.solarPanelVisibilityGridCellSize ?? 0.2;\n const vantagesRef = useRef([]);\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n\n useEffect(() => {\n if (runAnalysis) {\n if (elements && elements.length > 0) {\n analyze();\n setPrimitiveStore('runSolarPanelVisibilityAnalysis', false);\n setCommonStore((state) => {\n state.viewState.showSolarPanelVisibilityResultsPanel = true;\n state.selectedFloatingWindow = 'visibilityResultsPanel';\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n }\n }\n setPrimitiveStore('simulationInProgress', false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runAnalysis]);\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const fetchVantages = () => {\n vantagesRef.current = [];\n for (const e of elements) {\n if (e.type === ObjectType.Human) {\n const human = e as HumanModel;\n if (human.observer) {\n const parent = getParent(human);\n const position = parent\n ? Util.absoluteHumanOrTreeCoordinates(human.cx, human.cy, human.cz, parent)\n : new Vector3(human.cx, human.cy, human.cz);\n position.z += human.lz;\n vantagesRef.current.push(new Vantage(position, human));\n }\n }\n }\n };\n\n const analyze = () => {\n useDataStore.getState().clearSolarPanelVisibilityResults();\n fetchVantages();\n if (vantagesRef.current.length === 0) return;\n fetchObjects();\n for (const vantage of vantagesRef.current) {\n const resultMap = new Map();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const sp = e as SolarPanelModel;\n resultMap.set(sp.parentId, 0);\n }\n }\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const sp = e as SolarPanelModel;\n let vf = resultMap.get(sp.parentId) ?? 0;\n vf += getViewFactor(sp, vantage.position) * 100; // 100 is for percentage\n resultMap.set(sp.parentId, vf);\n }\n }\n useDataStore.getState().setSolarPanelVisibilityResult(vantage, resultMap);\n }\n };\n\n // view factor: https://en.wikipedia.org/wiki/View_factor\n const getViewFactor = (panel: SolarPanelModel, vantage: Vector3) => {\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = false;\n if (parent.type === ObjectType.Roof) {\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n rooftop = true;\n }\n const center = Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n if (rooftop) {\n center.z = panel.cz + parent.cz + parent.lz / 2;\n }\n const normal = new Vector3().fromArray(panel.normal);\n const zRot = parent.rotation[2] + panel.relativeAzimuth;\n if (Math.abs(panel.tiltAngle) > 0.001) {\n normal.applyEuler(new Euler(panel.tiltAngle, 0, zRot, 'ZYX'));\n }\n const lx = panel.lx;\n const ly = panel.ly * Math.cos(panel.tiltAngle);\n const lz = panel.ly * Math.abs(Math.sin(panel.tiltAngle));\n const nx = Math.max(2, Math.round(panel.lx / cellSize));\n const ny = Math.max(2, Math.round(panel.ly / cellSize));\n const dx = lx / nx;\n const dy = ly / ny;\n const dz = lz / ny;\n const x0 = center.x - lx / 2;\n const y0 = center.y - ly / 2;\n const z0 = (rooftop ? center.z : panel.poleHeight + center.z) - lz / 2;\n const center2d = new Vector2(center.x, center.y);\n let integral = 0;\n const point = new Vector3();\n const direction = new Vector3();\n let r;\n const v2 = new Vector2();\n const zRotZero = Util.isZero(zRot);\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n v2.set(x0 + kx * dx, y0 + ky * dy);\n if (!zRotZero) v2.rotateAround(center2d, zRot);\n point.set(v2.x, v2.y, z0 + ky * dz);\n direction.set(vantage.x - point.x, vantage.y - point.y, vantage.z - point.z);\n r = direction.length();\n if (r > 0) {\n direction.normalize();\n if (isVisible(panel.id, point, direction)) {\n integral += Math.abs(direction.dot(normal)) / (r * r);\n }\n }\n }\n }\n return (integral * cellSize * cellSize) / (4 * Math.PI);\n };\n\n const isVisible = (panelId: string, point: Vector3, direction: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(point, direction);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== panelId); // exclude this panel itself\n ray.intersectObjects(objects, false, intersectionsRef.current);\n if (intersectionsRef.current.length === 0) return true;\n for (const [index, intersect] of intersectionsRef.current.entries()) {\n if (intersect.object.name.endsWith('eyeball')) {\n if (index === 0) return true;\n }\n }\n return false;\n }\n return true;\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelVisibility);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n computeSunriseAndSunsetInMinutes,\n getSunDirection,\n} from './sunTools';\nimport { Intersection, Object3D, Raycaster, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport { DatumEntry, ObjectType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass, MINUTES_OF_DAY } from './analysisConstants';\nimport {\n MONTHS,\n UNIT_VECTOR_NEG_Y_ARRAY,\n UNIT_VECTOR_POS_Z,\n UNIT_VECTOR_POS_Z_ARRAY,\n ZERO_TOLERANCE,\n} from '../constants';\nimport { SensorModel } from '../models/SensorModel';\nimport * as Selector from '../stores/selector';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { SunMinutes } from './SunMinutes';\nimport { FoundationModel } from '../models/FoundationModel';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface SensorSimulationProps {\n city: string | null;\n}\n\nconst SensorSimulation = ({ city }: SensorSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const getWeather = useStore(Selector.getWeather);\n const getHorizontalSolarRadiation = useStore(Selector.getHorizontalSolarRadiation);\n const getVerticalSolarRadiation = useStore(Selector.getVerticalSolarRadiation);\n const setSensorLabels = useDataStore(Selector.setSensorLabels);\n const setDailyLightSensorData = useDataStore(Selector.setDailyLightSensorData);\n const setYearlyLightSensorData = useDataStore(Selector.setYearlyLightSensorData);\n const runDailyLightSensor = usePrimitiveStore(Selector.runDailyLightSensor);\n const pauseDailyLightSensor = usePrimitiveStore(Selector.pauseDailyLightSensor);\n const runYearlyLightSensor = usePrimitiveStore(Selector.runYearlyLightSensor);\n const pauseYearlyLightSensor = usePrimitiveStore(Selector.pauseYearlyLightSensor);\n const showDailyLightSensorPanel = useStore(Selector.viewState.showDailyLightSensorPanel);\n const noAnimation = useStore(Selector.world.noAnimationForSensorDataCollection);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n const measuredHorizontalRadiation = useMemo(() => getHorizontalSolarRadiation(city ?? 'Boston MA, USA'), [city]);\n const measuredVerticalRadiation = useMemo(() => getVerticalSolarRadiation(city ?? 'Boston MA, USA'), [city]);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.timesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const ray = useMemo(() => new Raycaster(), []);\n const objectsRef = useRef([]);\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyDataMapRef = useRef>(new Map());\n const yearlyDataMapRef = useRef>(new Map());\n const daylightArrayRef = useRef(new Array(12).fill(0));\n const clearnessArrayRef = useRef(new Array(12).fill(0));\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n const dayRef = useRef(0);\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n /* do the daily simulation to generate daily sensor data */\n\n useEffect(() => {\n if (runDailyLightSensor) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticSimulateDaily();\n } else {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailyLightSensor]);\n\n useEffect(() => {\n pauseRef.current = pauseDailyLightSensor;\n if (pauseDailyLightSensor) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailyLightSensor]);\n\n const staticSimulateDaily = () => {\n fetchObjects();\n resetDailyDataMap();\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n calculateMeasurementWithoutAnimation(e as SensorModel);\n }\n }\n setCommonStore((state) => {\n state.viewState.showDailyLightSensorPanel = true;\n state.selectedFloatingWindow = 'dailyLightSensorPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailyLightSensor = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Static Daily Simulation for Sensors Completed',\n details: useDataStore.getState().dailyLightSensorData,\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n dayRef.current = now.getDay();\n // beginning some minutes before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), -minuteInterval / 2);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyDataMap();\n };\n\n const simulateDaily = () => {\n if (runDailyLightSensor && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showDailyLightSensorPanel = true;\n state.selectedFloatingWindow = 'dailyLightSensorPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runDailyLightSensor = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n finishDaily();\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Dynamic Daily Simulation for Sensors Completed',\n details: useDataStore.getState().dailyLightSensorData,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n calculateMeasurement(e as SensorModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = dailyDataMapRef.current.get(e.id);\n if (result) {\n for (let i = 0; i < result.length; i++) {\n if (result[i] !== 0) result[i] *= timeFactor;\n }\n }\n }\n }\n generateDailyData();\n };\n\n const generateDailyData = () => {\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = dailyDataMapRef.current.get(e.id);\n if (result) {\n map.set('Radiation' + ++index, result);\n labels.push(e.label ? e.label : 'Radiation' + index);\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Radiation' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyLightSensorData(data);\n setSensorLabels(labels);\n };\n\n /* do the yearly simulation to collect sensor data */\n\n useEffect(() => {\n if (runYearlyLightSensor) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n staticSimulateYearly();\n } else {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlyLightSensor]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlyLightSensor;\n if (pauseYearlyLightSensor) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlyLightSensor]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyDataMap();\n resetYearlyDataMap();\n };\n\n const staticSimulateYearly = () => {\n fetchObjects();\n resetDailyDataMap();\n resetYearlyDataMap();\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n for (let month = 0; month < 12; month++) {\n now.setMonth(month, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n resetDailyDataMap();\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n calculateMeasurementWithoutAnimation(e as SensorModel);\n }\n }\n finishMonthly();\n sampledDayRef.current++;\n }\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyLightSensorPanel = true;\n state.selectedFloatingWindow = 'yearlyLightSensorPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlyLightSensor = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Static Yearly Simulation for Sensors Completed',\n details: useDataStore.getState().yearlyLightSensorData,\n timestamp: new Date().getTime(),\n };\n });\n }\n };\n\n const simulateYearly = () => {\n if (runYearlyLightSensor && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n calculateMeasurement(e as SensorModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === 12) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n state.viewState.showYearlyLightSensorPanel = true;\n state.selectedFloatingWindow = 'yearlyLightSensorPanel';\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlyLightSensor = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n showInfo(i18n.t('message.SimulationCompleted', lang));\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (loggable) {\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Dynamic Yearly Simulation for Sensors Completed',\n details: useDataStore.getState().yearlyLightSensorData,\n timestamp: new Date().getTime(),\n };\n });\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current, 22);\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n resetDailyDataMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = dailyDataMapRef.current.get(e.id);\n if (result) {\n const total = yearlyDataMapRef.current.get(e.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor;\n }\n }\n }\n }\n if (showDailyLightSensorPanel) finishDaily();\n };\n\n const generateYearlyData = () => {\n const resultArr = [];\n const labels = [];\n let index = 0;\n let hasHorizontalSensor = false;\n let hasVerticalSensor = false;\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = yearlyDataMapRef.current.get(e.id);\n if (result) {\n resultArr.push(result);\n labels.push(e.label ? e.label : 'Radiation' + ++index);\n if (!hasHorizontalSensor && Util.isIdentical(e.normal, UNIT_VECTOR_POS_Z_ARRAY)) {\n hasHorizontalSensor = true;\n }\n if (!hasVerticalSensor && Util.isIdentical(e.normal, UNIT_VECTOR_NEG_Y_ARRAY)) {\n hasVerticalSensor = true;\n }\n }\n }\n }\n const includeHorizontalMeasurement = hasHorizontalSensor && measuredHorizontalRadiation;\n if (includeHorizontalMeasurement) labels.push('Measured (Hor.)');\n const includeVerticalMeasurement = hasVerticalSensor && measuredVerticalRadiation;\n if (includeVerticalMeasurement) labels.push('Measured (Ver.)');\n const results = [];\n for (let month = 0; month < 12; month++) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r['Daylight'] = daylightArrayRef.current[month];\n r['Clearness'] = clearnessArrayRef.current[month] * 100;\n if (includeHorizontalMeasurement) r['Measured (Hor.)'] = measuredHorizontalRadiation.data[month];\n if (includeVerticalMeasurement) r['Measured (Ver.)'] = measuredVerticalRadiation.data[month];\n r[labels[i]] = a[month];\n }\n results.push(r);\n }\n setYearlyLightSensorData(results);\n setSensorLabels(labels);\n };\n\n /* shared functions between daily and yearly simulation */\n\n const resetDailyDataMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const result = dailyDataMapRef.current.get(e.id);\n if (result) {\n result.fill(0);\n } else {\n dailyDataMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyDataMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.Sensor) {\n const yearlyResult = yearlyDataMapRef.current.get(e.id);\n if (yearlyResult) {\n yearlyResult.fill(0);\n } else {\n yearlyDataMapRef.current.set(e.id, new Array(12).fill(0));\n }\n }\n }\n };\n\n const calculateMeasurement = (sensor: SensorModel) => {\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z < ZERO_TOLERANCE) return; // when the sun is not out\n const parent = getParent(sensor);\n if (!parent) throw new Error('parent of sensor does not exist');\n let foundation: FoundationModel | null = null;\n if (parent.type === ObjectType.Wall) {\n foundation = getFoundation(sensor);\n }\n const position = Util.absoluteCoordinates(\n sensor.cx,\n sensor.cy,\n sensor.cz,\n parent,\n foundation ? (foundation as FoundationModel) : undefined,\n );\n const normal = new Vector3().fromArray(sensor.normal);\n // TODO: right now we assume a parent rotation is always around the z-axis\n normal.applyAxisAngle(UNIT_VECTOR_POS_Z, parent.rotation[2]);\n const dayOfYear = Util.dayOfYear(now);\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n // indirect radiation\n let result = calculateDiffuseAndReflectedRadiation(world.ground, now.getMonth(), normal, peakRadiation);\n if (dot > 0) {\n if (!inShadow(sensor.id, position, sunDirection)) {\n // direct radiation\n result += dot * peakRadiation;\n }\n }\n const output = dailyDataMapRef.current.get(sensor.id);\n if (output) {\n // the output is the average radiation intensity. if the minutes are greater than 30 or 30, it is counted\n // as the measurement of the next hour to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += result;\n }\n };\n\n // if there are no moving parts, this is way faster\n const calculateMeasurementWithoutAnimation = (sensor: SensorModel) => {\n const parent = getParent(sensor);\n if (!parent) throw new Error('parent of sensor does not exist');\n const result = dailyDataMapRef.current.get(sensor.id);\n if (!result) return;\n let foundation: FoundationModel | null = null;\n if (parent.type === ObjectType.Wall) {\n foundation = getFoundation(sensor);\n }\n const position = Util.absoluteCoordinates(\n sensor.cx,\n sensor.cy,\n sensor.cz,\n parent,\n foundation ? (foundation as FoundationModel) : undefined,\n );\n const normal = new Vector3().fromArray(sensor.normal);\n // TODO: right now we assume a parent rotation is always around the z-axis\n normal.applyAxisAngle(UNIT_VECTOR_POS_Z, parent.rotation[2]);\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < timesPerHour; j++) {\n // a shift of 30 minutes minute half of the interval ensures the symmetry of the result around noon\n const cur = new Date(year, month, date, i, (j + 0.5) * minuteInterval - 30);\n const sunDirection = getSunDirection(cur, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const dot = normal.dot(sunDirection);\n if (dot > 0) {\n if (!inShadow(sensor.id, position, sunDirection)) {\n // direct radiation\n result[i] += dot * peakRadiation;\n }\n }\n // indirect radiation\n result[i] += calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n }\n }\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const month = now.getMonth();\n const daylight = sunMinutesRef.current.daylight() / 60;\n if (daylight > ZERO_TOLERANCE) {\n daylightArrayRef.current[month] = daylight;\n clearnessArrayRef.current[month] = weather.sunshineHours[month] / (30 * daylight);\n return clearnessArrayRef.current[month] / timesPerHour;\n }\n daylightArrayRef.current[month] = 0;\n clearnessArrayRef.current[month] = 0;\n return 0;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n const inShadow = (sensorId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== sensorId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n return <>;\n};\n\nexport default React.memo(SensorSimulation);\n","/*\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport {\n calculateDiffuseAndReflectedRadiation,\n calculatePeakRadiation,\n computeSunriseAndSunsetInMinutes,\n getSunDirection,\n} from './sunTools';\nimport { Euler, Intersection, Object3D, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useStore } from '../stores/common';\nimport * as Selector from 'src/stores/selector';\nimport { DatumEntry, Discretization, ObjectType, Orientation, ShadeTolerance, TrackerType } from '../types';\nimport { Util } from '../Util';\nimport { AirMass, MINUTES_OF_DAY } from './analysisConstants';\nimport { HALF_PI, MONTHS, UNIT_VECTOR_POS_Y, UNIT_VECTOR_POS_Z, ZERO_TOLERANCE } from '../constants';\nimport { SolarPanelModel } from '../models/SolarPanelModel';\nimport { computeOutsideTemperature, getOutsideTemperatureAtMinute } from './heatTools';\nimport { PvModel } from '../models/PvModel';\nimport { showInfo } from '../helpers';\nimport i18n from '../i18n/i18n';\nimport { SunMinutes } from './SunMinutes';\nimport { WallModel } from '../models/WallModel';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { useDataStore } from '../stores/commonData';\n\nexport interface SolarPanelSimulationProps {\n city: string | null;\n}\n\nconst getPanelEfficiency = (temperature: number, pvModel: PvModel) => {\n let e = pvModel.efficiency;\n if (pvModel.cellType === 'Monocrystalline') {\n e *= 0.95; // assuming that the packing density factor of semi-round cells is 0.95\n }\n return e * (1 + pvModel.pmaxTC * (temperature - 25));\n};\n\nconst SolarPanelSimulation = ({ city }: SolarPanelSimulationProps) => {\n const setCommonStore = useStore(Selector.set);\n const setPrimitiveStore = usePrimitiveStore(Selector.setPrimitiveStore);\n const loggable = useStore(Selector.loggable);\n const language = useStore(Selector.language);\n const world = useStore.getState().world;\n const elements = useStore.getState().elements;\n const getPvModule = useStore(Selector.getPvModule);\n const getWeather = useStore(Selector.getWeather);\n const getParent = useStore(Selector.getParent);\n const getFoundation = useStore(Selector.getFoundation);\n const setDailyYield = useDataStore(Selector.setDailyPvYield);\n const updateDailyYield = useStore(Selector.updateSolarCollectorDailyYieldById);\n const setYearlyYield = useDataStore(Selector.setYearlyPvYield);\n const updateYearlyYield = useStore(Selector.updateSolarCollectorYearlyYieldById);\n const dailyIndividualOutputs = useStore(Selector.dailyPvIndividualOutputs);\n const yearlyIndividualOutputs = useStore(Selector.yearlyPvIndividualOutputs);\n const setSolarPanelLabels = useDataStore(Selector.setSolarPanelLabels);\n const runDailySimulation = usePrimitiveStore(Selector.runDailySimulationForSolarPanels);\n const runDailySimulationLastStep = usePrimitiveStore(Selector.runDailySimulationForSolarPanelsLastStep);\n const pauseDailySimulation = usePrimitiveStore(Selector.pauseDailySimulationForSolarPanels);\n const runYearlySimulation = usePrimitiveStore(Selector.runYearlySimulationForSolarPanels);\n const runYearlySimulationLastStep = usePrimitiveStore(Selector.runYearlySimulationForSolarPanelsLastStep);\n const pauseYearlySimulation = usePrimitiveStore(Selector.pauseYearlySimulationForSolarPanels);\n const showDailyPvYieldPanel = useStore(Selector.viewState.showDailyPvYieldPanel);\n const noAnimation = useStore(Selector.world.noAnimationForSolarPanelSimulation);\n const highestTemperatureTimeInMinutes = useStore(Selector.world.highestTemperatureTimeInMinutes) ?? 900;\n const runEvolution = usePrimitiveStore(Selector.runEvolution);\n\n const { scene } = useThree();\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n const weather = useMemo(() => getWeather(city ?? 'Boston MA, USA'), [city]);\n const now = new Date(world.date);\n\n const elevation = city ? weather?.elevation : 0;\n const timesPerHour = world.timesPerHour ?? 4;\n const minuteInterval = 60 / timesPerHour;\n const daysPerYear = world.daysPerYear ?? 6;\n const monthInterval = 12 / daysPerYear;\n const ray = useMemo(() => new Raycaster(), []);\n const monthlyIrradianceLosses = world.monthlyIrradianceLosses ?? new Array(12).fill(0.05);\n const cellSize = world.pvGridCellSize ?? 0.25;\n const objectsRef = useRef([]); // reuse array in intersection detection\n const intersectionsRef = useRef([]); // reuse array in intersection detection\n const requestRef = useRef(0);\n const simulationCompletedRef = useRef(false);\n const originalDateRef = useRef(new Date(world.date));\n const dailyOutputsMapRef = useRef>(new Map());\n const yearlyOutputsMapRef = useRef>(new Map());\n const sampledDayRef = useRef(0);\n const pauseRef = useRef(false);\n const pausedDateRef = useRef(new Date(world.date));\n const dayRef = useRef(0);\n const currentTemperatureRef = useRef(20);\n\n // this is used in daily simulation that should respond to change of date and latitude\n const sunMinutes = useMemo(() => {\n return computeSunriseAndSunsetInMinutes(now, world.latitude);\n }, [world.date, world.latitude]);\n\n // this is used in yearly simulation in which the date is changed programmatically based on the current latitude\n const sunMinutesRef = useRef(sunMinutes);\n\n const daysOfMonth = Util.daysInYear(now) / 12;\n\n /* do the daily simulation to generate daily PV outputs */\n\n useEffect(() => {\n if (runDailySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n staticSimulateDaily(false);\n }, 50);\n } else {\n initDaily();\n requestRef.current = requestAnimationFrame(simulateDaily);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulation]);\n\n // this is used in the last step of simulation in an evolution\n useEffect(() => {\n if (runDailySimulationLastStep) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n staticSimulateDaily(true);\n }, 50);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runDailySimulationLastStep]);\n\n useEffect(() => {\n pauseRef.current = pauseDailySimulation;\n if (pauseDailySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateDaily();\n }\n }, [pauseDailySimulation]);\n\n const staticSimulateDaily = (lastStep: boolean) => {\n fetchObjects();\n resetDailyOutputsMap();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n calculateYieldWithoutAnimation(e as SolarPanelModel);\n }\n }\n setCommonStore((state) => {\n if (!runEvolution && !lastStep) {\n state.viewState.showDailyPvYieldPanel = true;\n state.selectedFloatingWindow = 'dailyPvYieldPanel';\n }\n });\n usePrimitiveStore.setState((state) => {\n if (lastStep) {\n state.runDailySimulationForSolarPanelsLastStep = false;\n } else {\n state.runDailySimulationForSolarPanels = false;\n }\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n simulationCompletedRef.current = true;\n finishDaily();\n if (!runEvolution && !lastStep) {\n // don't show info or log data when this simulation is called by an evolution\n showInfo(i18n.t('message.SimulationCompleted', lang));\n if (loggable) {\n const totalDailyYield = useDataStore.getState().sumDailyPvYield();\n const dailyProfit = useDataStore.getState().getDailyPvProfit();\n const dailyYieldArray = useDataStore.getState().dailyPvYield;\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Static Daily Simulation for Solar Panels Completed',\n result: { totalYield: totalDailyYield.toFixed(2), profit: dailyProfit.toFixed(2) },\n details: dailyYieldArray,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n };\n\n const initDaily = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n dayRef.current = now.getDay();\n // beginning before the sunrise hour just in case and to provide a cue\n now.setHours(Math.floor(sunMinutes.sunrise / 60), -minuteInterval / 2);\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n };\n\n const simulateDaily = () => {\n if (runDailySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval >= sunMinutes.sunset) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n if (!runEvolution) {\n state.viewState.showDailyPvYieldPanel = true;\n state.selectedFloatingWindow = 'dailyPvYieldPanel';\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runDailySimulationForSolarPanels = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n simulationCompletedRef.current = true;\n finishDaily();\n if (!runEvolution) {\n // don't show info or log data when this simulation is called by an evolution\n showInfo(i18n.t('message.SimulationCompleted', lang));\n if (loggable) {\n const totalDailyYield = useDataStore.getState().sumDailyPvYield();\n const dailyProfit = useDataStore.getState().getDailyPvProfit();\n const dailyYieldArray = useDataStore.getState().dailyPvYield;\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Dynamic Daily Simulation for Solar Panels Completed',\n result: { totalYield: totalDailyYield.toFixed(2), profit: dailyProfit.toFixed(2) },\n details: dailyYieldArray,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n return;\n }\n // this is where time advances (by incrementing the minutes with the given interval)\n // minutes more than 60 results in the increase of the hour accordingly\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n // this forces the scene to be re-rendered\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n // will the calculation immediately use the latest geometry after re-rendering?\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n calculateYield(e as SolarPanelModel);\n }\n }\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateDaily);\n }\n };\n\n const finishDaily = () => {\n const timeFactor = getTimeFactor();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const panel = e as SolarPanelModel;\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n const factor = getElementFactor(panel) * timeFactor;\n for (let i = 0; i < output.length; i++) {\n if (output[i] !== 0) output[i] *= factor;\n }\n }\n }\n }\n generateDailyData();\n };\n\n const generateDailyData = () => {\n if (dailyIndividualOutputs) {\n const total = new Array(24).fill(0);\n const map = new Map();\n let index = 0;\n const labels = [];\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n index++;\n map.set('Panel' + index, output);\n labels.push(e.label ? e.label : 'Panel' + index);\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n const datum: DatumEntry = {};\n datum['Hour'] = i;\n for (let k = 1; k <= index; k++) {\n const key = 'Panel' + k;\n datum[labels[k - 1]] = map.get(key)?.[i];\n }\n data.push(datum);\n }\n setDailyYield(data);\n setSolarPanelLabels(labels);\n } else {\n const total = new Array(24).fill(0);\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n updateDailyYield(\n e.id,\n output.reduce((a, b) => a + b, 0),\n );\n for (let i = 0; i < 24; i++) {\n total[i] += output[i];\n }\n }\n }\n }\n const data = [];\n for (let i = 0; i < 24; i++) {\n data.push({ Hour: i, Total: total[i] } as DatumEntry);\n }\n setDailyYield(data);\n }\n };\n\n /* do the yearly simulation to generate yearly PV outputs */\n\n useEffect(() => {\n if (runYearlySimulation) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n staticSimulateYearly(false);\n }, 50);\n } else {\n initYearly();\n requestRef.current = requestAnimationFrame(simulateYearly);\n return () => {\n // this is called when the recursive call of requestAnimationFrame exits\n cancelAnimationFrame(requestRef.current);\n if (!simulationCompletedRef.current) {\n showInfo(i18n.t('message.SimulationAborted', lang));\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n });\n usePrimitiveStore.setState((state) => {\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n }\n pauseRef.current = false;\n };\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulation]);\n\n // this is used for the last step of simulation in an evolution\n useEffect(() => {\n if (runYearlySimulationLastStep) {\n if (noAnimation && !Util.hasMovingParts(elements)) {\n // this causes the simulation code to run at the beginning of the next event cycle\n // that hopefully has the updated scene graph\n setTimeout(() => {\n staticSimulateYearly(true);\n }, 50);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runYearlySimulationLastStep]);\n\n useEffect(() => {\n pauseRef.current = pauseYearlySimulation;\n if (pauseYearlySimulation) {\n pausedDateRef.current = new Date(now.getTime());\n cancelAnimationFrame(requestRef.current);\n setPrimitiveStore('simulationPaused', true);\n showInfo(i18n.t('message.SimulationPaused', lang));\n } else {\n setPrimitiveStore('simulationPaused', false);\n // continue the simulation\n simulateYearly();\n }\n }, [pauseYearlySimulation]);\n\n const initYearly = () => {\n if (pauseRef.current) {\n // if the simulation has been paused, continue from the paused date\n now.setTime(pausedDateRef.current.getTime());\n pauseRef.current = false;\n } else {\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n now.setMonth(0, 22); // begin from January, 22\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n // set the initial date so that the scene gets a chance to render before the simulation starts\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n }\n simulationCompletedRef.current = false;\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n };\n\n const staticSimulateYearly = (lastStep: boolean) => {\n fetchObjects();\n resetDailyOutputsMap();\n resetYearlyOutputsMap();\n originalDateRef.current = new Date(world.date);\n sampledDayRef.current = 0;\n for (let month = 0; month < 12; month += monthInterval) {\n now.setMonth(month, 22);\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n resetDailyOutputsMap();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n calculateYieldWithoutAnimation(e as SolarPanelModel);\n }\n }\n finishMonthly();\n sampledDayRef.current++;\n }\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n if (!runEvolution && !lastStep) {\n state.viewState.showYearlyPvYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyPvYieldPanel';\n }\n });\n usePrimitiveStore.setState((state) => {\n if (lastStep) {\n state.runYearlySimulationForSolarPanelsLastStep = false;\n } else {\n state.runYearlySimulationForSolarPanels = false;\n }\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (!runEvolution && !lastStep) {\n // don't show info or log data when this simulation is called by an evolution\n showInfo(i18n.t('message.SimulationCompleted', lang));\n if (loggable) {\n const totalYearlyYield = useDataStore.getState().sumYearlyPvYield();\n const yearlyProfit = useDataStore.getState().getYearlyPvProfit();\n const yearlyYieldArray = useDataStore.getState().yearlyPvYield;\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Static Yearly Simulation for Solar Panels Completed',\n result: { totalYield: totalYearlyYield.toFixed(2), profit: yearlyProfit.toFixed(2) },\n details: yearlyYieldArray,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n };\n\n const simulateYearly = () => {\n if (runYearlySimulation && !pauseRef.current) {\n const totalMinutes = now.getMinutes() + now.getHours() * 60 + (now.getDay() - dayRef.current) * MINUTES_OF_DAY;\n if (totalMinutes + minuteInterval < sunMinutesRef.current.sunset) {\n // this is where time advances (by incrementing the minutes with the given interval)\n now.setHours(now.getHours(), now.getMinutes() + minuteInterval);\n setCommonStore((state) => {\n state.world.date = now.toLocaleString('en-US');\n });\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n calculateYield(e as SolarPanelModel);\n }\n }\n // recursive call to the next step of the simulation within the current day\n requestRef.current = requestAnimationFrame(simulateYearly);\n } else {\n finishMonthly();\n sampledDayRef.current++;\n if (sampledDayRef.current === daysPerYear) {\n cancelAnimationFrame(requestRef.current);\n setCommonStore((state) => {\n state.world.date = originalDateRef.current.toLocaleString('en-US');\n if (!runEvolution) {\n state.viewState.showYearlyPvYieldPanel = true;\n state.selectedFloatingWindow = 'yearlyPvYieldPanel';\n }\n });\n usePrimitiveStore.setState((state) => {\n state.runYearlySimulationForSolarPanels = false;\n state.simulationInProgress = false;\n state.simulationPaused = false;\n });\n simulationCompletedRef.current = true;\n generateYearlyData();\n if (!runEvolution) {\n // don't show info or log data when this simulation is called by an evolution\n showInfo(i18n.t('message.SimulationCompleted', lang));\n if (loggable) {\n const totalYearlyYield = useDataStore.getState().sumYearlyPvYield();\n const yearlyProfit = useDataStore.getState().getYearlyPvProfit();\n const yearlyYieldArray = useDataStore.getState().yearlyPvYield;\n setCommonStore((state) => {\n state.actionInfo = {\n name: 'Dynamic Yearly Simulation for Solar Panels Completed',\n result: { totalYield: totalYearlyYield.toFixed(2), profit: yearlyProfit.toFixed(2) },\n details: yearlyYieldArray,\n timestamp: new Date().getTime(),\n };\n });\n }\n }\n return;\n }\n // go to the next month\n now.setMonth(sampledDayRef.current * monthInterval, 22);\n dayRef.current = now.getDay();\n sunMinutesRef.current = computeSunriseAndSunsetInMinutes(now, world.latitude);\n now.setHours(Math.floor(sunMinutesRef.current.sunrise / 60), -minuteInterval / 2);\n resetDailyOutputsMap();\n // recursive call to the next step of the simulation\n requestRef.current = requestAnimationFrame(simulateYearly);\n }\n }\n };\n\n const finishMonthly = () => {\n const timeFactor = getTimeFactorByMonth();\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const panel = e as SolarPanelModel;\n const result = dailyOutputsMapRef.current.get(e.id);\n if (result) {\n const total = yearlyOutputsMapRef.current.get(e.id);\n if (total) {\n const sumDaily = result.reduce((a, b) => a + b, 0);\n total[sampledDayRef.current] += sumDaily * timeFactor * getElementFactor(panel);\n }\n }\n }\n }\n if (!runEvolution && showDailyPvYieldPanel) finishDaily();\n };\n\n // TODO:\n // Figure out a way to regenerate the graph without redoing the calculation\n // when switching between individual and total outputs\n const generateYearlyData = () => {\n if (yearlyIndividualOutputs) {\n const resultArr = [];\n const labels = [];\n let index = 0;\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n index++;\n labels.push(e.label ?? 'Panel' + index);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n const r: DatumEntry = {};\n r['Month'] = MONTHS[month];\n for (const [i, a] of resultArr.entries()) {\n r[labels[i]] = a[month / monthInterval] * daysOfMonth;\n }\n results.push(r);\n }\n setYearlyYield(results);\n setSolarPanelLabels(labels);\n } else {\n const resultArr = [];\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = yearlyOutputsMapRef.current.get(e.id);\n if (output) {\n updateYearlyYield(e.id, output.reduce((a, b) => a + b, 0) * monthInterval * daysOfMonth);\n resultArr.push(output);\n }\n }\n }\n const results = [];\n for (let month = 0; month < 12; month += monthInterval) {\n let total = 0;\n for (const result of resultArr) {\n total += result[month / monthInterval];\n }\n results.push({ Month: MONTHS[month], Total: total * daysOfMonth } as DatumEntry);\n }\n setYearlyYield(results);\n }\n };\n\n /* shared functions between daily and yearly simulation */\n\n // if there are no moving parts, this is way faster\n const calculateYieldWithoutAnimation = (panel: SolarPanelModel) => {\n if (panel.trackerType !== TrackerType.NO_TRACKER)\n throw new Error('static simulation is not for solar panel with tracker');\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n }\n const pvModel = getPvModule(panel.pvModelName);\n if (!pvModel) throw new Error('PV model not found');\n const output = dailyOutputsMapRef.current.get(panel.id);\n if (!output) return;\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, getFoundation(panel), panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const rot = parent.rotation[2];\n let zRot = rot + panel.relativeAzimuth;\n let angle = panel.tiltAngle;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const foundation = getFoundation(parent);\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n const normal = new Vector3().fromArray(panel.normal);\n // TODO: right now we assume a parent rotation is always around the z-axis\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof\n // or wall. So we only need to tilt the normal for a solar panel on a foundation or flat roof or wall.\n const normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n normal.applyEuler(normalEuler);\n const year = now.getFullYear();\n const month = now.getMonth();\n const date = now.getDate();\n const dayOfYear = Util.dayOfYear(now);\n let lx: number, ly: number, nx: number, ny: number;\n let dCell: number;\n if (world.discretization === Discretization.EXACT) {\n lx = panel.lx;\n ly = panel.ly;\n if (panel.orientation === Orientation.portrait) {\n nx = Math.max(1, Math.round(panel.lx / pvModel.width));\n ny = Math.max(1, Math.round(panel.ly / pvModel.length));\n nx *= pvModel.n;\n ny *= pvModel.m;\n } else {\n nx = Math.max(1, Math.round(panel.lx / pvModel.length));\n ny = Math.max(1, Math.round(panel.ly / pvModel.width));\n nx *= pvModel.m;\n ny *= pvModel.n;\n }\n dCell = panel.lx / nx;\n } else {\n lx = panel.lx;\n ly = panel.ly;\n nx = Math.max(2, Math.round(panel.lx / cellSize));\n ny = Math.max(2, Math.round(panel.ly / cellSize));\n // nx and ny must be even (for circuit simulation)\n if (nx % 2 !== 0) nx += 1;\n if (ny % 2 !== 0) ny += 1;\n dCell = cellSize;\n }\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - dCell) / 2;\n const y0 = center.y - (ly - dCell) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const cellOutputs = Array.from(Array(nx), () => new Array(ny));\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n for (let i = 0; i < 24; i++) {\n for (let j = 0; j < timesPerHour; j++) {\n // a shift of 30 minutes minute half of the interval ensures the symmetry of the result around noon\n const currentTime = new Date(year, month, date, i, (j + 0.5) * minuteInterval - 30);\n const sunDirection = getSunDirection(currentTime, world.latitude);\n if (sunDirection.z > 0) {\n // when the sun is out\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const frontIndirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n normal,\n peakRadiation,\n );\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n if (pvModel.bifacialityFactor > 0) {\n // bifacial panel\n const backsideNormal = normal.clone().negate();\n const backIndirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n backsideNormal,\n peakRadiation,\n );\n const indirectRadiation = frontIndirectRadiation + backIndirectRadiation * pvModel.bifacialityFactor;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = indirectRadiation;\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n cellOutputs[kx][ky] += (dot > 0 ? dot : -dot * pvModel.bifacialityFactor) * peakRadiation;\n }\n }\n }\n } else {\n // monofacial panel\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = frontIndirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n // we must consider cell wiring and distributed efficiency\n // Nice demo at: https://www.youtube.com/watch?v=UNPJapaZlCU\n let sum = 0;\n updateTemperature(currentTime);\n const eff = getPanelEfficiency(currentTemperatureRef.current, pvModel);\n switch (pvModel.shadeTolerance) {\n case ShadeTolerance.NONE:\n // all the cells are connected in a single series,\n // so the total output is determined by the minimum\n let min1 = Number.MAX_VALUE;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min1) {\n min1 = c;\n }\n }\n }\n sum = min1 * nx * ny;\n break;\n case ShadeTolerance.PARTIAL:\n // assuming each panel uses a diode bypass to connect two columns of cells\n let min2 = Number.MAX_VALUE;\n if (panel.orientation === Orientation.portrait) {\n // e.g., nx = 6, ny = 10\n for (let kx = 0; kx < nx; kx++) {\n if (kx % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (kx % 2 === 1) {\n sum += min2 * ny * 2;\n }\n }\n } else {\n // landscape, e.g., nx = 10, ny = 6\n for (let ky = 0; ky < ny; ky++) {\n if (ky % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let kx = 0; kx < nx; kx++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (ky % 2 === 1) {\n sum += min2 * nx * 2;\n }\n }\n }\n break;\n default:\n // this probably is too idealized\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n sum += cellOutputs[kx][ky];\n }\n }\n break;\n }\n output[i] += (eff * sum) / (nx * ny);\n } else {\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = 0;\n }\n }\n }\n }\n }\n };\n\n const calculateYield = (panel: SolarPanelModel) => {\n let parent = getParent(panel);\n if (!parent) throw new Error('parent of solar panel does not exist');\n let rooftop = panel.parentType === ObjectType.Roof;\n const walltop = panel.parentType === ObjectType.Wall;\n if (rooftop) {\n // x and y coordinates of a rooftop solar panel are relative to the foundation\n parent = getFoundation(parent);\n if (!parent) throw new Error('foundation of solar panel does not exist');\n }\n const pvModel = getPvModule(panel.pvModelName);\n if (!pvModel) throw new Error('PV model not found');\n const sunDirection = getSunDirection(now, world.latitude);\n if (sunDirection.z <= 0) return; // when the sun is not out\n const center = walltop\n ? Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent, getFoundation(panel), panel.lz)\n : Util.absoluteCoordinates(panel.cx, panel.cy, panel.cz, parent);\n const rot = parent.rotation[2];\n let angle = panel.tiltAngle;\n let zRot = rot + panel.relativeAzimuth;\n let flat = true;\n if (rooftop) {\n // z coordinate of a rooftop solar panel is absolute\n center.z = panel.cz + panel.lz + 0.02 + parent.cz + parent.lz / 2;\n if (Util.isZero(panel.rotation[0])) {\n // on a flat roof, add pole height\n center.z += panel.poleHeight;\n } else {\n // on a no-flat roof, ignore tilt angle\n angle = panel.rotation[0];\n zRot = rot;\n flat = false;\n }\n }\n if (walltop && !Util.isZero(panel.tiltAngle)) {\n const wall = parent as WallModel;\n const foundation = getFoundation(parent);\n const wallAbsAngle = foundation ? foundation.rotation[2] + wall.relativeAngle : wall.relativeAngle;\n const an = wallAbsAngle - HALF_PI;\n const dr = (panel.ly * Math.abs(Math.sin(panel.tiltAngle))) / 2;\n center.x += dr * Math.cos(an); // panel.ly has been rotated based on the orientation\n center.y += dr * Math.sin(an);\n }\n const normal = new Vector3().fromArray(panel.normal);\n const month = now.getMonth();\n const dayOfYear = Util.dayOfYear(now);\n let lx: number, ly: number, nx: number, ny: number;\n let dCell: number;\n if (world.discretization === Discretization.EXACT) {\n lx = panel.lx;\n ly = panel.ly;\n if (panel.orientation === Orientation.portrait) {\n nx = Math.max(1, Math.round(panel.lx / pvModel.width));\n ny = Math.max(1, Math.round(panel.ly / pvModel.length));\n nx *= pvModel.n;\n ny *= pvModel.m;\n } else {\n nx = Math.max(1, Math.round(panel.lx / pvModel.length));\n ny = Math.max(1, Math.round(panel.ly / pvModel.width));\n nx *= pvModel.m;\n ny *= pvModel.n;\n }\n dCell = panel.lx / nx;\n } else {\n lx = panel.lx;\n ly = panel.ly;\n nx = Math.max(2, Math.round(panel.lx / cellSize));\n ny = Math.max(2, Math.round(panel.ly / cellSize));\n // nx and ny must be even (for circuit simulation)\n if (nx % 2 !== 0) nx += 1;\n if (ny % 2 !== 0) ny += 1;\n dCell = cellSize;\n }\n const dx = lx / nx;\n const dy = ly / ny;\n // shift half cell size to the center of each grid cell\n const x0 = center.x - (lx - dCell) / 2;\n const y0 = center.y - (ly - dCell) / 2;\n const z0 = rooftop || walltop ? center.z : parent.lz + panel.poleHeight + panel.lz;\n const center2d = new Vector2(center.x, center.y);\n const v = new Vector3();\n const cellOutputs = Array.from(Array(nx), () => new Array(ny));\n // normal has been set if it is on top of a tilted roof, but has not if it is on top of a foundation or flat roof.\n // so we only need to tilt the normal for a solar panel on a foundation or flat roof\n let normalEuler = new Euler(rooftop && !flat ? 0 : angle, 0, zRot, 'ZYX');\n if (panel.trackerType !== TrackerType.NO_TRACKER) {\n // dynamic angles\n const rotatedSunDirection = rot\n ? sunDirection.clone().applyAxisAngle(UNIT_VECTOR_POS_Z, -rot)\n : sunDirection.clone();\n switch (panel.trackerType) {\n case TrackerType.ALTAZIMUTH_DUAL_AXIS_TRACKER:\n const qRotAADAT = new Quaternion().setFromUnitVectors(UNIT_VECTOR_POS_Z, rotatedSunDirection);\n normalEuler = new Euler().setFromQuaternion(qRotAADAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.HORIZONTAL_SINGLE_AXIS_TRACKER:\n const qRotHSAT = new Quaternion().setFromUnitVectors(\n UNIT_VECTOR_POS_Z,\n new Vector3(rotatedSunDirection.x, 0, rotatedSunDirection.z).normalize(),\n );\n normalEuler = new Euler().setFromQuaternion(qRotHSAT);\n // the default order is XYZ, so we rotate the relative azimuth below using the z-component\n normalEuler.z += zRot;\n break;\n case TrackerType.VERTICAL_SINGLE_AXIS_TRACKER:\n const v2 = new Vector3(rotatedSunDirection.x, -rotatedSunDirection.y, 0).normalize();\n const az = Math.acos(UNIT_VECTOR_POS_Y.dot(v2)) * Math.sign(v2.x);\n normalEuler = new Euler(panel.tiltAngle, 0, az + rot, 'ZYX');\n break;\n case TrackerType.TILTED_SINGLE_AXIS_TRACKER:\n // TODO\n break;\n }\n }\n normal.applyEuler(normalEuler);\n // the dot array on a solar panel above a tilted roof has not been tilted or rotated\n // we need to set the normal Euler below for this case\n if (rooftop && !flat) {\n normalEuler.x = panel.rotation[0];\n normalEuler.z = panel.rotation[2] + rot;\n }\n if (walltop) {\n // wall panels use negative tilt angles, opposite to foundation panels, so we use + below.\n normalEuler.x = HALF_PI + panel.tiltAngle;\n normalEuler.z = (parent as WallModel).relativeAngle + rot;\n }\n const peakRadiation = calculatePeakRadiation(sunDirection, dayOfYear, elevation, AirMass.SPHERE_MODEL);\n const frontIndirectRadiation = calculateDiffuseAndReflectedRadiation(world.ground, month, normal, peakRadiation);\n const dot = normal.dot(sunDirection);\n const v2d = new Vector2();\n const dv = new Vector3();\n if (pvModel.bifacialityFactor > 0) {\n // bifacial panel\n const backsideNormal = normal.clone().negate();\n const backIndirectRadiation = calculateDiffuseAndReflectedRadiation(\n world.ground,\n month,\n backsideNormal,\n peakRadiation,\n );\n const indirectRadiation = frontIndirectRadiation + backIndirectRadiation * pvModel.bifacialityFactor;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = indirectRadiation;\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n cellOutputs[kx][ky] += (dot > 0 ? dot : -dot * pvModel.bifacialityFactor) * peakRadiation;\n }\n }\n }\n } else {\n // monofacial panel\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n cellOutputs[kx][ky] = frontIndirectRadiation;\n if (dot > 0) {\n v2d.set(x0 + kx * dx, y0 + ky * dy);\n dv.set(v2d.x - center2d.x, v2d.y - center2d.y, 0);\n dv.applyEuler(normalEuler);\n v.set(center.x + dv.x, center.y + dv.y, z0 + dv.z);\n if (!inShadow(panel.id, v, sunDirection)) {\n // direct radiation\n cellOutputs[kx][ky] += dot * peakRadiation;\n }\n }\n }\n }\n }\n // we must consider cell wiring and distributed efficiency\n // Nice demo at: https://www.youtube.com/watch?v=UNPJapaZlCU\n let sum = 0;\n switch (pvModel.shadeTolerance) {\n case ShadeTolerance.NONE:\n // all the cells are connected in a single series,\n // so the total output is determined by the minimum\n let min1 = Number.MAX_VALUE;\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min1) {\n min1 = c;\n }\n }\n }\n sum = min1 * nx * ny;\n break;\n case ShadeTolerance.PARTIAL:\n // assuming each panel uses a diode bypass to connect two columns of cells\n let min2 = Number.MAX_VALUE;\n if (panel.orientation === Orientation.portrait) {\n // e.g., nx = 6, ny = 10\n for (let kx = 0; kx < nx; kx++) {\n if (kx % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let ky = 0; ky < ny; ky++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (kx % 2 === 1) {\n sum += min2 * ny * 2;\n }\n }\n } else {\n // landscape, e.g., nx = 10, ny = 6\n for (let ky = 0; ky < ny; ky++) {\n if (ky % 2 === 0) {\n // reset min every two columns of cells\n min2 = Number.MAX_VALUE;\n }\n for (let kx = 0; kx < nx; kx++) {\n const c = cellOutputs[kx][ky];\n if (c < min2) {\n min2 = c;\n }\n }\n if (ky % 2 === 1) {\n sum += min2 * nx * 2;\n }\n }\n }\n break;\n default:\n // this probably is too idealized\n for (let kx = 0; kx < nx; kx++) {\n for (let ky = 0; ky < ny; ky++) {\n sum += cellOutputs[kx][ky];\n }\n }\n break;\n }\n const output = dailyOutputsMapRef.current.get(panel.id);\n if (output) {\n updateTemperature(now);\n const eff = getPanelEfficiency(currentTemperatureRef.current, pvModel);\n // the output is the average radiation intensity. if the minutes are greater than 30 or 30, it is counted\n // as the measurement of the next hour to maintain the symmetry around noon\n const index = now.getMinutes() >= 30 ? (now.getHours() + 1 === 24 ? 0 : now.getHours() + 1) : now.getHours();\n output[index] += (eff * sum) / (nx * ny);\n }\n };\n\n const resetDailyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const output = dailyOutputsMapRef.current.get(e.id);\n if (output) {\n output.fill(0);\n } else {\n dailyOutputsMapRef.current.set(e.id, new Array(24).fill(0));\n }\n }\n }\n };\n\n const resetYearlyOutputsMap = () => {\n for (const e of elements) {\n if (e.type === ObjectType.SolarPanel) {\n const yearlyOutput = yearlyOutputsMapRef.current.get(e.id);\n if (yearlyOutput && yearlyOutput.length === daysPerYear) {\n yearlyOutput.fill(0);\n } else {\n yearlyOutputsMapRef.current.set(e.id, new Array(daysPerYear).fill(0));\n }\n }\n }\n };\n\n // apply clearness and convert the unit of time step from minute to hour so that we get kWh\n // (divided by times per hour as the radiation is added up that many times in an hour)\n const getTimeFactor = () => {\n const daylight = sunMinutes.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getTimeFactorByMonth = () => {\n const daylight = sunMinutesRef.current.daylight() / 60;\n return daylight > ZERO_TOLERANCE ? weather.sunshineHours[now.getMonth()] / (30 * daylight * timesPerHour) : 0;\n };\n\n const getElementFactor = (panel: SolarPanelModel) => {\n const pvModel = getPvModule(panel.pvModelName);\n if (!pvModel) throw new Error('PV model not found');\n return panel.lx * panel.ly * (panel.inverterEfficiency ?? 0.95) * (1 - monthlyIrradianceLosses[now.getMonth()]);\n };\n\n const updateTemperature = (currentTime: Date) => {\n if (city) {\n const weather = getWeather(city);\n if (weather) {\n const t = computeOutsideTemperature(currentTime, weather.lowestTemperatures, weather.highestTemperatures);\n currentTemperatureRef.current = getOutsideTemperatureAtMinute(\n t.high,\n t.low,\n world.diurnalTemperatureModel,\n highestTemperatureTimeInMinutes,\n computeSunriseAndSunsetInMinutes(currentTime, world.latitude),\n Util.minutesIntoDay(currentTime),\n );\n }\n }\n };\n\n const inShadow = (panelId: string, position: Vector3, sunDirection: Vector3) => {\n if (objectsRef.current.length > 1) {\n intersectionsRef.current.length = 0;\n ray.set(position, sunDirection);\n const objects = objectsRef.current.filter((obj) => obj.uuid !== panelId);\n ray.intersectObjects(objects, false, intersectionsRef.current);\n return intersectionsRef.current.length > 0;\n }\n return false;\n };\n\n const fetchObjects = () => {\n const content = scene.children.filter((c) => c.name === 'Content');\n if (content.length > 0) {\n const components = content[0].children;\n objectsRef.current.length = 0;\n for (const c of components) {\n Util.fetchSimulationElements(c, objectsRef.current);\n }\n }\n };\n\n return <>;\n};\n\nexport default React.memo(SolarPanelSimulation);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n *\r\n */\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport ThermalSimulation from './analysis/thermalSimulation';\r\nimport StaticSolarRadiationSimulation from './analysis/staticSolarRadiationSimulation';\r\nimport DynamicSolarRadiationSimulation from './analysis/dynamicSolarRadiationSimulation';\r\nimport ParabolicTroughSimulation from './analysis/parabolicTroughSimulation';\r\nimport ParabolicDishSimulation from './analysis/parabolicDishSimulation';\r\nimport FresnelReflectorSimulation from './analysis/fresnelReflectorSimulation';\r\nimport HeliostatSimulation from './analysis/heliostatSimulation';\r\nimport SolarUpdraftTowerSimulation from './analysis/solarUpdraftTowerSimulation';\r\nimport SolarPanelVisibility from './analysis/solarPanelVisibility';\r\nimport SensorSimulation from './analysis/sensorSimulation';\r\nimport SolarPanelSimulation from './analysis/solarPanelSimulation';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { useStore } from './stores/common';\r\n\r\nconst Simulations = () => {\r\n const worldLatitude = useStore(Selector.world.latitude);\r\n const worldLongitude = useStore(Selector.world.longitude);\r\n const getClosestCity = useStore(Selector.getClosestCity);\r\n\r\n const [city, setCity] = useState('Boston MA, USA');\r\n\r\n useEffect(() => {\r\n setCity(getClosestCity(worldLatitude, worldLongitude) ?? 'Boston MA, USA');\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [worldLatitude, worldLongitude]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(Simulations);\r\n","export default \"data:image/png;base64,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\"","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { ScaleLinear } from 'd3-scale';\nimport i18n from '../i18n/i18n';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport { addRange, updateRanges, updateSelectedProperty } from '../cloudProjectUtil';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport { InputNumber, Popover } from 'antd';\nimport { Range } from '../types';\n\ntype VerticalAxisProps = {\n variable: string;\n name: string;\n unit: string;\n yScale: ScaleLinear;\n tickLength: number;\n tickIntegers: boolean;\n type: string;\n digits: number;\n min: number;\n max: number;\n step: number;\n value?: number;\n};\n\nconst DEFAULT_TICK_LENGTH = 5;\n\nconst VerticalAxis = ({\n yScale,\n tickLength,\n tickIntegers,\n variable,\n name,\n unit,\n type,\n digits,\n min,\n max,\n step,\n value,\n}: VerticalAxisProps) => {\n const setCommonStore = useStore(Selector.set);\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const projectInfo = useStore(Selector.projectInfo);\n\n const [updateFlag, setUpdateFlag] = useState(false);\n const minRef = useRef(min);\n const maxRef = useRef(max);\n\n useEffect(() => {\n minRef.current = min;\n }, [min]);\n\n useEffect(() => {\n maxRef.current = max;\n }, [max]);\n\n const lang = { lng: language };\n const isOwner = user.uid === projectInfo.owner;\n const range = yScale.range();\n\n const ticks = useMemo(() => {\n const height = range[0] - range[1];\n const numberOfTicks = type === 'number' ? Math.floor(height / tickLength) : 1;\n const ticks = tickIntegers\n ? yScale.ticks(numberOfTicks).filter((tick) => Number.isInteger(tick))\n : yScale.ticks(numberOfTicks);\n return ticks.map((value) => ({\n value,\n yOffset: yScale(value),\n }));\n }, [yScale, tickLength, type, tickIntegers]);\n\n const localSelect = () => {\n setCommonStore((state) => {\n state.projectInfo.selectedProperty = state.projectInfo.selectedProperty !== variable ? variable : null;\n });\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n });\n };\n\n const select = () => {\n if (isOwner && projectInfo.owner && projectInfo.title) {\n updateSelectedProperty(\n projectInfo.owner,\n projectInfo.title,\n projectInfo.selectedProperty !== variable ? variable : null,\n ).then(() => {\n localSelect();\n });\n } else {\n localSelect();\n }\n };\n\n const createLabel = (text: string, width: number) => {\n return {text};\n };\n\n const createTitle = () => {\n return (\n \n {name}\n \n );\n };\n\n const money = useMemo(() => {\n return (\n variable === 'yearlyProfit' ||\n variable === 'unitCost' ||\n variable === 'sellingPrice' ||\n variable === 'totalYearlyCost'\n );\n }, [variable]);\n\n const getMin = () => {\n if (\n variable === 'totalYearlyCost' ||\n variable === 'totalYearlyYield' ||\n variable === 'meanYearlyYield' ||\n variable === 'unitCost' ||\n variable === 'poleHeight' ||\n variable === 'interRowSpacing'\n )\n return 0;\n if (variable === 'tiltAngle') return -90;\n if (variable === 'latitude') return -90;\n if (variable === 'rowWidth') return 1;\n return Number.MIN_SAFE_INTEGER;\n };\n\n const getMax = () => {\n if (variable === 'tiltAngle') return 90;\n if (variable === 'latitude') return 90;\n return Number.MAX_SAFE_INTEGER;\n };\n\n return (\n <>\n {/* Title */}\n {variable !== 'orientation' ? (\n \n {\n setCommonStore((state) => {\n if (state.projectInfo.ranges) {\n let index = -1;\n let range = null;\n for (const [i, r] of state.projectInfo.ranges.entries()) {\n if (r.variable === variable) {\n index = i;\n range = r;\n break;\n }\n }\n if (index >= 0 && range) {\n state.projectInfo.ranges[index] = {\n variable: range.variable,\n minimum: value,\n maximum: range.maximum,\n } as Range;\n if (user.uid && projectInfo.title) {\n updateRanges(user.uid, projectInfo.title, state.projectInfo.ranges);\n }\n } else {\n const r = { variable, minimum: value, maximum: max } as Range;\n state.projectInfo.ranges.push(r);\n if (user.uid && projectInfo.title) {\n addRange(user.uid, projectInfo.title, r);\n }\n }\n } else {\n const r = { variable, minimum: value, maximum: max } as Range;\n state.projectInfo.ranges = [r];\n if (user.uid && projectInfo.title) {\n addRange(user.uid, projectInfo.title, r);\n }\n }\n });\n minRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n
\n {\n setCommonStore((state) => {\n if (state.projectInfo.ranges) {\n let index = -1;\n let range = null;\n for (const [i, r] of state.projectInfo.ranges.entries()) {\n if (r.variable === variable) {\n index = i;\n range = r;\n break;\n }\n }\n if (index >= 0 && range) {\n state.projectInfo.ranges[index] = {\n variable: range.variable,\n minimum: range.minimum,\n maximum: value,\n } as Range;\n if (user.uid && projectInfo.title) {\n updateRanges(user.uid, projectInfo.title, state.projectInfo.ranges);\n }\n } else {\n const r = { variable, minimum: min, maximum: value } as Range;\n state.projectInfo.ranges.push(r);\n if (user.uid && projectInfo.title) {\n addRange(user.uid, projectInfo.title, r);\n }\n }\n } else {\n const r = { variable, minimum: min, maximum: value } as Range;\n state.projectInfo.ranges = [r];\n if (user.uid && projectInfo.title) {\n addRange(user.uid, projectInfo.title, r);\n }\n }\n });\n maxRef.current = value;\n setUpdateFlag(!updateFlag);\n }}\n />\n \n }\n >\n {createTitle()}\n \n ) : (\n <>{createTitle()}\n )}\n {value !== undefined && (\n \n {money\n ? value.toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n maximumFractionDigits: digits,\n }) + (variable === 'yearlyProfit' || variable === 'totalYearlyCost' ? 'K' : '')\n : (variable === 'orientation'\n ? i18n.t(value === 0 ? 'solarPanelMenu.Landscape' : 'solarPanelMenu.Portrait', lang) +\n (value === 0 ? ' (▭)' : ' (▯)')\n : value.toFixed(digits)) + (unit !== '' ? unit : '')}\n \n )}\n\n {/* Invisible vertical line for interactions */}\n \n {/* Visible vertical line */}\n \n\n {/* Ticks and labels */}\n {ticks.map(({ value, yOffset }) => (\n \n \n \n {variable === 'orientation' ? (value === 0 ? '▭' : '▯') : value}\n \n \n ))}\n \n );\n};\n\nexport default React.memo(VerticalAxis);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport * as d3Scale from 'd3-scale';\nimport * as d3Shape from 'd3-shape';\nimport { DatumEntry } from '../types';\nimport React from 'react';\nimport VerticalAxis from './verticalAxis';\n\nconst MARGIN = { top: 30, right: 55, bottom: 36, left: 55 };\n\nconst COLORS = [\n '#e0ac2b',\n '#e85252',\n '#6689c6',\n '#9a6fb0',\n '#a53253',\n '#69b3a2',\n '#556b2f',\n '#8b008b',\n '#ff1493',\n '#d2691e',\n '#2f4f4f',\n '#dc143c',\n];\n\ntype ParallelCoordinatesProps = {\n id: string;\n width: number;\n height: number;\n data: DatumEntry[];\n types: string[];\n minima: number[];\n maxima: number[];\n steps: number[];\n variables: string[];\n titles: string[];\n units: string[];\n digits: number[];\n tickIntegers: boolean[];\n hover: Function;\n hoveredIndex: number;\n selectedIndex: number;\n};\n\ntype YScale = d3Scale.ScaleLinear;\n\nconst ParallelCoordinates = ({\n id,\n width,\n height,\n data,\n types,\n minima,\n maxima,\n steps,\n variables,\n titles,\n units,\n digits,\n tickIntegers,\n hover,\n hoveredIndex,\n selectedIndex,\n}: ParallelCoordinatesProps) => {\n const boundsWidth = width - MARGIN.right - MARGIN.left;\n const boundsHeight = height - MARGIN.top - MARGIN.bottom;\n\n const allGroups = [...new Set(data.map((d) => d.group as string))];\n\n // Compute a xScale: spread all Y axis along the chart width\n const xScale = d3Scale.scalePoint().range([0, boundsWidth]).domain(variables).padding(0);\n\n // Compute the yScales: 1 scale per variable\n const yScales: { [name: string]: YScale } = {};\n variables.forEach((variable, index) => {\n yScales[variable] = d3Scale\n .scaleLinear()\n .range([boundsHeight, 0])\n .domain([minima[index] ?? 0, maxima[index] ?? 1]);\n });\n\n // Color Scale\n const colorScale = d3Scale.scaleOrdinal().domain(allGroups).range(COLORS);\n\n // Compute lines\n const lineGenerator = d3Shape.line();\n\n const allLines = data.map((series, i) => {\n if (series.invisible) return null;\n const allCoordinates = variables.map((variable) => {\n const yScale = yScales[variable];\n // I don't understand the type of scalePoint. IMO x cannot be undefined since I'm passing it something of type Variable.\n const x = xScale(variable) ?? 0;\n const y = yScale(series[variable] as number);\n return [x, y] as [number, number];\n });\n\n const d = lineGenerator(allCoordinates);\n\n if (!d) {\n return undefined;\n }\n\n return (\n {\n hover(i);\n }}\n key={i}\n d={d}\n stroke={series.hovered ? 'red' : colorScale(series.group as string)}\n fill=\"none\"\n strokeWidth={series.selected ? 3 : 1}\n strokeDasharray={series.hovered ? '5,3' : 'none'}\n />\n );\n });\n\n // Compute Axes\n const allAxes = variables.map((variable, i) => {\n const yScale = yScales[variable];\n return (\n \n = 0 && !data[hoveredIndex].invisible\n ? (data[hoveredIndex][variable] as number)\n : selectedIndex >= 0 && !data[selectedIndex].invisible\n ? (data[selectedIndex][variable] as number)\n : undefined\n }\n />\n \n );\n });\n\n return (\n {\n event.stopPropagation();\n }}\n >\n \n {allLines}\n {allAxes}\n \n \n );\n};\n\nexport default React.memo(ParallelCoordinates);\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Menu, Dropdown, Checkbox, Slider } from 'antd';\nimport { ReactComponent as MenuSVG } from '../assets/menu.svg';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport i18n from '../i18n/i18n';\n\nconst StyledMenuSVG = styled(MenuSVG)`\n position: absolute;\n top: 4px;\n right: 30px;\n height: 30px;\n width: 30px;\n transition: 0.5s;\n fill: lightblue;\n\n &:hover {\n fill: darkgray;\n }\n`;\n\nexport interface ScatteredPlotMenuProps {\n horizontalGrid: boolean;\n verticalGrid: boolean;\n symbolSize: number;\n changeHorizontalGrid?: (visible: boolean) => void;\n changeVerticalGrid?: (visible: boolean) => void;\n changeSymbolSize?: (count: number) => void;\n}\n\nconst ScatteredPlotMenu = ({\n horizontalGrid,\n verticalGrid,\n symbolSize,\n changeHorizontalGrid,\n changeVerticalGrid,\n changeSymbolSize,\n}: ScatteredPlotMenuProps) => {\n const language = useStore(Selector.language);\n const lang = { lng: language };\n\n const [visible, setVisible] = useState(false);\n\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n };\n\n const onShowHorizontalGridLines = () => {\n changeHorizontalGrid?.(!horizontalGrid);\n };\n\n const onShowVerticalGridLines = () => {\n changeVerticalGrid?.(!verticalGrid);\n };\n\n const onChangeSymbolSize = (size: number) => {\n changeSymbolSize?.(size);\n };\n\n const menu = (\n \n \n {i18n.t('menu.graph.SymbolSize', lang) + ':'}\n \n \n \n \n {i18n.t('menu.graph.ShowHorizontalGridLines', lang)}\n \n \n \n \n {i18n.t('menu.graph.ShowVerticalGridLines', lang)}\n \n \n \n );\n\n return (\n <>\n \n {\n e.stopPropagation();\n }}\n />\n \n \n );\n};\n\nexport default ScatteredPlotMenu;\n","/*\n * @Copyright 2023. Institute for Future Intelligence, Inc.\n */\n\nimport React, { FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from '../stores/common';\nimport * as Selector from '../stores/selector';\nimport styled from 'styled-components';\nimport { Button, Checkbox, Col, Collapse, Input, List, Popover, Radio, Row, Select } from 'antd';\nimport i18n from '../i18n/i18n';\nimport {\n BgColorsOutlined,\n CameraOutlined,\n CarryOutOutlined,\n CheckCircleOutlined,\n CheckCircleFilled,\n CloseOutlined,\n CloudUploadOutlined,\n DeleteOutlined,\n DotChartOutlined,\n EditFilled,\n EditOutlined,\n ImportOutlined,\n LinkOutlined,\n SettingOutlined,\n SortAscendingOutlined,\n SortDescendingOutlined,\n FolderOpenOutlined,\n} from '@ant-design/icons';\nimport { usePrimitiveStore } from '../stores/commonPrimitive';\nimport ImageLoadFailureIcon from '../assets/image_fail_try_again.png';\nimport { DataColoring, DatumEntry, Design, DesignProblem, Orientation } from '../types';\nimport ParallelCoordinates from '../components/parallelCoordinates';\n//@ts-ignore\nimport { saveSvgAsPng } from 'save-svg-as-png';\nimport { copyTextToClipboard, showInfo, showSuccess } from '../helpers';\nimport { Util } from '../Util';\nimport { ProjectUtil } from './ProjectUtil';\nimport { HOME_URL } from '../constants';\nimport {\n removeDesignFromProject,\n updateDataColoring,\n updateDescription,\n updateDesign,\n updateDesignVisibility,\n updateDotSizeScatteredPlot,\n updateHiddenParameters,\n updateThumbnailWidth,\n updateXAxisNameScatteredPlot,\n updateYAxisNameScatteredPlot,\n} from '../cloudProjectUtil';\nimport { loadCloudFile } from '../cloudFileUtil';\nimport { CartesianGrid, Dot, DotProps, Scatter, ScatterChart, Tooltip, XAxis, YAxis } from 'recharts';\nimport ScatteredPlotMenu from '../components/scatteredPlotMenu';\nimport dayjs from 'dayjs';\n\nconst { TextArea } = Input;\nconst { Option } = Select;\n\nconst Container = styled.div`\n position: relative;\n top: 0;\n left: 0;\n width: 100%;\n height: calc(100% - 30px);\n margin: 0;\n display: flex;\n justify-content: center;\n align-self: center;\n align-content: center;\n align-items: center;\n padding-bottom: 30px;\n opacity: 100%;\n user-select: none;\n tab-index: -1; // set to be not focusable\n z-index: 7; // must be less than other panels\n background: white;\n`;\n\nconst ColumnWrapper = styled.div`\n background-color: #f8f8f8;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n border: none;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n overflow-y: hidden;\n`;\n\nconst Header = styled.div`\n width: 100%;\n height: 24px;\n padding: 10px;\n background-color: #e8e8e8;\n color: #888;\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nconst SubHeader = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nconst SolutionSpaceHeader = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 6px;\n padding-bottom: 6px;\n background: white;\n`;\n\nconst SubContainer = styled.div`\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: flex-start;\n background: white;\n`;\n\nexport interface ProjectGalleryProps {\n relativeWidth: number;\n canvas: HTMLCanvasElement | null;\n}\n\nconst ProjectGallery = ({ relativeWidth, canvas }: ProjectGalleryProps) => {\n const setCommonStore = useStore(Selector.set);\n const user = useStore(Selector.user);\n const language = useStore(Selector.language);\n const cloudFile = useStore(Selector.cloudFile);\n const projectInfo = useStore(Selector.projectInfo);\n const solarPanelArrayLayoutConstraints = useStore(Selector.solarPanelArrayLayoutConstraints);\n const economicsParams = useStore(Selector.economicsParams);\n\n const [selectedDesign, setSelectedDesign] = useState();\n const [hoveredDesign, setHoveredDesign] = useState();\n const [updateFlag, setUpdateFlag] = useState(false);\n const [updateHiddenFlag, setUpdateHiddenFlag] = useState(false);\n\n const descriptionTextAreaEditableRef = useRef(false);\n const descriptionRef = useRef(projectInfo.description ?? null);\n const descriptionChangedRef = useRef(false);\n const descriptionExpandedRef = useRef(false);\n const dataColoringSelectionRef = useRef(projectInfo.dataColoring ?? DataColoring.ALL);\n const parameterSelectionChangedRef = useRef(false);\n const projectDesigns = useRef(projectInfo.designs ?? []); // store sorted designs\n const thumbnailSizeRef = useRef(projectInfo.thumbnailWidth ?? 200);\n const xAxisRef = useRef(projectInfo.xAxisNameScatteredPlot ?? 'rowWidth');\n const yAxisRef = useRef(projectInfo.yAxisNameScatteredPlot ?? 'rowWidth');\n const dotSizeRef = useRef(projectInfo.dotSizeScatteredPlot ?? 5);\n const scatterChartHorizontalLinesRef = useRef(true);\n const scatterChartVerticalLinesRef = useRef(true);\n\n useEffect(() => {\n xAxisRef.current = projectInfo.xAxisNameScatteredPlot ?? 'rowWidth';\n }, [projectInfo.xAxisNameScatteredPlot]);\n\n useEffect(() => {\n yAxisRef.current = projectInfo.yAxisNameScatteredPlot ?? 'rowWidth';\n }, [projectInfo.yAxisNameScatteredPlot]);\n\n useEffect(() => {\n dotSizeRef.current = projectInfo.dotSizeScatteredPlot ?? 5;\n }, [projectInfo.dotSizeScatteredPlot]);\n\n useEffect(() => {\n thumbnailSizeRef.current = projectInfo.thumbnailWidth ?? 200;\n }, [projectInfo.thumbnailWidth]);\n\n const lang = useMemo(() => {\n return { lng: language };\n }, [language]);\n\n const isOwner = user.uid === projectInfo.owner;\n\n useEffect(() => {\n projectDesigns.current = [];\n if (projectInfo.designs) {\n for (const design of projectInfo.designs) {\n projectDesigns.current.push(design);\n }\n const p = projectInfo.selectedProperty;\n if (p) {\n const prefix = projectInfo.sortDescending ? 1 : -1;\n projectDesigns.current.sort((a, b) => {\n if (p) {\n // first handle special cases\n if (p === 'rowWidth' && 'rowsPerRack' in a && 'rowsPerRack' in b) {\n return prefix * (a['rowsPerRack'] - b['rowsPerRack']);\n }\n if (p === 'orientation') {\n return prefix * ((a[p] === 'Landscape' ? 0 : 1) - (b[p] === 'Landscape' ? 0 : 1));\n }\n if (p === 'totalYearlyYield' && 'yearlyYield' in a && 'yearlyYield' in b) {\n return prefix * (a['yearlyYield'] - b['yearlyYield']);\n }\n if (p === 'meanYearlyYield' && 'yearlyYield' in a && 'yearlyYield' in b) {\n return prefix * (a['yearlyYield'] / a['panelCount'] - b['yearlyYield'] / b['panelCount']);\n }\n if (p === 'totalYearlyCost') {\n return prefix * (Util.calculateCost(a) - Util.calculateCost(b));\n }\n if (p === 'yearlyProfit') {\n return prefix * (Util.calculateProfit(a) - Util.calculateProfit(b));\n }\n if (p in a && p in b) {\n return prefix * (a[p] - b[p]);\n }\n return 0;\n }\n return 0;\n });\n }\n setUpdateFlag(!updateFlag);\n }\n }, [projectInfo.designs, projectInfo.sortDescending, projectInfo.selectedProperty]);\n\n useEffect(() => {\n setSelectedDesign(undefined);\n if (projectInfo.designs) {\n for (const design of projectInfo.designs) {\n if (design.title === cloudFile) {\n setSelectedDesign(design);\n break;\n }\n }\n }\n }, [cloudFile, projectInfo.designs]);\n\n useEffect(() => {\n const handleResize = () => {\n setUpdateFlag(!updateFlag);\n };\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [updateFlag]);\n\n const closeProject = () => {\n setCommonStore((state) => {\n state.projectView = false;\n state.projectInfo.title = null;\n state.projectInfo.description = null;\n state.projectInfo.owner = null;\n // clear the cached images for the previously open project\n state.projectImages.clear();\n });\n setSelectedDesign(undefined);\n usePrimitiveStore.setState((state) => {\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\n });\n };\n\n const curateCurrentDesign = () => {\n usePrimitiveStore.setState((state) => {\n state.curateDesignToProjectFlag = true;\n });\n };\n\n const removeSelectedDesign = () => {\n if (user.uid && projectInfo.title && selectedDesign) {\n removeDesignFromProject(user.uid, projectInfo.title, selectedDesign).then(() => {\n // delete the local copy as well\n setCommonStore((state) => {\n if (state.projectInfo.designs) {\n let index = -1;\n for (const [i, e] of state.projectInfo.designs.entries()) {\n if (e.title === selectedDesign.title) {\n index = i;\n break;\n }\n }\n if (index >= 0) {\n state.projectInfo.designs.splice(index, 1);\n }\n }\n });\n });\n }\n };\n\n const totalHeight = window.innerHeight;\n const imageColumns = Math.round(800 / thumbnailSizeRef.current);\n const imageGap = 48 / imageColumns;\n const imageWidth = Math.round((relativeWidth * window.innerWidth) / imageColumns - imageGap);\n\n const [variables, titles, units, digits, tickIntegers, types] = useMemo(\n () => [\n ProjectUtil.getVariables(projectInfo.type, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getTitles(projectInfo.type, lang, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getUnits(projectInfo.type, lang, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getDigits(projectInfo.type, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getTickIntegers(projectInfo.type, projectInfo.hiddenParameters ?? []),\n ProjectUtil.getTypes(projectInfo.type, projectInfo.hiddenParameters ?? []),\n ],\n [projectInfo.type, projectInfo.hiddenParameters, updateHiddenFlag, lang],\n );\n\n const data: DatumEntry[] = useMemo(() => {\n const data: DatumEntry[] = [];\n if (projectInfo.designs) {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY) {\n for (const design of projectInfo.designs) {\n const d = {} as DatumEntry;\n if (!projectInfo.hiddenParameters?.includes('rowWidth')) d['rowWidth'] = design.rowsPerRack;\n if (!projectInfo.hiddenParameters?.includes('tiltAngle')) d['tiltAngle'] = Util.toDegrees(design.tiltAngle);\n if (!projectInfo.hiddenParameters?.includes('interRowSpacing')) d['interRowSpacing'] = design.interRowSpacing;\n if (!projectInfo.hiddenParameters?.includes('latitude')) d['latitude'] = design.latitude ?? 42;\n if (!projectInfo.hiddenParameters?.includes('orientation'))\n d['orientation'] = design.orientation === Orientation.landscape ? 0 : 1;\n if (!projectInfo.hiddenParameters?.includes('poleHeight')) d['poleHeight'] = design.poleHeight;\n if (!projectInfo.hiddenParameters?.includes('unitCost')) d['unitCost'] = design.unitCost;\n if (!projectInfo.hiddenParameters?.includes('sellingPrice')) d['sellingPrice'] = design.sellingPrice;\n if (!projectInfo.hiddenParameters?.includes('')) d['totalYearlyCost'] = Util.calculateCost(design);\n if (!projectInfo.hiddenParameters?.includes('totalYearlyYield'))\n d['totalYearlyYield'] = design.yearlyYield * 0.001;\n if (!projectInfo.hiddenParameters?.includes('meanYearlyYield'))\n d['meanYearlyYield'] = design.yearlyYield / design.panelCount;\n if (!projectInfo.hiddenParameters?.includes('yearlyProfit')) d['yearlyProfit'] = Util.calculateProfit(design);\n d['group'] = projectInfo.dataColoring === DataColoring.INDIVIDUALS ? design.title : 'default';\n d['selected'] = selectedDesign === design;\n d['hovered'] = hoveredDesign === design;\n d['invisible'] = design.invisible;\n data.push(d);\n }\n }\n }\n return data;\n }, [\n projectInfo.designs,\n projectInfo.type,\n hoveredDesign,\n selectedDesign,\n economicsParams,\n projectInfo.hiddenParameters,\n projectInfo.dataColoring,\n updateHiddenFlag,\n ]);\n\n const getMin = (variable: string, defaultValue: number) => {\n let min = defaultValue;\n if (projectInfo.ranges) {\n for (const r of projectInfo.ranges) {\n if (r.variable === variable) {\n min = r.minimum ?? defaultValue;\n break;\n }\n }\n }\n return min;\n };\n\n const getMax = (variable: string, defaultValue: number) => {\n let max = defaultValue;\n if (projectInfo.ranges) {\n for (const r of projectInfo.ranges) {\n if (r.variable === variable) {\n max = r.maximum ?? defaultValue;\n break;\n }\n }\n }\n return max;\n };\n\n const minima: number[] = useMemo(() => {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && solarPanelArrayLayoutConstraints) {\n const array: number[] = [];\n if (!projectInfo.hiddenParameters?.includes('rowWidth'))\n array.push(getMin('rowWidth', solarPanelArrayLayoutConstraints.minimumRowsPerRack));\n if (!projectInfo.hiddenParameters?.includes('tiltAngle'))\n array.push(getMin('tiltAngle', Util.toDegrees(solarPanelArrayLayoutConstraints.minimumTiltAngle)));\n if (!projectInfo.hiddenParameters?.includes('interRowSpacing'))\n array.push(getMin('interRowSpacing', solarPanelArrayLayoutConstraints.minimumInterRowSpacing));\n if (!projectInfo.hiddenParameters?.includes('latitude')) array.push(getMin('latitude', -90));\n if (!projectInfo.hiddenParameters?.includes('orientation')) array.push(0);\n if (!projectInfo.hiddenParameters?.includes('poleHeight')) array.push(getMin('poleHeight', 0));\n if (!projectInfo.hiddenParameters?.includes('unitCost')) array.push(getMin('unitCost', 0.1));\n if (!projectInfo.hiddenParameters?.includes('sellingPrice')) array.push(getMin('sellingPrice', 0.1));\n if (!projectInfo.hiddenParameters?.includes('totalYearlyCost')) array.push(getMin('totalYearlyCost', 0));\n if (!projectInfo.hiddenParameters?.includes('totalYearlyYield')) array.push(getMin('totalYearlyYield', 0)); // electricity output in MWh\n if (!projectInfo.hiddenParameters?.includes('meanYearlyYield')) array.push(getMin('meanYearlyYield', 0)); // electricity output in kWh\n if (!projectInfo.hiddenParameters?.includes('yearlyProfit')) array.push(getMin('yearlyProfit', -10)); // profit in $1,000\n return array;\n }\n return [];\n }, [\n solarPanelArrayLayoutConstraints,\n projectInfo.type,\n projectInfo.ranges,\n projectInfo.hiddenParameters,\n updateHiddenFlag,\n ]);\n\n const maxima: number[] = useMemo(() => {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && solarPanelArrayLayoutConstraints) {\n const array: number[] = [];\n if (!projectInfo.hiddenParameters?.includes('rowWidth'))\n array.push(getMax('rowWidth', solarPanelArrayLayoutConstraints.maximumRowsPerRack));\n if (!projectInfo.hiddenParameters?.includes('tiltAngle'))\n array.push(getMax('tiltAngle', Util.toDegrees(solarPanelArrayLayoutConstraints.maximumTiltAngle)));\n if (!projectInfo.hiddenParameters?.includes('interRowSpacing'))\n array.push(getMax('interRowSpacing', solarPanelArrayLayoutConstraints.maximumInterRowSpacing));\n if (!projectInfo.hiddenParameters?.includes('latitude')) array.push(getMax('latitude', 90));\n if (!projectInfo.hiddenParameters?.includes('orientation')) array.push(1);\n if (!projectInfo.hiddenParameters?.includes('poleHeight')) array.push(getMax('poleHeight', 5));\n if (!projectInfo.hiddenParameters?.includes('unitCost')) array.push(getMax('unitCost', 1));\n if (!projectInfo.hiddenParameters?.includes('sellingPrice')) array.push(getMax('sellingPrice', 0.5));\n if (!projectInfo.hiddenParameters?.includes('totalYearlyCost')) array.push(getMax('totalYearlyCost', 100));\n if (!projectInfo.hiddenParameters?.includes('totalYearlyYield')) array.push(getMax('totalYearlyYield', 100)); // electricity output in MWh\n if (!projectInfo.hiddenParameters?.includes('meanYearlyYield')) array.push(getMax('meanYearlyYield', 1000)); // electricity output in kWh\n if (!projectInfo.hiddenParameters?.includes('yearlyProfit')) array.push(getMax('yearlyProfit', 10)); // profit in $1,000\n return array;\n }\n return [];\n }, [\n solarPanelArrayLayoutConstraints,\n projectInfo.type,\n projectInfo.ranges,\n projectInfo.hiddenParameters,\n updateHiddenFlag,\n ]);\n\n const steps: number[] = useMemo(() => {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && solarPanelArrayLayoutConstraints) {\n const array: number[] = [];\n if (!projectInfo.hiddenParameters?.includes('rowWidth')) array.push(1);\n if (!projectInfo.hiddenParameters?.includes('tiltAngle')) array.push(0.1);\n if (!projectInfo.hiddenParameters?.includes('interRowSpacing')) array.push(0.1);\n if (!projectInfo.hiddenParameters?.includes('latitude')) array.push(0.1);\n if (!projectInfo.hiddenParameters?.includes('orientation')) array.push(1);\n if (!projectInfo.hiddenParameters?.includes('poleHeight')) array.push(0.1);\n if (!projectInfo.hiddenParameters?.includes('unitCost')) array.push(0.01);\n if (!projectInfo.hiddenParameters?.includes('sellingPrice')) array.push(0.01);\n if (!projectInfo.hiddenParameters?.includes('totalYearlyCost')) array.push(0.1); // cost in $1,000\n if (!projectInfo.hiddenParameters?.includes('totalYearlyYield')) array.push(1); // electricity output in MWh\n if (!projectInfo.hiddenParameters?.includes('meanYearlyYield')) array.push(1); // electricity output in kWh\n if (!projectInfo.hiddenParameters?.includes('yearlyProfit')) array.push(0.1); // profit in $1,000\n return array;\n }\n return [];\n }, [projectInfo.type, projectInfo.hiddenParameters, updateHiddenFlag]);\n\n const rowWidthSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('rowWidth'));\n const tiltAngleSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('tiltAngle'));\n const rowSpacingSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('interRowSpacing'));\n const latitudeSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('latitude'));\n const orientationSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('orientation'));\n const poleHeightSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('poleHeight'));\n const unitCostSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('unitCost'));\n const sellingPriceSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('sellingPrice'));\n const costSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('totalYearlyCost'));\n const totalYieldSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('totalYearlyYield'));\n const meanYieldSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('meanYearlyYield'));\n const profitSelectionRef = useRef(!projectInfo.hiddenParameters?.includes('yearlyProfit'));\n\n useEffect(() => {\n rowWidthSelectionRef.current = !projectInfo.hiddenParameters?.includes('rowWidth');\n tiltAngleSelectionRef.current = !projectInfo.hiddenParameters?.includes('tiltAngle');\n rowSpacingSelectionRef.current = !projectInfo.hiddenParameters?.includes('interRowSpacing');\n latitudeSelectionRef.current = !projectInfo.hiddenParameters?.includes('latitude');\n orientationSelectionRef.current = !projectInfo.hiddenParameters?.includes('orientation');\n poleHeightSelectionRef.current = !projectInfo.hiddenParameters?.includes('poleHeight');\n unitCostSelectionRef.current = !projectInfo.hiddenParameters?.includes('unitCost');\n sellingPriceSelectionRef.current = !projectInfo.hiddenParameters?.includes('sellingPrice');\n costSelectionRef.current = !projectInfo.hiddenParameters?.includes('totalYearlyCost');\n totalYieldSelectionRef.current = !projectInfo.hiddenParameters?.includes('totalYearlyYield');\n meanYieldSelectionRef.current = !projectInfo.hiddenParameters?.includes('meanYearlyYield');\n profitSelectionRef.current = !projectInfo.hiddenParameters?.includes('yearlyProfit');\n setUpdateFlag(!updateFlag);\n }, [projectInfo.hiddenParameters]);\n\n useEffect(() => {\n descriptionRef.current = projectInfo.description;\n }, [projectInfo.description]);\n\n const hover = (i: number) => {\n if (projectInfo.designs) {\n if (i >= 0 && i < projectInfo.designs.length) {\n setHoveredDesign(projectInfo.designs[i]);\n }\n }\n };\n\n const localToggleDesignVisibility = (title: string) => {\n setCommonStore((state) => {\n if (state.projectInfo.designs) {\n for (const d of state.projectInfo.designs) {\n if (d.title === title) {\n d.invisible = !d.invisible;\n break;\n }\n }\n }\n });\n };\n\n const toggleDesignVisibility = (design: Design) => {\n localToggleDesignVisibility(design.title);\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateDesignVisibility(user.uid, projectInfo.title, design);\n }\n }\n };\n\n const localSelectParameter = (selected: boolean, parameter: string) => {\n setCommonStore((state) => {\n if (state.projectInfo.hiddenParameters) {\n if (selected) {\n if (state.projectInfo.hiddenParameters.includes(parameter)) {\n state.projectInfo.hiddenParameters.splice(state.projectInfo.hiddenParameters.indexOf(parameter), 1);\n }\n } else {\n if (!state.projectInfo.hiddenParameters.includes(parameter)) {\n state.projectInfo.hiddenParameters.push(parameter);\n }\n }\n }\n });\n };\n\n const selectParameter = (selected: boolean, parameter: string) => {\n parameterSelectionChangedRef.current = true;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateHiddenParameters(user.uid, projectInfo.title, parameter, !selected).then(() => {\n localSelectParameter(selected, parameter);\n });\n }\n } else {\n localSelectParameter(selected, parameter);\n }\n };\n\n const localSelectDataColoring = () => {\n setCommonStore((state) => {\n state.projectInfo.dataColoring = dataColoringSelectionRef.current;\n });\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n });\n setUpdateFlag(!updateFlag);\n };\n\n const selectDataColoring = (value: DataColoring) => {\n dataColoringSelectionRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateDataColoring(user.uid, projectInfo.title, dataColoringSelectionRef.current).then(() => {\n localSelectDataColoring();\n });\n }\n } else {\n localSelectDataColoring();\n }\n };\n\n const createChooseSolutionSolutionContent = () => {\n return (\n
\n {\n rowWidthSelectionRef.current = e.target.checked;\n selectParameter(rowWidthSelectionRef.current, 'rowWidth');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={rowWidthSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayRowWidth', lang)}\n \n
\n {\n tiltAngleSelectionRef.current = e.target.checked;\n selectParameter(tiltAngleSelectionRef.current, 'tiltAngle');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={tiltAngleSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayTiltAngle', lang)}\n \n
\n {\n rowSpacingSelectionRef.current = e.target.checked;\n selectParameter(rowSpacingSelectionRef.current, 'interRowSpacing');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={rowSpacingSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayRowSpacing', lang)}\n \n
\n {\n latitudeSelectionRef.current = e.target.checked;\n selectParameter(latitudeSelectionRef.current, 'latitude');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={latitudeSelectionRef.current}\n >\n {i18n.t('word.Latitude', lang)}\n \n
\n {\n orientationSelectionRef.current = e.target.checked;\n selectParameter(orientationSelectionRef.current, 'orientation');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={orientationSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayOrientation', lang)}\n \n
\n {\n poleHeightSelectionRef.current = e.target.checked;\n selectParameter(poleHeightSelectionRef.current, 'poleHeight');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={poleHeightSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayPoleHeight', lang)}\n \n
\n {\n unitCostSelectionRef.current = e.target.checked;\n selectParameter(unitCostSelectionRef.current, 'unitCost');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={unitCostSelectionRef.current}\n >\n {i18n.t('economicsPanel.UnitCost', lang)}\n \n
\n {\n sellingPriceSelectionRef.current = e.target.checked;\n selectParameter(sellingPriceSelectionRef.current, 'sellingPrice');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={sellingPriceSelectionRef.current}\n >\n {i18n.t('economicsPanel.SellingPrice', lang)}\n \n
\n {\n costSelectionRef.current = e.target.checked;\n selectParameter(costSelectionRef.current, 'totalYearlyCost');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={costSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayTotalYearlyCost', lang)}\n \n
\n {\n totalYieldSelectionRef.current = e.target.checked;\n selectParameter(totalYieldSelectionRef.current, 'totalYearlyYield');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={totalYieldSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayTotalYearlyYield', lang)}\n \n
\n {\n meanYieldSelectionRef.current = e.target.checked;\n selectParameter(meanYieldSelectionRef.current, 'meanYearlyYield');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={meanYieldSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayMeanYearlyYield', lang)}\n \n
\n {\n profitSelectionRef.current = e.target.checked;\n selectParameter(profitSelectionRef.current, 'yearlyProfit');\n setUpdateHiddenFlag(!updateHiddenFlag);\n }}\n checked={profitSelectionRef.current}\n >\n {i18n.t('polygonMenu.SolarPanelArrayYearlyProfit', lang)}\n \n
\n );\n };\n\n const createAxisOptions = () => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n };\n\n const scatterData = useMemo(() => {\n const data: { x: number; y: number }[] = [];\n if (projectInfo.designs) {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY) {\n for (const design of projectInfo.designs) {\n if (design.invisible || design === selectedDesign) continue;\n const d = {} as { x: number; y: number };\n ProjectUtil.setScatterData(xAxisRef.current, 'x', d, design);\n ProjectUtil.setScatterData(yAxisRef.current, 'y', d, design);\n data.push(d);\n }\n }\n }\n return data;\n }, [xAxisRef.current, yAxisRef.current, projectInfo.designs, projectInfo.type, selectedDesign]);\n\n const selectedData = useMemo(() => {\n const data: { x: number; y: number }[] = [];\n if (projectInfo.designs) {\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY) {\n for (const design of projectInfo.designs) {\n if (design !== selectedDesign) continue;\n const d = {} as { x: number; y: number };\n ProjectUtil.setScatterData(xAxisRef.current, 'x', d, design);\n ProjectUtil.setScatterData(yAxisRef.current, 'y', d, design);\n data.push(d);\n }\n }\n }\n return data;\n }, [xAxisRef.current, yAxisRef.current, projectInfo.designs, projectInfo.type, selectedDesign]);\n\n const getBound = (axisName: string) => {\n const bound: { min: number; max: number } = { min: 0, max: 1 };\n if (projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && solarPanelArrayLayoutConstraints) {\n switch (axisName) {\n case 'rowWidth':\n bound.min = getMin('rowWidth', solarPanelArrayLayoutConstraints.minimumRowsPerRack);\n bound.max = getMax('rowWidth', solarPanelArrayLayoutConstraints.maximumRowsPerRack);\n break;\n case 'tiltAngle':\n bound.min = getMin('tiltAngle', Util.toDegrees(solarPanelArrayLayoutConstraints.minimumTiltAngle));\n bound.max = getMax('tiltAngle', Util.toDegrees(solarPanelArrayLayoutConstraints.maximumTiltAngle));\n break;\n case 'interRowSpacing':\n bound.min = getMin('interRowSpacing', solarPanelArrayLayoutConstraints.minimumInterRowSpacing);\n bound.max = getMax('interRowSpacing', solarPanelArrayLayoutConstraints.maximumInterRowSpacing);\n break;\n case 'latitude':\n bound.min = getMin('latitude', -90);\n bound.max = getMax('latitude', 90);\n break;\n case 'orientation':\n bound.min = 0;\n bound.max = 1;\n break;\n case 'poleHeight':\n bound.min = getMin('poleHeight', 0);\n bound.max = getMax('poleHeight', 5);\n break;\n case 'unitCost':\n bound.min = getMin('unitCost', 0.1);\n bound.max = getMax('unitCost', 1);\n break;\n case 'sellingPrice':\n bound.min = getMin('sellingPrice', 0.1);\n bound.max = getMax('sellingPrice', 0.5);\n break;\n case 'totalYearlyCost':\n bound.min = getMin('totalYearlyCost', 0);\n bound.max = getMax('totalYearlyCost', 100);\n break;\n case 'totalYearlyYield':\n bound.min = getMin('totalYearlyYield', 0);\n bound.max = getMax('totalYearlyYield', 100);\n break;\n case 'meanYearlyYield':\n bound.min = getMin('meanYearlyYield', 0);\n bound.max = getMax('meanYearlyYield', 1000);\n break;\n case 'yearlyProfit':\n bound.min = getMin('yearlyProfit', -10);\n bound.max = getMax('yearlyProfit', 10);\n break;\n }\n }\n return bound;\n };\n\n const xMinMax = useMemo(() => {\n return getBound(xAxisRef.current);\n }, [xAxisRef.current, projectInfo.ranges]);\n\n const yMinMax = useMemo(() => {\n return getBound(yAxisRef.current);\n }, [yAxisRef.current, projectInfo.ranges]);\n\n const xUnit = useMemo(() => {\n return ProjectUtil.getUnit(xAxisRef.current, lang);\n }, [xAxisRef.current, lang]);\n\n const yUnit = useMemo(() => {\n return ProjectUtil.getUnit(yAxisRef.current, lang);\n }, [yAxisRef.current, lang]);\n\n const RenderDot: FC = ({ cx, cy }) => {\n return ;\n };\n\n const createScatteredPlotContent = () => {\n return (\n
\n \n \n {i18n.t('projectPanel.SelectXAxis', lang)}: \n \n \n {\n xAxisRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateXAxisNameScatteredPlot(user.uid, projectInfo.title, value).then(() => {\n //ignore\n });\n }\n }\n setUpdateFlag(!updateFlag);\n }}\n >\n {createAxisOptions()}\n \n \n \n \n \n {i18n.t('projectPanel.SelectYAxis', lang)}: \n \n \n {\n yAxisRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateYAxisNameScatteredPlot(user.uid, projectInfo.title, value).then(() => {\n //ignore\n });\n }\n }\n setUpdateFlag(!updateFlag);\n }}\n >\n {createAxisOptions()}\n \n \n \n \n
\n \n \n {\n if (\n xAxisRef.current === 'yearlyProfit' ||\n xAxisRef.current === 'unitCost' ||\n xAxisRef.current === 'sellingPrice'\n )\n return '$' + value;\n return value;\n }}\n />\n {\n if (\n yAxisRef.current === 'yearlyProfit' ||\n yAxisRef.current === 'unitCost' ||\n yAxisRef.current === 'sellingPrice'\n )\n return '$' + value;\n return value;\n }}\n />\n value.toFixed(2)} />\n } />\n {selectedDesign && }\n \n {\n scatterChartHorizontalLinesRef.current = checked;\n setUpdateFlag(!updateFlag);\n }}\n changeVerticalGrid={(checked) => {\n scatterChartVerticalLinesRef.current = checked;\n setUpdateFlag(!updateFlag);\n }}\n changeSymbolSize={(value) => {\n dotSizeRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateDotSizeScatteredPlot(user.uid, projectInfo.title, value).then(() => {\n //ignore\n });\n }\n }\n setUpdateFlag(!updateFlag);\n }}\n />\n
\n
\n \n \n {\n const d = document.getElementById('scattered-chart');\n if (d) {\n saveSvgAsPng(d, 'scattered-chart-' + projectInfo.title + '.png').then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n });\n }\n }}\n />\n \n \n
\n );\n };\n\n const createChooseDataColoringContent = () => {\n return (\n
\n {\n selectDataColoring(e.target.value);\n }}\n value={projectInfo.dataColoring ?? DataColoring.ALL}\n >\n \n {i18n.t('projectPanel.SameColorForAllDesigns', lang)}\n \n
\n \n {i18n.t('projectPanel.OneColorForEachDesign', lang)}\n \n \n
\n );\n };\n\n const createProjectSettingsContent = () => {\n return (\n
e.stopPropagation()}>\n \n \n {i18n.t('projectPanel.ThumbnailImageSize', lang)}: \n \n \n {\n thumbnailSizeRef.current = value;\n if (isOwner) {\n if (user.uid && projectInfo.title) {\n updateThumbnailWidth(user.uid, projectInfo.title, value).then(() => {\n setCommonStore((state) => {\n state.projectInfo.thumbnailWidth = thumbnailSizeRef.current;\n });\n });\n }\n } else {\n setCommonStore((state) => {\n state.projectInfo.thumbnailWidth = thumbnailSizeRef.current;\n });\n }\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n \n \n \n \n
\n );\n };\n\n return (\n {\n e.stopPropagation();\n }}\n >\n \n
\n \n {(isOwner ? i18n.t('projectPanel.Project', lang) : i18n.t('projectPanel.ProjectByOtherPeople', lang)) +\n ': ' +\n projectInfo.title +\n (isOwner ? '' : ' (' + i18n.t('word.Owner', lang) + ': ' + projectInfo.owner?.substring(0, 4) + '***)') +\n ' (' +\n projectDesigns.current.length +\n ')'}\n \n {\n closeProject();\n }}\n onTouchStart={() => {\n closeProject();\n }}\n >\n \n \n
\n {\n descriptionExpandedRef.current = e.length > 0;\n setUpdateFlag(!updateFlag);\n }}\n >\n \n \n {i18n.t('projectPanel.ProjectDescription', lang) +\n ' | ' +\n i18n.t('projectPanel.ProjectType', lang) +\n ': ' +\n projectInfo.type}\n \n \n {isOwner && (\n <>\n {descriptionExpandedRef.current && (\n {\n e.stopPropagation();\n descriptionTextAreaEditableRef.current = !descriptionTextAreaEditableRef.current;\n setUpdateFlag(!updateFlag);\n }}\n >\n {descriptionTextAreaEditableRef.current ? (\n \n ) : (\n \n )}\n \n )}\n {\n e.stopPropagation();\n curateCurrentDesign();\n }}\n >\n \n \n {selectedDesign && selectedDesign.title === cloudFile && (\n {\n e.stopPropagation();\n if (canvas && user.uid && projectInfo.title && cloudFile) {\n updateDesign(\n user.uid,\n projectInfo.type,\n projectInfo.title,\n projectInfo.thumbnailWidth ?? 200,\n cloudFile,\n canvas,\n ).then(() => {\n setUpdateFlag(!updateFlag);\n });\n }\n }}\n >\n \n \n )}\n {selectedDesign && (\n {\n e.stopPropagation();\n removeSelectedDesign();\n setSelectedDesign(undefined);\n }}\n >\n \n \n )}\n {selectedDesign && (\n {\n e.stopPropagation();\n if (projectInfo.title) {\n let url =\n HOME_URL +\n '?client=web&userid=' +\n user.uid +\n '&project=' +\n encodeURIComponent(projectInfo.title);\n if (selectedDesign) {\n url += '&title=' + encodeURIComponent(selectedDesign.title);\n }\n copyTextToClipboard(url);\n showSuccess(i18n.t('projectListPanel.ProjectLinkGeneratedInClipBoard', lang) + '.');\n }\n }}\n >\n \n \n )}\n \n )}\n {projectInfo.designs && projectInfo.designs.length > 1 && projectInfo.selectedProperty && (\n {\n e.stopPropagation();\n setCommonStore((state) => {\n state.projectInfo.sortDescending = !state.projectInfo.sortDescending;\n });\n }}\n >\n {projectInfo.sortDescending ? (\n \n ) : (\n \n )}\n \n )}\n e.stopPropagation()}>{i18n.t('projectPanel.ProjectSettings', lang)}\n }\n content={createProjectSettingsContent}\n >\n \n \n \n \n }\n >\n {\n descriptionTextAreaEditableRef.current = !descriptionTextAreaEditableRef.current;\n setUpdateFlag(!updateFlag);\n }}\n onChange={(e) => {\n descriptionRef.current = e.target.value;\n descriptionChangedRef.current = true;\n setCommonStore((state) => {\n state.projectInfo.description = e.target.value;\n });\n setUpdateFlag(!updateFlag);\n }}\n onBlur={() => {\n descriptionTextAreaEditableRef.current = false;\n if (descriptionChangedRef.current) {\n if (user.uid && isOwner && projectInfo.title) {\n updateDescription(user.uid, projectInfo.title, descriptionRef.current).then(() => {\n descriptionChangedRef.current = false;\n setUpdateFlag(!updateFlag);\n });\n }\n }\n }}\n style={{\n paddingLeft: '10px',\n textAlign: 'left',\n resize: descriptionTextAreaEditableRef.current ? 'vertical' : 'none',\n }}\n />\n \n \n {projectDesigns.current.length > 0 && (\n \n {\n const lastSpaceIndex = design.title.lastIndexOf(' ');\n const labelDisplayLength =\n projectInfo.thumbnailWidth === 100 ? 8 : projectInfo.thumbnailWidth === 125 ? 12 : 30;\n return (\n {\n setHoveredDesign(design);\n }}\n onMouseLeave={() => {\n setHoveredDesign(undefined);\n }}\n >\n {\n (event.target as HTMLImageElement).src = ImageLoadFailureIcon;\n }}\n onLoad={(event) => {\n setCommonStore((state) => {\n state.projectImages.set(design.title, event.target as HTMLImageElement);\n });\n usePrimitiveStore.setState((state) => {\n state.projectImagesUpdateFlag = !state.projectImagesUpdateFlag;\n });\n }}\n alt={design.title}\n title={\n (design.timestamp\n ? i18n.t('word.LastUpdate', lang) +\n ': ' +\n dayjs(new Date(design.timestamp)).format('MM-DD-YYYY hh:mm A') +\n '\\n'\n : '') +\n (selectedDesign === design\n ? i18n.t('projectPanel.SingleClickToDeselectDoubleClickToOpen', lang)\n : i18n.t('projectPanel.SingleClickToSelectDoubleClickToOpen', lang))\n }\n src={\n design.thumbnail?.startsWith('data:image/png;base64') ? design.thumbnail : ImageLoadFailureIcon\n }\n style={{\n transition: '.5s ease',\n opacity: hoveredDesign === design ? 0.5 : 1,\n padding: '1px',\n cursor: 'pointer',\n borderRadius: selectedDesign === design ? '0' : '10px',\n border: selectedDesign === design ? '2px solid red' : 'none',\n }}\n onDoubleClick={(event) => {\n const target = event.target as HTMLImageElement;\n if (target.src === ImageLoadFailureIcon) {\n target.src = design.thumbnailUrl;\n }\n setSelectedDesign(design);\n if (projectInfo.owner) {\n loadCloudFile(projectInfo.owner, design.title, true, true).then(() => {\n // ignore\n });\n }\n }}\n onClick={(event) => {\n const target = event.target as HTMLImageElement;\n if (target.src === ImageLoadFailureIcon) {\n target.src = design.thumbnailUrl;\n }\n setSelectedDesign(design !== selectedDesign ? design : undefined);\n }}\n />\n \n {design.title\n ? design.title.length > labelDisplayLength\n ? design.title.substring(0, Math.min(labelDisplayLength, lastSpaceIndex)) +\n '...' +\n design.title.substring(lastSpaceIndex)\n : design.title\n : 'Unknown'}\n \n \n {design.title === cloudFile && (\n \n )}\n {design.invisible ? (\n {\n toggleDesignVisibility(design);\n }}\n style={{ fontSize: '16px' }}\n title={i18n.t('projectPanel.DesignNotShownInSolutionSpaceClickToShow', lang)}\n />\n ) : (\n {\n toggleDesignVisibility(design);\n }}\n style={{ fontSize: '16px' }}\n title={i18n.t('projectPanel.DesignShownInSolutionSpaceClickToHide', lang)}\n />\n )}\n \n \n );\n }}\n />\n \n {i18n.t('projectPanel.DistributionInSolutionSpace', lang)}\n \n {projectInfo.type === DesignProblem.SOLAR_PANEL_ARRAY && (\n {\n if (parameterSelectionChangedRef.current) {\n if (!visible) {\n usePrimitiveStore.setState((state) => {\n state.updateProjectsFlag = true;\n });\n }\n parameterSelectionChangedRef.current = false;\n }\n }}\n content={createChooseSolutionSolutionContent()}\n >\n \n \n )}\n \n \n \n \n \n \n {\n const d = document.getElementById('design-space');\n if (d) {\n saveSvgAsPng(d, 'design-space-' + projectInfo.title + '.png').then(() => {\n showInfo(i18n.t('message.ScreenshotSaved', lang));\n });\n }\n }}\n >\n \n \n \n \n \n \n )}\n
\n \n );\n};\n\nexport default React.memo(ProjectGallery);\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n *\r\n * @author Charles Xie, Xiaotong Ding\r\n */\r\n\r\nimport React, { Suspense, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport { Canvas } from '@react-three/fiber';\r\nimport Sky from './views/sky';\r\nimport Axes from './views/axes';\r\nimport ElementsRenderer from './elementsRenderer';\r\nimport Ground from './views/ground';\r\nimport Heliodon from './views/heliodonWrapper';\r\nimport ifiLogo from './assets/ifi-logo.png';\r\nimport MainMenu from './mainMenu';\r\nimport { DEFAULT_FAR, DEFAULT_FOV, VERSION } from './constants';\r\nimport { visitHomepage, visitIFI } from './helpers';\r\nimport AcceptCookie from './acceptCookie';\r\nimport GroundImage from './views/groundImage';\r\nimport DropdownContextMenu from './components/contextMenu';\r\nimport { DesignProblem, EvolutionMethod } from './types';\r\nimport CloudManager from './cloudManager';\r\nimport ActionLogger from './actionLogger';\r\nimport Lights from './lights';\r\nimport { Auxiliary } from './auxiliary';\r\nimport Compass from './compassContainer';\r\nimport i18n from './i18n/i18n';\r\nimport KeyboardListener from './keyboardListener';\r\nimport CloudImage from './assets/cloud.png';\r\nimport SceneRadiusCalculator from './sceneRadiusCalculator';\r\nimport { UndoableChange } from './undo/UndoableChange';\r\nimport CameraController from './cameraController';\r\nimport { useRefStore } from './stores/commonRef';\r\nimport { UndoableCameraChange } from './undo/UndoableCameraChange';\r\nimport ShareLink from './shareLinks';\r\nimport SolarPanelTiltAngleGa from './ai/ga/solarPanelTiltAngleGa';\r\nimport SolarPanelArrayGa from './ai/ga/solarPanelArrayGa';\r\nimport SolarPanelTiltAnglePso from './ai/pso/solarPanelTiltAnglePso';\r\nimport SolarPanelArrayPso from './ai/pso/solarPanelArrayPso';\r\nimport NavigationController from './navigationController';\r\nimport Waiting from './waiting';\r\nimport Panels from './panels';\r\nimport Simulations from './simulations';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\nimport { Button } from 'antd';\r\nimport ProjectGallery from './panels/projectGallery';\r\nimport SplitPane from 'react-split-pane';\r\nimport { throttle } from 'lodash';\r\nimport GroupMasterWrapper from './components/groupMaster';\r\n\r\nexport interface AppCreatorProps {\r\n viewOnly: boolean;\r\n}\r\n\r\nconst AppCreator = ({ viewOnly = false }: AppCreatorProps) => {\r\n const user = useStore(Selector.user);\r\n const loggable = useStore(Selector.loggable);\r\n const setCommonStore = useStore(Selector.set);\r\n const language = useStore(Selector.language);\r\n const changed = usePrimitiveStore(Selector.changed);\r\n const addUndoable = useStore(Selector.addUndoable);\r\n const orthographic = useStore(Selector.viewState.orthographic) ?? false;\r\n const navigation = useStore(Selector.viewState.navigationView) ?? false;\r\n const cloudFile = useStore(Selector.cloudFile);\r\n const projectView = useStore(Selector.projectView);\r\n const axes = useStore(Selector.viewState.axes);\r\n const theme = useStore(Selector.viewState.theme);\r\n const groundImage = useStore(Selector.viewState.groundImage);\r\n const groundImageType = useStore(Selector.viewState.groundImageType) ?? 'roadmap';\r\n const openModelsMap = usePrimitiveStore(Selector.openModelsMap);\r\n const evolutionMethod = useStore(Selector.evolutionMethod);\r\n const evolutionaryAlgorithmState = useStore(Selector.evolutionaryAlgorithmState);\r\n\r\n const [initializing, setInitializing] = useState(true);\r\n const [canvasRelativeWidth, setCanvasRelativeWidth] = useState(50);\r\n\r\n const canvasRef = useRef(null);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n useEffect(() => {\r\n setInitializing(false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n setCommonStore((state) => {\r\n // state.loggable = false; // temporarily disabled\r\n state.loggable = user && user.uid ? !user.email?.endsWith('@intofuture.org') : false;\r\n if (\r\n user &&\r\n (user.noLogging ||\r\n !user.schoolID ||\r\n user.schoolID === 'UNKNOWN SCHOOL' ||\r\n !user.classID ||\r\n user.classID === 'UNKNOWN CLASS')\r\n ) {\r\n state.loggable = false;\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [user]);\r\n\r\n const zoomView = (scale: number) => {\r\n if (orthographic) {\r\n // Previously, we declared this in the header: const cameraZoom = useStore(Selector.viewState.cameraZoom) ?? 20;\r\n // But it causes the app to be re-rendered every time zoom is called.\r\n const cameraZoom = useStore.getState().viewState.cameraZoom ?? 20;\r\n const oldZoom = cameraZoom;\r\n const newZoom = cameraZoom / scale;\r\n const undoableChange = {\r\n name: 'Zoom',\r\n timestamp: Date.now(),\r\n oldValue: oldZoom,\r\n newValue: newZoom,\r\n undo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.cameraZoom = undoableChange.oldValue as number;\r\n });\r\n },\r\n redo: () => {\r\n setCommonStore((state) => {\r\n state.viewState.cameraZoom = undoableChange.newValue as number;\r\n });\r\n },\r\n } as UndoableChange;\r\n addUndoable(undoableChange);\r\n setCommonStore((state) => {\r\n state.viewState.cameraZoom = newZoom;\r\n });\r\n } else {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n const p = orbitControlsRef.current.object.position;\r\n const x = p.x * scale;\r\n const y = p.y * scale;\r\n const z = p.z * scale;\r\n const undoableCameraChange = {\r\n name: 'Zoom',\r\n timestamp: Date.now(),\r\n oldCameraPosition: [p.x, p.y, p.z],\r\n newCameraPosition: [x, y, z],\r\n undo: () => {\r\n const oldX = undoableCameraChange.oldCameraPosition[0];\r\n const oldY = undoableCameraChange.oldCameraPosition[1];\r\n const oldZ = undoableCameraChange.oldCameraPosition[2];\r\n orbitControlsRef.current?.object.position.set(oldX, oldY, oldZ);\r\n orbitControlsRef.current?.update();\r\n setCommonStore((state) => {\r\n state.viewState.cameraPosition = [oldX, oldY, oldZ];\r\n });\r\n },\r\n redo: () => {\r\n const newX = undoableCameraChange.newCameraPosition[0];\r\n const newY = undoableCameraChange.newCameraPosition[1];\r\n const newZ = undoableCameraChange.newCameraPosition[2];\r\n orbitControlsRef.current?.object.position.set(newX, newY, newZ);\r\n orbitControlsRef.current?.update();\r\n setCommonStore((state) => {\r\n state.viewState.cameraPosition = [newX, newY, newZ];\r\n });\r\n },\r\n } as UndoableCameraChange;\r\n addUndoable(undoableCameraChange);\r\n orbitControlsRef.current.object.position.set(x, y, z);\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n state.viewState.cameraPosition = [x, y, z];\r\n });\r\n }\r\n }\r\n };\r\n\r\n const resetView = () => {\r\n const orbitControlsRef = useRefStore.getState().orbitControlsRef;\r\n if (orbitControlsRef?.current) {\r\n // I don't know why the reset method results in a black screen.\r\n // So we are resetting it here to a predictable position.\r\n const z = Math.min(50, useStore.getState().sceneRadius * 4);\r\n orbitControlsRef.current.object.position.set(z, z, z);\r\n orbitControlsRef.current.target.set(0, 0, 0);\r\n orbitControlsRef.current.update();\r\n setCommonStore((state) => {\r\n const v = state.viewState;\r\n v.cameraPosition = [z, z, z];\r\n v.panCenter = [0, 0, 0];\r\n });\r\n }\r\n };\r\n\r\n const set2DView = (selected: boolean) => {\r\n setCommonStore((state) => {\r\n state.viewState.orthographic = selected;\r\n state.viewState.enableRotate = !selected;\r\n if (selected) {\r\n state.viewState.navigationView = false;\r\n }\r\n });\r\n };\r\n\r\n const setNavigationView = (selected: boolean) => {\r\n setCommonStore((state) => {\r\n state.viewState.navigationView = selected;\r\n state.viewState.enableRotate = !selected;\r\n if (selected) {\r\n state.viewState.orthographic = false;\r\n }\r\n });\r\n };\r\n\r\n console.log('x');\r\n\r\n const isCloudFileOwner = user.uid && new URLSearchParams(window.location.search).get('userid') === user.uid;\r\n\r\n const createCanvas = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* somehow we have to use two suspense wrappers as follows */}\r\n \r\n \r\n \r\n \r\n \r\n {axes && }\r\n \r\n \r\n {groundImage && }\r\n {/* */}\r\n \r\n \r\n \r\n {evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM &&\r\n evolutionaryAlgorithmState.geneticAlgorithmParams.problem === DesignProblem.SOLAR_PANEL_TILT_ANGLE && (\r\n \r\n )}\r\n {evolutionMethod === EvolutionMethod.GENETIC_ALGORITHM &&\r\n evolutionaryAlgorithmState.geneticAlgorithmParams.problem === DesignProblem.SOLAR_PANEL_ARRAY && (\r\n \r\n )}\r\n {evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION &&\r\n evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem ===\r\n DesignProblem.SOLAR_PANEL_TILT_ANGLE && }\r\n {evolutionMethod === EvolutionMethod.PARTICLE_SWARM_OPTIMIZATION &&\r\n evolutionaryAlgorithmState.particleSwarmOptimizationParams.problem === DesignProblem.SOLAR_PANEL_ARRAY && (\r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n return (\r\n // disable the default context menu for the entire app\r\n
e.preventDefault()}>\r\n {/* Spinner, Simulation and Evolution control panels */}\r\n \r\n\r\n \r\n \r\n {i18n.t('name.Aladdin', lang)}\r\n \r\n {cloudFile && !openModelsMap && (\r\n \r\n \r\n {cloudFile + (isCloudFileOwner && changed ? ' *' : '')}\r\n {!viewOnly && isCloudFileOwner && changed && (\r\n {\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n if (loggable) {\r\n setCommonStore((state) => {\r\n state.actionInfo = {\r\n name: 'Save Cloud File',\r\n timestamp: new Date().getTime(),\r\n };\r\n });\r\n }\r\n }}\r\n >\r\n {i18n.t('word.Save', lang)}\r\n \r\n )}\r\n \r\n )}\r\n
\r\n {viewOnly ? (\r\n \r\n \r\n {' V ' + VERSION}\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n    ©{new Date().getFullYear()} {i18n.t('name.IFI', lang)}\r\n  \r\n {i18n.t('word.VersionInitial', lang) + VERSION + '. ' + i18n.t('word.AllRightsReserved', lang) + '. '}\r\n \r\n \r\n )}\r\n {!viewOnly && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {/* must specify the height here for the floating window to have correct boundary check*/}\r\n
\r\n {\r\n setCanvasRelativeWidth(Math.round(100 - (size / window.innerWidth) * 100));\r\n }, 5)}\r\n // must specify the height again for the split pane to resize correctly with the window\r\n style={{ height: 'calc(100vh - 72px)', display: 'flex' }}\r\n pane1Style={{\r\n width: projectView ? 100 - canvasRelativeWidth + '%' : '0',\r\n minWidth: projectView ? '25%' : 0,\r\n maxWidth: projectView ? '75%' : 0,\r\n }}\r\n pane2Style={{ width: projectView ? canvasRelativeWidth + '%' : '100%' }}\r\n resizerStyle={{\r\n cursor: 'col-resize',\r\n width: projectView ? '6px' : 0,\r\n minWidth: projectView ? '6px' : 0,\r\n maxWidth: projectView ? '6px' : 0,\r\n backgroundImage: 'linear-gradient(to right, white, gray)',\r\n }}\r\n >\r\n {projectView ? (\r\n \r\n ) : (\r\n <>\r\n )}\r\n {createCanvas()}\r\n \r\n \r\n
\r\n
\r\n \r\n {!viewOnly && }\r\n {!viewOnly && loggable && }\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(AppCreator);\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5goVDhMNNH79FgAAAqJJREFUWIXtlD1IG2EYx/+XQE5jicEQTYdAviwGRLL4tZSSoWA7mApFMJQObi7NopN0aqC4FIRCIYiJQ0IHoUvRBuokVBoQxLYQKqcgbSMamstdLpfLXZ4uFhIRmpRcu+S3vPC+D/yej5cH6NChw3+GaSHWZzabx4eGhm6xLHtDVdXq6ekpl8vldgF80StBAAiGw+F38XhcyWazJAgCVSoVkiSJTk5OaGNjQ5uenn4LYLjtZo/H82xzc5OaYXl5mQcQaJvc5XI93d/fb0r+m3A4/BEAC+B+IBB4PjY29qK7u3seQF+r/uH19fWW5EREqVRK9fv9n3d2dkgQBJJlmQ4PD2lpaekbgIdN24PBYKplOxEdHR3R3t7etW+JRIIAPGjGb1hZWSn+TQJ/YnFxMQ/A1iC7PH1TU1MvQ6FQHMATp9PZ1XS7WiASifQ5HI5HV+9t0Wg0p6oqERGtra3R6uqqpkcHiIhmZmbeNNhHR0cf12q1hqByuayXn+bm5rYaRuD1eq0M07gQu7p0mQA4jkMymdytvzOyLGucnZ2d10taz8HBAWq12s2BgYE7HMdJAL4CAGKx2JYgCLq1/TqSySTZ7fYQAGBkZOTV8fHxP02AiGhycvK1AQAGBwfHXS6X7iOoJ5FIIJvNxgAADMPcjUQiuUwmQ7Is61ZxqVSi7e1tWlhY+ITL1Vz//e0A7k1MTNz2+/0Bn8/n8Xq9Vrfbjf7+flgsFpjNZphMJhgMhoZqFEVBtVpFpVKBJEkQRRE8z+Pi4gL5fF7jef787OyMy2QyH9LpdBrAewDa1QSuYgPgAuC2Wq1Om83m6O3t7evp6WFNJpNF0zQYjUYwDFMuFAqyoiiiKIrlYrH4s1Ao5FVVzQM4B/AdwA8ApTZMrkOHDu3nF/riE6r44ku2AAAAAElFTkSuQmCC\"","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useStore } from './stores/common';\r\nimport * as Selector from './stores/selector';\r\nimport { saveAs } from 'file-saver';\r\nimport { showError, showInfo } from './helpers';\r\nimport i18n from './i18n/i18n';\r\nimport { Button, Input, Modal } from 'antd';\r\nimport Draggable, { DraggableBounds, DraggableData, DraggableEvent } from 'react-draggable';\r\nimport { ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\n\r\nexport interface LocalFileManagerProps {\r\n viewOnly: boolean;\r\n}\r\n\r\nconst LocalFileManager = ({ viewOnly = false }: LocalFileManagerProps) => {\r\n const setCommonStore = useStore(Selector.set);\r\n const exportContent = useStore(Selector.exportContent);\r\n const importContent = useStore(Selector.importContent);\r\n const createEmptyFile = useStore(Selector.createEmptyFile);\r\n const saveLocalFileDialogVisible = usePrimitiveStore(Selector.saveLocalFileDialogVisible);\r\n const createNewFileFlag = useStore(Selector.createNewFileFlag);\r\n const openLocalFileFlag = useStore(Selector.openLocalFileFlag);\r\n const cloudFile = useStore(Selector.cloudFile);\r\n const localFileName = useStore(Selector.localFileName);\r\n const user = useStore(Selector.user);\r\n const language = useStore(Selector.language);\r\n\r\n const [confirmLoading, setConfirmLoading] = useState(false);\r\n const [dragEnabled, setDragEnabled] = useState(false);\r\n const [bounds, setBounds] = useState({ left: 0, top: 0, bottom: 0, right: 0 } as DraggableBounds);\r\n const dragRef = useRef(null);\r\n\r\n const lang = useMemo(() => {\r\n return { lng: language };\r\n }, [language]);\r\n\r\n useEffect(() => {\r\n if (createNewFileFlag) {\r\n createNewFile();\r\n useStore.getState().setCreateNewFileFlag(false);\r\n }\r\n }, [createNewFileFlag]);\r\n\r\n useEffect(() => {\r\n if (openLocalFileFlag) {\r\n readLocalFile();\r\n useStore.getState().setOpenLocalFileFlag(false);\r\n }\r\n }, [openLocalFileFlag]);\r\n\r\n const createNewFile = () => {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n onOk: () => {\r\n if (user.uid) {\r\n if (cloudFile) {\r\n setCommonStore((state) => {\r\n state.localContentToImportAfterCloudFileUpdate = 'CREATE_NEW_FILE';\r\n });\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n } else {\r\n // no cloud file has been created\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n }\r\n } else {\r\n showInfo(i18n.t('menu.file.ToSaveYourWorkPleaseSignIn', lang));\r\n }\r\n },\r\n onCancel: () => {\r\n createEmptyFile();\r\n },\r\n });\r\n };\r\n\r\n const readLocalFile = () => {\r\n if (!viewOnly && usePrimitiveStore.getState().changed) {\r\n Modal.confirm({\r\n title: i18n.t('message.DoYouWantToSaveChanges', lang),\r\n icon: ,\r\n onOk: () => {\r\n if (user.uid) {\r\n if (cloudFile) {\r\n loadLocalFile(true);\r\n } else {\r\n // no cloud file has been created\r\n setCommonStore((state) => {\r\n state.showCloudFileTitleDialogFlag = !state.showCloudFileTitleDialogFlag;\r\n state.showCloudFileTitleDialog = true;\r\n });\r\n }\r\n } else {\r\n showInfo(i18n.t('menu.file.ToSaveYourWorkPleaseSignIn', lang));\r\n }\r\n },\r\n onCancel: () => loadLocalFile(false),\r\n okText: i18n.t('word.Yes', lang),\r\n cancelText: i18n.t('word.No', lang),\r\n });\r\n } else {\r\n loadLocalFile(false);\r\n }\r\n };\r\n\r\n const loadLocalFile = (saveFirst: boolean) => {\r\n document.body.onfocus = () => {\r\n setCommonStore((state) => {\r\n state.localFileDialogRequested = false;\r\n });\r\n };\r\n const fileDialog = document.getElementById('file-dialog') as HTMLInputElement;\r\n fileDialog.onchange = () => {\r\n if (fileDialog.files && fileDialog.files.length > 0) {\r\n usePrimitiveStore.setState((state) => {\r\n state.waiting = true;\r\n });\r\n const reader = new FileReader();\r\n reader.readAsText(fileDialog.files[0]);\r\n const fn = fileDialog.files[0].name;\r\n setCommonStore((state) => {\r\n state.localFileName = fn;\r\n });\r\n reader.onload = () => {\r\n if (reader.result) {\r\n const input = JSON.parse(reader.result.toString());\r\n if (saveFirst) {\r\n if (cloudFile) {\r\n setCommonStore((state) => {\r\n state.localContentToImportAfterCloudFileUpdate = input;\r\n });\r\n usePrimitiveStore.getState().setSaveCloudFileFlag(true);\r\n }\r\n } else {\r\n importContent(input);\r\n }\r\n }\r\n fileDialog.value = '';\r\n };\r\n }\r\n };\r\n fileDialog.click();\r\n };\r\n\r\n const writeLocalFile = () => {\r\n let fn = localFileName.trim();\r\n if (fn.length > 0) {\r\n if (!fn.endsWith('.ala')) {\r\n fn += '.ala';\r\n }\r\n const blob = new Blob([JSON.stringify(exportContent())], { type: 'application/json' });\r\n saveAs(blob, fn);\r\n setCommonStore((state) => {\r\n state.localFileName = fn;\r\n state.cloudFile = undefined;\r\n });\r\n return true;\r\n } else {\r\n showError(i18n.t('menu.file.SavingAbortedMustHaveValidFileName', lang) + '.');\r\n return false;\r\n }\r\n };\r\n\r\n const onStart = (event: DraggableEvent, uiData: DraggableData) => {\r\n if (dragRef.current) {\r\n const { clientWidth, clientHeight } = window.document.documentElement;\r\n const targetRect = dragRef.current.getBoundingClientRect();\r\n setBounds({\r\n left: -targetRect.left + uiData.x,\r\n right: clientWidth - (targetRect.right - uiData.x),\r\n top: -targetRect.top + uiData.y,\r\n bottom: clientHeight - (targetRect?.bottom - uiData.y),\r\n });\r\n }\r\n };\r\n\r\n const performOkAction = () => {\r\n setConfirmLoading(true);\r\n if (writeLocalFile()) {\r\n usePrimitiveStore.setState((state) => {\r\n state.saveLocalFileDialogVisible = false;\r\n });\r\n }\r\n setConfirmLoading(false);\r\n };\r\n\r\n const performCancelAction = () => {\r\n usePrimitiveStore.setState((state) => {\r\n state.saveLocalFileDialogVisible = false;\r\n });\r\n };\r\n\r\n const useCloudFileName = () => {\r\n if (cloudFile) {\r\n setCommonStore((state) => {\r\n state.localFileName = cloudFile;\r\n if (!state.localFileName.endsWith('.ala')) state.localFileName += '.ala';\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n setDragEnabled(true)}\r\n onMouseOut={() => setDragEnabled(false)}\r\n >\r\n {i18n.t('menu.file.SaveAsLocalFile', lang)}\r\n \r\n }\r\n footer={\r\n cloudFile\r\n ? [\r\n ,\r\n ,\r\n ,\r\n ]\r\n : [\r\n ,\r\n ,\r\n ]\r\n }\r\n visible={saveLocalFileDialogVisible}\r\n confirmLoading={confirmLoading}\r\n onCancel={performCancelAction}\r\n modalRender={(modal) => (\r\n onStart(event, uiData)}>\r\n
{modal}
\r\n
\r\n )}\r\n >\r\n ) => {\r\n setCommonStore((state) => {\r\n state.localFileName = e.target.value;\r\n });\r\n }}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default React.memo(LocalFileManager);\r\n","/*\r\n * @Copyright 2021-2023. Institute for Future Intelligence, Inc.\r\n *\r\n * @author Charles Xie, Xiaotong Ding\r\n */\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { CommonStoreState, useStore } from './stores/common';\r\nimport * as Selector from 'src/stores/selector';\r\nimport './app.css';\r\nimport ErrorPage from './ErrorPage';\r\nimport { Beforeunload } from 'react-beforeunload';\r\nimport { ConfigProvider } from 'antd';\r\nimport AppCreator from './appCreator';\r\nimport LocalFileManager from './localFileManager';\r\nimport { usePrimitiveStore } from './stores/commonPrimitive';\r\n\r\nconst App = () => {\r\n const locale = useStore(Selector.locale);\r\n const world = useStore((state: CommonStoreState) => state.world);\r\n const elements = useStore((state: CommonStoreState) => state.elements);\r\n const viewState = useStore((state: CommonStoreState) => state.viewState);\r\n const notes = useStore((state: CommonStoreState) => state.notes);\r\n const showSolarRadiationHeatmap = usePrimitiveStore(Selector.showSolarRadiationHeatmap);\r\n const showHeatFluxes = usePrimitiveStore(Selector.showHeatFluxes);\r\n const setChanged = usePrimitiveStore(Selector.setChanged);\r\n const setSkipChange = usePrimitiveStore(Selector.setSkipChange);\r\n const loadWeatherData = useStore(Selector.loadWeatherData);\r\n const loadHorizontalSolarRadiationData = useStore(Selector.loadHorizontalSolarRadiationData);\r\n const loadVerticalSolarRadiationData = useStore(Selector.loadVerticalSolarRadiationData);\r\n const loadPvModules = useStore(Selector.loadPvModules);\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n const viewOnly = params.get('viewonly') === 'true';\r\n const map = params.get('map') === 'true';\r\n\r\n useEffect(() => {\r\n loadWeatherData();\r\n loadHorizontalSolarRadiationData();\r\n loadVerticalSolarRadiationData();\r\n loadPvModules();\r\n usePrimitiveStore.setState((state) => {\r\n state.openModelsMap = map;\r\n if (map) {\r\n state.modelsMapFlag = true;\r\n state.modelsMapWeatherStations = false;\r\n state.leaderboardFlag = true;\r\n state.showLeaderboard = true;\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (usePrimitiveStore.getState().skipChange) {\r\n setSkipChange(false);\r\n } else if (!usePrimitiveStore.getState().changed) {\r\n setChanged(true);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [world, viewState, elements, notes]);\r\n\r\n useEffect(() => {\r\n if (showSolarRadiationHeatmap) {\r\n usePrimitiveStore.setState((state) => {\r\n state.showSolarRadiationHeatmap = false;\r\n });\r\n }\r\n if (showHeatFluxes) {\r\n usePrimitiveStore.setState((state) => {\r\n state.showHeatFluxes = false;\r\n });\r\n }\r\n }, [world, elements]);\r\n\r\n return (\r\n \r\n \r\n {viewOnly ? (\r\n \r\n ) : (\r\n ''}>\r\n {' '}\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","/*\r\n * @Copyright 2021-2022. Institute for Future Intelligence, Inc.\r\n */\r\n\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './app';\r\n// import reportWebVitals from './reportWebVitals';\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root'),\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\n// reportWebVitals();\r\n"],"sourceRoot":""} \ No newline at end of file